ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZjNDVlLi4wMDAwMDAwCi0tLSBhL0FVVEhPUlMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBnaXQgY29tbWl0IGhpc3RvcnkKLSMgYnkgdG9vbHMvZ2VuX2F1dGhvcnMuc2guCi0KLUFhcm9uIFdhdHJ5IDxhd2F0cnlAZ21haWwuY29tPgotQWRyaWFuIEdyYW5nZSA8YWdyYW5nZUBnb29nbGUuY29tPgotQWxleCBDb252ZXJzZSA8YWxleC5jb252ZXJzZUBnbWFpbC5jb20+Ci1BbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgotQW5kcmVzIE1lamlhIDxtY2l0YWRlbEBnbWFpbC5jb20+Ci1BdHRpbGEgTmFneSA8YXR0aWxhbmFneUBnb29nbGUuY29tPgotRmFiaW8gUGVkcmV0dGkgPGZhYmlvLnBlZEBsaWJlcm8uaXQ+Ci1GcmFuayBHYWxsaWdhbiA8ZmdhbGxpZ2FuQGdvb2dsZS5jb20+Ci1GcmVkcmlrIFPDtmRlcnF1aXN0IDxmc0BvcGVyYS5jb20+Ci1Gcml0eiBLb2VuaWcgPGZya29lbmlnQGdvb2dsZS5jb20+Ci1HYXV0ZSBTdHJva2tlbmVzIDxnYXV0ZS5zdHJva2tlbmVzQGJyb2FkY29tLmNvbT4KLUdpdXNlcHBlIFNjcml2YW5vIDxnc2NyaXZhbm9AZ251Lm9yZz4KLUd1aWxsZXJtbyBCYWxsZXN0ZXIgVmFsb3IgPGdidmFsb3JAZ21haWwuY29tPgotSGVucmlrIEx1bmRpbiA8aGx1bmRpbkBnb29nbGUuY29tPgotSmFtZXMgQmVycnkgPGphbWVzYmVycnlAZ29vZ2xlLmNvbT4KLUphbWVzIFplcm4gPGp6ZXJuQGdvb2dsZS5jb20+Ci1KYW4gS3JhdG9jaHZpbCA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLUplZmYgTXVpemVsYWFyIDxqbXVpemVsYWFyQG1vemlsbGEuY29tPgotSmltIEJhbmtvc2tpIDxqaW1iYW5rb3NraUBnb29nbGUuY29tPgotSm9oYW5uIEtvZW5pZyA8am9oYW5ua29lbmlnQGdvb2dsZS5jb20+Ci1Kb2huIEtvbGVzemFyIDxqa29sZXN6YXJAZ29vZ2xlLmNvbT4KLUp1c3RpbiBDbGlmdCA8anVzdGluQHNhbGFzYWdhLm9yZz4KLUp1c3RpbiBMZWJhciA8anVzdGluLmxlYmFyQGdtYWlsLmNvbT4KLUx1Y2EgQmFyYmF0byA8bHVfemVyb0BnZW50b28ub3JnPgotTWFrb3RvIEthdG8gPG1ha290by5rdEBnbWFpbC5jb20+Ci1NYXJ0aW4gRXR0bCA8ZXR0bC5tYXJ0aW43OEBnb29nbGVtYWlsLmNvbT4KLU1pY2hhZWwgS29obGVyIDxtaWNoYWVsa29obGVyQGxpdmUuY29tPgotTWlraGFsIFNoZW1lciA8bWlraGFsQGdvb2dsZS5jb20+Ci1QYXNjYWwgTWFzc2ltaW5vIDxwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbT4KLVBhdHJpayBXZXN0aW4gPHBhdHJpay53ZXN0aW5AZ21haWwuY29tPgotUGF1bCBXaWxraW5zIDxwYXVsd2lsa2luc0Bnb29nbGUuY29tPgotUGF2b2wgUnVzbmFrIDxzdGlja0BnazIuc2s+Ci1QaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgotU2NvdHQgTGFWYXJud2F5IDxzbGF2YXJud2F5QGdvb2dsZS5jb20+Ci1UZXJvIFJpbnRhbHVvbWEgPHRlcm9yQGdvb2dsZS5jb20+Ci1UaW1vdGh5IEIuIFRlcnJpYmVycnkgPHR0ZXJyaWJlQHhpcGgub3JnPgotVG9tIEZpbmVnYW4gPHRvbWZpbmVnYW5AZ29vZ2xlLmNvbT4KLVlhb3d1IFh1IDx5YW93dUBnb29nbGUuY29tPgotWXVucWluZyBXYW5nIDx5dW5xaW5nd2FuZ0Bnb29nbGUuY29tPgotR29vZ2xlIEluYy4KLVRoZSBNb3ppbGxhIEZvdW5kYXRpb24KLVRoZSBYaXBoLk9yZyBGb3VuZGF0aW9uCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawppbmRleCA1M2VlYTkzLi5kMGZlMTBhIDEwMDY0NAotLS0gYS9BbmRyb2lkLm1rCisrKyBiL0FuZHJvaWQubWsKQEAgLTEsMTk5ICsxLDkgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVMgPSBcCi0gICAgbWt2cGFyc2VyL21rdnBhcnNlci5jcHAgXAotICAgIHZweC9zcmMvdnB4X2NvZGVjLmMgXAotICAgIHZweC9zcmMvdnB4X2RlY29kZXIuYyBcCi0gICAgdnB4L3NyYy92cHhfaW1hZ2UuYyBcCi0gICAgdnB4X21lbS92cHhfbWVtLmMgXAotICAgIHZweF9zY2FsZS9nZW5lcmljL3ZweHNjYWxlLmMgXAotICAgIHZweF9zY2FsZS9nZW5lcmljL3l2MTJjb25maWcuYyBcCi0gICAgdnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZC5jIFwKLSAgICB2cHhfc2NhbGUvZ2VuZXJpYy9nZW5fc2NhbGVycy5jIFwKLSAgICB2cHhfc2NhbGUvZ2VuZXJpYy9zY2FsZXN5c3RlbWRlcGVuZGVudC5jIFwKLSAgICB2cDgvY29tbW9uL2FsbG9jY29tbW9uLmMgXAotICAgIHZwOC9jb21tb24vYXJtL2FybV9zeXN0ZW1kZXBlbmRlbnQuYyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vcmVjb25pbnRyYV9hcm0uYyBcCi0gICAgdnA4L2NvbW1vbi9ibG9ja2QuYyBcCi0gICAgdnA4L2NvbW1vbi9kZWJ1Z21vZGVzLmMgXAotICAgIHZwOC9jb21tb24vZW50cm9weS5jIFwKLSAgICB2cDgvY29tbW9uL2VudHJvcHltb2RlLmMgXAotICAgIHZwOC9jb21tb24vZW50cm9weW12LmMgXAotICAgIHZwOC9jb21tb24vZXh0ZW5kLmMgXAotICAgIHZwOC9jb21tb24vZmlsdGVyLmMgXAotICAgIHZwOC9jb21tb24vZmluZG5lYXJtdi5jIFwKLSAgICB2cDgvY29tbW9uL2dlbmVyaWMvc3lzdGVtZGVwZW5kZW50LmMgXAotICAgIHZwOC9jb21tb24vaWRjdGxsbS5jIFwKLSAgICB2cDgvY29tbW9uL2ludnRyYW5zLmMgXAotICAgIHZwOC9jb21tb24vbG9vcGZpbHRlci5jIFwKLSAgICB2cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jIFwKLSAgICB2cDgvY29tbW9uL21icGl0Y2guYyBcCi0gICAgdnA4L2NvbW1vbi9tb2RlY29udC5jIFwKLSAgICB2cDgvY29tbW9uL21vZGVjb250ZXh0LmMgXAotICAgIHZwOC9jb21tb24vcXVhbnRfY29tbW9uLmMgXAotICAgIHZwOC9jb21tb24vcmVjb24uYyBcCi0gICAgdnA4L2NvbW1vbi9yZWNvbmludGVyLmMgXAotICAgIHZwOC9jb21tb24vcmVjb25pbnRyYS5jIFwKLSAgICB2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuYyBcCi0gICAgdnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uYyBcCi0gICAgdnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5jIFwKLSAgICB2cDgvY29tbW9uL3RleHRibGl0LmMgXAotICAgIHZwOC9jb21tb24vdHJlZWNvZGVyLmMgXAotICAgIHZwOC9jb21tb24vcG9zdHByb2MuYyBcCi0gICAgdnA4L3ZwOF9jeF9pZmFjZS5jIFwKLSAgICB2cDgvdnA4X2R4X2lmYWNlLmMgXAotICAgIHZwOC9kZWNvZGVyL2FybS9hcm1fZHN5c3RlbWRlcGVuZGVudC5jIFwKLSAgICB2cDgvZGVjb2Rlci9kYm9vbGh1ZmYuYyBcCi0gICAgdnA4L2RlY29kZXIvZGVjb2RlbXYuYyBcCi0gICAgdnA4L2RlY29kZXIvZGVjb2RmcmFtZS5jIFwKLSAgICB2cDgvZGVjb2Rlci9kZXF1YW50aXplLmMgXAotICAgIHZwOC9kZWNvZGVyL2RldG9rZW5pemUuYyBcCi0gICAgdnA4L2RlY29kZXIvZ2VuZXJpYy9kc3lzdGVtZGVwZW5kZW50LmMgXAotICAgIHZwOC9kZWNvZGVyL29ueXhkX2lmLmMgXAotICAgIHZwOC9kZWNvZGVyL3JlY29uaW50cmFfbXQuYyBcCi0gICAgdnA4L2RlY29kZXIvdGhyZWFkaW5nLmMgXAotICAgIHZweF9jb25maWcuYyBcCi0gICAgdnA4L2RlY29kZXIvYXJtL25lb24vaWRjdF9ibGtfbmVvbi5jCisjIGxpYnZweAorIyBpZiBBUk12NyArIE5FT04gZXRjIGJsYWggYmxhaAoraW5jbHVkZSBleHRlcm5hbC9saWJ2cHgvbGlidnB4Lm1rCiAKLUxPQ0FMX0NGTEFHUyA6PSBcCi0gICAgLURIQVZFX0NPTkZJR19IPXZweF9jb25maWcuaAotCi1MT0NBTF9NT0RVTEUgOj0gbGlidnB4Ci0KLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLG1pcHMpCi0gICAgaWZuZXEgKCQoQVJDSF9IQVNfQklHRU5ESUFOKSx0cnVlKQotICAgICAgICBpZmVxICgkKEFSQ0hfTUlQU19EU1BfUkVWKSwyKQotICAgICAgICAgICAgTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICAgICAgICAgICAgICB2cDgvY29tbW9uL21pcHMvaWRjdF9taXBzLmMgXAotICAgICAgICAgICAgICAgIHZwOC9jb21tb24vbWlwcy9taXBzX3N5c3RlbWRlcGVuZGVudC5jIFwKLSAgICAgICAgICAgICAgICB2cDgvY29tbW9uL21pcHMvc3VicGl4ZWxfbWlwcy5jIFwKLSAgICAgICAgICAgICAgICB2cDgvY29tbW9uL21pcHMvbG9vcGZpbHRlcl9maWx0ZXJzX21pcHMuYyBcCi0gICAgICAgICAgICAgICAgdnA4L2NvbW1vbi9taXBzL2xvb3BmaWx0ZXJfbWlwcy5jIFwKLSAgICAgICAgICAgICAgICB2cDgvY29tbW9uL21pcHMvcmVjb25pbnRlcl9taXBzLmMgXAotICAgICAgICAgICAgICAgIHZwOC9kZWNvZGVyL21pcHMvZGVxdWFudGl6ZV9taXBzLmMgXAotICAgICAgICAgICAgICAgIHZwOC9kZWNvZGVyL21pcHMvaWRjdF9ibGtfbWlwcy5jCi0KLSAgICAgICAgICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURNSVBTX0RTUF9SRVY9JChBUkNIX01JUFNfRFNQX1JFVikKLQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZmVxICgkKEFSQ0hfTUlQU19EU1BfUkVWKSwxKQotICAgICAgICAgICAgICAgIExPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgICAgICAgICAgICAgICAgIHZwOC9jb21tb24vbWlwcy9pZGN0X21pcHMuYyBcCi0gICAgICAgICAgICAgICAgICAgIHZwOC9jb21tb24vbWlwcy9taXBzX3N5c3RlbWRlcGVuZGVudC5jIFwKLSAgICAgICAgICAgICAgICAgICAgdnA4L2NvbW1vbi9taXBzL3JlY29uaW50ZXJfbWlwcy5jIFwKLQotICAgICAgICAgICAgICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURNSVBTX0RTUF9SRVY9JChBUkNIX01JUFNfRFNQX1JFVikKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURNSVBTX0RTUF9SRVY9MAotICAgICAgICAgICAgZW5kaWYgIyBtaXBzX2RzcF9yZXYxCi0gICAgICAgIGVuZGlmICMgbWlwc19kc3BfcmV2MgotCi0gICAgZW5kaWYgI2JpZ2VuZGlhbgotZW5kaWYgI21pcHMKLQotaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQotCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU1RBVElDX0xJQlJBUklFUwotaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgbG9jYWwtaW50ZXJtZWRpYXRlcy1kaXIpCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbG9vcGZpbHRlcl9hcm0uYyBcCi0gICAgdnA4L2RlY29kZXIvYXJtL2RlcXVhbnRpemVfYXJtLmMgXAotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKLQotTE9DQUxfQ0ZMQUdTICs9IC1EX19BUk1fSEFWRV9ORU9OCi0KLUFTTV9GSUxFUyA9IFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDE2eDE2X25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3Q0eDRfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4NF9uZW9uLnMgXAotICAgIHZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0OHg4X25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9idWlsZGludHJhcHJlZGljdG9yc21ieV9uZW9uLnMgXAotICAgIHZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTE2eDE2X25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9jb3B5bWVtOHg0X25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9jb3B5bWVtOHg4X25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9pd2Fsc2hfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGVob3Jpem9udGFsZWRnZV9uZW9uLnMgXAotICAgIHZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcnNpbXBsZXZlcnRpY2FsZWRnZV9uZW9uLnMgXAotICAgIHZwOC9jb21tb24vYXJtL25lb24vcmVjb24xNngxNm1iX25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjJiX25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjRiX25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbmJfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL3NhdmVfbmVvbl9yZWcucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fMV9uZW9uLnMgXAotICAgIHZwOC9jb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0MTZ4MTZfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q0eDRfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDRfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDhfbmVvbi5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9uZW9uL2RjX29ubHlfaWRjdF9hZGRfbmVvbi5zIFwKLSAgICB2cDgvZGVjb2Rlci9hcm0vbmVvbi9kZXF1YW50aXplYl9uZW9uLnMgXAotICAgIHZwOC9kZWNvZGVyL2FybS9uZW9uL2RlcXVhbnRfaWRjdF9uZW9uLnMgXAotICAgIHZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfZGVxdWFudF8wXzJ4X25lb24ucyBcCi0gICAgdnA4L2RlY29kZXIvYXJtL25lb24vaWRjdF9kZXF1YW50X2RjXzBfMnhfbmVvbi5zIFwKLSAgICB2cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9uZW9uLnMgXAotICAgIHZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyX25lb24ucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vbmVvbi9tYmxvb3BmaWx0ZXJfbmVvbi5zIFwKLQotZWxzZSBpZmVxICgkKEFSQ0hfQVJNX0hBVkVfQVJNVjdBKSx0cnVlKQotCi0jIFJlYWxseSwgd2Ugb25seSBuZWVkIEFSTVY2IHN1cHBvcnQgYnV0IEkgY291bGQgbm90IGZpbmQgYW4gZW52aXJvbm1lbnQKLSMgdmFyaWFibGUgdG8gcXVlcnkgdGhhdC4uLgotCi1MT0NBTF9DRkxBR1MgKz0gLURfX0FSTV9IQVZFX0FSTVY2Ci0KLUFTTV9GSUxFUyA9IFwKLSAgICB2cDgvY29tbW9uL2FybS9hcm12Ni9iaWxpbmVhcmZpbHRlcl92Ni5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg0X3Y2LnMgXAotICAgIHZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW04eDhfdjYucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTE2eDE2X3Y2LnMgXAotICAgIHZwOC9jb21tb24vYXJtL2FybXY2L2RjX29ubHlfaWRjdF9hZGRfdjYucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vYXJtdjYvZmlsdGVyX3Y2LnMgXAotICAgIHZwOC9jb21tb24vYXJtL2FybXY2L2l3YWxzaF92Ni5zIFwKLSAgICB2cDgvY29tbW9uL2FybS9hcm12Ni9sb29wZmlsdGVyX3Y2LnMgXAotICAgIHZwOC9jb21tb24vYXJtL2FybXY2L3JlY29uX3Y2LnMgXAotICAgIHZwOC9jb21tb24vYXJtL2FybXY2L3NpbXBsZWxvb3BmaWx0ZXJfdjYucyBcCi0gICAgdnA4L2NvbW1vbi9hcm0vYXJtdjYvc2l4dGFwcHJlZGljdDh4NF92Ni5zIFwKLSAgICB2cDgvZGVjb2Rlci9hcm0vYXJtdjYvZGVxdWFudF9kY19pZGN0X3Y2LnMgXAotICAgIHZwOC9kZWNvZGVyL2FybS9hcm12Ni9kZXF1YW50X2lkY3RfdjYucyBcCi0gICAgdnA4L2RlY29kZXIvYXJtL2FybXY2L2RlcXVhbnRpemVfdjYucyBcCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgdnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmMgXAotICAgIHZwOC9jb21tb24vYXJtL2ZpbHRlcl9hcm0uYyBcCi0gICAgdnA4L2RlY29kZXIvYXJtL2FybXY2L2lkY3RfYmxrX3Y2LmMgXAotCi1lbHNlCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSB2cDgvZGVjb2Rlci9pZGN0X2Jsay5jCi0KLWVuZGlmCi0KLSMgQWxsIHRoZSBhc3NlbWJseSBzb3VyY2VzIG11c3QgYmUgY29udmVydGVkIGZyb20gQURTIHRvIEdBUyBjb21wYXRpYmxlIGZvcm1hdAotVlBYX0dFTiA6PSAkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMpLywgJChBU01fRklMRVMpKQotJChWUFhfR0VOKSA6IFBSSVZBVEVfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCi0kKFZQWF9HRU4pIDogUFJJVkFURV9DVVNUT01fVE9PTCA9IGNhdCAkPCB8IHBlcmwgZXh0ZXJuYWwvbGlidnB4L2J1aWxkL21ha2UvYWRzMmdhcy5wbCA+ICRACi0kKFZQWF9HRU4pIDogJChpbnRlcm1lZGlhdGVzKS8lLnMgOiAkKExPQ0FMX1BBVEgpLyUuYXNtCi0JJCh0cmFuc2Zvcm0tZ2VuZXJhdGVkLXNvdXJjZSkKLQotTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChWUFhfR0VOKQotCi1lbHNlICMgbm9uLUFSTQotCi1MT0NBTF9TUkNfRklMRVMgKz0gdnA4L2RlY29kZXIvaWRjdF9ibGsuYwotCi1lbmRpZgotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL3ZweF9wb3J0cyBcCi0gICAgJChMT0NBTF9QQVRIKS92cDgvY29tbW9uIFwKLSAgICAkKExPQ0FMX1BBVEgpL3ZwOC9lbmNvZGVyIFwKLSAgICAkKExPQ0FMX1BBVEgpL3ZwOC9kZWNvZGVyIFwKLSAgICAkKExPQ0FMX1BBVEgpL3ZwOCBcCi0gICAgJChMT0NBTF9QQVRIKS92cHhfY29kZWMKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorIyBsaWJ3ZWJtCitpbmNsdWRlIGV4dGVybmFsL2xpYnZweC9saWJ3ZWJtLm1rCmRpZmYgLS1naXQgYS9DSEFOR0VMT0cgYi9DSEFOR0VMT0cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NzYwZDEuLjAwMDAwMDAKLS0tIGEvQ0hBTkdFTE9HCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLTIwMTEtMDMtMDcgdjAuOS42ICJCYWxpIgotICBPdXIgc2Vjb25kIG5hbWVkIHJlbGVhc2UsIGZvY3VzZWQgb24gYSBmYXN0ZXIsIGhpZ2hlciBxdWFsaXR5LCBlbmNvZGVyLgotCi0gIC0gVXBncmFkaW5nOgotICAgIFRoaXMgcmVsZWFzZSBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIEF5bGVzYnVyeSAodjAuOS41KS4gVXNlcnMKLSAgICBvZiBvbGRlciByZWxlYXNlcyBzaG91bGQgcmVmZXIgdG8gdGhlIFVwZ3JhZGluZyBub3RlcyBpbiB0aGlzCi0gICAgZG9jdW1lbnQgZm9yIHRoYXQgcmVsZWFzZS4KLQotICAtIEVuaGFuY2VtZW50czoKLSAgICAgIHZweGVuYyAtLXBzbnIgc2hvd3MgYSBzdW1tYXJ5IHdoZW4gZW5jb2RlIGNvbXBsZXRlcwotICAgICAgLS10dW5lPXNzaW0gb3B0aW9uIHRvIGVuYWJsZSBhY3Rpdml0eSBtYXNraW5nCi0gICAgICBpbXByb3ZlZCBwb3N0cHJvYyB2aXN1YWxpemF0aW9ucyBmb3IgZGV2ZWxvcG1lbnQKLSAgICAgIHVwZGF0ZWQgc3VwcG9ydCBmb3IgQXBwbGUgaU9TIHRvIFNESyA0LjIKLSAgICAgIHF1ZXJ5IGRlY29kZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlZmVyZW5jZSBmcmFtZXMgd2VyZSB1cGRhdGVkCi0gICAgICBpbXBsZW1lbnRlZCBlcnJvciB0cmFja2luZyBpbiB0aGUgZGVjb2RlcgotICAgICAgZml4IHBpcGUgc3VwcG9ydCBvbiB3aW5kb3dzCi0KLSAgLSBTcGVlZDoKLSAgICAgIFByaW1hcnkgZm9jdXMgd2FzIG9uIGdvb2QgcXVhbGl0eSBtb2RlLCBzcGVlZCAwLiBBdmVyYWdlIGltcHJvdmVtZW50Ci0gICAgICBvbiB4ODYgYWJvdXQgNDAlLCB1cCB0byAxMDAlIG9uIHVzZXItZ2VuZXJhdGVkIGNvbnRlbnQgYXQgdGhhdCBzcGVlZC4KLSAgICAgIEJlc3QgcXVhbGl0eSBtb2RlIHNwZWVkIGltcHJvdmVkIDM1JSwgYW5kIHJlYWx0aW1lIHNwZWVkIDEwLTIwJS4gVGhpcwotICAgICAgcmVsZWFzZSBhbHNvIHNhdyBzaWduaWZpY2FudCBpbXByb3ZlbWVudCBpbiByZWFsdGltZSBlbmNvZGluZyBzcGVlZAotICAgICAgb24gQVJNIHBsYXRmb3Jtcy4KLQotICAgICAgICBJbXByb3ZlZCBlbmNvZGVyIHRocmVhZGluZwotICAgICAgICBEb250IHBpY2sgZW5jb2RlciBmaWx0ZXIgbGV2ZWwgd2hlbiBsb29wZmlsdGVyIGlzIGRpc2FibGVkLgotICAgICAgICBBdm9pZCBkb3VibGUgY29weWluZyBvZiBrZXkgZnJhbWVzIGludG8gYWx0IGFuZCBnb2xkZW4gYnVmZmVyCi0gICAgICAgIEZEQ1Qgb3B0aW1pemF0aW9ucy4KLSAgICAgICAgeDg2IHNzZTIgdGVtcG9yYWwgZmlsdGVyCi0gICAgICAgIFNTU0UzIHZlcnNpb24gb2YgZmFzdCBxdWFudGl6ZXIKLSAgICAgICAgdnA4X3JkX3BpY2tfYmVzdF9tYnNlZ21lbnRhdGlvbiBjb2RlIHJlc3RydWN0dXJlCi0gICAgICAgIEFkanVzdGVkIGJyZWFrb3V0IFJEIGZvciBTUExJVE1WCi0gICAgICAgIENoYW5nZWQgc2VnbWVudGF0aW9uIGNoZWNrIG9yZGVyCi0gICAgICAgIEltcHJvdmVkIHJkX3BpY2tfaW50cmE0eDRibG9jawotICAgICAgICBBZGRzIGFybXY2IG9wdGltaXplZCB2YXJpYW5jZSBjYWxjdWxhdGlvbgotICAgICAgICBBUk12NiBvcHRpbWl6ZWQgc2FkMTZ4MTYKLSAgICAgICAgQVJNdjYgb3B0aW1pemVkIGhhbGYgcGl4ZWwgdmFyaWFuY2UgY2FsY3VsYXRpb25zCi0gICAgICAgIEZ1bGwgc2VhcmNoIFNBRCBmdW5jdGlvbiBvcHRpbWl6YXRpb24gaW4gU1NFNC4xCi0gICAgICAgIEltcHJvdmUgTVYgcHJlZGljdGlvbiBhY2N1cmFjeSB0byBhY2hpZXZlIHBlcmZvcm1hbmNlIGdhaW4KLSAgICAgICAgSW1wcm92ZSBNViBwcmVkaWN0aW9uIGluIHZwOF9waWNrX2ludGVyX21vZGUoKSBmb3Igc3BlZWQ+MwotCi0gIC0gUXVhbGl0eToKLSAgICAgIEJlc3QgcXVhbGl0eSBtb2RlIGltcHJvdmVkIFBTTlIgNi4zJSwgYW5kIFNTSU0gNi4xJS4gVGhpcyByZWxlYXNlCi0gICAgICBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yICJhY3Rpdml0eSBtYXNraW5nLCIgd2hpY2ggZ3JlYXRseSBpbXByb3ZlcwotICAgICAgU1NJTSBhdCB0aGUgZXhwZW5zZSBvZiBQU05SLiBGb3Igbm93LCB0aGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIHdpdGgKLSAgICAgIHRoZSAtLXR1bmU9c3NpbSBvcHRpb24uIEZ1cnRoZXIgZXhwZXJpbWVudGF0aW9uIGluIHRoaXMgYXJlYQotICAgICAgaXMgb25nb2luZy4gVGhpcyByZWxlYXNlIGFsc28gaW50cm9kdWNlcyBhIG5ldyByYXRlIGNvbnRyb2wgbW9kZQotICAgICAgY2FsbGVkICJDUSwiIHdoaWNoIGNoYW5nZXMgdGhlIGFsbG9jYXRpb24gb2YgYml0cyB3aXRoaW4gYSBjbGlwIHRvCi0gICAgICB0aGUgc2VjdGlvbnMgd2hlcmUgdGhleSB3aWxsIGhhdmUgdGhlIG1vc3QgdmlzdWFsIGltcGFjdC4KLQotICAgICAgICBUdW5pbmcgZm9yIHRoZSBtb3JlIGV4YWN0IHF1YW50aXplci4KLSAgICAgICAgUmVsYXggcmF0ZSBjb250cm9sIGZvciBsYXN0IGZldyBmcmFtZXMKLSAgICAgICAgQ1EgTW9kZQotICAgICAgICBMaW1pdCBrZXkgZnJhbWUgcXVhbnRpemVyIGZvciBmb3JjZWQga2V5IGZyYW1lcy4KLSAgICAgICAgS0YvR0YgUHVsc2luZwotICAgICAgICBBZGQgc2ltcGxlIHZlcnNpb24gb2YgYWN0aXZpdHkgbWFza2luZy4KLSAgICAgICAgbWFrZSByZG11bHQgYWRhcHRpdmUgZm9yIGludHJhIGluIHF1YW50aXplciBSRE8KLSAgICAgICAgY2FwIHRoZSBiZXN0IHF1YW50aXplciBmb3IgMm5kIG9yZGVyIERDCi0gICAgICAgIGNoYW5nZSB0aGUgdGhyZXNob2xkIG9mIERDIGNoZWNrIGZvciBlbmNvZGUgYnJlYWtvdXQKLQotICAtIEJ1ZyBGaXhlczoKLSAgICAgIEZpeCBjcmFzaCBvbiBTcGFyYyBTb2xhcmlzLgotICAgICAgRml4IGNvdW50ZXIgb2YgZml4ZWQga2V5ZnJhbWUgZGlzdGFuY2UKLSAgICAgIEFSTlIgZmlsdGVyIHBvaW50ZXIgdXBkYXRlIGJ1ZyBmaXgKLSAgICAgIEZpeGVkIHVzZSBvZiBtb3Rpb24gcGVyY2VudGFnZSBpbiBLRi9HRiBncm91cCBjYWxjCi0gICAgICBDaGFuZ2VkIGNvbmRpdGlvbiBmb3IgdXNpbmcgUkQgaW4gSW50cmEgTW9kZQotICAgICAgRml4IGVuY29kZXIgcmVhbC10aW1lIG9ubHkgY29uZmlndXJhdGlvbi4KLSAgICAgIEZpeCBBUk0gZW5jb2RlciBjcmFzaCB3aXRoIG11bHRpcGxlIHRva2VuIHBhcnRpdGlvbnMKLSAgICAgIEZpeGVkIGJ1ZyBmaXJzdCBjbHVzdGVyIHRpbWVjb2RlIG9mIHdlYm0gZmlsZSBpcyB3cm9uZy4KLSAgICAgIEZpeGVkIHZhcmlvdXMgZW5jb2RlciBidWdzIHdpdGggb2RkLXNpemVkIGltYWdlcwotICAgICAgdnA4ZV9nZXRfcHJldmlldyBmaXhlZCB3aGVuIHNwYXRpYWwgcmVzYW1wbGluZyBlbmFibGVkCi0gICAgICBxdWFudGl6ZXI6IGZpeCBhc3NlcnRpb24gaW4gZmFzdCBxdWFudGl6ZXIgcGF0aAotICAgICAgQWxsb2NhdGUgc291cmNlIGJ1ZmZlcnMgdG8gYmUgbXVsdGlwbGVzIG9mIDE2Ci0gICAgICBGaXggZm9yIG1hbnVhbCBHb2xkZW4gZnJhbWUgZnJlcXVlbmN5Ci0gICAgICBGaXggZHJhc3RpYyB1bmRlcnNob290IGluIGxvbmcgZm9ybSBjb250ZW50Ci0KLQotMjAxMC0xMC0yOCB2MC45LjUgIkF5bGVzYnVyeSIKLSAgT3VyIGZpcnN0IG5hbWVkIHJlbGVhc2UsIGZvY3VzZWQgb24gYSBmYXN0ZXIgZGVjb2RlciwgYW5kIGEgYmV0dGVyIGVuY29kZXIuCi0KLSAgLSBVcGdyYWRpbmc6Ci0gICAgVGhpcyByZWxlYXNlIGluY29ycG9yYXRlcyBiYWNrd2FyZHMtaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlCi0gICAgaXZmZW5jIGFuZCBpdmZkZWMgdG9vbHMuIFRoZXNlIHRvb2xzIGFyZSBub3cgY2FsbGVkIHZweGVuYyBhbmQgdnB4ZGVjLgotCi0gICAgdnB4ZGVjCi0gICAgICAqIHRoZSAtcSAocXVpZXQpIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBhbmQgcmVwbGFjZWQgd2l0aAotICAgICAgICAtdiAodmVyYm9zZSkuIHRoZSBvdXRwdXQgaXMgcXVpZXQgYnkgZGVmYXVsdC4gVXNlIC12IHRvIHNlZQotICAgICAgICB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGJpbmFyeS4KLQotICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBub3cgdG8gd3JpdGUgb3V0cHV0IHRvIGEgc2luZ2xlIGZpbGUKLSAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIGZyYW1lcy4gVGhlIC15IG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICBZNE0gb3V0cHV0IGlzIHRoZSBkZWZhdWx0LgotCi0gICAgICAqIEZvciByYXcgSTQyMC9ZVjEyIG91dHB1dCBpbnN0ZWFkIG9mIFk0TSwgdGhlIC0taTQyMCBvciAtLXl2MTIKLSAgICAgICAgb3B0aW9ucyBtdXN0IGJlIHNwZWNpZmllZC4KLQotICAgICAgICAgICQgaXZmZGVjIC1vIE9VVFBVVCBJTlBVVAotICAgICAgICAgICQgdnB4ZGVjIC0taTQyMCAtbyBPVVRQVVQgSU5QVVQKLQotICAgICAgKiBJZiBhbiBvdXRwdXQgZmlsZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyB0byB3cml0ZQotICAgICAgICBZNE0gdG8gc3Rkb3V0LiBUaGlzIG1ha2VzIHBpcGluZyBtb3JlIG5hdHVyYWwuCi0KLSAgICAgICAgICAkIGl2ZmRlYyAteSAtbyAtIElOUFVUIHwgLi4uCi0gICAgICAgICAgJCB2cHhkZWMgSU5QVVQgfCAuLi4KLQotICAgICAgKiBUaGUgb3V0cHV0IGZpbGUgaGFzIGFkZGl0aW9uYWwgZmxleGliaWxpdHkgZm9yIGZvcm1hdHRpbmcgdGhlCi0gICAgICAgIGZpbGVuYW1lLiBJdCBzdXBwb3J0cyBlc2NhcGUgY2hhcmFjdGVycyBmb3IgY29uc3RydWN0aW5nIGEKLSAgICAgICAgZmlsZW5hbWUgZnJvbSB0aGUgd2lkdGgsIGhlaWdodCwgYW5kIHNlcXVlbmNlIG51bWJlci4gVGhpcwotICAgICAgICByZXBsYWNlcyB0aGUgLXAgb3B0aW9uLiBUbyBnZXQgdGhlIGVxdWl2YWxlbnQ6Ci0KLSAgICAgICAgICAkIGl2ZmRlYyAtcCBmcmFtZSBJTlBVVAotICAgICAgICAgICQgdnB4ZGVjIC0taTQyMCAtbyBmcmFtZS0ld3glaC0lNC5pNDIwIElOUFVUCi0KLSAgICB2cHhlbmMKLSAgICAgICogVGhlIG91dHB1dCBmaWxlIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggLW8sIHJhdGhlciB0aGFuIGFzIHRoZQotICAgICAgICBsYXN0IGFyZ3VtZW50LgotCi0gICAgICAgICAgJCBpdmZlbmMgPG9wdGlvbnM+IElOUFVUIE9VVFBVVAotICAgICAgICAgICQgdnB4ZW5jIDxvcHRpb25zPiAtbyBPVVRQVVQgSU5QVVQKLQotICAgICAgKiBUaGUgb3V0cHV0IGRlZmF1bHRzIHRvIHdlYm0uIFRvIGdldCBJVkYgb3V0cHV0LCB1c2UgdGhlIC0taXZmCi0gICAgICAgIG9wdGlvbi4KLQotICAgICAgICAgICQgaXZmZW5jIDxvcHRpb25zPiBJTlBVVCBPVVRQVVQuaXZmCi0gICAgICAgICAgJCB2cHhlbmMgPG9wdGlvbnM+IC1vIE9VVFBVVC5pdmYgLS1pdmYgSU5QVVQKLQotCi0gIC0gRW5oYW5jZW1lbnRzOgotICAgICAgaXZmZW5jIGFuZCBpdmZkZWMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdnB4ZW5jLCB2cHhkZWMuCi0gICAgICB2cHhkZWMgc3VwcG9ydHMgLndlYm0gaW5wdXQKLSAgICAgIHZweGRlYyB3cml0ZXMgLnk0bSBieSBkZWZhdWx0Ci0gICAgICB2cHhlbmMgd3JpdGVzIC53ZWJtIG91dHB1dCBieSBkZWZhdWx0Ci0gICAgICB2cHhlbmMgLS1wc25yIG5vdyBzaG93cyB0aGUgYXZlcmFnZS9vdmVyYWxsIFBTTlIgYXQgdGhlIGVuZAotICAgICAgQVJNIHBsYXRmb3JtcyBub3cgc3VwcG9ydCBydW50aW1lIGNwdSBkZXRlY3Rpb24KLSAgICAgIHZweGRlYyB2aXN1YWxpemF0aW9ucyBhZGRlZCBmb3IgbW90aW9uIHZlY3RvcnMsIGJsb2NrIG1vZGVzLCByZWZlcmVuY2VzCi0gICAgICB2cHhkZWMgbm93IHNpbGVudCBieSBkZWZhdWx0Ci0gICAgICB2cHhkZWMgLS1wcm9ncmVzcyBzaG93cyBmcmFtZS1ieS1mcmFtZSB0aW1pbmcgaW5mb3JtYXRpb24KLSAgICAgIHZweGVuYyBzdXBwb3J0cyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiAtLWZwcyBhbmQgLS10aW1lYmFzZQotICAgICAgTkFTTSBpcyBub3cgYSBzdXBwb3J0ZWQgYXNzZW1ibGVyCi0gICAgICBjb25maWd1cmU6IGVuYWJsZSBQSUMgZm9yIHNoYXJlZCBsaWJzIGJ5IGRlZmF1bHQKLSAgICAgIGNvbmZpZ3VyZTogYWRkIC0tZW5hYmxlLXNtYWxsCi0gICAgICBjb25maWd1cmU6IHN1cHBvcnQgZm9yIHBwYzMyLWxpbnV4LWdjYwotICAgICAgY29uZmlndXJlOiBzdXBwb3J0IGZvciBzcGFyYy1zb2xhcmlzLWdjYwotCi0gIC0gQnVnczoKLSAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgaW52YWxpZCBmcmFtZXMKLSAgICAgIEZpeCB2YWxncmluZCBlcnJvcnMgaW4gdGhlIE5FT04gbG9vcCBmaWx0ZXJzLgotICAgICAgRml4IGxvb3BmaWx0ZXIgZGVsdGEgemVybyB0cmFuc2l0aW9ucwotICAgICAgRml4IHZhbGdyaW5kIGVycm9ycyBpbiB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYXJtdjYoKS4KLSAgICAgIEJ1aWxkIGZpeGVzIGZvciBkYXJ3aW4taWNjCi0KLSAgLSBTcGVlZDoKLSAgICAgIDIwLTQwJSAoYXZlcmFnZSAyOCUpIGltcHJvdmVtZW50IGluIGxpYnZweCBkZWNvZGVyIHNwZWVkLAotICAgICAgaW5jbHVkaW5nOgotICAgICAgICBSZXdyaXRlIHZwOF9zaG9ydF93YWxzaDR4NF9zc2UyKCkKLSAgICAgICAgT3B0aW1pemF0aW9ucyBvbiB0aGUgbG9vcGZpbHRlcnMuCi0gICAgICAgIE1pc2NlbGxhbmVvdXMgaW1wcm92ZW1lbnRzIGZvciBBdG9tCi0gICAgICAgIEFkZCA0LXRhcCB2ZXJzaW9uIG9mIDJuZC1wYXNzIEFSTXY2IE1DIGZpbHRlci4KLSAgICAgICAgSW1wcm92ZWQgbXVsdGl0aHJlYWQgdXRpbGl6YXRpb24KLSAgICAgICAgQmV0dGVyIGluc3RydWN0aW9uIGNob2ljZXMgb24geDg2Ci0gICAgICAgIHJlb3JkZXIgZGF0YSB0byB1c2Ugd2lkZXIgaW5zdHJ1Y3Rpb25zCi0gICAgICAgIFVwZGF0ZSBORU9OIHdpZGUgaWRjdHMKLSAgICAgICAgTWFrZSBibG9jayBhY2Nlc3MgdG8gZnJhbWUgYnVmZmVyIHNlcXVlbnRpYWwKLSAgICAgICAgSW1wcm92ZWQgc3Vic2V0IGJsb2NrIHNlYXJjaAotICAgICAgICBCaWxpbmVhciBzdWJwaXhlbCBvcHRpbWl6YXRpb25zIGZvciBzc3NlMy4KLSAgICAgICAgRGVjcmVhc2UgbWVtb3J5IGZvb3RwcmludAotCi0gICAgICBFbmNvZGVyIHNwZWVkIGltcHJvdmVtZW50cyAocGVyY2VudGFnZSBnYWluIG5vdCBtZWFzdXJlZCk6Ci0gICAgICAgIFNraXAgdW5uZWNlc3Nhcnkgc2VhcmNoIG9mIGlkZW50aWNhbCBmcmFtZXMKLSAgICAgICAgQWRkIFNTRTIgc3VidHJhY3QgZnVuY3Rpb25zCi0gICAgICAgIEltcHJvdmUgYm91bmRzIGNoZWNraW5nIGluIHZwOF9kaWFtb25kX3NlYXJjaF9zYWR4NCgpCi0gICAgICAgIEFkZGVkIHZwOF9mYXN0X3F1YW50aXplX2Jfc3NlMgotCi0gIC0gUXVhbGl0eToKLSAgICAgIE92ZXIgNyUgb3ZlcmFsbCBQU05SIGltcHJvdmVtZW50ICg2LjMlIFNTSU0pIGluICJiZXN0IiBxdWFsaXR5Ci0gICAgICBlbmNvZGluZyBtb2RlLCBhbmQgdXAgdG8gNjAlIGltcHJvdmVtZW50IG9uIHZlcnkgbm9pc3ksIHN0aWxsCi0gICAgICBvciBzbG93IG1vdmluZyBzb3VyY2UgdmlkZW8KLQotICAgICAgICBNb3Rpb24gY29tcGVuc2F0ZWQgdGVtcG9yYWwgZmlsdGVyIGZvciBBbHQtUmVmIE5vaXNlIFJlZHVjdGlvbgotICAgICAgICBJbXByb3ZlZCB1c2Ugb2YgdHJlbGxpcyBxdWFudGl6YXRpb24gb24gMm5kIG9yZGVyIFkgYmxvY2tzCi0gICAgICAgIFR1bmUgZWZmZWN0IG9mIG1vdGlvbiBvbiBLRi9HRiBib29zdCBpbiB0d28gcGFzcwotICAgICAgICBBbGxvdyBjb2VmZmljaWVudCBvcHRpbWl6YXRpb24gZm9yIGdvb2QgcXVhbGl0eSBzcGVlZCAwLgotICAgICAgICBJbXByb3ZlZCBjb250cm9sIG9mIGFjdGl2ZSBtaW4gcXVhbnRpemVyIGZvciB0d28gcGFzcy4KLSAgICAgICAgRW5hYmxlIEFSRnMgZm9yIG5vbi1sYWdnZWQgY29tcHJlc3MKLQotMjAxMC0wOS0wMiB2MC45LjIKLSAgLSBFbmhhbmNlbWVudHM6Ci0gICAgICBEaXNhYmxlIGZyYW1lIGRyb3BwaW5nIGJ5IGRlZmF1bHQKLSAgICAgIEltcHJvdmVkIG11bHRpdGhyZWFkZWQgcGVyZm9ybWFuY2UKLSAgICAgIEltcHJvdmVkIEZvcmNlIEtleSBGcmFtZSBCZWhhdmlvdXIKLSAgICAgIEluY3JlYXNlZCByYXRlIGNvbnRyb2wgYnVmZmVyIGxldmVsIHByZWNpc2lvbgotICAgICAgRml4IGJ1ZyBpbiAxc3QgcGFzcyBtb3Rpb24gY29tcGVuc2F0aW9uCi0gICAgICBpdmZlbmM6IGNvcnJlY3QgZml4ZWQga2YgaW50ZXJ2YWwsIC0tZGlzYWJsZS1rZgotICAtIFNwZWVkOgotICAgICAgQ2hhbmdlZCBhYm92ZSBhbmQgbGVmdCBjb250ZXh0IGRhdGEgbGF5b3V0Ci0gICAgICBSZXdvcmsgaWRjdCBjYWxsaW5nIHN0cnVjdHVyZS4KLSAgICAgIFJlbW92ZWQgdW5uZWNlc3NhcnkgTUJfTU9ERV9JTkZPIGNvcGllcwotICAgICAgeDg2OiBTU1NFMyBzaXh0YXAgcHJlZGljdGlvbgotICAgICAgUmV3b3JrZWQgSURDVCB0byBpbmNsdWRlIHJlY29uc3RydWN0aW9uIChhZGQpIHN0ZXAKLSAgICAgIFN3YXAgYWx0L2dvbGQvbmV3L2xhc3QgZnJhbWUgYnVmZmVyIHB0cnMgaW5zdGVhZCBvZiBjb3B5aW5nLgotICAgICAgSW1wcm92ZSBTU0UyIGxvb3BmaWx0ZXIgZnVuY3Rpb25zCi0gICAgICBDaGFuZ2UgYml0cmVhZGVyIHRvIHVzZSBhIGxhcmdlciB3aW5kb3cuCi0gICAgICBBdm9pZCBsb29wZmlsdGVyIHJlaW5pdGlhbGl6YXRpb24gd2hlbiBwb3NzaWJsZQotICAtIFF1YWxpdHk6Ci0gICAgICBOb3JtYWxpemUgcXVhbnRpemVyJ3MgemVybyBiaW4gYW5kIHJvdW5kaW5nIGZhY3RvcnMKLSAgICAgIEFkZCB0cmVsbGlzIHF1YW50aXphdGlvbi4KLSAgICAgIE1ha2UgdGhlIHF1YW50aXplciBleGFjdC4KLSAgICAgIFVwZGF0ZXMgdG8gQVJOUiBmaWx0ZXJpbmcgYWxnb3JpdGhtCi0gICAgICBGaXggYnJlYWtvdXQgdGhyZXNoIGNvbXB1dGF0aW9uIGZvciBnb2xkZW4gJiBBbHRSZWYgZnJhbWVzCi0gICAgICBSZWRvIHRoZSBmb3J3YXJkIDR4NCBkY3QKLSAgICAgIEltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIGZvcndhcmQgd2Fsc2gtaGFkYW1hcmQgdHJhbnNmb3JtCi0gICAgICBGdXJ0aGVyIGFkanVzdG1lbnQgb2YgUkQgYmVoYXZpb3VyIHdpdGggUSBhbmQgWmJpbi4KLSAgLSBCdWlsZCBTeXN0ZW06Ci0gICAgICBBbGxvdyBsaW5raW5nIG9mIGxpYnMgYnVpbHQgd2l0aCBNaW5HVyB0byBNU1ZDCi0gICAgICBGaXggdGFyZ2V0IGF1dG8tZGV0ZWN0aW9uIG9uIG1pbmd3MzIKLSAgICAgIEFsbG93IC0tY3B1PSB0byB3b3JrIGZvciB4ODYuCi0gICAgICBjb25maWd1cmU6IHBhc3Mgb3JpZ2luYWwgYXJndW1lbnRzIHRocm91Z2ggdG8gbWFrZSBkaXN0Ci0gICAgICBGaXggYnVpbGRzIHdpdGhvdXQgcnVudGltZSBDUFUgZGV0ZWN0aW9uCi0gICAgICBtc3ZzOiBmaXggaW5zdGFsbCBvZiBjb2RlYyBzb3VyY2VzCi0gICAgICBtc3ZzOiBDaGFuZ2UgZGV2ZW52LmNvbSBjb21tYW5kIGxpbmUgZm9yIGJldHRlciBtc3lzIHN1cHBvcnQKLSAgICAgIG1zdnM6IEFkZCB2czkgdGFyZ2V0cy4KLSAgICAgIEFkZCB4ODZfNjQtbGludXgtaWNjIHRhcmdldAotICAtIEJ1Z3M6Ci0gICAgICBQb3RlbnRpYWwgY3Jhc2hlcyBvbiBvbGRlciBNaW5HVyBidWlsZHMKLSAgICAgIEZpeCB0d28tcGFzcyBmcmFtcmF0ZSBmb3IgWTRNIGlucHV0LgotICAgICAgRml4ZWQgc2ltcGxlIGxvb3AgZmlsdGVyLCBvdGhlciBjcmFzaGVzIG9uIEFSTSB2NgotICAgICAgYXJtOiBmaXggbWlzc2luZyBkZXBlbmRlbmN5IHdpdGggLS1lbmFibGUtc2hhcmVkCi0gICAgICBjb25maWd1cmU6IHN1cHBvcnQgZGlyZWN0b3JpZXMgY29udGFpbmluZyAubwotICAgICAgUmVwbGFjZSBwaW5zcncgKFNTRSkgd2l0aCBNTVggaW5zdHJ1Y3Rpb25zCi0gICAgICBhcHBsZTogaW5jbHVkZSBwcm9wZXIgbWFjaCBwcmltYXRpdmVzCi0gICAgICBGaXhlZCByYXRlIGNvbnRyb2wgYnVnIHdpdGggbG9uZyBrZXkgZnJhbWUgaW50ZXJ2YWwuCi0gICAgICBGaXggRFNPIGxpbmsgZXJyb3JzIG9uIHg4Ni02NCB3aGVuIG5vdCB1c2luZyBhIHZlcnNpb24gc2NyaXB0Ci0gICAgICBGaXhlZCBidWZmZXIgc2VsZWN0aW9uIGZvciBVViBpbiBBbHRSZWYgZmlsdGVyaW5nCi0KLQotMjAxMC0wNi0xNyB2MC45LjEKLSAgLSBFbmhhbmNlbWVudHM6Ci0gICAgICAqIGl2ZmVuYy9pdmZkZWMgbm93IHN1cHBvcnQgWVVWNE1QRUcyIGlucHV0IGFuZCBwaXBlIEkvTwotICAgICAgKiBTcGVlZCBvcHRpbWl6YXRpb25zCi0gIC0gQnVnZml4ZXM6Ci0gICAgICAqIFJhdGUgY29udHJvbAotICAgICAgKiBQcmV2ZW50IG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gaW52YWxpZCBkYXRhCi0gIC0gQnVpbGQgc3lzdGVtIHVwZGF0ZXM6Ci0gICAgICAqIERldGVjdCB0b29sY2hhaW4gdG8gYmUgdXNlZCBhdXRvbWF0aWNhbGx5IGZvciBuYXRpdmUgYnVpbGRzCi0gICAgICAqIFN1cHBvcnQgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcwotICAgICAgKiBCZXR0ZXIgYXV0b3Rvb2xzIGVtdWxhdGlvbiAoLS1wcmVmaXgsIC0tbGliZGlyLCBERVNURElSKQotICAtIFVwZGF0ZWQgTElDRU5TRQotICAgICAgKiBodHRwOi8vd2VibXByb2plY3QuYmxvZ3Nwb3QuY29tLzIwMTAvMDYvY2hhbmdlcy10by13ZWJtLW9wZW4tc291cmNlLWxpY2Vuc2UuaHRtbAotCi0KLTIwMTAtMDUtMTggdjAuOS4wCi0gIC0gSW5pdGlhbCBvcGVuIHNvdXJjZSByZWxlYXNlLiBXZWxjb21lIHRvIFdlYk0gYW5kIFZQOCEKLQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNmY5OTUuLjAwMDAwMDAKLS0tIGEvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgIGRpc3RyaWJ1dGlvbi4KLQotICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKLSAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi1BIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi1EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLVRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IDdhNmY5OTUuLjFjZTQ0MzQgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTEsNCArMSw0IEBACi1Db3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBXZWJNIFByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0xMiw5ICsxMiwxMCBAQAogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICAgICBkaXN0cmlidXRpb24uCiAKLSAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0gICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSwgbm9yIHRoZSBXZWJNIFByb2plY3QsIG5vciB0aGUgbmFtZXMKKyAgICBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24uCiAKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZGM1ZWEuLjAwMDAwMDAKLS0tIGEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLXZweCBNdWx0aS1Gb3JtYXQgQ29kZWMgU0RLCi1SRUFETUUgLSAxOSBNYXkgMjAxMAotCi1XZWxjb21lIHRvIHRoZSBXZWJNIFZQOCBDb2RlYyBTREshCi0KLUNPTVBJTElORyBUSEUgQVBQTElDQVRJT05TL0xJQlJBUklFUzoKLSAgVGhlIGJ1aWxkIHN5c3RlbSB1c2VkIGlzIHNpbWlsYXIgdG8gYXV0b3Rvb2xzLiBCdWlsZGluZyBnZW5lcmFsbHkgY29uc2lzdHMgb2YKLSAgImNvbmZpZ3VyaW5nIiB3aXRoIHlvdXIgZGVzaXJlZCBidWlsZCBvcHRpb25zLCB0aGVuIHVzaW5nIEdOVSBtYWtlIHRvIGJ1aWxkCi0gIHRoZSBhcHBsaWNhdGlvbi4KLQotICAxLiBQcmVyZXF1aXNpdGVzCi0KLSAgICAqIEFsbCB4ODYgdGFyZ2V0cyByZXF1aXJlIHRoZSBZYXNtWzFdIGFzc2VtYmxlciBiZSBpbnN0YWxsZWQuCi0gICAgKiBBbGwgV2luZG93cyBidWlsZHMgcmVxdWlyZSB0aGF0IEN5Z3dpblsyXSBiZSBpbnN0YWxsZWQuCi0gICAgKiBCdWlsZGluZyB0aGUgZG9jdW1lbnRhdGlvbiByZXF1aXJlcyBQSFBbM10gYW5kIERveHlnZW5bNF0uIElmIHlvdSBkbyBub3QKLSAgICAgIGhhdmUgdGhlc2UgcGFja2FnZXMsIHlvdSBtdXN0IHBhc3MgLS1kaXNhYmxlLWluc3RhbGwtZG9jcyB0byB0aGUKLSAgICAgIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLSAgICBbMV06IGh0dHA6Ly93d3cudG9ydGFsbC5uZXQvcHJvamVjdHMveWFzbQotICAgIFsyXTogaHR0cDovL3d3dy5jeWd3aW4uY29tCi0gICAgWzNdOiBodHRwOi8vcGhwLm5ldAotICAgIFs0XTogaHR0cDovL3d3dy5kb3h5Z2VuLm9yZwotCi0gIDIuIE91dC1vZi10cmVlIGJ1aWxkcwotICBPdXQgb2YgdHJlZSBidWlsZHMgYXJlIGEgc3VwcG9ydGVkIG1ldGhvZCBvZiBidWlsZGluZyB0aGUgYXBwbGljYXRpb24uIEZvcgotICBhbiBvdXQgb2YgdHJlZSBidWlsZCwgdGhlIHNvdXJjZSB0cmVlIGlzIGtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgb2JqZWN0Ci0gIGZpbGVzIHByb2R1Y2VkIGR1cmluZyBjb21waWxhdGlvbi4gRm9yIGluc3RhbmNlOgotCi0gICAgJCBta2RpciBidWlsZAotICAgICQgY2QgYnVpbGQKLSAgICAkIC4uL2xpYnZweC9jb25maWd1cmUgPG9wdGlvbnM+Ci0gICAgJCBtYWtlCi0KLSAgMy4gQ29uZmlndXJhdGlvbiBvcHRpb25zCi0gIFRoZSAnY29uZmlndXJlJyBzY3JpcHQgc3VwcG9ydHMgYSBudW1iZXIgb2Ygb3B0aW9ucy4gVGhlIC0taGVscCBvcHRpb24gY2FuIGJlCi0gIHVzZWQgdG8gZ2V0IGEgbGlzdCBvZiBzdXBwb3J0ZWQgb3B0aW9uczoKLSAgICAkIC4uL2xpYnZweC9jb25maWd1cmUgLS1oZWxwCi0KLSAgNC4gQ3Jvc3MgZGV2ZWxvcG1lbnQKLSAgRm9yIGNyb3NzIGRldmVsb3BtZW50LCB0aGUgbW9zdCBub3RhYmxlIG9wdGlvbiBpcyB0aGUgLS10YXJnZXQgb3B0aW9uLiBUaGUKLSAgbW9zdCB1cC10by1kYXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldHMgY2FuIGJlIGZvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhlCi0gIC0taGVscCBvdXRwdXQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlIGxpc3Qgb2YKLSAgYXZhaWxhYmxlIHRhcmdldHMgaXM6Ci0KLSAgICBhcm12NXRlLWxpbnV4LXJ2Y3QKLSAgICBhcm12NXRlLWxpbnV4LWdjYwotICAgIGFybXY1dGUtc3ltYmlhbi1nY2MKLSAgICBhcm12Ni1kYXJ3aW4tZ2NjCi0gICAgYXJtdjYtbGludXgtcnZjdAotICAgIGFybXY2LWxpbnV4LWdjYwotICAgIGFybXY2LXN5bWJpYW4tZ2NjCi0gICAgaXdtbXh0LWxpbnV4LXJ2Y3QKLSAgICBpd21teHQtbGludXgtZ2NjCi0gICAgaXdtbXh0Mi1saW51eC1ydmN0Ci0gICAgaXdtbXh0Mi1saW51eC1nY2MKLSAgICBhcm12Ny1saW51eC1ydmN0Ci0gICAgYXJtdjctbGludXgtZ2NjCi0gICAgbWlwczMyLWxpbnV4LWdjYwotICAgIHBwYzMyLWRhcndpbjgtZ2NjCi0gICAgcHBjMzItZGFyd2luOS1nY2MKLSAgICBwcGM2NC1kYXJ3aW44LWdjYwotICAgIHBwYzY0LWRhcndpbjktZ2NjCi0gICAgcHBjNjQtbGludXgtZ2NjCi0gICAgeDg2LWRhcndpbjgtZ2NjCi0gICAgeDg2LWRhcndpbjgtaWNjCi0gICAgeDg2LWRhcndpbjktZ2NjCi0gICAgeDg2LWRhcndpbjktaWNjCi0gICAgeDg2LWxpbnV4LWdjYwotICAgIHg4Ni1saW51eC1pY2MKLSAgICB4ODYtc29sYXJpcy1nY2MKLSAgICB4ODYtd2luMzItdnM3Ci0gICAgeDg2LXdpbjMyLXZzOAotICAgIHg4Nl82NC1kYXJ3aW45LWdjYwotICAgIHg4Nl82NC1saW51eC1nY2MKLSAgICB4ODZfNjQtc29sYXJpcy1nY2MKLSAgICB4ODZfNjQtd2luNjQtdnM4Ci0gICAgdW5pdmVyc2FsLWRhcndpbjgtZ2NjCi0gICAgdW5pdmVyc2FsLWRhcndpbjktZ2NjCi0gICAgZ2VuZXJpYy1nbnUKLQotICBUaGUgZ2VuZXJpYy1nbnUgdGFyZ2V0LCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBDUk9TUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwKLSAgY2FuIGJlIHVzZWQgdG8gY3Jvc3MgY29tcGlsZSBhcmNoaXRlY3R1cmVzIHRoYXQgYXJlbid0IGV4cGxpY2l0bHkgbGlzdGVkLCBpZgotICB0aGUgdG9vbGNoYWluIGlzIGEgY3Jvc3MgR05VIChnY2MvYmludXRpbHMpIHRvb2xjaGFpbi4gT3RoZXIgUE9TSVggdG9vbGNoYWlucwotICB3aWxsIGxpa2VseSB3b3JrIGFzIHdlbGwuIEZvciBpbnN0YW5jZSwgdG8gYnVpbGQgdXNpbmcgdGhlIG1pcHNlbC1saW51eC11Y2xpYmMKLSAgdG9vbGNoYWluLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY291bGQgYmUgdXNlZCAobm90ZSwgUE9TSVggU0ggc3ludGF4LCBhZGFwdAotICB0byB5b3VyIHNoZWxsIGFzIG5lY2Vzc2FyeSk6Ci0KLSAgICAkIENST1NTPW1pcHNlbC1saW51eC11Y2xpYmMtIC4uL2xpYnZweC9jb25maWd1cmUKLQotICBJbiBhZGRpdGlvbiwgdGhlIGV4ZWN1dGFibGVzIHRvIGJlIGludm9rZWQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlY2lmeWluZyB0aGUKLSAgZW52aXJvbm1lbnQgdmFyaWFibGVzOiBDQywgQVIsIExELCBBUywgU1RSSVAsIE5NLiBBZGRpdGlvbmFsIGZsYWdzIGNhbiBiZQotICBwYXNzZWQgdG8gdGhlc2UgZXhlY3V0YWJsZXMgd2l0aCBDRkxBR1MsIExERkxBR1MsIGFuZCBBU0ZMQUdTLgotCi0gIDUuIENvbmZpZ3VyYXRpb24gZXJyb3JzCi0gIElmIHRoZSBjb25maWd1cmF0aW9uIHN0ZXAgZmFpbHMsIHRoZSBmaXJzdCBzdGVwIGlzIHRvIGxvb2sgaW4gdGhlIGVycm9yIGxvZy4KLSAgVGhpcyBkZWZhdWx0cyB0byBjb25maWcuZXJyLiBUaGlzIHNob3VsZCBnaXZlIGEgZ29vZCBpbmRpY2F0aW9uIG9mIHdoYXQgd2VudAotICB3cm9uZy4gSWYgbm90LCBjb250YWN0IHVzIGZvciBzdXBwb3J0LgotCi1TVVBQT1JUCi0gIFRoaXMgbGlicmFyeSBpcyBhbiBvcGVuIHNvdXJjZSBwcm9qZWN0IHN1cHBvcnRlZCBieSBpdHMgY29tbXVuaXR5LiBQbGVhc2UKLSAgcGxlYXNlIGVtYWlsIHdlYm0tdXNlcnNAd2VibXByb2plY3Qub3JnIGZvciBoZWxwLgotCmRpZmYgLS1naXQgYS9VUERBVElORyBiL1VQREFUSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzNjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9VUERBVElORwpAQCAtMCwwICsxLDQ3IEBACitQdWxsIHRoZSBuZXcgbGlidnB4IGNoZWNrb3V0IGludG8gZXh0ZXJuYWwvbGlidnB4L2xpYnZweDoKKyQgY2QgZXh0ZXJuYWwvbGlidnB4LworJCBybSAtcmYgbGlidnB4CiskIGdpdCBjbG9uZSBodHRwOi8vZ2l0LmNocm9taXVtLm9yZy93ZWJtL2xpYnZweC5naXQKKyQgY2QgbGlidnB4CiskIGdpdCBjaGVja291dCA8YnJhbmNoPgorJCBybSAtcmYgLmdpdCoKKworRW50ZXIgdGhlIHN1YmRpcmVjdG9yeSBmb3IgdGhlIHJlbGV2YW50IHBsYXRmb3JtLiBGb3IgZXhhbXBsZSwgYXJtdjctbmVvbiBmb3IKK2FybXY3IHRhcmdldHMgd2l0aCBuZW9uIGV4dGVuc2lvbnMuIFdlIGRpc2FibGUgbWFueSBmZWF0dXJlcy4gU29tZSBmb3IKK2Z1bmN0aW9uYWwgcmVhc29ucyBhbmQgc29tZSBmb3IgYWVzdGhldGljIG9uZXMuCisKK0Z1bmN0aW9uYWw6CistLWZvcmNlLXRhcmdldD0kVEFSR0VUCisgIFRoZSAiQW5kcm9pZCIgc3VwcG9ydCBpbiBsaWJ2cHggaXMgdGFyZ2V0ZWQgYXQgdGhlIE5ESyBhbmQgZG9lcyBub3QgeWV0CisgIGluY2x1ZGUgc3VwcG9ydCBmb3IgYXJjaGl0ZWN0dXJlcyBzdWNoIGFzIE1JUFMuIEhvd2V2ZXIsIHdlIGNhbiBzdGlsbCBnZW5lcmF0ZQorICB0aGUgbmVjZXNzYXJ5IGZpbGVzIGZvciB0aGVtLgorLS1kaXNhYmxlLXJ1bnRpbWUtY3B1LWRldGVjdAorLS1kaXNhYmxlLW5lb24KKyAgVGhlIHBsYXRmb3JtIGtub3dzIGF0IGJ1aWxkIHRpbWUgd2hhdCBleHRlbnNpb25zIGFyZSBzdXBwb3J0ZWQuCistLXNkay1wYXRoPSRTREtfUEFUSAorICBGb3IgY29uZmlndXJhdGlvbiB3ZSBkbyBzb21lIGNvbXBpbGVyIHRlc3RzLiBJdCBpcyBtdWNoIGVhc2llciB0byBhY2NlcHQgdGhlbQorICB0aGFuIHRvIHdvcmsgYXJvdW5kIHRoZW0uIFRoaXMgdXNlcyB0aGUgY29tcGlsZXJzIGluY2x1ZGVkIGluIHRoZSBOREsuCistLWRpc2FibGUtdnA4LWVuY29kZXIKKyAgQnVpbGQgb25seSB0aGUgZGVjb2Rlci4KKworQWVzdGhldGljOgorLS1kaXNhYmxlLWV4YW1wbGVzCistLWRpc2FibGUtZG9jcworICBTa2lwIHVubmVjZXNzYXJ5IGV4dHJhIG1ha2VmaWxlcy4KKworRXhhbXBsZToKKyQgY2QgZXh0ZXJuYWwvbGlidnB4L2FybXY3YQorJCAuLi9saWJ2cHgvY29uZmlndXJlIC0tdGFyZ2V0PWFybXY3LWFuZHJvaWQtZ2NjIC0tZGlzYWJsZS1ydW50aW1lLWNwdS1kZXRlY3QgXAorICAtLWRpc2FibGUtbmVvbiAtLXNkay1wYXRoPSRBTkRST0lEX05ES19ST09UIC0tZGlzYWJsZS12cDgtZW5jb2RlciBcCisgIC0tZGlzYWJsZS1leGFtcGxlcyAtLWRpc2FibGUtZG9jcworCitSdW4gJ21ha2UgbGlidnB4X3NyY3MudHh0JworVGhpcyB3aWxsIGdlbmVyYXRlIGEgZmlsZSBsaXN0aW5nIGFsbCBvZiB0aGUgcmVxdWlyZWQgc291cmNlcy4gSXQgd2lsbCBhbHNvCitnZW5lcmF0ZSB2cHhfcnRjZC5oIGFuZCB2cHhfdmVyc2lvbi5oCisKK1JlbW92ZSB0aGUgdW51c2VkIGZpbGVzIGxlYXZpbmcgb25seToKK2xpYnZweF9zcmNzLnR4dAordnB4X2NvbmZpZy5jCit2cHhfY29uZmlnLmgKK3ZweF9ydGNkLmgKK3ZweF92ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2FyZ3MuYyBiL2FyZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyY2MzYS4uMDAwMDAwMAotLS0gYS9hcmdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlICJhcmdzLmgiCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18KLWV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLSNlbHNlCi1leHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pOwotI2VuZGlmCi0KLQotc3RydWN0IGFyZyBhcmdfaW5pdChjaGFyICoqYXJndikKLXsKLSAgICBzdHJ1Y3QgYXJnIGE7Ci0KLSAgICBhLmFyZ3YgICAgICA9IGFyZ3Y7Ci0gICAgYS5hcmd2X3N0ZXAgPSAxOwotICAgIGEubmFtZSAgICAgID0gTlVMTDsKLSAgICBhLnZhbCAgICAgICA9IE5VTEw7Ci0gICAgYS5kZWYgICAgICAgPSBOVUxMOwotICAgIHJldHVybiBhOwotfQotCi1pbnQgYXJnX21hdGNoKHN0cnVjdCBhcmcgKmFyZ18sIGNvbnN0IHN0cnVjdCBhcmdfZGVmICpkZWYsIGNoYXIgKiphcmd2KQotewotICAgIHN0cnVjdCBhcmcgYXJnOwotCi0gICAgaWYgKCFhcmd2WzBdIHx8IGFyZ3ZbMF1bMF0gIT0gJy0nKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGFyZyA9IGFyZ19pbml0KGFyZ3YpOwotCi0gICAgaWYgKGRlZi0+c2hvcnRfbmFtZQotICAgICAgICAmJiBzdHJsZW4oYXJnLmFyZ3ZbMF0pID09IHN0cmxlbihkZWYtPnNob3J0X25hbWUpICsgMQotICAgICAgICAmJiAhc3RyY21wKGFyZy5hcmd2WzBdICsgMSwgZGVmLT5zaG9ydF9uYW1lKSkKLSAgICB7Ci0KLSAgICAgICAgYXJnLm5hbWUgPSBhcmcuYXJndlswXSArIDE7Ci0gICAgICAgIGFyZy52YWwgPSBkZWYtPmhhc192YWwgPyBhcmcuYXJndlsxXSA6IE5VTEw7Ci0gICAgICAgIGFyZy5hcmd2X3N0ZXAgPSBkZWYtPmhhc192YWwgPyAyIDogMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmLT5sb25nX25hbWUpCi0gICAgewotICAgICAgICBpbnQgbmFtZV9sZW4gPSBzdHJsZW4oZGVmLT5sb25nX25hbWUpOwotCi0gICAgICAgIGlmIChzdHJsZW4oYXJnLmFyZ3ZbMF0pID49IG5hbWVfbGVuICsgMgotICAgICAgICAgICAgJiYgYXJnLmFyZ3ZbMF1bMV0gPT0gJy0nCi0gICAgICAgICAgICAmJiAhc3RybmNtcChhcmcuYXJndlswXSArIDIsIGRlZi0+bG9uZ19uYW1lLCBuYW1lX2xlbikKLSAgICAgICAgICAgICYmIChhcmcuYXJndlswXVtuYW1lX2xlbisyXSA9PSAnPScKLSAgICAgICAgICAgICAgICB8fCBhcmcuYXJndlswXVtuYW1lX2xlbisyXSA9PSAnXDAnKSkKLSAgICAgICAgewotCi0gICAgICAgICAgICBhcmcubmFtZSA9IGFyZy5hcmd2WzBdICsgMjsKLSAgICAgICAgICAgIGFyZy52YWwgPSBhcmcubmFtZVtuYW1lX2xlbl0gPT0gJz0nID8gYXJnLm5hbWUgKyBuYW1lX2xlbiArIDEgOiBOVUxMOwotICAgICAgICAgICAgYXJnLmFyZ3Zfc3RlcCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYXJnLm5hbWUgJiYgIWFyZy52YWwgJiYgZGVmLT5oYXNfdmFsKQotICAgICAgICBkaWUoIkVycm9yOiBvcHRpb24gJXMgcmVxdWlyZXMgYXJndW1lbnQuXG4iLCBhcmcubmFtZSk7Ci0KLSAgICBpZiAoYXJnLm5hbWUgJiYgYXJnLnZhbCAmJiAhZGVmLT5oYXNfdmFsKQotICAgICAgICBkaWUoIkVycm9yOiBvcHRpb24gJXMgcmVxdWlyZXMgbm8gYXJndW1lbnQuXG4iLCBhcmcubmFtZSk7Ci0KLSAgICBpZiAoYXJnLm5hbWUKLSAgICAgICAgJiYgKGFyZy52YWwgfHwgIWRlZi0+aGFzX3ZhbCkpCi0gICAgewotICAgICAgICBhcmcuZGVmID0gZGVmOwotICAgICAgICAqYXJnXyA9IGFyZzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgY2hhciAqYXJnX25leHQoc3RydWN0IGFyZyAqYXJnKQotewotICAgIGlmIChhcmctPmFyZ3ZbMF0pCi0gICAgICAgIGFyZy0+YXJndiArPSBhcmctPmFyZ3Zfc3RlcDsKLQotICAgIHJldHVybiAqYXJnLT5hcmd2OwotfQotCi0KLWNoYXIgKiphcmd2X2R1cChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCi17Ci0gICAgY2hhciAqKm5ld19hcmd2ID0gbWFsbG9jKChhcmdjICsgMSkgKiBzaXplb2YoKmFyZ3YpKTsKLQotICAgIG1lbWNweShuZXdfYXJndiwgYXJndiwgYXJnYyAqIHNpemVvZigqYXJndikpOwotICAgIG5ld19hcmd2W2FyZ2NdID0gTlVMTDsKLSAgICByZXR1cm4gbmV3X2FyZ3Y7Ci19Ci0KLQotdm9pZCBhcmdfc2hvd191c2FnZShGSUxFICpmcCwgY29uc3Qgc3RydWN0IGFyZ19kZWYgKmNvbnN0ICpkZWZzKQotewotICAgIGNoYXIgb3B0aW9uX3RleHRbNDBdID0gezB9OwotCi0gICAgZm9yICg7ICpkZWZzOyBkZWZzKyspCi0gICAgewotICAgICAgICBjb25zdCBzdHJ1Y3QgYXJnX2RlZiAqZGVmID0gKmRlZnM7Ci0gICAgICAgIGNoYXIgKnNob3J0X3ZhbCA9IGRlZi0+aGFzX3ZhbCA/ICIgPGFyZz4iIDogIiI7Ci0gICAgICAgIGNoYXIgKmxvbmdfdmFsID0gZGVmLT5oYXNfdmFsID8gIj08YXJnPiIgOiAiIjsKLQotICAgICAgICBpZiAoZGVmLT5zaG9ydF9uYW1lICYmIGRlZi0+bG9uZ19uYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyICpjb21tYSA9IGRlZi0+aGFzX3ZhbCA/ICIsIiA6ICIsICAgICAgIjsKLQotICAgICAgICAgICAgc25wcmludGYob3B0aW9uX3RleHQsIDM3LCAiLSVzJXMlcyAtLSVzJTZzIiwKLSAgICAgICAgICAgICAgICAgICAgIGRlZi0+c2hvcnRfbmFtZSwgc2hvcnRfdmFsLCBjb21tYSwKLSAgICAgICAgICAgICAgICAgICAgIGRlZi0+bG9uZ19uYW1lLCBsb25nX3ZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZGVmLT5zaG9ydF9uYW1lKQotICAgICAgICAgICAgc25wcmludGYob3B0aW9uX3RleHQsIDM3LCAiLSVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgZGVmLT5zaG9ydF9uYW1lLCBzaG9ydF92YWwpOwotICAgICAgICBlbHNlIGlmIChkZWYtPmxvbmdfbmFtZSkKLSAgICAgICAgICAgIHNucHJpbnRmKG9wdGlvbl90ZXh0LCAzNywgIiAgICAgICAgICAtLSVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgZGVmLT5sb25nX25hbWUsIGxvbmdfdmFsKTsKLQotICAgICAgICBmcHJpbnRmKGZwLCAiICAlLTM3c1x0JXNcbiIsIG9wdGlvbl90ZXh0LCBkZWYtPmRlc2MpOwotCi0gICAgICAgIGlmKGRlZi0+ZW51bXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhcmdfZW51bV9saXN0ICpsaXN0cHRyOwotCi0gICAgICAgICAgICBmcHJpbnRmKGZwLCAiICAlLTM3c1x0ICAiLCAiIik7Ci0KLSAgICAgICAgICAgIGZvcihsaXN0cHRyID0gZGVmLT5lbnVtczsgbGlzdHB0ci0+bmFtZTsgbGlzdHB0cisrKQotICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIlcyVzIiwgbGlzdHB0ci0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RwdHJbMV0ubmFtZSA/ICIsICIgOiAiXG4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi11bnNpZ25lZCBpbnQgYXJnX3BhcnNlX3VpbnQoY29uc3Qgc3RydWN0IGFyZyAqYXJnKQotewotICAgIGxvbmcgaW50ICAgcmF3dmFsOwotICAgIGNoYXIgICAgICAqZW5kcHRyOwotCi0gICAgcmF3dmFsID0gc3RydG9sKGFyZy0+dmFsLCAmZW5kcHRyLCAxMCk7Ci0KLSAgICBpZiAoYXJnLT52YWxbMF0gIT0gJ1wwJyAmJiBlbmRwdHJbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAgIGlmIChyYXd2YWwgPj0gMCAmJiByYXd2YWwgPD0gVUlOVF9NQVgpCi0gICAgICAgICAgICByZXR1cm4gcmF3dmFsOwotCi0gICAgICAgIGRpZSgiT3B0aW9uICVzOiBWYWx1ZSAlbGQgb3V0IG9mIHJhbmdlIGZvciB1bnNpZ25lZCBpbnRcbiIsCi0gICAgICAgICAgICBhcmctPm5hbWUsIHJhd3ZhbCk7Ci0gICAgfQotCi0gICAgZGllKCJPcHRpb24gJXM6IEludmFsaWQgY2hhcmFjdGVyICclYydcbiIsIGFyZy0+bmFtZSwgKmVuZHB0cik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGFyZ19wYXJzZV9pbnQoY29uc3Qgc3RydWN0IGFyZyAqYXJnKQotewotICAgIGxvbmcgaW50ICAgcmF3dmFsOwotICAgIGNoYXIgICAgICAqZW5kcHRyOwotCi0gICAgcmF3dmFsID0gc3RydG9sKGFyZy0+dmFsLCAmZW5kcHRyLCAxMCk7Ci0KLSAgICBpZiAoYXJnLT52YWxbMF0gIT0gJ1wwJyAmJiBlbmRwdHJbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAgIGlmIChyYXd2YWwgPj0gSU5UX01JTiAmJiByYXd2YWwgPD0gSU5UX01BWCkKLSAgICAgICAgICAgIHJldHVybiByYXd2YWw7Ci0KLSAgICAgICAgZGllKCJPcHRpb24gJXM6IFZhbHVlICVsZCBvdXQgb2YgcmFuZ2UgZm9yIHNpZ25lZCBpbnRcbiIsCi0gICAgICAgICAgICBhcmctPm5hbWUsIHJhd3ZhbCk7Ci0gICAgfQotCi0gICAgZGllKCJPcHRpb24gJXM6IEludmFsaWQgY2hhcmFjdGVyICclYydcbiIsIGFyZy0+bmFtZSwgKmVuZHB0cik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RydWN0IHZweF9yYXRpb25hbAotewotICAgIGludCBudW07IC8qKjwgZnJhY3Rpb24gbnVtZXJhdG9yICovCi0gICAgaW50IGRlbjsgLyoqPCBmcmFjdGlvbiBkZW5vbWluYXRvciAqLwotfTsKLXN0cnVjdCB2cHhfcmF0aW9uYWwgYXJnX3BhcnNlX3JhdGlvbmFsKGNvbnN0IHN0cnVjdCBhcmcgKmFyZykKLXsKLSAgICBsb25nIGludCAgICAgICAgICAgICByYXd2YWw7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAqZW5kcHRyOwotICAgIHN0cnVjdCB2cHhfcmF0aW9uYWwgIHJhdDsKLQotICAgIC8qIHBhcnNlIG51bWVyYXRvciAqLwotICAgIHJhd3ZhbCA9IHN0cnRvbChhcmctPnZhbCwgJmVuZHB0ciwgMTApOwotCi0gICAgaWYgKGFyZy0+dmFsWzBdICE9ICdcMCcgJiYgZW5kcHRyWzBdID09ICcvJykKLSAgICB7Ci0gICAgICAgIGlmIChyYXd2YWwgPj0gSU5UX01JTiAmJiByYXd2YWwgPD0gSU5UX01BWCkKLSAgICAgICAgICAgIHJhdC5udW0gPSByYXd2YWw7Ci0gICAgICAgIGVsc2UgZGllKCJPcHRpb24gJXM6IFZhbHVlICVsZCBvdXQgb2YgcmFuZ2UgZm9yIHNpZ25lZCBpbnRcbiIsCi0gICAgICAgICAgICAgICAgICAgICBhcmctPm5hbWUsIHJhd3ZhbCk7Ci0gICAgfQotICAgIGVsc2UgZGllKCJPcHRpb24gJXM6IEV4cGVjdGVkIC8gYXQgJyVjJ1xuIiwgYXJnLT5uYW1lLCAqZW5kcHRyKTsKLQotICAgIC8qIHBhcnNlIGRlbm9taW5hdG9yICovCi0gICAgcmF3dmFsID0gc3RydG9sKGVuZHB0ciArIDEsICZlbmRwdHIsIDEwKTsKLQotICAgIGlmIChhcmctPnZhbFswXSAhPSAnXDAnICYmIGVuZHB0clswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgICAgaWYgKHJhd3ZhbCA+PSBJTlRfTUlOICYmIHJhd3ZhbCA8PSBJTlRfTUFYKQotICAgICAgICAgICAgcmF0LmRlbiA9IHJhd3ZhbDsKLSAgICAgICAgZWxzZSBkaWUoIk9wdGlvbiAlczogVmFsdWUgJWxkIG91dCBvZiByYW5nZSBmb3Igc2lnbmVkIGludFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGFyZy0+bmFtZSwgcmF3dmFsKTsKLSAgICB9Ci0gICAgZWxzZSBkaWUoIk9wdGlvbiAlczogSW52YWxpZCBjaGFyYWN0ZXIgJyVjJ1xuIiwgYXJnLT5uYW1lLCAqZW5kcHRyKTsKLQotICAgIHJldHVybiByYXQ7Ci19Ci0KLQotaW50IGFyZ19wYXJzZV9lbnVtKGNvbnN0IHN0cnVjdCBhcmcgKmFyZykKLXsKLSAgICBjb25zdCBzdHJ1Y3QgYXJnX2VudW1fbGlzdCAqbGlzdHB0cjsKLSAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgcmF3dmFsOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICplbmRwdHI7Ci0KLSAgICAvKiBGaXJzdCBzZWUgaWYgdGhlIHZhbHVlIGNhbiBiZSBwYXJzZWQgYXMgYSByYXcgdmFsdWUgKi8KLSAgICByYXd2YWwgPSBzdHJ0b2woYXJnLT52YWwsICZlbmRwdHIsIDEwKTsKLSAgICBpZiAoYXJnLT52YWxbMF0gIT0gJ1wwJyAmJiBlbmRwdHJbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAgIC8qIEdvdCBhIHJhdyB2YWx1ZSwgbWFrZSBzdXJlIGl0J3MgdmFsaWQgKi8KLSAgICAgICAgZm9yKGxpc3RwdHIgPSBhcmctPmRlZi0+ZW51bXM7IGxpc3RwdHItPm5hbWU7IGxpc3RwdHIrKykKLSAgICAgICAgICAgIGlmKGxpc3RwdHItPnZhbCA9PSByYXd2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJhd3ZhbDsKLSAgICB9Ci0KLSAgICAvKiBOZXh0IHNlZSBpZiBpdCBjYW4gYmUgcGFyc2VkIGFzIGEgc3RyaW5nICovCi0gICAgZm9yKGxpc3RwdHIgPSBhcmctPmRlZi0+ZW51bXM7IGxpc3RwdHItPm5hbWU7IGxpc3RwdHIrKykKLSAgICAgICAgaWYoIXN0cmNtcChhcmctPnZhbCwgbGlzdHB0ci0+bmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gbGlzdHB0ci0+dmFsOwotCi0gICAgZGllKCJPcHRpb24gJXM6IEludmFsaWQgdmFsdWUgJyVzJ1xuIiwgYXJnLT5uYW1lLCBhcmctPnZhbCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGFyZ19wYXJzZV9lbnVtX29yX2ludChjb25zdCBzdHJ1Y3QgYXJnICphcmcpCi17Ci0gICAgaWYoYXJnLT5kZWYtPmVudW1zKQotICAgICAgICByZXR1cm4gYXJnX3BhcnNlX2VudW0oYXJnKTsKLSAgICByZXR1cm4gYXJnX3BhcnNlX2ludChhcmcpOwotfQpkaWZmIC0tZ2l0IGEvYXJtdjdhLW5lb24vbGlidnB4X3NyY3MudHh0IGIvYXJtdjdhLW5lb24vbGlidnB4X3NyY3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMmUwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcm12N2EtbmVvbi9saWJ2cHhfc3Jjcy50eHQKQEAgLTAsMCArMSwxNzkgQEAKK2J1aWxkL21ha2UvcnRjZC5zaAorYnVpbGQvbWFrZS92ZXJzaW9uLnNoCitDSEFOR0VMT0cKK2xpYnMubWsKK3ZwOC9jb21tb24vYWxsb2Njb21tb24uYwordnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oCit2cDgvY29tbW9uL2FybS9hcm12Ni9iaWxpbmVhcmZpbHRlcl92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTE2eDE2X3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg0X3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg4X3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9kY19vbmx5X2lkY3RfYWRkX3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9kZXF1YW50X2lkY3RfdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2RlcXVhbnRpemVfdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2ZpbHRlcl92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvaWRjdF9ibGtfdjYuYwordnA4L2NvbW1vbi9hcm0vYXJtdjYvaWRjdF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvaW50cmE0eDRfcHJlZGljdF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvaXdhbHNoX3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9sb29wZmlsdGVyX3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9zaW1wbGVsb29wZmlsdGVyX3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9zaXh0YXBwcmVkaWN0OHg0X3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni92cDhfc2FkMTZ4MTZfYXJtdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZTE2eDE2X2FybXY2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2U4eDhfYXJtdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9hcm12Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2LmFzbS5zCit2cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uYwordnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmgKK3ZwOC9jb21tb24vYXJtL2RlcXVhbnRpemVfYXJtLmMKK3ZwOC9jb21tb24vYXJtL2ZpbHRlcl9hcm0uYwordnA4L2NvbW1vbi9hcm0vbG9vcGZpbHRlcl9hcm0uYwordnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3QxNngxNl9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDR4NF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4NF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4OF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2J1aWxkaW50cmFwcmVkaWN0b3JzbWJ5X25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTE2eDE2X25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTh4NF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDhfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9kY19vbmx5X2lkY3RfYWRkX25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vZGVxdWFudF9pZGN0X25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vZGVxdWFudGl6ZWJfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9pZGN0X2Jsa19uZW9uLmMKK3ZwOC9jb21tb24vYXJtL25lb24vaWRjdF9kZXF1YW50XzBfMnhfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2l3YWxzaF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyc2ltcGxlaG9yaXpvbnRhbGVkZ2VfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyc2ltcGxldmVydGljYWxlZGdlX25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vbWJsb29wZmlsdGVyX25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vc2FkMTZfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9zYWQ4X25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vc2F2ZV9yZWdfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0MTZ4MTZfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0NHg0X25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4NF9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDhfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi92YXJpYW5jZV9uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlMTZ4MTZfbmVvbi5hc20ucwordnA4L2NvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2c19uZW9uLmFzbS5zCit2cDgvY29tbW9uL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlOHg4X25lb24uYXNtLnMKK3ZwOC9jb21tb24vYXJtL3JlY29uaW50cmFfYXJtLmMKK3ZwOC9jb21tb24vYXJtL3ZhcmlhbmNlX2FybS5jCit2cDgvY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jCit2cDgvY29tbW9uL2Jsb2NrZC5jCit2cDgvY29tbW9uL2Jsb2NrZC5oCit2cDgvY29tbW9uL2NvZWZ1cGRhdGVwcm9icy5oCit2cDgvY29tbW9uL2NvbW1vbi5oCit2cDgvY29tbW9uL2RlYnVnbW9kZXMuYwordnA4L2NvbW1vbi9kZWZhdWx0X2NvZWZfcHJvYnMuaAordnA4L2NvbW1vbi9kZXF1YW50aXplLmMKK3ZwOC9jb21tb24vZW50cm9weS5jCit2cDgvY29tbW9uL2VudHJvcHkuaAordnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5jCit2cDgvY29tbW9uL2VudHJvcHltb2RlLmgKK3ZwOC9jb21tb24vZW50cm9weW12LmMKK3ZwOC9jb21tb24vZW50cm9weW12LmgKK3ZwOC9jb21tb24vZXh0ZW5kLmMKK3ZwOC9jb21tb24vZXh0ZW5kLmgKK3ZwOC9jb21tb24vZmlsdGVyLmMKK3ZwOC9jb21tb24vZmlsdGVyLmgKK3ZwOC9jb21tb24vZmluZG5lYXJtdi5jCit2cDgvY29tbW9uL2ZpbmRuZWFybXYuaAordnA4L2NvbW1vbi9nZW5lcmljL3N5c3RlbWRlcGVuZGVudC5jCit2cDgvY29tbW9uL2hlYWRlci5oCit2cDgvY29tbW9uL2lkY3RfYmxrLmMKK3ZwOC9jb21tb24vaWRjdGxsbS5jCit2cDgvY29tbW9uL2ludnRyYW5zLmgKK3ZwOC9jb21tb24vbG9vcGZpbHRlci5jCit2cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jCit2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaAordnA4L2NvbW1vbi9tYnBpdGNoLmMKK3ZwOC9jb21tb24vbW9kZWNvbnQuYwordnA4L2NvbW1vbi9tb2RlY29udC5oCit2cDgvY29tbW9uL212LmgKK3ZwOC9jb21tb24vb255eGNfaW50LmgKK3ZwOC9jb21tb24vb255eGQuaAordnA4L2NvbW1vbi9vbnl4LmgKK3ZwOC9jb21tb24vcHBmbGFncy5oCit2cDgvY29tbW9uL3ByYWdtYXMuaAordnA4L2NvbW1vbi9xdWFudF9jb21tb24uYwordnA4L2NvbW1vbi9xdWFudF9jb21tb24uaAordnA4L2NvbW1vbi9yZWNvbmludGVyLmMKK3ZwOC9jb21tb24vcmVjb25pbnRlci5oCit2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuYwordnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmgKK3ZwOC9jb21tb24vcmVjb25pbnRyYS5jCit2cDgvY29tbW9uL3J0Y2QuYwordnA4L2NvbW1vbi9ydGNkX2RlZnMuc2gKK3ZwOC9jb21tb24vc2FkX2MuYwordnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uYwordnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaAordnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5jCit2cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmgKK3ZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgKK3ZwOC9jb21tb24vdGhyZWFkaW5nLmgKK3ZwOC9jb21tb24vdHJlZWNvZGVyLmMKK3ZwOC9jb21tb24vdHJlZWNvZGVyLmgKK3ZwOC9jb21tb24vdmFyaWFuY2VfYy5jCit2cDgvY29tbW9uL3ZhcmlhbmNlLmgKK3ZwOC9jb21tb24vdnA4X2VudHJvcHltb2RlZGF0YS5oCit2cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYwordnA4L2RlY29kZXIvZGJvb2xodWZmLmMKK3ZwOC9kZWNvZGVyL2Rib29saHVmZi5oCit2cDgvZGVjb2Rlci9kZWNvZGVtdi5jCit2cDgvZGVjb2Rlci9kZWNvZGVtdi5oCit2cDgvZGVjb2Rlci9kZWNvZGVydGhyZWFkaW5nLmgKK3ZwOC9kZWNvZGVyL2RlY29kZnJhbWUuYwordnA4L2RlY29kZXIvZGV0b2tlbml6ZS5jCit2cDgvZGVjb2Rlci9kZXRva2VuaXplLmgKK3ZwOC9kZWNvZGVyL29ueXhkX2lmLmMKK3ZwOC9kZWNvZGVyL29ueXhkX2ludC5oCit2cDgvZGVjb2Rlci90aHJlYWRpbmcuYwordnA4L2RlY29kZXIvdHJlZXJlYWRlci5oCit2cDgvdnA4X2NvbW1vbi5tawordnA4L3ZwOF9keF9pZmFjZS5jCit2cDgvdnA4ZHgubWsKK3ZweF9jb25maWcuYwordnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oCit2cHhfbWVtL2luY2x1ZGUvdnB4X21lbV9pbnRybmwuaAordnB4X21lbS92cHhfbWVtLmMKK3ZweF9tZW0vdnB4X21lbS5oCit2cHhfbWVtL3ZweF9tZW0ubWsKK3ZweF9wb3J0cy9hcm1fY3B1ZGV0ZWN0LmMKK3ZweF9wb3J0cy9hcm0uaAordnB4X3BvcnRzL2FzbV9vZmZzZXRzLmgKK3ZweF9wb3J0cy9tZW0uaAordnB4X3BvcnRzL3ZweF9wb3J0cy5tawordnB4X3BvcnRzL3ZweF90aW1lci5oCit2cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weWZyYW1lX2Z1bmNfbmVvbi5hc20ucwordnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlzcmNmcmFtZV9mdW5jX25lb24uYXNtLnMKK3ZweF9zY2FsZS9hcm0vbmVvbi92cDhfdnB4eXYxMl9jb3B5X3lfbmVvbi5hc20ucwordnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2V4dGVuZGZyYW1lYm9yZGVyc19uZW9uLmFzbS5zCit2cHhfc2NhbGUvYXJtL25lb24veXYxMmV4dGVuZF9hcm0uYwordnB4X3NjYWxlL2dlbmVyaWMvZ2VuX3NjYWxlcnMuYwordnB4X3NjYWxlL2dlbmVyaWMvdnB4c2NhbGUuYwordnB4X3NjYWxlL2dlbmVyaWMveXYxMmNvbmZpZy5jCit2cHhfc2NhbGUvZ2VuZXJpYy95djEyZXh0ZW5kLmMKK3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmRfZ2VuZXJpYy5oCit2cHhfc2NhbGUvc2NhbGVfbW9kZS5oCit2cHhfc2NhbGUvdnB4c2NhbGUuaAordnB4X3NjYWxlL3ZweF9zY2FsZS5tawordnB4X3NjYWxlL3l2MTJjb25maWcuaAordnB4L3NyYy92cHhfY29kZWMuYwordnB4L3NyYy92cHhfZGVjb2Rlci5jCit2cHgvc3JjL3ZweF9lbmNvZGVyLmMKK3ZweC9zcmMvdnB4X2ltYWdlLmMKK3ZweC92cDhkeC5oCit2cHgvdnA4LmgKK3ZweC92cHhfY29kZWMuaAordnB4L3ZweF9jb2RlY19pbXBsX2JvdHRvbS5oCit2cHgvdnB4X2NvZGVjX2ltcGxfdG9wLmgKK3ZweC92cHhfY29kZWMubWsKK3ZweC92cHhfZGVjb2Rlci5oCit2cHgvdnB4X2VuY29kZXIuaAordnB4L3ZweF9pbWFnZS5oCit2cHgvdnB4X2ludGVnZXIuaApkaWZmIC0tZ2l0IGEvYXJtdjdhLW5lb24vdnB4X2NvbmZpZy5jIGIvYXJtdjdhLW5lb24vdnB4X2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjhlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcm12N2EtbmVvbi92cHhfY29uZmlnLmMKQEAgLTAsMCArMSw5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAqLworLyogICovCisvKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlICovCisvKiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgKi8KKy8qIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQgKi8KKy8qIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkgKi8KKy8qIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLiAqLworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGNmZyA9ICItLWZvcmNlLXRhcmdldD1hcm12Ny1hbmRyb2lkLWdjYyAtLWRpc2FibGUtcnVudGltZS1jcHUtZGV0ZWN0IC0tc2RrLXBhdGg9L3Vzci9sb2NhbC9nb29nbGUvaG9tZS9qb2hhbm5rb2VuaWcvYW5kcm9pZC1uZGsgLS1kaXNhYmxlLXZwOC1lbmNvZGVyIC0tZGlzYWJsZS1leGFtcGxlcyAtLWRpc2FibGUtZG9jcyI7Citjb25zdCBjaGFyICp2cHhfY29kZWNfYnVpbGRfY29uZmlnKHZvaWQpIHtyZXR1cm4gY2ZnO30KZGlmZiAtLWdpdCBhL2FybXY3YS1uZW9uL3ZweF9jb25maWcuaCBiL2FybXY3YS1uZW9uL3ZweF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGVhOGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJtdjdhLW5lb24vdnB4X2NvbmZpZy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisvKiAgKi8KKy8qIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgKi8KKy8qIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSAqLworLyogdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCAqLworLyogaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSAqLworLyogYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuICovCisvKiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEgKi8KKyNpZm5kZWYgVlBYX0NPTkZJR19ICisjZGVmaW5lIFZQWF9DT05GSUdfSAorI2RlZmluZSBSRVNUUklDVCAgICAKKyNkZWZpbmUgQVJDSF9BUk0gMQorI2RlZmluZSBBUkNIX01JUFMgMAorI2RlZmluZSBBUkNIX1g4NiAwCisjZGVmaW5lIEFSQ0hfWDg2XzY0IDAKKyNkZWZpbmUgQVJDSF9QUEMzMiAwCisjZGVmaW5lIEFSQ0hfUFBDNjQgMAorI2RlZmluZSBIQVZFX0VEU1AgMQorI2RlZmluZSBIQVZFX01FRElBIDEKKyNkZWZpbmUgSEFWRV9ORU9OIDEKKyNkZWZpbmUgSEFWRV9NSVBTMzIgMAorI2RlZmluZSBIQVZFX0RTUFIyIDAKKyNkZWZpbmUgSEFWRV9NTVggMAorI2RlZmluZSBIQVZFX1NTRSAwCisjZGVmaW5lIEhBVkVfU1NFMiAwCisjZGVmaW5lIEhBVkVfU1NFMyAwCisjZGVmaW5lIEhBVkVfU1NTRTMgMAorI2RlZmluZSBIQVZFX1NTRTRfMSAwCisjZGVmaW5lIEhBVkVfQUxUSVZFQyAwCisjZGVmaW5lIEhBVkVfVlBYX1BPUlRTIDEKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZGVmaW5lIEhBVkVfQUxUX1RSRUVfTEFZT1VUIDAKKyNkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorI2RlZmluZSBIQVZFX1NZU19NTUFOX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKyNkZWZpbmUgQ09ORklHX0VYVEVSTkFMX0JVSUxEIDAKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfRE9DUyAxCisjZGVmaW5lIENPTkZJR19JTlNUQUxMX0JJTlMgMQorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9MSUJTIDEKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfU1JDUyAwCisjZGVmaW5lIENPTkZJR19ERUJVRyAwCisjZGVmaW5lIENPTkZJR19HUFJPRiAwCisjZGVmaW5lIENPTkZJR19HQ09WIDAKKyNkZWZpbmUgQ09ORklHX1JWQ1QgMAorI2RlZmluZSBDT05GSUdfR0NDIDEKKyNkZWZpbmUgQ09ORklHX01TVlMgMAorI2RlZmluZSBDT05GSUdfUElDIDEKKyNkZWZpbmUgQ09ORklHX0JJR19FTkRJQU4gMAorI2RlZmluZSBDT05GSUdfQ09ERUNfU1JDUyAwCisjZGVmaW5lIENPTkZJR19ERUJVR19MSUJTIDAKKyNkZWZpbmUgQ09ORklHX0ZBU1RfVU5BTElHTkVEIDEKKyNkZWZpbmUgQ09ORklHX01FTV9NQU5BR0VSIDAKKyNkZWZpbmUgQ09ORklHX01FTV9UUkFDS0VSIDAKKyNkZWZpbmUgQ09ORklHX01FTV9DSEVDS1MgMAorI2RlZmluZSBDT05GSUdfTUQ1IDEKKyNkZWZpbmUgQ09ORklHX0RFUVVBTlRfVE9LRU5TIDAKKyNkZWZpbmUgQ09ORklHX0RDX1JFQ09OIDAKKyNkZWZpbmUgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVCAwCisjZGVmaW5lIENPTkZJR19QT1NUUFJPQyAwCisjZGVmaW5lIENPTkZJR19NVUxUSVRIUkVBRCAxCisjZGVmaW5lIENPTkZJR19JTlRFUk5BTF9TVEFUUyAwCisjZGVmaW5lIENPTkZJR19WUDhfRU5DT0RFUiAwCisjZGVmaW5lIENPTkZJR19WUDhfREVDT0RFUiAxCisjZGVmaW5lIENPTkZJR19WUDggMQorI2RlZmluZSBDT05GSUdfRU5DT0RFUlMgMAorI2RlZmluZSBDT05GSUdfREVDT0RFUlMgMQorI2RlZmluZSBDT05GSUdfU1RBVElDX01TVkNSVCAwCisjZGVmaW5lIENPTkZJR19TUEFUSUFMX1JFU0FNUExJTkcgMQorI2RlZmluZSBDT05GSUdfUkVBTFRJTUVfT05MWSAxCisjZGVmaW5lIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HIDAKKyNkZWZpbmUgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UIDAKKyNkZWZpbmUgQ09ORklHX1NIQVJFRCAwCisjZGVmaW5lIENPTkZJR19TVEFUSUMgMQorI2RlZmluZSBDT05GSUdfU01BTEwgMAorI2RlZmluZSBDT05GSUdfUE9TVFBST0NfVklTVUFMSVpFUiAwCisjZGVmaW5lIENPTkZJR19PU19TVVBQT1JUIDEKKyNkZWZpbmUgQ09ORklHX1VOSVRfVEVTVFMgMAorI2RlZmluZSBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HIDAKKyNkZWZpbmUgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORyAxCisjZW5kaWYgLyogVlBYX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9hcm12N2EtbmVvbi92cHhfcnRjZC5oIGIvYXJtdjdhLW5lb24vdnB4X3J0Y2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVmNDQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJtdjdhLW5lb24vdnB4X3J0Y2QuaApAQCAtMCwwICsxLDM3OSBAQAorI2lmbmRlZiBWUFhfUlRDRF8KKyNkZWZpbmUgVlBYX1JUQ0RfCisKKyNpZmRlZiBSVENEX0MKKyNkZWZpbmUgUlRDRF9FWFRFUk4KKyNlbHNlCisjZGVmaW5lIFJUQ0RfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorCitzdHJ1Y3QgYmxvY2tkOworc3RydWN0IG1hY3JvYmxvY2tkOworc3RydWN0IGxvb3BfZmlsdGVyX2luZm87CisKKy8qIEVuY29kZXIgZm9yd2FyZCBkZWNscyAqLworc3RydWN0IGJsb2NrOworc3RydWN0IG1hY3JvYmxvY2s7CitzdHJ1Y3QgdmFyaWFuY2VfdnRhYmxlOwordW5pb24gaW50X212Oworc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZzsKKwordm9pZCB2cDhfZGVxdWFudGl6ZV9iX2Moc3RydWN0IGJsb2NrZCosIHNob3J0ICpkcWMpOwordm9pZCB2cDhfZGVxdWFudGl6ZV9iX3Y2KHN0cnVjdCBibG9ja2QqLCBzaG9ydCAqZHFjKTsKK3ZvaWQgdnA4X2RlcXVhbnRpemVfYl9uZW9uKHN0cnVjdCBibG9ja2QqLCBzaG9ydCAqZHFjKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRpemVfYiB2cDhfZGVxdWFudGl6ZV9iX25lb24KKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBzdHJpZGUpOwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF92NihzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgc3RyaWRlKTsKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbmVvbihzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbmVvbgorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYyhzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpOwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX3Y2KHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSwgY2hhciAqZW9icyk7Cit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfbmVvbihzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpOworI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfbmVvbgorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2Moc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIHVuc2lnbmVkIGNoYXIgKmRzdF92LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfdjYoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIHVuc2lnbmVkIGNoYXIgKmRzdF92LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfbmVvbihzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpkc3RfdSwgdW5zaWduZWQgY2hhciAqZHN0X3YsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpOworI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19uZW9uCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9hcm12Nih1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZfbmVvbih1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9tYnYgdnA4X2xvb3BfZmlsdGVyX21idl9uZW9uCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X2ModW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfbmVvbih1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9idiB2cDhfbG9vcF9maWx0ZXJfYnZfbmVvbgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhfYyh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX25lb24odW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfbWJoIHZwOF9sb29wX2ZpbHRlcl9tYmhfbmVvbgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoX2FybXY2KHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoX25lb24odW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfYmggdnA4X2xvb3BfZmlsdGVyX2JoX25lb24KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYyh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2FybXY2KHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2c19uZW9uKHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21idiB2cDhfbG9vcF9maWx0ZXJfbWJ2c19uZW9uCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYyh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhzX25lb24odW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoIHZwOF9sb29wX2ZpbHRlcl9tYmhzX25lb24KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idnNfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idnNfbmVvbih1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9idiB2cDhfbG9vcF9maWx0ZXJfYnZzX25lb24KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhzX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaHNfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaHNfbmVvbih1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaCB2cDhfbG9vcF9maWx0ZXJfYmhzX25lb24KKwordm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV9jKHNob3J0ICppbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHBpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlKTsKK3ZvaWQgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fdjZfZHVhbChzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwaXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7Cit2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX25lb24oc2hvcnQgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOworI2RlZmluZSB2cDhfc2hvcnRfaWRjdDR4NGxsbSB2cDhfc2hvcnRfaWRjdDR4NGxsbV9uZW9uCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKKyNkZWZpbmUgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9jCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCk7Cit2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9uZW9uKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCk7CisjZGVmaW5lIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9uZW9uCisKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyhzaG9ydCBpbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHByZWRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlKTsKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYoc2hvcnQgaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwcmVkX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7Cit2b2lkIHZwOF9kY19vbmx5X2lkY3RfYWRkX25lb24oc2hvcnQgaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwcmVkX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7CisjZGVmaW5lIHZwOF9kY19vbmx5X2lkY3RfYWRkIHZwOF9kY19vbmx5X2lkY3RfYWRkX25lb24KKwordm9pZCB2cDhfY29weV9tZW0xNngxNl9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2NvcHlfbWVtMTZ4MTZfdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfY29weV9tZW0xNngxNl9uZW9uKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2NvcHlfbWVtMTZ4MTYgdnA4X2NvcHlfbWVtMTZ4MTZfbmVvbgorCit2b2lkIHZwOF9jb3B5X21lbTh4OF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2NvcHlfbWVtOHg4X3Y2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2NvcHlfbWVtOHg4X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfY29weV9tZW04eDggdnA4X2NvcHlfbWVtOHg4X25lb24KKwordm9pZCB2cDhfY29weV9tZW04eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9jb3B5X21lbTh4NF92Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9jb3B5X21lbTh4NF9uZW9uKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2NvcHlfbWVtOHg0IHZwOF9jb3B5X21lbTh4NF9uZW9uCisKK3ZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfYyhzdHJ1Y3QgbWFjcm9ibG9ja2QgKngsIHVuc2lnbmVkIGNoYXIgKiB5YWJvdmVfcm93LCB1bnNpZ25lZCBjaGFyICogeWxlZnQsIGludCBsZWZ0X3N0cmlkZSwgdW5zaWduZWQgY2hhciAqIHlwcmVkX3B0ciwgaW50IHlfc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfYworCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfc19jKHN0cnVjdCBtYWNyb2Jsb2NrZCAqeCwgdW5zaWduZWQgY2hhciAqIHVhYm92ZV9yb3csIHVuc2lnbmVkIGNoYXIgKiB2YWJvdmVfcm93LCAgdW5zaWduZWQgY2hhciAqdWxlZnQsIHVuc2lnbmVkIGNoYXIgKnZsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKiB1cHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKiB2cHJlZF9wdHIsIGludCBwcmVkX3N0cmlkZSk7CisjZGVmaW5lIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcyB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3NfYworCit2b2lkIHZwOF9pbnRyYTR4NF9wcmVkaWN0X2ModW5zaWduZWQgY2hhciAqQWJvdmUsIHVuc2lnbmVkIGNoYXIgKnlsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIEJfUFJFRElDVElPTl9NT0RFIGJfbW9kZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgdW5zaWduZWQgY2hhciB0b3BfbGVmdCk7Cit2b2lkIHZwOF9pbnRyYTR4NF9wcmVkaWN0X2FybXY2KHVuc2lnbmVkIGNoYXIgKkFib3ZlLCB1bnNpZ25lZCBjaGFyICp5bGVmdCwgaW50IGxlZnRfc3RyaWRlLCBCX1BSRURJQ1RJT05fTU9ERSBiX21vZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgdG9wX2xlZnQpOworI2RlZmluZSB2cDhfaW50cmE0eDRfcHJlZGljdCB2cDhfaW50cmE0eDRfcHJlZGljdF9hcm12NgorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYXJtdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfbmVvbih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9uZW9uCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2FybXY2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9uZW9uKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9zaXh0YXBfcHJlZGljdDh4OCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfbmVvbgorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9hcm12Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbmVvbih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X25lb24KKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYXJtdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0NHg0X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X3NpeHRhcF9wcmVkaWN0NHg0IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9uZW9uCisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYXJtdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9uZW9uKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTYgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9uZW9uCisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9hcm12Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9uZW9uKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X25lb24KKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2FybXY2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfbmVvbgorCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYXJtdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfbmVvbih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9uZW9uCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U0eDRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZTR4NCB2cDhfdmFyaWFuY2U0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4OF9hcm12Nihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHg4X25lb24oY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U4eDggdnA4X3ZhcmlhbmNlOHg4X25lb24KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHgxNl9uZW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlOHgxNiB2cDhfdmFyaWFuY2U4eDE2X25lb24KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OF9uZW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlMTZ4OCB2cDhfdmFyaWFuY2UxNng4X25lb24KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNngxNl9uZW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlMTZ4MTYgdnA4X3ZhcmlhbmNlMTZ4MTZfbmVvbgorCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDggdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9uCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2MKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDggdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYXJtdjYoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbihjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9uZW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9uZW9uCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbgorCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X25lb24oY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfbmVvbgorCit1bnNpZ25lZCBpbnQgdnA4X3NhZDR4NF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOwordW5zaWduZWQgaW50IHZwOF9zYWQ0eDRfbmVvbihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDR4NCB2cDhfc2FkNHg0X25lb24KKwordW5zaWduZWQgaW50IHZwOF9zYWQ4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKK3Vuc2lnbmVkIGludCB2cDhfc2FkOHg4X25lb24oY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQ4eDggdnA4X3NhZDh4OF9uZW9uCisKK3Vuc2lnbmVkIGludCB2cDhfc2FkOHgxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOwordW5zaWduZWQgaW50IHZwOF9zYWQ4eDE2X25lb24oY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2IHZwOF9zYWQ4eDE2X25lb24KKwordW5zaWduZWQgaW50IHZwOF9zYWQxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7Cit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDhfbmVvbihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDE2eDggdnA4X3NhZDE2eDhfbmVvbgorCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7Cit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOwordW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl9uZW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkMTZ4MTYgdnA4X3NhZDE2eDE2X25lb24KKwordm9pZCB2cDhfc2FkNHg0eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ0eDR4MyB2cDhfc2FkNHg0eDNfYworCit2b2lkIHZwOF9zYWQ4eDh4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4OHgzIHZwOF9zYWQ4eDh4M19jCisKK3ZvaWQgdnA4X3NhZDh4MTZ4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4MTZ4MyB2cDhfc2FkOHgxNngzX2MKKwordm9pZCB2cDhfc2FkMTZ4OHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4OHgzIHZwOF9zYWQxNng4eDNfYworCit2b2lkIHZwOF9zYWQxNngxNngzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4MTZ4MyB2cDhfc2FkMTZ4MTZ4M19jCisKK3ZvaWQgdnA4X3NhZDR4NHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ0eDR4OCB2cDhfc2FkNHg0eDhfYworCit2b2lkIHZwOF9zYWQ4eDh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHg4eDggdnA4X3NhZDh4OHg4X2MKKwordm9pZCB2cDhfc2FkOHgxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2eDggdnA4X3NhZDh4MTZ4OF9jCisKK3ZvaWQgdnA4X3NhZDE2eDh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4OHg4IHZwOF9zYWQxNng4eDhfYworCit2b2lkIHZwOF9zYWQxNngxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNngxNng4IHZwOF9zYWQxNngxNng4X2MKKwordm9pZCB2cDhfc2FkNHg0eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkNHg0eDRkIHZwOF9zYWQ0eDR4NGRfYworCit2b2lkIHZwOF9zYWQ4eDh4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDh4NGQgdnA4X3NhZDh4OHg0ZF9jCisKK3ZvaWQgdnA4X3NhZDh4MTZ4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2eDRkIHZwOF9zYWQ4eDE2eDRkX2MKKwordm9pZCB2cDhfc2FkMTZ4OHg0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDh4NGQgdnA4X3NhZDE2eDh4NGRfYworCit2b2lkIHZwOF9zYWQxNngxNng0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDE2eDRkIHZwOF9zYWQxNngxNng0ZF9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2kgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYworCit2b2lkIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqeWJmKTsKK3ZvaWQgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbihzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICp5YmYpOworI2RlZmluZSB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19uZW9uCisKK3ZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV9jKHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnNyY195YmMsIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMpOwordm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX25lb24oc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyk7CisjZGVmaW5lIHZwOF95djEyX2NvcHlfZnJhbWUgdnA4X3l2MTJfY29weV9mcmFtZV9uZW9uCisKK3ZvaWQgdnA4X3l2MTJfY29weV95X2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyk7Cit2b2lkIHZwOF95djEyX2NvcHlfeV9uZW9uKHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnNyY195YmMsIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMpOworI2RlZmluZSB2cDhfeXYxMl9jb3B5X3kgdnA4X3l2MTJfY29weV95X25lb24KKwordm9pZCB2cHhfcnRjZCh2b2lkKTsKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKKyNpZmRlZiBSVENEX0MKKyNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCitzdGF0aWMgdm9pZCBzZXR1cF9ydGNkX2ludGVybmFsKHZvaWQpCit7CisgICAgaW50IGZsYWdzID0gYXJtX2NwdV9jYXBzKCk7CisKKyAgICAodm9pZClmbGFnczsKKworCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJtdjdhLW5lb24vdnB4X3ZlcnNpb24uaCBiL2FybXY3YS1uZW9uL3ZweF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzZGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2FybXY3YS1uZW9uL3ZweF92ZXJzaW9uLmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIFZFUlNJT05fTUFKT1IgIDEKKyNkZWZpbmUgVkVSU0lPTl9NSU5PUiAgMQorI2RlZmluZSBWRVJTSU9OX1BBVENIICAwCisjZGVmaW5lIFZFUlNJT05fRVhUUkEgICIiCisjZGVmaW5lIFZFUlNJT05fUEFDS0VEICgoVkVSU0lPTl9NQUpPUjw8MTYpfChWRVJTSU9OX01JTk9SPDw4KXwoVkVSU0lPTl9QQVRDSCkpCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HX05PU1AgInYxLjEuMCIKKyNkZWZpbmUgVkVSU0lPTl9TVFJJTkcgICAgICAiIHYxLjEuMCIKZGlmZiAtLWdpdCBhL2FybXY3YS9saWJ2cHhfc3Jjcy50eHQgYi9hcm12N2EvbGlidnB4X3NyY3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDUxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcm12N2EvbGlidnB4X3NyY3MudHh0CkBAIC0wLDAgKzEsMTQzIEBACitidWlsZC9tYWtlL3J0Y2Quc2gKK2J1aWxkL21ha2UvdmVyc2lvbi5zaAorQ0hBTkdFTE9HCitsaWJzLm1rCit2cDgvY29tbW9uL2FsbG9jY29tbW9uLmMKK3ZwOC9jb21tb24vYWxsb2Njb21tb24uaAordnA4L2NvbW1vbi9hcm0vYXJtdjYvYmlsaW5lYXJmaWx0ZXJfdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW0xNngxNl92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTh4NF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTh4OF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvZGNfb25seV9pZGN0X2FkZF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvZGVxdWFudF9pZGN0X3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9kZXF1YW50aXplX3Y2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni9maWx0ZXJfdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2lkY3RfYmxrX3Y2LmMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2lkY3RfdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2ludHJhNHg0X3ByZWRpY3RfdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L2l3YWxzaF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvbG9vcGZpbHRlcl92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvc2ltcGxlbG9vcGZpbHRlcl92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvc2l4dGFwcHJlZGljdDh4NF92Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3NhZDE2eDE2X2FybXY2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2UxNngxNl9hcm12Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlOHg4X2FybXY2LmFzbS5zCit2cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjYuYXNtLnMKK3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9hcm12Ni5hc20ucwordnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmMKK3ZwOC9jb21tb24vYXJtL2JpbGluZWFyZmlsdGVyX2FybS5oCit2cDgvY29tbW9uL2FybS9kZXF1YW50aXplX2FybS5jCit2cDgvY29tbW9uL2FybS9maWx0ZXJfYXJtLmMKK3ZwOC9jb21tb24vYXJtL2xvb3BmaWx0ZXJfYXJtLmMKK3ZwOC9jb21tb24vYXJtL3JlY29uaW50cmFfYXJtLmMKK3ZwOC9jb21tb24vYXJtL3ZhcmlhbmNlX2FybS5jCit2cDgvY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jCit2cDgvY29tbW9uL2Jsb2NrZC5jCit2cDgvY29tbW9uL2Jsb2NrZC5oCit2cDgvY29tbW9uL2NvZWZ1cGRhdGVwcm9icy5oCit2cDgvY29tbW9uL2NvbW1vbi5oCit2cDgvY29tbW9uL2RlYnVnbW9kZXMuYwordnA4L2NvbW1vbi9kZWZhdWx0X2NvZWZfcHJvYnMuaAordnA4L2NvbW1vbi9kZXF1YW50aXplLmMKK3ZwOC9jb21tb24vZW50cm9weS5jCit2cDgvY29tbW9uL2VudHJvcHkuaAordnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5jCit2cDgvY29tbW9uL2VudHJvcHltb2RlLmgKK3ZwOC9jb21tb24vZW50cm9weW12LmMKK3ZwOC9jb21tb24vZW50cm9weW12LmgKK3ZwOC9jb21tb24vZXh0ZW5kLmMKK3ZwOC9jb21tb24vZXh0ZW5kLmgKK3ZwOC9jb21tb24vZmlsdGVyLmMKK3ZwOC9jb21tb24vZmlsdGVyLmgKK3ZwOC9jb21tb24vZmluZG5lYXJtdi5jCit2cDgvY29tbW9uL2ZpbmRuZWFybXYuaAordnA4L2NvbW1vbi9nZW5lcmljL3N5c3RlbWRlcGVuZGVudC5jCit2cDgvY29tbW9uL2hlYWRlci5oCit2cDgvY29tbW9uL2lkY3RfYmxrLmMKK3ZwOC9jb21tb24vaWRjdGxsbS5jCit2cDgvY29tbW9uL2ludnRyYW5zLmgKK3ZwOC9jb21tb24vbG9vcGZpbHRlci5jCit2cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jCit2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaAordnA4L2NvbW1vbi9tYnBpdGNoLmMKK3ZwOC9jb21tb24vbW9kZWNvbnQuYwordnA4L2NvbW1vbi9tb2RlY29udC5oCit2cDgvY29tbW9uL212LmgKK3ZwOC9jb21tb24vb255eGNfaW50LmgKK3ZwOC9jb21tb24vb255eGQuaAordnA4L2NvbW1vbi9vbnl4LmgKK3ZwOC9jb21tb24vcHBmbGFncy5oCit2cDgvY29tbW9uL3ByYWdtYXMuaAordnA4L2NvbW1vbi9xdWFudF9jb21tb24uYwordnA4L2NvbW1vbi9xdWFudF9jb21tb24uaAordnA4L2NvbW1vbi9yZWNvbmludGVyLmMKK3ZwOC9jb21tb24vcmVjb25pbnRlci5oCit2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuYwordnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmgKK3ZwOC9jb21tb24vcmVjb25pbnRyYS5jCit2cDgvY29tbW9uL3J0Y2QuYwordnA4L2NvbW1vbi9ydGNkX2RlZnMuc2gKK3ZwOC9jb21tb24vc2FkX2MuYwordnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uYwordnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaAordnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5jCit2cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmgKK3ZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgKK3ZwOC9jb21tb24vdGhyZWFkaW5nLmgKK3ZwOC9jb21tb24vdHJlZWNvZGVyLmMKK3ZwOC9jb21tb24vdHJlZWNvZGVyLmgKK3ZwOC9jb21tb24vdmFyaWFuY2VfYy5jCit2cDgvY29tbW9uL3ZhcmlhbmNlLmgKK3ZwOC9jb21tb24vdnA4X2VudHJvcHltb2RlZGF0YS5oCit2cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYwordnA4L2RlY29kZXIvZGJvb2xodWZmLmMKK3ZwOC9kZWNvZGVyL2Rib29saHVmZi5oCit2cDgvZGVjb2Rlci9kZWNvZGVtdi5jCit2cDgvZGVjb2Rlci9kZWNvZGVtdi5oCit2cDgvZGVjb2Rlci9kZWNvZGVydGhyZWFkaW5nLmgKK3ZwOC9kZWNvZGVyL2RlY29kZnJhbWUuYwordnA4L2RlY29kZXIvZGV0b2tlbml6ZS5jCit2cDgvZGVjb2Rlci9kZXRva2VuaXplLmgKK3ZwOC9kZWNvZGVyL29ueXhkX2lmLmMKK3ZwOC9kZWNvZGVyL29ueXhkX2ludC5oCit2cDgvZGVjb2Rlci90aHJlYWRpbmcuYwordnA4L2RlY29kZXIvdHJlZXJlYWRlci5oCit2cDgvdnA4X2NvbW1vbi5tawordnA4L3ZwOF9keF9pZmFjZS5jCit2cDgvdnA4ZHgubWsKK3ZweF9jb25maWcuYwordnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oCit2cHhfbWVtL2luY2x1ZGUvdnB4X21lbV9pbnRybmwuaAordnB4X21lbS92cHhfbWVtLmMKK3ZweF9tZW0vdnB4X21lbS5oCit2cHhfbWVtL3ZweF9tZW0ubWsKK3ZweF9wb3J0cy9hcm1fY3B1ZGV0ZWN0LmMKK3ZweF9wb3J0cy9hcm0uaAordnB4X3BvcnRzL2FzbV9vZmZzZXRzLmgKK3ZweF9wb3J0cy9tZW0uaAordnB4X3BvcnRzL3ZweF9wb3J0cy5tawordnB4X3BvcnRzL3ZweF90aW1lci5oCit2cHhfc2NhbGUvZ2VuZXJpYy9nZW5fc2NhbGVycy5jCit2cHhfc2NhbGUvZ2VuZXJpYy92cHhzY2FsZS5jCit2cHhfc2NhbGUvZ2VuZXJpYy95djEyY29uZmlnLmMKK3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmQuYwordnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZF9nZW5lcmljLmgKK3ZweF9zY2FsZS9zY2FsZV9tb2RlLmgKK3ZweF9zY2FsZS92cHhzY2FsZS5oCit2cHhfc2NhbGUvdnB4X3NjYWxlLm1rCit2cHhfc2NhbGUveXYxMmNvbmZpZy5oCit2cHgvc3JjL3ZweF9jb2RlYy5jCit2cHgvc3JjL3ZweF9kZWNvZGVyLmMKK3ZweC9zcmMvdnB4X2VuY29kZXIuYwordnB4L3NyYy92cHhfaW1hZ2UuYwordnB4L3ZwOGR4LmgKK3ZweC92cDguaAordnB4L3ZweF9jb2RlYy5oCit2cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgKK3ZweC92cHhfY29kZWNfaW1wbF90b3AuaAordnB4L3ZweF9jb2RlYy5tawordnB4L3ZweF9kZWNvZGVyLmgKK3ZweC92cHhfZW5jb2Rlci5oCit2cHgvdnB4X2ltYWdlLmgKK3ZweC92cHhfaW50ZWdlci5oCmRpZmYgLS1naXQgYS9hcm12N2EvdnB4X2NvbmZpZy5jIGIvYXJtdjdhL3ZweF9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY0MzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJtdjdhL3ZweF9jb25maWcuYwpAQCAtMCwwICsxLDkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisvKiAgKi8KKy8qIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgKi8KKy8qIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSAqLworLyogdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCAqLworLyogaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSAqLworLyogYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuICovCitzdGF0aWMgY29uc3QgY2hhciogY29uc3QgY2ZnID0gIi0tZm9yY2UtdGFyZ2V0PWFybXY3LWFuZHJvaWQtZ2NjIC0tZGlzYWJsZS1ydW50aW1lLWNwdS1kZXRlY3QgLS1zZGstcGF0aD0vdXNyL2xvY2FsL2dvb2dsZS9ob21lL2pvaGFubmtvZW5pZy9hbmRyb2lkLW5kayAtLWRpc2FibGUtdnA4LWVuY29kZXIgLS1kaXNhYmxlLWV4YW1wbGVzIC0tZGlzYWJsZS1kb2NzIC0tZGlzYWJsZS1uZW9uIjsKK2NvbnN0IGNoYXIgKnZweF9jb2RlY19idWlsZF9jb25maWcodm9pZCkge3JldHVybiBjZmc7fQpkaWZmIC0tZ2l0IGEvYXJtdjdhL3ZweF9jb25maWcuaCBiL2FybXY3YS92cHhfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiNzVjMgotLS0gL2Rldi9udWxsCisrKyBiL2FybXY3YS92cHhfY29uZmlnLmgKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gKi8KKy8qICAqLworLyogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSAqLworLyogdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlICovCisvKiB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kICovCisvKiBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5ICovCisvKiBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4gKi8KKy8qIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIG5vdCBlZGl0ISAqLworI2lmbmRlZiBWUFhfQ09ORklHX0gKKyNkZWZpbmUgVlBYX0NPTkZJR19ICisjZGVmaW5lIFJFU1RSSUNUICAgIAorI2RlZmluZSBBUkNIX0FSTSAxCisjZGVmaW5lIEFSQ0hfTUlQUyAwCisjZGVmaW5lIEFSQ0hfWDg2IDAKKyNkZWZpbmUgQVJDSF9YODZfNjQgMAorI2RlZmluZSBBUkNIX1BQQzMyIDAKKyNkZWZpbmUgQVJDSF9QUEM2NCAwCisjZGVmaW5lIEhBVkVfRURTUCAxCisjZGVmaW5lIEhBVkVfTUVESUEgMQorI2RlZmluZSBIQVZFX05FT04gMAorI2RlZmluZSBIQVZFX01JUFMzMiAwCisjZGVmaW5lIEhBVkVfRFNQUjIgMAorI2RlZmluZSBIQVZFX01NWCAwCisjZGVmaW5lIEhBVkVfU1NFIDAKKyNkZWZpbmUgSEFWRV9TU0UyIDAKKyNkZWZpbmUgSEFWRV9TU0UzIDAKKyNkZWZpbmUgSEFWRV9TU1NFMyAwCisjZGVmaW5lIEhBVkVfU1NFNF8xIDAKKyNkZWZpbmUgSEFWRV9BTFRJVkVDIDAKKyNkZWZpbmUgSEFWRV9WUFhfUE9SVFMgMQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNkZWZpbmUgSEFWRV9BTFRfVFJFRV9MQVlPVVQgMAorI2RlZmluZSBIQVZFX1BUSFJFQURfSCAxCisjZGVmaW5lIEhBVkVfU1lTX01NQU5fSCAxCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorI2RlZmluZSBDT05GSUdfRVhURVJOQUxfQlVJTEQgMAorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9ET0NTIDEKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfQklOUyAxCisjZGVmaW5lIENPTkZJR19JTlNUQUxMX0xJQlMgMQorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9TUkNTIDAKKyNkZWZpbmUgQ09ORklHX0RFQlVHIDAKKyNkZWZpbmUgQ09ORklHX0dQUk9GIDAKKyNkZWZpbmUgQ09ORklHX0dDT1YgMAorI2RlZmluZSBDT05GSUdfUlZDVCAwCisjZGVmaW5lIENPTkZJR19HQ0MgMQorI2RlZmluZSBDT05GSUdfTVNWUyAwCisjZGVmaW5lIENPTkZJR19QSUMgMQorI2RlZmluZSBDT05GSUdfQklHX0VORElBTiAwCisjZGVmaW5lIENPTkZJR19DT0RFQ19TUkNTIDAKKyNkZWZpbmUgQ09ORklHX0RFQlVHX0xJQlMgMAorI2RlZmluZSBDT05GSUdfRkFTVF9VTkFMSUdORUQgMQorI2RlZmluZSBDT05GSUdfTUVNX01BTkFHRVIgMAorI2RlZmluZSBDT05GSUdfTUVNX1RSQUNLRVIgMAorI2RlZmluZSBDT05GSUdfTUVNX0NIRUNLUyAwCisjZGVmaW5lIENPTkZJR19NRDUgMQorI2RlZmluZSBDT05GSUdfREVRVUFOVF9UT0tFTlMgMAorI2RlZmluZSBDT05GSUdfRENfUkVDT04gMAorI2RlZmluZSBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUIDAKKyNkZWZpbmUgQ09ORklHX1BPU1RQUk9DIDAKKyNkZWZpbmUgQ09ORklHX01VTFRJVEhSRUFEIDEKKyNkZWZpbmUgQ09ORklHX0lOVEVSTkFMX1NUQVRTIDAKKyNkZWZpbmUgQ09ORklHX1ZQOF9FTkNPREVSIDAKKyNkZWZpbmUgQ09ORklHX1ZQOF9ERUNPREVSIDEKKyNkZWZpbmUgQ09ORklHX1ZQOCAxCisjZGVmaW5lIENPTkZJR19FTkNPREVSUyAwCisjZGVmaW5lIENPTkZJR19ERUNPREVSUyAxCisjZGVmaW5lIENPTkZJR19TVEFUSUNfTVNWQ1JUIDAKKyNkZWZpbmUgQ09ORklHX1NQQVRJQUxfUkVTQU1QTElORyAxCisjZGVmaW5lIENPTkZJR19SRUFMVElNRV9PTkxZIDEKKyNkZWZpbmUgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcgMAorI2RlZmluZSBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQgMAorI2RlZmluZSBDT05GSUdfU0hBUkVEIDAKKyNkZWZpbmUgQ09ORklHX1NUQVRJQyAxCisjZGVmaW5lIENPTkZJR19TTUFMTCAwCisjZGVmaW5lIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSIDAKKyNkZWZpbmUgQ09ORklHX09TX1NVUFBPUlQgMQorI2RlZmluZSBDT05GSUdfVU5JVF9URVNUUyAwCisjZGVmaW5lIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcgMAorI2RlZmluZSBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HIDEKKyNlbmRpZiAvKiBWUFhfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2FybXY3YS92cHhfcnRjZC5oIGIvYXJtdjdhL3ZweF9ydGNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliOTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2FybXY3YS92cHhfcnRjZC5oCkBAIC0wLDAgKzEsMzM2IEBACisjaWZuZGVmIFZQWF9SVENEXworI2RlZmluZSBWUFhfUlRDRF8KKworI2lmZGVmIFJUQ0RfQworI2RlZmluZSBSVENEX0VYVEVSTgorI2Vsc2UKKyNkZWZpbmUgUlRDRF9FWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCisKK3N0cnVjdCBibG9ja2Q7CitzdHJ1Y3QgbWFjcm9ibG9ja2Q7CitzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbzsKKworLyogRW5jb2RlciBmb3J3YXJkIGRlY2xzICovCitzdHJ1Y3QgYmxvY2s7CitzdHJ1Y3QgbWFjcm9ibG9jazsKK3N0cnVjdCB2YXJpYW5jZV92dGFibGU7Cit1bmlvbiBpbnRfbXY7CitzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnOworCit2b2lkIHZwOF9kZXF1YW50aXplX2JfYyhzdHJ1Y3QgYmxvY2tkKiwgc2hvcnQgKmRxYyk7Cit2b2lkIHZwOF9kZXF1YW50aXplX2JfdjYoc3RydWN0IGJsb2NrZCosIHNob3J0ICpkcWMpOworI2RlZmluZSB2cDhfZGVxdWFudGl6ZV9iIHZwOF9kZXF1YW50aXplX2JfdjYKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBzdHJpZGUpOwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF92NihzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2Moc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja192NihzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpOworI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfdjYKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19jKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKmRzdF91LCB1bnNpZ25lZCBjaGFyICpkc3RfdiwgaW50IHN0cmlkZSwgY2hhciAqZW9icyk7Cit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX3Y2KHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKmRzdF91LCB1bnNpZ25lZCBjaGFyICpkc3RfdiwgaW50IHN0cmlkZSwgY2hhciAqZW9icyk7CisjZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX3Y2CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9hcm12Nih1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9tYnYgdnA4X2xvb3BfZmlsdGVyX21idl9hcm12NgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idl9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X2FybXY2KHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX2J2IHZwOF9sb29wX2ZpbHRlcl9idl9hcm12NgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhfYyh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfbWJoIHZwOF9sb29wX2ZpbHRlcl9tYmhfYXJtdjYKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfYyh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9hcm12Nih1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9iaCB2cDhfbG9vcF9maWx0ZXJfYmhfYXJtdjYKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYyh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2FybXY2KHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21idiB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjYKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9jKHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12Nih1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYmggdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYXJtdjYKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idnNfYXJtdjYodW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnYgdnA4X2xvb3BfZmlsdGVyX2J2c19hcm12NgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaHNfYyh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2Joc19hcm12Nih1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaCB2cDhfbG9vcF9maWx0ZXJfYmhzX2FybXY2CisKK3ZvaWQgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYyhzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwaXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7Cit2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX3Y2X2R1YWwoc2hvcnQgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOworI2RlZmluZSB2cDhfc2hvcnRfaWRjdDR4NGxsbSB2cDhfc2hvcnRfaWRjdDR4NGxsbV92Nl9kdWFsCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKKyNkZWZpbmUgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9jCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCk7Cit2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKKyNkZWZpbmUgdnA4X3Nob3J0X2ludl93YWxzaDR4NCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X3Y2CisKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyhzaG9ydCBpbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHByZWRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlKTsKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYoc2hvcnQgaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwcmVkX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7CisjZGVmaW5lIHZwOF9kY19vbmx5X2lkY3RfYWRkIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2CisKK3ZvaWQgdnA4X2NvcHlfbWVtMTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9jb3B5X21lbTE2eDE2X3Y2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2NvcHlfbWVtMTZ4MTYgdnA4X2NvcHlfbWVtMTZ4MTZfdjYKKwordm9pZCB2cDhfY29weV9tZW04eDhfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9jb3B5X21lbTh4OF92Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9jb3B5X21lbTh4OCB2cDhfY29weV9tZW04eDhfdjYKKwordm9pZCB2cDhfY29weV9tZW04eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9jb3B5X21lbTh4NF92Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9jb3B5X21lbTh4NCB2cDhfY29weV9tZW04eDRfdjYKKwordm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19jKHN0cnVjdCBtYWNyb2Jsb2NrZCAqeCwgdW5zaWduZWQgY2hhciAqIHlhYm92ZV9yb3csIHVuc2lnbmVkIGNoYXIgKiB5bGVmdCwgaW50IGxlZnRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICogeXByZWRfcHRyLCBpbnQgeV9zdHJpZGUpOworI2RlZmluZSB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19jCisKK3ZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zX2Moc3RydWN0IG1hY3JvYmxvY2tkICp4LCB1bnNpZ25lZCBjaGFyICogdWFib3ZlX3JvdywgdW5zaWduZWQgY2hhciAqIHZhYm92ZV9yb3csICB1bnNpZ25lZCBjaGFyICp1bGVmdCwgdW5zaWduZWQgY2hhciAqdmxlZnQsIGludCBsZWZ0X3N0cmlkZSwgdW5zaWduZWQgY2hhciAqIHVwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqIHZwcmVkX3B0ciwgaW50IHByZWRfc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfc19jCisKK3ZvaWQgdnA4X2ludHJhNHg0X3ByZWRpY3RfYyh1bnNpZ25lZCBjaGFyICpBYm92ZSwgdW5zaWduZWQgY2hhciAqeWxlZnQsIGludCBsZWZ0X3N0cmlkZSwgQl9QUkVESUNUSU9OX01PREUgYl9tb2RlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLCB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0KTsKK3ZvaWQgdnA4X2ludHJhNHg0X3ByZWRpY3RfYXJtdjYodW5zaWduZWQgY2hhciAqQWJvdmUsIHVuc2lnbmVkIGNoYXIgKnlsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIEJfUFJFRElDVElPTl9NT0RFIGJfbW9kZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgdW5zaWduZWQgY2hhciB0b3BfbGVmdCk7CisjZGVmaW5lIHZwOF9pbnRyYTR4NF9wcmVkaWN0IHZwOF9pbnRyYTR4NF9wcmVkaWN0X2FybXY2CisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9hcm12Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9hcm12NgorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9hcm12Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDggdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2FybXY2CisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2FybXY2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9zaXh0YXBfcHJlZGljdDh4NCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYXJtdjYKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYXJtdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X3NpeHRhcF9wcmVkaWN0NHg0IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9hcm12NgorCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2FybXY2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTYgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9hcm12NgorCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYXJtdjYodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDggdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYXJtdjYKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2FybXY2KHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2FybXY2CisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9hcm12Nih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9hcm12NgorCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlNHg0X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U0eDQgdnA4X3ZhcmlhbmNlNHg0X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDhfYXJtdjYoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U4eDggdnA4X3ZhcmlhbmNlOHg4X2FybXY2CisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U4eDE2IHZwOF92YXJpYW5jZTh4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlMTZ4OCB2cDhfdmFyaWFuY2UxNng4X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlMTZ4MTYgdnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9hcm12Nihjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYXJtdjYKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9hcm12Nihjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2FybXY2CisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9hcm12NgorCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9hcm12Nihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7Cit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12Nihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12NgorCit1bnNpZ25lZCBpbnQgdnA4X3NhZDR4NF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkNHg0IHZwOF9zYWQ0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkOHg4IHZwOF9zYWQ4eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDh4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDh4MTYgdnA4X3NhZDh4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDE2eDggdnA4X3NhZDE2eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7Cit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X2FybXY2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkMTZ4MTYgdnA4X3NhZDE2eDE2X2FybXY2CisKK3ZvaWQgdnA4X3NhZDR4NHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkNHg0eDMgdnA4X3NhZDR4NHgzX2MKKwordm9pZCB2cDhfc2FkOHg4eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDh4MyB2cDhfc2FkOHg4eDNfYworCit2b2lkIHZwOF9zYWQ4eDE2eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2eDMgdnA4X3NhZDh4MTZ4M19jCisKK3ZvaWQgdnA4X3NhZDE2eDh4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDh4MyB2cDhfc2FkMTZ4OHgzX2MKKwordm9pZCB2cDhfc2FkMTZ4MTZ4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDE2eDMgdnA4X3NhZDE2eDE2eDNfYworCit2b2lkIHZwOF9zYWQ0eDR4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkNHg0eDggdnA4X3NhZDR4NHg4X2MKKwordm9pZCB2cDhfc2FkOHg4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4OHg4IHZwOF9zYWQ4eDh4OF9jCisKK3ZvaWQgdnA4X3NhZDh4MTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHgxNng4IHZwOF9zYWQ4eDE2eDhfYworCit2b2lkIHZwOF9zYWQxNng4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDh4OCB2cDhfc2FkMTZ4OHg4X2MKKwordm9pZCB2cDhfc2FkMTZ4MTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4MTZ4OCB2cDhfc2FkMTZ4MTZ4OF9jCisKK3ZvaWQgdnA4X3NhZDR4NHg0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDR4NHg0ZCB2cDhfc2FkNHg0eDRkX2MKKwordm9pZCB2cDhfc2FkOHg4eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHg4eDRkIHZwOF9zYWQ4eDh4NGRfYworCit2b2lkIHZwOF9zYWQ4eDE2eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHgxNng0ZCB2cDhfc2FkOHgxNng0ZF9jCisKK3ZvaWQgdnA4X3NhZDE2eDh4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNng4eDRkIHZwOF9zYWQxNng4eDRkX2MKKwordm9pZCB2cDhfc2FkMTZ4MTZ4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNngxNng0ZCB2cDhfc2FkMTZ4MTZ4NGRfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2MKKwordm9pZCB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19jKHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnliZik7CisjZGVmaW5lIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX2MKKwordm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyk7CisjZGVmaW5lIHZwOF95djEyX2NvcHlfZnJhbWUgdnA4X3l2MTJfY29weV9mcmFtZV9jCisKK3ZvaWQgdnA4X3l2MTJfY29weV95X2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyk7CisjZGVmaW5lIHZwOF95djEyX2NvcHlfeSB2cDhfeXYxMl9jb3B5X3lfYworCit2b2lkIHZweF9ydGNkKHZvaWQpOworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKworI2lmZGVmIFJUQ0RfQworI2luY2x1ZGUgInZweF9wb3J0cy9hcm0uaCIKK3N0YXRpYyB2b2lkIHNldHVwX3J0Y2RfaW50ZXJuYWwodm9pZCkKK3sKKyAgICBpbnQgZmxhZ3MgPSBhcm1fY3B1X2NhcHMoKTsKKworICAgICh2b2lkKWZsYWdzOworCisKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcm12N2EvdnB4X3ZlcnNpb24uaCBiL2FybXY3YS92cHhfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2M2RkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcm12N2EvdnB4X3ZlcnNpb24uaApAQCAtMCwwICsxLDcgQEAKKyNkZWZpbmUgVkVSU0lPTl9NQUpPUiAgMQorI2RlZmluZSBWRVJTSU9OX01JTk9SICAxCisjZGVmaW5lIFZFUlNJT05fUEFUQ0ggIDAKKyNkZWZpbmUgVkVSU0lPTl9FWFRSQSAgIiIKKyNkZWZpbmUgVkVSU0lPTl9QQUNLRUQgKChWRVJTSU9OX01BSk9SPDwxNil8KFZFUlNJT05fTUlOT1I8PDgpfChWRVJTSU9OX1BBVENIKSkKKyNkZWZpbmUgVkVSU0lPTl9TVFJJTkdfTk9TUCAidjEuMS4wIgorI2RlZmluZSBWRVJTSU9OX1NUUklORyAgICAgICIgdjEuMS4wIgpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZS9NYWtlZmlsZSBiL2J1aWxkL21ha2UvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0ZDNjOTMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0jIwotIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIwotIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0jIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotIyMKLQotCi1pbmNsdWRlIGNvbmZpZy5tawotcXVpZXQ/PXRydWUKLWlmZXEgKCQodGFyZ2V0KSwpCi0jIElmIGEgdGFyZ2V0IHdhc24ndCBzcGVjaWZpZWQsIGludm9rZSBmb3IgYWxsIGVuYWJsZWQgdGFyZ2V0cy4KLS5ERUZBVUxUOgotCUBmb3IgdCBpbiAkKEFMTF9UQVJHRVRTKTsgZG8gXAotCSAgICAgJChNQUtFKSAtLW5vLXByaW50LWRpcmVjdG9yeSB0YXJnZXQ9JCR0ICQoTUFLRUNNREdPQUxTKSB8fCBleGl0ICQkPztcCi0gICAgICAgIGRvbmUKLWFsbDogLkRFRkFVTFQKLWNsZWFuOjogLkRFRkFVTFQKLWluc3RhbGw6OiAuREVGQVVMVAotCi0KLSMgTm90ZTogbWQ1c3VtIGlzIG5vdCBpbnN0YWxsZWQgb24gT1MgWCwgYnV0IG9wZW5zc2wgaXMuIE9wZW5zc2wgbWF5IG5vdCBiZQotIyBpbnN0YWxsZWQgb24gY3lnd2luLCBzbyB3ZSBuZWVkIHRvIGF1dG9kZXRlY3QgaGVyZS4KLW1kNXN1bSA6PSAkKGZpcnN0d29yZCAkKHdpbGRjYXJkIFwKLSAgICAgICAgICAkKGZvcmVhY2ggZSxtZDVzdW0gb3BlbnNzbCxcCi0gICAgICAgICAgJChmb3JlYWNoIHAsJChzdWJzdCA6LCAsJChQQVRIKSksJChwKS8kKGUpKikpXAotICAgICAgICAgICkpCi1tZDVzdW0gOj0gJChpZiAkKGZpbHRlciAlb3BlbnNzbCwkKG1kNXN1bSkpLCQobWQ1c3VtKSBkZ3N0IC1tZDUsJChtZDVzdW0pKQotCi1UR1RfQ0M6PSQod29yZCAzLCAkKHN1YnN0IC0sICwkKFRPT0xDSEFJTikpKQotZGlzdDoKLQlAZm9yIHQgaW4gJChBTExfVEFSR0VUUyk7IGRvIFwKLQkgICAgICQoTUFLRSkgLS1uby1wcmludC1kaXJlY3RvcnkgdGFyZ2V0PSQkdCAkKE1BS0VDTURHT0FMUykgfHwgZXhpdCAkJD87XAotICAgICAgICBkb25lCi0gICAgICAgICMgUnVuIGNvbmZpZ3VyZSBmb3IgdGhlIHVzZXIgd2l0aCB0aGUgY3VycmVudCB0b29sY2hhaW4uCi0JQGlmIFsgLWQgIiQoRElTVF9ESVIpL3NyYyIgXTsgdGhlbiBcCi0gICAgICAgICAgICBta2RpciAtcCAiJChESVNUX0RJUikvYnVpbGQiOyBcCi0gICAgICAgICAgICBjZCAiJChESVNUX0RJUikvYnVpbGQiOyBcCi0gICAgICAgICAgICBlY2hvICJSZXJ1bm5pbmcgY29uZmlndXJlICQoQ09ORklHVVJFX0FSR1MpIjsgXAotICAgICAgICAgICAgLi4vc3JjL2NvbmZpZ3VyZSAkKENPTkZJR1VSRV9BUkdTKTsgXAotICAgICAgICAgICAgJChpZiAkKGZpbHRlciB2cyUsJChUR1RfQ0MpKSxtYWtlIE5PX0xBVU5DSF9ERVZFTlY9MTspIFwKLSAgICAgICAgZmkKLQlAaWYgWyAtZCAiJChESVNUX0RJUikiIF07IHRoZW4gXAotICAgICAgICAgICAgZWNobyAiICAgIFtNRDVTVU1dICQoRElTVF9ESVIpIjsgXAotCSAgICBjZCAkKERJU1RfRElSKSAmJiBcCi0JICAgICQobWQ1c3VtKSBgZmluZCAuIC1uYW1lIG1kNXN1bXMudHh0IC1wcnVuZSAtbyAtdHlwZSBmIC1wcmludGAgXAotICAgICAgICAgICAgICAgIHwgc2VkIC1lICdzL01ENShcKC4qXCkpPSBcKFswLTlhLWZdXHszMlx9XCkvXDIgIFwxLycgXAotICAgICAgICAgICAgICAgID4gbWQ1c3Vtcy50eHQ7XAotICAgICAgICBmaQotCi0KLWVuZGlmCi0KLWlmbmVxICgkKHRhcmdldCksKQotIyBOb3JtYWxseSwgd2Ugd2FudCB0byBidWlsZCB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgdGFyZ2V0IGFuZCB0aGUgdG9vbGNoYWluLgotIyBUaGlzIGRpc2FtYmlndWF0ZXMgZnJvbSB0aGUgJCh0YXJnZXQpLm1rIGZpbGUgdGhhdCBleGlzdHMgaW4gdGhlIHNvdXJjZSB0cmVlLgotIyBIb3dldmVyLCB0aGUgdG9vbGNoYWluIGlzIHBhcnQgb2YgdGhlIHRhcmdldCBpbiB1bml2ZXJzYWwgYnVpbGRzLCBzbyB3ZQotIyBkb24ndCB3YW50IHRvIGluY2x1ZGUgVE9PTENIQUlOIGluIHRoYXQgY2FzZS4gRkFUX0FSQ0hTIGlzIHVzZWQgdG8gdGVzdAotIyBpZiB3ZSdyZSBpbiB0aGUgdW5pdmVyc2FsIGNhc2UuCi1pbmNsdWRlICQodGFyZ2V0KSQoaWYgJChGQVRfQVJDSFMpLCwtJChUT09MQ0hBSU4pKS5tawotZW5kaWYKLUJVSUxEX1JPT1Q/PS4KLVZQQVRIPSQoU1JDX1BBVEhfQkFSRSkKLUNGTEFHUys9LUkkKEJVSUxEX1BGWCkkKEJVSUxEX1JPT1QpIC1JJChTUkNfUEFUSCkKLUFTRkxBR1MrPS1JJChCVUlMRF9QRlgpJChCVUlMRF9ST09UKS8gLUkkKFNSQ19QQVRIKS8KLURJU1RfRElSPz1kaXN0Ci1IT1NUQ0M/PWdjYwotVEdUX0lTQTo9JCh3b3JkIDEsICQoc3Vic3QgLSwgLCQoVE9PTENIQUlOKSkpCi1UR1RfT1M6PSQod29yZCAyLCAkKHN1YnN0IC0sICwkKFRPT0xDSEFJTikpKQotVEdUX0NDOj0kKHdvcmQgMywgJChzdWJzdCAtLCAsJChUT09MQ0hBSU4pKSkKLXF1aWV0Oj0kKGlmICQodmVyYm9zZSksLHllcykKLXFleGVjPSQoaWYgJChxdWlldCksQCkKLQotIyBDYW5jZWwgYnVpbHQtaW4gaW1wbGljaXQgcnVsZXMKLSU6ICUubwotJS5hc206Ci0lLmE6Ci0KLSMKLSMgQ29tbW9uIHJ1bGVzIgotIwotLlBIT05ZOiBhbGwtJCh0YXJnZXQpCi1hbGwtJCh0YXJnZXQpOgotCi0uUEhPTlk6IGNsZWFuCi1jbGVhbjo6Ci0Jcm0gLWYgJChPQkpTLXllcykgJChPQkpTLXllczoubz0uZCkgJChPQkpTLXllczouYXNtLnMubz0uYXNtLnMpCi0Jcm0gLWYgJChDTEVBTi1PQkpTKQotCi0uUEhPTlk6IGRpc3QKLWRpc3Q6Ci0uUEhPTlk6IGluc3RhbGwKLWluc3RhbGw6OgotCi0kKEJVSUxEX1BGWCklLmMuZDogJS5jCi0JJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtERVBdICRAIikKLQkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQotCSQocWV4ZWMpJChDQykgJChDRkxBR1MpIC1NICQ8IHwgJChmbXRfZGVwcykgPiAkQAotCi0kKEJVSUxEX1BGWCklLmMubzogJS5jCi0JJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtDQ10gJEAiKQotCSQocWV4ZWMpJChDQykgJChDRkxBR1MpIC1jIC1vICRAICQ8Ci0KLSQoQlVJTERfUEZYKSUuYXNtLmQ6ICUuYXNtCi0JJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtERVBdICRAIikKLQkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQotCSQocWV4ZWMpJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL2dlbl9hc21fZGVwcy5zaCBcCi0gICAgICAgICAgICAtLWJ1aWxkLXBmeD0kKEJVSUxEX1BGWCkgLS1kZXBmaWxlPSRAICQoQVNGTEFHUykgJDwgPiAkQAotCi0kKEJVSUxEX1BGWCklLmFzbS5vOiAlLmFzbQotCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbQVNdICRAIikKLQkkKHFleGVjKSQoQVMpICQoQVNGTEFHUykgLW8gJEAgJDwKLQotJChCVUlMRF9QRlgpJS5zLmQ6ICUucwotCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbREVQXSAkQCIpCi0JJChxZXhlYylta2RpciAtcCAkKGRpciAkQCkKLQkkKHFleGVjKSQoU1JDX1BBVEhfQkFSRSkvYnVpbGQvbWFrZS9nZW5fYXNtX2RlcHMuc2ggXAotICAgICAgICAgICAgLS1idWlsZC1wZng9JChCVUlMRF9QRlgpIC0tZGVwZmlsZT0kQCAkKEFTRkxBR1MpICQ8ID4gJEAKLQotJChCVUlMRF9QRlgpJS5zLm86ICUucwotCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbQVNdICRAIikKLQkkKHFleGVjKSQoQVMpICQoQVNGTEFHUykgLW8gJEAgJDwKLQotLlBSRUNJT1VTOiAlLmFzbS5zCi0kKEJVSUxEX1BGWCklLmFzbS5zOiAlLmFzbQotCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbQVNNIENPTlZFUlNJT05dICRAIikKLQkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQotCSQocWV4ZWMpJChBU01fQ09OVkVSU0lPTikgPCQ8ID4kQAotCi0jIElmIHdlJ3JlIGluIGRlYnVnIG1vZGUsIHByZXRlbmQgd2UgZG9uJ3QgaGF2ZSBHTlUgc3RyaXAsIHRvIGZhbGwgYmFjayB0bwotIyB0aGUgY29weSBpbXBsZW1lbnRhdGlvbgotSEFWRV9HTlVfU1RSSVAgOj0gJChpZiAkKENPTkZJR19ERUJVRyksLCQoSEFWRV9HTlVfU1RSSVApKQotaWZlcSAoJChIQVZFX0dOVV9TVFJJUCkseWVzKQotIyBPbGRlciBiaW51dGlscyBzdHJpcCBnbG9iYWwgc3lib2xzIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZwotIyB3aGVuIGdpdmVuIC0tc3RyaXAtdW5uZWVkZWQuIFVzZSBubSBhbmQgYXdrIHRvIGlkZW50aWZ5IGdsb2JhbHMgYW5kCi0jIGtlZXAgdGhlbS4KLSUuYTogJV9nLmEKLQkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW1NUUklQXSAkQCA8ICQ8IikKLQkkKHFleGVjKSQoU1RSSVApIC0tc3RyaXAtdW5uZWVkZWQgXAotICAgICAgICAgYCQoTk0pICQ8IHwgZ3JlcCAnIFtBLVRWLVpdICcgfCBhd2sgJ3twcmludCAiLUsiJCQzJ31gXAotICAgICAgICAgIC1vICRAICQ8Ci1lbHNlCi0lLmE6ICVfZy5hCi0JJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtDUF0gJEAgPCAkPCIpCi0JJChxZXhlYyljcCAkPCAkQAotZW5kaWYKLQotIwotIyBSdWxlIHRvIGV4dHJhY3QgYXNzZW1ibHkgY29uc3RhbnRzIGZyb20gQyBzb3VyY2VzCi0jCi1vYmpfaW50X2V4dHJhY3Q6IGJ1aWxkL21ha2Uvb2JqX2ludF9leHRyYWN0LmMKLQkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW0hPU1RDQ10gJEAiKQotCSQocWV4ZWMpJChIT1NUQ0MpIC1JLiAtSSQoU1JDX1BBVEhfQkFSRSkgLW8gJEAgJDwKLUNMRUFOLU9CSlMgKz0gb2JqX2ludF9leHRyYWN0Ci0KLSMKLSMgVXRpbGl0eSBmdW5jdGlvbnMKLSMKLXBhaXJtYXA9JChpZiAkKHN0cmlwICQoMikpLFwKLSAgICAkKGNhbGwgJCgxKSwkKHdvcmQgMSwkKDIpKSwkKHdvcmQgMiwkKDIpKSlcCi0gICAgJChjYWxsIHBhaXJtYXAsJCgxKSwkKHdvcmRsaXN0IDMsJCh3b3JkcyAkKDIpKSwkKDIpKSlcCi0pCi0KLWVuYWJsZWQ9JChmaWx0ZXItb3V0ICQoJCgxKS1ubyksJCgkKDEpLXllcykpCi1jb25kX2VuYWJsZWQ9JChpZiAkKGZpbHRlciB5ZXMsJCgkKDEpKSksICQoY2FsbCBlbmFibGVkLCQoMikpKQotCi1maW5kX2ZpbGUxPSQod29yZCAxLCQod2lsZGNhcmQgJChzdWJzdCAvLywvLCQoYWRkc3VmZml4IC8kKDEpLCQoMikpKSkpCi1maW5kX2ZpbGU9JChmb3JlYWNoIGYsJCgxKSwkKGNhbGwgZmluZF9maWxlMSwkKHN0cmlwICQoZikpLCQoc3RyaXAgJCgyKSkpICkKLW9ial9wYXRzPS5jPS5jLm8gJChBU19TRlgpPSQoQVNfU0ZYKS5vCi1vYmpzPSQoYWRkcHJlZml4ICQoQlVJTERfUEZYKSwkKGZvcmVhY2ggcCwkKG9ial9wYXRzKSwkKGZpbHRlciAlLm8sJCgxOiQocCkpKSApKQotCi1pbnN0YWxsX21hcF90ZW1wbGF0ZXM9JChldmFsICQoY2FsbCBpbnN0YWxsX21hcF90ZW1wbGF0ZSwkKDEpLCQoMikpKQotCi1ub3Q9JChzdWJzdCB5ZXMsbm8sJCgxKSkKLQotaWZlcSAoJChDT05GSUdfTVNWUykseWVzKQotbGliX2ZpbGVfbmFtZT0kKDEpLmxpYgotZWxzZQotbGliX2ZpbGVfbmFtZT1saWIkKDEpLmEKLWVuZGlmCi0jCi0jIFJ1bGUgVGVtcGxhdGVzCi0jCi1kZWZpbmUgbGlua2VyX3RlbXBsYXRlCi0kKDEpOiAkKGZpbHRlci1vdXQgLSUsJCgyKSkKLSQoMSk6Ci0JJChpZiAkKHF1aWV0KSxAZWNobyAgICAiICAgIFtMRF0gJCRAIikKLQkkKHFleGVjKSQkKExEKSAkJChzdHJpcCAkJChMREZMQUdTKSAtbyAkJEAgJCgyKSAkKDMpICQkKGV4dHJhbGlicykpCi1lbmRlZgotIyBtYWtlLTMuODAgaGFzIGEgYnVnIHdpdGggZXhwYW5kaW5nIGxhcmdlIGlucHV0IHN0cmluZ3MgdG8gdGhlIGV2YWwgZnVuY3Rpb24sCi0jIHdoaWNoIHdhcyB0cmlnZ2VyZWQgaW4gc29tZSBjYXNlcyBieSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudCBvZgotIyBsaW5rZXJfdGVtcGxhdGU6Ci0jICAgJCgxKTogJCQoY2FsbCBmaW5kX2ZpbGUsICQocGF0c3Vic3QgLWwlLGxpYiUuYSwkKGZpbHRlciAtbCUsJCgyKSkpLFwKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAkJChwYXRzdWJzdCAtTCUsJSwkJChmaWx0ZXIgLUwlLCQkKExERkxBR1MpICQoMikpKSkKLSMgVGhpcyBtYXkgYmUgdXNlZnVsIHRvIHJldmlzaXQgaW4gdGhlIGZ1dHVyZSAoaXQgdHJpZXMgdG8gbG9jYXRlIGxpYnJhcmllcwotIyBpbiBhIHNlYXJjaCBwYXRoIGFuZCBhZGQgdGhlbSBhcyBwcmVyZXF1aXNpdGVzCi0KLWRlZmluZSBpbnN0YWxsX21hcF90ZW1wbGF0ZQotJChESVNUX0RJUikvJCgxKTogJCgyKQotCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbSU5TVEFMTF0gJCRAIikKLQkkKHFleGVjKW1rZGlyIC1wICQkKGRpciAkJEApCi0JJChxZXhlYyljcCAtcCAkJDwgJCRACi1lbmRlZgotCi1kZWZpbmUgYXJjaGl2ZV90ZW1wbGF0ZQotIyBOb3QgdXNpbmcgYSBwYXR0ZXJuIHJ1bGUgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgZW1wdHkKLSMgYXJjaGl2ZXMgd2hlbiB0aGV5IGFyZSBsaXN0ZWQgYXMgYSBkZXBlbmRlbmN5IGluIGZpbGVzIG5vdCByZXNwb25zaWJsZQotIyBmb3IgY3JlYXRpbmcgdGhlbS4KLSQoMSk6Ci0JJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtBUl0gJCRAIikKLQkkKHFleGVjKSQkKEFSKSAkJChBUkZMQUdTKSAkJEAgJCQ/Ci1lbmRlZgotCi1kZWZpbmUgc29fdGVtcGxhdGUKLSMgTm90IHVzaW5nIGEgcGF0dGVybiBydWxlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGdlbmVyYXRlIGVtcHR5Ci0jIGFyY2hpdmVzIHdoZW4gdGhleSBhcmUgbGlzdGVkIGFzIGEgZGVwZW5kZW5jeSBpbiBmaWxlcyBub3QgcmVzcG9uc2libGUKLSMgZm9yIGNyZWF0aW5nIHRoZW0uCi0jCi0jIFRoaXMgbmVlZHMgZnVydGhlciBhYnN0cmFjdGlvbiBmb3IgZGVhbGluZyB3aXRoIG5vbi1HTlUgbGlua2Vycy4KLSQoMSk6Ci0JJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtMRF0gJCRAIikKLQkkKHFleGVjKSQkKExEKSAtc2hhcmVkICQkKExERkxBR1MpIFwKLSAgICAgICAgICAgIC1XbCwtLW5vLXVuZGVmaW5lZCAtV2wsLXNvbmFtZSwkJChTT05BTUUpIFwKLSAgICAgICAgICAgIC1XbCwtLXZlcnNpb24tc2NyaXB0LCQkKFNPX1ZFUlNJT05fU0NSSVBUKSAtbyAkJEAgXAotICAgICAgICAgICAgJCQoZmlsdGVyICUubywkJD8pICQkKGV4dHJhbGlicykKLWVuZGVmCi0KLWRlZmluZSBsaXBvX2xpYl90ZW1wbGF0ZQotJCgxKTogJChhZGRzdWZmaXggLyQoMSksJChGQVRfQVJDSFMpKQotCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbTElQT10gJCRAIikKLQkkKHFleGVjKWxpYnRvb2wgLXN0YXRpYyAtbyAkJEAgJCQ/Ci1lbmRlZgotCi1kZWZpbmUgbGlwb19iaW5fdGVtcGxhdGUKLSQoMSk6ICQoYWRkc3VmZml4IC8kKDEpLCQoRkFUX0FSQ0hTKSkKLQkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW0xJUE9dICQkQCIpCi0JJChxZXhlYylsaXBvIC1vdXRwdXQgJCRAIC1jcmVhdGUgJCQ/Ci1lbmRlZgotCi0KLSMKLSMgR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbgotIwotaWZuZXEgKCQodGFyZ2V0KSwpCi1pbmNsdWRlICQoU1JDX1BBVEhfQkFSRSkvJCh0YXJnZXQ6LSQoVE9PTENIQUlOKT0pLm1rCi1lbmRpZgotaWZlcSAoJChmaWx0ZXIgY2xlYW4sJChNQUtFQ01ER09BTFMpKSwpCi0gICMgT2xkZXIgdmVyc2lvbnMgb2YgbWFrZSBkb24ndCBsaWtlIC1pbmNsdWRlIGRpcmVjdGl2ZXMgd2l0aCBubyBhcmd1bWVudHMKLSAgaWZuZXEgKCQoZmlsdGVyICUuZCwkKE9CSlMteWVzOi5vPS5kKSksKQotICAgIC1pbmNsdWRlICQoZmlsdGVyICUuZCwkKE9CSlMteWVzOi5vPS5kKSkKLSAgZW5kaWYKLWVuZGlmCi0KLSMKLSMgQ29uZmlndXJhdGlvbiBkZXBlbmRlbnQgcnVsZXMKLSMKLSQoY2FsbCBwYWlybWFwLGluc3RhbGxfbWFwX3RlbXBsYXRlcywkKElOU1RBTExfTUFQUykpCi0KLURPQ1M9JChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9ET0NTLERPQ1MpCi0uZG9jczogJChET0NTKQotCUB0b3VjaCAkQAotCi1JTlNUQUxMLURPQ1M9JChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9ET0NTLElOU1RBTEwtRE9DUykKLWlmZXEgKCQoTUFLRUNNREdPQUxTKSxkaXN0KQotSU5TVEFMTC1ET0NTKz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX0RPQ1MsRElTVC1ET0NTKQotZW5kaWYKLS5pbnN0YWxsLWRvY3M6IC5kb2NzICQoYWRkcHJlZml4ICQoRElTVF9ESVIpLywkKElOU1RBTEwtRE9DUykpCi0JQHRvdWNoICRACi0KLWNsZWFuOjoKLQlybSAtZiAuZG9jcyAuaW5zdGFsbC1kb2NzICQoRE9DUykKLQotQklOUz0kKGNhbGwgZW5hYmxlZCxCSU5TKQotLmJpbnM6ICQoQklOUykKLQlAdG91Y2ggJEAKLQotSU5TVEFMTC1CSU5TPSQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfQklOUyxJTlNUQUxMLUJJTlMpCi1pZmVxICgkKE1BS0VDTURHT0FMUyksZGlzdCkKLUlOU1RBTEwtQklOUys9JChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9CSU5TLERJU1QtQklOUykKLWVuZGlmCi0uaW5zdGFsbC1iaW5zOiAuYmlucyAkKGFkZHByZWZpeCAkKERJU1RfRElSKS8sJChJTlNUQUxMLUJJTlMpKQotCUB0b3VjaCAkQAotCi1jbGVhbjo6Ci0Jcm0gLWYgLmJpbnMgLmluc3RhbGwtYmlucyAkKEJJTlMpCi0KLUxJQlM9JChjYWxsIGVuYWJsZWQsTElCUykKLS5saWJzOiAkKExJQlMpCi0JQHRvdWNoICRACi0kKGZvcmVhY2ggbGliLCQoZmlsdGVyICVfZy5hLCQoTElCUykpLCQoZXZhbCAkKGNhbGwgYXJjaGl2ZV90ZW1wbGF0ZSwkKGxpYikpKSkKLSQoZm9yZWFjaCBsaWIsJChmaWx0ZXIgJXNvLiQoVkVSU0lPTl9NQUpPUikuJChWRVJTSU9OX01JTk9SKS4kKFZFUlNJT05fUEFUQ0gpLCQoTElCUykpLCQoZXZhbCAkKGNhbGwgc29fdGVtcGxhdGUsJChsaWIpKSkpCi0KLUlOU1RBTEwtTElCUz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX0xJQlMsSU5TVEFMTC1MSUJTKQotaWZlcSAoJChNQUtFQ01ER09BTFMpLGRpc3QpCi1JTlNUQUxMLUxJQlMrPSQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfTElCUyxESVNULUxJQlMpCi1lbmRpZgotLmluc3RhbGwtbGliczogLmxpYnMgJChhZGRwcmVmaXggJChESVNUX0RJUikvLCQoSU5TVEFMTC1MSUJTKSkKLQlAdG91Y2ggJEAKLQotY2xlYW46OgotCXJtIC1mIC5saWJzIC5pbnN0YWxsLWxpYnMgJChMSUJTKQotCi1pZmVxICgkKENPTkZJR19FWFRFUk5BTF9CVUlMRCkseWVzKQotUFJPSkVDVFM9JChjYWxsIGVuYWJsZWQsUFJPSkVDVFMpCi0ucHJvamVjdHM6ICQoUFJPSkVDVFMpCi0JQHRvdWNoICRACi0KLUlOU1RBTEwtUFJPSkVDVFM9JChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9QUk9KRUNUUyxJTlNUQUxMLVBST0pFQ1RTKQotaWZlcSAoJChNQUtFQ01ER09BTFMpLGRpc3QpCi1JTlNUQUxMLVBST0pFQ1RTKz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX1BST0pFQ1RTLERJU1QtUFJPSkVDVFMpCi1lbmRpZgotLmluc3RhbGwtcHJvamVjdHM6IC5wcm9qZWN0cyAkKGFkZHByZWZpeCAkKERJU1RfRElSKS8sJChJTlNUQUxMLVBST0pFQ1RTKSkKLQlAdG91Y2ggJEAKLQotY2xlYW46OgotCXJtIC1mIC5wcm9qZWN0cyAuaW5zdGFsbC1wcm9qZWN0cyAkKFBST0pFQ1RTKQotZW5kaWYKLQotIyBJZiB0aGVyZSBhcmUgYW55IHNvdXJjZSBmaWxlcyB0byBiZSBkaXN0cmlidXRlZCwgdGhlbiBpbmNsdWRlIHRoZSBidWlsZAotIyBzeXN0ZW0gdG9vLgotaWZuZXEgKCQoY2FsbCBlbmFibGVkLERJU1QtU1JDUyksKQotICAgIERJU1QtU1JDUy15ZXMgICAgICAgICAgICArPSBjb25maWd1cmUKLSAgICBESVNULVNSQ1MteWVzICAgICAgICAgICAgKz0gYnVpbGQvbWFrZS9jb25maWd1cmUuc2gKLSAgICBESVNULVNSQ1MteWVzICAgICAgICAgICAgKz0gYnVpbGQvbWFrZS9nZW5fYXNtX2RlcHMuc2gKLSAgICBESVNULVNSQ1MteWVzICAgICAgICAgICAgKz0gYnVpbGQvbWFrZS9NYWtlZmlsZQotICAgIERJU1QtU1JDUy0kKENPTkZJR19NU1ZTKSAgKz0gYnVpbGQvbWFrZS9nZW5fbXN2c19kZWYuc2gKLSAgICBESVNULVNSQ1MtJChDT05GSUdfTVNWUykgICs9IGJ1aWxkL21ha2UvZ2VuX21zdnNfcHJvai5zaAotICAgIERJU1QtU1JDUy0kKENPTkZJR19NU1ZTKSAgKz0gYnVpbGQvbWFrZS9nZW5fbXN2c19zbG4uc2gKLSAgICBESVNULVNSQ1MtJChDT05GSUdfTVNWUykgICs9IGJ1aWxkL3g4Ni1tc3ZzL3lhc20ucnVsZXMKLSAgICBESVNULVNSQ1MtJChDT05GSUdfUlZDVCkgKz0gYnVpbGQvbWFrZS9hcm1saW5rX2FkYXB0ZXIuc2gKLSAgICAjIEluY2x1ZGUgb2JqX2ludF9leHRyYWN0IGlmIHdlIHVzZSBvZmZzZXRzIGZyb20gYXNtXypfb2Zmc2V0cwotICAgIERJU1QtU1JDUy0kKEFSQ0hfQVJNKSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgICAgKz0gYnVpbGQvbWFrZS9vYmpfaW50X2V4dHJhY3QuYwotICAgIERJU1QtU1JDUy0kKEFSQ0hfQVJNKSAgICArPSBidWlsZC9tYWtlL2FkczJnYXMucGwKLSAgICBESVNULVNSQ1MteWVzICAgICAgICAgICAgKz0gJCh0YXJnZXQ6LSQoVE9PTENIQUlOKT0pLm1rCi1lbmRpZgotSU5TVEFMTC1TUkNTIDo9ICQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfU1JDUyxJTlNUQUxMLVNSQ1MpCi1pZmVxICgkKE1BS0VDTURHT0FMUyksZGlzdCkKLUlOU1RBTEwtU1JDUyArPSAkKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX1NSQ1MsRElTVC1TUkNTKQotZW5kaWYKLS5pbnN0YWxsLXNyY3M6ICQoYWRkcHJlZml4ICQoRElTVF9ESVIpL3NyYy8sJChJTlNUQUxMLVNSQ1MpKQotCUB0b3VjaCAkQAotCi1jbGVhbjo6Ci0Jcm0gLWYgLmluc3RhbGwtc3JjcwotCi1pZmVxICgkKENPTkZJR19FWFRFUk5BTF9CVUlMRCkseWVzKQotICAgIEJVSUxEX1RBUkdFVFMgKz0gLnByb2plY3RzCi0gICAgSU5TVEFMTF9UQVJHRVRTICs9IC5pbnN0YWxsLXByb2plY3RzCi1lbmRpZgotQlVJTERfVEFSR0VUUyArPSAuZG9jcyAubGlicyAuYmlucwotSU5TVEFMTF9UQVJHRVRTICs9IC5pbnN0YWxsLWRvY3MgLmluc3RhbGwtc3JjcyAuaW5zdGFsbC1saWJzIC5pbnN0YWxsLWJpbnMKLWFsbC0kKHRhcmdldCk6ICQoQlVJTERfVEFSR0VUUykKLWluc3RhbGw6OiAkKElOU1RBTExfVEFSR0VUUykKLWRpc3Q6ICQoSU5TVEFMTF9UQVJHRVRTKQpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZS9hZHMyZ2FzLnBsIGIvYnVpbGQvbWFrZS9hZHMyZ2FzLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGZmMDQ4Li4wMDAwMDAwCi0tLSBhL2J1aWxkL21ha2UvYWRzMmdhcy5wbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLSMjCi0jIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMjCi0jIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0jIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0jIwotCi0KLSMgYWRzMmdhcy5wbAotIyBBdXRob3I6IEVyaWMgRnVuZyAoZWZ1bmcgKGF0KSBhY20ub3JnKQotIwotIyBDb252ZXJ0IEFSTSBEZXZlbG9wZXIgU3VpdGUgMS4wLjEgc3ludGF4IGFzc2VtYmx5IHNvdXJjZSB0byBHTlUgYXMgZm9ybWF0Ci0jCi0jIFVzYWdlOiBjYXQgaW5wdXRmaWxlIHwgcGVybCBhZHMyZ2FzLnBsID4gb3V0cHV0ZmlsZQotIwotcHJpbnQgIkAgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGZyb20gYSAuYXNtIGZpbGVcbiI7Ci1wcmludCAiQCAgdXNpbmcgdGhlIGFkczJnYXMucGwgc2NyaXB0LlxuIjsKLXByaW50ICJcdC5lcXUgRE8xU1RST1VORElORywgMFxuIjsKLQotd2hpbGUgKDxTVERJTj4pCi17Ci0gICAgIyBDb21tZW50IGNoYXJhY3RlcgotICAgIHMvOy9AL2c7Ci0KLSAgICAjIEhleGFkZWNpbWFsIGNvbnN0YW50cyBwcmVmYWNlZCBieSAweAotICAgIHMvIyYvIzB4L2c7Ci0KLSAgICAjIENvbnZlcnQgOk9SOiB0byB8Ci0gICAgcy86T1I6LyB8IC9nOwotCi0gICAgIyBDb252ZXJ0IDpBTkQ6IHRvICYKLSAgICBzLzpBTkQ6LyAmIC9nOwotCi0gICAgIyBDb252ZXJ0IDpOT1Q6IHRvIH4KLSAgICBzLzpOT1Q6LyB+IC9nOwotCi0gICAgIyBDb252ZXJ0IDpTSEw6IHRvIDw8Ci0gICAgcy86U0hMOi8gPDwgL2c7Ci0KLSAgICAjIENvbnZlcnQgOlNIUjogdG8gPj4KLSAgICBzLzpTSFI6LyA+PiAvZzsKLQotICAgICMgQ29udmVydCBFTFNFIHRvIC5lbHNlCi0gICAgcy9FTFNFLy5lbHNlL2c7Ci0KLSAgICAjIENvbnZlcnQgRU5ESUYgdG8gLmVuZGlmCi0gICAgcy9FTkRJRi8uZW5kaWYvZzsKLQotICAgICMgQ29udmVydCBFTFNFSUYgdG8gLmVsc2VpZgotICAgIHMvRUxTRUlGLy5lbHNlaWYvZzsKLQotICAgICMgQ29udmVydCBMVE9SRyB0byAubHRvcmcKLSAgICBzL0xUT1JHLy5sdG9yZy9nOwotCi0gICAgIyBDb252ZXJ0IElGIDpERUY6dG8gLmlmCi0gICAgIyBnY2MgZG9lc24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIGEgY29uZGl0aW9uYWwKLSAgICAjIGlmIGRlZmluZWQgdmFyaWFibGUgdGhhdCBpcyBzZXQgYnkgSUYgOkRFRjogb24KLSAgICAjIGFybWFzbSwgc28gY29udmVydCBpdCB0byBhIG5vcm1hbCAuaWYgYW5kIHRoZW4KLSAgICAjIG1ha2Ugc3VyZSB0byBkZWZpbmUgYSB2YWx1ZSBlbGVzZXdoZXJlCi0gICAgaWYgKHMvXGJJRiA6REVGOlxiLy5pZiAvZykKLSAgICB7Ci0gICAgICAgIHMvPS89PS9nOwotICAgIH0KLQotICAgICMgQ29udmVydCBJRiB0byAuaWYKLSAgICBpZiAocy9cYklGXGIvLmlmL2cpCi0gICAgewotICAgICAgICBzLz0rLz09L2c7Ci0gICAgfQotCi0gICAgIyBDb252ZXJ0IElOQ0xVREUgdG8gLklOQ0xVREUgImZpbGUiCi0gICAgcy9JTkNMVURFKFxzKikoLiopJC8uaW5jbHVkZSAkMVwiJDJcIi87Ci0KLSAgICAjIENvZGUgZGlyZWN0aXZlIChBUk0gdnMgVGh1bWIpCi0gICAgcy9DT0RFKFswLTldWzAtOV0pLy5jb2RlICQxLzsKLQotICAgICMgTm8gQVJFQSByZXF1aXJlZAotICAgIHMvXlxzKkFSRUEuKiQvLnRleHQvOwotCi0gICAgIyBEQ0QgdG8gLndvcmQKLSAgICAjIFRoaXMgb25lIGlzIGZvciBpbmNvbWluZyBzeW1ib2xzCi0gICAgcy9EQ0RccytcfChcdyopXHwvLmxvbmcgJDEvOwotCi0gICAgIyBEQ1cgdG8gLnNob3J0Ci0gICAgcy9EQ1dccytcfChcdyopXHwvLnNob3J0ICQxLzsKLSAgICBzL0RDVyguKikvLnNob3J0ICQxLzsKLQotICAgICMgQ29uc3RhbnRzIGRlZmluZWQgaW4gc2NvcGUKLSAgICBzL0RDRCguKikvLmxvbmcgJDEvOwotICAgIHMvRENCKC4qKS8uYnl0ZSAkMS87Ci0KLSAgICAjIFJOIHRvIC5yZXEKLSAgICBpZiAocy9STlxzKyhbUnJdXGQrfGxyKS8ucmVxICQxLykKLSAgICB7Ci0gICAgICAgIHByaW50OwotICAgICAgICBuZXh0OwotICAgIH0KLQotICAgICMgTWFrZSBmdW5jdGlvbiB2aXNpYmxlIHRvIGxpbmtlciwgYW5kIG1ha2UgYWRkaXRpb25hbCBzeW1ib2wgd2l0aAotICAgICMgcHJlcGVuZGVkIHVuZGVyc2NvcmUKLSAgICBzL0VYUE9SVFxzK1x8KFtcJFx3XSopXHwvLmdsb2JhbCAkMSBcblx0LnR5cGUgJDEsIGZ1bmN0aW9uLzsKLSAgICBzL0lNUE9SVFxzK1x8KFtcJFx3XSopXHwvLmdsb2JhbCAkMS87Ci0KLSAgICAjIE5vIHZlcnRpY2FsIGJhcnMgcmVxdWlyZWQ7IG1ha2UgYWRkaXRpb25hbCBzeW1ib2wgd2l0aCBwcmVwZW5kZWQKLSAgICAjIHVuZGVyc2NvcmUKLSAgICBzL15cfChcJD9cdyspXHwvXyQxXG5cdCQxOi9nOwotCi0gICAgIyBMYWJlbHMgbmVlZCB0cmFpbGluZyBjb2xvbgotIyAgIHMvXihcdyspLyQxOi8gaWYgIS9FUVUvOwotICAgICMgcHV0IHRoZSBjb2xvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGluIHRoZSBtYWNybwotICAgIHMvXihbYS16QS1aXzAtOVwkXSspLyQxOi8gaWYgIS9FUVUvOwotCi0gICAgIyBTdHJpcCBBTElHTgotICAgIHMvXHNBTElHTi9AIEFMSUdOL2c7Ci0KLSAgICAjIFN0cmlwIEFSTQotICAgIHMvXHNBUk0vQCBBUk0vZzsKLQotICAgICMgU3RyaXAgUkVRVUlSRTgKLSAgICAjcy9cc1JFUVVJUkU4L0AgUkVRVUlSRTgvZzsKLSAgICBzL1xzUkVRVUlSRTgvQCAvZzsgICAgICAjRVFVIGNhdXNlIHByb2JsZW0KLQotICAgICMgU3RyaXAgUFJFU0VSVkU4Ci0gICAgcy9cc1BSRVNFUlZFOC9AIFBSRVNFUlZFOC9nOwotCi0gICAgIyBTdHJpcCBQUk9DIGFuZCBFTkRQUk9DCi0gICAgcy9cc1BST0MvQC9nOwotICAgIHMvXHNFTkRQL0AvZzsKLQotICAgICMgRVFVIGRpcmVjdGl2ZQotICAgIHMvKC4qKUVRVSguKikvLmVxdSAkMSwgJDIvOwotCi0gICAgIyBCZWdpbiBtYWNybyBkZWZpbml0aW9uCi0gICAgaWYgKC9NQUNSTy8pIHsKLSAgICAgICAgJF8gPSA8U1RESU4+OwotICAgICAgICBzL14vLm1hY3JvLzsKLSAgICAgICAgcy9cJC8vZzsgICAgICAgICAgICAgICAgIyByZW1vdmUgZm9ybWFsIHBhcmFtIHJlZmVyZW5jZQotICAgICAgICBzLzsvQC9nOyAgICAgICAgICAgICAgICAjIGNoYW5nZSBjb21tZW50IGNoYXJhY3RlcnMKLSAgICB9Ci0KLSAgICAjIEZvciBtYWNyb3MsIHVzZSBcIHRvIHJlZmVyZW5jZSBmb3JtYWwgcGFyYW1zCi0gICAgcy9cJC9cXC9nOyAgICAgICAgICAgICAgICAgICMgRW5kIG1hY3JvIGRlZmluaXRpb24KLSAgICBzL01FTkQvLmVuZG0vOyAgICAgICAgICAgICAgIyBObyBuZWVkIHRvIHRlbGwgaXQgd2hlcmUgdG8gc3RvcCBhc3NlbWJsaW5nCi0gICAgbmV4dCBpZiAvXlxzKkVORFxzKiQvOwotICAgIHByaW50OwotfQpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZS9hZHMyZ2FzX2FwcGxlLnBsIGIvYnVpbGQvbWFrZS9hZHMyZ2FzX2FwcGxlLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDE0YzYxLi4wMDAwMDAwCi0tLSBhL2J1aWxkL21ha2UvYWRzMmdhc19hcHBsZS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jIS91c3IvYmluL2VudiBwZXJsCi0jIwotIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIwotIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0jIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotIyMKLQotCi0jIGFkczJnYXMucGwKLSMgQXV0aG9yOiBFcmljIEZ1bmcgKGVmdW5nIChhdCkgYWNtLm9yZykKLSMKLSMgQ29udmVydCBBUk0gRGV2ZWxvcGVyIFN1aXRlIDEuMC4xIHN5bnRheCBhc3NlbWJseSBzb3VyY2UgdG8gR05VIGFzIGZvcm1hdAotIwotIyBVc2FnZTogY2F0IGlucHV0ZmlsZSB8IHBlcmwgYWRzMmdhcy5wbCA+IG91dHB1dGZpbGUKLSMKLXByaW50ICJAIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBmcm9tIGEgLmFzbSBmaWxlXG4iOwotcHJpbnQgIkAgIHVzaW5nIHRoZSBhZHMyZ2FzX2FwcGxlLnBsIHNjcmlwdC5cblxuIjsKLXByaW50ICJcdC5zZXQgV0lERV9SRUZFUkVOQ0UsIDBcbiI7Ci1wcmludCAiXHQuc2V0IEFSQ0hJVEVDVFVSRSwgNVxuIjsKLXByaW50ICJcdC5zZXQgRE8xU1RST1VORElORywgMFxuIjsKLQotbXkgJXJlZ2lzdGVyX2FsaWFzZXM7Ci1teSAlbWFjcm9fYWxpYXNlczsKLQotbXkgQG1hcHBpbmdfbGlzdCA9ICgiXCQwIiwgIlwkMSIsICJcJDIiLCAiXCQzIiwgIlwkNCIsICJcJDUiLCAiXCQ2IiwgIlwkNyIsICJcJDgiLCAiXCQ5Iik7Ci0KLW15IEBpbmNvbWluZ19hcnJheTsKLQotIyBQZXJsIHRyaW0gZnVuY3Rpb24gdG8gcmVtb3ZlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nCi1zdWIgdHJpbSgkKQotewotICAgIG15ICRzdHJpbmcgPSBzaGlmdDsKLSAgICAkc3RyaW5nID1+IHMvXlxzKy8vOwotICAgICRzdHJpbmcgPX4gcy9ccyskLy87Ci0gICAgcmV0dXJuICRzdHJpbmc7Ci19Ci0KLXdoaWxlICg8U1RESU4+KQotewotICAgICMgQ29tbWVudCBjaGFyYWN0ZXIKLSAgICBzLzsvQC9nOwotCi0gICAgIyBIZXhhZGVjaW1hbCBjb25zdGFudHMgcHJlZmFjZWQgYnkgMHgKLSAgICBzLyMmLyMweC9nOwotCi0gICAgIyBDb252ZXJ0IDpPUjogdG8gfAotICAgIHMvOk9SOi8gfCAvZzsKLQotICAgICMgQ29udmVydCA6QU5EOiB0byAmCi0gICAgcy86QU5EOi8gJiAvZzsKLQotICAgICMgQ29udmVydCA6Tk9UOiB0byB+Ci0gICAgcy86Tk9UOi8gfiAvZzsKLQotICAgICMgQ29udmVydCA6U0hMOiB0byA8PAotICAgIHMvOlNITDovIDw8IC9nOwotCi0gICAgIyBDb252ZXJ0IDpTSFI6IHRvID4+Ci0gICAgcy86U0hSOi8gPj4gL2c7Ci0KLSAgICAjIENvbnZlcnQgRUxTRSB0byAuZWxzZQotICAgIHMvRUxTRS8uZWxzZS9nOwotCi0gICAgIyBDb252ZXJ0IEVORElGIHRvIC5lbmRpZgotICAgIHMvRU5ESUYvLmVuZGlmL2c7Ci0KLSAgICAjIENvbnZlcnQgRUxTRUlGIHRvIC5lbHNlaWYKLSAgICBzL0VMU0VJRi8uZWxzZWlmL2c7Ci0KLSAgICAjIENvbnZlcnQgTFRPUkcgdG8gLmx0b3JnCi0gICAgcy9MVE9SRy8ubHRvcmcvZzsKLQotICAgICMgQ29udmVydCBJRiA6REVGOnRvIC5pZgotICAgICMgZ2NjIGRvZXNuJ3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBkbyBhIGNvbmRpdGlvbmFsCi0gICAgIyBpZiBkZWZpbmVkIHZhcmlhYmxlIHRoYXQgaXMgc2V0IGJ5IElGIDpERUY6IG9uCi0gICAgIyBhcm1hc20sIHNvIGNvbnZlcnQgaXQgdG8gYSBub3JtYWwgLmlmIGFuZCB0aGVuCi0gICAgIyBtYWtlIHN1cmUgdG8gZGVmaW5lIGEgdmFsdWUgZWxlc2V3aGVyZQotICAgIGlmIChzL1xiSUYgOkRFRjpcYi8uaWYgL2cpCi0gICAgewotICAgICAgICBzLz0vPT0vZzsKLSAgICB9Ci0KLSAgICAjIENvbnZlcnQgSUYgdG8gLmlmCi0gICAgaWYgKHMvXGJJRlxiLy5pZi9nKQotICAgIHsKLSAgICAgICAgcy89Lz09L2c7Ci0gICAgfQotCi0gICAgIyBDb252ZXJ0IElOQ0xVREUgdG8gLklOQ0xVREUgImZpbGUiCi0gICAgcy9JTkNMVURFKFxzKikoLiopJC8uaW5jbHVkZSAkMVwiJDJcIi87Ci0KLSAgICAjIENvZGUgZGlyZWN0aXZlIChBUk0gdnMgVGh1bWIpCi0gICAgcy9DT0RFKFswLTldWzAtOV0pLy5jb2RlICQxLzsKLQotICAgICMgTm8gQVJFQSByZXF1aXJlZAotICAgIHMvXlxzKkFSRUEuKiQvLnRleHQvOwotCi0gICAgIyBEQ0QgdG8gLndvcmQKLSAgICAjIFRoaXMgb25lIGlzIGZvciBpbmNvbWluZyBzeW1ib2xzCi0gICAgcy9EQ0RccytcfChcdyopXHwvLmxvbmcgJDEvOwotCi0gICAgIyBEQ1cgdG8gLnNob3J0Ci0gICAgcy9EQ1dccytcfChcdyopXHwvLnNob3J0ICQxLzsKLSAgICBzL0RDVyguKikvLnNob3J0ICQxLzsKLQotICAgICMgQ29uc3RhbnRzIGRlZmluZWQgaW4gc2NvcGUKLSAgICBzL0RDRCguKikvLmxvbmcgJDEvOwotICAgIHMvRENCKC4qKS8uYnl0ZSAkMS87Ci0KLSAgICAjIEJ1aWxkIGEgaGFzaCBvZiBhbGwgdGhlIHJlZ2lzdGVyIC0gYWxpYXMgcGFpcnMuCi0gICAgaWYgKHMvKC4qKVJOKC4qKS8kMSAucmVxICQyL2cpCi0gICAgewotICAgICAgICAkcmVnaXN0ZXJfYWxpYXNlc3t0cmltKCQxKX0gPSB0cmltKCQyKTsKLSAgICAgICAgbmV4dDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKCRrZXksICR2YWx1ZSkgPSBlYWNoKCVyZWdpc3Rlcl9hbGlhc2VzKSkKLSAgICB7Ci0gICAgICAgIHMvXGIka2V5XGIvJHZhbHVlL2c7Ci0gICAgfQotCi0gICAgIyBNYWtlIGZ1bmN0aW9uIHZpc2libGUgdG8gbGlua2VyLCBhbmQgbWFrZSBhZGRpdGlvbmFsIHN5bWJvbCB3aXRoCi0gICAgIyBwcmVwZW5kZWQgdW5kZXJzY29yZQotICAgIHMvRVhQT1JUXHMrXHwoW1wkXHddKilcfC8uZ2xvYmwgXyQxXG5cdC5nbG9ibCAkMS87Ci0gICAgcy9JTVBPUlRccytcfChbXCRcd10qKVx8Ly5nbG9ibCAkMS87Ci0KLSAgICAjIE5vIHZlcnRpY2FsIGJhcnMgcmVxdWlyZWQ7IG1ha2UgYWRkaXRpb25hbCBzeW1ib2wgd2l0aCBwcmVwZW5kZWQKLSAgICAjIHVuZGVyc2NvcmUKLSAgICBzL15cfChcJD9cdyspXHwvXyQxXG5cdCQxOi9nOwotCi0gICAgIyBMYWJlbHMgbmVlZCB0cmFpbGluZyBjb2xvbgotIyAgIHMvXihcdyspLyQxOi8gaWYgIS9FUVUvOwotICAgICMgcHV0IHRoZSBjb2xvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGluIHRoZSBtYWNybwotICAgIHMvXihbYS16QS1aXzAtOVwkXSspLyQxOi8gaWYgIS9FUVUvOwotCi0gICAgIyBTdHJpcCBBTElHTgotICAgIHMvXHNBTElHTi9AIEFMSUdOL2c7Ci0KLSAgICAjIFN0cmlwIEFSTQotICAgIHMvXHNBUk0vQCBBUk0vZzsKLQotICAgICMgU3RyaXAgUkVRVUlSRTgKLSAgICAjcy9cc1JFUVVJUkU4L0AgUkVRVUlSRTgvZzsKLSAgICBzL1xzUkVRVUlSRTgvQCAvZzsKLQotICAgICMgU3RyaXAgUFJFU0VSVkU4Ci0gICAgcy9cc1BSRVNFUlZFOC9AIFBSRVNFUlZFOC9nOwotCi0gICAgIyBTdHJpcCBQUk9DIGFuZCBFTkRQUk9DCi0gICAgcy9QUk9DL0AvZzsKLSAgICBzL0VORFAvQC9nOwotCi0gICAgIyBFUVUgZGlyZWN0aXZlCi0gICAgcy8oLiopRVFVKC4qKS8uc2V0ICQxLCAkMi87Ci0KLSAgICAjIEJlZ2luIG1hY3JvIGRlZmluaXRpb24KLSAgICBpZiAoL01BQ1JPLykKLSAgICB7Ci0gICAgICAgICMgUHJvY2VzcyBuZXh0IGxpbmUgZG93biwgd2hpY2ggd2lsbCBiZSB0aGUgbWFjcm8gZGVmaW5pdGlvbgotICAgICAgICAkXyA9IDxTVERJTj47Ci0KLSAgICAgICAgJHRyaW1tZWQgPSB0cmltKCRfKTsKLQotICAgICAgICAjIHJlbW92ZSBjb21tYXMgdGhhdCBhcmUgc2VwYXJhdGluZyBsaXN0Ci0gICAgICAgICR0cmltbWVkID1+IHMvLC8vZzsKLQotICAgICAgICAjIHN0cmluZyB0byBhcnJheQotICAgICAgICBAaW5jb21pbmdfYXJyYXkgPSBzcGxpdCgvIC8sICR0cmltbWVkKTsKLQotICAgICAgICBwcmludCAiLm1hY3JvIEBpbmNvbWluZ19hcnJheVswXVxuIjsKLQotICAgICAgICAjIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCwgYXMgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUgbWFjcm8KLSAgICAgICAgc2hpZnQgKEBpbmNvbWluZ19hcnJheSk7Ci0KLSAgICAgICAgQG1hY3JvX2FsaWFzZXN7QGluY29taW5nX2FycmF5fSA9IEBtYXBwaW5nX2xpc3Q7Ci0KLSAgICAgICAgbmV4dDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKCRrZXksICR2YWx1ZSkgPSBlYWNoKCVtYWNyb19hbGlhc2VzKSkKLSAgICB7Ci0gICAgICAgICRrZXkgPX4gcy9cJC9cXFwkLzsKLSAgICAgICAgcy8ka2V5XGIvJHZhbHVlL2c7Ci0gICAgfQotCi0gICAgIyBGb3IgbWFjcm9zLCB1c2UgXCB0byByZWZlcmVuY2UgZm9ybWFsIHBhcmFtcwotIyAgIHMvXCQvXFwvZzsgICAgICAgICAgICAgICAgICAjIEVuZCBtYWNybyBkZWZpbml0aW9uCi0gICAgcy9NRU5ELy5lbmRtLzsgICAgICAgICAgICAgICMgTm8gbmVlZCB0byB0ZWxsIGl0IHdoZXJlIHRvIHN0b3AgYXNzZW1ibGluZwotICAgIG5leHQgaWYgL15ccypFTkRccyokLzsKLSAgICBwcmludDsKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL21ha2UvY29uZmlndXJlLnNoIGIvYnVpbGQvbWFrZS9jb25maWd1cmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0OGZkOWYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZS9jb25maWd1cmUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIwotIyMgIGNvbmZpZ3VyZS5zaAotIyMKLSMjICBUaGlzIHNjcmlwdCBpcyBzb3VyY2VkIGJ5IHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGNvbnRhaW5zCi0jIyAgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIG90aGVyIGNvbW1vbiBiaXRzIHRoYXQgYXJlbid0IHN0cmljdGx5IGxpYnZweAotIyMgIHJlbGF0ZWQuCi0jIwotIyMgIFRoaXMgYnVpbGQgc3lzdGVtIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIEZGbXBlZyBjb25maWd1cmUgc2NyaXB0LgotIyMKLQotCi0jCi0jIExvZ2dpbmcgLyBPdXRwdXQgRnVuY3Rpb25zCi0jCi1kaWVfdW5rbm93bigpewotICAgIGVjaG8gIlVua25vd24gb3B0aW9uIFwiJDFcIi4iCi0gICAgZWNobyAiU2VlICQwIC0taGVscCBmb3IgYXZhaWxhYmxlIG9wdGlvbnMuIgotICAgIGNsZWFuX3RlbXBfZmlsZXMKLSAgICBleGl0IDEKLX0KLQotCi1kaWUoKSB7Ci0gICAgZWNobyAiJEAiCi0gICAgZWNobwotICAgIGVjaG8gIkNvbmZpZ3VyYXRpb24gZmFpbGVkLiBUaGlzIGNvdWxkIHJlZmxlY3QgYSBtaXNjb25maWd1cmF0aW9uIG9mIHlvdXIiCi0gICAgZWNobyAidG9vbGNoYWlucywgaW1wcm9wZXIgb3B0aW9ucyBzZWxlY3RlZCwgb3IgYW5vdGhlciBwcm9ibGVtLiBJZiB5b3UiCi0gICAgZWNobyAiZG9uJ3Qgc2VlIGFueSB1c2VmdWwgZXJyb3IgbWVzc2FnZXMgYWJvdmUsIHRoZSBuZXh0IHN0ZXAgaXMgdG8gbG9vayIKLSAgICBlY2hvICJhdCB0aGUgY29uZmlndXJlIGVycm9yIGxvZyBmaWxlICgkbG9nZmlsZSkgdG8gZGV0ZXJtaW5lIHdoYXQiCi0gICAgZWNobyAiY29uZmlndXJlIHdhcyB0cnlpbmcgdG8gZG8gd2hlbiBpdCBkaWVkLiIKLSAgICBjbGVhbl90ZW1wX2ZpbGVzCi0gICAgZXhpdCAxCi19Ci0KLQotbG9nKCl7Ci0gICAgZWNobyAiJEAiID4+JGxvZ2ZpbGUKLX0KLQotCi1sb2dfZmlsZSgpewotICAgIGxvZyBCRUdJTiAkMQotICAgIHByIC1uIC10ICQxID4+JGxvZ2ZpbGUKLSAgICBsb2cgRU5EICQxCi19Ci0KLQotbG9nX2VjaG8oKSB7Ci0gICAgZWNobyAiJEAiCi0gICAgbG9nICIkQCIKLX0KLQotCi1md3JpdGUgKCkgewotICAgIG91dGZpbGU9JDEKLSAgICBzaGlmdAotICAgIGVjaG8gIiRAIiA+PiAke291dGZpbGV9Ci19Ci0KLQotc2hvd19oZWxwX3ByZSgpewotICAgIGZvciBvcHQgaW4gJHtDTURMSU5FX1NFTEVDVH07IGRvCi0gICAgICAgIG9wdDI9YGVjaG8gJG9wdCB8IHNlZCAtZSAncztfOy07ZydgCi0gICAgICAgIGlmIGVuYWJsZWQgJG9wdDsgdGhlbgotICAgICAgICAgICAgZXZhbCAidG9nZ2xlXyR7b3B0fT1cIi0tZGlzYWJsZS0ke29wdDJ9XCIiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV2YWwgInRvZ2dsZV8ke29wdH09XCItLWVuYWJsZS0ke29wdDJ9IFwiIgotICAgICAgICBmaQotICAgIGRvbmUKLQotICAgIGNhdCA8PEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10KLU9wdGlvbnM6Ci0KLUJ1aWxkIG9wdGlvbnM6Ci0gIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1sb2c9eWVzfG5vfEZJTEUgICAgICAgICAgIGZpbGUgY29uZmlndXJlIGxvZyBpcyB3cml0dGVuIHRvIFtjb25maWcuZXJyXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICAgICAgdGFyZ2V0IHBsYXRmb3JtIHR1cGxlIFtnZW5lcmljLWdudV0KLSAgLS1jcHU9Q1BVICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBhIHNwZWNpZmljIGNwdSByYXRoZXIgdGhhbiBhIGZhbWlseQotICAtLWV4dHJhLWNmbGFncz1FQ0ZMQUdTICAgICAgYWRkIEVDRkxBR1MgdG8gQ0ZMQUdTIFskQ0ZMQUdTXQotICAke3RvZ2dsZV9leHRyYV93YXJuaW5nc30gICAgZW1pdCBoYXJtbGVzcyB3YXJuaW5ncyAoYWx3YXlzIG5vbi1mYXRhbCkKLSAgJHt0b2dnbGVfd2Vycm9yfSAgICAgICAgICAgIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycywgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgYXZhaWxhYmxlIHdpdGggYWxsIGNvbXBpbGVycykKLSAgJHt0b2dnbGVfb3B0aW1pemF0aW9uc30gICAgIHR1cm4gb24vb2ZmIGNvbXBpbGVyIG9wdGltaXphdGlvbiBmbGFncwotICAke3RvZ2dsZV9waWN9ICAgICAgICAgICAgICAgdHVybiBvbi9vZmYgUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZQotICAke3RvZ2dsZV9jY2FjaGV9ICAgICAgICAgICAgdHVybiBvbi9vZmYgY29tcGlsZXIgY2FjaGUKLSAgJHt0b2dnbGVfZGVidWd9ICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlIGRlYnVnIG1vZGUKLSAgJHt0b2dnbGVfZ3Byb2Z9ICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlIGdwcm9mIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24KLSAgJHt0b2dnbGVfZ2Nvdn0gICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlIGdjb3YgY292ZXJhZ2UgaW5zdHJ1bWVudGF0aW9uCi0KLUluc3RhbGwgb3B0aW9uczoKLSAgJHt0b2dnbGVfaW5zdGFsbF9kb2NzfSAgICAgIGNvbnRyb2wgd2hldGhlciBkb2NzIGFyZSBpbnN0YWxsZWQKLSAgJHt0b2dnbGVfaW5zdGFsbF9iaW5zfSAgICAgIGNvbnRyb2wgd2hldGhlciBiaW5hcmllcyBhcmUgaW5zdGFsbGVkCi0gICR7dG9nZ2xlX2luc3RhbGxfbGlic30gICAgICBjb250cm9sIHdoZXRoZXIgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQKLSAgJHt0b2dnbGVfaW5zdGFsbF9zcmNzfSAgICAgIGNvbnRyb2wgd2hldGhlciBzb3VyY2VzIGFyZSBpbnN0YWxsZWQKLQotCi1FT0YKLX0KLQotCi1zaG93X2hlbHBfcG9zdCgpewotICAgIGNhdCA8PEVPRgotCi0KLU5PVEVTOgotICAgIE9iamVjdCBmaWxlcyBhcmUgYnVpbHQgYXQgdGhlIHBsYWNlIHdoZXJlIGNvbmZpZ3VyZSBpcyBsYXVuY2hlZC4KLQotICAgIEFsbCBib29sZWFuIG9wdGlvbnMgY2FuIGJlIG5lZ2F0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBvcHBvc2l0ZQotICAgIG9mIHRoYXQgc2hvd24gYWJvdmUuIElmIHRoZSBvcHRpb24gLS1kaXNhYmxlLWZvbyBpcyBsaXN0ZWQsIHRoZW4KLSAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZm9vIGlzIGVuYWJsZWQuCi0KLVN1cHBvcnRlZCB0YXJnZXRzOgotRU9GCi0gIHNob3dfdGFyZ2V0cyAke2FsbF9wbGF0Zm9ybXN9Ci0gIGVjaG8KLSAgZXhpdCAxCi19Ci0KLQotc2hvd190YXJnZXRzKCkgewotICAgIHdoaWxlIFsgLW4gIiQqIiBdOyBkbwotICAgICAgICBpZiBbICIkezElJS0qfSIgPSAiJHsyJSUtKn0iIF07IHRoZW4KLSAgICAgICAgICAgIGlmIFsgIiR7MiUlLSp9IiA9ICIkezMlJS0qfSIgXTsgdGhlbgotICAgICAgICAgICAgICAgIHByaW50ZiAiICAgICUtMjRzICUtMjRzICUtMjRzXG4iICIkMSIgIiQyIiAiJDMiCi0gICAgICAgICAgICAgICAgc2hpZnQ7IHNoaWZ0OyBzaGlmdAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZiAiICAgICUtMjRzICUtMjRzXG4iICIkMSIgIiQyIgotICAgICAgICAgICAgICAgIHNoaWZ0OyBzaGlmdAotICAgICAgICAgICAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmICIgICAgJS0yNHNcbiIgIiQxIgotICAgICAgICAgICAgc2hpZnQKLSAgICAgICAgZmkKLSAgICBkb25lCi19Ci0KLQotc2hvd19oZWxwKCkgewotICAgIHNob3dfaGVscF9wcmUKLSAgICBzaG93X2hlbHBfcG9zdAotfQotCi0jCi0jIExpc3QgUHJvY2Vzc2luZyBGdW5jdGlvbnMKLSMKLXNldF9hbGwoKXsKLSAgICB2YWx1ZT0kMQotICAgIHNoaWZ0Ci0gICAgZm9yIHZhciBpbiAkKjsgZG8KLSAgICAgICAgZXZhbCAkdmFyPSR2YWx1ZQotICAgIGRvbmUKLX0KLQotCi1pc19pbigpewotICAgIHZhbHVlPSQxCi0gICAgc2hpZnQKLSAgICBmb3IgdmFyIGluICQqOyBkbwotICAgICAgICBbICR2YXIgPSAkdmFsdWUgXSAmJiByZXR1cm4gMAotICAgIGRvbmUKLSAgICByZXR1cm4gMQotfQotCi0KLWFkZF9jZmxhZ3MoKSB7Ci0gICAgQ0ZMQUdTPSIke0NGTEFHU30gJEAiCi19Ci0KLQotYWRkX2xkZmxhZ3MoKSB7Ci0gICAgTERGTEFHUz0iJHtMREZMQUdTfSAkQCIKLX0KLQotCi1hZGRfYXNmbGFncygpIHsKLSAgICBBU0ZMQUdTPSIke0FTRkxBR1N9ICRAIgotfQotCi0KLWFkZF9leHRyYWxpYnMoKSB7Ci0gICAgZXh0cmFsaWJzPSIke2V4dHJhbGlic30gJEAiCi19Ci0KLSMKLSMgQm9vbGVhbiBNYW5pcHVsYXRpb24gRnVuY3Rpb25zCi0jCi1lbmFibGUoKXsKLSAgICBzZXRfYWxsIHllcyAkKgotfQotCi1kaXNhYmxlKCl7Ci0gICAgc2V0X2FsbCBubyAkKgotfQotCi1lbmFibGVkKCl7Ci0gICAgZXZhbCB0ZXN0ICJ4XCQkMSIgPSAieHllcyIKLX0KLQotZGlzYWJsZWQoKXsKLSAgICBldmFsIHRlc3QgInhcJCQxIiA9ICJ4bm8iCi19Ci0KLQotc29mdF9lbmFibGUoKSB7Ci0gICAgZm9yIHZhciBpbiAkKjsgZG8KLSAgICAgICAgaWYgISBkaXNhYmxlZCAkdmFyOyB0aGVuCi0gICAgICAgICAgICBsb2dfZWNobyAiICBlbmFibGluZyAkdmFyIgotICAgICAgICAgICAgZW5hYmxlICR2YXIKLSAgICAgICAgZmkKLSAgICBkb25lCi19Ci0KLXNvZnRfZGlzYWJsZSgpIHsKLSAgICBmb3IgdmFyIGluICQqOyBkbwotICAgICAgICBpZiAhIGVuYWJsZWQgJHZhcjsgdGhlbgotICAgICAgICAgICAgbG9nX2VjaG8gIiAgZGlzYWJsaW5nICR2YXIiCi0gICAgICAgICAgICBkaXNhYmxlICR2YXIKLSAgICAgICAgZmkKLSAgICBkb25lCi19Ci0KLQotIwotIyBUZXh0IFByb2Nlc3NpbmcgRnVuY3Rpb25zCi0jCi10b3VwcGVyKCl7Ci0gICAgZWNobyAiJEAiIHwgdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoKLX0KLQotCi10b2xvd2VyKCl7Ci0gICAgZWNobyAiJEAiIHwgdHIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKLX0KLQotCi0jCi0jIFRlbXBvcmFyeSBGaWxlIEZ1bmN0aW9ucwotIwotc291cmNlX3BhdGg9JHswJS8qfQotZW5hYmxlIHNvdXJjZV9wYXRoX3VzZWQKLWlmIHRlc3QgLXogIiRzb3VyY2VfcGF0aCIgLW8gIiRzb3VyY2VfcGF0aCIgPSAiLiIgOyB0aGVuCi0gICAgc291cmNlX3BhdGg9ImBwd2RgIgotICAgIGRpc2FibGUgc291cmNlX3BhdGhfdXNlZAotZmkKLQotaWYgdGVzdCAhIC16ICIkVE1QRElSIiA7IHRoZW4KLSAgICBUTVBESVJ4PSIke1RNUERJUn0iCi1lbGlmIHRlc3QgISAteiAiJFRFTVBESVIiIDsgdGhlbgotICAgIFRNUERJUng9IiR7VEVNUERJUn0iCi1lbHNlCi0gICAgVE1QRElSeD0iL3RtcCIKLWZpCi1UTVBfSD0iJHtUTVBESVJ4fS92cHgtY29uZi0kJC0ke1JBTkRPTX0uaCIKLVRNUF9DPSIke1RNUERJUnh9L3ZweC1jb25mLSQkLSR7UkFORE9NfS5jIgotVE1QX089IiR7VE1QRElSeH0vdnB4LWNvbmYtJCQtJHtSQU5ET019Lm8iCi1UTVBfWD0iJHtUTVBESVJ4fS92cHgtY29uZi0kJC0ke1JBTkRPTX0ueCIKLVRNUF9BU009IiR7VE1QRElSeH0vdnB4LWNvbmYtJCQtJHtSQU5ET019LmFzbSIKLQotY2xlYW5fdGVtcF9maWxlcygpIHsKLSAgICBybSAtZiAke1RNUF9DfSAke1RNUF9IfSAke1RNUF9PfSAke1RNUF9YfSAke1RNUF9BU019Ci19Ci0KLSMKLSMgVG9vbGNoYWluIENoZWNrIEZ1bmN0aW9ucwotIwotY2hlY2tfY21kKCkgewotICAgIGxvZyAiJEAiCi0gICAgIiRAIiA+PiR7bG9nZmlsZX0gMj4mMQotfQotCi1jaGVja19jYygpIHsKLSAgICBsb2cgY2hlY2tfY2MgIiRAIgotICAgIGNhdCA+JHtUTVBfQ30KLSAgICBsb2dfZmlsZSAke1RNUF9DfQotICAgIGNoZWNrX2NtZCAke0NDfSAke0NGTEFHU30gIiRAIiAtYyAtbyAke1RNUF9PfSAke1RNUF9DfQotfQotCi1jaGVja19jcHAoKSB7Ci0gICAgbG9nIGNoZWNrX2NwcCAiJEAiCi0gICAgY2F0ID4gJHtUTVBfQ30KLSAgICBsb2dfZmlsZSAke1RNUF9DfQotICAgIGNoZWNrX2NtZCAke0NDfSAke0NGTEFHU30gIiRAIiAtRSAtbyAke1RNUF9PfSAke1RNUF9DfQotfQotCi1jaGVja19sZCgpIHsKLSAgICBsb2cgY2hlY2tfbGQgIiRAIgotICAgIGNoZWNrX2NjICRAIFwKLSAgICAgICAgJiYgY2hlY2tfY21kICR7TER9ICR7TERGTEFHU30gIiRAIiAtbyAke1RNUF9YfSAke1RNUF9PfSAke2V4dHJhbGlic30KLX0KLQotY2hlY2tfaGVhZGVyKCl7Ci0gICAgbG9nIGNoZWNrX2hlYWRlciAiJEAiCi0gICAgaGVhZGVyPSQxCi0gICAgc2hpZnQKLSAgICB2YXI9YGVjaG8gJGhlYWRlciB8IHNlZCAncy9bXkEtWmEtejAtOV9dL18vZydgCi0gICAgZGlzYWJsZSAkdmFyCi0gICAgY2hlY2tfY3BwICIkQCIgPDxFT0YgJiYgZW5hYmxlICR2YXIKLSNpbmNsdWRlICIkaGVhZGVyIgotaW50IHg7Ci1FT0YKLX0KLQotCi1jaGVja19jZmxhZ3MoKSB7Ci0gICAgbG9nIGNoZWNrX2NmbGFncyAiJEAiCi0gICAgY2hlY2tfY2MgIiRAIiA8PEVPRgotaW50IHg7Ci1FT0YKLX0KLQotY2hlY2tfYWRkX2NmbGFncygpIHsKLSAgICBjaGVja19jZmxhZ3MgIiRAIiAmJiBhZGRfY2ZsYWdzICIkQCIKLX0KLQotY2hlY2tfYWRkX2FzZmxhZ3MoKSB7Ci0gICAgbG9nIGFkZF9hc2ZsYWdzICIkQCIKLSAgICBhZGRfYXNmbGFncyAiJEAiCi19Ci0KLWNoZWNrX2FkZF9sZGZsYWdzKCkgewotICAgIGxvZyBhZGRfbGRmbGFncyAiJEAiCi0gICAgYWRkX2xkZmxhZ3MgIiRAIgotfQotCi1jaGVja19hc21fYWxpZ24oKSB7Ci0gICAgbG9nIGNoZWNrX2FzbV9hbGlnbiAiJEAiCi0gICAgY2F0ID4ke1RNUF9BU019IDw8RU9GCi1zZWN0aW9uIC5yb2RhdGEKLWFsaWduIDE2Ci1FT0YKLSAgICBsb2dfZmlsZSAke1RNUF9BU019Ci0gICAgY2hlY2tfY21kICR7QVN9ICR7QVNGTEFHU30gLW8gJHtUTVBfT30gJHtUTVBfQVNNfQotICAgIHJlYWRlbGYgLVdTICR7VE1QX099ID4ke1RNUF9YfQotICAgIGxvZ19maWxlICR7VE1QX1h9Ci0gICAgaWYgISBncmVwIC1xICdcLnJvZGF0YSAuKiAxNiQnICR7VE1QX1h9OyB0aGVuCi0gICAgICAgIGRpZSAiJHtBU30gJHtBU0ZMQUdTfSBkb2VzIG5vdCBzdXBwb3J0IHNlY3Rpb24gYWxpZ25tZW50IChuYXNtIDw9Mi4wOD8pIgotICAgIGZpCi19Ci0KLXdyaXRlX2NvbW1vbl9jb25maWdfYmFubmVyKCkgewotICAgIGVjaG8gJyMgVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gbm90IGVkaXQhJyA+IGNvbmZpZy5tawotICAgIGVjaG8gIlRPT0xDSEFJTiA6PSAke3Rvb2xjaGFpbn0iID4+IGNvbmZpZy5tawotCi0gICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KLSAgICAgICAgKi1saW51eC1ydmN0KQotICAgICAgICAgICAgZWNobyAiQUxUX0xJQkMgOj0gJHthbHRfbGliY30iID4+IGNvbmZpZy5tawotICAgICAgICAgICAgOzsKLSAgICBlc2FjCi19Ci0KLXdyaXRlX2NvbW1vbl9jb25maWdfdGFyZ2V0cygpIHsKLSAgICBmb3IgdCBpbiAke2FsbF90YXJnZXRzfTsgZG8KLSAgICAgICAgaWYgZW5hYmxlZCAke3R9OyB0aGVuCi0gICAgICAgICAgICBpZiBlbmFibGVkIHVuaXZlcnNhbCB8fCBlbmFibGVkIGNoaWxkOyB0aGVuCi0gICAgICAgICAgICAgICAgZndyaXRlIGNvbmZpZy5tayAiQUxMX1RBUkdFVFMgKz0gJHt0fS0ke3Rvb2xjaGFpbn0iCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZndyaXRlIGNvbmZpZy5tayAiQUxMX1RBUkdFVFMgKz0gJHt0fSIKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgdHJ1ZTsKLSAgICBkb25lCi10cnVlCi19Ci0KLXdyaXRlX2NvbW1vbl90YXJnZXRfY29uZmlnX21rKCkgewotICAgIGxvY2FsIENDPSR7Q0N9Ci0gICAgZW5hYmxlZCBjY2FjaGUgJiYgQ0M9ImNjYWNoZSAke0NDfSIKLQotICAgIGNhdCA+ICQxIDw8IEVPRgotIyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEKLVNSQ19QQVRIPSIkc291cmNlX3BhdGgiCi1TUkNfUEFUSF9CQVJFPSRzb3VyY2VfcGF0aAotQlVJTERfUEZYPSR7QlVJTERfUEZYfQotVE9PTENIQUlOPSR7dG9vbGNoYWlufQotQVNNX0NPTlZFUlNJT049JHthc21fY29udmVyc2lvbl9jbWQ6LSR7c291cmNlX3BhdGh9L2J1aWxkL21ha2UvYWRzMmdhcy5wbH0KLQotQ0M9JHtDQ30KLUFSPSR7QVJ9Ci1MRD0ke0xEfQotQVM9JHtBU30KLVNUUklQPSR7U1RSSVB9Ci1OTT0ke05NfQotCi1DRkxBR1MgID0gJHtDRkxBR1N9Ci1BUkZMQUdTID0gLXJ1c1wkKGlmIFwkKHF1aWV0KSxjLHYpCi1MREZMQUdTID0gJHtMREZMQUdTfQotQVNGTEFHUyA9ICR7QVNGTEFHU30KLWV4dHJhbGlicyA9ICR7ZXh0cmFsaWJzfQotQVNfU0ZYICAgID0gJHtBU19TRlg6LS5hc219Ci1FT0YKLQotICAgIGlmIGVuYWJsZWQgcnZjdDsgdGhlbiBjYXQgPj4gJDEgPDwgRU9GCi1mbXRfZGVwcyA9IHNlZCAtZSAnczteX19pbWFnZS5heGY7XCQoZGlyIFwkQClcJChub3RkaXIgXCQ8KS5vIFwkQDsnICNoaWRlCi1FT0YKLSAgICBlbHNlIGNhdCA+PiAkMSA8PCBFT0YKLWZtdF9kZXBzID0gc2VkIC1lICdzO15cKFthLXpBLVowLTlfXSpcKVwubztcJChkaXIgXCRAKVwxXCQoc3VmZml4IFwkPCkubyBcJEA7JwotRU9GCi0gICAgZmkKLQotICAgIHByaW50X2NvbmZpZ19tayBBUkNIICAgIiR7MX0iICR7QVJDSF9MSVNUfQotICAgIHByaW50X2NvbmZpZ19tayBIQVZFICAgIiR7MX0iICR7SEFWRV9MSVNUfQotICAgIHByaW50X2NvbmZpZ19tayBDT05GSUcgIiR7MX0iICR7Q09ORklHX0xJU1R9Ci0gICAgcHJpbnRfY29uZmlnX21rIEhBVkUgICAiJHsxfSIgZ251X3N0cmlwCi0KLSAgICBlbmFibGVkIG1zdnMgJiYgZWNobyAiQ09ORklHX1ZTX1ZFUlNJT049JHt2c192ZXJzaW9ufSIgPj4gIiR7MX0iCi0KLX0KLQotCi13cml0ZV9jb21tb25fdGFyZ2V0X2NvbmZpZ19oKCkgewotICAgIGNhdCA+ICR7VE1QX0h9IDw8IEVPRgotLyogVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gbm90IGVkaXQhICovCi0jZGVmaW5lIFJFU1RSSUNUICAgICR7UkVTVFJJQ1R9Ci1FT0YKLSAgICBwcmludF9jb25maWdfaCBBUkNIICAgIiR7VE1QX0h9IiAke0FSQ0hfTElTVH0KLSAgICBwcmludF9jb25maWdfaCBIQVZFICAgIiR7VE1QX0h9IiAke0hBVkVfTElTVH0KLSAgICBwcmludF9jb25maWdfaCBDT05GSUcgIiR7VE1QX0h9IiAke0NPTkZJR19MSVNUfQotICAgIG1rZGlyIC1wIGBkaXJuYW1lICIkMSJgCi0gICAgY21wICIkMSIgJHtUTVBfSH0gPi9kZXYvbnVsbCAyPiYxIHx8IG12ICR7VE1QX0h9ICIkMSIKLX0KLQotcHJvY2Vzc19jb21tb25fY21kbGluZSgpIHsKLSAgICBmb3Igb3B0IGluICIkQCI7IGRvCi0gICAgICAgIG9wdHZhbD0iJHtvcHQjKj19IgotICAgICAgICBjYXNlICIkb3B0IiBpbgotICAgICAgICAtLWNoaWxkKSBlbmFibGUgY2hpbGQKLSAgICAgICAgOzsKLSAgICAgICAgLS1sb2cqKQotICAgICAgICBsb2dnaW5nPSIkb3B0dmFsIgotICAgICAgICBpZiAhIGRpc2FibGVkIGxvZ2dpbmcgOyB0aGVuCi0gICAgICAgICAgICBlbmFibGVkIGxvZ2dpbmcgfHwgbG9nZmlsZT0iJGxvZ2dpbmciCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxvZ2ZpbGU9L2Rldi9udWxsCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICAgIC0tdGFyZ2V0PSopIHRvb2xjaGFpbj0iJHt0b29sY2hhaW46LSR7b3B0dmFsfX0iCi0gICAgICAgIDs7Ci0gICAgICAgIC0tZm9yY2UtdGFyZ2V0PSopIHRvb2xjaGFpbj0iJHt0b29sY2hhaW46LSR7b3B0dmFsfX0iOyBlbmFibGUgZm9yY2VfdG9vbGNoYWluCi0gICAgICAgIDs7Ci0gICAgICAgIC0tY3B1KQotICAgICAgICA7OwotICAgICAgICAtLWNwdT0qKSB0dW5lX2NwdT0iJG9wdHZhbCIKLSAgICAgICAgOzsKLSAgICAgICAgLS1leHRyYS1jZmxhZ3M9KikKLSAgICAgICAgZXh0cmFfY2ZsYWdzPSIke29wdHZhbH0iCi0gICAgICAgIDs7Ci0gICAgICAgIC0tZW5hYmxlLT8qfC0tZGlzYWJsZS0/KikKLSAgICAgICAgZXZhbCBgZWNobyAiJG9wdCIgfCBzZWQgJ3MvLS0vYWN0aW9uPS87cy8tLyBvcHRpb249LztzLy0vXy9nJ2AKLSAgICAgICAgZWNobyAiJHtDTURMSU5FX1NFTEVDVH0gJHtBUkNIX0VYVF9MSVNUfSIgfCBncmVwICJeICokb3B0aW9uXCQiID4vZGV2L251bGwgfHwgZGllX3Vua25vd24gJG9wdAotICAgICAgICAkYWN0aW9uICRvcHRpb24KLSAgICAgICAgOzsKLSAgICAgICAgLS1mb3JjZS1lbmFibGUtPyp8LS1mb3JjZS1kaXNhYmxlLT8qKQotICAgICAgICBldmFsIGBlY2hvICIkb3B0IiB8IHNlZCAncy8tLWZvcmNlLS9hY3Rpb249LztzLy0vIG9wdGlvbj0vO3MvLS9fL2cnYAotICAgICAgICAkYWN0aW9uICRvcHRpb24KLSAgICAgICAgOzsKLSAgICAgICAgLS1saWJjPSopCi0gICAgICAgIFsgLWQgIiR7b3B0dmFsfSIgXSB8fCBkaWUgIk5vdCBhIGRpcmVjdG9yeTogJHtvcHR2YWx9IgotICAgICAgICBkaXNhYmxlIGJ1aWx0aW5fbGliYwotICAgICAgICBhbHRfbGliYz0iJHtvcHR2YWx9IgotICAgICAgICA7OwotICAgICAgICAtLWFzPSopCi0gICAgICAgIFsgIiR7b3B0dmFsfSIgPSB5YXNtIC1vICIke29wdHZhbH0iID0gbmFzbSAtbyAiJHtvcHR2YWx9IiA9IGF1dG8gXSBcCi0gICAgICAgICAgICB8fCBkaWUgIk11c3QgYmUgeWFzbSwgbmFzbSBvciBhdXRvOiAke29wdHZhbH0iCi0gICAgICAgIGFsdF9hcz0iJHtvcHR2YWx9IgotICAgICAgICA7OwotICAgICAgICAtLXByZWZpeD0qKQotICAgICAgICBwcmVmaXg9IiR7b3B0dmFsfSIKLSAgICAgICAgOzsKLSAgICAgICAgLS1saWJkaXI9KikKLSAgICAgICAgbGliZGlyPSIke29wdHZhbH0iCi0gICAgICAgIDs7Ci0gICAgICAgIC0tbGliY3wtLWFzfC0tcHJlZml4fC0tbGliZGlyKQotICAgICAgICBkaWUgIk9wdGlvbiAke29wdH0gcmVxdWlyZXMgYXJndW1lbnQiCi0gICAgICAgIDs7Ci0gICAgICAgIC0taGVscHwtaCkgc2hvd19oZWxwCi0gICAgICAgIDs7Ci0gICAgICAgICopIGRpZV91bmtub3duICRvcHQKLSAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgIGRvbmUKLX0KLQotcHJvY2Vzc19jbWRsaW5lKCkgewotICAgIGZvciBvcHQgZG8KLSAgICAgICAgb3B0dmFsPSIke29wdCMqPX0iCi0gICAgICAgIGNhc2UgIiRvcHQiIGluCi0gICAgICAgICopIHByb2Nlc3NfY29tbW9uX2NtZGxpbmUgJG9wdAotICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgZG9uZQotfQotCi0KLXBvc3RfcHJvY2Vzc19jb21tb25fY21kbGluZSgpIHsKLSAgICBwcmVmaXg9IiR7cHJlZml4Oi0vdXNyL2xvY2FsfSIKLSAgICBwcmVmaXg9IiR7cHJlZml4JS99IgotICAgIGxpYmRpcj0iJHtsaWJkaXI6LSR7cHJlZml4fS9saWJ9IgotICAgIGxpYmRpcj0iJHtsaWJkaXIlL30iCi0gICAgaWYgWyAiJHtsaWJkaXIjJHtwcmVmaXh9fSIgPSAiJHtsaWJkaXJ9IiBdOyB0aGVuCi0gICAgICAgIGRpZSAiTGliZGlyICR7bGliZGlyfSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mICR7cHJlZml4fSIKLSAgICBmaQotfQotCi0KLXBvc3RfcHJvY2Vzc19jbWRsaW5lKCkgewotICAgIHRydWU7Ci19Ci0KLXNldHVwX2dudV90b29sY2hhaW4oKSB7Ci0gICAgICAgIENDPSR7Q0M6LSR7Q1JPU1N9Z2NjfQotICAgICAgICBBUj0ke0FSOi0ke0NST1NTfWFyfQotICAgICAgICBMRD0ke0xEOi0ke0NST1NTfSR7bGlua193aXRoX2NjOi1sZH19Ci0gICAgICAgIEFTPSR7QVM6LSR7Q1JPU1N9YXN9Ci0gICAgU1RSSVA9JHtTVFJJUDotJHtDUk9TU31zdHJpcH0KLSAgICBOTT0ke05NOi0ke0NST1NTfW5tfQotICAgICAgICBBU19TRlg9LnMKLX0KLQotcHJvY2Vzc19jb21tb25fdG9vbGNoYWluKCkgewotICAgIGlmIFsgLXogIiR0b29sY2hhaW4iIF07IHRoZW4KLSAgICAgICAgZ2NjdGFyZ2V0PSIkKGdjYyAtZHVtcG1hY2hpbmUgMj4gL2Rldi9udWxsKSIKLQotICAgICAgICAjIGRldGVjdCB0Z3RfaXNhCi0gICAgICAgIGNhc2UgIiRnY2N0YXJnZXQiIGluCi0gICAgICAgICAgICAqeDg2XzY0KnwqYW1kNjQqKQotICAgICAgICAgICAgICAgIHRndF9pc2E9eDg2XzY0Ci0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICppWzM0NTZdODYqKQotICAgICAgICAgICAgICAgIHRndF9pc2E9eDg2Ci0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICpwb3dlcnBjNjQqKQotICAgICAgICAgICAgICAgIHRndF9pc2E9cHBjNjQKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKnBvd2VycGMqKQotICAgICAgICAgICAgICAgIHRndF9pc2E9cHBjMzIKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKnNwYXJjKikKLSAgICAgICAgICAgICAgICB0Z3RfaXNhPXNwYXJjCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgICMgZGV0ZWN0IHRndF9vcwotICAgICAgICBjYXNlICIkZ2NjdGFyZ2V0IiBpbgotICAgICAgICAgICAgKmRhcndpbjgqKQotICAgICAgICAgICAgICAgIHRndF9pc2E9dW5pdmVyc2FsCi0gICAgICAgICAgICAgICAgdGd0X29zPWRhcndpbjgKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKmRhcndpbjkqKQotICAgICAgICAgICAgICAgIHRndF9pc2E9dW5pdmVyc2FsCi0gICAgICAgICAgICAgICAgdGd0X29zPWRhcndpbjkKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKmRhcndpbjEwKikKLSAgICAgICAgICAgICAgICB0Z3RfaXNhPXg4Nl82NAotICAgICAgICAgICAgICAgIHRndF9vcz1kYXJ3aW4xMAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAqbWluZ3czMip8KmN5Z3dpbiopCi0gICAgICAgICAgICAgICAgWyAteiAiJHRndF9pc2EiIF0gJiYgdGd0X2lzYT14ODYKLSAgICAgICAgICAgICAgICB0Z3Rfb3M9d2luMzIKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKmxpbnV4KnwqYnNkKikKLSAgICAgICAgICAgICAgICB0Z3Rfb3M9bGludXgKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKnNvbGFyaXMyLjEwKQotICAgICAgICAgICAgICAgIHRndF9vcz1zb2xhcmlzCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGlmIFsgLW4gIiR0Z3RfaXNhIiBdICYmIFsgLW4gIiR0Z3Rfb3MiIF07IHRoZW4KLSAgICAgICAgICAgIHRvb2xjaGFpbj0ke3RndF9pc2F9LSR7dGd0X29zfS1nY2MKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgdG9vbGNoYWluPSR7dG9vbGNoYWluOi1nZW5lcmljLWdudX0KLQotICAgIGlzX2luICR7dG9vbGNoYWlufSAke2FsbF9wbGF0Zm9ybXN9IHx8IGVuYWJsZWQgZm9yY2VfdG9vbGNoYWluIFwKLSAgICAgICAgfHwgZGllICJVbnJlY29nbml6ZWQgdG9vbGNoYWluICcke3Rvb2xjaGFpbn0nIgotCi0gICAgZW5hYmxlZCBjaGlsZCB8fCBsb2dfZWNobyAiQ29uZmlndXJpbmcgZm9yIHRhcmdldCAnJHt0b29sY2hhaW59JyIKLQotICAgICMKLSAgICAjIFNldCB1cCB0b29sY2hhaW4gdmFyaWFibGVzCi0gICAgIwotICAgIHRndF9pc2E9JChlY2hvICR7dG9vbGNoYWlufSB8IGF3ayAnQkVHSU57RlM9Ii0ifXtwcmludCAkMX0nKQotICAgIHRndF9vcz0kKGVjaG8gJHt0b29sY2hhaW59IHwgYXdrICdCRUdJTntGUz0iLSJ9e3ByaW50ICQyfScpCi0gICAgdGd0X2NjPSQoZWNobyAke3Rvb2xjaGFpbn0gfCBhd2sgJ0JFR0lOe0ZTPSItIn17cHJpbnQgJDN9JykKLQotICAgICMgTWFyayB0aGUgc3BlY2lmaWMgSVNBIHJlcXVlc3RlZCBhcyBlbmFibGVkCi0gICAgc29mdF9lbmFibGUgJHt0Z3RfaXNhfQotICAgIGVuYWJsZSAke3RndF9vc30KLSAgICBlbmFibGUgJHt0Z3RfY2N9Ci0KLSAgICAjIEVuYWJsZSB0aGUgYXJjaGl0ZWN0dXJlIGZhbWlseQotICAgIGNhc2UgJHt0Z3RfaXNhfSBpbgotICAgICAgICBhcm0qfGl3bW14dCopIGVuYWJsZSBhcm07OwotICAgIG1pcHMqKSAgICAgICAgZW5hYmxlIG1pcHM7OwotICAgIGVzYWMKLQotICAgICMgUElDIGlzIHByb2JhYmx5IHdoYXQgd2Ugd2FudCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJzCi0gICAgZW5hYmxlZCBzaGFyZWQgJiYgc29mdF9lbmFibGUgcGljCi0KLSAgICAjIEhhbmRsZSBkYXJ3aW4gdmFyaWFudHMKLSAgICBjYXNlICR7dG9vbGNoYWlufSBpbgotICAgICAgICAqLWRhcndpbjgtKikKLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgICItaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayIKLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgICItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC40IgotICAgICAgICAgICAgYWRkX2xkZmxhZ3MgIi1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIgotICAgICAgICAgICAgYWRkX2xkZmxhZ3MgIi1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjQiCi0gICAgICAgICAgICA7OwotICAgICAgICAqLWRhcndpbjktKikKLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgICItaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjUuc2RrIgotICAgICAgICAgICAgYWRkX2NmbGFncyAgIi1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjUiCi0gICAgICAgICAgICBhZGRfbGRmbGFncyAiLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC41LnNkayIKLSAgICAgICAgICAgIGFkZF9sZGZsYWdzICItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC41IgotICAgICAgICAgICAgOzsKLSAgICAgICAgKi1kYXJ3aW4xMC0qKQotICAgICAgICAgICAgYWRkX2NmbGFncyAgIi1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNi5zZGsiCi0gICAgICAgICAgICBhZGRfY2ZsYWdzICAiLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNiIKLSAgICAgICAgICAgIGFkZF9sZGZsYWdzICItaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjYuc2RrIgotICAgICAgICAgICAgYWRkX2xkZmxhZ3MgIi1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjYiCi0gICAgICAgICAgICA7OwotICAgIGVzYWMKLQotICAgICMgSGFuZGxlIFNvbGFyaXMgdmFyaWFudHMuIFNvbGFyaXMgMTAgbmVlZHMgLWxwb3NpeDQKLSAgICBjYXNlICR7dG9vbGNoYWlufSBpbgotICAgICAgICBzcGFyYy1zb2xhcmlzLSopCi0gICAgICAgICAgICBhZGRfZXh0cmFsaWJzIC1scG9zaXg0Ci0gICAgICAgICAgICBhZGRfY2ZsYWdzICItRE1VU1RfQkVfQUxJR05FRCIKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICotc29sYXJpcy0qKQotICAgICAgICAgICAgYWRkX2V4dHJhbGlicyAtbHBvc2l4NAotICAgICAgICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFByb2Nlc3MgQVJNIGFyY2hpdGVjdHVyZSB2YXJpYW50cwotICAgIGNhc2UgJHt0b29sY2hhaW59IGluCi0gICAgYXJtKnxpd21teHQqKQotICAgICMgb24gYXJtLCBpc2EgdmVyc2lvbnMgYXJlIHN1cGVyc2V0cwotICAgIGVuYWJsZWQgYXJtdjdhICYmIHNvZnRfZW5hYmxlIGFybXY3ICMjIyBERUJVRwotICAgIGVuYWJsZWQgYXJtdjcgJiYgc29mdF9lbmFibGUgYXJtdjYKLSAgICBlbmFibGVkIGFybXY2ICYmIHNvZnRfZW5hYmxlIGFybXY1dGUKLSAgICBlbmFibGVkIGFybXY2ICYmIHNvZnRfZW5hYmxlIGZhc3RfdW5hbGlnbmVkCi0gICAgZW5hYmxlZCBpd21teHQyICYmIHNvZnRfZW5hYmxlIGl3bW14dAotICAgIGVuYWJsZWQgaXdtbXh0ICYmIHNvZnRfZW5hYmxlIGFybXY1dGUKLQotICAgIGFzbV9jb252ZXJzaW9uX2NtZD0iY2F0IgotCi0gICAgICAgIGNhc2UgJHt0Z3RfY2N9IGluCi0gICAgICAgIGdjYykKLSAgICAgICAgaWYgZW5hYmxlZCBpd21teHQgfHwgZW5hYmxlZCBpd21teHQyCi0gICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgQ1JPU1M9JHtDUk9TUzotYXJtLWl3bW14dC1saW51eC1nbnVlYWJpLX0KLSAgICAgICAgICAgIGVsaWYgZW5hYmxlZCBzeW1iaWFuOyB0aGVuCi0gICAgICAgICAgICAgICAgQ1JPU1M9JHtDUk9TUzotYXJtLW5vbmUtc3ltYmlhbmVsZi19Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQ1JPU1M9JHtDUk9TUzotYXJtLW5vbmUtbGludXgtZ251ZWFiaS19Ci0gICAgICAgICAgICBmaQotICAgICAgICAgICAgbGlua193aXRoX2NjPWdjYwotICAgICAgICAgICAgc2V0dXBfZ251X3Rvb2xjaGFpbgotICAgICAgICAgICAgYXJjaF9pbnQ9JHt0Z3RfaXNhIyNhcm12fQotICAgICAgICAgICAgYXJjaF9pbnQ9JHthcmNoX2ludCUldGV9Ci0gICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtLWRlZnN5bSBBUkNISVRFQ1RVUkU9JHthcmNoX2ludH0KLSAgICAgICAgICAgIHR1bmVfY2ZsYWdzPSItbXR1bmU9IgotICAgICAgICBpZiBlbmFibGVkIGl3bW14dCB8fCBlbmFibGVkIGl3bW14dDIKLSAgICAgICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtbWNwdT0ke3RndF9pc2F9Ci0gICAgICAgICAgICBlbGlmIGVuYWJsZWQgYXJtdjcKLSAgICAgICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1tYXJjaD1hcm12Ny1hIC1tY3B1PWNvcnRleC1hOCAtbWZwdT1uZW9uIC1tZmxvYXQtYWJpPXNvZnRmcCAgIy1mdHJlZS12ZWN0b3JpemUKLSAgICAgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtbWNwdT1jb3J0ZXgtYTggLW1mcHU9bmVvbiAtbWZsb2F0LWFiaT1zb2Z0ZnAgICMtbWFyY2g9YXJtdjctYQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLW1hcmNoPSR7dGd0X2lzYX0KLSAgICAgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtbWFyY2g9JHt0Z3RfaXNhfQotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVuYWJsZWQgZGVidWcgJiYgYWRkX2FzZmxhZ3MgLWcKLSAgICAgICAgICAgIGFzbV9jb252ZXJzaW9uX2NtZD0iJHtzb3VyY2VfcGF0aH0vYnVpbGQvbWFrZS9hZHMyZ2FzLnBsIgotICAgICAgICAgICAgOzsKLSAgICAgICAgcnZjdCkKLSAgICAgICAgICAgIENDPWFybWNjCi0gICAgICAgICAgICBBUj1hcm1hcgotICAgICAgICAgICAgQVM9YXJtYXNtCi0gICAgICAgICAgICBMRD0ke3NvdXJjZV9wYXRofS9idWlsZC9tYWtlL2FybWxpbmtfYWRhcHRlci5zaAotICAgICAgICAgICAgU1RSSVA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1zdHJpcAotICAgICAgICAgICAgTk09YXJtLW5vbmUtbGludXgtZ251ZWFiaS1ubQotICAgICAgICAgICAgdHVuZV9jZmxhZ3M9Ii0tY3B1PSIKLSAgICAgICAgICAgIHR1bmVfYXNmbGFncz0iLS1jcHU9IgotICAgICAgICAgICAgaWYgWyAteiAiJHt0dW5lX2NwdX0iIF07IHRoZW4KLSAgICAgICAgICAgIGlmIGVuYWJsZWQgYXJtdjcKLSAgICAgICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLS1jcHU9Q29ydGV4LUE4IC0tZnB1PXNvZnR2ZnArdmZwdjMKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tfYWRkX2FzZmxhZ3MgLS1jcHU9Q29ydGV4LUE4IC0tZnB1PW5vbmUKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLS1jcHU9JHt0Z3RfaXNhIyNhcm12fQotICAgICAgICAgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtLWNwdT0ke3RndF9pc2EjI2FybXZ9Ci0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBhcmNoX2ludD0ke3RndF9pc2EjI2FybXZ9Ci0gICAgICAgICAgICBhcmNoX2ludD0ke2FyY2hfaW50JSV0ZX0KLSAgICAgICAgICAgIGNoZWNrX2FkZF9hc2ZsYWdzIC0tcGQgIlwiQVJDSElURUNUVVJFIFNFVEEgJHthcmNoX2ludH1cIiIKLSAgICAgICAgICAgIGVuYWJsZWQgZGVidWcgJiYgYWRkX2FzZmxhZ3MgLWcKLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgLS1nbnUKLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgLS1lbnVtX2lzX2ludAotICAgICAgICAgICAgYWRkX2NmbGFncyAtLXdjaGFyMzIKLSAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgJHt0Z3Rfb3N9IGluCi0gICAgICAgIG5vbmUqKQotICAgICAgICAgICAgZGlzYWJsZSBtdWx0aXRocmVhZAotICAgICAgICAgICAgZGlzYWJsZSBvc19zdXBwb3J0Ci0gICAgICAgICAgICA7OwotICAgICAgICBkYXJ3aW4qKQotICAgICAgICAgICAgU0RLX1BBVEg9L0RldmVsb3Blci9QbGF0Zm9ybXMvaVBob25lT1MucGxhdGZvcm0vRGV2ZWxvcGVyCi0gICAgICAgICAgICBUT09MQ0hBSU5fUEFUSD0ke1NES19QQVRIfS91c3IvYmluCi0gICAgICAgICAgICBDQz0ke1RPT0xDSEFJTl9QQVRIfS9nY2MKLSAgICAgICAgICAgIEFSPSR7VE9PTENIQUlOX1BBVEh9L2FyCi0gICAgICAgICAgICBMRD0ke1RPT0xDSEFJTl9QQVRIfS9hcm0tYXBwbGUtZGFyd2luMTAtZ2NjLTQuMi4xCi0gICAgICAgICAgICBBUz0ke1RPT0xDSEFJTl9QQVRIfS9hcwotICAgICAgICAgICAgU1RSSVA9JHtUT09MQ0hBSU5fUEFUSH0vc3RyaXAKLSAgICAgICAgICAgIE5NPSR7VE9PTENIQUlOX1BBVEh9L25tCi0gICAgICAgICAgICBBU19TRlg9LnMKLQotICAgICAgICAgICAgIyBBU0ZMQUdTIGlzIHdyaXR0ZW4gaGVyZSBpbnN0ZWFkIG9mIHVzaW5nIGNoZWNrX2FkZF9hc2ZsYWdzCi0gICAgICAgICAgICAjIGJlY2F1c2Ugd2UgbmVlZCB0byBvdmVyd3JpdGUgYWxsIG9mIEFTRkxBR1MgYW5kIHB1cmdlIHRoZQotICAgICAgICAgICAgIyBvcHRpb25zIHRoYXQgd2VyZSBwdXQgaW4gYWJvdmUKLSAgICAgICAgICAgIEFTRkxBR1M9Ii12ZXJzaW9uIC1hcmNoICR7dGd0X2lzYX0gLWciCi0KLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgLWFyY2ggJHt0Z3RfaXNhfQotICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLWFyY2hfb25seSAke3RndF9pc2F9Ci0KLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgICItaXN5c3Jvb3QgL0RldmVsb3Blci9QbGF0Zm9ybXMvaVBob25lT1MucGxhdGZvcm0vRGV2ZWxvcGVyL1NES3MvaVBob25lT1M0LjIuc2RrIgotCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRhYmxlCi0gICAgICAgICAgICBhbHRfbGliYz0ke1NES19QQVRIfS9TREtzL2lQaG9uZU9TNC4yLnNkawotCi0gICAgICAgICAgICAjIEFkZCB0aGUgcGF0aHMgZm9yIHRoZSBhbHRlcm5hdGUgbGliYwotIyAgICAgICAgICAgIGZvciBkIGluIHVzci9pbmNsdWRlIHVzci9pbmNsdWRlL2djYy9kYXJ3aW4vNC4wLzsgZG8KLSAgICAgICAgICAgIGZvciBkIGluIHVzci9pbmNsdWRlIHVzci9pbmNsdWRlL2djYy9kYXJ3aW4vNC4wLyB1c3IvbGliL2djYy9hcm0tYXBwbGUtZGFyd2luMTAvNC4yLjEvaW5jbHVkZS87IGRvCi0gICAgICAgICAgICAgICAgdHJ5X2Rpcj0iJHthbHRfbGliY30vJHtkfSIKLSAgICAgICAgICAgICAgICBbIC1kICIke3RyeV9kaXJ9IiBdICYmIGFkZF9jZmxhZ3MgLUkiJHt0cnlfZGlyfSIKLSAgICAgICAgICAgIGRvbmUKLQotICAgICAgICAgICAgZm9yIGQgaW4gbGliIHVzci9saWI7IGRvCi0gICAgICAgICAgICAgICAgdHJ5X2Rpcj0iJHthbHRfbGliY30vJHtkfSIKLSAgICAgICAgICAgICAgICBbIC1kICIke3RyeV9kaXJ9IiBdICYmIGFkZF9sZGZsYWdzIC1MIiR7dHJ5X2Rpcn0iCi0gICAgICAgICAgICBkb25lCi0KLSAgICAgICAgICAgIGFzbV9jb252ZXJzaW9uX2NtZD0iJHtzb3VyY2VfcGF0aH0vYnVpbGQvbWFrZS9hZHMyZ2FzX2FwcGxlLnBsIgotICAgICAgICAgOzsKLQotICAgICAgICBsaW51eCopCi0gICAgICAgICAgICBlbmFibGUgbGludXgKLSAgICAgICAgICAgIGlmIGVuYWJsZWQgcnZjdDsgdGhlbgotICAgICAgICAgICAgICAgICMgQ29tcGlsaW5nIHdpdGggUlZDVCByZXF1aXJlcyBhbiBhbHRlcm5hdGUgbGliYyAoZ2xpYmMpIHdoZW4KLSAgICAgICAgICAgICAgICAjIHRhcmdldHRpbmcgbGludXguCi0gICAgICAgICAgICAgICAgZGlzYWJsZWQgYnVpbHRpbl9saWJjIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgZGllICJNdXN0IHN1cHBseSAtLWxpYmMgd2hlbiB0YXJnZXR0aW5nICotbGludXgtcnZjdCIKLQotICAgICAgICAgICAgICAgICMgU2V0IHVwIGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgYWRkX2NmbGFncyAtLWxpYnJhcnlfaW50ZXJmYWNlPWFlYWJpX2dsaWJjCi0gICAgICAgICAgICAgICAgYWRkX2NmbGFncyAtLW5vX2hpZGVfYWxsCi0gICAgICAgICAgICAgICAgYWRkX2NmbGFncyAtLWR3YXJmMgotCi0gICAgICAgICAgICAgICAgIyBTZXQgdXAgbGlua2VyCi0gICAgICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLS1zeXN2IC0tbm9fc3RhcnR1cCAtLW5vX3JlZl9jcHBfaW5pdAotICAgICAgICAgICAgICAgIGFkZF9sZGZsYWdzIC0tZW50cnk9X3N0YXJ0Ci0gICAgICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLS1rZWVwICciKiguaW5pdCkiJyAtLWtlZXAgJyIqKC5maW5pKSInCi0gICAgICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLS1rZWVwICciKiguaW5pdF9hcnJheSkiJyAtLWtlZXAgJyIqKC5maW5pX2FycmF5KSInCi0gICAgICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLS1keW5hbWljbGlua2VyPS9saWIvbGQtbGludXguc28uMwotICAgICAgICAgICAgICAgIGFkZF9leHRyYWxpYnMgbGliYy5zby42IC1sY19ub25zaGFyZWQgY3J0MS5vIGNydGkubyBjcnRuLm8KLQotICAgICAgICAgICAgICAgICMgQWRkIHRoZSBwYXRocyBmb3IgdGhlIGFsdGVybmF0ZSBsaWJjCi0gICAgICAgICAgICAgICAgZm9yIGQgaW4gdXNyL2luY2x1ZGU7IGRvCi0gICAgICAgICAgICAgICAgICAgIHRyeV9kaXI9IiR7YWx0X2xpYmN9LyR7ZH0iCi0gICAgICAgICAgICAgICAgICAgIFsgLWQgIiR7dHJ5X2Rpcn0iIF0gJiYgYWRkX2NmbGFncyAtSiIke3RyeV9kaXJ9IgotICAgICAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgICAgICBhZGRfY2ZsYWdzIC1KIiR7UlZDVDMxSU5DfSIKLSAgICAgICAgICAgICAgICBmb3IgZCBpbiBsaWIgdXNyL2xpYjsgZG8KLSAgICAgICAgICAgICAgICAgICAgdHJ5X2Rpcj0iJHthbHRfbGliY30vJHtkfSIKLSAgICAgICAgICAgICAgICAgICAgWyAtZCAiJHt0cnlfZGlyfSIgXSAmJiBhZGRfbGRmbGFncyAtTCIke3RyeV9kaXJ9IgotICAgICAgICAgICAgICAgIGRvbmUKLQotCi0gICAgICAgICAgICAgICAgIyBnbGliYyBoYXMgc29tZSBzdHJ1Y3QgbWVtYmVycyBuYW1lZCBfX2FsaWduLCB3aGljaCBpcyBhCi0gICAgICAgICAgICAgICAgIyBzdG9yYWdlIG1vZGlmaWVyIGluIFJWQ1QuIElmIHdlIG5lZWQgdG8gdXNlIHRoaXMgbW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgIyB3ZSdsbCBoYXZlIHRvICN1bmRlZiBpdCBpbiBvdXIgY29kZS4gTm90ZSB0aGF0IHRoaXMgbXVzdAotICAgICAgICAgICAgICAgICMgaGFwcGVuIEFGVEVSIGFsbCBsaWJjIGluY2x1ZXMuCi0gICAgICAgICAgICAgICAgYWRkX2NmbGFncyAtRF9fYWxpZ249eF9hbGlnbl94Ci0gICAgICAgICAgICBmaQotICAgICAgICA7OwotCi0gICAgICAgIHN5bWJpYW4qKQotICAgICAgICAgICAgZW5hYmxlIHN5bWJpYW4KLSAgICAgICAgICAgICMgQWRkIHRoZSBwYXRocyBmb3IgdGhlIGFsdGVybmF0ZSBsaWJjCi0gICAgICAgICAgICBmb3IgZCBpbiBpbmNsdWRlL2xpYmM7IGRvCi0gICAgICAgICAgICAgICAgdHJ5X2Rpcj0iJHthbHRfbGliY30vJHtkfSIKLSAgICAgICAgICAgICAgICBbIC1kICIke3RyeV9kaXJ9IiBdICYmIGFkZF9jZmxhZ3MgLUkiJHt0cnlfZGlyfSIKLSAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgIGZvciBkIGluIHJlbGVhc2UvYXJtdjUvdXJlbDsgZG8KLSAgICAgICAgICAgICAgICB0cnlfZGlyPSIke2FsdF9saWJjfS8ke2R9IgotICAgICAgICAgICAgICAgIFsgLWQgIiR7dHJ5X2Rpcn0iIF0gJiYgYWRkX2xkZmxhZ3MgLUwiJHt0cnlfZGlyfSIKLSAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgIGFkZF9jZmxhZ3MgLURJTVBPUlRfQz0KLQotICAgICAgICBlc2FjCi0gICAgOzsKLSAgICBtaXBzKikKLSAgICAgICAgQ1JPU1M9JHtDUk9TUzotbWlwc2VsLWxpbnV4LXVjbGliYy19Ci0gICAgICAgIGxpbmtfd2l0aF9jYz1nY2MKLSAgICAgICAgc2V0dXBfZ251X3Rvb2xjaGFpbgotICAgICAgICB0dW5lX2NmbGFncz0iLW10dW5lPSIKLSAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtbWFyY2g9JHt0Z3RfaXNhfQotICAgIGNoZWNrX2FkZF9hc2ZsYWdzIC1tYXJjaD0ke3RndF9pc2F9Ci0gICAgY2hlY2tfYWRkX2FzZmxhZ3MgLUtQSUMKLSAgICA7OwotICAgIHBwYyopCi0gICAgICAgIGVuYWJsZSBwcGMKLSAgICAgICAgYml0cz0ke3RndF9pc2EjI3BwY30KLSAgICAgICAgbGlua193aXRoX2NjPWdjYwotICAgICAgICBzZXR1cF9nbnVfdG9vbGNoYWluCi0gICAgICAgIGFkZF9hc2ZsYWdzIC1mb3JjZV9jcHVzdWJ0eXBlX0FMTCAtSSJcJChkaXIgXCQ8KWRhcndpbiIKLSAgICAgICAgc29mdF9lbmFibGUgYWx0aXZlYwotICAgICAgICBlbmFibGVkIGFsdGl2ZWMgJiYgYWRkX2NmbGFncyAtbWFsdGl2ZWMKLQotICAgICAgICBjYXNlICIkdGd0X29zIiBpbgotICAgICAgICBsaW51eCopCi0gICAgICAgICAgICBhZGRfYXNmbGFncyAtbWFsdGl2ZWMgLW1yZWduYW1lcyAtSSJcJChkaXIgXCQ8KWxpbnV4IgotICAgICAgICA7OwotICAgICAgICBkYXJ3aW4qKQotICAgICAgICAgICAgZGFyd2luX2FyY2g9Ii1hcmNoIHBwYyIKLSAgICAgICAgICAgIGVuYWJsZWQgcHBjNjQgJiYgZGFyd2luX2FyY2g9IiR7ZGFyd2luX2FyY2h9NjQiCi0gICAgICAgICAgICBhZGRfY2ZsYWdzICAke2Rhcndpbl9hcmNofSAtbSR7Yml0c30gLWZhc20tYmxvY2tzCi0gICAgICAgICAgICBhZGRfYXNmbGFncyAke2Rhcndpbl9hcmNofSAtZm9yY2VfY3B1c3VidHlwZV9BTEwgLUkiXCQoZGlyIFwkPClkYXJ3aW4iCi0gICAgICAgICAgICBhZGRfbGRmbGFncyAke2Rhcndpbl9hcmNofSAtbSR7Yml0c30KLSAgICAgICAgICAgIGVuYWJsZWQgYWx0aXZlYyAmJiBhZGRfY2ZsYWdzIC1mYWx0aXZlYwotICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgOzsKLSAgICB4ODYqKQotICAgICAgICBiaXRzPTMyCi0gICAgICAgIGVuYWJsZWQgeDg2XzY0ICYmIGJpdHM9NjQKLSAgICAgICAgc29mdF9lbmFibGUgcnVudGltZV9jcHVfZGV0ZWN0Ci0gICAgICAgIHNvZnRfZW5hYmxlIG1teAotICAgICAgICBzb2Z0X2VuYWJsZSBzc2UKLSAgICAgICAgc29mdF9lbmFibGUgc3NlMgotICAgICAgICBzb2Z0X2VuYWJsZSBzc2UzCi0gICAgICAgIHNvZnRfZW5hYmxlIHNzc2UzCi0gICAgICAgIHNvZnRfZW5hYmxlIHNzZTRfMQotCi0gICAgICAgIGNhc2UgICR7dGd0X29zfSBpbgotICAgICAgICAgICAgd2luKikKLSAgICAgICAgICAgICAgICBlbmFibGVkIGdjYyAmJiBhZGRfY2ZsYWdzIC1mbm8tY29tbW9uCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIHNvbGFyaXMqKQotICAgICAgICAgICAgICAgIENDPSR7Q0M6LSR7Q1JPU1N9Z2NjfQotICAgICAgICAgICAgICAgIExEPSR7TEQ6LSR7Q1JPU1N9Z2NjfQotICAgICAgICAgICAgICAgIENST1NTPSR7Q1JPU1M6LWd9Ci0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIEFTPSIke2FsdF9hczotJHtBUzotYXV0b319IgotICAgICAgICBjYXNlICAke3RndF9jY30gaW4KLSAgICAgICAgICAgIGljYyopCi0gICAgICAgICAgICAgICAgQ0M9JHtDQzotaWNjfQotICAgICAgICAgICAgICAgIExEPSR7TEQ6LWljY30KLSAgICAgICAgICAgICAgICBzZXR1cF9nbnVfdG9vbGNoYWluCi0gICAgICAgICAgICAgICAgYWRkX2NmbGFncyAtdXNlLW1zYXNtIC11c2UtYXNtCi0gICAgICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLWktc3RhdGljCi0gICAgICAgICAgICAgICAgZW5hYmxlZCB4ODZfNjQgJiYgYWRkX2NmbGFncyAtaXBvIC1uby1wcmVjLWRpdiAtc3RhdGljIC14U1NFMiAtYXhTU0UyCi0gICAgICAgICAgICAgICAgZW5hYmxlZCB4ODZfNjQgJiYgQVI9eGlhcgotICAgICAgICAgICAgICAgIGNhc2UgJHt0dW5lX2NwdX0gaW4KLSAgICAgICAgICAgICAgICAgICAgYXRvbSopCi0gICAgICAgICAgICAgICAgICAgICAgICB0dW5lX2NmbGFncz0iLXgiCi0gICAgICAgICAgICAgICAgICAgICAgICB0dW5lX2NwdT0iU1NFM19BVE9NIgotICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgdHVuZV9jZmxhZ3M9Ii1tYXJjaD0iCi0gICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBnY2MqKQotICAgICAgICAgICAgICAgIGFkZF9jZmxhZ3MgIC1tJHtiaXRzfQotICAgICAgICAgICAgICAgIGFkZF9sZGZsYWdzIC1tJHtiaXRzfQotICAgICAgICAgICAgICAgIGxpbmtfd2l0aF9jYz1nY2MKLSAgICAgICAgICAgICAgICB0dW5lX2NmbGFncz0iLW1hcmNoPSIKLSAgICAgICAgICAgIHNldHVwX2dudV90b29sY2hhaW4KLSAgICAgICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAiJHtBU30iIGluCi0gICAgICAgICAgICBhdXRvfCIiKQotICAgICAgICAgICAgICAgIHdoaWNoIG5hc20gPi9kZXYvbnVsbCAyPiYxICYmIEFTPW5hc20KLSAgICAgICAgICAgICAgICB3aGljaCB5YXNtID4vZGV2L251bGwgMj4mMSAmJiBBUz15YXNtCi0gICAgICAgICAgICAgICAgWyAiJHtBU30iID0gYXV0byAtbyAteiAiJHtBU30iIF0gXAotICAgICAgICAgICAgICAgICAgICAmJiBkaWUgIk5laXRoZXIgeWFzbSBub3IgbmFzbSBoYXZlIGJlZW4gZm91bmQiCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBsb2dfZWNobyAiICB1c2luZyAkQVMiCi0gICAgICAgIFsgIiR7QVMjIyovfSIgPSBuYXNtIF0gJiYgYWRkX2FzZmxhZ3MgLU94Ci0gICAgICAgIEFTX1NGWD0uYXNtCi0gICAgICAgIGNhc2UgICR7dGd0X29zfSBpbgotICAgICAgICAgICAgd2luKikKLSAgICAgICAgICAgICAgICBhZGRfYXNmbGFncyAtZiB3aW4ke2JpdHN9Ci0gICAgICAgICAgICAgICAgZW5hYmxlZCBkZWJ1ZyAmJiBhZGRfYXNmbGFncyAtZyBjdjgKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBsaW51eCp8c29sYXJpcyopCi0gICAgICAgICAgICAgICAgYWRkX2FzZmxhZ3MgLWYgZWxmJHtiaXRzfQotICAgICAgICAgICAgICAgIGVuYWJsZWQgZGVidWcgJiYgWyAiJHtBU30iID0geWFzbSBdICYmIGFkZF9hc2ZsYWdzIC1nIGR3YXJmMgotICAgICAgICAgICAgICAgIGVuYWJsZWQgZGVidWcgJiYgWyAiJHtBU30iID0gbmFzbSBdICYmIGFkZF9hc2ZsYWdzIC1nCi0gICAgICAgICAgICAgICAgWyAiJHtBUyMjKi99IiA9IG5hc20gXSAmJiBjaGVja19hc21fYWxpZ24KLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBkYXJ3aW4qKQotICAgICAgICAgICAgICAgIGFkZF9hc2ZsYWdzIC1mIG1hY2hvJHtiaXRzfQotICAgICAgICAgICAgICAgIGVuYWJsZWQgeDg2ICYmIGRhcndpbl9hcmNoPSItYXJjaCBpMzg2IiB8fCBkYXJ3aW5fYXJjaD0iLWFyY2ggeDg2XzY0IgotICAgICAgICAgICAgICAgIGFkZF9jZmxhZ3MgICR7ZGFyd2luX2FyY2h9Ci0gICAgICAgICAgICAgICAgYWRkX2xkZmxhZ3MgJHtkYXJ3aW5fYXJjaH0KLSAgICAgICAgICAgICAgICAjIC1tZHluYW1pYy1uby1waWMgaXMgc3RpbGwgYSBiaXQgb2Ygdm9vZG9vIC0tIGl0IHdhcyByZXF1aXJlZCBhdAotICAgICAgICAgICAgICAgICMgb25lIHRpbWUsIGJ1dCBkb2VzIG5vdCBzZWVtIHRvIGJlIG5vdywgYW5kIGl0IGJyZWFrcyBzb21lIG9mIHRoZQotICAgICAgICAgICAgICAgICMgY29kZSB0aGF0IHN0aWxsIHJlbGllcyBvbiBpbmxpbmUgYXNzZW1ibHkuCi0gICAgICAgICAgICAgICAgIyBlbmFibGVkIGljYyAmJiAhIGVuYWJsZWQgcGljICYmIGFkZF9jZmxhZ3MgLWZuby1waWMgLW1keW5hbWljLW5vLXBpYwotICAgICAgICAgICAgICAgIGVuYWJsZWQgaWNjICYmICEgZW5hYmxlZCBwaWMgJiYgYWRkX2NmbGFncyAtZm5vLXBpYwotICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICopIGxvZyAiV2FybmluZzogVW5rbm93biBvcyAkdGd0X29zIHdoaWxlIHNldHRpbmcgdXAgJEFTIGZsYWdzIgotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgIDs7Ci0gICAgdW5pdmVyc2FsKnwqLWdjY3xnZW5lcmljLWdudSkKLSAgICAgICAgbGlua193aXRoX2NjPWdjYwotICAgICAgICBlbmFibGUgZ2NjCi0gICAgc2V0dXBfZ251X3Rvb2xjaGFpbgotICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBUcnkgdG8gZW5hYmxlIENQVSBzcGVjaWZpYyB0dW5pbmcKLSAgICBpZiBbIC1uICIke3R1bmVfY3B1fSIgXTsgdGhlbgotICAgICAgICBpZiBbIC1uICIke3R1bmVfY2ZsYWdzfSIgXTsgdGhlbgotICAgICAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAke3R1bmVfY2ZsYWdzfSR7dHVuZV9jcHV9IHx8IFwKLSAgICAgICAgICAgICAgICBkaWUgIlJlcXVlc3RlZCBDUFUgJyR7dHVuZV9jcHV9JyBub3Qgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyIgotICAgICAgICBmaQotICAgIGlmIFsgLW4gIiR7dHVuZV9hc2ZsYWdzfSIgXTsgdGhlbgotICAgICAgICAgICAgY2hlY2tfYWRkX2FzZmxhZ3MgJHt0dW5lX2FzZmxhZ3N9JHt0dW5lX2NwdX0gfHwgXAotICAgICAgICAgICAgICAgIGRpZSAiUmVxdWVzdGVkIENQVSAnJHt0dW5lX2NwdX0nIG5vdCBzdXBwb3J0ZWQgYnkgYXNzZW1ibGVyIgotICAgICAgICBmaQotICAgIGlmIFsgLXogIiR7dHVuZV9jZmxhZ3N9JHt0dW5lX2FzZmxhZ3N9IiBdOyB0aGVuCi0gICAgICAgICAgICBsb2dfZWNobyAiV2FybmluZzogQ1BVIHR1bmluZyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbGNoYWluIgotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBlbmFibGVkIGRlYnVnICYmIGNoZWNrX2FkZF9jZmxhZ3MgLWcgJiYgY2hlY2tfYWRkX2xkZmxhZ3MgLWcKLSAgICBlbmFibGVkIGdwcm9mICYmIGNoZWNrX2FkZF9jZmxhZ3MgLXBnICYmIGNoZWNrX2FkZF9sZGZsYWdzIC1wZwotICAgIGVuYWJsZWQgZ2NvdiAmJgotICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSAmJgotICAgICAgICBjaGVja19hZGRfbGRmbGFncyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UKLSAgICBpZiBlbmFibGVkIG9wdGltaXphdGlvbnM7IHRoZW4KLSAgICAgICAgZW5hYmxlZCBydmN0ICYmIGNoZWNrX2FkZF9jZmxhZ3MgLU90aW1lCi0gICAgICAgIGVuYWJsZWQgc21hbGwgJiYgY2hlY2tfYWRkX2NmbGFncyAtTzIgfHwgY2hlY2tfYWRkX2NmbGFncyAtTzMKLSAgICBmaQotCi0gICAgIyBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQsIGZvciBidWlsZGluZyByZWxvY2F0YWJsZQotICAgICMgc2hhcmVkIG9iamVjdHMKLSAgICBlbmFibGVkIGdjYyAmJiBlbmFibGVkIHBpYyAmJiBjaGVja19hZGRfY2ZsYWdzIC1mUElDCi0KLSAgICAjIENoZWNrIGZvciBzdHJpcCB1dGlsaXR5IHZhcmlhbnQKLSAgICAke1NUUklQfSAtViAyPi9kZXYvbnVsbCB8IGdyZXAgR05VID4vZGV2L251bGwgJiYgZW5hYmxlIGdudV9zdHJpcAotCi0gICAgIyBUcnkgdG8gZGV0ZXJtaW5lIHRhcmdldCBlbmRpYW5uZXNzCi0gICAgY2hlY2tfY2MgPDxFT0YKLSAgICB1bnNpZ25lZCBpbnQgZSA9ICdPJzw8MjQgfCAnMic8PDE2IHwgJ0InPDw4IHwgJ0UnOwotRU9GCi0gICAgWyAtZiAiJHtUTVBfT30iIF0gJiYgb2QgLUEgbiAtdCB4MSAiJHtUTVBfT30iIHwgdHIgLWQgJ1xuJyB8Ci0gICAgICAgIGdyZXAgJzRmICozMiAqNDIgKjQ1JyA+L2Rldi9udWxsIDI+JjEgJiYgZW5hYmxlIGJpZ19lbmRpYW4KLQotICAgICMgQWxtb3N0IGV2ZXJ5IHBsYXRmb3JtIHVzZXMgcHRocmVhZHMuCi0gICAgaWYgZW5hYmxlZCBtdWx0aXRocmVhZDsgdGhlbgotICAgICAgICBjYXNlICR7dG9vbGNoYWlufSBpbgotICAgICAgICAgICAgKi13aW4qKTs7Ci0gICAgICAgICAgICAqKSBjaGVja19oZWFkZXIgcHRocmVhZC5oICYmIGFkZF9leHRyYWxpYnMgLWxwdGhyZWFkCi0gICAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgIyBnbGliYyBuZWVkcyB0aGVzZQotICAgIGlmIGVuYWJsZWQgbGludXg7IHRoZW4KLSAgICAgICAgYWRkX2NmbGFncyAtRF9MQVJHRUZJTEVfU09VUkNFCi0gICAgICAgIGFkZF9jZmxhZ3MgLURfRklMRV9PRkZTRVRfQklUUz02NAotICAgIGZpCi0KLSAgICAjIGFwcGVuZCBhbnkgdXNlciBkZWZpbmVkIGV4dHJhIGNmbGFncwotICAgIGlmIFsgLW4gIiR7ZXh0cmFfY2ZsYWdzfSIgXSA7IHRoZW4KLSAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAke2V4dHJhX2NmbGFnc30gfHwgXAotICAgICAgICBkaWUgIlJlcXVlc3RlZCBleHRyYSBDRkxBR1MgJyR7ZXh0cmFfY2ZsYWdzfScgbm90IHN1cHBvcnRlZCBieSBjb21waWxlciIKLSAgICBmaQotfQotCi1wcm9jZXNzX3Rvb2xjaGFpbigpIHsKLSAgICBwcm9jZXNzX2NvbW1vbl90b29sY2hhaW4KLX0KLQotcHJpbnRfY29uZmlnX21rKCkgewotICAgIGxvY2FsIHByZWZpeD0kMQotICAgIGxvY2FsIG1ha2VmaWxlPSQyCi0gICAgc2hpZnQgMgotICAgIGZvciBjZmc7IGRvCi0gICAgICAgIHVwbmFtZT0iYHRvdXBwZXIgJGNmZ2AiCi0gICAgICAgIGlmIGVuYWJsZWQgJGNmZzsgdGhlbgotICAgICAgICAgICAgZWNobyAiJHtwcmVmaXh9XyR7dXBuYW1lfT15ZXMiID4+ICRtYWtlZmlsZQotICAgICAgICBmaQotICAgIGRvbmUKLX0KLQotcHJpbnRfY29uZmlnX2goKSB7Ci0gICAgbG9jYWwgcHJlZml4PSQxCi0gICAgbG9jYWwgaGVhZGVyPSQyCi0gICAgc2hpZnQgMgotICAgIGZvciBjZmc7IGRvCi0gICAgICAgIHVwbmFtZT0iYHRvdXBwZXIgJGNmZ2AiCi0gICAgICAgIGlmIGVuYWJsZWQgJGNmZzsgdGhlbgotICAgICAgICAgICAgZWNobyAiI2RlZmluZSAke3ByZWZpeH1fJHt1cG5hbWV9IDEiID4+ICRoZWFkZXIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiI2RlZmluZSAke3ByZWZpeH1fJHt1cG5hbWV9IDAiID4+ICRoZWFkZXIKLSAgICAgICAgZmkKLSAgICBkb25lCi19Ci0KLXByb2Nlc3NfdGFyZ2V0cygpIHsKLSAgICB0cnVlOwotfQotCi1wcm9jZXNzX2RldGVjdCgpIHsKLSAgICB0cnVlOwotfQotCi1lbmFibGUgbG9nZ2luZwotbG9nZmlsZT0iY29uZmlnLmVyciIKLXNlbGY9JDAKLXByb2Nlc3MoKSB7Ci0gICAgY21kbGluZV9hcmdzPSIkQCIKLSAgICBwcm9jZXNzX2NtZGxpbmUgIiRAIgotICAgIGlmIGVuYWJsZWQgY2hpbGQ7IHRoZW4KLSAgICAgICAgZWNobyAiIyAke3NlbGZ9ICRAIiA+PiAke2xvZ2ZpbGV9Ci0gICAgZWxzZQotICAgICAgICBlY2hvICIjICR7c2VsZn0gJEAiID4gJHtsb2dmaWxlfQotICAgIGZpCi0gICAgcG9zdF9wcm9jZXNzX2NvbW1vbl9jbWRsaW5lCi0gICAgcG9zdF9wcm9jZXNzX2NtZGxpbmUKLSAgICBwcm9jZXNzX3Rvb2xjaGFpbgotICAgIHByb2Nlc3NfZGV0ZWN0Ci0gICAgcHJvY2Vzc190YXJnZXRzCi0KLSAgICBPT1RfSU5TVEFMTFM9IiR7T09UX0lOU1RBTExTfSIKLSAgICBpZiBlbmFibGVkIHNvdXJjZV9wYXRoX3VzZWQ7IHRoZW4KLSAgICAjIFByZXBhcmUgdGhlIFBXRCBmb3IgYnVpbGRpbmcuCi0gICAgZm9yIGYgaW4gJHtPT1RfSU5TVEFMTFN9OyBkbwotICAgICAgICAgICAgaW5zdGFsbCAtRCAke3NvdXJjZV9wYXRofS8kZiAkZgotICAgIGRvbmUKLSAgICBmaQotICAgIGNwICR7c291cmNlX3BhdGh9L2J1aWxkL21ha2UvTWFrZWZpbGUgLgotCi0gICAgY2xlYW5fdGVtcF9maWxlcwotICAgIHRydWUKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL21ha2UvZ2VuX2FzbV9kZXBzLnNoIGIvYnVpbGQvbWFrZS9nZW5fYXNtX2RlcHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNmM1ZDUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZS9nZW5fYXNtX2RlcHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMKLSMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0jIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSMjCi0KLQotc2VsZj0kMAotc2hvd19oZWxwKCkgewotICAgIGVjaG8gInVzYWdlOiAkc2VsZiBbb3B0aW9uc10gPHNyY2ZpbGU+IgotICAgIGVjaG8KLSAgICBlY2hvICJHZW5lcmF0ZSBNYWtlZmlsZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZyb20gYXNzZW1ibHkgY29kZSBzb3VyY2UiCi0gICAgZWNobwotICAgIGV4aXQgMQotfQotZGllX3Vua25vd24oKXsKLSAgICBlY2hvICJVbmtub3duIG9wdGlvbiBcIiQxXCIuIgotICAgIGVjaG8gIlNlZSAkMCAtLWhlbHAgZm9yIGF2YWlsYWJsZSBvcHRpb25zLiIKLSAgICBleGl0IDEKLX0KLWZvciBvcHQgZG8KLSAgICBvcHR2YWw9IiR7b3B0Iyo9fSIKLSAgICBjYXNlICIkb3B0IiBpbgotICAgIC0tYnVpbGQtcGZ4PSopIHBmeD0iJHtvcHR2YWx9IgotICAgIDs7Ci0gICAgLS1kZXBmaWxlPSopIG91dD0iJHtvcHR2YWx9IgotICAgIDs7Ci0gICAgLUkqKSByYXdfaW5jX3BhdGhzPSIke3Jhd19pbmNfcGF0aHN9ICR7b3B0fSIKLSAgICAgICAgIGluY19wYXRoPSIke2luY19wYXRofSAke29wdCMtSX0iCi0gICAgOzsKLSAgICAtaHwtLWhlbHApIHNob3dfaGVscAotICAgIDs7Ci0gICAgKikgWyAtZiAiJG9wdCIgXSAmJiBzcmNmaWxlPSIkb3B0IgotICAgIDs7Ci0gICAgZXNhYwotZG9uZQotCi1bIC1uICIkc3JjZmlsZSIgXSB8fCBzaG93X2hlbHAKLXNmeD0ke3NmeDotYXNtfQotaW5jbHVkZXM9JChlZ3JlcCAtaSAiaW5jbHVkZSArXCI/K1thLXowLTlfL10rXC4ke3NmeH0iICRzcmNmaWxlIHwKLSAgICAgICAgICAgcGVybCAtcCAtZSAiczsuKj8oW2EtejAtOV8vXSsuJHtzZnh9KS4qO1wxOyIpCi0jIiByZXN0b3JlIGVkaXRvciBzdGF0ZQotZm9yIGluYyBpbiAke2luY2x1ZGVzfTsgZG8KLSAgICBmb3VuZF9pbmNfcGF0aD0KLSAgICBmb3IgaWRpciBpbiAke2luY19wYXRofTsgZG8KLSAgICAgICAgWyAtZiAiJHtpZGlyfS8ke2luY30iIF0gJiYgZm91bmRfaW5jX3BhdGg9IiR7aWRpcn0iICYmIGJyZWFrCi0gICAgZG9uZQotICAgIGlmIFsgLWYgYGRpcm5hbWUgJHNyY2ZpbGVgLyRpbmMgXTsgdGhlbgotICAgICAgICAjIEhhbmRsZSBpbmNsdWRlIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlCi0gICAgICAgICRzZWxmIC0tYnVpbGQtcGZ4PSRwZnggLS1kZXBmaWxlPSRvdXQgJHtyYXdfaW5jX3BhdGhzfSBgZGlybmFtZSAkc3JjZmlsZWAvJGluYwotICAgIGVsaWYgWyAtbiAiJHtmb3VuZF9pbmNfcGF0aH0iIF07IHRoZW4KLSAgICAgICAgIyBIYW5kbGUgaW5jbHVkZSBmaWxlcyBvbiB0aGUgaW5jbHVkZSBwYXRoCi0gICAgICAgICRzZWxmIC0tYnVpbGQtcGZ4PSRwZnggLS1kZXBmaWxlPSRvdXQgJHtyYXdfaW5jX3BhdGhzfSAiJHtmb3VuZF9pbmNfcGF0aH0vJGluYyIKLSAgICBlbHNlCi0gICAgICAgICMgSGFuZGxlIGdlbmVyYXRlZCBpbmNsdWRlcyBpbiB0aGUgYnVpbGQgcm9vdCAod2hpY2ggbWF5IG5vdCBleGlzdCB5ZXQpCi0gICAgICAgIGVjaG8gJHtvdXR9ICR7b3V0JWR9bzogIiR7cGZ4fSR7aW5jfSIKLSAgICBmaQotZG9uZQotZWNobyAke291dH0gJHtvdXQlZH1vOiAkc3JjZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZS9nZW5fbXN2c19wcm9qLnNoIGIvYnVpbGQvbWFrZS9nZW5fbXN2c19wcm9qLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmVmNDRhLi4wMDAwMDAwCi0tLSBhL2J1aWxkL21ha2UvZ2VuX21zdnNfcHJvai5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi0jIS9iaW4vYmFzaAotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMKLSMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0jIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSMjCi0KLQotc2VsZj0kMAotc2VsZl9iYXNlbmFtZT0ke3NlbGYjIyovfQotc2VsZl9kaXJuYW1lPSQoZGlybmFtZSAiJDAiKQotRU9MPSQnXG4nCi0KLXNob3dfaGVscCgpIHsKLSAgICBjYXQgPDxFT0YKLVVzYWdlOiAke3NlbGZfYmFzZW5hbWV9IC0tbmFtZT1wcm9qbmFtZSBbb3B0aW9uc10gZmlsZTEgW2ZpbGUyIC4uLl0KLQotVGhpcyBzY3JpcHQgZ2VuZXJhdGVzIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgZnJvbSBhIGxpc3Qgb2Ygc291cmNlCi1jb2RlIGZpbGVzLgotCi1PcHRpb25zOgotICAgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UKLSAgICAtLWV4ZSAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgYSBwcm9qZWN0IGZvciBidWlsZGluZyBhbiBBcHBsaWNhdGlvbgotICAgIC0tbGliICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIHByb2plY3QgZm9yIGNyZWF0aW5nIGEgc3RhdGljIGxpYnJhcnkKLSAgICAtLXN0YXRpYy1jcnQgICAgICAgICAgICAgICAgVXNlIHRoZSBzdGF0aWMgQyBydW50aW1lICgvTVQpCi0gICAgLS10YXJnZXQ9aXNhLW9zLWNjICAgICAgICAgIFRhcmdldCBzcGVjaWZpZXIgKHJlcXVpcmVkKQotICAgIC0tb3V0PWZpbGVuYW1lICAgICAgICAgICAgICBXcml0ZSBvdXRwdXQgdG8gYSBmaWxlIFtzdGRvdXRdCi0gICAgLS1uYW1lPXByb2plY3RfbmFtZSAgICAgICAgIE5hbWUgb2YgdGhlIHByb2plY3QgKHJlcXVpcmVkKQotICAgIC0tcHJvai1ndWlkPUdVSUQgICAgICAgICAgICBHVUlEIHRvIHVzZSBmb3IgdGhlIHByb2plY3QKLSAgICAtLW1vZHVsZS1kZWY9ZmlsZW5hbWUgICAgICAgRmlsZSBjb250YWluaW5nIGV4cG9ydCBkZWZpbml0aW9ucyAoZm9yIERMTHMpCi0gICAgLS12ZXI9dmVyc2lvbiAgICAgICAgICAgICAgIFZlcnNpb24gKDcsOCw5KSBvZiB2aXN1YWwgc3R1ZGlvIHRvIGdlbmVyYXRlIGZvcgotICAgIC0tc3JjLXBhdGgtYmFyZT1kaXIgICAgICAgICBQYXRoIHRvIHJvb3Qgb2Ygc291cmNlIHRyZWUKLSAgICAtSXBhdGgvdG8vaW5jbHVkZSAgICAgICAgICAgQWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzCi0gICAgLURGTEFHWz12YWx1ZV0gICAgICAgICAgICAgIFByZXByb2Nlc3NvciBtYWNyb3MgdG8gZGVmaW5lCi0gICAgLUxwYXRoL3RvL2xpYiAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgbGlicmFyeSBzZWFyY2ggcGF0aHMKLSAgICAtbGxpYm5hbWUgICAgICAgICAgICAgICAgICAgTGlicmFyeSB0byBsaW5rIGFnYWluc3QKLUVPRgotICAgIGV4aXQgMQotfQotCi1kaWUoKSB7Ci0gICAgZWNobyAiJHtzZWxmX2Jhc2VuYW1lfTogJEAiID4mMgotICAgIGV4aXQgMQotfQotCi1kaWVfdW5rbm93bigpewotICAgIGVjaG8gIlVua25vd24gb3B0aW9uIFwiJDFcIi4iID4mMgotICAgIGVjaG8gIlNlZSAke3NlbGZfYmFzZW5hbWV9IC0taGVscCBmb3IgYXZhaWxhYmxlIG9wdGlvbnMuIiA+JjIKLSAgICBleGl0IDEKLX0KLQotZ2VuZXJhdGVfdXVpZCgpIHsKLSAgICBsb2NhbCBoZXg9IjAxMjM0NTY3ODlBQkNERUYiCi0gICAgbG9jYWwgaQotICAgIGxvY2FsIHV1aWQ9IiIKLSAgICBsb2NhbCBqCi0gICAgIzkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQgotICAgIGZvciAoKGk9MDsgaTwzMjsgaSsrKSk7IGRvCi0gICAgICAgICgoIGogPSAkUkFORE9NICUgMTYgKSkKLSAgICAgICAgdXVpZD0iJHt1dWlkfSR7aGV4OiRqOjF9IgotICAgIGRvbmUKLSAgICBlY2hvICIke3V1aWQ6MDo4fS0ke3V1aWQ6ODo0fS0ke3V1aWQ6MTI6NH0tJHt1dWlkOjE2OjR9LSR7dXVpZDoyMDoxMn0iCi19Ci0KLWluZGVudDE9IiAgICAiCi1pbmRlbnQ9IiIKLWluZGVudF9wdXNoKCkgewotICAgIGluZGVudD0iJHtpbmRlbnR9JHtpbmRlbnQxfSIKLX0KLWluZGVudF9wb3AoKSB7Ci0gICAgaW5kZW50PSIke2luZGVudCUke2luZGVudDF9fSIKLX0KLQotdGFnX2F0dHJpYnV0ZXMoKSB7Ci0gICAgZm9yIG9wdCBpbiAiJEAiOyBkbwotICAgICAgICBvcHR2YWw9IiR7b3B0Iyo9fSIKLSAgICAgICAgWyAtbiAiJHtvcHR2YWx9IiBdIHx8Ci0gICAgICAgICAgICBkaWUgIk1pc3NpbmcgYXR0cmlidXRlIHZhbHVlIGluICckb3B0JyB3aGlsZSBnZW5lcmF0aW5nICR0YWcgdGFnIgotICAgICAgICBlY2hvICIke2luZGVudH0ke29wdCUlPSp9PVwiJHtvcHR2YWx9XCIiCi0gICAgZG9uZQotfQotCi1vcGVuX3RhZygpIHsKLSAgICBsb2NhbCB0YWc9JDEKLSAgICBzaGlmdAotICAgIGlmIFsgJCMgLW5lIDAgXTsgdGhlbgotICAgICAgICBlY2hvICIke2luZGVudH08JHt0YWd9IgotICAgICAgICBpbmRlbnRfcHVzaAotICAgICAgICB0YWdfYXR0cmlidXRlcyAiJEAiCi0gICAgICAgIGVjaG8gIiR7aW5kZW50fT4iCi0gICAgZWxzZQotICAgICAgICBlY2hvICIke2luZGVudH08JHt0YWd9PiIKLSAgICAgICAgaW5kZW50X3B1c2gKLSAgICBmaQotfQotCi1jbG9zZV90YWcoKSB7Ci0gICAgbG9jYWwgdGFnPSQxCi0gICAgaW5kZW50X3BvcAotICAgIGVjaG8gIiR7aW5kZW50fTwvJHt0YWd9PiIKLX0KLQotdGFnKCkgewotICAgIGxvY2FsIHRhZz0kMQotICAgIHNoaWZ0Ci0gICAgaWYgWyAkIyAtbmUgMCBdOyB0aGVuCi0gICAgICAgIGVjaG8gIiR7aW5kZW50fTwke3RhZ30iCi0gICAgICAgIGluZGVudF9wdXNoCi0gICAgICAgIHRhZ19hdHRyaWJ1dGVzICIkQCIKLSAgICAgICAgaW5kZW50X3BvcAotICAgICAgICBlY2hvICIke2luZGVudH0vPiIKLSAgICBlbHNlCi0gICAgICAgIGVjaG8gIiR7aW5kZW50fTwke3RhZ30vPiIKLSAgICBmaQotfQotCi1nZW5lcmF0ZV9maWx0ZXIoKSB7Ci0gICAgbG9jYWwgdmFyPSQxCi0gICAgbG9jYWwgbmFtZT0kMgotICAgIGxvY2FsIHBhdHM9JDMKLSAgICBsb2NhbCBmaWxlX2xpc3Rfc3oKLSAgICBsb2NhbCBpCi0gICAgbG9jYWwgZgotICAgIGxvY2FsIHNhdmVJRlM9IiRJRlMiCi0gICAgbG9jYWwgcGFjawotICAgIGVjaG8gImdlbmVyYXRpbmcgZmlsdGVyICckbmFtZScgZnJvbSAkeyNmaWxlX2xpc3RbQF19IGZpbGVzIiA+JjIKLSAgICBJRlM9KgotCi0gICAgb3Blbl90YWcgRmlsdGVyIFwKLSAgICAgICAgTmFtZT0kbmFtZSBcCi0gICAgICAgIEZpbHRlcj0kcGF0cyBcCi0gICAgICAgIFVuaXF1ZUlkZW50aWZpZXI9YGdlbmVyYXRlX3V1aWRgIFwKLQotICAgIGZpbGVfbGlzdF9zej0keyNmaWxlX2xpc3RbQF19Ci0gICAgZm9yIGkgaW4gJHshZmlsZV9saXN0W0BdfTsgZG8KLSAgICAgICAgZj0ke2ZpbGVfbGlzdFtpXX0KLSAgICAgICAgZm9yIHBhdCBpbiAke3BhdHMvLzsvJElGU307IGRvCi0gICAgICAgICAgICBpZiBbICIke2YjIyoufSIgPT0gIiRwYXQiIF07IHRoZW4KLSAgICAgICAgICAgICAgICB1bnNldCBmaWxlX2xpc3RbaV0KLQotICAgICAgICAgICAgICAgIG9wZW5fdGFnIEZpbGUgUmVsYXRpdmVQYXRoPSIuLyRmIgotICAgICAgICAgICAgICAgIGlmIFsgIiRwYXQiID09ICJhc20iIF0gJiYgJGFzbV91c2VfY3VzdG9tX3N0ZXA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgZm9yIHBsYXQgaW4gIiR7cGxhdGZvcm1zW0BdfSI7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2ZnIGluIERlYnVnIFJlbGVhc2U7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbl90YWcgRmlsZUNvbmZpZ3VyYXRpb24gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSIke2NmZ318JHtwbGF0fSIgXAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iQXNzZW1ibGluZyBcJChJbnB1dEZpbGVOYW1lKSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZT0iJChldmFsIGVjaG8gXCRhc21fJHtjZmd9X2NtZGxpbmUpIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dHM9IlwkKElucHV0TmFtZSkub2JqIiBcCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV90YWcgRmlsZUNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgZG9uZQotICAgICAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgICAgICBjbG9zZV90YWcgRmlsZQotCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBkb25lCi0KLSAgICBjbG9zZV90YWcgRmlsdGVyCi0gICAgSUZTPSIkc2F2ZUlGUyIKLX0KLQotIyBQcm9jZXNzIGNvbW1hbmQgbGluZQotdW5zZXQgdGFyZ2V0Ci1mb3Igb3B0IGluICIkQCI7IGRvCi0gICAgb3B0dmFsPSIke29wdCMqPX0iCi0gICAgY2FzZSAiJG9wdCIgaW4KLSAgICAgICAgLS1oZWxwfC1oKSBzaG93X2hlbHAKLSAgICAgICAgOzsKLSAgICAgICAgLS10YXJnZXQ9KikgdGFyZ2V0PSIke29wdHZhbH0iCi0gICAgICAgIDs7Ci0gICAgICAgIC0tb3V0PSopIG91dGZpbGU9IiRvcHR2YWwiCi0gICAgICAgIDs7Ci0gICAgICAgIC0tbmFtZT0qKSBuYW1lPSIke29wdHZhbH0iCi0gICAgICAgIDs7Ci0gICAgICAgIC0tcHJvai1ndWlkPSopIGd1aWQ9IiR7b3B0dmFsfSIKLSAgICAgICAgOzsKLSAgICAgICAgLS1tb2R1bGUtZGVmPSopIGxpbmtfb3B0cz0iJHtsaW5rX29wdHN9IE1vZHVsZURlZmluaXRpb25GaWxlPSR7b3B0dmFsfSIKLSAgICAgICAgOzsKLSAgICAgICAgLS1leGUpIHByb2pfa2luZD0iZXhlIgotICAgICAgICA7OwotICAgICAgICAtLWxpYikgcHJval9raW5kPSJsaWIiCi0gICAgICAgIDs7Ci0gICAgICAgIC0tc3JjLXBhdGgtYmFyZT0qKSBzcmNfcGF0aF9iYXJlPSIkb3B0dmFsIgotICAgICAgICA7OwotICAgICAgICAtLXN0YXRpYy1jcnQpIHVzZV9zdGF0aWNfcnVudGltZT10cnVlCi0gICAgICAgIDs7Ci0gICAgICAgIC0tdmVyPSopCi0gICAgICAgICAgICB2c192ZXI9IiRvcHR2YWwiCi0gICAgICAgICAgICBjYXNlICIkb3B0dmFsIiBpbgotICAgICAgICAgICAgICAgIFs3ODldKQotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgKikgZGllIFVucmVjb2duaXplZCBWaXN1YWwgU3R1ZGlvIFZlcnNpb24gaW4gJG9wdAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0gICAgICAgIC1JKikKLSAgICAgICAgICAgIG9wdD0iJHtvcHQlL30iCi0gICAgICAgICAgICBpbmNzPSIke2luY3N9JHtpbmNzOis7fSZxdW90OyR7b3B0IyMtSX0mcXVvdDsiCi0gICAgICAgICAgICB5YXNtaW5jcz0iJHt5YXNtaW5jc30gJHtvcHR9IgotICAgICAgICA7OwotICAgICAgICAtRCopIGRlZmluZXM9IiR7ZGVmaW5lc30ke2RlZmluZXM6Kzt9JHtvcHQjIy1EfSIKLSAgICAgICAgOzsKLSAgICAgICAgLUwqKSAjIGZ1ZGdlIC4gdG8gJChPdXREaXIpCi0gICAgICAgICAgICBpZiBbICIke29wdCMjLUx9IiA9PSAiLiIgXTsgdGhlbgotICAgICAgICAgICAgICAgIGxpYmRpcnM9IiR7bGliZGlyc30ke2xpYmRpcnM6Kzt9JnF1b3Q7XCQoT3V0RGlyKSZxdW90OyIKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIyBBbHNvIHRyeSBkaXJlY3RvcmllcyBmb3IgdGhpcyBwbGF0Zm9ybS9jb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgIGxpYmRpcnM9IiR7bGliZGlyc30ke2xpYmRpcnM6Kzt9JnF1b3Q7JHtvcHQjIy1MfSZxdW90OyIKLSAgICAgICAgICAgICAgICAgbGliZGlycz0iJHtsaWJkaXJzfSR7bGliZGlyczorO30mcXVvdDske29wdCMjLUx9L1wkKFBsYXRmb3JtTmFtZSkvXCQoQ29uZmlndXJhdGlvbk5hbWUpJnF1b3Q7IgotICAgICAgICAgICAgICAgICBsaWJkaXJzPSIke2xpYmRpcnN9JHtsaWJkaXJzOis7fSZxdW90OyR7b3B0IyMtTH0vXCQoUGxhdGZvcm1OYW1lKSZxdW90OyIKLSAgICAgICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICAgIC1sKikgbGlicz0iJHtsaWJzfSR7bGliczorIH0ke29wdCMjLWx9LmxpYiIKLSAgICAgICAgOzsKLSAgICAgICAgLSopIGRpZV91bmtub3duICRvcHQKLSAgICAgICAgOzsKLSAgICAgICAgKikKLSAgICAgICAgICAgIGZpbGVfbGlzdFskeyNmaWxlX2xpc3RbQF19XT0iJG9wdCIKLSAgICAgICAgICAgIGNhc2UgIiRvcHQiIGluCi0gICAgICAgICAgICAgICAgICouYXNtKSB1c2VzX2FzbT10cnVlCi0gICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0gICAgZXNhYwotZG9uZQotb3V0ZmlsZT0ke291dGZpbGU6LS9kZXYvc3Rkb3V0fQotZ3VpZD0ke2d1aWQ6LWBnZW5lcmF0ZV91dWlkYH0KLWFzbV91c2VfY3VzdG9tX3N0ZXA9ZmFsc2UKLXVzZXNfYXNtPSR7dXNlc19hc206LWZhbHNlfQotY2FzZSAiJHt2c192ZXI6LTh9IiBpbgotICAgIDcpIHZzX3Zlcl9pZD0iNy4xMCIKLSAgICAgICBhc21fdXNlX2N1c3RvbV9zdGVwPSR1c2VzX2FzbQotICAgIDs7Ci0gICAgOCkgdnNfdmVyX2lkPSI4LjAwIgotICAgIDs7Ci0gICAgOSkgdnNfdmVyX2lkPSI5LjAwIgotICAgIDs7Ci1lc2FjCi0KLVsgLW4gIiRuYW1lIiBdIHx8IGRpZSAiUHJvamVjdCBuYW1lICgtLW5hbWUpIG11c3QgYmUgc3BlY2lmaWVkISIKLVsgLW4gIiR0YXJnZXQiIF0gfHwgZGllICJUYXJnZXQgKC0tdGFyZ2V0KSBtdXN0IGJlIHNwZWNpZmllZCEiCi0KLWlmICR7dXNlX3N0YXRpY19ydW50aW1lOi1mYWxzZX07IHRoZW4KLSAgICByZWxlYXNlX3J1bnRpbWU9MAotICAgIGRlYnVnX3J1bnRpbWU9MQotICAgIGxpYl9zZng9bXQKLWVsc2UKLSAgICByZWxlYXNlX3J1bnRpbWU9MgotICAgIGRlYnVnX3J1bnRpbWU9MwotICAgIGxpYl9zZng9bWQKLWZpCi0KLSMgQ2FsY3VsYXRlIGRlYnVnIGxpYiBuYW1lczogSWYgYSBsaWIgZW5kcyBpbiAke2xpYl9zZnh9LmxpYiwgdGhlbiByZW5hbWUKLSMgaXQgdG8gJHtsaWJfc2Z4fWQubGliLiBUaGlzIHByZWNsdWRlcyBsaW5raW5nIHRvIHJlbGVhc2UgbGlicyBmcm9tIGEKLSMgZGVidWcgZXhlLCBzbyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlZmFjdG9yZWQgbGF0ZXIuCi1mb3IgbGliIGluICR7bGlic307IGRvCi0gICAgaWYgWyAiJGxpYiIgIT0gIiR7bGliJSR7bGliX3NmeH0ubGlifSIgXTsgdGhlbgotICAgICAgICBsaWI9JHtsaWIlLmxpYn1kLmxpYgotICAgIGZpCi0gICAgZGVidWdfbGlicz0iJHtkZWJ1Z19saWJzfSR7ZGVidWdfbGliczorIH0ke2xpYn0iCi1kb25lCi0KLQotIyBMaXN0IEtleXdvcmQgZm9yIHRoaXMgdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0IiBpbgotICAgIHg4NiopIGtleXdvcmQ9Ik1hbmFnZWRDUHJvaiIKLSAgICA7OwotICAgICopIGRpZSAiVW5zdXBwb3J0ZWQgdGFyZ2V0ICR0YXJnZXQhIgotZXNhYwotCi0jIExpc3Qgb2YgYWxsIHBsYXRmb3JtcyBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0IiBpbgotICAgIHg4Nl82NCopCi0gICAgICAgIHBsYXRmb3Jtc1swXT0ieDY0IgotICAgIDs7Ci0gICAgeDg2KikKLSAgICAgICAgcGxhdGZvcm1zWzBdPSJXaW4zMiIKLSAgICAgICAgIyB0aGVzZSBhcmUgb25seSB1c2VkIGJ5IHZzNwotICAgICAgICBhc21fRGVidWdfY21kbGluZT0ieWFzbSAtWHZjIC1nIGN2OCAtZiBcJChQbGF0Zm9ybU5hbWUpICR7eWFzbWluY3N9ICZxdW90O1wkKElucHV0UGF0aCkmcXVvdDsiCi0gICAgICAgIGFzbV9SZWxlYXNlX2NtZGxpbmU9Inlhc20gLVh2YyAtZiBcJChQbGF0Zm9ybU5hbWUpICR7eWFzbWluY3N9ICZxdW90O1wkKElucHV0UGF0aCkmcXVvdDsiCi0gICAgOzsKLSAgICAqKSBkaWUgIlVuc3VwcG9ydGVkIHRhcmdldCAkdGFyZ2V0ISIKLSAgICA7OwotZXNhYwotCi1nZW5lcmF0ZV92Y3Byb2ooKSB7Ci0gICAgY2FzZSAiJHByb2pfa2luZCIgaW4KLSAgICAgICAgZXhlKSB2c19Db25maWd1cmF0aW9uVHlwZT0xCi0gICAgICAgIDs7Ci0gICAgICAgICopICAgdnNfQ29uZmlndXJhdGlvblR5cGU9NAotICAgICAgICA7OwotICAgIGVzYWMKLQotICAgIGVjaG8gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIldpbmRvd3MtMTI1MlwiPz4iCi0gICAgb3Blbl90YWcgVmlzdWFsU3R1ZGlvUHJvamVjdCBcCi0gICAgICAgIFByb2plY3RUeXBlPSJWaXN1YWwgQysrIiBcCi0gICAgICAgIFZlcnNpb249IiR7dnNfdmVyX2lkfSIgXAotICAgICAgICBOYW1lPSIke25hbWV9IiBcCi0gICAgICAgIFByb2plY3RHVUlEPSJ7JHtndWlkfX0iIFwKLSAgICAgICAgUm9vdE5hbWVzcGFjZT0iJHtuYW1lfSIgXAotICAgICAgICBLZXl3b3JkPSIke2tleXdvcmR9IiBcCi0KLSAgICBvcGVuX3RhZyBQbGF0Zm9ybXMKLSAgICBmb3IgcGxhdCBpbiAiJHtwbGF0Zm9ybXNbQF19IjsgZG8KLSAgICAgICAgdGFnIFBsYXRmb3JtIE5hbWU9IiRwbGF0IgotICAgIGRvbmUKLSAgICBjbG9zZV90YWcgUGxhdGZvcm1zCi0KLSAgICBvcGVuX3RhZyBUb29sRmlsZXMKLSAgICBjYXNlICIkdGFyZ2V0IiBpbgotICAgICAgICB4ODYqKSAkdXNlc19hc20gJiYgdGFnIFRvb2xGaWxlIFJlbGF0aXZlUGF0aD0iJHNlbGZfZGlybmFtZS8uLi94ODYtbXN2cy95YXNtLnJ1bGVzIgotICAgICAgICA7OwotICAgIGVzYWMKLSAgICBjbG9zZV90YWcgVG9vbEZpbGVzCi0KLSAgICBvcGVuX3RhZyBDb25maWd1cmF0aW9ucwotICAgIGZvciBwbGF0IGluICIke3BsYXRmb3Jtc1tAXX0iOyBkbwotICAgICAgICBwbGF0X25vX3dzPWBlY2hvICRwbGF0IHwgc2VkICdzL1teQS1aYS16MC05X10vXy9nJ2AKLSAgICAgICAgb3Blbl90YWcgQ29uZmlndXJhdGlvbiBcCi0gICAgICAgICAgICBOYW1lPSJEZWJ1Z3wkcGxhdCIgXAotICAgICAgICAgICAgT3V0cHV0RGlyZWN0b3J5PSJcJChTb2x1dGlvbkRpcikkcGxhdF9ub193cy9cJChDb25maWd1cmF0aW9uTmFtZSkiIFwKLSAgICAgICAgICAgIEludGVybWVkaWF0ZURpcmVjdG9yeT0iJHBsYXRfbm9fd3MvXCQoQ29uZmlndXJhdGlvbk5hbWUpLyR7bmFtZX0iIFwKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25UeXBlPSIkdnNfQ29uZmlndXJhdGlvblR5cGUiIFwKLSAgICAgICAgICAgIENoYXJhY3RlclNldD0iMSIgXAotCi0gICAgICAgIGNhc2UgIiR0YXJnZXQiIGluCi0gICAgICAgICAgICB4ODYqKQotICAgICAgICAgICAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgICAgICAgICAgICAgICBvYmpfaW50X2V4dHJhY3QpCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvbj0iMCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiRpbmNzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO0RFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVMaWJyYXJ5PSIkZGVidWdfcnVudGltZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcm5pbmdMZXZlbD0iMyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjEiIFwKLSAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgdnB4KQotICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZT0iY2FsbCBvYmpfaW50X2V4dHJhY3QuYmF0ICRzcmNfcGF0aF9iYXJlIiBcCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uPSIwIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJGluY3MiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTskZGVmaW5lcyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVMaWJyYXJ5PSIkZGVidWdfcnVudGltZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsPSIzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIgXAotCi0gICAgICAgICAgICAgICAgICAgICAgICAkdXNlc19hc20gJiYgdGFnIFRvb2wgTmFtZT0iWUFTTSIgIEluY2x1ZGVQYXRocz0iJGluY3MiIERlYnVnPSIxIgotICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb249IjAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkaW5jcyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFOyRkZWZpbmVzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZUxpYnJhcnk9IiRkZWJ1Z19ydW50aW1lIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuaW5nTGV2ZWw9IjMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIiBcCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICR1c2VzX2FzbSAmJiB0YWcgVG9vbCBOYW1lPSJZQVNNIiAgSW5jbHVkZVBhdGhzPSIkaW5jcyIgRGVidWc9IjEiCi0gICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiRwcm9qX2tpbmQiIGluCi0gICAgICAgICAgICBleGUpCi0gICAgICAgICAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KLSAgICAgICAgICAgICAgICAgICAgeDg2KikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9pbnRfZXh0cmFjdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNMaW5rZXJUb29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlPSIke25hbWV9LmV4ZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpbmtlclRvb2wiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiRkZWJ1Z19saWJzIFwkKE5vSW5oZXJpdCkiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiRsaWJkaXJzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1EYXRhYmFzZUZpbGU9IlwkKE91dERpcikvJHtuYW1lfS5wZGIiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICA7OwotICAgICAgICAgICAgbGliKQotICAgICAgICAgICAgICAgIGNhc2UgIiR0YXJnZXQiIGluCi0gICAgICAgICAgICAgICAgICAgIHg4NiopCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZT0iXCQoT3V0RGlyKS8ke25hbWV9JHtsaWJfc2Z4fWQubGliIiBcCi0KLSAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICA7OwotICAgICAgICAgICAgZGxsKQotICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKLSAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNMaW5rZXJUb29sIiBcCi0gICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IlwkKE5vSW5oZXJpdCkiIFwKLSAgICAgICAgICAgICAgICAgICAgTGlua0luY3JlbWVudGFsPSIyIiBcCi0gICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIgXAotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseURlYnVnPSIxIiBcCi0gICAgICAgICAgICAgICAgICAgIFRhcmdldE1hY2hpbmU9IjEiIFwKLSAgICAgICAgICAgICAgICAgICAgJGxpbmtfb3B0cyBcCi0KLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjbG9zZV90YWcgQ29uZmlndXJhdGlvbgotCi0gICAgICAgIG9wZW5fdGFnIENvbmZpZ3VyYXRpb24gXAotICAgICAgICAgICAgTmFtZT0iUmVsZWFzZXwkcGxhdCIgXAotICAgICAgICAgICAgT3V0cHV0RGlyZWN0b3J5PSJcJChTb2x1dGlvbkRpcikkcGxhdF9ub193cy9cJChDb25maWd1cmF0aW9uTmFtZSkiIFwKLSAgICAgICAgICAgIEludGVybWVkaWF0ZURpcmVjdG9yeT0iJHBsYXRfbm9fd3MvXCQoQ29uZmlndXJhdGlvbk5hbWUpLyR7bmFtZX0iIFwKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25UeXBlPSIkdnNfQ29uZmlndXJhdGlvblR5cGUiIFwKLSAgICAgICAgICAgIENoYXJhY3RlclNldD0iMSIgXAotICAgICAgICAgICAgV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIwIiBcCi0KLSAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KLSAgICAgICAgICAgIHg4NiopCi0gICAgICAgICAgICAgICAgY2FzZSAiJG5hbWUiIGluCi0gICAgICAgICAgICAgICAgICAgIG9ial9pbnRfZXh0cmFjdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJGluY3MiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVMaWJyYXJ5PSIkcmVsZWFzZV9ydW50aW1lIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuaW5nTGV2ZWw9IjMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBcCi0gICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgIHZweCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmU9ImNhbGwgb2JqX2ludF9leHRyYWN0LmJhdCAkc3JjX3BhdGhfYmFyZSIgXAotCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiRpbmNzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7JGRlZmluZXMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lTGlicmFyeT0iJHJlbGVhc2VfcnVudGltZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsPSIzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIgXAotCi0gICAgICAgICAgICAgICAgICAgICAgICAkdXNlc19hc20gJiYgdGFnIFRvb2wgTmFtZT0iWUFTTSIgIEluY2x1ZGVQYXRocz0iJGluY3MiCi0gICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiRpbmNzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7JGRlZmluZXMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lTGlicmFyeT0iJHJlbGVhc2VfcnVudGltZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsPSIzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIgXAotCi0gICAgICAgICAgICAgICAgICAgICAgICAkdXNlc19hc20gJiYgdGFnIFRvb2wgTmFtZT0iWUFTTSIgIEluY2x1ZGVQYXRocz0iJGluY3MiCi0gICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiRwcm9qX2tpbmQiIGluCi0gICAgICAgICAgICBleGUpCi0gICAgICAgICAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KLSAgICAgICAgICAgICAgICAgICAgeDg2KikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9pbnRfZXh0cmFjdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNMaW5rZXJUb29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlPSIke25hbWV9LmV4ZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpbmtlclRvb2wiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiRsaWJzIFwkKE5vSW5oZXJpdCkiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiRsaWJkaXJzIiBcCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICA7OwotICAgICAgICAgICAgbGliKQotICAgICAgICAgICAgICAgIGNhc2UgIiR0YXJnZXQiIGluCi0gICAgICAgICAgICAgICAgICAgIHg4NiopCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZT0iXCQoT3V0RGlyKS8ke25hbWV9JHtsaWJfc2Z4fS5saWIiIFwKLQotICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBkbGwpICMgbm90ZSBkaWZmZXJlbmNlcyB0byBkZWJ1ZyB2ZXJzaW9uOiBMaW5rSW5jcmVtZW50YWwsIEFzc2VtYmx5RGVidWcKLSAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCi0gICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDTGlua2VyVG9vbCIgXAotICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJcJChOb0luaGVyaXQpIiBcCi0gICAgICAgICAgICAgICAgICAgIExpbmtJbmNyZW1lbnRhbD0iMSIgXAotICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiIFwKLSAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZT0iMSIgXAotICAgICAgICAgICAgICAgICAgICAkbGlua19vcHRzIFwKLQotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNsb3NlX3RhZyBDb25maWd1cmF0aW9uCi0gICAgZG9uZQotICAgIGNsb3NlX3RhZyBDb25maWd1cmF0aW9ucwotCi0gICAgb3Blbl90YWcgRmlsZXMKLSAgICBnZW5lcmF0ZV9maWx0ZXIgc3JjcyAgICJTb3VyY2UgRmlsZXMiICAgImM7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKLSAgICBnZW5lcmF0ZV9maWx0ZXIgaGRycyAgICJIZWFkZXIgRmlsZXMiICAgImg7aG07aW5sO2luYzt4c2QiCi0gICAgZ2VuZXJhdGVfZmlsdGVyIHJlc3JjcyAiUmVzb3VyY2UgRmlsZXMiICJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2IgotICAgIGdlbmVyYXRlX2ZpbHRlciByZXNyY3MgIkJ1aWxkIEZpbGVzIiAgICAibWsiCi0gICAgY2xvc2VfdGFnIEZpbGVzCi0KLSAgICB0YWcgICAgICAgR2xvYmFscwotICAgIGNsb3NlX3RhZyBWaXN1YWxTdHVkaW9Qcm9qZWN0Ci0KLSAgICAjIFRoaXMgbXVzdCBiZSBkb25lIGZyb20gd2l0aGluIHRoZSB7fSBzdWJzaGVsbAotICAgIGVjaG8gIklnbm9yZWQgZmlsZXMgbGlzdCAoJHsjZmlsZV9saXN0W0BdfSBpdGVtcykgaXM6IiA+JjIKLSAgICBmb3IgZiBpbiAiJHtmaWxlX2xpc3RbQF19IjsgZG8KLSAgICAgICAgZWNobyAiICAgICRmIiA+JjIKLSAgICBkb25lCi19Ci0KLWdlbmVyYXRlX3ZjcHJvaiB8Ci0gICAgc2VkICAtZSAnLyIvcztcKFteICJdXCkvO1wxXFw7ZycgPiAke291dGZpbGV9Ci0KLWV4aXQKLTwhLS0KLVRPRE86IEFkZCBhbnkgZmlsZXMgbm90IGNhcHR1cmVkIGJ5IGZpbHRlcnMuCi0gICAgICAgICAgICAgICAgPEZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aXZlUGF0aD0iLlxSZWFkTWUudHh0IgotICAgICAgICAgICAgICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgIDwvRmlsZT4KLS0tPgpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZS9vYmpfaW50X2V4dHJhY3QuYyBiL2J1aWxkL21ha2Uvb2JqX2ludF9leHRyYWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmQ5ZDUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZS9vYmpfaW50X2V4dHJhY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPHNoYXJlLmg+Ci0jaW5jbHVkZSAidnB4L3ZweF9pbnRlZ2VyLmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE9VVFBVVF9GTVRfUExBSU4sCi0gICAgT1VUUFVUX0ZNVF9SVkRTLAotICAgIE9VVFBVVF9GTVRfR0FTLAotfSBvdXRwdXRfZm10X3Q7Ci0KLWludCBsb2dfbXNnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIGludCByZXM7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICByZXMgPSB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCi0KLSNpZiBkZWZpbmVkKF9fTUFDSF9fKQotCi0jaW5jbHVkZSA8bWFjaC1vL2xvYWRlci5oPgotI2luY2x1ZGUgPG1hY2gtby9ubGlzdC5oPgotCi1pbnQgcGFyc2VfbWFjaG8odWludDhfdCAqYmFzZV9idWYsIHNpemVfdCBzeikKLXsKLSAgICBpbnQgaSwgajsKLSAgICBzdHJ1Y3QgbWFjaF9oZWFkZXIgaGVhZGVyOwotICAgIHVpbnQ4X3QgKmJ1ZiA9IGJhc2VfYnVmOwotICAgIGludCBiYXNlX2RhdGFfc2VjdGlvbiA9IDA7Ci0gICAgaW50IGJpdHMgPSAwOwotCi0gICAgLyogV2UgY2FuIHJlYWQgaW4gbWFjaF9oZWFkZXIgZm9yIDMyIGFuZCA2NCBiaXQgYXJjaGl0ZWN0dXJlcwotICAgICAqIGJlY2F1c2UgaXQncyBpZGVudGljYWwgdG8gbWFjaF9oZWFkZXJfNjQgZXhjZXB0IGZvciB0aGUgbGFzdAotICAgICAqIGVsZW1lbnQgKHVpbnQzMl90IHJlc2VydmVkKSwgd2hpY2ggd2UgZG9uJ3QgdXNlLiBUaGVuLCB3aGVuCi0gICAgICogd2Uga25vdyB3aGljaCBhcmNoaXRlY3R1cmUgd2UncmUgbG9va2luZyBhdCwgaW5jcmVtZW50IGJ1ZgotICAgICAqIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgbWVtY3B5KCZoZWFkZXIsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBtYWNoX2hlYWRlcikpOwotCi0gICAgaWYgKGhlYWRlci5tYWdpYyA9PSBNSF9NQUdJQykKLSAgICB7Ci0gICAgICAgIGlmIChoZWFkZXIuY3B1dHlwZSA9PSBDUFVfVFlQRV9BUk0KLSAgICAgICAgICAgIHx8IGhlYWRlci5jcHV0eXBlID09IENQVV9UWVBFX1g4NikKLSAgICAgICAgewotICAgICAgICAgICAgYml0cyA9IDMyOwotICAgICAgICAgICAgYnVmICs9IHNpemVvZihzdHJ1Y3QgbWFjaF9oZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbG9nX21zZygiQmFkIGNwdXR5cGUgZm9yIG9iamVjdCBmaWxlLiBDdXJyZW50bHkgb25seSB0ZXN0ZWQgZm9yIENQVV9UWVBFX1tBUk18WDg2XS5cbiIpOwotICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGhlYWRlci5tYWdpYyA9PSBNSF9NQUdJQ182NCkKLSAgICB7Ci0gICAgICAgIGlmIChoZWFkZXIuY3B1dHlwZSA9PSBDUFVfVFlQRV9YODZfNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJpdHMgPSA2NDsKLSAgICAgICAgICAgIGJ1ZiArPSBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyXzY0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ19tc2coIkJhZCBjcHV0eXBlIGZvciBvYmplY3QgZmlsZS4gQ3VycmVudGx5IG9ubHkgdGVzdGVkIGZvciBDUFVfVFlQRV9YODZfNjQuXG4iKTsKLSAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBsb2dfbXNnKCJCYWQgbWFnaWMgbnVtYmVyIGZvciBvYmplY3QgZmlsZS4gMHgleCBvciAweCV4IGV4cGVjdGVkLCAweCV4IGZvdW5kLlxuIiwKLSAgICAgICAgICAgICAgICBNSF9NQUdJQywgTUhfTUFHSUNfNjQsIGhlYWRlci5tYWdpYyk7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoaGVhZGVyLmZpbGV0eXBlICE9IE1IX09CSkVDVCkKLSAgICB7Ci0gICAgICAgIGxvZ19tc2coIkJhZCBmaWxldHlwZSBmb3Igb2JqZWN0IGZpbGUuIEN1cnJlbnRseSBvbmx5IHRlc3RlZCBmb3IgTUhfT0JKRUNULlxuIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyLm5jbWRzOyBpKyspCi0gICAgewotICAgICAgICBzdHJ1Y3QgbG9hZF9jb21tYW5kIGxjOwotCi0gICAgICAgIG1lbWNweSgmbGMsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBsb2FkX2NvbW1hbmQpKTsKLQotICAgICAgICBpZiAobGMuY21kID09IExDX1NFR01FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnNlZ19idWYgPSBidWY7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2VjdGlvbiBzOwotICAgICAgICAgICAgc3RydWN0IHNlZ21lbnRfY29tbWFuZCBzZWdfYzsKLQotICAgICAgICAgICAgbWVtY3B5KCZzZWdfYywgc2VnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQpKTsKLSAgICAgICAgICAgIHNlZ19idWYgKz0gc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQpOwotCi0gICAgICAgICAgICAvKiBBbHRob3VnaCBlYWNoIHNlY3Rpb24gaXMgZ2l2ZW4gaXQncyBvd24gb2Zmc2V0LCBubGlzdC5uX3ZhbHVlCi0gICAgICAgICAgICAgKiByZWZlcmVuY2VzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHNlY3Rpb24uIFRoaXMgaXNuJ3QKLSAgICAgICAgICAgICAqIGFwcGFyZW50IHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24gYmVjYXVzZSB0aGUgb2Zmc2V0IG9mIHRoZQotICAgICAgICAgICAgICogZGF0YSBzZWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBzZWN0aW9uLiBIb3dldmVyLCB3aXRoCi0gICAgICAgICAgICAgKiBkZWJ1ZyBzZWN0aW9ucyBtaXhlZCBpbiwgdGhlIG9mZnNldCBvZiB0aGUgZGVidWcgc2VjdGlvbgotICAgICAgICAgICAgICogaW5jcmVhc2VzIGJ1dCBuX3ZhbHVlIHN0aWxsIHJlZmVyZW5jZXMgdGhlIGZpcnN0IHNlY3Rpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzZWdfYy5uc2VjdHMgPCAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ19tc2coIk5vdCBlbm91Z2ggc2VjdGlvbnNcbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCZzLCBzZWdfYnVmLCBzaXplb2Yoc3RydWN0IHNlY3Rpb24pKTsKLSAgICAgICAgICAgIGJhc2VfZGF0YV9zZWN0aW9uID0gcy5vZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobGMuY21kID09IExDX1NFR01FTlRfNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnNlZ19idWYgPSBidWY7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2VjdGlvbl82NCBzOwotICAgICAgICAgICAgc3RydWN0IHNlZ21lbnRfY29tbWFuZF82NCBzZWdfYzsKLQotICAgICAgICAgICAgbWVtY3B5KCZzZWdfYywgc2VnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmRfNjQpKTsKLSAgICAgICAgICAgIHNlZ19idWYgKz0gc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmRfNjQpOwotCi0gICAgICAgICAgICAvKiBFeHBsYW5hdGlvbiBpbiBMR19TRUdNRU5UICovCi0gICAgICAgICAgICBpZiAoc2VnX2MubnNlY3RzIDwgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dfbXNnKCJOb3QgZW5vdWdoIHNlY3Rpb25zXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbWNweSgmcywgc2VnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzZWN0aW9uXzY0KSk7Ci0gICAgICAgICAgICBiYXNlX2RhdGFfc2VjdGlvbiA9IHMub2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGxjLmNtZCA9PSBMQ19TWU1UQUIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiYXNlX2RhdGFfc2VjdGlvbiAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cnVjdCBzeW10YWJfY29tbWFuZCBzYzsKLSAgICAgICAgICAgICAgICB1aW50OF90ICpzeW1fYnVmID0gYmFzZV9idWY7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqc3RyX2J1ZiA9IGJhc2VfYnVmOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCZzYywgYnVmLCBzaXplb2Yoc3RydWN0IHN5bXRhYl9jb21tYW5kKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2MuY21kc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHN5bXRhYl9jb21tYW5kKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ19tc2coIkNhbid0IGZpbmQgc3ltYm9sIHRhYmxlIVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzeW1fYnVmICs9IHNjLnN5bW9mZjsKLSAgICAgICAgICAgICAgICBzdHJfYnVmICs9IHNjLnN0cm9mZjsKLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzYy5uc3ltczsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2Ygc3RyaW5nIGlzIGNhY2x1YXRlZCBlYWNoIHRpbWUgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogc3RhcnQgb2YgdGhlIHN0cmluZyBidWZmZXIuICBPbiBkYXJ3aW4gdGhlIHN5bWJvbHMKLSAgICAgICAgICAgICAgICAgICAgICogYXJlIHByZWZpeGVkIGJ5ICJfIiwgc28gd2UgYnVtcCB0aGUgcG9pbnRlciBieSAxLgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGFyZ2V0IHZhbHVlIGlzIGRlZmluZWQgYXMgYW4gaW50IGluIGFzbV8qX29mZnNldHMuYywKLSAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggaXMgNCBieXRlcyBvbiBhbGwgdGFyZ2V0cyB3ZSBjdXJyZW50bHkgdXNlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gMzIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBubGlzdCBubDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbmwsIHN5bV9idWYsIHNpemVvZihzdHJ1Y3Qgbmxpc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9idWYgKz0gc2l6ZW9mKHN0cnVjdCBubGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsLCBiYXNlX2J1ZiArIGJhc2VfZGF0YV9zZWN0aW9uICsgbmwubl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAlNWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2J1ZiArIG5sLm5fdW4ubl9zdHJ4ICsgMSwgdmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGlmIChiaXRzID09IDY0KSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgbmxpc3RfNjQgbmw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJm5sLCBzeW1fYnVmLCBzaXplb2Yoc3RydWN0IG5saXN0XzY0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW1fYnVmICs9IHNpemVvZihzdHJ1Y3Qgbmxpc3RfNjQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbCwgYmFzZV9idWYgKyBiYXNlX2RhdGFfc2VjdGlvbiArIG5sLm5fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZhbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgJTVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9idWYgKyBubC5uX3VuLm5fc3RyeCArIDEsIHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBidWYgKz0gbGMuY21kc2l6ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLWJhaWw6Ci0gICAgcmV0dXJuIDE7Ci0KLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBmZDsKLSAgICBjaGFyICpmOwotICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotICAgIHVpbnQ4X3QgKmZpbGVfYnVmOwotICAgIGludCByZXM7Ci0KLSAgICBpZiAoYXJnYyA8IDIgfHwgYXJnYyA+IDMpCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3V0cHV0IGZvcm1hdF0gPG9iaiBmaWxlPlxuXG4iLCBhcmd2WzBdKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIDxvYmogZmlsZT5cdE1hY2hPIGZvcm1hdCBvYmplY3QgZmlsZSB0byBwYXJzZVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IEZvcm1hdHM6XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGdhcyAgLSBjb21wYXRpYmxlIHdpdGggR05VIGFzc2VtYmxlclxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBydmRzIC0gY29tcGF0aWJsZSB3aXRoIGFybWFzbVxuIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmID0gYXJndlsyXTsKLQotICAgIGlmICghKCghc3RyY21wKGFyZ3ZbMV0sICJydmRzIikpIHx8ICghc3RyY21wKGFyZ3ZbMV0sICJnYXMiKSkpKQotICAgICAgICBmID0gYXJndlsxXTsKLQotICAgIGZkID0gb3BlbihmLCBPX1JET05MWSk7Ci0KLSAgICBpZiAoZmQgPCAwKQotICAgIHsKLSAgICAgICAgcGVycm9yKCJVbmFibGUgdG8gb3BlbiBmaWxlIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoZnN0YXQoZmQsICZzdGF0X2J1ZikpCi0gICAgewotICAgICAgICBwZXJyb3IoInN0YXQiKTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGZpbGVfYnVmID0gbWFsbG9jKHN0YXRfYnVmLnN0X3NpemUpOwotCi0gICAgaWYgKCFmaWxlX2J1ZikKLSAgICB7Ci0gICAgICAgIHBlcnJvcigibWFsbG9jIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAocmVhZChmZCwgZmlsZV9idWYsIHN0YXRfYnVmLnN0X3NpemUpICE9IHN0YXRfYnVmLnN0X3NpemUpCi0gICAgewotICAgICAgICBwZXJyb3IoInJlYWQiKTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGlmIChjbG9zZShmZCkpCi0gICAgewotICAgICAgICBwZXJyb3IoImNsb3NlIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICByZXMgPSBwYXJzZV9tYWNobyhmaWxlX2J1Ziwgc3RhdF9idWYuc3Rfc2l6ZSk7Ci0gICAgZnJlZShmaWxlX2J1Zik7Ci0KLSAgICBpZiAoIXJlcykKLSAgICAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLQotYmFpbDoKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotfQotCi0jZWxpZiBkZWZpbmVkKF9fRUxGX18pCi0jaW5jbHVkZSAiZWxmLmgiCi0KLSNkZWZpbmUgQ09QWV9TVFJVQ1QoZHN0LCBidWYsIG9mc3QsIHN6KSBkbyB7XAotICAgICAgICBpZihvZnN0ICsgc2l6ZW9mKCgqKGRzdCkpKSA+IHN6KSBnb3RvIGJhaWw7XAotICAgICAgICBtZW1jcHkoZHN0LCBidWYrb2ZzdCwgc2l6ZW9mKCgqKGRzdCkpKSk7XAotICAgIH0gd2hpbGUoMCkKLQotI2RlZmluZSBFTkRJQU5fQVNTSUdOKHZhbCwgbWVtYikgZG8ge1wKLSAgICAgICAgaWYoIWVsZi0+bGVfZGF0YSkge2xvZ19tc2coIkJpZyBFbmRpYW4gZGF0YSBub3Qgc3VwcG9ydGVkIHlldCFcbiIpO2dvdG8gYmFpbDt9XAotICAgICAgICAodmFsKSA9IChtZW1iKTtcCi0gICAgfSB3aGlsZSgwKQotCi0jZGVmaW5lIEVORElBTl9BU1NJR05fSU5fUExBQ0UobWVtYikgZG8ge1wKLSAgICAgICAgRU5ESUFOX0FTU0lHTihtZW1iLCBtZW1iKTtcCi0gICAgfSB3aGlsZSgwKQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQ4X3QgICAgICAqYnVmOyAvKiBCdWZmZXIgY29udGFpbmluZyBFTEYgZGF0YSAqLwotICAgIHNpemVfdCAgICAgICAgc3o7ICAvKiBCdWZmZXIgc2l6ZSAqLwotICAgIGludCAgICAgICAgICAgbGVfZGF0YTsgLyogRGF0YSBpcyBsaXR0bGUtZW5kaWFuICovCi0gICAgdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07IC8qIE1hZ2ljIG51bWJlciBhbmQgb3RoZXIgaW5mbyAqLwotICAgIGludCAgICAgICAgICAgYml0czsgLyogMzIgb3IgNjQgKi8KLSAgICBFbGYzMl9FaGRyICAgIGhkcjMyOwotICAgIEVsZjY0X0VoZHIgICAgaGRyNjQ7Ci19IGVsZl9vYmpfdDsKLQotaW50IHBhcnNlX2VsZl9oZWFkZXIoZWxmX29ial90ICplbGYpCi17Ci0gICAgaW50IHJlczsKLSAgICAvKiBWZXJpZnkgRUxGIE1hZ2ljIG51bWJlcnMgKi8KLSAgICBDT1BZX1NUUlVDVCgmZWxmLT5lX2lkZW50LCBlbGYtPmJ1ZiwgMCwgZWxmLT5zeik7Ci0gICAgcmVzID0gZWxmLT5lX2lkZW50W0VJX01BRzBdID09IEVMRk1BRzA7Ci0gICAgcmVzICY9IGVsZi0+ZV9pZGVudFtFSV9NQUcxXSA9PSBFTEZNQUcxOwotICAgIHJlcyAmPSBlbGYtPmVfaWRlbnRbRUlfTUFHMl0gPT0gRUxGTUFHMjsKLSAgICByZXMgJj0gZWxmLT5lX2lkZW50W0VJX01BRzNdID09IEVMRk1BRzM7Ci0gICAgcmVzICY9IGVsZi0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMgotICAgICAgICB8fCBlbGYtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQ7Ci0gICAgcmVzICY9IGVsZi0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQjsKLQotICAgIGlmICghcmVzKSBnb3RvIGJhaWw7Ci0KLSAgICBlbGYtPmxlX2RhdGEgPSBlbGYtPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0I7Ci0KLSAgICAvKiBSZWFkIGluIHJlbGV2YW50IHZhbHVlcyAqLwotICAgIGlmIChlbGYtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgICBlbGYtPmJpdHMgPSAzMjsKLSAgICAgICAgQ09QWV9TVFJVQ1QoJmVsZi0+aGRyMzIsIGVsZi0+YnVmLCAwLCBlbGYtPnN6KTsKLQotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV90eXBlKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfbWFjaGluZSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3ZlcnNpb24pOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9lbnRyeSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3Bob2ZmKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfc2hvZmYpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9mbGFncyk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX2Voc2l6ZSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3BoZW50c2l6ZSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3BobnVtKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfc2hlbnRzaXplKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfc2hudW0pOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9zaHN0cm5keCk7Ci0gICAgfQotICAgIGVsc2UgLyogaWYgKGVsZi0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCkgKi8KLSAgICB7Ci0gICAgICAgIGVsZi0+Yml0cyA9IDY0OwotICAgICAgICBDT1BZX1NUUlVDVCgmZWxmLT5oZHI2NCwgZWxmLT5idWYsIDAsIGVsZi0+c3opOwotCi0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX3R5cGUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9tYWNoaW5lKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfdmVyc2lvbik7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX2VudHJ5KTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfcGhvZmYpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9zaG9mZik7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX2ZsYWdzKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfZWhzaXplKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfcGhlbnRzaXplKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfcGhudW0pOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9zaGVudHNpemUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9zaG51bSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX3Noc3RybmR4KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLWJhaWw6Ci0gICAgbG9nX21zZygiRmFpbGVkIHRvIHBhcnNlIEVMRiBmaWxlIGhlYWRlciIpOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgcGFyc2VfZWxmX3NlY3Rpb24oZWxmX29ial90ICplbGYsIGludCBpZHgsIEVsZjMyX1NoZHIgKmhkcjMyLCBFbGY2NF9TaGRyICpoZHI2NCkKLXsKLSAgICBpZiAoaGRyMzIpCi0gICAgewotICAgICAgICBpZiAoaWR4ID49IGVsZi0+aGRyMzIuZV9zaG51bSkKLSAgICAgICAgICAgIGdvdG8gYmFpbDsKLQotICAgICAgICBDT1BZX1NUUlVDVChoZHIzMiwgZWxmLT5idWYsIGVsZi0+aGRyMzIuZV9zaG9mZiArIGlkeCAqIGVsZi0+aGRyMzIuZV9zaGVudHNpemUsCi0gICAgICAgICAgICAgICAgICAgIGVsZi0+c3opOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9uYW1lKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHIzMi0+c2hfdHlwZSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX2ZsYWdzKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHIzMi0+c2hfYWRkcik7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX29mZnNldCk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX3NpemUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9saW5rKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHIzMi0+c2hfaW5mbyk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX2FkZHJhbGlnbik7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX2VudHNpemUpOwotICAgIH0KLSAgICBlbHNlIC8qIGlmIChoZHI2NCkgKi8KLSAgICB7Ci0gICAgICAgIGlmIChpZHggPj0gZWxmLT5oZHI2NC5lX3NobnVtKQotICAgICAgICAgICAgZ290byBiYWlsOwotCi0gICAgICAgIENPUFlfU1RSVUNUKGhkcjY0LCBlbGYtPmJ1ZiwgZWxmLT5oZHI2NC5lX3Nob2ZmICsgaWR4ICogZWxmLT5oZHI2NC5lX3NoZW50c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZWxmLT5zeik7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX25hbWUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjY0LT5zaF90eXBlKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfZmxhZ3MpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjY0LT5zaF9hZGRyKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfb2Zmc2V0KTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfc2l6ZSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX2xpbmspOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjY0LT5zaF9pbmZvKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfYWRkcmFsaWduKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfZW50c2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci1iYWlsOgotICAgIHJldHVybiAxOwotfQotCi1jaGFyICpwYXJzZV9lbGZfc3RyaW5nX3RhYmxlKGVsZl9vYmpfdCAqZWxmLCBpbnQgc19pZHgsIGludCBpZHgpCi17Ci0gICAgaWYgKGVsZi0+Yml0cyA9PSAzMikKLSAgICB7Ci0gICAgICAgIEVsZjMyX1NoZHIgc2hkcjsKLQotICAgICAgICBpZiAocGFyc2VfZWxmX3NlY3Rpb24oZWxmLCBzX2lkeCwgJnNoZHIsIE5VTEwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dfbXNnKCJGYWlsZWQgdG8gcGFyc2UgRUxGIHN0cmluZyB0YWJsZTogc2VjdGlvbiAlZCwgaW5kZXggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNfaWR4LCBpZHgpOwotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChjaGFyICopKGVsZi0+YnVmICsgc2hkci5zaF9vZmZzZXQgKyBpZHgpOwotICAgIH0KLSAgICBlbHNlIC8qIGlmIChlbGYtPmJpdHMgPT0gNjQpICovCi0gICAgewotICAgICAgICBFbGY2NF9TaGRyIHNoZHI7Ci0KLSAgICAgICAgaWYgKHBhcnNlX2VsZl9zZWN0aW9uKGVsZiwgc19pZHgsIE5VTEwsICZzaGRyKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nX21zZygiRmFpbGVkIHRvIHBhcnNlIEVMRiBzdHJpbmcgdGFibGU6IHNlY3Rpb24gJWQsIGluZGV4ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBzX2lkeCwgaWR4KTsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoY2hhciAqKShlbGYtPmJ1ZiArIHNoZHIuc2hfb2Zmc2V0ICsgaWR4KTsKLSAgICB9Ci19Ci0KLWludCBwYXJzZV9lbGZfc3ltYm9sKGVsZl9vYmpfdCAqZWxmLCB1bnNpZ25lZCBpbnQgb2ZzdCwgRWxmMzJfU3ltICpzeW0zMiwgRWxmNjRfU3ltICpzeW02NCkKLXsKLSAgICBpZiAoc3ltMzIpCi0gICAgewotICAgICAgICBDT1BZX1NUUlVDVChzeW0zMiwgZWxmLT5idWYsIG9mc3QsIGVsZi0+c3opOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTMyLT5zdF9uYW1lKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW0zMi0+c3RfdmFsdWUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTMyLT5zdF9zaXplKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW0zMi0+c3RfaW5mbyk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltMzItPnN0X290aGVyKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW0zMi0+c3Rfc2huZHgpOwotICAgIH0KLSAgICBlbHNlIC8qIGlmIChzeW02NCkgKi8KLSAgICB7Ci0gICAgICAgIENPUFlfU1RSVUNUKHN5bTY0LCBlbGYtPmJ1Ziwgb2ZzdCwgZWxmLT5zeik7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltNjQtPnN0X25hbWUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTY0LT5zdF92YWx1ZSk7Ci0gICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltNjQtPnN0X3NpemUpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTY0LT5zdF9pbmZvKTsKLSAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW02NC0+c3Rfb3RoZXIpOwotICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTY0LT5zdF9zaG5keCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotYmFpbDoKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IHBhcnNlX2VsZih1aW50OF90ICpidWYsIHNpemVfdCBzeiwgb3V0cHV0X2ZtdF90IG1vZGUpCi17Ci0gICAgZWxmX29ial90ICAgIGVsZjsKLSAgICB1bnNpZ25lZCBpbnQgb2ZzdDsKLSAgICBpbnQgICAgICAgICAgaTsKLSAgICBFbGYzMl9PZmYgICAgc3RydGFiX29mZjMyOwotICAgIEVsZjY0X09mZiAgICBzdHJ0YWJfb2ZmNjQ7IC8qIHNhdmUgU3RyaW5nIFRhYmxlIG9mZnNldCBmb3IgbGF0ZXIgdXNlICovCi0KLSAgICBtZW1zZXQoJmVsZiwgMCwgc2l6ZW9mKGVsZikpOwotICAgIGVsZi5idWYgPSBidWY7Ci0gICAgZWxmLnN6ID0gc3o7Ci0KLSAgICAvKiBQYXJzZSBIZWFkZXIgKi8KLSAgICBpZiAocGFyc2VfZWxmX2hlYWRlcigmZWxmKSkKLSAgICAgIGdvdG8gYmFpbDsKLQotICAgIGlmIChlbGYuYml0cyA9PSAzMikKLSAgICB7Ci0gICAgICAgIEVsZjMyX1NoZHIgc2hkcjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGVsZi5oZHIzMi5lX3NobnVtOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlX2VsZl9zZWN0aW9uKCZlbGYsIGksICZzaGRyLCBOVUxMKTsKLQotICAgICAgICAgICAgaWYgKHNoZHIuc2hfdHlwZSA9PSBTSFRfU1RSVEFCKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgc3RydHNiX25hbWVbMTI4XTsKLQotICAgICAgICAgICAgICAgIHN0cmNweShzdHJ0c2JfbmFtZSwgKGNoYXIgKikoZWxmLmJ1ZiArIHNoZHIuc2hfb2Zmc2V0ICsgc2hkci5zaF9uYW1lKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIShzdHJjbXAoc3RydHNiX25hbWUsICIuc2hzdHJ0YWIiKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBsb2dfbXNnKCJmb3VuZCBzZWN0aW9uOiAlc1xuIiwgc3RydHNiX25hbWUpOyAqLwotICAgICAgICAgICAgICAgICAgICBzdHJ0YWJfb2ZmMzIgPSBzaGRyLnNoX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogaWYgKGVsZi5iaXRzID09IDY0KSAqLwotICAgIHsKLSAgICAgICAgRWxmNjRfU2hkciBzaGRyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmLmhkcjY0LmVfc2hudW07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2VfZWxmX3NlY3Rpb24oJmVsZiwgaSwgTlVMTCwgJnNoZHIpOwotCi0gICAgICAgICAgICBpZiAoc2hkci5zaF90eXBlID09IFNIVF9TVFJUQUIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBzdHJ0c2JfbmFtZVsxMjhdOwotCi0gICAgICAgICAgICAgICAgc3RyY3B5KHN0cnRzYl9uYW1lLCAoY2hhciAqKShlbGYuYnVmICsgc2hkci5zaF9vZmZzZXQgKyBzaGRyLnNoX25hbWUpKTsKLQotICAgICAgICAgICAgICAgIGlmICghKHN0cmNtcChzdHJ0c2JfbmFtZSwgIi5zaHN0cnRhYiIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGxvZ19tc2coImZvdW5kIHNlY3Rpb246ICVzXG4iLCBzdHJ0c2JfbmFtZSk7ICovCi0gICAgICAgICAgICAgICAgICAgIHN0cnRhYl9vZmY2NCA9IHNoZHIuc2hfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQYXJzZSBhbGwgU3ltYm9sIFRhYmxlcyAqLwotICAgIGlmIChlbGYuYml0cyA9PSAzMikKLSAgICB7Ci0gICAgICAgIEVsZjMyX1NoZHIgc2hkcjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGVsZi5oZHIzMi5lX3NobnVtOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlX2VsZl9zZWN0aW9uKCZlbGYsIGksICZzaGRyLCBOVUxMKTsKLQotICAgICAgICAgICAgaWYgKHNoZHIuc2hfdHlwZSA9PSBTSFRfU1lNVEFCKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAob2ZzdCA9IHNoZHIuc2hfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgb2ZzdCA8IHNoZHIuc2hfb2Zmc2V0ICsgc2hkci5zaF9zaXplOwotICAgICAgICAgICAgICAgICAgICAgb2ZzdCArPSBzaGRyLnNoX2VudHNpemUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFbGYzMl9TeW0gc3ltOwotCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zeW1ib2woJmVsZiwgb2ZzdCwgJnN5bSwgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogRm9yIGFsbCBPQkpFQ1RTIChkYXRhIG9iamVjdHMpLCBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBwcm9wZXIgZGF0YSBzZWdtZW50LgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogaWYgKEVMRjMyX1NUX1RZUEUoc3ltLnN0X2luZm8pID09IFNUVF9PQkpFQ1QgJiYgc3ltLnN0X25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKCJmb3VuZCBkYXRhIG9iamVjdCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3N0cmluZ190YWJsZSgmZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZHIuc2hfbGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAoRUxGMzJfU1RfVFlQRShzeW0uc3RfaW5mbykgPT0gU1RUX09CSkVDVAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3ltLnN0X3NpemUgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRWxmMzJfU2hkciBkaGRyOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNlY3Rpb25fbmFtZVsxMjhdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc2VjdGlvbigmZWxmLCBzeW0uc3Rfc2huZHgsICZkaGRyLCBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGV4cGxhbml0aW9uIC0gcmVmZXIgdG8gX01TQ19WRVIgdmVyc2lvbiBvZiBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoc2VjdGlvbl9uYW1lLCAoY2hhciAqKShlbGYuYnVmICsgc3RydGFiX29mZjMyICsgZGhkci5zaF9uYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dfbXNnKCJTZWN0aW9uX25hbWU6ICVzLCBTZWN0aW9uX3R5cGU6ICVkXG4iLCBzZWN0aW9uX25hbWUsIGRoZHIuc2hfdHlwZSk7ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiLmJzcyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplb2YodmFsKSAhPSBzeW0uc3Rfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0YXJnZXQgdmFsdWUgaXMgZGVjbGFyZWQgYXMgYW4gaW50IGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzbV8qX29mZnNldHMuYywgd2hpY2ggaXMgNCBieXRlcyBvbiBhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGFyZ2V0cyB3ZSBjdXJyZW50bHkgdXNlLiBDb21wbGFpbiBsb3VkbHkgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcyBpcyBub3QgdHJ1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2coIlN5bWJvbCBzaXplIGlzIHdyb25nXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYuYnVmICsgZGhkci5zaF9vZmZzZXQgKyBzeW0uc3RfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5zdF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGYubGVfZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKCJCaWcgRW5kaWFuIGRhdGEgbm90IHN1cHBvcnRlZCB5ZXQhXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9VVFBVVF9GTVRfUlZEUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgJTVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3N0cmluZ190YWJsZSgmZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGRyLnNoX2xpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5zdF9uYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1VUUFVUX0ZNVF9HQVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLmVxdSAlLTQwcywgJTVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3N0cmluZ190YWJsZSgmZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGRyLnNoX2xpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5zdF9uYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zdHJpbmdfdGFibGUoJmVsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hkci5zaF9saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogaWYgKGVsZi5iaXRzID09IDY0KSAqLwotICAgIHsKLSAgICAgICAgRWxmNjRfU2hkciBzaGRyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmLmhkcjY0LmVfc2hudW07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2VfZWxmX3NlY3Rpb24oJmVsZiwgaSwgTlVMTCwgJnNoZHIpOwotCi0gICAgICAgICAgICBpZiAoc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChvZnN0ID0gc2hkci5zaF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICBvZnN0IDwgc2hkci5zaF9vZmZzZXQgKyBzaGRyLnNoX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICBvZnN0ICs9IHNoZHIuc2hfZW50c2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZjY0X1N5bSBzeW07Ci0KLSAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3N5bWJvbCgmZWxmLCBvZnN0LCBOVUxMLCAmc3ltKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBGb3IgYWxsIE9CSkVDVFMgKGRhdGEgb2JqZWN0cyksIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIHByb3BlciBkYXRhIHNlZ21lbnQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBpZiAoRUxGNjRfU1RfVFlQRShzeW0uc3RfaW5mbykgPT0gU1RUX09CSkVDVCAmJiBzeW0uc3RfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2coImZvdW5kIGRhdGEgb2JqZWN0ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc3RyaW5nX3RhYmxlKCZlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hkci5zaF9saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5zdF9uYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChFTEY2NF9TVF9UWVBFKHN5bS5zdF9pbmZvKSA9PSBTVFRfT0JKRUNUCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBzeW0uc3Rfc2l6ZSA9PSA0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGY2NF9TaGRyIGRoZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc2VjdGlvbl9uYW1lWzEyOF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zZWN0aW9uKCZlbGYsIHN5bS5zdF9zaG5keCwgTlVMTCwgJmRoZHIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZXhwbGFuaXRpb24gLSByZWZlciB0byBfTVNDX1ZFUiB2ZXJzaW9uIG9mIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShzZWN0aW9uX25hbWUsIChjaGFyICopKGVsZi5idWYgKyBzdHJ0YWJfb2ZmNjQgKyBkaGRyLnNoX25hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZ19tc2coIlNlY3Rpb25fbmFtZTogJXMsIFNlY3Rpb25fdHlwZTogJWRcbiIsIHNlY3Rpb25fbmFtZSwgZGhkci5zaF90eXBlKTsgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiLmJzcyIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZW9mKHZhbCkgIT0gc3ltLnN0X3NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZhbHVlIGlzIGRlY2xhcmVkIGFzIGFuIGludCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhc21fKl9vZmZzZXRzLmMsIHdoaWNoIGlzIDQgYnl0ZXMgb24gYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRhcmdldHMgd2UgY3VycmVudGx5IHVzZS4gQ29tcGxhaW4gbG91ZGx5IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgaXMgbm90IHRydWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKCJTeW1ib2wgc2l6ZSBpcyB3cm9uZ1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmLmJ1ZiArIGRoZHIuc2hfb2Zmc2V0ICsgc3ltLnN0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxmLmxlX2RhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZygiQmlnIEVuZGlhbiBkYXRhIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPVVRQVVRfRk1UX1JWRFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS00MHMgRVFVICU1ZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zdHJpbmdfdGFibGUoJmVsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hkci5zaF9saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9VVFBVVF9GTVRfR0FTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi5lcXUgJS00MHMsICU1ZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zdHJpbmdfdGFibGUoJmVsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hkci5zaF9saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc3RyaW5nX3RhYmxlKCZlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZHIuc2hfbGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnN0X25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtb2RlID09IE9VVFBVVF9GTVRfUlZEUykKLSAgICAgICAgcHJpbnRmKCIgICAgRU5EXG4iKTsKLQotICAgIHJldHVybiAwOwotYmFpbDoKLSAgICBsb2dfbXNnKCJQYXJzZSBlcnJvcjogRmlsZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdmFsaWQgRUxGMzIgb3IgRUxGNjRcbiIpOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGZkOwotICAgIG91dHB1dF9mbXRfdCBtb2RlOwotICAgIGNoYXIgKmY7Ci0gICAgc3RydWN0IHN0YXQgc3RhdF9idWY7Ci0gICAgdWludDhfdCAqZmlsZV9idWY7Ci0gICAgaW50IHJlczsKLQotICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvdXRwdXQgZm9ybWF0XSA8b2JqIGZpbGU+XG5cbiIsIGFyZ3ZbMF0pOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgPG9iaiBmaWxlPlx0RUxGIGZvcm1hdCBvYmplY3QgZmlsZSB0byBwYXJzZVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IEZvcm1hdHM6XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGdhcyAgLSBjb21wYXRpYmxlIHdpdGggR05VIGFzc2VtYmxlclxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBydmRzIC0gY29tcGF0aWJsZSB3aXRoIGFybWFzbVxuIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmID0gYXJndlsyXTsKLQotICAgIGlmICghc3RyY21wKGFyZ3ZbMV0sICJydmRzIikpCi0gICAgICAgIG1vZGUgPSBPVVRQVVRfRk1UX1JWRFM7Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiZ2FzIikpCi0gICAgICAgIG1vZGUgPSBPVVRQVVRfRk1UX0dBUzsKLSAgICBlbHNlCi0gICAgICAgIGYgPSBhcmd2WzFdOwotCi0KLSAgICBmZCA9IG9wZW4oZiwgT19SRE9OTFkpOwotCi0gICAgaWYgKGZkIDwgMCkKLSAgICB7Ci0gICAgICAgIHBlcnJvcigiVW5hYmxlIHRvIG9wZW4gZmlsZSIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKGZzdGF0KGZkLCAmc3RhdF9idWYpKQotICAgIHsKLSAgICAgICAgcGVycm9yKCJzdGF0Iik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmaWxlX2J1ZiA9IG1hbGxvYyhzdGF0X2J1Zi5zdF9zaXplKTsKLQotICAgIGlmICghZmlsZV9idWYpCi0gICAgewotICAgICAgICBwZXJyb3IoIm1hbGxvYyIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKHJlYWQoZmQsIGZpbGVfYnVmLCBzdGF0X2J1Zi5zdF9zaXplKSAhPSBzdGF0X2J1Zi5zdF9zaXplKQotICAgIHsKLSAgICAgICAgcGVycm9yKCJyZWFkIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoY2xvc2UoZmQpKQotICAgIHsKLSAgICAgICAgcGVycm9yKCJjbG9zZSIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgcmVzID0gcGFyc2VfZWxmKGZpbGVfYnVmLCBzdGF0X2J1Zi5zdF9zaXplLCBtb2RlKTsKLSAgICBmcmVlKGZpbGVfYnVmKTsKLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotCi1iYWlsOgotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQotLyogIFNlZSAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIKLSAgICBmb3IgcmVmZXJlbmNlLgotKi8KLSNkZWZpbmUgZ2V0X2xlMzIoeCkgKCgqKHgpKSB8ICgqKHgrMSkpIDw8IDggfCgqKHgrMikpIDw8IDE2IHwgKCooeCszKSkgPDwgMjQgKQotI2RlZmluZSBnZXRfbGUxNih4KSAoKCooeCkpIHwgKCooeCsxKSkgPDwgOCkKLQotaW50IHBhcnNlX2NvZmYodW5zaWduZWQgX19pbnQ4ICpidWYsIHNpemVfdCBzeikKLXsKLSAgICB1bnNpZ25lZCBpbnQgbnNlY3Rpb25zLCBzeW10YWJfcHRyLCBzeW10YWJfc3osIHN0cnRhYl9wdHI7Ci0gICAgdW5zaWduZWQgaW50IHNlY3Rpb25yYXdkYXRhX3B0cjsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBfX2ludDggKnB0cjsKLSAgICB1bnNpZ25lZCBfX2ludDMyIHN5bW9mZnNldDsKLQotICAgIGNoYXIgKipzZWN0aW9ubGlzdDsgIC8vdGhpcyBhcnJheSBob2xkcyBhbGwgc2VjdGlvbiBuYW1lcyBpbiB0aGVpciBjb3JyZWN0IG9yZGVyLgotICAgIC8vaXQgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgc3ltYm9sIGlzIGluIC5ic3Mgb3IgLmRhdGEgc2VjdGlvbi4KLQotICAgIG5zZWN0aW9ucyA9IGdldF9sZTE2KGJ1ZiArIDIpOwotICAgIHN5bXRhYl9wdHIgPSBnZXRfbGUzMihidWYgKyA4KTsKLSAgICBzeW10YWJfc3ogPSBnZXRfbGUzMihidWYgKyAxMik7Ci0gICAgc3RydGFiX3B0ciA9IHN5bXRhYl9wdHIgKyBzeW10YWJfc3ogKiAxODsKLQotICAgIGlmIChuc2VjdGlvbnMgPiA5NikKLSAgICB7Ci0gICAgICAgIGxvZ19tc2coIlRvbyBtYW55IHNlY3Rpb25zXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc2VjdGlvbmxpc3QgPSBtYWxsb2MobnNlY3Rpb25zICogc2l6ZW9mKHNlY3Rpb25saXN0KSk7Ci0KLSAgICBpZiAoc2VjdGlvbmxpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGxvZ19tc2coIkFsbG9jYXRpbmcgZmlyc3QgbGV2ZWwgb2Ygc2VjdGlvbiBsaXN0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8vbG9nX21zZygiQ09GRjogRm91bmQgJXUgc3ltYm9scyBpbiAldSBzZWN0aW9ucy5cbiIsIHN5bXRhYl9zeiwgbnNlY3Rpb25zKTsKLQotICAgIC8qCi0gICAgVGhlIHNpemUgb2Ygb3B0aW9uYWwgaGVhZGVyIGlzIGFsd2F5cyB6ZXJvIGZvciBhbiBvYmogZmlsZS4gU28sIHRoZSBzZWN0aW9uIGhlYWRlcgotICAgIGZvbGxvd3MgdGhlIGZpbGUgaGVhZGVyIGltbWVkaWF0ZWx5LgotICAgICovCi0KLSAgICBwdHIgPSBidWYgKyAyMDsgICAgIC8vc2VjdGlvbiBoZWFkZXIKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICAgIGNoYXIgc2VjdGlvbm5hbWVbOV0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0gICAgICAgIHN0cm5jcHkoc2VjdGlvbm5hbWUsIHB0ciwgOCk7Ci0gICAgICAgIC8vbG9nX21zZygiQ09GRjogUGFyc2luZyBzZWN0aW9uICVzXG4iLHNlY3Rpb25uYW1lKTsKLQotICAgICAgICBzZWN0aW9ubGlzdFtpXSA9IG1hbGxvYyhzdHJsZW4oc2VjdGlvbm5hbWUpICsgMSk7Ci0KLSAgICAgICAgaWYgKHNlY3Rpb25saXN0W2ldID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ19tc2coIkFsbG9jYXRpbmcgc3RvcmFnZSBmb3IgJXMgZmFpbGVkXG4iLCBzZWN0aW9ubmFtZSk7Ci0gICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyY3B5KHNlY3Rpb25saXN0W2ldLCBzZWN0aW9ubmFtZSk7Ci0KLSAgICAgICAgaWYgKCFzdHJjbXAoc2VjdGlvbm5hbWUsICIuZGF0YSIpKSBzZWN0aW9ucmF3ZGF0YV9wdHIgPSBnZXRfbGUzMihwdHIgKyAyMCk7Ci0KLSAgICAgICAgcHRyICs9IDQwOwotICAgIH0KLQotICAgIC8vbG9nX21zZygiQ09GRjogU3ltYm9sIHRhYmxlIGF0IG9mZnNldCAldVxuIiwgc3ltdGFiX3B0cik7Ci0gICAgLy9sb2dfbXNnKCJDT0ZGOiByYXcgZGF0YSBwb2ludGVyIG9mc2V0IGZvciBzZWN0aW9uIC5kYXRhIGlzICV1XG4iLCBzZWN0aW9ucmF3ZGF0YV9wdHIpOwotCi0gICAgLyogIFRoZSBjb21waWxlciBwdXRzIHRoZSBkYXRhIHdpdGggbm9uLXplcm8gb2Zmc2V0IGluIC5kYXRhIHNlY3Rpb24sIGJ1dCBwdXRzIHRoZSBkYXRhIHdpdGgKLSAgICAgICAgemVybyBvZmZzZXQgaW4gLmJzcyBzZWN0aW9uLiBTbywgaWYgdGhlIGRhdGEgaW4gaW4gLmJzcyBzZWN0aW9uLCBzZXQgb2Zmc2V0PTAuCi0gICAgICAgIE5vdGUgZnJvbSBXaWtpOiBJbiBhbiBvYmplY3QgbW9kdWxlIGNvbXBpbGVkIGZyb20gQywgdGhlIGJzcyBzZWN0aW9uIGNvbnRhaW5zCi0gICAgICAgIHRoZSBsb2NhbCB2YXJpYWJsZXMgKGJ1dCBub3QgZnVuY3Rpb25zKSB0aGF0IHdlcmUgZGVjbGFyZWQgd2l0aCB0aGUgc3RhdGljIGtleXdvcmQsCi0gICAgICAgIGV4Y2VwdCBmb3IgdGhvc2Ugd2l0aCBub24temVybyBpbml0aWFsIHZhbHVlcy4gKEluIEMsIHN0YXRpYyB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkCi0gICAgICAgIHRvIHplcm8gYnkgZGVmYXVsdC4pIEl0IGFsc28gY29udGFpbnMgdGhlIG5vbi1sb2NhbCAoYm90aCBleHRlcm4gYW5kIHN0YXRpYykgdmFyaWFibGVzCi0gICAgICAgIHRoYXQgYXJlIGFsc28gaW5pdGlhbGl6ZWQgdG8gemVybyAoZWl0aGVyIGV4cGxpY2l0bHkgb3IgYnkgZGVmYXVsdCkuCi0gICAgICAgICovCi0gICAgLy9tb3ZlIHRvIHN5bWJvbCB0YWJsZQotICAgIC8qIENPRkYgc3ltYm9sIHRhYmxlOgotICAgICAgICBvZmZzZXQgICAgICBmaWVsZAotICAgICAgICAwICAgICAgICAgICBOYW1lKCopCi0gICAgICAgIDggICAgICAgICAgIFZhbHVlCi0gICAgICAgIDEyICAgICAgICAgIFNlY3Rpb25OdW1iZXIKLSAgICAgICAgMTQgICAgICAgICAgVHlwZQotICAgICAgICAxNiAgICAgICAgICBTdG9yYWdlQ2xhc3MKLSAgICAgICAgMTcgICAgICAgICAgTnVtYmVyT2ZBdXhTeW1ib2xzCi0gICAgICAgICovCi0gICAgcHRyID0gYnVmICsgc3ltdGFiX3B0cjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIF9faW50MTYgc2VjdGlvbiA9IGdldF9sZTE2KHB0ciArIDEyKTsgLy9zZWN0aW9uIG51bWJlcgotCi0gICAgICAgIGlmIChzZWN0aW9uID4gMCAmJiBwdHJbMTZdID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYoc2VjdGlvbiA+IDAgJiYgcHRyWzE2XSA9PSAzICYmIGdldF9sZTMyKHB0cis4KSkgewotCi0gICAgICAgICAgICBpZiAoZ2V0X2xlMzIocHRyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIG5hbWVbOV0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0gICAgICAgICAgICAgICAgc3RybmNweShuYW1lLCBwdHIsIDgpOwotICAgICAgICAgICAgICAgIC8vbG9nX21zZygiQ09GRjogUGFyc2luZyBzeW1ib2wgJXNcbiIsbmFtZSk7Ci0gICAgICAgICAgICAgICAgLyogVGhlIDY0Yml0IFdpbmRvd3MgY29tcGlsZXIgZG9lc24ndCBwcmVmaXggd2l0aCBhbiBfLgotICAgICAgICAgICAgICAgICAqIENoZWNrIHdoYXQncyB0aGVyZSwgYW5kIGJ1bXAgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT0gJ18nKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAiLCBuYW1lICsgMSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAiLCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2xvZ19tc2coIkNPRkY6IFBhcnNpbmcgc3ltYm9sICVzXG4iLAotICAgICAgICAgICAgICAgIC8vICAgICAgICBidWYgKyBzdHJ0YWJfcHRyICsgZ2V0X2xlMzIocHRyKzQpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGJ1ZiArIHN0cnRhYl9wdHIgKyBnZXRfbGUzMihwdHIgKyA0KSlbMF0gPT0gJ18nKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgc3RydGFiX3B0ciArIGdldF9sZTMyKHB0ciArIDQpICsgMSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAiLCBidWYgKyBzdHJ0YWJfcHRyICsgZ2V0X2xlMzIocHRyICsgNCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIShzdHJjbXAoc2VjdGlvbmxpc3Rbc2VjdGlvbi0xXSwgIi5ic3MiKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3ltb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW1vZmZzZXQgPSBnZXRfbGUzMihidWYgKyBzZWN0aW9ucmF3ZGF0YV9wdHIgKyBnZXRfbGUzMihwdHIgKyA4KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9nX21zZygiICAgICAgU2VjdGlvbjogJWRcbiIsc2VjdGlvbik7Ci0gICAgICAgICAgICAvL2xvZ19tc2coIiAgICAgIENsYXNzOiAgICVkXG4iLHB0clsxNl0pOwotICAgICAgICAgICAgLy9sb2dfbXNnKCIgICAgICBBZGRyZXNzOiAldVxuIixnZXRfbGUzMihwdHIrOCkpOwotICAgICAgICAgICAgLy9sb2dfbXNnKCIgICAgICBPZmZzZXQ6ICV1XG4iLCBzeW1vZmZzZXQpOwotCi0gICAgICAgICAgICBwcmludGYoIiU1ZFxuIiwgc3ltb2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB0ciArPSAxODsKLSAgICB9Ci0KLSAgICBwcmludGYoIiAgICBFTkRcbiIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgICAgZnJlZShzZWN0aW9ubGlzdFtpXSk7Ci0gICAgfQotCi0gICAgZnJlZShzZWN0aW9ubGlzdCk7Ci0KLSAgICByZXR1cm4gMDsKLWJhaWw6Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgICBmcmVlKHNlY3Rpb25saXN0W2ldKTsKLSAgICB9Ci0KLSAgICBmcmVlKHNlY3Rpb25saXN0KTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGZkOwotICAgIG91dHB1dF9mbXRfdCBtb2RlOwotICAgIGNvbnN0IGNoYXIgKmY7Ci0gICAgc3RydWN0IF9zdGF0IHN0YXRfYnVmOwotICAgIHVuc2lnbmVkIF9faW50OCAqZmlsZV9idWY7Ci0gICAgaW50IHJlczsKLQotICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvdXRwdXQgZm9ybWF0XSA8b2JqIGZpbGU+XG5cbiIsIGFyZ3ZbMF0pOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgPG9iaiBmaWxlPlx0RUxGIGZvcm1hdCBvYmplY3QgZmlsZSB0byBwYXJzZVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IEZvcm1hdHM6XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGdhcyAgLSBjb21wYXRpYmxlIHdpdGggR05VIGFzc2VtYmxlclxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBydmRzIC0gY29tcGF0aWJsZSB3aXRoIGFybWFzbVxuIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmID0gYXJndlsyXTsKLQotICAgIGlmICghc3RyY21wKGFyZ3ZbMV0sICJydmRzIikpCi0gICAgICAgIG1vZGUgPSBPVVRQVVRfRk1UX1JWRFM7Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiZ2FzIikpCi0gICAgICAgIG1vZGUgPSBPVVRQVVRfRk1UX0dBUzsKLSAgICBlbHNlCi0gICAgICAgIGYgPSBhcmd2WzFdOwotCi0gICAgZmQgPSBfc29wZW4oZiwgX09fQklOQVJZLCBfU0hfREVOWU5PLCBfU19JUkVBRCB8IF9TX0lXUklURSk7Ci0KLSAgICBpZiAoX2ZzdGF0KGZkLCAmc3RhdF9idWYpKQotICAgIHsKLSAgICAgICAgcGVycm9yKCJzdGF0Iik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmaWxlX2J1ZiA9IG1hbGxvYyhzdGF0X2J1Zi5zdF9zaXplKTsKLQotICAgIGlmICghZmlsZV9idWYpCi0gICAgewotICAgICAgICBwZXJyb3IoIm1hbGxvYyIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKF9yZWFkKGZkLCBmaWxlX2J1Ziwgc3RhdF9idWYuc3Rfc2l6ZSkgIT0gc3RhdF9idWYuc3Rfc2l6ZSkKLSAgICB7Ci0gICAgICAgIHBlcnJvcigicmVhZCIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKF9jbG9zZShmZCkpCi0gICAgewotICAgICAgICBwZXJyb3IoImNsb3NlIik7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICByZXMgPSBwYXJzZV9jb2ZmKGZpbGVfYnVmLCBzdGF0X2J1Zi5zdF9zaXplKTsKLQotICAgIGZyZWUoZmlsZV9idWYpOwotCi0gICAgaWYgKCFyZXMpCi0gICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Ci0KLWJhaWw6Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjM5MzZkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0jIS9iaW4vYmFzaAotIyMKLSMjICBjb25maWd1cmUKLSMjCi0jIyAgVGhpcyBzY3JpcHQgaXMgdGhlIGZyb250LWVuZCB0byB0aGUgYnVpbGQgc3lzdGVtLiBJdCBwcm92aWRlcyBhIHNpbWlsYXIKLSMjICBpbnRlcmZhY2UgdG8gc3RhbmRhcmQgY29uZmlndXJlIHNjcmlwdHMgd2l0aCBzb21lIGV4dHJhIGJpdHMgZm9yIGRlYWxpbmcKLSMjICB3aXRoIHRvb2xjaGFpbnMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgc3RhbmRhcmQgUE9TSVggaW50ZXJmYWNlIGFuZAotIyMgIGZvciBleHRyYWN0aW5nIHN1YnNldHMgb2YgdGhlIHNvdXJjZSB0cmVlLiBJbiB0aGVvcnksIHJldXNhYmxlIHBhcnRzCi0jIyAgb2YgdGhpcyBzY3JpcHQgd2VyZSBpbnRlbmRlZCB0byBsaXZlIGluIGJ1aWxkL21ha2UvY29uZmlndXJlLnNoLAotIyMgIGJ1dCBpbiBwcmFjdGljZSwgdGhlIGxpbmUgaXMgcHJldHR5IGJsdXJyeS4KLSMjCi0jIyAgVGhpcyBidWlsZCBzeXN0ZW0gaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgRkZtcGVnIGNvbmZpZ3VyZSBzY3JpcHQuCi0jIwotCi0jc291cmNlX3BhdGg9ImBkaXJuYW1lIFwiJDBcImAiCi1zb3VyY2VfcGF0aD0kezAlLyp9Ci0uICIke3NvdXJjZV9wYXRofS9idWlsZC9tYWtlL2NvbmZpZ3VyZS5zaCIKLQotc2hvd19oZWxwKCl7Ci0gICAgc2hvd19oZWxwX3ByZQotICAgIGNhdCA8PCBFT0YKLUFkdmFuY2VkIG9wdGlvbnM6Ci0gICR7dG9nZ2xlX2xpYnN9ICAgICAgICAgICAgICAgICAgZG9uJ3QgYnVpbGQgbGlicmFyaWVzCi0gICR7dG9nZ2xlX2V4YW1wbGVzfSAgICAgICAgICAgICAgZG9uJ3QgYnVpbGQgZXhhbXBsZXMKLSAgLS1saWJjPVBBVEggICAgICAgICAgICAgICAgICAgICBwYXRoIHRvIGFsdGVybmF0ZSBsaWJjCi0gIC0tYXM9e3lhc218bmFzbXxhdXRvfSAgICAgICAgICAgdXNlIHNwZWNpZmllZCBhc3NlbWJsZXIgW2F1dG8sIHlhc20gcHJlZmVycmVkXQotICAke3RvZ2dsZV9mYXN0X3VuYWxpZ25lZH0gICAgICAgIGRvbid0IHVzZSB1bmFsaWduZWQgYWNjZXNzZXMsIGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSBoYXJkd2FyZSBbYXV0b10KLSAgJHt0b2dnbGVfY29kZWNfc3Jjc30gICAgICAgICAgICBpbi9leGNsdWRlIGNvZGVjIGxpYnJhcnkgc291cmNlIGNvZGUKLSAgJHt0b2dnbGVfZGVidWdfbGlic30gICAgICAgICAgICBpbi9leGNsdWRlIGRlYnVnIHZlcnNpb24gb2YgbGlicmFyaWVzCi0gICR7dG9nZ2xlX21kNX0gICAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3Igb3V0cHV0IG9mIGNoZWNrc3VtIGRhdGEKLSAgJHt0b2dnbGVfc3RhdGljX21zdmNydH0gICAgICAgICB1c2Ugc3RhdGljIE1TVkNSVCAoVlMgYnVpbGRzIG9ubHkpCi0gICR7dG9nZ2xlX3ZwOH0gICAgICAgICAgICAgICAgICAgVlA4IGNvZGVjIHN1cHBvcnQKLSAgJHt0b2dnbGVfcHNucn0gICAgICAgICAgICAgICAgICBvdXRwdXQgb2YgUFNOUiBkYXRhLCBpZiBzdXBwb3J0ZWQgKGVuY29kZXJzKQotICAke3RvZ2dsZV9tZW1fdHJhY2tlcn0gICAgICAgICAgIHRyYWNrIG1lbW9yeSB1c2FnZQotICAke3RvZ2dsZV9wb3N0cHJvY30gICAgICAgICAgICAgIHBvc3Rwcm9jZXNzaW5nCi0gICR7dG9nZ2xlX211bHRpdGhyZWFkfSAgICAgICAgICAgbXVsdGl0aHJlYWRlZCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuCi0gICR7dG9nZ2xlX3NwYXRpYWxfcmVzYW1wbGluZ30gICAgc3BhdGlhbCBzYW1wbGluZyAoc2NhbGluZykgc3VwcG9ydAotICAke3RvZ2dsZV9yZWFsdGltZV9vbmx5fSAgICAgICAgIGVuYWJsZSB0aGlzIG9wdGlvbiB3aGlsZSBidWlsZGluZyBmb3IgcmVhbC10aW1lIGVuY29kaW5nCi0gICR7dG9nZ2xlX3J1bnRpbWVfY3B1X2RldGVjdH0gICAgcnVudGltZSBjcHUgZGV0ZWN0aW9uCi0gICR7dG9nZ2xlX3NoYXJlZH0gICAgICAgICAgICAgICAgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydAotICAke3RvZ2dsZV9zbWFsbH0gICAgICAgICAgICAgICAgIGZhdm9yIHNtYWxsZXIgc2l6ZSBvdmVyIHNwZWVkCi0gICR7dG9nZ2xlX3Bvc3Rwcm9jX3Zpc3VhbGl6ZXJ9ICAgbWFjcm8gYmxvY2sgLyBibG9jayBsZXZlbCB2aXN1YWxpemVycwotCi1Db2RlY3M6Ci0gIENvZGVjcyBjYW4gYmUgc2VsZWN0aXZlbHkgZW5hYmxlZCBvciBkaXNhYmxlZCBpbmRpdmlkdWFsbHksIG9yIGJ5IGZhbWlseToKLSAgICAgIC0tZGlzYWJsZS08Y29kZWM+Ci0gIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICAtLWRpc2FibGUtPGNvZGVjPi1lbmNvZGVyCi0gICAgICAtLWRpc2FibGUtPGNvZGVjPi1kZWNvZGVyCi0KLSAgQ29kZWNzIGF2YWlsYWJsZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbjoKLUVPRgotI3Jlc3RvcmUgZWRpdG9yIHN0YXRlICcKLQotICAgIGxvY2FsIGZhbWlseTsKLSAgICBsb2NhbCBsYXN0X2ZhbWlseTsKLSAgICBsb2NhbCBjOwotICAgIGxvY2FsIHN0cjsKLSAgICBmb3IgYyBpbiAke0NPREVDU307IGRvCi0gICAgICAgIGZhbWlseT0ke2MlXyp9Ci0gICAgICAgIGlmIFsgIiR7ZmFtaWx5fSIgIT0gIiR7bGFzdF9mYW1pbHl9IiBdOyB0aGVuCi0gICAgICAgICAgICBbIC16ICIke3N0cn0iIF0gfHwgZWNobyAiJHtzdHJ9IgotICAgICAgICAgICAgc3RyPSIkKHByaW50ZiAnICAgICUxMHM6JyAke2ZhbWlseX0pIgotICAgICAgICBmaQotICAgICAgICBzdHI9IiR7c3RyfSAkKHByaW50ZiAnJTEwcycgJHtjIypffSkiCi0gICAgICAgIGxhc3RfZmFtaWx5PSR7ZmFtaWx5fQotICAgIGRvbmUKLSAgICBlY2hvICIke3N0cn0iCi0gICAgc2hvd19oZWxwX3Bvc3QKLX0KLQotIyMKLSMjIEJFR0lOIEFQUExJQ0FUSU9OIFNQRUNJRklDIENPTkZJR1VSQVRJT04KLSMjCi0KLSMgYWxsX3BsYXRmb3JtcyBpcyBhIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCB0YXJnZXQgcGxhdGZvcm1zLiBNYWludGFpbgotIyBhbHBoYWJldGljYWxseSBieSBhcmNoaXRlY3R1cmUsIGdlbmVyaWMtZ251IGxhc3QuCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY1dGUtbGludXgtcnZjdCIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjV0ZS1saW51eC1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY1dGUtbm9uZS1ydmN0IgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12NXRlLXN5bWJpYW4tZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ni1kYXJ3aW4tZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ni1saW51eC1ydmN0IgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ni1saW51eC1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY2LW5vbmUtcnZjdCIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjYtc3ltYmlhbi1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGl3bW14dC1saW51eC1ydmN0IgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBpd21teHQtbGludXgtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBpd21teHQyLWxpbnV4LXJ2Y3QiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGl3bW14dDItbGludXgtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ny1kYXJ3aW4tZ2NjIiAgICAjbmVvbiBDb3J0ZXgtQTgKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjctbGludXgtcnZjdCIgICAgI25lb24gQ29ydGV4LUE4Ci1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY3LWxpbnV4LWdjYyIgICAgICNuZW9uIENvcnRleC1BOAotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ny1ub25lLXJ2Y3QiICAgICAjbmVvbiBDb3J0ZXgtQTgKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gbWlwczMyLWxpbnV4LWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gcHBjMzItZGFyd2luOC1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHBwYzMyLWRhcndpbjktZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBwcGMzMi1saW51eC1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHBwYzY0LWRhcndpbjgtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBwcGM2NC1kYXJ3aW45LWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gcHBjNjQtbGludXgtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBzcGFyYy1zb2xhcmlzLWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWRhcndpbjgtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODYtZGFyd2luOC1pY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni1kYXJ3aW45LWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWRhcndpbjktaWNjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODYtbGludXgtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODYtbGludXgtaWNjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODYtc29sYXJpcy1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni13aW4zMi1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni13aW4zMi12czciCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni13aW4zMi12czgiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni13aW4zMi12czkiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Nl82NC1kYXJ3aW45LWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2XzY0LWRhcndpbjEwLWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2XzY0LWxpbnV4LWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2XzY0LWxpbnV4LWljYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2XzY0LXNvbGFyaXMtZ2NjIgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtd2luNjQtdnM4IgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtd2luNjQtdnM5IgotYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB1bml2ZXJzYWwtZGFyd2luOC1nY2MiCi1hbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHVuaXZlcnNhbC1kYXJ3aW45LWdjYyIKLWFsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gZ2VuZXJpYy1nbnUiCi0KLSMgYWxsX3RhcmdldHMgaXMgYSBsaXN0IG9mIGFsbCB0YXJnZXRzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQKLSMgbm90ZSB0aGF0IHRoZXNlIHNob3VsZCBiZSBpbiBkZXBlbmRlbmN5IG9yZGVyIGZvciBub3cuCi1hbGxfdGFyZ2V0cz0ibGlicyBleGFtcGxlcyBkb2NzIgotCi0jIGFsbCB0YXJnZXRzIGF2YWlsYWJsZSBhcmUgZW5hYmxlZCwgYnkgZGVmYXVsdC4KLWZvciB0IGluICR7YWxsX3RhcmdldHN9OyBkbwotICAgIFsgLWYgJHtzb3VyY2VfcGF0aH0vJHt0fS5tayBdICYmIGVuYWJsZSAke3R9Ci1kb25lCi0KLSMgY2hlY2sgaW5zdGFsbGVkIGRveHlnZW4gdmVyc2lvbgotZG94eV92ZXJzaW9uPSQoZG94eWdlbiAtLXZlcnNpb24gMj4vZGV2L251bGwpCi1kb3h5X21ham9yPSR7ZG94eV92ZXJzaW9uJSUuKn0KLWlmIFsgJHtkb3h5X21ham9yOi0wfSAtZ2UgMSBdOyB0aGVuCi0gICAgZG94eV92ZXJzaW9uPSR7ZG94eV92ZXJzaW9uIyoufQotICAgIGRveHlfbWlub3I9JHtkb3h5X3ZlcnNpb24lJS4qfQotICAgIGRveHlfcGF0Y2g9JHtkb3h5X3ZlcnNpb24jIyoufQotCi0gICAgWyAkZG94eV9tYWpvciAtZ3QgMSBdICYmIGVuYWJsZSBkb3h5Z2VuCi0gICAgWyAkZG94eV9taW5vciAtZ3QgNSBdICYmIGVuYWJsZSBkb3h5Z2VuCi0gICAgWyAkZG94eV9taW5vciAtZXEgNSBdICYmIFsgJGRveHlfcGF0Y2ggLWdlIDMgXSAmJiBlbmFibGUgZG94eWdlbgotZmkKLQotIyBpbnN0YWxsIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBzb3VyY2VzLCBieSBkZWZhdWx0LiBzb3VyY2VzIHdpbGwgaGF2ZQotIyB0byBiZSBlbmFibGVkIHdoZW4gZG9pbmcgZGlzdCBidWlsZHMsIHNpbmNlIHRoYXQncyBubyBsb25nZXIgYSBjb21tb24KLSMgY2FzZS4KLWVuYWJsZWQgZG94eWdlbiAmJiBwaHAgLXYgPi9kZXYvbnVsbCAyPiYxICYmIGVuYWJsZSBpbnN0YWxsX2RvY3MKLWVuYWJsZSBpbnN0YWxsX2JpbnMKLWVuYWJsZSBpbnN0YWxsX2xpYnMKLQotZW5hYmxlIG9wdGltaXphdGlvbnMKLWVuYWJsZSBmYXN0X3VuYWxpZ25lZCAjYWxsb3cgdW5hbGlnbmVkIGFjY2Vzc2VzLCBpZiBzdXBwb3J0ZWQgYnkgaHcKLWVuYWJsZSBtZDUKLWVuYWJsZSBzcGF0aWFsX3Jlc2FtcGxpbmcKLWVuYWJsZSBtdWx0aXRocmVhZAotZW5hYmxlIG9zX3N1cHBvcnQKLQotWyAtZCAke3NvdXJjZV9wYXRofS8uLi9pbmNsdWRlIF0gJiYgZW5hYmxlIGFsdF90cmVlX2xheW91dAotZm9yIGQgaW4gdnA4OyBkbwotICAgIFsgLWQgJHtzb3VyY2VfcGF0aH0vJHtkfSBdICYmIGRpc2FibGUgYWx0X3RyZWVfbGF5b3V0OwotZG9uZQotCi1pZiAhIGVuYWJsZWQgYWx0X3RyZWVfbGF5b3V0OyB0aGVuCi0jIGRldmVsb3BtZW50IGVudmlyb25tZW50Ci1bIC1kICR7c291cmNlX3BhdGh9L3ZwOCBdICYmIENPREVDUz0iJHtDT0RFQ1N9IHZwOF9lbmNvZGVyIHZwOF9kZWNvZGVyIgotZWxzZQotIyBjdXN0b21lciBlbnZpcm9ubWVudAotWyAtZiAke3NvdXJjZV9wYXRofS8uLi9pbmNsdWRlL3ZweC92cDhjeC5oIF0gJiYgQ09ERUNTPSIke0NPREVDU30gdnA4X2VuY29kZXIiCi1bIC1mICR7c291cmNlX3BhdGh9Ly4uL2luY2x1ZGUvdnB4L3ZwOGR4LmggXSAmJiBDT0RFQ1M9IiR7Q09ERUNTfSB2cDhfZGVjb2RlciIKLQotWyAtZiAke3NvdXJjZV9wYXRofS8uLi9saWIvKi8qbXQubGliIF0gJiYgc29mdF9lbmFibGUgc3RhdGljX21zdmNydAotZmkKLQotQ09ERUNTPSIkKGVjaG8gJHtDT0RFQ1N9IHwgdHIgJyAnICdcbicpIgotQ09ERUNfRkFNSUxJRVM9IiQoZm9yIGMgaW4gJHtDT0RFQ1N9OyBkbyBlY2hvICR7YyVfKn07IGRvbmUgfCBzb3J0IHwgdW5pcSkiCi0KLUFSQ0hfTElTVD0iCi0gICAgYXJtCi0gICAgbWlwcwotICAgIHg4NgotICAgIHg4Nl82NAotICAgIHBwYzMyCi0gICAgcHBjNjQKLSIKLUFSQ0hfRVhUX0xJU1Q9IgotICAgIGFybXY1dGUKLSAgICBhcm12NgotICAgIGFybXY3Ci0gICAgaXdtbXh0Ci0gICAgaXdtbXh0MgotCi0gICAgbWlwczMyCi0KLSAgICBtbXgKLSAgICBzc2UKLSAgICBzc2UyCi0gICAgc3NlMwotICAgIHNzc2UzCi0gICAgc3NlNF8xCi0KLSAgICBhbHRpdmVjCi0iCi1IQVZFX0xJU1Q9IgotICAgICR7QVJDSF9FWFRfTElTVH0KLSAgICB2cHhfcG9ydHMKLSAgICBzdGRpbnRfaAotICAgIGFsdF90cmVlX2xheW91dAotICAgIHB0aHJlYWRfaAotICAgIHN5c19tbWFuX2gKLSIKLUNPTkZJR19MSVNUPSIKLSAgICBleHRlcm5hbF9idWlsZAotICAgIGluc3RhbGxfZG9jcwotICAgIGluc3RhbGxfYmlucwotICAgIGluc3RhbGxfbGlicwotICAgIGluc3RhbGxfc3JjcwotICAgIGRlYnVnCi0gICAgZ3Byb2YKLSAgICBnY292Ci0gICAgcnZjdAotICAgIGdjYwotICAgIG1zdnMKLSAgICBwaWMKLSAgICBiaWdfZW5kaWFuCi0KLSAgICBjb2RlY19zcmNzCi0gICAgZGVidWdfbGlicwotICAgIGZhc3RfdW5hbGlnbmVkCi0gICAgbWVtX21hbmFnZXIKLSAgICBtZW1fdHJhY2tlcgotICAgIG1lbV9jaGVja3MKLSAgICBtZDUKLQotICAgIGRlcXVhbnRfdG9rZW5zCi0gICAgZGNfcmVjb24KLSAgICBydW50aW1lX2NwdV9kZXRlY3QKLSAgICBwb3N0cHJvYwotICAgIG11bHRpdGhyZWFkCi0gICAgcHNucgotICAgICR7Q09ERUNTfQotICAgICR7Q09ERUNfRkFNSUxJRVN9Ci0gICAgZW5jb2RlcnMKLSAgICBkZWNvZGVycwotICAgIHN0YXRpY19tc3ZjcnQKLSAgICBzcGF0aWFsX3Jlc2FtcGxpbmcKLSAgICByZWFsdGltZV9vbmx5Ci0gICAgc2hhcmVkCi0gICAgc21hbGwKLSAgICBwb3N0cHJvY192aXN1YWxpemVyCi0gICAgb3Nfc3VwcG9ydAotIgotQ01ETElORV9TRUxFQ1Q9IgotICAgIGV4dHJhX3dhcm5pbmdzCi0gICAgd2Vycm9yCi0gICAgaW5zdGFsbF9kb2NzCi0gICAgaW5zdGFsbF9iaW5zCi0gICAgaW5zdGFsbF9saWJzCi0gICAgaW5zdGFsbF9zcmNzCi0gICAgZGVidWcKLSAgICBncHJvZgotICAgIGdjb3YKLSAgICBwaWMKLSAgICBvcHRpbWl6YXRpb25zCi0gICAgY2NhY2hlCi0gICAgcnVudGltZV9jcHVfZGV0ZWN0Ci0KLSAgICBsaWJzCi0gICAgZXhhbXBsZXMKLSAgICBsaWJjCi0gICAgYXMKLSAgICBmYXN0X3VuYWxpZ25lZAotICAgIGNvZGVjX3NyY3MKLSAgICBkZWJ1Z19saWJzCi0gICAgbWQ1Ci0KLSAgICBkZXF1YW50X3Rva2VucwotICAgIGRjX3JlY29uCi0gICAgcG9zdHByb2MKLSAgICBtdWx0aXRocmVhZAotICAgIHBzbnIKLSAgICAke0NPREVDU30KLSAgICAke0NPREVDX0ZBTUlMSUVTfQotICAgIHN0YXRpY19tc3ZjcnQKLSAgICBtZW1fdHJhY2tlcgotICAgIHNwYXRpYWxfcmVzYW1wbGluZwotICAgIHJlYWx0aW1lX29ubHkKLSAgICBzaGFyZWQKLSAgICBzbWFsbAotICAgIHBvc3Rwcm9jX3Zpc3VhbGl6ZXIKLSIKLQotcHJvY2Vzc19jbWRsaW5lKCkgewotICAgIGZvciBvcHQgZG8KLSAgICAgICAgb3B0dmFsPSIke29wdCMqPX0iCi0gICAgICAgIGNhc2UgIiRvcHQiIGluCi0gICAgICAgIC0tZGlzYWJsZS1jb2RlY3MpIGZvciBjIGluICR7Q09ERUNTfTsgZG8gZGlzYWJsZSAkYzsgZG9uZSA7OwotICAgICAgICAqKSBwcm9jZXNzX2NvbW1vbl9jbWRsaW5lICIkb3B0IgotICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgZG9uZQotfQotCi1wb3N0X3Byb2Nlc3NfY21kbGluZSgpIHsKLSAgICBsb2NhbCBjCi0KLSAgICAjIElmIHRoZSBjb2RlYyBmYW1pbHkgaXMgZGlzYWJsZWQsIGRpc2FibGUgYWxsIGNvbXBvbmVudHMgb2YgdGhhdCBmYW1pbHkuCi0gICAgIyBJZiB0aGUgY29kZWMgZmFtaWx5IGlzIGVuYWJsZWQsIGVuYWJsZSBhbGwgY29tcG9uZW50cyBvZiB0aGF0IGZhbWlseS4KLSAgICBsb2dfZWNobyAiQ29uZmlndXJpbmcgc2VsZWN0ZWQgY29kZWNzIgotICAgIGZvciBjIGluICR7Q09ERUNTfTsgZG8KLSAgICAgICAgZGlzYWJsZWQgJHtjJSVfKn0gJiYgZGlzYWJsZSAke2N9Ci0gICAgICAgIGVuYWJsZWQgJHtjJSVfKn0gJiYgZW5hYmxlICR7Y30KLSAgICBkb25lCi0KLSAgICAjIEVuYWJsZSBhbGwgZGV0ZWN0ZWQgY29kZWNzLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBkaXNhYmxlZAotICAgIGZvciBjIGluICR7Q09ERUNTfTsgZG8gc29mdF9lbmFibGUgJGM7IGRvbmUKLQotICAgICMgRW5hYmxlIHRoZSBjb2RlYyBmYW1pbHkgaWYgYW55IGNvbXBvbmVudCBvZiB0aGF0IGZhbWlseSBpcyBlbmFibGVkCi0gICAgZm9yIGMgaW4gJHtDT0RFQ1N9OyBkbwotICAgICAgICBlbmFibGVkICRjICYmIGVuYWJsZSAke2MlXyp9Ci0gICAgZG9uZQotCi0gICAgIyBTZXQgdGhlIHtlbixkZX1jb2RlcnMgdmFyaWFibGUgaWYgYW55IGFsZ29yaXRobSBpbiB0aGF0IGNsYXNzIGlzIGVuYWJsZWQKLSAgICBmb3IgYyBpbiAke0NPREVDU307IGRvCi0gICAgICAgIGVuYWJsZWQgJHtjfSAmJiBlbmFibGUgJHtjIyMqX31zCi0gICAgZG9uZQotfQotCi0KLXByb2Nlc3NfdGFyZ2V0cygpIHsKLSAgICBlbmFibGVkIGNoaWxkIHx8IHdyaXRlX2NvbW1vbl9jb25maWdfYmFubmVyCi0gICAgZW5hYmxlZCB1bml2ZXJzYWwgfHwgd3JpdGVfY29tbW9uX3RhcmdldF9jb25maWdfaCAgJHtCVUlMRF9QRlh9dnB4X2NvbmZpZy5oCi0KLSAgICAjIFRPRE86IGFkZCBob3N0IHRvb2xzIHRhcmdldCAob2JqX2ludF9leHRyYWN0LCBldGMpCi0KLSAgICAjIEZvciBmYXQgYmluYXJpZXMsIGNhbGwgY29uZmlndXJlIHJlY3Vyc2l2ZWx5IHRvIGNvbmZpZ3VyZSBmb3IgZWFjaAotICAgICMgYmluYXJ5IGFyY2hpdGVjdHVyZSB0byBiZSBpbmNsdWRlZC4KLSAgICBpZiBlbmFibGVkIHVuaXZlcnNhbDsgdGhlbgotICAgICAgICAjIENhbGwgY29uZmlndXJlIChvdXJzZWx2ZXMpIGZvciBlYWNoIHN1YmFyY2hpdGVjdHVyZQotICAgICAgICBmb3IgYXJjaCBpbiAkZmF0X2Jpbl9hcmNoczsgZG8KLSAgICAgICAgICAgIEJVSUxEX1BGWD0ke2FyY2h9LyB0b29sY2hhaW49JHthcmNofSAkc2VsZiAtLWNoaWxkICRjbWRsaW5lX2FyZ3MgfHwgZXhpdCAkPwotICAgICAgICBkb25lCi0gICAgZmkKLQotICAgICMgVGhlIHdyaXRlX2NvbW1vbl9jb25maWcgKGNvbmZpZy5taykgbG9naWMgaXMgZGVmZXJyZWQgdW50aWwgYWZ0ZXIgdGhlCi0gICAgIyByZWN1cnNpdmUgY2FsbHMgdG8gY29uZmlndXJlIGNvbXBsZXRlLCBiZWN1YXNlIHdlIHdhbnQgb3VyIHVuaXZlcnNhbAotICAgICMgdGFyZ2V0cyB0byBiZSBleGVjdXRlZCBsYXN0LgotICAgIHdyaXRlX2NvbW1vbl9jb25maWdfdGFyZ2V0cwotICAgIGVuYWJsZWQgdW5pdmVyc2FsICYmIGVjaG8gIkZBVF9BUkNIUz0ke2ZhdF9iaW5fYXJjaHN9IiA+PiBjb25maWcubWsKLQotICAgICMgQ2FsY3VsYXRlIHRoZSBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBuYW1lLCBiYXNlZCBvbiB0aGUgZW5hYmxlZCBmZWF0dXJlcwotICAgIGxvY2FsIGNmCi0gICAgbG9jYWwgRElTVF9ESVI9dnB4Ci0gICAgZm9yIGNmIGluICRDT0RFQ19GQU1JTElFUzsgZG8KLSAgICAgICAgaWYgZW5hYmxlZCAke2NmfV9lbmNvZGVyICYmIGVuYWJsZWQgJHtjZn1fZGVjb2RlcjsgdGhlbgotICAgICAgICAgICAgRElTVF9ESVI9IiR7RElTVF9ESVJ9LSR7Y2Z9IgotICAgICAgICBlbGlmIGVuYWJsZWQgJHtjZn1fZW5jb2RlcjsgdGhlbgotICAgICAgICAgICAgRElTVF9ESVI9IiR7RElTVF9ESVJ9LSR7Y2Z9Y3giCi0gICAgICAgIGVsaWYgZW5hYmxlZCAke2NmfV9kZWNvZGVyOyB0aGVuCi0gICAgICAgICAgICBESVNUX0RJUj0iJHtESVNUX0RJUn0tJHtjZn1keCIKLSAgICAgICAgZmkKLSAgICBkb25lCi0gICAgZW5hYmxlZCBkZWJ1Z19saWJzICYmIERJU1RfRElSPSIke0RJU1RfRElSfS1kZWJ1ZyIKLSAgICBlbmFibGVkIGNvZGVjX3NyY3MgJiYgRElTVF9ESVI9IiR7RElTVF9ESVJ9LXNyYyIKLSAgICAhIGVuYWJsZWQgcG9zdHByb2MgJiYgRElTVF9ESVI9IiR7RElTVF9ESVJ9LW5vcG9zdCIKLSAgICAhIGVuYWJsZWQgbXVsdGl0aHJlYWQgJiYgRElTVF9ESVI9IiR7RElTVF9ESVJ9LW5vbXQiCi0gICAgISBlbmFibGVkIGluc3RhbGxfZG9jcyAmJiBESVNUX0RJUj0iJHtESVNUX0RJUn0tbm9kb2NzIgotICAgIERJU1RfRElSPSIke0RJU1RfRElSfS0ke3RndF9pc2F9LSR7dGd0X29zfSIKLSAgICBjYXNlICIke3RndF9vc30iIGluCi0gICAgd2luKikgZW5hYmxlZCBzdGF0aWNfbXN2Y3J0ICYmIERJU1RfRElSPSIke0RJU1RfRElSfW10IiB8fCBESVNUX0RJUj0iJHtESVNUX0RJUn1tZCIKLSAgICAgICAgICBESVNUX0RJUj0iJHtESVNUX0RJUn0tJHt0Z3RfY2N9IgotICAgICAgICAgIDs7Ci0gICAgZXNhYwotICAgIGlmIFsgLWYgIiR7c291cmNlX3BhdGh9L2J1aWxkL21ha2UvdmVyc2lvbi5zaCIgXTsgdGhlbgotICAgICAgICBsb2NhbCB2ZXI9YCIkc291cmNlX3BhdGgvYnVpbGQvbWFrZS92ZXJzaW9uLnNoIiAtLWJhcmUgJHNvdXJjZV9wYXRoYAotICAgICAgICBESVNUX0RJUj0iJHtESVNUX0RJUn0tJHt2ZXJ9IgotICAgICAgICBWRVJTSU9OX1NUUklORz0ke3Zlcn0KLSAgICAgICAgdmVyPSR7dmVyJSUtKn0KLSAgICAgICAgVkVSU0lPTl9QQVRDSD0ke3ZlciMjKi59Ci0gICAgICAgIHZlcj0ke3ZlciUuKn0KLSAgICAgICAgVkVSU0lPTl9NSU5PUj0ke3ZlciMjKi59Ci0gICAgICAgIHZlcj0ke3ZlciN2fQotICAgICAgICBWRVJTSU9OX01BSk9SPSR7dmVyJS4qfQotICAgIGZpCi0gICAgZW5hYmxlZCBjaGlsZCB8fCBjYXQgPDxFT0YgPj4gY29uZmlnLm1rCi0KLVBSRUZJWD0ke3ByZWZpeH0KLWlmZXEgKFwkKE1BS0VDTURHT0FMUyksZGlzdCkKLURJU1RfRElSPz0ke0RJU1RfRElSfQotZWxzZQotRElTVF9ESVI/PVwkKERFU1RESVIpJHtwcmVmaXh9Ci1lbmRpZgotTElCU1VCRElSPSR7bGliZGlyIyMke3ByZWZpeH0vfQotCi1WRVJTSU9OX1NUUklORz0ke1ZFUlNJT05fU1RSSU5HfQotCi1WRVJTSU9OX01BSk9SPSR7VkVSU0lPTl9NQUpPUn0KLVZFUlNJT05fTUlOT1I9JHtWRVJTSU9OX01JTk9SfQotVkVSU0lPTl9QQVRDSD0ke1ZFUlNJT05fUEFUQ0h9Ci0KLUNPTkZJR1VSRV9BUkdTPSR7Q09ORklHVVJFX0FSR1N9Ci1FT0YKLSAgICBlbmFibGVkIGNoaWxkIHx8IGVjaG8gIkNPTkZJR1VSRV9BUkdTPz0ke0NPTkZJR1VSRV9BUkdTfSIgPj4gY29uZmlnLm1rCi0KLSAgICAjCi0gICAgIyBXcml0ZSBtYWtlZmlsZXMgZm9yIGFsbCBlbmFibGVkIHRhcmdldHMKLSAgICAjCi0gICAgZm9yIHRndCBpbiBsaWJzIGV4YW1wbGVzIGRvY3Mgc29sdXRpb247IGRvCi0gICAgICAgIGxvY2FsIHRndF9mbj0iJHRndC0kdG9vbGNoYWluLm1rIgotCi0gICAgICAgIGlmIGVuYWJsZWQgJHRndDsgdGhlbgotICAgICAgICAgICAgZWNobyAiQ3JlYXRpbmcgbWFrZWZpbGVzIGZvciAke3Rvb2xjaGFpbn0gJHt0Z3R9IgotICAgICAgICAgICAgd3JpdGVfY29tbW9uX3RhcmdldF9jb25maWdfbWsgJHRndF9mbiAke0JVSUxEX1BGWH12cHhfY29uZmlnLmgKLSAgICAgICAgICAgICN3cml0ZV8ke3RndH1fY29uZmlnCi0gICAgICAgIGZpCi0gICAgZG9uZQotCi19Ci0KLXByb2Nlc3NfZGV0ZWN0KCkgewotICAgIGlmIGVuYWJsZWQgc2hhcmVkOyB0aGVuCi0gICAgICAgICMgQ2FuIG9ubHkgYnVpbGQgc2hhcmVkIGxpYnMgb24gYSBzdWJzZXQgb2YgcGxhdGZvcm1zLiBEb2luZyB0aGlzIGNoZWNrCi0gICAgICAgICMgaGVyZSByYXRoZXIgdGhhbiBhdCBvcHRpb24gcGFyc2UgdGltZSBiZWNhdXNlIHRoZSB0YXJnZXQgYXV0by1kZXRlY3QKLSAgICAgICAgIyBtYWdpYyBoYXBwZW5zIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgaGFzIGJlZW4gcGFyc2VkLgotICAgICAgICBlbmFibGVkIGxpbnV4IHx8IGRpZSAiLS1lbmFibGUtc2hhcmVkIG9ubHkgc3VwcG9ydGVkIG9uIEVMRiBmb3Igbm93IgotICAgIGZpCi0gICAgaWYgWyAteiAiJENDIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkJ5cGFzc2luZyB0b29sY2hhaW4gZm9yIGVudmlyb25tZW50IGRldGVjdGlvbi4iCi0gICAgICAgIGVuYWJsZSBleHRlcm5hbF9idWlsZAotICAgICAgICBjaGVja19oZWFkZXIoKSB7Ci0gICAgICAgICAgICBsb2cgZmFrZV9jaGVja19oZWFkZXIgIiRAIgotICAgICAgICAgICAgaGVhZGVyPSQxCi0gICAgICAgICAgICBzaGlmdAotICAgICAgICAgICAgdmFyPWBlY2hvICRoZWFkZXIgfCBzZWQgJ3MvW15BLVphLXowLTlfXS9fL2cnYAotICAgICAgICAgICAgZGlzYWJsZSAkdmFyCi0gICAgICAgICAgICBjYXNlICRoZWFkZXIgaW4KLSAgICAgICAgICAgICAgICBzdGRpby5oKQotICAgICAgICAgICAgICAgICAgICB0cnVlOwotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgbG9jYWwgcmVzdWx0PWZhbHNlCi0gICAgICAgICAgICAgICAgICAgIGZvciBkIGluICIkQCI7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICBbIC1mICIke2QjIy1JfS8kaGVhZGVyIiBdICYmIHJlc3VsdD10cnVlICYmIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgJHtyZXN1bHQ6LXRydWV9Ci0gICAgICAgICAgICBlc2FjICYmIGVuYWJsZSAkdmFyCi0gICAgICAgIH0KLSAgICAgICAgY2hlY2tfbGQoKSB7Ci0gICAgICAgICAgICB0cnVlCi0gICAgICAgIH0KLSAgICBmaQotICAgIGNoZWNrX2hlYWRlciBzdGRpby5oIHx8IGRpZSAiVW5hYmxlIHRvIGludm9rZSBjb21waWxlcjogJHtDQ30gJHtDRkxBR1N9IgotICAgIGNoZWNrX2xkIDw8RU9GIHx8IGRpZSAiVG9vbGNoYWluIGlzIHVuYWJsZSB0byBsaW5rIGV4ZWN1dGFibGVzIgotaW50IG1haW4odm9pZCkge3JldHVybiAwO30KLUVPRgotICAgICMgY2hlY2sgc3lzdGVtIGhlYWRlcnMKLSAgICBjaGVja19oZWFkZXIgc3RkaW50LmgKLSAgICBjaGVja19oZWFkZXIgcHRocmVhZC5oCi0gICAgY2hlY2tfaGVhZGVyIHN5cy9tbWFuLmgKLQotICAgIGNoZWNrX2hlYWRlciB2cHgvdnB4X2ludGVnZXIuaCAtSSR7c291cmNlX3BhdGh9ICYmIGVuYWJsZSB2cHhfcG9ydHMKLX0KLQotcHJvY2Vzc190b29sY2hhaW4oKSB7Ci0gICAgcHJvY2Vzc19jb21tb25fdG9vbGNoYWluCi0KLSAgICAjIEhhbmRsZSB1bml2ZXJzYWwgYmluYXJpZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCi0gICAgY2FzZSAkdG9vbGNoYWluIGluCi0gICAgICAgIHVuaXZlcnNhbC1kYXJ3aW4qKQotICAgICAgICAgICAgbG9jYWwgZGFyd2luX3Zlcj0ke3RndF9vcyMjZGFyd2lufQotICAgICAgICAgICAgZmF0X2Jpbl9hcmNocz0iJGZhdF9iaW5fYXJjaHMgcHBjMzItJHt0Z3Rfb3N9LWdjYyIKLQotICAgICAgICAgICAgIyBJbnRlbAotICAgICAgICAgICAgZmF0X2Jpbl9hcmNocz0iJGZhdF9iaW5fYXJjaHMgeDg2LSR7dGd0X29zfS0ke3RndF9jY30iCi0gICAgICAgICAgICBpZiBbICRkYXJ3aW5fdmVyIC1ndCA4IF07IHRoZW4KLSAgICAgICAgICAgICAgICBmYXRfYmluX2FyY2hzPSIkZmF0X2Jpbl9hcmNocyB4ODZfNjQtJHt0Z3Rfb3N9LSR7dGd0X2NjfSIKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotICAgIGVzYWMKLQotCi0gICAgIyBFbmFibGUgc29tZSB1c2VmdWwgY29tcGlsZXIgZmxhZ3MKLSAgICBpZiBlbmFibGVkIGdjYzsgdGhlbgotICAgICAgICBlbmFibGVkIHdlcnJvciAmJiBjaGVja19hZGRfY2ZsYWdzIC1XZXJyb3IKLSAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtV2FsbAotICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50Ci0gICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdkaXNhYmxlZC1vcHRpbWl6YXRpb24KLSAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtV3BvaW50ZXItYXJpdGgKLSAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtV3R5cGUtbGltaXRzCi0gICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdjYXN0LXF1YWwKLSAgICAgICAgZW5hYmxlZCBleHRyYV93YXJuaW5ncyB8fCBjaGVja19hZGRfY2ZsYWdzIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCi0gICAgZmkKLQotICAgIGlmIGVuYWJsZWQgaWNjOyB0aGVuCi0gICAgICAgIGVuYWJsZWQgd2Vycm9yICYmIGNoZWNrX2FkZF9jZmxhZ3MgLVdlcnJvcgotICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1XYWxsCi0gICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdwb2ludGVyLWFyaXRoCi0KLSAgICAgICAgIyBJQ0MgaGFzIGEgbnVtYmVyIG9mIGZsb2F0aW5nIHBvaW50IG9wdGltaXphdGlvbnMgdGhhdCB3ZSBkaXNhYmxlCi0gICAgICAgICMgaW4gZmF2b3Igb2YgZGV0ZXJtaW5pc3RpYyBvdXRwdXQgV1JUIHRvIG90aGVyIGNvbXBpbGVycwotICAgICAgICBhZGRfY2ZsYWdzIC1mcC1tb2RlbCBwcmVjaXNlCi0gICAgZmkKLQotICAgICMgRW5hYmxlIGV4dHJhLCBoYXJtbGVzcyB3YXJuaW5ncy4gVGhlc2UgbWlnaHQgcHJvdmlkZSBhZGRpdGlvbmFsIGluc2lnaHQKLSAgICAjIHRvIHdoYXQgdGhlIGNvbXBpbGVyIGlzIGRvaW5nIGFuZCB3aHksIGJ1dCBpbiBnZW5lcmFsLCBidXQgdGhleSBzaG91bGRuJ3QKLSAgICAjIGJlIHRyZWF0ZWQgYXMgZmF0YWwsIGV2ZW4gaWYgd2UncmUgdHJlYXRpbmcgd2FybmluZ3MgYXMgZXJyb3JzLgotICAgIEdDQ19FWFRSQV9XQVJOSU5HUz0iCi0gICAgICAgIC1XZGlzYWJsZWQtb3B0aW1pemF0aW9uCi0gICAgICAgIC1XaW5saW5lCi0gICAgIgotICAgIGVuYWJsZWQgZ2NjICYmIEVYVFJBX1dBUk5JTkdTPSIke0dDQ19FWFRSQV9XQVJOSU5HU30iCi0gICAgUlZDVF9FWFRSQV9XQVJOSU5HUz0iCi0gICAgICAgIC0tcmVtYXJrcwotICAgICIKLSAgICBlbmFibGVkIHJ2Y3QgJiYgRVhUUkFfV0FSTklOR1M9IiR7UlZDVF9FWFRSQV9XQVJOSU5HU30iCi0gICAgaWYgZW5hYmxlZCBleHRyYV93YXJuaW5nczsgdGhlbgotICAgICAgICBmb3IgdyBpbiAke0VYVFJBX1dBUk5JTkdTfTsgZG8KLSAgICAgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgJHt3fQotICAgICAgICAgICAgZW5hYmxlZCBnY2MgJiYgZW5hYmxlZCB3ZXJyb3IgJiYgY2hlY2tfYWRkX2NmbGFncyAtV25vLWVycm9yPSR7d30KLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICAjIGNjYWNoZSBvbmx5IHJlYWxseSB3b3JrcyBvbiBnY2MgdG9vbGNoYWlucwotICAgIGVuYWJsZWQgZ2NjIHx8IHNvZnRfZGlzYWJsZSBjY2FjaGUKLSAgICBpZiBlbmFibGVkIG1pcHM7IHRoZW4KLSAgICAgICAgZW5hYmxlIGRlcXVhbnRfdG9rZW5zCi0gICAgICAgIGVuYWJsZSBkY19yZWNvbgotICAgIGZpCi0KLSAgICAjIEVuYWJsZSB0aGUgcG9zdGJ1aWxkIHRhcmdldCBpZiBidWlsZGluZyBmb3IgdmlzdWFsIHN0dWRpby4KLSAgICBjYXNlICIkdGd0X2NjIiBpbgotICAgICAgICB2cyopIGVuYWJsZSBtc3ZzCi0gICAgICAgICAgICAgZW5hYmxlIHNvbHV0aW9uCi0gICAgICAgICAgICAgdnNfdmVyc2lvbj0ke3RndF9jYyMjdnN9Ci0gICAgICAgICAgICAgYWxsX3RhcmdldHM9IiR7YWxsX3RhcmdldHN9IHNvbHV0aW9uIgotICAgICAgICA7OwotICAgIGVzYWMKLQotICAgICMgT3RoZXIgdG9vbGNoYWluIHNwZWNpZmljIGRlZmF1bHRzCi0gICAgY2FzZSAkdG9vbGNoYWluIGluIHg4Nip8cHBjKnx1bml2ZXJzYWwqKSBzb2Z0X2VuYWJsZSBwb3N0cHJvYzs7IGVzYWMKLQotICAgIGlmIGVuYWJsZWQgcG9zdHByb2NfdmlzdWFsaXplcjsgdGhlbgotICAgICAgICBlbmFibGVkIHBvc3Rwcm9jIHx8IGRpZSAicG9zdHByb2NfdmlzdWFsaXplciByZXF1aXJlcyBwb3N0cHJvYyB0byBiZSBlbmFibGVkIgotICAgIGZpCi19Ci0KLQotIyMKLSMjIEVORCBBUFBMSUNBVElPTiBTUEVDSUZJQyBDT05GSUdVUkFUSU9OCi0jIwotQ09ORklHVVJFX0FSR1M9IiRAIgotcHJvY2VzcyAiJEAiCi1jYXQgPDxFT0YgPiAke0JVSUxEX1BGWH12cHhfY29uZmlnLmMKLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBjZmcgPSAiJENPTkZJR1VSRV9BUkdTIjsKLWNvbnN0IGNoYXIgKnZweF9jb2RlY19idWlsZF9jb25maWcodm9pZCkge3JldHVybiBjZmc7fQotRU9GCmRpZmYgLS1naXQgYS9kb2NzLm1rIGIvZG9jcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzMzJhMi4uMDAwMDAwMAotLS0gYS9kb2NzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMKLSMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0jIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSMjCi0KLQotSU5TVEFMTF9NQVBTICs9IGRvY3MvJSAgICBkb2NzLyUKLUlOU1RBTExfTUFQUyArPSBzcmMvJSAgICAgJQotSU5TVEFMTF9NQVBTICs9ICUgICAgICAgICAlCi0KLSMgU3RhdGljIGRvY3VtZW50YXRpb24gYXV0aG9yZWQgaW4gZG94eWdlbgotQ09ERUNfRE9YIDo9ICAgIG1haW5wYWdlLmRveCBcCi0JCWtleXdvcmRzLmRveCBcCi0JCXVzYWdlLmRveCBcCi0JCXVzYWdlX2N4LmRveCBcCi0JCXVzYWdlX2R4LmRveCBcCi0KLSMgT3RoZXIgZG94eSBmaWxlcyBzb3VyY2VkIGluIE1hcmtkb3duCi1UWFRfRE9YLSQoQ09ORklHX1ZQOCkgICAgICAgICAgKz0gdnA4X2FwaTFfbWlncmF0aW9uLmRveAotdnA4X2FwaTFfbWlncmF0aW9uLmRveC5ERVNDICAgICA9IFZQOCBBUEkgMS54IE1pZ3JhdGlvbgotCi1UWFRfRE9YID0gJChjYWxsIGVuYWJsZWQsVFhUX0RPWCkKLQotJS5kb3g6ICUudHh0Ci0JQGVjaG8gIiAgICBbRE9YWV0gJEAiCi0JQCQoU1JDX1BBVEhfQkFSRSkvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfZG94eS5waHAgXAotICAgICAgICAgICAgICQoQDouZG94PSkgICIkKCRALkRFU0MpIiA+ICRAIDwgJDwKLQotCi1FWEFNUExFX1BBVEggKz0gJChTUkNfUEFUSF9CQVJFKSAjZm9yIENIQU5HRUxPRywgUkVBRE1FLCBldGMKLQotZG94eWZpbGU6ICQoaWYgJChmaW5kc3RyaW5nIGV4YW1wbGVzLCAkKEFMTF9UQVJHRVRTKSksZXhhbXBsZXMuZG94eSkKLWRveHlmaWxlOiBsaWJzLmRveHlfdGVtcGxhdGUgbGlicy5kb3h5Ci0JQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKLQlAY2F0ICReID4gJEAKLQlAZWNobyAiU1RSSVBfRlJPTV9QQVRIICs9ICQoU1JDX1BBVEhfQkFSRSkgJChCVUlMRF9ST09UKSIgPj4gJEAKLQlAZWNobyAiSU5QVVQgKz0gJChhZGRwcmVmaXggJChTUkNfUEFUSF9CQVJFKS8sJChDT0RFQ19ET1gpKSIgPj4gJEA7Ci0JQGVjaG8gIklOUFVUICs9ICQoVFhUX0RPWCkiID4+ICRAOwotCUBlY2hvICJFWEFNUExFX1BBVEggKz0gJChFWEFNUExFX1BBVEgpIiA+PiAkQAotCi1DTEVBTi1PQkpTICs9IGRveHlmaWxlICQod2lsZGNhcmQgZG9jcy9odG1sLyopCi1kb2NzL2h0bWwvaW5kZXguaHRtbDogZG94eWZpbGUgJChDT0RFQ19ET1gpICQoVFhUX0RPWCkKLQlAZWNobyAiICAgIFtET1hZR0VOXSAkPCIKLQlAZG94eWdlbiAkPAotRE9DUy15ZXMgKz0gZG9jcy9odG1sL2luZGV4Lmh0bWwKLQotRElTVC1ET0NTLXllcyA9ICQod2lsZGNhcmQgZG9jcy9odG1sLyopCi1ESVNULURPQ1MtJChDT05GSUdfQ09ERUNfU1JDUykgKz0gJChhZGRwcmVmaXggc3JjLywkKENPREVDX0RPWCkpCi1ESVNULURPQ1MtJChDT05GSUdfQ09ERUNfU1JDUykgKz0gc3JjL2xpYnMuZG94eV90ZW1wbGF0ZQotRElTVC1ET0NTLXllcyAgICAgICAgICAgICAgICAgICs9IENIQU5HRUxPRwotRElTVC1ET0NTLXllcyAgICAgICAgICAgICAgICAgICs9IFJFQURNRQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMubWsgYi9leGFtcGxlcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljOTNkYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy5taworKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0jIwotIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIwotIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0jIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotIyMKLQotCi0jIExpc3Qgb2YgZXhhbXBsZXMgdG8gYnVpbGQuIFVUSUxTIGFyZSBmaWxlcyB0aGF0IGFyZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UKLSMgdHJlZSBkaXJlY3RseSwgYW5kIEdFTl9FWEFNUExFUyBhcmUgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHRoZQotIyBleGFtcGxlcyBmb2xkZXIuCi1VVElMUy0kKENPTkZJR19ERUNPREVSUykgICAgKz0gdnB4ZGVjLmMKLXZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSBtZDVfdXRpbHMuYyBtZDVfdXRpbHMuaAotdnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IHZweF9wb3J0cy92cHhfdGltZXIuaAotdnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IHZweC92cHhfaW50ZWdlci5oCi12cHhkZWMuU1JDUyAgICAgICAgICAgICAgICAgKz0gYXJncy5jIGFyZ3MuaCB2cHhfcG9ydHMvY29uZmlnLmgKLXZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSB0b29sc19jb21tb24uYyB0b29sc19jb21tb24uaAotdnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvaGFsbG9jL2hhbGxvYy5oCi12cHhkZWMuU1JDUyAgICAgICAgICAgICAgICAgKz0gbmVzdGVnZy9oYWxsb2Mvc3JjL2FsaWduLmgKLXZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSBuZXN0ZWdnL2hhbGxvYy9zcmMvaGFsbG9jLmMKLXZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSBuZXN0ZWdnL2hhbGxvYy9zcmMvaGxpc3QuaAotdnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvaGFsbG9jL3NyYy9tYWNyb3MuaAotdnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaAotdnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvc3JjL25lc3RlZ2cuYwotdnB4ZGVjLkdVSUQgICAgICAgICAgICAgICAgICA9IEJBNUZFNjZGLTM4REQtRTAzNC1GNTQyLUIxNTc4QzVGQjk1MAotdnB4ZGVjLkRFU0NSSVBUSU9OICAgICAgICAgICA9IEZ1bGwgZmVhdHVyZWQgZGVjb2RlcgotVVRJTFMtJChDT05GSUdfRU5DT0RFUlMpICAgICs9IHZweGVuYy5jCi12cHhlbmMuU1JDUyAgICAgICAgICAgICAgICAgKz0gYXJncy5jIGFyZ3MuaCB5NG1pbnB1dC5jIHk0bWlucHV0LmgKLXZweGVuYy5TUkNTICAgICAgICAgICAgICAgICArPSB0b29sc19jb21tb24uYyB0b29sc19jb21tb24uaAotdnB4ZW5jLlNSQ1MgICAgICAgICAgICAgICAgICs9IHZweF9wb3J0cy9jb25maWcuaCB2cHhfcG9ydHMvbWVtX29wcy5oCi12cHhlbmMuU1JDUyAgICAgICAgICAgICAgICAgKz0gdnB4X3BvcnRzL21lbV9vcHNfYWxpZ25lZC5oCi12cHhlbmMuU1JDUyAgICAgICAgICAgICAgICAgKz0gbGlibWt2L0VibWxJRHMuaAotdnB4ZW5jLlNSQ1MgICAgICAgICAgICAgICAgICs9IGxpYm1rdi9FYm1sV3JpdGVyLmMKLXZweGVuYy5TUkNTICAgICAgICAgICAgICAgICArPSBsaWJta3YvRWJtbFdyaXRlci5oCi12cHhlbmMuR1VJRCAgICAgICAgICAgICAgICAgID0gNTQ4REVDNzQtN0ExNS00QjJCLUFGQzMtQUExMDJFN0MyNUMxCi12cHhlbmMuREVTQ1JJUFRJT04gICAgICAgICAgID0gRnVsbCBmZWF0dXJlZCBlbmNvZGVyCi0KLSMgQ2xlYW4gdXAgb2xkIGl2ZmVuYywgaXZmZGVjIGJpbmFyaWVzLgotaWZlcSAoJChDT05GSUdfTVNWUykseWVzKQotQ0xFQU4tT0JKUyArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChwKS9SZWxlYXNlL2l2ZmVuYy5leGUpCi1DTEVBTi1PQkpTICs9ICQoZm9yZWFjaCBwLCQoVlNfUExBVEZPUk1TKSwkKHApL1JlbGVhc2UvaXZmZGVjLmV4ZSkKLWVsc2UKLUNMRUFOLU9CSlMgKz0gaXZmZW5jey5jLm8sLmMuZCwuZG94LC5leGUsfQotQ0xFQU4tT0JKUyArPSBpdmZkZWN7LmMubywuYy5kLC5kb3gsLmV4ZSx9Ci1lbmRpZgotCi0jIFhNQSBleGFtcGxlIGRpc2FibGVkIGZvciBub3csIG5vdCB1c2VkIGluIFZQOAotI1VUSUxTLSQoQ09ORklHX0RFQ09ERVJTKSAgICArPSBleGFtcGxlX3htYS5jCi0jZXhhbXBsZV94bWEuR1VJRCAgICAgICAgICAgICA9IEE5NTVGQzRBLTczRjEtNDRGNy0xMzVFLTMwRDg0RDMyRjAyMgotI2V4YW1wbGVfeG1hLkRFU0NSSVBUSU9OICAgICAgPSBFeHRlcm5hbCBNZW1vcnkgQWxsb2NhdGlvbiBtb2RlIHVzYWdlCi0KLUdFTl9FWEFNUExFUy0kKENPTkZJR19ERUNPREVSUykgKz0gc2ltcGxlX2RlY29kZXIuYwotc2ltcGxlX2RlY29kZXIuR1VJRCAgICAgICAgICAgICAgPSBEM0JCRjFFOS0yNDI3LTQ1MEQtQkJGRi1CMjg0M0MxRDQ0Q0MKLXNpbXBsZV9kZWNvZGVyLkRFU0NSSVBUSU9OICAgICAgID0gU2ltcGxpZmllZCBkZWNvZGVyIGxvb3AKLUdFTl9FWEFNUExFUy0kKENPTkZJR19ERUNPREVSUykgKz0gcG9zdHByb2MuYwotcG9zdHByb2MuR1VJRCAgICAgICAgICAgICAgICAgICAgPSA2NUUzMzM1NS1GMzVFLTQwODgtODg0RC0zRkQ0OTA1ODgxRDcKLXBvc3Rwcm9jLkRFU0NSSVBUSU9OICAgICAgICAgICAgID0gRGVjb2RlciBwb3N0cHJvY2Vzc29yIGNvbnRyb2wKLUdFTl9FWEFNUExFUy0kKENPTkZJR19ERUNPREVSUykgKz0gZGVjb2RlX3RvX21kNS5jCi1kZWNvZGVfdG9fbWQ1LlNSQ1MgICAgICAgICAgICAgICs9IG1kNV91dGlscy5oIG1kNV91dGlscy5jCi1kZWNvZGVfdG9fbWQ1LkdVSUQgICAgICAgICAgICAgICA9IDU5MTIwQjlCLTI3MzUtNEJGRS1CMDIyLTE0NkNBMzQwRkU0MgotZGVjb2RlX3RvX21kNS5ERVNDUklQVElPTiAgICAgICAgPSBGcmFtZSBieSBmcmFtZSBNRDUgY2hlY2tzdW0KLQotR0VOX0VYQU1QTEVTLSQoQ09ORklHX0VOQ09ERVJTKSArPSBzaW1wbGVfZW5jb2Rlci5jCi1zaW1wbGVfZW5jb2Rlci5HVUlEICAgICAgICAgICAgICA9IDQ2MDdEMjk5LThBNzEtNEQyQy05QjFELTA3MTg5OUI2RkJGRAotc2ltcGxlX2VuY29kZXIuREVTQ1JJUFRJT04gICAgICAgPSBTaW1wbGlmaWVkIGVuY29kZXIgbG9vcAotR0VOX0VYQU1QTEVTLSQoQ09ORklHX0VOQ09ERVJTKSArPSB0d29wYXNzX2VuY29kZXIuYwotdHdvcGFzc19lbmNvZGVyLkdVSUQgICAgICAgICAgICAgPSA3MzQ5NEZBNi00QUY5LTQ3NjMtOEZCQi0yNjVDOTI0MDJGRDgKLXR3b3Bhc3NfZW5jb2Rlci5ERVNDUklQVElPTiAgICAgID0gVHdvLXBhc3MgZW5jb2RlciBsb29wCi1HRU5fRVhBTVBMRVMtJChDT05GSUdfRU5DT0RFUlMpICs9IGZvcmNlX2tleWZyYW1lLmMKLWZvcmNlX2tleWZyYW1lLkdVSUQgICAgICAgICAgICAgID0gM0M2N0NBREYtMDI5Ri00Qzg2LTgxRjUtRDZENEY1MTE3N0YwCi1mb3JjZV9rZXlmcmFtZS5ERVNDUklQVElPTiAgICAgICA9IEZvcmNlIGdlbmVyYXRpb24gb2Yga2V5ZnJhbWVzCi1pZmVxICgkKENPTkZJR19ERUNPREVSUykseWVzKQotR0VOX0VYQU1QTEVTLSQoQ09ORklHX0VOQ09ERVJTKSArPSBkZWNvZGVfd2l0aF9kcm9wcy5jCi1lbmRpZgotZGVjb2RlX3dpdGhfZHJvcHMuR1VJRCAgICAgICAgICAgPSBDRTVDNTNDNC04RERBLTQzOEEtODZFRC0wREREM0NEQjhEMjYKLWRlY29kZV93aXRoX2Ryb3BzLkRFU0NSSVBUSU9OICAgID0gRHJvcHMgZnJhbWVzIHdoaWxlIGRlY29kaW5nCi1HRU5fRVhBTVBMRVMtJChDT05GSUdfRU5DT0RFUlMpICs9IGVycm9yX3Jlc2lsaWVudC5jCi1lcnJvcl9yZXNpbGllbnQuR1VJRCAgICAgICAgICAgICA9IERGNTgzN0I5LTQxNDUtNEY5Mi1BMDMxLTQ0RTRGODMyRTAwQwotZXJyb3JfcmVzaWxpZW50LkRFU0NSSVBUSU9OICAgICAgPSBFcnJvciBSZXNpbGllbmN5IEZlYXR1cmUKLQotR0VOX0VYQU1QTEVTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSB2cDhfc2NhbGFibGVfcGF0dGVybnMuYwotdnA4X3NjYWxhYmxlX3BhdHRlcm5zLkdVSUQgICAgICAgICAgPSAwRDZBMjEwQi1GNDgyLTRENkYtODU3MC00QTlDMDFBQ0M4OEMKLXZwOF9zY2FsYWJsZV9wYXR0ZXJucy5ERVNDUklQVElPTiAgID0gVlA4IFNjYWxhYmxlIEJpdHN0cmVhbSBQYXR0ZXJucwotR0VOX0VYQU1QTEVTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSB2cDhfc2V0X21hcHMuYwotdnA4X3NldF9tYXBzLkdVSUQgICAgICAgICAgICAgICAgICAgPSBFQ0IyRDI0RC05OEI4LTQwMTUtQTQ2NS1BNEFGM0RDQzE0NUYKLXZwOF9zZXRfbWFwcy5ERVNDUklQVElPTiAgICAgICAgICAgID0gVlA4IHNldCBhY3RpdmUgYW5kIFJPSSBtYXBzCi1HRU5fRVhBTVBMRVMtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IHZwOGN4X3NldF9yZWYuYwotdnA4Y3hfc2V0X3JlZi5HVUlEICAgICAgICAgICAgICAgICAgPSBDNUUzMUY3Ri05NkY2LTQ4QkQtQkQzRS0xMEVCRjZFODA1N0EKLXZwOGN4X3NldF9yZWYuREVTQ1JJUFRJT04gICAgICAgICAgID0gVlA4IHNldCBlbmNvZGVyIHJlZmVyZW5jZSBmcmFtZQotCi0KLSMgSGFuZGxlIGV4dHJhIGxpYnJhcnkgZmxhZ3MgZGVwZW5kaW5nIG9uIGNvZGVjIGNvbmZpZ3VyYXRpb24KLQotIyBXZSBzaG91bGQgbm90IGxpbmsgdG8gbWF0aCBsaWJyYXJ5IChsaWJtKSBvbiBSVkNUCi0jIHdoZW4gYnVpbGRpbmcgZm9yIGJhcmUtbWV0YWwgdGFyZ2V0cwotaWZlcSAoJChDT05GSUdfT1NfU1VQUE9SVCksIHllcykKLUNPREVDX0VYVFJBX0xJQlMtJChDT05GSUdfVlA4KSAgICAgICAgICs9IG0KLWVsc2UKLSAgICBpZmVxICgkKENPTkZJR19HQ0MpLCB5ZXMpCi0gICAgQ09ERUNfRVhUUkFfTElCUy0kKENPTkZJR19WUDgpICAgICAgICAgKz0gbQotICAgIGVuZGlmCi1lbmRpZgotIwotIyBFbmQgb2Ygc3BlY2lmaWVkIGZpbGVzLiBUaGUgcmVzdCBvZiB0aGUgYnVpbGQgcnVsZXMgc2hvdWxkIGhhcHBlbgotIyBhdXRvbWFnaWNhbGx5IGZyb20gaGVyZS4KLSMKLQotCi0jIEV4YW1wbGVzIG5lZWQgZGlmZmVyZW50IGZsYWdzIGJhc2VkIG9uIHdoZXRoZXIgd2UncmUgYnVpbGRpbmcKLSMgZnJvbSBhbiBpbnN0YWxsZWQgdHJlZSBvciBhIHZlcnNpb24gY29udHJvbGxlZCB0cmVlLiBEZXRlcm1pbmUKLSMgdGhlIHByb3BlciBwYXRocy4KLWlmZXEgKCQoSEFWRV9BTFRfVFJFRV9MQVlPVVQpLHllcykKLSAgICBMSUJfUEFUSCA6PSAkKFNSQ19QQVRIX0JBUkUpLy4uL2xpYgotICAgIElOQ19QQVRIIDo9ICQoU1JDX1BBVEhfQkFSRSkvLi4vaW5jbHVkZQotZWxzZQotICAgIExJQl9QQVRILXllcyAgICAgICAgICAgICAgICAgICAgICs9ICQoaWYgJChCVUlMRF9QRlgpLCQoQlVJTERfUEZYKSwuKQotICAgIElOQ19QQVRILSQoQ09ORklHX1ZQOF9ERUNPREVSKSAgICs9ICQoU1JDX1BBVEhfQkFSRSkvdnA4Ci0gICAgSU5DX1BBVEgtJChDT05GSUdfVlA4X0VOQ09ERVIpICAgKz0gJChTUkNfUEFUSF9CQVJFKS92cDgKLSAgICBMSUJfUEFUSCA6PSAkKGNhbGwgZW5hYmxlZCxMSUJfUEFUSCkKLSAgICBJTkNfUEFUSCA6PSAkKGNhbGwgZW5hYmxlZCxJTkNfUEFUSCkKLWVuZGlmCi1DRkxBR1MgKz0gJChhZGRwcmVmaXggLUksJChJTkNfUEFUSCkpCi1MREZMQUdTICs9ICQoYWRkcHJlZml4IC1MLCQoTElCX1BBVEgpKQotCi0KLSMgRXhwYW5kIGxpc3Qgb2Ygc2VsZWN0ZWQgZXhhbXBsZXMgdG8gYnVpbGQgKGFzIHNwZWNpZmllZCBhYm92ZSkKLVVUSUxTICAgICAgICAgICA9ICQoY2FsbCBlbmFibGVkLFVUSUxTKQotR0VOX0VYQU1QTEVTICAgID0gJChjYWxsIGVuYWJsZWQsR0VOX0VYQU1QTEVTKQotQUxMX0VYQU1QTEVTICAgID0gJChVVElMUykgJChHRU5fRVhBTVBMRVMpCi1VVElMX1NSQ1MgICAgICAgPSAkKGZvcmVhY2ggZXgsJChVVElMUyksJCgkKGV4Oi5jPSkuU1JDUykpCi1BTExfU1JDUyAgICAgICAgPSAkKGZvcmVhY2ggZXgsJChBTExfRVhBTVBMRVMpLCQoJChleDouYz0pLlNSQ1MpKQotQ09ERUNfRVhUUkFfTElCUz0kKHNvcnQgJChjYWxsIGVuYWJsZWQsQ09ERUNfRVhUUkFfTElCUykpCi0KLQotIyBFeHBhbmQgYWxsIGV4YW1wbGUgc291cmNlcyBpbnRvIGEgdmFyaWFibGUgY29udGFpbmluZyBhbGwgc291cmNlcwotIyBmb3IgdGhhdCBleGFtcGxlIChub3QganVzdCB0aGVtIG1haW4gb25lIHNwZWNpZmllZCBpbiBVVElMUy9HRU5fRVhBTVBMRVMpCi0jIGFuZCBhZGQgdGhpcyBmaWxlIHRvIHRoZSBsaXN0IChmb3IgTVNWUyB3b3Jrc3BhY2UgZ2VuZXJhdGlvbikKLSQoZm9yZWFjaCBleCwkKEFMTF9FWEFNUExFUyksJChldmFsICQoZXg6LmM9KS5TUkNTICs9ICQoZXgpIGV4YW1wbGVzLm1rKSkKLQotCi0jIElmIHRoaXMgaXMgYSB1bml2ZXJzYWwgKGZhdCkgYmluYXJ5LCB0aGVuIGFsbCB0aGUgc3ViYXJjaGl0ZWN0dXJlcyBoYXZlCi0jIGFscmVhZHkgYmVlbiBidWlsdCBhbmQgb3VyIGpvYiBpcyB0byBzdGl0Y2ggdGhlbSB0b2dldGhlci4gVGhlCi0jIEJVSUxEX09CSlMgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIGJ1aWxkaW5nCi0jIChjb21waWxpbmcsIGxpbmtpbmcpIHRoZSBsaWJyYXJ5LiBUaGUgTElQT19PQkpTIHZhcmlhYmxlIGluZGljYXRlcwotIyB0aGF0IHdlJ3JlIHN0aXRjaGluZy4KLSQoZXZhbCAkKGlmICQoZmlsdGVyIHVuaXZlcnNhbCUsJChUT09MQ0hBSU4pKSxMSVBPX09CSlMsQlVJTERfT0JKUyk6PXllcykKLQotCi0jIENyZWF0ZSBidWlsZC9pbnN0YWxsIGRlcGVuZGVuY2llcyBmb3IgYWxsIGV4YW1wbGVzLiBUaGUgY29tbW9uIGNhc2UKLSMgaXMgaGFuZGxlZCBoZXJlLiBUaGUgTVNWUyBjYXNlIGlzIGhhbmRsZWQgYmVsb3cuCi1OT1RfTVNWUyA9ICQoaWYgJChDT05GSUdfTVNWUyksLHllcykKLURJU1QtQklOUy0kKE5PVF9NU1ZTKSAgICAgICs9ICQoYWRkcHJlZml4IGJpbi8sJChBTExfRVhBTVBMRVM6LmM9KSkKLUlOU1RBTEwtQklOUy0kKE5PVF9NU1ZTKSAgICs9ICQoYWRkcHJlZml4IGJpbi8sJChVVElMUzouYz0pKQotRElTVC1TUkNTLXllcyAgICAgICAgICAgICAgKz0gJChBTExfU1JDUykKLUlOU1RBTEwtU1JDUy15ZXMgICAgICAgICAgICs9ICQoVVRJTF9TUkNTKQotT0JKUy0kKE5PVF9NU1ZTKSAgICAgICAgICAgKz0gJChpZiAkKEJVSUxEX09CSlMpLCQoY2FsbCBvYmpzLCQoQUxMX1NSQ1MpKSkKLUJJTlMtJChOT1RfTVNWUykgICAgICAgICAgICs9ICQoYWRkcHJlZml4ICQoQlVJTERfUEZYKSwkKEFMTF9FWEFNUExFUzouYz0pKQotCi0KLSMgSW5zdGFudGlhdGUgbGlua2VyIHRlbXBsYXRlIGZvciBhbGwgZXhhbXBsZXMuCi1DT0RFQ19MSUI9JChpZiAkKENPTkZJR19ERUJVR19MSUJTKSx2cHhfZyx2cHgpCi0kKGZvcmVhY2ggYmluLCQoQklOUy15ZXMpLFwKLSAgICAkKGlmICQoQlVJTERfT0JKUyksJChldmFsICQoYmluKTogJChMSUJfUEFUSCkvbGliJChDT0RFQ19MSUIpLmEpKVwKLSAgICAkKGlmICQoQlVJTERfT0JKUyksJChldmFsICQoY2FsbCBsaW5rZXJfdGVtcGxhdGUsJChiaW4pLFwKLSAgICAgICAgJChjYWxsIG9ianMsJCgkKG5vdGRpciAkKGJpbikpLlNSQ1MpKSBcCi0gICAgICAgIC1sJChDT0RFQ19MSUIpICQoYWRkcHJlZml4IC1sLCQoQ09ERUNfRVhUUkFfTElCUykpXAotICAgICAgICApKSlcCi0gICAgJChpZiAkKExJUE9fT0JKUyksJChldmFsICQoY2FsbCBsaXBvX2Jpbl90ZW1wbGF0ZSwkKGJpbikpKSlcCi0gICAgKQotCi0KLSMgUnVsZXMgdG8gZ2VuZXJhdGUgdGhlIEdFTl9FWEFNUExFUyBzb3VyY2VzCi0uUFJFQ0lPVVM6ICUuYwotQ0xFQU4tT0JKUyArPSAkKEdFTl9FWEFNUExFUykKLSUuYzogZXhhbXBsZXMvJS50eHQKLQlAZWNobyAiICAgIFtFWEFNUExFXSAkQCIKLQlAJChTUkNfUEFUSF9CQVJFKS9leGFtcGxlcy9nZW5fZXhhbXBsZV9jb2RlLnNoICQ8ID4gJEAKLQotCi0jIFRoZSBmb2xsb3dpbmcgcGFpcnMgZGVmaW5lIGEgbWFwcGluZyBvZiBsb2NhdGlvbnMgaW4gdGhlIGRpc3RyaWJ1dGlvbgotIyB0cmVlIHRvIGxvY2F0aW9ucyBpbiB0aGUgc291cmNlL2J1aWxkIHRyZWVzLgotSU5TVEFMTF9NQVBTICs9IHNyYy8lLmMgICAlLmMKLUlOU1RBTExfTUFQUyArPSBzcmMvJSAgICAgJChTUkNfUEFUSF9CQVJFKS8lCi1JTlNUQUxMX01BUFMgKz0gYmluLyUgICAgICUKLUlOU1RBTExfTUFQUyArPSAlICAgICAgICAgJQotCi0KLSMgU2V0IHVwIGFkZGl0aW9uYWwgTVNWUyBlbnZpcm9ubWVudAotaWZlcSAoJChDT05GSUdfTVNWUykseWVzKQotQ09ERUNfTElCPSQoaWYgJChDT05GSUdfU1RBVElDX01TVkNSVCksdnB4bXQsdnB4bWQpCi0jIFRoaXMgdmFyaWFibGUgdXNlcyBkZWZlcnJlZCBleHBhbnNpb24gaW50ZW50aW9uYWxseSwgc2luY2UgdGhlIHJlc3VsdHMgb2YKLSMgJCh3aWxkY2FyZCkgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgTWFrZS4KLVZTX1BMQVRGT1JNUyA9ICQoZm9yZWFjaCBkLCQod2lsZGNhcmQgKi9SZWxlYXNlLyQoQ09ERUNfTElCKS5saWIpLCQod29yZCAxLCQoc3Vic3QgLywgLCQoZCkpKSkKLUlOU1RBTExfTUFQUyArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksYmluLyQocCkvJSAgJChwKS9SZWxlYXNlLyUpCi1lbmRpZgotCi0jIEJ1aWxkIFZpc3VhbCBTdHVkaW8gUHJvamVjdHMuIFdlIHVzZSBhIHRlbXBsYXRlIGhlcmUgdG8gaW5zdGFudGlhdGUKLSMgZXhwbGljaXQgcnVsZXMgcmF0aGVyIHRoYW4gdXNpbmcgYW4gaW1wbGljaXQgcnVsZSBiZWNhdXNlIHdlIHdhbnQgdG8KLSMgbGV2ZXJhZ2UgbWFrZSdzIFZQQVRIIHNlYXJjaGluZyByYXRoZXIgdGhhbiBzcGVjaWZ5aW5nIHRoZSBwYXRocyBvbgotIyBlYWNoIGZpbGUgaW4gQUxMX0VYQU1QTEVTLiBUaGlzIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3QgdGhhdAotIyB0b3VjaGluZyB0aGUgc291cmNlIGZpbGVzIHRyaWdnZXIgYSByZWJ1aWxkIG9mIHRoZSBwcm9qZWN0IGZpbGVzCi0jIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIHJlYWwgZGVwZW5kZW5jeSB0aGVyZSAodGhlIGRlcGVuZGVuY3kgaXMgb24KLSMgdGhlIG1ha2VmaWxlcykuIFdlIG1heSB3YW50IHRvIHJldmlzaXQgdGhpcy4KLWRlZmluZSB2Y3Byb2pfdGVtcGxhdGUKLSQoMSk6ICQoJCgxOi52Y3Byb2o9KS5TUkNTKQotCUBlY2hvICIgICAgW3ZjcHJval0gJCRAIgotCSQkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2UvZ2VuX21zdnNfcHJvai5zaFwKLSAgICAgICAgICAgIC0tZXhlXAotICAgICAgICAgICAgLS10YXJnZXQ9JCQoVE9PTENIQUlOKVwKLSAgICAgICAgICAgIC0tbmFtZT0kJChAOi52Y3Byb2o9KVwKLSAgICAgICAgICAgIC0tdmVyPSQkKENPTkZJR19WU19WRVJTSU9OKVwKLSAgICAgICAgICAgIC0tcHJvai1ndWlkPSQkKCQkKEA6LnZjcHJvaj0pLkdVSUQpXAotICAgICAgICAgICAgJCQoaWYgJCQoQ09ORklHX1NUQVRJQ19NU1ZDUlQpLC0tc3RhdGljLWNydCkgXAotICAgICAgICAgICAgLS1vdXQ9JCRAICQkKENGTEFHUykgJCQoTERGTEFHUykgLWwkJChDT0RFQ19MSUIpIC1sd2lubW0gJCReCi1lbmRlZgotUFJPSkVDVFMtJChDT05GSUdfTVNWUykgKz0gJChBTExfRVhBTVBMRVM6LmM9LnZjcHJvaikKLUlOU1RBTEwtQklOUy0kKENPTkZJR19NU1ZTKSArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IGJpbi8kKHApLywkKEFMTF9FWEFNUExFUzouYz0uZXhlKSkpCi0kKGZvcmVhY2ggcHJvaiwkKGNhbGwgZW5hYmxlZCxQUk9KRUNUUyksXAotICAgICQoZXZhbCAkKGNhbGwgdmNwcm9qX3RlbXBsYXRlLCQocHJvaikpKSkKLQotCi0KLSMKLSMgRG9jdW1lbnRhdGlvbiBSdWxlcwotIwotJS5kb3g6IGV4YW1wbGVzLyUudHh0Ci0JQGVjaG8gIiAgICBbRE9YWV0gJEAiCi0JQCQoU1JDX1BBVEhfQkFSRSkvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfdGV4dC5zaCAkPCB8IFwKLSAgICAgICAgICQoU1JDX1BBVEhfQkFSRSkvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfZG94eS5waHAgXAotICAgICAgICAgICAgIGV4YW1wbGVfJChAOi5kb3g9KSAgJChAOi5kb3g9LmMpID4gJEAKLQotJS5kb3g6ICUuYwotCUBlY2hvICIgICAgW0RPWFldICRAIgotCUBlY2hvICIvKiFccGFnZSBleGFtcGxlXyQoQDouZG94PSkgJChAOi5kb3g9KSIgPiAkQAotCUBlY2hvICIgICBcaW5jbHVkZWxpbmVubyAkKG5vdGRpciAkPCkiID4+ICRACi0JQGVjaG8gIiovIiA+PiAkQAotCi1zYW1wbGVzLmRveDogZXhhbXBsZXMubWsKLQlAZWNobyAiICAgIFtET1hZXSAkQCIKLQlAZWNobyAiLyohXHBhZ2Ugc2FtcGxlcyBTYW1wbGUgQ29kZSIgPiAkQAotCUBlY2hvICIgICAgVGhpcyBTREsgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc2FtcGxlIGFwcGxpY2F0aW9ucy4iXAotCSAgICAgICJlYWNoIHNhbXBsZSBkb2N1bWVudHMgYSBmZWF0dXJlIG9mIHRoZSBTREsgaW4gYm90aCBwcm9zZSJcCi0JICAgICAgImFuZCB0aGUgYXNzb2NpYXRlZCBDIGNvZGUuIEluIGdlbmVyYWwsIGxhdGVyIHNhbXBsZXMiXAotCSAgICAgICJidWlsZCB1cG9uIHByaW9yIHNhbXBsZXMsIHNvIGl0IGlzIGJlc3QgdG8gd29yayB0aHJvdWdoIHRoZSJcCi0JICAgICAgImxpc3QgaW4gb3JkZXIuIFRoZSBmb2xsb3dpbmcgc2FtcGxlcyBhcmUgaW5jbHVkZWQ6ICI+PiRACi0JQCQoZm9yZWFjaCBleCwkKEdFTl9FWEFNUExFUzouYz0pLFwKLQkgICBlY2hvICIgICAgIC0gXHN1YnBhZ2UgZXhhbXBsZV8kKGV4KSAkKCQoZXgpLkRFU0NSSVBUSU9OKSIgPj4gJEA7KQotCUBlY2hvID4+ICRACi0JQGVjaG8gIiAgICBJbiBhZGRpdGlvbiwgdGhlIFNESyBjb250YWlucyBhIG51bWJlciBvZiB1dGlsaXRpZXMuIlwKLSAgICAgICAgICAgICAgIlNpbmNlIHRoZXNlIHV0aWxpdGllcyBhcmUgYnVpbHQgdXBvbiB0aGUgY29uY2VwdHMgZGVzY3JpYmVkIlwKLSAgICAgICAgICAgICAgImluIHRoZSBzYW1wbGUgY29kZSBsaXN0ZWQgYWJvdmUsIHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIGluIlwKLSAgICAgICAgICAgICAgInBpZWNlcyBsaWtlIHRoZSBzYW1wbGVzIGFyZS4gVGhpciBzb3VyY3JlIGlzIGluY2x1ZGVkIGhlcmUiXAotICAgICAgICAgICAgICAiZm9yIHJlZmVyZW5jZS4gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgYXJlIGluY2x1ZGVkOiIgPj4gJEAKLQlAJChmb3JlYWNoIGV4LCQoVVRJTFM6LmM9KSxcCi0JICAgZWNobyAiICAgICAtIFxzdWJwYWdlIGV4YW1wbGVfJChleCkgJCgkKGV4KS5ERVNDUklQVElPTikiID4+ICRAOykKLQlAZWNobyAiKi8iID4+ICRACi0KLUNMRUFOLU9CSlMgKz0gZXhhbXBsZXMuZG94eSBzYW1wbGVzLmRveCAkKEFMTF9FWEFNUExFUzouYz0uZG94KQotRE9DUy15ZXMgKz0gZXhhbXBsZXMuZG94eSBzYW1wbGVzLmRveCAkKEFMTF9FWEFNUExFUzouYz0uZG94KQotZXhhbXBsZXMuZG94eTogc2FtcGxlcy5kb3ggJChBTExfRVhBTVBMRVM6LmM9LmRveCkKLQlAZWNobyAiSU5QVVQgKz0gJF4iID4gJEAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY29kZV90b19tZDUudHh0IGIvZXhhbXBsZXMvZGVjb2RlX3RvX21kNS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZGQ1NjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvZGVjb2RlX3RvX21kNS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1AVEVNUExBVEUgZGVjb2Rlcl90bXBsLmMKLUZyYW1lLWJ5LWZyYW1lIE1ENSBDaGVja3N1bQotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBJTlRST0RVQ1RJT04KLVRoaXMgZXhhbXBsZSBidWlsZHMgdXBvbiB0aGUgc2ltcGxlIGRlY29kZXIgbG9vcCB0byBzaG93IGhvdyBjaGVja3N1bXMKLW9mIHRoZSBkZWNvZGVkIG91dHB1dCBjYW4gYmUgZ2VuZXJhdGVkLiBUaGVzZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGluZwotZGVjb2RlciBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCBmb3IgZXhhbXBsZS4KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IElOVFJPRFVDVElPTgotCi1NRDUgYWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tCi1UaGUgTWVzc2FnZS1EaWdlc3QgNSAoTUQ1KSBpcyBhIHdlbGwga25vd24gaGFzaCBmdW5jdGlvbi4gV2UgaGF2ZSBwcm92aWRlZAotYW4gaW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKLUFsZ29yaXRobSBmb3IgeW91ciB1c2UuIE91ciBpbXBsbWVudGF0aW9uIG9ubHkgY2hhbmdlcyB0aGUgaW50ZXJmYWNlIG9mIHRoaXMKLXJlZmVyZW5jZSBjb2RlLiBZb3UgbXVzdCBpbmNsdWRlIHRoZSBgbWQ1X3V0aWxzLmhgIGhlYWRlciBmb3IgYWNjZXNzIHRvIHRoZXNlCi1mdW5jdGlvbnMuCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFWFRSQV9JTkNMVURFUwotI2luY2x1ZGUgIm1kNV91dGlscy5oIgotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRVhUUkFfSU5DTFVERVMKLQotCi1Qcm9jZXNzaW5nIFRoZSBEZWNvZGVkIERhdGEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRWFjaCByb3cgb2YgdGhlIGltYWdlIGlzIHBhc3NlZCB0byB0aGUgTUQ1IGFjY3VtdWxhdG9yLiBGaXJzdCB0aGUgWSBwbGFuZQotaXMgcHJvY2Vzc2VkLCB0aGVuIFUsIHRoZW4gVi4gSXQgaXMgaW1wb3J0YW50IHRvIGhvbm9yIHRoZSBpbWFnZSdzIGBzdHJpZGVgCi12YWx1ZXMuCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBST0NFU1NfRFgKLXVuc2lnbmVkIGNoYXIgIG1kNV9zdW1bMTZdOwotTUQ1Q29udGV4dCAgICAgbWQ1OwotaW50ICAgICAgICAgICAgaTsKLQotTUQ1SW5pdCgmbWQ1KTsKLQotZm9yKHBsYW5lPTA7IHBsYW5lIDwgMzsgcGxhbmUrKykgewotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiA9aW1nLT5wbGFuZXNbcGxhbmVdOwotCi0gICAgZm9yKHk9MDsgeTxpbWctPmRfaCA+PiAocGxhbmU/MTowKTsgeSsrKSB7Ci0gICAgICAgIE1ENVVwZGF0ZSgmbWQ1LCBidWYsIGltZy0+ZF93ID4+IChwbGFuZT8xOjApKTsKLSAgICAgICAgYnVmICs9IGltZy0+c3RyaWRlW3BsYW5lXTsKLSAgICB9Ci19Ci0KLU1ENUZpbmFsKG1kNV9zdW0sICZtZDUpOwotZm9yKGk9MDsgaTwxNjsgaSsrKQotICAgIGZwcmludGYob3V0ZmlsZSwgIiUwMngiLG1kNV9zdW1baV0pOwotZnByaW50ZihvdXRmaWxlLCAiICBpbWctJWR4JWQtJTA0ZC5pNDIwXG4iLCBpbWctPmRfdywgaW1nLT5kX2gsCi0gICAgICAgIGZyYW1lX2NudCk7Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBST0NFU1NfRFgKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY29kZXJfdG1wbC5jIGIvZXhhbXBsZXMvZGVjb2Rlcl90bXBsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDY4MWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvZGVjb2Rlcl90bXBsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qCi1AKklOVFJPRFVDVElPTgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUIDEKLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKLSNkZWZpbmUgaW50ZXJmYWNlICh2cHhfY29kZWNfdnA4X2R4KCkpCi1ARVhUUkFfSU5DTFVERVMKLQotCi0jZGVmaW5lIElWRl9GSUxFX0hEUl9TWiAgKDMyKQotI2RlZmluZSBJVkZfRlJBTUVfSERSX1NaICgxMikKLQotc3RhdGljIHVuc2lnbmVkIGludCBtZW1fZ2V0X2xlMzIoY29uc3QgdW5zaWduZWQgY2hhciAqbWVtKSB7Ci0gICAgcmV0dXJuIChtZW1bM10gPDwgMjQpfChtZW1bMl0gPDwgMTYpfChtZW1bMV0gPDwgOCl8KG1lbVswXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICpmbXQsIC4uLikgewotICAgIHZhX2xpc3QgYXA7Ci0KLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICB2cHJpbnRmKGZtdCwgYXApOwotICAgIGlmKGZtdFtzdHJsZW4oZm10KS0xXSAhPSAnXG4nKQotICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi1ARElFX0NPREVDCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICAgIEZJTEUgICAgICAgICAgICAqaW5maWxlLCAqb3V0ZmlsZTsKLSAgICB2cHhfY29kZWNfY3R4X3QgIGNvZGVjOwotICAgIGludCAgICAgICAgICAgICAgZmxhZ3MgPSAwLCBmcmFtZV9jbnQgPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgICAgZmlsZV9oZHJbSVZGX0ZJTEVfSERSX1NaXTsKLSAgICB1bnNpZ25lZCBjaGFyICAgIGZyYW1lX2hkcltJVkZfRlJBTUVfSERSX1NaXTsKLSAgICB1bnNpZ25lZCBjaGFyICAgIGZyYW1lWzI1NioxMDI0XTsKLSAgICB2cHhfY29kZWNfZXJyX3QgIHJlczsKLUBAQEBFWFRSQV9WQVJTCi0KLSAgICAodm9pZClyZXM7Ci0gICAgLyogT3BlbiBmaWxlcyAqLwotQEBAQFVTQUdFCi0gICAgaWYoIShpbmZpbGUgPSBmb3Blbihhcmd2WzFdLCAicmIiKSkpCi0gICAgICAgIGRpZSgiRmFpbGVkIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciLCBhcmd2WzFdKTsKLSAgICBpZighKG91dGZpbGUgPSBmb3Blbihhcmd2WzJdLCAid2IiKSkpCi0gICAgICAgIGRpZSgiRmFpbGVkIHRvIG9wZW4gJXMgZm9yIHdyaXRpbmciLCBhcmd2WzJdKTsKLQotICAgIC8qIFJlYWQgZmlsZSBoZWFkZXIgKi8KLSAgICBpZighKGZyZWFkKGZpbGVfaGRyLCAxLCBJVkZfRklMRV9IRFJfU1osIGluZmlsZSkgPT0gSVZGX0ZJTEVfSERSX1NaCi0gICAgICAgICAmJiBmaWxlX2hkclswXT09J0QnICYmIGZpbGVfaGRyWzFdPT0nSycgJiYgZmlsZV9oZHJbMl09PSdJJwotICAgICAgICAgJiYgZmlsZV9oZHJbM109PSdGJykpCi0gICAgICAgIGRpZSgiJXMgaXMgbm90IGFuIElWRiBmaWxlLiIsIGFyZ3ZbMV0pOwotCi0gICAgcHJpbnRmKCJVc2luZyAlc1xuIix2cHhfY29kZWNfaWZhY2VfbmFtZShpbnRlcmZhY2UpKTsKLUBAQEBERUNfSU5JVAotCi0gICAgLyogUmVhZCBlYWNoIGZyYW1lICovCi0gICAgd2hpbGUoZnJlYWQoZnJhbWVfaGRyLCAxLCBJVkZfRlJBTUVfSERSX1NaLCBpbmZpbGUpID09IElWRl9GUkFNRV9IRFJfU1opIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgZnJhbWVfc3ogPSBtZW1fZ2V0X2xlMzIoZnJhbWVfaGRyKTsKLSAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgaXRlciA9IE5VTEw7Ci0gICAgICAgIHZweF9pbWFnZV90ICAgICAgKmltZzsKLQotCi0gICAgICAgIGZyYW1lX2NudCsrOwotICAgICAgICBpZihmcmFtZV9zeiA+IHNpemVvZihmcmFtZSkpCi0gICAgICAgICAgICBkaWUoIkZyYW1lICVkIGRhdGEgdG9vIGJpZyBmb3IgZXhhbXBsZSBjb2RlIGJ1ZmZlciIsIGZyYW1lX3N6KTsKLSAgICAgICAgaWYoZnJlYWQoZnJhbWUsIDEsIGZyYW1lX3N6LCBpbmZpbGUpICE9IGZyYW1lX3N6KQotICAgICAgICAgICAgZGllKCJGcmFtZSAlZCBmYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmcmFtZSIsIGZyYW1lX2NudCk7Ci0KLUBAQEBAQEBAUFJFX0RFQ09ERQotQEBAQEBAQEBERUNPREUKLQotICAgICAgICAvKiBXcml0ZSBkZWNvZGVkIGRhdGEgdG8gZGlzayAqLwotQEBAQEBAQEBHRVRfRlJBTUUKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBwbGFuZSwgeTsKLQotQEBAQEBAQEBAQEBAUFJPQ0VTU19EWAotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiUHJvY2Vzc2VkICVkIGZyYW1lcy5cbiIsZnJhbWVfY250KTsKLUBAQEBERVNUUk9ZCi0KLSAgICBmY2xvc2Uob3V0ZmlsZSk7Ci0gICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY29kZXJfdG1wbC50eHQgYi9leGFtcGxlcy9kZWNvZGVyX3RtcGwudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQwNWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL2RlY29kZXJfdG1wbC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERUNfSU5DTFVERVMKLSNkZWZpbmUgVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUIDEKLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKLSNkZWZpbmUgaW50ZXJmYWNlICh2cHhfY29kZWNfdnA4X2R4KCkpCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERUNfSU5DTFVERVMKLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERJRV9DT0RFQwotc3RhdGljIHZvaWQgZGllX2NvZGVjKHZweF9jb2RlY19jdHhfdCAqY3R4LCBjb25zdCBjaGFyICpzKSB7Ci0gICAgY29uc3QgY2hhciAqZGV0YWlsID0gdnB4X2NvZGVjX2Vycm9yX2RldGFpbChjdHgpOwotCi0gICAgcHJpbnRmKCIlczogJXNcbiIsIHMsIHZweF9jb2RlY19lcnJvcihjdHgpKTsKLSAgICBpZihkZXRhaWwpCi0gICAgICAgIHByaW50ZigiICAgICVzXG4iLGRldGFpbCk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBESUVfQ09ERUMKLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFVTQUdFCi1pZihhcmdjIT0zKQotICAgIGRpZSgiVXNhZ2U6ICVzIDxpbmZpbGU+IDxvdXRmaWxlPlxuIiwgYXJndlswXSk7Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFVTQUdFCi0KLQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERUNfSU5JVAotLyogSW5pdGlhbGl6ZSBjb2RlYyAqLwotaWYodnB4X2NvZGVjX2RlY19pbml0KCZjb2RlYywgaW50ZXJmYWNlLCBOVUxMLCBmbGFncykpCi0gICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDX0lOSVQKLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ09ERQotLyogRGVjb2RlIHRoZSBmcmFtZSAqLwotaWYodnB4X2NvZGVjX2RlY29kZSgmY29kZWMsIGZyYW1lLCBmcmFtZV9zeiwgTlVMTCwgMCkpCi0gICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBkZWNvZGUgZnJhbWUiKTsKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDT0RFCi0KLQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBHRVRfRlJBTUUKLXdoaWxlKChpbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCZjb2RlYywgJml0ZXIpKSkgewotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBHRVRfRlJBTUUKLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBST0NFU1NfRFgKLWZvcihwbGFuZT0wOyBwbGFuZSA8IDM7IHBsYW5lKyspIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWYgPWltZy0+cGxhbmVzW3BsYW5lXTsKLQotICAgIGZvcih5PTA7IHk8aW1nLT5kX2ggPj4gKHBsYW5lPzE6MCk7IHkrKykgewotICAgICAgICBpZihmd3JpdGUoYnVmLCAxLCBpbWctPmRfdyA+PiAocGxhbmU/MTowKSwgb3V0ZmlsZSkpOwotICAgICAgICBidWYgKz0gaW1nLT5zdHJpZGVbcGxhbmVdOwotICAgIH0KLX0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUFJPQ0VTU19EWAotCi0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVTVFJPWQotaWYodnB4X2NvZGVjX2Rlc3Ryb3koJmNvZGVjKSkKLSAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGRlc3Ryb3kgY29kZWMiKTsKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVTVFJPWQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW5jb2Rlcl90bXBsLmMgYi9leGFtcGxlcy9lbmNvZGVyX3RtcGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwOWU2Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9lbmNvZGVyX3RtcGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyoKLUAqSU5UUk9EVUNUSU9OCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgMQotI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgotI2luY2x1ZGUgInZweC92cDhjeC5oIgotI2RlZmluZSBpbnRlcmZhY2UgKHZweF9jb2RlY192cDhfY3goKSkKLSNkZWZpbmUgZm91cmNjICAgIDB4MzAzODUwNTYKLUBFWFRSQV9JTkNMVURFUwotCi0jZGVmaW5lIElWRl9GSUxFX0hEUl9TWiAgKDMyKQotI2RlZmluZSBJVkZfRlJBTUVfSERSX1NaICgxMikKLQotc3RhdGljIHZvaWQgbWVtX3B1dF9sZTE2KGNoYXIgKm1lbSwgdW5zaWduZWQgaW50IHZhbCkgewotICAgIG1lbVswXSA9IHZhbDsKLSAgICBtZW1bMV0gPSB2YWw+Pjg7Ci19Ci0KLXN0YXRpYyB2b2lkIG1lbV9wdXRfbGUzMihjaGFyICptZW0sIHVuc2lnbmVkIGludCB2YWwpIHsKLSAgICBtZW1bMF0gPSB2YWw7Ci0gICAgbWVtWzFdID0gdmFsPj44OwotICAgIG1lbVsyXSA9IHZhbD4+MTY7Ci0gICAgbWVtWzNdID0gdmFsPj4yNDsKLX0KLQotc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7Ci0gICAgdmFfbGlzdCBhcDsKLQotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZwcmludGYoZm10LCBhcCk7Ci0gICAgaWYoZm10W3N0cmxlbihmbXQpLTFdICE9ICdcbicpCi0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLUBESUVfQ09ERUMKLQotc3RhdGljIGludCByZWFkX2ZyYW1lKEZJTEUgKmYsIHZweF9pbWFnZV90ICppbWcpIHsKLSAgICBzaXplX3QgbmJ5dGVzLCB0b19yZWFkOwotICAgIGludCAgICByZXMgPSAxOwotCi0gICAgdG9fcmVhZCA9IGltZy0+dyppbWctPmgqMy8yOwotICAgIG5ieXRlcyA9IGZyZWFkKGltZy0+cGxhbmVzWzBdLCAxLCB0b19yZWFkLCBmKTsKLSAgICBpZihuYnl0ZXMgIT0gdG9fcmVhZCkgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBpZihuYnl0ZXMgPiAwKQotICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiBSZWFkIHBhcnRpYWwgZnJhbWUuIENoZWNrIHlvdXIgd2lkdGggJiBoZWlnaHQhXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfaXZmX2ZpbGVfaGVhZGVyKEZJTEUgKm91dGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2VuY19jZmdfdCAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9jbnQpIHsKLSAgICBjaGFyIGhlYWRlclszMl07Ci0KLSAgICBpZihjZmctPmdfcGFzcyAhPSBWUFhfUkNfT05FX1BBU1MgJiYgY2ZnLT5nX3Bhc3MgIT0gVlBYX1JDX0xBU1RfUEFTUykKLSAgICAgICAgcmV0dXJuOwotICAgIGhlYWRlclswXSA9ICdEJzsKLSAgICBoZWFkZXJbMV0gPSAnSyc7Ci0gICAgaGVhZGVyWzJdID0gJ0knOwotICAgIGhlYWRlclszXSA9ICdGJzsKLSAgICBtZW1fcHV0X2xlMTYoaGVhZGVyKzQsICAwKTsgICAgICAgICAgICAgICAgICAgLyogdmVyc2lvbiAqLwotICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrNiwgIDMyKTsgICAgICAgICAgICAgICAgICAvKiBoZWFkZXJzaXplICovCi0gICAgbWVtX3B1dF9sZTMyKGhlYWRlcis4LCAgZm91cmNjKTsgICAgICAgICAgICAgIC8qIGhlYWRlcnNpemUgKi8KLSAgICBtZW1fcHV0X2xlMTYoaGVhZGVyKzEyLCBjZmctPmdfdyk7ICAgICAgICAgICAgLyogd2lkdGggKi8KLSAgICBtZW1fcHV0X2xlMTYoaGVhZGVyKzE0LCBjZmctPmdfaCk7ICAgICAgICAgICAgLyogaGVpZ2h0ICovCi0gICAgbWVtX3B1dF9sZTMyKGhlYWRlcisxNiwgY2ZnLT5nX3RpbWViYXNlLmRlbik7IC8qIHJhdGUgKi8KLSAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzIwLCBjZmctPmdfdGltZWJhc2UubnVtKTsgLyogc2NhbGUgKi8KLSAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzI0LCBmcmFtZV9jbnQpOyAgICAgICAgICAgLyogbGVuZ3RoICovCi0gICAgbWVtX3B1dF9sZTMyKGhlYWRlcisyOCwgMCk7ICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotCi0gICAgaWYoZndyaXRlKGhlYWRlciwgMSwgMzIsIG91dGZpbGUpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCB3cml0ZV9pdmZfZnJhbWVfaGVhZGVyKEZJTEUgKm91dGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0KQotewotICAgIGNoYXIgICAgICAgICAgICAgaGVhZGVyWzEyXTsKLSAgICB2cHhfY29kZWNfcHRzX3QgIHB0czsKLQotICAgIGlmKHBrdC0+a2luZCAhPSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUKQotICAgICAgICByZXR1cm47Ci0KLSAgICBwdHMgPSBwa3QtPmRhdGEuZnJhbWUucHRzOwotICAgIG1lbV9wdXRfbGUzMihoZWFkZXIsIHBrdC0+ZGF0YS5mcmFtZS5zeik7Ci0gICAgbWVtX3B1dF9sZTMyKGhlYWRlcis0LCBwdHMmMHhGRkZGRkZGRik7Ci0gICAgbWVtX3B1dF9sZTMyKGhlYWRlcis4LCBwdHMgPj4gMzIpOwotCi0gICAgaWYoZndyaXRlKGhlYWRlciwgMSwgMTIsIG91dGZpbGUpKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgRklMRSAgICAgICAgICAgICAgICAqaW5maWxlLCAqb3V0ZmlsZTsKLSAgICB2cHhfY29kZWNfY3R4X3QgICAgICBjb2RlYzsKLSAgICB2cHhfY29kZWNfZW5jX2NmZ190ICBjZmc7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgZnJhbWVfY250ID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICAgICAgICBmaWxlX2hkcltJVkZfRklMRV9IRFJfU1pdOwotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgIGZyYW1lX2hkcltJVkZfRlJBTUVfSERSX1NaXTsKLSAgICB2cHhfaW1hZ2VfdCAgICAgICAgICByYXc7Ci0gICAgdnB4X2NvZGVjX2Vycl90ICAgICAgcmVzOwotICAgIGxvbmcgICAgICAgICAgICAgICAgIHdpZHRoOwotICAgIGxvbmcgICAgICAgICAgICAgICAgIGhlaWdodDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9hdmFpbDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBnb3RfZGF0YTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBmbGFncyA9IDA7Ci1AQEBAVFdPUEFTU19WQVJTCi0KLSAgICAvKiBPcGVuIGZpbGVzICovCi1AQEBAVVNBR0UKLSAgICB3aWR0aCA9IHN0cnRvbChhcmd2WzFdLCBOVUxMLCAwKTsKLSAgICBoZWlnaHQgPSBzdHJ0b2woYXJndlsyXSwgTlVMTCwgMCk7Ci0gICAgaWYod2lkdGggPCAxNiB8fCB3aWR0aCUyIHx8IGhlaWdodCA8MTYgfHwgaGVpZ2h0JTIpCi0gICAgICAgIGRpZSgiSW52YWxpZCByZXNvbHV0aW9uOiAlbGR4JWxkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYoIXZweF9pbWdfYWxsb2MoJnJhdywgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwgMSkpCi0gICAgICAgIGRpZSgiRmFpbGUgdG8gYWxsb2NhdGUgaW1hZ2UiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZighKG91dGZpbGUgPSBmb3Blbihhcmd2WzRdLCAid2IiKSkpCi0gICAgICAgIGRpZSgiRmFpbGVkIHRvIG9wZW4gJXMgZm9yIHdyaXRpbmciLCBhcmd2WzRdKTsKLQotICAgIHByaW50ZigiVXNpbmcgJXNcbiIsdnB4X2NvZGVjX2lmYWNlX25hbWUoaW50ZXJmYWNlKSk7Ci0KLUBAQEBFTkNfREVGX0NGRwotCi1AQEBARU5DX1NFVF9DRkcKLUBAQEBFTkNfU0VUX0NGRzIKLQotICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihvdXRmaWxlLCAmY2ZnLCAwKTsKLQotQEBAQFRXT1BBU1NfTE9PUF9CRUdJTgotCi0gICAgICAgIC8qIE9wZW4gaW5wdXQgZmlsZSBmb3IgdGhpcyBlbmNvZGluZyBwYXNzICovCi0gICAgICAgIGlmKCEoaW5maWxlID0gZm9wZW4oYXJndlszXSwgInJiIikpKQotICAgICAgICAgICAgZGllKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIsIGFyZ3ZbM10pOwotCi1AQEBAQEBAQEVOQ19JTklUCi0KLSAgICAgICAgZnJhbWVfYXZhaWwgPSAxOwotICAgICAgICBnb3RfZGF0YSA9IDA7Ci0gICAgICAgIHdoaWxlKGZyYW1lX2F2YWlsIHx8IGdvdF9kYXRhKSB7Ci0gICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOwotICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3Q7Ci0KLUBAQEBAQEBAQEBAQFBFUl9GUkFNRV9DRkcKLUBAQEBAQEBAQEBAQEVOQ09ERV9GUkFNRQotICAgICAgICAgICAgZ290X2RhdGEgPSAwOwotICAgICAgICAgICAgd2hpbGUoIChwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJmNvZGVjLCAmaXRlcikpICkgewotICAgICAgICAgICAgICAgIGdvdF9kYXRhID0gMTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gocGt0LT5raW5kKSB7Ci1AQEBAQEBAQEBAQEBAQEBAUFJPQ0VTU19GUkFNRQotQEBAQEBAQEBAQEBAQEBAQFBST0NFU1NfU1RBVFMKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpbnRmKHBrdC0+a2luZCA9PSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUCi0gICAgICAgICAgICAgICAgICAgICAgICYmIChwa3QtPmRhdGEuZnJhbWUuZmxhZ3MgJiBWUFhfRlJBTUVfSVNfS0VZKT8gIksiOiIuIik7Ci0gICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZV9jbnQrKzsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotQEBAQFRXT1BBU1NfTE9PUF9FTkQKLQotICAgIHByaW50ZigiUHJvY2Vzc2VkICVkIGZyYW1lcy5cbiIsZnJhbWVfY250LTEpOwotQEBAQERFU1RST1kKLQotICAgIC8qIFRyeSB0byByZXdyaXRlIHRoZSBmaWxlIGhlYWRlciB3aXRoIHRoZSBhY3R1YWwgZnJhbWUgY291bnQgKi8KLSAgICBpZighZnNlZWsob3V0ZmlsZSwgMCwgU0VFS19TRVQpKQotICAgICAgICB3cml0ZV9pdmZfZmlsZV9oZWFkZXIob3V0ZmlsZSwgJmNmZywgZnJhbWVfY250LTEpOwotICAgIGZjbG9zZShvdXRmaWxlKTsKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW5jb2Rlcl90bXBsLnR4dCBiL2V4YW1wbGVzL2VuY29kZXJfdG1wbC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDIwNzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvZW5jb2Rlcl90bXBsLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19JTkNMVURFUwotI2RlZmluZSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgMQotI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgotI2luY2x1ZGUgInZweC92cDhjeC5oIgotI2RlZmluZSBpbnRlcmZhY2UgKHZweF9jb2RlY192cDhfY3goKSkKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19JTkNMVURFUwotCi0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRElFX0NPREVDCi1zdGF0aWMgdm9pZCBkaWVfY29kZWModnB4X2NvZGVjX2N0eF90ICpjdHgsIGNvbnN0IGNoYXIgKnMpIHsKLSAgICBjb25zdCBjaGFyICpkZXRhaWwgPSB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKGN0eCk7Ci0KLSAgICBwcmludGYoIiVzOiAlc1xuIiwgcywgdnB4X2NvZGVjX2Vycm9yKGN0eCkpOwotICAgIGlmKGRldGFpbCkKLSAgICAgICAgcHJpbnRmKCIgICAgJXNcbiIsZGV0YWlsKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERJRV9DT0RFQwotCi0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVVNBR0UKLWlmKGFyZ2MhPTUpCi0gICAgZGllKCJVc2FnZTogJXMgPHdpZHRoPiA8aGVpZ2h0PiA8aW5maWxlPiA8b3V0ZmlsZT5cbiIsIGFyZ3ZbMF0pOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBVU0FHRQotCi0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRU5DX0RFRl9DRkcKLS8qIFBvcHVsYXRlIGVuY29kZXIgY29uZmlndXJhdGlvbiAqLwotcmVzID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChpbnRlcmZhY2UsICZjZmcsIDApOwotaWYocmVzKSB7Ci0gICAgcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IGNvbmZpZzogJXNcbiIsIHZweF9jb2RlY19lcnJfdG9fc3RyaW5nKHJlcykpOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci19Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19ERUZfQ0ZHCi0KLQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfU0VUX0NGRwotLyogVXBkYXRlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCBvdXIgc2V0dGluZ3MgKi8KLWNmZy5yY190YXJnZXRfYml0cmF0ZSA9IHdpZHRoICogaGVpZ2h0ICogY2ZnLnJjX3RhcmdldF9iaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAvIGNmZy5nX3cgLyBjZmcuZ19oOwotY2ZnLmdfdyA9IHdpZHRoOwotY2ZnLmdfaCA9IGhlaWdodDsKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRU5DX1NFVF9DRkcKLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19JTklUCi0vKiBJbml0aWFsaXplIGNvZGVjICovCi1pZih2cHhfY29kZWNfZW5jX2luaXQoJmNvZGVjLCBpbnRlcmZhY2UsICZjZmcsIDApKQotICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19JTklUCi0KLQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNPREVfRlJBTUUKLWZyYW1lX2F2YWlsID0gcmVhZF9mcmFtZShpbmZpbGUsICZyYXcpOwotaWYodnB4X2NvZGVjX2VuY29kZSgmY29kZWMsIGZyYW1lX2F2YWlsPyAmcmF3IDogTlVMTCwgZnJhbWVfY250LAotICAgICAgICAgICAgICAgICAgICAxLCBmbGFncywgVlBYX0RMX1JFQUxUSU1FKSkKLSAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNPREVfRlJBTUUKLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBST0NFU1NfRlJBTUUKLWNhc2UgVlBYX0NPREVDX0NYX0ZSQU1FX1BLVDoKLSAgICB3cml0ZV9pdmZfZnJhbWVfaGVhZGVyKG91dGZpbGUsIHBrdCk7Ci0gICAgaWYoZndyaXRlKHBrdC0+ZGF0YS5mcmFtZS5idWYsIDEsIHBrdC0+ZGF0YS5mcmFtZS5zeiwKLSAgICAgICAgICAgICAgb3V0ZmlsZSkpOwotICAgIGJyZWFrOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUk9DRVNTX0ZSQU1FCi0KLQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERVNUUk9ZCi1pZih2cHhfY29kZWNfZGVzdHJveSgmY29kZWMpKQotICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gZGVzdHJveSBjb2RlYyIpOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERVNUUk9ZCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wb3N0cHJvYy50eHQgYi9leGFtcGxlcy9wb3N0cHJvYy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NWRkZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvcG9zdHByb2MudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotQFRFTVBMQVRFIGRlY29kZXJfdG1wbC5jCi1Qb3N0cHJvY2Vzc2luZyBEZWNvZGVyCi09PT09PT09PT09PT09PT09PT09PT09Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBJTlRST0RVQ1RJT04KLVRoaXMgZXhhbXBsZSBhZGRzIHBvc3Rwcm9jZXNzaW5nIHRvIHRoZSBzaW1wbGUgZGVjb2RlciBsb29wLgotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gSU5UUk9EVUNUSU9OCi0KLQotSW5pdGlhbGl6aW5nIFBvc3Rwcm9jZXNzaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVlvdSBtdXN0IGluZm9ybSB0aGUgY29kZWMgdGhhdCB5b3UgbWlnaHQgcmVxdWVzdCBwb3N0cHJvY2Vzc2luZyBhdAotaW5pdGlhbGl6YXRpb24gdGltZS4gVGhpcyBpcyBkb25lIGJ5IHBhc3NpbmcgdGhlIFZQWF9DT0RFQ19VU0VfUE9TVFBST0MKLWZsYWcgdG8gYHZweF9jb2RlY19kZWNfaW5pdGAuIElmIHRoZSBjb2RlYyBkb2VzIG5vdCBzdXBwb3J0Ci1wb3N0cHJvY2Vzc2luZywgdGhpcyBjYWxsIHdpbGwgcmV0dXJuIFZQWF9DT0RFQ19JTkNBUEFCTEUuIEZvcgotZGVtb25zdHJhdGlvbiBwdXJwb3Nlcywgd2UgYWxzbyBmYWxsIGJhY2sgdG8gZGVmYXVsdCBpbml0aWFsaXphdGlvbiBpZgotdGhlIGNvZGVjIGRvZXMgbm90IHByb3ZpZGUgc3VwcG9ydC4KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDX0lOSVQKLS8qIEluaXRpYWxpemUgY29kZWMgKi8KLXJlcyA9IHZweF9jb2RlY19kZWNfaW5pdCgmY29kZWMsIGludGVyZmFjZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfQ09ERUNfVVNFX1BPU1RQUk9DKTsKLWlmKHJlcyA9PSBWUFhfQ09ERUNfSU5DQVBBQkxFKSB7Ci0gICAgcHJpbnRmKCJOT1RJQ0U6IFBvc3Rwcm9jIG5vdCBzdXBwb3J0ZWQgYnkgJXNcbiIsCi0gICAgICAgICAgIHZweF9jb2RlY19pZmFjZV9uYW1lKGludGVyZmFjZSkpOwotICAgIHJlcyA9IHZweF9jb2RlY19kZWNfaW5pdCgmY29kZWMsIGludGVyZmFjZSwgTlVMTCwgMCk7Ci19Ci1pZihyZXMpCi0gICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDX0lOSVQKLQotCi1Vc2luZyBBZGFwdGl2ZSBQb3N0cHJvY2Vzc2luZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVZQNiBwcm92aWRlcyAiYWRhcHRpdmUgcG9zdHByb2Nlc3NpbmcuIiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZQotYmVzdCBwb3N0cHJvY2Vzc2luZyBmaWx0ZXIgb24gYSBmcmFtZSBieSBmcmFtZSBiYXNpcyBiYXNlZCBvbiB0aGUgYW1vdW50Ci1vZiB0aW1lIHJlbWFpbmluZyBiZWZvcmUgdGhlIHVzZXIncyBzcGVjaWZpZWQgZGVhZGxpbmUgZXhwaXJlcy4gVGhlCi1zcGVjaWFsIHZhbHVlIDAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvZGVjIHNob3VsZCB0YWtlIGFzIGxvbmcgYXMKLW5lY2Vzc2FyeSB0byBwcm92aWRlIHRoZSBiZXN0IHF1YWxpdHkgZnJhbWUuIFRoaXMgZXhhbXBsZSBnaXZlcyB0aGUKLWNvZGVjIDE1bXMgKDE1MDAwdXMpIHRvIHJldHVybiBhIGZyYW1lLiBSZW1lbWJlciB0aGF0IHRoaXMgaXMgYSBzb2Z0Ci1kZWFkbGluZSwgYW5kIHRoZSBjb2RlYyBtYXkgZXhjZWVkIGl0IGRvaW5nIGl0cyByZWd1bGFyIHByb2Nlc3NpbmcuIEluCi10aGVzZSBjYXNlcywgbm8gYWRkaXRpb25hbCBwb3N0cHJvY2Vzc2luZyB3aWxsIGJlIGRvbmUuCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ09ERQotLyogRGVjb2RlIHRoZSBmcmFtZSB3aXRoIDE1bXMgZGVhZGxpbmUgKi8KLWlmKHZweF9jb2RlY19kZWNvZGUoJmNvZGVjLCBmcmFtZSwgZnJhbWVfc3osIE5VTEwsIDE1MDAwKSkKLSAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGRlY29kZSBmcmFtZSIpOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERUNPREUKLQotCi1Db2RlYyBTcGVjaWZpYyBQb3N0cHJvY2Vzc2luZyBDb250cm9scwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvbWUgY29kZWNzIHByb3ZpZGUgZmluZSBncmFpbmVkIGNvbnRyb2xzIG92ZXIgdGhlaXIgYnVpbHQtaW4KLXBvc3Rwcm9jZXNzb3JzLiBWUDggaXMgb25lIGV4YW1wbGUuIFRoZSBmb2xsb3dpbmcgc2FtcGxlIGNvZGUgdG9nZ2xlcwotcG9zdHByb2Nlc3Npbmcgb24gYW5kIG9mZiBldmVyeSAxNSBmcmFtZXMuCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBSRV9ERUNPREUKLSNpZiBDT05GSUdfVlA4X0RFQ09ERVIKLWlmKGZyYW1lX2NudCUzMCA9PSAxKSB7Ci0gICAgdnA4X3Bvc3Rwcm9jX2NmZ190ICBwcCA9IHswLCAwLCAwfTsKLQotICAgIGlmKHZweF9jb2RlY19jb250cm9sKCZjb2RlYywgVlA4X1NFVF9QT1NUUFJPQywgJnBwKSkKLSAgICAgICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byB0dXJuIG9mZiBwb3N0cHJvYyIpOwotfSBlbHNlIGlmKGZyYW1lX2NudCUzMCA9PSAxNikgewotICAgIHZwOF9wb3N0cHJvY19jZmdfdCAgcHAgPSB7VlA4X0RFQkxPQ0sgfCBWUDhfREVNQUNST0JMT0NLLCA0LCAwfTsKLQotICAgIGlmKHZweF9jb2RlY19jb250cm9sKCZjb2RlYywgVlA4X1NFVF9QT1NUUFJPQywgJnBwKSkKLSAgICAgICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byB0dXJuIG9uIHBvc3Rwcm9jIik7Ci19OwotI2VuZGlmCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBSRV9ERUNPREUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3R3b3Bhc3NfZW5jb2Rlci50eHQgYi9leGFtcGxlcy90d29wYXNzX2VuY29kZXIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjgzYmM3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL3R3b3Bhc3NfZW5jb2Rlci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi1AVEVNUExBVEUgZW5jb2Rlcl90bXBsLmMKLVR3byBQYXNzIEVuY29kZXIKLT09PT09PT09PT09PT09PT0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IElOVFJPRFVDVElPTgotVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgdHdvIHBhc3MgZW5jb2RlciBsb29wLiBJdCB0YWtlcyBhbiBpbnB1dCBmaWxlIGluCi1ZVjEyIGZvcm1hdCwgcGFzc2VzIGl0IHRocm91Z2ggdGhlIGVuY29kZXIgdHdpY2UsIGFuZCB3cml0ZXMgdGhlIGNvbXByZXNzZWQKLWZyYW1lcyB0byBkaXNrIGluIElWRiBmb3JtYXQuIEl0IGJ1aWxkcyB1cG9uIHRoZSBzaW1wbGVfZW5jb2RlciBleGFtcGxlLgotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gSU5UUk9EVUNUSU9OCi0KLQotVHdvcGFzcyBWYXJpYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tCi1Ud29wYXNzIG1vZGUgbmVlZHMgdG8gdHJhY2sgdGhlIGN1cnJlbnQgcGFzcyBudW1iZXIgYW5kIHRoZSBidWZmZXIgb2YKLXN0YXRpc3RpY3MgcGFja2V0cy4KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfVkFSUwotaW50ICAgICAgICAgICAgICAgICAgcGFzczsKLXZweF9maXhlZF9idWZfdCAgICAgIHN0YXRzID0gezB9Owotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVFdPUEFTU19WQVJTCi0KLQotVXBkYXRpbmcgVGhlIENvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW4gdHdvIHBhc3MgbW9kZSwgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIHVwZGF0ZWQgb24gZWFjaCBwYXNzLiBUaGUKLXN0YXRpc3RpY3MgYnVmZmVyIGlzIHBhc3NlZCBvbiB0aGUgbGFzdCBwYXNzLgotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVFdPUEFTU19MT09QX0JFR0lOCi1mb3IocGFzcz0wOyBwYXNzPDI7IHBhc3MrKykgewotICAgIGZyYW1lX2NudCA9IDA7Ci0KLSAgICBpZihwYXNzID09IDApCi0gICAgICAgIGNmZy5nX3Bhc3MgPSBWUFhfUkNfRklSU1RfUEFTUzsKLSAgICBlbHNlIHsKLSAgICAgICAgY2ZnLmdfcGFzcyAgICAgICAgICAgICAgPSBWUFhfUkNfTEFTVF9QQVNTOwotICAgICAgICBjZmcucmNfdHdvcGFzc19zdGF0c19pbiA9IHN0YXRzOwotICAgIH0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfTE9PUF9CRUdJTgotCi0KLUVuY29kaW5nIEEgRnJhbWUKLS0tLS0tLS0tLS0tLS0tLS0KLUVuY29kaW5nIGEgZnJhbWUgaW4gdHdvIHBhc3MgbW9kZSBpcyBpZGVudGljYWwgdG8gdGhlIHNpbXBsZSBlbmNvZGVyCi1leGFtcGxlLCBleGNlcHQgdGhlIGRlYWRsaW5lIGlzIHNldCB0byBWUFhfRExfQkVTVF9RVUFMSVRZIHRvIGdldCB0aGUKLWJlc3QgcXVhbGl0eSBwb3NzaWJsZS4gVlBYX0RMX0dPT0RfUVVBTElUWSBjb3VsZCBhbHNvIGJlIHVzZWQuCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ09ERV9GUkFNRQotZnJhbWVfYXZhaWwgPSByZWFkX2ZyYW1lKGluZmlsZSwgJnJhdyk7Ci1pZih2cHhfY29kZWNfZW5jb2RlKCZjb2RlYywgZnJhbWVfYXZhaWw/ICZyYXcgOiBOVUxMLCBmcmFtZV9jbnQsCi0gICAgICAgICAgICAgICAgICAgIDEsIGZsYWdzLCBWUFhfRExfQkVTVF9RVUFMSVRZKSkKLSAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNPREVfRlJBTUUKLQotCi1Qcm9jZXNzaW5nIFN0YXRpc3RpY3MgUGFja2V0cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVhY2ggcGFja2V0IG9mIHR5cGUgYFZQWF9DT0RFQ19DWF9GUkFNRV9QS1RgIGNvbnRhaW5zIHRoZSBlbmNvZGVkIGRhdGEKLWZvciB0aGlzIGZyYW1lLiBXZSB3cml0ZSBhIElWRiBmcmFtZSBoZWFkZXIsIGZvbGxvd2VkIGJ5IHRoZSByYXcgZGF0YS4KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUk9DRVNTX1NUQVRTCi1jYXNlIFZQWF9DT0RFQ19TVEFUU19QS1Q6Ci0gICAgc3RhdHMuYnVmID0gcmVhbGxvYyhzdGF0cy5idWYsIHN0YXRzLnN6Ci0gICAgICAgICAgICAgICAgICAgICAgICArIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLnN6KTsKLSAgICBpZighc3RhdHMuYnVmKQotICAgICAgICBkaWUoIk1lbW9yeSByZWFsbG9jYXRpb24gZmFpbGVkLlxuIik7Ci0gICAgbWVtY3B5KChjaGFyKilzdGF0cy5idWYgKyBzdGF0cy5zeiwKLSAgICAgICAgICAgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuYnVmLAotICAgICAgICAgICBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeik7Ci0gICAgc3RhdHMuc3ogKz0gIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLnN6OwotICAgIGJyZWFrOwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBST0NFU1NfU1RBVFMKLQotCi1QYXNzIFByb2dyZXNzIFJlcG9ydGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUl0J3Mgc29tZXRpbWVzIGhlbHBmdWwgdG8gc2VlIHdoZW4gZWFjaCBwYXNzIGNvbXBsZXRlcy4KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfTE9PUF9FTkQKLSAgICBwcmludGYoIlBhc3MgJWQgY29tcGxldGUuXG4iLCBwYXNzKzEpOwotfQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVFdPUEFTU19MT09QX0VORApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdnA4X3NjYWxhYmxlX3BhdHRlcm5zLnR4dCBiL2V4YW1wbGVzL3ZwOF9zY2FsYWJsZV9wYXR0ZXJucy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDVkYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvdnA4X3NjYWxhYmxlX3BhdHRlcm5zLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi1AVEVNUExBVEUgZW5jb2Rlcl90bXBsLmMKLVZQOCBTY2FsYWJsZSBGcmFtZSBQYXR0ZXJucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBJTlRST0RVQ1RJT04KLVRoaXMgaXMgYW4gZXhhbXBsZSBkZW1vbnN0cmF0aW5nIGhvdyB0byBjb250cm9sIHRoZSBWUDggZW5jb2RlcidzCi1yZWZlcmVuY2UgZnJhbWUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgbWVjaGFuaXNtIGZvciB2aWRlbyBhcHBsaWNhdGlvbnMKLXRoYXQgYmVuZWZpdCBmcm9tIGEgc2NhbGFibGUgYml0c3RyZWFtLgotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gSU5UUk9EVUNUSU9OCi0KLQotQ29uZmlndXJhdGlvbgotLS0tLS0tLS0tLS0tLQotU2NhbGFibGUgZnJhbWUgcGF0dGVybnMgYXJlIG1vc3QgdXNlZnVsIGluIGFuIGVycm9yIHJlc2lsaWVudCBjb250ZXh0LAotc28gZXJyb3IgcmVzaWxpZW5jeSBtb2RlIGlzIGVuYWJsZWQsIGFzIGluIHRoZSBgZXJyb3JfcmVzaWxpZW50LmNgCi1leGFtcGxlLiBJbiBhZGRpdGlvbiwgd2Ugd2FudCB0byBkaXNhYmxlIGF1dG9tYXRpYyBrZXlmcmFtZSBzZWxlY3Rpb24sCi1zbyB3ZSBmb3JjZSBhbiBpbnRlcnZhbCBvZiAxMDAwIGZyYW1lcy4KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gIEVOQ19TRVRfQ0ZHMgotCi0vKiBFbmFibGUgZXJyb3IgcmVzaWxpZW50IG1vZGUgKi8KLWNmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IDE7Ci1jZmcuZ19sYWdfaW5fZnJhbWVzICAgPSAwOwotY2ZnLmtmX21vZGUgICAgICAgICAgID0gVlBYX0tGX0ZJWEVEOwotCi0vKiBEaXNhYmxlIGF1dG9tYXRpYyBrZXlmcmFtZSBwbGFjZW1lbnQgKi8KLWNmZy5rZl9taW5fZGlzdCA9IGNmZy5rZl9tYXhfZGlzdCA9IDEwMDA7Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfU0VUX0NGRzIKLQotVGhpcyBleGFtcGxlIHVzZXMgdGhlIGZvbGxvd2luZyBmcmFtZSBwYXR0ZXJuIChMLT5sYXN0X2ZyYW1lLAotRy0+Z29sZGVuX2ZyYW1lLCBBLT5hbHRfcmVmX2ZyYW1lKToKLQotKiAgRnJhbWUgIDAgIEludHJhLCB1c2Ugbm9uZSwgIHVwZGF0ZSBMJkcmQQotKiAgRnJhbWUgIDEgIEludGVyLCB1c2UgTEdBLCAgIHVwZGF0ZSBub25lCi0qICBGcmFtZSAgMiAgSW50ZXIsIHVzZSBMR0EsICAgdXBkYXRlIEwKLSogIEZyYW1lICAzICBJbnRlciwgdXNlIExHQSwgICB1cGRhdGUgbm9uZQotKiAgRnJhbWUgIDQgIEludGVyLCB1c2UgR0EsICAgIHVwZGF0ZSBMJkcKLSogIEZyYW1lICA1ICBJbnRlciwgdXNlIExHQSwgICB1cGRhdGUgbm9uZQotKiAgRnJhbWUgIDYgIEludGVyLCB1c2UgTEdBLCAgIHVwZGF0ZSBMCi0qICBGcmFtZSAgNyAgSW50ZXIsIHVzZSBMR0EsICAgdXBkYXRlIG5vbmUKLSogIEZyYW1lICA4ICBJbnRlciwgdXNlIEEsICAgICB1cGRhdGUgTCZHJkEKLSogIEZyYW1lICA5ICBJbnRlciwgdXNlIExHQSwgICB1cGRhdGUgbm9uZQotKiAgRnJhbWUgMTAgIEludGVyLCB1c2UgTEdBLCAgIHVwZGF0ZSBMCi0qICBGcmFtZSAxMSAgSW50ZXIsIHVzZSBMR0EsICAgdXBkYXRlIG5vbmUKLSogIEZyYW1lIDEyICBJbnRlciwgdXNlIEdBLCAgICB1cGRhdGUgTCZHCi0qICBGcmFtZSAxMyAgSW50ZXIsIHVzZSBMR0EsICAgdXBkYXRlIG5vbmUKLSogIEZyYW1lIDE0ICBJbnRlciwgdXNlIExHQSwgICB1cGRhdGUgTAotKiAgRnJhbWUgMTUgIEludGVyLCB1c2UgTEdBLCAgIHVwZGF0ZSBub25lCi0qICAuLi5SZXBlYXRzIHRoZSBwYXR0ZXJuIGZyb20gZnJhbWUgMAotCi1DaGFuZ2UgdGhpcyB2YXJpYWJsZSB0byB0ZXN0IHRoZSAzIGRlY29kYWJsZSBzdHJlYW1zIGNhc2UuCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUV09QQVNTX1ZBUlMKLWludCAgICAgICAgICAgICAgICAgIG51bV9zdHJlYW1zID0gNTsKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfVkFSUwotCi0KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUEVSX0ZSQU1FX0NGRwotZmxhZ3MgPSAwOwotaWYobnVtX3N0cmVhbXMgPT0gNSkKLXsKLSAgICBzd2l0Y2goZnJhbWVfY250ICUgMTYpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZmxhZ3MgfD0gVlBYX0VGTEFHX0ZPUkNFX0tGOwotICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX0ZPUkNFX0dGOwotICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX0ZPUkNFX0FSRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgY2FzZSA1OgotICAgICAgICBjYXNlIDc6Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7Ci0gICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0xBU1Q7Ci0gICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfRk9SQ0VfR0Y7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9MQVNUOwotICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19GT1JDRV9HRjsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19GT1JDRV9BUkY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfTEFTVDsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19GT1JDRV9HRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLWVsc2UKLXsKLSAgICBzd2l0Y2goZnJhbWVfY250ICUgOSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBpZihmcmFtZV9jbnQ9PTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlBYX0VGTEFHX0ZPUkNFX0tGOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNmZy5yY19tYXhfcXVhbnRpemVyID0gMjY7Ci0gICAgICAgICAgICAgICAgY2ZnLnJjX21pbl9xdWFudGl6ZXIgPSAwOwotICAgICAgICAgICAgICAgIGNmZy5yY190YXJnZXRfYml0cmF0ZSA9IDMwMDsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0xBU1Q7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfRk9SQ0VfR0Y7Ci0gICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfRk9SQ0VfQVJGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgY2FzZSAyOgotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgY2FzZSA3OgotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBjZmcucmNfbWF4X3F1YW50aXplciA9IDQ1OwotICAgICAgICAgICAgY2ZnLnJjX21pbl9xdWFudGl6ZXIgPSAwOwotICAgICAgICAgICAgY2ZnLnJjX3RhcmdldF9iaXRyYXRlID0gMjMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgY2ZnLnJjX21heF9xdWFudGl6ZXIgPSA0NTsKLSAgICAgICAgICAgIGNmZy5yY19taW5fcXVhbnRpemVyID0gMDsKLSAgICAgICAgICAgIGNmZy5yY190YXJnZXRfYml0cmF0ZSA9IDIxNTsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfTEFTVDsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19GT1JDRV9BUkY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBFUl9GUkFNRV9DRkcKLQotT2JzZXJ2aW5nIFRoZSBFZmZlY3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVVzZSB0aGUgYGRlY29kZV93aXRoX2Ryb3BzYCBleGFtcGxlIHRvIGRlY29kZSB3aXRoIHZhcmlvdXMgZHJvcHBlZCBmcmFtZQotcGF0dGVybnMuIEdvb2QgcGF0dGVybnMgdG8gc3RhcnQgd2l0aCBhcmUgMS8yLCAzLzQsIDcvOCwgYW5kIDE1LzE2Ci1kcm9wcy4KZGlmZiAtLWdpdCBhL2dlbmVyaWMvbGlidnB4X3NyY3MudHh0IGIvZ2VuZXJpYy9saWJ2cHhfc3Jjcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNTllZgotLS0gL2Rldi9udWxsCisrKyBiL2dlbmVyaWMvbGlidnB4X3NyY3MudHh0CkBAIC0wLDAgKzEsMTEzIEBACitidWlsZC9tYWtlL3J0Y2Quc2gKK2J1aWxkL21ha2UvdmVyc2lvbi5zaAorQ0hBTkdFTE9HCitsaWJzLm1rCit2cDgvY29tbW9uL2FsbG9jY29tbW9uLmMKK3ZwOC9jb21tb24vYWxsb2Njb21tb24uaAordnA4L2NvbW1vbi9hc21fY29tX29mZnNldHMuYwordnA4L2NvbW1vbi9ibG9ja2QuYwordnA4L2NvbW1vbi9ibG9ja2QuaAordnA4L2NvbW1vbi9jb2VmdXBkYXRlcHJvYnMuaAordnA4L2NvbW1vbi9jb21tb24uaAordnA4L2NvbW1vbi9kZWJ1Z21vZGVzLmMKK3ZwOC9jb21tb24vZGVmYXVsdF9jb2VmX3Byb2JzLmgKK3ZwOC9jb21tb24vZGVxdWFudGl6ZS5jCit2cDgvY29tbW9uL2VudHJvcHkuYwordnA4L2NvbW1vbi9lbnRyb3B5LmgKK3ZwOC9jb21tb24vZW50cm9weW1vZGUuYwordnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oCit2cDgvY29tbW9uL2VudHJvcHltdi5jCit2cDgvY29tbW9uL2VudHJvcHltdi5oCit2cDgvY29tbW9uL2V4dGVuZC5jCit2cDgvY29tbW9uL2V4dGVuZC5oCit2cDgvY29tbW9uL2ZpbHRlci5jCit2cDgvY29tbW9uL2ZpbHRlci5oCit2cDgvY29tbW9uL2ZpbmRuZWFybXYuYwordnA4L2NvbW1vbi9maW5kbmVhcm12LmgKK3ZwOC9jb21tb24vZ2VuZXJpYy9zeXN0ZW1kZXBlbmRlbnQuYwordnA4L2NvbW1vbi9oZWFkZXIuaAordnA4L2NvbW1vbi9pZGN0X2Jsay5jCit2cDgvY29tbW9uL2lkY3RsbG0uYwordnA4L2NvbW1vbi9pbnZ0cmFucy5oCit2cDgvY29tbW9uL2xvb3BmaWx0ZXIuYwordnA4L2NvbW1vbi9sb29wZmlsdGVyX2ZpbHRlcnMuYwordnA4L2NvbW1vbi9sb29wZmlsdGVyLmgKK3ZwOC9jb21tb24vbWJwaXRjaC5jCit2cDgvY29tbW9uL21vZGVjb250LmMKK3ZwOC9jb21tb24vbW9kZWNvbnQuaAordnA4L2NvbW1vbi9tdi5oCit2cDgvY29tbW9uL29ueXhjX2ludC5oCit2cDgvY29tbW9uL29ueXhkLmgKK3ZwOC9jb21tb24vb255eC5oCit2cDgvY29tbW9uL3BwZmxhZ3MuaAordnA4L2NvbW1vbi9wcmFnbWFzLmgKK3ZwOC9jb21tb24vcXVhbnRfY29tbW9uLmMKK3ZwOC9jb21tb24vcXVhbnRfY29tbW9uLmgKK3ZwOC9jb21tb24vcmVjb25pbnRlci5jCit2cDgvY29tbW9uL3JlY29uaW50ZXIuaAordnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmMKK3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5oCit2cDgvY29tbW9uL3JlY29uaW50cmEuYwordnA4L2NvbW1vbi9ydGNkLmMKK3ZwOC9jb21tb24vcnRjZF9kZWZzLnNoCit2cDgvY29tbW9uL3NhZF9jLmMKK3ZwOC9jb21tb24vc2V0dXBpbnRyYXJlY29uLmMKK3ZwOC9jb21tb24vc2V0dXBpbnRyYXJlY29uLmgKK3ZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuYwordnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oCit2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oCit2cDgvY29tbW9uL3RocmVhZGluZy5oCit2cDgvY29tbW9uL3RyZWVjb2Rlci5jCit2cDgvY29tbW9uL3RyZWVjb2Rlci5oCit2cDgvY29tbW9uL3ZhcmlhbmNlX2MuYwordnA4L2NvbW1vbi92YXJpYW5jZS5oCit2cDgvY29tbW9uL3ZwOF9lbnRyb3B5bW9kZWRhdGEuaAordnA4L2RlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMKK3ZwOC9kZWNvZGVyL2Rib29saHVmZi5jCit2cDgvZGVjb2Rlci9kYm9vbGh1ZmYuaAordnA4L2RlY29kZXIvZGVjb2RlbXYuYwordnA4L2RlY29kZXIvZGVjb2RlbXYuaAordnA4L2RlY29kZXIvZGVjb2RlcnRocmVhZGluZy5oCit2cDgvZGVjb2Rlci9kZWNvZGZyYW1lLmMKK3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuYwordnA4L2RlY29kZXIvZGV0b2tlbml6ZS5oCit2cDgvZGVjb2Rlci9vbnl4ZF9pZi5jCit2cDgvZGVjb2Rlci9vbnl4ZF9pbnQuaAordnA4L2RlY29kZXIvdGhyZWFkaW5nLmMKK3ZwOC9kZWNvZGVyL3RyZWVyZWFkZXIuaAordnA4L3ZwOF9jb21tb24ubWsKK3ZwOC92cDhfZHhfaWZhY2UuYwordnA4L3ZwOGR4Lm1rCit2cHhfY29uZmlnLmMKK3ZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaAordnB4X21lbS9pbmNsdWRlL3ZweF9tZW1faW50cm5sLmgKK3ZweF9tZW0vdnB4X21lbS5jCit2cHhfbWVtL3ZweF9tZW0uaAordnB4X21lbS92cHhfbWVtLm1rCit2cHhfcG9ydHMvYXNtX29mZnNldHMuaAordnB4X3BvcnRzL21lbS5oCit2cHhfcG9ydHMvdnB4X3BvcnRzLm1rCit2cHhfcG9ydHMvdnB4X3RpbWVyLmgKK3ZweF9zY2FsZS9nZW5lcmljL2dlbl9zY2FsZXJzLmMKK3ZweF9zY2FsZS9nZW5lcmljL3ZweHNjYWxlLmMKK3ZweF9zY2FsZS9nZW5lcmljL3l2MTJjb25maWcuYwordnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZC5jCit2cHhfc2NhbGUvZ2VuZXJpYy95djEyZXh0ZW5kX2dlbmVyaWMuaAordnB4X3NjYWxlL3NjYWxlX21vZGUuaAordnB4X3NjYWxlL3ZweHNjYWxlLmgKK3ZweF9zY2FsZS92cHhfc2NhbGUubWsKK3ZweF9zY2FsZS95djEyY29uZmlnLmgKK3ZweC9zcmMvdnB4X2NvZGVjLmMKK3ZweC9zcmMvdnB4X2RlY29kZXIuYwordnB4L3NyYy92cHhfZW5jb2Rlci5jCit2cHgvc3JjL3ZweF9pbWFnZS5jCit2cHgvdnA4ZHguaAordnB4L3ZwOC5oCit2cHgvdnB4X2NvZGVjLmgKK3ZweC92cHhfY29kZWNfaW1wbF9ib3R0b20uaAordnB4L3ZweF9jb2RlY19pbXBsX3RvcC5oCit2cHgvdnB4X2NvZGVjLm1rCit2cHgvdnB4X2RlY29kZXIuaAordnB4L3ZweF9lbmNvZGVyLmgKK3ZweC92cHhfaW1hZ2UuaAordnB4L3ZweF9pbnRlZ2VyLmgKZGlmZiAtLWdpdCBhL2dlbmVyaWMvdnB4X2NvbmZpZy5jIGIvZ2VuZXJpYy92cHhfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjNDhmNAotLS0gL2Rldi9udWxsCisrKyBiL2dlbmVyaWMvdnB4X2NvbmZpZy5jCkBAIC0wLDAgKzEsOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gKi8KKy8qICAqLworLyogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSAqLworLyogdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlICovCisvKiB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kICovCisvKiBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5ICovCisvKiBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBjZmcgPSAiLS1mb3JjZS10YXJnZXQ9Z2VuZXJpYy1nbnUgLS1kaXNhYmxlLXZwOC1lbmNvZGVyIC0tZGlzYWJsZS1leGFtcGxlcyAtLWRpc2FibGUtZG9jcyI7Citjb25zdCBjaGFyICp2cHhfY29kZWNfYnVpbGRfY29uZmlnKHZvaWQpIHtyZXR1cm4gY2ZnO30KZGlmZiAtLWdpdCBhL2dlbmVyaWMvdnB4X2NvbmZpZy5oIGIvZ2VuZXJpYy92cHhfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlYjgyMgotLS0gL2Rldi9udWxsCisrKyBiL2dlbmVyaWMvdnB4X2NvbmZpZy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisvKiAgKi8KKy8qIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgKi8KKy8qIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSAqLworLyogdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCAqLworLyogaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSAqLworLyogYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuICovCisvKiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEgKi8KKyNpZm5kZWYgVlBYX0NPTkZJR19ICisjZGVmaW5lIFZQWF9DT05GSUdfSAorI2RlZmluZSBSRVNUUklDVCAgICAKKyNkZWZpbmUgQVJDSF9BUk0gMAorI2RlZmluZSBBUkNIX01JUFMgMAorI2RlZmluZSBBUkNIX1g4NiAwCisjZGVmaW5lIEFSQ0hfWDg2XzY0IDAKKyNkZWZpbmUgQVJDSF9QUEMzMiAwCisjZGVmaW5lIEFSQ0hfUFBDNjQgMAorI2RlZmluZSBIQVZFX0VEU1AgMAorI2RlZmluZSBIQVZFX01FRElBIDAKKyNkZWZpbmUgSEFWRV9ORU9OIDAKKyNkZWZpbmUgSEFWRV9NSVBTMzIgMAorI2RlZmluZSBIQVZFX0RTUFIyIDAKKyNkZWZpbmUgSEFWRV9NTVggMAorI2RlZmluZSBIQVZFX1NTRSAwCisjZGVmaW5lIEhBVkVfU1NFMiAwCisjZGVmaW5lIEhBVkVfU1NFMyAwCisjZGVmaW5lIEhBVkVfU1NTRTMgMAorI2RlZmluZSBIQVZFX1NTRTRfMSAwCisjZGVmaW5lIEhBVkVfQUxUSVZFQyAwCisjZGVmaW5lIEhBVkVfVlBYX1BPUlRTIDEKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZGVmaW5lIEhBVkVfQUxUX1RSRUVfTEFZT1VUIDAKKyNkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorI2RlZmluZSBIQVZFX1NZU19NTUFOX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKyNkZWZpbmUgQ09ORklHX0VYVEVSTkFMX0JVSUxEIDAKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfRE9DUyAxCisjZGVmaW5lIENPTkZJR19JTlNUQUxMX0JJTlMgMQorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9MSUJTIDEKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfU1JDUyAwCisjZGVmaW5lIENPTkZJR19ERUJVRyAwCisjZGVmaW5lIENPTkZJR19HUFJPRiAwCisjZGVmaW5lIENPTkZJR19HQ09WIDAKKyNkZWZpbmUgQ09ORklHX1JWQ1QgMAorI2RlZmluZSBDT05GSUdfR0NDIDEKKyNkZWZpbmUgQ09ORklHX01TVlMgMAorI2RlZmluZSBDT05GSUdfUElDIDAKKyNkZWZpbmUgQ09ORklHX0JJR19FTkRJQU4gMAorI2RlZmluZSBDT05GSUdfQ09ERUNfU1JDUyAwCisjZGVmaW5lIENPTkZJR19ERUJVR19MSUJTIDAKKyNkZWZpbmUgQ09ORklHX0ZBU1RfVU5BTElHTkVEIDEKKyNkZWZpbmUgQ09ORklHX01FTV9NQU5BR0VSIDAKKyNkZWZpbmUgQ09ORklHX01FTV9UUkFDS0VSIDAKKyNkZWZpbmUgQ09ORklHX01FTV9DSEVDS1MgMAorI2RlZmluZSBDT05GSUdfTUQ1IDEKKyNkZWZpbmUgQ09ORklHX0RFUVVBTlRfVE9LRU5TIDAKKyNkZWZpbmUgQ09ORklHX0RDX1JFQ09OIDAKKyNkZWZpbmUgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVCAwCisjZGVmaW5lIENPTkZJR19QT1NUUFJPQyAwCisjZGVmaW5lIENPTkZJR19NVUxUSVRIUkVBRCAxCisjZGVmaW5lIENPTkZJR19JTlRFUk5BTF9TVEFUUyAwCisjZGVmaW5lIENPTkZJR19WUDhfRU5DT0RFUiAwCisjZGVmaW5lIENPTkZJR19WUDhfREVDT0RFUiAxCisjZGVmaW5lIENPTkZJR19WUDggMQorI2RlZmluZSBDT05GSUdfRU5DT0RFUlMgMAorI2RlZmluZSBDT05GSUdfREVDT0RFUlMgMQorI2RlZmluZSBDT05GSUdfU1RBVElDX01TVkNSVCAwCisjZGVmaW5lIENPTkZJR19TUEFUSUFMX1JFU0FNUExJTkcgMQorI2RlZmluZSBDT05GSUdfUkVBTFRJTUVfT05MWSAwCisjZGVmaW5lIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HIDAKKyNkZWZpbmUgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UIDAKKyNkZWZpbmUgQ09ORklHX1NIQVJFRCAwCisjZGVmaW5lIENPTkZJR19TVEFUSUMgMQorI2RlZmluZSBDT05GSUdfU01BTEwgMAorI2RlZmluZSBDT05GSUdfUE9TVFBST0NfVklTVUFMSVpFUiAwCisjZGVmaW5lIENPTkZJR19PU19TVVBQT1JUIDEKKyNkZWZpbmUgQ09ORklHX1VOSVRfVEVTVFMgMQorI2RlZmluZSBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HIDAKKyNkZWZpbmUgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORyAxCisjZW5kaWYgLyogVlBYX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9nZW5lcmljL3ZweF9ydGNkLmggYi9nZW5lcmljL3ZweF9ydGNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1NzU3OAotLS0gL2Rldi9udWxsCisrKyBiL2dlbmVyaWMvdnB4X3J0Y2QuaApAQCAtMCwwICsxLDI5NiBAQAorI2lmbmRlZiBWUFhfUlRDRF8KKyNkZWZpbmUgVlBYX1JUQ0RfCisKKyNpZmRlZiBSVENEX0MKKyNkZWZpbmUgUlRDRF9FWFRFUk4KKyNlbHNlCisjZGVmaW5lIFJUQ0RfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorCitzdHJ1Y3QgYmxvY2tkOworc3RydWN0IG1hY3JvYmxvY2tkOworc3RydWN0IGxvb3BfZmlsdGVyX2luZm87CisKKy8qIEVuY29kZXIgZm9yd2FyZCBkZWNscyAqLworc3RydWN0IGJsb2NrOworc3RydWN0IG1hY3JvYmxvY2s7CitzdHJ1Y3QgdmFyaWFuY2VfdnRhYmxlOwordW5pb24gaW50X212Oworc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZzsKKwordm9pZCB2cDhfZGVxdWFudGl6ZV9iX2Moc3RydWN0IGJsb2NrZCosIHNob3J0ICpkcWMpOworI2RlZmluZSB2cDhfZGVxdWFudGl6ZV9iIHZwOF9kZXF1YW50aXplX2JfYworCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgaW50IHN0cmlkZSk7CisjZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkIHZwOF9kZXF1YW50X2lkY3RfYWRkX2MKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2Moc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jayB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2MKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19jKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKmRzdF91LCB1bnNpZ25lZCBjaGFyICpkc3RfdiwgaW50IHN0cmlkZSwgY2hhciAqZW9icyk7CisjZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2MKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X2ModW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfbWJ2IHZwOF9sb29wX2ZpbHRlcl9tYnZfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idl9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX2J2IHZwOF9sb29wX2ZpbHRlcl9idl9jCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX21iaCB2cDhfbG9vcF9maWx0ZXJfbWJoX2MKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfYyh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9iaCB2cDhfbG9vcF9maWx0ZXJfYmhfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jKHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21idiB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnYgdnA4X2xvb3BfZmlsdGVyX2J2c19jCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2Joc19jKHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2JoIHZwOF9sb29wX2ZpbHRlcl9iaHNfYworCit2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2Moc2hvcnQgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOworI2RlZmluZSB2cDhfc2hvcnRfaWRjdDR4NGxsbSB2cDhfc2hvcnRfaWRjdDR4NGxsbV9jCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKKyNkZWZpbmUgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9jCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCk7CisjZGVmaW5lIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9jCisKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyhzaG9ydCBpbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHByZWRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2RjX29ubHlfaWRjdF9hZGQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYworCit2b2lkIHZwOF9jb3B5X21lbTE2eDE2X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfY29weV9tZW0xNngxNiB2cDhfY29weV9tZW0xNngxNl9jCisKK3ZvaWQgdnA4X2NvcHlfbWVtOHg4X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfY29weV9tZW04eDggdnA4X2NvcHlfbWVtOHg4X2MKKwordm9pZCB2cDhfY29weV9tZW04eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9jb3B5X21lbTh4NCB2cDhfY29weV9tZW04eDRfYworCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zX2Moc3RydWN0IG1hY3JvYmxvY2tkICp4LCB1bnNpZ25lZCBjaGFyICogeWFib3ZlX3JvdywgdW5zaWduZWQgY2hhciAqIHlsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKiB5cHJlZF9wdHIsIGludCB5X3N0cmlkZSk7CisjZGVmaW5lIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zX2MKKwordm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3NfYyhzdHJ1Y3QgbWFjcm9ibG9ja2QgKngsIHVuc2lnbmVkIGNoYXIgKiB1YWJvdmVfcm93LCB1bnNpZ25lZCBjaGFyICogdmFib3ZlX3JvdywgIHVuc2lnbmVkIGNoYXIgKnVsZWZ0LCB1bnNpZ25lZCBjaGFyICp2bGVmdCwgaW50IGxlZnRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICogdXByZWRfcHRyLCB1bnNpZ25lZCBjaGFyICogdnByZWRfcHRyLCBpbnQgcHJlZF9zdHJpZGUpOworI2RlZmluZSB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zX2MKKwordm9pZCB2cDhfaW50cmE0eDRfcHJlZGljdF9jKHVuc2lnbmVkIGNoYXIgKkFib3ZlLCB1bnNpZ25lZCBjaGFyICp5bGVmdCwgaW50IGxlZnRfc3RyaWRlLCBCX1BSRURJQ1RJT05fTU9ERSBiX21vZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgdG9wX2xlZnQpOworI2RlZmluZSB2cDhfaW50cmE0eDRfcHJlZGljdCB2cDhfaW50cmE0eDRfcHJlZGljdF9jCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9jCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X3NpeHRhcF9wcmVkaWN0OHg4IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9jCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X3NpeHRhcF9wcmVkaWN0OHg0IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9jCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0NHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X3NpeHRhcF9wcmVkaWN0NHg0IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9jCisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTYgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9jCisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9jCisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9jCisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U0eDRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZTR4NCB2cDhfdmFyaWFuY2U0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U4eDggdnA4X3ZhcmlhbmNlOHg4X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZTh4MTYgdnA4X3ZhcmlhbmNlOHgxNl9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2UxNng4IHZwOF92YXJpYW5jZTE2eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZTE2eDE2IHZwOF92YXJpYW5jZTE2eDE2X2MKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDggdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2MKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDggdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3YgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9jCisKK3Vuc2lnbmVkIGludCB2cDhfc2FkNHg0X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQ0eDQgdnA4X3NhZDR4NF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc2FkOHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQ4eDggdnA4X3NhZDh4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc2FkOHgxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkOHgxNiB2cDhfc2FkOHgxNl9jCisKK3Vuc2lnbmVkIGludCB2cDhfc2FkMTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkMTZ4OCB2cDhfc2FkMTZ4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc2FkMTZ4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDE2eDE2IHZwOF9zYWQxNngxNl9jCisKK3ZvaWQgdnA4X3NhZDR4NHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkNHg0eDMgdnA4X3NhZDR4NHgzX2MKKwordm9pZCB2cDhfc2FkOHg4eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDh4MyB2cDhfc2FkOHg4eDNfYworCit2b2lkIHZwOF9zYWQ4eDE2eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2eDMgdnA4X3NhZDh4MTZ4M19jCisKK3ZvaWQgdnA4X3NhZDE2eDh4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDh4MyB2cDhfc2FkMTZ4OHgzX2MKKwordm9pZCB2cDhfc2FkMTZ4MTZ4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDE2eDMgdnA4X3NhZDE2eDE2eDNfYworCit2b2lkIHZwOF9zYWQ0eDR4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkNHg0eDggdnA4X3NhZDR4NHg4X2MKKwordm9pZCB2cDhfc2FkOHg4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4OHg4IHZwOF9zYWQ4eDh4OF9jCisKK3ZvaWQgdnA4X3NhZDh4MTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHgxNng4IHZwOF9zYWQ4eDE2eDhfYworCit2b2lkIHZwOF9zYWQxNng4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDh4OCB2cDhfc2FkMTZ4OHg4X2MKKwordm9pZCB2cDhfc2FkMTZ4MTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4MTZ4OCB2cDhfc2FkMTZ4MTZ4OF9jCisKK3ZvaWQgdnA4X3NhZDR4NHg0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDR4NHg0ZCB2cDhfc2FkNHg0eDRkX2MKKwordm9pZCB2cDhfc2FkOHg4eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHg4eDRkIHZwOF9zYWQ4eDh4NGRfYworCit2b2lkIHZwOF9zYWQ4eDE2eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHgxNng0ZCB2cDhfc2FkOHgxNng0ZF9jCisKK3ZvaWQgdnA4X3NhZDE2eDh4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNng4eDRkIHZwOF9zYWQxNng4eDRkX2MKKwordm9pZCB2cDhfc2FkMTZ4MTZ4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNngxNng0ZCB2cDhfc2FkMTZ4MTZ4NGRfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2MKKwordm9pZCB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19jKHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnliZik7CisjZGVmaW5lIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX2MKKwordm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyk7CisjZGVmaW5lIHZwOF95djEyX2NvcHlfZnJhbWUgdnA4X3l2MTJfY29weV9mcmFtZV9jCisKK3ZvaWQgdnA4X3l2MTJfY29weV95X2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyk7CisjZGVmaW5lIHZwOF95djEyX2NvcHlfeSB2cDhfeXYxMl9jb3B5X3lfYworCit2b2lkIHZweF9ydGNkKHZvaWQpOworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKworI2lmZGVmIFJUQ0RfQworc3RhdGljIHZvaWQgc2V0dXBfcnRjZF9pbnRlcm5hbCh2b2lkKQoreworCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2VuZXJpYy92cHhfdmVyc2lvbi5oIGIvZ2VuZXJpYy92cHhfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2M2RkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5lcmljL3ZweF92ZXJzaW9uLmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIFZFUlNJT05fTUFKT1IgIDEKKyNkZWZpbmUgVkVSU0lPTl9NSU5PUiAgMQorI2RlZmluZSBWRVJTSU9OX1BBVENIICAwCisjZGVmaW5lIFZFUlNJT05fRVhUUkEgICIiCisjZGVmaW5lIFZFUlNJT05fUEFDS0VEICgoVkVSU0lPTl9NQUpPUjw8MTYpfChWRVJTSU9OX01JTk9SPDw4KXwoVkVSU0lPTl9QQVRDSCkpCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HX05PU1AgInYxLjEuMCIKKyNkZWZpbmUgVkVSU0lPTl9TVFJJTkcgICAgICAiIHYxLjEuMCIKZGlmZiAtLWdpdCBhL2xpYm1rdi9FYm1sSURzLmggYi9saWJta3YvRWJtbElEcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjk3NDcwLi4wMDAwMDAwCi0tLSBhL2xpYm1rdi9FYm1sSURzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotCi0KLSNpZm5kZWYgTUtWX0RFRlNfSFBQCi0jZGVmaW5lIE1LVl9ERUZTX0hQUCAxCi0KLS8vQ29tbWVudGluZyBvdXQgdmFsdWVzIG5vdCBhdmFpbGFibGUgaW4gd2VibSwgYnV0IGF2YWlsYWJsZSBpbiBtYXRyb3NrYQotCi1lbnVtIG1rdgotewotICAgIEVCTUwgPSAweDFBNDVERkEzLAotICAgIEVCTUxWZXJzaW9uID0gMHg0Mjg2LAotICAgIEVCTUxSZWFkVmVyc2lvbiA9IDB4NDJGNywKLSAgICBFQk1MTWF4SURMZW5ndGggPSAweDQyRjIsCi0gICAgRUJNTE1heFNpemVMZW5ndGggPSAweDQyRjMsCi0gICAgRG9jVHlwZSA9IDB4NDI4MiwKLSAgICBEb2NUeXBlVmVyc2lvbiA9IDB4NDI4NywKLSAgICBEb2NUeXBlUmVhZFZlcnNpb24gPSAweDQyODUsCi0vLyAgQ1JDXzMyID0gMHhCRiwKLSAgICBWb2lkID0gMHhFQywKLSAgICBTaWduYXR1cmVTbG90ID0gMHgxQjUzODY2NywKLSAgICBTaWduYXR1cmVBbGdvID0gMHg3RThBLAotICAgIFNpZ25hdHVyZUhhc2ggPSAweDdFOUEsCi0gICAgU2lnbmF0dXJlUHVibGljS2V5ID0gMHg3RUE1LAotICAgIFNpZ25hdHVyZSA9IDB4N0VCNSwKLSAgICBTaWduYXR1cmVFbGVtZW50cyA9IDB4N0U1QiwKLSAgICBTaWduYXR1cmVFbGVtZW50TGlzdCA9IDB4N0U3QiwKLSAgICBTaWduZWRFbGVtZW50ID0gMHg2NTMyLAotICAgIC8vc2VnbWVudAotICAgIFNlZ21lbnQgPSAweDE4NTM4MDY3LAotICAgIC8vTWV0YSBTZWVrIEluZm9ybWF0aW9uCi0gICAgU2Vla0hlYWQgPSAweDExNEQ5Qjc0LAotICAgIFNlZWsgPSAweDREQkIsCi0gICAgU2Vla0lEID0gMHg1M0FCLAotICAgIFNlZWtQb3NpdGlvbiA9IDB4NTNBQywKLSAgICAvL1NlZ21lbnQgSW5mb3JtYXRpb24KLSAgICBJbmZvID0gMHgxNTQ5QTk2NiwKLS8vICBTZWdtZW50VUlEID0gMHg3M0E0LAotLy8gIFNlZ21lbnRGaWxlbmFtZSA9IDB4NzM4NCwKLS8vICBQcmV2VUlEID0gMHgzQ0I5MjMsCi0vLyAgUHJldkZpbGVuYW1lID0gMHgzQzgzQUIsCi0vLyAgTmV4dFVJRCA9IDB4M0VCOTIzLAotLy8gIE5leHRGaWxlbmFtZSA9IDB4M0U4M0JCLAotLy8gIFNlZ21lbnRGYW1pbHkgPSAweDQ0NDQsCi0vLyAgQ2hhcHRlclRyYW5zbGF0ZSA9IDB4NjkyNCwKLS8vICBDaGFwdGVyVHJhbnNsYXRlRWRpdGlvblVJRCA9IDB4NjlGQywKLS8vICBDaGFwdGVyVHJhbnNsYXRlQ29kZWMgPSAweDY5QkYsCi0vLyAgQ2hhcHRlclRyYW5zbGF0ZUlEID0gMHg2OUE1LAotICAgIFRpbWVjb2RlU2NhbGUgPSAweDJBRDdCMSwKLSAgICBTZWdtZW50X0R1cmF0aW9uID0gMHg0NDg5LAotICAgIERhdGVVVEMgPSAweDQ0NjEsCi0vLyAgVGl0bGUgPSAweDdCQTksCi0gICAgTXV4aW5nQXBwID0gMHg0RDgwLAotICAgIFdyaXRpbmdBcHAgPSAweDU3NDEsCi0gICAgLy9DbHVzdGVyCi0gICAgQ2x1c3RlciA9IDB4MUY0M0I2NzUsCi0gICAgVGltZWNvZGUgPSAweEU3LAotLy8gIFNpbGVudFRyYWNrcyA9IDB4NTg1NCwKLS8vICBTaWxlbnRUcmFja051bWJlciA9IDB4NThENywKLS8vICBQb3NpdGlvbiA9IDB4QTcsCi0gICAgUHJldlNpemUgPSAweEFCLAotICAgIEJsb2NrR3JvdXAgPSAweEEwLAotICAgIEJsb2NrID0gMHhBMSwKLS8vICBCbG9ja1ZpcnR1YWwgPSAweEEyLAotLy8gIEJsb2NrQWRkaXRpb25zID0gMHg3NUExLAotLy8gIEJsb2NrTW9yZSA9IDB4QTYsCi0vLyAgQmxvY2tBZGRJRCA9IDB4RUUsCi0vLyAgQmxvY2tBZGRpdGlvbmFsID0gMHhBNSwKLSAgICBCbG9ja0R1cmF0aW9uID0gMHg5QiwKLS8vICBSZWZlcmVuY2VQcmlvcml0eSA9IDB4RkEsCi0gICAgUmVmZXJlbmNlQmxvY2sgPSAweEZCLAotLy8gIFJlZmVyZW5jZVZpcnR1YWwgPSAweEZELAotLy8gIENvZGVjU3RhdGUgPSAweEE0LAotLy8gIFNsaWNlcyA9IDB4OEUsCi0vLyAgVGltZVNsaWNlID0gMHhFOCwKLSAgICBMYWNlTnVtYmVyID0gMHhDQywKLS8vICBGcmFtZU51bWJlciA9IDB4Q0QsCi0vLyAgQmxvY2tBZGRpdGlvbklEID0gMHhDQiwKLS8vICBNa3ZEZWxheSA9IDB4Q0UsCi0vLyAgQ2x1c3Rlcl9EdXJhdGlvbiA9IDB4Q0YsCi0gICAgU2ltcGxlQmxvY2sgPSAweEEzLAotLy8gIEVuY3J5cHRlZEJsb2NrID0gMHhBRiwKLSAgICAvL1RyYWNrCi0gICAgVHJhY2tzID0gMHgxNjU0QUU2QiwKLSAgICBUcmFja0VudHJ5ID0gMHhBRSwKLSAgICBUcmFja051bWJlciA9IDB4RDcsCi0gICAgVHJhY2tVSUQgPSAweDczQzUsCi0gICAgVHJhY2tUeXBlID0gMHg4MywKLSAgICBGbGFnRW5hYmxlZCA9IDB4QjksCi0gICAgRmxhZ0RlZmF1bHQgPSAweDg4LAotICAgIEZsYWdGb3JjZWQgPSAweDU1QUEsCi0gICAgRmxhZ0xhY2luZyA9IDB4OUMsCi0vLyAgTWluQ2FjaGUgPSAweDZERTcsCi0vLyAgTWF4Q2FjaGUgPSAweDZERjgsCi0gICAgRGVmYXVsdER1cmF0aW9uID0gMHgyM0UzODMsCi0vLyAgVHJhY2tUaW1lY29kZVNjYWxlID0gMHgyMzMxNEYsCi0vLyAgVHJhY2tPZmZzZXQgPSAweDUzN0YsCi0vLyAgTWF4QmxvY2tBZGRpdGlvbklEID0gMHg1NUVFLAotICAgIE5hbWUgPSAweDUzNkUsCi0gICAgTGFuZ3VhZ2UgPSAweDIyQjU5QywKLSAgICBDb2RlY0lEID0gMHg4NiwKLSAgICBDb2RlY1ByaXZhdGUgPSAweDYzQTIsCi0gICAgQ29kZWNOYW1lID0gMHgyNTg2ODgsCi0vLyAgQXR0YWNobWVudExpbmsgPSAweDc0NDYsCi0vLyAgQ29kZWNTZXR0aW5ncyA9IDB4M0E5Njk3LAotLy8gIENvZGVjSW5mb1VSTCA9IDB4M0I0MDQwLAotLy8gIENvZGVjRG93bmxvYWRVUkwgPSAweDI2QjI0MCwKLS8vICBDb2RlY0RlY29kZUFsbCA9IDB4QUEsCi0vLyAgVHJhY2tPdmVybGF5ID0gMHg2RkFCLAotLy8gIFRyYWNrVHJhbnNsYXRlID0gMHg2NjI0LAotLy8gIFRyYWNrVHJhbnNsYXRlRWRpdGlvblVJRCA9IDB4NjZGQywKLS8vICBUcmFja1RyYW5zbGF0ZUNvZGVjID0gMHg2NkJGLAotLy8gIFRyYWNrVHJhbnNsYXRlVHJhY2tJRCA9IDB4NjZBNSwKLSAgICAvL3ZpZGVvCi0gICAgVmlkZW8gPSAweEUwLAotICAgIEZsYWdJbnRlcmxhY2VkID0gMHg5QSwKLS8vICBTdGVyZW9Nb2RlID0gMHg1M0I4LAotICAgIFBpeGVsV2lkdGggPSAweEIwLAotICAgIFBpeGVsSGVpZ2h0ID0gMHhCQSwKLSAgICBQaXhlbENyb3BCb3R0b20gPSAweDU0QUEsCi0gICAgUGl4ZWxDcm9wVG9wID0gMHg1NEJCLAotICAgIFBpeGVsQ3JvcExlZnQgPSAweDU0Q0MsCi0gICAgUGl4ZWxDcm9wUmlnaHQgPSAweDU0REQsCi0gICAgRGlzcGxheVdpZHRoID0gMHg1NEIwLAotICAgIERpc3BsYXlIZWlnaHQgPSAweDU0QkEsCi0gICAgRGlzcGxheVVuaXQgPSAweDU0QjIsCi0gICAgQXNwZWN0UmF0aW9UeXBlID0gMHg1NEIzLAotLy8gIENvbG91clNwYWNlID0gMHgyRUI1MjQsCi0vLyAgR2FtbWFWYWx1ZSA9IDB4MkZCNTIzLAotICAgIEZyYW1lUmF0ZSA9IDB4MjM4M0UzLAotICAgIC8vZW5kIHZpZGVvCi0gICAgLy9hdWRpbwotICAgIEF1ZGlvID0gMHhFMSwKLSAgICBTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4QjUsCi0gICAgT3V0cHV0U2FtcGxpbmdGcmVxdWVuY3kgPSAweDc4QjUsCi0gICAgQ2hhbm5lbHMgPSAweDlGLAotLy8gIENoYW5uZWxQb3NpdGlvbnMgPSAweDdEN0IsCi0gICAgQml0RGVwdGggPSAweDYyNjQsCi0gICAgLy9lbmQgYXVkaW8KLSAgICAvL2NvbnRlbnQgZW5jb2RpbmcKLS8vICBDb250ZW50RW5jb2RpbmdzID0gMHg2ZDgwLAotLy8gIENvbnRlbnRFbmNvZGluZyA9IDB4NjI0MCwKLS8vICBDb250ZW50RW5jb2RpbmdPcmRlciA9IDB4NTAzMSwKLS8vICBDb250ZW50RW5jb2RpbmdTY29wZSA9IDB4NTAzMiwKLS8vICBDb250ZW50RW5jb2RpbmdUeXBlID0gMHg1MDMzLAotLy8gIENvbnRlbnRDb21wcmVzc2lvbiA9IDB4NTAzNCwKLS8vICBDb250ZW50Q29tcEFsZ28gPSAweDQyNTQsCi0vLyAgQ29udGVudENvbXBTZXR0aW5ncyA9IDB4NDI1NSwKLS8vICBDb250ZW50RW5jcnlwdGlvbiA9IDB4NTAzNSwKLS8vICBDb250ZW50RW5jQWxnbyA9IDB4NDdlMSwKLS8vICBDb250ZW50RW5jS2V5SUQgPSAweDQ3ZTIsCi0vLyAgQ29udGVudFNpZ25hdHVyZSA9IDB4NDdlMywKLS8vICBDb250ZW50U2lnS2V5SUQgPSAweDQ3ZTQsCi0vLyAgQ29udGVudFNpZ0FsZ28gPSAweDQ3ZTUsCi0vLyAgQ29udGVudFNpZ0hhc2hBbGdvID0gMHg0N2U2LAotICAgIC8vZW5kIGNvbnRlbnQgZW5jb2RpbmcKLSAgICAvL0N1ZWluZyBEYXRhCi0gICAgQ3VlcyA9IDB4MUM1M0JCNkIsCi0gICAgQ3VlUG9pbnQgPSAweEJCLAotICAgIEN1ZVRpbWUgPSAweEIzLAotICAgIEN1ZVRyYWNrUG9zaXRpb25zID0gMHhCNywKLSAgICBDdWVUcmFjayA9IDB4RjcsCi0gICAgQ3VlQ2x1c3RlclBvc2l0aW9uID0gMHhGMSwKLSAgICBDdWVCbG9ja051bWJlciA9IDB4NTM3OCwKLS8vICBDdWVDb2RlY1N0YXRlID0gMHhFQSwKLS8vICBDdWVSZWZlcmVuY2UgPSAweERCLAotLy8gIEN1ZVJlZlRpbWUgPSAweDk2LAotLy8gIEN1ZVJlZkNsdXN0ZXIgPSAweDk3LAotLy8gIEN1ZVJlZk51bWJlciA9IDB4NTM1RiwKLS8vICBDdWVSZWZDb2RlY1N0YXRlID0gMHhFQiwKLSAgICAvL0F0dGFjaG1lbnQKLS8vICBBdHRhY2htZW50cyA9IDB4MTk0MUE0NjksCi0vLyAgQXR0YWNoZWRGaWxlID0gMHg2MUE3LAotLy8gIEZpbGVEZXNjcmlwdGlvbiA9IDB4NDY3RSwKLS8vICBGaWxlTmFtZSA9IDB4NDY2RSwKLS8vICBGaWxlTWltZVR5cGUgPSAweDQ2NjAsCi0vLyAgRmlsZURhdGEgPSAweDQ2NUMsCi0vLyAgRmlsZVVJRCA9IDB4NDZBRSwKLS8vICBGaWxlUmVmZXJyYWwgPSAweDQ2NzUsCi0gICAgLy9DaGFwdGVycwotLy8gIENoYXB0ZXJzID0gMHgxMDQzQTc3MCwKLS8vICBFZGl0aW9uRW50cnkgPSAweDQ1QjksCi0vLyAgRWRpdGlvblVJRCA9IDB4NDVCQywKLS8vICBFZGl0aW9uRmxhZ0hpZGRlbiA9IDB4NDVCRCwKLS8vICBFZGl0aW9uRmxhZ0RlZmF1bHQgPSAweDQ1REIsCi0vLyAgRWRpdGlvbkZsYWdPcmRlcmVkID0gMHg0NURELAotLy8gIENoYXB0ZXJBdG9tID0gMHhCNiwKLS8vICBDaGFwdGVyVUlEID0gMHg3M0M0LAotLy8gIENoYXB0ZXJUaW1lU3RhcnQgPSAweDkxLAotLy8gIENoYXB0ZXJUaW1lRW5kID0gMHg5MiwKLS8vICBDaGFwdGVyRmxhZ0hpZGRlbiA9IDB4OTgsCi0vLyAgQ2hhcHRlckZsYWdFbmFibGVkID0gMHg0NTk4LAotLy8gIENoYXB0ZXJTZWdtZW50VUlEID0gMHg2RTY3LAotLy8gIENoYXB0ZXJTZWdtZW50RWRpdGlvblVJRCA9IDB4NkVCQywKLS8vICBDaGFwdGVyUGh5c2ljYWxFcXVpdiA9IDB4NjNDMywKLS8vICBDaGFwdGVyVHJhY2sgPSAweDhGLAotLy8gIENoYXB0ZXJUcmFja051bWJlciA9IDB4ODksCi0vLyAgQ2hhcHRlckRpc3BsYXkgPSAweDgwLAotLy8gIENoYXBTdHJpbmcgPSAweDg1LAotLy8gIENoYXBMYW5ndWFnZSA9IDB4NDM3QywKLS8vICBDaGFwQ291bnRyeSA9IDB4NDM3RSwKLS8vICBDaGFwUHJvY2VzcyA9IDB4Njk0NCwKLS8vICBDaGFwUHJvY2Vzc0NvZGVjSUQgPSAweDY5NTUsCi0vLyAgQ2hhcFByb2Nlc3NQcml2YXRlID0gMHg0NTBELAotLy8gIENoYXBQcm9jZXNzQ29tbWFuZCA9IDB4NjkxMSwKLS8vICBDaGFwUHJvY2Vzc1RpbWUgPSAweDY5MjIsCi0vLyAgQ2hhcFByb2Nlc3NEYXRhID0gMHg2OTMzLAotICAgIC8vVGFnZ2luZwotLy8gIFRhZ3MgPSAweDEyNTRDMzY3LAotLy8gIFRhZyA9IDB4NzM3MywKLS8vICBUYXJnZXRzID0gMHg2M0MwLAotLy8gIFRhcmdldFR5cGVWYWx1ZSA9IDB4NjhDQSwKLS8vICBUYXJnZXRUeXBlID0gMHg2M0NBLAotLy8gIFRhZ2dpbmdfVHJhY2tVSUQgPSAweDYzQzUsCi0vLyAgVGFnZ2luZ19FZGl0aW9uVUlEID0gMHg2M0M5LAotLy8gIFRhZ2dpbmdfQ2hhcHRlclVJRCA9IDB4NjNDNCwKLS8vICBBdHRhY2htZW50VUlEID0gMHg2M0M2LAotLy8gIFNpbXBsZVRhZyA9IDB4NjdDOCwKLS8vICBUYWdOYW1lID0gMHg0NUEzLAotLy8gIFRhZ0xhbmd1YWdlID0gMHg0NDdBLAotLy8gIFRhZ0RlZmF1bHQgPSAweDQ0ODQsCi0vLyAgVGFnU3RyaW5nID0gMHg0NDg3LAotLy8gIFRhZ0JpbmFyeSA9IDB4NDQ4NSwKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm1rdi9FYm1sV3JpdGVyLmMgYi9saWJta3YvRWJtbFdyaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU2NGMxLi4wMDAwMDAwCi0tLSBhL2xpYm1rdi9FYm1sV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotCi0KLSNpbmNsdWRlICJFYm1sV3JpdGVyLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8d2NoYXIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2RlZmluZSBMSVRFUkFMVTY0KG4pIG4KLSNlbHNlCi0jZGVmaW5lIExJVEVSQUxVNjQobikgbiMjTExVCi0jZW5kaWYKLQotdm9pZCBFYm1sX1dyaXRlTGVuKEVibWxHbG9iYWwgKmdsb2IsIGxvbmcgbG9uZyB2YWwpCi17Ci0gICAgLy9UT0RPIGNoZWNrIGFuZCBtYWtlIHN1cmUgd2UgYXJlIG5vdCA+IHRoYW4gMHgwMTAwMDAwMDAwMDAwMDAwTExVCi0gICAgdW5zaWduZWQgY2hhciBzaXplID0gODsgLy9zaXplIGluIGJ5dGVzIHRvIG91dHB1dAotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5WYWwgPSBMSVRFUkFMVTY0KDB4MDAwMDAwMDAwMDAwMDBmZik7IC8vbWFzayB0byBjb21wYXJlIGZvciBieXRlIHNpemUKLQotICAgIGZvciAoc2l6ZSA9IDE7IHNpemUgPCA4OyBzaXplICsrKQotICAgIHsKLSAgICAgICAgaWYgKHZhbCA8IG1pblZhbCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIG1pblZhbCA9IChtaW5WYWwgPDwgNyk7Ci0gICAgfQotCi0gICAgdmFsIHw9IChMSVRFUkFMVTY0KDB4MDAwMDAwMDAwMDAwMDgwKSA8PCAoKHNpemUgLSAxKSAqIDcpKTsKLQotICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICh2b2lkICopICZ2YWwsIHNpemUpOwotfQotCi12b2lkIEVibWxfV3JpdGVTdHJpbmcoRWJtbEdsb2JhbCAqZ2xvYiwgY29uc3QgY2hhciAqc3RyKQotewotICAgIGNvbnN0IHNpemVfdCBzaXplXyA9IHN0cmxlbihzdHIpOwotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAgc2l6ZSA9IHNpemVfOwotICAgIEVibWxfV3JpdGVMZW4oZ2xvYiwgc2l6ZSk7Ci0gICAgLy9UT0RPOiBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBzcGVjIHdoZXRoZXIgdGhlIG51bCB0ZXJtaW5hdG9yCi0gICAgLy9zaG91bGQgYmUgc2VyaWFsaXplZCB0b28uICBGb3Igbm93IHdlIG9taXQgdGhlIG51bGwgdGVybWluYXRvci4KLSAgICBFYm1sX1dyaXRlKGdsb2IsIHN0ciwgc2l6ZSk7Ci19Ci0KLXZvaWQgRWJtbF9Xcml0ZVVURjgoRWJtbEdsb2JhbCAqZ2xvYiwgY29uc3Qgd2NoYXJfdCAqd3N0cikKLXsKLSAgICBjb25zdCBzaXplX3Qgc3RybGVuID0gd2NzbGVuKHdzdHIpOwotCi0gICAgLy9UT0RPOiBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBzcGVjIHdoZXRoZXIgdGhlIG51bCB0ZXJtaW5hdG9yCi0gICAgLy9zaG91bGQgYmUgc2VyaWFsaXplZCB0b28uICBGb3Igbm93IHdlIGluY2x1ZGUgaXQuCi0gICAgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICBzaXplID0gc3RybGVuOwotCi0gICAgRWJtbF9Xcml0ZUxlbihnbG9iLCBzaXplKTsKLSAgICBFYm1sX1dyaXRlKGdsb2IsIHdzdHIsIHNpemUpOwotfQotCi12b2lkIEVibWxfV3JpdGVJRChFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkKQotewotICAgIGlmIChjbGFzc19pZCA+PSAweDAxMDAwMDAwKQotICAgICAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAodm9pZCAqKSZjbGFzc19pZCwgNCk7Ci0gICAgZWxzZSBpZiAoY2xhc3NfaWQgPj0gMHgwMDAxMDAwMCkKLSAgICAgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgKHZvaWQgKikmY2xhc3NfaWQsIDMpOwotICAgIGVsc2UgaWYgKGNsYXNzX2lkID49IDB4MDAwMDAxMDApCi0gICAgICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICh2b2lkICopJmNsYXNzX2lkLCAyKTsKLSAgICBlbHNlCi0gICAgICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICh2b2lkICopJmNsYXNzX2lkLCAxKTsKLX0KLXZvaWQgRWJtbF9TZXJpYWxpemVVbnNpZ25lZDY0KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVpbnQ2NF90IHVpKQotewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZVNlcmlhbGl6ZWQgPSA4IHwgMHg4MDsKLSAgICBFYm1sX1dyaXRlSUQoZ2xvYiwgY2xhc3NfaWQpOwotICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZzaXplU2VyaWFsaXplZCwgMSk7Ci0gICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJnVpLCA4KTsKLX0KLQotdm9pZCBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVuc2lnbmVkIGxvbmcgdWkpCi17Ci0gICAgdW5zaWduZWQgY2hhciBzaXplID0gODsgLy9zaXplIGluIGJ5dGVzIHRvIG91dHB1dAotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZVNlcmlhbGl6ZWQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgbWluVmFsOwotCi0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKLSAgICBtaW5WYWwgPSAweDdmTFU7IC8vbWFzayB0byBjb21wYXJlIGZvciBieXRlIHNpemUKLQotICAgIGZvciAoc2l6ZSA9IDE7IHNpemUgPCA0OyBzaXplICsrKQotICAgIHsKLSAgICAgICAgaWYgKHVpIDwgbWluVmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG1pblZhbCA8PD0gNzsKLSAgICB9Ci0KLSAgICBzaXplU2VyaWFsaXplZCA9IDB4ODAgfCBzaXplOwotICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZzaXplU2VyaWFsaXplZCwgMSk7Ci0gICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJnVpLCBzaXplKTsKLX0KLS8vVE9ETzogcGVyaGFwcyB0aGlzIGlzIGEgcG9vciBuYW1lIGZvciB0aGlzIGlkIHNlcmlhbGl6ZXIgaGVscGVyIGZ1bmN0aW9uCi12b2lkIEVibWxfU2VyaWFsaXplQmluYXJ5KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVuc2lnbmVkIGxvbmcgYmluKQotewotICAgIGludCBzaXplOwotICAgIGZvciAoc2l6ZT00OyBzaXplID4gMTsgc2l6ZS0tKQotICAgIHsKLSAgICAgICAgaWYgKGJpbiAmIDB4MDAwMDAwZmYgPDwgKChzaXplLTEpICogOCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKLSAgICBFYm1sX1dyaXRlTGVuKGdsb2IsIHNpemUpOwotICAgIEVibWxfV3JpdGVJRChnbG9iLCBiaW4pOwotfQotCi12b2lkIEVibWxfU2VyaWFsaXplRmxvYXQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgZG91YmxlIGQpCi17Ci0gICAgdW5zaWduZWQgY2hhciBsZW4gPSAweDg4OwotCi0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKLSAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmbGVuLCAxKTsKLSAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAgJmQsIDgpOwotfQotCi12b2lkIEVibWxfV3JpdGVTaWduZWQxNihFYm1sR2xvYmFsICpnbG9iLCBzaG9ydCB2YWwpCi17Ci0gICAgc2lnbmVkIGxvbmcgb3V0ID0gKCh2YWwgJiAweDAwM0ZGRkZGKSB8IDB4MDAyMDAwMDApIDw8IDg7Ci0gICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJm91dCwgMyk7Ci19Ci0KLXZvaWQgRWJtbF9TZXJpYWxpemVTdHJpbmcoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgY29uc3QgY2hhciAqcykKLXsKLSAgICBFYm1sX1dyaXRlSUQoZ2xvYiwgY2xhc3NfaWQpOwotICAgIEVibWxfV3JpdGVTdHJpbmcoZ2xvYiwgcyk7Ci19Ci0KLXZvaWQgRWJtbF9TZXJpYWxpemVVVEY4KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHdjaGFyX3QgKnMpCi17Ci0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsICBjbGFzc19pZCk7Ci0gICAgRWJtbF9Xcml0ZVVURjgoZ2xvYiwgIHMpOwotfQotCi12b2lkIEVibWxfU2VyaWFsaXplRGF0YShFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuZ3RoKQotewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZSA9IDQ7Ci0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKLSAgICBFYm1sX1dyaXRlTGVuKGdsb2IsIGRhdGFfbGVuZ3RoKTsKLSAgICBFYm1sX1dyaXRlKGdsb2IsICBkYXRhLCBkYXRhX2xlbmd0aCk7Ci19Ci0KLXZvaWQgRWJtbF9Xcml0ZVZvaWQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyB2U2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIHRtcCA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBpID0gMDsKLQotICAgIEVibWxfV3JpdGVJRChnbG9iLCAweEVDKTsKLSAgICBFYm1sX1dyaXRlTGVuKGdsb2IsIHZTaXplKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCB2U2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgRWJtbF9Xcml0ZShnbG9iLCAmdG1wLCAxKTsKLSAgICB9Ci19Ci0KLS8vVE9ETyBTZXJpYWxpemUgRGF0ZQpkaWZmIC0tZ2l0IGEvbGlibWt2L0VibWxXcml0ZXIuaCBiL2xpYm1rdi9FYm1sV3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2ZlN2MuLjAwMDAwMDAKLS0tIGEvbGlibWt2L0VibWxXcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSNpZm5kZWYgRUJNTFdSSVRFUl9IUFAKLSNkZWZpbmUgRUJNTFdSSVRFUl9IUFAKLQotLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotCi0vL25vdGU6IHlvdSBtdXN0IGRlZmluZSB3cml0ZSBhbmQgc2VyaWFsaXplIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHlvdXIgb3duIEVCTUxfR0xPQkFMCi0vL1RoZXNlIGZ1bmN0aW9ucyBNVVNUIGJlIGltcGxlbWVudGVkCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSAidnB4L3ZweF9pbnRlZ2VyLmgiCi0KLXR5cGVkZWYgc3RydWN0IEVibWxHbG9iYWwgRWJtbEdsb2JhbDsKLXZvaWQgIEVibWxfU2VyaWFsaXplKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7Ci12b2lkICBFYm1sX1dyaXRlKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7Ci0vLy8vLwotCi0KLXZvaWQgRWJtbF9Xcml0ZUxlbihFYm1sR2xvYmFsICpnbG9iLCBsb25nIGxvbmcgdmFsKTsKLXZvaWQgRWJtbF9Xcml0ZVN0cmluZyhFYm1sR2xvYmFsICpnbG9iLCBjb25zdCBjaGFyICpzdHIpOwotdm9pZCBFYm1sX1dyaXRlVVRGOChFYm1sR2xvYmFsICpnbG9iLCBjb25zdCB3Y2hhcl90ICp3c3RyKTsKLXZvaWQgRWJtbF9Xcml0ZUlEKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQpOwotdm9pZCBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkNjQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgdWludDY0X3QgdWkpOwotdm9pZCBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVuc2lnbmVkIGxvbmcgdWkpOwotdm9pZCBFYm1sX1NlcmlhbGl6ZUJpbmFyeShFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCB1bnNpZ25lZCBsb25nIHVpKTsKLXZvaWQgRWJtbF9TZXJpYWxpemVGbG9hdChFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCBkb3VibGUgZCk7Ci0vL1RPRE8gbWFrZSB0aGlzIG1vcmUgZ2VuZXJpYyB0byBzaWduZWQKLXZvaWQgRWJtbF9Xcml0ZVNpZ25lZDE2KEVibWxHbG9iYWwgKmdsb2IsIHNob3J0IHZhbCk7Ci12b2lkIEVibWxfU2VyaWFsaXplU3RyaW5nKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIGNvbnN0IGNoYXIgKnMpOwotdm9pZCBFYm1sX1NlcmlhbGl6ZVVURjgoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgd2NoYXJfdCAqcyk7Ci12b2lkIEVibWxfU2VyaWFsaXplRGF0YShFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuZ3RoKTsKLXZvaWQgRWJtbF9Xcml0ZVZvaWQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyB2U2l6ZSk7Ci0vL1RPRE8gbmVlZCBkYXRlIGZ1bmN0aW9uCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm1rdi9XZWJNRWxlbWVudC5jIGIvbGlibWt2L1dlYk1FbGVtZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTkwMjQuLjAwMDAwMDAKLS0tIGEvbGlibWt2L1dlYk1FbGVtZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotCi0KLSNpbmNsdWRlICJFYm1sQnVmZmVyV3JpdGVyLmgiCi0jaW5jbHVkZSAiRWJtbElEcy5oIgotI2luY2x1ZGUgIldlYk1FbGVtZW50LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBrVm9yYmlzUHJpdmF0ZU1heFNpemUgIDQwMDAKLQotdm9pZCB3cml0ZUhlYWRlcihFYm1sR2xvYmFsICpnbG9iKQotewotICAgIEVibWxMb2Mgc3RhcnQ7Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBFQk1MKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEVCTUxWZXJzaW9uLCAxKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEVCTUxSZWFkVmVyc2lvbiwgMSk7IC8vRUJNTCBSZWFkIFZlcnNpb24KLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEVCTUxNYXhJRExlbmd0aCwgNCk7IC8vRUJNTCBNYXggSUQgTGVuZ3RoCi0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBFQk1MTWF4U2l6ZUxlbmd0aCwgOCk7IC8vRUJNTCBNYXggU2l6ZSBMZW5ndGgKLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhnbG9iLCBEb2NUeXBlLCAid2VibSIpOyAvL0RvYyBUeXBlCi0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBEb2NUeXBlVmVyc2lvbiwgMik7IC8vRG9jIFR5cGUgVmVyc2lvbgotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRG9jVHlwZVJlYWRWZXJzaW9uLCAyKTsgLy9Eb2MgVHlwZSBSZWFkIFZlcnNpb24KLSAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0KTsKLX0KLQotdm9pZCB3cml0ZVNpbXBsZUJsb2NrKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGNoYXIgdHJhY2tOdW1iZXIsIHNob3J0IHRpbWVDb2RlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBpc0tleWZyYW1lLCB1bnNpZ25lZCBjaGFyIGxhY2luZ0ZsYWcsIGludCBkaXNjYXJkYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFMZW5ndGgpCi17Ci0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsIFNpbXBsZUJsb2NrKTsKLSAgICB1bnNpZ25lZCBsb25nIGJsb2NrTGVuZ3RoID0gNCArIGRhdGFMZW5ndGg7Ci0gICAgYmxvY2tMZW5ndGggfD0gMHgxMDAwMDAwMDsgLy9UT0RPIGNoZWNrIGxlbmd0aCA8IDB4MEZGRkZGRkZGCi0gICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJmJsb2NrTGVuZ3RoLCA0KTsKLSAgICB0cmFja051bWJlciB8PSAweDgwOyAgLy9UT0RPIGNoZWNrIHRyYWNrIG51Ym1lciA8IDEyOAotICAgIEVibWxfV3JpdGUoZ2xvYiwgJnRyYWNrTnVtYmVyLCAxKTsKLSAgICAvL0VibWxfV3JpdGVTaWduZWQxNihnbG9iLCB0aW1lQ29kZSwyKTsgLy90aGlzIGlzIDMgYnl0ZXMKLSAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmdGltZUNvZGUsIDIpOwotICAgIHVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAweDAwIHwgKGlzS2V5ZnJhbWUgPyAweDgwIDogMHgwMCkgfCAobGFjaW5nRmxhZyA8PCAxKSB8IGRpc2NhcmRhYmxlOwotICAgIEVibWxfV3JpdGUoZ2xvYiwgJmZsYWdzLCAxKTsKLSAgICBFYm1sX1dyaXRlKGdsb2IsIGRhdGEsIGRhdGFMZW5ndGgpOwotfQotCi1zdGF0aWMgVUludDY0IGdlbmVyYXRlVHJhY2tJRCh1bnNpZ25lZCBpbnQgdHJhY2tOdW1iZXIpCi17Ci0gICAgVUludDY0IHQgPSB0aW1lKE5VTEwpICogdHJhY2tOdW1iZXI7Ci0gICAgVUludDY0IHIgPSByYW5kKCk7Ci0gICAgciA9IHIgPDwgMzI7Ci0gICAgciArPSAgcmFuZCgpOwotICAgIFVJbnQ2NCBydmFsID0gdCBeIHI7Ci0gICAgcmV0dXJuIHJ2YWw7Ci19Ci0KLXZvaWQgd3JpdGVWaWRlb1RyYWNrKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGludCB0cmFja051bWJlciwgaW50IGZsYWdMYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyICpjb2RlY0lkLCB1bnNpZ25lZCBpbnQgcGl4ZWxXaWR0aCwgdW5zaWduZWQgaW50IHBpeGVsSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGZyYW1lUmF0ZSkKLXsKLSAgICBFYm1sTG9jIHN0YXJ0OwotICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZzdGFydCwgVHJhY2tFbnRyeSk7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUcmFja051bWJlciwgdHJhY2tOdW1iZXIpOwotICAgIFVJbnQ2NCB0cmFja0lEID0gZ2VuZXJhdGVUcmFja0lEKHRyYWNrTnVtYmVyKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFRyYWNrVUlELCB0cmFja0lEKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhnbG9iLCBDb2RlY05hbWUsICJWUDgiKTsgIC8vVE9ETyBzaG91bGRuJ3QgYmUgZml4ZWQKLQotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tUeXBlLCAxKTsgLy92aWRlbyBpcyBhbHdheXMgMQotICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGdsb2IsIENvZGVjSUQsIGNvZGVjSWQpOwotICAgIHsKLSAgICAgICAgRWJtbExvYyB2aWRlb1N0YXJ0OwotICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmdmlkZW9TdGFydCwgVmlkZW8pOwotICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFBpeGVsV2lkdGgsIHBpeGVsV2lkdGgpOwotICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFBpeGVsSGVpZ2h0LCBwaXhlbEhlaWdodCk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplRmxvYXQoZ2xvYiwgRnJhbWVSYXRlLCBmcmFtZVJhdGUpOwotICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnZpZGVvU3RhcnQpOyAvL1ZpZGVvCi0gICAgfQotICAgIEVibWxfRW5kU3ViRWxlbWVudChnbG9iLCAmc3RhcnQpOyAvL1RyYWNrIEVudHJ5Ci19Ci12b2lkIHdyaXRlQXVkaW9UcmFjayhFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBpbnQgdHJhY2tOdW1iZXIsIGludCBmbGFnTGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgY2hhciAqY29kZWNJZCwgZG91YmxlIHNhbXBsaW5nRnJlcXVlbmN5LCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcml2YXRlLCB1bnNpZ25lZCBsb25nIHByaXZhdGVTaXplKQotewotICAgIEVibWxMb2Mgc3RhcnQ7Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBUcmFja0VudHJ5KTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFRyYWNrTnVtYmVyLCB0cmFja051bWJlcik7Ci0gICAgVUludDY0IHRyYWNrSUQgPSBnZW5lcmF0ZVRyYWNrSUQodHJhY2tOdW1iZXIpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tVSUQsIHRyYWNrSUQpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tUeXBlLCAyKTsgLy9hdWRpbyBpcyBhbHdheXMgMgotICAgIC8vSSBhbSB1c2luZyBkZWZhdWx0cyBmb3IgdGhlc2VkIHJlcXVpcmVkIGZpZWxkcwotICAgIC8qICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEZsYWdFbmFibGVkLCAxKTsKLSAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBGbGFnRGVmYXVsdCwgMSk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRmxhZ0ZvcmNlZCwgMSk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRmxhZ0xhY2luZywgZmxhZ0xhY2luZyk7Ki8KLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhnbG9iLCBDb2RlY0lELCBjb2RlY0lkKTsKLSAgICBFYm1sX1NlcmlhbGl6ZURhdGEoZ2xvYiwgQ29kZWNQcml2YXRlLCBwcml2YXRlLCBwcml2YXRlU2l6ZSk7Ci0KLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhnbG9iLCBDb2RlY05hbWUsICJWT1JCSVMiKTsgIC8vZml4ZWQgZm9yIG5vdwotICAgIHsKLSAgICAgICAgRWJtbExvYyBBdWRpb1N0YXJ0OwotICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmQXVkaW9TdGFydCwgQXVkaW8pOwotICAgICAgICBFYm1sX1NlcmlhbGl6ZUZsb2F0KGdsb2IsIFNhbXBsaW5nRnJlcXVlbmN5LCBzYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgQ2hhbm5lbHMsIGNoYW5uZWxzKTsKLSAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZBdWRpb1N0YXJ0KTsKLSAgICB9Ci0gICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7Ci19Ci12b2lkIHdyaXRlU2VnbWVudEluZm9ybWF0aW9uKEVibWxHbG9iYWwgKmVibWwsIEVibWxMb2MqIHN0YXJ0SW5mbywgdW5zaWduZWQgbG9uZyB0aW1lQ29kZVNjYWxlLCBkb3VibGUgZHVyYXRpb24pCi17Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbCwgc3RhcnRJbmZvLCBJbmZvKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWwsIFRpbWVjb2RlU2NhbGUsIHRpbWVDb2RlU2NhbGUpOwotICAgIEVibWxfU2VyaWFsaXplRmxvYXQoZWJtbCwgU2VnbWVudF9EdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwLjApOyAvL0N1cnJlbnRseSBmaXhlZCB0byB1c2luZyBtaWxsaXNlY29uZHMKLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhlYm1sLCAweDREODAsICJRVG11eGluZ0FwcExpYldlYk0tMC4wLjEiKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhlYm1sLCAweDU3NDEsICJRVHdyaXRpbmdBcHBMaWJXZWJNLTAuMC4xIik7Ci0gICAgRWJtbF9FbmRTdWJFbGVtZW50KGVibWwsIHN0YXJ0SW5mbyk7Ci19Ci0KLS8qCi12b2lkIE1rdl9Jbml0aWFsaXplU2VnbWVudChFYm1sJiBlYm1sX291dCwgRWJtbExvYyYgZWJtbExvYykKLXsKLSAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sX291dCwgZWJtbExvYywgMHgxODUzODA2Nyk7Ci19Ci0KLXZvaWQgTWt2X0luaXRpYWxpemVTZWVrKEVibWwmIGVibWxfb3V0LCBFYm1sTG9jJiBlYm1sTG9jKQotewotICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCBlYm1sTG9jLCAweDExNGQ5Yjc0KTsKLX0KLXZvaWQgTWt2X1dyaXRlU2Vla0luZm9ybWF0aW9uKEVibWwmIGVibWxfb3V0LCBTZWVrU3RydWN0JiBzZWVrSW5mb3JtYXRpb24pCi17Ci0gICAgRWJtbExvYyBlYm1sTG9jOwotICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCBlYm1sTG9jLCAweDRkYmIpOwotICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGVibWxfb3V0LCAweDUzYWIsIHNlZWtJbmZvcm1hdGlvbi5TZWVrSUQpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NTNhYywgc2Vla0luZm9ybWF0aW9uLlNlZWtQb3NpdGlvbik7Ci0gICAgRWJtbF9FbmRTdWJFbGVtZW50KGVibWxfb3V0LCBlYm1sTG9jKTsKLX0KLQotdm9pZCBNa3ZfV3JpdGVTZWdtZW50SW5mb3JtYXRpb24oRWJtbCYgZWJtbF9vdXQsIFNlZ21lbnRJbmZvcm1hdGlvblN0cnVjdCYgc2VnbWVudEluZm9ybWF0aW9uKQotewotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NzNhNCwgc2VnbWVudEluZm9ybWF0aW9uLnNlZ21lbnRVSUQpOwotICAgIGlmIChzZWdtZW50SW5mb3JtYXRpb24uZmlsZW5hbWUgIT0gMCkKLSAgICAgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZWJtbF9vdXQsIDB4NzM4NCwgc2VnbWVudEluZm9ybWF0aW9uLmZpbGVuYW1lKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDJBRDdCMSwgc2VnbWVudEluZm9ybWF0aW9uLlRpbWVjb2RlU2NhbGUpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NDQ4OSwgc2VnbWVudEluZm9ybWF0aW9uLkR1cmF0aW9uKTsKLSAgICAvL1RPRE8gZGF0ZQotICAgIEVibWxfU2VyaWFsaXplV1N0cmluZyhlYm1sX291dCwgMHg0RDgwLCBMIk1LVk1VWCIpOwotICAgIEVibWxfU2VyaWFsaXplV1N0cmluZyhlYm1sX291dCwgMHg1NzQxLCBzZWdtZW50SW5mb3JtYXRpb24uV3JpdGluZ0FwcCk7Ci19Ci0KLXZvaWQgTWt2X0luaXRpYWxpemVUcmFjayhFYm1sJiBlYm1sX291dCwgRWJtbExvYyYgZWJtbExvYykKLXsKLSAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sX291dCwgZWJtbExvYywgMHgxNjU0QUU2Qik7Ci19Ci0KLXN0YXRpYyB2b2lkIE1rdl9Xcml0ZUdlbmVyaWNUcmFja0RhdGEoRWJtbCYgZWJtbF9vdXQsIFRyYWNrU3RydWN0JiB0cmFjaykKLXsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweEQ3LCB0cmFjay5UcmFja051bWJlcik7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg3M0M1LCB0cmFjay5UcmFja1VJRCk7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg4MywgdHJhY2suVHJhY2tUeXBlKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweEI5LCB0cmFjay5GbGFnRW5hYmxlZCA/IDEgOjApOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4ODgsIHRyYWNrLkZsYWdEZWZhdWx0ID8gMSA6MCk7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg1NUFBLCB0cmFjay5GbGFnRm9yY2VkID8gMSA6MCk7Ci0gICAgaWYgKHRyYWNrLkxhbmd1YWdlICE9IDApCi0gICAgICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGVibWxfb3V0LCAweDIyQjU5QywgdHJhY2suTGFuZ3VhZ2UpOwotICAgIGlmICh0cmFjay5Db2RlY0lEICE9IDApCi0gICAgICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGVibWxfb3V0LCAweDg2LCB0cmFjay5Db2RlY0lEKTsKLSAgICBpZiAodHJhY2suQ29kZWNQcml2YXRlICE9IDApCi0gICAgICAgIEVibWxfU2VyaWFsaXplRGF0YShlYm1sX291dCwgMHg2M0EyLCB0cmFjay5Db2RlY1ByaXZhdGUsIHRyYWNrLkNvZGVjUHJpdmF0ZUxlbmd0aCk7Ci0gICAgaWYgKHRyYWNrLkNvZGVjTmFtZSAhPSAwKQotICAgICAgICBFYm1sX1NlcmlhbGl6ZVdTdHJpbmcoZWJtbF9vdXQsIDB4MjU4Njg4LCB0cmFjay5Db2RlY05hbWUpOwotfQotCi12b2lkIE1rdl9Xcml0ZVZpZGVvVHJhY2soRWJtbCYgZWJtbF9vdXQsIFRyYWNrU3RydWN0ICYgdHJhY2ssIFZpZGVvVHJhY2tTdHJ1Y3QmIHZpZGVvKQotewotICAgIEVibWxMb2MgdHJhY2tIZWFkTG9jLCB2aWRlb0hlYWRMb2M7Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIHRyYWNrSGVhZExvYywgMHhBRSk7ICAvL3N0YXJ0IFRyYWNrCi0gICAgTWt2X1dyaXRlR2VuZXJpY1RyYWNrRGF0YShlYm1sX291dCwgdHJhY2spOwotICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCB2aWRlb0hlYWRMb2MsIDB4RTApOyAgLy9zdGFydCBWaWRlbwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4OUEsIHZpZGVvLkZsYWdJbnRlcmxhY2VkID8gMSA6MCk7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHhCMCwgdmlkZW8uUGl4ZWxXaWR0aCk7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHhCQSwgdmlkZW8uUGl4ZWxIZWlnaHQpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NTRCMCwgdmlkZW8uUGl4ZWxEaXNwbGF5V2lkdGgpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NTRCQSwgdmlkZW8uUGl4ZWxEaXNwbGF5SGVpZ2h0KTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDU0QjIsIHZpZGVvLmRpc3BsYXlVbml0KTsKLSAgICBFYm1sX1NlcmlhbGl6ZUZsb2F0KGVibWxfb3V0LCAweDIzODNFMywgdmlkZW8uRnJhbWVSYXRlKTsKLSAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbF9vdXQsIHZpZGVvSGVhZExvYyk7Ci0gICAgRWJtbF9FbmRTdWJFbGVtZW50KGVibWxfb3V0LCB0cmFja0hlYWRMb2MpOwotCi19Ci0KLXZvaWQgTWt2X1dyaXRlQXVkaW9UcmFjayhFYm1sJiBlYm1sX291dCwgVHJhY2tTdHJ1Y3QgJiB0cmFjaywgQXVkaW9UcmFja1N0cnVjdCYgdmlkZW8pCi17Ci0gICAgRWJtbExvYyB0cmFja0hlYWRMb2MsIGF1ZGlvSGVhZExvYzsKLSAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sX291dCwgdHJhY2tIZWFkTG9jLCAweEFFKTsKLSAgICBNa3ZfV3JpdGVHZW5lcmljVHJhY2tEYXRhKGVibWxfb3V0LCB0cmFjayk7Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIGF1ZGlvSGVhZExvYywgMHhFMCk7ICAvL3N0YXJ0IEF1ZGlvCi0gICAgRWJtbF9TZXJpYWxpemVGbG9hdChlYm1sX291dCwgMHhCNSwgdmlkZW8uU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4OUYsIHZpZGVvLkNoYW5uZWxzKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDYyNjQsIHZpZGVvLkJpdERlcHRoKTsKLSAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbF9vdXQsIGF1ZGlvSGVhZExvYyk7IC8vIGVuZCBhdWRpbwotICAgIEVibWxfRW5kU3ViRWxlbWVudChlYm1sX291dCwgdHJhY2tIZWFkTG9jKTsKLX0KLQotdm9pZCBNa3ZfV3JpdGVFYm1sQ2x1c3RlckhlYWQoRWJtbCYgZWJtbF9vdXQsICBFYm1sTG9jJiBlYm1sTG9jLCBDbHVzdGVySGVhZFN0cnVjdCAmIGNsdXN0ZXJIZWFkKQotewotICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCBlYm1sTG9jLCAweDFGNDNCNjc1KTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDYyNjQsIGNsdXN0ZXJIZWFkLlRpbWVDb2RlKTsKLX0KLQotdm9pZCBNa3ZfV3JpdGVTaW1wbGVCbG9ja0hlYWQoRWJtbCYgZWJtbF9vdXQsICBFYm1sTG9jJiBlYm1sTG9jLCBTaW1wbGVCbG9ja1N0cnVjdCYgYmxvY2spCi17Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIGVibWxMb2MsIDB4QTMpOwotICAgIEVibWxfV3JpdGUxVUludChlYm1sX291dCwgYmxvY2suVHJhY2tOdW1iZXIpOwotICAgIEVibWxfV3JpdGVTaWduZWQxNihlYm1sX291dCxibG9jay5UaW1lQ29kZSk7Ci0gICAgdW5zaWduZWQgY2hhciBmbGFncyA9IDB4MDAgfCAoYmxvY2suaXNrZXkgPyAweDgwOjB4MDApIHwgKGJsb2NrLmxhY2luZyA8PCAxKSB8IGJsb2NrLmRpc2NhcmRhYmxlOwotICAgIEVibWxfV3JpdGUxVUludChlYm1sX291dCwgZmxhZ3MpOyAgLy9UT0RPIHRoaXMgbWF5IGJlIHRoZSB3cm9uZyBmdW5jdGlvbgotICAgIEVibWxfU2VyaWFsaXplKGVibWxfb3V0LCBibG9jay5kYXRhLCBibG9jay5kYXRhTGVuZ3RoKTsKLSAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbF9vdXQsZWJtbExvYyk7Ci19Ci0qLwpkaWZmIC0tZ2l0IGEvbGlicy5tayBiL2xpYnMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjdmNDkuLjAwMDAwMDAKLS0tIGEvbGlicy5taworKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0jIwotIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIwotIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0jIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotIyMKLQotCi0jIEFSTSBhc3NlbWJseSBmaWxlcyBhcmUgd3JpdHRlbiBpbiBSVkNULXN0eWxlLiBXZSB1c2Ugc29tZSBtYWtlIG1hZ2ljIHRvCi0jIGZpbHRlciB0aG9zZSBmaWxlcyB0byBhbGxvdyBHQ0MgY29tcGlsYXRpb24KLWlmZXEgKCQoQVJDSF9BUk0pLHllcykKLSAgQVNNOj0kKGlmICQoZmlsdGVyIHllcywkKENPTkZJR19HQ0MpKSwuYXNtLnMsLmFzbSkKLWVsc2UKLSAgQVNNOj0uYXNtCi1lbmRpZgotCi1DT0RFQ19TUkNTLXllcyArPSBsaWJzLm1rCi0KLWluY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS92cHgvdnB4X2NvZGVjLm1rCi1DT0RFQ19TUkNTLXllcyArPSAkKGFkZHByZWZpeCB2cHgvLCQoY2FsbCBlbmFibGVkLEFQSV9TUkNTKSkKLQotaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpL3ZweF9tZW0vdnB4X21lbS5tawotQ09ERUNfU1JDUy15ZXMgKz0gJChhZGRwcmVmaXggdnB4X21lbS8sJChjYWxsIGVuYWJsZWQsTUVNX1NSQ1MpKQotCi1pbmNsdWRlICQoU1JDX1BBVEhfQkFSRSkvdnB4X3NjYWxlL3ZweF9zY2FsZS5tawotQ09ERUNfU1JDUy15ZXMgKz0gJChhZGRwcmVmaXggdnB4X3NjYWxlLywkKGNhbGwgZW5hYmxlZCxTQ0FMRV9TUkNTKSkKLQotCi1pZmVxICgkKENPTkZJR19WUDhfRU5DT0RFUikseWVzKQotICBWUDhfUFJFRklYPXZwOC8KLSAgaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCl2cDhjeC5tawotICBDT0RFQ19TUkNTLXllcyArPSAkKGFkZHByZWZpeCAkKFZQOF9QUkVGSVgpLCQoY2FsbCBlbmFibGVkLFZQOF9DWF9TUkNTKSkKLSAgQ09ERUNfRVhQT1JUUy15ZXMgKz0gJChhZGRwcmVmaXggJChWUDhfUFJFRklYKSwkKFZQOF9DWF9FWFBPUlRTKSkKLSAgQ09ERUNfU1JDUy15ZXMgKz0gJChWUDhfUFJFRklYKXZwOGN4Lm1rIHZweC92cDguaCB2cHgvdnA4Y3guaCB2cHgvdnA4ZS5oCi0gIElOU1RBTEwtTElCUy15ZXMgKz0gaW5jbHVkZS92cHgvdnA4LmggaW5jbHVkZS92cHgvdnA4ZS5oIGluY2x1ZGUvdnB4L3ZwOGN4LmgKLSAgSU5TVEFMTF9NQVBTICs9IGluY2x1ZGUvdnB4LyUgJChTUkNfUEFUSF9CQVJFKS8kKFZQOF9QUkVGSVgpLyUKLSAgQ09ERUNfRE9DX1NSQ1MgKz0gdnB4L3ZwOC5oIHZweC92cDhjeC5oCi0gIENPREVDX0RPQ19TRUNUSU9OUyArPSB2cDggdnA4X2VuY29kZXIKLWVuZGlmCi0KLWlmZXEgKCQoQ09ORklHX1ZQOF9ERUNPREVSKSx5ZXMpCi0gIFZQOF9QUkVGSVg9dnA4LwotICBpbmNsdWRlICQoU1JDX1BBVEhfQkFSRSkvJChWUDhfUFJFRklYKXZwOGR4Lm1rCi0gIENPREVDX1NSQ1MteWVzICs9ICQoYWRkcHJlZml4ICQoVlA4X1BSRUZJWCksJChjYWxsIGVuYWJsZWQsVlA4X0RYX1NSQ1MpKQotICBDT0RFQ19FWFBPUlRTLXllcyArPSAkKGFkZHByZWZpeCAkKFZQOF9QUkVGSVgpLCQoVlA4X0RYX0VYUE9SVFMpKQotICBDT0RFQ19TUkNTLXllcyArPSAkKFZQOF9QUkVGSVgpdnA4ZHgubWsgdnB4L3ZwOC5oIHZweC92cDhkeC5oCi0gIElOU1RBTEwtTElCUy15ZXMgKz0gaW5jbHVkZS92cHgvdnA4LmggaW5jbHVkZS92cHgvdnA4ZHguaAotICBJTlNUQUxMX01BUFMgKz0gaW5jbHVkZS92cHgvJSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCkvJQotICBDT0RFQ19ET0NfU1JDUyArPSB2cHgvdnA4LmggdnB4L3ZwOGR4LmgKLSAgQ09ERUNfRE9DX1NFQ1RJT05TICs9IHZwOCB2cDhfZGVjb2RlcgotZW5kaWYKLQotCi1pZmVxICgkKENPTkZJR19FTkNPREVSUykseWVzKQotICBDT0RFQ19ET0NfU0VDVElPTlMgKz0gZW5jb2RlcgotZW5kaWYKLWlmZXEgKCQoQ09ORklHX0RFQ09ERVJTKSx5ZXMpCi0gIENPREVDX0RPQ19TRUNUSU9OUyArPSBkZWNvZGVyCi1lbmRpZgotCi0KLWlmZXEgKCQoQ09ORklHX01TVlMpLHllcykKLUNPREVDX0xJQj0kKGlmICQoQ09ORklHX1NUQVRJQ19NU1ZDUlQpLHZweG10LHZweG1kKQotIyBUaGlzIHZhcmlhYmxlIHVzZXMgZGVmZXJyZWQgZXhwYW5zaW9uIGludGVudGlvbmFsbHksIHNpbmNlIHRoZSByZXN1bHRzIG9mCi0jICQod2lsZGNhcmQpIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIE1ha2UuCi1WU19QTEFURk9STVMgPSAkKGZvcmVhY2ggZCwkKHdpbGRjYXJkICovUmVsZWFzZS8kKENPREVDX0xJQikubGliKSwkKHdvcmQgMSwkKHN1YnN0IC8sICwkKGQpKSkpCi1lbmRpZgotCi0jIFRoZSBmb2xsb3dpbmcgcGFpcnMgZGVmaW5lIGEgbWFwcGluZyBvZiBsb2NhdGlvbnMgaW4gdGhlIGRpc3RyaWJ1dGlvbgotIyB0cmVlIHRvIGxvY2F0aW9ucyBpbiB0aGUgc291cmNlL2J1aWxkIHRyZWVzLgotSU5TVEFMTF9NQVBTICs9IGluY2x1ZGUvdnB4LyUgJChTUkNfUEFUSF9CQVJFKS92cHgvJQotSU5TVEFMTF9NQVBTICs9IGluY2x1ZGUvdnB4LyUgJChTUkNfUEFUSF9CQVJFKS92cHhfcG9ydHMvJQotSU5TVEFMTF9NQVBTICs9ICQoTElCU1VCRElSKS8lICAgICAlCi1JTlNUQUxMX01BUFMgKz0gc3JjLyUgICAgICQoU1JDX1BBVEhfQkFSRSkvJQotaWZlcSAoJChDT05GSUdfTVNWUykseWVzKQotSU5TVEFMTF9NQVBTICs9ICQoZm9yZWFjaCBwLCQoVlNfUExBVEZPUk1TKSwkKExJQlNVQkRJUikvJChwKS8lICAkKHApL1JlbGVhc2UvJSkKLUlOU1RBTExfTUFQUyArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChMSUJTVUJESVIpLyQocCkvJSAgJChwKS9EZWJ1Zy8lKQotZW5kaWYKLQotIyBJZiB0aGlzIGlzIGEgdW5pdmVyc2FsIChmYXQpIGJpbmFyeSwgdGhlbiBhbGwgdGhlIHN1YmFyY2hpdGVjdHVyZXMgaGF2ZQotIyBhbHJlYWR5IGJlZW4gYnVpbHQgYW5kIG91ciBqb2IgaXMgdG8gc3RpdGNoIHRoZW0gdG9nZXRoZXIuIFRoZQotIyBCVUlMRF9MSUJWUFggdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIGJ1aWxkaW5nCi0jIChjb21waWxpbmcsIGxpbmtpbmcpIHRoZSBsaWJyYXJ5LiBUaGUgTElQT19MSUJWUFggdmFyaWFibGUgaW5kaWNhdGVzCi0jIHRoYXQgd2UncmUgc3RpdGNoaW5nLgotJChldmFsICQoaWYgJChmaWx0ZXIgdW5pdmVyc2FsJSwkKFRPT0xDSEFJTikpLExJUE9fTElCVlBYLEJVSUxEX0xJQlZQWCk6PXllcykKLQotQ09ERUNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gYnVpbGQvbWFrZS92ZXJzaW9uLnNoCi1DT0RFQ19TUkNTLSQoQlVJTERfTElCVlBYKSArPSB2cHgvdnB4X2ludGVnZXIuaAotQ09ERUNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gdnB4X3BvcnRzL3ZweF90aW1lci5oCi1DT0RFQ19TUkNTLSQoQlVJTERfTElCVlBYKSArPSB2cHhfcG9ydHMvbWVtLmgKLUNPREVDX1NSQ1MtJChCVUlMRF9MSUJWUFgpICs9ICQoQlVJTERfUEZYKXZweF9jb25maWcuYwotSU5TVEFMTC1TUkNTLW5vICs9ICQoQlVJTERfUEZYKXZweF9jb25maWcuYwotaWZlcSAoJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSx5ZXMpCi1DT0RFQ19TUkNTLSQoQlVJTERfTElCVlBYKSArPSB2cHhfcG9ydHMvZW1tcy5hc20KLUNPREVDX1NSQ1MtJChCVUlMRF9MSUJWUFgpICs9IHZweF9wb3J0cy94ODYuaAotQ09ERUNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gdnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20KLUNPREVDX1NSQ1MtJChCVUlMRF9MSUJWUFgpICs9IHZweF9wb3J0cy94ODZfY3B1aWQuYwotZW5kaWYKLUNPREVDX1NSQ1MtJChBUkNIX0FSTSkgKz0gdnB4X3BvcnRzL2FybV9jcHVkZXRlY3QuYwotQ09ERUNfU1JDUy0kKEFSQ0hfQVJNKSArPSAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmFzbQotQ09ERUNfRVhQT1JUUy0kKEJVSUxEX0xJQlZQWCkgKz0gdnB4L2V4cG9ydHNfY29tCi1DT0RFQ19FWFBPUlRTLSQoQ09ORklHX0VOQ09ERVJTKSArPSB2cHgvZXhwb3J0c19lbmMKLUNPREVDX0VYUE9SVFMtJChDT05GSUdfREVDT0RFUlMpICs9IHZweC9leHBvcnRzX2RlYwotCi1JTlNUQUxMLUxJQlMteWVzICs9IGluY2x1ZGUvdnB4L3ZweF9jb2RlYy5oCi1JTlNUQUxMLUxJQlMteWVzICs9IGluY2x1ZGUvdnB4L3ZweF9pbWFnZS5oCi1JTlNUQUxMLUxJQlMteWVzICs9IGluY2x1ZGUvdnB4L3ZweF9pbnRlZ2VyLmgKLUlOU1RBTEwtTElCUy15ZXMgKz0gaW5jbHVkZS92cHgvdnB4X2NvZGVjX2ltcGxfdG9wLmgKLUlOU1RBTEwtTElCUy15ZXMgKz0gaW5jbHVkZS92cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgKLUlOU1RBTEwtTElCUy0kKENPTkZJR19ERUNPREVSUykgKz0gaW5jbHVkZS92cHgvdnB4X2RlY29kZXIuaAotSU5TVEFMTC1MSUJTLSQoQ09ORklHX0RFQ09ERVJTKSArPSBpbmNsdWRlL3ZweC92cHhfZGVjb2Rlcl9jb21wYXQuaAotSU5TVEFMTC1MSUJTLSQoQ09ORklHX0VOQ09ERVJTKSArPSBpbmNsdWRlL3ZweC92cHhfZW5jb2Rlci5oCi1pZmVxICgkKENPTkZJR19FWFRFUk5BTF9CVUlMRCkseWVzKQotaWZlcSAoJChDT05GSUdfTVNWUykseWVzKQotSU5TVEFMTC1MSUJTLXllcyAgICAgICAgICAgICAgICAgICs9ICQoZm9yZWFjaCBwLCQoVlNfUExBVEZPUk1TKSwkKExJQlNVQkRJUikvJChwKS8kKENPREVDX0xJQikubGliKQotSU5TVEFMTC1MSUJTLSQoQ09ORklHX0RFQlVHX0xJQlMpICs9ICQoZm9yZWFjaCBwLCQoVlNfUExBVEZPUk1TKSwkKExJQlNVQkRJUikvJChwKS8kKENPREVDX0xJQilkLmxpYikKLUlOU1RBTEwtTElCUy0kKENPTkZJR19TSEFSRUQpICs9ICQoZm9yZWFjaCBwLCQoVlNfUExBVEZPUk1TKSwkKExJQlNVQkRJUikvJChwKS92cHguZGxsKQotSU5TVEFMTC1MSUJTLSQoQ09ORklHX1NIQVJFRCkgKz0gJChmb3JlYWNoIHAsJChWU19QTEFURk9STVMpLCQoTElCU1VCRElSKS8kKHApL3ZweC5leHApCi1lbmRpZgotZWxzZQotSU5TVEFMTC1MSUJTLXllcyArPSAkKExJQlNVQkRJUikvbGlidnB4LmEKLUlOU1RBTEwtTElCUy0kKENPTkZJR19ERUJVR19MSUJTKSArPSAkKExJQlNVQkRJUikvbGlidnB4X2cuYQotZW5kaWYKLQotQ09ERUNfU1JDUz0kKGNhbGwgZW5hYmxlZCxDT0RFQ19TUkNTKQotSU5TVEFMTC1TUkNTLSQoQ09ORklHX0NPREVDX1NSQ1MpICs9ICQoQ09ERUNfU1JDUykKLUlOU1RBTEwtU1JDUy0kKENPTkZJR19DT0RFQ19TUkNTKSArPSAkKGNhbGwgZW5hYmxlZCxDT0RFQ19FWFBPUlRTKQotCi1pZmVxICgkKENPTkZJR19FWFRFUk5BTF9CVUlMRCkseWVzKQotaWZlcSAoJChDT05GSUdfTVNWUykseWVzKQotCi1vYmpfaW50X2V4dHJhY3QudmNwcm9qOiAkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2Uvb2JqX2ludF9leHRyYWN0LmMKLQlAY3AgJChTUkNfUEFUSF9CQVJFKS9idWlsZC94ODYtbXN2cy9vYmpfaW50X2V4dHJhY3QuYmF0IC4KLQlAZWNobyAiICAgIFtDUkVBVEVdICRAIgotCSQoU1JDX1BBVEhfQkFSRSkvYnVpbGQvbWFrZS9nZW5fbXN2c19wcm9qLnNoIFwKLSAgICAtLWV4ZSBcCi0gICAgLS10YXJnZXQ9JChUT09MQ0hBSU4pIFwKLSAgICAtLW5hbWU9b2JqX2ludF9leHRyYWN0IFwKLSAgICAtLXZlcj0kKENPTkZJR19WU19WRVJTSU9OKSBcCi0gICAgLS1wcm9qLWd1aWQ9RTEzNjBDNjUtRDM3NS00MzM1LTgwNTctN0VEOTlDQzNGOUIyIFwKLSAgICAkKGlmICQoQ09ORklHX1NUQVRJQ19NU1ZDUlQpLC0tc3RhdGljLWNydCkgXAotICAgIC0tb3V0PSRAICReIFwKLSAgICAtSS4gXAotICAgIC1JIiQoU1JDX1BBVEhfQkFSRSkiIFwKLQotUFJPSkVDVFMtJChCVUlMRF9MSUJWUFgpICs9IG9ial9pbnRfZXh0cmFjdC52Y3Byb2oKLVBST0pFQ1RTLSQoQlVJTERfTElCVlBYKSArPSBvYmpfaW50X2V4dHJhY3QuYmF0Ci0KLXZweC5kZWY6ICQoY2FsbCBlbmFibGVkLENPREVDX0VYUE9SVFMpCi0JQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKLQkkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2UvZ2VuX21zdnNfZGVmLnNoXAotICAgICAgICAgICAgLS1uYW1lPXZweFwKLSAgICAgICAgICAgIC0tb3V0PSRAICReCi1DTEVBTi1PQkpTICs9IHZweC5kZWYKLQotdnB4LnZjcHJvajogJChDT0RFQ19TUkNTKSB2cHguZGVmCi0JQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKLQkkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2UvZ2VuX21zdnNfcHJvai5zaCBcCi0JCQktLWxpYiBcCi0JCQktLXRhcmdldD0kKFRPT0xDSEFJTikgXAotICAgICAgICAgICAgJChpZiAkKENPTkZJR19TVEFUSUNfTVNWQ1JUKSwtLXN0YXRpYy1jcnQpIFwKLSAgICAgICAgICAgIC0tbmFtZT12cHggXAotICAgICAgICAgICAgLS1wcm9qLWd1aWQ9RENFMTlEQUYtNjlBQy00NkRCLUIxNEEtMzlGMEZBQTVEQjc0IFwKLSAgICAgICAgICAgIC0tbW9kdWxlLWRlZj12cHguZGVmIFwKLSAgICAgICAgICAgIC0tdmVyPSQoQ09ORklHX1ZTX1ZFUlNJT04pIFwKLSAgICAgICAgICAgIC0tb3V0PSRAICQoQ0ZMQUdTKSAkXiBcCi0gICAgICAgICAgICAtLXNyYy1wYXRoLWJhcmU9IiQoU1JDX1BBVEhfQkFSRSkiIFwKLQotUFJPSkVDVFMtJChCVUlMRF9MSUJWUFgpICs9IHZweC52Y3Byb2oKLQotdnB4LnZjcHJvajogdnB4X2NvbmZpZy5hc20KLQotZW5kaWYKLWVsc2UKLUxJQlZQWF9PQkpTPSQoY2FsbCBvYmpzLCQoQ09ERUNfU1JDUykpCi1PQkpTLSQoQlVJTERfTElCVlBYKSArPSAkKExJQlZQWF9PQkpTKQotTElCUy0kKEJVSUxEX0xJQlZQWCkgKz0gJChCVUlMRF9QRlgpbGlidnB4LmEgJChCVUlMRF9QRlgpbGlidnB4X2cuYQotJChCVUlMRF9QRlgpbGlidnB4X2cuYTogJChMSUJWUFhfT0JKUykKLQotQlVJTERfTElCVlBYX1NPICAgICAgICAgOj0gJChpZiAkKEJVSUxEX0xJQlZQWCksJChDT05GSUdfU0hBUkVEKSkKLUxJQlZQWF9TTyAgICAgICAgICAgICAgIDo9IGxpYnZweC5zby4kKFZFUlNJT05fTUFKT1IpLiQoVkVSU0lPTl9NSU5PUikuJChWRVJTSU9OX1BBVENIKQotTElCUy0kKEJVSUxEX0xJQlZQWF9TTykgKz0gJChCVUlMRF9QRlgpJChMSUJWUFhfU08pCi0kKEJVSUxEX1BGWCkkKExJQlZQWF9TTyk6ICQoTElCVlBYX09CSlMpIGxpYnZweC52ZXIKLSQoQlVJTERfUEZYKSQoTElCVlBYX1NPKTogZXh0cmFsaWJzICs9IC1sbSAtcHRocmVhZAotJChCVUlMRF9QRlgpJChMSUJWUFhfU08pOiBTT05BTUUgPSBsaWJ2cHguc28uJChWRVJTSU9OX01BSk9SKQotJChCVUlMRF9QRlgpJChMSUJWUFhfU08pOiBTT19WRVJTSU9OX1NDUklQVCA9IGxpYnZweC52ZXIKLUxJQlZQWF9TT19TWU1MSU5LUyAgICAgIDo9ICQoYWRkcHJlZml4ICQoTElCU1VCRElSKS8sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlidnB4LnNvIGxpYnZweC5zby4kKFZFUlNJT05fTUFKT1IpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlidnB4LnNvLiQoVkVSU0lPTl9NQUpPUikuJChWRVJTSU9OX01JTk9SKSkKLQotbGlidnB4LnZlcjogJChjYWxsIGVuYWJsZWQsQ09ERUNfRVhQT1JUUykKLQlAZWNobyAiICAgIFtDUkVBVEVdICRAIgotCSQocWV4ZWMpZWNobyAieyBnbG9iYWw6IiA+ICRACi0JJChxZXhlYylmb3IgZiBpbiAkPzsgZG8gYXdrICd7cHJpbnQgJCQyIjsifScgPCAkJGYgPj4kQDsgZG9uZQotCSQocWV4ZWMpZWNobyAibG9jYWw6ICo7IH07IiA+PiAkQAotQ0xFQU4tT0JKUyArPSBsaWJ2cHgudmVyCi0KLSQoYWRkcHJlZml4ICQoRElTVF9ESVIpLywkKExJQlZQWF9TT19TWU1MSU5LUykpOgotCUBlY2hvICIgICAgW0xOXSAgICAgICRAIgotCSQocWV4ZWMpbG4gLXNmICQoTElCVlBYX1NPKSAkQAotCi1JTlNUQUxMLUxJQlMtJChDT05GSUdfU0hBUkVEKSArPSAkKExJQlZQWF9TT19TWU1MSU5LUykKLUlOU1RBTEwtTElCUy0kKENPTkZJR19TSEFSRUQpICs9ICQoTElCU1VCRElSKS8kKExJQlZQWF9TTykKLQotTElCUy0kKEJVSUxEX0xJQlZQWCkgKz0gdnB4LnBjCi12cHgucGM6IGNvbmZpZy5tayBsaWJzLm1rCi0JQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKLQkkKHFleGVjKWVjaG8gJyMgcGtnLWNvbmZpZyBmaWxlIGZyb20gbGlidnB4ICQoVkVSU0lPTl9TVFJJTkcpJyA+ICRACi0JJChxZXhlYyllY2hvICdwcmVmaXg9JChQUkVGSVgpJyA+PiAkQAotCSQocWV4ZWMpZWNobyAnZXhlY19wcmVmaXg9JCR7cHJlZml4fScgPj4gJEAKLQkkKHFleGVjKWVjaG8gJ2xpYmRpcj0kJHtwcmVmaXh9L2xpYicgPj4gJEAKLQkkKHFleGVjKWVjaG8gJ2luY2x1ZGVkaXI9JCR7cHJlZml4fS9pbmNsdWRlJyA+PiAkQAotCSQocWV4ZWMpZWNobyAnJyA+PiAkQAotCSQocWV4ZWMpZWNobyAnTmFtZTogdnB4JyA+PiAkQAotCSQocWV4ZWMpZWNobyAnRGVzY3JpcHRpb246IFdlYk0gUHJvamVjdCBWUHggY29kZWMgaW1wbGVtZW50YXRpb24nID4+ICRACi0JJChxZXhlYyllY2hvICdWZXJzaW9uOiAkKFZFUlNJT05fTUFKT1IpLiQoVkVSU0lPTl9NSU5PUikuJChWRVJTSU9OX1BBVENIKScgPj4gJEAKLQkkKHFleGVjKWVjaG8gJ1JlcXVpcmVzOicgPj4gJEAKLQkkKHFleGVjKWVjaG8gJ0NvbmZsaWN0czonID4+ICRACi0JJChxZXhlYyllY2hvICdMaWJzOiAtTCQke2xpYmRpcn0gLWx2cHgnID4+ICRACi0JJChxZXhlYyllY2hvICdDZmxhZ3M6IC1JJCR7aW5jbHVkZWRpcn0nID4+ICRACi1JTlNUQUxMLUxJQlMteWVzICs9ICQoTElCU1VCRElSKS9wa2djb25maWcvdnB4LnBjCi1JTlNUQUxMX01BUFMgKz0gJChMSUJTVUJESVIpL3BrZ2NvbmZpZy8lLnBjICUucGMKLUNMRUFOLU9CSlMgKz0gdnB4LnBjCi1lbmRpZgotCi1MSUJTLSQoTElQT19MSUJWUFgpICs9IGxpYnZweC5hCi0kKGV2YWwgJChpZiAkKExJUE9fTElCVlBYKSwkKGNhbGwgbGlwb19saWJfdGVtcGxhdGUsbGlidnB4LmEpKSkKLQotIwotIyBSdWxlIHRvIG1ha2UgYXNzZW1ibGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmcm9tIEMgY29uZmlndXJhdGlvbiBmaWxlCi0jCi1pZmVxICgkKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpLHllcykKLSMgWUFTTQotJChCVUlMRF9QRlgpdnB4X2NvbmZpZy5hc206ICQoQlVJTERfUEZYKXZweF9jb25maWcuaAotCUBlY2hvICIgICAgW0NSRUFURV0gJEAiCi0JQGVncmVwICIjZGVmaW5lIFtBLVowLTlfXSsgWzAxXSIgJDwgXAotCSAgICB8IGF3ayAne3ByaW50ICQkMiAiIGVxdSAiICQkM30nID4gJEAKLWVsc2UKLUFEUzJHQVM9JChpZiAkKGZpbHRlciB5ZXMsJChDT05GSUdfR0NDKSksfCAkKEFTTV9DT05WRVJTSU9OKSkKLSQoQlVJTERfUEZYKXZweF9jb25maWcuYXNtOiAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmgKLQlAZWNobyAiICAgIFtDUkVBVEVdICRAIgotCUBlZ3JlcCAiI2RlZmluZSBbQS1aMC05X10rIFswMV0iICQ8IFwKLQkgICAgfCBhd2sgJ3twcmludCAkJDIgIiBFUVUgIiAkJDN9JyAkKEFEUzJHQVMpID4gJEAKLQlAZWNobyAiICAgICAgICBFTkQiICQoQURTMkdBUykgPj4gJEAKLUNMRUFOLU9CSlMgKz0gJChCVUlMRF9QRlgpdnB4X2NvbmZpZy5hc20KLWVuZGlmCi0KLSMKLSMgQWRkIGFzc2VtYmxlciBkZXBlbmRlbmNpZXMgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIG9mZnNldHMKLSMKLSQoZmlsdGVyICUucy5vLCQoT0JKUy15ZXMpKTogICAgICQoQlVJTERfUEZYKXZweF9jb25maWcuYXNtCi0kKGZpbHRlciAlJChBU00pLm8sJChPQkpTLXllcykpOiAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmFzbQotCi0jCi0jIENhbGN1bGF0ZSBwbGF0Zm9ybS0gYW5kIGNvbXBpbGVyLXNwZWNpZmljIG9mZnNldHMgZm9yIGhhbmQgY29kZWQgYXNzZW1ibHkKLSMKLWlmZXEgKCQoQ09ORklHX0VYVEVSTkFMX0JVSUxEKSwpICMgVmlzdWFsIFN0dWRpbyB1c2VzIG9ial9pbnRfZXh0cmFjdC5iYXQKLSAgaWZlcSAoJChBUkNIX0FSTSksIHllcykKLSAgICBhc21fY29tX29mZnNldHMuYXNtOiBvYmpfaW50X2V4dHJhY3QKLSAgICBhc21fY29tX29mZnNldHMuYXNtOiAkKFZQOF9QUkVGSVgpY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jLm8KLQkuL29ial9pbnRfZXh0cmFjdCBydmRzICQ8ICQoQURTMkdBUykgPiAkQAotICAgIE9CSlMteWVzICs9ICQoVlA4X1BSRUZJWCljb21tb24vYXNtX2NvbV9vZmZzZXRzLmMubwotICAgIENMRUFOLU9CSlMgKz0gYXNtX2NvbV9vZmZzZXRzLmFzbQotICAgICQoZmlsdGVyICUkKEFTTSkubywkKE9CSlMteWVzKSk6ICQoQlVJTERfUEZYKWFzbV9jb21fb2Zmc2V0cy5hc20KLSAgZW5kaWYKLQotICBpZmVxICgkKEFSQ0hfQVJNKSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCksIHllcykKLSAgICBpZmVxICgkKENPTkZJR19WUDhfRU5DT0RFUiksIHllcykKLSAgICAgIGFzbV9lbmNfb2Zmc2V0cy5hc206IG9ial9pbnRfZXh0cmFjdAotICAgICAgYXNtX2VuY19vZmZzZXRzLmFzbTogJChWUDhfUFJFRklYKWVuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMubwotCS4vb2JqX2ludF9leHRyYWN0IHJ2ZHMgJDwgJChBRFMyR0FTKSA+ICRACi0gICAgICBPQkpTLXllcyArPSAkKFZQOF9QUkVGSVgpZW5jb2Rlci9hc21fZW5jX29mZnNldHMuYy5vCi0gICAgICBDTEVBTi1PQkpTICs9IGFzbV9lbmNfb2Zmc2V0cy5hc20KLSAgICAgICQoZmlsdGVyICUkKEFTTSkubywkKE9CSlMteWVzKSk6ICQoQlVJTERfUEZYKWFzbV9lbmNfb2Zmc2V0cy5hc20KLSAgICBlbmRpZgotICBlbmRpZgotCi0gIGlmZXEgKCQoQVJDSF9BUk0pLCB5ZXMpCi0gICAgaWZlcSAoJChDT05GSUdfVlA4X0RFQ09ERVIpLCB5ZXMpCi0gICAgICBhc21fZGVjX29mZnNldHMuYXNtOiBvYmpfaW50X2V4dHJhY3QKLSAgICAgIGFzbV9kZWNfb2Zmc2V0cy5hc206ICQoVlA4X1BSRUZJWClkZWNvZGVyL2FzbV9kZWNfb2Zmc2V0cy5jLm8KLQkuL29ial9pbnRfZXh0cmFjdCBydmRzICQ8ICQoQURTMkdBUykgPiAkQAotICAgICAgT0JKUy15ZXMgKz0gJChWUDhfUFJFRklYKWRlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMubwotICAgICAgQ0xFQU4tT0JKUyArPSBhc21fZGVjX29mZnNldHMuYXNtCi0gICAgICAkKGZpbHRlciAlJChBU00pLm8sJChPQkpTLXllcykpOiAkKEJVSUxEX1BGWClhc21fZGVjX29mZnNldHMuYXNtCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLSQoc2hlbGwgJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL3ZlcnNpb24uc2ggIiQoU1JDX1BBVEhfQkFSRSkiICQoQlVJTERfUEZYKXZweF92ZXJzaW9uLmgpCi1DTEVBTi1PQkpTICs9ICQoQlVJTERfUEZYKXZweF92ZXJzaW9uLmgKLQotQ09ERUNfRE9DX1NSQ1MgKz0gdnB4L3ZweF9jb2RlYy5oIFwKLSAgICAgICAgICAgICAgICAgIHZweC92cHhfZGVjb2Rlci5oIFwKLSAgICAgICAgICAgICAgICAgIHZweC92cHhfZW5jb2Rlci5oIFwKLSAgICAgICAgICAgICAgICAgIHZweC92cHhfaW1hZ2UuaAotCi1DTEVBTi1PQkpTICs9IGxpYnMuZG94eQotRE9DUy15ZXMgKz0gbGlicy5kb3h5Ci1saWJzLmRveHk6ICQoQ09ERUNfRE9DX1NSQ1MpCi0JQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKLQlAcm0gLWYgJEAKLQlAZWNobyAiSU5QVVQgKz0gJF4iID4+ICRACi0JQGVjaG8gIlBSRURFRklORUQgPSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQiID4+ICRACi0JQGVjaG8gIklOQ0xVREVfUEFUSCArPSAuIiA+PiAkQDsKLQlAZWNobyAiRU5BQkxFRF9TRUNUSU9OUyArPSAkKHNvcnQgJChDT0RFQ19ET0NfU0VDVElPTlMpKSIgPj4gJEAKZGlmZiAtLWdpdCBhL2xpYnZweC5tayBiL2xpYnZweC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNjZDliCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4Lm1rCkBAIC0wLDAgKzEsMTI3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCisgIGxpYnZweF90YXJnZXQgOj0gYXJtdjdhLW5lb24KKyAgbGlidnB4X2FzbSA6PSAuYXNtLnMKK2Vsc2UgaWZlcSAoJChBUkNIX0FSTV9IQVZFX0FSTVY3QSksdHJ1ZSkKKyAgbGlidnB4X3RhcmdldCA6PSBhcm12N2EKKyAgbGlidnB4X2FzbSA6PSAuYXNtLnMKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLG1pcHMpCisgIGlmbmVxICgkKEFSQ0hfSEFTX0JJR0VORElBTiksdHJ1ZSkKKyAgICBpZmVxICgkKEFSQ0hfTUlQU19EU1BfUkVWKSwyKQorICAgICAgbGlidnB4X3RhcmdldCA6PSBtaXBzLWRzcHIyCisgICAgICBMT0NBTF9DRkxBR1MgKz0gLURNSVBTX0RTUF9SRVY9JChBUkNIX01JUFNfRFNQX1JFVikKKyAgICBlbHNlCisgICAgICBsaWJ2cHhfdGFyZ2V0IDo9IG1pcHMKKyAgICAgIGlmZXEgKCQoQVJDSF9NSVBTX0RTUF9SRVYpLDEpCisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRE1JUFNfRFNQX1JFVj0kKEFSQ0hfTUlQU19EU1BfUkVWKQorICAgICAgZWxzZQorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURNSVBTX0RTUF9SRVY9MAorICAgICAgZW5kaWYgI21pcHNfZHNwX3JldjEKKyAgICBlbmRpZiAjbWlwc19kc3BfcmV2MgorICBlbmRpZiAjYmlnZW5kaWFuCitlbmRpZiAjbWlwcworCisjIFVuLW9wdGltaXplZCB0YXJnZXRzCitsaWJ2cHhfdGFyZ2V0ID89IGdlbmVyaWMKK2xpYnZweF9hc20gPz0gLmFzbQorCitsaWJ2cHhfY29uZmlnX2RpciA6PSAkKExPQ0FMX1BBVEgpLyQobGlidnB4X3RhcmdldCkKK2xpYnZweF9zb3VyY2VfZGlyIDo9ICQoTE9DQUxfUEFUSCkvbGlidnB4CisKK2xpYnZweF9jb2RlY19zcmNzIDo9ICQoc2hlbGwgY2F0ICQobGlidnB4X2NvbmZpZ19kaXIpL2xpYnZweF9zcmNzLnR4dCkKKworTE9DQUxfQ0ZMQUdTIDo9IC1ESEFWRV9DT05GSUdfSD12cHhfY29uZmlnLmgKKworTE9DQUxfTU9EVUxFIDo9IGxpYnZweAorCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU1RBVElDX0xJQlJBUklFUworbGlidnB4X2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQorCisjIEV4dHJhY3QgdGhlIEMgZmlsZXMgZnJvbSB0aGUgbGlzdCBhbmQgYWRkIHRoZW0gdG8gTE9DQUxfU1JDX0ZJTEVTLgorbGlidnB4X2NvZGVjX3NyY3NfdW5pcXVlIDo9ICQoc29ydCAkKGxpYnZweF9jb2RlY19zcmNzKSkKK2xpYnZweF9jb2RlY19zcmNzX2MgOj0gJChmaWx0ZXIgJS5jLCAkKGxpYnZweF9jb2RlY19zcmNzX3VuaXF1ZSkpCisjIHZweF9jb25maWcuYyBpcyBhbiBhdXRvLWdlbmVyYXRlZCBmaWxlIGluICQoY29uZmlnX2RpcikKK2xpYnZweF9jb2RlY19zcmNzX2Nfc3RhdGljIDo9ICQoZmlsdGVyLW91dCB2cHhfY29uZmlnLmMsICQobGlidnB4X2NvZGVjX3NyY3NfYykpCitMT0NBTF9TUkNfRklMRVMgKz0gJChhZGRwcmVmaXggbGlidnB4LywgJChsaWJ2cHhfY29kZWNfc3Jjc19jX3N0YXRpYykpCitMT0NBTF9TUkNfRklMRVMgKz0gJChsaWJ2cHhfdGFyZ2V0KS92cHhfY29uZmlnLmMKKworIyBBUk0gYW5kIHg4NiB1c2UgYW4gJ29mZnNldHMnIGZpbGUgaW4gdGhlIGFzc2VtYmx5LiBJdCBpcyBnZW5lcmF0ZWQgYnkKKyMgdHJpY2tpbmcgdGhlIGNvbXBpbGVyIGFuZCBnZW5lcmF0aW5nIG5vbi1mdW5jdGlvbmFsIG91dHB1dCB3aGljaCBpcyB0aGVuCisjIHByb2Nlc3NlZCB3aXRoIGdyZXAuIEZvciBBUk0sIHRoaXMgbXVzdCBiZSBhZGRpdGlvbmFsbHkgY29udmVydGVkIGZyb20KKyMgUlZDVCAoQVJNJ3MgaW4taG91c2UgY29tcGlsZXIpIGZvcm1hdCB0byBHTlUgQXNzZW1ibGVyIEZvcm1hdCBmb3IgZ2NjLgorCisjIE9mZnNldCBmaWxlcyBhcmUgY3VycmVudGx5IHVzZWQgaW4gdnB4X3NjYWxlIGZvciBORU9OIGFuZCBzb21lIGVuY29kZXIKKyMgZnVuY3Rpb25zIHVzZWQgaW4gYm90aCBBUk0gYW5kIHg4Ni4gVGhlc2UgZmlsZXMgY2FuIG5vdCBiZSBjb21waWxlZCBhbmQgbmVlZAorIyB0byBiZSBuYW1lZCBhY2NvcmRpbmdseSB0byBhdm9pZCBhdXRvLWJ1aWxkIHJ1bGVzLiBUaGUgZW5jb2RlciBmaWxlcyBhcmUgbm90CisjIHVzZWQgeWV0IGJ1dCBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1lbnRzIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorCitsaWJ2cHhfYXNtX29mZnNldHNfaW50ZXJtZWRpYXRlcyA6PSBcCisgICAgdnA4L2NvbW1vbi9hc21fY29tX29mZnNldHMuaW50ZXJtZWRpYXRlIFwKKyAgICB2cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuaW50ZXJtZWRpYXRlIFwKKworIyAgICB2cDgvZW5jb2Rlci9hc21fZW5jX29mZnNldHMuaW50ZXJtZWRpYXRlIFwKKworbGlidnB4X2FzbV9vZmZzZXRzX2ZpbGVzIDo9IFwKKyAgICB2cDgvY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5hc20gXAorICAgIHZwOC9kZWNvZGVyL2FzbV9kZWNfb2Zmc2V0cy5hc20gXAorCisjICAgIHZwOC9lbmNvZGVyL2FzbV9lbmNfb2Zmc2V0cy5hc20gXAorCisjIEJ1aWxkIHRoZSBTIGZpbGVzIHdpdGggaW5saW5lIGFzc2VtYmx5LgorQ09NUElMRV9UT19TIDo9ICQoYWRkcHJlZml4ICQobGlidnB4X2ludGVybWVkaWF0ZXMpLywgJChsaWJ2cHhfYXNtX29mZnNldHNfaW50ZXJtZWRpYXRlcykpCiskKENPTVBJTEVfVE9fUykgOiBQUklWQVRFX0lOVEVSTUVESUFURVMgOj0gJChsaWJ2cHhfaW50ZXJtZWRpYXRlcykKKyQoQ09NUElMRV9UT19TKSA6IFBSSVZBVEVfU09VUkNFX0RJUiA6PSAkKGxpYnZweF9zb3VyY2VfZGlyKQorJChDT01QSUxFX1RPX1MpIDogUFJJVkFURV9DT05GSUdfRElSIDo9ICQobGlidnB4X2NvbmZpZ19kaXIpCiskKENPTVBJTEVfVE9fUykgOiBQUklWQVRFX0NVU1RPTV9UT09MID0gJChUQVJHRVRfQ0MpIC1TICQoYWRkcHJlZml4IC1JLCAkKFRBUkdFVF9DX0lOQ0xVREVTKSkgLUkgJChQUklWQVRFX0lOVEVSTUVESUFURVMpIC1JICQoUFJJVkFURV9TT1VSQ0VfRElSKSAtSSAkKFBSSVZBVEVfQ09ORklHX0RJUikgLURJTkxJTkVfQVNNIC1vICRAICQ8CiskKENPTVBJTEVfVE9fUykgOiAkKGxpYnZweF9pbnRlcm1lZGlhdGVzKS8lLmludGVybWVkaWF0ZSA6ICQobGlidnB4X3NvdXJjZV9kaXIpLyUuYworCSQodHJhbnNmb3JtLWdlbmVyYXRlZC1zb3VyY2UpCisKKyMgRXh0cmFjdCB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBpbmxpbmUgYXNzZW1ibHkuCitPRkZTRVRTX0dFTiA6PSAkKGFkZHByZWZpeCAkKGxpYnZweF9pbnRlcm1lZGlhdGVzKS8sICQobGlidnB4X2FzbV9vZmZzZXRzX2ZpbGVzKSkKKyQoT0ZGU0VUU19HRU4pIDogUFJJVkFURV9PRkZTRVRfUEFUVEVSTiA6PSAnXlthLXpBLVowLTlfXSogRVFVJworJChPRkZTRVRTX0dFTikgOiBQUklWQVRFX1NPVVJDRV9ESVIgOj0gJChsaWJ2cHhfc291cmNlX2RpcikKKyQoT0ZGU0VUU19HRU4pIDogUFJJVkFURV9DVVNUT01fVE9PTCA9IGdyZXAgJChQUklWQVRFX09GRlNFVF9QQVRURVJOKSAkPCB8IHRyIC1kICckJFwjJyB8IHBlcmwgJChQUklWQVRFX1NPVVJDRV9ESVIpL2J1aWxkL21ha2UvYWRzMmdhcy5wbCA+ICRACiskKE9GRlNFVFNfR0VOKSA6ICUuYXNtIDogJS5pbnRlcm1lZGlhdGUKKwkkKHRyYW5zZm9ybS1nZW5lcmF0ZWQtc291cmNlKQorCitMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKE9GRlNFVFNfR0VOKQorCisjIFRoaXMgc3RlcCBpcyBvbmx5IHJlcXVpcmVkIGZvciBBUk0uIE1JUFMgdXNlcyBpbnRyaW5zaWNzIGFuZCB4ODYgcmVxdWlyZXMgYW4KKyMgYXNzZW1ibGVyIHRvIHByZS1wcm9jZXNzIGl0cyBhc3NlbWJseSBmaWxlcy4KK2xpYnZweF9hc21fc3JjcyA6PSAkKGZpbHRlciAlLmFzbS5zLCAkKGxpYnZweF9jb2RlY19zcmNzX3VuaXF1ZSkpCisKKyMgVGhlIEFSTSBhc3NlbWJseSBzb3VyY2VzIG11c3QgYmUgY29udmVydGVkIGZyb20gQURTIHRvIEdBUyBjb21wYXRpYmxlIGZvcm1hdC4KK1ZQWF9HRU4gOj0gJChhZGRwcmVmaXggJChsaWJ2cHhfaW50ZXJtZWRpYXRlcykvLCAkKGxpYnZweF9hc21fc3JjcykpCiskKFZQWF9HRU4pIDogUFJJVkFURV9TT1VSQ0VfRElSIDo9ICQobGlidnB4X3NvdXJjZV9kaXIpCiskKFZQWF9HRU4pIDogUFJJVkFURV9DVVNUT01fVE9PTCA9IGNhdCAkPCB8IHBlcmwgJChQUklWQVRFX1NPVVJDRV9ESVIpL2J1aWxkL21ha2UvYWRzMmdhcy5wbCA+ICRACiskKFZQWF9HRU4pIDogJChsaWJ2cHhfaW50ZXJtZWRpYXRlcykvJS5zIDogJChsaWJ2cHhfc291cmNlX2RpcikvJQorCSQodHJhbnNmb3JtLWdlbmVyYXRlZC1zb3VyY2UpCisKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoVlBYX0dFTikKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChsaWJ2cHhfc291cmNlX2RpcikgXAorICAgICQobGlidnB4X2NvbmZpZ19kaXIpIFwKKyAgICAkKGxpYnZweF9pbnRlcm1lZGlhdGVzKS92cDgvY29tbW9uIFwKKyAgICAkKGxpYnZweF9pbnRlcm1lZGlhdGVzKS92cDgvZGVjb2RlciBcCisKKyMgICAgJChsaWJ2cHhfaW50ZXJtZWRpYXRlcykvdnA4L2VuY29kZXIgXAorCitsaWJ2cHhfdGFyZ2V0IDo9CitsaWJ2cHhfYXNtIDo9CitsaWJ2cHhfY29uZmlnX2RpciA6PQorbGlidnB4X3NvdXJjZV9kaXIgOj0KK2xpYnZweF9jb2RlY19zcmNzIDo9CitsaWJ2cHhfaW50ZXJtZWRpYXRlcyA6PQorbGlidnB4X2NvZGVjX3NyY3NfdW5pcXVlIDo9CitsaWJ2cHhfY29kZWNfc3Jjc19jIDo9CitsaWJ2cHhfY29kZWNfc3Jjc19jX3N0YXRpYyA6PQorbGlidnB4X2FzbV9vZmZzZXRzX2ludGVybWVkaWF0ZXMgOj0KK2xpYnZweF9hc21fb2Zmc2V0c19maWxlcyA6PQorbGlidnB4X2FzbV9zcmNzIDo9CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZweC8ubWFpbG1hcCBiL2xpYnZweC8ubWFpbG1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTEyNzliCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4Ly5tYWlsbWFwCkBAIC0wLDAgKzEsOCBAQAorQWRyaWFuIEdyYW5nZSA8YWdyYW5nZUBnb29nbGUuY29tPgorSm9oYW5uIEtvZW5pZyA8am9oYW5ua29lbmlnQGdvb2dsZS5jb20+CitUZXJvIFJpbnRhbHVvbWEgPHRlcm9yQGdvb2dsZS5jb20+IDx0ZXJvLnJpbnRhbHVvbWFAb24yLmNvbT4KK1RvbSBGaW5lZ2FuIDx0b21maW5lZ2FuQGdvb2dsZS5jb20+CitSYWxwaCBHaWxlcyA8Z2lsZXNAeGlwaC5vcmc+IDxnaWxlc0BlbnRyb3B5d2F2ZS5jb20+CitSYWxwaCBHaWxlcyA8Z2lsZXNAeGlwaC5vcmc+IDxnaWxlc0Btb3ppbGxhLmNvbT4KK0FscGhhIExhbSA8aGNsYW1AZ29vZ2xlLmNvbT4gPGhjbGFtQGNocm9taXVtLm9yZz4KK0RlYiBNdWtoZXJqZWUgPGRlYmFyZ2hhQGdvb2dsZS5jb20+CmRpZmYgLS1naXQgYS9saWJ2cHgvQVVUSE9SUyBiL2xpYnZweC9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzdkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvQVVUSE9SUwpAQCAtMCwwICsxLDY1IEBACisjIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBnaXQgY29tbWl0IGhpc3RvcnkKKyMgYnkgdG9vbHMvZ2VuX2F1dGhvcnMuc2guCisKK0Fhcm9uIFdhdHJ5IDxhd2F0cnlAZ21haWwuY29tPgorQWRyaWFuIEdyYW5nZSA8YWdyYW5nZUBnb29nbGUuY29tPgorQWxleCBDb252ZXJzZSA8YWxleC5jb252ZXJzZUBnbWFpbC5jb20+CitBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KK0Fsb2sgQWh1amEgPHdhdmVsZXRjb2VmZkBnbWFpbC5jb20+CitBbHBoYSBMYW0gPGhjbGFtQGdvb2dsZS5jb20+CitBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorQW5kcmVzIE1lamlhIDxtY2l0YWRlbEBnbWFpbC5jb20+CitBcm9uIFJvc2VuYmVyZyA8YXJvc2VuYmVyZ0Bsb2dpdGVjaC5jb20+CitBdHRpbGEgTmFneSA8YXR0aWxhbmFneUBnb29nbGUuY29tPgorRGViIE11a2hlcmplZSA8ZGViYXJnaGFAZ29vZ2xlLmNvbT4KK0ZhYmlvIFBlZHJldHRpIDxmYWJpby5wZWRAbGliZXJvLml0PgorRnJhbmsgR2FsbGlnYW4gPGZnYWxsaWdhbkBnb29nbGUuY29tPgorRnJlZHJpayBTw7ZkZXJxdWlzdCA8ZnNAb3BlcmEuY29tPgorRnJpdHogS29lbmlnIDxmcmtvZW5pZ0Bnb29nbGUuY29tPgorR2F1dGUgU3Ryb2trZW5lcyA8Z2F1dGUuc3Ryb2trZW5lc0Bicm9hZGNvbS5jb20+CitHaXVzZXBwZSBTY3JpdmFubyA8Z3Njcml2YW5vQGdudS5vcmc+CitHdWlsbGVybW8gQmFsbGVzdGVyIFZhbG9yIDxnYnZhbG9yQGdtYWlsLmNvbT4KK0hlbnJpayBMdW5kaW4gPGhsdW5kaW5AZ29vZ2xlLmNvbT4KK0phbWVzIEJlcnJ5IDxqYW1lc2JlcnJ5QGdvb2dsZS5jb20+CitKYW1lcyBaZXJuIDxqemVybkBnb29nbGUuY29tPgorSmFuIEtyYXRvY2h2aWwgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+CitKZWZmIEZhdXN0IDxqZmF1c3RAZ29vZ2xlLmNvbT4KK0plZmYgTXVpemVsYWFyIDxqbXVpemVsYWFyQG1vemlsbGEuY29tPgorSmltIEJhbmtvc2tpIDxqaW1iYW5rb3NraUBnb29nbGUuY29tPgorSm9oYW5uIEtvZW5pZyA8am9oYW5ua29lbmlnQGdvb2dsZS5jb20+CitKb2huIEtvbGVzemFyIDxqa29sZXN6YXJAZ29vZ2xlLmNvbT4KK0pvc2h1YSBCbGVlY2hlciBTbnlkZXIgPGpvc2hAdHJlZWxpbmVsYWJzLmNvbT4KK0p1c3RpbiBDbGlmdCA8anVzdGluQHNhbGFzYWdhLm9yZz4KK0p1c3RpbiBMZWJhciA8anVzdGluLmxlYmFyQGdtYWlsLmNvbT4KK0tPIE15dW5nLUh1biA8a29taEBjaG9sbGlhbi5uZXQ+CitMb3UgUXVpbGxpbyA8bG91cXVpbGxpb0Bnb29nbGUuY29tPgorTHVjYSBCYXJiYXRvIDxsdV96ZXJvQGdlbnRvby5vcmc+CitNYWtvdG8gS2F0byA8bWFrb3RvLmt0QGdtYWlsLmNvbT4KK01hcmNvIFBhbmljb25pIDxtYXJwYW5AZ29vZ2xlLmNvbT4KK01hcnRpbiBFdHRsIDxldHRsLm1hcnRpbjc4QGdvb2dsZW1haWwuY29tPgorTWljaGFlbCBLb2hsZXIgPG1pY2hhZWxrb2hsZXJAbGl2ZS5jb20+CitNaWtlIEhvbW1leSA8bWhvbW1leUBtb3ppbGxhLmNvbT4KK01pa2hhbCBTaGVtZXIgPG1pa2hhbEBnb29nbGUuY29tPgorUGFzY2FsIE1hc3NpbWlubyA8cGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20+CitQYXRyaWsgV2VzdGluIDxwYXRyaWsud2VzdGluQGdtYWlsLmNvbT4KK1BhdWwgV2lsa2lucyA8cGF1bHdpbGtpbnNAZ29vZ2xlLmNvbT4KK1Bhdm9sIFJ1c25hayA8c3RpY2tAZ2syLnNrPgorUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KK1ByaWl0IExhZXMgPHBsYWVzQHBsYWVzLm9yZz4KK1JhZmFlbCDDgXZpbGEgZGUgRXNww61uZG9sYSA8cmFmYWVsLmVzcGluZG9sYUBnbWFpbC5jb20+CitSYWZhw6tsIENhcnLDqSA8ZnVubWFuQHZpZGVvbGFuLm9yZz4KK1JhbHBoIEdpbGVzIDxnaWxlc0B4aXBoLm9yZz4KK1JvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAZ29vZ2xlLmNvbT4KK1Njb3R0IExhVmFybndheSA8c2xhdmFybndheUBnb29nbGUuY29tPgorU3RlZmFuIEhvbG1lciA8aG9sbWVyQGdvb2dsZS5jb20+CitUYWVraHl1biBLaW0gPHRha2ltQG52aWRpYS5jb20+CitUYWthbm9yaSBNQVRTVVVSQSA8dC5tYXRzdXVAZ21haWwuY29tPgorVGVybyBSaW50YWx1b21hIDx0ZXJvckBnb29nbGUuY29tPgorVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KK1RpbW90aHkgQi4gVGVycmliZXJyeSA8dHRlcnJpYmVAeGlwaC5vcmc+CitUb20gRmluZWdhbiA8dG9tZmluZWdhbkBnb29nbGUuY29tPgorWWFvd3UgWHUgPHlhb3d1QGdvb2dsZS5jb20+CitZdW5xaW5nIFdhbmcgPHl1bnFpbmd3YW5nQGdvb2dsZS5jb20+CitHb29nbGUgSW5jLgorVGhlIE1vemlsbGEgRm91bmRhdGlvbgorVGhlIFhpcGguT3JnIEZvdW5kYXRpb24KZGlmZiAtLWdpdCBhL2xpYnZweC9DSEFOR0VMT0cgYi9saWJ2cHgvQ0hBTkdFTE9HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjlmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvQ0hBTkdFTE9HCkBAIC0wLDAgKzEsNTA1IEBACisyMDEyLTA1LTA5IHYxLjEuMCAiRWlkZXIiCisgIFRoaXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiBlbmhhbmNlbWVudHMsIG1vc3RseSBmb2N1c2VkIG9uIHJlYWwtdGltZQorICBlbmNvZGluZy4gSW4gYWRkaXRpb24sIGl0IGZpeGVzIGEgZGVjb2RlciBidWcgKGZpcnN0IGludHJvZHVjZWQgaW4KKyAgRHVjbGFpcikgc28gYWxsIHVzZXJzIG9mIHRoYXQgcmVsZWFzZSBhcmUgZW5jb3VyYWdlZCB0byB1cGdyYWRlLgorCisgIC0gVXBncmFkaW5nOgorICAgIFRoaXMgcmVsZWFzZSBpcyBBQkkgYW5kIEFQSSBjb21wYXRpYmxlIHdpdGggRHVjbGFpciAodjEuMC4wKS4gVXNlcnMKKyAgICBvZiBvbGRlciByZWxlYXNlcyBzaG91bGQgcmVmZXIgdG8gdGhlIFVwZ3JhZGluZyBub3RlcyBpbiB0aGlzCisgICAgZG9jdW1lbnQgZm9yIHRoYXQgcmVsZWFzZS4KKworICAgIFRoaXMgcmVsZWFzZSBpbnRyb2R1Y2VzIGEgbmV3IHRlbXBvcmFsIGRlbm9pc2VyLCBjb250cm9sbGVkIGJ5IHRoZQorICAgIFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZIGNvbnRyb2wuIFRoZSB0ZW1wb3JhbCBkZW5vaXNlciBkb2VzIG5vdAorICAgIGN1cnJlbnRseSB0YWtlIGEgc3RyZW5ndGggcGFyYW1ldGVyLCBzbyB0aGUgY29udHJvbCBpcyBlZmZlY3RpdmVseQorICAgIGEgYm9vbGVhbiAtIHplcm8gKG9mZikgb3Igbm9uLXplcm8gKG9uKS4gRm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywgdGhlIHZhbHVlcyBhY2NlcHRlZCBhcmUgdGhlIHNhbWUgYXMgdGhvc2UKKyAgICBmb3IgdGhlIHNwYXRpYWwgZGVub2lzZXIgKDAtNikuIFRoZSB0ZW1wb3JhbCBkZW5vaXNlciBpcyBlbmFibGVkCisgICAgYnkgZGVmYXVsdCwgYW5kIHRoZSBvbGRlciBzcGF0aWFsIGRlbm9pc2VyIG1heSBiZSByZXN0b3JlZCBieQorICAgIGNvbmZpZ3VyaW5nIHdpdGggLS1kaXNhYmxlLXRlbXBvcmFsLWRlbm9pc2luZy4gVGhlIHRlbXBvcmFsIGRlbm9pc2VyCisgICAgaXMgbW9yZSBjb21wdXRhdGlvbmFsbHkgaW50ZW5zaXZlIHRoYW4gdGhlIHNwYXRpYWwgb25lLgorCisgICAgVGhpcyByZWxlYXNlIHJlbW92ZXMgc3VwcG9ydCBmb3IgYSBsZWdhY3ksIGRlY29kZSBvbmx5IEFQSSB0aGF0IHdhcworICAgIHN1cHBvcnRlZCwgYnV0IGRlcHJlY2F0ZWQsIGF0IHRoZSBpbml0aWFsIHJlbGVhc2Ugb2YgbGlidnB4CisgICAgKHYwLjkuMCkuIFRoaXMgaXMgbm90IGV4cGVjdGVkIHRvIGhhdmUgYW55IGltcGFjdC4gSWYgeW91IGFyZQorICAgIGltcGFjdGVkLCB5b3UgY2FuIGFwcGx5IGEgcmV2ZXJzaW9uIHRvIGNvbW1pdCAyYmY4ZmI1OCBsb2NhbGx5LgorICAgIFBsZWFzZSB1cGRhdGUgdG8gdGhlIGxhdGVzdCBsaWJ2cHggQVBJIGlmIHlvdSBhcmUgYWZmZWN0ZWQuCisKKyAgLSBFbmhhbmNlbWVudHM6CisgICAgICBBZGRzIGEgbW90aW9uIGNvbXBlbnNhdGVkIHRlbXBvcmFsIGRlbm9pc2VyIHRvIHRoZSBlbmNvZGVyLCB3aGljaAorICAgICAgZ2l2ZXMgaGlnaGVyIHF1YWxpdHkgdGhhbiB0aGUgb2xkZXIgc3BhdGlhbCBkZW5vaXNlci4gKFNlZSBhYm92ZQorICAgICAgZm9yIG5vdGVzIG9uIHVwZ3JhZGluZykuCisKKyAgICAgIEluIGFkZGl0aW9uLCBzdXBwb3J0IGZvciBuZXcgY29tcGlsZXJzIGFuZCBwbGF0Zm9ybXMgd2VyZSBhZGRlZCwKKyAgICAgIGluY2x1ZGluZzoKKyAgICAgICAgaW1wcm92ZWQgc3VwcG9ydCBmb3IgWENvZGUKKyAgICAgICAgQW5kcm9pZCB4ODYgTkRLIGJ1aWxkCisgICAgICAgIE9TLzIgc3VwcG9ydAorICAgICAgICBTdW5DQyBzdXBwb3J0CisKKyAgICAgIENoYW5naW5nIHJlc29sdXRpb24gd2l0aCB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXQoKSBpcyBub3cKKyAgICAgIHN1cHBvcnRlZC4gUHJldmlvdXNseSwgcmVpbml0aWFsaXppbmcgdGhlIGNvZGVjIHdhcyByZXF1aXJlZCB0bworICAgICAgY2hhbmdlIHRoZSBpbnB1dCByZXNvbHV0aW9uLgorCisgICAgICBUaGUgdnB4ZW5jIGFwcGxpY2F0aW9uIGhhcyBpbml0aWFsIHN1cHBvcnQgZm9yIHByb2R1Y2luZyBtdWx0aXBsZQorICAgICAgZW5jb2RlcyBmcm9tIHRoZSBzYW1lIGlucHV0IGluIG9uZSBjYWxsLiBSZXNpemluZyBpcyBub3QgeWV0CisgICAgICBzdXBwb3J0ZWQsIGJ1dCB2YXJ5aW5nIG90aGVyIGNvZGVjIHBhcmFtZXRlcnMgaXMuIFVzZSAtLSB0bworICAgICAgZGVsaW5lYXRlIG91dHB1dCBzdHJlYW1zLiBPcHRpb25zIHBlcnNpc3QgZnJvbSBvbmUgc3RyZWFtIHRvIHRoZQorICAgICAgbmV4dC4KKworICAgICAgQWxzbywgdGhlIHZweGVuYyBhcHBsaWNhdGlvbiB3aWxsIG5vdyB1c2UgYSBrZXlmcmFtZSBpbnRlcnZhbCBvZgorICAgICAgNSBzZWNvbmRzIGJ5IGRlZmF1bHQuIFVzZSB0aGUgLS1rZi1tYXgtZGlzdCBvcHRpb24gdG8gb3ZlcnJpZGUuCisKKyAgLSBTcGVlZDoKKyAgICAgIERlY29kZXIgcGVyZm9ybWFuY2UgaW1wcm92ZWQgMi41JSB2ZXJzdXMgRHVjbGFpci4gRW5jb2RlciBzcGVlZCBpcworICAgICAgY29uc2lzdGVudCB3aXRoIER1Y2xhaXIgZm9yIG1vc3QgbWF0ZXJpYWwuIFR3byBwYXNzIGVuY29kaW5nIG9mCisgICAgICBzbGlkZXNob3ctbGlrZSBtYXRlcmlhbCB3aWxsIHNlZSBzaWduaWZpY2FudCBpbXByb3ZlbWVudHMuCisKKyAgICAgIExhcmdlIHJlYWx0aW1lIGVuY29kaW5nIHNwZWVkIGdhaW5zIGF0IGEgc21hbGwgcXVhbGl0eSBleHBlbnNlIGFyZQorICAgICAgcG9zc2libGUgYnkgY29uZmlndXJpbmcgdGhlIG9uLXRoZS1mbHkgYml0cGFja2luZyBleHBlcmltZW50IHdpdGgKKyAgICAgIC0tZW5hYmxlLW9udGhlZmx5LWJpdHBhY2tpbmcuIFJlYWx0aW1lIGVuY29kZXIgY2FuIGJlIHVwIHRvIDEzJQorICAgICAgZmFzdGVyIChBUk0pIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYW5kIGJpdHJhdGUKKyAgICAgIHNldHRpbmdzLiBUaGlzIHRlY2huaXF1ZSBzZWVzIGNvbnN0YW50IGdhaW4gb3ZlciB0aGUgNS0xNiBzcGVlZAorICAgICAgcmFuZ2UuIEZvciBWQyBzdHlsZSBpbnB1dCB0aGUgbG9zcyBzZWVuIGlzIHVwIHRvIDAuMmRCLiBTZWUgY29tbWl0CisgICAgICA1MmNmNGRjYSBmb3IgZnVydGhlciBkZXRhaWxzLgorCisgIC0gUXVhbGl0eToKKyAgICAgIE9uIHRoZSB3aG9sZSwgcXVhbGl0eSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIER1Y2xhaXIgcmVsZWFzZS4gU29tZQorICAgICAgdHdlYWtzOgorCisgICAgICAgIFJlZHVjZWQgYmxvY2tpbmVzcyBpbiBlYXN5IHNlY3Rpb25zIGJ5IGFwcGx5aW5nIGEgcGVuYWx0eSB0bworICAgICAgICBpbnRyYSBtb2Rlcy4KKworICAgICAgICBJbXByb3ZlZCBxdWFsaXR5IG9mIHN0YXRpYyBzZWN0aW9ucyAobGlrZSBzbGlkZXNob3dzKSB3aXRoCisgICAgICAgIHR3byBwYXNzIGVuY29kaW5nLgorCisgICAgICAgIEltcHJvdmVkIGtleWZyYW1lIHNpemluZyB3aXRoIG11bHRpcGxlIHRlbXBvcmFsIGxheWVycworCisgIC0gQnVnIEZpeGVzOgorICAgICAgQ29ycmVjdGVkIGFsdC1yZWYgY29udHJpYnV0aW9uIHRvIGZyYW1lIHJhdGUgZm9yIHZpc2libGUgdXBkYXRlcworICAgICAgdG8gdGhlIGFsdC1yZWYgYnVmZmVyLiBUaGlzIGFmZmVjdGVkIGFwcGxpY2F0aW9ucyBtYWtpbmcgbWFudWFsCisgICAgICB1c2FnZSBvZiB0aGUgZnJhbWUgcmVmZXJlbmNlIGZsYWdzLCBvciB0ZW1wb3JhbCBsYXllcnMuCisKKyAgICAgIEFkZGl0aW9uYWwgY29uc3RyYWludHMgd2VyZSBhZGRlZCB0byBkaXNhYmxlIG11bHRpLWZyYW1lIHF1YWxpdHkKKyAgICAgIGVuaGFuY2VtZW50IChNRlFFKSBpbiBzZWN0aW9ucyBvZiB0aGUgZnJhbWUgd2hlcmUgdGhlcmUgaXMgbW90aW9uLgorICAgICAgKCMzOTIpCisKKyAgICAgIEZpeGVkIGNvcnJ1cHRpb24gaXNzdWVzIHdoZW4gdnB4X2NvZGVjX2VuY19jb25maWdfc2V0KCkgd2FzIGNhbGxlZAorICAgICAgd2l0aCBzcGF0aWFsIHJlc2FtcGxpbmcgZW5hYmxlZC4KKworICAgICAgRml4ZWQgYSBkZWNvZGVyIGVycm9yIGludHJvZHVjZWQgaW4gRHVjbGFpciB3aGVyZSB0aGUgc2VnbWVudGF0aW9uCisgICAgICBtYXAgd2FzIG5vdCBiZWluZyByZWluaXRpYWxpemVkIG9uIGtleWZyYW1lcyAoIzM3OCkKKworCisyMDEyLTAxLTI3IHYxLjAuMCAiRHVjbGFpciIKKyAgT3VyIGZvdXJ0aCBuYW1lZCByZWxlYXNlLCBmb2N1c2VkIG9uIHBlcmZvcm1hbmNlIGFuZCBmZWF0dXJlcyByZWxhdGVkIHRvCisgIHJlYWwtdGltZSBlbmNvZGluZy4gSXQgYWxzbyBmaXhlcyBhIGRlY29kZXIgY3Jhc2ggYnVnIGludHJvZHVjZWQgaW4KKyAgdjAuOS43LCBzbyBhbGwgdXNlcnMgb2YgdGhhdCByZWxlYXNlIGFyZSBlbmNvdXJhZ2VkIHRvIHVwZ3JhZGUuCisKKyAgLSBVcGdyYWRpbmc6CisgICAgICBUaGlzIHJlbGVhc2UgaXMgQUJJIGluY29tcGF0aWJsZSB3aXRoIHByaW9yIHJlbGVhc2VzIG9mIGxpYnZweCwgc28gdGhlCisgICAgICAibWFqb3IiIHZlcnNpb24gbnVtYmVyIGhhcyBiZWVuIGJ1bXBlZCB0byAxLiBZb3UgbXVzdCByZWNvbXBpbGUgeW91cgorICAgICAgYXBwbGljYXRpb25zIGFnYWluc3QgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBsaWJ2cHggaGVhZGVycy4gVGhlCisgICAgICBBUEkgcmVtYWlucyBjb21wYXRpYmxlLCBhbmQgdGhpcyBzaG91bGQgbm90IHJlcXVpcmUgY29kZSBjaGFuZ2VzIGluIG1vc3QKKyAgICAgIGFwcGxpY2F0aW9ucy4KKworICAtIEVuaGFuY2VtZW50czoKKyAgICAgIFRoaXMgcmVsZWFzZSBpbnRyb2R1Y2VzIHNldmVyYWwgc3Vic3RhbnRpYWwgbmV3IGZlYXR1cmVzIHRvIHRoZSBlbmNvZGVyLAorICAgICAgb2YgcGFydGljdWxhciBpbnRlcmVzdCB0byByZWFsIHRpbWUgc3RyZWFtaW5nIGFwcGxpY2F0aW9ucy4KKworICAgICAgVGVtcG9yYWwgc2NhbGFiaWxpdHkgYWxsb3dzIHRoZSBlbmNvZGVyIHRvIHByb2R1Y2UgYSBzdHJlYW0gdGhhdCBjYW4KKyAgICAgIGJlIGRlY2ltYXRlZCB0byBkaWZmZXJlbnQgZnJhbWUgcmF0ZXMsIHdpdGggaW5kZXBlbmRlbnQgcmF0ZSB0YXJnZXR0aW5nCisgICAgICBmb3IgZWFjaCBzdWJzdHJlYW0uCisKKyAgICAgIE11bHRpZnJhbWUgcXVhbGl0eSBlbmhhbmNlbWVudCBwb3N0cHJvY2Vzc2luZyBjYW4gbWFrZSB2aXN1YWwgcXVhbGl0eQorICAgICAgbW9yZSBjb25zaXN0ZW50IGluIHRoZSBwcmVzZW5jZSBvZiBmcmFtZXMgdGhhdCBhcmUgc3Vic3RhbnRpYWxseQorICAgICAgZGlmZmVyZW50IHF1YWxpdHkgdGhhbiB0aGUgc3Vycm91bmRpbmcgZnJhbWVzLCBhcyBpbiB0aGUgdGVtcG9yYWwKKyAgICAgIHNjYWxhYmlsaXR5IGNhc2UgYW5kIGluIHNvbWUgZm9yY2VkIGtleWZyYW1lIHNjZW5hcmlvcy4KKworICAgICAgTXVsdGlwbGUtcmVzb2x1dGlvbiBlbmNvZGluZyBzdXBwb3J0IGFsbG93cyB0aGUgZW5jb2Rpbmcgb2YgdGhlCisgICAgICBzYW1lIGNvbnRlbnQgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zIGZhc3RlciB0aGFuIGVuY29kaW5nIHRoZW0KKyAgICAgIHNlcGFyYXRlbHkuCisKKyAgLSBTcGVlZDoKKyAgICAgIE9wdGltaXphdGlvbiB0YXJnZXRzIGZvciB0aGlzIHJlbGVhc2UgaW5jbHVkZWQgdGhlIGRlY29kZXIgYW5kIHRoZSByZWFsLQorICAgICAgdGltZSBtb2RlcyBvZiB0aGUgZW5jb2Rlci4gRGVjb2RlciBzcGVlZCBvbiB4ODYgaGFzIGltcHJvdmVkIDEwLjUlIHdpdGgKKyAgICAgIHRoaXMgcmVsZWFzZS4gRW5jb2RlciBpbXByb3ZlbWVudHMgZm9sbG93ZWQgYSBjdXJ2ZSB3aGVyZSBzcGVlZHMgMS0zCisgICAgICBpbXByb3ZlZCA0LjAlLTEuNSUsIHNwZWVkcyA0LTggaW1wcm92ZWQgPDElLCBhbmQgc3BlZWRzIDktMTYgaW1wcm92ZWQKKyAgICAgIDEuNSUgdG8gMTAuNSUsIHJlc3BlY3RpdmVseS4gIkJlc3QiIG1vZGUgc3BlZWQgaXMgY29uc2lzdGVudCB3aXRoIHRoZQorICAgICAgQ2F5dWdhIHJlbGVhc2UuCisKKyAgLSBRdWFsaXR5OgorICAgICAgRW5jb2RlciBxdWFsaXR5IGluIHRoZSBzaW5nbGUgc3RyZWFtIGNhc2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBDYXl1Z2EKKyAgICAgIHJlbGVhc2UuCisKKyAgLSBCdWcgRml4ZXM6CisgICAgICBUaGlzIHJlbGVhc2UgZml4ZXMgYW4gT09CIHJlYWQgZGVjb2RlciBjcmFzaCBidWcgcHJlc2VudCBpbiB2MC45LjcKKyAgICAgIHJlbGF0ZWQgdG8gdGhlIGNsYW1waW5nIG9mIG1vdGlvbiB2ZWN0b3JzIGluIFNQTElUTVYgYmxvY2tzLiBUaGlzCisgICAgICBiZWhhdmlvciBjb3VsZCBiZSB0cmlnZ2VyZWQgYnkgY29ycnVwdCBpbnB1dCBvciBieSBzdGFydGluZworICAgICAgZGVjb2RpbmcgZnJvbSBhIFAtZnJhbWUuCisKKworMjAxMS0wOC0xNSB2MC45LjctcDEgIkNheXVnYSIgcGF0Y2ggMQorICBUaGlzIGlzIGFuIGluY3JlbWVudGFsIGJ1Z2ZpeCByZWxlYXNlIGFnYWluc3QgQ2F5dWdhLiBBbGwgdXNlcnMgb2YgdGhhdAorICByZWxlYXNlIGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIHVwZ3JhZGUuCisKKyAgICAtIEZpeCBwb3RlbnRpYWwgT09CIHJlYWRzIChjZGFlMDNhKQorCisgICAgICAgICAgQW4gdW5ib3VuZGVkIG91dCBvZiBib3VuZHMgcmVhZCB3YXMgZGlzY292ZXJlZCB3aGVuIHRoZQorICAgICAgICAgIGRlY29kZXIgd2FzIHJlcXVlc3RlZCB0byBwZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IChuZXcgaW4KKyAgICAgICAgICBDYXl1Z2EpIGdpdmVuIGEgZnJhbWUgd2l0aCBjb3JydXB0IHBhcnRpdGlvbiBzaXplcy4KKworICAgICAgICAgIEEgYm91bmRlZCBvdXQgb2YgYm91bmRzIHJlYWQgd2FzIGRpc2NvdmVyZWQgYWZmZWN0aW5nIGFsbAorICAgICAgICAgIHZlcnNpb25zIG9mIGxpYnZweC4gR2l2ZW4gYW4gbXVsdGlwYXJ0aXRpb24gaW5wdXQgZnJhbWUgdGhhdAorICAgICAgICAgIGlzIHRydW5jYXRlZCBiZXR3ZWVuIHRoZSBtb2RlL212IHBhcnRpdGlvbiBhbmQgdGhlIGZpcnN0CisgICAgICAgICAgcmVzaWRpdWFsIHBhcml0aXRpb24gKGluIHRoZSBibG9jayBvZiBwYXJ0aXRpb24gb2Zmc2V0cyksIHVwCisgICAgICAgICAgdG8gMyBleHRyYSBieXRlcyBjb3VsZCBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLgorICAgICAgICAgIFRoZSBjb2RlIHdpbGwgbm90IHRha2UgYW55IGFjdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZXNlIHVuZGVmaW5lZCBieXRlcywgYXMgdGhlIHRydW5jYXRlZCBidWZmZXIgaXMgZGV0ZWN0ZWQKKyAgICAgICAgICBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHJlYWQgYmFzZWQgb24gdGhlIGNhbGN1bGF0ZWQKKyAgICAgICAgICBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQgcGFydGl0aW9uLgorCisgICAgLSBGaXggcG90ZW50aWFsIGVycm9yIGNvbmNlYWxtZW50IGNyYXNoIHdoZW4gdGhlIHZlcnkgZmlyc3QgZnJhbWUKKyAgICAgIGlzIG1pc3Npbmcgb3IgY29ycnVwdCAoYTYwOWJlNSkKKworICAgIC0gRml4IHNpZ25pZmljYW50IGFydGlmYWN0cyBpbiBlcnJvciBjb25jZWFsbWVudCAoYTRjMjIxMSwgOTlkODcwYSkKKworICAgIC0gUmV2ZXJ0IDEtcGFzcyBDQlIgcmF0ZSBjb250cm9sIGNoYW5nZXMgKGU5NjEzMTcpCisgICAgICBGdXJ0aGVyIHRlc3Rpbmcgc2hvd2VkIHRoaXMgY2hhbmdlIHByb2R1Y2VkIHVuZGVzaXJhYmxlIHZpc3VhbAorICAgICAgYXJ0aWZhY3RzLCByb2xsaW5nIGJhY2sgZm9yIG5vdy4KKworCisyMDExLTA4LTAyIHYwLjkuNyAiQ2F5dWdhIgorICBPdXIgdGhpcmQgbmFtZWQgcmVsZWFzZSwgZm9jdXNlZCBvbiBhIGZhc3RlciwgaGlnaGVyIHF1YWxpdHksIGVuY29kZXIuCisKKyAgLSBVcGdyYWRpbmc6CisgICAgVGhpcyByZWxlYXNlIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggQXlsZXNidXJ5ICh2MC45LjUpIGFuZAorICAgIEJhbGkgKHYwLjkuNikuIFVzZXJzIG9mIG9sZGVyIHJlbGVhc2VzIHNob3VsZCByZWZlciB0byB0aGUgVXBncmFkaW5nCisgICAgbm90ZXMgaW4gdGhpcyBkb2N1bWVudCBmb3IgdGhhdCByZWxlYXNlLgorCisgIC0gRW5oYW5jZW1lbnRzOgorICAgICAgICAgIFN0ZXJlbyAzRCBmb3JtYXQgc3VwcG9ydCBmb3IgdnB4ZW5jCisgICAgICAgICAgUnVudGltZSBkZXRlY3Rpb24gb2YgYXZhaWxhYmxlIHByb2Nlc3NvciBjb3Jlcy4KKyAgICAgICAgICBBbGxvdyBzcGVjaWZ5aW5nIC0tZW5kLXVzYWdlIGJ5IGVudW0gbmFtZQorICAgICAgICAgIHZweGRlYzogdGVzdCBmb3IgZnJhbWUgY29ycnVwdGlvbgorICAgICAgICAgIHZweGVuYzogYWRkIHF1YW50aXplciBoaXN0b2dyYW0gZGlzcGxheQorICAgICAgICAgIHZweGVuYzogYWRkIHJhdGUgaGlzdG9ncmFtIGRpc3BsYXkKKyAgICAgICAgICBTZXQgVlBYX0ZSQU1FX0lTX0RST1BQQUJMRQorICAgICAgICAgIHVwZGF0ZSBjb25maWd1cmUgZm9yIGlvcyBzZGsgNC4zCisgICAgICAgICAgQXZvaWQgdGV4dCByZWxvY2F0aW9ucyBpbiBBUk0gdnA4IGRlY29kZXIKKyAgICAgICAgICBHZW5lcmF0ZSBhIHZweC5wYyBmaWxlIGZvciBwa2ctY29uZmlnLgorICAgICAgICAgIE5ldyB3YXlzIG9mIHBhc3NpbmcgZW5jb2RlZCBkYXRhIGJldHdlZW4gZW5jb2RlciBhbmQgZGVjb2Rlci4KKworICAtIFNwZWVkOgorICAgICAgVGhpcyByZWxlYXNlIGluY2x1ZGVzIGFjcm9zcy10aGUtYm9hcmQgc3BlZWQgaW1wcm92ZW1lbnRzIHRvIHRoZQorICAgICAgZW5jb2Rlci4gT24geDg2LCB0aGVzZSBtZWFzdXJlIGF0IGFwcHJveGltYXRlbHkgMTEuNSUgaW4gQmVzdCBtb2RlLAorICAgICAgMjEuNSUgaW4gR29vZCBtb2RlIChzcGVlZCAwKSwgYW5kIDIyLjUlIGluIFJlYWx0aW1lIG1vZGUgKHNwZWVkIDYpLgorICAgICAgT24gQVJNIENvcnRleCBBOSB3aXRoIE5lb24gZXh0ZW5zaW9ucywgcmVhbC10aW1lIGVuY29kaW5nIG9mIHZpZGVvCisgICAgICB0ZWxlcGhvbnkgY29udGVudCBpcyAzNSUgZmFzdGVyIHRoYW4gQmFsaSBvbiBzaW5nbGUgY29yZSBhbmQgNDglCisgICAgICBmYXN0ZXIgb24gbXVsdGktY29yZS4gT24gdGhlIE5WaWRpYSBUZWdyYTIgcGxhdGZvcm0sIHJlYWwgdGltZQorICAgICAgZW5jb2RpbmcgaXMgNDAlIGZhc3RlciB0aGFuIEJhbGkuCisKKyAgICAgIERlY29kZXIgc3BlZWQgd2FzIG5vdCBhIHByaW9yaXR5IGZvciB0aGlzIHJlbGVhc2UsIGJ1dCBpbXByb3ZlZAorICAgICAgYXBwcm94aW1hdGVseSA4LjQlIG9uIHg4Ni4KKworICAgICAgICAgIFJlZHVjZSBtb3Rpb24gdmVjdG9yIHNlYXJjaCBvbiBhbHQtcmVmIGZyYW1lLgorICAgICAgICAgIEVuY29kZXIgbG9vcGZpbHRlciBydW5uaW5nIGluIGl0cyBvd24gdGhyZWFkCisgICAgICAgICAgUmV3b3JrZWQgbG9vcGZpbHRlciB0byBwcmVjYWxjdWxhdGUgbW9yZSBwYXJhbWV0ZXJzCisgICAgICAgICAgU1NFMi9TU1NFMyBvcHRpbWl6YXRpb25zIGZvciBidWlsZF9wcmVkaWN0b3JzX21idXZ7LF9zfSgpLgorICAgICAgICAgIE1ha2UgaG9yIFVWIHByZWRpY3QgfjJ4IGZhc3RlciAoNzMgdnMgMTMyIGN5Y2xlcykgdXNpbmcgU1NTRTMuCisgICAgICAgICAgUmVtb3ZlZCByZWR1bmRhbnQgY2hlY2tzCisgICAgICAgICAgUmVkdWNlZCBzdHJ1Y3R1cmUgc2l6ZXMKKyAgICAgICAgICB1dGlsaXplIHByZWxvYWQgaW4gQVJNdjYgTUMvTFBGL0NvcHkgcm91dGluZXMKKyAgICAgICAgICBBUk0gb3B0aW1pemVkIHF1YW50aXphdGlvbiwgZGZjdCwgdmFyaWFuY2UsIHN1YnRyYWN0CisgICAgICAgICAgSW5jcmVhc2UgY2hyb3cgcm93IGFsaWdubWVudCB0byAxNiBieXRlcy4KKyAgICAgICAgICBkaXNhYmxlIHRyZWxsaXMgb3B0aW1pemF0aW9uIGZvciBmaXJzdCBwYXNzCisgICAgICAgICAgV3JpdGUgU1NTRTMgc3ViLXBpeGVsIGZpbHRlciBmdW5jdGlvbgorICAgICAgICAgIEltcHJvdmUgU1NFMiBoYWxmLXBpeGVsIGZpbHRlciBmdW50aW9ucworICAgICAgICAgIEFkZCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9zc3NlMyBmdW5jdGlvbgorICAgICAgICAgIFJlZHVjZSB1bm5lY2Vzc2FyeSBkaXN0b3J0aW9uIGNvbXB1dGF0aW9uCisgICAgICAgICAgVXNlIGRpYW1vbmQgc2VhcmNoIHRvIHJlcGxhY2UgZnVsbCBzZWFyY2gKKyAgICAgICAgICBQcmVsb2FkIHJlZmVyZW5jZSBhcmVhIGluIHN1Yi1waXhlbCBtb3Rpb24gc2VhcmNoIChyZWFsLXRpbWUgbW9kZSkKKworICAtIFF1YWxpdHk6CisgICAgICBUaGlzIHJlbGVhc2UgZm9jdXNlZCBwcmltYXJpbHkgb24gb25lLXBhc3MgdXNlIGNhc2VzLCBpbmNsdWRpbmcKKyAgICAgIHZpZGVvIGNvbmZlcmVuY2luZy4gTG93IGxhdGVuY3kgZGF0YSByYXRlIGNvbnRyb2wgd2FzIHNpZ25pZmljYW50bHkKKyAgICAgIGltcHJvdmVkLCBpbXByb3Zpbmcgc3RyZWFtYWJpbGl0eSBvdmVyIGJhbmR3aWR0aCBjb25zdHJhaW5lZCBsaW5rcy4KKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGVycm9yIGNvbmNlYWxtZW50LCBhbGxvd2luZyBmcmFtZXMgdG8gbWFpbnRhaW4KKyAgICAgIHZpc3VhbCBxdWFsaXR5IGluIHRoZSBwcmVzZW5jZSBvZiBzdWJzdGFudGlhbCBwYWNrZXQgbG9zcy4KKworICAgICAgICAgIEFkZCByY19tYXhfaW50cmFfYml0cmF0ZV9wY3QgY29udHJvbAorICAgICAgICAgIExpbWl0IHNpemUgb2YgaW5pdGlhbCBrZXlmcmFtZSBpbiBvbmUtcGFzcy4KKyAgICAgICAgICBJbXByb3ZlIGZyYW1lcmF0ZSBhZGFwdGF0aW9uCisgICAgICAgICAgSW1wcm92ZWQgMS1wYXNzIENCUiByYXRlIGNvbnRyb2wKKyAgICAgICAgICBJbXByb3ZlZCBLRiBpbnNlcnRpb24gYWZ0ZXIgZmFkZXMgdG8gc3RpbGwuCisgICAgICAgICAgSW1wcm92ZWQga2V5IGZyYW1lIGRldGVjdGlvbi4KKyAgICAgICAgICBJbXByb3ZlZCBhY3Rpdml0eSBtYXNraW5nIChsb3dlciBQU05SIGltcGFjdCBmb3Igc2FtZSBTU0lNIGJvb3N0KQorICAgICAgICAgIEltcHJvdmVkIGludGVyYWN0aW9uIGJldHdlZW4gR0YgYW5kIEFSRnMKKyAgICAgICAgICBBZGRpbmcgZXJyb3ItY29uY2VhbG1lbnQgdG8gdGhlIGRlY29kZXIuCisgICAgICAgICAgQWRkaW5nIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50IHBhcnRpdGlvbnMKKyAgICAgICAgICBBZGp1c3RlZCByYXRlLWRpc3RvcnRpb24gY29uc3RhbnRzCisKKworICAtIEJ1ZyBGaXhlczoKKyAgICAgICAgICBSZW1vdmVkIGZpcnN0cGFzcyBtb3Rpb24gbWFwCisgICAgICAgICAgRml4IHBhcmFsbGVsIG1ha2UgaW5zdGFsbAorICAgICAgICAgIEZpeCBtdWx0aXRocmVhZGVkIGVuY29kaW5nIGZvciAxIE1CIHdpZGUgZnJhbWUKKyAgICAgICAgICBGaXhlZCBpd2Fsc2hfbmVvbiBidWlsZCBwcm9ibGVtcyB3aXRoIFJWRFM0LjEKKyAgICAgICAgICBGaXggc2VtYXBob3JlIGVtdWxhdGlvbiwgc3Bpbi13YWl0IGludHJpbnNpY3Mgb24gV2luZG93cworICAgICAgICAgIEZpeCBidWlsZCB3aXRoIHhjb2RlNCBhbmQgc2ltcGxpZnkgR0xPQkFMLgorICAgICAgICAgIE1hcmsgQVJNIGFzbSBvYmplY3RzIGFzIGFsbG93aW5nIGEgbm9uLWV4ZWN1dGFibGUgc3RhY2suCisgICAgICAgICAgRml4IHZweGVuYyBlbmNvZGluZyBpbmNvcnJlY3Qgd2VibSBmaWxlIGhlYWRlciBvbiBiaWcgZW5kaWFuCisKKworMjAxMS0wMy0wNyB2MC45LjYgIkJhbGkiCisgIE91ciBzZWNvbmQgbmFtZWQgcmVsZWFzZSwgZm9jdXNlZCBvbiBhIGZhc3RlciwgaGlnaGVyIHF1YWxpdHksIGVuY29kZXIuCisKKyAgLSBVcGdyYWRpbmc6CisgICAgVGhpcyByZWxlYXNlIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggQXlsZXNidXJ5ICh2MC45LjUpLiBVc2VycworICAgIG9mIG9sZGVyIHJlbGVhc2VzIHNob3VsZCByZWZlciB0byB0aGUgVXBncmFkaW5nIG5vdGVzIGluIHRoaXMKKyAgICBkb2N1bWVudCBmb3IgdGhhdCByZWxlYXNlLgorCisgIC0gRW5oYW5jZW1lbnRzOgorICAgICAgdnB4ZW5jIC0tcHNuciBzaG93cyBhIHN1bW1hcnkgd2hlbiBlbmNvZGUgY29tcGxldGVzCisgICAgICAtLXR1bmU9c3NpbSBvcHRpb24gdG8gZW5hYmxlIGFjdGl2aXR5IG1hc2tpbmcKKyAgICAgIGltcHJvdmVkIHBvc3Rwcm9jIHZpc3VhbGl6YXRpb25zIGZvciBkZXZlbG9wbWVudAorICAgICAgdXBkYXRlZCBzdXBwb3J0IGZvciBBcHBsZSBpT1MgdG8gU0RLIDQuMgorICAgICAgcXVlcnkgZGVjb2RlciB0byBkZXRlcm1pbmUgd2hpY2ggcmVmZXJlbmNlIGZyYW1lcyB3ZXJlIHVwZGF0ZWQKKyAgICAgIGltcGxlbWVudGVkIGVycm9yIHRyYWNraW5nIGluIHRoZSBkZWNvZGVyCisgICAgICBmaXggcGlwZSBzdXBwb3J0IG9uIHdpbmRvd3MKKworICAtIFNwZWVkOgorICAgICAgUHJpbWFyeSBmb2N1cyB3YXMgb24gZ29vZCBxdWFsaXR5IG1vZGUsIHNwZWVkIDAuIEF2ZXJhZ2UgaW1wcm92ZW1lbnQKKyAgICAgIG9uIHg4NiBhYm91dCA0MCUsIHVwIHRvIDEwMCUgb24gdXNlci1nZW5lcmF0ZWQgY29udGVudCBhdCB0aGF0IHNwZWVkLgorICAgICAgQmVzdCBxdWFsaXR5IG1vZGUgc3BlZWQgaW1wcm92ZWQgMzUlLCBhbmQgcmVhbHRpbWUgc3BlZWQgMTAtMjAlLiBUaGlzCisgICAgICByZWxlYXNlIGFsc28gc2F3IHNpZ25pZmljYW50IGltcHJvdmVtZW50IGluIHJlYWx0aW1lIGVuY29kaW5nIHNwZWVkCisgICAgICBvbiBBUk0gcGxhdGZvcm1zLgorCisgICAgICAgIEltcHJvdmVkIGVuY29kZXIgdGhyZWFkaW5nCisgICAgICAgIERvbnQgcGljayBlbmNvZGVyIGZpbHRlciBsZXZlbCB3aGVuIGxvb3BmaWx0ZXIgaXMgZGlzYWJsZWQuCisgICAgICAgIEF2b2lkIGRvdWJsZSBjb3B5aW5nIG9mIGtleSBmcmFtZXMgaW50byBhbHQgYW5kIGdvbGRlbiBidWZmZXIKKyAgICAgICAgRkRDVCBvcHRpbWl6YXRpb25zLgorICAgICAgICB4ODYgc3NlMiB0ZW1wb3JhbCBmaWx0ZXIKKyAgICAgICAgU1NTRTMgdmVyc2lvbiBvZiBmYXN0IHF1YW50aXplcgorICAgICAgICB2cDhfcmRfcGlja19iZXN0X21ic2VnbWVudGF0aW9uIGNvZGUgcmVzdHJ1Y3R1cmUKKyAgICAgICAgQWRqdXN0ZWQgYnJlYWtvdXQgUkQgZm9yIFNQTElUTVYKKyAgICAgICAgQ2hhbmdlZCBzZWdtZW50YXRpb24gY2hlY2sgb3JkZXIKKyAgICAgICAgSW1wcm92ZWQgcmRfcGlja19pbnRyYTR4NGJsb2NrCisgICAgICAgIEFkZHMgYXJtdjYgb3B0aW1pemVkIHZhcmlhbmNlIGNhbGN1bGF0aW9uCisgICAgICAgIEFSTXY2IG9wdGltaXplZCBzYWQxNngxNgorICAgICAgICBBUk12NiBvcHRpbWl6ZWQgaGFsZiBwaXhlbCB2YXJpYW5jZSBjYWxjdWxhdGlvbnMKKyAgICAgICAgRnVsbCBzZWFyY2ggU0FEIGZ1bmN0aW9uIG9wdGltaXphdGlvbiBpbiBTU0U0LjEKKyAgICAgICAgSW1wcm92ZSBNViBwcmVkaWN0aW9uIGFjY3VyYWN5IHRvIGFjaGlldmUgcGVyZm9ybWFuY2UgZ2FpbgorICAgICAgICBJbXByb3ZlIE1WIHByZWRpY3Rpb24gaW4gdnA4X3BpY2tfaW50ZXJfbW9kZSgpIGZvciBzcGVlZD4zCisKKyAgLSBRdWFsaXR5OgorICAgICAgQmVzdCBxdWFsaXR5IG1vZGUgaW1wcm92ZWQgUFNOUiA2LjMlLCBhbmQgU1NJTSA2LjElLiBUaGlzIHJlbGVhc2UKKyAgICAgIGFsc28gaW5jbHVkZXMgc3VwcG9ydCBmb3IgImFjdGl2aXR5IG1hc2tpbmcsIiB3aGljaCBncmVhdGx5IGltcHJvdmVzCisgICAgICBTU0lNIGF0IHRoZSBleHBlbnNlIG9mIFBTTlIuIEZvciBub3csIHRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgd2l0aAorICAgICAgdGhlIC0tdHVuZT1zc2ltIG9wdGlvbi4gRnVydGhlciBleHBlcmltZW50YXRpb24gaW4gdGhpcyBhcmVhCisgICAgICBpcyBvbmdvaW5nLiBUaGlzIHJlbGVhc2UgYWxzbyBpbnRyb2R1Y2VzIGEgbmV3IHJhdGUgY29udHJvbCBtb2RlCisgICAgICBjYWxsZWQgIkNRLCIgd2hpY2ggY2hhbmdlcyB0aGUgYWxsb2NhdGlvbiBvZiBiaXRzIHdpdGhpbiBhIGNsaXAgdG8KKyAgICAgIHRoZSBzZWN0aW9ucyB3aGVyZSB0aGV5IHdpbGwgaGF2ZSB0aGUgbW9zdCB2aXN1YWwgaW1wYWN0LgorCisgICAgICAgIFR1bmluZyBmb3IgdGhlIG1vcmUgZXhhY3QgcXVhbnRpemVyLgorICAgICAgICBSZWxheCByYXRlIGNvbnRyb2wgZm9yIGxhc3QgZmV3IGZyYW1lcworICAgICAgICBDUSBNb2RlCisgICAgICAgIExpbWl0IGtleSBmcmFtZSBxdWFudGl6ZXIgZm9yIGZvcmNlZCBrZXkgZnJhbWVzLgorICAgICAgICBLRi9HRiBQdWxzaW5nCisgICAgICAgIEFkZCBzaW1wbGUgdmVyc2lvbiBvZiBhY3Rpdml0eSBtYXNraW5nLgorICAgICAgICBtYWtlIHJkbXVsdCBhZGFwdGl2ZSBmb3IgaW50cmEgaW4gcXVhbnRpemVyIFJETworICAgICAgICBjYXAgdGhlIGJlc3QgcXVhbnRpemVyIGZvciAybmQgb3JkZXIgREMKKyAgICAgICAgY2hhbmdlIHRoZSB0aHJlc2hvbGQgb2YgREMgY2hlY2sgZm9yIGVuY29kZSBicmVha291dAorCisgIC0gQnVnIEZpeGVzOgorICAgICAgRml4IGNyYXNoIG9uIFNwYXJjIFNvbGFyaXMuCisgICAgICBGaXggY291bnRlciBvZiBmaXhlZCBrZXlmcmFtZSBkaXN0YW5jZQorICAgICAgQVJOUiBmaWx0ZXIgcG9pbnRlciB1cGRhdGUgYnVnIGZpeAorICAgICAgRml4ZWQgdXNlIG9mIG1vdGlvbiBwZXJjZW50YWdlIGluIEtGL0dGIGdyb3VwIGNhbGMKKyAgICAgIENoYW5nZWQgY29uZGl0aW9uIGZvciB1c2luZyBSRCBpbiBJbnRyYSBNb2RlCisgICAgICBGaXggZW5jb2RlciByZWFsLXRpbWUgb25seSBjb25maWd1cmF0aW9uLgorICAgICAgRml4IEFSTSBlbmNvZGVyIGNyYXNoIHdpdGggbXVsdGlwbGUgdG9rZW4gcGFydGl0aW9ucworICAgICAgRml4ZWQgYnVnIGZpcnN0IGNsdXN0ZXIgdGltZWNvZGUgb2Ygd2VibSBmaWxlIGlzIHdyb25nLgorICAgICAgRml4ZWQgdmFyaW91cyBlbmNvZGVyIGJ1Z3Mgd2l0aCBvZGQtc2l6ZWQgaW1hZ2VzCisgICAgICB2cDhlX2dldF9wcmV2aWV3IGZpeGVkIHdoZW4gc3BhdGlhbCByZXNhbXBsaW5nIGVuYWJsZWQKKyAgICAgIHF1YW50aXplcjogZml4IGFzc2VydGlvbiBpbiBmYXN0IHF1YW50aXplciBwYXRoCisgICAgICBBbGxvY2F0ZSBzb3VyY2UgYnVmZmVycyB0byBiZSBtdWx0aXBsZXMgb2YgMTYKKyAgICAgIEZpeCBmb3IgbWFudWFsIEdvbGRlbiBmcmFtZSBmcmVxdWVuY3kKKyAgICAgIEZpeCBkcmFzdGljIHVuZGVyc2hvb3QgaW4gbG9uZyBmb3JtIGNvbnRlbnQKKworCisyMDEwLTEwLTI4IHYwLjkuNSAiQXlsZXNidXJ5IgorICBPdXIgZmlyc3QgbmFtZWQgcmVsZWFzZSwgZm9jdXNlZCBvbiBhIGZhc3RlciBkZWNvZGVyLCBhbmQgYSBiZXR0ZXIgZW5jb2Rlci4KKworICAtIFVwZ3JhZGluZzoKKyAgICBUaGlzIHJlbGVhc2UgaW5jb3Jwb3JhdGVzIGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgY2hhbmdlcyB0byB0aGUKKyAgICBpdmZlbmMgYW5kIGl2ZmRlYyB0b29scy4gVGhlc2UgdG9vbHMgYXJlIG5vdyBjYWxsZWQgdnB4ZW5jIGFuZCB2cHhkZWMuCisKKyAgICB2cHhkZWMKKyAgICAgICogdGhlIC1xIChxdWlldCkgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIGFuZCByZXBsYWNlZCB3aXRoCisgICAgICAgIC12ICh2ZXJib3NlKS4gdGhlIG91dHB1dCBpcyBxdWlldCBieSBkZWZhdWx0LiBVc2UgLXYgdG8gc2VlCisgICAgICAgIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgYmluYXJ5LgorCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG5vdyB0byB3cml0ZSBvdXRwdXQgdG8gYSBzaW5nbGUgZmlsZQorICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWwgZnJhbWVzLiBUaGUgLXkgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICAgIFk0TSBvdXRwdXQgaXMgdGhlIGRlZmF1bHQuCisKKyAgICAgICogRm9yIHJhdyBJNDIwL1lWMTIgb3V0cHV0IGluc3RlYWQgb2YgWTRNLCB0aGUgLS1pNDIwIG9yIC0teXYxMgorICAgICAgICBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkLgorCisgICAgICAgICAgJCBpdmZkZWMgLW8gT1VUUFVUIElOUFVUCisgICAgICAgICAgJCB2cHhkZWMgLS1pNDIwIC1vIE9VVFBVVCBJTlBVVAorCisgICAgICAqIElmIGFuIG91dHB1dCBmaWxlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIHRvIHdyaXRlCisgICAgICAgIFk0TSB0byBzdGRvdXQuIFRoaXMgbWFrZXMgcGlwaW5nIG1vcmUgbmF0dXJhbC4KKworICAgICAgICAgICQgaXZmZGVjIC15IC1vIC0gSU5QVVQgfCAuLi4KKyAgICAgICAgICAkIHZweGRlYyBJTlBVVCB8IC4uLgorCisgICAgICAqIFRoZSBvdXRwdXQgZmlsZSBoYXMgYWRkaXRpb25hbCBmbGV4aWJpbGl0eSBmb3IgZm9ybWF0dGluZyB0aGUKKyAgICAgICAgZmlsZW5hbWUuIEl0IHN1cHBvcnRzIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYQorICAgICAgICBmaWxlbmFtZSBmcm9tIHRoZSB3aWR0aCwgaGVpZ2h0LCBhbmQgc2VxdWVuY2UgbnVtYmVyLiBUaGlzCisgICAgICAgIHJlcGxhY2VzIHRoZSAtcCBvcHRpb24uIFRvIGdldCB0aGUgZXF1aXZhbGVudDoKKworICAgICAgICAgICQgaXZmZGVjIC1wIGZyYW1lIElOUFVUCisgICAgICAgICAgJCB2cHhkZWMgLS1pNDIwIC1vIGZyYW1lLSV3eCVoLSU0Lmk0MjAgSU5QVVQKKworICAgIHZweGVuYworICAgICAgKiBUaGUgb3V0cHV0IGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCAtbywgcmF0aGVyIHRoYW4gYXMgdGhlCisgICAgICAgIGxhc3QgYXJndW1lbnQuCisKKyAgICAgICAgICAkIGl2ZmVuYyA8b3B0aW9ucz4gSU5QVVQgT1VUUFVUCisgICAgICAgICAgJCB2cHhlbmMgPG9wdGlvbnM+IC1vIE9VVFBVVCBJTlBVVAorCisgICAgICAqIFRoZSBvdXRwdXQgZGVmYXVsdHMgdG8gd2VibS4gVG8gZ2V0IElWRiBvdXRwdXQsIHVzZSB0aGUgLS1pdmYKKyAgICAgICAgb3B0aW9uLgorCisgICAgICAgICAgJCBpdmZlbmMgPG9wdGlvbnM+IElOUFVUIE9VVFBVVC5pdmYKKyAgICAgICAgICAkIHZweGVuYyA8b3B0aW9ucz4gLW8gT1VUUFVULml2ZiAtLWl2ZiBJTlBVVAorCisKKyAgLSBFbmhhbmNlbWVudHM6CisgICAgICBpdmZlbmMgYW5kIGl2ZmRlYyBoYXZlIGJlZW4gcmVuYW1lZCB0byB2cHhlbmMsIHZweGRlYy4KKyAgICAgIHZweGRlYyBzdXBwb3J0cyAud2VibSBpbnB1dAorICAgICAgdnB4ZGVjIHdyaXRlcyAueTRtIGJ5IGRlZmF1bHQKKyAgICAgIHZweGVuYyB3cml0ZXMgLndlYm0gb3V0cHV0IGJ5IGRlZmF1bHQKKyAgICAgIHZweGVuYyAtLXBzbnIgbm93IHNob3dzIHRoZSBhdmVyYWdlL292ZXJhbGwgUFNOUiBhdCB0aGUgZW5kCisgICAgICBBUk0gcGxhdGZvcm1zIG5vdyBzdXBwb3J0IHJ1bnRpbWUgY3B1IGRldGVjdGlvbgorICAgICAgdnB4ZGVjIHZpc3VhbGl6YXRpb25zIGFkZGVkIGZvciBtb3Rpb24gdmVjdG9ycywgYmxvY2sgbW9kZXMsIHJlZmVyZW5jZXMKKyAgICAgIHZweGRlYyBub3cgc2lsZW50IGJ5IGRlZmF1bHQKKyAgICAgIHZweGRlYyAtLXByb2dyZXNzIHNob3dzIGZyYW1lLWJ5LWZyYW1lIHRpbWluZyBpbmZvcm1hdGlvbgorICAgICAgdnB4ZW5jIHN1cHBvcnRzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIC0tZnBzIGFuZCAtLXRpbWViYXNlCisgICAgICBOQVNNIGlzIG5vdyBhIHN1cHBvcnRlZCBhc3NlbWJsZXIKKyAgICAgIGNvbmZpZ3VyZTogZW5hYmxlIFBJQyBmb3Igc2hhcmVkIGxpYnMgYnkgZGVmYXVsdAorICAgICAgY29uZmlndXJlOiBhZGQgLS1lbmFibGUtc21hbGwKKyAgICAgIGNvbmZpZ3VyZTogc3VwcG9ydCBmb3IgcHBjMzItbGludXgtZ2NjCisgICAgICBjb25maWd1cmU6IHN1cHBvcnQgZm9yIHNwYXJjLXNvbGFyaXMtZ2NjCisKKyAgLSBCdWdzOgorICAgICAgSW1wcm92ZSBoYW5kbGluZyBvZiBpbnZhbGlkIGZyYW1lcworICAgICAgRml4IHZhbGdyaW5kIGVycm9ycyBpbiB0aGUgTkVPTiBsb29wIGZpbHRlcnMuCisgICAgICBGaXggbG9vcGZpbHRlciBkZWx0YSB6ZXJvIHRyYW5zaXRpb25zCisgICAgICBGaXggdmFsZ3JpbmQgZXJyb3JzIGluIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9hcm12NigpLgorICAgICAgQnVpbGQgZml4ZXMgZm9yIGRhcndpbi1pY2MKKworICAtIFNwZWVkOgorICAgICAgMjAtNDAlIChhdmVyYWdlIDI4JSkgaW1wcm92ZW1lbnQgaW4gbGlidnB4IGRlY29kZXIgc3BlZWQsCisgICAgICBpbmNsdWRpbmc6CisgICAgICAgIFJld3JpdGUgdnA4X3Nob3J0X3dhbHNoNHg0X3NzZTIoKQorICAgICAgICBPcHRpbWl6YXRpb25zIG9uIHRoZSBsb29wZmlsdGVycy4KKyAgICAgICAgTWlzY2VsbGFuZW91cyBpbXByb3ZlbWVudHMgZm9yIEF0b20KKyAgICAgICAgQWRkIDQtdGFwIHZlcnNpb24gb2YgMm5kLXBhc3MgQVJNdjYgTUMgZmlsdGVyLgorICAgICAgICBJbXByb3ZlZCBtdWx0aXRocmVhZCB1dGlsaXphdGlvbgorICAgICAgICBCZXR0ZXIgaW5zdHJ1Y3Rpb24gY2hvaWNlcyBvbiB4ODYKKyAgICAgICAgcmVvcmRlciBkYXRhIHRvIHVzZSB3aWRlciBpbnN0cnVjdGlvbnMKKyAgICAgICAgVXBkYXRlIE5FT04gd2lkZSBpZGN0cworICAgICAgICBNYWtlIGJsb2NrIGFjY2VzcyB0byBmcmFtZSBidWZmZXIgc2VxdWVudGlhbAorICAgICAgICBJbXByb3ZlZCBzdWJzZXQgYmxvY2sgc2VhcmNoCisgICAgICAgIEJpbGluZWFyIHN1YnBpeGVsIG9wdGltaXphdGlvbnMgZm9yIHNzc2UzLgorICAgICAgICBEZWNyZWFzZSBtZW1vcnkgZm9vdHByaW50CisKKyAgICAgIEVuY29kZXIgc3BlZWQgaW1wcm92ZW1lbnRzIChwZXJjZW50YWdlIGdhaW4gbm90IG1lYXN1cmVkKToKKyAgICAgICAgU2tpcCB1bm5lY2Vzc2FyeSBzZWFyY2ggb2YgaWRlbnRpY2FsIGZyYW1lcworICAgICAgICBBZGQgU1NFMiBzdWJ0cmFjdCBmdW5jdGlvbnMKKyAgICAgICAgSW1wcm92ZSBib3VuZHMgY2hlY2tpbmcgaW4gdnA4X2RpYW1vbmRfc2VhcmNoX3NhZHg0KCkKKyAgICAgICAgQWRkZWQgdnA4X2Zhc3RfcXVhbnRpemVfYl9zc2UyCisKKyAgLSBRdWFsaXR5OgorICAgICAgT3ZlciA3JSBvdmVyYWxsIFBTTlIgaW1wcm92ZW1lbnQgKDYuMyUgU1NJTSkgaW4gImJlc3QiIHF1YWxpdHkKKyAgICAgIGVuY29kaW5nIG1vZGUsIGFuZCB1cCB0byA2MCUgaW1wcm92ZW1lbnQgb24gdmVyeSBub2lzeSwgc3RpbGwKKyAgICAgIG9yIHNsb3cgbW92aW5nIHNvdXJjZSB2aWRlbworCisgICAgICAgIE1vdGlvbiBjb21wZW5zYXRlZCB0ZW1wb3JhbCBmaWx0ZXIgZm9yIEFsdC1SZWYgTm9pc2UgUmVkdWN0aW9uCisgICAgICAgIEltcHJvdmVkIHVzZSBvZiB0cmVsbGlzIHF1YW50aXphdGlvbiBvbiAybmQgb3JkZXIgWSBibG9ja3MKKyAgICAgICAgVHVuZSBlZmZlY3Qgb2YgbW90aW9uIG9uIEtGL0dGIGJvb3N0IGluIHR3byBwYXNzCisgICAgICAgIEFsbG93IGNvZWZmaWNpZW50IG9wdGltaXphdGlvbiBmb3IgZ29vZCBxdWFsaXR5IHNwZWVkIDAuCisgICAgICAgIEltcHJvdmVkIGNvbnRyb2wgb2YgYWN0aXZlIG1pbiBxdWFudGl6ZXIgZm9yIHR3byBwYXNzLgorICAgICAgICBFbmFibGUgQVJGcyBmb3Igbm9uLWxhZ2dlZCBjb21wcmVzcworCisyMDEwLTA5LTAyIHYwLjkuMgorICAtIEVuaGFuY2VtZW50czoKKyAgICAgIERpc2FibGUgZnJhbWUgZHJvcHBpbmcgYnkgZGVmYXVsdAorICAgICAgSW1wcm92ZWQgbXVsdGl0aHJlYWRlZCBwZXJmb3JtYW5jZQorICAgICAgSW1wcm92ZWQgRm9yY2UgS2V5IEZyYW1lIEJlaGF2aW91cgorICAgICAgSW5jcmVhc2VkIHJhdGUgY29udHJvbCBidWZmZXIgbGV2ZWwgcHJlY2lzaW9uCisgICAgICBGaXggYnVnIGluIDFzdCBwYXNzIG1vdGlvbiBjb21wZW5zYXRpb24KKyAgICAgIGl2ZmVuYzogY29ycmVjdCBmaXhlZCBrZiBpbnRlcnZhbCwgLS1kaXNhYmxlLWtmCisgIC0gU3BlZWQ6CisgICAgICBDaGFuZ2VkIGFib3ZlIGFuZCBsZWZ0IGNvbnRleHQgZGF0YSBsYXlvdXQKKyAgICAgIFJld29yayBpZGN0IGNhbGxpbmcgc3RydWN0dXJlLgorICAgICAgUmVtb3ZlZCB1bm5lY2Vzc2FyeSBNQl9NT0RFX0lORk8gY29waWVzCisgICAgICB4ODY6IFNTU0UzIHNpeHRhcCBwcmVkaWN0aW9uCisgICAgICBSZXdvcmtlZCBJRENUIHRvIGluY2x1ZGUgcmVjb25zdHJ1Y3Rpb24gKGFkZCkgc3RlcAorICAgICAgU3dhcCBhbHQvZ29sZC9uZXcvbGFzdCBmcmFtZSBidWZmZXIgcHRycyBpbnN0ZWFkIG9mIGNvcHlpbmcuCisgICAgICBJbXByb3ZlIFNTRTIgbG9vcGZpbHRlciBmdW5jdGlvbnMKKyAgICAgIENoYW5nZSBiaXRyZWFkZXIgdG8gdXNlIGEgbGFyZ2VyIHdpbmRvdy4KKyAgICAgIEF2b2lkIGxvb3BmaWx0ZXIgcmVpbml0aWFsaXphdGlvbiB3aGVuIHBvc3NpYmxlCisgIC0gUXVhbGl0eToKKyAgICAgIE5vcm1hbGl6ZSBxdWFudGl6ZXIncyB6ZXJvIGJpbiBhbmQgcm91bmRpbmcgZmFjdG9ycworICAgICAgQWRkIHRyZWxsaXMgcXVhbnRpemF0aW9uLgorICAgICAgTWFrZSB0aGUgcXVhbnRpemVyIGV4YWN0LgorICAgICAgVXBkYXRlcyB0byBBUk5SIGZpbHRlcmluZyBhbGdvcml0aG0KKyAgICAgIEZpeCBicmVha291dCB0aHJlc2ggY29tcHV0YXRpb24gZm9yIGdvbGRlbiAmIEFsdFJlZiBmcmFtZXMKKyAgICAgIFJlZG8gdGhlIGZvcndhcmQgNHg0IGRjdAorICAgICAgSW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgZm9yd2FyZCB3YWxzaC1oYWRhbWFyZCB0cmFuc2Zvcm0KKyAgICAgIEZ1cnRoZXIgYWRqdXN0bWVudCBvZiBSRCBiZWhhdmlvdXIgd2l0aCBRIGFuZCBaYmluLgorICAtIEJ1aWxkIFN5c3RlbToKKyAgICAgIEFsbG93IGxpbmtpbmcgb2YgbGlicyBidWlsdCB3aXRoIE1pbkdXIHRvIE1TVkMKKyAgICAgIEZpeCB0YXJnZXQgYXV0by1kZXRlY3Rpb24gb24gbWluZ3czMgorICAgICAgQWxsb3cgLS1jcHU9IHRvIHdvcmsgZm9yIHg4Ni4KKyAgICAgIGNvbmZpZ3VyZTogcGFzcyBvcmlnaW5hbCBhcmd1bWVudHMgdGhyb3VnaCB0byBtYWtlIGRpc3QKKyAgICAgIEZpeCBidWlsZHMgd2l0aG91dCBydW50aW1lIENQVSBkZXRlY3Rpb24KKyAgICAgIG1zdnM6IGZpeCBpbnN0YWxsIG9mIGNvZGVjIHNvdXJjZXMKKyAgICAgIG1zdnM6IENoYW5nZSBkZXZlbnYuY29tIGNvbW1hbmQgbGluZSBmb3IgYmV0dGVyIG1zeXMgc3VwcG9ydAorICAgICAgbXN2czogQWRkIHZzOSB0YXJnZXRzLgorICAgICAgQWRkIHg4Nl82NC1saW51eC1pY2MgdGFyZ2V0CisgIC0gQnVnczoKKyAgICAgIFBvdGVudGlhbCBjcmFzaGVzIG9uIG9sZGVyIE1pbkdXIGJ1aWxkcworICAgICAgRml4IHR3by1wYXNzIGZyYW1yYXRlIGZvciBZNE0gaW5wdXQuCisgICAgICBGaXhlZCBzaW1wbGUgbG9vcCBmaWx0ZXIsIG90aGVyIGNyYXNoZXMgb24gQVJNIHY2CisgICAgICBhcm06IGZpeCBtaXNzaW5nIGRlcGVuZGVuY3kgd2l0aCAtLWVuYWJsZS1zaGFyZWQKKyAgICAgIGNvbmZpZ3VyZTogc3VwcG9ydCBkaXJlY3RvcmllcyBjb250YWluaW5nIC5vCisgICAgICBSZXBsYWNlIHBpbnNydyAoU1NFKSB3aXRoIE1NWCBpbnN0cnVjdGlvbnMKKyAgICAgIGFwcGxlOiBpbmNsdWRlIHByb3BlciBtYWNoIHByaW1hdGl2ZXMKKyAgICAgIEZpeGVkIHJhdGUgY29udHJvbCBidWcgd2l0aCBsb25nIGtleSBmcmFtZSBpbnRlcnZhbC4KKyAgICAgIEZpeCBEU08gbGluayBlcnJvcnMgb24geDg2LTY0IHdoZW4gbm90IHVzaW5nIGEgdmVyc2lvbiBzY3JpcHQKKyAgICAgIEZpeGVkIGJ1ZmZlciBzZWxlY3Rpb24gZm9yIFVWIGluIEFsdFJlZiBmaWx0ZXJpbmcKKworCisyMDEwLTA2LTE3IHYwLjkuMQorICAtIEVuaGFuY2VtZW50czoKKyAgICAgICogaXZmZW5jL2l2ZmRlYyBub3cgc3VwcG9ydCBZVVY0TVBFRzIgaW5wdXQgYW5kIHBpcGUgSS9PCisgICAgICAqIFNwZWVkIG9wdGltaXphdGlvbnMKKyAgLSBCdWdmaXhlczoKKyAgICAgICogUmF0ZSBjb250cm9sCisgICAgICAqIFByZXZlbnQgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiBpbnZhbGlkIGRhdGEKKyAgLSBCdWlsZCBzeXN0ZW0gdXBkYXRlczoKKyAgICAgICogRGV0ZWN0IHRvb2xjaGFpbiB0byBiZSB1c2VkIGF1dG9tYXRpY2FsbHkgZm9yIG5hdGl2ZSBidWlsZHMKKyAgICAgICogU3VwcG9ydCBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzCisgICAgICAqIEJldHRlciBhdXRvdG9vbHMgZW11bGF0aW9uICgtLXByZWZpeCwgLS1saWJkaXIsIERFU1RESVIpCisgIC0gVXBkYXRlZCBMSUNFTlNFCisgICAgICAqIGh0dHA6Ly93ZWJtcHJvamVjdC5ibG9nc3BvdC5jb20vMjAxMC8wNi9jaGFuZ2VzLXRvLXdlYm0tb3Blbi1zb3VyY2UtbGljZW5zZS5odG1sCisKKworMjAxMC0wNS0xOCB2MC45LjAKKyAgLSBJbml0aWFsIG9wZW4gc291cmNlIHJlbGVhc2UuIFdlbGNvbWUgdG8gV2ViTSBhbmQgVlA4IQorCmRpZmYgLS1naXQgYS9saWJ2cHgvTElDRU5TRSBiL2xpYnZweC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTQ0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvTElDRU5TRQpAQCAtMCwwICsxLDMxIEBACitDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBXZWJNIFByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgIGRpc3RyaWJ1dGlvbi4KKworICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlLCBub3IgdGhlIFdlYk0gUHJvamVjdCwgbm9yIHRoZSBuYW1lcworICAgIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK0hPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKZGlmZiAtLWdpdCBhL1BBVEVOVFMgYi9saWJ2cHgvUEFURU5UUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gUEFURU5UUwpyZW5hbWUgdG8gbGlidnB4L1BBVEVOVFMKZGlmZiAtLWdpdCBhL2xpYnZweC9SRUFETUUgYi9saWJ2cHgvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzVkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvUkVBRE1FCkBAIC0wLDAgKzEsMTA2IEBACit2cHggTXVsdGktRm9ybWF0IENvZGVjIFNESworUkVBRE1FIC0gMjEgSnVuZSAyMDEyCisKK1dlbGNvbWUgdG8gdGhlIFdlYk0gVlA4IENvZGVjIFNESyEKKworQ09NUElMSU5HIFRIRSBBUFBMSUNBVElPTlMvTElCUkFSSUVTOgorICBUaGUgYnVpbGQgc3lzdGVtIHVzZWQgaXMgc2ltaWxhciB0byBhdXRvdG9vbHMuIEJ1aWxkaW5nIGdlbmVyYWxseSBjb25zaXN0cyBvZgorICAiY29uZmlndXJpbmciIHdpdGggeW91ciBkZXNpcmVkIGJ1aWxkIG9wdGlvbnMsIHRoZW4gdXNpbmcgR05VIG1ha2UgdG8gYnVpbGQKKyAgdGhlIGFwcGxpY2F0aW9uLgorCisgIDEuIFByZXJlcXVpc2l0ZXMKKworICAgICogQWxsIHg4NiB0YXJnZXRzIHJlcXVpcmUgdGhlIFlhc21bMV0gYXNzZW1ibGVyIGJlIGluc3RhbGxlZC4KKyAgICAqIEFsbCBXaW5kb3dzIGJ1aWxkcyByZXF1aXJlIHRoYXQgQ3lnd2luWzJdIGJlIGluc3RhbGxlZC4KKyAgICAqIEJ1aWxkaW5nIHRoZSBkb2N1bWVudGF0aW9uIHJlcXVpcmVzIFBIUFszXSBhbmQgRG94eWdlbls0XS4gSWYgeW91IGRvIG5vdAorICAgICAgaGF2ZSB0aGVzZSBwYWNrYWdlcywgeW91IG11c3QgcGFzcyAtLWRpc2FibGUtaW5zdGFsbC1kb2NzIHRvIHRoZQorICAgICAgY29uZmlndXJlIHNjcmlwdC4KKyAgICAqIERvd25sb2FkaW5nIHRoZSBkYXRhIGZvciB0aGUgdW5pdCB0ZXN0cyByZXF1aXJlcyBjdXJsWzVdIGFuZCBzaGExc3VtLgorICAgICAgc2hhMXN1bSBpcyBwcm92aWRlZCB2aWEgdGhlIEdOVSBjb3JldXRpbHMsIGluc3RhbGxlZCBieSBkZWZhdWx0IG9uCisgICAgICBtYW55ICpuaXggcGxhdGZvcm1zLCBhcyB3ZWxsIGFzIE1pbkdXIGFuZCBDeWd3aW4uIElmIGNvcmV1dGlscyBpcyBub3QKKyAgICAgIGF2YWlsYWJsZSwgYSBjb21wYXRpYmxlIHZlcnNpb24gb2Ygc2hhMXN1bSBjYW4gYmUgYnVpbHQgZnJvbQorICAgICAgc291cmNlWzZdLiBUaGVzZSByZXF1aXJlbWVudHMgYXJlIG9wdGlvbmFsIGlmIG5vdCBydW5uaW5nIHRoZSB1bml0CisgICAgICB0ZXN0cy4KKworICAgIFsxXTogaHR0cDovL3d3dy50b3J0YWxsLm5ldC9wcm9qZWN0cy95YXNtCisgICAgWzJdOiBodHRwOi8vd3d3LmN5Z3dpbi5jb20KKyAgICBbM106IGh0dHA6Ly9waHAubmV0CisgICAgWzRdOiBodHRwOi8vd3d3LmRveHlnZW4ub3JnCisgICAgWzVdOiBodHRwOi8vY3VybC5oYXh4LnNlCisgICAgWzZdOiBodHRwOi8vd3d3Lm1pY3JvYnJldy5vcmcvdG9vbHMvbWQ1c2hhMXN1bS8KKworICAyLiBPdXQtb2YtdHJlZSBidWlsZHMKKyAgT3V0IG9mIHRyZWUgYnVpbGRzIGFyZSBhIHN1cHBvcnRlZCBtZXRob2Qgb2YgYnVpbGRpbmcgdGhlIGFwcGxpY2F0aW9uLiBGb3IKKyAgYW4gb3V0IG9mIHRyZWUgYnVpbGQsIHRoZSBzb3VyY2UgdHJlZSBpcyBrZXB0IHNlcGFyYXRlIGZyb20gdGhlIG9iamVjdAorICBmaWxlcyBwcm9kdWNlZCBkdXJpbmcgY29tcGlsYXRpb24uIEZvciBpbnN0YW5jZToKKworICAgICQgbWtkaXIgYnVpbGQKKyAgICAkIGNkIGJ1aWxkCisgICAgJCAuLi9saWJ2cHgvY29uZmlndXJlIDxvcHRpb25zPgorICAgICQgbWFrZQorCisgIDMuIENvbmZpZ3VyYXRpb24gb3B0aW9ucworICBUaGUgJ2NvbmZpZ3VyZScgc2NyaXB0IHN1cHBvcnRzIGEgbnVtYmVyIG9mIG9wdGlvbnMuIFRoZSAtLWhlbHAgb3B0aW9uIGNhbiBiZQorICB1c2VkIHRvIGdldCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnM6CisgICAgJCAuLi9saWJ2cHgvY29uZmlndXJlIC0taGVscAorCisgIDQuIENyb3NzIGRldmVsb3BtZW50CisgIEZvciBjcm9zcyBkZXZlbG9wbWVudCwgdGhlIG1vc3Qgbm90YWJsZSBvcHRpb24gaXMgdGhlIC0tdGFyZ2V0IG9wdGlvbi4gVGhlCisgIG1vc3QgdXAtdG8tZGF0ZSBsaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXRzIGNhbiBiZSBmb3VuZCBhdCB0aGUgYm90dG9tIG9mIHRoZQorICAtLWhlbHAgb3V0cHV0IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LiBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBsaXN0IG9mCisgIGF2YWlsYWJsZSB0YXJnZXRzIGlzOgorCisgICAgYXJtdjV0ZS1hbmRyb2lkLWdjYworICAgIGFybXY1dGUtbGludXgtcnZjdAorICAgIGFybXY1dGUtbGludXgtZ2NjCisgICAgYXJtdjYtZGFyd2luLWdjYworICAgIGFybXY2LWxpbnV4LXJ2Y3QKKyAgICBhcm12Ni1saW51eC1nY2MKKyAgICBhcm12Ny1hbmRyb2lkLWdjYworICAgIGFybXY3LWxpbnV4LXJ2Y3QKKyAgICBhcm12Ny1saW51eC1nY2MKKyAgICBtaXBzMzItbGludXgtZ2NjCisgICAgcHBjMzItZGFyd2luOC1nY2MKKyAgICBwcGMzMi1kYXJ3aW45LWdjYworICAgIHBwYzY0LWRhcndpbjgtZ2NjCisgICAgcHBjNjQtZGFyd2luOS1nY2MKKyAgICBwcGM2NC1saW51eC1nY2MKKyAgICB4ODYtZGFyd2luOC1nY2MKKyAgICB4ODYtZGFyd2luOC1pY2MKKyAgICB4ODYtZGFyd2luOS1nY2MKKyAgICB4ODYtZGFyd2luOS1pY2MKKyAgICB4ODYtbGludXgtZ2NjCisgICAgeDg2LWxpbnV4LWljYworICAgIHg4Ni1zb2xhcmlzLWdjYworICAgIHg4Ni13aW4zMi12czcKKyAgICB4ODYtd2luMzItdnM4CisgICAgeDg2XzY0LWRhcndpbjktZ2NjCisgICAgeDg2XzY0LWxpbnV4LWdjYworICAgIHg4Nl82NC1zb2xhcmlzLWdjYworICAgIHg4Nl82NC13aW42NC12czgKKyAgICB1bml2ZXJzYWwtZGFyd2luOC1nY2MKKyAgICB1bml2ZXJzYWwtZGFyd2luOS1nY2MKKyAgICBnZW5lcmljLWdudQorCisgIFRoZSBnZW5lcmljLWdudSB0YXJnZXQsIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIENST1NTIGVudmlyb25tZW50IHZhcmlhYmxlLAorICBjYW4gYmUgdXNlZCB0byBjcm9zcyBjb21waWxlIGFyY2hpdGVjdHVyZXMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBsaXN0ZWQsIGlmCisgIHRoZSB0b29sY2hhaW4gaXMgYSBjcm9zcyBHTlUgKGdjYy9iaW51dGlscykgdG9vbGNoYWluLiBPdGhlciBQT1NJWCB0b29sY2hhaW5zCisgIHdpbGwgbGlrZWx5IHdvcmsgYXMgd2VsbC4gRm9yIGluc3RhbmNlLCB0byBidWlsZCB1c2luZyB0aGUgbWlwc2VsLWxpbnV4LXVjbGliYworICB0b29sY2hhaW4sIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjb3VsZCBiZSB1c2VkIChub3RlLCBQT1NJWCBTSCBzeW50YXgsIGFkYXB0CisgIHRvIHlvdXIgc2hlbGwgYXMgbmVjZXNzYXJ5KToKKworICAgICQgQ1JPU1M9bWlwc2VsLWxpbnV4LXVjbGliYy0gLi4vbGlidnB4L2NvbmZpZ3VyZQorCisgIEluIGFkZGl0aW9uLCB0aGUgZXhlY3V0YWJsZXMgdG8gYmUgaW52b2tlZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nIHRoZQorICBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IENDLCBBUiwgTEQsIEFTLCBTVFJJUCwgTk0uIEFkZGl0aW9uYWwgZmxhZ3MgY2FuIGJlCisgIHBhc3NlZCB0byB0aGVzZSBleGVjdXRhYmxlcyB3aXRoIENGTEFHUywgTERGTEFHUywgYW5kIEFTRkxBR1MuCisKKyAgNS4gQ29uZmlndXJhdGlvbiBlcnJvcnMKKyAgSWYgdGhlIGNvbmZpZ3VyYXRpb24gc3RlcCBmYWlscywgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gbG9vayBpbiB0aGUgZXJyb3IgbG9nLgorICBUaGlzIGRlZmF1bHRzIHRvIGNvbmZpZy5lcnIuIFRoaXMgc2hvdWxkIGdpdmUgYSBnb29kIGluZGljYXRpb24gb2Ygd2hhdCB3ZW50CisgIHdyb25nLiBJZiBub3QsIGNvbnRhY3QgdXMgZm9yIHN1cHBvcnQuCisKK1NVUFBPUlQKKyAgVGhpcyBsaWJyYXJ5IGlzIGFuIG9wZW4gc291cmNlIHByb2plY3Qgc3VwcG9ydGVkIGJ5IGl0cyBjb21tdW5pdHkuIFBsZWFzZQorICBwbGVhc2UgZW1haWwgd2VibS1kaXNjdXNzQHdlYm1wcm9qZWN0Lm9yZyBmb3IgaGVscC4KKwpkaWZmIC0tZ2l0IGEvbGlidnB4L2FyZ3MuYyBiL2xpYnZweC9hcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiYTc3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9hcmdzLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiYXJncy5oIgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCitleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisjZWxzZQorZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorCisKK3N0cnVjdCBhcmcgYXJnX2luaXQoY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IGFyZyBhOworCisgICAgYS5hcmd2ICAgICAgPSBhcmd2OworICAgIGEuYXJndl9zdGVwID0gMTsKKyAgICBhLm5hbWUgICAgICA9IE5VTEw7CisgICAgYS52YWwgICAgICAgPSBOVUxMOworICAgIGEuZGVmICAgICAgID0gTlVMTDsKKyAgICByZXR1cm4gYTsKK30KKworaW50IGFyZ19tYXRjaChzdHJ1Y3QgYXJnICphcmdfLCBjb25zdCBzdHJ1Y3QgYXJnX2RlZiAqZGVmLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgYXJnIGFyZzsKKworICAgIGlmICghYXJndlswXSB8fCBhcmd2WzBdWzBdICE9ICctJykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhcmcgPSBhcmdfaW5pdChhcmd2KTsKKworICAgIGlmIChkZWYtPnNob3J0X25hbWUKKyAgICAgICAgJiYgc3RybGVuKGFyZy5hcmd2WzBdKSA9PSBzdHJsZW4oZGVmLT5zaG9ydF9uYW1lKSArIDEKKyAgICAgICAgJiYgIXN0cmNtcChhcmcuYXJndlswXSArIDEsIGRlZi0+c2hvcnRfbmFtZSkpCisgICAgeworCisgICAgICAgIGFyZy5uYW1lID0gYXJnLmFyZ3ZbMF0gKyAxOworICAgICAgICBhcmcudmFsID0gZGVmLT5oYXNfdmFsID8gYXJnLmFyZ3ZbMV0gOiBOVUxMOworICAgICAgICBhcmcuYXJndl9zdGVwID0gZGVmLT5oYXNfdmFsID8gMiA6IDE7CisgICAgfQorICAgIGVsc2UgaWYgKGRlZi0+bG9uZ19uYW1lKQorICAgIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVfbGVuID0gc3RybGVuKGRlZi0+bG9uZ19uYW1lKTsKKworICAgICAgICBpZiAoc3RybGVuKGFyZy5hcmd2WzBdKSA+PSBuYW1lX2xlbiArIDIKKyAgICAgICAgICAgICYmIGFyZy5hcmd2WzBdWzFdID09ICctJworICAgICAgICAgICAgJiYgIXN0cm5jbXAoYXJnLmFyZ3ZbMF0gKyAyLCBkZWYtPmxvbmdfbmFtZSwgbmFtZV9sZW4pCisgICAgICAgICAgICAmJiAoYXJnLmFyZ3ZbMF1bbmFtZV9sZW4rMl0gPT0gJz0nCisgICAgICAgICAgICAgICAgfHwgYXJnLmFyZ3ZbMF1bbmFtZV9sZW4rMl0gPT0gJ1wwJykpCisgICAgICAgIHsKKworICAgICAgICAgICAgYXJnLm5hbWUgPSBhcmcuYXJndlswXSArIDI7CisgICAgICAgICAgICBhcmcudmFsID0gYXJnLm5hbWVbbmFtZV9sZW5dID09ICc9JyA/IGFyZy5uYW1lICsgbmFtZV9sZW4gKyAxIDogTlVMTDsKKyAgICAgICAgICAgIGFyZy5hcmd2X3N0ZXAgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFyZy5uYW1lICYmICFhcmcudmFsICYmIGRlZi0+aGFzX3ZhbCkKKyAgICAgICAgZGllKCJFcnJvcjogb3B0aW9uICVzIHJlcXVpcmVzIGFyZ3VtZW50LlxuIiwgYXJnLm5hbWUpOworCisgICAgaWYgKGFyZy5uYW1lICYmIGFyZy52YWwgJiYgIWRlZi0+aGFzX3ZhbCkKKyAgICAgICAgZGllKCJFcnJvcjogb3B0aW9uICVzIHJlcXVpcmVzIG5vIGFyZ3VtZW50LlxuIiwgYXJnLm5hbWUpOworCisgICAgaWYgKGFyZy5uYW1lCisgICAgICAgICYmIChhcmcudmFsIHx8ICFkZWYtPmhhc192YWwpKQorICAgIHsKKyAgICAgICAgYXJnLmRlZiA9IGRlZjsKKyAgICAgICAgKmFyZ18gPSBhcmc7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2NvbnN0IGNoYXIgKmFyZ19uZXh0KHN0cnVjdCBhcmcgKmFyZykKK3sKKyAgICBpZiAoYXJnLT5hcmd2WzBdKQorICAgICAgICBhcmctPmFyZ3YgKz0gYXJnLT5hcmd2X3N0ZXA7CisKKyAgICByZXR1cm4gKmFyZy0+YXJndjsKK30KKworCitjaGFyICoqYXJndl9kdXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworICAgIGNoYXIgKipuZXdfYXJndiA9IG1hbGxvYygoYXJnYyArIDEpICogc2l6ZW9mKCphcmd2KSk7CisKKyAgICBtZW1jcHkobmV3X2FyZ3YsIGFyZ3YsIGFyZ2MgKiBzaXplb2YoKmFyZ3YpKTsKKyAgICBuZXdfYXJndlthcmdjXSA9IE5VTEw7CisgICAgcmV0dXJuIG5ld19hcmd2OworfQorCisKK3ZvaWQgYXJnX3Nob3dfdXNhZ2UoRklMRSAqZnAsIGNvbnN0IHN0cnVjdCBhcmdfZGVmICpjb25zdCAqZGVmcykKK3sKKyAgICBjaGFyIG9wdGlvbl90ZXh0WzQwXSA9IHswfTsKKworICAgIGZvciAoOyAqZGVmczsgZGVmcysrKQorICAgIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGFyZ19kZWYgKmRlZiA9ICpkZWZzOworICAgICAgICBjaGFyICpzaG9ydF92YWwgPSBkZWYtPmhhc192YWwgPyAiIDxhcmc+IiA6ICIiOworICAgICAgICBjaGFyICpsb25nX3ZhbCA9IGRlZi0+aGFzX3ZhbCA/ICI9PGFyZz4iIDogIiI7CisKKyAgICAgICAgaWYgKGRlZi0+c2hvcnRfbmFtZSAmJiBkZWYtPmxvbmdfbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqY29tbWEgPSBkZWYtPmhhc192YWwgPyAiLCIgOiAiLCAgICAgICI7CisKKyAgICAgICAgICAgIHNucHJpbnRmKG9wdGlvbl90ZXh0LCAzNywgIi0lcyVzJXMgLS0lcyU2cyIsCisgICAgICAgICAgICAgICAgICAgICBkZWYtPnNob3J0X25hbWUsIHNob3J0X3ZhbCwgY29tbWEsCisgICAgICAgICAgICAgICAgICAgICBkZWYtPmxvbmdfbmFtZSwgbG9uZ192YWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGRlZi0+c2hvcnRfbmFtZSkKKyAgICAgICAgICAgIHNucHJpbnRmKG9wdGlvbl90ZXh0LCAzNywgIi0lcyVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlZi0+c2hvcnRfbmFtZSwgc2hvcnRfdmFsKTsKKyAgICAgICAgZWxzZSBpZiAoZGVmLT5sb25nX25hbWUpCisgICAgICAgICAgICBzbnByaW50ZihvcHRpb25fdGV4dCwgMzcsICIgICAgICAgICAgLS0lcyVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlZi0+bG9uZ19uYW1lLCBsb25nX3ZhbCk7CisKKyAgICAgICAgZnByaW50ZihmcCwgIiAgJS0zN3NcdCVzXG4iLCBvcHRpb25fdGV4dCwgZGVmLT5kZXNjKTsKKworICAgICAgICBpZihkZWYtPmVudW1zKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXJnX2VudW1fbGlzdCAqbGlzdHB0cjsKKworICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgJS0zN3NcdCAgIiwgIiIpOworCisgICAgICAgICAgICBmb3IobGlzdHB0ciA9IGRlZi0+ZW51bXM7IGxpc3RwdHItPm5hbWU7IGxpc3RwdHIrKykKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXMlcyIsIGxpc3RwdHItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0cHRyWzFdLm5hbWUgPyAiLCAiIDogIlxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordW5zaWduZWQgaW50IGFyZ19wYXJzZV91aW50KGNvbnN0IHN0cnVjdCBhcmcgKmFyZykKK3sKKyAgICBsb25nIGludCAgIHJhd3ZhbDsKKyAgICBjaGFyICAgICAgKmVuZHB0cjsKKworICAgIHJhd3ZhbCA9IHN0cnRvbChhcmctPnZhbCwgJmVuZHB0ciwgMTApOworCisgICAgaWYgKGFyZy0+dmFsWzBdICE9ICdcMCcgJiYgZW5kcHRyWzBdID09ICdcMCcpCisgICAgeworICAgICAgICBpZiAocmF3dmFsID49IDAgJiYgcmF3dmFsIDw9IFVJTlRfTUFYKQorICAgICAgICAgICAgcmV0dXJuIHJhd3ZhbDsKKworICAgICAgICBkaWUoIk9wdGlvbiAlczogVmFsdWUgJWxkIG91dCBvZiByYW5nZSBmb3IgdW5zaWduZWQgaW50XG4iLAorICAgICAgICAgICAgYXJnLT5uYW1lLCByYXd2YWwpOworICAgIH0KKworICAgIGRpZSgiT3B0aW9uICVzOiBJbnZhbGlkIGNoYXJhY3RlciAnJWMnXG4iLCBhcmctPm5hbWUsICplbmRwdHIpOworICAgIHJldHVybiAwOworfQorCisKK2ludCBhcmdfcGFyc2VfaW50KGNvbnN0IHN0cnVjdCBhcmcgKmFyZykKK3sKKyAgICBsb25nIGludCAgIHJhd3ZhbDsKKyAgICBjaGFyICAgICAgKmVuZHB0cjsKKworICAgIHJhd3ZhbCA9IHN0cnRvbChhcmctPnZhbCwgJmVuZHB0ciwgMTApOworCisgICAgaWYgKGFyZy0+dmFsWzBdICE9ICdcMCcgJiYgZW5kcHRyWzBdID09ICdcMCcpCisgICAgeworICAgICAgICBpZiAocmF3dmFsID49IElOVF9NSU4gJiYgcmF3dmFsIDw9IElOVF9NQVgpCisgICAgICAgICAgICByZXR1cm4gcmF3dmFsOworCisgICAgICAgIGRpZSgiT3B0aW9uICVzOiBWYWx1ZSAlbGQgb3V0IG9mIHJhbmdlIGZvciBzaWduZWQgaW50XG4iLAorICAgICAgICAgICAgYXJnLT5uYW1lLCByYXd2YWwpOworICAgIH0KKworICAgIGRpZSgiT3B0aW9uICVzOiBJbnZhbGlkIGNoYXJhY3RlciAnJWMnXG4iLCBhcmctPm5hbWUsICplbmRwdHIpOworICAgIHJldHVybiAwOworfQorCisKK3N0cnVjdCB2cHhfcmF0aW9uYWwKK3sKKyAgICBpbnQgbnVtOyAvKio8IGZyYWN0aW9uIG51bWVyYXRvciAqLworICAgIGludCBkZW47IC8qKjwgZnJhY3Rpb24gZGVub21pbmF0b3IgKi8KK307CitzdHJ1Y3QgdnB4X3JhdGlvbmFsIGFyZ19wYXJzZV9yYXRpb25hbChjb25zdCBzdHJ1Y3QgYXJnICphcmcpCit7CisgICAgbG9uZyBpbnQgICAgICAgICAgICAgcmF3dmFsOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmVuZHB0cjsKKyAgICBzdHJ1Y3QgdnB4X3JhdGlvbmFsICByYXQ7CisKKyAgICAvKiBwYXJzZSBudW1lcmF0b3IgKi8KKyAgICByYXd2YWwgPSBzdHJ0b2woYXJnLT52YWwsICZlbmRwdHIsIDEwKTsKKworICAgIGlmIChhcmctPnZhbFswXSAhPSAnXDAnICYmIGVuZHB0clswXSA9PSAnLycpCisgICAgeworICAgICAgICBpZiAocmF3dmFsID49IElOVF9NSU4gJiYgcmF3dmFsIDw9IElOVF9NQVgpCisgICAgICAgICAgICByYXQubnVtID0gcmF3dmFsOworICAgICAgICBlbHNlIGRpZSgiT3B0aW9uICVzOiBWYWx1ZSAlbGQgb3V0IG9mIHJhbmdlIGZvciBzaWduZWQgaW50XG4iLAorICAgICAgICAgICAgICAgICAgICAgYXJnLT5uYW1lLCByYXd2YWwpOworICAgIH0KKyAgICBlbHNlIGRpZSgiT3B0aW9uICVzOiBFeHBlY3RlZCAvIGF0ICclYydcbiIsIGFyZy0+bmFtZSwgKmVuZHB0cik7CisKKyAgICAvKiBwYXJzZSBkZW5vbWluYXRvciAqLworICAgIHJhd3ZhbCA9IHN0cnRvbChlbmRwdHIgKyAxLCAmZW5kcHRyLCAxMCk7CisKKyAgICBpZiAoYXJnLT52YWxbMF0gIT0gJ1wwJyAmJiBlbmRwdHJbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICAgIGlmIChyYXd2YWwgPj0gSU5UX01JTiAmJiByYXd2YWwgPD0gSU5UX01BWCkKKyAgICAgICAgICAgIHJhdC5kZW4gPSByYXd2YWw7CisgICAgICAgIGVsc2UgZGllKCJPcHRpb24gJXM6IFZhbHVlICVsZCBvdXQgb2YgcmFuZ2UgZm9yIHNpZ25lZCBpbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICBhcmctPm5hbWUsIHJhd3ZhbCk7CisgICAgfQorICAgIGVsc2UgZGllKCJPcHRpb24gJXM6IEludmFsaWQgY2hhcmFjdGVyICclYydcbiIsIGFyZy0+bmFtZSwgKmVuZHB0cik7CisKKyAgICByZXR1cm4gcmF0OworfQorCisKK2ludCBhcmdfcGFyc2VfZW51bShjb25zdCBzdHJ1Y3QgYXJnICphcmcpCit7CisgICAgY29uc3Qgc3RydWN0IGFyZ19lbnVtX2xpc3QgKmxpc3RwdHI7CisgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgIHJhd3ZhbDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqZW5kcHRyOworCisgICAgLyogRmlyc3Qgc2VlIGlmIHRoZSB2YWx1ZSBjYW4gYmUgcGFyc2VkIGFzIGEgcmF3IHZhbHVlICovCisgICAgcmF3dmFsID0gc3RydG9sKGFyZy0+dmFsLCAmZW5kcHRyLCAxMCk7CisgICAgaWYgKGFyZy0+dmFsWzBdICE9ICdcMCcgJiYgZW5kcHRyWzBdID09ICdcMCcpCisgICAgeworICAgICAgICAvKiBHb3QgYSByYXcgdmFsdWUsIG1ha2Ugc3VyZSBpdCdzIHZhbGlkICovCisgICAgICAgIGZvcihsaXN0cHRyID0gYXJnLT5kZWYtPmVudW1zOyBsaXN0cHRyLT5uYW1lOyBsaXN0cHRyKyspCisgICAgICAgICAgICBpZihsaXN0cHRyLT52YWwgPT0gcmF3dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByYXd2YWw7CisgICAgfQorCisgICAgLyogTmV4dCBzZWUgaWYgaXQgY2FuIGJlIHBhcnNlZCBhcyBhIHN0cmluZyAqLworICAgIGZvcihsaXN0cHRyID0gYXJnLT5kZWYtPmVudW1zOyBsaXN0cHRyLT5uYW1lOyBsaXN0cHRyKyspCisgICAgICAgIGlmKCFzdHJjbXAoYXJnLT52YWwsIGxpc3RwdHItPm5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGxpc3RwdHItPnZhbDsKKworICAgIGRpZSgiT3B0aW9uICVzOiBJbnZhbGlkIHZhbHVlICclcydcbiIsIGFyZy0+bmFtZSwgYXJnLT52YWwpOworICAgIHJldHVybiAwOworfQorCisKK2ludCBhcmdfcGFyc2VfZW51bV9vcl9pbnQoY29uc3Qgc3RydWN0IGFyZyAqYXJnKQoreworICAgIGlmKGFyZy0+ZGVmLT5lbnVtcykKKyAgICAgICAgcmV0dXJuIGFyZ19wYXJzZV9lbnVtKGFyZyk7CisgICAgcmV0dXJuIGFyZ19wYXJzZV9pbnQoYXJnKTsKK30KZGlmZiAtLWdpdCBhL2FyZ3MuaCBiL2xpYnZweC9hcmdzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyZ3MuaApyZW5hbWUgdG8gbGlidnB4L2FyZ3MuaApkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkLy5naXRhdHRyaWJ1dGVzIGIvbGlidnB4L2J1aWxkLy5naXRhdHRyaWJ1dGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZGI3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvYnVpbGQvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSwyIEBACisqLXZzOC8qLnJ1bGVzIC1jcmxmCisqLW1zdnMvKi5ydWxlcyAtY3JsZgpkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkLy5naXRpZ25vcmUgYi9saWJ2cHgvYnVpbGQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzUwZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2J1aWxkLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAoreDg2Ki13aW4zMi12cyoKZGlmZiAtLWdpdCBhL2xpYnZweC9idWlsZC9tYWtlL0FuZHJvaWQubWsgYi9saWJ2cHgvYnVpbGQvbWFrZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDYzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvYnVpbGQvbWFrZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjExIEBACisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworIworIyBUaGlzIGZpbGUgaXMgdG8gYmUgdXNlZCBmb3IgY29tcGlsaW5nIGxpYnZweCBmb3IgQW5kcm9pZCB1c2luZyB0aGUgTkRLLgorIyBJbiBhbiBBbmRyb2lkIHByb2plY3QgcGxhY2UgYSBsaWJ2cHggY2hlY2tvdXQgaW4gdGhlIGpuaSBkaXJlY3RvcnkuCisjIFJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCBmcm9tIHRoZSBqbmkgZGlyZWN0b3J5LiAgQmFzZSBsaWJ2cHgKKyMgZW5jb2Rlci9kZWNvZGVyIGNvbmZpZ3VyYXRpb24gd2lsbCBsb29rIHNpbWlsYXIgdG86CisjIC4vbGlidnB4L2NvbmZpZ3VyZSAtLXRhcmdldD1hcm12Ny1hbmRyb2lkLWdjYyAtLWRpc2FibGUtZXhhbXBsZXMgXAorIyAgICAgICAgICAgICAgICAgICAgLS1zZGstcGF0aD0vb3B0L2FuZHJvaWQtbmRrLXI2Yi8KKyMKKyMgV2hlbiB0YXJnZXRpbmcgQW5kcm9pZCwgcmVhbHRpbWUtb25seSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBUaGlzIGNhbgorIyBiZSBvdmVycmlkZGVuIGJ5IGFkZGluZyB0aGUgY29tbWFuZCBsaW5lIGZsYWc6CisjICAtLWRpc2FibGUtcmVhbHRpbWUtb25seQorIworIyBUaGlzIHdpbGwgY3JlYXRlIC5tayBmaWxlcyB0aGF0IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgY29udGFpbiB0aGUKKyMgc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCisjCisjIFBsYWNlIGFuIEFuZHJvaWQubWsgZmlsZSBpbiB0aGUgam5pIGRpcmVjdG9yeSB0aGF0IHJlZmVyZW5jZXMgdGhlCisjIEFuZHJvaWQubWsgZmlsZSBpbiB0aGUgbGlidnB4IGRpcmVjdG9yeToKKyMgTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorIyBpbmNsdWRlICQoQ0xFQVJfVkFSUykKKyMgaW5jbHVkZSBsaWJ2cHgvYnVpbGQvbWFrZS9BbmRyb2lkLm1rCisjCisjIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIFRBUkdFVF9BUkNIX0FCSSB0YXJnZXRzIGZvciBBUk0uCisjIGFybWVhYmkgYW5kIGFybWVhYmktdjdhLiAgYXJtZWFiaS12N2EgaXMgc2VsZWN0ZWQgYnkgY3JlYXRpbmcgYW4KKyMgQXBwbGljYXRpb24ubWsgaW4gdGhlIGpuaSBkaXJlY3RvcnkgdGhhdCBjb250YWluczoKKyMgQVBQX0FCSSA6PSBhcm1lYWJpLXY3YQorIworIyBCeSBkZWZhdWx0IGxpYnZweCB3aWxsIGRldGVjdCBhdCBydW50aW1lIHRoZSBleGlzdGFuY2Ugb2YgTkVPTiBleHRlbnNpb24uCisjIEZvciB0aGlzIHdlIGltcG9ydCB0aGUgJ2NwdWZlYXR1cmVzJyBtb2R1bGUgZnJvbSB0aGUgTkRLIHNvdXJjZXMuCisjIGxpYnZweCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHdpdGhvdXQgdGhpcyBydW50aW1lIGRldGVjdGlvbiBtZXRob2QuCisjIENvbmZpZ3VyaW5nIHdpdGggLS1kaXNhYmxlLXJ1bnRpbWUtY3B1LWRldGVjdCB3aWxsIGFzc3VtZSBwcmVzZW5jZSBvZiBORU9OLgorIyBDb25maWd1cmluZyB3aXRoIC0tZGlzYWJsZS1ydW50aW1lLWNwdS1kZXRlY3QgLS1kaXNhYmxlLW5lb24gd2lsbCByZW1vdmUgYW55CisjIE5FT04gZGVwZW5kZW5jeS4KKworIyBUbyBjaGFuZ2UgdG8gYnVpbGRpbmcgYXJtZWFiaSwgcnVuIC4vbGlidnB4L2NvbmZpZ3VyZSBhZ2FpbiwgYnV0IHdpdGgKKyMgLS10YXJnZXQ9YXJtNXRlLWFuZHJvaWQtZ2NjIGFuZCBtb2RpZnkgdGhlIEFwcGxpY2F0aW9uLm1rIGZpbGUgdG8KKyMgc2V0IEFQUF9BQkkgOj0gYXJtZWFiaQorIworIyBSdW5uaW5nIG5kay1idWlsZCB3aWxsIGJ1aWxkIGxpYnZweCBhbmQgaW5jbHVkZSBpdCBpbiB5b3VyIHByb2plY3QuCisjCisKK0NPTkZJR19ESVIgOj0gJChMT0NBTF9QQVRIKQorTElCVlBYX1BBVEggOj0gJChMT0NBTF9QQVRIKS9saWJ2cHgKK0FTTV9DTlZfUEFUSF9MT0NBTCA6PSAkKFRBUkdFVF9BUkNIX0FCSSkvYWRzMmdhcworQVNNX0NOVl9QQVRIIDo9ICQoTE9DQUxfUEFUSCkvJChBU01fQ05WX1BBVEhfTE9DQUwpCisKKyMgTWFrZWZpbGVzIGNyZWF0ZWQgYnkgdGhlIGxpYnZweCBjb25maWd1cmUgcHJvY2VzcworIyBUaGlzIHdpbGwgbmVlZCB0byBiZSBmaXhlZCB0byBoYW5kbGUgeDg2LgoraWZlcSAoJChUQVJHRVRfQVJDSF9BQkkpLGFybWVhYmktdjdhKQorICBpbmNsdWRlICQoQ09ORklHX0RJUikvbGlicy1hcm12Ny1hbmRyb2lkLWdjYy5taworZWxzZQorICBpbmNsdWRlICQoQ09ORklHX0RJUikvbGlicy1hcm12NXRlLWFuZHJvaWQtZ2NjLm1rCitlbmRpZgorCisjIFJ1bGUgdGhhdCBpcyBub3JtYWxseSBpbiBNYWtlZmlsZSBjcmVhdGVkIGJ5IGxpYnZweAorIyBjb25maWd1cmUuICBVc2VkIHRvIGZpbHRlciBvdXQgc291cmNlIGZpbGVzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24uCitlbmFibGVkPSQoZmlsdGVyLW91dCAkKCQoMSktbm8pLCQoJCgxKS15ZXMpKQorCisjIE92ZXJyaWRlIHRoZSByZWxhdGl2ZSBwYXRoIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgbGlidnB4CisjIGNvbmZpZ3VyZSBwcm9jZXNzCitTUkNfUEFUSF9CQVJFIDo9ICQoTElCVlBYX1BBVEgpCisKKyMgSW5jbHVkZSB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSBidWlsdAoraW5jbHVkZSAkKExJQlZQWF9QQVRIKS9saWJzLm1rCisKKyMgV2FudCBhcm0sIG5vdCB0aHVtYiwgb3B0aW1pemVkCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX0NGTEFHUyA6PSAtTzMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZW1wbGF0ZSAgOiBhc21fb2Zmc2V0c190ZW1wbGF0ZQorIyBBcmd1bWVudHMgOiAxOiBhc3NlbWJseSBvZmZzZXRzIGZpbGUgdG8gYmUgY3JlYXRlZAorIyAgICAgICAgICAgICAyOiBjIGZpbGUgdG8gYmFzZSBhc3NlbWJseSBvZmZzZXRzIG9uCisjIFJldHVybnMgICA6IE5vbmUKKyMgVXNhZ2UgICAgIDogJChldmFsICQoY2FsbCBhc21fb2Zmc2V0c190ZW1wbGF0ZSw8YXNtZmlsZT4sIDxzcmNmaWxlPgorIyBSYXRpb25hbGUgOiBDcmVhdGUgb2Zmc2V0cyBhdCBjb21waWxlIHRpbWUgdXNpbmcgZm9yIHN0cnVjdHVyZXMgdGhhdCBhcmUKKyMgICAgICAgICAgICAgZGVmaW5lZCBpbiBjLCBidXQgdXNlZCBpbiBhc3NlbWJseSBmdW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWZpbmUgYXNtX29mZnNldHNfdGVtcGxhdGUKKworX1NSQzo9JCgyKQorX09CSjo9JChBU01fQ05WX1BBVEgpLyQkKG5vdGRpciAkKDIpKS5TCisKK19GTEFHUyA9ICQkKCQkKG15KUNGTEFHUykgXAorICAgICAgICAgICQkKGNhbGwgZ2V0LXNyYy1maWxlLXRhcmdldC1jZmxhZ3MsJCgyKSkgXAorICAgICAgICAgICQkKGNhbGwgaG9zdC1jLWluY2x1ZGVzLCQkKExPQ0FMX0NfSU5DTFVERVMpICQkKENPTkZJR19ESVIpKSBcCisgICAgICAgICAgJCQoTE9DQUxfQ0ZMQUdTKSBcCisgICAgICAgICAgJCQoTkRLX0FQUF9DRkxBR1MpIFwKKyAgICAgICAgICAkJChjYWxsIGhvc3QtYy1pbmNsdWRlcywkJCgkKG15KUNfSU5DTFVERVMpKSBcCisgICAgICAgICAgLURJTkxJTkVfQVNNIFwKKyAgICAgICAgICAtUyBcCisKK19URVhUID0gIkNvbXBpbGUgJCQoY2FsbCBnZXQtc3JjLWZpbGUtdGV4dCwkKDIpKSIKK19DQyAgID0gJCQoVEFSR0VUX0NDKQorCiskJChldmFsICQkKGNhbGwgZXYtYnVpbGQtZmlsZSkpCisKKyQoMSkgOiAkJChfT0JKKSAkKDIpCisJQG1rZGlyIC1wICQkKGRpciAkJEApCisJQGdyZXAgJChPRkZTRVRfUEFUVEVSTikgJCQ8IHwgdHIgLWQgJ1wjJyB8ICQoQ09ORklHX0RJUikvJChBU01fQ09OVkVSU0lPTikgPiAkJEAKK2VuZGVmCisKKyMgVXNlIGFkczJnYXMgc2NyaXB0IHRvIGNvbnZlcnQgZnJvbSBSVkNUIGZvcm1hdCB0byBHQVMgZm9ybWF0LiAgVGhpcyBwYXNzZXMKKyMgIHB1dHMgdGhlIHByb2Nlc3NlZCBmaWxlIHVuZGVyICQoQVNNX0NOVl9QQVRIKS4gIExvY2FsIGNsZWFuIHJ1bGUKKyMgIHRvIGhhbmRsZSByZW1vdmluZyB0aGVzZQorQVNNX0NOVl9PRkZTRVRTX0RFUEVORCA9ICQoQVNNX0NOVl9QQVRIKS9hc21fY29tX29mZnNldHMuYXNtCitpZmVxICgkKENPTkZJR19WUDhfREVDT0RFUiksIHllcykKKyAgQVNNX0NOVl9PRkZTRVRTX0RFUEVORCArPSAkKEFTTV9DTlZfUEFUSCkvYXNtX2RlY19vZmZzZXRzLmFzbQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX1ZQOF9FTkNPREVSKSwgeWVzKQorICBBU01fQ05WX09GRlNFVFNfREVQRU5EICs9ICQoQVNNX0NOVl9QQVRIKS9hc21fZW5jX29mZnNldHMuYXNtCitlbmRpZgorCisuUFJFQ0lPVVM6ICUuYXNtLnMKKyQoQVNNX0NOVl9QQVRIKS9saWJ2cHgvJS5hc20uczogJChMSUJWUFhfUEFUSCkvJS5hc20gJChBU01fQ05WX09GRlNFVFNfREVQRU5EKQorCUBta2RpciAtcCAkKGRpciAkQCkKKwlAJChDT05GSUdfRElSKS8kKEFTTV9DT05WRVJTSU9OKSA8JDwgPiAkQAorCisjIEZvciBidWlsZGluZyB2cHhfcnRjZC5oLCB3aGljaCBoYXMgYSBydWxlIGluIGxpYnMubWsKK1RHVF9JU0E6PSQod29yZCAxLCAkKHN1YnN0IC0sICwkKFRPT0xDSEFJTikpKQordGFyZ2V0IDo9IGxpYnMKKworTE9DQUxfU1JDX0ZJTEVTICs9IHZweF9jb25maWcuYworCisjIFJlbW92ZSBkdXBsaWNhdGUgZW50cmllcworQ09ERUNfU1JDU19VTklRVUUgPSAkKHNvcnQgJChDT0RFQ19TUkNTKSkKKworIyBQdWxsIG91dCBDIGZpbGVzLiAgdnB4X2NvbmZpZy5jIGlzIGluIHRoZSBpbW1lZGlhdGUgZGlyZWN0b3J5IGFuZAorIyBzbyBpdCBkb2VzIG5vdCBuZWVkIGxpYnZweC8gcHJlZml4ZWQgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc291cmNlIGZpbGVzLgorQ09ERUNfU1JDU19DID0gJChmaWx0ZXIgJS5jLCAkKENPREVDX1NSQ1NfVU5JUVVFKSkKK0xPQ0FMX0NPREVDX1NSQ1NfQyA9ICQoZmlsdGVyLW91dCB2cHhfY29uZmlnLmMsICQoQ09ERUNfU1JDU19DKSkKKworTE9DQUxfU1JDX0ZJTEVTICs9ICQoZm9yZWFjaCBmaWxlLCAkKExPQ0FMX0NPREVDX1NSQ1NfQyksIGxpYnZweC8kKGZpbGUpKQorCisjIFB1bGwgb3V0IGFzc2VtYmx5IGZpbGVzLCBzcGxpdHRpbmcgTkVPTiBmcm9tIHRoZSByZXN0LiAgVGhpcyBpcworIyBkb25lIHRvIHNwZWNpZnkgdGhhdCB0aGUgTkVPTiBhc3NlbWJseSBmaWxlcyB1c2UgTkVPTiBhc3NlbWJsZXIgZmxhZ3MuCitDT0RFQ19TUkNTX0FTTV9BTEwgPSAkKGZpbHRlciAlLmFzbS5zLCAkKENPREVDX1NSQ1NfVU5JUVVFKSkKK0NPREVDX1NSQ1NfQVNNID0gJChmb3JlYWNoIHYsIFwKKyAgICAgICAgICAgICAgICAgJChDT0RFQ19TUkNTX0FTTV9BTEwpLCBcCisgICAgICAgICAgICAgICAgICQoaWYgJChmaW5kc3RyaW5nIG5lb24sJCh2KSksLCQodikpKQorQ09ERUNfU1JDU19BU01fQURTMkdBUyA9ICQocGF0c3Vic3QgJS5zLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJChBU01fQ05WX1BBVEhfTE9DQUwpL2xpYnZweC8lLnMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkKENPREVDX1NSQ1NfQVNNKSkKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKENPREVDX1NSQ1NfQVNNX0FEUzJHQVMpCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0hfQUJJKSxhcm1lYWJpLXY3YSkKKyAgQ09ERUNfU1JDU19BU01fTkVPTiA9ICQoZm9yZWFjaCB2LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKENPREVDX1NSQ1NfQVNNX0FMTCksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGZpbmRzdHJpbmcgbmVvbiwkKHYpKSwkKHYpLCkpCisgIENPREVDX1NSQ1NfQVNNX05FT05fQURTMkdBUyA9ICQocGF0c3Vic3QgJS5zLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQVNNX0NOVl9QQVRIX0xPQ0FMKS9saWJ2cHgvJS5zLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQ09ERUNfU1JDU19BU01fTkVPTikpCisgIExPQ0FMX1NSQ19GSUxFUyArPSAkKHBhdHN1YnN0ICUucywgXAorICAgICAgICAgICAgICAgICAgICAgJS5zLm5lb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICQoQ09ERUNfU1JDU19BU01fTkVPTl9BRFMyR0FTKSkKK2VuZGlmCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLURIQVZFX0NPTkZJR19IPXZweF9jb25maWcuaCBcCisgICAgLUkkKExJQlZQWF9QQVRIKSBcCisgICAgLUkkKEFTTV9DTlZfUEFUSCkKKworTE9DQUxfTU9EVUxFIDo9IGxpYnZweAorCitMT0NBTF9MRExJQlMgOj0gLWxsb2cKKworaWZlcSAoJChDT05GSUdfUlVOVElNRV9DUFVfREVURUNUKSx5ZXMpCisgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gY3B1ZmVhdHVyZXMKK2VuZGlmCisKKyQoZm9yZWFjaCBmaWxlLCAkKExPQ0FMX1NSQ19GSUxFUyksICQoTE9DQUxfUEFUSCkvJChmaWxlKSk6IHZweF9ydGNkLmgKKworLlBIT05ZOiBjbGVhbgorY2xlYW46CisJQGVjaG8gIkNsZWFuOiBhZHMyZ2FzIGZpbGVzIFskKFRBUkdFVF9BUkNIX0FCSSldIgorCUAkKFJNKSAkKENPREVDX1NSQ1NfQVNNX0FEUzJHQVMpICQoQ09ERUNfU1JDU19BU01fTkVPTl9BRFMyR0FTKQorCUAkKFJNKSAkKHBhdHN1YnN0ICUuYXNtLCAlLiosICQoQVNNX0NOVl9PRkZTRVRTX0RFUEVORCkpCisJQCQoUk0pIC1yICQoQVNNX0NOVl9QQVRIKQorCUAkKFJNKSAkKENMRUFOLU9CSlMpCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworJChldmFsICQoY2FsbCBhc21fb2Zmc2V0c190ZW1wbGF0ZSxcCisgICAgJChBU01fQ05WX1BBVEgpL2FzbV9jb21fb2Zmc2V0cy5hc20sIFwKKyAgICAkKExJQlZQWF9QQVRIKS92cDgvY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jKSkKKworaWZlcSAoJChDT05GSUdfVlA4X0RFQ09ERVIpLCB5ZXMpCisgICQoZXZhbCAkKGNhbGwgYXNtX29mZnNldHNfdGVtcGxhdGUsXAorICAgICQoQVNNX0NOVl9QQVRIKS9hc21fZGVjX29mZnNldHMuYXNtLCBcCisgICAgJChMSUJWUFhfUEFUSCkvdnA4L2RlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMpKQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfVlA4X0VOQ09ERVIpLCB5ZXMpCisgICQoZXZhbCAkKGNhbGwgYXNtX29mZnNldHNfdGVtcGxhdGUsXAorICAgICQoQVNNX0NOVl9QQVRIKS9hc21fZW5jX29mZnNldHMuYXNtLCBcCisgICAgJChMSUJWUFhfUEFUSCkvdnA4L2VuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMpKQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfUlVOVElNRV9DUFVfREVURUNUKSx5ZXMpCiskKGNhbGwgaW1wb3J0LW1vZHVsZSxjcHVmZWF0dXJlcykKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnZweC9idWlsZC9tYWtlL01ha2VmaWxlIGIvbGlidnB4L2J1aWxkL21ha2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4OGM4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9idWlsZC9tYWtlL01ha2VmaWxlCkBAIC0wLDAgKzEsMzg4IEBACisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworCitpbmNsdWRlIGNvbmZpZy5taworcXVpZXQ/PXRydWUKK2lmZXEgKCQodGFyZ2V0KSwpCisjIElmIGEgdGFyZ2V0IHdhc24ndCBzcGVjaWZpZWQsIGludm9rZSBmb3IgYWxsIGVuYWJsZWQgdGFyZ2V0cy4KKy5ERUZBVUxUOgorCUBmb3IgdCBpbiAkKEFMTF9UQVJHRVRTKTsgZG8gXAorCSAgICAgJChNQUtFKSAtLW5vLXByaW50LWRpcmVjdG9yeSB0YXJnZXQ9JCR0ICQoTUFLRUNNREdPQUxTKSB8fCBleGl0ICQkPztcCisgICAgICAgIGRvbmUKK2FsbDogLkRFRkFVTFQKK2NsZWFuOjogLkRFRkFVTFQKK2luc3RhbGw6OiAuREVGQVVMVAordGVzdDo6IC5ERUZBVUxUCit0ZXN0ZGF0YTo6IC5ERUZBVUxUCisKKworIyBOb3RlOiBtZDVzdW0gaXMgbm90IGluc3RhbGxlZCBvbiBPUyBYLCBidXQgb3BlbnNzbCBpcy4gT3BlbnNzbCBtYXkgbm90IGJlCisjIGluc3RhbGxlZCBvbiBjeWd3aW4sIHNvIHdlIG5lZWQgdG8gYXV0b2RldGVjdCBoZXJlLgorbWQ1c3VtIDo9ICQoZmlyc3R3b3JkICQod2lsZGNhcmQgXAorICAgICAgICAgICQoZm9yZWFjaCBlLG1kNXN1bSBvcGVuc3NsLFwKKyAgICAgICAgICAkKGZvcmVhY2ggcCwkKHN1YnN0IDosICwkKFBBVEgpKSwkKHApLyQoZSkqKSlcCisgICAgICAgICAgKSkKK21kNXN1bSA6PSAkKGlmICQoZmlsdGVyICVvcGVuc3NsLCQobWQ1c3VtKSksJChtZDVzdW0pIGRnc3QgLW1kNSwkKG1kNXN1bSkpCisKK1RHVF9DQzo9JCh3b3JkIDMsICQoc3Vic3QgLSwgLCQoVE9PTENIQUlOKSkpCitkaXN0OgorCUBmb3IgdCBpbiAkKEFMTF9UQVJHRVRTKTsgZG8gXAorCSAgICAgJChNQUtFKSAtLW5vLXByaW50LWRpcmVjdG9yeSB0YXJnZXQ9JCR0ICQoTUFLRUNNREdPQUxTKSB8fCBleGl0ICQkPztcCisgICAgICAgIGRvbmUKKyAgICAgICAgIyBSdW4gY29uZmlndXJlIGZvciB0aGUgdXNlciB3aXRoIHRoZSBjdXJyZW50IHRvb2xjaGFpbi4KKwlAaWYgWyAtZCAiJChESVNUX0RJUikvc3JjIiBdOyB0aGVuIFwKKyAgICAgICAgICAgIG1rZGlyIC1wICIkKERJU1RfRElSKS9idWlsZCI7IFwKKyAgICAgICAgICAgIGNkICIkKERJU1RfRElSKS9idWlsZCI7IFwKKyAgICAgICAgICAgIGVjaG8gIlJlcnVubmluZyBjb25maWd1cmUgJChDT05GSUdVUkVfQVJHUykiOyBcCisgICAgICAgICAgICAuLi9zcmMvY29uZmlndXJlICQoQ09ORklHVVJFX0FSR1MpOyBcCisgICAgICAgICAgICAkKGlmICQoZmlsdGVyIHZzJSwkKFRHVF9DQykpLG1ha2UgTk9fTEFVTkNIX0RFVkVOVj0xOykgXAorICAgICAgICBmaQorCUBpZiBbIC1kICIkKERJU1RfRElSKSIgXTsgdGhlbiBcCisgICAgICAgICAgICBlY2hvICIgICAgW01ENVNVTV0gJChESVNUX0RJUikiOyBcCisJICAgIGNkICQoRElTVF9ESVIpICYmIFwKKwkgICAgJChtZDVzdW0pIGBmaW5kIC4gLW5hbWUgbWQ1c3Vtcy50eHQgLXBydW5lIC1vIC10eXBlIGYgLXByaW50YCBcCisgICAgICAgICAgICAgICAgfCBzZWQgLWUgJ3MvTUQ1KFwoLipcKSk9IFwoWzAtOWEtZl1cezMyXH1cKS9cMiAgXDEvJyBcCisgICAgICAgICAgICAgICAgPiBtZDVzdW1zLnR4dDtcCisgICAgICAgIGZpCisKKworZW5kaWYKKworaWZuZXEgKCQodGFyZ2V0KSwpCisjIE5vcm1hbGx5LCB3ZSB3YW50IHRvIGJ1aWxkIHRoZSBmaWxlbmFtZSBmcm9tIHRoZSB0YXJnZXQgYW5kIHRoZSB0b29sY2hhaW4uCisjIFRoaXMgZGlzYW1iaWd1YXRlcyBmcm9tIHRoZSAkKHRhcmdldCkubWsgZmlsZSB0aGF0IGV4aXN0cyBpbiB0aGUgc291cmNlIHRyZWUuCisjIEhvd2V2ZXIsIHRoZSB0b29sY2hhaW4gaXMgcGFydCBvZiB0aGUgdGFyZ2V0IGluIHVuaXZlcnNhbCBidWlsZHMsIHNvIHdlCisjIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBUT09MQ0hBSU4gaW4gdGhhdCBjYXNlLiBGQVRfQVJDSFMgaXMgdXNlZCB0byB0ZXN0CisjIGlmIHdlJ3JlIGluIHRoZSB1bml2ZXJzYWwgY2FzZS4KK2luY2x1ZGUgJCh0YXJnZXQpJChpZiAkKEZBVF9BUkNIUyksLC0kKFRPT0xDSEFJTikpLm1rCitlbmRpZgorQlVJTERfUk9PVD89LgorVlBBVEg9JChTUkNfUEFUSF9CQVJFKQorQ0ZMQUdTKz0tSSQoQlVJTERfUEZYKSQoQlVJTERfUk9PVCkgLUkkKFNSQ19QQVRIKQorQ1hYRkxBR1MrPS1JJChCVUlMRF9QRlgpJChCVUlMRF9ST09UKSAtSSQoU1JDX1BBVEgpCitBU0ZMQUdTKz0tSSQoQlVJTERfUEZYKSQoQlVJTERfUk9PVCkvIC1JJChTUkNfUEFUSCkvCitESVNUX0RJUj89ZGlzdAorSE9TVENDPz1nY2MKK1RHVF9JU0E6PSQod29yZCAxLCAkKHN1YnN0IC0sICwkKFRPT0xDSEFJTikpKQorVEdUX09TOj0kKHdvcmQgMiwgJChzdWJzdCAtLCAsJChUT09MQ0hBSU4pKSkKK1RHVF9DQzo9JCh3b3JkIDMsICQoc3Vic3QgLSwgLCQoVE9PTENIQUlOKSkpCitxdWlldDo9JChpZiAkKHZlcmJvc2UpLCx5ZXMpCitxZXhlYz0kKGlmICQocXVpZXQpLEApCisKKyMgQ2FuY2VsIGJ1aWx0LWluIGltcGxpY2l0IHJ1bGVzCislOiAlLm8KKyUuYXNtOgorJS5hOgorJTogJS5jYworCisjCisjIENvbW1vbiBydWxlcyIKKyMKKy5QSE9OWTogYWxsCithbGw6CisKKy5QSE9OWTogY2xlYW4KK2NsZWFuOjoKKwlybSAtZiAkKE9CSlMteWVzKSAkKE9CSlMteWVzOi5vPS5kKSAkKE9CSlMteWVzOi5hc20ucy5vPS5hc20ucykKKwlybSAtZiAkKENMRUFOLU9CSlMpCisKKy5QSE9OWTogZGlzdAorZGlzdDoKKy5QSE9OWTogaW5zdGFsbAoraW5zdGFsbDo6CisuUEhPTlk6IHRlc3QKK3Rlc3Q6OgorLlBIT05ZOiB0ZXN0ZGF0YQordGVzdGRhdGE6OgorCiskKEJVSUxEX1BGWCklLmMuZDogJS5jCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtERVBdICRAIikKKwkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQorCSQocWV4ZWMpJChDQykgJChJTlRFUk5BTF9DRkxBR1MpICQoQ0ZMQUdTKSAtTSAkPCB8ICQoZm10X2RlcHMpID4gJEAKKworJChCVUlMRF9QRlgpJS5jLm86ICUuYworCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbQ0NdICRAIikKKwkkKHFleGVjKSQoQ0MpICQoSU5URVJOQUxfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworJChCVUlMRF9QRlgpJS5jYy5kOiAlLmNjCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtERVBdICRAIikKKwkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQorCSQocWV4ZWMpJChDWFgpICQoSU5URVJOQUxfQ0ZMQUdTKSAkKENYWEZMQUdTKSAtTSAkPCB8ICQoZm10X2RlcHMpID4gJEAKKworJChCVUlMRF9QRlgpJS5jYy5vOiAlLmNjCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtDWFhdICRAIikKKwkkKHFleGVjKSQoQ1hYKSAkKElOVEVSTkFMX0NGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gJEAgJDwKKworJChCVUlMRF9QRlgpJS5hc20uZDogJS5hc20KKwkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW0RFUF0gJEAiKQorCSQocWV4ZWMpbWtkaXIgLXAgJChkaXIgJEApCisJJChxZXhlYykkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2UvZ2VuX2FzbV9kZXBzLnNoIFwKKyAgICAgICAgICAgIC0tYnVpbGQtcGZ4PSQoQlVJTERfUEZYKSAtLWRlcGZpbGU9JEAgJChBU0ZMQUdTKSAkPCA+ICRACisKKyQoQlVJTERfUEZYKSUuYXNtLm86ICUuYXNtCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtBU10gJEAiKQorCSQocWV4ZWMpJChBUykgJChBU0ZMQUdTKSAtbyAkQCAkPAorCiskKEJVSUxEX1BGWCklLnMuZDogJS5zCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtERVBdICRAIikKKwkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQorCSQocWV4ZWMpJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL2dlbl9hc21fZGVwcy5zaCBcCisgICAgICAgICAgICAtLWJ1aWxkLXBmeD0kKEJVSUxEX1BGWCkgLS1kZXBmaWxlPSRAICQoQVNGTEFHUykgJDwgPiAkQAorCiskKEJVSUxEX1BGWCklLnMubzogJS5zCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtBU10gJEAiKQorCSQocWV4ZWMpJChBUykgJChBU0ZMQUdTKSAtbyAkQCAkPAorCisuUFJFQ0lPVVM6ICUuYy5TCislLmMuUzogQ0ZMQUdTICs9IC1ESU5MSU5FX0FTTQorJChCVUlMRF9QRlgpJS5jLlM6ICUuYworCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbR0VOXSAkQCIpCisJJChxZXhlYykkKENDKSAtUyAkKENGTEFHUykgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmFzbS5zCiskKEJVSUxEX1BGWCklLmFzbS5zOiAlLmFzbQorCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbQVNNIENPTlZFUlNJT05dICRAIikKKwkkKHFleGVjKW1rZGlyIC1wICQoZGlyICRAKQorCSQocWV4ZWMpJChBU01fQ09OVkVSU0lPTikgPCQ8ID4kQAorCisjIElmIHdlJ3JlIGluIGRlYnVnIG1vZGUsIHByZXRlbmQgd2UgZG9uJ3QgaGF2ZSBHTlUgc3RyaXAsIHRvIGZhbGwgYmFjayB0bworIyB0aGUgY29weSBpbXBsZW1lbnRhdGlvbgorSEFWRV9HTlVfU1RSSVAgOj0gJChpZiAkKENPTkZJR19ERUJVRyksLCQoSEFWRV9HTlVfU1RSSVApKQoraWZlcSAoJChIQVZFX0dOVV9TVFJJUCkseWVzKQorIyBPbGRlciBiaW51dGlscyBzdHJpcCBnbG9iYWwgc3lib2xzIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZworIyB3aGVuIGdpdmVuIC0tc3RyaXAtdW5uZWVkZWQuIFVzZSBubSBhbmQgYXdrIHRvIGlkZW50aWZ5IGdsb2JhbHMgYW5kCisjIGtlZXAgdGhlbS4KKyUuYTogJV9nLmEKKwkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW1NUUklQXSAkQCA8ICQ8IikKKwkkKHFleGVjKSQoU1RSSVApIC0tc3RyaXAtdW5uZWVkZWQgXAorICAgICAgICAgYCQoTk0pICQ8IHwgZ3JlcCAnIFtBLVRWLVpdICcgfCBhd2sgJ3twcmludCAiLUsiJCQzJ31gXAorICAgICAgICAgIC1vICRAICQ8CitlbHNlCislLmE6ICVfZy5hCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtDUF0gJEAgPCAkPCIpCisJJChxZXhlYyljcCAkPCAkQAorZW5kaWYKKworIworIyBSdWxlIHRvIGV4dHJhY3QgYXNzZW1ibHkgY29uc3RhbnRzIGZyb20gQyBzb3VyY2VzCisjCitvYmpfaW50X2V4dHJhY3Q6IGJ1aWxkL21ha2Uvb2JqX2ludF9leHRyYWN0LmMKKwkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW0hPU1RDQ10gJEAiKQorCSQocWV4ZWMpJChIT1NUQ0MpIC1JLiAtSSQoU1JDX1BBVEhfQkFSRSkgLW8gJEAgJDwKK0NMRUFOLU9CSlMgKz0gb2JqX2ludF9leHRyYWN0CisKKyMKKyMgVXRpbGl0eSBmdW5jdGlvbnMKKyMKK3BhaXJtYXA9JChpZiAkKHN0cmlwICQoMikpLFwKKyAgICAkKGNhbGwgJCgxKSwkKHdvcmQgMSwkKDIpKSwkKHdvcmQgMiwkKDIpKSlcCisgICAgJChjYWxsIHBhaXJtYXAsJCgxKSwkKHdvcmRsaXN0IDMsJCh3b3JkcyAkKDIpKSwkKDIpKSlcCispCisKK2VuYWJsZWQ9JChmaWx0ZXItb3V0ICQoJCgxKS1ubyksJCgkKDEpLXllcykpCitjb25kX2VuYWJsZWQ9JChpZiAkKGZpbHRlciB5ZXMsJCgkKDEpKSksICQoY2FsbCBlbmFibGVkLCQoMikpKQorCitmaW5kX2ZpbGUxPSQod29yZCAxLCQod2lsZGNhcmQgJChzdWJzdCAvLywvLCQoYWRkc3VmZml4IC8kKDEpLCQoMikpKSkpCitmaW5kX2ZpbGU9JChmb3JlYWNoIGYsJCgxKSwkKGNhbGwgZmluZF9maWxlMSwkKHN0cmlwICQoZikpLCQoc3RyaXAgJCgyKSkpICkKK29ial9wYXRzPS5jPS5jLm8gJChBU19TRlgpPSQoQVNfU0ZYKS5vIC5jYz0uY2Mubworb2Jqcz0kKGFkZHByZWZpeCAkKEJVSUxEX1BGWCksJChmb3JlYWNoIHAsJChvYmpfcGF0cyksJChmaWx0ZXIgJS5vLCQoMTokKHApKSkgKSkKKworaW5zdGFsbF9tYXBfdGVtcGxhdGVzPSQoZXZhbCAkKGNhbGwgaW5zdGFsbF9tYXBfdGVtcGxhdGUsJCgxKSwkKDIpKSkKKworbm90PSQoc3Vic3QgeWVzLG5vLCQoMSkpCisKK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKK2xpYl9maWxlX25hbWU9JCgxKS5saWIKK2Vsc2UKK2xpYl9maWxlX25hbWU9bGliJCgxKS5hCitlbmRpZgorIworIyBSdWxlIFRlbXBsYXRlcworIworZGVmaW5lIGxpbmtlcl90ZW1wbGF0ZQorJCgxKTogJChmaWx0ZXItb3V0IC0lLCQoMikpCiskKDEpOgorCSQoaWYgJChxdWlldCksQGVjaG8gICAgIiAgICBbTERdICQkQCIpCisJJChxZXhlYykkJChMRCkgJCQoc3RyaXAgJCQoSU5URVJOQUxfTERGTEFHUykgJCQoTERGTEFHUykgLW8gJCRAICQoMikgJCgzKSAkJChleHRyYWxpYnMpKQorZW5kZWYKK2RlZmluZSBsaW5rZXJ4eF90ZW1wbGF0ZQorJCgxKTogJChmaWx0ZXItb3V0IC0lLCQoMikpCiskKDEpOgorCSQoaWYgJChxdWlldCksQGVjaG8gICAgIiAgICBbTERdICQkQCIpCisJJChxZXhlYykkJChDWFgpICQkKHN0cmlwICQkKElOVEVSTkFMX0xERkxBR1MpICQkKExERkxBR1MpIC1vICQkQCAkKDIpICQoMykgJCQoZXh0cmFsaWJzKSkKK2VuZGVmCisjIG1ha2UtMy44MCBoYXMgYSBidWcgd2l0aCBleHBhbmRpbmcgbGFyZ2UgaW5wdXQgc3RyaW5ncyB0byB0aGUgZXZhbCBmdW5jdGlvbiwKKyMgd2hpY2ggd2FzIHRyaWdnZXJlZCBpbiBzb21lIGNhc2VzIGJ5IHRoZSBmb2xsb3dpbmcgY29tcG9uZW50IG9mCisjIGxpbmtlcl90ZW1wbGF0ZToKKyMgICAkKDEpOiAkJChjYWxsIGZpbmRfZmlsZSwgJChwYXRzdWJzdCAtbCUsbGliJS5hLCQoZmlsdGVyIC1sJSwkKDIpKSksXAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICQkKHBhdHN1YnN0IC1MJSwlLCQkKGZpbHRlciAtTCUsJCQoTERGTEFHUykgJCgyKSkpKQorIyBUaGlzIG1heSBiZSB1c2VmdWwgdG8gcmV2aXNpdCBpbiB0aGUgZnV0dXJlIChpdCB0cmllcyB0byBsb2NhdGUgbGlicmFyaWVzCisjIGluIGEgc2VhcmNoIHBhdGggYW5kIGFkZCB0aGVtIGFzIHByZXJlcXVpc2l0ZXMKKworZGVmaW5lIGluc3RhbGxfbWFwX3RlbXBsYXRlCiskKERJU1RfRElSKS8kKDEpOiAkKDIpCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtJTlNUQUxMXSAkJEAiKQorCSQocWV4ZWMpbWtkaXIgLXAgJCQoZGlyICQkQCkKKwkkKHFleGVjKWNwIC1wICQkPCAkJEAKK2VuZGVmCisKK2RlZmluZSBhcmNoaXZlX3RlbXBsYXRlCisjIE5vdCB1c2luZyBhIHBhdHRlcm4gcnVsZSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZSBlbXB0eQorIyBhcmNoaXZlcyB3aGVuIHRoZXkgYXJlIGxpc3RlZCBhcyBhIGRlcGVuZGVuY3kgaW4gZmlsZXMgbm90IHJlc3BvbnNpYmxlCisjIGZvciBjcmVhdGluZyB0aGVtLgorJCgxKToKKwkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW0FSXSAkJEAiKQorCSQocWV4ZWMpJCQoQVIpICQkKEFSRkxBR1MpICQkQCAkJD8KK2VuZGVmCisKK2RlZmluZSBzb190ZW1wbGF0ZQorIyBOb3QgdXNpbmcgYSBwYXR0ZXJuIHJ1bGUgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgZW1wdHkKKyMgYXJjaGl2ZXMgd2hlbiB0aGV5IGFyZSBsaXN0ZWQgYXMgYSBkZXBlbmRlbmN5IGluIGZpbGVzIG5vdCByZXNwb25zaWJsZQorIyBmb3IgY3JlYXRpbmcgdGhlbS4KKyMKKyMgVGhpcyBuZWVkcyBmdXJ0aGVyIGFic3RyYWN0aW9uIGZvciBkZWFsaW5nIHdpdGggbm9uLUdOVSBsaW5rZXJzLgorJCgxKToKKwkkKGlmICQocXVpZXQpLEBlY2hvICIgICAgW0xEXSAkJEAiKQorCSQocWV4ZWMpJCQoTEQpIC1zaGFyZWQgJCQoTERGTEFHUykgXAorICAgICAgICAgICAgLVdsLC0tbm8tdW5kZWZpbmVkIC1XbCwtc29uYW1lLCQkKFNPTkFNRSkgXAorICAgICAgICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJCQoU09fVkVSU0lPTl9TQ1JJUFQpIC1vICQkQCBcCisgICAgICAgICAgICAkJChmaWx0ZXIgJS5vLCQkPykgJCQoZXh0cmFsaWJzKQorZW5kZWYKKworZGVmaW5lIGxpcG9fbGliX3RlbXBsYXRlCiskKDEpOiAkKGFkZHN1ZmZpeCAvJCgxKSwkKEZBVF9BUkNIUykpCisJJChpZiAkKHF1aWV0KSxAZWNobyAiICAgIFtMSVBPXSAkJEAiKQorCSQocWV4ZWMpbGlidG9vbCAtc3RhdGljIC1vICQkQCAkJD8KK2VuZGVmCisKK2RlZmluZSBsaXBvX2Jpbl90ZW1wbGF0ZQorJCgxKTogJChhZGRzdWZmaXggLyQoMSksJChGQVRfQVJDSFMpKQorCSQoaWYgJChxdWlldCksQGVjaG8gIiAgICBbTElQT10gJCRAIikKKwkkKHFleGVjKWxpcG8gLW91dHB1dCAkJEAgLWNyZWF0ZSAkJD8KK2VuZGVmCisKKworIworIyBHZXQgY3VycmVudCBjb25maWd1cmF0aW9uCisjCitpZm5lcSAoJCh0YXJnZXQpLCkKK2luY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS8kKHRhcmdldDotJChUT09MQ0hBSU4pPSkubWsKK2VuZGlmCitpZmVxICgkKGZpbHRlciBjbGVhbiwkKE1BS0VDTURHT0FMUykpLCkKKyAgIyBPbGRlciB2ZXJzaW9ucyBvZiBtYWtlIGRvbid0IGxpa2UgLWluY2x1ZGUgZGlyZWN0aXZlcyB3aXRoIG5vIGFyZ3VtZW50cworICBpZm5lcSAoJChmaWx0ZXIgJS5kLCQoT0JKUy15ZXM6Lm89LmQpKSwpCisgICAgLWluY2x1ZGUgJChmaWx0ZXIgJS5kLCQoT0JKUy15ZXM6Lm89LmQpKQorICBlbmRpZgorZW5kaWYKKworIworIyBDb25maWd1cmF0aW9uIGRlcGVuZGVudCBydWxlcworIworJChjYWxsIHBhaXJtYXAsaW5zdGFsbF9tYXBfdGVtcGxhdGVzLCQoSU5TVEFMTF9NQVBTKSkKKworRE9DUz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX0RPQ1MsRE9DUykKKy5kb2NzOiAkKERPQ1MpCisJQHRvdWNoICRACisKK0lOU1RBTEwtRE9DUz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX0RPQ1MsSU5TVEFMTC1ET0NTKQoraWZlcSAoJChNQUtFQ01ER09BTFMpLGRpc3QpCitJTlNUQUxMLURPQ1MrPSQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfRE9DUyxESVNULURPQ1MpCitlbmRpZgorLmluc3RhbGwtZG9jczogLmRvY3MgJChhZGRwcmVmaXggJChESVNUX0RJUikvLCQoSU5TVEFMTC1ET0NTKSkKKwlAdG91Y2ggJEAKKworY2xlYW46OgorCXJtIC1mIC5kb2NzIC5pbnN0YWxsLWRvY3MgJChET0NTKQorCitCSU5TPSQoY2FsbCBlbmFibGVkLEJJTlMpCisuYmluczogJChCSU5TKQorCUB0b3VjaCAkQAorCitJTlNUQUxMLUJJTlM9JChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9CSU5TLElOU1RBTEwtQklOUykKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxkaXN0KQorSU5TVEFMTC1CSU5TKz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX0JJTlMsRElTVC1CSU5TKQorZW5kaWYKKy5pbnN0YWxsLWJpbnM6IC5iaW5zICQoYWRkcHJlZml4ICQoRElTVF9ESVIpLywkKElOU1RBTEwtQklOUykpCisJQHRvdWNoICRACisKK2NsZWFuOjoKKwlybSAtZiAuYmlucyAuaW5zdGFsbC1iaW5zICQoQklOUykKKworTElCUz0kKGNhbGwgZW5hYmxlZCxMSUJTKQorLmxpYnM6ICQoTElCUykKKwlAdG91Y2ggJEAKKyQoZm9yZWFjaCBsaWIsJChmaWx0ZXIgJV9nLmEsJChMSUJTKSksJChldmFsICQoY2FsbCBhcmNoaXZlX3RlbXBsYXRlLCQobGliKSkpKQorJChmb3JlYWNoIGxpYiwkKGZpbHRlciAlc28uJChWRVJTSU9OX01BSk9SKS4kKFZFUlNJT05fTUlOT1IpLiQoVkVSU0lPTl9QQVRDSCksJChMSUJTKSksJChldmFsICQoY2FsbCBzb190ZW1wbGF0ZSwkKGxpYikpKSkKKworSU5TVEFMTC1MSUJTPSQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfTElCUyxJTlNUQUxMLUxJQlMpCitpZmVxICgkKE1BS0VDTURHT0FMUyksZGlzdCkKK0lOU1RBTEwtTElCUys9JChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9MSUJTLERJU1QtTElCUykKK2VuZGlmCisuaW5zdGFsbC1saWJzOiAubGlicyAkKGFkZHByZWZpeCAkKERJU1RfRElSKS8sJChJTlNUQUxMLUxJQlMpKQorCUB0b3VjaCAkQAorCitjbGVhbjo6CisJcm0gLWYgLmxpYnMgLmluc3RhbGwtbGlicyAkKExJQlMpCisKK2lmZXEgKCQoQ09ORklHX0VYVEVSTkFMX0JVSUxEKSx5ZXMpCitQUk9KRUNUUz0kKGNhbGwgZW5hYmxlZCxQUk9KRUNUUykKKy5wcm9qZWN0czogJChQUk9KRUNUUykKKwlAdG91Y2ggJEAKKworSU5TVEFMTC1QUk9KRUNUUz0kKGNhbGwgY29uZF9lbmFibGVkLENPTkZJR19JTlNUQUxMX1BST0pFQ1RTLElOU1RBTEwtUFJPSkVDVFMpCitpZmVxICgkKE1BS0VDTURHT0FMUyksZGlzdCkKK0lOU1RBTEwtUFJPSkVDVFMrPSQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfUFJPSkVDVFMsRElTVC1QUk9KRUNUUykKK2VuZGlmCisuaW5zdGFsbC1wcm9qZWN0czogLnByb2plY3RzICQoYWRkcHJlZml4ICQoRElTVF9ESVIpLywkKElOU1RBTEwtUFJPSkVDVFMpKQorCUB0b3VjaCAkQAorCitjbGVhbjo6CisJcm0gLWYgLnByb2plY3RzIC5pbnN0YWxsLXByb2plY3RzICQoUFJPSkVDVFMpCitlbmRpZgorCisjIElmIHRoZXJlIGFyZSBhbnkgc291cmNlIGZpbGVzIHRvIGJlIGRpc3RyaWJ1dGVkLCB0aGVuIGluY2x1ZGUgdGhlIGJ1aWxkCisjIHN5c3RlbSB0b28uCitpZm5lcSAoJChjYWxsIGVuYWJsZWQsRElTVC1TUkNTKSwpCisgICAgRElTVC1TUkNTLXllcyAgICAgICAgICAgICs9IGNvbmZpZ3VyZQorICAgIERJU1QtU1JDUy15ZXMgICAgICAgICAgICArPSBidWlsZC9tYWtlL2NvbmZpZ3VyZS5zaAorICAgIERJU1QtU1JDUy15ZXMgICAgICAgICAgICArPSBidWlsZC9tYWtlL2dlbl9hc21fZGVwcy5zaAorICAgIERJU1QtU1JDUy15ZXMgICAgICAgICAgICArPSBidWlsZC9tYWtlL01ha2VmaWxlCisgICAgRElTVC1TUkNTLSQoQ09ORklHX01TVlMpICArPSBidWlsZC9tYWtlL2dlbl9tc3ZzX2RlZi5zaAorICAgIERJU1QtU1JDUy0kKENPTkZJR19NU1ZTKSAgKz0gYnVpbGQvbWFrZS9nZW5fbXN2c19wcm9qLnNoCisgICAgRElTVC1TUkNTLSQoQ09ORklHX01TVlMpICArPSBidWlsZC9tYWtlL2dlbl9tc3ZzX3Nsbi5zaAorICAgIERJU1QtU1JDUy0kKENPTkZJR19NU1ZTKSAgKz0gYnVpbGQveDg2LW1zdnMveWFzbS5ydWxlcworICAgIERJU1QtU1JDUy0kKENPTkZJR19NU1ZTKSAgKz0gYnVpbGQveDg2LW1zdnMvb2JqX2ludF9leHRyYWN0LmJhdAorICAgIERJU1QtU1JDUy0kKENPTkZJR19SVkNUKSArPSBidWlsZC9tYWtlL2FybWxpbmtfYWRhcHRlci5zaAorICAgICMgSW5jbHVkZSBvYmpfaW50X2V4dHJhY3QgaWYgd2UgdXNlIG9mZnNldHMgZnJvbSBhc21fKl9vZmZzZXRzCisgICAgRElTVC1TUkNTLSQoQVJDSF9BUk0pJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSAgICArPSBidWlsZC9tYWtlL29ial9pbnRfZXh0cmFjdC5jCisgICAgRElTVC1TUkNTLSQoQVJDSF9BUk0pICAgICs9IGJ1aWxkL21ha2UvYWRzMmdhcy5wbAorICAgIERJU1QtU1JDUy15ZXMgICAgICAgICAgICArPSAkKHRhcmdldDotJChUT09MQ0hBSU4pPSkubWsKK2VuZGlmCitJTlNUQUxMLVNSQ1MgOj0gJChjYWxsIGNvbmRfZW5hYmxlZCxDT05GSUdfSU5TVEFMTF9TUkNTLElOU1RBTEwtU1JDUykKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxkaXN0KQorSU5TVEFMTC1TUkNTICs9ICQoY2FsbCBjb25kX2VuYWJsZWQsQ09ORklHX0lOU1RBTExfU1JDUyxESVNULVNSQ1MpCitlbmRpZgorLmluc3RhbGwtc3JjczogJChhZGRwcmVmaXggJChESVNUX0RJUikvc3JjLywkKElOU1RBTEwtU1JDUykpCisJQHRvdWNoICRACisKK2NsZWFuOjoKKwlybSAtZiAuaW5zdGFsbC1zcmNzCisKK2lmZXEgKCQoQ09ORklHX0VYVEVSTkFMX0JVSUxEKSx5ZXMpCisgICAgQlVJTERfVEFSR0VUUyArPSAucHJvamVjdHMKKyAgICBJTlNUQUxMX1RBUkdFVFMgKz0gLmluc3RhbGwtcHJvamVjdHMKK2VuZGlmCitCVUlMRF9UQVJHRVRTICs9IC5kb2NzIC5saWJzIC5iaW5zCitJTlNUQUxMX1RBUkdFVFMgKz0gLmluc3RhbGwtZG9jcyAuaW5zdGFsbC1zcmNzIC5pbnN0YWxsLWxpYnMgLmluc3RhbGwtYmlucworYWxsOiAkKEJVSUxEX1RBUkdFVFMpCitpbnN0YWxsOjogJChJTlNUQUxMX1RBUkdFVFMpCitkaXN0OiAkKElOU1RBTExfVEFSR0VUUykKK3Rlc3Q6OgpkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkL21ha2UvYWRzMmdhcy5wbCBiL2xpYnZweC9idWlsZC9tYWtlL2FkczJnYXMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTViZTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9idWlsZC9tYWtlL2FkczJnYXMucGwKQEAgLTAsMCArMSwyMTIgQEAKKyMhL3Vzci9iaW4vcGVybAorIyMKKyMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMKKyMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisjIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisjIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMjCisKKworIyBhZHMyZ2FzLnBsCisjIEF1dGhvcjogRXJpYyBGdW5nIChlZnVuZyAoYXQpIGFjbS5vcmcpCisjCisjIENvbnZlcnQgQVJNIERldmVsb3BlciBTdWl0ZSAxLjAuMSBzeW50YXggYXNzZW1ibHkgc291cmNlIHRvIEdOVSBhcyBmb3JtYXQKKyMKKyMgVXNhZ2U6IGNhdCBpbnB1dGZpbGUgfCBwZXJsIGFkczJnYXMucGwgPiBvdXRwdXRmaWxlCisjCitwcmludCAiQCBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgZnJvbSBhIC5hc20gZmlsZVxuIjsKK3ByaW50ICJAICB1c2luZyB0aGUgYWRzMmdhcy5wbCBzY3JpcHQuXG4iOworcHJpbnQgIlx0LmVxdSBETzFTVFJPVU5ESU5HLCAwXG4iOworCisjIFN0YWNrIG9mIHByb2NlZHVyZSBuYW1lcy4KK0Bwcm9jX3N0YWNrID0gKCk7CisKK3doaWxlICg8U1RESU4+KQoreworICAgIHVuZGVmICRjb21tZW50OworICAgIHVuZGVmICRsaW5lOworICAgICRjb21tZW50X2NoYXIgPSAiOyI7CisgICAgJGNvbW1lbnRfc3ViID0gIkAiOworCisgICAgIyBIYW5kbGUgY29tbWVudHMuCisgICAgaWYgKC8kY29tbWVudF9jaGFyLykKKyAgICB7CisgICAgICAkY29tbWVudCA9ICIiOworICAgICAgKCRsaW5lLCAkY29tbWVudCkgPSAvKC4qPykkY29tbWVudF9jaGFyKC4qKS87CisgICAgICAkXyA9ICRsaW5lOworICAgIH0KKworICAgICMgTG9hZCBhbmQgc3RvcmUgYWxpZ25tZW50CisgICAgcy9ALyw6L2c7CisKKyAgICAjIEhleGFkZWNpbWFsIGNvbnN0YW50cyBwcmVmYWNlZCBieSAweAorICAgIHMvIyYvIzB4L2c7CisKKyAgICAjIENvbnZlcnQgOk9SOiB0byB8CisgICAgcy86T1I6LyB8IC9nOworCisgICAgIyBDb252ZXJ0IDpBTkQ6IHRvICYKKyAgICBzLzpBTkQ6LyAmIC9nOworCisgICAgIyBDb252ZXJ0IDpOT1Q6IHRvIH4KKyAgICBzLzpOT1Q6LyB+IC9nOworCisgICAgIyBDb252ZXJ0IDpTSEw6IHRvIDw8CisgICAgcy86U0hMOi8gPDwgL2c7CisKKyAgICAjIENvbnZlcnQgOlNIUjogdG8gPj4KKyAgICBzLzpTSFI6LyA+PiAvZzsKKworICAgICMgQ29udmVydCBFTFNFIHRvIC5lbHNlCisgICAgcy9cYkVMU0VcYi8uZWxzZS9nOworCisgICAgIyBDb252ZXJ0IEVORElGIHRvIC5lbmRpZgorICAgIHMvXGJFTkRJRlxiLy5lbmRpZi9nOworCisgICAgIyBDb252ZXJ0IEVMU0VJRiB0byAuZWxzZWlmCisgICAgcy9cYkVMU0VJRlxiLy5lbHNlaWYvZzsKKworICAgICMgQ29udmVydCBMVE9SRyB0byAubHRvcmcKKyAgICBzL1xiTFRPUkdcYi8ubHRvcmcvZzsKKworICAgICMgQ29udmVydCBlbmRmdW5jIHRvIG5vdGhpbmcuCisgICAgcy9cYmVuZGZ1bmNcYi8vaWc7CisKKyAgICAjIENvbnZlcnQgRlVOQ1RJT04gdG8gbm90aGluZy4KKyAgICBzL1xiRlVOQ1RJT05cYi8vZzsKKyAgICBzL1xiZnVuY3Rpb25cYi8vZzsKKworICAgIHMvXGJFTlRSWVxiLy9nOworICAgIHMvXGJNU0FSTUFTTVxiLzAvZzsKKyAgICBzL15ccytlbmRccyskLy9nOworCisgICAgIyBDb252ZXJ0IElGIDpERUY6dG8gLmlmCisgICAgIyBnY2MgZG9lc24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIGEgY29uZGl0aW9uYWwKKyAgICAjIGlmIGRlZmluZWQgdmFyaWFibGUgdGhhdCBpcyBzZXQgYnkgSUYgOkRFRjogb24KKyAgICAjIGFybWFzbSwgc28gY29udmVydCBpdCB0byBhIG5vcm1hbCAuaWYgYW5kIHRoZW4KKyAgICAjIG1ha2Ugc3VyZSB0byBkZWZpbmUgYSB2YWx1ZSBlbGVzZXdoZXJlCisgICAgaWYgKHMvXGJJRiA6REVGOlxiLy5pZiAvZykKKyAgICB7CisgICAgICAgIHMvPS89PS9nOworICAgIH0KKworICAgICMgQ29udmVydCBJRiB0byAuaWYKKyAgICBpZiAocy9cYklGXGIvLmlmL2cpCisgICAgeworICAgICAgICBzLz0rLz09L2c7CisgICAgfQorCisgICAgIyBDb252ZXJ0IElOQ0xVREUgdG8gLklOQ0xVREUgImZpbGUiCisgICAgcy9JTkNMVURFKFxzKikoLiopJC8uaW5jbHVkZSAkMVwiJDJcIi87CisKKyAgICAjIENvZGUgZGlyZWN0aXZlIChBUk0gdnMgVGh1bWIpCisgICAgcy9DT0RFKFswLTldWzAtOV0pLy5jb2RlICQxLzsKKworICAgICMgTm8gQVJFQSByZXF1aXJlZAorICAgICMgQnV0IEFMSUdOcyBpbiBBUkVBIG11c3QgYmUgb2JleWVkCisgICAgcy9eXHMqQVJFQS4qQUxJR049KFswLTldKSQvLnRleHRcbi5wMmFsaWduICQxLzsKKyAgICAjIElmIG5vIEFMSUdOLCBzdHJpcCB0aGUgQVJFQSBhbmQgYWxpZ24gdG8gNCBieXRlcworICAgIHMvXlxzKkFSRUEuKiQvLnRleHRcbi5wMmFsaWduIDIvOworCisgICAgIyBEQ0QgdG8gLndvcmQKKyAgICAjIFRoaXMgb25lIGlzIGZvciBpbmNvbWluZyBzeW1ib2xzCisgICAgcy9EQ0RccytcfChcdyopXHwvLmxvbmcgJDEvOworCisgICAgIyBEQ1cgdG8gLnNob3J0CisgICAgcy9EQ1dccytcfChcdyopXHwvLnNob3J0ICQxLzsKKyAgICBzL0RDVyguKikvLnNob3J0ICQxLzsKKworICAgICMgQ29uc3RhbnRzIGRlZmluZWQgaW4gc2NvcGUKKyAgICBzL0RDRCguKikvLmxvbmcgJDEvOworICAgIHMvRENCKC4qKS8uYnl0ZSAkMS87CisKKyAgICAjIFJOIHRvIC5yZXEKKyAgICBpZiAocy9STlxzKyhbUnJdXGQrfGxyKS8ucmVxICQxLykKKyAgICB7CisgICAgICAgIHByaW50OworICAgICAgICBwcmludCAiJGNvbW1lbnRfc3ViJGNvbW1lbnRcbiIgaWYgZGVmaW5lZCAkY29tbWVudDsKKyAgICAgICAgbmV4dDsKKyAgICB9CisKKyAgICAjIE1ha2UgZnVuY3Rpb24gdmlzaWJsZSB0byBsaW5rZXIsIGFuZCBtYWtlIGFkZGl0aW9uYWwgc3ltYm9sIHdpdGgKKyAgICAjIHByZXBlbmRlZCB1bmRlcnNjb3JlCisgICAgcy9FWFBPUlRccytcfChbXCRcd10qKVx8Ly5nbG9iYWwgJDEgXG5cdC50eXBlICQxLCBmdW5jdGlvbi87CisgICAgcy9JTVBPUlRccytcfChbXCRcd10qKVx8Ly5nbG9iYWwgJDEvOworCisgICAgcy9FWFBPUlRccysoW1wkXHddKikvLmdsb2JhbCAkMS87CisgICAgcy9leHBvcnRccysoW1wkXHddKikvLmdsb2JhbCAkMS87CisKKyAgICAjIE5vIHZlcnRpY2FsIGJhcnMgcmVxdWlyZWQ7IG1ha2UgYWRkaXRpb25hbCBzeW1ib2wgd2l0aCBwcmVwZW5kZWQKKyAgICAjIHVuZGVyc2NvcmUKKyAgICBzL15cfChcJD9cdyspXHwvXyQxXG5cdCQxOi9nOworCisgICAgIyBMYWJlbHMgbmVlZCB0cmFpbGluZyBjb2xvbgorIyAgIHMvXihcdyspLyQxOi8gaWYgIS9FUVUvOworICAgICMgcHV0IHRoZSBjb2xvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGluIHRoZSBtYWNybworICAgIHMvXihbYS16QS1aXzAtOVwkXSspLyQxOi8gaWYgIS9FUVUvOworCisgICAgIyBBTElHTiBkaXJlY3RpdmUKKyAgICBzL1xiQUxJR05cYi8uYmFsaWduL2c7CisKKyAgICAjIEFSTSBjb2RlCisgICAgcy9cc0FSTS8uYXJtL2c7CisKKyAgICAjIHB1c2gvcG9wCisgICAgcy8ocHVzaFxzKykoclxkKykvc3RtZGIgc3BcISwgXHskMlx9L2c7CisgICAgcy8ocG9wXHMrKShyXGQrKS9sZG1pYSBzcFwhLCBceyQyXH0vZzsKKworICAgICMgTkVPTiBjb2RlCisgICAgcy8odmxkMS5cZCtccyspKHFcZCspLyQxXHskMlx9L2c7CisgICAgcy8odnRibC5cZCtccytbXixdKyksKFteLF0rKS8kMSxceyQyXH0vZzsKKworICAgICMgZWFiaV9hdHRyaWJ1dGVzIG51bWVyaWNhbCBlcXVpdmFsZW50cyBjYW4gYmUgZm91bmQgaW4gdGhlCisgICAgIyAiQVJNIElISSAwMDQ1QyIgZG9jdW1lbnQuCisKKyAgICAjIFJFUVVJUkU4IFN0YWNrIGlzIHJlcXVpcmVkIHRvIGJlIDgtYnl0ZSBhbGlnbmVkCisgICAgcy9cc1JFUVVJUkU4Ly5lYWJpX2F0dHJpYnV0ZSAyNCwgMSBcQFRhZ19BQklfYWxpZ25fbmVlZGVkL2c7CisKKyAgICAjIFBSRVNFUlZFOCBTdGFjayA4LWJ5dGUgYWxpZ24gaXMgcHJlc2VydmVkCisgICAgcy9cc1BSRVNFUlZFOC8uZWFiaV9hdHRyaWJ1dGUgMjUsIDEgXEBUYWdfQUJJX2FsaWduX3ByZXNlcnZlZC9nOworCisgICAgIyBVc2UgUFJPQyBhbmQgRU5EUCB0byBnaXZlIHRoZSBzeW1ib2xzIGEgLnNpemUgZGlyZWN0aXZlLgorICAgICMgVGhpcyBtYWtlcyB0aGVtIHNob3cgdXAgcHJvcGVybHkgaW4gZGVidWdnaW5nIHRvb2xzIGxpa2UgZ2RiIGFuZCB2YWxncmluZC4KKyAgICBpZiAoL1xiUFJPQ1xiLykKKyAgICB7CisgICAgICAgIG15ICRwcm9jOworICAgICAgICAvXl8oW1wuMC05QS1aX2Etel1cdyspXGIvOworICAgICAgICAkcHJvYyA9ICQxOworICAgICAgICBwdXNoKEBwcm9jX3N0YWNrLCAkcHJvYykgaWYgKCRwcm9jKTsKKyAgICAgICAgcy9cYlBST0NcYi9AICQmLzsKKyAgICB9CisgICAgaWYgKC9cYkVORFBcYi8pCisgICAgeworICAgICAgICBteSAkcHJvYzsKKyAgICAgICAgcy9cYkVORFBcYi9AICQmLzsKKyAgICAgICAgJHByb2MgPSBwb3AoQHByb2Nfc3RhY2spOworICAgICAgICAkXyA9ICJcdC5zaXplICRwcm9jLCAuLSRwcm9jIi4kXyBpZiAoJHByb2MpOworICAgIH0KKworICAgICMgRVFVIGRpcmVjdGl2ZQorICAgIHMvKFxTK1xzKylFUVUoXHMrXFMrKS8uZXF1ICQxLCAkMi87CisKKyAgICAjIEJlZ2luIG1hY3JvIGRlZmluaXRpb24KKyAgICBpZiAoL1xiTUFDUk9cYi8pIHsKKyAgICAgICAgJF8gPSA8U1RESU4+OworICAgICAgICBzL14vLm1hY3JvLzsKKyAgICAgICAgcy9cJC8vZzsgICAgICAgICAgICAgICAgIyByZW1vdmUgZm9ybWFsIHBhcmFtIHJlZmVyZW5jZQorICAgICAgICBzLzsvQC9nOyAgICAgICAgICAgICAgICAjIGNoYW5nZSBjb21tZW50IGNoYXJhY3RlcnMKKyAgICB9CisKKyAgICAjIEZvciBtYWNyb3MsIHVzZSBcIHRvIHJlZmVyZW5jZSBmb3JtYWwgcGFyYW1zCisgICAgcy9cJC9cXC9nOyAgICAgICAgICAgICAgICAgICMgRW5kIG1hY3JvIGRlZmluaXRpb24KKyAgICBzL1xiTUVORFxiLy5lbmRtLzsgICAgICAgICAgICAgICMgTm8gbmVlZCB0byB0ZWxsIGl0IHdoZXJlIHRvIHN0b3AgYXNzZW1ibGluZworICAgIG5leHQgaWYgL15ccypFTkRccyokLzsKKyAgICBwcmludDsKKyAgICBwcmludCAiJGNvbW1lbnRfc3ViJGNvbW1lbnRcbiIgaWYgZGVmaW5lZCAkY29tbWVudDsKK30KKworIyBNYXJrIHRoYXQgdGhpcyBvYmplY3QgZG9lc24ndCBuZWVkIGFuIGV4ZWN1dGFibGUgc3RhY2suCitwcmludGYgKCJcdC5zZWN0aW9uXHQubm90ZS5HTlUtc3RhY2ssXCJcIixcJVwlcHJvZ2JpdHNcbiIpOwpkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkL21ha2UvYWRzMmdhc19hcHBsZS5wbCBiL2xpYnZweC9idWlsZC9tYWtlL2FkczJnYXNfYXBwbGUucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODEyODBiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9idWlsZC9tYWtlL2FkczJnYXNfYXBwbGUucGwKQEAgLTAsMCArMSwyMTQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMjCisjIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjCisjIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisjIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisjIworCisKKyMgYWRzMmdhcy5wbAorIyBBdXRob3I6IEVyaWMgRnVuZyAoZWZ1bmcgKGF0KSBhY20ub3JnKQorIworIyBDb252ZXJ0IEFSTSBEZXZlbG9wZXIgU3VpdGUgMS4wLjEgc3ludGF4IGFzc2VtYmx5IHNvdXJjZSB0byBHTlUgYXMgZm9ybWF0CisjCisjIFVzYWdlOiBjYXQgaW5wdXRmaWxlIHwgcGVybCBhZHMyZ2FzLnBsID4gb3V0cHV0ZmlsZQorIworcHJpbnQgIkAgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGZyb20gYSAuYXNtIGZpbGVcbiI7CitwcmludCAiQCAgdXNpbmcgdGhlIGFkczJnYXNfYXBwbGUucGwgc2NyaXB0LlxuXG4iOworcHJpbnQgIlx0LnNldCBXSURFX1JFRkVSRU5DRSwgMFxuIjsKK3ByaW50ICJcdC5zZXQgQVJDSElURUNUVVJFLCA1XG4iOworcHJpbnQgIlx0LnNldCBETzFTVFJPVU5ESU5HLCAwXG4iOworCitteSAlcmVnaXN0ZXJfYWxpYXNlczsKK215ICVtYWNyb19hbGlhc2VzOworCitteSBAbWFwcGluZ19saXN0ID0gKCJcJDAiLCAiXCQxIiwgIlwkMiIsICJcJDMiLCAiXCQ0IiwgIlwkNSIsICJcJDYiLCAiXCQ3IiwgIlwkOCIsICJcJDkiKTsKKworbXkgQGluY29taW5nX2FycmF5OworCitteSBAaW1wb3J0ZWRfZnVuY3Rpb25zOworCisjIFBlcmwgdHJpbSBmdW5jdGlvbiB0byByZW1vdmUgd2hpdGVzcGFjZSBmcm9tIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcKK3N1YiB0cmltKCQpCit7CisgICAgbXkgJHN0cmluZyA9IHNoaWZ0OworICAgICRzdHJpbmcgPX4gcy9eXHMrLy87CisgICAgJHN0cmluZyA9fiBzL1xzKyQvLzsKKyAgICByZXR1cm4gJHN0cmluZzsKK30KKword2hpbGUgKDxTVERJTj4pCit7CisgICAgIyBMb2FkIGFuZCBzdG9yZSBhbGlnbm1lbnQKKyAgICBzL0AvLDovZzsKKworICAgICMgQ29tbWVudCBjaGFyYWN0ZXIKKyAgICBzLzsvQC9nOworCisgICAgIyBIZXhhZGVjaW1hbCBjb25zdGFudHMgcHJlZmFjZWQgYnkgMHgKKyAgICBzLyMmLyMweC9nOworCisgICAgIyBDb252ZXJ0IDpPUjogdG8gfAorICAgIHMvOk9SOi8gfCAvZzsKKworICAgICMgQ29udmVydCA6QU5EOiB0byAmCisgICAgcy86QU5EOi8gJiAvZzsKKworICAgICMgQ29udmVydCA6Tk9UOiB0byB+CisgICAgcy86Tk9UOi8gfiAvZzsKKworICAgICMgQ29udmVydCA6U0hMOiB0byA8PAorICAgIHMvOlNITDovIDw8IC9nOworCisgICAgIyBDb252ZXJ0IDpTSFI6IHRvID4+CisgICAgcy86U0hSOi8gPj4gL2c7CisKKyAgICAjIENvbnZlcnQgRUxTRSB0byAuZWxzZQorICAgIHMvRUxTRS8uZWxzZS9nOworCisgICAgIyBDb252ZXJ0IEVORElGIHRvIC5lbmRpZgorICAgIHMvRU5ESUYvLmVuZGlmL2c7CisKKyAgICAjIENvbnZlcnQgRUxTRUlGIHRvIC5lbHNlaWYKKyAgICBzL0VMU0VJRi8uZWxzZWlmL2c7CisKKyAgICAjIENvbnZlcnQgTFRPUkcgdG8gLmx0b3JnCisgICAgcy9MVE9SRy8ubHRvcmcvZzsKKworICAgICMgQ29udmVydCBJRiA6REVGOnRvIC5pZgorICAgICMgZ2NjIGRvZXNuJ3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBkbyBhIGNvbmRpdGlvbmFsCisgICAgIyBpZiBkZWZpbmVkIHZhcmlhYmxlIHRoYXQgaXMgc2V0IGJ5IElGIDpERUY6IG9uCisgICAgIyBhcm1hc20sIHNvIGNvbnZlcnQgaXQgdG8gYSBub3JtYWwgLmlmIGFuZCB0aGVuCisgICAgIyBtYWtlIHN1cmUgdG8gZGVmaW5lIGEgdmFsdWUgZWxlc2V3aGVyZQorICAgIGlmIChzL1xiSUYgOkRFRjpcYi8uaWYgL2cpCisgICAgeworICAgICAgICBzLz0vPT0vZzsKKyAgICB9CisKKyAgICAjIENvbnZlcnQgSUYgdG8gLmlmCisgICAgaWYgKHMvXGJJRlxiLy5pZi9nKQorICAgIHsKKyAgICAgICAgcy89Lz09L2c7CisgICAgfQorCisgICAgIyBDb252ZXJ0IElOQ0xVREUgdG8gLklOQ0xVREUgImZpbGUiCisgICAgcy9JTkNMVURFKFxzKikoLiopJC8uaW5jbHVkZSAkMVwiJDJcIi87CisKKyAgICAjIENvZGUgZGlyZWN0aXZlIChBUk0gdnMgVGh1bWIpCisgICAgcy9DT0RFKFswLTldWzAtOV0pLy5jb2RlICQxLzsKKworICAgICMgTm8gQVJFQSByZXF1aXJlZAorICAgICMgQnV0IEFMSUdOcyBpbiBBUkVBIG11c3QgYmUgb2JleWVkCisgICAgcy9eXHMqQVJFQS4qQUxJR049KFswLTldKSQvLnRleHRcbi5wMmFsaWduICQxLzsKKyAgICAjIElmIG5vIEFMSUdOLCBzdHJpcCB0aGUgQVJFQSBhbmQgYWxpZ24gdG8gNCBieXRlcworICAgIHMvXlxzKkFSRUEuKiQvLnRleHRcbi5wMmFsaWduIDIvOworCisgICAgIyBEQ0QgdG8gLndvcmQKKyAgICAjIFRoaXMgb25lIGlzIGZvciBpbmNvbWluZyBzeW1ib2xzCisgICAgcy9EQ0RccytcfChcdyopXHwvLmxvbmcgJDEvOworCisgICAgIyBEQ1cgdG8gLnNob3J0CisgICAgcy9EQ1dccytcfChcdyopXHwvLnNob3J0ICQxLzsKKyAgICBzL0RDVyguKikvLnNob3J0ICQxLzsKKworICAgICMgQ29uc3RhbnRzIGRlZmluZWQgaW4gc2NvcGUKKyAgICBzL0RDRCguKikvLmxvbmcgJDEvOworICAgIHMvRENCKC4qKS8uYnl0ZSAkMS87CisKKyAgICAjIEJ1aWxkIGEgaGFzaCBvZiBhbGwgdGhlIHJlZ2lzdGVyIC0gYWxpYXMgcGFpcnMuCisgICAgaWYgKHMvKC4qKVJOKC4qKS8kMSAucmVxICQyL2cpCisgICAgeworICAgICAgICAkcmVnaXN0ZXJfYWxpYXNlc3t0cmltKCQxKX0gPSB0cmltKCQyKTsKKyAgICAgICAgbmV4dDsKKyAgICB9CisKKyAgICB3aGlsZSAoKCRrZXksICR2YWx1ZSkgPSBlYWNoKCVyZWdpc3Rlcl9hbGlhc2VzKSkKKyAgICB7CisgICAgICAgIHMvXGIka2V5XGIvJHZhbHVlL2c7CisgICAgfQorCisgICAgIyBNYWtlIGZ1bmN0aW9uIHZpc2libGUgdG8gbGlua2VyLCBhbmQgbWFrZSBhZGRpdGlvbmFsIHN5bWJvbCB3aXRoCisgICAgIyBwcmVwZW5kZWQgdW5kZXJzY29yZQorICAgIHMvRVhQT1JUXHMrXHwoW1wkXHddKilcfC8uZ2xvYmwgXyQxXG5cdC5nbG9ibCAkMS87CisKKyAgICAjIFByZXBlbmQgaW1wb3J0ZWQgZnVuY3Rpb25zIHdpdGggXworICAgIGlmIChzL0lNUE9SVFxzK1x8KFtcJFx3XSopXHwvLmdsb2JsICQxLykKKyAgICB7CisgICAgICAgICRmdW5jdGlvbiA9IHRyaW0oJDEpOworICAgICAgICBwdXNoKEBpbXBvcnRlZF9mdW5jdGlvbnMsICRmdW5jdGlvbik7CisgICAgfQorCisgICAgZm9yZWFjaCAkZnVuY3Rpb24gKEBpbXBvcnRlZF9mdW5jdGlvbnMpCisgICAgeworICAgICAgICBzLyRmdW5jdGlvbi9fJGZ1bmN0aW9uLzsKKyAgICB9CisKKyAgICAjIE5vIHZlcnRpY2FsIGJhcnMgcmVxdWlyZWQ7IG1ha2UgYWRkaXRpb25hbCBzeW1ib2wgd2l0aCBwcmVwZW5kZWQKKyAgICAjIHVuZGVyc2NvcmUKKyAgICBzL15cfChcJD9cdyspXHwvXyQxXG5cdCQxOi9nOworCisgICAgIyBMYWJlbHMgbmVlZCB0cmFpbGluZyBjb2xvbgorIyAgIHMvXihcdyspLyQxOi8gaWYgIS9FUVUvOworICAgICMgcHV0IHRoZSBjb2xvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGluIHRoZSBtYWNybworICAgIHMvXihbYS16QS1aXzAtOVwkXSspLyQxOi8gaWYgIS9FUVUvOworCisgICAgIyBBTElHTiBkaXJlY3RpdmUKKyAgICBzL0FMSUdOLy5iYWxpZ24vZzsKKworICAgICMgU3RyaXAgQVJNCisgICAgcy9cc0FSTS9AIEFSTS9nOworCisgICAgIyBTdHJpcCBSRVFVSVJFOAorICAgICNzL1xzUkVRVUlSRTgvQCBSRVFVSVJFOC9nOworICAgIHMvXHNSRVFVSVJFOC9AIC9nOworCisgICAgIyBTdHJpcCBQUkVTRVJWRTgKKyAgICBzL1xzUFJFU0VSVkU4L0AgUFJFU0VSVkU4L2c7CisKKyAgICAjIFN0cmlwIFBST0MgYW5kIEVORFBST0MKKyAgICBzL1xiUFJPQ1xiL0AvZzsKKyAgICBzL1xiRU5EUFxiL0AvZzsKKworICAgICMgRVFVIGRpcmVjdGl2ZQorICAgIHMvKC4qKUVRVSguKikvLnNldCAkMSwgJDIvOworCisgICAgIyBCZWdpbiBtYWNybyBkZWZpbml0aW9uCisgICAgaWYgKC9NQUNSTy8pCisgICAgeworICAgICAgICAjIFByb2Nlc3MgbmV4dCBsaW5lIGRvd24sIHdoaWNoIHdpbGwgYmUgdGhlIG1hY3JvIGRlZmluaXRpb24KKyAgICAgICAgJF8gPSA8U1RESU4+OworCisgICAgICAgICR0cmltbWVkID0gdHJpbSgkXyk7CisKKyAgICAgICAgIyByZW1vdmUgY29tbWFzIHRoYXQgYXJlIHNlcGFyYXRpbmcgbGlzdAorICAgICAgICAkdHJpbW1lZCA9fiBzLywvL2c7CisKKyAgICAgICAgIyBzdHJpbmcgdG8gYXJyYXkKKyAgICAgICAgQGluY29taW5nX2FycmF5ID0gc3BsaXQoLyAvLCAkdHJpbW1lZCk7CisKKyAgICAgICAgcHJpbnQgIi5tYWNybyBAaW5jb21pbmdfYXJyYXlbMF1cbiI7CisKKyAgICAgICAgIyByZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQsIGFzIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIG1hY3JvCisgICAgICAgIHNoaWZ0IChAaW5jb21pbmdfYXJyYXkpOworCisgICAgICAgIEBtYWNyb19hbGlhc2Vze0BpbmNvbWluZ19hcnJheX0gPSBAbWFwcGluZ19saXN0OworCisgICAgICAgIG5leHQ7CisgICAgfQorCisgICAgd2hpbGUgKCgka2V5LCAkdmFsdWUpID0gZWFjaCglbWFjcm9fYWxpYXNlcykpCisgICAgeworICAgICAgICAka2V5ID1+IHMvXCQvXFxcJC87CisgICAgICAgIHMvJGtleVxiLyR2YWx1ZS9nOworICAgIH0KKworICAgICMgRm9yIG1hY3JvcywgdXNlIFwgdG8gcmVmZXJlbmNlIGZvcm1hbCBwYXJhbXMKKyMgICBzL1wkL1xcL2c7ICAgICAgICAgICAgICAgICAgIyBFbmQgbWFjcm8gZGVmaW5pdGlvbgorICAgIHMvTUVORC8uZW5kbS87ICAgICAgICAgICAgICAjIE5vIG5lZWQgdG8gdGVsbCBpdCB3aGVyZSB0byBzdG9wIGFzc2VtYmxpbmcKKyAgICBuZXh0IGlmIC9eXHMqRU5EXHMqJC87CisgICAgcHJpbnQ7Cit9CmRpZmYgLS1naXQgYS9idWlsZC9tYWtlL2FybWxpbmtfYWRhcHRlci5zaCBiL2xpYnZweC9idWlsZC9tYWtlL2FybWxpbmtfYWRhcHRlci5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQvbWFrZS9hcm1saW5rX2FkYXB0ZXIuc2gKcmVuYW1lIHRvIGxpYnZweC9idWlsZC9tYWtlL2FybWxpbmtfYWRhcHRlci5zaApkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkL21ha2UvY29uZmlndXJlLnNoIGIvbGlidnB4L2J1aWxkL21ha2UvY29uZmlndXJlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YmJhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvYnVpbGQvbWFrZS9jb25maWd1cmUuc2gKQEAgLTAsMCArMSwxMjc2IEBACisjIS9iaW4vYmFzaAorIyMKKyMjICBjb25maWd1cmUuc2gKKyMjCisjIyAgVGhpcyBzY3JpcHQgaXMgc291cmNlZCBieSB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0IGFuZCBjb250YWlucworIyMgIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBvdGhlciBjb21tb24gYml0cyB0aGF0IGFyZW4ndCBzdHJpY3RseSBsaWJ2cHgKKyMjICByZWxhdGVkLgorIyMKKyMjICBUaGlzIGJ1aWxkIHN5c3RlbSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSBGRm1wZWcgY29uZmlndXJlIHNjcmlwdC4KKyMjCisKKworIworIyBMb2dnaW5nIC8gT3V0cHV0IEZ1bmN0aW9ucworIworZGllX3Vua25vd24oKXsKKyAgICBlY2hvICJVbmtub3duIG9wdGlvbiBcIiQxXCIuIgorICAgIGVjaG8gIlNlZSAkMCAtLWhlbHAgZm9yIGF2YWlsYWJsZSBvcHRpb25zLiIKKyAgICBjbGVhbl90ZW1wX2ZpbGVzCisgICAgZXhpdCAxCit9CisKKworZGllKCkgeworICAgIGVjaG8gIiRAIgorICAgIGVjaG8KKyAgICBlY2hvICJDb25maWd1cmF0aW9uIGZhaWxlZC4gVGhpcyBjb3VsZCByZWZsZWN0IGEgbWlzY29uZmlndXJhdGlvbiBvZiB5b3VyIgorICAgIGVjaG8gInRvb2xjaGFpbnMsIGltcHJvcGVyIG9wdGlvbnMgc2VsZWN0ZWQsIG9yIGFub3RoZXIgcHJvYmxlbS4gSWYgeW91IgorICAgIGVjaG8gImRvbid0IHNlZSBhbnkgdXNlZnVsIGVycm9yIG1lc3NhZ2VzIGFib3ZlLCB0aGUgbmV4dCBzdGVwIGlzIHRvIGxvb2siCisgICAgZWNobyAiYXQgdGhlIGNvbmZpZ3VyZSBlcnJvciBsb2cgZmlsZSAoJGxvZ2ZpbGUpIHRvIGRldGVybWluZSB3aGF0IgorICAgIGVjaG8gImNvbmZpZ3VyZSB3YXMgdHJ5aW5nIHRvIGRvIHdoZW4gaXQgZGllZC4iCisgICAgY2xlYW5fdGVtcF9maWxlcworICAgIGV4aXQgMQorfQorCisKK2xvZygpeworICAgIGVjaG8gIiRAIiA+PiRsb2dmaWxlCit9CisKKworbG9nX2ZpbGUoKXsKKyAgICBsb2cgQkVHSU4gJDEKKyAgICBwciAtbiAtdCAkMSA+PiRsb2dmaWxlCisgICAgbG9nIEVORCAkMQorfQorCisKK2xvZ19lY2hvKCkgeworICAgIGVjaG8gIiRAIgorICAgIGxvZyAiJEAiCit9CisKKworZndyaXRlICgpIHsKKyAgICBvdXRmaWxlPSQxCisgICAgc2hpZnQKKyAgICBlY2hvICIkQCIgPj4gJHtvdXRmaWxlfQorfQorCisKK3Nob3dfaGVscF9wcmUoKXsKKyAgICBmb3Igb3B0IGluICR7Q01ETElORV9TRUxFQ1R9OyBkbworICAgICAgICBvcHQyPWBlY2hvICRvcHQgfCBzZWQgLWUgJ3M7XzstO2cnYAorICAgICAgICBpZiBlbmFibGVkICRvcHQ7IHRoZW4KKyAgICAgICAgICAgIGV2YWwgInRvZ2dsZV8ke29wdH09XCItLWRpc2FibGUtJHtvcHQyfVwiIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFsICJ0b2dnbGVfJHtvcHR9PVwiLS1lbmFibGUtJHtvcHQyfSBcIiIKKyAgICAgICAgZmkKKyAgICBkb25lCisKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdCitPcHRpb25zOgorCitCdWlsZCBvcHRpb25zOgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbG9nPXllc3xub3xGSUxFICAgICAgICAgICBmaWxlIGNvbmZpZ3VyZSBsb2cgaXMgd3JpdHRlbiB0byBbY29uZmlnLmVycl0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgICAgIHRhcmdldCBwbGF0Zm9ybSB0dXBsZSBbZ2VuZXJpYy1nbnVdCisgIC0tY3B1PUNQVSAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSBmb3IgYSBzcGVjaWZpYyBjcHUgcmF0aGVyIHRoYW4gYSBmYW1pbHkKKyAgLS1leHRyYS1jZmxhZ3M9RUNGTEFHUyAgICAgIGFkZCBFQ0ZMQUdTIHRvIENGTEFHUyBbJENGTEFHU10KKyAgJHt0b2dnbGVfZXh0cmFfd2FybmluZ3N9ICAgIGVtaXQgaGFybWxlc3Mgd2FybmluZ3MgKGFsd2F5cyBub24tZmF0YWwpCisgICR7dG9nZ2xlX3dlcnJvcn0gICAgICAgICAgICB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMsIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IGF2YWlsYWJsZSB3aXRoIGFsbCBjb21waWxlcnMpCisgICR7dG9nZ2xlX29wdGltaXphdGlvbnN9ICAgICB0dXJuIG9uL29mZiBjb21waWxlciBvcHRpbWl6YXRpb24gZmxhZ3MKKyAgJHt0b2dnbGVfcGljfSAgICAgICAgICAgICAgIHR1cm4gb24vb2ZmIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUKKyAgJHt0b2dnbGVfY2NhY2hlfSAgICAgICAgICAgIHR1cm4gb24vb2ZmIGNvbXBpbGVyIGNhY2hlCisgICR7dG9nZ2xlX2RlYnVnfSAgICAgICAgICAgICBlbmFibGUvZGlzYWJsZSBkZWJ1ZyBtb2RlCisgICR7dG9nZ2xlX2dwcm9mfSAgICAgICAgICAgICBlbmFibGUvZGlzYWJsZSBncHJvZiBwcm9maWxpbmcgaW5zdHJ1bWVudGF0aW9uCisgICR7dG9nZ2xlX2djb3Z9ICAgICAgICAgICAgICBlbmFibGUvZGlzYWJsZSBnY292IGNvdmVyYWdlIGluc3RydW1lbnRhdGlvbgorCitJbnN0YWxsIG9wdGlvbnM6CisgICR7dG9nZ2xlX2luc3RhbGxfZG9jc30gICAgICBjb250cm9sIHdoZXRoZXIgZG9jcyBhcmUgaW5zdGFsbGVkCisgICR7dG9nZ2xlX2luc3RhbGxfYmluc30gICAgICBjb250cm9sIHdoZXRoZXIgYmluYXJpZXMgYXJlIGluc3RhbGxlZAorICAke3RvZ2dsZV9pbnN0YWxsX2xpYnN9ICAgICAgY29udHJvbCB3aGV0aGVyIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkCisgICR7dG9nZ2xlX2luc3RhbGxfc3Jjc30gICAgICBjb250cm9sIHdoZXRoZXIgc291cmNlcyBhcmUgaW5zdGFsbGVkCisKKworRU9GCit9CisKKworc2hvd19oZWxwX3Bvc3QoKXsKKyAgICBjYXQgPDxFT0YKKworCitOT1RFUzoKKyAgICBPYmplY3QgZmlsZXMgYXJlIGJ1aWx0IGF0IHRoZSBwbGFjZSB3aGVyZSBjb25maWd1cmUgaXMgbGF1bmNoZWQuCisKKyAgICBBbGwgYm9vbGVhbiBvcHRpb25zIGNhbiBiZSBuZWdhdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgb3Bwb3NpdGUKKyAgICBvZiB0aGF0IHNob3duIGFib3ZlLiBJZiB0aGUgb3B0aW9uIC0tZGlzYWJsZS1mb28gaXMgbGlzdGVkLCB0aGVuCisgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZvbyBpcyBlbmFibGVkLgorCitTdXBwb3J0ZWQgdGFyZ2V0czoKK0VPRgorICBzaG93X3RhcmdldHMgJHthbGxfcGxhdGZvcm1zfQorICBlY2hvCisgIGV4aXQgMQorfQorCisKK3Nob3dfdGFyZ2V0cygpIHsKKyAgICB3aGlsZSBbIC1uICIkKiIgXTsgZG8KKyAgICAgICAgaWYgWyAiJHsxJSUtKn0iID0gIiR7MiUlLSp9IiBdOyB0aGVuCisgICAgICAgICAgICBpZiBbICIkezIlJS0qfSIgPSAiJHszJSUtKn0iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBwcmludGYgIiAgICAlLTI0cyAlLTI0cyAlLTI0c1xuIiAiJDEiICIkMiIgIiQzIgorICAgICAgICAgICAgICAgIHNoaWZ0OyBzaGlmdDsgc2hpZnQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYgIiAgICAlLTI0cyAlLTI0c1xuIiAiJDEiICIkMiIKKyAgICAgICAgICAgICAgICBzaGlmdDsgc2hpZnQKKyAgICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAiICAgICUtMjRzXG4iICIkMSIKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgIGZpCisgICAgZG9uZQorfQorCisKK3Nob3dfaGVscCgpIHsKKyAgICBzaG93X2hlbHBfcHJlCisgICAgc2hvd19oZWxwX3Bvc3QKK30KKworIworIyBMaXN0IFByb2Nlc3NpbmcgRnVuY3Rpb25zCisjCitzZXRfYWxsKCl7CisgICAgdmFsdWU9JDEKKyAgICBzaGlmdAorICAgIGZvciB2YXIgaW4gJCo7IGRvCisgICAgICAgIGV2YWwgJHZhcj0kdmFsdWUKKyAgICBkb25lCit9CisKKworaXNfaW4oKXsKKyAgICB2YWx1ZT0kMQorICAgIHNoaWZ0CisgICAgZm9yIHZhciBpbiAkKjsgZG8KKyAgICAgICAgWyAkdmFyID0gJHZhbHVlIF0gJiYgcmV0dXJuIDAKKyAgICBkb25lCisgICAgcmV0dXJuIDEKK30KKworCithZGRfY2ZsYWdzKCkgeworICAgIENGTEFHUz0iJHtDRkxBR1N9ICRAIgorICAgIENYWEZMQUdTPSIke0NYWEZMQUdTfSAkQCIKK30KKworCithZGRfY2ZsYWdzX29ubHkoKSB7CisgICAgQ0ZMQUdTPSIke0NGTEFHU30gJEAiCit9CisKKworYWRkX2N4eGZsYWdzX29ubHkoKSB7CisgICAgQ1hYRkxBR1M9IiR7Q1hYRkxBR1N9ICRAIgorfQorCisKK2FkZF9sZGZsYWdzKCkgeworICAgIExERkxBR1M9IiR7TERGTEFHU30gJEAiCit9CisKKworYWRkX2FzZmxhZ3MoKSB7CisgICAgQVNGTEFHUz0iJHtBU0ZMQUdTfSAkQCIKK30KKworCithZGRfZXh0cmFsaWJzKCkgeworICAgIGV4dHJhbGlicz0iJHtleHRyYWxpYnN9ICRAIgorfQorCisjCisjIEJvb2xlYW4gTWFuaXB1bGF0aW9uIEZ1bmN0aW9ucworIworZW5hYmxlKCl7CisgICAgc2V0X2FsbCB5ZXMgJCoKK30KKworZGlzYWJsZSgpeworICAgIHNldF9hbGwgbm8gJCoKK30KKworZW5hYmxlZCgpeworICAgIGV2YWwgdGVzdCAieFwkJDEiID0gInh5ZXMiCit9CisKK2Rpc2FibGVkKCl7CisgICAgZXZhbCB0ZXN0ICJ4XCQkMSIgPSAieG5vIgorfQorCisKK3NvZnRfZW5hYmxlKCkgeworICAgIGZvciB2YXIgaW4gJCo7IGRvCisgICAgICAgIGlmICEgZGlzYWJsZWQgJHZhcjsgdGhlbgorICAgICAgICAgICAgbG9nX2VjaG8gIiAgZW5hYmxpbmcgJHZhciIKKyAgICAgICAgICAgIGVuYWJsZSAkdmFyCisgICAgICAgIGZpCisgICAgZG9uZQorfQorCitzb2Z0X2Rpc2FibGUoKSB7CisgICAgZm9yIHZhciBpbiAkKjsgZG8KKyAgICAgICAgaWYgISBlbmFibGVkICR2YXI7IHRoZW4KKyAgICAgICAgICAgIGxvZ19lY2hvICIgIGRpc2FibGluZyAkdmFyIgorICAgICAgICAgICAgZGlzYWJsZSAkdmFyCisgICAgICAgIGZpCisgICAgZG9uZQorfQorCisKKyMKKyMgVGV4dCBQcm9jZXNzaW5nIEZ1bmN0aW9ucworIwordG91cHBlcigpeworICAgIGVjaG8gIiRAIiB8IHRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaCit9CisKKwordG9sb3dlcigpeworICAgIGVjaG8gIiRAIiB8IHRyIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Cit9CisKKworIworIyBUZW1wb3JhcnkgRmlsZSBGdW5jdGlvbnMKKyMKK3NvdXJjZV9wYXRoPSR7MCUvKn0KK2VuYWJsZSBzb3VyY2VfcGF0aF91c2VkCitpZiB0ZXN0IC16ICIkc291cmNlX3BhdGgiIC1vICIkc291cmNlX3BhdGgiID0gIi4iIDsgdGhlbgorICAgIHNvdXJjZV9wYXRoPSJgcHdkYCIKKyAgICBkaXNhYmxlIHNvdXJjZV9wYXRoX3VzZWQKK2ZpCisKK2lmIHRlc3QgISAteiAiJFRNUERJUiIgOyB0aGVuCisgICAgVE1QRElSeD0iJHtUTVBESVJ9IgorZWxpZiB0ZXN0ICEgLXogIiRURU1QRElSIiA7IHRoZW4KKyAgICBUTVBESVJ4PSIke1RFTVBESVJ9IgorZWxzZQorICAgIFRNUERJUng9Ii90bXAiCitmaQorVE1QX0g9IiR7VE1QRElSeH0vdnB4LWNvbmYtJCQtJHtSQU5ET019LmgiCitUTVBfQz0iJHtUTVBESVJ4fS92cHgtY29uZi0kJC0ke1JBTkRPTX0uYyIKK1RNUF9PPSIke1RNUERJUnh9L3ZweC1jb25mLSQkLSR7UkFORE9NfS5vIgorVE1QX1g9IiR7VE1QRElSeH0vdnB4LWNvbmYtJCQtJHtSQU5ET019LngiCitUTVBfQVNNPSIke1RNUERJUnh9L3ZweC1jb25mLSQkLSR7UkFORE9NfS5hc20iCisKK2NsZWFuX3RlbXBfZmlsZXMoKSB7CisgICAgcm0gLWYgJHtUTVBfQ30gJHtUTVBfSH0gJHtUTVBfT30gJHtUTVBfWH0gJHtUTVBfQVNNfQorfQorCisjCisjIFRvb2xjaGFpbiBDaGVjayBGdW5jdGlvbnMKKyMKK2NoZWNrX2NtZCgpIHsKKyAgICBsb2cgIiRAIgorICAgICIkQCIgPj4ke2xvZ2ZpbGV9IDI+JjEKK30KKworY2hlY2tfY2MoKSB7CisgICAgbG9nIGNoZWNrX2NjICIkQCIKKyAgICBjYXQgPiR7VE1QX0N9CisgICAgbG9nX2ZpbGUgJHtUTVBfQ30KKyAgICBjaGVja19jbWQgJHtDQ30gJHtDRkxBR1N9ICIkQCIgLWMgLW8gJHtUTVBfT30gJHtUTVBfQ30KK30KKworY2hlY2tfY3h4KCkgeworICAgIGxvZyBjaGVja19jeHggIiRAIgorICAgIGNhdCA+JHtUTVBfQ30KKyAgICBsb2dfZmlsZSAke1RNUF9DfQorICAgIGNoZWNrX2NtZCAke0NYWH0gJHtDWFhGTEFHU30gIiRAIiAtYyAtbyAke1RNUF9PfSAke1RNUF9DfQorfQorCitjaGVja19jcHAoKSB7CisgICAgbG9nIGNoZWNrX2NwcCAiJEAiCisgICAgY2F0ID4gJHtUTVBfQ30KKyAgICBsb2dfZmlsZSAke1RNUF9DfQorICAgIGNoZWNrX2NtZCAke0NDfSAke0NGTEFHU30gIiRAIiAtRSAtbyAke1RNUF9PfSAke1RNUF9DfQorfQorCitjaGVja19sZCgpIHsKKyAgICBsb2cgY2hlY2tfbGQgIiRAIgorICAgIGNoZWNrX2NjICRAIFwKKyAgICAgICAgJiYgY2hlY2tfY21kICR7TER9ICR7TERGTEFHU30gIiRAIiAtbyAke1RNUF9YfSAke1RNUF9PfSAke2V4dHJhbGlic30KK30KKworY2hlY2tfaGVhZGVyKCl7CisgICAgbG9nIGNoZWNrX2hlYWRlciAiJEAiCisgICAgaGVhZGVyPSQxCisgICAgc2hpZnQKKyAgICB2YXI9YGVjaG8gJGhlYWRlciB8IHNlZCAncy9bXkEtWmEtejAtOV9dL18vZydgCisgICAgZGlzYWJsZSAkdmFyCisgICAgY2hlY2tfY3BwICIkQCIgPDxFT0YgJiYgZW5hYmxlICR2YXIKKyNpbmNsdWRlICIkaGVhZGVyIgoraW50IHg7CitFT0YKK30KKworCitjaGVja19jZmxhZ3MoKSB7CisgICAgbG9nIGNoZWNrX2NmbGFncyAiJEAiCisgICAgY2hlY2tfY2MgIiRAIiA8PEVPRgoraW50IHg7CitFT0YKK30KKworY2hlY2tfY3h4ZmxhZ3MoKSB7CisgICAgbG9nIGNoZWNrX2N4eGZsYWdzICIkQCIKKworICAgICMgQ2F0Y2ggQ0ZMQUdTIHRoYXQgdHJpZ2dlciBDWFggd2FybmluZ3MKKyAgICBjYXNlICIkQ1hYIiBpbgorICAgICAgKmcrKyopIGNoZWNrX2N4eCAtV2Vycm9yICIkQCIgPDxFT0YKK2ludCB4OworRU9GCisgICAgICA7OworICAgICAgKikgY2hlY2tfY3h4ICIkQCIgPDxFT0YKK2ludCB4OworRU9GCisgICAgICA7OworICAgIGVzYWMKK30KKworY2hlY2tfYWRkX2NmbGFncygpIHsKKyAgICBjaGVja19jeHhmbGFncyAiJEAiICYmIGFkZF9jeHhmbGFnc19vbmx5ICIkQCIKKyAgICBjaGVja19jZmxhZ3MgIiRAIiAmJiBhZGRfY2ZsYWdzX29ubHkgIiRAIgorfQorCitjaGVja19hZGRfYXNmbGFncygpIHsKKyAgICBsb2cgYWRkX2FzZmxhZ3MgIiRAIgorICAgIGFkZF9hc2ZsYWdzICIkQCIKK30KKworY2hlY2tfYWRkX2xkZmxhZ3MoKSB7CisgICAgbG9nIGFkZF9sZGZsYWdzICIkQCIKKyAgICBhZGRfbGRmbGFncyAiJEAiCit9CisKK2NoZWNrX2FzbV9hbGlnbigpIHsKKyAgICBsb2cgY2hlY2tfYXNtX2FsaWduICIkQCIKKyAgICBjYXQgPiR7VE1QX0FTTX0gPDxFT0YKK3NlY3Rpb24gLnJvZGF0YQorYWxpZ24gMTYKK0VPRgorICAgIGxvZ19maWxlICR7VE1QX0FTTX0KKyAgICBjaGVja19jbWQgJHtBU30gJHtBU0ZMQUdTfSAtbyAke1RNUF9PfSAke1RNUF9BU019CisgICAgcmVhZGVsZiAtV1MgJHtUTVBfT30gPiR7VE1QX1h9CisgICAgbG9nX2ZpbGUgJHtUTVBfWH0KKyAgICBpZiAhIGdyZXAgLXEgJ1wucm9kYXRhIC4qIDE2JCcgJHtUTVBfWH07IHRoZW4KKyAgICAgICAgZGllICIke0FTfSAke0FTRkxBR1N9IGRvZXMgbm90IHN1cHBvcnQgc2VjdGlvbiBhbGlnbm1lbnQgKG5hc20gPD0yLjA4PykiCisgICAgZmkKK30KKword3JpdGVfY29tbW9uX2NvbmZpZ19iYW5uZXIoKSB7CisgICAgcHJpbnRfd2VibV9saWNlbnNlIGNvbmZpZy5tayAiIyMiICIiCisgICAgZWNobyAnIyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEnID4+IGNvbmZpZy5taworICAgIGVjaG8gIlRPT0xDSEFJTiA6PSAke3Rvb2xjaGFpbn0iID4+IGNvbmZpZy5taworCisgICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KKyAgICAgICAgKi1saW51eC1ydmN0KQorICAgICAgICAgICAgZWNobyAiQUxUX0xJQkMgOj0gJHthbHRfbGliY30iID4+IGNvbmZpZy5taworICAgICAgICAgICAgOzsKKyAgICBlc2FjCit9CisKK3dyaXRlX2NvbW1vbl9jb25maWdfdGFyZ2V0cygpIHsKKyAgICBmb3IgdCBpbiAke2FsbF90YXJnZXRzfTsgZG8KKyAgICAgICAgaWYgZW5hYmxlZCAke3R9OyB0aGVuCisgICAgICAgICAgICBpZiBlbmFibGVkIHVuaXZlcnNhbCB8fCBlbmFibGVkIGNoaWxkOyB0aGVuCisgICAgICAgICAgICAgICAgZndyaXRlIGNvbmZpZy5tayAiQUxMX1RBUkdFVFMgKz0gJHt0fS0ke3Rvb2xjaGFpbn0iCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZndyaXRlIGNvbmZpZy5tayAiQUxMX1RBUkdFVFMgKz0gJHt0fSIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgdHJ1ZTsKKyAgICBkb25lCit0cnVlCit9CisKK3dyaXRlX2NvbW1vbl90YXJnZXRfY29uZmlnX21rKCkgeworICAgIGxvY2FsIENDPSR7Q0N9CisgICAgbG9jYWwgQ1hYPSR7Q1hYfQorICAgIGVuYWJsZWQgY2NhY2hlICYmIENDPSJjY2FjaGUgJHtDQ30iCisgICAgZW5hYmxlZCBjY2FjaGUgJiYgQ1hYPSJjY2FjaGUgJHtDWFh9IgorICAgIHByaW50X3dlYm1fbGljZW5zZSAkMSAiIyMiICIiCisKKyAgICBjYXQgPj4gJDEgPDwgRU9GCisjIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIG5vdCBlZGl0IQorU1JDX1BBVEg9IiRzb3VyY2VfcGF0aCIKK1NSQ19QQVRIX0JBUkU9JHNvdXJjZV9wYXRoCitCVUlMRF9QRlg9JHtCVUlMRF9QRlh9CitUT09MQ0hBSU49JHt0b29sY2hhaW59CitBU01fQ09OVkVSU0lPTj0ke2FzbV9jb252ZXJzaW9uX2NtZDotJHtzb3VyY2VfcGF0aH0vYnVpbGQvbWFrZS9hZHMyZ2FzLnBsfQorCitDQz0ke0NDfQorQ1hYPSR7Q1hYfQorQVI9JHtBUn0KK0xEPSR7TER9CitBUz0ke0FTfQorU1RSSVA9JHtTVFJJUH0KK05NPSR7Tk19CisKK0NGTEFHUyAgPSAke0NGTEFHU30KK0NYWEZMQUdTICA9ICR7Q1hYRkxBR1N9CitBUkZMQUdTID0gLXJ1c1wkKGlmIFwkKHF1aWV0KSxjLHYpCitMREZMQUdTID0gJHtMREZMQUdTfQorQVNGTEFHUyA9ICR7QVNGTEFHU30KK2V4dHJhbGlicyA9ICR7ZXh0cmFsaWJzfQorQVNfU0ZYICAgID0gJHtBU19TRlg6LS5hc219CitFWEVfU0ZYICAgPSAke0VYRV9TRlh9CitSVENEX09QVElPTlMgPSAke1JUQ0RfT1BUSU9OU30KK0VPRgorCisgICAgaWYgZW5hYmxlZCBydmN0OyB0aGVuIGNhdCA+PiAkMSA8PCBFT0YKK2ZtdF9kZXBzID0gc2VkIC1lICdzO15fX2ltYWdlLmF4ZjtcJChkaXIgXCRAKVwkKG5vdGRpciBcJDwpLm8gXCRAOycgI2hpZGUKK0VPRgorICAgIGVsc2UgY2F0ID4+ICQxIDw8IEVPRgorZm10X2RlcHMgPSBzZWQgLWUgJ3M7XlwoW2EtekEtWjAtOV9dKlwpXC5vO1wkKGRpciBcJEApXDFcJChzdWZmaXggXCQ8KS5vIFwkQDsnCitFT0YKKyAgICBmaQorCisgICAgcHJpbnRfY29uZmlnX21rIEFSQ0ggICAiJHsxfSIgJHtBUkNIX0xJU1R9CisgICAgcHJpbnRfY29uZmlnX21rIEhBVkUgICAiJHsxfSIgJHtIQVZFX0xJU1R9CisgICAgcHJpbnRfY29uZmlnX21rIENPTkZJRyAiJHsxfSIgJHtDT05GSUdfTElTVH0KKyAgICBwcmludF9jb25maWdfbWsgSEFWRSAgICIkezF9IiBnbnVfc3RyaXAKKworICAgIGVuYWJsZWQgbXN2cyAmJiBlY2hvICJDT05GSUdfVlNfVkVSU0lPTj0ke3ZzX3ZlcnNpb259IiA+PiAiJHsxfSIKKworfQorCisKK3dyaXRlX2NvbW1vbl90YXJnZXRfY29uZmlnX2goKSB7CisgICAgcHJpbnRfd2VibV9saWNlbnNlICR7VE1QX0h9ICIvKiIgIiAqLyIKKyAgICBjYXQgPj4gJHtUTVBfSH0gPDwgRU9GCisvKiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEgKi8KKyNpZm5kZWYgVlBYX0NPTkZJR19ICisjZGVmaW5lIFZQWF9DT05GSUdfSAorI2RlZmluZSBSRVNUUklDVCAgICAke1JFU1RSSUNUfQorRU9GCisgICAgcHJpbnRfY29uZmlnX2ggQVJDSCAgICIke1RNUF9IfSIgJHtBUkNIX0xJU1R9CisgICAgcHJpbnRfY29uZmlnX2ggSEFWRSAgICIke1RNUF9IfSIgJHtIQVZFX0xJU1R9CisgICAgcHJpbnRfY29uZmlnX2ggQ09ORklHICIke1RNUF9IfSIgJHtDT05GSUdfTElTVH0KKyAgICBlY2hvICIjZW5kaWYgLyogVlBYX0NPTkZJR19IICovIiA+PiAke1RNUF9IfQorICAgIG1rZGlyIC1wIGBkaXJuYW1lICIkMSJgCisgICAgY21wICIkMSIgJHtUTVBfSH0gPi9kZXYvbnVsbCAyPiYxIHx8IG12ICR7VE1QX0h9ICIkMSIKK30KKworcHJvY2Vzc19jb21tb25fY21kbGluZSgpIHsKKyAgICBmb3Igb3B0IGluICIkQCI7IGRvCisgICAgICAgIG9wdHZhbD0iJHtvcHQjKj19IgorICAgICAgICBjYXNlICIkb3B0IiBpbgorICAgICAgICAtLWNoaWxkKSBlbmFibGUgY2hpbGQKKyAgICAgICAgOzsKKyAgICAgICAgLS1sb2cqKQorICAgICAgICBsb2dnaW5nPSIkb3B0dmFsIgorICAgICAgICBpZiAhIGRpc2FibGVkIGxvZ2dpbmcgOyB0aGVuCisgICAgICAgICAgICBlbmFibGVkIGxvZ2dpbmcgfHwgbG9nZmlsZT0iJGxvZ2dpbmciCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvZ2ZpbGU9L2Rldi9udWxsCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAgIC0tdGFyZ2V0PSopIHRvb2xjaGFpbj0iJHt0b29sY2hhaW46LSR7b3B0dmFsfX0iCisgICAgICAgIDs7CisgICAgICAgIC0tZm9yY2UtdGFyZ2V0PSopIHRvb2xjaGFpbj0iJHt0b29sY2hhaW46LSR7b3B0dmFsfX0iOyBlbmFibGUgZm9yY2VfdG9vbGNoYWluCisgICAgICAgIDs7CisgICAgICAgIC0tY3B1KQorICAgICAgICA7OworICAgICAgICAtLWNwdT0qKSB0dW5lX2NwdT0iJG9wdHZhbCIKKyAgICAgICAgOzsKKyAgICAgICAgLS1leHRyYS1jZmxhZ3M9KikKKyAgICAgICAgZXh0cmFfY2ZsYWdzPSIke29wdHZhbH0iCisgICAgICAgIDs7CisgICAgICAgIC0tZW5hYmxlLT8qfC0tZGlzYWJsZS0/KikKKyAgICAgICAgZXZhbCBgZWNobyAiJG9wdCIgfCBzZWQgJ3MvLS0vYWN0aW9uPS87cy8tLyBvcHRpb249LztzLy0vXy9nJ2AKKyAgICAgICAgaWYgZWNobyAiJHtBUkNIX0VYVF9MSVNUfSIgfCBncmVwICJeICokb3B0aW9uXCQiID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgICAgIFsgJGFjdGlvbiA9ICJkaXNhYmxlIiBdICYmIFJUQ0RfT1BUSU9OUz0iJHtSVENEX09QVElPTlN9JHtvcHR9ICIKKyAgICAgICAgZWxpZiBbICRhY3Rpb24gPSAiZGlzYWJsZSIgXSAmJiAhIGRpc2FibGVkICRvcHRpb24gOyB0aGVuCisgICAgICAgICAgZWNobyAiJHtDTURMSU5FX1NFTEVDVH0iIHwgZ3JlcCAiXiAqJG9wdGlvblwkIiA+L2Rldi9udWxsIHx8CisgICAgICAgICAgICBkaWVfdW5rbm93biAkb3B0CisgICAgICAgIGVsaWYgWyAkYWN0aW9uID0gImVuYWJsZSIgXSAmJiAhIGVuYWJsZWQgJG9wdGlvbiA7IHRoZW4KKyAgICAgICAgICBlY2hvICIke0NNRExJTkVfU0VMRUNUfSIgfCBncmVwICJeICokb3B0aW9uXCQiID4vZGV2L251bGwgfHwKKyAgICAgICAgICAgIGRpZV91bmtub3duICRvcHQKKyAgICAgICAgZmkKKyAgICAgICAgJGFjdGlvbiAkb3B0aW9uCisgICAgICAgIDs7CisgICAgICAgIC0tcmVxdWlyZS0/KikKKyAgICAgICAgZXZhbCBgZWNobyAiJG9wdCIgfCBzZWQgJ3MvLS0vYWN0aW9uPS87cy8tLyBvcHRpb249LztzLy0vXy9nJ2AKKyAgICAgICAgaWYgZWNobyAiJHtBUkNIX0VYVF9MSVNUfSIgbm9uZSB8IGdyZXAgIl4gKiRvcHRpb25cJCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgICAgUlRDRF9PUFRJT05TPSIke1JUQ0RfT1BUSU9OU30ke29wdH0gIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBkaWVfdW5rbm93biAkb3B0CisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAgIC0tZm9yY2UtZW5hYmxlLT8qfC0tZm9yY2UtZGlzYWJsZS0/KikKKyAgICAgICAgZXZhbCBgZWNobyAiJG9wdCIgfCBzZWQgJ3MvLS1mb3JjZS0vYWN0aW9uPS87cy8tLyBvcHRpb249LztzLy0vXy9nJ2AKKyAgICAgICAgJGFjdGlvbiAkb3B0aW9uCisgICAgICAgIDs7CisgICAgICAgIC0tbGliYz0qKQorICAgICAgICBbIC1kICIke29wdHZhbH0iIF0gfHwgZGllICJOb3QgYSBkaXJlY3Rvcnk6ICR7b3B0dmFsfSIKKyAgICAgICAgZGlzYWJsZSBidWlsdGluX2xpYmMKKyAgICAgICAgYWx0X2xpYmM9IiR7b3B0dmFsfSIKKyAgICAgICAgOzsKKyAgICAgICAgLS1hcz0qKQorICAgICAgICBbICIke29wdHZhbH0iID0geWFzbSAtbyAiJHtvcHR2YWx9IiA9IG5hc20gLW8gIiR7b3B0dmFsfSIgPSBhdXRvIF0gXAorICAgICAgICAgICAgfHwgZGllICJNdXN0IGJlIHlhc20sIG5hc20gb3IgYXV0bzogJHtvcHR2YWx9IgorICAgICAgICBhbHRfYXM9IiR7b3B0dmFsfSIKKyAgICAgICAgOzsKKyAgICAgICAgLS1wcmVmaXg9KikKKyAgICAgICAgcHJlZml4PSIke29wdHZhbH0iCisgICAgICAgIDs7CisgICAgICAgIC0tbGliZGlyPSopCisgICAgICAgIGxpYmRpcj0iJHtvcHR2YWx9IgorICAgICAgICA7OworICAgICAgICAtLXNkay1wYXRoPSopCisgICAgICAgIFsgLWQgIiR7b3B0dmFsfSIgXSB8fCBkaWUgIk5vdCBhIGRpcmVjdG9yeTogJHtvcHR2YWx9IgorICAgICAgICBzZGtfcGF0aD0iJHtvcHR2YWx9IgorICAgICAgICA7OworICAgICAgICAtLWxpYmN8LS1hc3wtLXByZWZpeHwtLWxpYmRpcnwtLXNkay1wYXRoKQorICAgICAgICBkaWUgIk9wdGlvbiAke29wdH0gcmVxdWlyZXMgYXJndW1lbnQiCisgICAgICAgIDs7CisgICAgICAgIC0taGVscHwtaCkgc2hvd19oZWxwCisgICAgICAgIDs7CisgICAgICAgICopIGRpZV91bmtub3duICRvcHQKKyAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgIGRvbmUKK30KKworcHJvY2Vzc19jbWRsaW5lKCkgeworICAgIGZvciBvcHQgZG8KKyAgICAgICAgb3B0dmFsPSIke29wdCMqPX0iCisgICAgICAgIGNhc2UgIiRvcHQiIGluCisgICAgICAgICopIHByb2Nlc3NfY29tbW9uX2NtZGxpbmUgJG9wdAorICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZG9uZQorfQorCisKK3Bvc3RfcHJvY2Vzc19jb21tb25fY21kbGluZSgpIHsKKyAgICBwcmVmaXg9IiR7cHJlZml4Oi0vdXNyL2xvY2FsfSIKKyAgICBwcmVmaXg9IiR7cHJlZml4JS99IgorICAgIGxpYmRpcj0iJHtsaWJkaXI6LSR7cHJlZml4fS9saWJ9IgorICAgIGxpYmRpcj0iJHtsaWJkaXIlL30iCisgICAgaWYgWyAiJHtsaWJkaXIjJHtwcmVmaXh9fSIgPSAiJHtsaWJkaXJ9IiBdOyB0aGVuCisgICAgICAgIGRpZSAiTGliZGlyICR7bGliZGlyfSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mICR7cHJlZml4fSIKKyAgICBmaQorfQorCisKK3Bvc3RfcHJvY2Vzc19jbWRsaW5lKCkgeworICAgIHRydWU7Cit9CisKK3NldHVwX2dudV90b29sY2hhaW4oKSB7CisgICAgICAgIENDPSR7Q0M6LSR7Q1JPU1N9Z2NjfQorICAgICAgICBDWFg9JHtDWFg6LSR7Q1JPU1N9ZysrfQorICAgICAgICBBUj0ke0FSOi0ke0NST1NTfWFyfQorICAgICAgICBMRD0ke0xEOi0ke0NST1NTfSR7bGlua193aXRoX2NjOi1sZH19CisgICAgICAgIEFTPSR7QVM6LSR7Q1JPU1N9YXN9CisgICAgU1RSSVA9JHtTVFJJUDotJHtDUk9TU31zdHJpcH0KKyAgICBOTT0ke05NOi0ke0NST1NTfW5tfQorICAgICAgICBBU19TRlg9LnMKKyAgICAgICAgRVhFX1NGWD0KK30KKworcHJvY2Vzc19jb21tb25fdG9vbGNoYWluKCkgeworICAgIGlmIFsgLXogIiR0b29sY2hhaW4iIF07IHRoZW4KKyAgICAgICAgZ2NjdGFyZ2V0PSIke0NIT1NUOi0kKGdjYyAtZHVtcG1hY2hpbmUgMj4gL2Rldi9udWxsKX0iCisKKyAgICAgICAgIyBkZXRlY3QgdGd0X2lzYQorICAgICAgICBjYXNlICIkZ2NjdGFyZ2V0IiBpbgorICAgICAgICAgICAgYXJtdjYqKQorICAgICAgICAgICAgICAgIHRndF9pc2E9YXJtdjYKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgYXJtdjcqKQorICAgICAgICAgICAgICAgIHRndF9pc2E9YXJtdjcKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgYXJtdjV0ZSopCisgICAgICAgICAgICAgICAgdGd0X2lzYT1hcm12NXRlCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICp4ODZfNjQqfCphbWQ2NCopCisgICAgICAgICAgICAgICAgdGd0X2lzYT14ODZfNjQKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKmlbMzQ1Nl04NiopCisgICAgICAgICAgICAgICAgdGd0X2lzYT14ODYKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKnBvd2VycGM2NCopCisgICAgICAgICAgICAgICAgdGd0X2lzYT1wcGM2NAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqcG93ZXJwYyopCisgICAgICAgICAgICAgICAgdGd0X2lzYT1wcGMzMgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqc3BhcmMqKQorICAgICAgICAgICAgICAgIHRndF9pc2E9c3BhcmMKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgIyBkZXRlY3QgdGd0X29zCisgICAgICAgIGNhc2UgIiRnY2N0YXJnZXQiIGluCisgICAgICAgICAgICAqZGFyd2luOCopCisgICAgICAgICAgICAgICAgdGd0X2lzYT11bml2ZXJzYWwKKyAgICAgICAgICAgICAgICB0Z3Rfb3M9ZGFyd2luOAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqZGFyd2luOSopCisgICAgICAgICAgICAgICAgdGd0X2lzYT11bml2ZXJzYWwKKyAgICAgICAgICAgICAgICB0Z3Rfb3M9ZGFyd2luOQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqZGFyd2luMTAqKQorICAgICAgICAgICAgICAgIHRndF9pc2E9eDg2XzY0CisgICAgICAgICAgICAgICAgdGd0X29zPWRhcndpbjEwCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICpkYXJ3aW4xMSopCisgICAgICAgICAgICAgICAgdGd0X2lzYT14ODZfNjQKKyAgICAgICAgICAgICAgICB0Z3Rfb3M9ZGFyd2luMTEKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKmRhcndpbjEyKikKKyAgICAgICAgICAgICAgICB0Z3RfaXNhPXg4Nl82NAorICAgICAgICAgICAgICAgIHRndF9vcz1kYXJ3aW4xMgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqbWluZ3czMip8KmN5Z3dpbiopCisgICAgICAgICAgICAgICAgWyAteiAiJHRndF9pc2EiIF0gJiYgdGd0X2lzYT14ODYKKyAgICAgICAgICAgICAgICB0Z3Rfb3M9d2luMzIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKmxpbnV4KnwqYnNkKikKKyAgICAgICAgICAgICAgICB0Z3Rfb3M9bGludXgKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKnNvbGFyaXMyLjEwKQorICAgICAgICAgICAgICAgIHRndF9vcz1zb2xhcmlzCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICpvczIqKQorICAgICAgICAgICAgICAgIHRndF9vcz1vczIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgaWYgWyAtbiAiJHRndF9pc2EiIF0gJiYgWyAtbiAiJHRndF9vcyIgXTsgdGhlbgorICAgICAgICAgICAgdG9vbGNoYWluPSR7dGd0X2lzYX0tJHt0Z3Rfb3N9LWdjYworICAgICAgICBmaQorICAgIGZpCisKKyAgICB0b29sY2hhaW49JHt0b29sY2hhaW46LWdlbmVyaWMtZ251fQorCisgICAgaXNfaW4gJHt0b29sY2hhaW59ICR7YWxsX3BsYXRmb3Jtc30gfHwgZW5hYmxlZCBmb3JjZV90b29sY2hhaW4gXAorICAgICAgICB8fCBkaWUgIlVucmVjb2duaXplZCB0b29sY2hhaW4gJyR7dG9vbGNoYWlufSciCisKKyAgICBlbmFibGVkIGNoaWxkIHx8IGxvZ19lY2hvICJDb25maWd1cmluZyBmb3IgdGFyZ2V0ICcke3Rvb2xjaGFpbn0nIgorCisgICAgIworICAgICMgU2V0IHVwIHRvb2xjaGFpbiB2YXJpYWJsZXMKKyAgICAjCisgICAgdGd0X2lzYT0kKGVjaG8gJHt0b29sY2hhaW59IHwgYXdrICdCRUdJTntGUz0iLSJ9e3ByaW50ICQxfScpCisgICAgdGd0X29zPSQoZWNobyAke3Rvb2xjaGFpbn0gfCBhd2sgJ0JFR0lOe0ZTPSItIn17cHJpbnQgJDJ9JykKKyAgICB0Z3RfY2M9JChlY2hvICR7dG9vbGNoYWlufSB8IGF3ayAnQkVHSU57RlM9Ii0ifXtwcmludCAkM30nKQorCisgICAgIyBNYXJrIHRoZSBzcGVjaWZpYyBJU0EgcmVxdWVzdGVkIGFzIGVuYWJsZWQKKyAgICBzb2Z0X2VuYWJsZSAke3RndF9pc2F9CisgICAgZW5hYmxlICR7dGd0X29zfQorICAgIGVuYWJsZSAke3RndF9jY30KKworICAgICMgRW5hYmxlIHRoZSBhcmNoaXRlY3R1cmUgZmFtaWx5CisgICAgY2FzZSAke3RndF9pc2F9IGluCisgICAgICAgIGFybSopIGVuYWJsZSBhcm07OworICAgICAgICBtaXBzKikgZW5hYmxlIG1pcHM7OworICAgIGVzYWMKKworICAgICMgUElDIGlzIHByb2JhYmx5IHdoYXQgd2Ugd2FudCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJzCisgICAgZW5hYmxlZCBzaGFyZWQgJiYgc29mdF9lbmFibGUgcGljCisKKyAgICAjIEhhbmRsZSBkYXJ3aW4gdmFyaWFudHMuIE5ld2VyIFNES3MgYWxsb3cgdGFyZ2V0aW5nIG9sZGVyCisgICAgIyBwbGF0Zm9ybXMsIHNvIGZpbmQgdGhlIG5ld2VzdCBTREsgYXZhaWxhYmxlLgorICAgIGNhc2UgJHt0b29sY2hhaW59IGluCisgICAgICAgICotZGFyd2luKikKKyAgICAgICAgICAgIGlmIFsgLXogIiR7REVWRUxPUEVSX0RJUn0iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBERVZFTE9QRVJfRElSPWB4Y29kZS1zZWxlY3QgLXByaW50LXBhdGggMj4gL2Rldi9udWxsYAorICAgICAgICAgICAgICAgIFsgJD8gLW5lIDAgXSAmJiBPU1hfU0tJUF9ESVJfQ0hFQ0s9MQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIFsgLXogIiR7T1NYX1NLSVBfRElSX0NIRUNLfSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIE9TWF9TREtfUk9PVFM9IiR7REVWRUxPUEVSX0RJUn0vU0RLcyIKKyAgICAgICAgICAgICAgICBPU1hfU0RLX1ZFUlNJT05TPSJNYWNPU1gxMC40dS5zZGsgTWFjT1NYMTAuNS5zZGsgTWFjT1NYMTAuNi5zZGsiCisgICAgICAgICAgICAgICAgT1NYX1NES19WRVJTSU9OUz0iJHtPU1hfU0RLX1ZFUlNJT05TfSBNYWNPU1gxMC43LnNkayIKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiAke09TWF9TREtfVkVSU0lPTlN9OyBkbworICAgICAgICAgICAgICAgICAgICBpZiBbIC1kICIke09TWF9TREtfUk9PVFN9LyR7dn0iIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIG9zeF9zZGtfZGlyPSIke09TWF9TREtfUk9PVFN9LyR7dn0iCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgWyAtZCAiJHtvc3hfc2RrX2Rpcn0iIF07IHRoZW4KKyAgICAgICAgYWRkX2NmbGFncyAgIi1pc3lzcm9vdCAke29zeF9zZGtfZGlyfSIKKyAgICAgICAgYWRkX2xkZmxhZ3MgIi1pc3lzcm9vdCAke29zeF9zZGtfZGlyfSIKKyAgICBmaQorCisgICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KKyAgICAgICAgKi1kYXJ3aW44LSopCisgICAgICAgICAgICBhZGRfY2ZsYWdzICAiLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNCIKKyAgICAgICAgICAgIGFkZF9sZGZsYWdzICItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC40IgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi1kYXJ3aW45LSopCisgICAgICAgICAgICBhZGRfY2ZsYWdzICAiLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNSIKKyAgICAgICAgICAgIGFkZF9sZGZsYWdzICItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC41IgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi1kYXJ3aW4xMC0qKQorICAgICAgICAgICAgYWRkX2NmbGFncyAgIi1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjYiCisgICAgICAgICAgICBhZGRfbGRmbGFncyAiLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotZGFyd2luMTEtKikKKyAgICAgICAgICAgIGFkZF9jZmxhZ3MgICItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC43IgorICAgICAgICAgICAgYWRkX2xkZmxhZ3MgIi1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjciCisgICAgICAgICAgICA7OworICAgICAgICAqLWRhcndpbjEyLSopCisgICAgICAgICAgICBhZGRfY2ZsYWdzICAiLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuOCIKKyAgICAgICAgICAgIGFkZF9sZGZsYWdzICItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC44IgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEhhbmRsZSBTb2xhcmlzIHZhcmlhbnRzLiBTb2xhcmlzIDEwIG5lZWRzIC1scG9zaXg0CisgICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KKyAgICAgICAgc3BhcmMtc29sYXJpcy0qKQorICAgICAgICAgICAgYWRkX2V4dHJhbGlicyAtbHBvc2l4NAorICAgICAgICAgICAgZGlzYWJsZSBmYXN0X3VuYWxpZ25lZAorICAgICAgICAgICAgOzsKKyAgICAgICAgKi1zb2xhcmlzLSopCisgICAgICAgICAgICBhZGRfZXh0cmFsaWJzIC1scG9zaXg0CisgICAgICAgICAgICA7OworICAgIGVzYWMKKworICAgICMgUHJvY2VzcyBBUk0gYXJjaGl0ZWN0dXJlIHZhcmlhbnRzCisgICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KKyAgICBhcm0qKQorICAgICAgICAjIG9uIGFybSwgaXNhIHZlcnNpb25zIGFyZSBzdXBlcnNldHMKKyAgICAgICAgY2FzZSAke3RndF9pc2F9IGluCisgICAgICAgIGFybXY3KQorICAgICAgICAgICAgc29mdF9lbmFibGUgbmVvbgorICAgICAgICAgICAgc29mdF9lbmFibGUgbWVkaWEKKyAgICAgICAgICAgIHNvZnRfZW5hYmxlIGVkc3AKKyAgICAgICAgICAgIHNvZnRfZW5hYmxlIGZhc3RfdW5hbGlnbmVkCisgICAgICAgICAgICA7OworICAgICAgICBhcm12NikKKyAgICAgICAgICAgIHNvZnRfZW5hYmxlIG1lZGlhCisgICAgICAgICAgICBzb2Z0X2VuYWJsZSBlZHNwCisgICAgICAgICAgICBzb2Z0X2VuYWJsZSBmYXN0X3VuYWxpZ25lZAorICAgICAgICAgICAgOzsKKyAgICAgICAgYXJtdjV0ZSkKKyAgICAgICAgICAgIHNvZnRfZW5hYmxlIGVkc3AKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBhc21fY29udmVyc2lvbl9jbWQ9ImNhdCIKKworICAgICAgICBjYXNlICR7dGd0X2NjfSBpbgorICAgICAgICBnY2MpCisgICAgICAgICAgICBDUk9TUz0ke0NST1NTOi1hcm0tbm9uZS1saW51eC1nbnVlYWJpLX0KKyAgICAgICAgICAgIGxpbmtfd2l0aF9jYz1nY2MKKyAgICAgICAgICAgIHNldHVwX2dudV90b29sY2hhaW4KKyAgICAgICAgICAgIGFyY2hfaW50PSR7dGd0X2lzYSMjYXJtdn0KKyAgICAgICAgICAgIGFyY2hfaW50PSR7YXJjaF9pbnQlJXRlfQorICAgICAgICAgICAgY2hlY2tfYWRkX2FzZmxhZ3MgLS1kZWZzeW0gQVJDSElURUNUVVJFPSR7YXJjaF9pbnR9CisgICAgICAgICAgICB0dW5lX2NmbGFncz0iLW10dW5lPSIKKyAgICAgICAgICAgIGlmIFsgJHt0Z3RfaXNhfSA9PSAiYXJtdjciIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjaGVja19hZGRfY2ZsYWdzICAtbWFyY2g9YXJtdjctYSAtbWZsb2F0LWFiaT1zb2Z0ZnAKKyAgICAgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtbWFyY2g9YXJtdjctYSAtbWZsb2F0LWFiaT1zb2Z0ZnAKKworICAgICAgICAgICAgICAgIGlmIGVuYWJsZWQgbmVvbgorICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtbWZwdT1uZW9uICMtZnRyZWUtdmVjdG9yaXplCisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2FkZF9hc2ZsYWdzIC1tZnB1PW5lb24KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgaWYgWyAteiAiJHt0dW5lX2NwdX0iIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgdHVuZV9jcHU9Y29ydGV4LWE4CisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1tYXJjaD0ke3RndF9pc2F9CisgICAgICAgICAgICAgICAgY2hlY2tfYWRkX2FzZmxhZ3MgLW1hcmNoPSR7dGd0X2lzYX0KKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGVuYWJsZWQgZGVidWcgJiYgYWRkX2FzZmxhZ3MgLWcKKyAgICAgICAgICAgIGFzbV9jb252ZXJzaW9uX2NtZD0iJHtzb3VyY2VfcGF0aH0vYnVpbGQvbWFrZS9hZHMyZ2FzLnBsIgorICAgICAgICAgICAgOzsKKyAgICAgICAgcnZjdCkKKyAgICAgICAgICAgIENDPWFybWNjCisgICAgICAgICAgICBBUj1hcm1hcgorICAgICAgICAgICAgQVM9YXJtYXNtCisgICAgICAgICAgICBMRD0ke3NvdXJjZV9wYXRofS9idWlsZC9tYWtlL2FybWxpbmtfYWRhcHRlci5zaAorICAgICAgICAgICAgU1RSSVA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1zdHJpcAorICAgICAgICAgICAgTk09YXJtLW5vbmUtbGludXgtZ251ZWFiaS1ubQorICAgICAgICAgICAgdHVuZV9jZmxhZ3M9Ii0tY3B1PSIKKyAgICAgICAgICAgIHR1bmVfYXNmbGFncz0iLS1jcHU9IgorICAgICAgICAgICAgaWYgWyAteiAiJHt0dW5lX2NwdX0iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBpZiBbICR7dGd0X2lzYX0gPT0gImFybXY3IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIGVuYWJsZWQgbmVvbgorICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC0tZnB1PXNvZnR2ZnArdmZwdjMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2FkZF9hc2ZsYWdzIC0tZnB1PXNvZnR2ZnArdmZwdjMKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtLWNwdT1Db3J0ZXgtQTgKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYWRkX2FzZmxhZ3MgLS1jcHU9Q29ydGV4LUE4CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC0tY3B1PSR7dGd0X2lzYSMjYXJtdn0KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYWRkX2FzZmxhZ3MgLS1jcHU9JHt0Z3RfaXNhIyNhcm12fQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgYXJjaF9pbnQ9JHt0Z3RfaXNhIyNhcm12fQorICAgICAgICAgICAgYXJjaF9pbnQ9JHthcmNoX2ludCUldGV9CisgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtLXBkICJcIkFSQ0hJVEVDVFVSRSBTRVRBICR7YXJjaF9pbnR9XCIiCisgICAgICAgICAgICBlbmFibGVkIGRlYnVnICYmIGFkZF9hc2ZsYWdzIC1nCisgICAgICAgICAgICBhZGRfY2ZsYWdzIC0tZ251CisgICAgICAgICAgICBhZGRfY2ZsYWdzIC0tZW51bV9pc19pbnQKKyAgICAgICAgICAgIGFkZF9jZmxhZ3MgLS13Y2hhcjMyCisgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICR7dGd0X29zfSBpbgorICAgICAgICBub25lKikKKyAgICAgICAgICAgIGRpc2FibGUgbXVsdGl0aHJlYWQKKyAgICAgICAgICAgIGRpc2FibGUgb3Nfc3VwcG9ydAorICAgICAgICAgICAgOzsKKworICAgICAgICBhbmRyb2lkKikKKyAgICAgICAgICAgIFNES19QQVRIPSR7c2RrX3BhdGh9CisgICAgICAgICAgICBDT01QSUxFUl9MT0NBVElPTj1gZmluZCAiJHtTREtfUEFUSH0iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbmFtZSAiYXJtLWxpbnV4LWFuZHJvaWRlYWJpLWdjYyoiIC1wcmludCAtcXVpdGAKKyAgICAgICAgICAgIFRPT0xDSEFJTl9QQVRIPSR7Q09NUElMRVJfTE9DQVRJT04lLyp9L2FybS1saW51eC1hbmRyb2lkZWFiaS0KKyAgICAgICAgICAgIENDPSR7VE9PTENIQUlOX1BBVEh9Z2NjCisgICAgICAgICAgICBDWFg9JHtUT09MQ0hBSU5fUEFUSH1nKysKKyAgICAgICAgICAgIEFSPSR7VE9PTENIQUlOX1BBVEh9YXIKKyAgICAgICAgICAgIExEPSR7VE9PTENIQUlOX1BBVEh9Z2NjCisgICAgICAgICAgICBBUz0ke1RPT0xDSEFJTl9QQVRIfWFzCisgICAgICAgICAgICBTVFJJUD0ke1RPT0xDSEFJTl9QQVRIfXN0cmlwCisgICAgICAgICAgICBOTT0ke1RPT0xDSEFJTl9QQVRIfW5tCisKKyAgICAgICAgICAgIGlmIFsgLXogIiR7YWx0X2xpYmN9IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgYWx0X2xpYmM9YGZpbmQgIiR7U0RLX1BBVEh9IiAtbmFtZSBhcmNoLWFybSAtcHJpbnQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF3ayAne24gPSBzcGxpdCgkMCxhLCIvIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXQoYVtuLTFdLGIsIi0iKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAkMCAiICIgYlsyXX0nIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0IC1nIC1rIDIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF3ayAneyBwcmludCAkMSB9JyB8IHRhaWwgLTFgCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBhZGRfY2ZsYWdzICItLXN5c3Jvb3Q9JHthbHRfbGliY30iCisgICAgICAgICAgICBhZGRfbGRmbGFncyAiLS1zeXNyb290PSR7YWx0X2xpYmN9IgorCisgICAgICAgICAgICAjIGxpbmtlciBmbGFnIHRoYXQgcm91dGVzIGFyb3VuZCBhIENQVSBidWcgaW4gc29tZQorICAgICAgICAgICAgIyBDb3J0ZXgtQTggaW1wbGVtZW50YXRpb25zIChOREsgRGV2IEd1aWRlKQorICAgICAgICAgICAgYWRkX2xkZmxhZ3MgIi1XbCwtLWZpeC1jb3J0ZXgtYTgiCisKKyAgICAgICAgICAgIGVuYWJsZSBwaWMKKyAgICAgICAgICAgIHNvZnRfZW5hYmxlIHJlYWx0aW1lX29ubHkKKyAgICAgICAgICAgIGlmIFsgJHt0Z3RfaXNhfSA9PSAiYXJtdjciIF07IHRoZW4KKyAgICAgICAgICAgICAgICBzb2Z0X2VuYWJsZSBydW50aW1lX2NwdV9kZXRlY3QKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBlbmFibGVkIHJ1bnRpbWVfY3B1X2RldGVjdDsgdGhlbgorICAgICAgICAgICAgICAgIGFkZF9jZmxhZ3MgIi1JJHtTREtfUEFUSH0vc291cmNlcy9hbmRyb2lkL2NwdWZlYXR1cmVzIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICA7OworCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgICBpZiBbIC16ICIke3Nka19wYXRofSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIFNES19QQVRIPWB4Y29kZS1zZWxlY3QgLXByaW50LXBhdGggMj4gL2Rldi9udWxsYAorICAgICAgICAgICAgICAgIFNES19QQVRIPSR7U0RLX1BBVEh9L1BsYXRmb3Jtcy9pUGhvbmVPUy5wbGF0Zm9ybS9EZXZlbG9wZXIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTREtfUEFUSD0ke3Nka19wYXRofQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIFRPT0xDSEFJTl9QQVRIPSR7U0RLX1BBVEh9L3Vzci9iaW4KKyAgICAgICAgICAgIENYWD0ke1RPT0xDSEFJTl9QQVRIfS9nKysKKyAgICAgICAgICAgIENDPSR7VE9PTENIQUlOX1BBVEh9L2djYworICAgICAgICAgICAgQVI9JHtUT09MQ0hBSU5fUEFUSH0vYXIKKyAgICAgICAgICAgIExEPSR7VE9PTENIQUlOX1BBVEh9L2FybS1hcHBsZS1kYXJ3aW4xMC1sbHZtLWdjYy00LjIKKyAgICAgICAgICAgIEFTPSR7VE9PTENIQUlOX1BBVEh9L2FzCisgICAgICAgICAgICBTVFJJUD0ke1RPT0xDSEFJTl9QQVRIfS9zdHJpcAorICAgICAgICAgICAgTk09JHtUT09MQ0hBSU5fUEFUSH0vbm0KKyAgICAgICAgICAgIEFTX1NGWD0ucworCisgICAgICAgICAgICAjIEFTRkxBR1MgaXMgd3JpdHRlbiBoZXJlIGluc3RlYWQgb2YgdXNpbmcgY2hlY2tfYWRkX2FzZmxhZ3MKKyAgICAgICAgICAgICMgYmVjYXVzZSB3ZSBuZWVkIHRvIG92ZXJ3cml0ZSBhbGwgb2YgQVNGTEFHUyBhbmQgcHVyZ2UgdGhlCisgICAgICAgICAgICAjIG9wdGlvbnMgdGhhdCB3ZXJlIHB1dCBpbiBhYm92ZQorICAgICAgICAgICAgQVNGTEFHUz0iLXZlcnNpb24gLWFyY2ggJHt0Z3RfaXNhfSAtZyIKKworICAgICAgICAgICAgYWRkX2NmbGFncyAtYXJjaCAke3RndF9pc2F9CisgICAgICAgICAgICBhZGRfbGRmbGFncyAtYXJjaF9vbmx5ICR7dGd0X2lzYX0KKworICAgICAgICAgICAgaWYgWyAteiAiJHthbHRfbGliY30iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBhbHRfbGliYz0ke1NES19QQVRIfS9TREtzL2lQaG9uZU9TNS4xLnNkaworICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgYWRkX2NmbGFncyAgIi1pc3lzcm9vdCAke2FsdF9saWJjfSIKKworICAgICAgICAgICAgIyBBZGQgdGhlIHBhdGhzIGZvciB0aGUgYWx0ZXJuYXRlIGxpYmMKKyAgICAgICAgICAgIGZvciBkIGluIHVzci9pbmNsdWRlOyBkbworICAgICAgICAgICAgICAgIHRyeV9kaXI9IiR7YWx0X2xpYmN9LyR7ZH0iCisgICAgICAgICAgICAgICAgWyAtZCAiJHt0cnlfZGlyfSIgXSAmJiBhZGRfY2ZsYWdzIC1JIiR7dHJ5X2Rpcn0iCisgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgIGZvciBkIGluIGxpYiB1c3IvbGliIHVzci9saWIvc3lzdGVtOyBkbworICAgICAgICAgICAgICAgIHRyeV9kaXI9IiR7YWx0X2xpYmN9LyR7ZH0iCisgICAgICAgICAgICAgICAgWyAtZCAiJHt0cnlfZGlyfSIgXSAmJiBhZGRfbGRmbGFncyAtTCIke3RyeV9kaXJ9IgorICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICBhc21fY29udmVyc2lvbl9jbWQ9IiR7c291cmNlX3BhdGh9L2J1aWxkL21ha2UvYWRzMmdhc19hcHBsZS5wbCIKKyAgICAgICAgIDs7CisKKyAgICAgICAgbGludXgqKQorICAgICAgICAgICAgZW5hYmxlIGxpbnV4CisgICAgICAgICAgICBpZiBlbmFibGVkIHJ2Y3Q7IHRoZW4KKyAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgQ29kZVNvdXJjZXJ5IEdDQyBpbiBQQVRILiBOZWVkZWQgZm9yCisgICAgICAgICAgICAgICAgIyBsaWJyYXJpZXMKKyAgICAgICAgICAgICAgICBoYXNoIGFybS1ub25lLWxpbnV4LWdudWVhYmktZ2NjIDI+Ji0gfHwgXAorICAgICAgICAgICAgICAgICAgZGllICJDb3VsZG4ndCBmaW5kIENvZGVTb3VyY2VyeSBHQ0MgZnJvbSBQQVRIIgorCisgICAgICAgICAgICAgICAgIyBVc2UgYXJtY2MgYXMgYSBsaW5rZXIgdG8gZW5hYmxlIHRyYW5zbGF0aW9uIG9mCisgICAgICAgICAgICAgICAgIyBzb21lIGdjYyBzcGVjaWZpYyBvcHRpb25zIHN1Y2ggYXMgLWxtIGFuZCAtbHB0aHJlYWQuCisgICAgICAgICAgICAgICAgTEQ9ImFybWNjIC0tdHJhbnNsYXRlX2djYyIKKworICAgICAgICAgICAgICAgICMgY3JlYXRlIGNvbmZpZ3VyYXRpb24gZmlsZSAodXNlcyBwYXRoIHRvIENvZGVTb3VyY2VyeSBHQ0MpCisgICAgICAgICAgICAgICAgYXJtY2MgLS1hcm1fbGludXhfY29uZmlndXJlIC0tYXJtX2xpbnV4X2NvbmZpZ19maWxlPWFybV9saW51eC5jZmcKKworICAgICAgICAgICAgICAgIGFkZF9jZmxhZ3MgLS1hcm1fbGludXhfcGF0aHMgLS1hcm1fbGludXhfY29uZmlnX2ZpbGU9YXJtX2xpbnV4LmNmZworICAgICAgICAgICAgICAgIGFkZF9hc2ZsYWdzIC0tbm9faGlkZV9hbGwgLS1hcGNzPS9pbnRlcndvcmsKKyAgICAgICAgICAgICAgICBhZGRfbGRmbGFncyAtLWFybV9saW51eF9wYXRocyAtLWFybV9saW51eF9jb25maWdfZmlsZT1hcm1fbGludXguY2ZnCisgICAgICAgICAgICAgICAgZW5hYmxlZCBwaWMgJiYgYWRkX2NmbGFncyAtLWFwY3M9L2ZwaWMKKyAgICAgICAgICAgICAgICBlbmFibGVkIHBpYyAmJiBhZGRfYXNmbGFncyAtLWFwY3M9L2ZwaWMKKyAgICAgICAgICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiBhZGRfY2ZsYWdzIC0tc2hhcmVkCisgICAgICAgICAgICBmaQorICAgICAgICA7OworCisgICAgICAgIGVzYWMKKyAgICA7OworICAgIG1pcHMqKQorICAgICAgICBsaW5rX3dpdGhfY2M9Z2NjCisgICAgICAgIHNldHVwX2dudV90b29sY2hhaW4KKyAgICAgICAgdHVuZV9jZmxhZ3M9Ii1tdHVuZT0iCisgICAgICAgIGlmIGVuYWJsZWQgZHNwcjI7IHRoZW4KKyAgICAgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLW1pcHMzMnIyIC1tZHNwcjIKKyAgICAgICAgICAgIGRpc2FibGUgZmFzdF91bmFsaWduZWQKKyAgICAgICAgZmkKKyAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtbWFyY2g9JHt0Z3RfaXNhfQorICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtbWFyY2g9JHt0Z3RfaXNhfQorICAgICAgICBjaGVja19hZGRfYXNmbGFncyAtS1BJQworICAgIDs7CisgICAgcHBjKikKKyAgICAgICAgZW5hYmxlIHBwYworICAgICAgICBiaXRzPSR7dGd0X2lzYSMjcHBjfQorICAgICAgICBsaW5rX3dpdGhfY2M9Z2NjCisgICAgICAgIHNldHVwX2dudV90b29sY2hhaW4KKyAgICAgICAgYWRkX2FzZmxhZ3MgLWZvcmNlX2NwdXN1YnR5cGVfQUxMIC1JIlwkKGRpciBcJDwpZGFyd2luIgorICAgICAgICBzb2Z0X2VuYWJsZSBhbHRpdmVjCisgICAgICAgIGVuYWJsZWQgYWx0aXZlYyAmJiBhZGRfY2ZsYWdzIC1tYWx0aXZlYworCisgICAgICAgIGNhc2UgIiR0Z3Rfb3MiIGluCisgICAgICAgIGxpbnV4KikKKyAgICAgICAgICAgIGFkZF9hc2ZsYWdzIC1tYWx0aXZlYyAtbXJlZ25hbWVzIC1JIlwkKGRpciBcJDwpbGludXgiCisgICAgICAgIDs7CisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgICBkYXJ3aW5fYXJjaD0iLWFyY2ggcHBjIgorICAgICAgICAgICAgZW5hYmxlZCBwcGM2NCAmJiBkYXJ3aW5fYXJjaD0iJHtkYXJ3aW5fYXJjaH02NCIKKyAgICAgICAgICAgIGFkZF9jZmxhZ3MgICR7ZGFyd2luX2FyY2h9IC1tJHtiaXRzfSAtZmFzbS1ibG9ja3MKKyAgICAgICAgICAgIGFkZF9hc2ZsYWdzICR7ZGFyd2luX2FyY2h9IC1mb3JjZV9jcHVzdWJ0eXBlX0FMTCAtSSJcJChkaXIgXCQ8KWRhcndpbiIKKyAgICAgICAgICAgIGFkZF9sZGZsYWdzICR7ZGFyd2luX2FyY2h9IC1tJHtiaXRzfQorICAgICAgICAgICAgZW5hYmxlZCBhbHRpdmVjICYmIGFkZF9jZmxhZ3MgLWZhbHRpdmVjCisgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICA7OworICAgIHg4NiopCisgICAgICAgIGJpdHM9MzIKKyAgICAgICAgZW5hYmxlZCB4ODZfNjQgJiYgYml0cz02NAorICAgICAgICBjaGVja19jcHAgPDxFT0YgJiYgYml0cz14MzIKKyNpZm5kZWYgX19JTFAzMl9fCisjZXJyb3IgIm5vdCB4MzIiCisjZW5kaWYKK0VPRgorICAgICAgICBzb2Z0X2VuYWJsZSBydW50aW1lX2NwdV9kZXRlY3QKKyAgICAgICAgc29mdF9lbmFibGUgbW14CisgICAgICAgIHNvZnRfZW5hYmxlIHNzZQorICAgICAgICBzb2Z0X2VuYWJsZSBzc2UyCisgICAgICAgIHNvZnRfZW5hYmxlIHNzZTMKKyAgICAgICAgc29mdF9lbmFibGUgc3NzZTMKKyAgICAgICAgc29mdF9lbmFibGUgc3NlNF8xCisKKyAgICAgICAgY2FzZSAgJHt0Z3Rfb3N9IGluCisgICAgICAgICAgICB3aW4qKQorICAgICAgICAgICAgICAgIGVuYWJsZWQgZ2NjICYmIGFkZF9jZmxhZ3MgLWZuby1jb21tb24KKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgc29sYXJpcyopCisgICAgICAgICAgICAgICAgQ0M9JHtDQzotJHtDUk9TU31nY2N9CisgICAgICAgICAgICAgICAgQ1hYPSR7Q1hYOi0ke0NST1NTfWcrK30KKyAgICAgICAgICAgICAgICBMRD0ke0xEOi0ke0NST1NTfWdjY30KKyAgICAgICAgICAgICAgICBDUk9TUz0ke0NST1NTOi1nfQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBvczIpCisgICAgICAgICAgICAgICAgQVM9JHtBUzotbmFzbX0KKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgQVM9IiR7YWx0X2FzOi0ke0FTOi1hdXRvfX0iCisgICAgICAgIGNhc2UgICR7dGd0X2NjfSBpbgorICAgICAgICAgICAgaWNjKikKKyAgICAgICAgICAgICAgICBDQz0ke0NDOi1pY2N9CisgICAgICAgICAgICAgICAgTEQ9JHtMRDotaWNjfQorICAgICAgICAgICAgICAgIHNldHVwX2dudV90b29sY2hhaW4KKyAgICAgICAgICAgICAgICBhZGRfY2ZsYWdzIC11c2UtbXNhc20gLXVzZS1hc20KKyAgICAgICAgICAgICAgICBhZGRfbGRmbGFncyAtaS1zdGF0aWMKKyAgICAgICAgICAgICAgICBlbmFibGVkIHg4Nl82NCAmJiBhZGRfY2ZsYWdzIC1pcG8gLW5vLXByZWMtZGl2IC1zdGF0aWMgLXhTU0UyIC1heFNTRTIKKyAgICAgICAgICAgICAgICBlbmFibGVkIHg4Nl82NCAmJiBBUj14aWFyCisgICAgICAgICAgICAgICAgY2FzZSAke3R1bmVfY3B1fSBpbgorICAgICAgICAgICAgICAgICAgICBhdG9tKikKKyAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVfY2ZsYWdzPSIteCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVfY3B1PSJTU0UzX0FUT00iCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICB0dW5lX2NmbGFncz0iLW1hcmNoPSIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICA7OworICAgICAgICAgICAgZ2NjKikKKyAgICAgICAgICAgICAgICBhZGRfY2ZsYWdzIC1tJHtiaXRzfQorICAgICAgICAgICAgICAgIGFkZF9sZGZsYWdzIC1tJHtiaXRzfQorICAgICAgICAgICAgICAgIGxpbmtfd2l0aF9jYz1nY2MKKyAgICAgICAgICAgICAgICB0dW5lX2NmbGFncz0iLW1hcmNoPSIKKyAgICAgICAgICAgIHNldHVwX2dudV90b29sY2hhaW4KKyAgICAgICAgICAgICAgICAjZm9yIDMyIGJpdCB4ODYgYnVpbGRzLCAtTzMgZGlkIG5vdCB0dXJuIG9uIHRoaXMgZmxhZworICAgICAgICAgICAgICAgIGVuYWJsZWQgb3B0aW1pemF0aW9ucyAmJiBjaGVja19hZGRfY2ZsYWdzIC1mb21pdC1mcmFtZS1wb2ludGVyCisgICAgICAgICAgICA7OworICAgICAgICAgICAgdnMqKQorICAgICAgICAgICAgICAgICMgV2hlbiBidWlsZGluZyB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHRoZSBhc3NlbWJsZXIgaXMKKyAgICAgICAgICAgICAgICAjIGludm9rZWQgZGlyZWN0bHkuIENoZWNraW5nIGF0IGNvbmZpZ3VyZSB0aW1lIGlzIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgICMgU2tpcCB0aGUgY2hlY2sgYnkgc2V0dGluZyBBUyBhcmJpdHJhcmlseQorICAgICAgICAgICAgICAgIEFTPW1zdnMKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICIke0FTfSIgaW4KKyAgICAgICAgICAgIGF1dG98IiIpCisgICAgICAgICAgICAgICAgd2hpY2ggbmFzbSA+L2Rldi9udWxsIDI+JjEgJiYgQVM9bmFzbQorICAgICAgICAgICAgICAgIHdoaWNoIHlhc20gPi9kZXYvbnVsbCAyPiYxICYmIEFTPXlhc20KKyAgICAgICAgICAgICAgICBbICIke0FTfSIgPSBhdXRvIC1vIC16ICIke0FTfSIgXSBcCisgICAgICAgICAgICAgICAgICAgICYmIGRpZSAiTmVpdGhlciB5YXNtIG5vciBuYXNtIGhhdmUgYmVlbiBmb3VuZCIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgbG9nX2VjaG8gIiAgdXNpbmcgJEFTIgorICAgICAgICBbICIke0FTIyMqL30iID0gbmFzbSBdICYmIGFkZF9hc2ZsYWdzIC1PeAorICAgICAgICBBU19TRlg9LmFzbQorICAgICAgICBjYXNlICAke3RndF9vc30gaW4KKyAgICAgICAgICAgIHdpbjMyKQorICAgICAgICAgICAgICAgIGFkZF9hc2ZsYWdzIC1mIHdpbjMyCisgICAgICAgICAgICAgICAgZW5hYmxlZCBkZWJ1ZyAmJiBhZGRfYXNmbGFncyAtZyBjdjgKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICB3aW42NCkKKyAgICAgICAgICAgICAgICBhZGRfYXNmbGFncyAtZiB4NjQKKyAgICAgICAgICAgICAgICBlbmFibGVkIGRlYnVnICYmIGFkZF9hc2ZsYWdzIC1nIGN2OAorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGxpbnV4Knxzb2xhcmlzKikKKyAgICAgICAgICAgICAgICBhZGRfYXNmbGFncyAtZiBlbGYke2JpdHN9CisgICAgICAgICAgICAgICAgZW5hYmxlZCBkZWJ1ZyAmJiBbICIke0FTfSIgPSB5YXNtIF0gJiYgYWRkX2FzZmxhZ3MgLWcgZHdhcmYyCisgICAgICAgICAgICAgICAgZW5hYmxlZCBkZWJ1ZyAmJiBbICIke0FTfSIgPSBuYXNtIF0gJiYgYWRkX2FzZmxhZ3MgLWcKKyAgICAgICAgICAgICAgICBbICIke0FTIyMqL30iID0gbmFzbSBdICYmIGNoZWNrX2FzbV9hbGlnbgorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGRhcndpbiopCisgICAgICAgICAgICAgICAgYWRkX2FzZmxhZ3MgLWYgbWFjaG8ke2JpdHN9CisgICAgICAgICAgICAgICAgZW5hYmxlZCB4ODYgJiYgZGFyd2luX2FyY2g9Ii1hcmNoIGkzODYiIHx8IGRhcndpbl9hcmNoPSItYXJjaCB4ODZfNjQiCisgICAgICAgICAgICAgICAgYWRkX2NmbGFncyAgJHtkYXJ3aW5fYXJjaH0KKyAgICAgICAgICAgICAgICBhZGRfbGRmbGFncyAke2Rhcndpbl9hcmNofQorICAgICAgICAgICAgICAgICMgLW1keW5hbWljLW5vLXBpYyBpcyBzdGlsbCBhIGJpdCBvZiB2b29kb28gLS0gaXQgd2FzIHJlcXVpcmVkIGF0CisgICAgICAgICAgICAgICAgIyBvbmUgdGltZSwgYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgbm93LCBhbmQgaXQgYnJlYWtzIHNvbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgIyBjb2RlIHRoYXQgc3RpbGwgcmVsaWVzIG9uIGlubGluZSBhc3NlbWJseS4KKyAgICAgICAgICAgICAgICAjIGVuYWJsZWQgaWNjICYmICEgZW5hYmxlZCBwaWMgJiYgYWRkX2NmbGFncyAtZm5vLXBpYyAtbWR5bmFtaWMtbm8tcGljCisgICAgICAgICAgICAgICAgZW5hYmxlZCBpY2MgJiYgISBlbmFibGVkIHBpYyAmJiBhZGRfY2ZsYWdzIC1mbm8tcGljCisgICAgICAgICAgICA7OworICAgICAgICAgICAgb3MyKQorICAgICAgICAgICAgICAgIGFkZF9hc2ZsYWdzIC1mIGFvdXQKKyAgICAgICAgICAgICAgICBlbmFibGVkIGRlYnVnICYmIGFkZF9hc2ZsYWdzIC1nCisgICAgICAgICAgICAgICAgRVhFX1NGWD0uZXhlCisgICAgICAgICAgICA7OworICAgICAgICAgICAgKikgbG9nICJXYXJuaW5nOiBVbmtub3duIG9zICR0Z3Rfb3Mgd2hpbGUgc2V0dGluZyB1cCAkQVMgZmxhZ3MiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgOzsKKyAgICB1bml2ZXJzYWwqfCotZ2NjfGdlbmVyaWMtZ251KQorICAgICAgICBsaW5rX3dpdGhfY2M9Z2NjCisgICAgICAgIGVuYWJsZSBnY2MKKyAgICBzZXR1cF9nbnVfdG9vbGNoYWluCisgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRyeSB0byBlbmFibGUgQ1BVIHNwZWNpZmljIHR1bmluZworICAgIGlmIFsgLW4gIiR7dHVuZV9jcHV9IiBdOyB0aGVuCisgICAgICAgIGlmIFsgLW4gIiR7dHVuZV9jZmxhZ3N9IiBdOyB0aGVuCisgICAgICAgICAgICBjaGVja19hZGRfY2ZsYWdzICR7dHVuZV9jZmxhZ3N9JHt0dW5lX2NwdX0gfHwgXAorICAgICAgICAgICAgICAgIGRpZSAiUmVxdWVzdGVkIENQVSAnJHt0dW5lX2NwdX0nIG5vdCBzdXBwb3J0ZWQgYnkgY29tcGlsZXIiCisgICAgICAgIGZpCisgICAgaWYgWyAtbiAiJHt0dW5lX2FzZmxhZ3N9IiBdOyB0aGVuCisgICAgICAgICAgICBjaGVja19hZGRfYXNmbGFncyAke3R1bmVfYXNmbGFnc30ke3R1bmVfY3B1fSB8fCBcCisgICAgICAgICAgICAgICAgZGllICJSZXF1ZXN0ZWQgQ1BVICcke3R1bmVfY3B1fScgbm90IHN1cHBvcnRlZCBieSBhc3NlbWJsZXIiCisgICAgICAgIGZpCisgICAgaWYgWyAteiAiJHt0dW5lX2NmbGFnc30ke3R1bmVfYXNmbGFnc30iIF07IHRoZW4KKyAgICAgICAgICAgIGxvZ19lY2hvICJXYXJuaW5nOiBDUFUgdHVuaW5nIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0b29sY2hhaW4iCisgICAgICAgIGZpCisgICAgZmkKKworICAgIGVuYWJsZWQgZGVidWcgJiYgY2hlY2tfYWRkX2NmbGFncyAtZyAmJiBjaGVja19hZGRfbGRmbGFncyAtZworICAgIGVuYWJsZWQgZ3Byb2YgJiYgY2hlY2tfYWRkX2NmbGFncyAtcGcgJiYgY2hlY2tfYWRkX2xkZmxhZ3MgLXBnCisgICAgZW5hYmxlZCBnY292ICYmCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlICYmCisgICAgICAgIGNoZWNrX2FkZF9sZGZsYWdzIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZQorCisgICAgaWYgZW5hYmxlZCBvcHRpbWl6YXRpb25zOyB0aGVuCisgICAgICAgIGlmIGVuYWJsZWQgcnZjdDsgdGhlbgorICAgICAgICAgICAgZW5hYmxlZCBzbWFsbCAmJiBjaGVja19hZGRfY2ZsYWdzIC1Pc3BhY2UgfHwgY2hlY2tfYWRkX2NmbGFncyAtT3RpbWUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW5hYmxlZCBzbWFsbCAmJiBjaGVja19hZGRfY2ZsYWdzIC1PMiB8fCAgY2hlY2tfYWRkX2NmbGFncyAtTzMKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgIyBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQsIGZvciBidWlsZGluZyByZWxvY2F0YWJsZQorICAgICMgc2hhcmVkIG9iamVjdHMKKyAgICBlbmFibGVkIGdjYyAmJiBlbmFibGVkIHBpYyAmJiBjaGVja19hZGRfY2ZsYWdzIC1mUElDCisKKyAgICAjIFdvcmsgYXJvdW5kIGxvbmdqbXAgaW50ZXJjZXB0aW9uIG9uIGdsaWJjID49IDIuMTEsIHRvIGltcHJvdmUgYmluYXJ5CisgICAgIyBjb21wYXRpYmlsaXR5LiBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYm0vaXNzdWVzL2RldGFpbD9pZD0xNjYKKyAgICBlbmFibGVkIGxpbnV4ICYmIGNoZWNrX2FkZF9jZmxhZ3MgLVVfRk9SVElGWV9TT1VSQ0UgLURfRk9SVElGWV9TT1VSQ0U9MAorCisgICAgIyBDaGVjayBmb3Igc3RyaXAgdXRpbGl0eSB2YXJpYW50CisgICAgJHtTVFJJUH0gLVYgMj4vZGV2L251bGwgfCBncmVwIEdOVSA+L2Rldi9udWxsICYmIGVuYWJsZSBnbnVfc3RyaXAKKworICAgICMgVHJ5IHRvIGRldGVybWluZSB0YXJnZXQgZW5kaWFubmVzcworICAgIGNoZWNrX2NjIDw8RU9GCisgICAgdW5zaWduZWQgaW50IGUgPSAnTyc8PDI0IHwgJzInPDwxNiB8ICdCJzw8OCB8ICdFJzsKK0VPRgorICAgIFsgLWYgIiR7VE1QX099IiBdICYmIG9kIC1BIG4gLXQgeDEgIiR7VE1QX099IiB8IHRyIC1kICdcbicgfAorICAgICAgICBncmVwICc0ZiAqMzIgKjQyICo0NScgPi9kZXYvbnVsbCAyPiYxICYmIGVuYWJsZSBiaWdfZW5kaWFuCisKKyAgICAjIEFsbW9zdCBldmVyeSBwbGF0Zm9ybSB1c2VzIHB0aHJlYWRzLgorICAgIGlmIGVuYWJsZWQgbXVsdGl0aHJlYWQ7IHRoZW4KKyAgICAgICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KKyAgICAgICAgICAgICotd2luKi12cyopOzsKKyAgICAgICAgICAgICotYW5kcm9pZC1nY2MpOzsKKyAgICAgICAgICAgICopIGNoZWNrX2hlYWRlciBwdGhyZWFkLmggJiYgYWRkX2V4dHJhbGlicyAtbHB0aHJlYWQKKyAgICAgICAgZXNhYworICAgIGZpCisKKyAgICAjIG9ubHkgZm9yIE1JUFMgcGxhdGZvcm1zCisgICAgY2FzZSAke3Rvb2xjaGFpbn0gaW4KKyAgICAgICAgbWlwcyopCisgICAgICAgICAgICBpZiBlbmFibGVkIGRzcHIyOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgZW5hYmxlZCBiaWdfZW5kaWFuOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImRzcHIyIG9wdGltaXphdGlvbnMgYXJlIGF2YWlsYWJsZSBvbmx5IGZvciBsaXR0bGUgZW5kaWFuIHBsYXRmb3JtcyIKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBkc3ByMgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICA7OworICAgIGVzYWMKKworICAgICMgZm9yIHN5c2NvbmYoMykgYW5kIGZyaWVuZHMuCisgICAgY2hlY2tfaGVhZGVyIHVuaXN0ZC5oCisKKyAgICAjIGdsaWJjIG5lZWRzIHRoZXNlCisgICAgaWYgZW5hYmxlZCBsaW51eDsgdGhlbgorICAgICAgICBhZGRfY2ZsYWdzIC1EX0xBUkdFRklMRV9TT1VSQ0UKKyAgICAgICAgYWRkX2NmbGFncyAtRF9GSUxFX09GRlNFVF9CSVRTPTY0CisgICAgZmkKKworICAgICMgYXBwZW5kIGFueSB1c2VyIGRlZmluZWQgZXh0cmEgY2ZsYWdzCisgICAgaWYgWyAtbiAiJHtleHRyYV9jZmxhZ3N9IiBdIDsgdGhlbgorICAgICAgICBjaGVja19hZGRfY2ZsYWdzICR7ZXh0cmFfY2ZsYWdzfSB8fCBcCisgICAgICAgIGRpZSAiUmVxdWVzdGVkIGV4dHJhIENGTEFHUyAnJHtleHRyYV9jZmxhZ3N9JyBub3Qgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyIgorICAgIGZpCit9CisKK3Byb2Nlc3NfdG9vbGNoYWluKCkgeworICAgIHByb2Nlc3NfY29tbW9uX3Rvb2xjaGFpbgorfQorCitwcmludF9jb25maWdfbWsoKSB7CisgICAgbG9jYWwgcHJlZml4PSQxCisgICAgbG9jYWwgbWFrZWZpbGU9JDIKKyAgICBzaGlmdCAyCisgICAgZm9yIGNmZzsgZG8KKyAgICAgICAgdXBuYW1lPSJgdG91cHBlciAkY2ZnYCIKKyAgICAgICAgaWYgZW5hYmxlZCAkY2ZnOyB0aGVuCisgICAgICAgICAgICBlY2hvICIke3ByZWZpeH1fJHt1cG5hbWV9PXllcyIgPj4gJG1ha2VmaWxlCisgICAgICAgIGZpCisgICAgZG9uZQorfQorCitwcmludF9jb25maWdfaCgpIHsKKyAgICBsb2NhbCBwcmVmaXg9JDEKKyAgICBsb2NhbCBoZWFkZXI9JDIKKyAgICBzaGlmdCAyCisgICAgZm9yIGNmZzsgZG8KKyAgICAgICAgdXBuYW1lPSJgdG91cHBlciAkY2ZnYCIKKyAgICAgICAgaWYgZW5hYmxlZCAkY2ZnOyB0aGVuCisgICAgICAgICAgICBlY2hvICIjZGVmaW5lICR7cHJlZml4fV8ke3VwbmFtZX0gMSIgPj4gJGhlYWRlcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICIjZGVmaW5lICR7cHJlZml4fV8ke3VwbmFtZX0gMCIgPj4gJGhlYWRlcgorICAgICAgICBmaQorICAgIGRvbmUKK30KKworcHJpbnRfd2VibV9saWNlbnNlKCkgeworICAgIGxvY2FsIGRlc3RpbmF0aW9uPSQxCisgICAgbG9jYWwgcHJlZml4PSQyCisgICAgbG9jYWwgc3VmZml4PSQzCisgICAgc2hpZnQgMworICAgIGNhdCA8PEVPRiA+ICR7ZGVzdGluYXRpb259Ciske3ByZWZpeH0gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4ke3N1ZmZpeH0KKyR7cHJlZml4fSAke3N1ZmZpeH0KKyR7cHJlZml4fSBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlJHtzdWZmaXh9Ciske3ByZWZpeH0gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlJHtzdWZmaXh9Ciske3ByZWZpeH0gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCR7c3VmZml4fQorJHtwcmVmaXh9IGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkke3N1ZmZpeH0KKyR7cHJlZml4fSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4ke3N1ZmZpeH0KK0VPRgorfQorCitwcm9jZXNzX3RhcmdldHMoKSB7CisgICAgdHJ1ZTsKK30KKworcHJvY2Vzc19kZXRlY3QoKSB7CisgICAgdHJ1ZTsKK30KKworZW5hYmxlIGxvZ2dpbmcKK2xvZ2ZpbGU9ImNvbmZpZy5lcnIiCitzZWxmPSQwCitwcm9jZXNzKCkgeworICAgIGNtZGxpbmVfYXJncz0iJEAiCisgICAgcHJvY2Vzc19jbWRsaW5lICIkQCIKKyAgICBpZiBlbmFibGVkIGNoaWxkOyB0aGVuCisgICAgICAgIGVjaG8gIiMgJHtzZWxmfSAkQCIgPj4gJHtsb2dmaWxlfQorICAgIGVsc2UKKyAgICAgICAgZWNobyAiIyAke3NlbGZ9ICRAIiA+ICR7bG9nZmlsZX0KKyAgICBmaQorICAgIHBvc3RfcHJvY2Vzc19jb21tb25fY21kbGluZQorICAgIHBvc3RfcHJvY2Vzc19jbWRsaW5lCisgICAgcHJvY2Vzc190b29sY2hhaW4KKyAgICBwcm9jZXNzX2RldGVjdAorICAgIHByb2Nlc3NfdGFyZ2V0cworCisgICAgT09UX0lOU1RBTExTPSIke09PVF9JTlNUQUxMU30iCisgICAgaWYgZW5hYmxlZCBzb3VyY2VfcGF0aF91c2VkOyB0aGVuCisgICAgIyBQcmVwYXJlIHRoZSBQV0QgZm9yIGJ1aWxkaW5nLgorICAgIGZvciBmIGluICR7T09UX0lOU1RBTExTfTsgZG8KKyAgICAgICAgICAgIGluc3RhbGwgLUQgJHtzb3VyY2VfcGF0aH0vJGYgJGYKKyAgICBkb25lCisgICAgZmkKKyAgICBjcCAke3NvdXJjZV9wYXRofS9idWlsZC9tYWtlL01ha2VmaWxlIC4KKworICAgIGNsZWFuX3RlbXBfZmlsZXMKKyAgICB0cnVlCit9CmRpZmYgLS1naXQgYS9saWJ2cHgvYnVpbGQvbWFrZS9nZW5fYXNtX2RlcHMuc2ggYi9saWJ2cHgvYnVpbGQvbWFrZS9nZW5fYXNtX2RlcHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGI0ZTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9idWlsZC9tYWtlL2dlbl9hc21fZGVwcy5zaApAQCAtMCwwICsxLDY0IEBACisjIS9iaW4vYmFzaAorIyMKKyMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMKKyMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisjIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisjIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMjCisKKworc2VsZj0kMAorc2hvd19oZWxwKCkgeworICAgIGVjaG8gInVzYWdlOiAkc2VsZiBbb3B0aW9uc10gPHNyY2ZpbGU+IgorICAgIGVjaG8KKyAgICBlY2hvICJHZW5lcmF0ZSBNYWtlZmlsZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZyb20gYXNzZW1ibHkgY29kZSBzb3VyY2UiCisgICAgZWNobworICAgIGV4aXQgMQorfQorZGllX3Vua25vd24oKXsKKyAgICBlY2hvICJVbmtub3duIG9wdGlvbiBcIiQxXCIuIgorICAgIGVjaG8gIlNlZSAkMCAtLWhlbHAgZm9yIGF2YWlsYWJsZSBvcHRpb25zLiIKKyAgICBleGl0IDEKK30KK2ZvciBvcHQgZG8KKyAgICBvcHR2YWw9IiR7b3B0Iyo9fSIKKyAgICBjYXNlICIkb3B0IiBpbgorICAgIC0tYnVpbGQtcGZ4PSopIHBmeD0iJHtvcHR2YWx9IgorICAgIDs7CisgICAgLS1kZXBmaWxlPSopIG91dD0iJHtvcHR2YWx9IgorICAgIDs7CisgICAgLUkqKSByYXdfaW5jX3BhdGhzPSIke3Jhd19pbmNfcGF0aHN9ICR7b3B0fSIKKyAgICAgICAgIGluY19wYXRoPSIke2luY19wYXRofSAke29wdCMtSX0iCisgICAgOzsKKyAgICAtaHwtLWhlbHApIHNob3dfaGVscAorICAgIDs7CisgICAgKikgWyAtZiAiJG9wdCIgXSAmJiBzcmNmaWxlPSIkb3B0IgorICAgIDs7CisgICAgZXNhYworZG9uZQorCitbIC1uICIkc3JjZmlsZSIgXSB8fCBzaG93X2hlbHAKK3NmeD0ke3NmeDotYXNtfQoraW5jbHVkZXM9JChMQ19BTEw9QyBlZ3JlcCAtaSAiaW5jbHVkZSArXCI/W2EtejAtOV8vXStcLiR7c2Z4fSIgJHNyY2ZpbGUgfAorICAgICAgICAgICBwZXJsIC1wIC1lICJzOy4qPyhbYS16MC05Xy9dKy4ke3NmeH0pLio7XDE7IikKKyMiIHJlc3RvcmUgZWRpdG9yIHN0YXRlCitmb3IgaW5jIGluICR7aW5jbHVkZXN9OyBkbworICAgIGZvdW5kX2luY19wYXRoPQorICAgIGZvciBpZGlyIGluICR7aW5jX3BhdGh9OyBkbworICAgICAgICBbIC1mICIke2lkaXJ9LyR7aW5jfSIgXSAmJiBmb3VuZF9pbmNfcGF0aD0iJHtpZGlyfSIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgaWYgWyAtZiBgZGlybmFtZSAkc3JjZmlsZWAvJGluYyBdOyB0aGVuCisgICAgICAgICMgSGFuZGxlIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UKKyAgICAgICAgJHNlbGYgLS1idWlsZC1wZng9JHBmeCAtLWRlcGZpbGU9JG91dCAke3Jhd19pbmNfcGF0aHN9IGBkaXJuYW1lICRzcmNmaWxlYC8kaW5jCisgICAgZWxpZiBbIC1uICIke2ZvdW5kX2luY19wYXRofSIgXTsgdGhlbgorICAgICAgICAjIEhhbmRsZSBpbmNsdWRlIGZpbGVzIG9uIHRoZSBpbmNsdWRlIHBhdGgKKyAgICAgICAgJHNlbGYgLS1idWlsZC1wZng9JHBmeCAtLWRlcGZpbGU9JG91dCAke3Jhd19pbmNfcGF0aHN9ICIke2ZvdW5kX2luY19wYXRofS8kaW5jIgorICAgIGVsc2UKKyAgICAgICAgIyBIYW5kbGUgZ2VuZXJhdGVkIGluY2x1ZGVzIGluIHRoZSBidWlsZCByb290ICh3aGljaCBtYXkgbm90IGV4aXN0IHlldCkKKyAgICAgICAgZWNobyAke291dH0gJHtvdXQlZH1vOiAiJHtwZnh9JHtpbmN9IgorICAgIGZpCitkb25lCitlY2hvICR7b3V0fSAke291dCVkfW86ICRzcmNmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9tYWtlL2dlbl9tc3ZzX2RlZi5zaCBiL2xpYnZweC9idWlsZC9tYWtlL2dlbl9tc3ZzX2RlZi5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQvbWFrZS9nZW5fbXN2c19kZWYuc2gKcmVuYW1lIHRvIGxpYnZweC9idWlsZC9tYWtlL2dlbl9tc3ZzX2RlZi5zaApkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkL21ha2UvZ2VuX21zdnNfcHJvai5zaCBiL2xpYnZweC9idWlsZC9tYWtlL2dlbl9tc3ZzX3Byb2ouc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmQ0Mjk0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9idWlsZC9tYWtlL2dlbl9tc3ZzX3Byb2ouc2gKQEAgLTAsMCArMSw1NzMgQEAKKyMhL2Jpbi9iYXNoCisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworCitzZWxmPSQwCitzZWxmX2Jhc2VuYW1lPSR7c2VsZiMjKi99CitzZWxmX2Rpcm5hbWU9JChkaXJuYW1lICIkMCIpCitFT0w9JCdcbicKKworc2hvd19oZWxwKCkgeworICAgIGNhdCA8PEVPRgorVXNhZ2U6ICR7c2VsZl9iYXNlbmFtZX0gLS1uYW1lPXByb2puYW1lIFtvcHRpb25zXSBmaWxlMSBbZmlsZTIgLi4uXQorCitUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgYSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZSBmcm9tIGEgbGlzdCBvZiBzb3VyY2UKK2NvZGUgZmlsZXMuCisKK09wdGlvbnM6CisgICAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZQorICAgIC0tZXhlICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIHByb2plY3QgZm9yIGJ1aWxkaW5nIGFuIEFwcGxpY2F0aW9uCisgICAgLS1saWIgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgcHJvamVjdCBmb3IgY3JlYXRpbmcgYSBzdGF0aWMgbGlicmFyeQorICAgIC0tc3RhdGljLWNydCAgICAgICAgICAgICAgICBVc2UgdGhlIHN0YXRpYyBDIHJ1bnRpbWUgKC9NVCkKKyAgICAtLXRhcmdldD1pc2Etb3MtY2MgICAgICAgICAgVGFyZ2V0IHNwZWNpZmllciAocmVxdWlyZWQpCisgICAgLS1vdXQ9ZmlsZW5hbWUgICAgICAgICAgICAgIFdyaXRlIG91dHB1dCB0byBhIGZpbGUgW3N0ZG91dF0KKyAgICAtLW5hbWU9cHJvamVjdF9uYW1lICAgICAgICAgTmFtZSBvZiB0aGUgcHJvamVjdCAocmVxdWlyZWQpCisgICAgLS1wcm9qLWd1aWQ9R1VJRCAgICAgICAgICAgIEdVSUQgdG8gdXNlIGZvciB0aGUgcHJvamVjdAorICAgIC0tbW9kdWxlLWRlZj1maWxlbmFtZSAgICAgICBGaWxlIGNvbnRhaW5pbmcgZXhwb3J0IGRlZmluaXRpb25zIChmb3IgRExMcykKKyAgICAtLXZlcj12ZXJzaW9uICAgICAgICAgICAgICAgVmVyc2lvbiAoNyw4LDkpIG9mIHZpc3VhbCBzdHVkaW8gdG8gZ2VuZXJhdGUgZm9yCisgICAgLS1zcmMtcGF0aC1iYXJlPWRpciAgICAgICAgIFBhdGggdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQorICAgIC1JcGF0aC90by9pbmNsdWRlICAgICAgICAgICBBZGRpdGlvbmFsIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyAgICAtREZMQUdbPXZhbHVlXSAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yIG1hY3JvcyB0byBkZWZpbmUKKyAgICAtTHBhdGgvdG8vbGliICAgICAgICAgICAgICAgQWRkaXRpb25hbCBsaWJyYXJ5IHNlYXJjaCBwYXRocworICAgIC1sbGlibmFtZSAgICAgICAgICAgICAgICAgICBMaWJyYXJ5IHRvIGxpbmsgYWdhaW5zdAorRU9GCisgICAgZXhpdCAxCit9CisKK2RpZSgpIHsKKyAgICBlY2hvICIke3NlbGZfYmFzZW5hbWV9OiAkQCIgPiYyCisgICAgZXhpdCAxCit9CisKK2RpZV91bmtub3duKCl7CisgICAgZWNobyAiVW5rbm93biBvcHRpb24gXCIkMVwiLiIgPiYyCisgICAgZWNobyAiU2VlICR7c2VsZl9iYXNlbmFtZX0gLS1oZWxwIGZvciBhdmFpbGFibGUgb3B0aW9ucy4iID4mMgorICAgIGV4aXQgMQorfQorCitnZW5lcmF0ZV91dWlkKCkgeworICAgIGxvY2FsIGhleD0iMDEyMzQ1Njc4OUFCQ0RFRiIKKyAgICBsb2NhbCBpCisgICAgbG9jYWwgdXVpZD0iIgorICAgIGxvY2FsIGoKKyAgICAjOTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCCisgICAgZm9yICgoaT0wOyBpPDMyOyBpKyspKTsgZG8KKyAgICAgICAgKCggaiA9ICRSQU5ET00gJSAxNiApKQorICAgICAgICB1dWlkPSIke3V1aWR9JHtoZXg6JGo6MX0iCisgICAgZG9uZQorICAgIGVjaG8gIiR7dXVpZDowOjh9LSR7dXVpZDo4OjR9LSR7dXVpZDoxMjo0fS0ke3V1aWQ6MTY6NH0tJHt1dWlkOjIwOjEyfSIKK30KKworaW5kZW50MT0iICAgICIKK2luZGVudD0iIgoraW5kZW50X3B1c2goKSB7CisgICAgaW5kZW50PSIke2luZGVudH0ke2luZGVudDF9IgorfQoraW5kZW50X3BvcCgpIHsKKyAgICBpbmRlbnQ9IiR7aW5kZW50JSR7aW5kZW50MX19IgorfQorCit0YWdfYXR0cmlidXRlcygpIHsKKyAgICBmb3Igb3B0IGluICIkQCI7IGRvCisgICAgICAgIG9wdHZhbD0iJHtvcHQjKj19IgorICAgICAgICBbIC1uICIke29wdHZhbH0iIF0gfHwKKyAgICAgICAgICAgIGRpZSAiTWlzc2luZyBhdHRyaWJ1dGUgdmFsdWUgaW4gJyRvcHQnIHdoaWxlIGdlbmVyYXRpbmcgJHRhZyB0YWciCisgICAgICAgIGVjaG8gIiR7aW5kZW50fSR7b3B0JSU9Kn09XCIke29wdHZhbH1cIiIKKyAgICBkb25lCit9CisKK29wZW5fdGFnKCkgeworICAgIGxvY2FsIHRhZz0kMQorICAgIHNoaWZ0CisgICAgaWYgWyAkIyAtbmUgMCBdOyB0aGVuCisgICAgICAgIGVjaG8gIiR7aW5kZW50fTwke3RhZ30iCisgICAgICAgIGluZGVudF9wdXNoCisgICAgICAgIHRhZ19hdHRyaWJ1dGVzICIkQCIKKyAgICAgICAgZWNobyAiJHtpbmRlbnR9PiIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIiR7aW5kZW50fTwke3RhZ30+IgorICAgICAgICBpbmRlbnRfcHVzaAorICAgIGZpCit9CisKK2Nsb3NlX3RhZygpIHsKKyAgICBsb2NhbCB0YWc9JDEKKyAgICBpbmRlbnRfcG9wCisgICAgZWNobyAiJHtpbmRlbnR9PC8ke3RhZ30+IgorfQorCit0YWcoKSB7CisgICAgbG9jYWwgdGFnPSQxCisgICAgc2hpZnQKKyAgICBpZiBbICQjIC1uZSAwIF07IHRoZW4KKyAgICAgICAgZWNobyAiJHtpbmRlbnR9PCR7dGFnfSIKKyAgICAgICAgaW5kZW50X3B1c2gKKyAgICAgICAgdGFnX2F0dHJpYnV0ZXMgIiRAIgorICAgICAgICBpbmRlbnRfcG9wCisgICAgICAgIGVjaG8gIiR7aW5kZW50fS8+IgorICAgIGVsc2UKKyAgICAgICAgZWNobyAiJHtpbmRlbnR9PCR7dGFnfS8+IgorICAgIGZpCit9CisKK2dlbmVyYXRlX2ZpbHRlcigpIHsKKyAgICBsb2NhbCB2YXI9JDEKKyAgICBsb2NhbCBuYW1lPSQyCisgICAgbG9jYWwgcGF0cz0kMworICAgIGxvY2FsIGZpbGVfbGlzdF9zegorICAgIGxvY2FsIGkKKyAgICBsb2NhbCBmCisgICAgbG9jYWwgc2F2ZUlGUz0iJElGUyIKKyAgICBsb2NhbCBwYWNrCisgICAgZWNobyAiZ2VuZXJhdGluZyBmaWx0ZXIgJyRuYW1lJyBmcm9tICR7I2ZpbGVfbGlzdFtAXX0gZmlsZXMiID4mMgorICAgIElGUz0qCisKKyAgICBvcGVuX3RhZyBGaWx0ZXIgXAorICAgICAgICBOYW1lPSRuYW1lIFwKKyAgICAgICAgRmlsdGVyPSRwYXRzIFwKKyAgICAgICAgVW5pcXVlSWRlbnRpZmllcj1gZ2VuZXJhdGVfdXVpZGAgXAorCisgICAgZmlsZV9saXN0X3N6PSR7I2ZpbGVfbGlzdFtAXX0KKyAgICBmb3IgaSBpbiAkeyFmaWxlX2xpc3RbQF19OyBkbworICAgICAgICBmPSR7ZmlsZV9saXN0W2ldfQorICAgICAgICBmb3IgcGF0IGluICR7cGF0cy8vOy8kSUZTfTsgZG8KKyAgICAgICAgICAgIGlmIFsgIiR7ZiMjKi59IiA9PSAiJHBhdCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHVuc2V0IGZpbGVfbGlzdFtpXQorCisgICAgICAgICAgICAgICAgb3Blbl90YWcgRmlsZSBSZWxhdGl2ZVBhdGg9Ii4vJGYiCisgICAgICAgICAgICAgICAgaWYgWyAiJHBhdCIgPT0gImFzbSIgXSAmJiAkYXNtX3VzZV9jdXN0b21fc3RlcDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgcGxhdCBpbiAiJHtwbGF0Zm9ybXNbQF19IjsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjZmcgaW4gRGVidWcgUmVsZWFzZTsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuX3RhZyBGaWxlQ29uZmlndXJhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IiR7Y2ZnfXwke3BsYXR9IiBcCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJBc3NlbWJsaW5nIFwkKElucHV0RmlsZU5hbWUpIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lPSIkKGV2YWwgZWNobyBcJGFzbV8ke2NmZ31fY21kbGluZSkiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0cz0iXCQoSW5wdXROYW1lKS5vYmoiIFwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX3RhZyBGaWxlQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgIGNsb3NlX3RhZyBGaWxlCisKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKKworICAgIGNsb3NlX3RhZyBGaWx0ZXIKKyAgICBJRlM9IiRzYXZlSUZTIgorfQorCisjIFByb2Nlc3MgY29tbWFuZCBsaW5lCit1bnNldCB0YXJnZXQKK2ZvciBvcHQgaW4gIiRAIjsgZG8KKyAgICBvcHR2YWw9IiR7b3B0Iyo9fSIKKyAgICBjYXNlICIkb3B0IiBpbgorICAgICAgICAtLWhlbHB8LWgpIHNob3dfaGVscAorICAgICAgICA7OworICAgICAgICAtLXRhcmdldD0qKSB0YXJnZXQ9IiR7b3B0dmFsfSIKKyAgICAgICAgOzsKKyAgICAgICAgLS1vdXQ9Kikgb3V0ZmlsZT0iJG9wdHZhbCIKKyAgICAgICAgOzsKKyAgICAgICAgLS1uYW1lPSopIG5hbWU9IiR7b3B0dmFsfSIKKyAgICAgICAgOzsKKyAgICAgICAgLS1wcm9qLWd1aWQ9KikgZ3VpZD0iJHtvcHR2YWx9IgorICAgICAgICA7OworICAgICAgICAtLW1vZHVsZS1kZWY9KikgbGlua19vcHRzPSIke2xpbmtfb3B0c30gTW9kdWxlRGVmaW5pdGlvbkZpbGU9JHtvcHR2YWx9IgorICAgICAgICA7OworICAgICAgICAtLWV4ZSkgcHJval9raW5kPSJleGUiCisgICAgICAgIDs7CisgICAgICAgIC0tbGliKSBwcm9qX2tpbmQ9ImxpYiIKKyAgICAgICAgOzsKKyAgICAgICAgLS1zcmMtcGF0aC1iYXJlPSopIHNyY19wYXRoX2JhcmU9IiRvcHR2YWwiCisgICAgICAgIDs7CisgICAgICAgIC0tc3RhdGljLWNydCkgdXNlX3N0YXRpY19ydW50aW1lPXRydWUKKyAgICAgICAgOzsKKyAgICAgICAgLS12ZXI9KikKKyAgICAgICAgICAgIHZzX3Zlcj0iJG9wdHZhbCIKKyAgICAgICAgICAgIGNhc2UgIiRvcHR2YWwiIGluCisgICAgICAgICAgICAgICAgWzc4OV0pCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqKSBkaWUgVW5yZWNvZ25pemVkIFZpc3VhbCBTdHVkaW8gVmVyc2lvbiBpbiAkb3B0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKyAgICAgICAgLUkqKQorICAgICAgICAgICAgb3B0PSIke29wdCUvfSIKKyAgICAgICAgICAgIGluY3M9IiR7aW5jc30ke2luY3M6Kzt9JnF1b3Q7JHtvcHQjIy1JfSZxdW90OyIKKyAgICAgICAgICAgIHlhc21pbmNzPSIke3lhc21pbmNzfSAke29wdH0iCisgICAgICAgIDs7CisgICAgICAgIC1EKikgZGVmaW5lcz0iJHtkZWZpbmVzfSR7ZGVmaW5lczorO30ke29wdCMjLUR9IgorICAgICAgICA7OworICAgICAgICAtTCopICMgZnVkZ2UgLiB0byAkKE91dERpcikKKyAgICAgICAgICAgIGlmIFsgIiR7b3B0IyMtTH0iID09ICIuIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgbGliZGlycz0iJHtsaWJkaXJzfSR7bGliZGlyczorO30mcXVvdDtcJChPdXREaXIpJnF1b3Q7IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAjIEFsc28gdHJ5IGRpcmVjdG9yaWVzIGZvciB0aGlzIHBsYXRmb3JtL2NvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgbGliZGlycz0iJHtsaWJkaXJzfSR7bGliZGlyczorO30mcXVvdDske29wdCMjLUx9JnF1b3Q7IgorICAgICAgICAgICAgICAgICBsaWJkaXJzPSIke2xpYmRpcnN9JHtsaWJkaXJzOis7fSZxdW90OyR7b3B0IyMtTH0vXCQoUGxhdGZvcm1OYW1lKS9cJChDb25maWd1cmF0aW9uTmFtZSkmcXVvdDsiCisgICAgICAgICAgICAgICAgIGxpYmRpcnM9IiR7bGliZGlyc30ke2xpYmRpcnM6Kzt9JnF1b3Q7JHtvcHQjIy1MfS9cJChQbGF0Zm9ybU5hbWUpJnF1b3Q7IgorICAgICAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICAgLWwqKSBsaWJzPSIke2xpYnN9JHtsaWJzOisgfSR7b3B0IyMtbH0ubGliIgorICAgICAgICA7OworICAgICAgICAtKikgZGllX3Vua25vd24gJG9wdAorICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgZmlsZV9saXN0WyR7I2ZpbGVfbGlzdFtAXX1dPSIkb3B0IgorICAgICAgICAgICAgY2FzZSAiJG9wdCIgaW4KKyAgICAgICAgICAgICAgICAgKi5hc20pIHVzZXNfYXNtPXRydWUKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCitvdXRmaWxlPSR7b3V0ZmlsZTotL2Rldi9zdGRvdXR9CitndWlkPSR7Z3VpZDotYGdlbmVyYXRlX3V1aWRgfQorYXNtX3VzZV9jdXN0b21fc3RlcD1mYWxzZQordXNlc19hc209JHt1c2VzX2FzbTotZmFsc2V9CitjYXNlICIke3ZzX3ZlcjotOH0iIGluCisgICAgNykgdnNfdmVyX2lkPSI3LjEwIgorICAgICAgIGFzbV91c2VfY3VzdG9tX3N0ZXA9JHVzZXNfYXNtCisgICAgOzsKKyAgICA4KSB2c192ZXJfaWQ9IjguMDAiCisgICAgOzsKKyAgICA5KSB2c192ZXJfaWQ9IjkuMDAiCisgICAgOzsKK2VzYWMKKworWyAtbiAiJG5hbWUiIF0gfHwgZGllICJQcm9qZWN0IG5hbWUgKC0tbmFtZSkgbXVzdCBiZSBzcGVjaWZpZWQhIgorWyAtbiAiJHRhcmdldCIgXSB8fCBkaWUgIlRhcmdldCAoLS10YXJnZXQpIG11c3QgYmUgc3BlY2lmaWVkISIKKworaWYgJHt1c2Vfc3RhdGljX3J1bnRpbWU6LWZhbHNlfTsgdGhlbgorICAgIHJlbGVhc2VfcnVudGltZT0wCisgICAgZGVidWdfcnVudGltZT0xCisgICAgbGliX3NmeD1tdAorZWxzZQorICAgIHJlbGVhc2VfcnVudGltZT0yCisgICAgZGVidWdfcnVudGltZT0zCisgICAgbGliX3NmeD1tZAorZmkKKworIyBDYWxjdWxhdGUgZGVidWcgbGliIG5hbWVzOiBJZiBhIGxpYiBlbmRzIGluICR7bGliX3NmeH0ubGliLCB0aGVuIHJlbmFtZQorIyBpdCB0byAke2xpYl9zZnh9ZC5saWIuIFRoaXMgcHJlY2x1ZGVzIGxpbmtpbmcgdG8gcmVsZWFzZSBsaWJzIGZyb20gYQorIyBkZWJ1ZyBleGUsIHNvIHRoaXMgbWF5IG5lZWQgdG8gYmUgcmVmYWN0b3JlZCBsYXRlci4KK2ZvciBsaWIgaW4gJHtsaWJzfTsgZG8KKyAgICBpZiBbICIkbGliIiAhPSAiJHtsaWIlJHtsaWJfc2Z4fS5saWJ9IiBdOyB0aGVuCisgICAgICAgIGxpYj0ke2xpYiUubGlifWQubGliCisgICAgZmkKKyAgICBkZWJ1Z19saWJzPSIke2RlYnVnX2xpYnN9JHtkZWJ1Z19saWJzOisgfSR7bGlifSIKK2RvbmUKKworCisjIExpc3QgS2V5d29yZCBmb3IgdGhpcyB0YXJnZXQKK2Nhc2UgIiR0YXJnZXQiIGluCisgICAgeDg2Kikga2V5d29yZD0iTWFuYWdlZENQcm9qIgorICAgIDs7CisgICAgKikgZGllICJVbnN1cHBvcnRlZCB0YXJnZXQgJHRhcmdldCEiCitlc2FjCisKKyMgTGlzdCBvZiBhbGwgcGxhdGZvcm1zIHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQKK2Nhc2UgIiR0YXJnZXQiIGluCisgICAgeDg2XzY0KikKKyAgICAgICAgcGxhdGZvcm1zWzBdPSJ4NjQiCisgICAgOzsKKyAgICB4ODYqKQorICAgICAgICBwbGF0Zm9ybXNbMF09IldpbjMyIgorICAgICAgICAjIHRoZXNlIGFyZSBvbmx5IHVzZWQgYnkgdnM3CisgICAgICAgIGFzbV9EZWJ1Z19jbWRsaW5lPSJ5YXNtIC1YdmMgLWcgY3Y4IC1mIFwkKFBsYXRmb3JtTmFtZSkgJHt5YXNtaW5jc30gJnF1b3Q7XCQoSW5wdXRQYXRoKSZxdW90OyIKKyAgICAgICAgYXNtX1JlbGVhc2VfY21kbGluZT0ieWFzbSAtWHZjIC1mIFwkKFBsYXRmb3JtTmFtZSkgJHt5YXNtaW5jc30gJnF1b3Q7XCQoSW5wdXRQYXRoKSZxdW90OyIKKyAgICA7OworICAgICopIGRpZSAiVW5zdXBwb3J0ZWQgdGFyZ2V0ICR0YXJnZXQhIgorICAgIDs7Citlc2FjCisKK2dlbmVyYXRlX3ZjcHJvaigpIHsKKyAgICBjYXNlICIkcHJval9raW5kIiBpbgorICAgICAgICBleGUpIHZzX0NvbmZpZ3VyYXRpb25UeXBlPTEKKyAgICAgICAgOzsKKyAgICAgICAgKikgICB2c19Db25maWd1cmF0aW9uVHlwZT00CisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgZWNobyAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiV2luZG93cy0xMjUyXCI/PiIKKyAgICBvcGVuX3RhZyBWaXN1YWxTdHVkaW9Qcm9qZWN0IFwKKyAgICAgICAgUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiIFwKKyAgICAgICAgVmVyc2lvbj0iJHt2c192ZXJfaWR9IiBcCisgICAgICAgIE5hbWU9IiR7bmFtZX0iIFwKKyAgICAgICAgUHJvamVjdEdVSUQ9Inske2d1aWR9fSIgXAorICAgICAgICBSb290TmFtZXNwYWNlPSIke25hbWV9IiBcCisgICAgICAgIEtleXdvcmQ9IiR7a2V5d29yZH0iIFwKKworICAgIG9wZW5fdGFnIFBsYXRmb3JtcworICAgIGZvciBwbGF0IGluICIke3BsYXRmb3Jtc1tAXX0iOyBkbworICAgICAgICB0YWcgUGxhdGZvcm0gTmFtZT0iJHBsYXQiCisgICAgZG9uZQorICAgIGNsb3NlX3RhZyBQbGF0Zm9ybXMKKworICAgIG9wZW5fdGFnIFRvb2xGaWxlcworICAgIGNhc2UgIiR0YXJnZXQiIGluCisgICAgICAgIHg4NiopICR1c2VzX2FzbSAmJiB0YWcgVG9vbEZpbGUgUmVsYXRpdmVQYXRoPSIkc2VsZl9kaXJuYW1lLy4uL3g4Ni1tc3ZzL3lhc20ucnVsZXMiCisgICAgICAgIDs7CisgICAgZXNhYworICAgIGNsb3NlX3RhZyBUb29sRmlsZXMKKworICAgIG9wZW5fdGFnIENvbmZpZ3VyYXRpb25zCisgICAgZm9yIHBsYXQgaW4gIiR7cGxhdGZvcm1zW0BdfSI7IGRvCisgICAgICAgIHBsYXRfbm9fd3M9YGVjaG8gJHBsYXQgfCBzZWQgJ3MvW15BLVphLXowLTlfXS9fL2cnYAorICAgICAgICBvcGVuX3RhZyBDb25maWd1cmF0aW9uIFwKKyAgICAgICAgICAgIE5hbWU9IkRlYnVnfCRwbGF0IiBcCisgICAgICAgICAgICBPdXRwdXREaXJlY3Rvcnk9IlwkKFNvbHV0aW9uRGlyKSRwbGF0X25vX3dzL1wkKENvbmZpZ3VyYXRpb25OYW1lKSIgXAorICAgICAgICAgICAgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkcGxhdF9ub193cy9cJChDb25maWd1cmF0aW9uTmFtZSkvJHtuYW1lfSIgXAorICAgICAgICAgICAgQ29uZmlndXJhdGlvblR5cGU9IiR2c19Db25maWd1cmF0aW9uVHlwZSIgXAorICAgICAgICAgICAgQ2hhcmFjdGVyU2V0PSIxIiBcCisKKyAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KKyAgICAgICAgICAgIHg4NiopCisgICAgICAgICAgICAgICAgY2FzZSAiJG5hbWUiIGluCisgICAgICAgICAgICAgICAgICAgIG9ial9pbnRfZXh0cmFjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uPSIwIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJGluY3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7REVCVUc7X0NPTlNPTEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZUxpYnJhcnk9IiRkZWJ1Z19ydW50aW1lIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsPSIzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSIgXAorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICB2cHgpCisgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lPSJjYWxsIG9ial9pbnRfZXh0cmFjdC5iYXQgJHNyY19wYXRoX2JhcmUiIFwKKworICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb249IjAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkaW5jcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFOyRkZWZpbmVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZUxpYnJhcnk9IiRkZWJ1Z19ydW50aW1lIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuaW5nTGV2ZWw9IjMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIiBcCisKKyAgICAgICAgICAgICAgICAgICAgICAgICR1c2VzX2FzbSAmJiB0YWcgVG9vbCBOYW1lPSJZQVNNIiAgSW5jbHVkZVBhdGhzPSIkaW5jcyIgRGVidWc9InRydWUiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvbj0iMCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiRpbmNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7JGRlZmluZXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lTGlicmFyeT0iJGRlYnVnX3J1bnRpbWUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcm5pbmdMZXZlbD0iMyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjEiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiIFwKKworICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXNfYXNtICYmIHRhZyBUb29sIE5hbWU9IllBU00iICBJbmNsdWRlUGF0aHM9IiRpbmNzIiBEZWJ1Zz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgY2FzZSAiJHByb2pfa2luZCIgaW4KKyAgICAgICAgICAgIGV4ZSkKKyAgICAgICAgICAgICAgICBjYXNlICIkdGFyZ2V0IiBpbgorICAgICAgICAgICAgICAgICAgICB4ODYqKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJG5hbWUiIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX2ludF9leHRyYWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpbmtlclRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEZpbGU9IiR7bmFtZX0uZXhlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDTGlua2VyVG9vbCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbERlcGVuZGVuY2llcz0iJGRlYnVnX2xpYnMgXCQoTm9Jbmhlcml0KSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iJGxpYmRpcnMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbURhdGFiYXNlRmlsZT0iXCQoT3V0RGlyKS8ke25hbWV9LnBkYiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBsaWIpCisgICAgICAgICAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KKyAgICAgICAgICAgICAgICAgICAgeDg2KikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlPSJcJChPdXREaXIpLyR7bmFtZX0ke2xpYl9zZnh9ZC5saWIiIFwKKworICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBkbGwpCisgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAorICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpbmtlclRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbERlcGVuZGVuY2llcz0iXCQoTm9Jbmhlcml0KSIgXAorICAgICAgICAgICAgICAgICAgICBMaW5rSW5jcmVtZW50YWw9IjIiIFwKKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIiBcCisgICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5RGVidWc9IjEiIFwKKyAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZT0iMSIgXAorICAgICAgICAgICAgICAgICAgICAkbGlua19vcHRzIFwKKworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNsb3NlX3RhZyBDb25maWd1cmF0aW9uCisKKyAgICAgICAgb3Blbl90YWcgQ29uZmlndXJhdGlvbiBcCisgICAgICAgICAgICBOYW1lPSJSZWxlYXNlfCRwbGF0IiBcCisgICAgICAgICAgICBPdXRwdXREaXJlY3Rvcnk9IlwkKFNvbHV0aW9uRGlyKSRwbGF0X25vX3dzL1wkKENvbmZpZ3VyYXRpb25OYW1lKSIgXAorICAgICAgICAgICAgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkcGxhdF9ub193cy9cJChDb25maWd1cmF0aW9uTmFtZSkvJHtuYW1lfSIgXAorICAgICAgICAgICAgQ29uZmlndXJhdGlvblR5cGU9IiR2c19Db25maWd1cmF0aW9uVHlwZSIgXAorICAgICAgICAgICAgQ2hhcmFjdGVyU2V0PSIxIiBcCisgICAgICAgICAgICBXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjAiIFwKKworICAgICAgICBjYXNlICIkdGFyZ2V0IiBpbgorICAgICAgICAgICAgeDg2KikKKyAgICAgICAgICAgICAgICBjYXNlICIkbmFtZSIgaW4KKyAgICAgICAgICAgICAgICAgICAgb2JqX2ludF9leHRyYWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb249IjIiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXZvclNpemVvclNwZWVkPSIxIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJGluY3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVMaWJyYXJ5PSIkcmVsZWFzZV9ydW50aW1lIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuaW5nTGV2ZWw9IjMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBcCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgIHZweCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmU9ImNhbGwgb2JqX2ludF9leHRyYWN0LmJhdCAkc3JjX3BhdGhfYmFyZSIgXAorCisgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvbj0iMiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdm9yU2l6ZW9yU3BlZWQ9IjEiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkaW5jcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFOyRkZWZpbmVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZUxpYnJhcnk9IiRyZWxlYXNlX3J1bnRpbWUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcm5pbmdMZXZlbD0iMyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiIFwKKworICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXNfYXNtICYmIHRhZyBUb29sIE5hbWU9IllBU00iICBJbmNsdWRlUGF0aHM9IiRpbmNzIgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICAgICAgdGFnIFRvb2wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkaW5jcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvbj0iMiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdm9yU2l6ZW9yU3BlZWQ9IjEiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTskZGVmaW5lcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVMaWJyYXJ5PSIkcmVsZWFzZV9ydW50aW1lIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuaW5nTGV2ZWw9IjMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIiBcCisKKyAgICAgICAgICAgICAgICAgICAgICAgICR1c2VzX2FzbSAmJiB0YWcgVG9vbCBOYW1lPSJZQVNNIiAgSW5jbHVkZVBhdGhzPSIkaW5jcyIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgY2FzZSAiJHByb2pfa2luZCIgaW4KKyAgICAgICAgICAgIGV4ZSkKKyAgICAgICAgICAgICAgICBjYXNlICIkdGFyZ2V0IiBpbgorICAgICAgICAgICAgICAgICAgICB4ODYqKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJG5hbWUiIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX2ludF9leHRyYWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgVG9vbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpbmtlclRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEZpbGU9IiR7bmFtZX0uZXhlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9IlZDTGlua2VyVG9vbCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbERlcGVuZGVuY2llcz0iJGxpYnMgXCQoTm9Jbmhlcml0KSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iJGxpYmRpcnMiIFwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBsaWIpCisgICAgICAgICAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KKyAgICAgICAgICAgICAgICAgICAgeDg2KikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlPSJcJChPdXREaXIpLyR7bmFtZX0ke2xpYl9zZnh9LmxpYiIgXAorCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGRsbCkgIyBub3RlIGRpZmZlcmVuY2VzIHRvIGRlYnVnIHZlcnNpb246IExpbmtJbmNyZW1lbnRhbCwgQXNzZW1ibHlEZWJ1ZworICAgICAgICAgICAgICAgIHRhZyBUb29sIFwKKyAgICAgICAgICAgICAgICAgICAgTmFtZT0iVkNMaW5rZXJUb29sIiBcCisgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IlwkKE5vSW5oZXJpdCkiIFwKKyAgICAgICAgICAgICAgICAgICAgTGlua0luY3JlbWVudGFsPSIxIiBcCisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIgXAorICAgICAgICAgICAgICAgICAgICBUYXJnZXRNYWNoaW5lPSIxIiBcCisgICAgICAgICAgICAgICAgICAgICRsaW5rX29wdHMgXAorCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgY2xvc2VfdGFnIENvbmZpZ3VyYXRpb24KKyAgICBkb25lCisgICAgY2xvc2VfdGFnIENvbmZpZ3VyYXRpb25zCisKKyAgICBvcGVuX3RhZyBGaWxlcworICAgIGdlbmVyYXRlX2ZpbHRlciBzcmNzICAgIlNvdXJjZSBGaWxlcyIgICAiYztjYztkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214IgorICAgIGdlbmVyYXRlX2ZpbHRlciBoZHJzICAgIkhlYWRlciBGaWxlcyIgICAiaDtobTtpbmw7aW5jO3hzZCIKKyAgICBnZW5lcmF0ZV9maWx0ZXIgcmVzcmNzICJSZXNvdXJjZSBGaWxlcyIgInJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXYiCisgICAgZ2VuZXJhdGVfZmlsdGVyIHJlc3JjcyAiQnVpbGQgRmlsZXMiICAgICJtayIKKyAgICBjbG9zZV90YWcgRmlsZXMKKworICAgIHRhZyAgICAgICBHbG9iYWxzCisgICAgY2xvc2VfdGFnIFZpc3VhbFN0dWRpb1Byb2plY3QKKworICAgICMgVGhpcyBtdXN0IGJlIGRvbmUgZnJvbSB3aXRoaW4gdGhlIHt9IHN1YnNoZWxsCisgICAgZWNobyAiSWdub3JlZCBmaWxlcyBsaXN0ICgkeyNmaWxlX2xpc3RbQF19IGl0ZW1zKSBpczoiID4mMgorICAgIGZvciBmIGluICIke2ZpbGVfbGlzdFtAXX0iOyBkbworICAgICAgICBlY2hvICIgICAgJGYiID4mMgorICAgIGRvbmUKK30KKworZ2VuZXJhdGVfdmNwcm9qIHwKKyAgICBzZWQgIC1lICcvIi9zO1woW14gIl1cKS87XDFcXDtnJyA+ICR7b3V0ZmlsZX0KKworZXhpdAorPCEtLQorVE9ETzogQWRkIGFueSBmaWxlcyBub3QgY2FwdHVyZWQgYnkgZmlsdGVycy4KKyAgICAgICAgICAgICAgICA8RmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpdmVQYXRoPSIuXFJlYWRNZS50eHQiCisgICAgICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPC9GaWxlPgorLS0+CmRpZmYgLS1naXQgYS9idWlsZC9tYWtlL2dlbl9tc3ZzX3Nsbi5zaCBiL2xpYnZweC9idWlsZC9tYWtlL2dlbl9tc3ZzX3Nsbi5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQvbWFrZS9nZW5fbXN2c19zbG4uc2gKcmVuYW1lIHRvIGxpYnZweC9idWlsZC9tYWtlL2dlbl9tc3ZzX3Nsbi5zaApkaWZmIC0tZ2l0IGEvbGlidnB4L2J1aWxkL21ha2Uvb2JqX2ludF9leHRyYWN0LmMgYi9saWJ2cHgvYnVpbGQvbWFrZS9vYmpfaW50X2V4dHJhY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjMxN2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2J1aWxkL21ha2Uvb2JqX2ludF9leHRyYWN0LmMKQEAgLTAsMCArMSw5MTQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2ludGVnZXIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgT1VUUFVUX0ZNVF9QTEFJTiwKKyAgICBPVVRQVVRfRk1UX1JWRFMsCisgICAgT1VUUFVUX0ZNVF9HQVMsCit9IG91dHB1dF9mbXRfdDsKKworaW50IGxvZ19tc2coY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaW50IHJlczsKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHJlcyA9IHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18KKyNpZiBkZWZpbmVkKF9fTUFDSF9fKQorCisjaW5jbHVkZSA8bWFjaC1vL2xvYWRlci5oPgorI2luY2x1ZGUgPG1hY2gtby9ubGlzdC5oPgorCitpbnQgcGFyc2VfbWFjaG8odWludDhfdCAqYmFzZV9idWYsIHNpemVfdCBzeikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBzdHJ1Y3QgbWFjaF9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQ4X3QgKmJ1ZiA9IGJhc2VfYnVmOworICAgIGludCBiYXNlX2RhdGFfc2VjdGlvbiA9IDA7CisgICAgaW50IGJpdHMgPSAwOworCisgICAgLyogV2UgY2FuIHJlYWQgaW4gbWFjaF9oZWFkZXIgZm9yIDMyIGFuZCA2NCBiaXQgYXJjaGl0ZWN0dXJlcworICAgICAqIGJlY2F1c2UgaXQncyBpZGVudGljYWwgdG8gbWFjaF9oZWFkZXJfNjQgZXhjZXB0IGZvciB0aGUgbGFzdAorICAgICAqIGVsZW1lbnQgKHVpbnQzMl90IHJlc2VydmVkKSwgd2hpY2ggd2UgZG9uJ3QgdXNlLiBUaGVuLCB3aGVuCisgICAgICogd2Uga25vdyB3aGljaCBhcmNoaXRlY3R1cmUgd2UncmUgbG9va2luZyBhdCwgaW5jcmVtZW50IGJ1ZgorICAgICAqIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgbWVtY3B5KCZoZWFkZXIsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBtYWNoX2hlYWRlcikpOworCisgICAgaWYgKGhlYWRlci5tYWdpYyA9PSBNSF9NQUdJQykKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXIuY3B1dHlwZSA9PSBDUFVfVFlQRV9BUk0KKyAgICAgICAgICAgIHx8IGhlYWRlci5jcHV0eXBlID09IENQVV9UWVBFX1g4NikKKyAgICAgICAgeworICAgICAgICAgICAgYml0cyA9IDMyOworICAgICAgICAgICAgYnVmICs9IHNpemVvZihzdHJ1Y3QgbWFjaF9oZWFkZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9nX21zZygiQmFkIGNwdXR5cGUgZm9yIG9iamVjdCBmaWxlLiBDdXJyZW50bHkgb25seSB0ZXN0ZWQgZm9yIENQVV9UWVBFX1tBUk18WDg2XS5cbiIpOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGhlYWRlci5tYWdpYyA9PSBNSF9NQUdJQ182NCkKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXIuY3B1dHlwZSA9PSBDUFVfVFlQRV9YODZfNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHMgPSA2NDsKKyAgICAgICAgICAgIGJ1ZiArPSBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyXzY0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ19tc2coIkJhZCBjcHV0eXBlIGZvciBvYmplY3QgZmlsZS4gQ3VycmVudGx5IG9ubHkgdGVzdGVkIGZvciBDUFVfVFlQRV9YODZfNjQuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsb2dfbXNnKCJCYWQgbWFnaWMgbnVtYmVyIGZvciBvYmplY3QgZmlsZS4gMHgleCBvciAweCV4IGV4cGVjdGVkLCAweCV4IGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgICBNSF9NQUdJQywgTUhfTUFHSUNfNjQsIGhlYWRlci5tYWdpYyk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyLmZpbGV0eXBlICE9IE1IX09CSkVDVCkKKyAgICB7CisgICAgICAgIGxvZ19tc2coIkJhZCBmaWxldHlwZSBmb3Igb2JqZWN0IGZpbGUuIEN1cnJlbnRseSBvbmx5IHRlc3RlZCBmb3IgTUhfT0JKRUNULlxuIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyLm5jbWRzOyBpKyspCisgICAgeworICAgICAgICBzdHJ1Y3QgbG9hZF9jb21tYW5kIGxjOworCisgICAgICAgIG1lbWNweSgmbGMsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBsb2FkX2NvbW1hbmQpKTsKKworICAgICAgICBpZiAobGMuY21kID09IExDX1NFR01FTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNlZ19idWYgPSBidWY7CisgICAgICAgICAgICBzdHJ1Y3Qgc2VjdGlvbiBzOworICAgICAgICAgICAgc3RydWN0IHNlZ21lbnRfY29tbWFuZCBzZWdfYzsKKworICAgICAgICAgICAgbWVtY3B5KCZzZWdfYywgc2VnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQpKTsKKyAgICAgICAgICAgIHNlZ19idWYgKz0gc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQpOworCisgICAgICAgICAgICAvKiBBbHRob3VnaCBlYWNoIHNlY3Rpb24gaXMgZ2l2ZW4gaXQncyBvd24gb2Zmc2V0LCBubGlzdC5uX3ZhbHVlCisgICAgICAgICAgICAgKiByZWZlcmVuY2VzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHNlY3Rpb24uIFRoaXMgaXNuJ3QKKyAgICAgICAgICAgICAqIGFwcGFyZW50IHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24gYmVjYXVzZSB0aGUgb2Zmc2V0IG9mIHRoZQorICAgICAgICAgICAgICogZGF0YSBzZWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBzZWN0aW9uLiBIb3dldmVyLCB3aXRoCisgICAgICAgICAgICAgKiBkZWJ1ZyBzZWN0aW9ucyBtaXhlZCBpbiwgdGhlIG9mZnNldCBvZiB0aGUgZGVidWcgc2VjdGlvbgorICAgICAgICAgICAgICogaW5jcmVhc2VzIGJ1dCBuX3ZhbHVlIHN0aWxsIHJlZmVyZW5jZXMgdGhlIGZpcnN0IHNlY3Rpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzZWdfYy5uc2VjdHMgPCAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ19tc2coIk5vdCBlbm91Z2ggc2VjdGlvbnNcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KCZzLCBzZWdfYnVmLCBzaXplb2Yoc3RydWN0IHNlY3Rpb24pKTsKKyAgICAgICAgICAgIGJhc2VfZGF0YV9zZWN0aW9uID0gcy5vZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGMuY21kID09IExDX1NFR01FTlRfNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNlZ19idWYgPSBidWY7CisgICAgICAgICAgICBzdHJ1Y3Qgc2VjdGlvbl82NCBzOworICAgICAgICAgICAgc3RydWN0IHNlZ21lbnRfY29tbWFuZF82NCBzZWdfYzsKKworICAgICAgICAgICAgbWVtY3B5KCZzZWdfYywgc2VnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmRfNjQpKTsKKyAgICAgICAgICAgIHNlZ19idWYgKz0gc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2NvbW1hbmRfNjQpOworCisgICAgICAgICAgICAvKiBFeHBsYW5hdGlvbiBpbiBMR19TRUdNRU5UICovCisgICAgICAgICAgICBpZiAoc2VnX2MubnNlY3RzIDwgMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dfbXNnKCJOb3QgZW5vdWdoIHNlY3Rpb25zXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweSgmcywgc2VnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzZWN0aW9uXzY0KSk7CisgICAgICAgICAgICBiYXNlX2RhdGFfc2VjdGlvbiA9IHMub2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxjLmNtZCA9PSBMQ19TWU1UQUIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiYXNlX2RhdGFfc2VjdGlvbiAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cnVjdCBzeW10YWJfY29tbWFuZCBzYzsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpzeW1fYnVmID0gYmFzZV9idWY7CisgICAgICAgICAgICAgICAgdWludDhfdCAqc3RyX2J1ZiA9IGJhc2VfYnVmOworCisgICAgICAgICAgICAgICAgbWVtY3B5KCZzYywgYnVmLCBzaXplb2Yoc3RydWN0IHN5bXRhYl9jb21tYW5kKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2MuY21kc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHN5bXRhYl9jb21tYW5kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2coIkNhbid0IGZpbmQgc3ltYm9sIHRhYmxlIVxuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzeW1fYnVmICs9IHNjLnN5bW9mZjsKKyAgICAgICAgICAgICAgICBzdHJfYnVmICs9IHNjLnN0cm9mZjsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzYy5uc3ltczsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2Ygc3RyaW5nIGlzIGNhY2x1YXRlZCBlYWNoIHRpbWUgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogc3RhcnQgb2YgdGhlIHN0cmluZyBidWZmZXIuICBPbiBkYXJ3aW4gdGhlIHN5bWJvbHMKKyAgICAgICAgICAgICAgICAgICAgICogYXJlIHByZWZpeGVkIGJ5ICJfIiwgc28gd2UgYnVtcCB0aGUgcG9pbnRlciBieSAxLgorICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGFyZ2V0IHZhbHVlIGlzIGRlZmluZWQgYXMgYW4gaW50IGluIGFzbV8qX29mZnNldHMuYywKKyAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggaXMgNCBieXRlcyBvbiBhbGwgdGFyZ2V0cyB3ZSBjdXJyZW50bHkgdXNlLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gMzIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBubGlzdCBubDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbmwsIHN5bV9idWYsIHNpemVvZihzdHJ1Y3Qgbmxpc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9idWYgKz0gc2l6ZW9mKHN0cnVjdCBubGlzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsLCBiYXNlX2J1ZiArIGJhc2VfZGF0YV9zZWN0aW9uICsgbmwubl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAlNWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2J1ZiArIG5sLm5fdW4ubl9zdHJ4ICsgMSwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGlmIChiaXRzID09IDY0KSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgbmxpc3RfNjQgbmw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJm5sLCBzeW1fYnVmLCBzaXplb2Yoc3RydWN0IG5saXN0XzY0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1fYnVmICs9IHNpemVvZihzdHJ1Y3Qgbmxpc3RfNjQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbCwgYmFzZV9idWYgKyBiYXNlX2RhdGFfc2VjdGlvbiArIG5sLm5fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgJTVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9idWYgKyBubC5uX3VuLm5fc3RyeCArIDEsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWYgKz0gbGMuY21kc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgcmV0dXJuIDE7CisKK30KKworI2VsaWYgZGVmaW5lZChfX0VMRl9fKQorI2luY2x1ZGUgImVsZi5oIgorCisjZGVmaW5lIENPUFlfU1RSVUNUKGRzdCwgYnVmLCBvZnN0LCBzeikgZG8ge1wKKyAgICAgICAgaWYob2ZzdCArIHNpemVvZigoKihkc3QpKSkgPiBzeikgZ290byBiYWlsO1wKKyAgICAgICAgbWVtY3B5KGRzdCwgYnVmK29mc3QsIHNpemVvZigoKihkc3QpKSkpO1wKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgRU5ESUFOX0FTU0lHTih2YWwsIG1lbWIpIGRvIHtcCisgICAgICAgIGlmKCFlbGYtPmxlX2RhdGEpIHtsb2dfbXNnKCJCaWcgRW5kaWFuIGRhdGEgbm90IHN1cHBvcnRlZCB5ZXQhXG4iKTtnb3RvIGJhaWw7fVwKKyAgICAgICAgKHZhbCkgPSAobWVtYik7XAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKG1lbWIpIGRvIHtcCisgICAgICAgIEVORElBTl9BU1NJR04obWVtYiwgbWVtYik7XAorICAgIH0gd2hpbGUoMCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICAgKmJ1ZjsgLyogQnVmZmVyIGNvbnRhaW5pbmcgRUxGIGRhdGEgKi8KKyAgICBzaXplX3QgICAgICAgIHN6OyAgLyogQnVmZmVyIHNpemUgKi8KKyAgICBpbnQgICAgICAgICAgIGxlX2RhdGE7IC8qIERhdGEgaXMgbGl0dGxlLWVuZGlhbiAqLworICAgIHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOyAvKiBNYWdpYyBudW1iZXIgYW5kIG90aGVyIGluZm8gKi8KKyAgICBpbnQgICAgICAgICAgIGJpdHM7IC8qIDMyIG9yIDY0ICovCisgICAgRWxmMzJfRWhkciAgICBoZHIzMjsKKyAgICBFbGY2NF9FaGRyICAgIGhkcjY0OworfSBlbGZfb2JqX3Q7CisKK2ludCBwYXJzZV9lbGZfaGVhZGVyKGVsZl9vYmpfdCAqZWxmKQoreworICAgIGludCByZXM7CisgICAgLyogVmVyaWZ5IEVMRiBNYWdpYyBudW1iZXJzICovCisgICAgQ09QWV9TVFJVQ1QoJmVsZi0+ZV9pZGVudCwgZWxmLT5idWYsIDAsIGVsZi0+c3opOworICAgIHJlcyA9IGVsZi0+ZV9pZGVudFtFSV9NQUcwXSA9PSBFTEZNQUcwOworICAgIHJlcyAmPSBlbGYtPmVfaWRlbnRbRUlfTUFHMV0gPT0gRUxGTUFHMTsKKyAgICByZXMgJj0gZWxmLT5lX2lkZW50W0VJX01BRzJdID09IEVMRk1BRzI7CisgICAgcmVzICY9IGVsZi0+ZV9pZGVudFtFSV9NQUczXSA9PSBFTEZNQUczOworICAgIHJlcyAmPSBlbGYtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIKKyAgICAgICAgfHwgZWxmLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzY0OworICAgIHJlcyAmPSBlbGYtPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0I7CisKKyAgICBpZiAoIXJlcykgZ290byBiYWlsOworCisgICAgZWxmLT5sZV9kYXRhID0gZWxmLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTFNCOworCisgICAgLyogUmVhZCBpbiByZWxldmFudCB2YWx1ZXMgKi8KKyAgICBpZiAoZWxmLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQorICAgIHsKKyAgICAgICAgZWxmLT5iaXRzID0gMzI7CisgICAgICAgIENPUFlfU1RSVUNUKCZlbGYtPmhkcjMyLCBlbGYtPmJ1ZiwgMCwgZWxmLT5zeik7CisKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfdHlwZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX21hY2hpbmUpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV92ZXJzaW9uKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfZW50cnkpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9waG9mZik7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3Nob2ZmKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfZmxhZ3MpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9laHNpemUpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9waGVudHNpemUpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyMzIuZV9waG51bSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3NoZW50c2l6ZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHIzMi5lX3NobnVtKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjMyLmVfc2hzdHJuZHgpOworICAgIH0KKyAgICBlbHNlIC8qIGlmIChlbGYtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQpICovCisgICAgeworICAgICAgICBlbGYtPmJpdHMgPSA2NDsKKyAgICAgICAgQ09QWV9TVFJVQ1QoJmVsZi0+aGRyNjQsIGVsZi0+YnVmLCAwLCBlbGYtPnN6KTsKKworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV90eXBlKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfbWFjaGluZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX3ZlcnNpb24pOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9lbnRyeSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX3Bob2ZmKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfc2hvZmYpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9mbGFncyk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX2Voc2l6ZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX3BoZW50c2l6ZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoZWxmLT5oZHI2NC5lX3BobnVtKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfc2hlbnRzaXplKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShlbGYtPmhkcjY0LmVfc2hudW0pOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGVsZi0+aGRyNjQuZV9zaHN0cm5keCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitiYWlsOgorICAgIGxvZ19tc2coIkZhaWxlZCB0byBwYXJzZSBFTEYgZmlsZSBoZWFkZXIiKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHBhcnNlX2VsZl9zZWN0aW9uKGVsZl9vYmpfdCAqZWxmLCBpbnQgaWR4LCBFbGYzMl9TaGRyICpoZHIzMiwgRWxmNjRfU2hkciAqaGRyNjQpCit7CisgICAgaWYgKGhkcjMyKQorICAgIHsKKyAgICAgICAgaWYgKGlkeCA+PSBlbGYtPmhkcjMyLmVfc2hudW0pCisgICAgICAgICAgICBnb3RvIGJhaWw7CisKKyAgICAgICAgQ09QWV9TVFJVQ1QoaGRyMzIsIGVsZi0+YnVmLCBlbGYtPmhkcjMyLmVfc2hvZmYgKyBpZHggKiBlbGYtPmhkcjMyLmVfc2hlbnRzaXplLAorICAgICAgICAgICAgICAgICAgICBlbGYtPnN6KTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHIzMi0+c2hfbmFtZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX3R5cGUpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9mbGFncyk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX2FkZHIpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9vZmZzZXQpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9zaXplKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHIzMi0+c2hfbGluayk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyMzItPnNoX2luZm8pOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9hZGRyYWxpZ24pOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjMyLT5zaF9lbnRzaXplKTsKKyAgICB9CisgICAgZWxzZSAvKiBpZiAoaGRyNjQpICovCisgICAgeworICAgICAgICBpZiAoaWR4ID49IGVsZi0+aGRyNjQuZV9zaG51bSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKworICAgICAgICBDT1BZX1NUUlVDVChoZHI2NCwgZWxmLT5idWYsIGVsZi0+aGRyNjQuZV9zaG9mZiArIGlkeCAqIGVsZi0+aGRyNjQuZV9zaGVudHNpemUsCisgICAgICAgICAgICAgICAgICAgIGVsZi0+c3opOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjY0LT5zaF9uYW1lKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfdHlwZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX2ZsYWdzKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfYWRkcik7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX29mZnNldCk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX3NpemUpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKGhkcjY0LT5zaF9saW5rKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShoZHI2NC0+c2hfaW5mbyk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX2FkZHJhbGlnbik7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0UoaGRyNjQtPnNoX2VudHNpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworYmFpbDoKKyAgICByZXR1cm4gMTsKK30KKworY2hhciAqcGFyc2VfZWxmX3N0cmluZ190YWJsZShlbGZfb2JqX3QgKmVsZiwgaW50IHNfaWR4LCBpbnQgaWR4KQoreworICAgIGlmIChlbGYtPmJpdHMgPT0gMzIpCisgICAgeworICAgICAgICBFbGYzMl9TaGRyIHNoZHI7CisKKyAgICAgICAgaWYgKHBhcnNlX2VsZl9zZWN0aW9uKGVsZiwgc19pZHgsICZzaGRyLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nX21zZygiRmFpbGVkIHRvIHBhcnNlIEVMRiBzdHJpbmcgdGFibGU6IHNlY3Rpb24gJWQsIGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzX2lkeCwgaWR4KTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoY2hhciAqKShlbGYtPmJ1ZiArIHNoZHIuc2hfb2Zmc2V0ICsgaWR4KTsKKyAgICB9CisgICAgZWxzZSAvKiBpZiAoZWxmLT5iaXRzID09IDY0KSAqLworICAgIHsKKyAgICAgICAgRWxmNjRfU2hkciBzaGRyOworCisgICAgICAgIGlmIChwYXJzZV9lbGZfc2VjdGlvbihlbGYsIHNfaWR4LCBOVUxMLCAmc2hkcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ19tc2coIkZhaWxlZCB0byBwYXJzZSBFTEYgc3RyaW5nIHRhYmxlOiBzZWN0aW9uICVkLCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19pZHgsIGlkeCk7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGNoYXIgKikoZWxmLT5idWYgKyBzaGRyLnNoX29mZnNldCArIGlkeCk7CisgICAgfQorfQorCitpbnQgcGFyc2VfZWxmX3N5bWJvbChlbGZfb2JqX3QgKmVsZiwgdW5zaWduZWQgaW50IG9mc3QsIEVsZjMyX1N5bSAqc3ltMzIsIEVsZjY0X1N5bSAqc3ltNjQpCit7CisgICAgaWYgKHN5bTMyKQorICAgIHsKKyAgICAgICAgQ09QWV9TVFJVQ1Qoc3ltMzIsIGVsZi0+YnVmLCBvZnN0LCBlbGYtPnN6KTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW0zMi0+c3RfbmFtZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltMzItPnN0X3ZhbHVlKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW0zMi0+c3Rfc2l6ZSk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltMzItPnN0X2luZm8pOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTMyLT5zdF9vdGhlcik7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltMzItPnN0X3NobmR4KTsKKyAgICB9CisgICAgZWxzZSAvKiBpZiAoc3ltNjQpICovCisgICAgeworICAgICAgICBDT1BZX1NUUlVDVChzeW02NCwgZWxmLT5idWYsIG9mc3QsIGVsZi0+c3opOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTY0LT5zdF9uYW1lKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW02NC0+c3RfdmFsdWUpOworICAgICAgICBFTkRJQU5fQVNTSUdOX0lOX1BMQUNFKHN5bTY0LT5zdF9zaXplKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW02NC0+c3RfaW5mbyk7CisgICAgICAgIEVORElBTl9BU1NJR05fSU5fUExBQ0Uoc3ltNjQtPnN0X290aGVyKTsKKyAgICAgICAgRU5ESUFOX0FTU0lHTl9JTl9QTEFDRShzeW02NC0+c3Rfc2huZHgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBwYXJzZV9lbGYodWludDhfdCAqYnVmLCBzaXplX3Qgc3osIG91dHB1dF9mbXRfdCBtb2RlKQoreworICAgIGVsZl9vYmpfdCAgICBlbGY7CisgICAgdW5zaWduZWQgaW50IG9mc3Q7CisgICAgaW50ICAgICAgICAgIGk7CisgICAgRWxmMzJfT2ZmICAgIHN0cnRhYl9vZmYzMjsKKyAgICBFbGY2NF9PZmYgICAgc3RydGFiX29mZjY0OyAvKiBzYXZlIFN0cmluZyBUYWJsZSBvZmZzZXQgZm9yIGxhdGVyIHVzZSAqLworCisgICAgbWVtc2V0KCZlbGYsIDAsIHNpemVvZihlbGYpKTsKKyAgICBlbGYuYnVmID0gYnVmOworICAgIGVsZi5zeiA9IHN6OworCisgICAgLyogUGFyc2UgSGVhZGVyICovCisgICAgaWYgKHBhcnNlX2VsZl9oZWFkZXIoJmVsZikpCisgICAgICBnb3RvIGJhaWw7CisKKyAgICBpZiAoZWxmLmJpdHMgPT0gMzIpCisgICAgeworICAgICAgICBFbGYzMl9TaGRyIHNoZHI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGYuaGRyMzIuZV9zaG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJzZV9lbGZfc2VjdGlvbigmZWxmLCBpLCAmc2hkciwgTlVMTCk7CisKKyAgICAgICAgICAgIGlmIChzaGRyLnNoX3R5cGUgPT0gU0hUX1NUUlRBQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIHN0cnRzYl9uYW1lWzEyOF07CisKKyAgICAgICAgICAgICAgICBzdHJjcHkoc3RydHNiX25hbWUsIChjaGFyICopKGVsZi5idWYgKyBzaGRyLnNoX29mZnNldCArIHNoZHIuc2hfbmFtZSkpOworCisgICAgICAgICAgICAgICAgaWYgKCEoc3RyY21wKHN0cnRzYl9uYW1lLCAiLnNoc3RydGFiIikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbG9nX21zZygiZm91bmQgc2VjdGlvbjogJXNcbiIsIHN0cnRzYl9uYW1lKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RydGFiX29mZjMyID0gc2hkci5zaF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGlmIChlbGYuYml0cyA9PSA2NCkgKi8KKyAgICB7CisgICAgICAgIEVsZjY0X1NoZHIgc2hkcjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVsZi5oZHI2NC5lX3NobnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnNlX2VsZl9zZWN0aW9uKCZlbGYsIGksIE5VTEwsICZzaGRyKTsKKworICAgICAgICAgICAgaWYgKHNoZHIuc2hfdHlwZSA9PSBTSFRfU1RSVEFCKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgc3RydHNiX25hbWVbMTI4XTsKKworICAgICAgICAgICAgICAgIHN0cmNweShzdHJ0c2JfbmFtZSwgKGNoYXIgKikoZWxmLmJ1ZiArIHNoZHIuc2hfb2Zmc2V0ICsgc2hkci5zaF9uYW1lKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIShzdHJjbXAoc3RydHNiX25hbWUsICIuc2hzdHJ0YWIiKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBsb2dfbXNnKCJmb3VuZCBzZWN0aW9uOiAlc1xuIiwgc3RydHNiX25hbWUpOyAqLworICAgICAgICAgICAgICAgICAgICBzdHJ0YWJfb2ZmNjQgPSBzaGRyLnNoX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogUGFyc2UgYWxsIFN5bWJvbCBUYWJsZXMgKi8KKyAgICBpZiAoZWxmLmJpdHMgPT0gMzIpCisgICAgeworICAgICAgICBFbGYzMl9TaGRyIHNoZHI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGYuaGRyMzIuZV9zaG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJzZV9lbGZfc2VjdGlvbigmZWxmLCBpLCAmc2hkciwgTlVMTCk7CisKKyAgICAgICAgICAgIGlmIChzaGRyLnNoX3R5cGUgPT0gU0hUX1NZTVRBQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKG9mc3QgPSBzaGRyLnNoX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgIG9mc3QgPCBzaGRyLnNoX29mZnNldCArIHNoZHIuc2hfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgIG9mc3QgKz0gc2hkci5zaF9lbnRzaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRWxmMzJfU3ltIHN5bTsKKworICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc3ltYm9sKCZlbGYsIG9mc3QsICZzeW0sIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEZvciBhbGwgT0JKRUNUUyAoZGF0YSBvYmplY3RzKSwgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogcHJvcGVyIGRhdGEgc2VnbWVudC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIC8qIGlmIChFTEYzMl9TVF9UWVBFKHN5bS5zdF9pbmZvKSA9PSBTVFRfT0JKRUNUICYmIHN5bS5zdF9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZygiZm91bmQgZGF0YSBvYmplY3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zdHJpbmdfdGFibGUoJmVsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGRyLnNoX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnN0X25hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVMRjMyX1NUX1RZUEUoc3ltLnN0X2luZm8pID09IFNUVF9PQkpFQ1QKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN5bS5zdF9zaXplID09IDQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZjMyX1NoZHIgZGhkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzZWN0aW9uX25hbWVbMTI4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3NlY3Rpb24oJmVsZiwgc3ltLnN0X3NobmR4LCAmZGhkciwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBleHBsYW5pdGlvbiAtIHJlZmVyIHRvIF9NU0NfVkVSIHZlcnNpb24gb2YgY29kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHNlY3Rpb25fbmFtZSwgKGNoYXIgKikoZWxmLmJ1ZiArIHN0cnRhYl9vZmYzMiArIGRoZHIuc2hfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9nX21zZygiU2VjdGlvbl9uYW1lOiAlcywgU2VjdGlvbl90eXBlOiAlZFxuIiwgc2VjdGlvbl9uYW1lLCBkaGRyLnNoX3R5cGUpOyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgIi5ic3MiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZW9mKHZhbCkgIT0gc3ltLnN0X3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZhbHVlIGlzIGRlY2xhcmVkIGFzIGFuIGludCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhc21fKl9vZmZzZXRzLmMsIHdoaWNoIGlzIDQgYnl0ZXMgb24gYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRhcmdldHMgd2UgY3VycmVudGx5IHVzZS4gQ29tcGxhaW4gbG91ZGx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgaXMgbm90IHRydWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKCJTeW1ib2wgc2l6ZSBpcyB3cm9uZ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmLmJ1ZiArIGRoZHIuc2hfb2Zmc2V0ICsgc3ltLnN0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxmLmxlX2RhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZygiQmlnIEVuZGlhbiBkYXRhIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPVVRQVVRfRk1UX1JWRFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS00MHMgRVFVICU1ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zdHJpbmdfdGFibGUoJmVsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hkci5zaF9saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9VVFBVVF9GTVRfR0FTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi5lcXUgJS00MHMsICU1ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zdHJpbmdfdGFibGUoJmVsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hkci5zaF9saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc3RyaW5nX3RhYmxlKCZlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZHIuc2hfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnN0X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGlmIChlbGYuYml0cyA9PSA2NCkgKi8KKyAgICB7CisgICAgICAgIEVsZjY0X1NoZHIgc2hkcjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVsZi5oZHI2NC5lX3NobnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnNlX2VsZl9zZWN0aW9uKCZlbGYsIGksIE5VTEwsICZzaGRyKTsKKworICAgICAgICAgICAgaWYgKHNoZHIuc2hfdHlwZSA9PSBTSFRfU1lNVEFCKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAob2ZzdCA9IHNoZHIuc2hfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgb2ZzdCA8IHNoZHIuc2hfb2Zmc2V0ICsgc2hkci5zaF9zaXplOworICAgICAgICAgICAgICAgICAgICAgb2ZzdCArPSBzaGRyLnNoX2VudHNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFbGY2NF9TeW0gc3ltOworCisgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VsZl9zeW1ib2woJmVsZiwgb2ZzdCwgTlVMTCwgJnN5bSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIGFsbCBPQkpFQ1RTIChkYXRhIG9iamVjdHMpLCBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBwcm9wZXIgZGF0YSBzZWdtZW50LgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogaWYgKEVMRjY0X1NUX1RZUEUoc3ltLnN0X2luZm8pID09IFNUVF9PQkpFQ1QgJiYgc3ltLnN0X25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKCJmb3VuZCBkYXRhIG9iamVjdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3N0cmluZ190YWJsZSgmZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZHIuc2hfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uc3RfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoRUxGNjRfU1RfVFlQRShzeW0uc3RfaW5mbykgPT0gU1RUX09CSkVDVAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3ltLnN0X3NpemUgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRWxmNjRfU2hkciBkaGRyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNlY3Rpb25fbmFtZVsxMjhdOworCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc2VjdGlvbigmZWxmLCBzeW0uc3Rfc2huZHgsIE5VTEwsICZkaGRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGV4cGxhbml0aW9uIC0gcmVmZXIgdG8gX01TQ19WRVIgdmVyc2lvbiBvZiBjb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoc2VjdGlvbl9uYW1lLCAoY2hhciAqKShlbGYuYnVmICsgc3RydGFiX29mZjY0ICsgZGhkci5zaF9uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dfbXNnKCJTZWN0aW9uX25hbWU6ICVzLCBTZWN0aW9uX3R5cGU6ICVkXG4iLCBzZWN0aW9uX25hbWUsIGRoZHIuc2hfdHlwZSk7ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyY21wKHNlY3Rpb25fbmFtZSwgIi5ic3MiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVvZih2YWwpICE9IHN5bS5zdF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCB2YWx1ZSBpcyBkZWNsYXJlZCBhcyBhbiBpbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXNtXypfb2Zmc2V0cy5jLCB3aGljaCBpcyA0IGJ5dGVzIG9uIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0YXJnZXRzIHdlIGN1cnJlbnRseSB1c2UuIENvbXBsYWluIGxvdWRseSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIG5vdCB0cnVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZygiU3ltYm9sIHNpemUgaXMgd3JvbmdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZi5idWYgKyBkaGRyLnNoX29mZnNldCArIHN5bS5zdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnN0X3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZi5sZV9kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2coIkJpZyBFbmRpYW4gZGF0YSBub3Qgc3VwcG9ydGVkIHlldCFcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1VUUFVUX0ZNVF9SVkRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUtNDBzIEVRVSAlNWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc3RyaW5nX3RhYmxlKCZlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZHIuc2hfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnN0X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPVVRQVVRfRk1UX0dBUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuZXF1ICUtNDBzLCAlNWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lbGZfc3RyaW5nX3RhYmxlKCZlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZHIuc2hfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnN0X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZWxmX3N0cmluZ190YWJsZSgmZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGRyLnNoX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5zdF9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kZSA9PSBPVVRQVVRfRk1UX1JWRFMpCisgICAgICAgIHByaW50ZigiICAgIEVORFxuIik7CisKKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgbG9nX21zZygiUGFyc2UgZXJyb3I6IEZpbGUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHZhbGlkIEVMRjMyIG9yIEVMRjY0XG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gKi8KKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorLyogIFNlZSAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIKKyAgICBmb3IgcmVmZXJlbmNlLgorKi8KKyNkZWZpbmUgZ2V0X2xlMzIoeCkgKCgqKHgpKSB8ICgqKHgrMSkpIDw8IDggfCgqKHgrMikpIDw8IDE2IHwgKCooeCszKSkgPDwgMjQgKQorI2RlZmluZSBnZXRfbGUxNih4KSAoKCooeCkpIHwgKCooeCsxKSkgPDwgOCkKKworaW50IHBhcnNlX2NvZmYodWludDhfdCAqYnVmLCBzaXplX3Qgc3opCit7CisgICAgdW5zaWduZWQgaW50IG5zZWN0aW9ucywgc3ltdGFiX3B0ciwgc3ltdGFiX3N6LCBzdHJ0YWJfcHRyOworICAgIHVuc2lnbmVkIGludCBzZWN0aW9ucmF3ZGF0YV9wdHI7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdWludDhfdCAqcHRyOworICAgIHVpbnQzMl90IHN5bW9mZnNldDsKKworICAgIGNoYXIgKipzZWN0aW9ubGlzdDsgIC8vdGhpcyBhcnJheSBob2xkcyBhbGwgc2VjdGlvbiBuYW1lcyBpbiB0aGVpciBjb3JyZWN0IG9yZGVyLgorICAgIC8vaXQgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgc3ltYm9sIGlzIGluIC5ic3Mgb3IgLnJkYXRhIHNlY3Rpb24uCisKKyAgICBuc2VjdGlvbnMgPSBnZXRfbGUxNihidWYgKyAyKTsKKyAgICBzeW10YWJfcHRyID0gZ2V0X2xlMzIoYnVmICsgOCk7CisgICAgc3ltdGFiX3N6ID0gZ2V0X2xlMzIoYnVmICsgMTIpOworICAgIHN0cnRhYl9wdHIgPSBzeW10YWJfcHRyICsgc3ltdGFiX3N6ICogMTg7CisKKyAgICBpZiAobnNlY3Rpb25zID4gOTYpCisgICAgeworICAgICAgICBsb2dfbXNnKCJUb28gbWFueSBzZWN0aW9uc1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHNlY3Rpb25saXN0ID0gbWFsbG9jKG5zZWN0aW9ucyAqIHNpemVvZihzZWN0aW9ubGlzdCkpOworCisgICAgaWYgKHNlY3Rpb25saXN0ID09IE5VTEwpCisgICAgeworICAgICAgICBsb2dfbXNnKCJBbGxvY2F0aW5nIGZpcnN0IGxldmVsIG9mIHNlY3Rpb24gbGlzdCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvL2xvZ19tc2coIkNPRkY6IEZvdW5kICV1IHN5bWJvbHMgaW4gJXUgc2VjdGlvbnMuXG4iLCBzeW10YWJfc3osIG5zZWN0aW9ucyk7CisKKyAgICAvKgorICAgIFRoZSBzaXplIG9mIG9wdGlvbmFsIGhlYWRlciBpcyBhbHdheXMgemVybyBmb3IgYW4gb2JqIGZpbGUuIFNvLCB0aGUgc2VjdGlvbiBoZWFkZXIKKyAgICBmb2xsb3dzIHRoZSBmaWxlIGhlYWRlciBpbW1lZGlhdGVseS4KKyAgICAqLworCisgICAgcHRyID0gYnVmICsgMjA7ICAgICAvL3NlY3Rpb24gaGVhZGVyCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnNlY3Rpb25zOyBpKyspCisgICAgeworICAgICAgICBjaGFyIHNlY3Rpb25uYW1lWzldID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICBzdHJuY3B5KHNlY3Rpb25uYW1lLCBwdHIsIDgpOworICAgICAgICAvL2xvZ19tc2coIkNPRkY6IFBhcnNpbmcgc2VjdGlvbiAlc1xuIixzZWN0aW9ubmFtZSk7CisKKyAgICAgICAgc2VjdGlvbmxpc3RbaV0gPSBtYWxsb2Moc3RybGVuKHNlY3Rpb25uYW1lKSArIDEpOworCisgICAgICAgIGlmIChzZWN0aW9ubGlzdFtpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dfbXNnKCJBbGxvY2F0aW5nIHN0b3JhZ2UgZm9yICVzIGZhaWxlZFxuIiwgc2VjdGlvbm5hbWUpOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIHN0cmNweShzZWN0aW9ubGlzdFtpXSwgc2VjdGlvbm5hbWUpOworCisgICAgICAgIGlmICghc3RyY21wKHNlY3Rpb25uYW1lLCAiLnJkYXRhIikpIHNlY3Rpb25yYXdkYXRhX3B0ciA9IGdldF9sZTMyKHB0ciArIDIwKTsKKworICAgICAgICBwdHIgKz0gNDA7CisgICAgfQorCisgICAgLy9sb2dfbXNnKCJDT0ZGOiBTeW1ib2wgdGFibGUgYXQgb2Zmc2V0ICV1XG4iLCBzeW10YWJfcHRyKTsKKyAgICAvL2xvZ19tc2coIkNPRkY6IHJhdyBkYXRhIHBvaW50ZXIgb2ZzZXQgZm9yIHNlY3Rpb24gLnJkYXRhIGlzICV1XG4iLCBzZWN0aW9ucmF3ZGF0YV9wdHIpOworCisgICAgLyogIFRoZSBjb21waWxlciBwdXRzIHRoZSBkYXRhIHdpdGggbm9uLXplcm8gb2Zmc2V0IGluIC5yZGF0YSBzZWN0aW9uLCBidXQgcHV0cyB0aGUgZGF0YSB3aXRoCisgICAgICAgIHplcm8gb2Zmc2V0IGluIC5ic3Mgc2VjdGlvbi4gU28sIGlmIHRoZSBkYXRhIGluIGluIC5ic3Mgc2VjdGlvbiwgc2V0IG9mZnNldD0wLgorICAgICAgICBOb3RlIGZyb20gV2lraTogSW4gYW4gb2JqZWN0IG1vZHVsZSBjb21waWxlZCBmcm9tIEMsIHRoZSBic3Mgc2VjdGlvbiBjb250YWlucworICAgICAgICB0aGUgbG9jYWwgdmFyaWFibGVzIChidXQgbm90IGZ1bmN0aW9ucykgdGhhdCB3ZXJlIGRlY2xhcmVkIHdpdGggdGhlIHN0YXRpYyBrZXl3b3JkLAorICAgICAgICBleGNlcHQgZm9yIHRob3NlIHdpdGggbm9uLXplcm8gaW5pdGlhbCB2YWx1ZXMuIChJbiBDLCBzdGF0aWMgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZAorICAgICAgICB0byB6ZXJvIGJ5IGRlZmF1bHQuKSBJdCBhbHNvIGNvbnRhaW5zIHRoZSBub24tbG9jYWwgKGJvdGggZXh0ZXJuIGFuZCBzdGF0aWMpIHZhcmlhYmxlcworICAgICAgICB0aGF0IGFyZSBhbHNvIGluaXRpYWxpemVkIHRvIHplcm8gKGVpdGhlciBleHBsaWNpdGx5IG9yIGJ5IGRlZmF1bHQpLgorICAgICAgICAqLworICAgIC8vbW92ZSB0byBzeW1ib2wgdGFibGUKKyAgICAvKiBDT0ZGIHN5bWJvbCB0YWJsZToKKyAgICAgICAgb2Zmc2V0ICAgICAgZmllbGQKKyAgICAgICAgMCAgICAgICAgICAgTmFtZSgqKQorICAgICAgICA4ICAgICAgICAgICBWYWx1ZQorICAgICAgICAxMiAgICAgICAgICBTZWN0aW9uTnVtYmVyCisgICAgICAgIDE0ICAgICAgICAgIFR5cGUKKyAgICAgICAgMTYgICAgICAgICAgU3RvcmFnZUNsYXNzCisgICAgICAgIDE3ICAgICAgICAgIE51bWJlck9mQXV4U3ltYm9scworICAgICAgICAqLworICAgIHB0ciA9IGJ1ZiArIHN5bXRhYl9wdHI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX3N6OyBpKyspCisgICAgeworICAgICAgICBpbnQxNl90IHNlY3Rpb24gPSBnZXRfbGUxNihwdHIgKyAxMik7IC8vc2VjdGlvbiBudW1iZXIKKworICAgICAgICBpZiAoc2VjdGlvbiA+IDAgJiYgcHRyWzE2XSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICAvL2lmKHNlY3Rpb24gPiAwICYmIHB0clsxNl0gPT0gMyAmJiBnZXRfbGUzMihwdHIrOCkpIHsKKworICAgICAgICAgICAgaWYgKGdldF9sZTMyKHB0cikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBuYW1lWzldID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICAgICAgICAgIHN0cm5jcHkobmFtZSwgcHRyLCA4KTsKKyAgICAgICAgICAgICAgICAvL2xvZ19tc2coIkNPRkY6IFBhcnNpbmcgc3ltYm9sICVzXG4iLG5hbWUpOworICAgICAgICAgICAgICAgIC8qIFRoZSA2NGJpdCBXaW5kb3dzIGNvbXBpbGVyIGRvZXNuJ3QgcHJlZml4IHdpdGggYW4gXy4KKyAgICAgICAgICAgICAgICAgKiBDaGVjayB3aGF0J3MgdGhlcmUsIGFuZCBidW1wIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICdfJykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgIiwgbmFtZSArIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgIiwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9sb2dfbXNnKCJDT0ZGOiBQYXJzaW5nIHN5bWJvbCAlc1xuIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgYnVmICsgc3RydGFiX3B0ciArIGdldF9sZTMyKHB0cis0KSk7CisgICAgICAgICAgICAgICAgaWYgKChidWYgKyBzdHJ0YWJfcHRyICsgZ2V0X2xlMzIocHRyICsgNCkpWzBdID09ICdfJykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIHN0cnRhYl9wdHIgKyBnZXRfbGUzMihwdHIgKyA0KSArIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTQwcyBFUVUgIiwgYnVmICsgc3RydGFiX3B0ciArIGdldF9sZTMyKHB0ciArIDQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoc3RyY21wKHNlY3Rpb25saXN0W3NlY3Rpb24tMV0sICIuYnNzIikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bW9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ltb2Zmc2V0ID0gZ2V0X2xlMzIoYnVmICsgc2VjdGlvbnJhd2RhdGFfcHRyICsgZ2V0X2xlMzIocHRyICsgOCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL2xvZ19tc2coIiAgICAgIFNlY3Rpb246ICVkXG4iLHNlY3Rpb24pOworICAgICAgICAgICAgLy9sb2dfbXNnKCIgICAgICBDbGFzczogICAlZFxuIixwdHJbMTZdKTsKKyAgICAgICAgICAgIC8vbG9nX21zZygiICAgICAgQWRkcmVzczogJXVcbiIsZ2V0X2xlMzIocHRyKzgpKTsKKyAgICAgICAgICAgIC8vbG9nX21zZygiICAgICAgT2Zmc2V0OiAldVxuIiwgc3ltb2Zmc2V0KTsKKworICAgICAgICAgICAgcHJpbnRmKCIlNWRcbiIsIHN5bW9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBwdHIgKz0gMTg7CisgICAgfQorCisgICAgcHJpbnRmKCIgICAgRU5EXG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKKyAgICB7CisgICAgICAgIGZyZWUoc2VjdGlvbmxpc3RbaV0pOworICAgIH0KKworICAgIGZyZWUoc2VjdGlvbmxpc3QpOworCisgICAgcmV0dXJuIDA7CitiYWlsOgorCisgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQorICAgIHsKKyAgICAgICAgZnJlZShzZWN0aW9ubGlzdFtpXSk7CisgICAgfQorCisgICAgZnJlZShzZWN0aW9ubGlzdCk7CisKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBvdXRwdXRfZm10X3QgbW9kZSA9IE9VVFBVVF9GTVRfUExBSU47CisgICAgY29uc3QgY2hhciAqZjsKKyAgICB1aW50OF90ICpmaWxlX2J1ZjsKKyAgICBpbnQgcmVzOworICAgIEZJTEUgKmZwOworICAgIGxvbmcgaW50IGZpbGVfc2l6ZTsKKworICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvdXRwdXQgZm9ybWF0XSA8b2JqIGZpbGU+XG5cbiIsIGFyZ3ZbMF0pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgPG9iaiBmaWxlPlx0b2JqZWN0IGZpbGUgdG8gcGFyc2VcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBGb3JtYXRzOlxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBnYXMgIC0gY29tcGF0aWJsZSB3aXRoIEdOVSBhc3NlbWJsZXJcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgcnZkcyAtIGNvbXBhdGlibGUgd2l0aCBhcm1hc21cbiIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgZiA9IGFyZ3ZbMl07CisKKyAgICBpZiAoIXN0cmNtcChhcmd2WzFdLCAicnZkcyIpKQorICAgICAgICBtb2RlID0gT1VUUFVUX0ZNVF9SVkRTOworICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImdhcyIpKQorICAgICAgICBtb2RlID0gT1VUUFVUX0ZNVF9HQVM7CisgICAgZWxzZQorICAgICAgICBmID0gYXJndlsxXTsKKworICAgIGZwID0gZm9wZW4oZiwgInJiIik7CisKKyAgICBpZiAoIWZwKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJVbmFibGUgdG8gb3BlbiBmaWxlIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoZnNlZWsoZnAsIDAsIFNFRUtfRU5EKSkKKyAgICB7CisgICAgICAgIHBlcnJvcigic3RhdCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgZmlsZV9zaXplID0gZnRlbGwoZnApOworICAgIGZpbGVfYnVmID0gbWFsbG9jKGZpbGVfc2l6ZSk7CisKKyAgICBpZiAoIWZpbGVfYnVmKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJtYWxsb2MiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIHJld2luZChmcCk7CisKKyAgICBpZiAoZnJlYWQoZmlsZV9idWYsIHNpemVvZihjaGFyKSwgZmlsZV9zaXplLCBmcCkgIT0gZmlsZV9zaXplKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJyZWFkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoZmNsb3NlKGZwKSkKKyAgICB7CisgICAgICAgIHBlcnJvcigiY2xvc2UiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCisjaWYgZGVmaW5lZChfX01BQ0hfXykKKyAgICByZXMgPSBwYXJzZV9tYWNobyhmaWxlX2J1ZiwgZmlsZV9zaXplKTsKKyNlbGlmIGRlZmluZWQoX19FTEZfXykKKyAgICByZXMgPSBwYXJzZV9lbGYoZmlsZV9idWYsIGZpbGVfc2l6ZSwgbW9kZSk7CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyAgICByZXMgPSBwYXJzZV9jb2ZmKGZpbGVfYnVmLCBmaWxlX3NpemUpOworI2VuZGlmCisKKyAgICBmcmVlKGZpbGVfYnVmKTsKKworICAgIGlmICghcmVzKQorICAgICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworCitiYWlsOgorICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvYnVpbGQvbWFrZS9ydGNkLnNoIGIvbGlidnB4L2J1aWxkL21ha2UvcnRjZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZGY5ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2J1aWxkL21ha2UvcnRjZC5zaApAQCAtMCwwICsxLDM1NiBAQAorIyEvYmluL3NoCitzZWxmPSQwCisKK3VzYWdlKCkgeworICBjYXQgPDxFT0YgPiYyCitVc2FnZTogJHNlbGYgW29wdGlvbnNdIEZJTEUKKworUmVhZHMgdGhlIFJ1biBUaW1lIENQVSBEZXRlY3Rpb25zIGRlZmluaXRpb25zIGZyb20gRklMRSBhbmQgZ2VuZXJhdGVzIGEKK0MgaGVhZGVyIGZpbGUgb24gc3Rkb3V0LgorCitPcHRpb25zOgorICAtLWFyY2g9QVJDSCAgIEFyY2hpdGVjdHVyZSB0byBnZW5lcmF0ZSBkZWZzIGZvciAocmVxdWlyZWQpCisgIC0tZGlzYWJsZS1FWFQgRGlzYWJsZSBzdXBwb3J0IGZvciBFWFQgZXh0ZW5zaW9ucworICAtLXJlcXVpcmUtRVhUIFJlcXVpcmUgc3VwcG9ydCBmb3IgRVhUIGV4dGVuc2lvbnMKKyAgLS1zeW09U1lNQk9MICBVbmlxdWUgc3ltYm9sIHRvIHVzZSBmb3IgUlRDRCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICAtLWNvbmZpZz1GSUxFIEZpbGUgd2l0aCBDT05GSUdfRk9PPXllcyBsaW5lcyB0byBwYXJzZQorRU9GCisgIGV4aXQgMQorfQorCitkaWUoKSB7CisgIGVjaG8gIiRAIiA+JjIKKyAgZXhpdCAxCit9CisKK2RpZV9hcmd1bWVudF9yZXF1aXJlZCgpIHsKKyAgZGllICJPcHRpb24gJG9wdCByZXF1aXJlcyBhcmd1bWVudCIKK30KKworZm9yIG9wdDsgZG8KKyAgb3B0dmFsPSIke29wdCMqPX0iCisgIGNhc2UgIiRvcHQiIGluCisgICAgLS1hcmNoKSBkaWVfYXJndW1lbnRfcmVxdWlyZWQ7OworICAgIC0tYXJjaD0qKSBhcmNoPSR7b3B0dmFsfTs7CisgICAgLS1kaXNhYmxlLSopIGV2YWwgImRpc2FibGVfJHtvcHQjLS1kaXNhYmxlLX09dHJ1ZSI7OworICAgIC0tcmVxdWlyZS0qKSBSRVFVSVJFUz0iJHtSRVFVSVJFU30ke29wdCMtLXJlcXVpcmUtfSAiOzsKKyAgICAtLXN5bSkgZGllX2FyZ3VtZW50X3JlcXVpcmVkOzsKKyAgICAtLXN5bT0qKSBzeW1ib2w9JHtvcHR2YWx9OzsKKyAgICAtLWNvbmZpZz0qKSBjb25maWdfZmlsZT0ke29wdHZhbH07OworICAgIC1ofC0taGVscCkKKyAgICAgIHVzYWdlCisgICAgICA7OworICAgIC0qKQorICAgICAgZGllICJVbnJlY29nbml6ZWQgb3B0aW9uOiAke29wdCUlPSp9IgorICAgICAgOzsKKyAgICAqKQorICAgICAgZGVmc19maWxlPSIkZGVmc19maWxlICRvcHQiCisgICAgICA7OworICBlc2FjCisgIHNoaWZ0Citkb25lCitmb3IgZiBpbiAkZGVmc19maWxlOyBkbyBbIC1mICIkZiIgXSB8fCB1c2FnZTsgZG9uZQorWyAtbiAiJGFyY2giIF0gfHwgdXNhZ2UKKworIyBJbXBvcnQgdGhlIGNvbmZpZ3VyYXRpb24KK1sgLWYgIiRjb25maWdfZmlsZSIgXSAmJiBldmFsICQoZ3JlcCBDT05GSUdfICIkY29uZmlnX2ZpbGUiKQorCisjCisjIFJvdXRpbmVzIGZvciB0aGUgUlRDRCBEU0wgdG8gY2FsbAorIworcHJvdG90eXBlKCkgeworICBsb2NhbCBydHlwCisgIGNhc2UgIiQxIiBpbgorICAgIHVuc2lnbmVkKSBydHlwPSIkMSAiOyBzaGlmdDs7CisgIGVzYWMKKyAgcnR5cD0iJHtydHlwfSQxIgorICBsb2NhbCBmbj0iJDIiCisgIGxvY2FsIGFyZ3M9IiQzIgorCisgIGV2YWwgIiR7Mn1fcnR5cD0nJHJ0eXAnIgorICBldmFsICIkezJ9X2FyZ3M9JyQzJyIKKyAgQUxMX0ZVTkNTPSIkQUxMX0ZVTkNTICRmbiIKKyAgc3BlY2lhbGl6ZSAkZm4gYworfQorCitzcGVjaWFsaXplKCkgeworICBsb2NhbCBmbj0iJDEiCisgIHNoaWZ0CisgIGZvciBvcHQgaW4gIiRAIjsgZG8KKyAgICBldmFsICIke2ZufV8ke29wdH09JHtmbn1fJHtvcHR9IgorICBkb25lCit9CisKK3JlcXVpcmUoKSB7CisgIGZvciBmbiBpbiAkQUxMX0ZVTkNTOyBkbworICAgIGZvciBvcHQgaW4gIiRAIjsgZG8KKyAgICAgIGxvY2FsIG9mbj0kKGV2YWwgImVjaG8gXCQke2ZufV8ke29wdH0iKQorICAgICAgWyAteiAiJG9mbiIgXSAmJiBjb250aW51ZQorCisgICAgICAjIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGRlZmF1bHQsIHRoZW4gd2UgY2FuIGRpc2FibGUgaXQsIGFzIHdlIGtub3cKKyAgICAgICMgd2UgY2FuIGRvIGJldHRlci4KKyAgICAgIGxvY2FsIGJlc3Q9JChldmFsICJlY2hvIFwkJHtmbn1fZGVmYXVsdCIpCisgICAgICBsb2NhbCBiZXN0X29mbj0kKGV2YWwgImVjaG8gXCQke2Jlc3R9IikKKyAgICAgIFsgLW4gIiRiZXN0IiBdICYmIFsgIiRiZXN0X29mbiIgIT0gIiRvZm4iIF0gJiYgZXZhbCAiJHtiZXN0fV9saW5rPWZhbHNlIgorICAgICAgZXZhbCAiJHtmbn1fZGVmYXVsdD0ke2ZufV8ke29wdH0iCisgICAgICBldmFsICIke2ZufV8ke29wdH1fbGluaz10cnVlIgorICAgIGRvbmUKKyAgZG9uZQorfQorCitmb3J3YXJkX2RlY2xzKCkgeworICBBTExfRk9SV0FSRF9ERUNMUz0iJEFMTF9GT1JXQVJEX0RFQ0xTICQxIgorfQorCisjCisjIEluY2x1ZGUgdGhlIHVzZXIncyBkaXJlY3RpdmVzCisjCitmb3IgZiBpbiAkZGVmc19maWxlOyBkbworICAuICRmCitkb25lCisKKyMKKyMgUHJvY2VzcyB0aGUgZGlyZWN0aXZlcyBhY2NvcmRpbmcgdG8gdGhlIGNvbW1hbmQgbGluZQorIworcHJvY2Vzc19mb3J3YXJkX2RlY2xzKCkgeworICBmb3IgZm4gaW4gJEFMTF9GT1JXQVJEX0RFQ0xTOyBkbworICAgIGV2YWwgJGZuCisgIGRvbmUKK30KKworZGV0ZXJtaW5lX2luZGlyZWN0aW9uKCkgeworICBbICIkQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVCIgPSAieWVzIiBdIHx8IHJlcXVpcmUgJEFMTF9BUkNIUworICBmb3IgZm4gaW4gJEFMTF9GVU5DUzsgZG8KKyAgICBsb2NhbCBuPSIiCisgICAgbG9jYWwgcnR5cD0iJChldmFsICJlY2hvIFwkJHtmbn1fcnR5cCIpIgorICAgIGxvY2FsIGFyZ3M9IiQoZXZhbCAiZWNobyBcIlwkJHtmbn1fYXJnc1wiIikiCisgICAgbG9jYWwgZGZuPSIkKGV2YWwgImVjaG8gXCQke2ZufV9kZWZhdWx0IikiCisgICAgZGZuPSQoZXZhbCAiZWNobyBcJCR7ZGZufSIpCisgICAgZm9yIG9wdCBpbiAiJEAiOyBkbworICAgICAgbG9jYWwgb2ZuPSQoZXZhbCAiZWNobyBcJCR7Zm59XyR7b3B0fSIpCisgICAgICBbIC16ICIkb2ZuIiBdICYmIGNvbnRpbnVlCisgICAgICBsb2NhbCBsaW5rPSQoZXZhbCAiZWNobyBcJCR7Zm59XyR7b3B0fV9saW5rIikKKyAgICAgIFsgIiRsaW5rIiA9ICJmYWxzZSIgXSAmJiBjb250aW51ZQorICAgICAgbj0iJHtufXgiCisgICAgZG9uZQorICAgIGlmIFsgIiRuIiA9ICJ4IiBdOyB0aGVuCisgICAgICBldmFsICIke2ZufV9pbmRpcmVjdD1mYWxzZSIKKyAgICBlbHNlCisgICAgICBldmFsICIke2ZufV9pbmRpcmVjdD10cnVlIgorICAgIGZpCisgIGRvbmUKK30KKworZGVjbGFyZV9mdW5jdGlvbl9wb2ludGVycygpIHsKKyAgZm9yIGZuIGluICRBTExfRlVOQ1M7IGRvCisgICAgbG9jYWwgcnR5cD0iJChldmFsICJlY2hvIFwkJHtmbn1fcnR5cCIpIgorICAgIGxvY2FsIGFyZ3M9IiQoZXZhbCAiZWNobyBcIlwkJHtmbn1fYXJnc1wiIikiCisgICAgbG9jYWwgZGZuPSIkKGV2YWwgImVjaG8gXCQke2ZufV9kZWZhdWx0IikiCisgICAgZGZuPSQoZXZhbCAiZWNobyBcJCR7ZGZufSIpCisgICAgZm9yIG9wdCBpbiAiJEAiOyBkbworICAgICAgbG9jYWwgb2ZuPSQoZXZhbCAiZWNobyBcJCR7Zm59XyR7b3B0fSIpCisgICAgICBbIC16ICIkb2ZuIiBdICYmIGNvbnRpbnVlCisgICAgICBlY2hvICIkcnR5cCAke29mbn0oJGFyZ3MpOyIKKyAgICBkb25lCisgICAgaWYgWyAiJChldmFsICJlY2hvIFwkJHtmbn1faW5kaXJlY3QiKSIgPSAiZmFsc2UiIF07IHRoZW4KKyAgICAgIGVjaG8gIiNkZWZpbmUgJHtmbn0gJHtkZm59IgorICAgIGVsc2UKKyAgICAgIGVjaG8gIlJUQ0RfRVhURVJOICRydHlwICgqJHtmbn0pKCRhcmdzKTsiCisgICAgZmkKKyAgICBlY2hvCisgIGRvbmUKK30KKworc2V0X2Z1bmN0aW9uX3BvaW50ZXJzKCkgeworICBmb3IgZm4gaW4gJEFMTF9GVU5DUzsgZG8KKyAgICBsb2NhbCBuPSIiCisgICAgbG9jYWwgcnR5cD0iJChldmFsICJlY2hvIFwkJHtmbn1fcnR5cCIpIgorICAgIGxvY2FsIGFyZ3M9IiQoZXZhbCAiZWNobyBcIlwkJHtmbn1fYXJnc1wiIikiCisgICAgbG9jYWwgZGZuPSIkKGV2YWwgImVjaG8gXCQke2ZufV9kZWZhdWx0IikiCisgICAgZGZuPSQoZXZhbCAiZWNobyBcJCR7ZGZufSIpCisgICAgaWYgJChldmFsICJlY2hvIFwkJHtmbn1faW5kaXJlY3QiKTsgdGhlbgorICAgICAgZWNobyAiICAgICRmbiA9ICRkZm47IgorICAgICAgZm9yIG9wdCBpbiAiJEAiOyBkbworICAgICAgICBsb2NhbCBvZm49JChldmFsICJlY2hvIFwkJHtmbn1fJHtvcHR9IikKKyAgICAgICAgWyAteiAiJG9mbiIgXSAmJiBjb250aW51ZQorICAgICAgICBbICIkb2ZuIiA9ICIkZGZuIiBdICYmIGNvbnRpbnVlOworICAgICAgICBsb2NhbCBsaW5rPSQoZXZhbCAiZWNobyBcJCR7Zm59XyR7b3B0fV9saW5rIikKKyAgICAgICAgWyAiJGxpbmsiID0gImZhbHNlIiBdICYmIGNvbnRpbnVlCisgICAgICAgIGxvY2FsIGNvbmQ9IiQoZXZhbCAiZWNobyBcJGhhdmVfJHtvcHR9IikiCisgICAgICAgIGVjaG8gIiAgICBpZiAoJHtjb25kfSkgJGZuID0gJG9mbjsiCisgICAgICBkb25lCisgICAgZmkKKyAgICBlY2hvCisgIGRvbmUKK30KKworZmlsdGVyKCkgeworICBsb2NhbCBmaWx0ZXJlZAorICBmb3Igb3B0IGluICIkQCI7IGRvCisgICAgWyAteiAkKGV2YWwgImVjaG8gXCRkaXNhYmxlXyR7b3B0fSIpIF0gJiYgZmlsdGVyZWQ9IiRmaWx0ZXJlZCAkb3B0IgorICBkb25lCisgIGVjaG8gJGZpbHRlcmVkCit9CisKKyMKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgYXJjaCBzcGVjaWZpYyBSVENEIGZpbGVzCisjCitjb21tb25fdG9wKCkgeworICBsb2NhbCBvdXRmaWxlX2Jhc2VuYW1lPSQoYmFzZW5hbWUgJHtzeW1ib2w6LXJ0Y2QuaH0pCisgIGxvY2FsIGluY2x1ZGVfZ3VhcmQ9JChlY2hvICRvdXRmaWxlX2Jhc2VuYW1lIHwgdHIgJ1thLXpdJyAnW0EtWl0nIHwgdHIgLWMgJ1tBLVpdJyBfKQorICBjYXQgPDxFT0YKKyNpZm5kZWYgJHtpbmNsdWRlX2d1YXJkfQorI2RlZmluZSAke2luY2x1ZGVfZ3VhcmR9CisKKyNpZmRlZiBSVENEX0MKKyNkZWZpbmUgUlRDRF9FWFRFUk4KKyNlbHNlCisjZGVmaW5lIFJUQ0RfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKyQocHJvY2Vzc19mb3J3YXJkX2RlY2xzKQorCiskKGRlY2xhcmVfZnVuY3Rpb25fcG9pbnRlcnMgYyAkQUxMX0FSQ0hTKQorCit2b2lkICR7c3ltYm9sOi1ydGNkfSh2b2lkKTsKK0VPRgorfQorCitjb21tb25fYm90dG9tKCkgeworICBjYXQgPDxFT0YKKyNlbmRpZgorRU9GCit9CisKK3g4NigpIHsKKyAgZGV0ZXJtaW5lX2luZGlyZWN0aW9uIGMgJEFMTF9BUkNIUworCisgICMgQXNzaWduIHRoZSBoZWxwZXIgdmFyaWFibGUgZm9yIGVhY2ggZW5hYmxlZCBleHRlbnNpb24KKyAgZm9yIG9wdCBpbiAkQUxMX0FSQ0hTOyBkbworICAgIGxvY2FsIHVjPSQoZWNobyAkb3B0IHwgdHIgJ1thLXpdJyAnW0EtWl0nKQorICAgIGV2YWwgImhhdmVfJHtvcHR9PVwiZmxhZ3MgJiBIQVNfJHt1Y31cIiIKKyAgZG9uZQorCisgIGNhdCA8PEVPRgorJChjb21tb25fdG9wKQorCisjaWZkZWYgUlRDRF9DCisjaW5jbHVkZSAidnB4X3BvcnRzL3g4Ni5oIgorc3RhdGljIHZvaWQgc2V0dXBfcnRjZF9pbnRlcm5hbCh2b2lkKQoreworICAgIGludCBmbGFncyA9IHg4Nl9zaW1kX2NhcHMoKTsKKworICAgICh2b2lkKWZsYWdzOworCiskKHNldF9mdW5jdGlvbl9wb2ludGVycyBjICRBTExfQVJDSFMpCit9CisjZW5kaWYKKyQoY29tbW9uX2JvdHRvbSkKK0VPRgorfQorCithcm0oKSB7CisgIGRldGVybWluZV9pbmRpcmVjdGlvbiBjICRBTExfQVJDSFMKKworICAjIEFzc2lnbiB0aGUgaGVscGVyIHZhcmlhYmxlIGZvciBlYWNoIGVuYWJsZWQgZXh0ZW5zaW9uCisgIGZvciBvcHQgaW4gJEFMTF9BUkNIUzsgZG8KKyAgICBsb2NhbCB1Yz0kKGVjaG8gJG9wdCB8IHRyICdbYS16XScgJ1tBLVpdJykKKyAgICBldmFsICJoYXZlXyR7b3B0fT1cImZsYWdzICYgSEFTXyR7dWN9XCIiCisgIGRvbmUKKworICBjYXQgPDxFT0YKKyQoY29tbW9uX3RvcCkKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKKyNpZmRlZiBSVENEX0MKKyNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCitzdGF0aWMgdm9pZCBzZXR1cF9ydGNkX2ludGVybmFsKHZvaWQpCit7CisgICAgaW50IGZsYWdzID0gYXJtX2NwdV9jYXBzKCk7CisKKyAgICAodm9pZClmbGFnczsKKworJChzZXRfZnVuY3Rpb25fcG9pbnRlcnMgYyAkQUxMX0FSQ0hTKQorfQorI2VuZGlmCiskKGNvbW1vbl9ib3R0b20pCitFT0YKK30KKworCittaXBzKCkgeworICBkZXRlcm1pbmVfaW5kaXJlY3Rpb24gYyAkQUxMX0FSQ0hTCisgIGNhdCA8PEVPRgorJChjb21tb25fdG9wKQorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKworI2lmZGVmIFJUQ0RfQworc3RhdGljIHZvaWQgc2V0dXBfcnRjZF9pbnRlcm5hbCh2b2lkKQoreworJChzZXRfZnVuY3Rpb25fcG9pbnRlcnMgYyAkQUxMX0FSQ0hTKQorI2lmIEhBVkVfRFNQUjIKK3ZvaWQgZHNwdXRpbF9zdGF0aWNfaW5pdCgpOworZHNwdXRpbF9zdGF0aWNfaW5pdCgpOworI2VuZGlmCit9CisjZW5kaWYKKyQoY29tbW9uX2JvdHRvbSkKK0VPRgorfQorCit1bm9wdGltaXplZCgpIHsKKyAgZGV0ZXJtaW5lX2luZGlyZWN0aW9uIGMKKyAgY2F0IDw8RU9GCiskKGNvbW1vbl90b3ApCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorCisjaWZkZWYgUlRDRF9DCitzdGF0aWMgdm9pZCBzZXR1cF9ydGNkX2ludGVybmFsKHZvaWQpCit7CiskKHNldF9mdW5jdGlvbl9wb2ludGVycyBjKQorfQorI2VuZGlmCiskKGNvbW1vbl9ib3R0b20pCitFT0YKKworfQorIworIyBNYWluIERyaXZlcgorIworcmVxdWlyZSBjCitjYXNlICRhcmNoIGluCisgIHg4NikKKyAgICBBTExfQVJDSFM9JChmaWx0ZXIgbW14IHNzZSBzc2UyIHNzZTMgc3NzZTMgc3NlNF8xKQorICAgIHg4NgorICAgIDs7CisgIHg4Nl82NCkKKyAgICBBTExfQVJDSFM9JChmaWx0ZXIgbW14IHNzZSBzc2UyIHNzZTMgc3NzZTMgc3NlNF8xKQorICAgIFJFUVVJUkVTPSR7UkVRVUlSRVM6LW1teCBzc2Ugc3NlMn0KKyAgICByZXF1aXJlICQoZmlsdGVyICRSRVFVSVJFUykKKyAgICB4ODYKKyAgICA7OworICBtaXBzMzIpCisgICAgQUxMX0FSQ0hTPSQoZmlsdGVyIG1pcHMzMikKKyAgICBkc3ByMj0kKFsgLWYgIiRjb25maWdfZmlsZSIgXSAmJiBldmFsIGVjaG8gJChncmVwIEhBVkVfRFNQUjIgIiRjb25maWdfZmlsZSIpKQorICAgIEhBVkVfRFNQUjI9IiR7ZHNwcjIjKj19IgorICAgIGlmIFsgIiRIQVZFX0RTUFIyIiA9ICJ5ZXMiIF07IHRoZW4KKyAgICAgICAgQUxMX0FSQ0hTPSQoZmlsdGVyIG1pcHMzMiBkc3ByMikKKyAgICBmaQorICAgIG1pcHMKKyAgICA7OworICBhcm12NXRlKQorICAgIEFMTF9BUkNIUz0kKGZpbHRlciBlZHNwKQorICAgIGFybQorICAgIDs7CisgIGFybXY2KQorICAgIEFMTF9BUkNIUz0kKGZpbHRlciBlZHNwIG1lZGlhKQorICAgIGFybQorICAgIDs7CisgIGFybXY3KQorICAgIEFMTF9BUkNIUz0kKGZpbHRlciBlZHNwIG1lZGlhIG5lb24pCisgICAgYXJtCisgICAgOzsKKyAgKikKKyAgICB1bm9wdGltaXplZAorICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS9idWlsZC9tYWtlL3ZlcnNpb24uc2ggYi9saWJ2cHgvYnVpbGQvbWFrZS92ZXJzaW9uLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWlsZC9tYWtlL3ZlcnNpb24uc2gKcmVuYW1lIHRvIGxpYnZweC9idWlsZC9tYWtlL3ZlcnNpb24uc2gKZGlmZiAtLWdpdCBhL2J1aWxkL3g4Ni1tc3ZzL29ial9pbnRfZXh0cmFjdC5iYXQgYi9saWJ2cHgvYnVpbGQveDg2LW1zdnMvb2JqX2ludF9leHRyYWN0LmJhdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQveDg2LW1zdnMvb2JqX2ludF9leHRyYWN0LmJhdApyZW5hbWUgdG8gbGlidnB4L2J1aWxkL3g4Ni1tc3ZzL29ial9pbnRfZXh0cmFjdC5iYXQKZGlmZiAtLWdpdCBhL2J1aWxkL3g4Ni1tc3ZzL3lhc20ucnVsZXMgYi9saWJ2cHgvYnVpbGQveDg2LW1zdnMveWFzbS5ydWxlcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQveDg2LW1zdnMveWFzbS5ydWxlcwpyZW5hbWUgdG8gbGlidnB4L2J1aWxkL3g4Ni1tc3ZzL3lhc20ucnVsZXMKZGlmZiAtLWdpdCBhL2xpYnZweC9jb25maWd1cmUgYi9saWJ2cHgvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzYzVmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvY29uZmlndXJlCkBAIC0wLDAgKzEsNjI1IEBACisjIS9iaW4vYmFzaAorIyMKKyMjICBjb25maWd1cmUKKyMjCisjIyAgVGhpcyBzY3JpcHQgaXMgdGhlIGZyb250LWVuZCB0byB0aGUgYnVpbGQgc3lzdGVtLiBJdCBwcm92aWRlcyBhIHNpbWlsYXIKKyMjICBpbnRlcmZhY2UgdG8gc3RhbmRhcmQgY29uZmlndXJlIHNjcmlwdHMgd2l0aCBzb21lIGV4dHJhIGJpdHMgZm9yIGRlYWxpbmcKKyMjICB3aXRoIHRvb2xjaGFpbnMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgc3RhbmRhcmQgUE9TSVggaW50ZXJmYWNlIGFuZAorIyMgIGZvciBleHRyYWN0aW5nIHN1YnNldHMgb2YgdGhlIHNvdXJjZSB0cmVlLiBJbiB0aGVvcnksIHJldXNhYmxlIHBhcnRzCisjIyAgb2YgdGhpcyBzY3JpcHQgd2VyZSBpbnRlbmRlZCB0byBsaXZlIGluIGJ1aWxkL21ha2UvY29uZmlndXJlLnNoLAorIyMgIGJ1dCBpbiBwcmFjdGljZSwgdGhlIGxpbmUgaXMgcHJldHR5IGJsdXJyeS4KKyMjCisjIyAgVGhpcyBidWlsZCBzeXN0ZW0gaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgRkZtcGVnIGNvbmZpZ3VyZSBzY3JpcHQuCisjIworCisjc291cmNlX3BhdGg9ImBkaXJuYW1lIFwiJDBcImAiCitzb3VyY2VfcGF0aD0kezAlLyp9CisuICIke3NvdXJjZV9wYXRofS9idWlsZC9tYWtlL2NvbmZpZ3VyZS5zaCIKKworc2hvd19oZWxwKCl7CisgICAgc2hvd19oZWxwX3ByZQorICAgIGNhdCA8PCBFT0YKK0FkdmFuY2VkIG9wdGlvbnM6CisgICR7dG9nZ2xlX2xpYnN9ICAgICAgICAgICAgICAgICAgbGlicmFyaWVzCisgICR7dG9nZ2xlX2V4YW1wbGVzfSAgICAgICAgICAgICAgZXhhbXBsZXMKKyAgJHt0b2dnbGVfZG9jc30gICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uCisgICR7dG9nZ2xlX3VuaXRfdGVzdHN9ICAgICAgICAgICAgdW5pdCB0ZXN0cworICAtLWxpYmM9UEFUSCAgICAgICAgICAgICAgICAgICAgIHBhdGggdG8gYWx0ZXJuYXRlIGxpYmMKKyAgLS1hcz17eWFzbXxuYXNtfGF1dG99ICAgICAgICAgICB1c2Ugc3BlY2lmaWVkIGFzc2VtYmxlciBbYXV0bywgeWFzbSBwcmVmZXJyZWRdCisgIC0tc2RrLXBhdGg9UEFUSCAgICAgICAgICAgICAgICAgcGF0aCB0byByb290IG9mIHNkayAoaU9TLCBhbmRyb2lkIGJ1aWxkcyBvbmx5KQorICAke3RvZ2dsZV9mYXN0X3VuYWxpZ25lZH0gICAgICAgIGRvbid0IHVzZSB1bmFsaWduZWQgYWNjZXNzZXMsIGV2ZW4gd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSBoYXJkd2FyZSBbYXV0b10KKyAgJHt0b2dnbGVfY29kZWNfc3Jjc30gICAgICAgICAgICBpbi9leGNsdWRlIGNvZGVjIGxpYnJhcnkgc291cmNlIGNvZGUKKyAgJHt0b2dnbGVfZGVidWdfbGlic30gICAgICAgICAgICBpbi9leGNsdWRlIGRlYnVnIHZlcnNpb24gb2YgbGlicmFyaWVzCisgICR7dG9nZ2xlX21kNX0gICAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3Igb3V0cHV0IG9mIGNoZWNrc3VtIGRhdGEKKyAgJHt0b2dnbGVfc3RhdGljX21zdmNydH0gICAgICAgICB1c2Ugc3RhdGljIE1TVkNSVCAoVlMgYnVpbGRzIG9ubHkpCisgICR7dG9nZ2xlX3ZwOH0gICAgICAgICAgICAgICAgICAgVlA4IGNvZGVjIHN1cHBvcnQKKyAgJHt0b2dnbGVfaW50ZXJuYWxfc3RhdHN9ICAgICAgICBvdXRwdXQgb2YgZW5jb2RlciBpbnRlcm5hbCBzdGF0cyBmb3IgZGVidWcsIGlmIHN1cHBvcnRlZCAoZW5jb2RlcnMpCisgICR7dG9nZ2xlX21lbV90cmFja2VyfSAgICAgICAgICAgdHJhY2sgbWVtb3J5IHVzYWdlCisgICR7dG9nZ2xlX3Bvc3Rwcm9jfSAgICAgICAgICAgICAgcG9zdHByb2Nlc3NpbmcKKyAgJHt0b2dnbGVfbXVsdGl0aHJlYWR9ICAgICAgICAgICBtdWx0aXRocmVhZGVkIGVuY29kaW5nIGFuZCBkZWNvZGluZworICAke3RvZ2dsZV9zcGF0aWFsX3Jlc2FtcGxpbmd9ICAgIHNwYXRpYWwgc2FtcGxpbmcgKHNjYWxpbmcpIHN1cHBvcnQKKyAgJHt0b2dnbGVfcmVhbHRpbWVfb25seX0gICAgICAgICBlbmFibGUgdGhpcyBvcHRpb24gd2hpbGUgYnVpbGRpbmcgZm9yIHJlYWwtdGltZSBlbmNvZGluZworICAke3RvZ2dsZV9vbnRoZWZseV9iaXRwYWNraW5nfSAgIGVuYWJsZSBvbi10aGUtZmx5IGJpdHBhY2tpbmcgaW4gcmVhbC10aW1lIGVuY29kaW5nCisgICR7dG9nZ2xlX2Vycm9yX2NvbmNlYWxtZW50fSAgICAgZW5hYmxlIHRoaXMgb3B0aW9uIHRvIGdldCBhIGRlY29kZXIgd2hpY2ggaXMgYWJsZSB0byBjb25jZWFsIGxvc3NlcworICAke3RvZ2dsZV9ydW50aW1lX2NwdV9kZXRlY3R9ICAgIHJ1bnRpbWUgY3B1IGRldGVjdGlvbgorICAke3RvZ2dsZV9zaGFyZWR9ICAgICAgICAgICAgICAgIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQKKyAgJHt0b2dnbGVfc3RhdGljfSAgICAgICAgICAgICAgICBzdGF0aWMgbGlicmFyeSBzdXBwb3J0CisgICR7dG9nZ2xlX3NtYWxsfSAgICAgICAgICAgICAgICAgZmF2b3Igc21hbGxlciBzaXplIG92ZXIgc3BlZWQKKyAgJHt0b2dnbGVfcG9zdHByb2NfdmlzdWFsaXplcn0gICBtYWNybyBibG9jayAvIGJsb2NrIGxldmVsIHZpc3VhbGl6ZXJzCisgICR7dG9nZ2xlX211bHRpX3Jlc19lbmNvZGluZ30gICAgZW5hYmxlIG11bHRpcGxlLXJlc29sdXRpb24gZW5jb2RpbmcKKyAgJHt0b2dnbGVfdGVtcG9yYWxfZGVub2lzaW5nfSAgICBlbmFibGUgdGVtcG9yYWwgZGVub2lzaW5nIGFuZCBkaXNhYmxlIHRoZSBzcGF0aWFsIGRlbm9pc2VyCisKK0NvZGVjczoKKyAgQ29kZWNzIGNhbiBiZSBzZWxlY3RpdmVseSBlbmFibGVkIG9yIGRpc2FibGVkIGluZGl2aWR1YWxseSwgb3IgYnkgZmFtaWx5OgorICAgICAgLS1kaXNhYmxlLTxjb2RlYz4KKyAgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAgIC0tZGlzYWJsZS08Y29kZWM+LWVuY29kZXIKKyAgICAgIC0tZGlzYWJsZS08Y29kZWM+LWRlY29kZXIKKworICBDb2RlY3MgYXZhaWxhYmxlIGluIHRoaXMgZGlzdHJpYnV0aW9uOgorRU9GCisjcmVzdG9yZSBlZGl0b3Igc3RhdGUgJworCisgICAgbG9jYWwgZmFtaWx5OworICAgIGxvY2FsIGxhc3RfZmFtaWx5OworICAgIGxvY2FsIGM7CisgICAgbG9jYWwgc3RyOworICAgIGZvciBjIGluICR7Q09ERUNTfTsgZG8KKyAgICAgICAgZmFtaWx5PSR7YyVfKn0KKyAgICAgICAgaWYgWyAiJHtmYW1pbHl9IiAhPSAiJHtsYXN0X2ZhbWlseX0iIF07IHRoZW4KKyAgICAgICAgICAgIFsgLXogIiR7c3RyfSIgXSB8fCBlY2hvICIke3N0cn0iCisgICAgICAgICAgICBzdHI9IiQocHJpbnRmICcgICAgJTEwczonICR7ZmFtaWx5fSkiCisgICAgICAgIGZpCisgICAgICAgIHN0cj0iJHtzdHJ9ICQocHJpbnRmICclMTBzJyAke2MjKl99KSIKKyAgICAgICAgbGFzdF9mYW1pbHk9JHtmYW1pbHl9CisgICAgZG9uZQorICAgIGVjaG8gIiR7c3RyfSIKKyAgICBzaG93X2hlbHBfcG9zdAorfQorCisjIworIyMgQkVHSU4gQVBQTElDQVRJT04gU1BFQ0lGSUMgQ09ORklHVVJBVElPTgorIyMKKworIyBhbGxfcGxhdGZvcm1zIGlzIGEgbGlzdCBvZiBhbGwgc3VwcG9ydGVkIHRhcmdldCBwbGF0Zm9ybXMuIE1haW50YWluCisjIGFscGhhYmV0aWNhbGx5IGJ5IGFyY2hpdGVjdHVyZSwgZ2VuZXJpYy1nbnUgbGFzdC4KK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjV0ZS1hbmRyb2lkLWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjV0ZS1saW51eC1ydmN0IgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12NXRlLWxpbnV4LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjV0ZS1ub25lLXJ2Y3QiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY2LWRhcndpbi1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY2LWxpbnV4LXJ2Y3QiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY2LWxpbnV4LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjYtbm9uZS1ydmN0IgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ny1hbmRyb2lkLWdjYyIgICAjbmVvbiBDb3J0ZXgtQTgKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjctZGFyd2luLWdjYyIgICAgI25lb24gQ29ydGV4LUE4CithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IGFybXY3LWxpbnV4LXJ2Y3QiICAgICNuZW9uIENvcnRleC1BOAorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBhcm12Ny1saW51eC1nY2MiICAgICAjbmVvbiBDb3J0ZXgtQTgKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gYXJtdjctbm9uZS1ydmN0IiAgICAgI25lb24gQ29ydGV4LUE4CithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IG1pcHMzMi1saW51eC1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHBwYzMyLWRhcndpbjgtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBwcGMzMi1kYXJ3aW45LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gcHBjMzItbGludXgtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBwcGM2NC1kYXJ3aW44LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gcHBjNjQtZGFyd2luOS1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHBwYzY0LWxpbnV4LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gc3BhcmMtc29sYXJpcy1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni1kYXJ3aW44LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWRhcndpbjgtaWNjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODYtZGFyd2luOS1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni1kYXJ3aW45LWljYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWRhcndpbjEwLWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWRhcndpbjExLWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWRhcndpbjEyLWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWxpbnV4LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LWxpbnV4LWljYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LW9zMi1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Ni1zb2xhcmlzLWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LXdpbjMyLWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LXdpbjMyLXZzNyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LXdpbjMyLXZzOCIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2LXdpbjMyLXZzOSIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30geDg2XzY0LWRhcndpbjktZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtZGFyd2luMTAtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtZGFyd2luMTEtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtZGFyd2luMTItZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtbGludXgtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtbGludXgtaWNjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB4ODZfNjQtc29sYXJpcy1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Nl82NC13aW42NC1nY2MiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Nl82NC13aW42NC12czgiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHg4Nl82NC13aW42NC12czkiCithbGxfcGxhdGZvcm1zPSIke2FsbF9wbGF0Zm9ybXN9IHVuaXZlcnNhbC1kYXJ3aW44LWdjYyIKK2FsbF9wbGF0Zm9ybXM9IiR7YWxsX3BsYXRmb3Jtc30gdW5pdmVyc2FsLWRhcndpbjktZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB1bml2ZXJzYWwtZGFyd2luMTAtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB1bml2ZXJzYWwtZGFyd2luMTEtZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSB1bml2ZXJzYWwtZGFyd2luMTItZ2NjIgorYWxsX3BsYXRmb3Jtcz0iJHthbGxfcGxhdGZvcm1zfSBnZW5lcmljLWdudSIKKworIyBhbGxfdGFyZ2V0cyBpcyBhIGxpc3Qgb2YgYWxsIHRhcmdldHMgdGhhdCBjYW4gYmUgY29uZmlndXJlZAorIyBub3RlIHRoYXQgdGhlc2Ugc2hvdWxkIGJlIGluIGRlcGVuZGVuY3kgb3JkZXIgZm9yIG5vdy4KK2FsbF90YXJnZXRzPSJsaWJzIGV4YW1wbGVzIGRvY3MiCisKKyMgYWxsIHRhcmdldHMgYXZhaWxhYmxlIGFyZSBlbmFibGVkLCBieSBkZWZhdWx0LgorZm9yIHQgaW4gJHthbGxfdGFyZ2V0c307IGRvCisgICAgWyAtZiAke3NvdXJjZV9wYXRofS8ke3R9Lm1rIF0gJiYgZW5hYmxlICR7dH0KK2RvbmUKKworIyBjaGVjayBpbnN0YWxsZWQgZG94eWdlbiB2ZXJzaW9uCitkb3h5X3ZlcnNpb249JChkb3h5Z2VuIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCkKK2RveHlfbWFqb3I9JHtkb3h5X3ZlcnNpb24lJS4qfQoraWYgWyAke2RveHlfbWFqb3I6LTB9IC1nZSAxIF07IHRoZW4KKyAgICBkb3h5X3ZlcnNpb249JHtkb3h5X3ZlcnNpb24jKi59CisgICAgZG94eV9taW5vcj0ke2RveHlfdmVyc2lvbiUlLip9CisgICAgZG94eV9wYXRjaD0ke2RveHlfdmVyc2lvbiMjKi59CisKKyAgICBbICRkb3h5X21ham9yIC1ndCAxIF0gJiYgZW5hYmxlIGRveHlnZW4KKyAgICBbICRkb3h5X21pbm9yIC1ndCA1IF0gJiYgZW5hYmxlIGRveHlnZW4KKyAgICBbICRkb3h5X21pbm9yIC1lcSA1IF0gJiYgWyAkZG94eV9wYXRjaCAtZ2UgMyBdICYmIGVuYWJsZSBkb3h5Z2VuCitmaQorCisjIGluc3RhbGwgZXZlcnl0aGluZyBleGNlcHQgdGhlIHNvdXJjZXMsIGJ5IGRlZmF1bHQuIHNvdXJjZXMgd2lsbCBoYXZlCisjIHRvIGJlIGVuYWJsZWQgd2hlbiBkb2luZyBkaXN0IGJ1aWxkcywgc2luY2UgdGhhdCdzIG5vIGxvbmdlciBhIGNvbW1vbgorIyBjYXNlLgorZW5hYmxlZCBkb3h5Z2VuICYmIHBocCAtdiA+L2Rldi9udWxsIDI+JjEgJiYgZW5hYmxlIGluc3RhbGxfZG9jcworZW5hYmxlIGluc3RhbGxfYmlucworZW5hYmxlIGluc3RhbGxfbGlicworCitlbmFibGUgc3RhdGljCitlbmFibGUgb3B0aW1pemF0aW9ucworZW5hYmxlIGZhc3RfdW5hbGlnbmVkICNhbGxvdyB1bmFsaWduZWQgYWNjZXNzZXMsIGlmIHN1cHBvcnRlZCBieSBodworZW5hYmxlIG1kNQorZW5hYmxlIHNwYXRpYWxfcmVzYW1wbGluZworZW5hYmxlIG11bHRpdGhyZWFkCitlbmFibGUgb3Nfc3VwcG9ydAorZW5hYmxlIHRlbXBvcmFsX2Rlbm9pc2luZworCitbIC1kICR7c291cmNlX3BhdGh9Ly4uL2luY2x1ZGUgXSAmJiBlbmFibGUgYWx0X3RyZWVfbGF5b3V0Citmb3IgZCBpbiB2cDg7IGRvCisgICAgWyAtZCAke3NvdXJjZV9wYXRofS8ke2R9IF0gJiYgZGlzYWJsZSBhbHRfdHJlZV9sYXlvdXQ7Citkb25lCisKK2lmICEgZW5hYmxlZCBhbHRfdHJlZV9sYXlvdXQ7IHRoZW4KKyMgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKK1sgLWQgJHtzb3VyY2VfcGF0aH0vdnA4IF0gJiYgQ09ERUNTPSIke0NPREVDU30gdnA4X2VuY29kZXIgdnA4X2RlY29kZXIiCitlbHNlCisjIGN1c3RvbWVyIGVudmlyb25tZW50CitbIC1mICR7c291cmNlX3BhdGh9Ly4uL2luY2x1ZGUvdnB4L3ZwOGN4LmggXSAmJiBDT0RFQ1M9IiR7Q09ERUNTfSB2cDhfZW5jb2RlciIKK1sgLWYgJHtzb3VyY2VfcGF0aH0vLi4vaW5jbHVkZS92cHgvdnA4ZHguaCBdICYmIENPREVDUz0iJHtDT0RFQ1N9IHZwOF9kZWNvZGVyIgorWyAtZiAke3NvdXJjZV9wYXRofS8uLi9pbmNsdWRlL3ZweC92cDhjeC5oIF0gfHwgZGlzYWJsZSB2cDhfZW5jb2RlcgorWyAtZiAke3NvdXJjZV9wYXRofS8uLi9pbmNsdWRlL3ZweC92cDhkeC5oIF0gfHwgZGlzYWJsZSB2cDhfZGVjb2RlcgorCitbIC1mICR7c291cmNlX3BhdGh9Ly4uL2xpYi8qLyptdC5saWIgXSAmJiBzb2Z0X2VuYWJsZSBzdGF0aWNfbXN2Y3J0CitmaQorCitDT0RFQ1M9IiQoZWNobyAke0NPREVDU30gfCB0ciAnICcgJ1xuJykiCitDT0RFQ19GQU1JTElFUz0iJChmb3IgYyBpbiAke0NPREVDU307IGRvIGVjaG8gJHtjJV8qfTsgZG9uZSB8IHNvcnQgfCB1bmlxKSIKKworQVJDSF9MSVNUPSIKKyAgICBhcm0KKyAgICBtaXBzCisgICAgeDg2CisgICAgeDg2XzY0CisgICAgcHBjMzIKKyAgICBwcGM2NAorIgorQVJDSF9FWFRfTElTVD0iCisgICAgZWRzcAorICAgIG1lZGlhCisgICAgbmVvbgorCisgICAgbWlwczMyCisgICAgZHNwcjIKKworICAgIG1teAorICAgIHNzZQorICAgIHNzZTIKKyAgICBzc2UzCisgICAgc3NzZTMKKyAgICBzc2U0XzEKKworICAgIGFsdGl2ZWMKKyIKK0hBVkVfTElTVD0iCisgICAgJHtBUkNIX0VYVF9MSVNUfQorICAgIHZweF9wb3J0cworICAgIHN0ZGludF9oCisgICAgYWx0X3RyZWVfbGF5b3V0CisgICAgcHRocmVhZF9oCisgICAgc3lzX21tYW5faAorICAgIHVuaXN0ZF9oCisiCitDT05GSUdfTElTVD0iCisgICAgZXh0ZXJuYWxfYnVpbGQKKyAgICBpbnN0YWxsX2RvY3MKKyAgICBpbnN0YWxsX2JpbnMKKyAgICBpbnN0YWxsX2xpYnMKKyAgICBpbnN0YWxsX3NyY3MKKyAgICBkZWJ1ZworICAgIGdwcm9mCisgICAgZ2NvdgorICAgIHJ2Y3QKKyAgICBnY2MKKyAgICBtc3ZzCisgICAgcGljCisgICAgYmlnX2VuZGlhbgorCisgICAgY29kZWNfc3JjcworICAgIGRlYnVnX2xpYnMKKyAgICBmYXN0X3VuYWxpZ25lZAorICAgIG1lbV9tYW5hZ2VyCisgICAgbWVtX3RyYWNrZXIKKyAgICBtZW1fY2hlY2tzCisgICAgbWQ1CisKKyAgICBkZXF1YW50X3Rva2VucworICAgIGRjX3JlY29uCisgICAgcnVudGltZV9jcHVfZGV0ZWN0CisgICAgcG9zdHByb2MKKyAgICBtdWx0aXRocmVhZAorICAgIGludGVybmFsX3N0YXRzCisgICAgJHtDT0RFQ1N9CisgICAgJHtDT0RFQ19GQU1JTElFU30KKyAgICBlbmNvZGVycworICAgIGRlY29kZXJzCisgICAgc3RhdGljX21zdmNydAorICAgIHNwYXRpYWxfcmVzYW1wbGluZworICAgIHJlYWx0aW1lX29ubHkKKyAgICBvbnRoZWZseV9iaXRwYWNraW5nCisgICAgZXJyb3JfY29uY2VhbG1lbnQKKyAgICBzaGFyZWQKKyAgICBzdGF0aWMKKyAgICBzbWFsbAorICAgIHBvc3Rwcm9jX3Zpc3VhbGl6ZXIKKyAgICBvc19zdXBwb3J0CisgICAgdW5pdF90ZXN0cworICAgIG11bHRpX3Jlc19lbmNvZGluZworICAgIHRlbXBvcmFsX2Rlbm9pc2luZworIgorQ01ETElORV9TRUxFQ1Q9IgorICAgIGV4dHJhX3dhcm5pbmdzCisgICAgd2Vycm9yCisgICAgaW5zdGFsbF9kb2NzCisgICAgaW5zdGFsbF9iaW5zCisgICAgaW5zdGFsbF9saWJzCisgICAgaW5zdGFsbF9zcmNzCisgICAgZGVidWcKKyAgICBncHJvZgorICAgIGdjb3YKKyAgICBwaWMKKyAgICBvcHRpbWl6YXRpb25zCisgICAgY2NhY2hlCisgICAgcnVudGltZV9jcHVfZGV0ZWN0CisKKyAgICBsaWJzCisgICAgZXhhbXBsZXMKKyAgICBkb2NzCisgICAgbGliYworICAgIGFzCisgICAgZmFzdF91bmFsaWduZWQKKyAgICBjb2RlY19zcmNzCisgICAgZGVidWdfbGlicworICAgIG1kNQorCisgICAgZGVxdWFudF90b2tlbnMKKyAgICBkY19yZWNvbgorICAgIHBvc3Rwcm9jCisgICAgbXVsdGl0aHJlYWQKKyAgICBpbnRlcm5hbF9zdGF0cworICAgICR7Q09ERUNTfQorICAgICR7Q09ERUNfRkFNSUxJRVN9CisgICAgc3RhdGljX21zdmNydAorICAgIG1lbV90cmFja2VyCisgICAgc3BhdGlhbF9yZXNhbXBsaW5nCisgICAgcmVhbHRpbWVfb25seQorICAgIG9udGhlZmx5X2JpdHBhY2tpbmcKKyAgICBlcnJvcl9jb25jZWFsbWVudAorICAgIHNoYXJlZAorICAgIHN0YXRpYworICAgIHNtYWxsCisgICAgcG9zdHByb2NfdmlzdWFsaXplcgorICAgIHVuaXRfdGVzdHMKKyAgICBtdWx0aV9yZXNfZW5jb2RpbmcKKyAgICB0ZW1wb3JhbF9kZW5vaXNpbmcKKyIKKworcHJvY2Vzc19jbWRsaW5lKCkgeworICAgIGZvciBvcHQgZG8KKyAgICAgICAgb3B0dmFsPSIke29wdCMqPX0iCisgICAgICAgIGNhc2UgIiRvcHQiIGluCisgICAgICAgIC0tZGlzYWJsZS1jb2RlY3MpIGZvciBjIGluICR7Q09ERUNTfTsgZG8gZGlzYWJsZSAkYzsgZG9uZSA7OworICAgICAgICAqKSBwcm9jZXNzX2NvbW1vbl9jbWRsaW5lICIkb3B0IgorICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZG9uZQorfQorCitwb3N0X3Byb2Nlc3NfY21kbGluZSgpIHsKKyAgICBsb2NhbCBjCisKKyAgICAjIElmIHRoZSBjb2RlYyBmYW1pbHkgaXMgZGlzYWJsZWQsIGRpc2FibGUgYWxsIGNvbXBvbmVudHMgb2YgdGhhdCBmYW1pbHkuCisgICAgIyBJZiB0aGUgY29kZWMgZmFtaWx5IGlzIGVuYWJsZWQsIGVuYWJsZSBhbGwgY29tcG9uZW50cyBvZiB0aGF0IGZhbWlseS4KKyAgICBsb2dfZWNobyAiQ29uZmlndXJpbmcgc2VsZWN0ZWQgY29kZWNzIgorICAgIGZvciBjIGluICR7Q09ERUNTfTsgZG8KKyAgICAgICAgZGlzYWJsZWQgJHtjJSVfKn0gJiYgZGlzYWJsZSAke2N9CisgICAgICAgIGVuYWJsZWQgJHtjJSVfKn0gJiYgZW5hYmxlICR7Y30KKyAgICBkb25lCisKKyAgICAjIEVuYWJsZSBhbGwgZGV0ZWN0ZWQgY29kZWNzLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBkaXNhYmxlZAorICAgIGZvciBjIGluICR7Q09ERUNTfTsgZG8gc29mdF9lbmFibGUgJGM7IGRvbmUKKworICAgICMgRW5hYmxlIHRoZSBjb2RlYyBmYW1pbHkgaWYgYW55IGNvbXBvbmVudCBvZiB0aGF0IGZhbWlseSBpcyBlbmFibGVkCisgICAgZm9yIGMgaW4gJHtDT0RFQ1N9OyBkbworICAgICAgICBlbmFibGVkICRjICYmIGVuYWJsZSAke2MlXyp9CisgICAgZG9uZQorCisgICAgIyBTZXQgdGhlIHtlbixkZX1jb2RlcnMgdmFyaWFibGUgaWYgYW55IGFsZ29yaXRobSBpbiB0aGF0IGNsYXNzIGlzIGVuYWJsZWQKKyAgICBmb3IgYyBpbiAke0NPREVDU307IGRvCisgICAgICAgIGVuYWJsZWQgJHtjfSAmJiBlbmFibGUgJHtjIyMqX31zCisgICAgZG9uZQorfQorCisKK3Byb2Nlc3NfdGFyZ2V0cygpIHsKKyAgICBlbmFibGVkIGNoaWxkIHx8IHdyaXRlX2NvbW1vbl9jb25maWdfYmFubmVyCisgICAgZW5hYmxlZCB1bml2ZXJzYWwgfHwgd3JpdGVfY29tbW9uX3RhcmdldF9jb25maWdfaCAgJHtCVUlMRF9QRlh9dnB4X2NvbmZpZy5oCisKKyAgICAjIFRPRE86IGFkZCBob3N0IHRvb2xzIHRhcmdldCAob2JqX2ludF9leHRyYWN0LCBldGMpCisKKyAgICAjIEZvciBmYXQgYmluYXJpZXMsIGNhbGwgY29uZmlndXJlIHJlY3Vyc2l2ZWx5IHRvIGNvbmZpZ3VyZSBmb3IgZWFjaAorICAgICMgYmluYXJ5IGFyY2hpdGVjdHVyZSB0byBiZSBpbmNsdWRlZC4KKyAgICBpZiBlbmFibGVkIHVuaXZlcnNhbDsgdGhlbgorICAgICAgICAjIENhbGwgY29uZmlndXJlIChvdXJzZWx2ZXMpIGZvciBlYWNoIHN1YmFyY2hpdGVjdHVyZQorICAgICAgICBmb3IgYXJjaCBpbiAkZmF0X2Jpbl9hcmNoczsgZG8KKyAgICAgICAgICAgIEJVSUxEX1BGWD0ke2FyY2h9LyB0b29sY2hhaW49JHthcmNofSAkc2VsZiAtLWNoaWxkICRjbWRsaW5lX2FyZ3MgfHwgZXhpdCAkPworICAgICAgICBkb25lCisgICAgZmkKKworICAgICMgVGhlIHdyaXRlX2NvbW1vbl9jb25maWcgKGNvbmZpZy5taykgbG9naWMgaXMgZGVmZXJyZWQgdW50aWwgYWZ0ZXIgdGhlCisgICAgIyByZWN1cnNpdmUgY2FsbHMgdG8gY29uZmlndXJlIGNvbXBsZXRlLCBiZWN1YXNlIHdlIHdhbnQgb3VyIHVuaXZlcnNhbAorICAgICMgdGFyZ2V0cyB0byBiZSBleGVjdXRlZCBsYXN0LgorICAgIHdyaXRlX2NvbW1vbl9jb25maWdfdGFyZ2V0cworICAgIGVuYWJsZWQgdW5pdmVyc2FsICYmIGVjaG8gIkZBVF9BUkNIUz0ke2ZhdF9iaW5fYXJjaHN9IiA+PiBjb25maWcubWsKKworICAgICMgQ2FsY3VsYXRlIHRoZSBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBuYW1lLCBiYXNlZCBvbiB0aGUgZW5hYmxlZCBmZWF0dXJlcworICAgIGxvY2FsIGNmCisgICAgbG9jYWwgRElTVF9ESVI9dnB4CisgICAgZm9yIGNmIGluICRDT0RFQ19GQU1JTElFUzsgZG8KKyAgICAgICAgaWYgZW5hYmxlZCAke2NmfV9lbmNvZGVyICYmIGVuYWJsZWQgJHtjZn1fZGVjb2RlcjsgdGhlbgorICAgICAgICAgICAgRElTVF9ESVI9IiR7RElTVF9ESVJ9LSR7Y2Z9IgorICAgICAgICBlbGlmIGVuYWJsZWQgJHtjZn1fZW5jb2RlcjsgdGhlbgorICAgICAgICAgICAgRElTVF9ESVI9IiR7RElTVF9ESVJ9LSR7Y2Z9Y3giCisgICAgICAgIGVsaWYgZW5hYmxlZCAke2NmfV9kZWNvZGVyOyB0aGVuCisgICAgICAgICAgICBESVNUX0RJUj0iJHtESVNUX0RJUn0tJHtjZn1keCIKKyAgICAgICAgZmkKKyAgICBkb25lCisgICAgZW5hYmxlZCBkZWJ1Z19saWJzICYmIERJU1RfRElSPSIke0RJU1RfRElSfS1kZWJ1ZyIKKyAgICBlbmFibGVkIGNvZGVjX3NyY3MgJiYgRElTVF9ESVI9IiR7RElTVF9ESVJ9LXNyYyIKKyAgICAhIGVuYWJsZWQgcG9zdHByb2MgJiYgRElTVF9ESVI9IiR7RElTVF9ESVJ9LW5vcG9zdCIKKyAgICAhIGVuYWJsZWQgbXVsdGl0aHJlYWQgJiYgRElTVF9ESVI9IiR7RElTVF9ESVJ9LW5vbXQiCisgICAgISBlbmFibGVkIGluc3RhbGxfZG9jcyAmJiBESVNUX0RJUj0iJHtESVNUX0RJUn0tbm9kb2NzIgorICAgIERJU1RfRElSPSIke0RJU1RfRElSfS0ke3RndF9pc2F9LSR7dGd0X29zfSIKKyAgICBjYXNlICIke3RndF9vc30iIGluCisgICAgd2luKikgZW5hYmxlZCBzdGF0aWNfbXN2Y3J0ICYmIERJU1RfRElSPSIke0RJU1RfRElSfW10IiB8fCBESVNUX0RJUj0iJHtESVNUX0RJUn1tZCIKKyAgICAgICAgICBESVNUX0RJUj0iJHtESVNUX0RJUn0tJHt0Z3RfY2N9IgorICAgICAgICAgIDs7CisgICAgZXNhYworICAgIGlmIFsgLWYgIiR7c291cmNlX3BhdGh9L2J1aWxkL21ha2UvdmVyc2lvbi5zaCIgXTsgdGhlbgorICAgICAgICBsb2NhbCB2ZXI9YCIkc291cmNlX3BhdGgvYnVpbGQvbWFrZS92ZXJzaW9uLnNoIiAtLWJhcmUgJHNvdXJjZV9wYXRoYAorICAgICAgICBESVNUX0RJUj0iJHtESVNUX0RJUn0tJHt2ZXJ9IgorICAgICAgICBWRVJTSU9OX1NUUklORz0ke3Zlcn0KKyAgICAgICAgdmVyPSR7dmVyJSUtKn0KKyAgICAgICAgVkVSU0lPTl9QQVRDSD0ke3ZlciMjKi59CisgICAgICAgIHZlcj0ke3ZlciUuKn0KKyAgICAgICAgVkVSU0lPTl9NSU5PUj0ke3ZlciMjKi59CisgICAgICAgIHZlcj0ke3ZlciN2fQorICAgICAgICBWRVJTSU9OX01BSk9SPSR7dmVyJS4qfQorICAgIGZpCisgICAgZW5hYmxlZCBjaGlsZCB8fCBjYXQgPDxFT0YgPj4gY29uZmlnLm1rCisKK1BSRUZJWD0ke3ByZWZpeH0KK2lmZXEgKFwkKE1BS0VDTURHT0FMUyksZGlzdCkKK0RJU1RfRElSPz0ke0RJU1RfRElSfQorZWxzZQorRElTVF9ESVI/PVwkKERFU1RESVIpJHtwcmVmaXh9CitlbmRpZgorTElCU1VCRElSPSR7bGliZGlyIyMke3ByZWZpeH0vfQorCitWRVJTSU9OX1NUUklORz0ke1ZFUlNJT05fU1RSSU5HfQorCitWRVJTSU9OX01BSk9SPSR7VkVSU0lPTl9NQUpPUn0KK1ZFUlNJT05fTUlOT1I9JHtWRVJTSU9OX01JTk9SfQorVkVSU0lPTl9QQVRDSD0ke1ZFUlNJT05fUEFUQ0h9CisKK0NPTkZJR1VSRV9BUkdTPSR7Q09ORklHVVJFX0FSR1N9CitFT0YKKyAgICBlbmFibGVkIGNoaWxkIHx8IGVjaG8gIkNPTkZJR1VSRV9BUkdTPz0ke0NPTkZJR1VSRV9BUkdTfSIgPj4gY29uZmlnLm1rCisKKyAgICAjCisgICAgIyBXcml0ZSBtYWtlZmlsZXMgZm9yIGFsbCBlbmFibGVkIHRhcmdldHMKKyAgICAjCisgICAgZm9yIHRndCBpbiBsaWJzIGV4YW1wbGVzIGRvY3Mgc29sdXRpb247IGRvCisgICAgICAgIGxvY2FsIHRndF9mbj0iJHRndC0kdG9vbGNoYWluLm1rIgorCisgICAgICAgIGlmIGVuYWJsZWQgJHRndDsgdGhlbgorICAgICAgICAgICAgZWNobyAiQ3JlYXRpbmcgbWFrZWZpbGVzIGZvciAke3Rvb2xjaGFpbn0gJHt0Z3R9IgorICAgICAgICAgICAgd3JpdGVfY29tbW9uX3RhcmdldF9jb25maWdfbWsgJHRndF9mbiAke0JVSUxEX1BGWH12cHhfY29uZmlnLmgKKyAgICAgICAgICAgICN3cml0ZV8ke3RndH1fY29uZmlnCisgICAgICAgIGZpCisgICAgZG9uZQorCit9CisKK3Byb2Nlc3NfZGV0ZWN0KCkgeworICAgIGlmIGVuYWJsZWQgc2hhcmVkOyB0aGVuCisgICAgICAgICMgQ2FuIG9ubHkgYnVpbGQgc2hhcmVkIGxpYnMgb24gYSBzdWJzZXQgb2YgcGxhdGZvcm1zLiBEb2luZyB0aGlzIGNoZWNrCisgICAgICAgICMgaGVyZSByYXRoZXIgdGhhbiBhdCBvcHRpb24gcGFyc2UgdGltZSBiZWNhdXNlIHRoZSB0YXJnZXQgYXV0by1kZXRlY3QKKyAgICAgICAgIyBtYWdpYyBoYXBwZW5zIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgaGFzIGJlZW4gcGFyc2VkLgorICAgICAgICBpZiAhIGVuYWJsZWQgbGludXg7IHRoZW4KKyAgICAgICAgICAgIGlmIGVuYWJsZWQgZ251OyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiLS1lbmFibGUtc2hhcmVkIGlzIG9ubHkgc3VwcG9ydGVkIG9uIEVMRjsgYXNzdW1pbmcgdGhpcyBpcyBPSyIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaWUgIi0tZW5hYmxlLXNoYXJlZCBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgZm9yIG5vdyIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKKyAgICBpZiBbIC16ICIkQ0MiIF07IHRoZW4KKyAgICAgICAgZWNobyAiQnlwYXNzaW5nIHRvb2xjaGFpbiBmb3IgZW52aXJvbm1lbnQgZGV0ZWN0aW9uLiIKKyAgICAgICAgZW5hYmxlIGV4dGVybmFsX2J1aWxkCisgICAgICAgIGNoZWNrX2hlYWRlcigpIHsKKyAgICAgICAgICAgIGxvZyBmYWtlX2NoZWNrX2hlYWRlciAiJEAiCisgICAgICAgICAgICBoZWFkZXI9JDEKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICB2YXI9YGVjaG8gJGhlYWRlciB8IHNlZCAncy9bXkEtWmEtejAtOV9dL18vZydgCisgICAgICAgICAgICBkaXNhYmxlICR2YXIKKyAgICAgICAgICAgIGNhc2UgJGhlYWRlciBpbgorICAgICAgICAgICAgICAgIHN0ZGlvLmgpCisgICAgICAgICAgICAgICAgICAgIHRydWU7CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICBsb2NhbCByZXN1bHQ9ZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gIiRAIjsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIFsgLWYgIiR7ZCMjLUl9LyRoZWFkZXIiIF0gJiYgcmVzdWx0PXRydWUgJiYgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAke3Jlc3VsdDotdHJ1ZX0KKyAgICAgICAgICAgIGVzYWMgJiYgZW5hYmxlICR2YXIKKyAgICAgICAgfQorICAgICAgICBjaGVja19sZCgpIHsKKyAgICAgICAgICAgIHRydWUKKyAgICAgICAgfQorICAgIGZpCisgICAgY2hlY2tfaGVhZGVyIHN0ZGlvLmggfHwgZGllICJVbmFibGUgdG8gaW52b2tlIGNvbXBpbGVyOiAke0NDfSAke0NGTEFHU30iCisgICAgY2hlY2tfbGQgPDxFT0YgfHwgZGllICJUb29sY2hhaW4gaXMgdW5hYmxlIHRvIGxpbmsgZXhlY3V0YWJsZXMiCitpbnQgbWFpbih2b2lkKSB7cmV0dXJuIDA7fQorRU9GCisgICAgIyBjaGVjayBzeXN0ZW0gaGVhZGVycworICAgIGNoZWNrX2hlYWRlciBzdGRpbnQuaAorICAgIGNoZWNrX2hlYWRlciBwdGhyZWFkLmgKKyAgICBjaGVja19oZWFkZXIgc3lzL21tYW4uaAorCisgICAgY2hlY2tfaGVhZGVyIHZweC92cHhfaW50ZWdlci5oIC1JJHtzb3VyY2VfcGF0aH0gJiYgZW5hYmxlIHZweF9wb3J0cworfQorCitwcm9jZXNzX3Rvb2xjaGFpbigpIHsKKyAgICBwcm9jZXNzX2NvbW1vbl90b29sY2hhaW4KKworICAgICMgSGFuZGxlIHVuaXZlcnNhbCBiaW5hcmllcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyAgICBjYXNlICR0b29sY2hhaW4gaW4KKyAgICAgICAgdW5pdmVyc2FsLWRhcndpbiopCisgICAgICAgICAgICBsb2NhbCBkYXJ3aW5fdmVyPSR7dGd0X29zIyNkYXJ3aW59CisKKyAgICAgICAgICAgICMgU25vdyBMZW9wYXJkICgxMC42L2RhcndpbjEwKSBkcm9wcGVkIHN1cHBvcnQgZm9yIFBQQworICAgICAgICAgICAgIyBJbmNsdWRlIFBQQyBzdXBwb3J0IGZvciBhbGwgcHJpb3IgdmVyc2lvbnMKKyAgICAgICAgICAgIGlmIFsgJGRhcndpbl92ZXIgLWx0IDEwIF07IHRoZW4KKyAgICAgICAgICAgICAgICBmYXRfYmluX2FyY2hzPSIkZmF0X2Jpbl9hcmNocyBwcGMzMi0ke3RndF9vc30tZ2NjIgorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgIyBUaWdlciAoMTAuNC9kYXJ3aW44KSBicm91Z2h0IHN1cHBvcnQgZm9yIHg4NgorICAgICAgICAgICAgaWYgWyAkZGFyd2luX3ZlciAtZ2UgOCBdOyB0aGVuCisgICAgICAgICAgICAgICAgZmF0X2Jpbl9hcmNocz0iJGZhdF9iaW5fYXJjaHMgeDg2LSR7dGd0X29zfS0ke3RndF9jY30iCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAjIExlb3BhcmQgKDEwLjUvZGFyd2luOSkgYnJvdWdodCA2NCBiaXQgc3VwcG9ydAorICAgICAgICAgICAgaWYgWyAkZGFyd2luX3ZlciAtZ2UgOSBdOyB0aGVuCisgICAgICAgICAgICAgICAgZmF0X2Jpbl9hcmNocz0iJGZhdF9iaW5fYXJjaHMgeDg2XzY0LSR7dGd0X29zfS0ke3RndF9jY30iCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKworICAgICMgRW5hYmxlIHNvbWUgdXNlZnVsIGNvbXBpbGVyIGZsYWdzCisgICAgaWYgZW5hYmxlZCBnY2M7IHRoZW4KKyAgICAgICAgZW5hYmxlZCB3ZXJyb3IgJiYgY2hlY2tfYWRkX2NmbGFncyAtV2Vycm9yCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdhbGwKKyAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1XZGlzYWJsZWQtb3B0aW1pemF0aW9uCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdwb2ludGVyLWFyaXRoCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVd0eXBlLWxpbWl0cworICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1XY2FzdC1xdWFsCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbgorICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1XdW5pbml0aWFsaXplZAorICAgICAgICBjaGVja19hZGRfY2ZsYWdzIC1XdW51c2VkLXZhcmlhYmxlCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZQorICAgICAgICBlbmFibGVkIGV4dHJhX3dhcm5pbmdzIHx8IGNoZWNrX2FkZF9jZmxhZ3MgLVduby11bnVzZWQtZnVuY3Rpb24KKyAgICBmaQorCisgICAgaWYgZW5hYmxlZCBpY2M7IHRoZW4KKyAgICAgICAgZW5hYmxlZCB3ZXJyb3IgJiYgY2hlY2tfYWRkX2NmbGFncyAtV2Vycm9yCisgICAgICAgIGNoZWNrX2FkZF9jZmxhZ3MgLVdhbGwKKyAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAtV3BvaW50ZXItYXJpdGgKKworICAgICAgICAjIElDQyBoYXMgYSBudW1iZXIgb2YgZmxvYXRpbmcgcG9pbnQgb3B0aW1pemF0aW9ucyB0aGF0IHdlIGRpc2FibGUKKyAgICAgICAgIyBpbiBmYXZvciBvZiBkZXRlcm1pbmlzdGljIG91dHB1dCBXUlQgdG8gb3RoZXIgY29tcGlsZXJzCisgICAgICAgIGFkZF9jZmxhZ3MgLWZwLW1vZGVsIHByZWNpc2UKKyAgICBmaQorCisgICAgIyBFbmFibGUgZXh0cmEsIGhhcm1sZXNzIHdhcm5pbmdzLiBUaGVzZSBtaWdodCBwcm92aWRlIGFkZGl0aW9uYWwgaW5zaWdodAorICAgICMgdG8gd2hhdCB0aGUgY29tcGlsZXIgaXMgZG9pbmcgYW5kIHdoeSwgYnV0IGluIGdlbmVyYWwsIGJ1dCB0aGV5IHNob3VsZG4ndAorICAgICMgYmUgdHJlYXRlZCBhcyBmYXRhbCwgZXZlbiBpZiB3ZSdyZSB0cmVhdGluZyB3YXJuaW5ncyBhcyBlcnJvcnMuCisgICAgR0NDX0VYVFJBX1dBUk5JTkdTPSIKKyAgICAgICAgLVdkaXNhYmxlZC1vcHRpbWl6YXRpb24KKyAgICAgICAgLVdpbmxpbmUKKyAgICAiCisgICAgZW5hYmxlZCBnY2MgJiYgRVhUUkFfV0FSTklOR1M9IiR7R0NDX0VYVFJBX1dBUk5JTkdTfSIKKyAgICBSVkNUX0VYVFJBX1dBUk5JTkdTPSIKKyAgICAgICAgLS1yZW1hcmtzCisgICAgIgorICAgIGVuYWJsZWQgcnZjdCAmJiBFWFRSQV9XQVJOSU5HUz0iJHtSVkNUX0VYVFJBX1dBUk5JTkdTfSIKKyAgICBpZiBlbmFibGVkIGV4dHJhX3dhcm5pbmdzOyB0aGVuCisgICAgICAgIGZvciB3IGluICR7RVhUUkFfV0FSTklOR1N9OyBkbworICAgICAgICAgICAgY2hlY2tfYWRkX2NmbGFncyAke3d9CisgICAgICAgICAgICBlbmFibGVkIGdjYyAmJiBlbmFibGVkIHdlcnJvciAmJiBjaGVja19hZGRfY2ZsYWdzIC1Xbm8tZXJyb3I9JHt3fQorICAgICAgICBkb25lCisgICAgZmkKKworICAgICMgY2NhY2hlIG9ubHkgcmVhbGx5IHdvcmtzIG9uIGdjYyB0b29sY2hhaW5zCisgICAgZW5hYmxlZCBnY2MgfHwgc29mdF9kaXNhYmxlIGNjYWNoZQorICAgIGlmIGVuYWJsZWQgbWlwczsgdGhlbgorICAgICAgICBlbmFibGUgZGVxdWFudF90b2tlbnMKKyAgICAgICAgZW5hYmxlIGRjX3JlY29uCisgICAgZmkKKworICAgICMgRW5hYmxlIHRoZSBwb3N0YnVpbGQgdGFyZ2V0IGlmIGJ1aWxkaW5nIGZvciB2aXN1YWwgc3R1ZGlvLgorICAgIGNhc2UgIiR0Z3RfY2MiIGluCisgICAgICAgIHZzKikgZW5hYmxlIG1zdnMKKyAgICAgICAgICAgICBlbmFibGUgc29sdXRpb24KKyAgICAgICAgICAgICB2c192ZXJzaW9uPSR7dGd0X2NjIyN2c30KKyAgICAgICAgICAgICBhbGxfdGFyZ2V0cz0iJHthbGxfdGFyZ2V0c30gc29sdXRpb24iCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBPdGhlciB0b29sY2hhaW4gc3BlY2lmaWMgZGVmYXVsdHMKKyAgICBjYXNlICR0b29sY2hhaW4gaW4geDg2KnxwcGMqfHVuaXZlcnNhbCopIHNvZnRfZW5hYmxlIHBvc3Rwcm9jOzsgZXNhYworCisgICAgaWYgZW5hYmxlZCBwb3N0cHJvY192aXN1YWxpemVyOyB0aGVuCisgICAgICAgIGVuYWJsZWQgcG9zdHByb2MgfHwgZGllICJwb3N0cHJvY192aXN1YWxpemVyIHJlcXVpcmVzIHBvc3Rwcm9jIHRvIGJlIGVuYWJsZWQiCisgICAgZmkKKworICAgICMgRW5hYmxlIHVuaXQgdGVzdHMgaWYgd2UgaGF2ZSBhIHdvcmtpbmcgQysrIGNvbXBpbGVyCisgICAgY2FzZSAiJHRvb2xjaGFpbiIgaW4KKyAgICAgICAgKi12cyopCisgICAgICAgICAgICBzb2Z0X2VuYWJsZSB1bml0X3Rlc3RzCisgICAgICAgIDs7CisgICAgICAgICotYW5kcm9pZC0qKQorICAgICAgICAgICAgIyBHVGVzdExvZyBtdXN0IGJlIG1vZGlmaWVkIHRvIHVzZSBBbmRyb2lkIGxvZ2dpbmcgdXRpbGl0aWVzLgorICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgY2hlY2tfY3h4ICIkQCIgPDxFT0YgJiYgc29mdF9lbmFibGUgdW5pdF90ZXN0cworaW50IHo7CitFT0YKKyAgICAgICAgOzsKKyAgICBlc2FjCit9CisKKworIyMKKyMjIEVORCBBUFBMSUNBVElPTiBTUEVDSUZJQyBDT05GSUdVUkFUSU9OCisjIworQ09ORklHVVJFX0FSR1M9IiRAIgorcHJvY2VzcyAiJEAiCitwcmludF93ZWJtX2xpY2Vuc2UgJHtCVUlMRF9QRlh9dnB4X2NvbmZpZy5jICIvKiIgIiAqLyIKK2NhdCA8PEVPRiA+PiAke0JVSUxEX1BGWH12cHhfY29uZmlnLmMKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBjZmcgPSAiJENPTkZJR1VSRV9BUkdTIjsKK2NvbnN0IGNoYXIgKnZweF9jb2RlY19idWlsZF9jb25maWcodm9pZCkge3JldHVybiBjZmc7fQorRU9GCmRpZmYgLS1naXQgYS9saWJ2cHgvZG9jcy5tayBiL2xpYnZweC9kb2NzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTU3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvZG9jcy5tawpAQCAtMCwwICsxLDUzIEBACisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworCitJTlNUQUxMX01BUFMgKz0gZG9jcy8lICAgIGRvY3MvJQorSU5TVEFMTF9NQVBTICs9IHNyYy8lICAgICAlCitJTlNUQUxMX01BUFMgKz0gJSAgICAgICAgICUKKworIyBTdGF0aWMgZG9jdW1lbnRhdGlvbiBhdXRob3JlZCBpbiBkb3h5Z2VuCitDT0RFQ19ET1ggOj0gICAgbWFpbnBhZ2UuZG94IFwKKwkJa2V5d29yZHMuZG94IFwKKwkJdXNhZ2UuZG94IFwKKwkJdXNhZ2VfY3guZG94IFwKKwkJdXNhZ2VfZHguZG94IFwKKworIyBPdGhlciBkb3h5IGZpbGVzIHNvdXJjZWQgaW4gTWFya2Rvd24KK1RYVF9ET1ggPSAkKGNhbGwgZW5hYmxlZCxUWFRfRE9YKQorCislLmRveDogJS50eHQKKwlAZWNobyAiICAgIFtET1hZXSAkQCIKKwlAJChTUkNfUEFUSF9CQVJFKS9leGFtcGxlcy9nZW5fZXhhbXBsZV9kb3h5LnBocCBcCisgICAgICAgICAgICAgJChAOi5kb3g9KSAgIiQoJEAuREVTQykiID4gJEAgPCAkPAorCisKK0VYQU1QTEVfUEFUSCArPSAkKFNSQ19QQVRIX0JBUkUpICNmb3IgQ0hBTkdFTE9HLCBSRUFETUUsIGV0YworCitkb3h5ZmlsZTogJChpZiAkKGZpbmRzdHJpbmcgZXhhbXBsZXMsICQoQUxMX1RBUkdFVFMpKSxleGFtcGxlcy5kb3h5KQorZG94eWZpbGU6IGxpYnMuZG94eV90ZW1wbGF0ZSBsaWJzLmRveHkKKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCUBjYXQgJF4gPiAkQAorCUBlY2hvICJTVFJJUF9GUk9NX1BBVEggKz0gJChTUkNfUEFUSF9CQVJFKSAkKEJVSUxEX1JPT1QpIiA+PiAkQAorCUBlY2hvICJJTlBVVCArPSAkKGFkZHByZWZpeCAkKFNSQ19QQVRIX0JBUkUpLywkKENPREVDX0RPWCkpIiA+PiAkQDsKKwlAZWNobyAiSU5QVVQgKz0gJChUWFRfRE9YKSIgPj4gJEA7CisJQGVjaG8gIkVYQU1QTEVfUEFUSCArPSAkKEVYQU1QTEVfUEFUSCkiID4+ICRACisKK0NMRUFOLU9CSlMgKz0gZG94eWZpbGUgJCh3aWxkY2FyZCBkb2NzL2h0bWwvKikKK2RvY3MvaHRtbC9pbmRleC5odG1sOiBkb3h5ZmlsZSAkKENPREVDX0RPWCkgJChUWFRfRE9YKQorCUBlY2hvICIgICAgW0RPWFlHRU5dICQ8IgorCUBkb3h5Z2VuICQ8CitET0NTLXllcyArPSBkb2NzL2h0bWwvaW5kZXguaHRtbAorCitESVNULURPQ1MteWVzID0gJCh3aWxkY2FyZCBkb2NzL2h0bWwvKikKK0RJU1QtRE9DUy0kKENPTkZJR19DT0RFQ19TUkNTKSArPSAkKGFkZHByZWZpeCBzcmMvLCQoQ09ERUNfRE9YKSkKK0RJU1QtRE9DUy0kKENPTkZJR19DT0RFQ19TUkNTKSArPSBzcmMvbGlicy5kb3h5X3RlbXBsYXRlCitESVNULURPQ1MteWVzICAgICAgICAgICAgICAgICAgKz0gQ0hBTkdFTE9HCitESVNULURPQ1MteWVzICAgICAgICAgICAgICAgICAgKz0gUkVBRE1FCmRpZmYgLS1naXQgYS9leGFtcGxlX3htYS5jIGIvbGlidnB4L2V4YW1wbGVfeG1hLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVfeG1hLmMKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlX3htYS5jCmRpZmYgLS1naXQgYS9saWJ2cHgvZXhhbXBsZXMubWsgYi9saWJ2cHgvZXhhbXBsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5MTNlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9leGFtcGxlcy5tawpAQCAtMCwwICsxLDI4NSBAQAorIyMKKyMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMKKyMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisjIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisjIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMjCisKKworIyBMaXN0IG9mIGV4YW1wbGVzIHRvIGJ1aWxkLiBVVElMUyBhcmUgZmlsZXMgdGhhdCBhcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlCisjIHRyZWUgZGlyZWN0bHksIGFuZCBHRU5fRVhBTVBMRVMgYXJlIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSB0aGUKKyMgZXhhbXBsZXMgZm9sZGVyLgorVVRJTFMtJChDT05GSUdfREVDT0RFUlMpICAgICs9IHZweGRlYy5jCit2cHhkZWMuU1JDUyAgICAgICAgICAgICAgICAgKz0gbWQ1X3V0aWxzLmMgbWQ1X3V0aWxzLmgKK3ZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSB2cHhfcG9ydHMvdnB4X3RpbWVyLmgKK3ZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSB2cHgvdnB4X2ludGVnZXIuaAordnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IGFyZ3MuYyBhcmdzLmgKK3ZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSB0b29sc19jb21tb24uYyB0b29sc19jb21tb24uaAordnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvaGFsbG9jL2hhbGxvYy5oCit2cHhkZWMuU1JDUyAgICAgICAgICAgICAgICAgKz0gbmVzdGVnZy9oYWxsb2Mvc3JjL2FsaWduLmgKK3ZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSBuZXN0ZWdnL2hhbGxvYy9zcmMvaGFsbG9jLmMKK3ZweGRlYy5TUkNTICAgICAgICAgICAgICAgICArPSBuZXN0ZWdnL2hhbGxvYy9zcmMvaGxpc3QuaAordnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvaGFsbG9jL3NyYy9tYWNyb3MuaAordnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaAordnB4ZGVjLlNSQ1MgICAgICAgICAgICAgICAgICs9IG5lc3RlZ2cvc3JjL25lc3RlZ2cuYwordnB4ZGVjLkdVSUQgICAgICAgICAgICAgICAgICA9IEJBNUZFNjZGLTM4REQtRTAzNC1GNTQyLUIxNTc4QzVGQjk1MAordnB4ZGVjLkRFU0NSSVBUSU9OICAgICAgICAgICA9IEZ1bGwgZmVhdHVyZWQgZGVjb2RlcgorVVRJTFMtJChDT05GSUdfRU5DT0RFUlMpICAgICs9IHZweGVuYy5jCit2cHhlbmMuU1JDUyAgICAgICAgICAgICAgICAgKz0gYXJncy5jIGFyZ3MuaCB5NG1pbnB1dC5jIHk0bWlucHV0LmgKK3ZweGVuYy5TUkNTICAgICAgICAgICAgICAgICArPSB0b29sc19jb21tb24uYyB0b29sc19jb21tb24uaAordnB4ZW5jLlNSQ1MgICAgICAgICAgICAgICAgICs9IHZweF9wb3J0cy9tZW1fb3BzLmgKK3ZweGVuYy5TUkNTICAgICAgICAgICAgICAgICArPSB2cHhfcG9ydHMvbWVtX29wc19hbGlnbmVkLmgKK3ZweGVuYy5TUkNTICAgICAgICAgICAgICAgICArPSB2cHhfcG9ydHMvdnB4X3RpbWVyLmgKK3ZweGVuYy5TUkNTICAgICAgICAgICAgICAgICArPSBsaWJta3YvRWJtbElEcy5oCit2cHhlbmMuU1JDUyAgICAgICAgICAgICAgICAgKz0gbGlibWt2L0VibWxXcml0ZXIuYwordnB4ZW5jLlNSQ1MgICAgICAgICAgICAgICAgICs9IGxpYm1rdi9FYm1sV3JpdGVyLmgKK3ZweGVuYy5HVUlEICAgICAgICAgICAgICAgICAgPSA1NDhERUM3NC03QTE1LTRCMkItQUZDMy1BQTEwMkU3QzI1QzEKK3ZweGVuYy5ERVNDUklQVElPTiAgICAgICAgICAgPSBGdWxsIGZlYXR1cmVkIGVuY29kZXIKK1VUSUxTLSQoQ09ORklHX0VOQ09ERVJTKSAgICArPSB2cDhfc2NhbGFibGVfcGF0dGVybnMuYwordnA4X3NjYWxhYmxlX3BhdHRlcm5zLkdVSUQgICA9IDBENkEyMTBCLUY0ODItNEQ2Ri04NTcwLTRBOUMwMUFDQzg4QwordnA4X3NjYWxhYmxlX3BhdHRlcm5zLkRFU0NSSVBUSU9OID0gVGVtcG9yYWwgU2NhbGFiaWxpdHkgRW5jb2RlcgorCisjIENsZWFuIHVwIG9sZCBpdmZlbmMsIGl2ZmRlYyBiaW5hcmllcy4KK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKK0NMRUFOLU9CSlMgKz0gJChmb3JlYWNoIHAsJChWU19QTEFURk9STVMpLCQocCkvUmVsZWFzZS9pdmZlbmMuZXhlKQorQ0xFQU4tT0JKUyArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChwKS9SZWxlYXNlL2l2ZmRlYy5leGUpCitlbHNlCitDTEVBTi1PQkpTICs9IGl2ZmVuY3suYy5vLC5jLmQsLmRveCwuZXhlLH0KK0NMRUFOLU9CSlMgKz0gaXZmZGVjey5jLm8sLmMuZCwuZG94LC5leGUsfQorZW5kaWYKKworIyBYTUEgZXhhbXBsZSBkaXNhYmxlZCBmb3Igbm93LCBub3QgdXNlZCBpbiBWUDgKKyNVVElMUy0kKENPTkZJR19ERUNPREVSUykgICAgKz0gZXhhbXBsZV94bWEuYworI2V4YW1wbGVfeG1hLkdVSUQgICAgICAgICAgICAgPSBBOTU1RkM0QS03M0YxLTQ0RjctMTM1RS0zMEQ4NEQzMkYwMjIKKyNleGFtcGxlX3htYS5ERVNDUklQVElPTiAgICAgID0gRXh0ZXJuYWwgTWVtb3J5IEFsbG9jYXRpb24gbW9kZSB1c2FnZQorCitHRU5fRVhBTVBMRVMtJChDT05GSUdfREVDT0RFUlMpICs9IHNpbXBsZV9kZWNvZGVyLmMKK3NpbXBsZV9kZWNvZGVyLkdVSUQgICAgICAgICAgICAgID0gRDNCQkYxRTktMjQyNy00NTBELUJCRkYtQjI4NDNDMUQ0NENDCitzaW1wbGVfZGVjb2Rlci5ERVNDUklQVElPTiAgICAgICA9IFNpbXBsaWZpZWQgZGVjb2RlciBsb29wCitHRU5fRVhBTVBMRVMtJChDT05GSUdfREVDT0RFUlMpICs9IHBvc3Rwcm9jLmMKK3Bvc3Rwcm9jLkdVSUQgICAgICAgICAgICAgICAgICAgID0gNjVFMzMzNTUtRjM1RS00MDg4LTg4NEQtM0ZENDkwNTg4MUQ3Citwb3N0cHJvYy5ERVNDUklQVElPTiAgICAgICAgICAgICA9IERlY29kZXIgcG9zdHByb2Nlc3NvciBjb250cm9sCitHRU5fRVhBTVBMRVMtJChDT05GSUdfREVDT0RFUlMpICs9IGRlY29kZV90b19tZDUuYworZGVjb2RlX3RvX21kNS5TUkNTICAgICAgICAgICAgICArPSBtZDVfdXRpbHMuaCBtZDVfdXRpbHMuYworZGVjb2RlX3RvX21kNS5HVUlEICAgICAgICAgICAgICAgPSA1OTEyMEI5Qi0yNzM1LTRCRkUtQjAyMi0xNDZDQTM0MEZFNDIKK2RlY29kZV90b19tZDUuREVTQ1JJUFRJT04gICAgICAgID0gRnJhbWUgYnkgZnJhbWUgTUQ1IGNoZWNrc3VtCisKK0dFTl9FWEFNUExFUy0kKENPTkZJR19FTkNPREVSUykgKz0gc2ltcGxlX2VuY29kZXIuYworc2ltcGxlX2VuY29kZXIuR1VJRCAgICAgICAgICAgICAgPSA0NjA3RDI5OS04QTcxLTREMkMtOUIxRC0wNzE4OTlCNkZCRkQKK3NpbXBsZV9lbmNvZGVyLkRFU0NSSVBUSU9OICAgICAgID0gU2ltcGxpZmllZCBlbmNvZGVyIGxvb3AKK0dFTl9FWEFNUExFUy0kKENPTkZJR19FTkNPREVSUykgKz0gdHdvcGFzc19lbmNvZGVyLmMKK3R3b3Bhc3NfZW5jb2Rlci5HVUlEICAgICAgICAgICAgID0gNzM0OTRGQTYtNEFGOS00NzYzLThGQkItMjY1QzkyNDAyRkQ4Cit0d29wYXNzX2VuY29kZXIuREVTQ1JJUFRJT04gICAgICA9IFR3by1wYXNzIGVuY29kZXIgbG9vcAorR0VOX0VYQU1QTEVTLSQoQ09ORklHX0VOQ09ERVJTKSArPSBmb3JjZV9rZXlmcmFtZS5jCitmb3JjZV9rZXlmcmFtZS5HVUlEICAgICAgICAgICAgICA9IDNDNjdDQURGLTAyOUYtNEM4Ni04MUY1LUQ2RDRGNTExNzdGMAorZm9yY2Vfa2V5ZnJhbWUuREVTQ1JJUFRJT04gICAgICAgPSBGb3JjZSBnZW5lcmF0aW9uIG9mIGtleWZyYW1lcworaWZlcSAoJChDT05GSUdfREVDT0RFUlMpLHllcykKK0dFTl9FWEFNUExFUy0kKENPTkZJR19FTkNPREVSUykgKz0gZGVjb2RlX3dpdGhfZHJvcHMuYworZW5kaWYKK2RlY29kZV93aXRoX2Ryb3BzLkdVSUQgICAgICAgICAgID0gQ0U1QzUzQzQtOEREQS00MzhBLTg2RUQtMERERDNDREI4RDI2CitkZWNvZGVfd2l0aF9kcm9wcy5ERVNDUklQVElPTiAgICA9IERyb3BzIGZyYW1lcyB3aGlsZSBkZWNvZGluZworaWZlcSAoJChDT05GSUdfREVDT0RFUlMpLHllcykKK0dFTl9FWEFNUExFUy0kKENPTkZJR19FUlJPUl9DT05DRUFMTUVOVCkgKz0gZGVjb2RlX3dpdGhfcGFydGlhbF9kcm9wcy5jCitlbmRpZgorZGVjb2RlX3dpdGhfcGFydGlhbF9kcm9wcy5HVUlEICAgICAgICAgICA9IDYxQzJEMDI2LTU3NTQtNDZBQy05MTZGLTEzNDNFQ0M1NTM3RQorZGVjb2RlX3dpdGhfcGFydGlhbF9kcm9wcy5ERVNDUklQVElPTiAgICA9IERyb3BzIHBhcnRzIG9mIGZyYW1lcyB3aGlsZSBkZWNvZGluZworR0VOX0VYQU1QTEVTLSQoQ09ORklHX0VOQ09ERVJTKSArPSBlcnJvcl9yZXNpbGllbnQuYworZXJyb3JfcmVzaWxpZW50LkdVSUQgICAgICAgICAgICAgPSBERjU4MzdCOS00MTQ1LTRGOTItQTAzMS00NEU0RjgzMkUwMEMKK2Vycm9yX3Jlc2lsaWVudC5ERVNDUklQVElPTiAgICAgID0gRXJyb3IgUmVzaWxpZW5jeSBGZWF0dXJlCisKK0dFTl9FWEFNUExFUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gdnA4X3NldF9tYXBzLmMKK3ZwOF9zZXRfbWFwcy5HVUlEICAgICAgICAgICAgICAgICAgID0gRUNCMkQyNEQtOThCOC00MDE1LUE0NjUtQTRBRjNEQ0MxNDVGCit2cDhfc2V0X21hcHMuREVTQ1JJUFRJT04gICAgICAgICAgICA9IFZQOCBzZXQgYWN0aXZlIGFuZCBST0kgbWFwcworR0VOX0VYQU1QTEVTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSB2cDhjeF9zZXRfcmVmLmMKK3ZwOGN4X3NldF9yZWYuR1VJRCAgICAgICAgICAgICAgICAgID0gQzVFMzFGN0YtOTZGNi00OEJELUJEM0UtMTBFQkY2RTgwNTdBCit2cDhjeF9zZXRfcmVmLkRFU0NSSVBUSU9OICAgICAgICAgICA9IFZQOCBzZXQgZW5jb2RlciByZWZlcmVuY2UgZnJhbWUKKworIyBDIGZpbGUgaXMgcHJvdmlkZWQsIG5vdCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4KK1VUSUxTLSQoQ09ORklHX01VTFRJX1JFU19FTkNPRElORykgKz0gdnA4X211bHRpX3Jlc29sdXRpb25fZW5jb2Rlci5jCit2cDhfbXVsdGlfcmVzb2x1dGlvbl9lbmNvZGVyLlNSQ1MgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICArPSB0aGlyZF9wYXJ0eS9saWJ5dXYvaW5jbHVkZS9saWJ5dXYvYmFzaWNfdHlwZXMuaCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9jcHVfaWQuaCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9zY2FsZS5oICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcGFydHkvbGlieXV2L3NvdXJjZS9yb3cuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcGFydHkvbGlieXV2L3NvdXJjZS9zY2FsZS5jICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcGFydHkvbGlieXV2L3NvdXJjZS9jcHVfaWQuYwordnA4X211bHRpX3Jlc29sdXRpb25fZW5jb2Rlci5HVUlEICAgICAgICAgPSAwNGY4NzM4ZS02M2M4LTQyM2ItOTBmYS03YzI3MDNhMzc0ZGUKK3ZwOF9tdWx0aV9yZXNvbHV0aW9uX2VuY29kZXIuREVTQ1JJUFRJT04gID0gVlA4IE11bHRpcGxlLXJlc29sdXRpb24gRW5jb2RpbmcKKworIyBIYW5kbGUgZXh0cmEgbGlicmFyeSBmbGFncyBkZXBlbmRpbmcgb24gY29kZWMgY29uZmlndXJhdGlvbgorCisjIFdlIHNob3VsZCBub3QgbGluayB0byBtYXRoIGxpYnJhcnkgKGxpYm0pIG9uIFJWQ1QKKyMgd2hlbiBidWlsZGluZyBmb3IgYmFyZS1tZXRhbCB0YXJnZXRzCitpZmVxICgkKENPTkZJR19PU19TVVBQT1JUKSwgeWVzKQorQ09ERUNfRVhUUkFfTElCUy0kKENPTkZJR19WUDgpICAgICAgICAgKz0gbQorZWxzZQorICAgIGlmZXEgKCQoQ09ORklHX0dDQyksIHllcykKKyAgICBDT0RFQ19FWFRSQV9MSUJTLSQoQ09ORklHX1ZQOCkgICAgICAgICArPSBtCisgICAgZW5kaWYKK2VuZGlmCisjCisjIEVuZCBvZiBzcGVjaWZpZWQgZmlsZXMuIFRoZSByZXN0IG9mIHRoZSBidWlsZCBydWxlcyBzaG91bGQgaGFwcGVuCisjIGF1dG9tYWdpY2FsbHkgZnJvbSBoZXJlLgorIworCisKKyMgRXhhbXBsZXMgbmVlZCBkaWZmZXJlbnQgZmxhZ3MgYmFzZWQgb24gd2hldGhlciB3ZSdyZSBidWlsZGluZworIyBmcm9tIGFuIGluc3RhbGxlZCB0cmVlIG9yIGEgdmVyc2lvbiBjb250cm9sbGVkIHRyZWUuIERldGVybWluZQorIyB0aGUgcHJvcGVyIHBhdGhzLgoraWZlcSAoJChIQVZFX0FMVF9UUkVFX0xBWU9VVCkseWVzKQorICAgIExJQl9QQVRIIDo9ICQoU1JDX1BBVEhfQkFSRSkvLi4vbGliCisgICAgSU5DX1BBVEggOj0gJChTUkNfUEFUSF9CQVJFKS8uLi9pbmNsdWRlCitlbHNlCisgICAgTElCX1BBVEgteWVzICAgICAgICAgICAgICAgICAgICAgKz0gJChpZiAkKEJVSUxEX1BGWCksJChCVUlMRF9QRlgpLC4pCisgICAgSU5DX1BBVEgtJChDT05GSUdfVlA4X0RFQ09ERVIpICAgKz0gJChTUkNfUEFUSF9CQVJFKS92cDgKKyAgICBJTkNfUEFUSC0kKENPTkZJR19WUDhfRU5DT0RFUikgICArPSAkKFNSQ19QQVRIX0JBUkUpL3ZwOAorICAgIExJQl9QQVRIIDo9ICQoY2FsbCBlbmFibGVkLExJQl9QQVRIKQorICAgIElOQ19QQVRIIDo9ICQoY2FsbCBlbmFibGVkLElOQ19QQVRIKQorZW5kaWYKK0lOVEVSTkFMX0NGTEFHUyA9ICQoYWRkcHJlZml4IC1JLCQoSU5DX1BBVEgpKQorSU5URVJOQUxfTERGTEFHUyArPSAkKGFkZHByZWZpeCAtTCwkKExJQl9QQVRIKSkKKworCisjIEV4cGFuZCBsaXN0IG9mIHNlbGVjdGVkIGV4YW1wbGVzIHRvIGJ1aWxkIChhcyBzcGVjaWZpZWQgYWJvdmUpCitVVElMUyAgICAgICAgICAgPSAkKGNhbGwgZW5hYmxlZCxVVElMUykKK0dFTl9FWEFNUExFUyAgICA9ICQoY2FsbCBlbmFibGVkLEdFTl9FWEFNUExFUykKK0FMTF9FWEFNUExFUyAgICA9ICQoVVRJTFMpICQoR0VOX0VYQU1QTEVTKQorVVRJTF9TUkNTICAgICAgID0gJChmb3JlYWNoIGV4LCQoVVRJTFMpLCQoJChleDouYz0pLlNSQ1MpKQorQUxMX1NSQ1MgICAgICAgID0gJChmb3JlYWNoIGV4LCQoQUxMX0VYQU1QTEVTKSwkKCQoZXg6LmM9KS5TUkNTKSkKK0NPREVDX0VYVFJBX0xJQlM9JChzb3J0ICQoY2FsbCBlbmFibGVkLENPREVDX0VYVFJBX0xJQlMpKQorCisKKyMgRXhwYW5kIGFsbCBleGFtcGxlIHNvdXJjZXMgaW50byBhIHZhcmlhYmxlIGNvbnRhaW5pbmcgYWxsIHNvdXJjZXMKKyMgZm9yIHRoYXQgZXhhbXBsZSAobm90IGp1c3QgdGhlbSBtYWluIG9uZSBzcGVjaWZpZWQgaW4gVVRJTFMvR0VOX0VYQU1QTEVTKQorIyBhbmQgYWRkIHRoaXMgZmlsZSB0byB0aGUgbGlzdCAoZm9yIE1TVlMgd29ya3NwYWNlIGdlbmVyYXRpb24pCiskKGZvcmVhY2ggZXgsJChBTExfRVhBTVBMRVMpLCQoZXZhbCAkKGV4Oi5jPSkuU1JDUyArPSAkKGV4KSBleGFtcGxlcy5taykpCisKKworIyBJZiB0aGlzIGlzIGEgdW5pdmVyc2FsIChmYXQpIGJpbmFyeSwgdGhlbiBhbGwgdGhlIHN1YmFyY2hpdGVjdHVyZXMgaGF2ZQorIyBhbHJlYWR5IGJlZW4gYnVpbHQgYW5kIG91ciBqb2IgaXMgdG8gc3RpdGNoIHRoZW0gdG9nZXRoZXIuIFRoZQorIyBCVUlMRF9PQkpTIHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBiZSBidWlsZGluZworIyAoY29tcGlsaW5nLCBsaW5raW5nKSB0aGUgbGlicmFyeS4gVGhlIExJUE9fT0JKUyB2YXJpYWJsZSBpbmRpY2F0ZXMKKyMgdGhhdCB3ZSdyZSBzdGl0Y2hpbmcuCiskKGV2YWwgJChpZiAkKGZpbHRlciB1bml2ZXJzYWwlLCQoVE9PTENIQUlOKSksTElQT19PQkpTLEJVSUxEX09CSlMpOj15ZXMpCisKKworIyBDcmVhdGUgYnVpbGQvaW5zdGFsbCBkZXBlbmRlbmNpZXMgZm9yIGFsbCBleGFtcGxlcy4gVGhlIGNvbW1vbiBjYXNlCisjIGlzIGhhbmRsZWQgaGVyZS4gVGhlIE1TVlMgY2FzZSBpcyBoYW5kbGVkIGJlbG93LgorTk9UX01TVlMgPSAkKGlmICQoQ09ORklHX01TVlMpLCx5ZXMpCitESVNULUJJTlMtJChOT1RfTVNWUykgICAgICArPSAkKGFkZHByZWZpeCBiaW4vLCQoQUxMX0VYQU1QTEVTOi5jPSQoRVhFX1NGWCkpKQorSU5TVEFMTC1CSU5TLSQoTk9UX01TVlMpICAgKz0gJChhZGRwcmVmaXggYmluLywkKFVUSUxTOi5jPSQoRVhFX1NGWCkpKQorRElTVC1TUkNTLXllcyAgICAgICAgICAgICAgKz0gJChBTExfU1JDUykKK0lOU1RBTEwtU1JDUy15ZXMgICAgICAgICAgICs9ICQoVVRJTF9TUkNTKQorT0JKUy0kKE5PVF9NU1ZTKSAgICAgICAgICAgKz0gJChpZiAkKEJVSUxEX09CSlMpLCQoY2FsbCBvYmpzLCQoQUxMX1NSQ1MpKSkKK0JJTlMtJChOT1RfTVNWUykgICAgICAgICAgICs9ICQoYWRkcHJlZml4ICQoQlVJTERfUEZYKSwkKEFMTF9FWEFNUExFUzouYz0kKEVYRV9TRlgpKSkKKworCisjIEluc3RhbnRpYXRlIGxpbmtlciB0ZW1wbGF0ZSBmb3IgYWxsIGV4YW1wbGVzLgorQ09ERUNfTElCPSQoaWYgJChDT05GSUdfREVCVUdfTElCUyksdnB4X2csdnB4KQorQ09ERUNfTElCX1NVRj0kKGlmICQoQ09ORklHX1NIQVJFRCksLnNvLC5hKQorJChmb3JlYWNoIGJpbiwkKEJJTlMteWVzKSxcCisgICAgJChpZiAkKEJVSUxEX09CSlMpLCQoZXZhbCAkKGJpbik6XAorICAgICAgICAkKExJQl9QQVRIKS9saWIkKENPREVDX0xJQikkKENPREVDX0xJQl9TVUYpKSlcCisgICAgJChpZiAkKEJVSUxEX09CSlMpLCQoZXZhbCAkKGNhbGwgbGlua2VyX3RlbXBsYXRlLCQoYmluKSxcCisgICAgICAgICQoY2FsbCBvYmpzLCQoJChub3RkaXIgJChiaW46JChFWEVfU0ZYKT0pKS5TUkNTKSkgXAorICAgICAgICAtbCQoQ09ERUNfTElCKSAkKGFkZHByZWZpeCAtbCwkKENPREVDX0VYVFJBX0xJQlMpKVwKKyAgICAgICAgKSkpXAorICAgICQoaWYgJChMSVBPX09CSlMpLCQoZXZhbCAkKGNhbGwgbGlwb19iaW5fdGVtcGxhdGUsJChiaW4pKSkpXAorICAgICkKKworCisjIFJ1bGVzIHRvIGdlbmVyYXRlIHRoZSBHRU5fRVhBTVBMRVMgc291cmNlcworLlBSRUNJT1VTOiAlLmMKK0NMRUFOLU9CSlMgKz0gJChHRU5fRVhBTVBMRVMpCislLmM6IGV4YW1wbGVzLyUudHh0CisJQGVjaG8gIiAgICBbRVhBTVBMRV0gJEAiCisJQCQoU1JDX1BBVEhfQkFSRSkvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfY29kZS5zaCAkPCA+ICRACisKKworIyBUaGUgZm9sbG93aW5nIHBhaXJzIGRlZmluZSBhIG1hcHBpbmcgb2YgbG9jYXRpb25zIGluIHRoZSBkaXN0cmlidXRpb24KKyMgdHJlZSB0byBsb2NhdGlvbnMgaW4gdGhlIHNvdXJjZS9idWlsZCB0cmVlcy4KK0lOU1RBTExfTUFQUyArPSBzcmMvJS5jICAgJS5jCitJTlNUQUxMX01BUFMgKz0gc3JjLyUgICAgICQoU1JDX1BBVEhfQkFSRSkvJQorSU5TVEFMTF9NQVBTICs9IGJpbi8lICAgICAlCitJTlNUQUxMX01BUFMgKz0gJSAgICAgICAgICUKKworCisjIFNldCB1cCBhZGRpdGlvbmFsIE1TVlMgZW52aXJvbm1lbnQKK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKK0NPREVDX0xJQj0kKGlmICQoQ09ORklHX1NUQVRJQ19NU1ZDUlQpLHZweG10LHZweG1kKQorIyBUaGlzIHZhcmlhYmxlIHVzZXMgZGVmZXJyZWQgZXhwYW5zaW9uIGludGVudGlvbmFsbHksIHNpbmNlIHRoZSByZXN1bHRzIG9mCisjICQod2lsZGNhcmQpIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIE1ha2UuCitWU19QTEFURk9STVMgPSAkKGZvcmVhY2ggZCwkKHdpbGRjYXJkICovUmVsZWFzZS8kKENPREVDX0xJQikubGliKSwkKHdvcmQgMSwkKHN1YnN0IC8sICwkKGQpKSkpCitJTlNUQUxMX01BUFMgKz0gJChmb3JlYWNoIHAsJChWU19QTEFURk9STVMpLGJpbi8kKHApLyUgICQocCkvUmVsZWFzZS8lKQorZW5kaWYKKworIyBCdWlsZCBWaXN1YWwgU3R1ZGlvIFByb2plY3RzLiBXZSB1c2UgYSB0ZW1wbGF0ZSBoZXJlIHRvIGluc3RhbnRpYXRlCisjIGV4cGxpY2l0IHJ1bGVzIHJhdGhlciB0aGFuIHVzaW5nIGFuIGltcGxpY2l0IHJ1bGUgYmVjYXVzZSB3ZSB3YW50IHRvCisjIGxldmVyYWdlIG1ha2UncyBWUEFUSCBzZWFyY2hpbmcgcmF0aGVyIHRoYW4gc3BlY2lmeWluZyB0aGUgcGF0aHMgb24KKyMgZWFjaCBmaWxlIGluIEFMTF9FWEFNUExFUy4gVGhpcyBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IHRoYXQKKyMgdG91Y2hpbmcgdGhlIHNvdXJjZSBmaWxlcyB0cmlnZ2VyIGEgcmVidWlsZCBvZiB0aGUgcHJvamVjdCBmaWxlcworIyBldmVuIHRob3VnaCB0aGVyZSBpcyBubyByZWFsIGRlcGVuZGVuY3kgdGhlcmUgKHRoZSBkZXBlbmRlbmN5IGlzIG9uCisjIHRoZSBtYWtlZmlsZXMpLiBXZSBtYXkgd2FudCB0byByZXZpc2l0IHRoaXMuCitkZWZpbmUgdmNwcm9qX3RlbXBsYXRlCiskKDEpOiAkKCQoMToudmNwcm9qPSkuU1JDUykKKwlAZWNobyAiICAgIFt2Y3Byb2pdICQkQCIKKwkkJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL2dlbl9tc3ZzX3Byb2ouc2hcCisgICAgICAgICAgICAtLWV4ZVwKKyAgICAgICAgICAgIC0tdGFyZ2V0PSQkKFRPT0xDSEFJTilcCisgICAgICAgICAgICAtLW5hbWU9JCQoQDoudmNwcm9qPSlcCisgICAgICAgICAgICAtLXZlcj0kJChDT05GSUdfVlNfVkVSU0lPTilcCisgICAgICAgICAgICAtLXByb2otZ3VpZD0kJCgkJChAOi52Y3Byb2o9KS5HVUlEKVwKKyAgICAgICAgICAgICQkKGlmICQkKENPTkZJR19TVEFUSUNfTVNWQ1JUKSwtLXN0YXRpYy1jcnQpIFwKKyAgICAgICAgICAgIC0tb3V0PSQkQCAkJChJTlRFUk5BTF9DRkxBR1MpICQkKENGTEFHUykgXAorICAgICAgICAgICAgJCQoSU5URVJOQUxfTERGTEFHUykgJCQoTERGTEFHUykgLWwkJChDT0RFQ19MSUIpIC1sd2lubW0gJCReCitlbmRlZgorUFJPSkVDVFMtJChDT05GSUdfTVNWUykgKz0gJChBTExfRVhBTVBMRVM6LmM9LnZjcHJvaikKK0lOU1RBTEwtQklOUy0kKENPTkZJR19NU1ZTKSArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IGJpbi8kKHApLywkKEFMTF9FWEFNUExFUzouYz0uZXhlKSkpCiskKGZvcmVhY2ggcHJvaiwkKGNhbGwgZW5hYmxlZCxQUk9KRUNUUyksXAorICAgICQoZXZhbCAkKGNhbGwgdmNwcm9qX3RlbXBsYXRlLCQocHJvaikpKSkKKworCisKKyMKKyMgRG9jdW1lbnRhdGlvbiBSdWxlcworIworJS5kb3g6IGV4YW1wbGVzLyUudHh0CisJQGVjaG8gIiAgICBbRE9YWV0gJEAiCisJQCQoU1JDX1BBVEhfQkFSRSkvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfdGV4dC5zaCAkPCB8IFwKKyAgICAgICAgICQoU1JDX1BBVEhfQkFSRSkvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfZG94eS5waHAgXAorICAgICAgICAgICAgIGV4YW1wbGVfJChAOi5kb3g9KSAgJChAOi5kb3g9LmMpID4gJEAKKworJS5kb3g6ICUuYworCUBlY2hvICIgICAgW0RPWFldICRAIgorCUBlY2hvICIvKiFccGFnZSBleGFtcGxlXyQoQDouZG94PSkgJChAOi5kb3g9KSIgPiAkQAorCUBlY2hvICIgICBcaW5jbHVkZWxpbmVubyAkKG5vdGRpciAkPCkiID4+ICRACisJQGVjaG8gIiovIiA+PiAkQAorCitzYW1wbGVzLmRveDogZXhhbXBsZXMubWsKKwlAZWNobyAiICAgIFtET1hZXSAkQCIKKwlAZWNobyAiLyohXHBhZ2Ugc2FtcGxlcyBTYW1wbGUgQ29kZSIgPiAkQAorCUBlY2hvICIgICAgVGhpcyBTREsgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc2FtcGxlIGFwcGxpY2F0aW9ucy4iXAorCSAgICAgICJlYWNoIHNhbXBsZSBkb2N1bWVudHMgYSBmZWF0dXJlIG9mIHRoZSBTREsgaW4gYm90aCBwcm9zZSJcCisJICAgICAgImFuZCB0aGUgYXNzb2NpYXRlZCBDIGNvZGUuIEluIGdlbmVyYWwsIGxhdGVyIHNhbXBsZXMiXAorCSAgICAgICJidWlsZCB1cG9uIHByaW9yIHNhbXBsZXMsIHNvIGl0IGlzIGJlc3QgdG8gd29yayB0aHJvdWdoIHRoZSJcCisJICAgICAgImxpc3QgaW4gb3JkZXIuIFRoZSBmb2xsb3dpbmcgc2FtcGxlcyBhcmUgaW5jbHVkZWQ6ICI+PiRACisJQCQoZm9yZWFjaCBleCwkKEdFTl9FWEFNUExFUzouYz0pLFwKKwkgICBlY2hvICIgICAgIC0gXHN1YnBhZ2UgZXhhbXBsZV8kKGV4KSAkKCQoZXgpLkRFU0NSSVBUSU9OKSIgPj4gJEA7KQorCUBlY2hvID4+ICRACisJQGVjaG8gIiAgICBJbiBhZGRpdGlvbiwgdGhlIFNESyBjb250YWlucyBhIG51bWJlciBvZiB1dGlsaXRpZXMuIlwKKyAgICAgICAgICAgICAgIlNpbmNlIHRoZXNlIHV0aWxpdGllcyBhcmUgYnVpbHQgdXBvbiB0aGUgY29uY2VwdHMgZGVzY3JpYmVkIlwKKyAgICAgICAgICAgICAgImluIHRoZSBzYW1wbGUgY29kZSBsaXN0ZWQgYWJvdmUsIHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIGluIlwKKyAgICAgICAgICAgICAgInBpZWNlcyBsaWtlIHRoZSBzYW1wbGVzIGFyZS4gVGhpciBzb3VyY3JlIGlzIGluY2x1ZGVkIGhlcmUiXAorICAgICAgICAgICAgICAiZm9yIHJlZmVyZW5jZS4gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgYXJlIGluY2x1ZGVkOiIgPj4gJEAKKwlAJChmb3JlYWNoIGV4LCQoVVRJTFM6LmM9KSxcCisJICAgZWNobyAiICAgICAtIFxzdWJwYWdlIGV4YW1wbGVfJChleCkgJCgkKGV4KS5ERVNDUklQVElPTikiID4+ICRAOykKKwlAZWNobyAiKi8iID4+ICRACisKK0NMRUFOLU9CSlMgKz0gZXhhbXBsZXMuZG94eSBzYW1wbGVzLmRveCAkKEFMTF9FWEFNUExFUzouYz0uZG94KQorRE9DUy15ZXMgKz0gZXhhbXBsZXMuZG94eSBzYW1wbGVzLmRveCAkKEFMTF9FWEFNUExFUzouYz0uZG94KQorZXhhbXBsZXMuZG94eTogc2FtcGxlcy5kb3ggJChBTExfRVhBTVBMRVM6LmM9LmRveCkKKwlAZWNobyAiSU5QVVQgKz0gJF4iID4gJEAKZGlmZiAtLWdpdCBhL2xpYnZweC9leGFtcGxlcy9kZWNvZGVfdG9fbWQ1LnR4dCBiL2xpYnZweC9leGFtcGxlcy9kZWNvZGVfdG9fbWQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTBlYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2V4YW1wbGVzL2RlY29kZV90b19tZDUudHh0CkBAIC0wLDAgKzEsNDggQEAKK0BURU1QTEFURSBkZWNvZGVyX3RtcGwuYworRnJhbWUtYnktZnJhbWUgTUQ1IENoZWNrc3VtCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IElOVFJPRFVDVElPTgorVGhpcyBleGFtcGxlIGJ1aWxkcyB1cG9uIHRoZSBzaW1wbGUgZGVjb2RlciBsb29wIHRvIHNob3cgaG93IGNoZWNrc3Vtcworb2YgdGhlIGRlY29kZWQgb3V0cHV0IGNhbiBiZSBnZW5lcmF0ZWQuIFRoZXNlIGFyZSB1c2VkIGZvciB2YWxpZGF0aW5nCitkZWNvZGVyIGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIGZvciBleGFtcGxlLgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gSU5UUk9EVUNUSU9OCisKK01ENSBhbGdvcml0aG0KKy0tLS0tLS0tLS0tLS0KK1RoZSBNZXNzYWdlLURpZ2VzdCA1IChNRDUpIGlzIGEgd2VsbCBrbm93biBoYXNoIGZ1bmN0aW9uLiBXZSBoYXZlIHByb3ZpZGVkCithbiBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdAorQWxnb3JpdGhtIGZvciB5b3VyIHVzZS4gT3VyIGltcGxtZW50YXRpb24gb25seSBjaGFuZ2VzIHRoZSBpbnRlcmZhY2Ugb2YgdGhpcworcmVmZXJlbmNlIGNvZGUuIFlvdSBtdXN0IGluY2x1ZGUgdGhlIGBtZDVfdXRpbHMuaGAgaGVhZGVyIGZvciBhY2Nlc3MgdG8gdGhlc2UKK2Z1bmN0aW9ucy4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVYVFJBX0lOQ0xVREVTCisjaW5jbHVkZSAibWQ1X3V0aWxzLmgiCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFWFRSQV9JTkNMVURFUworCisKK1Byb2Nlc3NpbmcgVGhlIERlY29kZWQgRGF0YQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFYWNoIHJvdyBvZiB0aGUgaW1hZ2UgaXMgcGFzc2VkIHRvIHRoZSBNRDUgYWNjdW11bGF0b3IuIEZpcnN0IHRoZSBZIHBsYW5lCitpcyBwcm9jZXNzZWQsIHRoZW4gVSwgdGhlbiBWLiBJdCBpcyBpbXBvcnRhbnQgdG8gaG9ub3IgdGhlIGltYWdlJ3MgYHN0cmlkZWAKK3ZhbHVlcy4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUFJPQ0VTU19EWAordW5zaWduZWQgY2hhciAgbWQ1X3N1bVsxNl07CitNRDVDb250ZXh0ICAgICBtZDU7CitpbnQgICAgICAgICAgICBpOworCitNRDVJbml0KCZtZDUpOworCitmb3IocGxhbmU9MDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgdW5zaWduZWQgY2hhciAqYnVmID1pbWctPnBsYW5lc1twbGFuZV07CisKKyAgICBmb3IoeT0wOyB5IDwgKHBsYW5lID8gKGltZy0+ZF9oICsgMSkgPj4gMSA6IGltZy0+ZF9oKTsgeSsrKSB7CisgICAgICAgIE1ENVVwZGF0ZSgmbWQ1LCBidWYsIChwbGFuZSA/IChpbWctPmRfdyArIDEpID4+IDEgOiBpbWctPmRfdykpOworICAgICAgICBidWYgKz0gaW1nLT5zdHJpZGVbcGxhbmVdOworICAgIH0KK30KKworTUQ1RmluYWwobWQ1X3N1bSwgJm1kNSk7Citmb3IoaT0wOyBpPDE2OyBpKyspCisgICAgZnByaW50ZihvdXRmaWxlLCAiJTAyeCIsbWQ1X3N1bVtpXSk7CitmcHJpbnRmKG91dGZpbGUsICIgIGltZy0lZHglZC0lMDRkLmk0MjBcbiIsIGltZy0+ZF93LCBpbWctPmRfaCwKKyAgICAgICAgZnJhbWVfY250KTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUFJPQ0VTU19EWApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGVjb2RlX3dpdGhfZHJvcHMudHh0IGIvbGlidnB4L2V4YW1wbGVzL2RlY29kZV93aXRoX2Ryb3BzLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvZGVjb2RlX3dpdGhfZHJvcHMudHh0CnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvZGVjb2RlX3dpdGhfZHJvcHMudHh0CmRpZmYgLS1naXQgYS9saWJ2cHgvZXhhbXBsZXMvZGVjb2RlX3dpdGhfcGFydGlhbF9kcm9wcy50eHQgYi9saWJ2cHgvZXhhbXBsZXMvZGVjb2RlX3dpdGhfcGFydGlhbF9kcm9wcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwZDNkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9leGFtcGxlcy9kZWNvZGVfd2l0aF9wYXJ0aWFsX2Ryb3BzLnR4dApAQCAtMCwwICsxLDIzOCBAQAorQFRFTVBMQVRFIGRlY29kZXJfdG1wbC5jCitEZWNvZGUgV2l0aCBQYXJ0aWFsIERyb3BzIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IElOVFJPRFVDVElPTgorVGhpcyBpcyBhbiBleGFtcGxlIHV0aWxpdHkgd2hpY2ggZHJvcHMgYSBzZXJpZXMgb2YgZnJhbWVzIChvciBwYXJ0cyBvZiBmcmFtZXMpLAorYXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgaXMgdXNlZnVsIGZvciBvYnNlcnZpbmcgdGhlIGVycm9yCityZWNvdmVyeSBmZWF0dXJlcyBvZiB0aGUgY29kZWMuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBJTlRST0RVQ1RJT04KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRVhUUkFfSU5DTFVERVMKKyNpbmNsdWRlIDx0aW1lLmg+Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFWFRSQV9JTkNMVURFUworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBIRUxQRVJTCitzdHJ1Y3QgcGFyc2VkX2hlYWRlcgoreworICAgIGNoYXIga2V5X2ZyYW1lOworICAgIGludCB2ZXJzaW9uOworICAgIGNoYXIgc2hvd19mcmFtZTsKKyAgICBpbnQgZmlyc3RfcGFydF9zaXplOworfTsKKworaW50IG5leHRfcGFja2V0KHN0cnVjdCBwYXJzZWRfaGVhZGVyKiBoZHIsIGludCBwb3MsIGludCBsZW5ndGgsIGludCBtdHUpCit7CisgICAgaW50IHNpemUgPSAwOworICAgIGludCByZW1haW5pbmcgPSBsZW5ndGggLSBwb3M7CisgICAgLyogVW5jb21wcmVzc2VkIHBhcnQgaXMgMyBieXRlcyBmb3IgUCBmcmFtZXMgYW5kIDEwIGJ5dGVzIGZvciBJIGZyYW1lcyAqLworICAgIGludCB1bmNvbXBfcGFydF9zaXplID0gKGhkci0+a2V5X2ZyYW1lID8gMTAgOiAzKTsKKyAgICAvKiBudW1iZXIgb2YgYnl0ZXMgeWV0IHRvIHNlbmQgZnJvbSBoZWFkZXIgYW5kIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KKyAgICBpbnQgcmVtYWluRmlyc3QgPSB1bmNvbXBfcGFydF9zaXplICsgaGRyLT5maXJzdF9wYXJ0X3NpemUgLSBwb3M7CisgICAgaWYgKHJlbWFpbkZpcnN0ID4gMCkKKyAgICB7CisgICAgICAgIGlmIChyZW1haW5GaXJzdCA8PSBtdHUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSByZW1haW5GaXJzdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSBtdHU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKiBzZWNvbmQgcGFydGl0aW9uOyBqdXN0IHNsb3QgaXQgdXAgYWNjb3JkaW5nIHRvIE1UVSAqLworICAgIGlmIChyZW1haW5pbmcgPD0gbXR1KQorICAgIHsKKyAgICAgICAgc2l6ZSA9IHJlbWFpbmluZzsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIHJldHVybiBtdHU7Cit9CisKK3ZvaWQgdGhyb3dfcGFja2V0cyh1bnNpZ25lZCBjaGFyKiBmcmFtZSwgaW50KiBzaXplLCBpbnQgbG9zc19yYXRlLAorICAgICAgICAgICAgICAgICAgIGludCogdGhyb3duLCBpbnQqIGtlcHQpCit7CisgICAgdW5zaWduZWQgY2hhciBsb3NzX2ZyYW1lWzI1NioxMDI0XTsKKyAgICBpbnQgcGtnX3NpemUgPSAxOworICAgIGludCBwb3MgPSAwOworICAgIGludCBsb3NzX3BvcyA9IDA7CisgICAgc3RydWN0IHBhcnNlZF9oZWFkZXIgaGRyOworICAgIHVuc2lnbmVkIGludCB0bXA7CisgICAgaW50IG10dSA9IDE1MDA7CisKKyAgICBpZiAoKnNpemUgPCAzKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdXRjKCd8Jywgc3Rkb3V0KTsKKyAgICAvKiBwYXJzZSB1bmNvbXByZXNzZWQgMyBieXRlcyAqLworICAgIHRtcCA9IChmcmFtZVsyXSA8PCAxNikgfCAoZnJhbWVbMV0gPDwgOCkgfCBmcmFtZVswXTsKKyAgICBoZHIua2V5X2ZyYW1lID0gISh0bXAgJiAweDEpOyAvKiBpbnZlcnNlIGxvZ2ljICovCisgICAgaGRyLnZlcnNpb24gPSAodG1wID4+IDEpICYgMHg3OworICAgIGhkci5zaG93X2ZyYW1lID0gKHRtcCA+PiA0KSAmIDB4MTsKKyAgICBoZHIuZmlyc3RfcGFydF9zaXplID0gKHRtcCA+PiA1KSAmIDB4N0ZGRkY7CisKKyAgICAvKiBkb24ndCBkcm9wIGtleSBmcmFtZXMgKi8KKyAgICBpZiAoaGRyLmtleV9mcmFtZSkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICAqa2VwdCA9ICpzaXplL210dSArICgoKnNpemUgJSBtdHUgPiAwKSA/IDEgOiAwKTsgLyogYXBwcm94aW1hdGUgKi8KKyAgICAgICAgZm9yIChpPTA7IGkgPCAqa2VwdDsgaSsrKQorICAgICAgICAgICAgcHV0YygnLicsIHN0ZG91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoKHBrZ19zaXplID0gbmV4dF9wYWNrZXQoJmhkciwgcG9zLCAqc2l6ZSwgbXR1KSkgPiAwKQorICAgIHsKKyAgICAgICAgaW50IGxvc3NfZXZlbnQgPSAoKHJhbmQoKSArIDEuMCkvKFJBTkRfTUFYICsgMS4wKSA8IGxvc3NfcmF0ZS8xMDAuMCk7CisgICAgICAgIGlmICgqdGhyb3duID09IDAgJiYgIWxvc3NfZXZlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShsb3NzX2ZyYW1lICsgbG9zc19wb3MsIGZyYW1lICsgcG9zLCBwa2dfc2l6ZSk7CisgICAgICAgICAgICBsb3NzX3BvcyArPSBwa2dfc2l6ZTsKKyAgICAgICAgICAgICgqa2VwdCkrKzsKKyAgICAgICAgICAgIHB1dGMoJy4nLCBzdGRvdXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKCp0aHJvd24pKys7CisgICAgICAgICAgICBwdXRjKCdYJywgc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgICBwb3MgKz0gcGtnX3NpemU7CisgICAgfQorICAgIG1lbWNweShmcmFtZSwgbG9zc19mcmFtZSwgbG9zc19wb3MpOworICAgIG1lbXNldChmcmFtZSArIGxvc3NfcG9zLCAwLCAqc2l6ZSAtIGxvc3NfcG9zKTsKKyAgICAqc2l6ZSA9IGxvc3NfcG9zOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gSEVMUEVSUworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ19JTklUCisvKiBJbml0aWFsaXplIGNvZGVjICovCitmbGFncyA9IFZQWF9DT0RFQ19VU0VfRVJST1JfQ09OQ0VBTE1FTlQ7CityZXMgPSB2cHhfY29kZWNfZGVjX2luaXQoJmNvZGVjLCBpbnRlcmZhY2UsICZkZWNfY2ZnLCBmbGFncyk7CitpZihyZXMpCisgICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ19JTklUCisKK1VzYWdlCistLS0tLQorVGhpcyBleGFtcGxlIGFkZHMgYSBzaW5nbGUgYXJndW1lbnQgdG8gdGhlIGBzaW1wbGVfZGVjb2RlcmAgZXhhbXBsZSwKK3doaWNoIHNwZWNpZmllcyB0aGUgcmFuZ2Ugb3IgcGF0dGVybiBvZiBmcmFtZXMgdG8gZHJvcC4gVGhlIHBhcmFtZXRlciBpcworcGFyc2VkIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFVTQUdFCitpZihhcmdjIDwgNCB8fCBhcmdjID4gNikKKyAgICBkaWUoIlVzYWdlOiAlcyA8aW5maWxlPiA8b3V0ZmlsZT4gWy10IDxudW0gdGhyZWFkcz5dIDxOLU18Ti9NfEwsUz5cbiIsCisgICAgICAgIGFyZ3ZbMF0pOworeworICAgIGNoYXIgKm5wdHI7CisgICAgaW50IGFyZ19udW0gPSAzOworICAgIGlmIChhcmdjID09IDYgJiYgc3RybmNtcChhcmd2W2FyZ19udW0rK10sICItdCIsIDIpID09IDApCisgICAgICAgIGRlY19jZmcudGhyZWFkcyA9IHN0cnRvbChhcmd2W2FyZ19udW0rK10sIE5VTEwsIDApOworICAgIG4gPSBzdHJ0b2woYXJndlthcmdfbnVtXSwgJm5wdHIsIDApOworICAgIG1vZGUgPSAoKm5wdHIgPT0gJ1wwJyB8fCAqbnB0ciA9PSAnLCcpID8gMiA6ICgqbnB0ciA9PSAnLScpID8gMSA6IDA7CisKKyAgICBtID0gc3RydG9sKG5wdHIrMSwgTlVMTCwgMCk7CisgICAgaWYoKCFuICYmICFtKSB8fCAoKm5wdHIgIT0gJy0nICYmICpucHRyICE9ICcvJyAmJgorICAgICAgICAqbnB0ciAhPSAnXDAnICYmICpucHRyICE9ICcsJykpCisgICAgICAgIGRpZSgiQ291bGRuJ3QgcGFyc2UgcGF0dGVybiAlc1xuIiwgYXJndlszXSk7Cit9CitzZWVkID0gKG0gPiAwKSA/IG0gOiAodW5zaWduZWQgaW50KXRpbWUoTlVMTCk7CitzcmFuZChzZWVkKTt0aHJvd25fZnJhbWUgPSAwOworcHJpbnRmKCJTZWVkOiAldVxuIiwgc2VlZCk7CitwcmludGYoIlRocmVhZHM6ICVkXG4iLCBkZWNfY2ZnLnRocmVhZHMpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVVNBR0UKKworCitEcm9wcGluZyBBIFJhbmdlIE9mIEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RvIGRyb3AgYSByYW5nZSBvZiBmcmFtZXMsIHNwZWNpZnkgdGhlIHN0YXJ0aW5nIGZyYW1lIGFuZCB0aGUgZW5kaW5nCitmcmFtZSB0byBkcm9wLCBzZXBhcmF0ZWQgYnkgYSBkYXNoLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBkcm9wCitmcmFtZXMgNSB0aHJvdWdoIDEwIChiYXNlIDEpLgorCisgICQgLi9kZWNvZGVfd2l0aF9wYXJ0aWFsX2Ryb3BzIGluLml2ZiBvdXQuaTQyMCA1LTEwCisKKworRHJvcHBpbmcgQSBQYXR0ZXJuIE9mIEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVG8gZHJvcCBhIHBhdHRlcm4gb2YgZnJhbWVzLCBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGRyb3AgYW5kCit0aGUgbnVtYmVyIG9mIGZyYW1lcyBhZnRlciB3aGljaCB0byByZXBlYXQgdGhlIHBhdHRlcm4sIHNlcGFyYXRlZCBieQorYSBmb3J3YXJkLXNsYXNoLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBkcm9wIDMgb2YgNyBmcmFtZXMuCitTcGVjaWZpY2FsbHksIGl0IHdpbGwgZGVjb2RlIDQgZnJhbWVzLCB0aGVuIGRyb3AgMyBmcmFtZXMsIGFuZCB0aGVuCityZXBlYXQuCisKKyAgJCAuL2RlY29kZV93aXRoX3BhcnRpYWxfZHJvcHMgaW4uaXZmIG91dC5pNDIwIDMvNworCitEcm9wcGluZyBSYW5kb20gUGFydHMgT2YgRnJhbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIHRoaXJkIGFyZ3VtZW50IHR1cGxlIGlzIGF2YWlsYWJsZSB0byBzcGxpdCB0aGUgZnJhbWUgaW50byAxNTAwIGJ5dGVzIHBpZWNlcworYW5kIHJhbmRvbWx5IGRyb3AgcGllY2VzIHJhdGhlciB0aGFuIGZyYW1lcy4gVGhlIGZyYW1lIHdpbGwgYmUgc3BsaXQgYXQKK3BhcnRpdGlvbiBib3VuZGFyaWVzIHdoZXJlIHBvc3NpYmxlLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgd2lsbCBzZWVkIHRoZSBSTkcKK3dpdGggdGhlIHNlZWQgMTIzIGFuZCBkcm9wIGFwcHJveGltYXRlbHkgNSUgb2YgdGhlIHBpZWNlcy4gUGllY2VzIHdoaWNoCithcmUgZGVwZW5kaW5nIG9uIGFuIGFscmVhZHkgZHJvcHBlZCBwaWVjZSB3aWxsIGFsc28gYmUgZHJvcHBlZC4KKworICAkIC4vZGVjb2RlX3dpdGhfcGFydGlhbF9kcm9wcyBpbi5pdmYgb3V0Lmk0MjAgNSwxMjMKKworCitFeHRyYSBWYXJpYWJsZXMKKy0tLS0tLS0tLS0tLS0tLQorVGhpcyBleGFtcGxlIG1haW50YWlucyB0aGUgcGF0dGVybiBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBpbiB0aGUKK2BuYCwgYG1gLCBhbmQgYGlzX3JhbmdlYCB2YXJpYWJsZXM6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRVhUUkFfVkFSUworaW50ICAgICAgICAgICAgICBuLCBtLCBtb2RlOwordW5zaWduZWQgaW50ICAgICBzZWVkOworaW50ICAgICAgICAgICAgICB0aHJvd249MCwga2VwdD0wOworaW50ICAgICAgICAgICAgICB0aHJvd25fZnJhbWU9MCwga2VwdF9mcmFtZT0wOwordnB4X2NvZGVjX2RlY19jZmdfdCAgZGVjX2NmZyA9IHswfTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRVhUUkFfVkFSUworCisKK01ha2luZyBUaGUgRHJvcCBEZWNpc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZXhhbXBsZSBkZWNpZGVzIHdoZXRoZXIgdG8gZHJvcCB0aGUgZnJhbWUgYmFzZWQgb24gdGhlIGN1cnJlbnQKK2ZyYW1lIG51bWJlciwgaW1tZWRpYXRlbHkgYmVmb3JlIGRlY29kaW5nIHRoZSBmcmFtZS4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUkVfREVDT0RFCisvKiBEZWNpZGUgd2hldGhlciB0byB0aHJvdyBwYXJ0cyBvZiB0aGUgZnJhbWUgb3IgdGhlIHdob2xlIGZyYW1lCisgICBkZXBlbmRpbmcgb24gdGhlIGRyb3AgbW9kZSAqLwordGhyb3duX2ZyYW1lID0gMDsKK2tlcHRfZnJhbWUgPSAwOworc3dpdGNoIChtb2RlKQoreworY2FzZSAwOgorICAgIGlmIChtIC0gKGZyYW1lX2NudC0xKSVtIDw9IG4pCisgICAgeworICAgICAgICBmcmFtZV9zeiA9IDA7CisgICAgfQorICAgIGJyZWFrOworY2FzZSAxOgorICAgIGlmIChmcmFtZV9jbnQgPj0gbiAmJiBmcmFtZV9jbnQgPD0gbSkKKyAgICB7CisgICAgICAgIGZyYW1lX3N6ID0gMDsKKyAgICB9CisgICAgYnJlYWs7CitjYXNlIDI6CisgICAgdGhyb3dfcGFja2V0cyhmcmFtZSwgJmZyYW1lX3N6LCBuLCAmdGhyb3duX2ZyYW1lLCAma2VwdF9mcmFtZSk7CisgICAgYnJlYWs7CitkZWZhdWx0OiBicmVhazsKK30KK2lmIChtb2RlIDwgMikKK3sKKyAgICBpZiAoZnJhbWVfc3ogPT0gMCkKKyAgICB7CisgICAgICAgIHB1dGMoJ1gnLCBzdGRvdXQpOworICAgICAgICB0aHJvd25fZnJhbWUrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHV0YygnLicsIHN0ZG91dCk7CisgICAgICAgIGtlcHRfZnJhbWUrKzsKKyAgICB9Cit9Cit0aHJvd24gKz0gdGhyb3duX2ZyYW1lOwora2VwdCArPSBrZXB0X2ZyYW1lOworZmZsdXNoKHN0ZG91dCk7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBSRV9ERUNPREUKZGlmZiAtLWdpdCBhL2xpYnZweC9leGFtcGxlcy9kZWNvZGVyX3RtcGwuYyBiL2xpYnZweC9leGFtcGxlcy9kZWNvZGVyX3RtcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTk0ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2V4YW1wbGVzL2RlY29kZXJfdG1wbC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyoKK0AqSU5UUk9EVUNUSU9OCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgMQorI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorI2RlZmluZSBpbnRlcmZhY2UgKHZweF9jb2RlY192cDhfZHgoKSkKK0BFWFRSQV9JTkNMVURFUworCisKKyNkZWZpbmUgSVZGX0ZJTEVfSERSX1NaICAoMzIpCisjZGVmaW5lIElWRl9GUkFNRV9IRFJfU1ogKDEyKQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1lbV9nZXRfbGUzMihjb25zdCB1bnNpZ25lZCBjaGFyICptZW0pIHsKKyAgICByZXR1cm4gKG1lbVszXSA8PCAyNCl8KG1lbVsyXSA8PCAxNil8KG1lbVsxXSA8PCA4KXwobWVtWzBdKTsKK30KKworc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZwcmludGYoZm10LCBhcCk7CisgICAgaWYoZm10W3N0cmxlbihmbXQpLTFdICE9ICdcbicpCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK0BESUVfQ09ERUMKKworQEhFTFBFUlMKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgRklMRSAgICAgICAgICAgICppbmZpbGUsICpvdXRmaWxlOworICAgIHZweF9jb2RlY19jdHhfdCAgY29kZWM7CisgICAgaW50ICAgICAgICAgICAgICBmbGFncyA9IDAsIGZyYW1lX2NudCA9IDA7CisgICAgdW5zaWduZWQgY2hhciAgICBmaWxlX2hkcltJVkZfRklMRV9IRFJfU1pdOworICAgIHVuc2lnbmVkIGNoYXIgICAgZnJhbWVfaGRyW0lWRl9GUkFNRV9IRFJfU1pdOworICAgIHVuc2lnbmVkIGNoYXIgICAgZnJhbWVbMjU2KjEwMjRdOworICAgIHZweF9jb2RlY19lcnJfdCAgcmVzOworQEBAQEVYVFJBX1ZBUlMKKworICAgICh2b2lkKXJlczsKKyAgICAvKiBPcGVuIGZpbGVzICovCitAQEBAVVNBR0UKKyAgICBpZighKGluZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpKSkKKyAgICAgICAgZGllKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIsIGFyZ3ZbMV0pOworICAgIGlmKCEob3V0ZmlsZSA9IGZvcGVuKGFyZ3ZbMl0sICJ3YiIpKSkKKyAgICAgICAgZGllKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3Igd3JpdGluZyIsIGFyZ3ZbMl0pOworCisgICAgLyogUmVhZCBmaWxlIGhlYWRlciAqLworICAgIGlmKCEoZnJlYWQoZmlsZV9oZHIsIDEsIElWRl9GSUxFX0hEUl9TWiwgaW5maWxlKSA9PSBJVkZfRklMRV9IRFJfU1oKKyAgICAgICAgICYmIGZpbGVfaGRyWzBdPT0nRCcgJiYgZmlsZV9oZHJbMV09PSdLJyAmJiBmaWxlX2hkclsyXT09J0knCisgICAgICAgICAmJiBmaWxlX2hkclszXT09J0YnKSkKKyAgICAgICAgZGllKCIlcyBpcyBub3QgYW4gSVZGIGZpbGUuIiwgYXJndlsxXSk7CisKKyAgICBwcmludGYoIlVzaW5nICVzXG4iLHZweF9jb2RlY19pZmFjZV9uYW1lKGludGVyZmFjZSkpOworQEBAQERFQ19JTklUCisKKyAgICAvKiBSZWFkIGVhY2ggZnJhbWUgKi8KKyAgICB3aGlsZShmcmVhZChmcmFtZV9oZHIsIDEsIElWRl9GUkFNRV9IRFJfU1osIGluZmlsZSkgPT0gSVZGX0ZSQU1FX0hEUl9TWikgeworICAgICAgICBpbnQgICAgICAgICAgICAgICBmcmFtZV9zeiA9IG1lbV9nZXRfbGUzMihmcmFtZV9oZHIpOworICAgICAgICB2cHhfY29kZWNfaXRlcl90ICBpdGVyID0gTlVMTDsKKyAgICAgICAgdnB4X2ltYWdlX3QgICAgICAqaW1nOworCisKKyAgICAgICAgZnJhbWVfY250Kys7CisgICAgICAgIGlmKGZyYW1lX3N6ID4gc2l6ZW9mKGZyYW1lKSkKKyAgICAgICAgICAgIGRpZSgiRnJhbWUgJWQgZGF0YSB0b28gYmlnIGZvciBleGFtcGxlIGNvZGUgYnVmZmVyIiwgZnJhbWVfc3opOworICAgICAgICBpZihmcmVhZChmcmFtZSwgMSwgZnJhbWVfc3osIGluZmlsZSkgIT0gZnJhbWVfc3opCisgICAgICAgICAgICBkaWUoIkZyYW1lICVkIGZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZyYW1lIiwgZnJhbWVfY250KTsKKworQEBAQEBAQEBQUkVfREVDT0RFCitAQEBAQEBAQERFQ09ERQorCisgICAgICAgIC8qIFdyaXRlIGRlY29kZWQgZGF0YSB0byBkaXNrICovCitAQEBAQEBAQEdFVF9GUkFNRQorICAgICAgICAgICAgdW5zaWduZWQgaW50IHBsYW5lLCB5OworCitAQEBAQEBAQEBAQEBQUk9DRVNTX0RYCisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJQcm9jZXNzZWQgJWQgZnJhbWVzLlxuIixmcmFtZV9jbnQpOworQEBAQERFU1RST1kKKworICAgIGZjbG9zZShvdXRmaWxlKTsKKyAgICBmY2xvc2UoaW5maWxlKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L2V4YW1wbGVzL2RlY29kZXJfdG1wbC50eHQgYi9saWJ2cHgvZXhhbXBsZXMvZGVjb2Rlcl90bXBsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjUyYTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2V4YW1wbGVzL2RlY29kZXJfdG1wbC50eHQKQEAgLTAsMCArMSw2MiBAQAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDX0lOQ0xVREVTCisjZGVmaW5lIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCAxCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisjZGVmaW5lIGludGVyZmFjZSAodnB4X2NvZGVjX3ZwOF9keCgpKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDX0lOQ0xVREVTCisKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBESUVfQ09ERUMKK3N0YXRpYyB2b2lkIGRpZV9jb2RlYyh2cHhfY29kZWNfY3R4X3QgKmN0eCwgY29uc3QgY2hhciAqcykgeworICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoY3R4KTsKKworICAgIHByaW50ZigiJXM6ICVzXG4iLCBzLCB2cHhfY29kZWNfZXJyb3IoY3R4KSk7CisgICAgaWYoZGV0YWlsKQorICAgICAgICBwcmludGYoIiAgICAlc1xuIixkZXRhaWwpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRElFX0NPREVDCisKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBVU0FHRQoraWYoYXJnYyE9MykKKyAgICBkaWUoIlVzYWdlOiAlcyA8aW5maWxlPiA8b3V0ZmlsZT5cbiIsIGFyZ3ZbMF0pOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBVU0FHRQorCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDX0lOSVQKKy8qIEluaXRpYWxpemUgY29kZWMgKi8KK2lmKHZweF9jb2RlY19kZWNfaW5pdCgmY29kZWMsIGludGVyZmFjZSwgTlVMTCwgZmxhZ3MpKQorICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyIik7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ19JTklUCisKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERUNPREUKKy8qIERlY29kZSB0aGUgZnJhbWUgKi8KK2lmKHZweF9jb2RlY19kZWNvZGUoJmNvZGVjLCBmcmFtZSwgZnJhbWVfc3osIE5VTEwsIDApKQorICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lIik7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ09ERQorCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gR0VUX0ZSQU1FCit3aGlsZSgoaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgmY29kZWMsICZpdGVyKSkpIHsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gR0VUX0ZSQU1FCisKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUk9DRVNTX0RYCitmb3IocGxhbmU9MDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgdW5zaWduZWQgY2hhciAqYnVmID1pbWctPnBsYW5lc1twbGFuZV07CisKKyAgICBmb3IoeT0wOyB5IDwgKHBsYW5lID8gKGltZy0+ZF9oICsgMSkgPj4gMSA6IGltZy0+ZF9oKTsgeSsrKSB7CisgICAgICAgICh2b2lkKSBmd3JpdGUoYnVmLCAxLCAocGxhbmUgPyAoaW1nLT5kX3cgKyAxKSA+PiAxIDogaW1nLT5kX3cpLAorICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUpOworICAgICAgICBidWYgKz0gaW1nLT5zdHJpZGVbcGxhbmVdOworICAgIH0KK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUFJPQ0VTU19EWAorCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVTVFJPWQoraWYodnB4X2NvZGVjX2Rlc3Ryb3koJmNvZGVjKSkKKyAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGRlc3Ryb3kgY29kZWMiKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVTVFJPWQpkaWZmIC0tZ2l0IGEvbGlidnB4L2V4YW1wbGVzL2VuY29kZXJfdG1wbC5jIGIvbGlidnB4L2V4YW1wbGVzL2VuY29kZXJfdG1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjY1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvZXhhbXBsZXMvZW5jb2Rlcl90bXBsLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKgorQCpJTlRST0RVQ1RJT04KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZGVmaW5lIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCAxCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZwOGN4LmgiCisjZGVmaW5lIGludGVyZmFjZSAodnB4X2NvZGVjX3ZwOF9jeCgpKQorI2RlZmluZSBmb3VyY2MgICAgMHgzMDM4NTA1NgorQEVYVFJBX0lOQ0xVREVTCisKKyNkZWZpbmUgSVZGX0ZJTEVfSERSX1NaICAoMzIpCisjZGVmaW5lIElWRl9GUkFNRV9IRFJfU1ogKDEyKQorCitzdGF0aWMgdm9pZCBtZW1fcHV0X2xlMTYoY2hhciAqbWVtLCB1bnNpZ25lZCBpbnQgdmFsKSB7CisgICAgbWVtWzBdID0gdmFsOworICAgIG1lbVsxXSA9IHZhbD4+ODsKK30KKworc3RhdGljIHZvaWQgbWVtX3B1dF9sZTMyKGNoYXIgKm1lbSwgdW5zaWduZWQgaW50IHZhbCkgeworICAgIG1lbVswXSA9IHZhbDsKKyAgICBtZW1bMV0gPSB2YWw+Pjg7CisgICAgbWVtWzJdID0gdmFsPj4xNjsKKyAgICBtZW1bM10gPSB2YWw+PjI0OworfQorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnByaW50ZihmbXQsIGFwKTsKKyAgICBpZihmbXRbc3RybGVuKGZtdCktMV0gIT0gJ1xuJykKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworQERJRV9DT0RFQworCitzdGF0aWMgaW50IHJlYWRfZnJhbWUoRklMRSAqZiwgdnB4X2ltYWdlX3QgKmltZykgeworICAgIHNpemVfdCBuYnl0ZXMsIHRvX3JlYWQ7CisgICAgaW50ICAgIHJlcyA9IDE7CisKKyAgICB0b19yZWFkID0gaW1nLT53KmltZy0+aCozLzI7CisgICAgbmJ5dGVzID0gZnJlYWQoaW1nLT5wbGFuZXNbMF0sIDEsIHRvX3JlYWQsIGYpOworICAgIGlmKG5ieXRlcyAhPSB0b19yZWFkKSB7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGlmKG5ieXRlcyA+IDApCisgICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IFJlYWQgcGFydGlhbCBmcmFtZS4gQ2hlY2sgeW91ciB3aWR0aCAmIGhlaWdodCFcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pdmZfZmlsZV9oZWFkZXIoRklMRSAqb3V0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfZW5jX2NmZ190ICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2NudCkgeworICAgIGNoYXIgaGVhZGVyWzMyXTsKKworICAgIGlmKGNmZy0+Z19wYXNzICE9IFZQWF9SQ19PTkVfUEFTUyAmJiBjZmctPmdfcGFzcyAhPSBWUFhfUkNfTEFTVF9QQVNTKQorICAgICAgICByZXR1cm47CisgICAgaGVhZGVyWzBdID0gJ0QnOworICAgIGhlYWRlclsxXSA9ICdLJzsKKyAgICBoZWFkZXJbMl0gPSAnSSc7CisgICAgaGVhZGVyWzNdID0gJ0YnOworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrNCwgIDApOyAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgICAgbWVtX3B1dF9sZTE2KGhlYWRlcis2LCAgMzIpOyAgICAgICAgICAgICAgICAgIC8qIGhlYWRlcnNpemUgKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzgsICBmb3VyY2MpOyAgICAgICAgICAgICAgLyogaGVhZGVyc2l6ZSAqLworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrMTIsIGNmZy0+Z193KTsgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrMTQsIGNmZy0+Z19oKTsgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzE2LCBjZmctPmdfdGltZWJhc2UuZGVuKTsgLyogcmF0ZSAqLworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIrMjAsIGNmZy0+Z190aW1lYmFzZS5udW0pOyAvKiBzY2FsZSAqLworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIrMjQsIGZyYW1lX2NudCk7ICAgICAgICAgICAvKiBsZW5ndGggKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzI4LCAwKTsgICAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCisKKyAgICAodm9pZCkgZndyaXRlKGhlYWRlciwgMSwgMzIsIG91dGZpbGUpOworfQorCisKK3N0YXRpYyB2b2lkIHdyaXRlX2l2Zl9mcmFtZV9oZWFkZXIoRklMRSAqb3V0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpCit7CisgICAgY2hhciAgICAgICAgICAgICBoZWFkZXJbMTJdOworICAgIHZweF9jb2RlY19wdHNfdCAgcHRzOworCisgICAgaWYocGt0LT5raW5kICE9IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QpCisgICAgICAgIHJldHVybjsKKworICAgIHB0cyA9IHBrdC0+ZGF0YS5mcmFtZS5wdHM7CisgICAgbWVtX3B1dF9sZTMyKGhlYWRlciwgcGt0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzQsIHB0cyYweEZGRkZGRkZGKTsKKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzgsIHB0cyA+PiAzMik7CisKKyAgICAodm9pZCkgZndyaXRlKGhlYWRlciwgMSwgMTIsIG91dGZpbGUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBGSUxFICAgICAgICAgICAgICAgICppbmZpbGUsICpvdXRmaWxlOworICAgIHZweF9jb2RlY19jdHhfdCAgICAgIGNvZGVjOworICAgIHZweF9jb2RlY19lbmNfY2ZnX3QgIGNmZzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9jbnQgPSAwOworICAgIHZweF9pbWFnZV90ICAgICAgICAgIHJhdzsKKyAgICB2cHhfY29kZWNfZXJyX3QgICAgICByZXM7CisgICAgbG9uZyAgICAgICAgICAgICAgICAgd2lkdGg7CisgICAgbG9uZyAgICAgICAgICAgICAgICAgaGVpZ2h0OworICAgIGludCAgICAgICAgICAgICAgICAgIGZyYW1lX2F2YWlsOworICAgIGludCAgICAgICAgICAgICAgICAgIGdvdF9kYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKK0BAQEBUV09QQVNTX1ZBUlMKKworICAgIC8qIE9wZW4gZmlsZXMgKi8KK0BAQEBVU0FHRQorICAgIHdpZHRoID0gc3RydG9sKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgIGhlaWdodCA9IHN0cnRvbChhcmd2WzJdLCBOVUxMLCAwKTsKKyAgICBpZih3aWR0aCA8IDE2IHx8IHdpZHRoJTIgfHwgaGVpZ2h0IDwxNiB8fCBoZWlnaHQlMikKKyAgICAgICAgZGllKCJJbnZhbGlkIHJlc29sdXRpb246ICVsZHglbGQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZighdnB4X2ltZ19hbGxvYygmcmF3LCBWUFhfSU1HX0ZNVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LCAxKSkKKyAgICAgICAgZGllKCJGYWlsZSB0byBhbGxvY2F0ZSBpbWFnZSIsIHdpZHRoLCBoZWlnaHQpOworICAgIGlmKCEob3V0ZmlsZSA9IGZvcGVuKGFyZ3ZbNF0sICJ3YiIpKSkKKyAgICAgICAgZGllKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3Igd3JpdGluZyIsIGFyZ3ZbNF0pOworCisgICAgcHJpbnRmKCJVc2luZyAlc1xuIix2cHhfY29kZWNfaWZhY2VfbmFtZShpbnRlcmZhY2UpKTsKKworQEBAQEVOQ19ERUZfQ0ZHCisKK0BAQEBFTkNfU0VUX0NGRworQEBAQEVOQ19TRVRfQ0ZHMgorCisgICAgd3JpdGVfaXZmX2ZpbGVfaGVhZGVyKG91dGZpbGUsICZjZmcsIDApOworCitAQEBAVFdPUEFTU19MT09QX0JFR0lOCisKKyAgICAgICAgLyogT3BlbiBpbnB1dCBmaWxlIGZvciB0aGlzIGVuY29kaW5nIHBhc3MgKi8KKyAgICAgICAgaWYoIShpbmZpbGUgPSBmb3Blbihhcmd2WzNdLCAicmIiKSkpCisgICAgICAgICAgICBkaWUoIkZhaWxlZCB0byBvcGVuICVzIGZvciByZWFkaW5nIiwgYXJndlszXSk7CisKK0BAQEBAQEBARU5DX0lOSVQKKworICAgICAgICBmcmFtZV9hdmFpbCA9IDE7CisgICAgICAgIGdvdF9kYXRhID0gMDsKKyAgICAgICAgd2hpbGUoZnJhbWVfYXZhaWwgfHwgZ290X2RhdGEpIHsKKyAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7CisgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdDsKKworQEBAQEBAQEBAQEBAUEVSX0ZSQU1FX0NGRworQEBAQEBAQEBAQEBARU5DT0RFX0ZSQU1FCisgICAgICAgICAgICBnb3RfZGF0YSA9IDA7CisgICAgICAgICAgICB3aGlsZSggKHBrdCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgmY29kZWMsICZpdGVyKSkgKSB7CisgICAgICAgICAgICAgICAgZ290X2RhdGEgPSAxOworICAgICAgICAgICAgICAgIHN3aXRjaChwa3QtPmtpbmQpIHsKK0BAQEBAQEBAQEBAQEBAQEBQUk9DRVNTX0ZSQU1FCitAQEBAQEBAQEBAQEBAQEBAUFJPQ0VTU19TVEFUUworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYocGt0LT5raW5kID09IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBrdC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpPyAiSyI6Ii4iKTsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lX2NudCsrOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgZmNsb3NlKGluZmlsZSk7CitAQEBAVFdPUEFTU19MT09QX0VORAorCisgICAgcHJpbnRmKCJQcm9jZXNzZWQgJWQgZnJhbWVzLlxuIixmcmFtZV9jbnQtMSk7CitAQEBAREVTVFJPWQorCisgICAgLyogVHJ5IHRvIHJld3JpdGUgdGhlIGZpbGUgaGVhZGVyIHdpdGggdGhlIGFjdHVhbCBmcmFtZSBjb3VudCAqLworICAgIGlmKCFmc2VlayhvdXRmaWxlLCAwLCBTRUVLX1NFVCkpCisgICAgICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihvdXRmaWxlLCAmY2ZnLCBmcmFtZV9jbnQtMSk7CisgICAgZmNsb3NlKG91dGZpbGUpOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvZXhhbXBsZXMvZW5jb2Rlcl90bXBsLnR4dCBiL2xpYnZweC9leGFtcGxlcy9lbmNvZGVyX3RtcGwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmJkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvZXhhbXBsZXMvZW5jb2Rlcl90bXBsLnR4dApAQCAtMCwwICsxLDc0IEBACit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfSU5DTFVERVMKKyNkZWZpbmUgVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUIDEKKyNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKyNkZWZpbmUgaW50ZXJmYWNlICh2cHhfY29kZWNfdnA4X2N4KCkpCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfSU5DTFVERVMKKworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERJRV9DT0RFQworc3RhdGljIHZvaWQgZGllX2NvZGVjKHZweF9jb2RlY19jdHhfdCAqY3R4LCBjb25zdCBjaGFyICpzKSB7CisgICAgY29uc3QgY2hhciAqZGV0YWlsID0gdnB4X2NvZGVjX2Vycm9yX2RldGFpbChjdHgpOworCisgICAgcHJpbnRmKCIlczogJXNcbiIsIHMsIHZweF9jb2RlY19lcnJvcihjdHgpKTsKKyAgICBpZihkZXRhaWwpCisgICAgICAgIHByaW50ZigiICAgICVzXG4iLGRldGFpbCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBESUVfQ09ERUMKKworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFVTQUdFCitpZihhcmdjIT01KQorICAgIGRpZSgiVXNhZ2U6ICVzIDx3aWR0aD4gPGhlaWdodD4gPGluZmlsZT4gPG91dGZpbGU+XG4iLCBhcmd2WzBdKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVVNBR0UKKworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19ERUZfQ0ZHCisvKiBQb3B1bGF0ZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KK3JlcyA9IHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQoaW50ZXJmYWNlLCAmY2ZnLCAwKTsKK2lmKHJlcykgeworICAgIHByaW50ZigiRmFpbGVkIHRvIGdldCBjb25maWc6ICVzXG4iLCB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXMpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfREVGX0NGRworCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRU5DX1NFVF9DRkcKKy8qIFVwZGF0ZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGggb3VyIHNldHRpbmdzICovCitjZmcucmNfdGFyZ2V0X2JpdHJhdGUgPSB3aWR0aCAqIGhlaWdodCAqIGNmZy5yY190YXJnZXRfYml0cmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgLyBjZmcuZ193IC8gY2ZnLmdfaDsKK2NmZy5nX3cgPSB3aWR0aDsKK2NmZy5nX2ggPSBoZWlnaHQ7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IEVOQ19TRVRfQ0ZHCisKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfSU5JVAorLyogSW5pdGlhbGl6ZSBjb2RlYyAqLworaWYodnB4X2NvZGVjX2VuY19pbml0KCZjb2RlYywgaW50ZXJmYWNlLCAmY2ZnLCAwKSkKKyAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNfSU5JVAorCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRU5DT0RFX0ZSQU1FCitmcmFtZV9hdmFpbCA9IHJlYWRfZnJhbWUoaW5maWxlLCAmcmF3KTsKK2lmKHZweF9jb2RlY19lbmNvZGUoJmNvZGVjLCBmcmFtZV9hdmFpbD8gJnJhdyA6IE5VTEwsIGZyYW1lX2NudCwKKyAgICAgICAgICAgICAgICAgICAgMSwgZmxhZ3MsIFZQWF9ETF9SRUFMVElNRSkpCisgICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUiKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRU5DT0RFX0ZSQU1FCisKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUk9DRVNTX0ZSQU1FCitjYXNlIFZQWF9DT0RFQ19DWF9GUkFNRV9QS1Q6CisgICAgd3JpdGVfaXZmX2ZyYW1lX2hlYWRlcihvdXRmaWxlLCBwa3QpOworICAgICh2b2lkKSBmd3JpdGUocGt0LT5kYXRhLmZyYW1lLmJ1ZiwgMSwgcGt0LT5kYXRhLmZyYW1lLnN6LAorICAgICAgICAgICAgICAgICAgb3V0ZmlsZSk7CisgICAgYnJlYWs7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFBST0NFU1NfRlJBTUUKKworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFU1RST1kKK3ZweF9pbWdfZnJlZSgmcmF3KTsKK2lmKHZweF9jb2RlY19kZXN0cm95KCZjb2RlYykpCisgICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBkZXN0cm95IGNvZGVjIik7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFU1RST1kKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Vycm9yX3Jlc2lsaWVudC50eHQgYi9saWJ2cHgvZXhhbXBsZXMvZXJyb3JfcmVzaWxpZW50LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvZXJyb3JfcmVzaWxpZW50LnR4dApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2Vycm9yX3Jlc2lsaWVudC50eHQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZvcmNlX2tleWZyYW1lLnR4dCBiL2xpYnZweC9leGFtcGxlcy9mb3JjZV9rZXlmcmFtZS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2ZvcmNlX2tleWZyYW1lLnR4dApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2ZvcmNlX2tleWZyYW1lLnR4dApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfY29kZS5zaCBiL2xpYnZweC9leGFtcGxlcy9nZW5fZXhhbXBsZV9jb2RlLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9nZW5fZXhhbXBsZV9jb2RlLnNoCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfY29kZS5zaApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfZG94eS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfZG94eS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2dlbl9leGFtcGxlX2RveHkucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfZG94eS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2dlbl9leGFtcGxlX3RleHQuc2ggYi9saWJ2cHgvZXhhbXBsZXMvZ2VuX2V4YW1wbGVfdGV4dC5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvZ2VuX2V4YW1wbGVfdGV4dC5zaApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2dlbl9leGFtcGxlX3RleHQuc2gKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0FTQ0lJTWF0aFBIUC0yLjAvQVNDSUlNYXRoUEhQLTIuMC5jZmcucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0FTQ0lJTWF0aFBIUC0yLjAvQVNDSUlNYXRoUEhQLTIuMC5jZmcucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9BU0NJSU1hdGhQSFAtMi4wL0FTQ0lJTWF0aFBIUC0yLjAuY2ZnLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0FTQ0lJTWF0aFBIUC0yLjAvQVNDSUlNYXRoUEhQLTIuMC5jZmcucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9BU0NJSU1hdGhQSFAtMi4wL0FTQ0lJTWF0aFBIUC0yLjAuY2xhc3MucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0FTQ0lJTWF0aFBIUC0yLjAvQVNDSUlNYXRoUEhQLTIuMC5jbGFzcy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0FTQ0lJTWF0aFBIUC0yLjAvQVNDSUlNYXRoUEhQLTIuMC5jbGFzcy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9BU0NJSU1hdGhQSFAtMi4wL0FTQ0lJTWF0aFBIUC0yLjAuY2xhc3MucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9BU0NJSU1hdGhQSFAtMi4wL2h0bWxNYXRoTUwuanMgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvQVNDSUlNYXRoUEhQLTIuMC9odG1sTWF0aE1MLmpzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9BU0NJSU1hdGhQSFAtMi4wL2h0bWxNYXRoTUwuanMKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9BU0NJSU1hdGhQSFAtMi4wL2h0bWxNYXRoTUwuanMKZGlmZiAtLWdpdCBhL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxLy5naXRhdHRyaWJ1dGVzIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjZjI1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEgQEAKKyogLWNybGYKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvQ2hhbmdlcyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL0NoYW5nZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvQ2hhbmdlcwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvQ2hhbmdlcwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9NQU5JRkVTVCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL01BTklGRVNUCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL01BTklGRVNUCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9NQU5JRkVTVApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9NYWtlZmlsZS5QTCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL01ha2VmaWxlLlBMCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL01ha2VmaWxlLlBMCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9NYWtlZmlsZS5QTApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2MucG0gYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2MucG0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jLnBtCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2MucG0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jLnBvZCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL1RvYy5wb2QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jLnBvZApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jLnBvZApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2NHZW5lcmF0b3IucG0gYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2NHZW5lcmF0b3IucG0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jR2VuZXJhdG9yLnBtCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2NHZW5lcmF0b3IucG0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jSW5zZXJ0b3IucG0gYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2NJbnNlcnRvci5wbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS9Ub2NJbnNlcnRvci5wbQpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jSW5zZXJ0b3IucG0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jVXBkYXRvci5wbSBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL1RvY1VwZGF0b3IucG0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jVXBkYXRvci5wbQpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvVG9jVXBkYXRvci5wbQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L01hbnVhbFRlc3QvbWFudWFsVGVzdDEuaHRtIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9NYW51YWxUZXN0L21hbnVhbFRlc3QxLmh0bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L01hbnVhbFRlc3QvbWFudWFsVGVzdDEuaHRtCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L01hbnVhbFRlc3QvbWFudWFsVGVzdDEuaHRtCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIxL1N1YlN1YkRpcjEvaW5kZXguaHRtIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9TaXRlTWFwL1N1YkRpcjEvU3ViU3ViRGlyMS9pbmRleC5odG0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9TaXRlTWFwL1N1YkRpcjEvU3ViU3ViRGlyMS9pbmRleC5odG0KcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIxL1N1YlN1YkRpcjEvaW5kZXguaHRtCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIxL2luZGV4Lmh0bSBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIxL2luZGV4Lmh0bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMS9pbmRleC5odG0KcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIxL2luZGV4Lmh0bQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9TdWJTdWJEaXIxL2luZGV4Lmh0bSBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIyL1N1YlN1YkRpcjEvaW5kZXguaHRtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIyL1N1YlN1YkRpcjEvaW5kZXguaHRtCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9TdWJTdWJEaXIxL2luZGV4Lmh0bQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9TdWJTdWJEaXIyL2luZGV4Lmh0bSBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIyL1N1YlN1YkRpcjIvaW5kZXguaHRtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIyL1N1YlN1YkRpcjIvaW5kZXguaHRtCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9TdWJTdWJEaXIyL2luZGV4Lmh0bQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9pbmRleC5odG0gYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9pbmRleC5odG0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9TaXRlTWFwL1N1YkRpcjIvaW5kZXguaHRtCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvU3ViRGlyMi9pbmRleC5odG0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9TaXRlTWFwL1N1YkRpcjMvaW5kZXguaHRtIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9TaXRlTWFwL1N1YkRpcjMvaW5kZXguaHRtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9TdWJEaXIzL2luZGV4Lmh0bQpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9TaXRlTWFwL1N1YkRpcjMvaW5kZXguaHRtCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9pbmRleC5odG0gYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L1NpdGVNYXAvaW5kZXguaHRtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9pbmRleC5odG0KcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvU2l0ZU1hcC9pbmRleC5odG0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9leHRlbmQudCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvZXh0ZW5kLnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9leHRlbmQudApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9leHRlbmQudApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2Zvcm1hdC50IGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9mb3JtYXQudApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2Zvcm1hdC50CnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2Zvcm1hdC50CmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvZ2VuZXJhdGUudCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvZ2VuZXJhdGUudApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2dlbmVyYXRlLnQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvZ2VuZXJhdGUudApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2luc2VydC50IGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9pbnNlcnQudApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2luc2VydC50CnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L2luc2VydC50CmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvbWFudWFsVGVzdC50IGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9tYW51YWxUZXN0LnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9tYW51YWxUZXN0LnQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvbWFudWFsVGVzdC50CmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3Qvb3B0aW9ucy50IGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9vcHRpb25zLnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9vcHRpb25zLnQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3Qvb3B0aW9ucy50CmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvcG9kRXhhbXBsZXMudCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvcG9kRXhhbXBsZXMudApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L3BvZEV4YW1wbGVzLnQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvcG9kRXhhbXBsZXMudApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L3Byb3BhZ2F0ZS50IGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9wcm9wYWdhdGUudApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L3Byb3BhZ2F0ZS50CnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L3Byb3BhZ2F0ZS50CmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3Qvc2l0ZU1hcC50IGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9zaXRlTWFwLnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL0hUTUwtVG9jLTAuOTEvdC9zaXRlTWFwLnQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3Qvc2l0ZU1hcC50CmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvdXBkYXRlLnQgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvSFRNTC1Ub2MtMC45MS90L3VwZGF0ZS50CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvdXBkYXRlLnQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9IVE1MLVRvYy0wLjkxL3QvdXBkYXRlLnQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1NYXJrZG93bi1FeHRyYS0xLjIuMy9MaWNlbnNlLnRleHQgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvUEhQLU1hcmtkb3duLUV4dHJhLTEuMi4zL0xpY2Vuc2UudGV4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvUEhQLU1hcmtkb3duLUV4dHJhLTEuMi4zL0xpY2Vuc2UudGV4dApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1NYXJrZG93bi1FeHRyYS0xLjIuMy9MaWNlbnNlLnRleHQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1NYXJrZG93bi1FeHRyYS0xLjIuMy9QSFAgTWFya2Rvd24gRXh0cmEgUmVhZG1lLnRleHQgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvUEhQLU1hcmtkb3duLUV4dHJhLTEuMi4zL1BIUCBNYXJrZG93biBFeHRyYSBSZWFkbWUudGV4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvUEhQLU1hcmtkb3duLUV4dHJhLTEuMi4zL1BIUCBNYXJrZG93biBFeHRyYSBSZWFkbWUudGV4dApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1NYXJrZG93bi1FeHRyYS0xLjIuMy9QSFAgTWFya2Rvd24gRXh0cmEgUmVhZG1lLnRleHQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1NYXJrZG93bi1FeHRyYS0xLjIuMy9tYXJrZG93bi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvUEhQLU1hcmtkb3duLUV4dHJhLTEuMi4zL21hcmtkb3duLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvUEhQLU1hcmtkb3duLUV4dHJhLTEuMi4zL21hcmtkb3duLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1NYXJrZG93bi1FeHRyYS0xLjIuMy9tYXJrZG93bi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1TbWFydHlQYW50cy0xLjUuMWUvUEhQIFNtYXJ0eVBhbnRzIFJlYWRtZS50eHQgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvUEhQLVNtYXJ0eVBhbnRzLTEuNS4xZS9QSFAgU21hcnR5UGFudHMgUmVhZG1lLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvUEhQLVNtYXJ0eVBhbnRzLTEuNS4xZS9QSFAgU21hcnR5UGFudHMgUmVhZG1lLnR4dApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1TbWFydHlQYW50cy0xLjUuMWUvUEhQIFNtYXJ0eVBhbnRzIFJlYWRtZS50eHQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1TbWFydHlQYW50cy0xLjUuMWUvc21hcnR5cGFudHMucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1TbWFydHlQYW50cy0xLjUuMWUvc21hcnR5cGFudHMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9QSFAtU21hcnR5UGFudHMtMS41LjFlL3NtYXJ0eXBhbnRzLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL1BIUC1TbWFydHlQYW50cy0xLjUuMWUvc21hcnR5cGFudHMucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9jb250cmliL2FsaWFzZWQucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvYWxpYXNlZC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvYWxpYXNlZC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9jb250cmliL2FsaWFzZWQucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9jb250cmliL2Nzc2dlbi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvY29udHJpYi9jc3NnZW4ucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9jb250cmliL2Nzc2dlbi5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9jb250cmliL2Nzc2dlbi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvY3NzZ2VuMi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvY29udHJpYi9jc3NnZW4yLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvY29udHJpYi9jc3NnZW4yLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvY3NzZ2VuMi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvZXhhbXBsZS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvY29udHJpYi9leGFtcGxlLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvY29udHJpYi9leGFtcGxlLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvZXhhbXBsZS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvbGFuZ2NoZWNrLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9jb250cmliL2xhbmdjaGVjay5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvbGFuZ2NoZWNrLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2NvbnRyaWIvbGFuZ2NoZWNrLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9CVUdTIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvQlVHUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9CVUdTCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9CVUdTCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL0NIQU5HRVMgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9DSEFOR0VTCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL0NIQU5HRVMKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL0NIQU5HRVMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvQ09QWUlORyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL0NPUFlJTkcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvQ09QWUlORwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvQ09QWUlORwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9SRUFETUUgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvUkVBRE1FCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9SRUFETUUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvVEhBTktTIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvVEhBTktTCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL1RIQU5LUwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvVEhBTktTCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL1RPRE8gYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9UT0RPCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL1RPRE8KcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL1RPRE8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL19fZmlsZXNvdXJjZS9mc291cmNlX2dlc2hpX2NvcmVfZ2VzaGkucGhwLmh0bWwgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvX19maWxlc291cmNlL2Zzb3VyY2VfZ2VzaGlfY29yZV9nZXNoaS5waHAuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvX19maWxlc291cmNlL2Zzb3VyY2VfZ2VzaGlfY29yZV9nZXNoaS5waHAuaHRtbApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL19fZmlsZXNvdXJjZS9mc291cmNlX2dlc2hpX2NvcmVfZ2VzaGkucGhwLmh0bWwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2JsYW5rLmh0bWwgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvYmxhbmsuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvYmxhbmsuaHRtbApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2JsYW5rLmh0bWwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2NsYXNzdHJlZXNfZ2VzaGkuaHRtbCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9jbGFzc3RyZWVzX2dlc2hpLmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2NsYXNzdHJlZXNfZ2VzaGkuaHRtbApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2NsYXNzdHJlZXNfZ2VzaGkuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZWxlbWVudGluZGV4Lmh0bWwgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZWxlbWVudGluZGV4Lmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2VsZW1lbnRpbmRleC5odG1sCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZWxlbWVudGluZGV4Lmh0bWwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2VsZW1lbnRpbmRleF9nZXNoaS5odG1sIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2VsZW1lbnRpbmRleF9nZXNoaS5odG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9lbGVtZW50aW5kZXhfZ2VzaGkuaHRtbApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2VsZW1lbnRpbmRleF9nZXNoaS5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9lcnJvcnMuaHRtbCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9lcnJvcnMuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZXJyb3JzLmh0bWwKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9lcnJvcnMuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZ2VzaGkvY29yZS9HZVNIaS5odG1sIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL2dlc2hpL2NvcmUvR2VTSGkuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZ2VzaGkvY29yZS9HZVNIaS5odG1sCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZ2VzaGkvY29yZS9HZVNIaS5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9nZXNoaS9jb3JlL19nZXNoaS5waHAuaHRtbCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9nZXNoaS9jb3JlL19nZXNoaS5waHAuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvZ2VzaGkvY29yZS9fZ2VzaGkucGhwLmh0bWwKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9nZXNoaS9jb3JlL19nZXNoaS5waHAuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvaW5kZXguaHRtbCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9pbmRleC5odG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9pbmRleC5odG1sCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbGlfZ2VzaGkuaHRtbCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9saV9nZXNoaS5odG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9saV9nZXNoaS5odG1sCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbGlfZ2VzaGkuaHRtbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvYmFubmVyLmNzcyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9iYW5uZXIuY3NzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9iYW5uZXIuY3NzCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvYmFubmVyLmNzcwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0Q2xhc3MucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdENsYXNzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0Q2xhc3MucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0Q2xhc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdENsYXNzX2xvZ28ucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdENsYXNzX2xvZ28ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQWJzdHJhY3RDbGFzc19sb2dvLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdENsYXNzX2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdE1ldGhvZC5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0TWV0aG9kLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0TWV0aG9kLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdE1ldGhvZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0UHJpdmF0ZUNsYXNzLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQWJzdHJhY3RQcml2YXRlQ2xhc3MucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQWJzdHJhY3RQcml2YXRlQ2xhc3MucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0UHJpdmF0ZUNsYXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQWJzdHJhY3RQcml2YXRlQ2xhc3NfbG9nby5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0UHJpdmF0ZUNsYXNzX2xvZ28ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQWJzdHJhY3RQcml2YXRlQ2xhc3NfbG9nby5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQWJzdHJhY3RQcml2YXRlQ2xhc3NfbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0UHJpdmF0ZU1ldGhvZC5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0UHJpdmF0ZU1ldGhvZC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9BYnN0cmFjdFByaXZhdGVNZXRob2QucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0Fic3RyYWN0UHJpdmF0ZU1ldGhvZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0NsYXNzLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ2xhc3MucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ2xhc3MucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0NsYXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ2xhc3NfbG9nby5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0NsYXNzX2xvZ28ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ2xhc3NfbG9nby5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ2xhc3NfbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0NvbnN0YW50LnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ29uc3RhbnQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ29uc3RhbnQucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0NvbnN0YW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ29uc3RydWN0b3IucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Db25zdHJ1Y3Rvci5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Db25zdHJ1Y3Rvci5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvQ29uc3RydWN0b3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9EZXN0cnVjdG9yLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvRGVzdHJ1Y3Rvci5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9EZXN0cnVjdG9yLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9EZXN0cnVjdG9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvRnVuY3Rpb24ucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9GdW5jdGlvbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9GdW5jdGlvbi5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvRnVuY3Rpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9HbG9iYWwucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9HbG9iYWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvR2xvYmFsLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9HbG9iYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvSS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvSW5kZXgucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbmRleC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbmRleC5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvSW5kZXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbnRlcmZhY2UucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbnRlcmZhY2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvSW50ZXJmYWNlLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbnRlcmZhY2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbnRlcmZhY2VfbG9nby5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0ludGVyZmFjZV9sb2dvLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0ludGVyZmFjZV9sb2dvLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9JbnRlcmZhY2VfbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0wucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9MLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0wucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0wucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9MbWludXMucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9MbWludXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvTG1pbnVzLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9MbWludXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9McGx1cy5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0xwbHVzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL0xwbHVzLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9McGx1cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL01ldGhvZC5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL01ldGhvZC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9NZXRob2QucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL01ldGhvZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1BhZ2UucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9QYWdlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1BhZ2UucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1BhZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9QYWdlX2xvZ28ucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9QYWdlX2xvZ28ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvUGFnZV9sb2dvLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9QYWdlX2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlQ2xhc3MucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlQ2xhc3MucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvUHJpdmF0ZUNsYXNzLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlQ2xhc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlQ2xhc3NfbG9nby5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ByaXZhdGVDbGFzc19sb2dvLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ByaXZhdGVDbGFzc19sb2dvLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlQ2xhc3NfbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ByaXZhdGVNZXRob2QucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlTWV0aG9kLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ByaXZhdGVNZXRob2QucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ByaXZhdGVNZXRob2QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlVmFyaWFibGUucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlVmFyaWFibGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvUHJpdmF0ZVZhcmlhYmxlLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9Qcml2YXRlVmFyaWFibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9TdGF0aWNNZXRob2QucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9TdGF0aWNNZXRob2QucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvU3RhdGljTWV0aG9kLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9TdGF0aWNNZXRob2QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9TdGF0aWNWYXJpYWJsZS5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1N0YXRpY1ZhcmlhYmxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1N0YXRpY1ZhcmlhYmxlLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9TdGF0aWNWYXJpYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1QucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9ULnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1QucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9UbWludXMucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9UbWludXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvVG1pbnVzLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9UbWludXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9UcGx1cy5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1RwbHVzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1RwbHVzLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9UcGx1cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ZhcmlhYmxlLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvVmFyaWFibGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvVmFyaWFibGUucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL1ZhcmlhYmxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvYmxhbmsucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9ibGFuay5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9ibGFuay5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvYmxhbmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9jbGFzc19mb2xkZXIucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9jbGFzc19mb2xkZXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvY2xhc3NfZm9sZGVyLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9jbGFzc19mb2xkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9lbXB0eS5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL2VtcHR5LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL2VtcHR5LnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9lbXB0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL2ZpbGUucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9maWxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL2ZpbGUucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL2ZpbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9mb2xkZXIucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9mb2xkZXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvZm9sZGVyLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9mb2xkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9mdW5jdGlvbl9mb2xkZXIucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9mdW5jdGlvbl9mb2xkZXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvZnVuY3Rpb25fZm9sZGVyLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9mdW5jdGlvbl9mb2xkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9uZXh0X2J1dHRvbi5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL25leHRfYnV0dG9uLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL25leHRfYnV0dG9uLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy9uZXh0X2J1dHRvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL25leHRfYnV0dG9uX2Rpc2FibGVkLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvbmV4dF9idXR0b25fZGlzYWJsZWQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvbmV4dF9idXR0b25fZGlzYWJsZWQucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL25leHRfYnV0dG9uX2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcGFja2FnZS5wbmcgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL3BhY2thZ2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcGFja2FnZS5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcGFja2FnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL3BhY2thZ2VfZm9sZGVyLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcGFja2FnZV9mb2xkZXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcGFja2FnZV9mb2xkZXIucG5nCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL3BhY2thZ2VfZm9sZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJldmlvdXNfYnV0dG9uLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJldmlvdXNfYnV0dG9uLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL3ByZXZpb3VzX2J1dHRvbi5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJldmlvdXNfYnV0dG9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJldmlvdXNfYnV0dG9uX2Rpc2FibGVkLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJldmlvdXNfYnV0dG9uX2Rpc2FibGVkLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL3ByZXZpb3VzX2J1dHRvbl9kaXNhYmxlZC5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJldmlvdXNfYnV0dG9uX2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJpdmF0ZV9jbGFzc19sb2dvLnBuZyBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJpdmF0ZV9jbGFzc19sb2dvLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9hcGkvbWVkaWEvaW1hZ2VzL3ByaXZhdGVfY2xhc3NfbG9nby5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvcHJpdmF0ZV9jbGFzc19sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvdHV0b3JpYWwucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy90dXRvcmlhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy90dXRvcmlhbC5wbmcKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvdHV0b3JpYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy90dXRvcmlhbF9mb2xkZXIucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy90dXRvcmlhbF9mb2xkZXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvdHV0b3JpYWxfZm9sZGVyLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy90dXRvcmlhbF9mb2xkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy91cF9idXR0b24ucG5nIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy91cF9idXR0b24ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9pbWFnZXMvdXBfYnV0dG9uLnBuZwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL2ltYWdlcy91cF9idXR0b24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL3N0eWxlc2hlZXQuY3NzIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL3N0eWxlc2hlZXQuY3NzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9tZWRpYS9zdHlsZXNoZWV0LmNzcwpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL21lZGlhL3N0eWxlc2hlZXQuY3NzCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9wYWNrYWdlcy5odG1sIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL3BhY2thZ2VzLmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL3BhY2thZ2VzLmh0bWwKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS9wYWNrYWdlcy5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS90b2RvbGlzdC5odG1sIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL3RvZG9saXN0Lmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvYXBpL3RvZG9saXN0Lmh0bWwKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2FwaS90b2RvbGlzdC5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2dlc2hpLWRvYy5odG1sIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvZ2VzaGktZG9jLmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvZ2VzaGktZG9jLmh0bWwKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2dlc2hpLWRvYy5odG1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2dlc2hpLWRvYy50eHQgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZG9jcy9nZXNoaS1kb2MudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2dlc2hpLWRvYy50eHQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL2dlc2hpLWRvYy50eHQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvcGhwZG9jLmluaSBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9kb2NzL3BocGRvYy5pbmkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvcGhwZG9jLmluaQpyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2RvY3MvcGhwZG9jLmluaQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hYmFwLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hYmFwLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWJhcC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hYmFwLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWN0aW9uc2NyaXB0LnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hY3Rpb25zY3JpcHQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hY3Rpb25zY3JpcHQucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWN0aW9uc2NyaXB0LnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWN0aW9uc2NyaXB0My5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWN0aW9uc2NyaXB0My5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FjdGlvbnNjcmlwdDMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWN0aW9uc2NyaXB0My5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FkYS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWRhLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYWRhLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FkYS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FwYWNoZS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYXBhY2hlLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYXBhY2hlLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FwYWNoZS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FwcGxlc2NyaXB0LnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hcHBsZXNjcmlwdC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FwcGxlc2NyaXB0LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FwcGxlc2NyaXB0LnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYXB0X3NvdXJjZXMucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FwdF9zb3VyY2VzLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYXB0X3NvdXJjZXMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYXB0X3NvdXJjZXMucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hc20ucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FzbS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FzbS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hc20ucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hc3AucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FzcC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2FzcC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hc3AucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hdXRvaXQucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2F1dG9pdC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2F1dG9pdC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hdXRvaXQucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hdmlzeW50aC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYXZpc3ludGgucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hdmlzeW50aC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9hdmlzeW50aC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Jhc2gucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Jhc2gucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9iYXNoLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Jhc2gucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9iYXNpYzRnbC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYmFzaWM0Z2wucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9iYXNpYzRnbC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9iYXNpYzRnbC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2JmLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9iZi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2JmLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2JmLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYmxpdHpiYXNpYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYmxpdHpiYXNpYy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2JsaXR6YmFzaWMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYmxpdHpiYXNpYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2JuZi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYm5mLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYm5mLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2JuZi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Jvby5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYm9vLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvYm9vLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Jvby5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2MucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2MucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2MucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jX21hYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY19tYWMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jX21hYy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jX21hYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NhZGRjbC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2FkZGNsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2FkZGNsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NhZGRjbC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NhZGxpc3AucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NhZGxpc3AucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jYWRsaXNwLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NhZGxpc3AucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jZmRnLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jZmRnLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2ZkZy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jZmRnLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2ZtLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jZm0ucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jZm0ucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2ZtLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2lsLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jaWwucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jaWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY2lsLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY29ib2wucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NvYm9sLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY29ib2wucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvY29ib2wucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jcHAtcXQucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NwcC1xdC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NwcC1xdC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jcHAtcXQucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jcHAucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NwcC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NwcC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jcHAucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jc2hhcnAucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NzaGFycC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2NzaGFycC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jc2hhcnAucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jc3MucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Nzcy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Nzcy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9jc3MucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGNzLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kY3MucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kY3MucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGNzLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGVscGhpLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kZWxwaGkucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9kZWxwaGkucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGVscGhpLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGlmZi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGlmZi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2RpZmYucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGlmZi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Rpdi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGl2LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZGl2LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Rpdi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Rvcy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZG9zLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZG9zLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2Rvcy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2RvdC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZG90LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZG90LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2RvdC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2VpZmZlbC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZWlmZmVsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZWlmZmVsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2VpZmZlbC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2VtYWlsLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9lbWFpbC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2VtYWlsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2VtYWlsLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZm9ydHJhbi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZm9ydHJhbi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2ZvcnRyYW4ucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZm9ydHJhbi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2ZyZWViYXNpYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZnJlZWJhc2ljLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZnJlZWJhc2ljLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2ZyZWViYXNpYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dlbmVyby5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ2VuZXJvLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ2VuZXJvLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dlbmVyby5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dldHRleHQucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dldHRleHQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9nZXR0ZXh0LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dldHRleHQucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9nbHNsLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9nbHNsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ2xzbC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9nbHNsLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ21sLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9nbWwucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9nbWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ21sLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ251cGxvdC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ251cGxvdC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dudXBsb3QucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ251cGxvdC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dyb292eS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ3Jvb3Z5LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvZ3Jvb3Z5LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2dyb292eS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2hhc2tlbGwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2hhc2tlbGwucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9oYXNrZWxsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2hhc2tlbGwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9ocTlwbHVzLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9ocTlwbHVzLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaHE5cGx1cy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9ocTlwbHVzLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaHRtbDRzdHJpY3QucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2h0bWw0c3RyaWN0LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaHRtbDRzdHJpY3QucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaHRtbDRzdHJpY3QucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pZGwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2lkbC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2lkbC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pZGwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pbmkucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2luaS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2luaS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pbmkucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pbm5vLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pbm5vLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaW5uby5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pbm5vLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaW50ZXJjYWwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2ludGVyY2FsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaW50ZXJjYWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaW50ZXJjYWwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pby5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvaW8ucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pby5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9pby5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2phdmEucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2phdmEucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9qYXZhLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2phdmEucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9qYXZhNS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvamF2YTUucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9qYXZhNS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9qYXZhNS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2phdmFzY3JpcHQucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2phdmFzY3JpcHQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9qYXZhc2NyaXB0LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2phdmFzY3JpcHQucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9raXh0YXJ0LnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9raXh0YXJ0LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkva2l4dGFydC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9raXh0YXJ0LnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkva2xvbmVjLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9rbG9uZWMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9rbG9uZWMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkva2xvbmVjLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkva2xvbmVjcHAucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2tsb25lY3BwLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkva2xvbmVjcHAucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkva2xvbmVjcHAucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sYXRleC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbGF0ZXgucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sYXRleC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sYXRleC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xpc3AucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xpc3AucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9saXNwLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xpc3AucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sb2NvYmFzaWMucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xvY29iYXNpYy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xvY29iYXNpYy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sb2NvYmFzaWMucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sb2xjb2RlLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sb2xjb2RlLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbG9sY29kZS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sb2xjb2RlLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbG90dXNmb3JtdWxhcy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbG90dXNmb3JtdWxhcy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xvdHVzZm9ybXVsYXMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbG90dXNmb3JtdWxhcy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xvdHVzc2NyaXB0LnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sb3R1c3NjcmlwdC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xvdHVzc2NyaXB0LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xvdHVzc2NyaXB0LnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbHNjcmlwdC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbHNjcmlwdC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xzY3JpcHQucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbHNjcmlwdC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xzbDIucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xzbDIucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sc2wyLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2xzbDIucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sdWEucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2x1YS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL2x1YS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9sdWEucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9tNjhrLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9tNjhrLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbTY4ay5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9tNjhrLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbWFrZS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbWFrZS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21ha2UucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbWFrZS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21hdGxhYi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbWF0bGFiLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbWF0bGFiLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21hdGxhYi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21pcmMucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21pcmMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9taXJjLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21pcmMucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9tb2R1bGEzLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9tb2R1bGEzLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbW9kdWxhMy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9tb2R1bGEzLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXBhc20ucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL21wYXNtLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXBhc20ucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXBhc20ucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9teG1sLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9teG1sLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXhtbC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9teG1sLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXlzcWwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL215c3FsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXlzcWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbXlzcWwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9uc2lzLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9uc2lzLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvbnNpcy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9uc2lzLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb2JqYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb2JqYy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29iamMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb2JqYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29jYW1sLWJyaWVmLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9vY2FtbC1icmllZi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29jYW1sLWJyaWVmLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29jYW1sLWJyaWVmLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb2NhbWwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29jYW1sLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb2NhbWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb2NhbWwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9vb2Jhcy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb29iYXMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9vb2Jhcy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9vb2Jhcy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29yYWNsZTExLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9vcmFjbGUxMS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29yYWNsZTExLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29yYWNsZTExLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb3JhY2xlOC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb3JhY2xlOC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL29yYWNsZTgucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvb3JhY2xlOC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Bhc2NhbC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGFzY2FsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGFzY2FsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Bhc2NhbC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Blci5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGVyLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGVyLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Blci5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BlcmwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BlcmwucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wZXJsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BlcmwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waHAtYnJpZWYucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BocC1icmllZi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BocC1icmllZi5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waHAtYnJpZWYucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waHAucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BocC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BocC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waHAucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waWMxNi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGljMTYucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waWMxNi5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waWMxNi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BpeGVsYmVuZGVyLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9waXhlbGJlbmRlci5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BpeGVsYmVuZGVyLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BpeGVsYmVuZGVyLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGxzcWwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Bsc3FsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGxzcWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcGxzcWwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wb3ZyYXkucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BvdnJheS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3BvdnJheS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wb3ZyYXkucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wb3dlcnNoZWxsLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wb3dlcnNoZWxsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcG93ZXJzaGVsbC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wb3dlcnNoZWxsLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcHJvZ3Jlc3MucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Byb2dyZXNzLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcHJvZ3Jlc3MucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcHJvZ3Jlc3MucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wcm9sb2cucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Byb2xvZy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Byb2xvZy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wcm9sb2cucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wcm92aWRleC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcHJvdmlkZXgucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wcm92aWRleC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9wcm92aWRleC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3B5dGhvbi5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcHl0aG9uLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcHl0aG9uLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3B5dGhvbi5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3FiYXNpYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcWJhc2ljLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcWJhc2ljLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3FiYXNpYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JhaWxzLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9yYWlscy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JhaWxzLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JhaWxzLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcmVib2wucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JlYm9sLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcmVib2wucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcmVib2wucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9yZWcucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JlZy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JlZy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9yZWcucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9yb2JvdHMucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JvYm90cy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3JvYm90cy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9yb2JvdHMucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9ydWJ5LnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9ydWJ5LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvcnVieS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9ydWJ5LnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc2FzLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zYXMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zYXMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc2FzLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc2NhbGEucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NjYWxhLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc2NhbGEucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc2NhbGEucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zY2hlbWUucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NjaGVtZS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NjaGVtZS5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zY2hlbWUucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zY2lsYWIucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NjaWxhYi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NjaWxhYi5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zY2lsYWIucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zZGxiYXNpYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc2RsYmFzaWMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zZGxiYXNpYy5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS9zZGxiYXNpYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NtYWxsdGFsay5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc21hbGx0YWxrLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc21hbGx0YWxrLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NtYWxsdGFsay5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NtYXJ0eS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc21hcnR5LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc21hcnR5LnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NtYXJ0eS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NxbC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc3FsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvc3FsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3NxbC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RjbC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGNsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGNsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RjbC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RlcmF0ZXJtLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS90ZXJhdGVybS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RlcmF0ZXJtLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RlcmF0ZXJtLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGV4dC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGV4dC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RleHQucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGV4dC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RoaW5iYXNpYy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGhpbmJhc2ljLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdGhpbmJhc2ljLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RoaW5iYXNpYy5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RzcWwucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RzcWwucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS90c3FsLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3RzcWwucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS90eXBvc2NyaXB0LnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS90eXBvc2NyaXB0LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdHlwb3NjcmlwdC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS90eXBvc2NyaXB0LnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmIucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3ZiLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmIucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmIucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92Ym5ldC5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmJuZXQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92Ym5ldC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92Ym5ldC5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Zlcmlsb2cucGhwIGIvbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Zlcmlsb2cucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92ZXJpbG9nLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3Zlcmlsb2cucGhwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aGRsLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aGRsLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmhkbC5waHAKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aGRsLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmltLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aW0ucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aW0ucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmltLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmlzdWFsZm94cHJvLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aXN1YWxmb3hwcm8ucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aXN1YWxmb3hwcm8ucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmlzdWFsZm94cHJvLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmlzdWFscHJvbG9nLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aXN1YWxwcm9sb2cucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS92aXN1YWxwcm9sb2cucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvdmlzdWFscHJvbG9nLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvd2hpdGVzcGFjZS5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvd2hpdGVzcGFjZS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3doaXRlc3BhY2UucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvd2hpdGVzcGFjZS5waHAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3dpbmJhdGNoLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS93aW5iYXRjaC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3dpbmJhdGNoLnBocApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL2luY2x1ZGVzL2dlc2hpL2dlc2hpL3dpbmJhdGNoLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkveG1sLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS94bWwucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS94bWwucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkveG1sLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkveG9yZ19jb25mLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS94b3JnX2NvbmYucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS94b3JnX2NvbmYucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkveG9yZ19jb25mLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkveHBwLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS94cHAucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS94cHAucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkveHBwLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvejgwLnBocCBiL2xpYnZweC9leGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS96ODAucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9pbmNsdWRlcy9nZXNoaS9nZXNoaS96ODAucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvZ2VzaGkvZ2VzaGkvejgwLnBocApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5jbHVkZXMvdnA4X2RvY190b29scy5waHAgYi9saWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvdnA4X2RvY190b29scy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL2luY2x1ZGVzL3ZwOF9kb2NfdG9vbHMucGhwCnJlbmFtZSB0byBsaWJ2cHgvZXhhbXBsZXMvaW5jbHVkZXMvdnA4X2RvY190b29scy5waHAKZGlmZiAtLWdpdCBhL2xpYnZweC9leGFtcGxlcy9wb3N0cHJvYy50eHQgYi9saWJ2cHgvZXhhbXBsZXMvcG9zdHByb2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYjI1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvZXhhbXBsZXMvcG9zdHByb2MudHh0CkBAIC0wLDAgKzEsNjcgQEAKK0BURU1QTEFURSBkZWNvZGVyX3RtcGwuYworUG9zdHByb2Nlc3NpbmcgRGVjb2RlcgorPT09PT09PT09PT09PT09PT09PT09PQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gSU5UUk9EVUNUSU9OCitUaGlzIGV4YW1wbGUgYWRkcyBwb3N0cHJvY2Vzc2luZyB0byB0aGUgc2ltcGxlIGRlY29kZXIgbG9vcC4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IElOVFJPRFVDVElPTgorCisKK0luaXRpYWxpemluZyBQb3N0cHJvY2Vzc2luZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitZb3UgbXVzdCBpbmZvcm0gdGhlIGNvZGVjIHRoYXQgeW91IG1pZ2h0IHJlcXVlc3QgcG9zdHByb2Nlc3NpbmcgYXQKK2luaXRpYWxpemF0aW9uIHRpbWUuIFRoaXMgaXMgZG9uZSBieSBwYXNzaW5nIHRoZSBWUFhfQ09ERUNfVVNFX1BPU1RQUk9DCitmbGFnIHRvIGB2cHhfY29kZWNfZGVjX2luaXRgLiBJZiB0aGUgY29kZWMgZG9lcyBub3Qgc3VwcG9ydAorcG9zdHByb2Nlc3NpbmcsIHRoaXMgY2FsbCB3aWxsIHJldHVybiBWUFhfQ09ERUNfSU5DQVBBQkxFLiBGb3IKK2RlbW9uc3RyYXRpb24gcHVycG9zZXMsIHdlIGFsc28gZmFsbCBiYWNrIHRvIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYKK3RoZSBjb2RlYyBkb2VzIG5vdCBwcm92aWRlIHN1cHBvcnQuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ19JTklUCisvKiBJbml0aWFsaXplIGNvZGVjICovCityZXMgPSB2cHhfY29kZWNfZGVjX2luaXQoJmNvZGVjLCBpbnRlcmZhY2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0NPREVDX1VTRV9QT1NUUFJPQyk7CitpZihyZXMgPT0gVlBYX0NPREVDX0lOQ0FQQUJMRSkgeworICAgIHByaW50ZigiTk9USUNFOiBQb3N0cHJvYyBub3Qgc3VwcG9ydGVkIGJ5ICVzXG4iLAorICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfbmFtZShpbnRlcmZhY2UpKTsKKyAgICByZXMgPSB2cHhfY29kZWNfZGVjX2luaXQoJmNvZGVjLCBpbnRlcmZhY2UsIE5VTEwsIGZsYWdzKTsKK30KK2lmKHJlcykKKyAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlciIpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERUNfSU5JVAorCisKK1VzaW5nIEFkYXB0aXZlIFBvc3Rwcm9jZXNzaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVlA2IHByb3ZpZGVzICJhZGFwdGl2ZSBwb3N0cHJvY2Vzc2luZy4iIEl0IHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgdGhlCitiZXN0IHBvc3Rwcm9jZXNzaW5nIGZpbHRlciBvbiBhIGZyYW1lIGJ5IGZyYW1lIGJhc2lzIGJhc2VkIG9uIHRoZSBhbW91bnQKK29mIHRpbWUgcmVtYWluaW5nIGJlZm9yZSB0aGUgdXNlcidzIHNwZWNpZmllZCBkZWFkbGluZSBleHBpcmVzLiBUaGUKK3NwZWNpYWwgdmFsdWUgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZWMgc2hvdWxkIHRha2UgYXMgbG9uZyBhcworbmVjZXNzYXJ5IHRvIHByb3ZpZGUgdGhlIGJlc3QgcXVhbGl0eSBmcmFtZS4gVGhpcyBleGFtcGxlIGdpdmVzIHRoZQorY29kZWMgMTVtcyAoMTUwMDB1cykgdG8gcmV0dXJuIGEgZnJhbWUuIFJlbWVtYmVyIHRoYXQgdGhpcyBpcyBhIHNvZnQKK2RlYWRsaW5lLCBhbmQgdGhlIGNvZGVjIG1heSBleGNlZWQgaXQgZG9pbmcgaXRzIHJlZ3VsYXIgcHJvY2Vzc2luZy4gSW4KK3RoZXNlIGNhc2VzLCBubyBhZGRpdGlvbmFsIHBvc3Rwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZS4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVDT0RFCisvKiBEZWNvZGUgdGhlIGZyYW1lIHdpdGggMTVtcyBkZWFkbGluZSAqLworaWYodnB4X2NvZGVjX2RlY29kZSgmY29kZWMsIGZyYW1lLCBmcmFtZV9zeiwgTlVMTCwgMTUwMDApKQorICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lIik7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IERFQ09ERQorCisKK0NvZGVjIFNwZWNpZmljIFBvc3Rwcm9jZXNzaW5nIENvbnRyb2xzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29tZSBjb2RlY3MgcHJvdmlkZSBmaW5lIGdyYWluZWQgY29udHJvbHMgb3ZlciB0aGVpciBidWlsdC1pbgorcG9zdHByb2Nlc3NvcnMuIFZQOCBpcyBvbmUgZXhhbXBsZS4gVGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSB0b2dnbGVzCitwb3N0cHJvY2Vzc2luZyBvbiBhbmQgb2ZmIGV2ZXJ5IDE1IGZyYW1lcy4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUFJFX0RFQ09ERQorI2lmIENPTkZJR19WUDhfREVDT0RFUgoraWYoZnJhbWVfY250JTMwID09IDEpIHsKKyAgICB2cDhfcG9zdHByb2NfY2ZnX3QgIHBwID0gezAsIDAsIDB9OworCisgICAgaWYodnB4X2NvZGVjX2NvbnRyb2woJmNvZGVjLCBWUDhfU0VUX1BPU1RQUk9DLCAmcHApKQorICAgICAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIHR1cm4gb2ZmIHBvc3Rwcm9jIik7Cit9IGVsc2UgaWYoZnJhbWVfY250JTMwID09IDE2KSB7CisgICAgdnA4X3Bvc3Rwcm9jX2NmZ190ICBwcCA9IHtWUDhfREVCTE9DSyB8IFZQOF9ERU1BQ1JPQkxPQ0sgfCBWUDhfTUZRRSwgNCwgMH07CisKKyAgICBpZih2cHhfY29kZWNfY29udHJvbCgmY29kZWMsIFZQOF9TRVRfUE9TVFBST0MsICZwcCkpCisgICAgICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gdHVybiBvbiBwb3N0cHJvYyIpOworfTsKKyNlbmRpZgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUkVfREVDT0RFCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zaW1wbGVfZGVjb2Rlci50eHQgYi9saWJ2cHgvZXhhbXBsZXMvc2ltcGxlX2RlY29kZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBleGFtcGxlcy9zaW1wbGVfZGVjb2Rlci50eHQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy9zaW1wbGVfZGVjb2Rlci50eHQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NpbXBsZV9lbmNvZGVyLnR4dCBiL2xpYnZweC9leGFtcGxlcy9zaW1wbGVfZW5jb2Rlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL3NpbXBsZV9lbmNvZGVyLnR4dApyZW5hbWUgdG8gbGlidnB4L2V4YW1wbGVzL3NpbXBsZV9lbmNvZGVyLnR4dApkaWZmIC0tZ2l0IGEvbGlidnB4L2V4YW1wbGVzL3R3b3Bhc3NfZW5jb2Rlci50eHQgYi9saWJ2cHgvZXhhbXBsZXMvdHdvcGFzc19lbmNvZGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgxYTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2V4YW1wbGVzL3R3b3Bhc3NfZW5jb2Rlci50eHQKQEAgLTAsMCArMSw4NyBAQAorQFRFTVBMQVRFIGVuY29kZXJfdG1wbC5jCitUd28gUGFzcyBFbmNvZGVyCis9PT09PT09PT09PT09PT09Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBJTlRST0RVQ1RJT04KK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHR3byBwYXNzIGVuY29kZXIgbG9vcC4gSXQgdGFrZXMgYW4gaW5wdXQgZmlsZSBpbgorWVYxMiBmb3JtYXQsIHBhc3NlcyBpdCB0aHJvdWdoIHRoZSBlbmNvZGVyIHR3aWNlLCBhbmQgd3JpdGVzIHRoZSBjb21wcmVzc2VkCitmcmFtZXMgdG8gZGlzayBpbiBJVkYgZm9ybWF0LiBJdCBidWlsZHMgdXBvbiB0aGUgc2ltcGxlX2VuY29kZXIgZXhhbXBsZS4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IElOVFJPRFVDVElPTgorCisKK1R3b3Bhc3MgVmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLQorVHdvcGFzcyBtb2RlIG5lZWRzIHRvIHRyYWNrIHRoZSBjdXJyZW50IHBhc3MgbnVtYmVyIGFuZCB0aGUgYnVmZmVyIG9mCitzdGF0aXN0aWNzIHBhY2tldHMuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUV09QQVNTX1ZBUlMKK2ludCAgICAgICAgICAgICAgICAgIHBhc3M7Cit2cHhfZml4ZWRfYnVmX3QgICAgICBzdGF0cyA9IHswfTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfVkFSUworCisKK1VwZGF0aW5nIFRoZSBDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luIHR3byBwYXNzIG1vZGUsIHRoZSBjb25maWd1cmF0aW9uIGhhcyB0byBiZSB1cGRhdGVkIG9uIGVhY2ggcGFzcy4gVGhlCitzdGF0aXN0aWNzIGJ1ZmZlciBpcyBwYXNzZWQgb24gdGhlIGxhc3QgcGFzcy4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfTE9PUF9CRUdJTgorZm9yKHBhc3M9MDsgcGFzczwyOyBwYXNzKyspIHsKKyAgICBmcmFtZV9jbnQgPSAwOworCisgICAgaWYocGFzcyA9PSAwKQorICAgICAgICBjZmcuZ19wYXNzID0gVlBYX1JDX0ZJUlNUX1BBU1M7CisgICAgZWxzZSB7CisgICAgICAgIGNmZy5nX3Bhc3MgICAgICAgICAgICAgID0gVlBYX1JDX0xBU1RfUEFTUzsKKyAgICAgICAgY2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4gPSBzdGF0czsKKyAgICB9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUV09QQVNTX0xPT1BfQkVHSU4KKworCitFbmNvZGluZyBBIEZyYW1lCistLS0tLS0tLS0tLS0tLS0tCitFbmNvZGluZyBhIGZyYW1lIGluIHR3byBwYXNzIG1vZGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBzaW1wbGUgZW5jb2RlcgorZXhhbXBsZSwgZXhjZXB0IHRoZSBkZWFkbGluZSBpcyBzZXQgdG8gVlBYX0RMX0JFU1RfUVVBTElUWSB0byBnZXQgdGhlCitiZXN0IHF1YWxpdHkgcG9zc2libGUuIFZQWF9ETF9HT09EX1FVQUxJVFkgY291bGQgYWxzbyBiZSB1c2VkLgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBFTkNPREVfRlJBTUUKK2ZyYW1lX2F2YWlsID0gcmVhZF9mcmFtZShpbmZpbGUsICZyYXcpOworaWYodnB4X2NvZGVjX2VuY29kZSgmY29kZWMsIGZyYW1lX2F2YWlsPyAmcmF3IDogTlVMTCwgZnJhbWVfY250LAorICAgICAgICAgICAgICAgICAgICAxLCBmbGFncywgVlBYX0RMX0JFU1RfUVVBTElUWSkpCisgICAgZGllX2NvZGVjKCZjb2RlYywgIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUiKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gRU5DT0RFX0ZSQU1FCisKKworUHJvY2Vzc2luZyBTdGF0aXN0aWNzIFBhY2tldHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFYWNoIHBhY2tldCBvZiB0eXBlIGBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUYCBjb250YWlucyB0aGUgZW5jb2RlZCBkYXRhCitmb3IgdGhpcyBmcmFtZS4gV2Ugd3JpdGUgYSBJVkYgZnJhbWUgaGVhZGVyLCBmb2xsb3dlZCBieSB0aGUgcmF3IGRhdGEuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gUFJPQ0VTU19TVEFUUworY2FzZSBWUFhfQ09ERUNfU1RBVFNfUEtUOgorICAgIHN0YXRzLmJ1ZiA9IHJlYWxsb2Moc3RhdHMuYnVmLCBzdGF0cy5zegorICAgICAgICAgICAgICAgICAgICAgICAgKyBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeik7CisgICAgaWYoIXN0YXRzLmJ1ZikKKyAgICAgICAgZGllKCJNZW1vcnkgcmVhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworICAgIG1lbWNweSgoY2hhciopc3RhdHMuYnVmICsgc3RhdHMuc3osCisgICAgICAgICAgIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiwKKyAgICAgICAgICAgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3opOworICAgIHN0YXRzLnN6ICs9ICBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zejsKKyAgICBicmVhazsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBQUk9DRVNTX1NUQVRTCisKKworUGFzcyBQcm9ncmVzcyBSZXBvcnRpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJdCdzIHNvbWV0aW1lcyBoZWxwZnVsIHRvIHNlZSB3aGVuIGVhY2ggcGFzcyBjb21wbGV0ZXMuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUV09QQVNTX0xPT1BfRU5ECisgICAgcHJpbnRmKCJQYXNzICVkIGNvbXBsZXRlLlxuIiwgcGFzcysxKTsKKyAgICBpZih2cHhfY29kZWNfZGVzdHJveSgmY29kZWMpKQorICAgICAgICBkaWVfY29kZWMoJmNvZGVjLCAiRmFpbGVkIHRvIGRlc3Ryb3kgY29kZWMiKTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRXT1BBU1NfTE9PUF9FTkQKKworCitDbGVhbi11cAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Rlc3RydWN0aW9uIG9mIHRoZSBlbmNvZGVyIGluc3RhbmNlIG11c3QgYmUgZG9uZSBvbiBlYWNoIHBhc3MuIFRoZQorcmF3IGltYWdlIHNob3VsZCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCBhcyB1c3VhbC4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gREVTVFJPWQordnB4X2ltZ19mcmVlKCZyYXcpOworZnJlZShzdGF0cy5idWYpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBERVNUUk9ZCmRpZmYgLS1naXQgYS9leGFtcGxlcy92cDhfc2V0X21hcHMudHh0IGIvbGlidnB4L2V4YW1wbGVzL3ZwOF9zZXRfbWFwcy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV4YW1wbGVzL3ZwOF9zZXRfbWFwcy50eHQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy92cDhfc2V0X21hcHMudHh0CmRpZmYgLS1naXQgYS9leGFtcGxlcy92cDhjeF9zZXRfcmVmLnR4dCBiL2xpYnZweC9leGFtcGxlcy92cDhjeF9zZXRfcmVmLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXhhbXBsZXMvdnA4Y3hfc2V0X3JlZi50eHQKcmVuYW1lIHRvIGxpYnZweC9leGFtcGxlcy92cDhjeF9zZXRfcmVmLnR4dApkaWZmIC0tZ2l0IGEva2V5d29yZHMuZG94IGIvbGlidnB4L2tleXdvcmRzLmRveApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20ga2V5d29yZHMuZG94CnJlbmFtZSB0byBsaWJ2cHgva2V5d29yZHMuZG94CmRpZmYgLS1naXQgYS9saWJta3YvRWJtbEJ1ZmZlcldyaXRlci5jIGIvbGlidnB4L2xpYm1rdi9FYm1sQnVmZmVyV3JpdGVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm1rdi9FYm1sQnVmZmVyV3JpdGVyLmMKcmVuYW1lIHRvIGxpYnZweC9saWJta3YvRWJtbEJ1ZmZlcldyaXRlci5jCmRpZmYgLS1naXQgYS9saWJta3YvRWJtbEJ1ZmZlcldyaXRlci5oIGIvbGlidnB4L2xpYm1rdi9FYm1sQnVmZmVyV3JpdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm1rdi9FYm1sQnVmZmVyV3JpdGVyLmgKcmVuYW1lIHRvIGxpYnZweC9saWJta3YvRWJtbEJ1ZmZlcldyaXRlci5oCmRpZmYgLS1naXQgYS9saWJ2cHgvbGlibWt2L0VibWxJRHMuaCBiL2xpYnZweC9saWJta3YvRWJtbElEcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2U1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvbGlibWt2L0VibWxJRHMuaApAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBNS1ZfREVGU19IUFAKKyNkZWZpbmUgTUtWX0RFRlNfSFBQIDEKKworLyogQ29tbWVudGluZyBvdXQgdmFsdWVzIG5vdCBhdmFpbGFibGUgaW4gd2VibSwgYnV0IGF2YWlsYWJsZSBpbiBtYXRyb3NrYSAqLworCitlbnVtIG1rdgoreworICAgIEVCTUwgPSAweDFBNDVERkEzLAorICAgIEVCTUxWZXJzaW9uID0gMHg0Mjg2LAorICAgIEVCTUxSZWFkVmVyc2lvbiA9IDB4NDJGNywKKyAgICBFQk1MTWF4SURMZW5ndGggPSAweDQyRjIsCisgICAgRUJNTE1heFNpemVMZW5ndGggPSAweDQyRjMsCisgICAgRG9jVHlwZSA9IDB4NDI4MiwKKyAgICBEb2NUeXBlVmVyc2lvbiA9IDB4NDI4NywKKyAgICBEb2NUeXBlUmVhZFZlcnNpb24gPSAweDQyODUsCisvKiBDUkNfMzIgPSAweEJGLCAqLworICAgIFZvaWQgPSAweEVDLAorICAgIFNpZ25hdHVyZVNsb3QgPSAweDFCNTM4NjY3LAorICAgIFNpZ25hdHVyZUFsZ28gPSAweDdFOEEsCisgICAgU2lnbmF0dXJlSGFzaCA9IDB4N0U5QSwKKyAgICBTaWduYXR1cmVQdWJsaWNLZXkgPSAweDdFQTUsCisgICAgU2lnbmF0dXJlID0gMHg3RUI1LAorICAgIFNpZ25hdHVyZUVsZW1lbnRzID0gMHg3RTVCLAorICAgIFNpZ25hdHVyZUVsZW1lbnRMaXN0ID0gMHg3RTdCLAorICAgIFNpZ25lZEVsZW1lbnQgPSAweDY1MzIsCisgICAgLyogc2VnbWVudCAqLworICAgIFNlZ21lbnQgPSAweDE4NTM4MDY3LAorICAgIC8qIE1ldGEgU2VlayBJbmZvcm1hdGlvbiAqLworICAgIFNlZWtIZWFkID0gMHgxMTREOUI3NCwKKyAgICBTZWVrID0gMHg0REJCLAorICAgIFNlZWtJRCA9IDB4NTNBQiwKKyAgICBTZWVrUG9zaXRpb24gPSAweDUzQUMsCisgICAgLyogU2VnbWVudCBJbmZvcm1hdGlvbiAqLworICAgIEluZm8gPSAweDE1NDlBOTY2LAorLyogU2VnbWVudFVJRCA9IDB4NzNBNCwgKi8KKy8qIFNlZ21lbnRGaWxlbmFtZSA9IDB4NzM4NCwgKi8KKy8qIFByZXZVSUQgPSAweDNDQjkyMywgKi8KKy8qIFByZXZGaWxlbmFtZSA9IDB4M0M4M0FCLCAqLworLyogTmV4dFVJRCA9IDB4M0VCOTIzLCAqLworLyogTmV4dEZpbGVuYW1lID0gMHgzRTgzQkIsICovCisvKiBTZWdtZW50RmFtaWx5ID0gMHg0NDQ0LCAqLworLyogQ2hhcHRlclRyYW5zbGF0ZSA9IDB4NjkyNCwgKi8KKy8qIENoYXB0ZXJUcmFuc2xhdGVFZGl0aW9uVUlEID0gMHg2OUZDLCAqLworLyogQ2hhcHRlclRyYW5zbGF0ZUNvZGVjID0gMHg2OUJGLCAqLworLyogQ2hhcHRlclRyYW5zbGF0ZUlEID0gMHg2OUE1LCAqLworICAgIFRpbWVjb2RlU2NhbGUgPSAweDJBRDdCMSwKKyAgICBTZWdtZW50X0R1cmF0aW9uID0gMHg0NDg5LAorICAgIERhdGVVVEMgPSAweDQ0NjEsCisvKiBUaXRsZSA9IDB4N0JBOSwgKi8KKyAgICBNdXhpbmdBcHAgPSAweDREODAsCisgICAgV3JpdGluZ0FwcCA9IDB4NTc0MSwKKyAgICAvKiBDbHVzdGVyICovCisgICAgQ2x1c3RlciA9IDB4MUY0M0I2NzUsCisgICAgVGltZWNvZGUgPSAweEU3LAorLyogU2lsZW50VHJhY2tzID0gMHg1ODU0LCAqLworLyogU2lsZW50VHJhY2tOdW1iZXIgPSAweDU4RDcsICovCisvKiBQb3NpdGlvbiA9IDB4QTcsICovCisgICAgUHJldlNpemUgPSAweEFCLAorICAgIEJsb2NrR3JvdXAgPSAweEEwLAorICAgIEJsb2NrID0gMHhBMSwKKy8qIEJsb2NrVmlydHVhbCA9IDB4QTIsICovCisvKiBCbG9ja0FkZGl0aW9ucyA9IDB4NzVBMSwgKi8KKy8qIEJsb2NrTW9yZSA9IDB4QTYsICovCisvKiBCbG9ja0FkZElEID0gMHhFRSwgKi8KKy8qIEJsb2NrQWRkaXRpb25hbCA9IDB4QTUsICovCisgICAgQmxvY2tEdXJhdGlvbiA9IDB4OUIsCisvKiBSZWZlcmVuY2VQcmlvcml0eSA9IDB4RkEsICovCisgICAgUmVmZXJlbmNlQmxvY2sgPSAweEZCLAorLyogUmVmZXJlbmNlVmlydHVhbCA9IDB4RkQsICovCisvKiBDb2RlY1N0YXRlID0gMHhBNCwgKi8KKy8qIFNsaWNlcyA9IDB4OEUsICovCisvKiBUaW1lU2xpY2UgPSAweEU4LCAqLworICAgIExhY2VOdW1iZXIgPSAweENDLAorLyogRnJhbWVOdW1iZXIgPSAweENELCAqLworLyogQmxvY2tBZGRpdGlvbklEID0gMHhDQiwgKi8KKy8qIE1rdkRlbGF5ID0gMHhDRSwgKi8KKy8qIENsdXN0ZXJfRHVyYXRpb24gPSAweENGLCAqLworICAgIFNpbXBsZUJsb2NrID0gMHhBMywKKy8qIEVuY3J5cHRlZEJsb2NrID0gMHhBRiwgKi8KKyAgICAvKiBUcmFjayAqLworICAgIFRyYWNrcyA9IDB4MTY1NEFFNkIsCisgICAgVHJhY2tFbnRyeSA9IDB4QUUsCisgICAgVHJhY2tOdW1iZXIgPSAweEQ3LAorICAgIFRyYWNrVUlEID0gMHg3M0M1LAorICAgIFRyYWNrVHlwZSA9IDB4ODMsCisgICAgRmxhZ0VuYWJsZWQgPSAweEI5LAorICAgIEZsYWdEZWZhdWx0ID0gMHg4OCwKKyAgICBGbGFnRm9yY2VkID0gMHg1NUFBLAorICAgIEZsYWdMYWNpbmcgPSAweDlDLAorLyogTWluQ2FjaGUgPSAweDZERTcsICovCisvKiBNYXhDYWNoZSA9IDB4NkRGOCwgKi8KKyAgICBEZWZhdWx0RHVyYXRpb24gPSAweDIzRTM4MywKKy8qIFRyYWNrVGltZWNvZGVTY2FsZSA9IDB4MjMzMTRGLCAqLworLyogVHJhY2tPZmZzZXQgPSAweDUzN0YsICovCisvKiBNYXhCbG9ja0FkZGl0aW9uSUQgPSAweDU1RUUsICovCisgICAgTmFtZSA9IDB4NTM2RSwKKyAgICBMYW5ndWFnZSA9IDB4MjJCNTlDLAorICAgIENvZGVjSUQgPSAweDg2LAorICAgIENvZGVjUHJpdmF0ZSA9IDB4NjNBMiwKKyAgICBDb2RlY05hbWUgPSAweDI1ODY4OCwKKy8qIEF0dGFjaG1lbnRMaW5rID0gMHg3NDQ2LCAqLworLyogQ29kZWNTZXR0aW5ncyA9IDB4M0E5Njk3LCAqLworLyogQ29kZWNJbmZvVVJMID0gMHgzQjQwNDAsICovCisvKiBDb2RlY0Rvd25sb2FkVVJMID0gMHgyNkIyNDAsICovCisvKiBDb2RlY0RlY29kZUFsbCA9IDB4QUEsICovCisvKiBUcmFja092ZXJsYXkgPSAweDZGQUIsICovCisvKiBUcmFja1RyYW5zbGF0ZSA9IDB4NjYyNCwgKi8KKy8qIFRyYWNrVHJhbnNsYXRlRWRpdGlvblVJRCA9IDB4NjZGQywgKi8KKy8qIFRyYWNrVHJhbnNsYXRlQ29kZWMgPSAweDY2QkYsICovCisvKiBUcmFja1RyYW5zbGF0ZVRyYWNrSUQgPSAweDY2QTUsICovCisgICAgLyogdmlkZW8gKi8KKyAgICBWaWRlbyA9IDB4RTAsCisgICAgRmxhZ0ludGVybGFjZWQgPSAweDlBLAorICAgIFN0ZXJlb01vZGUgPSAweDUzQjgsCisgICAgUGl4ZWxXaWR0aCA9IDB4QjAsCisgICAgUGl4ZWxIZWlnaHQgPSAweEJBLAorICAgIFBpeGVsQ3JvcEJvdHRvbSA9IDB4NTRBQSwKKyAgICBQaXhlbENyb3BUb3AgPSAweDU0QkIsCisgICAgUGl4ZWxDcm9wTGVmdCA9IDB4NTRDQywKKyAgICBQaXhlbENyb3BSaWdodCA9IDB4NTRERCwKKyAgICBEaXNwbGF5V2lkdGggPSAweDU0QjAsCisgICAgRGlzcGxheUhlaWdodCA9IDB4NTRCQSwKKyAgICBEaXNwbGF5VW5pdCA9IDB4NTRCMiwKKyAgICBBc3BlY3RSYXRpb1R5cGUgPSAweDU0QjMsCisvKiBDb2xvdXJTcGFjZSA9IDB4MkVCNTI0LCAqLworLyogR2FtbWFWYWx1ZSA9IDB4MkZCNTIzLCAqLworICAgIEZyYW1lUmF0ZSA9IDB4MjM4M0UzLAorICAgIC8qIGVuZCB2aWRlbyAqLworICAgIC8qIGF1ZGlvICovCisgICAgQXVkaW8gPSAweEUxLAorICAgIFNhbXBsaW5nRnJlcXVlbmN5ID0gMHhCNSwKKyAgICBPdXRwdXRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4NzhCNSwKKyAgICBDaGFubmVscyA9IDB4OUYsCisvKiBDaGFubmVsUG9zaXRpb25zID0gMHg3RDdCLCAqLworICAgIEJpdERlcHRoID0gMHg2MjY0LAorICAgIC8qIGVuZCBhdWRpbyAqLworICAgIC8qIGNvbnRlbnQgZW5jb2RpbmcgKi8KKy8qIENvbnRlbnRFbmNvZGluZ3MgPSAweDZkODAsICovCisvKiBDb250ZW50RW5jb2RpbmcgPSAweDYyNDAsICovCisvKiBDb250ZW50RW5jb2RpbmdPcmRlciA9IDB4NTAzMSwgKi8KKy8qIENvbnRlbnRFbmNvZGluZ1Njb3BlID0gMHg1MDMyLCAqLworLyogQ29udGVudEVuY29kaW5nVHlwZSA9IDB4NTAzMywgKi8KKy8qIENvbnRlbnRDb21wcmVzc2lvbiA9IDB4NTAzNCwgKi8KKy8qIENvbnRlbnRDb21wQWxnbyA9IDB4NDI1NCwgKi8KKy8qIENvbnRlbnRDb21wU2V0dGluZ3MgPSAweDQyNTUsICovCisvKiBDb250ZW50RW5jcnlwdGlvbiA9IDB4NTAzNSwgKi8KKy8qIENvbnRlbnRFbmNBbGdvID0gMHg0N2UxLCAqLworLyogQ29udGVudEVuY0tleUlEID0gMHg0N2UyLCAqLworLyogQ29udGVudFNpZ25hdHVyZSA9IDB4NDdlMywgKi8KKy8qIENvbnRlbnRTaWdLZXlJRCA9IDB4NDdlNCwgKi8KKy8qIENvbnRlbnRTaWdBbGdvID0gMHg0N2U1LCAqLworLyogQ29udGVudFNpZ0hhc2hBbGdvID0gMHg0N2U2LCAqLworICAgIC8qIGVuZCBjb250ZW50IGVuY29kaW5nICovCisgICAgLyogQ3VlaW5nIERhdGEgKi8KKyAgICBDdWVzID0gMHgxQzUzQkI2QiwKKyAgICBDdWVQb2ludCA9IDB4QkIsCisgICAgQ3VlVGltZSA9IDB4QjMsCisgICAgQ3VlVHJhY2tQb3NpdGlvbnMgPSAweEI3LAorICAgIEN1ZVRyYWNrID0gMHhGNywKKyAgICBDdWVDbHVzdGVyUG9zaXRpb24gPSAweEYxLAorICAgIEN1ZUJsb2NrTnVtYmVyID0gMHg1Mzc4CisvKiBDdWVDb2RlY1N0YXRlID0gMHhFQSwgKi8KKy8qIEN1ZVJlZmVyZW5jZSA9IDB4REIsICovCisvKiBDdWVSZWZUaW1lID0gMHg5NiwgKi8KKy8qIEN1ZVJlZkNsdXN0ZXIgPSAweDk3LCAqLworLyogQ3VlUmVmTnVtYmVyID0gMHg1MzVGLCAqLworLyogQ3VlUmVmQ29kZWNTdGF0ZSA9IDB4RUIsICovCisgICAgLyogQXR0YWNobWVudCAqLworLyogQXR0YWNobWVudHMgPSAweDE5NDFBNDY5LCAqLworLyogQXR0YWNoZWRGaWxlID0gMHg2MUE3LCAqLworLyogRmlsZURlc2NyaXB0aW9uID0gMHg0NjdFLCAqLworLyogRmlsZU5hbWUgPSAweDQ2NkUsICovCisvKiBGaWxlTWltZVR5cGUgPSAweDQ2NjAsICovCisvKiBGaWxlRGF0YSA9IDB4NDY1QywgKi8KKy8qIEZpbGVVSUQgPSAweDQ2QUUsICovCisvKiBGaWxlUmVmZXJyYWwgPSAweDQ2NzUsICovCisgICAgLyogQ2hhcHRlcnMgKi8KKy8qIENoYXB0ZXJzID0gMHgxMDQzQTc3MCwgKi8KKy8qIEVkaXRpb25FbnRyeSA9IDB4NDVCOSwgKi8KKy8qIEVkaXRpb25VSUQgPSAweDQ1QkMsICovCisvKiBFZGl0aW9uRmxhZ0hpZGRlbiA9IDB4NDVCRCwgKi8KKy8qIEVkaXRpb25GbGFnRGVmYXVsdCA9IDB4NDVEQiwgKi8KKy8qIEVkaXRpb25GbGFnT3JkZXJlZCA9IDB4NDVERCwgKi8KKy8qIENoYXB0ZXJBdG9tID0gMHhCNiwgKi8KKy8qIENoYXB0ZXJVSUQgPSAweDczQzQsICovCisvKiBDaGFwdGVyVGltZVN0YXJ0ID0gMHg5MSwgKi8KKy8qIENoYXB0ZXJUaW1lRW5kID0gMHg5MiwgKi8KKy8qIENoYXB0ZXJGbGFnSGlkZGVuID0gMHg5OCwgKi8KKy8qIENoYXB0ZXJGbGFnRW5hYmxlZCA9IDB4NDU5OCwgKi8KKy8qIENoYXB0ZXJTZWdtZW50VUlEID0gMHg2RTY3LCAqLworLyogQ2hhcHRlclNlZ21lbnRFZGl0aW9uVUlEID0gMHg2RUJDLCAqLworLyogQ2hhcHRlclBoeXNpY2FsRXF1aXYgPSAweDYzQzMsICovCisvKiBDaGFwdGVyVHJhY2sgPSAweDhGLCAqLworLyogQ2hhcHRlclRyYWNrTnVtYmVyID0gMHg4OSwgKi8KKy8qIENoYXB0ZXJEaXNwbGF5ID0gMHg4MCwgKi8KKy8qIENoYXBTdHJpbmcgPSAweDg1LCAqLworLyogQ2hhcExhbmd1YWdlID0gMHg0MzdDLCAqLworLyogQ2hhcENvdW50cnkgPSAweDQzN0UsICovCisvKiBDaGFwUHJvY2VzcyA9IDB4Njk0NCwgKi8KKy8qIENoYXBQcm9jZXNzQ29kZWNJRCA9IDB4Njk1NSwgKi8KKy8qIENoYXBQcm9jZXNzUHJpdmF0ZSA9IDB4NDUwRCwgKi8KKy8qIENoYXBQcm9jZXNzQ29tbWFuZCA9IDB4NjkxMSwgKi8KKy8qIENoYXBQcm9jZXNzVGltZSA9IDB4NjkyMiwgKi8KKy8qIENoYXBQcm9jZXNzRGF0YSA9IDB4NjkzMywgKi8KKyAgICAvKiBUYWdnaW5nICovCisvKiBUYWdzID0gMHgxMjU0QzM2NywgKi8KKy8qIFRhZyA9IDB4NzM3MywgKi8KKy8qIFRhcmdldHMgPSAweDYzQzAsICovCisvKiBUYXJnZXRUeXBlVmFsdWUgPSAweDY4Q0EsICovCisvKiBUYXJnZXRUeXBlID0gMHg2M0NBLCAqLworLyogVGFnZ2luZ19UcmFja1VJRCA9IDB4NjNDNSwgKi8KKy8qIFRhZ2dpbmdfRWRpdGlvblVJRCA9IDB4NjNDOSwgKi8KKy8qIFRhZ2dpbmdfQ2hhcHRlclVJRCA9IDB4NjNDNCwgKi8KKy8qIEF0dGFjaG1lbnRVSUQgPSAweDYzQzYsICovCisvKiBTaW1wbGVUYWcgPSAweDY3QzgsICovCisvKiBUYWdOYW1lID0gMHg0NUEzLCAqLworLyogVGFnTGFuZ3VhZ2UgPSAweDQ0N0EsICovCisvKiBUYWdEZWZhdWx0ID0gMHg0NDg0LCAqLworLyogVGFnU3RyaW5nID0gMHg0NDg3LCAqLworLyogVGFnQmluYXJ5ID0gMHg0NDg1LCAqLworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L2xpYm1rdi9FYm1sV3JpdGVyLmMgYi9saWJ2cHgvbGlibWt2L0VibWxXcml0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBmMDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2xpYm1rdi9FYm1sV3JpdGVyLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJFYm1sV3JpdGVyLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8d2NoYXIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBMSVRFUkFMVTY0KG4pIG4KKyNlbHNlCisjZGVmaW5lIExJVEVSQUxVNjQobikgbiMjTExVCisjZW5kaWYKKwordm9pZCBFYm1sX1dyaXRlTGVuKEVibWxHbG9iYWwgKmdsb2IsIGludDY0X3QgdmFsKQoreworICAgIC8qIFRPRE8gY2hlY2sgYW5kIG1ha2Ugc3VyZSB3ZSBhcmUgbm90ID4gdGhhbiAweDAxMDAwMDAwMDAwMDAwMDBMTFUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNpemUgPSA4OyAvKiBzaXplIGluIGJ5dGVzIHRvIG91dHB1dCAqLworCisgICAgLyogbWFzayB0byBjb21wYXJlIGZvciBieXRlIHNpemUgKi8KKyAgICBpbnQ2NF90IG1pblZhbCA9IDB4ZmY7CisKKyAgICBmb3IgKHNpemUgPSAxOyBzaXplIDwgODsgc2l6ZSArKykKKyAgICB7CisgICAgICAgIGlmICh2YWwgPCBtaW5WYWwpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtaW5WYWwgPSAobWluVmFsIDw8IDcpOworICAgIH0KKworICAgIHZhbCB8PSAoKCh1aW50NjRfdCkweDgwKSA8PCAoKHNpemUgLSAxKSAqIDcpKTsKKworICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICh2b2lkICopICZ2YWwsIHNpemVvZih2YWwpLCBzaXplKTsKK30KKwordm9pZCBFYm1sX1dyaXRlU3RyaW5nKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBzaXplX3Qgc2l6ZV8gPSBzdHJsZW4oc3RyKTsKKyAgICBjb25zdCB1aW50NjRfdCAgc2l6ZSA9IHNpemVfOworICAgIEVibWxfV3JpdGVMZW4oZ2xvYiwgc2l6ZSk7CisgICAgLyogVE9ETzogaXQncyBub3QgY2xlYXIgZnJvbSB0aGUgc3BlYyB3aGV0aGVyIHRoZSBudWwgdGVybWluYXRvcgorICAgICAqIHNob3VsZCBiZSBzZXJpYWxpemVkIHRvby4gIEZvciBub3cgd2Ugb21pdCB0aGUgbnVsbCB0ZXJtaW5hdG9yLgorICAgICAqLworICAgIEVibWxfV3JpdGUoZ2xvYiwgc3RyLCAodW5zaWduZWQgbG9uZylzaXplKTsKK30KKwordm9pZCBFYm1sX1dyaXRlVVRGOChFYm1sR2xvYmFsICpnbG9iLCBjb25zdCB3Y2hhcl90ICp3c3RyKQoreworICAgIGNvbnN0IHNpemVfdCBzdHJsZW4gPSB3Y3NsZW4od3N0cik7CisKKyAgICAvKiBUT0RPOiBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBzcGVjIHdoZXRoZXIgdGhlIG51bCB0ZXJtaW5hdG9yCisgICAgICogc2hvdWxkIGJlIHNlcmlhbGl6ZWQgdG9vLiAgRm9yIG5vdyB3ZSBpbmNsdWRlIGl0LgorICAgICAqLworICAgIGNvbnN0IHVpbnQ2NF90ICBzaXplID0gc3RybGVuOworCisgICAgRWJtbF9Xcml0ZUxlbihnbG9iLCBzaXplKTsKKyAgICBFYm1sX1dyaXRlKGdsb2IsIHdzdHIsICh1bnNpZ25lZCBsb25nKXNpemUpOworfQorCit2b2lkIEVibWxfV3JpdGVJRChFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkKQoreworICAgIGludCBsZW47CisKKyAgICBpZiAoY2xhc3NfaWQgPj0gMHgwMTAwMDAwMCkKKyAgICAgICAgbGVuID0gNDsKKyAgICBlbHNlIGlmIChjbGFzc19pZCA+PSAweDAwMDEwMDAwKQorICAgICAgICBsZW4gPSAzOworICAgIGVsc2UgaWYgKGNsYXNzX2lkID49IDB4MDAwMDAxMDApCisgICAgICAgIGxlbiA9IDI7CisgICAgZWxzZQorICAgICAgICBsZW4gPSAxOworCisgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgKHZvaWQgKikmY2xhc3NfaWQsIHNpemVvZihjbGFzc19pZCksIGxlbik7Cit9CisKK3ZvaWQgRWJtbF9TZXJpYWxpemVVbnNpZ25lZDY0KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVpbnQ2NF90IHVpKQoreworICAgIHVuc2lnbmVkIGNoYXIgc2l6ZVNlcmlhbGl6ZWQgPSA4IHwgMHg4MDsKKyAgICBFYm1sX1dyaXRlSUQoZ2xvYiwgY2xhc3NfaWQpOworICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZzaXplU2VyaWFsaXplZCwgc2l6ZW9mKHNpemVTZXJpYWxpemVkKSwgMSk7CisgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJnVpLCBzaXplb2YodWkpLCA4KTsKK30KKwordm9pZCBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVuc2lnbmVkIGxvbmcgdWkpCit7CisgICAgdW5zaWduZWQgY2hhciBzaXplID0gODsgLyogc2l6ZSBpbiBieXRlcyB0byBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNpemVTZXJpYWxpemVkID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIG1pblZhbDsKKworICAgIEVibWxfV3JpdGVJRChnbG9iLCBjbGFzc19pZCk7CisgICAgbWluVmFsID0gMHg3ZkxVOyAvKiBtYXNrIHRvIGNvbXBhcmUgZm9yIGJ5dGUgc2l6ZSAqLworCisgICAgZm9yIChzaXplID0gMTsgc2l6ZSA8IDQ7IHNpemUgKyspCisgICAgeworICAgICAgICBpZiAodWkgPCBtaW5WYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWluVmFsIDw8PSA3OworICAgIH0KKworICAgIHNpemVTZXJpYWxpemVkID0gMHg4MCB8IHNpemU7CisgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJnNpemVTZXJpYWxpemVkLCBzaXplb2Yoc2l6ZVNlcmlhbGl6ZWQpLCAxKTsKKyAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmdWksIHNpemVvZih1aSksIHNpemUpOworfQorLyogVE9ETzogcGVyaGFwcyB0aGlzIGlzIGEgcG9vciBuYW1lIGZvciB0aGlzIGlkIHNlcmlhbGl6ZXIgaGVscGVyIGZ1bmN0aW9uICovCit2b2lkIEVibWxfU2VyaWFsaXplQmluYXJ5KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVuc2lnbmVkIGxvbmcgYmluKQoreworICAgIGludCBzaXplOworICAgIGZvciAoc2l6ZT00OyBzaXplID4gMTsgc2l6ZS0tKQorICAgIHsKKyAgICAgICAgaWYgKGJpbiAmIDB4MDAwMDAwZmYgPDwgKChzaXplLTEpICogOCkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKKyAgICBFYm1sX1dyaXRlTGVuKGdsb2IsIHNpemUpOworICAgIEVibWxfV3JpdGVJRChnbG9iLCBiaW4pOworfQorCit2b2lkIEVibWxfU2VyaWFsaXplRmxvYXQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgZG91YmxlIGQpCit7CisgICAgdW5zaWduZWQgY2hhciBsZW4gPSAweDg4OworCisgICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKKyAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmbGVuLCBzaXplb2YobGVuKSwgMSk7CisgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgICZkLCBzaXplb2YoZCksIDgpOworfQorCit2b2lkIEVibWxfV3JpdGVTaWduZWQxNihFYm1sR2xvYmFsICpnbG9iLCBzaG9ydCB2YWwpCit7CisgICAgc2lnbmVkIGxvbmcgb3V0ID0gKCh2YWwgJiAweDAwM0ZGRkZGKSB8IDB4MDAyMDAwMDApIDw8IDg7CisgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJm91dCwgc2l6ZW9mKG91dCksIDMpOworfQorCit2b2lkIEVibWxfU2VyaWFsaXplU3RyaW5nKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIGNvbnN0IGNoYXIgKnMpCit7CisgICAgRWJtbF9Xcml0ZUlEKGdsb2IsIGNsYXNzX2lkKTsKKyAgICBFYm1sX1dyaXRlU3RyaW5nKGdsb2IsIHMpOworfQorCit2b2lkIEVibWxfU2VyaWFsaXplVVRGOChFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCB3Y2hhcl90ICpzKQoreworICAgIEVibWxfV3JpdGVJRChnbG9iLCAgY2xhc3NfaWQpOworICAgIEVibWxfV3JpdGVVVEY4KGdsb2IsICBzKTsKK30KKwordm9pZCBFYm1sX1NlcmlhbGl6ZURhdGEoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBkYXRhX2xlbmd0aCkKK3sKKyAgICBFYm1sX1dyaXRlSUQoZ2xvYiwgY2xhc3NfaWQpOworICAgIEVibWxfV3JpdGVMZW4oZ2xvYiwgZGF0YV9sZW5ndGgpOworICAgIEVibWxfV3JpdGUoZ2xvYiwgIGRhdGEsIGRhdGFfbGVuZ3RoKTsKK30KKwordm9pZCBFYm1sX1dyaXRlVm9pZChFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIHZTaXplKQoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGkgPSAwOworCisgICAgRWJtbF9Xcml0ZUlEKGdsb2IsIDB4RUMpOworICAgIEVibWxfV3JpdGVMZW4oZ2xvYiwgdlNpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHZTaXplOyBpKyspCisgICAgeworICAgICAgICBFYm1sX1dyaXRlKGdsb2IsICZ0bXAsIDEpOworICAgIH0KK30KKworLyogVE9ETyBTZXJpYWxpemUgRGF0ZSAqLwpkaWZmIC0tZ2l0IGEvbGlidnB4L2xpYm1rdi9FYm1sV3JpdGVyLmggYi9saWJ2cHgvbGlibWt2L0VibWxXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRmNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2xpYm1rdi9FYm1sV3JpdGVyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBFQk1MV1JJVEVSX0hQUAorI2RlZmluZSBFQk1MV1JJVEVSX0hQUAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorCisvKiBub3RlOiB5b3UgbXVzdCBkZWZpbmUgd3JpdGUgYW5kIHNlcmlhbGl6ZSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB5b3VyIG93bgorICogRUJNTF9HTE9CQUwKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgTVVTVCBiZSBpbXBsZW1lbnRlZAorICovCisKK3R5cGVkZWYgc3RydWN0IEVibWxHbG9iYWwgRWJtbEdsb2JhbDsKK3ZvaWQgIEVibWxfU2VyaWFsaXplKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IHZvaWQgKiwgaW50LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgIEVibWxfV3JpdGUoRWJtbEdsb2JhbCAqZ2xvYiwgY29uc3Qgdm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKKworLyoqKioqLworCit2b2lkIEVibWxfV3JpdGVMZW4oRWJtbEdsb2JhbCAqZ2xvYiwgaW50NjRfdCB2YWwpOwordm9pZCBFYm1sX1dyaXRlU3RyaW5nKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIEVibWxfV3JpdGVVVEY4KEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IHdjaGFyX3QgKndzdHIpOwordm9pZCBFYm1sX1dyaXRlSUQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCk7Cit2b2lkIEVibWxfU2VyaWFsaXplVW5zaWduZWQ2NChFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCB1aW50NjRfdCB1aSk7Cit2b2lkIEVibWxfU2VyaWFsaXplVW5zaWduZWQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgdW5zaWduZWQgbG9uZyB1aSk7Cit2b2lkIEVibWxfU2VyaWFsaXplQmluYXJ5KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVuc2lnbmVkIGxvbmcgdWkpOwordm9pZCBFYm1sX1NlcmlhbGl6ZUZsb2F0KEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIGRvdWJsZSBkKTsKKy8qIFRPRE8gbWFrZSB0aGlzIG1vcmUgZ2VuZXJpYyB0byBzaWduZWQgKi8KK3ZvaWQgRWJtbF9Xcml0ZVNpZ25lZDE2KEVibWxHbG9iYWwgKmdsb2IsIHNob3J0IHZhbCk7Cit2b2lkIEVibWxfU2VyaWFsaXplU3RyaW5nKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIGNvbnN0IGNoYXIgKnMpOwordm9pZCBFYm1sX1NlcmlhbGl6ZVVURjgoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgd2NoYXJfdCAqcyk7Cit2b2lkIEVibWxfU2VyaWFsaXplRGF0YShFYm1sR2xvYmFsICpnbG9iLCB1bnNpZ25lZCBsb25nIGNsYXNzX2lkLCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuZ3RoKTsKK3ZvaWQgRWJtbF9Xcml0ZVZvaWQoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyB2U2l6ZSk7CisvKiBUT0RPIG5lZWQgZGF0ZSBmdW5jdGlvbiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJta3YvTWFrZWZpbGUgYi9saWJ2cHgvbGlibWt2L01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJta3YvTWFrZWZpbGUKcmVuYW1lIHRvIGxpYnZweC9saWJta3YvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2xpYnZweC9saWJta3YvV2ViTUVsZW1lbnQuYyBiL2xpYnZweC9saWJta3YvV2ViTUVsZW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY1MTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L2xpYm1rdi9XZWJNRWxlbWVudC5jCkBAIC0wLDAgKzEsMjIwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisKKworI2luY2x1ZGUgIkVibWxCdWZmZXJXcml0ZXIuaCIKKyNpbmNsdWRlICJFYm1sSURzLmgiCisjaW5jbHVkZSAiV2ViTUVsZW1lbnQuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIGtWb3JiaXNQcml2YXRlTWF4U2l6ZSAgNDAwMAorCit2b2lkIHdyaXRlSGVhZGVyKEVibWxHbG9iYWwgKmdsb2IpCit7CisgICAgRWJtbExvYyBzdGFydDsKKyAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmc3RhcnQsIEVCTUwpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRUJNTFZlcnNpb24sIDEpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRUJNTFJlYWRWZXJzaW9uLCAxKTsgLy9FQk1MIFJlYWQgVmVyc2lvbgorICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRUJNTE1heElETGVuZ3RoLCA0KTsgLy9FQk1MIE1heCBJRCBMZW5ndGgKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEVCTUxNYXhTaXplTGVuZ3RoLCA4KTsgLy9FQk1MIE1heCBTaXplIExlbmd0aAorICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGdsb2IsIERvY1R5cGUsICJ3ZWJtIik7IC8vRG9jIFR5cGUKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIERvY1R5cGVWZXJzaW9uLCAyKTsgLy9Eb2MgVHlwZSBWZXJzaW9uCisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBEb2NUeXBlUmVhZFZlcnNpb24sIDIpOyAvL0RvYyBUeXBlIFJlYWQgVmVyc2lvbgorICAgIEVibWxfRW5kU3ViRWxlbWVudChnbG9iLCAmc3RhcnQpOworfQorCit2b2lkIHdyaXRlU2ltcGxlQmxvY2soRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgY2hhciB0cmFja051bWJlciwgc2hvcnQgdGltZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGlzS2V5ZnJhbWUsIHVuc2lnbmVkIGNoYXIgbGFjaW5nRmxhZywgaW50IGRpc2NhcmRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgZGF0YUxlbmd0aCkKK3sKKyAgICBFYm1sX1dyaXRlSUQoZ2xvYiwgU2ltcGxlQmxvY2spOworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tMZW5ndGggPSA0ICsgZGF0YUxlbmd0aDsKKyAgICBibG9ja0xlbmd0aCB8PSAweDEwMDAwMDAwOyAvL1RPRE8gY2hlY2sgbGVuZ3RoIDwgMHgwRkZGRkZGRkYKKyAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmYmxvY2tMZW5ndGgsIHNpemVvZihibG9ja0xlbmd0aCksIDQpOworICAgIHRyYWNrTnVtYmVyIHw9IDB4ODA7ICAvL1RPRE8gY2hlY2sgdHJhY2sgbnVibWVyIDwgMTI4CisgICAgRWJtbF9Xcml0ZShnbG9iLCAmdHJhY2tOdW1iZXIsIDEpOworICAgIC8vRWJtbF9Xcml0ZVNpZ25lZDE2KGdsb2IsIHRpbWVDb2RlLDIpOyAvL3RoaXMgaXMgMyBieXRlcworICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZ0aW1lQ29kZSwgc2l6ZW9mKHRpbWVDb2RlKSwgMik7CisgICAgdW5zaWduZWQgY2hhciBmbGFncyA9IDB4MDAgfCAoaXNLZXlmcmFtZSA/IDB4ODAgOiAweDAwKSB8IChsYWNpbmdGbGFnIDw8IDEpIHwgZGlzY2FyZGFibGU7CisgICAgRWJtbF9Xcml0ZShnbG9iLCAmZmxhZ3MsIDEpOworICAgIEVibWxfV3JpdGUoZ2xvYiwgZGF0YSwgZGF0YUxlbmd0aCk7Cit9CisKK3N0YXRpYyBVSW50NjQgZ2VuZXJhdGVUcmFja0lEKHVuc2lnbmVkIGludCB0cmFja051bWJlcikKK3sKKyAgICBVSW50NjQgdCA9IHRpbWUoTlVMTCkgKiB0cmFja051bWJlcjsKKyAgICBVSW50NjQgciA9IHJhbmQoKTsKKyAgICByID0gciA8PCAzMjsKKyAgICByICs9ICByYW5kKCk7CisgICAgVUludDY0IHJ2YWwgPSB0IF4gcjsKKyAgICByZXR1cm4gcnZhbDsKK30KKwordm9pZCB3cml0ZVZpZGVvVHJhY2soRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgaW50IHRyYWNrTnVtYmVyLCBpbnQgZmxhZ0xhY2luZywKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvZGVjSWQsIHVuc2lnbmVkIGludCBwaXhlbFdpZHRoLCB1bnNpZ25lZCBpbnQgcGl4ZWxIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnJhbWVSYXRlKQoreworICAgIEVibWxMb2Mgc3RhcnQ7CisgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBUcmFja0VudHJ5KTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFRyYWNrTnVtYmVyLCB0cmFja051bWJlcik7CisgICAgVUludDY0IHRyYWNrSUQgPSBnZW5lcmF0ZVRyYWNrSUQodHJhY2tOdW1iZXIpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tVSUQsIHRyYWNrSUQpOworICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGdsb2IsIENvZGVjTmFtZSwgIlZQOCIpOyAgLy9UT0RPIHNob3VsZG4ndCBiZSBmaXhlZAorCisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUcmFja1R5cGUsIDEpOyAvL3ZpZGVvIGlzIGFsd2F5cyAxCisgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZ2xvYiwgQ29kZWNJRCwgY29kZWNJZCk7CisgICAgeworICAgICAgICBFYm1sTG9jIHZpZGVvU3RhcnQ7CisgICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZ2aWRlb1N0YXJ0LCBWaWRlbyk7CisgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgUGl4ZWxXaWR0aCwgcGl4ZWxXaWR0aCk7CisgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgUGl4ZWxIZWlnaHQsIHBpeGVsSGVpZ2h0KTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVGbG9hdChnbG9iLCBGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgIEVibWxfRW5kU3ViRWxlbWVudChnbG9iLCAmdmlkZW9TdGFydCk7IC8vVmlkZW8KKyAgICB9CisgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7IC8vVHJhY2sgRW50cnkKK30KK3ZvaWQgd3JpdGVBdWRpb1RyYWNrKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGludCB0cmFja051bWJlciwgaW50IGZsYWdMYWNpbmcsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb2RlY0lkLCBkb3VibGUgc2FtcGxpbmdGcmVxdWVuY3ksIHVuc2lnbmVkIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByaXZhdGUsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZVNpemUpCit7CisgICAgRWJtbExvYyBzdGFydDsKKyAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmc3RhcnQsIFRyYWNrRW50cnkpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tOdW1iZXIsIHRyYWNrTnVtYmVyKTsKKyAgICBVSW50NjQgdHJhY2tJRCA9IGdlbmVyYXRlVHJhY2tJRCh0cmFja051bWJlcik7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUcmFja1VJRCwgdHJhY2tJRCk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUcmFja1R5cGUsIDIpOyAvL2F1ZGlvIGlzIGFsd2F5cyAyCisgICAgLy9JIGFtIHVzaW5nIGRlZmF1bHRzIGZvciB0aGVzZWQgcmVxdWlyZWQgZmllbGRzCisgICAgLyogIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRmxhZ0VuYWJsZWQsIDEpOworICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEZsYWdEZWZhdWx0LCAxKTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBGbGFnRm9yY2VkLCAxKTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBGbGFnTGFjaW5nLCBmbGFnTGFjaW5nKTsqLworICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGdsb2IsIENvZGVjSUQsIGNvZGVjSWQpOworICAgIEVibWxfU2VyaWFsaXplRGF0YShnbG9iLCBDb2RlY1ByaXZhdGUsIHByaXZhdGUsIHByaXZhdGVTaXplKTsKKworICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGdsb2IsIENvZGVjTmFtZSwgIlZPUkJJUyIpOyAgLy9maXhlZCBmb3Igbm93CisgICAgeworICAgICAgICBFYm1sTG9jIEF1ZGlvU3RhcnQ7CisgICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZBdWRpb1N0YXJ0LCBBdWRpbyk7CisgICAgICAgIEVibWxfU2VyaWFsaXplRmxvYXQoZ2xvYiwgU2FtcGxpbmdGcmVxdWVuY3ksIHNhbXBsaW5nRnJlcXVlbmN5KTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBDaGFubmVscywgY2hhbm5lbHMpOworICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJkF1ZGlvU3RhcnQpOworICAgIH0KKyAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0KTsKK30KK3ZvaWQgd3JpdGVTZWdtZW50SW5mb3JtYXRpb24oRWJtbEdsb2JhbCAqZWJtbCwgRWJtbExvYyogc3RhcnRJbmZvLCB1bnNpZ25lZCBsb25nIHRpbWVDb2RlU2NhbGUsIGRvdWJsZSBkdXJhdGlvbikKK3sKKyAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sLCBzdGFydEluZm8sIEluZm8pOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbCwgVGltZWNvZGVTY2FsZSwgdGltZUNvZGVTY2FsZSk7CisgICAgRWJtbF9TZXJpYWxpemVGbG9hdChlYm1sLCBTZWdtZW50X0R1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAuMCk7IC8vQ3VycmVudGx5IGZpeGVkIHRvIHVzaW5nIG1pbGxpc2Vjb25kcworICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGVibWwsIDB4NEQ4MCwgIlFUbXV4aW5nQXBwTGliV2ViTS0wLjAuMSIpOworICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGVibWwsIDB4NTc0MSwgIlFUd3JpdGluZ0FwcExpYldlYk0tMC4wLjEiKTsKKyAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbCwgc3RhcnRJbmZvKTsKK30KKworLyoKK3ZvaWQgTWt2X0luaXRpYWxpemVTZWdtZW50KEVibWwmIGVibWxfb3V0LCBFYm1sTG9jJiBlYm1sTG9jKQoreworICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCBlYm1sTG9jLCAweDE4NTM4MDY3KTsKK30KKwordm9pZCBNa3ZfSW5pdGlhbGl6ZVNlZWsoRWJtbCYgZWJtbF9vdXQsIEVibWxMb2MmIGVibWxMb2MpCit7CisgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIGVibWxMb2MsIDB4MTE0ZDliNzQpOworfQordm9pZCBNa3ZfV3JpdGVTZWVrSW5mb3JtYXRpb24oRWJtbCYgZWJtbF9vdXQsIFNlZWtTdHJ1Y3QmIHNlZWtJbmZvcm1hdGlvbikKK3sKKyAgICBFYm1sTG9jIGVibWxMb2M7CisgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIGVibWxMb2MsIDB4NGRiYik7CisgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZWJtbF9vdXQsIDB4NTNhYiwgc2Vla0luZm9ybWF0aW9uLlNlZWtJRCk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg1M2FjLCBzZWVrSW5mb3JtYXRpb24uU2Vla1Bvc2l0aW9uKTsKKyAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbF9vdXQsIGVibWxMb2MpOworfQorCit2b2lkIE1rdl9Xcml0ZVNlZ21lbnRJbmZvcm1hdGlvbihFYm1sJiBlYm1sX291dCwgU2VnbWVudEluZm9ybWF0aW9uU3RydWN0JiBzZWdtZW50SW5mb3JtYXRpb24pCit7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg3M2E0LCBzZWdtZW50SW5mb3JtYXRpb24uc2VnbWVudFVJRCk7CisgICAgaWYgKHNlZ21lbnRJbmZvcm1hdGlvbi5maWxlbmFtZSAhPSAwKQorICAgICAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhlYm1sX291dCwgMHg3Mzg0LCBzZWdtZW50SW5mb3JtYXRpb24uZmlsZW5hbWUpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4MkFEN0IxLCBzZWdtZW50SW5mb3JtYXRpb24uVGltZWNvZGVTY2FsZSk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg0NDg5LCBzZWdtZW50SW5mb3JtYXRpb24uRHVyYXRpb24pOworICAgIC8vVE9ETyBkYXRlCisgICAgRWJtbF9TZXJpYWxpemVXU3RyaW5nKGVibWxfb3V0LCAweDREODAsIEwiTUtWTVVYIik7CisgICAgRWJtbF9TZXJpYWxpemVXU3RyaW5nKGVibWxfb3V0LCAweDU3NDEsIHNlZ21lbnRJbmZvcm1hdGlvbi5Xcml0aW5nQXBwKTsKK30KKwordm9pZCBNa3ZfSW5pdGlhbGl6ZVRyYWNrKEVibWwmIGVibWxfb3V0LCBFYm1sTG9jJiBlYm1sTG9jKQoreworICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCBlYm1sTG9jLCAweDE2NTRBRTZCKTsKK30KKworc3RhdGljIHZvaWQgTWt2X1dyaXRlR2VuZXJpY1RyYWNrRGF0YShFYm1sJiBlYm1sX291dCwgVHJhY2tTdHJ1Y3QmIHRyYWNrKQoreworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4RDcsIHRyYWNrLlRyYWNrTnVtYmVyKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDczQzUsIHRyYWNrLlRyYWNrVUlEKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDgzLCB0cmFjay5UcmFja1R5cGUpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4QjksIHRyYWNrLkZsYWdFbmFibGVkID8gMSA6MCk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg4OCwgdHJhY2suRmxhZ0RlZmF1bHQgPyAxIDowKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweDU1QUEsIHRyYWNrLkZsYWdGb3JjZWQgPyAxIDowKTsKKyAgICBpZiAodHJhY2suTGFuZ3VhZ2UgIT0gMCkKKyAgICAgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZWJtbF9vdXQsIDB4MjJCNTlDLCB0cmFjay5MYW5ndWFnZSk7CisgICAgaWYgKHRyYWNrLkNvZGVjSUQgIT0gMCkKKyAgICAgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZWJtbF9vdXQsIDB4ODYsIHRyYWNrLkNvZGVjSUQpOworICAgIGlmICh0cmFjay5Db2RlY1ByaXZhdGUgIT0gMCkKKyAgICAgICAgRWJtbF9TZXJpYWxpemVEYXRhKGVibWxfb3V0LCAweDYzQTIsIHRyYWNrLkNvZGVjUHJpdmF0ZSwgdHJhY2suQ29kZWNQcml2YXRlTGVuZ3RoKTsKKyAgICBpZiAodHJhY2suQ29kZWNOYW1lICE9IDApCisgICAgICAgIEVibWxfU2VyaWFsaXplV1N0cmluZyhlYm1sX291dCwgMHgyNTg2ODgsIHRyYWNrLkNvZGVjTmFtZSk7Cit9CisKK3ZvaWQgTWt2X1dyaXRlVmlkZW9UcmFjayhFYm1sJiBlYm1sX291dCwgVHJhY2tTdHJ1Y3QgJiB0cmFjaywgVmlkZW9UcmFja1N0cnVjdCYgdmlkZW8pCit7CisgICAgRWJtbExvYyB0cmFja0hlYWRMb2MsIHZpZGVvSGVhZExvYzsKKyAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sX291dCwgdHJhY2tIZWFkTG9jLCAweEFFKTsgIC8vc3RhcnQgVHJhY2sKKyAgICBNa3ZfV3JpdGVHZW5lcmljVHJhY2tEYXRhKGVibWxfb3V0LCB0cmFjayk7CisgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIHZpZGVvSGVhZExvYywgMHhFMCk7ICAvL3N0YXJ0IFZpZGVvCisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg5QSwgdmlkZW8uRmxhZ0ludGVybGFjZWQgPyAxIDowKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweEIwLCB2aWRlby5QaXhlbFdpZHRoKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGVibWxfb3V0LCAweEJBLCB2aWRlby5QaXhlbEhlaWdodCk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg1NEIwLCB2aWRlby5QaXhlbERpc3BsYXlXaWR0aCk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg1NEJBLCB2aWRlby5QaXhlbERpc3BsYXlIZWlnaHQpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NTRCMiwgdmlkZW8uZGlzcGxheVVuaXQpOworICAgIEVibWxfU2VyaWFsaXplRmxvYXQoZWJtbF9vdXQsIDB4MjM4M0UzLCB2aWRlby5GcmFtZVJhdGUpOworICAgIEVibWxfRW5kU3ViRWxlbWVudChlYm1sX291dCwgdmlkZW9IZWFkTG9jKTsKKyAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbF9vdXQsIHRyYWNrSGVhZExvYyk7CisKK30KKwordm9pZCBNa3ZfV3JpdGVBdWRpb1RyYWNrKEVibWwmIGVibWxfb3V0LCBUcmFja1N0cnVjdCAmIHRyYWNrLCBBdWRpb1RyYWNrU3RydWN0JiB2aWRlbykKK3sKKyAgICBFYm1sTG9jIHRyYWNrSGVhZExvYywgYXVkaW9IZWFkTG9jOworICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGVibWxfb3V0LCB0cmFja0hlYWRMb2MsIDB4QUUpOworICAgIE1rdl9Xcml0ZUdlbmVyaWNUcmFja0RhdGEoZWJtbF9vdXQsIHRyYWNrKTsKKyAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sX291dCwgYXVkaW9IZWFkTG9jLCAweEUwKTsgIC8vc3RhcnQgQXVkaW8KKyAgICBFYm1sX1NlcmlhbGl6ZUZsb2F0KGVibWxfb3V0LCAweEI1LCB2aWRlby5TYW1wbGluZ0ZyZXF1ZW5jeSk7CisgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChlYm1sX291dCwgMHg5RiwgdmlkZW8uQ2hhbm5lbHMpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NjI2NCwgdmlkZW8uQml0RGVwdGgpOworICAgIEVibWxfRW5kU3ViRWxlbWVudChlYm1sX291dCwgYXVkaW9IZWFkTG9jKTsgLy8gZW5kIGF1ZGlvCisgICAgRWJtbF9FbmRTdWJFbGVtZW50KGVibWxfb3V0LCB0cmFja0hlYWRMb2MpOworfQorCit2b2lkIE1rdl9Xcml0ZUVibWxDbHVzdGVySGVhZChFYm1sJiBlYm1sX291dCwgIEVibWxMb2MmIGVibWxMb2MsIENsdXN0ZXJIZWFkU3RydWN0ICYgY2x1c3RlckhlYWQpCit7CisgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbF9vdXQsIGVibWxMb2MsIDB4MUY0M0I2NzUpOworICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbF9vdXQsIDB4NjI2NCwgY2x1c3RlckhlYWQuVGltZUNvZGUpOworfQorCit2b2lkIE1rdl9Xcml0ZVNpbXBsZUJsb2NrSGVhZChFYm1sJiBlYm1sX291dCwgIEVibWxMb2MmIGVibWxMb2MsIFNpbXBsZUJsb2NrU3RydWN0JiBibG9jaykKK3sKKyAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sX291dCwgZWJtbExvYywgMHhBMyk7CisgICAgRWJtbF9Xcml0ZTFVSW50KGVibWxfb3V0LCBibG9jay5UcmFja051bWJlcik7CisgICAgRWJtbF9Xcml0ZVNpZ25lZDE2KGVibWxfb3V0LGJsb2NrLlRpbWVDb2RlKTsKKyAgICB1bnNpZ25lZCBjaGFyIGZsYWdzID0gMHgwMCB8IChibG9jay5pc2tleSA/IDB4ODA6MHgwMCkgfCAoYmxvY2subGFjaW5nIDw8IDEpIHwgYmxvY2suZGlzY2FyZGFibGU7CisgICAgRWJtbF9Xcml0ZTFVSW50KGVibWxfb3V0LCBmbGFncyk7ICAvL1RPRE8gdGhpcyBtYXkgYmUgdGhlIHdyb25nIGZ1bmN0aW9uCisgICAgRWJtbF9TZXJpYWxpemUoZWJtbF9vdXQsIGJsb2NrLmRhdGEsIGJsb2NrLmRhdGFMZW5ndGgpOworICAgIEVibWxfRW5kU3ViRWxlbWVudChlYm1sX291dCxlYm1sTG9jKTsKK30KKyovCmRpZmYgLS1naXQgYS9saWJta3YvV2ViTUVsZW1lbnQuaCBiL2xpYnZweC9saWJta3YvV2ViTUVsZW1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlibWt2L1dlYk1FbGVtZW50LmgKcmVuYW1lIHRvIGxpYnZweC9saWJta3YvV2ViTUVsZW1lbnQuaApkaWZmIC0tZ2l0IGEvbGlibWt2L3Rlc3RsaWJta3YuYyBiL2xpYnZweC9saWJta3YvdGVzdGxpYm1rdi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJta3YvdGVzdGxpYm1rdi5jCnJlbmFtZSB0byBsaWJ2cHgvbGlibWt2L3Rlc3RsaWJta3YuYwpkaWZmIC0tZ2l0IGEvbGlicy5kb3h5X3RlbXBsYXRlIGIvbGlidnB4L2xpYnMuZG94eV90ZW1wbGF0ZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlicy5kb3h5X3RlbXBsYXRlCnJlbmFtZSB0byBsaWJ2cHgvbGlicy5kb3h5X3RlbXBsYXRlCmRpZmYgLS1naXQgYS9saWJ2cHgvbGlicy5tayBiL2xpYnZweC9saWJzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvbGlicy5tawpAQCAtMCwwICsxLDQ1NCBAQAorIyMKKyMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMKKyMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisjIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisjIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMjCisKKworIyBBUk0gYXNzZW1ibHkgZmlsZXMgYXJlIHdyaXR0ZW4gaW4gUlZDVC1zdHlsZS4gV2UgdXNlIHNvbWUgbWFrZSBtYWdpYyB0bworIyBmaWx0ZXIgdGhvc2UgZmlsZXMgdG8gYWxsb3cgR0NDIGNvbXBpbGF0aW9uCitpZmVxICgkKEFSQ0hfQVJNKSx5ZXMpCisgIEFTTTo9JChpZiAkKGZpbHRlciB5ZXMsJChDT05GSUdfR0NDKSksLmFzbS5zLC5hc20pCitlbHNlCisgIEFTTTo9LmFzbQorZW5kaWYKKworQ09ERUNfU1JDUy15ZXMgKz0gQ0hBTkdFTE9HCitDT0RFQ19TUkNTLXllcyArPSBsaWJzLm1rCisKKyMgSWYgdGhpcyBpcyBhIHVuaXZlcnNhbCAoZmF0KSBiaW5hcnksIHRoZW4gYWxsIHRoZSBzdWJhcmNoaXRlY3R1cmVzIGhhdmUKKyMgYWxyZWFkeSBiZWVuIGJ1aWx0IGFuZCBvdXIgam9iIGlzIHRvIHN0aXRjaCB0aGVtIHRvZ2V0aGVyLiBUaGUKKyMgQlVJTERfTElCVlBYIHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBiZSBidWlsZGluZworIyAoY29tcGlsaW5nLCBsaW5raW5nKSB0aGUgbGlicmFyeS4gVGhlIExJUE9fTElCVlBYIHZhcmlhYmxlIGluZGljYXRlcworIyB0aGF0IHdlJ3JlIHN0aXRjaGluZy4KKyQoZXZhbCAkKGlmICQoZmlsdGVyIHVuaXZlcnNhbCUsJChUT09MQ0hBSU4pKSxMSVBPX0xJQlZQWCxCVUlMRF9MSUJWUFgpOj15ZXMpCisKK2luY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS92cHgvdnB4X2NvZGVjLm1rCitDT0RFQ19TUkNTLXllcyArPSAkKGFkZHByZWZpeCB2cHgvLCQoY2FsbCBlbmFibGVkLEFQSV9TUkNTKSkKK0NPREVDX0RPQ19TUkNTICs9ICQoYWRkcHJlZml4IHZweC8sJChjYWxsIGVuYWJsZWQsQVBJX0RPQ19TUkNTKSkKKworaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpL3ZweF9tZW0vdnB4X21lbS5taworQ09ERUNfU1JDUy15ZXMgKz0gJChhZGRwcmVmaXggdnB4X21lbS8sJChjYWxsIGVuYWJsZWQsTUVNX1NSQ1MpKQorCitpbmNsdWRlICQoU1JDX1BBVEhfQkFSRSkvdnB4X3NjYWxlL3ZweF9zY2FsZS5taworQ09ERUNfU1JDUy15ZXMgKz0gJChhZGRwcmVmaXggdnB4X3NjYWxlLywkKGNhbGwgZW5hYmxlZCxTQ0FMRV9TUkNTKSkKKworaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpL3ZweF9wb3J0cy92cHhfcG9ydHMubWsKK0NPREVDX1NSQ1MteWVzICs9ICQoYWRkcHJlZml4IHZweF9wb3J0cy8sJChjYWxsIGVuYWJsZWQsUE9SVFNfU1JDUykpCisKKworaWZlcSAoJChDT05GSUdfVlA4X0VOQ09ERVIpLHllcykKKyAgVlA4X1BSRUZJWD12cDgvCisgIGluY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS8kKFZQOF9QUkVGSVgpdnA4Y3gubWsKKyAgQ09ERUNfU1JDUy15ZXMgKz0gJChhZGRwcmVmaXggJChWUDhfUFJFRklYKSwkKGNhbGwgZW5hYmxlZCxWUDhfQ1hfU1JDUykpCisgIENPREVDX0VYUE9SVFMteWVzICs9ICQoYWRkcHJlZml4ICQoVlA4X1BSRUZJWCksJChWUDhfQ1hfRVhQT1JUUykpCisgIElOU1RBTEwtTElCUy15ZXMgKz0gaW5jbHVkZS92cHgvdnA4LmggaW5jbHVkZS92cHgvdnA4Y3guaAorICBJTlNUQUxMX01BUFMgKz0gaW5jbHVkZS92cHgvJSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCkvJQorICBDT0RFQ19ET0NfU0VDVElPTlMgKz0gdnA4IHZwOF9lbmNvZGVyCitlbmRpZgorCitpZmVxICgkKENPTkZJR19WUDhfREVDT0RFUikseWVzKQorICBWUDhfUFJFRklYPXZwOC8KKyAgaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCl2cDhkeC5taworICBDT0RFQ19TUkNTLXllcyArPSAkKGFkZHByZWZpeCAkKFZQOF9QUkVGSVgpLCQoY2FsbCBlbmFibGVkLFZQOF9EWF9TUkNTKSkKKyAgQ09ERUNfRVhQT1JUUy15ZXMgKz0gJChhZGRwcmVmaXggJChWUDhfUFJFRklYKSwkKFZQOF9EWF9FWFBPUlRTKSkKKyAgSU5TVEFMTC1MSUJTLXllcyArPSBpbmNsdWRlL3ZweC92cDguaCBpbmNsdWRlL3ZweC92cDhkeC5oCisgIElOU1RBTExfTUFQUyArPSBpbmNsdWRlL3ZweC8lICQoU1JDX1BBVEhfQkFSRSkvJChWUDhfUFJFRklYKS8lCisgIENPREVDX0RPQ19TRUNUSU9OUyArPSB2cDggdnA4X2RlY29kZXIKK2VuZGlmCisKKworaWZlcSAoJChDT05GSUdfRU5DT0RFUlMpLHllcykKKyAgQ09ERUNfRE9DX1NFQ1RJT05TICs9IGVuY29kZXIKK2VuZGlmCitpZmVxICgkKENPTkZJR19ERUNPREVSUykseWVzKQorICBDT0RFQ19ET0NfU0VDVElPTlMgKz0gZGVjb2RlcgorZW5kaWYKKworCitpZmVxICgkKENPTkZJR19NU1ZTKSx5ZXMpCitDT0RFQ19MSUI9JChpZiAkKENPTkZJR19TVEFUSUNfTVNWQ1JUKSx2cHhtdCx2cHhtZCkKK0dURVNUX0xJQj0kKGlmICQoQ09ORklHX1NUQVRJQ19NU1ZDUlQpLGd0ZXN0bXQsZ3Rlc3RtZCkKKyMgVGhpcyB2YXJpYWJsZSB1c2VzIGRlZmVycmVkIGV4cGFuc2lvbiBpbnRlbnRpb25hbGx5LCBzaW5jZSB0aGUgcmVzdWx0cyBvZgorIyAkKHdpbGRjYXJkKSBtYXkgY2hhbmdlIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSBNYWtlLgorVlNfUExBVEZPUk1TID0gJChmb3JlYWNoIGQsJCh3aWxkY2FyZCAqL1JlbGVhc2UvJChDT0RFQ19MSUIpLmxpYiksJCh3b3JkIDEsJChzdWJzdCAvLCAsJChkKSkpKQorZW5kaWYKKworIyBUaGUgZm9sbG93aW5nIHBhaXJzIGRlZmluZSBhIG1hcHBpbmcgb2YgbG9jYXRpb25zIGluIHRoZSBkaXN0cmlidXRpb24KKyMgdHJlZSB0byBsb2NhdGlvbnMgaW4gdGhlIHNvdXJjZS9idWlsZCB0cmVlcy4KK0lOU1RBTExfTUFQUyArPSBpbmNsdWRlL3ZweC8lICQoU1JDX1BBVEhfQkFSRSkvdnB4LyUKK0lOU1RBTExfTUFQUyArPSBpbmNsdWRlL3ZweC8lICQoU1JDX1BBVEhfQkFSRSkvdnB4X3BvcnRzLyUKK0lOU1RBTExfTUFQUyArPSAkKExJQlNVQkRJUikvJSAgICAgJQorSU5TVEFMTF9NQVBTICs9IHNyYy8lICAgICAkKFNSQ19QQVRIX0JBUkUpLyUKK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKK0lOU1RBTExfTUFQUyArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChMSUJTVUJESVIpLyQocCkvJSAgJChwKS9SZWxlYXNlLyUpCitJTlNUQUxMX01BUFMgKz0gJChmb3JlYWNoIHAsJChWU19QTEFURk9STVMpLCQoTElCU1VCRElSKS8kKHApLyUgICQocCkvRGVidWcvJSkKK2VuZGlmCisKK0NPREVDX1NSQ1MtJChCVUlMRF9MSUJWUFgpICs9IGJ1aWxkL21ha2UvdmVyc2lvbi5zaAorQ09ERUNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gYnVpbGQvbWFrZS9ydGNkLnNoCitDT0RFQ19TUkNTLSQoQlVJTERfTElCVlBYKSArPSAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmMKK0lOU1RBTEwtU1JDUy1ubyArPSAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmMKK0NPREVDX0VYUE9SVFMtJChCVUlMRF9MSUJWUFgpICs9IHZweC9leHBvcnRzX2NvbQorQ09ERUNfRVhQT1JUUy0kKENPTkZJR19FTkNPREVSUykgKz0gdnB4L2V4cG9ydHNfZW5jCitDT0RFQ19FWFBPUlRTLSQoQ09ORklHX0RFQ09ERVJTKSArPSB2cHgvZXhwb3J0c19kZWMKKworSU5TVEFMTC1MSUJTLXllcyArPSBpbmNsdWRlL3ZweC92cHhfY29kZWMuaAorSU5TVEFMTC1MSUJTLXllcyArPSBpbmNsdWRlL3ZweC92cHhfaW1hZ2UuaAorSU5TVEFMTC1MSUJTLXllcyArPSBpbmNsdWRlL3ZweC92cHhfaW50ZWdlci5oCitJTlNUQUxMLUxJQlMteWVzICs9IGluY2x1ZGUvdnB4L3ZweF9jb2RlY19pbXBsX3RvcC5oCitJTlNUQUxMLUxJQlMteWVzICs9IGluY2x1ZGUvdnB4L3ZweF9jb2RlY19pbXBsX2JvdHRvbS5oCitJTlNUQUxMLUxJQlMtJChDT05GSUdfREVDT0RFUlMpICs9IGluY2x1ZGUvdnB4L3ZweF9kZWNvZGVyLmgKK0lOU1RBTEwtTElCUy0kKENPTkZJR19FTkNPREVSUykgKz0gaW5jbHVkZS92cHgvdnB4X2VuY29kZXIuaAoraWZlcSAoJChDT05GSUdfRVhURVJOQUxfQlVJTEQpLHllcykKK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKK0lOU1RBTEwtTElCUy15ZXMgICAgICAgICAgICAgICAgICArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChMSUJTVUJESVIpLyQocCkvJChDT0RFQ19MSUIpLmxpYikKK0lOU1RBTEwtTElCUy0kKENPTkZJR19ERUJVR19MSUJTKSArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChMSUJTVUJESVIpLyQocCkvJChDT0RFQ19MSUIpZC5saWIpCitJTlNUQUxMLUxJQlMtJChDT05GSUdfU0hBUkVEKSArPSAkKGZvcmVhY2ggcCwkKFZTX1BMQVRGT1JNUyksJChMSUJTVUJESVIpLyQocCkvdnB4LmRsbCkKK0lOU1RBTEwtTElCUy0kKENPTkZJR19TSEFSRUQpICs9ICQoZm9yZWFjaCBwLCQoVlNfUExBVEZPUk1TKSwkKExJQlNVQkRJUikvJChwKS92cHguZXhwKQorZW5kaWYKK2Vsc2UKK0lOU1RBTEwtTElCUy0kKENPTkZJR19TVEFUSUMpICs9ICQoTElCU1VCRElSKS9saWJ2cHguYQorSU5TVEFMTC1MSUJTLSQoQ09ORklHX0RFQlVHX0xJQlMpICs9ICQoTElCU1VCRElSKS9saWJ2cHhfZy5hCitlbmRpZgorCitDT0RFQ19TUkNTPSQoZmlsdGVyLW91dCAlX3Rlc3QuY2MsJChjYWxsIGVuYWJsZWQsQ09ERUNfU1JDUykpCitJTlNUQUxMLVNSQ1MtJChDT05GSUdfQ09ERUNfU1JDUykgKz0gJChDT0RFQ19TUkNTKQorSU5TVEFMTC1TUkNTLSQoQ09ORklHX0NPREVDX1NSQ1MpICs9ICQoY2FsbCBlbmFibGVkLENPREVDX0VYUE9SVFMpCisKKworIyBHZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGVuYWJsZWQgc291cmNlcywgaW4gcGFydGljdWxhciBmb3IgZXhwb3J0aW5nIHRvIGd5cAorIyBiYXNlZCBidWlsZCBzeXN0ZW1zLgorbGlidnB4X3NyY3MudHh0OgorCUBlY2hvICIgICAgW0NSRUFURV0gJEAiCisJQGVjaG8gJChDT0RFQ19TUkNTKSB8IHhhcmdzIC1uMSBlY2hvIHwgc29ydCAtdSA+ICRACisKKworaWZlcSAoJChDT05GSUdfRVhURVJOQUxfQlVJTEQpLHllcykKK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKKworb2JqX2ludF9leHRyYWN0LnZjcHJvajogJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL29ial9pbnRfZXh0cmFjdC5jCisJQGNwICQoU1JDX1BBVEhfQkFSRSkvYnVpbGQveDg2LW1zdnMvb2JqX2ludF9leHRyYWN0LmJhdCAuCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKSQoU1JDX1BBVEhfQkFSRSkvYnVpbGQvbWFrZS9nZW5fbXN2c19wcm9qLnNoIFwKKyAgICAtLWV4ZSBcCisgICAgLS10YXJnZXQ9JChUT09MQ0hBSU4pIFwKKyAgICAtLW5hbWU9b2JqX2ludF9leHRyYWN0IFwKKyAgICAtLXZlcj0kKENPTkZJR19WU19WRVJTSU9OKSBcCisgICAgLS1wcm9qLWd1aWQ9RTEzNjBDNjUtRDM3NS00MzM1LTgwNTctN0VEOTlDQzNGOUIyIFwKKyAgICAkKGlmICQoQ09ORklHX1NUQVRJQ19NU1ZDUlQpLC0tc3RhdGljLWNydCkgXAorICAgIC0tb3V0PSRAICReIFwKKyAgICAtSS4gXAorICAgIC1JIiQoU1JDX1BBVEhfQkFSRSkiIFwKKworUFJPSkVDVFMtJChCVUlMRF9MSUJWUFgpICs9IG9ial9pbnRfZXh0cmFjdC52Y3Byb2oKK1BST0pFQ1RTLSQoQlVJTERfTElCVlBYKSArPSBvYmpfaW50X2V4dHJhY3QuYmF0CisKK3ZweC5kZWY6ICQoY2FsbCBlbmFibGVkLENPREVDX0VYUE9SVFMpCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKSQoU1JDX1BBVEhfQkFSRSkvYnVpbGQvbWFrZS9nZW5fbXN2c19kZWYuc2hcCisgICAgICAgICAgICAtLW5hbWU9dnB4XAorICAgICAgICAgICAgLS1vdXQ9JEAgJF4KK0NMRUFOLU9CSlMgKz0gdnB4LmRlZgorCit2cHgudmNwcm9qOiAkKENPREVDX1NSQ1MpIHZweC5kZWYKKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCSQocWV4ZWMpJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL2dlbl9tc3ZzX3Byb2ouc2ggXAorCQkJLS1saWIgXAorCQkJLS10YXJnZXQ9JChUT09MQ0hBSU4pIFwKKyAgICAgICAgICAgICQoaWYgJChDT05GSUdfU1RBVElDX01TVkNSVCksLS1zdGF0aWMtY3J0KSBcCisgICAgICAgICAgICAtLW5hbWU9dnB4IFwKKyAgICAgICAgICAgIC0tcHJvai1ndWlkPURDRTE5REFGLTY5QUMtNDZEQi1CMTRBLTM5RjBGQUE1REI3NCBcCisgICAgICAgICAgICAtLW1vZHVsZS1kZWY9dnB4LmRlZiBcCisgICAgICAgICAgICAtLXZlcj0kKENPTkZJR19WU19WRVJTSU9OKSBcCisgICAgICAgICAgICAtLW91dD0kQCAkKENGTEFHUykgJF4gXAorICAgICAgICAgICAgLS1zcmMtcGF0aC1iYXJlPSIkKFNSQ19QQVRIX0JBUkUpIiBcCisKK1BST0pFQ1RTLSQoQlVJTERfTElCVlBYKSArPSB2cHgudmNwcm9qCisKK3ZweC52Y3Byb2o6IHZweF9jb25maWcuYXNtCit2cHgudmNwcm9qOiB2cHhfcnRjZC5oCisKK2VuZGlmCitlbHNlCitMSUJWUFhfT0JKUz0kKGNhbGwgb2JqcywkKENPREVDX1NSQ1MpKQorT0JKUy0kKEJVSUxEX0xJQlZQWCkgKz0gJChMSUJWUFhfT0JKUykKK0xJQlMtJChpZiAkKEJVSUxEX0xJQlZQWCksJChDT05GSUdfU1RBVElDKSkgKz0gJChCVUlMRF9QRlgpbGlidnB4LmEgJChCVUlMRF9QRlgpbGlidnB4X2cuYQorJChCVUlMRF9QRlgpbGlidnB4X2cuYTogJChMSUJWUFhfT0JKUykKKworQlVJTERfTElCVlBYX1NPICAgICAgICAgOj0gJChpZiAkKEJVSUxEX0xJQlZQWCksJChDT05GSUdfU0hBUkVEKSkKK0xJQlZQWF9TTyAgICAgICAgICAgICAgIDo9IGxpYnZweC5zby4kKFZFUlNJT05fTUFKT1IpLiQoVkVSU0lPTl9NSU5PUikuJChWRVJTSU9OX1BBVENIKQorTElCUy0kKEJVSUxEX0xJQlZQWF9TTykgKz0gJChCVUlMRF9QRlgpJChMSUJWUFhfU08pXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJChub3RkaXIgJChMSUJWUFhfU09fU1lNTElOS1MpKQorJChCVUlMRF9QRlgpJChMSUJWUFhfU08pOiAkKExJQlZQWF9PQkpTKSBsaWJ2cHgudmVyCiskKEJVSUxEX1BGWCkkKExJQlZQWF9TTyk6IGV4dHJhbGlicyArPSAtbG0KKyQoQlVJTERfUEZYKSQoTElCVlBYX1NPKTogU09OQU1FID0gbGlidnB4LnNvLiQoVkVSU0lPTl9NQUpPUikKKyQoQlVJTERfUEZYKSQoTElCVlBYX1NPKTogU09fVkVSU0lPTl9TQ1JJUFQgPSBsaWJ2cHgudmVyCitMSUJWUFhfU09fU1lNTElOS1MgICAgICA6PSAkKGFkZHByZWZpeCAkKExJQlNVQkRJUikvLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnZweC5zbyBsaWJ2cHguc28uJChWRVJTSU9OX01BSk9SKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnZweC5zby4kKFZFUlNJT05fTUFKT1IpLiQoVkVSU0lPTl9NSU5PUikpCisKK2xpYnZweC52ZXI6ICQoY2FsbCBlbmFibGVkLENPREVDX0VYUE9SVFMpCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKWVjaG8gInsgZ2xvYmFsOiIgPiAkQAorCSQocWV4ZWMpZm9yIGYgaW4gJD87IGRvIGF3ayAne3ByaW50ICQkMiI7In0nIDwgJCRmID4+JEA7IGRvbmUKKwkkKHFleGVjKWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJEAKK0NMRUFOLU9CSlMgKz0gbGlidnB4LnZlcgorCitkZWZpbmUgbGlidnB4X3N5bWxpbmtfdGVtcGxhdGUKKyQoMSk6ICQoMikKKwlAZWNobyAiICAgIFtMTl0gICAgICAkJEAiCisJJChxZXhlYylsbiAtc2YgJChMSUJWUFhfU08pICQkQAorZW5kZWYKKworJChldmFsICQoY2FsbCBsaWJ2cHhfc3ltbGlua190ZW1wbGF0ZSxcCisgICAgJChhZGRwcmVmaXggJChCVUlMRF9QRlgpLCQobm90ZGlyICQoTElCVlBYX1NPX1NZTUxJTktTKSkpLFwKKyAgICAkKEJVSUxEX1BGWCkkKExJQlZQWF9TTykpKQorJChldmFsICQoY2FsbCBsaWJ2cHhfc3ltbGlua190ZW1wbGF0ZSxcCisgICAgJChhZGRwcmVmaXggJChESVNUX0RJUikvLCQoTElCVlBYX1NPX1NZTUxJTktTKSksXAorICAgICQoRElTVF9ESVIpLyQoTElCU1VCRElSKS8kKExJQlZQWF9TTykpKQorCitJTlNUQUxMLUxJQlMtJChDT05GSUdfU0hBUkVEKSArPSAkKExJQlZQWF9TT19TWU1MSU5LUykKK0lOU1RBTEwtTElCUy0kKENPTkZJR19TSEFSRUQpICs9ICQoTElCU1VCRElSKS8kKExJQlZQWF9TTykKKworTElCUy0kKEJVSUxEX0xJQlZQWCkgKz0gdnB4LnBjCit2cHgucGM6IGNvbmZpZy5tayBsaWJzLm1rCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKWVjaG8gJyMgcGtnLWNvbmZpZyBmaWxlIGZyb20gbGlidnB4ICQoVkVSU0lPTl9TVFJJTkcpJyA+ICRACisJJChxZXhlYyllY2hvICdwcmVmaXg9JChQUkVGSVgpJyA+PiAkQAorCSQocWV4ZWMpZWNobyAnZXhlY19wcmVmaXg9JCR7cHJlZml4fScgPj4gJEAKKwkkKHFleGVjKWVjaG8gJ2xpYmRpcj0kJHtwcmVmaXh9LyQoTElCU1VCRElSKScgPj4gJEAKKwkkKHFleGVjKWVjaG8gJ2luY2x1ZGVkaXI9JCR7cHJlZml4fS9pbmNsdWRlJyA+PiAkQAorCSQocWV4ZWMpZWNobyAnJyA+PiAkQAorCSQocWV4ZWMpZWNobyAnTmFtZTogdnB4JyA+PiAkQAorCSQocWV4ZWMpZWNobyAnRGVzY3JpcHRpb246IFdlYk0gUHJvamVjdCBWUHggY29kZWMgaW1wbGVtZW50YXRpb24nID4+ICRACisJJChxZXhlYyllY2hvICdWZXJzaW9uOiAkKFZFUlNJT05fTUFKT1IpLiQoVkVSU0lPTl9NSU5PUikuJChWRVJTSU9OX1BBVENIKScgPj4gJEAKKwkkKHFleGVjKWVjaG8gJ1JlcXVpcmVzOicgPj4gJEAKKwkkKHFleGVjKWVjaG8gJ0NvbmZsaWN0czonID4+ICRACisJJChxZXhlYyllY2hvICdMaWJzOiAtTCQke2xpYmRpcn0gLWx2cHgnID4+ICRACisJJChxZXhlYyllY2hvICdMaWJzLnByaXZhdGU6IC1sbSAtbHB0aHJlYWQnID4+ICRACisJJChxZXhlYyllY2hvICdDZmxhZ3M6IC1JJCR7aW5jbHVkZWRpcn0nID4+ICRACitJTlNUQUxMLUxJQlMteWVzICs9ICQoTElCU1VCRElSKS9wa2djb25maWcvdnB4LnBjCitJTlNUQUxMX01BUFMgKz0gJChMSUJTVUJESVIpL3BrZ2NvbmZpZy8lLnBjICUucGMKK0NMRUFOLU9CSlMgKz0gdnB4LnBjCitlbmRpZgorCitMSUJTLSQoTElQT19MSUJWUFgpICs9IGxpYnZweC5hCiskKGV2YWwgJChpZiAkKExJUE9fTElCVlBYKSwkKGNhbGwgbGlwb19saWJfdGVtcGxhdGUsbGlidnB4LmEpKSkKKworIworIyBSdWxlIHRvIG1ha2UgYXNzZW1ibGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmcm9tIEMgY29uZmlndXJhdGlvbiBmaWxlCisjCitpZmVxICgkKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpLHllcykKKyMgWUFTTQorJChCVUlMRF9QRlgpdnB4X2NvbmZpZy5hc206ICQoQlVJTERfUEZYKXZweF9jb25maWcuaAorCUBlY2hvICIgICAgW0NSRUFURV0gJEAiCisJQGVncmVwICIjZGVmaW5lIFtBLVowLTlfXSsgWzAxXSIgJDwgXAorCSAgICB8IGF3ayAne3ByaW50ICQkMiAiIGVxdSAiICQkM30nID4gJEAKK2Vsc2UKK0FEUzJHQVM9JChpZiAkKGZpbHRlciB5ZXMsJChDT05GSUdfR0NDKSksfCAkKEFTTV9DT05WRVJTSU9OKSkKKyQoQlVJTERfUEZYKXZweF9jb25maWcuYXNtOiAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmgKKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCUBlZ3JlcCAiI2RlZmluZSBbQS1aMC05X10rIFswMV0iICQ8IFwKKwkgICAgfCBhd2sgJ3twcmludCAkJDIgIiBFUVUgIiAkJDN9JyAkKEFEUzJHQVMpID4gJEAKKwlAZWNobyAiICAgICAgICBFTkQiICQoQURTMkdBUykgPj4gJEAKK0NMRUFOLU9CSlMgKz0gJChCVUlMRF9QRlgpdnB4X2NvbmZpZy5hc20KK2VuZGlmCisKKyMKKyMgQWRkIGFzc2VtYmxlciBkZXBlbmRlbmNpZXMgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIG9mZnNldHMKKyMKKyQoZmlsdGVyICUucy5vLCQoT0JKUy15ZXMpKTogICAgICQoQlVJTERfUEZYKXZweF9jb25maWcuYXNtCiskKGZpbHRlciAlJChBU00pLm8sJChPQkpTLXllcykpOiAkKEJVSUxEX1BGWCl2cHhfY29uZmlnLmFzbQorCisjCisjIENhbGN1bGF0ZSBwbGF0Zm9ybS0gYW5kIGNvbXBpbGVyLXNwZWNpZmljIG9mZnNldHMgZm9yIGhhbmQgY29kZWQgYXNzZW1ibHkKKyMKKworT0ZGU0VUX1BBVFRFUk46PSdeW2EtekEtWjAtOV9dKiBFUVUnCisKK2lmZXEgKCQoZmlsdGVyIGljYyBnY2MsJChUR1RfQ0MpKSwgJChUR1RfQ0MpKQorICAgICQoQlVJTERfUEZYKWFzbV9jb21fb2Zmc2V0cy5hc206ICQoQlVJTERfUEZYKSQoVlA4X1BSRUZJWCljb21tb24vYXNtX2NvbV9vZmZzZXRzLmMuUworCUBlY2hvICIgICAgW0NSRUFURV0gJEAiCisJJChxZXhlYylMQ19BTEw9QyBncmVwICQoT0ZGU0VUX1BBVFRFUk4pICQ8IHwgdHIgLWQgJyQkXCMnICQoQURTMkdBUykgPiAkQAorICAgICQoQlVJTERfUEZYKSQoVlA4X1BSRUZJWCljb21tb24vYXNtX2NvbV9vZmZzZXRzLmMuUzogJChWUDhfUFJFRklYKWNvbW1vbi9hc21fY29tX29mZnNldHMuYworICAgIENMRUFOLU9CSlMgKz0gJChCVUlMRF9QRlgpYXNtX2NvbV9vZmZzZXRzLmFzbSAkKEJVSUxEX1BGWCkkKFZQOF9QUkVGSVgpY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jLlMKKworICAgICQoQlVJTERfUEZYKWFzbV9lbmNfb2Zmc2V0cy5hc206ICQoQlVJTERfUEZYKSQoVlA4X1BSRUZJWCllbmNvZGVyL2FzbV9lbmNfb2Zmc2V0cy5jLlMKKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCSQocWV4ZWMpTENfQUxMPUMgZ3JlcCAkKE9GRlNFVF9QQVRURVJOKSAkPCB8IHRyIC1kICckJFwjJyAkKEFEUzJHQVMpID4gJEAKKyAgICAkKEJVSUxEX1BGWCkkKFZQOF9QUkVGSVgpZW5jb2Rlci9hc21fZW5jX29mZnNldHMuYy5TOiAkKFZQOF9QUkVGSVgpZW5jb2Rlci9hc21fZW5jX29mZnNldHMuYworICAgIENMRUFOLU9CSlMgKz0gJChCVUlMRF9QRlgpYXNtX2VuY19vZmZzZXRzLmFzbSAkKEJVSUxEX1BGWCkkKFZQOF9QUkVGSVgpZW5jb2Rlci9hc21fZW5jX29mZnNldHMuYy5TCisKKyAgICAkKEJVSUxEX1BGWClhc21fZGVjX29mZnNldHMuYXNtOiAkKEJVSUxEX1BGWCkkKFZQOF9QUkVGSVgpZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYy5TCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKUxDX0FMTD1DIGdyZXAgJChPRkZTRVRfUEFUVEVSTikgJDwgfCB0ciAtZCAnJCRcIycgJChBRFMyR0FTKSA+ICRACisgICAgJChCVUlMRF9QRlgpJChWUDhfUFJFRklYKWRlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMuUzogJChWUDhfUFJFRklYKWRlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMKKyAgICBDTEVBTi1PQkpTICs9ICQoQlVJTERfUEZYKWFzbV9kZWNfb2Zmc2V0cy5hc20gJChCVUlMRF9QRlgpJChWUDhfUFJFRklYKWRlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMuUworZWxzZQorICBpZmVxICgkKGZpbHRlciBydmN0LCQoVEdUX0NDKSksICQoVEdUX0NDKSkKKyAgICBhc21fY29tX29mZnNldHMuYXNtOiBvYmpfaW50X2V4dHJhY3QKKyAgICBhc21fY29tX29mZnNldHMuYXNtOiAkKFZQOF9QUkVGSVgpY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jLm8KKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCSQocWV4ZWMpLi9vYmpfaW50X2V4dHJhY3QgcnZkcyAkPCAkKEFEUzJHQVMpID4gJEAKKyAgICBPQkpTLXllcyArPSAkKFZQOF9QUkVGSVgpY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jLm8KKyAgICBDTEVBTi1PQkpTICs9IGFzbV9jb21fb2Zmc2V0cy5hc20KKyAgICAkKGZpbHRlciAlJChBU00pLm8sJChPQkpTLXllcykpOiAkKEJVSUxEX1BGWClhc21fY29tX29mZnNldHMuYXNtCisKKyAgICBhc21fZW5jX29mZnNldHMuYXNtOiBvYmpfaW50X2V4dHJhY3QKKyAgICBhc21fZW5jX29mZnNldHMuYXNtOiAkKFZQOF9QUkVGSVgpZW5jb2Rlci9hc21fZW5jX29mZnNldHMuYy5vCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKS4vb2JqX2ludF9leHRyYWN0IHJ2ZHMgJDwgJChBRFMyR0FTKSA+ICRACisgICAgT0JKUy15ZXMgKz0gJChWUDhfUFJFRklYKWVuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMubworICAgIENMRUFOLU9CSlMgKz0gYXNtX2VuY19vZmZzZXRzLmFzbQorICAgICQoZmlsdGVyICUkKEFTTSkubywkKE9CSlMteWVzKSk6ICQoQlVJTERfUEZYKWFzbV9lbmNfb2Zmc2V0cy5hc20KKworICAgIGFzbV9kZWNfb2Zmc2V0cy5hc206IG9ial9pbnRfZXh0cmFjdAorICAgIGFzbV9kZWNfb2Zmc2V0cy5hc206ICQoVlA4X1BSRUZJWClkZWNvZGVyL2FzbV9kZWNfb2Zmc2V0cy5jLm8KKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCSQocWV4ZWMpLi9vYmpfaW50X2V4dHJhY3QgcnZkcyAkPCAkKEFEUzJHQVMpID4gJEAKKyAgICBPQkpTLXllcyArPSAkKFZQOF9QUkVGSVgpZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYy5vCisgICAgQ0xFQU4tT0JKUyArPSBhc21fZGVjX29mZnNldHMuYXNtCisgICAgJChmaWx0ZXIgJSQoQVNNKS5vLCQoT0JKUy15ZXMpKTogJChCVUlMRF9QRlgpYXNtX2RlY19vZmZzZXRzLmFzbQorICBlbmRpZgorZW5kaWYKKworJChzaGVsbCAkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2UvdmVyc2lvbi5zaCAiJChTUkNfUEFUSF9CQVJFKSIgJChCVUlMRF9QRlgpdnB4X3ZlcnNpb24uaCkKK0NMRUFOLU9CSlMgKz0gJChCVUlMRF9QRlgpdnB4X3ZlcnNpb24uaAorCisjCisjIFJ1bGUgdG8gZ2VuZXJhdGUgcnVudGltZSBjcHUgZGV0ZWN0aW9uIGZpbGVzCisjCiskKEJVSUxEX1BGWCl2cHhfcnRjZC5oOiAkKFNSQ19QQVRIX0JBUkUpLyQoc29ydCAkKGZpbHRlciAlcnRjZF9kZWZzLnNoLCQoQ09ERUNfU1JDUykpKQorCUBlY2hvICIgICAgW0NSRUFURV0gJEAiCisJJChxZXhlYykkKFNSQ19QQVRIX0JBUkUpL2J1aWxkL21ha2UvcnRjZC5zaCAtLWFyY2g9JChUR1RfSVNBKSBcCisgICAgICAgICAgLS1zeW09dnB4X3J0Y2QgXAorICAgICAgICAgIC0tY29uZmlnPSQodGFyZ2V0KSQoaWYgJChGQVRfQVJDSFMpLCwtJChUT09MQ0hBSU4pKS5tayBcCisgICAgICAgICAgJChSVENEX09QVElPTlMpICReID4gJEAKK0NMRUFOLU9CSlMgKz0gJChCVUlMRF9QRlgpdnB4X3J0Y2QuaAorCisjIworIyMgbGlidnB4IHRlc3QgZGlyZWN0aXZlcworIyMKK2lmZXEgKCQoQ09ORklHX1VOSVRfVEVTVFMpLHllcykKK0xJQlZQWF9URVNUX0RBVEFfUEFUSCA/PSAuCisKK2luY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS90ZXN0L3Rlc3QubWsKK0xJQlZQWF9URVNUX1NSQ1M9JChhZGRwcmVmaXggdGVzdC8sJChjYWxsIGVuYWJsZWQsTElCVlBYX1RFU1RfU1JDUykpCitMSUJWUFhfVEVTVF9CSU5TPS4vdGVzdF9saWJ2cHgKK0xJQlZQWF9URVNUX0RBVEE9JChhZGRwcmVmaXggJChMSUJWUFhfVEVTVF9EQVRBX1BBVEgpLyxcCisgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZW5hYmxlZCxMSUJWUFhfVEVTVF9EQVRBKSkKK2xpYnZweF90ZXN0X2RhdGFfdXJsPWh0dHA6Ly9kb3dubG9hZHMud2VibXByb2plY3Qub3JnL3Rlc3RfZGF0YS9saWJ2cHgvJCgxKQorCiskKExJQlZQWF9URVNUX0RBVEEpOgorCUBlY2hvICIgICAgW0RPV05MT0FEXSAkQCIKKwkkKHFleGVjKXRyYXAgJ3JtIC1mICRAJyBJTlQgVEVSTSAmJlwKKyAgICAgICAgICAgIGN1cmwgLUwgLW8gJEAgJChjYWxsIGxpYnZweF90ZXN0X2RhdGFfdXJsLCQoQEYpKQorCit0ZXN0ZGF0YTo6ICQoTElCVlBYX1RFU1RfREFUQSkKKwkkKHFleGVjKWlmIFsgLXggIiQkKHdoaWNoIHNoYTFzdW0pIiBdOyB0aGVuXAorICAgICAgICAgICAgZWNobyAiQ2hlY2tpbmcgdGVzdCBkYXRhOiI7XAorICAgICAgICAgICAgaWYgWyAtbiAiJChMSUJWUFhfVEVTVF9EQVRBKSIgXTsgdGhlblwKKyAgICAgICAgICAgICAgICBmb3IgZiBpbiAkKGNhbGwgZW5hYmxlZCxMSUJWUFhfVEVTVF9EQVRBKTsgZG9cCisgICAgICAgICAgICAgICAgICAgIGdyZXAgJCRmICQoU1JDX1BBVEhfQkFSRSkvdGVzdC90ZXN0LWRhdGEuc2hhMSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgKGNkICQoTElCVlBYX1RFU1RfREFUQV9QQVRIKTsgc2hhMXN1bSAtYyk7XAorICAgICAgICAgICAgICAgIGRvbmU7IFwKKyAgICAgICAgICAgIGZpOyBcCisgICAgICAgIGVsc2VcCisgICAgICAgICAgICBlY2hvICJTa2lwcGluZyB0ZXN0IGRhdGEgaW50ZWdyaXR5IGNoZWNrLCBzaGExc3VtIG5vdCBmb3VuZC4iO1wKKyAgICAgICAgZmkKKworaWZlcSAoJChDT05GSUdfRVhURVJOQUxfQlVJTEQpLHllcykKK2lmZXEgKCQoQ09ORklHX01TVlMpLHllcykKKworZ3Rlc3QudmNwcm9qOiAkKFNSQ19QQVRIX0JBUkUpL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1hbGwuY2MKKwlAZWNobyAiICAgIFtDUkVBVEVdICRAIgorCSQocWV4ZWMpJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL2dlbl9tc3ZzX3Byb2ouc2ggXAorICAgICAgICAgICAgLS1saWIgXAorICAgICAgICAgICAgLS10YXJnZXQ9JChUT09MQ0hBSU4pIFwKKyAgICAgICAgICAgICQoaWYgJChDT05GSUdfU1RBVElDX01TVkNSVCksLS1zdGF0aWMtY3J0KSBcCisgICAgICAgICAgICAtLW5hbWU9Z3Rlc3QgXAorICAgICAgICAgICAgLS1wcm9qLWd1aWQ9RUMwMEUxRUMtQUY2OC00RDkyLUEyNTUtMTgxNjkwRDFDOUIxIFwKKyAgICAgICAgICAgIC0tdmVyPSQoQ09ORklHX1ZTX1ZFUlNJT04pIFwKKyAgICAgICAgICAgIC0tc3JjLXBhdGgtYmFyZT0iJChTUkNfUEFUSF9CQVJFKSIgXAorICAgICAgICAgICAgLS1vdXQ9Z3Rlc3QudmNwcm9qICQoU1JDX1BBVEhfQkFSRSkvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LWFsbC5jYyBcCisgICAgICAgICAgICAtSS4gLUkiJChTUkNfUEFUSF9CQVJFKS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlIiAtSSIkKFNSQ19QQVRIX0JBUkUpL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjIgorCitQUk9KRUNUUy0kKENPTkZJR19NU1ZTKSArPSBndGVzdC52Y3Byb2oKKwordGVzdF9saWJ2cHgudmNwcm9qOiAkKExJQlZQWF9URVNUX1NSQ1MpCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwkkKHFleGVjKSQoU1JDX1BBVEhfQkFSRSkvYnVpbGQvbWFrZS9nZW5fbXN2c19wcm9qLnNoIFwKKyAgICAgICAgICAgIC0tZXhlIFwKKyAgICAgICAgICAgIC0tdGFyZ2V0PSQoVE9PTENIQUlOKSBcCisgICAgICAgICAgICAtLW5hbWU9dGVzdF9saWJ2cHggXAorICAgICAgICAgICAgLS1wcm9qLWd1aWQ9Q0Q4MzdGNUYtNTJEOC00MzE0LUEzNzAtODk1RDYxNDE2NkE3IFwKKyAgICAgICAgICAgIC0tdmVyPSQoQ09ORklHX1ZTX1ZFUlNJT04pIFwKKyAgICAgICAgICAgICQoaWYgJChDT05GSUdfU1RBVElDX01TVkNSVCksLS1zdGF0aWMtY3J0KSBcCisgICAgICAgICAgICAtLW91dD0kQCAkKElOVEVSTkFMX0NGTEFHUykgJChDRkxBR1MpIFwKKyAgICAgICAgICAgIC1JLiAtSSIkKFNSQ19QQVRIX0JBUkUpL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUiIFwKKyAgICAgICAgICAgIC1MLiAtbCQoQ09ERUNfTElCKSAtbHdpbm1tIC1sJChHVEVTVF9MSUIpICReCisKK1BST0pFQ1RTLSQoQ09ORklHX01TVlMpICs9IHRlc3RfbGlidnB4LnZjcHJvagorCit0ZXN0OjogdGVzdGRhdGEKKwlAc2V0IC1lOyBmb3IgdCBpbiAkKGFkZHByZWZpeCBXaW4zMi9SZWxlYXNlLywkKG5vdGRpciAkKExJQlZQWF9URVNUX0JJTlM6LmNjPS5leGUpKSk7IGRvICQkdDsgZG9uZQorZW5kaWYKK2Vsc2UKKworaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ3Rlc3QubWsKK0dURVNUX1NSQ1MgOj0gJChhZGRwcmVmaXggdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvLCQoY2FsbCBlbmFibGVkLEdURVNUX1NSQ1MpKQorR1RFU1RfT0JKUz0kKGNhbGwgb2JqcywkKEdURVNUX1NSQ1MpKQorJChHVEVTVF9PQkpTKSAkKEdURVNUX09CSlM6Lm89LmQpOiBDWFhGTEFHUyArPSAtSSQoU1JDX1BBVEhfQkFSRSkvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMKKyQoR1RFU1RfT0JKUykgJChHVEVTVF9PQkpTOi5vPS5kKTogQ1hYRkxBR1MgKz0gLUkkKFNSQ19QQVRIX0JBUkUpL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUKK09CSlMtJChCVUlMRF9MSUJWUFgpICs9ICQoR1RFU1RfT0JKUykKK0xJQlMtJChCVUlMRF9MSUJWUFgpICs9ICQoQlVJTERfUEZYKWxpYmd0ZXN0LmEgJChCVUlMRF9QRlgpbGliZ3Rlc3RfZy5hCiskKEJVSUxEX1BGWClsaWJndGVzdF9nLmE6ICQoR1RFU1RfT0JKUykKKworTElCVlBYX1RFU1RfT0JKUz0kKHNvcnQgJChjYWxsIG9ianMsJChMSUJWUFhfVEVTVF9TUkNTKSkpCiskKExJQlZQWF9URVNUX09CSlMpICQoTElCVlBYX1RFU1RfT0JKUzoubz0uZCk6IENYWEZMQUdTICs9IC1JJChTUkNfUEFUSF9CQVJFKS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYworJChMSUJWUFhfVEVTVF9PQkpTKSAkKExJQlZQWF9URVNUX09CSlM6Lm89LmQpOiBDWFhGTEFHUyArPSAtSSQoU1JDX1BBVEhfQkFSRSkvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZQorT0JKUy0kKEJVSUxEX0xJQlZQWCkgKz0gJChMSUJWUFhfVEVTVF9PQkpTKQorQklOUy0kKEJVSUxEX0xJQlZQWCkgKz0gJChMSUJWUFhfVEVTVF9CSU5TKQorCisjIEluc3RhbGwgdGVzdCBzb3VyY2VzIG9ubHkgaWYgY29kZWMgc291cmNlIGlzIGluY2x1ZGVkCitJTlNUQUxMLVNSQ1MtJChDT05GSUdfQ09ERUNfU1JDUykgKz0gJChwYXRzdWJzdCAkKFNSQ19QQVRIX0JBUkUpLyUsJSxcCisgICAgJChzaGVsbCBmaW5kICQoU1JDX1BBVEhfQkFSRSkvdGhpcmRfcGFydHkvZ29vZ2xldGVzdCAtdHlwZSBmKSkKK0lOU1RBTEwtU1JDUy0kKENPTkZJR19DT0RFQ19TUkNTKSArPSAkKExJQlZQWF9URVNUX1NSQ1MpCisKK0NPREVDX0xJQj0kKGlmICQoQ09ORklHX0RFQlVHX0xJQlMpLHZweF9nLHZweCkKK0NPREVDX0xJQl9TVUY9JChpZiAkKENPTkZJR19TSEFSRUQpLC5zbywuYSkKKyQoZm9yZWFjaCBiaW4sJChMSUJWUFhfVEVTVF9CSU5TKSxcCisgICAgJChpZiAkKEJVSUxEX0xJQlZQWCksJChldmFsICQoYmluKTogXAorICAgICAgICBsaWIkKENPREVDX0xJQikkKENPREVDX0xJQl9TVUYpIGxpYmd0ZXN0LmEgKSlcCisgICAgJChpZiAkKEJVSUxEX0xJQlZQWCksJChldmFsICQoY2FsbCBsaW5rZXJ4eF90ZW1wbGF0ZSwkKGJpbiksXAorICAgICAgICAkKExJQlZQWF9URVNUX09CSlMpIFwKKyAgICAgICAgLUwuIC1sdnB4IC1sZ3Rlc3QgLWxwdGhyZWFkIC1sbSlcCisgICAgICAgICkpKVwKKyAgICAkKGlmICQoTElQT19MSUJTKSwkKGV2YWwgJChjYWxsIGxpcG9fYmluX3RlbXBsYXRlLCQoYmluKSkpKVwKKwordGVzdDo6ICQoTElCVlBYX1RFU1RfQklOUykgdGVzdGRhdGEKKwlAc2V0IC1lOyBmb3IgdCBpbiAkKExJQlZQWF9URVNUX0JJTlMpOyBkbyAkJHQ7IGRvbmUKKworZW5kaWYKK2VuZGlmCisKKyMjCisjIyBkb2N1bWVudGF0aW9uIGRpcmVjdGl2ZXMKKyMjCitDTEVBTi1PQkpTICs9IGxpYnMuZG94eQorRE9DUy15ZXMgKz0gbGlicy5kb3h5CitsaWJzLmRveHk6ICQoQ09ERUNfRE9DX1NSQ1MpCisJQGVjaG8gIiAgICBbQ1JFQVRFXSAkQCIKKwlAcm0gLWYgJEAKKwlAZWNobyAiSU5QVVQgKz0gJF4iID4+ICRACisJQGVjaG8gIlBSRURFRklORUQgPSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQiID4+ICRACisJQGVjaG8gIklOQ0xVREVfUEFUSCArPSAuIiA+PiAkQDsKKwlAZWNobyAiRU5BQkxFRF9TRUNUSU9OUyArPSAkKHNvcnQgJChDT0RFQ19ET0NfU0VDVElPTlMpKSIgPj4gJEAKKworIyMgR2VuZXJhdGUgdnB4X3J0Y2QuaCBmb3IgYWxsIG9iamVjdHMKKyQoT0JKUy15ZXM6Lm89LmQpOiAkKEJVSUxEX1BGWCl2cHhfcnRjZC5oCmRpZmYgLS1naXQgYS9saWJ2cHgvbWFpbnBhZ2UuZG94IGIvbGlidnB4L21haW5wYWdlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVjMjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L21haW5wYWdlLmRveApAQCAtMCwwICsxLDUzIEBACisvKiFcbWFpbnBhZ2UgV2ViTSBWUDggQ29kZWMgU0RLCisKKyAgXHNlY3Rpb24gbWFpbl9jb250ZW50cyBQYWdlIENvbnRlbnRzCisgIC0gXHJlZiBtYWluX2ludHJvCisgIC0gXHJlZiBtYWluX3N0YXJ0cG9pbnRzCisgIC0gXHJlZiBtYWluX3N1cHBvcnQKKworICBcc2VjdGlvbiBtYWluX2ludHJvIEludHJvZHVjdGlvbgorICBXZWxjb21lIHRvIHRoZSBXZWJNIFZQOCBDb2RlYyBTREsuIFRoaXMgU0RLIGFsbG93cyB5b3UgdG8gaW50ZWdyYXRlIHlvdXIKKyAgYXBwbGljYXRpb25zIHdpdGggdGhlIFZQOCB2aWRlbyBjb2RlYywgYSBoaWdoIHF1YWxpdHksIHJveWFsdHkgZnJlZSwgb3BlbgorICBzb3VyY2UgY29kZWMgZGVwbG95ZWQgb24gbWlsbGlvbnMgb2YgY29tcHV0ZXJzIGFuZCBkZXZpY2VzIHdvcmxkd2lkZS4KKworICBUaGlzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV2ViTSBWUDggQ29kZWMgU0RLIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgc3VwcG9ydDoKKworICBcaWYgdnA4X2VuY29kZXIKKyAgLSBccmVmIHZwOF9lbmNvZGVyCisgIFxlbmRpZgorICBcaWYgdnA4X2RlY29kZXIKKyAgLSBccmVmIHZwOF9kZWNvZGVyCisgIFxlbmRpZgorCisKKyAgXHNlY3Rpb24gbWFpbl9zdGFydHBvaW50cyBTdGFydGluZyBQb2ludHMKKyAgLSBDb25zdWx0IHRoZSBccmVmIGNoYW5nZWxvZyBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGltcHJvdmVtZW50cyBpbiB0aGlzCisgICAgcmVsZWFzZS4KKyAgLSBUaGUgXHJlZiByZWFkbWUgY29udGFpbnMgaW5zdHJ1Y3Rpb25zIG9uIHJlY29tcGlsaW5nIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zLgorICAtIFJlYWQgdGhlIFxyZWYgdXNhZ2UgInVzYWdlIiBmb3IgYSBuYXJyYXRpdmUgb24gY29kZWMgdXNhZ2UuCisgIC0gUmVhZCB0aGUgXHJlZiBzYW1wbGVzICJzYW1wbGUgY29kZSIgZm9yIGV4YW1wbGVzIG9mIGhvdyB0byBpbnRlcmFjdCB3aXRoIHRoZQorICAgIGNvZGVjLgorICAtIFxyZWYgY29kZWMgcmVmZXJlbmNlCisgICAgXGlmIGVuY29kZXIKKyAgICAtIFxyZWYgZW5jb2RlciByZWZlcmVuY2UKKyAgICBcZW5kaWYKKyAgICBcaWYgZGVjb2RlcgorICAgIC0gXHJlZiBkZWNvZGVyIHJlZmVyZW5jZQorICAgIFxlbmRpZgorCisgIFxzZWN0aW9uIG1haW5fc3VwcG9ydCBTdXBwb3J0IE9wdGlvbnMgJiBGQVEKKyAgVGhlIFdlYk0gcHJvamVjdCBpcyBhbiBvcGVuIHNvdXJjZSBwcm9qZWN0IHN1cHBvcnRlZCBieSBpdHMgY29tbXVuaXR5LiBGb3IKKyAgcXVlc3Rpb25zIGFib3V0IHRoaXMgU0RLLCBwbGVhc2UgbWFpbCB0aGUgYXBwcy1kZXZlbEB3ZWJtcHJvamVjdC5vcmcgbGlzdC4KKyAgVG8gY29udHJpYnV0ZSwgc2VlIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZSBhbmQgbWFpbAorICBjb2RlYy1kZXZlbEB3ZWJtcHJvamVjdC5vcmcuCisqLworCisvKiFccGFnZSBjaGFuZ2Vsb2cgQ0hBTkdFTE9HCisgICBcdmVyYmluY2x1ZGUgQ0hBTkdFTE9HCisqLworCisvKiFccGFnZSByZWFkbWUgUkVBRE1FCisgICBcdmVyYmluY2x1ZGUgUkVBRE1FCisqLworCisvKiFcZGVmZ3JvdXAgY29kZWNzIFN1cHBvcnRlZCBDb2RlY3MgKi8KZGlmZiAtLWdpdCBhL21kNV91dGlscy5jIGIvbGlidnB4L21kNV91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZDVfdXRpbHMuYwpyZW5hbWUgdG8gbGlidnB4L21kNV91dGlscy5jCmRpZmYgLS1naXQgYS9tZDVfdXRpbHMuaCBiL2xpYnZweC9tZDVfdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWQ1X3V0aWxzLmgKcmVuYW1lIHRvIGxpYnZweC9tZDVfdXRpbHMuaApkaWZmIC0tZ2l0IGEvbGlidnB4L25lc3RlZ2cvLmdpdGlnbm9yZSBiL2xpYnZweC9uZXN0ZWdnLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiYTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9uZXN0ZWdnLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0MCBAQAorKi5sbworKi5vCisqLnN3cAorKn4KKy5kZXBzCisuZGlyc3RhbXAKKy5saWJzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK19zdGRpbnQuaAorYWNsb2NhbC5tNAorYXV0b200dGUuY2FjaGUKK2NvbXBpbGUKK2NvbmZpZy5ndWVzcworY29uZmlnLmgKK2NvbmZpZy5oLmluCitjb25maWcubG9nCitjb25maWcuc3RhdHVzCitjb25maWcuc3ViCitjb25maWd1cmUKK2RlcGNvbXAKK2RvY3MvRG94eWZpbGUKK2RvY3MvZG94eWdlbi1idWlsZC5zdGFtcAorZG9jcy9odG1sCitpbnN0YWxsLXNoCitsaWJ0b29sCitsdG1haW4uc2gKK200L2xpYnRvb2wubTQKK200L2x0b3B0aW9ucy5tNAorbTQvbHRzdWdhci5tNAorbTQvbHR2ZXJzaW9uLm00CittNC9sdH5vYnNvbGV0ZS5tNAorbWlzc2luZworbmVzdGVnZy11bmluc3RhbGxlZC5wYworbmVzdGVnZy5wYworc3JjLy5kaXJzdGFtcAorc3JjL2xpYm5lc3RlZ2cubGEKK3N0YW1wLWgxCit0ZXN0L3Rlc3QKK2luY2x1ZGUvbmVzdGVnZy9uZXN0ZWdnLXN0ZGludC5oCmRpZmYgLS1naXQgYS9uZXN0ZWdnL0FVVEhPUlMgYi9saWJ2cHgvbmVzdGVnZy9BVVRIT1JTCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL0FVVEhPUlMKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL0FVVEhPUlMKZGlmZiAtLWdpdCBhL25lc3RlZ2cvSU5TVEFMTCBiL2xpYnZweC9uZXN0ZWdnL0lOU1RBTEwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvSU5TVEFMTApyZW5hbWUgdG8gbGlidnB4L25lc3RlZ2cvSU5TVEFMTApkaWZmIC0tZ2l0IGEvbmVzdGVnZy9MSUNFTlNFIGIvbGlidnB4L25lc3RlZ2cvTElDRU5TRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9MSUNFTlNFCnJlbmFtZSB0byBsaWJ2cHgvbmVzdGVnZy9MSUNFTlNFCmRpZmYgLS1naXQgYS9uZXN0ZWdnL01ha2VmaWxlLmFtIGIvbGlidnB4L25lc3RlZ2cvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9uZXN0ZWdnL1JFQURNRSBiL2xpYnZweC9uZXN0ZWdnL1JFQURNRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9SRUFETUUKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL1JFQURNRQpkaWZmIC0tZ2l0IGEvbmVzdGVnZy9UT0RPIGIvbGlidnB4L25lc3RlZ2cvVE9ETwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9UT0RPCnJlbmFtZSB0byBsaWJ2cHgvbmVzdGVnZy9UT0RPCmRpZmYgLS1naXQgYS9uZXN0ZWdnL2NvbmZpZ3VyZS5hYyBiL2xpYnZweC9uZXN0ZWdnL2NvbmZpZ3VyZS5hYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9jb25maWd1cmUuYWMKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL2NvbmZpZ3VyZS5hYwpkaWZmIC0tZ2l0IGEvbmVzdGVnZy9kb2NzL0RveHlmaWxlLmluIGIvbGlidnB4L25lc3RlZ2cvZG9jcy9Eb3h5ZmlsZS5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9kb2NzL0RveHlmaWxlLmluCnJlbmFtZSB0byBsaWJ2cHgvbmVzdGVnZy9kb2NzL0RveHlmaWxlLmluCmRpZmYgLS1naXQgYS9uZXN0ZWdnL2RvY3MvTWFrZWZpbGUuYW0gYi9saWJ2cHgvbmVzdGVnZy9kb2NzL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL2RvY3MvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL2RvY3MvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL25lc3RlZ2cvaGFsbG9jL1JFQURNRSBiL2xpYnZweC9uZXN0ZWdnL2hhbGxvYy9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvaGFsbG9jL1JFQURNRQpyZW5hbWUgdG8gbGlidnB4L25lc3RlZ2cvaGFsbG9jL1JFQURNRQpkaWZmIC0tZ2l0IGEvbmVzdGVnZy9oYWxsb2MvaGFsbG9jLmggYi9saWJ2cHgvbmVzdGVnZy9oYWxsb2MvaGFsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvaGFsbG9jL2hhbGxvYy5oCnJlbmFtZSB0byBsaWJ2cHgvbmVzdGVnZy9oYWxsb2MvaGFsbG9jLmgKZGlmZiAtLWdpdCBhL25lc3RlZ2cvaGFsbG9jL3NyYy9hbGlnbi5oIGIvbGlidnB4L25lc3RlZ2cvaGFsbG9jL3NyYy9hbGlnbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL2hhbGxvYy9zcmMvYWxpZ24uaApyZW5hbWUgdG8gbGlidnB4L25lc3RlZ2cvaGFsbG9jL3NyYy9hbGlnbi5oCmRpZmYgLS1naXQgYS9uZXN0ZWdnL2hhbGxvYy9zcmMvaGFsbG9jLmMgYi9saWJ2cHgvbmVzdGVnZy9oYWxsb2Mvc3JjL2hhbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL2hhbGxvYy9zcmMvaGFsbG9jLmMKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL2hhbGxvYy9zcmMvaGFsbG9jLmMKZGlmZiAtLWdpdCBhL25lc3RlZ2cvaGFsbG9jL3NyYy9obGlzdC5oIGIvbGlidnB4L25lc3RlZ2cvaGFsbG9jL3NyYy9obGlzdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL2hhbGxvYy9zcmMvaGxpc3QuaApyZW5hbWUgdG8gbGlidnB4L25lc3RlZ2cvaGFsbG9jL3NyYy9obGlzdC5oCmRpZmYgLS1naXQgYS9uZXN0ZWdnL2hhbGxvYy9zcmMvbWFjcm9zLmggYi9saWJ2cHgvbmVzdGVnZy9oYWxsb2Mvc3JjL21hY3Jvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL2hhbGxvYy9zcmMvbWFjcm9zLmgKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL2hhbGxvYy9zcmMvbWFjcm9zLmgKZGlmZiAtLWdpdCBhL25lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaCBiL2xpYnZweC9uZXN0ZWdnL2luY2x1ZGUvbmVzdGVnZy9uZXN0ZWdnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaApyZW5hbWUgdG8gbGlidnB4L25lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaApkaWZmIC0tZ2l0IGEvbmVzdGVnZy9tNC9hcy1hYy1leHBhbmQubTQgYi9saWJ2cHgvbmVzdGVnZy9tNC9hcy1hYy1leHBhbmQubTQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvbTQvYXMtYWMtZXhwYW5kLm00CnJlbmFtZSB0byBsaWJ2cHgvbmVzdGVnZy9tNC9hcy1hYy1leHBhbmQubTQKZGlmZiAtLWdpdCBhL25lc3RlZ2cvbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00IGIvbGlidnB4L25lc3RlZ2cvbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNApyZW5hbWUgdG8gbGlidnB4L25lc3RlZ2cvbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00CmRpZmYgLS1naXQgYS9uZXN0ZWdnL200L3BrZy5tNCBiL2xpYnZweC9uZXN0ZWdnL200L3BrZy5tNApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9tNC9wa2cubTQKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL200L3BrZy5tNApkaWZmIC0tZ2l0IGEvbmVzdGVnZy9uZXN0ZWdnLXVuaW5zdGFsbGVkLnBjLmluIGIvbGlidnB4L25lc3RlZ2cvbmVzdGVnZy11bmluc3RhbGxlZC5wYy5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmVzdGVnZy9uZXN0ZWdnLXVuaW5zdGFsbGVkLnBjLmluCnJlbmFtZSB0byBsaWJ2cHgvbmVzdGVnZy9uZXN0ZWdnLXVuaW5zdGFsbGVkLnBjLmluCmRpZmYgLS1naXQgYS9uZXN0ZWdnL25lc3RlZ2cucGMuaW4gYi9saWJ2cHgvbmVzdGVnZy9uZXN0ZWdnLnBjLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXN0ZWdnL25lc3RlZ2cucGMuaW4KcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL25lc3RlZ2cucGMuaW4KZGlmZiAtLWdpdCBhL2xpYnZweC9uZXN0ZWdnL3NyYy9uZXN0ZWdnLmMgYi9saWJ2cHgvbmVzdGVnZy9zcmMvbmVzdGVnZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODc3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvbmVzdGVnZy9zcmMvbmVzdGVnZy5jCkBAIC0wLDAgKzEsMTkzOCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbiBJU0Mtc3R5bGUgbGljZW5zZS4gIFNlZSB0aGUKKyAqIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0UgZm9yIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm5lc3RlZ2cvaGFsbG9jL2hhbGxvYy5oIgorI2luY2x1ZGUgIm5lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaCIKKworLyogRUJNTCBFbGVtZW50cyAqLworI2RlZmluZSBJRF9FQk1MICAgICAgICAgICAgICAgICAweDFhNDVkZmEzCisjZGVmaW5lIElEX0VCTUxfVkVSU0lPTiAgICAgICAgIDB4NDI4NgorI2RlZmluZSBJRF9FQk1MX1JFQURfVkVSU0lPTiAgICAweDQyZjcKKyNkZWZpbmUgSURfRUJNTF9NQVhfSURfTEVOR1RIICAgMHg0MmYyCisjZGVmaW5lIElEX0VCTUxfTUFYX1NJWkVfTEVOR1RIIDB4NDJmMworI2RlZmluZSBJRF9ET0NUWVBFICAgICAgICAgICAgICAweDQyODIKKyNkZWZpbmUgSURfRE9DVFlQRV9WRVJTSU9OICAgICAgMHg0Mjg3CisjZGVmaW5lIElEX0RPQ1RZUEVfUkVBRF9WRVJTSU9OIDB4NDI4NQorCisvKiBHbG9iYWwgRWxlbWVudHMgKi8KKyNkZWZpbmUgSURfVk9JRCAgICAgICAgICAgICAgICAgMHhlYworI2RlZmluZSBJRF9DUkMzMiAgICAgICAgICAgICAgICAweGJmCisKKy8qIFdlYk1lZGlhIEVsZW1lbnRzICovCisjZGVmaW5lIElEX1NFR01FTlQgICAgICAgICAgICAgIDB4MTg1MzgwNjcKKworLyogU2VlayBIZWFkIEVsZW1lbnRzICovCisjZGVmaW5lIElEX1NFRUtfSEVBRCAgICAgICAgICAgIDB4MTE0ZDliNzQKKyNkZWZpbmUgSURfU0VFSyAgICAgICAgICAgICAgICAgMHg0ZGJiCisjZGVmaW5lIElEX1NFRUtfSUQgICAgICAgICAgICAgIDB4NTNhYgorI2RlZmluZSBJRF9TRUVLX1BPU0lUSU9OICAgICAgICAweDUzYWMKKworLyogSW5mbyBFbGVtZW50cyAqLworI2RlZmluZSBJRF9JTkZPICAgICAgICAgICAgICAgICAweDE1NDlhOTY2CisjZGVmaW5lIElEX1RJTUVDT0RFX1NDQUxFICAgICAgIDB4MmFkN2IxCisjZGVmaW5lIElEX0RVUkFUSU9OICAgICAgICAgICAgIDB4NDQ4OQorCisvKiBDbHVzdGVyIEVsZW1lbnRzICovCisjZGVmaW5lIElEX0NMVVNURVIgICAgICAgICAgICAgIDB4MWY0M2I2NzUKKyNkZWZpbmUgSURfVElNRUNPREUgICAgICAgICAgICAgMHhlNworI2RlZmluZSBJRF9CTE9DS19HUk9VUCAgICAgICAgICAweGEwCisjZGVmaW5lIElEX1NJTVBMRV9CTE9DSyAgICAgICAgIDB4YTMKKworLyogQmxvY2tHcm91cCBFbGVtZW50cyAqLworI2RlZmluZSBJRF9CTE9DSyAgICAgICAgICAgICAgICAweGExCisjZGVmaW5lIElEX0JMT0NLX0RVUkFUSU9OICAgICAgIDB4OWIKKyNkZWZpbmUgSURfUkVGRVJFTkNFX0JMT0NLICAgICAgMHhmYgorCisvKiBUcmFja3MgRWxlbWVudHMgKi8KKyNkZWZpbmUgSURfVFJBQ0tTICAgICAgICAgICAgICAgMHgxNjU0YWU2YgorI2RlZmluZSBJRF9UUkFDS19FTlRSWSAgICAgICAgICAweGFlCisjZGVmaW5lIElEX1RSQUNLX05VTUJFUiAgICAgICAgIDB4ZDcKKyNkZWZpbmUgSURfVFJBQ0tfVUlEICAgICAgICAgICAgMHg3M2M1CisjZGVmaW5lIElEX1RSQUNLX1RZUEUgICAgICAgICAgIDB4ODMKKyNkZWZpbmUgSURfRkxBR19FTkFCTEVEICAgICAgICAgMHhiOQorI2RlZmluZSBJRF9GTEFHX0RFRkFVTFQgICAgICAgICAweDg4CisjZGVmaW5lIElEX0ZMQUdfTEFDSU5HICAgICAgICAgIDB4OWMKKyNkZWZpbmUgSURfVFJBQ0tfVElNRUNPREVfU0NBTEUgMHgyMzMxNGYKKyNkZWZpbmUgSURfTEFOR1VBR0UgICAgICAgICAgICAgMHgyMmI1OWMKKyNkZWZpbmUgSURfQ09ERUNfSUQgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBJRF9DT0RFQ19QUklWQVRFICAgICAgICAweDYzYTIKKworLyogVmlkZW8gRWxlbWVudHMgKi8KKyNkZWZpbmUgSURfVklERU8gICAgICAgICAgICAgICAgMHhlMAorI2RlZmluZSBJRF9QSVhFTF9XSURUSCAgICAgICAgICAweGIwCisjZGVmaW5lIElEX1BJWEVMX0hFSUdIVCAgICAgICAgIDB4YmEKKyNkZWZpbmUgSURfUElYRUxfQ1JPUF9CT1RUT00gICAgMHg1NGFhCisjZGVmaW5lIElEX1BJWEVMX0NST1BfVE9QICAgICAgIDB4NTRiYgorI2RlZmluZSBJRF9QSVhFTF9DUk9QX0xFRlQgICAgICAweDU0Y2MKKyNkZWZpbmUgSURfUElYRUxfQ1JPUF9SSUdIVCAgICAgMHg1NGRkCisjZGVmaW5lIElEX0RJU1BMQVlfV0lEVEggICAgICAgIDB4NTRiMAorI2RlZmluZSBJRF9ESVNQTEFZX0hFSUdIVCAgICAgICAweDU0YmEKKworLyogQXVkaW8gRWxlbWVudHMgKi8KKyNkZWZpbmUgSURfQVVESU8gICAgICAgICAgICAgICAgMHhlMQorI2RlZmluZSBJRF9TQU1QTElOR19GUkVRVUVOQ1kgICAweGI1CisjZGVmaW5lIElEX0NIQU5ORUxTICAgICAgICAgICAgIDB4OWYKKyNkZWZpbmUgSURfQklUX0RFUFRIICAgICAgICAgICAgMHg2MjY0CisKKy8qIEN1ZXMgRWxlbWVudHMgKi8KKyNkZWZpbmUgSURfQ1VFUyAgICAgICAgICAgICAgICAgMHgxYzUzYmI2YgorI2RlZmluZSBJRF9DVUVfUE9JTlQgICAgICAgICAgICAweGJiCisjZGVmaW5lIElEX0NVRV9USU1FICAgICAgICAgICAgIDB4YjMKKyNkZWZpbmUgSURfQ1VFX1RSQUNLX1BPU0lUSU9OUyAgMHhiNworI2RlZmluZSBJRF9DVUVfVFJBQ0sgICAgICAgICAgICAweGY3CisjZGVmaW5lIElEX0NVRV9DTFVTVEVSX1BPU0lUSU9OIDB4ZjEKKyNkZWZpbmUgSURfQ1VFX0JMT0NLX05VTUJFUiAgICAgMHg1Mzc4CisKKy8qIEVCTUwgVHlwZXMgKi8KK2VudW0gZWJtbF90eXBlX2VudW0geworICBUWVBFX1VOS05PV04sCisgIFRZUEVfTUFTVEVSLAorICBUWVBFX1VJTlQsCisgIFRZUEVfRkxPQVQsCisgIFRZUEVfSU5ULAorICBUWVBFX1NUUklORywKKyAgVFlQRV9CSU5BUlkKK307CisKKyNkZWZpbmUgTElNSVRfU1RSSU5HICAgICAgICAgICAgKDEgPDwgMjApCisjZGVmaW5lIExJTUlUX0JJTkFSWSAgICAgICAgICAgICgxIDw8IDI0KQorI2RlZmluZSBMSU1JVF9CTE9DSyAgICAgICAgICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgTElNSVRfRlJBTUUgICAgICAgICAgICAgKDEgPDwgMjgpCisKKy8qIEZpZWxkIEZsYWdzICovCisjZGVmaW5lIERFU0NfRkxBR19OT05FICAgICAgICAgIDAKKyNkZWZpbmUgREVTQ19GTEFHX01VTFRJICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgREVTQ19GTEFHX1NVU1BFTkQgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgREVTQ19GTEFHX09GRlNFVCAgICAgICAgKDEgPDwgMikKKworLyogQmxvY2sgSGVhZGVyIEZsYWdzICovCisjZGVmaW5lIEJMT0NLX0ZMQUdTX0xBQ0lORyAgICAgIDYKKworLyogTGFjaW5nIENvbnN0YW50cyAqLworI2RlZmluZSBMQUNJTkdfTk9ORSAgICAgICAgICAgICAwCisjZGVmaW5lIExBQ0lOR19YSVBIICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEFDSU5HX0ZJWEVEICAgICAgICAgICAgMgorI2RlZmluZSBMQUNJTkdfRUJNTCAgICAgICAgICAgICAzCisKKy8qIFRyYWNrIFR5cGVzICovCisjZGVmaW5lIFRSQUNLX1RZUEVfVklERU8gICAgICAgIDEKKyNkZWZpbmUgVFJBQ0tfVFlQRV9BVURJTyAgICAgICAgMgorCisvKiBUcmFjayBJRHMgKi8KKyNkZWZpbmUgVFJBQ0tfSURfVlA4ICAgICAgICAgICAgIlZfVlA4IgorI2RlZmluZSBUUkFDS19JRF9WT1JCSVMgICAgICAgICAiQV9WT1JCSVMiCisKK2VudW0gdmludF9tYXNrIHsKKyAgTUFTS19OT05FLAorICBNQVNLX0ZJUlNUX0JJVAorfTsKKworc3RydWN0IGVibWxfYmluYXJ5IHsKKyAgdW5zaWduZWQgY2hhciAqIGRhdGE7CisgIHNpemVfdCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgZWJtbF9saXN0X25vZGUgeworICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiBuZXh0OworICB1aW50NjRfdCBpZDsKKyAgdm9pZCAqIGRhdGE7Cit9OworCitzdHJ1Y3QgZWJtbF9saXN0IHsKKyAgc3RydWN0IGVibWxfbGlzdF9ub2RlICogaGVhZDsKKyAgc3RydWN0IGVibWxfbGlzdF9ub2RlICogdGFpbDsKK307CisKK3N0cnVjdCBlYm1sX3R5cGUgeworICB1bmlvbiBlYm1sX3ZhbHVlIHsKKyAgICB1aW50NjRfdCB1OworICAgIGRvdWJsZSBmOworICAgIGludDY0X3QgaTsKKyAgICBjaGFyICogczsKKyAgICBzdHJ1Y3QgZWJtbF9iaW5hcnkgYjsKKyAgfSB2OworICBlbnVtIGVibWxfdHlwZV9lbnVtIHR5cGU7CisgIGludCByZWFkOworfTsKKworLyogRUJNTCBEZWZpbml0aW9ucyAqLworc3RydWN0IGVibWwgeworICBzdHJ1Y3QgZWJtbF90eXBlIGVibWxfdmVyc2lvbjsKKyAgc3RydWN0IGVibWxfdHlwZSBlYm1sX3JlYWRfdmVyc2lvbjsKKyAgc3RydWN0IGVibWxfdHlwZSBlYm1sX21heF9pZF9sZW5ndGg7CisgIHN0cnVjdCBlYm1sX3R5cGUgZWJtbF9tYXhfc2l6ZV9sZW5ndGg7CisgIHN0cnVjdCBlYm1sX3R5cGUgZG9jdHlwZTsKKyAgc3RydWN0IGVibWxfdHlwZSBkb2N0eXBlX3ZlcnNpb247CisgIHN0cnVjdCBlYm1sX3R5cGUgZG9jdHlwZV9yZWFkX3ZlcnNpb247Cit9OworCisvKiBNYXRyb2tzYSBEZWZpbml0aW9ucyAqLworc3RydWN0IHNlZWsgeworICBzdHJ1Y3QgZWJtbF90eXBlIGlkOworICBzdHJ1Y3QgZWJtbF90eXBlIHBvc2l0aW9uOworfTsKKworc3RydWN0IHNlZWtfaGVhZCB7CisgIHN0cnVjdCBlYm1sX2xpc3Qgc2VlazsKK307CisKK3N0cnVjdCBpbmZvIHsKKyAgc3RydWN0IGVibWxfdHlwZSB0aW1lY29kZV9zY2FsZTsKKyAgc3RydWN0IGVibWxfdHlwZSBkdXJhdGlvbjsKK307CisKK3N0cnVjdCBibG9ja19ncm91cCB7CisgIHN0cnVjdCBlYm1sX3R5cGUgZHVyYXRpb247CisgIHN0cnVjdCBlYm1sX3R5cGUgcmVmZXJlbmNlX2Jsb2NrOworfTsKKworc3RydWN0IGNsdXN0ZXIgeworICBzdHJ1Y3QgZWJtbF90eXBlIHRpbWVjb2RlOworICBzdHJ1Y3QgZWJtbF9saXN0IGJsb2NrX2dyb3VwOworfTsKKworc3RydWN0IHZpZGVvIHsKKyAgc3RydWN0IGVibWxfdHlwZSBwaXhlbF93aWR0aDsKKyAgc3RydWN0IGVibWxfdHlwZSBwaXhlbF9oZWlnaHQ7CisgIHN0cnVjdCBlYm1sX3R5cGUgcGl4ZWxfY3JvcF9ib3R0b207CisgIHN0cnVjdCBlYm1sX3R5cGUgcGl4ZWxfY3JvcF90b3A7CisgIHN0cnVjdCBlYm1sX3R5cGUgcGl4ZWxfY3JvcF9sZWZ0OworICBzdHJ1Y3QgZWJtbF90eXBlIHBpeGVsX2Nyb3BfcmlnaHQ7CisgIHN0cnVjdCBlYm1sX3R5cGUgZGlzcGxheV93aWR0aDsKKyAgc3RydWN0IGVibWxfdHlwZSBkaXNwbGF5X2hlaWdodDsKK307CisKK3N0cnVjdCBhdWRpbyB7CisgIHN0cnVjdCBlYm1sX3R5cGUgc2FtcGxpbmdfZnJlcXVlbmN5OworICBzdHJ1Y3QgZWJtbF90eXBlIGNoYW5uZWxzOworICBzdHJ1Y3QgZWJtbF90eXBlIGJpdF9kZXB0aDsKK307CisKK3N0cnVjdCB0cmFja19lbnRyeSB7CisgIHN0cnVjdCBlYm1sX3R5cGUgbnVtYmVyOworICBzdHJ1Y3QgZWJtbF90eXBlIHVpZDsKKyAgc3RydWN0IGVibWxfdHlwZSB0eXBlOworICBzdHJ1Y3QgZWJtbF90eXBlIGZsYWdfZW5hYmxlZDsKKyAgc3RydWN0IGVibWxfdHlwZSBmbGFnX2RlZmF1bHQ7CisgIHN0cnVjdCBlYm1sX3R5cGUgZmxhZ19sYWNpbmc7CisgIHN0cnVjdCBlYm1sX3R5cGUgdHJhY2tfdGltZWNvZGVfc2NhbGU7CisgIHN0cnVjdCBlYm1sX3R5cGUgbGFuZ3VhZ2U7CisgIHN0cnVjdCBlYm1sX3R5cGUgY29kZWNfaWQ7CisgIHN0cnVjdCBlYm1sX3R5cGUgY29kZWNfcHJpdmF0ZTsKKyAgc3RydWN0IHZpZGVvIHZpZGVvOworICBzdHJ1Y3QgYXVkaW8gYXVkaW87Cit9OworCitzdHJ1Y3QgdHJhY2tzIHsKKyAgc3RydWN0IGVibWxfbGlzdCB0cmFja19lbnRyeTsKK307CisKK3N0cnVjdCBjdWVfdHJhY2tfcG9zaXRpb25zIHsKKyAgc3RydWN0IGVibWxfdHlwZSB0cmFjazsKKyAgc3RydWN0IGVibWxfdHlwZSBjbHVzdGVyX3Bvc2l0aW9uOworICBzdHJ1Y3QgZWJtbF90eXBlIGJsb2NrX251bWJlcjsKK307CisKK3N0cnVjdCBjdWVfcG9pbnQgeworICBzdHJ1Y3QgZWJtbF90eXBlIHRpbWU7CisgIHN0cnVjdCBlYm1sX2xpc3QgY3VlX3RyYWNrX3Bvc2l0aW9uczsKK307CisKK3N0cnVjdCBjdWVzIHsKKyAgc3RydWN0IGVibWxfbGlzdCBjdWVfcG9pbnQ7Cit9OworCitzdHJ1Y3Qgc2VnbWVudCB7CisgIHN0cnVjdCBlYm1sX2xpc3Qgc2Vla19oZWFkOworICBzdHJ1Y3QgaW5mbyBpbmZvOworICBzdHJ1Y3QgZWJtbF9saXN0IGNsdXN0ZXI7CisgIHN0cnVjdCB0cmFja3MgdHJhY2tzOworICBzdHJ1Y3QgY3VlcyBjdWVzOworfTsKKworLyogTWlzYy4gKi8KK3N0cnVjdCBwb29sX2N0eCB7CisgIGNoYXIgZHVtbXk7Cit9OworCitzdHJ1Y3QgbGlzdF9ub2RlIHsKKyAgc3RydWN0IGxpc3Rfbm9kZSAqIHByZXZpb3VzOworICBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBub2RlOworICB1bnNpZ25lZCBjaGFyICogZGF0YTsKK307CisKK3N0cnVjdCBzYXZlZF9zdGF0ZSB7CisgIGludDY0X3Qgc3RyZWFtX29mZnNldDsKKyAgc3RydWN0IGxpc3Rfbm9kZSAqIGFuY2VzdG9yOworICB1aW50NjRfdCBsYXN0X2lkOworICB1aW50NjRfdCBsYXN0X3NpemU7Cit9OworCitzdHJ1Y3QgZnJhbWUgeworICB1bnNpZ25lZCBjaGFyICogZGF0YTsKKyAgc2l6ZV90IGxlbmd0aDsKKyAgc3RydWN0IGZyYW1lICogbmV4dDsKK307CisKKy8qIFB1YmxpYyAob3BhcXVlKSBTdHJ1Y3R1cmVzICovCitzdHJ1Y3QgbmVzdGVnZyB7CisgIG5lc3RlZ2dfaW8gKiBpbzsKKyAgbmVzdGVnZ19sb2cgbG9nOworICBzdHJ1Y3QgcG9vbF9jdHggKiBhbGxvY19wb29sOworICB1aW50NjRfdCBsYXN0X2lkOworICB1aW50NjRfdCBsYXN0X3NpemU7CisgIHN0cnVjdCBsaXN0X25vZGUgKiBhbmNlc3RvcjsKKyAgc3RydWN0IGVibWwgZWJtbDsKKyAgc3RydWN0IHNlZ21lbnQgc2VnbWVudDsKKyAgaW50NjRfdCBzZWdtZW50X29mZnNldDsKKyAgdW5zaWduZWQgaW50IHRyYWNrX2NvdW50OworfTsKKworc3RydWN0IG5lc3RlZ2dfcGFja2V0IHsKKyAgdWludDY0X3QgdHJhY2s7CisgIHVpbnQ2NF90IHRpbWVjb2RlOworICBzdHJ1Y3QgZnJhbWUgKiBmcmFtZTsKK307CisKKy8qIEVsZW1lbnQgRGVzY3JpcHRvciAqLworc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIHsKKyAgY2hhciBjb25zdCAqIG5hbWU7CisgIHVpbnQ2NF90IGlkOworICBlbnVtIGVibWxfdHlwZV9lbnVtIHR5cGU7CisgIHNpemVfdCBvZmZzZXQ7CisgIHVuc2lnbmVkIGludCBmbGFnczsKKyAgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjICogY2hpbGRyZW47CisgIHNpemVfdCBzaXplOworICBzaXplX3QgZGF0YV9vZmZzZXQ7Cit9OworCisjZGVmaW5lIEVfRklFTEQoSUQsIFRZUEUsIFNUUlVDVCwgRklFTEQpIFwKKyAgeyAjSUQsIElELCBUWVBFLCBvZmZzZXRvZihTVFJVQ1QsIEZJRUxEKSwgREVTQ19GTEFHX05PTkUsIE5VTEwsIDAsIDAgfQorI2RlZmluZSBFX01BU1RFUihJRCwgVFlQRSwgU1RSVUNULCBGSUVMRCkgXAorICB7ICNJRCwgSUQsIFRZUEUsIG9mZnNldG9mKFNUUlVDVCwgRklFTEQpLCBERVNDX0ZMQUdfTVVMVEksIG5lXyAjIyBGSUVMRCAjIyBfZWxlbWVudHMsIFwKKyAgICAgIHNpemVvZihzdHJ1Y3QgRklFTEQpLCAwIH0KKyNkZWZpbmUgRV9TSU5HTEVfTUFTVEVSX08oSUQsIFRZUEUsIFNUUlVDVCwgRklFTEQpIFwKKyAgeyAjSUQsIElELCBUWVBFLCBvZmZzZXRvZihTVFJVQ1QsIEZJRUxEKSwgREVTQ19GTEFHX09GRlNFVCwgbmVfICMjIEZJRUxEICMjIF9lbGVtZW50cywgMCwgXAorICAgICAgb2Zmc2V0b2YoU1RSVUNULCBGSUVMRCAjIyBfb2Zmc2V0KSB9CisjZGVmaW5lIEVfU0lOR0xFX01BU1RFUihJRCwgVFlQRSwgU1RSVUNULCBGSUVMRCkgXAorICB7ICNJRCwgSUQsIFRZUEUsIG9mZnNldG9mKFNUUlVDVCwgRklFTEQpLCBERVNDX0ZMQUdfTk9ORSwgbmVfICMjIEZJRUxEICMjIF9lbGVtZW50cywgMCwgMCB9CisjZGVmaW5lIEVfU1VTUEVORChJRCwgVFlQRSkgXAorICB7ICNJRCwgSUQsIFRZUEUsIDAsIERFU0NfRkxBR19TVVNQRU5ELCBOVUxMLCAwLCAwIH0KKyNkZWZpbmUgRV9MQVNUIFwKKyAgeyBOVUxMLCAwLCAwLCAwLCBERVNDX0ZMQUdfTk9ORSwgTlVMTCwgMCwgMCB9CisKKy8qIEVCTUwgRWxlbWVudCBMaXN0cyAqLworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9lYm1sX2VsZW1lbnRzW10gPSB7CisgIEVfRklFTEQoSURfRUJNTF9WRVJTSU9OLCBUWVBFX1VJTlQsIHN0cnVjdCBlYm1sLCBlYm1sX3ZlcnNpb24pLAorICBFX0ZJRUxEKElEX0VCTUxfUkVBRF9WRVJTSU9OLCBUWVBFX1VJTlQsIHN0cnVjdCBlYm1sLCBlYm1sX3JlYWRfdmVyc2lvbiksCisgIEVfRklFTEQoSURfRUJNTF9NQVhfSURfTEVOR1RILCBUWVBFX1VJTlQsIHN0cnVjdCBlYm1sLCBlYm1sX21heF9pZF9sZW5ndGgpLAorICBFX0ZJRUxEKElEX0VCTUxfTUFYX1NJWkVfTEVOR1RILCBUWVBFX1VJTlQsIHN0cnVjdCBlYm1sLCBlYm1sX21heF9zaXplX2xlbmd0aCksCisgIEVfRklFTEQoSURfRE9DVFlQRSwgVFlQRV9TVFJJTkcsIHN0cnVjdCBlYm1sLCBkb2N0eXBlKSwKKyAgRV9GSUVMRChJRF9ET0NUWVBFX1ZFUlNJT04sIFRZUEVfVUlOVCwgc3RydWN0IGVibWwsIGRvY3R5cGVfdmVyc2lvbiksCisgIEVfRklFTEQoSURfRE9DVFlQRV9SRUFEX1ZFUlNJT04sIFRZUEVfVUlOVCwgc3RydWN0IGVibWwsIGRvY3R5cGVfcmVhZF92ZXJzaW9uKSwKKyAgRV9MQVNUCit9OworCisvKiBXZWJNZWRpYSBFbGVtZW50IExpc3RzICovCitzdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX3NlZWtfZWxlbWVudHNbXSA9IHsKKyAgRV9GSUVMRChJRF9TRUVLX0lELCBUWVBFX0JJTkFSWSwgc3RydWN0IHNlZWssIGlkKSwKKyAgRV9GSUVMRChJRF9TRUVLX1BPU0lUSU9OLCBUWVBFX1VJTlQsIHN0cnVjdCBzZWVrLCBwb3NpdGlvbiksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9zZWVrX2hlYWRfZWxlbWVudHNbXSA9IHsKKyAgRV9NQVNURVIoSURfU0VFSywgVFlQRV9NQVNURVIsIHN0cnVjdCBzZWVrX2hlYWQsIHNlZWspLAorICBFX0xBU1QKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfaW5mb19lbGVtZW50c1tdID0geworICBFX0ZJRUxEKElEX1RJTUVDT0RFX1NDQUxFLCBUWVBFX1VJTlQsIHN0cnVjdCBpbmZvLCB0aW1lY29kZV9zY2FsZSksCisgIEVfRklFTEQoSURfRFVSQVRJT04sIFRZUEVfRkxPQVQsIHN0cnVjdCBpbmZvLCBkdXJhdGlvbiksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9ibG9ja19ncm91cF9lbGVtZW50c1tdID0geworICBFX1NVU1BFTkQoSURfQkxPQ0ssIFRZUEVfQklOQVJZKSwKKyAgRV9GSUVMRChJRF9CTE9DS19EVVJBVElPTiwgVFlQRV9VSU5ULCBzdHJ1Y3QgYmxvY2tfZ3JvdXAsIGR1cmF0aW9uKSwKKyAgRV9GSUVMRChJRF9SRUZFUkVOQ0VfQkxPQ0ssIFRZUEVfSU5ULCBzdHJ1Y3QgYmxvY2tfZ3JvdXAsIHJlZmVyZW5jZV9ibG9jayksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9jbHVzdGVyX2VsZW1lbnRzW10gPSB7CisgIEVfRklFTEQoSURfVElNRUNPREUsIFRZUEVfVUlOVCwgc3RydWN0IGNsdXN0ZXIsIHRpbWVjb2RlKSwKKyAgRV9NQVNURVIoSURfQkxPQ0tfR1JPVVAsIFRZUEVfTUFTVEVSLCBzdHJ1Y3QgY2x1c3RlciwgYmxvY2tfZ3JvdXApLAorICBFX1NVU1BFTkQoSURfU0lNUExFX0JMT0NLLCBUWVBFX0JJTkFSWSksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV92aWRlb19lbGVtZW50c1tdID0geworICBFX0ZJRUxEKElEX1BJWEVMX1dJRFRILCBUWVBFX1VJTlQsIHN0cnVjdCB2aWRlbywgcGl4ZWxfd2lkdGgpLAorICBFX0ZJRUxEKElEX1BJWEVMX0hFSUdIVCwgVFlQRV9VSU5ULCBzdHJ1Y3QgdmlkZW8sIHBpeGVsX2hlaWdodCksCisgIEVfRklFTEQoSURfUElYRUxfQ1JPUF9CT1RUT00sIFRZUEVfVUlOVCwgc3RydWN0IHZpZGVvLCBwaXhlbF9jcm9wX2JvdHRvbSksCisgIEVfRklFTEQoSURfUElYRUxfQ1JPUF9UT1AsIFRZUEVfVUlOVCwgc3RydWN0IHZpZGVvLCBwaXhlbF9jcm9wX3RvcCksCisgIEVfRklFTEQoSURfUElYRUxfQ1JPUF9MRUZULCBUWVBFX1VJTlQsIHN0cnVjdCB2aWRlbywgcGl4ZWxfY3JvcF9sZWZ0KSwKKyAgRV9GSUVMRChJRF9QSVhFTF9DUk9QX1JJR0hULCBUWVBFX1VJTlQsIHN0cnVjdCB2aWRlbywgcGl4ZWxfY3JvcF9yaWdodCksCisgIEVfRklFTEQoSURfRElTUExBWV9XSURUSCwgVFlQRV9VSU5ULCBzdHJ1Y3QgdmlkZW8sIGRpc3BsYXlfd2lkdGgpLAorICBFX0ZJRUxEKElEX0RJU1BMQVlfSEVJR0hULCBUWVBFX1VJTlQsIHN0cnVjdCB2aWRlbywgZGlzcGxheV9oZWlnaHQpLAorICBFX0xBU1QKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfYXVkaW9fZWxlbWVudHNbXSA9IHsKKyAgRV9GSUVMRChJRF9TQU1QTElOR19GUkVRVUVOQ1ksIFRZUEVfRkxPQVQsIHN0cnVjdCBhdWRpbywgc2FtcGxpbmdfZnJlcXVlbmN5KSwKKyAgRV9GSUVMRChJRF9DSEFOTkVMUywgVFlQRV9VSU5ULCBzdHJ1Y3QgYXVkaW8sIGNoYW5uZWxzKSwKKyAgRV9GSUVMRChJRF9CSVRfREVQVEgsIFRZUEVfVUlOVCwgc3RydWN0IGF1ZGlvLCBiaXRfZGVwdGgpLAorICBFX0xBU1QKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfdHJhY2tfZW50cnlfZWxlbWVudHNbXSA9IHsKKyAgRV9GSUVMRChJRF9UUkFDS19OVU1CRVIsIFRZUEVfVUlOVCwgc3RydWN0IHRyYWNrX2VudHJ5LCBudW1iZXIpLAorICBFX0ZJRUxEKElEX1RSQUNLX1VJRCwgVFlQRV9VSU5ULCBzdHJ1Y3QgdHJhY2tfZW50cnksIHVpZCksCisgIEVfRklFTEQoSURfVFJBQ0tfVFlQRSwgVFlQRV9VSU5ULCBzdHJ1Y3QgdHJhY2tfZW50cnksIHR5cGUpLAorICBFX0ZJRUxEKElEX0ZMQUdfRU5BQkxFRCwgVFlQRV9VSU5ULCBzdHJ1Y3QgdHJhY2tfZW50cnksIGZsYWdfZW5hYmxlZCksCisgIEVfRklFTEQoSURfRkxBR19ERUZBVUxULCBUWVBFX1VJTlQsIHN0cnVjdCB0cmFja19lbnRyeSwgZmxhZ19kZWZhdWx0KSwKKyAgRV9GSUVMRChJRF9GTEFHX0xBQ0lORywgVFlQRV9VSU5ULCBzdHJ1Y3QgdHJhY2tfZW50cnksIGZsYWdfbGFjaW5nKSwKKyAgRV9GSUVMRChJRF9UUkFDS19USU1FQ09ERV9TQ0FMRSwgVFlQRV9GTE9BVCwgc3RydWN0IHRyYWNrX2VudHJ5LCB0cmFja190aW1lY29kZV9zY2FsZSksCisgIEVfRklFTEQoSURfTEFOR1VBR0UsIFRZUEVfU1RSSU5HLCBzdHJ1Y3QgdHJhY2tfZW50cnksIGxhbmd1YWdlKSwKKyAgRV9GSUVMRChJRF9DT0RFQ19JRCwgVFlQRV9TVFJJTkcsIHN0cnVjdCB0cmFja19lbnRyeSwgY29kZWNfaWQpLAorICBFX0ZJRUxEKElEX0NPREVDX1BSSVZBVEUsIFRZUEVfQklOQVJZLCBzdHJ1Y3QgdHJhY2tfZW50cnksIGNvZGVjX3ByaXZhdGUpLAorICBFX1NJTkdMRV9NQVNURVIoSURfVklERU8sIFRZUEVfTUFTVEVSLCBzdHJ1Y3QgdHJhY2tfZW50cnksIHZpZGVvKSwKKyAgRV9TSU5HTEVfTUFTVEVSKElEX0FVRElPLCBUWVBFX01BU1RFUiwgc3RydWN0IHRyYWNrX2VudHJ5LCBhdWRpbyksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV90cmFja3NfZWxlbWVudHNbXSA9IHsKKyAgRV9NQVNURVIoSURfVFJBQ0tfRU5UUlksIFRZUEVfTUFTVEVSLCBzdHJ1Y3QgdHJhY2tzLCB0cmFja19lbnRyeSksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9jdWVfdHJhY2tfcG9zaXRpb25zX2VsZW1lbnRzW10gPSB7CisgIEVfRklFTEQoSURfQ1VFX1RSQUNLLCBUWVBFX1VJTlQsIHN0cnVjdCBjdWVfdHJhY2tfcG9zaXRpb25zLCB0cmFjayksCisgIEVfRklFTEQoSURfQ1VFX0NMVVNURVJfUE9TSVRJT04sIFRZUEVfVUlOVCwgc3RydWN0IGN1ZV90cmFja19wb3NpdGlvbnMsIGNsdXN0ZXJfcG9zaXRpb24pLAorICBFX0ZJRUxEKElEX0NVRV9CTE9DS19OVU1CRVIsIFRZUEVfVUlOVCwgc3RydWN0IGN1ZV90cmFja19wb3NpdGlvbnMsIGJsb2NrX251bWJlciksCisgIEVfTEFTVAorfTsKKworc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9jdWVfcG9pbnRfZWxlbWVudHNbXSA9IHsKKyAgRV9GSUVMRChJRF9DVUVfVElNRSwgVFlQRV9VSU5ULCBzdHJ1Y3QgY3VlX3BvaW50LCB0aW1lKSwKKyAgRV9NQVNURVIoSURfQ1VFX1RSQUNLX1BPU0lUSU9OUywgVFlQRV9NQVNURVIsIHN0cnVjdCBjdWVfcG9pbnQsIGN1ZV90cmFja19wb3NpdGlvbnMpLAorICBFX0xBU1QKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfY3Vlc19lbGVtZW50c1tdID0geworICBFX01BU1RFUihJRF9DVUVfUE9JTlQsIFRZUEVfTUFTVEVSLCBzdHJ1Y3QgY3VlcywgY3VlX3BvaW50KSwKKyAgRV9MQVNUCit9OworCitzdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX3NlZ21lbnRfZWxlbWVudHNbXSA9IHsKKyAgRV9NQVNURVIoSURfU0VFS19IRUFELCBUWVBFX01BU1RFUiwgc3RydWN0IHNlZ21lbnQsIHNlZWtfaGVhZCksCisgIEVfU0lOR0xFX01BU1RFUihJRF9JTkZPLCBUWVBFX01BU1RFUiwgc3RydWN0IHNlZ21lbnQsIGluZm8pLAorICBFX01BU1RFUihJRF9DTFVTVEVSLCBUWVBFX01BU1RFUiwgc3RydWN0IHNlZ21lbnQsIGNsdXN0ZXIpLAorICBFX1NJTkdMRV9NQVNURVIoSURfVFJBQ0tTLCBUWVBFX01BU1RFUiwgc3RydWN0IHNlZ21lbnQsIHRyYWNrcyksCisgIEVfU0lOR0xFX01BU1RFUihJRF9DVUVTLCBUWVBFX01BU1RFUiwgc3RydWN0IHNlZ21lbnQsIGN1ZXMpLAorICBFX0xBU1QKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfdG9wX2xldmVsX2VsZW1lbnRzW10gPSB7CisgIEVfU0lOR0xFX01BU1RFUihJRF9FQk1MLCBUWVBFX01BU1RFUiwgbmVzdGVnZywgZWJtbCksCisgIEVfU0lOR0xFX01BU1RFUl9PKElEX1NFR01FTlQsIFRZUEVfTUFTVEVSLCBuZXN0ZWdnLCBzZWdtZW50KSwKKyAgRV9MQVNUCit9OworCisjdW5kZWYgRV9GSUVMRAorI3VuZGVmIEVfTUFTVEVSCisjdW5kZWYgRV9TSU5HTEVfTUFTVEVSX08KKyN1bmRlZiBFX1NJTkdMRV9NQVNURVIKKyN1bmRlZiBFX1NVU1BFTkQKKyN1bmRlZiBFX0xBU1QKKworc3RhdGljIHN0cnVjdCBwb29sX2N0eCAqCituZV9wb29sX2luaXQodm9pZCkKK3sKKyAgc3RydWN0IHBvb2xfY3R4ICogcG9vbDsKKworICBwb29sID0gaF9tYWxsb2Moc2l6ZW9mKCpwb29sKSk7CisgIGlmICghcG9vbCkKKyAgICBhYm9ydCgpOworICByZXR1cm4gcG9vbDsKK30KKworc3RhdGljIHZvaWQKK25lX3Bvb2xfZGVzdHJveShzdHJ1Y3QgcG9vbF9jdHggKiBwb29sKQoreworICBoX2ZyZWUocG9vbCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK25lX3Bvb2xfYWxsb2Moc2l6ZV90IHNpemUsIHN0cnVjdCBwb29sX2N0eCAqIHBvb2wpCit7CisgIHZvaWQgKiBwOworCisgIHAgPSBoX21hbGxvYyhzaXplKTsKKyAgaWYgKCFwKQorICAgIGFib3J0KCk7CisgIGhhdHRhY2gocCwgcG9vbCk7CisgIG1lbXNldChwLCAwLCBzaXplKTsKKyAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkICoKK25lX2FsbG9jKHNpemVfdCBzaXplKQoreworICB2b2lkICogcDsKKworICBwID0gY2FsbG9jKDEsIHNpemUpOworICBpZiAoIXApCisgICAgYWJvcnQoKTsKKyAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQKK25lX2lvX3JlYWQobmVzdGVnZ19pbyAqIGlvLCB2b2lkICogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworICByZXR1cm4gaW8tPnJlYWQoYnVmZmVyLCBsZW5ndGgsIGlvLT51c2VyZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQKK25lX2lvX3NlZWsobmVzdGVnZ19pbyAqIGlvLCBpbnQ2NF90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgcmV0dXJuIGlvLT5zZWVrKG9mZnNldCwgd2hlbmNlLCBpby0+dXNlcmRhdGEpOworfQorCitzdGF0aWMgaW50CituZV9pb19yZWFkX3NraXAobmVzdGVnZ19pbyAqIGlvLCBzaXplX3QgbGVuZ3RoKQoreworICBzaXplX3QgZ2V0OworICB1bnNpZ25lZCBjaGFyIGJ1Zls4MTkyXTsKKyAgaW50IHIgPSAxOworCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgZ2V0ID0gbGVuZ3RoIDwgc2l6ZW9mKGJ1ZikgPyBsZW5ndGggOiBzaXplb2YoYnVmKTsKKyAgICByID0gbmVfaW9fcmVhZChpbywgYnVmLCBnZXQpOworICAgIGlmIChyICE9IDEpCisgICAgICBicmVhazsKKyAgICBsZW5ndGggLT0gZ2V0OworICB9CisKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQ2NF90CituZV9pb190ZWxsKG5lc3RlZ2dfaW8gKiBpbykKK3sKKyAgcmV0dXJuIGlvLT50ZWxsKGlvLT51c2VyZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQKK25lX2JhcmVfcmVhZF92aW50KG5lc3RlZ2dfaW8gKiBpbywgdWludDY0X3QgKiB2YWx1ZSwgdWludDY0X3QgKiBsZW5ndGgsIGVudW0gdmludF9tYXNrIG1hc2tmbGFnKQoreworICBpbnQgcjsKKyAgdW5zaWduZWQgY2hhciBiOworICBzaXplX3QgbWF4bGVuID0gODsKKyAgdW5zaWduZWQgaW50IGNvdW50ID0gMSwgbWFzayA9IDEgPDwgNzsKKworICByID0gbmVfaW9fcmVhZChpbywgJmIsIDEpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworCisgIHdoaWxlIChjb3VudCA8IG1heGxlbikgeworICAgIGlmICgoYiAmIG1hc2spICE9IDApCisgICAgICBicmVhazsKKyAgICBtYXNrID4+PSAxOworICAgIGNvdW50ICs9IDE7CisgIH0KKworICBpZiAobGVuZ3RoKQorICAgICpsZW5ndGggPSBjb3VudDsKKyAgKnZhbHVlID0gYjsKKworICBpZiAobWFza2ZsYWcgPT0gTUFTS19GSVJTVF9CSVQpCisgICAgKnZhbHVlID0gYiAmIH5tYXNrOworCisgIHdoaWxlICgtLWNvdW50KSB7CisgICAgciA9IG5lX2lvX3JlYWQoaW8sICZiLCAxKTsKKyAgICBpZiAociAhPSAxKQorICAgICAgcmV0dXJuIHI7CisgICAgKnZhbHVlIDw8PSA4OworICAgICp2YWx1ZSB8PSBiOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK25lX3JlYWRfaWQobmVzdGVnZ19pbyAqIGlvLCB1aW50NjRfdCAqIHZhbHVlLCB1aW50NjRfdCAqIGxlbmd0aCkKK3sKKyAgcmV0dXJuIG5lX2JhcmVfcmVhZF92aW50KGlvLCB2YWx1ZSwgbGVuZ3RoLCBNQVNLX05PTkUpOworfQorCitzdGF0aWMgaW50CituZV9yZWFkX3ZpbnQobmVzdGVnZ19pbyAqIGlvLCB1aW50NjRfdCAqIHZhbHVlLCB1aW50NjRfdCAqIGxlbmd0aCkKK3sKKyAgcmV0dXJuIG5lX2JhcmVfcmVhZF92aW50KGlvLCB2YWx1ZSwgbGVuZ3RoLCBNQVNLX0ZJUlNUX0JJVCk7Cit9CisKK3N0YXRpYyBpbnQKK25lX3JlYWRfc3ZpbnQobmVzdGVnZ19pbyAqIGlvLCBpbnQ2NF90ICogdmFsdWUsIHVpbnQ2NF90ICogbGVuZ3RoKQoreworICBpbnQgcjsKKyAgdWludDY0X3QgdXZhbHVlOworICB1aW50NjRfdCB1bGVuZ3RoOworICBpbnQ2NF90IHN2aW50X3N1YnRyW10gPSB7CisgICAgMHgzZiwgMHgxZmZmLAorICAgIDB4ZmZmZmYsIDB4N2ZmZmZmZiwKKyAgICAweDNmZmZmZmZmZkxMLCAweDFmZmZmZmZmZmZmTEwsCisgICAgMHhmZmZmZmZmZmZmZmZMTCwgMHg3ZmZmZmZmZmZmZmZmZkxMCisgIH07CisKKyAgciA9IG5lX2JhcmVfcmVhZF92aW50KGlvLCAmdXZhbHVlLCAmdWxlbmd0aCwgTUFTS19GSVJTVF9CSVQpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworICAqdmFsdWUgPSB1dmFsdWUgLSBzdmludF9zdWJ0clt1bGVuZ3RoIC0gMV07CisgIGlmIChsZW5ndGgpCisgICAgKmxlbmd0aCA9IHVsZW5ndGg7CisgIHJldHVybiByOworfQorCitzdGF0aWMgaW50CituZV9yZWFkX3VpbnQobmVzdGVnZ19pbyAqIGlvLCB1aW50NjRfdCAqIHZhbCwgdWludDY0X3QgbGVuZ3RoKQoreworICB1bnNpZ25lZCBjaGFyIGI7CisgIGludCByOworCisgIGlmIChsZW5ndGggPT0gMCB8fCBsZW5ndGggPiA4KQorICAgIHJldHVybiAtMTsKKyAgciA9IG5lX2lvX3JlYWQoaW8sICZiLCAxKTsKKyAgaWYgKHIgIT0gMSkKKyAgICByZXR1cm4gcjsKKyAgKnZhbCA9IGI7CisgIHdoaWxlICgtLWxlbmd0aCkgeworICAgIHIgPSBuZV9pb19yZWFkKGlvLCAmYiwgMSk7CisgICAgaWYgKHIgIT0gMSkKKyAgICAgIHJldHVybiByOworICAgICp2YWwgPDw9IDg7CisgICAgKnZhbCB8PSBiOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CituZV9yZWFkX2ludChuZXN0ZWdnX2lvICogaW8sIGludDY0X3QgKiB2YWwsIHVpbnQ2NF90IGxlbmd0aCkKK3sKKyAgaW50IHI7CisgIHVpbnQ2NF90IHV2YWwsIGJhc2U7CisKKyAgciA9IG5lX3JlYWRfdWludChpbywgJnV2YWwsIGxlbmd0aCk7CisgIGlmIChyICE9IDEpCisgICAgcmV0dXJuIHI7CisKKyAgaWYgKGxlbmd0aCA8IHNpemVvZihpbnQ2NF90KSkgeworICAgIGJhc2UgPSAxOworICAgIGJhc2UgPDw9IGxlbmd0aCAqIDggLSAxOworICAgIGlmICh1dmFsID49IGJhc2UpIHsKKyAgICAgICAgYmFzZSA9IDE7CisgICAgICAgIGJhc2UgPDw9IGxlbmd0aCAqIDg7CisgICAgfSBlbHNlIHsKKyAgICAgIGJhc2UgPSAwOworICAgIH0KKyAgICAqdmFsID0gdXZhbCAtIGJhc2U7CisgIH0gZWxzZSB7CisgICAgKnZhbCA9IChpbnQ2NF90KSB1dmFsOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK25lX3JlYWRfZmxvYXQobmVzdGVnZ19pbyAqIGlvLCBkb3VibGUgKiB2YWwsIHVpbnQ2NF90IGxlbmd0aCkKK3sKKyAgdW5pb24geworICAgIHVpbnQ2NF90IHU7CisgICAgZmxvYXQgZjsKKyAgICBkb3VibGUgZDsKKyAgfSB2YWx1ZTsKKyAgaW50IHI7CisKKyAgLyogbGVuZ3RoID09IDEwIG5vdCBpbXBsZW1lbnRlZCAqLworICBpZiAobGVuZ3RoICE9IDQgJiYgbGVuZ3RoICE9IDgpCisgICAgcmV0dXJuIC0xOworICByID0gbmVfcmVhZF91aW50KGlvLCAmdmFsdWUudSwgbGVuZ3RoKTsKKyAgaWYgKHIgIT0gMSkKKyAgICByZXR1cm4gcjsKKyAgaWYgKGxlbmd0aCA9PSA0KQorICAgICp2YWwgPSB2YWx1ZS5mOworICBlbHNlCisgICAgKnZhbCA9IHZhbHVlLmQ7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CituZV9yZWFkX3N0cmluZyhuZXN0ZWdnICogY3R4LCBjaGFyICoqIHZhbCwgdWludDY0X3QgbGVuZ3RoKQoreworICBjaGFyICogc3RyOworICBpbnQgcjsKKworICBpZiAobGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gTElNSVRfU1RSSU5HKQorICAgIHJldHVybiAtMTsKKyAgc3RyID0gbmVfcG9vbF9hbGxvYyhsZW5ndGggKyAxLCBjdHgtPmFsbG9jX3Bvb2wpOworICByID0gbmVfaW9fcmVhZChjdHgtPmlvLCAodW5zaWduZWQgY2hhciAqKSBzdHIsIGxlbmd0aCk7CisgIGlmIChyICE9IDEpCisgICAgcmV0dXJuIHI7CisgIHN0cltsZW5ndGhdID0gJ1wwJzsKKyAgKnZhbCA9IHN0cjsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK25lX3JlYWRfYmluYXJ5KG5lc3RlZ2cgKiBjdHgsIHN0cnVjdCBlYm1sX2JpbmFyeSAqIHZhbCwgdWludDY0X3QgbGVuZ3RoKQoreworICBpZiAobGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gTElNSVRfQklOQVJZKQorICAgIHJldHVybiAtMTsKKyAgdmFsLT5kYXRhID0gbmVfcG9vbF9hbGxvYyhsZW5ndGgsIGN0eC0+YWxsb2NfcG9vbCk7CisgIHZhbC0+bGVuZ3RoID0gbGVuZ3RoOworICByZXR1cm4gbmVfaW9fcmVhZChjdHgtPmlvLCB2YWwtPmRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQKK25lX2dldF91aW50KHN0cnVjdCBlYm1sX3R5cGUgdHlwZSwgdWludDY0X3QgKiB2YWx1ZSkKK3sKKyAgaWYgKCF0eXBlLnJlYWQpCisgICAgcmV0dXJuIC0xOworCisgIGFzc2VydCh0eXBlLnR5cGUgPT0gVFlQRV9VSU5UKTsKKworICAqdmFsdWUgPSB0eXBlLnYudTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmVfZ2V0X2Zsb2F0KHN0cnVjdCBlYm1sX3R5cGUgdHlwZSwgZG91YmxlICogdmFsdWUpCit7CisgIGlmICghdHlwZS5yZWFkKQorICAgIHJldHVybiAtMTsKKworICBhc3NlcnQodHlwZS50eXBlID09IFRZUEVfRkxPQVQpOworCisgICp2YWx1ZSA9IHR5cGUudi5mOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZV9nZXRfc3RyaW5nKHN0cnVjdCBlYm1sX3R5cGUgdHlwZSwgY2hhciAqKiB2YWx1ZSkKK3sKKyAgaWYgKCF0eXBlLnJlYWQpCisgICAgcmV0dXJuIC0xOworCisgIGFzc2VydCh0eXBlLnR5cGUgPT0gVFlQRV9TVFJJTkcpOworCisgICp2YWx1ZSA9IHR5cGUudi5zOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZV9nZXRfYmluYXJ5KHN0cnVjdCBlYm1sX3R5cGUgdHlwZSwgc3RydWN0IGVibWxfYmluYXJ5ICogdmFsdWUpCit7CisgIGlmICghdHlwZS5yZWFkKQorICAgIHJldHVybiAtMTsKKworICBhc3NlcnQodHlwZS50eXBlID09IFRZUEVfQklOQVJZKTsKKworICAqdmFsdWUgPSB0eXBlLnYuYjsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmVfaXNfYW5jZXN0b3JfZWxlbWVudCh1aW50NjRfdCBpZCwgc3RydWN0IGxpc3Rfbm9kZSAqIGFuY2VzdG9yKQoreworICBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBlbGVtZW50OworCisgIGZvciAoOyBhbmNlc3RvcjsgYW5jZXN0b3IgPSBhbmNlc3Rvci0+cHJldmlvdXMpCisgICAgZm9yIChlbGVtZW50ID0gYW5jZXN0b3ItPm5vZGU7IGVsZW1lbnQtPmlkOyArK2VsZW1lbnQpCisgICAgICBpZiAoZWxlbWVudC0+aWQgPT0gaWQpCisgICAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjICoKK25lX2ZpbmRfZWxlbWVudCh1aW50NjRfdCBpZCwgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjICogZWxlbWVudHMpCit7CisgIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIGVsZW1lbnQ7CisKKyAgZm9yIChlbGVtZW50ID0gZWxlbWVudHM7IGVsZW1lbnQtPmlkOyArK2VsZW1lbnQpCisgICAgaWYgKGVsZW1lbnQtPmlkID09IGlkKQorICAgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCituZV9jdHhfcHVzaChuZXN0ZWdnICogY3R4LCBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBhbmNlc3Rvciwgdm9pZCAqIGRhdGEpCit7CisgIHN0cnVjdCBsaXN0X25vZGUgKiBpdGVtOworCisgIGl0ZW0gPSBuZV9hbGxvYyhzaXplb2YoKml0ZW0pKTsKKyAgaXRlbS0+cHJldmlvdXMgPSBjdHgtPmFuY2VzdG9yOworICBpdGVtLT5ub2RlID0gYW5jZXN0b3I7CisgIGl0ZW0tPmRhdGEgPSBkYXRhOworICBjdHgtPmFuY2VzdG9yID0gaXRlbTsKK30KKworc3RhdGljIHZvaWQKK25lX2N0eF9wb3AobmVzdGVnZyAqIGN0eCkKK3sKKyAgc3RydWN0IGxpc3Rfbm9kZSAqIGl0ZW07CisKKyAgaXRlbSA9IGN0eC0+YW5jZXN0b3I7CisgIGN0eC0+YW5jZXN0b3IgPSBpdGVtLT5wcmV2aW91czsKKyAgZnJlZShpdGVtKTsKK30KKworc3RhdGljIGludAorbmVfY3R4X3NhdmUobmVzdGVnZyAqIGN0eCwgc3RydWN0IHNhdmVkX3N0YXRlICogcykKK3sKKyAgcy0+c3RyZWFtX29mZnNldCA9IG5lX2lvX3RlbGwoY3R4LT5pbyk7CisgIGlmIChzLT5zdHJlYW1fb2Zmc2V0IDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHMtPmFuY2VzdG9yID0gY3R4LT5hbmNlc3RvcjsKKyAgcy0+bGFzdF9pZCA9IGN0eC0+bGFzdF9pZDsKKyAgcy0+bGFzdF9zaXplID0gY3R4LT5sYXN0X3NpemU7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZV9jdHhfcmVzdG9yZShuZXN0ZWdnICogY3R4LCBzdHJ1Y3Qgc2F2ZWRfc3RhdGUgKiBzKQoreworICBpbnQgcjsKKworICByID0gbmVfaW9fc2VlayhjdHgtPmlvLCBzLT5zdHJlYW1fb2Zmc2V0LCBORVNURUdHX1NFRUtfU0VUKTsKKyAgaWYgKHIgIT0gMCkKKyAgICByZXR1cm4gLTE7CisgIGN0eC0+YW5jZXN0b3IgPSBzLT5hbmNlc3RvcjsKKyAgY3R4LT5sYXN0X2lkID0gcy0+bGFzdF9pZDsKKyAgY3R4LT5sYXN0X3NpemUgPSBzLT5sYXN0X3NpemU7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZV9wZWVrX2VsZW1lbnQobmVzdGVnZyAqIGN0eCwgdWludDY0X3QgKiBpZCwgdWludDY0X3QgKiBzaXplKQoreworICBpbnQgcjsKKworICBpZiAoY3R4LT5sYXN0X2lkICYmIGN0eC0+bGFzdF9zaXplKSB7CisgICAgaWYgKGlkKQorICAgICAgKmlkID0gY3R4LT5sYXN0X2lkOworICAgIGlmIChzaXplKQorICAgICAgKnNpemUgPSBjdHgtPmxhc3Rfc2l6ZTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHIgPSBuZV9yZWFkX2lkKGN0eC0+aW8sICZjdHgtPmxhc3RfaWQsIE5VTEwpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworCisgIHIgPSBuZV9yZWFkX3ZpbnQoY3R4LT5pbywgJmN0eC0+bGFzdF9zaXplLCBOVUxMKTsKKyAgaWYgKHIgIT0gMSkKKyAgICByZXR1cm4gcjsKKworICBpZiAoaWQpCisgICAgKmlkID0gY3R4LT5sYXN0X2lkOworICBpZiAoc2l6ZSkKKyAgICAqc2l6ZSA9IGN0eC0+bGFzdF9zaXplOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CituZV9yZWFkX2VsZW1lbnQobmVzdGVnZyAqIGN0eCwgdWludDY0X3QgKiBpZCwgdWludDY0X3QgKiBzaXplKQoreworICBpbnQgcjsKKworICByID0gbmVfcGVla19lbGVtZW50KGN0eCwgaWQsIHNpemUpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworCisgIGN0eC0+bGFzdF9pZCA9IDA7CisgIGN0eC0+bGFzdF9zaXplID0gMDsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK25lX3JlYWRfbWFzdGVyKG5lc3RlZ2cgKiBjdHgsIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIGRlc2MpCit7CisgIHN0cnVjdCBlYm1sX2xpc3QgKiBsaXN0OworICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiBub2RlLCAqIG9sZHRhaWw7CisKKyAgYXNzZXJ0KGRlc2MtPnR5cGUgPT0gVFlQRV9NQVNURVIgJiYgZGVzYy0+ZmxhZ3MgJiBERVNDX0ZMQUdfTVVMVEkpOworCisgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJtdWx0aSBtYXN0ZXIgZWxlbWVudCAlbGx4ICglcykiLAorICAgICAgICAgICBkZXNjLT5pZCwgZGVzYy0+bmFtZSk7CisKKyAgbGlzdCA9IChzdHJ1Y3QgZWJtbF9saXN0ICopIChjdHgtPmFuY2VzdG9yLT5kYXRhICsgZGVzYy0+b2Zmc2V0KTsKKworICBub2RlID0gbmVfcG9vbF9hbGxvYyhzaXplb2YoKm5vZGUpLCBjdHgtPmFsbG9jX3Bvb2wpOworICBub2RlLT5pZCA9IGRlc2MtPmlkOworICBub2RlLT5kYXRhID0gbmVfcG9vbF9hbGxvYyhkZXNjLT5zaXplLCBjdHgtPmFsbG9jX3Bvb2wpOworCisgIG9sZHRhaWwgPSBsaXN0LT50YWlsOworICBpZiAob2xkdGFpbCkKKyAgICBvbGR0YWlsLT5uZXh0ID0gbm9kZTsKKyAgbGlzdC0+dGFpbCA9IG5vZGU7CisgIGlmICghbGlzdC0+aGVhZCkKKyAgICBsaXN0LT5oZWFkID0gbm9kZTsKKworICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAiIC0+IHVzaW5nIGRhdGEgJXAiLCBub2RlLT5kYXRhKTsKKworICBuZV9jdHhfcHVzaChjdHgsIGRlc2MtPmNoaWxkcmVuLCBub2RlLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK25lX3JlYWRfc2luZ2xlX21hc3RlcihuZXN0ZWdnICogY3R4LCBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBkZXNjKQoreworICBhc3NlcnQoZGVzYy0+dHlwZSA9PSBUWVBFX01BU1RFUiAmJiAhKGRlc2MtPmZsYWdzICYgREVTQ19GTEFHX01VTFRJKSk7CisKKyAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgInNpbmdsZSBtYXN0ZXIgZWxlbWVudCAlbGx4ICglcykiLAorICAgICAgICAgICBkZXNjLT5pZCwgZGVzYy0+bmFtZSk7CisgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICIgLT4gdXNpbmcgZGF0YSAlcCAoJXUpIiwKKyAgICAgICAgICAgY3R4LT5hbmNlc3Rvci0+ZGF0YSArIGRlc2MtPm9mZnNldCwgZGVzYy0+b2Zmc2V0KTsKKworICBuZV9jdHhfcHVzaChjdHgsIGRlc2MtPmNoaWxkcmVuLCBjdHgtPmFuY2VzdG9yLT5kYXRhICsgZGVzYy0+b2Zmc2V0KTsKK30KKworc3RhdGljIGludAorbmVfcmVhZF9zaW1wbGUobmVzdGVnZyAqIGN0eCwgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjICogZGVzYywgc2l6ZV90IGxlbmd0aCkKK3sKKyAgc3RydWN0IGVibWxfdHlwZSAqIHN0b3JhZ2U7CisgIGludCByOworCisgIHN0b3JhZ2UgPSAoc3RydWN0IGVibWxfdHlwZSAqKSAoY3R4LT5hbmNlc3Rvci0+ZGF0YSArIGRlc2MtPm9mZnNldCk7CisKKyAgaWYgKHN0b3JhZ2UtPnJlYWQpIHsKKyAgICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAiZWxlbWVudCAlbGx4ICglcykgYWxyZWFkeSByZWFkLCBza2lwcGluZyIsCisgICAgICAgICAgICAgZGVzYy0+aWQsIGRlc2MtPm5hbWUpOworICAgIHJldHVybiAwOworICB9CisKKyAgc3RvcmFnZS0+dHlwZSA9IGRlc2MtPnR5cGU7CisKKyAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgImVsZW1lbnQgJWxseCAoJXMpIC0+ICVwICgldSkiLAorICAgICAgICAgICBkZXNjLT5pZCwgZGVzYy0+bmFtZSwgc3RvcmFnZSwgZGVzYy0+b2Zmc2V0KTsKKworICByID0gLTE7CisKKyAgc3dpdGNoIChkZXNjLT50eXBlKSB7CisgIGNhc2UgVFlQRV9VSU5UOgorICAgIHIgPSBuZV9yZWFkX3VpbnQoY3R4LT5pbywgJnN0b3JhZ2UtPnYudSwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0ZMT0FUOgorICAgIHIgPSBuZV9yZWFkX2Zsb2F0KGN0eC0+aW8sICZzdG9yYWdlLT52LmYsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9JTlQ6CisgICAgciA9IG5lX3JlYWRfaW50KGN0eC0+aW8sICZzdG9yYWdlLT52LmksIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgciA9IG5lX3JlYWRfc3RyaW5nKGN0eCwgJnN0b3JhZ2UtPnYucywgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0JJTkFSWToKKyAgICByID0gbmVfcmVhZF9iaW5hcnkoY3R4LCAmc3RvcmFnZS0+di5iLCBsZW5ndGgpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfTUFTVEVSOgorICBjYXNlIFRZUEVfVU5LTk9XTjoKKyAgICBhc3NlcnQoMCk7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAociA9PSAxKQorICAgIHN0b3JhZ2UtPnJlYWQgPSAxOworCisgIHJldHVybiByOworfQorCitzdGF0aWMgaW50CituZV9wYXJzZShuZXN0ZWdnICogY3R4LCBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiB0b3BfbGV2ZWwpCit7CisgIGludCByOworICBpbnQ2NF90ICogZGF0YV9vZmZzZXQ7CisgIHVpbnQ2NF90IGlkLCBzaXplOworICBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBlbGVtZW50OworCisgIC8qIGxvb3AgdW50aWwgd2UgbmVlZCB0byByZXR1cm46CisgICAgIC0gaGl0IHN1c3BlbmQgcG9pbnQKKyAgICAgLSBwYXJzZSBjb21wbGV0ZQorICAgICAtIGVycm9yIG9jY3VycmVkICovCisKKyAgLyogbG9vcCBvdmVyIGVsZW1lbnRzIGF0IGN1cnJlbnQgbGV2ZWwgcmVhZGluZyB0aGVtIGlmIHN1YmxldmVsIGZvdW5kLAorICAgICBwdXNoIGN0eCBvbnRvIHN0YWNrIGFuZCBjb250aW51ZSBpZiBzdWJsZXZlbCBlbmRlZCwgcG9wIGN0eCBvZmYgc3RhY2sKKyAgICAgYW5kIGNvbnRpbnVlICovCisKKyAgaWYgKCFjdHgtPmFuY2VzdG9yKQorICAgIHJldHVybiAtMTsKKworICBmb3IgKDs7KSB7CisgICAgciA9IG5lX3BlZWtfZWxlbWVudChjdHgsICZpZCwgJnNpemUpOworICAgIGlmIChyICE9IDEpCisgICAgICBicmVhazsKKworICAgIGVsZW1lbnQgPSBuZV9maW5kX2VsZW1lbnQoaWQsIGN0eC0+YW5jZXN0b3ItPm5vZGUpOworICAgIGlmIChlbGVtZW50KSB7CisgICAgICBpZiAoZWxlbWVudC0+ZmxhZ3MgJiBERVNDX0ZMQUdfU1VTUEVORCkgeworICAgICAgICBhc3NlcnQoZWxlbWVudC0+dHlwZSA9PSBUWVBFX0JJTkFSWSk7CisgICAgICAgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJzdXNwZW5kIHBhcnNlIGF0ICVsbHgiLCBpZCk7CisgICAgICAgIHIgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgciA9IG5lX3JlYWRfZWxlbWVudChjdHgsICZpZCwgJnNpemUpOworICAgICAgaWYgKHIgIT0gMSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChlbGVtZW50LT5mbGFncyAmIERFU0NfRkxBR19PRkZTRVQpIHsKKyAgICAgICAgZGF0YV9vZmZzZXQgPSAoaW50NjRfdCAqKSAoY3R4LT5hbmNlc3Rvci0+ZGF0YSArIGVsZW1lbnQtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgKmRhdGFfb2Zmc2V0ID0gbmVfaW9fdGVsbChjdHgtPmlvKTsKKyAgICAgICAgaWYgKCpkYXRhX29mZnNldCA8IDApIHsKKyAgICAgICAgICByID0gLTE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGVsZW1lbnQtPnR5cGUgPT0gVFlQRV9NQVNURVIpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQtPmZsYWdzICYgREVTQ19GTEFHX01VTFRJKQorICAgICAgICAgIG5lX3JlYWRfbWFzdGVyKGN0eCwgZWxlbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuZV9yZWFkX3NpbmdsZV9tYXN0ZXIoY3R4LCBlbGVtZW50KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByID0gbmVfcmVhZF9zaW1wbGUoY3R4LCBlbGVtZW50LCBzaXplKTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobmVfaXNfYW5jZXN0b3JfZWxlbWVudChpZCwgY3R4LT5hbmNlc3Rvci0+cHJldmlvdXMpKSB7CisgICAgICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAicGFyZW50IGVsZW1lbnQgJWxseCIsIGlkKTsKKyAgICAgIGlmICh0b3BfbGV2ZWwgJiYgY3R4LT5hbmNlc3Rvci0+bm9kZSA9PSB0b3BfbGV2ZWwpIHsKKyAgICAgICAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgIioqKiBwYXJzZSBhYm91dCB0byBiYWNrIHVwIHBhc3QgdG9wX2xldmVsIik7CisgICAgICAgIHIgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG5lX2N0eF9wb3AoY3R4KTsKKyAgICB9IGVsc2UgeworICAgICAgciA9IG5lX3JlYWRfZWxlbWVudChjdHgsICZpZCwgJnNpemUpOworICAgICAgaWYgKHIgIT0gMSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChpZCAhPSBJRF9WT0lEICYmIGlkICE9IElEX0NSQzMyKQorICAgICAgICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAidW5rbm93biBlbGVtZW50ICVsbHgiLCBpZCk7CisgICAgICByID0gbmVfaW9fcmVhZF9za2lwKGN0eC0+aW8sIHNpemUpOworICAgICAgaWYgKHIgIT0gMSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHIgIT0gMSkKKyAgICB3aGlsZSAoY3R4LT5hbmNlc3RvcikKKyAgICAgIG5lX2N0eF9wb3AoY3R4KTsKKworICByZXR1cm4gcjsKK30KKworc3RhdGljIHVpbnQ2NF90CituZV94aXBoX2xhY2VfdmFsdWUodW5zaWduZWQgY2hhciAqKiBucCkKK3sKKyAgdWludDY0X3QgbGFjZTsKKyAgdWludDY0X3QgdmFsdWU7CisgIHVuc2lnbmVkIGNoYXIgKiBwID0gKm5wOworCisgIGxhY2UgPSAqcCsrOworICB2YWx1ZSA9IGxhY2U7CisgIHdoaWxlIChsYWNlID09IDI1NSkgeworICAgIGxhY2UgPSAqcCsrOworICAgIHZhbHVlICs9IGxhY2U7CisgIH0KKworICAqbnAgPSBwOworCisgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludAorbmVfcmVhZF94aXBoX2xhY2VfdmFsdWUobmVzdGVnZ19pbyAqIGlvLCB1aW50NjRfdCAqIHZhbHVlLCBzaXplX3QgKiBjb25zdW1lZCkKK3sKKyAgaW50IHI7CisgIHVpbnQ2NF90IGxhY2U7CisKKyAgciA9IG5lX3JlYWRfdWludChpbywgJmxhY2UsIDEpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworICAqY29uc3VtZWQgKz0gMTsKKworICAqdmFsdWUgPSBsYWNlOworICB3aGlsZSAobGFjZSA9PSAyNTUpIHsKKyAgICByID0gbmVfcmVhZF91aW50KGlvLCAmbGFjZSwgMSk7CisgICAgaWYgKHIgIT0gMSkKKyAgICAgIHJldHVybiByOworICAgICpjb25zdW1lZCArPSAxOworICAgICp2YWx1ZSArPSBsYWNlOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK25lX3JlYWRfeGlwaF9sYWNpbmcobmVzdGVnZ19pbyAqIGlvLCBzaXplX3QgYmxvY2ssIHNpemVfdCAqIHJlYWQsIHVpbnQ2NF90IG4sIHVpbnQ2NF90ICogc2l6ZXMpCit7CisgIGludCByOworICBzaXplX3QgaSA9IDA7CisgIHVpbnQ2NF90IHN1bSA9IDA7CisKKyAgd2hpbGUgKC0tbikgeworICAgIHIgPSBuZV9yZWFkX3hpcGhfbGFjZV92YWx1ZShpbywgJnNpemVzW2ldLCByZWFkKTsKKyAgICBpZiAociAhPSAxKQorICAgICAgcmV0dXJuIHI7CisgICAgc3VtICs9IHNpemVzW2ldOworICAgIGkgKz0gMTsKKyAgfQorCisgIGlmICgqcmVhZCArIHN1bSA+IGJsb2NrKQorICAgIHJldHVybiAtMTsKKworICAvKiBsYXN0IGZyYW1lIGlzIHRoZSByZW1haW5kZXIgb2YgdGhlIGJsb2NrICovCisgIHNpemVzW2ldID0gYmxvY2sgLSAqcmVhZCAtIHN1bTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK25lX3JlYWRfZWJtbF9sYWNpbmcobmVzdGVnZ19pbyAqIGlvLCBzaXplX3QgYmxvY2ssIHNpemVfdCAqIHJlYWQsIHVpbnQ2NF90IG4sIHVpbnQ2NF90ICogc2l6ZXMpCit7CisgIGludCByOworICB1aW50NjRfdCBsYWNlLCBzdW0sIGxlbmd0aDsKKyAgaW50NjRfdCBzbGFjZTsKKyAgc2l6ZV90IGkgPSAwOworCisgIHIgPSBuZV9yZWFkX3ZpbnQoaW8sICZsYWNlLCAmbGVuZ3RoKTsKKyAgaWYgKHIgIT0gMSkKKyAgICByZXR1cm4gcjsKKyAgKnJlYWQgKz0gbGVuZ3RoOworCisgIHNpemVzW2ldID0gbGFjZTsKKyAgc3VtID0gc2l6ZXNbaV07CisKKyAgaSArPSAxOworICBuIC09IDE7CisKKyAgd2hpbGUgKC0tbikgeworICAgIHIgPSBuZV9yZWFkX3N2aW50KGlvLCAmc2xhY2UsICZsZW5ndGgpOworICAgIGlmIChyICE9IDEpCisgICAgICByZXR1cm4gcjsKKyAgICAqcmVhZCArPSBsZW5ndGg7CisgICAgc2l6ZXNbaV0gPSBzaXplc1tpIC0gMV0gKyBzbGFjZTsKKyAgICBzdW0gKz0gc2l6ZXNbaV07CisgICAgaSArPSAxOworICB9CisKKyAgaWYgKCpyZWFkICsgc3VtID4gYmxvY2spCisgICAgcmV0dXJuIC0xOworCisgIC8qIGxhc3QgZnJhbWUgaXMgdGhlIHJlbWFpbmRlciBvZiB0aGUgYmxvY2sgKi8KKyAgc2l6ZXNbaV0gPSBibG9jayAtICpyZWFkIC0gc3VtOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHVpbnQ2NF90CituZV9nZXRfdGltZWNvZGVfc2NhbGUobmVzdGVnZyAqIGN0eCkKK3sKKyAgdWludDY0X3Qgc2NhbGU7CisKKyAgaWYgKG5lX2dldF91aW50KGN0eC0+c2VnbWVudC5pbmZvLnRpbWVjb2RlX3NjYWxlLCAmc2NhbGUpICE9IDApCisgICAgc2NhbGUgPSAxMDAwMDAwOworCisgIHJldHVybiBzY2FsZTsKK30KKworc3RhdGljIHN0cnVjdCB0cmFja19lbnRyeSAqCituZV9maW5kX3RyYWNrX2VudHJ5KG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCB0cmFjaykKK3sKKyAgc3RydWN0IGVibWxfbGlzdF9ub2RlICogbm9kZTsKKyAgdW5zaWduZWQgaW50IHRyYWNrcyA9IDA7CisKKyAgbm9kZSA9IGN0eC0+c2VnbWVudC50cmFja3MudHJhY2tfZW50cnkuaGVhZDsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBhc3NlcnQobm9kZS0+aWQgPT0gSURfVFJBQ0tfRU5UUlkpOworICAgIGlmICh0cmFjayA9PSB0cmFja3MpCisgICAgICByZXR1cm4gbm9kZS0+ZGF0YTsKKyAgICB0cmFja3MgKz0gMTsKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CituZV9yZWFkX2Jsb2NrKG5lc3RlZ2cgKiBjdHgsIHVpbnQ2NF90IGJsb2NrX2lkLCB1aW50NjRfdCBibG9ja19zaXplLCBuZXN0ZWdnX3BhY2tldCAqKiBkYXRhKQoreworICBpbnQgcjsKKyAgaW50NjRfdCB0aW1lY29kZSwgYWJzX3RpbWVjb2RlOworICBuZXN0ZWdnX3BhY2tldCAqIHBrdDsKKyAgc3RydWN0IGNsdXN0ZXIgKiBjbHVzdGVyOworICBzdHJ1Y3QgZnJhbWUgKiBmLCAqIGxhc3Q7CisgIHN0cnVjdCB0cmFja19lbnRyeSAqIGVudHJ5OworICBkb3VibGUgdHJhY2tfc2NhbGU7CisgIHVpbnQ2NF90IHRyYWNrLCBsZW5ndGgsIGZyYW1lX3NpemVzWzI1Nl0sIGNsdXN0ZXJfdGMsIGZsYWdzLCBmcmFtZXMsIHRjX3NjYWxlLCB0b3RhbDsKKyAgdW5zaWduZWQgaW50IGksIGxhY2luZzsKKyAgc2l6ZV90IGNvbnN1bWVkID0gMDsKKworICAqZGF0YSA9IE5VTEw7CisKKyAgaWYgKGJsb2NrX3NpemUgPiBMSU1JVF9CTE9DSykKKyAgICByZXR1cm4gLTE7CisKKyAgciA9IG5lX3JlYWRfdmludChjdHgtPmlvLCAmdHJhY2ssICZsZW5ndGgpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworCisgIGlmICh0cmFjayA9PSAwIHx8IHRyYWNrID4gY3R4LT50cmFja19jb3VudCkKKyAgICByZXR1cm4gLTE7CisKKyAgY29uc3VtZWQgKz0gbGVuZ3RoOworCisgIHIgPSBuZV9yZWFkX2ludChjdHgtPmlvLCAmdGltZWNvZGUsIDIpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworCisgIGNvbnN1bWVkICs9IDI7CisKKyAgciA9IG5lX3JlYWRfdWludChjdHgtPmlvLCAmZmxhZ3MsIDEpOworICBpZiAociAhPSAxKQorICAgIHJldHVybiByOworCisgIGNvbnN1bWVkICs9IDE7CisKKyAgZnJhbWVzID0gMDsKKworICAvKiBmbGFncyBhcmUgZGlmZmVyZW50IGJldHdlZW4gYmxvY2sgYW5kIHNpbXBsZWJsb2NrLCBidXQgbGFjaW5nIGlzCisgICAgIGVuY29kZWQgdGhlIHNhbWUgd2F5ICovCisgIGxhY2luZyA9IChmbGFncyAmIEJMT0NLX0ZMQUdTX0xBQ0lORykgPj4gMTsKKworICBzd2l0Y2ggKGxhY2luZykgeworICBjYXNlIExBQ0lOR19OT05FOgorICAgIGZyYW1lcyA9IDE7CisgICAgYnJlYWs7CisgIGNhc2UgTEFDSU5HX1hJUEg6CisgIGNhc2UgTEFDSU5HX0ZJWEVEOgorICBjYXNlIExBQ0lOR19FQk1MOgorICAgIHIgPSBuZV9yZWFkX3VpbnQoY3R4LT5pbywgJmZyYW1lcywgMSk7CisgICAgaWYgKHIgIT0gMSkKKyAgICAgIHJldHVybiByOworICAgIGNvbnN1bWVkICs9IDE7CisgICAgZnJhbWVzICs9IDE7CisgIH0KKworICBpZiAoZnJhbWVzID4gMjU2KQorICAgIHJldHVybiAtMTsKKworICBzd2l0Y2ggKGxhY2luZykgeworICBjYXNlIExBQ0lOR19OT05FOgorICAgIGZyYW1lX3NpemVzWzBdID0gYmxvY2tfc2l6ZSAtIGNvbnN1bWVkOworICAgIGJyZWFrOworICBjYXNlIExBQ0lOR19YSVBIOgorICAgIGlmIChmcmFtZXMgPT0gMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICByID0gbmVfcmVhZF94aXBoX2xhY2luZyhjdHgtPmlvLCBibG9ja19zaXplLCAmY29uc3VtZWQsIGZyYW1lcywgZnJhbWVfc2l6ZXMpOworICAgIGlmIChyICE9IDEpCisgICAgICByZXR1cm4gcjsKKyAgICBicmVhazsKKyAgY2FzZSBMQUNJTkdfRklYRUQ6CisgICAgaWYgKChibG9ja19zaXplIC0gY29uc3VtZWQpICUgZnJhbWVzKQorICAgICAgcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkKKyAgICAgIGZyYW1lX3NpemVzW2ldID0gKGJsb2NrX3NpemUgLSBjb25zdW1lZCkgLyBmcmFtZXM7CisgICAgYnJlYWs7CisgIGNhc2UgTEFDSU5HX0VCTUw6CisgICAgaWYgKGZyYW1lcyA9PSAxKQorICAgICAgcmV0dXJuIC0xOworICAgIHIgPSBuZV9yZWFkX2VibWxfbGFjaW5nKGN0eC0+aW8sIGJsb2NrX3NpemUsICZjb25zdW1lZCwgZnJhbWVzLCBmcmFtZV9zaXplcyk7CisgICAgaWYgKHIgIT0gMSkKKyAgICAgIHJldHVybiByOworICAgIGJyZWFrOworICB9CisKKyAgLyogc2FuaXR5IGNoZWNrIHVubGFjZWQgZnJhbWUgc2l6ZXMgYWdhaW5zdCB0b3RhbCBibG9jayBzaXplLiAqLworICB0b3RhbCA9IGNvbnN1bWVkOworICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpCisgICAgdG90YWwgKz0gZnJhbWVfc2l6ZXNbaV07CisgIGlmICh0b3RhbCA+IGJsb2NrX3NpemUpCisgICAgcmV0dXJuIC0xOworCisgIGVudHJ5ID0gbmVfZmluZF90cmFja19lbnRyeShjdHgsICh1bnNpZ25lZCBpbnQpKHRyYWNrIC0gMSkpOworICBpZiAoIWVudHJ5KQorICAgIHJldHVybiAtMTsKKworICB0cmFja19zY2FsZSA9IDEuMDsKKworICB0Y19zY2FsZSA9IG5lX2dldF90aW1lY29kZV9zY2FsZShjdHgpOworCisgIGFzc2VydChjdHgtPnNlZ21lbnQuY2x1c3Rlci50YWlsLT5pZCA9PSBJRF9DTFVTVEVSKTsKKyAgY2x1c3RlciA9IGN0eC0+c2VnbWVudC5jbHVzdGVyLnRhaWwtPmRhdGE7CisgIGlmIChuZV9nZXRfdWludChjbHVzdGVyLT50aW1lY29kZSwgJmNsdXN0ZXJfdGMpICE9IDApCisgICAgcmV0dXJuIC0xOworCisgIGFic190aW1lY29kZSA9IHRpbWVjb2RlICsgY2x1c3Rlcl90YzsKKyAgaWYgKGFic190aW1lY29kZSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIHBrdCA9IG5lX2FsbG9jKHNpemVvZigqcGt0KSk7CisgIHBrdC0+dHJhY2sgPSB0cmFjayAtIDE7CisgIHBrdC0+dGltZWNvZGUgPSAodWludDY0X3QpKGFic190aW1lY29kZSAqIHRjX3NjYWxlICogdHJhY2tfc2NhbGUpOworCisgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICIlc2Jsb2NrIHQgJWxsZCBwdHMgJWYgZiAlbGx4IGZyYW1lczogJWxsdSIsCisgICAgICAgICAgIGJsb2NrX2lkID09IElEX0JMT0NLID8gIiIgOiAic2ltcGxlIiwgcGt0LT50cmFjaywgcGt0LT50aW1lY29kZSAvIDFlOSwgZmxhZ3MsIGZyYW1lcyk7CisKKyAgbGFzdCA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgIGlmIChmcmFtZV9zaXplc1tpXSA+IExJTUlUX0ZSQU1FKSB7CisgICAgICBuZXN0ZWdnX2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGYgPSBuZV9hbGxvYyhzaXplb2YoKmYpKTsKKyAgICBmLT5kYXRhID0gbmVfYWxsb2MoZnJhbWVfc2l6ZXNbaV0pOworICAgIGYtPmxlbmd0aCA9IGZyYW1lX3NpemVzW2ldOworICAgIHIgPSBuZV9pb19yZWFkKGN0eC0+aW8sIGYtPmRhdGEsIGZyYW1lX3NpemVzW2ldKTsKKyAgICBpZiAociAhPSAxKSB7CisgICAgICBmcmVlKGYtPmRhdGEpOworICAgICAgZnJlZShmKTsKKyAgICAgIG5lc3RlZ2dfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIWxhc3QpCisgICAgICBwa3QtPmZyYW1lID0gZjsKKyAgICBlbHNlCisgICAgICBsYXN0LT5uZXh0ID0gZjsKKyAgICBsYXN0ID0gZjsKKyAgfQorCisgICpkYXRhID0gcGt0OworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdWludDY0X3QKK25lX2J1Zl9yZWFkX2lkKHVuc2lnbmVkIGNoYXIgY29uc3QgKiBwLCBzaXplX3QgbGVuZ3RoKQoreworICB1aW50NjRfdCBpZCA9IDA7CisKKyAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgaWQgPDw9IDg7CisgICAgaWQgfD0gKnArKzsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworc3RhdGljIHN0cnVjdCBzZWVrICoKK25lX2ZpbmRfc2Vla19mb3JfaWQoc3RydWN0IGVibWxfbGlzdF9ub2RlICogc2Vla19oZWFkLCB1aW50NjRfdCBpZCkKK3sKKyAgc3RydWN0IGVibWxfbGlzdCAqIGhlYWQ7CisgIHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIHNlZWs7CisgIHN0cnVjdCBlYm1sX2JpbmFyeSBiaW5hcnlfaWQ7CisgIHN0cnVjdCBzZWVrICogczsKKworICB3aGlsZSAoc2Vla19oZWFkKSB7CisgICAgYXNzZXJ0KHNlZWtfaGVhZC0+aWQgPT0gSURfU0VFS19IRUFEKTsKKyAgICBoZWFkID0gc2Vla19oZWFkLT5kYXRhOworICAgIHNlZWsgPSBoZWFkLT5oZWFkOworCisgICAgd2hpbGUgKHNlZWspIHsKKyAgICAgIGFzc2VydChzZWVrLT5pZCA9PSBJRF9TRUVLKTsKKyAgICAgIHMgPSBzZWVrLT5kYXRhOworCisgICAgICBpZiAobmVfZ2V0X2JpbmFyeShzLT5pZCwgJmJpbmFyeV9pZCkgPT0gMCAmJgorICAgICAgICAgIG5lX2J1Zl9yZWFkX2lkKGJpbmFyeV9pZC5kYXRhLCBiaW5hcnlfaWQubGVuZ3RoKSA9PSBpZCkKKyAgICAgICAgcmV0dXJuIHM7CisKKyAgICAgIHNlZWsgPSBzZWVrLT5uZXh0OworICAgIH0KKworICAgIHNlZWtfaGVhZCA9IHNlZWtfaGVhZC0+bmV4dDsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGN1ZV9wb2ludCAqCituZV9maW5kX2N1ZV9wb2ludF9mb3JfdHN0YW1wKHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIGN1ZV9wb2ludCwgdWludDY0X3Qgc2NhbGUsIHVpbnQ2NF90IHRzdGFtcCkKK3sKKyAgdWludDY0X3QgdGltZTsKKyAgc3RydWN0IGN1ZV9wb2ludCAqIGMsICogcHJldiA9IE5VTEw7CisKKyAgd2hpbGUgKGN1ZV9wb2ludCkgeworICAgIGFzc2VydChjdWVfcG9pbnQtPmlkID09IElEX0NVRV9QT0lOVCk7CisgICAgYyA9IGN1ZV9wb2ludC0+ZGF0YTsKKworICAgIGlmICghcHJldikKKyAgICAgIHByZXYgPSBjOworCisgICAgaWYgKG5lX2dldF91aW50KGMtPnRpbWUsICZ0aW1lKSA9PSAwICYmIHRpbWUgKiBzY2FsZSA+IHRzdGFtcCkKKyAgICAgIGJyZWFrOworCisgICAgcHJldiA9IGN1ZV9wb2ludC0+ZGF0YTsKKyAgICBjdWVfcG9pbnQgPSBjdWVfcG9pbnQtPm5leHQ7CisgIH0KKworICByZXR1cm4gcHJldjsKK30KKworc3RhdGljIGludAorbmVfaXNfc3VzcGVuZF9lbGVtZW50KHVpbnQ2NF90IGlkKQoreworICAvKiB0aGlzIGNvdWxkIHNlYXJjaCB0aGUgdHJlZSBvZiBlbGVtZW50cyBmb3IgREVTQ19GTEFHX1NVU1BFTkQgKi8KKyAgaWYgKGlkID09IElEX1NJTVBMRV9CTE9DSyB8fCBpZCA9PSBJRF9CTE9DSykKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCituZV9udWxsX2xvZ19jYWxsYmFjayhuZXN0ZWdnICogY3R4LCB1bnNpZ25lZCBpbnQgc2V2ZXJpdHksIGNoYXIgY29uc3QgKiBmbXQsIC4uLikKK3sKKyAgaWYgKGN0eCAmJiBzZXZlcml0eSAmJiBmbXQpCisgICAgcmV0dXJuOworfQorCitpbnQKK25lc3RlZ2dfaW5pdChuZXN0ZWdnICoqIGNvbnRleHQsIG5lc3RlZ2dfaW8gaW8sIG5lc3RlZ2dfbG9nIGNhbGxiYWNrKQoreworICBpbnQgcjsKKyAgdWludDY0X3QgaWQsIHZlcnNpb24sIGRvY3ZlcnNpb247CisgIHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIHRyYWNrOworICBjaGFyICogZG9jdHlwZTsKKyAgbmVzdGVnZyAqIGN0eCA9IE5VTEw7CisKKyAgaWYgKCEoaW8ucmVhZCAmJiBpby5zZWVrICYmIGlvLnRlbGwpKQorICAgIHJldHVybiAtMTsKKworICBjdHggPSBuZV9hbGxvYyhzaXplb2YoKmN0eCkpOworCisgIGN0eC0+aW8gPSBuZV9hbGxvYyhzaXplb2YoKmN0eC0+aW8pKTsKKyAgKmN0eC0+aW8gPSBpbzsKKyAgY3R4LT5sb2cgPSBjYWxsYmFjazsKKyAgY3R4LT5hbGxvY19wb29sID0gbmVfcG9vbF9pbml0KCk7CisKKyAgaWYgKCFjdHgtPmxvZykKKyAgICBjdHgtPmxvZyA9IG5lX251bGxfbG9nX2NhbGxiYWNrOworCisgIHIgPSBuZV9wZWVrX2VsZW1lbnQoY3R4LCAmaWQsIE5VTEwpOworICBpZiAociAhPSAxKSB7CisgICAgbmVzdGVnZ19kZXN0cm95KGN0eCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGlkICE9IElEX0VCTUwpIHsKKyAgICBuZXN0ZWdnX2Rlc3Ryb3koY3R4KTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAiY3R4ICVwIiwgY3R4KTsKKworICBuZV9jdHhfcHVzaChjdHgsIG5lX3RvcF9sZXZlbF9lbGVtZW50cywgY3R4KTsKKworICByID0gbmVfcGFyc2UoY3R4LCBOVUxMKTsKKworICBpZiAociAhPSAxKSB7CisgICAgbmVzdGVnZ19kZXN0cm95KGN0eCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKG5lX2dldF91aW50KGN0eC0+ZWJtbC5lYm1sX3JlYWRfdmVyc2lvbiwgJnZlcnNpb24pICE9IDApCisgICAgdmVyc2lvbiA9IDE7CisgIGlmICh2ZXJzaW9uICE9IDEpIHsKKyAgICBuZXN0ZWdnX2Rlc3Ryb3koY3R4KTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAobmVfZ2V0X3N0cmluZyhjdHgtPmVibWwuZG9jdHlwZSwgJmRvY3R5cGUpICE9IDApCisgICAgZG9jdHlwZSA9ICJtYXRyb3NrYSI7CisgIGlmIChzdHJjbXAoZG9jdHlwZSwgIndlYm0iKSAhPSAwKSB7CisgICAgbmVzdGVnZ19kZXN0cm95KGN0eCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKG5lX2dldF91aW50KGN0eC0+ZWJtbC5kb2N0eXBlX3JlYWRfdmVyc2lvbiwgJmRvY3ZlcnNpb24pICE9IDApCisgICAgZG9jdmVyc2lvbiA9IDE7CisgIGlmIChkb2N2ZXJzaW9uIDwgMSB8fCBkb2N2ZXJzaW9uID4gMikgeworICAgIG5lc3RlZ2dfZGVzdHJveShjdHgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghY3R4LT5zZWdtZW50LnRyYWNrcy50cmFja19lbnRyeS5oZWFkKSB7CisgICAgbmVzdGVnZ19kZXN0cm95KGN0eCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdHJhY2sgPSBjdHgtPnNlZ21lbnQudHJhY2tzLnRyYWNrX2VudHJ5LmhlYWQ7CisgIGN0eC0+dHJhY2tfY291bnQgPSAwOworCisgIHdoaWxlICh0cmFjaykgeworICAgIGN0eC0+dHJhY2tfY291bnQgKz0gMTsKKyAgICB0cmFjayA9IHRyYWNrLT5uZXh0OworICB9CisKKyAgKmNvbnRleHQgPSBjdHg7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25lc3RlZ2dfZGVzdHJveShuZXN0ZWdnICogY3R4KQoreworICB3aGlsZSAoY3R4LT5hbmNlc3RvcikKKyAgICBuZV9jdHhfcG9wKGN0eCk7CisgIG5lX3Bvb2xfZGVzdHJveShjdHgtPmFsbG9jX3Bvb2wpOworICBmcmVlKGN0eC0+aW8pOworICBmcmVlKGN0eCk7Cit9CisKK2ludAorbmVzdGVnZ19kdXJhdGlvbihuZXN0ZWdnICogY3R4LCB1aW50NjRfdCAqIGR1cmF0aW9uKQoreworICB1aW50NjRfdCB0Y19zY2FsZTsKKyAgZG91YmxlIHVuc2NhbGVkX2R1cmF0aW9uOworCisgIGlmIChuZV9nZXRfZmxvYXQoY3R4LT5zZWdtZW50LmluZm8uZHVyYXRpb24sICZ1bnNjYWxlZF9kdXJhdGlvbikgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgdGNfc2NhbGUgPSBuZV9nZXRfdGltZWNvZGVfc2NhbGUoY3R4KTsKKworICAqZHVyYXRpb24gPSAodWludDY0X3QpICh1bnNjYWxlZF9kdXJhdGlvbiAqIHRjX3NjYWxlKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbmVzdGVnZ190c3RhbXBfc2NhbGUobmVzdGVnZyAqIGN0eCwgdWludDY0X3QgKiBzY2FsZSkKK3sKKyAgKnNjYWxlID0gbmVfZ2V0X3RpbWVjb2RlX3NjYWxlKGN0eCk7CisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfdHJhY2tfY291bnQobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50ICogdHJhY2tzKQoreworICAqdHJhY2tzID0gY3R4LT50cmFja19jb3VudDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbmVzdGVnZ190cmFja19zZWVrKG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCB0cmFjaywgdWludDY0X3QgdHN0YW1wKQoreworICBpbnQgcjsKKyAgc3RydWN0IGN1ZV9wb2ludCAqIGN1ZV9wb2ludDsKKyAgc3RydWN0IGN1ZV90cmFja19wb3NpdGlvbnMgKiBwb3M7CisgIHN0cnVjdCBzYXZlZF9zdGF0ZSBzdGF0ZTsKKyAgc3RydWN0IHNlZWsgKiBmb3VuZDsKKyAgdWludDY0X3Qgc2Vla19wb3MsIHRjX3NjYWxlLCB0LCBpZDsKKyAgc3RydWN0IGVibWxfbGlzdF9ub2RlICogbm9kZSA9IGN0eC0+c2VnbWVudC5jdWVzLmN1ZV9wb2ludC5oZWFkOworCisgIC8qIElmIHRoZXJlIGFyZSBubyBjdWVzIGxvYWRlZCwgY2hlY2sgZm9yIGN1ZXMgZWxlbWVudCBpbiB0aGUgc2VlayBoZWFkCisgICAgIGFuZCBsb2FkIGl0LiAqLworICBpZiAoIW5vZGUpIHsKKyAgICBmb3VuZCA9IG5lX2ZpbmRfc2Vla19mb3JfaWQoY3R4LT5zZWdtZW50LnNlZWtfaGVhZC5oZWFkLCBJRF9DVUVTKTsKKyAgICBpZiAoIWZvdW5kKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKG5lX2dldF91aW50KGZvdW5kLT5wb3NpdGlvbiwgJnNlZWtfcG9zKSAhPSAwKQorICAgICAgcmV0dXJuIC0xOworCisgICAgLyogU2F2ZSBvbGQgcGFyc2VyIHN0YXRlLiAqLworICAgIHIgPSBuZV9jdHhfc2F2ZShjdHgsICZzdGF0ZSk7CisgICAgaWYgKHIgIT0gMCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIC8qIFNlZWsgYW5kIHNldCB1cCBwYXJzZXIgc3RhdGUgZm9yIHNlZ21lbnQtbGV2ZWwgZWxlbWVudCAoQ3VlcykuICovCisgICAgciA9IG5lX2lvX3NlZWsoY3R4LT5pbywgY3R4LT5zZWdtZW50X29mZnNldCArIHNlZWtfcG9zLCBORVNURUdHX1NFRUtfU0VUKTsKKyAgICBpZiAociAhPSAwKQorICAgICAgcmV0dXJuIC0xOworICAgIGN0eC0+bGFzdF9pZCA9IDA7CisgICAgY3R4LT5sYXN0X3NpemUgPSAwOworCisgICAgciA9IG5lX3JlYWRfZWxlbWVudChjdHgsICZpZCwgTlVMTCk7CisgICAgaWYgKHIgIT0gMSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChpZCAhPSBJRF9DVUVTKQorICAgICAgcmV0dXJuIC0xOworCisgICAgY3R4LT5hbmNlc3RvciA9IE5VTEw7CisgICAgbmVfY3R4X3B1c2goY3R4LCBuZV90b3BfbGV2ZWxfZWxlbWVudHMsIGN0eCk7CisgICAgbmVfY3R4X3B1c2goY3R4LCBuZV9zZWdtZW50X2VsZW1lbnRzLCAmY3R4LT5zZWdtZW50KTsKKyAgICBuZV9jdHhfcHVzaChjdHgsIG5lX2N1ZXNfZWxlbWVudHMsICZjdHgtPnNlZ21lbnQuY3Vlcyk7CisgICAgLyogcGFyc2VyIHdpbGwgcnVuIHVudGlsIGVuZCBvZiBjdWVzIGVsZW1lbnQuICovCisgICAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgInNlZWs6IHBhcnNpbmcgY3VlIGVsZW1lbnRzIik7CisgICAgciA9IG5lX3BhcnNlKGN0eCwgbmVfY3Vlc19lbGVtZW50cyk7CisgICAgd2hpbGUgKGN0eC0+YW5jZXN0b3IpCisgICAgICBuZV9jdHhfcG9wKGN0eCk7CisKKyAgICAvKiBSZXNldCBwYXJzZXIgc3RhdGUgdG8gb3JpZ2luYWwgc3RhdGUgYW5kIHNlZWsgYmFjayB0byBvbGQgcG9zaXRpb24uICovCisgICAgaWYgKG5lX2N0eF9yZXN0b3JlKGN0eCwgJnN0YXRlKSAhPSAwKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHIgPCAwKQorICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgdGNfc2NhbGUgPSBuZV9nZXRfdGltZWNvZGVfc2NhbGUoY3R4KTsKKworICBjdWVfcG9pbnQgPSBuZV9maW5kX2N1ZV9wb2ludF9mb3JfdHN0YW1wKGN0eC0+c2VnbWVudC5jdWVzLmN1ZV9wb2ludC5oZWFkLCB0Y19zY2FsZSwgdHN0YW1wKTsKKyAgaWYgKCFjdWVfcG9pbnQpCisgICAgcmV0dXJuIC0xOworCisgIG5vZGUgPSBjdWVfcG9pbnQtPmN1ZV90cmFja19wb3NpdGlvbnMuaGVhZDsKKworICBzZWVrX3BvcyA9IDA7CisKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBhc3NlcnQobm9kZS0+aWQgPT0gSURfQ1VFX1RSQUNLX1BPU0lUSU9OUyk7CisgICAgcG9zID0gbm9kZS0+ZGF0YTsKKyAgICBpZiAobmVfZ2V0X3VpbnQocG9zLT50cmFjaywgJnQpID09IDAgJiYgdCAtIDEgPT0gdHJhY2spIHsKKyAgICAgIGlmIChuZV9nZXRfdWludChwb3MtPmNsdXN0ZXJfcG9zaXRpb24sICZzZWVrX3BvcykgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5uZXh0OworICB9CisKKyAgLyogU2VlayBhbmQgc2V0IHVwIHBhcnNlciBzdGF0ZSBmb3Igc2VnbWVudC1sZXZlbCBlbGVtZW50IChDbHVzdGVyKS4gKi8KKyAgciA9IG5lX2lvX3NlZWsoY3R4LT5pbywgY3R4LT5zZWdtZW50X29mZnNldCArIHNlZWtfcG9zLCBORVNURUdHX1NFRUtfU0VUKTsKKyAgaWYgKHIgIT0gMCkKKyAgICByZXR1cm4gLTE7CisgIGN0eC0+bGFzdF9pZCA9IDA7CisgIGN0eC0+bGFzdF9zaXplID0gMDsKKworICB3aGlsZSAoY3R4LT5hbmNlc3RvcikKKyAgICBuZV9jdHhfcG9wKGN0eCk7CisKKyAgbmVfY3R4X3B1c2goY3R4LCBuZV90b3BfbGV2ZWxfZWxlbWVudHMsIGN0eCk7CisgIG5lX2N0eF9wdXNoKGN0eCwgbmVfc2VnbWVudF9lbGVtZW50cywgJmN0eC0+c2VnbWVudCk7CisgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJzZWVrOiBwYXJzaW5nIGNsdXN0ZXIgZWxlbWVudHMiKTsKKyAgciA9IG5lX3BhcnNlKGN0eCwgTlVMTCk7CisgIGlmIChyICE9IDEpCisgICAgcmV0dXJuIC0xOworCisgIGlmICghbmVfaXNfc3VzcGVuZF9lbGVtZW50KGN0eC0+bGFzdF9pZCkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfdHJhY2tfdHlwZShuZXN0ZWdnICogY3R4LCB1bnNpZ25lZCBpbnQgdHJhY2spCit7CisgIHN0cnVjdCB0cmFja19lbnRyeSAqIGVudHJ5OworICB1aW50NjRfdCB0eXBlOworCisgIGVudHJ5ID0gbmVfZmluZF90cmFja19lbnRyeShjdHgsIHRyYWNrKTsKKyAgaWYgKCFlbnRyeSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG5lX2dldF91aW50KGVudHJ5LT50eXBlLCAmdHlwZSkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHR5cGUgJiBUUkFDS19UWVBFX1ZJREVPKQorICAgIHJldHVybiBORVNURUdHX1RSQUNLX1ZJREVPOworCisgIGlmICh0eXBlICYgVFJBQ0tfVFlQRV9BVURJTykKKyAgICByZXR1cm4gTkVTVEVHR19UUkFDS19BVURJTzsKKworICByZXR1cm4gLTE7Cit9CisKK2ludAorbmVzdGVnZ190cmFja19jb2RlY19pZChuZXN0ZWdnICogY3R4LCB1bnNpZ25lZCBpbnQgdHJhY2spCit7CisgIGNoYXIgKiBjb2RlY19pZDsKKyAgc3RydWN0IHRyYWNrX2VudHJ5ICogZW50cnk7CisKKyAgZW50cnkgPSBuZV9maW5kX3RyYWNrX2VudHJ5KGN0eCwgdHJhY2spOworICBpZiAoIWVudHJ5KQorICAgIHJldHVybiAtMTsKKworICBpZiAobmVfZ2V0X3N0cmluZyhlbnRyeS0+Y29kZWNfaWQsICZjb2RlY19pZCkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHN0cmNtcChjb2RlY19pZCwgVFJBQ0tfSURfVlA4KSA9PSAwKQorICAgIHJldHVybiBORVNURUdHX0NPREVDX1ZQODsKKworICBpZiAoc3RyY21wKGNvZGVjX2lkLCBUUkFDS19JRF9WT1JCSVMpID09IDApCisgICAgcmV0dXJuIE5FU1RFR0dfQ09ERUNfVk9SQklTOworCisgIHJldHVybiAtMTsKK30KKworaW50CituZXN0ZWdnX3RyYWNrX2NvZGVjX2RhdGFfY291bnQobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50IHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqIGNvdW50KQoreworICBzdHJ1Y3QgdHJhY2tfZW50cnkgKiBlbnRyeTsKKyAgc3RydWN0IGVibWxfYmluYXJ5IGNvZGVjX3ByaXZhdGU7CisgIHVuc2lnbmVkIGNoYXIgKiBwOworCisgICpjb3VudCA9IDA7CisKKyAgZW50cnkgPSBuZV9maW5kX3RyYWNrX2VudHJ5KGN0eCwgdHJhY2spOworICBpZiAoIWVudHJ5KQorICAgIHJldHVybiAtMTsKKworICBpZiAobmVzdGVnZ190cmFja19jb2RlY19pZChjdHgsIHRyYWNrKSAhPSBORVNURUdHX0NPREVDX1ZPUkJJUykKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG5lX2dldF9iaW5hcnkoZW50cnktPmNvZGVjX3ByaXZhdGUsICZjb2RlY19wcml2YXRlKSAhPSAwKQorICAgIHJldHVybiAtMTsKKworICBpZiAoY29kZWNfcHJpdmF0ZS5sZW5ndGggPCAxKQorICAgIHJldHVybiAtMTsKKworICBwID0gY29kZWNfcHJpdmF0ZS5kYXRhOworICAqY291bnQgPSAqcCArIDE7CisKKyAgaWYgKCpjb3VudCA+IDMpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfdHJhY2tfY29kZWNfZGF0YShuZXN0ZWdnICogY3R4LCB1bnNpZ25lZCBpbnQgdHJhY2ssIHVuc2lnbmVkIGludCBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiogZGF0YSwgc2l6ZV90ICogbGVuZ3RoKQoreworICBzdHJ1Y3QgdHJhY2tfZW50cnkgKiBlbnRyeTsKKyAgc3RydWN0IGVibWxfYmluYXJ5IGNvZGVjX3ByaXZhdGU7CisgIHVpbnQ2NF90IHNpemVzWzNdLCB0b3RhbDsKKyAgdW5zaWduZWQgY2hhciAqIHA7CisgIHVuc2lnbmVkIGludCBjb3VudCwgaTsKKworICAqZGF0YSA9IE5VTEw7CisgICpsZW5ndGggPSAwOworCisgIGVudHJ5ID0gbmVfZmluZF90cmFja19lbnRyeShjdHgsIHRyYWNrKTsKKyAgaWYgKCFlbnRyeSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG5lc3RlZ2dfdHJhY2tfY29kZWNfaWQoY3R4LCB0cmFjaykgIT0gTkVTVEVHR19DT0RFQ19WT1JCSVMpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChuZV9nZXRfYmluYXJ5KGVudHJ5LT5jb2RlY19wcml2YXRlLCAmY29kZWNfcHJpdmF0ZSkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgcCA9IGNvZGVjX3ByaXZhdGUuZGF0YTsKKyAgY291bnQgPSAqcCsrICsgMTsKKworICBpZiAoY291bnQgPiAzKQorICAgIHJldHVybiAtMTsKKworICBpID0gMDsKKyAgdG90YWwgPSAwOworICB3aGlsZSAoLS1jb3VudCkgeworICAgIHNpemVzW2ldID0gbmVfeGlwaF9sYWNlX3ZhbHVlKCZwKTsKKyAgICB0b3RhbCArPSBzaXplc1tpXTsKKyAgICBpICs9IDE7CisgIH0KKyAgc2l6ZXNbaV0gPSBjb2RlY19wcml2YXRlLmxlbmd0aCAtIHRvdGFsIC0gKHAgLSBjb2RlY19wcml2YXRlLmRhdGEpOworCisgIGZvciAoaSA9IDA7IGkgPCBpdGVtOyArK2kpIHsKKyAgICBpZiAoc2l6ZXNbaV0gPiBMSU1JVF9GUkFNRSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBwICs9IHNpemVzW2ldOworICB9CisgICpkYXRhID0gcDsKKyAgKmxlbmd0aCA9IHNpemVzW2l0ZW1dOworCisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfdHJhY2tfdmlkZW9fcGFyYW1zKG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZ2dfdmlkZW9fcGFyYW1zICogcGFyYW1zKQoreworICBzdHJ1Y3QgdHJhY2tfZW50cnkgKiBlbnRyeTsKKyAgdWludDY0X3QgdmFsdWU7CisKKyAgbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKKworICBlbnRyeSA9IG5lX2ZpbmRfdHJhY2tfZW50cnkoY3R4LCB0cmFjayk7CisgIGlmICghZW50cnkpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChuZXN0ZWdnX3RyYWNrX3R5cGUoY3R4LCB0cmFjaykgIT0gTkVTVEVHR19UUkFDS19WSURFTykKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG5lX2dldF91aW50KGVudHJ5LT52aWRlby5waXhlbF93aWR0aCwgJnZhbHVlKSAhPSAwKQorICAgIHJldHVybiAtMTsKKyAgcGFyYW1zLT53aWR0aCA9ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisKKyAgaWYgKG5lX2dldF91aW50KGVudHJ5LT52aWRlby5waXhlbF9oZWlnaHQsICZ2YWx1ZSkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisgIHBhcmFtcy0+aGVpZ2h0ID0gKHVuc2lnbmVkIGludCl2YWx1ZTsKKworICB2YWx1ZSA9IDA7CisgIG5lX2dldF91aW50KGVudHJ5LT52aWRlby5waXhlbF9jcm9wX2JvdHRvbSwgJnZhbHVlKTsKKyAgcGFyYW1zLT5jcm9wX2JvdHRvbSA9ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisKKyAgdmFsdWUgPSAwOworICBuZV9nZXRfdWludChlbnRyeS0+dmlkZW8ucGl4ZWxfY3JvcF90b3AsICZ2YWx1ZSk7CisgIHBhcmFtcy0+Y3JvcF90b3AgPSAodW5zaWduZWQgaW50KXZhbHVlOworCisgIHZhbHVlID0gMDsKKyAgbmVfZ2V0X3VpbnQoZW50cnktPnZpZGVvLnBpeGVsX2Nyb3BfbGVmdCwgJnZhbHVlKTsKKyAgcGFyYW1zLT5jcm9wX2xlZnQgPSAodW5zaWduZWQgaW50KXZhbHVlOworCisgIHZhbHVlID0gMDsKKyAgbmVfZ2V0X3VpbnQoZW50cnktPnZpZGVvLnBpeGVsX2Nyb3BfcmlnaHQsICZ2YWx1ZSk7CisgIHBhcmFtcy0+Y3JvcF9yaWdodCA9ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisKKyAgdmFsdWUgPSBwYXJhbXMtPndpZHRoOworICBuZV9nZXRfdWludChlbnRyeS0+dmlkZW8uZGlzcGxheV93aWR0aCwgJnZhbHVlKTsKKyAgcGFyYW1zLT5kaXNwbGF5X3dpZHRoID0gKHVuc2lnbmVkIGludCl2YWx1ZTsKKworICB2YWx1ZSA9IHBhcmFtcy0+aGVpZ2h0OworICBuZV9nZXRfdWludChlbnRyeS0+dmlkZW8uZGlzcGxheV9oZWlnaHQsICZ2YWx1ZSk7CisgIHBhcmFtcy0+ZGlzcGxheV9oZWlnaHQgPSAodW5zaWduZWQgaW50KXZhbHVlOworCisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfdHJhY2tfYXVkaW9fcGFyYW1zKG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZ2dfYXVkaW9fcGFyYW1zICogcGFyYW1zKQoreworICBzdHJ1Y3QgdHJhY2tfZW50cnkgKiBlbnRyeTsKKyAgdWludDY0X3QgdmFsdWU7CisKKyAgbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKKworICBlbnRyeSA9IG5lX2ZpbmRfdHJhY2tfZW50cnkoY3R4LCB0cmFjayk7CisgIGlmICghZW50cnkpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChuZXN0ZWdnX3RyYWNrX3R5cGUoY3R4LCB0cmFjaykgIT0gTkVTVEVHR19UUkFDS19BVURJTykKKyAgICByZXR1cm4gLTE7CisKKyAgcGFyYW1zLT5yYXRlID0gODAwMDsKKyAgbmVfZ2V0X2Zsb2F0KGVudHJ5LT5hdWRpby5zYW1wbGluZ19mcmVxdWVuY3ksICZwYXJhbXMtPnJhdGUpOworCisgIHZhbHVlID0gMTsKKyAgbmVfZ2V0X3VpbnQoZW50cnktPmF1ZGlvLmNoYW5uZWxzLCAmdmFsdWUpOworICBwYXJhbXMtPmNoYW5uZWxzID0gKHVuc2lnbmVkIGludCl2YWx1ZTsKKworICB2YWx1ZSA9IDE2OworICBuZV9nZXRfdWludChlbnRyeS0+YXVkaW8uYml0X2RlcHRoLCAmdmFsdWUpOworICBwYXJhbXMtPmRlcHRoID0gKHVuc2lnbmVkIGludCl2YWx1ZTsKKworICByZXR1cm4gMDsKK30KKworaW50CituZXN0ZWdnX3JlYWRfcGFja2V0KG5lc3RlZ2cgKiBjdHgsIG5lc3RlZ2dfcGFja2V0ICoqIHBrdCkKK3sKKyAgaW50IHI7CisgIHVpbnQ2NF90IGlkLCBzaXplOworCisgICpwa3QgPSBOVUxMOworCisgIGZvciAoOzspIHsKKyAgICByID0gbmVfcGVla19lbGVtZW50KGN0eCwgJmlkLCAmc2l6ZSk7CisgICAgaWYgKHIgIT0gMSkKKyAgICAgIHJldHVybiByOworCisgICAgLyogYW55IHN1c3BlbmQgZmllbGRzIG11c3QgYmUgaGFuZGxlZCBoZXJlICovCisgICAgaWYgKG5lX2lzX3N1c3BlbmRfZWxlbWVudChpZCkpIHsKKyAgICAgIHIgPSBuZV9yZWFkX2VsZW1lbnQoY3R4LCAmaWQsICZzaXplKTsKKyAgICAgIGlmIChyICE9IDEpCisgICAgICAgIHJldHVybiByOworCisgICAgICAvKiB0aGUgb25seSBzdXNwZW5kIGZpZWxkcyBhcmUgYmxvY2tzIGFuZCBzaW1wbGUgYmxvY2tzLCB3aGljaCB3ZQorICAgICAgICAgaGFuZGxlIGRpcmVjdGx5LiAqLworICAgICAgciA9IG5lX3JlYWRfYmxvY2soY3R4LCBpZCwgc2l6ZSwgcGt0KTsKKyAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHIgPSAgbmVfcGFyc2UoY3R4LCBOVUxMKTsKKyAgICBpZiAociAhPSAxKQorICAgICAgcmV0dXJuIHI7CisgIH0KKworICByZXR1cm4gMTsKK30KKwordm9pZAorbmVzdGVnZ19mcmVlX3BhY2tldChuZXN0ZWdnX3BhY2tldCAqIHBrdCkKK3sKKyAgc3RydWN0IGZyYW1lICogZnJhbWU7CisKKyAgd2hpbGUgKHBrdC0+ZnJhbWUpIHsKKyAgICBmcmFtZSA9IHBrdC0+ZnJhbWU7CisgICAgcGt0LT5mcmFtZSA9IGZyYW1lLT5uZXh0OworICAgIGZyZWUoZnJhbWUtPmRhdGEpOworICAgIGZyZWUoZnJhbWUpOworICB9CisKKyBmcmVlKHBrdCk7Cit9CisKK2ludAorbmVzdGVnZ19wYWNrZXRfdHJhY2sobmVzdGVnZ19wYWNrZXQgKiBwa3QsIHVuc2lnbmVkIGludCAqIHRyYWNrKQoreworICAqdHJhY2sgPSAodW5zaWduZWQgaW50KXBrdC0+dHJhY2s7CisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfcGFja2V0X3RzdGFtcChuZXN0ZWdnX3BhY2tldCAqIHBrdCwgdWludDY0X3QgKiB0c3RhbXApCit7CisgICp0c3RhbXAgPSBwa3QtPnRpbWVjb2RlOworICByZXR1cm4gMDsKK30KKworaW50CituZXN0ZWdnX3BhY2tldF9jb3VudChuZXN0ZWdnX3BhY2tldCAqIHBrdCwgdW5zaWduZWQgaW50ICogY291bnQpCit7CisgIHN0cnVjdCBmcmFtZSAqIGYgPSBwa3QtPmZyYW1lOworCisgICpjb3VudCA9IDA7CisKKyAgd2hpbGUgKGYpIHsKKyAgICAqY291bnQgKz0gMTsKKyAgICBmID0gZi0+bmV4dDsKKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQKK25lc3RlZ2dfcGFja2V0X2RhdGEobmVzdGVnZ19wYWNrZXQgKiBwa3QsIHVuc2lnbmVkIGludCBpdGVtLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCkKK3sKKyAgc3RydWN0IGZyYW1lICogZiA9IHBrdC0+ZnJhbWU7CisgIHVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKyAgKmRhdGEgPSBOVUxMOworICAqbGVuZ3RoID0gMDsKKworICB3aGlsZSAoZikgeworICAgIGlmIChjb3VudCA9PSBpdGVtKSB7CisgICAgICAqZGF0YSA9IGYtPmRhdGE7CisgICAgICAqbGVuZ3RoID0gZi0+bGVuZ3RoOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvdW50ICs9IDE7CisgICAgZiA9IGYtPm5leHQ7CisgIH0KKworICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9uZXN0ZWdnL3Rlc3QvdGVzdC5jIGIvbGlidnB4L25lc3RlZ2cvdGVzdC90ZXN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG5lc3RlZ2cvdGVzdC90ZXN0LmMKcmVuYW1lIHRvIGxpYnZweC9uZXN0ZWdnL3Rlc3QvdGVzdC5jCmRpZmYgLS1naXQgYS9saWJ2cHgvc29sdXRpb24ubWsgYi9saWJ2cHgvc29sdXRpb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4MzA1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC9zb2x1dGlvbi5tawpAQCAtMCwwICsxLDMyIEBACisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworIyBsaWJ2cHggcmV2ZXJzZSBkZXBlbmRlbmNpZXMgKHRhcmdldHMgdGhhdCBkZXBlbmQgb24gbGlidnB4KQorVlBYX05PTkRFUFM9JChhZGRzdWZmaXggLnZjcHJvaix2cHggZ3Rlc3Qgb2JqX2ludF9leHRyYWN0KQorVlBYX1JERVBTPSQoZm9yZWFjaCB2Y3AsXAorICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgJChWUFhfTk9OREVQUyksJF4pLCAtLWRlcD0kKHZjcDoudmNwcm9qPSk6dnB4KQorCit2cHguc2xuOiAkKHdpbGRjYXJkICoudmNwcm9qKQorCUBlY2hvICIgICAgW0NSRUFURV0gJEAiCisJJChTUkNfUEFUSF9CQVJFKS9idWlsZC9tYWtlL2dlbl9tc3ZzX3Nsbi5zaCBcCisgICAgICAgICAgICAkKGlmICQoZmlsdGVyIHZweC52Y3Byb2osJF4pLCQoVlBYX1JERVBTKSkgXAorICAgICAgICAgICAgLS1kZXA9dnB4Om9ial9pbnRfZXh0cmFjdCBcCisgICAgICAgICAgICAtLWRlcD10ZXN0X2xpYnZweDpndGVzdCBcCisgICAgICAgICAgICAtLXZlcj0kKENPTkZJR19WU19WRVJTSU9OKVwKKyAgICAgICAgICAgIC0tb3V0PSRAICReCit2cHguc2xuLm1rOiB2cHguc2xuCisJQHRydWUKKworUFJPSkVDVFMteWVzICs9IHZweC5zbG4gdnB4LnNsbi5taworLWluY2x1ZGUgdnB4LnNsbi5taworCisjIEFsd2F5cyBpbnN0YWxsIHRoaXMgZmlsZSwgYXMgaXQgaXMgYW4gdW5jb25kaXRpb25hbCBwb3N0LWJ1aWxkIHJ1bGUuCitJTlNUQUxMX01BUFMgKz0gc3JjLyUgICAgICQoU1JDX1BBVEhfQkFSRSkvJQorSU5TVEFMTC1TUkNTLXllcyAgICAgICAgICAgICs9ICQodGFyZ2V0KS5tawpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvYWNtX3JhbmRvbS5oIGIvbGlidnB4L3Rlc3QvYWNtX3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDg5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9hY21fcmFuZG9tLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIExJQlZQWF9URVNUX0FDTV9SQU5ET01fSF8KKyNkZWZpbmUgTElCVlBYX1RFU1RfQUNNX1JBTkRPTV9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ2cHgvdnB4X2ludGVnZXIuaCIKKworbmFtZXNwYWNlIGxpYnZweF90ZXN0IHsKKworY2xhc3MgQUNNUmFuZG9tIHsKKyBwdWJsaWM6CisgIEFDTVJhbmRvbSgpIHsKKyAgICBSZXNldChEZXRlcm1pbmlzdGljU2VlZCgpKTsKKyAgfQorCisgIGV4cGxpY2l0IEFDTVJhbmRvbShpbnQgc2VlZCkgeworICAgIFJlc2V0KHNlZWQpOworICB9CisKKyAgdm9pZCBSZXNldChpbnQgc2VlZCkgeworICAgIHNyYW5kKHNlZWQpOworICB9CisKKyAgdWludDhfdCBSYW5kOCh2b2lkKSB7CisgICAgcmV0dXJuIChyYW5kKCkgPj4gOCkgJiAweGZmOworICB9CisKKyAgaW50IFBzZXVkb1VuaWZvcm0oaW50IHJhbmdlKSB7CisgICAgcmV0dXJuIChyYW5kKCkgPj4gOCkgJSByYW5nZTsKKyAgfQorCisgIGludCBvcGVyYXRvcigpKGludCBuKSB7CisgICAgcmV0dXJuIFBzZXVkb1VuaWZvcm0obik7CisgIH0KKworICBzdGF0aWMgaW50IERldGVybWluaXN0aWNTZWVkKHZvaWQpIHsKKyAgICByZXR1cm4gMHhiYWJhOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGlidnB4X3Rlc3QKKworI2VuZGlmICAvLyBMSUJWUFhfVEVTVF9BQ01fUkFORE9NX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9hbHRyZWZfdGVzdC5jYyBiL2xpYnZweC90ZXN0L2FsdHJlZl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDU1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9hbHRyZWZfdGVzdC5jYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3QvZW5jb2RlX3Rlc3RfZHJpdmVyLmgiCisjaW5jbHVkZSAidGVzdC9pNDIwX3ZpZGVvX3NvdXJjZS5oIgorCituYW1lc3BhY2UgeworCisvLyBsb29rYWhlYWQgcmFuZ2U6IFtrTG9va0FoZWFkTWluLCBrTG9va0FoZWFkTWF4KS4KK2NvbnN0IGludCBrTG9va0FoZWFkTWluID0gNTsKK2NvbnN0IGludCBrTG9va0FoZWFkTWF4ID0gMjY7CisKK2NsYXNzIEFsdFJlZlRlc3QgOiBwdWJsaWMgbGlidnB4X3Rlc3Q6OkVuY29kZXJUZXN0LAorICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7CisgcHJvdGVjdGVkOgorICBBbHRSZWZUZXN0KCkgOiBhbHRyZWZfY291bnRfKDApIHt9CisgIHZpcnR1YWwgfkFsdFJlZlRlc3QoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBJbml0aWFsaXplQ29uZmlnKCk7CisgICAgU2V0TW9kZShsaWJ2cHhfdGVzdDo6a1R3b1Bhc3NHb29kKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBCZWdpblBhc3NIb29rKHVuc2lnbmVkIGludCBwYXNzKSB7CisgICAgYWx0cmVmX2NvdW50XyA9IDA7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgQ29udGludWUoKSBjb25zdCB7CisgICAgcmV0dXJuICFIYXNGYXRhbEZhaWx1cmUoKSAmJiAhYWJvcnRfOworICB9CisKKyAgdmlydHVhbCB2b2lkIFByZUVuY29kZUZyYW1lSG9vayhsaWJ2cHhfdGVzdDo6VmlkZW9Tb3VyY2UgKnZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnZweF90ZXN0OjpFbmNvZGVyICplbmNvZGVyKSB7CisgICAgaWYgKHZpZGVvLT5mcmFtZSgpID09IDEpIHsKKyAgICAgIGVuY29kZXItPkNvbnRyb2woVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwgMSk7CisgICAgICBlbmNvZGVyLT5Db250cm9sKFZQOEVfU0VUX0NQVVVTRUQsIDMpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBGcmFtZVBrdEhvb2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpIHsKKyAgICBpZiAocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0lOVklTSUJMRSkgKythbHRyZWZfY291bnRfOworICB9CisKKyAgaW50IGFsdHJlZl9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFsdHJlZl9jb3VudF87IH0KKworIHByaXZhdGU6CisgIGludCBhbHRyZWZfY291bnRfOworfTsKKworVEVTVF9QKEFsdFJlZlRlc3QsIE1vbm90b25pY1RpbWVzdGFtcHMpIHsKKyAgY29uc3QgdnB4X3JhdGlvbmFsIHRpbWViYXNlID0geyAzMzMzMzMzMywgMTAwMDAwMDAwMCB9OworICBjZmdfLmdfdGltZWJhc2UgPSB0aW1lYmFzZTsKKyAgY2ZnXy5yY190YXJnZXRfYml0cmF0ZSA9IDEwMDA7CisgIGNmZ18uZ19sYWdfaW5fZnJhbWVzID0gR2V0UGFyYW0oKTsKKworICBsaWJ2cHhfdGVzdDo6STQyMFZpZGVvU291cmNlIHZpZGVvKCJoYW50cm9fY29sbGFnZV93MzUyaDI4OC55dXYiLCAzNTIsIDI4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZS5kZW4sIHRpbWViYXNlLm51bSwgMCwgMzApOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSdW5Mb29wKCZ2aWRlbykpOworICBFWFBFQ1RfR0UoYWx0cmVmX2NvdW50KCksIDEpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25aZXJvTGFnLCBBbHRSZWZUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZShrTG9va0FoZWFkTWluLCBrTG9va0FoZWFkTWF4KSk7Cit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L2Jvb2xjb2Rlcl90ZXN0LmNjIGIvbGlidnB4L3Rlc3QvYm9vbGNvZGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyMWJlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L2Jvb2xjb2Rlcl90ZXN0LmNjCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidnA4L2VuY29kZXIvYm9vbGh1ZmYuaCIKKyNpbmNsdWRlICJ2cDgvZGVjb2Rlci9kYm9vbGh1ZmYuaCIKK30KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAidGVzdC9hY21fcmFuZG9tLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorCituYW1lc3BhY2UgeworY29uc3QgaW50IG51bV90ZXN0cyA9IDEwOworfSAgLy8gbmFtZXNwYWNlCisKK3VzaW5nIGxpYnZweF90ZXN0OjpBQ01SYW5kb207CisKK1RFU1QoVlA4LCBUZXN0Qml0SU8pIHsKKyAgQUNNUmFuZG9tIHJuZChBQ01SYW5kb206OkRldGVybWluaXN0aWNTZWVkKCkpOworICBmb3IgKGludCBuID0gMDsgbiA8IG51bV90ZXN0czsgKytuKSB7CisgICAgZm9yIChpbnQgbWV0aG9kID0gMDsgbWV0aG9kIDw9IDc7ICsrbWV0aG9kKSB7ICAgLy8gd2UgZ2VuZXJhdGUgdmFyaW91cyBwcm9iYQorICAgICAgY29uc3QgaW50IGJpdHNfdG9fdGVzdCA9IDEwMDA7CisgICAgICB1aW50OF90IHByb2Jhc1tiaXRzX3RvX3Rlc3RdOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNfdG9fdGVzdDsgKytpKSB7CisgICAgICAgIGNvbnN0IGludCBwYXJpdHkgPSBpICYgMTsKKyAgICAgICAgcHJvYmFzW2ldID0KKyAgICAgICAgICAgIChtZXRob2QgPT0gMCkgPyAwIDogKG1ldGhvZCA9PSAxKSA/IDI1NSA6CisgICAgICAgICAgICAobWV0aG9kID09IDIpID8gMTI4IDoKKyAgICAgICAgICAgIChtZXRob2QgPT0gMykgPyBybmQuUmFuZDgoKSA6CisgICAgICAgICAgICAobWV0aG9kID09IDQpID8gKHBhcml0eSA/IDAgOiAyNTUpIDoKKyAgICAgICAgICAgIC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGxvdyBhbmQgaGlnaCBwcm9iYToKKyAgICAgICAgICAgIChtZXRob2QgPT0gNSkgPyAocGFyaXR5ID8gcm5kKDEyOCkgOiAyNTUgLSBybmQoMTI4KSkgOgorICAgICAgICAgICAgKG1ldGhvZCA9PSA2KSA/CisgICAgICAgICAgICAgICAgKHBhcml0eSA/IHJuZCg2NCkgOiAyNTUgLSBybmQoNjQpKSA6CisgICAgICAgICAgICAgICAgKHBhcml0eSA/IHJuZCgzMikgOiAyNTUgLSBybmQoMzIpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGJpdF9tZXRob2QgPSAwOyBiaXRfbWV0aG9kIDw9IDM7ICsrYml0X21ldGhvZCkgeworICAgICAgICBjb25zdCBpbnQgcmFuZG9tX3NlZWQgPSA2NDMyOworICAgICAgICBjb25zdCBpbnQgYnVmZmVyX3NpemUgPSAxMDAwMDsKKyAgICAgICAgQUNNUmFuZG9tIGJpdF9ybmQocmFuZG9tX3NlZWQpOworICAgICAgICBCT09MX0NPREVSIGJ3OworICAgICAgICB1aW50OF90IGJ3X2J1ZmZlcltidWZmZXJfc2l6ZV07CisgICAgICAgIHZwOF9zdGFydF9lbmNvZGUoJmJ3LCBid19idWZmZXIsIGJ3X2J1ZmZlciArIGJ1ZmZlcl9zaXplKTsKKworICAgICAgICBpbnQgYml0ID0gKGJpdF9tZXRob2QgPT0gMCkgPyAwIDogKGJpdF9tZXRob2QgPT0gMSkgPyAxIDogMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzX3RvX3Rlc3Q7ICsraSkgeworICAgICAgICAgIGlmIChiaXRfbWV0aG9kID09IDIpIHsKKyAgICAgICAgICAgIGJpdCA9IChpICYgMSk7CisgICAgICAgICAgfSBlbHNlIGlmIChiaXRfbWV0aG9kID09IDMpIHsKKyAgICAgICAgICAgIGJpdCA9IGJpdF9ybmQoMik7CisgICAgICAgICAgfQorICAgICAgICAgIHZwOF9lbmNvZGVfYm9vbCgmYncsIGJpdCwgc3RhdGljX2Nhc3Q8aW50Pihwcm9iYXNbaV0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHZwOF9zdG9wX2VuY29kZSgmYncpOworCisgICAgICAgIEJPT0xfREVDT0RFUiBicjsKKyAgICAgICAgdnA4ZHhfc3RhcnRfZGVjb2RlKCZiciwgYndfYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisgICAgICAgIGJpdF9ybmQuUmVzZXQocmFuZG9tX3NlZWQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNfdG9fdGVzdDsgKytpKSB7CisgICAgICAgICAgaWYgKGJpdF9tZXRob2QgPT0gMikgeworICAgICAgICAgICAgYml0ID0gKGkgJiAxKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJpdF9tZXRob2QgPT0gMykgeworICAgICAgICAgICAgYml0ID0gYml0X3JuZCgyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgR1RFU1RfQVNTRVJUX0VRKHZwOGR4X2RlY29kZV9ib29sKCZiciwgcHJvYmFzW2ldKSwgYml0KQorICAgICAgICAgICAgICA8PCAicG9zOiAiPDwgaSA8PCAiIC8gIiA8PCBiaXRzX3RvX3Rlc3QKKyAgICAgICAgICAgICAgPDwgIiBiaXRfbWV0aG9kOiAiIDw8IGJpdF9tZXRob2QKKyAgICAgICAgICAgICAgPDwgIiBtZXRob2Q6ICIgPDwgbWV0aG9kOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9jb25maWdfdGVzdC5jYyBiL2xpYnZweC90ZXN0L2NvbmZpZ190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZGE0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9jb25maWdfdGVzdC5jYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3QvZW5jb2RlX3Rlc3RfZHJpdmVyLmgiCisjaW5jbHVkZSAidGVzdC92aWRlb19zb3VyY2UuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29uZmlnVGVzdCA6IHB1YmxpYyA6OmxpYnZweF90ZXN0OjpFbmNvZGVyVGVzdCwKKyAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGVudW0gbGlidnB4X3Rlc3Q6OlRlc3RNb2RlPiB7CisgcHVibGljOgorICBDb25maWdUZXN0KCkgOiBmcmFtZV9jb3VudF9pbl8oMCksIGZyYW1lX2NvdW50X291dF8oMCksIGZyYW1lX2NvdW50X21heF8oMCkge30KKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEluaXRpYWxpemVDb25maWcoKTsKKyAgICBTZXRNb2RlKEdldFBhcmFtKCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEJlZ2luUGFzc0hvb2sodW5zaWduZWQgaW50IC8qcGFzcyovKSB7CisgICAgZnJhbWVfY291bnRfaW5fID0gMDsKKyAgICBmcmFtZV9jb3VudF9vdXRfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBQcmVFbmNvZGVGcmFtZUhvb2sobGlidnB4X3Rlc3Q6OlZpZGVvU291cmNlKiAvKnZpZGVvKi8pIHsKKyAgICArK2ZyYW1lX2NvdW50X2luXzsKKyAgICBhYm9ydF8gfD0gKGZyYW1lX2NvdW50X2luXyA+PSBmcmFtZV9jb3VudF9tYXhfKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBGcmFtZVBrdEhvb2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KiAvKnBrdCovKSB7CisgICAgKytmcmFtZV9jb3VudF9vdXRfOworICB9CisKKyAgdmlydHVhbCBib29sIENvbnRpbnVlKCkgY29uc3QgeworICAgIHJldHVybiAhSGFzRmF0YWxGYWlsdXJlKCkgJiYgIWFib3J0XzsKKyAgfQorCisgIHVuc2lnbmVkIGludCBmcmFtZV9jb3VudF9pbl87CisgIHVuc2lnbmVkIGludCBmcmFtZV9jb3VudF9vdXRfOworICB1bnNpZ25lZCBpbnQgZnJhbWVfY291bnRfbWF4XzsKK307CisKK1RFU1RfUChDb25maWdUZXN0LCBMYWdJc0Rpc2FibGVkKSB7CisgIGZyYW1lX2NvdW50X21heF8gPSAyOworICBjZmdfLmdfbGFnX2luX2ZyYW1lcyA9IDE1OworCisgIGxpYnZweF90ZXN0OjpEdW1teVZpZGVvU291cmNlIHZpZGVvOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSdW5Mb29wKCZ2aWRlbykpOworCisgIEVYUEVDVF9FUShmcmFtZV9jb3VudF9pbl8sIGZyYW1lX2NvdW50X291dF8pOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChPbmVQYXNzTW9kZXMsIENvbmZpZ1Rlc3QsIE9ORV9QQVNTX1RFU1RfTU9ERVMpOworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9jcV90ZXN0LmNjIGIvbGlidnB4L3Rlc3QvY3FfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVlMmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvY3FfdGVzdC5jYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0L2VuY29kZV90ZXN0X2RyaXZlci5oIgorI2luY2x1ZGUgInRlc3QvaTQyMF92aWRlb19zb3VyY2UuaCIKKworLy8gQ1EgbGV2ZWwgcmFuZ2U6IFtrQ1FMZXZlbE1pbiwga0NRTGV2ZWxNYXgpLgorY29uc3QgaW50IGtDUUxldmVsTWluID0gNDsKK2NvbnN0IGludCBrQ1FMZXZlbE1heCA9IDYzOworY29uc3QgaW50IGtDUUxldmVsU3RlcCA9IDg7Citjb25zdCBpbnQga0NRVGFyZ2V0Qml0cmF0ZSA9IDIwMDA7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENRVGVzdCA6IHB1YmxpYyBsaWJ2cHhfdGVzdDo6RW5jb2RlclRlc3QsCisgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKKyBwcm90ZWN0ZWQ6CisgIENRVGVzdCgpIDogY3FfbGV2ZWxfKEdldFBhcmFtKCkpIHsgaW5pdF9mbGFnc18gPSBWUFhfQ09ERUNfVVNFX1BTTlI7IH0KKyAgdmlydHVhbCB+Q1FUZXN0KCkge30KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgSW5pdGlhbGl6ZUNvbmZpZygpOworICAgIFNldE1vZGUobGlidnB4X3Rlc3Q6OmtUd29QYXNzR29vZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgQmVnaW5QYXNzSG9vayh1bnNpZ25lZCBpbnQgLypwYXNzKi8pIHsKKyAgICBmaWxlX3NpemVfID0gMDsKKyAgICBwc25yXyA9IDAuMDsKKyAgICBuX2ZyYW1lc18gPSAwOworICB9CisKKyAgdmlydHVhbCBib29sIENvbnRpbnVlKCkgY29uc3QgeworICAgIHJldHVybiAhSGFzRmF0YWxGYWlsdXJlKCkgJiYgIWFib3J0XzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBQcmVFbmNvZGVGcmFtZUhvb2sobGlidnB4X3Rlc3Q6OlZpZGVvU291cmNlICp2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ2cHhfdGVzdDo6RW5jb2RlciAqZW5jb2RlcikgeworICAgIGlmICh2aWRlby0+ZnJhbWUoKSA9PSAxKSB7CisgICAgICBpZiAoY2ZnXy5yY19lbmRfdXNhZ2UgPT0gVlBYX0NRKSB7CisgICAgICAgIGVuY29kZXItPkNvbnRyb2woVlA4RV9TRVRfQ1FfTEVWRUwsIGNxX2xldmVsXyk7CisgICAgICB9CisgICAgICBlbmNvZGVyLT5Db250cm9sKFZQOEVfU0VUX0NQVVVTRUQsIDMpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBQU05SUGt0SG9vayhjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdCkgeworICAgIHBzbnJfICs9IHBvdygxMC4wLCBwa3QtPmRhdGEucHNuci5wc25yWzBdIC8gMTAuMCk7CisgICAgbl9mcmFtZXNfKys7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRnJhbWVQa3RIb29rKGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0KSB7CisgICAgZmlsZV9zaXplXyArPSBwa3QtPmRhdGEuZnJhbWUuc3o7CisgIH0KKworICBkb3VibGUgR2V0TGluZWFyUFNOUk92ZXJCaXRyYXRlKCkgY29uc3QgeworICAgIGRvdWJsZSBhdmdfcHNuciA9IGxvZzEwKHBzbnJfIC8gbl9mcmFtZXNfKSAqIDEwLjA7CisgICAgcmV0dXJuIHBvdygxMC4wLCBhdmdfcHNuciAvIDEwLjApIC8gZmlsZV9zaXplXzsKKyAgfQorCisgIGludCBmaWxlX3NpemUoKSBjb25zdCB7IHJldHVybiBmaWxlX3NpemVfOyB9CisgIGludCBuX2ZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIG5fZnJhbWVzXzsgfQorCisgcHJpdmF0ZToKKyAgaW50IGNxX2xldmVsXzsKKyAgaW50IGZpbGVfc2l6ZV87CisgIGRvdWJsZSBwc25yXzsKKyAgaW50IG5fZnJhbWVzXzsKK307CisKK2ludCBwcmV2X2FjdHVhbF9iaXRyYXRlID0ga0NRVGFyZ2V0Qml0cmF0ZTsKK1RFU1RfUChDUVRlc3QsIExpbmVhclBTTlJJc0hpZ2hlckZvckNRTGV2ZWwpIHsKKyAgY29uc3QgdnB4X3JhdGlvbmFsIHRpbWViYXNlID0geyAzMzMzMzMzMywgMTAwMDAwMDAwMCB9OworICBjZmdfLmdfdGltZWJhc2UgPSB0aW1lYmFzZTsKKyAgY2ZnXy5yY190YXJnZXRfYml0cmF0ZSA9IGtDUVRhcmdldEJpdHJhdGU7CisgIGNmZ18uZ19sYWdfaW5fZnJhbWVzID0gMjU7CisKKyAgY2ZnXy5yY19lbmRfdXNhZ2UgPSBWUFhfQ1E7CisgIGxpYnZweF90ZXN0OjpJNDIwVmlkZW9Tb3VyY2UgdmlkZW8oImhhbnRyb19jb2xsYWdlX3czNTJoMjg4Lnl1diIsIDM1MiwgMjg4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWViYXNlLmRlbiwgdGltZWJhc2UubnVtLCAwLCAzMCk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJ1bkxvb3AoJnZpZGVvKSk7CisgIGNvbnN0IGRvdWJsZSBjcV9wc25yX2xpbiA9IEdldExpbmVhclBTTlJPdmVyQml0cmF0ZSgpOworICBjb25zdCBpbnQgY3FfYWN0dWFsX2JpdHJhdGUgPSBmaWxlX3NpemUoKSAqIDggKiAzMCAvIChuX2ZyYW1lcygpICogMTAwMCk7CisgIEVYUEVDVF9MRShjcV9hY3R1YWxfYml0cmF0ZSwga0NRVGFyZ2V0Qml0cmF0ZSk7CisgIEVYUEVDVF9MRShjcV9hY3R1YWxfYml0cmF0ZSwgcHJldl9hY3R1YWxfYml0cmF0ZSk7CisgIHByZXZfYWN0dWFsX2JpdHJhdGUgPSBjcV9hY3R1YWxfYml0cmF0ZTsKKworICAvLyB0cnkgdGFyZ2V0aW5nIHRoZSBhcHByb3hpbWF0ZSBzYW1lIGJpdHJhdGUgd2l0aCBWQlIgbW9kZQorICBjZmdfLnJjX2VuZF91c2FnZSA9IFZQWF9WQlI7CisgIGNmZ18ucmNfdGFyZ2V0X2JpdHJhdGUgPSBjcV9hY3R1YWxfYml0cmF0ZTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUnVuTG9vcCgmdmlkZW8pKTsKKyAgY29uc3QgZG91YmxlIHZicl9wc25yX2xpbiA9IEdldExpbmVhclBTTlJPdmVyQml0cmF0ZSgpOworICBFWFBFQ1RfR0UoY3FfcHNucl9saW4sIHZicl9wc25yX2xpbik7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENRTGV2ZWxSYW5nZSwgQ1FUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZShrQ1FMZXZlbE1pbiwga0NRTGV2ZWxNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDUUxldmVsU3RlcCkpOworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9kYXRhcmF0ZV90ZXN0LmNjIGIvbGlidnB4L3Rlc3QvZGF0YXJhdGVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJjYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvZGF0YXJhdGVfdGVzdC5jYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgInRlc3QvZW5jb2RlX3Rlc3RfZHJpdmVyLmgiCisjaW5jbHVkZSAidGVzdC9pNDIwX3ZpZGVvX3NvdXJjZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKK25hbWVzcGFjZSB7CisKK2NsYXNzIERhdGFyYXRlVGVzdCA6IHB1YmxpYyA6OmxpYnZweF90ZXN0OjpFbmNvZGVyVGVzdCwKKyAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGVudW0gbGlidnB4X3Rlc3Q6OlRlc3RNb2RlPiB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgSW5pdGlhbGl6ZUNvbmZpZygpOworICAgIFNldE1vZGUoR2V0UGFyYW0oKSk7CisgICAgUmVzZXRNb2RlbCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFJlc2V0TW9kZWwoKSB7CisgICAgbGFzdF9wdHNfID0gMDsKKyAgICBiaXRzX2luX2J1ZmZlcl9tb2RlbF8gPSBjZmdfLnJjX3RhcmdldF9iaXRyYXRlICogY2ZnXy5yY19idWZfaW5pdGlhbF9zejsKKyAgICBmcmFtZV9udW1iZXJfID0gMDsKKyAgICBmaXJzdF9kcm9wXyA9IDA7CisgICAgYml0c190b3RhbF8gPSAwOworICAgIGR1cmF0aW9uXyA9IDAuMDsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBDb250aW51ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIUhhc0ZhdGFsRmFpbHVyZSgpICYmICFhYm9ydF87CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUHJlRW5jb2RlRnJhbWVIb29rKDo6bGlidnB4X3Rlc3Q6OlZpZGVvU291cmNlICp2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OmxpYnZweF90ZXN0OjpFbmNvZGVyICplbmNvZGVyKSB7CisgICAgY29uc3QgdnB4X3JhdGlvbmFsX3QgdGIgPSB2aWRlby0+dGltZWJhc2UoKTsKKyAgICB0aW1lYmFzZV8gPSBzdGF0aWNfY2FzdDxkb3VibGU+KHRiLm51bSkgLyB0Yi5kZW47CisgICAgZHVyYXRpb25fID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBGcmFtZVBrdEhvb2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpIHsKKyAgICAvLyBUaW1lIHNpbmNlIGxhc3QgdGltZXN0YW1wID0gZHVyYXRpb24uCisgICAgdnB4X2NvZGVjX3B0c190IGR1cmF0aW9uID0gcGt0LT5kYXRhLmZyYW1lLnB0cyAtIGxhc3RfcHRzXzsKKworICAgIC8vIFRPRE8oamltYmFua29za2kpOiBSZW1vdmUgdGhlc2UgbGluZXMgd2hlbiB0aGUgaXNzdWU6CisgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYm0vaXNzdWVzL2RldGFpbD9pZD00OTYgaXMgZml4ZWQuCisgICAgLy8gRm9yIG5vdyB0aGUgY29kZWMgYXNzdW1lcyBidWZmZXIgc3RhcnRzIGF0IHN0YXJ0aW5nIGJ1ZmZlciByYXRlCisgICAgLy8gcGx1cyBvbmUgZnJhbWUncyB0aW1lLgorICAgIGlmIChsYXN0X3B0c18gPT0gMCkKKyAgICAgIGR1cmF0aW9uID0gMTsKKworICAgIC8vIEFkZCB0byB0aGUgYnVmZmVyIHRoZSBiaXRzIHdlJ2QgZXhwZWN0IGZyb20gYSBjb25zdGFudCBiaXRyYXRlIHNlcnZlci4KKyAgICBiaXRzX2luX2J1ZmZlcl9tb2RlbF8gKz0gZHVyYXRpb24gKiB0aW1lYmFzZV8gKiBjZmdfLnJjX3RhcmdldF9iaXRyYXRlCisgICAgICAgICogMTAwMDsKKworICAgIC8qIFRlc3QgdGhlIGJ1ZmZlciBtb2RlbCBoZXJlIGJlZm9yZSBzdWJ0cmFjdGluZyB0aGUgZnJhbWUuIERvIHNvIGJlY2F1c2UKKyAgICAgKiB0aGUgd2F5IHRoZSBsZWFreSBidWNrZXQgbW9kZWwgd29ya3MgaW4gbGlidnB4IGlzIHRvIGFsbG93IHRoZSBidWZmZXIgdG8KKyAgICAgKiBlbXB0eSAtIGFuZCB0aGVuIHN0b3Agc2hvd2luZyBmcmFtZXMgdW50aWwgd2UndmUgZ290IGVub3VnaCBiaXRzIHRvCisgICAgICogc2hvdyBvbmUuIEFzIG5vdGVkIGluIGNvbW1lbnQgYmVsb3cgKGlzc3VlIDQ5NSksIHRoaXMgZG9lcyBub3QgY3VycmVudGx5CisgICAgICogYXBwbHkgdG8ga2V5IGZyYW1lcy4gRm9yIG5vdyBleGNsdWRlIGtleSBmcmFtZXMgaW4gY29uZGl0aW9uIGJlbG93LiAqLworICAgIGJvb2wga2V5X2ZyYW1lID0gKHBrdC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpID8gdHJ1ZTogZmFsc2U7CisgICAgaWYgKCFrZXlfZnJhbWUpIHsKKyAgICAgIEFTU0VSVF9HRShiaXRzX2luX2J1ZmZlcl9tb2RlbF8sIDApIDw8ICJCdWZmZXIgVW5kZXJydW4gYXQgZnJhbWUgIgorICAgICAgICAgIDw8IHBrdC0+ZGF0YS5mcmFtZS5wdHM7CisgICAgfQorCisgICAgY29uc3QgaW50IGZyYW1lX3NpemVfaW5fYml0cyA9IHBrdC0+ZGF0YS5mcmFtZS5zeiAqIDg7CisKKyAgICAvLyBTdWJ0cmFjdCBmcm9tIHRoZSBidWZmZXIgdGhlIGJpdHMgYXNzb2NpYXRlZCB3aXRoIGEgcGxheWVkIGJhY2sgZnJhbWUuCisgICAgYml0c19pbl9idWZmZXJfbW9kZWxfIC09IGZyYW1lX3NpemVfaW5fYml0czsKKworICAgIC8vIFVwZGF0ZSB0aGUgcnVubmluZyB0b3RhbCBvZiBiaXRzIGZvciBlbmQgb2YgdGVzdCBkYXRhcmF0ZSBjaGVja3MuCisgICAgYml0c190b3RhbF8gKz0gZnJhbWVfc2l6ZV9pbl9iaXRzIDsKKworICAgIC8vIElmIGZpcnN0IGRyb3Agbm90IHNldCBhbmQgd2UgaGF2ZSBhIGRyb3Agc2V0IGl0IHRvIHRoaXMgdGltZS4KKyAgICBpZiAoIWZpcnN0X2Ryb3BfICYmIGR1cmF0aW9uID4gMSkKKyAgICAgIGZpcnN0X2Ryb3BfID0gbGFzdF9wdHNfICsgMTsKKworICAgIC8vIFVwZGF0ZSB0aGUgbW9zdCByZWNlbnQgcHRzLgorICAgIGxhc3RfcHRzXyA9IHBrdC0+ZGF0YS5mcmFtZS5wdHM7CisKKyAgICAvLyBXZSB1cGRhdGUgdGhpcyBzbyB0aGF0IHdlIGNhbiBjYWxjdWxhdGUgdGhlIGRhdGFyYXRlIG1pbnVzIHRoZSBsYXN0CisgICAgLy8gZnJhbWUgZW5jb2RlZCBpbiB0aGUgZmlsZS4KKyAgICBiaXRzX2luX2xhc3RfZnJhbWVfID0gZnJhbWVfc2l6ZV9pbl9iaXRzOworCisgICAgKytmcmFtZV9udW1iZXJfOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVuZFBhc3NIb29rKHZvaWQpIHsKKyAgICBpZiAoYml0c190b3RhbF8pIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBmaWxlX3NpemVfaW5fa2IgPSBiaXRzX3RvdGFsXyAvIDEwMDA7ICAvKiBiaXRzIHBlciBraWxvYml0ICovCisKKyAgICAgIGR1cmF0aW9uXyA9IChsYXN0X3B0c18gKyAxKSAqIHRpbWViYXNlXzsKKworICAgICAgLy8gRWZmZWN0aXZlIGZpbGUgZGF0YXJhdGUgaW5jbHVkZXMgdGhlIHRpbWUgc3BlbnQgcHJlYnVmZmVyaW5nLgorICAgICAgZWZmZWN0aXZlX2RhdGFyYXRlXyA9IChiaXRzX3RvdGFsXyAtIGJpdHNfaW5fbGFzdF9mcmFtZV8pIC8gMTAwMC4wCisgICAgICAgICAgLyAoY2ZnXy5yY19idWZfaW5pdGlhbF9zeiAvIDEwMDAuMCArIGR1cmF0aW9uXyk7CisKKyAgICAgIGZpbGVfZGF0YXJhdGVfID0gZmlsZV9zaXplX2luX2tiIC8gZHVyYXRpb25fOworICAgIH0KKyAgfQorCisgIHZweF9jb2RlY19wdHNfdCBsYXN0X3B0c187CisgIGludCBiaXRzX2luX2J1ZmZlcl9tb2RlbF87CisgIGRvdWJsZSB0aW1lYmFzZV87CisgIGludCBmcmFtZV9udW1iZXJfOworICB2cHhfY29kZWNfcHRzX3QgZmlyc3RfZHJvcF87CisgIGludDY0X3QgYml0c190b3RhbF87CisgIGRvdWJsZSBkdXJhdGlvbl87CisgIGRvdWJsZSBmaWxlX2RhdGFyYXRlXzsKKyAgZG91YmxlIGVmZmVjdGl2ZV9kYXRhcmF0ZV87CisgIGludCBiaXRzX2luX2xhc3RfZnJhbWVfOworfTsKKworVEVTVF9QKERhdGFyYXRlVGVzdCwgQmFzaWNCdWZmZXJNb2RlbCkgeworICBjZmdfLnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICBjZmdfLnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAxOworICBjZmdfLnJjX21heF9xdWFudGl6ZXIgPSA1NjsKKyAgY2ZnXy5yY19lbmRfdXNhZ2UgPSBWUFhfQ0JSOworICAvLyAyIHBhc3MgY2JyIGRhdGFyYXRlIGNvbnRyb2wgaGFzIGEgYnVnIGhpZGRlbiBieSB0aGUgc21hbGwgIyBvZgorICAvLyBmcmFtZXMgc2VsZWN0ZWQgaW4gdGhpcyBlbmNvZGUuIFRoZSBwcm9ibGVtIGlzIHRoYXQgZXZlbiBpZiB0aGUgYnVmZmVyIGlzCisgIC8vIG5lZ2F0aXZlIHdlIHByb2R1Y2UgYSBrZXlmcmFtZSBvbiBhIGN1dHNjZW5lLiBJZ25vcmluZyBkYXRhcmF0ZQorICAvLyBjb25zdHJhaW50cworICAvLyBUT0RPKGppbWJhbmtvc2tpKTogKCBGaXggd2hlbiBpc3N1ZQorICAvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avd2VibS9pc3N1ZXMvZGV0YWlsP2lkPTQ5NSBpcyBhZGRyZXNzZWQuICkKKyAgOjpsaWJ2cHhfdGVzdDo6STQyMFZpZGVvU291cmNlIHZpZGVvKCJoYW50cm9fY29sbGFnZV93MzUyaDI4OC55dXYiLCAzNTIsIDI4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAxLCAwLCAxNDApOworCisgIC8vIFRoZXJlIGlzIGFuIGlzc3VlIGZvciBsb3cgYml0cmF0ZXMgaW4gcmVhbC10aW1lIG1vZGUsIHdoZXJlIHRoZQorICAvLyBlZmZlY3RpdmVfZGF0YXJhdGUgc2xpZ2h0bHkgb3ZlcnNob290cyB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgIC8vIFRoaXMgaXMgc2FtZSB0aGUgaXNzdWUgYXMgbm90ZWQgYWJvdXQgKCM0OTUpLgorICAvLyBUT0RPKGppbWJhbmtvc2tpL21hcnBhbik6IFVwZGF0ZSB0ZXN0IHRvIHJ1biBmb3IgbG93ZXIgYml0cmF0ZXMgKDwgMTAwKSwKKyAgLy8gd2hlbiB0aGUgaXNzdWUgaXMgcmVzb2x2ZWQuCisgIGZvciAoaW50IGkgPSAxMDA7IGkgPCA4MDA7IGkgKz0gMjAwKSB7CisgICAgY2ZnXy5yY190YXJnZXRfYml0cmF0ZSA9IGk7CisgICAgUmVzZXRNb2RlbCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJ1bkxvb3AoJnZpZGVvKSk7CisgICAgQVNTRVJUX0dFKGNmZ18ucmNfdGFyZ2V0X2JpdHJhdGUsIGVmZmVjdGl2ZV9kYXRhcmF0ZV8pCisgICAgICAgIDw8ICIgVGhlIGRhdGFyYXRlIGZvciB0aGUgZmlsZSBleGNlZWRzIHRoZSB0YXJnZXQhIjsKKworICAgIEFTU0VSVF9MRShjZmdfLnJjX3RhcmdldF9iaXRyYXRlLCBmaWxlX2RhdGFyYXRlXyAqIDEuMykKKyAgICAgICAgPDwgIiBUaGUgZGF0YXJhdGUgZm9yIHRoZSBmaWxlIG1pc3NlZCB0aGUgdGFyZ2V0ISI7CisgIH0KK30KKworVEVTVF9QKERhdGFyYXRlVGVzdCwgQ2hhbmdpbmdEcm9wRnJhbWVUaHJlc2gpIHsKKyAgY2ZnXy5yY19idWZfaW5pdGlhbF9zeiA9IDUwMDsKKyAgY2ZnXy5yY19tYXhfcXVhbnRpemVyID0gMzY7CisgIGNmZ18ucmNfZW5kX3VzYWdlID0gVlBYX0NCUjsKKyAgY2ZnXy5yY190YXJnZXRfYml0cmF0ZSA9IDIwMDsKKyAgY2ZnXy5rZl9tb2RlID0gVlBYX0tGX0RJU0FCTEVEOworCisgIGNvbnN0IGludCBmcmFtZV9jb3VudCA9IDQwOworICA6OmxpYnZweF90ZXN0OjpJNDIwVmlkZW9Tb3VyY2UgdmlkZW8oImhhbnRyb19jb2xsYWdlX3czNTJoMjg4Lnl1diIsIDM1MiwgMjg4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsIDEsIDAsIGZyYW1lX2NvdW50KTsKKworICAvLyBIZXJlIHdlIGNoZWNrIHRoYXQgdGhlIGZpcnN0IGRyb3BwZWQgZnJhbWUgZ2V0cyBlYXJsaWVyIGFuZCBlYXJsaWVyCisgIC8vIGFzIHRoZSBkcm9wIGZyYW1lIHRocmVzaG9sZCBpcyBpbmNyZWFzZWQuCisKKyAgY29uc3QgaW50IGtEcm9wRnJhbWVUaHJlc2hUZXN0U3RlcCA9IDMwOworICB2cHhfY29kZWNfcHRzX3QgbGFzdF9kcm9wID0gZnJhbWVfY291bnQ7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgOTE7IGkgKz0ga0Ryb3BGcmFtZVRocmVzaFRlc3RTdGVwKSB7CisgICAgY2ZnXy5yY19kcm9wZnJhbWVfdGhyZXNoID0gaTsKKyAgICBSZXNldE1vZGVsKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUnVuTG9vcCgmdmlkZW8pKTsKKyAgICBBU1NFUlRfTEUoZmlyc3RfZHJvcF8sIGxhc3RfZHJvcCkKKyAgICAgICAgPDwgIiBUaGUgZmlyc3QgZHJvcHBlZCBmcmFtZSBmb3IgZHJvcF90aHJlc2ggIiA8PCBpCisgICAgICAgIDw8ICIgPiBmaXJzdCBkcm9wcGVkIGZyYW1lIGZvciBkcm9wX3RocmVzaCAiCisgICAgICAgIDw8IGkgLSBrRHJvcEZyYW1lVGhyZXNoVGVzdFN0ZXA7CisgICAgbGFzdF9kcm9wID0gZmlyc3RfZHJvcF87CisgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQWxsTW9kZXMsIERhdGFyYXRlVGVzdCwgQUxMX1RFU1RfTU9ERVMpOworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9kZWNvZGVfdGVzdF9kcml2ZXIuY2MgYi9saWJ2cHgvdGVzdC9kZWNvZGVfdGVzdF9kcml2ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxMGYwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L2RlY29kZV90ZXN0X2RyaXZlci5jYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAidGVzdC9kZWNvZGVfdGVzdF9kcml2ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdC92aWRlb19zb3VyY2UuaCIKKworbmFtZXNwYWNlIGxpYnZweF90ZXN0IHsKKyNpZiBDT05GSUdfVlA4X0RFQ09ERVIKK3ZvaWQgRGVjb2Rlcjo6RGVjb2RlRnJhbWUoY29uc3QgdWludDhfdCAqY3hkYXRhLCBpbnQgc2l6ZSkgeworICBpZiAoIWRlY29kZXJfLnByaXYpIHsKKyAgICBjb25zdCB2cHhfY29kZWNfZXJyX3QgcmVzX2luaXQgPSB2cHhfY29kZWNfZGVjX2luaXQoJmRlY29kZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2ZnXywgMCk7CisgICAgQVNTRVJUX0VRKFZQWF9DT0RFQ19PSywgcmVzX2luaXQpIDw8IERlY29kZUVycm9yKCk7CisgIH0KKworICBjb25zdCB2cHhfY29kZWNfZXJyX3QgcmVzX2RlYyA9IHZweF9jb2RlY19kZWNvZGUoJmRlY29kZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hkYXRhLCBzaXplLCBOVUxMLCAwKTsKKyAgQVNTRVJUX0VRKFZQWF9DT0RFQ19PSywgcmVzX2RlYykgPDwgRGVjb2RlRXJyb3IoKTsKK30KKwordm9pZCBEZWNvZGVyVGVzdDo6UnVuTG9vcChDb21wcmVzc2VkVmlkZW9Tb3VyY2UgKnZpZGVvKSB7CisgIHZweF9jb2RlY19kZWNfY2ZnX3QgZGVjX2NmZyA9IHswfTsKKyAgRGVjb2RlciBkZWNvZGVyKGRlY19jZmcsIDApOworCisgIC8vIERlY29kZSBmcmFtZXMuCisgIGZvciAodmlkZW8tPkJlZ2luKCk7IHZpZGVvLT5jeGRhdGEoKTsgdmlkZW8tPk5leHQoKSkgeworICAgIGRlY29kZXIuRGVjb2RlRnJhbWUodmlkZW8tPmN4ZGF0YSgpLCB2aWRlby0+ZnJhbWVfc2l6ZSgpKTsKKworICAgIER4RGF0YUl0ZXJhdG9yIGRlY19pdGVyID0gZGVjb2Rlci5HZXREeERhdGEoKTsKKyAgICBjb25zdCB2cHhfaW1hZ2VfdCAqaW1nID0gTlVMTDsKKworICAgIC8vIEdldCBkZWNvbXByZXNzZWQgZGF0YQorICAgIHdoaWxlICgoaW1nID0gZGVjX2l0ZXIuTmV4dCgpKSkKKyAgICAgIERlY29tcHJlc3NlZEZyYW1lSG9vaygqaW1nLCB2aWRlby0+ZnJhbWVfbnVtYmVyKCkpOworICB9Cit9CisjZW5kaWYKK30gIC8vIG5hbWVzcGFjZSBsaWJ2cHhfdGVzdApkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvZGVjb2RlX3Rlc3RfZHJpdmVyLmggYi9saWJ2cHgvdGVzdC9kZWNvZGVfdGVzdF9kcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA4YmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvZGVjb2RlX3Rlc3RfZHJpdmVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIFRFU1RfREVDT0RFX1RFU1RfRFJJVkVSX0hfCisjZGVmaW5lIFRFU1RfREVDT0RFX1RFU1RfRFJJVkVSX0hfCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCituYW1lc3BhY2UgbGlidnB4X3Rlc3QgeworCitjbGFzcyBDb21wcmVzc2VkVmlkZW9Tb3VyY2U7CisKKy8vIFByb3ZpZGVzIGFuIG9iamVjdCB0byBoYW5kbGUgZGVjb2Rpbmcgb3V0cHV0CitjbGFzcyBEeERhdGFJdGVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBEeERhdGFJdGVyYXRvcih2cHhfY29kZWNfY3R4X3QgKmRlY29kZXIpCisgICAgICA6IGRlY29kZXJfKGRlY29kZXIpLCBpdGVyXyhOVUxMKSB7fQorCisgIGNvbnN0IHZweF9pbWFnZV90ICpOZXh0KCkgeworICAgIHJldHVybiB2cHhfY29kZWNfZ2V0X2ZyYW1lKGRlY29kZXJfLCAmaXRlcl8pOworICB9CisKKyBwcml2YXRlOgorICB2cHhfY29kZWNfY3R4X3QgICpkZWNvZGVyXzsKKyAgdnB4X2NvZGVjX2l0ZXJfdCAgaXRlcl87Cit9OworCisvLyBQcm92aWRlcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIG1hbmFnZSBvbmUgdmlkZW8gZGVjb2RpbmcuCisvLworLy8gVE9ETzogc2ltaWxhciB0byBFbmNvZGVyIGNsYXNzLCB0aGUgZXhhY3Qgc2VydmljZXMgc2hvdWxkIGJlCisvLyBhZGRlZCBhcyBtb3JlIHRlc3RzIGFyZSBhZGRlZC4KK2NsYXNzIERlY29kZXIgeworIHB1YmxpYzoKKyAgRGVjb2Rlcih2cHhfY29kZWNfZGVjX2NmZ190IGNmZywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKKyAgICAgIDogY2ZnXyhjZmcpLCBkZWFkbGluZV8oZGVhZGxpbmUpIHsKKyAgICBtZW1zZXQoJmRlY29kZXJfLCAwLCBzaXplb2YoZGVjb2Rlcl8pKTsKKyAgfQorCisgIH5EZWNvZGVyKCkgeworICAgIHZweF9jb2RlY19kZXN0cm95KCZkZWNvZGVyXyk7CisgIH0KKworICB2b2lkIERlY29kZUZyYW1lKGNvbnN0IHVpbnQ4X3QgKmN4ZGF0YSwgaW50IHNpemUpOworCisgIER4RGF0YUl0ZXJhdG9yIEdldER4RGF0YSgpIHsKKyAgICByZXR1cm4gRHhEYXRhSXRlcmF0b3IoJmRlY29kZXJfKTsKKyAgfQorCisgIHZvaWQgc2V0X2RlYWRsaW5lKHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpIHsKKyAgICBkZWFkbGluZV8gPSBkZWFkbGluZTsKKyAgfQorCisgIHZvaWQgQ29udHJvbChpbnQgY3RybF9pZCwgaW50IGFyZykgeworICAgIGNvbnN0IHZweF9jb2RlY19lcnJfdCByZXMgPSB2cHhfY29kZWNfY29udHJvbF8oJmRlY29kZXJfLCBjdHJsX2lkLCBhcmcpOworICAgIEFTU0VSVF9FUShWUFhfQ09ERUNfT0ssIHJlcykgPDwgRGVjb2RlRXJyb3IoKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBjb25zdCBjaGFyICpEZWNvZGVFcnJvcigpIHsKKyAgICBjb25zdCBjaGFyICpkZXRhaWwgPSB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKCZkZWNvZGVyXyk7CisgICAgcmV0dXJuIGRldGFpbCA/IGRldGFpbCA6IHZweF9jb2RlY19lcnJvcigmZGVjb2Rlcl8pOworICB9CisKKyAgdnB4X2NvZGVjX2N0eF90ICAgICBkZWNvZGVyXzsKKyAgdnB4X2NvZGVjX2RlY19jZmdfdCBjZmdfOworICB1bnNpZ25lZCBpbnQgICAgICAgIGRlYWRsaW5lXzsKK307CisKKy8vIENvbW1vbiB0ZXN0IGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBEZWNvZGVyIHRlc3RzLgorY2xhc3MgRGVjb2RlclRlc3QgeworIHB1YmxpYzoKKyAgLy8gTWFpbiBsb29wLgorICB2aXJ0dWFsIHZvaWQgUnVuTG9vcChDb21wcmVzc2VkVmlkZW9Tb3VyY2UgKnZpZGVvKTsKKworICAvLyBIb29rIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBkZWNvbXByZXNzZWQgZnJhbWUuCisgIHZpcnR1YWwgdm9pZCBEZWNvbXByZXNzZWRGcmFtZUhvb2soY29uc3QgdnB4X2ltYWdlX3QmIGltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVfbnVtYmVyKSB7fQorCisgcHJvdGVjdGVkOgorICBEZWNvZGVyVGVzdCgpIHt9CisKKyAgdmlydHVhbCB+RGVjb2RlclRlc3QoKSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGxpYnZweF90ZXN0CisKKyNlbmRpZiAgLy8gVEVTVF9ERUNPREVfVEVTVF9EUklWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L2VuY29kZV90ZXN0X2RyaXZlci5jYyBiL2xpYnZweC90ZXN0L2VuY29kZV90ZXN0X2RyaXZlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmIzOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvZW5jb2RlX3Rlc3RfZHJpdmVyLmNjCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInRlc3QvZW5jb2RlX3Rlc3RfZHJpdmVyLmgiCisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCisjaW5jbHVkZSAidGVzdC9kZWNvZGVfdGVzdF9kcml2ZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgInRlc3QvdmlkZW9fc291cmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgbGlidnB4X3Rlc3Qgewordm9pZCBFbmNvZGVyOjpFbmNvZGVGcmFtZShWaWRlb1NvdXJjZSAqdmlkZW8sIGNvbnN0IHVuc2lnbmVkIGxvbmcgZnJhbWVfZmxhZ3MpIHsKKyAgaWYgKHZpZGVvLT5pbWcoKSkKKyAgICBFbmNvZGVGcmFtZUludGVybmFsKCp2aWRlbywgZnJhbWVfZmxhZ3MpOworICBlbHNlCisgICAgRmx1c2goKTsKKworICAvLyBIYW5kbGUgdHdvcGFzcyBzdGF0cworICBDeERhdGFJdGVyYXRvciBpdGVyID0gR2V0Q3hEYXRhKCk7CisKKyAgd2hpbGUgKGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0ID0gaXRlci5OZXh0KCkpIHsKKyAgICBpZiAocGt0LT5raW5kICE9IFZQWF9DT0RFQ19TVEFUU19QS1QpCisgICAgICBjb250aW51ZTsKKworICAgIHN0YXRzXy0+QXBwZW5kKCpwa3QpOworICB9Cit9CisKK3ZvaWQgRW5jb2Rlcjo6RW5jb2RlRnJhbWVJbnRlcm5hbChjb25zdCBWaWRlb1NvdXJjZSAmdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBmcmFtZV9mbGFncykgeworICB2cHhfY29kZWNfZXJyX3QgcmVzOworICBjb25zdCB2cHhfaW1hZ2VfdCAqaW1nID0gdmlkZW8uaW1nKCk7CisKKyAgLy8gSGFuZGxlIGZpcnN0IGZyYW1lIGluaXRpYWxpemF0aW9uCisgIGlmICghZW5jb2Rlcl8ucHJpdikgeworICAgIGNmZ18uZ193ID0gaW1nLT5kX3c7CisgICAgY2ZnXy5nX2ggPSBpbWctPmRfaDsKKyAgICBjZmdfLmdfdGltZWJhc2UgPSB2aWRlby50aW1lYmFzZSgpOworICAgIGNmZ18ucmNfdHdvcGFzc19zdGF0c19pbiA9IHN0YXRzXy0+YnVmKCk7CisgICAgcmVzID0gdnB4X2NvZGVjX2VuY19pbml0KCZlbmNvZGVyXywgJnZweF9jb2RlY192cDhfY3hfYWxnbywgJmNmZ18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZmxhZ3NfKTsKKyAgICBBU1NFUlRfRVEoVlBYX0NPREVDX09LLCByZXMpIDw8IEVuY29kZXJFcnJvcigpOworICB9CisKKyAgLy8gSGFuZGxlIGZyYW1lIHJlc2l6aW5nCisgIGlmIChjZmdfLmdfdyAhPSBpbWctPmRfdyB8fCBjZmdfLmdfaCAhPSBpbWctPmRfaCkgeworICAgIGNmZ18uZ193ID0gaW1nLT5kX3c7CisgICAgY2ZnXy5nX2ggPSBpbWctPmRfaDsKKyAgICByZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXQoJmVuY29kZXJfLCAmY2ZnXyk7CisgICAgQVNTRVJUX0VRKFZQWF9DT0RFQ19PSywgcmVzKSA8PCBFbmNvZGVyRXJyb3IoKTsKKyAgfQorCisgIC8vIEVuY29kZSB0aGUgZnJhbWUKKyAgcmVzID0gdnB4X2NvZGVjX2VuY29kZSgmZW5jb2Rlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uaW1nKCksIHZpZGVvLnB0cygpLCB2aWRlby5kdXJhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2ZsYWdzLCBkZWFkbGluZV8pOworICBBU1NFUlRfRVEoVlBYX0NPREVDX09LLCByZXMpIDw8IEVuY29kZXJFcnJvcigpOworfQorCit2b2lkIEVuY29kZXI6OkZsdXNoKCkgeworICBjb25zdCB2cHhfY29kZWNfZXJyX3QgcmVzID0gdnB4X2NvZGVjX2VuY29kZSgmZW5jb2Rlcl8sIE5VTEwsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lXyk7CisgIEFTU0VSVF9FUShWUFhfQ09ERUNfT0ssIHJlcykgPDwgRW5jb2RlckVycm9yKCk7Cit9CisKK3ZvaWQgRW5jb2RlclRlc3Q6OlNldE1vZGUoVGVzdE1vZGUgbW9kZSkgeworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIGtSZWFsVGltZToKKyAgICAgIGRlYWRsaW5lXyA9IFZQWF9ETF9SRUFMVElNRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBrT25lUGFzc0dvb2Q6CisgICAgY2FzZSBrVHdvUGFzc0dvb2Q6CisgICAgICBkZWFkbGluZV8gPSBWUFhfRExfR09PRF9RVUFMSVRZOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtPbmVQYXNzQmVzdDoKKyAgICBjYXNlIGtUd29QYXNzQmVzdDoKKyAgICAgIGRlYWRsaW5lXyA9IFZQWF9ETF9CRVNUX1FVQUxJVFk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlVuZXhwZWN0ZWQgbW9kZSAiIDw8IG1vZGU7CisgIH0KKworICBpZiAobW9kZSA9PSBrVHdvUGFzc0dvb2QgfHwgbW9kZSA9PSBrVHdvUGFzc0Jlc3QpCisgICAgcGFzc2VzXyA9IDI7CisgIGVsc2UKKyAgICBwYXNzZXNfID0gMTsKK30KKy8vIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuICJ0cnVlIiBtb3N0IG9mIHRoZSB0aW1lLCB0aGVyZWZvcmUgbm8gZWFybHkKKy8vIGJyZWFrLW91dCBpcyBpbXBsZW1lbnRlZCB3aXRoaW4gdGhlIG1hdGNoIGNoZWNraW5nIHByb2Nlc3MuCitzdGF0aWMgYm9vbCBjb21wYXJlX2ltZyhjb25zdCB2cHhfaW1hZ2VfdCAqaW1nMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV90ICppbWcyKSB7CisgIGJvb2wgbWF0Y2ggPSAoaW1nMS0+Zm10ID09IGltZzItPmZtdCkgJiYKKyAgICAgICAgICAgICAgIChpbWcxLT5kX3cgPT0gaW1nMi0+ZF93KSAmJgorICAgICAgICAgICAgICAgKGltZzEtPmRfaCA9PSBpbWcyLT5kX2gpOworCisgIGNvbnN0IHVuc2lnbmVkIGludCB3aWR0aF95ICA9IGltZzEtPmRfdzsKKyAgY29uc3QgdW5zaWduZWQgaW50IGhlaWdodF95ID0gaW1nMS0+ZF9oOworICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodF95OyArK2kpCisgICAgbWF0Y2ggPSAoIG1lbWNtcChpbWcxLT5wbGFuZXNbVlBYX1BMQU5FX1ldICsgaSAqIGltZzEtPnN0cmlkZVtWUFhfUExBTkVfWV0sCisgICAgICAgICAgICAgICAgICAgICBpbWcyLT5wbGFuZXNbVlBYX1BMQU5FX1ldICsgaSAqIGltZzItPnN0cmlkZVtWUFhfUExBTkVfWV0sCisgICAgICAgICAgICAgICAgICAgICB3aWR0aF95KSA9PSAwKSAmJiBtYXRjaDsKKyAgY29uc3QgdW5zaWduZWQgaW50IHdpZHRoX3V2ICA9IChpbWcxLT5kX3cgKyAxKSA+PiAxOworICBjb25zdCB1bnNpZ25lZCBpbnQgaGVpZ2h0X3V2ID0gKGltZzEtPmRfaCArIDEpID4+IDE7CisgIGZvciAoaSA9IDA7IGkgPCAgaGVpZ2h0X3V2OyArK2kpCisgICAgbWF0Y2ggPSAoIG1lbWNtcChpbWcxLT5wbGFuZXNbVlBYX1BMQU5FX1VdICsgaSAqIGltZzEtPnN0cmlkZVtWUFhfUExBTkVfVV0sCisgICAgICAgICAgICAgICAgICAgICBpbWcyLT5wbGFuZXNbVlBYX1BMQU5FX1VdICsgaSAqIGltZzItPnN0cmlkZVtWUFhfUExBTkVfVV0sCisgICAgICAgICAgICAgICAgICAgICB3aWR0aF91dikgPT0gMCkgJiYgbWF0Y2g7CisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHRfdXY7ICsraSkKKyAgICBtYXRjaCA9ICggbWVtY21wKGltZzEtPnBsYW5lc1tWUFhfUExBTkVfVl0gKyBpICogaW1nMS0+c3RyaWRlW1ZQWF9QTEFORV9WXSwKKyAgICAgICAgICAgICAgICAgICAgIGltZzItPnBsYW5lc1tWUFhfUExBTkVfVl0gKyBpICogaW1nMi0+c3RyaWRlW1ZQWF9QTEFORV9WXSwKKyAgICAgICAgICAgICAgICAgICAgIHdpZHRoX3V2KSA9PSAwKSAmJiBtYXRjaDsKKyAgcmV0dXJuIG1hdGNoOworfQorCit2b2lkIEVuY29kZXJUZXN0OjpSdW5Mb29wKFZpZGVvU291cmNlICp2aWRlbykgeworI2lmIENPTkZJR19WUDhfREVDT0RFUgorICB2cHhfY29kZWNfZGVjX2NmZ190IGRlY19jZmcgPSB7MH07CisjZW5kaWYKKworICBzdGF0c18uUmVzZXQoKTsKKworICBmb3IgKHVuc2lnbmVkIGludCBwYXNzID0gMDsgcGFzcyA8IHBhc3Nlc187IHBhc3MrKykgeworICAgIGxhc3RfcHRzXyA9IDA7CisKKyAgICBpZiAocGFzc2VzXyA9PSAxKQorICAgICAgY2ZnXy5nX3Bhc3MgPSBWUFhfUkNfT05FX1BBU1M7CisgICAgZWxzZSBpZiAocGFzcyA9PSAwKQorICAgICAgY2ZnXy5nX3Bhc3MgPSBWUFhfUkNfRklSU1RfUEFTUzsKKyAgICBlbHNlCisgICAgICBjZmdfLmdfcGFzcyA9IFZQWF9SQ19MQVNUX1BBU1M7CisKKyAgICBCZWdpblBhc3NIb29rKHBhc3MpOworICAgIEVuY29kZXIgZW5jb2RlcihjZmdfLCBkZWFkbGluZV8sIGluaXRfZmxhZ3NfLCAmc3RhdHNfKTsKKyNpZiBDT05GSUdfVlA4X0RFQ09ERVIKKyAgICBEZWNvZGVyIGRlY29kZXIoZGVjX2NmZywgMCk7CisgICAgYm9vbCBoYXNfY3hkYXRhID0gZmFsc2U7CisjZW5kaWYKKyAgICBib29sIGFnYWluOworICAgIGZvciAoYWdhaW4gPSB0cnVlLCB2aWRlby0+QmVnaW4oKTsgYWdhaW47IHZpZGVvLT5OZXh0KCkpIHsKKyAgICAgIGFnYWluID0gdmlkZW8tPmltZygpICE9IE5VTEw7CisKKyAgICAgIFByZUVuY29kZUZyYW1lSG9vayh2aWRlbyk7CisgICAgICBQcmVFbmNvZGVGcmFtZUhvb2sodmlkZW8sICZlbmNvZGVyKTsKKyAgICAgIGVuY29kZXIuRW5jb2RlRnJhbWUodmlkZW8sIGZyYW1lX2ZsYWdzXyk7CisKKyAgICAgIEN4RGF0YUl0ZXJhdG9yIGl0ZXIgPSBlbmNvZGVyLkdldEN4RGF0YSgpOworCisgICAgICB3aGlsZSAoY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QgPSBpdGVyLk5leHQoKSkgeworICAgICAgICBhZ2FpbiA9IHRydWU7CisKKyAgICAgICAgc3dpdGNoIChwa3QtPmtpbmQpIHsKKyAgICAgICAgICBjYXNlIFZQWF9DT0RFQ19DWF9GUkFNRV9QS1Q6CisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCisgICAgICAgICAgICBoYXNfY3hkYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlY29kZXIuRGVjb2RlRnJhbWUoKGNvbnN0IHVpbnQ4X3QqKXBrdC0+ZGF0YS5mcmFtZS5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS5mcmFtZS5zeik7CisjZW5kaWYKKyAgICAgICAgICAgIEFTU0VSVF9HRShwa3QtPmRhdGEuZnJhbWUucHRzLCBsYXN0X3B0c18pOworICAgICAgICAgICAgbGFzdF9wdHNfID0gcGt0LT5kYXRhLmZyYW1lLnB0czsKKyAgICAgICAgICAgIEZyYW1lUGt0SG9vayhwa3QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFZQWF9DT0RFQ19QU05SX1BLVDoKKyAgICAgICAgICAgIFBTTlJQa3RIb29rKHBrdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCisgICAgICBpZiAoaGFzX2N4ZGF0YSkgeworICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCAqaW1nX2VuYyA9IGVuY29kZXIuR2V0UHJldmlld0ZyYW1lKCk7CisgICAgICAgIER4RGF0YUl0ZXJhdG9yIGRlY19pdGVyID0gZGVjb2Rlci5HZXREeERhdGEoKTsKKyAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgKmltZ19kZWMgPSBkZWNfaXRlci5OZXh0KCk7CisgICAgICAgIGlmKGltZ19lbmMgJiYgaW1nX2RlYykgeworICAgICAgICAgIGNvbnN0IGJvb2wgcmVzID0gY29tcGFyZV9pbWcoaW1nX2VuYywgaW1nX2RlYyk7CisgICAgICAgICAgQVNTRVJUX1RSVUUocmVzKTw8ICJFbmNvZGVyL0RlY29kZXIgbWlzbWF0Y2ggZm91bmQuIjsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZiAoIUNvbnRpbnVlKCkpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEVuZFBhc3NIb29rKCk7CisKKyAgICBpZiAoIUNvbnRpbnVlKCkpCisgICAgICBicmVhazsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGxpYnZweF90ZXN0CmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9lbmNvZGVfdGVzdF9kcml2ZXIuaCBiL2xpYnZweC90ZXN0L2VuY29kZV90ZXN0X2RyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDFmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9lbmNvZGVfdGVzdF9kcml2ZXIuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBURVNUX0VOQ09ERV9URVNUX0RSSVZFUl9IXworI2RlZmluZSBURVNUX0VOQ09ERV9URVNUX0RSSVZFUl9IXworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhjeC5oIgorCituYW1lc3BhY2UgbGlidnB4X3Rlc3QgeworCitjbGFzcyBWaWRlb1NvdXJjZTsKKworZW51bSBUZXN0TW9kZSB7CisgIGtSZWFsVGltZSwKKyAga09uZVBhc3NHb29kLAorICBrT25lUGFzc0Jlc3QsCisgIGtUd29QYXNzR29vZCwKKyAga1R3b1Bhc3NCZXN0Cit9OworI2RlZmluZSBBTExfVEVTVF9NT0RFUyA6OnRlc3Rpbmc6OlZhbHVlcyg6OmxpYnZweF90ZXN0OjprUmVhbFRpbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpsaWJ2cHhfdGVzdDo6a09uZVBhc3NHb29kLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6bGlidnB4X3Rlc3Q6OmtPbmVQYXNzQmVzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OmxpYnZweF90ZXN0OjprVHdvUGFzc0dvb2QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpsaWJ2cHhfdGVzdDo6a1R3b1Bhc3NCZXN0KQorCisjZGVmaW5lIE9ORV9QQVNTX1RFU1RfTU9ERVMgOjp0ZXN0aW5nOjpWYWx1ZXMoOjpsaWJ2cHhfdGVzdDo6a1JlYWxUaW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpsaWJ2cHhfdGVzdDo6a09uZVBhc3NHb29kLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpsaWJ2cHhfdGVzdDo6a09uZVBhc3NCZXN0KQorCisKKy8vIFByb3ZpZGVzIGFuIG9iamVjdCB0byBoYW5kbGUgdGhlIGxpYnZweCBnZXRfY3hfZGF0YSgpIGl0ZXJhdGlvbiBwYXR0ZXJuCitjbGFzcyBDeERhdGFJdGVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBDeERhdGFJdGVyYXRvcih2cHhfY29kZWNfY3R4X3QgKmVuY29kZXIpCisgICAgOiBlbmNvZGVyXyhlbmNvZGVyKSwgaXRlcl8oTlVMTCkge30KKworICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKk5leHQoKSB7CisgICAgcmV0dXJuIHZweF9jb2RlY19nZXRfY3hfZGF0YShlbmNvZGVyXywgJml0ZXJfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdnB4X2NvZGVjX2N0eF90ICAqZW5jb2Rlcl87CisgIHZweF9jb2RlY19pdGVyX3QgIGl0ZXJfOworfTsKKworLy8gSW1wbGVtZW50cyBhbiBpbi1tZW1vcnkgc3RvcmUgZm9yIGxpYnZweCB0d29wYXNzIHN0YXRpc3RpY3MKK2NsYXNzIFR3b3Bhc3NTdGF0c1N0b3JlIHsKKyBwdWJsaWM6CisgIHZvaWQgQXBwZW5kKGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAmcGt0KSB7CisgICAgYnVmZmVyXy5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KHBrdC5kYXRhLnR3b3Bhc3Nfc3RhdHMuYnVmKSwKKyAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS50d29wYXNzX3N0YXRzLnN6KTsKKyAgfQorCisgIHZweF9maXhlZF9idWZfdCBidWYoKSB7CisgICAgY29uc3QgdnB4X2ZpeGVkX2J1Zl90IGJ1ZiA9IHsgJmJ1ZmZlcl9bMF0sIGJ1ZmZlcl8uc2l6ZSgpIH07CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIHZvaWQgUmVzZXQoKSB7CisgICAgYnVmZmVyXy5jbGVhcigpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nICBidWZmZXJfOworfTsKKworCisvLyBQcm92aWRlcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIG1hbmFnZSBvbmUgdmlkZW8gZW5jb2RpbmcgcGFzcywgZ2l2ZW4KKy8vIGEgY29uZmlndXJhdGlvbiBhbmQgdmlkZW8gc291cmNlLgorLy8KKy8vIFRPRE8oamtvbGVzemFyKTogVGhlIGV4YWN0IHNlcnZpY2VzIGl0IHByb3ZpZGVzIGFuZCB0aGUgYXBwcm9wcmlhdGUKKy8vIGxldmVsIG9mIGFic3RyYWN0aW9uIHdpbGwgYmUgZmxlc2hlZCBvdXQgYXMgbW9yZSB0ZXN0cyBhcmUgd3JpdHRlbi4KK2NsYXNzIEVuY29kZXIgeworIHB1YmxpYzoKKyAgRW5jb2Rlcih2cHhfY29kZWNfZW5jX2NmZ190IGNmZywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSwKKyAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGluaXRfZmxhZ3MsIFR3b3Bhc3NTdGF0c1N0b3JlICpzdGF0cykKKyAgICA6IGNmZ18oY2ZnKSwgZGVhZGxpbmVfKGRlYWRsaW5lKSwgaW5pdF9mbGFnc18oaW5pdF9mbGFncyksIHN0YXRzXyhzdGF0cykgeworICAgIG1lbXNldCgmZW5jb2Rlcl8sIDAsIHNpemVvZihlbmNvZGVyXykpOworICB9CisKKyAgfkVuY29kZXIoKSB7CisgICAgdnB4X2NvZGVjX2Rlc3Ryb3koJmVuY29kZXJfKTsKKyAgfQorCisgIEN4RGF0YUl0ZXJhdG9yIEdldEN4RGF0YSgpIHsKKyAgICByZXR1cm4gQ3hEYXRhSXRlcmF0b3IoJmVuY29kZXJfKTsKKyAgfQorCisgIGNvbnN0IHZweF9pbWFnZV90ICpHZXRQcmV2aWV3RnJhbWUoKSB7CisgICAgcmV0dXJuIHZweF9jb2RlY19nZXRfcHJldmlld19mcmFtZSgmZW5jb2Rlcl8pOworICB9CisgIC8vIFRoaXMgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHZweF9jb2RlY19lbmNvZGUoKSwgc28gcmVmZXIgdG8KKyAgLy8gdnB4X2VuY29kZXIuaCBmb3IgaXRzIHNlbWFudGljcy4KKyAgdm9pZCBFbmNvZGVGcmFtZShWaWRlb1NvdXJjZSAqdmlkZW8sIGNvbnN0IHVuc2lnbmVkIGxvbmcgZnJhbWVfZmxhZ3MpOworCisgIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIEVuY29kZUZyYW1lKCkKKyAgdm9pZCBFbmNvZGVGcmFtZShWaWRlb1NvdXJjZSAqdmlkZW8pIHsKKyAgICBFbmNvZGVGcmFtZSh2aWRlbywgMCk7CisgIH0KKworICB2b2lkIENvbnRyb2woaW50IGN0cmxfaWQsIGludCBhcmcpIHsKKyAgICBjb25zdCB2cHhfY29kZWNfZXJyX3QgcmVzID0gdnB4X2NvZGVjX2NvbnRyb2xfKCZlbmNvZGVyXywgY3RybF9pZCwgYXJnKTsKKyAgICBBU1NFUlRfRVEoVlBYX0NPREVDX09LLCByZXMpIDw8IEVuY29kZXJFcnJvcigpOworICB9CisKKyAgdm9pZCBzZXRfZGVhZGxpbmUodW5zaWduZWQgbG9uZyBkZWFkbGluZSkgeworICAgIGRlYWRsaW5lXyA9IGRlYWRsaW5lOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IGNoYXIgKkVuY29kZXJFcnJvcigpIHsKKyAgICBjb25zdCBjaGFyICpkZXRhaWwgPSB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKCZlbmNvZGVyXyk7CisgICAgcmV0dXJuIGRldGFpbCA/IGRldGFpbCA6IHZweF9jb2RlY19lcnJvcigmZW5jb2Rlcl8pOworICB9CisKKyAgLy8gRW5jb2RlIGFuIGltYWdlCisgIHZvaWQgRW5jb2RlRnJhbWVJbnRlcm5hbChjb25zdCBWaWRlb1NvdXJjZSAmdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGZyYW1lX2ZsYWdzKTsKKworICAvLyBGbHVzaCB0aGUgZW5jb2RlciBvbiBFT1MKKyAgdm9pZCBGbHVzaCgpOworCisgIHZweF9jb2RlY19jdHhfdCAgICAgIGVuY29kZXJfOworICB2cHhfY29kZWNfZW5jX2NmZ190ICBjZmdfOworICB1bnNpZ25lZCBsb25nICAgICAgICBkZWFkbGluZV87CisgIHVuc2lnbmVkIGxvbmcgICAgICAgIGluaXRfZmxhZ3NfOworICBUd29wYXNzU3RhdHNTdG9yZSAgICpzdGF0c187Cit9OworCisvLyBDb21tb24gdGVzdCBmdW5jdGlvbmFsaXR5IGZvciBhbGwgRW5jb2RlciB0ZXN0cy4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIGEgbWl4aW4gd2hpY2ggcHJvdmlkZXMgdGhlIG1haW4gbG9vcCBjb21tb24gdG8gYWxsCisvLyBlbmNvZGVyIHRlc3RzLiBJdCBwcm92aWRlcyBob29rcyB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCisvLyB0byBpbXBsZW1lbnQgZWFjaCB0ZXN0J3Mgc3BlY2lmaWMgYmVoYXZpb3IsIHdoaWxlIGNlbnRyYWxpemluZyB0aGUgYnVsaworLy8gb2YgdGhlIGJvaWxlcnBsYXRlLiBOb3RlIHRoYXQgaXQgZG9lc24ndCBpbmhlcml0IHRoZSBndGVzdCB0ZXN0aW5nCisvLyBjbGFzc2VzIGRpcmVjdGx5LCBzbyB0aGF0IHRlc3RzIGNhbiBiZSBwYXJhbWV0ZXJpemVkIGRpZmZlcmVudGx5LgorY2xhc3MgRW5jb2RlclRlc3QgeworIHByb3RlY3RlZDoKKyAgRW5jb2RlclRlc3QoKSA6IGFib3J0XyhmYWxzZSksIGluaXRfZmxhZ3NfKDApLCBmcmFtZV9mbGFnc18oMCksCisgICAgICAgICAgICAgICAgICBsYXN0X3B0c18oMCkge30KKworICB2aXJ0dWFsIH5FbmNvZGVyVGVzdCgpIHt9CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgY2ZnXyBtZW1iZXIgd2l0aCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorICB2b2lkIEluaXRpYWxpemVDb25maWcoKSB7CisgICAgY29uc3QgdnB4X2NvZGVjX2Vycl90IHJlcyA9IHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnB4X2NvZGVjX3ZwOF9jeF9hbGdvLCAmY2ZnXywgMCk7CisgICAgQVNTRVJUX0VRKFZQWF9DT0RFQ19PSywgcmVzKTsKKyAgfQorCisgIC8vIE1hcCB0aGUgVGVzdE1vZGUgZW51bSB0byB0aGUgZGVhZGxpbmVfIGFuZCBwYXNzZXNfIHZhcmlhYmxlcy4KKyAgdm9pZCBTZXRNb2RlKFRlc3RNb2RlIG1vZGUpOworCisgIC8vIE1haW4gbG9vcC4KKyAgdmlydHVhbCB2b2lkIFJ1bkxvb3AoVmlkZW9Tb3VyY2UgKnZpZGVvKTsKKworICAvLyBIb29rIHRvIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGFzcy4KKyAgdmlydHVhbCB2b2lkIEJlZ2luUGFzc0hvb2sodW5zaWduZWQgaW50IHBhc3MpIHt9CisKKyAgLy8gSG9vayB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhIHBhc3MuCisgIHZpcnR1YWwgdm9pZCBFbmRQYXNzSG9vaygpIHt9CisKKyAgLy8gSG9vayB0byBiZSBjYWxsZWQgYmVmb3JlIGVuY29kaW5nIGEgZnJhbWUuCisgIHZpcnR1YWwgdm9pZCBQcmVFbmNvZGVGcmFtZUhvb2soVmlkZW9Tb3VyY2UgKnZpZGVvKSB7fQorICB2aXJ0dWFsIHZvaWQgUHJlRW5jb2RlRnJhbWVIb29rKFZpZGVvU291cmNlICp2aWRlbywgRW5jb2RlciAqZW5jb2Rlcikge30KKworICAvLyBIb29rIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBjb21wcmVzc2VkIGRhdGEgcGFja2V0LgorICB2aXJ0dWFsIHZvaWQgRnJhbWVQa3RIb29rKGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0KSB7fQorCisgIC8vIEhvb2sgdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IFBTTlIgcGFja2V0LgorICB2aXJ0dWFsIHZvaWQgUFNOUlBrdEhvb2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpIHt9CisKKyAgLy8gSG9vayB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZW5jb2RlIGxvb3Agc2hvdWxkIGNvbnRpbnVlLgorICB2aXJ0dWFsIGJvb2wgQ29udGludWUoKSBjb25zdCB7IHJldHVybiAhYWJvcnRfOyB9CisKKyAgYm9vbCAgICAgICAgICAgICAgICAgYWJvcnRfOworICB2cHhfY29kZWNfZW5jX2NmZ190ICBjZmdfOworICB1bnNpZ25lZCBpbnQgICAgICAgICBwYXNzZXNfOworICB1bnNpZ25lZCBsb25nICAgICAgICBkZWFkbGluZV87CisgIFR3b3Bhc3NTdGF0c1N0b3JlICAgIHN0YXRzXzsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgaW5pdF9mbGFnc187CisgIHVuc2lnbmVkIGxvbmcgICAgICAgIGZyYW1lX2ZsYWdzXzsKKyAgdnB4X2NvZGVjX3B0c190ICAgICAgbGFzdF9wdHNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGxpYnZweF90ZXN0CisKKyNlbmRpZiAgLy8gVEVTVF9FTkNPREVfVEVTVF9EUklWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L2Vycm9yX3Jlc2lsaWVuY2VfdGVzdC5jYyBiL2xpYnZweC90ZXN0L2Vycm9yX3Jlc2lsaWVuY2VfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWM2NzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvZXJyb3JfcmVzaWxpZW5jZV90ZXN0LmNjCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorKi8KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdC9lbmNvZGVfdGVzdF9kcml2ZXIuaCIKKyNpbmNsdWRlICJ0ZXN0L2k0MjBfdmlkZW9fc291cmNlLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEVycm9yUmVzaWxpZW5jZVRlc3QgOiBwdWJsaWMgbGlidnB4X3Rlc3Q6OkVuY29kZXJUZXN0LAorICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7CisgcHJvdGVjdGVkOgorICBFcnJvclJlc2lsaWVuY2VUZXN0KCkgeworICAgIHBzbnJfID0gMC4wOworICAgIG5mcmFtZXNfID0gMDsKKyAgICBlbmNvZGluZ19tb2RlXyA9IHN0YXRpY19jYXN0PGxpYnZweF90ZXN0OjpUZXN0TW9kZT4oR2V0UGFyYW0oKSk7CisgIH0KKyAgdmlydHVhbCB+RXJyb3JSZXNpbGllbmNlVGVzdCgpIHt9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEluaXRpYWxpemVDb25maWcoKTsKKyAgICBTZXRNb2RlKGVuY29kaW5nX21vZGVfKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBCZWdpblBhc3NIb29rKHVuc2lnbmVkIGludCAvKnBhc3MqLykgeworICAgIHBzbnJfID0gMC4wOworICAgIG5mcmFtZXNfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBDb250aW51ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIUhhc0ZhdGFsRmFpbHVyZSgpICYmICFhYm9ydF87CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUFNOUlBrdEhvb2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpIHsKKyAgICBwc25yXyArPSBwa3QtPmRhdGEucHNuci5wc25yWzBdOworICAgIG5mcmFtZXNfKys7CisgIH0KKworICBkb3VibGUgR2V0QXZlcmFnZVBzbnIoKSBjb25zdCB7CisgICAgaWYgKG5mcmFtZXNfKQorICAgICAgcmV0dXJuIHBzbnJfIC8gbmZyYW1lc187CisgICAgcmV0dXJuIDAuMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgZG91YmxlIHBzbnJfOworICB1bnNpZ25lZCBpbnQgbmZyYW1lc187CisgIGxpYnZweF90ZXN0OjpUZXN0TW9kZSBlbmNvZGluZ19tb2RlXzsKK307CisKK1RFU1RfUChFcnJvclJlc2lsaWVuY2VUZXN0LCBPblZlcnN1c09mZikgeworICBjb25zdCB2cHhfcmF0aW9uYWwgdGltZWJhc2UgPSB7IDMzMzMzMzMzLCAxMDAwMDAwMDAwIH07CisgIGNmZ18uZ190aW1lYmFzZSA9IHRpbWViYXNlOworICBjZmdfLnJjX3RhcmdldF9iaXRyYXRlID0gMjAwMDsKKyAgY2ZnXy5nX2xhZ19pbl9mcmFtZXMgPSAyNTsKKworICBpbml0X2ZsYWdzXyA9IFZQWF9DT0RFQ19VU0VfUFNOUjsKKworICBsaWJ2cHhfdGVzdDo6STQyMFZpZGVvU291cmNlIHZpZGVvKCJoYW50cm9fY29sbGFnZV93MzUyaDI4OC55dXYiLCAzNTIsIDI4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZS5kZW4sIHRpbWViYXNlLm51bSwgMCwgMzApOworCisgIC8vIEVycm9yIHJlc2lsaWVudCBtb2RlIE9GRi4KKyAgY2ZnXy5nX2Vycm9yX3Jlc2lsaWVudCA9IDA7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJ1bkxvb3AoJnZpZGVvKSk7CisgIGNvbnN0IGRvdWJsZSBwc25yX3Jlc2lsaWVuY2Vfb2ZmID0gR2V0QXZlcmFnZVBzbnIoKTsKKyAgRVhQRUNUX0dUKHBzbnJfcmVzaWxpZW5jZV9vZmYsIDI1LjApOworCisgIC8vIEVycm9yIHJlc2lsaWVudCBtb2RlIE9OLgorICBjZmdfLmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUnVuTG9vcCgmdmlkZW8pKTsKKyAgY29uc3QgZG91YmxlIHBzbnJfcmVzaWxpZW5jZV9vbiA9IEdldEF2ZXJhZ2VQc25yKCk7CisgIEVYUEVDVF9HVChwc25yX3Jlc2lsaWVuY2Vfb24sIDI1LjApOworCisgIC8vIFRlc3QgdGhhdCB0dXJuaW5nIG9uIGVycm9yIHJlc2lsaWVudCBtb2RlIGh1cnRzIGJ5IDEwJSBhdCBtb3N0LgorICBpZiAocHNucl9yZXNpbGllbmNlX29mZiA+IDAuMCkgeworICAgIGNvbnN0IGRvdWJsZSBwc25yX3JhdGlvID0gcHNucl9yZXNpbGllbmNlX29uIC8gcHNucl9yZXNpbGllbmNlX29mZjsKKyAgICBFWFBFQ1RfR0UocHNucl9yYXRpbywgMC45KTsKKyAgICBFWFBFQ1RfTEUocHNucl9yYXRpbywgMS4xKTsKKyAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChPbk9mZlRlc3QsIEVycm9yUmVzaWxpZW5jZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBPTkVfUEFTU19URVNUX01PREVTKTsKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvZmRjdDR4NF90ZXN0LmNjIGIvbGlidnB4L3Rlc3QvZmRjdDR4NF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWIyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9mZGN0NHg0X3Rlc3QuY2MKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyovCisKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZweF9ydGNkLmgiCit9CisKKyNpbmNsdWRlICJ0ZXN0L2FjbV9yYW5kb20uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbnRlZ2VyLmgiCisKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50IGNvc3BpOHNxcnQybWludXMxID0gMjAwOTE7Citjb25zdCBpbnQgc2lucGk4c3FydDIgPSAzNTQ2ODsKKwordm9pZCByZWZlcmVuY2VfaWRjdDR4NChjb25zdCBpbnQxNl90ICppbnB1dCwgaW50MTZfdCAqb3V0cHV0KSB7CisgIGNvbnN0IGludDE2X3QgKmlwID0gaW5wdXQ7CisgIGludDE2X3QgKm9wID0gb3V0cHV0OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGExID0gaXBbMF0gKyBpcFs4XTsKKyAgICBjb25zdCBpbnQgYjEgPSBpcFswXSAtIGlwWzhdOworICAgIGNvbnN0IGludCB0ZW1wMSA9IChpcFs0XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICBjb25zdCBpbnQgdGVtcDIgPSBpcFsxMl0gKyAoKGlwWzEyXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgY29uc3QgaW50IGMxID0gdGVtcDEgLSB0ZW1wMjsKKyAgICBjb25zdCBpbnQgdGVtcDMgPSBpcFs0XSArICgoaXBbNF0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIGNvbnN0IGludCB0ZW1wNCA9IChpcFsxMl0gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgY29uc3QgaW50IGQxID0gdGVtcDMgKyB0ZW1wNDsKKyAgICBvcFswXSA9IGExICsgZDE7CisgICAgb3BbMTJdID0gYTEgLSBkMTsKKyAgICBvcFs0XSA9IGIxICsgYzE7CisgICAgb3BbOF0gPSBiMSAtIGMxOworICAgICsraXA7CisgICAgKytvcDsKKyAgfQorICBpcCA9IG91dHB1dDsKKyAgb3AgPSBvdXRwdXQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGExID0gaXBbMF0gKyBpcFsyXTsKKyAgICBjb25zdCBpbnQgYjEgPSBpcFswXSAtIGlwWzJdOworICAgIGNvbnN0IGludCB0ZW1wMSA9IChpcFsxXSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICBjb25zdCBpbnQgdGVtcDIgPSBpcFszXSArICgoaXBbM10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIGNvbnN0IGludCBjMSA9IHRlbXAxIC0gdGVtcDI7CisgICAgY29uc3QgaW50IHRlbXAzID0gaXBbMV0gKyAoKGlwWzFdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICBjb25zdCBpbnQgdGVtcDQgPSAoaXBbM10gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgY29uc3QgaW50IGQxID0gdGVtcDMgKyB0ZW1wNDsKKyAgICBvcFswXSA9IChhMSArIGQxICsgNCkgPj4gMzsKKyAgICBvcFszXSA9IChhMSAtIGQxICsgNCkgPj4gMzsKKyAgICBvcFsxXSA9IChiMSArIGMxICsgNCkgPj4gMzsKKyAgICBvcFsyXSA9IChiMSAtIGMxICsgNCkgPj4gMzsKKyAgICBpcCArPSA0OworICAgIG9wICs9IDQ7CisgIH0KK30KKwordXNpbmcgbGlidnB4X3Rlc3Q6OkFDTVJhbmRvbTsKKworVEVTVChWcDhGZGN0VGVzdCwgU2lnbkJpYXNDaGVjaykgeworICBBQ01SYW5kb20gcm5kKEFDTVJhbmRvbTo6RGV0ZXJtaW5pc3RpY1NlZWQoKSk7CisgIGludDE2X3QgdGVzdF9pbnB1dF9ibG9ja1sxNl07CisgIGludDE2X3QgdGVzdF9vdXRwdXRfYmxvY2tbMTZdOworICBjb25zdCBpbnQgcGl0Y2ggPSA4OworICBpbnQgY291bnRfc2lnbl9ibG9ja1sxNl1bMl07CisgIGNvbnN0IGludCBjb3VudF90ZXN0X2Jsb2NrID0gMTAwMDAwMDsKKworICBtZW1zZXQoY291bnRfc2lnbl9ibG9jaywgMCwgc2l6ZW9mKGNvdW50X3NpZ25fYmxvY2spKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50X3Rlc3RfYmxvY2s7ICsraSkgeworICAgIC8vIEluaXRpYWxpemUgYSB0ZXN0IGJsb2NrIHdpdGggaW5wdXQgcmFuZ2UgWy0yNTUsIDI1NV0uCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKQorICAgICAgdGVzdF9pbnB1dF9ibG9ja1tqXSA9IHJuZC5SYW5kOCgpIC0gcm5kLlJhbmQ4KCk7CisKKyAgICB2cDhfc2hvcnRfZmRjdDR4NF9jKHRlc3RfaW5wdXRfYmxvY2ssIHRlc3Rfb3V0cHV0X2Jsb2NrLCBwaXRjaCk7CisKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgIGlmICh0ZXN0X291dHB1dF9ibG9ja1tqXSA8IDApCisgICAgICAgICsrY291bnRfc2lnbl9ibG9ja1tqXVswXTsKKyAgICAgIGVsc2UgaWYgKHRlc3Rfb3V0cHV0X2Jsb2NrW2pdID4gMCkKKyAgICAgICAgKytjb3VudF9zaWduX2Jsb2NrW2pdWzFdOworICAgIH0KKyAgfQorCisgIGJvb2wgYmlhc19hY2NlcHRhYmxlID0gdHJ1ZTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKQorICAgIGJpYXNfYWNjZXB0YWJsZSA9IGJpYXNfYWNjZXB0YWJsZSAmJgorICAgIChhYnMoY291bnRfc2lnbl9ibG9ja1tqXVswXSAtIGNvdW50X3NpZ25fYmxvY2tbal1bMV0pIDwgMTAwMDApOworCisgIEVYUEVDVF9FUSh0cnVlLCBiaWFzX2FjY2VwdGFibGUpCisgICAgPDwgIkVycm9yOiA0eDQgRkRDVCBoYXMgYSBzaWduIGJpYXMgPiAxJSBmb3IgaW5wdXQgcmFuZ2UgWy0yNTUsIDI1NV0iOworCisgIG1lbXNldChjb3VudF9zaWduX2Jsb2NrLCAwLCBzaXplb2YoY291bnRfc2lnbl9ibG9jaykpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnRfdGVzdF9ibG9jazsgKytpKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBhIHRlc3QgYmxvY2sgd2l0aCBpbnB1dCByYW5nZSBbLTE1LCAxNV0uCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKQorICAgICAgdGVzdF9pbnB1dF9ibG9ja1tqXSA9IChybmQuUmFuZDgoKSA+PiA0KSAtIChybmQuUmFuZDgoKSA+PiA0KTsKKworICAgIHZwOF9zaG9ydF9mZGN0NHg0X2ModGVzdF9pbnB1dF9ibG9jaywgdGVzdF9vdXRwdXRfYmxvY2ssIHBpdGNoKTsKKworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgaWYgKHRlc3Rfb3V0cHV0X2Jsb2NrW2pdIDwgMCkKKyAgICAgICAgKytjb3VudF9zaWduX2Jsb2NrW2pdWzBdOworICAgICAgZWxzZSBpZiAodGVzdF9vdXRwdXRfYmxvY2tbal0gPiAwKQorICAgICAgICArK2NvdW50X3NpZ25fYmxvY2tbal1bMV07CisgICAgfQorICB9CisKKyAgYmlhc19hY2NlcHRhYmxlID0gdHJ1ZTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKQorICAgIGJpYXNfYWNjZXB0YWJsZSA9IGJpYXNfYWNjZXB0YWJsZSAmJgorICAgIChhYnMoY291bnRfc2lnbl9ibG9ja1tqXVswXSAtIGNvdW50X3NpZ25fYmxvY2tbal1bMV0pIDwgMTAwMDAwKTsKKworICBFWFBFQ1RfRVEodHJ1ZSwgYmlhc19hY2NlcHRhYmxlKQorICAgIDw8ICJFcnJvcjogNHg0IEZEQ1QgaGFzIGEgc2lnbiBiaWFzID4gMTAlIGZvciBpbnB1dCByYW5nZSBbLTE1LCAxNV0iOworfTsKKworVEVTVChWcDhGZGN0VGVzdCwgUm91bmRUcmlwRXJyb3JDaGVjaykgeworICBBQ01SYW5kb20gcm5kKEFDTVJhbmRvbTo6RGV0ZXJtaW5pc3RpY1NlZWQoKSk7CisgIGludCBtYXhfZXJyb3IgPSAwOworICBkb3VibGUgdG90YWxfZXJyb3IgPSAwOworICBjb25zdCBpbnQgY291bnRfdGVzdF9ibG9jayA9IDEwMDAwMDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnRfdGVzdF9ibG9jazsgKytpKSB7CisgICAgaW50MTZfdCB0ZXN0X2lucHV0X2Jsb2NrWzE2XTsKKyAgICBpbnQxNl90IHRlc3RfdGVtcF9ibG9ja1sxNl07CisgICAgaW50MTZfdCB0ZXN0X291dHB1dF9ibG9ja1sxNl07CisKKyAgICAvLyBJbml0aWFsaXplIGEgdGVzdCBibG9jayB3aXRoIGlucHV0IHJhbmdlIFstMjU1LCAyNTVdLgorICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7ICsraikKKyAgICAgIHRlc3RfaW5wdXRfYmxvY2tbal0gPSBybmQuUmFuZDgoKSAtIHJuZC5SYW5kOCgpOworCisgICAgY29uc3QgaW50IHBpdGNoID0gODsKKyAgICB2cDhfc2hvcnRfZmRjdDR4NF9jKHRlc3RfaW5wdXRfYmxvY2ssIHRlc3RfdGVtcF9ibG9jaywgcGl0Y2gpOworICAgIHJlZmVyZW5jZV9pZGN0NHg0KHRlc3RfdGVtcF9ibG9jaywgdGVzdF9vdXRwdXRfYmxvY2spOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICBjb25zdCBpbnQgZGlmZiA9IHRlc3RfaW5wdXRfYmxvY2tbal0gLSB0ZXN0X291dHB1dF9ibG9ja1tqXTsKKyAgICAgIGNvbnN0IGludCBlcnJvciA9IGRpZmYgKiBkaWZmOworICAgICAgaWYgKG1heF9lcnJvciA8IGVycm9yKQorICAgICAgICBtYXhfZXJyb3IgPSBlcnJvcjsKKyAgICAgIHRvdGFsX2Vycm9yICs9IGVycm9yOworICAgIH0KKyAgfQorCisgIEVYUEVDVF9HRSgxLCBtYXhfZXJyb3IgKQorICAgIDw8ICJFcnJvcjogRkRDVC9JRENUIGhhcyBhbiBpbmRpdmlkdWFsIHJvdW5kdHJpcCBlcnJvciA+IDEiOworCisgIEVYUEVDVF9HRShjb3VudF90ZXN0X2Jsb2NrLCB0b3RhbF9lcnJvcikKKyAgICA8PCAiRXJyb3I6IEZEQ1QvSURDVCBoYXMgYXZlcmFnZSByb3VuZHRyaXAgZXJyb3IgPiAxIHBlciBibG9jayI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L2k0MjBfdmlkZW9fc291cmNlLmggYi9saWJ2cHgvdGVzdC9pNDIwX3ZpZGVvX3NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOWJkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9pNDIwX3ZpZGVvX3NvdXJjZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIFRFU1RfSTQyMF9WSURFT19TT1VSQ0VfSF8KKyNkZWZpbmUgVEVTVF9JNDIwX1ZJREVPX1NPVVJDRV9IXworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSAidGVzdC92aWRlb19zb3VyY2UuaCIKKworbmFtZXNwYWNlIGxpYnZweF90ZXN0IHsKKworLy8gVGhpcyBjbGFzcyBleHRlbmRzIFZpZGVvU291cmNlIHRvIGFsbG93IHBhcnNpbmcgb2YgcmF3IHl2MTIKKy8vIHNvIHRoYXQgd2UgY2FuIGRvIGFjdHVhbCBmaWxlIGVuY29kZXMuCitjbGFzcyBJNDIwVmlkZW9Tb3VyY2UgOiBwdWJsaWMgVmlkZW9Tb3VyY2UgeworIHB1YmxpYzoKKyAgSTQyMFZpZGVvU291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICBpbnQgcmF0ZV9udW1lcmF0b3IsIGludCByYXRlX2Rlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0LCBpbnQgbGltaXQpCisgICAgICA6IGZpbGVfbmFtZV8oZmlsZV9uYW1lKSwKKyAgICAgICAgaW5wdXRfZmlsZV8oTlVMTCksCisgICAgICAgIGltZ18oTlVMTCksCisgICAgICAgIHN0YXJ0XyhzdGFydCksCisgICAgICAgIGxpbWl0XyhsaW1pdCksCisgICAgICAgIGZyYW1lXygwKSwKKyAgICAgICAgd2lkdGhfKDApLAorICAgICAgICBoZWlnaHRfKDApLAorICAgICAgICBmcmFtZXJhdGVfbnVtZXJhdG9yXyhyYXRlX251bWVyYXRvciksCisgICAgICAgIGZyYW1lcmF0ZV9kZW5vbWluYXRvcl8ocmF0ZV9kZW5vbWluYXRvcikgeworCisgICAgLy8gVGhpcyBpbml0aWFsaXplcyByYXdfc3pfLCB3aWR0aF8sIGhlaWdodF8gYW5kIGFsbG9jYXRlcyBhbiBpbWcuCisgICAgU2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgfQorCisgIHZpcnR1YWwgfkk0MjBWaWRlb1NvdXJjZSgpIHsKKyAgICB2cHhfaW1nX2ZyZWUoaW1nXyk7CisgICAgaWYgKGlucHV0X2ZpbGVfKQorICAgICAgZmNsb3NlKGlucHV0X2ZpbGVfKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBCZWdpbigpIHsKKyAgICBpZiAoaW5wdXRfZmlsZV8pCisgICAgICBmY2xvc2UoaW5wdXRfZmlsZV8pOworICAgIGlucHV0X2ZpbGVfID0gT3BlblRlc3REYXRhRmlsZShmaWxlX25hbWVfKTsKKyAgICBBU1NFUlRfVFJVRShpbnB1dF9maWxlXykgPDwgIklucHV0IGZpbGUgb3BlbiBmYWlsZWQuIEZpbGVuYW1lOiAiCisgICAgICAgIDw8IGZpbGVfbmFtZV87CisgICAgaWYgKHN0YXJ0XykgeworICAgICAgZnNlZWsoaW5wdXRfZmlsZV8sIHJhd19zel8gKiBzdGFydF8sIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICBmcmFtZV8gPSBzdGFydF87CisgICAgRmlsbEZyYW1lKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgTmV4dCgpIHsKKyAgICArK2ZyYW1lXzsKKyAgICBGaWxsRnJhbWUoKTsKKyAgfQorCisgIHZpcnR1YWwgdnB4X2ltYWdlX3QgKmltZygpIGNvbnN0IHsgcmV0dXJuIChmcmFtZV8gPCBsaW1pdF8pID8gaW1nXyA6IE5VTEw7ICB9CisKKyAgLy8gTW9kZWxzIGEgc3RyZWFtIHdoZXJlIFRpbWViYXNlID0gMS9GUFMsIHNvIHB0cyA9PSBmcmFtZS4KKyAgdmlydHVhbCB2cHhfY29kZWNfcHRzX3QgcHRzKCkgY29uc3QgeyByZXR1cm4gZnJhbWVfOyB9CisKKyAgdmlydHVhbCB1bnNpZ25lZCBsb25nIGR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgIHZpcnR1YWwgdnB4X3JhdGlvbmFsX3QgdGltZWJhc2UoKSBjb25zdCB7CisgICAgY29uc3QgdnB4X3JhdGlvbmFsX3QgdCA9IHsgZnJhbWVyYXRlX2Rlbm9taW5hdG9yXywgZnJhbWVyYXRlX251bWVyYXRvcl8gfTsKKyAgICByZXR1cm4gdDsKKyAgfQorCisgIHZpcnR1YWwgdW5zaWduZWQgaW50IGZyYW1lKCkgY29uc3QgeyByZXR1cm4gZnJhbWVfOyB9CisKKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgbGltaXQoKSBjb25zdCB7IHJldHVybiBsaW1pdF87IH0KKworICB2b2lkIFNldFNpemUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KSB7CisgICAgaWYgKHdpZHRoICE9IHdpZHRoXyB8fCBoZWlnaHQgIT0gaGVpZ2h0XykgeworICAgICAgdnB4X2ltZ19mcmVlKGltZ18pOworICAgICAgaW1nXyA9IHZweF9pbWdfYWxsb2MoTlVMTCwgVlBYX0lNR19GTVRfVlBYSTQyMCwgd2lkdGgsIGhlaWdodCwgMSk7CisgICAgICBBU1NFUlRfVFJVRShpbWdfICE9IE5VTEwpOworICAgICAgd2lkdGhfID0gd2lkdGg7CisgICAgICBoZWlnaHRfID0gaGVpZ2h0OworICAgICAgcmF3X3N6XyA9IHdpZHRoICogaGVpZ2h0ICogMyAvIDI7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB2b2lkIEZpbGxGcmFtZSgpIHsKKyAgICAvLyBSZWFkIGEgZnJhbWUgZnJvbSBpbnB1dF9maWxlLgorICAgIGlmIChmcmVhZChpbWdfLT5pbWdfZGF0YSwgcmF3X3N6XywgMSwgaW5wdXRfZmlsZV8pID09IDApIHsKKyAgICAgIGxpbWl0XyA9IGZyYW1lXzsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lXzsKKyAgRklMRSAqaW5wdXRfZmlsZV87CisgIHZweF9pbWFnZV90ICppbWdfOworICBzaXplX3QgcmF3X3N6XzsKKyAgdW5zaWduZWQgaW50IHN0YXJ0XzsKKyAgdW5zaWduZWQgaW50IGxpbWl0XzsKKyAgdW5zaWduZWQgaW50IGZyYW1lXzsKKyAgdW5zaWduZWQgaW50IHdpZHRoXzsKKyAgdW5zaWduZWQgaW50IGhlaWdodF87CisgIHVuc2lnbmVkIGludCBmcmFtZXJhdGVfbnVtZXJhdG9yXzsKKyAgdW5zaWduZWQgaW50IGZyYW1lcmF0ZV9kZW5vbWluYXRvcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGlidnB4X3Rlc3QKKworI2VuZGlmICAvLyBURVNUX0k0MjBfVklERU9fU09VUkNFX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9pZGN0bGxtX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC9pZGN0bGxtX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0MmUyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L2lkY3RsbG1fdGVzdC5jYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorfQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKwordHlwZWRlZiB2b2lkICgqaWRjdF9mbl90KShzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKTsKK25hbWVzcGFjZSB7CitjbGFzcyBJRENUVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aWRjdF9mbl90PgoreworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIFVVVCA9IEdldFBhcmFtKCk7CisgICAgICAgIG1lbXNldChpbnB1dCwgMCwgc2l6ZW9mKGlucHV0KSk7CisgICAgICAgIC8qIFNldCB1cCBndWFyZCBibG9ja3MgKi8KKyAgICAgICAgZm9yKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgICAgIG91dHB1dFtpXSA9ICgoaSYweEYpPDQmJihpPDY0KSk/MDotMTsKKyAgICB9CisKKyAgICBpZGN0X2ZuX3QgVVVUOworICAgIHNob3J0IGlucHV0WzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFsyNTZdOworICAgIHVuc2lnbmVkIGNoYXIgcHJlZGljdFsyNTZdOworfTsKKworVEVTVF9QKElEQ1RUZXN0LCBUZXN0R3VhcmRCbG9ja3MpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPDI1NjsgaSsrKQorICAgICAgICBpZigoaSYweEYpIDwgNCAmJiBpPDY0KQorICAgICAgICAgICAgRVhQRUNUX0VRKDAsIG91dHB1dFtpXSkgPDwgaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRVhQRUNUX0VRKDI1NSwgb3V0cHV0W2ldKTsKK30KKworVEVTVF9QKElEQ1RUZXN0LCBUZXN0QWxsWmVyb3MpCit7CisgICAgaW50IGk7CisKKyAgICBVVVQoaW5wdXQsIG91dHB1dCwgMTYsIG91dHB1dCwgMTYpOworCisgICAgZm9yKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgaWYoKGkmMHhGKSA8IDQgJiYgaTw2NCkKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXRbaV0pIDw8ICJpPT0iIDw8IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVYUEVDVF9FUSgyNTUsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKK30KKworVEVTVF9QKElEQ1RUZXN0LCBUZXN0QWxsT25lcykKK3sKKyAgICBpbnQgaTsKKworICAgIGlucHV0WzBdID0gNDsKKyAgICBVVVQoaW5wdXQsIG91dHB1dCwgMTYsIG91dHB1dCwgMTYpOworCisgICAgZm9yKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgaWYoKGkmMHhGKSA8IDQgJiYgaTw2NCkKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxLCBvdXRwdXRbaV0pIDw8ICJpPT0iIDw8IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVYUEVDVF9FUSgyNTUsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKK30KKworVEVTVF9QKElEQ1RUZXN0LCBUZXN0QWRkT25lKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgcHJlZGljdFtpXSA9IGk7CisKKyAgICBpbnB1dFswXSA9IDQ7CisgICAgVVVUKGlucHV0LCBwcmVkaWN0LCAxNiwgb3V0cHV0LCAxNik7CisKKyAgICBmb3IoaT0wOyBpPDI1NjsgaSsrKQorICAgICAgICBpZigoaSYweEYpIDwgNCAmJiBpPDY0KQorICAgICAgICAgICAgRVhQRUNUX0VRKGkrMSwgb3V0cHV0W2ldKSA8PCAiaT09IiA8PCBpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBFWFBFQ1RfRVEoMjU1LCBvdXRwdXRbaV0pIDw8ICJpPT0iIDw8IGk7Cit9CisKK1RFU1RfUChJRENUVGVzdCwgVGVzdFdpdGhEYXRhKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgICAgICBpbnB1dFtpXSA9IGk7CisKKyAgICBVVVQoaW5wdXQsIG91dHB1dCwgMTYsIG91dHB1dCwgMTYpOworCisgICAgZm9yKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgaWYoKGkmMHhGKSA+IDMgfHwgaT42MykKKyAgICAgICAgICAgIEVYUEVDVF9FUSgyNTUsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKKyAgICAgICAgZWxzZSBpZihpID09IDApCisgICAgICAgICAgICBFWFBFQ1RfRVEoMTEsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKKyAgICAgICAgZWxzZSBpZihpID09IDM0KQorICAgICAgICAgICAgRVhQRUNUX0VRKDEsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKKyAgICAgICAgZWxzZSBpZihpID09IDIgfHwgaSA9PSAxNyB8fCBpID09IDMyKQorICAgICAgICAgICAgRVhQRUNUX0VRKDMsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRVhQRUNUX0VRKDAsIG91dHB1dFtpXSkgPDwgImk9PSIgPDwgaTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQywgSURDVFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyh2cDhfc2hvcnRfaWRjdDR4NGxsbV9jKSk7CisjaWYgSEFWRV9NTVgKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1NWCwgSURDVFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyh2cDhfc2hvcnRfaWRjdDR4NGxsbV9tbXgpKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvaW50cmFwcmVkX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC9pbnRyYXByZWRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUwZDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvaW50cmFwcmVkX3Rlc3QuY2MKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidGVzdC9hY21fcmFuZG9tLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKK30KKworbmFtZXNwYWNlIHsKKwordXNpbmcgbGlidnB4X3Rlc3Q6OkFDTVJhbmRvbTsKKworY2xhc3MgSW50cmFQcmVkQmFzZSB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldHVwTWFjcm9ibG9jayh1aW50OF90ICpkYXRhLCBpbnQgYmxvY2tfc2l6ZSwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wbGFuZXMpIHsKKyAgICBtZW1zZXQoJm1iXywgMCwgc2l6ZW9mKG1iXykpOworICAgIG1lbXNldCgmbWlfLCAwLCBzaXplb2YobWlfKSk7CisgICAgbWJfLnVwX2F2YWlsYWJsZSA9IDE7CisgICAgbWJfLmxlZnRfYXZhaWxhYmxlID0gMTsKKyAgICBtYl8ubW9kZV9pbmZvX2NvbnRleHQgPSAmbWlfOworICAgIHN0cmlkZV8gPSBzdHJpZGU7CisgICAgYmxvY2tfc2l6ZV8gPSBibG9ja19zaXplOworICAgIG51bV9wbGFuZXNfID0gbnVtX3BsYW5lczsKKyAgICBmb3IgKGludCBwID0gMDsgcCA8IG51bV9wbGFuZXM7IHArKykKKyAgICAgIGRhdGFfcHRyX1twXSA9IGRhdGEgKyBzdHJpZGUgKiAoYmxvY2tfc2l6ZSArIDEpICogcCArCisgICAgICAgICAgICAgICAgICAgICBzdHJpZGUgKyBibG9ja19zaXplOworICB9CisKKyAgdm9pZCBGaWxsUmFuZG9tKCkgeworICAgIC8vIEZpbGwgZWRnZXMgd2l0aCByYW5kb20gZGF0YQorICAgIEFDTVJhbmRvbSBybmQoQUNNUmFuZG9tOjpEZXRlcm1pbmlzdGljU2VlZCgpKTsKKyAgICBmb3IgKGludCBwID0gMDsgcCA8IG51bV9wbGFuZXNfOyBwKyspIHsKKyAgICAgIGZvciAoaW50IHggPSAtMSA7IHggPD0gYmxvY2tfc2l6ZV87IHgrKykKKyAgICAgICAgZGF0YV9wdHJfW3BdW3ggLSBzdHJpZGVfXSA9IHJuZC5SYW5kOCgpOworICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBibG9ja19zaXplXzsgeSsrKQorICAgICAgICBkYXRhX3B0cl9bcF1beSAqIHN0cmlkZV8gLSAxXSA9IHJuZC5SYW5kOCgpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBQcmVkaWN0KE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlKSA9IDA7CisKKyAgdm9pZCBTZXRMZWZ0VW5hdmFpbGFibGUoKSB7CisgICAgbWJfLmxlZnRfYXZhaWxhYmxlID0gMDsKKyAgICBmb3IgKGludCBwID0gMDsgcCA8IG51bV9wbGFuZXNfOyBwKyspCisgICAgICBmb3IgKGludCBpID0gLTE7IGkgPCBibG9ja19zaXplXzsgKytpKQorICAgICAgICBkYXRhX3B0cl9bcF1bc3RyaWRlXyAqIGkgLSAxXSA9IDEyOTsKKyAgfQorCisgIHZvaWQgU2V0VG9wVW5hdmFpbGFibGUoKSB7CisgICAgbWJfLnVwX2F2YWlsYWJsZSA9IDA7CisgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBudW1fcGxhbmVzXzsgcCsrKQorICAgICAgbWVtc2V0KCZkYXRhX3B0cl9bcF1bLTEgLSBzdHJpZGVfXSwgMTI3LCBibG9ja19zaXplXyArIDIpOworICB9CisKKyAgdm9pZCBTZXRUb3BMZWZ0VW5hdmFpbGFibGUoKSB7CisgICAgU2V0TGVmdFVuYXZhaWxhYmxlKCk7CisgICAgU2V0VG9wVW5hdmFpbGFibGUoKTsKKyAgfQorCisgIGludCBCbG9ja1NpemVMb2cyTWluMSgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGJsb2NrX3NpemVfKSB7CisgICAgICBjYXNlIDE2OgorICAgICAgICByZXR1cm4gMzsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICAvLyBjaGVjayBEQyBwcmVkaWN0aW9uIG91dHB1dCBhZ2FpbnN0IGEgcmVmZXJlbmNlCisgIHZvaWQgQ2hlY2tEQ1ByZWRpY3Rpb24oKSBjb25zdCB7CisgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBudW1fcGxhbmVzXzsgcCsrKSB7CisgICAgICAvLyBjYWxjdWxhdGUgZXhwZWN0ZWQgREMKKyAgICAgIGludCBleHBlY3RlZDsKKyAgICAgIGlmIChtYl8udXBfYXZhaWxhYmxlIHx8IG1iXy5sZWZ0X2F2YWlsYWJsZSkgeworICAgICAgICBpbnQgc3VtID0gMCwgc2hpZnQgPSBCbG9ja1NpemVMb2cyTWluMSgpICsgbWJfLnVwX2F2YWlsYWJsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iXy5sZWZ0X2F2YWlsYWJsZTsKKyAgICAgICAgaWYgKG1iXy51cF9hdmFpbGFibGUpCisgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBibG9ja19zaXplXzsgeCsrKQorICAgICAgICAgICAgc3VtICs9IGRhdGFfcHRyX1twXVt4IC0gc3RyaWRlX107CisgICAgICAgIGlmIChtYl8ubGVmdF9hdmFpbGFibGUpCisgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBibG9ja19zaXplXzsgeSsrKQorICAgICAgICAgICAgc3VtICs9IGRhdGFfcHRyX1twXVt5ICogc3RyaWRlXyAtIDFdOworICAgICAgICBleHBlY3RlZCA9IChzdW0gKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OworICAgICAgfSBlbHNlCisgICAgICAgIGV4cGVjdGVkID0gMHg4MDsKKworICAgICAgLy8gY2hlY2sgdGhhdCBhbGwgc3Vic2VxdWVudCBsaW5lcyBhcmUgZXF1YWwgdG8gdGhlIGZpcnN0CisgICAgICBmb3IgKGludCB5ID0gMTsgeSA8IGJsb2NrX3NpemVfOyArK3kpCisgICAgICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoZGF0YV9wdHJfW3BdLCAmZGF0YV9wdHJfW3BdW3kgKiBzdHJpZGVfXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplXykpOworICAgICAgLy8gd2l0aGluIHRoZSBmaXJzdCBsaW5lLCBlbnN1cmUgdGhhdCBlYWNoIHBpeGVsIGhhcyB0aGUgc2FtZSB2YWx1ZQorICAgICAgZm9yIChpbnQgeCA9IDE7IHggPCBibG9ja19zaXplXzsgKyt4KQorICAgICAgICBBU1NFUlRfRVEoZGF0YV9wdHJfW3BdWzBdLCBkYXRhX3B0cl9bcF1beF0pOworICAgICAgLy8gbm93IGVuc3VyZSB0aGF0IHRoYXQgcGl4ZWwgaGFzIHRoZSBleHBlY3RlZCAoREMpIHZhbHVlCisgICAgICBBU1NFUlRfRVEoZXhwZWN0ZWQsIGRhdGFfcHRyX1twXVswXSk7CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgViBwcmVkaWN0aW9uIG91dHB1dCBhZ2FpbnN0IGEgcmVmZXJlbmNlCisgIHZvaWQgQ2hlY2tWUHJlZGljdGlvbigpIGNvbnN0IHsKKyAgICAvLyBjaGVjayB0aGF0IGFsbCBsaW5lcyBlcXVhbCB0aGUgdG9wIGJvcmRlcgorICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbnVtX3BsYW5lc187IHArKykKKyAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgYmxvY2tfc2l6ZV87IHkrKykKKyAgICAgICAgQVNTRVJUX0VRKDAsIG1lbWNtcCgmZGF0YV9wdHJfW3BdWy1zdHJpZGVfXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9wdHJfW3BdW3kgKiBzdHJpZGVfXSwgYmxvY2tfc2l6ZV8pKTsKKyAgfQorCisgIC8vIGNoZWNrIEggcHJlZGljdGlvbiBvdXRwdXQgYWdhaW5zdCBhIHJlZmVyZW5jZQorICB2b2lkIENoZWNrSFByZWRpY3Rpb24oKSBjb25zdCB7CisgICAgLy8gZm9yIGVhY2ggbGluZSwgZW5zdXJlIHRoYXQgZWFjaCBwaXhlbCBpcyBlcXVhbCB0byB0aGUgbGVmdCBib3JkZXIKKyAgICBmb3IgKGludCBwID0gMDsgcCA8IG51bV9wbGFuZXNfOyBwKyspCisgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGJsb2NrX3NpemVfOyB5KyspCisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgYmxvY2tfc2l6ZV87IHgrKykKKyAgICAgICAgICBBU1NFUlRfRVEoZGF0YV9wdHJfW3BdWy0xICsgeSAqIHN0cmlkZV9dLAorICAgICAgICAgICAgICAgICAgICBkYXRhX3B0cl9bcF1beCArIHkgKiBzdHJpZGVfXSk7CisgIH0KKworICBzdGF0aWMgaW50IENsaXBCeXRlKGludCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA+IDI1NSkKKyAgICAgIHJldHVybiAyNTU7CisgICAgZWxzZSBpZiAodmFsdWUgPCAwKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLy8gY2hlY2sgVE0gcHJlZGljdGlvbiBvdXRwdXQgYWdhaW5zdCBhIHJlZmVyZW5jZQorICB2b2lkIENoZWNrVE1QcmVkaWN0aW9uKCkgY29uc3QgeworICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbnVtX3BsYW5lc187IHArKykKKyAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgYmxvY2tfc2l6ZV87IHkrKykKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBibG9ja19zaXplXzsgeCsrKSB7CisgICAgICAgICAgY29uc3QgaW50IGV4cGVjdGVkID0gQ2xpcEJ5dGUoZGF0YV9wdHJfW3BdW3ggLSBzdHJpZGVfXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFfcHRyX1twXVtzdHJpZGVfICogeSAtIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZGF0YV9wdHJfW3BdWy0xIC0gc3RyaWRlX10pOworICAgICAgICAgIEFTU0VSVF9FUShleHBlY3RlZCwgZGF0YV9wdHJfW3BdW3kgKiBzdHJpZGVfICsgeF0pOworICAgICAgIH0KKyAgfQorCisgIC8vIEFjdHVhbCB0ZXN0CisgIHZvaWQgUnVuVGVzdCgpIHsKKyAgICB7CisgICAgICBTQ09QRURfVFJBQ0UoIkRDX1BSRUQiKTsKKyAgICAgIEZpbGxSYW5kb20oKTsKKyAgICAgIFByZWRpY3QoRENfUFJFRCk7CisgICAgICBDaGVja0RDUHJlZGljdGlvbigpOworICAgIH0KKyAgICB7CisgICAgICBTQ09QRURfVFJBQ0UoIkRDX1BSRUQgTEVGVCIpOworICAgICAgRmlsbFJhbmRvbSgpOworICAgICAgU2V0TGVmdFVuYXZhaWxhYmxlKCk7CisgICAgICBQcmVkaWN0KERDX1BSRUQpOworICAgICAgQ2hlY2tEQ1ByZWRpY3Rpb24oKTsKKyAgICB9CisgICAgeworICAgICAgU0NPUEVEX1RSQUNFKCJEQ19QUkVEIFRPUCIpOworICAgICAgRmlsbFJhbmRvbSgpOworICAgICAgU2V0VG9wVW5hdmFpbGFibGUoKTsKKyAgICAgIFByZWRpY3QoRENfUFJFRCk7CisgICAgICBDaGVja0RDUHJlZGljdGlvbigpOworICAgIH0KKyAgICB7CisgICAgICBTQ09QRURfVFJBQ0UoIkRDX1BSRUQgVE9QX0xFRlQiKTsKKyAgICAgIEZpbGxSYW5kb20oKTsKKyAgICAgIFNldFRvcExlZnRVbmF2YWlsYWJsZSgpOworICAgICAgUHJlZGljdChEQ19QUkVEKTsKKyAgICAgIENoZWNrRENQcmVkaWN0aW9uKCk7CisgICAgfQorICAgIHsKKyAgICAgIFNDT1BFRF9UUkFDRSgiSF9QUkVEIik7CisgICAgICBGaWxsUmFuZG9tKCk7CisgICAgICBQcmVkaWN0KEhfUFJFRCk7CisgICAgICBDaGVja0hQcmVkaWN0aW9uKCk7CisgICAgfQorICAgIHsKKyAgICAgIFNDT1BFRF9UUkFDRSgiVl9QUkVEIik7CisgICAgICBGaWxsUmFuZG9tKCk7CisgICAgICBQcmVkaWN0KFZfUFJFRCk7CisgICAgICBDaGVja1ZQcmVkaWN0aW9uKCk7CisgICAgfQorICAgIHsKKyAgICAgIFNDT1BFRF9UUkFDRSgiVE1fUFJFRCIpOworICAgICAgRmlsbFJhbmRvbSgpOworICAgICAgUHJlZGljdChUTV9QUkVEKTsKKyAgICAgIENoZWNrVE1QcmVkaWN0aW9uKCk7CisgICAgfQorICB9CisKKyAgTUFDUk9CTE9DS0QgbWJfOworICBNT0RFX0lORk8gbWlfOworICB1aW50OF90ICpkYXRhX3B0cl9bMl07ICAvLyBpbiB0aGUgY2FzZSBvZiBZLCBvbmx5IFswXSBpcyB1c2VkCisgIGludCBzdHJpZGVfOworICBpbnQgYmxvY2tfc2l6ZV87CisgIGludCBudW1fcGxhbmVzXzsKK307CisKK3R5cGVkZWYgdm9pZCAoKmludHJhX3ByZWRfeV9mbl90KShNQUNST0JMT0NLRCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp5YWJvdmVfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnlsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp5cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlKTsKKworY2xhc3MgSW50cmFQcmVkWVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludHJhX3ByZWRfeV9mbl90PiwKKyAgICBwcm90ZWN0ZWQgSW50cmFQcmVkQmFzZSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIGRhdGFfYXJyYXlfID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oCisgICAgICAgIHZweF9tZW1hbGlnbihrRGF0YUFsaWdubWVudCwga0RhdGFCdWZmZXJTaXplKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHZweF9mcmVlKGRhdGFfYXJyYXlfKTsKKyAgICBkYXRhX2FycmF5XyA9IE5VTEw7CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrQmxvY2tTaXplID0gMTY7CisgIHN0YXRpYyBjb25zdCBpbnQga0RhdGFBbGlnbm1lbnQgPSAxNjsKKyAgc3RhdGljIGNvbnN0IGludCBrU3RyaWRlID0ga0Jsb2NrU2l6ZSAqIDM7CisgIC8vIFdlIHVzZSA0OCBzbyB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgb2YgdGhlIGZpcnN0IHBpeGVsIGluIGVhY2ggcm93IG9mCisgIC8vIGVhY2ggbWFjcm9ibG9jayBpcyAxNi1ieXRlIGFsaWduZWQsIGFuZCB0aGlzIGdpdmVzIHVzIGFjY2VzcyB0byB0aGUKKyAgLy8gdG9wLWxlZnQgYW5kIHRvcC1yaWdodCBjb3JuZXIgcGl4ZWxzIGJlbG9uZ2luZyB0byB0aGUgdG9wLWxlZnQvcmlnaHQKKyAgLy8gbWFjcm9ibG9ja3MuCisgIC8vIFdlIHVzZSAxNyBsaW5lcyBzbyB3ZSBoYXZlIG9uZSBsaW5lIGFib3ZlIHVzIGZvciB0b3AtcHJlZGljdGlvbi4KKyAgc3RhdGljIGNvbnN0IGludCBrRGF0YUJ1ZmZlclNpemUgPSBrU3RyaWRlICogKGtCbG9ja1NpemUgKyAxKTsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcHJlZF9mbl8gPSBHZXRQYXJhbSgpOworICAgIFNldHVwTWFjcm9ibG9jayhkYXRhX2FycmF5Xywga0Jsb2NrU2l6ZSwga1N0cmlkZSwgMSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUHJlZGljdChNQl9QUkVESUNUSU9OX01PREUgbW9kZSkgeworICAgIG1iXy5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gbW9kZTsKKyAgICBwcmVkX2ZuXygmbWJfLCBkYXRhX3B0cl9bMF0gLSBrU3RyaWRlLCBkYXRhX3B0cl9bMF0gLSAxLCBrU3RyaWRlLAorICAgICAgICAgICAgIGRhdGFfcHRyX1swXSwga1N0cmlkZSk7CisgIH0KKworICBpbnRyYV9wcmVkX3lfZm5fdCBwcmVkX2ZuXzsKKyAgc3RhdGljIHVpbnQ4X3QqIGRhdGFfYXJyYXlfOworfTsKKwordWludDhfdCogSW50cmFQcmVkWVRlc3Q6OmRhdGFfYXJyYXlfID0gTlVMTDsKKworVEVTVF9QKEludHJhUHJlZFlUZXN0LCBJbnRyYVByZWRUZXN0cykgeworICBSdW5UZXN0KCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEMsIEludHJhUHJlZFlUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfYykpOworI2lmIEhBVkVfU1NFMgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1NFMiwgSW50cmFQcmVkWVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19zc2UyKSk7CisjZW5kaWYKKyNpZiBIQVZFX1NTU0UzCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTU1NFMywgSW50cmFQcmVkWVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19zc3NlMykpOworI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKmludHJhX3ByZWRfdXZfZm5fdCkoTUFDUk9CTE9DS0QgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnVhYm92ZV9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnZhYm92ZV9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnVsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp2bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp1cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnZwcmVkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfc3RyaWRlKTsKKworY2xhc3MgSW50cmFQcmVkVVZUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnRyYV9wcmVkX3V2X2ZuX3Q+LAorICAgIHByb3RlY3RlZCBJbnRyYVByZWRCYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgZGF0YV9hcnJheV8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigKKyAgICAgICAgdnB4X21lbWFsaWduKGtEYXRhQWxpZ25tZW50LCBrRGF0YUJ1ZmZlclNpemUpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgdnB4X2ZyZWUoZGF0YV9hcnJheV8pOworICAgIGRhdGFfYXJyYXlfID0gTlVMTDsKKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3QgaW50IGtCbG9ja1NpemUgPSA4OworICBzdGF0aWMgY29uc3QgaW50IGtEYXRhQWxpZ25tZW50ID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrU3RyaWRlID0ga0Jsb2NrU2l6ZSAqIDM7CisgIC8vIFdlIHVzZSAyNCBzbyB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgb2YgdGhlIGZpcnN0IHBpeGVsIGluIGVhY2ggcm93IG9mCisgIC8vIGVhY2ggbWFjcm9ibG9jayBpcyA4LWJ5dGUgYWxpZ25lZCwgYW5kIHRoaXMgZ2l2ZXMgdXMgYWNjZXNzIHRvIHRoZQorICAvLyB0b3AtbGVmdCBhbmQgdG9wLXJpZ2h0IGNvcm5lciBwaXhlbHMgYmVsb25naW5nIHRvIHRoZSB0b3AtbGVmdC9yaWdodAorICAvLyBtYWNyb2Jsb2Nrcy4KKyAgLy8gV2UgdXNlIDkgbGluZXMgc28gd2UgaGF2ZSBvbmUgbGluZSBhYm92ZSB1cyBmb3IgdG9wLXByZWRpY3Rpb24uCisgIC8vIFswXSA9IFUsIFsxXSA9IFYKKyAgc3RhdGljIGNvbnN0IGludCBrRGF0YUJ1ZmZlclNpemUgPSAyICoga1N0cmlkZSAqIChrQmxvY2tTaXplICsgMSk7CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByZWRfZm5fID0gR2V0UGFyYW0oKTsKKyAgICBTZXR1cE1hY3JvYmxvY2soZGF0YV9hcnJheV8sIGtCbG9ja1NpemUsIGtTdHJpZGUsIDIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFByZWRpY3QoTUJfUFJFRElDVElPTl9NT0RFIG1vZGUpIHsKKyAgICBtYl8ubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSA9IG1vZGU7CisgICAgcHJlZF9mbl8oJm1iXywgZGF0YV9wdHJfWzBdIC0ga1N0cmlkZSwgZGF0YV9wdHJfWzFdIC0ga1N0cmlkZSwKKyAgICAgICAgICAgICBkYXRhX3B0cl9bMF0gLSAxLCBkYXRhX3B0cl9bMV0gLSAxLCBrU3RyaWRlLAorICAgICAgICAgICAgIGRhdGFfcHRyX1swXSwgZGF0YV9wdHJfWzFdLCBrU3RyaWRlKTsKKyAgfQorCisgIGludHJhX3ByZWRfdXZfZm5fdCBwcmVkX2ZuXzsKKyAgLy8gV2UgdXNlIDI0IHNvIHRoYXQgdGhlIGRhdGEgcG9pbnRlciBvZiB0aGUgZmlyc3QgcGl4ZWwgaW4gZWFjaCByb3cgb2YKKyAgLy8gZWFjaCBtYWNyb2Jsb2NrIGlzIDgtYnl0ZSBhbGlnbmVkLCBhbmQgdGhpcyBnaXZlcyB1cyBhY2Nlc3MgdG8gdGhlCisgIC8vIHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHQgY29ybmVyIHBpeGVscyBiZWxvbmdpbmcgdG8gdGhlIHRvcC1sZWZ0L3JpZ2h0CisgIC8vIG1hY3JvYmxvY2tzLgorICAvLyBXZSB1c2UgOSBsaW5lcyBzbyB3ZSBoYXZlIG9uZSBsaW5lIGFib3ZlIHVzIGZvciB0b3AtcHJlZGljdGlvbi4KKyAgLy8gWzBdID0gVSwgWzFdID0gVgorICBzdGF0aWMgdWludDhfdCogZGF0YV9hcnJheV87Cit9OworCit1aW50OF90KiBJbnRyYVByZWRVVlRlc3Q6OmRhdGFfYXJyYXlfID0gTlVMTDsKKworVEVTVF9QKEludHJhUHJlZFVWVGVzdCwgSW50cmFQcmVkVGVzdHMpIHsKKyAgUnVuVGVzdCgpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChDLCBJbnRyYVByZWRVVlRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3NfYykpOworI2lmIEhBVkVfU1NFMgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1NFMiwgSW50cmFQcmVkVVZUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zX3NzZTIpKTsKKyNlbmRpZgorI2lmIEhBVkVfU1NTRTMKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNTU0UzLCBJbnRyYVByZWRVVlRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3Nfc3NzZTMpKTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L2l2Zl92aWRlb19zb3VyY2UuaCBiL2xpYnZweC90ZXN0L2l2Zl92aWRlb19zb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMzYTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvaXZmX3ZpZGVvX3NvdXJjZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIFRFU1RfSVZGX1ZJREVPX1NPVVJDRV9IXworI2RlZmluZSBURVNUX0lWRl9WSURFT19TT1VSQ0VfSF8KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRlc3QvdmlkZW9fc291cmNlLmgiCisKK25hbWVzcGFjZSBsaWJ2cHhfdGVzdCB7Citjb25zdCB1bnNpZ25lZCBpbnQga0NvZGVCdWZmZXJTaXplID0gMjU2ICogMTAyNDsKK2NvbnN0IHVuc2lnbmVkIGludCBrSXZmRmlsZUhkclNpemUgPSAzMjsKK2NvbnN0IHVuc2lnbmVkIGludCBrSXZmRnJhbWVIZHJTaXplID0gMTI7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgTWVtR2V0TGUzMihjb25zdCB1aW50OF90ICptZW0pIHsKKyAgcmV0dXJuIChtZW1bM10gPDwgMjQpIHwgKG1lbVsyXSA8PCAxNikgfCAobWVtWzFdIDw8IDgpIHwgKG1lbVswXSk7Cit9CisKKy8vIFRoaXMgY2xhc3MgZXh0ZW5kcyBWaWRlb1NvdXJjZSB0byBhbGxvdyBwYXJzaW5nIG9mIGl2ZiBmaWxlcywKKy8vIHNvIHRoYXQgd2UgY2FuIGRvIGFjdHVhbCBmaWxlIGRlY29kZXMuCitjbGFzcyBJVkZWaWRlb1NvdXJjZSA6IHB1YmxpYyBDb21wcmVzc2VkVmlkZW9Tb3VyY2UgeworIHB1YmxpYzoKKyAgSVZGVmlkZW9Tb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVfbmFtZSkKKyAgICAgIDogZmlsZV9uYW1lXyhmaWxlX25hbWUpLAorICAgICAgICBpbnB1dF9maWxlXyhOVUxMKSwKKyAgICAgICAgY29tcHJlc3NlZF9mcmFtZV9idWZfKE5VTEwpLAorICAgICAgICBmcmFtZV9zel8oMCksCisgICAgICAgIGZyYW1lXygwKSwKKyAgICAgICAgZW5kX29mX2ZpbGVfKGZhbHNlKSB7CisgIH0KKworICB2aXJ0dWFsIH5JVkZWaWRlb1NvdXJjZSgpIHsKKyAgICBkZWxldGVbXSBjb21wcmVzc2VkX2ZyYW1lX2J1Zl87CisKKyAgICBpZiAoaW5wdXRfZmlsZV8pCisgICAgICBmY2xvc2UoaW5wdXRfZmlsZV8pOworICB9CisKKyAgdmlydHVhbCB2b2lkIEluaXQoKSB7CisgICAgLy8gQWxsb2NhdGUgYSBidWZmZXIgZm9yIHJlYWQgaW4gdGhlIGNvbXByZXNzZWQgdmlkZW8gZnJhbWUuCisgICAgY29tcHJlc3NlZF9mcmFtZV9idWZfID0gbmV3IHVpbnQ4X3RbbGlidnB4X3Rlc3Q6OmtDb2RlQnVmZmVyU2l6ZV07CisgICAgQVNTRVJUX1RSVUUoY29tcHJlc3NlZF9mcmFtZV9idWZfKSA8PCAiQWxsb2NhdGUgZnJhbWUgYnVmZmVyIGZhaWxlZCI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgQmVnaW4oKSB7CisgICAgaW5wdXRfZmlsZV8gPSBPcGVuVGVzdERhdGFGaWxlKGZpbGVfbmFtZV8pOworICAgIEFTU0VSVF9UUlVFKGlucHV0X2ZpbGVfKSA8PCAiSW5wdXQgZmlsZSBvcGVuIGZhaWxlZC4gRmlsZW5hbWU6ICIKKyAgICAgICAgPDwgZmlsZV9uYW1lXzsKKworICAgIC8vIFJlYWQgZmlsZSBoZWFkZXIKKyAgICB1aW50OF90IGZpbGVfaGRyW2tJdmZGaWxlSGRyU2l6ZV07CisgICAgQVNTRVJUX0VRKGtJdmZGaWxlSGRyU2l6ZSwgZnJlYWQoZmlsZV9oZHIsIDEsIGtJdmZGaWxlSGRyU2l6ZSwgaW5wdXRfZmlsZV8pKQorICAgICAgICA8PCAiRmlsZSBoZWFkZXIgcmVhZCBmYWlsZWQuIjsKKyAgICAvLyBDaGVjayBmaWxlIGhlYWRlcgorICAgIEFTU0VSVF9UUlVFKGZpbGVfaGRyWzBdID09ICdEJyAmJiBmaWxlX2hkclsxXSA9PSAnSycgJiYgZmlsZV9oZHJbMl0gPT0gJ0knCisgICAgICAgICAgICAgICAgJiYgZmlsZV9oZHJbM10gPT0gJ0YnKSA8PCAiSW5wdXQgaXMgbm90IGFuIElWRiBmaWxlLiI7CisKKyAgICBGaWxsRnJhbWUoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBOZXh0KCkgeworICAgICsrZnJhbWVfOworICAgIEZpbGxGcmFtZSgpOworICB9CisKKyAgdm9pZCBGaWxsRnJhbWUoKSB7CisgICAgdWludDhfdCBmcmFtZV9oZHJba0l2ZkZyYW1lSGRyU2l6ZV07CisgICAgLy8gQ2hlY2sgZnJhbWUgaGVhZGVyIGFuZCByZWFkIGEgZnJhbWUgZnJvbSBpbnB1dF9maWxlLgorICAgIGlmIChmcmVhZChmcmFtZV9oZHIsIDEsIGtJdmZGcmFtZUhkclNpemUsIGlucHV0X2ZpbGVfKQorICAgICAgICAhPSBrSXZmRnJhbWVIZHJTaXplKSB7CisgICAgICBlbmRfb2ZfZmlsZV8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBlbmRfb2ZfZmlsZV8gPSBmYWxzZTsKKworICAgICAgZnJhbWVfc3pfID0gTWVtR2V0TGUzMihmcmFtZV9oZHIpOworICAgICAgQVNTRVJUX0xFKGZyYW1lX3N6Xywga0NvZGVCdWZmZXJTaXplKQorICAgICAgICAgIDw8ICJGcmFtZSBpcyB0b28gYmlnIGZvciBhbGxvY2F0ZWQgY29kZSBidWZmZXIiOworICAgICAgQVNTRVJUX0VRKGZyYW1lX3N6XywKKyAgICAgICAgICAgICAgICBmcmVhZChjb21wcmVzc2VkX2ZyYW1lX2J1Zl8sIDEsIGZyYW1lX3N6XywgaW5wdXRfZmlsZV8pKQorICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmcmFtZSI7CisgICAgfQorICB9CisKKyAgdmlydHVhbCBjb25zdCB1aW50OF90ICpjeGRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIGVuZF9vZl9maWxlXyA/IE5VTEwgOiBjb21wcmVzc2VkX2ZyYW1lX2J1Zl87CisgIH0KKyAgdmlydHVhbCBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lX3N6XzsgfQorICB2aXJ0dWFsIGNvbnN0IHVuc2lnbmVkIGludCBmcmFtZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBmcmFtZV87IH0KKworIHByb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lXzsKKyAgRklMRSAqaW5wdXRfZmlsZV87CisgIHVpbnQ4X3QgKmNvbXByZXNzZWRfZnJhbWVfYnVmXzsKKyAgdW5zaWduZWQgaW50IGZyYW1lX3N6XzsKKyAgdW5zaWduZWQgaW50IGZyYW1lXzsKKyAgYm9vbCBlbmRfb2ZfZmlsZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGlidnB4X3Rlc3QKKworI2VuZGlmICAvLyBURVNUX0lWRl9WSURFT19TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L2tleWZyYW1lX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC9rZXlmcmFtZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzgxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC9rZXlmcmFtZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidGVzdC9lbmNvZGVfdGVzdF9kcml2ZXIuaCIKKyNpbmNsdWRlICJ0ZXN0L2k0MjBfdmlkZW9fc291cmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBLZXlmcmFtZVRlc3QgOiBwdWJsaWMgOjpsaWJ2cHhfdGVzdDo6RW5jb2RlclRlc3QsCisgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxlbnVtIGxpYnZweF90ZXN0OjpUZXN0TW9kZT4geworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEluaXRpYWxpemVDb25maWcoKTsKKyAgICBTZXRNb2RlKEdldFBhcmFtKCkpOworICAgIGtmX2NvdW50XyA9IDA7CisgICAga2ZfY291bnRfbWF4XyA9IElOVF9NQVg7CisgICAga2ZfZG9fZm9yY2Vfa2ZfID0gZmFsc2U7CisgICAgc2V0X2NwdV91c2VkXyA9IDA7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgQ29udGludWUoKSBjb25zdCB7CisgICAgcmV0dXJuICFIYXNGYXRhbEZhaWx1cmUoKSAmJiAhYWJvcnRfOworICB9CisKKyAgdmlydHVhbCB2b2lkIFByZUVuY29kZUZyYW1lSG9vayg6OmxpYnZweF90ZXN0OjpWaWRlb1NvdXJjZSAqdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpsaWJ2cHhfdGVzdDo6RW5jb2RlciAqZW5jb2RlcikgeworICAgIGlmIChrZl9kb19mb3JjZV9rZl8pCisgICAgICBmcmFtZV9mbGFnc18gPSAodmlkZW8tPmZyYW1lKCkgJSAzKSA/IDAgOiBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgICAgaWYgKHNldF9jcHVfdXNlZF8gJiYgdmlkZW8tPmZyYW1lKCkgPT0gMSkKKyAgICAgIGVuY29kZXItPkNvbnRyb2woVlA4RV9TRVRfQ1BVVVNFRCwgc2V0X2NwdV91c2VkXyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRnJhbWVQa3RIb29rKGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0KSB7CisgICAgaWYgKHBrdC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpIHsKKyAgICAgIGtmX3B0c19saXN0Xy5wdXNoX2JhY2socGt0LT5kYXRhLmZyYW1lLnB0cyk7CisgICAgICBrZl9jb3VudF8rKzsKKyAgICAgIGFib3J0XyB8PSBrZl9jb3VudF8gPiBrZl9jb3VudF9tYXhfOworICAgIH0KKyAgfQorCisgIGJvb2wga2ZfZG9fZm9yY2Vfa2ZfOworICBpbnQga2ZfY291bnRfOworICBpbnQga2ZfY291bnRfbWF4XzsKKyAgc3RkOjp2ZWN0b3I8dnB4X2NvZGVjX3B0c190PiBrZl9wdHNfbGlzdF87CisgIGludCBzZXRfY3B1X3VzZWRfOworfTsKKworVEVTVF9QKEtleWZyYW1lVGVzdCwgVGVzdFJhbmRvbVZpZGVvU291cmNlKSB7CisgIC8vIFZhbGlkYXRlIHRoYXQgZW5jb2RpbmcgdGhlIFJhbmRvbVZpZGVvU291cmNlIHByb2R1Y2VzIG11bHRpcGxlIGtleWZyYW1lcy4KKyAgLy8gVGhpcyB2YWxpZGF0ZXMgdGhlIHJlc3VsdHMgb2YgdGhlIFRlc3REaXNhYmxlS2V5ZnJhbWVzIHRlc3QuCisgIGtmX2NvdW50X21heF8gPSAyOyAgLy8gZWFybHkgZXhpdCBzdWNjZXNzZnVsIHRlc3RzLgorCisgIDo6bGlidnB4X3Rlc3Q6OlJhbmRvbVZpZGVvU291cmNlIHZpZGVvOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSdW5Mb29wKCZ2aWRlbykpOworCisgIC8vIEluIHJlYWx0aW1lIG1vZGUgLSBhdXRvIHBsYWNlZCBrZXlmcmFtZXMgYXJlIGV4Y2VlZGluZ2x5IHJhcmUsICBkb24ndAorICAvLyBib3RoZXIgd2l0aCB0aGlzIGNoZWNrICAgaWYoR2V0UGFyYW0oKSA+IDApCisgIGlmKEdldFBhcmFtKCkgPiAwKQorICAgIEVYUEVDVF9HVChrZl9jb3VudF8sIDEpOworfQorCitURVNUX1AoS2V5ZnJhbWVUZXN0LCBUZXN0RGlzYWJsZUtleWZyYW1lcykgeworICBjZmdfLmtmX21vZGUgPSBWUFhfS0ZfRElTQUJMRUQ7CisgIGtmX2NvdW50X21heF8gPSAxOyAgLy8gZWFybHkgZXhpdCBmYWlsZWQgdGVzdHMuCisKKyAgOjpsaWJ2cHhfdGVzdDo6UmFuZG9tVmlkZW9Tb3VyY2UgdmlkZW87CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJ1bkxvb3AoJnZpZGVvKSk7CisKKyAgRVhQRUNUX0VRKDEsIGtmX2NvdW50Xyk7Cit9CisKK1RFU1RfUChLZXlmcmFtZVRlc3QsIFRlc3RGb3JjZUtleWZyYW1lKSB7CisgIGNmZ18ua2ZfbW9kZSA9IFZQWF9LRl9ESVNBQkxFRDsKKyAga2ZfZG9fZm9yY2Vfa2ZfID0gdHJ1ZTsKKworICA6OmxpYnZweF90ZXN0OjpEdW1teVZpZGVvU291cmNlIHZpZGVvOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSdW5Mb29wKCZ2aWRlbykpOworCisgIC8vIHZlcmlmeSB0aGF0IGV2ZXJ5IHRoaXJkIGZyYW1lIGlzIGEga2V5ZnJhbWUuCisgIGZvciAoc3RkOjp2ZWN0b3I8dnB4X2NvZGVjX3B0c190Pjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGtmX3B0c19saXN0Xy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0ga2ZfcHRzX2xpc3RfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBBU1NFUlRfRVEoMCwgKml0ZXIgJSAzKSA8PCAiVW5leHBlY3RlZCBrZXlmcmFtZSBhdCBmcmFtZSAiIDw8ICppdGVyOworICB9Cit9CisKK1RFU1RfUChLZXlmcmFtZVRlc3QsIFRlc3RLZXlmcmFtZU1heERpc3RhbmNlKSB7CisgIGNmZ18ua2ZfbWF4X2Rpc3QgPSAyNTsKKworICA6OmxpYnZweF90ZXN0OjpEdW1teVZpZGVvU291cmNlIHZpZGVvOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSdW5Mb29wKCZ2aWRlbykpOworCisgIC8vIHZlcmlmeSB0aGF0IGtleWZyYW1lIGludGVydmFsIG1hdGNoZXMga2ZfbWF4X2Rpc3QKKyAgZm9yIChzdGQ6OnZlY3Rvcjx2cHhfY29kZWNfcHRzX3Q+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0ga2ZfcHRzX2xpc3RfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBrZl9wdHNfbGlzdF8uZW5kKCk7ICsraXRlcikgeworICAgIEFTU0VSVF9FUSgwLCAqaXRlciAlIDI1KSA8PCAiVW5leHBlY3RlZCBrZXlmcmFtZSBhdCBmcmFtZSAiIDw8ICppdGVyOworICB9Cit9CisKK1RFU1RfUChLZXlmcmFtZVRlc3QsIFRlc3RBdXRvS2V5ZnJhbWUpIHsKKyAgY2ZnXy5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgIGtmX2RvX2ZvcmNlX2tmXyA9IGZhbHNlOworCisgIC8vIEZvcmNlIGEgZGV0ZXJtaW5pc3RpYyBzcGVlZCBzdGVwIGluIFJlYWwgVGltZSBtb2RlLCBhcyB0aGUgZmFzdGVyIG1vZGVzCisgIC8vIG1heSBub3QgcHJvZHVjZSBhIGtleWZyYW1lIGxpa2Ugd2UgZXhwZWN0LiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIHJ1bm5pbmcKKyAgLy8gb24gdmVyeSBzbG93IGVudmlyb25tZW50cyAobGlrZSBWYWxncmluZCkuIFRoZSBzdGVwIC0xMSB3YXMgZGV0ZXJtaW5lZAorICAvLyBleHBlcmltZW50YWxseSBhcyB0aGUgZmFzdGVzdCBtb2RlIHRoYXQgc3RpbGwgdGhyb3dzIHRoZSBrZXlmcmFtZS4KKyAgaWYgKGRlYWRsaW5lXyA9PSBWUFhfRExfUkVBTFRJTUUpCisgICAgc2V0X2NwdV91c2VkXyA9IC0xMTsKKworICAvLyBUaGlzIGNsaXAgaGFzIGEgY3V0IHNjZW5lIGV2ZXJ5IDMwIGZyYW1lcyAtPiBGcmFtZSAwLCAzMCwgNjAsIDkwLCAxMjAuCisgIC8vIEkgY2hlY2sgb25seSB0aGUgZmlyc3QgNDAgZnJhbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSdzIGEga2V5ZnJhbWUgYXQgZnJhbWUKKyAgLy8gMCBhbmQgMzAuCisgIDo6bGlidnB4X3Rlc3Q6Okk0MjBWaWRlb1NvdXJjZSB2aWRlbygiaGFudHJvX2NvbGxhZ2VfdzM1MmgyODgueXV2IiwgMzUyLCAyODgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgMSwgMCwgNDApOworCisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJ1bkxvb3AoJnZpZGVvKSk7CisKKyAgLy8gSW4gcmVhbHRpbWUgbW9kZSAtIGF1dG8gcGxhY2VkIGtleWZyYW1lcyBhcmUgZXhjZWVkaW5nbHkgcmFyZSwgIGRvbid0CisgIC8vIGJvdGhlciB3aXRoIHRoaXMgY2hlY2sKKyAgaWYoR2V0UGFyYW0oKSA+IDApCisgICAgRVhQRUNUX0VRKDJ1LCBrZl9wdHNfbGlzdF8uc2l6ZSgpKSA8PCAiIE5vdCB0aGUgcmlnaHQgbnVtYmVyIG9mIGtleWZyYW1lcyAiOworCisgIC8vIFZlcmlmeSB0aGF0IGtleWZyYW1lcyBtYXRjaCB0aGUgZmlsZSBrZXlmcmFtZXMgaW4gdGhlIGZpbGUuCisgIGZvciAoc3RkOjp2ZWN0b3I8dnB4X2NvZGVjX3B0c190Pjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGtmX3B0c19saXN0Xy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0ga2ZfcHRzX2xpc3RfLmVuZCgpOyArK2l0ZXIpIHsKKworICAgIGlmIChkZWFkbGluZV8gPT0gVlBYX0RMX1JFQUxUSU1FICYmICppdGVyID4gMCkKKyAgICAgIEVYUEVDVF9FUSgwLCAoKml0ZXIgLSAxKSAlIDMwKSA8PCAiVW5leHBlY3RlZCBrZXlmcmFtZSBhdCBmcmFtZSAiCisgICAgICAgIDw8ICppdGVyOworICAgIGVsc2UKKyAgICAgIEVYUEVDVF9FUSgwLCAqaXRlciAlIDMwKSA8PCAiVW5leHBlY3RlZCBrZXlmcmFtZSBhdCBmcmFtZSAiIDw8ICppdGVyOworICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFsbE1vZGVzLCBLZXlmcmFtZVRlc3QsIEFMTF9URVNUX01PREVTKTsKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvcHBfZmlsdGVyX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC9wcF9maWx0ZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJmM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvcHBfZmlsdGVyX3Rlc3QuY2MKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2ludGVnZXIuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKK30KKwordHlwZWRlZiB2b2lkICgqcG9zdF9wcm9jX2Z1bmNfdCkodW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFZwOFBvc3RQcm9jZXNzaW5nRmlsdGVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwb3N0X3Byb2NfZnVuY190PiB7fTsKKworLy8gVGVzdCByb3V0aW5lIGZvciB0aGUgVlA4IHBvc3QtcHJvY2Vzc2luZyBmdW5jdGlvbgorLy8gdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93X2MuCisKK1RFU1RfUChWcDhQb3N0UHJvY2Vzc2luZ0ZpbHRlclRlc3QsIEZpbHRlck91dHB1dENoZWNrKSB7CisgIC8vIFNpemUgb2YgdGhlIHVuZGVybHlpbmcgZGF0YSBibG9jayB0aGF0IHdpbGwgYmUgZmlsdGVyZWQuCisgIGNvbnN0IGludCBibG9ja193aWR0aCAgPSAxNjsKKyAgY29uc3QgaW50IGJsb2NrX2hlaWdodCA9IDE2OworCisgIC8vIDUtdGFwIGZpbHRlciBuZWVkcyAyIHBhZGRpbmcgcm93cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGJsb2NrIGluIHRoZSBpbnB1dC4KKyAgY29uc3QgaW50IGlucHV0X3dpZHRoID0gYmxvY2tfd2lkdGg7CisgIGNvbnN0IGludCBpbnB1dF9oZWlnaHQgPSBibG9ja19oZWlnaHQgKyA0OworICBjb25zdCBpbnQgaW5wdXRfc3RyaWRlID0gaW5wdXRfd2lkdGg7CisgIGNvbnN0IGludCBpbnB1dF9zaXplID0gaW5wdXRfd2lkdGggKiBpbnB1dF9oZWlnaHQ7CisKKyAgLy8gRmlsdGVyIGV4dGVuZHMgb3V0cHV0IGJsb2NrIGJ5IDggc2FtcGxlcyBhdCBsZWZ0IGFuZCByaWdodCBlZGdlcy4KKyAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IGJsb2NrX3dpZHRoICsgMTY7CisgIGNvbnN0IGludCBvdXRwdXRfaGVpZ2h0ID0gYmxvY2tfaGVpZ2h0OworICBjb25zdCBpbnQgb3V0cHV0X3N0cmlkZSA9IG91dHB1dF93aWR0aDsKKyAgY29uc3QgaW50IG91dHB1dF9zaXplID0gb3V0cHV0X3dpZHRoICogb3V0cHV0X2hlaWdodDsKKworICB1aW50OF90ICpjb25zdCBzcmNfaW1hZ2UgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4odnB4X2NhbGxvYyhpbnB1dF9zaXplLCAxKSk7CisgIHVpbnQ4X3QgKmNvbnN0IGRzdF9pbWFnZSA9CisgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih2cHhfY2FsbG9jKG91dHB1dF9zaXplLCAxKSk7CisKKyAgLy8gUG9pbnRlcnMgdG8gdG9wLWxlZnQgcGl4ZWwgb2YgYmxvY2sgaW4gdGhlIGlucHV0IGFuZCBvdXRwdXQgaW1hZ2VzLgorICB1aW50OF90ICpjb25zdCBzcmNfaW1hZ2VfcHRyID0gc3JjX2ltYWdlICsgKGlucHV0X3N0cmlkZSA8PCAxKTsKKyAgdWludDhfdCAqY29uc3QgZHN0X2ltYWdlX3B0ciA9IGRzdF9pbWFnZSArIDg7CisgIHVpbnQ4X3QgKmNvbnN0IGZsaW1pdHMgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4odnB4X21lbWFsaWduKDE2LCBibG9ja193aWR0aCkpOworICAodm9pZCl2cHhfbWVtc2V0KGZsaW1pdHMsIDI1NSwgYmxvY2tfd2lkdGgpOworCisgIC8vIEluaXRpYWxpemUgcGl4ZWxzIGluIHRoZSBpbnB1dDoKKyAgLy8gICBibG9jayBwaXhlbHMgdG8gdmFsdWUgMSwKKyAgLy8gICBib3JkZXIgcGl4ZWxzIHRvIHZhbHVlIDEwLgorICAodm9pZCl2cHhfbWVtc2V0KHNyY19pbWFnZSwgMTAsIGlucHV0X3NpemUpOworICB1aW50OF90ICpwaXhlbF9wdHIgPSBzcmNfaW1hZ2VfcHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrX2hlaWdodDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBibG9ja193aWR0aDsgKytqKSB7CisgICAgICBwaXhlbF9wdHJbal0gPSAxOworICAgIH0KKyAgICBwaXhlbF9wdHIgKz0gaW5wdXRfc3RyaWRlOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBwaXhlbHMgaW4gdGhlIG91dHB1dCB0byA5OS4KKyAgKHZvaWQpdnB4X21lbXNldChkc3RfaW1hZ2UsIDk5LCBvdXRwdXRfc2l6ZSk7CisKKyAgR2V0UGFyYW0oKShzcmNfaW1hZ2VfcHRyLCBkc3RfaW1hZ2VfcHRyLCBpbnB1dF9zdHJpZGUsCisgICAgICAgICAgICAgb3V0cHV0X3N0cmlkZSwgYmxvY2tfd2lkdGgsIGZsaW1pdHMsIDE2KTsKKworICBzdGF0aWMgY29uc3QgdWludDhfdCBleHBlY3RlZF9kYXRhW2Jsb2NrX2hlaWdodF0gPSB7CisgICAgNCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMywgNAorICB9OworCisgIHBpeGVsX3B0ciA9IGRzdF9pbWFnZV9wdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfaGVpZ2h0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGJsb2NrX3dpZHRoOyArK2opIHsKKyAgICAgIEVYUEVDVF9FUShleHBlY3RlZF9kYXRhW2ldLCBwaXhlbF9wdHJbal0pCisgICAgICAgICAgPDwgIlZwOFBvc3RQcm9jZXNzaW5nRmlsdGVyVGVzdCBmYWlsZWQgd2l0aCBpbnZhbGlkIGZpbHRlciBvdXRwdXQiOworICAgIH0KKyAgICBwaXhlbF9wdHIgKz0gb3V0cHV0X3N0cmlkZTsKKyAgfQorCisgIHZweF9mcmVlKHNyY19pbWFnZSk7CisgIHZweF9mcmVlKGRzdF9pbWFnZSk7CisgIHZweF9mcmVlKGZsaW1pdHMpOworfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQywgVnA4UG9zdFByb2Nlc3NpbmdGaWx0ZXJUZXN0LAorICAgIDo6dGVzdGluZzo6VmFsdWVzKHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21iX3Jvd19jKSk7CisKKyNpZiBIQVZFX1NTRTIKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNTRTIsIFZwOFBvc3RQcm9jZXNzaW5nRmlsdGVyVGVzdCwKKyAgICA6OnRlc3Rpbmc6OlZhbHVlcyh2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tYl9yb3dfc3NlMikpOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvcmVzaXplX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC9yZXNpemVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ2MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3QvcmVzaXplX3Rlc3QuY2MKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJ0ZXN0L2VuY29kZV90ZXN0X2RyaXZlci5oIgorI2luY2x1ZGUgInRlc3QvdmlkZW9fc291cmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCB1bnNpZ25lZCBpbnQga0luaXRpYWxXaWR0aCA9IDMyMDsKK2NvbnN0IHVuc2lnbmVkIGludCBrSW5pdGlhbEhlaWdodCA9IDI0MDsKKwordW5zaWduZWQgaW50IFNjYWxlRm9yRnJhbWVOdW1iZXIodW5zaWduZWQgaW50IGZyYW1lLCB1bnNpZ25lZCBpbnQgdmFsKSB7CisgIGlmIChmcmFtZSA8IDEwKQorICAgIHJldHVybiB2YWw7CisgIGlmIChmcmFtZSA8IDIwKQorICAgIHJldHVybiB2YWwgLyAyOworICBpZiAoZnJhbWUgPCAzMCkKKyAgICByZXR1cm4gdmFsICogMiAvIDM7CisgIGlmIChmcmFtZSA8IDQwKQorICAgIHJldHVybiB2YWwgLyA0OworICBpZiAoZnJhbWUgPCA1MCkKKyAgICByZXR1cm4gdmFsICogNyAvIDg7CisgIHJldHVybiB2YWw7Cit9CisKK2NsYXNzIFJlc2l6aW5nVmlkZW9Tb3VyY2UgOiBwdWJsaWMgOjpsaWJ2cHhfdGVzdDo6RHVtbXlWaWRlb1NvdXJjZSB7CisgcHVibGljOgorICBSZXNpemluZ1ZpZGVvU291cmNlKCkgeworICAgIFNldFNpemUoa0luaXRpYWxXaWR0aCwga0luaXRpYWxIZWlnaHQpOworICAgIGxpbWl0XyA9IDYwOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBOZXh0KCkgeworICAgICsrZnJhbWVfOworICAgIFNldFNpemUoU2NhbGVGb3JGcmFtZU51bWJlcihmcmFtZV8sIGtJbml0aWFsV2lkdGgpLAorICAgICAgICAgICAgU2NhbGVGb3JGcmFtZU51bWJlcihmcmFtZV8sIGtJbml0aWFsSGVpZ2h0KSk7CisgICAgRmlsbEZyYW1lKCk7CisgIH0KK307CisKK2NsYXNzIFJlc2l6ZVRlc3QgOiBwdWJsaWMgOjpsaWJ2cHhfdGVzdDo6RW5jb2RlclRlc3QsCisgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08ZW51bSBsaWJ2cHhfdGVzdDo6VGVzdE1vZGU+IHsKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBGcmFtZUluZm8geworICAgIEZyYW1lSW5mbyh2cHhfY29kZWNfcHRzX3QgX3B0cywgdW5zaWduZWQgaW50IF93LCB1bnNpZ25lZCBpbnQgX2gpCisgICAgICAgIDogcHRzKF9wdHMpLCB3KF93KSwgaChfaCkge30KKworICAgIHZweF9jb2RlY19wdHNfdCBwdHM7CisgICAgdW5zaWduZWQgaW50ICAgIHc7CisgICAgdW5zaWduZWQgaW50ICAgIGg7CisgIH07CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEluaXRpYWxpemVDb25maWcoKTsKKyAgICBTZXRNb2RlKEdldFBhcmFtKCkpOworICB9CisKKyAgdmlydHVhbCBib29sIENvbnRpbnVlKCkgY29uc3QgeworICAgIHJldHVybiAhSGFzRmF0YWxGYWlsdXJlKCkgJiYgIWFib3J0XzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBGcmFtZVBrdEhvb2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpIHsKKyAgICBpZiAocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0tFWSkgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmID0KKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4ocGt0LT5kYXRhLmZyYW1lLmJ1Zik7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdyA9IChidWZbNl0gfCAoYnVmWzddIDw8IDgpKSAmIDB4M2ZmZjsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBoID0gKGJ1Zls4XSB8IChidWZbOV0gPDwgOCkpICYgMHgzZmZmOworCisgICAgICBmcmFtZV9pbmZvX2xpc3RfLnB1c2hfYmFjayhGcmFtZUluZm8ocGt0LT5kYXRhLmZyYW1lLnB0cywgdywgaCkpOworICAgIH0KKyAgfQorCisgIHN0ZDo6dmVjdG9yPCBGcmFtZUluZm8gPiBmcmFtZV9pbmZvX2xpc3RfOworfTsKKworVEVTVF9QKFJlc2l6ZVRlc3QsIFRlc3RFeHRlcm5hbFJlc2l6ZVdvcmtzKSB7CisgIFJlc2l6aW5nVmlkZW9Tb3VyY2UgdmlkZW87CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJ1bkxvb3AoJnZpZGVvKSk7CisKKyAgZm9yIChzdGQ6OnZlY3RvcjxGcmFtZUluZm8+OjppdGVyYXRvciBpbmZvID0gZnJhbWVfaW5mb19saXN0Xy5iZWdpbigpOworICAgICAgIGluZm8gIT0gZnJhbWVfaW5mb19saXN0Xy5lbmQoKTsgKytpbmZvKSB7CisgICAgY29uc3QgdnB4X2NvZGVjX3B0c190IHB0cyA9IGluZm8tPnB0czsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfdyA9IFNjYWxlRm9yRnJhbWVOdW1iZXIocHRzLCBrSW5pdGlhbFdpZHRoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfaCA9IFNjYWxlRm9yRnJhbWVOdW1iZXIocHRzLCBrSW5pdGlhbEhlaWdodCk7CisKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdywgaW5mby0+dykKKyAgICAgICAgPDwgIkZyYW1lICIgPDwgcHRzIDw8ICJoYWQgdW5leHBlY3RlZCB3aWR0aCI7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2gsIGluZm8tPmgpCisgICAgICAgIDw8ICJGcmFtZSAiIDw8IHB0cyA8PCAiaGFkIHVuZXhwZWN0ZWQgaGVpZ2h0IjsKKyAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChPbmVQYXNzLCBSZXNpemVUZXN0LCBPTkVfUEFTU19URVNUX01PREVTKTsKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3Qvc2FkX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC9zYWRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU2MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3Qvc2FkX3Rlc3QuY2MKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi92cHhfY29uZmlnLmgiCisjaW5jbHVkZSAiLi92cHhfcnRjZC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCit9CisKKyNpbmNsdWRlICJ0ZXN0L2FjbV9yYW5kb20uaCIKKyNpbmNsdWRlICJ0ZXN0L3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKCpzYWRfbV9ieV9uX2ZuX3QpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmZXJlbmNlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmZXJlbmNlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisKK3VzaW5nIGxpYnZweF90ZXN0OjpBQ01SYW5kb207CisKK25hbWVzcGFjZSB7CitjbGFzcyBTQURUZXN0IDogcHVibGljIFBBUkFNUyhpbnQsIGludCwgc2FkX21fYnlfbl9mbl90KSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIHNvdXJjZV9kYXRhXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KAorICAgICAgICB2cHhfbWVtYWxpZ24oa0RhdGFBbGlnbm1lbnQsIGtEYXRhQnVmZmVyU2l6ZSkpOworICAgIHJlZmVyZW5jZV9kYXRhXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KAorICAgICAgICB2cHhfbWVtYWxpZ24oa0RhdGFBbGlnbm1lbnQsIGtEYXRhQnVmZmVyU2l6ZSkpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICB2cHhfZnJlZShzb3VyY2VfZGF0YV8pOworICAgIHNvdXJjZV9kYXRhXyA9IE5VTEw7CisgICAgdnB4X2ZyZWUocmVmZXJlbmNlX2RhdGFfKTsKKyAgICByZWZlcmVuY2VfZGF0YV8gPSBOVUxMOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBpbnQga0RhdGFBbGlnbm1lbnQgPSAxNjsKKyAgc3RhdGljIGNvbnN0IGludCBrRGF0YUJ1ZmZlclNpemUgPSAxNiAqIDMyOworCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBzYWRfZm5fID0gR0VUX1BBUkFNKDIpOworICAgIGhlaWdodF8gPSBHRVRfUEFSQU0oMSk7CisgICAgd2lkdGhfID0gR0VUX1BBUkFNKDApOworICAgIHNvdXJjZV9zdHJpZGVfID0gd2lkdGhfICogMjsKKyAgICByZWZlcmVuY2Vfc3RyaWRlXyA9IHdpZHRoXyAqIDI7CisgICAgcm5kXy5SZXNldChBQ01SYW5kb206OkRldGVybWluaXN0aWNTZWVkKCkpOworICB9CisKKyAgc2FkX21fYnlfbl9mbl90IHNhZF9mbl87CisgIHZpcnR1YWwgdW5zaWduZWQgaW50IFNBRCh1bnNpZ25lZCBpbnQgbWF4X3NhZCkgeworICAgIHJldHVybiBzYWRfZm5fKHNvdXJjZV9kYXRhXywgc291cmNlX3N0cmlkZV8sCisgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2RhdGFfLCByZWZlcmVuY2Vfc3RyaWRlXywKKyAgICAgICAgICAgICAgICAgICBtYXhfc2FkKTsKKyAgfQorCisgIC8vIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcy4gR2l2ZW4gdHdvIGJsb2NrcywgY2FsY3VsYXRlIHRoZSBhYnNvbHV0ZQorICAvLyBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBpeGVscyBpbiB0aGUgc2FtZSByZWxhdGl2ZSBsb2NhdGlvbjsgYWNjdW11bGF0ZS4KKyAgdW5zaWduZWQgaW50IFJlZmVyZW5jZVNBRCh1bnNpZ25lZCBpbnQgbWF4X3NhZCkgeworICAgIHVuc2lnbmVkIGludCBzYWQgPSAwOworCisgICAgZm9yIChpbnQgaCA9IDA7IGggPCBoZWlnaHRfOyArK2gpIHsKKyAgICAgIGZvciAoaW50IHcgPSAwOyB3IDwgd2lkdGhfOyArK3cpIHsKKyAgICAgICAgc2FkICs9IGFicyhzb3VyY2VfZGF0YV9baCAqIHNvdXJjZV9zdHJpZGVfICsgd10KKyAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlX2RhdGFfW2ggKiByZWZlcmVuY2Vfc3RyaWRlXyArIHddKTsKKyAgICAgIH0KKyAgICAgIGlmIChzYWQgPiBtYXhfc2FkKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FkOworICB9CisKKyAgdm9pZCBGaWxsQ29uc3RhbnQodWludDhfdCAqZGF0YSwgaW50IHN0cmlkZSwgdWludDhfdCBmaWxsX2NvbnN0YW50KSB7CisgICAgZm9yIChpbnQgaCA9IDA7IGggPCBoZWlnaHRfOyArK2gpIHsKKyAgICAgIGZvciAoaW50IHcgPSAwOyB3IDwgd2lkdGhfOyArK3cpIHsKKyAgICAgICAgZGF0YVtoICogc3RyaWRlICsgd10gPSBmaWxsX2NvbnN0YW50OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgRmlsbFJhbmRvbSh1aW50OF90ICpkYXRhLCBpbnQgc3RyaWRlKSB7CisgICAgZm9yIChpbnQgaCA9IDA7IGggPCBoZWlnaHRfOyArK2gpIHsKKyAgICAgIGZvciAoaW50IHcgPSAwOyB3IDwgd2lkdGhfOyArK3cpIHsKKyAgICAgICAgZGF0YVtoICogc3RyaWRlICsgd10gPSBybmRfLlJhbmQ4KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBDaGVja1NhZCh1bnNpZ25lZCBpbnQgbWF4X3NhZCkgeworICAgIHVuc2lnbmVkIGludCByZWZlcmVuY2Vfc2FkLCBleHBfc2FkOworCisgICAgcmVmZXJlbmNlX3NhZCA9IFJlZmVyZW5jZVNBRChtYXhfc2FkKTsKKyAgICBleHBfc2FkID0gU0FEKG1heF9zYWQpOworCisgICAgaWYgKHJlZmVyZW5jZV9zYWQgPD0gbWF4X3NhZCkgeworICAgICAgQVNTRVJUX0VRKGV4cF9zYWQsIHJlZmVyZW5jZV9zYWQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBjaGVjayBtYXhfc2FkCisgICAgICBBU1NFUlRfR0UoZXhwX3NhZCwgcmVmZXJlbmNlX3NhZCk7CisgICAgfQorICB9CisKKyAgLy8gSGFuZGxlIGJsb2NrcyB1cCB0byAxNngxNiB3aXRoIHN0cmlkZSB1cCB0byAzMgorICBpbnQgaGVpZ2h0Xywgd2lkdGhfOworICBzdGF0aWMgdWludDhfdCogc291cmNlX2RhdGFfOworICBpbnQgc291cmNlX3N0cmlkZV87CisgIHN0YXRpYyB1aW50OF90KiByZWZlcmVuY2VfZGF0YV87CisgIGludCByZWZlcmVuY2Vfc3RyaWRlXzsKKworICBBQ01SYW5kb20gcm5kXzsKK307CisKK3VpbnQ4X3QqIFNBRFRlc3Q6OnNvdXJjZV9kYXRhXyA9IE5VTEw7Cit1aW50OF90KiBTQURUZXN0OjpyZWZlcmVuY2VfZGF0YV8gPSBOVUxMOworCitURVNUX1AoU0FEVGVzdCwgTWF4UmVmKSB7CisgIEZpbGxDb25zdGFudChzb3VyY2VfZGF0YV8sIHNvdXJjZV9zdHJpZGVfLCAwKTsKKyAgRmlsbENvbnN0YW50KHJlZmVyZW5jZV9kYXRhXywgcmVmZXJlbmNlX3N0cmlkZV8sIDI1NSk7CisgIENoZWNrU2FkKFVJTlRfTUFYKTsKK30KKworVEVTVF9QKFNBRFRlc3QsIE1heFNyYykgeworICBGaWxsQ29uc3RhbnQoc291cmNlX2RhdGFfLCBzb3VyY2Vfc3RyaWRlXywgMjU1KTsKKyAgRmlsbENvbnN0YW50KHJlZmVyZW5jZV9kYXRhXywgcmVmZXJlbmNlX3N0cmlkZV8sIDApOworICBDaGVja1NhZChVSU5UX01BWCk7Cit9CisKK1RFU1RfUChTQURUZXN0LCBTaG9ydFJlZikgeworICBpbnQgdG1wX3N0cmlkZSA9IHJlZmVyZW5jZV9zdHJpZGVfOworICByZWZlcmVuY2Vfc3RyaWRlXyA+Pj0gMTsKKyAgRmlsbFJhbmRvbShzb3VyY2VfZGF0YV8sIHNvdXJjZV9zdHJpZGVfKTsKKyAgRmlsbFJhbmRvbShyZWZlcmVuY2VfZGF0YV8sIHJlZmVyZW5jZV9zdHJpZGVfKTsKKyAgQ2hlY2tTYWQoVUlOVF9NQVgpOworICByZWZlcmVuY2Vfc3RyaWRlXyA9IHRtcF9zdHJpZGU7Cit9CisKK1RFU1RfUChTQURUZXN0LCBVbmFsaWduZWRSZWYpIHsKKyAgLy8gVGhlIHJlZmVyZW5jZSBmcmFtZSwgYnV0IG5vdCB0aGUgc291cmNlIGZyYW1lLCBtYXkgYmUgdW5hbGlnbmVkIGZvcgorICAvLyBjZXJ0YWluIHR5cGVzIG9mIHNlYXJjaGVzLgorICBpbnQgdG1wX3N0cmlkZSA9IHJlZmVyZW5jZV9zdHJpZGVfOworICByZWZlcmVuY2Vfc3RyaWRlXyAtPSAxOworICBGaWxsUmFuZG9tKHNvdXJjZV9kYXRhXywgc291cmNlX3N0cmlkZV8pOworICBGaWxsUmFuZG9tKHJlZmVyZW5jZV9kYXRhXywgcmVmZXJlbmNlX3N0cmlkZV8pOworICBDaGVja1NhZChVSU5UX01BWCk7CisgIHJlZmVyZW5jZV9zdHJpZGVfID0gdG1wX3N0cmlkZTsKK30KKworVEVTVF9QKFNBRFRlc3QsIFNob3J0U3JjKSB7CisgIGludCB0bXBfc3RyaWRlID0gc291cmNlX3N0cmlkZV87CisgIHNvdXJjZV9zdHJpZGVfID4+PSAxOworICBGaWxsUmFuZG9tKHNvdXJjZV9kYXRhXywgc291cmNlX3N0cmlkZV8pOworICBGaWxsUmFuZG9tKHJlZmVyZW5jZV9kYXRhXywgcmVmZXJlbmNlX3N0cmlkZV8pOworICBDaGVja1NhZChVSU5UX01BWCk7CisgIHNvdXJjZV9zdHJpZGVfID0gdG1wX3N0cmlkZTsKK30KKworVEVTVF9QKFNBRFRlc3QsIE1heFNBRCkgeworICAvLyBWZXJpZnkgdGhhdCwgd2hlbiBtYXhfc2FkIGlzIHNldCwgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJldHVybiBhCisgIC8vIHZhbHVlIGxvd2VyIHRoYW4gdGhlIHJlZmVyZW5jZS4KKyAgRmlsbENvbnN0YW50KHNvdXJjZV9kYXRhXywgc291cmNlX3N0cmlkZV8sIDI1NSk7CisgIEZpbGxDb25zdGFudChyZWZlcmVuY2VfZGF0YV8sIHJlZmVyZW5jZV9zdHJpZGVfLCAwKTsKKyAgQ2hlY2tTYWQoMTI4KTsKK30KKwordXNpbmcgc3RkOjp0cjE6Om1ha2VfdHVwbGU7CisKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfMTZ4MTZfYyA9IHZwOF9zYWQxNngxNl9jOworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF84eDE2X2MgPSB2cDhfc2FkOHgxNl9jOworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF8xNng4X2MgPSB2cDhfc2FkMTZ4OF9jOworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF84eDhfYyA9IHZwOF9zYWQ4eDhfYzsKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfNHg0X2MgPSB2cDhfc2FkNHg0X2M7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChDLCBTQURUZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMTYsIDE2LCBzYWRfMTZ4MTZfYyksCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDgsIDE2LCBzYWRfOHgxNl9jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMTYsIDgsIHNhZF8xNng4X2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg4LCA4LCBzYWRfOHg4X2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg0LCA0LCBzYWRfNHg0X2MpKSk7CisKKy8vIEFSTSB0ZXN0cworI2lmIEhBVkVfTUVESUEKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfMTZ4MTZfYXJtdjYgPSB2cDhfc2FkMTZ4MTZfYXJtdjY7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNRURJQSwgU0FEVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDE2LCAxNiwgc2FkXzE2eDE2X2FybXY2KSkpOworCisjZW5kaWYKKyNpZiBIQVZFX05FT04KK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfMTZ4MTZfbmVvbiA9IHZwOF9zYWQxNngxNl9uZW9uOworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF84eDE2X25lb24gPSB2cDhfc2FkOHgxNl9uZW9uOworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF8xNng4X25lb24gPSB2cDhfc2FkMTZ4OF9uZW9uOworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF84eDhfbmVvbiA9IHZwOF9zYWQ4eDhfbmVvbjsKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfNHg0X25lb24gPSB2cDhfc2FkNHg0X25lb247CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChORU9OLCBTQURUZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMTYsIDE2LCBzYWRfMTZ4MTZfbmVvbiksCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDgsIDE2LCBzYWRfOHgxNl9uZW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMTYsIDgsIHNhZF8xNng4X25lb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg4LCA4LCBzYWRfOHg4X25lb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg0LCA0LCBzYWRfNHg0X25lb24pKSk7CisjZW5kaWYKKworLy8gWDg2IHRlc3RzCisjaWYgSEFWRV9NTVgKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfMTZ4MTZfbW14ID0gdnA4X3NhZDE2eDE2X21teDsKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfOHgxNl9tbXggPSB2cDhfc2FkOHgxNl9tbXg7Citjb25zdCBzYWRfbV9ieV9uX2ZuX3Qgc2FkXzE2eDhfbW14ID0gdnA4X3NhZDE2eDhfbW14OworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF84eDhfbW14ID0gdnA4X3NhZDh4OF9tbXg7Citjb25zdCBzYWRfbV9ieV9uX2ZuX3Qgc2FkXzR4NF9tbXggPSB2cDhfc2FkNHg0X21teDsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1NWCwgU0FEVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDE2LCAxNiwgc2FkXzE2eDE2X21teCksCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDgsIDE2LCBzYWRfOHgxNl9tbXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgxNiwgOCwgc2FkXzE2eDhfbW14KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoOCwgOCwgc2FkXzh4OF9tbXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg0LCA0LCBzYWRfNHg0X21teCkpKTsKKyNlbmRpZgorI2lmIEhBVkVfU1NFMgorY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF8xNngxNl93bXQgPSB2cDhfc2FkMTZ4MTZfd210OworY29uc3Qgc2FkX21fYnlfbl9mbl90IHNhZF84eDE2X3dtdCA9IHZwOF9zYWQ4eDE2X3dtdDsKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfMTZ4OF93bXQgPSB2cDhfc2FkMTZ4OF93bXQ7Citjb25zdCBzYWRfbV9ieV9uX2ZuX3Qgc2FkXzh4OF93bXQgPSB2cDhfc2FkOHg4X3dtdDsKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfNHg0X3dtdCA9IHZwOF9zYWQ0eDRfd210OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1NFMiwgU0FEVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDE2LCAxNiwgc2FkXzE2eDE2X3dtdCksCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDgsIDE2LCBzYWRfOHgxNl93bXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgxNiwgOCwgc2FkXzE2eDhfd210KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoOCwgOCwgc2FkXzh4OF93bXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg0LCA0LCBzYWRfNHg0X3dtdCkpKTsKKyNlbmRpZgorI2lmIEhBVkVfU1NTRTMKK2NvbnN0IHNhZF9tX2J5X25fZm5fdCBzYWRfMTZ4MTZfc3NlMyA9IHZwOF9zYWQxNngxNl9zc2UzOworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1NFMywgU0FEVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDE2LCAxNiwgc2FkXzE2eDE2X3NzZTMpKSk7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC9zZXRfcm9pLmNjIGIvbGlidnB4L3Rlc3Qvc2V0X3JvaS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjYxMTJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rlc3Qvc2V0X3JvaS5jYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2ludGVnZXIuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZwOC9lbmNvZGVyL29ueXhfaW50LmgiCit9CisKK25hbWVzcGFjZSB7CisKK1RFU1QoVnA4Um9pTWFwVGVzdCwgUGFyYW1ldGVyQ2hlY2spIHsKKyAgaW50IGRlbHRhX3FbTUFYX01CX1NFR01FTlRTXSA9IHsgLTIsIC0yNSwgMCwgMzEgfTsKKyAgaW50IGRlbHRhX2xmW01BWF9NQl9TRUdNRU5UU10gPSB7IC0yLCAtMjUsIDAsIDMxIH07CisgIHVuc2lnbmVkIGludCB0aHJlc2hvbGRbTUFYX01CX1NFR01FTlRTXSA9IHsgMCwgMTAwLCAyMDAsIDMwMCB9OworCisgIGNvbnN0IGludCBpbnRlcm5hbHFfdHJhbnNbXSA9IHsKKyAgICAwLCAgIDEsICAyLCAgMywgIDQsICA1LCAgNywgIDgsCisgICAgOSwgIDEwLCAxMiwgMTMsIDE1LCAxNywgMTgsIDE5LAorICAgIDIwLCAgMjEsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCisgICAgMjksICAzMCwgMzEsIDMzLCAzNSwgMzcsIDM5LCA0MSwKKyAgICA0MywgIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsIDU3LAorICAgIDU5LCAgNjEsIDY0LCA2NywgNzAsIDczLCA3NiwgNzksCisgICAgODIsICA4NSwgODgsIDkxLCA5NCwgOTcsIDEwMCwgMTAzLAorICAgIDEwNiwgMTA5LCAxMTIsIDExNSwgMTE4LCAxMjEsIDEyNCwgMTI3LAorICB9OworCisgIC8vIEluaXRpYWxpemUgZWxlbWVudHMgb2YgY3BpIHdpdGggdmFsaWQgZGVmYXVsdHMuCisgIFZQOF9DT01QIGNwaTsKKyAgY3BpLm1iLmVfbWJkLm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9IFNFR01FTlRfREVMVEFEQVRBOworICBjcGkuY3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkID0gMDsKKyAgY3BpLm1iLmVfbWJkLnNlZ21lbnRhdGlvbl9lbmFibGVkID0gMDsKKyAgY3BpLm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMDsKKyAgY3BpLm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSA9IDA7CisgIGNwaS5jb21tb24ubWJfcm93cyA9IDI0MCA+PiA0OworICBjcGkuY29tbW9uLm1iX2NvbHMgPSAzMjAgPj4gNDsKKyAgY29uc3QgaW50IG1icyA9IChjcGkuY29tbW9uLm1iX3Jvd3MgKiBjcGkuY29tbW9uLm1iX2NvbHMpOworICB2cHhfbWVtc2V0KGNwaS5zZWdtZW50X2ZlYXR1cmVfZGF0YSwgMCwgc2l6ZW9mKGNwaS5zZWdtZW50X2ZlYXR1cmVfZGF0YSkpOworCisgIC8vIFNlZ21lbnQgbWFwCisgIGNwaS5zZWdtZW50YXRpb25fbWFwID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyICo+KHZweF9jYWxsb2MobWJzLCAxKSk7CisKKyAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc291cmNlIG1lbW9yeSBtYXAuCisgIHVuc2lnbmVkIGNoYXIgKnJvaV9tYXAgPQorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhciAqPih2cHhfY2FsbG9jKG1icywgMSkpOworICB2cHhfbWVtc2V0KCZyb2lfbWFwW21icyA+PiAyXSwgMSwgKG1icyA+PiAyKSk7CisgIHZweF9tZW1zZXQoJnJvaV9tYXBbbWJzID4+IDFdLCAyLCAobWJzID4+IDIpKTsKKyAgdnB4X21lbXNldCgmcm9pX21hcFttYnMgLShtYnMgPj4gMildLCAzLCAobWJzID4+IDIpKTsKKworICAvLyBEbyBhIHRlc3QgY2FsbCB3aXRoIHZhbGlkIHBhcmFtZXRlcnMuCisgIGludCByb2lfcmV0dmFsID0gdnA4X3NldF9yb2ltYXAoJmNwaSwgcm9pX21hcCwgY3BpLmNvbW1vbi5tYl9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS5jb21tb24ubWJfY29scywgZGVsdGFfcSwgZGVsdGFfbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkKTsKKyAgRVhQRUNUX0VRKDAsIHJvaV9yZXR2YWwpCisgICAgICAgIDw8ICJ2cDhfc2V0X3JvaW1hcCByb2kgZmFpbGVkIHdpdGggZGVmYXVsdCB0ZXN0IHBhcmFtZXRlcnMiOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgY3BpIHN0cnVjdHVyZSBnZXQgc2V0IGFzIGV4cGVjdGVkLgorICBpZiAocm9pX3JldHZhbCA9PSAwKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgc2VnbWVudCBtYXAgZ290IHNldC4KKyAgICBjb25zdCBpbnQgbWFwY29tcGFyZSA9IG1lbWNtcChyb2lfbWFwLCBjcGkuc2VnbWVudGF0aW9uX21hcCwgbWJzKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWFwY29tcGFyZSkgPDwgInNlZ21lbnQgbWFwIGVycm9yIjsKKworICAgIC8vIENoZWNrIHRoZSBxIGRlbHRhcyAobm90ZSB0aGUgbmVlZCB0byB0cmFuc2xhdGUgaW50bworICAgIC8vIHRoZSBpbnRlcmFubCByYW5nZSBvZiAwLTEyNy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgKytpKSB7CisgICAgICBjb25zdCBpbnQgdHJhbnNxID0gaW50ZXJuYWxxX3RyYW5zW2FicyhkZWx0YV9xW2ldKV07CisgICAgICBpZiAoYWJzKGNwaS5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW2ldKSAhPSB0cmFuc3EpIHsKKyAgICAgICAgICBFWFBFQ1RfRVEodHJhbnNxLCBjcGkuc2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVtpXSkKKyAgICAgICAgICAgICAgICAgICAgPDwgInNlZ21lbnQgZGVsdGFfcSAgZXJyb3IiOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIHRoZSBsb29wIGZpbHRlciBkZWx0YXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgKytpKSB7CisgICAgICBpZiAoY3BpLnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdW2ldICE9IGRlbHRhX2xmW2ldKSB7CisgICAgICAgIEVYUEVDVF9FUShkZWx0YV9sZltpXSwgY3BpLnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdW2ldKQorICAgICAgICAgICAgICAgICAgPDwgInNlZ21lbnQgZGVsdGFfbGYgZXJyb3IiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGUgYnJlYWtvdXQgdGhyZXNob2xkcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIGludCBicmVha291dCA9CisgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oY3BpLnNlZ21lbnRfZW5jb2RlX2JyZWFrb3V0W2ldKTsKKworICAgICAgaWYgKHRocmVzaG9sZFtpXSAhPSBicmVha291dCkgeworICAgICAgICBFWFBFQ1RfRVEodGhyZXNob2xkW2ldLCBicmVha291dCkKKyAgICAgICAgICAgICAgICAgIDw8ICJicmVha291dCB0aHJlc2hvbGQgZXJyb3IiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZWdtZW50YXRpb24sIGFuZCBzZWdtZW50YXRpb24gdXBkYXRlIGZsYWdlcyBzaG91bGQgYmUgc2V0LgorICAgIEVYUEVDVF9FUSgxLCBjcGkubWIuZV9tYmQuc2VnbWVudGF0aW9uX2VuYWJsZWQpCisgICAgICAgICAgICAgIDw8ICJzZWdtZW50YXRpb25fZW5hYmxlZCBlcnJvciI7CisgICAgRVhQRUNUX0VRKDEsIGNwaS5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKKyAgICAgICAgICAgICAgPDwgInVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwIGVycm9yIjsKKyAgICBFWFBFQ1RfRVEoMSwgY3BpLm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSkKKyAgICAgICAgICAgICAgPDwgInVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSBlcnJvciI7CisKKworICAgIC8vIFRyeSBhIHJhbmdlIG9mIGRlbHRhIHEgYW5kIGxmIHBhcmFtZXRlcnMgKHNvbWUgbGVnYWwsIHNvbWUgbm90KQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgICBpbnQgcmFuZF9kZWx0YXNbNF07CisgICAgICBpbnQgZGVsdGFzX3ZhbGlkOworICAgICAgcmFuZF9kZWx0YXNbMF0gPSAocmFuZCgpICUgMTYwKSAtIDgwOworICAgICAgcmFuZF9kZWx0YXNbMV0gPSAocmFuZCgpICUgMTYwKSAtIDgwOworICAgICAgcmFuZF9kZWx0YXNbMl0gPSAocmFuZCgpICUgMTYwKSAtIDgwOworICAgICAgcmFuZF9kZWx0YXNbM10gPSAocmFuZCgpICUgMTYwKSAtIDgwOworCisgICAgICBkZWx0YXNfdmFsaWQgPSAoKGFicyhyYW5kX2RlbHRhc1swXSkgPD0gNjMpICYmCisgICAgICAgICAgICAgICAgICAgICAgKGFicyhyYW5kX2RlbHRhc1sxXSkgPD0gNjMpICYmCisgICAgICAgICAgICAgICAgICAgICAgKGFicyhyYW5kX2RlbHRhc1syXSkgPD0gNjMpICYmCisgICAgICAgICAgICAgICAgICAgICAgKGFicyhyYW5kX2RlbHRhc1szXSkgPD0gNjMpKSA/IDAgOiAtMTsKKworICAgICAgLy8gVGVzdCB3aXRoIHJhbmRvbSBkZWx0YSBxIHZhbHVlcy4KKyAgICAgIHJvaV9yZXR2YWwgPSB2cDhfc2V0X3JvaW1hcCgmY3BpLCByb2lfbWFwLCBjcGkuY29tbW9uLm1iX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLmNvbW1vbi5tYl9jb2xzLCByYW5kX2RlbHRhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9sZiwgdGhyZXNob2xkKTsKKyAgICAgIEVYUEVDVF9FUShkZWx0YXNfdmFsaWQsIHJvaV9yZXR2YWwpIDw8ICJkcSByYW5nZSBjaGVjayBlcnJvciI7CisKKyAgICAgIC8vIE9uZSBkZWx0YV9xIGVycm9yIHNob3duIGF0IGEgdGltZQorICAgICAgaWYgKGRlbHRhc192YWxpZCAhPSByb2lfcmV0dmFsKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gVGVzdCB3aXRoIHJhbmRvbSBsb29wIGZpbHRlciB2YWx1ZXMuCisgICAgICByb2lfcmV0dmFsID0gdnA4X3NldF9yb2ltYXAoJmNwaSwgcm9pX21hcCwgY3BpLmNvbW1vbi5tYl9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS5jb21tb24ubWJfY29scywgZGVsdGFfcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kX2RlbHRhcywgdGhyZXNob2xkKTsKKyAgICAgIEVYUEVDVF9FUShkZWx0YXNfdmFsaWQsIHJvaV9yZXR2YWwpIDw8ICJkbGYgcmFuZ2UgY2hlY2sgZXJyb3IiOworCisgICAgICAvLyBPbmUgZGVsdGEgbG9vcCBmaWx0ZXIgZXJyb3Igc2hvd24gYXQgYSB0aW1lCisgICAgICBpZiAoZGVsdGFzX3ZhbGlkICE9IHJvaV9yZXR2YWwpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCB3ZSByZXBvcnQgYW5kIGVycm9yIGlmIGN5Y2xpYyByZWZyZXNoIGlzIGVuYWJsZWQuCisgICAgY3BpLmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCA9IDE7CisgICAgcm9pX3JldHZhbCA9IHZwOF9zZXRfcm9pbWFwKCZjcGksIHJvaV9tYXAsIGNwaS5jb21tb24ubWJfcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLmNvbW1vbi5tYl9jb2xzLCBkZWx0YV9xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9sZiwgdGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEoLTEsIHJvaV9yZXR2YWwpIDw8ICJjeWNsaWMgcmVmcmVzaCBjaGVjayBlcnJvciI7CisgICAgY3BpLmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCA9IDA7CisKKyAgICAvLyBUZXN0IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb3IgY29sdW1zLgorICAgIHJvaV9yZXR2YWwgPSB2cDhfc2V0X3JvaW1hcCgmY3BpLCByb2lfbWFwLCBjcGkuY29tbW9uLm1iX3Jvd3MgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGkuY29tbW9uLm1iX2NvbHMsIGRlbHRhX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2xmLCB0aHJlc2hvbGQpOworICAgIEVYUEVDVF9FUSgtMSwgcm9pX3JldHZhbCkgPDwgIk1CIHJvd3MgYm91bmRzIGNoZWNrIGVycm9yIjsKKworICAgIHJvaV9yZXR2YWwgPSB2cDhfc2V0X3JvaW1hcCgmY3BpLCByb2lfbWFwLCBjcGkuY29tbW9uLm1iX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS5jb21tb24ubWJfY29scyAtIDEsIGRlbHRhX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2xmLCB0aHJlc2hvbGQpOworICAgIEVYUEVDVF9FUSgtMSwgcm9pX3JldHZhbCkgPDwgIk1CIGNvbHMgYm91bmRzIGNoZWNrIGVycm9yIjsKKyAgfQorCisgIC8vIEZyZWUgYWxsb2NhdGVkIG1lbW9yeQorICBpZiAoY3BpLnNlZ21lbnRhdGlvbl9tYXApCisgICAgdnB4X2ZyZWUoY3BpLnNlZ21lbnRhdGlvbl9tYXApOworICBpZiAocm9pX21hcCkKKyAgICB2cHhfZnJlZShyb2lfbWFwKTsKK307CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3Qvc2l4dGFwX3ByZWRpY3RfdGVzdC5jYyBiL2xpYnZweC90ZXN0L3NpeHRhcF9wcmVkaWN0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmMTRhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L3NpeHRhcF9wcmVkaWN0X3Rlc3QuY2MKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidGVzdC9hY21fcmFuZG9tLmgiCisjaW5jbHVkZSAidGVzdC91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi92cHhfY29uZmlnLmgiCisjaW5jbHVkZSAiLi92cHhfcnRjZC5oIgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorfQorCituYW1lc3BhY2UgeworCit0eXBlZGVmIHZvaWQgKCpzaXh0YXBfcHJlZGljdF9mbl90KSh1aW50OF90ICpzcmNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgZHN0X3BpdGNoKTsKKworY2xhc3MgU2l4dGFwUHJlZGljdFRlc3QgOiBwdWJsaWMgUEFSQU1TKGludCwgaW50LCBzaXh0YXBfcHJlZGljdF9mbl90KSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIHNyY18gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih2cHhfbWVtYWxpZ24oa0RhdGFBbGlnbm1lbnQsIGtTcmNTaXplKSk7CisgICAgZHN0XyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHZweF9tZW1hbGlnbihrRGF0YUFsaWdubWVudCwga0RzdFNpemUpKTsKKyAgICBkc3RfY18gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih2cHhfbWVtYWxpZ24oa0RhdGFBbGlnbm1lbnQsIGtEc3RTaXplKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHZweF9mcmVlKHNyY18pOworICAgIHNyY18gPSBOVUxMOworICAgIHZweF9mcmVlKGRzdF8pOworICAgIGRzdF8gPSBOVUxMOworICAgIHZweF9mcmVlKGRzdF9jXyk7CisgICAgZHN0X2NfID0gTlVMTDsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBNYWtlIHRlc3QgYXJyYXlzIGJpZyBlbm91Z2ggZm9yIDE2eDE2IGZ1bmN0aW9ucy4gU2l4LXRhcCBmaWx0ZXJzCisgIC8vIG5lZWQgNSBleHRyYSBwaXhlbHMgb3V0c2lkZSBvZiB0aGUgbWFjcm9ibG9jay4KKyAgc3RhdGljIGNvbnN0IGludCBrU3JjU3RyaWRlID0gMjE7CisgIHN0YXRpYyBjb25zdCBpbnQga0RzdFN0cmlkZSA9IDE2OworICBzdGF0aWMgY29uc3QgaW50IGtEYXRhQWxpZ25tZW50ID0gMTY7CisgIHN0YXRpYyBjb25zdCBpbnQga1NyY1NpemUgPSBrU3JjU3RyaWRlICoga1NyY1N0cmlkZSArIDE7CisgIHN0YXRpYyBjb25zdCBpbnQga0RzdFNpemUgPSBrRHN0U3RyaWRlICoga0RzdFN0cmlkZTsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgd2lkdGhfID0gR0VUX1BBUkFNKDApOworICAgIGhlaWdodF8gPSBHRVRfUEFSQU0oMSk7CisgICAgc2l4dGFwX3ByZWRpY3RfID0gR0VUX1BBUkFNKDIpOworICAgIG1lbXNldChzcmNfLCAwLCBzaXplb2Yoc3JjXykpOworICAgIG1lbXNldChkc3RfLCAwLCBzaXplb2YoZHN0XykpOworICAgIG1lbXNldChkc3RfY18sIDAsIHNpemVvZihkc3RfY18pKTsKKyAgfQorCisgIGludCB3aWR0aF87CisgIGludCBoZWlnaHRfOworICBzaXh0YXBfcHJlZGljdF9mbl90IHNpeHRhcF9wcmVkaWN0XzsKKyAgLy8gVGhlIHNyYyBzdG9yZXMgdGhlIG1hY3JvYmxvY2sgd2Ugd2lsbCBmaWx0ZXIgb24sIGFuZCBtYWtlcyBpdCAxIGJ5dGUgbGFyZ2VyCisgIC8vIGluIG9yZGVyIHRvIHRlc3QgdW5hbGlnbmVkIGFjY2Vzcy4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gZHN0IGFuZCBkc3RfYyhjCisgIC8vIHJlZmVyZW5jZSBjb2RlIHJlc3VsdCkuCisgIHN0YXRpYyB1aW50OF90KiBzcmNfOworICBzdGF0aWMgdWludDhfdCogZHN0XzsKKyAgc3RhdGljIHVpbnQ4X3QqIGRzdF9jXzsKK307CisKK3VpbnQ4X3QqIFNpeHRhcFByZWRpY3RUZXN0OjpzcmNfID0gTlVMTDsKK3VpbnQ4X3QqIFNpeHRhcFByZWRpY3RUZXN0Ojpkc3RfID0gTlVMTDsKK3VpbnQ4X3QqIFNpeHRhcFByZWRpY3RUZXN0Ojpkc3RfY18gPSBOVUxMOworCitURVNUX1AoU2l4dGFwUHJlZGljdFRlc3QsIFRlc3RXaXRoUHJlc2V0RGF0YSkgeworICAvLyBUZXN0IGlucHV0CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHRlc3RfZGF0YVtrU3JjU2l6ZV0gPSB7CisgICAgMjE2LCAxODQsIDQsIDE5MSwgODIsIDkyLCA0MSwgMCwgMSwgMjI2LCAyMzYsIDE3MiwgMjAsIDE4MiwgNDIsIDIyNiwgMTc3LAorICAgIDc5LCA5NCwgNzcsIDE3OSwgMjAzLCAyMDYsIDE5OCwgMjIsIDE5MiwgMTksIDc1LCAxNywgMTkyLCA0NCwgMjMzLCAxMjAsCisgICAgNDgsIDE2OCwgMjAzLCAxNDEsIDIxMCwgMjAzLCAxNDMsIDE4MCwgMTg0LCA1OSwgMjAxLCAxMTAsIDEwMiwgMTcxLCAzMiwKKyAgICAxODIsIDEwLCAxMDksIDEwNSwgMjEzLCA2MCwgNDcsIDIzNiwgMjUzLCA2NywgNTUsIDE0LCAzLCA5OSwgMjQ3LCAxMjQsCisgICAgMTQ4LCAxNTksIDcxLCAzNCwgMTE0LCAxOSwgMTc3LCAzOCwgMjAzLCAyMzcsIDIzOSwgNTgsIDgzLCAxNTUsIDkxLCAxMCwKKyAgICAxNjYsIDIwMSwgMTE1LCAxMjQsIDUsIDE2MywgMTA0LCAyLCAyMzEsIDE2MCwgMTYsIDIzNCwgNCwgOCwgMTAzLCAxNTMsCisgICAgMTY3LCAxNzQsIDE4NywgMjYsIDE5MywgMTA5LCA2NCwgMTQxLCA5MCwgNDgsIDIwMCwgMTc0LCAyMDQsIDM2LCAxODQsCisgICAgMTE0LCAyMzcsIDQzLCAyMzgsIDI0MiwgMjA3LCA4NiwgMjQ1LCAxODIsIDI0NywgNiwgMTYxLCAyNTEsIDE0LCA4LCAxNDgsCisgICAgMTgyLCAxODIsIDc5LCAyMDgsIDEyMCwgMTg4LCAxNywgNiwgMjMsIDY1LCAyMDYsIDE5NywgMTMsIDI0MiwgMTI2LCAxMjgsCisgICAgMjI0LCAxNzAsIDExMCwgMjExLCAxMjEsIDE5NywgMjAwLCA0NywgMTg4LCAyMDcsIDIwOCwgMTg0LCAyMjEsIDIxNiwgNzYsCisgICAgMTQ4LCAxNDMsIDE1NiwgMTAwLCA4LCA4OSwgMTE3LCAxNCwgMTEyLCAxODMsIDIyMSwgNTQsIDE5NywgMjA4LCAxODAsIDY5LAorICAgIDE3NiwgOTQsIDE4MCwgMTMxLCAyMTUsIDEyMSwgNzYsIDcsIDU0LCAyOCwgMjE2LCAyMzgsIDI0OSwgMTc2LCA1OCwgMTQyLAorICAgIDY0LCAyMTUsIDI0MiwgNzIsIDQ5LCAxMDQsIDg3LCAxNjEsIDMyLCA1MiwgMjE2LCAyMzAsIDQsIDE0MSwgNDQsIDE4MSwKKyAgICAyMzUsIDIyNCwgNTcsIDE5NSwgODksIDEzNCwgMjAzLCAxNDQsIDE2MiwgMTYzLCAxMjYsIDE1NiwgODQsIDE4NSwgNDIsCisgICAgMTQ4LCAxNDUsIDI5LCAyMjEsIDE5NCwgMTM0LCA1MiwgMTAwLCAxNjYsIDEwNSwgNjAsIDE0MCwgMTEwLCAyMDEsIDE4NCwKKyAgICAzNSwgMTgxLCAxNTMsIDkzLCAxMjEsIDI0MywgMjI3LCA2OCwgMTMxLCAxMzQsIDIzMiwgMiwgMzUsIDYwLCAxODcsIDc3LAorICAgIDIwOSwgNzYsIDEwNiwgMTc0LCAxNSwgMjQxLCAyMjcsIDExNSwgMTUxLCA3NywgMTc1LCAzNiwgMTg3LCAxMjEsIDIyMSwKKyAgICAyMjMsIDQ3LCAxMTgsIDYxLCAxNjgsIDEwNSwgMzIsIDIzNywgMjM2LCAxNjcsIDIxMywgMjM4LCAyMDIsIDE3LCAxNzAsCisgICAgMjQsIDIyNiwgMjQ3LCAxMzEsIDE0NSwgNiwgMTE2LCAxMTcsIDEyMSwgMTEsIDE5NCwgNDEsIDQ4LCAxMjYsIDE2MiwgMTMsCisgICAgOTMsIDIwOSwgMTMxLCAxNTQsIDEyMiwgMjM3LCAxODcsIDEwMywgMjE3LCA5OSwgNjAsIDIwMCwgNDUsIDc4LCAxMTUsIDY5LAorICAgIDQ5LCAxMDYsIDIwMCwgMTk0LCAxMTIsIDYwLCA1NiwgMjM0LCA3MiwgMjUxLCAxOSwgMTIwLCAxMjEsIDE4MiwgMTM0LCAyMTUsCisgICAgMTM1LCAxMCwgMTE0LCAyLCAyNDcsIDQ2LCAxMDUsIDIwOSwgMTQ1LCAxNjUsIDE1MywgMTkxLCAyNDMsIDEyLCA1LCAzNiwKKyAgICAxMTksIDIwNiwgMjMxLCAyMzEsIDExLCAzMiwgMjA5LCA4MywgMjcsIDIyOSwgMjA0LCAxNDksIDE1NSwgODMsIDEwOSwgMzUsCisgICAgOTMsIDIyMywgMzcsIDg0LCAxNCwgMTQyLCAzNywgMTYwLCA1MiwgMTkxLCA5NiwgNDAsIDIwNCwgMTAxLCA3NywgNjcsIDUyLAorICAgIDUzLCA0MywgNjMsIDg1LCAyNTMsIDE0NywgMTEzLCAyMjYsIDk2LCA2LCAxMjUsIDE3OSwgMTE1LCAxNjEsIDE3LCA4MywKKyAgICAxOTgsIDEwMSwgOTgsIDg1LCAxMzksIDMsIDEzNywgNzUsIDk5LCAxNzgsIDIzLCAyMDEsIDI1NSwgOTEsIDI1MywgNTIsCisgICAgMTM0LCA2MCwgMTM4LCAxMzEsIDIwOCwgMjUxLCAxMDEsIDQ4LCAyLCAyMjcsIDIyOCwgMTE4LCAxMzIsIDI0NSwgMjAyLAorICAgIDc1LCA5MSwgNDQsIDE2MCwgMjMxLCA0NywgNDEsIDUwLCAxNDcsIDIyMCwgNzQsIDkyLCAyMTksIDE2NSwgODksIDE2CisgIH07CisKKyAgLy8gRXhwZWN0ZWQgcmVzdWx0CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGV4cGVjdGVkX2RzdFtrRHN0U2l6ZV0gPSB7CisgICAgMTE3LCAxMDIsIDc0LCAxMzUsIDQyLCA5OCwgMTc1LCAyMDYsIDcwLCA3MywgMjIyLCAxOTcsIDUwLCAyNCwgMzksIDQ5LCAzOCwKKyAgICAxMDUsIDkwLCA0NywgMTY5LCA0MCwgMTcxLCAyMTUsIDIwMCwgNzMsIDEwOSwgMTQxLCA1MywgODUsIDE3NywgMTY0LCA3OSwKKyAgICAyMDgsIDEyNCwgODksIDIxMiwgMTgsIDgxLCAxNDUsIDE1MSwgMTY0LCAyMTcsIDE1MywgOTEsIDE1NCwgMTAyLCAxMDIsCisgICAgMTU5LCA3NSwgMTY0LCAxNTIsIDEzNiwgNTEsIDIxMywgMjE5LCAxODYsIDExNiwgMTkzLCAyMjQsIDE4NiwgMzYsIDIzMSwKKyAgICAyMDgsIDg0LCAyMTEsIDE1NSwgMTY3LCAzNSwgNTksIDQyLCA3NiwgMjE2LCAxNDksIDczLCAyMDEsIDc4LCAxNDksIDE4NCwKKyAgICAxMDAsIDk2LCAxOTYsIDE4OSwgMTk4LCAxODgsIDIzNSwgMTk1LCAxMTcsIDEyOSwgMTIwLCAxMjksIDQ5LCAyNSwgMTMzLAorICAgIDExMywgNjksIDIyMSwgMTE0LCA3MCwgMTQzLCA5OSwgMTU3LCAxMDgsIDE4OSwgMTQwLCA3OCwgNiwgNTUsIDY1LCAyNDAsCisgICAgMjU1LCAyNDUsIDE4NCwgNzIsIDkwLCAxMDAsIDExNiwgMTMxLCAzOSwgNjAsIDIzNCwgMTY3LCAzMywgMTYwLCA4OCwgMTg1LAorICAgIDIwMCwgMTU3LCAxNTksIDE3NiwgMTI3LCAxNTEsIDEzOCwgMTAyLCAxNjgsIDEwNiwgMTcwLCA4NiwgODIsIDIxOSwgMTg5LAorICAgIDc2LCAzMywgMTE1LCAxOTcsIDEwNiwgOTYsIDE5OCwgMTM2LCA5NywgMTQxLCAyMzcsIDE1MSwgOTgsIDEzNywgMTkxLAorICAgIDE4NSwgMiwgNTcsIDk1LCAxNDIsIDkxLCAyNTUsIDE4NSwgOTcsIDEzNywgNzYsIDE2MiwgOTQsIDE3MywgMTMxLCAxOTMsCisgICAgMTYxLCA4MSwgMTA2LCA3MiwgMTM1LCAyMjIsIDIzNCwgMTM3LCA2NiwgMTM3LCAxMDYsIDI0MywgMjEwLCAxNDcsIDk1LAorICAgIDE1LCAxMzcsIDExMCwgODUsIDY2LCAxNiwgOTYsIDE2NywgMTQ3LCAxNTAsIDE3MywgMjAzLCAxNDAsIDExOCwgMTk2LAorICAgIDg0LCAxNDcsIDE2MCwgMTksIDk1LCAxMDEsIDEyMywgNzQsIDEzMiwgMjAyLCA4MiwgMTY2LCAxMiwgMTMxLCAxNjYsCisgICAgMTg5LCAxNzAsIDE1OSwgODUsIDc5LCA2NiwgNTcsIDE1MiwgMTMyLCAyMDMsIDE5NCwgMCwgMSwgNTYsIDE0NiwgMTgwLAorICAgIDIyNCwgMTU2LCAyOCwgODMsIDE4MSwgNzksIDc2LCA4MCwgNDYsIDE2MCwgMTc1LCA1OSwgMTA2LCA0MywgODcsIDc1LAorICAgIDEzNiwgODUsIDE4OSwgNDYsIDcxLCAyMDAsIDkwCisgIH07CisKKyAgdWludDhfdCAqc3JjID0gY29uc3RfY2FzdDx1aW50OF90Kj4odGVzdF9kYXRhKTsKKworICBzaXh0YXBfcHJlZGljdF8oJnNyY1trU3JjU3RyaWRlICogMiArIDIgKyAxXSwga1NyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIDIsIDIsIGRzdF8sIGtEc3RTdHJpZGUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0XzsgKytpKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2lkdGhfOyArK2opCisgICAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfZHN0W2kgKiBrRHN0U3RyaWRlICsgal0sIGRzdF9baSAqIGtEc3RTdHJpZGUgKyBqXSkKKyAgICAgICAgICA8PCAiaT09IiA8PCAoaSAqIHdpZHRoXyArIGopOworfQorCit1c2luZyBsaWJ2cHhfdGVzdDo6QUNNUmFuZG9tOworCitURVNUX1AoU2l4dGFwUHJlZGljdFRlc3QsIFRlc3RXaXRoUmFuZG9tRGF0YSkgeworICBBQ01SYW5kb20gcm5kKEFDTVJhbmRvbTo6RGV0ZXJtaW5pc3RpY1NlZWQoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1NyY1NpemU7ICsraSkKKyAgICBzcmNfW2ldID0gcm5kLlJhbmQ4KCk7CisKKyAgLy8gUnVuIHRlc3RzIGZvciBhbGwgcG9zc2libGUgb2Zmc2V0cy4KKyAgZm9yIChpbnQgeG9mZnNldCA9IDA7IHhvZmZzZXQgPCA4OyArK3hvZmZzZXQpIHsKKyAgICBmb3IgKGludCB5b2Zmc2V0ID0gMDsgeW9mZnNldCA8IDg7ICsreW9mZnNldCkgeworICAgICAgLy8gQ2FsbCBjIHJlZmVyZW5jZSBmdW5jdGlvbi4KKyAgICAgIC8vIE1vdmUgc3RhcnQgcG9pbnQgdG8gbmV4dCBwaXhlbCB0byB0ZXN0IGlmIHRoZSBmdW5jdGlvbiByZWFkcworICAgICAgLy8gdW5hbGlnbmVkIGRhdGEgY29ycmVjdGx5LgorICAgICAgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYygmc3JjX1trU3JjU3RyaWRlICogMiArIDIgKyAxXSwga1NyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwgZHN0X2NfLCBrRHN0U3RyaWRlKTsKKworICAgICAgLy8gUnVuIHRlc3QuCisgICAgICBzaXh0YXBfcHJlZGljdF8oJnNyY19ba1NyY1N0cmlkZSAqIDIgKyAyICsgMV0sIGtTcmNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwgZHN0Xywga0RzdFN0cmlkZSk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0XzsgKytpKQorICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdpZHRoXzsgKytqKQorICAgICAgICAgIEFTU0VSVF9FUShkc3RfY19baSAqIGtEc3RTdHJpZGUgKyBqXSwgZHN0X1tpICoga0RzdFN0cmlkZSArIGpdKQorICAgICAgICAgICAgICA8PCAiaT09IiA8PCAoaSAqIHdpZHRoXyArIGopOworICAgIH0KKyAgfQorfQorCit1c2luZyBzdGQ6OnRyMTo6bWFrZV90dXBsZTsKKworY29uc3Qgc2l4dGFwX3ByZWRpY3RfZm5fdCBzaXh0YXBfMTZ4MTZfYyA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2M7Citjb25zdCBzaXh0YXBfcHJlZGljdF9mbl90IHNpeHRhcF84eDhfYyA9IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9jOworY29uc3Qgc2l4dGFwX3ByZWRpY3RfZm5fdCBzaXh0YXBfOHg0X2MgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYzsKK2NvbnN0IHNpeHRhcF9wcmVkaWN0X2ZuX3Qgc2l4dGFwXzR4NF9jID0gdnA4X3NpeHRhcF9wcmVkaWN0NHg0X2M7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBDLCBTaXh0YXBQcmVkaWN0VGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIG1ha2VfdHVwbGUoMTYsIDE2LCBzaXh0YXBfMTZ4MTZfYyksCisgICAgICAgIG1ha2VfdHVwbGUoOCwgOCwgc2l4dGFwXzh4OF9jKSwKKyAgICAgICAgbWFrZV90dXBsZSg4LCA0LCBzaXh0YXBfOHg0X2MpLAorICAgICAgICBtYWtlX3R1cGxlKDQsIDQsIHNpeHRhcF80eDRfYykpKTsKKyNpZiBIQVZFX01NWAorY29uc3Qgc2l4dGFwX3ByZWRpY3RfZm5fdCBzaXh0YXBfMTZ4MTZfbW14ID0gdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfbW14OworY29uc3Qgc2l4dGFwX3ByZWRpY3RfZm5fdCBzaXh0YXBfOHg4X21teCA9IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9tbXg7Citjb25zdCBzaXh0YXBfcHJlZGljdF9mbl90IHNpeHRhcF84eDRfbW14ID0gdnA4X3NpeHRhcF9wcmVkaWN0OHg0X21teDsKK2NvbnN0IHNpeHRhcF9wcmVkaWN0X2ZuX3Qgc2l4dGFwXzR4NF9tbXggPSB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfbW14OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgTU1YLCBTaXh0YXBQcmVkaWN0VGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIG1ha2VfdHVwbGUoMTYsIDE2LCBzaXh0YXBfMTZ4MTZfbW14KSwKKyAgICAgICAgbWFrZV90dXBsZSg4LCA4LCBzaXh0YXBfOHg4X21teCksCisgICAgICAgIG1ha2VfdHVwbGUoOCwgNCwgc2l4dGFwXzh4NF9tbXgpLAorICAgICAgICBtYWtlX3R1cGxlKDQsIDQsIHNpeHRhcF80eDRfbW14KSkpOworI2VuZGlmCisjaWYgSEFWRV9TU0UyCitjb25zdCBzaXh0YXBfcHJlZGljdF9mbl90IHNpeHRhcF8xNngxNl9zc2UyID0gdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NlMjsKK2NvbnN0IHNpeHRhcF9wcmVkaWN0X2ZuX3Qgc2l4dGFwXzh4OF9zc2UyID0gdnA4X3NpeHRhcF9wcmVkaWN0OHg4X3NzZTI7Citjb25zdCBzaXh0YXBfcHJlZGljdF9mbl90IHNpeHRhcF84eDRfc3NlMiA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9zc2UyOworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgU1NFMiwgU2l4dGFwUHJlZGljdFRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICBtYWtlX3R1cGxlKDE2LCAxNiwgc2l4dGFwXzE2eDE2X3NzZTIpLAorICAgICAgICBtYWtlX3R1cGxlKDgsIDgsIHNpeHRhcF84eDhfc3NlMiksCisgICAgICAgIG1ha2VfdHVwbGUoOCwgNCwgc2l4dGFwXzh4NF9zc2UyKSkpOworI2VuZGlmCisjaWYgSEFWRV9TU1NFMworY29uc3Qgc2l4dGFwX3ByZWRpY3RfZm5fdCBzaXh0YXBfMTZ4MTZfc3NzZTMgPSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9zc3NlMzsKK2NvbnN0IHNpeHRhcF9wcmVkaWN0X2ZuX3Qgc2l4dGFwXzh4OF9zc3NlMyA9IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9zc3NlMzsKK2NvbnN0IHNpeHRhcF9wcmVkaWN0X2ZuX3Qgc2l4dGFwXzh4NF9zc3NlMyA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9zc3NlMzsKK2NvbnN0IHNpeHRhcF9wcmVkaWN0X2ZuX3Qgc2l4dGFwXzR4NF9zc3NlMyA9IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9zc3NlMzsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgIFNTU0UzLCBTaXh0YXBQcmVkaWN0VGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIG1ha2VfdHVwbGUoMTYsIDE2LCBzaXh0YXBfMTZ4MTZfc3NzZTMpLAorICAgICAgICBtYWtlX3R1cGxlKDgsIDgsIHNpeHRhcF84eDhfc3NzZTMpLAorICAgICAgICBtYWtlX3R1cGxlKDgsIDQsIHNpeHRhcF84eDRfc3NzZTMpLAorICAgICAgICBtYWtlX3R1cGxlKDQsIDQsIHNpeHRhcF80eDRfc3NzZTMpKSk7CisjZW5kaWYKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3Qvc3VidHJhY3RfdGVzdC5jYyBiL2xpYnZweC90ZXN0L3N1YnRyYWN0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L3N1YnRyYWN0X3Rlc3QuY2MKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0L2FjbV9yYW5kb20uaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCisjaW5jbHVkZSAidnA4L2VuY29kZXIvYmxvY2suaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKK30KKwordHlwZWRlZiB2b2lkICgqc3VidHJhY3RfYl9mbl90KShCTE9DSyAqYmUsIEJMT0NLRCAqYmQsIGludCBwaXRjaCk7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFN1YnRyYWN0QmxvY2tUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdWJ0cmFjdF9iX2ZuX3Q+IHt9OworCit1c2luZyBsaWJ2cHhfdGVzdDo6QUNNUmFuZG9tOworCitURVNUX1AoU3VidHJhY3RCbG9ja1Rlc3QsIFNpbXBsZVN1YnRyYWN0KSB7CisgIEFDTVJhbmRvbSBybmQoQUNNUmFuZG9tOjpEZXRlcm1pbmlzdGljU2VlZCgpKTsKKyAgQkxPQ0sgYmU7CisgIEJMT0NLRCBiZDsKKyAgLy8gaW4gbGlidnB4LCB0aGlzIHN0cmlkZSBpcyBhbHdheXMgMTYKKyAgY29uc3QgaW50IGtEaWZmUHJlZFN0cmlkZSA9IDE2OworICBjb25zdCBpbnQga1NyY1N0cmlkZVtdID0gezMyLCAxNiwgOCwgNCwgMH07CisgIGNvbnN0IGludCBrQmxvY2tXaWR0aCA9IDQ7CisgIGNvbnN0IGludCBrQmxvY2tIZWlnaHQgPSA0OworCisgIC8vIEFsbG9jYXRlLi4uIGFsaWduIHRvIDE2IGZvciBtbXgvc3NlIHRlc3RzCisgIHVpbnQ4X3QgKnNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KAorICAgICAgdnB4X21lbWFsaWduKDE2LCBrQmxvY2tIZWlnaHQgKiBrU3JjU3RyaWRlWzBdICogc2l6ZW9mKCpzb3VyY2UpKSk7CisgIGJlLnNyY19kaWZmID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oCisgICAgICB2cHhfbWVtYWxpZ24oMTYsIGtCbG9ja0hlaWdodCAqIGtEaWZmUHJlZFN0cmlkZSAqIHNpemVvZigqYmUuc3JjX2RpZmYpKSk7CisgIGJkLnByZWRpY3RvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KAorICAgICAgdnB4X21lbWFsaWduKDE2LCBrQmxvY2tIZWlnaHQgKiBrRGlmZlByZWRTdHJpZGUgKiBzaXplb2YoKmJkLnByZWRpY3RvcikpKTsKKworICBmb3IoaW50IGkgPSAwOyBrU3JjU3RyaWRlW2ldID4gMDsgKytpKSB7CisgICAgLy8gc3RhcnQgYXQgYmxvY2swCisgICAgYmUuc3JjID0gMDsKKyAgICBiZS5iYXNlX3NyYyA9ICZzb3VyY2U7CisgICAgYmUuc3JjX3N0cmlkZSA9IGtTcmNTdHJpZGVbaV07CisKKyAgICAvLyBzZXQgZGlmZmVyZW5jZQorICAgIGludDE2X3QgKnNyY19kaWZmID0gYmUuc3JjX2RpZmY7CisgICAgZm9yIChpbnQgciA9IDA7IHIgPCBrQmxvY2tIZWlnaHQ7ICsrcikgeworICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBrQmxvY2tXaWR0aDsgKytjKSB7CisgICAgICAgIHNyY19kaWZmW2NdID0gMHhhNWE1OworICAgICAgfQorICAgICAgc3JjX2RpZmYgKz0ga0RpZmZQcmVkU3RyaWRlOworICAgIH0KKworICAgIC8vIHNldCBkZXN0aW5hdGlvbgorICAgIHVpbnQ4X3QgKmJhc2Vfc3JjID0gKmJlLmJhc2Vfc3JjOworICAgIGZvciAoaW50IHIgPSAwOyByIDwga0Jsb2NrSGVpZ2h0OyArK3IpIHsKKyAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga0Jsb2NrV2lkdGg7ICsrYykgeworICAgICAgICBiYXNlX3NyY1tjXSA9IHJuZC5SYW5kOCgpOworICAgICAgfQorICAgICAgYmFzZV9zcmMgKz0gYmUuc3JjX3N0cmlkZTsKKyAgICB9CisKKyAgICAvLyBzZXQgcHJlZGljdG9yCisgICAgdWludDhfdCAqcHJlZGljdG9yID0gYmQucHJlZGljdG9yOworICAgIGZvciAoaW50IHIgPSAwOyByIDwga0Jsb2NrSGVpZ2h0OyArK3IpIHsKKyAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga0Jsb2NrV2lkdGg7ICsrYykgeworICAgICAgICBwcmVkaWN0b3JbY10gPSBybmQuUmFuZDgoKTsKKyAgICAgIH0KKyAgICAgIHByZWRpY3RvciArPSBrRGlmZlByZWRTdHJpZGU7CisgICAgfQorCisgICAgR2V0UGFyYW0oKSgmYmUsICZiZCwga0RpZmZQcmVkU3RyaWRlKTsKKworICAgIGJhc2Vfc3JjID0gKmJlLmJhc2Vfc3JjOworICAgIHNyY19kaWZmID0gYmUuc3JjX2RpZmY7CisgICAgcHJlZGljdG9yID0gYmQucHJlZGljdG9yOworICAgIGZvciAoaW50IHIgPSAwOyByIDwga0Jsb2NrSGVpZ2h0OyArK3IpIHsKKyAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga0Jsb2NrV2lkdGg7ICsrYykgeworICAgICAgICBFWFBFQ1RfRVEoYmFzZV9zcmNbY10sIChzcmNfZGlmZltjXSArIHByZWRpY3RvcltjXSkpIDw8ICJyID0gIiA8PCByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYyA9ICIgPDwgYzsKKyAgICAgIH0KKyAgICAgIHNyY19kaWZmICs9IGtEaWZmUHJlZFN0cmlkZTsKKyAgICAgIHByZWRpY3RvciArPSBrRGlmZlByZWRTdHJpZGU7CisgICAgICBiYXNlX3NyYyArPSBiZS5zcmNfc3RyaWRlOworICAgIH0KKyAgfQorICB2cHhfZnJlZShiZS5zcmNfZGlmZik7CisgIHZweF9mcmVlKHNvdXJjZSk7CisgIHZweF9mcmVlKGJkLnByZWRpY3Rvcik7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEMsIFN1YnRyYWN0QmxvY2tUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXModnA4X3N1YnRyYWN0X2JfYykpOworCisjaWYgSEFWRV9NTVgKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1NWCwgU3VidHJhY3RCbG9ja1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyh2cDhfc3VidHJhY3RfYl9tbXgpKTsKKyNlbmRpZgorCisjaWYgSEFWRV9TU0UyCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTU0UyLCBTdWJ0cmFjdEJsb2NrVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHZwOF9zdWJ0cmFjdF9iX3NzZTIpKTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L3Rlc3QtZGF0YS5zaGExIGIvbGlidnB4L3Rlc3QvdGVzdC1kYXRhLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNmE4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L3Rlc3QtZGF0YS5zaGExCkBAIC0wLDAgKzEsMTIzIEBACitkNWRmYjAxNTFjOTA1MWY4Yzg1OTk5MjU1NjQ1ZDdhMjM5MTZkM2MwICBoYW50cm9fY29sbGFnZV93MzUyaDI4OC55dXYKKzUxODRjNDZkZGNhOGIxZmFkZDE2NzQyZTg1MDAxMTViYzhmNzQ5ZGEgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDEuaXZmCis2NWJmMWJiYmNlZDgxYjk3YmQwMzBmMzc2ZDFiN2Y2MWEyMjQ3OTNmICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAyLml2ZgorOTA2YjRjMWU5OWViNzM0NTA0YzUwNGIzZjFhZDgwNTIxMzdjZTY3MiAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwMy5pdmYKK2VjMTQ0YjFhZjUzYWY4OTVkYjc4MzU1Nzg1NjUwYjk2ZGQzZjBhZGUgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDQuaXZmCithZmM3MDkxNzg1YzYyZjFjMTIxYzQ1NTRhMjgzMGMzMDcwNDU4N2Q5ICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA1Lml2ZgorNDJlYTlkNTVjODE4MTQ1ZDA2YTliNjMzYjhlODVjNmE2MTY0ZmQzZSAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwNi5pdmYKK2U1YjNhNzNhYjc5ZmUwMjRjMTQzMDlkNjUzZDZiZWQ5MjkwMmVlM2IgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDcuaXZmCitmM2M1MGE1ODg3NTkzMGFkZmI4NDUyNWMwZWY1OWQ3ZTRjMDg1NDBjICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA4Lml2ZgorNGIyODQxZmRiODNkYjUxYWUzMjIwOTZhZTQ2OGJiYjlkYzJjODM2MiAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwOS5pdmYKK2VmYmZmNzM2ZTNhOTFhYjZhOThjNWJjMmRjZTY1ZDY0NTk0NGM3YjEgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTAuaXZmCis2YjMxNTEwMmNhZTAwOGQyMmEzZDJjMjMxYmU5MmNiNzA0YTIyMmY4ICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDExLml2ZgorZjMyMTRhNGZlYTE0YzJkNWVjNjg5OTM2YzE2MTNmMjc0Yzg1OWVlOCAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxMi5pdmYKK2U0MDk0ZTk2ZDMwOGM4YTM1Yjc0YzQ4MGE0M2Q4NTNjNTI5NGNkMzQgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTMuaXZmCis1YjBhZGZhZjYwYTY5ZTBhYWYzZWMwMjFhMzlkMGE2OGZjMGUxYjVhICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE0Lml2ZgorZTg0Njc2ODhkZGYyNmI1MDAwNjY0ZjkwNGZhZjBkNzA1MDZhYTY1MyAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxNS5pdmYKK2FhYjU1NTgyMzM3ZGZkMmEzOWZmNTRmYjI1NzZhOTE5MTBkNDkzMzcgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTYuaXZmCisxYmEyNDcyNGY4MDIwM2M5YmFlNGYxZDBmOTlkNTM0NzIxOTgwMDE2ICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE3Lml2ZgorMTQzYTE1NTEyYjQ2ZjQzNjI4MGRkYjRkMGU2NDExZWI0YWY0MzRmMiAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxOC5pdmYKK2M1YmFlYWY1NzE0ZmRmYjNhOGJjOTYwYThlMzNhYzQzOGU4M2IxNmIgIHZwODAtMDEtaW50cmEtMTQwMC5pdmYKK2YzODM5NTUyMjlhZmUzNDA4NDUzZTMxNmQxMTU1M2Q5MjNjYTYwZDUgIHZwODAtMDEtaW50cmEtMTQxMS5pdmYKKzg0ZTFmNDM0M2YxNzRjOWYzYzgzZjgzNGJhYzMxOTZmYjMyNWJmMmMgIHZwODAtMDEtaW50cmEtMTQxNi5pdmYKK2ZiNmU3MTJhNDdkZDU3YTI4YTM3MjdkMmFlMmM5N2E4YjdjN2NhNTEgIHZwODAtMDEtaW50cmEtMTQxNy5pdmYKKzcxZWE3NzJkM2U5ZDMxNWI4Y2JlY2Y0MTIwN2I4YTIzN2MzNDg1M2IgIHZwODAtMDItaW50ZXItMTQwMi5pdmYKK2Q4NWRiYzQyNzE1MjVkY2QxMjhjNTAzZjkzNmZlNjkwOTFkMWY4ZDAgIHZwODAtMDItaW50ZXItMTQxMi5pdmYKK2Q0ZTVkM2FkNTY1MTE4NjdkMDI1ZjkzNzI0ZDA5MGY5MmJhNmVjM2QgIHZwODAtMDItaW50ZXItMTQxOC5pdmYKKzkxNzkxY2JjYzM3YzYwZjM1ZGJkODA5MGJhY2I1NGU1ZWM2ZGQ0ZmEgIHZwODAtMDItaW50ZXItMTQyNC5pdmYKKzE3ZmJmZTJmZWE3MGY2ZTJmM2ZhNmNhNGVmYWFlNmMwYjAzYjVmMDIgIHZwODAtMDMtc2VnbWVudGF0aW9uLTAxLml2ZgorM2MzNjAwZGJiY2RlMDhlMjBkNTRjNjZmZTNiN2VhZGQ0ZjA5YmRiYiAgdnA4MC0wMy1zZWdtZW50YXRpb24tMDIuaXZmCitjMTU2Nzc4ZDUzNDA5NjdkNGIzNjljNDkwODQ4MDc2ZTkyZjFmODc1ICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0wMy5pdmYKK2QyNWRjZmY2YzYwZTg3YTFhZjcwOTQ1Yjg5MTFiNmI0OTk4NTMzYjAgIHZwODAtMDMtc2VnbWVudGF0aW9uLTA0Lml2ZgorMzYyYmFiYTJjZTQ1NGM5ZGIyMTIxOGYzNWU4MWMyN2E1ZWQwYjczMCAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwMS5pdmYKK2QyMjNhZTdlZTc0OGNlMDdlNzRjNDY3OWJmZDIxOWU4NGFhOWY0YjAgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDMuaXZmCiswMzNhZGY3ZjNhMTM4MzZhM2YxY2ZmY2I4N2MxOTcyOTAwZjJiNWM2ICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDA3Lml2ZgorNGQ1MWRmYmY5ZjNlMmM1OTBlYzk5ZDFkNmY1OWRkNzMxZDA0Mzc1ZiAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwOC5pdmYKK2YzN2E2MmIxOTdjMjYwMGQ3NWUwY2NmYmIzMWI2MGVmZGVkYWMyNTEgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDkuaXZmCitlYjI1YmQ3YmZiYTViMmY2OTM1MDE4YTkzMGY0MmQxMjNiMWU3ZmNkICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDEwLml2ZgorYjlkNWM0MzY2NjNhMzBjMjdjZmZmODRiNTNhMDAyZTUwMTI1ODg0MyAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQxMy5pdmYKKzZkYTkyYjlkMWExODBjYzNhOGFmZTM0OGFiMTIyNThmNWEzN2JlMWEgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTQuaXZmCithNGY1ODQyNjAyODg2YmQ2NjlmMTE1ZjkzZDhhMzVjMDM1Y2IwOTQ4ICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDE1Lml2ZgorZjI5NWRjZWI4ZWYyNzhiNzcyNTFiM2Y5ZGY4YWVlMjJlMTYxZDU0NyAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQyNS5pdmYKKzE5OGRiZjlmMzZmNzMzMjAwZTQzMjY2NGNjOGM1NzUyZDU5Nzc5ZGUgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjYuaXZmCis3NzA0ODA0ZTMyZjVkZTk3NjgwMzkyOTkzNGE3ZmFmZTEwMWFjN2IwICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDI3Lml2ZgorODMxY2NkODYyZWE5NWNhMDI1ZDJmM2JkOGI4ODY3ODc1MmY1NDE2ZCAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQzMi5pdmYKK2IzYzExOTc4NTI5Mjg5ZjkxMDlmMjc2NmZjYWJhM2ViYzQwZTExZWYgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzUuaXZmCithODM1YTczMWY1NTIwZWJmYzEwMDJjNDAxMjEyNjRkMDAyMDU1OWFjICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDM2Lml2ZgorMWQxNzMyOTQyZjc3M2JiMmE1Nzc1ZmNiOTY4OWIxNTc5Y2UyOGVhYiAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQzNy5pdmYKK2RiMDQ3OTlhZGZlMDg5ZGZkZjc0ZGJkNDNjYzA1ZWRlNzE2MWY5OWUgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0NDEuaXZmCis3Y2FmMzliM2YyMGNmZDUyYjk5ODIxMDg3ODA2MmU1MmE1ZWRmMWU2ICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDQyLml2ZgorMzYwN2Y2YmI0ZWUxMDZjMzhmYTFlYTM3MGRjNGZmOGI4Y2RlMjI2MSAgdnA4MC0wNC1wYXJ0aXRpb25zLTE0MDQuaXZmCis5M2NjMzIzYjZiNjg2N2YxYjEyZGQ0ODc3MzQyNDU0OWM2OTYwYTZiICB2cDgwLTA0LXBhcnRpdGlvbnMtMTQwNS5pdmYKKzA0N2VlZGIxNGI4NjViZGFjOGEzNTM4ZTYzODAxMDU0ZTAyOTVlOWMgIHZwODAtMDQtcGFydGl0aW9ucy0xNDA2Lml2ZgorMGYxMjMzYmQyYmMzM2Y1NmNlNWU0OTVkYmQ0NTVkMTIyMzM5ZjM4NCAgdnA4MC0wNS1zaGFycG5lc3MtMTQyOC5pdmYKKzUxNzY3ZmMxMzY0ODhhOTUzNWMyYTRjMzgwNjdjNTQyZWUyMDQ4ZGYgIHZwODAtMDUtc2hhcnBuZXNzLTE0MjkuaXZmCis5ODA1YWExMDc2NzJkZTI1ZDZmYjhjMzVlMjBkMDZkZWNhNWVmZTE4ICB2cDgwLTA1LXNoYXJwbmVzcy0xNDMwLml2ZgorNjFkYjZiOTY1ZjljMjdhZWJlNzFiODViZjJkNTg3N2U1OGU0YmJkZiAgdnA4MC0wNS1zaGFycG5lc3MtMTQzMS5pdmYKKzEwNDIwZDI2NjI5MGQyOTIzNTU1Zjg0YWYzOGVlYjk2ZWRiZDNhZTggIHZwODAtMDUtc2hhcnBuZXNzLTE0MzMuaXZmCiszZWQyNGY5YTgwY2RkZmRmNzU4MjRiYTk1Y2RiNGZmOTI4NmNiNDQzICB2cDgwLTA1LXNoYXJwbmVzcy0xNDM0Lml2ZgorYzg3NTk5Y2JlY2Q3MmQ0Y2Q0ZjdhY2UzMzEzYjdhNmJjNmViODE2MyAgdnA4MC0wNS1zaGFycG5lc3MtMTQzOC5pdmYKK2FmZjUxZDg2NWMyNjIxYjYwNTEwNDU5MjQ0ZWE4M2U5NThlNGJhZWQgIHZwODAtMDUtc2hhcnBuZXNzLTE0MzkuaXZmCitkYTM4NmU3MmIxOWI1NDg1YTZhZjE5OWM1ZWI2MGVmMjVlNTEwZGQxICB2cDgwLTA1LXNoYXJwbmVzcy0xNDQwLml2ZgorNjc1OWEwOTUyMDNkOTZjY2QyNjdjZTA5YjFiMDUwYjhjYzRjMmYxZiAgdnA4MC0wNS1zaGFycG5lc3MtMTQ0My5pdmYKK2RiNTVlYzdmZDAyYzg2NGJhOTk2ZmYwNjBiMjViMWUwODYxMTMzMGIgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDEuaXZmLm1kNQorMjlkYjBhZDAxMWNiYTFlNDVmODU2ZDU2MjNjZDM4ZGFjM2UzYmYxOSAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwMi5pdmYubWQ1CitlODRmMjU4ZjY5ZTE3M2U3ZDY4ZjhmOGMwMzdhMGEzNzY2OTAyMTgyICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAzLml2Zi5tZDUKK2ViNzkxMmVhZjY5NTU5YTE2ZmQ4MmJjM2Y1ZmIxNTI0Y2Y0YTQ0NjYgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDQuaXZmLm1kNQorNDIwNmY3MWM5NDg5NGJkNWI1YjM3NmY2YzA5YjM4MTdkYmM2NTIwNiAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwNS5pdmYubWQ1Cis0Zjg5YjM1NmY2ZjJmZWNiOTI4ZjMzMGExMGY4MDRmMDBmNTMyNWY1ICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA2Lml2Zi5tZDUKKzI4MTMyMzZhMzI5NjRkZDgwMDdlMTc2NDhiY2YwMzVhMjBmY2RhNmMgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDcuaXZmLm1kNQorMTA3NDZjNzIwOThmODcyODAzYzkwMGUxN2M1NjgwZTQ1MWY1ZjQ5OCAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwOC5pdmYubWQ1CiszOWEyM2QwNjkyY2U2NDQyMWE3YmI3Y2RmNmNjZWM1OTI4ZDM3ZmZmICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA5Lml2Zi5tZDUKK2Y2ZTNkZTg5MzFhMGNjNjU5YmRhOGZiYzE0MDUwMzQ2OTU1ZTcyZDQgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTAuaXZmLm1kNQorMTAxNjgzZWMxOTViNmU5NDRmN2NkMWU0NjhmYzg5MjE0MzkzNjNlNiAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxMS5pdmYubWQ1CisxZjU5Mjc1MWNlNDZkODY4ODk5OGZhMGZhNGZiZGNkYTBmZDQwNThjICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDEyLml2Zi5tZDUKKzYwNjYxNzZmOTBjYTc5MDI1MWU3OTVmY2ExYTU3OTdkNTk5OTk4NDEgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTMuaXZmLm1kNQorMjY1NmRhOTRiYTkzNjkxZjIzZWRjNGQ2MGIzYTA5ZTJiZTQ2YzIxNyAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxNC5pdmYubWQ1CitjNmUwZDVmNWQ2MTQ2MGM4YWM4ZWRmYTRlNzAxZjEwMzEyYzAzMTMzICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE1Lml2Zi5tZDUKK2VlNjBmZWU1MDFkODQ5M2UzNGU4ZDZhMWZlMzE1YjUxZWQwOWIyNGEgIHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTYuaXZmLm1kNQorOWYxOTE0Y2VmZmNhZDQ1NDZjMGEyOWRlM2VmNTkxZDhiZWEzMDRkYyAgdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxNy5pdmYubWQ1CitlMDMwNTE3OGZlMjg4YTlmZDgwODJiMzllMmQwMzE4MWVkYjE5MDU0ICB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE4Lml2Zi5tZDUKKzYxMjQ5NGRhMmZhNzk5Y2M5ZDc2ZGNkZDgzNWFlNmM3Y2IyZTVjMDUgIHZwODAtMDEtaW50cmEtMTQwMC5pdmYubWQ1Cis0OGVhMDYwOTdhYzgyNjljNWU4YzIxMzFkM2QwNjM5ZjQzMWZjZjBlICB2cDgwLTAxLWludHJhLTE0MTEuaXZmLm1kNQorNmUyYWI0ZTc2NzdhZDBiYTg2ODA4M2NhNmJjMzg3ZWU5MjJiNDAwYyAgdnA4MC0wMS1pbnRyYS0xNDE2Lml2Zi5tZDUKK2VjYTBhOTAzNDg5NTljZTM4NTQxNDJmOGQ4NjQxYjEzMDUwZTgzNDkgIHZwODAtMDEtaW50cmEtMTQxNy5pdmYubWQ1Cis5MjBmZWVhMjAzMTQ1ZDVjMjI1OGE5MWM0ZTY5OTE5MzRhNzlhOTllICB2cDgwLTAyLWludGVyLTE0MDIuaXZmLm1kNQorZjcxZDk3OTA5ZmUyYjNkZDY1YmU3ZTFmNTZjNzIyMzdmMGNlZjIwMCAgdnA4MC0wMi1pbnRlci0xNDEyLml2Zi5tZDUKK2U5MTEyNTQ1NjlhMzBiYmIyYTIzN2ZmOGI3OWY2OWVkOWRhMDY3MmQgIHZwODAtMDItaW50ZXItMTQxOC5pdmYubWQ1Cis1OGM3ODljNTBjOWJiOWNjOTA1ODBiZWQyOTExNjRhMDkzOWQyOGJhICB2cDgwLTAyLWludGVyLTE0MjQuaXZmLm1kNQorZmYzZTJmNDQxMzI3YjljMjBhMGIzN2M1MjRlMGY1YTQ4YTM2ZGU3YiAgdnA4MC0wMy1zZWdtZW50YXRpb24tMDEuaXZmLm1kNQorMDc5MWY0MTdmMDc2YTU0MmFlNjZmYmMzNDI2YWI0ZDk0Y2JkNmM3NSAgdnA4MC0wMy1zZWdtZW50YXRpb24tMDIuaXZmLm1kNQorNzIyZTUwZjFhNmE5MWMzNDMwMmQ2ODY4MWZhZmZjMWMyNmQxY2M1NyAgdnA4MC0wMy1zZWdtZW50YXRpb24tMDMuaXZmLm1kNQorYzcwMWYxODg1YmNmYjI3ZmI4ZTcwY2M2NTYwNmIyODkxNzJlZjg4OSAgdnA4MC0wMy1zZWdtZW50YXRpb24tMDQuaXZmLm1kNQorZjc5YmM5ZWMxODlhMmI0ODA3NjMyYTNkMGM1YmYwNGExNzhiNTMwMCAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwMS5pdmYubWQ1CitiOWFhNGM3NGMwMjE5YjYzOTgxMWM0NDc2MGQwYjI0Y2Q4YmI0MzZhICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDAzLml2Zi5tZDUKKzcwZDVhMjIwN2NhMTg5MWJjYWViZDVjZjZkZDg4Y2U4ZDU3YjQzMzQgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDcuaXZmLm1kNQorMjY1Zjk2MmVlNzgxNTMxZjlhOTNiOTMwOTQ2MTMxNmZkMzJiMmExZCAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwOC5pdmYubWQ1CiswYzRlY2JiZDZkYzA0MmQzMGU2MjZkOTUxYjY1ZjQ2MGRkNmNkNTYzICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDA5Lml2Zi5tZDUKK2NmNzc5YWYzNmE5MzdmMDY1NzBhMGZjYTlkYjY0YmExMzM0NTFkZWUgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTAuaXZmLm1kNQorMGU2YzUwMzZkNTFhYjA3ODg0MmYxMzM5MzQ5MjZjNTk4YTljZmYwMiAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQxMy5pdmYubWQ1CitlYjM5MzBhYWYyMjkxMTZjODBkNTA3NTE2YzM0NzU5YzNmNmNkZjY5ICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDE0Lml2Zi5tZDUKKzEyM2Q2YzBmNzJlZTg3OTExYzRhZTc1MzhlODdiN2QxNjNiMjJkNmMgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTUuaXZmLm1kNQorZTcwNTUxZDFhMzg5MjBlMDk3YTVkODc4MjM5MGI3OWVjYWViNzUwNSAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQyNS5pdmYubWQ1Cis0NGU4ZjQxMTdlNDZkYmIzMDJiMmNmZDgxMTcxY2MxYTE4NDZlNDMxICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDI2Lml2Zi5tZDUKKzUyNjM2ZTU0YWVlNWY5NWJiYWNlMzcwMjFiZDY3ZGU1ZGI3NjdlOWEgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjcuaXZmLm1kNQorYjFhZDNlZmYyMDIxNWMyOGUyOTViMTVlZjM2MzZlZDkyNmQ1OWNiYSAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQzMi5pdmYubWQ1CisyNGMyMmE1NTJmYTI4YTkwZTU5NzhmNjdmNTcxODFjYzJkNzU0NmQ3ICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDM1Lml2Zi5tZDUKKzk2YzQ5YzM5MGFiZmNlZDE4YTdhOGM5YjllYTEwYWY3NzhlMTBlZGIgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzYuaXZmLm1kNQorZjk1ZWI2MjE0NTcxNDM0ZjFmNzNhYjc4MzNiOWNjZGY0NzU4ODAyMCAgdnA4MC0wMy1zZWdtZW50YXRpb24tMTQzNy5pdmYubWQ1CisxYzA3MDBjYTI3YzliMDA5MGE3NzQ3YTRiMGI0ZGMyMWQxODQzMTgxICB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDQxLml2Zi5tZDUKKzgxZDRmMjNjYTMyNjY3ZWU5NThiYWU1NzljOGY1ZTk3YmE3MmViOTcgIHZwODAtMDMtc2VnbWVudGF0aW9uLTE0NDIuaXZmLm1kNQorMjcyZWZjZWYwN2EzYTMwZmJjYTUxYmZkNTY2MDYzZDgyNThlYzBiZSAgdnA4MC0wNC1wYXJ0aXRpb25zLTE0MDQuaXZmLm1kNQorNjZlZDIxOWFiODEyYWM4MDFiMjU2ZDM1Y2Y0OTVkMTkzZDRjZjQ3OCAgdnA4MC0wNC1wYXJ0aXRpb25zLTE0MDUuaXZmLm1kNQorMzYwODNmMzdmNTZmNTAyYmQ2MGVjNWUwNzUwMmVlOWU2Yjg2OTliMCAgdnA4MC0wNC1wYXJ0aXRpb25zLTE0MDYuaXZmLm1kNQorNmNhOTA5YmYxNjhhNjRjMDk0MTU2MjYyOTQ2NjVkYzFiZTNkMTk3MyAgdnA4MC0wNS1zaGFycG5lc3MtMTQyOC5pdmYubWQ1CisxNjY3ZDJlZTIzMzRlNWZkZWE4YThhODY2ZjRjY2YzY2Y3NmYwMzNhICB2cDgwLTA1LXNoYXJwbmVzcy0xNDI5Lml2Zi5tZDUKKzcxYmNiZTUzNTdkMzZhMTlkZjViMDdmYmUzZTI3YmZmYTg4OTNmMGEgIHZwODAtMDUtc2hhcnBuZXNzLTE0MzAuaXZmLm1kNQorODlhMDliMWRmZmNlMmQ1NTc3MGE4OWU1OGQ5OTI1YzcwZWY3OWJmOCAgdnA4MC0wNS1zaGFycG5lc3MtMTQzMS5pdmYubWQ1CiswODQ0NGExOGI0ZTZiYTM0NTBjMDc5NmRkNzI4ZDQ4YzM5OWEyZGM5ICB2cDgwLTA1LXNoYXJwbmVzcy0xNDMzLml2Zi5tZDUKKzZkNjIyMzcxOWE5MGMxM2U4NDhhYTJhOGE2NjQyMDk4Y2RiNTk3N2EgIHZwODAtMDUtc2hhcnBuZXNzLTE0MzQuaXZmLm1kNQorNDFkNzBiYjVmYTQ1YmM4OGRhMTYwNGEwYWY0NjY5MzBiOGRkNzdiNSAgdnA4MC0wNS1zaGFycG5lc3MtMTQzOC5pdmYubWQ1CiswODZjNTYzNzhkZjgxYjZjZWUyNjRkNzU0MGE3YjhmMmI0MDVjN2E0ICB2cDgwLTA1LXNoYXJwbmVzcy0xNDM5Lml2Zi5tZDUKK2QzMmRjMmM0MTY1ZWIyNjZlYTRjMjNjMTRhNDU0NTliMzYzZGVmMzIgIHZwODAtMDUtc2hhcnBuZXNzLTE0NDAuaXZmLm1kNQorOGM2OWRjM2Q4ZTU2M2Y1NmZmYWI1YWQxZTQwMGQ5ZTY4OWRkMjNkZiAgdnA4MC0wNS1zaGFycG5lc3MtMTQ0My5pdmYubWQ1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rlc3QvdGVzdC5tayBiL2xpYnZweC90ZXN0L3Rlc3QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L3Rlc3QubWsKQEAgLTAsMCArMSwxNzggQEAKK0xJQlZQWF9URVNUX1NSQ1MteWVzICs9IGFjbV9yYW5kb20uaAorTElCVlBYX1RFU1RfU1JDUy15ZXMgKz0gdGVzdC5taworTElCVlBYX1RFU1RfU1JDUy15ZXMgKz0gdGVzdF9saWJ2cHguY2MKK0xJQlZQWF9URVNUX1NSQ1MteWVzICs9IHV0aWwuaAorTElCVlBYX1RFU1RfU1JDUy15ZXMgKz0gdmlkZW9fc291cmNlLmgKKworIyMKKyMjIEJMQUNLIEJPWCBURVNUUworIyMKKyMjIEJsYWNrIGJveCB0ZXN0cyBvbmx5IHVzZSB0aGUgcHVibGljIEFQSS4KKyMjCitMSUJWUFhfVEVTVF9TUkNTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSBhbHRyZWZfdGVzdC5jYworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gY29uZmlnX3Rlc3QuY2MKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IGNxX3Rlc3QuY2MKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IGRhdGFyYXRlX3Rlc3QuY2MKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IGVuY29kZV90ZXN0X2RyaXZlci5jYworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gZW5jb2RlX3Rlc3RfZHJpdmVyLmgKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IGVycm9yX3Jlc2lsaWVuY2VfdGVzdC5jYworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gaTQyMF92aWRlb19zb3VyY2UuaAorTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0ga2V5ZnJhbWVfdGVzdC5jYworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gcmVzaXplX3Rlc3QuY2MKKworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gLi4vbWQ1X3V0aWxzLmggLi4vbWQ1X3V0aWxzLmMKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IGRlY29kZV90ZXN0X2RyaXZlci5jYworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gZGVjb2RlX3Rlc3RfZHJpdmVyLmgKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IGl2Zl92aWRlb19zb3VyY2UuaAorTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdGVzdF92ZWN0b3JfdGVzdC5jYworIyMKKyMjIFdISVRFIEJPWCBURVNUUworIyMKKyMjIFdoaXRlYm94IHRlc3RzIGludm9rZSBmdW5jdGlvbnMgbm90IGV4cG9zZWQgdmlhIHRoZSBwdWJsaWMgQVBJLiBDZXJ0YWluCisjIyBzaGFyZWQgbGlicmFyeSBidWlsZHMgZG9uJ3QgbWFrZSB0aGVzZSBmdW5jdGlvbnMgYWNjZXNzaWJsZS4KKyMjCitpZmVxICgkKENPTkZJR19TSEFSRUQpLCkKKworIyBUaGVzZSB0ZXN0cyByZXF1aXJlIGJvdGggdGhlIGVuY29kZXIgYW5kIGRlY29kZXIgdG8gYmUgYnVpbHQuCitpZmVxICgkKENPTkZJR19WUDhfRU5DT0RFUikkKENPTkZJR19WUDhfREVDT0RFUikseWVzeWVzKQorTElCVlBYX1RFU1RfU1JDUy15ZXMgICAgICAgICAgICAgICAgICAgKz0gYm9vbGNvZGVyX3Rlc3QuY2MKK2VuZGlmCisKK0xJQlZQWF9URVNUX1NSQ1MtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IGZkY3Q0eDRfdGVzdC5jYworTElCVlBYX1RFU1RfU1JDUy15ZXMgICAgICAgICAgICAgICAgICAgKz0gaWRjdGxsbV90ZXN0LmNjCitMSUJWUFhfVEVTVF9TUkNTLXllcyAgICAgICAgICAgICAgICAgICArPSBpbnRyYXByZWRfdGVzdC5jYworTElCVlBYX1RFU1RfU1JDUy0kKENPTkZJR19QT1NUUFJPQykgICAgKz0gcHBfZmlsdGVyX3Rlc3QuY2MKK0xJQlZQWF9URVNUX1NSQ1MteWVzICAgICAgICAgICAgICAgICAgICs9IHNhZF90ZXN0LmNjCitMSUJWUFhfVEVTVF9TUkNTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSBzZXRfcm9pLmNjCitMSUJWUFhfVEVTVF9TUkNTLXllcyAgICAgICAgICAgICAgICAgICArPSBzaXh0YXBfcHJlZGljdF90ZXN0LmNjCitMSUJWUFhfVEVTVF9TUkNTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSBzdWJ0cmFjdF90ZXN0LmNjCisKK2VuZGlmCisKKworIyMKKyMjIFRFU1QgREFUQQorIyMKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IGhhbnRyb19jb2xsYWdlX3czNTJoMjg4Lnl1dgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwMS5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDIuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAzLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwNC5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDUuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA2Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwNy5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDguaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA5Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxMC5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTEuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDEyLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxMy5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTQuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE1Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxNi5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTcuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE4Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMS1pbnRyYS0xNDAwLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMS1pbnRyYS0xNDExLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMS1pbnRyYS0xNDE2Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMS1pbnRyYS0xNDE3Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMi1pbnRlci0xNDAyLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMi1pbnRlci0xNDEyLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMi1pbnRlci0xNDE4Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMi1pbnRlci0xNDI0Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMDEuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0wMi5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTAzLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMDQuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDAxLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwMy5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDcuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDA4Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwOS5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTAuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDEzLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQxNC5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTUuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDI1Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQyNi5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjcuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDMyLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQzNS5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzYuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDM3Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQ0MS5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0NDIuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA0LXBhcnRpdGlvbnMtMTQwNC5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDQtcGFydGl0aW9ucy0xNDA1Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNC1wYXJ0aXRpb25zLTE0MDYuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDI4Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNS1zaGFycG5lc3MtMTQyOS5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDUtc2hhcnBuZXNzLTE0MzAuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDMxLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNS1zaGFycG5lc3MtMTQzMy5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDUtc2hhcnBuZXNzLTE0MzQuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDM4Lml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNS1zaGFycG5lc3MtMTQzOS5pdmYKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDUtc2hhcnBuZXNzLTE0NDAuaXZmCitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDQzLml2ZgorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwMS5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAyLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDMuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwNC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA1Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDYuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAwNy5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA4Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMDkuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxMC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDExLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTIuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxMy5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE0Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTUuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMC1jb21wcmVoZW5zaXZlLTAxNi5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE3Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDAtY29tcHJlaGVuc2l2ZS0wMTguaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMS1pbnRyYS0xNDAwLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDEtaW50cmEtMTQxMS5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAxLWludHJhLTE0MTYuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMS1pbnRyYS0xNDE3Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDItaW50ZXItMTQwMi5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAyLWludGVyLTE0MTIuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMi1pbnRlci0xNDE4Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDItaW50ZXItMTQyNC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDAxLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDMuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQwNy5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDA4Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDkuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQxMC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDEzLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTQuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQxNS5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDI1Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjYuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQyNy5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDMyLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzUuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQzNi5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0xNDM3Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDMtc2VnbWVudGF0aW9uLTE0NDEuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wMy1zZWdtZW50YXRpb24tMTQ0Mi5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0wMS5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0wMi5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0wMy5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTAzLXNlZ21lbnRhdGlvbi0wNC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA0LXBhcnRpdGlvbnMtMTQwNC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA0LXBhcnRpdGlvbnMtMTQwNS5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA0LXBhcnRpdGlvbnMtMTQwNi5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDI4Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDUtc2hhcnBuZXNzLTE0MjkuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNS1zaGFycG5lc3MtMTQzMC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDMxLml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDUtc2hhcnBuZXNzLTE0MzMuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNS1zaGFycG5lc3MtMTQzNC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDM4Lml2Zi5tZDUKK0xJQlZQWF9URVNUX0RBVEEtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwODAtMDUtc2hhcnBuZXNzLTE0MzkuaXZmLm1kNQorTElCVlBYX1RFU1RfREFUQS0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4MC0wNS1zaGFycG5lc3MtMTQ0MC5pdmYubWQ1CitMSUJWUFhfVEVTVF9EQVRBLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDgwLTA1LXNoYXJwbmVzcy0xNDQzLml2Zi5tZDUKZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L3Rlc3RfbGlidnB4LmNjIGIvbGlidnB4L3Rlc3QvdGVzdF9saWJ2cHguY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNWQyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L3Rlc3RfbGlidnB4LmNjCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2cHhfcG9ydHMveDg2LmgiCit9CisjZW5kaWYKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK3N0YXRpYyB2b2lkIGFwcGVuZF9ndGVzdF9maWx0ZXIoY29uc3QgY2hhciAqc3RyKSB7CisgIHN0ZDo6c3RyaW5nIGZpbHRlciA9IDo6dGVzdGluZzo6RkxBR1NfZ3Rlc3RfZmlsdGVyOworICBmaWx0ZXIgKz0gc3RyOworICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2ZpbHRlciA9IGZpbHRlcjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisjaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKKyAgY29uc3QgaW50IHNpbWRfY2FwcyA9IHg4Nl9zaW1kX2NhcHMoKTsKKyAgaWYoIShzaW1kX2NhcHMgJiBIQVNfTU1YKSkKKyAgICBhcHBlbmRfZ3Rlc3RfZmlsdGVyKCI6LU1NWC8qIik7CisgIGlmKCEoc2ltZF9jYXBzICYgSEFTX1NTRSkpCisgICAgYXBwZW5kX2d0ZXN0X2ZpbHRlcigiOi1TU0UvKiIpOworICBpZighKHNpbWRfY2FwcyAmIEhBU19TU0UyKSkKKyAgICBhcHBlbmRfZ3Rlc3RfZmlsdGVyKCI6LVNTRTIvKiIpOworICBpZighKHNpbWRfY2FwcyAmIEhBU19TU0UzKSkKKyAgICBhcHBlbmRfZ3Rlc3RfZmlsdGVyKCI6LVNTRTMvKiIpOworICBpZighKHNpbWRfY2FwcyAmIEhBU19TU1NFMykpCisgICAgYXBwZW5kX2d0ZXN0X2ZpbHRlcigiOi1TU1NFMy8qIik7CisgIGlmKCEoc2ltZF9jYXBzICYgSEFTX1NTRTRfMSkpCisgICAgYXBwZW5kX2d0ZXN0X2ZpbHRlcigiOi1TU0U0XzEvKiIpOworI2VuZGlmCisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90ZXN0L3Rlc3RfdmVjdG9yX3Rlc3QuY2MgYi9saWJ2cHgvdGVzdC90ZXN0X3ZlY3Rvcl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODQ1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC90ZXN0X3ZlY3Rvcl90ZXN0LmNjCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0L2RlY29kZV90ZXN0X2RyaXZlci5oIgorI2luY2x1ZGUgInRlc3QvaXZmX3ZpZGVvX3NvdXJjZS5oIgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi9tZDVfdXRpbHMuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKK30KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIHNucHJpbnRmIHNwcmludGZfcworI2VuZGlmCisKK25hbWVzcGFjZSB7CisvLyBUaGVyZSBhcmUgNjEgdGVzdCB2ZWN0b3JzIGluIHRvdGFsLgorY29uc3QgY2hhciAqa1Rlc3RWZWN0b3JzW10gPSB7CisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAxLml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAyLml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDAzLml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA0Lml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA1Lml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA2Lml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA3Lml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA4Lml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDA5Lml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDEwLml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDExLml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDEyLml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDEzLml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE0Lml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE1Lml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE2Lml2ZiIsICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE3Lml2ZiIsCisgICJ2cDgwLTAwLWNvbXByZWhlbnNpdmUtMDE4Lml2ZiIsICJ2cDgwLTAxLWludHJhLTE0MDAuaXZmIiwKKyAgInZwODAtMDEtaW50cmEtMTQxMS5pdmYiLCAidnA4MC0wMS1pbnRyYS0xNDE2Lml2ZiIsCisgICJ2cDgwLTAxLWludHJhLTE0MTcuaXZmIiwgInZwODAtMDItaW50ZXItMTQwMi5pdmYiLAorICAidnA4MC0wMi1pbnRlci0xNDEyLml2ZiIsICJ2cDgwLTAyLWludGVyLTE0MTguaXZmIiwKKyAgInZwODAtMDItaW50ZXItMTQyNC5pdmYiLCAidnA4MC0wMy1zZWdtZW50YXRpb24tMDEuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTAyLml2ZiIsICJ2cDgwLTAzLXNlZ21lbnRhdGlvbi0wMy5pdmYiLAorICAidnA4MC0wMy1zZWdtZW50YXRpb24tMDQuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDEuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDMuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDcuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDguaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MDkuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTAuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTMuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTQuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MTUuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjUuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjYuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MjcuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzIuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzUuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzYuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0MzcuaXZmIiwgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0NDEuaXZmIiwKKyAgInZwODAtMDMtc2VnbWVudGF0aW9uLTE0NDIuaXZmIiwgInZwODAtMDQtcGFydGl0aW9ucy0xNDA0Lml2ZiIsCisgICJ2cDgwLTA0LXBhcnRpdGlvbnMtMTQwNS5pdmYiLCAidnA4MC0wNC1wYXJ0aXRpb25zLTE0MDYuaXZmIiwKKyAgInZwODAtMDUtc2hhcnBuZXNzLTE0MjguaXZmIiwgInZwODAtMDUtc2hhcnBuZXNzLTE0MjkuaXZmIiwKKyAgInZwODAtMDUtc2hhcnBuZXNzLTE0MzAuaXZmIiwgInZwODAtMDUtc2hhcnBuZXNzLTE0MzEuaXZmIiwKKyAgInZwODAtMDUtc2hhcnBuZXNzLTE0MzMuaXZmIiwgInZwODAtMDUtc2hhcnBuZXNzLTE0MzQuaXZmIiwKKyAgInZwODAtMDUtc2hhcnBuZXNzLTE0MzguaXZmIiwgInZwODAtMDUtc2hhcnBuZXNzLTE0MzkuaXZmIiwKKyAgInZwODAtMDUtc2hhcnBuZXNzLTE0NDAuaXZmIiwgInZwODAtMDUtc2hhcnBuZXNzLTE0NDMuaXZmIgorfTsKKworY2xhc3MgVGVzdFZlY3RvclRlc3QgOiBwdWJsaWMgbGlidnB4X3Rlc3Q6OkRlY29kZXJUZXN0LAorICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyBwcm90ZWN0ZWQ6CisgIFRlc3RWZWN0b3JUZXN0KCkgOiBtZDVfZmlsZV8oTlVMTCkge30KKworICB2aXJ0dWFsIH5UZXN0VmVjdG9yVGVzdCgpIHsKKyAgICBpZiAobWQ1X2ZpbGVfKQorICAgICAgZmNsb3NlKG1kNV9maWxlXyk7CisgIH0KKworICB2b2lkIE9wZW5NRDVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZDVfZmlsZV9uYW1lXykgeworICAgIG1kNV9maWxlXyA9IGxpYnZweF90ZXN0OjpPcGVuVGVzdERhdGFGaWxlKG1kNV9maWxlX25hbWVfKTsKKyAgICBBU1NFUlRfVFJVRShtZDVfZmlsZV8pIDw8ICJNZDUgZmlsZSBvcGVuIGZhaWxlZC4gRmlsZW5hbWU6ICIKKyAgICAgICAgPDwgbWQ1X2ZpbGVfbmFtZV87CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVjb21wcmVzc2VkRnJhbWVIb29rKGNvbnN0IHZweF9pbWFnZV90JiBpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGZyYW1lX251bWJlcikgeworICAgIGNoYXIgZXhwZWN0ZWRfbWQ1WzMzXTsKKyAgICBjaGFyIGp1bmtbMTI4XTsKKworICAgIC8vIFJlYWQgY29ycmVjdCBtZDUgY2hlY2tzdW1zLgorICAgIGNvbnN0IGludCByZXMgPSBmc2NhbmYobWQ1X2ZpbGVfLCAiJXMgICVzIiwgZXhwZWN0ZWRfbWQ1LCBqdW5rKTsKKyAgICBBU1NFUlRfTkUocmVzLCBFT0YpIDw8ICJSZWFkIG1kNSBkYXRhIGZhaWxlZCI7CisgICAgZXhwZWN0ZWRfbWQ1WzMyXSA9ICdcMCc7CisKKyAgICBNRDVDb250ZXh0IG1kNTsKKyAgICBNRDVJbml0KCZtZDUpOworCisgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIG1kNSBmb3IgZWFjaCByYXcgaW4gZGVjb21wcmVzc2VkIGRhdGEuCisgICAgZm9yIChpbnQgcGxhbmUgPSAwOyBwbGFuZSA8IDM7ICsrcGxhbmUpIHsKKyAgICAgIHVpbnQ4X3QgKmJ1ZiA9IGltZy5wbGFuZXNbcGxhbmVdOworCisgICAgICBmb3IgKHVuc2lnbmVkIGludCB5ID0gMDsgeSA8IChwbGFuZSA/IChpbWcuZF9oICsgMSkgPj4gMSA6IGltZy5kX2gpOworICAgICAgICAgICArK3kpIHsKKyAgICAgICAgTUQ1VXBkYXRlKCZtZDUsIGJ1ZiwgKHBsYW5lID8gKGltZy5kX3cgKyAxKSA+PiAxIDogaW1nLmRfdykpOworICAgICAgICBidWYgKz0gaW1nLnN0cmlkZVtwbGFuZV07CisgICAgICB9CisgICAgfQorCisgICAgdWludDhfdCBtZDVfc3VtWzE2XTsKKyAgICBNRDVGaW5hbChtZDVfc3VtLCAmbWQ1KTsKKworICAgIGNoYXIgYWN0dWFsX21kNVszM107CisgICAgLy8gQ29udmVydCB0byBnZXQgdGhlIGFjdHVhbCBtZDUuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICBzbnByaW50ZigmYWN0dWFsX21kNVtpICogMl0sIHNpemVvZihhY3R1YWxfbWQ1KSAtIGkgKiAyLCAiJTAyeCIsCisgICAgICAgICAgICAgICBtZDVfc3VtW2ldKTsKKyAgICB9CisgICAgYWN0dWFsX21kNVszMl0gPSAnXDAnOworCisgICAgLy8gQ2hlY2sgbWQ1IG1hdGNoLgorICAgIEFTU0VSVF9TVFJFUShleHBlY3RlZF9tZDUsIGFjdHVhbF9tZDUpCisgICAgICAgIDw8ICJNZDUgY2hlY2tzdW1zIGRvbid0IG1hdGNoOiBmcmFtZSBudW1iZXIgPSAiIDw8IGZyYW1lX251bWJlcjsKKyAgfQorCisgcHJpdmF0ZToKKyAgRklMRSAqbWQ1X2ZpbGVfOworfTsKKworLy8gVGhpcyB0ZXN0IHJ1bnMgdGhyb3VnaCB0aGUgd2hvbGUgc2V0IG9mIHRlc3QgdmVjdG9ycywgYW5kIGRlY29kZXMgdGhlbS4KKy8vIFRoZSBtZDUgY2hlY2tzdW1zIGFyZSBjb21wdXRlZCBmb3IgZWFjaCBmcmFtZSBpbiB0aGUgdmlkZW8gZmlsZS4gSWYgbWQ1CisvLyBjaGVja3N1bXMgbWF0Y2ggdGhlIGNvcnJlY3QgbWQ1IGRhdGEsIHRoZW4gdGhlIHRlc3QgaXMgcGFzc2VkLiBPdGhlcndpc2UsCisvLyB0aGUgdGVzdCBmYWlsZWQuCitURVNUX1AoVGVzdFZlY3RvclRlc3QsIE1ENU1hdGNoKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gR2V0UGFyYW0oKTsKKyAgLy8gT3BlbiBjb21wcmVzc2VkIHZpZGVvIGZpbGUuCisgIGxpYnZweF90ZXN0OjpJVkZWaWRlb1NvdXJjZSB2aWRlbyhmaWxlbmFtZSk7CisKKyAgdmlkZW8uSW5pdCgpOworCisgIC8vIENvbnN0cnVjdCBtZDUgZmlsZSBuYW1lLgorICBjb25zdCBzdGQ6OnN0cmluZyBtZDVfZmlsZW5hbWUgPSBmaWxlbmFtZSArICIubWQ1IjsKKyAgT3Blbk1ENUZpbGUobWQ1X2ZpbGVuYW1lKTsKKworICAvLyBEZWNvZGUgZnJhbWUsIGFuZCBjaGVjayB0aGUgbWQ1IG1hdGNoaW5nLgorICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSdW5Mb29wKCZ2aWRlbykpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0VmVjdG9yU2VxdWVuY2UsIFRlc3RWZWN0b3JUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihrVGVzdFZlY3RvcnMpKTsKKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC91dGlsLmggYi9saWJ2cHgvdGVzdC91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhNzBjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90ZXN0L3V0aWwuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpZm5kZWYgVEVTVF9VVElMX0hfCisjZGVmaW5lIFRFU1RfVVRJTF9IXworCisvLyBNYWNyb3MKKyNkZWZpbmUgUEFSQU1TKC4uLikgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPCBzdGQ6OnRyMTo6dHVwbGU8IF9fVkFfQVJHU19fID4gPgorI2RlZmluZSBHRVRfUEFSQU0oaykgc3RkOjp0cjE6OmdldDwgayA+KEdldFBhcmFtKCkpCisKKyNlbmRpZiAgLy8gVEVTVF9VVElMX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGVzdC92aWRlb19zb3VyY2UuaCBiL2xpYnZweC90ZXN0L3ZpZGVvX3NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzI2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGVzdC92aWRlb19zb3VyY2UuaApAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBURVNUX1ZJREVPX1NPVVJDRV9IXworI2RlZmluZSBURVNUX1ZJREVPX1NPVVJDRV9IXworCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRlc3QvYWNtX3JhbmRvbS5oIgorI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgorCituYW1lc3BhY2UgbGlidnB4X3Rlc3QgeworCitzdGF0aWMgRklMRSAqT3BlblRlc3REYXRhRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHBhdGhfdG9fc291cmNlID0gZmlsZV9uYW1lOworICBjb25zdCBjaGFyICprRGF0YVBhdGggPSBnZXRlbnYoIkxJQlZQWF9URVNUX0RBVEFfUEFUSCIpOworCisgIGlmIChrRGF0YVBhdGgpIHsKKyAgICBwYXRoX3RvX3NvdXJjZSA9IGtEYXRhUGF0aDsKKyAgICBwYXRoX3RvX3NvdXJjZSArPSAiLyI7CisgICAgcGF0aF90b19zb3VyY2UgKz0gZmlsZV9uYW1lOworICB9CisKKyAgcmV0dXJuIGZvcGVuKHBhdGhfdG9fc291cmNlLmNfc3RyKCksICJyYiIpOworfQorCisvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0ZXN0IHZpZGVvIHNvdXJjZXMsIHdoaWNoIHByb3ZpZGUgYSBzdHJlYW0gb2YKKy8vIHZweF9pbWFnZV90IGltYWdlcyB3aXRoIGFzc29jaWF0ZWQgdGltZXN0YW1wcyBhbmQgZHVyYXRpb24uCitjbGFzcyBWaWRlb1NvdXJjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5WaWRlb1NvdXJjZSgpIHt9CisKKyAgLy8gUHJlcGFyZSB0aGUgc3RyZWFtIGZvciByZWFkaW5nLCByZXdpbmQvb3BlbiBhcyBuZWNlc3NhcnkuCisgIHZpcnR1YWwgdm9pZCBCZWdpbigpID0gMDsKKworICAvLyBBZHZhbmNlIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgZnJhbWUKKyAgdmlydHVhbCB2b2lkIE5leHQoKSA9IDA7CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IHZpZGVvIGZyYW1lLCBvciBOVUxMIG9uIEVuZC1PZi1TdHJlYW0uCisgIHZpcnR1YWwgdnB4X2ltYWdlX3QgKmltZygpIGNvbnN0ID0gMDsKKworICAvLyBHZXQgdGhlIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgIHZpcnR1YWwgdnB4X2NvZGVjX3B0c190IHB0cygpIGNvbnN0ID0gMDsKKworICAvLyBHZXQgdGhlIGN1cnJlbnQgZnJhbWUncyBkdXJhdGlvbgorICB2aXJ0dWFsIHVuc2lnbmVkIGxvbmcgZHVyYXRpb24oKSBjb25zdCA9IDA7CisKKyAgLy8gR2V0IHRoZSB0aW1lYmFzZSBmb3IgdGhlIHN0cmVhbQorICB2aXJ0dWFsIHZweF9yYXRpb25hbF90IHRpbWViYXNlKCkgY29uc3QgPSAwOworCisgIC8vIEdldCB0aGUgY3VycmVudCBmcmFtZSBjb3VudGVyLCBzdGFydGluZyBhdCAwLgorICB2aXJ0dWFsIHVuc2lnbmVkIGludCBmcmFtZSgpIGNvbnN0ID0gMDsKKworICAvLyBHZXQgdGhlIGN1cnJlbnQgZmlsZSBsaW1pdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgbGltaXQoKSBjb25zdCA9IDA7Cit9OworCisKK2NsYXNzIER1bW15VmlkZW9Tb3VyY2UgOiBwdWJsaWMgVmlkZW9Tb3VyY2UgeworIHB1YmxpYzoKKyAgRHVtbXlWaWRlb1NvdXJjZSgpIDogaW1nXyhOVUxMKSwgbGltaXRfKDEwMCksIHdpZHRoXygwKSwgaGVpZ2h0XygwKSB7CisgICAgU2V0U2l6ZSg4MCwgNjQpOworICB9CisKKyAgdmlydHVhbCB+RHVtbXlWaWRlb1NvdXJjZSgpIHsgdnB4X2ltZ19mcmVlKGltZ18pOyB9CisKKyAgdmlydHVhbCB2b2lkIEJlZ2luKCkgeworICAgIGZyYW1lXyA9IDA7CisgICAgRmlsbEZyYW1lKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgTmV4dCgpIHsKKyAgICArK2ZyYW1lXzsKKyAgICBGaWxsRnJhbWUoKTsKKyAgfQorCisgIHZpcnR1YWwgdnB4X2ltYWdlX3QgKmltZygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGZyYW1lXyA8IGxpbWl0XykgPyBpbWdfIDogTlVMTDsKKyAgfQorCisgIC8vIE1vZGVscyBhIHN0cmVhbSB3aGVyZSBUaW1lYmFzZSA9IDEvRlBTLCBzbyBwdHMgPT0gZnJhbWUuCisgIHZpcnR1YWwgdnB4X2NvZGVjX3B0c190IHB0cygpIGNvbnN0IHsgcmV0dXJuIGZyYW1lXzsgfQorCisgIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBkdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKworICB2aXJ0dWFsIHZweF9yYXRpb25hbF90IHRpbWViYXNlKCkgY29uc3QgeworICAgIGNvbnN0IHZweF9yYXRpb25hbF90IHQgPSB7MSwgMzB9OworICAgIHJldHVybiB0OworICB9CisKKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZnJhbWUoKSBjb25zdCB7IHJldHVybiBmcmFtZV87IH0KKworICB2aXJ0dWFsIHVuc2lnbmVkIGludCBsaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGxpbWl0XzsgfQorCisgIHZvaWQgU2V0U2l6ZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpIHsKKyAgICBpZiAod2lkdGggIT0gd2lkdGhfIHx8IGhlaWdodCAhPSBoZWlnaHRfKSB7CisgICAgICB2cHhfaW1nX2ZyZWUoaW1nXyk7CisgICAgICByYXdfc3pfID0gKCh3aWR0aCArIDMxKSZ+MzEpICogaGVpZ2h0ICogMyAvIDI7CisgICAgICBpbWdfID0gdnB4X2ltZ19hbGxvYyhOVUxMLCBWUFhfSU1HX0ZNVF9WUFhJNDIwLCB3aWR0aCwgaGVpZ2h0LCAzMik7CisgICAgICB3aWR0aF8gPSB3aWR0aDsKKyAgICAgIGhlaWdodF8gPSBoZWlnaHQ7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBGaWxsRnJhbWUoKSB7IG1lbXNldChpbWdfLT5pbWdfZGF0YSwgMCwgcmF3X3N6Xyk7IH0KKworICB2cHhfaW1hZ2VfdCAqaW1nXzsKKyAgc2l6ZV90ICAgICAgIHJhd19zel87CisgIHVuc2lnbmVkIGludCBsaW1pdF87CisgIHVuc2lnbmVkIGludCBmcmFtZV87CisgIHVuc2lnbmVkIGludCB3aWR0aF87CisgIHVuc2lnbmVkIGludCBoZWlnaHRfOworfTsKKworCitjbGFzcyBSYW5kb21WaWRlb1NvdXJjZSA6IHB1YmxpYyBEdW1teVZpZGVvU291cmNlIHsKKyBwdWJsaWM6CisgIFJhbmRvbVZpZGVvU291cmNlKGludCBzZWVkID0gQUNNUmFuZG9tOjpEZXRlcm1pbmlzdGljU2VlZCgpKQorICAgICAgOiBybmRfKHNlZWQpLAorICAgICAgICBzZWVkXyhzZWVkKSB7IH0KKworIHByb3RlY3RlZDoKKyAgLy8gUmVzZXQgdGhlIFJORyB0byBnZXQgYSBtYXRjaGluZyBzdHJlYW0gZm9yIHRoZSBzZWNvbmQgcGFzcworICB2aXJ0dWFsIHZvaWQgQmVnaW4oKSB7CisgICAgZnJhbWVfID0gMDsKKyAgICBybmRfLlJlc2V0KHNlZWRfKTsKKyAgICBGaWxsRnJhbWUoKTsKKyAgfQorCisgIC8vIDE1IGZyYW1lcyBvZiBub2lzZSwgZm9sbG93ZWQgYnkgMTUgc3RhdGljIGZyYW1lcy4gUmVzZXQgdG8gMCByYXRoZXIKKyAgLy8gdGhhbiBob2xkaW5nIHByZXZpb3VzIGZyYW1lcyB0byBlbmNvdXJhZ2Uga2V5ZnJhbWVzIHRvIGJlIHRocm93bi4KKyAgdmlydHVhbCB2b2lkIEZpbGxGcmFtZSgpIHsKKyAgICBpZiAoZnJhbWVfICUgMzAgPCAxNSkKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmF3X3N6XzsgKytpKQorICAgICAgICBpbWdfLT5pbWdfZGF0YVtpXSA9IHJuZF8uUmFuZDgoKTsKKyAgICBlbHNlCisgICAgICBtZW1zZXQoaW1nXy0+aW1nX2RhdGEsIDAsIHJhd19zel8pOworICB9CisKKyAgQUNNUmFuZG9tIHJuZF87CisgIGludCBzZWVkXzsKK307CisKKy8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRlc3QgdmlkZW8gc291cmNlcywgd2hpY2ggcHJvdmlkZSBhIHN0cmVhbSBvZgorLy8gZGVjb21wcmVzc2VkIGltYWdlcyB0byB0aGUgZGVjb2Rlci4KK2NsYXNzIENvbXByZXNzZWRWaWRlb1NvdXJjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Db21wcmVzc2VkVmlkZW9Tb3VyY2UoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBJbml0KCkgPSAwOworCisgIC8vIFByZXBhcmUgdGhlIHN0cmVhbSBmb3IgcmVhZGluZywgcmV3aW5kL29wZW4gYXMgbmVjZXNzYXJ5LgorICB2aXJ0dWFsIHZvaWQgQmVnaW4oKSA9IDA7CisKKyAgLy8gQWR2YW5jZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGZyYW1lCisgIHZpcnR1YWwgdm9pZCBOZXh0KCkgPSAwOworCisgIHZpcnR1YWwgY29uc3QgdWludDhfdCAqY3hkYXRhKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgY29uc3QgdW5zaWduZWQgaW50IGZyYW1lX3NpemUoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVfbnVtYmVyKCkgY29uc3QgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGxpYnZweF90ZXN0CisKKyNlbmRpZiAgLy8gVEVTVF9WSURFT19TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L1JFQURNRS53ZWJtIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvUkVBRE1FLndlYm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxZDg5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L1JFQURNRS53ZWJtCkBAIC0wLDAgKzEsMTUgQEAKK1VSTDogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvCitWZXJzaW9uOiAxLjYuMAorTGljZW5zZTogQlNECitMaWNlbnNlIEZpbGU6IENPUFlJTkcKKworRGVzY3JpcHRpb246CitHb29nbGUncyBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIHRlc3RzIG9uIGEgdmFyaWV0eSBvZiBwbGF0Zm9ybXMKKyhMaW51eCwgTWFjIE9TIFgsIFdpbmRvd3MsIFdpbmRvd3MgQ0UsIFN5bWJpYW4sIGV0YykuICBCYXNlZCBvbiB0aGUKK3hVbml0IGFyY2hpdGVjdHVyZS4gIFN1cHBvcnRzIGF1dG9tYXRpYyB0ZXN0IGRpc2NvdmVyeSwgYSByaWNoIHNldCBvZgorYXNzZXJ0aW9ucywgdXNlci1kZWZpbmVkIGFzc2VydGlvbnMsIGRlYXRoIHRlc3RzLCBmYXRhbCBhbmQgbm9uLWZhdGFsCitmYWlsdXJlcywgdmFyaW91cyBvcHRpb25zIGZvciBydW5uaW5nIHRoZSB0ZXN0cywgYW5kIFhNTCB0ZXN0IHJlcG9ydAorZ2VuZXJhdGlvbi4KKworTG9jYWwgTW9kaWZpY2F0aW9uczoKK05vbmUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ3Rlc3QubWsgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9ndGVzdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGUzMTEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ3Rlc3QubWsKQEAgLTAsMCArMSBAQAorR1RFU1RfU1JDUy15ZXMgKz0gc3JjL2d0ZXN0LWFsbC5jYyAKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9DSEFOR0VTIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxOTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9DSEFOR0VTCkBAIC0wLDAgKzEsMTMwIEBACitDaGFuZ2VzIGZvciAxLjYuMDoKKworKiBOZXcgZmVhdHVyZTogQUREX0ZBSUxVUkVfQVQoKSBmb3IgcmVwb3J0aW5nIGEgdGVzdCBmYWlsdXJlIGF0IHRoZQorICBnaXZlbiBzb3VyY2UgbG9jYXRpb24gLS0gdXNlZnVsIGZvciB3cml0aW5nIHRlc3RpbmcgdXRpbGl0aWVzLgorKiBOZXcgZmVhdHVyZTogdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIGlzIG1vdmVkIGZyb20gR29vZ2xlIE1vY2sKKyAgdG8gR29vZ2xlIFRlc3QuCisqIE5ldyBmZWF0dXJlOiB0eXBlIHBhcmFtZXRlcnMgYW5kIHZhbHVlIHBhcmFtZXRlcnMgYXJlIHJlcG9ydGVkIGluCisgIHRoZSBYTUwgcmVwb3J0IG5vdy4KKyogQSBndGVzdF9kaXNhYmxlX3B0aHJlYWRzIENNYWtlIG9wdGlvbi4KKyogQ29sb3JlZCBvdXRwdXQgd29ya3MgaW4gR05VIFNjcmVlbiBzZXNzaW9ucyBub3cuCisqIFBhcmFtZXRlcnMgb2YgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgbm93IHByaW50ZWQgaW4gdGhlCisgIHRleHR1YWwgb3V0cHV0LgorKiBGYWlsdXJlcyBmcm9tIGFkIGhvYyB0ZXN0IGFzc2VydGlvbnMgcnVuIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgYXJlCisgIG5vdyBjb3JyZWN0bHkgcmVwb3J0ZWQuCisqIEFyZ3VtZW50cyBvZiBBU1NFUlRfWFkgYW5kIEVYUEVDVF9YWSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0IDw8IHRvCisgIG9zdHJlYW0uCisqIE1vcmUgY29tcGxldGUgaGFuZGxpbmcgb2YgZXhjZXB0aW9ucy4KKyogR1RFU1RfQVNTRVJUX1hZIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQVNTRVJUX1hZIGluIGNhc2UgdGhlIGxhdHRlcgorICBuYW1lIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGxpYnJhcnkuCisqIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBpcyBub3cgdHJ1ZSBieSBkZWZhdWx0LCBhbGxvd2luZyBhIHRlc3QKKyAgcHJvZ3JhbSB0byBjb250aW51ZSBhZnRlciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorKiBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZXMgY2FuIG5vdyBkZXJpdmUgZnJvbSBUZXN0IGFuZAorICBXaXRoUGFyYW1JbnRlcmZhY2U8VD4gc2VwYXJhdGVseSwgZWFzaW5nIGNvbnZlcnNpb24gb2YgbGVnYWN5IHRlc3RzLgorKiBEZWF0aCB0ZXN0IG1lc3NhZ2VzIGFyZSBjbGVhcmx5IG1hcmtlZCB0byBtYWtlIHRoZW0gbW9yZQorICBkaXN0aW5ndWlzaGFibGUgZnJvbSBvdGhlciBtZXNzYWdlcy4KKyogQ29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgQW5kcm9pZCwgR29vZ2xlIE5hdGl2ZSBDbGllbnQsIE1pbkdXLCBIUCBVWCwKKyAgUG93ZXJQQywgTHVjaWQgYXV0b3Rvb2xzLCBsaWJDU3RkLCBTdW4gQysrLCBCb3JsYW5kIEMrKyBCdWlsZGVyIChDb2RlIEdlYXIpLAorICBJQk0gWEwgQysrIChWaXN1YWwgQWdlIEMrKyksIGFuZCBDKysweC4KKyogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisqIFBvdGVudGlhbGx5IGluY29tcGF0aWJsZSBjaGFuZ2VzOiBkaXNhYmxlcyB0aGUgaGFybWZ1bCAnbWFrZSBpbnN0YWxsJworICBjb21tYW5kIGluIGF1dG90b29scy4KKworQ2hhbmdlcyBmb3IgMS41LjA6CisKKyAqIE5ldyBmZWF0dXJlOiBhc3NlcnRpb25zIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGluIG11bHRpcGxlIHRocmVhZHMKKyAgIHdoZXJlIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4KKyAqIE5ldyBmZWF0dXJlOiBwcmVkaWNhdGVzIHVzZWQgaW5zaWRlIEVYUEVDVF9UUlVFKCkgYW5kIGZyaWVuZHMKKyAgIGNhbiBub3cgZ2VuZXJhdGUgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZXMuCisgKiBOZXcgZmVhdHVyZTogR29vZ2xlIFRlc3QgY2FuIG5vdyBiZSBjb21waWxlZCBhcyBhIERMTC4KKyAqIE5ldyBmZWF0dXJlOiBmdXNlZCBzb3VyY2UgZmlsZXMgYXJlIGluY2x1ZGVkLgorICogTmV3IGZlYXR1cmU6IHByaW50cyBoZWxwIHdoZW4gZW5jb3VudGVyaW5nIHVucmVjb2duaXplZCBHb29nbGUgVGVzdCBmbGFncy4KKyAqIEV4cGVyaW1lbnRhbCBmZWF0dXJlOiBDTWFrZSBidWlsZCBzY3JpcHQgKHJlcXVpcmVzIENNYWtlIDIuNi40KykuCisgKiBFeHBlcmltZW50YWwgZmVhdHVyZTogdGhlIFB1bXAgc2NyaXB0IGZvciBtZXRhIHByb2dyYW1taW5nLgorICogZG91YmxlIHZhbHVlcyBzdHJlYW1lZCB0byBhbiBhc3NlcnRpb24gYXJlIHByaW50ZWQgd2l0aCBlbm91Z2ggcHJlY2lzaW9uCisgICB0byBkaWZmZXJlbnRpYXRlIGFueSB0d28gZGlmZmVyZW50IHZhbHVlcy4KKyAqIEdvb2dsZSBUZXN0IG5vdyB3b3JrcyBvbiBTb2xhcmlzIGFuZCBBSVguCisgKiBCdWlsZCBhbmQgdGVzdCBzY3JpcHQgaW1wcm92ZW1lbnRzLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKKyBQb3RlbnRpYWxseSBicmVha2luZyBjaGFuZ2VzOgorCisgKiBTdG9wcGVkIHN1cHBvcnRpbmcgVkMrKyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorICogRHJvcHBlZCBzdXBwb3J0IGZvciAnbWFrZSBpbnN0YWxsJy4KKworQ2hhbmdlcyBmb3IgMS40LjA6CisKKyAqIE5ldyBmZWF0dXJlOiB0aGUgZXZlbnQgbGlzdGVuZXIgQVBJCisgKiBOZXcgZmVhdHVyZTogdGVzdCBzaHVmZmxpbmcKKyAqIE5ldyBmZWF0dXJlOiB0aGUgWE1MIHJlcG9ydCBmb3JtYXQgaXMgY2xvc2VyIHRvIGp1bml0cmVwb3J0IGFuZCBjYW4KKyAgIGJlIHBhcnNlZCBieSBIdWRzb24gbm93LgorICogTmV3IGZlYXR1cmU6IHdoZW4gYSB0ZXN0IHJ1bnMgdW5kZXIgVmlzdWFsIFN0dWRpbywgaXRzIGZhaWx1cmVzIGFyZQorICAgaW50ZWdyYXRlZCBpbiB0aGUgSURFLgorICogTmV3IGZlYXR1cmU6IC9NRChkKSB2ZXJzaW9ucyBvZiBWQysrIHByb2plY3RzLgorICogTmV3IGZlYXR1cmU6IGVsYXBzZWQgdGltZSBmb3IgdGhlIHRlc3RzIGlzIHByaW50ZWQgYnkgZGVmYXVsdC4KKyAqIE5ldyBmZWF0dXJlOiBjb21lcyB3aXRoIGEgVFIxIHR1cGxlIGltcGxlbWVudGF0aW9uIHN1Y2ggdGhhdCBCb29zdAorICAgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgQ29tYmluZSgpLgorICogTmV3IGZlYXR1cmU6IEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgbWFjcm8gYW5kIGZyaWVuZHMuCisgKiBOZXcgZmVhdHVyZTogdGhlIFhjb2RlIHByb2plY3QgY2FuIG5vdyBwcm9kdWNlIHN0YXRpYyBndGVzdAorICAgbGlicmFyaWVzIGluIGFkZGl0aW9uIHRvIGEgZnJhbWV3b3JrLgorICogQ29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgU29sYXJpcywgQ3lnd2luLCBtaW5HVywgV2luZG93cyBNb2JpbGUsCisgICBTeW1iaWFuLCBnY2MsIGFuZCBDKytCdWlsZGVyLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKK0NoYW5nZXMgZm9yIDEuMy4wOgorCisgKiBOZXcgZmVhdHVyZTogZGVhdGggdGVzdHMgb24gV2luZG93cywgQ3lnd2luLCBhbmQgTWFjLgorICogTmV3IGZlYXR1cmU6IGFiaWxpdHkgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gb3RoZXIgdGVzdGluZworICAgZnJhbWV3b3Jrcy4KKyAqIE5ldyBmZWF0dXJlOiBhYmlsaXR5IHRvIHJ1biBkaXNhYmxlZCB0ZXN0IHZpYQorICAgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cy4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgLS1oZWxwIGZsYWcgZm9yIHByaW50aW5nIHRoZSB1c2FnZS4KKyAqIE5ldyBmZWF0dXJlOiBhY2Nlc3MgdG8gR29vZ2xlIFRlc3QgZmxhZyB2YWx1ZXMgaW4gdXNlciBjb2RlLgorICogTmV3IGZlYXR1cmU6IGEgc2NyaXB0IHRoYXQgcGFja3MgR29vZ2xlIFRlc3QgaW50byBvbmUgLmggYW5kIG9uZQorICAgLmNjIGZpbGUgZm9yIGVhc3kgZGVwbG95bWVudC4KKyAqIE5ldyBmZWF0dXJlOiBzdXBwb3J0IGZvciBkaXN0cmlidXRpbmcgdGVzdCBmdW5jdGlvbnMgdG8gbXVsdGlwbGUKKyAgIG1hY2hpbmVzIChyZXF1aXJlcyBzdXBwb3J0IGZyb20gdGhlIHRlc3QgcnVubmVyKS4KKyAqIEJ1ZyBmaXhlcyBhbmQgaW1wbGVtZW50YXRpb24gY2xlYW4tdXBzLgorCitDaGFuZ2VzIGZvciAxLjIuMToKKworICogQ29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgTGludXggSUEtNjQgYW5kIElCTSB6L09TLgorICogQWRkZWQgc3VwcG9ydCBmb3IgdXNpbmcgQm9vc3QgYW5kIG90aGVyIFRSMSBpbXBsZW1lbnRhdGlvbnMuCisgKiBDaGFuZ2VzIHRvIHRoZSBidWlsZCBzY3JpcHRzIHRvIHN1cHBvcnQgdXBjb21pbmcgcmVsZWFzZSBvZiBHb29nbGUgQysrCisgICBNb2NraW5nIEZyYW1ld29yay4KKyAqIEFkZGVkIE1ha2VmaWxlIHRvIHRoZSBkaXN0cmlidXRpb24gcGFja2FnZS4KKyAqIEltcHJvdmVkIGJ1aWxkIGluc3RydWN0aW9ucyBpbiBSRUFETUUuCisKK0NoYW5nZXMgZm9yIDEuMi4wOgorCisgKiBOZXcgZmVhdHVyZTogdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgQVNTRVJUL0VYUEVDVF8oTk9OKUZBVEFMX0ZBSUxVUkUoX09OX0FMTF9USFJFQURTKQorICAgbWFjcm9zLgorICogQ2hhbmdlZCB0aGUgWE1MIHJlcG9ydCBmb3JtYXQgdG8gbWF0Y2ggSlVuaXQvQW50J3MuCisgKiBBZGRlZCB0ZXN0cyB0byB0aGUgWGNvZGUgcHJvamVjdC4KKyAqIEFkZGVkIHNjb25zL1NDb25zY3JpcHQgZm9yIGJ1aWxkaW5nIHdpdGggU0NvbnMuCisgKiBBZGRlZCBzcmMvZ3Rlc3QtYWxsLmNjIGZvciBidWlsZGluZyBHb29nbGUgVGVzdCBmcm9tIGEgc2luZ2xlIGZpbGUuCisgKiBGaXhlZCBjb21wYXRpYmlsaXR5IHdpdGggU29sYXJpcyBhbmQgei9PUy4KKyAqIEVuYWJsZWQgcnVubmluZyBQeXRob24gdGVzdHMgb24gc3lzdGVtcyB3aXRoIHB5dGhvbiAyLjMgaW5zdGFsbGVkLAorICAgZS5nLiBNYWMgT1MgWCAxMC40LgorICogQnVnIGZpeGVzLgorCitDaGFuZ2VzIGZvciAxLjEuMDoKKworICogTmV3IGZlYXR1cmU6IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAqIE5ldyBmZWF0dXJlOiBleGNlcHRpb24gYXNzZXJ0aW9ucy4KKyAqIE5ldyBmZWF0dXJlOiBwcmludGluZyBlbGFwc2VkIHRpbWUgb2YgdGVzdHMuCisgKiBJbXByb3ZlZCB0aGUgcm9idXN0bmVzcyBvZiBkZWF0aCB0ZXN0cy4KKyAqIEFkZGVkIGFuIFhjb2RlIHByb2plY3QgYW5kIHNhbXBsZXMuCisgKiBBZGp1c3RlZCB0aGUgb3V0cHV0IGZvcm1hdCBvbiBXaW5kb3dzIHRvIGJlIHVuZGVyc3RhbmRhYmxlIGJ5IFZpc3VhbCBTdHVkaW8uCisgKiBNaW5vciBidWcgZml4ZXMuCisKK0NoYW5nZXMgZm9yIDEuMC4xOgorCisgKiBBZGRlZCBwcm9qZWN0IGZpbGVzIGZvciBWaXN1YWwgU3R1ZGlvIDcuMS4KKyAqIEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBpbGluZyBvbiBNYWMgT1MgWC4KKyAqIEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBpbGluZyBvbiBDeWd3aW4uCisKK0NoYW5nZXMgZm9yIDEuMC4wOgorCisgKiBJbml0aWFsIE9wZW4gU291cmNlIHJlbGVhc2Ugb2YgR29vZ2xlIFRlc3QKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9DTWFrZUxpc3RzLnR4dCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmUyNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjQwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ01ha2UgYnVpbGQgc2NyaXB0IGZvciBHb29nbGUgVGVzdC4KKyMKKyMgVG8gcnVuIHRoZSB0ZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmIG9uIExpbnV4LCB1c2UgJ21ha2UgdGVzdCcgb3IKKyMgY3Rlc3QuICBZb3UgY2FuIHNlbGVjdCB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgJ2N0ZXN0IC1SIHJlZ2V4Jy4KKyMgRm9yIG1vcmUgb3B0aW9ucywgcnVuICdjdGVzdCAtLWhlbHAnLgorCisjIEJVSUxEX1NIQVJFRF9MSUJTIGlzIGEgc3RhbmRhcmQgQ01ha2UgdmFyaWFibGUsIGJ1dCB3ZSBkZWNsYXJlIGl0IGhlcmUgdG8KKyMgbWFrZSBpdCBwcm9taW5lbnQgaW4gdGhlIEdVSS4KK29wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyAoRExMcykuIiBPRkYpCisKKyMgV2hlbiBvdGhlciBsaWJyYXJpZXMgYXJlIHVzaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgcnVudGltZSBsaWJyYXJpZXMsCisjIEdvb2dsZSBUZXN0IGFsc28gaGFzIHRvIHVzZSBvbmUuCitvcHRpb24oCisgIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQKKyAgIlVzZSBzaGFyZWQgKERMTCkgcnVuLXRpbWUgbGliIGV2ZW4gd2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBzdGF0aWMgbGliLiIKKyAgT0ZGKQorCitvcHRpb24oZ3Rlc3RfYnVpbGRfdGVzdHMgIkJ1aWxkIGFsbCBvZiBndGVzdCdzIG93biB0ZXN0cy4iIE9GRikKKworb3B0aW9uKGd0ZXN0X2J1aWxkX3NhbXBsZXMgIkJ1aWxkIGd0ZXN0J3Mgc2FtcGxlIHByb2dyYW1zLiIgT0ZGKQorCitvcHRpb24oZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcyAiRGlzYWJsZSB1c2VzIG9mIHB0aHJlYWRzIGluIGd0ZXN0LiIgT0ZGKQorCisjIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLgoraW5jbHVkZShjbWFrZS9oZXJtZXRpY19idWlsZC5jbWFrZSBPUFRJT05BTCkKKworaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQorICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUHJvamVjdC13aWRlIHNldHRpbmdzCisKKyMgTmFtZSBvZiB0aGUgcHJvamVjdC4KKyMKKyMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5CisjIGFzICR7Z3Rlc3RfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMKKyMgJHtndGVzdF9CSU5BUllfRElSfS4KKyMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuCitwcm9qZWN0KGd0ZXN0IENYWCBDKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4yKQorCitpZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpCisgIHNldF91cF9oZXJtZXRpY19idWlsZCgpCitlbmRpZigpCisKKyMgRGVmaW5lIGhlbHBlciBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIGJ5IEdvb2dsZSBUZXN0LgoraW5jbHVkZShjbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSkKKworY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBEZWZpbmVkIGluIGludGVybmFsX3V0aWxzLmNtYWtlLgorCisjIFdoZXJlIEdvb2dsZSBUZXN0J3MgLmggZmlsZXMgY2FuIGJlIGZvdW5kLgoraW5jbHVkZV9kaXJlY3RvcmllcygKKyAgJHtndGVzdF9TT1VSQ0VfRElSfS9pbmNsdWRlCisgICR7Z3Rlc3RfU09VUkNFX0RJUn0pCisKKyMgV2hlcmUgR29vZ2xlIFRlc3QncyBsaWJyYXJpZXMgY2FuIGJlIGZvdW5kLgorbGlua19kaXJlY3Rvcmllcygke2d0ZXN0X0JJTkFSWV9ESVJ9L3NyYykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERlZmluZXMgdGhlIGd0ZXN0ICYgZ3Rlc3RfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCisjIHdpdGggb25lIG9mIHRoZW0uCisKKyMgR29vZ2xlIFRlc3QgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQKKyMgYXJlIHVzZWQgZm9yIG90aGVyIHRhcmdldHMsIHRvIGVuc3VyZSB0aGF0IGd0ZXN0IGNhbiBiZSBjb21waWxlZCBieSBhIHVzZXIKKyMgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4KK2N4eF9saWJyYXJ5KGd0ZXN0ICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3QtYWxsLmNjKQorY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbiAiJHtjeHhfc3RyaWN0fSIgc3JjL2d0ZXN0X21haW4uY2MpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ3Rlc3RfbWFpbiBndGVzdCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNhbXBsZXMgb24gaG93IHRvIGxpbmsgdXNlciB0ZXN0cyB3aXRoIGd0ZXN0IG9yIGd0ZXN0X21haW4uCisjCisjIFRoZXkgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQorIyBndGVzdF9idWlsZF9zYW1wbGVzIG9wdGlvbiB0byBPTi4gIFlvdSBjYW4gZG8gaXQgYnkgcnVubmluZyBjY21ha2UKKyMgb3Igc3BlY2lmeWluZyB0aGUgLURidWlsZF9ndGVzdF9zYW1wbGVzPU9OIGZsYWcgd2hlbiBydW5uaW5nIGNtYWtlLgorCitpZiAoZ3Rlc3RfYnVpbGRfc2FtcGxlcykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlMV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4gc2FtcGxlcy9zYW1wbGUxLmNjKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGUyX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTIuY2MpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTNfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU0X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTQuY2MpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTVfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlMS5jYykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlNl91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTdfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU4X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlOV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0KQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGUxMF91bml0dGVzdCBzYW1wbGVzIGd0ZXN0KQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgR29vZ2xlIFRlc3QncyBvd24gdGVzdHMuCisjCisjIFlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRlc3RpbmcKKyMgR29vZ2xlIFRlc3QgaXRzZWxmLgorIworIyBUaGUgdGVzdHMgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQorIyBndGVzdF9idWlsZF90ZXN0cyBvcHRpb24gdG8gT04uICBZb3UgY2FuIGRvIGl0IGJ5IHJ1bm5pbmcgY2NtYWtlCisjIG9yIHNwZWNpZnlpbmcgdGhlIC1EZ3Rlc3RfYnVpbGRfdGVzdHM9T04gZmxhZyB3aGVuIHJ1bm5pbmcgY21ha2UuCisKK2lmIChndGVzdF9idWlsZF90ZXN0cykKKyAgIyBUaGlzIG11c3QgYmUgc2V0IGluIHRoZSByb290IGRpcmVjdG9yeSBmb3IgdGhlIHRlc3RzIHRvIGJlIHJ1biBieQorICAjICdtYWtlIHRlc3QnIG9yIGN0ZXN0LgorICBlbmFibGVfdGVzdGluZygpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCisKKyAgY3h4X3Rlc3QoZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X2Vudmlyb25tZW50X3Rlc3QgZ3Rlc3QpCisgIGN4eF90ZXN0KGd0ZXN0LWZpbGVwYXRoX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtbGlua2VkX3B0cl90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0LWxpc3RlbmVyX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfbWFpbl91bml0dGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC1tZXNzYWdlX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3Qtb3B0aW9uc190ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0LXBhcmFtLXRlc3RfdGVzdCBndGVzdAorICAgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYykKKyAgY3h4X3Rlc3QoZ3Rlc3QtcG9ydF90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3ByZWRfaW1wbF91bml0dGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC1wcmludGVyc190ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3Byb2RfdGVzdCBndGVzdF9tYWluCisgICAgdGVzdC9wcm9kdWN0aW9uLmNjKQorICBjeHhfdGVzdChndGVzdF9yZXBlYXRfdGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF9zdHJlc3NfdGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdC10eXBlZC10ZXN0X3Rlc3QgZ3Rlc3RfbWFpbgorICAgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYykKKyAgY3h4X3Rlc3QoZ3Rlc3RfdW5pdHRlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QgZ3Rlc3QpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggbm9uLXN0YW5kYXJkIGNvbXBpbGVyIGZsYWdzLgorCisgIGN4eF9saWJyYXJ5KGd0ZXN0X25vX2V4Y2VwdGlvbiAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKKyAgICBzcmMvZ3Rlc3QtYWxsLmNjKQorICBjeHhfbGlicmFyeShndGVzdF9tYWluX25vX2V4Y2VwdGlvbiAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKKyAgICBzcmMvZ3Rlc3QtYWxsLmNjIHNyYy9ndGVzdF9tYWluLmNjKQorICBjeHhfbGlicmFyeShndGVzdF9tYWluX25vX3J0dGkgIiR7Y3h4X25vX3J0dGl9IgorICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCisKKyAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdC1kZWF0aC10ZXN0X2V4X25vY2F0Y2hfdGVzdAorICAgICIke2N4eF9leGNlcHRpb259IC1ER1RFU1RfRU5BQkxFX0NBVENIX0VYQ0VQVElPTlNfPTAiCisgICAgZ3Rlc3QgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MpCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3QtZGVhdGgtdGVzdF9leF9jYXRjaF90ZXN0CisgICAgIiR7Y3h4X2V4Y2VwdGlvbn0gLURHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU189MSIKKyAgICBndGVzdCB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYykKKworICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0X25vX3J0dGlfdW5pdHRlc3QgIiR7Y3h4X25vX3J0dGl9IgorICAgIGd0ZXN0X21haW5fbm9fcnR0aSB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjKQorCisgIGN4eF9zaGFyZWRfbGlicmFyeShndGVzdF9kbGwgIiR7Y3h4X2RlZmF1bHR9IgorICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCisKKyAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhndGVzdF9kbGxfdGVzdF8gIiR7Y3h4X2RlZmF1bHR9IgorICAgIGd0ZXN0X2RsbCB0ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3RfZGxsX3Rlc3RfCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCisKKyAgaWYgKE5PVCBNU1ZDIE9SIE5PVCBNU1ZDX1ZFUlNJT04gRVFVQUwgMTYwMCkKKyAgICAjIFRoZSBDKysgU3RhbmRhcmQgc3BlY2lmaWVzIHR1cGxlX2VsZW1lbnQ8aW50LCBjbGFzcz4uCisgICAgIyBZZXQgTVNWQyAxMCdzIDx1dGlsaXR5PiBkZWNsYXJlcyB0dXBsZV9lbGVtZW50PHNpemVfdCwgY2xhc3M+LgorICAgICMgVGhhdCBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2l0aCBvdXIgb3duIHN0YW5kYXJkLWNvbmZvcm1pbmcKKyAgICAjIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgd2l0aAorICAgICMgTVNWQyAxMCBkb2Vzbid0IGNvbXBpbGUuCisgICAgY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbl91c2Vfb3duX3R1cGxlICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCisKKyAgICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0LXR1cGxlX3Rlc3QgIiR7Y3h4X3VzZV9vd25fdHVwbGV9IgorICAgICAgZ3Rlc3RfbWFpbl91c2Vfb3duX3R1cGxlIHRlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYykKKworICAgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3RfdXNlX293bl90dXBsZV90ZXN0ICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgIGd0ZXN0X21haW5fdXNlX293bl90dXBsZQorICAgICAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjKQorICBlbmRpZigpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgUHl0aG9uIHRlc3RzLgorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdCkKKworICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKAorICAgIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfbm9fZXhfdGVzdF8KKyAgICAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKKyAgICBndGVzdF9tYWluX25vX2V4Y2VwdGlvbgorICAgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYykKKyAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygKKyAgICBndGVzdF9jYXRjaF9leGNlcHRpb25zX2V4X3Rlc3RfCisgICAgIiR7Y3h4X2V4Y2VwdGlvbn0iCisgICAgZ3Rlc3RfbWFpbgorICAgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYykKKyAgcHlfdGVzdChndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfY29sb3JfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9jb2xvcl90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2Vudl92YXJfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9lbnZfdmFyX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X2ZpbHRlcl91bml0dGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9oZWxwX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgcHlfdGVzdChndGVzdF9oZWxwX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X291dHB1dF90ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X291dHB1dF90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3NodWZmbGVfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9zaHVmZmxlX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XyB0ZXN0IGd0ZXN0X25vX2V4Y2VwdGlvbikKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8KKyAgICBQUk9QRVJUSUVTCisgICAgQ09NUElMRV9GTEFHUyAiJHtjeHhfbm9fZXhjZXB0aW9ufSIpCisgIHB5X3Rlc3QoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF91bmluaXRpYWxpemVkX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgcHlfdGVzdChndGVzdF94bWxfb3V0ZmlsZXNfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvQ09OVFJJQlVUT1JTIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL0NPTlRSSUJVVE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFlMmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL0NPTlRSSUJVVE9SUwpAQCAtMCwwICsxLDM3IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgcGVvcGxlIHdobyd2ZSBtYWRlIG5vbi10cml2aWFsCisjIGNvbnRyaWJ1dGlvbiB0byB0aGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBwcm9qZWN0LiAgUGVvcGxlCisjIHdobyBjb21taXQgY29kZSB0byB0aGUgcHJvamVjdCBhcmUgZW5jb3VyYWdlZCB0byBhZGQgdGhlaXIgbmFtZXMKKyMgaGVyZS4gIFBsZWFzZSBrZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBmaXJzdCBuYW1lcy4KKworQWpheSBKb3NoaSA8amFqQGdvb2dsZS5jb20+CitCYWzDoXpzIETDoW4gPGJhbGF6cy5kYW5AZ21haWwuY29tPgorQmhhcmF0IE1lZGlyYXR0YSA8YmhhcmF0QG1lbmFsdG8uY29tPgorQ2hhbmRsZXIgQ2FycnV0aCA8Y2hhbmRsZXJjQGdvb2dsZS5jb20+CitDaHJpcyBQcmluY2UgPGNwcmluY2VAZ29vZ2xlLmNvbT4KK0NocmlzIFRheWxvciA8dGF5bG9yY0Bnb29nbGUuY29tPgorRGFuIEVnbm9yIDxlZ25vckBnb29nbGUuY29tPgorRXJpYyBSb21hbiA8ZXJvbWFuQGNocm9taXVtLm9yZz4KK0hhZHkgWmFsZWsgPGhhZHkuemFsZWtAZ21haWwuY29tPgorSmVmZnJleSBZYXNza2luIDxqeWFzc2tpbkBnb29nbGUuY29tPgorSsOzaSBTaWd1csOwc3NvbiA8am9pQGdvb2dsZS5jb20+CitLZWlyIE1pZXJsZSA8bWllcmxlQGdtYWlsLmNvbT4KK0tlaXRoIFJheSA8a2VpdGgucmF5QGdtYWlsLmNvbT4KK0tlbnRvbiBWYXJkYSA8a2VudG9uQGdvb2dsZS5jb20+CitNYW51ZWwgS2xpbWVrIDxrbGltZWtAZ29vZ2xlLmNvbT4KK01hcmt1cyBIZXVsZSA8bWFya3VzLmhldWxlQGdtYWlsLmNvbT4KK01pa2EgUmFlbnRvIDxtaWtpZUBpa2kuZmk+CitNaWtsw7NzIEZhemVrYXMgPG1mYXpla2FzQHN6ZW1hZm9yLmNvbT4KK1Bhc2kgVmFsbWluZW4gPHBhc2kudmFsbWluZW5AZ21haWwuY29tPgorUGF0cmljayBIYW5uYSA8cGhhbm5hQGdvb2dsZS5jb20+CitQYXRyaWNrIFJpbGV5IDxwZnJAZ29vZ2xlLmNvbT4KK1BldGVyIEthbWluc2tpIDxwaW90cmtAZ29vZ2xlLmNvbT4KK1ByZXN0b24gSmFja3NvbiA8cHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tPgorUmFpbmVyIEtsYWZmZW5ib2VjayA8cmFpbmVyLmtsYWZmZW5ib2Vja0BkeW5hdHJhY2UuY29tPgorUnVzcyBDb3ggPHJzY0Bnb29nbGUuY29tPgorUnVzcyBSdWZlciA8cnVzc0BwZW50YWQuY29tPgorU2VhbiBNY2FmZWUgPGVlZmFjbUBnbWFpbC5jb20+CitTaWd1csOwdXIgw4FzZ2VpcnNzb24gPHNpZ2dpQGdvb2dsZS5jb20+CitUcmFjeSBCaWFsaWsgPHRyYWN5QHBlbnRhZC5jb20+CitWYWRpbSBCZXJtYW4gPHZhZGltYkBnb29nbGUuY29tPgorVmxhZCBMb3NldiA8dmxhZGxAZ29vZ2xlLmNvbT4KK1poYW55b25nIFdhbiA8d2FuQGdvb2dsZS5jb20+CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvQ09QWUlORyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDFhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvQ09QWUlORwpAQCAtMCwwICsxLDI4IEBACitDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgoraW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvTWFrZWZpbGUuYW0gYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNTBiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwMiBAQAorIyBBdXRvbWFrZSBmaWxlCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CisKKyMgTm9uc3RhbmRhcmQgcGFja2FnZSBmaWxlcyBmb3IgZGlzdHJpYnV0aW9uCitFWFRSQV9ESVNUID0gXAorICBDSEFOR0VTIFwKKyAgQ09OVFJJQlVUT1JTIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oLnB1bXAgXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgXAorICBtYWtlL01ha2VmaWxlIFwKKyAgc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IFwKKyAgc2NyaXB0cy9nZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IFwKKyAgc2NyaXB0cy9wdW1wLnB5IFwKKyAgc2NyaXB0cy90ZXN0L01ha2VmaWxlCisKKyMgZ3Rlc3Qgc291cmNlIGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZSBkaXJlY3RseS4gIFRoZXkgYXJlCisjICNpbmNsdWRlZCBieSBndGVzdC1hbGwuY2MuCitHVEVTVF9TUkMgPSBcCisgIHNyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIFwKKyAgc3JjL2d0ZXN0LWZpbGVwYXRoLmNjIFwKKyAgc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIFwKKyAgc3JjL2d0ZXN0LXBvcnQuY2MgXAorICBzcmMvZ3Rlc3QtcHJpbnRlcnMuY2MgXAorICBzcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjIFwKKyAgc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MgXAorICBzcmMvZ3Rlc3QuY2MKKworRVhUUkFfRElTVCArPSAkKEdURVNUX1NSQykKKworIyBTYW1wbGUgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlLgorRVhUUkFfRElTVCArPSBcCisgIHNhbXBsZXMvcHJpbWVfdGFibGVzLmggXAorICBzYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTVfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MKKworIyBDKysgdGVzdCBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuCitFWFRSQV9ESVNUICs9IFwKKyAgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIFwKKyAgdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oIFwKKyAgdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9oZWxwX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfbWFpbl91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjIFwKKyAgdGVzdC9wcm9kdWN0aW9uLmNjIFwKKyAgdGVzdC9wcm9kdWN0aW9uLmgKKworIyBQeXRob24gdGVzdHMgdGhhdCB3ZSBkb24ndCBydW4uCitFWFRSQV9ESVNUICs9IFwKKyAgdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2NvbG9yX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3QucHkgXAorICB0ZXN0L2d0ZXN0X291dHB1dF90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dCBcCisgIHRlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF90ZXN0X3V0aWxzLnB5IFwKKyAgdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3htbF90ZXN0X3V0aWxzLnB5CisKKyMgQ01ha2Ugc2NyaXB0CitFWFRSQV9ESVNUICs9IFwKKyAgQ01ha2VMaXN0cy50eHQgXAorICBjbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQorCisjIE1TVkMgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIG1zdmMvZ3Rlc3QtbWQuc2xuIFwKKyAgbXN2Yy9ndGVzdC1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0LnNsbiBcCisgIG1zdmMvZ3Rlc3QudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvaiBcCisgIG1zdmMvZ3Rlc3RfbWFpbi52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvaiBcCisgIG1zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qCisKKyMgeGNvZGUgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIHhjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvUmVsZWFzZVByb2plY3QueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyBcCisgIHhjb2RlL0NvbmZpZy9UZXN0VGFyZ2V0LnhjY29uZmlnIFwKKyAgeGNvZGUvUmVzb3VyY2VzL0luZm8ucGxpc3QgXAorICB4Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoIFwKKyAgeGNvZGUvU2NyaXB0cy92ZXJzaW9uZ2VuZXJhdGUucHkgXAorICB4Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisKKyMgeGNvZGUgc2FtcGxlIGZpbGVzCitFWFRSQV9ESVNUICs9IFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdCBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2ggXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MgXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaCBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCisKKyMgQysrQnVpbGRlciBwcm9qZWN0IGZpbGVzCitFWFRSQV9ESVNUICs9IFwKKyAgY29kZWdlYXIvZ3Rlc3QuY2Jwcm9qIFwKKyAgY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qIFwKKyAgY29kZWdlYXIvZ3Rlc3RfYWxsLmNjIFwKKyAgY29kZWdlYXIvZ3Rlc3RfbGluay5jYyBcCisgIGNvZGVnZWFyL2d0ZXN0X21haW4uY2Jwcm9qIFwKKyAgY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCisKKyMgRGlzdHJpYnV0ZSBhbmQgaW5zdGFsbCBNNCBtYWNybworbTRkYXRhZGlyID0gJChkYXRhZGlyKS9hY2xvY2FsCittNGRhdGFfREFUQSA9IG00L2d0ZXN0Lm00CitFWFRSQV9ESVNUICs9ICQobTRkYXRhX0RBVEEpCisKKyMgV2UgZGVmaW5lIHRoZSBnbG9iYWwgQU1fQ1BQRkxBR1MgYXMgZXZlcnl0aGluZyB3ZSBjb21waWxlIGluY2x1ZGVzIGZyb20gdGhlc2UKKyMgZGlyZWN0b3JpZXMuCitBTV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpIC1JJChzcmNkaXIpL2luY2x1ZGUKKworIyBNb2RpZmllcyBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGZvciBwdGhyZWFkcyBjb21wYXRpYmlsaXR5LgoraWYgSEFWRV9QVEhSRUFEUworICBBTV9DWFhGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AgLURHVEVTVF9IQVNfUFRIUkVBRD0xCisgIEFNX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorZWxzZQorICBBTV9DWFhGTEFHUyA9IC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorZW5kaWYKKworIyBCdWlsZCBydWxlcyBmb3IgbGlicmFyaWVzLgorbGliX0xUTElCUkFSSUVTID0gbGliL2xpYmd0ZXN0LmxhIGxpYi9saWJndGVzdF9tYWluLmxhCisKK2xpYl9saWJndGVzdF9sYV9TT1VSQ0VTID0gc3JjL2d0ZXN0LWFsbC5jYworCitwa2dpbmNsdWRlX0hFQURFUlMgPSBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKKworcGtnaW5jbHVkZV9pbnRlcm5hbGRpciA9ICQocGtnaW5jbHVkZWRpcikvaW50ZXJuYWwKK3BrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUyA9IFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaAorCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9TT1VSQ0VTID0gc3JjL2d0ZXN0X21haW4uY2MKK2xpYl9saWJndGVzdF9tYWluX2xhX0xJQkFERCA9IGxpYi9saWJndGVzdC5sYQorCisjIEJ1bGlkIHJ1bGVzIGZvciBzYW1wbGVzIGFuZCB0ZXN0cy4gQXV0b21ha2UncyBuYW1pbmcgZm9yIHNvbWUgb2YKKyMgdGhlc2UgdmFyaWFibGVzIGlzbid0IHRlcnJpYmx5IG9idmlvdXMsIHNvIHRoaXMgaXMgYSBicmllZgorIyByZWZlcmVuY2U6CisjCisjIFRFU1RTIC0tIFByb2dyYW1zIHJ1biBhdXRvbWF0aWNhbGx5IGJ5ICJtYWtlIGNoZWNrIgorIyBjaGVja19QUk9HUkFNUyAtLSBQcm9ncmFtcyBidWlsdCBieSAibWFrZSBjaGVjayIgYnV0IG5vdCBuZWNlc3NhcmlseSBydW4KKworbm9pbnN0X0xUTElCUkFSSUVTID0gc2FtcGxlcy9saWJzYW1wbGVzLmxhCisKK3NhbXBsZXNfbGlic2FtcGxlc19sYV9TT1VSQ0VTID0gXAorICBzYW1wbGVzL3NhbXBsZTEuY2MgXAorICBzYW1wbGVzL3NhbXBsZTEuaCBcCisgIHNhbXBsZXMvc2FtcGxlMi5jYyBcCisgIHNhbXBsZXMvc2FtcGxlMi5oIFwKKyAgc2FtcGxlcy9zYW1wbGUzLWlubC5oIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmgKKworVEVTVFM9CitURVNUU19FTlZJUk9OTUVOVCA9IEdURVNUX1NPVVJDRV9ESVI9IiQoc3JjZGlyKS90ZXN0IiBcCisgICAgICAgICAgICAgICAgICAgIEdURVNUX0JVSUxEX0RJUj0iJCh0b3BfYnVpbGRkaXIpL3Rlc3QiCitjaGVja19QUk9HUkFNUz0KKworIyBBIHNpbXBsZSBzYW1wbGUgb24gdXNpbmcgZ3Rlc3QuCitURVNUUyArPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QKK2NoZWNrX1BST0dSQU1TICs9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdAorc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X1NPVVJDRVMgPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKK3NhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9MREFERCA9IGxpYi9saWJndGVzdF9tYWluLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYi9saWJndGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzL2xpYnNhbXBsZXMubGEKKworIyBBbm90aGVyIHNhbXBsZS4gIEl0IGFsc28gdmVyaWZpZXMgdGhhdCBsaWJndGVzdCB3b3Jrcy4KK1RFU1RTICs9IHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QKK2NoZWNrX1BST0dSQU1TICs9IHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QKK3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfU09VUkNFUyA9IHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuY2MKK3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfTERBREQgPSBsaWIvbGliZ3Rlc3QubGEKKworIyBUaGlzIHRlc3RzIG1vc3QgY29uc3RydWN0cyBvZiBndGVzdCBhbmQgdmVyaWZpZXMgdGhhdCBsaWJndGVzdF9tYWluCisjIGFuZCBsaWJndGVzdCB3b3JrLgorVEVTVFMgKz0gdGVzdC9ndGVzdF9hbGxfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gdGVzdC9ndGVzdF9hbGxfdGVzdAordGVzdF9ndGVzdF9hbGxfdGVzdF9TT1VSQ0VTID0gdGVzdC9ndGVzdF9hbGxfdGVzdC5jYwordGVzdF9ndGVzdF9hbGxfdGVzdF9MREFERCA9IGxpYi9saWJndGVzdF9tYWluLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWIvbGliZ3Rlc3QubGEKKworIyBUZXN0cyB0aGF0IGZ1c2VkIGd0ZXN0IGZpbGVzIGNvbXBpbGUgYW5kIHdvcmsuCitGVVNFRF9HVEVTVF9TUkMgPSBcCisgIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MgXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCBcCisgIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjCisKK1RFU1RTICs9IHRlc3QvZnVzZWRfZ3Rlc3RfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gdGVzdC9mdXNlZF9ndGVzdF90ZXN0Cit0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUyA9ICQoRlVTRURfR1RFU1RfU1JDKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvc2FtcGxlMS5jYyBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKK3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUyA9IC1JIiQoc3JjZGlyKS9mdXNlZC1zcmMiCisKKyMgQnVpbGQgcnVsZXMgZm9yIHB1dHRpbmcgZnVzZWQgR29vZ2xlIFRlc3QgZmlsZXMgaW50byB0aGUgZGlzdHJpYnV0aW9uCisjIHBhY2thZ2UuIFRoZSB1c2VyIGNhbiBhbHNvIGNyZWF0ZSB0aG9zZSBmaWxlcyBieSBtYW51YWxseSBydW5uaW5nCisjIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weS4KKyQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X1NPVVJDRVMpOiBmdXNlZC1ndGVzdAorCitmdXNlZC1ndGVzdDogJChwa2dpbmNsdWRlX0hFQURFUlMpICQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSBcCisgICAgICAgICAgICAgJChHVEVTVF9TUkMpIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MgXAorICAgICAgICAgICAgIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weQorCW1rZGlyIC1wICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCWNobW9kIC1SIHUrdyAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKwlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MiCisJcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCIKKwkiJChzcmNkaXIpL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSIgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCisJY3AgLWYgIiQoc3JjZGlyKS9zcmMvZ3Rlc3RfbWFpbi5jYyIgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvIgorCittYWludGFpbmVyLWNsZWFuLWxvY2FsOgorCXJtIC1yZiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBEZWF0aCB0ZXN0cyBtYXkgcHJvZHVjZSBjb3JlIGR1bXBzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIEluIGNhc2UKKyMgdGhpcyBoYXBwZW5zLCBjbGVhbiB0aGVtIHRvIGtlZXAgZGlzdGNsZWFuY2hlY2sgaGFwcHkuCitDTEVBTkZJTEVTID0gY29yZQorCisjIERpc2FibGVzICdtYWtlIGluc3RhbGwnIGFzIGluc3RhbGxpbmcgYSBjb21waWxlZCB2ZXJzaW9uIG9mIEdvb2dsZQorIyBUZXN0IGNhbiBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBkdWUgdG8gdmlvbGF0aW9uIG9mIHRoZQorIyBPbmUtRGVmaW5pdGlvbiBSdWxlLgorCitpbnN0YWxsLWV4ZWMtbG9jYWw6CisJZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0IGludG8geW91ciBidWlsZCBzeXN0ZW0uIgorCWZhbHNlCisKK2luc3RhbGwtZGF0YS1sb2NhbDoKKwllY2hvICInbWFrZSBpbnN0YWxsJyBpcyBkYW5nZXJvdXMgYW5kIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIHNlZSBSRUFETUUgZm9yIGhvdyB0byBpbnRlZ3JhdGUgR29vZ2xlIFRlc3QgaW50byB5b3VyIGJ1aWxkIHN5c3RlbS4iCisJZmFsc2UKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9SRUFETUUgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTkzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvUkVBRE1FCkBAIC0wLDAgKzEsNDI0IEBACitHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LworCitPdmVydmlldworLS0tLS0tLS0KKworR29vZ2xlJ3MgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyB0ZXN0cyBvbiBhIHZhcmlldHkgb2YgcGxhdGZvcm1zCisoTGludXgsIE1hYyBPUyBYLCBXaW5kb3dzLCBXaW5kb3dzIENFLCBTeW1iaWFuLCBldGMpLiAgQmFzZWQgb24gdGhlCit4VW5pdCBhcmNoaXRlY3R1cmUuICBTdXBwb3J0cyBhdXRvbWF0aWMgdGVzdCBkaXNjb3ZlcnksIGEgcmljaCBzZXQgb2YKK2Fzc2VydGlvbnMsIHVzZXItZGVmaW5lZCBhc3NlcnRpb25zLCBkZWF0aCB0ZXN0cywgZmF0YWwgYW5kIG5vbi1mYXRhbAorZmFpbHVyZXMsIHZhcmlvdXMgb3B0aW9ucyBmb3IgcnVubmluZyB0aGUgdGVzdHMsIGFuZCBYTUwgdGVzdCByZXBvcnQKK2dlbmVyYXRpb24uCisKK1BsZWFzZSBzZWUgdGhlIHByb2plY3QgcGFnZSBhYm92ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHRoZQorbWFpbGluZyBsaXN0IGZvciBxdWVzdGlvbnMsIGRpc2N1c3Npb25zLCBhbmQgZGV2ZWxvcG1lbnQuICBUaGVyZSBpcworYWxzbyBhbiBJUkMgY2hhbm5lbCBvbiBPRlRDIChpcmMub2Z0Yy5uZXQpICNndGVzdCBhdmFpbGFibGUuICBQbGVhc2UKK2pvaW4gdXMhCisKK1JlcXVpcmVtZW50cyBmb3IgRW5kIFVzZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB0byBoYXZlIGZhaXJseSBtaW5pbWFsIHJlcXVpcmVtZW50cyB0byBidWlsZAorYW5kIHVzZSB3aXRoIHlvdXIgcHJvamVjdHMsIGJ1dCB0aGVyZSBhcmUgc29tZS4gIEN1cnJlbnRseSwgd2Ugc3VwcG9ydAorTGludXgsIFdpbmRvd3MsIE1hYyBPUyBYLCBhbmQgQ3lnd2luLiAgV2Ugd2lsbCBhbHNvIG1ha2Ugb3VyIGJlc3QKK2VmZm9ydCB0byBzdXBwb3J0IG90aGVyIHBsYXRmb3JtcyAoZS5nLiBTb2xhcmlzLCBBSVgsIGFuZCB6L09TKS4KK0hvd2V2ZXIsIHNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdCBoYXZlIG5vIGFjY2VzcwordG8gdGhlc2UgcGxhdGZvcm1zLCBHb29nbGUgVGVzdCBtYXkgaGF2ZSBvdXRzdGFuZGluZyBpc3N1ZXMgdGhlcmUuICBJZgoreW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQorZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLiAgUGF0Y2hlcyBmb3IgZml4aW5nIHRoZW0gYXJlCitldmVuIG1vcmUgd2VsY29tZSEKKworIyMjIExpbnV4IFJlcXVpcmVtZW50cyAjIyMKKworVGhlc2UgYXJlIHRoZSBiYXNlIHJlcXVpcmVtZW50cyB0byBidWlsZCBhbmQgdXNlIEdvb2dsZSBUZXN0IGZyb20gYSBzb3VyY2UKK3BhY2thZ2UgKGFzIGRlc2NyaWJlZCBiZWxvdyk6CisgICogR05VLWNvbXBhdGlibGUgTWFrZSBvciBnbWFrZQorICAqIFBPU0lYLXN0YW5kYXJkIHNoZWxsCisgICogUE9TSVgoLTIpIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKHJlZ2V4LmgpCisgICogQSBDKys5OC1zdGFuZGFyZC1jb21wbGlhbnQgY29tcGlsZXIKKworIyMjIFdpbmRvd3MgUmVxdWlyZW1lbnRzICMjIworCisgICogTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4xIG9yIG5ld2VyCisKKyMjIyBDeWd3aW4gUmVxdWlyZW1lbnRzICMjIworCisgICogQ3lnd2luIDEuNS4yNS0xNCBvciBuZXdlcgorCisjIyMgTWFjIE9TIFggUmVxdWlyZW1lbnRzICMjIworCisgICogTWFjIE9TIFggMTAuNCBUaWdlciBvciBuZXdlcgorICAqIERldmVsb3BlciBUb29scyBJbnN0YWxsZWQKKworQWxzbywgeW91J2xsIG5lZWQgQ01ha2UgMi42LjQgb3IgaGlnaGVyIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZQorc2FtcGxlcyB1c2luZyB0aGUgcHJvdmlkZWQgQ01ha2Ugc2NyaXB0LCByZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybS4KKworUmVxdWlyZW1lbnRzIGZvciBDb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gIElmIHlvdSBwbGFuIHRvIGNvbnRyaWJ1dGUgYSBwYXRjaCwgeW91IG5lZWQgdG8KK2J1aWxkIEdvb2dsZSBUZXN0IGFuZCBpdHMgb3duIHRlc3RzIGZyb20gYW4gU1ZOIGNoZWNrb3V0IChkZXNjcmliZWQKK2JlbG93KSwgd2hpY2ggaGFzIGZ1cnRoZXIgcmVxdWlyZW1lbnRzOgorCisgICogUHl0aG9uIHZlcnNpb24gMi4zIG9yIG5ld2VyIChmb3IgcnVubmluZyBzb21lIG9mIHRoZSB0ZXN0cyBhbmQKKyAgICByZS1nZW5lcmF0aW5nIGNlcnRhaW4gc291cmNlIGZpbGVzIGZyb20gdGVtcGxhdGVzKQorICAqIENNYWtlIDIuNi40IG9yIG5ld2VyCisKK0dldHRpbmcgdGhlIFNvdXJjZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSB0d28gcHJpbWFyeSB3YXlzIG9mIGdldHRpbmcgR29vZ2xlIFRlc3QncyBzb3VyY2UgY29kZTogeW91CitjYW4gZG93bmxvYWQgYSBzdGFibGUgc291cmNlIHJlbGVhc2UgaW4geW91ciBwcmVmZXJyZWQgYXJjaGl2ZSBmb3JtYXQsCitvciBkaXJlY3RseSBjaGVjayBvdXQgdGhlIHNvdXJjZSBmcm9tIG91ciBTdWJ2ZXJzaW9uIChTVk4pIHJlcG9zaXRhcnkuCitUaGUgU1ZOIGNoZWNrb3V0IHJlcXVpcmVzIGEgZmV3IGV4dHJhIHN0ZXBzIGFuZCBzb21lIGV4dHJhIHNvZnR3YXJlCitwYWNrYWdlcyBvbiB5b3VyIHN5c3RlbSwgYnV0IGxldHMgeW91IHRyYWNrIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgYW5kCittYWtlIHBhdGNoZXMgbXVjaCBtb3JlIGVhc2lseSwgc28gd2UgaGlnaGx5IGVuY291cmFnZSBpdC4KKworIyMjIFNvdXJjZSBQYWNrYWdlICMjIworCitHb29nbGUgVGVzdCBpcyByZWxlYXNlZCBpbiB2ZXJzaW9uZWQgc291cmNlIHBhY2thZ2VzIHdoaWNoIGNhbiBiZQorZG93bmxvYWRlZCBmcm9tIHRoZSBkb3dubG9hZCBwYWdlIFsxXS4gIFNldmVyYWwgZGlmZmVyZW50IGFyY2hpdmUKK2Zvcm1hdHMgYXJlIHByb3ZpZGVkLCBidXQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgdG9vbHMgdXNlZCB0bworbWFuaXB1bGF0ZSB0aGVtLCBhbmQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBmaWxlLiAgRG93bmxvYWQKK3doaWNoZXZlciB5b3UgYXJlIG1vc3QgY29tZm9ydGFibGUgd2l0aC4KKworICBbMV0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvZG93bmxvYWRzL2xpc3QKKworT25jZSB0aGUgcGFja2FnZSBpcyBkb3dubG9hZGVkLCBleHBhbmQgaXQgdXNpbmcgd2hpY2hldmVyIHRvb2xzIHlvdQorcHJlZmVyIGZvciB0aGF0IHR5cGUuICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZQorbmFtZSAiZ3Rlc3QtWC5ZLloiIHdoaWNoIGNvbnRhaW5zIGFsbCBvZiB0aGUgc291cmNlIGNvZGUuICBIZXJlIGFyZQorc29tZSBleGFtcGxlcyBvbiBMaW51eDoKKworICB0YXIgLXh2emYgZ3Rlc3QtWC5ZLloudGFyLmd6CisgIHRhciAteHZqZiBndGVzdC1YLlkuWi50YXIuYnoyCisgIHVuemlwIGd0ZXN0LVguWS5aLnppcAorCisjIyMgU1ZOIENoZWNrb3V0ICMjIworCitUbyBjaGVjayBvdXQgdGhlIG1haW4gYnJhbmNoIChhbHNvIGtub3duIGFzIHRoZSAidHJ1bmsiKSBvZiBHb29nbGUKK1Rlc3QsIHJ1biB0aGUgZm9sbG93aW5nIFN1YnZlcnNpb24gY29tbWFuZDoKKworICBzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBndGVzdC1zdm4KKworU2V0dGluZyB1cCB0aGUgQnVpbGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGJ1aWxkIEdvb2dsZSBUZXN0IGFuZCB5b3VyIHRlc3RzIHRoYXQgdXNlIGl0LCB5b3UgbmVlZCB0byB0ZWxsIHlvdXIKK2J1aWxkIHN5c3RlbSB3aGVyZSB0byBmaW5kIGl0cyBoZWFkZXJzIGFuZCBzb3VyY2UgZmlsZXMuICBUaGUgZXhhY3QKK3dheSB0byBkbyBpdCBkZXBlbmRzIG9uIHdoaWNoIGJ1aWxkIHN5c3RlbSB5b3UgdXNlLCBhbmQgaXMgdXN1YWxseQorc3RyYWlnaHRmb3J3YXJkLgorCisjIyMgR2VuZXJpYyBCdWlsZCBJbnN0cnVjdGlvbnMgIyMjCisKK1N1cHBvc2UgeW91IHB1dCBHb29nbGUgVGVzdCBpbiBkaXJlY3RvcnkgJHtHVEVTVF9ESVJ9LiAgVG8gYnVpbGQgaXQsCitjcmVhdGUgYSBsaWJyYXJ5IGJ1aWxkIHRhcmdldCAob3IgYSBwcm9qZWN0IGFzIGNhbGxlZCBieSBWaXN1YWwgU3R1ZGlvCithbmQgWGNvZGUpIHRvIGNvbXBpbGUKKworICAke0dURVNUX0RJUn0vc3JjL2d0ZXN0LWFsbC5jYworCit3aXRoCisKKyAgJHtHVEVTVF9ESVJ9L2luY2x1ZGUgYW5kICR7R1RFU1RfRElSfQorCitpbiB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoLiAgQXNzdW1pbmcgYSBMaW51eC1saWtlIHN5c3RlbSBhbmQgZ2NjLAorc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB3aWxsIGRvOgorCisgIGcrKyAtSSR7R1RFU1RfRElSfS9pbmNsdWRlIC1JJHtHVEVTVF9ESVJ9IC1jICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCisgIGFyIC1ydiBsaWJndGVzdC5hIGd0ZXN0LWFsbC5vCisKK05leHQsIHlvdSBzaG91bGQgY29tcGlsZSB5b3VyIHRlc3Qgc291cmNlIGZpbGUgd2l0aAorJHtHVEVTVF9ESVJ9L2luY2x1ZGUgaW4gdGhlIGhlYWRlciBzZWFyY2ggcGF0aCwgYW5kIGxpbmsgaXQgd2l0aCBndGVzdAorYW5kIGFueSBvdGhlciBuZWNlc3NhcnkgbGlicmFyaWVzOgorCisgIGcrKyAtSSR7R1RFU1RfRElSfS9pbmNsdWRlIHBhdGgvdG8veW91cl90ZXN0LmNjIGxpYmd0ZXN0LmEgLW8geW91cl90ZXN0CisKK0FzIGFuIGV4YW1wbGUsIHRoZSBtYWtlLyBkaXJlY3RvcnkgY29udGFpbnMgYSBNYWtlZmlsZSB0aGF0IHlvdSBjYW4KK3VzZSB0byBidWlsZCBHb29nbGUgVGVzdCBvbiBzeXN0ZW1zIHdoZXJlIEdOVSBtYWtlIGlzIGF2YWlsYWJsZQorKGUuZy4gTGludXgsIE1hYyBPUyBYLCBhbmQgQ3lnd2luKS4gIEl0IGRvZXNuJ3QgdHJ5IHRvIGJ1aWxkIEdvb2dsZQorVGVzdCdzIG93biB0ZXN0cy4gIEluc3RlYWQsIGl0IGp1c3QgYnVpbGRzIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IGFuZAorYSBzYW1wbGUgdGVzdC4gIFlvdSBjYW4gdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgb3duIGJ1aWxkCitzY3JpcHQuCisKK0lmIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBjb3JyZWN0IGZvciB5b3VyIGVudmlyb25tZW50LCB0aGUKK2ZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgc3VjY2VlZDoKKworICBjZCAke0dURVNUX0RJUn0vbWFrZQorICBtYWtlCisgIC4vc2FtcGxlMV91bml0dGVzdAorCitJZiB5b3Ugc2VlIGVycm9ycywgdHJ5IHRvIHR3ZWFrIHRoZSBjb250ZW50cyBvZiBtYWtlL01ha2VmaWxlIHRvIG1ha2UKK3RoZW0gZ28gYXdheS4gIFRoZXJlIGFyZSBpbnN0cnVjdGlvbnMgaW4gbWFrZS9NYWtlZmlsZSBvbiBob3cgdG8gZG8KK2l0LgorCisjIyMgVXNpbmcgQ01ha2UgIyMjCisKK0dvb2dsZSBUZXN0IGNvbWVzIHdpdGggYSBDTWFrZSBidWlsZCBzY3JpcHQgKENNYWtlTGlzdHMudHh0KSB0aGF0IGNhbgorYmUgdXNlZCBvbiBhIHdpZGUgcmFuZ2Ugb2YgcGxhdGZvcm1zICgiQyIgc3RhbmRzIGZvciBjcm9zcy1wbGF0b2ZybS4pLgorSWYgeW91IGRvbid0IGhhdmUgQ01ha2UgaW5zdGFsbGVkIGFscmVhZHksIHlvdSBjYW4gZG93bmxvYWQgaXQgZm9yCitmcmVlIGZyb20gaHR0cDovL3d3dy5jbWFrZS5vcmcvLgorCitDTWFrZSB3b3JrcyBieSBnZW5lcmF0aW5nIG5hdGl2ZSBtYWtlZmlsZXMgb3IgYnVpbGQgcHJvamVjdHMgdGhhdCBjYW4KK2JlIHVzZWQgaW4gdGhlIGNvbXBpbGVyIGVudmlyb25tZW50IG9mIHlvdXIgY2hvaWNlLiAgVGhlIHR5cGljYWwKK3dvcmtmbG93IHN0YXJ0cyB3aXRoOgorCisgIG1rZGlyIG15YnVpbGQgICAgICAgIyBDcmVhdGUgYSBkaXJlY3RvcnkgdG8gaG9sZCB0aGUgYnVpbGQgb3V0cHV0LgorICBjZCBteWJ1aWxkCisgIGNtYWtlICR7R1RFU1RfRElSfSAgIyBHZW5lcmF0ZSBuYXRpdmUgYnVpbGQgc2NyaXB0cy4KKworSWYgeW91IHdhbnQgdG8gYnVpbGQgR29vZ2xlIFRlc3QncyBzYW1wbGVzLCB5b3Ugc2hvdWxkIHJlcGxhY2UgdGhlCitsYXN0IGNvbW1hbmQgd2l0aAorCisgIGNtYWtlIC1EZ3Rlc3RfYnVpbGRfc2FtcGxlcz1PTiAke0dURVNUX0RJUn0KKworSWYgeW91IGFyZSBvbiBhICpuaXggc3lzdGVtLCB5b3Ugc2hvdWxkIG5vdyBzZWUgYSBNYWtlZmlsZSBpbiB0aGUKK2N1cnJlbnQgZGlyZWN0b3J5LiAgSnVzdCB0eXBlICdtYWtlJyB0byBidWlsZCBndGVzdC4KKworSWYgeW91IHVzZSBXaW5kb3dzIGFuZCBoYXZlIFZpc3R1YWwgU3R1ZGlvIGluc3RhbGxlZCwgYSBndGVzdC5zbG4gZmlsZQorYW5kIHNldmVyYWwgLnZjcHJvaiBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQuICBZb3UgY2FuIHRoZW4gYnVpbGQgdGhlbQordXNpbmcgVmlzdWFsIFN0dWRpby4KKworT24gTWFjIE9TIFggd2l0aCBYY29kZSBpbnN0YWxsZWQsIGEgLnhjb2RlcHJvaiBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLgorCisjIyMgTGVnYWN5IEJ1aWxkIFNjcmlwdHMgIyMjCisKK0JlZm9yZSBzZXR0bGluZyBvbiBDTWFrZSwgd2UgaGF2ZSBiZWVuIHByb3ZpZGluZyBoYW5kLW1haW50YWluZWQgYnVpbGQKK3Byb2plY3RzL3NjcmlwdHMgZm9yIFZpc3VhbCBTdHVkaW8sIFhjb2RlLCBhbmQgQXV0b3Rvb2xzLiAgV2hpbGUgd2UKK2NvbnRpbnVlIHRvIHByb3ZpZGUgdGhlbSBmb3IgY29udmVuaWVuY2UsIHRoZXkgYXJlIG5vdCBhY3RpdmVseQorbWFpbnRhaW5lZCBhbnkgbW9yZS4gIFdlIGhpZ2hseSByZWNvbW1lbmQgdGhhdCB5b3UgZm9sbG93IHRoZQoraW5zdHJ1Y3Rpb25zIGluIHRoZSBwcmV2aW91cyB0d28gc2VjdGlvbnMgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0Cit3aXRoIHlvdXIgZXhpc3RpbmcgYnVpbGQgc3lzdGVtLgorCitJZiB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhlIGxlZ2FjeSBidWlsZCBzY3JpcHRzLCBoZXJlJ3MgaG93OgorCitUaGUgbXN2Y1wgZm9sZGVyIGNvbnRhaW5zIHR3byBzb2x1dGlvbnMgd2l0aCBWaXN1YWwgQysrIHByb2plY3RzLgorT3BlbiB0aGUgZ3Rlc3Quc2xuIG9yIGd0ZXN0LW1kLnNsbiBmaWxlIHVzaW5nIFZpc3VhbCBTdHVkaW8sIGFuZCB5b3UKK2FyZSByZWFkeSB0byBidWlsZCBHb29nbGUgVGVzdCB0aGUgc2FtZSB3YXkgeW91IGJ1aWxkIGFueSBWaXN1YWwKK1N0dWRpbyBwcm9qZWN0LiAgRmlsZXMgdGhhdCBoYXZlIG5hbWVzIGVuZGluZyB3aXRoIC1tZCB1c2UgRExMCit2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgcnVudGltZSBsaWJyYXJpZXMgKHRoZSAvTUQgb3IgdGhlIC9NRGQgY29tcGlsZXIKK29wdGlvbikuICBGaWxlcyB3aXRob3V0IHRoYXQgc3VmZml4IHVzZSBzdGF0aWMgdmVyc2lvbnMgb2YgdGhlIHJ1bnRpbWUKK2xpYnJhcmllcyAodGhlIC9NVCBvciB0aGUgL01UZCBvcHRpb24pLiAgUGxlYXNlIG5vdGUgdGhhdCBvbmUgbXVzdCB1c2UKK3RoZSBzYW1lIG9wdGlvbiB0byBjb21waWxlIGJvdGggZ3Rlc3QgYW5kIHRoZSB0ZXN0IGNvZGUuICBJZiB5b3UgdXNlCitWaXN1YWwgU3R1ZGlvIDIwMDUgb3IgYWJvdmUsIHdlIHJlY29tbWVuZCB0aGUgLW1kIHZlcnNpb24gYXMgL01EIGlzCit0aGUgZGVmYXVsdCBmb3IgbmV3IHByb2plY3RzIGluIHRoZXNlIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8uCisKK09uIE1hYyBPUyBYLCBvcGVuIHRoZSBndGVzdC54Y29kZXByb2ogaW4gdGhlIHhjb2RlLyBmb2xkZXIgdXNpbmcKK1hjb2RlLiAgQnVpbGQgdGhlICJndGVzdCIgdGFyZ2V0LiAgVGhlIHVuaXZlcnNhbCBiaW5hcnkgZnJhbWV3b3JrIHdpbGwKK2VuZCB1cCBpbiB5b3VyIHNlbGVjdGVkIGJ1aWxkIGRpcmVjdG9yeSAoc2VsZWN0ZWQgaW4gdGhlIFhjb2RlCisiUHJlZmVyZW5jZXMuLi4iIC0+ICJCdWlsZGluZyIgcGFuZSBhbmQgZGVmYXVsdHMgdG8geGNvZGUvYnVpbGQpLgorQWx0ZXJuYXRpdmVseSwgYXQgdGhlIGNvbW1hbmQgbGluZSwgZW50ZXI6CisKKyAgeGNvZGVidWlsZAorCitUaGlzIHdpbGwgYnVpbGQgdGhlICJSZWxlYXNlIiBjb25maWd1cmF0aW9uIG9mIGd0ZXN0LmZyYW1ld29yayBpbiB5b3VyCitkZWZhdWx0IGJ1aWxkIGxvY2F0aW9uLiAgU2VlIHRoZSAieGNvZGVidWlsZCIgbWFuIHBhZ2UgZm9yIG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgYnVpbGRpbmcgaW4KK2RpZmZlcmVudCBsb2NhdGlvbnMuCisKK1R3ZWFraW5nIEdvb2dsZSBUZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHb29nbGUgVGVzdCBjYW4gYmUgdXNlZCBpbiBkaXZlcnNlIGVudmlyb25tZW50cy4gIFRoZSBkZWZhdWx0Citjb25maWd1cmF0aW9uIG1heSBub3Qgd29yayAob3IgbWF5IG5vdCB3b3JrIHdlbGwpIG91dCBvZiB0aGUgYm94IGluCitzb21lIGVudmlyb25tZW50cy4gIEhvd2V2ZXIsIHlvdSBjYW4gZWFzaWx5IHR3ZWFrIEdvb2dsZSBUZXN0IGJ5CitkZWZpbmluZyBjb250cm9sIG1hY3JvcyBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiAgR2VuZXJhbGx5LAordGhlc2UgbWFjcm9zIGFyZSBuYW1lZCBsaWtlIEdURVNUX1hZWiBhbmQgeW91IGRlZmluZSB0aGVtIHRvIGVpdGhlciAxCitvciAwIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgY2VydGFpbiBmZWF0dXJlLgorCitXZSBsaXN0IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBtYWNyb3MgYmVsb3cuICBGb3IgYSBjb21wbGV0ZSBsaXN0LAorc2VlIGZpbGUgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmguCisKKyMjIyBDaG9vc2luZyBhIFRSMSBUdXBsZSBMaWJyYXJ5ICMjIworCitTb21lIEdvb2dsZSBUZXN0IGZlYXR1cmVzIHJlcXVpcmUgdGhlIEMrKyBUZWNobmljYWwgUmVwb3J0IDEgKFRSMSkKK3R1cGxlIGxpYnJhcnksIHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIHdpdGggYWxsIGNvbXBpbGVycy4gIFRoZQorZ29vZCBuZXdzIGlzIHRoYXQgR29vZ2xlIFRlc3QgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgdGhhdCdzCitlbm91Z2ggZm9yIGl0cyBvd24gbmVlZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB1c2UgdGhpcyB3aGVuIHRoZQorY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIFRSMSB0dXBsZS4KKworVXN1YWxseSB5b3UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdoaWNoIHR1cGxlIGxpYnJhcnkgR29vZ2xlIFRlc3QKK3VzZXMuICBIb3dldmVyLCBpZiB5b3VyIHByb2plY3QgYWxyZWFkeSB1c2VzIFRSMSB0dXBsZSwgeW91IG5lZWQgdG8KK3RlbGwgR29vZ2xlIFRlc3QgdG8gdXNlIHRoZSBzYW1lIFRSMSB0dXBsZSBsaWJyYXJ5IHRoZSByZXN0IG9mIHlvdXIKK3Byb2plY3QgdXNlcywgb3IgdGhlIHR3byB0dXBsZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBjbGFzaC4gIFRvIGRvCit0aGF0LCBhZGQKKworICAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTAKKwordG8gdGhlIGNvbXBpbGVyIGZsYWdzIHdoaWxlIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhbmQgeW91ciB0ZXN0cy4gIElmCit5b3Ugd2FudCB0byBmb3JjZSBHb29nbGUgVGVzdCB0byB1c2UgaXRzIG93biB0dXBsZSBsaWJyYXJ5LCBqdXN0IGFkZAorCisgIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MgaW5zdGVhZC4KKworSWYgeW91IGRvbid0IHdhbnQgR29vZ2xlIFRlc3QgdG8gdXNlIHR1cGxlIGF0IGFsbCwgYWRkCisKKyAgLURHVEVTVF9IQVNfVFIxX1RVUExFPTAKKworYW5kIGFsbCBmZWF0dXJlcyB1c2luZyB0dXBsZSB3aWxsIGJlIGRpc2FibGVkLgorCisjIyMgTXVsdGktdGhyZWFkZWQgVGVzdHMgIyMjCisKK0dvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlIHdoZXJlIHRoZSBwdGhyZWFkIGxpYnJhcnkgaXMgYXZhaWxhYmxlLgorQWZ0ZXIgI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiLCB5b3UgY2FuIGNoZWNrIHRoZSBHVEVTVF9JU19USFJFQURTQUZFCittYWNybyB0byBzZWUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlICh5ZXMgaWYgdGhlIG1hY3JvIGlzICNkZWZpbmVkIHRvCisxLCBubyBpZiBpdCdzIHVuZGVmaW5lZC4pLgorCitJZiBHb29nbGUgVGVzdCBkb2Vzbid0IGNvcnJlY3RseSBkZXRlY3Qgd2hldGhlciBwdGhyZWFkIGlzIGF2YWlsYWJsZQoraW4geW91ciBlbnZpcm9ubWVudCwgeW91IGNhbiBmb3JjZSBpdCB3aXRoCisKKyAgLURHVEVTVF9IQVNfUFRIUkVBRD0xCisKK29yCisKKyAgLURHVEVTVF9IQVNfUFRIUkVBRD0wCisKK1doZW4gR29vZ2xlIFRlc3QgdXNlcyBwdGhyZWFkLCB5b3UgbWF5IG5lZWQgdG8gYWRkIGZsYWdzIHRvIHlvdXIKK2NvbXBpbGVyIGFuZC9vciBsaW5rZXIgdG8gc2VsZWN0IHRoZSBwdGhyZWFkIGxpYnJhcnksIG9yIHlvdSdsbCBnZXQKK2xpbmsgZXJyb3JzLiAgSWYgeW91IHVzZSB0aGUgQ01ha2Ugc2NyaXB0IG9yIHRoZSBkZXByZWNhdGVkIEF1dG90b29scworc2NyaXB0LCB0aGlzIGlzIHRha2VuIGNhcmUgb2YgZm9yIHlvdS4gIElmIHlvdSB1c2UgeW91ciBvd24gYnVpbGQKK3NjcmlwdCwgeW91J2xsIG5lZWQgdG8gcmVhZCB5b3VyIGNvbXBpbGVyIGFuZCBsaW5rZXIncyBtYW51YWwgdG8KK2ZpZ3VyZSBvdXQgd2hhdCBmbGFncyB0byBhZGQuCisKKyMjIyBBcyBhIFNoYXJlZCBMaWJyYXJ5IChETEwpICMjIworCitHb29nbGUgVGVzdCBpcyBjb21wYWN0LCBzbyBtb3N0IHVzZXJzIGNhbiBidWlsZCBhbmQgbGluayBpdCBhcyBhCitzdGF0aWMgbGlicmFyeSBmb3IgdGhlIHNpbXBsaWNpdHkuICBZb3UgY2FuIGNob29zZSB0byB1c2UgR29vZ2xlIFRlc3QKK2FzIGEgc2hhcmVkIGxpYnJhcnkgKGtub3duIGFzIGEgRExMIG9uIFdpbmRvd3MpIGlmIHlvdSBwcmVmZXIuCisKK1RvIGNvbXBpbGUgKmd0ZXN0KiBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBhZGQKKworICAtREdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWT0xCisKK3RvIHRoZSBjb21waWxlciBmbGFncy4gIFlvdSdsbCBhbHNvIG5lZWQgdG8gdGVsbCB0aGUgbGlua2VyIHRvIHByb2R1Y2UKK2Egc2hhcmVkIGxpYnJhcnkgaW5zdGVhZCAtIGNvbnN1bHQgeW91ciBsaW5rZXIncyBtYW51YWwgZm9yIGhvdyB0byBkbworaXQuCisKK1RvIGNvbXBpbGUgeW91ciAqdGVzdHMqIHRoYXQgdXNlIHRoZSBndGVzdCBzaGFyZWQgbGlicmFyeSwgYWRkCisKKyAgLURHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MuCisKK05vdGU6IHdoaWxlIHRoZSBhYm92ZSBzdGVwcyBhcmVuJ3QgdGVjaG5pY2FsbHkgbmVjZXNzYXJ5IHRvZGF5IHdoZW4KK3VzaW5nIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyksIHRoZXkgbWF5IGJlY29tZSBuZWNlc3NhcnkgaW4gdGhlCitmdXR1cmUsIGlmIHdlIGRlY2lkZSB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBsb2FkaW5nIHRoZSBsaWJyYXJ5IChzZWUKK2h0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIGRldGFpbHMpLiAgVGhlcmVmb3JlIHlvdSBhcmUKK3JlY29tbWVuZGVkIHRvIGFsd2F5cyBhZGQgdGhlIGFib3ZlIGZsYWdzIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYQorc2hhcmVkIGxpYnJhcnkuICBPdGhlcndpc2UgYSBmdXR1cmUgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCBtYXkgYnJlYWsKK3lvdXIgYnVpbGQgc2NyaXB0LgorCisjIyMgQXZvaWRpbmcgTWFjcm8gTmFtZSBDbGFzaGVzICMjIworCitJbiBDKyssIG1hY3JvcyBkb24ndCBvYmV5IG5hbWVzcGFjZXMuICBUaGVyZWZvcmUgdHdvIGxpYnJhcmllcyB0aGF0Citib3RoIGRlZmluZSBhIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBjbGFzaCBpZiB5b3UgI2luY2x1ZGUgYm90aAorZGVmaW5pdGlvbnMuICBJbiBjYXNlIGEgR29vZ2xlIFRlc3QgbWFjcm8gY2xhc2hlcyB3aXRoIGFub3RoZXIKK2xpYnJhcnksIHlvdSBjYW4gZm9yY2UgR29vZ2xlIFRlc3QgdG8gcmVuYW1lIGl0cyBtYWNybyB0byBhdm9pZCB0aGUKK2NvbmZsaWN0LgorCitTcGVjaWZpY2FsbHksIGlmIGJvdGggR29vZ2xlIFRlc3QgYW5kIHNvbWUgb3RoZXIgY29kZSBkZWZpbmUgbWFjcm8KK0ZPTywgeW91IGNhbiBhZGQKKworICAtREdURVNUX0RPTlRfREVGSU5FX0ZPTz0xCisKK3RvIHRoZSBjb21waWxlciBmbGFncyB0byB0ZWxsIEdvb2dsZSBUZXN0IHRvIGNoYW5nZSB0aGUgbWFjcm8ncyBuYW1lCitmcm9tIEZPTyB0byBHVEVTVF9GT08uICBDdXJyZW50bHkgRk9PIGNhbiBiZSBGQUlMLCBTVUNDRUVELCBvciBURVNULgorRm9yIGV4YW1wbGUsIHdpdGggLURHVEVTVF9ET05UX0RFRklORV9URVNUPTEsIHlvdSdsbCBuZWVkIHRvIHdyaXRlCisKKyAgR1RFU1RfVEVTVChTb21lVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KKworaW5zdGVhZCBvZgorCisgIFRFU1QoU29tZVRlc3QsIERvZXNUaGlzKSB7IC4uLiB9CisKK2luIG9yZGVyIHRvIGRlZmluZSBhIHRlc3QuCisKK1VwZ3JhdGluZyBmcm9tIGFuIEVhcmxpZXIgVmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHN0cml2ZSB0byBrZWVwIEdvb2dsZSBUZXN0IHJlbGVhc2VzIGJhY2t3YXJkIGNvbXBhdGlibGUuCitTb21ldGltZXMsIHRob3VnaCwgd2UgaGF2ZSB0byBtYWtlIHNvbWUgYnJlYWtpbmcgY2hhbmdlcyBmb3IgdGhlCit1c2VycycgbG9uZy10ZXJtIGJlbmVmaXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB3aGF0IHlvdSdsbCBuZWVkIHRvCitkbyBpZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBHb29nbGUgVGVzdC4KKworIyMjIFVwZ3JhZGluZyBmcm9tIDEuMy4wIG9yIEVhcmxpZXIgIyMjCisKK1lvdSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0J3Mgb3duIFRSMQordHVwbGUgbGlicmFyeS4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHNlY3Rpb24gIkNob29zaW5nIGEgVFIxIFR1cGxlCitMaWJyYXJ5Ii4KKworIyMjIFVwZ3JhZGluZyBmcm9tIDEuNC4wIG9yIEVhcmxpZXIgIyMjCisKK1RoZSBBdXRvdG9vbHMgYnVpbGQgc2NyaXB0IChjb25maWd1cmUgKyBtYWtlKSBpcyBubyBsb25nZXIgb2ZmaWNpYWxseQorc3VwcG9ydHRlZC4gIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHlvdXIgb3duIGJ1aWxkIHN5c3RlbSBvcgordXNlIENNYWtlLiAgSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIEF1dG90b29scywgeW91IGNhbiBmaW5kCitpbnN0cnVjdGlvbnMgaW4gdGhlIFJFQURNRSBmaWxlIGZyb20gR29vZ2xlIFRlc3QgMS40LjAuCisKK09uIHBsYXRmb3JtcyB3aGVyZSB0aGUgcHRocmVhZCBsaWJyYXJ5IGlzIGF2YWlsYWJsZSwgR29vZ2xlIFRlc3QgdXNlcworaXQgaW4gb3JkZXIgdG8gYmUgdGhyZWFkLXNhZmUuICBTZWUgdGhlICJNdWx0aS10aHJlYWRlZCBUZXN0cyIgc2VjdGlvbgorZm9yIHdoYXQgdGhpcyBtZWFucyB0byB5b3VyIGJ1aWxkIHNjcmlwdC4KKworSWYgeW91IHVzZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLCBHb29nbGUKK1Rlc3Qgd2lsbCBubyBsb25nZXIgY29tcGlsZS4gIFRoaXMgc2hvdWxkIGFmZmVjdCB2ZXJ5IGZldyBwZW9wbGUsIGFzIGEKK2xhcmdlIHBvcnRpb24gb2YgU1RMIChpbmNsdWRpbmcgPHN0cmluZz4pIGRvZXNuJ3QgY29tcGlsZSBpbiB0aGlzIG1vZGUKK2FueXdheS4gIFdlIGRlY2lkZWQgdG8gc3RvcCBzdXBwb3J0aW5nIGl0IGluIG9yZGVyIHRvIGdyZWF0bHkgc2ltcGxpZnkKK0dvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24uCisKK0RldmVsb3BpbmcgR29vZ2xlIFRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGRpc2N1c3NlcyBob3cgdG8gbWFrZSB5b3VyIG93biBjaGFuZ2VzIHRvIEdvb2dsZSBUZXN0LgorCisjIyMgVGVzdGluZyBHb29nbGUgVGVzdCBJdHNlbGYgIyMjCisKK1RvIG1ha2Ugc3VyZSB5b3VyIGNoYW5nZXMgd29yayBhcyBpbnRlbmRlZCBhbmQgZG9uJ3QgYnJlYWsgZXhpc3RpbmcKK2Z1bmN0aW9uYWxpdHksIHlvdSdsbCB3YW50IHRvIGNvbXBpbGUgYW5kIHJ1biBHb29nbGUgVGVzdCdzIG93biB0ZXN0cy4KK0ZvciB0aGF0IHlvdSBjYW4gdXNlIENNYWtlOgorCisgIG1rZGlyIG15YnVpbGQKKyAgY2QgbXlidWlsZAorICBjbWFrZSAtRGd0ZXN0X2J1aWxkX3Rlc3RzPU9OICR7R1RFU1RfRElSfQorCitNYWtlIHN1cmUgeW91IGhhdmUgUHl0aG9uIGluc3RhbGxlZCwgYXMgc29tZSBvZiBHb29nbGUgVGVzdCdzIHRlc3RzCithcmUgd3JpdHRlbiBpbiBQeXRob24uICBJZiB0aGUgY21ha2UgY29tbWFuZCBjb21wbGFpbnMgYWJvdXQgbm90IGJlaW5nCithYmxlIHRvIGZpbmQgUHl0aG9uICgiQ291bGQgTk9UIGZpbmQgUHl0aG9uSW50ZXJwIChtaXNzaW5nOgorUFlUSE9OX0VYRUNVVEFCTEUpIiksIHRyeSB0ZWxsaW5nIGl0IGV4cGxpY2l0bHkgd2hlcmUgeW91ciBQeXRob24KK2V4ZWN1dGFibGUgY2FuIGJlIGZvdW5kOgorCisgIGNtYWtlIC1EUFlUSE9OX0VYRUNVVEFCTEU9cGF0aC90by9weXRob24gLURndGVzdF9idWlsZF90ZXN0cz1PTiAke0dURVNUX0RJUn0KKworTmV4dCwgeW91IGNhbiBidWlsZCBHb29nbGUgVGVzdCBhbmQgYWxsIG9mIGl0cyBvd24gdGVzdHMuICBPbiAqbml4LAordGhpcyBpcyB1c3VhbGx5IGRvbmUgYnkgJ21ha2UnLiAgVG8gcnVuIHRoZSB0ZXN0cywgZG8KKworICBtYWtlIHRlc3QKKworQWxsIHRlc3RzIHNob3VsZCBwYXNzLgorCisjIyMgUmVnZW5lcmF0aW5nIFNvdXJjZSBGaWxlcyAjIyMKKworU29tZSBvZiBHb29nbGUgVGVzdCdzIHNvdXJjZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGVzIChub3QKK2luIHRoZSBDKysgc2Vuc2UpIHVzaW5nIGEgc2NyaXB0LiAgQSB0ZW1wbGF0ZSBmaWxlIGlzIG5hbWVkIEZPTy5wdW1wLAord2hlcmUgRk9PIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGl0IHdpbGwgZ2VuZXJhdGUuICBGb3IgZXhhbXBsZSwgdGhlCitmaWxlIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBpcyB1c2VkIHRvIGdlbmVyYXRlCitndGVzdC10eXBlLXV0aWwuaCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK05vcm1hbGx5IHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlZ2VuZXJhdGluZyB0aGUgc291cmNlIGZpbGVzLAordW5sZXNzIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGVtLiAgSW4gdGhhdCBjYXNlLCB5b3Ugc2hvdWxkIG1vZGlmeSB0aGUKK2NvcnJlc3BvbmRpbmcgLnB1bXAgZmlsZXMgaW5zdGVhZCBhbmQgcnVuIHRoZSBwdW1wLnB5IFB5dGhvbiBzY3JpcHQgdG8KK3JlZ2VuZXJhdGUgdGhlbS4gIFlvdSBjYW4gZmluZCBwdW1wLnB5IGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkuCitSZWFkIHRoZSBQdW1wIG1hbnVhbCBbMl0gZm9yIGhvdyB0byB1c2UgaXQuCisKKyAgWzJdIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvUHVtcE1hbnVhbAorCisjIyMgQ29udHJpYnV0aW5nIGEgUGF0Y2ggIyMjCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gIFBsZWFzZSByZWFkIHRoZSBHb29nbGUgVGVzdCBkZXZlbG9wZXIncyBndWlkZSBbM10KK2ZvciBob3cgeW91IGNhbiBjb250cmlidXRlLiAgSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHlvdSBoYXZlIHNpZ25lZAordGhlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50LCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIGFjY2VwdCB0aGUKK3BhdGNoLgorCisgIFszXSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3REZXZHdWlkZQorCitIYXBweSB0ZXN0aW5nIQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2J1aWxkLWF1eC8ua2VlcCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9idWlsZC1hdXgvLmtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9idWlsZC1hdXgvLmtlZXAKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZjMmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlCkBAIC0wLDAgKzEsMjE2IEBACisjIERlZmluZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZnVsIGZvciBidWlsZGluZyBHb29nbGUgVGVzdCBhbmQKKyMgR29vZ2xlIE1vY2suCisjCisjIE5vdGU6CisjCisjIC0gVGhpcyBmaWxlIHdpbGwgYmUgcnVuIHR3aWNlIHdoZW4gYnVpbGRpbmcgR29vZ2xlIE1vY2sgKG9uY2UgdmlhCisjICAgR29vZ2xlIFRlc3QncyBDTWFrZUxpc3RzLnR4dCwgYW5kIG9uY2UgdmlhIEdvb2dsZSBNb2NrJ3MpLgorIyAgIFRoZXJlZm9yZSBpdCBzaG91bGRuJ3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gZGVmaW5pbmcKKyMgICB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCisjCisjIC0gVGhlIGZ1bmN0aW9ucy9tYWNyb3MgZGVmaW5lZCBpbiB0aGlzIGZpbGUgbWF5IGRlcGVuZCBvbiBHb29nbGUKKyMgICBUZXN0IGFuZCBHb29nbGUgTW9jaydzIG9wdGlvbigpIGRlZmluaXRpb25zLCBhbmQgdGh1cyBtdXN0IGJlCisjICAgY2FsbGVkICphZnRlciogdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQuCisKKyMgVHdlYWtzIENNYWtlJ3MgZGVmYXVsdCBjb21waWxlci9saW5rZXIgc2V0dGluZ3MgdG8gc3VpdCBHb29nbGUgVGVzdCdzIG5lZWRzLgorIworIyBUaGlzIG11c3QgYmUgYSBtYWNybygpLCBhcyBpbnNpZGUgYSBmdW5jdGlvbiBzdHJpbmcoKSBjYW4gb25seQorIyB1cGRhdGUgdmFyaWFibGVzIGluIHRoZSBmdW5jdGlvbiBzY29wZS4KK21hY3JvKGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXykKKyAgaWYgKE1TVkMpCisgICAgIyBGb3IgTVNWQywgQ01ha2Ugc2V0cyBjZXJ0YWluIGZsYWdzIHRvIGRlZmF1bHRzIHdlIHdhbnQgdG8gb3ZlcnJpZGUuCisgICAgIyBUaGlzIHJlcGxhY2VtZW50IGNvZGUgaXMgdGFrZW4gZnJvbSBzYW1wbGUgaW4gdGhlIENNYWtlIFdpa2kgYXQKKyAgICAjIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2VfRkFRI0R5bmFtaWNfUmVwbGFjZS4KKyAgICBmb3JlYWNoIChmbGFnX3ZhcgorICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHUyBDTUFLRV9DWFhfRkxBR1NfREVCVUcgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgICBpZiAoTk9UIEJVSUxEX1NIQVJFRF9MSUJTIEFORCBOT1QgZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCkKKyAgICAgICAgIyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnksIGl0IHNob3VsZCBhbHNvIHVzZQorICAgICAgICAjIHNoYXJlZCBydW50aW1lIGxpYnJhcmllcy4gIE90aGVyd2lzZSwgaXQgbWF5IGVuZCB1cCB3aXRoIG11bHRpcGxlCisgICAgICAgICMgY29waWVzIG9mIHJ1bnRpbWUgbGlicmFyeSBkYXRhIGluIGRpZmZlcmVudCBtb2R1bGVzLCByZXN1bHRpbmcgaW4KKyAgICAgICAgIyBoYXJkLXRvLWZpbmQgY3Jhc2hlcy4gV2hlbiBpdCBpcyBidWlsdCBhcyBhIHN0YXRpYyBsaWJyYXJ5LCBpdCBpcworICAgICAgICAjIHByZWZlcmFibGUgdG8gdXNlIENSVCBhcyBzdGF0aWMgbGlicmFyaWVzLCBhcyB3ZSBkb24ndCBoYXZlIHRvIHJlbHkKKyAgICAgICAgIyBvbiBDUlQgRExMcyBiZWluZyBhdmFpbGFibGUuIENNYWtlIGFsd2F5cyBkZWZhdWx0cyB0byB1c2luZyBzaGFyZWQKKyAgICAgICAgIyBDUlQgbGlicmFyaWVzLCBzbyB3ZSBvdmVycmlkZSB0aGF0IGRlZmF1bHQgaGVyZS4KKyAgICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi1NVCIgJHtmbGFnX3Zhcn0gIiR7JHtmbGFnX3Zhcn19IikKKyAgICAgIGVuZGlmKCkKKworICAgICAgIyBXZSBwcmVmZXIgbW9yZSBzdHJpY3Qgd2FybmluZyBjaGVja2luZyBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QuCisgICAgICAjIFJlcGxhY2VzIC9XMyB3aXRoIC9XNCBpbiBkZWZhdWx0cy4KKyAgICAgIHN0cmluZyhSRVBMQUNFICIvVzMiICItVzQiICR7ZmxhZ192YXJ9ICIkeyR7ZmxhZ192YXJ9fSIpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBEZWZpbmVzIHRoZSBjb21waWxlci9saW5rZXIgZmxhZ3MgdXNlZCB0byBidWlsZCBHb29nbGUgVGVzdCBhbmQKKyMgR29vZ2xlIE1vY2suICBZb3UgY2FuIHR3ZWFrIHRoZXNlIGRlZmluaXRpb25zIHRvIHN1aXQgeW91ciBuZWVkLiAgQQorIyB2YXJpYWJsZSdzIHZhbHVlIGlzIGVtcHR5IGJlZm9yZSBpdCdzIGV4cGxpY2l0bHkgYXNzaWduZWQgdG8uCittYWNybyhjb25maWdfY29tcGlsZXJfYW5kX2xpbmtlcikKKyAgaWYgKE5PVCBndGVzdF9kaXNhYmxlX3B0aHJlYWRzKQorICAgICMgRGVmaW5lcyBDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCBhbmQgQ01BS0VfVEhSRUFEX0xJQlNfSU5JVC4KKyAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKKyAgZW5kaWYoKQorCisgIGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXygpCisgIGlmIChNU1ZDKQorICAgICMgTmV3bGluZXMgaW5zaWRlIGZsYWdzIHZhcmlhYmxlcyBicmVhayBDTWFrZSdzIE5NYWtlIGdlbmVyYXRvci4KKyAgICAjIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEFkZCAtUlRDcyBhbmQgLVJUQ3UgdG8gZGVidWcgYnVpbGRzLgorICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUdTIC1XNCAtV1ggLXdkNDEyNyAtd2Q0MjUxIC13ZDQyNzUgLW5vbG9nbyAtSiAtWmkiKQorICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURfVU5JQ09ERSAtRFVOSUNPREUgLURXSU4zMiAtRF9XSU4zMiIpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRFNUUklDVCAtRFdJTjMyX0xFQU5fQU5EX01FQU4iKQorICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItRUhzYyAtRF9IQVNfRVhDRVBUSU9OUz0xIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLURfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItR1ItIikKKyAgZWxzZWlmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItV2FsbCAtV3NoYWRvdyIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZXhjZXB0aW9ucyIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mbm8tZXhjZXB0aW9ucyIpCisgICAgIyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBHQ0MgZG9lc24ndCBkZWZpbmUgYSBtYWNybyB0byBpbmRpY2F0ZQorICAgICMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQuICBUaGVyZWZvcmUgd2UgZGVmaW5lIEdURVNUX0hBU19SVFRJCisgICAgIyBleHBsaWNpdGx5LgorICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLWZuby1ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgICAgc2V0KGN4eF9zdHJpY3RfZmxhZ3MgIi1XZXh0cmEiKQorICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiU3VuUHJvIikKKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLWZlYXR1cmVzPWV4Y2VwdCIpCisgICAgIyBTdW4gUHJvIGRvZXNuJ3QgcHJvdmlkZSBtYWNyb3MgdG8gaW5kaWNhdGUgd2hldGhlciBleGNlcHRpb25zIGFuZAorICAgICMgUlRUSSBhcmUgZW5hYmxlZCwgc28gd2UgZGVmaW5lIEdURVNUX0hBU18qIGV4cGxpY2l0bHkuCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1ubyVleGNlcHQgLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikKKyAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1mZWF0dXJlcz1ubyVydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJWaXN1YWxBZ2UiIE9SCisgICAgICBDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlhMIikKKyAgICAjIENNYWtlIDIuOCBjaGFuZ2VzIFZpc3VhbCBBZ2UncyBjb21waWxlciBJRCB0byAiWEwiLgorICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItcWVoIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLXFub2VoIikKKyAgICAjIFVudGlsIHZlcnNpb24gOS4wLCBWaXN1YWwgQWdlIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8gdG8gaW5kaWNhdGUKKyAgICAjIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLiAgVGhlcmVmb3JlIHdlIGRlZmluZSBHVEVTVF9IQVNfUlRUSQorICAgICMgZXhwbGljaXRseS4KKyAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1xbm9ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJIUCIpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItQUEgLW10IikKKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0xIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiK25vZWggLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikKKyAgICAjIFJUVEkgY2FuIG5vdCBiZSBkaXNhYmxlZCBpbiBIUCBhQ0MgY29tcGlsZXIuCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICIiKQorICBlbmRpZigpCisKKyAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKSAgIyBUaGUgcHRocmVhZHMgbGlicmFyeSBpcyBhdmFpbGFibGUgYW5kIGFsbG93ZWQuCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTEiKQorICBlbHNlKCkKKyAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1ER1RFU1RfSEFTX1BUSFJFQUQ9MCIpCisgIGVuZGlmKCkKKworICAjIEZvciBidWlsZGluZyBndGVzdCdzIG93biB0ZXN0cyBhbmQgc2FtcGxlcy4KKyAgc2V0KGN4eF9leGNlcHRpb24gIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9leGNlcHRpb25fZmxhZ3N9IikKKyAgc2V0KGN4eF9ub19leGNlcHRpb24KKyAgICAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7Y3h4X2Jhc2VfZmxhZ3N9ICR7Y3h4X25vX2V4Y2VwdGlvbl9mbGFnc30iKQorICBzZXQoY3h4X2RlZmF1bHQgIiR7Y3h4X2V4Y2VwdGlvbn0iKQorICBzZXQoY3h4X25vX3J0dGkgIiR7Y3h4X2RlZmF1bHR9ICR7Y3h4X25vX3J0dGlfZmxhZ3N9IikKKyAgc2V0KGN4eF91c2Vfb3duX3R1cGxlICIke2N4eF9kZWZhdWx0fSAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTEiKQorCisgICMgRm9yIGJ1aWxkaW5nIHRoZSBndGVzdCBsaWJyYXJpZXMuCisgIHNldChjeHhfc3RyaWN0ICIke2N4eF9kZWZhdWx0fSAke2N4eF9zdHJpY3RfZmxhZ3N9IikKK2VuZG1hY3JvKCkKKworIyBEZWZpbmVzIHRoZSBndGVzdCAmIGd0ZXN0X21haW4gbGlicmFyaWVzLiAgVXNlciB0ZXN0cyBzaG91bGQgbGluaworIyB3aXRoIG9uZSBvZiB0aGVtLgorZnVuY3Rpb24oY3h4X2xpYnJhcnlfd2l0aF90eXBlIG5hbWUgdHlwZSBjeHhfZmxhZ3MpCisgICMgdHlwZSBjYW4gYmUgZWl0aGVyIFNUQVRJQyBvciBTSEFSRUQgdG8gZGVub3RlIGEgc3RhdGljIG9yIHNoYXJlZCBsaWJyYXJ5LgorICAjIEFSR04gcmVmZXJzIHRvIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyICdjeHhfZmxhZ3MnLgorICBhZGRfbGlicmFyeSgke25hbWV9ICR7dHlwZX0gJHtBUkdOfSkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KKyAgICBQUk9QRVJUSUVTCisgICAgQ09NUElMRV9GTEFHUyAiJHtjeHhfZmxhZ3N9IikKKyAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTIE9SIHR5cGUgU1RSRVFVQUwgIlNIQVJFRCIpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KKyAgICAgIFBST1BFUlRJRVMKKyAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWT0xIikKKyAgZW5kaWYoKQorICBpZiAoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYnVpbGQgdGFyZ2V0cy4KKworZnVuY3Rpb24oY3h4X3NoYXJlZF9saWJyYXJ5IG5hbWUgY3h4X2ZsYWdzKQorICBjeHhfbGlicmFyeV93aXRoX3R5cGUoJHtuYW1lfSBTSEFSRUQgIiR7Y3h4X2ZsYWdzfSIgJHtBUkdOfSkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oY3h4X2xpYnJhcnkgbmFtZSBjeHhfZmxhZ3MpCisgIGN4eF9saWJyYXJ5X3dpdGhfdHlwZSgke25hbWV9ICIiICIke2N4eF9mbGFnc30iICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKKyMgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pCisjCisjIGNyZWF0ZXMgYSBuYW1lZCBDKysgZXhlY3V0YWJsZSB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnJhcmllcyBhbmQKKyMgaXMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgorZnVuY3Rpb24oY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQorICBhZGRfZXhlY3V0YWJsZSgke25hbWV9ICR7QVJHTn0pCisgIGlmIChjeHhfZmxhZ3MpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KKyAgICAgIFBST1BFUlRJRVMKKyAgICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpCisgIGVuZGlmKCkKKyAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCisgIGVuZGlmKCkKKyAgIyBUbyBzdXBwb3J0IG1peGluZyBsaW5raW5nIGluIHN0YXRpYyBhbmQgZHluYW1pYyBsaWJyYXJpZXMsIGxpbmsgZWFjaAorICAjIGxpYnJhcnkgaW4gd2l0aCBhbiBleHRyYSBjYWxsIHRvIHRhcmdldF9saW5rX2xpYnJhcmllcy4KKyAgZm9yZWFjaCAobGliICIke2xpYnN9IikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke2xpYn0pCisgIGVuZGZvcmVhY2goKQorZW5kZnVuY3Rpb24oKQorCisjIGN4eF9leGVjdXRhYmxlKG5hbWUgZGlyIGxpYiBzcmNzLi4uKQorIworIyBjcmVhdGVzIGEgbmFtZWQgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKKyMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgZGlyL25hbWUuY2MgaXMgaW1wbGljaXRseSBpbmNsdWRlZCBpbgorIyB0aGUgc291cmNlIGZpbGUgbGlzdC4KK2Z1bmN0aW9uKGN4eF9leGVjdXRhYmxlIG5hbWUgZGlyIGxpYnMpCisgIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoCisgICAgJHtuYW1lfSAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9IiAiJHtkaXJ9LyR7bmFtZX0uY2MiICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKKyMgU2V0cyBQWVRIT05JTlRFUlBfRk9VTkQgYW5kIFBZVEhPTl9FWEVDVVRBQkxFLgorZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCkKKworIyBjeHhfdGVzdF93aXRoX2ZsYWdzKG5hbWUgY3h4X2ZsYWdzIGxpYnMgc3Jjcy4uLikKKyMKKyMgY3JlYXRlcyBhIG5hbWVkIEMrKyB0ZXN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKKyMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgorZnVuY3Rpb24oY3h4X3Rlc3Rfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQorICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKCR7bmFtZX0gIiR7Y3h4X2ZsYWdzfSIgIiR7bGlic30iICR7QVJHTn0pCisgIGFkZF90ZXN0KCR7bmFtZX0gJHtuYW1lfSkKK2VuZGZ1bmN0aW9uKCkKKworIyBjeHhfdGVzdChuYW1lIGxpYnMgc3Jjcy4uLikKKyMKKyMgY3JlYXRlcyBhIG5hbWVkIHRlc3QgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMKKyMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgVW5saWtlIGN4eF90ZXN0X3dpdGhfZmxhZ3MsCisjIHRlc3QvbmFtZS5jYyBpcyBhbHJlYWR5IGltcGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSBmaWxlIGxpc3QuCitmdW5jdGlvbihjeHhfdGVzdCBuYW1lIGxpYnMpCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoIiR7bmFtZX0iICIke2N4eF9kZWZhdWx0fSIgIiR7bGlic30iCisgICAgInRlc3QvJHtuYW1lfS5jYyIgJHtBUkdOfSkKK2VuZGZ1bmN0aW9uKCkKKworIyBweV90ZXN0KG5hbWUpCisjCisjIGNyZWF0ZXMgYSBQeXRob24gdGVzdCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdob3NlIG1haW4gbW9kdWxlIGlzIGluCisjIHRlc3QvbmFtZS5weS4gIEl0IGRvZXMgbm90aGluZyBpZiBQeXRob24gaXMgbm90IGluc3RhbGxlZC4KK2Z1bmN0aW9uKHB5X3Rlc3QgbmFtZSkKKyAgIyBXZSBhcmUgbm90IHN1cHBvcnRpbmcgUHl0aG9uIHRlc3RzIG9uIExpbnV4IHlldCBhcyB0aGV5IGNvbnNpZGVyCisgICMgYWxsIExpbnV4IGVudmlyb25tZW50cyB0byBiZSBnb29nbGUzIGFuZCB0cnkgdG8gdXNlIGdvb2dsZTMgZmVhdHVyZXMuCisgIGlmIChQWVRIT05JTlRFUlBfRk9VTkQpCisgICAgIyAke0NNQUtFX0JJTkFSWV9ESVJ9IGlzIGtub3duIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgc28gd2UgY2FuCisgICAgIyBkaXJlY3RseSBiaW5kIGl0IGZyb20gY21ha2UuICR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSBpcyBrbm93bgorICAgICMgb25seSBhdCBjdGVzdCBydW50aW1lIChieSBjYWxsaW5nIGN0ZXN0IC1jIDxDb25maWd1cmF0aW9uPiksIHNvCisgICAgIyB3ZSBoYXZlIHRvIGVzY2FwZSAkIHRvIGRlbGF5IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBoZXJlLgorICAgIGFkZF90ZXN0KCR7bmFtZX0KKyAgICAgICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0LyR7bmFtZX0ucHkKKyAgICAgICAgICAtLWJ1aWxkX2Rpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vXCR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2NvZGVnZWFyL2d0ZXN0LmNicHJvaiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdC5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMzA1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdC5jYnByb2oKQEAgLTAsMCArMSwxMzggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3RHdWlkPntiY2EzN2E3Mi01YjA3LTQ2Y2YtYjQ0ZS04OWY4ZTA2NDUxYTJ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2UnIG9yICckKEJhc2UpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+DQorICAgIDxCYXNlPnRydWU8L0Jhc2U+DQorICAgIDxDZmdfMT50cnVlPC9DZmdfMT4NCisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4NCisgICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPnRydWU8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KKyAgICA8T3V0cHV0RXh0PmxpYjwvT3V0cHV0RXh0Pg0KKyAgICA8RENDX0NCdWlsZGVyT3V0cHV0PkpQSE5FPC9EQ0NfQ0J1aWxkZXJPdXRwdXQ+DQorICAgIDxEZWZpbmVzPk5PX1NUUklDVDwvRGVmaW5lcz4NCisgICAgPER5bmFtaWNSVEw+dHJ1ZTwvRHluYW1pY1JUTD4NCisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPg0KKyAgICA8UHJvamVjdFR5cGU+Q3BwU3RhdGljTGlicmFyeTwvUHJvamVjdFR5cGU+DQorICAgIDxCQ0NfQ1BQQ29tcGlsZUFsd2F5cz50cnVlPC9CQ0NfQ1BQQ29tcGlsZUFsd2F5cz4NCisgICAgPFBhY2thZ2VJbXBvcnRzPnJ0bC5icGk7dmNsLmJwaTtiY2JpZS5icGk7dmNseC5icGk7dmNsYWN0bmJhbmQuYnBpO3htbHJ0bC5icGk7YmNic21wLmJwaTtkYnJ0bC5icGk7dmNsZGIuYnBpO2JkZXJ0bC5icGk7dmNsZGJ4LmJwaTtkc25hcC5icGk7ZHNuYXBjb24uYnBpO3ZjbGliLmJwaTtpYnhwcmVzcy5icGk7YWRvcnRsLmJwaTtkYnhjZHMuYnBpO2RiZXhwcmVzcy5icGk7RGJ4Q29tbW9uRHJpdmVyLmJwaTt3ZWJzbmFwLmJwaTt2Y2xpZS5icGk7d2ViZHNuYXAuYnBpO2luZXQuYnBpO2luZXRkYmJkZS5icGk7aW5ldGRieHByZXNzLmJwaTtzb2FwcnRsLmJwaTtSYXZlNzVWQ0wuYnBpO3RlZVVJLmJwaTt0ZWUuYnBpO3RlZWRiLmJwaTtJbmR5Q29yZS5icGk7SW5keVN5c3RlbS5icGk7SW5keVByb3RvY29scy5icGk7SW50cmF3ZWJEQl85MF8xMDAuYnBpO0ludHJhd2ViXzkwXzEwMC5icGk7ZGNsWmlwRm9yZ2VkMTEuYnBpO3ZjbFppcEZvcmdlZDExLmJwaTtHUjMyX0JEUzIwMDYuYnBpO0dSMzJfRFNHTl9CRFMyMDA2LmJwaTtKY2wuYnBpO0pjbFZjbC5icGk7SnZDb3JlRDExUi5icGk7SnZTeXN0ZW1EMTFSLmJwaTtKdlN0ZEN0cmxzRDExUi5icGk7SnZBcHBGcm1EMTFSLmJwaTtKdkJhbmRzRDExUi5icGk7SnZEQkQxMVIuYnBpO0p2RGxnc0QxMVIuYnBpO0p2QkRFRDExUi5icGk7SnZDbXBEMTFSLmJwaTtKdkNyeXB0RDExUi5icGk7SnZDdHJsc0QxMVIuYnBpO0p2Q3VzdG9tRDExUi5icGk7SnZEb2NraW5nRDExUi5icGk7SnZEb3ROZXRDdHJsc0QxMVIuYnBpO0p2RURJRDExUi5icGk7SnZHbG9idXNEMTFSLmJwaTtKdkhNSUQxMVIuYnBpO0p2SW50ZXJwcmV0ZXJEMTFSLmJwaTtKdkphbnNEMTFSLmJwaTtKdk1hbmFnZWRUaHJlYWRzRDExUi5icGk7SnZNTUQxMVIuYnBpO0p2TmV0RDExUi5icGk7SnZQYWdlQ29tcHNEMTFSLmJwaTtKdlBsdWdpbkQxMVIuYnBpO0p2UHJpbnRQcmV2aWV3RDExUi5icGk7SnZSdW50aW1lRGVzaWduRDExUi5icGk7SnZUaW1lRnJhbWV3b3JrRDExUi5icGk7SnZWYWxpZGF0b3JzRDExUi5icGk7SnZXaXphcmREMTFSLmJwaTtKdlhQQ3RybHNEMTFSLmJwaTtWY2xTbXAuYnBpO0NFeGNlcHRpb25FeHBlcnQxMS5icGk8L1BhY2thZ2VJbXBvcnRzPg0KKyAgICA8QkNDX3dwYXI+ZmFsc2U8L0JDQ193cGFyPg0KKyAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0luY2x1ZGVQYXRoPg0KKyAgICA8QWxsUGFja2FnZUxpYnM+cnRsLmxpYjt2Y2wubGliPC9BbGxQYWNrYWdlTGlicz4NCisgICAgPFRMSUJfUGFnZVNpemU+MzI8L1RMSUJfUGFnZVNpemU+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazwvSUxJTktfTGlicmFyeVBhdGg+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4NCisgICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPmZhbHNlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCisgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPg0KKyAgICA8RENDX0RlYnVnSW5mb0luRXhlPnRydWU8L0RDQ19EZWJ1Z0luZm9JbkV4ZT4NCisgICAgPERlZmluZXM+X0RFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJTElOS19GdWxsRGVidWdJbmZvPnRydWU8L0lMSU5LX0Z1bGxEZWJ1Z0luZm8+DQorICAgIDxCQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+ZmFsc2U8L0JDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgPElMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+dHJ1ZTwvSUxJTktfRGlzYWJsZUluY3JlbWVudGFsTGlua2luZz4NCisgICAgPEJDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz5Ob25lPC9CQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+DQorICAgIDxEQ0NfRGVmaW5lPkRFQlVHPC9EQ0NfRGVmaW5lPg0KKyAgICA8QkNDX0RlYnVnTGluZU51bWJlcnM+dHJ1ZTwvQkNDX0RlYnVnTGluZU51bWJlcnM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+RGVidWc8L0ludGVybWVkaWF0ZU91dHB1dERpcj4NCisgICAgPFRBU01fRGlzcGxheVNvdXJjZUxpbmVzPnRydWU8L1RBU01fRGlzcGxheVNvdXJjZUxpbmVzPg0KKyAgICA8QkNDX1N0YWNrRnJhbWVzPnRydWU8L0JDQ19TdGFja0ZyYW1lcz4NCisgICAgPEJDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz50cnVlPC9CQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXGRlYnVnOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPkZ1bGw8L1RBU01fRGVidWdnaW5nPg0KKyAgICA8QkNDX1NvdXJjZURlYnVnZ2luZ09uPnRydWU8L0JDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPg0KKyAgICA8RGVmaW5lcz5OREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dERpcj5SZWxlYXNlPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXHJlbGVhc2U7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+Tm9uZTwvVEFTTV9EZWJ1Z2dpbmc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkNQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk8L0JvcmxhbmQuUGVyc29uYWxpdHk+DQorICAgIDxCb3JsYW5kLlByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L0JvcmxhbmQuUHJvamVjdFR5cGU+DQorICAgIDxCb3JsYW5kUHJvamVjdD4NCis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZXhwMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgWFAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMSI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMiI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXHNyYzsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTAiPk5PX1NUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iSXRlbTAiPjMyPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0xIj4xNjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuQ3BwLlRhcmdldHMiIC8+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LWRlYXRoLXRlc3QuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MzwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LW1lc3NhZ2UuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+NDwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXBhcmFtLXRlc3QuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+NTwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXNwaS5oIj4NCisgICAgICA8QnVpbGRPcmRlcj42PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QtdGVzdC1wYXJ0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjc8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC10eXBlZC10ZXN0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjg8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4wPC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3RfcHJlZF9pbXBsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdF9wcm9kLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjI8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjk8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1maWxlcGF0aC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMDwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LWludGVybmFsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjExPC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtbGlua2VkX3B0ci5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMjwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE0PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtcGFyYW0tdXRpbC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMzwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBvcnQuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTU8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1zdHJpbmcuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTY8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC10eXBlLXV0aWwuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTc8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPENwcENvbXBpbGUgSW5jbHVkZT0iZ3Rlc3RfYWxsLmNjIj4NCisgICAgICA8QnVpbGRPcmRlcj4xODwvQnVpbGRPcmRlcj4NCisgICAgPC9DcHBDb21waWxlPg0KKyAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4NCisgICAgICA8S2V5PkNmZ18xPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPg0KKyAgICAgIDxLZXk+Q2ZnXzI8L0tleT4NCisgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2NvZGVnZWFyL2d0ZXN0Lmdyb3VwcHJvaiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMzFjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKQEAgLTAsMCArMSw1NCBAQAor77u/PFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3RHdWlkPntjMWQ5MjNlMC02Y2JhLTQzMzItOWI2Zi0zNDIwYWNiZjUwOTF9PC9Qcm9qZWN0R3VpZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXAgLz4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJndGVzdC5jYnByb2oiIC8+DQorICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJndGVzdF9tYWluLmNicHJvaiIgLz4NCisgICAgPFByb2plY3RzIEluY2x1ZGU9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWZhdWx0LlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZSAvPg0KKyAgICA8Qm9ybGFuZFByb2plY3Q+DQorPEJvcmxhbmRQcm9qZWN0IHhtbG5zPSIiPjxEZWZhdWx0LlBlcnNvbmFsaXR5PjwvRGVmYXVsdC5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdCI+DQorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9IiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdDpDbGVhbiI+DQorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9IkNsZWFuIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0Ok1ha2UiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3QuY2Jwcm9qIiBUYXJnZXRzPSJNYWtlIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X21haW4iPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9IiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF9tYWluOkNsZWFuIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X21haW4uY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF9tYWluOk1ha2UiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9Ik1ha2UiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfdW5pdHRlc3QiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSIiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfdW5pdHRlc3Q6Q2xlYW4iPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF91bml0dGVzdDpNYWtlIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iTWFrZSIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJCdWlsZCI+DQorICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9Imd0ZXN0O2d0ZXN0X21haW47Z3Rlc3RfdW5pdHRlc3QiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQ2xlYW4iPg0KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDpDbGVhbjtndGVzdF9tYWluOkNsZWFuO2d0ZXN0X3VuaXR0ZXN0OkNsZWFuIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Ik1ha2UiPg0KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDpNYWtlO2d0ZXN0X21haW46TWFrZTtndGVzdF91bml0dGVzdDpNYWtlIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5Hcm91cC5UYXJnZXRzIiAvPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfYWxsLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2NvZGVnZWFyL2d0ZXN0X2FsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFiMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2NvZGVnZWFyL2d0ZXN0X2FsbC5jYwpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorLy8NCisvLyBBdXRob3I6IEpvc2ggS2VsbGV5IChqb3Noa2VsQGdtYWlsLmNvbSkNCisvLw0KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KKy8vDQorLy8gQysrQnVpbGRlcidzIElERSBjYW5ub3QgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSBmcm9tIGZpbGVzIHdpdGggaHlwaGVucw0KKy8vIGluIHRoZWlyIG5hbWUuICBTZWUgaHR0cDovL3FjLmNvZGVnZWFyLmNvbS93Yy9xY21haW4uYXNweD9kPTcwOTc3IC4NCisvLyBUaGlzIGZpbGUgc2VydmVzIGFzIGEgd29ya2Fyb3VuZC4NCisNCisjaW5jbHVkZSAic3JjL2d0ZXN0LWFsbC5jYyINCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfbGluay5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOGVjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfbGluay5jYwpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorLy8NCisvLyBBdXRob3I6IEpvc2ggS2VsbGV5IChqb3Noa2VsQGdtYWlsLmNvbSkNCisvLw0KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KKy8vDQorLy8gTGlua3MgZ3Rlc3QubGliIGFuZCBndGVzdF9tYWluLmxpYiBpbnRvIHRoZSBjdXJyZW50IHByb2plY3QgaW4gQysrQnVpbGRlci4NCisvLyBUaGlzIG1lYW5zIHRoYXQgdGhlc2UgbGlicmFyaWVzIGNhbid0IGJlIHJlbmFtZWQsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0bw0KKy8vIGVuc3VyZSB0aGF0IERlYnVnIHZlcnN1cyBSZWxlYXNlIHRlc3QgYnVpbGRzIGFyZSBsaW5rZWQgYWdhaW5zdCB0aGUNCisvLyBhcHByb3ByaWF0ZSBEZWJ1ZyBvciBSZWxlYXNlIGJ1aWxkIG9mIHRoZSBsaWJyYXJpZXMuDQorDQorI3ByYWdtYSBsaW5rICJndGVzdC5saWIiDQorI3ByYWdtYSBsaW5rICJndGVzdF9tYWluLmxpYiINCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2ogYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2Y2UxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvagpAQCAtMCwwICsxLDgyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxQcm9qZWN0R3VpZD57YmNhMzdhNzItNWIwNy00NmNmLWI0NGUtODlmOGUwNjQ1MWEyfTwvUHJvamVjdEd1aWQ+DQorICAgIDxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPlJlbGVhc2U8L0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgICAgPENmZ18yPnRydWU8L0NmZ18yPg0KKyAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD50cnVlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCisgICAgPE91dHB1dEV4dD5saWI8L091dHB1dEV4dD4NCisgICAgPERDQ19DQnVpbGRlck91dHB1dD5KUEhORTwvRENDX0NCdWlsZGVyT3V0cHV0Pg0KKyAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQorICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+DQorICAgIDxVc2VQYWNrYWdlcz50cnVlPC9Vc2VQYWNrYWdlcz4NCisgICAgPFByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L1Byb2plY3RUeXBlPg0KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQorICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO2RjbFppcEZvcmdlZDExLmJwaTt2Y2xaaXBGb3JnZWQxMS5icGk7R1IzMl9CRFMyMDA2LmJwaTtHUjMyX0RTR05fQkRTMjAwNi5icGk7SmNsLmJwaTtKY2xWY2wuYnBpO0p2Q29yZUQxMVIuYnBpO0p2U3lzdGVtRDExUi5icGk7SnZTdGRDdHJsc0QxMVIuYnBpO0p2QXBwRnJtRDExUi5icGk7SnZCYW5kc0QxMVIuYnBpO0p2REJEMTFSLmJwaTtKdkRsZ3NEMTFSLmJwaTtKdkJERUQxMVIuYnBpO0p2Q21wRDExUi5icGk7SnZDcnlwdEQxMVIuYnBpO0p2Q3RybHNEMTFSLmJwaTtKdkN1c3RvbUQxMVIuYnBpO0p2RG9ja2luZ0QxMVIuYnBpO0p2RG90TmV0Q3RybHNEMTFSLmJwaTtKdkVESUQxMVIuYnBpO0p2R2xvYnVzRDExUi5icGk7SnZITUlEMTFSLmJwaTtKdkludGVycHJldGVyRDExUi5icGk7SnZKYW5zRDExUi5icGk7SnZNYW5hZ2VkVGhyZWFkc0QxMVIuYnBpO0p2TU1EMTFSLmJwaTtKdk5ldEQxMVIuYnBpO0p2UGFnZUNvbXBzRDExUi5icGk7SnZQbHVnaW5EMTFSLmJwaTtKdlByaW50UHJldmlld0QxMVIuYnBpO0p2UnVudGltZURlc2lnbkQxMVIuYnBpO0p2VGltZUZyYW1ld29ya0QxMVIuYnBpO0p2VmFsaWRhdG9yc0QxMVIuYnBpO0p2V2l6YXJkRDExUi5icGk7SnZYUEN0cmxzRDExUi5icGk7VmNsU21wLmJwaTtDRXhjZXB0aW9uRXhwZXJ0MTEuYnBpPC9QYWNrYWdlSW1wb3J0cz4NCisgICAgPEJDQ193cGFyPmZhbHNlPC9CQ0Nfd3Bhcj4NCisgICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9JbmNsdWRlUGF0aD4NCisgICAgPEFsbFBhY2thZ2VMaWJzPnJ0bC5saWI7dmNsLmxpYjwvQWxsUGFja2FnZUxpYnM+DQorICAgIDxUTElCX1BhZ2VTaXplPjMyPC9UTElCX1BhZ2VTaXplPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQorICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCisgICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KKyAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQorICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KKyAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQorICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCisgICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCisgICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Cb3JsYW5kLlByb2plY3RUeXBlPg0KKyAgICA8Qm9ybGFuZFByb2plY3Q+DQorPEJvcmxhbmRQcm9qZWN0PjxDUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjxWZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPjwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyI+PC9WZXJzaW9uSW5mb0tleXM+PC9WZXJzaW9uSW5mb0tleXM+PERlYnVnZ2luZz48RGVidWdnaW5nIE5hbWU9IkRlYnVnU291cmNlRGlycyI+PC9EZWJ1Z2dpbmc+PC9EZWJ1Z2dpbmc+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUnVuUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iRGVidWdDV0QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJIb3N0QXBwbGljYXRpb24iPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVIb3N0Ij48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGF0aCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZVBhcmFtcyI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUxhdW5jaGVyIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iVXNlUmVtb3RlTGF1bmNoZXIiPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUNXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZURlYnVnIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1ZyBTeW1ib2xzIFNlYXJjaCBQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZEFsbFN5bWJvbHMiPlRydWU8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZFVuc3BlY2lmaWVkU3ltYm9scyI+RmFsc2U8L1BhcmFtZXRlcnM+PC9QYXJhbWV0ZXJzPjxFeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2UyazEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIDIwMDAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2V4cDEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIFhQIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+DQorICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxzcmM7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0wIj4zMjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJJdGVtMSI+MTY8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkNwcC5UYXJnZXRzIiAvPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENwcENvbXBpbGUgSW5jbHVkZT0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjA8L0J1aWxkT3JkZXI+DQorICAgIDwvQ3BwQ29tcGlsZT4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQorICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCisgICAgICA8S2V5PkNmZ18yPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb2RlZ2Vhci9ndGVzdF91bml0dGVzdC5jYnByb2ogYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWRiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCkBAIC0wLDAgKzEsODggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3RHdWlkPntlZWE2MzM5My01YWM1LTRiOWMtODkwOS1kNzVmZWYyZGFhNDF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2UnIG9yICckKEJhc2UpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+DQorICAgIDxCYXNlPnRydWU8L0Jhc2U+DQorICAgIDxDZmdfMT50cnVlPC9DZmdfMT4NCisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4NCisgICAgPE91dHB1dEV4dD5leGU8L091dHB1dEV4dD4NCisgICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPnRydWU8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KKyAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQorICAgIDxEQ0NfQ0J1aWxkZXJPdXRwdXQ+SlBITkU8L0RDQ19DQnVpbGRlck91dHB1dD4NCisgICAgPER5bmFtaWNSVEw+dHJ1ZTwvRHluYW1pY1JUTD4NCisgICAgPElMSU5LX09iamVjdFNlYXJjaFBhdGg+Li5cdGVzdDwvSUxJTktfT2JqZWN0U2VhcmNoUGF0aD4NCisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPg0KKyAgICA8UHJvamVjdFR5cGU+Q3BwQ29uc29sZUFwcGxpY2F0aW9uPC9Qcm9qZWN0VHlwZT4NCisgICAgPE5vVkNMPnRydWU8L05vVkNMPg0KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQorICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO0pjbC5icGk7SmNsVmNsLmJwaTtKdkNvcmVEMTFSLmJwaTtKdlN5c3RlbUQxMVIuYnBpO0p2U3RkQ3RybHNEMTFSLmJwaTtKdkFwcEZybUQxMVIuYnBpO0p2QmFuZHNEMTFSLmJwaTtKdkRCRDExUi5icGk7SnZEbGdzRDExUi5icGk7SnZCREVEMTFSLmJwaTtKdkNtcEQxMVIuYnBpO0p2Q3J5cHREMTFSLmJwaTtKdkN0cmxzRDExUi5icGk7SnZDdXN0b21EMTFSLmJwaTtKdkRvY2tpbmdEMTFSLmJwaTtKdkRvdE5ldEN0cmxzRDExUi5icGk7SnZFRElEMTFSLmJwaTtKdkdsb2J1c0QxMVIuYnBpO0p2SE1JRDExUi5icGk7SnZJbnRlcnByZXRlckQxMVIuYnBpO0p2SmFuc0QxMVIuYnBpO0p2TWFuYWdlZFRocmVhZHNEMTFSLmJwaTtKdk1NRDExUi5icGk7SnZOZXREMTFSLmJwaTtKdlBhZ2VDb21wc0QxMVIuYnBpO0p2UGx1Z2luRDExUi5icGk7SnZQcmludFByZXZpZXdEMTFSLmJwaTtKdlJ1bnRpbWVEZXNpZ25EMTFSLmJwaTtKdlRpbWVGcmFtZXdvcmtEMTFSLmJwaTtKdlZhbGlkYXRvcnNEMTFSLmJwaTtKdldpemFyZEQxMVIuYnBpO0p2WFBDdHJsc0QxMVIuYnBpO1ZjbFNtcC5icGk8L1BhY2thZ2VJbXBvcnRzPg0KKyAgICA8QkNDX3dwYXI+ZmFsc2U8L0JDQ193cGFyPg0KKyAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9JbmNsdWRlUGF0aD4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOy4uXHRlc3Q8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgICA8TXVsdGl0aHJlYWRlZD50cnVlPC9NdWx0aXRocmVhZGVkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQorICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCisgICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KKyAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQorICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KKyAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQorICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCisgICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCisgICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBDb25zb2xlQXBwbGljYXRpb248L0JvcmxhbmQuUHJvamVjdFR5cGU+DQorICAgIDxCb3JsYW5kUHJvamVjdD4NCis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZXhwMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgWFAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXGluY2x1ZGU7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0yIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9Ikl0ZW0xIj4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazsuLlx0ZXN0PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOyQoT1VUUFVURElSKTsuLlx0ZXN0PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4yPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTEiPlNUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuQ3BwLlRhcmdldHMiIC8+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q3BwQ29tcGlsZSBJbmNsdWRlPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCisgICAgICA8QnVpbGRPcmRlcj4wPC9CdWlsZE9yZGVyPg0KKyAgICA8L0NwcENvbXBpbGU+DQorICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Imd0ZXN0X2xpbmsuY2MiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE8L0J1aWxkT3JkZXI+DQorICAgIDwvQ3BwQ29tcGlsZT4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQorICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCisgICAgICA8S2V5PkNmZ18yPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9jb25maWd1cmUuYWMgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjYwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsNjggQEAKK200X2luY2x1ZGUobTQvYWN4X3B0aHJlYWQubTQpCisKKyMgQXQgdGhpcyBwb2ludCwgdGhlIFhjb2RlIHByb2plY3QgYXNzdW1lcyB0aGUgdmVyc2lvbiBzdHJpbmcgd2lsbCBiZSB0aHJlZQorIyBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgc3Vycm91bmRlZCBieSBzcXVhcmUgYnJhY2tldHMgKGUuZy4KKyMgIlsxLjAuMV0iKS4gSXQgYWxzbyBhc3VtZXMgdGhhdCB0aGVyZSB3b24ndCBiZSBhbnkgY2xvc2luZyBwYXJlbnRoZXNpcworIyBiZXR3ZWVuICJBQ19JTklUKCIgYW5kIHRoZSBjbG9zaW5nICIpIiBpbmNsdWRpbmcgY29tbWVudHMgYW5kIHN0cmluZ3MuCitBQ19JTklUKFtHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrXSwKKyAgICAgICAgWzEuNi4wXSwKKyAgICAgICAgW2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbV0sCisgICAgICAgIFtndGVzdF0pCisKKyMgUHJvdmlkZSB2YXJpb3VzIG9wdGlvbnMgdG8gaW5pdGlhbGl6ZSB0aGUgQXV0b2NvbmYgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzZXMuCitBQ19QUkVSRVEoWzIuNTldKQorQUNfQ09ORklHX1NSQ0RJUihbLi9DT1BZSU5HXSkKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKK0FDX0NPTkZJR19BVVhfRElSKFtidWlsZC1hdXhdKQorQUNfQ09ORklHX0hFQURFUlMoW2J1aWxkLWF1eC9jb25maWcuaF0pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKK0FDX0NPTkZJR19GSUxFUyhbc2NyaXB0cy9ndGVzdC1jb25maWddLCBbY2htb2QgK3ggc2NyaXB0cy9ndGVzdC1jb25maWddKQorCisjIEluaXRpYWxpemUgQXV0b21ha2Ugd2l0aCB2YXJpb3VzIG9wdGlvbnMuIFdlIHJlcXVpcmUgYXQgbGVhc3QgdjEuOSwgcHJldmVudAorIyBwZWRhbnRpYyBjb21wbGFpbnRzIGFib3V0IHBhY2thZ2UgZmlsZXMsIGFuZCBlbmFibGUgdmFyaW91cyBkaXN0cmlidXRpb24KKyMgdGFyZ2V0cy4KK0FNX0lOSVRfQVVUT01BS0UoWzEuOSBkaXN0LWJ6aXAyIGRpc3QtemlwIGZvcmVpZ24gc3ViZGlyLW9iamVjdHNdKQorCisjIENoZWNrIGZvciBwcm9ncmFtcyB1c2VkIGluIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgorQUNfUFJPR19DQworQUNfUFJPR19DWFgKK0FDX0xBTkcoW0MrK10pCitBQ19QUk9HX0xJQlRPT0wKKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogQ3VycmVudGx5IHdlIGFyZW4ndCBydW5uaW5nIHRoZSBQeXRob24gdGVzdHMKKyMgYWdhaW5zdCB0aGUgaW50ZXJwcmV0ZXIgZGV0ZWN0ZWQgYnkgQU1fUEFUSF9QWVRIT04sIGFuZCBzbyB3ZSBjb25kaXRpb24KKyMgSEFWRV9QWVRIT04gYnkgcmVxdWlyaW5nICJweXRob24iIHRvIGJlIGluIHRoZSBQQVRILCBhbmQgdGhhdCBpbnRlcnByZXRlcidzCisjIHZlcnNpb24gdG8gYmUgPj0gMi4zLiBUaGlzIHdpbGwgYWxsb3cgdGhlIHNjcmlwdHMgdG8gdXNlIGEgIi91c3IvYmluL2VudiIKKyMgaGFzaGJhbmcuCitQWVRIT049ICAjIFdlICpkbyBub3QqIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBweXRob24gaW50ZXJwcmV0ZXIKK0FDX1BBVEhfUFJPRyhbUFlUSE9OXSxbcHl0aG9uXSxbOl0pCitBU19JRihbdGVzdCAiJFBZVEhPTiIgIT0gIjoiXSwKKyAgICAgIFtBTV9QWVRIT05fQ0hFQ0tfVkVSU0lPTihbJFBZVEhPTl0sWzIuM10sWzpdLFtQWVRIT049IjoiXSldKQorQU1fQ09ORElUSU9OQUwoW0hBVkVfUFlUSE9OXSxbdGVzdCAiJFBZVEhPTiIgIT0gIjoiXSkKKworIyBDb25maWd1cmUgcHRocmVhZHMuCitBQ19BUkdfV0lUSChbcHRocmVhZHNdLAorICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcHRocmVhZHNdLAorICAgICAgICAgICAgICAgW3VzZSBwdGhyZWFkcyAoZGVmYXVsdCBpcyB5ZXMpXSldLAorICAgICAgICAgICAgW3dpdGhfcHRocmVhZHM9JHdpdGh2YWxdLAorICAgICAgICAgICAgW3dpdGhfcHRocmVhZHM9Y2hlY2tdKQorCitoYXZlX3B0aHJlYWRzPW5vCitBU19JRihbdGVzdCAieCR3aXRoX3B0aHJlYWRzIiAhPSAieG5vIl0sCisgICAgICBbQUNYX1BUSFJFQUQoCisgICAgICAgIFtdLAorICAgICAgICBbQVNfSUYoW3Rlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhjaGVjayJdLAorICAgICAgICAgICAgICAgW0FDX01TR19GQUlMVVJFKAorICAgICAgICAgICAgICAgICBbLS13aXRoLXB0aHJlYWRzIHdhcyBzcGVjaWZpZWQsIGJ1dCB1bmFibGUgdG8gYmUgdXNlZF0pXSldKQorICAgICAgIGhhdmVfcHRocmVhZHM9IiRhY3hfcHRocmVhZF9vayJdKQorQU1fQ09ORElUSU9OQUwoW0hBVkVfUFRIUkVBRFNdLFt0ZXN0ICJ4JGhhdmVfcHRocmVhZHMiID09ICJ4eWVzIl0pCitBQ19TVUJTVChQVEhSRUFEX0NGTEFHUykKK0FDX1NVQlNUKFBUSFJFQURfTElCUykKKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayBmb3IgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gaGVhZGVycy4KKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayB0aGUgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBvdGhlciBjb21waWxlcgorIyBhbmQgYXJjaGl0ZWN0dXJlIGNoYXJhY3RlcmlzdGljcy4KKworIyBPdXRwdXQgdGhlIGdlbmVyYXRlZCBmaWxlcy4gTm8gZnVydGhlciBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIHVzZWQuCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjc4ODNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oCkBAIC0wLDAgKzEsMjgzIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIGRlYXRoIHRlc3RzLiAgSXQgaXMKKy8vICNpbmNsdWRlZCBieSBndGVzdC5oIHNvIGEgdXNlciBkb2Vzbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzCisvLyBkaXJlY3RseS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBzdHlsZSBvZiBkZWF0aCB0ZXN0cy4gIFZhbGlkIHZhbHVlcyBhcmUgInRocmVhZHNhZmUiLAorLy8gbWVhbmluZyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Mgd2lsbCByZS1leGVjdXRlIHRoZSB0ZXN0IGJpbmFyeQorLy8gZnJvbSB0aGUgc3RhcnQsIHJ1bm5pbmcgb25seSBhIHNpbmdsZSBkZWF0aCB0ZXN0LCBvciAiZmFzdCIsCisvLyBtZWFuaW5nIHRoYXQgdGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBleGVjdXRlIHRoZSB0ZXN0IGxvZ2ljIGltbWVkaWF0ZWx5CisvLyBhZnRlciBmb3JraW5nLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGRlYXRoX3Rlc3Rfc3R5bGUpOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBkZWF0aCB0ZXN0cy4KKworLy8gSGVyZSdzIHdoYXQgaGFwcGVucyB3aGVuIGFuIEFTU0VSVF9ERUFUSCogb3IgRVhQRUNUX0RFQVRIKiBpcworLy8gZXhlY3V0ZWQ6CisvLworLy8gICAxLiBJdCBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYWN0aXZlCisvLyAgIHRocmVhZC4gIFRoaXMgaXMgYmVjYXVzZSBpdCdzIHNhZmUgdG8gZm9yaygpIG9yIGNsb25lKCkgb25seQorLy8gICB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRocmVhZC4KKy8vCisvLyAgIDIuIFRoZSBwYXJlbnQgcHJvY2VzcyBjbG9uZSgpcyBhIHN1Yi1wcm9jZXNzIGFuZCBydW5zIHRoZSBkZWF0aAorLy8gICB0ZXN0IGluIGl0OyB0aGUgc3ViLXByb2Nlc3MgZXhpdHMgd2l0aCBjb2RlIDAgYXQgdGhlIGVuZCBvZiB0aGUKKy8vICAgZGVhdGggdGVzdCwgaWYgaXQgaGFzbid0IGV4aXRlZCBhbHJlYWR5LgorLy8KKy8vICAgMy4gVGhlIHBhcmVudCBwcm9jZXNzIHdhaXRzIGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlLgorLy8KKy8vICAgNC4gVGhlIHBhcmVudCBwcm9jZXNzIGNoZWNrcyB0aGUgZXhpdCBjb2RlIGFuZCBlcnJvciBtZXNzYWdlIG9mCisvLyAgIHRoZSBzdWItcHJvY2Vzcy4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEFTU0VSVF9ERUFUSChzZXJ2ZXIuU2VuZE1lc3NhZ2UoNTYsICJIZWxsbyIpLCAiSW52YWxpZCBwb3J0IG51bWJlciIpOworLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworLy8gICAgIEVYUEVDVF9ERUFUSChzZXJ2ZXIuUHJvY2Vzc1JlcXVlc3QoaSksCisvLyAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVlc3QgLiogaW4gUHJvY2Vzc1JlcXVlc3QoKSIpCisvLyAgICAgICAgIDw8ICJGYWlsZWQgdG8gZGllIG9uIHJlcXVlc3QgIiA8PCBpKTsKKy8vICAgfQorLy8KKy8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKKy8vCisvLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgeworLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKKy8vCisvLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgorLy8KKy8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAorLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCisvLworLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAorLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAorLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCisvLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQorLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAorLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAorLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KKy8vCisvLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQorLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCisvLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCisvLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7CisvLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCisvLyAgIG5hdHVyYWwgbnVtYmVycy4KKy8vCisvLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYworLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXGYgICBtYXRjaGVzIFxmCisvLyAgICAgXFxuICAgbWF0Y2hlcyBcbgorLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKKy8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KKy8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKKy8vICAgICBcXHQgICBtYXRjaGVzIFx0CisvLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgorLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCisvLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCisvLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KKy8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQorLy8KKy8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcworLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0CisvLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCisvLyAgIGFib3ZlIHN5bnRheC4KKy8vCisvLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAorLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQorLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKKy8vICAgYSBjaGlsZCBwcm9jZXNzLgorLy8KKy8vIEtub3duIGNhdmVhdHM6CisvLworLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKKy8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgorLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAorLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAorLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCisvLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCisvLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKKy8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5CisvLyAgIGRpcmVjdG9yeSBpbiBQQVRILgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KKworLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCisvLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAorLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgorIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCisgICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQorLy8gdGVzdCBjYXNlLCBpZiBhbnk6CisjIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKKyAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQorLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQorLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KKyMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKKworLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KK2NsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKKworICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKK307CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCisvLyBnaXZlbiBzaWduYWwuCitjbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOworICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKKyBwcml2YXRlOgorICBjb25zdCBpbnQgc2lnbnVtXzsKK307CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgorLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAorLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKKy8vIGluIGRlYnVnIG1vZGUuCisvLworLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQorLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKKy8vCisvLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7CisvLyAgIGlmIChzaWRlZWZmZWN0KSB7CisvLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKKy8vICAgfQorLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOworLy8gICByZXR1cm4gMTI7CisvLyB9CisvLworLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7CisvLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKKy8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KKy8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7CisvLworLy8gI2lmZGVmIE5ERUJVRworLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgorLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworLy8gI2Vsc2UKKy8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgorLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisvLyAjZW5kaWYKKy8vIH0KKy8vCisvLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCisvLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCisvLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91CisvLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0CisvLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCisvLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgorLy8KKy8vIEVYUEVDVF9ERUJVR19ERUFUSCh7CisvLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KKy8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKKy8vIH0sICJkZWF0aCIpOworLy8KKyMgaWZkZWYgTkRFQlVHCisKKyMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBkbyB7IHN0YXRlbWVudDsgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIGRvIHsgc3RhdGVtZW50OyB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjIGVsc2UKKworIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorCisjICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCisvLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCisvLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKKy8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0CisvLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisjIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorI2Vsc2UKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzE0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgTWVzc2FnZSBjbGFzcy4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBNZXNzYWdlIGNsYXNzIHdvcmtzIGxpa2UgYW4gb3N0cmVhbSByZXBlYXRlci4KKy8vCisvLyBUeXBpY2FsIHVzYWdlOgorLy8KKy8vICAgMS4gWW91IHN0cmVhbSBhIGJ1bmNoIG9mIHZhbHVlcyB0byBhIE1lc3NhZ2Ugb2JqZWN0LgorLy8gICAgICBJdCB3aWxsIHJlbWVtYmVyIHRoZSB0ZXh0IGluIGEgc3RyaW5nc3RyZWFtLgorLy8gICAyLiBUaGVuIHlvdSBzdHJlYW0gdGhlIE1lc3NhZ2Ugb2JqZWN0IHRvIGFuIG9zdHJlYW0uCisvLyAgICAgIFRoaXMgY2F1c2VzIHRoZSB0ZXh0IGluIHRoZSBNZXNzYWdlIHRvIGJlIHN0cmVhbWVkCisvLyAgICAgIHRvIHRoZSBvc3RyZWFtLgorLy8KKy8vIEZvciBleGFtcGxlOworLy8KKy8vICAgdGVzdGluZzo6TWVzc2FnZSBmb287CisvLyAgIGZvbyA8PCAxIDw8ICIgIT0gIiA8PCAyOworLy8gICBzdGQ6OmNvdXQgPDwgZm9vOworLy8KKy8vIHdpbGwgcHJpbnQgIjEgIT0gMiIuCisvLworLy8gTWVzc2FnZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5oZXJpdGVkIGZyb20uICBJbiBwYXJ0aWN1bGFyLCBpdHMKKy8vIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCisvLworLy8gTm90ZSB0aGF0IHN0cmluZ3N0cmVhbSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGdjYyBhbmQgaW4gTVNWQy4gIFlvdQorLy8gY2FuIHN0cmVhbSBhIE5VTEwgY2hhciBwb2ludGVyIHRvIGl0IGluIHRoZSBmb3JtZXIsIGJ1dCBub3QgaW4gdGhlCisvLyBsYXR0ZXIgKGl0IGNhdXNlcyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHlvdSBkbykuICBUaGUgTWVzc2FnZQorLy8gY2xhc3MgaGlkZXMgdGhpcyBkaWZmZXJlbmNlIGJ5IHRyZWF0aW5nIGEgTlVMTCBjaGFyIHBvaW50ZXIgYXMKKy8vICIobnVsbCkiLgorY2xhc3MgR1RFU1RfQVBJXyBNZXNzYWdlIHsKKyBwcml2YXRlOgorICAvLyBUaGUgdHlwZSBvZiBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgZm9yCisgIC8vIG5hcnJvdyBzdHJlYW1zLgorICB0eXBlZGVmIHN0ZDo6b3N0cmVhbSYgKCpCYXNpY05hcnJvd0lvTWFuaXApKHN0ZDo6b3N0cmVhbSYpOworCisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCisgIC8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZgorICAvLyBBU1NFUlQvRVhQRUNUIGluIGEgcHJvY2VkdXJlIGFkZHMgb3ZlciAyMDAgYnl0ZXMgdG8gdGhlIHByb2NlZHVyZSdzCisgIC8vIHN0YWNrIGZyYW1lIGxlYWRpbmcgdG8gaHVnZSBzdGFjayBmcmFtZXMgaW4gc29tZSBjYXNlczsgZ2NjIGRvZXMgbm90IHJldXNlCisgIC8vIHRoZSBzdGFjayBzcGFjZS4KKyAgTWVzc2FnZSgpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CisgICAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKKyAgICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCisgICAgKnNzXyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMik7CisgIH0KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1zZykgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsgIC8vIE5PTElOVAorICAgICpzc18gPDwgbXNnLkdldFN0cmluZygpOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorICBleHBsaWNpdCBNZXNzYWdlKGNvbnN0IGNoYXIqIHN0cikgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsKKyAgICAqc3NfIDw8IHN0cjsKKyAgfQorCisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBTdHJlYW1zIGEgdmFsdWUgKGVpdGhlciBhIHBvaW50ZXIgb3Igbm90KSB0byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIFN0cmVhbUhlbHBlcih0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZWxzZQorICAvLyBTdHJlYW1zIGEgbm9uLXBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsKSB7CisgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXy5nZXQoKSwgdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTdHJlYW1zIGEgcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBvdmVybG9hZCBvZiB0aGUgcHJldmlvdXMgb25lLiAgV2hlbiB5b3UKKyAgLy8gc3RyZWFtIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQgYXMgaXQKKyAgLy8gaXMgbW9yZSBzcGVjaWFsaXplZC4gIChUaGUgQysrIFN0YW5kYXJkLCBzZWN0aW9uCisgIC8vIFt0ZW1wLmZ1bmMub3JkZXJdLikgIElmIHlvdSBzdHJlYW0gYSBub24tcG9pbnRlciwgdGhlbiB0aGUKKyAgLy8gcHJldmlvdXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQuCisgIC8vCisgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgb3ZlcmxvYWQgaXMgdGhhdCBzdHJlYW1pbmcgYSBOVUxMIHBvaW50ZXIgdG8KKyAgLy8gb3N0cmVhbSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCB5b3UKKyAgLy8gbWF5IGdldCAiMCIsICIobmlsKSIsICIobnVsbCkiLCBvciBhbiBhY2Nlc3MgdmlvbGF0aW9uLiAgVG8KKyAgLy8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0IGFjcm9zcyBjb21waWxlcnMsIHdlIGFsd2F5cyB0cmVhdCBOVUxMCisgIC8vIGFzICIobnVsbCkiLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KFQqIGNvbnN0JiBwb2ludGVyKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICA6OkdUZXN0U3RyZWFtVG9IZWxwZXIoc3NfLmdldCgpLCBwb2ludGVyKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdworICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCisgIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKKyAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGNvbXBpbGVyLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKKyAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKyAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorICBNZXNzYWdlJiBvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisgIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisgIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKyAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKyAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYSBTdHJpbmcuCisgIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIGludGVybmFsOjpTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6U3RyaW5nU3RyZWFtVG9TdHJpbmcoc3NfLmdldCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKworI2lmIEdURVNUX09TX1NZTUJJQU4KKyAgLy8gVGhlc2UgYXJlIG5lZWRlZCBhcyB0aGUgTm9raWEgU3ltYmlhbiBDb21waWxlciBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKyAgLy8gY29uc3QgVCYgYW5kIGNvbnN0IFQqIGluIGEgZnVuY3Rpb24gdGVtcGxhdGUuIFRoZSBOb2tpYSBjb21waWxlciBfY2FuXworICAvLyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLCBzbyBhCisgIC8vIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLCBhbmQgd2UgY2FuIG92ZXJsb2FkIG9uIHRoYXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OnRydWVfdHlwZSAvKmR1bW15Ki8sIFQqIHBvaW50ZXIpIHsKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICA6OkdUZXN0U3RyZWFtVG9IZWxwZXIoc3NfLmdldCgpLCBwb2ludGVyKTsKKyAgICB9CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6ZmFsc2VfdHlwZSAvKmR1bW15Ki8sIGNvbnN0IFQmIHZhbHVlKSB7CisgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXy5nZXQoKSwgdmFsdWUpOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBXZSdsbCBob2xkIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IGhlcmUuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPCA6OnN0ZDo6c3RyaW5nc3RyZWFtPiBzc187CisKKyAgLy8gV2UgZGVjbGFyZSAoYnV0IGRvbid0IGltcGxlbWVudCkgdGhpcyB0byBwcmV2ZW50IHRoZSBjb21waWxlcgorICAvLyBmcm9tIGltcGxlbWVudGluZyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYpOworfTsKKworLy8gU3RyZWFtcyBhIE1lc3NhZ2UgdG8gYW4gb3N0cmVhbS4KK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE1lc3NhZ2UmIHNiKSB7CisgIHJldHVybiBvcyA8PCBzYi5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA3Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCkBAIC0wLDAgKzEsMTQyMSBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIE1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gaW4gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisKKworLy8gVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQKKy8vIHBhcmFtZXRlcnMgd2l0aG91dCB3cml0aW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSB0ZXN0LgorLy8KKy8vIEhlcmUgaXMgaG93IHlvdSB1c2UgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0czoKKworI2lmIDAKKworLy8gVG8gd3JpdGUgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgZmlyc3QgeW91IHNob3VsZCBkZWZpbmUgYSBmaXh0dXJlCisvLyBjbGFzcy4gSXQgaXMgdXN1YWxseSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUPiAoc2VlIGJlbG93IGZvcgorLy8gYW5vdGhlciBpbmhlcml0YW5jZSBzY2hlbWUgdGhhdCdzIHNvbWV0aW1lcyB1c2VmdWwgaW4gbW9yZSBjb21wbGljYXRlZAorLy8gY2xhc3MgaGllcmFyY2hpZXMpLCB3aGVyZSB0aGUgdHlwZSBvZiB5b3VyIHBhcmFtZXRlciB2YWx1ZXMuCisvLyBUZXN0V2l0aFBhcmFtPFQ+IGlzIGl0c2VsZiBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdC4gVCBjYW4gYmUgYW55CisvLyBjb3B5YWJsZSB0eXBlLiBJZiBpdCdzIGEgcmF3IHBvaW50ZXIsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQorLy8gbGlmZXNwYW4gb2YgdGhlIHBvaW50ZWQgdmFsdWVzLgorCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4geworICAvLyBZb3UgY2FuIGltcGxlbWVudCBhbGwgdGhlIHVzdWFsIGNsYXNzIGZpeHR1cmUgbWVtYmVycyBoZXJlLgorfTsKKworLy8gVGhlbiwgdXNlIHRoZSBURVNUX1AgbWFjcm8gdG8gZGVmaW5lIGFzIG1hbnkgcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gZm9yIHRoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gVGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiCisvLyBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLgorCitURVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciB3aXRoIHRoZSBHZXRQYXJhbSgpIG1ldGhvZAorICAvLyBvZiB0aGUgVGVzdFdpdGhQYXJhbTxUPiBjbGFzczoKKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworICAuLi4KK30KKworVEVTVF9QKEZvb1Rlc3QsIEhhc0JsYWhCbGFoKSB7CisgIC4uLgorfQorCisvLyBGaW5hbGx5LCB5b3UgY2FuIHVzZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdAorLy8gY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlcgorLy8gb2YgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsCisvLyAoc3VycHJpc2UhKSBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4gSGVyZSBpcyBhICBzdW1tYXJ5IG9mIHRoZW0sIHdoaWNoCisvLyBhcmUgYWxsIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZToKKy8vCisvLworLy8gIFJhbmdlKGJlZ2luLCBlbmQgWywgc3RlcF0pIC0gWWllbGRzIHZhbHVlcyB7YmVnaW4sIGJlZ2luK3N0ZXAsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbitzdGVwK3N0ZXAsIC4uLn0uIFRoZSB2YWx1ZXMgZG8gbm90CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGVuZC4gc3RlcCBkZWZhdWx0cyB0byAxLgorLy8gIFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pICAgIC0gWWllbGRzIHZhbHVlcyB7djEsIHYyLCAuLi4sIHZOfS4KKy8vICBWYWx1ZXNJbihjb250YWluZXIpICAgICAgICAtIFlpZWxkcyB2YWx1ZXMgZnJvbSBhIEMtc3R5bGUgYXJyYXksIGFuIFNUTAorLy8gIFZhbHVlc0luKGJlZ2luLGVuZCkgICAgICAgICAgY29udGFpbmVyLCBvciBhbiBpdGVyYXRvciByYW5nZSBbYmVnaW4sIGVuZCkuCisvLyAgQm9vbCgpICAgICAgICAgICAgICAgICAgICAgLSBZaWVsZHMgc2VxdWVuY2Uge2ZhbHNlLCB0cnVlfS4KKy8vICBDb21iaW5lKGcxLCBnMiwgLi4uLCBnTikgICAtIFlpZWxkcyBhbGwgY29tYmluYXRpb25zICh0aGUgQ2FydGVzaWFuIHByb2R1Y3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbWF0aCBzYXZ2eSkgb2YgdGhlIHZhbHVlcyBnZW5lcmF0ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBOIGdlbmVyYXRvcnMuCisvLworLy8gRm9yIG1vcmUgZGV0YWlscywgc2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgYmVsb3cKKy8vIGluIHRoaXMgZmlsZS4KKy8vCisvLyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gdGhlIEZvb1Rlc3QgdGVzdCBjYXNlCisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAibWVlbnkiLCAibWlueSIsIGFuZCAibW9lIi4KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKCJtZWVueSIsICJtaW55IiwgIm1vZSIpKTsKKworLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgKHllcywgeW91CisvLyBjYW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGVuIG9uY2UpIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUKKy8vIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yIGRpZmZlcmVudAorLy8gaW5zdGFudGlhdGlvbnMuIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZQorLy8gdGhlc2UgbmFtZXM6CisvLworLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJtZWVueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAibWlueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yIGZvciAibW9lIgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJtZWVueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAibWlueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yIGZvciAibW9lIgorLy8KKy8vIFlvdSBjYW4gdXNlIHRoZXNlIG5hbWVzIGluIC0tZ3Rlc3RfZmlsdGVyLgorLy8KKy8vIFRoaXMgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzIGZyb20gRm9vVGVzdCBhZ2FpbiwgZWFjaAorLy8gd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJjYXQiIGFuZCAiZG9nIjoKKworY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbm90aGVySW5zdGFudGlhdGlvbk5hbWUsIEZvb1Rlc3QsIFZhbHVlc0luKHBldHMpKTsKKworLy8gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgImNhdCIKKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgImRvZyIKKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgImNhdCIKKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgImRvZyIKKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzCisvLyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLCB3aGV0aGVyIHRoZWlyIGRlZmluaXRpb25zIGNvbWUgYmVmb3JlIG9yCisvLyBBRlRFUiB0aGUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agc3RhdGVtZW50LgorLy8KKy8vIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKGluY2x1ZGluZyBwYXJhbWV0ZXJzIHRvIHRoZQorLy8gZ2VuZXJhdG9ycykgYXJlIGV2YWx1YXRlZCBpbiBJbml0R29vZ2xlVGVzdCgpLCBhZnRlciBtYWluKCkgaGFzIHN0YXJ0ZWQuCisvLyBUaGlzIGFsbG93cyB0aGUgdXNlciBvbiBvbmUgaGFuZCwgdG8gYWRqdXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGluIG9yZGVyCisvLyB0byBkeW5hbWljYWxseSBkZXRlcm1pbmUgYSBzZXQgb2YgdGVzdHMgdG8gcnVuIGFuZCBvbiB0aGUgb3RoZXIgaGFuZCwKKy8vIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8gaW5zcGVjdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QKKy8vIHJlZmxlY3Rpb24gQVBJIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgZXhlY3V0ZWQuCisvLworLy8gWW91IGNhbiBzZWUgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGFuZCBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKKy8vIGZvciBtb3JlIGV4YW1wbGVzLgorLy8KKy8vIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gcHVibGlzaCB0aGUgQVBJIGZvciBkZWZpbmluZyBuZXcgcGFyYW1ldGVyCisvLyBnZW5lcmF0b3JzLiBCdXQgZm9yIG5vdyB0aGlzIGludGVyZmFjZSByZW1haW5zIHBhcnQgb2YgdGhlIGludGVybmFsCisvLyBpbXBsZW1lbnRhdGlvbiBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisvLworLy8KKy8vIEEgcGFyYW1ldGVyaXplZCB0ZXN0IGZpeHR1cmUgbXVzdCBiZSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdCBhbmQgZnJvbQorLy8gdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFQ+LCB3aGVyZSBUIGlzIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKKy8vIHZhbHVlcy4gSW5oZXJpdGluZyBmcm9tIFRlc3RXaXRoUGFyYW08VD4gc2F0aXNmaWVzIHRoYXQgcmVxdWlyZW1lbnQgYmVjYXVzZQorLy8gVGVzdFdpdGhQYXJhbTxUPiBpbmhlcml0cyBmcm9tIGJvdGggVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3JlCisvLyBjb21wbGljYXRlZCBoaWVyYXJjaGllcywgaG93ZXZlciwgaXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBpbmhlcml0CisvLyBzZXBhcmF0ZWx5IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBGb3IgZXhhbXBsZToKKworY2xhc3MgQmFzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgLy8gWW91IGNhbiBpbmhlcml0IGFsbCB0aGUgdXN1YWwgbWVtYmVycyBmb3IgYSBub24tcGFyYW1ldGVyaXplZCB0ZXN0CisgIC8vIGZpeHR1cmUgaGVyZS4KK307CisKK2NsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIEJhc2VUZXN0LCBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50PiB7CisgIC8vIFRoZSB1c3VhbCB0ZXN0IGZpeHR1cmUgbWVtYmVycyBnbyBoZXJlIHRvby4KK307CisKK1RFU1RfRihCYXNlVGVzdCwgSGFzRm9vKSB7CisgIC8vIFRoaXMgaXMgYW4gb3JkaW5hcnkgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdC4KK30KKworVEVTVF9QKERlcml2ZWRUZXN0LCBEb2VzQmxhaCkgeworICAvLyBHZXRQYXJhbSB3b3JrcyBqdXN0IHRoZSBzYW1lIGhlcmUgYXMgaWYgeW91IGluaGVyaXQgZnJvbSBUZXN0V2l0aFBhcmFtLgorICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7Cit9CisKKyNlbmRpZiAgLy8gMAorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyMgaW5jbHVkZSA8dXRpbGl0eT4KKyNlbmRpZgorCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZ1bmN0aW9ucyBwcm9kdWNpbmcgcGFyYW1ldGVyIGdlbmVyYXRvcnMuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtCisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBXaGVuIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgaXMgaW5zdGFudGlhdGVkCisvLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMKKy8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZAorLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6CisvLworLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsKKy8vCisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoaXMpIHsKKy8vIH0KKy8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgeworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOworLy8KKworLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFJhbmdlKHN0YXJ0LCBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLAorLy8gICAgIHN0YXJ0KzIsIC4uLiwgfS4KKy8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLAorLy8gICAgIHN0YXJ0K3N0ZXArc3RlcCwgLi4uLCB9LgorLy8gTm90ZXM6CisvLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2UgezEsIDIsIDMsIDR9LiBSYW5nZSgxLCA5LCAyKQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4KKy8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcgorLy8gICAgIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB1c2VyIGRlZmluZWQgdHlwZSBzYXRpc2Z5aW5nIHRoZXNlIGNvbmRpdGlvbnM6CisvLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuCisvLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3IKKy8vICAgICAgIHR3by1vcGVyYW5kIHZlcnNpb24pLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuCisvLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLgorLy8gICAqIENvbmRpdGlvbiBzdGFydCA8IGVuZCBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgcmVzdWx0aW5nIHNlcXVlbmNlcworLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsKKyAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6UmFuZ2VHZW5lcmF0b3I8VCwgSW5jcmVtZW50VD4oc3RhcnQsIGVuZCwgc3RlcCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgeworICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7Cit9CisKKy8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tCisvLyBhIGNvbnRhaW5lci4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgQy1zdHlsZSBhcnJheS4KKy8vIFZhbHVlc0luKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgorLy8gVmFsdWVzSW4oSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UKKy8vICAgICBpdGVyYXRvcnMgY2FuIGFsc28gYmUgcGxhaW4gQyBwb2ludGVycy4KKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMKKy8vIHBhc3NlZCBpbiBhbmQga2VlcHMgdGhlbSB0byBnZW5lcmF0ZSB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTKCkuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdAorLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoKKy8vCisvLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOworLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoKKy8vCisvLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgeworLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2OworLy8gICB2LnB1c2hfYmFjaygiYSIpOworLy8gICB2LnB1c2hfYmFjaygiYiIpOworLy8gICByZXR1cm4gdjsKKy8vIH0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBTdGxTdHJpbmdUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7CisvLworLy8KKy8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QKKy8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOgorLy8KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgeworLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0OworLy8gICBsaXN0LnB1c2hfYmFjaygnYScpOworLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOworLy8gICByZXR1cm4gbGlzdDsKKy8vIH0KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KK1ZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkgeworICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj4KKyAgICAgIDo6dmFsdWVfdHlwZSBQYXJhbVR5cGU7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yPFBhcmFtVHlwZT4oYmVnaW4sIGVuZCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkgeworICByZXR1cm4gVmFsdWVzSW4oYXJyYXksIGFycmF5ICsgTik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgeworICByZXR1cm4gVmFsdWVzSW4oY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Cit9CisKKy8vIFZhbHVlcygpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIGZyb20gZXhwbGljaXRseSBzcGVjaWZpZWQgbGlzdCBvZgorLy8gcGFyYW1ldGVycy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlcyhUIHYxLCBUIHYyLCAuLi4sIFQgdk4pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgdjEsIHYyLCAuLi4sIHZOLgorLy8KKy8vIEZvciBleGFtcGxlLCB0aGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXJUZXN0IGVhY2gKKy8vIHdpdGggdmFsdWVzICJvbmUiLCAidHdvIiwgYW5kICJ0aHJlZSI6CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTnVtU2VxdWVuY2UsIEJhclRlc3QsIFZhbHVlcygib25lIiwgInR3byIsICJ0aHJlZSIpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXpUZXN0IGVhY2ggd2l0aCB2YWx1ZXMgMSwgMiwgMy41LgorLy8gVGhlIGV4YWN0IHR5cGUgb2YgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBpbiBCYXpUZXN0LgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEZsb2F0aW5nTnVtYmVycywgQmF6VGVzdCwgVmFsdWVzKDEsIDIsIDMuNSkpOworLy8KKy8vIEN1cnJlbnRseSwgVmFsdWVzKCkgc3VwcG9ydHMgZnJvbSAxIHRvIDUwIHBhcmFtZXRlcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxPFQxPiBWYWx1ZXMoVDEgdjEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4odjEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4gVmFsdWVzKFQxIHYxLCBUMiB2MikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4odjEsIHYyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPih2MSwgdjIsIHYzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0PFQxLCBUMiwgVDMsIFQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4odjEsIHYyLCB2MywgdjQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTU8VDEsIFQyLCBUMywgVDQsIFQ1Pih2MSwgdjIsIHYzLCB2NCwgdjUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KHYxLCB2MiwgdjMsIHY0LCB2NSwKKyAgICAgIHY2LCB2Nyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KHYxLCB2MiwgdjMsCisgICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPih2MSwKKyAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgIFQxMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsCisgICAgICBUMTE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICBUMTI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICBUMTM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAorICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAorICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAorICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCisgICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICBUMjY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsCisgICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICBUMjc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgIFQyOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCisgICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitpbnRlcm5hbDo6VmFsdWVBcnJheTMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAorICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCisgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKKyAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKKyAgICBUMzIgdjMyLCBUMzMgdjMzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLAorICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksCisgICAgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2Pih2MSwgdjIsIHYzLCB2NCwKKyAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+KHYxLCB2MiwgdjMsCisgICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywKKyAgICAgIHYzNCwgdjM1LCB2MzYsIHYzNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LAorICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsCisgICAgVDM3IHYzNywgVDM4IHYzOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4Pih2MSwgdjIsCisgICAgICB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwKKyAgICAgIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLAorICAgICAgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5Pih2MSwKKyAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsCisgICAgICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwKKyAgICAgIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLAorICAgIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksCisgICAgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywKKyAgICBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LAorICAgIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksCisgICAgICB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgVDQxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwKKyAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LAorICAgICAgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgVDQyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0Mj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLAorICAgICAgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsCisgICAgICB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwKKyAgICAgIHY0Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICBUNDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgVDQyIHY0MiwgVDQzIHY0MykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsCisgICAgICB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwKKyAgICAgIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLAorICAgICAgdjQxLCB2NDIsIHY0Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsCisgICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwKKyAgICAgIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAorICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCisgICAgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKKyAgICBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAorICAgIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCisgICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwKKyAgICAgIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0Nj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsCisgICAgICB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCisgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywKKyAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0Nyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKKyAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKKyAgICBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LAorICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsCisgICAgVDQ4IHY0OCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywKKyAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLAorICAgICAgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsCisgICAgICB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAorICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAorICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsCisgICAgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwKKyAgICBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LAorICAgIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsCisgICAgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCisgICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLAorICAgICAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsCisgICAgICB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LCB2NDgsIHY0OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsCisgICAgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwKKyAgICBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LCBUNTAgdjUwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPih2MSwgdjIsIHYzLCB2NCwKKyAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywKKyAgICAgIHY0OCwgdjQ5LCB2NTApOworfQorCisvLyBCb29sKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGluIGEgc2V0IG9mIChmYWxzZSwgdHJ1ZSkuCisvLworLy8gU3lub3BzaXM6CisvLyBCb29sKCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB7ZmFsc2UsIHRydWV9LgorLy8KKy8vIEl0IGlzIHVzZWZ1bCB3aGVuIHRlc3RpbmcgY29kZSB0aGF0IGRlcGVuZHMgb24gQm9vbGVhbiBmbGFncy4gQ29tYmluYXRpb25zCisvLyBvZiBtdWx0aXBsZSBmbGFncyBjYW4gYmUgdGVzdGVkIHdoZW4gc2V2ZXJhbCBCb29sKCkncyBhcmUgY29tYmluZWQgdXNpbmcKKy8vIENvbWJpbmUoKSBmdW5jdGlvbi4KKy8vCisvLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYWxsIHRlc3RzIGluIHRoZSB0ZXN0IGNhc2UgRmxhZ0RlcGVuZGVudFRlc3QKKy8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4KKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHsKKy8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworLy8gICAgIGV4dGVybmFsX2ZsYWcgPSBHZXRQYXJhbSgpOworLy8gICB9CisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChCb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LCBCb29sKCkpOworLy8KK2lubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsKKyAgcmV0dXJuIFZhbHVlcyhmYWxzZSwgdHJ1ZSk7Cit9CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIENvbWJpbmUoKSBhbGxvd3MgdGhlIHVzZXIgdG8gY29tYmluZSB0d28gb3IgbW9yZSBzZXF1ZW5jZXMgdG8gcHJvZHVjZQorLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGNvbWluZyBmcm9tCisvLyAgICAgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkKKy8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mCisvLyAgICAgdHVwbGU8VDEsIFQyLCAuLi4sIFROPiB3aGVyZSBUMSwgVDIsIC4uLiwgVE4gYXJlIHRoZSB0eXBlcworLy8gICAgIG9mIGVsZW1lbnRzIGZyb20gc2VxdWVuY2VzIHByb2R1Y2VzIGJ5IGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4KKy8vCisvLyBDb21iaW5lIGNhbiBoYXZlIHVwIHRvIDEwIGFyZ3VtZW50cy4gVGhpcyBudW1iZXIgaXMgY3VycmVudGx5IGxpbWl0ZWQKKy8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUKKy8vIFRlc3QuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gdGVzdCBjYXNlIEFuaW1hbFRlc3QgZWFjaCBvbmUgd2l0aAorLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwKKy8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOgorLy8KKy8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsKKy8vIGNsYXNzIEFuaW1hbFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGNvbnN0IGNoYXIqLCBDb2xvcj4gPiB7Li4ufTsKKy8vCisvLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQkxBQ0ssIFdISVRFKSkpOworLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bworLy8gQm9vbGVhbiBmbGFnczoKKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGUoYm9vbCwgYm9vbCk+ID4geworLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisvLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7CisvLyAgIH0KKy8vIH07CisvLworLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKKy8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKKyAgICAgIGcxLCBnMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAorICAgICAgZzEsIGcyLCBnMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQ+KAorICAgICAgZzEsIGcyLCBnMywgZzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKKyAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCisgICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICAgIEdlbmVyYXRvcjEwPigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdFBhdHRlcm4oXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKKyAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV87IFwKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKKyAgfTsgXAorICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKKyAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvcikgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCisgICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCisgIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gPSBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCisgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKKyAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDFjYjUxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKQEAgLTAsMCArMSw0ODcgQEAKKyQkIC0qLSBtb2RlOiBjKys7IC0qLQorJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgorJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworCisKKy8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50CisvLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KKy8vCisvLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6CisKKyNpZiAwCisKKy8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKKy8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKKy8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgorLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQorLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKy8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KK307CisKKy8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgorLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KKworLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKKy8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKKy8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAorLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6CisvLworLy8KKy8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KKy8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCisvLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKKy8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgorLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCisvLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93CisvLyBpbiB0aGlzIGZpbGUuCisvLworLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQorLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CisKKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQorLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisvLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKKy8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKKy8vIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKKy8vCisvLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KKy8vCisvLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKKy8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6CisKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7CisKKy8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cworLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KKy8vCisvLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKKy8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgorLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgorLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCisvLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0CisvLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgorLy8KKy8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisvLyBmb3IgbW9yZSBleGFtcGxlcy4KKy8vCisvLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgorLy8KKy8vCisvLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KKy8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisvLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKKy8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQorLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAorLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAorICAvLyBmaXh0dXJlIGhlcmUuCit9OworCitjbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCit9OworCitURVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgeworICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCit9CisKK1RFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworfQorCisjZW5kaWYgIC8vIDAKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAorLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCisvLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgorLy8KKy8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKKy8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07CisvLworLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7CisvLyB9CisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKKy8vCisKKy8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCisvLworLy8gU3lub3BzaXM6CisvLyBSYW5nZShzdGFydCwgZW5kKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKKy8vICAgICBzdGFydCsyLCAuLi4sIH0uCisvLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKKy8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KKy8vIE5vdGVzOgorLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCisvLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKKy8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgorLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCisvLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KKy8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgorLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KKy8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKKy8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCisgICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKKyAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOworfQorCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQorLy8gYSBjb250YWluZXIuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhIEMtc3R5bGUgYXJyYXkuCisvLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KKy8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCisvLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCisvLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6CisvLworLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0CisvLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6CisvLworLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKKy8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKKy8vICAgdi5wdXNoX2JhY2soImEiKTsKKy8vICAgdi5wdXNoX2JhY2soImIiKTsKKy8vICAgcmV0dXJuIHY7CisvLyB9CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOworLy8KKy8vCisvLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0CisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKKy8vCisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKKy8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKKy8vICAgcmV0dXJuIGxpc3Q7CisvLyB9CisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOworLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+CisgICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOworICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCisgICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byAkbiBwYXJhbWV0ZXJzLgorLy8KKyRyYW5nZSBpIDEuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+IFZhbHVlcygkZm9yIGosIFtbVCRqIHYkal1dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheSRpPCRmb3IgaiwgW1tUJGpdXT4oJGZvciBqLCBbW3Ykal1dKTsKK30KKworXV0KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisvLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKKy8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCisvLworLy8gU3lub3BzaXM6CisvLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQorLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5CisvLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgorLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKKy8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCisvLworLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAkbWF4dHVwbGUgYXJndW1lbnRzLiBUaGlzIG51bWJlciBpcyBjdXJyZW50bHkgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0dXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEdvb2dsZQorLy8gVGVzdC4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiB0ZXN0IGNhc2UgQW5pbWFsVGVzdCBlYWNoIG9uZSB3aXRoCisvLyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0dXBsZSgiY2F0IiwgQkxBQ0spLCB0dXBsZSgiY2F0IiwgV0hJVEUpLAorLy8gdHVwbGUoImRvZyIsIEJMQUNLKSwgYW5kIHR1cGxlKCJkb2ciLCBXSElURSk6CisvLworLy8gZW51bSBDb2xvciB7IEJMQUNLLCBHUkFZLCBXSElURSB9OworLy8gY2xhc3MgQW5pbWFsVGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Y29uc3QgY2hhciosIENvbG9yPiA+IHsuLi59OworLy8KKy8vIFRFU1RfUChBbmltYWxUZXN0LCBBbmltYWxMb29rc05pY2UpIHsuLi59CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5pbWFsVmFyaWF0aW9ucywgQW5pbWFsVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoVmFsdWVzKCJjYXQiLCAiZG9nIiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhCTEFDSywgV0hJVEUpKSk7CisvLworLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIEZsYWdEZXBlbmRlbnRUZXN0IHdpdGggYWxsIHZhcmlhdGlvbnMgb2YgdHdvCisvLyBCb29sZWFuIGZsYWdzOgorLy8KKy8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0CisvLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZShib29sLCBib29sKT4gPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICAvLyBBc3NpZ25zIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIHZhbHVlcyBmcm9tIHRoZSB0dXBsZS4KKy8vICAgICB0aWUoZXh0ZXJuYWxfZmxhZ18xLCBleHRlcm5hbF9mbGFnXzIpID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfTsKKy8vCisvLyBURVNUX1AoRmxhZ0RlcGVuZGVudFRlc3QsIFRlc3RGZWF0dXJlMSkgeworLy8gICAvLyBUZXN0IHlvdXIgY29kZSB1c2luZyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiBoZXJlLgorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVHdvQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoQm9vbCgpLCBCb29sKCkpKTsKKy8vCiskcmFuZ2UgaSAyLi5tYXh0dXBsZQorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCisKK3RlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgR2VuZXJhdG9yJGpdXT4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGk8JGZvciBqLCBbW0dlbmVyYXRvciRqXV0+IENvbWJpbmUoCisgICAgJGZvciBqLCBbW2NvbnN0IEdlbmVyYXRvciRqJiBnJGpdXSkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaTwkZm9yIGosIFtbR2VuZXJhdG9yJGpdXT4oCisgICAgICAkZm9yIGosIFtbZyRqXV0pOworfQorCitdXQorIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKKworCisKKyMgZGVmaW5lIFRFU1RfUCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAorICAgICAgOiBwdWJsaWMgdGVzdF9jYXNlX25hbWUgeyBcCisgICBwdWJsaWM6IFwKKyAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge30gXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgICBwcml2YXRlOiBcCisgICAgc3RhdGljIGludCBBZGRUb1JlZ2lzdHJ5KCkgeyBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RQYXR0ZXJuKFwKKyAgICAgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KCkpOyBcCisgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorICAgIHN0YXRpYyBpbnQgZ3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfOyBcCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCisgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpOyBcCisgIH07IFwKKyAgaW50IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTo6Z3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfID0gXAorICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6QWRkVG9SZWdpc3RyeSgpOyBcCisgIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6VGVzdEJvZHkoKQorCisjIGRlZmluZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUChwcmVmaXgsIHRlc3RfY2FzZV9uYW1lLCBnZW5lcmF0b3IpIFwKKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4gXAorICAgICAgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8oKSB7IHJldHVybiBnZW5lcmF0b3I7IH0gXAorICBpbnQgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfZHVtbXlfID0gXAorICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwKKyAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwKKyAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18pLT5BZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oXAorICAgICAgICAgICAgICAgICAgI3ByZWZpeCwgXAorICAgICAgICAgICAgICAgICAgJmd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfLCBcCisgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmFiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oCkBAIC0wLDAgKzEsNzk2IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlciB0aGF0IGNhbiBwcmludCBhCisvLyB2YWx1ZSBvZiBhbnkgdHlwZSBUOgorLy8KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpOworLy8KKy8vIEEgdXNlciBjYW4gdGVhY2ggdGhpcyBmdW5jdGlvbiBob3cgdG8gcHJpbnQgYSBjbGFzcyB0eXBlIFQgYnkKKy8vIGRlZmluaW5nIGVpdGhlciBvcGVyYXRvcjw8KCkgb3IgUHJpbnRUbygpIGluIHRoZSBuYW1lc3BhY2UgdGhhdAorLy8gZGVmaW5lcyBULiAgTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBGSVJTVCBkZWZpbmVkIGZ1bmN0aW9uIGluIHRoZQorLy8gZm9sbG93aW5nIGxpc3Qgd2lsbCBiZSB1c2VkIChhc3N1bWluZyBUIGlzIGRlZmluZWQgaW4gbmFtZXNwYWNlCisvLyBmb28pOgorLy8KKy8vICAgMS4gZm9vOjpQcmludFRvKGNvbnN0IFQmLCBvc3RyZWFtKikKKy8vICAgMi4gb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgVCYpIGRlZmluZWQgaW4gZWl0aGVyIGZvbyBvciB0aGUKKy8vICAgICAgZ2xvYmFsIG5hbWVzcGFjZS4KKy8vCisvLyBJZiBub25lIG9mIHRoZSBhYm92ZSBpcyBkZWZpbmVkLCBpdCB3aWxsIHByaW50IHRoZSBkZWJ1ZyBzdHJpbmcgb2YKKy8vIHRoZSB2YWx1ZSBpZiBpdCBpcyBhIHByb3RvY29sIGJ1ZmZlciwgb3IgcHJpbnQgdGhlIHJhdyBieXRlcyBpbiB0aGUKKy8vIHZhbHVlIG90aGVyd2lzZS4KKy8vCisvLyBUbyBhaWQgZGVidWdnaW5nOiB3aGVuIFQgaXMgYSByZWZlcmVuY2UgdHlwZSwgdGhlIGFkZHJlc3Mgb2YgdGhlCisvLyB2YWx1ZSBpcyBhbHNvIHByaW50ZWQ7IHdoZW4gVCBpcyBhIChjb25zdCkgY2hhciBwb2ludGVyLCBib3RoIHRoZQorLy8gcG9pbnRlciB2YWx1ZSBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpdCBwb2ludHMgdG8gYXJlCisvLyBwcmludGVkLgorLy8KKy8vIFdlIGFsc28gcHJvdmlkZSBzb21lIGNvbnZlbmllbnQgd3JhcHBlcnM6CisvLworLy8gICAvLyBQcmludHMgYSB2YWx1ZSB0byBhIHN0cmluZy4gIEZvciBhIChjb25zdCBvciBub3QpIGNoYXIKKy8vICAgLy8gcG9pbnRlciwgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyAoYnV0IG5vdCB0aGUgcG9pbnRlcikgaXMKKy8vICAgLy8gcHJpbnRlZC4KKy8vICAgc3RkOjpzdHJpbmcgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKTsKKy8vCisvLyAgIC8vIFByaW50cyBhIHZhbHVlIHRlcnNlbHk6IGZvciBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgcmVmZXJlbmNlZAorLy8gICAvLyB2YWx1ZSAoYnV0IG5vdCB0aGUgYWRkcmVzcykgaXMgcHJpbnRlZDsgZm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhcgorLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcworLy8gICAvLyBwcmludGVkLgorLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnQoY29uc3QgVCYgdmFsdWUsIG9zdHJlYW0qKTsKKy8vCisvLyAgIC8vIFByaW50cyB2YWx1ZSB1c2luZyB0aGUgdHlwZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBUaGUgZGlmZmVyZW5jZQorLy8gICAvLyBmcm9tIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gcHJpbnRzIGJvdGggdGhlCisvLyAgIC8vIHBvaW50ZXIgYW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhciBwb2ludGVyLgorLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7CisvLworLy8gICAvLyBQcmludHMgdGhlIGZpZWxkcyBvZiBhIHR1cGxlIHRlcnNlbHkgdG8gYSBzdHJpbmcgdmVjdG9yLCBvbmUKKy8vICAgLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gVHVwbGUgc3VwcG9ydCBtdXN0IGJlIGVuYWJsZWQgaW4KKy8vICAgLy8gZ3Rlc3QtcG9ydC5oLgorLy8gICBzdGQ6OnZlY3RvcjxzdHJpbmc+IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKKy8vICAgICAgIGNvbnN0IFR1cGxlJiB2YWx1ZSk7CisvLworLy8gS25vd24gbGltaXRhdGlvbjoKKy8vCisvLyBUaGUgcHJpbnQgcHJpbWl0aXZlcyBwcmludCB0aGUgZWxlbWVudHMgb2YgYW4gU1RMLXN0eWxlIGNvbnRhaW5lcgorLy8gdXNpbmcgdGhlIGNvbXBpbGVyLWluZmVycmVkIHR5cGUgb2YgKml0ZXIgd2hlcmUgaXRlciBpcyBhCisvLyBjb25zdF9pdGVyYXRvciBvZiB0aGUgY29udGFpbmVyLiAgV2hlbiBjb25zdF9pdGVyYXRvciBpcyBhbiBpbnB1dAorLy8gaXRlcmF0b3IgYnV0IG5vdCBhIGZvcndhcmQgaXRlcmF0b3IsIHRoaXMgaW5mZXJyZWQgdHlwZSBtYXkgbm90CisvLyBtYXRjaCB2YWx1ZV90eXBlLCBhbmQgdGhlIHByaW50IG91dHB1dCBtYXkgYmUgaW5jb3JyZWN0LiAgSW4KKy8vIHByYWN0aWNlLCB0aGlzIGlzIHJhcmVseSBhIHByb2JsZW0gYXMgZm9yIG1vc3QgY29udGFpbmVycworLy8gY29uc3RfaXRlcmF0b3IgaXMgYSBmb3J3YXJkIGl0ZXJhdG9yLiAgV2UnbGwgZml4IHRoaXMgaWYgdGhlcmUncyBhbgorLy8gYWN0dWFsIG5lZWQgZm9yIGl0LiAgTm90ZSB0aGF0IHRoaXMgZml4IGNhbm5vdCByZWx5IG9uIHZhbHVlX3R5cGUKKy8vIGJlaW5nIGRlZmluZWQgYXMgbWFueSB1c2VyLWRlZmluZWQgY29udGFpbmVyIHR5cGVzIGRvbid0IGhhdmUKKy8vIHZhbHVlX3R5cGUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCisKKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVmaW5pdGlvbnMgaW4gdGhlICdpbnRlcm5hbCcgYW5kICdpbnRlcm5hbDInIG5hbWUgc3BhY2VzIGFyZQorLy8gc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFIFRIRU0gSU4gVVNFUiBDT0RFIQorbmFtZXNwYWNlIGludGVybmFsMiB7CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGdpdmVuCisvLyBvc3RyZWFtLgorR1RFU1RfQVBJXyB2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gRm9yIHNlbGVjdGluZyB3aGljaCBwcmludGVyIHRvIHVzZSB3aGVuIGEgZ2l2ZW4gdHlwZSBoYXMgbmVpdGhlciA8PAorLy8gbm9yIFByaW50VG8oKS4KK2VudW0gVHlwZUtpbmQgeworICBrUHJvdG9idWYsICAgICAgICAgICAgICAvLyBhIHByb3RvYnVmIHR5cGUKKyAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyLCAgLy8gYSB0eXBlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhIG5hbWVkIG9yIHVubmFtZWQgZW51bSB0eXBlKQorICBrT3RoZXJUeXBlICAgICAgICAgICAgICAvLyBhbnl0aGluZyBlbHNlCit9OworCisvLyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrVHlwZUtpbmQ+OjpQcmludFZhbHVlKHZhbHVlLCBvcykgaXMgY2FsbGVkCisvLyBieSB0aGUgdW5pdmVyc2FsIHByaW50ZXIgdG8gcHJpbnQgYSB2YWx1ZSBvZiB0eXBlIFQgd2hlbiBuZWl0aGVyCisvLyBvcGVyYXRvcjw8IG5vciBQcmludFRvKCkgaXMgZGVmaW5lZCBmb3IgVCwgd2hlcmUga1R5cGVLaW5kIGlzIHRoZQorLy8gImtpbmQiIG9mIFQgYXMgZGVmaW5lZCBieSBlbnVtIFR5cGVLaW5kLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIFR5cGVLaW5kIGtUeXBlS2luZD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgZGVmYXVsdCB2ZXJzaW9uIGlzIGNhbGxlZCB3aGVuIGtUeXBlS2luZCBpcyBrT3RoZXJUeXBlLgorICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBQcmludEJ5dGVzSW5PYmplY3RUbyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigmdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZSksIG9zKTsKKyAgfQorfTsKKworLy8gV2UgcHJpbnQgYSBwcm90b2J1ZiB1c2luZyBpdHMgU2hvcnREZWJ1Z1N0cmluZygpIHdoZW4gdGhlIHN0cmluZworLy8gZG9lc24ndCBleGNlZWQgdGhpcyBtYW55IGNoYXJhY3RlcnM7IG90aGVyd2lzZSB3ZSBwcmludCBpdCB1c2luZworLy8gRGVidWdTdHJpbmcoKSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgorY29uc3Qgc2l6ZV90IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID0gNTA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1Byb3RvYnVmPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgc2hvcnRfc3RyID0gdmFsdWUuU2hvcnREZWJ1Z1N0cmluZygpOworICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBwcmV0dHlfc3RyID0KKyAgICAgICAgc2hvcnRfc3RyLmxlbmd0aCgpIDw9IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID8KKyAgICAgICAgc2hvcnRfc3RyIDogKCJcbiIgKyB2YWx1ZS5EZWJ1Z1N0cmluZygpKTsKKyAgICAqb3MgPDwgKCI8IiArIHByZXR0eV9zdHIgKyAiPiIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtDb252ZXJ0aWJsZVRvSW50ZWdlcj4geworIHB1YmxpYzoKKyAgLy8gU2luY2UgVCBoYXMgbm8gPDwgb3BlcmF0b3Igb3IgUHJpbnRUbygpIGJ1dCBjYW4gYmUgaW1wbGljaXRseQorICAvLyBjb252ZXJ0ZWQgdG8gQmlnZ2VzdEludCwgd2UgcHJpbnQgaXQgYXMgYSBCaWdnZXN0SW50LgorICAvLworICAvLyBNb3N0IGxpa2VseSBUIGlzIGFuIGVudW0gdHlwZSAoZWl0aGVyIG5hbWVkIG9yIHVubmFtZWQpLCBpbiB3aGljaAorICAvLyBjYXNlIHByaW50aW5nIGl0IGFzIGFuIGludGVnZXIgaXMgdGhlIGRlc2lyZWQgYmVoYXZpb3IuICBJbiBjYXNlCisgIC8vIFQgaXMgbm90IGFuIGVudW0sIHByaW50aW5nIGl0IGFzIGFuIGludGVnZXIgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvCisgIC8vIGdpdmVuIHRoYXQgaXQgaGFzIG5vIHVzZXItZGVmaW5lZCBwcmludGVyLgorICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBjb25zdCBpbnRlcm5hbDo6QmlnZ2VzdEludCBrQmlnSW50ID0gdmFsdWU7CisgICAgKm9zIDw8IGtCaWdJbnQ7CisgIH0KK307CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBJZiB0aGUgdmFsdWUgaXMgYQorLy8gcHJvdG9jb2wgbWVzc2FnZSwgaXRzIGRlYnVnIHN0cmluZyBpcyBwcmludGVkOyBpZiBpdCdzIGFuIGVudW0gb3IKKy8vIG9mIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQsIGl0J3MgcHJpbnRlZCBhcyBhbgorLy8gaW50ZWdlcjsgb3RoZXJ3aXNlIHRoZSBieXRlcyBpbiB0aGUgdmFsdWUgYXJlIHByaW50ZWQuICBUaGlzIGlzCisvLyB3aGF0IFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIGl0IGtub3dzIG5vdGhpbmcgYWJvdXQKKy8vIHR5cGUgVCBhbmQgVCBoYXMgbmVpdGhlciA8PCBvcGVyYXRvciBub3IgUHJpbnRUbygpLgorLy8KKy8vIEEgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBmb3IgYSBjbGFzcyB0eXBlIEZvbyBieSBkZWZpbmluZworLy8gYSA8PCBvcGVyYXRvciBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLgorLy8KKy8vIFdlIHB1dCB0aGlzIG9wZXJhdG9yIGluIG5hbWVzcGFjZSAnaW50ZXJuYWwyJyBpbnN0ZWFkIG9mICdpbnRlcm5hbCcKKy8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgYXMgbXVjaCBjb2RlIGluICdpbnRlcm5hbCcgbmVlZHMgdG8KKy8vIHVzZSA8PCBpbiBTVEwsIHdoaWNoIHdvdWxkIGNvbmZsaWN0IHdpdGggb3VyIG93biA8PCB3ZXJlIGl0IGRlZmluZWQKKy8vIGluICdpbnRlcm5hbCcuCisvLworLy8gTm90ZSB0aGF0IHRoaXMgb3BlcmF0b3I8PCB0YWtlcyBhIGdlbmVyaWMgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsCisvLyBDaGFyVHJhaXRzPiB0eXBlIGluc3RlYWQgb2YgdGhlIG1vcmUgcmVzdHJpY3RlZCBzdGQ6Om9zdHJlYW0uICBJZgorLy8gd2UgZGVmaW5lIGl0IHRvIHRha2UgYW4gc3RkOjpvc3RyZWFtIGluc3RlYWQsIHdlJ2xsIGdldCBhbgorLy8gImFtYmlndW91cyBvdmVybG9hZHMiIGNvbXBpbGVyIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHByaW50IGEgdHlwZQorLy8gRm9vIHRoYXQgc3VwcG9ydHMgc3RyZWFtaW5nIHRvIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAorLy8gQ2hhclRyYWl0cz4sIGFzIHRoZSBjb21waWxlciBjYW5ub3QgdGVsbCB3aGV0aGVyCisvLyBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IFQmKSBvcgorLy8gb3BlcmF0b3I8PChzdGQ6OmJhc2ljX3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiwgY29uc3QgRm9vJikgaXMgbW9yZQorLy8gc3BlY2lmaWMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KKzo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAorICAgIDo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywgY29uc3QgVCYgeCkgeworICBUeXBlV2l0aG91dEZvcm1hdHRlcjxULAorICAgICAgKGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlID8ga1Byb3RvYnVmIDoKKyAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQmLCBpbnRlcm5hbDo6QmlnZ2VzdEludD46OnZhbHVlID8KKyAgICAgICBrQ29udmVydGlibGVUb0ludGVnZXIgOiBrT3RoZXJUeXBlKT46OlByaW50VmFsdWUoeCwgJm9zKTsKKyAgcmV0dXJuIG9zOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBUaGlzIG5hbWVzcGFjZSBNVVNUIE5PVCBCRSBORVNURUQgSU4gOjp0ZXN0aW5nLCBvciB0aGUgbmFtZSBsb29rLXVwCisvLyBtYWdpYyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBVbml2ZXJzYWxQcmludGVyIHdvbid0IHdvcmsuCituYW1lc3BhY2UgdGVzdGluZ19pbnRlcm5hbCB7CisKKy8vIFVzZWQgdG8gcHJpbnQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlCisvLyB1c2VyIGRvZXNuJ3QgZGVmaW5lIFByaW50VG8oKSBmb3IgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgRGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8oY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBXaXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50LCBkdXJpbmcgdW5xdWFsaWZpZWQgbmFtZSBsb29rdXAsCisgIC8vIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCBhcHBlYXJzIGFzIGlmIGl0IHdhcyBkZWNsYXJlZCBpbgorICAvLyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgYm90aAorICAvLyA6OnRlc3RpbmdfaW50ZXJuYWwgYW5kIDo6dGVzdGluZzo6aW50ZXJuYWwyLCBpLmUuIHRoZSBnbG9iYWwKKyAgLy8gbmFtZXNwYWNlLiAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gdGhlIEMrKyBTdGFuZGFyZCBzZWN0aW9uCisgIC8vIDcuMy40LTEgW25hbWVzcGFjZS51ZGlyXS4gIFRoaXMgYWxsb3dzIHVzIHRvIGZhbGwgYmFjayBvbnRvCisgIC8vIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCBpbiBjYXNlIFQgZG9lc24ndCBjb21lIHdpdGggYSA8PAorICAvLyBvcGVyYXRvci4KKyAgLy8KKyAgLy8gV2UgY2Fubm90IHdyaXRlICd1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PDsnLCB3aGljaAorICAvLyBnY2MgMy4zIGZhaWxzIHRvIGNvbXBpbGUgZHVlIHRvIGEgY29tcGlsZXIgYnVnLgorICB1c2luZyBuYW1lc3BhY2UgOjp0ZXN0aW5nOjppbnRlcm5hbDI7ICAvLyBOT0xJTlQKKworICAvLyBBc3N1bWluZyBUIGlzIGRlZmluZWQgaW4gbmFtZXNwYWNlIGZvbywgaW4gdGhlIG5leHQgc3RhdGVtZW50LAorICAvLyB0aGUgY29tcGlsZXIgd2lsbCBjb25zaWRlciBhbGwgb2Y6CisgIC8vCisgIC8vICAgMS4gZm9vOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gS29lbmlnIGxvb2stdXApLAorICAvLyAgIDIuIDo6b3BlcmF0b3I8PCAoYXMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIGVuY2xvc2VkIGluIDo6KSwKKyAgLy8gICAzLiB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgKHRoYW5rcyB0byB0aGUgdXNpbmcgc3RhdGVtZW50IGFib3ZlKS4KKyAgLy8KKyAgLy8gVGhlIG9wZXJhdG9yPDwgd2hvc2UgdHlwZSBtYXRjaGVzIFQgYmVzdCB3aWxsIGJlIHBpY2tlZC4KKyAgLy8KKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IGFsbG93ICMyIHRvIGJlIGEgY2FuZGlkYXRlLCBhcyBzb21ldGltZXMgaXQncworICAvLyBpbXBvc3NpYmxlIHRvIGRlZmluZSAjMSAoZS5nLiB3aGVuIGZvbyBpcyA6OnN0ZCwgZGVmaW5pbmcKKyAgLy8gYW55dGhpbmcgaW4gaXQgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIHVubGVzcyB5b3UgYXJlIGEgY29tcGlsZXIKKyAgLy8gdmVuZG9yLikuCisgICpvcyA8PCB2YWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKSBwcmludHMgdGhlIGdpdmVuCisvLyB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdAorLy8gJ29zdHJlYW1fcHRyJyBpcyBub3QgTlVMTCwgb3IgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKy8vCisvLyBXZSBkZWZpbmUgVW5pdmVyc2FsUHJpbnRlciBhcyBhIGNsYXNzIHRlbXBsYXRlIChhcyBvcHBvc2VkIHRvIGEKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlKSwgYXMgd2UgbmVlZCB0byBwYXJ0aWFsbHkgc3BlY2lhbGl6ZSBpdCBmb3IKKy8vIHJlZmVyZW5jZSB0eXBlcywgd2hpY2ggY2Fubm90IGJlIGRvbmUgd2l0aCBmdW5jdGlvbiB0ZW1wbGF0ZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gVXNlZCB0byBwcmludCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUKKy8vIGEgUHJpbnRUbygpIGZvciBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDPgordm9pZCBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lciAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDJiBjb250YWluZXIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBjb25zdCBzaXplX3Qga01heENvdW50ID0gMzI7ICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcHJpbnQuCisgICpvcyA8PCAneyc7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIGZvciAodHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBjb250YWluZXIuZW5kKCk7ICsraXQsICsrY291bnQpIHsKKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAqb3MgPDwgJywnOworICAgICAgaWYgKGNvdW50ID09IGtNYXhDb3VudCkgeyAgLy8gRW5vdWdoIGhhcyBiZWVuIHByaW50ZWQuCisgICAgICAgICpvcyA8PCAiIC4uLiI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAqb3MgPDwgJyAnOworICAgIC8vIFdlIGNhbm5vdCBjYWxsIFByaW50VG8oKml0LCBvcykgaGVyZSBhcyBQcmludFRvKCkgZG9lc24ndAorICAgIC8vIGhhbmRsZSAqaXQgYmVpbmcgYSBuYXRpdmUgYXJyYXkuCisgICAgaW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KCppdCwgb3MpOworICB9CisKKyAgaWYgKGNvdW50ID4gMCkgeworICAgICpvcyA8PCAnICc7CisgIH0KKyAgKm9zIDw8ICd9JzsKK30KKworLy8gVXNlZCB0byBwcmludCBhIHBvaW50ZXIgdGhhdCBpcyBuZWl0aGVyIGEgY2hhciBwb2ludGVyIG5vciBhIG1lbWJlcgorLy8gcG9pbnRlciwgd2hlbiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LiAgKEEgbWVtYmVyCisvLyB2YXJpYWJsZSBwb2ludGVyIG9yIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIGRvZXNuJ3QgcmVhbGx5IHBvaW50IHRvCisvLyBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLiAgVGhlaXIgcmVwcmVzZW50YXRpb24gaXMKKy8vIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBUaGVyZWZvcmUgdGhleSB3aWxsIGJlIHByaW50ZWQgYXMgcmF3CisvLyBieXRlcy4pCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgRGVmYXVsdFByaW50VG8oSXNOb3RDb250YWluZXIgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgIHRydWVfdHlwZSAvKiBpcyBhIHBvaW50ZXIgKi8sCisgICAgICAgICAgICAgICAgICAgIFQqIHAsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBpZiAocCA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAvLyBDKysgZG9lc24ndCBhbGxvdyBjYXN0aW5nIGZyb20gYSBmdW5jdGlvbiBwb2ludGVyIHRvIGFueSBvYmplY3QKKyAgICAvLyBwb2ludGVyLgorICAgIC8vCisgICAgLy8gSXNUcnVlKCkgc2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLAorICAgIC8vICJ1bnJlYWNoYWJsZSBjb2RlIi4KKyAgICBpZiAoSXNUcnVlKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUKiwgY29uc3Qgdm9pZCo+Ojp2YWx1ZSkpIHsKKyAgICAgIC8vIFQgaXMgbm90IGEgZnVuY3Rpb24gdHlwZS4gIFdlIGp1c3QgY2FsbCA8PCB0byBwcmludCBwLAorICAgICAgLy8gcmVseWluZyBvbiBBREwgdG8gcGljayB1cCB1c2VyLWRlZmluZWQgPDwgZm9yIHRoZWlyIHBvaW50ZXIKKyAgICAgIC8vIHR5cGVzLCBpZiBhbnkuCisgICAgICAqb3MgPDwgcDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVCBpcyBhIGZ1bmN0aW9uIHR5cGUsIHNvICcqb3MgPDwgcCcgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQKKyAgICAgIC8vIChpdCBqdXN0IHByaW50cyBwIGFzIGJvb2wpLiAgV2Ugd2FudCB0byBwcmludCBwIGFzIGEgY29uc3QKKyAgICAgIC8vIHZvaWQqLiAgSG93ZXZlciwgd2UgY2Fubm90IGNhc3QgaXQgdG8gY29uc3Qgdm9pZCogZGlyZWN0bHksCisgICAgICAvLyBldmVuIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QsIGFzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2NjCisgICAgICAvLyAoZS5nLiAzLjQuNSkgY2Fubm90IGNvbXBpbGUgdGhlIGNhc3Qgd2hlbiBwIGlzIGEgZnVuY3Rpb24KKyAgICAgIC8vIHBvaW50ZXIuICBDYXN0aW5nIHRvIFVJbnQ2NCBmaXJzdCBzb2x2ZXMgdGhlIHByb2JsZW0uCisgICAgICAqb3MgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6VUludDY0PihwKSk7CisgICAgfQorICB9Cit9CisKKy8vIFVzZWQgdG8gcHJpbnQgYSBub24tY29udGFpbmVyLCBub24tcG9pbnRlciB2YWx1ZSB3aGVuIHRoZSB1c2VyCisvLyBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlIC8qIGlzIG5vdCBhIHBvaW50ZXIgKi8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgOjp0ZXN0aW5nX2ludGVybmFsOjpEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyh2YWx1ZSwgb3MpOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHRoZSA8PCBvcGVyYXRvciBpZiBpdCBoYXMgb25lOworLy8gb3RoZXJ3aXNlIHByaW50cyB0aGUgYnl0ZXMgaW4gaXQuICBUaGlzIGlzIHdoYXQKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIFByaW50VG8oKSBpcyBub3Qgc3BlY2lhbGl6ZWQKKy8vIG9yIG92ZXJsb2FkZWQgZm9yIHR5cGUgVC4KKy8vCisvLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKKy8vIGFuIG92ZXJsb2FkIG9mIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLiAgV2UKKy8vIGdpdmUgdGhlIHVzZXIgdGhpcyBvcHRpb24gYXMgc29tZXRpbWVzIGRlZmluaW5nIGEgPDwgb3BlcmF0b3IgZm9yCisvLyBGb28gaXMgbm90IGRlc2lyYWJsZSAoZS5nLiB0aGUgY29kaW5nIHN0eWxlIG1heSBwcmV2ZW50IGRvaW5nIGl0LAorLy8gb3IgdGhlcmUgaXMgYWxyZWFkeSBhIDw8IG9wZXJhdG9yIGJ1dCBpdCBkb2Vzbid0IGRvIHdoYXQgdGhlIHVzZXIKKy8vIHdhbnRzKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgLy8gRGVmYXVsdFByaW50VG8oKSBpcyBvdmVybG9hZGVkLiAgVGhlIHR5cGUgb2YgaXRzIGZpcnN0IHR3bworICAvLyBhcmd1bWVudHMgZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQuICBJZiBUIGlzIGFuCisgIC8vIFNUTC1zdHlsZSBjb250YWluZXIsIHRoZSB2ZXJzaW9uIGZvciBjb250YWluZXIgd2lsbCBiZSBjYWxsZWQ7IGlmCisgIC8vIFQgaXMgYSBwb2ludGVyLCB0aGUgcG9pbnRlciB2ZXJzaW9uIHdpbGwgYmUgY2FsbGVkOyBvdGhlcndpc2UgdGhlCisgIC8vIGdlbmVyaWMgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHdlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgaGVyZSwgcHJpb3IgdG8gd2UgY2hlY2sKKyAgLy8gZm9yIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMgaW4gb3VyIG9wZXJhdG9yPDwuICBUaGUgcmF0aW9uYWxlIGlzOgorICAvLworICAvLyBGb3IgcHJvdG9jb2wgbWVzc2FnZXMsIHdlIHdhbnQgdG8gZ2l2ZSBwZW9wbGUgYSBjaGFuY2UgdG8KKyAgLy8gb3ZlcnJpZGUgR29vZ2xlIE1vY2sncyBmb3JtYXQgYnkgZGVmaW5pbmcgYSBQcmludFRvKCkgb3IKKyAgLy8gb3BlcmF0b3I8PC4gIEZvciBTVEwgY29udGFpbmVycywgb3RoZXIgZm9ybWF0cyBjYW4gYmUKKyAgLy8gaW5jb21wYXRpYmxlIHdpdGggR29vZ2xlIE1vY2sncyBmb3JtYXQgZm9yIHRoZSBjb250YWluZXIKKyAgLy8gZWxlbWVudHM7IHRoZXJlZm9yZSB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUgdG8gZW5zdXJlCisgIC8vIHRoYXQgb3VyIGZvcm1hdCBpcyB1c2VkLgorICAvLworICAvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIERlZmF1bHRQcmludFRvKCkgaXMgbmVlZGVkIHRvIGJ5cGFzcyBhIGJ1ZworICAvLyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIHRoYXQgcHJldmVudHMgaXQgZnJvbSBwaWNraW5nIHRoZSByaWdodAorICAvLyBvdmVybG9hZCBiZXR3ZWVuOgorICAvLworICAvLyAgIFByaW50VG8oY29uc3QgVCYgeCwgLi4uKTsKKyAgLy8gICBQcmludFRvKFQqIHgsIC4uLik7CisgIERlZmF1bHRQcmludFRvKElzQ29udGFpbmVyVGVzdDxUPigwKSwgaXNfcG9pbnRlcjxUPigpLCB2YWx1ZSwgb3MpOworfQorCisvLyBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgUHJpbnRUbygpIG92ZXJsb2FkcyB0ZWxscworLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBob3cgdG8gcHJpbnQgc3RhbmRhcmQgdHlwZXMgKGJ1aWx0LWluCisvLyB0eXBlcywgc3RyaW5ncywgcGxhaW4gYXJyYXlzLCBhbmQgcG9pbnRlcnMpLgorCisvLyBPdmVybG9hZHMgZm9yIHZhcmlvdXMgY2hhciB0eXBlcy4KK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIFdoZW4gcHJpbnRpbmcgYSBwbGFpbiBjaGFyLCB3ZSBhbHdheXMgdHJlYXQgaXQgYXMgdW5zaWduZWQuICBUaGlzCisgIC8vIHdheSwgdGhlIG91dHB1dCB3b24ndCBiZSBhZmZlY3RlZCBieSB3aGV0aGVyIHRoZSBjb21waWxlciB0aGlua3MKKyAgLy8gY2hhciBpcyBzaWduZWQgb3Igbm90LgorICBQcmludFRvKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpLCBvcyk7Cit9CisKKy8vIE92ZXJsb2FkcyBmb3Igb3RoZXIgc2ltcGxlIGJ1aWx0LWluIHR5cGVzLgoraW5saW5lIHZvaWQgUHJpbnRUbyhib29sIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgKHggPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKworLy8gT3ZlcmxvYWQgZm9yIHdjaGFyX3QgdHlwZS4KKy8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAorLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGRlY2ltYWwgY29kZSAoZXhjZXB0IGZvciBMJ1wwJykuCisvLyBUaGUgTCdcMCcgY2hhciBpcyBwcmludGVkIGFzICJMJ1xcMCciLiBUaGUgZGVjaW1hbCBjb2RlIGlzIHByaW50ZWQKKy8vIGFzIHNpZ25lZCBpbnRlZ2VyIHdoZW4gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgY29tcGlsZXIKKy8vIGFzIGEgc2lnbmVkIHR5cGUgYW5kIGlzIHByaW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QKKy8vIGlzIGltcGxlbWVudGVkIGFzIGFuIHVuc2lnbmVkIHR5cGUuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBPdmVybG9hZHMgZm9yIEMgc3RyaW5ncy4KK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3QgY2hhcio+KHMpLCBvcyk7Cit9CisKKy8vIHNpZ25lZC91bnNpZ25lZCBjaGFyIGlzIG9mdGVuIHVzZWQgZm9yIHJlcHJlc2VudGluZyBiaW5hcnkgZGF0YSwgc28KKy8vIHdlIHByaW50IHBvaW50ZXJzIHRvIGl0IGFzIHZvaWQqIHRvIGJlIHNhZmUuCitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOworfQoraW5saW5lIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgdW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KKworLy8gTVNWQyBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2NoYXJfdCBhcyBhIHR5cGVkZWYgb2YgdW5zaWduZWQKKy8vIHNob3J0LiAgSXQgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCB3aGVuIHdjaGFyX3QgaXMgYSBuYXRpdmUKKy8vIHR5cGUuICBXaGVuIHdjaGFyX3QgaXMgYSB0eXBlZGVmLCBkZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3QKKy8vIHdjaGFyX3QqIHdvdWxkIGNhdXNlIHVuc2lnbmVkIHNob3J0KiBiZSBwcmludGVkIGFzIGEgd2lkZSBzdHJpbmcsCisvLyBwb3NzaWJseSBjYXVzaW5nIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorLy8gT3ZlcmxvYWRzIGZvciB3aWRlIEMgc3RyaW5ncworR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oY29uc3Qgd2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8od2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB3Y2hhcl90Kj4ocyksIG9zKTsKK30KKyNlbmRpZgorCisvLyBPdmVybG9hZCBmb3IgQyBhcnJheXMuICBNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHByaW50ZWQKKy8vIHByb3Blcmx5LgorCisvLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSwgd2l0aG91dCBwcmludGluZworLy8gdGhlIGN1cmx5IGJyYWNlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFJhd0FycmF5VG8oY29uc3QgVCBhW10sIHNpemVfdCBjb3VudCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50KGFbMF0sIG9zKTsKKyAgZm9yIChzaXplX3QgaSA9IDE7IGkgIT0gY291bnQ7IGkrKykgeworICAgICpvcyA8PCAiLCAiOworICAgIFVuaXZlcnNhbFByaW50KGFbaV0sIG9zKTsKKyAgfQorfQorCisvLyBPdmVybG9hZHMgZm9yIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLgorI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCitHVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50U3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCitHVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFN0cmluZ1RvKHMsIG9zKTsKK30KKworLy8gT3ZlcmxvYWRzIGZvciA6OndzdHJpbmcgYW5kIDo6c3RkOjp3c3RyaW5nLgorI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitHVEVTVF9BUElfIHZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorLy8gT3ZlcmxvYWQgZm9yIDo6c3RkOjp0cjE6OnR1cGxlLiAgTmVlZGVkIGZvciBwcmludGluZyBmdW5jdGlvbiBhcmd1bWVudHMsCisvLyB3aGljaCBhcmUgcGFja2VkIGFzIHR1cGxlcy4KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBhIHR1cGxlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIE92ZXJsb2FkZWQgUHJpbnRUbygpIGZvciB0dXBsZXMgb2YgdmFyaW91cyBhcml0aWVzLiAgV2Ugc3VwcG9ydAorLy8gdHVwbGVzIG9mIHVwLXRvIDEwIGZpZWxkcy4gIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gd29ya3MKKy8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0cjE6OnR1cGxlIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZQorLy8gbm9uLXN0YW5kYXJkIHZhcmlhZGljIHRlbXBsYXRlIGZlYXR1cmUgb3Igbm90LgorCitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPD4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDE+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4mIHQsCisgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Cit2b2lkIFByaW50VG8oCisgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiYgdCwKKyAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBPdmVybG9hZCBmb3Igc3RkOjpwYWlyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6cGFpcjxUMSwgVDI+JiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAnKCc7CisgIC8vIFdlIGNhbm5vdCB1c2UgVW5pdmVyc2FsUHJpbnQodmFsdWUuZmlyc3QsIG9zKSBoZXJlLCBhcyBUMSBtYXkgYmUKKyAgLy8gYSByZWZlcmVuY2UgdHlwZS4gIFRoZSBzYW1lIGZvciBwcmludGluZyB2YWx1ZS5zZWNvbmQuCisgIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZS5maXJzdCwgb3MpOworICAqb3MgPDwgIiwgIjsKKyAgVW5pdmVyc2FsUHJpbnRlcjxUMj46OlByaW50KHZhbHVlLnNlY29uZCwgb3MpOworICAqb3MgPDwgJyknOworfQorCisvLyBJbXBsZW1lbnRzIHByaW50aW5nIGEgbm9uLXJlZmVyZW5jZSB0eXBlIFQgYnkgbGV0dGluZyB0aGUgY29tcGlsZXIKKy8vIHBpY2sgdGhlIHJpZ2h0IG92ZXJsb2FkIG9mIFByaW50VG8oKSBmb3IgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsUHJpbnRlciB7CisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KKyAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxODApICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQxODAuCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgLy8gTm90ZTogd2UgZGVsaWJlcmF0ZWx5IGRvbid0IGNhbGwgdGhpcyBQcmludFRvKCksIGFzIHRoYXQgbmFtZQorICAvLyBjb25mbGljdHMgd2l0aCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvIGluIHRoZSBib2R5IG9mIHRoZQorICAvLyBmdW5jdGlvbi4KKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIC8vIEJ5IGRlZmF1bHQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OlByaW50VG8oKSBpcyB1c2VkIGZvciBwcmludGluZworICAgIC8vIHRoZSB2YWx1ZS4KKyAgICAvLworICAgIC8vIFRoYW5rcyB0byBLb2VuaWcgbG9vay11cCwgaWYgVCBpcyBhIGNsYXNzIGFuZCBoYXMgaXRzIG93bgorICAgIC8vIFByaW50VG8oKSBmdW5jdGlvbiBkZWZpbmVkIGluIGl0cyBuYW1lc3BhY2UsIHRoYXQgZnVuY3Rpb24gd2lsbAorICAgIC8vIGJlIHZpc2libGUgaGVyZS4gIFNpbmNlIGl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZ2VuZXJpYyBvbmVzCisgICAgLy8gaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCwgaXQgd2lsbCBiZSBwaWNrZWQgYnkgdGhlIGNvbXBpbGVyIGluIHRoZQorICAgIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnQgLSBleGFjdGx5IHdoYXQgd2Ugd2FudC4KKyAgICBQcmludFRvKHZhbHVlLCBvcyk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorfTsKKworLy8gVW5pdmVyc2FsUHJpbnRBcnJheShiZWdpbiwgbGVuLCBvcykgcHJpbnRzIGFuIGFycmF5IG9mICdsZW4nCisvLyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcyAnYmVnaW4nLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3QgVCogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBpZiAobGVuID09IDApIHsKKyAgICAqb3MgPDwgInt9IjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgInsgIjsKKyAgICBjb25zdCBzaXplX3Qga1RocmVzaG9sZCA9IDE4OworICAgIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gODsKKyAgICAvLyBJZiB0aGUgYXJyYXkgaGFzIG1vcmUgdGhhbiBrVGhyZXNob2xkIGVsZW1lbnRzLCB3ZSdsbCBoYXZlIHRvCisgICAgLy8gb21pdCBzb21lIGRldGFpbHMgYnkgcHJpbnRpbmcgb25seSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0CisgICAgLy8ga0NodW5rU2l6ZSBlbGVtZW50cy4KKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbGV0IHRoZSB1c2VyIGNvbnRyb2wgdGhlIHRocmVzaG9sZCB1c2luZyBhIGZsYWcuCisgICAgaWYgKGxlbiA8PSBrVGhyZXNob2xkKSB7CisgICAgICBQcmludFJhd0FycmF5VG8oYmVnaW4sIGxlbiwgb3MpOworICAgIH0gZWxzZSB7CisgICAgICBQcmludFJhd0FycmF5VG8oYmVnaW4sIGtDaHVua1NpemUsIG9zKTsKKyAgICAgICpvcyA8PCAiLCAuLi4sICI7CisgICAgICBQcmludFJhd0FycmF5VG8oYmVnaW4gKyBsZW4gLSBrQ2h1bmtTaXplLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgfQorICAgICpvcyA8PCAiIH0iOworICB9Cit9CisvLyBUaGlzIG92ZXJsb2FkIHByaW50cyBhIChjb25zdCkgY2hhciBhcnJheSBjb21wYWN0bHkuCitHVEVTVF9BUElfIHZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBjaGFyKiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBJbXBsZW1lbnRzIHByaW50aW5nIGFuIGFycmF5IHR5cGUgVFtOXS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4geworIHB1YmxpYzoKKyAgLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSwgb21pdHRpbmcgc29tZSBlbGVtZW50cyB3aGVuIHRoZXJlIGFyZSB0b28KKyAgLy8gbWFueS4KKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCAoJmEpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludEFycmF5KGEsIE4sIG9zKTsKKyAgfQorfTsKKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyPFQmPiB7CisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KKyAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxODApICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQxODAuCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIC8vIFByaW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUuICBXZSB1c2UgcmVpbnRlcnByZXRfY2FzdCBoZXJlCisgICAgLy8gYXMgc3RhdGljX2Nhc3QgZG9lc24ndCBjb21waWxlIHdoZW4gVCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgKm9zIDw8ICJAIiA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmdmFsdWUpIDw8ICIgIjsKKworICAgIC8vIFRoZW4gcHJpbnRzIHRoZSB2YWx1ZSBpdHNlbGYuCisgICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKKyAgfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYgIC8vIF9NU0NfVkVSCit9OworCisvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQgdmFsdWUKKy8vIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhlCisvLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50KHZhbHVlLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBVbml2ZXJzYWxUZXJzZVByaW50KGNvbnN0IGNoYXIqIHN0ciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsKKyAgfQorfQoraW5saW5lIHZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxUZXJzZVByaW50KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzdHIpLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZQorLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBpcyB0aGF0IGZvciBhCisvLyAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhpcyBwcmludHMgYm90aCB0aGUgcG9pbnRlciBhbmQgdGhlCisvLyBOVUwtdGVybWluYXRlZCBzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3MpOworfQorCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQordHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0cmluZz4gU3RyaW5nczsKKworLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZAorLy8gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKCkgdG8gYmUgZGVmaW5lZCBieQorLy8gaW5kdWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdHVwbGUgZmllbGRzLiAgVGhlIGlkZWEgaXMgdGhhdAorLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4KKy8vIGZpZWxkcyBpbiB0dXBsZSB0LCBhbmQgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKKy8vIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT4uCisKKy8vIFRoZSBpbmR1Y3RpdmUgY2FzZS4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXIgeworICAvLyBQcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7CisgICAgKm9zIDw8ICIsICI7CisgICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PE4gLSAxLCBUdXBsZT46OnR5cGU+CisgICAgICAgIDo6UHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PE4gLSAxPih0KSwgb3MpOworICB9CisKKyAgLy8gVGVyc2VseSBwcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUgdG8gYSBzdHJpbmcgdmVjdG9yLAorICAvLyBvbmUgZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB0LCBTdHJpbmdzKiBzdHJpbmdzKSB7CisgICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6VGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyh0LCBzdHJpbmdzKTsKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PE4gLSAxPih0KSwgJnNzKTsKKyAgICBzdHJpbmdzLT5wdXNoX2JhY2soc3Muc3RyKCkpOworICB9Cit9OworCisvLyBCYXNlIGNhc2VzLgordGVtcGxhdGUgPD4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MD4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmLCA6OnN0ZDo6b3N0cmVhbSopIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiwgU3RyaW5ncyopIHt9Cit9OworLy8gV2UgaGF2ZSB0byBzcGVjaWFsaXplIHRoZSBlbnRpcmUgVHVwbGVQcmVmaXhQcmludGVyPD4gY2xhc3MKKy8vIHRlbXBsYXRlIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mCisvLyBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKCkgaXMgdGhlIHNhbWUgYXMgdGhlIGdlbmVyaWMgdmVyc2lvbiwgYXMKKy8vIEVtYmFyY2FkZXJvIChmb3JtZXJseSBDb2RlR2VhciwgZm9ybWVybHkgQm9ybGFuZCkgQysrIGRvZXNuJ3QKKy8vIHN1cHBvcnQgc3BlY2lhbGl6aW5nIGEgbWV0aG9kIHRlbXBsYXRlIG9mIGEgY2xhc3MgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlcjwxPiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PDAsIFR1cGxlPjo6dHlwZT46OgorICAgICAgICBQcmludCg6OnN0ZDo6dHIxOjpnZXQ8MD4odCksIG9zKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYgdCwgU3RyaW5ncyogc3RyaW5ncykgeworICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgVW5pdmVyc2FsVGVyc2VQcmludCg6OnN0ZDo6dHIxOjpnZXQ8MD4odCksICZzcyk7CisgICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKKyAgfQorfTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBhIHR1cGxlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIigiOworICBUdXBsZVByZWZpeFByaW50ZXI8IDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8VD46OnZhbHVlPjo6CisgICAgICBQcmludFByZWZpeFRvKHQsIG9zKTsKKyAgKm9zIDw8ICIpIjsKK30KKworLy8gUHJpbnRzIHRoZSBmaWVsZHMgb2YgYSB0dXBsZSB0ZXJzZWx5IHRvIGEgc3RyaW5nIHZlY3Rvciwgb25lCisvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiAgU2VlIHRoZSBjb21tZW50IGJlZm9yZQorLy8gVW5pdmVyc2FsVGVyc2VQcmludCgpIGZvciBob3cgd2UgZGVmaW5lICJ0ZXJzZWx5Ii4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KK1N0cmluZ3MgVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB2YWx1ZSkgeworICBTdHJpbmdzIHJlc3VsdDsKKyAgVHVwbGVQcmVmaXhQcmludGVyPCA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU+OjoKKyAgICAgIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModmFsdWUsICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyNmU1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oCkBAIC0wLDAgKzEsMjMyIEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFV0aWxpdGllcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBpdHNlbGYgYW5kIGNvZGUgdGhhdCB1c2VzIEdvb2dsZSBUZXN0CisvLyAoZS5nLiBmcmFtZXdvcmtzIGJ1aWx0IG9uIHRvcCBvZiBHb29nbGUgVGVzdCkuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhpcyBoZWxwZXIgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbW9jayBvdXQgR29vZ2xlIFRlc3QgZmFpbHVyZSByZXBvcnRpbmcKKy8vIHNvIHRoYXQgd2UgY2FuIHRlc3QgR29vZ2xlIFRlc3Qgb3IgY29kZSB0aGF0IGJ1aWxkcyBvbiBHb29nbGUgVGVzdC4KKy8vCisvLyBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBhcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0IHRvIHRoZQorLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBvYmplY3QgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yIHdoZW5ldmVyIGEgR29vZ2xlIFRlc3QKKy8vIGZhaWx1cmUgaXMgcmVwb3J0ZWQuIEl0IGNhbiBlaXRoZXIgaW50ZXJjZXB0IG9ubHkgZmFpbHVyZXMgdGhhdCBhcmUKKy8vIGdlbmVyYXRlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoaXMgb2JqZWN0IG9yIGl0IGNhbiBpbnRlcmNlcHQKKy8vIGFsbCBnZW5lcmF0ZWQgZmFpbHVyZXMuIFRoZSBzY29wZSBvZiB0aGlzIG1vY2sgb2JqZWN0IGNhbiBiZSBjb250cm9sbGVkIHdpdGgKKy8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHR3byBhcmd1bWVudHMgY29uc3RydWN0b3IuCitjbGFzcyBHVEVTVF9BUElfIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICAvLyBUaGUgdHdvIHBvc3NpYmxlIG1vY2tpbmcgbW9kZXMgb2YgdGhpcyBvYmplY3QuCisgIGVudW0gSW50ZXJjZXB0TW9kZSB7CisgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICAvLyBJbnRlcmNlcHRzIG9ubHkgdGhyZWFkIGxvY2FsIGZhaWx1cmVzLgorICAgIElOVEVSQ0VQVF9BTExfVEhSRUFEUyAgICAgICAgICAgLy8gSW50ZXJjZXB0cyBhbGwgZmFpbHVyZXMuCisgIH07CisKKyAgLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZAorICAvLyBieSBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKyAgLy8gcmVzdWx0cy4gVGhpcyByZXBvcnRlciB3aWxsIG9ubHkgY2F0Y2ggZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50CisgIC8vIHRocmVhZC4gREVQUkVDQVRFRAorICBleHBsaWNpdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOworCisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB5b3UgY2FuIGNob29zZSB0aGUgaW50ZXJjZXB0aW9uIHNjb3BlIG9mIHRoaXMgb2JqZWN0LgorICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOworCisgIC8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgcHJldmlvdXMgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgdmlydHVhbCB+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKworICAvLyBBcHBlbmRzIHRoZSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlIFRlc3RQYXJ0UmVzdWx0QXJyYXkKKyAgLy8gcmVjZWl2ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBpcyBmcm9tIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlCisgIC8vIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworIHByaXZhdGU6CisgIHZvaWQgSW5pdCgpOworCisgIGNvbnN0IEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvbGRfcmVwb3J0ZXJfOworICBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGluZyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGFuZAorLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKS4gIEl0cyBkZXN0cnVjdG9yIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitjbGFzcyBHVEVTVF9BUElfIFNpbmdsZUZhaWx1cmVDaGVja2VyIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjb25zdHJ1Y3RvciByZW1lbWJlcnMgdGhlIGFyZ3VtZW50cy4KKyAgU2luZ2xlRmFpbHVyZUNoZWNrZXIoY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpOworICB+U2luZ2xlRmFpbHVyZUNoZWNrZXIoKTsKKyBwcml2YXRlOgorICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRzXzsKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZV87CisgIGNvbnN0IHN0cmluZyBzdWJzdHJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2luZ2xlRmFpbHVyZUNoZWNrZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIEEgc2V0IG9mIG1hY3JvcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkCisvLyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBmYXRhbCBmYWlsdXJlcy4gIEl0IHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBmYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKKy8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfRkFUQUxfRkFJTFVSRSBvbmx5CisvLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKKy8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KKy8vCisvLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKKy8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorLy8KKy8vIEtub3duIHJlc3RyaWN0aW9uczoKKy8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yCisvLyAgICAgbm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KKy8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuCisvLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KKy8vCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bworLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KKy8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKKy8vIHdvcmtzLiAgVGhlIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4KKy8vIGd0ZXN0X3VuaXR0ZXN0LmNjIHdpbGwgZmFpbCB0byBjb21waWxlIGlmIHdlIGRvIHRoYXQuCisjZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHsgXAorICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCisgICAgIHB1YmxpYzpcCisgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfTtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAorICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKyNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8geyBcCisgICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9O1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX0FMTF9USFJFQURTLCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIEEgbWFjcm8gZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZCB0bworLy8gZ2VuZXJhdGUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzLiAgSXQgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbgorLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgbm9uLWZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJworLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFIG9ubHkKKy8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAorLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgorLy8KKy8vICdzdGF0ZW1lbnQnIGlzIGFsbG93ZWQgdG8gcmVmZXJlbmNlIGxvY2FsIHZhcmlhYmxlcyBhbmQgbWVtYmVycyBvZgorLy8gdGhlIGN1cnJlbnQgb2JqZWN0LgorLy8KKy8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAorLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisvLworLy8gS25vd24gcmVzdHJpY3Rpb25zOgorLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCisvLworLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KKy8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCisvLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCisvLyB3b3Jrcy4gIElmIHdlIGRvIHRoYXQsIHRoZSBjb2RlIHdvbid0IGNvbXBpbGUgd2hlbiB0aGUgdXNlciBnaXZlcworLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBhIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gdGhhdAorLy8gZXhwYW5kcyB0byBjb2RlIGNvbnRhaW5pbmcgYW4gdW5wcm90ZWN0ZWQgY29tbWEuICBUaGUKKy8vIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4gZ3Rlc3RfdW5pdHRlc3QuY2MKKy8vIGNhdGNoZXMgdGhhdC4KKy8vCisvLyBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBoYXZlIHRvIHdyaXRlCisvLyAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9CisvLyBpbnN0ZWFkIG9mCisvLyAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQorLy8gdG8gYXZvaWQgYW4gTVNWQyB3YXJuaW5nIG9uIHVucmVhY2hhYmxlIGNvZGUuCisjZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCisgICAgICAgIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAorICAgICAgICAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJTlRFUkNFUFRfQUxMX1RIUkVBRFMsXAorICAgICAgICAgICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVlYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4KKy8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7CisgcHVibGljOgorICAvLyBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4gYXNzZXJ0aW9uIG9yIGFuCisgIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4KKyAgZW51bSBUeXBlIHsKKyAgICBrU3VjY2VzcywgICAgICAgICAgLy8gU3VjY2VlZGVkLgorICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4KKyAgICBrRmF0YWxGYWlsdXJlICAgICAgLy8gRmFpbGVkIGFuZCB0aGUgdGVzdCBzaG91bGQgYmUgdGVybWluYXRlZC4KKyAgfTsKKworICAvLyBDJ3Rvci4gIFRlc3RQYXJ0UmVzdWx0IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKKyAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0LgorICBUZXN0UGFydFJlc3VsdChUeXBlIGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX21lc3NhZ2UpCisgICAgICA6IHR5cGVfKGFfdHlwZSksCisgICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUpLAorICAgICAgICBsaW5lX251bWJlcl8oYV9saW5lX251bWJlciksCisgICAgICAgIHN1bW1hcnlfKEV4dHJhY3RTdW1tYXJ5KGFfbWVzc2FnZSkpLAorICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4KKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgaXQncyB1bmtub3duLgorICBjb25zdCBjaGFyKiBmaWxlX25hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlX25hbWVfLmNfc3RyKCk7IH0KKworICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsCisgIC8vIG9yIC0xIGlmIGl0J3MgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9udW1iZXJfOyB9CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorICBjb25zdCBjaGFyKiBzdW1tYXJ5KCkgY29uc3QgeyByZXR1cm4gc3VtbWFyeV8uY19zdHIoKTsgfQorCisgIC8vIEdldHMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHBhcnQuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IHBhc3NlZC4KKyAgYm9vbCBwYXNzZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYWlsZWQuCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gIT0ga1N1Y2Nlc3M7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorICBib29sIG5vbmZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga05vbkZhdGFsRmFpbHVyZTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBmYXRhbGx5X2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtGYXRhbEZhaWx1cmU7IH0KKyBwcml2YXRlOgorICBUeXBlIHR5cGVfOworCisgIC8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sKKyAgLy8gdHJhY2UgaW4gaXQuCisgIHN0YXRpYyBpbnRlcm5hbDo6U3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCisgIGludGVybmFsOjpTdHJpbmcgZmlsZV9uYW1lXzsKKyAgLy8gVGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IgLTEKKyAgLy8gaWYgdGhlIGxpbmUgbnVtYmVyIGlzIHVua25vd24uCisgIGludCBsaW5lX251bWJlcl87CisgIGludGVybmFsOjpTdHJpbmcgc3VtbWFyeV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIHN1bW1hcnkuCisgIGludGVybmFsOjpTdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCit9OworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKy8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90CisvLyB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKKyBwdWJsaWM6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQorCisgIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KKyAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgorICBpbnQgc2l6ZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOworfTsKKworLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCitjbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKKy8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQorLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKKy8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgorLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK2NsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9CisgcHJpdmF0ZToKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFlODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCkBAIC0wLDAgKzEsMjU5IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIHR5cGVkIHRlc3RzIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKy8vIFR5cGVkIChha2EgdHlwZS1kcml2ZW4pIHRlc3RzIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGZvciB0eXBlcyBpbiBhCisvLyBsaXN0LiAgWW91IG11c3Qga25vdyB3aGljaCB0eXBlcyB5b3Ugd2FudCB0byB0ZXN0IHdpdGggd2hlbiB3cml0aW5nCisvLyB0eXBlZCB0ZXN0cy4gSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKKyNpZiAwCisKKy8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICAuLi4KKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8VD4gTGlzdDsKKyAgc3RhdGljIFQgc2hhcmVkXzsKKyAgVCB2YWx1ZV87Cit9OworCisvLyBOZXh0LCBhc3NvY2lhdGUgYSBsaXN0IG9mIHR5cGVzIHdpdGggdGhlIHRlc3QgY2FzZSwgd2hpY2ggd2lsbCBiZQorLy8gcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdC4gIFRoZSB0eXBlZGVmIGlzIG5lY2Vzc2FyeSBmb3IKKy8vIHRoZSBtYWNybyB0byBwYXJzZSBjb3JyZWN0bHkuCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIE15VHlwZXMpOworCisvLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCisvLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46CisvLyAgIFRZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBpbnQpOworCisvLyBUaGVuLCB1c2UgVFlQRURfVEVTVCgpIGluc3RlYWQgb2YgVEVTVF9GKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZWQKKy8vIHRlc3RzIGZvciB0aGlzIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1QoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIC8vIFNpbmNlIHdlIGFyZSBpbnNpZGUgYSBkZXJpdmVkIGNsYXNzIHRlbXBsYXRlLCBDKysgcmVxdWlyZXMgdXNlIHRvCisgIC8vIHZpc2l0IHRoZSBtZW1iZXJzIG9mIEZvb1Rlc3QgdmlhICd0aGlzJy4KKyAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87CisKKyAgLy8gVG8gdmlzaXQgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUsIGFkZCB0aGUgVGVzdEZpeHR1cmU6OgorICAvLyBwcmVmaXguCisgIG4gKz0gVGVzdEZpeHR1cmU6OnNoYXJlZF87CisKKyAgLy8gVG8gcmVmZXIgdG8gdHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUsIGFkZCB0aGUgInR5cGVuYW1lCisgIC8vIFRlc3RGaXh0dXJlOjoiIHByZWZpeC4KKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6Okxpc3QgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKG4pOworICAuLi4KK30KKworVFlQRURfVEVTVChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KKworI2VuZGlmICAvLyAwCisKKy8vIFR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgYWJzdHJhY3QgdGVzdCBwYXR0ZXJucyBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBDb21wYXJlZCB3aXRoIHR5cGVkIHRlc3RzLCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGFsbG93IHlvdSB0byBkZWZpbmUgdGhlIHRlc3QgcGF0dGVybiB3aXRob3V0IGtub3dpbmcgd2hhdCB0aGUgdHlwZQorLy8gcGFyYW1ldGVycyBhcmUuICBUaGUgZGVmaW5lZCBwYXR0ZXJuIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gZGlmZmVyZW50IHR5cGVzIGFueSBudW1iZXIgb2YgdGltZXMsIGluIGFueSBudW1iZXIgb2YgdHJhbnNsYXRpb24KKy8vIHVuaXRzLgorLy8KKy8vIElmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhCisvLyBzdWl0ZSBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gdmVyaWZ5IHByb3BlcnRpZXMgdGhhdCBhbnkKKy8vIHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UvY29uY2VwdCBzaG91bGQgaGF2ZS4gIFRoZW4sCisvLyBlYWNoIGltcGxlbWVudGF0aW9uIGNhbiBlYXNpbHkgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgdG8gdmVyaWZ5CisvLyB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSByZXF1aXJlbWVudHMsIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlCisvLyBzaW1pbGFyIHRlc3RzIHJlcGVhdGVkbHkuICBIZXJlJ3MgYW4gZXhhbXBsZToKKworI2lmIDAKKworLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyAgLi4uCit9OworCisvLyBOZXh0LCBkZWNsYXJlIHRoYXQgeW91IHdpbGwgZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZQorLy8gKHRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UKKy8vIHByZWZlcik6CitUWVBFRF9URVNUX0NBU0VfUChGb29UZXN0KTsKKworLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1RfUCgpIHRvIGRlZmluZSBhcyBtYW55IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gZm9yIHRoaXMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgVHlwZVBhcmFtIG4gPSAwOworICAuLi4KK30KKworVFlQRURfVEVTVF9QKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorCisvLyBOb3cgdGhlIHRyaWNreSBwYXJ0OiB5b3UgbmVlZCB0byByZWdpc3RlciBhbGwgdGVzdCBwYXR0ZXJucyBiZWZvcmUKKy8vIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbS4gIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgbWFjcm8gaXMgdGhlCisvLyB0ZXN0IGNhc2UgbmFtZTsgdGhlIHJlc3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0CisvLyBjYXNlLgorUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvZXNCbGFoLCBIYXNQcm9wZXJ0eUEpOworCisvLyBGaW5hbGx5LCB5b3UgYXJlIGZyZWUgdG8gaW5zdGFudGlhdGUgdGhlIHBhdHRlcm4gd2l0aCB0aGUgdHlwZXMgeW91CisvLyB3YW50LiAgSWYgeW91IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhIGhlYWRlciBmaWxlLCB5b3UgY2FuICNpbmNsdWRlCisvLyBpdCBpbiBtdWx0aXBsZSBDKysgc291cmNlIGZpbGVzIGFuZCBpbnN0YW50aWF0ZSBpdCBtdWx0aXBsZSB0aW1lcy4KKy8vCisvLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCB0aGUgZmlyc3QKKy8vIGFyZ3VtZW50IHRvIHRoZSBJTlNUQU5USUFURV8qIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZAorLy8gdG8gdGhlIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvcgorLy8gZGlmZmVyZW50IGluc3RhbmNlcy4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgTXlUeXBlcyk7CisKKy8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKKy8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKKy8vICAgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIGludCk7CisKKyNlbmRpZiAgLy8gMAorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIgorCisvLyBJbXBsZW1lbnRzIHR5cGVkIHRlc3RzLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZQorLy8gZ2l2ZW4gdGVzdCBjYXNlLgorIyBkZWZpbmUgR1RFU1RfVFlQRV9QQVJBTVNfKFRlc3RDYXNlTmFtZSkgZ3Rlc3RfdHlwZV9wYXJhbXNfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gVGhlICdUeXBlcycgdGVtcGxhdGUgYXJndW1lbnQgYmVsb3cgbXVzdCBoYXZlIHNwYWNlcyBhcm91bmQgaXQKKy8vIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1heSBjaG9rZSBvbiAnPj4nIHdoZW4gcGFzc2luZyBhIHRlbXBsYXRlCisvLyBpbnN0YW5jZSAoZS5nLiBUeXBlczxpbnQ+KQorIyBkZWZpbmUgVFlQRURfVEVTVF9DQVNFKENhc2VOYW1lLCBUeXBlcykgXAorICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlIFwKKyAgICAgIEdURVNUX1RZUEVfUEFSQU1TXyhDYXNlTmFtZSkKKworIyBkZWZpbmUgVFlQRURfVEVTVChDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgICAgIDogcHVibGljIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IHsgXAorICAgcHJpdmF0ZTogXAorICAgIHR5cGVkZWYgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4gVGVzdEZpeHR1cmU7IFwKKyAgICB0eXBlZGVmIGd0ZXN0X1R5cGVQYXJhbV8gVHlwZVBhcmFtOyBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgfTsgXAorICBib29sIGd0ZXN0XyMjQ2FzZU5hbWUjI18jI1Rlc3ROYW1lIyNfcmVnaXN0ZXJlZF8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlUGFyYW1ldGVyaXplZFRlc3Q8IFwKKyAgICAgICAgICBDYXNlTmFtZSwgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlbXBsYXRlU2VsPCBcCisgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKT4sIFwKKyAgICAgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpPjo6UmVnaXN0ZXIoXAorICAgICAgICAgICAgICAiIiwgI0Nhc2VOYW1lLCAjVGVzdE5hbWUsIDApOyBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gSW1wbGVtZW50cyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZXNwYWNlIG5hbWUgdGhhdCB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGZvcgorLy8gdGhlIGdpdmVuIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXJlIGRlZmluZWQgaW4uICBUaGUgZXhhY3QKKy8vIG5hbWUgb2YgdGhlIG5hbWVzcGFjZSBpcyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKyMgZGVmaW5lIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfY2FzZV8jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG5hbWVzIG9mCisvLyB0aGUgZGVmaW5lZCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorIyBkZWZpbmUgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKFRlc3RDYXNlTmFtZSkgXAorICBndGVzdF90eXBlZF90ZXN0X2Nhc2VfcF9zdGF0ZV8jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFIERJUkVDVExZLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG5hbWVzIG9mCisvLyB0aGUgcmVnaXN0ZXJlZCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorIyBkZWZpbmUgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfcmVnaXN0ZXJlZF90ZXN0X25hbWVzXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIFRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgbWFjcm9zIGFyZQorLy8gc3RhdGljIGFzIHR5cGljYWxseSB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYSAuaCBmaWxlIHRoYXQgY2FuIGJlCisvLyAjaW5jbHVkZWQgaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorIyBkZWZpbmUgVFlQRURfVEVTVF9DQVNFX1AoQ2FzZU5hbWUpIFwKKyAgc3RhdGljIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkVGVzdENhc2VQU3RhdGUgXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKQorCisjIGRlZmluZSBUWVBFRF9URVNUX1AoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgIG5hbWVzcGFjZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpIHsgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICBjbGFzcyBUZXN0TmFtZSA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKKyAgIHByaXZhdGU6IFwKKyAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCisgICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgIH07IFwKKyAgc3RhdGljIGJvb2wgZ3Rlc3RfIyNUZXN0TmFtZSMjX2RlZmluZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKS5BZGRUZXN0TmFtZShcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjQ2FzZU5hbWUsICNUZXN0TmFtZSk7IFwKKyAgfSBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIHZvaWQgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKTo6VGVzdE5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz46OlRlc3RCb2R5KCkKKworIyBkZWZpbmUgUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoQ2FzZU5hbWUsIC4uLikgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZXM8X19WQV9BUkdTX18+Ojp0eXBlIGd0ZXN0X0FsbFRlc3RzXzsgXAorICB9IFwKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oQ2FzZU5hbWUpID0gXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKS5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKFwKKyAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNfX1ZBX0FSR1NfXykKKworLy8gVGhlICdUeXBlcycgdGVtcGxhdGUgYXJndW1lbnQgYmVsb3cgbXVzdCBoYXZlIHNwYWNlcyBhcm91bmQgaXQKKy8vIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1heSBjaG9rZSBvbiAnPj4nIHdoZW4gcGFzc2luZyBhIHRlbXBsYXRlCisvLyBpbnN0YW5jZSAoZS5nLiBUeXBlczxpbnQ+KQorIyBkZWZpbmUgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoUHJlZml4LCBDYXNlTmFtZSwgVHlwZXMpIFwKKyAgYm9vbCBndGVzdF8jI1ByZWZpeCMjXyMjQ2FzZU5hbWUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPENhc2VOYW1lLCBcCisgICAgICAgICAgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKTo6Z3Rlc3RfQWxsVGVzdHNfLCBcCisgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZUxpc3Q8IFR5cGVzID46OnR5cGU+OjpSZWdpc3RlcihcCisgICAgICAgICAgICAgICNQcmVmaXgsICNDYXNlTmFtZSwgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwMWM3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKQEAgLTAsMCArMSwyMTU1IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIEdvb2dsZSBUZXN0LiAgSXQgc2hvdWxkIGJlCisvLyBpbmNsdWRlZCBieSBhbnkgdGVzdCBwcm9ncmFtIHRoYXQgdXNlcyBHb29nbGUgVGVzdC4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKy8vCisvLyBBY2tub3dsZWRnbWVudDogR29vZ2xlIFRlc3QgYm9ycm93ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIHRlc3QKKy8vIHJlZ2lzdHJhdGlvbiBmcm9tIEJhcnRoZWxlbXkgRGFnZW5haXMnIChiYXJ0aGVsZW15QHByb2xvZ2lxdWUuY29tKQorLy8gZWFzeVVuaXQgZnJhbWV3b3JrLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdF9wcm9kLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIgorCisvLyBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLCBkaWZmZXJlbnQgc3RyaW5nIGNsYXNzZXMgYXJlIGF2YWlsYWJsZS4KKy8vIE9uIExpbnV4LCBpbiBhZGRpdGlvbiB0byA6OnN0ZDo6c3RyaW5nLCBHb29nbGUgYWxzbyBtYWtlcyB1c2Ugb2YKKy8vIGNsYXNzIDo6c3RyaW5nLCB3aGljaCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIDo6c3RkOjpzdHJpbmcsIGJ1dAorLy8gaGFzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgorLy8KKy8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMSB0byBpbmRpY2F0ZSB0aGF0CisvLyA6OnN0cmluZyBpcyBhdmFpbGFibGUgQU5EIGlzIGEgZGlzdGluY3QgdHlwZSB0byA6OnN0ZDo6c3RyaW5nLCBvcgorLy8gZGVmaW5lIGl0IHRvIDAgdG8gaW5kaWNhdGUgb3RoZXJ3aXNlLgorLy8KKy8vIElmIHRoZSB1c2VyJ3MgOjpzdGQ6OnN0cmluZyBhbmQgOjpzdHJpbmcgYXJlIHRoZSBzYW1lIGNsYXNzIGR1ZSB0bworLy8gYWxpYXNpbmcsIGhlIHNob3VsZCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMC4KKy8vCisvLyBJZiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORywgaXQgaXMgZGVmaW5lZAorLy8gaGV1cmlzdGljYWxseS4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCisKKy8vIFRoaXMgZmxhZyB0ZW1wb3JhcnkgZW5hYmxlcyB0aGUgZGlzYWJsZWQgdGVzdHMuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKKworLy8gVGhpcyBmbGFnIGJyaW5ncyB0aGUgZGVidWdnZXIgb24gYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGJyZWFrX29uX2ZhaWx1cmUpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBjYXRjaGVzIGFsbCB0ZXN0LXRocm93biBleGNlcHRpb25zCisvLyBhbmQgbG9ncyB0aGVtIGFzIGZhaWx1cmVzLgorR1RFU1RfREVDTEFSRV9ib29sXyhjYXRjaF9leGNlcHRpb25zKTsKKworLy8gVGhpcyBmbGFnIGVuYWJsZXMgdXNpbmcgY29sb3JzIGluIHRlcm1pbmFsIG91dHB1dC4gQXZhaWxhYmxlIHZhbHVlcyBhcmUKKy8vICJ5ZXMiIHRvIGVuYWJsZSBjb2xvcnMsICJubyIgKGRpc2FibGUgY29sb3JzKSwgb3IgImF1dG8iICh0aGUgZGVmYXVsdCkKKy8vIHRvIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oY29sb3IpOworCisvLyBUaGlzIGZsYWcgc2V0cyB1cCB0aGUgZmlsdGVyIHRvIHNlbGVjdCBieSBuYW1lIHVzaW5nIGEgZ2xvYiBwYXR0ZXJuCisvLyB0aGUgdGVzdHMgdG8gcnVuLiBJZiB0aGUgZmlsdGVyIGlzIG5vdCBnaXZlbiBhbGwgdGVzdHMgYXJlIGV4ZWN1dGVkLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGZpbHRlcik7CisKKy8vIFRoaXMgZmxhZyBjYXVzZXMgdGhlIEdvb2dsZSBUZXN0IHRvIGxpc3QgdGVzdHMuIE5vbmUgb2YgdGhlIHRlc3RzIGxpc3RlZAorLy8gYXJlIGFjdHVhbGx5IHJ1biBpZiB0aGUgZmxhZyBpcyBwcm92aWRlZC4KK0dURVNUX0RFQ0xBUkVfYm9vbF8obGlzdF90ZXN0cyk7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGVtaXRzIGEgZGV0YWlsZWQgWE1MIHJlcG9ydCB0byBhIGZpbGUKKy8vIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwgdGV4dHVhbCBvdXRwdXQuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18ob3V0cHV0KTsKKworLy8gVGhpcyBmbGFncyBjb250cm9sIHdoZXRoZXIgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBlbGFwc2VkIHRpbWUgZm9yIGVhY2gKKy8vIHRlc3QuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHByaW50X3RpbWUpOworCisvLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSByYW5kb20gbnVtYmVyIHNlZWQuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhyYW5kb21fc2VlZCk7CisKKy8vIFRoaXMgZmxhZyBzZXRzIGhvdyBtYW55IHRpbWVzIHRoZSB0ZXN0cyBhcmUgcmVwZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlCisvLyBpcyAxLiBJZiB0aGUgdmFsdWUgaXMgLTEgdGhlIHRlc3RzIGFyZSByZXBlYXRpbmcgZm9yZXZlci4KK0dURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGluY2x1ZGVzIEdvb2dsZSBUZXN0IGludGVybmFsCisvLyBzdGFjayBmcmFtZXMgaW4gZmFpbHVyZSBzdGFjayB0cmFjZXMuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0ZXN0cycgb3JkZXIgaXMgcmFuZG9taXplZCBvbiBldmVyeSBpdGVyYXRpb24uCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHNodWZmbGUpOworCisvLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUKKy8vIHByaW50ZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhzdGFja190cmFjZV9kZXB0aCk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4KKy8vIGV4Y2VwdGlvbiBpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYQorLy8gbm9uLXplcm8gY29kZSBvdGhlcndpc2UuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHRocm93X29uX2ZhaWx1cmUpOworCisvLyBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgd2l0aCBhICJob3N0OnBvcnQiIHN0cmluZywgb24gc3VwcG9ydGVkCisvLyBwbGF0Zm9ybXMgdGVzdCByZXN1bHRzIGFyZSBzdHJlYW1lZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgb24KKy8vIHRoZSBzcGVjaWZpZWQgaG9zdCBtYWNoaW5lLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKHN0cmVhbV9yZXN1bHRfdG8pOworCisvLyBUaGUgdXBwZXIgbGltaXQgZm9yIHZhbGlkIHN0YWNrIHRyYWNlIGRlcHRocy4KK2NvbnN0IGludCBrTWF4U3RhY2tUcmFjZURlcHRoID0gMTAwOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBBc3NlcnRIZWxwZXI7CitjbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKK2NsYXNzIEV4ZWNEZWF0aFRlc3Q7CitjbGFzcyBOb0V4ZWNEZWF0aFRlc3Q7CitjbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyOworY2xhc3MgR1Rlc3RGbGFnU2F2ZXI7CitjbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3I7CitjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKK2NsYXNzIFRlc3RFdmVudFJlcGVhdGVyOworY2xhc3MgV2luZG93c0RlYXRoVGVzdDsKK2NsYXNzIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCk7Cit2b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgbWVzc2FnZSk7CisKKy8vIENvbnZlcnRzIGEgc3RyZWFtYWJsZSB2YWx1ZSB0byBhIFN0cmluZy4gIEEgTlVMTCBwb2ludGVyIGlzCisvLyBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBXaGVuIHRoZSBpbnB1dCB2YWx1ZSBpcyBhIDo6c3RyaW5nLAorLy8gOjpzdGQ6OnN0cmluZywgOjp3c3RyaW5nLCBvciA6OnN0ZDo6d3N0cmluZyBvYmplY3QsIGVhY2ggTlVMCisvLyBjaGFyYWN0ZXIgaW4gaXQgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KKy8vIERlY2xhcmVkIGluIGd0ZXN0LWludGVybmFsLmggYnV0IGRlZmluZWQgaGVyZSwgc28gdGhhdCBpdCBoYXMgYWNjZXNzCisvLyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgTWVzc2FnZSBjbGFzcywgcmVxdWlyZWQgYnkgdGhlIEFSTQorLy8gY29tcGlsZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCBzdHJlYW1hYmxlKS5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmcmllbmQgcmVsYXRpb25zaGlwIG9mIHNvbWUgb2YgdGhlc2UgY2xhc3NlcyBpcyBjeWNsaWMuCisvLyBJZiB3ZSBkb24ndCBmb3J3YXJkIGRlY2xhcmUgdGhlbSB0aGUgY29tcGlsZXIgbWlnaHQgY29uZnVzZSB0aGUgY2xhc3NlcworLy8gaW4gZnJpZW5kc2hpcCBjbGF1c2VzIHdpdGggc2FtZSBuYW1lZCBjbGFzc2VzIG9uIHRoZSBzY29wZS4KK2NsYXNzIFRlc3Q7CitjbGFzcyBUZXN0Q2FzZTsKK2NsYXNzIFRlc3RJbmZvOworY2xhc3MgVW5pdFRlc3Q7CisKKy8vIEEgY2xhc3MgZm9yIGluZGljYXRpbmcgd2hldGhlciBhbiBhc3NlcnRpb24gd2FzIHN1Y2Nlc3NmdWwuICBXaGVuCisvLyB0aGUgYXNzZXJ0aW9uIHdhc24ndCBzdWNjZXNzZnVsLCB0aGUgQXNzZXJ0aW9uUmVzdWx0IG9iamVjdAorLy8gcmVtZW1iZXJzIGEgbm9uLWVtcHR5IG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgaG93IGl0IGZhaWxlZC4KKy8vCisvLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMKKy8vIChBc3NlcnRpb25TdWNjZXNzKCkgYW5kIEFzc2VydGlvbkZhaWx1cmUoKSkuCisvLworLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoKKy8vICAgMS4gRGVmaW5pbmcgcHJlZGljYXRlIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMKKy8vICAgICAgRVhQRUNUX1RSVUUvRVhQRUNUX0ZBTFNFIGFuZCB0aGVpciBBU1NFUlRfIGNvdW50ZXJwYXJ0cworLy8gICAyLiBEZWZpbmluZyBwcmVkaWNhdGUtZm9ybWF0IGZ1bmN0aW9ucyB0byBiZQorLy8gICAgICB1c2VkIHdpdGggcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEX0ZPUk1BVCosIGV0YykuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgSXNFdmVuIHByZWRpY2F0ZToKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKy8vICAgICBlbHNlCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworLy8gICB9CisvLworLy8gVGhlbiB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uIEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNSkpKQorLy8gd2lsbCBwcmludCB0aGUgbWVzc2FnZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZSAoNSBpcyBvZGQpCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW5zdGVhZCBvZiBhIG1vcmUgb3BhcXVlCisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKKy8vICAgICBBY3R1YWw6IGZhbHNlCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW4gY2FzZSBJc0V2ZW4gaXMgYSBzaW1wbGUgQm9vbGVhbiBwcmVkaWNhdGUuCisvLworLy8gSWYgeW91IGV4cGVjdCB5b3VyIHByZWRpY2F0ZSB0byBiZSByZXVzZWQgYW5kIHdhbnQgdG8gc3VwcG9ydCBpbmZvcm1hdGl2ZQorLy8gbWVzc2FnZXMgaW4gRVhQRUNUX0ZBTFNFIGFuZCBBU1NFUlRfRkFMU0UgKG5lZ2F0aXZlIGFzc2VydGlvbnMgc2hvdyB1cAorLy8gYWJvdXQgaGFsZiBhcyBvZnRlbiBhcyBwb3NpdGl2ZSBvbmVzIGluIG91ciB0ZXN0cyksIHN1cHBseSBtZXNzYWdlcyBmb3IKKy8vIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBjYXNlczoKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gYSBzdGF0ZW1lbnQgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKSB3aWxsIHByaW50CisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig2KSkKKy8vICAgICBBY3R1YWw6IHRydWUgKDggaXMgZXZlbikKKy8vICAgRXhwZWN0ZWQ6IGZhbHNlCisvLworLy8gTkI6IFByZWRpY2F0ZXMgdGhhdCBzdXBwb3J0IG5lZ2F0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucyBoYXZlIHJlZHVjZWQKKy8vIHBlcmZvcm1hbmNlIGluIHBvc2l0aXZlIG9uZXMgc28gYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRoZW0gaW4gdGVzdHMKKy8vIHRoYXQgaGF2ZSBsb3RzICh0ZW5zIG9mIHRob3VzYW5kcykgb2YgcG9zaXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zLgorLy8KKy8vIFRvIHVzZSB0aGlzIGNsYXNzIHdpdGggRVhQRUNUX1BSRURfRk9STUFUIGFzc2VydGlvbnMgc3VjaCBhczoKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKCkgcmV0dXJucyBhbiBldmVuIG51bWJlci4KKy8vICAgRVhQRUNUX1BSRURfRk9STUFUMShJc0V2ZW4sIEZvbygpKTsKKy8vCisvLyB5b3UgbmVlZCB0byBkZWZpbmU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorLy8gICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiIGlzIGV2ZW5cbiAgQWN0dWFsOiBpdCdzICIgPDwgbjsKKy8vICAgfQorLy8KKy8vIElmIEZvbygpIHJldHVybnMgNSwgeW91IHdpbGwgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKKy8vCisvLyAgIEV4cGVjdGVkOiBGb28oKSBpcyBldmVuCisvLyAgICAgQWN0dWFsOiBpdCdzIDUKKy8vCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCB7CisgcHVibGljOgorICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorICBBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7CisgIC8vIFVzZWQgaW4gdGhlIEVYUEVDVF9UUlVFL0ZBTFNFKGJvb2xfZXhwcmVzc2lvbikuCisgIGV4cGxpY2l0IEFzc2VydGlvblJlc3VsdChib29sIHN1Y2Nlc3MpIDogc3VjY2Vzc18oc3VjY2Vzcykge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLgorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0gIC8vIE5PTElOVAorCisgIC8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yISgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRleHQgc3RyZWFtZWQgaW50byB0aGlzIEFzc2VydGlvblJlc3VsdC4gVGVzdCBhc3NlcnRpb25zCisgIC8vIHVzZSBpdCB3aGVuIHRoZXkgZmFpbCAoaS5lLiwgdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUgZG9lc24ndCBtYXRjaCB0aGUKKyAgLy8gYXNzZXJ0aW9uJ3MgZXhwZWN0YXRpb24pLiBXaGVuIG5vdGhpbmcgaGFzIGJlZW4gc3RyZWFtZWQgaW50byB0aGUKKyAgLy8gb2JqZWN0LCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/ICBtZXNzYWdlXy0+Y19zdHIoKSA6ICIiOworICB9CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIGFmdGVyIG1ha2luZyBzdXJlIG5vIGNsaWVudHMgdXNlIGl0LgorICAvLyBEZXByZWNhdGVkOyBwbGVhc2UgdXNlIG1lc3NhZ2UoKSBpbnN0ZWFkLgorICBjb25zdCBjaGFyKiBmYWlsdXJlX21lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlKCk7IH0KKworICAvLyBTdHJlYW1zIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSBpbnRvIHRoaXMgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFsbG93cyBzdHJlYW1pbmcgYmFzaWMgb3V0cHV0IG1hbmlwdWxhdG9ycyBzdWNoIGFzIGVuZGwgb3IgZmx1c2ggaW50bworICAvLyB0aGlzIG9iamVjdC4KKyAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KAorICAgICAgOjpzdGQ6Om9zdHJlYW0mICgqYmFzaWNfbWFuaXB1bGF0b3IpKDo6c3RkOjpvc3RyZWFtJiBzdHJlYW0pKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgYmFzaWNfbWFuaXB1bGF0b3IpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQXBwZW5kcyB0aGUgY29udGVudHMgb2YgbWVzc2FnZSB0byBtZXNzYWdlXy4KKyAgdm9pZCBBcHBlbmRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIGFfbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgbWVzc2FnZV8ucmVzZXQobmV3IDo6c3RkOjpzdHJpbmcpOworICAgIG1lc3NhZ2VfLT5hcHBlbmQoYV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworICB9CisKKyAgLy8gU3RvcmVzIHJlc3VsdCBvZiB0aGUgYXNzZXJ0aW9uIHByZWRpY2F0ZS4KKyAgYm9vbCBzdWNjZXNzXzsKKyAgLy8gU3RvcmVzIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHRoZSBleHBlY3RhdGlvbgorICAvLyBjb25zdHJ1Y3QgaXMgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lLgorICAvLyBSZWZlcmVuY2VkIHZpYSBhIHBvaW50ZXIgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIHN0YWNrIGZyYW1lIHNwYWNlCisgIC8vIHdpdGggdGVzdCBhc3NlcnRpb25zLgorICBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZz4gbWVzc2FnZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBc3NlcnRpb25SZXN1bHQpOworfTsKKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2cuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1zZyk7CisKKy8vIFRoZSBhYnN0cmFjdCBjbGFzcyB0aGF0IGFsbCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLworLy8gSW4gR29vZ2xlIFRlc3QsIGEgdW5pdCB0ZXN0IHByb2dyYW0gY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdENhc2VzLCBhbmQKKy8vIGVhY2ggVGVzdENhc2UgY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdHMuCisvLworLy8gV2hlbiB5b3UgZGVmaW5lIGEgdGVzdCB1c2luZyB0aGUgVEVTVCBtYWNybywgeW91IGRvbid0IG5lZWQgdG8KKy8vIGV4cGxpY2l0bHkgZGVyaXZlIGZyb20gVGVzdCAtIHRoZSBURVNUIG1hY3JvIGF1dG9tYXRpY2FsbHkgZG9lcworLy8gdGhpcyBmb3IgeW91LgorLy8KKy8vIFRoZSBvbmx5IHRpbWUgeW91IGRlcml2ZSBmcm9tIFRlc3QgaXMgd2hlbiBkZWZpbmluZyBhIHRlc3QgZml4dHVyZQorLy8gdG8gYmUgdXNlZCBhIFRFU1RfRi4gIEZvciBleGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IC4uLiB9CisvLyAgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyAuLi4gfQorLy8gICAgIC4uLgorLy8gICB9OworLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQorLy8gICBURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisvLworLy8gVGVzdCBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3QgeworIHB1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworCisgIC8vIERlZmluZXMgdHlwZXMgZm9yIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IHNldCB1cCBhbmQgdGVhciBkb3duCisgIC8vIGEgdGVzdCBjYXNlLgorICB0eXBlZGVmIGludGVybmFsOjpTZXRVcFRlc3RDYXNlRnVuYyBTZXRVcFRlc3RDYXNlRnVuYzsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgVGVhckRvd25UZXN0Q2FzZUZ1bmM7CisKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgaW50ZW5kIHRvIGluaGVyaXQgZnJvbSBUZXN0LgorICB2aXJ0dWFsIH5UZXN0KCk7CisKKyAgLy8gU2V0cyB1cCB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6U2V0VXBUZXN0Q2FzZSgpIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdAorICAvLyB0ZXN0IGluIHRlc3QgY2FzZSBGb28uICBIZW5jZSBhIHN1Yi1jbGFzcyBjYW4gZGVmaW5lIGl0cyBvd24KKyAgLy8gU2V0VXBUZXN0Q2FzZSgpIG1ldGhvZCB0byBzaGFkb3cgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBzdXBlcgorICAvLyBjbGFzcy4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHt9CisKKyAgLy8gVGVhcnMgZG93biB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6VGVhckRvd25UZXN0Q2FzZSgpIGFmdGVyIHJ1bm5pbmcgdGhlIGxhc3QKKyAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCisgIC8vIFRlYXJEb3duVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKKyAgLy8gY2xhc3MuCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSAoZWl0aGVyIGZhdGFsIG9yCisgIC8vIG5vbi1mYXRhbCkgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzRmFpbHVyZSgpIHsgcmV0dXJuIEhhc0ZhdGFsRmFpbHVyZSgpIHx8IEhhc05vbmZhdGFsRmFpbHVyZSgpOyB9CisKKyAgLy8gTG9ncyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudCB0ZXN0LiAgT25seSB0aGUgbGFzdCB2YWx1ZSBmb3IgYSBnaXZlbgorICAvLyBrZXkgaXMgcmVtZW1iZXJlZC4KKyAgLy8gVGhlc2UgYXJlIHB1YmxpYyBzdGF0aWMgc28gdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gdXRpbGl0eSBmdW5jdGlvbnMKKyAgLy8gdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4KKyAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgY29uc3QgY2hhciogaW5zdGVhZCBzdHJpbmdzLCBhcyBHb29nbGUgVGVzdCBpcyB1c2VkCisgIC8vIG9uIHBsYXRmb3JtcyB3aGVyZSBzdHJpbmcgZG9lc24ndCBjb21waWxlLgorICAvLworICAvLyBOb3RlIHRoYXQgYSBkcml2aW5nIGNvbnNpZGVyYXRpb24gZm9yIHRoZXNlIFJlY29yZFByb3BlcnR5IG1ldGhvZHMKKyAgLy8gd2FzIHRvIHByb2R1Y2UgeG1sIG91dHB1dCBzdWl0ZWQgdG8gdGhlIEdyZWVuc3BhbiBjaGFydGluZyB1dGlsaXR5LAorICAvLyB3aGljaCBhdCBwcmVzZW50IHdpbGwgb25seSBjaGFydCB2YWx1ZXMgdGhhdCBmaXQgaW4gYSAzMi1iaXQgaW50LiBJdAorICAvLyBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIHJlc3RyaWN0IHRoZWlyIHZhbHVlcyB0byAzMi1iaXQgaW50cworICAvLyBpZiB0aGV5IGludGVuZCB0aGVtIHRvIGJlIHVzZWQgd2l0aCBHcmVlbnNwYW4uCisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KKyAgVGVzdCgpOworCisgIC8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisKKyAgLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyBhcworICAvLyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCisgIHN0YXRpYyBib29sIEhhc1NhbWVGaXh0dXJlQ2xhc3MoKTsKKworICAvLyBSdW5zIHRoZSB0ZXN0IGFmdGVyIHRoZSB0ZXN0IGZpeHR1cmUgaGFzIGJlZW4gc2V0IHVwLgorICAvLworICAvLyBBIHN1Yi1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGUgdGVzdCBsb2dpYy4KKyAgLy8KKyAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04gRElSRUNUTFkgSU4gQSBVU0VSIFBST0dSQU0uCisgIC8vIEluc3RlYWQsIHVzZSB0aGUgVEVTVCBvciBURVNUX0YgbWFjcm8uCisgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpID0gMDsKKworICAvLyBTZXRzIHVwLCBleGVjdXRlcywgYW5kIHRlYXJzIGRvd24gdGhlIHRlc3QuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gRGVsZXRlcyBzZWxmLiAgV2UgZGVsaWJlcmF0ZWx5IHBpY2sgYW4gdW51c3VhbCBuYW1lIGZvciB0aGlzCisgIC8vIGludGVybmFsIG1ldGhvZCB0byBhdm9pZCBjbGFzaGluZyB3aXRoIG5hbWVzIHVzZWQgaW4gdXNlciBURVNUcy4KKyAgdm9pZCBEZWxldGVTZWxmXygpIHsgZGVsZXRlIHRoaXM7IH0KKworICAvLyBVc2VzIGEgR1Rlc3RGbGFnU2F2ZXIgdG8gc2F2ZSBhbmQgcmVzdG9yZSBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCisgIGNvbnN0IGludGVybmFsOjpHVGVzdEZsYWdTYXZlciogY29uc3QgZ3Rlc3RfZmxhZ19zYXZlcl87CisKKyAgLy8gT2Z0ZW4gYSB1c2VyIG1pcy1zcGVsbHMgU2V0VXAoKSBhcyBTZXR1cCgpIGFuZCBzcGVuZHMgYSBsb25nIHRpbWUKKyAgLy8gd29uZGVyaW5nIHdoeSBpdCBpcyBuZXZlciBjYWxsZWQgYnkgR29vZ2xlIFRlc3QuICBUaGUgZGVjbGFyYXRpb24gb2YKKyAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgc29sZWx5IGZvciBjYXRjaGluZyBzdWNoIGFuIGVycm9yIGF0CisgIC8vIGNvbXBpbGUgdGltZToKKyAgLy8KKyAgLy8gICAtIFRoZSByZXR1cm4gdHlwZSBpcyBkZWxpYmVyYXRlbHkgY2hvc2VuIHRvIGJlIG5vdCB2b2lkLCBzbyBpdAorICAvLyAgIHdpbGwgYmUgYSBjb25mbGljdCBpZiBhIHVzZXIgZGVjbGFyZXMgdm9pZCBTZXR1cCgpIGluIGhpcyB0ZXN0CisgIC8vICAgZml4dHVyZS4KKyAgLy8KKyAgLy8gICAtIFRoaXMgbWV0aG9kIGlzIHByaXZhdGUsIHNvIGl0IHdpbGwgYmUgYW5vdGhlciBjb21waWxlciBlcnJvcgorICAvLyAgIGlmIGEgdXNlciBjYWxscyBpdCBmcm9tIGhpcyB0ZXN0IGZpeHR1cmUuCisgIC8vCisgIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OLgorICAvLworICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcgorICAvLyBhYm91dCBpdCBiZWluZyBwcml2YXRlLCB5b3UgaGF2ZSBtaXMtc3BlbGxlZCBTZXRVcCgpIGFzIFNldHVwKCkuCisgIHN0cnVjdCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCB7fTsKKyAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0cy4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0KTsKK307CisKK3R5cGVkZWYgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBUaW1lSW5NaWxsaXM7CisKKy8vIEEgY29weWFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHVzZXIgc3BlY2lmaWVkIHRlc3QgcHJvcGVydHkgd2hpY2ggY2FuIGJlCisvLyBvdXRwdXQgYXMgYSBrZXkvdmFsdWUgc3RyaW5nIHBhaXIuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQcm9wZXJ0eSBhcyBpdHMgZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4KK2NsYXNzIFRlc3RQcm9wZXJ0eSB7CisgcHVibGljOgorICAvLyBDJ3Rvci4gIFRlc3RQcm9wZXJ0eSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgLy8gQWx3YXlzIHVzZSB0aGlzIGNvbnN0cnVjdG9yICh3aXRoIHBhcmFtZXRlcnMpIHRvIGNyZWF0ZSBhCisgIC8vIFRlc3RQcm9wZXJ0eSBvYmplY3QuCisgIFRlc3RQcm9wZXJ0eShjb25zdCBjaGFyKiBhX2tleSwgY29uc3QgY2hhciogYV92YWx1ZSkgOgorICAgIGtleV8oYV9rZXkpLCB2YWx1ZV8oYV92YWx1ZSkgeworICB9CisKKyAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCBrZXkuCisgIGNvbnN0IGNoYXIqIGtleSgpIGNvbnN0IHsKKyAgICByZXR1cm4ga2V5Xy5jX3N0cigpOworICB9CisKKyAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCB2YWx1ZS4KKyAgY29uc3QgY2hhciogdmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXy5jX3N0cigpOworICB9CisKKyAgLy8gU2V0cyBhIG5ldyB2YWx1ZSwgb3ZlcnJpZGluZyB0aGUgb25lIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBTZXRWYWx1ZShjb25zdCBjaGFyKiBuZXdfdmFsdWUpIHsKKyAgICB2YWx1ZV8gPSBuZXdfdmFsdWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRoZSBrZXkgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgIGludGVybmFsOjpTdHJpbmcga2V5XzsKKyAgLy8gVGhlIHZhbHVlIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorICBpbnRlcm5hbDo6U3RyaW5nIHZhbHVlXzsKK307CisKKy8vIFRoZSByZXN1bHQgb2YgYSBzaW5nbGUgVGVzdC4gIFRoaXMgaW5jbHVkZXMgYSBsaXN0IG9mCisvLyBUZXN0UGFydFJlc3VsdHMsIGEgbGlzdCBvZiBUZXN0UHJvcGVydGllcywgYSBjb3VudCBvZiBob3cgbWFueQorLy8gZGVhdGggdGVzdHMgdGhlcmUgYXJlIGluIHRoZSBUZXN0LCBhbmQgaG93IG11Y2ggdGltZSBpdCB0b29rIHRvIHJ1bgorLy8gdGhlIFRlc3QuCisvLworLy8gVGVzdFJlc3VsdCBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RSZXN1bHQgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorICBUZXN0UmVzdWx0KCk7CisKKyAgLy8gRCd0b3IuICBEbyBub3QgaW5oZXJpdCBmcm9tIFRlc3RSZXN1bHQuCisgIH5UZXN0UmVzdWx0KCk7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IHBhcnRzLiAgVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIKKyAgLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgorICBpbnQgdG90YWxfcGFydF9jb3VudCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgorICBpbnQgdGVzdF9wcm9wZXJ0eV9jb3VudCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFzc2VkIChpLmUuIG5vIHRlc3QgcGFydCBmYWlsZWQpLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgorICBib29sIEZhaWxlZCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCisgIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbiByYW5nZQorICAvLyBmcm9tIDAgdG8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzCisgIC8vIHRoZSBwcm9ncmFtLgorICBjb25zdCBUZXN0UGFydFJlc3VsdCYgR2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwcm9wZXJ0eS4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKKyAgLy8gcHJvZ3JhbS4KKyAgY29uc3QgVGVzdFByb3BlcnR5JiBHZXRUZXN0UHJvcGVydHkoaW50IGkpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworICBmcmllbmQgY2xhc3MgVW5pdFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RXhlY0RlYXRoVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0UmVzdWx0QWNjZXNzb3I7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OldpbmRvd3NEZWF0aFRlc3Q7CisKKyAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQYXJ0UmVzdWx0cy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfOworICB9CisKKyAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+JiB0ZXN0X3Byb3BlcnRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfcHJvcGVydGllc187CisgIH0KKworICAvLyBTZXRzIHRoZSBlbGFwc2VkIHRpbWUuCisgIHZvaWQgc2V0X2VsYXBzZWRfdGltZShUaW1lSW5NaWxsaXMgZWxhcHNlZCkgeyBlbGFwc2VkX3RpbWVfID0gZWxhcHNlZDsgfQorCisgIC8vIEFkZHMgYSB0ZXN0IHByb3BlcnR5IHRvIHRoZSBsaXN0LiBUaGUgcHJvcGVydHkgaXMgdmFsaWRhdGVkIGFuZCBtYXkgYWRkCisgIC8vIGEgbm9uLWZhdGFsIGZhaWx1cmUgaWYgaW52YWxpZCAoZS5nLiwgaWYgaXQgY29uZmxpY3RzIHdpdGggcmVzZXJ2ZWQKKyAgLy8ga2V5IG5hbWVzKS4gSWYgYSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlY29yZGVkIGZvciB0aGUgc2FtZSBrZXksIHRoZQorICAvLyB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQsIHJhdGhlciB0aGFuIHN0b3JpbmcgbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgc2FtZQorICAvLyBrZXkuCisgIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKKworICAvLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIEdvb2dsZSBUZXN0CisgIC8vIHRlc3RjYXNlIHRhZ3MuICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkLgorICAvLyBUT0RPKHJ1c3NyKTogVmFsaWRhdGUgYXR0cmlidXRlIG5hbWVzIGFyZSBsZWdhbCBhbmQgaHVtYW4gcmVhZGFibGUuCisgIHN0YXRpYyBib29sIFZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgLy8gQWRkcyBhIHRlc3QgcGFydCByZXN1bHQgdG8gdGhlIGxpc3QuCisgIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpOworCisgIC8vIFJldHVybnMgdGhlIGRlYXRoIHRlc3QgY291bnQuCisgIGludCBkZWF0aF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gZGVhdGhfdGVzdF9jb3VudF87IH0KKworICAvLyBJbmNyZW1lbnRzIHRoZSBkZWF0aCB0ZXN0IGNvdW50LCByZXR1cm5pbmcgdGhlIG5ldyBjb3VudC4KKyAgaW50IGluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCkgeyByZXR1cm4gKytkZWF0aF90ZXN0X2NvdW50XzsgfQorCisgIC8vIENsZWFycyB0aGUgdGVzdCBwYXJ0IHJlc3VsdHMuCisgIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoKTsKKworICAvLyBDbGVhcnMgdGhlIG9iamVjdC4KKyAgdm9pZCBDbGVhcigpOworCisgIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgb2YgdGhlIHByb3BlcnR5IHZlY3RvciBhbmQgb2Ygb3duZWQKKyAgLy8gcHJvcGVydGllcywgd2hvc2UgdmFsdWVzIG1heSBiZSB1cGRhdGVkLgorICBpbnRlcm5hbDo6TXV0ZXggdGVzdF9wcm9wZXJpdGVzX211dGV4XzsKKworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RQYXJ0UmVzdWx0cworICBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4gdGVzdF9wYXJ0X3Jlc3VsdHNfOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzCisgIHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4gdGVzdF9wcm9wZXJ0aWVzXzsKKyAgLy8gUnVubmluZyBjb3VudCBvZiBkZWF0aCB0ZXN0cy4KKyAgaW50IGRlYXRoX3Rlc3RfY291bnRfOworICAvLyBUaGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdFJlc3VsdC4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UmVzdWx0KTsKK307ICAvLyBjbGFzcyBUZXN0UmVzdWx0CisKKy8vIEEgVGVzdEluZm8gb2JqZWN0IHN0b3JlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgdGVzdDoKKy8vCisvLyAgIFRlc3QgY2FzZSBuYW1lCisvLyAgIFRlc3QgbmFtZQorLy8gICBXaGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4KKy8vICAgQSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgY3JlYXRlcyB0aGUgdGVzdCBvYmplY3Qgd2hlbiBpbnZva2VkCisvLyAgIFRlc3QgcmVzdWx0CisvLworLy8gVGhlIGNvbnN0cnVjdG9yIG9mIFRlc3RJbmZvIHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgVW5pdFRlc3QKKy8vIHNpbmdsZXRvbiBzdWNoIHRoYXQgdGhlIFJVTl9BTExfVEVTVFMoKSBtYWNybyBrbm93cyB3aGljaCB0ZXN0cyB0bworLy8gcnVuLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0SW5mbyB7CisgcHVibGljOgorICAvLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB2aXJ0dWFsLCBzbworICAvLyBkb24ndCBpbmhlcml0IGZyb20gVGVzdEluZm8uCisgIH5UZXN0SW5mbygpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgY2FzZSBuYW1lLgorICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBuYW1lLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQKKyAgLy8gb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIHBhcmFtZXRlciwgb3IgTlVMTCBpZiB0aGlzCisgIC8vIGlzIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0oKSBjb25zdCB7CisgICAgaWYgKHZhbHVlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHZhbHVlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1biwgdGhhdCBpcyBpZiB0aGUgdGVzdCBpcyBub3QgZGlzYWJsZWQKKyAgLy8gKG9yIGl0IGlzIGRpc2FibGVkIGJ1dCB0aGUgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyBoYXMgYmVlbiBzcGVjaWZpZWQpCisgIC8vIGFuZCBpdHMgZnVsbCBuYW1lIG1hdGNoZXMgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlci4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3QgYWxsb3dzIHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgdGVzdHMgYnkgdGhlaXIgZnVsbCBuYW1lcy4KKyAgLy8gVGhlIGZ1bGwgbmFtZSBvZiBhIHRlc3QgQmFyIGluIHRlc3QgY2FzZSBGb28gaXMgZGVmaW5lZCBhcworICAvLyAiRm9vLkJhciIuICBPbmx5IHRoZSB0ZXN0cyB0aGF0IG1hdGNoIHRoZSBmaWx0ZXIgd2lsbCBydW4uCisgIC8vCisgIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucywKKyAgLy8gb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICctJyBhbmQgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZgorICAvLyBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0CisgIC8vIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mCisgIC8vIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsICpBKjpGb28uKiBpcyBhIGZpbHRlciB0aGF0IG1hdGNoZXMgYW55IHN0cmluZyB0aGF0CisgIC8vIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXIgJ0EnIG9yIHN0YXJ0cyB3aXRoICJGb28uIi4KKyAgYm9vbCBzaG91bGRfcnVuKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX3J1bl87IH0KKworICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuCisgIGNvbnN0IFRlc3RSZXN1bHQqIHJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICZyZXN1bHRfOyB9CisKKyBwcml2YXRlOgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgZnJpZW5kIGNsYXNzIFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBUZXN0SW5mbyogaW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCisgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworICAvLyBDb25zdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiBUaGUgbmV3bHkgY29uc3RydWN0ZWQgaW5zdGFuY2UgYXNzdW1lcworICAvLyBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgorICBUZXN0SW5mbyhjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICBjb25zdCBjaGFyKiBhX3ZhbHVlX3BhcmFtLAorICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworCisgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiBkZWF0aCB0ZXN0cyBlbmNvdW50ZXJlZCBpbiB0aGlzIHRlc3Qgc28KKyAgLy8gZmFyLgorICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7CisgICAgcmV0dXJuIHJlc3VsdF8uaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCisgIC8vIGRlbGV0ZXMgaXQuCisgIHZvaWQgUnVuKCk7CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UmVzdWx0KFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICB0ZXN0X2luZm8tPnJlc3VsdF8uQ2xlYXIoKTsKKyAgfQorCisgIC8vIFRoZXNlIGZpZWxkcyBhcmUgaW1tdXRhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHRlc3QuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsgICAgIC8vIFRlc3QgY2FzZSBuYW1lCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOyAgICAgICAgICAgICAgIC8vIFRlc3QgbmFtZQorICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOworICAvLyBUZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHZhbHVlX3BhcmFtXzsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkXzsgICAvLyBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisgIGJvb2wgc2hvdWxkX3J1bl87ICAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1bgorICBib29sIGlzX2Rpc2FibGVkXzsgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IGlzIGRpc2FibGVkCisgIGJvb2wgbWF0Y2hlc19maWx0ZXJfOyAgICAgICAgICAgICAvLyBUcnVlIGlmIHRoaXMgdGVzdCBtYXRjaGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBjb25zdCBmYWN0b3J5XzsgIC8vIFRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXN0IG9iamVjdAorCisgIC8vIFRoaXMgZmllbGQgaXMgbXV0YWJsZSBhbmQgbmVlZHMgdG8gYmUgcmVzZXQgYmVmb3JlIHJ1bm5pbmcgdGhlCisgIC8vIHRlc3QgZm9yIHRoZSBzZWNvbmQgdGltZS4KKyAgVGVzdFJlc3VsdCByZXN1bHRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEluZm8pOworfTsKKworLy8gQSB0ZXN0IGNhc2UsIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RJbmZvcy4KKy8vCisvLyBUZXN0Q2FzZSBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLworICAvLyBUZXN0Q2FzZSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIEFsd2F5cyB1c2UgdGhpcworICAvLyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBUZXN0Q2FzZSBvYmplY3QuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorICB2aXJ0dWFsIH5UZXN0Q2FzZSgpOworCisgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRlc3RDYXNlLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgcGFzc2VkLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkX3Rlc3RfY291bnQoKSA+IDA7IH0KKworICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdEluZm8qIEdldFRlc3RJbmZvKGludCBpKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKKworICAvLyBHZXRzIHRoZSAobXV0YWJsZSkgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGlzIFRlc3RDYXNlLgorICBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+JiB0ZXN0X2luZm9fbGlzdCgpIHsgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsgfQorCisgIC8vIEdldHMgdGhlIChpbW11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0SW5mbyogR2V0TXV0YWJsZVRlc3RJbmZvKGludCBpKTsKKworICAvLyBTZXRzIHRoZSBzaG91bGRfcnVuIG1lbWJlci4KKyAgdm9pZCBzZXRfc2hvdWxkX3J1bihib29sIHNob3VsZCkgeyBzaG91bGRfcnVuXyA9IHNob3VsZDsgfQorCisgIC8vIEFkZHMgYSBUZXN0SW5mbyB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSBUZXN0SW5mbyB1cG9uCisgIC8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCisgIHZvaWQgQWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pOworCisgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZvaWQgQ2xlYXJSZXN1bHQoKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCisgIHN0YXRpYyB2b2lkIENsZWFyVGVzdENhc2VSZXN1bHQoVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICAgIHRlc3RfY2FzZS0+Q2xlYXJSZXN1bHQoKTsKKyAgfQorCisgIC8vIFJ1bnMgZXZlcnkgdGVzdCBpbiB0aGlzIFRlc3RDYXNlLgorICB2b2lkIFJ1bigpOworCisgIC8vIFJ1bnMgU2V0VXBUZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzIG5lZWRlZAorICAvLyBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBTZXRVcFRlc3RDYXNlKCkuCisgIHZvaWQgUnVuU2V0VXBUZXN0Q2FzZSgpIHsgKCpzZXRfdXBfdGNfKSgpOyB9CisKKyAgLy8gUnVucyBUZWFyRG93blRlc3RDYXNlKCkgZm9yIHRoaXMgVGVzdENhc2UuICBUaGlzIHdyYXBwZXIgaXMKKyAgLy8gbmVlZGVkIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFRlYXJEb3duVGVzdENhc2UoKS4KKyAgdm9pZCBSdW5UZWFyRG93blRlc3RDYXNlKCkgeyAoKnRlYXJfZG93bl90Y18pKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgcGFzc2VkLgorICBzdGF0aWMgYm9vbCBUZXN0UGFzc2VkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9pbmZvLT5yZXN1bHQoKS0+UGFzc2VkKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgZmFpbGVkLgorICBzdGF0aWMgYm9vbCBUZXN0RmFpbGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9pbmZvLT5yZXN1bHQoKS0+RmFpbGVkKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgaXMgZGlzYWJsZWQuCisgIHN0YXRpYyBib29sIFRlc3REaXNhYmxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCisgIHN0YXRpYyBib29sIFNob3VsZFJ1blRlc3QoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKTsKKyAgfQorCisgIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgdm9pZCBTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKTsKKworICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCisgIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKKworICAvLyBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCisgIGludGVybmFsOjpTdHJpbmcgbmFtZV87CisgIC8vIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYQorICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbV87CisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKKyAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiB0ZXN0X2luZm9fbGlzdF87CisgIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHRoZSB0ZXN0IGxpc3QgdG8gYWxsb3cgZWFzeQorICAvLyBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBvcmRlci4gIFRoZSBpLXRoIGVsZW1lbnQgaW4gdGhpcworICAvLyB2ZWN0b3IgaXMgdGhlIGluZGV4IG9mIHRoZSBpLXRoIHRlc3QgaW4gdGhlIHNodWZmbGVkIHRlc3QgbGlzdC4KKyAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2luZGljZXNfOworICAvLyBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZS4KKyAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjXzsKKyAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UuCisgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Y187CisgIC8vIFRydWUgaWZmIGFueSB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIHNob3VsZCBydW4uCisgIGJvb2wgc2hvdWxkX3J1bl87CisgIC8vIEVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RDYXNlcy4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0Q2FzZSk7Cit9OworCisvLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgaXMgY2FwYWJsZSBvZiBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gYW4KKy8vIGVudmlyb25tZW50LiAgVGhlIHVzZXIgc2hvdWxkIHN1YmNsYXNzIHRoaXMgdG8gZGVmaW5lIGhpcyBvd24KKy8vIGVudmlyb25tZW50KHMpLgorLy8KKy8vIEFuIEVudmlyb25tZW50IG9iamVjdCBkb2VzIHRoZSBzZXQtdXAgYW5kIHRlYXItZG93biBpbiB2aXJ0dWFsCisvLyBtZXRob2RzIFNldFVwKCkgYW5kIFRlYXJEb3duKCkgaW5zdGVhZCBvZiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZQorLy8gZGVzdHJ1Y3RvciwgYXM6CisvLworLy8gICAxLiBZb3UgY2Fubm90IHNhZmVseSB0aHJvdyBmcm9tIGEgZGVzdHJ1Y3Rvci4gIFRoaXMgaXMgYSBwcm9ibGVtCisvLyAgICAgIGFzIGluIHNvbWUgY2FzZXMgR29vZ2xlIFRlc3QgaXMgdXNlZCB3aGVyZSBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBhbmQKKy8vICAgICAgd2UgbWF5IHdhbnQgdG8gaW1wbGVtZW50IEFTU0VSVF8qIHVzaW5nIGV4Y2VwdGlvbnMgd2hlcmUgdGhleSBhcmUKKy8vICAgICAgYXZhaWxhYmxlLgorLy8gICAyLiBZb3UgY2Fubm90IHVzZSBBU1NFUlRfKiBkaXJlY3RseSBpbiBhIGNvbnN0cnVjdG9yIG9yCisvLyAgICAgIGRlc3RydWN0b3IuCitjbGFzcyBFbnZpcm9ubWVudCB7CisgcHVibGljOgorICAvLyBUaGUgZCd0b3IgaXMgdmlydHVhbCBhcyB3ZSBuZWVkIHRvIHN1YmNsYXNzIEVudmlyb25tZW50LgorICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9CisKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CisKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHRlYXIgZG93biB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CisgcHJpdmF0ZToKKyAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKKyAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgorICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307CisgIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQorfTsKKworLy8gVGhlIGludGVyZmFjZSBmb3IgdHJhY2luZyBleGVjdXRpb24gb2YgdGVzdHMuIFRoZSBtZXRob2RzIGFyZSBvcmdhbml6ZWQgaW4KKy8vIHRoZSBvcmRlciB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgYXJlIGZpcmVkLgorY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEV2ZW50TGlzdGVuZXIoKSB7fQorCisgIC8vIEZpcmVkIGJlZm9yZSBhbnkgdGVzdCBhY3Rpdml0eSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuICBUaGVyZSBtYXkgYmUgbW9yZSB0aGFuCisgIC8vIG9uZSBpdGVyYXRpb24gaWYgR1RFU1RfRkxBRyhyZXBlYXQpIGlzIHNldC4gaXRlcmF0aW9uIGlzIHRoZSBpdGVyYXRpb24KKyAgLy8gaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVudmlyb25tZW50IHNldC11cCBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSB0aGUgdGVzdCBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0aW9uIG9yIGEgU1VDQ0VFRCgpIGludm9jYXRpb24uCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgdGhlIHRlc3QgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgdGhlIHRlc3QgY2FzZSBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBmaW5pc2hlcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBhbGwgdGVzdCBhY3Rpdml0aWVzIGhhdmUgZW5kZWQuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKK307CisKKy8vIFRoZSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdXNlcnMgd2hvIG5lZWQgdG8gb3ZlcnJpZGUganVzdCBvbmUgb3IgdHdvCisvLyBtZXRob2RzIGFuZCBhcmUgbm90IGNvbmNlcm5lZCB0aGF0IGEgcG9zc2libGUgY2hhbmdlIHRvIGEgc2lnbmF0dXJlIG9mCisvLyB0aGUgbWV0aG9kcyB0aGV5IG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhdWdodCBkdXJpbmcgdGhlIGJ1aWxkLiAgRm9yCisvLyBjb21tZW50cyBhYm91dCBlYWNoIG1ldGhvZCBwbGVhc2Ugc2VlIHRoZSBkZWZpbml0aW9uIG9mIFRlc3RFdmVudExpc3RlbmVyCisvLyBhYm92ZS4KK2NsYXNzIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiAvKnRlc3RfcGFydF9yZXN1bHQqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KK307CisKKy8vIFRlc3RFdmVudExpc3RlbmVycyBsZXRzIHVzZXJzIGFkZCBsaXN0ZW5lcnMgdG8gdHJhY2sgZXZlbnRzIGluIEdvb2dsZSBUZXN0LgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0RXZlbnRMaXN0ZW5lcnMgeworIHB1YmxpYzoKKyAgVGVzdEV2ZW50TGlzdGVuZXJzKCk7CisgIH5UZXN0RXZlbnRMaXN0ZW5lcnMoKTsKKworICAvLyBBcHBlbmRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIEdvb2dsZSBUZXN0IGFzc3VtZXMKKyAgLy8gdGhlIG93bmVyc2hpcCBvZiB0aGUgbGlzdGVuZXIgKGkuZS4gaXQgd2lsbCBkZWxldGUgdGhlIGxpc3RlbmVyIHdoZW4KKyAgLy8gdGhlIHRlc3QgcHJvZ3JhbSBmaW5pc2hlcykuCisgIHZvaWQgQXBwZW5kKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKyAgLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucworICAvLyBOVUxMIGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCisgIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IGNvbnNvbGUKKyAgLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKyAgLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAorICAvLyB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcworICAvLyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dCB0aW1lLgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgWE1MIG91dHB1dAorICAvLyBjb250cm9sbGVkIGJ5IHRoZSAtLWd0ZXN0X291dHB1dD14bWwgZmxhZy4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlCisgIC8vIGxpc3RlbmVycyBsaXN0IGJ5IHVzZXJzIHdobyB3YW50IHRvIHNodXQgZG93biB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0CisgIC8vIGNvbnRyb2xsZWQgYnkgdGhpcyBmbGFnIGFuZCBzdWJzdGl0dXRlIGl0IHdpdGggY3VzdG9tIG9uZS4gIE5vdGUgdGhhdAorICAvLyByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0IHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzCisgIC8vIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzIGZ1bmN0aW9uIHJldHVybiBOVUxMIHRoZSBuZXh0CisgIC8vIHRpbWUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl87CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok5vRXhlY0RlYXRoVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisKKyAgLy8gUmV0dXJucyByZXBlYXRlciB0aGF0IGJyb2FkY2FzdHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGV2ZW50cyB0byBhbGwKKyAgLy8gc3Vic2NyaWJlcnMuCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlcigpOworCisgIC8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKyAgLy8gVGhlIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisgIC8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisgIC8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisgIC8vIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKyAgLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKyAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgorICB2b2lkIFNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCBieSB0aGUgcmVwZWF0ZXIgdG8gdGhlCisgIC8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KKyAgYm9vbCBFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3Q7CisgIHZvaWQgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKworICAvLyBUaGUgYWN0dWFsIGxpc3Qgb2YgbGlzdGVuZXJzLgorICBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIqIHJlcGVhdGVyXzsKKyAgLy8gTGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBzdGFuZGFyZCByZXN1bHQgb3V0cHV0LgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFhNTCBvdXRwdXQgZmlsZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0RXZlbnRMaXN0ZW5lcnMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50TGlzdGVuZXJzKTsKK307CisKKy8vIEEgVW5pdFRlc3QgY29uc2lzdHMgb2YgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLgorLy8KKy8vIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MuICBUaGUgb25seSBpbnN0YW5jZSBvZiBVbml0VGVzdCBpcworLy8gY3JlYXRlZCB3aGVuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIGlzIGZpcnN0IGNhbGxlZC4gIFRoaXMKKy8vIGluc3RhbmNlIGlzIG5ldmVyIGRlbGV0ZWQuCisvLworLy8gVW5pdFRlc3QgaXMgbm90IGNvcHlhYmxlLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUgYXMgbG9uZyBhcyB0aGUgbWV0aG9kcyBhcmUgY2FsbGVkCisvLyBhY2NvcmRpbmcgdG8gdGhlaXIgc3BlY2lmaWNhdGlvbi4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3QgeworIHB1YmxpYzoKKyAgLy8gR2V0cyB0aGUgc2luZ2xldG9uIFVuaXRUZXN0IG9iamVjdC4gIFRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kCisgIC8vIGlzIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLgorICAvLyBDb25zZWN1dGl2ZSBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QuCisgIHN0YXRpYyBVbml0VGVzdCogR2V0SW5zdGFuY2UoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisgIC8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIGludCBSdW4oKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOworCisgIC8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKQorICAvLyB3YXMgZXhlY3V0ZWQuICBUaGUgVW5pdFRlc3Qgb2JqZWN0IG93bnMgdGhlIHN0cmluZy4KKyAgY29uc3QgY2hhciogb3JpZ2luYWxfd29ya2luZ19kaXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorICAvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgY29uc3QgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZCgpIGNvbnN0OworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gUmV0dXJucyB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KKyAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCisgIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisgIC8vIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgorICBib29sIFBhc3NlZCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisgIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorICBib29sIEZhaWxlZCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCisgIC8vIGluc2lkZSBHb29nbGUgVGVzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMoKTsKKworIHByaXZhdGU6CisgIC8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKyAgLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4KKyAgLy8gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLiAgQWZ0ZXIgYWxsIHRlc3RzIGluIHRoZSBwcm9ncmFtCisgIC8vIGhhdmUgZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4KKyAgLy8gdGhlICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKyAgLy8KKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAvLworICAvLyBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgIEVudmlyb25tZW50KiBBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKKworICAvLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwKKyAgLy8gR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIG1hY3JvcyAoZS5nLiBBU1NFUlRfVFJVRSwgRVhQRUNUX0VRLCBldGMpCisgIC8vIGV2ZW50dWFsbHkgY2FsbCB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZQorICAvLyBzaG91bGQgdXNlIHRoZSBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5LgorICB2b2lkIEFkZFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6U3RyaW5nJiBvc19zdGFja190cmFjZSk7CisKKyAgLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdC4gSWYgdGhlIHJlc3VsdCBhbHJlYWR5CisgIC8vIGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCisgIHZvaWQgUmVjb3JkUHJvcGVydHlGb3JDdXJyZW50VGVzdChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSk7CisKKyAgLy8gQWNjZXNzb3JzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0LgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsKCkgeyByZXR1cm4gaW1wbF87IH0KKyAgY29uc3QgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfOyB9CisKKyAgLy8gVGhlc2UgY2xhc3NlcyBhbmQgZnVuY2lvbnMgYXJlIGZyaWVuZHMgYXMgdGhleSBuZWVkIHRvIGFjY2VzcyBwcml2YXRlCisgIC8vIG1lbWJlcnMgb2YgVW5pdFRlc3QuCisgIGZyaWVuZCBjbGFzcyBUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkFzc2VydEhlbHBlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTY29wZWRUcmFjZTsKKyAgZnJpZW5kIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CisgIGZyaWVuZCBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGZyaWVuZCB2b2lkIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgIGNvbnN0IGludGVybmFsOjpTdHJpbmcmIG1lc3NhZ2UpOworCisgIC8vIENyZWF0ZXMgYW4gZW1wdHkgVW5pdFRlc3QuCisgIFVuaXRUZXN0KCk7CisKKyAgLy8gRCd0b3IKKyAgdmlydHVhbCB+VW5pdFRlc3QoKTsKKworICAvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisgIC8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorICB2b2lkIFB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKTsKKworICAvLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgdm9pZCBQb3BHVGVzdFRyYWNlKCk7CisKKyAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8uICBUaGlzIGlzIG11dGFibGUgYXMgc29tZSBjb25zdAorICAvLyBtZXRob2RzIG5lZWQgdG8gbG9jayBpdCB0b28uCisgIG11dGFibGUgaW50ZXJuYWw6Ok11dGV4IG11dGV4XzsKKworICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyBuZXZlciBjaGFuZ2VkIG9uY2UKKyAgLy8gdGhlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZC4gIFdlIGRvbid0IG1hcmsgaXQgYXMgY29uc3QgaGVyZSwgYXMKKyAgLy8gZG9pbmcgc28gd2lsbCBjYXVzZSBhIHdhcm5pbmcgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIFVuaXRUZXN0LgorICAvLyBNdXRhYmxlIHN0YXRlIGluICppbXBsXyBpcyBwcm90ZWN0ZWQgYnkgbXV0ZXhfLgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsXzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFVuaXRUZXN0LgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0KTsKK307CisKKy8vIEEgY29udmVuaWVudCB3cmFwcGVyIGZvciBhZGRpbmcgYW4gZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0CisvLyBwcm9ncmFtLgorLy8KKy8vIFlvdSBzaG91bGQgY2FsbCB0aGlzIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkLCBwcm9iYWJseSBpbgorLy8gbWFpbigpLiAgSWYgeW91IHVzZSBndGVzdF9tYWluLCB5b3UgbmVlZCB0byBjYWxsIHRoaXMgYmVmb3JlIG1haW4oKQorLy8gc3RhcnRzIGZvciBpdCB0byB0YWtlIGVmZmVjdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBhIGdsb2JhbAorLy8gdmFyaWFibGUgbGlrZSB0aGlzOgorLy8KKy8vICAgdGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGZvb19lbnYgPQorLy8gICAgICAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBGb29FbnZpcm9ubWVudCk7CisvLworLy8gSG93ZXZlciwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byB3cml0ZSB5b3VyIG93biBtYWluKCkgYW5kCisvLyBjYWxsIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHRoZXJlLCBhcyByZWx5aW5nIG9uIGluaXRpYWxpemF0aW9uCisvLyBvZiBnbG9iYWwgdmFyaWFibGVzIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkIGFuZCBtYXkgY2F1c2UKKy8vIHByb2JsZW1zIHdoZW4geW91IHJlZ2lzdGVyIG11bHRpcGxlIGVudmlyb25tZW50cyBmcm9tIGRpZmZlcmVudAorLy8gdHJhbnNsYXRpb24gdW5pdHMgYW5kIHRoZSBlbnZpcm9ubWVudHMgaGF2ZSBkZXBlbmRlbmNpZXMgYW1vbmcgdGhlbQorLy8gKHJlbWVtYmVyIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBpbiB3aGljaAorLy8gZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBhcmUgaW5pdGlhbGl6ZWQpLgoraW5saW5lIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkFkZEVudmlyb25tZW50KGVudik7Cit9CisKKy8vIEluaXRpYWxpemVzIEdvb2dsZSBUZXN0LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZworLy8gUlVOX0FMTF9URVNUUygpLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUKKy8vIGZsYWdzIHRoYXQgR29vZ2xlIFRlc3QgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIFRlc3QgZmxhZyBpcworLy8gc2VlbiwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgVGVzdCBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzZWNvbmQgdGltZSBoYXMgbm8gdXNlci12aXNpYmxlIGVmZmVjdC4KK0dURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKKworLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgorLy8gVU5JQ09ERSBtb2RlLgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBGb3JtYXRzIGEgY29tcGFyaXNvbiBhc3NlcnRpb24gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfTFQsIGFuZCBldGMpCisvLyBvcGVyYW5kIHRvIGJlIHVzZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuICBUaGUgdHlwZSAoYnV0IG5vdCB2YWx1ZSkKKy8vIG9mIHRoZSBvdGhlciBvcGVyYW5kIG1heSBhZmZlY3QgdGhlIGZvcm1hdC4gIFRoaXMgYWxsb3dzIHVzIHRvCisvLyBwcmludCBhIGNoYXIqIGFzIGEgcmF3IHBvaW50ZXIgd2hlbiBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IGFub3RoZXIKKy8vIGNoYXIqLCBhbmQgcHJpbnQgaXQgYXMgYSBDIHN0cmluZyB3aGVuIGl0IGlzIGNvbXBhcmVkIGFnYWluc3QgYW4KKy8vIHN0ZDo6c3RyaW5nIG9iamVjdCwgZm9yIGV4YW1wbGUuCisvLworLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgdHlwZSBvZiB0aGUgb3RoZXIgb3BlcmFuZC4KKy8vIFNvbWUgc3BlY2lhbGl6ZWQgdmVyc2lvbnMgYXJlIHVzZWQgdG8gaGFuZGxlIGZvcm1hdHRpbmcgd2lkZSBvcgorLy8gbmFycm93IEMgc3RyaW5ncy4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorU3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShjb25zdCBUMSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiAvKiBvdGhlcl9vcGVyYW5kICovKSB7CisgIC8vIEMrK0J1aWxkZXIgY29tcGlsZXMgdGhpcyBpbmNvcnJlY3RseSBpZiB0aGUgbmFtZXNwYWNlIGlzbid0IGV4cGxpY2l0bHkKKyAgLy8gZ2l2ZW4uCisgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiBhY3R1YWwpIHsKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoLgorI2VuZGlmCisKKyAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYKKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIFdpdGggdGhpcyBvdmVybG9hZGVkIHZlcnNpb24sIHdlIGFsbG93IGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkCisvLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMgZW51bXMKKy8vIGNhbiBiZSBpbXBsaWNpdGx5IGNhc3QgdG8gQmlnZ2VzdEludC4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgY2xhc3MgZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAorLy8gbGhzX2lzX251bGxfbGl0ZXJhbCBpcyB0cnVlIGlmZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkKKy8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMKKy8vIGZvciBsaHNfaXNfbnVsbF9saXRlcmFsIGJlaW5nIGZhbHNlLgordGVtcGxhdGUgPGJvb2wgbGhzX2lzX251bGxfbGl0ZXJhbD4KK2NsYXNzIEVxSGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgdGVtcGxhdGl6ZWQgdmVyc2lvbiBpcyBmb3IgdGhlIGdlbmVyYWwgY2FzZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiBhY3R1YWwpIHsKKyAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICB9CisKKyAgLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQKKyAgLy8gaW4ge0FTU0VSVHxFWFBFQ1R9X0VRIHdoZW4gY29tcGlsZWQgd2l0aCBnY2MgNCwgYXMgYW5vbnltb3VzCisgIC8vIGVudW1zIGNhbiBiZSBpbXBsaWNpdGx5IGNhc3QgdG8gQmlnZ2VzdEludC4KKyAgLy8KKyAgLy8gRXZlbiB0aG91Z2ggaXRzIGJvZHkgbG9va3MgdGhlIHNhbWUgYXMgdGhlIGFib3ZlIHZlcnNpb24sIHdlCisgIC8vIGNhbm5vdCBtZXJnZSB0aGUgdHdvLCBhcyBpdCB3aWxsIG1ha2UgYW5vbnltb3VzIGVudW1zIHVuaGFwcHkuCisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpIHsKKyAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICB9Cit9OworCisvLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkKKy8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwsIGxpa2UgTlVMTCwgZmFsc2UsIG9yIDAuCit0ZW1wbGF0ZSA8PgorY2xhc3MgRXFIZWxwZXI8dHJ1ZT4geworIHB1YmxpYzoKKyAgLy8gV2UgZGVmaW5lIHR3byBvdmVybG9hZGVkIHZlcnNpb25zIG9mIENvbXBhcmUoKS4gIFRoZSBmaXJzdAorICAvLyB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKSBpcworICAvLyBOT1QgYSBwb2ludGVyLCBlLmcuIEFTU0VSVF9FUSgwLCBBbkludEZ1bmN0aW9uKCkpIG9yCisgIC8vIEVYUEVDVF9FUShmYWxzZSwgYV9ib29sKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKAorICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgY29uc3QgVDImIGFjdHVhbCwKKyAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBwcmV2ZW50cyB0aGlzIG92ZXJsb2FkIGZyb20gYmVpbmcgY29uc2lkZXJlZCBpZiBUMgorICAgICAgLy8gaXMgbm90IGEgcG9pbnRlciB0eXBlLiAgV2UgbmVlZCB0aGlzIGJlY2F1c2UgQVNTRVJUX0VRKE5VTEwsIG15X3B0cikKKyAgICAgIC8vIGV4cGFuZHMgdG8gQ29tcGFyZSgiIiwgIiIsIE5VTEwsIG15X3B0ciksIHdoaWNoIHJlcXVpcmVzIGEgY29udmVyc2lvbgorICAgICAgLy8gdG8gbWF0Y2ggdGhlIFNlY3JldCogaW4gdGhlIG90aGVyIG92ZXJsb2FkLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgbWFrZQorICAgICAgLy8gdGhpcyB0ZW1wbGF0ZSBtYXRjaCBiZXR0ZXIuCisgICAgICB0eXBlbmFtZSBFbmFibGVJZjwhaXNfcG9pbnRlcjxUMj46OnZhbHVlPjo6dHlwZSogPSAwKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorCisgIC8vIFRoaXMgdmVyc2lvbiB3aWxsIGJlIHBpY2tlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkgaXMgYQorICAvLyBwb2ludGVyLCBlLmcuIEFTU0VSVF9FUShOVUxMLCBhX3BvaW50ZXIpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKAorICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgLy8gV2UgdXNlZCB0byBoYXZlIGEgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciBpbnN0ZWFkIG9mIFNlY3JldCouICBUaGF0CisgICAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd291bGQgZGVkdWNlIHRvICdsb25nJywgbWFraW5nIHRoaXMgYSBiZXR0ZXIgbWF0Y2gKKyAgICAgIC8vIHRoYW4gdGhlIGZpcnN0IG92ZXJsb2FkIGV2ZW4gd2l0aG91dCB0aGUgZmlyc3Qgb3ZlcmxvYWQncyBFbmFibGVJZi4KKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGdjYyB3aXRoIC1XY29udmVyc2lvbi1udWxsIHdhcm5zIHdoZW4gInBhc3NpbmcgTlVMTCB0bworICAgICAgLy8gbm9uLXBvaW50ZXIgYXJndW1lbnQiIChldmVuIGEgZGVkdWNlZCBpbnRlZ3JhbCBhcmd1bWVudCksIHNvIHRoZSBvbGQKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGNhdXNlZCB3YXJuaW5ncyBpbiB1c2VyIGNvZGUuCisgICAgICBTZWNyZXQqIC8qIGV4cGVjdGVkIChOVUxMKSAqLywKKyAgICAgIFQqIGFjdHVhbCkgeworICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGF0ICdleHBlY3RlZCcgaXMgYSBudWxsIHBvaW50ZXIuCisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUKj4oTlVMTCksIGFjdHVhbCk7CisgIH0KK307CisKKy8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisvLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/Py4gIEl0IGlzIGhlcmUganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZQorLy8gb2Ygc2ltaWxhciBjb2RlLgorLy8KKy8vIEZvciBlYWNoIHRlbXBsYXRpemVkIGhlbHBlciBmdW5jdGlvbiwgd2UgYWxzbyBkZWZpbmUgYW4gb3ZlcmxvYWRlZAorLy8gdmVyc2lvbiBmb3IgQmlnZ2VzdEludCBpbiBvcmRlciB0byByZWR1Y2UgY29kZSBibG9hdCBhbmQgYWxsb3cKKy8vIGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkIHdpdGgge0FTU0VSVHxFWFBFQ1R9Xz8/IHdoZW4gY29tcGlsZWQKKy8vIHdpdGggZ2NjIDQuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+XAorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHZhbDEsIGNvbnN0IFQyJiB2YWwyKSB7XAorICBpZiAodmFsMSBvcCB2YWwyKSB7XAorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAorICB9IGVsc2Uge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIFwKKyAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAorICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKKyAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCisgIH1cCit9XAorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKFwKKyAgICBjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwgKTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdFLCA+PSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HVAorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApOworCisjdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpOworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZQorLy8gZmlyc3QgYXJndW1lbnQgdG8ge0VYUEVDVCxBU1NFUlR9X1BSRURfRk9STUFUMigpLCBub3QgYnkKKy8vIHRoZW1zZWx2ZXMuICBUaGV5IGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrCisvLyAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZiBvbmx5KSwgYW5kIHJldHVybiBhbgorLy8gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKy8vCisvLyBUaGUge25lZWRsZSxoYXlzdGFja31fZXhwciBhcmd1bWVudHMgYXJlIHRoZSBzdHJpbmdpZmllZAorLy8gZXhwcmVzc2lvbnMgdGhhdCBnZW5lcmF0ZWQgdGhlIHR3byByZWFsIGFyZ3VtZW50cy4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKTsKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBIZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludHMuCisvLworLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgorLy8KKy8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckZsb2F0aW5nUG9pbnRFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBhY3R1YWwpIHsKKyAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHMoZXhwZWN0ZWQpLCByaHMoYWN0dWFsKTsKKworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWRfc3M7CisgIGV4cGVjdGVkX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICAgICAgPDwgZXhwZWN0ZWQ7CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBhY3R1YWxfc3M7CisgIGFjdHVhbF9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgICA8PCBhY3R1YWw7CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZleHBlY3RlZF9zcyksCisgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJmFjdHVhbF9zcyksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcik7CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLyBBIGNsYXNzIHRoYXQgZW5hYmxlcyBvbmUgdG8gc3RyZWFtIG1lc3NhZ2VzIHRvIGFzc2VydGlvbiBtYWNyb3MKK2NsYXNzIEdURVNUX0FQSV8gQXNzZXJ0SGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICBBc3NlcnRIZWxwZXIoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICBpbnQgbGluZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICB+QXNzZXJ0SGVscGVyKCk7CisKKyAgLy8gTWVzc2FnZSBhc3NpZ25tZW50IGlzIGEgc2VtYW50aWMgdHJpY2sgdG8gZW5hYmxlIGFzc2VydGlvbgorICAvLyBzdHJlYW1pbmc7IHNlZSB0aGUgR1RFU1RfTUVTU0FHRV8gbWFjcm8gYmVsb3cuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gV2UgcHV0IG91ciBkYXRhIGluIGEgc3RydWN0IHNvIHRoYXQgdGhlIHNpemUgb2YgdGhlIEFzc2VydEhlbHBlciBjbGFzcyBjYW4KKyAgLy8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGdjYyBpcyBpbmNhcGFibGUgb2YKKyAgLy8gcmUtdXNpbmcgc3RhY2sgc3BhY2UgZXZlbiBmb3IgdGVtcG9yYXJ5IHZhcmlhYmxlcywgc28gZXZlcnkgRVhQRUNUX0VRCisgIC8vIHJlc2VydmVzIHN0YWNrIHNwYWNlIGZvciBhbm90aGVyIEFzc2VydEhlbHBlci4KKyAgc3RydWN0IEFzc2VydEhlbHBlckRhdGEgeworICAgIEFzc2VydEhlbHBlckRhdGEoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2cpCisgICAgICAgIDogdHlwZSh0KSwgZmlsZShzcmNmaWxlKSwgbGluZShsaW5lX251bSksIG1lc3NhZ2UobXNnKSB7IH0KKworICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGNvbnN0IHR5cGU7CisgICAgY29uc3QgY2hhciogICAgICAgIGNvbnN0IGZpbGU7CisgICAgaW50ICAgICAgICAgICAgICAgIGNvbnN0IGxpbmU7CisgICAgU3RyaW5nICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2U7CisKKyAgIHByaXZhdGU6CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXJEYXRhKTsKKyAgfTsKKworICBBc3NlcnRIZWxwZXJEYXRhKiBjb25zdCBkYXRhXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFzc2VydEhlbHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisvLyBUaGUgcHVyZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBhbGwgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLyBBIHZhbHVlLXBhcmFtZXRlcml6ZWQgY2xhc3MgbXVzdCBpbmhlcml0IGZyb20gYm90aCA6OnRlc3Rpbmc6OlRlc3QgYW5kCisvLyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9zdCBjYXNlcyB0aGF0IGp1c3QgbWVhbnMgaW5oZXJpdGluZworLy8gZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0sIGJ1dCBtb3JlIGNvbXBsaWNhdGVkIHRlc3QgaGllcmFyY2hpZXMKKy8vIG1heSBuZWVkIHRvIGluaGVyaXQgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UgYXQgZGlmZmVyZW50IGxldmVscy4KKy8vCisvLyBUaGlzIGludGVyZmFjZSBoYXMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSB0ZXN0IHBhcmFtZXRlciB2YWx1ZSB2aWEKKy8vIHRoZSBHZXRQYXJhbSgpIG1ldGhvZC4KKy8vCisvLyBVc2UgaXQgd2l0aCBvbmUgb2YgdGhlIHBhcmFtZXRlciBnZW5lcmF0b3IgZGVmaW5pbmcgZnVuY3Rpb25zLCBsaWtlIFJhbmdlKCksCisvLyBWYWx1ZXMoKSwgVmFsdWVzSW4oKSwgQm9vbCgpLCBhbmQgQ29tYmluZSgpLgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4geworLy8gIHByb3RlY3RlZDoKKy8vICAgRm9vVGVzdCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIH5Gb29UZXN0KCkgeworLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgorLy8gICB9CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIHZvaWQgVGVhckRvd24geworLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgorLy8gICB9CisvLyB9OworLy8gVEVTVF9QKEZvb1Rlc3QsIERvZXNCYXIpIHsKKy8vICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIG1ldGhvZCBoZXJlLgorLy8gICBGb28gZm9vOworLy8gICBBU1NFUlRfVFJVRShmb28uRG9lc0JhcihHZXRQYXJhbSgpKSk7CisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChPbmVUb1RlblJhbmdlLCBGb29UZXN0LCA6OnRlc3Rpbmc6OlJhbmdlKDEsIDEwKSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgV2l0aFBhcmFtSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBQYXJhbVR5cGU7CisgIHZpcnR1YWwgfldpdGhQYXJhbUludGVyZmFjZSgpIHt9CisKKyAgLy8gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHZhbHVlLiBJcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgdGVzdCBmaXh0dXJlJ3MKKyAgLy8gY29uc3RydWN0b3IuIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIG5vbi1zdGF0aWMsIGV2ZW4gdGhvdWdoIGl0IG9ubHkKKyAgLy8gcmVmZXJlbmNlcyBzdGF0aWMgZGF0YSwgdG8gcmVkdWNlIHRoZSBvcHBvcnR1bml0eSBmb3IgaW5jb3JyZWN0IHVzZXMKKyAgLy8gbGlrZSB3cml0aW5nICdXaXRoUGFyYW1JbnRlcmZhY2U8Ym9vbD46OkdldFBhcmFtKCknIGZvciBhIHRlc3QgdGhhdAorICAvLyB1c2VzIGEgZml4dHVyZSB3aG9zZSBwYXJhbWV0ZXIgdHlwZSBpcyBpbnQuCisgIGNvbnN0IFBhcmFtVHlwZSYgR2V0UGFyYW0oKSBjb25zdCB7IHJldHVybiAqcGFyYW1ldGVyXzsgfQorCisgcHJpdmF0ZToKKyAgLy8gU2V0cyBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIHRoZSB2YWx1ZQorICAvLyByZW1haW5zIGFsaXZlIGFuZCB1bmNoYW5nZWQgdGhyb3VnaG91dCB0aGUgY3VycmVudCB0ZXN0LgorICBzdGF0aWMgdm9pZCBTZXRQYXJhbShjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcikgeworICAgIHBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7CisgIH0KKworICAvLyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgYWNjZXNzaW5nIHBhcmFtZXRlciBkdXJpbmcgYSB0ZXN0IGxpZmV0aW1lLgorICBzdGF0aWMgY29uc3QgUGFyYW1UeXBlKiBwYXJhbWV0ZXJfOworCisgIC8vIFRlc3RDbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IGFuZCBUZXN0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPiBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY29uc3QgVCogV2l0aFBhcmFtSW50ZXJmYWNlPFQ+OjpwYXJhbWV0ZXJfID0gTlVMTDsKKworLy8gTW9zdCB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzZXMgY2FuIGlnbm9yZSB0aGUgZXhpc3RlbmNlIG9mCisvLyBXaXRoUGFyYW1JbnRlcmZhY2UsIGFuZCBjYW4ganVzdCBpbmhlcml0IGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRlc3RXaXRoUGFyYW0gOiBwdWJsaWMgVGVzdCwgcHVibGljIFdpdGhQYXJhbUludGVyZmFjZTxUPiB7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIE1hY3JvcyBmb3IgaW5kaWNhdGluZyBzdWNjZXNzL2ZhaWx1cmUgaW4gdGVzdCBjb2RlLgorCisvLyBBRERfRkFJTFVSRSB1bmNvbmRpdGlvbmFsbHkgYWRkcyBhIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4KKy8vIFNVQ0NFRUQgZ2VuZXJhdGVzIGEgc3VjY2VzcyAtIGl0IGRvZXNuJ3QgYXV0b21hdGljYWxseSBtYWtlIHRoZQorLy8gY3VycmVudCB0ZXN0IHN1Y2Nlc3NmdWwsIGFzIGEgdGVzdCBpcyBvbmx5IHN1Y2Nlc3NmdWwgd2hlbiBpdCBoYXMKKy8vIG5vIGZhaWx1cmUuCisvLworLy8gRVhQRUNUXyogdmVyaWZpZXMgdGhhdCBhIGNlcnRhaW4gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4gIElmIG5vdCwKKy8vIGl0IGJlaGF2ZXMgbGlrZSBBRERfRkFJTFVSRS4gIEluIHBhcnRpY3VsYXI6CisvLworLy8gICBFWFBFQ1RfVFJVRSAgdmVyaWZpZXMgdGhhdCBhIEJvb2xlYW4gY29uZGl0aW9uIGlzIHRydWUuCisvLyAgIEVYUEVDVF9GQUxTRSB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgZmFsc2UuCisvLworLy8gRkFJTCBhbmQgQVNTRVJUXyogYXJlIHNpbWlsYXIgdG8gQUREX0ZBSUxVUkUgYW5kIEVYUEVDVF8qLCBleGNlcHQKKy8vIHRoYXQgdGhleSB3aWxsIGFsc28gYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb24gZmFpbHVyZS4gIFBlb3BsZQorLy8gdXN1YWxseSB3YW50IHRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgRkFJTCBhbmQgQVNTRVJUXyosIGJ1dCB0aG9zZQorLy8gd3JpdGluZyBkYXRhLWRyaXZlbiB0ZXN0cyBvZnRlbiBmaW5kIHRoZW1zZWx2ZXMgdXNpbmcgQUREX0ZBSUxVUkUKKy8vIGFuZCBFWFBFQ1RfKiBtb3JlLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vICAgRVhQRUNUX1RSVUUoc2VydmVyLlN0YXR1c0lzT0soKSk7CisvLyAgIEFTU0VSVF9GQUxTRShzZXJ2ZXIuSGFzUGVuZGluZ1JlcXVlc3QocG9ydCkpCisvLyAgICAgICA8PCAiVGhlcmUgYXJlIHN0aWxsIHBlbmRpbmcgcmVxdWVzdHMgIiA8PCAib24gcG9ydCAiIDw8IHBvcnQ7CisKKy8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgQUREX0ZBSUxVUkUoKSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXygiRmFpbGVkIikKKworLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gd2l0aAorLy8gYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIFwKKyAgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgIkZhaWxlZCIsIFwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKKworLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9GQUlMKCkgR1RFU1RfRkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBGQUlMKCksIHdoaWNoIGlzIGEKKy8vIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9GQUlMCisjIGRlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpCisjZW5kaWYKKworLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9TVUNDRUVEKCkgR1RFU1RfU1VDQ0VTU18oIlN1Y2NlZWRlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9TVUNDRUVECisjIGRlZmluZSBTVUNDRUVEKCkgR1RFU1RfU1VDQ0VFRCgpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGV4Y2VwdGlvbnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24uCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9OT19USFJPVyhzdGF0ZW1lbnQpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgZG9lc24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fQU5ZX1RIUk9XKHN0YXRlbWVudCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorCisjZGVmaW5lIEVYUEVDVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKy8vIEJvb2xlYW4gYXNzZXJ0aW9ucy4gQ29uZGl0aW9uIGNhbiBiZSBlaXRoZXIgYSBCb29sZWFuIGV4cHJlc3Npb24gb3IgYW4KKy8vIEFzc2VydGlvblJlc3VsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBBc3NlcnRpb25SZXN1bHQgd2l0aAorLy8gdGhlc2UgbWFjcm9zIHNlZSBjb21tZW50cyBvbiB0aGF0IGNsYXNzLgorI2RlZmluZSBFWFBFQ1RfVFJVRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyhjb25kaXRpb24sICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9GQUxTRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9UUlVFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0ZBTFNFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gSW5jbHVkZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGhlYWRlciB0aGF0IGltcGxlbWVudHMgYSBmYW1pbHkgb2YKKy8vIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgiCisKKy8vIE1hY3JvcyBmb3IgdGVzdGluZyBlcXVhbGl0aWVzIGFuZCBpbmVxdWFsaXRpZXMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRVEoZXhwZWN0ZWQsIGFjdHVhbCk6IFRlc3RzIHRoYXQgZXhwZWN0ZWQgPT0gYWN0dWFsCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSAhPSB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTFQodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPCB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTEUodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPD0gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID4gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dFKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID49IHYyCisvLworLy8gV2hlbiB0aGV5IGFyZSBub3QsIEdvb2dsZSBUZXN0IHByaW50cyBib3RoIHRoZSB0ZXN0ZWQgZXhwcmVzc2lvbnMgYW5kCisvLyB0aGVpciBhY3R1YWwgdmFsdWVzLiAgVGhlIHZhbHVlcyBtdXN0IGJlIGNvbXBhdGlibGUgYnVpbHQtaW4gdHlwZXMsCisvLyBvciB5b3Ugd2lsbCBnZXQgYSBjb21waWxlciBlcnJvci4gIEJ5ICJjb21wYXRpYmxlIiB3ZSBtZWFuIHRoYXQgdGhlCisvLyB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIGJ5IHRoZSByZXNwZWN0aXZlIG9wZXJhdG9yLgorLy8KKy8vIE5vdGU6CisvLworLy8gICAxLiBJdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgdXNlci1kZWZpbmVkIHR5cGUgd29yayB3aXRoCisvLyAgIHtBU1NFUlR8RVhQRUNUfV8/PygpLCBidXQgdGhhdCByZXF1aXJlcyBvdmVybG9hZGluZyB0aGUKKy8vICAgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIGlzIHRodXMgZGlzY291cmFnZWQgYnkgdGhlIEdvb2dsZSBDKysKKy8vICAgVXNhZ2UgR3VpZGUuICBUaGVyZWZvcmUsIHlvdSBhcmUgYWR2aXNlZCB0byB1c2UgdGhlCisvLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKCkgbWFjcm8gdG8gYXNzZXJ0IHRoYXQgdHdvIG9iamVjdHMgYXJlCisvLyAgIGVxdWFsLgorLy8KKy8vICAgMi4gVGhlIHtBU1NFUlR8RVhQRUNUfV8/PygpIG1hY3JvcyBkbyBwb2ludGVyIGNvbXBhcmlzb25zIG9uCisvLyAgIHBvaW50ZXJzIChpbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MpLiAgVGhlcmVmb3JlLCBpZiB5b3UgdXNlIGl0CisvLyAgIHdpdGggdHdvIEMgc3RyaW5ncywgeW91IGFyZSB0ZXN0aW5nIGhvdyB0aGVpciBsb2NhdGlvbnMgaW4gbWVtb3J5CisvLyAgIGFyZSByZWxhdGVkLCBub3QgaG93IHRoZWlyIGNvbnRlbnQgaXMgcmVsYXRlZC4gIFRvIGNvbXBhcmUgdHdvIEMKKy8vICAgc3RyaW5ncyBieSBjb250ZW50LCB1c2Uge0FTU0VSVHxFWFBFQ1R9X1NUUiooKS4KKy8vCisvLyAgIDMuIHtBU1NFUlR8RVhQRUNUfV9FUShleHBlY3RlZCwgYWN0dWFsKSBpcyBwcmVmZXJyZWQgdG8KKy8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoZXhwZWN0ZWQgPT0gYWN0dWFsKSwgYXMgdGhlIGZvcm1lciB0ZWxscyB5b3UKKy8vICAgd2hhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIHdoZW4gaXQgZmFpbHMsIGFuZCBzaW1pbGFybHkgZm9yIHRoZQorLy8gICBvdGhlciBjb21wYXJpc29ucy4KKy8vCisvLyAgIDQuIERvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHtBU1NFUlR8RVhQRUNUfV8/PygpCisvLyAgIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cywgd2hpY2ggaXMgdW5kZWZpbmVkLgorLy8KKy8vICAgNS4gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTkUoNSwgRm9vKCkpOworLy8gICBFWFBFQ1RfRVEoTlVMTCwgYV9wb2ludGVyKTsKKy8vICAgQVNTRVJUX0xUKGksIGFycmF5X3NpemUpOworLy8gICBBU1NFUlRfR1QocmVjb3Jkcy5zaXplKCksIDApIDw8ICJUaGVyZSBpcyBubyByZWNvcmQgbGVmdC4iOworCisjZGVmaW5lIEVYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKKyAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfTkUoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfTEUodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfTFQodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfR0UodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfR1QodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQorCisjZGVmaW5lIEdURVNUX0FTU0VSVF9FUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKKyAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTEUodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfR1QodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQorCisvLyBEZWZpbmUgbWFjcm8gR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX1hZIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZgorLy8gQVNTRVJUX1hZKCksIHdoaWNoIGNsYXNoZXMgd2l0aCBzb21lIHVzZXJzJyBvd24gY29kZS4KKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfRVEKKyMgZGVmaW5lIEFTU0VSVF9FUSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfRVEodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9ORQorIyBkZWZpbmUgQVNTRVJUX05FKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xFCisjIGRlZmluZSBBU1NFUlRfTEUodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTFQKKyMgZGVmaW5lIEFTU0VSVF9MVCh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HRQorIyBkZWZpbmUgQVNTRVJUX0dFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dUCisjIGRlZmluZSBBU1NFUlRfR1QodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpCisjZW5kaWYKKworLy8gQyBTdHJpbmcgQ29tcGFyaXNvbnMuICBBbGwgdGVzdHMgdHJlYXQgTlVMTCBhbmQgYW55IG5vbi1OVUxMIHN0cmluZworLy8gYXMgZGlmZmVyZW50LiAgVHdvIE5VTExzIGFyZSBlcXVhbC4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJFUShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSA9PSBzMgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSTkUoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgIT0gczIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUShzMSwgczIpOiBUZXN0cyB0aGF0IHMxID09IHMyLCBpZ25vcmluZyBjYXNlCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUoczEsIHMyKTogVGVzdHMgdGhhdCBzMSAhPSBzMiwgaWdub3JpbmcgY2FzZQorLy8KKy8vIEZvciB3aWRlIG9yIG5hcnJvdyBzdHJpbmcgb2JqZWN0cywgeW91IGNhbiB1c2UgdGhlCisvLyB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MuCisvLworLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQsCisvLyB3aGljaCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisKKyNkZWZpbmUgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX1NUUk5FKHMxLCBzMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpCisjZGVmaW5lIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX1NUUkNBU0VORShzMSwgczIpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VORSwgczEsIHMyKQorCisjZGVmaW5lIEFTU0VSVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9TVFJORShzMSwgczIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQorI2RlZmluZSBBU1NFUlRfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9TVFJDQVNFTkUoczEsIHMyKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKKworLy8gTWFjcm9zIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0d28gZmxvYXQgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGRvdWJsZSB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbC4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FQVIodjEsIHYyLCBhYnNfZXJyb3IpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHYxIGFuZCB2MiBhcmUgd2l0aGluIHRoZSBnaXZlbiBkaXN0YW5jZSB0byBlYWNoIG90aGVyLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgVUxQLWJhc2VkIGNvbXBhcmlzb24gdG8gYXV0b21hdGljYWxseSBwaWNrIGEgZGVmYXVsdAorLy8gZXJyb3IgYm91bmQgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG9wZXJhbmRzLiAgU2VlIHRoZQorLy8gRmxvYXRpbmdQb2ludCB0ZW1wbGF0ZSBjbGFzcyBpbiBndGVzdC1pbnRlcm5hbC5oIGlmIHlvdSBhcmUKKy8vIGludGVyZXN0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKKyNkZWZpbmUgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxmbG9hdD4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEVYUEVDVF9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEFTU0VSVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBBU1NFUlRfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBFWFBFQ1RfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQorCisjZGVmaW5lIEFTU0VSVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RG91YmxlTmVhclByZWRGb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCBhYnNfZXJyb3IpCisKKy8vIFRoZXNlIHByZWRpY2F0ZSBmb3JtYXQgZnVuY3Rpb25zIHdvcmsgb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLCBhbmQKKy8vIGNhbiBiZSB1c2VkIGluIHtBU1NFUlR8RVhQRUNUfV9QUkVEX0ZPUk1BVDIqKCksIGUuZy4KKy8vCisvLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6RG91YmxlTEUsIEZvbygpLCA1LjApOworCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMik7CisKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gTWFjcm9zIHRoYXQgdGVzdCBmb3IgSFJFU1VMVCBmYWlsdXJlIGFuZCBzdWNjZXNzLCB0aGVzZSBhcmUgb25seSB1c2VmdWwKKy8vIG9uIFdpbmRvd3MsIGFuZCByZWx5IG9uIFdpbmRvd3MgU0RLIG1hY3JvcyBhbmQgQVBJcyB0byBjb21waWxlLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9KGV4cHIpCisvLworLy8gV2hlbiBleHByIHVuZXhwZWN0ZWRseSBmYWlscyBvciBzdWNjZWVkcywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZQorLy8gZXhwZWN0ZWQgcmVzdWx0IGFuZCB0aGUgYWN0dWFsIHJlc3VsdCB3aXRoIGJvdGggYSBodW1hbi1yZWFkYWJsZQorLy8gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZQorLy8gaGV4IHJlc3VsdCBjb2RlLgorIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IGV4ZWN1dGUgc3RhdGVtZW50IGFuZCBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsCisvLyBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuCisvLworLy8gICAqIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCk7CisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpOworLy8gICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpIDw8ICJQcm9jZXNzKCkgZmFpbGVkIjsKKy8vCisjZGVmaW5lIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAorICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcCisgICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBDYXVzZXMgYSB0cmFjZSAoaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZSBwYXRoLCB0aGUgY3VycmVudCBsaW5lCisvLyBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4gbWVzc2FnZSkgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgdGVzdCBmYWlsdXJlCisvLyBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb2RlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlIGVmZmVjdCBpcworLy8gdW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IHNjb3BlLgorLy8KKy8vIFRoZSBtZXNzYWdlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYXMgcGFydAorLy8gb2YgdGhlIGR1bW15IHZhcmlhYmxlIG5hbWUsIHRodXMgYWxsb3dpbmcgbXVsdGlwbGUgU0NPUEVEX1RSQUNFKClzCisvLyB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2sgLSBhcyBsb25nIGFzIHRoZXkgYXJlIG9uIGRpZmZlcmVudAorLy8gbGluZXMuCisjZGVmaW5lIFNDT1BFRF9UUkFDRShtZXNzYWdlKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNjb3BlZFRyYWNlIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfdHJhY2VfLCBfX0xJTkVfXykoXAorICAgIF9fRklMRV9fLCBfX0xJTkVfXywgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgKG1lc3NhZ2UpKQorCisvLyBDb21waWxlLXRpbWUgYXNzZXJ0aW9uIGZvciB0eXBlIGVxdWFsaXR5LgorLy8gU3RhdGljQXNzZXJ0VHlwZUVxPHR5cGUxLCB0eXBlMj4oKSBjb21waWxlcyBpZmYgdHlwZTEgYW5kIHR5cGUyIGFyZQorLy8gdGhlIHNhbWUgdHlwZS4gIFRoZSB2YWx1ZSBpdCByZXR1cm5zIGlzIG5vdCBpbnRlcmVzdGluZy4KKy8vCisvLyBJbnN0ZWFkIG9mIG1ha2luZyBTdGF0aWNBc3NlcnRUeXBlRXEgYSBjbGFzcyB0ZW1wbGF0ZSwgd2UgbWFrZSBpdCBhCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGludm9rZXMgYSBoZWxwZXIgY2xhc3MgdGVtcGxhdGUuICBUaGlzCisvLyBwcmV2ZW50cyBhIHVzZXIgZnJvbSBtaXN1c2luZyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPiBieQorLy8gZGVmaW5pbmcgb2JqZWN0cyBvZiB0aGF0IHR5cGUuCisvLworLy8gQ0FWRUFUOgorLy8KKy8vIFdoZW4gdXNlZCBpbnNpZGUgYSBtZXRob2Qgb2YgYSBjbGFzcyB0ZW1wbGF0ZSwKKy8vIFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KCkgaXMgZWZmZWN0aXZlIE9OTFkgSUYgdGhlIG1ldGhvZCBpcworLy8gaW5zdGFudGlhdGVkLiAgRm9yIGV4YW1wbGUsIGdpdmVuOgorLy8KKy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdm9pZCBCYXIoKSB7IHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIFQ+KCk7IH0KKy8vICAgfTsKKy8vCisvLyB0aGUgY29kZToKKy8vCisvLyAgIHZvaWQgVGVzdDEoKSB7IEZvbzxib29sPiBmb287IH0KKy8vCisvLyB3aWxsIE5PVCBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yLCBhcyBGb288Ym9vbD46OkJhcigpIGlzIG5ldmVyCisvLyBhY3R1YWxseSBpbnN0YW50aWF0ZWQuICBJbnN0ZWFkLCB5b3UgbmVlZDoKKy8vCisvLyAgIHZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQorLy8KKy8vIHRvIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBTdGF0aWNBc3NlcnRUeXBlRXEoKSB7CisgICh2b2lkKWludGVybmFsOjpTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VDEsIFQyPigpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGVmaW5lcyBhIHRlc3QuCisvLworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBhbmQgdGhlIHNlY29uZAorLy8gcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgorLy8KKy8vIFRoZSBjb252ZW50aW9uIGlzIHRvIGVuZCB0aGUgdGVzdCBjYXNlIG5hbWUgd2l0aCAiVGVzdCIuICBGb3IKKy8vIGV4YW1wbGUsIGEgdGVzdCBjYXNlIGZvciB0aGUgRm9vIGNsYXNzIGNhbiBiZSBuYW1lZCBGb29UZXN0LgorLy8KKy8vIFRoZSB1c2VyIHNob3VsZCBwdXQgaGlzIHRlc3QgY29kZSBiZXR3ZWVuIGJyYWNlcyBhZnRlciB1c2luZyB0aGlzCisvLyBtYWNyby4gIEV4YW1wbGU6CisvLworLy8gICBURVNUKEZvb1Rlc3QsIEluaXRpYWxpemVzQ29ycmVjdGx5KSB7CisvLyAgICAgRm9vIGZvbzsKKy8vICAgICBFWFBFQ1RfVFJVRShmb28uU3RhdHVzSXNPSygpKTsKKy8vICAgfQorCisvLyBOb3RlIHRoYXQgd2UgY2FsbCBHZXRUZXN0VHlwZUlkKCkgaW5zdGVhZCBvZiBHZXRUeXBlSWQ8CisvLyA6OnRlc3Rpbmc6OlRlc3Q+KCkgaGVyZSB0byBnZXQgdGhlIHR5cGUgSUQgb2YgdGVzdGluZzo6VGVzdC4gIFRoaXMKKy8vIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbiB1c2luZyBHb29nbGUgVGVzdCBhcworLy8gYSBmcmFtZXdvcmsgb24gTWFjIE9TIFguICBUaGUgYnVnIGNhdXNlcyBHZXRUeXBlSWQ8CisvLyA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKy8vIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IgZnJvbSB1c2VyIHRlc3QKKy8vIGNvZGUuICBHZXRUZXN0VHlwZUlkKCkgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lCisvLyB2YWx1ZSwgYXMgaXQgYWx3YXlzIGNhbGxzIEdldFR5cGVJZDw+KCkgZnJvbSB0aGUgR29vZ2xlIFRlc3QKKy8vIGZyYW1ld29yay4KKyNkZWZpbmUgR1RFU1RfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKKyAgR1RFU1RfVEVTVF8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlRlc3QsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKSkKKworLy8gRGVmaW5lIHRoaXMgbWFjcm8gdG8gMSB0byBvbWl0IHRoZSBkZWZpbml0aW9uIG9mIFRFU1QoKSwgd2hpY2gKKy8vIGlzIGEgZ2VuZXJpYyBuYW1lIGFuZCBjbGFzaGVzIHdpdGggc29tZSBvdGhlciBsaWJyYXJpZXMuCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX1RFU1QKKyMgZGVmaW5lIFRFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgR1RFU1RfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKQorI2VuZGlmCisKKy8vIERlZmluZXMgYSB0ZXN0IHRoYXQgdXNlcyBhIHRlc3QgZml4dHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MsIHdoaWNoCisvLyBhbHNvIGRvdWJsZXMgYXMgdGhlIHRlc3QgY2FzZSBuYW1lLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlCisvLyBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgorLy8KKy8vIEEgdGVzdCBmaXh0dXJlIGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgZWFybGllci4gIFRoZSB1c2VyIHNob3VsZCBwdXQKKy8vIGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcyBtYWNyby4gIEV4YW1wbGU6CisvLworLy8gICBjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworLy8gICAgcHJvdGVjdGVkOgorLy8gICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgYl8uQWRkRWxlbWVudCgzKTsgfQorLy8KKy8vICAgICBGb28gYV87CisvLyAgICAgRm9vIGJfOworLy8gICB9OworLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEluaXRpYWxpemVzQ29ycmVjdGx5KSB7CisvLyAgICAgRVhQRUNUX1RSVUUoYV8uU3RhdHVzSXNPSygpKTsKKy8vICAgfQorLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIFJldHVybnNFbGVtZW50Q291bnRDb3JyZWN0bHkpIHsKKy8vICAgICBFWFBFQ1RfRVEoMCwgYV8uc2l6ZSgpKTsKKy8vICAgICBFWFBFQ1RfRVEoMSwgYl8uc2l6ZSgpKTsKKy8vICAgfQorCisjZGVmaW5lIFRFU1RfRih0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lLCB0ZXN0X2ZpeHR1cmUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VHlwZUlkPHRlc3RfZml4dHVyZT4oKSkKKworLy8gVXNlIHRoaXMgbWFjcm8gaW4gbWFpbigpIHRvIHJ1biBhbGwgdGVzdHMuICBJdCByZXR1cm5zIDAgaWYgYWxsCisvLyB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gUlVOX0FMTF9URVNUUygpIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgaGFzIGJlZW4KKy8vIHBhcnNlZCBieSBJbml0R29vZ2xlVGVzdCgpLgorCisjZGVmaW5lIFJVTl9BTExfVEVTVFMoKVwKKyAgKDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJ1bigpKQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwNWY4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oCkBAIC0wLDAgKzEsMzU4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAwOS8yNC8yMDEwIGJ5IGNvbW1hbmQKKy8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyMgZXJyb3IgRG8gbm90IGluY2x1ZGUgZ3Rlc3RfcHJlZF9pbXBsLmggZGlyZWN0bHkuICBJbmNsdWRlIGd0ZXN0LmggaW5zdGVhZC4KKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbgorLy8gbWFjcm9zOgorLy8KKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlCisvLyBjYXNlIG9mIEFTU0VSVF9QUkVEX0ZPUk1BVG4pIHZhbHVlcyBhbmQgdGhlaXIgc291cmNlIGV4cHJlc3Npb24KKy8vIHRleHQsIGFuZCByZXR1cm5zIGEgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LiAgU2VlIHRoZSBkZWZpbml0aW9uCisvLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4KKy8vCisvLyBJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBmb3JtYXR0aW5nLCB5b3UgY2FuIHVzZSB0aGUgbW9yZQorLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoKKy8vCisvLyAgIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkKKy8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLAorLy8gYW5kIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4sIG11c3Qgc3VwcG9ydCB0aGUgPDwgb3BlcmF0b3IgZm9yCisvLyBzdHJlYW1pbmcgdG8gc3RkOjpvc3RyZWFtLgorLy8KKy8vIFdlIGFsc28gZGVmaW5lIHRoZSBFWFBFQ1RfKiB2YXJpYXRpb25zLgorLy8KKy8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCA1LgorLy8gUGxlYXNlIGVtYWlsIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAorLy8gc3VwcG9ydCBmb3IgaGlnaGVyIGFyaXRpZXMuCisKKy8vIEdURVNUX0FTU0VSVF8gaXMgdGhlIGJhc2ljIHN0YXRlbWVudCB0byB3aGljaCBhbGwgb2YgdGhlIGFzc2VydGlvbnMKKy8vIGluIHRoaXMgZmlsZSByZWR1Y2UuICBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisKKyNkZWZpbmUgR1RFU1RfQVNTRVJUXyhleHByZXNzaW9uLCBvbl9mYWlsdXJlKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQxSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSB7CisgIGlmIChwcmVkKHYxKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCB2MSksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQxSGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxKSwgb25fZmFpbHVyZSkKKworLy8gVW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCisgIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQxKHByZWQsIHYxKSBcCisgIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCisgIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQxKHByZWQsIHYxKSBcCisgIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDJIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7CisgIGlmIChwcmVkKHYxLCB2MikpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDIuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2Miwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsIHYxLCB2MiksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2Miwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMkhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiksIG9uX2ZhaWx1cmUpCisKKy8vIEJpbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQzLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQzSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIHsKKyAgaWYgKHByZWQodjEsIHYyLCB2MykpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MzsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQzLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCB2MSwgdjIsIHYzKSxcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkM0hlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MyksIG9uX2ZhaWx1cmUpCisKKy8vIFRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzLAorICAgICAgICAgIHR5cGVuYW1lIFQ0PgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ0SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NDsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCB2MSwgdjIsIHYzLCB2NCksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ0SGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0KSwgb25fZmFpbHVyZSkKKworLy8gNC1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDMsCisgICAgICAgICAgdHlwZW5hbWUgVDQsCisgICAgICAgICAgdHlwZW5hbWUgVDU+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDVIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0LCB2NSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTQgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU1IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNCA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY1OworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDUuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCAjdjUsIHYxLCB2MiwgdjMsIHY0LCB2NSksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNUhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NSksIG9uX2ZhaWx1cmUpCisKKy8vIDUtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4MGRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZGVmaW5pdGlvbnMgdXNlZnVsIGluIHByb2R1Y3Rpb24gY29kZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisKKy8vIFdoZW4geW91IG5lZWQgdG8gdGVzdCB0aGUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWVtYmVycyBvZiBhIGNsYXNzLAorLy8gdXNlIHRoZSBGUklFTkRfVEVTVCBtYWNybyB0byBkZWNsYXJlIHlvdXIgdGVzdHMgYXMgZnJpZW5kcyBvZiB0aGUKKy8vIGNsYXNzLiAgRm9yIGV4YW1wbGU6CisvLworLy8gY2xhc3MgTXlDbGFzcyB7CisvLyAgcHJpdmF0ZToKKy8vICAgdm9pZCBNeU1ldGhvZCgpOworLy8gICBGUklFTkRfVEVTVChNeUNsYXNzVGVzdCwgTXlNZXRob2QpOworLy8gfTsKKy8vCisvLyBjbGFzcyBNeUNsYXNzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgLy8gLi4uCisvLyB9OworLy8KKy8vIFRFU1RfRihNeUNsYXNzVGVzdCwgTXlNZXRob2QpIHsKKy8vICAgLy8gQ2FuIGNhbGwgTXlDbGFzczo6TXlNZXRob2QoKSBoZXJlLgorLy8gfQorCisjZGVmaW5lIEZSSUVORF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAorZnJpZW5kIGNsYXNzIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5ZjgzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaApAQCAtMCwwICsxLDMwOCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGludGVybmFsIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZworLy8gZGVhdGggdGVzdHMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworR1RFU1RfREVDTEFSRV9zdHJpbmdfKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKKworLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgorY29uc3QgY2hhciBrRGVhdGhUZXN0U3R5bGVGbGFnW10gPSAiZGVhdGhfdGVzdF9zdHlsZSI7Citjb25zdCBjaGFyIGtEZWF0aFRlc3RVc2VGb3JrW10gPSAiZGVhdGhfdGVzdF91c2VfZm9yayI7Citjb25zdCBjaGFyIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWdbXSA9ICJpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCI7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBEZWF0aFRlc3QgaXMgYSBjbGFzcyB0aGF0IGhpZGVzIG11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisvLyBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4gIEl0IGlzIGFic3RyYWN0OyBpdHMgc3RhdGljIENyZWF0ZSBtZXRob2QKKy8vIHJldHVybnMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlIHByZXZhaWxpbmcgZGVhdGggdGVzdAorLy8gc3R5bGUsIGFzIGRlZmluZWQgYnkgdGhlIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBhbmQvb3IKKy8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3MuCisKKy8vIEluIGRlc2NyaWJpbmcgdGhlIHJlc3VsdHMgb2YgZGVhdGggdGVzdHMsIHRoZXNlIHRlcm1zIGFyZSB1c2VkIHdpdGgKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb25zOgorLy8KKy8vIGV4aXQgc3RhdHVzOiAgVGhlIGludGVnZXIgZXhpdCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZAorLy8gICAgICAgICAgICAgICBieSB3YWl0KDIpCisvLyBleGl0IGNvZGU6ICAgIFRoZSBpbnRlZ2VyIGNvZGUgcGFzc2VkIHRvIGV4aXQoMyksIF9leGl0KDIpLCBvcgorLy8gICAgICAgICAgICAgICByZXR1cm5lZCBmcm9tIG1haW4oKQorY2xhc3MgR1RFU1RfQVBJXyBEZWF0aFRlc3QgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIHJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRldGVybWluaW5nIHRoZQorICAvLyBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gdGFrZSBmb3IgdGhlIGN1cnJlbnQgZGVhdGggdGVzdDsgZm9yIGV4YW1wbGUsCisgIC8vIGlmIHRoZSBndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCisgIC8vIFRoZSBMYXN0TWVzc2FnZSBtZXRob2Qgd2lsbCByZXR1cm4gYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgaW4gdGhhdAorICAvLyBjYXNlLiAgT3RoZXJ3aXNlLCB0aGUgRGVhdGhUZXN0IHBvaW50ZXIgcG9pbnRlZCB0byBieSB0aGUgInRlc3QiCisgIC8vIGFyZ3VtZW50IGlzIHNldC4gIElmIHRoZSBkZWF0aCB0ZXN0IHNob3VsZCBiZSBza2lwcGVkLCB0aGUgcG9pbnRlcgorICAvLyBpcyBzZXQgdG8gTlVMTDsgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcgY29uY3JldGUKKyAgLy8gRGVhdGhUZXN0IG9iamVjdCB0aGF0IGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworICBEZWF0aFRlc3QoKTsKKyAgdmlydHVhbCB+RGVhdGhUZXN0KCkgeyB9CisKKyAgLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhYm9ydHMgYSBkZWF0aCB0ZXN0IHdoZW4gaXQncyBkZWxldGVkLgorICBjbGFzcyBSZXR1cm5TZW50aW5lbCB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgUmV0dXJuU2VudGluZWwoRGVhdGhUZXN0KiB0ZXN0KSA6IHRlc3RfKHRlc3QpIHsgfQorICAgIH5SZXR1cm5TZW50aW5lbCgpIHsgdGVzdF8tPkFib3J0KFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCk7IH0KKyAgIHByaXZhdGU6CisgICAgRGVhdGhUZXN0KiBjb25zdCB0ZXN0XzsKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJldHVyblNlbnRpbmVsKTsKKyAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworICAvLyBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByb2xlcyB0aGF0IG1heSBiZSB0YWtlbiB3aGVuIGEgZGVhdGgKKyAgLy8gdGVzdCBpcyBlbmNvdW50ZXJlZC4gIEVYRUNVVEUgbWVhbnMgdGhhdCB0aGUgZGVhdGggdGVzdCBsb2dpYyBzaG91bGQKKyAgLy8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuICBPVkVSU0VFIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gc2hvdWxkIHByZXBhcmUKKyAgLy8gdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IGZvciBhIGNoaWxkIHByb2Nlc3MgdG8gZXhlY3V0ZSB0aGUgZGVhdGgKKyAgLy8gdGVzdCwgdGhlbiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KKyAgZW51bSBUZXN0Um9sZSB7IE9WRVJTRUVfVEVTVCwgRVhFQ1VURV9URVNUIH07CisKKyAgLy8gQW4gZW51bWVyYXRpb24gb2YgdGhlIHRocmVlIHJlYXNvbnMgdGhhdCBhIHRlc3QgbWlnaHQgYmUgYWJvcnRlZC4KKyAgZW51bSBBYm9ydFJlYXNvbiB7CisgICAgVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAorICAgIFRFU1RfVEhSRVdfRVhDRVBUSU9OLAorICAgIFRFU1RfRElEX05PVF9ESUUKKyAgfTsKKworICAvLyBBc3N1bWVzIG9uZSBvZiB0aGUgYWJvdmUgcm9sZXMuCisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpID0gMDsKKworICAvLyBXYWl0cyBmb3IgdGhlIGRlYXRoIHRlc3QgdG8gZmluaXNoIGFuZCByZXR1cm5zIGl0cyBzdGF0dXMuCisgIHZpcnR1YWwgaW50IFdhaXQoKSA9IDA7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWF0aCB0ZXN0IHBhc3NlZDsgdGhhdCBpcywgdGhlIHRlc3QgcHJvY2VzcworICAvLyBleGl0ZWQgZHVyaW5nIHRoZSB0ZXN0LCBpdHMgZXhpdCBzdGF0dXMgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQKKyAgLy8gcHJlZGljYXRlLCBhbmQgaXRzIHN0ZGVyciBvdXRwdXQgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQgcmVndWxhcgorICAvLyBleHByZXNzaW9uLgorICAvLyBUaGUgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUgbWF5IGJlIGEgbWFjcm8gZXhwcmVzc2lvbiByYXRoZXIKKyAgLy8gdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgZnVuY3Rvciwgb3IgZWxzZSBXYWl0IGFuZCBQYXNzZWQgY291bGQKKyAgLy8gYmUgY29tYmluZWQuCisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBleGl0X3N0YXR1c19vaykgPSAwOworCisgIC8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBkaWQgbm90IGRpZSBhcyBleHBlY3RlZC4KKyAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgPSAwOworCisgIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBvdXRjb21lIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBvdXRjb21lIG9mCisgIC8vIHRoZSBsYXN0IGRlYXRoIHRlc3QuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBMYXN0TWVzc2FnZSgpOworCisgIHN0YXRpYyB2b2lkIHNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBTdHJpbmcmIG1lc3NhZ2UpOworCisgcHJpdmF0ZToKKyAgLy8gQSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvdXRjb21lIG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QuCisgIHN0YXRpYyBTdHJpbmcgbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVhdGhUZXN0KTsKK307CisKKy8vIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBkZWF0aCB0ZXN0cy4gIE1heSBiZSBtb2NrZWQgb3V0IGZvciB0ZXN0aW5nLgorY2xhc3MgRGVhdGhUZXN0RmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5EZWF0aFRlc3RGYWN0b3J5KCkgeyB9CisgIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpID0gMDsKK307CisKKy8vIEEgY29uY3JldGUgRGVhdGhUZXN0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3Igbm9ybWFsIHVzZS4KK2NsYXNzIERlZmF1bHREZWF0aFRlc3RGYWN0b3J5IDogcHVibGljIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCk7Cit9OworCisvLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkCisvLyBieSBhIHNpZ25hbCwgb3IgZXhpdGVkIG5vcm1hbGx5IHdpdGggYSBub256ZXJvIGV4aXQgY29kZS4KK0dURVNUX0FQSV8gYm9vbCBFeGl0ZWRVbnN1Y2Nlc3NmdWxseShpbnQgZXhpdF9zdGF0dXMpOworCisvLyBUcmFwcyBDKysgZXhjZXB0aW9ucyBlc2NhcGluZyBzdGF0ZW1lbnQgYW5kIHJlcG9ydHMgdGhlbSBhcyB0ZXN0CisvLyBmYWlsdXJlcy4gTm90ZSB0aGF0IHRyYXBwaW5nIFNFSCBleGNlcHRpb25zIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlLgorIyBpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyAgZGVmaW5lIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZGVhdGhfdGVzdCkgXAorICB0cnkgeyBcCisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgIH0gY2F0Y2ggKGNvbnN0IDo6c3RkOjpleGNlcHRpb24mIGd0ZXN0X2V4Y2VwdGlvbikgeyBcCisgICAgZnByaW50ZihcCisgICAgICAgIHN0ZGVyciwgXAorICAgICAgICAiXG4lczogQ2F1Z2h0IHN0ZDo6ZXhjZXB0aW9uLWRlcml2ZWQgZXhjZXB0aW9uIGVzY2FwaW5nIHRoZSAiIFwKKyAgICAgICAgImRlYXRoIHRlc3Qgc3RhdGVtZW50LiBFeGNlcHRpb24gbWVzc2FnZTogJXNcbiIsIFwKKyAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXykuY19zdHIoKSwgXAorICAgICAgICBndGVzdF9leGNlcHRpb24ud2hhdCgpKTsgXAorICAgIGZmbHVzaChzdGRlcnIpOyBcCisgICAgZGVhdGhfdGVzdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX1RIUkVXX0VYQ0VQVElPTik7IFwKKyAgfSBjYXRjaCAoLi4uKSB7IFwKKyAgICBkZWF0aF90ZXN0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfVEhSRVdfRVhDRVBUSU9OKTsgXAorICB9CisKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZGVhdGhfdGVzdCkgXAorICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkKKworIyBlbmRpZgorCisvLyBUaGlzIG1hY3JvIGlzIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX0RFQVRIKiwgRVhQRUNUX0RFQVRIKiwKKy8vIEFTU0VSVF9FWElUKiwgYW5kIEVYUEVDVF9FWElUKi4KKyMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFJiBndGVzdF9yZWdleCA9IChyZWdleCk7IFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3QqIGd0ZXN0X2R0OyBcCisgICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkNyZWF0ZSgjc3RhdGVtZW50LCAmZ3Rlc3RfcmVnZXgsIFwKKyAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAmZ3Rlc3RfZHQpKSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAorICAgIH0gXAorICAgIGlmIChndGVzdF9kdCAhPSBOVUxMKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdD4gXAorICAgICAgICAgIGd0ZXN0X2R0X3B0cihndGVzdF9kdCk7IFwKKyAgICAgIHN3aXRjaCAoZ3Rlc3RfZHQtPkFzc3VtZVJvbGUoKSkgeyBcCisgICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpPVkVSU0VFX1RFU1Q6IFwKKyAgICAgICAgICBpZiAoIWd0ZXN0X2R0LT5QYXNzZWQocHJlZGljYXRlKGd0ZXN0X2R0LT5XYWl0KCkpKSkgeyBcCisgICAgICAgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgICB9IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICBjYXNlIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6RVhFQ1VURV9URVNUOiB7IFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlJldHVyblNlbnRpbmVsIFwKKyAgICAgICAgICAgICAgZ3Rlc3Rfc2VudGluZWwoZ3Rlc3RfZHQpOyBcCisgICAgICAgICAgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBndGVzdF9kdCk7IFwKKyAgICAgICAgICBndGVzdF9kdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX0RJRF9OT1RfRElFKTsgXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgICBkZWZhdWx0OiBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpKQorLy8gVGhlIHN5bWJvbCAiZmFpbCIgaGVyZSBleHBhbmRzIHRvIHNvbWV0aGluZyBpbnRvIHdoaWNoIGEgbWVzc2FnZQorLy8gY2FuIGJlIHN0cmVhbWVkLgorCisvLyBBIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIGNvbnRlbnRzIG9mIHRoZQorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLCBhcyBpdCBleGlzdGVkIHdoZW4KKy8vIFJVTl9BTExfVEVTVFMgd2FzIGNhbGxlZC4KK2NsYXNzIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyB7CisgcHVibGljOgorICBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoY29uc3QgU3RyaW5nJiBhX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfd3JpdGVfZmQpCisgICAgICA6IGZpbGVfKGFfZmlsZSksIGxpbmVfKGFfbGluZSksIGluZGV4Xyhhbl9pbmRleCksCisgICAgICAgIHdyaXRlX2ZkXyhhX3dyaXRlX2ZkKSB7fQorCisgIH5JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgICAgaWYgKHdyaXRlX2ZkXyA+PSAwKQorICAgICAgcG9zaXg6OkNsb3NlKHdyaXRlX2ZkXyk7CisgIH0KKworICBTdHJpbmcgZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9CisgIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KKyAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gaW5kZXhfOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nIGZpbGVfOworICBpbnQgbGluZV87CisgIGludCBpbmRleF87CisgIGludCB3cml0ZV9mZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcpOworfTsKKworLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcworLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgorLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgorSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpOworCisjZWxzZSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgbWFjcm9zIHN1Y2ggYXMKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgYW5kIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgb24gc3lzdGVtcyB3aGVyZQorLy8gZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRob3NlIG1hY3JvcyBtdXN0IGNvbXBpbGUgb24gc3VjaCBzeXN0ZW1zCisvLyBpZmYgRVhQRUNUX0RFQVRIIGFuZCBBU1NFUlRfREVBVEggY29tcGlsZSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb24KKy8vIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRlYXRoIHRlc3RzLiBUaGlzIGFsbG93cyBvbmUgdG8gd3JpdGUgc3VjaCBhIG1hY3JvCisvLyBvbiBhIHN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgYW5kIGJlIHN1cmUgdGhhdCBpdCB3aWxsCisvLyBjb21waWxlIG9uIGEgZGVhdGgtdGVzdCBzdXBwb3J0aW5nIHN5c3RlbS4KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gICBzdGF0ZW1lbnQgLSAgQSBzdGF0ZW1lbnQgdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHRlc3QKKy8vICAgICAgICAgICAgICAgIGZvciBwcm9ncmFtIHRlcm1pbmF0aW9uLiBUaGlzIG1hY3JvIGhhcyB0byBtYWtlIHN1cmUgdGhpcworLy8gICAgICAgICAgICAgICAgc3RhdGVtZW50IGlzIGNvbXBpbGVkIGJ1dCBub3QgZXhlY3V0ZWQsIHRvIGVuc3VyZSB0aGF0CisvLyAgICAgICAgICAgICAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEIGNvbXBpbGVzIHdpdGggYSBjZXJ0YWluCisvLyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaWZmIEVYUEVDVF9ERUFUSCBjb21waWxlcyB3aXRoIGl0LgorLy8gICByZWdleCAgICAgLSAgQSByZWdleCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdXNlIHRvIHRlc3QKKy8vICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2Ygc3RhdGVtZW50LiAgVGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlCisvLyAgICAgICAgICAgICAgICBjb21waWxlZCBidXQgbm90IGV2YWx1YXRlZCBieSB0aGlzIG1hY3JvLCB0byBlbnN1cmUgdGhhdAorLy8gICAgICAgICAgICAgICAgdGhpcyBtYWNybyBvbmx5IGFjY2VwdHMgZXhwcmVzc2lvbnMgdGhhdCBhIG1hY3JvIHN1Y2ggYXMKKy8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSCB3b3VsZCBhY2NlcHQuCisvLyAgIHRlcm1pbmF0b3IgLSBNdXN0IGJlIGFuIGVtcHR5IHN0YXRlbWVudCBmb3IgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRAorLy8gICAgICAgICAgICAgICAgYW5kIGEgcmV0dXJuIHN0YXRlbWVudCBmb3IgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRC4KKy8vICAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgd2lsbCBub3QKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGUgaW5zaWRlIGZ1bmN0aW9ucyB3aGVyZSBBU1NFUlRfREVBVEggZG9lc24ndAorLy8gICAgICAgICAgICAgICAgY29tcGlsZS4KKy8vCisvLyAgVGhlIGJyYW5jaCB0aGF0IGhhcyBhbiBhbHdheXMgZmFsc2UgY29uZGl0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKKy8vICBzdGF0ZW1lbnQgYW5kIHJlZ2V4IGFyZSBjb21waWxlZCAoYW5kIHRodXMgc3ludGFjdGljYWxseSBjb3JyZWN0KSBidXQKKy8vICBuZXZlciBleGVjdXRlZC4gVGhlIHVucmVhY2hhYmxlIGNvZGUgbWFjcm8gcHJvdGVjdHMgdGhlIHRlcm1pbmF0b3IKKy8vICBzdGF0ZW1lbnQgZnJvbSBnZW5lcmF0aW5nIGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGluIGNhc2UKKy8vICBzdGF0ZW1lbnQgdW5jb25kaXRpb25hbGx5IHJldHVybnMgb3IgdGhyb3dzLiBUaGUgTWVzc2FnZSBjb25zdHJ1Y3RvciBhdAorLy8gIHRoZSBlbmQgYWxsb3dzIHRoZSBzeW50YXggb2Ygc3RyZWFtaW5nIGFkZGl0aW9uYWwgbWVzc2FnZXMgaW50byB0aGUKKy8vICBtYWNybywgZm9yIGNvbXBpbGF0aW9uYWwgY29tcGF0aWJpbGl0eSB3aXRoIEVYUEVDVF9ERUFUSC9BU1NFUlRfREVBVEguCisjIGRlZmluZSBHVEVTVF9VTlNVUFBPUlRFRF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHJlZ2V4LCB0ZXJtaW5hdG9yKSBcCisgICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSBcCisgICAgICAgICAgPDwgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uXG4iIFwKKyAgICAgICAgICA8PCAiU3RhdGVtZW50ICciICNzdGF0ZW1lbnQgIicgY2Fubm90IGJlIHZlcmlmaWVkLiI7IFwKKyAgICB9IGVsc2UgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpIHsgXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkU6OlBhcnRpYWxNYXRjaCgiLioiLCAocmVnZXgpKTsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgICB0ZXJtaW5hdG9yOyBcCisgICAgfSBlbHNlIFwKKyAgICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2YjNjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbiA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uCisvLyBEbyBub3QgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlIHNlcGFyYXRlbHkhCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRmlsZVBhdGggLSBhIGNsYXNzIGZvciBmaWxlIGFuZCBkaXJlY3RvcnkgcGF0aG5hbWUgbWFuaXB1bGF0aW9uIHdoaWNoCisvLyBoYW5kbGVzIHBsYXRmb3JtLXNwZWNpZmljIGNvbnZlbnRpb25zIChsaWtlIHRoZSBwYXRobmFtZSBzZXBhcmF0b3IpLgorLy8gVXNlZCBmb3IgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFtaW5nIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciB4bWwgb3V0cHV0LgorLy8gRXhjZXB0IGZvciBTZXQgbWV0aG9kcywgYWxsIG1ldGhvZHMgYXJlIGNvbnN0IG9yIHN0YXRpYywgd2hpY2ggcHJvdmlkZXMgYW4KKy8vICJpbW11dGFibGUgdmFsdWUgb2JqZWN0IiAtLSB1c2VmdWwgZm9yIHBlYWNlIG9mIG1pbmQuCisvLyBBIEZpbGVQYXRoIHdpdGggYSB2YWx1ZSBlbmRpbmcgaW4gYSBwYXRoIHNlcGFyYXRvciAoImxpa2UvdGhpcy8iKSByZXByZXNlbnRzCisvLyBhIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGEgZmlsZS4gSW4gZWl0aGVyIGNhc2UsCisvLyBpdCBtYXkgb3IgbWF5IG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbS4KKy8vIE5hbWVzIGFyZSBOT1QgY2hlY2tlZCBmb3Igc3ludGF4IGNvcnJlY3RuZXNzIC0tIG5vIGNoZWNraW5nIGZvciBpbGxlZ2FsCisvLyBjaGFyYWN0ZXJzLCBtYWxmb3JtZWQgcGF0aHMsIGV0Yy4KKworY2xhc3MgR1RFU1RfQVBJXyBGaWxlUGF0aCB7CisgcHVibGljOgorICBGaWxlUGF0aCgpIDogcGF0aG5hbWVfKCIiKSB7IH0KKyAgRmlsZVBhdGgoY29uc3QgRmlsZVBhdGgmIHJocykgOiBwYXRobmFtZV8ocmhzLnBhdGhuYW1lXykgeyB9CisKKyAgZXhwbGljaXQgRmlsZVBhdGgoY29uc3QgY2hhciogcGF0aG5hbWUpIDogcGF0aG5hbWVfKHBhdGhuYW1lKSB7CisgICAgTm9ybWFsaXplKCk7CisgIH0KKworICBleHBsaWNpdCBGaWxlUGF0aChjb25zdCBTdHJpbmcmIHBhdGhuYW1lKSA6IHBhdGhuYW1lXyhwYXRobmFtZSkgeworICAgIE5vcm1hbGl6ZSgpOworICB9CisKKyAgRmlsZVBhdGgmIG9wZXJhdG9yPShjb25zdCBGaWxlUGF0aCYgcmhzKSB7CisgICAgU2V0KHJocyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBTZXQoY29uc3QgRmlsZVBhdGgmIHJocykgeworICAgIHBhdGhuYW1lXyA9IHJocy5wYXRobmFtZV87CisgIH0KKworICBTdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV87IH0KKyAgY29uc3QgY2hhciogY19zdHIoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgc3RhdGljIEZpbGVQYXRoIEdldEN1cnJlbnREaXIoKTsKKworICAvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgYmFzZV9uYW1lID0gInRlc3QiLCBudW1iZXIgPSAwLAorICAvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKKyAgLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCisgIHN0YXRpYyBGaWxlUGF0aCBNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKKworICAvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsCisgIC8vIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisgIC8vIE9uIFdpbmRvd3MsIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCisgIHN0YXRpYyBGaWxlUGF0aCBDb25jYXRQYXRocyhjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpOworCisgIC8vIFJldHVybnMgYSBwYXRobmFtZSBmb3IgYSBmaWxlIHRoYXQgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiBUaGUgcGF0aG5hbWUKKyAgLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgorICAvLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgorICAvLyBhbHJlYWR5IGV4aXN0cy4gVGhlIG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIHVudGlsIGEgcGF0aG5hbWUgaXMgZm91bmQKKyAgLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICAvLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgorICAvLyBUaGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGlmIHR3byBvciBtb3JlIHByb2Nlc3NlcyBhcmUgY2FsbGluZyB0aGlzCisgIC8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCisgIHN0YXRpYyBGaWxlUGF0aCBHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgcGF0aCBpcyBOVUxMIG9yICIiLgorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBjX3N0cigpID09IE5VTEwgfHwgKmNfc3RyKCkgPT0gJ1wwJzsgfQorCisgIC8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlcyBpdCBhbmQgcmV0dXJucworICAvLyB0aGUgbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KKyAgRmlsZVBhdGggUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucworICAvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKKyAgLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKKyAgLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorICBGaWxlUGF0aCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3Q7CisKKyAgLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgorICAvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCisgIC8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorICBGaWxlUGF0aCBSZW1vdmVGaWxlTmFtZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAorICAvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorICBGaWxlUGF0aCBSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdDsKKworICAvLyBDcmVhdGVzIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCisgIC8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUKKyAgLy8gZGlyZWN0b3JpZXMgZm9yIGFueSByZWFzb24uIFdpbGwgYWxzbyByZXR1cm4gZmFsc2UgaWYgdGhlIEZpbGVQYXRoIGRvZXMKKyAgLy8gbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeSAodGhhdCBpcywgaXQgZG9lc24ndCBlbmQgd2l0aCBhIHBhdGggc2VwYXJhdG9yKS4KKyAgYm9vbCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3Q7CisKKyAgLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKKyAgLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQorICAvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAorICAvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KKyAgYm9vbCBDcmVhdGVGb2xkZXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZGVzY3JpYmVzIHNvbWV0aGluZyBpbiB0aGUgZmlsZS1zeXN0ZW0sCisgIC8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIsIGFuZCB0aGF0IHNvbWV0aGluZyBleGlzdHMuCisgIGJvb2wgRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KKyAgLy8gdGhhdCBleGlzdHMuCisgIGJvb2wgRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorICAvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KKyAgYm9vbCBJc0RpcmVjdG9yeSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQorICAvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCisgIGJvb2wgSXNSb290RGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgorICBib29sIElzQWJzb2x1dGVQYXRoKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBSZXBsYWNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIHdpdGggYSBzaW5nbGUgc2VwYXJhdG9yLgorICAvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgorICAvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KKyAgLy8KKyAgLy8gQSBwYXRobmFtZSB3aXRoIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgbWF5IG9jY3VyIGVpdGhlciB0aHJvdWdoCisgIC8vIHVzZXIgZXJyb3Igb3IgYXMgYSByZXN1bHQgb2Ygc29tZSBzY3JpcHRzIG9yIEFQSXMgdGhhdCBnZW5lcmF0ZSBhIHBhdGhuYW1lCisgIC8vIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IuIE9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc2FtZSBBUEkgb3Igc2NyaXB0CisgIC8vIG1heSBOT1QgZ2VuZXJhdGUgYSBwYXRobmFtZSB3aXRoIGEgdHJhaWxpbmcgIi8iLiBUaGVuIGVsc2V3aGVyZSB0aGF0CisgIC8vIHBhdGhuYW1lIG1heSBoYXZlIGFub3RoZXIgIi8iIGFuZCBwYXRobmFtZSBjb21wb25lbnRzIGFkZGVkIHRvIGl0LAorICAvLyB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2VwYXJhdG9yIGFscmVhZHkgYmVpbmcgdGhlcmUuCisgIC8vIFRoZSBzY3JpcHQgbGFuZ3VhZ2UgYW5kIG9wZXJhdGluZyBzeXN0ZW0gbWF5IGFsbG93IHBhdGhzIGxpa2UgImZvby8vYmFyIgorICAvLyBidXQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGluIEZpbGVQYXRoIHdpbGwgbm90IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4gSW4KKyAgLy8gcGFydGljdWxhciwgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgb25seSByZW1vdmVzIG9uZSBzZXBhcmF0b3IsIGFuZAorICAvLyBpdCBpcyBjYWxsZWQgaW4gQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBjaGFuZ2UKKyAgLy8gYSBwYXRobmFtZSBmcm9tIGRpcmVjdG9yeSBzeW50YXggKHRyYWlsaW5nIHNlcGFyYXRvcikgdG8gZmlsZW5hbWUgc3ludGF4LgorICAvLworICAvLyBPbiBXaW5kb3dzIHRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvciAnLycgd2l0aAorICAvLyB0aGUgcHJpbWFyeSBwYXRoIHNlcGFyYXRvciAnXFwnLCBzbyB0aGF0IGZvciBleGFtcGxlICJiYXJcXC9cXGZvbyIgYmVjb21lcworICAvLyAiYmFyXFxmb28iLgorCisgIHZvaWQgTm9ybWFsaXplKCk7CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KKyAgLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAorICAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgorICBjb25zdCBjaGFyKiBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdDsKKworICBTdHJpbmcgcGF0aG5hbWVfOworfTsgIC8vIGNsYXNzIEZpbGVQYXRoCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWExMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaApAQCAtMCwwICsxLDEyMjYgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgR1RFU1RfT1NfTElOVVgKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaCIKKworLy8gRHVlIHRvIEMrKyBwcmVwcm9jZXNzb3Igd2VpcmRuZXNzLCB3ZSBuZWVkIGRvdWJsZSBpbmRpcmVjdGlvbiB0bworLy8gY29uY2F0ZW5hdGUgdHdvIHRva2VucyB3aGVuIG9uZSBvZiB0aGVtIGlzIF9fTElORV9fLiAgV3JpdGluZworLy8KKy8vICAgZm9vICMjIF9fTElORV9fCisvLworLy8gd2lsbCByZXN1bHQgaW4gdGhlIHRva2VuIGZvb19fTElORV9fLCBpbnN0ZWFkIG9mIGZvbyBmb2xsb3dlZCBieQorLy8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKKy8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvbWlzYy10ZWNobmljYWwtaXNzdWVzLmh0bWwjZmFxLTM5LjYKKyNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOXyhmb28sIGJhcikgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKQorI2RlZmluZSBHVEVTVF9DT05DQVRfVE9LRU5fSU1QTF8oZm9vLCBiYXIpIGZvbyAjIyBiYXIKKworLy8gR29vZ2xlIFRlc3QgZGVmaW5lcyB0aGUgdGVzdGluZzo6TWVzc2FnZSBjbGFzcyB0byBhbGxvdyBjb25zdHJ1Y3Rpb24gb2YKKy8vIHRlc3QgbWVzc2FnZXMgdmlhIHRoZSA8PCBvcGVyYXRvci4gIFRoZSBpZGVhIGlzIHRoYXQgYW55dGhpbmcKKy8vIHN0cmVhbWFibGUgdG8gc3RkOjpvc3RyZWFtIGNhbiBiZSBzdHJlYW1lZCB0byBhIHRlc3Rpbmc6Ok1lc3NhZ2UuCisvLyBUaGlzIGFsbG93cyBhIHVzZXIgdG8gdXNlIGhpcyBvd24gdHlwZXMgaW4gR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBieQorLy8gb3ZlcmxvYWRpbmcgdGhlIDw8IG9wZXJhdG9yLgorLy8KKy8vIHV0aWwvZ3RsL3N0bF9sb2dnaW5nLWlubC5oIG92ZXJsb2FkcyA8PCBmb3IgU1RMIGNvbnRhaW5lcnMuICBUaGVzZQorLy8gb3ZlcmxvYWRzIGNhbm5vdCBiZSBkZWZpbmVkIGluIHRoZSBzdGQgbmFtZXNwYWNlLCBhcyB0aGF0IHdpbGwgYmUKKy8vIHVuZGVmaW5lZCBiZWhhdmlvci4gIFRoZXJlZm9yZSwgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UgaW5zdGVhZC4KKy8vCisvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlCisvLyBvdmVybG9hZHMgYXJlIHZpc2libGUgaW4gZWl0aGVyIHRoZSBzdGQgbmFtZXNwYWNlIG9yIHRoZSBnbG9iYWwKKy8vIG5hbWVzcGFjZSwgYnV0IG5vdCBvdGhlciBuYW1lc3BhY2VzLCBpbmNsdWRpbmcgdGhlIHRlc3RpbmcKKy8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uCisvLworLy8gVG8gYWxsb3cgU1RMIGNvbnRhaW5lcnMgKGFuZCBvdGhlciB0eXBlcyB0aGF0IGhhcyBhIDw8IG9wZXJhdG9yCisvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMsCisvLyB0ZXN0aW5nOjpNZXNzYWdlIG11c3QgYWNjZXNzIHRoZSBjdXN0b20gPDwgb3BlcmF0b3IgZnJvbSB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UuICBIZW5jZSB0aGlzIGhlbHBlciBmdW5jdGlvbi4KKy8vCisvLyBOb3RlOiBKZWZmcmV5IFlhc3NraW4gc3VnZ2VzdGVkIGFuIGFsdGVybmF0aXZlIGZpeCBieSAidXNpbmcKKy8vIDo6b3BlcmF0b3I8PDsiIGluIHRoZSBkZWZpbml0aW9uIG9mIE1lc3NhZ2UncyBvcGVyYXRvcjw8LiAgVGhhdCBmaXgKKy8vIGRvZXNuJ3QgcmVxdWlyZSBhIGhlbHBlciBmdW5jdGlvbiwgYnV0IHVuZm9ydHVuYXRlbHkgZG9lc24ndAorLy8gY29tcGlsZSB3aXRoIE1TVkMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIEdUZXN0U3RyZWFtVG9IZWxwZXIoc3RkOjpvc3RyZWFtKiBvcywgY29uc3QgVCYgdmFsKSB7CisgICpvcyA8PCB2YWw7Cit9CisKK2NsYXNzIFByb3RvY29sTWVzc2FnZTsKK25hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisKK2NsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmFpbHVyZSBtZXNzYWdlLgorY2xhc3MgVGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIHRlc3QuCitjbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuCitjbGFzcyBUZXN0UGFydFJlc3VsdDsgICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYSB0ZXN0IHBhcnQuCitjbGFzcyBVbml0VGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgorY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCitjbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KK2NsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAorCisvLyBIb3cgbWFueSB0aW1lcyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4KK2V4dGVybiBpbnQgZ19pbml0X2d0ZXN0X2NvdW50OworCisvLyBUaGUgdGV4dCB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIHRoZQorLy8gc3RhY2sgdHJhY2UuCitHVEVTVF9BUElfIGV4dGVybiBjb25zdCBjaGFyIGtTdGFja1RyYWNlTWFya2VyW107CisKKy8vIEEgc2VjcmV0IHR5cGUgdGhhdCBHb29nbGUgVGVzdCB1c2VycyBkb24ndCBrbm93IGFib3V0LiAgSXQgaGFzIG5vCisvLyBkZWZpbml0aW9uIG9uIHB1cnBvc2UuICBUaGVyZWZvcmUgaXQncyBpbXBvc3NpYmxlIHRvIGNyZWF0ZSBhCisvLyBTZWNyZXQgb2JqZWN0LCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCitjbGFzcyBTZWNyZXQ7CisKKy8vIFR3byBvdmVybG9hZGVkIGhlbHBlcnMgZm9yIGNoZWNraW5nIGF0IGNvbXBpbGUgdGltZSB3aGV0aGVyIGFuCisvLyBleHByZXNzaW9uIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQKKy8vIGNvbXBpbGUtdGltZSBpbnRlZ3JhbCBjb25zdGFudCkuICBUaGVpciByZXR1cm4gdmFsdWVzIGhhdmUKKy8vIGRpZmZlcmVudCBzaXplcywgc28gd2UgY2FuIHVzZSBzaXplb2YoKSB0byB0ZXN0IHdoaWNoIHZlcnNpb24gaXMKKy8vIHBpY2tlZCBieSB0aGUgY29tcGlsZXIuICBUaGVzZSBoZWxwZXJzIGhhdmUgbm8gaW1wbGVtZW50YXRpb25zLCBhcworLy8gd2Ugb25seSBuZWVkIHRoZWlyIHNpZ25hdHVyZXMuCisvLworLy8gR2l2ZW4gSXNOdWxsTGl0ZXJhbEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QKKy8vIHZlcnNpb24gaWYgeCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gU2VjcmV0KiwgYW5kIHBpY2sgdGhlCisvLyBzZWNvbmQgdmVyc2lvbiBvdGhlcndpc2UuICBTaW5jZSBTZWNyZXQgaXMgYSBzZWNyZXQgYW5kIGluY29tcGxldGUKKy8vIHR5cGUsIHRoZSBvbmx5IGV4cHJlc3Npb24gYSB1c2VyIGNhbiB3cml0ZSB0aGF0IGhhcyB0eXBlIFNlY3JldCogaXMKKy8vIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGVyZWZvcmUsIHdlIGtub3cgdGhhdCB4IGlzIGEgbnVsbAorLy8gcG9pbnRlciBsaXRlcmFsIGlmIGFuZCBvbmx5IGlmIHRoZSBmaXJzdCB2ZXJzaW9uIGlzIHBpY2tlZCBieSB0aGUKKy8vIGNvbXBpbGVyLgorY2hhciBJc051bGxMaXRlcmFsSGVscGVyKFNlY3JldCogcCk7CitjaGFyICgmSXNOdWxsTGl0ZXJhbEhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAorCisvLyBBIGNvbXBpbGUtdGltZSBib29sIGNvbnN0YW50IHRoYXQgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB4IGlzIGEKKy8vIG51bGwgcG9pbnRlciBsaXRlcmFsIChpLmUuIE5VTEwgb3IgYW55IDAtdmFsdWVkIGNvbXBpbGUtdGltZQorLy8gaW50ZWdyYWwgY29uc3RhbnQpLgorI2lmZGVmIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KKy8vIFdlIGxvc2Ugc3VwcG9ydCBmb3IgTlVMTCBkZXRlY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZQorLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4KKyMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgZmFsc2UKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIFwKKyAgICAoc2l6ZW9mKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzTnVsbExpdGVyYWxIZWxwZXIoeCkpID09IDEpCisjZW5kaWYgIC8vIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KKworLy8gQXBwZW5kcyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlIHRvIHRoZSBHb29nbGUtVGVzdC1nZW5lcmF0ZWQgbWVzc2FnZS4KK0dURVNUX0FQSV8gU3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKGNvbnN0IFN0cmluZyYgZ3Rlc3RfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpOworCisvLyBBIGhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgc2NvcGVkIHRyYWNlcyBpbiB1c2VyIHByb2dyYW1zLgorY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRUcmFjZSB7CisgcHVibGljOgorICAvLyBUaGUgYyd0b3IgcHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvCisgIC8vIGEgdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KKyAgU2NvcGVkVHJhY2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIFRoZSBkJ3RvciBwb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGUgZCd0b3IgaXMgbm90IHZpcnR1YWwgaW4gb3JkZXIgdG8gYmUgZWZmaWNpZW50LgorICAvLyBEb24ndCBpbmhlcml0IGZyb20gU2NvcGVkVHJhY2UhCisgIH5TY29wZWRUcmFjZSgpOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRUcmFjZSk7Cit9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOyAgLy8gQSBTY29wZWRUcmFjZSBvYmplY3QgZG9lcyBpdHMgam9iIGluIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMndG9yIGFuZCBkJ3Rvci4gIFRoZXJlZm9yZSBpdCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBiZSB1c2VkIG90aGVyd2lzZS4KKworLy8gQ29udmVydHMgYSBzdHJlYW1hYmxlIHZhbHVlIHRvIGEgU3RyaW5nLiAgQSBOVUxMIHBvaW50ZXIgaXMKKy8vIGNvbnZlcnRlZCB0byAiKG51bGwpIi4gIFdoZW4gdGhlIGlucHV0IHZhbHVlIGlzIGEgOjpzdHJpbmcsCisvLyA6OnN0ZDo6c3RyaW5nLCA6OndzdHJpbmcsIG9yIDo6c3RkOjp3c3RyaW5nIG9iamVjdCwgZWFjaCBOVUwKKy8vIGNoYXJhY3RlciBpbiBpdCBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorLy8gRGVjbGFyZWQgaGVyZSBidXQgZGVmaW5lZCBpbiBndGVzdC5oLCBzbyB0aGF0IGl0IGhhcyBhY2Nlc3MKKy8vIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBNZXNzYWdlIGNsYXNzLCByZXF1aXJlZCBieSB0aGUgQVJNCisvLyBjb21waWxlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorU3RyaW5nIFN0cmVhbWFibGVUb1N0cmluZyhjb25zdCBUJiBzdHJlYW1hYmxlKTsKKworLy8gVGhlIFN5bWJpYW4gY29tcGlsZXIgaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgaXQgZnJvbSBzZWxlY3RpbmcgdGhlCisvLyBjb3JyZWN0IG92ZXJsb2FkIG9mIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSAoc2VlIGJlbG93KQorLy8gdW5sZXNzIHdlIHBhc3MgdGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHJlZmVyZW5jZS4gIElmIHdlIGRvIHRoYXQsCisvLyBob3dldmVyLCBWaXN1YWwgQWdlIEMrKyAxMC4xIGdlbmVyYXRlcyBhIGNvbXBpbGVyIGVycm9yLiAgVGhlcmVmb3JlCisvLyB3ZSBvbmx5IGFwcGx5IHRoZSB3b3JrLWFyb3VuZCBmb3IgU3ltYmlhbi4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pCisjIGRlZmluZSBHVEVTVF9DUkVGX1dPUktBUk9VTkRfIGNvbnN0JgorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0NSRUZfV09SS0FST1VORF8KKyNlbmRpZgorCisvLyBXaGVuIHRoaXMgb3BlcmFuZCBpcyBhIGNvbnN0IGNoYXIqIG9yIGNoYXIqLCBpZiB0aGUgb3RoZXIgb3BlcmFuZAorLy8gaXMgYSA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RyaW5nLCB3ZSBwcmludCB0aGlzIG9wZXJhbmQgYXMgYSBDIHN0cmluZworLy8gcmF0aGVyIHRoYW4gYSBwb2ludGVyICh3ZSBkbyB0aGUgc2FtZSBmb3Igd2lkZSBzdHJpbmdzKTsgb3RoZXJ3aXNlCisvLyB3ZSBwcmludCBpdCBhcyBhIHBvaW50ZXIgdG8gYmUgc2FmZS4KKworLy8gVGhpcyBpbnRlcm5hbCBtYWNybyBpcyB1c2VkIHRvIGF2b2lkIGR1cGxpY2F0ZWQgY29kZS4KKyNkZWZpbmUgR1RFU1RfRk9STUFUX0lNUExfKG9wZXJhbmQyX3R5cGUsIG9wZXJhbmQxX3ByaW50ZXIpXAoraW5saW5lIFN0cmluZyBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoXAorICAgIG9wZXJhbmQyX3R5cGU6OnZhbHVlX3R5cGUqIEdURVNUX0NSRUZfV09SS0FST1VORF8gc3RyLCBcCisgICAgY29uc3Qgb3BlcmFuZDJfdHlwZSYgLypvcGVyYW5kMiovKSB7XAorICByZXR1cm4gb3BlcmFuZDFfcHJpbnRlcihzdHIpO1wKK31cCitpbmxpbmUgU3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShcCisgICAgY29uc3Qgb3BlcmFuZDJfdHlwZTo6dmFsdWVfdHlwZSogR1RFU1RfQ1JFRl9XT1JLQVJPVU5EXyBzdHIsIFwKKyAgICBjb25zdCBvcGVyYW5kMl90eXBlJiAvKm9wZXJhbmQyKi8pIHtcCisgIHJldHVybiBvcGVyYW5kMV9wcmludGVyKHN0cik7XAorfQorCitHVEVTVF9GT1JNQVRfSU1QTF8oOjpzdGQ6OnN0cmluZywgU3RyaW5nOjpTaG93Q1N0cmluZ1F1b3RlZCkKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0dURVNUX0ZPUk1BVF9JTVBMXyg6OnN0ZDo6d3N0cmluZywgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQpCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK0dURVNUX0ZPUk1BVF9JTVBMXyg6OnN0cmluZywgU3RyaW5nOjpTaG93Q1N0cmluZ1F1b3RlZCkKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK0dURVNUX0ZPUk1BVF9JTVBMXyg6OndzdHJpbmcsIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nUXVvdGVkKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI3VuZGVmIEdURVNUX0ZPUk1BVF9JTVBMXworCisvLyBUaGUgbmV4dCBmb3VyIG92ZXJsb2FkcyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIG9wZXJhbmQgYmVpbmcKKy8vIHByaW50ZWQgaXMgYSBjaGFyL3djaGFyX3QgcG9pbnRlciBhbmQgdGhlIG90aGVyIG9wZXJhbmQgaXMgbm90IGEKKy8vIHN0cmluZy93c3RyaW5nIG9iamVjdC4gIEluIHN1Y2ggY2FzZXMsIHdlIGp1c3QgcHJpbnQgdGhlIG9wZXJhbmQgYXMKKy8vIGEgcG9pbnRlciB0byBiZSBzYWZlLgorI2RlZmluZSBHVEVTVF9GT1JNQVRfQ0hBUl9QVFJfSU1QTF8oQ2hhclR5cGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShDaGFyVHlwZSogR1RFU1RfQ1JFRl9XT1JLQVJPVU5EXyBwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYpIHsgXAorICAgIHJldHVybiBQcmludFRvU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihwKSk7ICAgICAgICAgICAgICBcCisgIH0KKworR1RFU1RfRk9STUFUX0NIQVJfUFRSX0lNUExfKGNoYXIpCitHVEVTVF9GT1JNQVRfQ0hBUl9QVFJfSU1QTF8oY29uc3QgY2hhcikKK0dURVNUX0ZPUk1BVF9DSEFSX1BUUl9JTVBMXyh3Y2hhcl90KQorR1RFU1RfRk9STUFUX0NIQVJfUFRSX0lNUExfKGNvbnN0IHdjaGFyX3QpCisKKyN1bmRlZiBHVEVTVF9GT1JNQVRfQ0hBUl9QVFJfSU1QTF8KKworLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYW4gZXF1YWxpdHkgYXNzZXJ0aW9uCisvLyAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9TVFJFUSwgZXRjKSBmYWlsdXJlLgorLy8KKy8vIFRoZSBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBhc3NlcnRpb24KKy8vIGFuZCB0aGVpciB2YWx1ZXMsIGFzIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwgZm9yIEFTU0VSVF9FUShmb28sIGJhcikKKy8vIHdoZXJlIGZvbyBpcyA1IGFuZCBiYXIgaXMgNiwgd2UgaGF2ZToKKy8vCisvLyAgIGV4cGVjdGVkX2V4cHJlc3Npb246ICJmb28iCisvLyAgIGFjdHVhbF9leHByZXNzaW9uOiAgICJiYXIiCisvLyAgIGV4cGVjdGVkX3ZhbHVlOiAgICAgICI1IgorLy8gICBhY3R1YWxfdmFsdWU6ICAgICAgICAiNiIKKy8vCisvLyBUaGUgaWdub3JpbmdfY2FzZSBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhCisvLyAqX1NUUkNBU0VFUSouICBXaGVuIGl0J3MgdHJ1ZSwgdGhlIHN0cmluZyAiIChpZ25vcmluZyBjYXNlKSIgd2lsbAorLy8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEVxRmFpbHVyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKTsKKworLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCitHVEVTVF9BUElfIFN0cmluZyBHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoCisgICAgY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBhc3NlcnRpb25fcmVzdWx0LAorICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwKKyAgICBjb25zdCBjaGFyKiBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlLAorICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZSk7CisKKy8vIFRoaXMgdGVtcGxhdGUgY2xhc3MgcmVwcmVzZW50cyBhbiBJRUVFIGZsb2F0aW5nLXBvaW50IG51bWJlcgorLy8gKGVpdGhlciBzaW5nbGUtcHJlY2lzaW9uIG9yIGRvdWJsZS1wcmVjaXNpb24sIGRlcGVuZGluZyBvbiB0aGUKKy8vIHRlbXBsYXRlIHBhcmFtZXRlcnMpLgorLy8KKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gZG8gbW9yZSBzb3BoaXN0aWNhdGVkIG51bWJlcgorLy8gY29tcGFyaXNvbi4gIChEdWUgdG8gcm91bmQtb2ZmIGVycm9yLCBldGMsIGl0J3MgdmVyeSB1bmxpa2VseSB0aGF0CisvLyB0d28gZmxvYXRpbmctcG9pbnRzIHdpbGwgYmUgZXF1YWwgZXhhY3RseS4gIEhlbmNlIGEgbmFpdmUKKy8vIGNvbXBhcmlzb24gYnkgdGhlID09IG9wZXJhdGlvbiBvZnRlbiBkb2Vzbid0IHdvcmsuKQorLy8KKy8vIEZvcm1hdCBvZiBJRUVFIGZsb2F0aW5nLXBvaW50OgorLy8KKy8vICAgVGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IGJlaW5nIHRoZSBsZWZ0bW9zdCwgYW4gSUVFRQorLy8gICBmbG9hdGluZy1wb2ludCBsb29rcyBsaWtlCisvLworLy8gICAgIHNpZ25fYml0IGV4cG9uZW50X2JpdHMgZnJhY3Rpb25fYml0cworLy8KKy8vICAgSGVyZSwgc2lnbl9iaXQgaXMgYSBzaW5nbGUgYml0IHRoYXQgZGVzaWduYXRlcyB0aGUgc2lnbiBvZiB0aGUKKy8vICAgbnVtYmVyLgorLy8KKy8vICAgRm9yIGZsb2F0LCB0aGVyZSBhcmUgOCBleHBvbmVudCBiaXRzIGFuZCAyMyBmcmFjdGlvbiBiaXRzLgorLy8KKy8vICAgRm9yIGRvdWJsZSwgdGhlcmUgYXJlIDExIGV4cG9uZW50IGJpdHMgYW5kIDUyIGZyYWN0aW9uIGJpdHMuCisvLworLy8gICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0CisvLyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVFRV9mbG9hdGluZy1wb2ludF9zdGFuZGFyZC4KKy8vCisvLyBUZW1wbGF0ZSBwYXJhbWV0ZXI6CisvLworLy8gICBSYXdUeXBlOiB0aGUgcmF3IGZsb2F0aW5nLXBvaW50IHR5cGUgKGVpdGhlciBmbG9hdCBvciBkb3VibGUpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK2NsYXNzIEZsb2F0aW5nUG9pbnQgeworIHB1YmxpYzoKKyAgLy8gRGVmaW5lcyB0aGUgdW5zaWduZWQgaW50ZWdlciB0eXBlIHRoYXQgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlCisgIC8vIGZsb2F0aW5nIHBvaW50IG51bWJlci4KKyAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlV2l0aFNpemU8c2l6ZW9mKFJhd1R5cGUpPjo6VUludCBCaXRzOworCisgIC8vIENvbnN0YW50cy4KKworICAvLyAjIG9mIGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JpdENvdW50ID0gOCpzaXplb2YoUmF3VHlwZSk7CisKKyAgLy8gIyBvZiBmcmFjdGlvbiBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFjdGlvbkJpdENvdW50ID0KKyAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMgLSAxOworCisgIC8vICMgb2YgZXhwb25lbnQgYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrRXhwb25lbnRCaXRDb3VudCA9IGtCaXRDb3VudCAtIDEgLSBrRnJhY3Rpb25CaXRDb3VudDsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIHNpZ24gYml0LgorICBzdGF0aWMgY29uc3QgQml0cyBrU2lnbkJpdE1hc2sgPSBzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoa0JpdENvdW50IC0gMSk7CisKKyAgLy8gVGhlIG1hc2sgZm9yIHRoZSBmcmFjdGlvbiBiaXRzLgorICBzdGF0aWMgY29uc3QgQml0cyBrRnJhY3Rpb25CaXRNYXNrID0KKyAgICB+c3RhdGljX2Nhc3Q8Qml0cz4oMCkgPj4gKGtFeHBvbmVudEJpdENvdW50ICsgMSk7CisKKyAgLy8gVGhlIG1hc2sgZm9yIHRoZSBleHBvbmVudCBiaXRzLgorICBzdGF0aWMgY29uc3QgQml0cyBrRXhwb25lbnRCaXRNYXNrID0gfihrU2lnbkJpdE1hc2sgfCBrRnJhY3Rpb25CaXRNYXNrKTsKKworICAvLyBIb3cgbWFueSBVTFAncyAoVW5pdHMgaW4gdGhlIExhc3QgUGxhY2UpIHdlIHdhbnQgdG8gdG9sZXJhdGUgd2hlbgorICAvLyBjb21wYXJpbmcgdHdvIG51bWJlcnMuICBUaGUgbGFyZ2VyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgZXJyb3Igd2UKKyAgLy8gYWxsb3cuICBBIDAgdmFsdWUgbWVhbnMgdGhhdCB0d28gbnVtYmVycyBtdXN0IGJlIGV4YWN0bHkgdGhlIHNhbWUKKyAgLy8gdG8gYmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgLy8KKyAgLy8gVGhlIG1heGltdW0gZXJyb3Igb2YgYSBzaW5nbGUgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzIDAuNQorICAvLyB1bml0cyBpbiB0aGUgbGFzdCBwbGFjZS4gIE9uIEludGVsIENQVSdzLCBhbGwgZmxvYXRpbmctcG9pbnQKKyAgLy8gY2FsY3VsYXRpb25zIGFyZSBkb25lIHdpdGggODAtYml0IHByZWNpc2lvbiwgd2hpbGUgZG91YmxlIGhhcyA2NAorICAvLyBiaXRzLiAgVGhlcmVmb3JlLCA0IHNob3VsZCBiZSBlbm91Z2ggZm9yIG9yZGluYXJ5IHVzZS4KKyAgLy8KKyAgLy8gU2VlIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBmb3IgbW9yZSBkZXRhaWxzIG9uIFVMUDoKKyAgLy8gaHR0cDovL3d3dy5jeWdudXMtc29mdHdhcmUuY29tL3BhcGVycy9jb21wYXJpbmdmbG9hdHMvY29tcGFyaW5nZmxvYXRzLmh0bS4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VWxwcyA9IDQ7CisKKyAgLy8gQ29uc3RydWN0cyBhIEZsb2F0aW5nUG9pbnQgZnJvbSBhIHJhdyBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIE9uIGFuIEludGVsIENQVSwgcGFzc2luZyBhIG5vbi1ub3JtYWxpemVkIE5BTiAoTm90IGEgTnVtYmVyKQorICAvLyBhcm91bmQgbWF5IGNoYW5nZSBpdHMgYml0cywgYWx0aG91Z2ggdGhlIG5ldyB2YWx1ZSBpcyBndWFyYW50ZWVkCisgIC8vIHRvIGJlIGFsc28gYSBOQU4uICBUaGVyZWZvcmUsIGRvbid0IGV4cGVjdCB0aGlzIGNvbnN0cnVjdG9yIHRvCisgIC8vIHByZXNlcnZlIHRoZSBiaXRzIGluIHggd2hlbiB4IGlzIGEgTkFOLgorICBleHBsaWNpdCBGbG9hdGluZ1BvaW50KGNvbnN0IFJhd1R5cGUmIHgpIHsgdV8udmFsdWVfID0geDsgfQorCisgIC8vIFN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmVpbnRlcnByZXRzIGEgYml0IHBhdHRlcm4gYXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHRlc3QgdGhlIEFsbW9zdEVxdWFscygpIG1ldGhvZC4KKyAgc3RhdGljIFJhd1R5cGUgUmVpbnRlcnByZXRCaXRzKGNvbnN0IEJpdHMgYml0cykgeworICAgIEZsb2F0aW5nUG9pbnQgZnAoMCk7CisgICAgZnAudV8uYml0c18gPSBiaXRzOworICAgIHJldHVybiBmcC51Xy52YWx1ZV87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdGhhdCByZXByZXNlbnQgcG9zaXRpdmUgaW5maW5pdHkuCisgIHN0YXRpYyBSYXdUeXBlIEluZmluaXR5KCkgeworICAgIHJldHVybiBSZWludGVycHJldEJpdHMoa0V4cG9uZW50Qml0TWFzayk7CisgIH0KKworICAvLyBOb24tc3RhdGljIG1ldGhvZHMKKworICAvLyBSZXR1cm5zIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50cyB0aGlzIG51bWJlci4KKyAgY29uc3QgQml0cyAmYml0cygpIGNvbnN0IHsgcmV0dXJuIHVfLmJpdHNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGlzIG51bWJlci4KKyAgQml0cyBleHBvbmVudF9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0V4cG9uZW50Qml0TWFzayAmIHVfLmJpdHNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGlzIG51bWJlci4KKyAgQml0cyBmcmFjdGlvbl9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0ZyYWN0aW9uQml0TWFzayAmIHVfLmJpdHNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgc2lnbiBiaXQgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgc2lnbl9iaXQoKSBjb25zdCB7IHJldHVybiBrU2lnbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBOQU4gKG5vdCBhIG51bWJlcikuCisgIGJvb2wgaXNfbmFuKCkgY29uc3QgeworICAgIC8vIEl0J3MgYSBOQU4gaWYgdGhlIGV4cG9uZW50IGJpdHMgYXJlIGFsbCBvbmVzIGFuZCB0aGUgZnJhY3Rpb24KKyAgICAvLyBiaXRzIGFyZSBub3QgZW50aXJlbHkgemVyb3MuCisgICAgcmV0dXJuIChleHBvbmVudF9iaXRzKCkgPT0ga0V4cG9uZW50Qml0TWFzaykgJiYgKGZyYWN0aW9uX2JpdHMoKSAhPSAwKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBudW1iZXIgaXMgYXQgbW9zdCBrTWF4VWxwcyBVTFAncyBhd2F5IGZyb20KKyAgLy8gcmhzLiAgSW4gcGFydGljdWxhciwgdGhpcyBmdW5jdGlvbjoKKyAgLy8KKyAgLy8gICAtIHJldHVybnMgZmFsc2UgaWYgZWl0aGVyIG51bWJlciBpcyAob3IgYm90aCBhcmUpIE5BTi4KKyAgLy8gICAtIHRyZWF0cyByZWFsbHkgbGFyZ2UgbnVtYmVycyBhcyBhbG1vc3QgZXF1YWwgdG8gaW5maW5pdHkuCisgIC8vICAgLSB0aGlua3MgKzAuMCBhbmQgLTAuMCBhcmUgMCBETFAncyBhcGFydC4KKyAgYm9vbCBBbG1vc3RFcXVhbHMoY29uc3QgRmxvYXRpbmdQb2ludCYgcmhzKSBjb25zdCB7CisgICAgLy8gVGhlIElFRUUgc3RhbmRhcmQgc2F5cyB0aGF0IGFueSBjb21wYXJpc29uIG9wZXJhdGlvbiBpbnZvbHZpbmcKKyAgICAvLyBhIE5BTiBtdXN0IHJldHVybiBmYWxzZS4KKyAgICBpZiAoaXNfbmFuKCkgfHwgcmhzLmlzX25hbigpKSByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gRGlzdGFuY2VCZXR3ZWVuU2lnbkFuZE1hZ25pdHVkZU51bWJlcnModV8uYml0c18sIHJocy51Xy5iaXRzXykKKyAgICAgICAgPD0ga01heFVscHM7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgYWN0dWFsIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgdW5pb24gRmxvYXRpbmdQb2ludFVuaW9uIHsKKyAgICBSYXdUeXBlIHZhbHVlXzsgIC8vIFRoZSByYXcgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAgIEJpdHMgYml0c187ICAgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIG51bWJlci4KKyAgfTsKKworICAvLyBDb252ZXJ0cyBhbiBpbnRlZ2VyIGZyb20gdGhlIHNpZ24tYW5kLW1hZ25pdHVkZSByZXByZXNlbnRhdGlvbiB0bworICAvLyB0aGUgYmlhc2VkIHJlcHJlc2VudGF0aW9uLiAgTW9yZSBwcmVjaXNlbHksIGxldCBOIGJlIDIgdG8gdGhlCisgIC8vIHBvd2VyIG9mIChrQml0Q291bnQgLSAxKSwgYW4gaW50ZWdlciB4IGlzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAvLyB1bnNpZ25lZCBudW1iZXIgeCArIE4uCisgIC8vCisgIC8vIEZvciBpbnN0YW5jZSwKKyAgLy8KKyAgLy8gICAtTiArIDEgKHRoZSBtb3N0IG5lZ2F0aXZlIG51bWJlciByZXByZXNlbnRhYmxlIHVzaW5nCisgIC8vICAgICAgICAgIHNpZ24tYW5kLW1hZ25pdHVkZSkgaXMgcmVwcmVzZW50ZWQgYnkgMTsKKyAgLy8gICAwICAgICAgaXMgcmVwcmVzZW50ZWQgYnkgTjsgYW5kCisgIC8vICAgTiAtIDEgICh0aGUgYmlnZ2VzdCBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZworICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDJOIC0gMS4KKyAgLy8KKyAgLy8gUmVhZCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NpZ25lZF9udW1iZXJfcmVwcmVzZW50YXRpb25zCisgIC8vIGZvciBtb3JlIGRldGFpbHMgb24gc2lnbmVkIG51bWJlciByZXByZXNlbnRhdGlvbnMuCisgIHN0YXRpYyBCaXRzIFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChjb25zdCBCaXRzICZzYW0pIHsKKyAgICBpZiAoa1NpZ25CaXRNYXNrICYgc2FtKSB7CisgICAgICAvLyBzYW0gcmVwcmVzZW50cyBhIG5lZ2F0aXZlIG51bWJlci4KKyAgICAgIHJldHVybiB+c2FtICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBwb3NpdGl2ZSBudW1iZXIuCisgICAgICByZXR1cm4ga1NpZ25CaXRNYXNrIHwgc2FtOworICAgIH0KKyAgfQorCisgIC8vIEdpdmVuIHR3byBudW1iZXJzIGluIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24sCisgIC8vIHJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBhcyBhbiB1bnNpZ25lZCBudW1iZXIuCisgIHN0YXRpYyBCaXRzIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKGNvbnN0IEJpdHMgJnNhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpdHMgJnNhbTIpIHsKKyAgICBjb25zdCBCaXRzIGJpYXNlZDEgPSBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoc2FtMSk7CisgICAgY29uc3QgQml0cyBiaWFzZWQyID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTIpOworICAgIHJldHVybiAoYmlhc2VkMSA+PSBiaWFzZWQyKSA/IChiaWFzZWQxIC0gYmlhc2VkMikgOiAoYmlhc2VkMiAtIGJpYXNlZDEpOworICB9CisKKyAgRmxvYXRpbmdQb2ludFVuaW9uIHVfOworfTsKKworLy8gVHlwZWRlZnMgdGhlIGluc3RhbmNlcyBvZiB0aGUgRmxvYXRpbmdQb2ludCB0ZW1wbGF0ZSBjbGFzcyB0aGF0IHdlCisvLyBjYXJlIHRvIHVzZS4KK3R5cGVkZWYgRmxvYXRpbmdQb2ludDxmbG9hdD4gRmxvYXQ7Cit0eXBlZGVmIEZsb2F0aW5nUG9pbnQ8ZG91YmxlPiBEb3VibGU7CisKKy8vIEluIG9yZGVyIHRvIGNhdGNoIHRoZSBtaXN0YWtlIG9mIHB1dHRpbmcgdGVzdHMgdGhhdCB1c2UgZGlmZmVyZW50CisvLyB0ZXN0IGZpeHR1cmUgY2xhc3NlcyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UsIHdlIG5lZWQgdG8gYXNzaWduCisvLyB1bmlxdWUgSURzIHRvIGZpeHR1cmUgY2xhc3NlcyBhbmQgY29tcGFyZSB0aGVtLiAgVGhlIFR5cGVJZCB0eXBlIGlzCisvLyB1c2VkIHRvIGhvbGQgc3VjaCBJRHMuICBUaGUgdXNlciBzaG91bGQgdHJlYXQgVHlwZUlkIGFzIGFuIG9wYXF1ZQorLy8gdHlwZTogdGhlIG9ubHkgb3BlcmF0aW9uIGFsbG93ZWQgb24gVHlwZUlkIHZhbHVlcyBpcyB0byBjb21wYXJlCisvLyB0aGVtIGZvciBlcXVhbGl0eSB1c2luZyB0aGUgPT0gb3BlcmF0b3IuCit0eXBlZGVmIGNvbnN0IHZvaWQqIFR5cGVJZDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlSWRIZWxwZXIgeworIHB1YmxpYzoKKyAgLy8gZHVtbXlfIG11c3Qgbm90IGhhdmUgYSBjb25zdCB0eXBlLiAgT3RoZXJ3aXNlIGFuIG92ZXJseSBlYWdlcgorICAvLyBjb21waWxlciAoZS5nLiBNU1ZDIDcuMSAmIDguMCkgbWF5IHRyeSB0byBtZXJnZQorICAvLyBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyBmb3IgZGlmZmVyZW50IFRzIGFzIGFuICJvcHRpbWl6YXRpb24iLgorICBzdGF0aWMgYm9vbCBkdW1teV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gPSBmYWxzZTsKKworLy8gR2V0VHlwZUlkPFQ+KCkgcmV0dXJucyB0aGUgSUQgb2YgdHlwZSBULiAgRGlmZmVyZW50IHZhbHVlcyB3aWxsIGJlCisvLyByZXR1cm5lZCBmb3IgZGlmZmVyZW50IHR5cGVzLiAgQ2FsbGluZyB0aGUgZnVuY3Rpb24gdHdpY2Ugd2l0aCB0aGUKKy8vIHNhbWUgdHlwZSBhcmd1bWVudCBpcyBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgc2FtZSBJRC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVHlwZUlkIEdldFR5cGVJZCgpIHsKKyAgLy8gVGhlIGNvbXBpbGVyIGlzIHJlcXVpcmVkIHRvIGFsbG9jYXRlIGEgZGlmZmVyZW50CisgIC8vIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfIHZhcmlhYmxlIGZvciBlYWNoIFQgdXNlZCB0byBpbnN0YW50aWF0ZQorICAvLyB0aGUgdGVtcGxhdGUuICBUaGVyZWZvcmUsIHRoZSBhZGRyZXNzIG9mIGR1bW15XyBpcyBndWFyYW50ZWVkIHRvCisgIC8vIGJlIHVuaXF1ZS4KKyAgcmV0dXJuICYoVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8pOworfQorCisvLyBSZXR1cm5zIHRoZSB0eXBlIElEIG9mIDo6dGVzdGluZzo6VGVzdC4gIEFsd2F5cyBjYWxsIHRoaXMgaW5zdGVhZAorLy8gb2YgR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gZ2V0IHRoZSB0eXBlIElEIG9mCisvLyA6OnRlc3Rpbmc6OlRlc3QsIGFzIHRoZSBsYXR0ZXIgbWF5IGdpdmUgdGhlIHdyb25nIHJlc3VsdCBkdWUgdG8gYQorLy8gc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QgYXMgYSBNYWMgT1MgWAorLy8gZnJhbWV3b3JrLgorR1RFU1RfQVBJXyBUeXBlSWQgR2V0VGVzdFR5cGVJZCgpOworCisvLyBEZWZpbmVzIHRoZSBhYnN0cmFjdCBmYWN0b3J5IGludGVyZmFjZSB0aGF0IGNyZWF0ZXMgaW5zdGFuY2VzCisvLyBvZiBhIFRlc3Qgb2JqZWN0LgorY2xhc3MgVGVzdEZhY3RvcnlCYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RGYWN0b3J5QmFzZSgpIHt9CisKKyAgLy8gQ3JlYXRlcyBhIHRlc3QgaW5zdGFuY2UgdG8gcnVuLiBUaGUgaW5zdGFuY2UgaXMgYm90aCBjcmVhdGVkIGFuZCBkZXN0cm95ZWQKKyAgLy8gd2l0aGluIFRlc3RJbmZvSW1wbDo6UnVuKCkKKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgPSAwOworCisgcHJvdGVjdGVkOgorICBUZXN0RmFjdG9yeUJhc2UoKSB7fQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0RmFjdG9yeUJhc2UpOworfTsKKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBUZWFzdEZhY3RvcnlCYXNlIGludGVyZmFjZS4KKy8vIEl0IGlzIHVzZWQgaW4gVEVTVCBhbmQgVEVTVF9GIG1hY3Jvcy4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+CitjbGFzcyBUZXN0RmFjdG9yeUltcGwgOiBwdWJsaWMgVGVzdEZhY3RvcnlCYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpIHsgcmV0dXJuIG5ldyBUZXN0Q2xhc3M7IH0KK307CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFByZWRpY2F0ZS1mb3JtYXR0ZXJzIGZvciBpbXBsZW1lbnRpbmcgdGhlIEhSRVNVTFQgY2hlY2tpbmcgbWFjcm9zCisvLyB7QVNTRVJUfEVYUEVDVH1fSFJFU1VMVF97U1VDQ0VFREVEfEZBSUxFRH0KKy8vIFdlIHBhc3MgYSBsb25nIGluc3RlYWQgb2YgSFJFU1VMVCB0byBhdm9pZCBjYXVzaW5nIGFuCisvLyBpbmNsdWRlIGRlcGVuZGVuY3kgZm9yIHRoZSBIUkVTVUxUIHR5cGUuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaHIpOyAgLy8gTk9MSU5UCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaHIpOyAgLy8gTk9MSU5UCisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUeXBlcyBvZiBTZXRVcFRlc3RDYXNlKCkgYW5kIFRlYXJEb3duVGVzdENhc2UoKSBmdW5jdGlvbnMuCit0eXBlZGVmIHZvaWQgKCpTZXRVcFRlc3RDYXNlRnVuYykoKTsKK3R5cGVkZWYgdm9pZCAoKlRlYXJEb3duVGVzdENhc2VGdW5jKSgpOworCisvLyBDcmVhdGVzIGEgbmV3IFRlc3RJbmZvIG9iamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggR29vZ2xlIFRlc3Q7CisvLyByZXR1cm5zIHRoZSBjcmVhdGVkIG9iamVjdC4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICB0ZXN0X2Nhc2VfbmFtZTogICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgbmFtZTogICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdAorLy8gICB0eXBlX3BhcmFtICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90ICBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIHZhbHVlX3BhcmFtICAgICAgIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QncyB2YWx1ZSBwYXJhbWV0ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgZml4dHVyZV9jbGFzc19pZDogSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcworLy8gICBzZXRfdXBfdGM6ICAgICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorLy8gICBmYWN0b3J5OiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIHRlc3Qgb2JqZWN0LgorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgbmV3bHkgY3JlYXRlZCBUZXN0SW5mbyBpbnN0YW5jZSB3aWxsIGFzc3VtZQorLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgorR1RFU1RfQVBJXyBUZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKKyAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKy8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0CisvLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKKy8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KK0dURVNUX0FQSV8gYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBTdGF0ZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCitjbGFzcyBHVEVTVF9BUElfIFR5cGVkVGVzdENhc2VQU3RhdGUgeworIHB1YmxpYzoKKyAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSgpIDogcmVnaXN0ZXJlZF8oZmFsc2UpIHt9CisKKyAgLy8gQWRkcyB0aGUgZ2l2ZW4gdGVzdCBuYW1lIHRvIGRlZmluZWRfdGVzdF9uYW1lc18gYW5kIHJldHVybiB0cnVlCisgIC8vIGlmIHRoZSB0ZXN0IGNhc2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGFib3J0cyB0aGUKKyAgLy8gcHJvZ3JhbS4KKyAgYm9vbCBBZGRUZXN0TmFtZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgeworICAgIGlmIChyZWdpc3RlcmVkXykgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBUZXN0ICVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgIgorICAgICAgICAgICAgICAiUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoJXMsIC4uLikuXG4iLAorICAgICAgICAgICAgICBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwgdGVzdF9uYW1lLCBjYXNlX25hbWUpOworICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICBwb3NpeDo6QWJvcnQoKTsKKyAgICB9CisgICAgZGVmaW5lZF90ZXN0X25hbWVzXy5pbnNlcnQodGVzdF9uYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgorICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKyAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KKyAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKKworIHByaXZhdGU6CisgIGJvb2wgcmVnaXN0ZXJlZF87CisgIDo6c3RkOjpzZXQ8Y29uc3QgY2hhcio+IGRlZmluZWRfdGVzdF9uYW1lc187Cit9OworCisvLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluICdzdHInOworLy8gcmV0dXJucyBOVUxMIGlmIG5vIGNvbW1hIGlzIGZvdW5kIGluICdzdHInLgoraW5saW5lIGNvbnN0IGNoYXIqIFNraXBDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlIChJc1NwYWNlKCooKytjb21tYSkpKSB7fQorICByZXR1cm4gY29tbWE7Cit9CisKKy8vIFJldHVybnMgdGhlIHByZWZpeCBvZiAnc3RyJyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hIGluIGl0OyByZXR1cm5zCisvLyB0aGUgZW50aXJlIHN0cmluZyBpZiBpdCBjb250YWlucyBubyBjb21tYS4KK2lubGluZSBTdHJpbmcgR2V0UHJlZml4VW50aWxDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICByZXR1cm4gY29tbWEgPT0gTlVMTCA/IFN0cmluZyhzdHIpIDogU3RyaW5nKHN0ciwgY29tbWEgLSBzdHIpOworfQorCisvLyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgYSBsaXN0IG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0LiAgVGhlCisvLyByZXR1cm4gdmFsdWUgaXMgaW5zaWduaWZpY2FudCAtIHdlIGp1c3QgbmVlZCB0byByZXR1cm4gc29tZXRoaW5nCisvLyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgR1RFU1RfVEVNUExBVEVfIG1hY3JvIGRlY2xhcmVzIGEgdGVtcGxhdGUKKy8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEl0J3MgZGVmaW5lZCBpbiBndGVzdC10eXBlLXV0aWwuaC4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3QgeworIHB1YmxpYzoKKyAgLy8gJ2luZGV4JyBpcyB0aGUgaW5kZXggb2YgdGhlIHRlc3QgaW4gdGhlIHR5cGUgbGlzdCAnVHlwZXMnCisgIC8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIFRlc3RDYXNlLAorICAvLyBUeXBlcykuICBWYWxpZCB2YWx1ZXMgZm9yICdpbmRleCcgYXJlIFswLCBOIC0gMV0gd2hlcmUgTiBpcyB0aGUKKyAgLy8gbGVuZ3RoIG9mIFR5cGVzLgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lcywgaW50IGluZGV4KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczo6SGVhZCBUeXBlOworICAgIHR5cGVkZWYgRml4dHVyZTxUeXBlPiBGaXh0dXJlQ2xhc3M7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBHVEVTVF9CSU5EXyhUZXN0U2VsLCBUeXBlKSBUZXN0Q2xhc3M7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXJzIHRoZSBmaXJzdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBpbiB0aGUgdHlwZQorICAgIC8vIGxpc3QuCisgICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgICAgIFN0cmluZzo6Rm9ybWF0KCIlcyVzJXMvJWQiLCBwcmVmaXgsIHByZWZpeFswXSA9PSAnXDAnID8gIiIgOiAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgaW5kZXgpLmNfc3RyKCksCisgICAgICAgIEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykuY19zdHIoKSwKKyAgICAgICAgR2V0VHlwZU5hbWU8VHlwZT4oKS5jX3N0cigpLAorICAgICAgICBOVUxMLCAgLy8gTm8gdmFsdWUgcGFyYW1ldGVyLgorICAgICAgICBHZXRUeXBlSWQ8Rml4dHVyZUNsYXNzPigpLAorICAgICAgICBUZXN0Q2xhc3M6OlNldFVwVGVzdENhc2UsCisgICAgICAgIFRlc3RDbGFzczo6VGVhckRvd25UZXN0Q2FzZSwKKyAgICAgICAgbmV3IFRlc3RGYWN0b3J5SW1wbDxUZXN0Q2xhc3M+KTsKKworICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHR5cGUgbGlzdC4KKyAgICByZXR1cm4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIHR5cGVuYW1lIFR5cGVzOjpUYWlsPgorICAgICAgICA6OlJlZ2lzdGVyKHByZWZpeCwgY2FzZV9uYW1lLCB0ZXN0X25hbWVzLCBpbmRleCArIDEpOworICB9Cit9OworCisvLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbD4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlczA+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIC8qcHJlZml4Ki8sIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovLCBpbnQgLyppbmRleCovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKy8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVzdHMsIFR5cGVzPjo6UmVnaXN0ZXIoKQorLy8gcmVnaXN0ZXJzICphbGwgY29tYmluYXRpb25zKiBvZiAnVGVzdHMnIGFuZCAnVHlwZXMnIHdpdGggR29vZ2xlCisvLyBUZXN0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybgorLy8gc29tZXRoaW5nIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCB0eXBlbmFtZSBUZXN0cywgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWVzKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0czo6SGVhZCBIZWFkOworCisgICAgLy8gRmlyc3QsIHJlZ2lzdGVyIHRoZSBmaXJzdCB0ZXN0IGluICdUZXN0JyBmb3IgZWFjaCB0eXBlIGluICdUeXBlcycuCisgICAgVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIEhlYWQsIFR5cGVzPjo6UmVnaXN0ZXIoCisgICAgICAgIHByZWZpeCwgY2FzZV9uYW1lLCB0ZXN0X25hbWVzLCAwKTsKKworICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHRlc3QgbGlzdC4KKyAgICByZXR1cm4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCB0eXBlbmFtZSBUZXN0czo6VGFpbCwgVHlwZXM+CisgICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIFNraXBDb21tYSh0ZXN0X25hbWVzKSk7CisgIH0KK307CisKKy8vIFRoZSBiYXNlIGNhc2UgZm9yIHRoZSBjb21waWxlIHRpbWUgcmVjdXJzaW9uLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVtcGxhdGVzMCwgVHlwZXM+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIC8qcHJlZml4Ki8sIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGEgU3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCisvLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitHVEVTVF9BUElfIFN0cmluZyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKFVuaXRUZXN0KiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwX2NvdW50KTsKKworLy8gSGVscGVycyBmb3Igc3VwcHJlc3Npbmcgd2FybmluZ3Mgb24gdW5yZWFjaGFibGUgY29kZSBvciBjb25zdGFudAorLy8gY29uZGl0aW9uLgorCisvLyBBbHdheXMgcmV0dXJucyB0cnVlLgorR1RFU1RfQVBJXyBib29sIEFsd2F5c1RydWUoKTsKKworLy8gQWx3YXlzIHJldHVybnMgZmFsc2UuCitpbmxpbmUgYm9vbCBBbHdheXNGYWxzZSgpIHsgcmV0dXJuICFBbHdheXNUcnVlKCk7IH0KKworLy8gSGVscGVyIGZvciBzdXBwcmVzc2luZyBmYWxzZSB3YXJuaW5nIGZyb20gQ2xhbmcgb24gYSBjb25zdCBjaGFyKgorLy8gdmFyaWFibGUgZGVjbGFyZWQgaW4gYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGFsd2F5cyBiZWluZyBOVUxMIGluCisvLyB0aGUgZWxzZSBicmFuY2guCitzdHJ1Y3QgR1RFU1RfQVBJXyBDb25zdENoYXJQdHIgeworICBDb25zdENoYXJQdHIoY29uc3QgY2hhciogc3RyKSA6IHZhbHVlKHN0cikge30KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgY29uc3QgY2hhciogdmFsdWU7Cit9OworCisvLyBBIHNpbXBsZSBMaW5lYXIgQ29uZ3J1ZW50aWFsIEdlbmVyYXRvciBmb3IgZ2VuZXJhdGluZyByYW5kb20KKy8vIG51bWJlcnMgd2l0aCBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uLiAgVW5saWtlIHJhbmQoKSBhbmQgc3JhbmQoKSwgaXQKKy8vIGRvZXNuJ3QgdXNlIGdsb2JhbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZSBjYW4ndCBpbnRlcmZlcmUgd2l0aCB1c2VyCisvLyBjb2RlKS4gIFVubGlrZSByYW5kX3IoKSwgaXQncyBwb3J0YWJsZS4gIEFuIExDRyBpc24ndCB2ZXJ5IHJhbmRvbSwKKy8vIGJ1dCBpdCdzIGdvb2QgZW5vdWdoIGZvciBvdXIgcHVycG9zZXMuCitjbGFzcyBHVEVTVF9BUElfIFJhbmRvbSB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgVUludDMyIGtNYXhSYW5nZSA9IDF1IDw8IDMxOworCisgIGV4cGxpY2l0IFJhbmRvbShVSW50MzIgc2VlZCkgOiBzdGF0ZV8oc2VlZCkge30KKworICB2b2lkIFJlc2VlZChVSW50MzIgc2VlZCkgeyBzdGF0ZV8gPSBzZWVkOyB9CisKKyAgLy8gR2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBmcm9tIFswLCByYW5nZSkuICBDcmFzaGVzIGlmICdyYW5nZScgaXMKKyAgLy8gMCBvciBncmVhdGVyIHRoYW4ga01heFJhbmdlLgorICBVSW50MzIgR2VuZXJhdGUoVUludDMyIHJhbmdlKTsKKworIHByaXZhdGU6CisgIFVJbnQzMiBzdGF0ZV87CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUmFuZG9tKTsKK307CisKKy8vIERlZmluaW5nIGEgdmFyaWFibGUgb2YgdHlwZSBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgVDI+IHdpbGwgY2F1c2UgYQorLy8gY29tcGlsZXIgZXJyb3IgaWZmIFQxIGFuZCBUMiBhcmUgZGlmZmVyZW50IHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VCwgVD4geworfTsKKworLy8gUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIGZyb20gYSB0eXBlIGlmIGl0IGlzIGEgcmVmZXJlbmNlIHR5cGUsCisvLyBvdGhlcndpc2UgbGVhdmVzIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMKKy8vIHRyMTo6cmVtb3ZlX3JlZmVyZW5jZSwgd2hpY2ggaXMgbm90IHdpZGVseSBhdmFpbGFibGUgeWV0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlIHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlbW92ZVJlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIFJlbW92ZVJlZmVyZW5jZSB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50CisvLyBUIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJlbW92ZVJlZmVyZW5jZTxUPjo6dHlwZQorCisvLyBSZW1vdmVzIGNvbnN0IGZyb20gYSB0eXBlIGlmIGl0IGlzIGEgY29uc3QgdHlwZSwgb3RoZXJ3aXNlIGxlYXZlcworLy8gaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0cjE6OnJlbW92ZV9jb25zdCwgd2hpY2ggaXMgbm90CisvLyB3aWRlbHkgYXZhaWxhYmxlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlbW92ZUNvbnN0IHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlbW92ZUNvbnN0PGNvbnN0IFQ+IHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gTVNWQyA4LjAsIFN1biBDKyssIGFuZCBJQk0gWEwgQysrIGhhdmUgYSBidWcgd2hpY2ggY2F1c2VzIHRoZSBhYm92ZQorLy8gZGVmaW5pdGlvbiB0byBmYWlsIHRvIHJlbW92ZSB0aGUgY29uc3QgaW4gJ2NvbnN0IGludFszXScgYW5kICdjb25zdAorLy8gY2hhclszXVs0XScuICBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9uIHdvcmtzIGFyb3VuZCB0aGUgYnVnLgorLy8gSG93ZXZlciwgaXQgY2F1c2VzIHRyb3VibGUgd2l0aCBHQ0MgYW5kIHRodXMgbmVlZHMgdG8gYmUKKy8vIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorc3RydWN0IFJlbW92ZUNvbnN0PGNvbnN0IFRbTl0+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVDb25zdDxUPjo6dHlwZSB0eXBlW05dOworfTsKKyNlbmRpZgorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIFJlbW92ZUNvbnN0IHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKKy8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfQ09OU1RfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVDb25zdDxUPjo6dHlwZQorCisvLyBUdXJucyBjb25zdCBVJiwgVSYsIGNvbnN0IFUsIGFuZCBVIGFsbCBpbnRvIFUuCisjZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUKSBcCisgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSkKKworLy8gQWRkcyByZWZlcmVuY2UgdG8gYSB0eXBlIGlmIGl0IGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlLAorLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCisvLyB0cjE6OmFkZF9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZmVyZW5jZSB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIEFkZFJlZmVyZW5jZSB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IFQKKy8vIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfQUREX1JFRkVSRU5DRV8oVCkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFkZFJlZmVyZW5jZTxUPjo6dHlwZQorCisvLyBBZGRzIGEgcmVmZXJlbmNlIHRvIGNvbnN0IG9uIHRvcCBvZiBUIGFzIG5lY2Vzc2FyeS4gIEZvciBleGFtcGxlLAorLy8gaXQgdHJhbnNmb3JtcworLy8KKy8vICAgY2hhciAgICAgICAgID09PiBjb25zdCBjaGFyJgorLy8gICBjb25zdCBjaGFyICAgPT0+IGNvbnN0IGNoYXImCisvLyAgIGNoYXImICAgICAgICA9PT4gY29uc3QgY2hhciYKKy8vICAgY29uc3QgY2hhciYgID09PiBjb25zdCBjaGFyJgorLy8KKy8vIFRoZSBhcmd1bWVudCBUIG11c3QgZGVwZW5kIG9uIHNvbWUgdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhUKSBcCisgICAgR1RFU1RfQUREX1JFRkVSRU5DRV8oY29uc3QgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCisKKy8vIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGJvb2wKKy8vIGNvbnN0YW50IHRoYXQncyB0cnVlIGlmZiB0eXBlIEZyb20gY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCisvLyB0eXBlIFRvLgordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorY2xhc3MgSW1wbGljaXRseUNvbnZlcnRpYmxlIHsKKyBwcml2YXRlOgorICAvLyBXZSBuZWVkIHRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBvbmx5IGZvciB0aGVpciB0eXBlcy4KKyAgLy8gVGhleSBoYXZlIG5vIGltcGxlbWVudGF0aW9ucy4KKworICAvLyBNYWtlRnJvbSgpIGlzIGFuIGV4cHJlc3Npb24gd2hvc2UgdHlwZSBpcyBGcm9tLiAgV2UgY2Fubm90IHNpbXBseQorICAvLyB1c2UgRnJvbSgpLCBhcyB0aGUgdHlwZSBGcm9tIG1heSBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0CisgIC8vIGNvbnN0cnVjdG9yLgorICBzdGF0aWMgRnJvbSBNYWtlRnJvbSgpOworCisgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIG92ZXJsb2FkZWQuICBHaXZlbiBhbiBleHByZXNzaW9uCisgIC8vIEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QgdmVyc2lvbiBpZiB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQorICAvLyBzZWNvbmQgdmVyc2lvbi4KKyAgLy8KKyAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQKKyAgLy8gdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAyLiAgVGhlcmVmb3JlLCBieSBjaGVja2luZyB0aGUKKyAgLy8gc2l6ZSBvZiBIZWxwZXIoeCksIHdoaWNoIGNhbiBiZSBkb25lIGF0IGNvbXBpbGUgdGltZSwgd2UgY2FuIHRlbGwKKyAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvLgorICBzdGF0aWMgY2hhciBIZWxwZXIoVG8pOworICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAorCisgIC8vIFdlIGhhdmUgdG8gcHV0IHRoZSAncHVibGljJyBzZWN0aW9uIGFmdGVyIHRoZSAncHJpdmF0ZScgc2VjdGlvbiwKKyAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuCisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGltcGxpY2l0bHkgY29udmVydGluZyBmcm9tIGRvdWJsZSB0byBpbnQgZm9yCisgIC8vIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YSwgc28gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZQorICAvLyB3YXJuaW5nLgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDI0NC4KKworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzaXplb2YoSGVscGVyKEltcGxpY2l0bHlDb252ZXJ0aWJsZTo6TWFrZUZyb20oKSkpID09IDE7CisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIC8vIEMrK0J1aWxkZXIgY2Fubm90IHVzZSBtZW1iZXIgb3ZlcmxvYWQgcmVzb2x1dGlvbiBkdXJpbmcgdGVtcGxhdGUKKyAgLy8gaW5zdGFudGlhdGlvbi4gIFRoZSBzaW1wbGVzdCB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpdHMgQysrMHggdHlwZSB0cmFpdHMKKyAgLy8gZnVuY3Rpb25zIChDKytCdWlsZGVyIDIwMDkgYW5kIGFib3ZlIG9ubHkpLgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfY29udmVydGlibGUoRnJvbSwgVG8pOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc2l6ZW9mKEhlbHBlcihJbXBsaWNpdGx5Q29udmVydGlibGU6Ok1ha2VGcm9tKCkpKSA9PSAxOworI2VuZGlmICAvLyBfTVNWX1ZFUgorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK2NvbnN0IGJvb2wgSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7CisKKy8vIElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0J3MKKy8vIHRydWUgaWZmIFQgaXMgdHlwZSBQcm90b2NvbE1lc3NhZ2UsIHByb3RvMjo6TWVzc2FnZSwgb3IgYSBzdWJjbGFzcworLy8gb2YgdGhvc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJc0FQcm90b2NvbE1lc3NhZ2UKKyAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PAorICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6UHJvdG9jb2xNZXNzYWdlKj46OnZhbHVlIHx8CisgIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpwcm90bzI6Ok1lc3NhZ2UqPjo6dmFsdWU+IHsKK307CisKKy8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KKy8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKKy8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQorLy8gdmFsaWQgdHlwZXMgYW5kIE5VTEwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZW0pLiAgSXQgd2lsbAorLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yCisvLyB0aGUgdHlwZSBvZiBhcmd1bWVudCAwLiAgSWYgQzo6aXRlcmF0b3Igb3IgQzo6Y29uc3RfaXRlcmF0b3IgaXMgbm90CisvLyBhIHZhbGlkIHR5cGUsIHRoZSBmaXJzdCBvdmVybG9hZCBpcyBub3QgdmlhYmxlLCBhbmQgdGhlIHNlY29uZAorLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzCisvLyBhIGNvbnRhaW5lciBjbGFzcyBieSBjaGVja2luZyB0aGUgdHlwZSBvZiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCkuCisvLyBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgaW5zaWduaWZpY2FudC4KKy8vCisvLyBOb3RlIHRoYXQgd2UgbG9vayBmb3IgYm90aCBDOjppdGVyYXRvciBhbmQgQzo6Y29uc3RfaXRlcmF0b3IuICBUaGUKKy8vIHJlYXNvbiBpcyB0aGF0IEMrKyBpbmplY3RzIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgYSBtZW1iZXIgb2YgdGhlCisvLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXIKKy8vICdpdGVyYXRvcicgb3IgJ2l0ZXJhdG9yOjppdGVyYXRvcicpLiAgSWYgd2UgbG9vayBmb3IgQzo6aXRlcmF0b3IKKy8vIG9ubHksIGZvciBleGFtcGxlLCB3ZSB3b3VsZCBtaXN0YWtlbmx5IHRoaW5rIHRoYXQgYSBjbGFzcyBuYW1lZAorLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4KKy8vCisvLyBBbHNvIG5vdGUgdGhhdCB0aGUgc2ltcGxlciBhcHByb2FjaCBvZiBvdmVybG9hZGluZworLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kCisvLyBJc0NvbnRhaW5lclRlc3QoLi4uKSBkb2Vzbid0IHdvcmsgd2l0aCBWaXN1YWwgQWdlIEMrKyBhbmQgU3VuIEMrKy4KK3R5cGVkZWYgaW50IElzQ29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc0NvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QoaW50IC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yKiAvKiBpdCAqLyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgeworICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBjaGFyIElzTm90Q29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQorCisvLyBFbmFibGVJZjxjb25kaXRpb24+Ojp0eXBlIGlzIHZvaWQgd2hlbiAnQ29uZCcgaXMgdHJ1ZSwgYW5kCisvLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbgorLy8gb3ZlcmxvYWQgb25seSBhcHBseSB3aGVuIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUsIGFkZAorLy8gInR5cGVuYW1lIEVuYWJsZUlmPGV4cHJlc3Npb24+Ojp0eXBlKiA9IDAiIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KK3RlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsKK3RlbXBsYXRlPD4gc3RydWN0IEVuYWJsZUlmPHRydWU+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLgorCisvLyBBcnJheUVxKCkgY29tcGFyZXMgdHdvIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5cyB1c2luZyB0aGUKKy8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzCisvLyAwLCBBcnJheUVxKCkgZGVnZW5lcmF0ZXMgaW50byBjb21wYXJpbmcgYSBzaW5nbGUgcGFpciBvZiB2YWx1ZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocyk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSBib29sIEFycmF5RXEoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIHsgcmV0dXJuIGxocyA9PSByaHM7IH0KKworLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgoraW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJyYXlFcShsaHMsIE4sIHJocyk7Cit9CisKKy8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKKy8vIHRoZSBwcmV2aW91cyBBcnJheUVxKCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcyB3b3VsZAorLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGlmICghaW50ZXJuYWw6OkFycmF5RXEobGhzW2ldLCByaHNbaV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpIHRoYXQKKy8vIGVxdWFscyBlbGVtLiAgRWxlbWVudCBtYXkgYmUgYSBuYXRpdmUgYXJyYXkgdHlwZSBpdHNlbGYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4KK0l0ZXIgQXJyYXlBd2FyZUZpbmQoSXRlciBiZWdpbiwgSXRlciBlbmQsIGNvbnN0IEVsZW1lbnQmIGVsZW0pIHsKKyAgZm9yIChJdGVyIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQorICAgICAgcmV0dXJuIGl0OworICB9CisgIHJldHVybiBlbmQ7Cit9CisKKy8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycKKy8vIG9wZXJhdG9yPSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcyAwLAorLy8gQ29weUFycmF5KCkgZGVnZW5lcmF0ZXMgaW50byBjb3B5aW5nIGEgc2luZ2xlIHZhbHVlLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3ZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0byk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9CisKKy8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUKCZmcm9tKVtOXSwgVSgqdG8pW05dKSB7CisgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbSwgTiwgKnRvKTsKK30KKworLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQorLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMKKy8vIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgordm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbVtpXSwgdG8gKyBpKTsKKyAgfQorfQorCisvLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQorLy8gbmF0aXZlIGFycmF5IGl0IHJlcHJlc2VudHMuCitlbnVtIFJlbGF0aW9uVG9Tb3VyY2UgeworICBrUmVmZXJlbmNlLCAgLy8gVGhlIE5hdGl2ZUFycmF5IHJlZmVyZW5jZXMgdGhlIG5hdGl2ZSBhcnJheS4KKyAga0NvcHkgICAgICAgIC8vIFRoZSBOYXRpdmVBcnJheSBtYWtlcyBhIGNvcHkgb2YgdGhlIG5hdGl2ZSBhcnJheSBhbmQKKyAgICAgICAgICAgICAgIC8vIG93bnMgdGhlIGNvcHkuCit9OworCisvLyBBZGFwdHMgYSBuYXRpdmUgYXJyYXkgdG8gYSByZWFkLW9ubHkgU1RMLXN0eWxlIGNvbnRhaW5lci4gIEluc3RlYWQKKy8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMKKy8vIG1lbWJlcnMgdXNlZnVsIGZvciBHb29nbGUgTW9jaydzIGNvbnRhaW5lciBtYXRjaGVycy4gIE5ldyBtZW1iZXJzCisvLyBzaG91bGQgYmUgYWRkZWQgYXMgbmVlZGVkLiAgVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5CisvLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yCisvLyByZWZlcmVuY2UgbW9kaWZpZXIpLiAgSXQncyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gc2F0aXNmeQorLy8gdGhpcyByZXF1aXJlbWVudC4gIEVsZW1lbnQgY2FuIGJlIGFuIGFycmF5IHR5cGUgaXRzZWxmIChoZW5jZQorLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBOYXRpdmVBcnJheSB7CisgcHVibGljOgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIHR5cGVkZWZzLgorICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKKworICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuCisgIE5hdGl2ZUFycmF5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgY291bnQsIFJlbGF0aW9uVG9Tb3VyY2UgcmVsYXRpb24pIHsKKyAgICBJbml0KGFycmF5LCBjb3VudCwgcmVsYXRpb24pOworICB9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgTmF0aXZlQXJyYXkoY29uc3QgTmF0aXZlQXJyYXkmIHJocykgeworICAgIEluaXQocmhzLmFycmF5XywgcmhzLnNpemVfLCByaHMucmVsYXRpb25fdG9fc291cmNlXyk7CisgIH0KKworICB+TmF0aXZlQXJyYXkoKSB7CisgICAgLy8gRW5zdXJlcyB0aGF0IHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgTmF0aXZlQXJyYXkgd2l0aCBhCisgICAgLy8gY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuCisgICAgc3RhdGljX2Nhc3Q8dm9pZD4oU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPEVsZW1lbnQsCisgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhFbGVtZW50KT4oKSk7CisgICAgaWYgKHJlbGF0aW9uX3RvX3NvdXJjZV8gPT0ga0NvcHkpCisgICAgICBkZWxldGVbXSBhcnJheV87CisgIH0KKworICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIG1ldGhvZHMuCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfICsgc2l6ZV87IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYKKyAgICAgICAgQXJyYXlFcShiZWdpbigpLCBzaXplKCksIHJocy5iZWdpbigpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3Q7IG1ha2VzIGEgY29weSBvZiB0aGUgaW5wdXQgYXJyYXkgaWYKKyAgLy8gJ3JlbGF0aW9uJyBpcyBrQ29weS4KKyAgdm9pZCBJbml0KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplLCBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uKSB7CisgICAgaWYgKHJlbGF0aW9uID09IGtSZWZlcmVuY2UpIHsKKyAgICAgIGFycmF5XyA9IGFycmF5OworICAgIH0gZWxzZSB7CisgICAgICBFbGVtZW50KiBjb25zdCBjb3B5ID0gbmV3IEVsZW1lbnRbYV9zaXplXTsKKyAgICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsKKyAgICAgIGFycmF5XyA9IGNvcHk7CisgICAgfQorICAgIHNpemVfID0gYV9zaXplOworICAgIHJlbGF0aW9uX3RvX3NvdXJjZV8gPSByZWxhdGlvbjsKKyAgfQorCisgIGNvbnN0IEVsZW1lbnQqIGFycmF5XzsKKyAgc2l6ZV90IHNpemVfOworICBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uX3RvX3NvdXJjZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhOYXRpdmVBcnJheSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNkZWZpbmUgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgbWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6QXNzZXJ0SGVscGVyKHJlc3VsdF90eXBlLCBmaWxlLCBsaW5lLCBtZXNzYWdlKSBcCisgICAgPSA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorCisjZGVmaW5lIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcCisgIEdURVNUX01FU1NBR0VfQVRfKF9fRklMRV9fLCBfX0xJTkVfXywgbWVzc2FnZSwgcmVzdWx0X3R5cGUpCisKKyNkZWZpbmUgR1RFU1RfRkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXAorICByZXR1cm4gR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSkKKworI2RlZmluZSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCisgIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpCisKKyNkZWZpbmUgR1RFU1RfU1VDQ0VTU18obWVzc2FnZSkgXAorICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKworLy8gU3VwcHJlc3NlcyBNU1ZDIHdhcm5pbmdzIDQwNzIgKHVucmVhY2hhYmxlIGNvZGUpIGZvciB0aGUgY29kZSBmb2xsb3dpbmcKKy8vIHN0YXRlbWVudCBpZiBpdCByZXR1cm5zIG9yIHRocm93cyAob3IgZG9lc24ndCByZXR1cm4gb3IgdGhyb3cgaW4gc29tZQorLy8gc2l0dWF0aW9ucykuCisjZGVmaW5lIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KSBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9CisKKyNkZWZpbmUgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29uc3RDaGFyUHRyIGd0ZXN0X21zZyA9ICIiKSB7IFwKKyAgICBib29sIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKGV4cGVjdGVkX2V4Y2VwdGlvbiBjb25zdCYpIHsgXAorICAgICAgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ3Rlc3RfbXNnLnZhbHVlID0gXAorICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICNleHBlY3RlZF9leGNlcHRpb24gIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3MgYSBkaWZmZXJlbnQgdHlwZS4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgICAgaWYgKCFndGVzdF9jYXVnaHRfZXhwZWN0ZWQpIHsgXAorICAgICAgZ3Rlc3RfbXNnLnZhbHVlID0gXAorICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICNleHBlY3RlZF9leGNlcHRpb24gIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3Mgbm90aGluZy4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoZ3Rlc3RfbXNnLnZhbHVlKQorCisjZGVmaW5lIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIHRyeSB7IFwKKyAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzLiIpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2FueSA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBndGVzdF9jYXVnaHRfYW55ID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2FueSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKQorCisKKy8vIEltcGxlbWVudHMgQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4gZXhwcmVzc2lvbiBjYW4gYmUKKy8vIGVpdGhlciBhIGJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbiBBc3NlcnRpb25SZXN1bHQuIHRleHQgaXMgYSB0ZXh0dWFsCisvLyByZXByZXNlbmF0aW9uIG9mIGV4cHJlc3Npb24gYXMgaXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBFWFBFQ1RfVFJVRS4KKyNkZWZpbmUgR1RFU1RfVEVTVF9CT09MRUFOXyhleHByZXNzaW9uLCB0ZXh0LCBhY3R1YWwsIGV4cGVjdGVkLCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0KGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKFwKKyAgICAgICAgZ3Rlc3RfYXJfLCB0ZXh0LCAjYWN0dWFsLCAjZXhwZWN0ZWQpLmNfc3RyKCkpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIgZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyOyBcCisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgaWYgKGd0ZXN0X2ZhdGFsX2ZhaWx1cmVfY2hlY2tlci5oYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub2ZhdGFsXywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCBnZW5lcmF0ZSBuZXcgZmF0YWwgIiBcCisgICAgICAgICAgICJmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2VzLiIpCisKKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZ2l2ZW4gdGVzdC4KKyNkZWZpbmUgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKy8vIEhlbHBlciBtYWNybyBmb3IgZGVmaW5pbmcgdGVzdHMuCisjZGVmaW5lIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIHBhcmVudF9jbGFzcywgcGFyZW50X2lkKVwKK2NsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgOiBwdWJsaWMgcGFyZW50X2NsYXNzIHtcCisgcHVibGljOlwKKyAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9XAorIHByaXZhdGU6XAorICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTtcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm9fIEdURVNUX0FUVFJJQlVURV9VTlVTRURfO1wKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTtcCit9O1wKK1wKKzo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIDo6dGVzdF9pbmZvXyA9XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKFwKKyAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCAjdGVzdF9uYW1lLCBOVUxMLCBOVUxMLCBcCisgICAgICAgIChwYXJlbnRfaWQpLCBcCisgICAgICAgIHBhcmVudF9jbGFzczo6U2V0VXBUZXN0Q2FzZSwgXAorICAgICAgICBwYXJlbnRfY2xhc3M6OlRlYXJEb3duVGVzdENhc2UsIFwKKyAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RGYWN0b3J5SW1wbDxcCisgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPik7XAordm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTQ3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8vIENvcHlyaWdodCAyMDAzIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IERhbiBFZ25vciAoZWdub3JAZ29vZ2xlLmNvbSkKKy8vCisvLyBBICJzbWFydCIgcG9pbnRlciB0eXBlIHdpdGggcmVmZXJlbmNlIHRyYWNraW5nLiAgRXZlcnkgcG9pbnRlciB0byBhCisvLyBwYXJ0aWN1bGFyIG9iamVjdCBpcyBrZXB0IG9uIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuICBXaGVuIHRoZSBsYXN0IHBvaW50ZXIKKy8vIHRvIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgcmVhc3NpZ25lZCwgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorLy8KKy8vIFVzZWQgcHJvcGVybHksIHRoaXMgZGVsZXRlcyB0aGUgb2JqZWN0IHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMgYXdheS4KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIGNhdmVhdHM6CisvLyAtIExpa2UgYWxsIHJlZmVyZW5jZSBjb3VudGluZyBzY2hlbWVzLCBjeWNsZXMgbGVhZCB0byBsZWFrcy4KKy8vIC0gRWFjaCBzbWFydCBwb2ludGVyIGlzIGFjdHVhbGx5IHR3byBwb2ludGVycyAoOCBieXRlcyBpbnN0ZWFkIG9mIDQpLgorLy8gLSBFdmVyeSB0aW1lIGEgcG9pbnRlciBpcyBhc3NpZ25lZCwgdGhlIGVudGlyZSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoYXQKKy8vICAgb2JqZWN0IGlzIHRyYXZlcnNlZC4gIFRoaXMgY2xhc3MgaXMgdGhlcmVmb3JlIE5PVCBTVUlUQUJMRSB3aGVuIHRoZXJlCisvLyAgIHdpbGwgb2Z0ZW4gYmUgbW9yZSB0aGFuIHR3byBvciB0aHJlZSBwb2ludGVycyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0LgorLy8gLSBSZWZlcmVuY2VzIGFyZSBvbmx5IHRyYWNrZWQgYXMgbG9uZyBhcyBsaW5rZWRfcHRyPD4gb2JqZWN0cyBhcmUgY29waWVkLgorLy8gICBJZiBhIGxpbmtlZF9wdHI8PiBpcyBjb252ZXJ0ZWQgdG8gYSByYXcgcG9pbnRlciBhbmQgYmFjaywgQkFEIFRISU5HUworLy8gICB3aWxsIGhhcHBlbiAoZG91YmxlIGRlbGV0aW9uKS4KKy8vCisvLyBBIGdvb2QgdXNlIG9mIHRoaXMgY2xhc3MgaXMgc3RvcmluZyBvYmplY3QgcmVmZXJlbmNlcyBpbiBTVEwgY29udGFpbmVycy4KKy8vIFlvdSBjYW4gc2FmZWx5IHB1dCBsaW5rZWRfcHRyPD4gaW4gYSB2ZWN0b3I8Pi4KKy8vIE90aGVyIHVzZXMgbWF5IG5vdCBiZSBhcyBnb29kLgorLy8KKy8vIE5vdGU6IElmIHlvdSB1c2UgYW4gaW5jb21wbGV0ZSB0eXBlIHdpdGggbGlua2VkX3B0cjw+LCB0aGUgY2xhc3MKKy8vICpjb250YWluaW5nKiBsaW5rZWRfcHRyPD4gbXVzdCBoYXZlIGEgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGV2ZW4KKy8vIGlmIHRoZXkgZG8gbm90aGluZyEpLgorLy8KKy8vIEJpbGwgR2liYm9ucyBzdWdnZXN0ZWQgd2UgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCisvLworLy8gVGhyZWFkIFNhZmV0eToKKy8vICAgVW5saWtlIG90aGVyIGxpbmtlZF9wdHIgaW1wbGVtZW50YXRpb25zLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisvLyAgIGEgbGlua2VkX3B0ciBvYmplY3QgaXMgdGhyZWFkLXNhZmUgaW4gdGhlIHNlbnNlIHRoYXQ6CisvLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSBsaW5rZWRfcHRyIG9iamVjdHMgY29uY3VycmVudGx5LAorLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgKmZyb20qIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdHMgdW5kZXJseWluZworLy8gICAgICAgcmF3IHBvaW50ZXIgKGUuZy4gdmlhIGdldCgpKSBjb25jdXJyZW50bHksIGFuZAorLy8gICAgIC0gaXQncyBzYWZlIHRvIHdyaXRlIHRvIHR3byBsaW5rZWRfcHRycyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisvLyAgICAgICBzaGFyZWQgb2JqZWN0IGNvbmN1cnJlbnRseS4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW5hbWUgdGhpcyB0byBzYWZlX2xpbmtlZF9wdHIgdG8gYXZvaWQKKy8vIGNvbmZ1c2lvbiB3aXRoIG5vcm1hbCBsaW5rZWRfcHRyLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm90ZWN0cyBjb3B5aW5nIG9mIGFsbCBsaW5rZWRfcHRyIG9iamVjdHMuCitHVEVTVF9BUElfIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisvLyBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBhbGwgaW5zdGFuY2VzIG9mIGxpbmtlZF9wdHI8Pi4gIEl0IG5lZWRzIHRvIGJlCisvLyBhIG5vbi10ZW1wbGF0ZSBjbGFzcyBiZWNhdXNlIGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyPD4gY2FuIHJlZmVyIHRvCisvLyB0aGUgc2FtZSBvYmplY3QgKGxpbmtlZF9wdHI8U3VwZXJjbGFzcz4ob2JqKSB2cyBsaW5rZWRfcHRyPFN1YmNsYXNzPihvYmopKS4KKy8vIFNvLCBpdCBuZWVkcyB0byBiZSBwb3NzaWJsZSBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHIgdG8gcGFydGljaXBhdGUKKy8vIGluIHRoZSBzYW1lIGNpcmN1bGFyIGxpbmtlZCBsaXN0LCBzbyB3ZSBuZWVkIGEgc2luZ2xlIGNsYXNzIHR5cGUgaGVyZS4KKy8vCisvLyBETyBOT1QgVVNFIFRISVMgQ0xBU1MgRElSRUNUTFkgWU9VUlNFTEYuICBVc2UgbGlua2VkX3B0cjxUPi4KK2NsYXNzIGxpbmtlZF9wdHJfaW50ZXJuYWwgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgbmV3IGNpcmNsZSB0aGF0IGluY2x1ZGVzIG9ubHkgdGhpcyBpbnN0YW5jZS4KKyAgdm9pZCBqb2luX25ldygpIHsKKyAgICBuZXh0XyA9IHRoaXM7CisgIH0KKworICAvLyBNYW55IGxpbmtlZF9wdHIgb3BlcmF0aW9ucyBtYXkgY2hhbmdlIHAubGlua18gZm9yIHNvbWUgbGlua2VkX3B0cgorICAvLyB2YXJpYWJsZSBwIGluIHRoZSBzYW1lIGNpcmNsZSBhcyB0aGlzIG9iamVjdC4gIFRoZXJlZm9yZSB3ZSBuZWVkCisgIC8vIHRvIHByZXZlbnQgdHdvIHN1Y2ggb3BlcmF0aW9ucyBmcm9tIG9jY3VycmluZyBjb25jdXJyZW50bHkuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciBvYmplY3RzIGNhbiBjb2V4aXN0IGluIGEKKyAgLy8gY2lyY2xlIChlLmcuIGxpbmtlZF9wdHI8QmFzZT4sIGxpbmtlZF9wdHI8RGVyaXZlZDE+LCBhbmQKKyAgLy8gbGlua2VkX3B0cjxEZXJpdmVkMj4pLiAgVGhlcmVmb3JlIHdlIG11c3QgdXNlIGEgc2luZ2xlIG11dGV4IHRvCisgIC8vIHByb3RlY3QgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4gIFRoaXMgY2FuIGNyZWF0ZSBzZXJpb3VzCisgIC8vIGNvbnRlbnRpb24gaW4gcHJvZHVjdGlvbiBjb2RlLCBidXQgaXMgYWNjZXB0YWJsZSBpbiBhIHRlc3RpbmcKKyAgLy8gZnJhbWV3b3JrLgorCisgIC8vIEpvaW4gYW4gZXhpc3RpbmcgY2lyY2xlLgorICAvLyBMIDwgZ19saW5rZWRfcHRyX211dGV4CisgIHZvaWQgam9pbihsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwdHIpIHsKKyAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKKworICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBwdHI7CisgICAgd2hpbGUgKHAtPm5leHRfICE9IHB0cikgcCA9IHAtPm5leHRfOworICAgIHAtPm5leHRfID0gdGhpczsKKyAgICBuZXh0XyA9IHB0cjsKKyAgfQorCisgIC8vIExlYXZlIHdoYXRldmVyIGNpcmNsZSB3ZSdyZSBwYXJ0IG9mLiAgUmV0dXJucyB0cnVlIGlmIHdlIHdlcmUgdGhlCisgIC8vIGxhc3QgbWVtYmVyIG9mIHRoZSBjaXJjbGUuICBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBqb2luKCkgYW5vdGhlci4KKyAgLy8gTCA8IGdfbGlua2VkX3B0cl9tdXRleAorICBib29sIGRlcGFydCgpIHsKKyAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKKworICAgIGlmIChuZXh0XyA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKyAgICBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwID0gbmV4dF87CisgICAgd2hpbGUgKHAtPm5leHRfICE9IHRoaXMpIHAgPSBwLT5uZXh0XzsKKyAgICBwLT5uZXh0XyA9IG5leHRfOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgbXV0YWJsZSBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBuZXh0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgbGlua2VkX3B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIC8vIFRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYSByYXcgcG9pbnRlci4gIFRoaXMgc2hvdWxkIGhhcHBlbiBhcyBzb29uIGFzCisgIC8vIHBvc3NpYmxlIGFmdGVyIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KKyAgZXhwbGljaXQgbGlua2VkX3B0cihUKiBwdHIgPSBOVUxMKSB7IGNhcHR1cmUocHRyKTsgfQorICB+bGlua2VkX3B0cigpIHsgZGVwYXJ0KCk7IH0KKworICAvLyBDb3B5IGFuIGV4aXN0aW5nIGxpbmtlZF9wdHI8PiwgYWRkaW5nIG91cnNlbHZlcyB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0cihsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsgY29weSgmcHRyKTsgfQorICBsaW5rZWRfcHRyKGxpbmtlZF9wdHIgY29uc3QmIHB0cikgeyAgLy8gTk9MSU5UCisgICAgYXNzZXJ0KCZwdHIgIT0gdGhpcyk7CisgICAgY29weSgmcHRyKTsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQgcmVsZWFzZXMgdGhlIG9sZCB2YWx1ZSBhbmQgYWNxdWlyZXMgdGhlIG5ldy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHImIG9wZXJhdG9yPShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsKKyAgICBkZXBhcnQoKTsKKyAgICBjb3B5KCZwdHIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGxpbmtlZF9wdHImIG9wZXJhdG9yPShsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsKKyAgICBpZiAoJnB0ciAhPSB0aGlzKSB7CisgICAgICBkZXBhcnQoKTsKKyAgICAgIGNvcHkoJnB0cik7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFNtYXJ0IHBvaW50ZXIgbWVtYmVycy4KKyAgdm9pZCByZXNldChUKiBwdHIgPSBOVUxMKSB7CisgICAgZGVwYXJ0KCk7CisgICAgY2FwdHVyZShwdHIpOworICB9CisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICp2YWx1ZV87IH0KKworICBib29sIG9wZXJhdG9yPT0oVCogcCkgY29uc3QgeyByZXR1cm4gdmFsdWVfID09IHA7IH0KKyAgYm9vbCBvcGVyYXRvciE9KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyAhPSBwOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yPT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyA9PSBwdHIuZ2V0KCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgb3BlcmF0b3IhPShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfICE9IHB0ci5nZXQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGZyaWVuZCBjbGFzcyBsaW5rZWRfcHRyOworCisgIFQqIHZhbHVlXzsKKyAgbGlua2VkX3B0cl9pbnRlcm5hbCBsaW5rXzsKKworICB2b2lkIGRlcGFydCgpIHsKKyAgICBpZiAobGlua18uZGVwYXJ0KCkpIGRlbGV0ZSB2YWx1ZV87CisgIH0KKworICB2b2lkIGNhcHR1cmUoVCogcHRyKSB7CisgICAgdmFsdWVfID0gcHRyOworICAgIGxpbmtfLmpvaW5fbmV3KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gdm9pZCBjb3B5KGxpbmtlZF9wdHI8VT4gY29uc3QqIHB0cikgeworICAgIHZhbHVlXyA9IHB0ci0+Z2V0KCk7CisgICAgaWYgKHZhbHVlXykKKyAgICAgIGxpbmtfLmpvaW4oJnB0ci0+bGlua18pOworICAgIGVsc2UKKyAgICAgIGxpbmtfLmpvaW5fbmV3KCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQorYm9vbCBvcGVyYXRvcj09KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgeworICByZXR1cm4gcHRyID09IHguZ2V0KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQorYm9vbCBvcGVyYXRvciE9KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgeworICByZXR1cm4gcHRyICE9IHguZ2V0KCk7Cit9CisKKy8vIEEgZnVuY3Rpb24gdG8gY29udmVydCBUKiBpbnRvIGxpbmtlZF9wdHI8VD4KKy8vIERvaW5nIGUuZy4gbWFrZV9saW5rZWRfcHRyKG5ldyBGb29CYXJCYXo8dHlwZT4oYXJnKSkgaXMgYSBzaG9ydGVyIG5vdGF0aW9uCisvLyBmb3IgbGlua2VkX3B0cjxGb29CYXJCYXo8dHlwZT4gPihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2xpbmtlZF9wdHI8VD4gbWFrZV9saW5rZWRfcHRyKFQqIHB0cikgeworICByZXR1cm4gbGlua2VkX3B0cjxUPihwdHIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTgyNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaApAQCAtMCwwICsxLDQ4MjIgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgorLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IEdvb2dsZSBUZXN0IHN1cHBvcnRzIGF0IG1vc3QgNTAgYXJndW1lbnRzIGluIFZhbHVlcywKKy8vIGFuZCBhdCBtb3N0IDEwIGFyZ3VtZW50cyBpbiBDb21iaW5lLiBQbGVhc2UgY29udGFjdAorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkIG1vcmUuCisvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIENvbWJpbmUgaXMgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRyMTo6dHVwbGUgd2hpY2ggaXMKKy8vIGN1cnJlbnRseSBzZXQgYXQgMTAuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisKKy8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKKy8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKKy8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4KKy8vIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLgordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KK1ZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKTsKKwordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAorICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVXNlZCBpbiB0aGUgVmFsdWVzKCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBwb2x5bW9ycGhpYyBjYXBhYmlsaXRpZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitjbGFzcyBWYWx1ZUFycmF5MSB7CisgcHVibGljOgorICBleHBsaWNpdCBWYWx1ZUFycmF5MShUMSB2MSkgOiB2MV8odjEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeyByZXR1cm4gVmFsdWVzSW4oJnYxXywgJnYxXyArIDEpOyB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIFZhbHVlQXJyYXkyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyKFQxIHYxLCBUMiB2MikgOiB2MV8odjEpLCB2Ml8odjIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBWYWx1ZUFycmF5MyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MyhUMSB2MSwgVDIgdjIsIFQzIHYzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgVmFsdWVBcnJheTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitjbGFzcyBWYWx1ZUFycmF5NSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgVmFsdWVBcnJheTYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NikgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIFZhbHVlQXJyYXk3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitjbGFzcyBWYWx1ZUFycmF5OCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICAgIFQ4IHY4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK2NsYXNzIFZhbHVlQXJyYXk5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICAgIFQ5IHY5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIFZhbHVlQXJyYXkxMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitjbGFzcyBWYWx1ZUFycmF5MTEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTExKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitjbGFzcyBWYWx1ZUFycmF5MTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2NsYXNzIFZhbHVlQXJyYXkxMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0PgorY2xhc3MgVmFsdWVBcnJheTE0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2NsYXNzIFZhbHVlQXJyYXkxNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgorY2xhc3MgVmFsdWVBcnJheTE2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNikgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitjbGFzcyBWYWx1ZUFycmF5MTcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAorICAgICAgVDE3IHYxNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgorY2xhc3MgVmFsdWVBcnJheTE4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgorY2xhc3MgVmFsdWVBcnJheTE5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitjbGFzcyBWYWx1ZUFycmF5MjAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorY2xhc3MgVmFsdWVBcnJheTIxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorY2xhc3MgVmFsdWVBcnJheTIyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitjbGFzcyBWYWx1ZUFycmF5MjMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sCisgICAgICAgIHYyM199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2NsYXNzIFZhbHVlQXJyYXkyNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitjbGFzcyBWYWx1ZUFycmF5MjUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICAgIFQyNSB2MjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK2NsYXNzIFZhbHVlQXJyYXkyNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitjbGFzcyBWYWx1ZUFycmF5MjcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4PgorY2xhc3MgVmFsdWVBcnJheTI4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5PgorY2xhc3MgVmFsdWVBcnJheTI5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitjbGFzcyBWYWx1ZUFycmF5MzAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorY2xhc3MgVmFsdWVBcnJheTMxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorY2xhc3MgVmFsdWVBcnJheTMyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyKSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitjbGFzcyBWYWx1ZUFycmF5MzMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgICBUMzMgdjMzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2NsYXNzIFZhbHVlQXJyYXkzNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitjbGFzcyBWYWx1ZUFycmF5MzUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAorICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKKyAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCisgICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sCisgICAgICAgIHYzNV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2NsYXNzIFZhbHVlQXJyYXkzNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCisgICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitjbGFzcyBWYWx1ZUFycmF5MzcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgorY2xhc3MgVmFsdWVBcnJheTM4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgorY2xhc3MgVmFsdWVBcnJheTM5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitjbGFzcyBWYWx1ZUFycmF5NDAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKKyAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCisgICAgICB2NDBfKHY0MCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgorY2xhc3MgVmFsdWVBcnJheTQxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKKyAgICAgIFQ0MSB2NDEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorY2xhc3MgVmFsdWVBcnJheTQyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+CitjbGFzcyBWYWx1ZUFycmF5NDMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLAorICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwKKyAgICAgIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgorY2xhc3MgVmFsdWVBcnJheTQ0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCisgICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLAorICAgICAgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwKKyAgICAgIHY0M18odjQzKSwgdjQ0Xyh2NDQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJfLCB2NDNfLCB2NDRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2NsYXNzIFZhbHVlQXJyYXk0NSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLAorICAgICAgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJfLCB2NDNfLCB2NDRfLCB2NDVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgorY2xhc3MgVmFsdWVBcnJheTQ2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK2NsYXNzIFZhbHVlQXJyYXk0NyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKKyAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksCisgICAgICB2NDdfKHY0Nykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV8sIHY0Nl8sCisgICAgICAgIHY0N199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitjbGFzcyBWYWx1ZUFycmF5NDggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCisgICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAorICAgICAgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwKKyAgICAgIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV8sIHY0Nl8sIHY0N18sCisgICAgICAgIHY0OF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitjbGFzcyBWYWx1ZUFycmF5NDkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwKKyAgICAgIFQ0OSB2NDkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksCisgICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2XywgdjQ3XywKKyAgICAgICAgdjQ4XywgdjQ5X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKKyAgY29uc3QgVDQ3IHY0N187CisgIGNvbnN0IFQ0OCB2NDhfOworICBjb25zdCBUNDkgdjQ5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK2NsYXNzIFZhbHVlQXJyYXk1MCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LAorICAgICAgVDUwIHY1MCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKKyAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpLCB2NTBfKHY1MCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV8sIHY0Nl8sIHY0N18sCisgICAgICAgIHY0OF8sIHY0OV8sIHY1MF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKKyAgY29uc3QgVDQ5IHY0OV87CisgIGNvbnN0IFQ1MCB2NTBfOworfTsKKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAorLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyKQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MikgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50Ml87CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjImIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMworICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MykKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDRfOworICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50NV87CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNgorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsCisgICAgICAgIFQ2PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDZfOworICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNiYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDdfOworICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDg+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKKyAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50OF87CisgICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7CisgICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87CisgICAgICAgICsrY3VycmVudDdfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKKyAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCisgICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCisgICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKKyAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCisgICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCisgICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKKyAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCisgICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCisgICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKKyAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAorICAgICAgICAgIGc5XyhnOSkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKKyAgICAgICAgZzdfLmJlZ2luKCksIGc4XywgZzhfLmJlZ2luKCksIGc5XywgZzlfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKKyAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksCisgICAgICAgICAgYmVnaW45XyhnOS5iZWdpbigpKSwgZW5kOV8oZzkuZW5kKCkpLCBjdXJyZW50OV8oY3VycmVudDkpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDlfOworICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgeworICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOworICAgICAgICArK2N1cnJlbnQ4XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKKyAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKKyAgICAgICAgKytjdXJyZW50N187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7CisgICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187CisgICAgICAgICsrY3VycmVudDZfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKKyAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgorICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCisgICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAorICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fAorICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fAorICAgICAgICAgIGN1cnJlbnQ5XyA9PSBlbmQ5XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3LCBUOCwgVDksIFQxMD4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpLCBnMTBfLCBnMTBfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpLCBnMTBfLCBnMTBfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3ImIGN1cnJlbnQxMCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSwKKyAgICAgICAgICBiZWdpbjEwXyhnMTAuYmVnaW4oKSksIGVuZDEwXyhnMTAuZW5kKCkpLCBjdXJyZW50MTBfKGN1cnJlbnQxMCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50MTBfOworICAgICAgaWYgKGN1cnJlbnQxMF8gPT0gZW5kMTBfKSB7CisgICAgICAgIGN1cnJlbnQxMF8gPSBiZWdpbjEwXzsKKyAgICAgICAgKytjdXJyZW50OV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7CisgICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87CisgICAgICAgICsrY3VycmVudDhfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKKyAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5XyAmJgorICAgICAgICAgIGN1cnJlbnQxMF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxMF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pLAorICAgICAgICBiZWdpbjEwXyhvdGhlci5iZWdpbjEwXyksCisgICAgICAgIGVuZDEwXyhvdGhlci5lbmQxMF8pLAorICAgICAgICBjdXJyZW50MTBfKG90aGVyLmN1cnJlbnQxMF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5XywgKmN1cnJlbnQxMF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV8gfHwKKyAgICAgICAgICBjdXJyZW50MTBfID09IGVuZDEwXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGJlZ2luMTBfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGVuZDEwXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBjdXJyZW50MTBfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMDo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4gZzEwXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKKworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdworLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCisvLyBjb252ZXJ0aWJsZSB0byBVLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIyKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjI8VDEsIFQyPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIyJiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyCisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIzKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM8VDEsIFQyLCBUMz4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yND4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDxUMSwgVDIsIFQzLCBUND4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjU+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1PFQxLCBUMiwgVDMsIFQ0LCBUNT4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNQorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI2KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNj4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICBUNz4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNworCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsCisgICAgICBUOD4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOAorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjk+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKKyAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAorICAgICAgICBUOT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87CisgIGNvbnN0IEdlbmVyYXRvcjkgZzlfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI5CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsCisgICAgY2xhc3MgR2VuZXJhdG9yOCwgY2xhc3MgR2VuZXJhdG9yOSwgY2xhc3MgR2VuZXJhdG9yMTA+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIxMChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LAorICAgIGNvbnN0IEdlbmVyYXRvcjkmIGc5LCBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAorICAgICAgICAgIGc5XyhnOSksIGcxMF8oZzEwKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5LCBUMTA+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICAgIFQ5LCBUMTA+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKKyAgICAgICAgICAgIFQxMD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxMD4gPihnMTBfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKKyAgY29uc3QgR2VuZXJhdG9yOSBnOV87CisgIGNvbnN0IEdlbmVyYXRvcjEwIGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwCisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlOTM4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcApAQCAtMCwwICsxLDMwMSBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskdmFyIG4gPSA1MCAgJCQgTWF4aW11bSBsZW5ndGggb2YgVmFsdWVzIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCiskdmFyIG1heHR1cGxlID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIENvbWJpbmUgYXJndW1lbnRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0ICRuIGFyZ3VtZW50cyBpbiBWYWx1ZXMsCisvLyBhbmQgYXQgbW9zdCAkbWF4dHVwbGUgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KKy8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHIxOjp0dXBsZSB3aGljaCBpcworLy8gY3VycmVudGx5IHNldCBhdCAkbWF4dHVwbGUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisKKy8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKKy8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKKy8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4KKy8vIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLgordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KK1ZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKTsKKwordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAorICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVXNlZCBpbiB0aGUgVmFsdWVzKCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBwb2x5bW9ycGhpYyBjYXBhYmlsaXRpZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitjbGFzcyBWYWx1ZUFycmF5MSB7CisgcHVibGljOgorICBleHBsaWNpdCBWYWx1ZUFycmF5MShUMSB2MSkgOiB2MV8odjEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeyByZXR1cm4gVmFsdWVzSW4oJnYxXywgJnYxXyArIDEpOyB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworfTsKKworJHJhbmdlIGkgMi4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCisKK3RlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CitjbGFzcyBWYWx1ZUFycmF5JGkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheSRpKCRmb3IgaiwgW1tUJGogdiRqXV0pIDogJGZvciBqLCBbW3YkKGopXyh2JGopXV0ge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0geyRmb3IgaiwgW1t2JChqKV9dXX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5JGkmIG90aGVyKTsKKworJGZvciBqIFtbCisKKyAgY29uc3QgVCRqIHYkKGopXzsKK11dCisKK307CisKK11dCisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB2YWx1ZXMgcHJvZHVjZWQKKy8vIGJ5IHRoZSBhcmd1bWVudCBnZW5lcmF0b3JzLgorLy8KKyRyYW5nZSBpIDIuLm1heHR1cGxlCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyRyYW5nZSBrIDIuLmkKKwordGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaQorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoJGZvciBqLCBbW2NvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4mIGckal1dKQorICAgICAgOiAkZm9yIGosIFtbZyQoailfKGckaildXSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICRmb3IgaiwgW1tnJChqKV8sIGckKGopXy5iZWdpbigpXV0pOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCAkZm9yIGosIFtbZyQoailfLCBnJChqKV8uZW5kKCldXSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwgJGZvciBqLCBbWworCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+JiBnJGosCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciYgY3VycmVudCQoaildXSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyRmb3IgaiwgW1sKKworICAgICAgICAgIGJlZ2luJChqKV8oZyRqLmJlZ2luKCkpLCBlbmQkKGopXyhnJGouZW5kKCkpLCBjdXJyZW50JChqKV8oY3VycmVudCRqKQorXV0gICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50JChpKV87CisKKyRmb3IgayBbWworICAgICAgaWYgKGN1cnJlbnQkKGkrMi1rKV8gPT0gZW5kJChpKzItaylfKSB7CisgICAgICAgIGN1cnJlbnQkKGkrMi1rKV8gPSBiZWdpbiQoaSsyLWspXzsKKyAgICAgICAgKytjdXJyZW50JChpKzItay0xKV87CisgICAgICB9CisKK11dCisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgkZm9yIGogICYmIFtbCisKKyAgICAgICAgICBjdXJyZW50JChqKV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQkKGopXworXV0pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLCAkZm9yIGosIFtbCisKKyAgICAgICAgYmVnaW4kKGopXyhvdGhlci5iZWdpbiQoailfKSwKKyAgICAgICAgZW5kJChqKV8ob3RoZXIuZW5kJChqKV8pLAorICAgICAgICBjdXJyZW50JChqKV8ob3RoZXIuY3VycmVudCQoailfKQorXV0geworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoJGZvciBqLCBbWypjdXJyZW50JChqKV9dXSk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorJGZvciBqICB8fCBbWworCisgICAgICAgICAgY3VycmVudCQoailfID09IGVuZCQoailfCitdXTsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorJGZvciBqIFtbCisKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciBiZWdpbiQoailfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGVuZCQoailfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGN1cnJlbnQkKGopXzsKK11dCisKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGk6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkmIG90aGVyKTsKKworCiskZm9yIGogW1sKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiBnJChqKV87CisKK11dCit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpCisKKworXV0KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKKy8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcworLy8gY29udmVydGlibGUgdG8gVS4KKy8vCiskcmFuZ2UgaSAyLi5tYXh0dXBsZQorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCisKK3RlbXBsYXRlIDwkZm9yIGosIFtbY2xhc3MgR2VuZXJhdG9yJGpdXT4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpKCRmb3IgaiwgW1tjb25zdCBHZW5lcmF0b3IkaiYgZyRqXV0pCisgICAgICA6ICRmb3IgaiwgW1tnJChqKV8oZyRqKV1dIHt9CisgIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGk8JGZvciBqLCBbW1Qkal1dPigKKyRmb3IgaixbWworCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQkaj4gPihnJChqKV8pCitdXSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSYgb3RoZXIpOworCisKKyRmb3IgaiBbWworICBjb25zdCBHZW5lcmF0b3IkaiBnJChqKV87CisKK11dCit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpCisKK11dCisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmOTcxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaApAQCAtMCwwICsxLDYxOSBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBPdXRwdXRzIGEgbWVzc2FnZSBleHBsYWluaW5nIGludmFsaWQgcmVnaXN0cmF0aW9uIG9mIGRpZmZlcmVudAorLy8gZml4dHVyZSBjbGFzcyBmb3IgdGhlIHNhbWUgdGVzdCBjYXNlLiBUaGlzIG1heSBoYXBwZW4gd2hlbgorLy8gVEVTVF9QIG1hY3JvIGlzIHVzZWQgdG8gZGVmaW5lIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUKKy8vIGJ1dCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcy4KK0dURVNUX0FQSV8gdm9pZCBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlOwordGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvcjsKKworLy8gSW50ZXJmYWNlIGZvciBpdGVyYXRpbmcgb3ZlciBlbGVtZW50cyBwcm92aWRlZCBieSBhbiBpbXBsZW1lbnRhdGlvbgorLy8gb2YgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UGFyYW1JdGVyYXRvckludGVyZmFjZSgpIHt9CisgIC8vIEEgcG9pbnRlciB0byB0aGUgYmFzZSBnZW5lcmF0b3IgaW5zdGFuY2UuCisgIC8vIFVzZWQgb25seSBmb3IgdGhlIHB1cnBvc2VzIG9mIGl0ZXJhdG9yIGNvbXBhcmlzb24KKyAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgdHdvIGl0ZXJhdG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgZ2VuZXJhdG9yLgorICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgPSAwOworICAvLyBBZHZhbmNlcyBpdGVyYXRvciB0byBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50CisgIC8vIHByb3ZpZGVkIGJ5IHRoZSBnZW5lcmF0b3IuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKyAgLy8gZm9yIG5vdCBjYWxsaW5nIEFkdmFuY2UoKSBvbiBhbiBpdGVyYXRvciBlcXVhbCB0bworICAvLyBCYXNlR2VuZXJhdG9yKCktPkVuZCgpLgorICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpID0gMDsKKyAgLy8gQ2xvbmVzIHRoZSBpdGVyYXRvciBvYmplY3QuIFVzZWQgZm9yIGltcGxlbWVudGluZyBjb3B5IHNlbWFudGljcworICAvLyBvZiBQYXJhbUl0ZXJhdG9yPFQ+LgorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UqIENsb25lKCkgY29uc3QgPSAwOworICAvLyBEZXJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgaXRlcmF0b3IgYW5kIHByb3ZpZGVzIChyZWFkLW9ubHkpIGFjY2VzcworICAvLyB0byB0aGUgcG9pbnRlZCB2YWx1ZS4gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IG5vdCB0byBjYWxsCisgIC8vIEN1cnJlbnQoKSBvbiBhbiBpdGVyYXRvciBlcXVhbCB0byBCYXNlR2VuZXJhdG9yKCktPkVuZCgpLgorICAvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgUGFyYW1HZW5lcmF0b3I8VD46Om9wZXJhdG9yKigpLgorICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCA9IDA7CisgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlcmF0b3IgYW5kIG90aGVyIHBvaW50IHRvIHRoZSBzYW1lCisgIC8vIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZ2VuZXJhdG9yLgorICAvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgUGFyYW1HZW5lcmF0b3I8VD46Om9wZXJhdG9yPT0oKS4KKyAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlJiBvdGhlcikgY29uc3QgPSAwOworfTsKKworLy8gQ2xhc3MgaXRlcmF0aW5nIG92ZXIgZWxlbWVudHMgcHJvdmlkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2YKKy8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+LiBJdCB3cmFwcyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+CisvLyBhbmQgaW1wbGVtZW50cyB0aGUgY29uc3QgZm9yd2FyZCBpdGVyYXRvciBjb25jZXB0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQYXJhbUl0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IFQmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworCisgIC8vIFBhcmFtSXRlcmF0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIGltcGxfIHBvaW50ZXIuCisgIFBhcmFtSXRlcmF0b3IoY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8tPkNsb25lKCkpIHt9CisgIFBhcmFtSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgeworICAgIGlmICh0aGlzICE9ICZvdGhlcikKKyAgICAgIGltcGxfLnJlc2V0KG90aGVyLmltcGxfLT5DbG9uZSgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqaW1wbF8tPkN1cnJlbnQoKTsgfQorICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPkN1cnJlbnQoKTsgfQorICAvLyBQcmVmaXggdmVyc2lvbiBvZiBvcGVyYXRvcisrLgorICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgIGltcGxfLT5BZHZhbmNlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vIFBvc3RmaXggdmVyc2lvbiBvZiBvcGVyYXRvcisrLgorICBQYXJhbUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50IC8qdW51c2VkKi8pIHsKKyAgICBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBjbG9uZSA9IGltcGxfLT5DbG9uZSgpOworICAgIGltcGxfLT5BZHZhbmNlKCk7CisgICAgcmV0dXJuIFBhcmFtSXRlcmF0b3IoY2xvbmUpOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiBpbXBsXy5nZXQoKSA9PSBvdGhlci5pbXBsXy5nZXQoKSB8fCBpbXBsXy0+RXF1YWxzKCpvdGhlci5pbXBsXyk7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUGFyYW1HZW5lcmF0b3I8VD47CisgIGV4cGxpY2l0IFBhcmFtSXRlcmF0b3IoUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQorICBzY29wZWRfcHRyPFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsKK307CisKKy8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGlzIHRoZSBiaW5hcnkgaW50ZXJmYWNlIHRvIGFjY2VzcyBnZW5lcmF0b3JzCisvLyBkZWZpbmVkIGluIG90aGVyIHRyYW5zbGF0aW9uIHVuaXRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIFQgUGFyYW1UeXBlOworCisgIHZpcnR1YWwgflBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlKCkge30KKworICAvLyBHZW5lcmF0b3IgaW50ZXJmYWNlIGRlZmluaXRpb24KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCA9IDA7Cit9OworCisvLyBXcmFwcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBhbmQgcHJvdmlkZXMgZ2VuZXJhbCBnZW5lcmF0b3Igc3ludGF4CisvLyBjb21wYXRpYmxlIHdpdGggdGhlIFNUTCBDb250YWluZXIgY29uY2VwdC4KKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBjb3B5IGluaXRpYWxpemF0aW9uIHNlbWFudGljcyBhbmQgdGhlIGNvbnRhaW5lZAorLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gaW5zdGFuY2UgaXMgc2hhcmVkIGFtb25nIGFsbCBjb3BpZXMKKy8vIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGF0IGluc3RhbmNlIGlzIGltbXV0YWJsZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBQYXJhbUdlbmVyYXRvciB7CisgcHVibGljOgorICB0eXBlZGVmIFBhcmFtSXRlcmF0b3I8VD4gaXRlcmF0b3I7CisKKyAgZXhwbGljaXQgUGFyYW1HZW5lcmF0b3IoUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30KKyAgUGFyYW1HZW5lcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3ImIG90aGVyKSA6IGltcGxfKG90aGVyLmltcGxfKSB7fQorCisgIFBhcmFtR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1HZW5lcmF0b3ImIG90aGVyKSB7CisgICAgaW1wbF8gPSBvdGhlci5pbXBsXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGltcGxfLT5CZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+RW5kKCkpOyB9CisKKyBwcml2YXRlOgorICBsaW5rZWRfcHRyPGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87Cit9OworCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gYSByYW5nZSBvZiB0d28gY29tcGFyYWJsZSB2YWx1ZXMuIENhbiBiZSB1c2VkIHRvCisvLyBnZW5lcmF0ZSBzZXF1ZW5jZXMgb2YgdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgaW1wbGVtZW50IG9wZXJhdG9yKygpIGFuZAorLy8gb3BlcmF0b3I8KCkuCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdGhlIFJhbmdlKCkgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2NsYXNzIFJhbmdlR2VuZXJhdG9yIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyBwdWJsaWM6CisgIFJhbmdlR2VuZXJhdG9yKFQgYmVnaW4sIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApCisgICAgICA6IGJlZ2luXyhiZWdpbiksIGVuZF8oZW5kKSwKKyAgICAgICAgc3RlcF8oc3RlcCksIGVuZF9pbmRleF8oQ2FsY3VsYXRlRW5kSW5kZXgoYmVnaW4sIGVuZCwgc3RlcCkpIHt9CisgIHZpcnR1YWwgflJhbmdlR2VuZXJhdG9yKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgYmVnaW5fLCAwLCBzdGVwXyk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBlbmRfLCBlbmRfaW5kZXhfLCBzdGVwXyk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLCBUIHZhbHVlLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgSW5jcmVtZW50VCBzdGVwKQorICAgICAgICA6IGJhc2VfKGJhc2UpLCB2YWx1ZV8odmFsdWUpLCBpbmRleF8oaW5kZXgpLCBzdGVwXyhzdGVwKSB7fQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgdmFsdWVfID0gdmFsdWVfICsgc3RlcF87CisgICAgICBpbmRleF8rKzsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgaW50IG90aGVyX2luZGV4ID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlciktPmluZGV4XzsKKyAgICAgIHJldHVybiBpbmRleF8gPT0gb3RoZXJfaW5kZXg7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksCisgICAgICAgICAgYmFzZV8ob3RoZXIuYmFzZV8pLCB2YWx1ZV8ob3RoZXIudmFsdWVfKSwgaW5kZXhfKG90aGVyLmluZGV4XyksCisgICAgICAgICAgc3RlcF8ob3RoZXIuc3RlcF8pIHt9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKKyAgICBUIHZhbHVlXzsKKyAgICBpbnQgaW5kZXhfOworICAgIGNvbnN0IEluY3JlbWVudFQgc3RlcF87CisgIH07ICAvLyBjbGFzcyBSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKKworICBzdGF0aWMgaW50IENhbGN1bGF0ZUVuZEluZGV4KGNvbnN0IFQmIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmNyZW1lbnRUJiBzdGVwKSB7CisgICAgaW50IGVuZF9pbmRleCA9IDA7CisgICAgZm9yIChUIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSA9IGkgKyBzdGVwKQorICAgICAgZW5kX2luZGV4Kys7CisgICAgcmV0dXJuIGVuZF9pbmRleDsKKyAgfQorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUmFuZ2VHZW5lcmF0b3ImIG90aGVyKTsKKworICBjb25zdCBUIGJlZ2luXzsKKyAgY29uc3QgVCBlbmRfOworICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOworICAvLyBUaGUgaW5kZXggZm9yIHRoZSBlbmQoKSBpdGVyYXRvci4gQWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkCisgIC8vIHNlcXVlbmNlIGFyZSBpbmRleGVkICgwLWJhc2VkKSB0byBhaWQgaXRlcmF0b3IgY29tcGFyaXNvbi4KKyAgY29uc3QgaW50IGVuZF9pbmRleF87Cit9OyAgLy8gY2xhc3MgUmFuZ2VHZW5lcmF0b3IKKworCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFVzZWQgaW4gdGhlCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uLiBUaGUgZWxlbWVudHMgYXJlIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UgcmFuZ2UKKy8vIHNpbmNlIHRoZSBzb3VyY2UgY2FuIGJlIGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBhbmQgdGhlIGdlbmVyYXRvcgorLy8gaXMgbGlrZWx5IHRvIHBlcnNpc3QgYmV5b25kIHRoYXQgc3RhY2sgZnJhbWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgorICBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKQorICAgICAgOiBjb250YWluZXJfKGJlZ2luLCBlbmQpIHt9CisgIHZpcnR1YWwgflZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGNvbnRhaW5lcl8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6dmVjdG9yPFQ+IENvbnRhaW5lclR5cGU7CisKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGJhc2UsCisgICAgICAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3IpCisgICAgICAgIDogYmFzZV8oYmFzZSksIGl0ZXJhdG9yXyhpdGVyYXRvcikge30KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgICsraXRlcmF0b3JfOworICAgICAgdmFsdWVfLnJlc2V0KCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgLy8gV2UgbmVlZCB0byB1c2UgY2FjaGVkIHZhbHVlIHJlZmVyZW5jZWQgYnkgaXRlcmF0b3JfIGJlY2F1c2UgKml0ZXJhdG9yXworICAgIC8vIGNhbiByZXR1cm4gYSB0ZW1wb3Jhcnkgb2JqZWN0IChhbmQgb2YgdHlwZSBvdGhlciB0aGVuIFQpLCBzbyBqdXN0CisgICAgLy8gaGF2aW5nICJyZXR1cm4gJippdGVyYXRvcl87IiBkb2Vzbid0IHdvcmsuCisgICAgLy8gdmFsdWVfIGlzIHVwZGF0ZWQgaGVyZSBhbmQgbm90IGluIEFkdmFuY2UoKSBiZWNhdXNlIEFkdmFuY2UoKQorICAgIC8vIGNhbiBhZHZhbmNlIGl0ZXJhdG9yXyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIGFuZCB3ZSBjYW5ub3QKKyAgICAvLyBkZXRlY3QgdGhhdCBmYWN0LiBUaGUgY2xpZW50IGNvZGUsIG9uIHRoZSBvdGhlciBoYW5kLCBpcworICAgIC8vIHJlc3BvbnNpYmxlIGZvciBub3QgY2FsbGluZyBDdXJyZW50KCkgb24gYW4gb3V0LW9mLXJhbmdlIGl0ZXJhdG9yLgorICAgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0IHsKKyAgICAgIGlmICh2YWx1ZV8uZ2V0KCkgPT0gTlVMTCkKKyAgICAgICAgdmFsdWVfLnJlc2V0KG5ldyBUKCppdGVyYXRvcl8pKTsKKyAgICAgIHJldHVybiB2YWx1ZV8uZ2V0KCk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBpdGVyYXRvcl8gPT0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlciktPml0ZXJhdG9yXzsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICAgIC8vIFRoZSBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIHN1cHByZXNzZXMgYSBmYWxzZSB3YXJuaW5nCisgICAgICAgICAgLy8gZW1pdHRlZCBieSBnY2Mgd2hlbiBzdXBwbGllZCB3aXRoIHRoZSAtV2V4dHJhIG9wdGlvbi4KKyAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksCisgICAgICAgICAgYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICAgIGl0ZXJhdG9yXyhvdGhlci5pdGVyYXRvcl8pIHt9CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87CisgICAgdHlwZW5hbWUgQ29udGFpbmVyVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3JfOworICAgIC8vIEEgY2FjaGVkIHZhbHVlIG9mICppdGVyYXRvcl8uIFdlIGtlZXAgaXQgaGVyZSB0byBhbGxvdyBhY2Nlc3MgYnkKKyAgICAvLyBwb2ludGVyIGluIHRoZSB3cmFwcGluZyBpdGVyYXRvcidzIG9wZXJhdG9yLT4oKS4KKyAgICAvLyB2YWx1ZV8gbmVlZHMgdG8gYmUgbXV0YWJsZSB0byBiZSBhY2Nlc3NlZCBpbiBDdXJyZW50KCkuCisgICAgLy8gVXNlIG9mIHNjb3BlZF9wdHIgaGVscHMgbWFuYWdlIGNhY2hlZCB2YWx1ZSdzIGxpZmV0aW1lLAorICAgIC8vIHdoaWNoIGlzIGJvdW5kIGJ5IHRoZSBsaWZlc3BhbiBvZiB0aGUgaXRlcmF0b3IgaXRzZWxmLgorICAgIG11dGFibGUgc2NvcGVkX3B0cjxjb25zdCBUPiB2YWx1ZV87CisgIH07ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3ImIG90aGVyKTsKKworICBjb25zdCBDb250YWluZXJUeXBlIGNvbnRhaW5lcl87Cit9OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gU3RvcmVzIGEgcGFyYW1ldGVyIHZhbHVlIGFuZCBsYXRlciBjcmVhdGVzIHRlc3RzIHBhcmFtZXRlcml6ZWQgd2l0aCB0aGF0CisvLyB2YWx1ZS4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+CitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkgOiBwdWJsaWMgVGVzdEZhY3RvcnlCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENsYXNzOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworICBleHBsaWNpdCBQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgOgorICAgICAgcGFyYW1ldGVyXyhwYXJhbWV0ZXIpIHt9CisgIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpIHsKKyAgICBUZXN0Q2xhc3M6OlNldFBhcmFtKCZwYXJhbWV0ZXJfKTsKKyAgICByZXR1cm4gbmV3IFRlc3RDbGFzcygpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBQYXJhbVR5cGUgcGFyYW1ldGVyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSk7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFRlc3RNZXRhRmFjdG9yeUJhc2UgaXMgYSBiYXNlIGNsYXNzIGZvciBtZXRhLWZhY3RvcmllcyB0aGF0IGNyZWF0ZQorLy8gdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50byBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyBmdW5jdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+CitjbGFzcyBUZXN0TWV0YUZhY3RvcnlCYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RNZXRhRmFjdG9yeUJhc2UoKSB7fQorCisgIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA9IDA7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFRlc3RNZXRhRmFjdG9yeSBjcmVhdGVzIHRlc3QgZmFjdG9yaWVzIGZvciBwYXNzaW5nIGludG8KKy8vIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLiBTaW5jZSBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyByZWNlaXZlcworLy8gb3duZXJzaGlwIG9mIHRlc3QgZmFjdG9yeSBwb2ludGVyLCBzYW1lIGZhY3Rvcnkgb2JqZWN0IGNhbm5vdCBiZSBwYXNzZWQKKy8vIGludG8gdGhhdCBtZXRob2QgdHdpY2UuIEJ1dCBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGlzIGdvaW5nIHRvIGNhbGwKKy8vIGl0IGZvciBlYWNoIFRlc3QvUGFyYW1ldGVyIHZhbHVlIGNvbWJpbmF0aW9uLiBUaHVzIGl0IG5lZWRzIG1ldGEgZmFjdG9yeQorLy8gY3JlYXRvciBjbGFzcy4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KK2NsYXNzIFRlc3RNZXRhRmFjdG9yeQorICAgIDogcHVibGljIFRlc3RNZXRhRmFjdG9yeUJhc2U8dHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKworICBUZXN0TWV0YUZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSB7CisgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkVGVzdEZhY3Rvcnk8VGVzdENhc2U+KHBhcmFtZXRlcik7CisgIH0KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdE1ldGFGYWN0b3J5KTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgaXMgYSBnZW5lcmljIGludGVyZmFjZQorLy8gdG8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBjbGFzc2VzLiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQorLy8gYWNjdW11bGF0ZXMgdGVzdCBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBURVNUX1AgbWFjcm8gaW52b2NhdGlvbnMKKy8vIGFuZCBnZW5lcmF0b3JzIHByb3ZpZGVkIGJ5IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGludm9jYXRpb25zCisvLyBhbmQgdXNlcyB0aGF0IGluZm9ybWF0aW9uIHRvIHJlZ2lzdGVyIGFsbCByZXN1bHRpbmcgdGVzdCBpbnN0YW5jZXMKKy8vIGluIFJlZ2lzdGVyVGVzdHMgbWV0aG9kLiBUaGUgUGFyYW1ldGVyaXplVGVzdENhc2VSZWdpc3RyeSBjbGFzcyBob2xkcworLy8gYSBjb2xsZWN0aW9uIG9mIHBvaW50ZXJzIHRvIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIG9iamVjdHMKKy8vIGFuZCBjYWxscyBSZWdpc3RlclRlc3RzKCkgb24gZWFjaCBvZiB0aGVtIHdoZW4gYXNrZWQuCitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9CisKKyAgLy8gQmFzZSBwYXJ0IG9mIHRlc3QgY2FzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgPSAwOworICAvLyBUZXN0IGNhc2UgaWQgdG8gdmVyaWZ5IGlkZW50aXR5LgorICB2aXJ0dWFsIFR5cGVJZCBHZXRUZXN0Q2FzZVR5cGVJZCgpIGNvbnN0ID0gMDsKKyAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzCisgIC8vIHRlc3QgY2FzZSByaWdodCBiZWZvcmUgcnVubmluZyB0aGVtIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uCisgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIG9uIGFueSBzaW5nbGUKKyAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpID0gMDsKKworIHByb3RlY3RlZDoKKyAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSk7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gYWNjdW11bGF0ZXMgdGVzdHMgb2J0YWluZWQgZnJvbSBURVNUX1AKKy8vIG1hY3JvIGludm9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlIGFuZCBnZW5lcmF0b3JzCisvLyBvYnRhaW5lZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGludm9jYXRpb25zIGZvciB0aGF0CisvLyB0ZXN0IGNhc2UuIEl0IHJlZ2lzdGVycyB0ZXN0cyB3aXRoIGFsbCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFsbAorLy8gZ2VuZXJhdG9ycyB3aGVuIGFza2VkLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyA6IHB1YmxpYyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7CisgcHVibGljOgorICAvLyBQYXJhbVR5cGUgYW5kIEdlbmVyYXRvckNyZWF0aW9uRnVuYyBhcmUgcHJpdmF0ZSB0eXBlcyBidXQgYXJlIHJlcXVpcmVkCisgIC8vIGZvciBkZWNsYXJhdGlvbnMgb2YgcHVibGljIG1ldGhvZHMgQWRkVGVzdFBhdHRlcm4oKSBhbmQKKyAgLy8gQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKCkuCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisgIC8vIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGFwcHJvcHJpYXRlIGdlbmVyYXRvciB0eXBlLgorICB0eXBlZGVmIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oR2VuZXJhdG9yQ3JlYXRpb25GdW5jKSgpOworCisgIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8oY29uc3QgY2hhciogbmFtZSkKKyAgICAgIDogdGVzdF9jYXNlX25hbWVfKG5hbWUpIHt9CisKKyAgLy8gVGVzdCBjYXNlIGJhc2UgbmFtZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEdldFRlc3RDYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXzsgfQorICAvLyBUZXN0IGNhc2UgaWQgdG8gdmVyaWZ5IGlkZW50aXR5LgorICB2aXJ0dWFsIFR5cGVJZCBHZXRUZXN0Q2FzZVR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuIEdldFR5cGVJZDxUZXN0Q2FzZT4oKTsgfQorICAvLyBURVNUX1AgbWFjcm8gdXNlcyBBZGRUZXN0UGF0dGVybigpIHRvIHJlY29yZCBpbmZvcm1hdGlvbgorICAvLyBhYm91dCBhIHNpbmdsZSB0ZXN0IGluIGEgTG9jYWxUZXN0SW5mbyBzdHJ1Y3R1cmUuCisgIC8vIHRlc3RfY2FzZV9uYW1lIGlzIHRoZSBiYXNlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSAod2l0aG91dCBpbnZvY2F0aW9uCisgIC8vIHByZWZpeCkuIHRlc3RfYmFzZV9uYW1lIGlzIHRoZSBuYW1lIG9mIGFuIGluZGl2aWR1YWwgdGVzdCB3aXRob3V0CisgIC8vIHBhcmFtZXRlciBpbmRleC4gRm9yIHRoZSB0ZXN0IFNlcXVlbmNlQS9Gb29UZXN0LkRvQmFyLzEgRm9vVGVzdCBpcworICAvLyB0ZXN0IGNhc2UgYmFzZSBuYW1lIGFuZCBEb0JhciBpcyB0ZXN0IGJhc2UgbmFtZS4KKyAgdm9pZCBBZGRUZXN0UGF0dGVybihjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIG1ldGFfZmFjdG9yeSkgeworICAgIHRlc3RzXy5wdXNoX2JhY2sobGlua2VkX3B0cjxUZXN0SW5mbz4obmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZmFjdG9yeSkpKTsKKyAgfQorICAvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyB1c2VzIEFkZEdlbmVyYXRvcigpIHRvIHJlY29yZCBpbmZvcm1hdGlvbgorICAvLyBhYm91dCBhIGdlbmVyYXRvci4KKyAgaW50IEFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihjb25zdCBzdHJpbmcmIGluc3RhbnRpYXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogZmlsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogbGluZSAqLykgeworICAgIGluc3RhbnRpYXRpb25zXy5wdXNoX2JhY2soOjpzdGQ6Om1ha2VfcGFpcihpbnN0YW50aWF0aW9uX25hbWUsIGZ1bmMpKTsKKyAgICByZXR1cm4gMDsgIC8vIFJldHVybiB2YWx1ZSB1c2VkIG9ubHkgdG8gcnVuIHRoaXMgbWV0aG9kIGluIG5hbWVzcGFjZSBzY29wZS4KKyAgfQorICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlCisgIC8vIHRlc3QgY2FzZXMgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGVzdHMgaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KKyAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQorICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCisgIC8vIFVuaXRUZXN0IGhhcyBhIGd1YXJkIHRvIHByZXZlbnQgZnJvbSBjYWxsaW5nIHRoaXMgbWV0aG9kIG1vcmUgdGhlbiBvbmNlLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsKKyAgICBmb3IgKHR5cGVuYW1lIFRlc3RJbmZvQ29udGFpbmVyOjppdGVyYXRvciB0ZXN0X2l0ID0gdGVzdHNfLmJlZ2luKCk7CisgICAgICAgICB0ZXN0X2l0ICE9IHRlc3RzXy5lbmQoKTsgKyt0ZXN0X2l0KSB7CisgICAgICBsaW5rZWRfcHRyPFRlc3RJbmZvPiB0ZXN0X2luZm8gPSAqdGVzdF9pdDsKKyAgICAgIGZvciAodHlwZW5hbWUgSW5zdGFudGlhdGlvbkNvbnRhaW5lcjo6aXRlcmF0b3IgZ2VuX2l0ID0KKyAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb25zXy5iZWdpbigpOyBnZW5faXQgIT0gaW5zdGFudGlhdGlvbnNfLmVuZCgpOworICAgICAgICAgICAgICAgKytnZW5faXQpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUgPSBnZW5faXQtPmZpcnN0OworICAgICAgICBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+IGdlbmVyYXRvcigoKmdlbl9pdC0+c2Vjb25kKSgpKTsKKworICAgICAgICBNZXNzYWdlIHRlc3RfY2FzZV9uYW1lX3N0cmVhbTsKKyAgICAgICAgaWYgKCAhaW5zdGFudGlhdGlvbl9uYW1lLmVtcHR5KCkgKQorICAgICAgICAgIHRlc3RfY2FzZV9uYW1lX3N0cmVhbSA8PCBpbnN0YW50aWF0aW9uX25hbWUgPDwgIi8iOworICAgICAgICB0ZXN0X2Nhc2VfbmFtZV9zdHJlYW0gPDwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfYmFzZV9uYW1lOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yICh0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+OjppdGVyYXRvciBwYXJhbV9pdCA9CisgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5iZWdpbigpOworICAgICAgICAgICAgIHBhcmFtX2l0ICE9IGdlbmVyYXRvci5lbmQoKTsgKytwYXJhbV9pdCwgKytpKSB7CisgICAgICAgICAgTWVzc2FnZSB0ZXN0X25hbWVfc3RyZWFtOworICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0gPDwgdGVzdF9pbmZvLT50ZXN0X2Jhc2VfbmFtZSA8PCAiLyIgPDwgaTsKKyAgICAgICAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgTlVMTCwgIC8vIE5vIHR5cGUgcGFyYW1ldGVyLgorICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKCpwYXJhbV9pdCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgR2V0VGVzdENhc2VUeXBlSWQoKSwKKyAgICAgICAgICAgICAgVGVzdENhc2U6OlNldFVwVGVzdENhc2UsCisgICAgICAgICAgICAgIFRlc3RDYXNlOjpUZWFyRG93blRlc3RDYXNlLAorICAgICAgICAgICAgICB0ZXN0X2luZm8tPnRlc3RfbWV0YV9mYWN0b3J5LT5DcmVhdGVUZXN0RmFjdG9yeSgqcGFyYW1faXQpKTsKKyAgICAgICAgfSAgLy8gZm9yIHBhcmFtX2l0CisgICAgICB9ICAvLyBmb3IgZ2VuX2l0CisgICAgfSAgLy8gZm9yIHRlc3RfaXQKKyAgfSAgLy8gUmVnaXN0ZXJUZXN0cworCisgcHJpdmF0ZToKKyAgLy8gTG9jYWxUZXN0SW5mbyBzdHJ1Y3R1cmUga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgdGVzdCByZWdpc3RlcmVkCisgIC8vIHdpdGggVEVTVF9QIG1hY3JvLgorICBzdHJ1Y3QgVGVzdEluZm8geworICAgIFRlc3RJbmZvKGNvbnN0IGNoYXIqIGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogYV90ZXN0X21ldGFfZmFjdG9yeSkgOgorICAgICAgICB0ZXN0X2Nhc2VfYmFzZV9uYW1lKGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSksCisgICAgICAgIHRlc3RfYmFzZV9uYW1lKGFfdGVzdF9iYXNlX25hbWUpLAorICAgICAgICB0ZXN0X21ldGFfZmFjdG9yeShhX3Rlc3RfbWV0YV9mYWN0b3J5KSB7fQorCisgICAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9iYXNlX25hbWU7CisgICAgY29uc3Qgc3RyaW5nIHRlc3RfYmFzZV9uYW1lOworICAgIGNvbnN0IHNjb3BlZF9wdHI8VGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+ID4gdGVzdF9tZXRhX2ZhY3Rvcnk7CisgIH07CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRlc3RJbmZvPiA+IFRlc3RJbmZvQ29udGFpbmVyOworICAvLyBLZWVwcyBwYWlycyBvZiA8SW5zdGFudGlhdGlvbiBuYW1lLCBTZXF1ZW5jZSBnZW5lcmF0b3IgY3JlYXRpb24gZnVuY3Rpb24+CisgIC8vIHJlY2VpdmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm9zLgorICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0cmluZywgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKj4gPgorICAgICAgSW5zdGFudGlhdGlvbkNvbnRhaW5lcjsKKworICBjb25zdCBzdHJpbmcgdGVzdF9jYXNlX25hbWVfOworICBUZXN0SW5mb0NvbnRhaW5lciB0ZXN0c187CisgIEluc3RhbnRpYXRpb25Db250YWluZXIgaW5zdGFudGlhdGlvbnNfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyk7Cit9OyAgLy8gY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnRhaW5zIGEgbWFwIG9mIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCisvLyBjbGFzc2VzIGFjY2Vzc2VkIGJ5IHRlc3QgY2FzZSBuYW1lcy4gVEVTVF9QIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUAorLy8gbWFjcm9zIHVzZSBpdCB0byBsb2NhdGUgdGhlaXIgY29ycmVzcG9uZGluZyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvCisvLyBkZXNjcmlwdG9ycy4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyBwdWJsaWM6CisgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KCkge30KKyAgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KCkgeworICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIGRlbGV0ZSAqaXQ7CisgICAgfQorICB9CisKKyAgLy8gTG9va3MgdXAgb3IgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0CisgIC8vIHRlc3RzIGFuZCBpbnN0YW50aWF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CisgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXIoCisgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICBpbnQgbGluZSkgeworICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiB0eXBlZF90ZXN0X2luZm8gPSBOVUxMOworICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VOYW1lKCkgPT0gdGVzdF9jYXNlX25hbWUpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5HZXRUZXN0Q2FzZVR5cGVJZCgpICE9IEdldFR5cGVJZDxUZXN0Q2FzZT4oKSkgeworICAgICAgICAgIC8vIENvbXBsYWluIGFib3V0IGluY29ycmVjdCB1c2FnZSBvZiBHb29nbGUgVGVzdCBmYWNpbGl0aWVzCisgICAgICAgICAgLy8gYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSBzaW5jZSB3ZSBjYW5ub3QgZ3VhcmFudHkgY29ycmVjdAorICAgICAgICAgIC8vIHRlc3QgY2FzZSBzZXR1cCBhbmQgdGVhci1kb3duIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKHRlc3RfY2FzZV9uYW1lLCAgZmlsZSwgbGluZSk7CisgICAgICAgICAgcG9zaXg6OkFib3J0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBvYmplY3Qgd2UgZm91bmQgaXMgb2YgdGhlIHNhbWUKKyAgICAgICAgICAvLyB0eXBlIHdlIGFyZSBsb29raW5nIGZvciwgc28gd2UgZG93bmNhc3QgaXQgdG8gdGhhdCB0eXBlCisgICAgICAgICAgLy8gd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KKyAgICAgICAgICB0eXBlZF90ZXN0X2luZm8gPSBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8CisgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+ID4oKml0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGVkX3Rlc3RfaW5mbyA9PSBOVUxMKSB7CisgICAgICB0eXBlZF90ZXN0X2luZm8gPSBuZXcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4odGVzdF9jYXNlX25hbWUpOworICAgICAgdGVzdF9jYXNlX2luZm9zXy5wdXNoX2JhY2sodHlwZWRfdGVzdF9pbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVkX3Rlc3RfaW5mbzsKKyAgfQorICB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgKCppdCktPlJlZ2lzdGVyVGVzdHMoKTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSo+IFRlc3RDYXNlSW5mb0NvbnRhaW5lcjsKKworICBUZXN0Q2FzZUluZm9Db250YWluZXIgdGVzdF9jYXNlX2luZm9zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdiNDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCkBAIC0wLDAgKzEsMTc3NSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gTG93LWxldmVsIHR5cGVzIGFuZCB1dGlsaXRpZXMgZm9yIHBvcnRpbmcgR29vZ2xlIFRlc3QgdG8gdmFyaW91cworLy8gcGxhdGZvcm1zLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFCisvLyBUSEVNIElOIFVTRVIgQ09ERS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisKKy8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0bworLy8gY29udHJvbCBHb29nbGUgVGVzdCdzIGJlaGF2aW9yLiAgSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgYSBtYWNybworLy8gaW4gdGhpcyBsaXN0LCBHb29nbGUgVGVzdCB3aWxsIGRlZmluZSBpdC4KKy8vCisvLyAgIEdURVNUX0hBU19DTE9ORSAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBjbG9uZSgyKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjpzdHJpbmcpLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6d3N0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6d3N0cmluZykuCisvLyAgIEdURVNUX0hBU19QT1NJWF9SRSAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBQT1NJWCByZWd1bGFyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZS9hcmVuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUFRIUkVBRCAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgPHB0aHJlYWQuaD4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUlRUSSAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUlRUSSBpcy9pc24ndAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfU1REX1dTVFJJTkcgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIGRvZXMvZG9lc24ndCB3b3JrIChHb29nbGUgVGVzdCBjYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB3aGVyZSBzdGQ6OndzdHJpbmcgaXMgdW5hdmFpbGFibGUpLgorLy8gICBHVEVTVF9IQVNfVFIxX1RVUExFICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRyMTo6dHVwbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfU0VIICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzICJTdHJ1Y3R1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGluZyIuCisvLyAgIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSBzdXBwb3J0cyBJL08gc3RyZWFtIHJlZGlyZWN0aW9uIHVzaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCgpIGFuZCBkdXAyKCkuCisvLyAgIEdURVNUX1VTRV9PV05fVFIxX1RVUExFICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciBHb29nbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuICBVbnVzZWQgd2hlbiB0aGUgdXNlciBzZXRzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19UUjFfVFVQTEUgdG8gMC4KKy8vICAgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERlZmluZSB0byAxIHdoZW4gY29tcGlsaW5nIHRlc3RzIHRoYXQgdXNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2dsZSBUZXN0IGFzIGEgc2hhcmVkIGxpYnJhcnkgKGtub3duIGFzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMTCBvbiBXaW5kb3dzKS4KKy8vICAgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERlZmluZSB0byAxIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGl0c2VsZgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdXRpbGl0aWVzOgorLy8KKy8vIE1hY3JvcyBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHBsYXRmb3JtIChkZWZpbmVkIHRvIDEgaWYgY29tcGlsZWQgb24KKy8vIHRoZSBnaXZlbiBwbGF0Zm9ybTsgb3RoZXJ3aXNlIHVuZGVmaW5lZCk6CisvLyAgIEdURVNUX09TX0FJWCAgICAgIC0gSUJNIEFJWAorLy8gICBHVEVTVF9PU19DWUdXSU4gICAtIEN5Z3dpbgorLy8gICBHVEVTVF9PU19IUFVYICAgICAtIEhQLVVYCisvLyAgIEdURVNUX09TX0xJTlVYICAgIC0gTGludXgKKy8vICAgICBHVEVTVF9PU19MSU5VWF9BTkRST0lEIC0gR29vZ2xlIEFuZHJvaWQKKy8vICAgR1RFU1RfT1NfTUFDICAgICAgLSBNYWMgT1MgWAorLy8gICBHVEVTVF9PU19OQUNMICAgICAtIEdvb2dsZSBOYXRpdmUgQ2xpZW50IChOYUNsKQorLy8gICBHVEVTVF9PU19TT0xBUklTICAtIFN1biBTb2xhcmlzCisvLyAgIEdURVNUX09TX1NZTUJJQU4gIC0gU3ltYmlhbgorLy8gICBHVEVTVF9PU19XSU5ET1dTICAtIFdpbmRvd3MgKERlc2t0b3AsIE1pbkdXLCBvciBNb2JpbGUpCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICAtIFdpbmRvd3MgRGVza3RvcAorLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgICAgLSBNaW5HVworLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAgLSBXaW5kb3dzIE1vYmlsZQorLy8gICBHVEVTVF9PU19aT1MgICAgICAtIHovT1MKKy8vCisvLyBBbW9uZyB0aGUgcGxhdGZvcm1zLCBDeWd3aW4sIExpbnV4LCBNYXggT1MgWCwgYW5kIFdpbmRvd3MgaGF2ZSB0aGUKKy8vIG1vc3Qgc3RhYmxlIHN1cHBvcnQuICBTaW5jZSBjb3JlIG1lbWJlcnMgb2YgdGhlIEdvb2dsZSBUZXN0IHByb2plY3QKKy8vIGRvbid0IGhhdmUgYWNjZXNzIHRvIG90aGVyIHBsYXRmb3Jtcywgc3VwcG9ydCBmb3IgdGhlbSBtYXkgYmUgbGVzcworLy8gc3RhYmxlLiAgSWYgeW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIChwYXRjaGVzIGZvciBmaXhpbmcgdGhlbSBhcmUKKy8vIGV2ZW4gbW9yZSB3ZWxjb21lISkuCisvLworLy8gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgbm9uZSBvZiB0aGUgR1RFU1RfT1NfKiBtYWNyb3MgYXJlIGRlZmluZWQuCisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgYXZhaWxhYmxlIEdvb2dsZSBUZXN0IGZlYXR1cmVzIChkZWZpbmVkIHRvIDEgaWYKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgc3VwcG9ydGVkOyBvdGhlcndpc2UgdW5kZWZpbmVkKToKKy8vICAgR1RFU1RfSEFTX0NPTUJJTkUgICAgICAtIHRoZSBDb21iaW5lKCkgZnVuY3Rpb24gKGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKy8vICAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgICAtIGRlYXRoIHRlc3RzCisvLyAgIEdURVNUX0hBU19QQVJBTV9URVNUICAgLSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX0hBU19UWVBFRF9URVNUICAgLSB0eXBlZCB0ZXN0cworLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVF9QIC0gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX1VTRVNfUE9TSVhfUkUgICAgLSBlbmhhbmNlZCBQT1NJWCByZWdleCBpcyB1c2VkLiBEbyBub3QgY29uZnVzZSB3aXRoCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfUE9TSVhfUkUgKHNlZSBhYm92ZSkgd2hpY2ggdXNlcnMgY2FuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgdGhlbXNlbHZlcy4KKy8vICAgR1RFU1RfVVNFU19TSU1QTEVfUkUgICAtIG91ciBvd24gc2ltcGxlIHJlZ2V4IGlzIHVzZWQ7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdHdvIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisvLyAgIEdURVNUX0NBTl9DT01QQVJFX05VTEwgLSBhY2NlcHRzIHVudHlwZWQgTlVMTCBpbiBFWFBFQ1RfRVEoKS4KKy8vCisvLyBNYWNyb3MgZm9yIGJhc2ljIEMrKyBjb2Rpbmc6CisvLyAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIC0gZm9yIGRpc2FibGluZyBhIGdjYyB3YXJuaW5nLgorLy8gICBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyAgLSBkZWNsYXJlcyB0aGF0IGEgY2xhc3MnIGluc3RhbmNlcyBvciBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRvbid0IGhhdmUgdG8gYmUgdXNlZC4KKy8vICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyAgIC0gZGlzYWJsZXMgb3BlcmF0b3I9LgorLy8gICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fIC0gZGlzYWJsZXMgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0uCisvLyAgIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gICAtIGRlY2xhcmVzIHRoYXQgYSBmdW5jdGlvbidzIHJlc3VsdCBtdXN0IGJlIHVzZWQuCisvLworLy8gU3luY2hyb25pemF0aW9uOgorLy8gICBNdXRleCwgTXV0ZXhMb2NrLCBUaHJlYWRMb2NhbCwgR2V0VGhyZWFkQ291bnQoKQorLy8gICAgICAgICAgICAgICAgICAtIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgorLy8gICBHVEVTVF9JU19USFJFQURTQUZFIC0gZGVmaW5lZCB0byAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGFib3ZlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBoYXZlIHJlYWwgaW1wbGVtZW50YXRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgR29vZ2xlIFRlc3QgaXMgdGhyZWFkLXNhZmU7IG9yIDAgb3RoZXJ3aXNlLgorLy8KKy8vIFRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmc6CisvLyAgIGlzX3BvaW50ZXIgICAgIC0gYXMgaW4gVFIxOyBuZWVkZWQgb24gU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIG9ubHkuCisvLyAgIEl0ZXJhdG9yVHJhaXRzIC0gcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0cywgd2hpY2gKKy8vICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIGluIGxpYkNzdGQgd2hlbiBjb21waWxlZCB3aXRoIFN1biBDKysuCisvLworLy8gU21hcnQgcG9pbnRlcnM6CisvLyAgIHNjb3BlZF9wdHIgICAgIC0gYXMgaW4gVFIyLgorLy8KKy8vIFJlZ3VsYXIgZXhwcmVzc2lvbnM6CisvLyAgIFJFICAgICAgICAgICAgIC0gYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGNsYXNzIHVzaW5nIHRoZSBQT1NJWAorLy8gICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXggb24gVU5JWC1saWtlCisvLyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zLCBvciBhIHJlZHVjZWQgcmVndWxhciBleGNlcHRpb24gc3ludGF4IG9uCisvLyAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGxhdGZvcm1zLCBpbmNsdWRpbmcgV2luZG93cy4KKy8vCisvLyBMb2dnaW5nOgorLy8gICBHVEVTVF9MT0dfKCkgICAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisvLworLy8gU3Rkb3V0IGFuZCBzdGRlcnIgY2FwdHVyaW5nOgorLy8gICBDYXB0dXJlU3Rkb3V0KCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCisvLyAgIEdldENhcHR1cmVkU3Rkb3V0KCkgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgorLy8gICBDYXB0dXJlU3RkZXJyKCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyKCkgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgorLy8KKy8vIEludGVnZXIgdHlwZXM6CisvLyAgIFR5cGVXaXRoU2l6ZSAgIC0gbWFwcyBhbiBpbnRlZ2VyIHRvIGEgaW50IHR5cGUuCisvLyAgIEludDMyLCBVSW50MzIsIEludDY0LCBVSW50NjQsIFRpbWVJbk1pbGxpcworLy8gICAgICAgICAgICAgICAgICAtIGludGVnZXJzIG9mIGtub3duIHNpemVzLgorLy8gICBCaWdnZXN0SW50ICAgICAtIHRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuCisvLworLy8gQ29tbWFuZC1saW5lIHV0aWxpdGllczoKKy8vICAgR1RFU1RfRkxBRygpICAgICAgIC0gcmVmZXJlbmNlcyBhIGZsYWcuCisvLyAgIEdURVNUX0RFQ0xBUkVfKigpICAtIGRlY2xhcmVzIGEgZmxhZy4KKy8vICAgR1RFU1RfREVGSU5FXyooKSAgIC0gZGVmaW5lcyBhIGZsYWcuCisvLyAgIEdldEFyZ3ZzKCkgICAgICAgICAtIHJldHVybnMgdGhlIGNvbW1hbmQgbGluZSBhcyBhIHZlY3RvciBvZiBzdHJpbmdzLgorLy8KKy8vIEVudmlyb25tZW50IHZhcmlhYmxlIHV0aWxpdGllczoKKy8vICAgR2V0RW52KCkgICAgICAgICAgICAgLSBnZXRzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy8vICAgQm9vbEZyb21HVGVzdEVudigpICAgLSBwYXJzZXMgYSBib29sIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBJbnQzMkZyb21HVGVzdEVudigpICAtIHBhcnNlcyBhbiBJbnQzMiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy8vICAgU3RyaW5nRnJvbUdUZXN0RW52KCkgLSBwYXJzZXMgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyNpbmNsdWRlIDxjdHlwZS5oPiAgIC8vIGZvciBpc3NwYWNlLCBldGMKKyNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBwdHJkaWZmX3QKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfV0lOMzJfV0NFCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmICAvLyAhX1dJTjMyX1dDRQorCisjaW5jbHVkZSA8aW9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RyaW5nPiAgLy8gTk9MSU5UCisKKyNkZWZpbmUgR1RFU1RfREVWX0VNQUlMXyAiZ29vZ2xldGVzdGZyYW1ld29ya0BAZ29vZ2xlZ3JvdXBzLmNvbSIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfICJndGVzdF8iCisjZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfICJndGVzdC0iCisjZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiR1RFU1RfIgorI2RlZmluZSBHVEVTVF9OQU1FXyAiR29vZ2xlIFRlc3QiCisjZGVmaW5lIEdURVNUX1BST0pFQ1RfVVJMXyAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvIgorCisvLyBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIGdjYyB0aGF0IGlzIHVzZWQgdG8gY29tcGlsZSB0aGlzLgorI2lmZGVmIF9fR05VQ19fCisvLyA0MDMwMiBtZWFucyB2ZXJzaW9uIDQuMy4yLgorIyBkZWZpbmUgR1RFU1RfR0NDX1ZFUl8gXAorICAgIChfX0dOVUNfXyoxMDAwMCArIF9fR05VQ19NSU5PUl9fKjEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjZW5kaWYgIC8vIF9fR05VQ19fCisKKy8vIERldGVybWluZXMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIEdvb2dsZSBUZXN0IGlzIGNvbXBpbGVkLgorI2lmZGVmIF9fQ1lHV0lOX18KKyMgZGVmaW5lIEdURVNUX09TX0NZR1dJTiAxCisjZWxpZiBkZWZpbmVkIF9fU1lNQklBTjMyX18KKyMgZGVmaW5lIEdURVNUX09TX1NZTUJJQU4gMQorI2VsaWYgZGVmaW5lZCBfV0lOMzIKKyMgZGVmaW5lIEdURVNUX09TX1dJTkRPV1MgMQorIyBpZmRlZiBfV0lOMzJfV0NFCisjICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgMQorIyBlbGlmIGRlZmluZWQoX19NSU5HV19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgMQorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QIDEKKyMgZW5kaWYgIC8vIF9XSU4zMl9XQ0UKKyNlbGlmIGRlZmluZWQgX19BUFBMRV9fCisjIGRlZmluZSBHVEVTVF9PU19NQUMgMQorI2VsaWYgZGVmaW5lZCBfX2xpbnV4X18KKyMgZGVmaW5lIEdURVNUX09TX0xJTlVYIDEKKyMgaWZkZWYgQU5EUk9JRAorIyAgZGVmaW5lIEdURVNUX09TX0xJTlVYX0FORFJPSUQgMQorIyBlbmRpZiAgLy8gQU5EUk9JRAorI2VsaWYgZGVmaW5lZCBfX01WU19fCisjIGRlZmluZSBHVEVTVF9PU19aT1MgMQorI2VsaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX1NWUjQpCisjIGRlZmluZSBHVEVTVF9PU19TT0xBUklTIDEKKyNlbGlmIGRlZmluZWQoX0FJWCkKKyMgZGVmaW5lIEdURVNUX09TX0FJWCAxCisjZWxpZiBkZWZpbmVkKF9faHB1eCkKKyMgZGVmaW5lIEdURVNUX09TX0hQVVggMQorI2VsaWYgZGVmaW5lZCBfX25hdGl2ZV9jbGllbnRfXworIyBkZWZpbmUgR1RFU1RfT1NfTkFDTCAxCisjZW5kaWYgIC8vIF9fQ1lHV0lOX18KKworLy8gQnJpbmdzIGluIGRlZmluaXRpb25zIGZvciBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4CisvLyBuYW1lc3BhY2UgKHJlYWQsIHdyaXRlLCBjbG9zZSwgY2hkaXIsIGlzYXR0eSwgc3RhdCkuIFdlIGRvIG5vdCBjdXJyZW50bHkKKy8vIHVzZSB0aGVtIG9uIFdpbmRvd3MgTW9iaWxlLgorI2lmICFHVEVTVF9PU19XSU5ET1dTCisvLyBUaGlzIGFzc3VtZXMgdGhhdCBub24tV2luZG93cyBPU2VzIHByb3ZpZGUgdW5pc3RkLmguIEZvciBPU2VzIHdoZXJlIHRoaXMKKy8vIGlzIG5vdCB0aGUgY2FzZSwgd2UgbmVlZCB0byBpbmNsdWRlIGhlYWRlcnMgdGhhdCBwcm92aWRlIHRoZSBmdW5jdGlvbnMKKy8vIG1lbnRpb25lZCBhYm92ZS4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmICFHVEVTVF9PU19OQUNMCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZW1vdmUgdGhpcyBjb25kaXRpb24gd2hlbiBOYXRpdmUgQ2xpZW50IFNESyBhZGRzCisvLyBzdHJpbmdzLmggKHRyYWNrZWQgaW4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9uYXRpdmVjbGllbnQvaXNzdWVzL2RldGFpbD9pZD0xMTc1KS4KKyMgIGluY2x1ZGUgPHN0cmluZ3MuaD4gIC8vIE5hdGl2ZSBDbGllbnQgZG9lc24ndCBwcm92aWRlIHN0cmluZ3MuaC4KKyMgZW5kaWYKKyNlbGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCisvLyBEZWZpbmVzIHRoaXMgdG8gdHJ1ZSBpZmYgR29vZ2xlIFRlc3QgY2FuIHVzZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zLgorI2lmbmRlZiBHVEVTVF9IQVNfUE9TSVhfUkUKKyMgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoIUdURVNUX09TX1dJTkRPV1MpCisjZW5kaWYKKworI2lmIEdURVNUX0hBU19QT1NJWF9SRQorCisvLyBPbiBzb21lIHBsYXRmb3JtcywgPHJlZ2V4Lmg+IG5lZWRzIHNvbWVvbmUgdG8gZGVmaW5lIHNpemVfdCwgYW5kCisvLyB3b24ndCBjb21waWxlIG90aGVyd2lzZS4gIFdlIGNhbiAjaW5jbHVkZSBpdCBoZXJlIGFzIHdlIGFscmVhZHkKKy8vIGluY2x1ZGVkIDxzdGRsaWIuaD4sIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gZGVmaW5lIHNpemVfdCB0aHJvdWdoCisvLyA8c3RkZGVmLmg+LgorIyBpbmNsdWRlIDxyZWdleC5oPiAgLy8gTk9MSU5UCisKKyMgZGVmaW5lIEdURVNUX1VTRVNfUE9TSVhfUkUgMQorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIDxyZWdleC5oPiBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuICBVc2Ugb3VyIG93biBzaW1wbGUgcmVnZXgKKy8vIGltcGxlbWVudGF0aW9uIGluc3RlYWQuCisjIGRlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCisKKyNlbHNlCisKKy8vIDxyZWdleC5oPiBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAgVXNlIG91ciBvd24KKy8vIHNpbXBsZSByZWdleCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QT1NJWF9SRQorCisjaWZuZGVmIEdURVNUX0hBU19FWENFUFRJT05TCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisjIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorLy8gTVNWQydzIGFuZCBDKytCdWlsZGVyJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTVEwgdXNlIHRoZSBfSEFTX0VYQ0VQVElPTlMKKy8vIG1hY3JvIHRvIGVuYWJsZSBleGNlcHRpb25zLCBzbyB3ZSdsbCBkbyB0aGUgc2FtZS4KKy8vIEFzc3VtZXMgdGhhdCBleGNlcHRpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisjICBpZm5kZWYgX0hBU19FWENFUFRJT05TCisjICAgZGVmaW5lIF9IQVNfRVhDRVBUSU9OUyAxCisjICBlbmRpZiAgLy8gX0hBU19FWENFUFRJT05TCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgX0hBU19FWENFUFRJT05TCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19FWENFUFRJT05TCisvLyBnY2MgZGVmaW5lcyBfX0VYQ0VQVElPTlMgdG8gMSBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsaWYgZGVmaW5lZChfX1NVTlBST19DQykKKy8vIFN1biBQcm8gQ0Mgc3VwcG9ydHMgZXhjZXB0aW9ucy4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGNvbXBpbGUtdGltZSB3YXkgb2YKKy8vIGRldGVjdGluZyB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3Igbm90LiAgVGhlcmVmb3JlLCB3ZSBhc3N1bWUgdGhhdAorLy8gdGhleSBhcmUgZW5hYmxlZCB1bmxlc3MgdGhlIHVzZXIgdGVsbHMgdXMgb3RoZXJ3aXNlLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIF9fRVhDRVBUSU9OUworLy8geGxDIGRlZmluZXMgX19FWENFUFRJT05TIHRvIDEgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisvLyBFeGNlcHRpb24gaGFuZGxpbmcgaXMgaW4gZWZmZWN0IGJ5IGRlZmF1bHQgaW4gSFAgYUNDIGNvbXBpbGVyLiBJdCBoYXMgdG8KKy8vIGJlIHR1cm5lZCBvZiBieSArbm9laCBjb21waWxlciBvcHRpb24gaWYgZGVzaXJlZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsc2UKKy8vIEZvciBvdGhlciBjb21waWxlcnMsIHdlIGFzc3VtZSBleGNlcHRpb25zIGFyZSBkaXNhYmxlZCB0byBiZQorLy8gY29uc2VydmF0aXZlLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDAKKyMgZW5kaWYgIC8vIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisjaWYgIWRlZmluZWQoR1RFU1RfSEFTX1NURF9TVFJJTkcpCisvLyBFdmVuIHRob3VnaCB3ZSBkb24ndCB1c2UgdGhpcyBtYWNybyBhbnkgbG9uZ2VyLCB3ZSBrZWVwIGl0IGluIGNhc2UKKy8vIHNvbWUgY2xpZW50cyBzdGlsbCBkZXBlbmQgb24gaXQuCisjIGRlZmluZSBHVEVTVF9IQVNfU1REX1NUUklORyAxCisjZWxpZiAhR1RFU1RfSEFTX1NURF9TVFJJTkcKKy8vIFRoZSB1c2VyIHRvbGQgdXMgdGhhdCA6OnN0ZDo6c3RyaW5nIGlzbid0IGF2YWlsYWJsZS4KKyMgZXJyb3IgIkdvb2dsZSBUZXN0IGNhbm5vdCBiZSB1c2VkIHdoZXJlIDo6c3RkOjpzdHJpbmcgaXNuJ3QgYXZhaWxhYmxlLiIKKyNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfSEFTX1NURF9TVFJJTkcpCisKKyNpZm5kZWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjpzdHJpbmcgaXMgYXZhaWxhYmxlLCBzbyB3ZSBuZWVkCisvLyB0byBmaWd1cmUgaXQgb3V0LgorCisjIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAwCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworI2lmbmRlZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjpzdGQ6OndzdHJpbmcgaXMgYXZhaWxhYmxlLCBzbyB3ZSBuZWVkCisvLyB0byBmaWd1cmUgaXQgb3V0LgorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHVzZXMgYXV0b2NvbmYgdG8gZGV0ZWN0IHdoZXRoZXIgOjpzdGQ6OndzdHJpbmcKKy8vICAgaXMgYXZhaWxhYmxlLgorCisvLyBDeWd3aW4gMS43IGFuZCBiZWxvdyBkb2Vzbid0IHN1cHBvcnQgOjpzdGQ6OndzdHJpbmcuCisvLyBTb2xhcmlzJyBsaWJjKysgZG9lc24ndCBzdXBwb3J0IGl0IGVpdGhlci4gIEFuZHJvaWQgaGFzCisvLyBubyBzdXBwb3J0IGZvciBpdCBhdCBsZWFzdCBhcyByZWNlbnQgYXMgRnJveW8gKDIuMikuCisjIGRlZmluZSBHVEVTVF9IQVNfU1REX1dTVFJJTkcgXAorICAgICghKEdURVNUX09TX0xJTlVYX0FORFJPSUQgfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NPTEFSSVMpKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWZuZGVmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OndzdHJpbmcgaXMgYXZhaWxhYmxlLCBzbyB3ZSBuZWVkCisvLyB0byBmaWd1cmUgaXQgb3V0LgorIyBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIFwKKyAgICAoR1RFU1RfSEFTX1NURF9XU1RSSU5HICYmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIFJUVEkgaXMgYXZhaWxhYmxlLgorI2lmbmRlZiBHVEVTVF9IQVNfUlRUSQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQsIHNvIHdlIG5lZWQgdG8KKy8vIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWZkZWYgX01TQ19WRVIKKworIyAgaWZkZWYgX0NQUFJUVEkgIC8vIE1TVkMgZGVmaW5lcyB0aGlzIG1hY3JvIGlmZiBSVFRJIGlzIGVuYWJsZWQuCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYKKworLy8gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDQuMy4yLCBnY2MgZGVmaW5lcyBfX0dYWF9SVFRJIGlmZiBSVFRJIGlzIGVuYWJsZWQuCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMzAyKQorCisjICBpZmRlZiBfX0dYWF9SVFRJCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYgIC8vIF9fR1hYX1JUVEkKKworLy8gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDkuMCBJQk0gVmlzdWFsIEFnZSBkZWZpbmVzIF9fUlRUSV9BTExfXyB0byAxIGlmCisvLyBib3RoIHRoZSB0eXBlaWQgYW5kIGR5bmFtaWNfY2FzdCBmZWF0dXJlcyBhcmUgcHJlc2VudC4KKyMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDkwMCkKKworIyAgaWZkZWYgX19SVFRJX0FMTF9fCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYKKworIyBlbHNlCisKKy8vIEZvciBhbGwgb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgUlRUSSBpcyBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKworIyBlbmRpZiAgLy8gX01TQ19WRVIKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorCisvLyBJdCdzIHRoaXMgaGVhZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgPHR5cGVpbmZvPiB3aGVuIFJUVEkKKy8vIGlzIGVuYWJsZWQuCisjaWYgR1RFU1RfSEFTX1JUVEkKKyMgaW5jbHVkZSA8dHlwZWluZm8+CisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCisjaWZuZGVmIEdURVNUX0hBU19QVEhSRUFECisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBleHBsaWNpdGx5LCBzbyB3ZSBhc3N1bWUgcHRocmVhZHMgc3VwcG9ydCBpcworLy8gYXZhaWxhYmxlIG9uIExpbnV4IGFuZCBNYWMuCisvLworLy8gVG8gZGlzYWJsZSB0aHJlYWRpbmcgc3VwcG9ydCBpbiBHb29nbGUgVGVzdCwgYWRkIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorLy8gdG8geW91ciBjb21waWxlciBmbGFncy4KKyMgZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfSFBVWCkKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworI2lmIEdURVNUX0hBU19QVEhSRUFECisvLyBndGVzdC1wb3J0LmggZ3VhcmFudGVlcyB0byAjaW5jbHVkZSA8cHRocmVhZC5oPiB3aGVuIEdURVNUX0hBU19QVEhSRUFEIGlzCisvLyB0cnVlLgorIyBpbmNsdWRlIDxwdGhyZWFkLmg+ICAvLyBOT0xJTlQKKworLy8gRm9yIHRpbWVzcGVjIGFuZCBuYW5vc2xlZXAsIHVzZWQgYmVsb3cuCisjIGluY2x1ZGUgPHRpbWUuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRyMS90dXBsZS4gIFlvdSBjYW4gZGVmaW5lCisvLyB0aGlzIG1hY3JvIHRvIDAgdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIHVzaW5nIHR1cGxlIChhbnkKKy8vIGZlYXR1cmUgZGVwZW5kaW5nIG9uIHR1cGxlIHdpdGggYmUgZGlzYWJsZWQgaW4gdGhpcyBtb2RlKS4KKyNpZm5kZWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgbm90IHRvIGRvIGl0LCBzbyB3ZSBhc3N1bWUgaXQncyBPSy4KKyMgZGVmaW5lIEdURVNUX0hBU19UUjFfVFVQTEUgMQorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24KKy8vIHNob3VsZCBiZSB1c2VkLgorI2lmbmRlZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworLy8gV2UgdXNlIG91ciBvd24gVFIxIHR1cGxlIGlmIHdlIGFyZW4ndCBzdXJlIHRoZSB1c2VyIGhhcyBhbgorLy8gaW1wbGVtZW50YXRpb24gb2YgaXQgYWxyZWFkeS4gIEF0IHRoaXMgdGltZSwgR0NDIDQuMC4wKyBhbmQgTVNWQworLy8gMjAxMCBhcmUgdGhlIG9ubHkgbWFpbnN0cmVhbSBjb21waWxlcnMgdGhhdCBjb21lIHdpdGggYSBUUjEgdHVwbGUKKy8vIGltcGxlbWVudGF0aW9uLiAgTlZJRElBJ3MgQ1VEQSBOVkNDIGNvbXBpbGVyIHByZXRlbmRzIHRvIGJlIEdDQyBieQorLy8gZGVmaW5pbmcgX19HTlVDX18gYW5kIGZyaWVuZHMsIGJ1dCBjYW5ub3QgY29tcGlsZSBHQ0MncyB0dXBsZQorLy8gaW1wbGVtZW50YXRpb24uICBNU1ZDIDIwMDggKDkuMCkgcHJvdmlkZXMgVFIxIHR1cGxlIGluIGEgMzIzIE1CCisvLyBGZWF0dXJlIFBhY2sgZG93bmxvYWQsIHdoaWNoIHdlIGNhbm5vdCBhc3N1bWUgdGhlIHVzZXIgaGFzLgorIyBpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKSkgXAorICAgIHx8IF9NU0NfVkVSID49IDE2MDAKKyMgIGRlZmluZSBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAwCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAxCisjIGVuZGlmCisKKyNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKworLy8gVG8gYXZvaWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZXZlcnl3aGVyZSwgd2UgbWFrZSBpdAorLy8gZ3Rlc3QtcG9ydC5oJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgdGhlIGhlYWRlciBpbXBsZW1lbnRpbmcKKy8vIHRyMS90dXBsZS4KKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCisKKyMgaWYgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKyMgIGluY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgiCisjIGVsaWYgR1RFU1RfT1NfU1lNQklBTgorCisvLyBPbiBTeW1iaWFuLCBCT09TVF9IQVNfVFIxX1RVUExFIGNhdXNlcyBCb29zdCdzIFRSMSB0dXBsZSBsaWJyYXJ5IHRvCisvLyB1c2UgU1RMcG9ydCdzIHR1cGxlIGltcGxlbWVudGF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QKKy8vIHdvcmsgYXMgdGhlIGNvcHkgb2YgU1RMcG9ydCBkaXN0cmlidXRlZCB3aXRoIFN5bWJpYW4gaXMgaW5jb21wbGV0ZS4KKy8vIEJ5IG1ha2luZyBzdXJlIEJPT1NUX0hBU19UUjFfVFVQTEUgaXMgdW5kZWZpbmVkLCB3ZSBmb3JjZSBCb29zdCB0bworLy8gdXNlIGl0cyBvd24gdHVwbGUgaW1wbGVtZW50YXRpb24uCisjICBpZmRlZiBCT09TVF9IQVNfVFIxX1RVUExFCisjICAgdW5kZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorIyAgZW5kaWYgIC8vIEJPT1NUX0hBU19UUjFfVFVQTEUKKworLy8gVGhpcyBwcmV2ZW50cyA8Ym9vc3QvdHIxL2RldGFpbC9jb25maWcuaHBwPiwgd2hpY2ggZGVmaW5lcworLy8gQk9PU1RfSEFTX1RSMV9UVVBMRSwgZnJvbSBiZWluZyAjaW5jbHVkZWQgYnkgQm9vc3QncyA8dHVwbGU+LgorIyAgZGVmaW5lIEJPT1NUX1RSMV9ERVRBSUxfQ09ORklHX0hQUF9JTkNMVURFRAorIyAgaW5jbHVkZSA8dHVwbGU+CisKKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApCisvLyBHQ0MgNC4wKyBpbXBsZW1lbnRzIHRyMS90dXBsZSBpbiB0aGUgPHRyMS90dXBsZT4gaGVhZGVyLiAgVGhpcyBkb2VzCisvLyBub3QgY29uZm9ybSB0byB0aGUgVFIxIHNwZWMsIHdoaWNoIHJlcXVpcmVzIHRoZSBoZWFkZXIgdG8gYmUgPHR1cGxlPi4KKworIyAgaWYgIUdURVNUX0hBU19SVFRJICYmIEdURVNUX0dDQ19WRVJfIDwgNDAzMDIKKy8vIFVudGlsIHZlcnNpb24gNC4zLjIsIGdjYyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgPHRyMS9mdW5jdGlvbmFsPiwKKy8vIHdoaWNoIGlzICNpbmNsdWRlZCBieSA8dHIxL3R1cGxlPiwgdG8gbm90IGNvbXBpbGUgd2hlbiBSVFRJIGlzCisvLyBkaXNhYmxlZC4gIF9UUjFfRlVOQ1RJT05BTCBpcyB0aGUgaGVhZGVyIGd1YXJkIGZvcgorLy8gPHRyMS9mdW5jdGlvbmFsPi4gIEhlbmNlIHRoZSBmb2xsb3dpbmcgI2RlZmluZSBpcyBhIGhhY2sgdG8gcHJldmVudAorLy8gPHRyMS9mdW5jdGlvbmFsPiBmcm9tIGJlaW5nIGluY2x1ZGVkLgorIyAgIGRlZmluZSBfVFIxX0ZVTkNUSU9OQUwgMQorIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4KKyMgICB1bmRlZiBfVFIxX0ZVTkNUSU9OQUwgIC8vIEFsbG93cyB0aGUgdXNlciB0byAjaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHRyMS9mdW5jdGlvbmFsPiBpZiBoZSBjaG9vc2VzIHRvLgorIyAgZWxzZQorIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4gIC8vIE5PTElOVAorIyAgZW5kaWYgIC8vICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisKKyMgZWxzZQorLy8gSWYgdGhlIGNvbXBpbGVyIGlzIG5vdCBHQ0MgNC4wKywgd2UgYXNzdW1lIHRoZSB1c2VyIGlzIHVzaW5nIGEKKy8vIHNwZWMtY29uZm9ybWluZyBUUjEgaW1wbGVtZW50YXRpb24uCisjICBpbmNsdWRlIDx0dXBsZT4gIC8vIE5PTElOVAorIyBlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIERldGVybWluZXMgd2hldGhlciBjbG9uZSgyKSBpcyBzdXBwb3J0ZWQuCisvLyBVc3VhbGx5IGl0IHdpbGwgb25seSBiZSBhdmFpbGFibGUgb24gTGludXgsIGV4Y2x1ZGluZworLy8gTGludXggb24gdGhlIEl0YW5pdW0gYXJjaGl0ZWN0dXJlLgorLy8gQWxzbyBzZWUgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzIvY2xvbmUuCisjaWZuZGVmIEdURVNUX0hBU19DTE9ORQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworIyBpZiBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKKyMgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMQorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDAKKyMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYICYmICFkZWZpbmVkKF9faWE2NF9fKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCBzdHJlYW0gcmVkaXJlY3Rpb24uIFRoaXMgaXMgdXNlZCB0byB0ZXN0CisvLyBvdXRwdXQgY29ycmVjdG5lc3MgYW5kIHRvIGltcGxlbWVudCBkZWF0aCB0ZXN0cy4KKyNpZm5kZWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorLy8gQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgc3RyZWFtIHJlZGlyZWN0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbGwKKy8vIHBsYXRmb3JtcyBleGNlcHQga25vd24gbW9iaWxlIG9uZXMuCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMQorIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgZGVhdGggdGVzdHMuCisvLyBHb29nbGUgVGVzdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGZvciBWQyA3LjEgYW5kIGVhcmxpZXIgYXMKKy8vIGFib3J0KCkgaW4gYSBWQyA3LjEgYXBwbGljYXRpb24gY29tcGlsZWQgYXMgR1VJIGluIGRlYnVnIGNvbmZpZworLy8gcG9wcyB1cCBhIGRpYWxvZyB3aW5kb3cgdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBwcm9ncmFtbWF0aWNhbGx5LgorI2lmIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NPTEFSSVMgfHwgXAorICAgICAoR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICYmIF9NU0NfVkVSID49IDE0MDApIHx8IFwKKyAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyB8fCBHVEVTVF9PU19BSVggfHwgR1RFU1RfT1NfSFBVWCkKKyMgZGVmaW5lIEdURVNUX0hBU19ERUFUSF9URVNUIDEKKyMgaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gV2UgZG9uJ3Qgc3VwcG9ydCBNU1ZDIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgbm93LiAgVGhlcmVmb3JlCisvLyBhbGwgdGhlIGNvbXBpbGVycyB3ZSBjYXJlIGFib3V0IGFyZSBhZGVxdWF0ZSBmb3Igc3VwcG9ydGluZworLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNkZWZpbmUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgMQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCB0eXBlLWRyaXZlbiB0ZXN0cy4KKworLy8gVHlwZWQgdGVzdHMgbmVlZCA8dHlwZWluZm8+IGFuZCB2YXJpYWRpYyBtYWNyb3MsIHdoaWNoIEdDQywgVkMrKyA4LjAsCisvLyBTdW4gUHJvIENDLCBJQk0gVmlzdWFsIEFnZSwgYW5kIEhQIGFDQyBzdXBwb3J0LgorI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IChfTVNDX1ZFUiA+PSAxNDAwKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBcCisgICAgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fSFBfYUNDKQorIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1QgMQorIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgQ29tYmluZSgpLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0CisvLyB3b3JrIG9uIFN1biBTdHVkaW8gc2luY2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIHRlbXBsYXRlZCBjb252ZXJzaW9uCisvLyBvcGVyYXRvcnMuCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QgJiYgR1RFU1RfSEFTX1RSMV9UVVBMRSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKKyMgZGVmaW5lIEdURVNUX0hBU19DT01CSU5FIDEKKyNlbmRpZgorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN5c3RlbSBjb21waWxlciB1c2VzIFVURi0xNiBmb3IgZW5jb2Rpbmcgd2lkZSBzdHJpbmdzLgorI2RlZmluZSBHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XyBcCisgICAgKEdURVNUX09TX1dJTkRPV1MgfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfQUlYKQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGVzdCByZXN1bHRzIGNhbiBiZSBzdHJlYW1lZCB0byBhIHNvY2tldC4KKyNpZiBHVEVTVF9PU19MSU5VWAorIyBkZWZpbmUgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXyAxCisjZW5kaWYKKworLy8gRGVmaW5lcyBzb21lIHV0aWxpdHkgbWFjcm9zLgorCisvLyBUaGUgR05VIGNvbXBpbGVyIGVtaXRzIGEgd2FybmluZyBpZiBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIGFyZSBmb2xsb3dlZCBieQorLy8gYW4gImVsc2UiIHN0YXRlbWVudCBhbmQgYnJhY2VzIGFyZSBub3QgdXNlZCB0byBleHBsaWNpdGx5IGRpc2FtYmlndWF0ZSB0aGUKKy8vICJlbHNlIiBiaW5kaW5nLiAgVGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToKKy8vCisvLyAgIGlmIChnYXRlKQorLy8gICAgIEFTU0VSVF8qKGNvbmRpdGlvbikgPDwgIlNvbWUgbWVzc2FnZSI7CisvLworLy8gVGhlICJzd2l0Y2ggKDApIGNhc2UgMDoiIGlkaW9tIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhpcy4KKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIHN3aXRjaCAoMCkgY2FzZSAwOiBkZWZhdWx0OiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gVXNlIHRoaXMgYW5ub3RhdGlvbiBhdCB0aGUgZW5kIG9mIGEgc3RydWN0L2NsYXNzIGRlZmluaXRpb24gdG8KKy8vIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc3RhbmNlcyB0aGF0IGFyZSBuZXZlcgorLy8gdXNlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gYWxsIGludGVyZXN0aW5nIGxvZ2ljIGhhcHBlbnMgaW5zaWRlIHRoZQorLy8gYyd0b3IgYW5kIC8gb3IgZCd0b3IuICBFeGFtcGxlOgorLy8KKy8vICAgc3RydWN0IEZvbyB7CisvLyAgICAgRm9vKCkgeyAuLi4gfQorLy8gICB9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworLy8KKy8vIEFsc28gdXNlIGl0IGFmdGVyIGEgdmFyaWFibGUgb3IgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGUgdmFyaWFibGUvcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgdXNlZC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXworI2VuZGlmCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgb3BlcmF0b3I9CisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCisjZGVmaW5lIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSlcCisgIHZvaWQgb3BlcmF0b3I9KHR5cGUgY29uc3QgJikKKworLy8gQSBtYWNybyB0byBkaXNhbGxvdyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcy4KKyNkZWZpbmUgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyh0eXBlKVwKKyAgdHlwZSh0eXBlIGNvbnN0ICYpO1wKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyh0eXBlKQorCisvLyBUZWxsIHRoZSBjb21waWxlciB0byB3YXJuIGFib3V0IHVudXNlZCByZXR1cm4gdmFsdWVzIGZvciBmdW5jdGlvbnMgZGVjbGFyZWQKKy8vIHdpdGggdGhpcyBtYWNyby4gIFRoZSBtYWNybyBzaG91bGQgYmUgdXNlZCBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKy8vIGZvbGxvd2luZyB0aGUgYXJndW1lbnQgbGlzdDoKKy8vCisvLyAgIFNwcm9ja2V0KiBBbGxvY2F0ZVNwcm9ja2V0KCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFkZWZpbmVkKENPTVBJTEVSX0lDQykKKyMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXworI2VuZGlmICAvLyBfX0dOVUNfXyAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFDT01QSUxFUl9JQ0MKKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzIFN0cnVjdHVyZWQgRXhjZXB0aW9uCisvLyBIYW5kbGluZy4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMgYnV0IGdlbmVyYWxseQorLy8gZG9lcyBub3QgZXhpc3Qgb24gYW55IG90aGVyIHN5c3RlbS4KKyNpZm5kZWYgR1RFU1RfSEFTX1NFSAorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIFRoZXNlIHR3byBjb21waWxlcnMgYXJlIGtub3duIHRvIHN1cHBvcnQgU0VILgorIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMQorIyBlbHNlCisvLyBBc3N1bWUgbm8gU0VILgorIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMAorIyBlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworI2lmZGVmIF9NU0NfVkVSCisKKyMgaWYgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZCisjICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgZWxpZiBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKKyMgIGRlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyBlbmRpZgorCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgR1RFU1RfQVBJXworIyBkZWZpbmUgR1RFU1RfQVBJXworI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworLy8gQXNrIHRoZSBjb21waWxlciB0byBuZXZlciBpbmxpbmUgYSBnaXZlbiBmdW5jdGlvbi4KKyMgZGVmaW5lIEdURVNUX05PX0lOTElORV8gX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX05PX0lOTElORV8KKyNlbmRpZgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1lc3NhZ2U7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIFN0cmluZzsKKworLy8gVGhlIEdURVNUX0NPTVBJTEVfQVNTRVJUXyBtYWNybyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNvbXBpbGUgdGltZQorLy8gZXhwcmVzc2lvbiBpcyB0cnVlLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSBpdCB0byB2ZXJpZnkgdGhlCisvLyBzaXplIG9mIGEgc3RhdGljIGFycmF5OgorLy8KKy8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKEFSUkFZU0laRShjb250ZW50X3R5cGVfbmFtZXMpID09IENPTlRFTlRfTlVNX1RZUEVTLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlX25hbWVzX2luY29ycmVjdF9zaXplKTsKKy8vCisvLyBvciB0byBtYWtlIHN1cmUgYSBzdHJ1Y3QgaXMgc21hbGxlciB0aGFuIGEgY2VydGFpbiBzaXplOgorLy8KKy8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKKy8vCisvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCisvLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKKy8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorCit0ZW1wbGF0ZSA8Ym9vbD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0IHsKK307CisKKyNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgXAorICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiBcCisgICAgICBtc2dbYm9vbChleHByKSA/IDEgOiAtMV0KKworLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBHVEVTVF9DT01QSUxFX0FTU0VSVF86CisvLworLy8gLSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gd29ya3MgYnkgZGVmaW5pbmcgYW4gYXJyYXkgdHlwZSB0aGF0IGhhcyAtMQorLy8gICBlbGVtZW50cyAoYW5kIHRodXMgaXMgaW52YWxpZCkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZS4KKy8vCisvLyAtIFRoZSBzaW1wbGVyIGRlZmluaXRpb24KKy8vCisvLyAgICAjZGVmaW5lIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhleHByLCBtc2cpIHR5cGVkZWYgY2hhciBtc2dbKGV4cHIpID8gMSA6IC0xXQorLy8KKy8vICAgZG9lcyBub3Qgd29yaywgYXMgZ2NjIHN1cHBvcnRzIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgd2hvc2Ugc2l6ZXMKKy8vICAgYXJlIGRldGVybWluZWQgYXQgcnVuLXRpbWUgKHRoaXMgaXMgZ2NjJ3MgZXh0ZW5zaW9uIGFuZCBub3QgcGFydAorLy8gICBvZiB0aGUgQysrIHN0YW5kYXJkKS4gIEFzIGEgcmVzdWx0LCBnY2MgZmFpbHMgdG8gcmVqZWN0IHRoZQorLy8gICBmb2xsb3dpbmcgY29kZSB3aXRoIHRoZSBzaW1wbGUgZGVmaW5pdGlvbjoKKy8vCisvLyAgICAgaW50IGZvbzsKKy8vICAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZm9vLCBtc2cpOyAvLyBub3Qgc3VwcG9zZWQgdG8gY29tcGlsZSBhcyBmb28gaXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCisvLworLy8gLSBCeSB1c2luZyB0aGUgdHlwZSBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4sIHdlIGVuc3VyZXMgdGhhdAorLy8gICBleHByIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgKFRlbXBsYXRlIGFyZ3VtZW50cyBtdXN0IGJlCisvLyAgIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLikKKy8vCisvLyAtIFRoZSBvdXR0ZXIgcGFyZW50aGVzZXMgaW4gQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IGFyZSBuZWNlc3NhcnkKKy8vICAgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDMuNC40IGFuZCA0LjAuMS4gIElmIHdlIGhhZCB3cml0dGVuCisvLworLy8gICAgIENvbXBpbGVBc3NlcnQ8Ym9vbChleHByKT4KKy8vCisvLyAgIGluc3RlYWQsIHRoZXNlIGNvbXBpbGVycyB3aWxsIHJlZnVzZSB0byBjb21waWxlCisvLworLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyg1ID4gMCwgc29tZV9tZXNzYWdlKTsKKy8vCisvLyAgIChUaGV5IHNlZW0gdG8gdGhpbmsgdGhlICI+IiBpbiAiNSA+IDAiIG1hcmtzIHRoZSBlbmQgb2YgdGhlCisvLyAgIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuKQorLy8KKy8vIC0gVGhlIGFycmF5IHNpemUgaXMgKGJvb2woZXhwcikgPyAxIDogLTEpLCBpbnN0ZWFkIG9mIHNpbXBseQorLy8KKy8vICAgICAoKGV4cHIpID8gMSA6IC0xKS4KKy8vCisvLyAgIFRoaXMgaXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGEgYnVnIGluIE1TIFZDIDcuMSwgd2hpY2gKKy8vICAgY2F1c2VzICgoMC4wKSA/IDEgOiAtMSkgdG8gaW5jb3JyZWN0bHkgZXZhbHVhdGUgdG8gMS4KKworLy8gU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyIGlzIHVzZWQgYnkgU3RhdGljQXNzZXJ0VHlwZUVxIGRlZmluZWQgaW4gZ3Rlc3QuaC4KKy8vCisvLyBUaGlzIHRlbXBsYXRlIGlzIGRlY2xhcmVkLCBidXQgaW50ZW50aW9uYWxseSB1bmRlZmluZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQsIFQ+IHt9OworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK3R5cGVkZWYgOjpzdHJpbmcgc3RyaW5nOworI2Vsc2UKK3R5cGVkZWYgOjpzdGQ6OnN0cmluZyBzdHJpbmc7CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK3R5cGVkZWYgOjp3c3RyaW5nIHdzdHJpbmc7CisjZWxpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK3R5cGVkZWYgOjpzdGQ6OndzdHJpbmcgd3N0cmluZzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIEEgaGVscGVyIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiBjb25zdGFudCBjb25kaXRpb24uICBJdCBqdXN0CisvLyByZXR1cm5zICdjb25kaXRpb24nLgorR1RFU1RfQVBJXyBib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbik7CisKKy8vIERlZmluZXMgc2NvcGVkX3B0ci4KKworLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBzY29wZWRfcHRyIGlzIFBBUlRJQUwgLSBpdCBvbmx5IGNvbnRhaW5zCisvLyBlbm91Z2ggc3R1ZmYgdG8gc2F0aXNmeSBHb29nbGUgVGVzdCdzIG5lZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIHNjb3BlZF9wdHIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICBleHBsaWNpdCBzY29wZWRfcHRyKFQqIHAgPSBOVUxMKSA6IHB0cl8ocCkge30KKyAgfnNjb3BlZF9wdHIoKSB7IHJlc2V0KCk7IH0KKworICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcHRyXzsgfQorICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisKKyAgVCogcmVsZWFzZSgpIHsKKyAgICBUKiBjb25zdCBwdHIgPSBwdHJfOworICAgIHB0cl8gPSBOVUxMOworICAgIHJldHVybiBwdHI7CisgIH0KKworICB2b2lkIHJlc2V0KFQqIHAgPSBOVUxMKSB7CisgICAgaWYgKHAgIT0gcHRyXykgeworICAgICAgaWYgKElzVHJ1ZShzaXplb2YoVCkgPiAwKSkgeyAgLy8gTWFrZXMgc3VyZSBUIGlzIGEgY29tcGxldGUgdHlwZS4KKyAgICAgICAgZGVsZXRlIHB0cl87CisgICAgICB9CisgICAgICBwdHJfID0gcDsKKyAgICB9CisgIH0KKyBwcml2YXRlOgorICBUKiBwdHJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oc2NvcGVkX3B0cik7Cit9OworCisvLyBEZWZpbmVzIFJFLgorCisvLyBBIHNpbXBsZSBDKysgd3JhcHBlciBmb3IgPHJlZ2V4Lmg+LiAgSXQgdXNlcyB0aGUgUE9TSVggRXh0ZW5kZWQKKy8vIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXguCitjbGFzcyBHVEVTVF9BUElfIFJFIHsKKyBwdWJsaWM6CisgIC8vIEEgY29weSBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCBieSB0aGUgU3RhbmRhcmQgdG8gaW5pdGlhbGl6ZSBvYmplY3QKKyAgLy8gcmVmZXJlbmNlcyBmcm9tIHItdmFsdWVzLgorICBSRShjb25zdCBSRSYgb3RoZXIpIHsgSW5pdChvdGhlci5wYXR0ZXJuKCkpOyB9CisKKyAgLy8gQ29uc3RydWN0cyBhbiBSRSBmcm9tIGEgc3RyaW5nLgorICBSRShjb25zdCA6OnN0ZDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgUkUoY29uc3QgOjpzdHJpbmcmIHJlZ2V4KSB7IEluaXQocmVnZXguY19zdHIoKSk7IH0gIC8vIE5PTElOVAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgUkUoY29uc3QgY2hhciogcmVnZXgpIHsgSW5pdChyZWdleCk7IH0gIC8vIE5PTElOVAorICB+UkUoKTsKKworICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4LgorICBjb25zdCBjaGFyKiBwYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gcGF0dGVybl87IH0KKworICAvLyBGdWxsTWF0Y2goc3RyLCByZSkgcmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcworICAvLyB0aGUgZW50aXJlIHN0ci4KKyAgLy8gUGFydGlhbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlCisgIC8vIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCisgIC8vCisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIEZ1bGxNYXRjaCgpIGFuZCBQYXJ0aWFsTWF0Y2goKSB3b3JrCisgIC8vIHdoZW4gc3RyIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzLgorICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIFBhcnRpYWxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsKKyAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsKKworIHByaXZhdGU6CisgIHZvaWQgSW5pdChjb25zdCBjaGFyKiByZWdleCk7CisKKyAgLy8gV2UgdXNlIGEgY29uc3QgY2hhciogaW5zdGVhZCBvZiBhIHN0cmluZywgYXMgR29vZ2xlIFRlc3QgbWF5IGJlIHVzZWQKKyAgLy8gd2hlcmUgc3RyaW5nIGlzIG5vdCBhdmFpbGFibGUuICBXZSBhbHNvIGRvIG5vdCB1c2UgR29vZ2xlIFRlc3QncyBvd24KKyAgLy8gU3RyaW5nIHR5cGUgaGVyZSwgaW4gb3JkZXIgdG8gc2ltcGxpZnkgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlCisgIC8vIGZpbGVzLgorICBjb25zdCBjaGFyKiBwYXR0ZXJuXzsKKyAgYm9vbCBpc192YWxpZF87CisKKyNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisKKyAgcmVnZXhfdCBmdWxsX3JlZ2V4XzsgICAgIC8vIEZvciBGdWxsTWF0Y2goKS4KKyAgcmVnZXhfdCBwYXJ0aWFsX3JlZ2V4XzsgIC8vIEZvciBQYXJ0aWFsTWF0Y2goKS4KKworI2Vsc2UgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKyAgY29uc3QgY2hhciogZnVsbF9wYXR0ZXJuXzsgIC8vIEZvciBGdWxsTWF0Y2goKTsKKworI2VuZGlmCisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSRSk7Cit9OworCisvLyBGb3JtYXRzIGEgc291cmNlIGZpbGUgcGF0aCBhbmQgYSBsaW5lIG51bWJlciBhcyB0aGV5IHdvdWxkIGFwcGVhcgorLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLgorR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7CisKKy8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgorLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bworLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgorR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKKworLy8gRGVmaW5lcyBsb2dnaW5nIHV0aWxpdGllczoKKy8vICAgR1RFU1RfTE9HXyhzZXZlcml0eSkgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuIFRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaXRzZWxmIGlzIHN0cmVhbWVkIGludG8gdGhlIG1hY3JvLgorLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuCisvLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4KKworZW51bSBHVGVzdExvZ1NldmVyaXR5IHsKKyAgR1RFU1RfSU5GTywKKyAgR1RFU1RfV0FSTklORywKKyAgR1RFU1RfRVJST1IsCisgIEdURVNUX0ZBVEFMCit9OworCisvLyBGb3JtYXRzIGxvZyBlbnRyeSBzZXZlcml0eSwgcHJvdmlkZXMgYSBzdHJlYW0gb2JqZWN0IGZvciBzdHJlYW1pbmcgdGhlCisvLyBsb2cgbWVzc2FnZSwgYW5kIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2Ugd2l0aCBhIG5ld2xpbmUgd2hlbiBnb2luZyBvdXQgb2YKKy8vIHNjb3BlLgorY2xhc3MgR1RFU1RfQVBJXyBHVGVzdExvZyB7CisgcHVibGljOgorICBHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7CisKKyAgLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCisgIH5HVGVzdExvZygpOworCisgIDo6c3RkOjpvc3RyZWFtJiBHZXRTdHJlYW0oKSB7IHJldHVybiA6OnN0ZDo6Y2VycjsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdExvZyk7Cit9OworCisjZGVmaW5lIEdURVNUX0xPR18oc2V2ZXJpdHkpIFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpHVGVzdExvZyg6OnRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF8jI3NldmVyaXR5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKS5HZXRTdHJlYW0oKQorCitpbmxpbmUgdm9pZCBMb2dUb1N0ZGVycigpIHt9CitpbmxpbmUgdm9pZCBGbHVzaEluZm9Mb2coKSB7IGZmbHVzaChOVUxMKTsgfQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UuCisvLworLy8gR1RFU1RfQ0hFQ0tfIGlzIGFuIGFsbC1tb2RlIGFzc2VydC4gSXQgYWJvcnRzIHRoZSBwcm9ncmFtIGlmIHRoZSBjb25kaXRpb24KKy8vIGlzIG5vdCBzYXRpc2ZpZWQuCisvLyAgU3lub3BzeXM6CisvLyAgICBHVEVTVF9DSEVDS18oYm9vbGVhbl9jb25kaXRpb24pOworLy8gICAgIG9yCisvLyAgICBHVEVTVF9DSEVDS18oYm9vbGVhbl9jb25kaXRpb24pIDw8ICJBZGRpdGlvbmFsIG1lc3NhZ2UiOworLy8KKy8vICAgIFRoaXMgY2hlY2tzIHRoZSBjb25kaXRpb24gYW5kIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZAorLy8gICAgaXQgcHJpbnRzIG1lc3NhZ2UgYWJvdXQgdGhlIGNvbmRpdGlvbiB2aW9sYXRpb24sIGluY2x1ZGluZyB0aGUKKy8vICAgIGNvbmRpdGlvbiBpdHNlbGYsIHBsdXMgYWRkaXRpb25hbCBtZXNzYWdlIHN0cmVhbWVkIGludG8gaXQsIGlmIGFueSwKKy8vICAgIGFuZCB0aGVuIGl0IGFib3J0cyB0aGUgcHJvZ3JhbS4gSXQgYWJvcnRzIHRoZSBwcm9ncmFtIGlycmVzcGVjdGl2ZSBvZgorLy8gICAgd2hldGhlciBpdCBpcyBidWlsdCBpbiB0aGUgZGVidWcgbW9kZSBvciBub3QuCisjZGVmaW5lIEdURVNUX0NIRUNLXyhjb25kaXRpb24pIFwKKyAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShjb25kaXRpb24pKSBcCisgICAgICA7IFwKKyAgICBlbHNlIFwKKyAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJDb25kaXRpb24gIiAjY29uZGl0aW9uICIgZmFpbGVkLiAiCisKKy8vIEFuIGFsbC1tb2RlIGFzc2VydCB0byB2ZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gUE9TSVgtc3R5bGUgZnVuY3Rpb24KKy8vIGNhbGwgcmV0dXJucyAwIChpbmRpY2F0aW5nIHN1Y2Nlc3MpLiAgS25vd24gbGltaXRhdGlvbjogdGhpcworLy8gZG9lc24ndCBleHBhbmQgdG8gYSBiYWxhbmNlZCAnaWYnIHN0YXRlbWVudCwgc28gZW5jbG9zZSB0aGUgbWFjcm8KKy8vIGluIHt9IGlmIHlvdSBuZWVkIHRvIHVzZSBpdCBhcyB0aGUgb25seSBzdGF0ZW1lbnQgaW4gYW4gJ2lmJworLy8gYnJhbmNoLgorI2RlZmluZSBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwb3NpeF9jYWxsKSBcCisgIGlmIChjb25zdCBpbnQgZ3Rlc3RfZXJyb3IgPSAocG9zaXhfY2FsbCkpIFwKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAjcG9zaXhfY2FsbCA8PCAiZmFpbGVkIHdpdGggZXJyb3IgIiBcCisgICAgICAgICAgICAgICAgICAgICAgPDwgZ3Rlc3RfZXJyb3IKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBVc2UgSW1wbGljaXRDYXN0XyBhcyBhIHNhZmUgdmVyc2lvbiBvZiBzdGF0aWNfY2FzdCBmb3IgdXBjYXN0aW5nIGluCisvLyB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4gY2FzdGluZyBhIEZvbyogdG8gYSBTdXBlcmNsYXNzT2ZGb28qIG9yIGEKKy8vIGNvbnN0IEZvbyopLiAgV2hlbiB5b3UgdXNlIEltcGxpY2l0Q2FzdF8sIHRoZSBjb21waWxlciBjaGVja3MgdGhhdAorLy8gdGhlIGNhc3QgaXMgc2FmZS4gIFN1Y2ggZXhwbGljaXQgSW1wbGljaXRDYXN0X3MgYXJlIG5lY2Vzc2FyeSBpbgorLy8gc3VycHJpc2luZ2x5IG1hbnkgc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoCisvLyBpbnN0ZWFkIG9mIGFuIGFyZ3VtZW50IHR5cGUgY29udmVydGFibGUgdG8gYSB0YXJnZXQgdHlwZS4KKy8vCisvLyBUaGUgc3ludGF4IGZvciB1c2luZyBJbXBsaWNpdENhc3RfIGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdDoKKy8vCisvLyAgIEltcGxpY2l0Q2FzdF88VG9UeXBlPihleHByKQorLy8KKy8vIEltcGxpY2l0Q2FzdF8gd291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LAorLy8gYnV0IHRoZSBwcm9wb3NhbCB3YXMgc3VibWl0dGVkIHRvbyBsYXRlLiAgSXQgd2lsbCBwcm9iYWJseSBtYWtlCisvLyBpdHMgd2F5IGludG8gdGhlIGxhbmd1YWdlIGluIHRoZSBmdXR1cmUuCisvLworLy8gVGhpcyByZWxhdGl2ZWx5IHVnbHkgbmFtZSBpcyBpbnRlbnRpb25hbC4gSXQgcHJldmVudHMgY2xhc2hlcyB3aXRoCisvLyBzaW1pbGFyIGZ1bmN0aW9ucyB1c2VycyBtYXkgaGF2ZSAoZS5nLiwgaW1wbGljaXRfY2FzdCkuIFRoZSBpbnRlcm5hbAorLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvPgoraW5saW5lIFRvIEltcGxpY2l0Q2FzdF8oVG8geCkgeyByZXR1cm4geDsgfQorCisvLyBXaGVuIHlvdSB1cGNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20gdHlwZSBGb28gdG8gdHlwZQorLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBJbXBsaWNpdENhc3RfPD4sIHNpbmNlIHVwY2FzdHMKKy8vIGFsd2F5cyBzdWNjZWVkLiAgV2hlbiB5b3UgZG93bmNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20KKy8vIHR5cGUgRm9vIHRvIHR5cGUgU3ViY2xhc3NPZkZvbyksIHN0YXRpY19jYXN0PD4gaXNuJ3Qgc2FmZSwgYmVjYXVzZQorLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdAorLy8gY291bGQgYmUgYSBiYXJlIEZvbywgb3Igb2YgdHlwZSBEaWZmZXJlbnRTdWJjbGFzc09mRm9vLiAgVGh1cywKKy8vIHdoZW4geW91IGRvd25jYXN0LCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG1hY3JvLiAgSW4gZGVidWcgbW9kZSwgd2UKKy8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUKKy8vIGlmIGl0J3Mgbm90KS4gIEluIG5vcm1hbCBtb2RlLCB3ZSBkbyB0aGUgZWZmaWNpZW50IHN0YXRpY19jYXN0PD4KKy8vIGluc3RlYWQuICBUaHVzLCBpdCdzIGltcG9ydGFudCB0byB0ZXN0IGluIGRlYnVnIG1vZGUgdG8gbWFrZSBzdXJlCisvLyB0aGUgY2FzdCBpcyBsZWdhbCEKKy8vICAgIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gdGhlIGNvZGUgd2Ugc2hvdWxkIHVzZSBkeW5hbWljX2Nhc3Q8Pi4KKy8vIEluIHBhcnRpY3VsYXIsIHlvdSBTSE9VTEROJ1QgYmUgdXNpbmcgZHluYW1pY19jYXN0PD4gaW4gb3JkZXIgdG8KKy8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOgorLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczE+KGZvbykpIEhhbmRsZUFTdWJjbGFzczFPYmplY3QoZm9vKTsKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MyPihmb28pKSBIYW5kbGVBU3ViY2xhc3MyT2JqZWN0KGZvbyk7CisvLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLgorLy8KKy8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAorLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGRvd25fY2FzdCkuIFRoZSBpbnRlcm5hbAorLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiAgLy8gdXNlIGxpa2UgdGhpczogRG93bkNhc3RfPFQqPihmb28pOworaW5saW5lIFRvIERvd25DYXN0XyhGcm9tKiBmKSB7ICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycworICAvLyBFbnN1cmVzIHRoYXQgVG8gaXMgYSBzdWItdHlwZSBvZiBGcm9tICouICBUaGlzIHRlc3QgaXMgaGVyZSBvbmx5CisgIC8vIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZywgYW5kIGhhcyBubyBvdmVyaGVhZCBpbiBhbgorICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkKKyAgLy8gY29tcGxldGVseS4KKyAgaWYgKGZhbHNlKSB7CisgICAgY29uc3QgVG8gdG8gPSBOVUxMOworICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88RnJvbSo+KHRvKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgLy8gUlRUSTogZGVidWcgbW9kZSBvbmx5IQorICBHVEVTVF9DSEVDS18oZiA9PSBOVUxMIHx8IGR5bmFtaWNfY2FzdDxUbz4oZikgIT0gTlVMTCk7CisjZW5kaWYKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRvPihmKTsKK30KKworLy8gRG93bmNhc3RzIHRoZSBwb2ludGVyIG9mIHR5cGUgQmFzZSB0byBEZXJpdmVkLgorLy8gRGVyaXZlZCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgQmFzZS4gVGhlIHBhcmFtZXRlciBNVVNUCisvLyBwb2ludCB0byBhIGNsYXNzIG9mIHR5cGUgRGVyaXZlZCwgbm90IGFueSBzdWJjbGFzcyBvZiBpdC4KKy8vIFdoZW4gUlRUSSBpcyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiBwZXJmb3JtcyBhIHJ1bnRpbWUKKy8vIGNoZWNrIHRvIGVuZm9yY2UgdGhpcy4KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkLCBjbGFzcyBCYXNlPgorRGVyaXZlZCogQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlKEJhc2UqIGJhc2UpIHsKKyNpZiBHVEVTVF9IQVNfUlRUSQorICBHVEVTVF9DSEVDS18odHlwZWlkKCpiYXNlKSA9PSB0eXBlaWQoRGVyaXZlZCkpOworICByZXR1cm4gZHluYW1pY19jYXN0PERlcml2ZWQqPihiYXNlKTsgIC8vIE5PTElOVAorI2Vsc2UKKyAgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWQqPihiYXNlKTsgIC8vIFBvb3IgbWFuJ3MgZG93bmNhc3QuCisjZW5kaWYKK30KKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gRGVmaW5lcyB0aGUgc3RkZXJyIGNhcHR1cmVyOgorLy8gICBDYXB0dXJlU3Rkb3V0ICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0LgorLy8gICBHZXRDYXB0dXJlZFN0ZG91dCAtIHN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KKy8vICAgQ2FwdHVyZVN0ZGVyciAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KKy8vICAgR2V0Q2FwdHVyZWRTdGRlcnIgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLworR1RFU1RfQVBJXyB2b2lkIENhcHR1cmVTdGRvdXQoKTsKK0dURVNUX0FQSV8gU3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7CitHVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOworR1RFU1RfQVBJXyBTdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEEgY29weSBvZiBhbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNldCBieSBJbml0R29vZ2xlVGVzdCgpLgorZXh0ZXJuIDo6c3RkOjp2ZWN0b3I8U3RyaW5nPiBnX2FyZ3ZzOworCisvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHdlIGhhdmUgOjpzdGQ6OnN0cmluZy4KK2NvbnN0IDo6c3RkOjp2ZWN0b3I8U3RyaW5nPiYgR2V0QXJndnMoKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBEZWZpbmVzIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgorCisjaWYgR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gU2xlZXBzIGZvciAocm91Z2hseSkgbiBtaWxsaS1zZWNvbmRzLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvcgorLy8gdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiAgRG9uJ3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsCisvLyBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK2lubGluZSB2b2lkIFNsZWVwTWlsbGlzZWNvbmRzKGludCBuKSB7CisgIGNvbnN0IHRpbWVzcGVjIHRpbWUgPSB7CisgICAgMCwgICAgICAgICAgICAgICAgICAvLyAwIHNlY29uZHMuCisgICAgbiAqIDEwMDBMICogMTAwMEwsICAvLyBBbmQgbiBtcy4KKyAgfTsKKyAgbmFub3NsZWVwKCZ0aW1lLCBOVUxMKTsKK30KKworLy8gQWxsb3dzIGEgY29udHJvbGxlciB0aHJlYWQgdG8gcGF1c2UgZXhlY3V0aW9uIG9mIG5ld2x5IGNyZWF0ZWQKKy8vIHRocmVhZHMgdW50aWwgbm90aWZpZWQuICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlIGNyZWF0ZWQKKy8vIGFuZCBkZXN0cm95ZWQgaW4gdGhlIGNvbnRyb2xsZXIgdGhyZWFkLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbyBub3QKKy8vIHVzZSBpdCBpbiB1c2VyIHRlc3RzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK2NsYXNzIE5vdGlmaWNhdGlvbiB7CisgcHVibGljOgorICBOb3RpZmljYXRpb24oKSA6IG5vdGlmaWVkXyhmYWxzZSkge30KKworICAvLyBOb3RpZmllcyBhbGwgdGhyZWFkcyBjcmVhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24gdG8gc3RhcnQuIE11c3QKKyAgLy8gYmUgY2FsbGVkIGZyb20gdGhlIGNvbnRyb2xsZXIgdGhyZWFkLgorICB2b2lkIE5vdGlmeSgpIHsgbm90aWZpZWRfID0gdHJ1ZTsgfQorCisgIC8vIEJsb2NrcyB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQgbm90aWZpZXMuIE11c3QgYmUgY2FsbGVkIGZyb20gYSB0ZXN0CisgIC8vIHRocmVhZC4KKyAgdm9pZCBXYWl0Rm9yTm90aWZpY2F0aW9uKCkgeworICAgIHdoaWxlKCFub3RpZmllZF8pIHsKKyAgICAgIFNsZWVwTWlsbGlzZWNvbmRzKDEwKTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHZvbGF0aWxlIGJvb2wgbm90aWZpZWRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTm90aWZpY2F0aW9uKTsKK307CisKKy8vIEFzIGEgQy1mdW5jdGlvbiwgVGhyZWFkRnVuY1dpdGhDTGlua2FnZSBjYW5ub3QgYmUgdGVtcGxhdGVkIGl0c2VsZi4KKy8vIENvbnNlcXVlbnRseSwgaXQgY2Fubm90IHNlbGVjdCBhIGNvcnJlY3QgaW5zdGFudGlhdGlvbiBvZiBUaHJlYWRXaXRoUGFyYW0KKy8vIGluIG9yZGVyIHRvIGNhbGwgaXRzIFJ1bigpLiBJbnRyb2R1Y2luZyBUaHJlYWRXaXRoUGFyYW1CYXNlIGFzIGEKKy8vIG5vbi10ZW1wbGF0ZWQgYmFzZSBjbGFzcyBmb3IgVGhyZWFkV2l0aFBhcmFtIGFsbG93cyB1cyB0byBieXBhc3MgdGhpcworLy8gcHJvYmxlbS4KK2NsYXNzIFRocmVhZFdpdGhQYXJhbUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkV2l0aFBhcmFtQmFzZSgpIHt9CisgIHZpcnR1YWwgdm9pZCBSdW4oKSA9IDA7Cit9OworCisvLyBwdGhyZWFkX2NyZWF0ZSgpIGFjY2VwdHMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdHlwZSB3aXRoIHRoZSBDIGxpbmthZ2UuCisvLyBBY2NvcmRpbmcgdG8gdGhlIFN0YW5kYXJkICg3LjUvMSksIGZ1bmN0aW9uIHR5cGVzIHdpdGggZGlmZmVyZW50IGxpbmthZ2VzCisvLyBhcmUgZGlmZmVyZW50IGV2ZW4gaWYgdGhleSBhcmUgb3RoZXJ3aXNlIGlkZW50aWNhbC4gIFNvbWUgY29tcGlsZXJzIChmb3IKKy8vIGV4YW1wbGUsIFN1blN0dWRpbykgdHJlYXQgdGhlbSBhcyBkaWZmZXJlbnQgdHlwZXMuICBTaW5jZSBjbGFzcyBtZXRob2RzCisvLyBjYW5ub3QgYmUgZGVmaW5lZCB3aXRoIEMtbGlua2FnZSB3ZSBuZWVkIHRvIGRlZmluZSBhIGZyZWUgQy1mdW5jdGlvbiB0bworLy8gcGFzcyBpbnRvIHB0aHJlYWRfY3JlYXRlKCkuCitleHRlcm4gIkMiIGlubGluZSB2b2lkKiBUaHJlYWRGdW5jV2l0aENMaW5rYWdlKHZvaWQqIHRocmVhZCkgeworICBzdGF0aWNfY2FzdDxUaHJlYWRXaXRoUGFyYW1CYXNlKj4odGhyZWFkKS0+UnVuKCk7CisgIHJldHVybiBOVUxMOworfQorCisvLyBIZWxwZXIgY2xhc3MgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBtdWx0aS10aHJlYWRpbmcgY29uc3RydWN0cy4KKy8vIFRvIHVzZSBpdCwgd3JpdGU6CisvLworLy8gICB2b2lkIFRocmVhZEZ1bmMoaW50IHBhcmFtKSB7IC8qIERvIHRoaW5ncyB3aXRoIHBhcmFtICovIH0KKy8vICAgTm90aWZpY2F0aW9uIHRocmVhZF9jYW5fc3RhcnQ7CisvLyAgIC4uLgorLy8gICAvLyBUaGUgdGhyZWFkX2Nhbl9zdGFydCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWw7IHlvdSBjYW4gc3VwcGx5IE5VTEwuCisvLyAgIFRocmVhZFdpdGhQYXJhbTxpbnQ+IHRocmVhZCgmVGhyZWFkRnVuYywgNSwgJnRocmVhZF9jYW5fc3RhcnQpOworLy8gICB0aHJlYWRfY2FuX3N0YXJ0Lk5vdGlmeSgpOworLy8KKy8vIFRoZXNlIGNsYXNzZXMgYXJlIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8KKy8vIG5vdCB1c2UgdGhlbSBpbiB1c2VyIHRlc3RzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGhyZWFkV2l0aFBhcmFtIDogcHVibGljIFRocmVhZFdpdGhQYXJhbUJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqVXNlclRocmVhZEZ1bmMpKFQpOworCisgIFRocmVhZFdpdGhQYXJhbSgKKyAgICAgIFVzZXJUaHJlYWRGdW5jIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKKyAgICAgIDogZnVuY18oZnVuYyksCisgICAgICAgIHBhcmFtXyhwYXJhbSksCisgICAgICAgIHRocmVhZF9jYW5fc3RhcnRfKHRocmVhZF9jYW5fc3RhcnQpLAorICAgICAgICBmaW5pc2hlZF8oZmFsc2UpIHsKKyAgICBUaHJlYWRXaXRoUGFyYW1CYXNlKiBjb25zdCBiYXNlID0gdGhpczsKKyAgICAvLyBUaGUgdGhyZWFkIGNhbiBiZSBjcmVhdGVkIG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBleGNlcHQgdGhyZWFkXworICAgIC8vIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF8sIDAsICZUaHJlYWRGdW5jV2l0aENMaW5rYWdlLCBiYXNlKSk7CisgIH0KKyAgflRocmVhZFdpdGhQYXJhbSgpIHsgSm9pbigpOyB9CisKKyAgdm9pZCBKb2luKCkgeworICAgIGlmICghZmluaXNoZWRfKSB7CisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2pvaW4odGhyZWFkXywgMCkpOworICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUnVuKCkgeworICAgIGlmICh0aHJlYWRfY2FuX3N0YXJ0XyAhPSBOVUxMKQorICAgICAgdGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsKKyAgICBmdW5jXyhwYXJhbV8pOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBVc2VyVGhyZWFkRnVuYyBmdW5jXzsgIC8vIFVzZXItc3VwcGxpZWQgdGhyZWFkIGZ1bmN0aW9uLgorICBjb25zdCBUIHBhcmFtXzsgIC8vIFVzZXItc3VwcGxpZWQgcGFyYW1ldGVyIHRvIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisgIC8vIFdoZW4gbm9uLU5VTEwsIHVzZWQgdG8gYmxvY2sgZXhlY3V0aW9uIHVudGlsIHRoZSBjb250cm9sbGVyIHRocmVhZAorICAvLyBub3RpZmllcy4KKyAgTm90aWZpY2F0aW9uKiBjb25zdCB0aHJlYWRfY2FuX3N0YXJ0XzsKKyAgYm9vbCBmaW5pc2hlZF87ICAvLyB0cnVlIGlmZiB3ZSBrbm93IHRoYXQgdGhlIHRocmVhZCBmdW5jdGlvbiBoYXMgZmluaXNoZWQuCisgIHB0aHJlYWRfdCB0aHJlYWRfOyAgLy8gVGhlIG5hdGl2ZSB0aHJlYWQgb2JqZWN0LgorCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkV2l0aFBhcmFtKTsKK307CisKKy8vIE11dGV4QmFzZSBhbmQgTXV0ZXggaW1wbGVtZW50IG11dGV4IG9uIHB0aHJlYWRzLWJhc2VkIHBsYXRmb3Jtcy4gVGhleQorLy8gYXJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjbGFzcyBNdXRleExvY2s6CisvLworLy8gICBNdXRleCBtdXRleDsKKy8vICAgLi4uCisvLyAgIE11dGV4TG9jayBsb2NrKCZtdXRleCk7ICAvLyBBY3F1aXJlcyB0aGUgbXV0ZXggYW5kIHJlbGVhc2VzIGl0IGF0IHRoZSBlbmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IHNjb3BlLgorLy8KKy8vIE11dGV4QmFzZSBpbXBsZW1lbnRzIGJlaGF2aW9yIGZvciBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5CisvLyBhbGxvY2F0ZWQgbXV0ZXhlcy4gIERvIG5vdCB1c2UgTXV0ZXhCYXNlIGRpcmVjdGx5LiAgSW5zdGVhZCwgd3JpdGUKKy8vIHRoZSBmb2xsb3dpbmcgdG8gZGVmaW5lIGEgc3RhdGljIG11dGV4OgorLy8KKy8vICAgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19zb21lX211dGV4KTsKKy8vCisvLyBZb3UgY2FuIGZvcndhcmQgZGVjbGFyZSBhIHN0YXRpYyBtdXRleCBsaWtlIHRoaXM6CisvLworLy8gICBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19zb21lX211dGV4KTsKKy8vCisvLyBUbyBjcmVhdGUgYSBkeW5hbWljIG11dGV4LCBqdXN0IGRlZmluZSBhbiBvYmplY3Qgb2YgdHlwZSBNdXRleC4KK2NsYXNzIE11dGV4QmFzZSB7CisgcHVibGljOgorICAvLyBBY3F1aXJlcyB0aGlzIG11dGV4LgorICB2b2lkIExvY2soKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pKTsKKyAgICBvd25lcl8gPSBwdGhyZWFkX3NlbGYoKTsKKyAgfQorCisgIC8vIFJlbGVhc2VzIHRoaXMgbXV0ZXguCisgIHZvaWQgVW5sb2NrKCkgeworICAgIC8vIFdlIGRvbid0IHByb3RlY3Qgd3JpdGluZyB0byBvd25lcl8gaGVyZSwgYXMgaXQncyB0aGUgY2FsbGVyJ3MKKyAgICAvLyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCisgICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KKyAgICBvd25lcl8gPSAwOworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pKTsKKyAgfQorCisgIC8vIERvZXMgbm90aGluZyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIG11dGV4LiBPdGhlcndpc2UsIGNyYXNoZXMKKyAgLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5LgorICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7CisgICAgR1RFU1RfQ0hFQ0tfKG93bmVyXyA9PSBwdGhyZWFkX3NlbGYoKSkKKyAgICAgICAgPDwgIlRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaG9sZGluZyB0aGUgbXV0ZXggQCIgPDwgdGhpczsKKyAgfQorCisgIC8vIEEgc3RhdGljIG11dGV4IG1heSBiZSB1c2VkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZC4gIEl0IG1heSBldmVuCisgIC8vIGJlIHVzZWQgYmVmb3JlIHRoZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHN0YWdlLiAgVGhlcmVmb3JlIHdlCisgIC8vIG11c3QgYmUgYWJsZSB0byBpbml0aWFsaXplIGEgc3RhdGljIG11dGV4IG9iamVjdCBhdCBsaW5rIHRpbWUuCisgIC8vIFRoaXMgbWVhbnMgTXV0ZXhCYXNlIGhhcyB0byBiZSBhIFBPRCBhbmQgaXRzIG1lbWJlciB2YXJpYWJsZXMKKyAgLy8gaGF2ZSB0byBiZSBwdWJsaWMuCisgcHVibGljOgorICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfOyAgLy8gVGhlIHVuZGVybHlpbmcgcHRocmVhZCBtdXRleC4KKyAgcHRocmVhZF90IG93bmVyXzsgIC8vIFRoZSB0aHJlYWQgaG9sZGluZyB0aGUgbXV0ZXg7IDAgbWVhbnMgbm8gb25lIGhvbGRzIGl0LgorfTsKKworLy8gRm9yd2FyZC1kZWNsYXJlcyBhIHN0YXRpYyBtdXRleC4KKyMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAorICAgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXgKKworLy8gRGVmaW5lcyBhbmQgc3RhdGljYWxseSAoaS5lLiBhdCBsaW5rIHRpbWUpIGluaXRpYWxpemVzIGEgc3RhdGljIG11dGV4LgorIyBkZWZpbmUgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXggPSB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIDAgfQorCisvLyBUaGUgTXV0ZXggY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBmb3IgbXV0ZXhlcyBjcmVhdGVkIGF0IHJ1bnRpbWUuIEl0CisvLyBzaGFyZXMgaXRzIEFQSSB3aXRoIE11dGV4QmFzZSBvdGhlcndpc2UuCitjbGFzcyBNdXRleCA6IHB1YmxpYyBNdXRleEJhc2UgeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsKKyAgICBvd25lcl8gPSAwOworICB9CisgIH5NdXRleCgpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4XykpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE11dGV4KTsKK307CisKKy8vIFdlIGNhbm5vdCBuYW1lIHRoaXMgY2xhc3MgTXV0ZXhMb2NrIGFzIHRoZSBjdG9yIGRlY2xhcmF0aW9uIHdvdWxkCisvLyBjb25mbGljdCB3aXRoIGEgbWFjcm8gbmFtZWQgTXV0ZXhMb2NrLCB3aGljaCBpcyBkZWZpbmVkIG9uIHNvbWUKKy8vIHBsYXRmb3Jtcy4gIEhlbmNlIHRoZSB0eXBlZGVmIHRyaWNrIGJlbG93LgorY2xhc3MgR1Rlc3RNdXRleExvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXhCYXNlKiBtdXRleCkKKyAgICAgIDogbXV0ZXhfKG11dGV4KSB7IG11dGV4Xy0+TG9jaygpOyB9CisKKyAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9CisKKyBwcml2YXRlOgorICBNdXRleEJhc2UqIGNvbnN0IG11dGV4XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEdUZXN0TXV0ZXhMb2NrKTsKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCisvLyBIZWxwZXJzIGZvciBUaHJlYWRMb2NhbC4KKworLy8gcHRocmVhZF9rZXlfY3JlYXRlKCkgcmVxdWlyZXMgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSgpIHRvIGhhdmUKKy8vIEMtbGlua2FnZS4gIFRoZXJlZm9yZSBpdCBjYW5ub3QgYmUgdGVtcGxhdGl6ZWQgdG8gYWNjZXNzCisvLyBUaHJlYWRMb2NhbDxUPi4gIEhlbmNlIHRoZSBuZWVkIGZvciBjbGFzcworLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UuCitjbGFzcyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9Cit9OworCisvLyBDYWxsZWQgYnkgcHRocmVhZCB0byBkZWxldGUgdGhyZWFkLWxvY2FsIGRhdGEgc3RvcmVkIGJ5CisvLyBwdGhyZWFkX3NldHNwZWNpZmljKCkuCitleHRlcm4gIkMiIGlubGluZSB2b2lkIERlbGV0ZVRocmVhZExvY2FsVmFsdWUodm9pZCogdmFsdWVfaG9sZGVyKSB7CisgIGRlbGV0ZSBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHZhbHVlX2hvbGRlcik7Cit9CisKKy8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gcHRocmVhZHMtYmFzZWQgc3lzdGVtcy4KKy8vCisvLyAgIC8vIFRocmVhZCAxCisvLyAgIFRocmVhZExvY2FsPGludD4gdGwoMTAwKTsgIC8vIDEwMCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCB0aHJlYWQuCisvLworLy8gICAvLyBUaHJlYWQgMgorLy8gICB0bC5zZXQoMTUwKTsgIC8vIENoYW5nZXMgdGhlIHZhbHVlIGZvciB0aHJlYWQgMiBvbmx5LgorLy8gICBFWFBFQ1RfRVEoMTUwLCB0bC5nZXQoKSk7CisvLworLy8gICAvLyBUaHJlYWQgMQorLy8gICBFWFBFQ1RfRVEoMTAwLCB0bC5nZXQoKSk7ICAvLyBJbiB0aHJlYWQgMSwgdGwgaGFzIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKy8vICAgdGwuc2V0KDIwMCk7CisvLyAgIEVYUEVDVF9FUSgyMDAsIHRsLmdldCgpKTsKKy8vCisvLyBUaGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBUIG11c3QgaGF2ZSBhIHB1YmxpYyBjb3B5IGNvbnN0cnVjdG9yLgorLy8gSW4gYWRkaXRpb24sIHRoZSBkZWZhdWx0IFRocmVhZExvY2FsIGNvbnN0cnVjdG9yIHJlcXVpcmVzIFQgdG8gaGF2ZQorLy8gYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKy8vCisvLyBBbiBvYmplY3QgbWFuYWdlZCBmb3IgYSB0aHJlYWQgYnkgYSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBpcyBkZWxldGVkCisvLyB3aGVuIHRoZSB0aHJlYWQgZXhpdHMuICBPciwgaWYgdGhlIFRocmVhZExvY2FsIGluc3RhbmNlIGRpZXMgaW4KKy8vIHRoYXQgdGhyZWFkLCB3aGVuIHRoZSBUaHJlYWRMb2NhbCBkaWVzLiAgSXQncyB0aGUgdXNlcidzCisvLyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbGwgb3RoZXIgdGhyZWFkcyB1c2luZyBhIFRocmVhZExvY2FsCisvLyBoYXZlIGV4aXRlZCB3aGVuIGl0IGRpZXMsIG9yIHRoZSBwZXItdGhyZWFkIG9iamVjdHMgZm9yIHRob3NlCisvLyB0aHJlYWRzIHdpbGwgbm90IGJlIGRlbGV0ZWQuCisvLworLy8gR29vZ2xlIFRlc3Qgb25seSB1c2VzIGdsb2JhbCBUaHJlYWRMb2NhbCBvYmplY3RzLiAgVGhhdCBtZWFucyB0aGV5CisvLyB3aWxsIGRpZSBhZnRlciBtYWluKCkgaGFzIHJldHVybmVkLiAgVGhlcmVmb3JlLCBubyBwZXItdGhyZWFkCisvLyBvYmplY3QgbWFuYWdlZCBieSBHb29nbGUgVGVzdCB3aWxsIGJlIGxlYWtlZCBhcyBsb25nIGFzIGFsbCB0aHJlYWRzCisvLyB1c2luZyBHb29nbGUgVGVzdCBoYXZlIGV4aXRlZCB3aGVuIG1haW4oKSByZXR1cm5zLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRMb2NhbCB7CisgcHVibGljOgorICBUaHJlYWRMb2NhbCgpIDoga2V5XyhDcmVhdGVLZXkoKSksCisgICAgICAgICAgICAgICAgICBkZWZhdWx0XygpIHt9CisgIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKSA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Xyh2YWx1ZSkge30KKworICB+VGhyZWFkTG9jYWwoKSB7CisgICAgLy8gRGVzdHJveXMgdGhlIG1hbmFnZWQgb2JqZWN0IGZvciB0aGUgY3VycmVudCB0aHJlYWQsIGlmIGFueS4KKyAgICBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOworCisgICAgLy8gUmVsZWFzZXMgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiAgVGhpcyB3aWxsICpub3QqCisgICAgLy8gZGVsZXRlIG1hbmFnZWQgb2JqZWN0cyBmb3Igb3RoZXIgdGhyZWFkcy4KKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2tleV9kZWxldGUoa2V5XykpOworICB9CisKKyAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KKyAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKnBvaW50ZXIoKSA9IHZhbHVlOyB9CisKKyBwcml2YXRlOgorICAvLyBIb2xkcyBhIHZhbHVlIG9mIHR5cGUgVC4KKyAgY2xhc3MgVmFsdWVIb2xkZXIgOiBwdWJsaWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFZhbHVlSG9sZGVyKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKworICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisKKyAgIHByaXZhdGU6CisgICAgVCB2YWx1ZV87CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlcik7CisgIH07CisKKyAgc3RhdGljIHB0aHJlYWRfa2V5X3QgQ3JlYXRlS2V5KCkgeworICAgIHB0aHJlYWRfa2V5X3Qga2V5OworICAgIC8vIFdoZW4gYSB0aHJlYWQgZXhpdHMsIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB3aWxsIGJlIGNhbGxlZCBvbgorICAgIC8vIHRoZSBvYmplY3QgbWFuYWdlZCBmb3IgdGhhdCB0aHJlYWQuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCisgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgma2V5LCAmRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSkpOworICAgIHJldHVybiBrZXk7CisgIH0KKworICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgeworICAgIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBjb25zdCBob2xkZXIgPQorICAgICAgICBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOworICAgIGlmIChob2xkZXIgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxWYWx1ZUhvbGRlcj4oaG9sZGVyKS0+cG9pbnRlcigpOworICAgIH0KKworICAgIFZhbHVlSG9sZGVyKiBjb25zdCBuZXdfaG9sZGVyID0gbmV3IFZhbHVlSG9sZGVyKGRlZmF1bHRfKTsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyX2Jhc2UgPSBuZXdfaG9sZGVyOworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5XywgaG9sZGVyX2Jhc2UpKTsKKyAgICByZXR1cm4gbmV3X2hvbGRlci0+cG9pbnRlcigpOworICB9CisKKyAgLy8gQSBrZXkgcHRocmVhZHMgdXNlcyBmb3IgbG9va2luZyB1cCBwZXItdGhyZWFkIHZhbHVlcy4KKyAgY29uc3QgcHRocmVhZF9rZXlfdCBrZXlfOworICBjb25zdCBUIGRlZmF1bHRfOyAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkTG9jYWwpOworfTsKKworIyBkZWZpbmUgR1RFU1RfSVNfVEhSRUFEU0FGRSAxCisKKyNlbHNlICAvLyBHVEVTVF9IQVNfUFRIUkVBRAorCisvLyBBIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChtdXRleCwgbG9jaywKKy8vIGFuZCB0aHJlYWQtbG9jYWwgdmFyaWFibGUpLiAgTmVjZXNzYXJ5IGZvciBjb21waWxpbmcgR29vZ2xlIFRlc3Qgd2hlcmUKKy8vIG11dGV4IGlzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBHb29nbGUgVGVzdCBpbiBtdWx0aXBsZSB0aHJlYWRzIGlzIG5vdAorLy8gc3VwcG9ydGVkIG9uIHN1Y2ggcGxhdGZvcm1zLgorCitjbGFzcyBNdXRleCB7CisgcHVibGljOgorICBNdXRleCgpIHt9CisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHt9Cit9OworCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4CisKKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCitjbGFzcyBHVGVzdE11dGV4TG9jayB7CisgcHVibGljOgorICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworLy8gVGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGhhdmUgZHVtbXkgaW1wbGVtZW50YXRpb25zLgorLy8gVGhlcmVmb3JlIEdvb2dsZSBUZXN0IGlzIG5vdCB0aHJlYWQtc2FmZS4KKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK0dURVNUX0FQSV8gc2l6ZV90IEdldFRocmVhZENvdW50KCk7CisKKy8vIFBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikgY3Jhc2hlcyB0aGUgQVJNCisvLyBjb21waWxlciBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBpbiBTdW4gU3R1ZGlvLiAgVGhlIE5va2lhIFN5bWJpYW4KKy8vIGFuZCB0aGUgSUJNIFhMIEMvQysrIGNvbXBpbGVyIHRyeSB0byBpbnN0YW50aWF0ZSBhIGNvcHkgY29uc3RydWN0b3IKKy8vIGZvciBvYmplY3RzIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzICguLi4pLCBmYWlsaW5nIGZvciB1bmNvcHlhYmxlCisvLyBvYmplY3RzLiAgV2UgZGVmaW5lIHRoaXMgdG8gZW5zdXJlIHRoYXQgb25seSBQT0QgaXMgcGFzc2VkIHRocm91Z2gKKy8vIGVsbGlwc2lzIG9uIHRoZXNlIHN5c3RlbXMuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKKy8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCisjIGRlZmluZSBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfIDEKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIDEKKyNlbmRpZgorCisvLyBUaGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycyBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKy8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzCisvLyBfY2FuXyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLAorLy8gc28gYSB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3Jrcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKKyMgZGVmaW5lIEdURVNUX05FRURTX0lTX1BPSU5URVJfIDEKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPgorc3RydWN0IGJvb2xfY29uc3RhbnQgeworICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT4gdHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBib29sX3ZhbHVlOworfTsKK3RlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+IGNvbnN0IGJvb2wgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPjo6dmFsdWU7CisKK3R5cGVkZWYgYm9vbF9jb25zdGFudDxmYWxzZT4gZmFsc2VfdHlwZTsKK3R5cGVkZWYgYm9vbF9jb25zdGFudDx0cnVlPiB0cnVlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3BvaW50ZXIgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfcG9pbnRlcjxUKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CitzdHJ1Y3QgSXRlcmF0b3JUcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJdGVyYXRvclRyYWl0czxUKj4geworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQqPiB7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiCisjIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAxCisvLyBUaGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlIHRoZSBjb21waWxlciBzdXBwb3J0cy4KK3R5cGVkZWYgX19pbnQ2NCBCaWdnZXN0SW50OworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiLyIKKyMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDAKK3R5cGVkZWYgbG9uZyBsb25nIEJpZ2dlc3RJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXRpZXMgZm9yIGNoYXIuCisKKy8vIGlzc3BhY2UoaW50IGNoKSBhbmQgZnJpZW5kcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuICBjaGFyCisvLyBtYXkgYmUgc2lnbmVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIChvciBjb21waWxlciBmbGFncykuCisvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjYXN0IGEgY2hhciB0byB1bnNpZ25lZCBjaGFyIGJlZm9yZSBjYWxsaW5nCisvLyBpc3NwYWNlKCksIGV0Yy4KKworaW5saW5lIGJvb2wgSXNBbHBoYShjaGFyIGNoKSB7CisgIHJldHVybiBpc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzQWxOdW0oY2hhciBjaCkgeworICByZXR1cm4gaXNhbG51bShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc0RpZ2l0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNMb3dlcihjaGFyIGNoKSB7CisgIHJldHVybiBpc2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzU3BhY2UoY2hhciBjaCkgeworICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQoY2hhciBjaCkgeworICByZXR1cm4gaXN4ZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQorCitpbmxpbmUgY2hhciBUb0xvd2VyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KHRvbG93ZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Cit9CitpbmxpbmUgY2hhciBUb1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KHRvdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Cit9CisKKy8vIFRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXggbmFtZXNwYWNlIGhvbGRzIHdyYXBwZXJzIGZvciBjb21tb24KKy8vIFBPU0lYIGZ1bmN0aW9ucy4gIFRoZXNlIHdyYXBwZXJzIGhpZGUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KKy8vIFdpbmRvd3MvTVNWQyBhbmQgUE9TSVggc3lzdGVtcy4gIFNpbmNlIHNvbWUgY29tcGlsZXJzIGRlZmluZSB0aGVzZQorLy8gc3RhbmRhcmQgZnVuY3Rpb25zIGFzIG1hY3JvcywgdGhlIHdyYXBwZXIgY2Fubm90IGhhdmUgdGhlIHNhbWUgbmFtZQorLy8gYXMgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCisKK25hbWVzcGFjZSBwb3NpeCB7CisKKy8vIEZ1bmN0aW9ucyB3aXRoIGEgZGlmZmVyZW50IG5hbWUgb24gV2luZG93cy4KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKwordHlwZWRlZiBzdHJ1Y3QgX3N0YXQgU3RhdFN0cnVjdDsKKworIyBpZmRlZiBfX0JPUkxBTkRDX18KK2lubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gaXNhdHR5KGZkKTsgfQoraW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgeworICByZXR1cm4gc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9CisjIGVsc2UgIC8vICFfX0JPUkxBTkRDX18KKyMgIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IElzQVRUWShpbnQgLyogZmQgKi8pIHsgcmV0dXJuIDA7IH0KKyMgIGVsc2UKK2lubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gX2lzYXR0eShmZCk7IH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQoraW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgeworICByZXR1cm4gX3N0cmljbXAoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBfc3RyZHVwKHNyYyk7IH0KKyMgZW5kaWYgIC8vIF9fQk9STEFORENfXworCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PGludD4oX2ZpbGVubyhmaWxlKSk7IH0KKy8vIFN0YXQoKSwgUm1EaXIoKSwgYW5kIElzRGlyKCkgYXJlIG5vdCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzCisvLyB0aW1lIGFuZCB0aHVzIG5vdCBkZWZpbmVkIHRoZXJlLgorIyBlbHNlCitpbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiBfZmlsZW5vKGZpbGUpOyB9CitpbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBfc3RhdChwYXRoLCBidWYpOyB9CitpbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gX3JtZGlyKGRpcik7IH0KK2lubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7CisgIHJldHVybiAoX1NfSUZESVIgJiBzdC5zdF9tb2RlKSAhPSAwOworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2Vsc2UKKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdCBTdGF0U3RydWN0OworCitpbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiBmaWxlbm8oZmlsZSk7IH0KK2lubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gaXNhdHR5KGZkKTsgfQoraW5saW5lIGludCBTdGF0KGNvbnN0IGNoYXIqIHBhdGgsIFN0YXRTdHJ1Y3QqIGJ1ZikgeyByZXR1cm4gc3RhdChwYXRoLCBidWYpOyB9CitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBzdHJjYXNlY21wKHMxLCBzMik7Cit9CitpbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0KK2lubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBybWRpcihkaXIpOyB9CitpbmxpbmUgYm9vbCBJc0Rpcihjb25zdCBTdGF0U3RydWN0JiBzdCkgeyByZXR1cm4gU19JU0RJUihzdC5zdF9tb2RlKTsgfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gRnVuY3Rpb25zIGRlcHJlY2F0ZWQgYnkgTVNWQyA4LjAuCisKKyNpZmRlZiBfTVNDX1ZFUgorLy8gVGVtcG9yYXJpbHkgZGlzYWJsZSB3YXJuaW5nIDQ5OTYgKGRlcHJlY2F0ZWQgZnVuY3Rpb24pLgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpCisjZW5kaWYKKworaW5saW5lIGNvbnN0IGNoYXIqIFN0ck5DcHkoY2hhciogZGVzdCwgY29uc3QgY2hhciogc3JjLCBzaXplX3QgbikgeworICByZXR1cm4gc3RybmNweShkZXN0LCBzcmMsIG4pOworfQorCisvLyBDaERpcigpLCBGUmVvcGVuKCksIEZET3BlbigpLCBSZWFkKCksIFdyaXRlKCksIENsb3NlKCksIGFuZAorLy8gU3RyRXJyb3IoKSBhcmVuJ3QgbmVlZGVkIG9uIFdpbmRvd3MgQ0UgYXQgdGhpcyB0aW1lIGFuZCB0aHVzIG5vdAorLy8gZGVmaW5lZCB0aGVyZS4KKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQoraW5saW5lIGludCBDaERpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIGNoZGlyKGRpcik7IH0KKyNlbmRpZgoraW5saW5lIEZJTEUqIEZPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKKyAgcmV0dXJuIGZvcGVuKHBhdGgsIG1vZGUpOworfQorI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQoraW5saW5lIEZJTEUgKkZSZW9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSwgRklMRSogc3RyZWFtKSB7CisgIHJldHVybiBmcmVvcGVuKHBhdGgsIG1vZGUsIHN0cmVhbSk7Cit9CitpbmxpbmUgRklMRSogRkRPcGVuKGludCBmZCwgY29uc3QgY2hhciogbW9kZSkgeyByZXR1cm4gZmRvcGVuKGZkLCBtb2RlKTsgfQorI2VuZGlmCitpbmxpbmUgaW50IEZDbG9zZShGSUxFKiBmcCkgeyByZXR1cm4gZmNsb3NlKGZwKTsgfQorI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQoraW5saW5lIGludCBSZWFkKGludCBmZCwgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocmVhZChmZCwgYnVmLCBjb3VudCkpOworfQoraW5saW5lIGludCBXcml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHdyaXRlKGZkLCBidWYsIGNvdW50KSk7Cit9CitpbmxpbmUgaW50IENsb3NlKGludCBmZCkgeyByZXR1cm4gY2xvc2UoZmQpOyB9CitpbmxpbmUgY29uc3QgY2hhciogU3RyRXJyb3IoaW50IGVycm51bSkgeyByZXR1cm4gc3RyZXJyb3IoZXJybnVtKTsgfQorI2VuZGlmCitpbmxpbmUgY29uc3QgY2hhciogR2V0RW52KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXZSBhcmUgb24gV2luZG93cyBDRSwgd2hpY2ggaGFzIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgcmV0dXJuIE5VTEw7CisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1N1bk9TXzVfOCkgfHwgZGVmaW5lZChfX1N1bk9TXzVfOSkKKyAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIHdoaWNoIHdlIHByb2dyYW1tYXRpY2FsbHkgY2xlYXIgd2lsbCBiZSBzZXQgdG8gdGhlCisgIC8vIGVtcHR5IHN0cmluZyByYXRoZXIgdGhhbiB1bnNldCAoTlVMTCkuICBIYW5kbGUgdGhhdCBjYXNlLgorICBjb25zdCBjaGFyKiBjb25zdCBlbnYgPSBnZXRlbnYobmFtZSk7CisgIHJldHVybiAoZW52ICE9IE5VTEwgJiYgZW52WzBdICE9ICdcMCcpID8gZW52IDogTlVMTDsKKyNlbHNlCisgIHJldHVybiBnZXRlbnYobmFtZSk7CisjZW5kaWYKK30KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VuZGlmCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gV2luZG93cyBDRSBoYXMgbm8gQyBsaWJyYXJ5LiBUaGUgYWJvcnQoKSBmdW5jdGlvbiBpcyB1c2VkIGluCisvLyBzZXZlcmFsIHBsYWNlcyBpbiBHb29nbGUgVGVzdC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHJlYXNvbmFibGUKKy8vIGltaXRhdGlvbiBvZiBzdGFuZGFyZCBiZWhhdmlvdXIuCit2b2lkIEFib3J0KCk7CisjZWxzZQoraW5saW5lIHZvaWQgQWJvcnQoKSB7IGFib3J0KCk7IH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworfSAgLy8gbmFtZXNwYWNlIHBvc2l4CisKKy8vIFRoZSBtYXhpbXVtIG51bWJlciBhIEJpZ2dlc3RJbnQgY2FuIHJlcHJlc2VudC4gIFRoaXMgZGVmaW5pdGlvbgorLy8gd29ya3Mgbm8gbWF0dGVyIEJpZ2dlc3RJbnQgaXMgcmVwcmVzZW50ZWQgaW4gb25lJ3MgY29tcGxlbWVudCBvcgorLy8gdHdvJ3MgY29tcGxlbWVudC4KKy8vCisvLyBXZSBjYW5ub3QgcmVseSBvbiBudW1lcmljX2xpbWl0cyBpbiBTVEwsIGFzIF9faW50NjQgYW5kIGxvbmcgbG9uZworLy8gYXJlIG5vdCBwYXJ0IG9mIHN0YW5kYXJkIEMrKyBhbmQgbnVtZXJpY19saW1pdHMgZG9lc24ndCBuZWVkIHRvIGJlCisvLyBkZWZpbmVkIGZvciB0aGVtLgorY29uc3QgQmlnZ2VzdEludCBrTWF4QmlnZ2VzdEludCA9CisgICAgfihzdGF0aWNfY2FzdDxCaWdnZXN0SW50PigxKSA8PCAoOCpzaXplb2YoQmlnZ2VzdEludCkgLSAxKSk7CisKKy8vIFRoaXMgdGVtcGxhdGUgY2xhc3Mgc2VydmVzIGFzIGEgY29tcGlsZS10aW1lIGZ1bmN0aW9uIGZyb20gc2l6ZSB0bworLy8gdHlwZS4gIEl0IG1hcHMgYSBzaXplIGluIGJ5dGVzIHRvIGEgcHJpbWl0aXZlIHR5cGUgd2l0aCB0aGF0CisvLyBzaXplLiBlLmcuCisvLworLy8gICBUeXBlV2l0aFNpemU8ND46OlVJbnQKKy8vCisvLyBpcyB0eXBlZGVmLWVkIHRvIGJlIHVuc2lnbmVkIGludCAodW5zaWduZWQgaW50ZWdlciBtYWRlIHVwIG9mIDQKKy8vIGJ5dGVzKS4KKy8vCisvLyBTdWNoIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlbG9uZyB0byBTVEwsIGJ1dCBJIGNhbm5vdCBmaW5kIGl0CisvLyB0aGVyZS4KKy8vCisvLyBHb29nbGUgVGVzdCB1c2VzIHRoaXMgY2xhc3MgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGZsb2F0aW5nLXBvaW50CisvLyBjb21wYXJpc29uLgorLy8KKy8vIEZvciBub3cgaXQgb25seSBoYW5kbGVzIFVJbnQgKHVuc2lnbmVkIGludCkgYXMgdGhhdCdzIGFsbCBHb29nbGUgVGVzdAorLy8gbmVlZHMuICBPdGhlciB0eXBlcyBjYW4gYmUgZWFzaWx5IGFkZGVkIGluIHRoZSBmdXR1cmUgaWYgbmVlZAorLy8gYXJpc2VzLgordGVtcGxhdGUgPHNpemVfdCBzaXplPgorY2xhc3MgVHlwZVdpdGhTaXplIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgcHJldmVudHMgdGhlIHVzZXIgZnJvbSB1c2luZyBUeXBlV2l0aFNpemU8Tj4gd2l0aCBpbmNvcnJlY3QKKyAgLy8gdmFsdWVzIG9mIE4uCisgIHR5cGVkZWYgdm9pZCBVSW50OworfTsKKworLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDQuCit0ZW1wbGF0ZSA8PgorY2xhc3MgVHlwZVdpdGhTaXplPDQ+IHsKKyBwdWJsaWM6CisgIC8vIHVuc2lnbmVkIGludCBoYXMgc2l6ZSA0IGluIGJvdGggZ2NjIGFuZCBNU1ZDLgorICAvLworICAvLyBBcyBiYXNlL2Jhc2ljdHlwZXMuaCBkb2Vzbid0IGNvbXBpbGUgb24gV2luZG93cywgd2UgY2Fubm90IHVzZQorICAvLyB1aW50MzIsIHVpbnQ2NCwgYW5kIGV0YyBoZXJlLgorICB0eXBlZGVmIGludCBJbnQ7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7Cit9OworCisvLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgOC4KK3RlbXBsYXRlIDw+CitjbGFzcyBUeXBlV2l0aFNpemU8OD4geworIHB1YmxpYzoKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgdHlwZWRlZiBfX2ludDY0IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJbnQ7CisjZWxzZQorICB0eXBlZGVmIGxvbmcgbG9uZyBJbnQ7ICAvLyBOT0xJTlQKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDsgIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9OworCisvLyBJbnRlZ2VyIHR5cGVzIG9mIGtub3duIHNpemVzLgordHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OkludCBJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpVSW50IFVJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6VUludCBVSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IFRpbWVJbk1pbGxpczsgIC8vIFJlcHJlc2VudHMgdGltZSBpbiBtaWxsaXNlY29uZHMuCisKKy8vIFV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIGZsYWdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKy8vIE1hY3JvIGZvciByZWZlcmVuY2luZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfRkxBRyhuYW1lKSBGTEFHU19ndGVzdF8jI25hbWUKKworLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkgR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKKyAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCisgICAgR1RFU1RfQVBJXyBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nIEdURVNUX0ZMQUcobmFtZSkKKworLy8gTWFjcm9zIGZvciBkZWZpbmluZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKKyAgICBHVEVTVF9BUElfIGJvb2wgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR1RFU1RfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorI2RlZmluZSBHVEVTVF9ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmcgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0CisvLyB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUgdW5jaGFuZ2VkIGFuZCByZXR1cm5zCisvLyBmYWxzZS4KKy8vIFRPRE8oY2hhbmRsZXJjKTogRmluZCBhIGJldHRlciB3YXkgdG8gcmVmYWN0b3IgZmxhZyBhbmQgZW52aXJvbm1lbnQgcGFyc2luZworLy8gb3V0IG9mIGJvdGggZ3Rlc3QtcG9ydC5jYyBhbmQgZ3Rlc3QuY2MgdG8gYXZvaWQgZXhwb3J0aW5nIHRoaXMgdXRpbGl0eQorLy8gZnVuY3Rpb24uCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgYm9vbC9JbnQzMi9zdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbCk7CitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsKTsKK2NvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzYTA3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCkBAIC0wLDAgKzEsMzUwIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSBTdHJpbmcgY2xhc3MgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuIFRoZXkgc2hvdWxkIG5vdCB1c2VkCisvLyBieSBjb2RlIGV4dGVybmFsIHRvIEdvb2dsZSBUZXN0LgorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgaXMgI2luY2x1ZGVkIGJ5IDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPi4KKy8vIEl0IHNob3VsZCBub3QgYmUgI2luY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIHN0cmluZy5oIGlzIG5vdCBndWFyYW50ZWVkIHRvIHByb3ZpZGUgc3RyY3B5IG9uIEMrKyBCdWlsZGVyLgorIyBpbmNsdWRlIDxtZW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTdHJpbmcgLSBhIFVURi04IHN0cmluZyBjbGFzcy4KKy8vCisvLyBGb3IgaGlzdG9yaWMgcmVhc29ucywgd2UgZG9uJ3QgdXNlIHN0ZDo6c3RyaW5nLgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZXBsYWNlIHRoaXMgY2xhc3Mgd2l0aCBzdGQ6OnN0cmluZyBvcgorLy8gaW1wbGVtZW50IGl0IGluIHRlcm1zIG9mIHRoZSBsYXR0ZXIuCisvLworLy8gTm90ZSB0aGF0IFN0cmluZyBjYW4gcmVwcmVzZW50IGJvdGggTlVMTCBhbmQgdGhlIGVtcHR5IHN0cmluZywKKy8vIHdoaWxlIHN0ZDo6c3RyaW5nIGNhbm5vdCByZXByZXNlbnQgTlVMTC4KKy8vCisvLyBOVUxMIGFuZCB0aGUgZW1wdHkgc3RyaW5nIGFyZSBjb25zaWRlcmVkIGRpZmZlcmVudC4gIE5VTEwgaXMgbGVzcworLy8gdGhhbiBhbnl0aGluZyAoaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcpIGV4Y2VwdCBpdHNlbGYuCisvLworLy8gVGhpcyBjbGFzcyBvbmx5IHByb3ZpZGVzIG1pbmltdW0gZnVuY3Rpb25hbGl0eSBuZWNlc3NhcnkgZm9yCisvLyBpbXBsZW1lbnRpbmcgR29vZ2xlIFRlc3QuICBXZSBkbyBub3QgaW50ZW5kIHRvIGltcGxlbWVudCBhIGZ1bGwtZmxlZGdlZAorLy8gc3RyaW5nIGNsYXNzIGhlcmUuCisvLworLy8gU2luY2UgdGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBwcm92aWRlIGEgc3Vic3RpdHV0ZSBmb3IKKy8vIHN0ZDo6c3RyaW5nIG9uIHBsYXRmb3JtcyB3aGVyZSBpdCBjYW5ub3QgYmUgdXNlZCwgd2UgZGVmaW5lIGEgY29weQorLy8gY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzIHN1Y2ggdGhhdCB3ZSBkb24ndCBuZWVkCisvLyBjb25kaXRpb25hbCBjb21waWxhdGlvbiBpbiBhIGxvdCBvZiBwbGFjZXMuCisvLworLy8gSW4gb3JkZXIgdG8gbWFrZSB0aGUgcmVwcmVzZW50YXRpb24gZWZmaWNpZW50LCB0aGUgZCd0b3Igb2YgU3RyaW5nCisvLyBpcyBub3QgdmlydHVhbC4gIFRoZXJlZm9yZSBETyBOT1QgSU5IRVJJVCBGUk9NIFN0cmluZy4KK2NsYXNzIEdURVNUX0FQSV8gU3RyaW5nIHsKKyBwdWJsaWM6CisgIC8vIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMKKworICAvLyBSZXR1cm5zIHRoZSBpbnB1dCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIGlmIGl0J3Mgbm90IE5VTEw7CisgIC8vIG90aGVyd2lzZSByZXR1cm5zICIobnVsbCkiLiAgRm9yIGV4YW1wbGUsICJcIkhlbGxvXCIiIGlzIHJldHVybmVkCisgIC8vIGZvciBpbnB1dCAiSGVsbG8iLgorICAvLworICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJpbnRpbmcgYSBDIHN0cmluZyBpbiB0aGUgc3ludGF4IG9mIGEgbGl0ZXJhbC4KKyAgLy8KKyAgLy8gS25vd24gaXNzdWU6IGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBoYW5kbGVkIHlldC4KKyAgc3RhdGljIFN0cmluZyBTaG93Q1N0cmluZ1F1b3RlZChjb25zdCBjaGFyKiBjX3N0cik7CisKKyAgLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUKKyAgLy8gY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuIHZhbHVlIHVzaW5nCisgIC8vIGRlbGV0ZVtdLiAgUmV0dXJucyB0aGUgY2xvbmVkIHN0cmluZywgb3IgTlVMTCBpZiB0aGUgaW5wdXQgaXMKKyAgLy8gTlVMTC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBzdHJkdXAoKSBpbiBzdHJpbmcuaCwgd2hpY2ggYWxsb2NhdGVzCisgIC8vIG1lbW9yeSB1c2luZyBtYWxsb2MoKS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBjX3N0cik7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXaW5kb3dzIENFIGRvZXMgbm90IGhhdmUgdGhlICdBTlNJJyB2ZXJzaW9ucyBvZiBXaW4zMiBBUElzLiBUbyBiZQorICAvLyBhYmxlIHRvIHBhc3Mgc3RyaW5ncyB0byBXaW4zMiBBUElzIG9uIENFIHdlIG5lZWQgdG8gY29udmVydCB0aGVtCisgIC8vIHRvICdVbmljb2RlJywgVVRGLTE2LgorCisgIC8vIENyZWF0ZXMgYSBVVEYtMTYgd2lkZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gQU5TSSBzdHJpbmcsIGFsbG9jYXRpbmcKKyAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisgIC8vIGlucHV0IGlzIE5VTEwuCisgIC8vCisgIC8vIFRoZSB3aWRlIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCisgIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQorICAvLyBDIHJ1bnRpbWUuCisgIHN0YXRpYyBMUENXU1RSIEFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGNfc3RyKTsKKworICAvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nCisgIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKyAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorICAvLyBpbnB1dCBpcyBOVUxMLgorICAvLworICAvLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEFOU0kgY29kZXBhZ2UgKENQX0FDUCkgdG8KKyAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlCisgIC8vIEMgcnVudGltZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIFV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKTsKKyNlbmRpZgorCisgIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIENTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLCBjb25zdCBjaGFyKiByaHMpOworCisgIC8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhIFN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCisgIC8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcKKyAgLy8gdGhlIGNvbnZlcnNpb24sICIoZmFpbGVkIHRvIGNvbnZlcnQgZnJvbSB3aWRlIHN0cmluZykiIGlzCisgIC8vIHJldHVybmVkLgorICBzdGF0aWMgU3RyaW5nIFNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKworICAvLyBTaW1pbGFyIHRvIFNob3dXaWRlQ1N0cmluZygpLCBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIGVuY2xvc2VzCisgIC8vIHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGluIGRvdWJsZSBxdW90ZXMuCisgIHN0YXRpYyBTdHJpbmcgU2hvd1dpZGVDU3RyaW5nUXVvdGVkKGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpOworCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisgIC8vIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCisgIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RhdGljIGJvb2wgV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCB3Y2hhcl90KiByaHMpOworCisgIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJocyk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5CisgIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCisgIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgorICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQorICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAorICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgorICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCisgIC8vIGN1cnJlbnQgbG9jYWxlLgorICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocyk7CisKKyAgLy8gRm9ybWF0cyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIGEgU3RyaW5nLCB1c2luZyB0aGUgc2FtZSBmb3JtYXQKKyAgLy8gc3BlYyBzdHJpbmcgYXMgZm9yIHByaW50Zi4KKyAgLy8KKyAgLy8gV2UgZG8gbm90IHVzZSB0aGUgU3RyaW5nUHJpbnRmIGNsYXNzIGFzIGl0IGlzIG5vdCB1bml2ZXJzYWxseQorICAvLyBhdmFpbGFibGUuCisgIC8vCisgIC8vIFRoZSByZXN1bHQgaXMgbGltaXRlZCB0byA0MDk2IGNoYXJhY3RlcnMgKGluY2x1ZGluZyB0aGUgdGFpbGluZworICAvLyAwKS4gIElmIDQwOTYgY2hhcmFjdGVycyBhcmUgbm90IGVub3VnaCB0byBmb3JtYXQgdGhlIGlucHV0LAorICAvLyAiPGJ1ZmZlciBleGNlZWRlZD4iIGlzIHJldHVybmVkLgorICBzdGF0aWMgU3RyaW5nIEZvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKyAgLy8gQyd0b3JzCisKKyAgLy8gVGhlIGRlZmF1bHQgYyd0b3IgY29uc3RydWN0cyBhIE5VTEwgc3RyaW5nLgorICBTdHJpbmcoKSA6IGNfc3RyXyhOVUxMKSwgbGVuZ3RoXygwKSB7fQorCisgIC8vIENvbnN0cnVjdHMgYSBTdHJpbmcgYnkgY2xvbmluZyBhIDAtdGVybWluYXRlZCBDIHN0cmluZy4KKyAgU3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHIpIHsgIC8vIE5PTElOVAorICAgIGlmIChhX2Nfc3RyID09IE5VTEwpIHsKKyAgICAgIGNfc3RyXyA9IE5VTEw7CisgICAgICBsZW5ndGhfID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgQ29uc3RydWN0Tm9uTnVsbChhX2Nfc3RyLCBzdHJsZW4oYV9jX3N0cikpOworICAgIH0KKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSBTdHJpbmcgYnkgY29weWluZyBhIGdpdmVuIG51bWJlciBvZiBjaGFycyBmcm9tIGEKKyAgLy8gYnVmZmVyLiAgRS5nLiBTdHJpbmcoImhlbGxvIiwgMykgY3JlYXRlcyB0aGUgc3RyaW5nICJoZWwiLAorICAvLyBTdHJpbmcoImFcMGJjZCIsIDQpIGNyZWF0ZXMgImFcMGJjIiwgU3RyaW5nKE5VTEwsIDApIGNyZWF0ZXMgIiIsCisgIC8vIGFuZCBTdHJpbmcoTlVMTCwgMSkgcmVzdWx0cyBpbiBhY2Nlc3MgdmlvbGF0aW9uLgorICBTdHJpbmcoY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgYV9sZW5ndGgpIHsKKyAgICBDb25zdHJ1Y3ROb25OdWxsKGJ1ZmZlciwgYV9sZW5ndGgpOworICB9CisKKyAgLy8gVGhlIGNvcHkgYyd0b3IgY3JlYXRlcyBhIG5ldyBjb3B5IG9mIHRoZSBzdHJpbmcuICBUaGUgdHdvCisgIC8vIFN0cmluZyBvYmplY3RzIGRvIG5vdCBzaGFyZSBjb250ZW50LgorICBTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHIpIDogY19zdHJfKE5VTEwpLCBsZW5ndGhfKDApIHsgKnRoaXMgPSBzdHI7IH0KKworICAvLyBEJ3Rvci4gIFN0cmluZyBpcyBpbnRlbmRlZCB0byBiZSBhIGZpbmFsIGNsYXNzLCBzbyB0aGUgZCd0b3IKKyAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHZpcnR1YWwuCisgIH5TdHJpbmcoKSB7IGRlbGV0ZVtdIGNfc3RyXzsgfQorCisgIC8vIEFsbG93cyBhIFN0cmluZyB0byBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhbiA6OnN0ZDo6c3RyaW5nIG9yCisgIC8vIDo6c3RyaW5nLCBhbmQgdmljZSB2ZXJzYS4gIENvbnZlcnRpbmcgYSBTdHJpbmcgY29udGFpbmluZyBhIE5VTEwKKyAgLy8gcG9pbnRlciB0byA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RyaW5nIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgLy8gQ29udmVydGluZyBhIDo6c3RkOjpzdHJpbmcgb3IgOjpzdHJpbmcgY29udGFpbmluZyBhbiBlbWJlZGRlZCBOVUwKKyAgLy8gY2hhcmFjdGVyIHRvIGEgU3RyaW5nIHdpbGwgcmVzdWx0IGluIHRoZSBwcmVmaXggdXAgdG8gdGhlIGZpcnN0CisgIC8vIE5VTCBjaGFyYWN0ZXIuCisgIFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBDb25zdHJ1Y3ROb25OdWxsKHN0ci5jX3N0cigpLCBzdHIubGVuZ3RoKCkpOworICB9CisKKyAgb3BlcmF0b3IgOjpzdGQ6OnN0cmluZygpIGNvbnN0IHsgcmV0dXJuIDo6c3RkOjpzdHJpbmcoY19zdHIoKSwgbGVuZ3RoKCkpOyB9CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICBTdHJpbmcoY29uc3QgOjpzdHJpbmcmIHN0cikgeworICAgIENvbnN0cnVjdE5vbk51bGwoc3RyLmNfc3RyKCksIHN0ci5sZW5ndGgoKSk7CisgIH0KKworICBvcGVyYXRvciA6OnN0cmluZygpIGNvbnN0IHsgcmV0dXJuIDo6c3RyaW5nKGNfc3RyKCksIGxlbmd0aCgpKTsgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBlbXB0eSBzdHJpbmcgKGkuZS4gIiIpLgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gKGNfc3RyKCkgIT0gTlVMTCkgJiYgKGxlbmd0aCgpID09IDApOyB9CisKKyAgLy8gQ29tcGFyZXMgdGhpcyB3aXRoIGFub3RoZXIgU3RyaW5nLgorICAvLyBSZXR1cm5zIDwgMCBpZiB0aGlzIGlzIGxlc3MgdGhhbiByaHMsIDAgaWYgdGhpcyBpcyBlcXVhbCB0byByaHMsIG9yID4gMAorICAvLyBpZiB0aGlzIGlzIGdyZWF0ZXIgdGhhbiByaHMuCisgIGludCBDb21wYXJlKGNvbnN0IFN0cmluZyYgcmhzKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgU3RyaW5nIGVxdWFscyB0aGUgZ2l2ZW4gQyBzdHJpbmcuICBBIE5VTEwKKyAgLy8gc3RyaW5nIGFuZCBhIG5vbi1OVUxMIHN0cmluZyBhcmUgY29uc2lkZXJlZCBub3QgZXF1YWwuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyKiBhX2Nfc3RyKSBjb25zdCB7IHJldHVybiBDb21wYXJlKGFfY19zdHIpID09IDA7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgU3RyaW5nIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gU3RyaW5nLiAgQQorICAvLyBOVUxMIHN0cmluZyBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiAiIi4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RyaW5nJiByaHMpIGNvbnN0IHsgcmV0dXJuIENvbXBhcmUocmhzKSA8IDA7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgU3RyaW5nIGRvZXNuJ3QgZXF1YWwgdGhlIGdpdmVuIEMgc3RyaW5nLiAgQSBOVUxMCisgIC8vIHN0cmluZyBhbmQgYSBub24tTlVMTCBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgbm90IGVxdWFsLgorICBib29sIG9wZXJhdG9yIT0oY29uc3QgY2hhciogYV9jX3N0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBhX2Nfc3RyKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXguICAqQW55KgorICAvLyBTdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhIE5VTEwgb3IgZW1wdHkgc3VmZml4LgorICBib29sIEVuZHNXaXRoKGNvbnN0IGNoYXIqIHN1ZmZpeCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgbm90IGNvbnNpZGVyaW5nCisgIC8vIGNhc2UuIEFueSBTdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhIE5VTEwgb3IgZW1wdHkgc3VmZml4LgorICBib29sIEVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKGNvbnN0IGNoYXIqIHN1ZmZpeCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNhcHN1bGF0ZWQgc3RyaW5nLCBvciAwIGlmIHRoZQorICAvLyBzdHJpbmcgaXMgTlVMTC4KKyAgc2l6ZV90IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KKworICAvLyBHZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBTdHJpbmcgb2JqZWN0IHJlcHJlc2VudHMuCisgIC8vIFRoZSBTdHJpbmcgb2JqZWN0IHN0aWxsIG93bnMgdGhlIHN0cmluZy4gIFRoZXJlZm9yZSB0aGUgY2FsbGVyCisgIC8vIHNob3VsZCBOT1QgZGVsZXRlIHRoZSByZXR1cm4gdmFsdWUuCisgIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gY19zdHJfOyB9CisKKyAgLy8gQXNzaWducyBhIEMgc3RyaW5nIHRvIHRoaXMgb2JqZWN0LiAgU2VsZi1hc3NpZ25tZW50IHdvcmtzLgorICBjb25zdCBTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBjaGFyKiBhX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzID0gU3RyaW5nKGFfY19zdHIpOworICB9CisKKyAgLy8gQXNzaWducyBhIFN0cmluZyBvYmplY3QgdG8gdGhpcyBvYmplY3QuICBTZWxmLWFzc2lnbm1lbnQgd29ya3MuCisgIGNvbnN0IFN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IFN0cmluZyYgcmhzKSB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgZGVsZXRlW10gY19zdHJfOworICAgICAgaWYgKHJocy5jX3N0cigpID09IE5VTEwpIHsKKyAgICAgICAgY19zdHJfID0gTlVMTDsKKyAgICAgICAgbGVuZ3RoXyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb25zdHJ1Y3ROb25OdWxsKHJocy5jX3N0cigpLCByaHMubGVuZ3RoKCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQ29uc3RydWN0cyBhIG5vbi1OVUxMIFN0cmluZyBmcm9tIHRoZSBnaXZlbiBjb250ZW50LiAgVGhpcworICAvLyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiBjX3N0cl8gaGFzIG5vdCBiZWVuIGFsbG9jYXRlZC4KKyAgLy8gQ29uc3RydWN0Tm9uTnVsbChOVUxMLCAwKSByZXN1bHRzIGluIGFuIGVtcHR5IHN0cmluZyAoIiIpLgorICAvLyBDb25zdHJ1Y3ROb25OdWxsKE5VTEwsIG5vbl96ZXJvKSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgIHZvaWQgQ29uc3RydWN0Tm9uTnVsbChjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBhX2xlbmd0aCkgeworICAgIGNoYXIqIGNvbnN0IHN0ciA9IG5ldyBjaGFyW2FfbGVuZ3RoICsgMV07CisgICAgbWVtY3B5KHN0ciwgYnVmZmVyLCBhX2xlbmd0aCk7CisgICAgc3RyW2FfbGVuZ3RoXSA9ICdcMCc7CisgICAgY19zdHJfID0gc3RyOworICAgIGxlbmd0aF8gPSBhX2xlbmd0aDsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGNfc3RyXzsKKyAgc2l6ZV90IGxlbmd0aF87Cit9OyAgLy8gY2xhc3MgU3RyaW5nCisKKy8vIFN0cmVhbXMgYSBTdHJpbmcgdG8gYW4gb3N0cmVhbS4gIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIFN0cmluZworLy8gaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KK2lubGluZSA6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0cmluZyYgc3RyKSB7CisgIGlmIChzdHIuY19zdHIoKSA9PSBOVUxMKSB7CisgICAgb3MgPDwgIihudWxsKSI7CisgIH0gZWxzZSB7CisgICAgY29uc3QgY2hhciogY29uc3QgY19zdHIgPSBzdHIuY19zdHIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgaWYgKGNfc3RyW2ldID09ICdcMCcpIHsKKyAgICAgICAgb3MgPDwgIlxcMCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvcyA8PCBjX3N0cltpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG9zOworfQorCisvLyBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBzdHJpbmdzdHJlYW0ncyBidWZmZXIgYXMgYSBTdHJpbmcuICBFYWNoICdcMCcKKy8vIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCitHVEVTVF9BUElfIFN0cmluZyBTdHJpbmdTdHJlYW1Ub1N0cmluZyg6OnN0ZDo6c3RyaW5nc3RyZWFtKiBzdHJlYW0pOworCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYSBTdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisKKy8vIERlY2xhcmVkIGhlcmUgYnV0IGRlZmluZWQgaW4gZ3Rlc3QuaCwgc28gdGhhdCBpdCBoYXMgYWNjZXNzCisvLyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgTWVzc2FnZSBjbGFzcywgcmVxdWlyZWQgYnkgdGhlIEFSTQorLy8gY29tcGlsZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1NUUklOR19IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhZjUwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgKQEAgLTAsMCArMSw5NjggQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGEgc2NyaXB0LiAgRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgVFIxIHR1cGxlIG5lZWRlZCBieSBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2suCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIDo6c3RkOjpwYWlyLgorCisvLyBUaGUgY29tcGlsZXIgdXNlZCBpbiBTeW1iaWFuIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHVzIGZyb20gZGVjbGFyaW5nIHRoZQorLy8gdHVwbGUgdGVtcGxhdGUgYXMgYSBmcmllbmQgKGl0IGNvbXBsYWlucyB0aGF0IHR1cGxlIGlzIHJlZGVmaW5lZCkuICBUaGlzCisvLyBoYWNrIGJ5cGFzc2VzIHRoZSBidWcgYnkgZGVjbGFyaW5nIHRoZSBtZW1iZXJzIHRoYXQgc2hvdWxkIG90aGVyd2lzZSBiZQorLy8gcHJpdmF0ZSBhcyBwdWJsaWMuCisvLyBTdW4gU3R1ZGlvIHZlcnNpb25zIDwgMTIgYWxzbyBoYXZlIHRoZSBhYm92ZSBidWcuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCAoZGVmaW5lZChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDU5MCkKKyMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBwdWJsaWM6CisjZWxzZQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIFwKKyAgICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4gZnJpZW5kIGNsYXNzIHR1cGxlOyBcCisgICBwcml2YXRlOgorI2VuZGlmCisKKy8vIEdURVNUX25fVFVQTEVfKFQpIGlzIHRoZSB0eXBlIG9mIGFuIG4tdHVwbGUuCisjZGVmaW5lIEdURVNUXzBfVFVQTEVfKFQpIHR1cGxlPD4KKyNkZWZpbmUgR1RFU1RfMV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzJfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF8zX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzVfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF82X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfN19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzhfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF85X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgVCMjNywgVCMjOCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCBUIyM4LCBUIyM5PgorCisvLyBHVEVTVF9uX1RZUEVOQU1FU18oVCkgZGVjbGFyZXMgYSBsaXN0IG9mIG4gdHlwZW5hbWVzLgorI2RlZmluZSBHVEVTVF8wX1RZUEVOQU1FU18oVCkKKyNkZWZpbmUgR1RFU1RfMV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAKKyNkZWZpbmUgR1RFU1RfMl9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEKKyNkZWZpbmUgR1RFU1RfM19UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIKKyNkZWZpbmUgR1RFU1RfNF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzCisjZGVmaW5lIEdURVNUXzVfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNAorI2RlZmluZSBHVEVTVF82X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUKKyNkZWZpbmUgR1RFU1RfN19UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2CisjZGVmaW5lIEdURVNUXzhfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgdHlwZW5hbWUgVCMjNworI2RlZmluZSBHVEVTVF85X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIFwKKyAgICB0eXBlbmFtZSBUIyM3LCB0eXBlbmFtZSBUIyM4CisjZGVmaW5lIEdURVNUXzEwX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIFwKKyAgICB0eXBlbmFtZSBUIyM3LCB0eXBlbmFtZSBUIyM4LCB0eXBlbmFtZSBUIyM5CisKKy8vIEluIHRoZW9yeSwgZGVmaW5pbmcgc3R1ZmYgaW4gdGhlIDo6c3RkIG5hbWVzcGFjZSBpcyB1bmRlZmluZWQKKy8vIGJlaGF2aW9yLiAgV2UgY2FuIGRvIHRoaXMgYXMgd2UgYXJlIHBsYXlpbmcgdGhlIHJvbGUgb2YgYSBzdGFuZGFyZAorLy8gbGlicmFyeSB2ZW5kb3IuCituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSB0cjEgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDAgPSB2b2lkLCB0eXBlbmFtZSBUMSA9IHZvaWQsIHR5cGVuYW1lIFQyID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUMyA9IHZvaWQsIHR5cGVuYW1lIFQ0ID0gdm9pZCwgdHlwZW5hbWUgVDUgPSB2b2lkLAorICAgIHR5cGVuYW1lIFQ2ID0gdm9pZCwgdHlwZW5hbWUgVDcgPSB2b2lkLCB0eXBlbmFtZSBUOCA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDkgPSB2b2lkPgorY2xhc3MgdHVwbGU7CisKKy8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMCisvLyBJTVBMRU1FTlRBVElPTiBERVRBSUwgYW5kIE1VU1QgTk9UIEJFIFVTRUQgRElSRUNUTFkgaW4gdXNlciBjb2RlLgorbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gQnlSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBjb25zdCBUJi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBCeVJlZi4KKyNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUKKworLy8gQWRkUmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgVCYuICBUaGlzCisvLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWYgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuCisjZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4KK3RlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0OworCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlCisvLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4KK3RlbXBsYXRlIDxib29sIGtJbmRleFZhbGlkLCBpbnQga0luZGV4LCBjbGFzcyBUdXBsZT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ7CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAwLCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUMCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMSwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDEgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDIsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQyIHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAzLCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUMyB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNCwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDQgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDUsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQ1IHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA2LCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUNiB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNywgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDcgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDgsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQ4IHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA5LCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUOSB0eXBlOyB9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPD4KK2NsYXNzIHR1cGxlPD4geworIHB1YmxpYzoKKyAgdHVwbGUoKSB7fQorICB0dXBsZShjb25zdCB0dXBsZSYgLyogdCAqLykgIHt9CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIC8qIHQgKi8pIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfMV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCkgOiBmMF8oZjApIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfMl9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxKSA6IGYwXyhmMCksCisgICAgICBmMV8oZjEpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KKyAgdHVwbGUoY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgOiBmMF8ocC5maXJzdCksIGYxXyhwLnNlY29uZCkge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSB7CisgICAgZjBfID0gcC5maXJzdDsKKyAgICBmMV8gPSBwLnNlY29uZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF8zX1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF80X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMykgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAorICAgICAgZjNfKGYzKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF80X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF80X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF80X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF81X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ0KSBmNCkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF81X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF81X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF81X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzZfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzZfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzZfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzZfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF83X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNikge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzhfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ3KSBmNykgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAorICAgICAgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICBmN18gPSB0LmY3XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87CisgIFQ3IGY3XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF85X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCksIGY4XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAorICAgICAgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSwgZjhfKGY4KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICBmN18gPSB0LmY3XzsKKyAgICBmOF8gPSB0LmY4XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87CisgIFQ3IGY3XzsKKyAgVDggZjhfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitjbGFzcyB0dXBsZSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCksIGY4XygpLAorICAgICAgZjlfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LCBHVEVTVF9CWV9SRUZfKFQ3KSBmNywKKyAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4LCBHVEVTVF9CWV9SRUZfKFQ5KSBmOSkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAorICAgICAgZjNfKGYzKSwgZjRfKGY0KSwgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSwgZjhfKGY4KSwgZjlfKGY5KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pLCBmOV8odC5mOV8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwKKyAgICAgIGY5Xyh0LmY5Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgZjhfID0gdC5mOF87CisgICAgZjlfID0gdC5mOV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187CisgIFQ4IGY4XzsKKyAgVDkgZjlfOworfTsKKworLy8gNi4xLjMuMiBUdXBsZSBjcmVhdGlvbiBmdW5jdGlvbnMuCisKKy8vIEtub3duIGxpbWl0YXRpb25zOiB3ZSBkb24ndCBzdXBwb3J0IHBhc3NpbmcgYW4KKy8vIHN0ZDo6dHIxOjpyZWZlcmVuY2Vfd3JhcHBlcjxUPiB0byBtYWtlX3R1cGxlKCkuICBBbmQgd2UgZG9uJ3QKKy8vIGltcGxlbWVudCB0aWUoKS4KKworaW5saW5lIHR1cGxlPD4gbWFrZV90dXBsZSgpIHsgcmV0dXJuIHR1cGxlPD4oKTsgfQorCit0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzFfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwKSB7CisgIHJldHVybiBHVEVTVF8xX1RVUExFXyhUKShmMCk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfMl9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSkgeworICByZXR1cm4gR1RFU1RfMl9UVVBMRV8oVCkoZjAsIGYxKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8zX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIpIHsKKyAgcmV0dXJuIEdURVNUXzNfVFVQTEVfKFQpKGYwLCBmMSwgZjIpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzRfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMpIHsKKyAgcmV0dXJuIEdURVNUXzRfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF81X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQpIHsKKyAgcmV0dXJuIEdURVNUXzVfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNl9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUpIHsKKyAgcmV0dXJuIEdURVNUXzZfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzdfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYpIHsKKyAgcmV0dXJuIEdURVNUXzdfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF84X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcpIHsKKyAgcmV0dXJuIEdURVNUXzhfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNyk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfOV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAorICAgIGNvbnN0IFQ4JiBmOCkgeworICByZXR1cm4gR1RFU1RfOV9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzEwX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcsCisgICAgY29uc3QgVDgmIGY4LCBjb25zdCBUOSYgZjkpIHsKKyAgcmV0dXJuIEdURVNUXzEwX1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4LCBmOSk7Cit9CisKKy8vIDYuMS4zLjMgVHVwbGUgaGVscGVyIGNsYXNzZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4gc3RydWN0IHR1cGxlX3NpemU7CisKK3RlbXBsYXRlIDxHVEVTVF8wX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8wX1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMDsgfTsKKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzFfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMl9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8zX1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMzsgfTsKKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzRfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA0OyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNV9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF82X1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNjsgfTsKKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzdfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA3OyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOF9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDg7IH07CisKK3RlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF85X1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gOTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDEwOyB9OworCit0ZW1wbGF0ZSA8aW50IGssIGNsYXNzIFR1cGxlPgorc3RydWN0IHR1cGxlX2VsZW1lbnQgeworICB0eXBlZGVmIHR5cGVuYW1lIGd0ZXN0X2ludGVybmFsOjpUdXBsZUVsZW1lbnQ8CisgICAgICBrIDwgKHR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSksIGssIFR1cGxlPjo6dHlwZSB0eXBlOworfTsKKworI2RlZmluZSBHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBUdXBsZSkgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxrLCBUdXBsZSA+Ojp0eXBlCisKKy8vIDYuMS4zLjQgRWxlbWVudCBhY2Nlc3MuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8MD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwxPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygxLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYxXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygxLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDI+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDIsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjJfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDIsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Mz4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMywgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mM187IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMywgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw0PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg0LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY0XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg0LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDU+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDUsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjVfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDUsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Nj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNiwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNl87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNiwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw3PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg3LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY3XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg3LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDg+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDgsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjhfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDgsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8OT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDxpbnQgaywgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK0dURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssIEdURVNUXzEwX1RVUExFXyhUKSkpCitnZXQoR1RFU1RfMTBfVFVQTEVfKFQpJiB0KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpGaWVsZCh0KTsKK30KKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCAgR1RFU1RfMTBfVFVQTEVfKFQpKSkKK2dldChjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkNvbnN0RmllbGQodCk7Cit9CisKKy8vIDYuMS4zLjUgUmVsYXRpb25hbCBvcGVyYXRvcnMKKworLy8gV2Ugb25seSBpbXBsZW1lbnQgPT0gYW5kICE9LCBhcyB3ZSBkb24ndCBoYXZlIGEgbmVlZCBmb3IgdGhlIHJlc3QgeWV0LgorCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPjo6RXEodDEsIHQyKSByZXR1cm5zIHRydWUgaWYgdGhlCisvLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLgorLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3IoazEsIGsyKSB3b3VsZCBiZSBhIGNvbXBpbGVyIGVycm9yIGlmCisvLyBrMSAhPSBrMi4KK3RlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPDAsIDA+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDxpbnQgaz4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KKyAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiB0MSwgY29uc3QgVHVwbGUyJiB0MikgeworICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmCisgICAgICAgIDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDEpID09IDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDIpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6U2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8CisgICAgICB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhUKT46OnZhbHVlLAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVSk+Ojp2YWx1ZT46OkVxKHQsIHUpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsgcmV0dXJuICEodCA9PSB1KTsgfQorCisvLyA2LjEuNCBQYWlycy4KKy8vIFVuaW1wbGVtZW50ZWQuCisKK30gIC8vIG5hbWVzcGFjZSB0cjEKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworI3VuZGVmIEdURVNUXzBfVFVQTEVfCisjdW5kZWYgR1RFU1RfMV9UVVBMRV8KKyN1bmRlZiBHVEVTVF8yX1RVUExFXworI3VuZGVmIEdURVNUXzNfVFVQTEVfCisjdW5kZWYgR1RFU1RfNF9UVVBMRV8KKyN1bmRlZiBHVEVTVF81X1RVUExFXworI3VuZGVmIEdURVNUXzZfVFVQTEVfCisjdW5kZWYgR1RFU1RfN19UVVBMRV8KKyN1bmRlZiBHVEVTVF84X1RVUExFXworI3VuZGVmIEdURVNUXzlfVFVQTEVfCisjdW5kZWYgR1RFU1RfMTBfVFVQTEVfCisKKyN1bmRlZiBHVEVTVF8wX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8xX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8yX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8zX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF80X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF81X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF82X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF83X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF84X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF85X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8xMF9UWVBFTkFNRVNfCisKKyN1bmRlZiBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKyN1bmRlZiBHVEVTVF9CWV9SRUZfCisjdW5kZWYgR1RFU1RfQUREX1JFRl8KKyN1bmRlZiBHVEVTVF9UVVBMRV9FTEVNRU5UXworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjUxOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wCkBAIC0wLDAgKzEsMzM2IEBACiskJCAtKi0gbW9kZTogYysrOyAtKi0KKyR2YXIgbiA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiB0dXBsZSBmaWVsZHMgd2Ugd2FudCB0byBzdXBwb3J0LgorJCQgVGhpcyBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gfX0KKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCisKKy8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCisvLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKKy8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCisvLyBwcml2YXRlIGFzIHB1YmxpYy4KKy8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAorICAgIHRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+IGZyaWVuZCBjbGFzcyB0dXBsZTsgXAorICAgcHJpdmF0ZToKKyNlbmRpZgorCisKKyRyYW5nZSBpIDAuLm4tMQorJHJhbmdlIGogMC4ubgorJHJhbmdlIGsgMS4ubgorLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KKyNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgorCiskZm9yIGsgW1sKKyRyYW5nZSBtIDAuLmstMQorJHJhbmdlIG0yIGsuLm4tMQorI2RlZmluZSBHVEVTVF8kKGspX1RVUExFXyhUKSB0dXBsZTwkZm9yIG0sIFtbVCMjJG1dXSRmb3IgbTIgW1ssIHZvaWRdXT4KKworXV0KKworLy8gR1RFU1Rfbl9UWVBFTkFNRVNfKFQpIGRlY2xhcmVzIGEgbGlzdCBvZiBuIHR5cGVuYW1lcy4KKworJGZvciBqIFtbCiskcmFuZ2UgbSAwLi5qLTEKKyNkZWZpbmUgR1RFU1RfJChqKV9UWVBFTkFNRVNfKFQpICRmb3IgbSwgW1t0eXBlbmFtZSBUIyMkbV1dCisKKworXV0KKworLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAorLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCisvLyBsaWJyYXJ5IHZlbmRvci4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7CisKK3RlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpID0gdm9pZF1dPgorY2xhc3MgdHVwbGU7CisKKy8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMCisvLyBJTVBMRU1FTlRBVElPTiBERVRBSUwgYW5kIE1VU1QgTk9UIEJFIFVTRUQgRElSRUNUTFkgaW4gdXNlciBjb2RlLgorbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gQnlSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBjb25zdCBUJi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBCeVJlZi4KKyNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUKKworLy8gQWRkUmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgVCYuICBUaGlzCisvLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWYgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuCisjZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4KK3RlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0OworCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlCisvLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4KK3RlbXBsYXRlIDxib29sIGtJbmRleFZhbGlkLCBpbnQga0luZGV4LCBjbGFzcyBUdXBsZT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ7CisKKworJGZvciBpIFtbCit0ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAkaSwgR1RFU1RfJChuKV9UVVBMRV8oVCk+IFtbXV0KK3sgdHlwZWRlZiBUJGkgdHlwZTsgfTsKKworCitdXQorfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDw+CitjbGFzcyB0dXBsZTw+IHsKKyBwdWJsaWM6CisgIHR1cGxlKCkge30KKyAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQorfTsKKworCiskZm9yIGsgW1sKKyRyYW5nZSBtIDAuLmstMQordGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhUKT4KK2NsYXNzICRpZiBrIDwgbiBbW0dURVNUXyQoaylfVFVQTEVfKFQpXV0gJGVsc2UgW1t0dXBsZV1dIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6ICRmb3IgbSwgW1tmJChtKV8oKV1dIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoJGZvciBtLCBbW0dURVNUX0JZX1JFRl8oVCRtKSBmJG1dXSkgOiBbW11dCiskZm9yIG0sIFtbZiQobSlfKGYkbSldXSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6ICRmb3IgbSwgW1tmJChtKV8odC5mJChtKV8pXV0ge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgOiAkZm9yIG0sIFtbZiQobSlfKHQuZiQobSlfKV1dIHt9CisKKyRpZiBrID09IDIgW1sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KKyAgdHVwbGUoY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgOiBmMF8ocC5maXJzdCksIGYxXyhwLnNlY29uZCkge30KKworXV0KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfJChrKV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworJGlmIGsgPT0gMiBbWworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIHsKKyAgICBmMF8gPSBwLmZpcnN0OworICAgIGYxXyA9IHAuc2Vjb25kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitdXQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgeworCiskZm9yIG0gW1sKKyAgICBmJChtKV8gPSB0LmYkKG0pXzsKKworXV0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworCiskZm9yIG0gW1sKKyAgVCRtIGYkKG0pXzsKKworXV0KK307CisKKworXV0KKy8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgorCisvLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCisvLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0CisvLyBpbXBsZW1lbnQgdGllKCkuCisKK2lubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KKworJGZvciBrIFtbCiskcmFuZ2UgbSAwLi5rLTEKKwordGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8kKGspX1RVUExFXyhUKSBtYWtlX3R1cGxlKCRmb3IgbSwgW1tjb25zdCBUJG0mIGYkbV1dKSB7CisgIHJldHVybiBHVEVTVF8kKGspX1RVUExFXyhUKSgkZm9yIG0sIFtbZiRtXV0pOworfQorCitdXQorCisvLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOworCisKKyRmb3IgaiBbWwordGVtcGxhdGUgPEdURVNUXyQoailfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXyQoailfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAkajsgfTsKKworCitdXQordGVtcGxhdGUgPGludCBrLCBjbGFzcyBUdXBsZT4KK3N0cnVjdCB0dXBsZV9lbGVtZW50IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBndGVzdF9pbnRlcm5hbDo6VHVwbGVFbGVtZW50PAorICAgICAgayA8ICh0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLCBrLCBUdXBsZT46OnR5cGUgdHlwZTsKK307CisKKyNkZWZpbmUgR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgVHVwbGUpIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aywgVHVwbGUgPjo6dHlwZQorCisvLyA2LjEuMy40IEVsZW1lbnQgYWNjZXNzLgorCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisKKyRmb3IgaSBbWwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwkaT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oJGksIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZiQoaSlfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKCRpLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZiQoaSlfOyB9Cit9OworCisKK11dCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+CitHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBHVEVTVF8kKG4pX1RVUExFXyhUKSkpCitnZXQoR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOworfQorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXyQobilfVFlQRU5BTUVTXyhUKT4KK0dURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgIEdURVNUXyQobilfVFVQTEVfKFQpKSkKK2dldChjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKK30KKworLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycworCisvLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKKy8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKKy8vIGsxICE9IGsyLgordGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGludCBrPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7CisgICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKKyAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhVKSYgdSkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OlNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8kKG4pX1RVUExFXyhUKT46OnZhbHVlLAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8kKG4pX1RVUExFXyhVKT46OnZhbHVlPjo6RXEodCwgdSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCksIEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KKworLy8gNi4xLjQgUGFpcnMuCisvLyBVbmltcGxlbWVudGVkLgorCit9ICAvLyBuYW1lc3BhY2UgdHIxCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKworJGZvciBqIFtbCisjdW5kZWYgR1RFU1RfJChqKV9UVVBMRV8KKworXV0KKworCiskZm9yIGogW1sKKyN1bmRlZiBHVEVTVF8kKGopX1RZUEVOQU1FU18KKworXV0KKworI3VuZGVmIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworI3VuZGVmIEdURVNUX0JZX1JFRl8KKyN1bmRlZiBHVEVTVF9BRERfUkVGXworI3VuZGVmIEdURVNUX1RVUExFX0VMRU1FTlRfCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2IwMWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKQEAgLTAsMCArMSwzMzMwIEBACisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHlwZS11dGlsLmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFR5cGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHR5cGVkIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQKKy8vIHRlc3RzLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IHdlIHN1cHBvcnQgYXQgbW9zdCA1MCB0eXBlcyBpbiBhIGxpc3QsIGFuZCBhdCBtb3N0IDUwCisvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gb25lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIG1vcmUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKKy8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCisjIGlmZGVmIF9fR0xJQkNYWF9fCisjICBpbmNsdWRlIDxjeHhhYmkuaD4KKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPgorIyBlbmRpZiAgLy8gX19HTElCQ1hYX18KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuCisvLyBOQjogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW4gR29vZ2xlIE1vY2ssIHNvIGRvbid0IG1vdmUgaXQgaW5zaWRlIG9mCisvLyB0aGUgdHlwZWQtdGVzdC1vbmx5IHNlY3Rpb24gYmVsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZyBHZXRUeXBlTmFtZSgpIHsKKyMgaWYgR1RFU1RfSEFTX1JUVEkKKworICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gdHlwZWlkKFQpLm5hbWUoKTsKKyMgIGlmIGRlZmluZWQoX19HTElCQ1hYX18pIHx8IGRlZmluZWQoX19IUF9hQ0MpCisgIGludCBzdGF0dXMgPSAwOworICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKKyAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KKyMgICBpZmRlZiBfX0dMSUJDWFhfXworICB1c2luZyBhYmk6Ol9fY3hhX2RlbWFuZ2xlOworIyAgIGVuZGlmIC8vIF9fR0xJQkNYWF9fCisgIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKKyAgY29uc3QgU3RyaW5nIG5hbWVfc3RyKHN0YXR1cyA9PSAwID8gcmVhZGFibGVfbmFtZSA6IG5hbWUpOworICBmcmVlKHJlYWRhYmxlX25hbWUpOworICByZXR1cm4gbmFtZV9zdHI7CisjICBlbHNlCisgIHJldHVybiBuYW1lOworIyAgZW5kaWYgIC8vIF9fR0xJQkNYWF9fIHx8IF9fSFBfYUNDCisKKyMgZWxzZQorCisgIHJldHVybiAiPHR5cGU+IjsKKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKK30KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKKy8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAorLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBBc3NlcnRUeXBlRXE7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7CisgIHR5cGVkZWYgYm9vbCB0eXBlOworfTsKKworLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCisvLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcworLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAorLy8gc3VwcG9ydCBkaXJlY3RseS4KK3N0cnVjdCBOb25lIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KKy8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KKy8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCisvLyBsaXN0LgorCisvLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgorc3RydWN0IFR5cGVzMCB7fTsKKworLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZXMxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXMyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTxUMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorc3RydWN0IFR5cGVzMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI8VDIsIFQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgorc3RydWN0IFR5cGVzNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM8VDIsIFQzLCBUND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitzdHJ1Y3QgVHlwZXM1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitzdHJ1Y3QgVHlwZXM2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3N0cnVjdCBUeXBlczcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitzdHJ1Y3QgVHlwZXM4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitzdHJ1Y3QgVHlwZXMxMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzMTEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorc3RydWN0IFR5cGVzMTIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczEzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgorc3RydWN0IFR5cGVzMTQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzMTUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK3N0cnVjdCBUeXBlczE2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzMTcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzMTggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK3N0cnVjdCBUeXBlczE5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorc3RydWN0IFR5cGVzMjAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitzdHJ1Y3QgVHlwZXMyMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitzdHJ1Y3QgVHlwZXMyMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorc3RydWN0IFR5cGVzMjMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitzdHJ1Y3QgVHlwZXMyNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitzdHJ1Y3QgVHlwZXMyNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitzdHJ1Y3QgVHlwZXMyNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgorc3RydWN0IFR5cGVzMjcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXMyOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitzdHJ1Y3QgVHlwZXMyOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK3N0cnVjdCBUeXBlczMwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorc3RydWN0IFR5cGVzMzEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorc3RydWN0IFR5cGVzMzIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK3N0cnVjdCBUeXBlczMzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgorc3RydWN0IFR5cGVzMzQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgorc3RydWN0IFR5cGVzMzUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2Pgorc3RydWN0IFR5cGVzMzYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK3N0cnVjdCBUeXBlczM3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgorc3RydWN0IFR5cGVzMzggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgorc3RydWN0IFR5cGVzMzkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK3N0cnVjdCBUeXBlczQwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitzdHJ1Y3QgVHlwZXM0MSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK3N0cnVjdCBUeXBlczQyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczQzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgorc3RydWN0IFR5cGVzNDQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzNDUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzNDYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK3N0cnVjdCBUeXBlczQ3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgorc3RydWN0IFR5cGVzNDggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzNDkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlczUwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+CisvLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVHlwZXMgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0NSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPgorc3RydWN0IFR5cGVzIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczxUMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxPFQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0Mj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIFQ0OCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCisKKy8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCisvLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKKy8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAorLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQorLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KKy8vCisvLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCisvLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgorc3RydWN0IFRlbXBsYXRlU2VsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBCaW5kIHsKKyAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKKyAgfTsKK307CisKKyMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKKyAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQorCisvLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisvLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKKy8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKKy8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTm9uZVQge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKKy8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKKy8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCisvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgorc3RydWN0IFRlbXBsYXRlczAge307CisKKy8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KK3N0cnVjdCBUZW1wbGF0ZXMyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+CitzdHJ1Y3QgVGVtcGxhdGVzMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+CitzdHJ1Y3QgVGVtcGxhdGVzNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KK3N0cnVjdCBUZW1wbGF0ZXM3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+CitzdHJ1Y3QgVGVtcGxhdGVzOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KK3N0cnVjdCBUZW1wbGF0ZXMxMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgorc3RydWN0IFRlbXBsYXRlczExIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+CitzdHJ1Y3QgVGVtcGxhdGVzMTIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+CitzdHJ1Y3QgVGVtcGxhdGVzMTMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KK3N0cnVjdCBUZW1wbGF0ZXMxNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgorc3RydWN0IFRlbXBsYXRlczE1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczE2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+CitzdHJ1Y3QgVGVtcGxhdGVzMTcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgorc3RydWN0IFRlbXBsYXRlczE4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzMTkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgorc3RydWN0IFRlbXBsYXRlczIwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgorc3RydWN0IFRlbXBsYXRlczIxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXMyMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KK3N0cnVjdCBUZW1wbGF0ZXMyMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgorc3RydWN0IFRlbXBsYXRlczI0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczI1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+CitzdHJ1Y3QgVGVtcGxhdGVzMjYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgorc3RydWN0IFRlbXBsYXRlczI3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+CitzdHJ1Y3QgVGVtcGxhdGVzMjggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXMyOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzMzAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KK3N0cnVjdCBUZW1wbGF0ZXMzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+CitzdHJ1Y3QgVGVtcGxhdGVzMzIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzMzMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgorc3RydWN0IFRlbXBsYXRlczM0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgorc3RydWN0IFRlbXBsYXRlczM1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzMzYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+CitzdHJ1Y3QgVGVtcGxhdGVzMzcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KK3N0cnVjdCBUZW1wbGF0ZXMzOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzMzkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KK3N0cnVjdCBUZW1wbGF0ZXM0MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+CitzdHJ1Y3QgVGVtcGxhdGVzNDEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+CitzdHJ1Y3QgVGVtcGxhdGVzNDIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM0MyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNDQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+CitzdHJ1Y3QgVGVtcGxhdGVzNDUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczQ2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczQ3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+CitzdHJ1Y3QgVGVtcGxhdGVzNDggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzNDkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KK3N0cnVjdCBUZW1wbGF0ZXM1MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+CisvLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KK3N0cnVjdCBUZW1wbGF0ZXMgeworICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCisvLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCisvLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKKy8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0IHsgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorc3RydWN0IFR5cGVMaXN0PFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD46OnR5cGUgdHlwZTsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wCkBAIC0wLDAgKzEsMjk2IEBACiskJCAtKi0gbW9kZTogYysrOyAtKi0KKyR2YXIgbiA9IDUwICAkJCBNYXhpbXVtIGxlbmd0aCBvZiB0eXBlIGxpc3RzIHdlIHdhbnQgdG8gc3VwcG9ydC4KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVHlwZSB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgdHlwZWQgYW5kIHR5cGUtcGFyYW1ldGVyaXplZAorLy8gdGVzdHMuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBDdXJyZW50bHkgd2Ugc3VwcG9ydCBhdCBtb3N0ICRuIHR5cGVzIGluIGEgbGlzdCwgYW5kIGF0IG1vc3QgJG4KKy8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbiBvbmUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vIFBsZWFzZSBjb250YWN0IGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAorLy8gbW9yZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCisvLyAjaWZkZWYgX19HTlVDX18gaXMgdG9vIGdlbmVyYWwgaGVyZS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBnY2Mgd2l0aG91dCB1c2luZworLy8gbGlic3RkYysrICh3aGljaCBpcyB3aGVyZSBjeHhhYmkuaCBjb21lcyBmcm9tKS4KKyMgaWZkZWYgX19HTElCQ1hYX18KKyMgIGluY2x1ZGUgPGN4eGFiaS5oPgorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisjICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+CisjIGVuZGlmICAvLyBfX0dMSUJDWFhfXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KKy8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKKy8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorU3RyaW5nIEdldFR5cGVOYW1lKCkgeworIyBpZiBHVEVTVF9IQVNfUlRUSQorCisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOworIyAgaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKKyAgaW50IHN0YXR1cyA9IDA7CisgIC8vIGdjYydzIGltcGxlbWVudGF0aW9uIG9mIHR5cGVpZChUKS5uYW1lKCkgbWFuZ2xlcyB0aGUgdHlwZSBuYW1lLAorICAvLyBzbyB3ZSBoYXZlIHRvIGRlbWFuZ2xlIGl0LgorIyAgIGlmZGVmIF9fR0xJQkNYWF9fCisgIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7CisjICAgZW5kaWYgLy8gX19HTElCQ1hYX18KKyAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOworICBjb25zdCBTdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7CisgIGZyZWUocmVhZGFibGVfbmFtZSk7CisgIHJldHVybiBuYW1lX3N0cjsKKyMgIGVsc2UKKyAgcmV0dXJuIG5hbWU7CisjICBlbmRpZiAgLy8gX19HTElCQ1hYX18gfHwgX19IUF9hQ0MKKworIyBlbHNlCisKKyAgcmV0dXJuICI8dHlwZT4iOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorfQorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBBc3NlcnR5VHlwZUVxPFQxLCBUMj46OnR5cGUgaXMgZGVmaW5lZCBpZmYgVDEgYW5kIFQyIGFyZSB0aGUgc2FtZQorLy8gdHlwZS4gIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHRvIGVuc3VyZSB0aGF0CisvLyB0d28gdHlwZXMgYXJlIGVxdWFsLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IEFzc2VydFR5cGVFcTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQXNzZXJ0VHlwZUVxPFQsIFQ+IHsKKyAgdHlwZWRlZiBib29sIHR5cGU7Cit9OworCisvLyBBIHVuaXF1ZSB0eXBlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudHMgb2YgY2xhc3MKKy8vIHRlbXBsYXRlIFR5cGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUgdmFyaWFkaWMgdGVtcGxhdGVzCisvLyAoZS5nLiBUeXBlczxpbnQ+LCBUeXBlPGludCwgZG91YmxlPiwgYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0CisvLyBzdXBwb3J0IGRpcmVjdGx5Lgorc3RydWN0IE5vbmUge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHR5cGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUeXBlc048VDEsIFQyLCAuLi4sIFROPgorLy8gcmVwcmVzZW50cyBhIHR5cGUgbGlzdCB3aXRoIE4gdHlwZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pIGluIGl0LgorLy8gRXhjZXB0IGZvciBUeXBlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgorLy8gSGVhZCBmb3IgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsIGZvciB0aGUgcmVzdCBvZiB0aGUKKy8vIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0eXBlIGxpc3QuCitzdHJ1Y3QgVHlwZXMwIHt9OworCisvLyBUeXBlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMwIFRhaWw7Cit9OworCiskcmFuZ2UgaSAyLi5uCisKKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHJhbmdlIGsgMi4uaQordGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KK3N0cnVjdCBUeXBlcyRpIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzJChpLTEpPCRmb3IgaywgW1tUJGtdXT4gVGFpbDsKK307CisKKworXV0KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+CisvLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVHlwZXMgdGVtcGxhdGUuCisKKyRyYW5nZSBpIDEuLm4KK3RlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpID0gaW50ZXJuYWw6Ok5vbmVdXT4KK3N0cnVjdCBUeXBlcyB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzJG48JGZvciBpLCBbW1QkaV1dPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUeXBlczwkZm9yIGksIFtbaW50ZXJuYWw6Ok5vbmVdXT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczAgdHlwZTsKK307CisKKyRyYW5nZSBpIDEuLm4tMQorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskcmFuZ2UgayBpKzEuLm4KK3RlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CitzdHJ1Y3QgVHlwZXM8JGZvciBqLCBbW1Qkal1dJGZvciBrW1ssIGludGVybmFsOjpOb25lXV0+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMkaTwkZm9yIGosIFtbVCRqXV0+IHR5cGU7Cit9OworCitdXQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCisKKy8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCisvLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKKy8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAorLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQorLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KKy8vCisvLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCisvLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgorc3RydWN0IFRlbXBsYXRlU2VsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBCaW5kIHsKKyAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKKyAgfTsKK307CisKKyMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKKyAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQorCisvLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisvLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKKy8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKKy8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTm9uZVQge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKKy8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKKy8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCisvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgorc3RydWN0IFRlbXBsYXRlczAge307CisKKy8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOworfTsKKworJHJhbmdlIGkgMi4ubgorCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyRyYW5nZSBrIDIuLmkKK3RlbXBsYXRlIDwkZm9yIGosIFtbR1RFU1RfVEVNUExBVEVfIFQkal1dPgorc3RydWN0IFRlbXBsYXRlcyRpIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMkKGktMSk8JGZvciBrLCBbW1Qka11dPiBUYWlsOworfTsKKworCitdXQorCisvLyBXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIHVzZXJzIHRvIHdyaXRlIFRlbXBsYXRlc048Li4uPiBkaXJlY3RseSwKKy8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUZW1wbGF0ZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUZW1wbGF0ZXM8bGlzdD4KKy8vIHdpbGwgYXBwZWFyIGFzIFRlbXBsYXRlczxsaXN0LCBOb25lVCwgTm9uZVQsIC4uLiwgTm9uZVQ+IGluIHRoZSBjb21waWxlcgorLy8gZXJyb3JzKS4KKy8vCisvLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQorLy8gdXNlciB3b3VsZCB3cml0ZSBUZW1wbGF0ZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKKy8vIHRoYXQgdG8gVGVtcGxhdGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVGVtcGxhdGVzIHRlbXBsYXRlLgorCiskcmFuZ2UgaSAxLi5uCit0ZW1wbGF0ZSA8JGZvciBpLCBbW0dURVNUX1RFTVBMQVRFXyBUJGkgPSBOb25lVF1dPgorc3RydWN0IFRlbXBsYXRlcyB7CisgIHR5cGVkZWYgVGVtcGxhdGVzJG48JGZvciBpLCBbW1QkaV1dPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUZW1wbGF0ZXM8JGZvciBpLCBbW05vbmVUXV0+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMwIHR5cGU7Cit9OworCiskcmFuZ2UgaSAxLi5uLTEKKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHJhbmdlIGsgaSsxLi5uCit0ZW1wbGF0ZSA8JGZvciBqLCBbW0dURVNUX1RFTVBMQVRFXyBUJGpdXT4KK3N0cnVjdCBUZW1wbGF0ZXM8JGZvciBqLCBbW1Qkal1dJGZvciBrW1ssIE5vbmVUXV0+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMkaTwkZm9yIGosIFtbVCRqXV0+IHR5cGU7Cit9OworCitdXQorCisvLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCisvLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKKy8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0IHsgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsgfTsKKworCiskcmFuZ2UgaSAxLi5uCit0ZW1wbGF0ZSA8JGZvciBpLCBbW3R5cGVuYW1lIFQkaV1dPgorc3RydWN0IFR5cGVMaXN0PFR5cGVzPCRmb3IgaSwgW1tUJGldXT4gPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8JGZvciBpLCBbW1QkaV1dPjo6dHlwZSB0eXBlOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL200L2FjeF9wdGhyZWFkLm00IGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL200L2FjeF9wdGhyZWFkLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjIwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbTQvYWN4X3B0aHJlYWQubTQKQEAgLTAsMCArMSwzNjMgQEAKKyMgVGhpcyB3YXMgcmV0cmlldmVkIGZyb20KKyMgICAgaHR0cDovL3N2bi4wcG9pbnRlci5kZS92aWV3dmMvdHJ1bmsvY29tbW9uL2FjeF9wdGhyZWFkLm00P3JldmlzaW9uPTEyNzcmcm9vdD1hdmFoaQorIyBTZWUgYWxzbyAocGVyaGFwcyBmb3IgbmV3IHZlcnNpb25zPykKKyMgICAgaHR0cDovL3N2bi4wcG9pbnRlci5kZS92aWV3dmMvdHJ1bmsvY29tbW9uL2FjeF9wdGhyZWFkLm00P3Jvb3Q9YXZhaGkKKyMKKyMgV2UndmUgcmV3cml0dGVuIHRoZSBpbmNvbnNpc3RlbmN5IGNoZWNrIGNvZGUgKGZyb20gYXZhaGkpLCB0byB3b3JrCisjIG1vcmUgYnJvYWRseS4gIEluIHBhcnRpY3VsYXIsIGl0IG5vIGxvbmdlciBhc3N1bWVzIGxkIGFjY2VwdHMgLXpkZWZzLgorIyBUaGlzIGNhdXNlZCBhIHJlc3RydWN0aW5nIG9mIHRoZSBjb2RlLCBidXQgdGhlIGZ1bmN0aW9uYWxpdHkgaGFzIG9ubHkKKyMgY2hhbmdlZCBhIGxpdHRsZS4KKworZG5sIEBzeW5vcHNpcyBBQ1hfUFRIUkVBRChbQUNUSU9OLUlGLUZPVU5EWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dKQorZG5sCitkbmwgQHN1bW1hcnkgZmlndXJlIG91dCBob3cgdG8gYnVpbGQgQyBwcm9ncmFtcyB1c2luZyBQT1NJWCB0aHJlYWRzCitkbmwKK2RubCBUaGlzIG1hY3JvIGZpZ3VyZXMgb3V0IGhvdyB0byBidWlsZCBDIHByb2dyYW1zIHVzaW5nIFBPU0lYIHRocmVhZHMuCitkbmwgSXQgc2V0cyB0aGUgUFRIUkVBRF9MSUJTIG91dHB1dCB2YXJpYWJsZSB0byB0aGUgdGhyZWFkcyBsaWJyYXJ5IGFuZAorZG5sIGxpbmtlciBmbGFncywgYW5kIHRoZSBQVEhSRUFEX0NGTEFHUyBvdXRwdXQgdmFyaWFibGUgdG8gYW55IHNwZWNpYWwKK2RubCBDIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIG5lZWRlZC4gKFRoZSB1c2VyIGNhbiBhbHNvIGZvcmNlIGNlcnRhaW4KK2RubCBjb21waWxlciBmbGFncy9saWJzIHRvIGJlIHRlc3RlZCBieSBzZXR0aW5nIHRoZXNlIGVudmlyb25tZW50CitkbmwgdmFyaWFibGVzLikKK2RubAorZG5sIEFsc28gc2V0cyBQVEhSRUFEX0NDIHRvIGFueSBzcGVjaWFsIEMgY29tcGlsZXIgdGhhdCBpcyBuZWVkZWQgZm9yCitkbmwgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMgKGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBDQyBvdGhlcndpc2UpLgorZG5sIChUaGlzIGlzIG5lY2Vzc2FyeSBvbiBBSVggdG8gdXNlIHRoZSBzcGVjaWFsIGNjX3IgY29tcGlsZXIgYWxpYXMuKQorZG5sCitkbmwgTk9URTogWW91IGFyZSBhc3N1bWVkIHRvIG5vdCBvbmx5IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggdGhlc2UKK2RubCBmbGFncywgYnV0IGFsc28gbGluayBpdCB3aXRoIHRoZW0gYXMgd2VsbC4gZS5nLiB5b3Ugc2hvdWxkIGxpbmsKK2RubCB3aXRoICRQVEhSRUFEX0NDICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRMREZMQUdTIC4uLiAkUFRIUkVBRF9MSUJTCitkbmwgJExJQlMKK2RubAorZG5sIElmIHlvdSBhcmUgb25seSBidWlsZGluZyB0aHJlYWRzIHByb2dyYW1zLCB5b3UgbWF5IHdpc2ggdG8gdXNlCitkbmwgdGhlc2UgdmFyaWFibGVzIGluIHlvdXIgZGVmYXVsdCBMSUJTLCBDRkxBR1MsIGFuZCBDQzoKK2RubAorZG5sICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorZG5sICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorZG5sICAgICAgICBDQz0iJFBUSFJFQURfQ0MiCitkbmwKK2RubCBJbiBhZGRpdGlvbiwgaWYgdGhlIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRocmVhZC1hdHRyaWJ1dGUKK2RubCBjb25zdGFudCBoYXMgYSBub25zdGFuZGFyZCBuYW1lLCBkZWZpbmVzIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRvCitkbmwgdGhhdCBuYW1lIChlLmcuIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQgb24gQUlYKS4KK2RubAorZG5sIEFDVElPTi1JRi1GT1VORCBpcyBhIGxpc3Qgb2Ygc2hlbGwgY29tbWFuZHMgdG8gcnVuIGlmIGEgdGhyZWFkcworZG5sIGxpYnJhcnkgaXMgZm91bmQsIGFuZCBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGEgbGlzdCBvZiBjb21tYW5kcyB0bworZG5sIHJ1biBpdCBpZiBpdCBpcyBub3QgZm91bmQuIElmIEFDVElPTi1JRi1GT1VORCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKK2RubCBkZWZhdWx0IGFjdGlvbiB3aWxsIGRlZmluZSBIQVZFX1BUSFJFQUQuCitkbmwKK2RubCBQbGVhc2UgbGV0IHRoZSBhdXRob3JzIGtub3cgaWYgdGhpcyBtYWNybyBmYWlscyBvbiBhbnkgcGxhdGZvcm0sIG9yCitkbmwgaWYgeW91IGhhdmUgYW55IG90aGVyIHN1Z2dlc3Rpb25zIG9yIGNvbW1lbnRzLiBUaGlzIG1hY3JvIHdhcyBiYXNlZAorZG5sIG9uIHdvcmsgYnkgU0dKIG9uIGF1dG9jb25mIHNjcmlwdHMgZm9yIEZGVFcgKHd3dy5mZnR3Lm9yZykgKHdpdGgKK2RubCBoZWxwIGZyb20gTS4gRnJpZ28pLCBhcyB3ZWxsIGFzIGFjX3B0aHJlYWQgYW5kIGhiX3B0aHJlYWQgbWFjcm9zCitkbmwgcG9zdGVkIGJ5IEFsZWphbmRybyBGb3Jlcm8gQ3VlcnZvIHRvIHRoZSBhdXRvY29uZiBtYWNybyByZXBvc2l0b3J5LgorZG5sIFdlIGFyZSBhbHNvIGdyYXRlZnVsIGZvciB0aGUgaGVscGZ1bCBmZWVkYmFjayBvZiBudW1lcm91cyB1c2Vycy4KK2RubAorZG5sIEBjYXRlZ29yeSBJbnN0YWxsZWRQYWNrYWdlcworZG5sIEBhdXRob3IgU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorZG5sIEB2ZXJzaW9uIDIwMDYtMDUtMjkKK2RubCBAbGljZW5zZSBHUExXaXRoQUNFeGNlcHRpb24KK2RubCAKK2RubCBDaGVja3MgZm9yIEdDQyBzaGFyZWQvcHRocmVhZCBpbmNvbnNpc3RlbmN5IGJhc2VkIG9uIHdvcmsgYnkKK2RubCBNYXJjaW4gT3dzaWFueSA8bWFyY2luQG93c2lhbnkucGw+CisKKworQUNfREVGVU4oW0FDWF9QVEhSRUFEXSwgWworQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK2FjeF9wdGhyZWFkX29rPW5vCisKKyMgV2UgdXNlZCB0byBjaGVjayBmb3IgcHRocmVhZC5oIGZpcnN0LCBidXQgdGhpcyBmYWlscyBpZiBwdGhyZWFkLmgKKyMgcmVxdWlyZXMgc3BlY2lhbCBjb21waWxlciBmbGFncyAoZS5nLiBvbiBUcnVlNjQgb3IgU2VxdWVudCkuCisjIEl0IGdldHMgY2hlY2tlZCBmb3IgaW4gdGhlIGxpbmsgdGVzdCBhbnl3YXkuCisKKyMgRmlyc3Qgb2YgYWxsLCBjaGVjayBpZiB0aGUgdXNlciBoYXMgc2V0IGFueSBvZiB0aGUgUFRIUkVBRF9MSUJTLAorIyBldGNldGVyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGFuZCBpZiB0aHJlYWRzIGxpbmtpbmcgd29ya3MgdXNpbmcKKyMgdGhlbToKK2lmIHRlc3QgeCIkUFRIUkVBRF9MSUJTJFBUSFJFQURfQ0ZMQUdTIiAhPSB4OyB0aGVuCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHU10pCisgICAgICAgIEFDX1RSWV9MSU5LX0ZVTkMocHRocmVhZF9qb2luLCBhY3hfcHRocmVhZF9vaz15ZXMpCisgICAgICAgIEFDX01TR19SRVNVTFQoJGFjeF9wdGhyZWFkX29rKQorICAgICAgICBpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorZmkKKworIyBXZSBtdXN0IGNoZWNrIGZvciB0aGUgdGhyZWFkcyBsaWJyYXJ5IHVuZGVyIGEgbnVtYmVyIG9mIGRpZmZlcmVudAorIyBuYW1lczsgdGhlIG9yZGVyaW5nIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBzeXN0ZW1zCisjIChlLmcuIERFQykgaGF2ZSBib3RoIC1scHRocmVhZCBhbmQgLWxwdGhyZWFkcywgd2hlcmUgb25lIG9mIHRoZQorIyBsaWJyYXJpZXMgaXMgYnJva2VuIChub24tUE9TSVgpLgorCisjIENyZWF0ZSBhIGxpc3Qgb2YgdGhyZWFkIGZsYWdzIHRvIHRyeS4gIEl0ZW1zIHN0YXJ0aW5nIHdpdGggYSAiLSIgYXJlCisjIEMgY29tcGlsZXIgZmxhZ3MsIGFuZCBvdGhlciBpdGVtcyBhcmUgbGlicmFyeSBuYW1lcywgZXhjZXB0IGZvciAibm9uZSIKKyMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2UgdHJ5IHdpdGhvdXQgYW55IGZsYWdzIGF0IGFsbCwgYW5kICJwdGhyZWFkLWNvbmZpZyIKKyMgd2hpY2ggaXMgYSBwcm9ncmFtIHJldHVybmluZyB0aGUgZmxhZ3MgZm9yIHRoZSBQdGggZW11bGF0aW9uIGxpYnJhcnkuCisKK2FjeF9wdGhyZWFkX2ZsYWdzPSJwdGhyZWFkcyBub25lIC1LdGhyZWFkIC1rdGhyZWFkIGx0aHJlYWQgLXB0aHJlYWQgLXB0aHJlYWRzIC1tdGhyZWFkcyBwdGhyZWFkIC0tdGhyZWFkLXNhZmUgLW10IHB0aHJlYWQtY29uZmlnIgorCisjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorCisjIHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorIyBub25lOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyMgbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisjIC1wdGhyZWFkOiBMaW51eC9nY2MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL2djYyAodXNlcmxhbmQgdGhyZWFkcykKKyMgLXB0aHJlYWRzOiBTb2xhcmlzL2djYworIyAtbXRocmVhZHM6IE1pbmd3MzIvZ2NjLCBMeW54L2djYworIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworIyAgICAgIGFsc28gZGVmaW5lcyAtRF9SRUVOVFJBTlQpCisjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAqc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBhY3hfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIHB0aHJlYWQgLW10IC1wdGhyZWFkICRhY3hfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKK2VzYWMKKworaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KK2ZvciBmbGFnIGluICRhY3hfcHRocmVhZF9mbGFnczsgZG8KKworICAgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgICAgICAgICAgbm9uZSkKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFnc10pCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworCisJCXB0aHJlYWQtY29uZmlnKQorCQlBQ19DSEVDS19QUk9HKGFjeF9wdGhyZWFkX2NvbmZpZywgcHRocmVhZC1jb25maWcsIHllcywgbm8pCisJCWlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKwkJUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisJCVBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisJCTs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iLWwkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBDaGVjayBmb3IgdmFyaW91cyBmdW5jdGlvbnMuICBXZSBtdXN0IGluY2x1ZGUgcHRocmVhZC5oLAorICAgICAgICAjIHNpbmNlIHNvbWUgZnVuY3Rpb25zIG1heSBiZSBtYWNyb3MuICAoT24gdGhlIFNlcXVlbnQsIHdlCisgICAgICAgICMgbmVlZCBhIHNwZWNpYWwgZmxhZyAtS3RocmVhZCB0byBtYWtlIHRoaXMgaGVhZGVyIGNvbXBpbGUuKQorICAgICAgICAjIFdlIGNoZWNrIGZvciBwdGhyZWFkX2pvaW4gYmVjYXVzZSBpdCBpcyBpbiAtbHB0aHJlYWQgb24gSVJJWAorICAgICAgICAjIHdoaWxlIHB0aHJlYWRfY3JlYXRlIGlzIGluIGxpYmMuICBXZSBjaGVjayBmb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgICAgICAgIyBkdWUgdG8gREVDIGNyYXppbmVzcyB3aXRoIC1scHRocmVhZHMuICBXZSBjaGVjayBmb3IKKyAgICAgICAgIyBwdGhyZWFkX2NsZWFudXBfcHVzaCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHB0aHJlYWQKKyAgICAgICAgIyBmdW5jdGlvbnMgb24gU29sYXJpcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi1mdW5jdGlvbmFsIGxpYmMgc3R1Yi4KKyAgICAgICAgIyBXZSB0cnkgcHRocmVhZF9jcmVhdGUgb24gZ2VuZXJhbCBwcmluY2lwbGVzLgorICAgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgICAgICAgICAgICAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisgICAgICAgICAgICAgICAgICAgIFthY3hfcHRocmVhZF9vaz15ZXNdKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIEFDX01TR19SRVNVTFQoJGFjeF9wdGhyZWFkX29rKQorICAgICAgICBpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBEZXRlY3QgQUlYIGxvc3NhZ2U6IEpPSU5BQkxFIGF0dHJpYnV0ZSBpcyBjYWxsZWQgVU5ERVRBQ0hFRC4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZV0pCisJYXR0cl9uYW1lPXVua25vd24KKwlmb3IgYXR0ciBpbiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEOyBkbworCSAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLCBbaW50IGF0dHI9JGF0dHI7IHJldHVybiBhdHRyO10sCisgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cl9uYW1lPSRhdHRyOyBicmVha10pCisJZG9uZQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRhdHRyX25hbWUpCisgICAgICAgIGlmIHRlc3QgIiRhdHRyX25hbWUiICE9IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUsICRhdHRyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uIHlvdXIgc3lzdGVtLl0pCisgICAgICAgIGZpCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkc10pCisgICAgICAgIGZsYWc9bm8KKyAgICAgICAgY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KKyAgICAgICAgICAgICotYWl4KiB8ICotZnJlZWJzZCogfCAqLWRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICAqc29sYXJpcyogfCAqLW9zZiogfCAqLWhwdXgqKSBmbGFnPSItRF9SRUVOVFJBTlQiOzsKKyAgICAgICAgZXNhYworICAgICAgICBBQ19NU0dfUkVTVUxUKCR7ZmxhZ30pCisgICAgICAgIGlmIHRlc3QgIngkZmxhZyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWcgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBmaQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgICAgICAjIE1vcmUgQUlYIGxvc3NhZ2U6IG11c3QgY29tcGlsZSB3aXRoIHhsY19yIG9yIGNjX3IKKwlpZiB0ZXN0IHgiJEdDQyIgIT0geHllczsgdGhlbgorICAgICAgICAgIEFDX0NIRUNLX1BST0dTKFBUSFJFQURfQ0MsIHhsY19yIGNjX3IsICR7Q0N9KQorICAgICAgICBlbHNlCisgICAgICAgICAgUFRIUkVBRF9DQz0kQ0MKKwlmaQorCisJIyBUaGUgbmV4dCBwYXJ0IHRyaWVzIHRvIGRldGVjdCBHQ0MgaW5jb25zaXN0ZW5jeSB3aXRoIC1zaGFyZWQgb24gc29tZQorCSMgYXJjaGl0ZWN0dXJlcyBhbmQgc3lzdGVtcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBpbiBjZXJ0YWluCisJIyBjb25maWd1cmF0aW9ucywgd2hlbiAtc2hhcmVkIGlzIHNwZWNpZmllZCwgR0NDICJmb3JnZXRzIiB0bworCSMgaW50ZXJuYWxseSB1c2UgdmFyaW91cyBmbGFncyB3aGljaCBhcmUgc3RpbGwgbmVjZXNzYXJ5LgorCQorCSMKKwkjIFByZXBhcmUgdGhlIGZsYWdzCisJIworCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCXNhdmVfTElCUz0iJExJQlMiCisJc2F2ZV9DQz0iJENDIgorCQorCSMgVHJ5IHdpdGggdGhlIGZsYWdzIGRldGVybWluZWQgYnkgdGhlIGVhcmxpZXIgY2hlY2tzLgorCSMKKwkjIC1XbCwteixkZWZzIGZvcmNlcyBsaW5rLXRpbWUgc3ltYm9sIHJlc29sdXRpb24sIHNvIHRoYXQgdGhlCisJIyBsaW5raW5nIGNoZWNrcyB3aXRoIC1zaGFyZWQgYWN0dWFsbHkgaGF2ZSBhbnkgdmFsdWUKKwkjCisJIyBGSVhNRTogLWZQSUMgaXMgcmVxdWlyZWQgZm9yIC1zaGFyZWQgb24gbWFueSBhcmNoaXRlY3R1cmVzLAorCSMgc28gd2Ugc3BlY2lmeSBpdCBoZXJlLCBidXQgdGhlIHJpZ2h0IHdheSB3b3VsZCBwcm9iYWJseSBiZSB0bworCSMgcHJvcGVybHkgZGV0ZWN0IHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgcmVxdWlyZWQuCisJQ0ZMQUdTPSItc2hhcmVkIC1mUElDIC1XbCwteixkZWZzICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCUxJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisJQ0M9IiRQVEhSRUFEX0NDIgorCQorCSMgSW4gb3JkZXIgbm90IHRvIGNyZWF0ZSBzZXZlcmFsIGxldmVscyBvZiBpbmRlbnRhdGlvbiwgd2UgdGVzdAorCSMgdGhlIHZhbHVlIG9mICIkZG9uZSIgdW50aWwgd2UgZmluZCB0aGUgY3VyZSBvciBydW4gb3V0IG9mIGlkZWFzLgorCWRvbmU9Im5vIgorCQorCSMgRmlyc3QsIG1ha2Ugc3VyZSB0aGUgQ0ZMQUdTIHdlIGFkZGVkIGFyZSBhY3R1YWxseSBhY2NlcHRlZCBieSBvdXIKKwkjIGNvbXBpbGVyLiAgSWYgbm90IChhbmQgT1MgWCdzIGxkLCBmb3IgaW5zdGFuY2UsIGRvZXMgbm90IGFjY2VwdCAteiksCisJIyB0aGVuIHdlIGNhbid0IGRvIHRoaXMgdGVzdC4KKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGNoZWNrIGZvciBHQ0MgcHRocmVhZC9zaGFyZWQgaW5jb25zaXN0ZW5jaWVzXSkKKwkgICBBQ19UUllfTElOSygsLCAsIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXMgOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgIGZpCisJZmkKKwkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1wdGhyZWFkIGlzIHN1ZmZpY2llbnQgd2l0aCAtc2hhcmVkXSkKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgIFtkb25lPXllc10pCisJICAgCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgZmkKKwlmaQorCQorCSMKKwkjIExpbnV4IGdjYyBvbiBzb21lIGFyY2hpdGVjdHVyZXMgc3VjaCBhcyBtaXBzL21pcHNlbCBmb3JnZXRzCisJIyBhYm91dCAtbHB0aHJlYWQKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbHB0aHJlYWQgZml4ZXMgdGhhdF0pCisJICAgTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICAgIFBUSFJFQURfTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMiCisJICAgZWxzZQorCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKwkgICBmaQorCWZpCisJIworCSMgRnJlZUJTRCA0LjEwIGdjYyBmb3JnZXRzIHRvIHVzZSAtbGNfciBpbnN0ZWFkIG9mIC1sYworCSMKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sY19yIGZpeGVzIHRoYXRdKQorCSAgIExJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisJICAgICAgIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICAgIFBUSFJFQURfTElCUz0iLWxjX3IgJFBUSFJFQURfTElCUyIKKwkgICBlbHNlCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGZpCisJZmkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgIyBPSywgd2UgaGF2ZSBydW4gb3V0IG9mIGlkZWFzCisJICAgQUNfTVNHX1dBUk4oW0ltcG9zc2libGUgdG8gZGV0ZXJtaW5lIGhvdyB0byB1c2UgcHRocmVhZHMgd2l0aCBzaGFyZWQgbGlicmFyaWVzXSkKKwkKKwkgICAjIHNvIGl0J3Mgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UgbWF5IHVzZSBwdGhyZWFkcworCSAgIGFjeF9wdGhyZWFkX29rPW5vCisJZmkKKwkKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlMSUJTPSIkc2F2ZV9MSUJTIgorCUNDPSIkc2F2ZV9DQyIKK2Vsc2UKKyAgICAgICAgUFRIUkVBRF9DQz0iJENDIgorZmkKKworQUNfU1VCU1QoUFRIUkVBRF9MSUJTKQorQUNfU1VCU1QoUFRIUkVBRF9DRkxBR1MpCitBQ19TVUJTVChQVEhSRUFEX0NDKQorCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskMV0sLEFDX0RFRklORShIQVZFX1BUSFJFQUQsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuXSksWyQxXSkKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworICAgICAgICAkMgorZmkKK0FDX0xBTkdfUkVTVE9SRQorXSlkbmwgQUNYX1BUSFJFQUQKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tNC9ndGVzdC5tNCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tNC9ndGVzdC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTk4YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL200L2d0ZXN0Lm00CkBAIC0wLDAgKzEsNzQgQEAKK2RubCBHVEVTVF9MSUJfQ0hFQ0soW21pbmltdW0gdmVyc2lvbiBbLAorZG5sICAgICAgICAgICAgICAgICAgYWN0aW9uIGlmIGZvdW5kIFssYWN0aW9uIGlmIG5vdCBmb3VuZF1dXSkKK2RubAorZG5sIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIEdvb2dsZSBUZXN0IGxpYnJhcnksIG9wdGlvbmFsbHkgYXQgYSBtaW5pbXVtCitkbmwgdmVyc2lvbiwgYW5kIGluZGljYXRlIGEgdmlhYmxlIHZlcnNpb24gd2l0aCB0aGUgSEFWRV9HVEVTVCBmbGFnLiBJdCBkZWZpbmVzCitkbmwgc3RhbmRhcmQgdmFyaWFibGVzIGZvciBzdWJzdGl0dXRpb24gaW5jbHVkaW5nIEdURVNUX0NQUEZMQUdTLAorZG5sIEdURVNUX0NYWEZMQUdTLCBHVEVTVF9MREZMQUdTLCBhbmQgR1RFU1RfTElCUy4gSXQgYWxzbyBkZWZpbmVzCitkbmwgR1RFU1RfVkVSU0lPTiBhcyB0aGUgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCBmb3VuZC4gRmluYWxseSwgaXQgcHJvdmlkZXMKK2RubCBvcHRpb25hbCBjdXN0b20gYWN0aW9uIHNsb3RzIGluIHRoZSBldmVudCBHVEVTVCBpcyBmb3VuZCBvciBub3QuCitBQ19ERUZVTihbR1RFU1RfTElCX0NIRUNLXSwKK1sKK2RubCBQcm92aWRlIGEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBHb29nbGUgVGVzdCB1c2FnZS4KK0FDX0FSR19FTkFCTEUoW2d0ZXN0XSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ndGVzdF0sCisgICAgICAgICAgICAgICAgICBbRW5hYmxlIHRlc3RzIHVzaW5nIHRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorICAgICAgICAgICAgICAgICAgKERlZmF1bHQgaXMgZW5hYmxlZC4pXSldLAorICBbXSwKKyAgW2VuYWJsZV9ndGVzdD1dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ09ORklHXSwKKyAgICAgICAgICAgW1RoZSBleGFjdCBwYXRoIG9mIEdvb2dsZSBUZXN0J3MgJ2d0ZXN0LWNvbmZpZycgc2NyaXB0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9DUFBGTEFHU10sCisgICAgICAgICAgIFtDLWxpa2UgcHJlcHJvY2Vzc29yIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ1hYRkxBR1NdLAorICAgICAgICAgICBbQysrIGNvbXBpbGUgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9MREZMQUdTXSwKKyAgICAgICAgICAgW0xpbmtlciBwYXRoIGFuZCBvcHRpb24gZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9MSUJTXSwKKyAgICAgICAgICAgW0xpYnJhcnkgbGlua2luZyBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKK0FDX0FSR19WQVIoW0dURVNUX1ZFUlNJT05dLAorICAgICAgICAgICBbVGhlIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QgYXZhaWxhYmxlLl0pCitIQVZFX0dURVNUPSJubyIKK0FTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiAhPSAieG5vIl0sCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAnZ3Rlc3QtY29uZmlnJ10pCisgICBBU19JRihbdGVzdCAieCR7ZW5hYmxlX2d0ZXN0fSIgIT0gInh5ZXMiXSwKKyAgICAgW0FTX0lGKFt0ZXN0IC14ICIke2VuYWJsZV9ndGVzdH0vc2NyaXB0cy9ndGVzdC1jb25maWciXSwKKyAgICAgICAgW0dURVNUX0NPTkZJRz0iJHtlbmFibGVfZ3Rlc3R9L3NjcmlwdHMvZ3Rlc3QtY29uZmlnIl0sCisgICAgICAgIFtHVEVTVF9DT05GSUc9IiR7ZW5hYmxlX2d0ZXN0fS9iaW4vZ3Rlc3QtY29uZmlnIl0pCisgICAgICBBU19JRihbdGVzdCAteCAiJHtHVEVTVF9DT05GSUd9Il0sIFtdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgQUNfTVNHX0VSUk9SKFtkbmwKK1VuYWJsZSB0byBsb2NhdGUgZWl0aGVyIGEgYnVpbHQgb3IgaW5zdGFsbGVkIEdvb2dsZSBUZXN0LgorVGhlIHNwZWNpZmljIGxvY2F0aW9uICcke2VuYWJsZV9ndGVzdH0nIHdhcyBwcm92aWRlZCBmb3IgYSBidWlsdCBvciBpbnN0YWxsZWQKK0dvb2dsZSBUZXN0LCBidXQgbm8gJ2d0ZXN0LWNvbmZpZycgc2NyaXB0IGNvdWxkIGJlIGZvdW5kIGF0IHRoaXMgbG9jYXRpb24uXSkKKyAgICAgICAgIF0pXSwKKyAgICAgW0FDX1BBVEhfUFJPRyhbR1RFU1RfQ09ORklHXSwgW2d0ZXN0LWNvbmZpZ10pXSkKKyAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwKKyAgICAgW0FDX01TR19SRVNVTFQoWyR7R1RFU1RfQ09ORklHfV0pCisgICAgICBtNF9pZnZhbChbJDFdLAorICAgICAgICBbX2d0ZXN0X21pbl92ZXJzaW9uPSItLW1pbi12ZXJzaW9uPSQxIgorICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR29vZ2xlIFRlc3QgYXQgbGVhc3QgdmVyc2lvbiA+PSAkMV0pXSwKKyAgICAgICAgW19ndGVzdF9taW5fdmVyc2lvbj0iLS1taW4tdmVyc2lvbj0wIgorICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR29vZ2xlIFRlc3RdKV0pCisgICAgICBBU19JRihbJHtHVEVTVF9DT05GSUd9ICR7X2d0ZXN0X21pbl92ZXJzaW9ufV0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgSEFWRV9HVEVTVD0neWVzJ10sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSldLAorICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICBBU19JRihbdGVzdCAieCR7SEFWRV9HVEVTVH0iID0gInh5ZXMiXSwKKyAgICAgW0dURVNUX0NQUEZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1jcHBmbGFnc2AKKyAgICAgIEdURVNUX0NYWEZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1jeHhmbGFnc2AKKyAgICAgIEdURVNUX0xERkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWxkZmxhZ3NgCisgICAgICBHVEVTVF9MSUJTPWAke0dURVNUX0NPTkZJR30gLS1saWJzYAorICAgICAgR1RFU1RfVkVSU0lPTj1gJHtHVEVTVF9DT05GSUd9IC0tdmVyc2lvbmAKKyAgICAgIEFDX0RFRklORShbSEFWRV9HVEVTVF0sWzFdLFtEZWZpbmVkIHdoZW4gR29vZ2xlIFRlc3QgaXMgYXZhaWxhYmxlLl0pXSwKKyAgICAgW0FTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiA9ICJ4eWVzIl0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW2RubAorR29vZ2xlIFRlc3Qgd2FzIGVuYWJsZWQsIGJ1dCBubyB2aWFibGUgdmVyc2lvbiBjb3VsZCBiZSBmb3VuZC5dKQorICAgICAgICAgXSldKV0pCitBQ19TVUJTVChbSEFWRV9HVEVTVF0pCitBTV9DT05ESVRJT05BTChbSEFWRV9HVEVTVF0sW3Rlc3QgIngkSEFWRV9HVEVTVCIgPSAieHllcyJdKQorQVNfSUYoW3Rlc3QgIngkSEFWRV9HVEVTVCIgPSAieHllcyJdLAorICBbbTRfaWZ2YWwoWyQyXSwgWyQyXSldLAorICBbbTRfaWZ2YWwoWyQzXSwgWyQzXSldKQorXSkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tYWtlL01ha2VmaWxlIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21ha2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyN2I2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tYWtlL01ha2VmaWxlCkBAIC0wLDAgKzEsODAgQEAKKyMgQSBzYW1wbGUgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0IGFuZCB1c2luZyBpdCBpbiB1c2VyCisjIHRlc3RzLiAgUGxlYXNlIHR3ZWFrIGl0IHRvIHN1aXQgeW91ciBlbnZpcm9ubWVudCBhbmQgcHJvamVjdC4gIFlvdQorIyBtYXkgd2FudCB0byBtb3ZlIGl0IHRvIHlvdXIgcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5LgorIworIyBTWU5PUFNJUzoKKyMKKyMgICBtYWtlIFthbGxdICAtIG1ha2VzIGV2ZXJ5dGhpbmcuCisjICAgbWFrZSBUQVJHRVQgLSBtYWtlcyB0aGUgZ2l2ZW4gdGFyZ2V0LgorIyAgIG1ha2UgY2xlYW4gIC0gcmVtb3ZlcyBhbGwgZmlsZXMgZ2VuZXJhdGVkIGJ5IG1ha2UuCisKKyMgUGxlYXNlIHR3ZWFrIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMgYXMgbmVlZGVkIGJ5IHlvdXIKKyMgcHJvamVjdCwgZXhjZXB0IEdURVNUX0hFQURFUlMsIHdoaWNoIHlvdSBjYW4gdXNlIGluIHlvdXIgb3duIHRhcmdldHMKKyMgYnV0IHNob3VsZG4ndCBtb2RpZnkuCisKKyMgUG9pbnRzIHRvIHRoZSByb290IG9mIEdvb2dsZSBUZXN0LCByZWxhdGl2ZSB0byB3aGVyZSB0aGlzIGZpbGUgaXMuCisjIFJlbWVtYmVyIHRvIHR3ZWFrIHRoaXMgaWYgeW91IG1vdmUgdGhpcyBmaWxlLgorR1RFU1RfRElSID0gLi4KKworIyBXaGVyZSB0byBmaW5kIHVzZXIgY29kZS4KK1VTRVJfRElSID0gLi4vc2FtcGxlcworCisjIEZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yLgorQ1BQRkxBR1MgKz0gLUkkKEdURVNUX0RJUikvaW5jbHVkZQorCisjIEZsYWdzIHBhc3NlZCB0byB0aGUgQysrIGNvbXBpbGVyLgorQ1hYRkxBR1MgKz0gLWcgLVdhbGwgLVdleHRyYQorCisjIEFsbCB0ZXN0cyBwcm9kdWNlZCBieSB0aGlzIE1ha2VmaWxlLiAgUmVtZW1iZXIgdG8gYWRkIG5ldyB0ZXN0cyB5b3UKKyMgY3JlYXRlZCB0byB0aGUgbGlzdC4KK1RFU1RTID0gc2FtcGxlMV91bml0dGVzdAorCisjIEFsbCBHb29nbGUgVGVzdCBoZWFkZXJzLiAgVXN1YWxseSB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzCisjIGRlZmluaXRpb24uCitHVEVTVF9IRUFERVJTID0gJChHVEVTVF9ESVIpL2luY2x1ZGUvZ3Rlc3QvKi5oIFwKKyAgICAgICAgICAgICAgICAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC8qLmgKKworIyBIb3VzZS1rZWVwaW5nIGJ1aWxkIHRhcmdldHMuCisKK2FsbCA6ICQoVEVTVFMpCisKK2NsZWFuIDoKKwlybSAtZiAkKFRFU1RTKSBndGVzdC5hIGd0ZXN0X21haW4uYSAqLm8KKworIyBCdWlsZHMgZ3Rlc3QuYSBhbmQgZ3Rlc3RfbWFpbi5hLgorCisjIFVzdWFsbHkgeW91IHNob3VsZG4ndCB0d2VhayBzdWNoIGludGVybmFsIHZhcmlhYmxlcywgaW5kaWNhdGVkIGJ5IGEKKyMgdHJhaWxpbmcgXy4KK0dURVNUX1NSQ1NfID0gJChHVEVTVF9ESVIpL3NyYy8qLmNjICQoR1RFU1RfRElSKS9zcmMvKi5oICQoR1RFU1RfSEVBREVSUykKKworIyBGb3Igc2ltcGxpY2l0eSBhbmQgdG8gYXZvaWQgZGVwZW5kaW5nIG9uIEdvb2dsZSBUZXN0J3MKKyMgaW1wbGVtZW50YXRpb24gZGV0YWlscywgdGhlIGRlcGVuZGVuY2llcyBzcGVjaWZpZWQgYmVsb3cgYXJlCisjIGNvbnNlcnZhdGl2ZSBhbmQgbm90IG9wdGltaXplZC4gIFRoaXMgaXMgZmluZSBhcyBHb29nbGUgVGVzdAorIyBjb21waWxlcyBmYXN0IGFuZCBmb3Igb3JkaW5hcnkgdXNlcnMgaXRzIHNvdXJjZSByYXJlbHkgY2hhbmdlcy4KK2d0ZXN0LWFsbC5vIDogJChHVEVTVF9TUkNTXykKKwkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgJChDWFhGTEFHUykgLWMgXAorICAgICAgICAgICAgJChHVEVTVF9ESVIpL3NyYy9ndGVzdC1hbGwuY2MKKworZ3Rlc3RfbWFpbi5vIDogJChHVEVTVF9TUkNTXykKKwkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgJChDWFhGTEFHUykgLWMgXAorICAgICAgICAgICAgJChHVEVTVF9ESVIpL3NyYy9ndGVzdF9tYWluLmNjCisKK2d0ZXN0LmEgOiBndGVzdC1hbGwubworCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworZ3Rlc3RfbWFpbi5hIDogZ3Rlc3QtYWxsLm8gZ3Rlc3RfbWFpbi5vCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCisjIEJ1aWxkcyBhIHNhbXBsZSB0ZXN0LiAgQSB0ZXN0IHNob3VsZCBsaW5rIHdpdGggZWl0aGVyIGd0ZXN0LmEgb3IKKyMgZ3Rlc3RfbWFpbi5hLCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBkZWZpbmVzIGl0cyBvd24gbWFpbigpCisjIGZ1bmN0aW9uLgorCitzYW1wbGUxLm8gOiAkKFVTRVJfRElSKS9zYW1wbGUxLmNjICQoVVNFUl9ESVIpL3NhbXBsZTEuaCAkKEdURVNUX0hFQURFUlMpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoVVNFUl9ESVIpL3NhbXBsZTEuY2MKKworc2FtcGxlMV91bml0dGVzdC5vIDogJChVU0VSX0RJUikvc2FtcGxlMV91bml0dGVzdC5jYyBcCisgICAgICAgICAgICAgICAgICAgICAkKFVTRVJfRElSKS9zYW1wbGUxLmggJChHVEVTVF9IRUFERVJTKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFVTRVJfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjCisKK3NhbXBsZTFfdW5pdHRlc3QgOiBzYW1wbGUxLm8gc2FtcGxlMV91bml0dGVzdC5vIGd0ZXN0X21haW4uYQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtbHB0aHJlYWQgJF4gLW8gJEAKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0LW1kLnNsbiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0LW1kLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzkwOGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3QtbWQuc2xuCkBAIC0wLDAgKzEsNDUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDguMDANCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0LW1kIiwgImd0ZXN0LW1kLnZjcHJvaiIsICJ7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X21haW4tbWQiLCAiZ3Rlc3RfbWFpbi1tZC52Y3Byb2oiLCAiezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdF9wcm9kX3Rlc3QtbWQiLCAiZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvaiIsICJ7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3VuaXR0ZXN0LW1kIiwgImd0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvaiIsICJ7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb24pID0gcHJlU29sdXRpb24NCisJCURlYnVnID0gRGVidWcNCisJCVJlbGVhc2UgPSBSZWxlYXNlDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvbikgPSBwb3N0U29sdXRpb24NCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5QWRkSW5zKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3QtbWQudmNwcm9qIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3QtbWQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzVjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdC1tZC52Y3Byb2oKQEAgLTAsMCArMSwxMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdC1tZCINCisJUHJvamVjdEdVSUQ9IntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RkLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0LmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xndGVzdC1hbGwuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3Quc2xuIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3Quc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGIwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdC5zbG4KQEAgLTAsMCArMSw0NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3QiLCAiZ3Rlc3QudmNwcm9qIiwgIntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbiIsICJndGVzdF9tYWluLnZjcHJvaiIsICJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3VuaXR0ZXN0IiwgImd0ZXN0X3VuaXR0ZXN0LnZjcHJvaiIsICJ7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3Byb2RfdGVzdCIsICJndGVzdF9wcm9kX3Rlc3QudmNwcm9qIiwgInsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWcgPSBEZWJ1Zw0KKwkJUmVsZWFzZSA9IFJlbGVhc2UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdC52Y3Byb2ogYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNzNjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0LnZjcHJvagpAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0Ig0KKwlQcm9qZWN0R1VJRD0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdGQubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iJnF1b3Q7Li5caW5jbHVkZSZxdW90OzsmcXVvdDsuLiZxdW90OyI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3QubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0LWFsbC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvaiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Mzc5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvagpAQCAtMCwwICsxLDEyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X21haW4tbWQiDQorCVByb2plY3RHVUlEPSJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19MSUIiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKS5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwkJPFByb2plY3RSZWZlcmVuY2UNCisJCQlSZWZlcmVuY2VkUHJvamVjdElkZW50aWZpZXI9IntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9Ig0KKwkJCU5hbWU9Imd0ZXN0LW1kIi8+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xndGVzdF9tYWluLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X21haW4udmNwcm9qIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3RfbWFpbi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiNzYzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X21haW4udmNwcm9qCkBAIC0wLDAgKzEsMTI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3RfbWFpbiINCisJUHJvamVjdEdVSUQ9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSlkLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjQiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQorCQkJTmFtZT0iZ3Rlc3QiLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvaiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViMDVkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2oKQEAgLTAsMCArMSwxNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9wcm9kX3Rlc3QtbWQiDQorCVByb2plY3RHVUlEPSJ7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwkJPFByb2plY3RSZWZlcmVuY2UNCisJCQlSZWZlcmVuY2VkUHJvamVjdElkZW50aWZpZXI9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9Ig0KKwkJCU5hbWU9Imd0ZXN0X21haW4tbWQiLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxndGVzdF9wcm9kX3Rlc3QuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RccHJvZHVjdGlvbi5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RccHJvZHVjdGlvbi5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3RfcHJvZF90ZXN0LnZjcHJvaiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3YTJmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2oKQEAgLTAsMCArMSwxNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9wcm9kX3Rlc3QiDQorCVByb2plY3RHVUlEPSJ7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjQiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwkJPFByb2plY3RSZWZlcmVuY2UNCisJCQlSZWZlcmVuY2VkUHJvamVjdElkZW50aWZpZXI9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KKwkJCU5hbWU9Imd0ZXN0X21haW4iLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxndGVzdF9wcm9kX3Rlc3QuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RccHJvZHVjdGlvbi5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RccHJvZHVjdGlvbi5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL21zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdF91bml0dGVzdC1tZC52Y3Byb2oKQEAgLTAsMCArMSwxNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF91bml0dGVzdC1tZCINCisJUHJvamVjdEdVSUQ9Ins0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbi1tZCIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIxIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdF91bml0dGVzdC52Y3Byb2ogYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvbXN2Yy9ndGVzdF91bml0dGVzdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxZjUyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagpAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3VuaXR0ZXN0Ig0KKwlQcm9qZWN0R1VJRD0iezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJCTxQcm9qZWN0UmVmZXJlbmNlDQorCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfSINCisJCQlOYW1lPSJndGVzdF9tYWluIi8+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RcZ3Rlc3RfdW5pdHRlc3QuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjEiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3ByaW1lX3RhYmxlcy5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvcHJpbWVfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjZTE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3ByaW1lX3RhYmxlcy5oCkBAIC0wLDAgKzEsMTIzIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFRoaXMgcHJvdmlkZXMgaW50ZXJmYWNlIFByaW1lVGFibGUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSBudW1iZXIgaXMgYQorLy8gcHJpbWUgYW5kIGRldGVybWluZXMgYSBuZXh0IHByaW1lIG51bWJlci4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZAorLy8gaW4gR29vZ2xlIFRlc3Qgc2FtcGxlcyBkZW1vbnN0cmF0aW5nIHVzZSBvZiBwYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfUFJJTUVfVEFCTEVTX0hfCisjZGVmaW5lIEdURVNUX1NBTVBMRVNfUFJJTUVfVEFCTEVTX0hfCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8vIFRoZSBwcmltZSB0YWJsZSBpbnRlcmZhY2UuCitjbGFzcyBQcmltZVRhYmxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflByaW1lVGFibGUoKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgbiBpcyBhIHByaW1lIG51bWJlci4KKyAgdmlydHVhbCBib29sIElzUHJpbWUoaW50IG4pIGNvbnN0ID0gMDsKKworICAvLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBwcmltZSBudW1iZXIgZ3JlYXRlciB0aGFuIHA7IG9yIHJldHVybnMgLTEKKyAgLy8gaWYgdGhlIG5leHQgcHJpbWUgaXMgYmV5b25kIHRoZSBjYXBhY2l0eSBvZiB0aGUgdGFibGUuCisgIHZpcnR1YWwgaW50IEdldE5leHRQcmltZShpbnQgcCkgY29uc3QgPSAwOworfTsKKworLy8gSW1wbGVtZW50YXRpb24gIzEgY2FsY3VsYXRlcyB0aGUgcHJpbWVzIG9uLXRoZS1mbHkuCitjbGFzcyBPblRoZUZseVByaW1lVGFibGUgOiBwdWJsaWMgUHJpbWVUYWJsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgeworICAgIGlmIChuIDw9IDEpIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAyOyBpKmkgPD0gbjsgaSsrKSB7CisgICAgICAvLyBuIGlzIGRpdmlzaWJsZSBieSBhbiBpbnRlZ2VyIG90aGVyIHRoYW4gMSBhbmQgaXRzZWxmLgorICAgICAgaWYgKChuICUgaSkgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCB7CisgICAgZm9yIChpbnQgbiA9IHAgKyAxOyBuID4gMDsgbisrKSB7CisgICAgICBpZiAoSXNQcmltZShuKSkgcmV0dXJuIG47CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiAjMiBwcmUtY2FsY3VsYXRlcyB0aGUgcHJpbWVzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdAorLy8gaW4gYW4gYXJyYXkuCitjbGFzcyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSA6IHB1YmxpYyBQcmltZVRhYmxlIHsKKyBwdWJsaWM6CisgIC8vICdtYXgnIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgdGhlIHByaW1lIHRhYmxlIGhvbGRzLgorICBleHBsaWNpdCBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZShpbnQgbWF4KQorICAgICAgOiBpc19wcmltZV9zaXplXyhtYXggKyAxKSwgaXNfcHJpbWVfKG5ldyBib29sW21heCArIDFdKSB7CisgICAgQ2FsY3VsYXRlUHJpbWVzVXBUbyhtYXgpOworICB9CisgIHZpcnR1YWwgflByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKCkgeyBkZWxldGVbXSBpc19wcmltZV87IH0KKworICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgeworICAgIHJldHVybiAwIDw9IG4gJiYgbiA8IGlzX3ByaW1lX3NpemVfICYmIGlzX3ByaW1lX1tuXTsKKyAgfQorCisgIHZpcnR1YWwgaW50IEdldE5leHRQcmltZShpbnQgcCkgY29uc3QgeworICAgIGZvciAoaW50IG4gPSBwICsgMTsgbiA8IGlzX3ByaW1lX3NpemVfOyBuKyspIHsKKyAgICAgIGlmIChpc19wcmltZV9bbl0pIHJldHVybiBuOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBDYWxjdWxhdGVQcmltZXNVcFRvKGludCBtYXgpIHsKKyAgICA6OnN0ZDo6ZmlsbChpc19wcmltZV8sIGlzX3ByaW1lXyArIGlzX3ByaW1lX3NpemVfLCB0cnVlKTsKKyAgICBpc19wcmltZV9bMF0gPSBpc19wcmltZV9bMV0gPSBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IG1heDsgaSsrKSB7CisgICAgICBpZiAoIWlzX3ByaW1lX1tpXSkgY29udGludWU7CisKKyAgICAgIC8vIE1hcmtzIGFsbCBtdWx0aXBsZXMgb2YgaSAoZXhjZXB0IGkgaXRzZWxmKSBhcyBub24tcHJpbWUuCisgICAgICBmb3IgKGludCBqID0gMippOyBqIDw9IG1heDsgaiArPSBpKSB7CisgICAgICAgIGlzX3ByaW1lX1tqXSA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNvbnN0IGludCBpc19wcmltZV9zaXplXzsKKyAgYm9vbCogY29uc3QgaXNfcHJpbWVfOworCisgIC8vIERpc2FibGVzIGNvbXBpbGVyIHdhcm5pbmcgImFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZC4iCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlJiByaHMpOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1BSSU1FX1RBQkxFU19IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMS5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTEuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MWUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTEuY2MKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJzYW1wbGUxLmgiCisKKy8vIFJldHVybnMgbiEgKHRoZSBmYWN0b3JpYWwgb2YgbikuICBGb3IgbmVnYXRpdmUgbiwgbiEgaXMgZGVmaW5lZCB0byBiZSAxLgoraW50IEZhY3RvcmlhbChpbnQgbikgeworICBpbnQgcmVzdWx0ID0gMTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisgICAgcmVzdWx0ICo9IGk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIG4gaXMgYSBwcmltZSBudW1iZXIuCitib29sIElzUHJpbWUoaW50IG4pIHsKKyAgLy8gVHJpdmlhbCBjYXNlIDE6IHNtYWxsIG51bWJlcnMKKyAgaWYgKG4gPD0gMSkgcmV0dXJuIGZhbHNlOworCisgIC8vIFRyaXZpYWwgY2FzZSAyOiBldmVuIG51bWJlcnMKKyAgaWYgKG4gJSAyID09IDApIHJldHVybiBuID09IDI7CisKKyAgLy8gTm93LCB3ZSBoYXZlIHRoYXQgbiBpcyBvZGQgYW5kIG4gPj0gMy4KKworICAvLyBUcnkgdG8gZGl2aWRlIG4gYnkgZXZlcnkgb2RkIG51bWJlciBpLCBzdGFydGluZyBmcm9tIDMKKyAgZm9yIChpbnQgaSA9IDM7IDsgaSArPSAyKSB7CisgICAgLy8gV2Ugb25seSBoYXZlIHRvIHRyeSBpIHVwIHRvIHRoZSBzcXVyZSByb290IG9mIG4KKyAgICBpZiAoaSA+IG4vaSkgYnJlYWs7CisKKyAgICAvLyBOb3csIHdlIGhhdmUgaSA8PSBuL2kgPCBuLgorICAgIC8vIElmIG4gaXMgZGl2aXNpYmxlIGJ5IGksIG4gaXMgbm90IHByaW1lLgorICAgIGlmIChuICUgaSA9PSAwKSByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBuIGhhcyBubyBpbnRlZ2VyIGZhY3RvciBpbiB0aGUgcmFuZ2UgKDEsIG4pLCBhbmQgdGh1cyBpcyBwcmltZS4KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUxLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmZWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTEuaApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTFfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUxX0hfCisKKy8vIFJldHVybnMgbiEgKHRoZSBmYWN0b3JpYWwgb2YgbikuICBGb3IgbmVnYXRpdmUgbiwgbiEgaXMgZGVmaW5lZCB0byBiZSAxLgoraW50IEZhY3RvcmlhbChpbnQgbik7CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgbiBpcyBhIHByaW1lIG51bWJlci4KK2Jvb2wgSXNQcmltZShpbnQgbik7CisKKyNlbmRpZiAgLy8gR1RFU1RfU0FNUExFU19TQU1QTEUxX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTNkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB1c2UgR29vZ2xlIFRlc3QgbGlzdGVuZXIgQVBJIHRvIGltcGxlbWVudAorLy8gYSBwcmltaXRpdmUgbGVhayBjaGVja2VyLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIDo6dGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RJbmZvOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKK25hbWVzcGFjZSB7CisKKy8vIFdlIHdpbGwgdHJhY2sgbWVtb3J5IHVzZWQgYnkgdGhpcyBjbGFzcy4KK2NsYXNzIFdhdGVyIHsKKyBwdWJsaWM6CisgIC8vIE5vcm1hbCBXYXRlciBkZWNsYXJhdGlvbnMgZ28gaGVyZS4KKworICAvLyBvcGVyYXRvciBuZXcgYW5kIG9wZXJhdG9yIGRlbGV0ZSBoZWxwIHVzIGNvbnRyb2wgd2F0ZXIgYWxsb2NhdGlvbi4KKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBhbGxvY2F0aW9uX3NpemUpIHsKKyAgICBhbGxvY2F0ZWRfKys7CisgICAgcmV0dXJuIG1hbGxvYyhhbGxvY2F0aW9uX3NpemUpOworICB9CisKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogYmxvY2ssIHNpemVfdCAvKiBhbGxvY2F0aW9uX3NpemUgKi8pIHsKKyAgICBhbGxvY2F0ZWRfLS07CisgICAgZnJlZShibG9jayk7CisgIH0KKworICBzdGF0aWMgaW50IGFsbG9jYXRlZCgpIHsgcmV0dXJuIGFsbG9jYXRlZF87IH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgYWxsb2NhdGVkXzsKK307CisKK2ludCBXYXRlcjo6YWxsb2NhdGVkXyA9IDA7CisKKy8vIFRoaXMgZXZlbnQgbGlzdGVuZXIgbW9uaXRvcnMgaG93IG1hbnkgV2F0ZXIgb2JqZWN0cyBhcmUgY3JlYXRlZCBhbmQKKy8vIGRlc3Ryb3llZCBieSBlYWNoIHRlc3QsIGFuZCByZXBvcnRzIGEgZmFpbHVyZSBpZiBhIHRlc3QgbGVha3Mgc29tZSBXYXRlcgorLy8gb2JqZWN0cy4gSXQgZG9lcyB0aGlzIGJ5IGNvbXBhcmluZyB0aGUgbnVtYmVyIG9mIGxpdmUgV2F0ZXIgb2JqZWN0cyBhdAorLy8gdGhlIGJlZ2lubmluZyBvZiBhIHRlc3QgYW5kIGF0IHRoZSBlbmQgb2YgYSB0ZXN0LgorY2xhc3MgTGVha0NoZWNrZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHJpdmF0ZToKKyAgLy8gQ2FsbGVkIGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIC8qIHRlc3RfaW5mbyAqLykgeworICAgIGluaXRpYWxseV9hbGxvY2F0ZWRfID0gV2F0ZXI6OmFsbG9jYXRlZCgpOworICB9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIGEgdGVzdCBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiAvKiB0ZXN0X2luZm8gKi8pIHsKKyAgICBpbnQgZGlmZmVyZW5jZSA9IFdhdGVyOjphbGxvY2F0ZWQoKSAtIGluaXRpYWxseV9hbGxvY2F0ZWRfOworCisgICAgLy8gWW91IGNhbiBnZW5lcmF0ZSBhIGZhaWx1cmUgaW4gYW55IGV2ZW50IGhhbmRsZXIgZXhjZXB0CisgICAgLy8gT25UZXN0UGFydFJlc3VsdC4gSnVzdCB1c2UgYW4gYXBwcm9wcmlhdGUgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHRvIGRvCisgICAgLy8gaXQuCisgICAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZSA8PSAwKQorICAgICAgICA8PCAiTGVha2VkICIgPDwgZGlmZmVyZW5jZSA8PCAiIHVuaXQocykgb2YgV2F0ZXIhIjsKKyAgfQorCisgIGludCBpbml0aWFsbHlfYWxsb2NhdGVkXzsKK307CisKK1RFU1QoTGlzdGVuZXJzVGVzdCwgRG9lc05vdExlYWspIHsKKyAgV2F0ZXIqIHdhdGVyID0gbmV3IFdhdGVyOworICBkZWxldGUgd2F0ZXI7Cit9CisKKy8vIFRoaXMgc2hvdWxkIGZhaWwgd2hlbiB0aGUgLS1jaGVja19mb3JfbGVha3MgY29tbWFuZCBsaW5lIGZsYWcgaXMKKy8vIHNwZWNpZmllZC4KK1RFU1QoTGlzdGVuZXJzVGVzdCwgTGVha3NXYXRlcikgeworICBXYXRlciogd2F0ZXIgPSBuZXcgV2F0ZXI7CisgIEVYUEVDVF9UUlVFKHdhdGVyICE9IE5VTEwpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBib29sIGNoZWNrX2Zvcl9sZWFrcyA9IGZhbHNlOworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWNoZWNrX2Zvcl9sZWFrcyIpID09IDAgKQorICAgIGNoZWNrX2Zvcl9sZWFrcyA9IHRydWU7CisgIGVsc2UKKyAgICBwcmludGYoIiVzXG4iLCAiUnVuIHRoaXMgcHJvZ3JhbSB3aXRoIC0tY2hlY2tfZm9yX2xlYWtzIHRvIGVuYWJsZSAiCisgICAgICAgICAgICJjdXN0b20gbGVhayBjaGVja2luZyBpbiB0aGUgdGVzdHMuIik7CisKKyAgLy8gSWYgd2UgYXJlIGdpdmVuIHRoZSAtLWNoZWNrX2Zvcl9sZWFrcyBjb21tYW5kIGxpbmUgZmxhZywgaW5zdGFsbHMgdGhlCisgIC8vIGxlYWsgY2hlY2tlci4KKyAgaWYgKGNoZWNrX2Zvcl9sZWFrcykgeworICAgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworCisgICAgLy8gQWRkcyB0aGUgbGVhayBjaGVja2VyIHRvIHRoZSBlbmQgb2YgdGhlIHRlc3QgZXZlbnQgbGlzdGVuZXIgbGlzdCwKKyAgICAvLyBhZnRlciB0aGUgZGVmYXVsdCB0ZXh0IG91dHB1dCBwcmludGVyIGFuZCB0aGUgZGVmYXVsdCBYTUwgcmVwb3J0CisgICAgLy8gZ2VuZXJhdG9yLgorICAgIC8vCisgICAgLy8gVGhlIG9yZGVyIGlzIGltcG9ydGFudCAtIGl0IGVuc3VyZXMgdGhhdCBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlCisgICAgLy8gbGVhayBjaGVja2VyJ3MgT25UZXN0RW5kKCkgbWV0aG9kIGFyZSBwcm9jZXNzZWQgYnkgdGhlIHRleHQgYW5kIFhNTAorICAgIC8vIHByaW50ZXJzICpiZWZvcmUqIHRoZWlyIE9uVGVzdEVuZCgpIG1ldGhvZHMgYXJlIGNhbGxlZCwgc3VjaCB0aGF0CisgICAgLy8gdGhleSBhcmUgYXR0cmlidXRlZCB0byB0aGUgcmlnaHQgdGVzdC4gUmVtZW1iZXIgdGhhdCBhIGxpc3RlbmVyCisgICAgLy8gcmVjZWl2ZXMgYW4gT25YeXpTdGFydCBldmVudCAqYWZ0ZXIqIGxpc3RlbmVycyBwcmVjZWRpbmcgaXQgaW4gdGhlCisgICAgLy8gbGlzdCByZWNlaXZlZCB0aGF0IGV2ZW50LCBhbmQgcmVjZWl2ZXMgYW4gT25YeXpFbmQgZXZlbnQgKmJlZm9yZSoKKyAgICAvLyBsaXN0ZW5lcnMgcHJlY2VkaW5nIGl0LgorICAgIC8vCisgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBkZWxldGluZyB0aGUgbmV3IGxpc3RlbmVyIGxhdGVyLCBhcworICAgIC8vIEdvb2dsZSBUZXN0IHdpbGwgZG8gaXQuCisgICAgbGlzdGVuZXJzLkFwcGVuZChuZXcgTGVha0NoZWNrZXIpOworICB9CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE3Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE1MyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHdyaXRlIGEgc2ltcGxlIHVuaXQgdGVzdCBmb3IgYSBmdW5jdGlvbiwKKy8vIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gV3JpdGluZyBhIHVuaXQgdGVzdCB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrIGlzIGVhc3kgYXMgMS0yLTM6CisKKworLy8gU3RlcCAxLiBJbmNsdWRlIG5lY2Vzc2FyeSBoZWFkZXIgZmlsZXMgc3VjaCB0aGF0IHRoZSBzdHVmZiB5b3VyCisvLyB0ZXN0IGxvZ2ljIG5lZWRzIGlzIGRlY2xhcmVkLgorLy8KKy8vIERvbid0IGZvcmdldCBndGVzdC5oLCB3aGljaCBkZWNsYXJlcyB0aGUgdGVzdGluZyBmcmFtZXdvcmsuCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJzYW1wbGUxLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworCisvLyBTdGVwIDIuIFVzZSB0aGUgVEVTVCBtYWNybyB0byBkZWZpbmUgeW91ciB0ZXN0cy4KKy8vCisvLyBURVNUIGhhcyB0d28gcGFyYW1ldGVyczogdGhlIHRlc3QgY2FzZSBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorLy8gQWZ0ZXIgdXNpbmcgdGhlIG1hY3JvLCB5b3Ugc2hvdWxkIGRlZmluZSB5b3VyIHRlc3QgbG9naWMgYmV0d2VlbiBhCisvLyBwYWlyIG9mIGJyYWNlcy4gIFlvdSBjYW4gdXNlIGEgYnVuY2ggb2YgbWFjcm9zIHRvIGluZGljYXRlIHRoZQorLy8gc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgdGVzdC4gIEVYUEVDVF9UUlVFIGFuZCBFWFBFQ1RfRVEgYXJlCisvLyBleGFtcGxlcyBvZiBzdWNoIG1hY3Jvcy4gIEZvciBhIGNvbXBsZXRlIGxpc3QsIHNlZSBndGVzdC5oLgorLy8KKy8vIDxUZWNobmljYWxEZXRhaWxzPgorLy8KKy8vIEluIEdvb2dsZSBUZXN0LCB0ZXN0cyBhcmUgZ3JvdXBlZCBpbnRvIHRlc3QgY2FzZXMuICBUaGlzIGlzIGhvdyB3ZQorLy8ga2VlcCB0ZXN0IGNvZGUgb3JnYW5pemVkLiAgWW91IHNob3VsZCBwdXQgbG9naWNhbGx5IHJlbGF0ZWQgdGVzdHMKKy8vIGludG8gdGhlIHNhbWUgdGVzdCBjYXNlLgorLy8KKy8vIFRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgdGhlIHRlc3QgbmFtZSBzaG91bGQgYm90aCBiZSB2YWxpZCBDKysKKy8vIGlkZW50aWZpZXJzLiAgQW5kIHlvdSBzaG91bGQgbm90IHVzZSB1bmRlcnNjb3JlIChfKSBpbiB0aGUgbmFtZXMuCisvLworLy8gR29vZ2xlIFRlc3QgZ3VhcmFudGVlcyB0aGF0IGVhY2ggdGVzdCB5b3UgZGVmaW5lIGlzIHJ1biBleGFjdGx5CisvLyBvbmNlLCBidXQgaXQgbWFrZXMgbm8gZ3VhcmFudGVlIG9uIHRoZSBvcmRlciB0aGUgdGVzdHMgYXJlCisvLyBleGVjdXRlZC4gIFRoZXJlZm9yZSwgeW91IHNob3VsZCB3cml0ZSB5b3VyIHRlc3RzIGluIHN1Y2ggYSB3YXkKKy8vIHRoYXQgdGhlaXIgcmVzdWx0cyBkb24ndCBkZXBlbmQgb24gdGhlaXIgb3JkZXIuCisvLworLy8gPC9UZWNobmljYWxEZXRhaWxzPgorCisKKy8vIFRlc3RzIEZhY3RvcmlhbCgpLgorCisvLyBUZXN0cyBmYWN0b3JpYWwgb2YgbmVnYXRpdmUgbnVtYmVycy4KK1RFU1QoRmFjdG9yaWFsVGVzdCwgTmVnYXRpdmUpIHsKKyAgLy8gVGhpcyB0ZXN0IGlzIG5hbWVkICJOZWdhdGl2ZSIsIGFuZCBiZWxvbmdzIHRvIHRoZSAiRmFjdG9yaWFsVGVzdCIKKyAgLy8gdGVzdCBjYXNlLgorICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC01KSk7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTEpKTsKKyAgRVhQRUNUX1RSVUUoRmFjdG9yaWFsKC0xMCkgPiAwKTsKKworICAvLyA8VGVjaG5pY2FsRGV0YWlscz4KKyAgLy8KKyAgLy8gRVhQRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpIGlzIHRoZSBzYW1lIGFzCisgIC8vCisgIC8vICAgRVhQRUNUX1RSVUUoKGV4cGVjdGVkKSA9PSAoYWN0dWFsKSkKKyAgLy8KKyAgLy8gZXhjZXB0IHRoYXQgaXQgd2lsbCBwcmludCBib3RoIHRoZSBleHBlY3RlZCB2YWx1ZSBhbmQgdGhlIGFjdHVhbAorICAvLyB2YWx1ZSB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuICBUaGlzIGlzIHZlcnkgaGVscGZ1bCBmb3IKKyAgLy8gZGVidWdnaW5nLiAgVGhlcmVmb3JlIGluIHRoaXMgY2FzZSBFWFBFQ1RfRVEgaXMgcHJlZmVycmVkLgorICAvLworICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgRVhQRUNUX1RSVUUgYWNjZXB0cyBhbnkgQm9vbGVhbiBleHByZXNzaW9uLAorICAvLyBhbmQgaXMgdGh1cyBtb3JlIGdlbmVyYWwuCisgIC8vCisgIC8vIDwvVGVjaG5pY2FsRGV0YWlscz4KK30KKworLy8gVGVzdHMgZmFjdG9yaWFsIG9mIDAuCitURVNUKEZhY3RvcmlhbFRlc3QsIFplcm8pIHsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgwKSk7Cit9CisKKy8vIFRlc3RzIGZhY3RvcmlhbCBvZiBwb3NpdGl2ZSBudW1iZXJzLgorVEVTVChGYWN0b3JpYWxUZXN0LCBQb3NpdGl2ZSkgeworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEZhY3RvcmlhbCgyKSk7CisgIEVYUEVDVF9FUSg2LCBGYWN0b3JpYWwoMykpOworICBFWFBFQ1RfRVEoNDAzMjAsIEZhY3RvcmlhbCg4KSk7Cit9CisKKworLy8gVGVzdHMgSXNQcmltZSgpCisKKy8vIFRlc3RzIG5lZ2F0aXZlIGlucHV0LgorVEVTVChJc1ByaW1lVGVzdCwgTmVnYXRpdmUpIHsKKyAgLy8gVGhpcyB0ZXN0IGJlbG9uZ3MgdG8gdGhlIElzUHJpbWVUZXN0IHRlc3QgY2FzZS4KKworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgtMSkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgtMikpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZShJTlRfTUlOKSk7Cit9CisKKy8vIFRlc3RzIHNvbWUgdHJpdmlhbCBjYXNlcy4KK1RFU1QoSXNQcmltZVRlc3QsIFRyaXZpYWwpIHsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgxKSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDMpKTsKK30KKworLy8gVGVzdHMgcG9zaXRpdmUgaW5wdXQuCitURVNUKElzUHJpbWVUZXN0LCBQb3NpdGl2ZSkgeworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSg0KSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoNSkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSg2KSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMjMpKTsKK30KKworLy8gU3RlcCAzLiBDYWxsIFJVTl9BTExfVEVTVFMoKSBpbiBtYWluKCkuCisvLworLy8gV2UgZG8gdGhpcyBieSBsaW5raW5nIGluIHNyYy9ndGVzdF9tYWluLmNjIGZpbGUsIHdoaWNoIGNvbnNpc3RzIG9mCisvLyBhIG1haW4oKSBmdW5jdGlvbiB3aGljaCBjYWxscyBSVU5fQUxMX1RFU1RTKCkgZm9yIHVzLgorLy8KKy8vIFRoaXMgcnVucyBhbGwgdGhlIHRlc3RzIHlvdSd2ZSBkZWZpbmVkLCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gRGlkIHlvdSBub3RpY2UgdGhhdCB3ZSBkaWRuJ3QgcmVnaXN0ZXIgdGhlIHRlc3RzPyAgVGhlCisvLyBSVU5fQUxMX1RFU1RTKCkgbWFjcm8gbWFnaWNhbGx5IGtub3dzIGFib3V0IGFsbCB0aGUgdGVzdHMgd2UKKy8vIGRlZmluZWQuICBJc24ndCB0aGlzIGNvbnZlbmllbnQ/CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUyLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjc2M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMi5jYwpAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgInNhbXBsZTIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4KK2NvbnN0IGNoYXIqIE15U3RyaW5nOjpDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogYV9jX3N0cmluZykgeworICBpZiAoYV9jX3N0cmluZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKGFfY19zdHJpbmcpOworICBjaGFyKiBjb25zdCBjbG9uZSA9IG5ldyBjaGFyWyBsZW4gKyAxIF07CisgIG1lbWNweShjbG9uZSwgYV9jX3N0cmluZywgbGVuICsgMSk7CisKKyAgcmV0dXJuIGNsb25lOworfQorCisvLyBTZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QKKy8vIHJlcHJlc2VudHMuCit2b2lkIE15U3RyaW5nOjpTZXQoY29uc3QgY2hhciogYV9jX3N0cmluZykgeworICAvLyBNYWtlcyBzdXJlIHRoaXMgd29ya3Mgd2hlbiBjX3N0cmluZyA9PSBjX3N0cmluZ18KKyAgY29uc3QgY2hhciogY29uc3QgdGVtcCA9IE15U3RyaW5nOjpDbG9uZUNTdHJpbmcoYV9jX3N0cmluZyk7CisgIGRlbGV0ZVtdIGNfc3RyaW5nXzsKKyAgY19zdHJpbmdfID0gdGVtcDsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTIuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjU3ZTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMi5oCkBAIC0wLDAgKzEsODYgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFMl9IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1NBTVBMRTJfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKy8vIEEgc2ltcGxlIHN0cmluZyBjbGFzcy4KK2NsYXNzIE15U3RyaW5nIHsKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBjX3N0cmluZ187CisgIGNvbnN0IE15U3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgTXlTdHJpbmcmIHJocyk7CisKKyBwdWJsaWM6CisKKyAgLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogYV9jX3N0cmluZyk7CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vCisgIC8vIEMndG9ycworCisgIC8vIFRoZSBkZWZhdWx0IGMndG9yIGNvbnN0cnVjdHMgYSBOVUxMIHN0cmluZy4KKyAgTXlTdHJpbmcoKSA6IGNfc3RyaW5nXyhOVUxMKSB7fQorCisgIC8vIENvbnN0cnVjdHMgYSBNeVN0cmluZyBieSBjbG9uaW5nIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLgorICBleHBsaWNpdCBNeVN0cmluZyhjb25zdCBjaGFyKiBhX2Nfc3RyaW5nKSA6IGNfc3RyaW5nXyhOVUxMKSB7CisgICAgU2V0KGFfY19zdHJpbmcpOworICB9CisKKyAgLy8gQ29weSBjJ3RvcgorICBNeVN0cmluZyhjb25zdCBNeVN0cmluZyYgc3RyaW5nKSA6IGNfc3RyaW5nXyhOVUxMKSB7CisgICAgU2V0KHN0cmluZy5jX3N0cmluZ18pOworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vCisgIC8vIEQndG9yLiAgTXlTdHJpbmcgaXMgaW50ZW5kZWQgdG8gYmUgYSBmaW5hbCBjbGFzcywgc28gdGhlIGQndG9yCisgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSB2aXJ0dWFsLgorICB+TXlTdHJpbmcoKSB7IGRlbGV0ZVtdIGNfc3RyaW5nXzsgfQorCisgIC8vIEdldHMgdGhlIDAtdGVybWluYXRlZCBDIHN0cmluZyB0aGlzIE15U3RyaW5nIG9iamVjdCByZXByZXNlbnRzLgorICBjb25zdCBjaGFyKiBjX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGNfc3RyaW5nXzsgfQorCisgIHNpemVfdCBMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGNfc3RyaW5nXyA9PSBOVUxMID8gMCA6IHN0cmxlbihjX3N0cmluZ18pOworICB9CisKKyAgLy8gU2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgTXlTdHJpbmcgb2JqZWN0IHJlcHJlc2VudHMuCisgIHZvaWQgU2V0KGNvbnN0IGNoYXIqIGNfc3RyaW5nKTsKK307CisKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1NBTVBMRTJfSF8KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTJmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUyX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTA5IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gd3JpdGUgYSBtb3JlIGNvbXBsZXggdW5pdCB0ZXN0IGZvciBhIGNsYXNzCisvLyB0aGF0IGhhcyBtdWx0aXBsZSBtZW1iZXIgZnVuY3Rpb25zLgorLy8KKy8vIFVzdWFsbHksIGl0J3MgYSBnb29kIGlkZWEgdG8gaGF2ZSBvbmUgdGVzdCBmb3IgZWFjaCBtZXRob2QgaW4geW91cgorLy8gY2xhc3MuICBZb3UgZG9uJ3QgaGF2ZSB0byBkbyB0aGF0IGV4YWN0bHksIGJ1dCBpdCBoZWxwcyB0byBrZWVwCisvLyB5b3VyIHRlc3RzIG9yZ2FuaXplZC4gIFlvdSBtYXkgYWxzbyB0aHJvdyBpbiBhZGRpdGlvbmFsIHRlc3RzIGFzCisvLyBuZWVkZWQuCisKKyNpbmNsdWRlICJzYW1wbGUyLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW4gdGhpcyBleGFtcGxlLCB3ZSB0ZXN0IHRoZSBNeVN0cmluZyBjbGFzcyAoYSBzaW1wbGUgc3RyaW5nKS4KKworLy8gVGVzdHMgdGhlIGRlZmF1bHQgYyd0b3IuCitURVNUKE15U3RyaW5nLCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgY29uc3QgTXlTdHJpbmcgczsKKworICAvLyBBc3NlcnRzIHRoYXQgcy5jX3N0cmluZygpIHJldHVybnMgTlVMTC4KKyAgLy8KKyAgLy8gPFRlY2huaWNhbERldGFpbHM+CisgIC8vCisgIC8vIElmIHdlIHdyaXRlIE5VTEwgaW5zdGVhZCBvZgorICAvLworICAvLyAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oTlVMTCkKKyAgLy8KKyAgLy8gaW4gdGhpcyBhc3NlcnRpb24sIGl0IHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIG9uIGdjYyAzLjQuICBUaGUKKyAgLy8gcmVhc29uIGlzIHRoYXQgRVhQRUNUX0VRIG5lZWRzIHRvIGtub3cgdGhlIHR5cGVzIG9mIGl0cworICAvLyBhcmd1bWVudHMgaW4gb3JkZXIgdG8gcHJpbnQgdGhlbSB3aGVuIGl0IGZhaWxzLiAgU2luY2UgTlVMTCBpcworICAvLyAjZGVmaW5lZCBhcyAwLCB0aGUgY29tcGlsZXIgd2lsbCB1c2UgdGhlIGZvcm1hdHRlciBmdW5jdGlvbiBmb3IKKyAgLy8gaW50IHRvIHByaW50IGl0LiAgSG93ZXZlciwgZ2NjIHRoaW5rcyB0aGF0IE5VTEwgc2hvdWxkIGJlIHVzZWQgYXMKKyAgLy8gYSBwb2ludGVyLCBub3QgYW4gaW50LCBhbmQgdGhlcmVmb3JlIGNvbXBsYWlucy4KKyAgLy8KKyAgLy8gVGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgQysrJ3MgbGFjayBvZiBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZQorICAvLyBpbnRlZ2VyIG51bWJlciAwIGFuZCB0aGUgbnVsbCBwb2ludGVyIGNvbnN0YW50LiAgVW5mb3J0dW5hdGVseSwKKyAgLy8gd2UgaGF2ZSB0byBsaXZlIHdpdGggdGhpcyBmYWN0LgorICAvLworICAvLyA8L1RlY2huaWNhbERldGFpbHM+CisgIEVYUEVDVF9TVFJFUShOVUxMLCBzLmNfc3RyaW5nKCkpOworCisgIEVYUEVDVF9FUSgwdSwgcy5MZW5ndGgoKSk7Cit9CisKK2NvbnN0IGNoYXIga0hlbGxvU3RyaW5nW10gPSAiSGVsbG8sIHdvcmxkISI7CisKKy8vIFRlc3RzIHRoZSBjJ3RvciB0aGF0IGFjY2VwdHMgYSBDIHN0cmluZy4KK1RFU1QoTXlTdHJpbmcsIENvbnN0cnVjdG9yRnJvbUNTdHJpbmcpIHsKKyAgY29uc3QgTXlTdHJpbmcgcyhrSGVsbG9TdHJpbmcpOworICBFWFBFQ1RfVFJVRShzdHJjbXAocy5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpID09IDApOworICBFWFBFQ1RfRVEoc2l6ZW9mKGtIZWxsb1N0cmluZykvc2l6ZW9mKGtIZWxsb1N0cmluZ1swXSkgLSAxLAorICAgICAgICAgICAgcy5MZW5ndGgoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBjb3B5IGMndG9yLgorVEVTVChNeVN0cmluZywgQ29weUNvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE15U3RyaW5nIHMxKGtIZWxsb1N0cmluZyk7CisgIGNvbnN0IE15U3RyaW5nIHMyID0gczE7CisgIEVYUEVDVF9UUlVFKHN0cmNtcChzMi5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpID09IDApOworfQorCisvLyBUZXN0cyB0aGUgU2V0IG1ldGhvZC4KK1RFU1QoTXlTdHJpbmcsIFNldCkgeworICBNeVN0cmluZyBzOworCisgIHMuU2V0KGtIZWxsb1N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHN0cmNtcChzLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykgPT0gMCk7CisKKyAgLy8gU2V0IHNob3VsZCB3b3JrIHdoZW4gdGhlIGlucHV0IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZQorICAvLyBhbHJlYWR5IGluIHRoZSBNeVN0cmluZyBvYmplY3QuCisgIHMuU2V0KHMuY19zdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKHN0cmNtcChzLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykgPT0gMCk7CisKKyAgLy8gQ2FuIHdlIHNldCB0aGUgTXlTdHJpbmcgdG8gTlVMTD8KKyAgcy5TZXQoTlVMTCk7CisgIEVYUEVDVF9TVFJFUShOVUxMLCBzLmNfc3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlMy1pbmwuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTMtaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNjlhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTMtaW5sLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUzX0lOTF9IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLy8gUXVldWUgaXMgYSBzaW1wbGUgcXVldWUgaW1wbGVtZW50ZWQgYXMgYSBzaW5nbGVkLWxpbmtlZCBsaXN0LgorLy8KKy8vIFRoZSBlbGVtZW50IHR5cGUgbXVzdCBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gIC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZQorY2xhc3MgUXVldWU7CisKKy8vIFF1ZXVlTm9kZSBpcyBhIG5vZGUgaW4gYSBRdWV1ZSwgd2hpY2ggY29uc2lzdHMgb2YgYW4gZWxlbWVudCBvZgorLy8gdHlwZSBFIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiAgLy8gRSBpcyB0aGUgZWxlbWVudCB0eXBlCitjbGFzcyBRdWV1ZU5vZGUgeworICBmcmllbmQgY2xhc3MgUXVldWU8RT47CisKKyBwdWJsaWM6CisgIC8vIEdldHMgdGhlIGVsZW1lbnQgaW4gdGhpcyBub2RlLgorICBjb25zdCBFJiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZWxlbWVudF87IH0KKworICAvLyBHZXRzIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHF1ZXVlLgorICBRdWV1ZU5vZGUqIG5leHQoKSB7IHJldHVybiBuZXh0XzsgfQorICBjb25zdCBRdWV1ZU5vZGUqIG5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0XzsgfQorCisgcHJpdmF0ZToKKyAgLy8gQ3JlYXRlcyBhIG5vZGUgd2l0aCBhIGdpdmVuIGVsZW1lbnQgdmFsdWUuICBUaGUgbmV4dCBwb2ludGVyIGlzCisgIC8vIHNldCB0byBOVUxMLgorICBRdWV1ZU5vZGUoY29uc3QgRSYgYW5fZWxlbWVudCkgOiBlbGVtZW50Xyhhbl9lbGVtZW50KSwgbmV4dF8oTlVMTCkge30KKworICAvLyBXZSBkaXNhYmxlIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgb3BlcmF0b3IgYW5kIGNvcHkgYyd0b3IuCisgIGNvbnN0IFF1ZXVlTm9kZSYgb3BlcmF0b3IgPSAoY29uc3QgUXVldWVOb2RlJik7CisgIFF1ZXVlTm9kZShjb25zdCBRdWV1ZU5vZGUmKTsKKworICBFIGVsZW1lbnRfOworICBRdWV1ZU5vZGUqIG5leHRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEU+ICAvLyBFIGlzIHRoZSBlbGVtZW50IHR5cGUuCitjbGFzcyBRdWV1ZSB7CitwdWJsaWM6CisKKyAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBxdWV1ZS4KKyAgUXVldWUoKSA6IGhlYWRfKE5VTEwpLCBsYXN0XyhOVUxMKSwgc2l6ZV8oMCkge30KKworICAvLyBEJ3Rvci4gIENsZWFycyB0aGUgcXVldWUuCisgIH5RdWV1ZSgpIHsgQ2xlYXIoKTsgfQorCisgIC8vIENsZWFycyB0aGUgcXVldWUuCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgaWYgKHNpemVfID4gMCkgeworICAgICAgLy8gMS4gRGVsZXRlcyBldmVyeSBub2RlLgorICAgICAgUXVldWVOb2RlPEU+KiBub2RlID0gaGVhZF87CisgICAgICBRdWV1ZU5vZGU8RT4qIG5leHQgPSBub2RlLT5uZXh0KCk7CisgICAgICBmb3IgKDsgOykgeworICAgICAgICBkZWxldGUgbm9kZTsKKyAgICAgICAgbm9kZSA9IG5leHQ7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpIGJyZWFrOworICAgICAgICBuZXh0ID0gbm9kZS0+bmV4dCgpOworICAgICAgfQorCisgICAgICAvLyAyLiBSZXNldHMgdGhlIG1lbWJlciB2YXJpYWJsZXMuCisgICAgICBoZWFkXyA9IGxhc3RfID0gTlVMTDsKKyAgICAgIHNpemVfID0gMDsKKyAgICB9CisgIH0KKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgIHNpemVfdCBTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworICAvLyBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIFF1ZXVlTm9kZTxFPiogSGVhZCgpIHsgcmV0dXJuIGhlYWRfOyB9CisgIGNvbnN0IFF1ZXVlTm9kZTxFPiogSGVhZCgpIGNvbnN0IHsgcmV0dXJuIGhlYWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIFF1ZXVlTm9kZTxFPiogTGFzdCgpIHsgcmV0dXJuIGxhc3RfOyB9CisgIGNvbnN0IFF1ZXVlTm9kZTxFPiogTGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfOyB9CisKKyAgLy8gQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLiAgQSBjb3B5IG9mIHRoZSBlbGVtZW50IGlzCisgIC8vIGNyZWF0ZWQgdXNpbmcgdGhlIGNvcHkgY29uc3RydWN0b3IsIGFuZCB0aGVuIHN0b3JlZCBpbiB0aGUgcXVldWUuCisgIC8vIENoYW5nZXMgbWFkZSB0byB0aGUgZWxlbWVudCBpbiB0aGUgcXVldWUgZG9lc24ndCBhZmZlY3QgdGhlIHNvdXJjZQorICAvLyBvYmplY3QsIGFuZCB2aWNlIHZlcnNhLgorICB2b2lkIEVucXVldWUoY29uc3QgRSYgZWxlbWVudCkgeworICAgIFF1ZXVlTm9kZTxFPiogbmV3X25vZGUgPSBuZXcgUXVldWVOb2RlPEU+KGVsZW1lbnQpOworCisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIGhlYWRfID0gbGFzdF8gPSBuZXdfbm9kZTsKKyAgICAgIHNpemVfID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdF8tPm5leHRfID0gbmV3X25vZGU7CisgICAgICBsYXN0XyA9IG5ld19ub2RlOworICAgICAgc2l6ZV8rKzsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmVzIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBpdC4gIFJldHVybnMgTlVMTCBpZgorICAvLyB0aGUgcXVldWUgaXMgZW1wdHkuCisgIEUqIERlcXVldWUoKSB7CisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IFF1ZXVlTm9kZTxFPiogY29uc3Qgb2xkX2hlYWQgPSBoZWFkXzsKKyAgICBoZWFkXyA9IGhlYWRfLT5uZXh0XzsKKyAgICBzaXplXy0tOworICAgIGlmIChzaXplXyA9PSAwKSB7CisgICAgICBsYXN0XyA9IE5VTEw7CisgICAgfQorCisgICAgRSogZWxlbWVudCA9IG5ldyBFKG9sZF9oZWFkLT5lbGVtZW50KCkpOworICAgIGRlbGV0ZSBvbGRfaGVhZDsKKworICAgIHJldHVybiBlbGVtZW50OworICB9CisKKyAgLy8gQXBwbGllcyBhIGZ1bmN0aW9uL2Z1bmN0b3Igb24gZWFjaCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgYW5kCisgIC8vIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIG5ldyBxdWV1ZS4gIFRoZSBvcmlnaW5hbCBxdWV1ZSBpcyBub3QKKyAgLy8gYWZmZWN0ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBRdWV1ZSogTWFwKEYgZnVuY3Rpb24pIGNvbnN0IHsKKyAgICBRdWV1ZSogbmV3X3F1ZXVlID0gbmV3IFF1ZXVlKCk7CisgICAgZm9yIChjb25zdCBRdWV1ZU5vZGU8RT4qIG5vZGUgPSBoZWFkXzsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dF8pIHsKKyAgICAgIG5ld19xdWV1ZS0+RW5xdWV1ZShmdW5jdGlvbihub2RlLT5lbGVtZW50KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3X3F1ZXVlOworICB9CisKKyBwcml2YXRlOgorICBRdWV1ZU5vZGU8RT4qIGhlYWRfOyAgLy8gVGhlIGZpcnN0IG5vZGUgb2YgdGhlIHF1ZXVlLgorICBRdWV1ZU5vZGU8RT4qIGxhc3RfOyAgLy8gVGhlIGxhc3Qgbm9kZSBvZiB0aGUgcXVldWUuCisgIHNpemVfdCBzaXplXzsgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLgorCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgYSBxdWV1ZS4KKyAgUXVldWUoY29uc3QgUXVldWUmKTsKKyAgY29uc3QgUXVldWUmIG9wZXJhdG9yID0gKGNvbnN0IFF1ZXVlJik7CisgfTsKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1NBTVBMRTNfSU5MX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM4NzdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYwpAQCAtMCwwICsxLDE1MSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworLy8gSW4gdGhpcyBleGFtcGxlLCB3ZSB1c2UgYSBtb3JlIGFkdmFuY2VkIGZlYXR1cmUgb2YgR29vZ2xlIFRlc3QgY2FsbGVkCisvLyB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSB0ZXN0IGZpeHR1cmUgaXMgYSBwbGFjZSB0byBob2xkIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBzaGFyZWQgYnkKKy8vIGFsbCB0ZXN0cyBpbiBhIHRlc3QgY2FzZS4gIFVzaW5nIGEgdGVzdCBmaXh0dXJlIGF2b2lkcyBkdXBsaWNhdGluZworLy8gdGhlIHRlc3QgY29kZSBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCB0aG9zZSBjb21tb24KKy8vIG9iamVjdHMgZm9yIGVhY2ggdGVzdC4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBkZWZpbmluZyBzdWItcm91dGluZXMKKy8vIHRoYXQgeW91ciB0ZXN0cyBuZWVkIHRvIGludm9rZSBhIGxvdC4KKy8vCisvLyA8VGVjaG5pY2FsRGV0YWlscz4KKy8vCisvLyBUaGUgdGVzdHMgc2hhcmUgdGhlIHRlc3QgZml4dHVyZSBpbiB0aGUgc2Vuc2Ugb2YgY29kZSBzaGFyaW5nLCBub3QKKy8vIGRhdGEgc2hhcmluZy4gIEVhY2ggdGVzdCBpcyBnaXZlbiBpdHMgb3duIGZyZXNoIGNvcHkgb2YgdGhlCisvLyBmaXh0dXJlLiAgWW91IGNhbm5vdCBleHBlY3QgdGhlIGRhdGEgbW9kaWZpZWQgYnkgb25lIHRlc3QgdG8gYmUKKy8vIHBhc3NlZCBvbiB0byBhbm90aGVyIHRlc3QsIHdoaWNoIGlzIGEgYmFkIGlkZWEuCisvLworLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyBkZXNpZ24gaXMgdGhhdCB0ZXN0cyBzaG91bGQgYmUgaW5kZXBlbmRlbnQgYW5kCisvLyByZXBlYXRhYmxlLiAgSW4gcGFydGljdWxhciwgYSB0ZXN0IHNob3VsZCBub3QgZmFpbCBhcyB0aGUgcmVzdWx0IG9mCisvLyBhbm90aGVyIHRlc3QncyBmYWlsdXJlLiAgSWYgb25lIHRlc3QgZGVwZW5kcyBvbiBpbmZvIHByb2R1Y2VkIGJ5CisvLyBhbm90aGVyIHRlc3QsIHRoZW4gdGhlIHR3byB0ZXN0cyBzaG91bGQgcmVhbGx5IGJlIG9uZSBiaWcgdGVzdC4KKy8vCisvLyBUaGUgbWFjcm9zIGZvciBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzL2ZhaWx1cmUgb2YgYSB0ZXN0CisvLyAoRVhQRUNUX1RSVUUsIEZBSUwsIGV0YykgbmVlZCB0byBrbm93IHdoYXQgdGhlIGN1cnJlbnQgdGVzdCBpcworLy8gKHdoZW4gR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSB0ZXN0IHJlc3VsdCwgaXQgdGVsbHMgeW91IHdoaWNoIHRlc3QKKy8vIGVhY2ggZmFpbHVyZSBiZWxvbmdzIHRvKS4gIFRlY2huaWNhbGx5LCB0aGVzZSBtYWNyb3MgaW52b2tlIGEKKy8vIG1lbWJlciBmdW5jdGlvbiBvZiB0aGUgVGVzdCBjbGFzcy4gIFRoZXJlZm9yZSwgeW91IGNhbm5vdCB1c2UgdGhlbQorLy8gaW4gYSBnbG9iYWwgZnVuY3Rpb24uICBUaGF0J3Mgd2h5IHlvdSBzaG91bGQgcHV0IHRlc3Qgc3ViLXJvdXRpbmVzCisvLyBpbiBhIHRlc3QgZml4dHVyZS4KKy8vCisvLyA8L1RlY2huaWNhbERldGFpbHM+CisKKyNpbmNsdWRlICJzYW1wbGUzLWlubC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFRvIHVzZSBhIHRlc3QgZml4dHVyZSwgZGVyaXZlIGEgY2xhc3MgZnJvbSB0ZXN0aW5nOjpUZXN0LgorY2xhc3MgUXVldWVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDogIC8vIFlvdSBzaG91bGQgbWFrZSB0aGUgbWVtYmVycyBwcm90ZWN0ZWQgcy50LiB0aGV5IGNhbiBiZQorICAgICAgICAgICAgIC8vIGFjY2Vzc2VkIGZyb20gc3ViLWNsYXNzZXMuCisKKyAgLy8gdmlydHVhbCB2b2lkIFNldFVwKCkgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCBpcyBydW4uICBZb3UKKyAgLy8gc2hvdWxkIGRlZmluZSBpdCBpZiB5b3UgbmVlZCB0byBpbml0aWFsaXplIHRoZSB2YXJhaWJsZXMuCisgIC8vIE90aGVyd2lzZSwgdGhpcyBjYW4gYmUgc2tpcHBlZC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHExXy5FbnF1ZXVlKDEpOworICAgIHEyXy5FbnF1ZXVlKDIpOworICAgIHEyXy5FbnF1ZXVlKDMpOworICB9CisKKyAgLy8gdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCB0ZXN0IGlzIHJ1bi4KKyAgLy8gWW91IHNob3VsZCBkZWZpbmUgaXQgaWYgdGhlcmUgaXMgY2xlYW51cCB3b3JrIHRvIGRvLiAgT3RoZXJ3aXNlLAorICAvLyB5b3UgZG9uJ3QgaGF2ZSB0byBwcm92aWRlIGl0LgorICAvLworICAvLyB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgIC8vIH0KKworICAvLyBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IHNvbWUgdGVzdCB1c2VzLgorICBzdGF0aWMgaW50IERvdWJsZShpbnQgbikgeworICAgIHJldHVybiAyKm47CisgIH0KKworICAvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgdGVzdGluZyBRdWV1ZTo6TWFwKCkuCisgIHZvaWQgTWFwVGVzdGVyKGNvbnN0IFF1ZXVlPGludD4gKiBxKSB7CisgICAgLy8gQ3JlYXRlcyBhIG5ldyBxdWV1ZSwgd2hlcmUgZWFjaCBlbGVtZW50IGlzIHR3aWNlIGFzIGJpZyBhcyB0aGUKKyAgICAvLyBjb3JyZXNwb25kaW5nIG9uZSBpbiBxLgorICAgIGNvbnN0IFF1ZXVlPGludD4gKiBjb25zdCBuZXdfcSA9IHEtPk1hcChEb3VibGUpOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgbmV3IHF1ZXVlIGhhcyB0aGUgc2FtZSBzaXplIGFzIHEuCisgICAgQVNTRVJUX0VRKHEtPlNpemUoKSwgbmV3X3EtPlNpemUoKSk7CisKKyAgICAvLyBWZXJpZmllcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGVsZW1lbnRzIG9mIHRoZSB0d28gcXVldWVzLgorICAgIGZvciAoIGNvbnN0IFF1ZXVlTm9kZTxpbnQ+ICogbjEgPSBxLT5IZWFkKCksICogbjIgPSBuZXdfcS0+SGVhZCgpOworICAgICAgICAgIG4xICE9IE5VTEw7IG4xID0gbjEtPm5leHQoKSwgbjIgPSBuMi0+bmV4dCgpICkgeworICAgICAgRVhQRUNUX0VRKDIgKiBuMS0+ZWxlbWVudCgpLCBuMi0+ZWxlbWVudCgpKTsKKyAgICB9CisKKyAgICBkZWxldGUgbmV3X3E7CisgIH0KKworICAvLyBEZWNsYXJlcyB0aGUgdmFyaWFibGVzIHlvdXIgdGVzdHMgd2FudCB0byB1c2UuCisgIFF1ZXVlPGludD4gcTBfOworICBRdWV1ZTxpbnQ+IHExXzsKKyAgUXVldWU8aW50PiBxMl87Cit9OworCisvLyBXaGVuIHlvdSBoYXZlIGEgdGVzdCBmaXh0dXJlLCB5b3UgZGVmaW5lIGEgdGVzdCB1c2luZyBURVNUX0YKKy8vIGluc3RlYWQgb2YgVEVTVC4KKworLy8gVGVzdHMgdGhlIGRlZmF1bHQgYyd0b3IuCitURVNUX0YoUXVldWVUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgLy8gWW91IGNhbiBhY2Nlc3MgZGF0YSBpbiB0aGUgdGVzdCBmaXh0dXJlIGhlcmUuCisgIEVYUEVDVF9FUSgwdSwgcTBfLlNpemUoKSk7Cit9CisKKy8vIFRlc3RzIERlcXVldWUoKS4KK1RFU1RfRihRdWV1ZVRlc3QsIERlcXVldWUpIHsKKyAgaW50ICogbiA9IHEwXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9UUlVFKG4gPT0gTlVMTCk7CisKKyAgbiA9IHExXy5EZXF1ZXVlKCk7CisgIEFTU0VSVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgxLCAqbik7CisgIEVYUEVDVF9FUSgwdSwgcTFfLlNpemUoKSk7CisgIGRlbGV0ZSBuOworCisgIG4gPSBxMl8uRGVxdWV1ZSgpOworICBBU1NFUlRfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMiwgKm4pOworICBFWFBFQ1RfRVEoMXUsIHEyXy5TaXplKCkpOworICBkZWxldGUgbjsKK30KKworLy8gVGVzdHMgdGhlIFF1ZXVlOjpNYXAoKSBmdW5jdGlvbi4KK1RFU1RfRihRdWV1ZVRlc3QsIE1hcCkgeworICBNYXBUZXN0ZXIoJnEwXyk7CisgIE1hcFRlc3RlcigmcTFfKTsKKyAgTWFwVGVzdGVyKCZxMl8pOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlNC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NGJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTQuY2MKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAic2FtcGxlNC5oIgorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUsIGFuZCBpbmNyZW1lbnRzIGl0LgoraW50IENvdW50ZXI6OkluY3JlbWVudCgpIHsKKyAgcmV0dXJuIGNvdW50ZXJfKys7Cit9CisKKy8vIFByaW50cyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlIHRvIFNURE9VVC4KK3ZvaWQgQ291bnRlcjo6UHJpbnQoKSBjb25zdCB7CisgIHByaW50ZigiJWQiLCBjb3VudGVyXyk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU0LmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MGYwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTQuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTRfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEU0X0hfCisKKy8vIEEgc2ltcGxlIG1vbm90b25pYyBjb3VudGVyLgorY2xhc3MgQ291bnRlciB7CisgcHJpdmF0ZToKKyAgaW50IGNvdW50ZXJfOworCisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgY291bnRlciB0aGF0IHN0YXJ0cyBhdCAwLgorICBDb3VudGVyKCkgOiBjb3VudGVyXygwKSB7fQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSwgYW5kIGluY3JlbWVudHMgaXQuCisgIGludCBJbmNyZW1lbnQoKTsKKworICAvLyBQcmludHMgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSB0byBTVERPVVQuCisgIHZvaWQgUHJpbnQoKSBjb25zdDsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfU0FNUExFU19TQU1QTEU0X0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVhZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJzYW1wbGU0LmgiCisKKy8vIFRlc3RzIHRoZSBJbmNyZW1lbnQoKSBtZXRob2QuCitURVNUKENvdW50ZXIsIEluY3JlbWVudCkgeworICBDb3VudGVyIGM7CisKKyAgLy8gRVhQRUNUX0VRKCkgZXZhbHVhdGVzIGl0cyBhcmd1bWVudHMgZXhhY3RseSBvbmNlLCBzbyB0aGV5CisgIC8vIGNhbiBoYXZlIHNpZGUgZWZmZWN0cy4KKworICBFWFBFQ1RfRVEoMCwgYy5JbmNyZW1lbnQoKSk7CisgIEVYUEVDVF9FUSgxLCBjLkluY3JlbWVudCgpKTsKKyAgRVhQRUNUX0VRKDIsIGMuSW5jcmVtZW50KCkpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTVfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjYWIwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTVfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxOTkgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRoaXMgc2FtcGxlIHRlYWNoZXMgaG93IHRvIHJldXNlIGEgdGVzdCBmaXh0dXJlIGluIG11bHRpcGxlIHRlc3QKKy8vIGNhc2VzIGJ5IGRlcml2aW5nIHN1Yi1maXh0dXJlcyBmcm9tIGl0LgorLy8KKy8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgZml4dHVyZSwgeW91IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHRlc3QKKy8vIGNhc2UgdGhhdCB3aWxsIHVzZSB0aGlzIGZpeHR1cmUuICBUaGVyZWZvcmUsIGEgdGVzdCBmaXh0dXJlIGNhbgorLy8gYmUgdXNlZCBieSBvbmx5IG9uZSB0ZXN0IGNhc2UuCisvLworLy8gU29tZXRpbWVzLCBtb3JlIHRoYW4gb25lIHRlc3QgY2FzZXMgbWF5IHdhbnQgdG8gdXNlIHRoZSBzYW1lIG9yCisvLyBzbGlnaHRseSBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlcy4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQgdG8KKy8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0ZXN0cyBmb3IgYSBHVUkgbGlicmFyeSBkb24ndCBsZWFrIGltcG9ydGFudAorLy8gc3lzdGVtIHJlc291cmNlcyBsaWtlIGZvbnRzIGFuZCBicnVzaGVzLiAgSW4gR29vZ2xlIFRlc3QsIHlvdSBkbworLy8gdGhpcyBieSBwdXR0aW5nIHRoZSBzaGFyZWQgbG9naWMgaW4gYSBzdXBlciAoYXMgaW4gInN1cGVyIGNsYXNzIikKKy8vIHRlc3QgZml4dHVyZSwgYW5kIHRoZW4gaGF2ZSBlYWNoIHRlc3QgY2FzZSB1c2UgYSBmaXh0dXJlIGRlcml2ZWQKKy8vIGZyb20gdGhpcyBzdXBlciBmaXh0dXJlLgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInNhbXBsZTMtaW5sLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJzYW1wbGUxLmgiCisKKy8vIEluIHRoaXMgc2FtcGxlLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IHRlc3QgZmluaXNoZXMgd2l0aGluCisvLyB+NSBzZWNvbmRzLiAgSWYgYSB0ZXN0IHRha2VzIGxvbmdlciB0byBydW4sIHdlIGNvbnNpZGVyIGl0IGEKKy8vIGZhaWx1cmUuCisvLworLy8gV2UgcHV0IHRoZSBjb2RlIGZvciB0aW1pbmcgYSB0ZXN0IGluIGEgdGVzdCBmaXh0dXJlIGNhbGxlZAorLy8gIlF1aWNrVGVzdCIuICBRdWlja1Rlc3QgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIHN1cGVyIGZpeHR1cmUgdGhhdAorLy8gb3RoZXIgZml4dHVyZXMgZGVyaXZlIGZyb20sIHRoZXJlZm9yZSB0aGVyZSBpcyBubyB0ZXN0IGNhc2Ugd2l0aAorLy8gdGhlIG5hbWUgIlF1aWNrVGVzdCIuICBUaGlzIGlzIE9LLgorLy8KKy8vIExhdGVyLCB3ZSB3aWxsIGRlcml2ZSBtdWx0aXBsZSB0ZXN0IGZpeHR1cmVzIGZyb20gUXVpY2tUZXN0LgorY2xhc3MgUXVpY2tUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gUmVtZW1iZXIgdGhhdCBTZXRVcCgpIGlzIHJ1biBpbW1lZGlhdGVseSBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KKyAgLy8gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gcmVjb3JkIHRoZSBzdGFydCB0aW1lLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc3RhcnRfdGltZV8gPSB0aW1lKE5VTEwpOworICB9CisKKyAgLy8gVGVhckRvd24oKSBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIGEgdGVzdCBmaW5pc2hlcy4gIEhlcmUgd2UKKyAgLy8gY2hlY2sgaWYgdGhlIHRlc3Qgd2FzIHRvbyBzbG93LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gR2V0cyB0aGUgdGltZSB3aGVuIHRoZSB0ZXN0IGZpbmlzaGVzCisgICAgY29uc3QgdGltZV90IGVuZF90aW1lID0gdGltZShOVUxMKTsKKworICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgdGVzdCB0b29rIG5vIG1vcmUgdGhhbiB+NSBzZWNvbmRzLiAgRGlkIHlvdQorICAgIC8vIGtub3cgdGhhdCB5b3UgY2FuIHVzZSBhc3NlcnRpb25zIGluIFNldFVwKCkgYW5kIFRlYXJEb3duKCkgYXMKKyAgICAvLyB3ZWxsPworICAgIEVYUEVDVF9UUlVFKGVuZF90aW1lIC0gc3RhcnRfdGltZV8gPD0gNSkgPDwgIlRoZSB0ZXN0IHRvb2sgdG9vIGxvbmcuIjsKKyAgfQorCisgIC8vIFRoZSBVVEMgdGltZSAoaW4gc2Vjb25kcykgd2hlbiB0aGUgdGVzdCBzdGFydHMKKyAgdGltZV90IHN0YXJ0X3RpbWVfOworfTsKKworCisvLyBXZSBkZXJpdmUgYSBmaXh0dXJlIG5hbWVkIEludGVnZXJGdW5jdGlvblRlc3QgZnJvbSB0aGUgUXVpY2tUZXN0CisvLyBmaXh0dXJlLiAgQWxsIHRlc3RzIHVzaW5nIHRoaXMgZml4dHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKy8vIHJlcXVpcmVkIHRvIGJlIHF1aWNrLgorY2xhc3MgSW50ZWdlckZ1bmN0aW9uVGVzdCA6IHB1YmxpYyBRdWlja1Rlc3QgeworICAvLyBXZSBkb24ndCBuZWVkIGFueSBtb3JlIGxvZ2ljIHRoYW4gYWxyZWFkeSBpbiB0aGUgUXVpY2tUZXN0IGZpeHR1cmUuCisgIC8vIFRoZXJlZm9yZSB0aGUgYm9keSBpcyBlbXB0eS4KK307CisKKworLy8gTm93IHdlIGNhbiB3cml0ZSB0ZXN0cyBpbiB0aGUgSW50ZWdlckZ1bmN0aW9uVGVzdCB0ZXN0IGNhc2UuCisKKy8vIFRlc3RzIEZhY3RvcmlhbCgpCitURVNUX0YoSW50ZWdlckZ1bmN0aW9uVGVzdCwgRmFjdG9yaWFsKSB7CisgIC8vIFRlc3RzIGZhY3RvcmlhbCBvZiBuZWdhdGl2ZSBudW1iZXJzLgorICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC01KSk7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTEpKTsKKyAgRVhQRUNUX1RSVUUoRmFjdG9yaWFsKC0xMCkgPiAwKTsKKworICAvLyBUZXN0cyBmYWN0b3JpYWwgb2YgMC4KKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgwKSk7CisKKyAgLy8gVGVzdHMgZmFjdG9yaWFsIG9mIHBvc2l0aXZlIG51bWJlcnMuCisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMSkpOworICBFWFBFQ1RfRVEoMiwgRmFjdG9yaWFsKDIpKTsKKyAgRVhQRUNUX0VRKDYsIEZhY3RvcmlhbCgzKSk7CisgIEVYUEVDVF9FUSg0MDMyMCwgRmFjdG9yaWFsKDgpKTsKK30KKworCisvLyBUZXN0cyBJc1ByaW1lKCkKK1RFU1RfRihJbnRlZ2VyRnVuY3Rpb25UZXN0LCBJc1ByaW1lKSB7CisgIC8vIFRlc3RzIG5lZ2F0aXZlIGlucHV0LgorICBFWFBFQ1RfVFJVRSghSXNQcmltZSgtMSkpOworICBFWFBFQ1RfVFJVRSghSXNQcmltZSgtMikpOworICBFWFBFQ1RfVFJVRSghSXNQcmltZShJTlRfTUlOKSk7CisKKyAgLy8gVGVzdHMgc29tZSB0cml2aWFsIGNhc2VzLgorICBFWFBFQ1RfVFJVRSghSXNQcmltZSgwKSk7CisgIEVYUEVDVF9UUlVFKCFJc1ByaW1lKDEpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgyKSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMykpOworCisgIC8vIFRlc3RzIHBvc2l0aXZlIGlucHV0LgorICBFWFBFQ1RfVFJVRSghSXNQcmltZSg0KSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSghSXNQcmltZSg2KSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMjMpKTsKK30KKworCisvLyBUaGUgbmV4dCB0ZXN0IGNhc2UgKG5hbWVkICJRdWV1ZVRlc3QiKSBhbHNvIG5lZWRzIHRvIGJlIHF1aWNrLCBzbworLy8gd2UgZGVyaXZlIGFub3RoZXIgZml4dHVyZSBmcm9tIFF1aWNrVGVzdC4KKy8vCisvLyBUaGUgUXVldWVUZXN0IHRlc3QgZml4dHVyZSBoYXMgc29tZSBsb2dpYyBhbmQgc2hhcmVkIG9iamVjdHMgaW4KKy8vIGFkZGl0aW9uIHRvIHdoYXQncyBpbiBRdWlja1Rlc3QgYWxyZWFkeS4gIFdlIGRlZmluZSB0aGUgYWRkaXRpb25hbAorLy8gc3R1ZmYgaW5zaWRlIHRoZSBib2R5IG9mIHRoZSB0ZXN0IGZpeHR1cmUsIGFzIHVzdWFsLgorY2xhc3MgUXVldWVUZXN0IDogcHVibGljIFF1aWNrVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBzdXBlciBmaXh0dXJlIChRdWlja1Rlc3QpLgorICAgIFF1aWNrVGVzdDo6U2V0VXAoKTsKKworICAgIC8vIFNlY29uZCwgc29tZSBhZGRpdGlvbmFsIHNldHVwIGZvciB0aGlzIGZpeHR1cmUuCisgICAgcTFfLkVucXVldWUoMSk7CisgICAgcTJfLkVucXVldWUoMik7CisgICAgcTJfLkVucXVldWUoMyk7CisgIH0KKworICAvLyBCeSBkZWZhdWx0LCBUZWFyRG93bigpIGluaGVyaXRzIHRoZSBiZWhhdmlvciBvZgorICAvLyBRdWlja1Rlc3Q6OlRlYXJEb3duKCkuICBBcyB3ZSBoYXZlIG5vIGFkZGl0aW9uYWwgY2xlYW5pbmcgd29yaworICAvLyBmb3IgUXVldWVUZXN0LCB3ZSBvbWl0IGl0IGhlcmUuCisgIC8vCisgIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgLy8gICBRdWlja1Rlc3Q6OlRlYXJEb3duKCk7CisgIC8vIH0KKworICBRdWV1ZTxpbnQ+IHEwXzsKKyAgUXVldWU8aW50PiBxMV87CisgIFF1ZXVlPGludD4gcTJfOworfTsKKworCisvLyBOb3csIGxldCdzIHdyaXRlIHRlc3RzIHVzaW5nIHRoZSBRdWV1ZVRlc3QgZml4dHVyZS4KKworLy8gVGVzdHMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCitURVNUX0YoUXVldWVUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgRVhQRUNUX0VRKDB1LCBxMF8uU2l6ZSgpKTsKK30KKworLy8gVGVzdHMgRGVxdWV1ZSgpLgorVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZSkgeworICBpbnQqIG4gPSBxMF8uRGVxdWV1ZSgpOworICBFWFBFQ1RfVFJVRShuID09IE5VTEwpOworCisgIG4gPSBxMV8uRGVxdWV1ZSgpOworICBFWFBFQ1RfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMSwgKm4pOworICBFWFBFQ1RfRVEoMHUsIHExXy5TaXplKCkpOworICBkZWxldGUgbjsKKworICBuID0gcTJfLkRlcXVldWUoKTsKKyAgRVhQRUNUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDIsICpuKTsKKyAgRVhQRUNUX0VRKDF1LCBxMl8uU2l6ZSgpKTsKKyAgZGVsZXRlIG47Cit9CisKKy8vIElmIG5lY2Vzc2FyeSwgeW91IGNhbiBkZXJpdmUgZnVydGhlciB0ZXN0IGZpeHR1cmVzIGZyb20gYSBkZXJpdmVkCisvLyBmaXh0dXJlIGl0c2VsZi4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRlcml2ZSBhbm90aGVyIGZpeHR1cmUgZnJvbQorLy8gUXVldWVUZXN0LiAgR29vZ2xlIFRlc3QgaW1wb3NlcyBubyBsaW1pdCBvbiBob3cgZGVlcCB0aGUgaGllcmFyY2h5CisvLyBjYW4gYmUuICBJbiBwcmFjdGljZSwgaG93ZXZlciwgeW91IHByb2JhYmx5IGRvbid0IHdhbnQgaXQgdG8gYmUgdG9vCisvLyBkZWVwIGFzIHRvIGJlIGNvbmZ1c2luZy4KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjAzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMjI0IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB0ZXN0IGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlCisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNhbWUgaW50ZXJmYWNlIChha2EgaW50ZXJmYWNlIHRlc3RzKS4KKworLy8gVGhlIGludGVyZmFjZSBhbmQgaXRzIGltcGxlbWVudGF0aW9ucyBhcmUgaW4gdGhpcyBoZWFkZXIuCisjaW5jbHVkZSAicHJpbWVfdGFibGVzLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBGaXJzdCwgd2UgZGVmaW5lIHNvbWUgZmFjdG9yeSBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZgorLy8gdGhlIGltcGxlbWVudGF0aW9ucy4gIFlvdSBtYXkgYmUgYWJsZSB0byBza2lwIHRoaXMgc3RlcCBpZiBhbGwgeW91cgorLy8gaW1wbGVtZW50YXRpb25zIGNhbiBiZSBjb25zdHJ1Y3RlZCB0aGUgc2FtZSB3YXkuCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUHJpbWVUYWJsZSogQ3JlYXRlUHJpbWVUYWJsZSgpOworCit0ZW1wbGF0ZSA8PgorUHJpbWVUYWJsZSogQ3JlYXRlUHJpbWVUYWJsZTxPblRoZUZseVByaW1lVGFibGU+KCkgeworICByZXR1cm4gbmV3IE9uVGhlRmx5UHJpbWVUYWJsZTsKK30KKwordGVtcGxhdGUgPD4KK1ByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGU8UHJlQ2FsY3VsYXRlZFByaW1lVGFibGU+KCkgeworICByZXR1cm4gbmV3IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKDEwMDAwKTsKK30KKworLy8gVGhlbiB3ZSBkZWZpbmUgYSB0ZXN0IGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIFByaW1lVGFibGVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGhlIGN0b3IgY2FsbHMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcHJpbWUgdGFibGUKKyAgLy8gaW1wbGVtZW50ZWQgYnkgVC4KKyAgUHJpbWVUYWJsZVRlc3QoKSA6IHRhYmxlXyhDcmVhdGVQcmltZVRhYmxlPFQ+KCkpIHt9CisKKyAgdmlydHVhbCB+UHJpbWVUYWJsZVRlc3QoKSB7IGRlbGV0ZSB0YWJsZV87IH0KKworICAvLyBOb3RlIHRoYXQgd2UgdGVzdCBhbiBpbXBsZW1lbnRhdGlvbiB2aWEgdGhlIGJhc2UgaW50ZXJmYWNlCisgIC8vIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIFRoaXMgaXMgaW1wb3J0YW50CisgIC8vIGZvciBrZWVwaW5nIHRoZSB0ZXN0cyBjbG9zZSB0byB0aGUgcmVhbCB3b3JsZCBzY2VuYXJpbywgd2hlcmUgdGhlCisgIC8vIGltcGxlbWVudGF0aW9uIGlzIGludm9rZWQgdmlhIHRoZSBiYXNlIGludGVyZmFjZS4gIEl0IGF2b2lkcworICAvLyBnb3QteWFzIHdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBoYXMgYSBtZXRob2QgdGhhdCBzaGFkb3dzCisgIC8vIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSAoYnV0IHNsaWdodGx5IGRpZmZlcmVudCBhcmd1bWVudAorICAvLyB0eXBlcykgaW4gdGhlIGJhc2UgaW50ZXJmYWNlLCBmb3IgZXhhbXBsZS4KKyAgUHJpbWVUYWJsZSogY29uc3QgdGFibGVfOworfTsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOworCisvLyBHb29nbGUgVGVzdCBvZmZlcnMgdHdvIHdheXMgZm9yIHJldXNpbmcgdGVzdHMgZm9yIGRpZmZlcmVudCB0eXBlcy4KKy8vIFRoZSBmaXJzdCBpcyBjYWxsZWQgInR5cGVkIHRlc3RzIi4gIFlvdSBzaG91bGQgdXNlIGl0IGlmIHlvdQorLy8gYWxyZWFkeSBrbm93ICphbGwqIHRoZSB0eXBlcyB5b3UgYXJlIGdvbm5hIGV4ZXJjaXNlIHdoZW4geW91IHdyaXRlCisvLyB0aGUgdGVzdHMuCisKKy8vIFRvIHdyaXRlIGEgdHlwZWQgdGVzdCBjYXNlLCBmaXJzdCB1c2UKKy8vCisvLyAgIFRZUEVEX1RFU1RfQ0FTRShUZXN0Q2FzZU5hbWUsIFR5cGVMaXN0KTsKKy8vCisvLyB0byBkZWNsYXJlIGl0IGFuZCBzcGVjaWZ5IHRoZSB0eXBlIHBhcmFtZXRlcnMuICBBcyB3aXRoIFRFU1RfRiwKKy8vIFRlc3RDYXNlTmFtZSBtdXN0IG1hdGNoIHRoZSB0ZXN0IGZpeHR1cmUgbmFtZS4KKworLy8gVGhlIGxpc3Qgb2YgdHlwZXMgd2Ugd2FudCB0byB0ZXN0LgordHlwZWRlZiBUeXBlczxPblRoZUZseVByaW1lVGFibGUsIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlPiBJbXBsZW1lbnRhdGlvbnM7CisKK1RZUEVEX1RFU1RfQ0FTRShQcmltZVRhYmxlVGVzdCwgSW1wbGVtZW50YXRpb25zKTsKKworLy8gVGhlbiB1c2UgVFlQRURfVEVTVChUZXN0Q2FzZU5hbWUsIFRlc3ROYW1lKSB0byBkZWZpbmUgYSB0eXBlZCB0ZXN0LAorLy8gc2ltaWxhciB0byBURVNUX0YuCitUWVBFRF9URVNUKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zRmFsc2VGb3JOb25QcmltZXMpIHsKKyAgLy8gSW5zaWRlIHRoZSB0ZXN0IGJvZHksIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHR5cGUgcGFyYW1ldGVyIGJ5CisgIC8vIFR5cGVQYXJhbSwgYW5kIHJlZmVyIHRvIHRoZSBmaXh0dXJlIGNsYXNzIGJ5IFRlc3RGaXh0dXJlLiAgV2UKKyAgLy8gZG9uJ3QgbmVlZCB0aGVtIGluIHRoaXMgZXhhbXBsZS4KKworICAvLyBTaW5jZSB3ZSBhcmUgaW4gdGhlIHRlbXBsYXRlIHdvcmxkLCBDKysgcmVxdWlyZXMgZXhwbGljaXRseQorICAvLyB3cml0aW5nICd0aGlzLT4nIHdoZW4gcmVmZXJyaW5nIHRvIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MuCisgIC8vIFRoaXMgaXMgc29tZXRoaW5nIHlvdSBoYXZlIHRvIGxlYXJuIHRvIGxpdmUgd2l0aC4KKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgtNSkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNCkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMDApKTsKK30KKworVFlQRURfVEVTVChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc1RydWVGb3JQcmltZXMpIHsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDMpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDUpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDcpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDExKSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMzEpKTsKK30KKworVFlQRURfVEVTVChQcmltZVRhYmxlVGVzdCwgQ2FuR2V0TmV4dFByaW1lKSB7CisgIEVYUEVDVF9FUSgyLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgwKSk7CisgIEVYUEVDVF9FUSgzLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgyKSk7CisgIEVYUEVDVF9FUSg1LCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgzKSk7CisgIEVYUEVDVF9FUSg3LCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSg1KSk7CisgIEVYUEVDVF9FUSgxMSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoNykpOworICBFWFBFQ1RfRVEoMTMxLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgxMjgpKTsKK30KKworLy8gVGhhdCdzIGl0ISAgR29vZ2xlIFRlc3Qgd2lsbCByZXBlYXQgZWFjaCBUWVBFRF9URVNUIGZvciBlYWNoIHR5cGUKKy8vIGluIHRoZSB0eXBlIGxpc3Qgc3BlY2lmaWVkIGluIFRZUEVEX1RFU1RfQ0FTRS4gIFNpdCBiYWNrIGFuZCBiZQorLy8gaGFwcHkgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBkZWZpbmUgdGhlbSBtdWx0aXBsZSB0aW1lcy4KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit1c2luZyB0ZXN0aW5nOjpUeXBlczsKKworLy8gU29tZXRpbWVzLCBob3dldmVyLCB5b3UgZG9uJ3QgeWV0IGtub3cgYWxsIHRoZSB0eXBlcyB0aGF0IHlvdSB3YW50CisvLyB0byB0ZXN0IHdoZW4geW91IHdyaXRlIHRoZSB0ZXN0cy4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHRoZQorLy8gYXV0aG9yIG9mIGFuIGludGVyZmFjZSBhbmQgZXhwZWN0IG90aGVyIHBlb3BsZSB0byBpbXBsZW1lbnQgaXQsIHlvdQorLy8gbWlnaHQgd2FudCB0byB3cml0ZSBhIHNldCBvZiB0ZXN0cyB0byBtYWtlIHN1cmUgZWFjaCBpbXBsZW1lbnRhdGlvbgorLy8gY29uZm9ybXMgdG8gc29tZSBiYXNpYyByZXF1aXJlbWVudHMsIGJ1dCB5b3UgZG9uJ3Qga25vdyB3aGF0CisvLyBpbXBsZW1lbnRhdGlvbnMgd2lsbCBiZSB3cml0dGVuIGluIHRoZSBmdXR1cmUuCisvLworLy8gSG93IGNhbiB5b3Ugd3JpdGUgdGhlIHRlc3RzIHdpdGhvdXQgY29tbWl0dGluZyB0byB0aGUgdHlwZQorLy8gcGFyYW1ldGVycz8gIFRoYXQncyB3aGF0ICJ0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMiIGNhbiBkbyBmb3IgeW91LgorLy8gSXQgaXMgYSBiaXQgbW9yZSBpbnZvbHZlZCB0aGFuIHR5cGVkIHRlc3RzLCBidXQgaW4gcmV0dXJuIHlvdSBnZXQgYQorLy8gdGVzdCBwYXR0ZXJuIHRoYXQgY2FuIGJlIHJldXNlZCBpbiBtYW55IGNvbnRleHRzLCB3aGljaCBpcyBhIGJpZworLy8gd2luLiAgSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKKy8vIEZpcnN0LCBkZWZpbmUgYSB0ZXN0IGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBIZXJlIHdlIGp1c3QgcmV1c2UKKy8vIHRoZSBQcmltZVRhYmxlVGVzdCBmaXh0dXJlIGRlZmluZWQgZWFybGllcjoKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBQcmltZVRhYmxlVGVzdDIgOiBwdWJsaWMgUHJpbWVUYWJsZVRlc3Q8VD4geworfTsKKworLy8gVGhlbiwgZGVjbGFyZSB0aGUgdGVzdCBjYXNlLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0CisvLyBmaXh0dXJlLCBhbmQgYWxzbyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlIChhcyB1c3VhbCkuICBUaGUgX1AKKy8vIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yICJwYXR0ZXJuIi4KK1RZUEVEX1RFU1RfQ0FTRV9QKFByaW1lVGFibGVUZXN0Mik7CisKKy8vIE5leHQsIHVzZSBUWVBFRF9URVNUX1AoVGVzdENhc2VOYW1lLCBUZXN0TmFtZSkgdG8gZGVmaW5lIGEgdGVzdCwKKy8vIHNpbWlsYXIgdG8gd2hhdCB5b3UgZG8gd2l0aCBURVNUX0YuCitUWVBFRF9URVNUX1AoUHJpbWVUYWJsZVRlc3QyLCBSZXR1cm5zRmFsc2VGb3JOb25QcmltZXMpIHsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgtNSkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNCkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMDApKTsKK30KKworVFlQRURfVEVTVF9QKFByaW1lVGFibGVUZXN0MiwgUmV0dXJuc1RydWVGb3JQcmltZXMpIHsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDMpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDUpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDcpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDExKSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMzEpKTsKK30KKworVFlQRURfVEVTVF9QKFByaW1lVGFibGVUZXN0MiwgQ2FuR2V0TmV4dFByaW1lKSB7CisgIEVYUEVDVF9FUSgyLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgwKSk7CisgIEVYUEVDVF9FUSgzLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgyKSk7CisgIEVYUEVDVF9FUSg1LCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgzKSk7CisgIEVYUEVDVF9FUSg3LCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSg1KSk7CisgIEVYUEVDVF9FUSgxMSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoNykpOworICBFWFBFQ1RfRVEoMTMxLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSgxMjgpKTsKK30KKworLy8gVHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGludm9sdmUgb25lIGV4dHJhIHN0ZXA6IHlvdSBoYXZlIHRvCisvLyBlbnVtZXJhdGUgdGhlIHRlc3RzIHlvdSBkZWZpbmVkOgorUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoCisgICAgUHJpbWVUYWJsZVRlc3QyLCAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0ZXN0IGNhc2UgbmFtZS4KKyAgICAvLyBUaGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzIGFyZSB0aGUgdGVzdCBuYW1lcy4KKyAgICBSZXR1cm5zRmFsc2VGb3JOb25QcmltZXMsIFJldHVybnNUcnVlRm9yUHJpbWVzLCBDYW5HZXROZXh0UHJpbWUpOworCisvLyBBdCB0aGlzIHBvaW50IHRoZSB0ZXN0IHBhdHRlcm4gaXMgZG9uZS4gIEhvd2V2ZXIsIHlvdSBkb24ndCBoYXZlCisvLyBhbnkgcmVhbCB0ZXN0IHlldCBhcyB5b3UgaGF2ZW4ndCBzYWlkIHdoaWNoIHR5cGVzIHlvdSB3YW50IHRvIHJ1bgorLy8gdGhlIHRlc3RzIHdpdGguCisKKy8vIFRvIHR1cm4gdGhlIGFic3RyYWN0IHRlc3QgcGF0dGVybiBpbnRvIHJlYWwgdGVzdHMsIHlvdSBpbnN0YW50aWF0ZQorLy8gaXQgd2l0aCBhIGxpc3Qgb2YgdHlwZXMuICBVc3VhbGx5IHRoZSB0ZXN0IHBhdHRlcm4gd2lsbCBiZSBkZWZpbmVkCisvLyBpbiBhIC5oIGZpbGUsIGFuZCBhbnlvbmUgY2FuICNpbmNsdWRlIGFuZCBpbnN0YW50aWF0ZSBpdC4gIFlvdSBjYW4KKy8vIGV2ZW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgcHJvZ3JhbS4gIFRvIHRlbGwKKy8vIGRpZmZlcmVudCBpbnN0YW5jZXMgYXBhcnQsIHlvdSBnaXZlIGVhY2ggb2YgdGhlbSBhIG5hbWUsIHdoaWNoIHdpbGwKKy8vIGJlY29tZSBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgY2FuIGJlIHVzZWQgaW4gdGVzdCBmaWx0ZXJzLgorCisvLyBUaGUgbGlzdCBvZiB0eXBlcyB3ZSB3YW50IHRvIHRlc3QuICBOb3RlIHRoYXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlCisvLyBkZWZpbmVkIGF0IHRoZSB0aW1lIHdlIHdyaXRlIHRoZSBUWVBFRF9URVNUX1AoKXMuCit0eXBlZGVmIFR5cGVzPE9uVGhlRmx5UHJpbWVUYWJsZSwgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGU+CisgICAgUHJpbWVUYWJsZUltcGxlbWVudGF0aW9uczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE9uVGhlRmx5QW5kUHJlQ2FsY3VsYXRlZCwgICAgLy8gSW5zdGFuY2UgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWVUYWJsZVRlc3QyLCAgICAgICAgICAgICAvLyBUZXN0IGNhc2UgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWVUYWJsZUltcGxlbWVudGF0aW9ucyk7ICAvLyBUeXBlIGxpc3QKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY1MWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzMCBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdGVzdCBjb21tb24gcHJvcGVydGllcyBvZiBtdWx0aXBsZQorLy8gaW1wbGVtZW50YXRpb25zIG9mIGFuIGludGVyZmFjZSAoYWthIGludGVyZmFjZSB0ZXN0cykgdXNpbmcKKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuIEVhY2ggdGVzdCBpbiB0aGUgdGVzdCBjYXNlIGhhcworLy8gYSBwYXJhbWV0ZXIgdGhhdCBpcyBhbiBpbnRlcmZhY2UgcG9pbnRlciB0byBhbiBpbXBsZW1lbnRhdGlvbgorLy8gdGVzdGVkLgorCisvLyBUaGUgaW50ZXJmYWNlIGFuZCBpdHMgaW1wbGVtZW50YXRpb25zIGFyZSBpbiB0aGlzIGhlYWRlci4KKyNpbmNsdWRlICJwcmltZV90YWJsZXMuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlczsKKworLy8gQXMgYSBnZW5lcmFsIHJ1bGUsIHRvIHByZXZlbnQgYSB0ZXN0IGZyb20gYWZmZWN0aW5nIHRoZSB0ZXN0cyB0aGF0IGNvbWUKKy8vIGFmdGVyIGl0LCB5b3Ugc2hvdWxkIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGUgdGVzdGVkIG9iamVjdHMgZm9yIGVhY2ggdGVzdAorLy8gaW5zdGVhZCBvZiByZXVzaW5nIHRoZW0uICBJbiB0aGlzIHNhbXBsZSB3ZSB3aWxsIGRlZmluZSBhIHNpbXBsZSBmYWN0b3J5CisvLyBmdW5jdGlvbiBmb3IgUHJpbWVUYWJsZSBvYmplY3RzLiAgV2Ugd2lsbCBpbnN0YW50aWF0ZSBvYmplY3RzIGluIHRlc3QncworLy8gU2V0VXAoKSBtZXRob2QgYW5kIGRlbGV0ZSB0aGVtIGluIFRlYXJEb3duKCkgbWV0aG9kLgordHlwZWRlZiBQcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlRnVuYygpOworCitQcmltZVRhYmxlKiBDcmVhdGVPblRoZUZseVByaW1lVGFibGUoKSB7CisgIHJldHVybiBuZXcgT25UaGVGbHlQcmltZVRhYmxlKCk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgbWF4X3ByZWNhbGN1bGF0ZWQ+CitQcmltZVRhYmxlKiBDcmVhdGVQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSgpIHsKKyAgcmV0dXJuIG5ldyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZShtYXhfcHJlY2FsY3VsYXRlZCk7Cit9CisKKy8vIEluc2lkZSB0aGUgdGVzdCBib2R5LCBmaXh0dXJlIGNvbnN0cnVjdG9yLCBTZXRVcCgpLCBhbmQgVGVhckRvd24oKSB5b3UKKy8vIGNhbiByZWZlciB0byB0aGUgdGVzdCBwYXJhbWV0ZXIgYnkgR2V0UGFyYW0oKS4gIEluIHRoaXMgY2FzZSwgdGhlIHRlc3QKKy8vIHBhcmFtZXRlciBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggd2UgY2FsbCBpbiBmaXh0dXJlJ3MgU2V0VXAoKSB0bworLy8gY3JlYXRlIGFuZCBzdG9yZSBhbiBpbnN0YW5jZSBvZiBQcmltZVRhYmxlLgorY2xhc3MgUHJpbWVUYWJsZVRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxDcmVhdGVQcmltZVRhYmxlRnVuYyo+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflByaW1lVGFibGVUZXN0KCkgeyBkZWxldGUgdGFibGVfOyB9CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgdGFibGVfID0gKCpHZXRQYXJhbSgpKSgpOyB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBkZWxldGUgdGFibGVfOworICAgIHRhYmxlXyA9IE5VTEw7CisgIH0KKworIHByb3RlY3RlZDoKKyAgUHJpbWVUYWJsZSogdGFibGVfOworfTsKKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zRmFsc2VGb3JOb25QcmltZXMpIHsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgtNSkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNCkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgxMDApKTsKK30KKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIENhbkdldE5leHRQcmltZSkgeworICBFWFBFQ1RfRVEoMiwgdGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOworICBFWFBFQ1RfRVEoMywgdGFibGVfLT5HZXROZXh0UHJpbWUoMikpOworICBFWFBFQ1RfRVEoNSwgdGFibGVfLT5HZXROZXh0UHJpbWUoMykpOworICBFWFBFQ1RfRVEoNywgdGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOworICBFWFBFQ1RfRVEoMTEsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKKyAgRVhQRUNUX0VRKDEzMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Cit9CisKKy8vIEluIG9yZGVyIHRvIHJ1biB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCB5b3UgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGVtLAorLy8gb3IgYmluZCB0aGVtIHRvIGEgbGlzdCBvZiB2YWx1ZXMgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRlc3QgcGFyYW1ldGVycy4KKy8vIFlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbSBpbiBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiBtb2R1bGUsIG9yIGV2ZW4KKy8vIGluc3RhbnRpYXRlIHRoZW0gc2V2ZXJhbCB0aW1lcy4KKy8vCisvLyBIZXJlLCB3ZSBpbnN0YW50aWF0ZSBvdXIgdGVzdHMgd2l0aCBhIGxpc3Qgb2YgdHdvIFByaW1lVGFibGUgb2JqZWN0CisvLyBmYWN0b3J5IGZ1bmN0aW9uczoKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgIE9uVGhlRmx5QW5kUHJlQ2FsY3VsYXRlZCwKKyAgICBQcmltZVRhYmxlVGVzdCwKKyAgICBWYWx1ZXMoJkNyZWF0ZU9uVGhlRmx5UHJpbWVUYWJsZSwgJkNyZWF0ZVByZUNhbGN1bGF0ZWRQcmltZVRhYmxlPDEwMDA+KSk7CisKKyNlbHNlCisKKy8vIEdvb2dsZSBUZXN0IG1heSBub3Qgc3VwcG9ydCB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggc29tZQorLy8gY29tcGlsZXJzLiBJZiB3ZSB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gY29tcGlsZSBvdXQgYWxsCisvLyBjb2RlIHJlZmVycmluZyB0byB0aGUgZ3Rlc3RfbWFpbiBsaWJyYXJ5LCBNU1ZDIGxpbmtlciB3aWxsIG5vdCBsaW5rCisvLyB0aGF0IGxpYnJhcnkgYXQgYWxsIGFuZCBjb25zZXF1ZW50bHkgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBlbnRyeQorLy8gcG9pbnQgZGVmaW5lZCBpbiB0aGF0IGxpYnJhcnkgKGZhdGFsIGVycm9yIExOSzE1NjE6IGVudHJ5IHBvaW50CisvLyBtdXN0IGJlIGRlZmluZWQpLiBUaGlzIGR1bW15IHRlc3Qga2VlcHMgZ3Rlc3RfbWFpbiBsaW5rZWQgaW4uCitURVNUKER1bW15VGVzdCwgVmFsdWVQYXJhbWV0ZXJpemVkVGVzdHNBcmVOb3RTdXBwb3J0ZWRPblRoaXNQbGF0Zm9ybSkge30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVApkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkMmUyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNzMgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHRlc3QgY29kZSByZWx5aW5nIG9uIHNvbWUgZ2xvYmFsIGZsYWcgdmFyaWFibGVzLgorLy8gQ29tYmluZSgpIGhlbHBzIHdpdGggZ2VuZXJhdGluZyBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHN1Y2ggZmxhZ3MsCisvLyBhbmQgZWFjaCB0ZXN0IGlzIGdpdmVuIG9uZSBjb21iaW5hdGlvbiBhcyBhIHBhcmFtZXRlci4KKworLy8gVXNlIGNsYXNzIGRlZmluaXRpb25zIHRvIHRlc3QgZnJvbSB0aGlzIGhlYWRlci4KKyNpbmNsdWRlICJwcmltZV90YWJsZXMuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfQ09NQklORQorCisvLyBTdXBwb3NlIHdlIHdhbnQgdG8gaW50cm9kdWNlIGEgbmV3LCBpbXByb3ZlZCBpbXBsZW1lbnRhdGlvbiBvZiBQcmltZVRhYmxlCisvLyB3aGljaCBjb21iaW5lcyBzcGVlZCBvZiBQcmVjYWxjUHJpbWVUYWJsZSBhbmQgdmVyc2F0aWxpdHkgb2YKKy8vIE9uVGhlRmx5UHJpbWVUYWJsZSAoc2VlIHByaW1lX3RhYmxlcy5oKS4gSW5zaWRlIGl0IGluc3RhbnRpYXRlcyBib3RoCisvLyBQcmVjYWxjUHJpbWVUYWJsZSBhbmQgT25UaGVGbHlQcmltZVRhYmxlIGFuZCB1c2VzIHRoZSBvbmUgdGhhdCBpcyBtb3JlCisvLyBhcHByb3ByaWF0ZSB1bmRlciB0aGUgY2lyY3Vtc3RhbmNlcy4gQnV0IGluIGxvdyBtZW1vcnkgY29uZGl0aW9ucywgaXQgY2FuIGJlCisvLyB0b2xkIHRvIGluc3RhbnRpYXRlIHdpdGhvdXQgUHJlY2FsY1ByaW1lVGFibGUgaW5zdGFuY2UgYXQgYWxsIGFuZCB1c2Ugb25seQorLy8gT25UaGVGbHlQcmltZVRhYmxlLgorY2xhc3MgSHlicmlkUHJpbWVUYWJsZSA6IHB1YmxpYyBQcmltZVRhYmxlIHsKKyBwdWJsaWM6CisgIEh5YnJpZFByaW1lVGFibGUoYm9vbCBmb3JjZV9vbl90aGVfZmx5LCBpbnQgbWF4X3ByZWNhbGN1bGF0ZWQpCisgICAgICA6IG9uX3RoZV9mbHlfaW1wbF8obmV3IE9uVGhlRmx5UHJpbWVUYWJsZSksCisgICAgICAgIHByZWNhbGNfaW1wbF8oZm9yY2Vfb25fdGhlX2ZseSA/IE5VTEwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUobWF4X3ByZWNhbGN1bGF0ZWQpKSwKKyAgICAgICAgbWF4X3ByZWNhbGN1bGF0ZWRfKG1heF9wcmVjYWxjdWxhdGVkKSB7fQorICB2aXJ0dWFsIH5IeWJyaWRQcmltZVRhYmxlKCkgeworICAgIGRlbGV0ZSBvbl90aGVfZmx5X2ltcGxfOworICAgIGRlbGV0ZSBwcmVjYWxjX2ltcGxfOworICB9CisKKyAgdmlydHVhbCBib29sIElzUHJpbWUoaW50IG4pIGNvbnN0IHsKKyAgICBpZiAocHJlY2FsY19pbXBsXyAhPSBOVUxMICYmIG4gPCBtYXhfcHJlY2FsY3VsYXRlZF8pCisgICAgICByZXR1cm4gcHJlY2FsY19pbXBsXy0+SXNQcmltZShuKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gb25fdGhlX2ZseV9pbXBsXy0+SXNQcmltZShuKTsKKyAgfQorCisgIHZpcnR1YWwgaW50IEdldE5leHRQcmltZShpbnQgcCkgY29uc3QgeworICAgIGludCBuZXh0X3ByaW1lID0gLTE7CisgICAgaWYgKHByZWNhbGNfaW1wbF8gIT0gTlVMTCAmJiBwIDwgbWF4X3ByZWNhbGN1bGF0ZWRfKQorICAgICAgbmV4dF9wcmltZSA9IHByZWNhbGNfaW1wbF8tPkdldE5leHRQcmltZShwKTsKKworICAgIHJldHVybiBuZXh0X3ByaW1lICE9IC0xID8gbmV4dF9wcmltZSA6IG9uX3RoZV9mbHlfaW1wbF8tPkdldE5leHRQcmltZShwKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgT25UaGVGbHlQcmltZVRhYmxlKiBvbl90aGVfZmx5X2ltcGxfOworICBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSogcHJlY2FsY19pbXBsXzsKKyAgaW50IG1heF9wcmVjYWxjdWxhdGVkXzsKK307CisKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKK3VzaW5nIDo6dGVzdGluZzo6Qm9vbDsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwordXNpbmcgOjp0ZXN0aW5nOjpDb21iaW5lOworCisvLyBUbyB0ZXN0IGFsbCBjb2RlIHBhdGhzIGZvciBIeWJyaWRQcmltZVRhYmxlIHdlIG11c3QgdGVzdCBpdCB3aXRoIG51bWJlcnMKKy8vIGJvdGggd2l0aGluIGFuZCBvdXRzaWRlIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlJ3MgY2FwYWNpdHkgYW5kIGFsc28gd2l0aAorLy8gUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUgZGlzYWJsZWQuIFdlIGRvIHRoaXMgYnkgZGVmaW5pbmcgZml4dHVyZSB3aGljaCB3aWxsCisvLyBhY2NlcHQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBwYXJhbWV0ZXJzIGZvciBpbnN0YW50aWF0aW5nIGEKKy8vIEh5YnJpZFByaW1lVGFibGUgaW5zdGFuY2UuCitjbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPCA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQ+ID4geworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIFRoaXMgY2FuIGJlIHdyaXR0ZW4gYXMKKyAgICAvLworICAgIC8vIGJvb2wgZm9yY2Vfb25fdGhlX2ZseTsKKyAgICAvLyBpbnQgbWF4X3ByZWNhbGN1bGF0ZWQ7CisgICAgLy8gdGllKGZvcmNlX29uX3RoZV9mbHksIG1heF9wcmVjYWxjdWxhdGVkKSA9IEdldFBhcmFtKCk7CisgICAgLy8KKyAgICAvLyBvbmNlIHRoZSBHb29nbGUgQysrIFN0eWxlIEd1aWRlIGFsbG93cyB1c2Ugb2YgOjpzdGQ6OnRyMTo6dGllLgorICAgIC8vCisgICAgYm9vbCBmb3JjZV9vbl90aGVfZmx5ID0gOjpzdGQ6OnRyMTo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgIGludCBtYXhfcHJlY2FsY3VsYXRlZCA9IDo6c3RkOjp0cjE6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICB0YWJsZV8gPSBuZXcgSHlicmlkUHJpbWVUYWJsZShmb3JjZV9vbl90aGVfZmx5LCBtYXhfcHJlY2FsY3VsYXRlZCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGRlbGV0ZSB0YWJsZV87CisgICAgdGFibGVfID0gTlVMTDsKKyAgfQorICBIeWJyaWRQcmltZVRhYmxlKiB0YWJsZV87Cit9OworCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICAvLyBJbnNpZGUgdGhlIHRlc3QgYm9keSwgeW91IGNhbiByZWZlciB0byB0aGUgdGVzdCBwYXJhbWV0ZXIgYnkgR2V0UGFyYW0oKS4KKyAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgdGVzdCBwYXJhbWV0ZXIgaXMgYSBQcmltZVRhYmxlIGludGVyZmFjZSBwb2ludGVyIHdoaWNoCisgIC8vIHdlIGNhbiB1c2UgZGlyZWN0bHkuCisgIC8vIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbiBhbHNvIHNhdmUgaXQgaW4gdGhlIGZpeHR1cmUncyBTZXRVcCgpIG1ldGhvZAorICAvLyBvciBjb25zdHJ1Y3RvciBhbmQgdXNlIHNhdmVkIGNvcHkgaW4gdGhlIHRlc3RzLgorCisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoLTUpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgwKSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMSkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg2KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMTAwKSk7Cit9CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc1RydWVGb3JQcmltZXMpIHsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDMpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDUpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDcpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDExKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMzEpKTsKK30KKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBDYW5HZXROZXh0UHJpbWUpIHsKKyAgRVhQRUNUX0VRKDIsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKKyAgRVhQRUNUX0VRKDMsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKKyAgRVhQRUNUX0VRKDUsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKKyAgRVhQRUNUX0VRKDcsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKKyAgRVhQRUNUX0VRKDExLCB0YWJsZV8tPkdldE5leHRQcmltZSg3KSk7CisgIEVYUEVDVF9FUSgxMzEsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOworfQorCisvLyBJbiBvcmRlciB0byBydW4gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgeW91IG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlbSwKKy8vIG9yIGJpbmQgdGhlbSB0byBhIGxpc3Qgb2YgdmFsdWVzIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0ZXN0IHBhcmFtZXRlcnMuCisvLyBZb3UgY2FuIGluc3RhbnRpYXRlIHRoZW0gaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gbW9kdWxlLCBvciBldmVuCisvLyBpbnN0YW50aWF0ZSB0aGVtIHNldmVyYWwgdGltZXMuCisvLworLy8gSGVyZSwgd2UgaW5zdGFudGlhdGUgb3VyIHRlc3RzIHdpdGggYSBsaXN0IG9mIHBhcmFtZXRlcnMuIFdlIG11c3QgY29tYmluZQorLy8gYWxsIHZhcmlhdGlvbnMgb2YgdGhlIGJvb2xlYW4gZmxhZyBzdXBwcmVzc2luZyBQcmVjYWxjUHJpbWVUYWJsZSBhbmQgc29tZQorLy8gbWVhbmluZ2Z1bCB2YWx1ZXMgZm9yIHRlc3RzLiBXZSBjaG9vc2UgYSBzbWFsbCB2YWx1ZSAoMSksIGFuZCBhIHZhbHVlIHRoYXQKKy8vIHdpbGwgcHV0IHNvbWUgb2YgdGhlIHRlc3RlZCBudW1iZXJzIGJleW9uZCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUKKy8vIFByZWNhbGNQcmltZVRhYmxlIGluc3RhbmNlIGFuZCBzb21lIGluc2lkZSBpdCAoMTApLiBDb21iaW5lIHdpbGwgcHJvZHVjZSBhbGwKKy8vIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lYW5pbmdmdWxUZXN0UGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lVGFibGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShCb29sKCksIFZhbHVlcygxLCAxMCkpKTsKKworI2Vsc2UKKworLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IENvbWJpbmUoKSB3aXRoIHNvbWUgY29tcGlsZXJzLiBJZiB3ZQorLy8gdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGNvbXBpbGUgb3V0IGFsbCBjb2RlIHJlZmVycmluZyB0bworLy8gdGhlIGd0ZXN0X21haW4gbGlicmFyeSwgTVNWQyBsaW5rZXIgd2lsbCBub3QgbGluayB0aGF0IGxpYnJhcnkgYXQKKy8vIGFsbCBhbmQgY29uc2VxdWVudGx5IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZW50cnkgcG9pbnQgZGVmaW5lZCBpbgorLy8gdGhhdCBsaWJyYXJ5IChmYXRhbCBlcnJvciBMTksxNTYxOiBlbnRyeSBwb2ludCBtdXN0IGJlCisvLyBkZWZpbmVkKS4gVGhpcyBkdW1teSB0ZXN0IGtlZXBzIGd0ZXN0X21haW4gbGlua2VkIGluLgorVEVTVChEdW1teVRlc3QsIENvbWJpbmVJc05vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUyMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE2MCBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB1c2UgR29vZ2xlIFRlc3QgbGlzdGVuZXIgQVBJIHRvIGltcGxlbWVudAorLy8gYW4gYWx0ZXJuYXRpdmUgY29uc29sZSBvdXRwdXQgYW5kIGhvdyB0byB1c2UgdGhlIFVuaXRUZXN0IHJlZmxlY3Rpb24gQVBJCisvLyB0byBlbnVtZXJhdGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgYW5kIHRvIGluc3BlY3QgdGhlaXIgcmVzdWx0cy4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXI7Cit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0Q2FzZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OworCituYW1lc3BhY2UgeworCisvLyBQcm92aWRlcyBhbHRlcm5hdGl2ZSBvdXRwdXQgbW9kZSB3aGljaCBwcm9kdWNlcyBtaW5pbWFsIGFtb3VudCBvZgorLy8gaW5mb3JtYXRpb24gYWJvdXQgdGVzdHMuCitjbGFzcyBUZXJzZVByaW50ZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHJpdmF0ZToKKyAgLy8gQ2FsbGVkIGJlZm9yZSBhbnkgdGVzdCBhY3Rpdml0eSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLykge30KKworICAvLyBDYWxsZWQgYWZ0ZXIgYWxsIHRlc3QgYWN0aXZpdGllcyBoYXZlIGVuZGVkLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgICAgZnByaW50ZihzdGRvdXQsICJURVNUICVzXG4iLCB1bml0X3Rlc3QuUGFzc2VkKCkgPyAiUEFTU0VEIiA6ICJGQUlMRUQiKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgfQorCisgIC8vIENhbGxlZCBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwKKyAgICAgICAgICAgICIqKiogVGVzdCAlcy4lcyBzdGFydGluZy5cbiIsCisgICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwKKyAgICAgICAgICAgIHRlc3RfaW5mby5uYW1lKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICAgIGZwcmludGYoc3Rkb3V0LAorICAgICAgICAgICAgIiVzIGluICVzOiVkXG4lc1xuIiwKKyAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmFpbGVkKCkgPyAiKioqIEZhaWx1cmUiIDogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKSwKKyAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSwKKyAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuc3VtbWFyeSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgfQorCisgIC8vIENhbGxlZCBhZnRlciBhIHRlc3QgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgZnByaW50ZihzdGRvdXQsCisgICAgICAgICAgICAiKioqIFRlc3QgJXMuJXMgZW5kaW5nLlxuIiwKKyAgICAgICAgICAgIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLAorICAgICAgICAgICAgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KK307ICAvLyBjbGFzcyBUZXJzZVByaW50ZXIKKworVEVTVChDdXN0b21PdXRwdXRUZXN0LCBQcmludHNNZXNzYWdlKSB7CisgIHByaW50ZigiUHJpbnRpbmcgc29tZXRoaW5nIGZyb20gdGhlIHRlc3QgYm9keS4uLlxuIik7Cit9CisKK1RFU1QoQ3VzdG9tT3V0cHV0VGVzdCwgU3VjY2VlZHMpIHsKKyAgU1VDQ0VFRCgpIDw8ICJTVUNDRUVEKCkgaGFzIGJlZW4gaW52b2tlZCBmcm9tIGhlcmUiOworfQorCitURVNUKEN1c3RvbU91dHB1dFRlc3QsIEZhaWxzKSB7CisgIEVYUEVDVF9FUSgxLCAyKQorICAgICAgPDwgIlRoaXMgdGVzdCBmYWlscyBpbiBvcmRlciB0byBkZW1vbnN0cmF0ZSBhbHRlcm5hdGl2ZSBmYWlsdXJlIG1lc3NhZ2VzIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgYm9vbCB0ZXJzZV9vdXRwdXQgPSBmYWxzZTsKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS10ZXJzZV9vdXRwdXQiKSA9PSAwICkKKyAgICB0ZXJzZV9vdXRwdXQgPSB0cnVlOworICBlbHNlCisgICAgcHJpbnRmKCIlc1xuIiwgIlJ1biB0aGlzIHByb2dyYW0gd2l0aCAtLXRlcnNlX291dHB1dCB0byBjaGFuZ2UgdGhlIHdheSAiCisgICAgICAgICAgICJpdCBwcmludHMgaXRzIG91dHB1dC4iKTsKKworICBVbml0VGVzdCYgdW5pdF90ZXN0ID0gKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgIC8vIElmIHdlIGFyZSBnaXZlbiB0aGUgLS10ZXJzZV9vdXRwdXQgY29tbWFuZCBsaW5lIGZsYWcsIHN1cHByZXNzZXMgdGhlCisgIC8vIHN0YW5kYXJkIG91dHB1dCBhbmQgYXR0YWNoZXMgb3duIHJlc3VsdCBwcmludGVyLgorICBpZiAodGVyc2Vfb3V0cHV0KSB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPSB1bml0X3Rlc3QubGlzdGVuZXJzKCk7CisKKyAgICAvLyBSZW1vdmVzIHRoZSBkZWZhdWx0IGNvbnNvbGUgb3V0cHV0IGxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgc28gaXQgd2lsbAorICAgIC8vIG5vdCByZWNlaXZlIGV2ZW50cyBmcm9tIEdvb2dsZSBUZXN0IGFuZCB3b24ndCBwcmludCBhbnkgb3V0cHV0LiBTaW5jZQorICAgIC8vIHRoaXMgb3BlcmF0aW9uIHRyYW5zZmVycyBvd25lcnNoaXAgb2YgdGhlIGxpc3RlbmVyIHRvIHRoZSBjYWxsZXIgd2UKKyAgICAvLyBoYXZlIHRvIGRlbGV0ZSBpdCBhcyB3ZWxsLgorICAgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKworICAgIC8vIEFkZHMgdGhlIGN1c3RvbSBvdXRwdXQgbGlzdGVuZXIgdG8gdGhlIGxpc3QuIEl0IHdpbGwgbm93IHJlY2VpdmUKKyAgICAvLyBldmVudHMgZnJvbSBHb29nbGUgVGVzdCBhbmQgcHJpbnQgdGhlIGFsdGVybmF0aXZlIG91dHB1dC4gV2UgZG9uJ3QKKyAgICAvLyBoYXZlIHRvIHdvcnJ5IGFib3V0IGRlbGV0aW5nIGl0IHNpbmNlIEdvb2dsZSBUZXN0IGFzc3VtZXMgb3duZXJzaGlwCisgICAgLy8gb3ZlciBpdCBhZnRlciBhZGRpbmcgaXQgdG8gdGhlIGxpc3QuCisgICAgbGlzdGVuZXJzLkFwcGVuZChuZXcgVGVyc2VQcmludGVyKTsKKyAgfQorICBpbnQgcmV0X3ZhbCA9IFJVTl9BTExfVEVTVFMoKTsKKworICAvLyBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIFVuaXRUZXN0IHJlZmxlY3Rpb24gQVBJIHRvIGluc3BlY3QgdGVzdAorICAvLyByZXN1bHRzLiBIZXJlIHdlIGRpc2NvdW50IGZhaWx1cmVzIGZyb20gdGhlIHRlc3RzIHdlIGV4cGVjdGVkIHRvIGZhaWwuCisgIGludCB1bmV4cGVjdGVkbHlfZmFpbGVkX3Rlc3RzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsKKyAgICAgIC8vIENvdW50cyBmYWlsZWQgdGVzdHMgdGhhdCB3ZXJlIG5vdCBtZWFudCB0byBmYWlsICh0aG9zZSB3aXRob3V0CisgICAgICAvLyAnRmFpbHMnIGluIHRoZSBuYW1lKS4KKyAgICAgIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPkZhaWxlZCgpICYmCisgICAgICAgICAgc3RyY21wKHRlc3RfaW5mby5uYW1lKCksICJGYWlscyIpICE9IDApIHsKKyAgICAgICAgdW5leHBlY3RlZGx5X2ZhaWxlZF90ZXN0cysrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRlc3QgdGhhdCB3ZXJlIG1lYW50IHRvIGZhaWwgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIHRlc3QgcHJvZ3JhbSBvdXRjb21lLgorICBpZiAodW5leHBlY3RlZGx5X2ZhaWxlZF90ZXN0cyA9PSAwKQorICAgIHJldF92YWwgPSAwOworCisgIHJldHVybiByZXRfdmFsOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTdlZjcyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkKQEAgLTAsMCArMSwyNTAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiImZ1c2VfZ3Rlc3RfZmlsZXMucHkgdjAuMi4wCitGdXNlcyBHb29nbGUgVGVzdCBzb3VyY2UgY29kZSBpbnRvIGEgLmggZmlsZSBhbmQgYSAuY2MgZmlsZS4KKworU1lOT1BTSVMKKyAgICAgICBmdXNlX2d0ZXN0X2ZpbGVzLnB5IFtHVEVTVF9ST09UX0RJUl0gT1VUUFVUX0RJUgorCisgICAgICAgU2NhbnMgR1RFU1RfUk9PVF9ESVIgZm9yIEdvb2dsZSBUZXN0IHNvdXJjZSBjb2RlLCBhbmQgZ2VuZXJhdGVzCisgICAgICAgdHdvIGZpbGVzOiBPVVRQVVRfRElSL2d0ZXN0L2d0ZXN0LmggYW5kIE9VVFBVVF9ESVIvZ3Rlc3QvZ3Rlc3QtYWxsLmNjLgorICAgICAgIFRoZW4geW91IGNhbiBidWlsZCB5b3VyIHRlc3RzIGJ5IGFkZGluZyBPVVRQVVRfRElSIHRvIHRoZSBpbmNsdWRlCisgICAgICAgc2VhcmNoIHBhdGggYW5kIGxpbmtpbmcgd2l0aCBPVVRQVVRfRElSL2d0ZXN0L2d0ZXN0LWFsbC5jYy4gIFRoZXNlCisgICAgICAgdHdvIGZpbGVzIGNvbnRhaW4gZXZlcnl0aGluZyB5b3UgbmVlZCB0byB1c2UgR29vZ2xlIFRlc3QuICBIZW5jZQorICAgICAgIHlvdSBjYW4gImluc3RhbGwiIEdvb2dsZSBUZXN0IGJ5IGNvcHlpbmcgdGhlbSB0byB3aGVyZXZlciB5b3Ugd2FudC4KKworICAgICAgIEdURVNUX1JPT1RfRElSIGNhbiBiZSBvbWl0dGVkIGFuZCBkZWZhdWx0cyB0byB0aGUgcGFyZW50CisgICAgICAgZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGlzIHNjcmlwdC4KKworRVhBTVBMRVMKKyAgICAgICAuL2Z1c2VfZ3Rlc3RfZmlsZXMucHkgZnVzZWRfZ3Rlc3QKKyAgICAgICAuL2Z1c2VfZ3Rlc3RfZmlsZXMucHkgcGF0aC90by91bnBhY2tlZC9ndGVzdCBmdXNlZF9ndGVzdAorCitUaGlzIHRvb2wgaXMgZXhwZXJpbWVudGFsLiAgSW4gcGFydGljdWxhciwgaXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG5vCitjb25kaXRpb25hbCBpbmNsdXNpb24gb2YgR29vZ2xlIFRlc3QgaGVhZGVycy4gIFBsZWFzZSByZXBvcnQgYW55Citwcm9ibGVtcyB0byBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20uICBZb3UgY2FuIHJlYWQKK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUgZm9yCittb3JlIGluZm9ybWF0aW9uLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2V0cworaW1wb3J0IHN5cworCisjIFdlIGFzc3VtZSB0aGF0IHRoaXMgZmlsZSBpcyBpbiB0aGUgc2NyaXB0cy8gZGlyZWN0b3J5IGluIHRoZSBHb29nbGUKKyMgVGVzdCByb290IGRpcmVjdG9yeS4KK0RFRkFVTFRfR1RFU1RfUk9PVF9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJykKKworIyBSZWdleCBmb3IgbWF0Y2hpbmcgJyNpbmNsdWRlICJndGVzdC8uLi4iJy4KK0lOQ0xVREVfR1RFU1RfRklMRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXHMqI1xzKmluY2x1ZGVccyoiKGd0ZXN0Ly4rKSInKQorCisjIFJlZ2V4IGZvciBtYXRjaGluZyAnI2luY2x1ZGUgInNyYy8uLi4iJy4KK0lOQ0xVREVfU1JDX0ZJTEVfUkVHRVggPSByZS5jb21waWxlKHInXlxzKiNccyppbmNsdWRlXHMqIihzcmMvLispIicpCisKKyMgV2hlcmUgdG8gZmluZCB0aGUgc291cmNlIHNlZWQgZmlsZXMuCitHVEVTVF9IX1NFRUQgPSAnaW5jbHVkZS9ndGVzdC9ndGVzdC5oJworR1RFU1RfU1BJX0hfU0VFRCA9ICdpbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oJworR1RFU1RfQUxMX0NDX1NFRUQgPSAnc3JjL2d0ZXN0LWFsbC5jYycKKworIyBXaGVyZSB0byBwdXQgdGhlIGdlbmVyYXRlZCBmaWxlcy4KK0dURVNUX0hfT1VUUFVUID0gJ2d0ZXN0L2d0ZXN0LmgnCitHVEVTVF9BTExfQ0NfT1VUUFVUID0gJ2d0ZXN0L2d0ZXN0LWFsbC5jYycKKworCitkZWYgVmVyaWZ5RmlsZUV4aXN0cyhkaXJlY3RvcnksIHJlbGF0aXZlX3BhdGgpOgorICAiIiJWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBmaWxlIGV4aXN0czsgYWJvcnRzIG9uIGZhaWx1cmUuCisKKyAgcmVsYXRpdmVfcGF0aCBpcyB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgICIiIgorCisgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCByZWxhdGl2ZV9wYXRoKSk6CisgICAgcHJpbnQgJ0VSUk9SOiBDYW5ub3QgZmluZCAlcyBpbiBkaXJlY3RvcnkgJXMuJyAlIChyZWxhdGl2ZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5KQorICAgIHByaW50ICgnUGxlYXNlIGVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgcHJvamVjdCByb290IGRpcmVjdG9yeSAnCisgICAgICAgICAgICdvciBvbWl0IGl0IG9uIHRoZSBjb21tYW5kIGxpbmUuJykKKyAgICBzeXMuZXhpdCgxKQorCisKK2RlZiBWYWxpZGF0ZUdUZXN0Um9vdERpcihndGVzdF9yb290KToKKyAgIiIiTWFrZXMgc3VyZSBndGVzdF9yb290IHBvaW50cyB0byBhIHZhbGlkIGd0ZXN0IHJvb3QgZGlyZWN0b3J5LgorCisgIFRoZSBmdW5jdGlvbiBhYm9ydHMgdGhlIHByb2dyYW0gb24gZmFpbHVyZS4KKyAgIiIiCisKKyAgVmVyaWZ5RmlsZUV4aXN0cyhndGVzdF9yb290LCBHVEVTVF9IX1NFRUQpCisgIFZlcmlmeUZpbGVFeGlzdHMoZ3Rlc3Rfcm9vdCwgR1RFU1RfQUxMX0NDX1NFRUQpCisKKworZGVmIFZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgcmVsYXRpdmVfcGF0aCk6CisgICIiIlZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIG91dHB1dCBmaWxlIHBhdGggaXMgdmFsaWQuCisKKyAgcmVsYXRpdmVfcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgb3V0cHV0X2RpciBkaXJlY3RvcnkuCisgICIiIgorCisgICMgTWFrZXMgc3VyZSB0aGUgb3V0cHV0IGZpbGUgZWl0aGVyIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuIGJlIG92ZXJ3cml0dGVuLgorICBvdXRwdXRfZmlsZSA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCByZWxhdGl2ZV9wYXRoKQorICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRwdXRfZmlsZSk6CisgICAgIyBUT0RPKHdhbkBnb29nbGUuY29tKTogVGhlIGZvbGxvd2luZyB1c2VyLWludGVyYWN0aW9uIGRvZXNuJ3QKKyAgICAjIHdvcmsgd2l0aCBhdXRvbWF0ZWQgcHJvY2Vzc2VzLiAgV2Ugc2hvdWxkIHByb3ZpZGUgYSB3YXkgZm9yIHRoZQorICAgICMgTWFrZWZpbGUgdG8gZm9yY2Ugb3ZlcndyaXRpbmcgdGhlIGZpbGVzLgorICAgIHByaW50ICgnJXMgYWxyZWFkeSBleGlzdHMgaW4gZGlyZWN0b3J5ICVzIC0gb3ZlcndyaXRlIGl0PyAoeS9OKSAnICUKKyAgICAgICAgICAgKHJlbGF0aXZlX3BhdGgsIG91dHB1dF9kaXIpKQorICAgIGFuc3dlciA9IHN5cy5zdGRpbi5yZWFkbGluZSgpLnN0cmlwKCkKKyAgICBpZiBhbnN3ZXIgbm90IGluIFsneScsICdZJ106CisgICAgICBwcmludCAnQUJPUlRFRC4nCisgICAgICBzeXMuZXhpdCgxKQorCisgICMgTWFrZXMgc3VyZSB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgdGhlIG91dHB1dCBmaWxlIGV4aXN0czsgY3JlYXRlcworICAjIGl0IGFuZCBhbGwgaXRzIGFuY2VzdG9ycyBpZiBuZWNlc3NhcnkuCisgIHBhcmVudF9kaXJlY3RvcnkgPSBvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGUpCisgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhcmVudF9kaXJlY3RvcnkpOgorICAgIG9zLm1ha2VkaXJzKHBhcmVudF9kaXJlY3RvcnkpCisKKworZGVmIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpOgorICAiIiJNYWtlcyBzdXJlIG91dHB1dF9kaXIgcG9pbnRzIHRvIGEgdmFsaWQgb3V0cHV0IGRpcmVjdG9yeS4KKworICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCisgICIiIgorCisgIFZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgR1RFU1RfSF9PVVRQVVQpCisgIFZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgR1RFU1RfQUxMX0NDX09VVFBVVCkKKworCitkZWYgRnVzZUdUZXN0SChndGVzdF9yb290LCBvdXRwdXRfZGlyKToKKyAgIiIiU2NhbnMgZm9sZGVyIGd0ZXN0X3Jvb3QgdG8gZ2VuZXJhdGUgZ3Rlc3QvZ3Rlc3QuaCBpbiBvdXRwdXRfZGlyLiIiIgorCisgIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR1RFU1RfSF9PVVRQVVQpLCAndycpCisgIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkgICMgSG9sZHMgYWxsIGd0ZXN0IGhlYWRlcnMgd2UndmUgcHJvY2Vzc2VkLgorCisgIGRlZiBQcm9jZXNzRmlsZShndGVzdF9oZWFkZXJfcGF0aCk6CisgICAgIiIiUHJvY2Vzc2VzIHRoZSBnaXZlbiBndGVzdCBoZWFkZXIgZmlsZS4iIiIKKworICAgICMgV2UgZG9uJ3QgcHJvY2VzcyB0aGUgc2FtZSBoZWFkZXIgdHdpY2UuCisgICAgaWYgZ3Rlc3RfaGVhZGVyX3BhdGggaW4gcHJvY2Vzc2VkX2ZpbGVzOgorICAgICAgcmV0dXJuCisKKyAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGd0ZXN0X2hlYWRlcl9wYXRoKQorCisgICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGd0ZXN0IGhlYWRlci4KKyAgICBmb3IgbGluZSBpbiBmaWxlKG9zLnBhdGguam9pbihndGVzdF9yb290LCBndGVzdF9oZWFkZXJfcGF0aCksICdyJyk6CisgICAgICBtID0gSU5DTFVERV9HVEVTVF9GSUxFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICBpZiBtOgorICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJndGVzdC8uLi4iJyAtIGxldCdzIHByb2Nlc3MgaXQgcmVjdXJzaXZlbHkuCisgICAgICAgIFByb2Nlc3NGaWxlKCdpbmNsdWRlLycgKyBtLmdyb3VwKDEpKQorICAgICAgZWxzZToKKyAgICAgICAgIyBPdGhlcndpc2Ugd2UgY29weSB0aGUgbGluZSB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dCBmaWxlLgorICAgICAgICBvdXRwdXRfZmlsZS53cml0ZShsaW5lKQorCisgIFByb2Nlc3NGaWxlKEdURVNUX0hfU0VFRCkKKyAgb3V0cHV0X2ZpbGUuY2xvc2UoKQorCisKK2RlZiBGdXNlR1Rlc3RBbGxDY1RvRmlsZShndGVzdF9yb290LCBvdXRwdXRfZmlsZSk6CisgICIiIlNjYW5zIGZvbGRlciBndGVzdF9yb290IHRvIGdlbmVyYXRlIGd0ZXN0L2d0ZXN0LWFsbC5jYyBpbiBvdXRwdXRfZmlsZS4iIiIKKworICBwcm9jZXNzZWRfZmlsZXMgPSBzZXRzLlNldCgpCisKKyAgZGVmIFByb2Nlc3NGaWxlKGd0ZXN0X3NvdXJjZV9maWxlKToKKyAgICAiIiJQcm9jZXNzZXMgdGhlIGdpdmVuIGd0ZXN0IHNvdXJjZSBmaWxlLiIiIgorCisgICAgIyBXZSBkb24ndCBwcm9jZXNzIHRoZSBzYW1lICNpbmNsdWRlZCBmaWxlIHR3aWNlLgorICAgIGlmIGd0ZXN0X3NvdXJjZV9maWxlIGluIHByb2Nlc3NlZF9maWxlczoKKyAgICAgIHJldHVybgorCisgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChndGVzdF9zb3VyY2VfZmlsZSkKKworICAgICMgUmVhZHMgZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBndGVzdCBzb3VyY2UgZmlsZS4KKyAgICBmb3IgbGluZSBpbiBmaWxlKG9zLnBhdGguam9pbihndGVzdF9yb290LCBndGVzdF9zb3VyY2VfZmlsZSksICdyJyk6CisgICAgICBtID0gSU5DTFVERV9HVEVTVF9GSUxFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICBpZiBtOgorICAgICAgICBpZiAnaW5jbHVkZS8nICsgbS5ncm91cCgxKSA9PSBHVEVTVF9TUElfSF9TRUVEOgorICAgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIicuICBUaGlzIGZpbGUgaXMgbm90CisgICAgICAgICAgIyAjaW5jbHVkZWQgYnkgImd0ZXN0L2d0ZXN0LmgiLCBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MgaXQuCisgICAgICAgICAgUHJvY2Vzc0ZpbGUoR1RFU1RfU1BJX0hfU0VFRCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJndGVzdC9mb28uaCInIHdoZXJlIGZvbyBpcyBub3QgZ3Rlc3Qtc3BpLgorICAgICAgICAgICMgV2UgdHJlYXQgaXQgYXMgJyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIicsIGFzIGFsbCBvdGhlcgorICAgICAgICAgICMgZ3Rlc3QgaGVhZGVycyBhcmUgYmVpbmcgZnVzZWQgaW50byBndGVzdC5oIGFuZCBjYW5ub3QgYmUKKyAgICAgICAgICAjICNpbmNsdWRlZCBkaXJlY3RseS4KKworICAgICAgICAgICMgVGhlcmUgaXMgbm8gbmVlZCB0byAjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIgbW9yZSB0aGFuIG9uY2UuCisgICAgICAgICAgaWYgbm90IEdURVNUX0hfU0VFRCBpbiBwcm9jZXNzZWRfZmlsZXM6CisgICAgICAgICAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKEdURVNUX0hfU0VFRCkKKyAgICAgICAgICAgIG91dHB1dF9maWxlLndyaXRlKCcjaW5jbHVkZSAiJXMiXG4nICUgKEdURVNUX0hfT1VUUFVULCkpCisgICAgICBlbHNlOgorICAgICAgICBtID0gSU5DTFVERV9TUkNfRklMRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICMgSXQncyAnI2luY2x1ZGUgInNyYy9mb28iJyAtIGxldCdzIHByb2Nlc3MgaXQgcmVjdXJzaXZlbHkuCisgICAgICAgICAgUHJvY2Vzc0ZpbGUobS5ncm91cCgxKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBvdXRwdXRfZmlsZS53cml0ZShsaW5lKQorCisgIFByb2Nlc3NGaWxlKEdURVNUX0FMTF9DQ19TRUVEKQorCisKK2RlZiBGdXNlR1Rlc3RBbGxDYyhndGVzdF9yb290LCBvdXRwdXRfZGlyKToKKyAgIiIiU2NhbnMgZm9sZGVyIGd0ZXN0X3Jvb3QgdG8gZ2VuZXJhdGUgZ3Rlc3QvZ3Rlc3QtYWxsLmNjIGluIG91dHB1dF9kaXIuIiIiCisKKyAgb3V0cHV0X2ZpbGUgPSBmaWxlKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBHVEVTVF9BTExfQ0NfT1VUUFVUKSwgJ3cnKQorICBGdXNlR1Rlc3RBbGxDY1RvRmlsZShndGVzdF9yb290LCBvdXRwdXRfZmlsZSkKKyAgb3V0cHV0X2ZpbGUuY2xvc2UoKQorCisKK2RlZiBGdXNlR1Rlc3QoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2Rpcik6CisgICIiIkZ1c2VzIGd0ZXN0LmggYW5kIGd0ZXN0LWFsbC5jYy4iIiIKKworICBWYWxpZGF0ZUdUZXN0Um9vdERpcihndGVzdF9yb290KQorICBWYWxpZGF0ZU91dHB1dERpcihvdXRwdXRfZGlyKQorCisgIEZ1c2VHVGVzdEgoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2RpcikKKyAgRnVzZUdUZXN0QWxsQ2MoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2RpcikKKworCitkZWYgbWFpbigpOgorICBhcmdjID0gbGVuKHN5cy5hcmd2KQorICBpZiBhcmdjID09IDI6CisgICAgIyBmdXNlX2d0ZXN0X2ZpbGVzLnB5IE9VVFBVVF9ESVIKKyAgICBGdXNlR1Rlc3QoREVGQVVMVF9HVEVTVF9ST09UX0RJUiwgc3lzLmFyZ3ZbMV0pCisgIGVsaWYgYXJnYyA9PSAzOgorICAgICMgZnVzZV9ndGVzdF9maWxlcy5weSBHVEVTVF9ST09UX0RJUiBPVVRQVVRfRElSCisgICAgRnVzZUdUZXN0KHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXSkKKyAgZWxzZToKKyAgICBwcmludCBfX2RvY19fCisgICAgc3lzLmV4aXQoMSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zY3JpcHRzL2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy9nZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQzNWI0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy9nZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5CkBAIC0wLDAgKzEsNzMwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IHYwLjEKKworR2VuZXJhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHb29nbGUgVGVzdCBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBhbmQKK2FjY29tcGFueWluZyB0ZXN0cy4KKworVXNhZ2U6CisKKyAgZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSBNQVhfQVJJVFkKKword2hlcmUgTUFYX0FSSVRZIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4KKworVGhlIGNvbW1hbmQgZ2VuZXJhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB1cC10byBNQVhfQVJJVFktYXJ5CitwcmVkaWNhdGUgYXNzZXJ0aW9ucywgYW5kIHdyaXRlcyBpdCB0byBmaWxlIGd0ZXN0X3ByZWRfaW1wbC5oIGluIHRoZQorZGlyZWN0b3J5IHdoZXJlIHRoZSBzY3JpcHQgaXMuICBJdCBhbHNvIGdlbmVyYXRlcyB0aGUgYWNjb21wYW55aW5nCit1bml0IHRlc3QgaW4gZmlsZSBndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MuCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCisjIFdoZXJlIHRoaXMgc2NyaXB0IGlzLgorU0NSSVBUX0RJUiA9IG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkKKworIyBXaGVyZSB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIGhlYWRlci4KK0hFQURFUiA9IG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCAnLi4vaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCcpCisKKyMgV2hlcmUgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCB1bml0IHRlc3QuCitVTklUX1RFU1QgPSBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgJy4uL3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjJykKKworCitkZWYgSGVhZGVyUHJlYW1ibGUobik6CisgICIiIlJldHVybnMgdGhlIHByZWFtYmxlIGZvciB0aGUgaGVhZGVyIGZpbGUuCisKKyAgQXJnczoKKyAgICBuOiAgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIHByZWRpY2F0ZSBtYWNyb3MgdG8gYmUgZ2VuZXJhdGVkLgorICAiIiIKKworICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHByZWFtYmxlIHRlbXBsYXRlLgorICBERUZTID0geworICAgICd0b2RheScgOiB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWScpLAorICAgICd5ZWFyJyA6IHRpbWUuc3RyZnRpbWUoJyVZJyksCisgICAgJ2NvbW1hbmQnIDogJyVzICVzJyAlIChvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSwgbiksCisgICAgJ24nIDogbgorICAgIH0KKworICByZXR1cm4gKAorIiIiLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gJSh0b2RheSlzIGJ5IGNvbW1hbmQKKy8vICclKGNvbW1hbmQpcycuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworCisvLyBNYWtlcyBzdXJlIHRoaXMgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBiZWZvcmUgZ3Rlc3QuaC4KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworI2Vycm9yIERvIG5vdCBpbmNsdWRlIGd0ZXN0X3ByZWRfaW1wbC5oIGRpcmVjdGx5LiAgSW5jbHVkZSBndGVzdC5oIGluc3RlYWQuCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKworLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24KKy8vIG1hY3JvczoKKy8vCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKQorLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWRfZm9ybWF0IGlzIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHRha2VzIG4gKGluIHRoZQorLy8gY2FzZSBvZiBBU1NFUlRfUFJFRF9GT1JNQVRuKSB2YWx1ZXMgYW5kIHRoZWlyIHNvdXJjZSBleHByZXNzaW9uCisvLyB0ZXh0LCBhbmQgcmV0dXJucyBhIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4gIFNlZSB0aGUgZGVmaW5pdGlvbgorLy8gb2YgQVNTRVJUX0VRIGluIGd0ZXN0LmggZm9yIGFuIGV4YW1wbGUuCisvLworLy8gSWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZm9ybWF0dGluZywgeW91IGNhbiB1c2UgdGhlIG1vcmUKKy8vIHJlc3RyaWN0aXZlIHZlcnNpb246CisvLworLy8gICBBU1NFUlRfUFJFRDEocHJlZCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWQgaXMgYW4gbi1hcnkgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHJldHVybnMgYm9vbCwKKy8vIGFuZCB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uLCBtdXN0IHN1cHBvcnQgdGhlIDw8IG9wZXJhdG9yIGZvcgorLy8gc3RyZWFtaW5nIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBXZSBhbHNvIGRlZmluZSB0aGUgRVhQRUNUXyogdmFyaWF0aW9ucy4KKy8vCisvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBwcmVkaWNhdGVzIHdob3NlIGFyaXR5IGlzIGF0IG1vc3QgJShuKXMuCisvLyBQbGVhc2UgZW1haWwgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBzdXBwb3J0IGZvciBoaWdoZXIgYXJpdGllcy4KKworLy8gR1RFU1RfQVNTRVJUXyBpcyB0aGUgYmFzaWMgc3RhdGVtZW50IHRvIHdoaWNoIGFsbCBvZiB0aGUgYXNzZXJ0aW9ucworLy8gaW4gdGhpcyBmaWxlIHJlZHVjZS4gIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKworI2RlZmluZSBHVEVTVF9BU1NFUlRfKGV4cHJlc3Npb24sIG9uX2ZhaWx1cmUpIFxcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFxcCisgIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hciA9IChleHByZXNzaW9uKSkgXFwKKyAgICA7IFxcCisgIGVsc2UgXFwKKyAgICBvbl9mYWlsdXJlKGd0ZXN0X2FyLmZhaWx1cmVfbWVzc2FnZSgpKQorIiIiICUgREVGUykKKworCitkZWYgQXJpdHkobik6CisgICIiIlJldHVybnMgdGhlIEVuZ2xpc2ggbmFtZSBvZiB0aGUgZ2l2ZW4gYXJpdHkuIiIiCisKKyAgaWYgbiA8IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgZWxpZiBuIDw9IDM6CisgICAgcmV0dXJuIFsnbnVsbGFyeScsICd1bmFyeScsICdiaW5hcnknLCAndGVybmFyeSddW25dCisgIGVsc2U6CisgICAgcmV0dXJuICclcy1hcnknICUgbgorCisKK2RlZiBUaXRsZSh3b3JkKToKKyAgIiIiUmV0dXJucyB0aGUgZ2l2ZW4gd29yZCBpbiB0aXRsZSBjYXNlLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICB0aGlzIGFuZCBzdHJpbmcncyB0aXRsZSgpIG1ldGhvZCBpcyB0aGF0IFRpdGxlKCc0LWFyeScpIGlzICc0LWFyeScKKyAgd2hpbGUgJzQtYXJ5Jy50aXRsZSgpIGlzICc0LUFyeScuIiIiCisKKyAgcmV0dXJuIHdvcmRbMF0udXBwZXIoKSArIHdvcmRbMTpdCisKKworZGVmIE9uZVRvKG4pOgorICAiIiJSZXR1cm5zIHRoZSBsaXN0IFsxLCAyLCAzLCAuLi4sIG5dLiIiIgorCisgIHJldHVybiByYW5nZSgxLCBuICsgMSkKKworCitkZWYgSXRlcihuLCBmb3JtYXQsIHNlcD0nJyk6CisgICIiIkdpdmVuIGEgcG9zaXRpdmUgaW50ZWdlciBuLCBhIGZvcm1hdCBzdHJpbmcgdGhhdCBjb250YWlucyAwIG9yCisgIG1vcmUgJyVzJyBmb3JtYXQgc3BlY3MsIGFuZCBvcHRpb25hbGx5IGEgc2VwYXJhdG9yIHN0cmluZywgcmV0dXJucworICB0aGUgam9pbiBvZiBuIHN0cmluZ3MsIGVhY2ggZm9ybWF0dGVkIHdpdGggdGhlIGZvcm1hdCBzdHJpbmcgb24gYW4KKyAgaXRlcmF0b3IgcmFuZ2VkIGZyb20gMSB0byBuLgorCisgIEV4YW1wbGU6CisKKyAgSXRlcigzLCAndiVzJywgc2VwPScsICcpIHJldHVybnMgJ3YxLCB2MiwgdjMnLgorICAiIiIKKworICAjIEhvdyBtYW55ICclcycgc3BlY3MgYXJlIGluIGZvcm1hdD8KKyAgc3BlY19jb3VudCA9IGxlbihmb3JtYXQuc3BsaXQoJyVzJykpIC0gMQorICByZXR1cm4gc2VwLmpvaW4oW2Zvcm1hdCAlIChzcGVjX2NvdW50ICogKGksKSkgZm9yIGkgaW4gT25lVG8obildKQorCisKK2RlZiBJbXBsZW1lbnRhdGlvbkZvckFyaXR5KG4pOgorICAiIiJSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBuLWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4iIiIKKworICAjIEEgbWFwIHRoZSBkZWZpbmVzIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gdGVtcGxhdGUuCisgIERFRlMgPSB7CisgICAgJ24nIDogc3RyKG4pLAorICAgICd2cycgOiBJdGVyKG4sICd2JXMnLCBzZXA9JywgJyksCisgICAgJ3Z0cycgOiBJdGVyKG4sICcjdiVzJywgc2VwPScsICcpLAorICAgICdhcml0eScgOiBBcml0eShuKSwKKyAgICAnQXJpdHknIDogVGl0bGUoQXJpdHkobikpCisgICAgfQorCisgIGltcGwgPSAiIiIKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQlKG4pcy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCIiIiAlIERFRlMKKworICBpbXBsICs9IEl0ZXIobiwgIiIiLAorICAgICAgICAgIHR5cGVuYW1lIFQlcyIiIikKKworICBpbXBsICs9ICIiIj4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkJShuKXNIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0IiIiICUgREVGUworCisgIGltcGwgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZSVzIiIiKQorCisgIGltcGwgKz0gIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCIiIgorCisgIGltcGwgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCVzJiB2JXMiIiIpCisKKyAgaW1wbCArPSAiIiIpIHsKKyAgaWYgKHByZWQoJSh2cylzKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworIiIiICUgREVGUworCisgIGltcGwgKz0gJyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiJworCisgIGltcGwgKz0gSXRlcihuLCAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlJXMiIiIsIHNlcD0nIDw8ICIsICInKQorCisgIGltcGwgKz0gJyA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIicKKworICBpbXBsICs9IEl0ZXIobiwgIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxcbiIgPDwgZSVzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdiVzIiIiKQorCisgIGltcGwgKz0gIiIiOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVCUobilzLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVCUobilzXyhwcmVkX2Zvcm1hdCwgJSh2cylzLCBvbl9mYWlsdXJlKVxcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoJSh2dHMpcywgJSh2cylzKSxcXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQlKG4pcy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQlKG4pc18ocHJlZCwgJSh2cylzLCBvbl9mYWlsdXJlKVxcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkJShuKXNIZWxwZXIoI3ByZWQiIiIgJSBERUZTCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwgXFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2JXMiIiIpCisKKyAgaW1wbCArPSAiIiIsIFxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkIiIiCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwgXFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYlcyIiIikKKworICBpbXBsICs9ICIiIiksIG9uX2ZhaWx1cmUpCisKKy8vICUoQXJpdHkpcyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUJShuKXMocHJlZF9mb3JtYXQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQlKG4pc18ocHJlZF9mb3JtYXQsICUodnMpcywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEJShuKXMocHJlZCwgJSh2cylzKSBcXAorICBHVEVTVF9QUkVEJShuKXNfKHByZWQsICUodnMpcywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVCUobilzKHByZWRfZm9ybWF0LCAlKHZzKXMpIFxcCisgIEdURVNUX1BSRURfRk9STUFUJShuKXNfKHByZWRfZm9ybWF0LCAlKHZzKXMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRCUobilzKHByZWQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRCUobilzXyhwcmVkLCAlKHZzKXMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisiIiIgJSBERUZTCisKKyAgcmV0dXJuIGltcGwKKworCitkZWYgSGVhZGVyUG9zdGFtYmxlKCk6CisgICIiIlJldHVybnMgdGhlIHBvc3RhbWJsZSBmb3IgdGhlIGhlYWRlciBmaWxlLiIiIgorCisgIHJldHVybiAiIiIKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworIiIiCisKKworZGVmIEdlbmVyYXRlRmlsZShwYXRoLCBjb250ZW50KToKKyAgIiIiR2l2ZW4gYSBmaWxlIHBhdGggYW5kIGEgY29udGVudCBzdHJpbmcsIG92ZXJ3cml0ZXMgaXQgd2l0aCB0aGUKKyAgZ2l2ZW4gY29udGVudC4iIiIKKworICBwcmludCAnVXBkYXRpbmcgZmlsZSAlcyAuIC4gLicgJSBwYXRoCisKKyAgZiA9IGZpbGUocGF0aCwgJ3crJykKKyAgcHJpbnQgPj5mLCBjb250ZW50LAorICBmLmNsb3NlKCkKKworICBwcmludCAnRmlsZSAlcyBoYXMgYmVlbiB1cGRhdGVkLicgJSBwYXRoCisKKworZGVmIEdlbmVyYXRlSGVhZGVyKG4pOgorICAiIiJHaXZlbiB0aGUgbWF4aW11bSBhcml0eSBuLCB1cGRhdGVzIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGltcGxlbWVudHMKKyAgdGhlIHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgIEdlbmVyYXRlRmlsZShIRUFERVIsCisgICAgICAgICAgICAgICBIZWFkZXJQcmVhbWJsZShuKQorICAgICAgICAgICAgICAgKyAnJy5qb2luKFtJbXBsZW1lbnRhdGlvbkZvckFyaXR5KGkpIGZvciBpIGluIE9uZVRvKG4pXSkKKyAgICAgICAgICAgICAgICsgSGVhZGVyUG9zdGFtYmxlKCkpCisKKworZGVmIFVuaXRUZXN0UHJlYW1ibGUoKToKKyAgIiIiUmV0dXJucyB0aGUgcHJlYW1ibGUgZm9yIHRoZSB1bml0IHRlc3QgZmlsZS4iIiIKKworICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHByZWFtYmxlIHRlbXBsYXRlLgorICBERUZTID0geworICAgICd0b2RheScgOiB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWScpLAorICAgICd5ZWFyJyA6IHRpbWUuc3RyZnRpbWUoJyVZJyksCisgICAgJ2NvbW1hbmQnIDogJyVzICVzJyAlIChvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSwgc3lzLmFyZ3ZbMV0pLAorICAgIH0KKworICByZXR1cm4gKAorIiIiLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gJSh0b2RheSlzIGJ5IGNvbW1hbmQKKy8vICclKGNvbW1hbmQpcycuICBETyBOT1QgRURJVCBCWSBIQU5EIQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGd0ZXN0X3ByZWRfaW1wbC5oCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIHNjcmlwdCBhbmQgcXVpdGUgbG9uZy4gIElmIHlvdSBpbnRlbmQgdG8KKy8vIGxlYXJuIGhvdyBHb29nbGUgVGVzdCB3b3JrcyBieSByZWFkaW5nIGl0cyB1bml0IHRlc3RzLCByZWFkCisvLyBndGVzdF91bml0dGVzdC5jYyBpbnN0ZWFkLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBHb29nbGUgVGVzdCBwcmVkaWNhdGUKKy8vIGFzc2VydGlvbnMuICBXZSBjb21waWxlIGl0IGFzIHBhcnQgb2YgdGhlIGd0ZXN0X3VuaXR0ZXN0IHRhcmdldAorLy8gb25seSB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiB0aWR5IGFuZCBjb21wYWN0LCBhcyBpdCBpcyBxdWl0ZQorLy8gaW52b2x2ZWQgdG8gc2V0IHVwIHRoZSBzdGFnZSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCB1c2luZyBHb29nbGUKKy8vIFRlc3QgaXRzZWxmLgorLy8KKy8vIEN1cnJlbnRseSwgZ3Rlc3RfdW5pdHRlc3QgdGFrZXMgfjExIHNlY29uZHMgdG8gcnVuIGluIHRoZSB0ZXN0aW5nCisvLyBkYWVtb24uICBJbiB0aGUgZnV0dXJlLCBpZiBpdCBncm93cyB0b28gbGFyZ2UgYW5kIG5lZWRzIG11Y2ggbW9yZQorLy8gdGltZSB0byBmaW5pc2gsIHdlIHNob3VsZCBjb25zaWRlciBzZXBhcmF0aW5nIHRoaXMgZmlsZSBpbnRvIGEKKy8vIHN0YW5kLWFsb25lIHJlZ3Jlc3Npb24gdGVzdC4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gQSB1c2VyLWRlZmluZWQgZGF0YSB0eXBlLgorc3RydWN0IEJvb2wgeworICBleHBsaWNpdCBCb29sKGludCB2YWwpIDogdmFsdWUodmFsICE9IDApIHt9CisKKyAgYm9vbCBvcGVyYXRvcj4oaW50IG4pIGNvbnN0IHsgcmV0dXJuIHZhbHVlID4gQm9vbChuKS52YWx1ZTsgfQorCisgIEJvb2wgb3BlcmF0b3IrKGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gQm9vbCh2YWx1ZSArIHJocy52YWx1ZSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiB2YWx1ZSA9PSByaHMudmFsdWU7IH0KKworICBib29sIHZhbHVlOworfTsKKworLy8gRW5hYmxlcyBCb29sIHRvIGJlIHVzZWQgaW4gYXNzZXJ0aW9ucy4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCb29sJiB4KSB7CisgIHJldHVybiBvcyA8PCAoeC52YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCisiIiIgJSBERUZTKQorCisKK2RlZiBUZXN0c0ZvckFyaXR5KG4pOgorICAiIiJSZXR1cm5zIHRoZSB0ZXN0cyBmb3Igbi1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuIiIiCisKKyAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzLgorICBERUZTID0geworICAgICduJyA6IG4sCisgICAgJ2VzJyA6IEl0ZXIobiwgJ2UlcycsIHNlcD0nLCAnKSwKKyAgICAndnMnIDogSXRlcihuLCAndiVzJywgc2VwPScsICcpLAorICAgICd2dHMnIDogSXRlcihuLCAnI3YlcycsIHNlcD0nLCAnKSwKKyAgICAndHZzJyA6IEl0ZXIobiwgJ1QlcyB2JXMnLCBzZXA9JywgJyksCisgICAgJ2ludF92cycgOiBJdGVyKG4sICdpbnQgdiVzJywgc2VwPScsICcpLAorICAgICdCb29sX3ZzJyA6IEl0ZXIobiwgJ0Jvb2wgdiVzJywgc2VwPScsICcpLAorICAgICd0eXBlcycgOiBJdGVyKG4sICd0eXBlbmFtZSBUJXMnLCBzZXA9JywgJyksCisgICAgJ3Zfc3VtJyA6IEl0ZXIobiwgJ3YlcycsIHNlcD0nICsgJyksCisgICAgJ2FyaXR5JyA6IEFyaXR5KG4pLAorICAgICdBcml0eScgOiBUaXRsZShBcml0eShuKSksCisgICAgfQorCisgIHRlc3RzID0gKAorIiIiLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyAlKGFyaXR5KXMgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgJShhcml0eSlzIHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDwlKHR5cGVzKXM+Citib29sIFByZWRGdW5jdGlvbiUobilzKCUodHZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbiUobilzSW50KCUoaW50X3ZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbiUobilzQm9vbCglKEJvb2xfdnMpcykgeworICByZXR1cm4gJSh2X3N1bSlzID4gMDsKK30KKyIiIiAlIERFRlMpCisKKyAgdGVzdHMgKz0gIiIiCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvciUobilzIHsKKyAgdGVtcGxhdGUgPCUodHlwZXMpcz4KKyAgYm9vbCBvcGVyYXRvcigpKCIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICdjb25zdCBUJXMmIHYlcycsIHNlcD0iIiIsCisgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgdGVzdHMgKz0gIiIiKSB7CisgICAgcmV0dXJuICUodl9zdW0pcyA+IDA7CisgIH0KK307CisiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gIiIiCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPCUodHlwZXMpcz4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24lKG4pcygiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgY2hhciogZSVzJywgc2VwPSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworICB0ZXN0cyArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQlcyYgdiVzIiIiKQorCisgIHRlc3RzICs9ICIiIikgeworICBpZiAoUHJlZEZ1bmN0aW9uJShuKXMoJSh2cylzKSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICdlJXMnLCBzZXA9JyA8PCAiICsgIiA8PCAnKQorCisgIHRlc3RzICs9ICIiIgorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCAlKHZfc3VtKXMgPDwgIi4iOworfQorIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gQSAlKGFyaXR5KXMgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yJShuKXMgeworICB0ZW1wbGF0ZSA8JSh0eXBlcylzPgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKSgiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgY2hhciogZSVzJywgc2VwPSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJXMmIHYlcyIiIikKKworICB0ZXN0cyArPSAiIiIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uJShuKXMoJShlcylzLCAlKHZzKXMpOworICB9Cit9OworIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVCUobilzLgorCitjbGFzcyBQcmVkaWNhdGUlKG4pc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7IiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorICAgICIiIiArIEl0ZXIobiwgJ24lc18gPSAnKSArICIiIjA7CisgIH0KKyIiIgorCisgIHRlc3RzICs9ICIiIgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4iIiIKKworICB0ZXN0cyArPSAnJy5qb2luKFsiIiIKKyAgICBFWFBFQ1RfRVEoMSwgbiVzXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAlcyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsiIiIgJSAoaSwgaSArIDEpIGZvciBpIGluIE9uZVRvKG4pXSkKKworICB0ZXN0cyArPSAiIiIKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworIiIiICUgREVGUworCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiCisgIHN0YXRpYyBpbnQgbiVzXzsiIiIpCisKKyAgdGVzdHMgKz0gIiIiCit9OworCitib29sIFByZWRpY2F0ZSUobilzVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlJShuKXNUZXN0OjpmaW5pc2hlZF87CisiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAiIiJpbnQgUHJlZGljYXRlJSUobilzVGVzdDo6biVzXzsKKyIiIikgJSBERUZTCisKKyAgdGVzdHMgKz0gIiIiCit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBFWFBFQ1RfUFJFRCUobilzVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlJShuKXNUZXN0IEFTU0VSVF9QUkVEJShuKXNUZXN0OworIiIiICUgREVGUworCisgIGRlZiBHZW5UZXN0KHVzZV9mb3JtYXQsIHVzZV9hc3NlcnQsIGV4cGVjdF9mYWlsdXJlLAorICAgICAgICAgICAgICB1c2VfZnVuY3RvciwgdXNlX3VzZXJfdHlwZSk6CisgICAgIiIiUmV0dXJucyB0aGUgdGVzdCBmb3IgYSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3JvLgorCisgICAgQXJnczoKKyAgICAgIHVzZV9mb3JtYXQ6ICAgICB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEgKl9QUkVEX0ZPUk1BVCouCisgICAgICB1c2VfYXNzZXJ0OiAgICAgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhIEFTU0VSVF8qLgorICAgICAgZXhwZWN0X2ZhaWx1cmU6IHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgZXhwZWN0ZWQgdG8gZmFpbC4KKyAgICAgIHVzZV9mdW5jdG9yOiAgICB0cnVlIGlmZiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGFzc2VydGlvbiBpcworICAgICAgICAgICAgICAgICAgICAgIGEgZnVuY3RvciAoYXMgb3Bwb3NlZCB0byBhIGZ1bmN0aW9uKQorICAgICAgdXNlX3VzZXJfdHlwZTogIHRydWUgaWZmIHRoZSBwcmVkaWNhdGUgZnVuY3Rvci9mdW5jdGlvbiB0YWtlcworICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50KHMpIG9mIGEgdXNlci1kZWZpbmVkIHR5cGUuCisKKyAgICBFeGFtcGxlOgorCisgICAgICBHZW5UZXN0KDEsIDAsIDAsIDEsIDApIHJldHVybnMgYSB0ZXN0IHRoYXQgdGVzdHMgdGhlIGJlaGF2aW9yCisgICAgICBvZiBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUbigpIHRoYXQgdGFrZXMgYSBmdW5jdG9yCisgICAgICB3aG9zZSBhcmd1bWVudHMgaGF2ZSBidWlsdC1pbiB0eXBlcy4iIiIKKworICAgIGlmIHVzZV9hc3NlcnQ6CisgICAgICBhc3NydCA9ICdBU1NFUlQnICAjICdhc3NlcnQnIGlzIHJlc2VydmVkLCBzbyB3ZSBjYW5ub3QgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoYXQgaWRlbnRpZmllciBoZXJlLgorICAgIGVsc2U6CisgICAgICBhc3NydCA9ICdFWFBFQ1QnCisKKyAgICBhc3NlcnRpb24gPSBhc3NydCArICdfUFJFRCcKKworICAgIGlmIHVzZV9mb3JtYXQ6CisgICAgICBwcmVkX2Zvcm1hdCA9ICdQcmVkRm9ybWF0JworICAgICAgYXNzZXJ0aW9uICs9ICdfRk9STUFUJworICAgIGVsc2U6CisgICAgICBwcmVkX2Zvcm1hdCA9ICdQcmVkJworCisgICAgYXNzZXJ0aW9uICs9ICclKG4pcycgJSBERUZTCisKKyAgICBpZiB1c2VfZnVuY3RvcjoKKyAgICAgIHByZWRfZm9ybWF0X3R5cGUgPSAnZnVuY3RvcicKKyAgICAgIHByZWRfZm9ybWF0ICs9ICdGdW5jdG9yJShuKXMoKScKKyAgICBlbHNlOgorICAgICAgcHJlZF9mb3JtYXRfdHlwZSA9ICdmdW5jdGlvbicKKyAgICAgIHByZWRfZm9ybWF0ICs9ICdGdW5jdGlvbiUobilzJworICAgICAgaWYgbm90IHVzZV9mb3JtYXQ6CisgICAgICAgIGlmIHVzZV91c2VyX3R5cGU6CisgICAgICAgICAgcHJlZF9mb3JtYXQgKz0gJ0Jvb2wnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJlZF9mb3JtYXQgKz0gJ0ludCcKKworICAgIHRlc3RfbmFtZSA9IHByZWRfZm9ybWF0X3R5cGUudGl0bGUoKQorCisgICAgaWYgdXNlX3VzZXJfdHlwZToKKyAgICAgIGFyZ190eXBlID0gJ3VzZXItZGVmaW5lZCB0eXBlIChCb29sKScKKyAgICAgIHRlc3RfbmFtZSArPSAnT25Vc2VyVHlwZScKKyAgICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgICBhcmcgPSAnQm9vbChuJXNfKyspJworICAgICAgZWxzZToKKyAgICAgICAgYXJnID0gJ0Jvb2woKytuJXNfKScKKyAgICBlbHNlOgorICAgICAgYXJnX3R5cGUgPSAnYnVpbHQtaW4gdHlwZSAoaW50KScKKyAgICAgIHRlc3RfbmFtZSArPSAnT25CdWlsdEluVHlwZScKKyAgICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgICBhcmcgPSAnbiVzXysrJworICAgICAgZWxzZToKKyAgICAgICAgYXJnID0gJysrbiVzXycKKworICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgc3VjY2Vzc2Z1bF9vcl9mYWlsZWQgPSAnZmFpbGVkJworICAgICAgZXhwZWN0ZWRfb3Jfbm90ID0gJ2V4cGVjdGVkLicKKyAgICAgIHRlc3RfbmFtZSArPSAgJ0ZhaWx1cmUnCisgICAgZWxzZToKKyAgICAgIHN1Y2Nlc3NmdWxfb3JfZmFpbGVkID0gJ3N1Y2Nlc3NmdWwnCisgICAgICBleHBlY3RlZF9vcl9ub3QgPSAnVU5FWFBFQ1RFRCEnCisgICAgICB0ZXN0X25hbWUgKz0gICdTdWNjZXNzJworCisgICAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSB0ZXN0IHRlbXBsYXRlLgorICAgIGRlZnMgPSBERUZTLmNvcHkoKQorICAgIGRlZnMudXBkYXRlKHsKKyAgICAgICdhc3NlcnQnIDogYXNzcnQsCisgICAgICAnYXNzZXJ0aW9uJyA6IGFzc2VydGlvbiwKKyAgICAgICd0ZXN0X25hbWUnIDogdGVzdF9uYW1lLAorICAgICAgJ3BmX3R5cGUnIDogcHJlZF9mb3JtYXRfdHlwZSwKKyAgICAgICdwZicgOiBwcmVkX2Zvcm1hdCwKKyAgICAgICdhcmdfdHlwZScgOiBhcmdfdHlwZSwKKyAgICAgICdhcmcnIDogYXJnLAorICAgICAgJ3N1Y2Nlc3NmdWwnIDogc3VjY2Vzc2Z1bF9vcl9mYWlsZWQsCisgICAgICAnZXhwZWN0ZWQnIDogZXhwZWN0ZWRfb3Jfbm90LAorICAgICAgfSkKKworICAgIHRlc3QgPSAiIiIKKy8vIFRlc3RzIGEgJShzdWNjZXNzZnVsKXMgJShhc3NlcnRpb24pcyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSAlKHBmX3R5cGUpcyBvbiBhICUoYXJnX3R5cGUpcy4KK1RFU1RfRiglKGFzc2VydGlvbilzVGVzdCwgJSh0ZXN0X25hbWUpcykgeyIiIiAlIGRlZnMKKworICAgIGluZGVudCA9IChsZW4oYXNzZXJ0aW9uKSArIDMpKicgJworICAgIGV4dHJhX2luZGVudCA9ICcnCisKKyAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgIGV4dHJhX2luZGVudCA9ICcgICcKKyAgICAgIGlmIHVzZV9hc3NlcnQ6CisgICAgICAgIHRlc3QgKz0gIiIiCisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UIiIiCisgICAgICBlbHNlOgorICAgICAgICB0ZXN0ICs9ICIiIgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQiIiIKKworICAgIHRlc3QgKz0gJ1xuJyArIGV4dHJhX2luZGVudCArICIiIiAgJShhc3NlcnRpb24pcyglKHBmKXMiIiIgJSBkZWZzCisKKyAgICB0ZXN0ID0gdGVzdCAlIGRlZnMKKyAgICB0ZXN0ICs9IEl0ZXIobiwgJyxcbicgKyBpbmRlbnQgKyBleHRyYV9pbmRlbnQgKyAnJShhcmcpcycgJSBkZWZzKQorICAgIHRlc3QgKz0gJyk7XG4nICsgZXh0cmFfaW5kZW50ICsgJyAgZmluaXNoZWRfID0gdHJ1ZTtcbicKKworICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgdGVzdCArPSAnICB9LCAiIik7XG4nCisKKyAgICB0ZXN0ICs9ICd9XG4nCisgICAgcmV0dXJuIHRlc3QKKworICAjIEdlbmVyYXRlcyB0ZXN0cyBmb3IgYWxsIDIqKjYgPSA2NCBjb21iaW5hdGlvbnMuCisgIHRlc3RzICs9ICcnLmpvaW4oW0dlblRlc3QodXNlX2Zvcm1hdCwgdXNlX2Fzc2VydCwgZXhwZWN0X2ZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2Z1bmN0b3IsIHVzZV91c2VyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIGZvciB1c2VfZm9ybWF0IGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Fzc2VydCBpbiBbMCwgMV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGV4cGVjdF9mYWlsdXJlIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Z1bmN0b3IgaW4gWzAsIDFdCisgICAgICAgICAgICAgICAgICAgIGZvciB1c2VfdXNlcl90eXBlIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBdKQorCisgIHJldHVybiB0ZXN0cworCisKK2RlZiBVbml0VGVzdFBvc3RhbWJsZSgpOgorICAiIiJSZXR1cm5zIHRoZSBwb3N0YW1ibGUgZm9yIHRoZSB0ZXN0cy4iIiIKKworICByZXR1cm4gJycKKworCitkZWYgR2VuZXJhdGVVbml0VGVzdChuKToKKyAgIiIiUmV0dXJucyB0aGUgdGVzdHMgZm9yIHVwLXRvIG4tYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgIEdlbmVyYXRlRmlsZShVTklUX1RFU1QsCisgICAgICAgICAgICAgICBVbml0VGVzdFByZWFtYmxlKCkKKyAgICAgICAgICAgICAgICsgJycuam9pbihbVGVzdHNGb3JBcml0eShpKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisgICAgICAgICAgICAgICArIFVuaXRUZXN0UG9zdGFtYmxlKCkpCisKKworZGVmIF9NYWluKCk6CisgICIiIlRoZSBlbnRyeSBwb2ludCBvZiB0aGUgc2NyaXB0LiAgR2VuZXJhdGVzIHRoZSBoZWFkZXIgZmlsZSBhbmQgaXRzCisgIHVuaXQgdGVzdC4iIiIKKworICBpZiBsZW4oc3lzLmFyZ3YpICE9IDI6CisgICAgcHJpbnQgX19kb2NfXworICAgIHByaW50ICdBdXRob3I6ICcgKyBfX2F1dGhvcl9fCisgICAgc3lzLmV4aXQoMSkKKworICBuID0gaW50KHN5cy5hcmd2WzFdKQorICBHZW5lcmF0ZUhlYWRlcihuKQorICBHZW5lcmF0ZVVuaXRUZXN0KG4pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgX01haW4oKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzI2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy9ndGVzdC1jb25maWcuaW4KQEAgLTAsMCArMSwyNzQgQEAKKyMhL2Jpbi9zaAorCisjIFRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCituYW1lPSJAUEFDS0FHRV9UQVJOQU1FQCIKK3ZlcnNpb249IkBQQUNLQUdFX1ZFUlNJT05AIgorCitzaG93X3VzYWdlKCkKK3sKKyAgZWNobyAiVXNhZ2U6IGd0ZXN0LWNvbmZpZyBbT1BUSU9OUy4uLl0iCit9CisKK3Nob3dfaGVscCgpCit7CisgIHNob3dfdXNhZ2UKKyAgY2F0IDw8XEVPRgorCitUaGUgYGd0ZXN0LWNvbmZpZycgc2NyaXB0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbmVjZXNzYXJ5IGNvbXBpbGUgYW5kIGxpbmtpbmcKK2ZsYWdzIHRvIGNvbm5lY3Qgd2l0aCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLCBib3RoIGluIGEgYnVpbGQgcHJpb3IgdG8KK2luc3RhbGxhdGlvbiwgYW5kIG9uIHRoZSBzeXN0ZW0gcHJvcGVyIGFmdGVyIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbgorb3ZlcnJpZGVzIG1heSBiZSBpc3N1ZWQgaW4gY29tYmluYXRpb24gd2l0aCBhbnkgb3RoZXIgcXVlcmllcywgYnV0IHdpbGwgb25seQorYWZmZWN0IGluc3RhbGxhdGlvbiBxdWVyaWVzIGlmIGNhbGxlZCBvbiBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIGd0ZXN0LiBUaGUKK2luc3RhbGxhdGlvbiBxdWVyaWVzIG1heSBub3QgYmUgaXNzdWVkIHdpdGggYW55IG90aGVyIHR5cGVzIG9mIHF1ZXJpZXMsIGFuZAorb25seSBvbmUgaW5zdGFsbGF0aW9uIHF1ZXJ5IG1heSBiZSBtYWRlIGF0IGEgdGltZS4gVGhlIHZlcnNpb24gcXVlcmllcyBhbmQKK2NvbXBpbGVyIGZsYWcgcXVlcmllcyBtYXkgYmUgY29tYmluZWQgYXMgZGVzaXJlZCBidXQgbm90IG1peGVkLiBEaWZmZXJlbnQKK3ZlcnNpb24gcXVlcmllcyBhcmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggbG9naWNhbCAiYW5kIiBzZW1hbnRpY3MsIGFuZCBvbmx5IHRoZQorbGFzdCBvZiBhbnkgcGFydGljdWxhciBxdWVyeSBpcyB1c2VkIHdoaWxlIGFsbCBwcmV2aW91cyBvbmVzIGlnbm9yZWQuIEFsbAordmVyc2lvbnMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzLgorQ29tcGlsZXIgZmxhZyBxdWVyaWVzIG91dHB1dCB0aGUgdW5pb24gb2YgdGhlIHNldHMgb2YgZmxhZ3Mgd2hlbiBjb21iaW5lZC4KKworIEV4YW1wbGVzOgorICBndGVzdC1jb25maWcgLS1taW4tdmVyc2lvbj0xLjAgfHwgZWNobyAiSW5zdWZmaWNpZW50IEdvb2dsZSBUZXN0IHZlcnNpb24uIgorCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWNwcGZsYWdzIC0tY3h4ZmxhZ3MpIC1vIGZvby5vIC1jIGZvby5jcHAKKyAgZysrICQoZ3Rlc3QtY29uZmlnIC0tbGRmbGFncyAtLWxpYnMpIC1vIGZvbyBmb28ubworCisgICMgV2hlbiB1c2luZyBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIEdvb2dsZSBUZXN0OgorICBnKysgJCguLi8uLi9teV9ndGVzdF9idWlsZC9zY3JpcHRzL2d0ZXN0LWNvbmZpZyAuLi4pIC4uLgorCisgICMgV2hlbiB1c2luZyBhbiBpbnN0YWxsZWQgR29vZ2xlIFRlc3QsIGJ1dCB3aXRoIGluc3RhbGxhdGlvbiBvdmVycmlkZXM6CisgIGV4cG9ydCBHVEVTVF9QUkVGSVg9Ii9vcHQiCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWxpYmRpcj0iL29wdC9saWI2NCIgLi4uKSAuLi4KKworIEhlbHA6CisgIC0tdXNhZ2UgICAgICAgICAgICAgICAgICAgIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKKworIEluc3RhbGxhdGlvbiBPdmVycmlkZXM6CisgIC0tcHJlZml4PTxkaXI+ICAgICAgICAgICAgIG92ZXJyaWRlcyB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWV4ZWMtcHJlZml4PTxkaXI+ICAgICAgICBvdmVycmlkZXMgdGhlIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWxpYmRpcj08ZGlyPiAgICAgICAgICAgICBvdmVycmlkZXMgdGhlIGxpYnJhcnkgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWluY2x1ZGVkaXI9PGRpcj4gICAgICAgICBvdmVycmlkZXMgdGhlIGhlYWRlciBmaWxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKworIEluc3RhbGxhdGlvbiBRdWVyaWVzOgorICAtLXByZWZpeCAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gcHJlZml4CisgIC0tZXhlYy1wcmVmaXggICAgICAgICAgICAgIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWxpYmRpciAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgLS1pbmNsdWRlZGlyICAgICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQorICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFRlc3QgaW5zdGFsbGF0aW9uCisKKyBWZXJzaW9uIFF1ZXJpZXM6CisgIC0tbWluLXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IGxlYXN0IFZFUlNJT04KKyAgLS1leGFjdC12ZXJzaW9uPVZFUlNJT04gICAgcmV0dXJuIDAgaWYgdGhlIHZlcnNpb24gaXMgZXhhY3RseSBWRVJTSU9OCisgIC0tbWF4LXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IG1vc3QgVkVSU0lPTgorCisgQ29tcGlsYXRpb24gRmxhZyBRdWVyaWVzOgorICAtLWNwcGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIHNwZWNpZmljIHRvIHRoZSBDLWxpa2UgcHJlcHJvY2Vzc29ycworICAtLWN4eGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIGFwcHJvcHJpYXRlIGZvciBDKysgcHJvZ3JhbXMKKyAgLS1sZGZsYWdzICAgICAgICAgICAgICAgICAgbGlua2VyIGZsYWdzCisgIC0tbGlicyAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBmb3IgbGlua2luZworCitFT0YKK30KKworIyBUaGlzIGZ1bmN0aW9uIGJvdW5kcyBvdXIgdmVyc2lvbiB3aXRoIGEgbWluIGFuZCBhIG1heC4gSXQgdXNlcyBzb21lIGNsZXZlcgorIyBQT1NJWC1jb21wbGlhbnQgdmFyaWFibGUgZXhwYW5zaW9uIHRvIHBvcnRhYmx5IGRvIGFsbCB0aGUgd29yayBpbiB0aGUgc2hlbGwKKyMgYW5kIGF2b2lkIGFueSBkZXBlbmRlbmN5IG9uIGEgcGFydGljdWxhciAic2VkIiBvciAiYXdrIiBpbXBsZW1lbnRhdGlvbi4KKyMgTm90YWJsZSBpcyB0aGF0IGl0IHdpbGwgb25seSBldmVyIGNvbXBhcmUgdGhlIGZpcnN0IDMgY29tcG9uZW50cyBvZiB2ZXJzaW9ucy4KKyMgRnVydGhlciBjb21wb25lbnRzIHdpbGwgYmUgY2xlYW5seSBzdHJpcHBlZCBvZmYuIEFsbCB2ZXJzaW9ucyBtdXN0IGJlCisjIHVuYWRvcm5lZCwgc28gInYxLjAiIHdpbGwgKm5vdCogd29yay4gVGhlIG1pbmltdW0gdmVyc2lvbiBtdXN0IGJlIGluICQxLCBhbmQKKyMgdGhlIG1heCBpbiAkMi4gVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IElmIHRoaXMgZXZlciBicmVha3MsIHdlIHNob3VsZAorIyBpbnZlc3RpZ2F0ZSBleHBhbmRpbmcgdGhpcyB2aWEgYXV0b200dGUgZnJvbSBBU19WRVJTSU9OX0NPTVBBUkUgcmF0aGVyIHRoYW4KKyMgY29udGludWluZyB0byBtYWludGFpbiBvdXIgb3duIHNoZWxsIHZlcnNpb24uCitjaGVja192ZXJzaW9ucygpCit7CisgIG1ham9yX3ZlcnNpb249JHt2ZXJzaW9uJSUuKn0KKyAgbWlub3JfdmVyc2lvbj0iMCIKKyAgcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHt2ZXJzaW9uIyoufSIgIT0gIiR7dmVyc2lvbn0iOyB0aGVuCisgICAgbWlub3JfdmVyc2lvbj0ke3ZlcnNpb24jKi59CisgICAgbWlub3JfdmVyc2lvbj0ke21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke3ZlcnNpb24jKi4qLn0iICE9ICIke3ZlcnNpb259IjsgdGhlbgorICAgIHBvaW50X3ZlcnNpb249JHt2ZXJzaW9uIyouKi59CisgICAgcG9pbnRfdmVyc2lvbj0ke3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIG1pbl92ZXJzaW9uPSIkMSIKKyAgbWluX21ham9yX3ZlcnNpb249JHttaW5fdmVyc2lvbiUlLip9CisgIG1pbl9taW5vcl92ZXJzaW9uPSIwIgorICBtaW5fcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHttaW5fdmVyc2lvbiMqLn0iICE9ICIke21pbl92ZXJzaW9ufSI7IHRoZW4KKyAgICBtaW5fbWlub3JfdmVyc2lvbj0ke21pbl92ZXJzaW9uIyoufQorICAgIG1pbl9taW5vcl92ZXJzaW9uPSR7bWluX21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke21pbl92ZXJzaW9uIyouKi59IiAhPSAiJHttaW5fdmVyc2lvbn0iOyB0aGVuCisgICAgbWluX3BvaW50X3ZlcnNpb249JHttaW5fdmVyc2lvbiMqLioufQorICAgIG1pbl9wb2ludF92ZXJzaW9uPSR7bWluX3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIG1heF92ZXJzaW9uPSIkMiIKKyAgbWF4X21ham9yX3ZlcnNpb249JHttYXhfdmVyc2lvbiUlLip9CisgIG1heF9taW5vcl92ZXJzaW9uPSIwIgorICBtYXhfcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHttYXhfdmVyc2lvbiMqLn0iICE9ICIke21heF92ZXJzaW9ufSI7IHRoZW4KKyAgICBtYXhfbWlub3JfdmVyc2lvbj0ke21heF92ZXJzaW9uIyoufQorICAgIG1heF9taW5vcl92ZXJzaW9uPSR7bWF4X21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke21heF92ZXJzaW9uIyouKi59IiAhPSAiJHttYXhfdmVyc2lvbn0iOyB0aGVuCisgICAgbWF4X3BvaW50X3ZlcnNpb249JHttYXhfdmVyc2lvbiMqLioufQorICAgIG1heF9wb2ludF92ZXJzaW9uPSR7bWF4X3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSkgJiYgZXhpdCAxCisgIGlmIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSk7IHRoZW4KKyAgICB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fbWlub3JfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGlmIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9taW5vcl92ZXJzaW9uKSk7IHRoZW4KKyAgICAgIHRlc3QgJCgoJHBvaW50X3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9wb2ludF92ZXJzaW9uKSkgJiYgZXhpdCAxCisgICAgZmkKKyAgZmkKKworICB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpICYmIGV4aXQgMQorICBpZiB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpOyB0aGVuCisgICAgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1ndCAkKCgkbWF4X21pbm9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBpZiB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWlub3JfdmVyc2lvbikpOyB0aGVuCisgICAgICB0ZXN0ICQoKCRwb2ludF92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfcG9pbnRfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgZXhpdCAwCit9CisKKyMgU2hvdyB0aGUgdXNhZ2UgbGluZSB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLgoraWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBzaG93X3VzYWdlCisgIGV4aXQgMQorZmkKKword2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdXNhZ2UpICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAwOzsKKyAgICAtLWhlbHApICAgICAgICAgICBzaG93X2hlbHA7ICAgICAgICAgIGV4aXQgMDs7CisKKyAgICAjIEluc3RhbGxhdGlvbiBvdmVycmlkZXMKKyAgICAtLXByZWZpeD0qKSAgICAgICBHVEVTVF9QUkVGSVg9JHsxIy0tcHJlZml4PX07OworICAgIC0tZXhlYy1wcmVmaXg9KikgIEdURVNUX0VYRUNfUFJFRklYPSR7MSMtLWV4ZWMtcHJlZml4PX07OworICAgIC0tbGliZGlyPSopICAgICAgIEdURVNUX0xJQkRJUj0kezEjLS1saWJkaXI9fTs7CisgICAgLS1pbmNsdWRlZGlyPSopICAgR1RFU1RfSU5DTFVERURJUj0kezEjLS1pbmNsdWRlZGlyPX07OworCisgICAgIyBJbnN0YWxsYXRpb24gcXVlcmllcworICAgIC0tcHJlZml4fC0tZXhlYy1wcmVmaXh8LS1saWJkaXJ8LS1pbmNsdWRlZGlyfC0tdmVyc2lvbikKKyAgICAgIGlmIHRlc3QgLW4gIiR7ZG9fcXVlcnl9IjsgdGhlbgorICAgICAgICBzaG93X3VzYWdlCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICAgIGRvX3F1ZXJ5PSR7MSMtLX0KKyAgICAgIDs7CisKKyAgICAjIFZlcnNpb24gY2hlY2tpbmcKKyAgICAtLW1pbi12ZXJzaW9uPSopCisgICAgICBkb19jaGVja192ZXJzaW9ucz15ZXMKKyAgICAgIG1pbl92ZXJzaW9uPSR7MSMtLW1pbi12ZXJzaW9uPX0KKyAgICAgIDs7CisgICAgLS1tYXgtdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBtYXhfdmVyc2lvbj0kezEjLS1tYXgtdmVyc2lvbj19CisgICAgICA7OworICAgIC0tZXhhY3QtdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBleGFjdF92ZXJzaW9uPSR7MSMtLWV4YWN0LXZlcnNpb249fQorICAgICAgOzsKKworICAgICMgQ29tcGlsZXIgZmxhZyBvdXRwdXQKKyAgICAtLWNwcGZsYWdzKSAgICAgICBlY2hvX2NwcGZsYWdzPXllczs7CisgICAgLS1jeHhmbGFncykgICAgICAgZWNob19jeHhmbGFncz15ZXM7OworICAgIC0tbGRmbGFncykgICAgICAgIGVjaG9fbGRmbGFncz15ZXM7OworICAgIC0tbGlicykgICAgICAgICAgIGVjaG9fbGlicz15ZXM7OworCisgICAgIyBFdmVyeXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IKKyAgICAqKSAgICAgICAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMTs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworIyBUaGVzZSBoYXZlIGRlZmF1bHRzIGZpbGxlZCBpbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBidXQgY2FuIGFsc28gYmUKKyMgb3ZlcnJpZGRlbiBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCitwcmVmaXg9IiR7R1RFU1RfUFJFRklYOi1AcHJlZml4QH0iCitleGVjX3ByZWZpeD0iJHtHVEVTVF9FWEVDX1BSRUZJWDotQGV4ZWNfcHJlZml4QH0iCitsaWJkaXI9IiR7R1RFU1RfTElCRElSOi1AbGliZGlyQH0iCitpbmNsdWRlZGlyPSIke0dURVNUX0lOQ0xVREVESVI6LUBpbmNsdWRlZGlyQH0iCisKKyMgV2UgdHJ5IGFuZCBkZXRlY3QgaWYgb3VyIGJpbmFyeSBpcyBub3QgbG9jYXRlZCBhdCBpdHMgaW5zdGFsbGVkIGxvY2F0aW9uLiBJZgorIyBpdCdzIG5vdCwgd2UgcHJvdmlkZSB2YXJpYWJsZXMgcG9pbnRpbmcgdG8gdGhlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZSByYXRoZXIKKyMgdGhhbiB0byB0aGUgaW5zdGFsbCB0cmVlLiBUaGlzIGFsbG93cyBidWlsZGluZyBhZ2FpbnN0IGEganVzdC1idWlsdCBndGVzdAorIyByYXRoZXIgdGhhbiBhbiBpbnN0YWxsZWQgZ3Rlc3QuCitiaW5kaXI9IkBiaW5kaXJAIgordGhpc19yZWxhdGl2ZV9iaW5kaXI9YGRpcm5hbWUgJDBgCit0aGlzX2JpbmRpcj1gY2QgJHt0aGlzX3JlbGF0aXZlX2JpbmRpcn07IHB3ZCAtUGAKK2lmIHRlc3QgIiR7dGhpc19iaW5kaXJ9IiA9ICIke3RoaXNfYmluZGlyJSR7YmluZGlyfX0iOyB0aGVuCisgICMgVGhlIHBhdGggdG8gdGhlIHNjcmlwdCBkb2Vzbid0IGVuZCBpbiB0aGUgYmluZGlyIHNlcXVlbmNlIGZyb20gQXV0b2NvbmYsCisgICMgYXNzdW1lIHRoYXQgd2UgYXJlIGluIGEgYnVpbGQgdHJlZS4KKyAgYnVpbGRfZGlyPWBkaXJuYW1lICR7dGhpc19iaW5kaXJ9YAorICBzcmNfZGlyPWBjZCAke3RoaXNfYmluZGlyfS9AdG9wX3NyY2RpckA7IHB3ZCAtUGAKKworICAjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBUaGlzIGlzIGEgZGFuZ2Vyb3VzIGRlcGVuZGVuY3kgb24gbGlidG9vbCwgd2UKKyAgIyBzaG91bGQgd29yayB0byByZW1vdmUgaXQsIGFuZC9vciByZW1vdmUgbGlidG9vbCBhbHRvZ2V0aGVyLCByZXBsYWNpbmcgaXQKKyAgIyB3aXRoIGRpcmVjdCByZWZlcmVuY2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCBhIGxpbmsgcGF0aC4KKyAgZ3Rlc3RfbGlicz0iJHtidWlsZF9kaXJ9L2xpYi9saWJndGVzdC5sYSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNAIgorICBndGVzdF9sZGZsYWdzPSIiCisKKyAgIyBXZSBwcm92aWRlIGhvb2tzIHRvIGluY2x1ZGUgZnJvbSBlaXRoZXIgdGhlIHNvdXJjZSBvciBidWlsZCBkaXIsIHdoZXJlIHRoZQorICAjIGJ1aWxkIGRpciBpcyBhbHdheXMgcHJlZmVycmVkLiBUaGlzIHdpbGwgcG90ZW50aWFsbHkgYWxsb3cgdXMgdG8gd3JpdGUKKyAgIyBidWlsZCBydWxlcyBmb3IgZ2VuZXJhdGVkIGhlYWRlcnMgYW5kIGhhdmUgdGhlbSBhdXRvbWF0aWNhbGx5IGJlIHByZWZlcnJlZAorICAjIG92ZXIgcHJvdmlkZWQgdmVyc2lvbnMuCisgIGd0ZXN0X2NwcGZsYWdzPSItSSR7YnVpbGRfZGlyfS9pbmNsdWRlIC1JJHtzcmNfZGlyfS9pbmNsdWRlIgorICBndGVzdF9jeHhmbGFncz0iQFBUSFJFQURfQ0ZMQUdTQCIKK2Vsc2UKKyAgIyBXZSdyZSB1c2luZyBhbiBpbnN0YWxsZWQgZ3Rlc3QsIGFsdGhvdWdoIGl0IG1heSBiZSBzdGFnZWQgdW5kZXIgc29tZQorICAjIHByZWZpeC4gQXNzdW1lIChhcyBvdXIgb3duIGxpYnJhcmllcyBkbykgdGhhdCB3ZSBjYW4gcmVzb2x2ZSB0aGUgcHJlZml4LAorICAjIGFuZCBhcmUgcHJlc2VudCBpbiB0aGUgZHluYW1pYyBsaW5rIHBhdGhzLgorICBndGVzdF9sZGZsYWdzPSItTCR7bGliZGlyfSIKKyAgZ3Rlc3RfbGlicz0iLWwke25hbWV9IEBQVEhSRUFEX0NGTEFHU0AgQFBUSFJFQURfTElCU0AiCisgIGd0ZXN0X2NwcGZsYWdzPSItSSR7aW5jbHVkZWRpcn0iCisgIGd0ZXN0X2N4eGZsYWdzPSJAUFRIUkVBRF9DRkxBR1NAIgorZmkKKworIyBEbyBhbiBpbnN0YWxsYXRpb24gcXVlcnkgaWYgcmVxdWVzdGVkLgoraWYgdGVzdCAtbiAiJGRvX3F1ZXJ5IjsgdGhlbgorICBjYXNlICRkb19xdWVyeSBpbgorICAgIHByZWZpeCkgICAgICAgICAgIGVjaG8gJHByZWZpeDsgICAgICAgZXhpdCAwOzsKKyAgICBleGVjLXByZWZpeCkgICAgICBlY2hvICRleGVjX3ByZWZpeDsgIGV4aXQgMDs7CisgICAgbGliZGlyKSAgICAgICAgICAgZWNobyAkbGliZGlyOyAgICAgICBleGl0IDA7OworICAgIGluY2x1ZGVkaXIpICAgICAgIGVjaG8gJGluY2x1ZGVkaXI7ICAgZXhpdCAwOzsKKyAgICB2ZXJzaW9uKSAgICAgICAgICBlY2hvICR2ZXJzaW9uOyAgICAgIGV4aXQgMDs7CisgICAgKikgICAgICAgICAgICAgICAgc2hvd191c2FnZTsgICAgICAgICBleGl0IDE7OworICBlc2FjCitmaQorCisjIERvIGEgdmVyc2lvbiBjaGVjayBpZiByZXF1ZXN0ZWQuCitpZiB0ZXN0ICIkZG9fY2hlY2tfdmVyc2lvbnMiID0gInllcyI7IHRoZW4KKyAgIyBNYWtlIHN1cmUgd2UgZGlkbid0IHJlY2VpdmUgYSBiYWQgY29tYmluYXRpb24gb2YgcGFyYW1ldGVycy4KKyAgdGVzdCAiJGVjaG9fY3BwZmxhZ3MiID0gInllcyIgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKyAgdGVzdCAiJGVjaG9fY3h4ZmxhZ3MiID0gInllcyIgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKyAgdGVzdCAiJGVjaG9fbGRmbGFncyIgPSAieWVzIiAgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKyAgdGVzdCAiJGVjaG9fbGlicyIgPSAieWVzIiAgICAgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKworICBpZiB0ZXN0ICIkZXhhY3RfdmVyc2lvbiIgIT0gIiI7IHRoZW4KKyAgICBjaGVja192ZXJzaW9ucyAkZXhhY3RfdmVyc2lvbiAkZXhhY3RfdmVyc2lvbgorICAgICMgdW5yZWFjaGFibGUKKyAgZWxzZQorICAgIGNoZWNrX3ZlcnNpb25zICR7bWluX3ZlcnNpb246LTAuMC4wfSAke21heF92ZXJzaW9uOi05OTk5Ljk5OTkuOTk5OX0KKyAgICAjIHVucmVhY2hhYmxlCisgIGZpCitmaQorCisjIERvIHRoZSBvdXRwdXQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgc28gdGhhdCB0aGVzZSBjYW4gYmUgdXNlZCBpbi1saW5lIG9mCisjIGEgY29tcGlsZXIgaW52b2NhdGlvbi4KK291dHB1dD0iIgordGVzdCAiJGVjaG9fY3BwZmxhZ3MiID0gInllcyIgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9jcHBmbGFncyIKK3Rlc3QgIiRlY2hvX2N4eGZsYWdzIiA9ICJ5ZXMiICYmIG91dHB1dD0iJG91dHB1dCAkZ3Rlc3RfY3h4ZmxhZ3MiCit0ZXN0ICIkZWNob19sZGZsYWdzIiA9ICJ5ZXMiICAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2xkZmxhZ3MiCit0ZXN0ICIkZWNob19saWJzIiA9ICJ5ZXMiICAgICAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2xpYnMiCitlY2hvICRvdXRwdXQKKworZXhpdCAwCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy9wdW1wLnB5IGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NjcmlwdHMvcHVtcC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YWZlODA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NjcmlwdHMvcHVtcC5weQpAQCAtMCwwICsxLDg0NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIicHVtcCB2MC4yLjAgLSBQcmV0dHkgVXNlZnVsIGZvciBNZXRhIFByb2dyYW1taW5nLgorCitBIHRvb2wgZm9yIHByZXByb2Nlc3NvciBtZXRhIHByb2dyYW1taW5nLiAgVXNlZnVsIGZvciBnZW5lcmF0aW5nCityZXBldGl0aXZlIGJvaWxlcnBsYXRlIGNvZGUuICBFc3BlY2lhbGx5IHVzZWZ1bCBmb3Igd3JpdGluZyBDKysKK2NsYXNzZXMsIGZ1bmN0aW9ucywgbWFjcm9zLCBhbmQgdGVtcGxhdGVzIHRoYXQgbmVlZCB0byB3b3JrIHdpdGgKK3ZhcmlvdXMgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKworVVNBR0U6CisgICAgICAgcHVtcC5weSBTT1VSQ0VfRklMRQorCitFWEFNUExFUzoKKyAgICAgICBwdW1wLnB5IGZvby5jYy5wdW1wCisgICAgICAgICBDb252ZXJ0cyBmb28uY2MucHVtcCB0byBmb28uY2MuCisKK0dSQU1NQVI6CisgICAgICAgQ09ERSA6Oj0gQVRPTUlDX0NPREUqCisgICAgICAgQVRPTUlDX0NPREUgOjo9ICR2YXIgSUQgPSBFWFBSRVNTSU9OCisgICAgICAgICAgIHwgJHZhciBJRCA9IFtbIENPREUgXV0KKyAgICAgICAgICAgfCAkcmFuZ2UgSUQgRVhQUkVTU0lPTi4uRVhQUkVTU0lPTgorICAgICAgICAgICB8ICRmb3IgSUQgU0VQQVJBVE9SIFtbIENPREUgXV0KKyAgICAgICAgICAgfCAkKCQpCisgICAgICAgICAgIHwgJElECisgICAgICAgICAgIHwgJChFWFBSRVNTSU9OKQorICAgICAgICAgICB8ICRpZiBFWFBSRVNTSU9OIFtbIENPREUgXV0gRUxTRV9CUkFOQ0gKKyAgICAgICAgICAgfCBbWyBDT0RFIF1dCisgICAgICAgICAgIHwgUkFXX0NPREUKKyAgICAgICBTRVBBUkFUT1IgOjo9IFJBV19DT0RFIHwgRU1QVFkKKyAgICAgICBFTFNFX0JSQU5DSCA6Oj0gJGVsc2UgW1sgQ09ERSBdXQorICAgICAgICAgICB8ICRlbGlmIEVYUFJFU1NJT04gW1sgQ09ERSBdXSBFTFNFX0JSQU5DSAorICAgICAgICAgICB8IEVNUFRZCisgICAgICAgRVhQUkVTU0lPTiBoYXMgUHl0aG9uIHN5bnRheC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCisKK1RPS0VOX1RBQkxFID0gWworICAgIChyZS5jb21waWxlKHInXCR2YXJccysnKSwgJyR2YXInKSwKKyAgICAocmUuY29tcGlsZShyJ1wkZWxpZlxzKycpLCAnJGVsaWYnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkZWxzZVxzKycpLCAnJGVsc2UnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkZm9yXHMrJyksICckZm9yJyksCisgICAgKHJlLmNvbXBpbGUocidcJGlmXHMrJyksICckaWYnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkcmFuZ2VccysnKSwgJyRyYW5nZScpLAorICAgIChyZS5jb21waWxlKHInXCRbX0EtWmEtel1cdyonKSwgJyRpZCcpLAorICAgIChyZS5jb21waWxlKHInXCRcKFwkXCknKSwgJyQoJCknKSwKKyAgICAocmUuY29tcGlsZShyJ1wkJyksICckJyksCisgICAgKHJlLmNvbXBpbGUocidcW1xbXG4/JyksICdbWycpLAorICAgIChyZS5jb21waWxlKHInXF1cXVxuPycpLCAnXV0nKSwKKyAgICBdCisKKworY2xhc3MgQ3Vyc29yOgorICAiIiJSZXByZXNlbnRzIGEgcG9zaXRpb24gKGxpbmUgYW5kIGNvbHVtbikgaW4gYSB0ZXh0IGZpbGUuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmU9LTEsIGNvbHVtbj0tMSk6CisgICAgc2VsZi5saW5lID0gbGluZQorICAgIHNlbGYuY29sdW1uID0gY29sdW1uCisKKyAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBzZWxmLmxpbmUgPT0gcmhzLmxpbmUgYW5kIHNlbGYuY29sdW1uID09IHJocy5jb2x1bW4KKworICBkZWYgX19uZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIG5vdCBzZWxmID09IHJocworCisgIGRlZiBfX2x0X18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gc2VsZi5saW5lIDwgcmhzLmxpbmUgb3IgKAorICAgICAgICBzZWxmLmxpbmUgPT0gcmhzLmxpbmUgYW5kIHNlbGYuY29sdW1uIDwgcmhzLmNvbHVtbikKKworICBkZWYgX19sZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYgPCByaHMgb3Igc2VsZiA9PSByaHMKKworICBkZWYgX19ndF9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHJocyA8IHNlbGYKKworICBkZWYgX19nZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHJocyA8PSBzZWxmCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgaWYgc2VsZiA9PSBFb2YoKToKKyAgICAgIHJldHVybiAnRU9GJworICAgIGVsc2U6CisgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5saW5lICsgMSwgc2VsZi5jb2x1bW4pCisKKyAgZGVmIF9fYWRkX18oc2VsZiwgb2Zmc2V0KToKKyAgICByZXR1cm4gQ3Vyc29yKHNlbGYubGluZSwgc2VsZi5jb2x1bW4gKyBvZmZzZXQpCisKKyAgZGVmIF9fc3ViX18oc2VsZiwgb2Zmc2V0KToKKyAgICByZXR1cm4gQ3Vyc29yKHNlbGYubGluZSwgc2VsZi5jb2x1bW4gLSBvZmZzZXQpCisKKyAgZGVmIENsb25lKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHNlbGYuIiIiCisKKyAgICByZXR1cm4gQ3Vyc29yKHNlbGYubGluZSwgc2VsZi5jb2x1bW4pCisKKworIyBTcGVjaWFsIGN1cnNvciB0byBpbmRpY2F0ZSB0aGUgZW5kLW9mLWZpbGUuCitkZWYgRW9mKCk6CisgICIiIlJldHVybnMgdGhlIHNwZWNpYWwgY3Vyc29yIHRvIGRlbm90ZSB0aGUgZW5kLW9mLWZpbGUuIiIiCisgIHJldHVybiBDdXJzb3IoLTEsIC0xKQorCisKK2NsYXNzIFRva2VuOgorICAiIiJSZXByZXNlbnRzIGEgdG9rZW4gaW4gYSBQdW1wIHNvdXJjZSBmaWxlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydD1Ob25lLCBlbmQ9Tm9uZSwgdmFsdWU9Tm9uZSwgdG9rZW5fdHlwZT1Ob25lKToKKyAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgc2VsZi5zdGFydCA9IEVvZigpCisgICAgZWxzZToKKyAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgc2VsZi5lbmQgPSBFb2YoKQorICAgIGVsc2U6CisgICAgICBzZWxmLmVuZCA9IGVuZAorICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgIHNlbGYudG9rZW5fdHlwZSA9IHRva2VuX3R5cGUKKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gJ1Rva2VuIEAlczogXCclc1wnIHR5cGU9JXMnICUgKAorICAgICAgICBzZWxmLnN0YXJ0LCBzZWxmLnZhbHVlLCBzZWxmLnRva2VuX3R5cGUpCisKKyAgZGVmIENsb25lKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHNlbGYuIiIiCisKKyAgICByZXR1cm4gVG9rZW4oc2VsZi5zdGFydC5DbG9uZSgpLCBzZWxmLmVuZC5DbG9uZSgpLCBzZWxmLnZhbHVlLAorICAgICAgICAgICAgICAgICBzZWxmLnRva2VuX3R5cGUpCisKKworZGVmIFN0YXJ0c1dpdGgobGluZXMsIHBvcywgc3RyaW5nKToKKyAgIiIiUmV0dXJucyBUcnVlIGlmZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gbGluZXMgc3RhcnRzIHdpdGggJ3N0cmluZycuIiIiCisKKyAgcmV0dXJuIGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0uc3RhcnRzd2l0aChzdHJpbmcpCisKKworZGVmIEZpbmRGaXJzdEluTGluZShsaW5lLCB0b2tlbl90YWJsZSk6CisgIGJlc3RfbWF0Y2hfc3RhcnQgPSAtMQorICBmb3IgKHJlZ2V4LCB0b2tlbl90eXBlKSBpbiB0b2tlbl90YWJsZToKKyAgICBtID0gcmVnZXguc2VhcmNoKGxpbmUpCisgICAgaWYgbToKKyAgICAgICMgV2UgZm91bmQgcmVnZXggaW4gbGluZXMKKyAgICAgIGlmIGJlc3RfbWF0Y2hfc3RhcnQgPCAwIG9yIG0uc3RhcnQoKSA8IGJlc3RfbWF0Y2hfc3RhcnQ6CisgICAgICAgIGJlc3RfbWF0Y2hfc3RhcnQgPSBtLnN0YXJ0KCkKKyAgICAgICAgYmVzdF9tYXRjaF9sZW5ndGggPSBtLmVuZCgpIC0gbS5zdGFydCgpCisgICAgICAgIGJlc3RfbWF0Y2hfdG9rZW5fdHlwZSA9IHRva2VuX3R5cGUKKworICBpZiBiZXN0X21hdGNoX3N0YXJ0IDwgMDoKKyAgICByZXR1cm4gTm9uZQorCisgIHJldHVybiAoYmVzdF9tYXRjaF9zdGFydCwgYmVzdF9tYXRjaF9sZW5ndGgsIGJlc3RfbWF0Y2hfdG9rZW5fdHlwZSkKKworCitkZWYgRmluZEZpcnN0KGxpbmVzLCB0b2tlbl90YWJsZSwgY3Vyc29yKToKKyAgIiIiRmluZHMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW55IHN0cmluZyBpbiBzdHJpbmdzIGluIGxpbmVzLiIiIgorCisgIHN0YXJ0ID0gY3Vyc29yLkNsb25lKCkKKyAgY3VyX2xpbmVfbnVtYmVyID0gY3Vyc29yLmxpbmUKKyAgZm9yIGxpbmUgaW4gbGluZXNbc3RhcnQubGluZTpdOgorICAgIGlmIGN1cl9saW5lX251bWJlciA9PSBzdGFydC5saW5lOgorICAgICAgbGluZSA9IGxpbmVbc3RhcnQuY29sdW1uOl0KKyAgICBtID0gRmluZEZpcnN0SW5MaW5lKGxpbmUsIHRva2VuX3RhYmxlKQorICAgIGlmIG06CisgICAgICAjIFdlIGZvdW5kIGEgcmVnZXggaW4gbGluZS4KKyAgICAgIChzdGFydF9jb2x1bW4sIGxlbmd0aCwgdG9rZW5fdHlwZSkgPSBtCisgICAgICBpZiBjdXJfbGluZV9udW1iZXIgPT0gc3RhcnQubGluZToKKyAgICAgICAgc3RhcnRfY29sdW1uICs9IHN0YXJ0LmNvbHVtbgorICAgICAgZm91bmRfc3RhcnQgPSBDdXJzb3IoY3VyX2xpbmVfbnVtYmVyLCBzdGFydF9jb2x1bW4pCisgICAgICBmb3VuZF9lbmQgPSBmb3VuZF9zdGFydCArIGxlbmd0aAorICAgICAgcmV0dXJuIE1ha2VUb2tlbihsaW5lcywgZm91bmRfc3RhcnQsIGZvdW5kX2VuZCwgdG9rZW5fdHlwZSkKKyAgICBjdXJfbGluZV9udW1iZXIgKz0gMQorICAjIFdlIGZhaWxlZCB0byBmaW5kIHN0ciBpbiBsaW5lcworICByZXR1cm4gTm9uZQorCisKK2RlZiBTdWJTdHJpbmcobGluZXMsIHN0YXJ0LCBlbmQpOgorICAiIiJSZXR1cm5zIGEgc3Vic3RyaW5nIGluIGxpbmVzLiIiIgorCisgIGlmIGVuZCA9PSBFb2YoKToKKyAgICBlbmQgPSBDdXJzb3IobGVuKGxpbmVzKSAtIDEsIGxlbihsaW5lc1stMV0pKQorCisgIGlmIHN0YXJ0ID49IGVuZDoKKyAgICByZXR1cm4gJycKKworICBpZiBzdGFydC5saW5lID09IGVuZC5saW5lOgorICAgIHJldHVybiBsaW5lc1tzdGFydC5saW5lXVtzdGFydC5jb2x1bW46ZW5kLmNvbHVtbl0KKworICByZXN1bHRfbGluZXMgPSAoW2xpbmVzW3N0YXJ0LmxpbmVdW3N0YXJ0LmNvbHVtbjpdXSArCisgICAgICAgICAgICAgICAgICBsaW5lc1tzdGFydC5saW5lICsgMTplbmQubGluZV0gKworICAgICAgICAgICAgICAgICAgW2xpbmVzW2VuZC5saW5lXVs6ZW5kLmNvbHVtbl1dKQorICByZXR1cm4gJycuam9pbihyZXN1bHRfbGluZXMpCisKKworZGVmIFN0cmlwTWV0YUNvbW1lbnRzKHN0cik6CisgICIiIlN0cmlwIG1ldGEgY29tbWVudHMgZnJvbSBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIHN0cmluZy4iIiIKKworICAjIEZpcnN0LCBjb21wbGV0ZWx5IHJlbW92ZSBsaW5lcyBjb250YWluaW5nIG5vdGhpbmcgYnV0IGEgbWV0YQorICAjIGNvbW1lbnQsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgXG4uCisgIHN0ciA9IHJlLnN1YihyJ15ccypcJFwkLipcbicsICcnLCBzdHIpCisKKyAgIyBUaGVuLCByZW1vdmUgbWV0YSBjb21tZW50cyBmcm9tIGNvbnRlbnRmdWwgbGluZXMuCisgIHJldHVybiByZS5zdWIocidccypcJFwkLionLCAnJywgc3RyKQorCisKK2RlZiBNYWtlVG9rZW4obGluZXMsIHN0YXJ0LCBlbmQsIHRva2VuX3R5cGUpOgorICAiIiJDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFRva2VuLiIiIgorCisgIHJldHVybiBUb2tlbihzdGFydCwgZW5kLCBTdWJTdHJpbmcobGluZXMsIHN0YXJ0LCBlbmQpLCB0b2tlbl90eXBlKQorCisKK2RlZiBQYXJzZVRva2VuKGxpbmVzLCBwb3MsIHJlZ2V4LCB0b2tlbl90eXBlKToKKyAgbGluZSA9IGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0KKyAgbSA9IHJlZ2V4LnNlYXJjaChsaW5lKQorICBpZiBtIGFuZCBub3QgbS5zdGFydCgpOgorICAgIHJldHVybiBNYWtlVG9rZW4obGluZXMsIHBvcywgcG9zICsgbS5lbmQoKSwgdG9rZW5fdHlwZSkKKyAgZWxzZToKKyAgICBwcmludCAnRVJST1I6ICVzIGV4cGVjdGVkIGF0ICVzLicgJSAodG9rZW5fdHlwZSwgcG9zKQorICAgIHN5cy5leGl0KDEpCisKKworSURfUkVHRVggPSByZS5jb21waWxlKHInW19BLVphLXpdXHcqJykKK0VRX1JFR0VYID0gcmUuY29tcGlsZShyJz0nKQorUkVTVF9PRl9MSU5FX1JFR0VYID0gcmUuY29tcGlsZShyJy4qPyg/PSR8XCRcJCknKQorT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYID0gcmUuY29tcGlsZShyJ1xzKicpCitXSElURV9TUEFDRV9SRUdFWCA9IHJlLmNvbXBpbGUocidccycpCitET1RfRE9UX1JFR0VYID0gcmUuY29tcGlsZShyJ1wuXC4nKQorCisKK2RlZiBTa2lwKGxpbmVzLCBwb3MsIHJlZ2V4KToKKyAgbGluZSA9IGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0KKyAgbSA9IHJlLnNlYXJjaChyZWdleCwgbGluZSkKKyAgaWYgbSBhbmQgbm90IG0uc3RhcnQoKToKKyAgICByZXR1cm4gcG9zICsgbS5lbmQoKQorICBlbHNlOgorICAgIHJldHVybiBwb3MKKworCitkZWYgU2tpcFVudGlsKGxpbmVzLCBwb3MsIHJlZ2V4LCB0b2tlbl90eXBlKToKKyAgbGluZSA9IGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0KKyAgbSA9IHJlLnNlYXJjaChyZWdleCwgbGluZSkKKyAgaWYgbToKKyAgICByZXR1cm4gcG9zICsgbS5zdGFydCgpCisgIGVsc2U6CisgICAgcHJpbnQgKCdFUlJPUjogJXMgZXhwZWN0ZWQgb24gbGluZSAlcyBhZnRlciBjb2x1bW4gJXMuJyAlCisgICAgICAgICAgICh0b2tlbl90eXBlLCBwb3MubGluZSArIDEsIHBvcy5jb2x1bW4pKQorICAgIHN5cy5leGl0KDEpCisKKworZGVmIFBhcnNlRXhwVG9rZW5JblBhcmVucyhsaW5lcywgcG9zKToKKyAgZGVmIFBhcnNlSW5QYXJlbnMocG9zKToKKyAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIE9QVElPTkFMX1dISVRFX1NQQUNFU19SRUdFWCkKKyAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIHInXCgnKQorICAgIHBvcyA9IFBhcnNlKHBvcykKKyAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIHInXCknKQorICAgIHJldHVybiBwb3MKKworICBkZWYgUGFyc2UocG9zKToKKyAgICBwb3MgPSBTa2lwVW50aWwobGluZXMsIHBvcywgcidcKHxcKScsICcpJykKKyAgICBpZiBTdWJTdHJpbmcobGluZXMsIHBvcywgcG9zICsgMSkgPT0gJygnOgorICAgICAgcG9zID0gUGFyc2UocG9zICsgMSkKKyAgICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgcidcKScpCisgICAgICByZXR1cm4gUGFyc2UocG9zKQorICAgIGVsc2U6CisgICAgICByZXR1cm4gcG9zCisKKyAgc3RhcnQgPSBwb3MuQ2xvbmUoKQorICBwb3MgPSBQYXJzZUluUGFyZW5zKHBvcykKKyAgcmV0dXJuIE1ha2VUb2tlbihsaW5lcywgc3RhcnQsIHBvcywgJ2V4cCcpCisKKworZGVmIFJTdHJpcE5ld0xpbmVGcm9tVG9rZW4odG9rZW4pOgorICBpZiB0b2tlbi52YWx1ZS5lbmRzd2l0aCgnXG4nKToKKyAgICByZXR1cm4gVG9rZW4odG9rZW4uc3RhcnQsIHRva2VuLmVuZCwgdG9rZW4udmFsdWVbOi0xXSwgdG9rZW4udG9rZW5fdHlwZSkKKyAgZWxzZToKKyAgICByZXR1cm4gdG9rZW4KKworCitkZWYgVG9rZW5pemVMaW5lcyhsaW5lcywgcG9zKToKKyAgd2hpbGUgVHJ1ZToKKyAgICBmb3VuZCA9IEZpbmRGaXJzdChsaW5lcywgVE9LRU5fVEFCTEUsIHBvcykKKyAgICBpZiBub3QgZm91bmQ6CisgICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIHBvcywgRW9mKCksICdjb2RlJykKKyAgICAgIHJldHVybgorCisgICAgaWYgZm91bmQuc3RhcnQgPT0gcG9zOgorICAgICAgcHJldl90b2tlbiA9IE5vbmUKKyAgICAgIHByZXZfdG9rZW5fcnN0cmlwcGVkID0gTm9uZQorICAgIGVsc2U6CisgICAgICBwcmV2X3Rva2VuID0gTWFrZVRva2VuKGxpbmVzLCBwb3MsIGZvdW5kLnN0YXJ0LCAnY29kZScpCisgICAgICBwcmV2X3Rva2VuX3JzdHJpcHBlZCA9IFJTdHJpcE5ld0xpbmVGcm9tVG9rZW4ocHJldl90b2tlbikKKworICAgIGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyR2YXInOgorICAgICAgaWYgcHJldl90b2tlbl9yc3RyaXBwZWQ6CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW5fcnN0cmlwcGVkCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgaWRfdG9rZW4gPSBQYXJzZVRva2VuKGxpbmVzLCBmb3VuZC5lbmQsIElEX1JFR0VYLCAnaWQnKQorICAgICAgeWllbGQgaWRfdG9rZW4KKyAgICAgIHBvcyA9IFNraXAobGluZXMsIGlkX3Rva2VuLmVuZCwgT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYKQorCisgICAgICBlcV90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIHBvcywgRVFfUkVHRVgsICc9JykKKyAgICAgIHlpZWxkIGVxX3Rva2VuCisgICAgICBwb3MgPSBTa2lwKGxpbmVzLCBlcV90b2tlbi5lbmQsIHInXHMqJykKKworICAgICAgaWYgU3ViU3RyaW5nKGxpbmVzLCBwb3MsIHBvcyArIDIpICE9ICdbWyc6CisgICAgICAgIGV4cF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIHBvcywgUkVTVF9PRl9MSU5FX1JFR0VYLCAnZXhwJykKKyAgICAgICAgeWllbGQgZXhwX3Rva2VuCisgICAgICAgIHBvcyA9IEN1cnNvcihleHBfdG9rZW4uZW5kLmxpbmUgKyAxLCAwKQorICAgIGVsaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJGZvcic6CisgICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBpZF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIGZvdW5kLmVuZCwgSURfUkVHRVgsICdpZCcpCisgICAgICB5aWVsZCBpZF90b2tlbgorICAgICAgcG9zID0gU2tpcChsaW5lcywgaWRfdG9rZW4uZW5kLCBXSElURV9TUEFDRV9SRUdFWCkKKyAgICBlbGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRyYW5nZSc6CisgICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBpZF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIGZvdW5kLmVuZCwgSURfUkVHRVgsICdpZCcpCisgICAgICB5aWVsZCBpZF90b2tlbgorICAgICAgcG9zID0gU2tpcChsaW5lcywgaWRfdG9rZW4uZW5kLCBPUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVgpCisKKyAgICAgIGRvdHNfcG9zID0gU2tpcFVudGlsKGxpbmVzLCBwb3MsIERPVF9ET1RfUkVHRVgsICcuLicpCisgICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIHBvcywgZG90c19wb3MsICdleHAnKQorICAgICAgeWllbGQgTWFrZVRva2VuKGxpbmVzLCBkb3RzX3BvcywgZG90c19wb3MgKyAyLCAnLi4nKQorICAgICAgcG9zID0gZG90c19wb3MgKyAyCisgICAgICBuZXdfcG9zID0gQ3Vyc29yKHBvcy5saW5lICsgMSwgMCkKKyAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgcG9zLCBuZXdfcG9zLCAnZXhwJykKKyAgICAgIHBvcyA9IG5ld19wb3MKKyAgICBlbGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyQnOgorICAgICAgaWYgcHJldl90b2tlbjoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbgorICAgICAgeWllbGQgZm91bmQKKyAgICAgIGV4cF90b2tlbiA9IFBhcnNlRXhwVG9rZW5JblBhcmVucyhsaW5lcywgZm91bmQuZW5kKQorICAgICAgeWllbGQgZXhwX3Rva2VuCisgICAgICBwb3MgPSBleHBfdG9rZW4uZW5kCisgICAgZWxpZiAoZm91bmQudG9rZW5fdHlwZSA9PSAnXV0nIG9yIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRpZicgb3IKKyAgICAgICAgICBmb3VuZC50b2tlbl90eXBlID09ICckZWxpZicgb3IgZm91bmQudG9rZW5fdHlwZSA9PSAnJGVsc2UnKToKKyAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAorICAgICAgeWllbGQgZm91bmQKKyAgICAgIHBvcyA9IGZvdW5kLmVuZAorICAgIGVsc2U6CisgICAgICBpZiBwcmV2X3Rva2VuOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgcG9zID0gZm91bmQuZW5kCisKKworZGVmIFRva2VuaXplKHMpOgorICAiIiJBIGdlbmVyYXRvciB0aGF0IHlpZWxkcyB0aGUgdG9rZW5zIGluIHRoZSBnaXZlbiBzdHJpbmcuIiIiCisgIGlmIHMgIT0gJyc6CisgICAgbGluZXMgPSBzLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICBmb3IgdG9rZW4gaW4gVG9rZW5pemVMaW5lcyhsaW5lcywgQ3Vyc29yKDAsIDApKToKKyAgICAgIHlpZWxkIHRva2VuCisKKworY2xhc3MgQ29kZU5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBhdG9taWNfY29kZV9saXN0PU5vbmUpOgorICAgIHNlbGYuYXRvbWljX2NvZGUgPSBhdG9taWNfY29kZV9saXN0CisKKworY2xhc3MgVmFyTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGlkZW50aWZpZXI9Tm9uZSwgYXRvbWljX2NvZGU9Tm9uZSk6CisgICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgorICAgIHNlbGYuYXRvbWljX2NvZGUgPSBhdG9taWNfY29kZQorCisKK2NsYXNzIFJhbmdlTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGlkZW50aWZpZXI9Tm9uZSwgZXhwMT1Ob25lLCBleHAyPU5vbmUpOgorICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICBzZWxmLmV4cDEgPSBleHAxCisgICAgc2VsZi5leHAyID0gZXhwMgorCisKK2NsYXNzIEZvck5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZGVudGlmaWVyPU5vbmUsIHNlcD1Ob25lLCBjb2RlPU5vbmUpOgorICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICBzZWxmLnNlcCA9IHNlcAorICAgIHNlbGYuY29kZSA9IGNvZGUKKworCitjbGFzcyBFbHNlTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGVsc2VfYnJhbmNoPU5vbmUpOgorICAgIHNlbGYuZWxzZV9icmFuY2ggPSBlbHNlX2JyYW5jaAorCisKK2NsYXNzIElmTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cD1Ob25lLCB0aGVuX2JyYW5jaD1Ob25lLCBlbHNlX2JyYW5jaD1Ob25lKToKKyAgICBzZWxmLmV4cCA9IGV4cAorICAgIHNlbGYudGhlbl9icmFuY2ggPSB0aGVuX2JyYW5jaAorICAgIHNlbGYuZWxzZV9icmFuY2ggPSBlbHNlX2JyYW5jaAorCisKK2NsYXNzIFJhd0NvZGVOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW49Tm9uZSk6CisgICAgc2VsZi5yYXdfY29kZSA9IHRva2VuCisKKworY2xhc3MgTGl0ZXJhbERvbGxhck5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbik6CisgICAgc2VsZi50b2tlbiA9IHRva2VuCisKKworY2xhc3MgRXhwTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuLCBweXRob25fZXhwKToKKyAgICBzZWxmLnRva2VuID0gdG9rZW4KKyAgICBzZWxmLnB5dGhvbl9leHAgPSBweXRob25fZXhwCisKKworZGVmIFBvcEZyb250KGFfbGlzdCk6CisgIGhlYWQgPSBhX2xpc3RbMF0KKyAgYV9saXN0WzoxXSA9IFtdCisgIHJldHVybiBoZWFkCisKKworZGVmIFB1c2hGcm9udChhX2xpc3QsIGVsZW0pOgorICBhX2xpc3RbOjBdID0gW2VsZW1dCisKKworZGVmIFBvcFRva2VuKGFfbGlzdCwgdG9rZW5fdHlwZT1Ob25lKToKKyAgdG9rZW4gPSBQb3BGcm9udChhX2xpc3QpCisgIGlmIHRva2VuX3R5cGUgaXMgbm90IE5vbmUgYW5kIHRva2VuLnRva2VuX3R5cGUgIT0gdG9rZW5fdHlwZToKKyAgICBwcmludCAnRVJST1I6ICVzIGV4cGVjdGVkIGF0ICVzJyAlICh0b2tlbl90eXBlLCB0b2tlbi5zdGFydCkKKyAgICBwcmludCAnRVJST1I6ICVzIGZvdW5kIGluc3RlYWQnICUgKHRva2VuLCkKKyAgICBzeXMuZXhpdCgxKQorCisgIHJldHVybiB0b2tlbgorCisKK2RlZiBQZWVrVG9rZW4oYV9saXN0KToKKyAgaWYgbm90IGFfbGlzdDoKKyAgICByZXR1cm4gTm9uZQorCisgIHJldHVybiBhX2xpc3RbMF0KKworCitkZWYgUGFyc2VFeHBOb2RlKHRva2VuKToKKyAgcHl0aG9uX2V4cCA9IHJlLnN1YihyJyhbX0EtWmEtel1cdyopJywgcidzZWxmLkdldFZhbHVlKCJcMSIpJywgdG9rZW4udmFsdWUpCisgIHJldHVybiBFeHBOb2RlKHRva2VuLCBweXRob25fZXhwKQorCisKK2RlZiBQYXJzZUVsc2VOb2RlKHRva2Vucyk6CisgIGRlZiBQb3AodG9rZW5fdHlwZT1Ob25lKToKKyAgICByZXR1cm4gUG9wVG9rZW4odG9rZW5zLCB0b2tlbl90eXBlKQorCisgIG5leHQgPSBQZWVrVG9rZW4odG9rZW5zKQorICBpZiBub3QgbmV4dDoKKyAgICByZXR1cm4gTm9uZQorICBpZiBuZXh0LnRva2VuX3R5cGUgPT0gJyRlbHNlJzoKKyAgICBQb3AoJyRlbHNlJykKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gY29kZV9ub2RlCisgIGVsaWYgbmV4dC50b2tlbl90eXBlID09ICckZWxpZic6CisgICAgUG9wKCckZWxpZicpCisgICAgZXhwID0gUG9wKCdjb2RlJykKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICBpbm5lcl9lbHNlX25vZGUgPSBQYXJzZUVsc2VOb2RlKHRva2VucykKKyAgICByZXR1cm4gQ29kZU5vZGUoW0lmTm9kZShQYXJzZUV4cE5vZGUoZXhwKSwgY29kZV9ub2RlLCBpbm5lcl9lbHNlX25vZGUpXSkKKyAgZWxpZiBub3QgbmV4dC52YWx1ZS5zdHJpcCgpOgorICAgIFBvcCgnY29kZScpCisgICAgcmV0dXJuIFBhcnNlRWxzZU5vZGUodG9rZW5zKQorICBlbHNlOgorICAgIHJldHVybiBOb25lCisKKworZGVmIFBhcnNlQXRvbWljQ29kZU5vZGUodG9rZW5zKToKKyAgZGVmIFBvcCh0b2tlbl90eXBlPU5vbmUpOgorICAgIHJldHVybiBQb3BUb2tlbih0b2tlbnMsIHRva2VuX3R5cGUpCisKKyAgaGVhZCA9IFBvcEZyb250KHRva2VucykKKyAgdCA9IGhlYWQudG9rZW5fdHlwZQorICBpZiB0ID09ICdjb2RlJzoKKyAgICByZXR1cm4gUmF3Q29kZU5vZGUoaGVhZCkKKyAgZWxpZiB0ID09ICckdmFyJzoKKyAgICBpZF90b2tlbiA9IFBvcCgnaWQnKQorICAgIFBvcCgnPScpCisgICAgbmV4dCA9IFBlZWtUb2tlbih0b2tlbnMpCisgICAgaWYgbmV4dC50b2tlbl90eXBlID09ICdleHAnOgorICAgICAgZXhwX3Rva2VuID0gUG9wKCkKKyAgICAgIHJldHVybiBWYXJOb2RlKGlkX3Rva2VuLCBQYXJzZUV4cE5vZGUoZXhwX3Rva2VuKSkKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gVmFyTm9kZShpZF90b2tlbiwgY29kZV9ub2RlKQorICBlbGlmIHQgPT0gJyRmb3InOgorICAgIGlkX3Rva2VuID0gUG9wKCdpZCcpCisgICAgbmV4dF90b2tlbiA9IFBlZWtUb2tlbih0b2tlbnMpCisgICAgaWYgbmV4dF90b2tlbi50b2tlbl90eXBlID09ICdjb2RlJzoKKyAgICAgIHNlcF90b2tlbiA9IG5leHRfdG9rZW4KKyAgICAgIFBvcCgnY29kZScpCisgICAgZWxzZToKKyAgICAgIHNlcF90b2tlbiA9IE5vbmUKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gRm9yTm9kZShpZF90b2tlbiwgc2VwX3Rva2VuLCBjb2RlX25vZGUpCisgIGVsaWYgdCA9PSAnJGlmJzoKKyAgICBleHBfdG9rZW4gPSBQb3AoJ2NvZGUnKQorICAgIFBvcCgnW1snKQorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIGVsc2Vfbm9kZSA9IFBhcnNlRWxzZU5vZGUodG9rZW5zKQorICAgIHJldHVybiBJZk5vZGUoUGFyc2VFeHBOb2RlKGV4cF90b2tlbiksIGNvZGVfbm9kZSwgZWxzZV9ub2RlKQorICBlbGlmIHQgPT0gJyRyYW5nZSc6CisgICAgaWRfdG9rZW4gPSBQb3AoJ2lkJykKKyAgICBleHAxX3Rva2VuID0gUG9wKCdleHAnKQorICAgIFBvcCgnLi4nKQorICAgIGV4cDJfdG9rZW4gPSBQb3AoJ2V4cCcpCisgICAgcmV0dXJuIFJhbmdlTm9kZShpZF90b2tlbiwgUGFyc2VFeHBOb2RlKGV4cDFfdG9rZW4pLAorICAgICAgICAgICAgICAgICAgICAgUGFyc2VFeHBOb2RlKGV4cDJfdG9rZW4pKQorICBlbGlmIHQgPT0gJyRpZCc6CisgICAgcmV0dXJuIFBhcnNlRXhwTm9kZShUb2tlbihoZWFkLnN0YXJ0ICsgMSwgaGVhZC5lbmQsIGhlYWQudmFsdWVbMTpdLCAnaWQnKSkKKyAgZWxpZiB0ID09ICckKCQpJzoKKyAgICByZXR1cm4gTGl0ZXJhbERvbGxhck5vZGUoaGVhZCkKKyAgZWxpZiB0ID09ICckJzoKKyAgICBleHBfdG9rZW4gPSBQb3AoJ2V4cCcpCisgICAgcmV0dXJuIFBhcnNlRXhwTm9kZShleHBfdG9rZW4pCisgIGVsaWYgdCA9PSAnW1snOgorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIHJldHVybiBjb2RlX25vZGUKKyAgZWxzZToKKyAgICBQdXNoRnJvbnQodG9rZW5zLCBoZWFkKQorICAgIHJldHVybiBOb25lCisKKworZGVmIFBhcnNlQ29kZU5vZGUodG9rZW5zKToKKyAgYXRvbWljX2NvZGVfbGlzdCA9IFtdCisgIHdoaWxlIFRydWU6CisgICAgaWYgbm90IHRva2VuczoKKyAgICAgIGJyZWFrCisgICAgYXRvbWljX2NvZGVfbm9kZSA9IFBhcnNlQXRvbWljQ29kZU5vZGUodG9rZW5zKQorICAgIGlmIGF0b21pY19jb2RlX25vZGU6CisgICAgICBhdG9taWNfY29kZV9saXN0LmFwcGVuZChhdG9taWNfY29kZV9ub2RlKQorICAgIGVsc2U6CisgICAgICBicmVhaworICByZXR1cm4gQ29kZU5vZGUoYXRvbWljX2NvZGVfbGlzdCkKKworCitkZWYgUGFyc2VUb0FTVChwdW1wX3NyY190ZXh0KToKKyAgIiIiQ29udmVydCB0aGUgZ2l2ZW4gUHVtcCBzb3VyY2UgdGV4dCBpbnRvIGFuIEFTVC4iIiIKKyAgdG9rZW5zID0gbGlzdChUb2tlbml6ZShwdW1wX3NyY190ZXh0KSkKKyAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgIHJldHVybiBjb2RlX25vZGUKKworCitjbGFzcyBFbnY6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnZhcmlhYmxlcyA9IFtdCisgICAgc2VsZi5yYW5nZXMgPSBbXQorCisgIGRlZiBDbG9uZShzZWxmKToKKyAgICBjbG9uZSA9IEVudigpCisgICAgY2xvbmUudmFyaWFibGVzID0gc2VsZi52YXJpYWJsZXNbOl0KKyAgICBjbG9uZS5yYW5nZXMgPSBzZWxmLnJhbmdlc1s6XQorICAgIHJldHVybiBjbG9uZQorCisgIGRlZiBQdXNoVmFyaWFibGUoc2VsZiwgdmFyLCB2YWx1ZSk6CisgICAgIyBJZiB2YWx1ZSBsb29rcyBsaWtlIGFuIGludCwgc3RvcmUgaXQgYXMgYW4gaW50LgorICAgIHRyeToKKyAgICAgIGludF92YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgIGlmICgnJXMnICUgaW50X3ZhbHVlKSA9PSB2YWx1ZToKKyAgICAgICAgdmFsdWUgPSBpbnRfdmFsdWUKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgcGFzcworICAgIHNlbGYudmFyaWFibGVzWzowXSA9IFsodmFyLCB2YWx1ZSldCisKKyAgZGVmIFBvcFZhcmlhYmxlKHNlbGYpOgorICAgIHNlbGYudmFyaWFibGVzWzoxXSA9IFtdCisKKyAgZGVmIFB1c2hSYW5nZShzZWxmLCB2YXIsIGxvd2VyLCB1cHBlcik6CisgICAgc2VsZi5yYW5nZXNbOjBdID0gWyh2YXIsIGxvd2VyLCB1cHBlcildCisKKyAgZGVmIFBvcFJhbmdlKHNlbGYpOgorICAgIHNlbGYucmFuZ2VzWzoxXSA9IFtdCisKKyAgZGVmIEdldFZhbHVlKHNlbGYsIGlkZW50aWZpZXIpOgorICAgIGZvciAodmFyLCB2YWx1ZSkgaW4gc2VsZi52YXJpYWJsZXM6CisgICAgICBpZiBpZGVudGlmaWVyID09IHZhcjoKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBwcmludCAnRVJST1I6IG1ldGEgdmFyaWFibGUgJXMgaXMgdW5kZWZpbmVkLicgJSAoaWRlbnRpZmllciwpCisgICAgc3lzLmV4aXQoMSkKKworICBkZWYgRXZhbEV4cChzZWxmLCBleHApOgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IGV2YWwoZXhwLnB5dGhvbl9leHApCisgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgIHByaW50ICdFUlJPUjogY2F1Z2h0IGV4Y2VwdGlvbiAlczogJXMnICUgKGUuX19jbGFzc19fLl9fbmFtZV9fLCBlKQorICAgICAgcHJpbnQgKCdFUlJPUjogZmFpbGVkIHRvIGV2YWx1YXRlIG1ldGEgZXhwcmVzc2lvbiAlcyBhdCAlcycgJQorICAgICAgICAgICAgIChleHAucHl0aG9uX2V4cCwgZXhwLnRva2VuLnN0YXJ0KSkKKyAgICAgIHN5cy5leGl0KDEpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBHZXRSYW5nZShzZWxmLCBpZGVudGlmaWVyKToKKyAgICBmb3IgKHZhciwgbG93ZXIsIHVwcGVyKSBpbiBzZWxmLnJhbmdlczoKKyAgICAgIGlmIGlkZW50aWZpZXIgPT0gdmFyOgorICAgICAgICByZXR1cm4gKGxvd2VyLCB1cHBlcikKKworICAgIHByaW50ICdFUlJPUjogcmFuZ2UgJXMgaXMgdW5kZWZpbmVkLicgJSAoaWRlbnRpZmllciwpCisgICAgc3lzLmV4aXQoMSkKKworCitjbGFzcyBPdXRwdXQ6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnN0cmluZyA9ICcnCisKKyAgZGVmIEdldExhc3RMaW5lKHNlbGYpOgorICAgIGluZGV4ID0gc2VsZi5zdHJpbmcucmZpbmQoJ1xuJykKKyAgICBpZiBpbmRleCA8IDA6CisgICAgICByZXR1cm4gJycKKworICAgIHJldHVybiBzZWxmLnN0cmluZ1tpbmRleCArIDE6XQorCisgIGRlZiBBcHBlbmQoc2VsZiwgcyk6CisgICAgc2VsZi5zdHJpbmcgKz0gcworCisKK2RlZiBSdW5BdG9taWNDb2RlKGVudiwgbm9kZSwgb3V0cHV0KToKKyAgaWYgaXNpbnN0YW5jZShub2RlLCBWYXJOb2RlKToKKyAgICBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyLnZhbHVlLnN0cmlwKCkKKyAgICByZXN1bHQgPSBPdXRwdXQoKQorICAgIFJ1bkF0b21pY0NvZGUoZW52LkNsb25lKCksIG5vZGUuYXRvbWljX2NvZGUsIHJlc3VsdCkKKyAgICB2YWx1ZSA9IHJlc3VsdC5zdHJpbmcKKyAgICBlbnYuUHVzaFZhcmlhYmxlKGlkZW50aWZpZXIsIHZhbHVlKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgUmFuZ2VOb2RlKToKKyAgICBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyLnZhbHVlLnN0cmlwKCkKKyAgICBsb3dlciA9IGludChlbnYuRXZhbEV4cChub2RlLmV4cDEpKQorICAgIHVwcGVyID0gaW50KGVudi5FdmFsRXhwKG5vZGUuZXhwMikpCisgICAgZW52LlB1c2hSYW5nZShpZGVudGlmaWVyLCBsb3dlciwgdXBwZXIpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBGb3JOb2RlKToKKyAgICBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyLnZhbHVlLnN0cmlwKCkKKyAgICBpZiBub2RlLnNlcCBpcyBOb25lOgorICAgICAgc2VwID0gJycKKyAgICBlbHNlOgorICAgICAgc2VwID0gbm9kZS5zZXAudmFsdWUKKyAgICAobG93ZXIsIHVwcGVyKSA9IGVudi5HZXRSYW5nZShpZGVudGlmaWVyKQorICAgIGZvciBpIGluIHJhbmdlKGxvd2VyLCB1cHBlciArIDEpOgorICAgICAgbmV3X2VudiA9IGVudi5DbG9uZSgpCisgICAgICBuZXdfZW52LlB1c2hWYXJpYWJsZShpZGVudGlmaWVyLCBpKQorICAgICAgUnVuQ29kZShuZXdfZW52LCBub2RlLmNvZGUsIG91dHB1dCkKKyAgICAgIGlmIGkgIT0gdXBwZXI6CisgICAgICAgIG91dHB1dC5BcHBlbmQoc2VwKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgUmF3Q29kZU5vZGUpOgorICAgIG91dHB1dC5BcHBlbmQobm9kZS5yYXdfY29kZS52YWx1ZSkKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIElmTm9kZSk6CisgICAgY29uZCA9IGVudi5FdmFsRXhwKG5vZGUuZXhwKQorICAgIGlmIGNvbmQ6CisgICAgICBSdW5Db2RlKGVudi5DbG9uZSgpLCBub2RlLnRoZW5fYnJhbmNoLCBvdXRwdXQpCisgICAgZWxpZiBub2RlLmVsc2VfYnJhbmNoIGlzIG5vdCBOb25lOgorICAgICAgUnVuQ29kZShlbnYuQ2xvbmUoKSwgbm9kZS5lbHNlX2JyYW5jaCwgb3V0cHV0KQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRXhwTm9kZSk6CisgICAgdmFsdWUgPSBlbnYuRXZhbEV4cChub2RlKQorICAgIG91dHB1dC5BcHBlbmQoJyVzJyAlICh2YWx1ZSwpKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTGl0ZXJhbERvbGxhck5vZGUpOgorICAgIG91dHB1dC5BcHBlbmQoJyQnKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29kZU5vZGUpOgorICAgIFJ1bkNvZGUoZW52LkNsb25lKCksIG5vZGUsIG91dHB1dCkKKyAgZWxzZToKKyAgICBwcmludCAnQkFEJworICAgIHByaW50IG5vZGUKKyAgICBzeXMuZXhpdCgxKQorCisKK2RlZiBSdW5Db2RlKGVudiwgY29kZV9ub2RlLCBvdXRwdXQpOgorICBmb3IgYXRvbWljX2NvZGUgaW4gY29kZV9ub2RlLmF0b21pY19jb2RlOgorICAgIFJ1bkF0b21pY0NvZGUoZW52LCBhdG9taWNfY29kZSwgb3V0cHV0KQorCisKK2RlZiBJc0NvbW1lbnQoY3VyX2xpbmUpOgorICByZXR1cm4gJy8vJyBpbiBjdXJfbGluZQorCisKK2RlZiBJc0luUHJlcHJvY2Vzc29yRGlyZXZhdGl2ZShwcmV2X2xpbmVzLCBjdXJfbGluZSk6CisgIGlmIGN1cl9saW5lLmxzdHJpcCgpLnN0YXJ0c3dpdGgoJyMnKToKKyAgICByZXR1cm4gVHJ1ZQorICByZXR1cm4gcHJldl9saW5lcyAhPSBbXSBhbmQgcHJldl9saW5lc1stMV0uZW5kc3dpdGgoJ1xcJykKKworCitkZWYgV3JhcENvbW1lbnQobGluZSwgb3V0cHV0KToKKyAgbG9jID0gbGluZS5maW5kKCcvLycpCisgIGJlZm9yZV9jb21tZW50ID0gbGluZVs6bG9jXS5yc3RyaXAoKQorICBpZiBiZWZvcmVfY29tbWVudCA9PSAnJzoKKyAgICBpbmRlbnQgPSBsb2MKKyAgZWxzZToKKyAgICBvdXRwdXQuYXBwZW5kKGJlZm9yZV9jb21tZW50KQorICAgIGluZGVudCA9IGxlbihiZWZvcmVfY29tbWVudCkgLSBsZW4oYmVmb3JlX2NvbW1lbnQubHN0cmlwKCkpCisgIHByZWZpeCA9IGluZGVudConICcgKyAnLy8gJworICBtYXhfbGVuID0gODAgLSBsZW4ocHJlZml4KQorICBjb21tZW50ID0gbGluZVtsb2MgKyAyOl0uc3RyaXAoKQorICBzZWdzID0gW3NlZyBmb3Igc2VnIGluIHJlLnNwbGl0KHInKFx3K1xXKiknLCBjb21tZW50KSBpZiBzZWcgIT0gJyddCisgIGN1cl9saW5lID0gJycKKyAgZm9yIHNlZyBpbiBzZWdzOgorICAgIGlmIGxlbigoY3VyX2xpbmUgKyBzZWcpLnJzdHJpcCgpKSA8IG1heF9sZW46CisgICAgICBjdXJfbGluZSArPSBzZWcKKyAgICBlbHNlOgorICAgICAgaWYgY3VyX2xpbmUuc3RyaXAoKSAhPSAnJzoKKyAgICAgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5yc3RyaXAoKSkKKyAgICAgIGN1cl9saW5lID0gc2VnLmxzdHJpcCgpCisgIGlmIGN1cl9saW5lLnN0cmlwKCkgIT0gJyc6CisgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5zdHJpcCgpKQorCisKK2RlZiBXcmFwQ29kZShsaW5lLCBsaW5lX2NvbmNhdCwgb3V0cHV0KToKKyAgaW5kZW50ID0gbGVuKGxpbmUpIC0gbGVuKGxpbmUubHN0cmlwKCkpCisgIHByZWZpeCA9IGluZGVudConICcgICMgUHJlZml4IG9mIHRoZSBjdXJyZW50IGxpbmUKKyAgbWF4X2xlbiA9IDgwIC0gaW5kZW50IC0gbGVuKGxpbmVfY29uY2F0KSAgIyBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgY3VycmVudCBsaW5lCisgIG5ld19wcmVmaXggPSBwcmVmaXggKyA0KicgJyAgIyBQcmVmaXggb2YgYSBjb250aW51YXRpb24gbGluZQorICBuZXdfbWF4X2xlbiA9IG1heF9sZW4gLSA0ICAjIE1heGltdW0gbGVuZ3RoIG9mIGEgY29udGludWF0aW9uIGxpbmUKKyAgIyBQcmVmZXJzIHRvIHdyYXAgYSBsaW5lIGFmdGVyIGEgJywnIG9yICc7Jy4KKyAgc2VncyA9IFtzZWcgZm9yIHNlZyBpbiByZS5zcGxpdChyJyhbXiw7XStbLDtdPyknLCBsaW5lLnN0cmlwKCkpIGlmIHNlZyAhPSAnJ10KKyAgY3VyX2xpbmUgPSAnJyAgIyBUaGUgY3VycmVudCBsaW5lIHdpdGhvdXQgbGVhZGluZyBzcGFjZXMuCisgIGZvciBzZWcgaW4gc2VnczoKKyAgICAjIElmIHRoZSBsaW5lIGlzIHN0aWxsIHRvbyBsb25nLCB3cmFwIGF0IGEgc3BhY2UuCisgICAgd2hpbGUgY3VyX2xpbmUgPT0gJycgYW5kIGxlbihzZWcuc3RyaXAoKSkgPiBtYXhfbGVuOgorICAgICAgc2VnID0gc2VnLmxzdHJpcCgpCisgICAgICBzcGxpdF9hdCA9IHNlZy5yZmluZCgnICcsIDAsIG1heF9sZW4pCisgICAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIHNlZ1s6c3BsaXRfYXRdLnN0cmlwKCkgKyBsaW5lX2NvbmNhdCkKKyAgICAgIHNlZyA9IHNlZ1tzcGxpdF9hdCArIDE6XQorICAgICAgcHJlZml4ID0gbmV3X3ByZWZpeAorICAgICAgbWF4X2xlbiA9IG5ld19tYXhfbGVuCisKKyAgICBpZiBsZW4oKGN1cl9saW5lICsgc2VnKS5yc3RyaXAoKSkgPCBtYXhfbGVuOgorICAgICAgY3VyX2xpbmUgPSAoY3VyX2xpbmUgKyBzZWcpLmxzdHJpcCgpCisgICAgZWxzZToKKyAgICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgY3VyX2xpbmUucnN0cmlwKCkgKyBsaW5lX2NvbmNhdCkKKyAgICAgIHByZWZpeCA9IG5ld19wcmVmaXgKKyAgICAgIG1heF9sZW4gPSBuZXdfbWF4X2xlbgorICAgICAgY3VyX2xpbmUgPSBzZWcubHN0cmlwKCkKKyAgaWYgY3VyX2xpbmUuc3RyaXAoKSAhPSAnJzoKKyAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnN0cmlwKCkpCisKKworZGVmIFdyYXBQcmVwcm9jZXNzb3JEaXJldmF0aXZlKGxpbmUsIG91dHB1dCk6CisgIFdyYXBDb2RlKGxpbmUsICcgXFwnLCBvdXRwdXQpCisKKworZGVmIFdyYXBQbGFpbkNvZGUobGluZSwgb3V0cHV0KToKKyAgV3JhcENvZGUobGluZSwgJycsIG91dHB1dCkKKworCitkZWYgSXNIZWFkZXJHdWFyZE9ySW5jbHVkZShsaW5lKToKKyAgcmV0dXJuIChyZS5tYXRjaChyJ14jKGlmbmRlZnxkZWZpbmV8ZW5kaWZccyovLylccypbXHdfXStccyokJywgbGluZSkgb3IKKyAgICAgICAgICByZS5tYXRjaChyJ14jaW5jbHVkZVxzJywgbGluZSkpCisKKworZGVmIFdyYXBMb25nTGluZShsaW5lLCBvdXRwdXQpOgorICBsaW5lID0gbGluZS5yc3RyaXAoKQorICBpZiBsZW4obGluZSkgPD0gODA6CisgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICBlbGlmIElzQ29tbWVudChsaW5lKToKKyAgICBpZiBJc0hlYWRlckd1YXJkT3JJbmNsdWRlKGxpbmUpOgorICAgICAgIyBUaGUgc3R5bGUgZ3VpZGUgbWFkZSBhbiBleGNlcHRpb24gdG8gYWxsb3cgbG9uZyBoZWFkZXIgZ3VhcmQgbGluZXMKKyAgICAgICMgYW5kIGluY2x1ZGVzLgorICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICAgIGVsc2U6CisgICAgICBXcmFwQ29tbWVudChsaW5lLCBvdXRwdXQpCisgIGVsaWYgSXNJblByZXByb2Nlc3NvckRpcmV2YXRpdmUob3V0cHV0LCBsaW5lKToKKyAgICBpZiBJc0hlYWRlckd1YXJkT3JJbmNsdWRlKGxpbmUpOgorICAgICAgIyBUaGUgc3R5bGUgZ3VpZGUgbWFkZSBhbiBleGNlcHRpb24gdG8gYWxsb3cgbG9uZyBoZWFkZXIgZ3VhcmQgbGluZXMKKyAgICAgICMgYW5kIGluY2x1ZGVzLgorICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICAgIGVsc2U6CisgICAgICBXcmFwUHJlcHJvY2Vzc29yRGlyZXZhdGl2ZShsaW5lLCBvdXRwdXQpCisgIGVsc2U6CisgICAgV3JhcFBsYWluQ29kZShsaW5lLCBvdXRwdXQpCisKKworZGVmIEJlYXV0aWZ5Q29kZShzdHJpbmcpOgorICBsaW5lcyA9IHN0cmluZy5zcGxpdGxpbmVzKCkKKyAgb3V0cHV0ID0gW10KKyAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgV3JhcExvbmdMaW5lKGxpbmUsIG91dHB1dCkKKyAgb3V0cHV0MiA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIG91dHB1dF0KKyAgcmV0dXJuICdcbicuam9pbihvdXRwdXQyKSArICdcbicKKworCitkZWYgQ29udmVydEZyb21QdW1wU291cmNlKHNyY190ZXh0KToKKyAgIiIiUmV0dXJuIHRoZSB0ZXh0IGdlbmVyYXRlZCBmcm9tIHRoZSBnaXZlbiBQdW1wIHNvdXJjZSB0ZXh0LiIiIgorICBhc3QgPSBQYXJzZVRvQVNUKFN0cmlwTWV0YUNvbW1lbnRzKHNyY190ZXh0KSkKKyAgb3V0cHV0ID0gT3V0cHV0KCkKKyAgUnVuQ29kZShFbnYoKSwgYXN0LCBvdXRwdXQpCisgIHJldHVybiBCZWF1dGlmeUNvZGUob3V0cHV0LnN0cmluZykKKworCitkZWYgbWFpbihhcmd2KToKKyAgaWYgbGVuKGFyZ3YpID09IDE6CisgICAgcHJpbnQgX19kb2NfXworICAgIHN5cy5leGl0KDEpCisKKyAgZmlsZV9wYXRoID0gYXJndlstMV0KKyAgb3V0cHV0X3N0ciA9IENvbnZlcnRGcm9tUHVtcFNvdXJjZShmaWxlKGZpbGVfcGF0aCwgJ3InKS5yZWFkKCkpCisgIGlmIGZpbGVfcGF0aC5lbmRzd2l0aCgnLnB1bXAnKToKKyAgICBvdXRwdXRfZmlsZV9wYXRoID0gZmlsZV9wYXRoWzotNV0KKyAgZWxzZToKKyAgICBvdXRwdXRfZmlsZV9wYXRoID0gJy0nCisgIGlmIG91dHB1dF9maWxlX3BhdGggPT0gJy0nOgorICAgIHByaW50IG91dHB1dF9zdHIsCisgIGVsc2U6CisgICAgb3V0cHV0X2ZpbGUgPSBmaWxlKG91dHB1dF9maWxlX3BhdGgsICd3JykKKyAgICBvdXRwdXRfZmlsZS53cml0ZSgnLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDpcbicpCisgICAgb3V0cHV0X2ZpbGUud3JpdGUoJy8vICAgICAlcyAlc1xuJyAlCisgICAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVfcGF0aCkpKQorICAgIG91dHB1dF9maWxlLndyaXRlKCcvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhXG5cbicpCisgICAgb3V0cHV0X2ZpbGUud3JpdGUob3V0cHV0X3N0cikKKyAgICBvdXRwdXRfZmlsZS5jbG9zZSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy90ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZmY1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy90ZXN0L01ha2VmaWxlCkBAIC0wLDAgKzEsNTkgQEAKKyMgQSBNYWtlZmlsZSBmb3IgZnVzaW5nIEdvb2dsZSBUZXN0IGFuZCBidWlsZGluZyBhIHNhbXBsZSB0ZXN0IGFnYWluc3QgaXQuCisjCisjIFNZTk9QU0lTOgorIworIyAgIG1ha2UgW2FsbF0gIC0gbWFrZXMgZXZlcnl0aGluZy4KKyMgICBtYWtlIFRBUkdFVCAtIG1ha2VzIHRoZSBnaXZlbiB0YXJnZXQuCisjICAgbWFrZSBjaGVjayAgLSBtYWtlcyBldmVyeXRoaW5nIGFuZCBydW5zIHRoZSBidWlsdCBzYW1wbGUgdGVzdC4KKyMgICBtYWtlIGNsZWFuICAtIHJlbW92ZXMgYWxsIGZpbGVzIGdlbmVyYXRlZCBieSBtYWtlLgorCisjIFBvaW50cyB0byB0aGUgcm9vdCBvZiBmdXNlZCBHb29nbGUgVGVzdCwgcmVsYXRpdmUgdG8gd2hlcmUgdGhpcyBmaWxlIGlzLgorRlVTRURfR1RFU1RfRElSID0gb3V0cHV0CisKKyMgUGF0aHMgdG8gdGhlIGZ1c2VkIGd0ZXN0IGZpbGVzLgorRlVTRURfR1RFU1RfSCA9ICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC5oCitGVVNFRF9HVEVTVF9BTExfQ0MgPSAkKEZVU0VEX0dURVNUX0RJUikvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCisKKyMgV2hlcmUgdG8gZmluZCB0aGUgc2FtcGxlIHRlc3QuCitTQU1QTEVfRElSID0gLi4vLi4vc2FtcGxlcworCisjIFdoZXJlIHRvIGZpbmQgZ3Rlc3RfbWFpbi5jYy4KK0dURVNUX01BSU5fQ0MgPSAuLi8uLi9zcmMvZ3Rlc3RfbWFpbi5jYworCisjIEZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yLgorIyBXZSBoYXZlIG5vIGlkZWEgaGVyZSB3aGV0aGVyIHB0aHJlYWRzIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLCBzbworIyBkaXNhYmxlIGl0cyB1c2UuCitDUFBGTEFHUyArPSAtSSQoRlVTRURfR1RFU1RfRElSKSAtREdURVNUX0hBU19QVEhSRUFEPTAKKworIyBGbGFncyBwYXNzZWQgdG8gdGhlIEMrKyBjb21waWxlci4KK0NYWEZMQUdTICs9IC1nCisKK2FsbCA6IHNhbXBsZTFfdW5pdHRlc3QKKworY2hlY2sgOiBhbGwKKwkuL3NhbXBsZTFfdW5pdHRlc3QKKworY2xlYW4gOgorCXJtIC1yZiAkKEZVU0VEX0dURVNUX0RJUikgc2FtcGxlMV91bml0dGVzdCAqLm8KKworJChGVVNFRF9HVEVTVF9IKSA6CisJLi4vZnVzZV9ndGVzdF9maWxlcy5weSAkKEZVU0VEX0dURVNUX0RJUikKKworJChGVVNFRF9HVEVTVF9BTExfQ0MpIDoKKwkuLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5ICQoRlVTRURfR1RFU1RfRElSKQorCitndGVzdC1hbGwubyA6ICQoRlVTRURfR1RFU1RfSCkgJChGVVNFRF9HVEVTVF9BTExfQ0MpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC1hbGwuY2MKKworZ3Rlc3RfbWFpbi5vIDogJChGVVNFRF9HVEVTVF9IKSAkKEdURVNUX01BSU5fQ0MpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoR1RFU1RfTUFJTl9DQykKKworc2FtcGxlMS5vIDogJChTQU1QTEVfRElSKS9zYW1wbGUxLmNjICQoU0FNUExFX0RJUikvc2FtcGxlMS5oCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoU0FNUExFX0RJUikvc2FtcGxlMS5jYworCitzYW1wbGUxX3VuaXR0ZXN0Lm8gOiAkKFNBTVBMRV9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MgXAorICAgICAgICAgICAgICAgICAgICAgJChTQU1QTEVfRElSKS9zYW1wbGUxLmggJChGVVNFRF9HVEVTVF9IKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFNBTVBMRV9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworc2FtcGxlMV91bml0dGVzdCA6IHNhbXBsZTEubyBzYW1wbGUxX3VuaXR0ZXN0Lm8gZ3Rlc3QtYWxsLm8gZ3Rlc3RfbWFpbi5vCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpICReIC1vICRACmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy91cGxvYWQucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy91cGxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU2ZjlhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zY3JpcHRzL3VwbG9hZC5weQpAQCAtMCwwICsxLDEzODcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJUb29sIGZvciB1cGxvYWRpbmcgZGlmZnMgZnJvbSBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gdGhlIGNvZGVyZXZpZXcgYXBwLgorCitVc2FnZSBzdW1tYXJ5OiB1cGxvYWQucHkgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdCisKK0RpZmYgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBkaWZmIGNvbW1hbmQgb2YgdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorCitTdXBwb3J0ZWQgdmVyc2lvbiBjb250cm9sIHN5c3RlbXM6CisgIEdpdAorICBNZXJjdXJpYWwKKyAgU3VidmVyc2lvbgorCitJdCBpcyBpbXBvcnRhbnQgZm9yIEdpdC9NZXJjdXJpYWwgdXNlcnMgdG8gc3BlY2lmeSBhIHRyZWUvbm9kZS9icmFuY2ggdG8gZGlmZgorYWdhaW5zdCBieSB1c2luZyB0aGUgJy0tcmV2JyBvcHRpb24uCisiIiIKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBhcHBjZmcucHkgaW4gdGhlIEFwcCBFbmdpbmUgU0RLIChvcGVuIHNvdXJjZSksCisjIGFuZCBmcm9tIEFTUE4gcmVjaXBlICMxNDYzMDYuCisKK2ltcG9ydCBjb29raWVsaWIKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG1kNQoraW1wb3J0IG1pbWV0eXBlcworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgdXJscGFyc2UKKwordHJ5OgorICBpbXBvcnQgcmVhZGxpbmUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgcGFzcworCisjIFRoZSBsb2dnaW5nIHZlcmJvc2l0eToKKyMgIDA6IEVycm9ycyBvbmx5LgorIyAgMTogU3RhdHVzIG1lc3NhZ2VzLgorIyAgMjogSW5mbyBsb2dzLgorIyAgMzogRGVidWcgbG9ncy4KK3ZlcmJvc2l0eSA9IDEKKworIyBNYXggc2l6ZSBvZiBwYXRjaCBvciBiYXNlIGZpbGUuCitNQVhfVVBMT0FEX1NJWkUgPSA5MDAgKiAxMDI0CisKKworZGVmIEdldEVtYWlsKHByb21wdCk6CisgICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIHRoZWlyIGVtYWlsIGFkZHJlc3MgYW5kIHJldHVybnMgaXQuCisKKyAgVGhlIGxhc3QgdXNlZCBlbWFpbCBhZGRyZXNzIGlzIHNhdmVkIHRvIGEgZmlsZSBhbmQgb2ZmZXJlZCB1cCBhcyBhIHN1Z2dlc3Rpb24KKyAgdG8gdGhlIHVzZXIuIElmIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIgd2l0aG91dCB0eXBpbmcgaW4gYW55dGhpbmcgdGhlIGxhc3QKKyAgdXNlZCBlbWFpbCBhZGRyZXNzIGlzIHVzZWQuIElmIHRoZSB1c2VyIGVudGVycyBhIG5ldyBhZGRyZXNzLCBpdCBpcyBzYXZlZAorICBmb3IgbmV4dCB0aW1lIHdlIHByb21wdC4KKworICAiIiIKKyAgbGFzdF9lbWFpbF9maWxlX25hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxhc3RfY29kZXJldmlld19lbWFpbF9hZGRyZXNzIikKKyAgbGFzdF9lbWFpbCA9ICIiCisgIGlmIG9zLnBhdGguZXhpc3RzKGxhc3RfZW1haWxfZmlsZV9uYW1lKToKKyAgICB0cnk6CisgICAgICBsYXN0X2VtYWlsX2ZpbGUgPSBvcGVuKGxhc3RfZW1haWxfZmlsZV9uYW1lLCAiciIpCisgICAgICBsYXN0X2VtYWlsID0gbGFzdF9lbWFpbF9maWxlLnJlYWRsaW5lKCkuc3RyaXAoIlxuIikKKyAgICAgIGxhc3RfZW1haWxfZmlsZS5jbG9zZSgpCisgICAgICBwcm9tcHQgKz0gIiBbJXNdIiAlIGxhc3RfZW1haWwKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgIHBhc3MKKyAgZW1haWwgPSByYXdfaW5wdXQocHJvbXB0ICsgIjogIikuc3RyaXAoKQorICBpZiBlbWFpbDoKKyAgICB0cnk6CisgICAgICBsYXN0X2VtYWlsX2ZpbGUgPSBvcGVuKGxhc3RfZW1haWxfZmlsZV9uYW1lLCAidyIpCisgICAgICBsYXN0X2VtYWlsX2ZpbGUud3JpdGUoZW1haWwpCisgICAgICBsYXN0X2VtYWlsX2ZpbGUuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgcGFzcworICBlbHNlOgorICAgIGVtYWlsID0gbGFzdF9lbWFpbAorICByZXR1cm4gZW1haWwKKworCitkZWYgU3RhdHVzVXBkYXRlKG1zZyk6CisgICIiIlByaW50IGEgc3RhdHVzIG1lc3NhZ2UgdG8gc3Rkb3V0LgorCisgIElmICd2ZXJib3NpdHknIGlzIGdyZWF0ZXIgdGhhbiAwLCBwcmludCB0aGUgbWVzc2FnZS4KKworICBBcmdzOgorICAgIG1zZzogVGhlIHN0cmluZyB0byBwcmludC4KKyAgIiIiCisgIGlmIHZlcmJvc2l0eSA+IDA6CisgICAgcHJpbnQgbXNnCisKKworZGVmIEVycm9yRXhpdChtc2cpOgorICAiIiJQcmludCBhbiBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgZXhpdC4iIiIKKyAgcHJpbnQgPj5zeXMuc3RkZXJyLCBtc2cKKyAgc3lzLmV4aXQoMSkKKworCitjbGFzcyBDbGllbnRMb2dpbkVycm9yKHVybGxpYjIuSFRUUEVycm9yKToKKyAgIiIiUmFpc2VkIHRvIGluZGljYXRlIHRoZXJlIHdhcyBhbiBlcnJvciBhdXRoZW50aWNhdGluZyB3aXRoIENsaWVudExvZ2luLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGNvZGUsIG1zZywgaGVhZGVycywgYXJncyk6CisgICAgdXJsbGliMi5IVFRQRXJyb3IuX19pbml0X18oc2VsZiwgdXJsLCBjb2RlLCBtc2csIGhlYWRlcnMsIE5vbmUpCisgICAgc2VsZi5hcmdzID0gYXJncworICAgIHNlbGYucmVhc29uID0gYXJnc1siRXJyb3IiXQorCisKK2NsYXNzIEFic3RyYWN0UnBjU2VydmVyKG9iamVjdCk6CisgICIiIlByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBmb3IgYSBzaW1wbGUgUlBDIHNlcnZlci4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgYXV0aF9mdW5jdGlvbiwgaG9zdF9vdmVycmlkZT1Ob25lLCBleHRyYV9oZWFkZXJzPXt9LAorICAgICAgICAgICAgICAgc2F2ZV9jb29raWVzPUZhbHNlKToKKyAgICAiIiJDcmVhdGVzIGEgbmV3IEh0dHBScGNTZXJ2ZXIuCisKKyAgICBBcmdzOgorICAgICAgaG9zdDogVGhlIGhvc3QgdG8gc2VuZCByZXF1ZXN0cyB0by4KKyAgICAgIGF1dGhfZnVuY3Rpb246IEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4KKyAgICAgICAgKGVtYWlsLCBwYXNzd29yZCkgdHVwbGUgd2hlbiBjYWxsZWQuIFdpbGwgYmUgY2FsbGVkIGlmIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGlzIHJlcXVpcmVkLgorICAgICAgaG9zdF9vdmVycmlkZTogVGhlIGhvc3QgaGVhZGVyIHRvIHNlbmQgdG8gdGhlIHNlcnZlciAoZGVmYXVsdHMgdG8gaG9zdCkuCisgICAgICBleHRyYV9oZWFkZXJzOiBBIGRpY3Qgb2YgZXh0cmEgaGVhZGVycyB0byBhcHBlbmQgdG8gZXZlcnkgcmVxdWVzdC4KKyAgICAgIHNhdmVfY29va2llczogSWYgVHJ1ZSwgc2F2ZSB0aGUgYXV0aGVudGljYXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLgorICAgICAgICBJZiBGYWxzZSwgdXNlIGFuIGluLW1lbW9yeSBjb29raWVqYXIgaW5zdGVhZC4gIFN1YmNsYXNzZXMgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5LiAgRGVmYXVsdHMgdG8gRmFsc2UuCisgICAgIiIiCisgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgIHNlbGYuaG9zdF9vdmVycmlkZSA9IGhvc3Rfb3ZlcnJpZGUKKyAgICBzZWxmLmF1dGhfZnVuY3Rpb24gPSBhdXRoX2Z1bmN0aW9uCisgICAgc2VsZi5hdXRoZW50aWNhdGVkID0gRmFsc2UKKyAgICBzZWxmLmV4dHJhX2hlYWRlcnMgPSBleHRyYV9oZWFkZXJzCisgICAgc2VsZi5zYXZlX2Nvb2tpZXMgPSBzYXZlX2Nvb2tpZXMKKyAgICBzZWxmLm9wZW5lciA9IHNlbGYuX0dldE9wZW5lcigpCisgICAgaWYgc2VsZi5ob3N0X292ZXJyaWRlOgorICAgICAgbG9nZ2luZy5pbmZvKCJTZXJ2ZXI6ICVzOyBIb3N0OiAlcyIsIHNlbGYuaG9zdCwgc2VsZi5ob3N0X292ZXJyaWRlKQorICAgIGVsc2U6CisgICAgICBsb2dnaW5nLmluZm8oIlNlcnZlcjogJXMiLCBzZWxmLmhvc3QpCisKKyAgZGVmIF9HZXRPcGVuZXIoc2VsZik6CisgICAgIiIiUmV0dXJucyBhbiBPcGVuZXJEaXJlY3RvciBmb3IgbWFraW5nIEhUVFAgcmVxdWVzdHMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICBkZWYgX0NyZWF0ZVJlcXVlc3Qoc2VsZiwgdXJsLCBkYXRhPU5vbmUpOgorICAgICIiIkNyZWF0ZXMgYSBuZXcgdXJsbGliIHJlcXVlc3QuIiIiCisgICAgbG9nZ2luZy5kZWJ1ZygiQ3JlYXRpbmcgcmVxdWVzdCBmb3I6ICclcycgd2l0aCBwYXlsb2FkOlxuJXMiLCB1cmwsIGRhdGEpCisgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybCwgZGF0YT1kYXRhKQorICAgIGlmIHNlbGYuaG9zdF9vdmVycmlkZToKKyAgICAgIHJlcS5hZGRfaGVhZGVyKCJIb3N0Iiwgc2VsZi5ob3N0X292ZXJyaWRlKQorICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZXh0cmFfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgIHJlcS5hZGRfaGVhZGVyKGtleSwgdmFsdWUpCisgICAgcmV0dXJuIHJlcQorCisgIGRlZiBfR2V0QXV0aFRva2VuKHNlbGYsIGVtYWlsLCBwYXNzd29yZCk6CisgICAgIiIiVXNlcyBDbGllbnRMb2dpbiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHJldHVybmluZyBhbiBhdXRoIHRva2VuLgorCisgICAgQXJnczoKKyAgICAgIGVtYWlsOiAgICBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MKKyAgICAgIHBhc3N3b3JkOiBUaGUgdXNlcidzIHBhc3N3b3JkCisKKyAgICBSYWlzZXM6CisgICAgICBDbGllbnRMb2dpbkVycm9yOiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXV0aGVudGljYXRpbmcgd2l0aCBDbGllbnRMb2dpbi4KKyAgICAgIEhUVFBFcnJvcjogSWYgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZm9ybSBvZiBIVFRQIGVycm9yLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiByZXR1cm5lZCBieSBDbGllbnRMb2dpbi4KKyAgICAiIiIKKyAgICBhY2NvdW50X3R5cGUgPSAiR09PR0xFIgorICAgIGlmIHNlbGYuaG9zdC5lbmRzd2l0aCgiLmdvb2dsZS5jb20iKToKKyAgICAgICMgTmVlZGVkIGZvciB1c2UgaW5zaWRlIEdvb2dsZS4KKyAgICAgIGFjY291bnRfdHlwZSA9ICJIT1NURUQiCisgICAgcmVxID0gc2VsZi5fQ3JlYXRlUmVxdWVzdCgKKyAgICAgICAgdXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL0NsaWVudExvZ2luIiwKKyAgICAgICAgZGF0YT11cmxsaWIudXJsZW5jb2RlKHsKKyAgICAgICAgICAgICJFbWFpbCI6IGVtYWlsLAorICAgICAgICAgICAgIlBhc3N3ZCI6IHBhc3N3b3JkLAorICAgICAgICAgICAgInNlcnZpY2UiOiAiYWgiLAorICAgICAgICAgICAgInNvdXJjZSI6ICJyaWV0dmVsZC1jb2RlcmV2aWV3LXVwbG9hZCIsCisgICAgICAgICAgICAiYWNjb3VudFR5cGUiOiBhY2NvdW50X3R5cGUsCisgICAgICAgIH0pLAorICAgICkKKyAgICB0cnk6CisgICAgICByZXNwb25zZSA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQorICAgICAgcmVzcG9uc2VfYm9keSA9IHJlc3BvbnNlLnJlYWQoKQorICAgICAgcmVzcG9uc2VfZGljdCA9IGRpY3QoeC5zcGxpdCgiPSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByZXNwb25zZV9ib2R5LnNwbGl0KCJcbiIpIGlmIHgpCisgICAgICByZXR1cm4gcmVzcG9uc2VfZGljdFsiQXV0aCJdCisgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBlOgorICAgICAgaWYgZS5jb2RlID09IDQwMzoKKyAgICAgICAgYm9keSA9IGUucmVhZCgpCisgICAgICAgIHJlc3BvbnNlX2RpY3QgPSBkaWN0KHguc3BsaXQoIj0iLCAxKSBmb3IgeCBpbiBib2R5LnNwbGl0KCJcbiIpIGlmIHgpCisgICAgICAgIHJhaXNlIENsaWVudExvZ2luRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBlLmNvZGUsIGUubXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGVhZGVycywgcmVzcG9uc2VfZGljdCkKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlCisKKyAgZGVmIF9HZXRBdXRoQ29va2llKHNlbGYsIGF1dGhfdG9rZW4pOgorICAgICIiIkZldGNoZXMgYXV0aGVudGljYXRpb24gY29va2llcyBmb3IgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uCisKKyAgICBBcmdzOgorICAgICAgYXV0aF90b2tlbjogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHJldHVybmVkIGJ5IENsaWVudExvZ2luLgorCisgICAgUmFpc2VzOgorICAgICAgSFRUUEVycm9yOiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgZmV0Y2hpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMuCisgICAgIiIiCisgICAgIyBUaGlzIGlzIGEgZHVtbXkgdmFsdWUgdG8gYWxsb3cgdXMgdG8gaWRlbnRpZnkgd2hlbiB3ZSdyZSBzdWNjZXNzZnVsLgorICAgIGNvbnRpbnVlX2xvY2F0aW9uID0gImh0dHA6Ly9sb2NhbGhvc3QvIgorICAgIGFyZ3MgPSB7ImNvbnRpbnVlIjogY29udGludWVfbG9jYXRpb24sICJhdXRoIjogYXV0aF90b2tlbn0KKyAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KCJodHRwOi8vJXMvX2FoL2xvZ2luPyVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCB1cmxsaWIudXJsZW5jb2RlKGFyZ3MpKSkKKyAgICB0cnk6CisgICAgICByZXNwb25zZSA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQorICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgIHJlc3BvbnNlID0gZQorICAgIGlmIChyZXNwb25zZS5jb2RlICE9IDMwMiBvcgorICAgICAgICByZXNwb25zZS5pbmZvKClbImxvY2F0aW9uIl0gIT0gY29udGludWVfbG9jYXRpb24pOgorICAgICAgcmFpc2UgdXJsbGliMi5IVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCByZXNwb25zZS5jb2RlLCByZXNwb25zZS5tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5mcCkKKyAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisKKyAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6CisgICAgIiIiQXV0aGVudGljYXRlcyB0aGUgdXNlci4KKworICAgIFRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIHdvcmtzIGFzIGZvbGxvd3M6CisgICAgIDEpIFdlIGdldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmcm9tIHRoZSB1c2VyCisgICAgIDIpIFdlIHVzZSBDbGllbnRMb2dpbiB0byBvYnRhaW4gYW4gQVVUSCB0b2tlbiBmb3IgdGhlIHVzZXIKKyAgICAgICAgKHNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvYWNjb3VudHMvQXV0aEZvckluc3RhbGxlZEFwcHMuaHRtbCkuCisgICAgIDMpIFdlIHBhc3MgdGhlIGF1dGggdG9rZW4gdG8gL19haC9sb2dpbiBvbiB0aGUgc2VydmVyIHRvIG9idGFpbiBhbgorICAgICAgICBhdXRoZW50aWNhdGlvbiBjb29raWUuIElmIGxvZ2luIHdhcyBzdWNjZXNzZnVsLCBpdCB0cmllcyB0byByZWRpcmVjdAorICAgICAgICB1cyB0byB0aGUgVVJMIHdlIHByb3ZpZGVkLgorCisgICAgSWYgd2UgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIHVwbG9hZCBBUEkgd2l0aG91dCBmaXJzdCBvYnRhaW5pbmcgYW4KKyAgICBhdXRoZW50aWNhdGlvbiBjb29raWUsIGl0IHJldHVybnMgYSA0MDEgcmVzcG9uc2UgYW5kIGRpcmVjdHMgdXMgdG8KKyAgICBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHdpdGggQ2xpZW50TG9naW4uCisgICAgIiIiCisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICBjcmVkZW50aWFscyA9IHNlbGYuYXV0aF9mdW5jdGlvbigpCisgICAgICB0cnk6CisgICAgICAgIGF1dGhfdG9rZW4gPSBzZWxmLl9HZXRBdXRoVG9rZW4oY3JlZGVudGlhbHNbMF0sIGNyZWRlbnRpYWxzWzFdKQorICAgICAgZXhjZXB0IENsaWVudExvZ2luRXJyb3IsIGU6CisgICAgICAgIGlmIGUucmVhc29uID09ICJCYWRBdXRoZW50aWNhdGlvbiI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4iCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkNhcHRjaGFSZXF1aXJlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAgICJQbGVhc2UgZ28gdG9cbiIKKyAgICAgICAgICAgICAgImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvRGlzcGxheVVubG9ja0NhcHRjaGFcbiIKKyAgICAgICAgICAgICAgImFuZCB2ZXJpZnkgeW91IGFyZSBhIGh1bWFuLiAgVGhlbiB0cnkgYWdhaW4uIikKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiTm90VmVyaWZpZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkFjY291bnQgbm90IHZlcmlmaWVkLiIKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiVGVybXNOb3RBZ3JlZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlVzZXIgaGFzIG5vdCBhZ3JlZWQgdG8gVE9TLiIKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQWNjb3VudERlbGV0ZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlRoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGVsZXRlZC4iCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkFjY291bnREaXNhYmxlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVGhlIHVzZXIgYWNjb3VudCBoYXMgYmVlbiBkaXNhYmxlZC4iCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIlNlcnZpY2VEaXNhYmxlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoIlRoZSB1c2VyJ3MgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIGhhcyBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQuIikKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiU2VydmljZVVuYXZhaWxhYmxlIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUaGUgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlOyB0cnkgYWdhaW4gbGF0ZXIuIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIHJhaXNlCisgICAgICBzZWxmLl9HZXRBdXRoQ29va2llKGF1dGhfdG9rZW4pCisgICAgICByZXR1cm4KKworICBkZWYgU2VuZChzZWxmLCByZXF1ZXN0X3BhdGgsIHBheWxvYWQ9Tm9uZSwKKyAgICAgICAgICAgY29udGVudF90eXBlPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLAorICAgICAgICAgICB0aW1lb3V0PU5vbmUsCisgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAiIiJTZW5kcyBhbiBSUEMgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlLgorCisgICAgQXJnczoKKyAgICAgIHJlcXVlc3RfcGF0aDogVGhlIHBhdGggdG8gc2VuZCB0aGUgcmVxdWVzdCB0bywgZWcgL2FwaS9hcHB2ZXJzaW9uL2NyZWF0ZS4KKyAgICAgIHBheWxvYWQ6IFRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LCBvciBOb25lIHRvIHNlbmQgYW4gZW1wdHkgcmVxdWVzdC4KKyAgICAgIGNvbnRlbnRfdHlwZTogVGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdXNlLgorICAgICAgdGltZW91dDogdGltZW91dCBpbiBzZWNvbmRzOyBkZWZhdWx0IE5vbmUgaS5lLiBubyB0aW1lb3V0LgorICAgICAgICAoTm90ZTogZm9yIGxhcmdlIHJlcXVlc3RzIG9uIE9TIFgsIHRoZSB0aW1lb3V0IGRvZXNuJ3Qgd29yayByaWdodC4pCisgICAgICBrd2FyZ3M6IEFueSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIGludG8gcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIHJlc3BvbnNlIGJvZHksIGFzIGEgc3RyaW5nLgorICAgICIiIgorICAgICMgVE9ETzogRG9uJ3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIExldCB0aGUgc2VydmVyIHNheQorICAgICMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkuCisgICAgaWYgbm90IHNlbGYuYXV0aGVudGljYXRlZDoKKyAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCisKKyAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCisgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCisgICAgdHJ5OgorICAgICAgdHJpZXMgPSAwCisgICAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cmllcyArPSAxCisgICAgICAgIGFyZ3MgPSBkaWN0KGt3YXJncykKKyAgICAgICAgdXJsID0gImh0dHA6Ly8lcyVzIiAlIChzZWxmLmhvc3QsIHJlcXVlc3RfcGF0aCkKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICB1cmwgKz0gIj8iICsgdXJsbGliLnVybGVuY29kZShhcmdzKQorICAgICAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KHVybD11cmwsIGRhdGE9cGF5bG9hZCkKKyAgICAgICAgcmVxLmFkZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIGNvbnRlbnRfdHlwZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgIGYgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKKyAgICAgICAgICByZXNwb25zZSA9IGYucmVhZCgpCisgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgICAgICBpZiB0cmllcyA+IDM6CisgICAgICAgICAgICByYWlzZQorICAgICAgICAgIGVsaWYgZS5jb2RlID09IDQwMToKKyAgICAgICAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCisjIyAgICAgICAgICAgZWxpZiBlLmNvZGUgPj0gNTAwIGFuZCBlLmNvZGUgPCA2MDA6CisjIyAgICAgICAgICAgICAjIFNlcnZlciBFcnJvciAtIHRyeSBhZ2Fpbi4KKyMjICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgZmluYWxseToKKyAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKKworCitjbGFzcyBIdHRwUnBjU2VydmVyKEFic3RyYWN0UnBjU2VydmVyKToKKyAgIiIiUHJvdmlkZXMgYSBzaW1wbGlmaWVkIFJQQy1zdHlsZSBpbnRlcmZhY2UgZm9yIEhUVFAgcmVxdWVzdHMuIiIiCisKKyAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6CisgICAgIiIiU2F2ZSB0aGUgY29va2llIGphciBhZnRlciBhdXRoZW50aWNhdGlvbi4iIiIKKyAgICBzdXBlcihIdHRwUnBjU2VydmVyLCBzZWxmKS5fQXV0aGVudGljYXRlKCkKKyAgICBpZiBzZWxmLnNhdmVfY29va2llczoKKyAgICAgIFN0YXR1c1VwZGF0ZSgiU2F2aW5nIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gJXMiICUgc2VsZi5jb29raWVfZmlsZSkKKyAgICAgIHNlbGYuY29va2llX2phci5zYXZlKCkKKworICBkZWYgX0dldE9wZW5lcihzZWxmKToKKyAgICAiIiJSZXR1cm5zIGFuIE9wZW5lckRpcmVjdG9yIHRoYXQgc3VwcG9ydHMgY29va2llcyBhbmQgaWdub3JlcyByZWRpcmVjdHMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KKyAgICAiIiIKKyAgICBvcGVuZXIgPSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yKCkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Qcm94eUhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Vbmtub3duSGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBIYW5kbGVyKCkpCisgICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUERlZmF1bHRFcnJvckhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQU0hhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQRXJyb3JQcm9jZXNzb3IoKSkKKyAgICBpZiBzZWxmLnNhdmVfY29va2llczoKKyAgICAgIHNlbGYuY29va2llX2ZpbGUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvZGVyZXZpZXdfdXBsb2FkX2Nvb2tpZXMiKQorICAgICAgc2VsZi5jb29raWVfamFyID0gY29va2llbGliLk1vemlsbGFDb29raWVKYXIoc2VsZi5jb29raWVfZmlsZSkKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuY29va2llX2ZpbGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgc2VsZi5jb29raWVfamFyLmxvYWQoKQorICAgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKKyAgICAgICAgICBTdGF0dXNVcGRhdGUoIkxvYWRlZCBhdXRoZW50aWNhdGlvbiBjb29raWVzIGZyb20gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29raWVfZmlsZSkKKyAgICAgICAgZXhjZXB0IChjb29raWVsaWIuTG9hZEVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAjIEZhaWxlZCB0byBsb2FkIGNvb2tpZXMgLSBqdXN0IGlnbm9yZSB0aGVtLgorICAgICAgICAgIHBhc3MKKyAgICAgIGVsc2U6CisgICAgICAgICMgQ3JlYXRlIGFuIGVtcHR5IGNvb2tpZSBmaWxlIHdpdGggbW9kZSA2MDAKKyAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuY29va2llX2ZpbGUsIG9zLk9fQ1JFQVQsIDA2MDApCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgIyBBbHdheXMgY2htb2QgdGhlIGNvb2tpZSBmaWxlCisgICAgICBvcy5jaG1vZChzZWxmLmNvb2tpZV9maWxlLCAwNjAwKQorICAgIGVsc2U6CisgICAgICAjIERvbid0IHNhdmUgY29va2llcyBhY3Jvc3MgcnVucyBvZiB1cGRhdGUucHkuCisgICAgICBzZWxmLmNvb2tpZV9qYXIgPSBjb29raWVsaWIuQ29va2llSmFyKCkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKHNlbGYuY29va2llX2phcikpCisgICAgcmV0dXJuIG9wZW5lcgorCisKK3BhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdIikKK3BhcnNlci5hZGRfb3B0aW9uKCIteSIsICItLWFzc3VtZV95ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgZGVzdD0iYXNzdW1lX3llcyIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICBoZWxwPSJBc3N1bWUgdGhhdCB0aGUgYW5zd2VyIHRvIHllcy9ubyBxdWVzdGlvbnMgaXMgJ3llcycuIikKKyMgTG9nZ2luZworZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiTG9nZ2luZyBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGhlbHA9IlByaW50IGVycm9ycyBvbmx5LiIpCitncm91cC5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9MSwKKyAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgaW5mbyBsZXZlbCBsb2dzIChkZWZhdWx0KS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1ub2lzeSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0zLAorICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgaGVscD0iUHJpbnQgYWxsIGxvZ3MuIikKKyMgUmV2aWV3IHNlcnZlcgorZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUmV2aWV3IHNlcnZlciBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1zIiwgIi0tc2VydmVyIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InNlcnZlciIsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImNvZGVyZXZpZXcuYXBwc3BvdC5jb20iLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJTRVJWRVIiLAorICAgICAgICAgICAgICAgICBoZWxwPSgiVGhlIHNlcnZlciB0byB1cGxvYWQgdG8uIFRoZSBmb3JtYXQgaXMgaG9zdFs6cG9ydF0uICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRzIHRvICdjb2RlcmV2aWV3LmFwcHNwb3QuY29tJy4iKSkKK2dyb3VwLmFkZF9vcHRpb24oIi1lIiwgIi0tZW1haWwiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZW1haWwiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJFTUFJTCIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iVGhlIHVzZXJuYW1lIHRvIHVzZS4gV2lsbCBwcm9tcHQgaWYgb21pdHRlZC4iKQorZ3JvdXAuYWRkX29wdGlvbigiLUgiLCAiLS1ob3N0IiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9Imhvc3QiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJIT1NUIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJPdmVycmlkZXMgdGhlIEhvc3QgaGVhZGVyIHNlbnQgd2l0aCBhbGwgUlBDcy4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1ub19jb29raWVzIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9InNhdmVfY29va2llcyIsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iRG8gbm90IHNhdmUgYXV0aGVudGljYXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLiIpCisjIElzc3VlCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJJc3N1ZSBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1kIiwgIi0tZGVzY3JpcHRpb24iLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJERVNDUklQVElPTiIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgZGVzY3JpcHRpb24gd2hlbiBjcmVhdGluZyBhbiBpc3N1ZS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLWYiLCAiLS1kZXNjcmlwdGlvbl9maWxlIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9ImRlc2NyaXB0aW9uX2ZpbGUiLCBtZXRhdmFyPSJERVNDUklQVElPTl9GSUxFIiwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJPcHRpb25hbCBwYXRoIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIGRlc2NyaXB0aW9uIHdoZW4gY3JlYXRpbmcgYW4gaXNzdWUuIikKK2dyb3VwLmFkZF9vcHRpb24oIi1yIiwgIi0tcmV2aWV3ZXJzIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlld2VycyIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlJFVklFV0VSUyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQWRkIHJldmlld2VycyAoY29tbWEgc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tY2MiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iY2MiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJDQyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQWRkIENDIChjb21tYSBzZXBhcmF0ZWQgZW1haWwgYWRkcmVzc2VzKS4iKQorIyBVcGxvYWQgb3B0aW9ucworZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUGF0Y2ggb3B0aW9ucyIpCitncm91cC5hZGRfb3B0aW9uKCItbSIsICItLW1lc3NhZ2UiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0ibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9Ik1FU1NBR0UiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9IkEgbWVzc2FnZSB0byBpZGVudGlmeSB0aGUgcGF0Y2guICIKKyAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBwcm9tcHQgaWYgb21pdHRlZC4iKQorZ3JvdXAuYWRkX29wdGlvbigiLWkiLCAiLS1pc3N1ZSIsIHR5cGU9ImludCIsIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJJU1NVRSIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iSXNzdWUgbnVtYmVyIHRvIHdoaWNoIHRvIGFkZC4gRGVmYXVsdHMgdG8gbmV3IGlzc3VlLiIpCitncm91cC5hZGRfb3B0aW9uKCItLWRvd25sb2FkX2Jhc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICBkZXN0PSJkb3dubG9hZF9iYXNlIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQmFzZSBmaWxlcyB3aWxsIGJlIGRvd25sb2FkZWQgYnkgdGhlIHNlcnZlciAiCisgICAgICAgICAgICAgICAgICIoc2lkZS1ieS1zaWRlIGRpZmZzIG1heSBub3Qgd29yayBvbiBmaWxlcyB3aXRoIENScykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tcmV2IiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlzaW9uIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iUkVWIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJCcmFuY2gvdHJlZS9yZXZpc2lvbiB0byBkaWZmIGFnYWluc3QgKHVzZWQgYnkgRFZDUykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tc2VuZF9tYWlsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgZGVzdD0ic2VuZF9tYWlsIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iU2VuZCBub3RpZmljYXRpb24gZW1haWwgdG8gcmV2aWV3ZXJzLiIpCisKKworZGVmIEdldFJwY1NlcnZlcihvcHRpb25zKToKKyAgIiIiUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhbiBBYnN0cmFjdFJwY1NlcnZlci4KKworICBSZXR1cm5zOgorICAgIEEgbmV3IEFic3RyYWN0UnBjU2VydmVyLCBvbiB3aGljaCBSUEMgY2FsbHMgY2FuIGJlIG1hZGUuCisgICIiIgorCisgIHJwY19zZXJ2ZXJfY2xhc3MgPSBIdHRwUnBjU2VydmVyCisKKyAgZGVmIEdldFVzZXJDcmVkZW50aWFscygpOgorICAgICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiIiIgorICAgIGVtYWlsID0gb3B0aW9ucy5lbWFpbAorICAgIGlmIGVtYWlsIGlzIE5vbmU6CisgICAgICBlbWFpbCA9IEdldEVtYWlsKCJFbWFpbCAobG9naW4gZm9yIHVwbG9hZGluZyB0byAlcykiICUgb3B0aW9ucy5zZXJ2ZXIpCisgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIlBhc3N3b3JkIGZvciAlczogIiAlIGVtYWlsKQorICAgIHJldHVybiAoZW1haWwsIHBhc3N3b3JkKQorCisgICMgSWYgdGhpcyBpcyB0aGUgZGV2X2FwcHNlcnZlciwgdXNlIGZha2UgYXV0aGVudGljYXRpb24uCisgIGhvc3QgPSAob3B0aW9ucy5ob3N0IG9yIG9wdGlvbnMuc2VydmVyKS5sb3dlcigpCisgIGlmIGhvc3QgPT0gImxvY2FsaG9zdCIgb3IgaG9zdC5zdGFydHN3aXRoKCJsb2NhbGhvc3Q6Iik6CisgICAgZW1haWwgPSBvcHRpb25zLmVtYWlsCisgICAgaWYgZW1haWwgaXMgTm9uZToKKyAgICAgIGVtYWlsID0gInRlc3RAZXhhbXBsZS5jb20iCisgICAgICBsb2dnaW5nLmluZm8oIlVzaW5nIGRlYnVnIHVzZXIgJXMuICBPdmVycmlkZSB3aXRoIC0tZW1haWwiICUgZW1haWwpCisgICAgc2VydmVyID0gcnBjX3NlcnZlcl9jbGFzcygKKyAgICAgICAgb3B0aW9ucy5zZXJ2ZXIsCisgICAgICAgIGxhbWJkYTogKGVtYWlsLCAicGFzc3dvcmQiKSwKKyAgICAgICAgaG9zdF9vdmVycmlkZT1vcHRpb25zLmhvc3QsCisgICAgICAgIGV4dHJhX2hlYWRlcnM9eyJDb29raWUiOgorICAgICAgICAgICAgICAgICAgICAgICAnZGV2X2FwcHNlcnZlcl9sb2dpbj0iJXM6RmFsc2UiJyAlIGVtYWlsfSwKKyAgICAgICAgc2F2ZV9jb29raWVzPW9wdGlvbnMuc2F2ZV9jb29raWVzKQorICAgICMgRG9uJ3QgdHJ5IHRvIHRhbGsgdG8gQ2xpZW50TG9naW4uCisgICAgc2VydmVyLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisgICAgcmV0dXJuIHNlcnZlcgorCisgIHJldHVybiBycGNfc2VydmVyX2NsYXNzKG9wdGlvbnMuc2VydmVyLCBHZXRVc2VyQ3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3ZlcnJpZGU9b3B0aW9ucy5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2Nvb2tpZXM9b3B0aW9ucy5zYXZlX2Nvb2tpZXMpCisKKworZGVmIEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZpZWxkcywgZmlsZXMpOgorICAiIiJFbmNvZGUgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydC9mb3JtLWRhdGEuCisKKyAgQXJnczoKKyAgICBmaWVsZHM6IEEgc2VxdWVuY2Ugb2YgKG5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgcmVndWxhciBmb3JtIGZpZWxkcy4KKyAgICBmaWxlczogQSBzZXF1ZW5jZSBvZiAobmFtZSwgZmlsZW5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgZGF0YSB0byBiZQorICAgICAgICAgICB1cGxvYWRlZCBhcyBmaWxlcy4KKyAgUmV0dXJuczoKKyAgICAoY29udGVudF90eXBlLCBib2R5KSByZWFkeSBmb3IgaHR0cGxpYi5IVFRQIGluc3RhbmNlLgorCisgIFNvdXJjZToKKyAgICBodHRwOi8vYXNwbi5hY3RpdmVzdGF0ZS5jb20vQVNQTi9Db29rYm9vay9QeXRob24vUmVjaXBlLzE0NjMwNgorICAiIiIKKyAgQk9VTkRBUlkgPSAnLU0tQS1HLUktQy0tLUItTy1VLU4tRC1BLVItWS0nCisgIENSTEYgPSAnXHJcbicKKyAgbGluZXMgPSBbXQorICBmb3IgKGtleSwgdmFsdWUpIGluIGZpZWxkczoKKyAgICBsaW5lcy5hcHBlbmQoJy0tJyArIEJPVU5EQVJZKQorICAgIGxpbmVzLmFwcGVuZCgnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUga2V5KQorICAgIGxpbmVzLmFwcGVuZCgnJykKKyAgICBsaW5lcy5hcHBlbmQodmFsdWUpCisgIGZvciAoa2V5LCBmaWxlbmFtZSwgdmFsdWUpIGluIGZpbGVzOgorICAgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkpCisgICAgbGluZXMuYXBwZW5kKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIjsgZmlsZW5hbWU9IiVzIicgJQorICAgICAgICAgICAgIChrZXksIGZpbGVuYW1lKSkKKyAgICBsaW5lcy5hcHBlbmQoJ0NvbnRlbnQtVHlwZTogJXMnICUgR2V0Q29udGVudFR5cGUoZmlsZW5hbWUpKQorICAgIGxpbmVzLmFwcGVuZCgnJykKKyAgICBsaW5lcy5hcHBlbmQodmFsdWUpCisgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkgKyAnLS0nKQorICBsaW5lcy5hcHBlbmQoJycpCisgIGJvZHkgPSBDUkxGLmpvaW4obGluZXMpCisgIGNvbnRlbnRfdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBCT1VOREFSWQorICByZXR1cm4gY29udGVudF90eXBlLCBib2R5CisKKworZGVmIEdldENvbnRlbnRUeXBlKGZpbGVuYW1lKToKKyAgIiIiSGVscGVyIHRvIGd1ZXNzIHRoZSBjb250ZW50LXR5cGUgZnJvbSB0aGUgZmlsZW5hbWUuIiIiCisgIHJldHVybiBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0gb3IgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScKKworCisjIFVzZSBhIHNoZWxsIGZvciBzdWJjb21tYW5kcyBvbiBXaW5kb3dzIHRvIGdldCBhIFBBVEggc2VhcmNoLgordXNlX3NoZWxsID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpCisKK2RlZiBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNvbW1hbmQsIHByaW50X291dHB1dD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKToKKyAgIiIiRXhlY3V0ZXMgYSBjb21tYW5kIGFuZCByZXR1cm5zIHRoZSBvdXRwdXQgZnJvbSBzdGRvdXQgYW5kIHRoZSByZXR1cm4gY29kZS4KKworICBBcmdzOgorICAgIGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICBwcmludF9vdXRwdXQ6IElmIFRydWUsIHRoZSBvdXRwdXQgaXMgcHJpbnRlZCB0byBzdGRvdXQuCisgICAgICAgICAgICAgICAgICBJZiBGYWxzZSwgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgaWdub3JlZC4KKyAgICB1bml2ZXJzYWxfbmV3bGluZXM6IFVzZSB1bml2ZXJzYWxfbmV3bGluZXMgZmxhZyAoZGVmYXVsdDogVHJ1ZSkuCisKKyAgUmV0dXJuczoKKyAgICBUdXBsZSAob3V0cHV0LCByZXR1cm4gY29kZSkKKyAgIiIiCisgIGxvZ2dpbmcuaW5mbygiUnVubmluZyAlcyIsIGNvbW1hbmQpCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsPXVzZV9zaGVsbCwgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcykKKyAgaWYgcHJpbnRfb3V0cHV0OgorICAgIG91dHB1dF9hcnJheSA9IFtdCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIGxpbmUgPSBwLnN0ZG91dC5yZWFkbGluZSgpCisgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgYnJlYWsKKyAgICAgIHByaW50IGxpbmUuc3RyaXAoIlxuIikKKyAgICAgIG91dHB1dF9hcnJheS5hcHBlbmQobGluZSkKKyAgICBvdXRwdXQgPSAiIi5qb2luKG91dHB1dF9hcnJheSkKKyAgZWxzZToKKyAgICBvdXRwdXQgPSBwLnN0ZG91dC5yZWFkKCkKKyAgcC53YWl0KCkKKyAgZXJyb3V0ID0gcC5zdGRlcnIucmVhZCgpCisgIGlmIHByaW50X291dHB1dCBhbmQgZXJyb3V0OgorICAgIHByaW50ID4+c3lzLnN0ZGVyciwgZXJyb3V0CisgIHAuc3Rkb3V0LmNsb3NlKCkKKyAgcC5zdGRlcnIuY2xvc2UoKQorICByZXR1cm4gb3V0cHV0LCBwLnJldHVybmNvZGUKKworCitkZWYgUnVuU2hlbGwoY29tbWFuZCwgc2lsZW50X29rPUZhbHNlLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKKyAgICAgICAgICAgICBwcmludF9vdXRwdXQ9RmFsc2UpOgorICBkYXRhLCByZXRjb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjb21tYW5kLCBwcmludF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcykKKyAgaWYgcmV0Y29kZToKKyAgICBFcnJvckV4aXQoIkdvdCBlcnJvciBzdGF0dXMgZnJvbSAlczpcbiVzIiAlIChjb21tYW5kLCBkYXRhKSkKKyAgaWYgbm90IHNpbGVudF9vayBhbmQgbm90IGRhdGE6CisgICAgRXJyb3JFeGl0KCJObyBvdXRwdXQgZnJvbSAlcyIgJSBjb21tYW5kKQorICByZXR1cm4gZGF0YQorCisKK2NsYXNzIFZlcnNpb25Db250cm9sU3lzdGVtKG9iamVjdCk6CisgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgVkNTLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zKToKKyAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgIEFyZ3M6CisgICAgICBvcHRpb25zOiBDb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAiIiIKKyAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCisKKyAgZGVmIEdlbmVyYXRlRGlmZihzZWxmLCBhcmdzKToKKyAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGlmZiBhcyBhIHN0cmluZy4KKworICAgIEFyZ3M6CisgICAgICBhcmdzOiBFeHRyYSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZGlmZiBjb21tYW5kLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKKworICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdW5rbm93biB0byB0aGUgVkNTLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKKworICBkZWYgQ2hlY2tGb3JVbmtub3duRmlsZXMoc2VsZik6CisgICAgIiIiU2hvdyBhbiAiYXJlIHlvdSBzdXJlPyIgcHJvbXB0IGlmIHRoZXJlIGFyZSB1bmtub3duIGZpbGVzLiIiIgorICAgIHVua25vd25fZmlsZXMgPSBzZWxmLkdldFVua25vd25GaWxlcygpCisgICAgaWYgdW5rbm93bl9maWxlczoKKyAgICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBub3QgYWRkZWQgdG8gdmVyc2lvbiBjb250cm9sOiIKKyAgICAgIGZvciBsaW5lIGluIHVua25vd25fZmlsZXM6CisgICAgICAgIHByaW50IGxpbmUKKyAgICAgIHByb21wdCA9ICJBcmUgeW91IHN1cmUgdG8gY29udGludWU/KHkvTikgIgorICAgICAgYW5zd2VyID0gcmF3X2lucHV0KHByb21wdCkuc3RyaXAoKQorICAgICAgaWYgYW5zd2VyICE9ICJ5IjoKKyAgICAgICAgRXJyb3JFeGl0KCJVc2VyIGFib3J0ZWQiKQorCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiR2V0IHRoZSBjb250ZW50IG9mIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIG9mIGEgZmlsZS4KKworICAgIFJldHVybnM6CisgICAgICBBIHR1cGxlIChiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cykKKyAgICAgICAgYmFzZV9jb250ZW50OiBUaGUgY29udGVudHMgb2YgdGhlIGJhc2UgZmlsZS4KKyAgICAgICAgbmV3X2NvbnRlbnQ6IEZvciB0ZXh0IGZpbGVzLCB0aGlzIGlzIGVtcHR5LiAgRm9yIGJpbmFyeSBmaWxlcywgdGhpcyBpcworICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IGZpbGUsIHNpbmNlIHRoZSBkaWZmIG91dHB1dCB3b24ndCBjb250YWluCisgICAgICAgICAgaW5mb3JtYXRpb24gdG8gcmVjb25zdHJ1Y3QgdGhlIGN1cnJlbnQgZmlsZS4KKyAgICAgICAgaXNfYmluYXJ5OiBUcnVlIGlmZiB0aGUgZmlsZSBpcyBiaW5hcnkuCisgICAgICAgIHN0YXR1czogVGhlIHN0YXR1cyBvZiB0aGUgZmlsZS4KKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKKworCisgIGRlZiBHZXRCYXNlRmlsZXMoc2VsZiwgZGlmZik6CisgICAgIiIiSGVscGVyIHRoYXQgY2FsbHMgR2V0QmFzZSBmaWxlIGZvciBlYWNoIGZpbGUgaW4gdGhlIHBhdGNoLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgZnJvbSBmaWxlbmFtZSB0byBHZXRCYXNlRmlsZSdzIHR1cGxlLiAgRmlsZW5hbWVzCisgICAgICBhcmUgcmV0cmlldmVkIGJhc2VkIG9uIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAiSW5kZXg6IiBvcgorICAgICAgIlByb3BlcnR5IGNoYW5nZXMgb246Ii4KKyAgICAiIiIKKyAgICBmaWxlcyA9IHt9CisgICAgZm9yIGxpbmUgaW4gZGlmZi5zcGxpdGxpbmVzKFRydWUpOgorICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdJbmRleDonKSBvciBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6CisgICAgICAgIHVudXNlZCwgZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgICAgIyBPbiBXaW5kb3dzIGlmIGEgZmlsZSBoYXMgcHJvcGVydHkgY2hhbmdlcyBpdHMgZmlsZW5hbWUgdXNlcyAnXCcKKyAgICAgICAgIyBpbnN0ZWFkIG9mICcvJy4KKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgICAgICBmaWxlc1tmaWxlbmFtZV0gPSBzZWxmLkdldEJhc2VGaWxlKGZpbGVuYW1lKQorICAgIHJldHVybiBmaWxlcworCisKKyAgZGVmIFVwbG9hZEJhc2VGaWxlcyhzZWxmLCBpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hfbGlzdCwgcGF0Y2hzZXQsIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpOgorICAgICIiIlVwbG9hZHMgdGhlIGJhc2UgZmlsZXMgKGFuZCBpZiBuZWNlc3NhcnksIHRoZSBjdXJyZW50IG9uZXMgYXMgd2VsbCkuIiIiCisKKyAgICBkZWYgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIGlzX2Jhc2UpOgorICAgICAgIiIiVXBsb2FkcyBhIGZpbGUgdG8gdGhlIHNlcnZlci4iIiIKKyAgICAgIGZpbGVfdG9vX2xhcmdlID0gRmFsc2UKKyAgICAgIGlmIGlzX2Jhc2U6CisgICAgICAgIHR5cGUgPSAiYmFzZSIKKyAgICAgIGVsc2U6CisgICAgICAgIHR5cGUgPSAiY3VycmVudCIKKyAgICAgIGlmIGxlbihjb250ZW50KSA+IE1BWF9VUExPQURfU0laRToKKyAgICAgICAgcHJpbnQgKCJOb3QgdXBsb2FkaW5nIHRoZSAlcyBmaWxlIGZvciAlcyBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlLiIgJQorICAgICAgICAgICAgICAgKHR5cGUsIGZpbGVuYW1lKSkKKyAgICAgICAgZmlsZV90b29fbGFyZ2UgPSBUcnVlCisgICAgICAgIGNvbnRlbnQgPSAiIgorICAgICAgY2hlY2tzdW0gPSBtZDUubmV3KGNvbnRlbnQpLmhleGRpZ2VzdCgpCisgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwIGFuZCBub3QgZmlsZV90b29fbGFyZ2U6CisgICAgICAgIHByaW50ICJVcGxvYWRpbmcgJXMgZmlsZSBmb3IgJXMiICUgKHR5cGUsIGZpbGVuYW1lKQorICAgICAgdXJsID0gIi8lZC91cGxvYWRfY29udGVudC8lZC8lZCIgJSAoaW50KGlzc3VlKSwgaW50KHBhdGNoc2V0KSwgZmlsZV9pZCkKKyAgICAgIGZvcm1fZmllbGRzID0gWygiZmlsZW5hbWUiLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAoInN0YXR1cyIsIHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAoImNoZWNrc3VtIiwgY2hlY2tzdW0pLAorICAgICAgICAgICAgICAgICAgICAgKCJpc19iaW5hcnkiLCBzdHIoaXNfYmluYXJ5KSksCisgICAgICAgICAgICAgICAgICAgICAoImlzX2N1cnJlbnQiLCBzdHIobm90IGlzX2Jhc2UpKSwKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgaWYgZmlsZV90b29fbGFyZ2U6CisgICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImZpbGVfdG9vX2xhcmdlIiwgIjEiKSkKKyAgICAgIGlmIG9wdGlvbnMuZW1haWw6CisgICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKKyAgICAgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZm9ybV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoImRhdGEiLCBmaWxlbmFtZSwgY29udGVudCldKQorICAgICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgICAgIGlmIG5vdCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIk9LIik6CisgICAgICAgIFN0YXR1c1VwZGF0ZSgiICAtLT4gJXMiICUgcmVzcG9uc2VfYm9keSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHBhdGNoZXMgPSBkaWN0KCkKKyAgICBbcGF0Y2hlcy5zZXRkZWZhdWx0KHYsIGspIGZvciBrLCB2IGluIHBhdGNoX2xpc3RdCisgICAgZm9yIGZpbGVuYW1lIGluIHBhdGNoZXMua2V5cygpOgorICAgICAgYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMgPSBmaWxlc1tmaWxlbmFtZV0KKyAgICAgIGZpbGVfaWRfc3RyID0gcGF0Y2hlcy5nZXQoZmlsZW5hbWUpCisgICAgICBpZiBmaWxlX2lkX3N0ci5maW5kKCJub2Jhc2UiKSAhPSAtMToKKyAgICAgICAgYmFzZV9jb250ZW50ID0gTm9uZQorICAgICAgICBmaWxlX2lkX3N0ciA9IGZpbGVfaWRfc3RyW2ZpbGVfaWRfc3RyLnJmaW5kKCJfIikgKyAxOl0KKyAgICAgIGZpbGVfaWQgPSBpbnQoZmlsZV9pZF9zdHIpCisgICAgICBpZiBiYXNlX2NvbnRlbnQgIT0gTm9uZToKKyAgICAgICAgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgYmFzZV9jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgVHJ1ZSkKKyAgICAgIGlmIG5ld19jb250ZW50ICE9IE5vbmU6CisgICAgICAgIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgRmFsc2UpCisKKyAgZGVmIElzSW1hZ2Uoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaGFzIGFuIGltYWdlIGV4dGVuc2lvbi4iIiIKKyAgICBtaW1ldHlwZSA9ICBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0KKyAgICBpZiBub3QgbWltZXR5cGU6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gbWltZXR5cGUuc3RhcnRzd2l0aCgiaW1hZ2UvIikKKworCitjbGFzcyBTdWJ2ZXJzaW9uVkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKKyAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgU3VidmVyc2lvbi4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAgc3VwZXIoU3VidmVyc2lvblZDUywgc2VsZikuX19pbml0X18ob3B0aW9ucykKKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiKFxkKykoOihcZCspKT8iLCBzZWxmLm9wdGlvbnMucmV2aXNpb24pCisgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBTdWJ2ZXJzaW9uIHJldmlzaW9uICVzLiIgJSBzZWxmLm9wdGlvbnMucmV2aXNpb24pCisgICAgICBzZWxmLnJldl9zdGFydCA9IG1hdGNoLmdyb3VwKDEpCisgICAgICBzZWxmLnJldl9lbmQgPSBtYXRjaC5ncm91cCgzKQorICAgIGVsc2U6CisgICAgICBzZWxmLnJldl9zdGFydCA9IHNlbGYucmV2X2VuZCA9IE5vbmUKKyAgICAjIENhY2hlIG91dHB1dCBmcm9tICJzdm4gbGlzdCAtciBSRVZOTyBkaXJuYW1lIi4KKyAgICAjIEtleXM6IGRpcm5hbWUsIFZhbHVlczogMi10dXBsZSAob3VwdXQgZm9yIHN0YXJ0IHJldiBhbmQgZW5kIHJldikuCisgICAgc2VsZi5zdm5sc19jYWNoZSA9IHt9CisgICAgIyBTVk4gYmFzZSBVUkwgaXMgcmVxdWlyZWQgdG8gZmV0Y2ggZmlsZXMgZGVsZXRlZCBpbiBhbiBvbGRlciByZXZpc2lvbi4KKyAgICAjIFJlc3VsdCBpcyBjYWNoZWQgdG8gbm90IGd1ZXNzIGl0IG92ZXIgYW5kIG92ZXIgYWdhaW4gaW4gR2V0QmFzZUZpbGUoKS4KKyAgICByZXF1aXJlZCA9IHNlbGYub3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIHNlbGYub3B0aW9ucy5yZXZpc2lvbiBpcyBub3QgTm9uZQorICAgIHNlbGYuc3ZuX2Jhc2UgPSBzZWxmLl9HdWVzc0Jhc2UocmVxdWlyZWQpCisKKyAgZGVmIEd1ZXNzQmFzZShzZWxmLCByZXF1aXJlZCk6CisgICAgIiIiV3JhcHBlciBmb3IgX0d1ZXNzQmFzZS4iIiIKKyAgICByZXR1cm4gc2VsZi5zdm5fYmFzZQorCisgIGRlZiBfR3Vlc3NCYXNlKHNlbGYsIHJlcXVpcmVkKToKKyAgICAiIiJSZXR1cm5zIHRoZSBTVk4gYmFzZSBVUkwuCisKKyAgICBBcmdzOgorICAgICAgcmVxdWlyZWQ6IElmIHRydWUsIGV4aXRzIGlmIHRoZSB1cmwgY2FuJ3QgYmUgZ3Vlc3NlZCwgb3RoZXJ3aXNlIE5vbmUgaXMKKyAgICAgICAgcmV0dXJuZWQuCisgICAgIiIiCisgICAgaW5mbyA9IFJ1blNoZWxsKFsic3ZuIiwgImluZm8iXSkKKyAgICBmb3IgbGluZSBpbiBpbmZvLnNwbGl0bGluZXMoKToKKyAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICBpZiBsZW4od29yZHMpID09IDIgYW5kIHdvcmRzWzBdID09ICJVUkw6IjoKKyAgICAgICAgdXJsID0gd29yZHNbMV0KKyAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgICAgICB1c2VybmFtZSwgbmV0bG9jID0gdXJsbGliLnNwbGl0dXNlcihuZXRsb2MpCisgICAgICAgIGlmIHVzZXJuYW1lOgorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiUmVtb3ZlZCB1c2VybmFtZSBmcm9tIGJhc2UgVVJMIikKKyAgICAgICAgaWYgbmV0bG9jLmVuZHN3aXRoKCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgIGlmIG5ldGxvYyA9PSAic3ZuLnB5dGhvbi5vcmciOgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCIvcHJvamVjdHMvIik6CisgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzk6XQorICAgICAgICAgIGVsaWYgbmV0bG9jICE9ICJweXRob25kZXZAc3ZuLnB5dGhvbi5vcmciOgorICAgICAgICAgICAgRXJyb3JFeGl0KCJVbnJlY29nbml6ZWQgUHl0aG9uIFVSTDogJXMiICUgdXJsKQorICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5weXRob24ub3JnL3ZpZXcvKmNoZWNrb3V0KiVzLyIgJSBwYXRoCisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFB5dGhvbiBiYXNlID0gJXMiLCBiYXNlKQorICAgICAgICBlbGlmIG5ldGxvYy5lbmRzd2l0aCgic3ZuLmNvbGxhYi5uZXQiKToKKyAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoIi9yZXBvcy8iKToKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzY6XQorICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5jb2xsYWIubmV0L3ZpZXd2Yy8qY2hlY2tvdXQqJXMvIiAlIHBhdGgKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgQ29sbGFiTmV0IGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIGVsaWYgbmV0bG9jLmVuZHN3aXRoKCIuZ29vZ2xlY29kZS5jb20iKToKKyAgICAgICAgICBwYXRoID0gcGF0aCArICIvIgorICAgICAgICAgIGJhc2UgPSB1cmxwYXJzZS51cmx1bnBhcnNlKCgiaHR0cCIsIG5ldGxvYywgcGF0aCwgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQpKQorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBHb29nbGUgQ29kZSBiYXNlID0gJXMiLCBiYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iCisgICAgICAgICAgYmFzZSA9IHVybHBhcnNlLnVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFnbWVudCkpCisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIHJldHVybiBiYXNlCisgICAgaWYgcmVxdWlyZWQ6CisgICAgICBFcnJvckV4aXQoIkNhbid0IGZpbmQgVVJMIGluIG91dHB1dCBmcm9tIHN2biBpbmZvIikKKyAgICByZXR1cm4gTm9uZQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgYXJncyk6CisgICAgY21kID0gWyJzdm4iLCAiZGlmZiJdCisgICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgY21kICs9IFsiLXIiLCBzZWxmLm9wdGlvbnMucmV2aXNpb25dCisgICAgY21kLmV4dGVuZChhcmdzKQorICAgIGRhdGEgPSBSdW5TaGVsbChjbWQpCisgICAgY291bnQgPSAwCisgICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkluZGV4OiIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiUHJvcGVydHkgY2hhbmdlcyBvbjoiKToKKyAgICAgICAgY291bnQgKz0gMQorICAgICAgICBsb2dnaW5nLmluZm8obGluZSkKKyAgICBpZiBub3QgY291bnQ6CisgICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gc3ZuIGRpZmYiKQorICAgIHJldHVybiBkYXRhCisKKyAgZGVmIF9Db2xsYXBzZUtleXdvcmRzKHNlbGYsIGNvbnRlbnQsIGtleXdvcmRfc3RyKToKKyAgICAiIiJDb2xsYXBzZXMgU1ZOIGtleXdvcmRzLiIiIgorICAgICMgc3ZuIGNhdCB0cmFuc2xhdGVzIGtleXdvcmRzIGJ1dCBzdm4gZGlmZiBkb2Vzbid0LiBBcyBhIHJlc3VsdCBvZiB0aGlzCisgICAgIyBiZWhhdmlvciBwYXRjaGluZy5QYXRjaENodW5rcygpIGZhaWxzIHdpdGggYSBjaHVuayBtaXNtYXRjaCBlcnJvci4KKyAgICAjIFRoaXMgcGFydCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IHRoZSBSZXZpZXcgQm9hcmQgZGV2ZWxvcG1lbnQgdGVhbQorICAgICMgd2hvIGhhZCB0aGUgc2FtZSBwcm9ibGVtIChodHRwOi8vcmV2aWV3cy5yZXZpZXctYm9hcmQub3JnL3IvMjc2LykuCisgICAgIyBNYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtub3duIGFsaWFzZXMKKyAgICBzdm5fa2V5d29yZHMgPSB7CisgICAgICAjIFN0YW5kYXJkIGtleXdvcmRzCisgICAgICAnRGF0ZSc6ICAgICAgICAgICAgICAgIFsnRGF0ZScsICdMYXN0Q2hhbmdlZERhdGUnXSwKKyAgICAgICdSZXZpc2lvbic6ICAgICAgICAgICAgWydSZXZpc2lvbicsICdMYXN0Q2hhbmdlZFJldmlzaW9uJywgJ1JldiddLAorICAgICAgJ0F1dGhvcic6ICAgICAgICAgICAgICBbJ0F1dGhvcicsICdMYXN0Q2hhbmdlZEJ5J10sCisgICAgICAnSGVhZFVSTCc6ICAgICAgICAgICAgIFsnSGVhZFVSTCcsICdVUkwnXSwKKyAgICAgICdJZCc6ICAgICAgICAgICAgICAgICAgWydJZCddLAorCisgICAgICAjIEFsaWFzZXMKKyAgICAgICdMYXN0Q2hhbmdlZERhdGUnOiAgICAgWydMYXN0Q2hhbmdlZERhdGUnLCAnRGF0ZSddLAorICAgICAgJ0xhc3RDaGFuZ2VkUmV2aXNpb24nOiBbJ0xhc3RDaGFuZ2VkUmV2aXNpb24nLCAnUmV2JywgJ1JldmlzaW9uJ10sCisgICAgICAnTGFzdENoYW5nZWRCeSc6ICAgICAgIFsnTGFzdENoYW5nZWRCeScsICdBdXRob3InXSwKKyAgICAgICdVUkwnOiAgICAgICAgICAgICAgICAgWydVUkwnLCAnSGVhZFVSTCddLAorICAgIH0KKworICAgIGRlZiByZXBsKG0pOgorICAgICAgIGlmIG0uZ3JvdXAoMik6CisgICAgICAgICByZXR1cm4gIiQlczo6JXMkIiAlIChtLmdyb3VwKDEpLCAiICIgKiBsZW4obS5ncm91cCgzKSkpCisgICAgICAgcmV0dXJuICIkJXMkIiAlIG0uZ3JvdXAoMSkKKyAgICBrZXl3b3JkcyA9IFtrZXl3b3JkCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4ga2V5d29yZF9zdHIuc3BsaXQoIiAiKQorICAgICAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIHN2bl9rZXl3b3Jkcy5nZXQobmFtZSwgW10pXQorICAgIHJldHVybiByZS5zdWIociJcJCglcyk6KDo/KShbXlwkXSspXCQiICUgJ3wnLmpvaW4oa2V5d29yZHMpLCByZXBsLCBjb250ZW50KQorCisgIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6CisgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJzdm4iLCAic3RhdHVzIiwgIi0taWdub3JlLWV4dGVybmFscyJdLCBzaWxlbnRfb2s9VHJ1ZSkKKyAgICB1bmtub3duX2ZpbGVzID0gW10KKyAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXQoIlxuIik6CisgICAgICBpZiBsaW5lIGFuZCBsaW5lWzBdID09ICI/IjoKKyAgICAgICAgdW5rbm93bl9maWxlcy5hcHBlbmQobGluZSkKKyAgICByZXR1cm4gdW5rbm93bl9maWxlcworCisgIGRlZiBSZWFkRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJucyB0aGUgY29udGVudHMgb2YgYSBmaWxlLiIiIgorICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lLCAncmInKQorICAgIHJlc3VsdCA9ICIiCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gZmlsZS5yZWFkKCkKKyAgICBmaW5hbGx5OgorICAgICAgZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBHZXRTdGF0dXMoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybnMgdGhlIHN0YXR1cyBvZiBhIGZpbGUuIiIiCisgICAgaWYgbm90IHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsic3ZuIiwgInN0YXR1cyIsICItLWlnbm9yZS1leHRlcm5hbHMiLCBmaWxlbmFtZV0pCisgICAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICBFcnJvckV4aXQoInN2biBzdGF0dXMgcmV0dXJuZWQgbm8gb3V0cHV0IGZvciAlcyIgJSBmaWxlbmFtZSkKKyAgICAgIHN0YXR1c19saW5lcyA9IHN0YXR1cy5zcGxpdGxpbmVzKCkKKyAgICAgICMgSWYgZmlsZSBpcyBpbiBhIGNsLCB0aGUgb3V0cHV0IHdpbGwgYmVnaW4gd2l0aAorICAgICAgIyAiXG4tLS0gQ2hhbmdlbGlzdCAnY2xfbmFtZSc6XG4iLiAgU2VlCisgICAgICAjIGh0dHA6Ly9zdm4uY29sbGFiLm5ldC9yZXBvcy9zdm4vdHJ1bmsvbm90ZXMvY2hhbmdlbGlzdC1kZXNpZ24udHh0CisgICAgICBpZiAobGVuKHN0YXR1c19saW5lcykgPT0gMyBhbmQKKyAgICAgICAgICBub3Qgc3RhdHVzX2xpbmVzWzBdIGFuZAorICAgICAgICAgIHN0YXR1c19saW5lc1sxXS5zdGFydHN3aXRoKCItLS0gQ2hhbmdlbGlzdCIpKToKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzX2xpbmVzWzJdCisgICAgICBlbHNlOgorICAgICAgICBzdGF0dXMgPSBzdGF0dXNfbGluZXNbMF0KKyAgICAjIElmIHdlIGhhdmUgYSByZXZpc2lvbiB0byBkaWZmIGFnYWluc3Qgd2UgbmVlZCB0byBydW4gInN2biBsaXN0IgorICAgICMgZm9yIHRoZSBvbGQgYW5kIHRoZSBuZXcgcmV2aXNpb24gYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMgdG8gZ2V0CisgICAgIyB0aGUgY29ycmVjdCBzdGF0dXMgZm9yIGEgZmlsZS4KKyAgICBlbHNlOgorICAgICAgZGlybmFtZSwgcmVsZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgaWYgZGlybmFtZSBub3QgaW4gc2VsZi5zdm5sc19jYWNoZToKKyAgICAgICAgY21kID0gWyJzdm4iLCAibGlzdCIsICItciIsIHNlbGYucmV2X3N0YXJ0LCBkaXJuYW1lIG9yICIuIl0KKyAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICAgIGlmIHJldHVybmNvZGU6CisgICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyBmb3IgJXMuIiAlIGZpbGVuYW1lKQorICAgICAgICBvbGRfZmlsZXMgPSBvdXQuc3BsaXRsaW5lcygpCisgICAgICAgIGFyZ3MgPSBbInN2biIsICJsaXN0Il0KKyAgICAgICAgaWYgc2VsZi5yZXZfZW5kOgorICAgICAgICAgIGFyZ3MgKz0gWyItciIsIHNlbGYucmV2X2VuZF0KKyAgICAgICAgY21kID0gYXJncyArIFtkaXJuYW1lIG9yICIuIl0KKyAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICAgIGlmIHJldHVybmNvZGU6CisgICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJXMiICUgY21kKQorICAgICAgICBzZWxmLnN2bmxzX2NhY2hlW2Rpcm5hbWVdID0gKG9sZF9maWxlcywgb3V0LnNwbGl0bGluZXMoKSkKKyAgICAgIG9sZF9maWxlcywgbmV3X2ZpbGVzID0gc2VsZi5zdm5sc19jYWNoZVtkaXJuYW1lXQorICAgICAgaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBub3QgaW4gbmV3X2ZpbGVzOgorICAgICAgICBzdGF0dXMgPSAiRCAgICIKKyAgICAgIGVsaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBpbiBuZXdfZmlsZXM6CisgICAgICAgIHN0YXR1cyA9ICJNICAgIgorICAgICAgZWxzZToKKyAgICAgICAgc3RhdHVzID0gIkEgICAiCisgICAgcmV0dXJuIHN0YXR1cworCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgc3RhdHVzID0gc2VsZi5HZXRTdGF0dXMoZmlsZW5hbWUpCisgICAgYmFzZV9jb250ZW50ID0gTm9uZQorICAgIG5ld19jb250ZW50ID0gTm9uZQorCisgICAgIyBJZiBhIGZpbGUgaXMgY29waWVkIGl0cyBzdGF0dXMgd2lsbCBiZSAiQSAgKyIsIHdoaWNoIHNpZ25pZmllcworICAgICMgImFkZGl0aW9uLXdpdGgtaGlzdG9yeSIuICBTZWUgInN2biBzdCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBXZSBuZWVkIHRvCisgICAgIyB1cGxvYWQgdGhlIG9yaWdpbmFsIGZpbGUgb3IgZWxzZSBkaWZmIHBhcnNpbmcgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIHdhcworICAgICMgZWRpdGVkLgorICAgIGlmIHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSAhPSAiKyI6CisgICAgICAjIFdlJ2xsIG5lZWQgdG8gdXBsb2FkIHRoZSBuZXcgY29udGVudCBpZiB3ZSdyZSBhZGRpbmcgYSBiaW5hcnkgZmlsZQorICAgICAgIyBzaW5jZSBkaWZmJ3Mgb3V0cHV0IHdvbid0IGNvbnRhaW4gaXQuCisgICAgICBtaW1ldHlwZSA9IFJ1blNoZWxsKFsic3ZuIiwgInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIGZpbGVuYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgICAgaXNfYmluYXJ5ID0gbWltZXR5cGUgYW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCisgICAgICBpZiBpc19iaW5hcnkgYW5kIHNlbGYuSXNJbWFnZShmaWxlbmFtZSk6CisgICAgICAgIG5ld19jb250ZW50ID0gc2VsZi5SZWFkRmlsZShmaWxlbmFtZSkKKyAgICBlbGlmIChzdGF0dXNbMF0gaW4gKCJNIiwgIkQiLCAiUiIpIG9yCisgICAgICAgICAgKHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSA9PSAiKyIpIG9yICAjIENvcGllZCBmaWxlLgorICAgICAgICAgIChzdGF0dXNbMF0gPT0gIiAiIGFuZCBzdGF0dXNbMV0gPT0gIk0iKSk6ICAjIFByb3BlcnR5IGNoYW5nZS4KKyAgICAgIGFyZ3MgPSBbXQorICAgICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgIGVsc2U6CisgICAgICAgICMgRG9uJ3QgY2hhbmdlIGZpbGVuYW1lLCBpdCdzIG5lZWRlZCBsYXRlci4KKyAgICAgICAgdXJsID0gZmlsZW5hbWUKKyAgICAgICAgYXJncyArPSBbIi1yIiwgIkJBU0UiXQorICAgICAgY21kID0gWyJzdm4iXSArIGFyZ3MgKyBbInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIHVybF0KKyAgICAgIG1pbWV0eXBlLCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICBpZiByZXR1cm5jb2RlOgorICAgICAgICAjIEZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHJlcXVlc3RlZCByZXZpc2lvbi4KKyAgICAgICAgIyBSZXNldCBtaW1ldHlwZSwgaXQgY29udGFpbnMgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgbWltZXR5cGUgPSAiIgorICAgICAgZ2V0X2Jhc2UgPSBGYWxzZQorICAgICAgaXNfYmluYXJ5ID0gbWltZXR5cGUgYW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCisgICAgICBpZiBzdGF0dXNbMF0gPT0gIiAiOgorICAgICAgICAjIEVtcHR5IGJhc2UgY29udGVudCBqdXN0IHRvIGZvcmNlIGFuIHVwbG9hZC4KKyAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGVsaWYgaXNfYmluYXJ5OgorICAgICAgICBpZiBzZWxmLklzSW1hZ2UoZmlsZW5hbWUpOgorICAgICAgICAgIGdldF9iYXNlID0gVHJ1ZQorICAgICAgICAgIGlmIHN0YXR1c1swXSA9PSAiTSI6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZXZfZW5kOgorICAgICAgICAgICAgICBuZXdfY29udGVudCA9IHNlbGYuUmVhZEZpbGUoZmlsZW5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9lbmQpCisgICAgICAgICAgICAgIG5ld19jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgdXJsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwgc2lsZW50X29rPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGVsc2U6CisgICAgICAgIGdldF9iYXNlID0gVHJ1ZQorCisgICAgICBpZiBnZXRfYmFzZToKKyAgICAgICAgaWYgaXNfYmluYXJ5OgorICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcyA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzID0gVHJ1ZQorICAgICAgICBpZiBzZWxmLnJldl9zdGFydDoKKyAgICAgICAgICAjICJzdm4gY2F0IC1yIFJFViBkZWxldGVfZmlsZS50eHQiIGRvZXNuJ3Qgd29yay4gY2F0IHJlcXVpcmVzCisgICAgICAgICAgIyB0aGUgZnVsbCBVUkwgd2l0aCAiQFJFViIgYXBwZW5kZWQgaW5zdGVhZCBvZiB1c2luZyAiLXIiIG9wdGlvbi4KKyAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbInN2biIsICJjYXQiLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgZmlsZW5hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICAgIGlmIG5vdCBpc19iaW5hcnk6CisgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgaWYgc2VsZi5yZXZfc3RhcnQ6CisgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJsID0gZmlsZW5hbWUKKyAgICAgICAgICAgIGFyZ3MgKz0gWyItciIsICJCQVNFIl0KKyAgICAgICAgICBjbWQgPSBbInN2biJdICsgYXJncyArIFsicHJvcGdldCIsICJzdm46a2V5d29yZHMiLCB1cmxdCisgICAgICAgICAga2V5d29yZHMsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNtZCkKKyAgICAgICAgICBpZiBrZXl3b3JkcyBhbmQgbm90IHJldHVybmNvZGU6CisgICAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBzZWxmLl9Db2xsYXBzZUtleXdvcmRzKGJhc2VfY29udGVudCwga2V5d29yZHMpCisgICAgZWxzZToKKyAgICAgIFN0YXR1c1VwZGF0ZSgic3ZuIHN0YXR1cyByZXR1cm5lZCB1bmV4cGVjdGVkIG91dHB1dDogJXMiICUgc3RhdHVzKQorICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXR1cm4gYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXNbMDo1XQorCisKK2NsYXNzIEdpdFZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6CisgICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2UgZm9yIEdpdC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAgc3VwZXIoR2l0VkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAgICMgTWFwIG9mIGZpbGVuYW1lIC0+IGhhc2ggb2YgYmFzZSBmaWxlLgorICAgIHNlbGYuYmFzZV9oYXNoZXMgPSB7fQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgZXh0cmFfYXJncyk6CisgICAgIyBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBzdm4ncyBHZW5lcmF0ZURpZmYgYmVjYXVzZSB3ZSBtdXN0IGNvbnZlcnQKKyAgICAjIHRoZSBkaWZmIG91dHB1dCB0byBpbmNsdWRlIGFuIHN2bi1zdHlsZSAiSW5kZXg6IiBsaW5lIGFzIHdlbGwgYXMgcmVjb3JkCisgICAgIyB0aGUgaGFzaGVzIG9mIHRoZSBiYXNlIGZpbGVzLCBzbyB3ZSBjYW4gdXBsb2FkIHRoZW0gYWxvbmcgd2l0aCBvdXIgZGlmZi4KKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBleHRyYV9hcmdzID0gW3NlbGYub3B0aW9ucy5yZXZpc2lvbl0gKyBleHRyYV9hcmdzCisgICAgZ2l0ZGlmZiA9IFJ1blNoZWxsKFsiZ2l0IiwgImRpZmYiLCAiLS1mdWxsLWluZGV4Il0gKyBleHRyYV9hcmdzKQorICAgIHN2bmRpZmYgPSBbXQorICAgIGZpbGVjb3VudCA9IDAKKyAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBmb3IgbGluZSBpbiBnaXRkaWZmLnNwbGl0bGluZXMoKToKKyAgICAgIG1hdGNoID0gcmUubWF0Y2gociJkaWZmIC0tZ2l0IGEvKC4qKSBiLy4qJCIsIGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgZmlsZWNvdW50ICs9IDEKKyAgICAgICAgZmlsZW5hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICBzdm5kaWZmLmFwcGVuZCgiSW5kZXg6ICVzXG4iICUgZmlsZW5hbWUpCisgICAgICBlbHNlOgorICAgICAgICAjIFRoZSAiaW5kZXgiIGxpbmUgaW4gYSBnaXQgZGlmZiBsb29rcyBsaWtlIHRoaXMgKGxvbmcgaGFzaGVzIGVsaWRlZCk6CisgICAgICAgICMgICBpbmRleCA4MmMwZDQ0Li5iMmNlZTNmIDEwMDc1NQorICAgICAgICAjIFdlIHdhbnQgdG8gc2F2ZSB0aGUgbGVmdCBoYXNoLCBhcyB0aGF0IGlkZW50aWZpZXMgdGhlIGJhc2UgZmlsZS4KKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyImluZGV4IChcdyspXC5cLiIsIGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIHNlbGYuYmFzZV9oYXNoZXNbZmlsZW5hbWVdID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUgKyAiXG4iKQorICAgIGlmIG5vdCBmaWxlY291bnQ6CisgICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gZ2l0IGRpZmYiKQorICAgIHJldHVybiAiIi5qb2luKHN2bmRpZmYpCisKKyAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKKyAgICBzdGF0dXMgPSBSdW5TaGVsbChbImdpdCIsICJscy1maWxlcyIsICItLWV4Y2x1ZGUtc3RhbmRhcmQiLCAiLS1vdGhlcnMiXSwKKyAgICAgICAgICAgICAgICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICByZXR1cm4gc3RhdHVzLnNwbGl0bGluZXMoKQorCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgaGFzaCA9IHNlbGYuYmFzZV9oYXNoZXNbZmlsZW5hbWVdCisgICAgYmFzZV9jb250ZW50ID0gTm9uZQorICAgIG5ld19jb250ZW50ID0gTm9uZQorICAgIGlzX2JpbmFyeSA9IEZhbHNlCisgICAgaWYgaGFzaCA9PSAiMCIgKiA0MDogICMgQWxsLXplcm8gaGFzaCBpbmRpY2F0ZXMgbm8gYmFzZSBmaWxlLgorICAgICAgc3RhdHVzID0gIkEiCisgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgIGVsc2U6CisgICAgICBzdGF0dXMgPSAiTSIKKyAgICAgIGJhc2VfY29udGVudCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAic2hvdyIsIGhhc2hdKQorICAgICAgaWYgcmV0dXJuY29kZToKKyAgICAgICAgRXJyb3JFeGl0KCJHb3QgZXJyb3Igc3RhdHVzIGZyb20gJ2dpdCBzaG93ICVzJyIgJSBoYXNoKQorICAgIHJldHVybiAoYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMpCisKKworY2xhc3MgTWVyY3VyaWFsVkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKKyAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgTWVyY3VyaWFsLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCByZXBvX2Rpcik6CisgICAgc3VwZXIoTWVyY3VyaWFsVkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAgICMgQWJzb2x1dGUgcGF0aCB0byByZXBvc2l0b3J5ICh3ZSBjYW4gYmUgaW4gYSBzdWJkaXIpCisgICAgc2VsZi5yZXBvX2RpciA9IG9zLnBhdGgubm9ybXBhdGgocmVwb19kaXIpCisgICAgIyBDb21wdXRlIHRoZSBzdWJkaXIKKyAgICBjd2QgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLmdldGN3ZCgpKQorICAgIGFzc2VydCBjd2Quc3RhcnRzd2l0aChzZWxmLnJlcG9fZGlyKQorICAgIHNlbGYuc3ViZGlyID0gY3dkW2xlbihzZWxmLnJlcG9fZGlyKTpdLmxzdHJpcChyIlwvIikKKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBzZWxmLmJhc2VfcmV2ID0gc2VsZi5vcHRpb25zLnJldmlzaW9uCisgICAgZWxzZToKKyAgICAgIHNlbGYuYmFzZV9yZXYgPSBSdW5TaGVsbChbImhnIiwgInBhcmVudCIsICItcSJdKS5zcGxpdCgnOicpWzFdLnN0cmlwKCkKKworICBkZWYgX0dldFJlbFBhdGgoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIkdldCByZWxhdGl2ZSBwYXRoIG9mIGEgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAorICAgIGdpdmVuIGl0cyBsb2dpY2FsIHBhdGggaW4gdGhlIHJlcG8uIiIiCisgICAgYXNzZXJ0IGZpbGVuYW1lLnN0YXJ0c3dpdGgoc2VsZi5zdWJkaXIpLCBmaWxlbmFtZQorICAgIHJldHVybiBmaWxlbmFtZVtsZW4oc2VsZi5zdWJkaXIpOl0ubHN0cmlwKHIiXC8iKQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgZXh0cmFfYXJncyk6CisgICAgIyBJZiBubyBmaWxlIHNwZWNpZmllZCwgcmVzdHJpY3QgdG8gdGhlIGN1cnJlbnQgc3ViZGlyCisgICAgZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3Mgb3IgWyIuIl0KKyAgICBjbWQgPSBbImhnIiwgImRpZmYiLCAiLS1naXQiLCAiLXIiLCBzZWxmLmJhc2VfcmV2XSArIGV4dHJhX2FyZ3MKKyAgICBkYXRhID0gUnVuU2hlbGwoY21kLCBzaWxlbnRfb2s9VHJ1ZSkKKyAgICBzdm5kaWZmID0gW10KKyAgICBmaWxlY291bnQgPSAwCisgICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICBtID0gcmUubWF0Y2goImRpZmYgLS1naXQgYS8oXFMrKSBiLyhcUyspIiwgbGluZSkKKyAgICAgIGlmIG06CisgICAgICAgICMgTW9kaWZ5IGxpbmUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYXMgaXQgY29tZXMgZnJvbSBzdm4gZGlmZi4KKyAgICAgICAgIyBXaXRoIHRoaXMgbW9kaWZpY2F0aW9uIG5vIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlIGFyZSByZXF1aXJlZAorICAgICAgICAjIHRvIG1ha2UgdXBsb2FkLnB5IHdvcmsgd2l0aCBNZXJjdXJpYWwgcmVwb3MuCisgICAgICAgICMgTk9URTogZm9yIHByb3BlciBoYW5kbGluZyBvZiBtb3ZlZC9jb3BpZWQgZmlsZXMsIHdlIGhhdmUgdG8gdXNlCisgICAgICAgICMgdGhlIHNlY29uZCBmaWxlbmFtZS4KKyAgICAgICAgZmlsZW5hbWUgPSBtLmdyb3VwKDIpCisgICAgICAgIHN2bmRpZmYuYXBwZW5kKCJJbmRleDogJXMiICUgZmlsZW5hbWUpCisgICAgICAgIHN2bmRpZmYuYXBwZW5kKCI9IiAqIDY3KQorICAgICAgICBmaWxlY291bnQgKz0gMQorICAgICAgICBsb2dnaW5nLmluZm8obGluZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUpCisgICAgaWYgbm90IGZpbGVjb3VudDoKKyAgICAgIEVycm9yRXhpdCgiTm8gdmFsaWQgcGF0Y2hlcyBmb3VuZCBpbiBvdXRwdXQgZnJvbSBoZyBkaWZmIikKKyAgICByZXR1cm4gIlxuIi5qb2luKHN2bmRpZmYpICsgIlxuIgorCisgIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlcyB1bmtub3duIHRvIHRoZSBWQ1MuIiIiCisgICAgYXJncyA9IFtdCisgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJoZyIsICJzdGF0dXMiLCAiLS1yZXYiLCBzZWxmLmJhc2VfcmV2LCAiLXUiLCAiLiJdLAorICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICB1bmtub3duX2ZpbGVzID0gW10KKyAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXRsaW5lcygpOgorICAgICAgc3QsIGZuID0gbGluZS5zcGxpdCgiICIsIDEpCisgICAgICBpZiBzdCA9PSAiPyI6CisgICAgICAgIHVua25vd25fZmlsZXMuYXBwZW5kKGZuKQorICAgIHJldHVybiB1bmtub3duX2ZpbGVzCisKKyAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAjICJoZyBzdGF0dXMiIGFuZCAiaGcgY2F0IiBib3RoIHRha2UgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN1YmRpcgorICAgICMgcmF0aGVyIHRoYW4gdG8gdGhlIHJlcG8gcm9vdCwgYnV0ICJoZyBkaWZmIiBoYXMgZ2l2ZW4gdXMgdGhlIGZ1bGwgcGF0aAorICAgICMgdG8gdGhlIHJlcG8gcm9vdC4KKyAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgIG5ld19jb250ZW50ID0gTm9uZQorICAgIGlzX2JpbmFyeSA9IEZhbHNlCisgICAgb2xkcmVscGF0aCA9IHJlbHBhdGggPSBzZWxmLl9HZXRSZWxQYXRoKGZpbGVuYW1lKQorICAgICMgImhnIHN0YXR1cyAtQyIgcmV0dXJucyB0d28gbGluZXMgZm9yIG1vdmVkL2NvcGllZCBmaWxlcywgb25lIG90aGVyd2lzZQorICAgIG91dCA9IFJ1blNoZWxsKFsiaGciLCAic3RhdHVzIiwgIi1DIiwgIi0tcmV2Iiwgc2VsZi5iYXNlX3JldiwgcmVscGF0aF0pCisgICAgb3V0ID0gb3V0LnNwbGl0bGluZXMoKQorICAgICMgSEFDSzogc3RyaXAgZXJyb3IgbWVzc2FnZSBhYm91dCBtaXNzaW5nIGZpbGUvZGlyZWN0b3J5IGlmIGl0IGlzbid0IGluCisgICAgIyB0aGUgd29ya2luZyBjb3B5CisgICAgaWYgb3V0WzBdLnN0YXJ0c3dpdGgoJyVzOiAnICUgcmVscGF0aCk6CisgICAgICBvdXQgPSBvdXRbMTpdCisgICAgaWYgbGVuKG91dCkgPiAxOgorICAgICAgIyBNb3ZlZC9jb3BpZWQgPT4gY29uc2lkZXJlZCBhcyBtb2RpZmllZCwgdXNlIG9sZCBmaWxlbmFtZSB0bworICAgICAgIyByZXRyaWV2ZSBiYXNlIGNvbnRlbnRzCisgICAgICBvbGRyZWxwYXRoID0gb3V0WzFdLnN0cmlwKCkKKyAgICAgIHN0YXR1cyA9ICJNIgorICAgIGVsc2U6CisgICAgICBzdGF0dXMsIF8gPSBvdXRbMF0uc3BsaXQoJyAnLCAxKQorICAgIGlmIHN0YXR1cyAhPSAiQSI6CisgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbImhnIiwgImNhdCIsICItciIsIHNlbGYuYmFzZV9yZXYsIG9sZHJlbHBhdGhdLAorICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICAgIGlzX2JpbmFyeSA9ICJcMCIgaW4gYmFzZV9jb250ZW50ICAjIE1lcmN1cmlhbCdzIGhldXJpc3RpYworICAgIGlmIHN0YXR1cyAhPSAiUiI6CisgICAgICBuZXdfY29udGVudCA9IG9wZW4ocmVscGF0aCwgInJiIikucmVhZCgpCisgICAgICBpc19iaW5hcnkgPSBpc19iaW5hcnkgb3IgIlwwIiBpbiBuZXdfY29udGVudAorICAgIGlmIGlzX2JpbmFyeSBhbmQgYmFzZV9jb250ZW50OgorICAgICAgIyBGZXRjaCBhZ2FpbiB3aXRob3V0IGNvbnZlcnRpbmcgbmV3bGluZXMKKyAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsiaGciLCAiY2F0IiwgIi1yIiwgc2VsZi5iYXNlX3Jldiwgb2xkcmVscGF0aF0sCisgICAgICAgIHNpbGVudF9vaz1UcnVlLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UpCisgICAgaWYgbm90IGlzX2JpbmFyeSBvciBub3Qgc2VsZi5Jc0ltYWdlKHJlbHBhdGgpOgorICAgICAgbmV3X2NvbnRlbnQgPSBOb25lCisgICAgcmV0dXJuIGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzCisKKworIyBOT1RFOiBUaGUgU3BsaXRQYXRjaCBmdW5jdGlvbiBpcyBkdXBsaWNhdGVkIGluIGVuZ2luZS5weSwga2VlcCB0aGVtIGluIHN5bmMuCitkZWYgU3BsaXRQYXRjaChkYXRhKToKKyAgIiIiU3BsaXRzIGEgcGF0Y2ggaW50byBzZXBhcmF0ZSBwaWVjZXMgZm9yIGVhY2ggZmlsZS4KKworICBBcmdzOgorICAgIGRhdGE6IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG91dHB1dCBvZiBzdm4gZGlmZi4KKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiAyLXR1cGxlIChmaWxlbmFtZSwgdGV4dCkgd2hlcmUgdGV4dCBpcyB0aGUgc3ZuIGRpZmYgb3V0cHV0CisgICAgICBwZXJ0YWluaW5nIHRvIGZpbGVuYW1lLgorICAiIiIKKyAgcGF0Y2hlcyA9IFtdCisgIGZpbGVuYW1lID0gTm9uZQorICBkaWZmID0gW10KKyAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKFRydWUpOgorICAgIG5ld19maWxlbmFtZSA9IE5vbmUKKyAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0luZGV4OicpOgorICAgICAgdW51c2VkLCBuZXdfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgIG5ld19maWxlbmFtZSA9IG5ld19maWxlbmFtZS5zdHJpcCgpCisgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6CisgICAgICB1bnVzZWQsIHRlbXBfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgICMgV2hlbiBhIGZpbGUgaXMgbW9kaWZpZWQsIHBhdGhzIHVzZSAnLycgYmV0d2VlbiBkaXJlY3RvcmllcywgaG93ZXZlcgorICAgICAgIyB3aGVuIGEgcHJvcGVydHkgaXMgbW9kaWZpZWQgJ1wnIGlzIHVzZWQgb24gV2luZG93cy4gIE1ha2UgdGhlbSB0aGUgc2FtZQorICAgICAgIyBvdGhlcndpc2UgdGhlIGZpbGUgc2hvd3MgdXAgdHdpY2UuCisgICAgICB0ZW1wX2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZS5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgICAgaWYgdGVtcF9maWxlbmFtZSAhPSBmaWxlbmFtZToKKyAgICAgICAgIyBGaWxlIGhhcyBwcm9wZXJ0eSBjaGFuZ2VzIGJ1dCBubyBtb2RpZmljYXRpb25zLCBjcmVhdGUgYSBuZXcgZGlmZi4KKyAgICAgICAgbmV3X2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZQorICAgIGlmIG5ld19maWxlbmFtZToKKyAgICAgIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgorICAgICAgICBwYXRjaGVzLmFwcGVuZCgoZmlsZW5hbWUsICcnLmpvaW4oZGlmZikpKQorICAgICAgZmlsZW5hbWUgPSBuZXdfZmlsZW5hbWUKKyAgICAgIGRpZmYgPSBbbGluZV0KKyAgICAgIGNvbnRpbnVlCisgICAgaWYgZGlmZiBpcyBub3QgTm9uZToKKyAgICAgIGRpZmYuYXBwZW5kKGxpbmUpCisgIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgorICAgIHBhdGNoZXMuYXBwZW5kKChmaWxlbmFtZSwgJycuam9pbihkaWZmKSkpCisgIHJldHVybiBwYXRjaGVzCisKKworZGVmIFVwbG9hZFNlcGFyYXRlUGF0Y2hlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hzZXQsIGRhdGEsIG9wdGlvbnMpOgorICAiIiJVcGxvYWRzIGEgc2VwYXJhdGUgcGF0Y2ggZm9yIGVhY2ggZmlsZSBpbiB0aGUgZGlmZiBvdXRwdXQuCisKKyAgUmV0dXJucyBhIGxpc3Qgb2YgW3BhdGNoX2tleSwgZmlsZW5hbWVdIGZvciBlYWNoIGZpbGUuCisgICIiIgorICBwYXRjaGVzID0gU3BsaXRQYXRjaChkYXRhKQorICBydiA9IFtdCisgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgIGlmIGxlbihwYXRjaFsxXSkgPiBNQVhfVVBMT0FEX1NJWkU6CisgICAgICBwcmludCAoIk5vdCB1cGxvYWRpbmcgdGhlIHBhdGNoIGZvciAiICsgcGF0Y2hbMF0gKworICAgICAgICAgICAgICIgYmVjYXVzZSB0aGUgZmlsZSBpcyB0b28gbGFyZ2UuIikKKyAgICAgIGNvbnRpbnVlCisgICAgZm9ybV9maWVsZHMgPSBbKCJmaWxlbmFtZSIsIHBhdGNoWzBdKV0KKyAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY29udGVudF91cGxvYWQiLCAiMSIpKQorICAgIGZpbGVzID0gWygiZGF0YSIsICJkYXRhLmRpZmYiLCBwYXRjaFsxXSldCisgICAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmb3JtX2ZpZWxkcywgZmlsZXMpCisgICAgdXJsID0gIi8lZC91cGxvYWRfcGF0Y2gvJWQiICUgKGludChpc3N1ZSksIGludChwYXRjaHNldCkpCisgICAgcHJpbnQgIlVwbG9hZGluZyBwYXRjaCBmb3IgIiArIHBhdGNoWzBdCisgICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgICBsaW5lcyA9IHJlc3BvbnNlX2JvZHkuc3BsaXRsaW5lcygpCisgICAgaWYgbm90IGxpbmVzIG9yIGxpbmVzWzBdICE9ICJPSyI6CisgICAgICBTdGF0dXNVcGRhdGUoIiAgLS0+ICVzIiAlIHJlc3BvbnNlX2JvZHkpCisgICAgICBzeXMuZXhpdCgxKQorICAgIHJ2LmFwcGVuZChbbGluZXNbMV0sIHBhdGNoWzBdXSkKKyAgcmV0dXJuIHJ2CisKKworZGVmIEd1ZXNzVkNTKG9wdGlvbnMpOgorICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCisKKyAgVGhpcyBleGFtaW5lcyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGd1ZXNzZXMgd2hpY2ggVmVyc2lvbkNvbnRyb2xTeXN0ZW0KKyAgd2UncmUgdXNpbmcsIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBjbGFzcy4gIEV4aXQgd2l0aCBhbgorICBlcnJvciBpZiB3ZSBjYW4ndCBmaWd1cmUgaXQgb3V0LgorCisgIFJldHVybnM6CisgICAgQSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnN0YW5jZS4gRXhpdHMgaWYgdGhlIFZDUyBjYW4ndCBiZSBndWVzc2VkLgorICAiIiIKKyAgIyBNZXJjdXJpYWwgaGFzIGEgY29tbWFuZCB0byBnZXQgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIGEgcmVwb3NpdG9yeQorICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdlIGRvbid0IGhhdmUgaGcgaW5zdGFsbGVkLgorICAjIE5PVEU6IHdlIHRyeSBNZXJjdXJpYWwgZmlyc3QgYXMgaXQgY2FuIHNpdCBvbiB0b3Agb2YgYW4gU1ZOIHdvcmtpbmcgY29weS4KKyAgdHJ5OgorICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJoZyIsICJyb290Il0pCisgICAgaWYgcmV0dXJuY29kZSA9PSAwOgorICAgICAgcmV0dXJuIE1lcmN1cmlhbFZDUyhvcHRpb25zLCBvdXQuc3RyaXAoKSkKKyAgZXhjZXB0IE9TRXJyb3IsIChlcnJubywgbWVzc2FnZSk6CisgICAgaWYgZXJybm8gIT0gMjogICMgRU5PRU5UIC0tIHRoZXkgZG9uJ3QgaGF2ZSBoZyBpbnN0YWxsZWQuCisgICAgICByYWlzZQorCisgICMgU3VidmVyc2lvbiBoYXMgYSAuc3ZuIGluIGFsbCB3b3JraW5nIGRpcmVjdG9yaWVzLgorICBpZiBvcy5wYXRoLmlzZGlyKCcuc3ZuJyk6CisgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFZDUyA9IFN1YnZlcnNpb24iKQorICAgIHJldHVybiBTdWJ2ZXJzaW9uVkNTKG9wdGlvbnMpCisKKyAgIyBHaXQgaGFzIGEgY29tbWFuZCB0byB0ZXN0IGlmIHlvdSdyZSBpbiBhIGdpdCB0cmVlLgorICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdlIGRvbid0IGhhdmUgZ2l0IGluc3RhbGxlZC4KKyAgdHJ5OgorICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAicmV2LXBhcnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1pcy1pbnNpZGUtd29yay10cmVlIl0pCisgICAgaWYgcmV0dXJuY29kZSA9PSAwOgorICAgICAgcmV0dXJuIEdpdFZDUyhvcHRpb25zKQorICBleGNlcHQgT1NFcnJvciwgKGVycm5vLCBtZXNzYWdlKToKKyAgICBpZiBlcnJubyAhPSAyOiAgIyBFTk9FTlQgLS0gdGhleSBkb24ndCBoYXZlIGdpdCBpbnN0YWxsZWQuCisgICAgICByYWlzZQorCisgIEVycm9yRXhpdCgoIkNvdWxkIG5vdCBndWVzcyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLiAiCisgICAgICAgICAgICAgIkFyZSB5b3UgaW4gYSB3b3JraW5nIGNvcHkgZGlyZWN0b3J5PyIpKQorCisKK2RlZiBSZWFsTWFpbihhcmd2LCBkYXRhPU5vbmUpOgorICAiIiJUaGUgcmVhbCBtYWluIGZ1bmN0aW9uLgorCisgIEFyZ3M6CisgICAgYXJndjogQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICBkYXRhOiBEaWZmIGNvbnRlbnRzLiBJZiBOb25lIChkZWZhdWx0KSB0aGUgZGlmZiBpcyBnZW5lcmF0ZWQgYnkKKyAgICAgIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBieSBHdWVzc1ZDUygpLgorCisgIFJldHVybnM6CisgICAgQSAyLXR1cGxlIChpc3N1ZSBpZCwgcGF0Y2hzZXQgaWQpLgorICAgIFRoZSBwYXRjaHNldCBpZCBpcyBOb25lIGlmIHRoZSBiYXNlIGZpbGVzIGFyZSBub3QgdXBsb2FkZWQgYnkgdGhpcworICAgIHNjcmlwdCAoYXBwbGllcyBvbmx5IHRvIFNWTiBjaGVja291dHMpLgorICAiIiIKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmb3JtYXQ9KCIlKGFzY3RpbWUpLjE5cyAlKGxldmVsbmFtZSlzICUoZmlsZW5hbWUpczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJShsaW5lbm8pcyAlKG1lc3NhZ2UpcyAiKSkKKyAgb3MuZW52aXJvblsnTENfQUxMJ10gPSAnQycKKyAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQorICBnbG9iYWwgdmVyYm9zaXR5CisgIHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zZQorICBpZiB2ZXJib3NpdHkgPj0gMzoKKyAgICBsb2dnaW5nLmdldExvZ2dlcigpLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCisgIGVsaWYgdmVyYm9zaXR5ID49IDI6CisgICAgbG9nZ2luZy5nZXRMb2dnZXIoKS5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgIHZjcyA9IEd1ZXNzVkNTKG9wdGlvbnMpCisgIGlmIGlzaW5zdGFuY2UodmNzLCBTdWJ2ZXJzaW9uVkNTKToKKyAgICAjIGJhc2UgZmllbGQgaXMgb25seSBhbGxvd2VkIGZvciBTdWJ2ZXJzaW9uLgorICAgICMgTm90ZTogRmV0Y2hpbmcgYmFzZSBmaWxlcyBtYXkgYmVjb21lIGRlcHJlY2F0ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorICAgIGJhc2UgPSB2Y3MuR3Vlc3NCYXNlKG9wdGlvbnMuZG93bmxvYWRfYmFzZSkKKyAgZWxzZToKKyAgICBiYXNlID0gTm9uZQorICBpZiBub3QgYmFzZSBhbmQgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgIG9wdGlvbnMuZG93bmxvYWRfYmFzZSA9IFRydWUKKyAgICBsb2dnaW5nLmluZm8oIkVuYWJsZWQgdXBsb2FkIG9mIGJhc2UgZmlsZSIpCisgIGlmIG5vdCBvcHRpb25zLmFzc3VtZV95ZXM6CisgICAgdmNzLkNoZWNrRm9yVW5rbm93bkZpbGVzKCkKKyAgaWYgZGF0YSBpcyBOb25lOgorICAgIGRhdGEgPSB2Y3MuR2VuZXJhdGVEaWZmKGFyZ3MpCisgIGZpbGVzID0gdmNzLkdldEJhc2VGaWxlcyhkYXRhKQorICBpZiB2ZXJib3NpdHkgPj0gMToKKyAgICBwcmludCAiVXBsb2FkIHNlcnZlcjoiLCBvcHRpb25zLnNlcnZlciwgIihjaGFuZ2Ugd2l0aCAtcy8tLXNlcnZlcikiCisgIGlmIG9wdGlvbnMuaXNzdWU6CisgICAgcHJvbXB0ID0gIk1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHBhdGNoIHNldDogIgorICBlbHNlOgorICAgIHByb21wdCA9ICJOZXcgaXNzdWUgc3ViamVjdDogIgorICBtZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlIG9yIHJhd19pbnB1dChwcm9tcHQpLnN0cmlwKCkKKyAgaWYgbm90IG1lc3NhZ2U6CisgICAgRXJyb3JFeGl0KCJBIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHJlcXVpcmVkIikKKyAgcnBjX3NlcnZlciA9IEdldFJwY1NlcnZlcihvcHRpb25zKQorICBmb3JtX2ZpZWxkcyA9IFsoInN1YmplY3QiLCBtZXNzYWdlKV0KKyAgaWYgYmFzZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJiYXNlIiwgYmFzZSkpCisgIGlmIG9wdGlvbnMuaXNzdWU6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiaXNzdWUiLCBzdHIob3B0aW9ucy5pc3N1ZSkpKQorICBpZiBvcHRpb25zLmVtYWlsOgorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKKyAgaWYgb3B0aW9ucy5yZXZpZXdlcnM6CisgICAgZm9yIHJldmlld2VyIGluIG9wdGlvbnMucmV2aWV3ZXJzLnNwbGl0KCcsJyk6CisgICAgICBpZiAiQCIgaW4gcmV2aWV3ZXIgYW5kIG5vdCByZXZpZXdlci5zcGxpdCgiQCIpWzFdLmNvdW50KCIuIikgPT0gMToKKyAgICAgICAgRXJyb3JFeGl0KCJJbnZhbGlkIGVtYWlsIGFkZHJlc3M6ICVzIiAlIHJldmlld2VyKQorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInJldmlld2VycyIsIG9wdGlvbnMucmV2aWV3ZXJzKSkKKyAgaWYgb3B0aW9ucy5jYzoKKyAgICBmb3IgY2MgaW4gb3B0aW9ucy5jYy5zcGxpdCgnLCcpOgorICAgICAgaWYgIkAiIGluIGNjIGFuZCBub3QgY2Muc3BsaXQoIkAiKVsxXS5jb3VudCgiLiIpID09IDE6CisgICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBlbWFpbCBhZGRyZXNzOiAlcyIgJSBjYykKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjYyIsIG9wdGlvbnMuY2MpKQorICBkZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24KKyAgaWYgb3B0aW9ucy5kZXNjcmlwdGlvbl9maWxlOgorICAgIGlmIG9wdGlvbnMuZGVzY3JpcHRpb246CisgICAgICBFcnJvckV4aXQoIkNhbid0IHNwZWNpZnkgZGVzY3JpcHRpb24gYW5kIGRlc2NyaXB0aW9uX2ZpbGUiKQorICAgIGZpbGUgPSBvcGVuKG9wdGlvbnMuZGVzY3JpcHRpb25fZmlsZSwgJ3InKQorICAgIGRlc2NyaXB0aW9uID0gZmlsZS5yZWFkKCkKKyAgICBmaWxlLmNsb3NlKCkKKyAgaWYgZGVzY3JpcHRpb246CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbikpCisgICMgU2VuZCBhIGhhc2ggb2YgYWxsIHRoZSBiYXNlIGZpbGUgc28gdGhlIHNlcnZlciBjYW4gZGV0ZXJtaW5lIGlmIGEgY29weQorICAjIGFscmVhZHkgZXhpc3RzIGluIGFuIGVhcmxpZXIgcGF0Y2hzZXQuCisgIGJhc2VfaGFzaGVzID0gIiIKKyAgZm9yIGZpbGUsIGluZm8gaW4gZmlsZXMuaXRlcml0ZW1zKCk6CisgICAgaWYgbm90IGluZm9bMF0gaXMgTm9uZToKKyAgICAgIGNoZWNrc3VtID0gbWQ1Lm5ldyhpbmZvWzBdKS5oZXhkaWdlc3QoKQorICAgICAgaWYgYmFzZV9oYXNoZXM6CisgICAgICAgIGJhc2VfaGFzaGVzICs9ICJ8IgorICAgICAgYmFzZV9oYXNoZXMgKz0gY2hlY2tzdW0gKyAiOiIgKyBmaWxlCisgIGZvcm1fZmllbGRzLmFwcGVuZCgoImJhc2VfaGFzaGVzIiwgYmFzZV9oYXNoZXMpKQorICAjIElmIHdlJ3JlIHVwbG9hZGluZyBiYXNlIGZpbGVzLCBkb24ndCBzZW5kIHRoZSBlbWFpbCBiZWZvcmUgdGhlIHVwbG9hZHMsIHNvCisgICMgdGhhdCBpdCBjb250YWlucyB0aGUgZmlsZSBzdGF0dXMuCisgIGlmIG9wdGlvbnMuc2VuZF9tYWlsIGFuZCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgic2VuZF9tYWlsIiwgIjEiKSkKKyAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjb250ZW50X3VwbG9hZCIsICIxIikpCisgIGlmIGxlbihkYXRhKSA+IE1BWF9VUExPQURfU0laRToKKyAgICBwcmludCAiUGF0Y2ggaXMgbGFyZ2UsIHNvIHVwbG9hZGluZyBmaWxlIHBhdGNoZXMgc2VwYXJhdGVseS4iCisgICAgdXBsb2FkZWRfZGlmZl9maWxlID0gW10KKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJzZXBhcmF0ZV9wYXRjaGVzIiwgIjEiKSkKKyAgZWxzZToKKyAgICB1cGxvYWRlZF9kaWZmX2ZpbGUgPSBbKCJkYXRhIiwgImRhdGEuZGlmZiIsIGRhdGEpXQorICBjdHlwZSwgYm9keSA9IEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1fZmllbGRzLCB1cGxvYWRlZF9kaWZmX2ZpbGUpCisgIHJlc3BvbnNlX2JvZHkgPSBycGNfc2VydmVyLlNlbmQoIi91cGxvYWQiLCBib2R5LCBjb250ZW50X3R5cGU9Y3R5cGUpCisgIHBhdGNoc2V0ID0gTm9uZQorICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIG5vdCB1cGxvYWRlZF9kaWZmX2ZpbGU6CisgICAgbGluZXMgPSByZXNwb25zZV9ib2R5LnNwbGl0bGluZXMoKQorICAgIGlmIGxlbihsaW5lcykgPj0gMjoKKyAgICAgIG1zZyA9IGxpbmVzWzBdCisgICAgICBwYXRjaHNldCA9IGxpbmVzWzFdLnN0cmlwKCkKKyAgICAgIHBhdGNoZXMgPSBbeC5zcGxpdCgiICIsIDEpIGZvciB4IGluIGxpbmVzWzI6XV0KKyAgICBlbHNlOgorICAgICAgbXNnID0gcmVzcG9uc2VfYm9keQorICBlbHNlOgorICAgIG1zZyA9IHJlc3BvbnNlX2JvZHkKKyAgU3RhdHVzVXBkYXRlKG1zZykKKyAgaWYgbm90IHJlc3BvbnNlX2JvZHkuc3RhcnRzd2l0aCgiSXNzdWUgY3JlYXRlZC4iKSBhbmQgXAorICBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJJc3N1ZSB1cGRhdGVkLiIpOgorICAgIHN5cy5leGl0KDApCisgIGlzc3VlID0gbXNnW21zZy5yZmluZCgiLyIpKzE6XQorCisgIGlmIG5vdCB1cGxvYWRlZF9kaWZmX2ZpbGU6CisgICAgcmVzdWx0ID0gVXBsb2FkU2VwYXJhdGVQYXRjaGVzKGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaHNldCwgZGF0YSwgb3B0aW9ucykKKyAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgICAgcGF0Y2hlcyA9IHJlc3VsdAorCisgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgdmNzLlVwbG9hZEJhc2VGaWxlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hlcywgcGF0Y2hzZXQsIG9wdGlvbnMsIGZpbGVzKQorICAgIGlmIG9wdGlvbnMuc2VuZF9tYWlsOgorICAgICAgcnBjX3NlcnZlci5TZW5kKCIvIiArIGlzc3VlICsgIi9tYWlsIiwgcGF5bG9hZD0iIikKKyAgcmV0dXJuIGlzc3VlLCBwYXRjaHNldAorCisKK2RlZiBtYWluKCk6CisgIHRyeToKKyAgICBSZWFsTWFpbihzeXMuYXJndikKKyAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgIHByaW50CisgICAgU3RhdHVzVXBkYXRlKCJJbnRlcnJ1cHRlZC4iKQorICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy91cGxvYWRfZ3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc2NyaXB0cy91cGxvYWRfZ3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmUxOWFlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zY3JpcHRzL3VwbG9hZF9ndGVzdC5weQpAQCAtMCwwICsxLDc4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJ1cGxvYWRfZ3Rlc3QucHkgdjAuMS4wIC0tIHVwbG9hZHMgYSBHb29nbGUgVGVzdCBwYXRjaCBmb3IgcmV2aWV3LgorCitUaGlzIHNpbXBsZSB3cmFwcGVyIHBhc3NlcyBhbGwgY29tbWFuZCBsaW5lIGZsYWdzIGFuZAorLS1jYz1nb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gdG8gdXBsb2FkLnB5LgorCitVU0FHRTogdXBsb2FkX2d0ZXN0LnB5IFtvcHRpb25zIGZvciB1cGxvYWQucHldCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK0NDX0ZMQUcgPSAnLS1jYz0nCitHVEVTVF9HUk9VUCA9ICdnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20nCisKKworZGVmIG1haW4oKToKKyAgIyBGaW5kcyB0aGUgcGF0aCB0byB1cGxvYWQucHksIGFzc3VtaW5nIGl0IGlzIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorICAjIGFzIHRoaXMgZmlsZS4KKyAgbXlfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCisgIHVwbG9hZF9weV9wYXRoID0gb3MucGF0aC5qb2luKG15X2RpciwgJ3VwbG9hZC5weScpCisKKyAgIyBBZGRzIEdvb2dsZSBUZXN0IGRpc2N1c3Npb24gZ3JvdXAgdG8gdGhlIGNjIGxpbmUgaWYgaXQncyBub3QgdGhlcmUKKyAgIyBhbHJlYWR5LgorICB1cGxvYWRfcHlfYXJndiA9IFt1cGxvYWRfcHlfcGF0aF0KKyAgZm91bmRfY2NfZmxhZyA9IEZhbHNlCisgIGZvciBhcmcgaW4gc3lzLmFyZ3ZbMTpdOgorICAgIGlmIGFyZy5zdGFydHN3aXRoKENDX0ZMQUcpOgorICAgICAgZm91bmRfY2NfZmxhZyA9IFRydWUKKyAgICAgIGNjX2xpbmUgPSBhcmdbbGVuKENDX0ZMQUcpOl0KKyAgICAgIGNjX2xpc3QgPSBbYWRkciBmb3IgYWRkciBpbiBjY19saW5lLnNwbGl0KCcsJykgaWYgYWRkcl0KKyAgICAgIGlmIEdURVNUX0dST1VQIG5vdCBpbiBjY19saXN0OgorICAgICAgICBjY19saXN0LmFwcGVuZChHVEVTVF9HUk9VUCkKKyAgICAgIHVwbG9hZF9weV9hcmd2LmFwcGVuZChDQ19GTEFHICsgJywnLmpvaW4oY2NfbGlzdCkpCisgICAgZWxzZToKKyAgICAgIHVwbG9hZF9weV9hcmd2LmFwcGVuZChhcmcpCisKKyAgaWYgbm90IGZvdW5kX2NjX2ZsYWc6CisgICAgdXBsb2FkX3B5X2FyZ3YuYXBwZW5kKENDX0ZMQUcgKyBHVEVTVF9HUk9VUCkKKworICAjIEludm9rZXMgdXBsb2FkLnB5IHdpdGggdGhlIG1vZGlmaWVkIGNvbW1hbmQgbGluZSBmbGFncy4KKyAgb3MuZXhlY3YodXBsb2FkX3B5X3BhdGgsIHVwbG9hZF9weV9hcmd2KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1hbGwuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LWFsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTljZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1hbGwuY2MKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBTb21ldGltZXMgaXQncyBkZXNpcmFibGUgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYnkgY29tcGlsaW5nIGEgc2luZ2xlIGZpbGUuCisvLyBUaGlzIGZpbGUgc2VydmVzIHRoaXMgcHVycG9zZS4KKworLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBndGVzdC5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCisvLyB3aGVuIGl0J3MgZnVzZWQuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGd0ZXN0ICouY2MgZmlsZXMuCisjaW5jbHVkZSAic3JjL2d0ZXN0LmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC1maWxlcGF0aC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtcG9ydC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtcHJpbnRlcnMuY2MiCisjaW5jbHVkZSAic3JjL2d0ZXN0LXRlc3QtcGFydC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyIKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjJlNDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCkBAIC0wLDAgKzEsMTIzNCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZGVhdGggdGVzdHMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9PU19NQUMKKyMgIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgaW5jbHVkZSA8c3RkYXJnLmg+CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxzeXMvbW1hbi5oPgorIyAgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBDb25zdGFudHMuCisKKy8vIFRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdERlYXRoVGVzdFN0eWxlW10gPSAiZmFzdCI7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGRlYXRoX3Rlc3Rfc3R5bGUsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZGVhdGhfdGVzdF9zdHlsZSIsIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGUpLAorICAgICJJbmRpY2F0ZXMgaG93IHRvIHJ1biBhIGRlYXRoIHRlc3QgaW4gYSBmb3JrZWQgY2hpbGQgcHJvY2VzczogIgorICAgICJcInRocmVhZHNhZmVcIiAoY2hpbGQgcHJvY2VzcyByZS1leGVjdXRlcyB0aGUgdGVzdCBiaW5hcnkgIgorICAgICJmcm9tIHRoZSBiZWdpbm5pbmcsIHJ1bm5pbmcgb25seSB0aGUgc3BlY2lmaWMgZGVhdGggdGVzdCkgb3IgIgorICAgICJcImZhc3RcIiAoY2hpbGQgcHJvY2VzcyBydW5zIHRoZSBkZWF0aCB0ZXN0IGltbWVkaWF0ZWx5ICIKKyAgICAiYWZ0ZXIgZm9ya2luZykuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBkZWF0aF90ZXN0X3VzZV9mb3JrLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3VzZV9mb3JrIiwgZmFsc2UpLAorICAgICJJbnN0cnVjdHMgdG8gdXNlIGZvcmsoKS9fZXhpdCgpIGluc3RlYWQgb2YgY2xvbmUoKSBpbiBkZWF0aCB0ZXN0cy4gIgorICAgICJJZ25vcmVkIGFuZCBhbHdheXMgdXNlcyBmb3JrKCkgb24gUE9TSVggc3lzdGVtcyB3aGVyZSBjbG9uZSgpIGlzIG5vdCAiCisgICAgImltcGxlbWVudGVkLiBVc2VmdWwgd2hlbiBydW5uaW5nIHVuZGVyIHZhbGdyaW5kIG9yIHNpbWlsYXIgdG9vbHMgaWYgIgorICAgICJ0aG9zZSBkbyBub3Qgc3VwcG9ydCBjbG9uZSgpLiBWYWxncmluZCAzLjMuMSB3aWxsIGp1c3QgZmFpbCBpZiAiCisgICAgIml0IHNlZXMgYW4gdW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgY2xvbmUoKSBmbGFncy4gIgorICAgICJJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmxhZyB3L28gdmFsZ3JpbmQgdGhvdWdoIGl0IHdpbGwgIgorICAgICJ3b3JrIGluIDk5JSBvZiB0aGUgY2FzZXMuIE9uY2UgdmFsZ3JpbmQgaXMgZml4ZWQsIHRoaXMgZmxhZyB3aWxsICIKKyAgICAibW9zdCBsaWtlbHkgYmUgcmVtb3ZlZC4iKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0LCAiIiwKKyAgICAiSW5kaWNhdGVzIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgdGVtcG9yYWwgaW5kZXggb2YgIgorICAgICJ0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdG8gcnVuLCBhbmQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gIgorICAgICJ3aGljaCBhIHN1Y2Nlc3MgY29kZSBtYXkgYmUgc2VudCwgYWxsIHNlcGFyYXRlZCBieSAiCisgICAgImNvbG9ucy4gIFRoaXMgZmxhZyBpcyBzcGVjaWZpZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgIgorICAgICJwcm9jZXNzIGlzIGEgc3ViLXByb2Nlc3MgbGF1bmNoZWQgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZSAiCisgICAgImRlYXRoIHRlc3QuICBGT1IgSU5URVJOQUwgVVNFIE9OTFkuIik7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEV4aXRlZFdpdGhDb2RlIGNvbnN0cnVjdG9yLgorRXhpdGVkV2l0aENvZGU6OkV4aXRlZFdpdGhDb2RlKGludCBleGl0X2NvZGUpIDogZXhpdF9jb2RlXyhleGl0X2NvZGUpIHsKK30KKworLy8gRXhpdGVkV2l0aENvZGUgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgRXhpdGVkV2l0aENvZGU6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gZXhpdF9zdGF0dXMgPT0gZXhpdF9jb2RlXzsKKworIyBlbHNlCisKKyAgcmV0dXJuIFdJRkVYSVRFRChleGl0X3N0YXR1cykgJiYgV0VYSVRTVEFUVVMoZXhpdF9zdGF0dXMpID09IGV4aXRfY29kZV87CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gS2lsbGVkQnlTaWduYWwgY29uc3RydWN0b3IuCitLaWxsZWRCeVNpZ25hbDo6S2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSkgOiBzaWdudW1fKHNpZ251bSkgeworfQorCisvLyBLaWxsZWRCeVNpZ25hbCBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLgorYm9vbCBLaWxsZWRCeVNpZ25hbDo6b3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0IHsKKyAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfc3RhdHVzKSAmJiBXVEVSTVNJRyhleGl0X3N0YXR1cykgPT0gc2lnbnVtXzsKK30KKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFV0aWxpdGllcyBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgorCisvLyBHZW5lcmF0ZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gZXhpdCBjb2RlLCBpbiB0aGUgZm9ybWF0CisvLyBzcGVjaWZpZWQgYnkgd2FpdCgyKS4KK3N0YXRpYyBTdHJpbmcgRXhpdFN1bW1hcnkoaW50IGV4aXRfY29kZSkgeworICBNZXNzYWdlIG07CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgZXhpdF9jb2RlOworCisjIGVsc2UKKworICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7CisgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKKyAgfQorIyAgaWZkZWYgV0NPUkVEVU1QCisgIGlmIChXQ09SRURVTVAoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsKKyAgfQorIyAgZW5kaWYKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cykgeworICByZXR1cm4gIUV4aXRlZFdpdGhDb2RlKDApKGV4aXRfc3RhdHVzKTsKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuCisvLyBvbmUgdGhyZWFkIHJ1bm5pbmcsIG9yIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBwcmlvcgorLy8gdG8gZXhlY3V0aW5nIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisvLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4KK3N0YXRpYyBTdHJpbmcgRGVhdGhUZXN0VGhyZWFkV2FybmluZyhzaXplX3QgdGhyZWFkX2NvdW50KSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIkRlYXRoIHRlc3RzIHVzZSBmb3JrKCksIHdoaWNoIGlzIHVuc2FmZSBwYXJ0aWN1bGFybHkiCisgICAgICA8PCAiIGluIGEgdGhyZWFkZWQgY29udGV4dC4gRm9yIHRoaXMgdGVzdCwgIiA8PCBHVEVTVF9OQU1FXyA8PCAiICI7CisgIGlmICh0aHJlYWRfY291bnQgPT0gMCkKKyAgICBtc2cgPDwgImNvdWxkbid0IGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIjsKKyAgZWxzZQorICAgIG1zZyA8PCAiZGV0ZWN0ZWQgIiA8PCB0aHJlYWRfY291bnQgPDwgIiB0aHJlYWRzLiI7CisgIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Cit9CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBGbGFnIGNoYXJhY3RlcnMgZm9yIHJlcG9ydGluZyBhIGRlYXRoIHRlc3QgdGhhdCBkaWQgbm90IGRpZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RMaXZlZCA9ICdMJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RSZXR1cm5lZCA9ICdSJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RUaHJldyA9ICdUJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yID0gJ0knOworCisvLyBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd2F5cyB0aGF0IGEgZGVhdGggdGVzdCBjYW4KKy8vIGNvbmNsdWRlLiAgRElFRCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGRpZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0CisvLyBjb2RlOyBMSVZFRCBtZWFucyB0aGF0IHByb2Nlc3MgbGl2ZWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHRlc3QgY29kZTsKKy8vIFJFVFVSTkVEIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50IGF0dGVtcHRlZCB0byBleGVjdXRlIGEgcmV0dXJuCisvLyBzdGF0ZW1lbnQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkOyBUSFJFVyBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudAorLy8gcmV0dXJuZWQgY29udHJvbCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uICBJTl9QUk9HUkVTUyBtZWFucyB0aGUgdGVzdAorLy8gaGFzIG5vdCB5ZXQgY29uY2x1ZGVkLgorLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogVW5pZnkgbmFtZXMgYW5kIHBvc3NpYmx5IHZhbHVlcyBmb3IKKy8vIEFib3J0UmVhc29uLCBEZWF0aFRlc3RPdXRjb21lLCBhbmQgZmxhZyBjaGFyYWN0ZXJzIGFib3ZlLgorZW51bSBEZWF0aFRlc3RPdXRjb21lIHsgSU5fUFJPR1JFU1MsIERJRUQsIExJVkVELCBSRVRVUk5FRCwgVEhSRVcgfTsKKworLy8gUm91dGluZSBmb3IgYWJvcnRpbmcgdGhlIHByb2dyYW0gd2hpY2ggaXMgc2FmZSB0byBjYWxsIGZyb20gYW4KKy8vIGV4ZWMtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcgorLy8gbWVzc2FnZSBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCB0aGUKKy8vIG1lc3NhZ2UgaXMgc2ltcGx5IHByaW50ZWQgdG8gc3RkZXJyLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwcm9ncmFtCisvLyB0aGVuIGV4aXRzIHdpdGggc3RhdHVzIDEuCit2b2lkIERlYXRoVGVzdEFib3J0KGNvbnN0IFN0cmluZyYgbWVzc2FnZSkgeworICAvLyBPbiBhIFBPU0lYIHN5c3RlbSwgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWRzYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcywgd2hpY2ggb3BlcmF0ZXMgb24gYSB2ZXJ5IHNtYWxsIHN0YWNrLiAgVXNlCisgIC8vIHRoZSBoZWFwIGZvciBhbnkgYWRkaXRpb25hbCBub24tbWludXNjdWxlIG1lbW9yeSByZXF1aXJlbWVudHMuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBHZXRVbml0VGVzdEltcGwoKS0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgRklMRSogcGFyZW50ID0gcG9zaXg6OkZET3BlbihmbGFnLT53cml0ZV9mZCgpLCAidyIpOworICAgIGZwdXRjKGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yLCBwYXJlbnQpOworICAgIGZwcmludGYocGFyZW50LCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChwYXJlbnQpOworICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisKKy8vIEEgcmVwbGFjZW1lbnQgZm9yIENIRUNLIHRoYXQgY2FsbHMgRGVhdGhUZXN0QWJvcnQgaWYgdGhlIGFzc2VydGlvbgorLy8gZmFpbHMuCisjIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGV4cHJlc3Npb24pKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzo6Rm9ybWF0KCBcCisgICAgICAgICAgIkNIRUNLIGZhaWxlZDogRmlsZSAlcywgbGluZSAlZDogJXMiLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjZXhwcmVzc2lvbikpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFRoaXMgbWFjcm8gaXMgc2ltaWxhciB0byBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXywgYnV0IGl0IGlzIG1lYW50IGZvcgorLy8gZXZhbHVhdGluZyBhbnkgc3lzdGVtIGNhbGwgdGhhdCBmdWxmaWxscyB0d28gY29uZGl0aW9uczogaXQgbXVzdCByZXR1cm4KKy8vIC0xIG9uIGZhaWx1cmUsIGFuZCBzZXQgZXJybm8gdG8gRUlOVFIgd2hlbiBpdCBpcyBpbnRlcnJ1cHRlZCBhbmQKKy8vIHNob3VsZCBiZSB0cmllZCBhZ2Fpbi4gIFRoZSBtYWNybyBleHBhbmRzIHRvIGEgbG9vcCB0aGF0IHJlcGVhdGVkbHkKKy8vIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGV2YWx1YXRlcyB0byAtMSBhbmQgc2V0cworLy8gZXJybm8gdG8gRUlOVFIuICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gLTEgYnV0IGVycm5vIGlzCisvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBFSU5UUiwgRGVhdGhUZXN0QWJvcnQgaXMgY2FsbGVkLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGludCBndGVzdF9yZXR2YWw7IFwKKyAgICBkbyB7IFwKKyAgICAgIGd0ZXN0X3JldHZhbCA9IChleHByZXNzaW9uKTsgXAorICAgIH0gd2hpbGUgKGd0ZXN0X3JldHZhbCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKKyAgICBpZiAoZ3Rlc3RfcmV0dmFsID09IC0xKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzo6Rm9ybWF0KCBcCisgICAgICAgICAgIkNIRUNLIGZhaWxlZDogRmlsZSAlcywgbGluZSAlZDogJXMgIT0gLTEiLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjZXhwcmVzc2lvbikpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaW4gZXJybm8uCitTdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIFN0cmluZyhlcnJubyA9PSAwID8gIiIgOiBwb3NpeDo6U3RyRXJyb3IoZXJybm8pKTsKK30KKworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIGRlYXRoIHRlc3QgcGFyZW50IHByb2Nlc3MgdG8gcmVhZCBhIGZhaWx1cmUKKy8vIG1lc3NhZ2UgZnJvbSB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGFuZCBsb2cgaXQgd2l0aCB0aGUgRkFUQUwKKy8vIHNldmVyaXR5LiBPbiBXaW5kb3dzLCB0aGUgbWVzc2FnZSBpcyByZWFkIGZyb20gYSBwaXBlIGhhbmRsZS4gT24gb3RoZXIKKy8vIHBsYXRmb3JtcywgaXQgaXMgcmVhZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLgorc3RhdGljIHZvaWQgRmFpbEZyb21JbnRlcm5hbEVycm9yKGludCBmZCkgeworICBNZXNzYWdlIGVycm9yOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBpbnQgbnVtX3JlYWQ7CisKKyAgZG8geworICAgIHdoaWxlICgobnVtX3JlYWQgPSBwb3NpeDo6UmVhZChmZCwgYnVmZmVyLCAyNTUpKSA+IDApIHsKKyAgICAgIGJ1ZmZlcltudW1fcmVhZF0gPSAnXDAnOworICAgICAgZXJyb3IgPDwgYnVmZmVyOworICAgIH0KKyAgfSB3aGlsZSAobnVtX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChudW1fcmVhZCA9PSAwKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgZXJyb3IuR2V0U3RyaW5nKCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGxhc3RfZXJyb3IgPSBlcnJubzsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWF0aCB0ZXN0IGludGVybmFsOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSA8PCAiIFsiIDw8IGxhc3RfZXJyb3IgPDwgIl0iOworICB9Cit9CisKKy8vIERlYXRoIHRlc3QgY29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBydW5uaW5nIGRlYXRoIHRlc3QgY291bnQKKy8vIGZvciB0aGUgY3VycmVudCB0ZXN0LgorRGVhdGhUZXN0OjpEZWF0aFRlc3QoKSB7CisgIFRlc3RJbmZvKiBjb25zdCBpbmZvID0gR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiQ2Fubm90IHJ1biBhIGRlYXRoIHRlc3Qgb3V0c2lkZSBvZiBhIFRFU1Qgb3IgIgorICAgICAgICAgICAgICAgICAgICJURVNUX0YgY29uc3RydWN0Iik7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGRlYXRoIHRlc3QgYnkgZGlzcGF0Y2hpbmcgdG8gdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgZmFjdG9yeS4KK2Jvb2wgRGVhdGhUZXN0OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSB7CisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+ZGVhdGhfdGVzdF9mYWN0b3J5KCktPkNyZWF0ZSgKKyAgICAgIHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUsIHRlc3QpOworfQorCitjb25zdCBjaGFyKiBEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkgeworICByZXR1cm4gbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfLmNfc3RyKCk7Cit9CisKK3ZvaWQgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3QgU3RyaW5nJiBtZXNzYWdlKSB7CisgIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Cit9CisKK1N0cmluZyBEZWF0aFRlc3Q6Omxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworLy8gUHJvdmlkZXMgY3Jvc3MgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgZGVhdGggZnVuY3Rpb25hbGl0eS4KK2NsYXNzIERlYXRoVGVzdEltcGwgOiBwdWJsaWMgRGVhdGhUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIERlYXRoVGVzdEltcGwoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgICAgOiBzdGF0ZW1lbnRfKGFfc3RhdGVtZW50KSwKKyAgICAgICAgcmVnZXhfKGFfcmVnZXgpLAorICAgICAgICBzcGF3bmVkXyhmYWxzZSksCisgICAgICAgIHN0YXR1c18oLTEpLAorICAgICAgICBvdXRjb21lXyhJTl9QUk9HUkVTUyksCisgICAgICAgIHJlYWRfZmRfKC0xKSwKKyAgICAgICAgd3JpdGVfZmRfKC0xKSB7fQorCisgIC8vIHJlYWRfZmRfIGlzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZCBhbmQgY2xlYXJlZCBieSBhIGRlcml2ZWQgY2xhc3MuCisgIH5EZWF0aFRlc3RJbXBsKCkgeyBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhyZWFkX2ZkXyA9PSAtMSk7IH0KKworICB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbik7CisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBzdGF0dXNfb2spOworCisgIGNvbnN0IGNoYXIqIHN0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlbWVudF87IH0KKyAgY29uc3QgUkUqIHJlZ2V4KCkgY29uc3QgeyByZXR1cm4gcmVnZXhfOyB9CisgIGJvb2wgc3Bhd25lZCgpIGNvbnN0IHsgcmV0dXJuIHNwYXduZWRfOyB9CisgIHZvaWQgc2V0X3NwYXduZWQoYm9vbCBpc19zcGF3bmVkKSB7IHNwYXduZWRfID0gaXNfc3Bhd25lZDsgfQorICBpbnQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQorICB2b2lkIHNldF9zdGF0dXMoaW50IGFfc3RhdHVzKSB7IHN0YXR1c18gPSBhX3N0YXR1czsgfQorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWUoKSBjb25zdCB7IHJldHVybiBvdXRjb21lXzsgfQorICB2b2lkIHNldF9vdXRjb21lKERlYXRoVGVzdE91dGNvbWUgYW5fb3V0Y29tZSkgeyBvdXRjb21lXyA9IGFuX291dGNvbWU7IH0KKyAgaW50IHJlYWRfZmQoKSBjb25zdCB7IHJldHVybiByZWFkX2ZkXzsgfQorICB2b2lkIHNldF9yZWFkX2ZkKGludCBmZCkgeyByZWFkX2ZkXyA9IGZkOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorICB2b2lkIHNldF93cml0ZV9mZChpbnQgZmQpIHsgd3JpdGVfZmRfID0gZmQ7IH0KKworICAvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKyAgLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworICAvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCisgIC8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KKyAgdm9pZCBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY29kZSB0aGlzIG9iamVjdCBpcyB0ZXN0aW5nLiAgVGhpcyBjbGFzcworICAvLyBkb2Vzbid0IG93biB0aGlzIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgY2hhciogY29uc3Qgc3RhdGVtZW50XzsKKyAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCB0ZXN0IG91dHB1dCBtdXN0IG1hdGNoLiAgRGVhdGhUZXN0SW1wbAorICAvLyBkb2Vzbid0IG93biB0aGlzIG9iamVjdCBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgUkUqIGNvbnN0IHJlZ2V4XzsKKyAgLy8gVHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLgorICBib29sIHNwYXduZWRfOworICAvLyBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCisgIGludCBzdGF0dXNfOworICAvLyBIb3cgdGhlIGRlYXRoIHRlc3QgY29uY2x1ZGVkLgorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWVfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSByZWFkIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIEl0IGlzCisgIC8vIGFsd2F5cyAtMSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBrZWVwcyBpdHMgd3JpdGUgZW5kIG9mIHRoZQorICAvLyBwaXBlIGluIHdyaXRlX2ZkXy4KKyAgaW50IHJlYWRfZmRfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSBjaGlsZCdzIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIEl0IGlzIGFsd2F5cyAtMSBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICBUaGUgcGFyZW50IGtlZXBzIGl0cyBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gcmVhZF9mZF8uCisgIGludCB3cml0ZV9mZF87Cit9OworCisvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKy8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KKy8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKy8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6UmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKSB7CisgIGNoYXIgZmxhZzsKKyAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgLy8gVGhlIHJlYWQoKSBoZXJlIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSAoc2lnbmlmeWluZyB0aGUKKyAgLy8gZmFpbHVyZSBvZiB0aGUgZGVhdGggdGVzdCkgb3IgdW50aWwgdGhlIHBpcGUgaXMgY2xvc2VkIChzaWduaWZ5aW5nCisgIC8vIGl0cyBzdWNjZXNzKSwgc28gaXQncyBva2F5IHRvIGNhbGwgdGhpcyBpbiB0aGUgcGFyZW50IGJlZm9yZQorICAvLyB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgZXhpdGVkLgorICBkbyB7CisgICAgYnl0ZXNfcmVhZCA9IHBvc2l4OjpSZWFkKHJlYWRfZmQoKSwgJmZsYWcsIDEpOworICB9IHdoaWxlIChieXRlc19yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgc2V0X291dGNvbWUoRElFRCk7CisgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAxKSB7CisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICBjYXNlIGtEZWF0aFRlc3RSZXR1cm5lZDoKKyAgICAgICAgc2V0X291dGNvbWUoUkVUVVJORUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdFRocmV3OgorICAgICAgICBzZXRfb3V0Y29tZShUSFJFVyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0TGl2ZWQ6CisgICAgICAgIHNldF9vdXRjb21lKExJVkVEKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yOgorICAgICAgICBGYWlsRnJvbUludGVybmFsRXJyb3IocmVhZF9mZCgpKTsgIC8vIERvZXMgbm90IHJldHVybi4KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHJlcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInVuZXhwZWN0ZWQgc3RhdHVzIGJ5dGUgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihmbGFnKSA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJSZWFkIGZyb20gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7CisgIH0KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6Q2xvc2UocmVhZF9mZCgpKSk7CisgIHNldF9yZWFkX2ZkKC0xKTsKK30KKworLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNvZGUgd2hpY2ggc2hvdWxkIGhhdmUgZXhpdGVkLCBkaWRuJ3QuCisvLyBTaG91bGQgYmUgY2FsbGVkIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisvLyBXcml0ZXMgYSBzdGF0dXMgYnl0ZSB0byB0aGUgY2hpbGQncyBzdGF0dXMgZmlsZSBkZXNjcmlwdG9yLCB0aGVuCisvLyBjYWxscyBfZXhpdCgxKS4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6QWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSB7CisgIC8vIFRoZSBwYXJlbnQgcHJvY2VzcyBjb25zaWRlcnMgdGhlIGRlYXRoIHRlc3QgdG8gYmUgYSBmYWlsdXJlIGlmCisgIC8vIGl0IGZpbmRzIGFueSBkYXRhIGluIG91ciBwaXBlLiAgU28sIGhlcmUgd2Ugd3JpdGUgYSBzaW5nbGUgZmxhZyBieXRlCisgIC8vIHRvIHRoZSBwaXBlLCB0aGVuIGV4aXQuCisgIGNvbnN0IGNoYXIgc3RhdHVzX2NoID0KKyAgICAgIHJlYXNvbiA9PSBURVNUX0RJRF9OT1RfRElFID8ga0RlYXRoVGVzdExpdmVkIDoKKyAgICAgIHJlYXNvbiA9PSBURVNUX1RIUkVXX0VYQ0VQVElPTiA/IGtEZWF0aFRlc3RUaHJldyA6IGtEZWF0aFRlc3RSZXR1cm5lZDsKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpXcml0ZSh3cml0ZV9mZCgpLCAmc3RhdHVzX2NoLCAxKSk7CisgIC8vIFdlIGFyZSBsZWFraW5nIHRoZSBkZXNjcmlwdG9yIGhlcmUgYmVjYXVzZSBvbiBzb21lIHBsYXRmb3JtcyAoaS5lLiwKKyAgLy8gd2hlbiBidWlsdCBhcyBXaW5kb3dzIERMTCksIGRlc3RydWN0b3JzIG9mIGdsb2JhbCBvYmplY3RzIHdpbGwgc3RpbGwKKyAgLy8gcnVuIGFmdGVyIGNhbGxpbmcgX2V4aXQoKS4gT24gc3VjaCBzeXN0ZW1zLCB3cml0ZV9mZF8gd2lsbCBiZQorICAvLyBpbmRpcmVjdGx5IGNsb3NlZCBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFVuaXRUZXN0SW1wbCwgY2F1c2luZyBkb3VibGUKKyAgLy8gY2xvc2UgaWYgaXQgaXMgYWxzbyBjbG9zZWQgaGVyZS4gT24gZGVidWcgY29uZmlndXJhdGlvbnMsIGRvdWJsZSBjbG9zZQorICAvLyBtYXkgYXNzZXJ0LiBBcyB0aGVyZSBhcmUgbm8gaW4tcHJvY2VzcyBidWZmZXJzIHRvIGZsdXNoIGhlcmUsIHdlIGFyZQorICAvLyByZWx5aW5nIG9uIHRoZSBPUyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciBhZnRlciB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzCisgIC8vIHdoZW4gdGhlIGRlc3RydWN0b3JzIGFyZSBub3QgcnVuLgorICBfZXhpdCgxKTsgIC8vIEV4aXRzIHcvbyBhbnkgbm9ybWFsIGV4aXQgaG9va3MgKHdlIHdlcmUgc3VwcG9zZWQgdG8gY3Jhc2gpCit9CisKKy8vIFJldHVybnMgYW4gaW5kZW50ZWQgY29weSBvZiBzdGRlcnIgb3V0cHV0IGZvciBhIGRlYXRoIHRlc3QuCisvLyBUaGlzIG1ha2VzIGRpc3Rpbmd1aXNoaW5nIGRlYXRoIHRlc3Qgb3V0cHV0IGxpbmVzIGZyb20gcmVndWxhciBsb2cgbGluZXMKKy8vIG11Y2ggZWFzaWVyLgorc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dCkgeworICA6OnN0ZDo6c3RyaW5nIHJldDsKKyAgZm9yIChzaXplX3QgYXQgPSAwOyA7ICkgeworICAgIGNvbnN0IHNpemVfdCBsaW5lX2VuZCA9IG91dHB1dC5maW5kKCdcbicsIGF0KTsKKyAgICByZXQgKz0gIlsgIERFQVRIICAgXSAiOworICAgIGlmIChsaW5lX2VuZCA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQsIGxpbmVfZW5kICsgMSAtIGF0KTsKKyAgICBhdCA9IGxpbmVfZW5kICsgMTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBBc3Nlc3NlcyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgZGVhdGggdGVzdCwgdXNpbmcgYm90aCBwcml2YXRlCisvLyBtZW1iZXJzIHdoaWNoIGhhdmUgcHJldmlvdXNseSBiZWVuIHNldCwgYW5kIG9uZSBhcmd1bWVudDoKKy8vCisvLyBQcml2YXRlIGRhdGEgbWVtYmVyczoKKy8vICAgb3V0Y29tZTogIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBjb25jbHVkZWQ6IERJRUQsIExJVkVELCBUSFJFVywgb3IgUkVUVVJORUQuICBUaGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgZmFpbHMgaW4gdGhlIGxhdHRlciB0aHJlZSBjYXNlcy4KKy8vICAgc3RhdHVzOiAgIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4gT24gKm5peCwgaXQgaXMgaW4gdGhlCisvLyAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB3YWl0KDIpLiBPbiBXaW5kb3dzLCB0aGlzIGlzIHRoZQorLy8gICAgICAgICAgICAgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIEV4aXRQcm9jZXNzKCkgQVBJIG9yIGEgbnVtZXJpYyBjb2RlCisvLyAgICAgICAgICAgICBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgdGVybWluYXRlZCB0aGUgcHJvZ3JhbS4KKy8vICAgcmVnZXg6ICAgIEEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB0byBiZSBhcHBsaWVkIHRvCisvLyAgICAgICAgICAgICB0aGUgdGVzdCdzIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yIG91dHB1dDsgdGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGZhaWxzIGlmIGl0IGRvZXMgbm90IG1hdGNoLgorLy8KKy8vIEFyZ3VtZW50OgorLy8gICBzdGF0dXNfb2s6IHRydWUgaWYgZXhpdF9zdGF0dXMgaXMgYWNjZXB0YWJsZSBpbiB0aGUgY29udGV4dCBvZgorLy8gICAgICAgICAgICAgIHRoaXMgcGFydGljdWxhciBkZWF0aCB0ZXN0LCB3aGljaCBmYWlscyBpZiBpdCBpcyBmYWxzZQorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBtZXQuICBPdGhlcndpc2UsIHRoZQorLy8gZmlyc3QgZmFpbGluZyBjb25kaXRpb24sIGluIHRoZSBvcmRlciBnaXZlbiBhYm92ZSwgaXMgdGhlIG9uZSB0aGF0IGlzCisvLyByZXBvcnRlZC4gQWxzbyBzZXRzIHRoZSBsYXN0IGRlYXRoIHRlc3QgbWVzc2FnZSBzdHJpbmcuCitib29sIERlYXRoVGVzdEltcGw6OlBhc3NlZChib29sIHN0YXR1c19vaykgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgU3RyaW5nIGVycm9yX21lc3NhZ2UgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworCisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICBNZXNzYWdlIGJ1ZmZlcjsKKworICBidWZmZXIgPDwgIkRlYXRoIHRlc3Q6ICIgPDwgc3RhdGVtZW50KCkgPDwgIlxuIjsKKyAgc3dpdGNoIChvdXRjb21lKCkpIHsKKyAgICBjYXNlIExJVkVEOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBmYWlsZWQgdG8gZGllLlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVXOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiB0aHJldyBhbiBleGNlcHRpb24uXG4iCisgICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVUVVJORUQ6CisgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJRUQ6CisgICAgICBpZiAoc3RhdHVzX29rKSB7CisgICAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlZCA9IFJFOjpQYXJ0aWFsTWF0Y2goZXJyb3JfbWVzc2FnZS5jX3N0cigpLCAqcmVnZXgoKSk7CisgICAgICAgIGlmIChtYXRjaGVkKSB7CisgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBlcnJvci5cbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgRXhwZWN0ZWQ6ICIgPDwgcmVnZXgoKS0+cGF0dGVybigpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBleGl0IGNvZGU6XG4iCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBFeGl0U3VtbWFyeShzdGF0dXMoKSkgPDwgIlxuIgorICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU5fUFJPR1JFU1M6CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0xPR18oRkFUQUwpCisgICAgICAgICAgPDwgIkRlYXRoVGVzdDo6UGFzc2VkIHNvbWVob3cgY2FsbGVkIGJlZm9yZSBjb25jbHVzaW9uIG9mIHRlc3QiOworICB9CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoYnVmZmVyLkdldFN0cmluZygpKTsKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gV2luZG93c0RlYXRoVGVzdCBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzIG9uIFdpbmRvd3MuIER1ZSB0byB0aGUKKy8vIHNwZWNpZmljcyBvZiBzdGFydGluZyBuZXcgcHJvY2Vzc2VzIG9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIHRoZXJlIGFyZQorLy8gYWx3YXlzIHRocmVhZHNhZmUsIGFuZCBHb29nbGUgVGVzdCBjb25zaWRlcnMgdGhlCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9ZmFzdCBzZXR0aW5nIHRvIGJlIGVxdWl2YWxlbnQgdG8KKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT10aHJlYWRzYWZlIHRoZXJlLgorLy8KKy8vIEEgZmV3IGltcGxlbWVudGF0aW9uIG5vdGVzOiAgTGlrZSB0aGUgTGludXggdmVyc2lvbiwgdGhlIFdpbmRvd3MKKy8vIGltcGxlbWVudGF0aW9uIHVzZXMgcGlwZXMgZm9yIGNoaWxkLXRvLXBhcmVudCBjb21tdW5pY2F0aW9uLiBCdXQgZHVlIHRvCisvLyB0aGUgc3BlY2lmaWNzIG9mIHBpcGVzIG9uIFdpbmRvd3MsIHNvbWUgZXh0cmEgc3RlcHMgYXJlIHJlcXVpcmVkOgorLy8KKy8vIDEuIFRoZSBwYXJlbnQgY3JlYXRlcyBhIGNvbW11bmljYXRpb24gcGlwZSBhbmQgc3RvcmVzIGhhbmRsZXMgdG8gYm90aAorLy8gICAgZW5kcyBvZiBpdC4KKy8vIDIuIFRoZSBwYXJlbnQgc3RhcnRzIHRoZSBjaGlsZCBhbmQgcHJvdmlkZXMgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24KKy8vICAgIG5lY2Vzc2FyeSB0byBhY3F1aXJlIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4KKy8vIDMuIFRoZSBjaGlsZCBhY3F1aXJlcyB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIGFuZCBzaWduYWxzIHRoZSBwYXJlbnQKKy8vICAgIHVzaW5nIGEgV2luZG93cyBldmVudC4KKy8vIDQuIE5vdyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb24gaXRzIHNpZGUuIElmCisvLyAgICB0aGlzIGlzIGRvbmUgYmVmb3JlIHN0ZXAgMywgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBnb2VzIGRvd24gdG8KKy8vICAgIDAgYW5kIGl0IGlzIGRlc3Ryb3llZCwgcHJldmVudGluZyB0aGUgY2hpbGQgZnJvbSBhY3F1aXJpbmcgaXQuIFRoZQorLy8gICAgcGFyZW50IG5vdyBoYXMgdG8gcmVsZWFzZSBpdCwgb3IgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSByZWFkIGVuZCBvZgorLy8gICAgdGhlIHBpcGUgd2lsbCBub3QgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCisvLyA1LiBUaGUgcGFyZW50IHJlYWRzIGNoaWxkJ3Mgb3V0cHV0IHRocm91Z2ggdGhlIHBpcGUgKG91dGNvbWUgY29kZSBhbmQKKy8vICAgIGFueSBwb3NzaWJsZSBlcnJvciBtZXNzYWdlcykgZnJvbSB0aGUgcGlwZSwgYW5kIGl0cyBzdGRlcnIgYW5kIHRoZW4KKy8vICAgIGRldGVybWluZXMgd2hldGhlciB0byBmYWlsIHRoZSB0ZXN0LgorLy8KKy8vIE5vdGU6IHRvIGRpc3Rpbmd1aXNoIFdpbjMyIEFQSSBjYWxscyBmcm9tIHRoZSBsb2NhbCBtZXRob2QgYW5kIGZ1bmN0aW9uCisvLyBjYWxscywgdGhlIGZvcm1lciBhcmUgZXhwbGljaXRseSByZXNvbHZlZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKy8vCitjbGFzcyBXaW5kb3dzRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgV2luZG93c0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQorICAgICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHt9CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGludCBsaW5lXzsKKyAgLy8gSGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MuCisgIEF1dG9IYW5kbGUgd3JpdGVfaGFuZGxlXzsKKyAgLy8gQ2hpbGQgcHJvY2VzcyBoYW5kbGUuCisgIEF1dG9IYW5kbGUgY2hpbGRfaGFuZGxlXzsKKyAgLy8gRXZlbnQgdGhlIGNoaWxkIHByb2Nlc3MgdXNlcyB0byBzaWduYWwgdGhlIHBhcmVudCB0aGF0IGl0IGhhcworICAvLyBhY3F1aXJlZCB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuIEFmdGVyIHNlZWluZyB0aGlzCisgIC8vIGV2ZW50IHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgaXRzIG93biBoYW5kbGVzIHRvIG1ha2Ugc3VyZSBpdHMKKyAgLy8gUmVhZEZpbGUoKSBjYWxscyByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4KKyAgQXV0b0hhbmRsZSBldmVudF9oYW5kbGVfOworfTsKKworLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0CisvLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQorLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KK2ludCBXaW5kb3dzRGVhdGhUZXN0OjpXYWl0KCkgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBXYWl0IHVudGlsIHRoZSBjaGlsZCBlaXRoZXIgc2lnbmFscyB0aGF0IGl0IGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kCisgIC8vIG9mIHRoZSBwaXBlIG9yIGl0IGRpZXMuCisgIGNvbnN0IEhBTkRMRSB3YWl0X2hhbmRsZXNbMl0gPSB7IGNoaWxkX2hhbmRsZV8uR2V0KCksIGV2ZW50X2hhbmRsZV8uR2V0KCkgfTsKKyAgc3dpdGNoICg6OldhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9oYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIFdhaXRzIGZvciBhbnkgb2YgdGhlIGhhbmRsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSkgeworICAgIGNhc2UgV0FJVF9PQkpFQ1RfMDoKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzAgKyAxOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZhbHNlKTsgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmUuCisgIH0KKworICAvLyBUaGUgY2hpbGQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb3IgZXhpdGVkLgorICAvLyBXZSByZWxlYXNlIHRoZSBoYW5kbGUgb24gb3VyIHNpZGUgYW5kIGNvbnRpbnVlLgorICB3cml0ZV9oYW5kbGVfLlJlc2V0KCk7CisgIGV2ZW50X2hhbmRsZV8uUmVzZXQoKTsKKworICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgIC8vIFdhaXRzIGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0IGlmIGl0IGhhdmVuJ3QgYWxyZWFkeS4gVGhpcworICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjaGlsZCBoYXMgYWxyZWFkeSBleGl0ZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgLy8gd2hldGhlciBwcmV2aW91cyBjYWxscyB0byBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHN5bmNocm9uaXplZCBvbiB0aGlzCisgIC8vIGhhbmRsZSBvciBub3QuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgV0FJVF9PQkpFQ1RfMCA9PSA6OldhaXRGb3JTaW5nbGVPYmplY3QoY2hpbGRfaGFuZGxlXy5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSk7CisgIERXT1JEIHN0YXR1c19jb2RlOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIDo6R2V0RXhpdENvZGVQcm9jZXNzKGNoaWxkX2hhbmRsZV8uR2V0KCksICZzdGF0dXNfY29kZSkgIT0gRkFMU0UpOworICBjaGlsZF9oYW5kbGVfLlJlc2V0KCk7CisgIHNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXNfY29kZSkpOworICByZXR1cm4gc3RhdHVzKCk7Cit9CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgV2luZG93cyBkZWF0aCB0ZXN0LiAgSXQgY3JlYXRlcyBhIGNoaWxkCisvLyBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHJ1biB0aGUKKy8vIGRlYXRoIHRlc3QuICBUaGUgY2hpbGQgcHJvY2VzcyBpcyBnaXZlbiB0aGUgLS1ndGVzdF9maWx0ZXIgYW5kCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHN1Y2ggdGhhdCBpdCBrbm93cyB0byBydW4gdGhlCisvLyBjdXJyZW50IGRlYXRoIHRlc3Qgb25seS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgV2luZG93c0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKKyAgY29uc3QgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICAvLyBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIGhhcyBwZXJmb3JtZWQgYWxsIHRoZSBuZWNlc3NhcnkKKyAgICAvLyBwcm9jZXNzaW5nLgorICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgLy8gV2luZG93c0RlYXRoVGVzdCB1c2VzIGFuIGFub255bW91cyBwaXBlIHRvIGNvbW11bmljYXRlIHJlc3VsdHMgb2YKKyAgLy8gYSBkZWF0aCB0ZXN0LgorICBTRUNVUklUWV9BVFRSSUJVVEVTIGhhbmRsZXNfYXJlX2luaGVyaXRhYmxlID0geworICAgIHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwgTlVMTCwgVFJVRSB9OworICBIQU5ETEUgcmVhZF9oYW5kbGUsIHdyaXRlX2hhbmRsZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkNyZWF0ZVBpcGUoJnJlYWRfaGFuZGxlLCAmd3JpdGVfaGFuZGxlLCAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgMCkgIC8vIERlZmF1bHQgYnVmZmVyIHNpemUuCisgICAgICAhPSBGQUxTRSk7CisgIHNldF9yZWFkX2ZkKDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHJlYWRfaGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFkpKTsKKyAgd3JpdGVfaGFuZGxlXy5SZXNldCh3cml0ZV9oYW5kbGUpOworICBldmVudF9oYW5kbGVfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoCisgICAgICAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICBUUlVFLCAgICAvLyBUaGUgZXZlbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIG5vbi1zaWduYWxlZCBzdGF0ZS4KKyAgICAgIEZBTFNFLCAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIGlzIG5vbi1zaWduYWxsZWQuCisgICAgICBOVUxMKSk7ICAvLyBUaGUgZXZlbiBpcyB1bm5hbWVkLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhldmVudF9oYW5kbGVfLkdldCgpICE9IE5VTEwpOworICBjb25zdCBTdHJpbmcgZmlsdGVyX2ZsYWcgPSBTdHJpbmc6OkZvcm1hdCgiLS0lcyVzPSVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrRmlsdGVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bmFtZSgpKTsKKyAgY29uc3QgU3RyaW5nIGludGVybmFsX2ZsYWcgPSBTdHJpbmc6OkZvcm1hdCgKKyAgICAiLS0lcyVzPSVzfCVkfCVkfCV1fCVJdXwlSXUiLAorICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLAorICAgICAga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgIGZpbGVfLCBsaW5lXywKKyAgICAgIGRlYXRoX3Rlc3RfaW5kZXgsCisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDo6R2V0Q3VycmVudFByb2Nlc3NJZCgpKSwKKyAgICAgIC8vIHNpemVfdCBoYXMgdGhlIHNhbWUgd2l0aCBhcyBwb2ludGVycyBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0CisgICAgICAvLyBXaW5kb3dzIHBsYXRmb3Jtcy4KKyAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvdGN4ZjFkdzYuYXNweC4KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih3cml0ZV9oYW5kbGUpLAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGV2ZW50X2hhbmRsZV8uR2V0KCkpKTsKKworICBjaGFyIGV4ZWN1dGFibGVfcGF0aFtfTUFYX1BBVEggKyAxXTsgIC8vIE5PTElOVAorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIF9NQVhfUEFUSCArIDEgIT0gOjpHZXRNb2R1bGVGaWxlTmFtZUEoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTUFYX1BBVEgpKTsKKworICBTdHJpbmcgY29tbWFuZF9saW5lID0gU3RyaW5nOjpGb3JtYXQoIiVzICVzIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldENvbW1hbmRMaW5lQSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2ZsYWcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gRmx1c2ggdGhlIGxvZyBidWZmZXJzIHNpbmNlIHRoZSBsb2cgc3RyZWFtcyBhcmUgc2hhcmVkIHdpdGggdGhlIGNoaWxkLgorICBGbHVzaEluZm9Mb2coKTsKKworICAvLyBUaGUgY2hpbGQgcHJvY2VzcyB3aWxsIHNoYXJlIHRoZSBzdGFuZGFyZCBoYW5kbGVzIHdpdGggdGhlIHBhcmVudC4KKyAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKKyAgbWVtc2V0KCZzdGFydHVwX2luZm8sIDAsIHNpemVvZihTVEFSVFVQSU5GTykpOworICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOworICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gOjpHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKDo6Q3JlYXRlUHJvY2Vzc0EoCisgICAgICBleGVjdXRhYmxlX3BhdGgsCisgICAgICBjb25zdF9jYXN0PGNoYXIqPihjb21tYW5kX2xpbmUuY19zdHIoKSksCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgcHJvY2VzcyBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgVFJVRSwgICAvLyBDaGlsZCBpbmhlcml0cyBhbGwgaW5oZXJpdGFibGUgaGFuZGxlcyAoZm9yIHdyaXRlX2hhbmRsZV8pLgorICAgICAgMHgwLCAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgorICAgICAgTlVMTCwgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBlbnZpcm9ubWVudC4KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLAorICAgICAgJnN0YXJ0dXBfaW5mbywKKyAgICAgICZwcm9jZXNzX2luZm8pICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldChwcm9jZXNzX2luZm8uaFByb2Nlc3MpOworICA6OkNsb3NlSGFuZGxlKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKKyAgc2V0X3NwYXduZWQodHJ1ZSk7CisgIHJldHVybiBPVkVSU0VFX1RFU1Q7Cit9CisjIGVsc2UgIC8vIFdlIGFyZSBub3Qgb24gV2luZG93cy4KKworLy8gRm9ya2luZ0RlYXRoVGVzdCBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vc3Qgb2YgdGhlIGFic3RyYWN0CisvLyBtZXRob2RzIG9mIHRoZSBEZWF0aFRlc3QgaW50ZXJmYWNlLiAgT25seSB0aGUgQXNzdW1lUm9sZSBtZXRob2QgaXMKKy8vIGxlZnQgdW5kZWZpbmVkLgorY2xhc3MgRm9ya2luZ0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIEZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgpOworCisgIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgorICB2aXJ0dWFsIGludCBXYWl0KCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0X2NoaWxkX3BpZChwaWRfdCBjaGlsZF9waWQpIHsgY2hpbGRfcGlkXyA9IGNoaWxkX3BpZDsgfQorCisgcHJpdmF0ZToKKyAgLy8gUElEIG9mIGNoaWxkIHByb2Nlc3MgZHVyaW5nIGRlYXRoIHRlc3Q7IDAgaW4gdGhlIGNoaWxkIHByb2Nlc3MgaXRzZWxmLgorICBwaWRfdCBjaGlsZF9waWRfOworfTsKKworLy8gQ29uc3RydWN0cyBhIEZvcmtpbmdEZWF0aFRlc3QuCitGb3JraW5nRGVhdGhUZXN0OjpGb3JraW5nRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkKKyAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLAorICAgICAgY2hpbGRfcGlkXygtMSkge30KKworLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0CisvLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQorLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KK2ludCBGb3JraW5nRGVhdGhUZXN0OjpXYWl0KCkgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gMDsKKworICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgIGludCBzdGF0dXNfdmFsdWU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8od2FpdHBpZChjaGlsZF9waWRfLCAmc3RhdHVzX3ZhbHVlLCAwKSk7CisgIHNldF9zdGF0dXMoc3RhdHVzX3ZhbHVlKTsKKyAgcmV0dXJuIHN0YXR1c192YWx1ZTsKK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MsIHRoZW4gaW1tZWRpYXRlbHkgcnVucyB0aGUgdGVzdAorLy8gaW4gdGhlIGNoaWxkIHByb2Nlc3MuCitjbGFzcyBOb0V4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBOb0V4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KSA6CisgICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7Cit9OworCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLXJ1biBkZWF0aCB0ZXN0LiAgSXQgaW1wbGVtZW50cyBhCisvLyBzdHJhaWdodGZvcndhcmQgZm9yaywgd2l0aCBhIHNpbXBsZSBwaXBlIHRvIHRyYW5zbWl0IHRoZSBzdGF0dXMgYnl0ZS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgTm9FeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBzaXplX3QgdGhyZWFkX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoKTsKKyAgaWYgKHRocmVhZF9jb3VudCAhPSAxKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHRocmVhZF9jb3VudCk7CisgIH0KKworICBpbnQgcGlwZV9mZFsyXTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIC8vIFdoZW4gd2UgZm9yayB0aGUgcHJvY2VzcyBiZWxvdywgdGhlIGxvZyBmaWxlIGJ1ZmZlcnMgYXJlIGNvcGllZCwgYnV0IHRoZQorICAvLyBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzaGFyZWQuICBXZSBmbHVzaCBhbGwgbG9nIGZpbGVzIGhlcmUgc28gdGhhdCBjbG9zaW5nCisgIC8vIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGluIHRoZSBjaGlsZCBwcm9jZXNzIGRvZXNuJ3QgdGhyb3cgb2ZmIHRoZQorICAvLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkZXNjcmlwdG9ycyBhbmQgYnVmZmVycyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIFRoaXMgaXMgYXMgY2xvc2UgdG8gdGhlIGZvcmsgYXMgcG9zc2libGUgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBjYXNlCisgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgYmVmb3JlIHRoZSBkZWF0aCB0ZXN0LCBhbmQgYW5vdGhlcgorICAvLyB0aHJlYWQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZS4KKyAgRmx1c2hJbmZvTG9nKCk7CisKKyAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIGlmIChjaGlsZF9waWQgPT0gMCkgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFswXSkpOworICAgIHNldF93cml0ZV9mZChwaXBlX2ZkWzFdKTsKKyAgICAvLyBSZWRpcmVjdHMgYWxsIGxvZ2dpbmcgdG8gc3RkZXJyIGluIHRoZSBjaGlsZCBwcm9jZXNzIHRvIHByZXZlbnQKKyAgICAvLyBjb25jdXJyZW50IHdyaXRlcyB0byB0aGUgbG9nIGZpbGVzLiAgV2UgY2FwdHVyZSBzdGRlcnIgaW4gdGhlIHBhcmVudAorICAgIC8vIHByb2Nlc3MgYW5kIGFwcGVuZCB0aGUgY2hpbGQgcHJvY2Vzcycgb3V0cHV0IHRvIGEgbG9nLgorICAgIExvZ1RvU3RkZXJyKCk7CisgICAgLy8gRXZlbnQgZm9yd2FyZGluZyB0byB0aGUgbGlzdGVuZXJzIG9mIGV2ZW50IGxpc3RlbmVyIEFQSSBtdXNoIGJlIHNodXQKKyAgICAvLyBkb3duIGluIGRlYXRoIHRlc3Qgc3VicHJvY2Vzc2VzLgorICAgIEdldFVuaXRUZXN0SW1wbCgpLT5saXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9IGVsc2UgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICAgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICAgIHNldF9zcGF3bmVkKHRydWUpOworICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7CisgIH0KK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MgYW5kIHJlLWV4ZWN1dGVzIHRoZSBtYWluCisvLyBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3Mgc2V0IHRoYXQgY2F1c2UKKy8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4KK2NsYXNzIEV4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgOgorICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisgcHJpdmF0ZToKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87Cit9OworCisvLyBVdGlsaXR5IGNsYXNzIGZvciBhY2N1bXVsYXRpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ3VtZW50cyB7CisgcHVibGljOgorICBBcmd1bWVudHMoKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKE5VTEwpOworICB9CisKKyAgfkFyZ3VtZW50cygpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGZyZWUoKmkpOworICAgIH0KKyAgfQorICB2b2lkIEFkZEFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZ3VtZW50KSB7CisgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KKyAgdm9pZCBBZGRBcmd1bWVudHMoY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHI+JiBhcmd1bWVudHMpIHsKKyAgICBmb3IgKHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8U3RyPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3VtZW50cy5iZWdpbigpOworICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoaS0+Y19zdHIoKSkpOworICAgIH0KKyAgfQorICBjaGFyKiBjb25zdCogQXJndigpIHsKKyAgICByZXR1cm4gJmFyZ3NfWzBdOworICB9CisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8Y2hhcio+IGFyZ3NfOworfTsKKworLy8gQSBzdHJ1Y3QgdGhhdCBlbmNvbXBhc3NlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjaGlsZCBwcm9jZXNzIG9mIGEKKy8vIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBwcm9jZXNzLgorc3RydWN0IEV4ZWNEZWF0aFRlc3RBcmdzIHsKKyAgY2hhciogY29uc3QqIGFyZ3Y7ICAvLyBDb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgY2hpbGQncyBjYWxsIHRvIGV4ZWMKKyAgaW50IGNsb3NlX2ZkOyAgICAgICAvLyBGaWxlIGRlc2NyaXB0b3IgdG8gY2xvc2U7IHRoZSByZWFkIGVuZCBvZiBhIHBpcGUKK307CisKKyMgIGlmIEdURVNUX09TX01BQworaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeworICAvLyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgZnJhbWV3b3JrIG9uIE1hY09TIFgsIHRoZSBlbnZpcm9uIHZhcmlhYmxlCisgIC8vIGlzIHVuYXZhaWxhYmxlLiBBcHBsZSdzIGRvY3VtZW50YXRpb24gKG1hbiBlbnZpcm9uKSByZWNvbW1lbmRzIHVzaW5nCisgIC8vIF9OU0dldEVudmlyb24oKSBpbnN0ZWFkLgorICByZXR1cm4gKl9OU0dldEVudmlyb24oKTsKK30KKyMgIGVsc2UKKy8vIFNvbWUgUE9TSVggcGxhdGZvcm1zIGV4cGVjdCB5b3UgdG8gZGVjbGFyZSBlbnZpcm9uLiBleHRlcm4gIkMiIG1ha2VzCisvLyBpdCByZXNpZGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitleHRlcm4gIkMiIGNoYXIqKiBlbnZpcm9uOworaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeyByZXR1cm4gZW52aXJvbjsgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX01BQworCisvLyBUaGUgbWFpbiBmdW5jdGlvbiBmb3IgYSB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGEgY2xvbmUoKS1lZCBwcm9jZXNzIGFuZCB0aHVzIG11c3QgYXZvaWQKKy8vIGFueSBwb3RlbnRpYWxseSB1bnNhZmUgb3BlcmF0aW9ucyBsaWtlIG1hbGxvYyBvciBsaWJjIGZ1bmN0aW9ucy4KK3N0YXRpYyBpbnQgRXhlY0RlYXRoVGVzdENoaWxkTWFpbih2b2lkKiBjaGlsZF9hcmcpIHsKKyAgRXhlY0RlYXRoVGVzdEFyZ3MqIGNvbnN0IGFyZ3MgPSBzdGF0aWNfY2FzdDxFeGVjRGVhdGhUZXN0QXJncyo+KGNoaWxkX2FyZyk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UoYXJncy0+Y2xvc2VfZmQpKTsKKworICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIHRlc3QgcHJvZ3JhbSBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCB3aGVyZQorICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwKKyAgLy8gd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuCisgIGNvbnN0IGNoYXIqIGNvbnN0IG9yaWdpbmFsX2RpciA9CisgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGNoZGlyKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4KKyAgaWYgKGNoZGlyKG9yaWdpbmFsX2RpcikgIT0gMCkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KCJjaGRpcihcIiVzXCIpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpLmNfc3RyKCkpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGV4ZWN2ZSgpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuICBXZQorICAvLyBjYW5ub3QgdXNlIGV4ZWN2cCgpIGFzIGl0J3MgYSBsaWJjIGZ1bmN0aW9uIGFuZCB0aHVzIHBvdGVudGlhbGx5CisgIC8vIHVuc2FmZS4gIFNpbmNlIGV4ZWN2ZSgpIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRILCB0aGUgdXNlciBtdXN0CisgIC8vIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHZhbGlkIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdAorICAvLyBvbmUgcGF0aCBzZXBhcmF0b3IuCisgIGV4ZWN2ZShhcmdzLT5hcmd2WzBdLCBhcmdzLT5hcmd2LCBHZXRFbnZpcm9uKCkpOworICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgiZXhlY3ZlKCVzLCAuLi4pIGluICVzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkuY19zdHIoKSkpOworICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCisvLyBUd28gdXRpbGl0eSByb3V0aW5lcyB0aGF0IHRvZ2V0aGVyIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjaworLy8gZ3Jvd3MuCisvLyBUaGlzIGNvdWxkIGJlIGFjY29tcGxpc2hlZCBtb3JlIGVsZWdhbnRseSBieSBhIHNpbmdsZSByZWN1cnNpdmUKKy8vIGZ1bmN0aW9uLCBidXQgd2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IHRoZSB1bmxpa2VseSBwb3NzaWJpbGl0eSBvZgorLy8gYSBzbWFydCBjb21waWxlciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gYXdheS4KKy8vCisvLyBHVEVTVF9OT19JTkxJTkVfIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgR0NDIDQuNiBmcm9tIGlubGluaW5nCisvLyBTdGFja0xvd2VyVGhhbkFkZHJlc3MgaW50byBTdGFja0dyb3dzRG93biwgd2hpY2ggdGhlbiBkb2Vzbid0IGdpdmUKKy8vIGNvcnJlY3QgYW5zd2VyLgorYm9vbCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyKSBHVEVTVF9OT19JTkxJTkVfOworYm9vbCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyKSB7CisgIGludCBkdW1teTsKKyAgcmV0dXJuICZkdW1teSA8IHB0cjsKK30KKworYm9vbCBTdGFja0dyb3dzRG93bigpIHsKKyAgaW50IGR1bW15OworICByZXR1cm4gU3RhY2tMb3dlclRoYW5BZGRyZXNzKCZkdW1teSk7Cit9CisKKy8vIEEgdGhyZWFkc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiBmb3JrKDIpIGZvciB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3RzCisvLyB0aGF0IHVzZXMgY2xvbmUoMikuICBJdCBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbnl0aGluZyBnb2VzCisvLyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0Rm9yayhjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjICBpZiBHVEVTVF9IQVNfQ0xPTkUKKyAgY29uc3QgYm9vbCB1c2VfZm9yayA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisKKyAgaWYgKCF1c2VfZm9yaykgeworICAgIHN0YXRpYyBjb25zdCBib29sIHN0YWNrX2dyb3dzX2Rvd24gPSBTdGFja0dyb3dzRG93bigpOworICAgIGNvbnN0IHNpemVfdCBzdGFja19zaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICAvLyBNTUFQX0FOT05ZTU9VUyBpcyBub3QgZGVmaW5lZCBvbiBNYWMsIHNvIHdlIHVzZSBNQVBfQU5PTiBpbnN0ZWFkLgorICAgIHZvaWQqIGNvbnN0IHN0YWNrID0gbW1hcChOVUxMLCBzdGFja19zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfQU5PTiB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oc3RhY2sgIT0gTUFQX0ZBSUxFRCk7CisgICAgdm9pZCogY29uc3Qgc3RhY2tfdG9wID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KHN0YWNrKSArIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSA6IDApOworCisgICAgY2hpbGRfcGlkID0gY2xvbmUoJkV4ZWNEZWF0aFRlc3RDaGlsZE1haW4sIHN0YWNrX3RvcCwgU0lHQ0hMRCwgJmFyZ3MpOworCisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18obXVubWFwKHN0YWNrLCBzdGFja19zaXplKSAhPSAtMSk7CisgIH0KKyMgIGVsc2UKKyAgY29uc3QgYm9vbCB1c2VfZm9yayA9IHRydWU7CisjICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3QgU3RyaW5nIGZpbHRlcl9mbGFnID0KKyAgICAgIFN0cmluZzo6Rm9ybWF0KCItLSVzJXM9JXMuJXMiLAorICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrRmlsdGVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRlc3RfY2FzZV9uYW1lKCksIGluZm8tPm5hbWUoKSk7CisgIGNvbnN0IFN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIFN0cmluZzo6Rm9ybWF0KCItLSVzJXM9JXN8JWR8JWR8JWQiLAorICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAorICAgICAgICAgICAgICAgICAgICAgZmlsZV8sIGxpbmVfLCBkZWF0aF90ZXN0X2luZGV4LCBwaXBlX2ZkWzFdKTsKKyAgQXJndW1lbnRzIGFyZ3M7CisgIGFyZ3MuQWRkQXJndW1lbnRzKEdldEFyZ3ZzKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUKKyAgLy8gaXMgbmVjZXNzYXJ5LgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBFeGVjRGVhdGhUZXN0Rm9yayhhcmdzLkFyZ3YoKSwgcGlwZV9mZFswXSk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKworIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKKworLy8gQ3JlYXRlcyBhIGNvbmNyZXRlIERlYXRoVGVzdC1kZXJpdmVkIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUKKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnLCBhbmQgc2V0cyB0aGUgcG9pbnRlciBwb2ludGVkIHRvCisvLyBieSB0aGUgInRlc3QiIGFyZ3VtZW50IHRvIGl0cyBhZGRyZXNzLiAgSWYgdGhlIHRlc3Qgc2hvdWxkIGJlCisvLyBza2lwcGVkLCBzZXRzIHRoYXQgcG9pbnRlciB0byBOVUxMLiAgUmV0dXJucyB0cnVlLCB1bmxlc3MgdGhlCisvLyBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgorYm9vbCBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKQorICAgICAgLT5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICBpZiAoZGVhdGhfdGVzdF9pbmRleCA+IGZsYWctPmluZGV4KCkpIHsKKyAgICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAgICJEZWF0aCB0ZXN0IGNvdW50ICglZCkgc29tZWhvdyBleGNlZWRlZCBleHBlY3RlZCBtYXhpbXVtICglZCkiLAorICAgICAgICAgIGRlYXRoX3Rlc3RfaW5kZXgsIGZsYWctPmluZGV4KCkpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIShmbGFnLT5maWxlKCkgPT0gZmlsZSAmJiBmbGFnLT5saW5lKCkgPT0gbGluZSAmJgorICAgICAgICAgIGZsYWctPmluZGV4KCkgPT0gZGVhdGhfdGVzdF9pbmRleCkpIHsKKyAgICAgICp0ZXN0ID0gTlVMTDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIgfHwKKyAgICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgV2luZG93c0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfQorCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpIHsKKyAgICAqdGVzdCA9IG5ldyBFeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOworICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgTm9FeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgpOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICBlbHNlIHsgIC8vIE5PTElOVCAtIHRoaXMgaXMgbW9yZSByZWFkYWJsZSB0aGFuIHVuYmFsYW5jZWQgYnJhY2tldHMgaW5zaWRlICNpZi4KKyAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVua25vd24gZGVhdGggdGVzdCBzdHlsZSBcIiVzXCIgZW5jb3VudGVyZWQiLAorICAgICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpLmNfc3RyKCkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU3BsaXRzIGEgZ2l2ZW4gc3RyaW5nIG9uIGEgZ2l2ZW4gZGVsaW1pdGVyLCBwb3B1bGF0aW5nIGEgZ2l2ZW4KKy8vIHZlY3RvciB3aXRoIHRoZSBmaWVsZHMuICBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZQorLy8gOjpzdGQ6OnN0cmluZywgc28gd2UgY2FuIHVzZSBpdCBoZXJlLgorc3RhdGljIHZvaWQgU3BsaXRTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjaGFyIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+KiBkZXN0KSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHBhcnNlZDsKKyAgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7CisgIHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBzdHIuZmluZChkZWxpbWl0ZXIsIHBvcyk7CisgICAgaWYgKGNvbG9uID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MpKTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zLCBjb2xvbiAtIHBvcykpOworICAgICAgcG9zID0gY29sb24gKyAxOworICAgIH0KKyAgfQorICBkZXN0LT5zd2FwKHBhcnNlZCk7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gUmVjcmVhdGVzIHRoZSBwaXBlIGFuZCBldmVudCBoYW5kbGVzIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMsCisvLyBzaWduYWxzIHRoZSBldmVudCwgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igd3JhcHBlZCBhcm91bmQgdGhlIHBpcGUKKy8vIGhhbmRsZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb25seS4KK2ludCBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcih1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QpIHsKKyAgQXV0b0hhbmRsZSBwYXJlbnRfcHJvY2Vzc19oYW5kbGUoOjpPcGVuUHJvY2VzcyhQUk9DRVNTX0RVUF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIE5vbi1pbmhlcml0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIGlmIChwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgiVW5hYmxlIHRvIG9wZW4gcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgY2hlY2sgd2l0aCBhCisgIC8vIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gd2hlbiBhdmFpbGFibGUuCisgIEdURVNUX0NIRUNLXyhzaXplb2YoSEFORExFKSA8PSBzaXplb2Yoc2l6ZV90KSk7CisKKyAgY29uc3QgSEFORExFIHdyaXRlX2hhbmRsZSA9CisgICAgICByZWludGVycHJldF9jYXN0PEhBTkRMRT4od3JpdGVfaGFuZGxlX2FzX3NpemVfdCk7CisgIEhBTkRMRSBkdXBfd3JpdGVfaGFuZGxlOworCisgIC8vIFRoZSBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgaXMgYWNjZXNzaWJsZSBvbmx5IGluIGluIHRoZSBwYXJlbnQKKyAgLy8gcHJvY2Vzcy4gVG8gb2J0YWluIG9uZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY2hpbGQsIHdlIG5lZWQgdG8gdXNlCisgIC8vIER1cGxpY2F0ZUhhbmRsZS4KKyAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIHdyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfd3JpdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgICAgLy8gUmVxdWVzdGVkIHByaXZpbGVnZXMgaWdub3JlZCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRFVQTElDQVRFX1NBTUVfQUNDRVNTIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBSZXF1ZXN0IG5vbi1pbmhlcml0YWJsZSBoYW5kbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIHBpcGUgaGFuZGxlICVJdSBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAldSIsCisgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICBjb25zdCBIQU5ETEUgZXZlbnRfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX2V2ZW50X2hhbmRsZTsKKworICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgZXZlbnRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF9ldmVudF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIGV2ZW50IGhhbmRsZSAlSXUgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90LCBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgaW50IHdyaXRlX2ZkID0KKyAgICAgIDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGR1cF93cml0ZV9oYW5kbGUpLCBPX0FQUEVORCk7CisgIGlmICh3cml0ZV9mZCA9PSAtMSkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiVW5hYmxlIHRvIGNvbnZlcnQgcGlwZSBoYW5kbGUgJUl1IHRvIGEgZmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCkpOworICB9CisKKyAgLy8gU2lnbmFscyB0aGUgcGFyZW50IHRoYXQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBoYXMgYmVlbiBhY3F1aXJlZAorICAvLyBzbyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gd3JpdGUgZW5kLgorICA6OlNldEV2ZW50KGR1cF9ldmVudF9oYW5kbGUpOworCisgIHJldHVybiB3cml0ZV9mZDsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcworLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgorLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgorSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIHsKKyAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID09ICIiKSByZXR1cm4gTlVMTDsKKworICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZQorICAvLyBjYW4gdXNlIGl0IGhlcmUuCisgIGludCBsaW5lID0gLTE7CisgIGludCBpbmRleCA9IC0xOworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBmaWVsZHM7CisgIFNwbGl0U3RyaW5nKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmNfc3RyKCksICd8JywgJmZpZWxkcyk7CisgIGludCB3cml0ZV9mZCA9IC0xOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICB1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQgPSAwOworICBzaXplX3Qgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCA9IDA7CisgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90ID0gMDsKKworICBpZiAoZmllbGRzLnNpemUoKSAhPSA2CisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZwYXJlbnRfcHJvY2Vzc19pZCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzRdLCAmd3JpdGVfaGFuZGxlX2FzX3NpemVfdCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzVdLCAmZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICVzIiwKKyAgICAgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSkpOworICB9CisgIHdyaXRlX2ZkID0gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IocGFyZW50X3Byb2Nlc3NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsKKyMgZWxzZQorCisgIGlmIChmaWVsZHMuc2l6ZSgpICE9IDQKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzJdLCAmaW5kZXgpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJndyaXRlX2ZkKSkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogJXMiLAorICAgICAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpKSk7CisgIH0KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIHJldHVybiBuZXcgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGZpZWxkc1swXSwgbGluZSwgaW5kZXgsIHdyaXRlX2ZkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjI1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjCkBAIC0wLDAgKzEsMzgwIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxpZiBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX05BQ0wKKy8vIFN5bWJpYW4gT3BlbkMgYW5kIE5hQ2wgaGF2ZSBQQVRIX01BWCBpbiBzeXMvc3lzbGltaXRzLmgKKyMgaW5jbHVkZSA8c3lzL3N5c2xpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjIGluY2x1ZGUgPGNsaW1pdHM+ICAvLyBTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZGVmaW5lIFBBVEhfTUFYIGhlcmUuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX01BWF9QQVRICisjZWxpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKF9YT1BFTl9QQVRIX01BWCkKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfWE9QRU5fUEFUSF9NQVgKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1BPU0lYX1BBVEhfTUFYCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gT24gV2luZG93cywgJ1xcJyBpcyB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IsIGJ1dCBtYW55IHRvb2xzIGFuZCB0aGUKKy8vIFdpbmRvd3MgQVBJIGFsc28gYWNjZXB0ICcvJyBhcyBhbiBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IuIFVubGVzcyBvdGhlcndpc2UKKy8vIG5vdGVkLCBhIGZpbGUgcGF0aCBjYW4gY29udGFpbiBlaXRoZXIga2luZCBvZiBwYXRoIHNlcGFyYXRvcnMsIG9yIGEgbWl4dHVyZQorLy8gb2YgdGhlbS4KK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnXFwnOworY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICJcXCI7Citjb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yU3RyaW5nW10gPSAiLyI7CisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LiBZb3Ugc2hvdWxkIG5vdCB1c2UKKy8vIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiB0ZXN0cyBvbiBXaW5kb3dzIENFLCBidXQgdGhpcyBhdCBsZWFzdAorLy8gcHJvdmlkZXMgYSByZWFzb25hYmxlIGZhbGxiYWNrLgorY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIlxcIjsKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBkZWZpbmUgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMKK2NvbnN0IERXT1JEIGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMgPSAweGZmZmZmZmZmOworIyBlbHNlCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLlxcIjsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjZWxzZQorY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuLyI7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXRoIHNlcGFyYXRvci4KK3N0YXRpYyBib29sIElzUGF0aFNlcGFyYXRvcihjaGFyIGMpIHsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICByZXR1cm4gKGMgPT0ga1BhdGhTZXBhcmF0b3IpIHx8IChjID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKKyNlbHNlCisgIHJldHVybiBjID09IGtQYXRoU2VwYXJhdG9yOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCisgIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgorICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoX2dldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2Vsc2UKKyAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKKyAgcmV0dXJuIEZpbGVQYXRoKGdldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKKy8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAorLy8gZm91bmQsIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBGaWxlUGF0aC4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdCB7CisgIFN0cmluZyBkb3RfZXh0ZW5zaW9uKFN0cmluZzo6Rm9ybWF0KCIuJXMiLCBleHRlbnNpb24pKTsKKyAgaWYgKHBhdGhuYW1lXy5FbmRzV2l0aENhc2VJbnNlbnNpdGl2ZShkb3RfZXh0ZW5zaW9uLmNfc3RyKCkpKSB7CisgICAgcmV0dXJuIEZpbGVQYXRoKFN0cmluZyhwYXRobmFtZV8uY19zdHIoKSwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gNCkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KKy8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgKKy8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCitjb25zdCBjaGFyKiBGaWxlUGF0aDo6RmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3RfYWx0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLgorICBpZiAobGFzdF9hbHRfc2VwICE9IE5VTEwgJiYKKyAgICAgIChsYXN0X3NlcCA9PSBOVUxMIHx8IGxhc3RfYWx0X3NlcCA+IGxhc3Rfc2VwKSkgeworICAgIHJldHVybiBsYXN0X2FsdF9zZXA7CisgIH0KKyNlbmRpZgorICByZXR1cm4gbGFzdF9zZXA7Cit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCisvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKKy8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0CisvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7CisgIHJldHVybiBsYXN0X3NlcCA/IEZpbGVQYXRoKFN0cmluZyhsYXN0X3NlcCArIDEpKSA6ICp0aGlzOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgorLy8gSWYgdGhlIEZpbGVQYXRoIGlzICJhX2ZpbGUiIG9yICIvYV9maWxlIiwgUmVtb3ZlRmlsZU5hbWUgcmV0dXJucworLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMKKy8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVGaWxlTmFtZSgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKTsKKyAgU3RyaW5nIGRpcjsKKyAgaWYgKGxhc3Rfc2VwKSB7CisgICAgZGlyID0gU3RyaW5nKGNfc3RyKCksIGxhc3Rfc2VwICsgMSAtIGNfc3RyKCkpOworICB9IGVsc2UgeworICAgIGRpciA9IGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nOworICB9CisgIHJldHVybiBGaWxlUGF0aChkaXIpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuCisKKy8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCisvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKKy8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7CisgIFN0cmluZyBmaWxlOworICBpZiAobnVtYmVyID09IDApIHsKKyAgICBmaWxlID0gU3RyaW5nOjpGb3JtYXQoIiVzLiVzIiwgYmFzZV9uYW1lLmNfc3RyKCksIGV4dGVuc2lvbik7CisgIH0gZWxzZSB7CisgICAgZmlsZSA9IFN0cmluZzo6Rm9ybWF0KCIlc18lZC4lcyIsIGJhc2VfbmFtZS5jX3N0cigpLCBudW1iZXIsIGV4dGVuc2lvbik7CisgIH0KKyAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOworfQorCisvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6OkNvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgaWYgKGRpcmVjdG9yeS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7CisgIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICByZXR1cm4gRmlsZVBhdGgoU3RyaW5nOjpGb3JtYXQoIiVzJWMlcyIsIGRpci5jX3N0cigpLCBrUGF0aFNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX3BhdGguY19zdHIoKSkpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIHNvbWV0aGluZyBmaW5kYWJsZSBpbiB0aGUgZmlsZS1zeXN0ZW0sCisvLyBlaXRoZXIgYSBmaWxlLCBkaXJlY3RvcnksIG9yIHdoYXRldmVyLgorYm9vbCBGaWxlUGF0aDo6RmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aG5hbWVfLmNfc3RyKCkpOworICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworICByZXR1cm4gYXR0cmlidXRlcyAhPSBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzOworI2Vsc2UKKyAgcG9zaXg6OlN0YXRTdHJ1Y3QgZmlsZV9zdGF0OworICByZXR1cm4gcG9zaXg6OlN0YXQocGF0aG5hbWVfLmNfc3RyKCksICZmaWxlX3N0YXQpID09IDA7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGUtc3lzdGVtCisvLyB0aGF0IGV4aXN0cy4KK2Jvb2wgRmlsZVBhdGg6OkRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIERvbid0IHN0cmlwIG9mZiB0cmFpbGluZyBzZXBhcmF0b3IgaWYgcGF0aCBpcyBhIHJvb3QgZGlyZWN0b3J5IG9uCisgIC8vIFdpbmRvd3MgKGxpa2UgIkM6XFwiKS4KKyAgY29uc3QgRmlsZVBhdGgmIHBhdGgoSXNSb290RGlyZWN0b3J5KCkgPyAqdGhpcyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworI2Vsc2UKKyAgY29uc3QgRmlsZVBhdGgmIHBhdGgoKnRoaXMpOworI2VuZGlmCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGguY19zdHIoKSk7CisgIGNvbnN0IERXT1JEIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlcyh1bmljb2RlKTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisgIGlmICgoYXR0cmlidXRlcyAhPSBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzKSAmJgorICAgICAgKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSB7CisgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgfQorI2Vsc2UKKyAgcG9zaXg6OlN0YXRTdHJ1Y3QgZmlsZV9zdGF0OworICByZXN1bHQgPSBwb3NpeDo6U3RhdChwYXRoLmNfc3RyKCksICZmaWxlX3N0YXQpID09IDAgJiYKKyAgICAgIHBvc2l4OjpJc0RpcihmaWxlX3N0YXQpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQorLy8gcm9vdCBkaXJlY3RvcnkgcGVyIGRpc2sgZHJpdmUuKQorYm9vbCBGaWxlUGF0aDo6SXNSb290RGlyZWN0b3J5KCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG9uIFdpbmRvd3MgYSBuZXR3b3JrIHNoYXJlIGxpa2UKKyAgLy8gXFxzZXJ2ZXJcc2hhcmUgY2FuIGJlIGEgcm9vdCBkaXJlY3RvcnksIGFsdGhvdWdoIGl0IGNhbm5vdCBiZSB0aGUKKyAgLy8gY3VycmVudCBkaXJlY3RvcnkuICBIYW5kbGUgdGhpcyBwcm9wZXJseS4KKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAzICYmIElzQWJzb2x1dGVQYXRoKCk7CisjZWxzZQorICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDEgJiYgSXNQYXRoU2VwYXJhdG9yKHBhdGhuYW1lXy5jX3N0cigpWzBdKTsKKyNlbmRpZgorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguCitib29sIEZpbGVQYXRoOjpJc0Fic29sdXRlUGF0aCgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHBhdGhuYW1lXy5jX3N0cigpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA+PSAzICYmCisgICAgICgobmFtZVswXSA+PSAnYScgJiYgbmFtZVswXSA8PSAneicpIHx8CisgICAgICAobmFtZVswXSA+PSAnQScgJiYgbmFtZVswXSA8PSAnWicpKSAmJgorICAgICBuYW1lWzFdID09ICc6JyAmJgorICAgICBJc1BhdGhTZXBhcmF0b3IobmFtZVsyXSk7CisjZWxzZQorICByZXR1cm4gSXNQYXRoU2VwYXJhdG9yKG5hbWVbMF0pOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgYSBwYXRobmFtZSBmb3IgYSBmaWxlIHRoYXQgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiBUaGUgcGF0aG5hbWUKKy8vIHdpbGwgYmUgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24gb3IKKy8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uCisvLyBhbHJlYWR5IGV4aXN0cy4gVGhlIG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIHVudGlsIGEgcGF0aG5hbWUgaXMgZm91bmQKKy8vIHRoYXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKy8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuCisvLyBUaGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGlmIHR3byBvciBtb3JlIHByb2Nlc3NlcyBhcmUgY2FsbGluZyB0aGlzCisvLyBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lIC0tIHRoZXkgY291bGQgYm90aCBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lLgorRmlsZVBhdGggRmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKKyAgRmlsZVBhdGggZnVsbF9wYXRobmFtZTsKKyAgaW50IG51bWJlciA9IDA7CisgIGRvIHsKKyAgICBmdWxsX3BhdGhuYW1lLlNldChNYWtlRmlsZU5hbWUoZGlyZWN0b3J5LCBiYXNlX25hbWUsIG51bWJlcisrLCBleHRlbnNpb24pKTsKKyAgfSB3aGlsZSAoZnVsbF9wYXRobmFtZS5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7CisgIHJldHVybiBmdWxsX3BhdGhuYW1lOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0CisvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorLy8gVGhpcyBkb2VzIE5PVCBjaGVjayB0aGF0IGEgZGlyZWN0b3J5IChvciBmaWxlKSBhY3R1YWxseSBleGlzdHMuCitib29sIEZpbGVQYXRoOjpJc0RpcmVjdG9yeSgpIGNvbnN0IHsKKyAgcmV0dXJuICFwYXRobmFtZV8uZW1wdHkoKSAmJgorICAgICAgICAgSXNQYXRoU2VwYXJhdG9yKHBhdGhuYW1lXy5jX3N0cigpW3BhdGhuYW1lXy5sZW5ndGgoKSAtIDFdKTsKK30KKworLy8gQ3JlYXRlIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCisvLyB0aGUgZGlyZWN0b3JpZXMgYWxyZWFkeSBleGlzdDsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yaWVzCisvLyBmb3IgYW55IHJlYXNvbi4KK2Jvb2wgRmlsZVBhdGg6OkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBjb25zdCB7CisgIGlmICghdGhpcy0+SXNEaXJlY3RvcnkoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMCB8fCB0aGlzLT5EaXJlY3RvcnlFeGlzdHMoKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgRmlsZVBhdGggcGFyZW50KHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLlJlbW92ZUZpbGVOYW1lKCkpOworICByZXR1cm4gcGFyZW50LkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSAmJiB0aGlzLT5DcmVhdGVGb2xkZXIoKTsKK30KKworLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKKy8vIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUKKy8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90CisvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KK2Jvb2wgRmlsZVBhdGg6OkNyZWF0ZUZvbGRlcigpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBGaWxlUGF0aCByZW1vdmVkX3NlcCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocmVtb3ZlZF9zZXAuY19zdHIoKSk7CisgIGludCByZXN1bHQgPSBDcmVhdGVEaXJlY3RvcnkodW5pY29kZSwgTlVMTCkgPyAwIDogLTE7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICBpbnQgcmVzdWx0ID0gX21rZGlyKHBhdGhuYW1lXy5jX3N0cigpKTsKKyNlbHNlCisgIGludCByZXN1bHQgPSBta2RpcihwYXRobmFtZV8uY19zdHIoKSwgMDc3Nyk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgIHJldHVybiB0aGlzLT5EaXJlY3RvcnlFeGlzdHMoKTsgIC8vIEFuIGVycm9yIGlzIE9LIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICB9CisgIHJldHVybiB0cnVlOyAgLy8gTm8gZXJyb3IuCit9CisKKy8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gdGhlCisvLyBuYW1lLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBuYW1lIHN0cmluZyB1bm1vZGlmaWVkLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdCB7CisgIHJldHVybiBJc0RpcmVjdG9yeSgpCisgICAgICA/IEZpbGVQYXRoKFN0cmluZyhwYXRobmFtZV8uY19zdHIoKSwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gMSkpCisgICAgICA6ICp0aGlzOworfQorCisvLyBSZW1vdmVzIGFueSByZWR1bmRhbnQgc2VwYXJhdG9ycyB0aGF0IG1pZ2h0IGJlIGluIHRoZSBwYXRobmFtZS4KKy8vIEZvciBleGFtcGxlLCAiYmFyLy8vZm9vIiBiZWNvbWVzICJiYXIvZm9vIi4gRG9lcyBub3QgZWxpbWluYXRlIG90aGVyCisvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBoYW5kbGUgV2luZG93cyBuZXR3b3JrIHNoYXJlcyAoZS5nLiBcXHNlcnZlclxzaGFyZSkuCit2b2lkIEZpbGVQYXRoOjpOb3JtYWxpemUoKSB7CisgIGlmIChwYXRobmFtZV8uY19zdHIoKSA9PSBOVUxMKSB7CisgICAgcGF0aG5hbWVfID0gIiI7CisgICAgcmV0dXJuOworICB9CisgIGNvbnN0IGNoYXIqIHNyYyA9IHBhdGhuYW1lXy5jX3N0cigpOworICBjaGFyKiBjb25zdCBkZXN0ID0gbmV3IGNoYXJbcGF0aG5hbWVfLmxlbmd0aCgpICsgMV07CisgIGNoYXIqIGRlc3RfcHRyID0gZGVzdDsKKyAgbWVtc2V0KGRlc3RfcHRyLCAwLCBwYXRobmFtZV8ubGVuZ3RoKCkgKyAxKTsKKworICB3aGlsZSAoKnNyYyAhPSAnXDAnKSB7CisgICAgKmRlc3RfcHRyID0gKnNyYzsKKyAgICBpZiAoIUlzUGF0aFNlcGFyYXRvcigqc3JjKSkgeworICAgICAgc3JjKys7CisgICAgfSBlbHNlIHsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICAgICAgaWYgKCpkZXN0X3B0ciA9PSBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcikgeworICAgICAgICAqZGVzdF9wdHIgPSBrUGF0aFNlcGFyYXRvcjsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgd2hpbGUgKElzUGF0aFNlcGFyYXRvcigqc3JjKSkKKyAgICAgICAgc3JjKys7CisgICAgfQorICAgIGRlc3RfcHRyKys7CisgIH0KKyAgKmRlc3RfcHRyID0gJ1wwJzsKKyAgcGF0aG5hbWVfID0gZGVzdDsKKyAgZGVsZXRlW10gZGVzdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhMjEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgKQEAgLTAsMCArMSwxMDM4IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHVzZWQgYnkgdGhlIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBwdXJlbHkgR29vZ2xlIFRlc3QncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbi4gIFBsZWFzZQorLy8gRE8gTk9UICNJTkNMVURFIElUIElOIEEgVVNFUiBQUk9HUkFNLgorCisjaWZuZGVmIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKyNkZWZpbmUgR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXworCisvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8gaXMgZGVmaW5lZCB0byAxIGlmZiB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0IGlzCisvLyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb247IG90aGVyd2lzZSBpdCdzIHVuZGVmaW5lZC4KKyNpZiAhR1RFU1RfSU1QTEVNRU5UQVRJT05fCisvLyBBIHVzZXIgaXMgdHJ5aW5nIHRvIGluY2x1ZGUgdGhpcyBmcm9tIGhpcyBjb2RlIC0ganVzdCBzYXkgbm8uCisjIGVycm9yICJndGVzdC1pbnRlcm5hbC1pbmwuaCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uIgorIyBlcnJvciAiSXQgbXVzdCBub3QgYmUgaW5jbHVkZWQgZXhjZXB0IGJ5IEdvb2dsZSBUZXN0IGl0c2VsZi4iCisjZW5kaWYgIC8vIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyMgaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBzdHJ0b2xsL19zdHJ0b3VsNjQvbWFsbG9jL2ZyZWUuCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBGb3IgbWVtbW92ZS4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIgIC8vIE5PTElOVAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlY2xhcmVzIHRoZSBmbGFncy4KKy8vCisvLyBXZSBkb24ndCB3YW50IHRoZSB1c2VycyB0byBtb2RpZnkgdGhpcyBmbGFnIGluIHRoZSBjb2RlLCBidXQgd2FudAorLy8gR29vZ2xlIFRlc3QncyBvd24gdW5pdCB0ZXN0cyB0byBiZSBhYmxlIHRvIGFjY2VzcyBpdC4gVGhlcmVmb3JlIHdlCisvLyBkZWNsYXJlIGl0IGhlcmUgYXMgb3Bwb3NlZCB0byBpbiBndGVzdC5oLgorR1RFU1RfREVDTEFSRV9ib29sXyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAorLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdDsKKworLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgorY29uc3QgY2hhciBrQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnW10gPSAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiOworY29uc3QgY2hhciBrQnJlYWtPbkZhaWx1cmVGbGFnW10gPSAiYnJlYWtfb25fZmFpbHVyZSI7Citjb25zdCBjaGFyIGtDYXRjaEV4Y2VwdGlvbnNGbGFnW10gPSAiY2F0Y2hfZXhjZXB0aW9ucyI7Citjb25zdCBjaGFyIGtDb2xvckZsYWdbXSA9ICJjb2xvciI7Citjb25zdCBjaGFyIGtGaWx0ZXJGbGFnW10gPSAiZmlsdGVyIjsKK2NvbnN0IGNoYXIga0xpc3RUZXN0c0ZsYWdbXSA9ICJsaXN0X3Rlc3RzIjsKK2NvbnN0IGNoYXIga091dHB1dEZsYWdbXSA9ICJvdXRwdXQiOworY29uc3QgY2hhciBrUHJpbnRUaW1lRmxhZ1tdID0gInByaW50X3RpbWUiOworY29uc3QgY2hhciBrUmFuZG9tU2VlZEZsYWdbXSA9ICJyYW5kb21fc2VlZCI7Citjb25zdCBjaGFyIGtSZXBlYXRGbGFnW10gPSAicmVwZWF0IjsKK2NvbnN0IGNoYXIga1NodWZmbGVGbGFnW10gPSAic2h1ZmZsZSI7Citjb25zdCBjaGFyIGtTdGFja1RyYWNlRGVwdGhGbGFnW10gPSAic3RhY2tfdHJhY2VfZGVwdGgiOworY29uc3QgY2hhciBrU3RyZWFtUmVzdWx0VG9GbGFnW10gPSAic3RyZWFtX3Jlc3VsdF90byI7Citjb25zdCBjaGFyIGtUaHJvd09uRmFpbHVyZUZsYWdbXSA9ICJ0aHJvd19vbl9mYWlsdXJlIjsKKworLy8gQSB2YWxpZCByYW5kb20gc2VlZCBtdXN0IGJlIGluIFsxLCBrTWF4UmFuZG9tU2VlZF0uCitjb25zdCBpbnQga01heFJhbmRvbVNlZWQgPSA5OTk5OTsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitHVEVTVF9BUElfIGV4dGVybiBib29sIGdfaGVscF9mbGFnOworCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorR1RFU1RfQVBJXyBUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRVc2VDb2xvcihib29sIHN0ZG91dF9pc190dHkpOworCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoVGltZUluTWlsbGlzIG1zKTsKKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZiAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorR1RFU1RfQVBJXyBib29sIFBhcnNlSW50MzJGbGFnKAorICAgIGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKTsKKworLy8gUmV0dXJucyBhIHJhbmRvbSBzZWVkIGluIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gYmFzZWQgb24gdGhlCisvLyBnaXZlbiAtLWd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgdmFsdWUuCitpbmxpbmUgaW50IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhJbnQzMiByYW5kb21fc2VlZF9mbGFnKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCByYXdfc2VlZCA9IChyYW5kb21fc2VlZF9mbGFnID09IDApID8KKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oR2V0VGltZUluTWlsbGlzKCkpIDoKKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmFuZG9tX3NlZWRfZmxhZyk7CisKKyAgLy8gTm9ybWFsaXplcyB0aGUgYWN0dWFsIHNlZWQgdG8gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBzdWNoIHRoYXQKKyAgLy8gaXQncyBlYXN5IHRvIHR5cGUuCisgIGNvbnN0IGludCBub3JtYWxpemVkX3NlZWQgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmF3X3NlZWQgLSAxVSkgJQorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtNYXhSYW5kb21TZWVkKSkgKyAxOworICByZXR1cm4gbm9ybWFsaXplZF9zZWVkOworfQorCisvLyBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCByYW5kb20gc2VlZCBhZnRlciAnc2VlZCcuICBUaGUgYmVoYXZpb3IgaXMKKy8vIHVuZGVmaW5lZCBpZiAnc2VlZCcgaXMgaW52YWxpZC4gIFRoZSBzZWVkIGFmdGVyIGtNYXhSYW5kb21TZWVkIGlzCisvLyBjb25zaWRlcmVkIHRvIGJlIDEuCitpbmxpbmUgaW50IEdldE5leHRSYW5kb21TZWVkKGludCBzZWVkKSB7CisgIEdURVNUX0NIRUNLXygxIDw9IHNlZWQgJiYgc2VlZCA8PSBrTWF4UmFuZG9tU2VlZCkKKyAgICAgIDw8ICJJbnZhbGlkIHJhbmRvbSBzZWVkICIgPDwgc2VlZCA8PCAiIC0gbXVzdCBiZSBpbiBbMSwgIgorICAgICAgPDwga01heFJhbmRvbVNlZWQgPDwgIl0uIjsKKyAgY29uc3QgaW50IG5leHRfc2VlZCA9IHNlZWQgKyAxOworICByZXR1cm4gKG5leHRfc2VlZCA+IGtNYXhSYW5kb21TZWVkKSA/IDEgOiBuZXh0X3NlZWQ7Cit9CisKKy8vIFRoaXMgY2xhc3Mgc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gaXRzIGMndG9yLCBhbmQKKy8vIHJlc3RvcmVzIHRoZW0gaW4gaXRzIGQndG9yLgorY2xhc3MgR1Rlc3RGbGFnU2F2ZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGMndG9yLgorICBHVGVzdEZsYWdTYXZlcigpIHsKKyAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c18gPSBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKKyAgICBicmVha19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7CisgICAgY2F0Y2hfZXhjZXB0aW9uc18gPSBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOworICAgIGNvbG9yXyA9IEdURVNUX0ZMQUcoY29sb3IpOworICAgIGRlYXRoX3Rlc3Rfc3R5bGVfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKKyAgICBkZWF0aF90ZXN0X3VzZV9mb3JrXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisgICAgZmlsdGVyXyA9IEdURVNUX0ZMQUcoZmlsdGVyKTsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF8gPSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKKyAgICBsaXN0X3Rlc3RzXyA9IEdURVNUX0ZMQUcobGlzdF90ZXN0cyk7CisgICAgb3V0cHV0XyA9IEdURVNUX0ZMQUcob3V0cHV0KTsKKyAgICBwcmludF90aW1lXyA9IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7CisgICAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhyYW5kb21fc2VlZCk7CisgICAgcmVwZWF0XyA9IEdURVNUX0ZMQUcocmVwZWF0KTsKKyAgICBzaHVmZmxlXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSk7CisgICAgc3RhY2tfdHJhY2VfZGVwdGhfID0gR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7CisgICAgc3RyZWFtX3Jlc3VsdF90b18gPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOworICAgIHRocm93X29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgfQorCisgIC8vIFRoZSBkJ3RvciBpcyBub3QgdmlydHVhbC4gIERPIE5PVCBJTkhFUklUIEZST00gVEhJUyBDTEFTUy4KKyAgfkdUZXN0RmxhZ1NhdmVyKCkgeworICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBicmVha19vbl9mYWlsdXJlXzsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gY2F0Y2hfZXhjZXB0aW9uc187CisgICAgR1RFU1RfRkxBRyhjb2xvcikgPSBjb2xvcl87CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9IGRlYXRoX3Rlc3Rfc3R5bGVfOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSBmaWx0ZXJfOworICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID0gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBsaXN0X3Rlc3RzXzsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSBvdXRwdXRfOworICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBwcmludF90aW1lXzsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IHJhbmRvbV9zZWVkXzsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXRfOworICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBzaHVmZmxlXzsKKyAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IHN0YWNrX3RyYWNlX2RlcHRoXzsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gc3RyZWFtX3Jlc3VsdF90b187CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOworICB9CisgcHJpdmF0ZToKKyAgLy8gRmllbGRzIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiBmbGFncy4KKyAgYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187CisgIGJvb2wgYnJlYWtfb25fZmFpbHVyZV87CisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisgIFN0cmluZyBjb2xvcl87CisgIFN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgU3RyaW5nIGZpbHRlcl87CisgIFN0cmluZyBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87CisgIGJvb2wgbGlzdF90ZXN0c187CisgIFN0cmluZyBvdXRwdXRfOworICBib29sIHByaW50X3RpbWVfOworICBib29sIHByZXR0eV87CisgIGludGVybmFsOjpJbnQzMiByYW5kb21fc2VlZF87CisgIGludGVybmFsOjpJbnQzMiByZXBlYXRfOworICBib29sIHNodWZmbGVfOworICBpbnRlcm5hbDo6SW50MzIgc3RhY2tfdHJhY2VfZGVwdGhfOworICBTdHJpbmcgc3RyZWFtX3Jlc3VsdF90b187CisgIGJvb2wgdGhyb3dfb25fZmFpbHVyZV87Cit9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworCisvLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQorLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCisvLyBUaGUgb3V0cHV0IGJ1ZmZlciBzdHIgbXVzdCBjb250YWludCBhdCBsZWFzdCAzMiBjaGFyYWN0ZXJzLgorLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBidWZmZXIuCisvLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuCitHVEVTVF9BUElfIGNoYXIqIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCwgY2hhciogc3RyKTsKKworLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBUaGUgd2lkZSBzdHJpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZW5jb2Rpbmc6CisvLyAgIFVURi0xNiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gMiAob24gV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKQorLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQorLy8gUGFyYW1ldGVyIHN0ciBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuCisvLyBQYXJhbWV0ZXIgbnVtX2NoYXJzIG1heSBhZGRpdGlvbmFsbHkgbGltaXQgdGhlIG51bWJlcgorLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nCisvLyBzaG91bGQgYmUgcHJvY2Vzc2VkLgorLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cworLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLiBJZiB0aGUgc3RyaW5nIGlzIGluIFVURjE2IGVuY29kaW5nCisvLyBhbmQgY29udGFpbnMgaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLCB2YWx1ZXMgaW4gdGhvc2UgcGFpcnMKKy8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4KK0dURVNUX0FQSV8gU3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKTsKKworLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCisvLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90CisvLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgordm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKKworLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50CisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCisvLyBidXQgaW5jb25zaXN0ZW50IChlLmcuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKKy8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKKy8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKKy8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgorR1RFU1RfQVBJXyBib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yIGFuZAorLy8gYW5kIGFib3J0cy4KK0dURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogZW52X3ZhciwgSW50MzIgZGVmYXVsdF92YWwpOworCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorR1RFU1RfQVBJXyBib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKAorICAgIGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpOworCisvLyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBjb250YWluZXIgdGhhdCBzYXRpc2Z5CisvLyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgUHJlZGljYXRlPgoraW5saW5lIGludCBDb3VudElmKGNvbnN0IENvbnRhaW5lciYgYywgUHJlZGljYXRlIHByZWRpY2F0ZSkgeworICAvLyBJbXBsZW1lbnRlZCBhcyBhbiBleHBsaWNpdCBsb29wIHNpbmNlIHN0ZDo6Y291bnRfaWYoKSBpbiBsaWJDc3RkIG9uCisgIC8vIFNvbGFyaXMgaGFzIGEgbm9uLXN0YW5kYXJkIHNpZ25hdHVyZS4KKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOyBpdCAhPSBjLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKHByZWRpY2F0ZSgqaXQpKQorICAgICAgKytjb3VudDsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKy8vIEFwcGxpZXMgYSBmdW5jdGlvbi9mdW5jdG9yIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgRnVuY3Rvcj4KK3ZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXImIGMsIEZ1bmN0b3IgZnVuY3RvcikgeworICBzdGQ6OmZvcl9lYWNoKGMuYmVnaW4oKSwgYy5lbmQoKSwgZnVuY3Rvcik7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgdmVjdG9yLCBvciBkZWZhdWx0X3ZhbHVlIGlmIGkgaXMgbm90CisvLyBpbiByYW5nZSBbMCwgdi5zaXplKCkpLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgRSBHZXRFbGVtZW50T3IoY29uc3Qgc3RkOjp2ZWN0b3I8RT4mIHYsIGludCBpLCBFIGRlZmF1bHRfdmFsdWUpIHsKKyAgcmV0dXJuIChpIDwgMCB8fCBpID49IHN0YXRpY19jYXN0PGludD4odi5zaXplKCkpKSA/IGRlZmF1bHRfdmFsdWUgOiB2W2ldOworfQorCisvLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIGEgcmFuZ2Ugb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgorLy8gJ2JlZ2luJyBhbmQgJ2VuZCcgYXJlIGVsZW1lbnQgaW5kaWNlcyBhcyBhbiBTVEwtc3R5bGUgcmFuZ2U7CisvLyBpLmUuIFtiZWdpbiwgZW5kKSBhcmUgc2h1ZmZsZWQsIHdoZXJlICdlbmQnID09IHNpemUoKSBtZWFucyB0bworLy8gc2h1ZmZsZSB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK3ZvaWQgU2h1ZmZsZVJhbmdlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgaW50IGJlZ2luLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSk7CisgIEdURVNUX0NIRUNLXygwIDw9IGJlZ2luICYmIGJlZ2luIDw9IHNpemUpCisgICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0ICIgPDwgYmVnaW4gPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbMCwgIgorICAgICAgPDwgc2l6ZSA8PCAiXS4iOworICBHVEVTVF9DSEVDS18oYmVnaW4gPD0gZW5kICYmIGVuZCA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggIiA8PCBlbmQgPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbIgorICAgICAgPDwgYmVnaW4gPDwgIiwgIiA8PCBzaXplIDw8ICJdLiI7CisKKyAgLy8gRmlzaGVyLVlhdGVzIHNodWZmbGUsIGZyb20KKyAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZQorICBmb3IgKGludCByYW5nZV93aWR0aCA9IGVuZCAtIGJlZ2luOyByYW5nZV93aWR0aCA+PSAyOyByYW5nZV93aWR0aC0tKSB7CisgICAgY29uc3QgaW50IGxhc3RfaW5fcmFuZ2UgPSBiZWdpbiArIHJhbmdlX3dpZHRoIC0gMTsKKyAgICBjb25zdCBpbnQgc2VsZWN0ZWQgPSBiZWdpbiArIHJhbmRvbS0+R2VuZXJhdGUocmFuZ2Vfd2lkdGgpOworICAgIHN0ZDo6c3dhcCgoKnYpW3NlbGVjdGVkXSwgKCp2KVtsYXN0X2luX3JhbmdlXSk7CisgIH0KK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK2lubGluZSB2b2lkIFNodWZmbGUoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBzdGQ6OnZlY3RvcjxFPiogdikgeworICBTaHVmZmxlUmFuZ2UocmFuZG9tLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSksIHYpOworfQorCisvLyBBIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhbiBvYmplY3QuICBIYW5keSBmb3IgYmVpbmcgdXNlZCBhcyBhCisvLyBmdW5jdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBEZWxldGUoVCogeCkgeworICBkZWxldGUgeDsKK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIGtleSBvZiBhIFRlc3RQcm9wZXJ0eSBhZ2FpbnN0IGEga25vd24ga2V5LgorLy8KKy8vIFRlc3RQcm9wZXJ0eUtleUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdFByb3BlcnR5S2V5SXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRlc3RQcm9wZXJ0eUtleUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBUZXN0UHJvcGVydHlLZXlJcyhjb25zdCBjaGFyKiBrZXkpCisgICAgICA6IGtleV8oa2V5KSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0IHByb3BlcnR5IG1hdGNoZXMgb24ga2V5Xy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmcodGVzdF9wcm9wZXJ0eS5rZXkoKSkuQ29tcGFyZShrZXlfKSA9PSAwOworICB9CisKKyBwcml2YXRlOgorICBTdHJpbmcga2V5XzsKK307CisKKy8vIENsYXNzIFVuaXRUZXN0T3B0aW9ucy4KKy8vCisvLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBvcHRpb25zIHRoZSB1c2VyCisvLyBzcGVjaWZpZXMgd2hlbiBydW5uaW5nIHRoZSB0ZXN0cy4gIEl0IGhhcyBvbmx5IHN0YXRpYyBtZW1iZXJzLgorLy8KKy8vIEluIG1vc3QgY2FzZXMsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IGFuIG9wdGlvbiB1c2luZyBlaXRoZXIgYW4KKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGEgY29tbWFuZCBsaW5lIGZsYWcuICBFLmcuIHlvdSBjYW4gc2V0IHRoZQorLy8gdGVzdCBmaWx0ZXIgdXNpbmcgZWl0aGVyIEdURVNUX0ZJTFRFUiBvciAtLWd0ZXN0X2ZpbHRlci4gIElmIGJvdGgKKy8vIHRoZSB2YXJpYWJsZSBhbmQgdGhlIGZsYWcgYXJlIHByZXNlbnQsIHRoZSBsYXR0ZXIgb3ZlcnJpZGVzIHRoZQorLy8gZm9ybWVyLgorY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdE9wdGlvbnMgeworIHB1YmxpYzoKKyAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KKworICAvLyBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0LCBvciAiIiBmb3Igbm9ybWFsIHByaW50ZWQgb3V0cHV0LgorICBzdGF0aWMgU3RyaW5nIEdldE91dHB1dEZvcm1hdCgpOworCisgIC8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlCisgIC8vIGRlZmF1bHQgKHRlc3RfZGV0YWlsLnhtbCBpbiB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3RvcnkpIGlmCisgIC8vIG5vbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICBzdGF0aWMgU3RyaW5nIEdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworCisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3RfZmlsdGVyIGZsYWcuCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKyAgLy8gZmlyc3QgJzonIG9yICdcMCcgY2hhcmFjdGVyIGluIHBhdHRlcm4gbWFya3MgdGhlIGVuZCBvZiBpdC4KKyAgLy8KKyAgLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisgIC8vIHdvcmtzIHdlbGwgZW5vdWdoIGZvciBtYXRjaGluZyB0ZXN0IG5hbWVzLCB3aGljaCBhcmUgc2hvcnQuCisgIHN0YXRpYyBib29sIFBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnN0cik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQorICAvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorICBzdGF0aWMgYm9vbCBGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBTdHJpbmcgJnRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcgJnRlc3RfbmFtZSk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIEZ1bmN0aW9uIGZvciBzdXBwb3J0aW5nIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb24gZmxhZy4KKworICAvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKKyAgLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KKyAgc3RhdGljIGludCBHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmICJuYW1lIiBtYXRjaGVzIHRoZSAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYi1zdHlsZQorICAvLyBmaWx0ZXJzIGluICJmaWx0ZXIiLgorICBzdGF0aWMgYm9vbCBNYXRjaGVzRmlsdGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKTsKK307CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0CisvLyBpcyBwcmVzZW50LiAgVXNlZCBieSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZpbGUuCitHVEVTVF9BUElfIEZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpOworCisvLyBUaGUgcm9sZSBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIE9TIHN0YWNrIHRyYWNlIGFzIGEgc3RyaW5nLgorY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisgIHZpcnR1YWwgfk9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4gIFBhcmFtZXRlcnM6CisgIC8vCisgIC8vICAgbWF4X2RlcHRoICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQKKyAgLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorICAvLyAgIHNraXBfY291bnQgLSB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZDsgZG9lc24ndCBjb3VudAorICAvLyAgICAgICAgICAgICAgICBhZ2FpbnN0IG1heF9kZXB0aC4KKyAgdmlydHVhbCBTdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpID0gMDsKKworICAvLyBVcG9uTGVhdmluZ0dUZXN0KCkgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgR29vZ2xlIFRlc3QgY2FsbHMKKyAgLy8gdXNlciBjb2RlLiBJdCBzYXZlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YWNrIHRoYXQKKyAgLy8gQ3VycmVudFN0YWNrVHJhY2UoKSB3aWxsIHVzZSB0byBmaW5kIGFuZCBoaWRlIEdvb2dsZSBUZXN0IHN0YWNrIGZyYW1lcy4KKyAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKSA9IDA7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSk7Cit9OworCisvLyBBIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSBpbnRlcmZhY2UuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIgOiBwdWJsaWMgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlcigpIDogY2FsbGVyX2ZyYW1lXyhOVUxMKSB7fQorICB2aXJ0dWFsIFN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCk7CisgIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCk7CisKKyAgLy8gVGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2Ygc3RhY2sgZnJhbWVzIHRoYXQgYXJlIHBhcnQgb2YKKyAgLy8gR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbi4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFbGlkZWRGcmFtZXNNYXJrZXI7CisKKyBwcml2YXRlOgorICBNdXRleCBtdXRleF87ICAvLyBwcm90ZWN0cyBhbGwgaW50ZXJuYWwgc3RhdGUKKworICAvLyBXZSBzYXZlIHRoZSBzdGFjayBmcmFtZSBiZWxvdyB0aGUgZnJhbWUgdGhhdCBjYWxscyB1c2VyIGNvZGUuCisgIC8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgaW1tZWRpYXRlbHkgYmVsb3cKKyAgLy8gdGhlIHVzZXIgY29kZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGNhbGwgdG8gVXBvbkxlYXZpbmdHVGVzdCgpCisgIC8vIGFuZCBhbnkgY2FsbHMgdG8gQ3VycmVudFN0YWNrVHJhY2UoKSBmcm9tIHdpdGhpbiB0aGUgdXNlciBjb2RlLgorICB2b2lkKiBjYWxsZXJfZnJhbWVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVyKTsKK307CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IGEgR29vZ2xlIFRlc3QgdHJhY2UgcG9pbnQuCitzdHJ1Y3QgVHJhY2VJbmZvIHsKKyAgY29uc3QgY2hhciogZmlsZTsKKyAgaW50IGxpbmU7CisgIFN0cmluZyBtZXNzYWdlOworfTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGluIFVuaXRUZXN0SW1wbC4KKy8vIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuCitjbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgorICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKKyAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gUmVwb3J0cyB0aGUgdGVzdCBwYXJ0CisgIC8vIHJlc3VsdCBpbiB0aGUgY3VycmVudCB0ZXN0LgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IHBlciB0aHJlYWQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGluCisvLyBVbml0VGVzdEltcGwuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuCitjbGFzcyBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgorICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOworICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBUaGUgaW1wbGVtZW50YXRpb24ganVzdAorICAvLyBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgb2YgKnVuaXRfdGVzdF8uCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKworIHByaXZhdGU6CisgIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKK307CisKKy8vIFRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcy4gIFdlIGRvbid0IHByb3RlY3QKKy8vIHRoZSBtZXRob2RzIHVuZGVyIGEgbXV0ZXgsIGFzIHRoaXMgY2xhc3MgaXMgbm90IGFjY2Vzc2libGUgYnkgYQorLy8gdXNlciBhbmQgdGhlIFVuaXRUZXN0IGNsYXNzIHRoYXQgZGVsZWdhdGVzIHdvcmsgdG8gdGhpcyBjbGFzcyBkb2VzCisvLyBwcm9wZXIgbG9ja2luZy4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KTsKKyAgdmlydHVhbCB+VW5pdFRlc3RJbXBsKCk7CisKKyAgLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyB0byByZWdpc3RlciB5b3VyIG93biBUZXN0UGFydFJlc3VsdFJlcG9ydGVyLgorICAvLyBZb3UgY2FuIHJlZ2lzdGVyIHlvdXIgb3duIHJlcG90ZXIgdG8gbGlzdGVuIGVpdGhlciBvbmx5IGZvciB0ZXN0IHJlc3VsdHMKKyAgLy8gZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgb3IgZm9yIHJlc3VsdHMgZnJvbSBhbGwgdGhyZWFkcy4KKyAgLy8gQnkgZGVmYXVsdCwgZWFjaCBwZXItdGhyZWFkIHRlc3QgcmVzdWx0IHJlcG90ZXIganVzdCBwYXNzZXMgYSBuZXcKKyAgLy8gVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGdsb2JhbCB0ZXN0IHJlc3VsdCByZXBvcnRlciwgd2hpY2ggcmVnaXN0ZXJzIHRoZQorICAvLyB0ZXN0IHBhcnQgcmVzdWx0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4KKworICAvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworCisgIC8vIFNldHMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICB2b2lkIFNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOworCisgIC8vIFNldHMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgdm9pZCBTZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKKyAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCisgIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgorICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorICAvLyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgorICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKyAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeworICAgIHJldHVybiBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgPiAwIHx8IGFkX2hvY190ZXN0X3Jlc3VsdCgpLT5GYWlsZWQoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7CisgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpXTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0Q2FzZSogR2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKSB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baW5kZXhdOworICB9CisKKyAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycygpIHsgcmV0dXJuICZsaXN0ZW5lcnNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorICAvLyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0IGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgVGVzdFJlc3VsdCogY3VycmVudF90ZXN0X3Jlc3VsdCgpOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdC4KKyAgY29uc3QgVGVzdFJlc3VsdCogYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJmFkX2hvY190ZXN0X3Jlc3VsdF87IH0KKworICAvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisgIC8vCisgIC8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlcgorICAvLyBhcmUgdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlCisgIC8vIGlucHV0IHRoZSBjdXJyZW50IGdldHRlci4KKyAgdm9pZCBzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKKyAgLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKyAgLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXIoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGEgU3RyaW5nLgorICAvLworICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorICAvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorICAvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKyAgLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisgIC8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisgIC8vIHRyYWNlIGJ1dCBCYXIoKSBhbmQgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0LgorICBTdHJpbmcgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChpbnQgc2tpcF9jb3VudCk7CisKKyAgLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKKyAgLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAvLyAgIHR5cGVfcGFyYW06ICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisgIC8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgLy8gICBzZXRfdXBfdGM6ICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKyAgVGVzdENhc2UqIEdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gQWRkcyBhIFRlc3RJbmZvIHRvIHRoZSB1bml0IHRlc3QuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlc3RfaW5mbzogICAgdGhlIFRlc3RJbmZvIG9iamVjdAorICB2b2lkIEFkZFRlc3RJbmZvKFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgICAgICAgICAgICAgICAgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMsIHdlIG5lZWQgdG8KKyAgICAvLyByZW1lbWJlciB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgdGVzdCBwcm9ncmFtCisgICAgLy8gd2FzIGZpcnN0IGludm9rZWQuICBXZSBjYW5ub3QgZG8gdGhpcyBpbiBSVU5fQUxMX1RFU1RTKCksIGFzCisgICAgLy8gdGhlIHVzZXIgbWF5IGhhdmUgY2hhbmdlZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGNhbGxpbmcKKyAgICAvLyBSVU5fQUxMX1RFU1RTKCkuICBUaGVyZWZvcmUgd2UgY2FwdHVyZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4KKyAgICAvLyBBZGRUZXN0SW5mbygpLCB3aGljaCBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYSBURVNUIG9yIFRFU1RfRgorICAgIC8vIGJlZm9yZSBtYWluKCkgaXMgcmVhY2hlZC4KKyAgICBpZiAob3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkgeworICAgICAgb3JpZ2luYWxfd29ya2luZ19kaXJfLlNldChGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpKTsKKyAgICAgIEdURVNUX0NIRUNLXyghb3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkKKyAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iOworICAgIH0KKworICAgIEdldFRlc3RDYXNlKHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSwKKyAgICAgICAgICAgICAgICB0ZXN0X2luZm8tPnR5cGVfcGFyYW0oKSwKKyAgICAgICAgICAgICAgICBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgdGVhcl9kb3duX3RjKS0+QWRkVGVzdEluZm8odGVzdF9pbmZvKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gUmV0dXJucyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgorICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpIHsKKyAgICByZXR1cm4gcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XzsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIFNldHMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLgorICB2b2lkIHNldF9jdXJyZW50X3Rlc3RfY2FzZShUZXN0Q2FzZSogYV9jdXJyZW50X3Rlc3RfY2FzZSkgeworICAgIGN1cnJlbnRfdGVzdF9jYXNlXyA9IGFfY3VycmVudF90ZXN0X2Nhc2U7CisgIH0KKworICAvLyBTZXRzIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZy4gIElmCisgIC8vIGN1cnJlbnRfdGVzdF9pbmZvIGlzIE5VTEwsIHRoZSBhc3NlcnRpb24gcmVzdWx0cyB3aWxsIGJlIHN0b3JlZCBpbgorICAvLyBhZF9ob2NfdGVzdF9yZXN1bHRfLgorICB2b2lkIHNldF9jdXJyZW50X3Rlc3RfaW5mbyhUZXN0SW5mbyogYV9jdXJyZW50X3Rlc3RfaW5mbykgeworICAgIGN1cnJlbnRfdGVzdF9pbmZvXyA9IGFfY3VycmVudF90ZXN0X2luZm87CisgIH0KKworICAvLyBSZWdpc3RlcnMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgZGVmaW5lZCB1c2luZyBURVNUX1AgYW5kCisgIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QLCBjcmVhdGluZyByZWd1bGFyIHRlc3RzIGZvciBlYWNoIHRlc3QvcGFyYW1ldGVyCisgIC8vIGNvbWJpbmF0aW9uLiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlOyBpdCBoYXMgZ3VhcmRzCisgIC8vIHByb3RlY3RpbmcgZnJvbSByZWdpc3RlcmluZyB0aGUgdGVzdHMgbW9yZSB0aGVuIG9uY2UuICBJZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBkaXNhYmxlZCwgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMgaXMKKyAgLy8gcHJlc2VudCBidXQgZG9lcyBub3RoaW5nLgorICB2b2lkIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7CisKKyAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKKyAgLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMKKyAgLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoaXMgdGVzdCBpcyBjb25zaWRlcmVkIHRvIGJlIGZhaWxlZCwgYnV0CisgIC8vIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KKyAgYm9vbCBSdW5BbGxUZXN0cygpOworCisgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMsIGV4Y2VwdCB0aGUgYWQgaG9jIHRlc3RzLgorICB2b2lkIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCkgeworICAgIEZvckVhY2godGVzdF9jYXNlc18sIFRlc3RDYXNlOjpDbGVhclRlc3RDYXNlUmVzdWx0KTsKKyAgfQorCisgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhZC1ob2MgdGVzdCBhc3NlcnRpb25zLgorICB2b2lkIENsZWFyQWRIb2NUZXN0UmVzdWx0KCkgeworICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8uQ2xlYXIoKTsKKyAgfQorCisgIGVudW0gUmVhY3Rpb25Ub1NoYXJkaW5nIHsKKyAgICBIT05PUl9TSEFSRElOR19QUk9UT0NPTCwKKyAgICBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wKKyAgfTsKKworICAvLyBNYXRjaGVzIHRoZSBmdWxsIG5hbWUgb2YgZWFjaCB0ZXN0IGFnYWluc3QgdGhlIHVzZXItc3BlY2lmaWVkCisgIC8vIGZpbHRlciB0byBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgcnVuLCB0aGVuIHJlY29yZHMgdGhlCisgIC8vIHJlc3VsdCBpbiBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCisgIC8vIElmIHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMKKyAgLy8gYmFzZWQgb24gc2hhcmRpbmcgdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IEZpbHRlclRlc3RzKFJlYWN0aW9uVG9TaGFyZGluZyBzaGFyZF90ZXN0cyk7CisKKyAgLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLgorICB2b2lkIExpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCk7CisKKyAgY29uc3QgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF90ZXN0X2Nhc2VfOyB9CisgIFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQorICBjb25zdCBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0KKworICAvLyBSZXR1cm5zIHRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCisgIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KKyAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiYgZW52aXJvbm1lbnRzKCkgeyByZXR1cm4gZW52aXJvbm1lbnRzXzsgfQorCisgIC8vIEdldHRlcnMgZm9yIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorICBzdGQ6OnZlY3RvcjxUcmFjZUluZm8+JiBndGVzdF90cmFjZV9zdGFjaygpIHsKKyAgICByZXR1cm4gKihndGVzdF90cmFjZV9zdGFja18ucG9pbnRlcigpKTsKKyAgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxUcmFjZUluZm8+JiBndGVzdF90cmFjZV9zdGFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ3Rlc3RfdHJhY2Vfc3RhY2tfLmdldCgpOworICB9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICB2b2lkIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKSB7CisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18ucmVzZXQoUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSk7CisgIH0KKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0CisgIC8vIGZsYWcsIG9yIE5VTEwgaWYgdGhhdCBmbGFnIHdhcyBub3Qgc3BlY2lmaWVkLgorICAvLyBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCB0byBJbml0R29vZ2xlVGVzdC4KKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlYXRoIHRlc3QgZmFjdG9yeS4KKyAgaW50ZXJuYWw6OkRlYXRoVGVzdEZhY3RvcnkqIGRlYXRoX3Rlc3RfZmFjdG9yeSgpIHsKKyAgICByZXR1cm4gZGVhdGhfdGVzdF9mYWN0b3J5Xy5nZXQoKTsKKyAgfQorCisgIHZvaWQgU3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKTsKKworICBmcmllbmQgY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3Rvcnk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKKyAgLy8gVW5pdFRlc3RPcHRpb25zLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0LgorICB2b2lkIENvbmZpZ3VyZVhtbE91dHB1dCgpOworCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgdG8gYSBzb2NrZXQuCisgIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCisgIHZvaWQgQ29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCk7CisjZW5kaWYKKworICAvLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgorICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bworICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0CisgIC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCisgIC8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCisgIHZvaWQgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOworCisgIC8vIEdldHMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgaXRlcmF0aW9uLgorICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiByYW5kb21fc2VlZF87IH0KKworICAvLyBHZXRzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKCkgeyByZXR1cm4gJnJhbmRvbV87IH0KKworICAvLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCisgIC8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KKyAgdm9pZCBTaHVmZmxlVGVzdHMoKTsKKworICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdG8gdGhlaXIgb3JkZXIgYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgorICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50CisgIC8vIFVuaXRUZXN0OjpSdW4oKSBzdGFydHMuCisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGNhdGNoX2V4Y2VwdGlvbnNfOyB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjpVbml0VGVzdDsKKworICAvLyBVc2VkIGJ5IFVuaXRUZXN0OjpSdW4oKSB0byBjYXB0dXJlIHRoZSBzdGF0ZSBvZgorICAvLyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgaXQgc3RhcnRzLgorICB2b2lkIHNldF9jYXRjaF9leGNlcHRpb25zKGJvb2wgdmFsdWUpIHsgY2F0Y2hfZXhjZXB0aW9uc18gPSB2YWx1ZTsgfQorCisgIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGhhdCBvd25zIHRoaXMgaW1wbGVtZW50YXRpb24gb2JqZWN0LgorICBVbml0VGVzdCogY29uc3QgcGFyZW50XzsKKworICAvLyBUaGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpIHdhcworICAvLyBleGVjdXRlZC4KKyAgaW50ZXJuYWw6OkZpbGVQYXRoIG9yaWdpbmFsX3dvcmtpbmdfZGlyXzsKKworICAvLyBUaGUgZGVmYXVsdCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVycy4KKyAgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87CisgIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87CisKKyAgLy8gUG9pbnRzIHRvIChidXQgZG9lc24ndCBvd24pIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl87CisKKyAgLy8gUHJvdGVjdHMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy4KKyAgaW50ZXJuYWw6Ok11dGV4IGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4XzsKKworICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIHBlci10aHJlYWQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgaW50ZXJuYWw6OlRocmVhZExvY2FsPFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqPgorICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKworICAvLyBUaGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bgorICAvLyBiZWZvcmUvYWZ0ZXIgdGhlIHRlc3RzIGFyZSBydW4uCisgIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4gZW52aXJvbm1lbnRzXzsKKworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RDYXNlcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCisgIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4gdGVzdF9jYXNlc187CisKKyAgLy8gUHJvdmlkZXMgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgdGhlIHRlc3QgY2FzZSBsaXN0IHRvIGFsbG93CisgIC8vIGVhc3kgc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3QgY2FzZSBvcmRlci4gIFRoZSBpLXRoCisgIC8vIGVsZW1lbnQgb2YgdGhpcyB2ZWN0b3IgaXMgdGhlIGluZGV4IG9mIHRoZSBpLXRoIHRlc3QgY2FzZSBpbiB0aGUKKyAgLy8gc2h1ZmZsZWQgb3JkZXIuCisgIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9jYXNlX2luZGljZXNfOworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gUGFyYW1ldGVyaXplZFRlc3RSZWdpc3RyeSBvYmplY3QgdXNlZCB0byByZWdpc3RlciB2YWx1ZS1wYXJhbWV0ZXJpemVkCisgIC8vIHRlc3RzLgorICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XzsKKworICAvLyBJbmRpY2F0ZXMgd2hldGhlciBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIGhhcyBiZWVuIGNhbGxlZCBhbHJlYWR5LgorICBib29sIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF87CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgLy8gSW5kZXggb2YgdGhlIGxhc3QgZGVhdGggdGVzdCBjYXNlIHJlZ2lzdGVyZWQuICBJbml0aWFsbHkgLTEuCisgIGludCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV87CisKKyAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIFRlc3RDYXNlIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gIEl0CisgIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGNhc2UgYWZ0ZXIgYW5vdGhlci4KKyAgLy8gV2hlbiBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0CisgIC8vIHN0b3JlcyBhc3NlcnRpb24gcmVzdWx0cyBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLiAgSW5pdGlhbGx5IE5VTEwuCisgIFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZV87CisKKyAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIFRlc3RJbmZvIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gIEl0CisgIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGFmdGVyIGFub3RoZXIuICBXaGVuCisgIC8vIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3Qgc3RvcmVzCisgIC8vIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KKyAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvXzsKKworICAvLyBOb3JtYWxseSwgYSB1c2VyIG9ubHkgd3JpdGVzIGFzc2VydGlvbnMgaW5zaWRlIGEgVEVTVCBvciBURVNUX0YsCisgIC8vIG9yIGluc2lkZSBhIGZ1bmN0aW9uIGNhbGxlZCBieSBhIFRFU1Qgb3IgVEVTVF9GLiAgU2luY2UgR29vZ2xlCisgIC8vIFRlc3Qga2VlcHMgdHJhY2sgb2Ygd2hpY2ggdGVzdCBpcyBjdXJyZW50IHJ1bm5pbmcsIGl0IGNhbgorICAvLyBhc3NvY2lhdGUgc3VjaCBhbiBhc3NlcnRpb24gd2l0aCB0aGUgdGVzdCBpdCBiZWxvbmdzIHRvLgorICAvLworICAvLyBJZiBhbiBhc3NlcnRpb24gaXMgZW5jb3VudGVyZWQgd2hlbiBubyBURVNUIG9yIFRFU1RfRiBpcyBydW5uaW5nLAorICAvLyBHb29nbGUgVGVzdCBhdHRyaWJ1dGVzIHRoZSBhc3NlcnRpb24gcmVzdWx0IHRvIGFuIGltYWdpbmFyeSAiYWQgaG9jIgorICAvLyB0ZXN0LCBhbmQgcmVjb3JkcyB0aGUgcmVzdWx0IGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uCisgIFRlc3RSZXN1bHQgYWRfaG9jX3Rlc3RfcmVzdWx0XzsKKworICAvLyBUaGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMgaW5zaWRlCisgIC8vIEdvb2dsZSBUZXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzXzsKKworICAvLyBUaGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLiAgV2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIFVuaXRUZXN0CisgIC8vIG9iamVjdCBpcyBkZXN0cnVjdGVkLiAgQnkgZGVmYXVsdCwgYW4gT3NTdGFja1RyYWNlR2V0dGVyIGlzIHVzZWQsCisgIC8vIGJ1dCB0aGUgdXNlciBjYW4gc2V0IHRoaXMgZmllbGQgdG8gdXNlIGEgY3VzdG9tIGdldHRlciBpZiB0aGF0IGlzCisgIC8vIGRlc2lyZWQuCisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKKworICAvLyBUcnVlIGlmZiBQb3N0RmxhZ1BhcnNpbmdJbml0KCkgaGFzIGJlZW4gY2FsbGVkLgorICBib29sIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF87CisKKyAgLy8gVGhlIHJhbmRvbSBudW1iZXIgc2VlZCB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3QgcnVuLgorICBpbnQgcmFuZG9tX3NlZWRfOworCisgIC8vIE91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgaW50ZXJuYWw6OlJhbmRvbSByYW5kb21fOworCisgIC8vIEhvdyBsb25nIHRoZSB0ZXN0IHRvb2sgdG8gcnVuLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgLy8gVGhlIGRlY29tcG9zZWQgY29tcG9uZW50cyBvZiB0aGUgZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywKKyAgLy8gcGFyc2VkIHdoZW4gUlVOX0FMTF9URVNUUyBpcyBjYWxsZWQuCisgIGludGVybmFsOjpzY29wZWRfcHRyPEludGVybmFsUnVuRGVhdGhUZXN0RmxhZz4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ187CisgIGludGVybmFsOjpzY29wZWRfcHRyPGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5PiBkZWF0aF90ZXN0X2ZhY3RvcnlfOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIC8vIEEgcGVyLXRocmVhZCBzdGFjayBvZiB0cmFjZXMgY3JlYXRlZCBieSB0aGUgU0NPUEVEX1RSQUNFKCkgbWFjcm8uCisgIGludGVybmFsOjpUaHJlYWRMb2NhbDxzdGQ6OnZlY3RvcjxUcmFjZUluZm8+ID4gZ3Rlc3RfdHJhY2Vfc3RhY2tfOworCisgIC8vIFRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgUnVuQWxsVGVzdHMoKQorICAvLyBzdGFydHMuCisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdEltcGwpOworfTsgIC8vIGNsYXNzIFVuaXRUZXN0SW1wbAorCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWNjZXNzaW5nIHRoZSBnbG9iYWwgVW5pdFRlc3QKKy8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KK2lubGluZSBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCk7Cit9CisKKyNpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgdGhlIHNpbXBsZSByZWd1bGFyCisvLyBleHByZXNzaW9uIG1hdGNoZXIuCitHVEVTVF9BUElfIGJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNSZXBlYXQoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzVmFsaWRFc2NhcGUoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuLCBjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KTsKK0dURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjaCwgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndik7CitHVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBsYXN0IHN5c3RlbSBlcnJvciwgcmVnYXJkbGVzcyBvZiB0aGUKKy8vIHBsYXRmb3JtLgorR1RFU1RfQVBJXyBTdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBQcm92aWRlcyBsZWFrLXNhZmUgV2luZG93cyBrZXJuZWwgaGFuZGxlIG93bmVyc2hpcC4KK2NsYXNzIEF1dG9IYW5kbGUgeworIHB1YmxpYzoKKyAgQXV0b0hhbmRsZSgpIDogaGFuZGxlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSkge30KKyAgZXhwbGljaXQgQXV0b0hhbmRsZShIQU5ETEUgaGFuZGxlKSA6IGhhbmRsZV8oaGFuZGxlKSB7fQorCisgIH5BdXRvSGFuZGxlKCkgeyBSZXNldCgpOyB9CisKKyAgSEFORExFIEdldCgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KKyAgdm9pZCBSZXNldCgpIHsgUmVzZXQoSU5WQUxJRF9IQU5ETEVfVkFMVUUpOyB9CisgIHZvaWQgUmVzZXQoSEFORExFIGhhbmRsZSkgeworICAgIGlmIChoYW5kbGUgIT0gaGFuZGxlXykgeworICAgICAgaWYgKGhhbmRsZV8gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIDo6Q2xvc2VIYW5kbGUoaGFuZGxlXyk7CisgICAgICBoYW5kbGVfID0gaGFuZGxlOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgSEFORExFIGhhbmRsZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBdXRvSGFuZGxlKTsKK307CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIEF0dGVtcHRzIHRvIHBhcnNlIGEgc3RyaW5nIGludG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIHBvaW50ZWQgdG8gYnkgdGhlCisvLyBudW1iZXIgcGFyYW1ldGVyLiAgUmV0dXJucyB0cnVlIGlmIHRoYXQgaXMgcG9zc2libGUuCisvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZSBjYW4gdXNlCisvLyBpdCBoZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIEludGVnZXI+Citib29sIFBhcnNlTmF0dXJhbE51bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIEludGVnZXIqIG51bWJlcikgeworICAvLyBGYWlsIGZhc3QgaWYgdGhlIGdpdmVuIHN0cmluZyBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQ7CisgIC8vIHRoaXMgYnlwYXNzZXMgc3RydG9YWFgncyAib3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBwbHVzCisgIC8vIG9yIG1pbnVzIHNpZ24iIHNlbWFudGljcywgd2hpY2ggYXJlIHVuZGVzaXJhYmxlIGhlcmUuCisgIGlmIChzdHIuZW1wdHkoKSB8fCAhSXNEaWdpdChzdHJbMF0pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGVycm5vID0gMDsKKworICBjaGFyKiBlbmQ7CisgIC8vIEJpZ2dlc3RDb252ZXJ0aWJsZSBpcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHR5cGUgdGhhdCBzeXN0ZW0tcHJvdmlkZWQKKyAgLy8gc3RyaW5nLXRvLW51bWJlciBjb252ZXJzaW9uIHJvdXRpbmVzIGNhbiByZXR1cm4uCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhZGVmaW5lZChfX0dOVUNfXykKKworICAvLyBNU1ZDIGFuZCBDKysgQnVpbGRlciBkZWZpbmUgX19pbnQ2NCBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBsb25nIGxvbmcuCisgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBCaWdnZXN0Q29udmVydGlibGU7CisgIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBfc3RydG91aTY0KHN0ci5jX3N0cigpLCAmZW5kLCAxMCk7CisKKyMgZWxzZQorCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RDb252ZXJ0aWJsZTsgIC8vIE5PTElOVAorICBjb25zdCBCaWdnZXN0Q29udmVydGlibGUgcGFyc2VkID0gc3RydG91bGwoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhZGVmaW5lZChfX0dOVUNfXykKKworICBjb25zdCBib29sIHBhcnNlX3N1Y2Nlc3MgPSAqZW5kID09ICdcMCcgJiYgZXJybm8gPT0gMDsKKworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBDb252ZXJ0IHRoaXMgdG8gY29tcGlsZSB0aW1lIGFzc2VydGlvbiB3aGVuIGl0IGlzCisgIC8vIGF2YWlsYWJsZS4KKyAgR1RFU1RfQ0hFQ0tfKHNpemVvZihJbnRlZ2VyKSA8PSBzaXplb2YocGFyc2VkKSk7CisKKyAgY29uc3QgSW50ZWdlciByZXN1bHQgPSBzdGF0aWNfY2FzdDxJbnRlZ2VyPihwYXJzZWQpOworICBpZiAocGFyc2Vfc3VjY2VzcyAmJiBzdGF0aWNfY2FzdDxCaWdnZXN0Q29udmVydGlibGU+KHJlc3VsdCkgPT0gcGFyc2VkKSB7CisgICAgKm51bWJlciA9IHJlc3VsdDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRlc3RSZXN1bHQgY29udGFpbnMgc29tZSBwcml2YXRlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20KKy8vIEdvb2dsZSBUZXN0IHVzZXIgYnV0IGFyZSByZXF1aXJlZCBmb3IgdGVzdGluZy4gVGhpcyBjbGFzcyBhbGxvdyBvdXIgdGVzdHMKKy8vIHRvIGFjY2VzcyB0aGVtLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgc3VwcGxpZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93bgorLy8gY29uc3RydWN0cy4gRG8gbm90IHVzZSBpdCBpbiB1c2VyIHRlc3RzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK2NsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvciB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSkgeworICAgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cyhUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdCkgeworICAgIHRlc3RfcmVzdWx0LT5DbGVhclRlc3RQYXJ0UmVzdWx0cygpOworICB9CisKKyAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0PiYgdGVzdF9wYXJ0X3Jlc3VsdHMoCisgICAgICBjb25zdCBUZXN0UmVzdWx0JiB0ZXN0X3Jlc3VsdCkgeworICAgIHJldHVybiB0ZXN0X3Jlc3VsdC50ZXN0X3BhcnRfcmVzdWx0cygpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1wb3J0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1wb3J0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjBkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LXBvcnQuY2MKQEAgLTAsMCArMSw3NDYgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gRm9yIFRlcm1pbmF0ZVByb2Nlc3MoKQorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxpby5oPgorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19NQUMKKyMgaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyMgaW5jbHVkZSA8bWFjaC90YXNrLmg+CisjIGluY2x1ZGUgPG1hY2gvdm1fbWFwLmg+CisjZW5kaWYgIC8vIEdURVNUX09TX01BQworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBNU1ZDIGFuZCBDKytCdWlsZGVyIGRvIG5vdCBwcm92aWRlIGEgZGVmaW5pdGlvbiBvZiBTVERFUlJfRklMRU5PLgorY29uc3QgaW50IGtTdGRPdXRGaWxlbm8gPSAxOworY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSAyOworI2Vsc2UKK2NvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gU1RET1VUX0ZJTEVOTzsKK2NvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gU1RERVJSX0ZJTEVOTzsKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworI2lmIEdURVNUX09TX01BQworCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKKy8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIGNvbnN0IHRhc2tfdCB0YXNrID0gbWFjaF90YXNrX3NlbGYoKTsKKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCB0aHJlYWRfY291bnQ7CisgIHRocmVhZF9hY3RfYXJyYXlfdCB0aHJlYWRfbGlzdDsKKyAgY29uc3Qga2Vybl9yZXR1cm5fdCBzdGF0dXMgPSB0YXNrX3RocmVhZHModGFzaywgJnRocmVhZF9saXN0LCAmdGhyZWFkX2NvdW50KTsKKyAgaWYgKHN0YXR1cyA9PSBLRVJOX1NVQ0NFU1MpIHsKKyAgICAvLyB0YXNrX3RocmVhZHMgYWxsb2NhdGVzIHJlc291cmNlcyBpbiB0aHJlYWRfbGlzdCBhbmQgd2UgbmVlZCB0byBmcmVlIHRoZW0KKyAgICAvLyB0byBhdm9pZCBsZWFrcy4KKyAgICB2bV9kZWFsbG9jYXRlKHRhc2ssCisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZtX2FkZHJlc3NfdD4odGhyZWFkX2xpc3QpLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRocmVhZF90KSAqIHRocmVhZF9jb3VudCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4odGhyZWFkX2NvdW50KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisjZWxzZQorCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIC8vIFRoZXJlJ3Mgbm8gcG9ydGFibGUgd2F5IHRvIGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMsIHNvIHdlIGp1c3QKKyAgLy8gcmV0dXJuIDAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgorICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUKKworLy8gSW1wbGVtZW50cyBSRS4gIEN1cnJlbnRseSBvbmx5IG5lZWRlZCBmb3IgZGVhdGggdGVzdHMuCisKK1JFOjp+UkUoKSB7CisgIGlmIChpc192YWxpZF8pIHsKKyAgICAvLyByZWdmcmVlJ2luZyBhbiBpbnZhbGlkIHJlZ2V4IG1pZ2h0IGNyYXNoIGJlY2F1c2UgdGhlIGNvbnRlbnQKKyAgICAvLyBvZiB0aGUgcmVnZXggaXMgdW5kZWZpbmVkLiBTaW5jZSB0aGUgcmVnZXgncyBhcmUgZXNzZW50aWFsbHkKKyAgICAvLyB0aGUgc2FtZSwgb25lIGNhbm5vdCBiZSB2YWxpZCAob3IgaW52YWxpZCkgd2l0aG91dCB0aGUgb3RoZXIKKyAgICAvLyBiZWluZyBzbyB0b28uCisgICAgcmVnZnJlZSgmcGFydGlhbF9yZWdleF8pOworICAgIHJlZ2ZyZWUoJmZ1bGxfcmVnZXhfKTsKKyAgfQorICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCitib29sIFJFOjpGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgaWYgKCFyZS5pc192YWxpZF8pIHJldHVybiBmYWxzZTsKKworICByZWdtYXRjaF90IG1hdGNoOworICByZXR1cm4gcmVnZXhlYygmcmUuZnVsbF9yZWdleF8sIHN0ciwgMSwgJm1hdGNoLCAwKSA9PSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0cgorLy8gKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4KK2Jvb2wgUkU6OlBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOworCisgIHJlZ21hdGNoX3QgbWF0Y2g7CisgIHJldHVybiByZWdleGVjKCZyZS5wYXJ0aWFsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Cit9CisKKy8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KK3ZvaWQgUkU6OkluaXQoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKKworICAvLyBSZXNlcnZlcyBlbm91Z2ggYnl0ZXMgdG8gaG9sZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGEKKyAgLy8gZnVsbCBtYXRjaC4KKyAgY29uc3Qgc2l6ZV90IGZ1bGxfcmVnZXhfbGVuID0gc3RybGVuKHJlZ2V4KSArIDEwOworICBjaGFyKiBjb25zdCBmdWxsX3BhdHRlcm4gPSBuZXcgY2hhcltmdWxsX3JlZ2V4X2xlbl07CisKKyAgc25wcmludGYoZnVsbF9wYXR0ZXJuLCBmdWxsX3JlZ2V4X2xlbiwgIl4oJXMpJCIsIHJlZ2V4KTsKKyAgaXNfdmFsaWRfID0gcmVnY29tcCgmZnVsbF9yZWdleF8sIGZ1bGxfcGF0dGVybiwgUkVHX0VYVEVOREVEKSA9PSAwOworICAvLyBXZSB3YW50IHRvIGNhbGwgcmVnY29tcCgmcGFydGlhbF9yZWdleF8sIC4uLikgZXZlbiBpZiB0aGUKKyAgLy8gcHJldmlvdXMgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlLiAgT3RoZXJ3aXNlIHBhcnRpYWxfcmVnZXhfIG1heQorICAvLyBub3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgY2FuIG1heSBjYXVzZSB0cm91YmxlIHdoZW4gaXQncworICAvLyBmcmVlZC4KKyAgLy8KKyAgLy8gU29tZSBpbXBsZW1lbnRhdGlvbiBvZiBQT1NJWCByZWdleCAoZS5nLiBvbiBhdCBsZWFzdCBzb21lCisgIC8vIHZlcnNpb25zIG9mIEN5Z3dpbikgZG9lc24ndCBhY2NlcHQgdGhlIGVtcHR5IHN0cmluZyBhcyBhIHZhbGlkCisgIC8vIHJlZ2V4LiAgV2UgY2hhbmdlIGl0IHRvIGFuIGVxdWl2YWxlbnQgZm9ybSAiKCkiIHRvIGJlIHNhZmUuCisgIGlmIChpc192YWxpZF8pIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBwYXJ0aWFsX3JlZ2V4ID0gKCpyZWdleCA9PSAnXDAnKSA/ICIoKSIgOiByZWdleDsKKyAgICBpc192YWxpZF8gPSByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgcGFydGlhbF9yZWdleCwgUkVHX0VYVEVOREVEKSA9PSAwOworICB9CisgIEVYUEVDVF9UUlVFKGlzX3ZhbGlkXykKKyAgICAgIDw8ICJSZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4CisgICAgICA8PCAiXCIgaXMgbm90IGEgdmFsaWQgUE9TSVggRXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uLiI7CisKKyAgZGVsZXRlW10gZnVsbF9wYXR0ZXJuOworfQorCisjZWxpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBSZXR1cm5zIHRydWUgaWZmIGNoIGFwcGVhcnMgYW55d2hlcmUgaW4gc3RyIChleGNsdWRpbmcgdGhlCisvLyB0ZXJtaW5hdGluZyAnXDAnIGNoYXJhY3RlcikuCitib29sIElzSW5TZXQoY2hhciBjaCwgY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiBjaCAhPSAnXDAnICYmIHN0cmNocihzdHIsIGNoKSAhPSBOVUxMOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIGNoIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGNsYXNzaWZpY2F0aW9uLiAgVW5saWtlCisvLyBzaW1pbGFyIGZ1bmN0aW9ucyBpbiA8Y3R5cGUuaD4sIHRoZXNlIGFyZW4ndCBhZmZlY3RlZCBieSB0aGUKKy8vIGN1cnJlbnQgbG9jYWxlLgorYm9vbCBJc0FzY2lpRGlnaXQoY2hhciBjaCkgeyByZXR1cm4gJzAnIDw9IGNoICYmIGNoIDw9ICc5JzsgfQorYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCkgeworICByZXR1cm4gSXNJblNldChjaCwgIl4tIVwiIyQlJicoKSorLC4vOjs8PT4/QFtcXF1fYHt8fX4iKTsKK30KK2Jvb2wgSXNSZXBlYXQoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIj8qKyIpOyB9Citib29sIElzQXNjaWlXaGl0ZVNwYWNlKGNoYXIgY2gpIHsgcmV0dXJuIElzSW5TZXQoY2gsICIgXGZcblxyXHRcdiIpOyB9Citib29sIElzQXNjaWlXb3JkQ2hhcihjaGFyIGNoKSB7CisgIHJldHVybiAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpIHx8CisgICAgICAoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwgY2ggPT0gJ18nOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmICJcXGMiIGlzIGEgc3VwcG9ydGVkIGVzY2FwZSBzZXF1ZW5jZS4KK2Jvb2wgSXNWYWxpZEVzY2FwZShjaGFyIGMpIHsKKyAgcmV0dXJuIChJc0FzY2lpUHVuY3QoYykgfHwgSXNJblNldChjLCAiZERmbnJzU3R2d1ciKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGF0b20gKHNwZWNpZmllZCBieSBlc2NhcGVkIGFuZCBwYXR0ZXJuKQorLy8gbWF0Y2hlcyBjaC4gIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIHRoZSBhdG9tIGlzIGludmFsaWQuCitib29sIEF0b21NYXRjaGVzQ2hhcihib29sIGVzY2FwZWQsIGNoYXIgcGF0dGVybl9jaGFyLCBjaGFyIGNoKSB7CisgIGlmIChlc2NhcGVkKSB7ICAvLyAiXFxwIiB3aGVyZSBwIGlzIHBhdHRlcm5fY2hhci4KKyAgICBzd2l0Y2ggKHBhdHRlcm5fY2hhcikgeworICAgICAgY2FzZSAnZCc6IHJldHVybiBJc0FzY2lpRGlnaXQoY2gpOworICAgICAgY2FzZSAnRCc6IHJldHVybiAhSXNBc2NpaURpZ2l0KGNoKTsKKyAgICAgIGNhc2UgJ2YnOiByZXR1cm4gY2ggPT0gJ1xmJzsKKyAgICAgIGNhc2UgJ24nOiByZXR1cm4gY2ggPT0gJ1xuJzsKKyAgICAgIGNhc2UgJ3InOiByZXR1cm4gY2ggPT0gJ1xyJzsKKyAgICAgIGNhc2UgJ3MnOiByZXR1cm4gSXNBc2NpaVdoaXRlU3BhY2UoY2gpOworICAgICAgY2FzZSAnUyc6IHJldHVybiAhSXNBc2NpaVdoaXRlU3BhY2UoY2gpOworICAgICAgY2FzZSAndCc6IHJldHVybiBjaCA9PSAnXHQnOworICAgICAgY2FzZSAndic6IHJldHVybiBjaCA9PSAnXHYnOworICAgICAgY2FzZSAndyc6IHJldHVybiBJc0FzY2lpV29yZENoYXIoY2gpOworICAgICAgY2FzZSAnVyc6IHJldHVybiAhSXNBc2NpaVdvcmRDaGFyKGNoKTsKKyAgICB9CisgICAgcmV0dXJuIElzQXNjaWlQdW5jdChwYXR0ZXJuX2NoYXIpICYmIHBhdHRlcm5fY2hhciA9PSBjaDsKKyAgfQorCisgIHJldHVybiAocGF0dGVybl9jaGFyID09ICcuJyAmJiBjaCAhPSAnXG4nKSB8fCBwYXR0ZXJuX2NoYXIgPT0gY2g7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IFZhbGlkYXRlUmVnZXgoKSB0byBmb3JtYXQgZXJyb3IgbWVzc2FnZXMuCitTdHJpbmcgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihjb25zdCBjaGFyKiByZWdleCwgaW50IGluZGV4KSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8ICJTeW50YXggZXJyb3IgYXQgaW5kZXggIiA8PCBpbmRleAorICAgICAgICAgIDw8ICIgaW4gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXggPDwgIlwiOiAiKS5HZXRTdHJpbmcoKTsKK30KKworLy8gR2VuZXJhdGVzIG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiByZWdleCBpcyBpbnZhbGlkOworLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KK2Jvb2wgVmFsaWRhdGVSZWdleChjb25zdCBjaGFyKiByZWdleCkgeworICBpZiAocmVnZXggPT0gTlVMTCkgeworICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBmaXggdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGluIHRoZQorICAgIC8vIGFzc2VydGlvbiBmYWlsdXJlcyB0byBtYXRjaCB3aGVyZSB0aGUgcmVnZXggaXMgdXNlZCBpbiB1c2VyCisgICAgLy8gY29kZS4KKyAgICBBRERfRkFJTFVSRSgpIDw8ICJOVUxMIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24uIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzX3ZhbGlkID0gdHJ1ZTsKKworICAvLyBUcnVlIGlmZiA/LCAqLCBvciArIGNhbiBmb2xsb3cgdGhlIHByZXZpb3VzIGF0b20uCisgIGJvb2wgcHJldl9yZXBlYXRhYmxlID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyByZWdleFtpXTsgaSsrKSB7CisgICAgaWYgKHJlZ2V4W2ldID09ICdcXCcpIHsgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZQorICAgICAgaSsrOworICAgICAgaWYgKHJlZ2V4W2ldID09ICdcMCcpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoIUlzVmFsaWRFc2NhcGUocmVnZXhbaV0pKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFwiXFwiIDw8IHJlZ2V4W2ldIDw8ICJcIi4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfQorICAgICAgcHJldl9yZXBlYXRhYmxlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeyAgLy8gTm90IGFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgIGNvbnN0IGNoYXIgY2ggPSByZWdleFtpXTsKKworICAgICAgaWYgKGNoID09ICdeJyAmJiBpID4gMCkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZy4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjaCA9PSAnJCcgJiYgcmVnZXhbaSArIDFdICE9ICdcMCcpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoSXNJblNldChjaCwgIigpW117fXwiKSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGlzIHVuc3VwcG9ydGVkLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKElzUmVwZWF0KGNoKSAmJiAhcHJldl9yZXBlYXRhYmxlKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbi4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfQorCisgICAgICBwcmV2X3JlcGVhdGFibGUgPSAhSXNJblNldChjaCwgIl4kPyorIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGlzX3ZhbGlkOworfQorCisvLyBNYXRjaGVzIGEgcmVwZWF0ZWQgcmVnZXggYXRvbSBmb2xsb3dlZCBieSBhIHZhbGlkIHNpbXBsZSByZWd1bGFyCisvLyBleHByZXNzaW9uLiAgVGhlIHJlZ2V4IGF0b20gaXMgZGVmaW5lZCBhcyBjIGlmIGVzY2FwZWQgaXMgZmFsc2UsCisvLyBvciBcYyBvdGhlcndpc2UuICByZXBlYXQgaXMgdGhlIHJlcGV0aXRpb24gbWV0YSBjaGFyYWN0ZXIgKD8sICosCisvLyBvciArKS4gIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgc3RyIGNvbnRhaW5zIHRvbyBtYW55CisvLyBjaGFyYWN0ZXJzIHRvIGJlIGluZGV4YWJsZSBieSBzaXplX3QsIGluIHdoaWNoIGNhc2UgdGhlIHRlc3Qgd2lsbAorLy8gcHJvYmFibHkgdGltZSBvdXQgYW55d2F5LiAgV2UgYXJlIGZpbmUgd2l0aCB0aGlzIGxpbWl0YXRpb24gYXMKKy8vIHN0ZDo6c3RyaW5nIGhhcyBpdCB0b28uCitib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsCisgICAgY29uc3QgY2hhciogc3RyKSB7CisgIGNvbnN0IHNpemVfdCBtaW5fY291bnQgPSAocmVwZWF0ID09ICcrJykgPyAxIDogMDsKKyAgY29uc3Qgc2l6ZV90IG1heF9jb3VudCA9IChyZXBlYXQgPT0gJz8nKSA/IDEgOgorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PigtMSkgLSAxOworICAvLyBXZSBjYW5ub3QgY2FsbCBudW1lcmljX2xpbWl0czo6bWF4KCkgYXMgaXQgY29uZmxpY3RzIHdpdGggdGhlCisgIC8vIG1heCgpIG1hY3JvIG9uIFdpbmRvd3MuCisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gbWF4X2NvdW50OyArK2kpIHsKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGF0b20gbWF0Y2hlcyBlYWNoIG9mIHRoZSBmaXJzdCBpIGNoYXJhY3RlcnMgaW4gc3RyLgorICAgIGlmIChpID49IG1pbl9jb3VudCAmJiBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4LCBzdHIgKyBpKSkgeworICAgICAgLy8gV2UgaGF2ZSBlbm91Z2ggbWF0Y2hlcyBhdCB0aGUgaGVhZCwgYW5kIHRoZSB0YWlsIG1hdGNoZXMgdG9vLgorICAgICAgLy8gU2luY2Ugd2Ugb25seSBjYXJlIGFib3V0ICp3aGV0aGVyKiB0aGUgcGF0dGVybiBtYXRjaGVzIHN0cgorICAgICAgLy8gKGFzIG9wcG9zZWQgdG8gKmhvdyogaXQgbWF0Y2hlcyksIHRoZXJlIGlzIG5vIG5lZWQgdG8gZmluZCBhCisgICAgICAvLyBncmVlZHkgbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHN0cltpXSA9PSAnXDAnIHx8ICFBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgYywgc3RyW2ldKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBzdHIuICByZWdleCBtdXN0IGJlIGEKKy8vIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIG5vdCBzdGFydCB3aXRoICJeIiwgb3IgdGhlCisvLyByZXN1bHQgaXMgdW5kZWZpbmVkLgorYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKCpyZWdleCA9PSAnXDAnKSAgLy8gQW4gZW1wdHkgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBhbnl0aGluZy4KKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyAiJCIgb25seSBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcuICBOb3RlIHRoYXQgcmVnZXggYmVpbmcKKyAgLy8gdmFsaWQgZ3VhcmFudGVlcyB0aGF0IHRoZXJlJ3Mgbm90aGluZyBhZnRlciAiJCIgaW4gaXQuCisgIGlmICgqcmVnZXggPT0gJyQnKQorICAgIHJldHVybiAqc3RyID09ICdcMCc7CisKKyAgLy8gSXMgdGhlIGZpcnN0IHRoaW5nIGluIHJlZ2V4IGFuIGVzY2FwZSBzZXF1ZW5jZT8KKyAgY29uc3QgYm9vbCBlc2NhcGVkID0gKnJlZ2V4ID09ICdcXCc7CisgIGlmIChlc2NhcGVkKQorICAgICsrcmVnZXg7CisgIGlmIChJc1JlcGVhdChyZWdleFsxXSkpIHsKKyAgICAvLyBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgpIGNhbGxzIE1hdGNoUmVnZXhBdEhlYWQoKSwgc28KKyAgICAvLyBoZXJlJ3MgYW4gaW5kaXJlY3QgcmVjdXJzaW9uLiAgSXQgdGVybWluYXRlcyBhcyB0aGUgcmVnZXggZ2V0cworICAgIC8vIHNob3J0ZXIgaW4gZWFjaCByZWN1cnNpb24uCisgICAgcmV0dXJuIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgICAgICBlc2NhcGVkLCByZWdleFswXSwgcmVnZXhbMV0sIHJlZ2V4ICsgMiwgc3RyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyByZWdleCBpc24ndCBlbXB0eSwgaXNuJ3QgIiQiLCBhbmQgZG9lc24ndCBzdGFydCB3aXRoIGEKKyAgICAvLyByZXBldGl0aW9uLiAgV2UgbWF0Y2ggdGhlIGZpcnN0IGF0b20gb2YgcmVnZXggd2l0aCB0aGUgZmlyc3QKKyAgICAvLyBjaGFyYWN0ZXIgb2Ygc3RyIGFuZCByZWN1cnNlLgorICAgIHJldHVybiAoKnN0ciAhPSAnXDAnKSAmJiBBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgKnJlZ2V4LCAqc3RyKSAmJgorICAgICAgICBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWdleCBtYXRjaGVzIGFueSBzdWJzdHJpbmcgb2Ygc3RyLiAgcmVnZXggbXVzdCBiZQorLy8gYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLCBvciB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKy8vCisvLyBUaGUgYWxnb3JpdGhtIGlzIHJlY3Vyc2l2ZSwgYnV0IHRoZSByZWN1cnNpb24gZGVwdGggZG9lc24ndCBleGNlZWQKKy8vIHRoZSByZWdleCBsZW5ndGgsIHNvIHdlIHdvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgcnVubmluZyBvdXQgb2YKKy8vIHN0YWNrIHNwYWNlIG5vcm1hbGx5LiAgSW4gcmFyZSBjYXNlcyB0aGUgdGltZSBjb21wbGV4aXR5IGNhbiBiZQorLy8gZXhwb25lbnRpYWwgd2l0aCByZXNwZWN0IHRvIHRoZSByZWdleCBsZW5ndGggKyB0aGUgc3RyaW5nIGxlbmd0aCwKKy8vIGJ1dCB1c3VhbGx5IGl0J3MgbXVzdCBmYXN0ZXIgKG9mdGVuIGNsb3NlIHRvIGxpbmVhcikuCitib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7CisgIGlmIChyZWdleCA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKnJlZ2V4ID09ICdeJykKKyAgICByZXR1cm4gTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0cik7CisKKyAgLy8gQSBzdWNjZXNzZnVsIG1hdGNoIGNhbiBiZSBhbnl3aGVyZSBpbiBzdHIuCisgIGRvIHsKKyAgICBpZiAoTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9IHdoaWxlICgqc3RyKysgIT0gJ1wwJyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gSW1wbGVtZW50cyB0aGUgUkUgY2xhc3MuCisKK1JFOjp+UkUoKSB7CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKKyAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihmdWxsX3BhdHRlcm5fKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCitib29sIFJFOjpGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUuZnVsbF9wYXR0ZXJuXywgc3RyKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKKy8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCitib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUucGF0dGVybl8sIHN0cik7Cit9CisKKy8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KK3ZvaWQgUkU6OkluaXQoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgcGF0dGVybl8gPSBmdWxsX3BhdHRlcm5fID0gTlVMTDsKKyAgaWYgKHJlZ2V4ICE9IE5VTEwpIHsKKyAgICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOworICB9CisKKyAgaXNfdmFsaWRfID0gVmFsaWRhdGVSZWdleChyZWdleCk7CisgIGlmICghaXNfdmFsaWRfKSB7CisgICAgLy8gTm8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0dGVybiB3aGVuIHRoZSByZWdleCBpcyBpbnZhbGlkLgorICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4ocmVnZXgpOworICAvLyBSZXNlcnZlcyBlbm91Z2ggYnl0ZXMgdG8gaG9sZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGEKKyAgLy8gZnVsbCBtYXRjaDogd2UgbmVlZCBzcGFjZSB0byBwcmVwZW5kIGEgJ14nLCBhcHBlbmQgYSAnJCcsIGFuZAorICAvLyB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3aXRoICdcMCcuCisgIGNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihtYWxsb2MobGVuICsgMykpOworICBmdWxsX3BhdHRlcm5fID0gYnVmZmVyOworCisgIGlmICgqcmVnZXggIT0gJ14nKQorICAgICpidWZmZXIrKyA9ICdeJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBzdGFydHMgd2l0aCAnXicuCisKKyAgLy8gV2UgZG9uJ3QgdXNlIHNucHJpbnRmIG9yIHN0cm5jcHksIGFzIHRoZXkgdHJpZ2dlciBhIHdhcm5pbmcgd2hlbgorICAvLyBjb21waWxlZCB3aXRoIFZDKysgOC4wLgorICBtZW1jcHkoYnVmZmVyLCByZWdleCwgbGVuKTsKKyAgYnVmZmVyICs9IGxlbjsKKworICBpZiAobGVuID09IDAgfHwgcmVnZXhbbGVuIC0gMV0gIT0gJyQnKQorICAgICpidWZmZXIrKyA9ICckJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBlbmRzIHdpdGggJyQnLgorCisgICpidWZmZXIgPSAnXDAnOworfQorCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfUE9TSVhfUkUKKworY29uc3QgY2hhciBrVW5rbm93bkZpbGVbXSA9ICJ1bmtub3duIGZpbGUiOworCisvLyBGb3JtYXRzIGEgc291cmNlIGZpbGUgcGF0aCBhbmQgYSBsaW5lIG51bWJlciBhcyB0aGV5IHdvdWxkIGFwcGVhcgorLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLgorR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUgPSBmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlOworCisgIGlmIChsaW5lIDwgMCkgeworICAgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXM6IiwgZmlsZV9uYW1lKS5jX3N0cigpOworICB9CisjaWZkZWYgX01TQ19WRVIKKyAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlcyglZCk6IiwgZmlsZV9uYW1lLCBsaW5lKS5jX3N0cigpOworI2Vsc2UKKyAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlczolZDoiLCBmaWxlX25hbWUsIGxpbmUpLmNfc3RyKCk7CisjZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgorLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bworLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgorLy8gTm90ZSB0aGF0IEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oKSBkb2VzIE5PVCBhcHBlbmQgY29sb24KKy8vIHRvIHRoZSBmaWxlIGxvY2F0aW9uIGl0IHByb2R1Y2VzLCB1bmxpa2UgRm9ybWF0RmlsZUxvY2F0aW9uKCkuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUgPSBmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlOworCisgIGlmIChsaW5lIDwgMCkKKyAgICByZXR1cm4gZmlsZV9uYW1lOworICBlbHNlCisgICAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlczolZCIsIGZpbGVfbmFtZSwgbGluZSkuY19zdHIoKTsKK30KKworCitHVGVzdExvZzo6R1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCisgICAgOiBzZXZlcml0eV8oc2V2ZXJpdHkpIHsKKyAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0KKyAgICAgIHNldmVyaXR5ID09IEdURVNUX0lORk8gPyAgICAiWyAgSU5GTyBdIiA6CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9XQVJOSU5HID8gIltXQVJOSU5HXSIgOgorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7CisgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsIDw8IG1hcmtlciA8PCAiICIKKyAgICAgICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCkgPDwgIjogIjsKK30KKworLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCitHVGVzdExvZzo6fkdUZXN0TG9nKCkgeworICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbDsKKyAgaWYgKHNldmVyaXR5XyA9PSBHVEVTVF9GQVRBTCkgeworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisvLyBEaXNhYmxlIE1pY3Jvc29mdCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgUE9TSVggZnVuY3Rpb25zIGNhbGxlZCBmcm9tCisvLyB0aGlzIGNsYXNzIChjcmVhdCwgZHVwLCBkdXAyLCBhbmQgY2xvc2UpCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDk5NikKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gT2JqZWN0IHRoYXQgY2FwdHVyZXMgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCitjbGFzcyBDYXB0dXJlZFN0cmVhbSB7CisgcHVibGljOgorICAvLyBUaGUgY3RvciByZWRpcmVjdHMgdGhlIHN0cmVhbSB0byBhIHRlbXBvcmFyeSBmaWxlLgorICBDYXB0dXJlZFN0cmVhbShpbnQgZmQpIDogZmRfKGZkKSwgdW5jYXB0dXJlZF9mZF8oZHVwKGZkKSkgeworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyAgICBjaGFyIHRlbXBfZGlyX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCisgICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKKworICAgIDo6R2V0VGVtcFBhdGhBKHNpemVvZih0ZW1wX2Rpcl9wYXRoKSwgdGVtcF9kaXJfcGF0aCk7CisgICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdF9yZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBHZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7CisgICAgR1RFU1RfQ0hFQ0tfKHN1Y2Nlc3MgIT0gMCkKKyAgICAgICAgPDwgIlVuYWJsZSB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiAiIDw8IHRlbXBfZGlyX3BhdGg7CisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKKyAgICBHVEVTVF9DSEVDS18oY2FwdHVyZWRfZmQgIT0gLTEpIDw8ICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZW1wX2ZpbGVfcGF0aDsKKyAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsKKyMgZWxzZQorICAgIC8vIFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSB0ZXN0IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlCisgICAgLy8gY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIC90bXAKKyAgICAvLyBkaXJlY3RvcnkgaW5zdGVhZC4KKyAgICBjaGFyIG5hbWVfdGVtcGxhdGVbXSA9ICIvdG1wL2NhcHR1cmVkX3N0cmVhbS5YWFhYWFgiOworICAgIGNvbnN0IGludCBjYXB0dXJlZF9mZCA9IG1rc3RlbXAobmFtZV90ZW1wbGF0ZSk7CisgICAgZmlsZW5hbWVfID0gbmFtZV90ZW1wbGF0ZTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICBmZmx1c2goTlVMTCk7CisgICAgZHVwMihjYXB0dXJlZF9mZCwgZmRfKTsKKyAgICBjbG9zZShjYXB0dXJlZF9mZCk7CisgIH0KKworICB+Q2FwdHVyZWRTdHJlYW0oKSB7CisgICAgcmVtb3ZlKGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgfQorCisgIFN0cmluZyBHZXRDYXB0dXJlZFN0cmluZygpIHsKKyAgICBpZiAodW5jYXB0dXJlZF9mZF8gIT0gLTEpIHsKKyAgICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCBzdHJlYW0uCisgICAgICBmZmx1c2goTlVMTCk7CisgICAgICBkdXAyKHVuY2FwdHVyZWRfZmRfLCBmZF8pOworICAgICAgY2xvc2UodW5jYXB0dXJlZF9mZF8pOworICAgICAgdW5jYXB0dXJlZF9mZF8gPSAtMTsKKyAgICB9CisKKyAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKGZpbGVuYW1lXy5jX3N0cigpLCAiciIpOworICAgIGNvbnN0IFN0cmluZyBjb250ZW50ID0gUmVhZEVudGlyZUZpbGUoZmlsZSk7CisgICAgcG9zaXg6OkZDbG9zZShmaWxlKTsKKyAgICByZXR1cm4gY29udGVudDsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgZmlsZSBhcyBhIFN0cmluZy4KKyAgc3RhdGljIFN0cmluZyBSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKTsKKworICAvLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgorICBzdGF0aWMgc2l6ZV90IEdldEZpbGVTaXplKEZJTEUqIGZpbGUpOworCisgIGNvbnN0IGludCBmZF87ICAvLyBBIHN0cmVhbSB0byBjYXB0dXJlLgorICBpbnQgdW5jYXB0dXJlZF9mZF87CisgIC8vIE5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGhvbGRpbmcgdGhlIHN0ZGVyciBvdXRwdXQuCisgIDo6c3RkOjpzdHJpbmcgZmlsZW5hbWVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQ2FwdHVyZWRTdHJlYW0pOworfTsKKworLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4KK3NpemVfdCBDYXB0dXJlZFN0cmVhbTo6R2V0RmlsZVNpemUoRklMRSogZmlsZSkgeworICBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGZ0ZWxsKGZpbGUpKTsKK30KKworLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgZmlsZSBhcyBhIHN0cmluZy4KK1N0cmluZyBDYXB0dXJlZFN0cmVhbTo6UmVhZEVudGlyZUZpbGUoRklMRSogZmlsZSkgeworICBjb25zdCBzaXplX3QgZmlsZV9zaXplID0gR2V0RmlsZVNpemUoZmlsZSk7CisgIGNoYXIqIGNvbnN0IGJ1ZmZlciA9IG5ldyBjaGFyW2ZpbGVfc2l6ZV07CisKKyAgc2l6ZV90IGJ5dGVzX2xhc3RfcmVhZCA9IDA7ICAvLyAjIG9mIGJ5dGVzIHJlYWQgaW4gdGhlIGxhc3QgZnJlYWQoKQorICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7ICAgICAgIC8vICMgb2YgYnl0ZXMgcmVhZCBzbyBmYXIKKworICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CisKKyAgLy8gS2VlcHMgcmVhZGluZyB0aGUgZmlsZSB1bnRpbCB3ZSBjYW5ub3QgcmVhZCBmdXJ0aGVyIG9yIHRoZQorICAvLyBwcmUtZGV0ZXJtaW5lZCBmaWxlIHNpemUgaXMgcmVhY2hlZC4KKyAgZG8geworICAgIGJ5dGVzX2xhc3RfcmVhZCA9IGZyZWFkKGJ1ZmZlcitieXRlc19yZWFkLCAxLCBmaWxlX3NpemUtYnl0ZXNfcmVhZCwgZmlsZSk7CisgICAgYnl0ZXNfcmVhZCArPSBieXRlc19sYXN0X3JlYWQ7CisgIH0gd2hpbGUgKGJ5dGVzX2xhc3RfcmVhZCA+IDAgJiYgYnl0ZXNfcmVhZCA8IGZpbGVfc2l6ZSk7CisKKyAgY29uc3QgU3RyaW5nIGNvbnRlbnQoYnVmZmVyLCBieXRlc19yZWFkKTsKKyAgZGVsZXRlW10gYnVmZmVyOworCisgIHJldHVybiBjb250ZW50OworfQorCisjIGlmZGVmIF9NU0NfVkVSCisjICBwcmFnbWEgd2FybmluZyhwb3ApCisjIGVuZGlmICAvLyBfTVNDX1ZFUgorCitzdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3RkZXJyID0gTlVMTDsKK3N0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRvdXQgPSBOVUxMOworCisvLyBTdGFydHMgY2FwdHVyaW5nIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLgordm9pZCBDYXB0dXJlU3RyZWFtKGludCBmZCwgY29uc3QgY2hhciogc3RyZWFtX25hbWUsIENhcHR1cmVkU3RyZWFtKiogc3RyZWFtKSB7CisgIGlmICgqc3RyZWFtICE9IE5VTEwpIHsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiT25seSBvbmUgIiA8PCBzdHJlYW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2FwdHVyZXIgY2FuIGV4aXN0IGF0IGEgdGltZS4iOworICB9CisgICpzdHJlYW0gPSBuZXcgQ2FwdHVyZWRTdHJlYW0oZmQpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgdGhlIG91dHB1dCBzdHJlYW0gYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK1N0cmluZyBHZXRDYXB0dXJlZFN0cmVhbShDYXB0dXJlZFN0cmVhbSoqIGNhcHR1cmVkX3N0cmVhbSkgeworICBjb25zdCBTdHJpbmcgY29udGVudCA9ICgqY2FwdHVyZWRfc3RyZWFtKS0+R2V0Q2FwdHVyZWRTdHJpbmcoKTsKKworICBkZWxldGUgKmNhcHR1cmVkX3N0cmVhbTsKKyAgKmNhcHR1cmVkX3N0cmVhbSA9IE5VTEw7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0Lgordm9pZCBDYXB0dXJlU3Rkb3V0KCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRPdXRGaWxlbm8sICJzdGRvdXQiLCAmZ19jYXB0dXJlZF9zdGRvdXQpOworfQorCisvLyBTdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KK3ZvaWQgQ2FwdHVyZVN0ZGVycigpIHsKKyAgQ2FwdHVyZVN0cmVhbShrU3RkRXJyRmlsZW5vLCAic3RkZXJyIiwgJmdfY2FwdHVyZWRfc3RkZXJyKTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorU3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCkgeyByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3Rkb3V0KTsgfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitTdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKSB7IHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRlcnIpOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gQSBjb3B5IG9mIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgU2V0IGJ5IEluaXRHb29nbGVUZXN0KCkuCis6OnN0ZDo6dmVjdG9yPFN0cmluZz4gZ19hcmd2czsKKworLy8gUmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MuCitjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cmluZz4mIEdldEFyZ3ZzKCkgeyByZXR1cm4gZ19hcmd2czsgfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorbmFtZXNwYWNlIHBvc2l4IHsKK3ZvaWQgQWJvcnQoKSB7CisgIERlYnVnQnJlYWsoKTsKKyAgVGVybWluYXRlUHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAxKTsKK30KK30gIC8vIG5hbWVzcGFjZSBwb3NpeAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8gZ2l2ZW4gZmxhZy4gIEZvciBleGFtcGxlLCBGbGFnVG9FbnZWYXIoImZvbyIpIHdpbGwgcmV0dXJuCisvLyAiR1RFU1RfRk9PIiBpbiB0aGUgb3Blbi1zb3VyY2UgdmVyc2lvbi4KK3N0YXRpYyBTdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgY29uc3QgU3RyaW5nIGZ1bGxfZmxhZyA9CisgICAgICAoTWVzc2FnZSgpIDw8IEdURVNUX0ZMQUdfUFJFRklYXyA8PCBmbGFnKS5HZXRTdHJpbmcoKTsKKworICBNZXNzYWdlIGVudl92YXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGZ1bGxfZmxhZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgZW52X3ZhciA8PCBUb1VwcGVyKGZ1bGxfZmxhZy5jX3N0cigpW2ldKTsKKyAgfQorCisgIHJldHVybiBlbnZfdmFyLkdldFN0cmluZygpOworfQorCisvLyBQYXJzZXMgJ3N0cicgZm9yIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLiAgSWYgc3VjY2Vzc2Z1bCwgd3JpdGVzCisvLyB0aGUgcmVzdWx0IHRvICp2YWx1ZSBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICp2YWx1ZQorLy8gdW5jaGFuZ2VkIGFuZCByZXR1cm5zIGZhbHNlLgorYm9vbCBQYXJzZUludDMyKGNvbnN0IE1lc3NhZ2UmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIEludDMyKiB2YWx1ZSkgeworICAvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLgorICBjaGFyKiBlbmQgPSBOVUxMOworICBjb25zdCBsb25nIGxvbmdfdmFsdWUgPSBzdHJ0b2woc3RyLCAmZW5kLCAxMCk7ICAvLyBOT0xJTlQKKworICAvLyBIYXMgc3RydG9sKCkgY29uc3VtZWQgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZz8KKyAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgIC8vIE5vIC0gYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2FzIGVuY291bnRlcmVkLgorICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgXCIiIDw8IHN0ciA8PCAiXCIuXG4iOworICAgIHByaW50ZigiJXMiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSXMgdGhlIHBhcnNlZCB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgYW4gSW50MzI/CisgIGNvbnN0IEludDMyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludDMyPihsb25nX3ZhbHVlKTsKKyAgaWYgKGxvbmdfdmFsdWUgPT0gTE9OR19NQVggfHwgbG9uZ192YWx1ZSA9PSBMT05HX01JTiB8fAorICAgICAgLy8gVGhlIHBhcnNlZCB2YWx1ZSBvdmVyZmxvd3MgYXMgYSBsb25nLiAgKHN0cnRvbCgpIHJldHVybnMKKyAgICAgIC8vIExPTkdfTUFYIG9yIExPTkdfTUlOIHdoZW4gdGhlIGlucHV0IG92ZXJmbG93cy4pCisgICAgICByZXN1bHQgIT0gbG9uZ192YWx1ZQorICAgICAgLy8gVGhlIHBhcnNlZCB2YWx1ZSBvdmVyZmxvd3MgYXMgYW4gSW50MzIuCisgICAgICApIHsKKyAgICBNZXNzYWdlIG1zZzsKKyAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKKyAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCisgICAgICAgIDw8ICIgaGFzIHZhbHVlICIgPDwgc3RyIDw8ICIsIHdoaWNoIG92ZXJmbG93cy5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqdmFsdWUgPSByZXN1bHQ7CisgIHJldHVybiB0cnVlOworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyB0aGUgQm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCisvLworLy8gVGhlIHZhbHVlIGlzIGNvbnNpZGVyZWQgdHJ1ZSBpZmYgaXQncyBub3QgIjAiLgorYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBTdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICByZXR1cm4gc3RyaW5nX3ZhbHVlID09IE5VTEwgPworICAgICAgZGVmYXVsdF92YWx1ZSA6IHN0cmNtcChzdHJpbmdfdmFsdWUsICIwIikgIT0gMDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgYSAzMi1iaXQgaW50ZWdlciBzdG9yZWQgaW4gdGhlIGVudmlyb25tZW50CisvLyB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCBpc24ndCBzZXQgb3IKKy8vIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgMzItYml0IGludGVnZXIsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KK0ludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3QgU3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgaWYgKHN0cmluZ192YWx1ZSA9PSBOVUxMKSB7CisgICAgLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKworICBJbnQzMiByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJFbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IGVudl92YXIsCisgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWUsICZyZXN1bHQpKSB7CisgICAgcHJpbnRmKCJUaGUgZGVmYXVsdCB2YWx1ZSAlcyBpcyB1c2VkLlxuIiwKKyAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBkZWZhdWx0X3ZhbHVlKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bworLy8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0J3Mgbm90IHNldCwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorY29uc3QgY2hhciogU3RyaW5nRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3QgU3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICByZXR1cm4gdmFsdWUgPT0gTlVMTCA/IGRlZmF1bHRfdmFsdWUgOiB2YWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC1wcmludGVycy5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtcHJpbnRlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2M2M3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QtcHJpbnRlcnMuY2MKQEAgLTAsMCArMSwzNTYgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKKy8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6CisvLworLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7CisvLworLy8gSXQgdXNlcyB0aGUgPDwgb3BlcmF0b3Igd2hlbiBwb3NzaWJsZSwgYW5kIHByaW50cyB0aGUgYnl0ZXMgaW4gdGhlCisvLyBvYmplY3Qgb3RoZXJ3aXNlLiAgQSB1c2VyIGNhbiBvdmVycmlkZSBpdHMgYmVoYXZpb3IgZm9yIGEgY2xhc3MKKy8vIHR5cGUgRm9vIGJ5IGRlZmluaW5nIGVpdGhlciBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiwgY29uc3QgRm9vJikKKy8vIG9yIHZvaWQgUHJpbnRUbyhjb25zdCBGb28mLCA6OnN0ZDo6b3N0cmVhbSopIGluIHRoZSBuYW1lc3BhY2UgdGhhdAorLy8gZGVmaW5lcyBGb28uCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCit1c2luZyA6OnN0ZDo6b3N0cmVhbTsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAvLyBXaW5kb3dzIENFIGRvZXMgbm90IGRlZmluZSBfc25wcmludGZfcy4KKyMgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VsaWYgX01TQ19WRVIgPj0gMTQwMCAgLy8gVkMgOC4wIGFuZCBsYXRlciBkZXByZWNhdGUgc25wcmludGYgYW5kIF9zbnByaW50Zi4KKyMgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50Zl9zCisjZWxpZiBfTVNDX1ZFUgorIyBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFByaW50cyBhIHNlZ21lbnQgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdC4KK3ZvaWQgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgb3N0cmVhbSogb3MpIHsKKyAgY2hhciB0ZXh0WzVdID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKyAgICBjb25zdCBzaXplX3QgaiA9IHN0YXJ0ICsgaTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAvLyBPcmdhbml6ZXMgdGhlIGJ5dGVzIGludG8gZ3JvdXBzIG9mIDIgZm9yIGVhc3kgcGFyc2luZyBieQorICAgICAgLy8gaHVtYW4uCisgICAgICBpZiAoKGogJSAyKSA9PSAwKQorICAgICAgICAqb3MgPDwgJyAnOworICAgICAgZWxzZQorICAgICAgICAqb3MgPDwgJy0nOworICAgIH0KKyAgICBzbnByaW50Zih0ZXh0LCBzaXplb2YodGV4dCksICIlMDJYIiwgb2JqX2J5dGVzW2pdKTsKKyAgICAqb3MgPDwgdGV4dDsKKyAgfQorfQorCisvLyBQcmludHMgdGhlIGJ5dGVzIGluIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4KK3ZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKKyAgLy8gVGVsbHMgdGhlIHVzZXIgaG93IGJpZyB0aGUgb2JqZWN0IGlzLgorICAqb3MgPDwgY291bnQgPDwgIi1ieXRlIG9iamVjdCA8IjsKKworICBjb25zdCBzaXplX3Qga1RocmVzaG9sZCA9IDEzMjsKKyAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA2NDsKKyAgLy8gSWYgdGhlIG9iamVjdCBzaXplIGlzIGJpZ2dlciB0aGFuIGtUaHJlc2hvbGQsIHdlJ2xsIGhhdmUgdG8gb21pdAorICAvLyBzb21lIGRldGFpbHMgYnkgcHJpbnRpbmcgb25seSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGtDaHVua1NpemUKKyAgLy8gYnl0ZXMuCisgIC8vIFRPRE8od2FuKTogbGV0IHRoZSB1c2VyIGNvbnRyb2wgdGhlIHRocmVzaG9sZCB1c2luZyBhIGZsYWcuCisgIGlmIChjb3VudCA8IGtUaHJlc2hvbGQpIHsKKyAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGNvdW50LCBvcyk7CisgIH0gZWxzZSB7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgKm9zIDw8ICIgLi4uICI7CisgICAgLy8gUm91bmRzIHVwIHRvIDItYnl0ZSBib3VuZGFyeS4KKyAgICBjb25zdCBzaXplX3QgcmVzdW1lX3BvcyA9IChjb3VudCAtIGtDaHVua1NpemUgKyAxKS8yKjI7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCByZXN1bWVfcG9zLCBjb3VudCAtIHJlc3VtZV9wb3MsIG9zKTsKKyAgfQorICAqb3MgPDwgIj4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGludGVybmFsMiB7CisKKy8vIERlbGVnYXRlcyB0byBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoKSB0byBwcmludCB0aGUgYnl0ZXMgaW4gdGhlCisvLyBnaXZlbiBvYmplY3QuICBUaGUgZGVsZWdhdGlvbiBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKKy8vIHVzZXMgdGhlIDw8IG9wZXJhdG9yIGFuZCB0aHVzIGlzIGVhc2llciBkb25lIG91dHNpZGUgb2YgdGhlCisvLyA6OnRlc3Rpbmc6OmludGVybmFsIG5hbWVzcGFjZSwgd2hpY2ggY29udGFpbnMgYSA8PCBvcGVyYXRvciB0aGF0CisvLyBzb21ldGltZXMgY29uZmxpY3RzIHdpdGggdGhlIG9uZSBpbiBTVEwuCit2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgeworICBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwob2JqX2J5dGVzLCBjb3VudCwgb3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYSBjaGFyIChvciB3Y2hhcl90KSwgd2UgcHJpbnQgaXQgaW4gb25lCisvLyBvZiB0aHJlZSBmb3JtYXRzOgorLy8gICAtIGFzIGlzIGlmIGl0J3MgYSBwcmludGFibGUgQVNDSUkgKGUuZy4gJ2EnLCAnMicsICcgJyksCisvLyAgIC0gYXMgYSBoZXhpZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2UgKGUuZy4gJ1x4N0YnKSwgb3IKKy8vICAgLSBhcyBhIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdccicsICdcbicpLgorZW51bSBDaGFyRm9ybWF0IHsKKyAga0FzSXMsCisgIGtIZXhFc2NhcGUsCisgIGtTcGVjaWFsRXNjYXBlCit9OworCisvLyBSZXR1cm5zIHRydWUgaWYgYyBpcyBhIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXIuICBXZSB0ZXN0IHRoZQorLy8gdmFsdWUgb2YgYyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgaXNwcmludCgpLCB3aGljaCBpcyBidWdneSBvbgorLy8gV2luZG93cyBNb2JpbGUuCitpbmxpbmUgYm9vbCBJc1ByaW50YWJsZUFzY2lpKHdjaGFyX3QgYykgeworICByZXR1cm4gMHgyMCA8PSBjICYmIGMgPD0gMHg3RTsKK30KKworLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhciBjIGFzIGEgY2hhcmFjdGVyIGxpdGVyYWwgd2l0aG91dCB0aGUKKy8vIHF1b3RlcywgZXNjYXBpbmcgaXQgd2hlbiBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KKy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwKKy8vIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc0NoYXJMaXRlcmFsVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgeworICBzd2l0Y2ggKHN0YXRpY19jYXN0PHdjaGFyX3Q+KGMpKSB7CisgICAgY2FzZSBMJ1wwJzoKKyAgICAgICpvcyA8PCAiXFwwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcJyc6CisgICAgICAqb3MgPDwgIlxcJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXFwnOgorICAgICAgKm9zIDw8ICJcXFxcIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcYSc6CisgICAgICAqb3MgPDwgIlxcYSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGInOgorICAgICAgKm9zIDw8ICJcXGIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xmJzoKKyAgICAgICpvcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcbic6CisgICAgICAqb3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHInOgorICAgICAgKm9zIDw8ICJcXHIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1x0JzoKKyAgICAgICpvcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcdic6CisgICAgICAqb3MgPDwgIlxcdiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKElzUHJpbnRhYmxlQXNjaWkoYykpIHsKKyAgICAgICAgKm9zIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOworICAgICAgICByZXR1cm4ga0FzSXM7CisgICAgICB9IGVsc2UgeworICAgICAgICAqb3MgPDwgU3RyaW5nOjpGb3JtYXQoIlxceCVYIiwgc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7CisgICAgICAgIHJldHVybiBrSGV4RXNjYXBlOworICAgICAgfQorICB9CisgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKK30KKworLy8gUHJpbnRzIGEgY2hhciBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCisvLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNXaWRlU3RyaW5nTGl0ZXJhbFRvKHdjaGFyX3QgYywgb3N0cmVhbSogb3MpIHsKKyAgc3dpdGNoIChjKSB7CisgICAgY2FzZSBMJ1wnJzoKKyAgICAgICpvcyA8PCAiJyI7CisgICAgICByZXR1cm4ga0FzSXM7CisgICAgY2FzZSBMJyInOgorICAgICAgKm9zIDw8ICJcXFwiIjsKKyAgICAgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFByaW50QXNDaGFyTGl0ZXJhbFRvPHdjaGFyX3Q+KGMsIG9zKTsKKyAgfQorfQorCisvLyBQcmludHMgYSBjaGFyIGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4KKy8vIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc05hcnJvd1N0cmluZ0xpdGVyYWxUbyhjaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIHJldHVybiBQcmludEFzV2lkZVN0cmluZ0xpdGVyYWxUbyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSwgb3MpOworfQorCisvLyBQcmludHMgYSB3aWRlIG9yIG5hcnJvdyBjaGFyYWN0ZXIgYyBhbmQgaXRzIGNvZGUuICAnXDAnIGlzIHByaW50ZWQKKy8vIGFzICInXFwwJyIsIG90aGVyIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGFsc28gcHJvcGVybHkgZXNjYXBlZAorLy8gdXNpbmcgdGhlIHN0YW5kYXJkIEMrKyBlc2NhcGUgc2VxdWVuY2UuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKKy8vIFVuc2lnbmVkQ2hhciBpcyB0aGUgdW5zaWduZWQgdmVyc2lvbiBvZiBDaGFyLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgordGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KK3ZvaWQgUHJpbnRDaGFyQW5kQ29kZVRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgLy8gRmlyc3QsIHByaW50IGMgYXMgYSBsaXRlcmFsIGluIHRoZSBtb3N0IHJlYWRhYmxlIGZvcm0gd2UgY2FuIGZpbmQuCisgICpvcyA8PCAoKHNpemVvZihjKSA+IDEpID8gIkwnIiA6ICInIik7CisgIGNvbnN0IENoYXJGb3JtYXQgZm9ybWF0ID0gUHJpbnRBc0NoYXJMaXRlcmFsVG88VW5zaWduZWRDaGFyPihjLCBvcyk7CisgICpvcyA8PCAiJyI7CisKKyAgLy8gVG8gYWlkIHVzZXIgZGVidWdnaW5nLCB3ZSBhbHNvIHByaW50IGMncyBjb2RlIGluIGRlY2ltYWwsIHVubGVzcworICAvLyBpdCdzIDAgKGluIHdoaWNoIGNhc2UgYyB3YXMgcHJpbnRlZCBhcyAnXFwwJywgbWFraW5nIHRoZSBjb2RlCisgIC8vIG9idmlvdXMpLgorICBpZiAoYyA9PSAwKQorICAgIHJldHVybjsKKyAgKm9zIDw8ICIgKCIgPDwgU3RyaW5nOjpGb3JtYXQoIiVkIiwgYykuY19zdHIoKTsKKworICAvLyBGb3IgbW9yZSBjb252ZW5pZW5jZSwgd2UgcHJpbnQgYydzIGNvZGUgYWdhaW4gaW4gaGV4aWRlY2ltYWwsCisgIC8vIHVubGVzcyBjIHdhcyBhbHJlYWR5IHByaW50ZWQgaW4gdGhlIGZvcm0gJ1x4IyMnIG9yIHRoZSBjb2RlIGlzIGluCisgIC8vIFsxLCA5XS4KKyAgaWYgKGZvcm1hdCA9PSBrSGV4RXNjYXBlIHx8ICgxIDw9IGMgJiYgYyA8PSA5KSkgeworICAgIC8vIERvIG5vdGhpbmcuCisgIH0gZWxzZSB7CisgICAgKm9zIDw8IFN0cmluZzo6Rm9ybWF0KCIsIDB4JVgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxVbnNpZ25lZENoYXI+KGMpKS5jX3N0cigpOworICB9CisgICpvcyA8PCAiKSI7Cit9CisKK3ZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludENoYXJBbmRDb2RlVG88dW5zaWduZWQgY2hhcj4oYywgb3MpOworfQordm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludENoYXJBbmRDb2RlVG88dW5zaWduZWQgY2hhcj4oYywgb3MpOworfQorCisvLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKKy8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBjb2RlLiAgTCdcMCcgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4KK3ZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJBbmRDb2RlVG88d2NoYXJfdD4od2MsIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBvc3RyZWFtLgorLy8gVGhlIGFycmF5IHN0YXJ0cyBhdCAqYmVnaW4sIHRoZSBsZW5ndGggaXMgbGVuLCBpdCBtYXkgaW5jbHVkZSAnXDAnIGNoYXJhY3RlcnMKKy8vIGFuZCBtYXkgbm90IGJlIG51bGwtdGVybWluYXRlZC4KK3N0YXRpYyB2b2lkIFByaW50Q2hhcnNBc1N0cmluZ1RvKGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIlwiIjsKKyAgYm9vbCBpc19wcmV2aW91c19oZXggPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgKytpbmRleCkgeworICAgIGNvbnN0IGNoYXIgY3VyID0gYmVnaW5baW5kZXhdOworICAgIGlmIChpc19wcmV2aW91c19oZXggJiYgSXNYRGlnaXQoY3VyKSkgeworICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIG9mICdceC4uJyBmb3JtIGFuZCB0aGlzIGNoYXJhY3RlciBjYW4gYmUKKyAgICAgIC8vIGludGVycHJldGVkIGFzIGFub3RoZXIgaGV4YWRlY2ltYWwgZGlnaXQgaW4gaXRzIG51bWJlci4gQnJlYWsgc3RyaW5nIHRvCisgICAgICAvLyBkaXNhbWJpZ3VhdGUuCisgICAgICAqb3MgPDwgIlwiIFwiIjsKKyAgICB9CisgICAgaXNfcHJldmlvdXNfaGV4ID0gUHJpbnRBc05hcnJvd1N0cmluZ0xpdGVyYWxUbyhjdXIsIG9zKSA9PSBrSGV4RXNjYXBlOworICB9CisgICpvcyA8PCAiXCIiOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3ZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBjaGFyKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8oYmVnaW4sIGxlbiwgb3MpOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIGFycmF5IG9mIHdpZGUgY2hhcmFjdGVycyB0byB0aGUgb3N0cmVhbS4KKy8vIFRoZSBhcnJheSBzdGFydHMgYXQgKmJlZ2luLCB0aGUgbGVuZ3RoIGlzIGxlbiwgaXQgbWF5IGluY2x1ZGUgTCdcMCcKKy8vIGNoYXJhY3RlcnMgYW5kIG1heSBub3QgYmUgbnVsbC10ZXJtaW5hdGVkLgorc3RhdGljIHZvaWQgUHJpbnRXaWRlQ2hhcnNBc1N0cmluZ1RvKGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAiTFwiIjsKKyAgYm9vbCBpc19wcmV2aW91c19oZXggPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgKytpbmRleCkgeworICAgIGNvbnN0IHdjaGFyX3QgY3VyID0gYmVnaW5baW5kZXhdOworICAgIGlmIChpc19wcmV2aW91c19oZXggJiYgaXNhc2NpaShjdXIpICYmIElzWERpZ2l0KHN0YXRpY19jYXN0PGNoYXI+KGN1cikpKSB7CisgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgb2YgJ1x4Li4nIGZvcm0gYW5kIHRoaXMgY2hhcmFjdGVyIGNhbiBiZQorICAgICAgLy8gaW50ZXJwcmV0ZWQgYXMgYW5vdGhlciBoZXhhZGVjaW1hbCBkaWdpdCBpbiBpdHMgbnVtYmVyLiBCcmVhayBzdHJpbmcgdG8KKyAgICAgIC8vIGRpc2FtYmlndWF0ZS4KKyAgICAgICpvcyA8PCAiXCIgTFwiIjsKKyAgICB9CisgICAgaXNfcHJldmlvdXNfaGV4ID0gUHJpbnRBc1dpZGVTdHJpbmdMaXRlcmFsVG8oY3VyLCBvcykgPT0ga0hleEVzY2FwZTsKKyAgfQorICAqb3MgPDwgIlwiIjsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KK3ZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCBvc3RyZWFtKiBvcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOworICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHN0cmxlbihzKSwgb3MpOworICB9Cit9CisKKy8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKKy8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCisvLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCisvLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCisvLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgorLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorLy8gUHJpbnRzIHRoZSBnaXZlbiB3aWRlIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgordm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7CisgICAgUHJpbnRXaWRlQ2hhcnNBc1N0cmluZ1RvKHMsIHdjc2xlbihzKSwgb3MpOworICB9Cit9CisjZW5kaWYgIC8vIHdjaGFyX3QgaXMgbmF0aXZlCisKKy8vIFByaW50cyBhIDo6c3RyaW5nIG9iamVjdC4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwordm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKwordm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorCisvLyBQcmludHMgYSA6OndzdHJpbmcgb2JqZWN0LgorI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwordm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50V2lkZUNoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK3ZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50V2lkZUNoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LXRlc3QtcGFydC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGRjNjdjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3VzaW5nIGludGVybmFsOjpHZXRVbml0VGVzdEltcGw7CisKKy8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sgdHJhY2UKKy8vIGluIGl0LgoraW50ZXJuYWw6OlN0cmluZyBUZXN0UGFydFJlc3VsdDo6RXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBzdGFja190cmFjZSA9IHN0cnN0cihtZXNzYWdlLCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIpOworICByZXR1cm4gc3RhY2tfdHJhY2UgPT0gTlVMTCA/IGludGVybmFsOjpTdHJpbmcobWVzc2FnZSkgOgorICAgICAgaW50ZXJuYWw6OlN0cmluZyhtZXNzYWdlLCBzdGFja190cmFjZSAtIG1lc3NhZ2UpOworfQorCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gb3MKKyAgICAgIDw8IHJlc3VsdC5maWxlX25hbWUoKSA8PCAiOiIgPDwgcmVzdWx0LmxpbmVfbnVtYmVyKCkgPDwgIjogIgorICAgICAgPDwgKHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzID8gIlN1Y2Nlc3MiIDoKKyAgICAgICAgICByZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlID8gIkZhdGFsIGZhaWx1cmUiIDoKKyAgICAgICAgICAiTm9uLWZhdGFsIGZhaWx1cmUiKSA8PCAiOlxuIgorICAgICAgPDwgcmVzdWx0Lm1lc3NhZ2UoKSA8PCBzdGQ6OmVuZGw7Cit9CisKKy8vIEFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuCit2b2lkIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkFwcGVuZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIGFycmF5Xy5wdXNoX2JhY2socmVzdWx0KTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KK2NvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UGFydFJlc3VsdEFycmF5OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCkpIHsKKyAgICBwcmludGYoIlxuSW52YWxpZCBpbmRleCAoJWQpIGludG8gVGVzdFBhcnRSZXN1bHRBcnJheS5cbiIsIGluZGV4KTsKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gYXJyYXlfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgoraW50IFRlc3RQYXJ0UmVzdWx0QXJyYXk6OnNpemUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5Xy5zaXplKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpCisgICAgOiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfKGZhbHNlKSwKKyAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyhHZXRVbml0VGVzdEltcGwoKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSkgeworICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7Cit9CisKK0hhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6fkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpIHsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKTsKK30KKwordm9pZCBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgaWYgKHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpKQorICAgIGhhc19uZXdfZmF0YWxfZmFpbHVyZV8gPSB0cnVlOworICBvcmlnaW5hbF9yZXBvcnRlcl8tPlJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2M4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgaW4gc3RyLiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBzdHIKKy8vIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgorc3RhdGljIGNvbnN0IGNoYXIqIFNraXBTcGFjZXMoY29uc3QgY2hhciogc3RyKSB7CisgIHdoaWxlIChJc1NwYWNlKCpzdHIpKQorICAgIHN0cisrOworICByZXR1cm4gc3RyOworfQorCisvLyBWZXJpZmllcyB0aGF0IHJlZ2lzdGVyZWRfdGVzdHMgbWF0Y2ggdGhlIHRlc3QgbmFtZXMgaW4KKy8vIGRlZmluZWRfdGVzdF9uYW1lc187IHJldHVybnMgcmVnaXN0ZXJlZF90ZXN0cyBpZiBzdWNjZXNzZnVsLCBvcgorLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KK2NvbnN0IGNoYXIqIFR5cGVkVGVzdENhc2VQU3RhdGU6OlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoCisgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIHJlZ2lzdGVyZWRfdGVzdHMpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6c2V0PGNvbnN0IGNoYXIqPjo6Y29uc3RfaXRlcmF0b3IgRGVmaW5lZFRlc3RJdGVyOworICByZWdpc3RlcmVkXyA9IHRydWU7CisKKyAgLy8gU2tpcCBpbml0aWFsIHdoaXRlc3BhY2UgaW4gcmVnaXN0ZXJlZF90ZXN0cyBzaW5jZSBzb21lCisgIC8vIHByZXByb2Nlc3NvcnMgcHJlZml4IHN0cmluZ2l6aWVkIGxpdGVyYWxzIHdpdGggd2hpdGVzcGFjZS4KKyAgcmVnaXN0ZXJlZF90ZXN0cyA9IFNraXBTcGFjZXMocmVnaXN0ZXJlZF90ZXN0cyk7CisKKyAgTWVzc2FnZSBlcnJvcnM7CisgIDo6c3RkOjpzZXQ8U3RyaW5nPiB0ZXN0czsKKyAgZm9yIChjb25zdCBjaGFyKiBuYW1lcyA9IHJlZ2lzdGVyZWRfdGVzdHM7IG5hbWVzICE9IE5VTEw7CisgICAgICAgbmFtZXMgPSBTa2lwQ29tbWEobmFtZXMpKSB7CisgICAgY29uc3QgU3RyaW5nIG5hbWUgPSBHZXRQcmVmaXhVbnRpbENvbW1hKG5hbWVzKTsKKyAgICBpZiAodGVzdHMuY291bnQobmFtZSkgIT0gMCkgeworICAgICAgZXJyb3JzIDw8ICJUZXN0ICIgPDwgbmFtZSA8PCAiIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZS5cbiI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChEZWZpbmVkVGVzdEl0ZXIgaXQgPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKG5hbWUgPT0gKml0KSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKSB7CisgICAgICB0ZXN0cy5pbnNlcnQobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVycm9ycyA8PCAiTm8gdGVzdCBuYW1lZCAiIDw8IG5hbWUKKyAgICAgICAgICAgICA8PCAiIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHRlc3QgY2FzZS5cbiI7CisgICAgfQorICB9CisKKyAgZm9yIChEZWZpbmVkVGVzdEl0ZXIgaXQgPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmJlZ2luKCk7CisgICAgICAgaXQgIT0gZGVmaW5lZF90ZXN0X25hbWVzXy5lbmQoKTsKKyAgICAgICArK2l0KSB7CisgICAgaWYgKHRlc3RzLmNvdW50KCppdCkgPT0gMCkgeworICAgICAgZXJyb3JzIDw8ICJZb3UgZm9yZ290IHRvIGxpc3QgdGVzdCAiIDw8ICppdCA8PCAiLlxuIjsKKyAgICB9CisgIH0KKworICBjb25zdCBTdHJpbmcmIGVycm9yc19zdHIgPSBlcnJvcnMuR2V0U3RyaW5nKCk7CisgIGlmIChlcnJvcnNfc3RyICE9ICIiKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyAlcyIsIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLAorICAgICAgICAgICAgZXJyb3JzX3N0ci5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorCisgIHJldHVybiByZWdpc3RlcmVkX3Rlc3RzOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZDlkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9zcmMvZ3Rlc3QuY2MKQEAgLTAsMCArMSw0ODk4IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CisjaW5jbHVkZSA8d2N0eXBlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWYgR1RFU1RfT1NfTElOVVgKKworLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworIyBpbmNsdWRlIDxmY250bC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPGxpbWl0cy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHNjaGVkLmg+ICAvLyBOT0xJTlQKKy8vIERlY2xhcmVzIHZzbnByaW50ZigpLiAgVGhpcyBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN0cmluZz4KKworI2VsaWYgR1RFU1RfT1NfU1lNQklBTgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1pPUworIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKy8vIE9uIHovT1Mgd2UgYWRkaXRpb25hbGx5IG5lZWQgc3RyaW5ncy5oIGZvciBzdHJjYXNlY21wLgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLgorCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cyBwcm9wZXIuCisKKyMgaW5jbHVkZSA8aW8uaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdGltZWIuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPiAgLy8gTk9MSU5UCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NSU5HVworLy8gTWluR1cgaGFzIGdldHRpbWVvZmRheSgpIGJ1dCBub3QgX2Z0aW1lNjQoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBUaGVyZSBhcmUgb3RoZXIgd2F5cyB0byBnZXQgdGhlIHRpbWUgb24KKy8vICAgV2luZG93cywgbGlrZSBHZXRUaWNrQ291bnQoKSBvciBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpLiAgTWluR1cKKy8vICAgc3VwcG9ydHMgdGhlc2UuICBjb25zaWRlciB1c2luZyB0aGVtIGluc3RlYWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NSU5HVworCisvLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bworLy8gc2lsZW5jZSBpdC4KKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisKKyNlbHNlCisKKy8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KKy8vIHNpbGVuY2UgaXQuCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgaW5jbHVkZSA8c3RkZXhjZXB0PgorI2VuZGlmCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCit1c2luZyBpbnRlcm5hbDo6Q291bnRJZjsKK3VzaW5nIGludGVybmFsOjpGb3JFYWNoOwordXNpbmcgaW50ZXJuYWw6OkdldEVsZW1lbnRPcjsKK3VzaW5nIGludGVybmFsOjpTaHVmZmxlOworCisvLyBDb25zdGFudHMuCisKKy8vIEEgdGVzdCB3aG9zZSB0ZXN0IGNhc2UgbmFtZSBvciB0ZXN0IG5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlciBpcworLy8gZGlzYWJsZWQgYW5kIG5vdCBydW4uCitzdGF0aWMgY29uc3QgY2hhciBrRGlzYWJsZVRlc3RGaWx0ZXJbXSA9ICJESVNBQkxFRF8qOiovRElTQUJMRURfKiI7CisKKy8vIEEgdGVzdCBjYXNlIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlciBpcyBjb25zaWRlcmVkIGEgZGVhdGgKKy8vIHRlc3QgY2FzZSBhbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRlc3QgY2FzZXMgd2hvc2UgbmFtZSBkb2Vzbid0CisvLyBtYXRjaCB0aGlzIGZpbHRlci4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RDYXNlRmlsdGVyW10gPSAiKkRlYXRoVGVzdDoqRGVhdGhUZXN0LyoiOworCisvLyBBIHRlc3QgZmlsdGVyIHRoYXQgbWF0Y2hlcyBldmVyeXRoaW5nLgorc3RhdGljIGNvbnN0IGNoYXIga1VuaXZlcnNhbEZpbHRlcltdID0gIioiOworCisvLyBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBmb3IgWE1MIG91dHB1dC4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0T3V0cHV0RmlsZVtdID0gInRlc3RfZGV0YWlsLnhtbCI7CisKKy8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdGVzdCBzaGFyZCBpbmRleC4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0U2hhcmRJbmRleFtdID0gIkdURVNUX1NIQVJEX0lOREVYIjsKKy8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3Qgc2hhcmRzLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RUb3RhbFNoYXJkc1tdID0gIkdURVNUX1RPVEFMX1NIQVJEUyI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUuCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkU3RhdHVzRmlsZVtdID0gIkdURVNUX1NIQVJEX1NUQVRVU19GSUxFIjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHRleHQgdXNlZCBpbiBmYWlsdXJlIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiB0aGUKKy8vIHN0YWNrIHRyYWNlLgorY29uc3QgY2hhciBrU3RhY2tUcmFjZU1hcmtlcltdID0gIlxuU3RhY2sgdHJhY2U6XG4iOworCisvLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK2Jvb2wgZ19oZWxwX2ZsYWcgPSBmYWxzZTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiLCBmYWxzZSksCisgICAgIlJ1biBkaXNhYmxlZCB0ZXN0cyB0b28sIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXN0cyBub3JtYWxseSBiZWluZyBydW4uIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBicmVha19vbl9mYWlsdXJlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJicmVha19vbl9mYWlsdXJlIiwgZmFsc2UpLAorICAgICJUcnVlIGlmZiBhIGZhaWxlZCBhc3NlcnRpb24gc2hvdWxkIGJlIGEgZGVidWdnZXIgYnJlYWstcG9pbnQuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBjYXRjaF9leGNlcHRpb25zLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJjYXRjaF9leGNlcHRpb25zIiwgdHJ1ZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCBjYXRjaCBleGNlcHRpb25zIGFuZCB0cmVhdCB0aGVtIGFzIHRlc3QgZmFpbHVyZXMuIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGNvbG9yLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImNvbG9yIiwgImF1dG8iKSwKKyAgICAiV2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuICBWYWxpZCB2YWx1ZXM6IHllcywgbm8sICIKKyAgICAiYW5kIGF1dG8uICAnYXV0bycgbWVhbnMgdG8gdXNlIGNvbG9ycyBpZiB0aGUgb3V0cHV0IGlzICIKKyAgICAiYmVpbmcgc2VudCB0byBhIHRlcm1pbmFsIGFuZCB0aGUgVEVSTSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiCisgICAgImlzIHNldCB0byB4dGVybSwgeHRlcm0tY29sb3IsIHh0ZXJtLTI1NmNvbG9yLCBsaW51eCBvciBjeWd3aW4uIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGZpbHRlciwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJmaWx0ZXIiLCBrVW5pdmVyc2FsRmlsdGVyKSwKKyAgICAiQSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zICIKKyAgICAiZm9yIGZpbHRlcmluZyB0aGUgdGVzdHMgdG8gcnVuLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgIgorICAgICInLScgYW5kIGEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gIgorICAgICJleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlICIKKyAgICAicGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuIik7CisKK0dURVNUX0RFRklORV9ib29sXyhsaXN0X3Rlc3RzLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAiTGlzdCBhbGwgdGVzdHMgd2l0aG91dCBydW5uaW5nIHRoZW0uIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIG91dHB1dCwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJvdXRwdXQiLCAiIiksCisgICAgIkEgZm9ybWF0IChjdXJyZW50bHkgbXVzdCBiZSBcInhtbFwiKSwgb3B0aW9uYWxseSBmb2xsb3dlZCAiCisgICAgImJ5IGEgY29sb24gYW5kIGFuIG91dHB1dCBmaWxlIG5hbWUgb3IgZGlyZWN0b3J5LiBBIGRpcmVjdG9yeSAiCisgICAgImlzIGluZGljYXRlZCBieSBhIHRyYWlsaW5nIHBhdGhuYW1lIHNlcGFyYXRvci4gIgorICAgICJFeGFtcGxlczogXCJ4bWw6ZmlsZW5hbWUueG1sXCIsIFwieG1sOjpkaXJlY3RvcnluYW1lL1wiLiAiCisgICAgIklmIGEgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgb3V0cHV0IGZpbGVzIHdpbGwgYmUgY3JlYXRlZCAiCisgICAgIndpdGhpbiB0aGF0IGRpcmVjdG9yeSwgd2l0aCBmaWxlLW5hbWVzIGJhc2VkIG9uIHRoZSB0ZXN0ICIKKyAgICAiZXhlY3V0YWJsZSdzIG5hbWUgYW5kLCBpZiBuZWNlc3NhcnksIG1hZGUgdW5pcXVlIGJ5IGFkZGluZyAiCisgICAgImRpZ2l0cy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHByaW50X3RpbWUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInByaW50X3RpbWUiLCB0cnVlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIGRpc3BsYXkgZWxhcHNlZCB0aW1lIGluIHRleHQgb3V0cHV0LiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHJhbmRvbV9zZWVkLAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmFuZG9tX3NlZWQiLCAwKSwKKyAgICAiUmFuZG9tIG51bWJlciBzZWVkIHRvIHVzZSB3aGVuIHNodWZmbGluZyB0ZXN0IG9yZGVycy4gIE11c3QgYmUgaW4gcmFuZ2UgIgorICAgICJbMSwgOTk5OTldLCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZS4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICByZXBlYXQsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyZXBlYXQiLCAxKSwKKyAgICAiSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IGVhY2ggdGVzdC4gIFNwZWNpZnkgYSBuZWdhdGl2ZSBudW1iZXIgIgorICAgICJmb3IgcmVwZWF0aW5nIGZvcmV2ZXIuICBVc2VmdWwgZm9yIHNoYWtpbmcgb3V0IGZsYWt5IHRlc3RzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMsIGZhbHNlLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfICIgc2hvdWxkIGluY2x1ZGUgaW50ZXJuYWwgc3RhY2sgZnJhbWVzIHdoZW4gIgorICAgICJwcmludGluZyB0ZXN0IGZhaWx1cmUgc3RhY2sgdHJhY2VzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgc2h1ZmZsZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigic2h1ZmZsZSIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIHJhbmRvbWl6ZSB0ZXN0cycgb3JkZXIgb24gZXZlcnkgcnVuLiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHN0YWNrX3RyYWNlX2RlcHRoLAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigic3RhY2tfdHJhY2VfZGVwdGgiLCBrTWF4U3RhY2tUcmFjZURlcHRoKSwKKyAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBwcmludCB3aGVuIGFuICIKKyAgICAiYXNzZXJ0aW9uIGZhaWxzLiAgVGhlIHZhbGlkIHJhbmdlIGlzIDAgdGhyb3VnaCAxMDAsIGluY2x1c2l2ZS4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgc3RyZWFtX3Jlc3VsdF90bywKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJzdHJlYW1fcmVzdWx0X3RvIiwgIiIpLAorICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0byBzdHJlYW0gIgorICAgICJ0ZXN0IHJlc3VsdHMuIEV4YW1wbGU6IFwibG9jYWxob3N0OjU1NVwiLiBUaGUgZmxhZyBpcyBlZmZlY3RpdmUgb25seSBvbiAiCisgICAgIkxpbnV4LiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgdGhyb3dfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigidGhyb3dfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gIgorICAgICJpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhIG5vbi16ZXJvIGNvZGUgIgorICAgICJvdGhlcndpc2UuIik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgZnJvbSBbMCwgcmFuZ2UpLCB1c2luZyBhIExpbmVhcgorLy8gQ29uZ3J1ZW50aWFsIEdlbmVyYXRvciAoTENHKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcyAwIG9yIGdyZWF0ZXIKKy8vIHRoYW4ga01heFJhbmdlLgorVUludDMyIFJhbmRvbTo6R2VuZXJhdGUoVUludDMyIHJhbmdlKSB7CisgIC8vIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIHNhbWUgYXMgYXJlIHVzZWQgaW4gZ2xpYmMncyByYW5kKDMpLgorICBzdGF0ZV8gPSAoMTEwMzUxNTI0NVUqc3RhdGVfICsgMTIzNDVVKSAlIGtNYXhSYW5nZTsKKworICBHVEVTVF9DSEVDS18ocmFuZ2UgPiAwKQorICAgICAgPDwgIkNhbm5vdCBnZW5lcmF0ZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIDApLiI7CisgIEdURVNUX0NIRUNLXyhyYW5nZSA8PSBrTWF4UmFuZ2UpCisgICAgICA8PCAiR2VuZXJhdGlvbiBvZiBhIG51bWJlciBpbiBbMCwgIiA8PCByYW5nZSA8PCAiKSB3YXMgcmVxdWVzdGVkLCAiCisgICAgICA8PCAiYnV0IHRoaXMgY2FuIG9ubHkgZ2VuZXJhdGUgbnVtYmVycyBpbiBbMCwgIiA8PCBrTWF4UmFuZ2UgPDwgIikuIjsKKworICAvLyBDb252ZXJ0aW5nIHZpYSBtb2R1bHVzIGludHJvZHVjZXMgYSBiaXQgb2YgZG93bndhcmQgYmlhcywgYnV0CisgIC8vIGl0J3Mgc2ltcGxlLCBhbmQgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIGdlbmVyYXRvciBpc24ndCB0b28gZ29vZAorICAvLyB0byBiZWdpbiB3aXRoLgorICByZXR1cm4gc3RhdGVfICUgcmFuZ2U7Cit9CisKKy8vIEdUZXN0SXNJbml0aWFsaXplZCgpIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIGluaXRpYWxpemVkCisvLyBHb29nbGUgVGVzdC4gIFVzZWZ1bCBmb3IgY2F0Y2hpbmcgdGhlIHVzZXIgbWlzdGFrZSBvZiBub3QgaW5pdGlhbGl6aW5nCisvLyBHb29nbGUgVGVzdCBiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuCisvLworLy8gQSB1c2VyIG11c3QgY2FsbCB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpIHRvIGluaXRpYWxpemUgR29vZ2xlCisvLyBUZXN0LiAgZ19pbml0X2d0ZXN0X2NvdW50IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRpbWVzCisvLyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4gIFdlIGRvbid0IHByb3RlY3QgdGhpcyB2YXJpYWJsZQorLy8gdW5kZXIgYSBtdXRleCBhcyBpdCBpcyBvbmx5IGFjY2Vzc2VkIGluIHRoZSBtYWluIHRocmVhZC4KK2ludCBnX2luaXRfZ3Rlc3RfY291bnQgPSAwOworc3RhdGljIGJvb2wgR1Rlc3RJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gZ19pbml0X2d0ZXN0X2NvdW50ICE9IDA7IH0KKworLy8gSXRlcmF0ZXMgb3ZlciBhIHZlY3RvciBvZiBUZXN0Q2FzZXMsIGtlZXBpbmcgYSBydW5uaW5nIHN1bSBvZiB0aGUKKy8vIHJlc3VsdHMgb2YgY2FsbGluZyBhIGdpdmVuIGludC1yZXR1cm5pbmcgbWV0aG9kIG9uIGVhY2guCisvLyBSZXR1cm5zIHRoZSBzdW0uCitzdGF0aWMgaW50IFN1bU92ZXJUZXN0Q2FzZUxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiYgY2FzZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoVGVzdENhc2U6OiptZXRob2QpKCkgY29uc3QpIHsKKyAgaW50IHN1bSA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgc3VtICs9IChjYXNlX2xpc3RbaV0tPiptZXRob2QpKCk7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KK3N0YXRpYyBib29sIFRlc3RDYXNlUGFzc2VkKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpICYmIHRlc3RfY2FzZS0+UGFzc2VkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZUZhaWxlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPkZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3RfY2FzZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVzdCB0aGF0IHNob3VsZAorLy8gcnVuLgorc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdENhc2UoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCk7Cit9CisKKy8vIEFzc2VydEhlbHBlciBjb25zdHJ1Y3Rvci4KK0Fzc2VydEhlbHBlcjo6QXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKQorICAgIDogZGF0YV8obmV3IEFzc2VydEhlbHBlckRhdGEodHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkpIHsKK30KKworQXNzZXJ0SGVscGVyOjp+QXNzZXJ0SGVscGVyKCkgeworICBkZWxldGUgZGF0YV87Cit9CisKKy8vIE1lc3NhZ2UgYXNzaWdubWVudCwgZm9yIGFzc2VydGlvbiBzdHJlYW1pbmcgc3VwcG9ydC4KK3ZvaWQgQXNzZXJ0SGVscGVyOjpvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+CisgICAgQWRkVGVzdFBhcnRSZXN1bHQoZGF0YV8tPnR5cGUsIGRhdGFfLT5maWxlLCBkYXRhXy0+bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShkYXRhXy0+bWVzc2FnZSwgbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKQorICAgICAgICAgICAgICAgICAgICAgIC0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKQorICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBmdW5jdGlvbiBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgICAgKTsgIC8vIE5PTElOVAorfQorCisvLyBNdXRleCBmb3IgbGlua2VkIHBvaW50ZXJzLgorR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gQXBwbGljYXRpb24gcGF0aG5hbWUgZ290dGVuIGluIEluaXRHb29nbGVUZXN0LgorU3RyaW5nIGdfZXhlY3V0YWJsZV9wYXRoOworCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgbmFtZSwgcmVtb3ZpbmcgZGlyZWN0b3J5IHBhdGggaWYgdGhhdAorLy8gaXMgcHJlc2VudC4KK0ZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHsKKyAgRmlsZVBhdGggcmVzdWx0OworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXN1bHQuU2V0KEZpbGVQYXRoKGdfZXhlY3V0YWJsZV9wYXRoKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpKTsKKyNlbHNlCisgIHJlc3VsdC5TZXQoRmlsZVBhdGgoZ19leGVjdXRhYmxlX3BhdGgpKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIHJldHVybiByZXN1bHQuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpOworfQorCisvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgorCisvLyBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0LCBvciAiIiBmb3Igbm9ybWFsIHByaW50ZWQgb3V0cHV0LgorU3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkgcmV0dXJuIFN0cmluZygiIik7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIHJldHVybiAoY29sb24gPT0gTlVMTCkgPworICAgICAgU3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnKSA6CisgICAgICBTdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUKKy8vIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KK1N0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpCisgICAgcmV0dXJuIFN0cmluZygiIik7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgIHJldHVybiBTdHJpbmcoaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgICAgICAgICAgIGludGVybmFsOjpGaWxlUGF0aCgKKyAgICAgICAgICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoa0RlZmF1bHRPdXRwdXRGaWxlKSkuVG9TdHJpbmcoKSApOworCisgIGludGVybmFsOjpGaWxlUGF0aCBvdXRwdXRfbmFtZShjb2xvbiArIDEpOworICBpZiAoIW91dHB1dF9uYW1lLklzQWJzb2x1dGVQYXRoKCkpCisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG9uIFdpbmRvd3MgXHNvbWVccGF0aCBpcyBub3QgYW4gYWJzb2x1dGUKKyAgICAvLyBwYXRoIChhcyBpdHMgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGRyaXZlKSwgeWV0IHRoZQorICAgIC8vIGZvbGxvd2luZyBsb2dpYyBmb3IgdHVybmluZyBpdCBpbnRvIGFuIGFic29sdXRlIHBhdGggaXMgd3JvbmcuCisgICAgLy8gRml4IGl0LgorICAgIG91dHB1dF9uYW1lID0gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpKSwKKyAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKGNvbG9uICsgMSkpOworCisgIGlmICghb3V0cHV0X25hbWUuSXNEaXJlY3RvcnkoKSkKKyAgICByZXR1cm4gb3V0cHV0X25hbWUuVG9TdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggcmVzdWx0KGludGVybmFsOjpGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSgKKyAgICAgIG91dHB1dF9uYW1lLCBpbnRlcm5hbDo6R2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCksCisgICAgICBHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKSk7CisgIHJldHVybiByZXN1bHQuVG9TdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKy8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCisvLworLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OlBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7CisgIHN3aXRjaCAoKnBhdHRlcm4pIHsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKyAgICAgIHJldHVybiAqc3RyID09ICdcMCc7CisgICAgY2FzZSAnPyc6ICAvLyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgICAgY2FzZSAnKic6ICAvLyBNYXRjaGVzIGFueSBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSBvZiBjaGFyYWN0ZXJzLgorICAgICAgcmV0dXJuICgqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiwgc3RyICsgMSkpIHx8CisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7CisgICAgZGVmYXVsdDogIC8vIE5vbi1zcGVjaWFsIGNoYXJhY3Rlci4gIE1hdGNoZXMgaXRzZWxmLgorICAgICAgcmV0dXJuICpwYXR0ZXJuID09ICpzdHIgJiYKKyAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworYm9vbCBVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpIHsKKyAgY29uc3QgY2hhciAqY3VyX3BhdHRlcm4gPSBmaWx0ZXI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoUGF0dGVybk1hdGNoZXNTdHJpbmcoY3VyX3BhdHRlcm4sIG5hbWUuY19zdHIoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZpbmRzIHRoZSBuZXh0IHBhdHRlcm4gaW4gdGhlIGZpbHRlci4KKyAgICBjdXJfcGF0dGVybiA9IHN0cmNocihjdXJfcGF0dGVybiwgJzonKTsKKworICAgIC8vIFJldHVybnMgaWYgbm8gbW9yZSBwYXR0ZXJuIGNhbiBiZSBmb3VuZC4KKyAgICBpZiAoY3VyX3BhdHRlcm4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXBzIHRoZSBwYXR0ZXJuIHNlcGFyYXRlciAodGhlICc6JyBjaGFyYWN0ZXIpLgorICAgIGN1cl9wYXR0ZXJuKys7CisgIH0KK30KKworLy8gVE9ETyhrZWl0aHJheSk6IG1vdmUgU3RyaW5nIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyB0byBndGVzdC1zdHJpbmcuY2MuCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UKKy8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCitib29sIFVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoY29uc3QgU3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcgJnRlc3RfbmFtZSkgeworICBjb25zdCBTdHJpbmcmIGZ1bGxfbmFtZSA9IFN0cmluZzo6Rm9ybWF0KCIlcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUuY19zdHIoKSk7CisKKyAgLy8gU3BsaXQgLS1ndGVzdF9maWx0ZXIgYXQgJy0nLCBpZiB0aGVyZSBpcyBvbmUsIHRvIHNlcGFyYXRlIGludG8KKyAgLy8gcG9zaXRpdmUgZmlsdGVyIGFuZCBuZWdhdGl2ZSBmaWx0ZXIgcG9ydGlvbnMKKyAgY29uc3QgY2hhciogY29uc3QgcCA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOworICBjb25zdCBjaGFyKiBjb25zdCBkYXNoID0gc3RyY2hyKHAsICctJyk7CisgIFN0cmluZyBwb3NpdGl2ZTsKKyAgU3RyaW5nIG5lZ2F0aXZlOworICBpZiAoZGFzaCA9PSBOVUxMKSB7CisgICAgcG9zaXRpdmUgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsgIC8vIFdob2xlIHN0cmluZyBpcyBhIHBvc2l0aXZlIGZpbHRlcgorICAgIG5lZ2F0aXZlID0gU3RyaW5nKCIiKTsKKyAgfSBlbHNlIHsKKyAgICBwb3NpdGl2ZSA9IFN0cmluZyhwLCBkYXNoIC0gcCk7ICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBkYXNoCisgICAgbmVnYXRpdmUgPSBTdHJpbmcoZGFzaCsxKTsgICAgICAgLy8gRXZlcnl0aGluZyBhZnRlciB0aGUgZGFzaAorICAgIGlmIChwb3NpdGl2ZS5lbXB0eSgpKSB7CisgICAgICAvLyBUcmVhdCAnLXRlc3QxJyBhcyB0aGUgc2FtZSBhcyAnKi10ZXN0MScKKyAgICAgIHBvc2l0aXZlID0ga1VuaXZlcnNhbEZpbHRlcjsKKyAgICB9CisgIH0KKworICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLiAgSXQgbWF0Y2hlcyBhCisgIC8vIHRlc3QgaWYgYW55IHBhdHRlcm4gaW4gaXQgbWF0Y2hlcyB0aGUgdGVzdC4KKyAgcmV0dXJuIChNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgcG9zaXRpdmUuY19zdHIoKSkgJiYKKyAgICAgICAgICAhTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIG5lZ2F0aXZlLmNfc3RyKCkpKTsKK30KKworI2lmIEdURVNUX0hBU19TRUgKKy8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQorLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCitpbnQgVW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpIHsKKyAgLy8gR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSBhIFNFSCBleGNlcHRpb24gaWY6CisgIC8vICAgMS4gdGhlIHVzZXIgd2FudHMgaXQgdG8sIEFORAorICAvLyAgIDIuIHRoaXMgaXMgbm90IGEgYnJlYWtwb2ludCBleGNlcHRpb24sIEFORAorICAvLyAgIDMuIHRoaXMgaXMgbm90IGEgQysrIGV4Y2VwdGlvbiAoVkMrKyBpbXBsZW1lbnRzIHRoZW0gdmlhIFNFSCwKKyAgLy8gICAgICBhcHBhcmVudGx5KS4KKyAgLy8KKyAgLy8gU0VIIGV4Y2VwdGlvbiBjb2RlIGZvciBDKysgZXhjZXB0aW9ucy4KKyAgLy8gKHNlZSBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzE4NTI5NCBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisgIGNvbnN0IERXT1JEIGtDeHhFeGNlcHRpb25Db2RlID0gMHhlMDZkNzM2MzsKKworICBib29sIHNob3VsZF9oYW5kbGUgPSB0cnVlOworCisgIGlmICghR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisgIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKyAgZWxzZSBpZiAoZXhjZXB0aW9uX2NvZGUgPT0ga0N4eEV4Y2VwdGlvbkNvZGUpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworCisgIHJldHVybiBzaG91bGRfaGFuZGxlID8gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6IEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorLy8gcmVzdWx0cy4gSW50ZXJjZXB0cyBvbmx5IGZhaWx1cmVzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKKyAgICA6IGludGVyY2VwdF9tb2RlXyhJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCksCisgICAgICByZXN1bHRfKHJlc3VsdCkgeworICBJbml0KCk7Cit9CisKKy8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorLy8gcmVzdWx0cy4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCisgICAgOiBpbnRlcmNlcHRfbW9kZV8oaW50ZXJjZXB0X21vZGUpLAorICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKKyAgSW5pdCgpOworfQorCit2b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJbml0KCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgeworICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisgICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcih0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKyAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKKyAgfQorfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgVGVzdAorLy8gYmVmb3JlLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6On5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKKyAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKG9sZF9yZXBvcnRlcl8pOworICB9IGVsc2UgeworICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKG9sZF9yZXBvcnRlcl8pOworICB9Cit9CisKKy8vIEluY3JlbWVudHMgdGhlIHRlc3QgcGFydCByZXN1bHQgY291bnQgYW5kIHJlbWVtYmVycyB0aGUgcmVzdWx0LgorLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSBpbnRlcmZhY2UuCit2b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJlc3VsdF8tPkFwcGVuZChyZXN1bHQpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBSZXR1cm5zIHRoZSB0eXBlIElEIG9mIDo6dGVzdGluZzo6VGVzdC4gIFdlIHNob3VsZCBhbHdheXMgY2FsbCB0aGlzCisvLyBpbnN0ZWFkIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgorLy8gdGVzdGluZzo6VGVzdC4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuCisvLyB1c2luZyBHb29nbGUgVGVzdCBhcyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzCisvLyBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcKKy8vIG9uIHdoZXRoZXIgdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvcgorLy8gZnJvbSB1c2VyIHRlc3QgY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cworLy8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZQorLy8gZ3Rlc3QuY2MsIHdoaWNoIGlzIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrLgorVHlwZUlkIEdldFRlc3RUeXBlSWQoKSB7CisgIHJldHVybiBHZXRUeXBlSWQ8VGVzdD4oKTsKK30KKworLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAorLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KK2V4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3QgPSBHZXRUZXN0VHlwZUlkKCk7CisKKy8vIFRoaXMgcHJlZGljYXRlLWZvcm1hdHRlciBjaGVja3MgdGhhdCAncmVzdWx0cycgY29udGFpbnMgYSB0ZXN0IHBhcnQKKy8vIGZhaWx1cmUgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHRoYXQgdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUKKy8vIGdpdmVuIHN1YnN0cmluZy4KK0Fzc2VydGlvblJlc3VsdCBIYXNPbmVGYWlsdXJlKGNvbnN0IGNoYXIqIC8qIHJlc3VsdHNfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHR5cGVfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHN1YnN0cl9leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSYgcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cikgeworICBjb25zdCBTdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOworICBNZXNzYWdlIG1zZzsKKyAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICB9CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCYgciA9IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCk7CisgIGlmIChyLnR5cGUoKSAhPSB0eXBlKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIGlmIChzdHJzdHIoci5tZXNzYWdlKCksIHN1YnN0ci5jX3N0cigpKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAorLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKKy8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpCisgICAgOiByZXN1bHRzXyhyZXN1bHRzKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9CisKKy8vIFRoZSBkZXN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitTaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKEhhc09uZUZhaWx1cmUsICpyZXN1bHRzXywgdHlwZV8sIHN1YnN0cl8pOworfQorCitEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCitEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworfQorCisvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKK1VuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7CisgIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOworfQorCisvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKKyAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KTsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK1N0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKKyAgKHZvaWQpc2tpcF9jb3VudDsKKyAgcmV0dXJuIFN0cmluZygiIik7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuCisgIC8vIGh0dHA6Ly9hbmFsb2dvdXMuYmxvZ3Nwb3QuY29tLzIwMDUvMDQvZXBvY2guaHRtbAorICBjb25zdCBUaW1lSW5NaWxsaXMga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YSA9CisgICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsKKyAgY29uc3QgRFdPUkQga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCA9IDEwMDAwOworCisgIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7CisgIEZJTEVUSU1FIG5vd19maWxldGltZTsKKyAgVUxBUkdFX0lOVEVHRVIgbm93X2ludDY0OworICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UKKyAgLy8gICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpPworICBHZXRTeXN0ZW1UaW1lKCZub3dfc3lzdGltZSk7CisgIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7CisgICAgbm93X2ludDY0Lkxvd1BhcnQgPSBub3dfZmlsZXRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICBub3dfaW50NjQuSGlnaFBhcnQgPSBub3dfZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0KKyAgICAgIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGE7CisgICAgcmV0dXJuIG5vd19pbnQ2NC5RdWFkUGFydDsKKyAgfQorICByZXR1cm4gMDsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIF9fdGltZWI2NCBub3c7CisKKyMgaWZkZWYgX01TQ19WRVIKKworICAvLyBNU1ZDIDggZGVwcmVjYXRlcyBfZnRpbWU2NCgpLCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcgNDk5NgorICAvLyAoZGVwcmVjYXRlZCBmdW5jdGlvbikgdGhlcmUuCisgIC8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgR2V0VGlja0NvdW50KCk/ICBPciB1c2UKKyAgLy8gICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgpCisjICBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2LgorICBfZnRpbWU2NCgmbm93KTsKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorIyBlbHNlCisKKyAgX2Z0aW1lNjQoJm5vdyk7CisKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnRpbWUpICogMTAwMCArIG5vdy5taWxsaXRtOworI2VsaWYgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8KKyAgc3RydWN0IHRpbWV2YWwgbm93OworICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50dl9zZWMpICogMTAwMCArIG5vdy50dl91c2VjIC8gMTAwMDsKKyNlbHNlCisjIGVycm9yICJEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBvbiB5b3VyIHN5c3RlbS4iCisjZW5kaWYKK30KKworLy8gVXRpbGl0aWVzCisKKy8vIGNsYXNzIFN0cmluZworCisvLyBSZXR1cm5zIHRoZSBpbnB1dCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIGlmIGl0J3Mgbm90IE5VTEw7CisvLyBvdGhlcndpc2UgcmV0dXJucyAiKG51bGwpIi4gIEZvciBleGFtcGxlLCAiXCJIZWxsb1wiIiBpcyByZXR1cm5lZAorLy8gZm9yIGlucHV0ICJIZWxsbyIuCisvLworLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHByaW50aW5nIGEgQyBzdHJpbmcgaW4gdGhlIHN5bnRheCBvZiBhIGxpdGVyYWwuCisvLworLy8gS25vd24gaXNzdWU6IGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBoYW5kbGVkIHlldC4KK1N0cmluZyBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGNvbnN0IGNoYXIqIGNfc3RyKSB7CisgIHJldHVybiBjX3N0ciA/IFN0cmluZzo6Rm9ybWF0KCJcIiVzXCIiLCBjX3N0cikgOiBTdHJpbmcoIihudWxsKSIpOworfQorCisvLyBDb3BpZXMgYXQgbW9zdCBsZW5ndGggY2hhcmFjdGVycyBmcm9tIHN0ciBpbnRvIGEgbmV3bHktYWxsb2NhdGVkCisvLyBwaWVjZSBvZiBtZW1vcnkgb2Ygc2l6ZSBsZW5ndGgrMS4gIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIHdpdGggbmV3W10uCisvLyBBIHRlcm1pbmF0aW5nIG51bGwgYnl0ZSBpcyB3cml0dGVuIHRvIHRoZSBtZW1vcnksIGFuZCBhIHBvaW50ZXIgdG8gaXQKKy8vIGlzIHJldHVybmVkLiAgSWYgc3RyIGlzIE5VTEwsIE5VTEwgaXMgcmV0dXJuZWQuCitzdGF0aWMgY2hhciogQ2xvbmVTdHJpbmcoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuZ3RoKSB7CisgIGlmIChzdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIGNoYXIqIGNvbnN0IGNsb25lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV07CisgICAgcG9zaXg6OlN0ck5DcHkoY2xvbmUsIHN0ciwgbGVuZ3RoKTsKKyAgICBjbG9uZVtsZW5ndGhdID0gJ1wwJzsKKyAgICByZXR1cm4gY2xvbmU7CisgIH0KK30KKworLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUKKy8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmdbXSB0aGUgcmV0dXJuIHZhbHVlLiAgUmV0dXJucyB0aGUKKy8vIGNsb25lZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyICogU3RyaW5nOjpDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpIHsKKyAgcmV0dXJuIChjX3N0ciA9PSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgIE5VTEwgOiBDbG9uZVN0cmluZyhjX3N0ciwgc3RybGVuKGNfc3RyKSk7Cit9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorLy8gaW5wdXQgaXMgTlVMTC4KK0xQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7CisgIGlmICghYW5zaSkgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYW5zaSk7CisgIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKyAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCB1bmljb2RlX2xlbmd0aCk7CisgIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIHVuaWNvZGU7Cit9CisKKy8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyKiBTdHJpbmc6OlV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKSAgeworICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBhbnNpX2xlbmd0aCA9CisgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGNoYXIqIGFuc2kgPSBuZXcgY2hhclthbnNpX2xlbmd0aCArIDFdOworICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7CisgIGFuc2lbYW5zaV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIGFuc2k7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAorLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmICggbGhzID09IE5VTEwgKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RyY21wKGxocywgcmhzKSA9PSAwOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBDb252ZXJ0cyBhbiBhcnJheSBvZiB3aWRlIGNoYXJzIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiBNZXNzYWdlIG9iamVjdC4KK3N0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1zZykgeworICAvLyBUT0RPKHdhbik6IGNvbnNpZGVyIGFsbG93aW5nIGEgdGVzdGluZzo6U3RyaW5nIG9iamVjdCB0bworICAvLyBjb250YWluICdcMCcuICBUaGlzIHdpbGwgbWFrZSBpdCBiZWhhdmUgbW9yZSBsaWtlIHN0ZDo6c3RyaW5nLAorICAvLyBhbmQgd2lsbCBhbGxvdyBUb1V0ZjhTdHJpbmcoKSB0byByZXR1cm4gdGhlIGNvcnJlY3QgZW5jb2RpbmcKKyAgLy8gZm9yICdcMCcgcy50LiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGUgY29uZGl0aW9uYWwgaGVyZSAoYW5kIGluCisgIC8vIHNldmVyYWwgb3RoZXIgcGxhY2VzKS4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbGVuZ3RoOyApIHsgIC8vIE5PTElOVAorICAgIGlmICh3c3RyW2ldICE9IEwnXDAnKSB7CisgICAgICAqbXNnIDw8IFdpZGVTdHJpbmdUb1V0Zjgod3N0ciArIGksIHN0YXRpY19jYXN0PGludD4obGVuZ3RoIC0gaSkpOworICAgICAgd2hpbGUgKGkgIT0gbGVuZ3RoICYmIHdzdHJbaV0gIT0gTCdcMCcpCisgICAgICAgIGkrKzsKKyAgICB9IGVsc2UgeworICAgICAgKm1zZyA8PCAnXDAnOworICAgICAgaSsrOworICAgIH0KKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORyB8fCBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpIHsKKyAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6d3N0cmluZyYgd3N0cikgeworICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIEFzc2VydGlvblJlc3VsdCBjb25zdHJ1Y3RvcnMuCisvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikKKyAgICA6IHN1Y2Nlc3NfKG90aGVyLnN1Y2Nlc3NfKSwKKyAgICAgIG1lc3NhZ2VfKG90aGVyLm1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPworICAgICAgICAgICAgICAgbmV3IDo6c3RkOjpzdHJpbmcoKm90aGVyLm1lc3NhZ2VfKSA6CisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KE5VTEwpKSB7Cit9CisKKy8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25SZXN1bHQ6Om9wZXJhdG9yISgpIGNvbnN0IHsKKyAgQXNzZXJ0aW9uUmVzdWx0IG5lZ2F0aW9uKCFzdWNjZXNzXyk7CisgIGlmIChtZXNzYWdlXy5nZXQoKSAhPSBOVUxMKQorICAgIG5lZ2F0aW9uIDw8ICptZXNzYWdlXzsKKyAgcmV0dXJuIG5lZ2F0aW9uOworfQorCisvLyBNYWtlcyBhIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHJlc3VsdC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCkgeworICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KHRydWUpOworfQorCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKSB7CisgIHJldHVybiBBc3NlcnRpb25SZXN1bHQoZmFsc2UpOworfQorCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KKy8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZS4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCisvLworLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgorLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQorLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgorLy8KKy8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKKy8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKKy8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCisvLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgorLy8KKy8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKKy8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCisvLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorQXNzZXJ0aW9uUmVzdWx0IEVxRmFpbHVyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBleHBlY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JpbmdfY2FzZSkgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBhY3R1YWxfZXhwcmVzc2lvbjsKKyAgaWYgKGFjdHVhbF92YWx1ZSAhPSBhY3R1YWxfZXhwcmVzc2lvbikgeworICAgIG1zZyA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsdWU7CisgIH0KKworICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfZXhwcmVzc2lvbjsKKyAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsKKyAgICBtc2cgPDwgIiAoaWdub3JpbmcgY2FzZSkiOworICB9CisgIGlmIChleHBlY3RlZF92YWx1ZSAhPSBleHBlY3RlZF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbHVlOworICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7Cit9CisKKy8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLgorU3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZShjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKSB7CisgIGNvbnN0IGNoYXIqIGFjdHVhbF9tZXNzYWdlID0gYXNzZXJ0aW9uX3Jlc3VsdC5tZXNzYWdlKCk7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGV4cHJlc3Npb25fdGV4dAorICAgICAgPDwgIlxuICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZTsKKyAgaWYgKGFjdHVhbF9tZXNzYWdlWzBdICE9ICdcMCcpCisgICAgbXNnIDw8ICIgKCIgPDwgYWN0dWFsX21lc3NhZ2UgPDwgIikiOworICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlOworICByZXR1cm4gbXNnLkdldFN0cmluZygpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KK0Fzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhYnNfZXJyb3JfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzX2Vycm9yKSB7CisgIGNvbnN0IGRvdWJsZSBkaWZmID0gZmFicyh2YWwxIC0gdmFsMik7CisgIGlmIChkaWZmIDw9IGFic19lcnJvcikgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICAvLyBUT0RPKHdhbik6IGRvIG5vdCBwcmludCB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBpZiBpdCdzCisgIC8vIGFscmVhZHkgYSBsaXRlcmFsLgorICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIDw8IGV4cHIxIDw8ICIgYW5kICIgPDwgZXhwcjIKKyAgICAgIDw8ICIgaXMgIiA8PCBkaWZmIDw8ICIsIHdoaWNoIGV4Y2VlZHMgIiA8PCBhYnNfZXJyb3JfZXhwciA8PCAiLCB3aGVyZVxuIgorICAgICAgPDwgZXhwcjEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwxIDw8ICIsXG4iCisgICAgICA8PCBleHByMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDIgPDwgIiwgYW5kXG4iCisgICAgICA8PCBhYnNfZXJyb3JfZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IGFic19lcnJvciA8PCAiLiI7Cit9CisKKworLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgRmxvYXRMRSgpIGFuZCBEb3VibGVMRSgpLgordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitBc3NlcnRpb25SZXN1bHQgRmxvYXRpbmdQb2ludExFKGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDIpIHsKKyAgLy8gUmV0dXJucyBzdWNjZXNzIGlmIHZhbDEgaXMgbGVzcyB0aGFuIHZhbDIsCisgIGlmICh2YWwxIDwgdmFsMikgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICAvLyBvciBpZiB2YWwxIGlzIGFsbW9zdCBlcXVhbCB0byB2YWwyLgorICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyh2YWwxKSwgcmhzKHZhbDIpOworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgdHdvIGNoZWNrcyB3aWxsIGJvdGggZmFpbCBpZiBlaXRoZXIgdmFsMSBvcgorICAvLyB2YWwyIGlzIE5hTiwgYXMgdGhlIElFRUUgZmxvYXRpbmctcG9pbnQgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdAorICAvLyBhbnkgcHJlZGljYXRlIGludm9sdmluZyBhIE5hTiBtdXN0IHJldHVybiBmYWxzZS4KKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDFfc3M7CisgIHZhbDFfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgIDw8IHZhbDE7CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwyX3NzOworICB2YWwyX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICA8PCB2YWwyOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgPD0gKCIgPDwgZXhwcjIgPDwgIilcbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMV9zcykgPDwgIiB2cyAiCisgICAgICA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMl9zcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0Fzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZmxvYXQ+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Cit9CisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZG91YmxlPihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEgd2l0aCBpbnQgb3IgZW51bQorLy8gYXJndW1lbnRzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCkgeworICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gQSBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHRoZSBoZWxwZXIgZnVuY3Rpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKKy8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/IHdpdGggaW50ZWdlciBvciBlbnVtIGFyZ3VtZW50cy4gIEl0IGlzIGhlcmUKKy8vIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUgb2Ygc2ltaWxhciBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKSB7XAorICBpZiAodmFsMSBvcCB2YWwyKSB7XAorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAorICB9IGVsc2Uge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIFwKKyAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAorICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKKyAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCisgIH1cCit9CisKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVCB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8ICkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1Qgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApCisKKyN1bmRlZiBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfCisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7CisgIH0KK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKSB7CisgIGlmICghU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9IGVsc2UgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCisgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIikgKGlnbm9yaW5nIGNhc2UpLCBhY3R1YWw6IFwiIgorICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBJc1N1YlN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpLgorCisvLyBUaGlzIGdyb3VwIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHJldHVybiB0cnVlIGlmZiBuZWVkbGUgaXMgYQorLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrLiAgTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seS4KKworYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOworCisgIHJldHVybiBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKK30KKworYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOworCisgIHJldHVybiB3Y3NzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKK30KKworLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBlaXRoZXIgOjpzdGQ6OnN0cmluZyBvciA6OnN0ZDo6d3N0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIGhheXN0YWNrLmZpbmQobmVlZGxlKSAhPSBTdHJpbmdUeXBlOjpucG9zOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZWl0aGVyIElzU3Vic3RyaW5nKCkgb3IgSXNOb3RTdWJzdHJpbmcoKSwKKy8vIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyBwYXJhbWV0ZXIuCisvLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGNvbnN0IGNoYXIqLCBjb25zdCB3Y2hhcl90KiwgOjpzdGQ6OnN0cmluZywKKy8vIG9yIDo6c3RkOjp3c3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmdJbXBsKAorICAgIGJvb2wgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKKyAgaWYgKElzU3Vic3RyaW5nUHJlZChuZWVkbGUsIGhheXN0YWNrKSA9PSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICBjb25zdCBib29sIGlzX3dpZGVfc3RyaW5nID0gc2l6ZW9mKG5lZWRsZVswXSkgPiAxOworICBjb25zdCBjaGFyKiBjb25zdCBiZWdpbl9zdHJpbmdfcXVvdGUgPSBpc193aWRlX3N0cmluZyA/ICJMXCIiIDogIlwiIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIlZhbHVlIG9mOiAiIDw8IG5lZWRsZV9leHByIDw8ICJcbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgbmVlZGxlIDw8ICJcIlxuIgorICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IChleHBlY3RlZF90b19iZV9zdWJzdHJpbmcgPyAiIiA6ICJub3QgIikKKyAgICAgIDw8ICJhIHN1YnN0cmluZyBvZiAiIDw8IGhheXN0YWNrX2V4cHIgPDwgIlxuIgorICAgICAgPDwgIldoaWNoIGlzOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBoYXlzdGFjayA8PCAiXCIiOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhCisvLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2sgKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYKKy8vIG9ubHkpLCBhbmQgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBJc0hSRVNVTFR7U3VjY2Vzc0ZhaWx1cmV9IHByZWRpY2F0ZXMKK0Fzc2VydGlvblJlc3VsdCBIUkVTVUxURmFpbHVyZUhlbHBlcihjb25zdCBjaGFyKiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaHIpIHsgIC8vIE5PTElOVAorIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBzdXBwb3J0IEZvcm1hdE1lc3NhZ2UuCisgIGNvbnN0IGNoYXIgZXJyb3JfdGV4dFtdID0gIiI7CisKKyMgZWxzZQorCisgIC8vIExvb2tzIHVwIHRoZSBodW1hbi1yZWFkYWJsZSBzeXN0ZW0gbWVzc2FnZSBmb3IgdGhlIEhSRVNVTFQgY29kZQorICAvLyBhbmQgc2luY2Ugd2UncmUgbm90IHBhc3NpbmcgYW55IHBhcmFtcyB0byBGb3JtYXRNZXNzYWdlLCB3ZSBkb24ndAorICAvLyB3YW50IGluc2VydHMgZXhwYW5kZWQuCisgIGNvbnN0IERXT1JEIGtGbGFncyA9IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFM7CisgIGNvbnN0IERXT1JEIGtCdWZTaXplID0gNDA5NjsgIC8vIFN0cmluZzo6Rm9ybWF0IGNhbid0IGV4Y2VlZCB0aGlzIGxlbmd0aC4KKyAgLy8gR2V0cyB0aGUgc3lzdGVtJ3MgaHVtYW4gcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgZm9yIHRoaXMgSFJFU1VMVC4KKyAgY2hhciBlcnJvcl90ZXh0W2tCdWZTaXplXSA9IHsgJ1wwJyB9OworICBEV09SRCBtZXNzYWdlX2xlbmd0aCA9IDo6Rm9ybWF0TWVzc2FnZUEoa0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIHNvdXJjZSwgd2UncmUgYXNraW5nIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHIsICAvLyB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBsaW5lIHdpZHRoIHJlc3RyaWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGV4dCwgIC8vIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCdWZTaXplLCAgLy8gYnVmIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLy8gbm8gYXJndW1lbnRzIGZvciBpbnNlcnRzCisgIC8vIFRyaW1zIHRhaWxpbmcgd2hpdGUgc3BhY2UgKEZvcm1hdE1lc3NhZ2UgbGVhdmVzIGEgdHJhaWxpbmcgY3ItbGYpCisgIGZvciAoOyBtZXNzYWdlX2xlbmd0aCAmJiBJc1NwYWNlKGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSk7CisgICAgICAgICAgLS1tZXNzYWdlX2xlbmd0aCkgeworICAgIGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSA9ICdcMCc7CisgIH0KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICBjb25zdCBTdHJpbmcgZXJyb3JfaGV4KFN0cmluZzo6Rm9ybWF0KCIweCUwOFggIiwgaHIpKTsKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgZXJyb3JfdGV4dCA8PCAiXG4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgInN1Y2NlZWRzIiwgaHIpOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLCBsb25nIGhyKSB7ICAvLyBOT0xJTlQKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisgIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAiZmFpbHMiLCBocik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgVW5pY29kZSB0ZXh0ICh3aWRlIHN0cmluZ3MpIGluCisvLyBVVEYtOC4KKworLy8gQSBVbmljb2RlIGNvZGUtcG9pbnQgY2FuIGhhdmUgdXB0byAyMSBiaXRzLCBhbmQgaXMgZW5jb2RlZCBpbiBVVEYtOAorLy8gbGlrZSB0aGlzOgorLy8KKy8vIENvZGUtcG9pbnQgbGVuZ3RoICAgRW5jb2RpbmcKKy8vICAgMCAtICA3IGJpdHMgICAgICAgMHh4eHh4eHgKKy8vICAgOCAtIDExIGJpdHMgICAgICAgMTEweHh4eHggMTB4eHh4eHgKKy8vICAxMiAtIDE2IGJpdHMgICAgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKy8vICAxNyAtIDIxIGJpdHMgICAgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIG9uZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDEgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAgNykgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdHdvLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MiA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg1ICsgNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHRocmVlLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MyA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg0ICsgMio2KSkgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgZm91ci1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDQgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoMyArIDMqNikpIC0gMTsKKworLy8gQ2hvcHMgb2ZmIHRoZSBuIGxvd2VzdCBiaXRzIGZyb20gYSBiaXQgcGF0dGVybi4gIFJldHVybnMgdGhlIG4KKy8vIGxvd2VzdCBiaXRzLiAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIGJpdCBwYXR0ZXJuIHdpbGwgYmUKKy8vIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IG4gYml0cy4KK2lubGluZSBVSW50MzIgQ2hvcExvd0JpdHMoVUludDMyKiBiaXRzLCBpbnQgbikgeworICBjb25zdCBVSW50MzIgbG93X2JpdHMgPSAqYml0cyAmICgoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCBuKSAtIDEpOworICAqYml0cyA+Pj0gbjsKKyAgcmV0dXJuIGxvd19iaXRzOworfQorCisvLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQorLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCisvLyBUaGUgb3V0cHV0IGJ1ZmZlciBzdHIgbXVzdCBjb250YWludCBhdCBsZWFzdCAzMiBjaGFyYWN0ZXJzLgorLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBidWZmZXIuCisvLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuCitjaGFyKiBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQsIGNoYXIqIHN0cikgeworICBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MSkgeworICAgIHN0clsxXSA9ICdcMCc7CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweHh4eHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDIpIHsKKyAgICBzdHJbMl0gPSAnXDAnOworICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEMwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMHh4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MykgeworICAgIHN0clszXSA9ICdcMCc7CisgICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEUwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMTB4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50NCkgeworICAgIHN0cls0XSA9ICdcMCc7CisgICAgc3RyWzNdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhGMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTExMHh4eAorICB9IGVsc2UgeworICAgIC8vIFRoZSBsb25nZXN0IHN0cmluZyBTdHJpbmc6OkZvcm1hdCBjYW4gcHJvZHVjZSB3aGVuIGludm9rZWQKKyAgICAvLyB3aXRoIHRoZXNlIHBhcmFtZXRlcnMgaXMgMjggY2hhcmFjdGVyIGxvbmcgKG5vdCBpbmNsdWRpbmcKKyAgICAvLyB0aGUgdGVybWluYXRpbmcgbnVsIGNoYXJhY3RlcikuIFdlIGFyZSBhc2tpbmcgZm9yIDMyIGNoYXJhY3RlcgorICAgIC8vIGJ1ZmZlciBqdXN0IGluIGNhc2UuIFRoaXMgaXMgYWxzbyBlbm91Z2ggZm9yIHN0cm5jcHkgdG8KKyAgICAvLyBudWxsLXRlcm1pbmF0ZSB0aGUgZGVzdGluYXRpb24gc3RyaW5nLgorICAgIHBvc2l4OjpTdHJOQ3B5KAorICAgICAgICBzdHIsIFN0cmluZzo6Rm9ybWF0KCIoSW52YWxpZCBVbmljb2RlIDB4JVgpIiwgY29kZV9wb2ludCkuY19zdHIoKSwgMzIpOworICAgIHN0clszMV0gPSAnXDAnOyAgLy8gTWFrZXMgc3VyZSBubyBjaGFuZ2UgaW4gdGhlIGZvcm1hdCB0byBzdHJuY3B5IGxlYXZlcworICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3VsdCB1bnRlcm1pbmF0ZWQuCisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUgdGhlIHN5c3RlbQorLy8gdXNlcyBVVEYtMTYgZm9yIHdpZGUgc3RyaW5nIGVuY29kaW5nLiBBbGwgc3VwcG9ydGVkIHN5c3RlbXMKKy8vIHdpdGggMTYgYml0IHdjaGFyX3QgKFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykgZG8gdXNlIFVURi0xNi4KKworLy8gRGV0ZXJtaW5lcyBpZiB0aGUgYXJndW1lbnRzIGNvbnN0aXR1dGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisvLyBhbmQgdGh1cyBzaG91bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIHVzaW5nIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIuCitpbmxpbmUgYm9vbCBJc1V0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LCB3Y2hhcl90IHNlY29uZCkgeworICByZXR1cm4gc2l6ZW9mKHdjaGFyX3QpID09IDIgJiYKKyAgICAgIChmaXJzdCAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChzZWNvbmQgJiAweEZDMDApID09IDB4REMwMDsKK30KKworLy8gQ3JlYXRlcyBhIFVuaWNvZGUgY29kZSBwb2ludCBmcm9tIFVURjE2IHN1cnJvZ2F0ZSBwYWlyLgoraW5saW5lIFVJbnQzMiBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBzZWNvbmQpIHsKKyAgY29uc3QgVUludDMyIG1hc2sgPSAoMSA8PCAxMCkgLSAxOworICByZXR1cm4gKHNpemVvZih3Y2hhcl90KSA9PSAyKSA/CisgICAgICAoKChmaXJzdCAmIG1hc2spIDw8IDEwKSB8IChzZWNvbmQgJiBtYXNrKSkgKyAweDEwMDAwIDoKKyAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgY29uZGl0aW9uIGlzCisgICAgICAvLyBmYWxzZSwgYnV0IHdlIHByb3ZpZGUgYSBzZW5zaWJsZSBkZWZhdWx0IGluIGNhc2UgaXQgaXMuCisgICAgICBzdGF0aWNfY2FzdDxVSW50MzI+KGZpcnN0KTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBUaGUgd2lkZSBzdHJpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZW5jb2Rpbmc6CisvLyAgIFVURi0xNiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gMiAob24gV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKQorLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQorLy8gUGFyYW1ldGVyIHN0ciBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuCisvLyBQYXJhbWV0ZXIgbnVtX2NoYXJzIG1heSBhZGRpdGlvbmFsbHkgbGltaXQgdGhlIG51bWJlcgorLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nCisvLyBzaG91bGQgYmUgcHJvY2Vzc2VkLgorLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cworLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLiBJZiB0aGUgc3RyaW5nIGlzIGluIFVURjE2IGVuY29kaW5nCisvLyBhbmQgY29udGFpbnMgaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLCB2YWx1ZXMgaW4gdGhvc2UgcGFpcnMKKy8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4KK1N0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycykgeworICBpZiAobnVtX2NoYXJzID09IC0xKQorICAgIG51bV9jaGFycyA9IHN0YXRpY19jYXN0PGludD4od2NzbGVuKHN0cikpOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsKKworICAgIGlmIChzdHJbaV0gPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoaSArIDEgPCBudW1fY2hhcnMgJiYgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLCBzdHJbaSArIDFdKSkgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOworICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7CisgICAgfQorCisgICAgY2hhciBidWZmZXJbMzJdOyAgLy8gQ29kZVBvaW50VG9VdGY4IHJlcXVpcmVzIGEgYnVmZmVyIHRoaXMgYmlnLgorICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50LCBidWZmZXIpOworICB9CisgIHJldHVybiBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKy8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuCitTdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsKKyAgaWYgKHdpZGVfY19zdHIgPT0gTlVMTCkgcmV0dXJuIFN0cmluZygiKG51bGwpIik7CisKKyAgcmV0dXJuIFN0cmluZyhpbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmOCh3aWRlX2Nfc3RyLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFNpbWlsYXIgdG8gU2hvd1dpZGVDU3RyaW5nKCksIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gZW5jbG9zZXMKKy8vIHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGluIGRvdWJsZSBxdW90ZXMuCitTdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cikgeworICBpZiAod2lkZV9jX3N0ciA9PSBOVUxMKSByZXR1cm4gU3RyaW5nKCIobnVsbCkiKTsKKworICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIkxcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cikuY19zdHIoKSk7Cit9CisKKy8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisvLyBjb250ZW50LgorLy8KKy8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QgKiBsaHMsIGNvbnN0IHdjaGFyX3QgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgeworICBpZiAoIVN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nUXVvdGVkKHMxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZChzMik7Cit9CisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZQorLy8gdGhlIHNhbWUgY29udGVudC4KKy8vCisvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKy8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gcmhzID09IE5VTEw7CisgIGlmIChyaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwb3NpeDo6U3RyQ2FzZUNtcChsaHMsIHJocykgPT0gMDsKK30KKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgeworICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsKKworICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmV0dXJuIF93Y3NpY21wKGxocywgcmhzKSA9PSAwOworI2VsaWYgR1RFU1RfT1NfTElOVVggJiYgIUdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgcmV0dXJuIHdjc2Nhc2VjbXAobGhzLCByaHMpID09IDA7CisjZWxzZQorICAvLyBBbmRyb2lkLCBNYWMgT1MgWCBhbmQgQ3lnd2luIGRvbid0IGRlZmluZSB3Y3NjYXNlY21wLgorICAvLyBPdGhlciB1bmtub3duIE9TZXMgbWF5IG5vdCBkZWZpbmUgaXQgZWl0aGVyLgorICB3aW50X3QgbGVmdCwgcmlnaHQ7CisgIGRvIHsKKyAgICBsZWZ0ID0gdG93bG93ZXIoKmxocysrKTsKKyAgICByaWdodCA9IHRvd2xvd2VyKCpyaHMrKyk7CisgIH0gd2hpbGUgKGxlZnQgJiYgbGVmdCA9PSByaWdodCk7CisgIHJldHVybiBsZWZ0ID09IHJpZ2h0OworI2VuZGlmICAvLyBPUyBzZWxlY3RvcgorfQorCisvLyBDb21wYXJlcyB0aGlzIHdpdGggYW5vdGhlciBTdHJpbmcuCisvLyBSZXR1cm5zIDwgMCBpZiB0aGlzIGlzIGxlc3MgdGhhbiByaHMsIDAgaWYgdGhpcyBpcyBlcXVhbCB0byByaHMsIG9yID4gMAorLy8gaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gcmhzLgoraW50IFN0cmluZzo6Q29tcGFyZShjb25zdCBTdHJpbmcgJiByaHMpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGhzX2Nfc3RyID0gY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgcmhzX2Nfc3RyID0gcmhzLmNfc3RyKCk7CisKKyAgaWYgKGxoc19jX3N0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHJoc19jX3N0ciA9PSBOVUxMID8gMCA6IC0xOyAgLy8gTlVMTCA8IGFueXRoaW5nIGV4Y2VwdCBOVUxMCisgIH0gZWxzZSBpZiAocmhzX2Nfc3RyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGNvbnN0IHNpemVfdCBzaG9ydGVyX3N0cl9sZW4gPQorICAgICAgbGVuZ3RoKCkgPD0gcmhzLmxlbmd0aCgpID8gbGVuZ3RoKCkgOiByaHMubGVuZ3RoKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNob3J0ZXJfc3RyX2xlbjsgaSsrKSB7CisgICAgaWYgKGxoc19jX3N0cltpXSA8IHJoc19jX3N0cltpXSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAobGhzX2Nfc3RyW2ldID4gcmhzX2Nfc3RyW2ldKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChsZW5ndGgoKSA8IHJocy5sZW5ndGgoKSkgPyAtMSA6CisgICAgICAobGVuZ3RoKCkgPiByaHMubGVuZ3RoKCkpID8gMSA6IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXguICAqQW55KgorLy8gU3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYSBOVUxMIG9yIGVtcHR5IHN1ZmZpeC4KK2Jvb2wgU3RyaW5nOjpFbmRzV2l0aChjb25zdCBjaGFyKiBzdWZmaXgpIGNvbnN0IHsKKyAgaWYgKHN1ZmZpeCA9PSBOVUxMIHx8IENTdHJpbmdFcXVhbHMoc3VmZml4LCAiIikpIHJldHVybiB0cnVlOworCisgIGlmIChjX3N0cigpID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICBjb25zdCBzaXplX3QgdGhpc19sZW4gPSBzdHJsZW4oY19zdHIoKSk7CisgIGNvbnN0IHNpemVfdCBzdWZmaXhfbGVuID0gc3RybGVuKHN1ZmZpeCk7CisgIHJldHVybiAodGhpc19sZW4gPj0gc3VmZml4X2xlbikgJiYKKyAgICAgICAgIENTdHJpbmdFcXVhbHMoY19zdHIoKSArIHRoaXNfbGVuIC0gc3VmZml4X2xlbiwgc3VmZml4KTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcgY2FzZS4KKy8vIEFueSBTdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhIE5VTEwgb3IgZW1wdHkgc3VmZml4LgorYm9vbCBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKGNvbnN0IGNoYXIqIHN1ZmZpeCkgY29uc3QgeworICBpZiAoc3VmZml4ID09IE5VTEwgfHwgQ1N0cmluZ0VxdWFscyhzdWZmaXgsICIiKSkgcmV0dXJuIHRydWU7CisKKyAgaWYgKGNfc3RyKCkgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHNpemVfdCB0aGlzX2xlbiA9IHN0cmxlbihjX3N0cigpKTsKKyAgY29uc3Qgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgcmV0dXJuICh0aGlzX2xlbiA+PSBzdWZmaXhfbGVuKSAmJgorICAgICAgICAgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjX3N0cigpICsgdGhpc19sZW4gLSBzdWZmaXhfbGVuLCBzdWZmaXgpOworfQorCisvLyBGb3JtYXRzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYSBTdHJpbmcsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdAorLy8gc3BlYyBzdHJpbmcgYXMgZm9yIHByaW50Zi4KKy8vCisvLyBXZSBkbyBub3QgdXNlIHRoZSBTdHJpbmdQcmludGYgY2xhc3MgYXMgaXQgaXMgbm90IHVuaXZlcnNhbGx5CisvLyBhdmFpbGFibGUuCisvLworLy8gVGhlIHJlc3VsdCBpcyBsaW1pdGVkIHRvIDQwOTYgY2hhcmFjdGVycyAoaW5jbHVkaW5nIHRoZSB0YWlsaW5nIDApLgorLy8gSWYgNDA5NiBjaGFyYWN0ZXJzIGFyZSBub3QgZW5vdWdoIHRvIGZvcm1hdCB0aGUgaW5wdXQsIG9yIGlmCisvLyB0aGVyZSdzIGFuIGVycm9yLCAiPGZvcm1hdHRpbmcgZXJyb3Igb3IgYnVmZmVyIGV4Y2VlZGVkPiIgaXMKKy8vIHJldHVybmVkLgorU3RyaW5nIFN0cmluZzo6Rm9ybWF0KGNvbnN0IGNoYXIgKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgY2hhciBidWZmZXJbNDA5Nl07CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IHNpemVvZihidWZmZXIpL3NpemVvZihidWZmZXJbMF0pOworCisgIC8vIE1TVkMgOCBkZXByZWNhdGVzIHZzbnByaW50ZigpLCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcKKyAgLy8gNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikgdGhlcmUuCisjaWZkZWYgX01TQ19WRVIgIC8vIFdlIGFyZSB1c2luZyBNU1ZDLgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYuCisKKyAgY29uc3QgaW50IHNpemUgPSB2c25wcmludGYoYnVmZmVyLCBrQnVmZmVyU2l6ZSwgZm9ybWF0LCBhcmdzKTsKKworIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbHNlICAvLyBXZSBhcmUgbm90IHVzaW5nIE1TVkMuCisgIGNvbnN0IGludCBzaXplID0gdnNucHJpbnRmKGJ1ZmZlciwga0J1ZmZlclNpemUsIGZvcm1hdCwgYXJncyk7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisgIHZhX2VuZChhcmdzKTsKKworICAvLyB2c25wcmludGYoKSdzIGJlaGF2aW9yIGlzIG5vdCBwb3J0YWJsZS4gIFdoZW4gdGhlIGJ1ZmZlciBpcyBub3QKKyAgLy8gYmlnIGVub3VnaCwgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGluIE1TVkMsIGFuZCByZXR1cm5zIHRoZQorICAvLyBuZWVkZWQgYnVmZmVyIHNpemUgb24gTGludXguICBXaGVuIHRoZXJlIGlzIGFuIG91dHB1dCBlcnJvciwgaXQKKyAgLy8gYWx3YXlzIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEZvciBzaW1wbGljaXR5LCB3ZSBsdW1wIHRoZSB0d28KKyAgLy8gZXJyb3IgY2FzZXMgdG9nZXRoZXIuCisgIGlmIChzaXplIDwgMCB8fCBzaXplID49IGtCdWZmZXJTaXplKSB7CisgICAgcmV0dXJuIFN0cmluZygiPGZvcm1hdHRpbmcgZXJyb3Igb3IgYnVmZmVyIGV4Y2VlZGVkPiIpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpbmcoYnVmZmVyLCBzaXplKTsKKyAgfQorfQorCisvLyBDb252ZXJ0cyB0aGUgYnVmZmVyIGluIGEgc3RyaW5nc3RyZWFtIHRvIGEgU3RyaW5nLCBjb252ZXJ0aW5nIE5VTAorLy8gYnl0ZXMgdG8gIlxcMCIgYWxvbmcgdGhlIHdheS4KK1N0cmluZyBTdHJpbmdTdHJlYW1Ub1N0cmluZyg6OnN0ZDo6c3RyaW5nc3RyZWFtKiBzcykgeworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIgPSBzcy0+c3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXJ0ID0gc3RyLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyLmxlbmd0aCgpOworCisgIC8vIFdlIG5lZWQgdG8gdXNlIGEgaGVscGVyIHN0cmluZ3N0cmVhbSB0byBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uCisgIC8vIGJlY2F1c2UgU3RyaW5nIGRvZXNuJ3Qgc3VwcG9ydCBwdXNoX2JhY2soKS4KKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBoZWxwZXI7CisgIGZvciAoY29uc3QgY2hhciogY2ggPSBzdGFydDsgY2ggIT0gZW5kOyArK2NoKSB7CisgICAgaWYgKCpjaCA9PSAnXDAnKSB7CisgICAgICBoZWxwZXIgPDwgIlxcMCI7ICAvLyBSZXBsYWNlcyBOVUwgd2l0aCAiXFwwIjsKKyAgICB9IGVsc2UgeworICAgICAgaGVscGVyLnB1dCgqY2gpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTdHJpbmcoaGVscGVyLnN0cigpLmNfc3RyKCkpOworfQorCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorU3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKGNvbnN0IFN0cmluZyYgZ3Rlc3RfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKSB7CisgIC8vIEFwcGVuZHMgdGhlIHVzZXIgbWVzc2FnZSBpZiBpdCdzIG5vbi1lbXB0eS4KKyAgY29uc3QgU3RyaW5nIHVzZXJfbXNnX3N0cmluZyA9IHVzZXJfbXNnLkdldFN0cmluZygpOworICBpZiAodXNlcl9tc2dfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gZ3Rlc3RfbXNnOworICB9CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBndGVzdF9tc2cgPDwgIlxuIiA8PCB1c2VyX21zZ19zdHJpbmc7CisKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RSZXN1bHQKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorVGVzdFJlc3VsdDo6VGVzdFJlc3VsdCgpCisgICAgOiBkZWF0aF90ZXN0X2NvdW50XygwKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEJ3Rvci4KK1Rlc3RSZXN1bHQ6On5UZXN0UmVzdWx0KCkgeworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbgorLy8gcmFuZ2UgZnJvbSAwIHRvIHRvdGFsX3BhcnRfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsCisvLyBhYm9ydHMgdGhlIHByb2dyYW0uCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0IHsKKyAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxfcGFydF9jb3VudCgpKQorICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXy5hdChpKTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKKy8vIHByb2dyYW0uCitjb25zdCBUZXN0UHJvcGVydHkmIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3QgeworICBpZiAoaSA8IDAgfHwgaSA+PSB0ZXN0X3Byb3BlcnR5X2NvdW50KCkpCisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXy5hdChpKTsKK30KKworLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworfQorCisvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KK3ZvaWQgVGVzdFJlc3VsdDo6QWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgdGVzdF9wYXJ0X3Jlc3VsdHNfLnB1c2hfYmFjayh0ZXN0X3BhcnRfcmVzdWx0KTsKK30KKworLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgYXMgdGhlCisvLyBzdXBwbGllZCBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkLCB0aGUgdmFsdWUgb2YgdGhpcyB0ZXN0X3Byb3BlcnR5CisvLyByZXBsYWNlcyB0aGUgb2xkIHZhbHVlIGZvciB0aGF0IGtleS4KK3ZvaWQgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGlmICghVmFsaWRhdGVUZXN0UHJvcGVydHkodGVzdF9wcm9wZXJ0eSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZ0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6aXRlcmF0b3IgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPQorICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfcHJvcGVydGllc18uYmVnaW4oKSwgdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdFByb3BlcnR5S2V5SXModGVzdF9wcm9wZXJ0eS5rZXkoKSkpOworICBpZiAocHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPT0gdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSkgeworICAgIHRlc3RfcHJvcGVydGllc18ucHVzaF9iYWNrKHRlc3RfcHJvcGVydHkpOworICAgIHJldHVybjsKKyAgfQorICBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleS0+U2V0VmFsdWUodGVzdF9wcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiBHb29nbGUgVGVzdAorLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCitib29sIFRlc3RSZXN1bHQ6OlZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgeworICBpbnRlcm5hbDo6U3RyaW5nIGtleSh0ZXN0X3Byb3BlcnR5LmtleSgpKTsKKyAgaWYgKGtleSA9PSAibmFtZSIgfHwga2V5ID09ICJzdGF0dXMiIHx8IGtleSA9PSAidGltZSIgfHwga2V5ID09ICJjbGFzc25hbWUiKSB7CisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiUmVzZXJ2ZWQga2V5IHVzZWQgaW4gUmVjb3JkUHJvcGVydHkoKTogIgorICAgICAgICA8PCBrZXkKKyAgICAgICAgPDwgIiAoJ25hbWUnLCAnc3RhdHVzJywgJ3RpbWUnLCBhbmQgJ2NsYXNzbmFtZScgYXJlIHJlc2VydmVkIGJ5ICIKKyAgICAgICAgPDwgR1RFU1RfTkFNRV8gPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ2xlYXJzIHRoZSBvYmplY3QuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKKyAgdGVzdF9wcm9wZXJ0aWVzXy5jbGVhcigpOworICBkZWF0aF90ZXN0X2NvdW50XyA9IDA7CisgIGVsYXBzZWRfdGltZV8gPSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6RmFpbGVkKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEdldFRlc3RQYXJ0UmVzdWx0KGkpLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0UGFydEZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gcmVzdWx0LmZhdGFsbHlfZmFpbGVkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCitib29sIFRlc3RSZXN1bHQ6Okhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydEZhdGFsbHlGYWlsZWQpID4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IG5vbi1mYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQubm9uZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgoraW50IFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcGFydF9yZXN1bHRzXy5zaXplKCkpOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KK2ludCBUZXN0UmVzdWx0Ojp0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3Byb3BlcnRpZXNfLnNpemUoKSk7Cit9CisKKy8vIGNsYXNzIFRlc3QKKworLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0LgorCisvLyBUaGUgYyd0b3Igc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0OjpUZXN0KCkKKyAgICA6IGd0ZXN0X2ZsYWdfc2F2ZXJfKG5ldyBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIpIHsKK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorVGVzdDo6flRlc3QoKSB7CisgIGRlbGV0ZSBndGVzdF9mbGFnX3NhdmVyXzsKK30KKworLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpTZXRVcCgpIHsKK30KKworLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpUZWFyRG93bigpIHsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3Qoa2V5LCB2YWx1ZSk7Cit9CisKKy8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgordm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSkgeworICBNZXNzYWdlIHZhbHVlX21lc3NhZ2U7CisgIHZhbHVlX21lc3NhZ2UgPDwgdmFsdWU7CisgIFJlY29yZFByb3BlcnR5KGtleSwgdmFsdWVfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIGZyaWVuZCBvZiBVbml0VGVzdCBhbmQgYXMgc3VjaCBoYXMgYWNjZXNzIHRvCisgIC8vIEFkZFRlc3RQYXJ0UmVzdWx0LgorICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkVGVzdFBhcnRSZXN1bHQoCisgICAgICByZXN1bHRfdHlwZSwKKyAgICAgIE5VTEwsICAvLyBObyBpbmZvIGFib3V0IHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAgLTEsICAgIC8vIFdlIGhhdmUgbm8gaW5mbyBvbiB3aGljaCBsaW5lIGNhdXNlZCB0aGUgZXhjZXB0aW9uLgorICAgICAgbWVzc2FnZSwKKyAgICAgIFN0cmluZygpKTsgIC8vIE5vIHN0YWNrIHRyYWNlLCBlaXRoZXIuCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBHb29nbGUgVGVzdCByZXF1aXJlcyBhbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIHRvIHVzZSB0aGUgc2FtZSB0ZXN0CisvLyBmaXh0dXJlIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlCisvLyBzYW1lIGZpeHR1cmUgY2xhc3MgYXMgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLiAgSWYKKy8vIHllcywgaXQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgaXQgZ2VuZXJhdGVzIGEgR29vZ2xlIFRlc3QgZmFpbHVyZSBhbmQKKy8vIHJldHVybnMgZmFsc2UuCitib29sIFRlc3Q6Okhhc1NhbWVGaXh0dXJlQ2xhc3MoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBpbXBsLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworCisgIC8vIEluZm8gYWJvdXQgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpWzBdOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpcnN0X2ZpeHR1cmVfaWQgPSBmaXJzdF90ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCBmaXJzdF90ZXN0X25hbWUgPSBmaXJzdF90ZXN0X2luZm8tPm5hbWUoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0aGlzX3Rlc3RfaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCB0aGlzX3Rlc3RfbmFtZSA9IHRoaXNfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgaWYgKHRoaXNfZml4dHVyZV9pZCAhPSBmaXJzdF9maXh0dXJlX2lkKSB7CisgICAgLy8gSXMgdGhlIGZpcnN0IHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgZmlyc3RfaXNfVEVTVCA9IGZpcnN0X2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKKyAgICAvLyBJcyB0aGlzIHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgdGhpc19pc19URVNUID0gdGhpc19maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisKKyAgICBpZiAoZmlyc3RfaXNfVEVTVCB8fCB0aGlzX2lzX1RFU1QpIHsKKyAgICAgIC8vIFRoZSB1c2VyIG1peGVkIFRFU1QgYW5kIFRFU1RfRiBpbiB0aGlzIHRlc3QgY2FzZSAtIHdlJ2xsIHRlbGwKKyAgICAgIC8vIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKworICAgICAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVEVTVCBhbmQgdGhlIG5hbWUgb2YgdGhlIFRFU1RfRi4gIE5vdGUKKyAgICAgIC8vIHRoYXQgZmlyc3RfaXNfVEVTVCBhbmQgdGhpc19pc19URVNUIGNhbm5vdCBib3RoIGJlIHRydWUsIGFzCisgICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4KKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfbmFtZSA9CisgICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IGZpcnN0X3Rlc3RfbmFtZSA6IHRoaXNfdGVzdF9uYW1lOworICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQorICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyB0aGlzX3Rlc3RfbmFtZSA6IGZpcnN0X3Rlc3RfbmFtZTsKKworICAgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgICAgIDw8ICJjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXNcbiIKKyAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpCisgICAgICAgICAgPDwgIixcbiIKKyAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfRl9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0XG4iCisgICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiIKKyAgICAgICAgICA8PCAid2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0XG4iCisgICAgICAgICAgPDwgImNhc2UuIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIHVzZXIgZGVmaW5lZCB0d28gZml4dHVyZSBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbgorICAgICAgLy8gdHdvIG5hbWVzcGFjZXMgLSB3ZSdsbCB0ZWxsIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKyAgICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iCisgICAgICAgICAgPDwgInlvdSBkZWZpbmVkIHRlc3QgIiA8PCBmaXJzdF90ZXN0X25hbWUKKyAgICAgICAgICA8PCAiIGFuZCB0ZXN0ICIgPDwgdGhpc190ZXN0X25hbWUgPDwgIlxuIgorICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iCisgICAgICAgICAgPDwgInRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvblxuIgorICAgICAgICAgIDw8ICJ1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lXG4iCisgICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEdURVNUX0hBU19TRUgKKworLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LiAgVGhpcworLy8gZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0IHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIHBvaW50ZXIgYmVjYXVzZSBWQysrCisvLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucworLy8gdXNpbmcgX190cnkgKHNlZSBlcnJvciBDMjcxMikuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyogRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZShEV09SRCBleGNlcHRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZSA8PCAiU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgiIDw8IHN0ZDo6c2V0YmFzZSgxNikgPDwKKyAgICBleGNlcHRpb25fY29kZSA8PCBzdGQ6OnNldGJhc2UoMTApIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOworCisgIHJldHVybiBuZXcgaW50ZXJuYWw6OlN0cmluZyhtZXNzYWdlLkdldFN0cmluZygpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICBNZXNzYWdlIG1lc3NhZ2U7CisgIGlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7CisgICAgbWVzc2FnZSA8PCAiQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uIFwiIiA8PCBkZXNjcmlwdGlvbiA8PCAiXCIiOworICB9IGVsc2UgeworICAgIG1lc3NhZ2UgPDwgIlVua25vd24gQysrIGV4Y2VwdGlvbiI7CisgIH0KKyAgbWVzc2FnZSA8PCAiIHRocm93biBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKKworICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsKK30KKworc3RhdGljIGludGVybmFsOjpTdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKKworLy8gQSBmYWlsZWQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIHRoaXMgdHlwZSB3aGVuCisvLyBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpIGlzIHRydWUgKGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQpLiAgV2UKKy8vIGRlcml2ZSBpdCBmcm9tIHN0ZDo6cnVudGltZV9lcnJvciwgd2hpY2ggaXMgZm9yIGVycm9ycyBwcmVzdW1hYmx5CisvLyBkZXRlY3RhYmxlIG9ubHkgYXQgcnVuIHRpbWUuICBTaW5jZSBzdGQ6OnJ1bnRpbWVfZXJyb3IgaW5oZXJpdHMgZnJvbQorLy8gc3RkOjpleGNlcHRpb24sIG1hbnkgdGVzdGluZyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZQorLy8gbWVzc2FnZSBpbnNpZGUgaXQuCitjbGFzcyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiA6IHB1YmxpYyA6OnN0ZDo6cnVudGltZV9lcnJvciB7CisgcHVibGljOgorICBleHBsaWNpdCBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSkKKyAgICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9Cit9OworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gV2UgcHV0IHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSBhcyBJQk0ncyB4bEMKKy8vIGNvbXBpbGVyIHJlamVjdHMgdGhlIGNvZGUgaWYgdGhleSB3ZXJlIGRlY2xhcmVkIHN0YXRpYy4KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBoYW5kbGVzIFNFSCBleGNlcHRpb25zIGl0IHRocm93cywgd2hlbgorLy8gU0VIIGlzIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZSBSZXN1bHQgaW4gY2FzZSBvZiBhbgorLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysKKy8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGVyZWZvcmUsIHdlIHByb3ZpZGUgYSBzZXBhcmF0ZQorLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgU0VIIGV4Y2VwdGlvbnMuKQordGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KK1Jlc3VsdCBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyNpZiBHVEVTVF9IQVNfU0VICisgIF9fdHJ5IHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UCisgICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7CisgICAgLy8gV2UgY3JlYXRlIHRoZSBleGNlcHRpb24gbWVzc2FnZSBvbiB0aGUgaGVhcCBiZWNhdXNlIFZDKysgcHJvaGliaXRzCisgICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQorICAgIC8vIChzZWUgZXJyb3IgQzI3MTIpLgorICAgIGludGVybmFsOjpTdHJpbmcqIGV4Y2VwdGlvbl9tZXNzYWdlID0gRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZSgKKyAgICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpLCBsb2NhdGlvbik7CisgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb25fbWVzc2FnZSk7CisgICAgZGVsZXRlIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworICB9CisjZWxzZQorICAodm9pZClsb2NhdGlvbjsKKyAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKK30KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBjYXRjaGVzIGFuZCByZXBvcnRzIEMrKyBhbmQvb3IgU0VILXN0eWxlCisvLyBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQ7IHJldHVybnMgdGhlIDAtdmFsdWUgZm9yIHR5cGUKKy8vIFJlc3VsdCBpbiBjYXNlIG9mIGFuIFNFSCBleGNlcHRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgUmVzdWx0PgorUmVzdWx0IEhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICAvLyBOT1RFOiBUaGUgdXNlciBjb2RlIGNhbiBhZmZlY3QgdGhlIHdheSBpbiB3aGljaCBHb29nbGUgVGVzdCBoYW5kbGVzCisgIC8vIGV4Y2VwdGlvbnMgYnkgc2V0dGluZyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpLCBidXQgb25seSBiZWZvcmUKKyAgLy8gUlVOX0FMTF9URVNUUygpIHN0YXJ0cy4gSXQgaXMgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gY2hlY2sgdGhlIGZsYWcKKyAgLy8gYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYW5kIGVpdGhlciByZXBvcnQgb3IgcmUtdGhyb3cgdGhlCisgIC8vIGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZmxhZydzIHZhbHVlOgorICAvLworICAvLyB0cnkgeworICAvLyAgIC8vIFBlcmZvcm0gdGhlIHRlc3QgbWV0aG9kLgorICAvLyB9IGNhdGNoICguLi4pIHsKKyAgLy8gICBpZiAoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKKyAgLy8gICAgIC8vIFJlcG9ydCB0aGUgZXhjZXB0aW9uIGFzIGZhaWx1cmUuCisgIC8vICAgZWxzZQorICAvLyAgICAgdGhyb3c7ICAvLyBSZS10aHJvd3MgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4KKyAgLy8gfQorICAvLworICAvLyBIb3dldmVyLCB0aGUgcHVycG9zZSBvZiB0aGlzIGZsYWcgaXMgdG8gYWxsb3cgdGhlIHByb2dyYW0gdG8gZHJvcCBpbnRvCisgIC8vIHRoZSBkZWJ1Z2dlciB3aGVuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBPbiBtb3N0IHBsYXRmb3Jtcywgb25jZSB0aGUKKyAgLy8gY29udHJvbCBlbnRlcnMgdGhlIGNhdGNoIGJsb2NrLCB0aGUgZXhjZXB0aW9uIG9yaWdpbiBpbmZvcm1hdGlvbiBpcworICAvLyBsb3N0IGFuZCB0aGUgZGVidWdnZXIgd2lsbCBzdG9wIHRoZSBwcm9ncmFtIGF0IHRoZSBwb2ludCBvZiB0aGUKKyAgLy8gcmUtdGhyb3cgaW4gdGhpcyBmdW5jdGlvbiAtLSBpbnN0ZWFkIG9mIGF0IHRoZSBwb2ludCBvZiB0aGUgb3JpZ2luYWwKKyAgLy8gdGhyb3cgc3RhdGVtZW50IGluIHRoZSBjb2RlIHVuZGVyIHRlc3QuICBGb3IgdGhpcyByZWFzb24sIHdlIHBlcmZvcm0KKyAgLy8gdGhlIGNoZWNrIGVhcmx5LCBzYWNyaWZpY2luZyB0aGUgYWJpbGl0eSB0byBhZmZlY3QgR29vZ2xlIFRlc3QncworICAvLyBleGNlcHRpb24gaGFuZGxpbmcgaW4gdGhlIG1ldGhvZCB3aGVyZSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgaWYgKGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7CisgICAgfSBjYXRjaCAoY29uc3QgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24mKSB7ICAvLyBOT0xJTlQKKyAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIGRvZXNuJ3Qgb3JpZ2luYXRlIGluIGNvZGUgdW5kZXIgdGVzdC4gSXQgbWFrZXMgbm8KKyAgICAgIC8vIHNlbnNlIHRvIHJlcG9ydCBpdCBhcyBhIHRlc3QgZmFpbHVyZS4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7ICAvLyBOT0xJTlQKKyAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShlLndoYXQoKSwgbG9jYXRpb24pKTsKKyAgICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAorICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKE5VTEwsIGxvY2F0aW9uKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworI2Vsc2UKKyAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gUnVucyB0aGUgdGVzdCBhbmQgdXBkYXRlcyB0aGUgdGVzdCByZXN1bHQuCit2b2lkIFRlc3Q6OlJ1bigpIHsKKyAgaWYgKCFIYXNTYW1lRml4dHVyZUNsYXNzKCkpIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQodGhpcywgJlRlc3Q6OlNldFVwLCAiU2V0VXAoKSIpOworICAvLyBXZSB3aWxsIHJ1biB0aGUgdGVzdCBvbmx5IGlmIFNldFVwKCkgd2FzIHN1Y2Nlc3NmdWwuCisgIGlmICghSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICAgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgICAgdGhpcywgJlRlc3Q6OlRlc3RCb2R5LCAidGhlIHRlc3QgYm9keSIpOworICB9CisKKyAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSGVuY2Ugd2Ugd2lsbAorICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMKKyAgLy8gZmFpbGVkLgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdDo6VGVhckRvd24sICJUZWFyRG93bigpIik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+SGFzRmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPgorICAgICAgSGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIGNsYXNzIFRlc3RJbmZvCisKKy8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIEl0IGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSB0ZXN0IGZhY3RvcnkKKy8vIG9iamVjdC4KKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgYV90ZXN0X2Nhc2VfbmFtZSBhbmQgYV9uYW1lIGNvbnN0IHN0cmluZyYncworLy8gdG8gc2lnbmlmeSB0aGV5IGNhbm5vdCBiZSBOVUxMcy4KK1Rlc3RJbmZvOjpUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkKKyAgICA6IHRlc3RfY2FzZV9uYW1lXyhhX3Rlc3RfY2FzZV9uYW1lKSwKKyAgICAgIG5hbWVfKGFfbmFtZSksCisgICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgdmFsdWVfcGFyYW1fKGFfdmFsdWVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV92YWx1ZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIGZpeHR1cmVfY2xhc3NfaWRfKGZpeHR1cmVfY2xhc3NfaWQpLAorICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAorICAgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwKKyAgICAgIG1hdGNoZXNfZmlsdGVyXyhmYWxzZSksCisgICAgICBmYWN0b3J5XyhmYWN0b3J5KSwKKyAgICAgIHJlc3VsdF8oKSB7fQorCisvLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuCitUZXN0SW5mbzo6flRlc3RJbmZvKCkgeyBkZWxldGUgZmFjdG9yeV87IH0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OworLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKKy8vICAgdHlwZV9wYXJhbTogICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIHZhbHVlX3BhcmFtOiAgICAgIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QncyB2YWx1ZSBwYXJhbWV0ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK1Rlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSB7CisgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBmaXh0dXJlX2NsYXNzX2lkLCBmYWN0b3J5KTsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPkFkZFRlc3RJbmZvKHNldF91cF90YywgdGVhcl9kb3duX3RjLCB0ZXN0X2luZm8pOworICByZXR1cm4gdGVzdF9pbmZvOworfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKK3ZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBNZXNzYWdlIGVycm9yczsKKyAgZXJyb3JzCisgICAgICA8PCAiQXR0ZW1wdGVkIHJlZGVmaW5pdGlvbiBvZiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLlxuIgorICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLCB5b3UgdHJpZWRcbiIKKyAgICAgIDw8ICJ0byBkZWZpbmUgYSB0ZXN0IHVzaW5nIGEgZml4dHVyZSBjbGFzcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lXG4iCisgICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iCisgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBZb3Ugc2hvdWxkXG4iCisgICAgICA8PCAicHJvYmFibHkgcmVuYW1lIG9uZSBvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50XG4iCisgICAgICA8PCAidGVzdCBjYXNlcy4iOworCisgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICBlcnJvcnMuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgeworCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgdGVzdCBuYW1lIG9mIGEgVGVzdEluZm8gYWdhaW5zdCBhIGtub3duCisvLyB2YWx1ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZXN0Q2FzZSBjbGFzcyBvbmx5LiAgV2UgcHV0CisvLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKKy8vIG5hbWVzcGFjZS4KKy8vCisvLyBUZXN0TmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdE5hbWVJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gVGVzdE5hbWVJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdE5hbWVJcyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0X2luZm8gbWF0Y2hlcyBuYW1lXy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfaW5mbyAmJiBpbnRlcm5hbDo6U3RyaW5nKHRlc3RfaW5mby0+bmFtZSgpKS5Db21wYXJlKG5hbWVfKSA9PSAwOworICB9CisKKyBwcml2YXRlOgorICBpbnRlcm5hbDo6U3RyaW5nIG5hbWVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1AKKy8vIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBpbnRvIHJlZ3VsYXIgdGVzdHMgYW5kIHJlZ2lzdGVycyB0aG9zZS4KKy8vIFRoaXMgd2lsbCBiZSBkb25lIGp1c3Qgb25jZSBkdXJpbmcgdGhlIHByb2dyYW0gcnVudGltZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBpZiAoIXBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8pIHsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKKyAgfQorI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgorLy8gZGVsZXRlcyBpdC4KK3ZvaWQgVGVzdEluZm86OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHdoZXJlIHRvIHN0b3JlIHRlc3QgcmVzdWx0LgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQuCisgIHJlcGVhdGVyLT5PblRlc3RTdGFydCgqdGhpcyk7CisKKyAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCisgIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICBmYWN0b3J5XywgJmludGVybmFsOjpUZXN0RmFjdG9yeUJhc2U6OkNyZWF0ZVRlc3QsCisgICAgICAidGhlIHRlc3QgZml4dHVyZSdzIGNvbnN0cnVjdG9yIik7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSB0ZXN0IG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaXRzCisgIC8vIGNvbnN0cnVjdG9yIGRpZG4ndCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCisgIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAvLyBUaGlzIGRvZXNuJ3QgdGhyb3cgYXMgYWxsIHVzZXIgY29kZSB0aGF0IGNhbiB0aHJvdyBhcmUgd3JhcHBlZCBpbnRvCisgICAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUuCisgICAgdGVzdC0+UnVuKCk7CisgIH0KKworICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsKKworICByZXN1bHRfLnNldF9lbGFwc2VkX3RpbWUoaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCisgIHJlcGVhdGVyLT5PblRlc3RFbmQoKnRoaXMpOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcworICAvLyB0ZXN0LgorICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Cit9CisKKy8vIGNsYXNzIFRlc3RDYXNlCisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOworfQorCitpbnQgVGVzdENhc2U6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdERpc2FibGVkKTsKK30KKworLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgoraW50IFRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBTaG91bGRSdW5UZXN0KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9pbmZvX2xpc3RfLnNpemUoKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2U6OlRlc3RDYXNlKGNvbnN0IGNoYXIqIGFfbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpCisgICAgOiBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwKKyAgICAgIHRlYXJfZG93bl90Y18odGVhcl9kb3duX3RjKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorVGVzdENhc2U6On5UZXN0Q2FzZSgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0IGluIHRoZSBjb2xsZWN0aW9uLgorICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0SW5mbyogVGVzdENhc2U6OkdldFRlc3RJbmZvKGludCBpKSBjb25zdCB7CisgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7CisgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBBZGRzIGEgdGVzdCB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSB0ZXN0IHVwb24KKy8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCit2b2lkIFRlc3RDYXNlOjpBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbykgeworICB0ZXN0X2luZm9fbGlzdF8ucHVzaF9iYWNrKHRlc3RfaW5mbyk7CisgIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsKK30KKworLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCit2b2lkIFRlc3RDYXNlOjpSdW4oKSB7CisgIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UodGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7CisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOworCisgIGNvbnN0IGludGVybmFsOjpUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsKKyAgICBHZXRNdXRhYmxlVGVzdEluZm8oaSktPlJ1bigpOworICB9CisgIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blRlYXJEb3duVGVzdENhc2UsICJUZWFyRG93blRlc3RDYXNlKCkiKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKK30KKworLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgeworICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgVGVzdEluZm86OkNsZWFyVGVzdFJlc3VsdCk7Cit9CisKKy8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OlNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pIHsKKyAgU2h1ZmZsZShyYW5kb20sICZ0ZXN0X2luZGljZXNfKTsKK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgordm9pZCBUZXN0Q2FzZTo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9pbmRpY2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICB9Cit9CisKKy8vIEZvcm1hdHMgYSBjb3VudGFibGUgbm91bi4gIERlcGVuZGluZyBvbiBpdHMgcXVhbnRpdHksIGVpdGhlciB0aGUKKy8vIHNpbmd1bGFyIGZvcm0gb3IgdGhlIHBsdXJhbCBmb3JtIGlzIHVzZWQuIGUuZy4KKy8vCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDEsICJmb3JtdWxhIiwgImZvcm11bGkiKSByZXR1cm5zICIxIGZvcm11bGEiLgorLy8gRm9ybWF0Q291bnRhYmxlTm91big1LCAiYm9vayIsICJib29rcyIpIHJldHVybnMgIjUgYm9va3MiLgorc3RhdGljIGludGVybmFsOjpTdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzaW5ndWxhcl9mb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogcGx1cmFsX2Zvcm0pIHsKKyAgcmV0dXJuIGludGVybmFsOjpTdHJpbmc6OkZvcm1hdCgiJWQgJXMiLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9PSAxID8gc2luZ3VsYXJfZm9ybSA6IHBsdXJhbF9mb3JtKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdHMuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KK3N0YXRpYyBpbnRlcm5hbDo6U3RyaW5nIEZvcm1hdFRlc3RDYXNlQ291bnQoaW50IHRlc3RfY2FzZV9jb3VudCkgeworICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2VfY291bnQsICJ0ZXN0IGNhc2UiLCAidGVzdCBjYXNlcyIpOworfQorCisvLyBDb252ZXJ0cyBhIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGVudW0gdG8gaHVtYW4tZnJpZW5kbHkgc3RyaW5nCisvLyByZXByZXNlbnRhdGlvbi4gIEJvdGgga05vbkZhdGFsRmFpbHVyZSBhbmQga0ZhdGFsRmFpbHVyZSBhcmUgdHJhbnNsYXRlZAorLy8gdG8gIkZhaWx1cmUiLCBhcyB0aGUgdXNlciB1c3VhbGx5IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZQorLy8gYmV0d2VlbiB0aGUgdHdvIHdoZW4gdmlld2luZyB0aGUgdGVzdCByZXN1bHQuCitzdGF0aWMgY29uc3QgY2hhciAqIFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3M6CisgICAgICByZXR1cm4gIlN1Y2Nlc3MiOworCisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZToKKyAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlOgorI2lmZGVmIF9NU0NfVkVSCisgICAgICByZXR1cm4gImVycm9yOiAiOworI2Vsc2UKKyAgICAgIHJldHVybiAiRmFpbHVyZVxuIjsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIlVua25vd24gcmVzdWx0IHR5cGUiOworICB9Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IHRvIGEgU3RyaW5nLgorc3RhdGljIGludGVybmFsOjpTdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIHJldHVybiAoTWVzc2FnZSgpCisgICAgICAgICAgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpKQorICAgICAgICAgIDw8ICIgIiA8PCBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LnR5cGUoKSkKKyAgICAgICAgICA8PCB0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0Lgorc3RhdGljIHZvaWQgUHJpbnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICBjb25zdCBpbnRlcm5hbDo6U3RyaW5nJiByZXN1bHQgPQorICAgICAgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOworICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKKyAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAorICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBsb2NhdGlvbjsgb3RoZXJ3aXNlIHRoZXkgZG8gbm90aGluZy4KKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXZSBkb24ndCBjYWxsIE91dHB1dERlYnVnU3RyaW5nKigpIG9uIFdpbmRvd3MgTW9iaWxlLCBhcyBwcmludGluZworICAvLyB0byBzdGRvdXQgaXMgZG9uZSBieSBPdXRwdXREZWJ1Z1N0cmluZygpIHRoZXJlIGFscmVhZHkgLSB3ZSBkb24ndAorICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4KKyAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EocmVzdWx0LmNfc3RyKCkpOworICA6Ok91dHB1dERlYnVnU3RyaW5nQSgiXG4iKTsKKyNlbmRpZgorfQorCisvLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworZW51bSBHVGVzdENvbG9yIHsKKyAgQ09MT1JfREVGQVVMVCwKKyAgQ09MT1JfUkVELAorICBDT0xPUl9HUkVFTiwKKyAgQ09MT1JfWUVMTE9XCit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yLgorV09SRCBHZXRDb2xvckF0dHJpYnV0ZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgcmV0dXJuIEZPUkVHUk9VTkRfUkVEOworICAgIGNhc2UgQ09MT1JfR1JFRU46ICByZXR1cm4gRk9SRUdST1VORF9HUkVFTjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzogcmV0dXJuIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2Vsc2UKKworLy8gUmV0dXJucyB0aGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gY29sb3IuICBDT0xPUl9ERUZBVUxUIGlzCisvLyBhbiBpbnZhbGlkIGlucHV0LgorY29uc3QgY2hhciogR2V0QW5zaUNvbG9yQ29kZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBDT0xPUl9HUkVFTjogICByZXR1cm4gIjIiOworICAgIGNhc2UgQ09MT1JfWUVMTE9XOiAgcmV0dXJuICIzIjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBOVUxMOworICB9OworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KK2Jvb2wgU2hvdWxkVXNlQ29sb3IoYm9vbCBzdGRvdXRfaXNfdHR5KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X2NvbG9yID0gR1RFU1RfRkxBRyhjb2xvcikuY19zdHIoKTsKKworICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiYXV0byIpKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCisgICAgLy8gY29uc29sZSB0aGVyZSBkb2VzIHN1cHBvcnQgY29sb3JzLgorICAgIHJldHVybiBzdGRvdXRfaXNfdHR5OworI2Vsc2UKKyAgICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHdlIHJlbHkgb24gdGhlIFRFUk0gdmFyaWFibGUuCisgICAgY29uc3QgY2hhciogY29uc3QgdGVybSA9IHBvc2l4OjpHZXRFbnYoIlRFUk0iKTsKKyAgICBjb25zdCBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPQorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS1jb2xvciIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tMjU2Y29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInNjcmVlbiIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAibGludXgiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImN5Z3dpbiIpOworICAgIHJldHVybiBzdGRvdXRfaXNfdHR5ICYmIHRlcm1fc3VwcG9ydHNfY29sb3I7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgfQorCisgIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ5ZXMiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidHJ1ZSIpIHx8CisgICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0IikgfHwKKyAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgIjEiKTsKKyAgLy8gV2UgdGFrZSAieWVzIiwgInRydWUiLCAidCIsIGFuZCAiMSIgYXMgbWVhbmluZyAieWVzIi4gIElmIHRoZQorICAvLyB2YWx1ZSBpcyBuZWl0aGVyIG9uZSBvZiB0aGVzZSBub3IgImF1dG8iLCB3ZSB0cmVhdCBpdCBhcyAibm8iIHRvCisgIC8vIGJlIGNvbnNlcnZhdGl2ZS4KK30KKworLy8gSGVscGVycyBmb3IgcHJpbnRpbmcgY29sb3JlZCBzdHJpbmdzIHRvIHN0ZG91dC4gTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHdlCisvLyBjYW5ub3Qgc2ltcGx5IGVtaXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBoYXZlIHRoZSB0ZXJtaW5hbCBjaGFuZ2UgY29sb3JzLgorLy8gVGhpcyByb3V0aW5lIG11c3QgYWN0dWFsbHkgZW1pdCB0aGUgY2hhcmFjdGVycyByYXRoZXIgdGhhbiByZXR1cm4gYSBzdHJpbmcKKy8vIHRoYXQgd291bGQgYmUgY29sb3JlZCB3aGVuIHByaW50ZWQsIGFzIGNhbiBiZSBkb25lIG9uIExpbnV4Lgordm9pZCBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TCisgIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gZmFsc2U7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCBpbl9jb2xvcl9tb2RlID0KKyAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsKKyAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBpbl9jb2xvcl9tb2RlICYmIChjb2xvciAhPSBDT0xPUl9ERUZBVUxUKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MKKyAgLy8gVGhlICchPSAwJyBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IE1TVkMgNy4xLgorCisgIGlmICghdXNlX2NvbG9yKSB7CisgICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIGNvbnN0IEhBTkRMRSBzdGRvdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKworICAvLyBHZXRzIHRoZSBjdXJyZW50IHRleHQgY29sb3IuCisgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGJ1ZmZlcl9pbmZvOworICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhzdGRvdXRfaGFuZGxlLCAmYnVmZmVyX2luZm8pOworICBjb25zdCBXT1JEIG9sZF9jb2xvcl9hdHRycyA9IGJ1ZmZlcl9pbmZvLndBdHRyaWJ1dGVzOworCisgIC8vIFdlIG5lZWQgdG8gZmx1c2ggdGhlIHN0cmVhbSBidWZmZXJzIGludG8gdGhlIGNvbnNvbGUgYmVmb3JlIGVhY2gKKyAgLy8gU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgY2FsbCBsZXN0IGl0IGFmZmVjdCB0aGUgdGV4dCB0aGF0IGlzIGFscmVhZHkKKyAgLy8gcHJpbnRlZCBidXQgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGUgY29uc29sZS4KKyAgZmZsdXNoKHN0ZG91dCk7CisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbG9yQXR0cmlidXRlKGNvbG9yKSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZKTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworCisgIGZmbHVzaChzdGRvdXQpOworICAvLyBSZXN0b3JlcyB0aGUgdGV4dCBjb2xvci4KKyAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwgb2xkX2NvbG9yX2F0dHJzKTsKKyNlbHNlCisgIHByaW50ZigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgcHJpbnRmKCJcMDMzW20iKTsgIC8vIFJlc2V0cyB0aGUgdGVybWluYWwgdG8gZGVmYXVsdC4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgY2hhciogY29uc3QgdHlwZV9wYXJhbSA9IHRlc3RfaW5mby50eXBlX3BhcmFtKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3BhcmFtID0gdGVzdF9pbmZvLnZhbHVlX3BhcmFtKCk7CisKKyAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCB8fCB2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgcHJpbnRmKCIsIHdoZXJlICIpOworICAgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwpIHsKKyAgICAgIHByaW50ZigiVHlwZVBhcmFtID0gJXMiLCB0eXBlX3BhcmFtKTsKKyAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKQorICAgICAgICBwcmludGYoIiBhbmQgIik7CisgICAgfQorICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICBwcmludGYoIkdldFBhcmFtKCkgPSAlcyIsIHZhbHVlX3BhcmFtKTsKKyAgICB9CisgIH0KK30KKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBpbnRlcmZhY2UuCisvLworLy8gQ2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIGlzIGNvcHlhYmxlLgorY2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcigpIHt9CisgIHN0YXRpYyB2b2lkIFByaW50VGVzdE5hbWUoY29uc3QgY2hhciAqIHRlc3RfY2FzZSwgY29uc3QgY2hhciAqIHRlc3QpIHsKKyAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLCB0ZXN0KTsKKyAgfQorCisgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvdmVycmlkZSB3aGF0J3MgaW4gdGhlIFRlc3RFdmVudExpc3RlbmVyIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgUHJpbnRGYWlsZWRUZXN0cyhjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworICBpbnRlcm5hbDo6U3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsKK307CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25TdGFydCgKKyAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKSB7CisgIGlmIChHVEVTVF9GTEFHKHJlcGVhdCkgIT0gMSkKKyAgICBwcmludGYoIlxuUmVwZWF0aW5nIGFsbCB0ZXN0cyAoaXRlcmF0aW9uICVkKSAuIC4gLlxuXG4iLCBpdGVyYXRpb24gKyAxKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBmaWx0ZXIgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKKworICAvLyBQcmludHMgdGhlIGZpbHRlciBpZiBpdCdzIG5vdCAqLiAgVGhpcyByZW1pbmRzIHRoZSB1c2VyIHRoYXQgc29tZQorICAvLyB0ZXN0cyBtYXkgYmUgc2tpcHBlZC4KKyAgaWYgKCFpbnRlcm5hbDo6U3RyaW5nOjpDU3RyaW5nRXF1YWxzKGZpbHRlciwga1VuaXZlcnNhbEZpbHRlcikpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiAlcyBmaWx0ZXIgPSAlc1xuIiwgR1RFU1RfTkFNRV8sIGZpbHRlcik7CisgIH0KKworICBpZiAoaW50ZXJuYWw6OlNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwgZmFsc2UpKSB7CisgICAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJWQgb2YgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLAorICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoa1Rlc3RUb3RhbFNoYXJkcykpOworICB9CisKKyAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBSYW5kb21pemluZyB0ZXN0cycgb3JkZXJzIHdpdGggYSBzZWVkIG9mICVkIC5cbiIsCisgICAgICAgICAgICAgICAgICB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7CisgIH0KKworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKKyAgcHJpbnRmKCJSdW5uaW5nICVzIGZyb20gJXMuXG4iLAorICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAorICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1NldFVwU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgdGVzdF9jYXNlX25hbWVfID0gdGVzdF9jYXNlLm5hbWUoKTsKKyAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyBjb3VudHMgPQorICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlstLS0tLS0tLS0tXSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzIiwgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZV9uYW1lXy5jX3N0cigpKTsKKyAgaWYgKHRlc3RfY2FzZS50eXBlX3BhcmFtKCkgPT0gTlVMTCkgeworICAgIHByaW50ZigiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIiwgd2hlcmUgVHlwZVBhcmFtID0gJXNcbiIsIHRlc3RfY2FzZS50eXBlX3BhcmFtKCkpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgUlVOICAgICAgXSAiKTsKKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIHByaW50ZigiXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCisgIGlmIChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKyAgICByZXR1cm47CisKKyAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGFzc2VydGlvbiAoZS5nLiBleHBlY3RlZCB0aGlzIGFuZCBnb3QgdGhhdCkuCisgIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbICAgICAgIE9LIF0gIik7CisgIH0gZWxzZSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgIH0KKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPkZhaWxlZCgpKQorICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7CisKKyAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKKyAgICBwcmludGYoIiAoJXMgbXMpXG4iLCBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKAorICAgICAgICAgICB0ZXN0X2luZm8ucmVzdWx0KCktPmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgaWYgKCFHVEVTVF9GTEFHKHByaW50X3RpbWUpKSByZXR1cm47CisKKyAgdGVzdF9jYXNlX25hbWVfID0gdGVzdF9jYXNlLm5hbWUoKTsKKyAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyBjb3VudHMgPQorICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlstLS0tLS0tLS0tXSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzICglcyBtcyB0b3RhbClcblxuIiwKKyAgICAgICAgIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKSwKKyAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEludGVybmFsIGhlbHBlciBmb3IgcHJpbnRpbmcgdGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKGZhaWxlZF90ZXN0X2NvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisgICAgaWYgKCF0ZXN0X2Nhc2Uuc2hvdWxkX3J1bigpIHx8ICh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSA9PSAwKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsKKyAgICAgIGlmICghdGVzdF9pbmZvLnNob3VsZF9ydW4oKSB8fCB0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgICAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLm5hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCisgICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCisgICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOworICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgeworICAgIHByaW50ZigiICglcyBtcyB0b3RhbCkiLAorICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgIFBBU1NFRCAgXSAiKTsKKyAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOworCisgIGludCBudW1fZmFpbHVyZXMgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsKKyAgICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgICJbICBGQUlMRUQgIF0gIik7CisgICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKKyAgICBQcmludEZhaWxlZFRlc3RzKHVuaXRfdGVzdCk7CisgICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgJXNcbiIsIG51bV9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKworICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LmRpc2FibGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKKyAgICBpZiAoIW51bV9mYWlsdXJlcykgeworICAgICAgcHJpbnRmKCJcbiIpOyAgLy8gQWRkIGEgc3BhY2VyIGlmIG5vIEZBSUxVUkUgYmFubmVyIGlzIGRpc3BsYXllZC4KKyAgICB9CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiICBZT1UgSEFWRSAlZCBESVNBQkxFRCAlc1xuXG4iLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKTsKKyAgfQorICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEVuZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworLy8gY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIKKy8vCisvLyBUaGlzIGNsYXNzIGZvcndhcmRzIGV2ZW50cyB0byBvdGhlciBldmVudCBsaXN0ZW5lcnMuCitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0RXZlbnRSZXBlYXRlcigpIDogZm9yd2FyZGluZ19lbmFibGVkXyh0cnVlKSB7fQorICB2aXJ0dWFsIH5UZXN0RXZlbnRSZXBlYXRlcigpOworICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOworICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkaW5nX2VuYWJsZWRfOyB9CisgIHZvaWQgc2V0X2ZvcndhcmRpbmdfZW5hYmxlZChib29sIGVuYWJsZSkgeyBmb3J3YXJkaW5nX2VuYWJsZWRfID0gZW5hYmxlOyB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworIHByaXZhdGU6CisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWRfOworICAvLyBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIGV2ZW50cy4KKyAgc3RkOjp2ZWN0b3I8VGVzdEV2ZW50TGlzdGVuZXIqPiBsaXN0ZW5lcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50UmVwZWF0ZXIpOworfTsKKworVGVzdEV2ZW50UmVwZWF0ZXI6On5UZXN0RXZlbnRSZXBlYXRlcigpIHsKKyAgRm9yRWFjaChsaXN0ZW5lcnNfLCBEZWxldGU8VGVzdEV2ZW50TGlzdGVuZXI+KTsKK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBsaXN0ZW5lcnNfLnB1c2hfYmFjayhsaXN0ZW5lcik7Cit9CisKKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZhY3RvciB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgaW50byBWZWN0b3I6OkZpbmQuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50UmVwZWF0ZXI6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7ICsraSkgeworICAgIGlmIChsaXN0ZW5lcnNfW2ldID09IGxpc3RlbmVyKSB7CisgICAgICBsaXN0ZW5lcnNfLmVyYXNlKGxpc3RlbmVyc18uYmVnaW4oKSArIGkpOworICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvLyBTaW5jZSBtb3N0IG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhciwgdXNlIG1hY3JvcyB0byByZWR1Y2UgYm9pbGVycGxhdGUuCisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzLgorI2RlZmluZSBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgeyBcCisgICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKKyAgICB9IFwKKyAgfSBcCit9CisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzIGluIHJldmVyc2UKKy8vIG9yZGVyLgorI2RlZmluZSBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAorICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VTdGFydCwgVGVzdENhc2UpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFN0YXJ0LCBUZXN0SW5mbykKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UGFydFJlc3VsdCwgVGVzdFBhcnRSZXN1bHQpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcEVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0RW5kLCBUZXN0SW5mbykKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlRW5kLCBUZXN0Q2FzZSkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtRW5kLCBVbml0VGVzdCkKKworI3VuZGVmIEdURVNUX1JFUEVBVEVSX01FVEhPRF8KKyN1bmRlZiBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0LCBpdGVyYXRpb24pOworICAgIH0KKyAgfQorfQorCisvLyBFbmQgVGVzdEV2ZW50UmVwZWF0ZXIKKworLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYW4gWE1MIG91dHB1dCBmaWxlLgorY2xhc3MgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKTsKKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworCisgcHJpdmF0ZToKKyAgLy8gSXMgYyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgbm9ybWFsaXplZCB0byBhIHNwYWNlIGNoYXJhY3RlcgorICAvLyB3aGVuIGl0IGFwcGVhcnMgaW4gYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZT8KKyAgc3RhdGljIGJvb2wgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGNoYXIgYykgeworICAgIHJldHVybiBjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RDsKKyAgfQorCisgIC8vIE1heSBjIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudD8KKyAgc3RhdGljIGJvb2wgSXNWYWxpZFhtbENoYXJhY3RlcihjaGFyIGMpIHsKKyAgICByZXR1cm4gSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGMpIHx8IGMgPj0gMHgyMDsKKyAgfQorCisgIC8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmCisgIC8vIGlzX2F0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlCisgIC8vIHZhbHVlLCBhbmQgbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdAorICAvLyB3aXRoIGNoYXJhY3RlciByZWZlcmVuY2VzLgorICBzdGF0aWMgU3RyaW5nIEVzY2FwZVhtbChjb25zdCBjaGFyKiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKTsKKworICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgorICBzdGF0aWMgc3RyaW5nIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IHN0cmluZyYgc3RyKTsKKworICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgYW4gYXR0cmlidXRlIHZhbHVlLgorICBzdGF0aWMgU3RyaW5nIEVzY2FwZVhtbEF0dHJpYnV0ZShjb25zdCBjaGFyKiBzdHIpIHsKKyAgICByZXR1cm4gRXNjYXBlWG1sKHN0ciwgdHJ1ZSk7CisgIH0KKworICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgbm90IGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgc3RhdGljIFN0cmluZyBFc2NhcGVYbWxUZXh0KGNvbnN0IGNoYXIqIHN0cikgeyByZXR1cm4gRXNjYXBlWG1sKHN0ciwgZmFsc2UpOyB9CisKKyAgLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZGF0YSk7CisKKyAgLy8gU3RyZWFtcyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCisgIHN0YXRpYyB2b2lkIE91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKworICAvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0CisgIHN0YXRpYyB2b2lkIFByaW50WG1sVGVzdENhc2UoRklMRSogb3V0LCBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKworICAvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0LgorICBzdGF0aWMgdm9pZCBQcmludFhtbFVuaXRUZXN0KEZJTEUqIG91dCwgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyAgLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKKyAgLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KKyAgLy8gV2hlbiB0aGUgU3RyaW5nIGlzIG5vdCBlbXB0eSwgaXQgaW5jbHVkZXMgYSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nLAorICAvLyB0byBkZWxpbWl0IHRoaXMgYXR0cmlidXRlIGZyb20gcHJpb3IgYXR0cmlidXRlcy4KKyAgc3RhdGljIFN0cmluZyBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpOworCisgIC8vIFRoZSBvdXRwdXQgZmlsZS4KKyAgY29uc3QgU3RyaW5nIG91dHB1dF9maWxlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Cit9OworCisvLyBDcmVhdGVzIGEgbmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlci4KK1htbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6WG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKQorICAgIDogb3V0cHV0X2ZpbGVfKG91dHB1dF9maWxlKSB7CisgIGlmIChvdXRwdXRfZmlsZV8uY19zdHIoKSA9PSBOVUxMIHx8IG91dHB1dF9maWxlXy5lbXB0eSgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJYTUwgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBudWxsXG4iKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KK30KKworLy8gQ2FsbGVkIGFmdGVyIHRoZSB1bml0IHRlc3QgZW5kcy4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgRklMRSogeG1sb3V0ID0gTlVMTDsKKyAgRmlsZVBhdGggb3V0cHV0X2ZpbGUob3V0cHV0X2ZpbGVfKTsKKyAgRmlsZVBhdGggb3V0cHV0X2RpcihvdXRwdXRfZmlsZS5SZW1vdmVGaWxlTmFtZSgpKTsKKworICBpZiAob3V0cHV0X2Rpci5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpIHsKKyAgICB4bWxvdXQgPSBwb3NpeDo6Rk9wZW4ob3V0cHV0X2ZpbGVfLmNfc3RyKCksICJ3Iik7CisgIH0KKyAgaWYgKHhtbG91dCA9PSBOVUxMKSB7CisgICAgLy8gVE9ETyh3YW4pOiByZXBvcnQgdGhlIHJlYXNvbiBvZiB0aGUgZmFpbHVyZS4KKyAgICAvLworICAgIC8vIFdlIGRvbid0IGRvIGl0IGZvciBub3cgYXM6CisgICAgLy8KKyAgICAvLyAgIDEuIFRoZXJlIGlzIG5vIHVyZ2VudCBuZWVkIGZvciBpdC4KKyAgICAvLyAgIDIuIEl0J3MgYSBiaXQgaW52b2x2ZWQgdG8gbWFrZSB0aGUgZXJybm8gdmFyaWFibGUgdGhyZWFkLXNhZmUgb24KKyAgICAvLyAgICAgIGFsbCB0aHJlZSBvcGVyYXRpbmcgc3lzdGVtcyAoTGludXgsIFdpbmRvd3MsIGFuZCBNYWMgT1MpLgorICAgIC8vICAgMy4gVG8gaW50ZXJwcmV0IHRoZSBtZWFuaW5nIG9mIGVycm5vIGluIGEgdGhyZWFkLXNhZmUgd2F5LAorICAgIC8vICAgICAgd2UgbmVlZCB0aGUgc3RyZXJyb3JfcigpIGZ1bmN0aW9uLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uCisgICAgLy8gICAgICBXaW5kb3dzLgorICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLAorICAgICAgICAgICAgb3V0cHV0X2ZpbGVfLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBQcmludFhtbFVuaXRUZXN0KHhtbG91dCwgdW5pdF90ZXN0KTsKKyAgZmNsb3NlKHhtbG91dCk7Cit9CisKKy8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmIGlzX2F0dHJpYnV0ZQorLy8gaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgYW5kCisvLyBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0IHdpdGggY2hhcmFjdGVyCisvLyByZWZlcmVuY2VzLgorLy8KKy8vIEludmFsaWQgWE1MIGNoYXJhY3RlcnMgaW4gc3RyLCBpZiBhbnksIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQuCisvLyBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRoZSB0ZXh0IHByb2Nlc3NlZCBieSB0aGlzCisvLyBtb2R1bGUgd2lsbCBjb25zaXN0IG9mIG9yZGluYXJ5IEVuZ2xpc2ggdGV4dC4KKy8vIElmIHRoaXMgbW9kdWxlIGlzIGV2ZXIgbW9kaWZpZWQgdG8gcHJvZHVjZSB2ZXJzaW9uIDEuMSBYTUwgb3V0cHV0LAorLy8gbW9zdCBpbnZhbGlkIGNoYXJhY3RlcnMgY2FuIGJlIHJldGFpbmVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLgorLy8gVE9ETyh3YW4pOiBJdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBtaW5pbWFsbHkgaW52YXNpdmUsIGh1bWFuLXJlYWRhYmxlCisvLyBlc2NhcGluZyBzY2hlbWUgZm9yIGludmFsaWQgY2hhcmFjdGVycywgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlbS4KK1N0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OkVzY2FwZVhtbChjb25zdCBjaGFyKiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKSB7CisgIE1lc3NhZ2UgbTsKKworICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICBmb3IgKGNvbnN0IGNoYXIqIHNyYyA9IHN0cjsgKnNyYzsgKytzcmMpIHsKKyAgICAgIHN3aXRjaCAoKnNyYykgeworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICBtIDw8ICImbHQ7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgbSA8PCAiJmd0OyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyYnOgorICAgICAgICAgIG0gPDwgIiZhbXA7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCisgICAgICAgICAgICBtIDw8ICImYXBvczsiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG0gPDwgJ1wnJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKKyAgICAgICAgICAgIG0gPDwgIiZxdW90OyI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbSA8PCAnIic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoKnNyYykpIHsKKyAgICAgICAgICAgIGlmIChpc19hdHRyaWJ1dGUgJiYgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKCpzcmMpKQorICAgICAgICAgICAgICBtIDw8IFN0cmluZzo6Rm9ybWF0KCImI3glMDJYOyIsIHVuc2lnbmVkKCpzcmMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbSA8PCAqc3JjOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KKy8vIEN1cnJlbnRseSBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgc3RyaW5nLiBBbgorLy8gYWx0ZXJuYXRpdmUgaXMgdG8gcmVwbGFjZSB0aGVtIHdpdGggY2VydGFpbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgLiBvciA/Lgorc3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgc3RyaW5nIG91dHB1dDsKKyAgb3V0cHV0LnJlc2VydmUoc3RyLnNpemUoKSk7CisgIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0ci5iZWdpbigpOyBpdCAhPSBzdHIuZW5kKCk7ICsraXQpCisgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoKml0KSkKKyAgICAgIG91dHB1dC5wdXNoX2JhY2soKml0KTsKKworICByZXR1cm4gb3V0cHV0OworfQorCisvLyBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGdlbmVyYXRlIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFVuaXRUZXN0CisvLyBvYmplY3QuCisvLworLy8gVGhpcyBpcyBob3cgR29vZ2xlIFRlc3QgY29uY2VwdHMgbWFwIHRvIHRoZSBEVEQ6CisvLworLy8gPHRlc3RzdWl0ZXMgbmFtZT0iQWxsVGVzdHMiPiAgICAgICAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVW5pdFRlc3Qgb2JqZWN0CisvLyAgIDx0ZXN0c3VpdGUgbmFtZT0idGVzdGNhc2UtbmFtZSI+ICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0Q2FzZSBvYmplY3QKKy8vICAgICA8dGVzdGNhc2UgbmFtZT0idGVzdC1uYW1lIj4gICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RJbmZvIG9iamVjdAorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tIGluZGl2aWR1YWwgYXNzZXJ0aW9uIGZhaWx1cmVzCisvLyAgICAgPC90ZXN0Y2FzZT4KKy8vICAgPC90ZXN0c3VpdGU+CisvLyA8L3Rlc3RzdWl0ZXM+CisKKy8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCitzdGQ6OnN0cmluZyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoVGltZUluTWlsbGlzIG1zKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IG1zLzEwMDAuMDsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEpIHsKKyAgY29uc3QgY2hhciogc2VnbWVudCA9IGRhdGE7CisgICpzdHJlYW0gPDwgIjwhW0NEQVRBWyI7CisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBuZXh0X3NlZ21lbnQgPSBzdHJzdHIoc2VnbWVudCwgIl1dPiIpOworICAgIGlmIChuZXh0X3NlZ21lbnQgIT0gTlVMTCkgeworICAgICAgc3RyZWFtLT53cml0ZSgKKyAgICAgICAgICBzZWdtZW50LCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KG5leHRfc2VnbWVudCAtIHNlZ21lbnQpKTsKKyAgICAgICpzdHJlYW0gPDwgIl1dPl1dJmd0OzwhW0NEQVRBWyI7CisgICAgICBzZWdtZW50ID0gbmV4dF9zZWdtZW50ICsgc3RybGVuKCJdXT4iKTsKKyAgICB9IGVsc2UgeworICAgICAgKnN0cmVhbSA8PCBzZWdtZW50OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpzdHJlYW0gPDwgIl1dPiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCisvLyBUT0RPKHdhbik6IFRoZXJlIGlzIGFsc28gdmFsdWUgaW4gcHJpbnRpbmcgcHJvcGVydGllcyB3aXRoIHRoZSBwbGFpbiBwcmludGVyLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQgPSAqdGVzdF9pbmZvLnJlc3VsdCgpOworICAqc3RyZWFtIDw8ICIgICAgPHRlc3RjYXNlIG5hbWU9XCIiCisgICAgICAgICAgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfaW5mby5uYW1lKCkpLmNfc3RyKCkgPDwgIlwiIjsKKworICBpZiAodGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICpzdHJlYW0gPDwgIiB2YWx1ZV9wYXJhbT1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpKQorICAgICAgICAgICAgPDwgIlwiIjsKKyAgfQorICBpZiAodGVzdF9pbmZvLnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7CisgICAgKnN0cmVhbSA8PCAiIHR5cGVfcGFyYW09XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8udHlwZV9wYXJhbSgpKQorICAgICAgICAgICAgPDwgIlwiIjsKKyAgfQorCisgICpzdHJlYW0gPDwgIiBzdGF0dXM9XCIiCisgICAgICAgICAgPDwgKHRlc3RfaW5mby5zaG91bGRfcnVuKCkgPyAicnVuIiA6ICJub3RydW4iKQorICAgICAgICAgIDw8ICJcIiB0aW1lPVwiIgorICAgICAgICAgIDw8IEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhyZXN1bHQuZWxhcHNlZF90aW1lKCkpCisgICAgICAgICAgPDwgIlwiIGNsYXNzbmFtZT1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfY2FzZV9uYW1lKS5jX3N0cigpCisgICAgICAgICAgPDwgIlwiIiA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhyZXN1bHQpLmNfc3RyKCk7CisKKyAgaW50IGZhaWx1cmVzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcGFydCA9IHJlc3VsdC5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICBpZiAocGFydC5mYWlsZWQoKSkgeworICAgICAgaWYgKCsrZmFpbHVyZXMgPT0gMSkKKyAgICAgICAgKnN0cmVhbSA8PCAiPlxuIjsKKyAgICAgICpzdHJlYW0gPDwgIiAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9XCIiCisgICAgICAgICAgICAgIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShwYXJ0LnN1bW1hcnkoKSkuY19zdHIoKQorICAgICAgICAgICAgICA8PCAiXCIgdHlwZT1cIlwiPiI7CisgICAgICBjb25zdCBzdHJpbmcgbG9jYXRpb24gPSBpbnRlcm5hbDo6Rm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKKyAgICAgICAgICBwYXJ0LmZpbGVfbmFtZSgpLCBwYXJ0LmxpbmVfbnVtYmVyKCkpOworICAgICAgY29uc3Qgc3RyaW5nIG1lc3NhZ2UgPSBsb2NhdGlvbiArICJcbiIgKyBwYXJ0Lm1lc3NhZ2UoKTsKKyAgICAgIE91dHB1dFhtbENEYXRhU2VjdGlvbihzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMobWVzc2FnZSkuY19zdHIoKSk7CisgICAgICAqc3RyZWFtIDw8ICI8L2ZhaWx1cmU+XG4iOworICAgIH0KKyAgfQorCisgIGlmIChmYWlsdXJlcyA9PSAwKQorICAgICpzdHJlYW0gPDwgIiAvPlxuIjsKKyAgZWxzZQorICAgICpzdHJlYW0gPDwgIiAgICA8L3Rlc3RjYXNlPlxuIjsKK30KKworLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVGVzdENhc2UoRklMRSogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAiICA8dGVzdHN1aXRlIG5hbWU9XCIlc1wiIHRlc3RzPVwiJWRcIiBmYWlsdXJlcz1cIiVkXCIgIgorICAgICAgICAgICJkaXNhYmxlZD1cIiVkXCIgIiwKKyAgICAgICAgICBFc2NhcGVYbWxBdHRyaWJ1dGUodGVzdF9jYXNlLm5hbWUoKSkuY19zdHIoKSwKKyAgICAgICAgICB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpLAorICAgICAgICAgIHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpLAorICAgICAgICAgIHRlc3RfY2FzZS5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAiZXJyb3JzPVwiMFwiIHRpbWU9XCIlc1wiPlxuIiwKKyAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2kpIHsKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBPdXRwdXRYbWxUZXN0SW5mbygmc3RyZWFtLCB0ZXN0X2Nhc2UubmFtZSgpLCAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGkpKTsKKyAgICBmcHJpbnRmKG91dCwgIiVzIiwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSkuY19zdHIoKSk7CisgIH0KKyAgZnByaW50ZihvdXQsICIgIDwvdGVzdHN1aXRlPlxuIik7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgc3VtbWFyeSBvZiB1bml0X3Rlc3QgdG8gb3V0cHV0IHN0cmVhbSBvdXQuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxVbml0VGVzdChGSUxFKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgIGZwcmludGYob3V0LCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKTsKKyAgZnByaW50ZihvdXQsCisgICAgICAgICAgIjx0ZXN0c3VpdGVzIHRlc3RzPVwiJWRcIiBmYWlsdXJlcz1cIiVkXCIgZGlzYWJsZWQ9XCIlZFwiICIKKyAgICAgICAgICAiZXJyb3JzPVwiMFwiIHRpbWU9XCIlc1wiICIsCisgICAgICAgICAgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB1bml0X3Rlc3QuZGlzYWJsZWRfdGVzdF9jb3VudCgpLAorICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgIGZwcmludGYob3V0LCAicmFuZG9tX3NlZWQ9XCIlZFwiICIsIHVuaXRfdGVzdC5yYW5kb21fc2VlZCgpKTsKKyAgfQorICBmcHJpbnRmKG91dCwgIm5hbWU9XCJBbGxUZXN0c1wiPlxuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpCisgICAgUHJpbnRYbWxUZXN0Q2FzZShvdXQsICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSkpOworICBmcHJpbnRmKG91dCwgIjwvdGVzdHN1aXRlcz5cbiIpOworfQorCisvLyBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRlc3QgcHJvcGVydGllcyBpbiBhIHJlc3VsdCBhcyBzcGFjZQorLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KK1N0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKAorICAgIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCkgeworICBNZXNzYWdlIGF0dHJpYnV0ZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSA9IHJlc3VsdC5HZXRUZXN0UHJvcGVydHkoaSk7CisgICAgYXR0cmlidXRlcyA8PCAiICIgPDwgcHJvcGVydHkua2V5KCkgPDwgIj0iCisgICAgICAgIDw8ICJcIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHByb3BlcnR5LnZhbHVlKCkpIDw8ICJcIiI7CisgIH0KKyAgcmV0dXJuIGF0dHJpYnV0ZXMuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEVuZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gU3RyZWFtcyB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGdpdmVuIGhvc3QgbWFjaGluZS4KK2NsYXNzIFN0cmVhbWluZ0xpc3RlbmVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgLy8gRXNjYXBlcyAnPScsICcmJywgJyUnLCBhbmQgJ1xuJyBjaGFyYWN0ZXJzIGluIHN0ciBhcyAiJXh4Ii4KKyAgc3RhdGljIHN0cmluZyBVcmxFbmNvZGUoY29uc3QgY2hhciogc3RyKTsKKworICBTdHJlYW1pbmdMaXN0ZW5lcihjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IHN0cmluZyYgcG9ydCkKKyAgICAgIDogc29ja2ZkXygtMSksIGhvc3RfbmFtZV8oaG9zdCksIHBvcnRfbnVtXyhwb3J0KSB7CisgICAgTWFrZUNvbm5lY3Rpb24oKTsKKyAgICBTZW5kKCJndGVzdF9zdHJlYW1pbmdfcHJvdG9jb2xfdmVyc2lvbj0xLjBcbiIpOworICB9CisKKyAgdmlydHVhbCB+U3RyZWFtaW5nTGlzdGVuZXIoKSB7CisgICAgaWYgKHNvY2tmZF8gIT0gLTEpCisgICAgICBDbG9zZUNvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8pIHsKKyAgICBTZW5kKCJldmVudD1UZXN0UHJvZ3JhbVN0YXJ0XG4iKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgICAgLy8gTm90ZSB0aGF0IEdvb2dsZSBUZXN0IGN1cnJlbnQgb25seSByZXBvcnQgZWxhcHNlZCB0aW1lIGZvciBlYWNoCisgICAgLy8gdGVzdCBpdGVyYXRpb24sIG5vdCBmb3IgdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0uCisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdFByb2dyYW1FbmQmcGFzc2VkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LlBhc3NlZCgpKSk7CisKKyAgICAvLyBOb3RpZnkgdGhlIHN0cmVhbWluZyBzZXJ2ZXIgdG8gc3RvcC4KKyAgICBDbG9zZUNvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLywgaW50IGl0ZXJhdGlvbikgeworICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RJdGVyYXRpb25TdGFydCZpdGVyYXRpb249JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb24pKTsKKyAgfQorCisgIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCAvKiBpdGVyYXRpb24gKi8pIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0SXRlcmF0aW9uRW5kJnBhc3NlZD0lZCZlbGFwc2VkX3RpbWU9JXNtc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdGVzdC5QYXNzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0Q2FzZVN0YXJ0Jm5hbWU9JXNcbiIsIHRlc3RfY2FzZS5uYW1lKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdENhc2VFbmQmcGFzc2VkPSVkJmVsYXBzZWRfdGltZT0lc21zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlLlBhc3NlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSkpOworICB9CisKKyAgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdFN0YXJ0Jm5hbWU9JXNcbiIsIHRlc3RfaW5mby5uYW1lKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiZXZlbnQ9VGVzdEVuZCZwYXNzZWQ9JWQmZWxhcHNlZF90aW1lPSVzbXNcbiIsCisgICAgICAgICh0ZXN0X2luZm8ucmVzdWx0KCkpLT5QYXNzZWQoKSwKKyAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSkpOworICB9CisKKyAgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lID0gdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKTsKKyAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpCisgICAgICBmaWxlX25hbWUgPSAiIjsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0UGFydFJlc3VsdCZmaWxlPSVzJmxpbmU9JWQmbWVzc2FnZT0iLAorICAgICAgICAgICAgICAgICAgICAgICAgVXJsRW5jb2RlKGZpbGVfbmFtZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSkpOworICAgIFNlbmQoVXJsRW5jb2RlKHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKSArICJcbiIpOworICB9CisKKyBwcml2YXRlOgorICAvLyBDcmVhdGVzIGEgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdHMgdG8gdGhlIHNlcnZlci4KKyAgdm9pZCBNYWtlQ29ubmVjdGlvbigpOworCisgIC8vIENsb3NlcyB0aGUgc29ja2V0LgorICB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHsKKyAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgPDwgIkNsb3NlQ29ubmVjdGlvbigpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOworCisgICAgY2xvc2Uoc29ja2ZkXyk7CisgICAgc29ja2ZkXyA9IC0xOworICB9CisKKyAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KKyAgdm9pZCBTZW5kKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEdURVNUX0NIRUNLXyhzb2NrZmRfICE9IC0xKQorICAgICAgICA8PCAiU2VuZCgpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOworCisgICAgY29uc3QgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5sZW5ndGgoKSk7CisgICAgaWYgKHdyaXRlKHNvY2tmZF8sIG1lc3NhZ2UuY19zdHIoKSwgbGVuKSAhPSBsZW4pIHsKKyAgICAgIEdURVNUX0xPR18oV0FSTklORykKKyAgICAgICAgICA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIHN0cmVhbSB0byAiCisgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOworICAgIH0KKyAgfQorCisgIGludCBzb2NrZmRfOyAgIC8vIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgY29uc3Qgc3RyaW5nIGhvc3RfbmFtZV87CisgIGNvbnN0IHN0cmluZyBwb3J0X251bV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJlYW1pbmdMaXN0ZW5lcik7Cit9OyAgLy8gY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXIKKworLy8gQ2hlY2tzIGlmIHN0ciBjb250YWlucyAnPScsICcmJywgJyUnIG9yICdcbicgY2hhcmFjdGVycy4gSWYgeWVzLAorLy8gcmVwbGFjZXMgdGhlbSBieSAiJXh4IiB3aGVyZSB4eCBpcyB0aGVpciBoZXhhZGVjaW1hbCB2YWx1ZS4gRm9yCisvLyBleGFtcGxlLCByZXBsYWNlcyAiPSIgd2l0aCAiJTNEIi4gIFRoaXMgYWxnb3JpdGhtIGlzIE8oc3RybGVuKHN0cikpCisvLyBpbiBib3RoIHRpbWUgYW5kIHNwYWNlIC0tIGltcG9ydGFudCBhcyB0aGUgaW5wdXQgc3RyIG1heSBjb250YWluIGFuCisvLyBhcmJpdHJhcmlseSBsb25nIHRlc3QgZmFpbHVyZSBtZXNzYWdlIGFuZCBzdGFjayB0cmFjZS4KK3N0cmluZyBTdHJlYW1pbmdMaXN0ZW5lcjo6VXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cikgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShzdHJsZW4oc3RyKSArIDEpOworICBmb3IgKGNoYXIgY2ggPSAqc3RyOyBjaCAhPSAnXDAnOyBjaCA9ICorK3N0cikgeworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgY2FzZSAnPSc6CisgICAgICBjYXNlICcmJzoKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmc6OkZvcm1hdCgiJSUlMDJ4Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN0cmVhbWluZ0xpc3RlbmVyOjpNYWtlQ29ubmVjdGlvbigpIHsKKyAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gPT0gLTEpCisgICAgICA8PCAiTWFrZUNvbm5lY3Rpb24oKSBjYW4ndCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbi4iOworCisgIGFkZHJpbmZvIGhpbnRzOworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgICAvLyBUbyBhbGxvdyBib3RoIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgorICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBhZGRyaW5mbyogc2VydmluZm8gPSBOVUxMOworCisgIC8vIFVzZSB0aGUgZ2V0YWRkcmluZm8oKSB0byBnZXQgYSBsaW5rZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgZm9yCisgIC8vIHRoZSBnaXZlbiBob3N0IG5hbWUuCisgIGNvbnN0IGludCBlcnJvcl9udW0gPSBnZXRhZGRyaW5mbygKKyAgICAgIGhvc3RfbmFtZV8uY19zdHIoKSwgcG9ydF9udW1fLmNfc3RyKCksICZoaW50cywgJnNlcnZpbmZvKTsKKyAgaWYgKGVycm9yX251bSAhPSAwKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdhaV9zdHJlcnJvcihlcnJvcl9udW0pOworICB9CisKKyAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuLgorICBmb3IgKGFkZHJpbmZvKiBjdXJfYWRkciA9IHNlcnZpbmZvOyBzb2NrZmRfID09IC0xICYmIGN1cl9hZGRyICE9IE5VTEw7CisgICAgICAgY3VyX2FkZHIgPSBjdXJfYWRkci0+YWlfbmV4dCkgeworICAgIHNvY2tmZF8gPSBzb2NrZXQoCisgICAgICAgIGN1cl9hZGRyLT5haV9mYW1pbHksIGN1cl9hZGRyLT5haV9zb2NrdHlwZSwgY3VyX2FkZHItPmFpX3Byb3RvY29sKTsKKyAgICBpZiAoc29ja2ZkXyAhPSAtMSkgeworICAgICAgLy8gQ29ubmVjdCB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgc2VydmVyIHNvY2tldC4KKyAgICAgIGlmIChjb25uZWN0KHNvY2tmZF8sIGN1cl9hZGRyLT5haV9hZGRyLCBjdXJfYWRkci0+YWlfYWRkcmxlbikgPT0gLTEpIHsKKyAgICAgICAgY2xvc2Uoc29ja2ZkXyk7CisgICAgICAgIHNvY2tmZF8gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmcmVlYWRkcmluZm8oc2VydmluZm8pOyAgLy8gYWxsIGRvbmUgd2l0aCB0aGlzIHN0cnVjdHVyZQorCisgIGlmIChzb2NrZmRfID09IC0xKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIGNvbm5lY3QgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOworICB9Cit9CisKKy8vIEVuZCBvZiBjbGFzcyBTdHJlYW1pbmcgTGlzdGVuZXIKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTX18KKworLy8gQ2xhc3MgU2NvcGVkVHJhY2UKKworLy8gUHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvIGEgcGVyLXRocmVhZAorLy8gdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KKy8vIEwgPCBVbml0VGVzdDo6bXV0ZXhfCitTY29wZWRUcmFjZTo6U2NvcGVkVHJhY2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgVHJhY2VJbmZvIHRyYWNlOworICB0cmFjZS5maWxlID0gZmlsZTsKKyAgdHJhY2UubGluZSA9IGxpbmU7CisgIHRyYWNlLm1lc3NhZ2UgPSBtZXNzYWdlLkdldFN0cmluZygpOworCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5QdXNoR1Rlc3RUcmFjZSh0cmFjZSk7Cit9CisKKy8vIFBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KKy8vIEwgPCBVbml0VGVzdDo6bXV0ZXhfCitTY29wZWRUcmFjZTo6flNjb3BlZFRyYWNlKCkgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UG9wR1Rlc3RUcmFjZSgpOworfQorCisKKy8vIGNsYXNzIE9zU3RhY2tUcmFjZUdldHRlcgorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGEgU3RyaW5nLiAgUGFyYW1ldGVyczoKKy8vCisvLyAgIG1heF9kZXB0aCAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkCisvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCisvLyAgIHNraXBfY291bnQgLSB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZDsgZG9lc24ndCBjb3VudAorLy8gICAgICAgICAgICAgICAgYWdhaW5zdCBtYXhfZGVwdGguCisvLworLy8gTCA8IG11dGV4XworLy8gV2UgdXNlICJMIDwgbXV0ZXhfIiB0byBkZW5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gbWF5IGFjcXVpcmUgbXV0ZXhfLgorU3RyaW5nIE9zU3RhY2tUcmFjZUdldHRlcjo6Q3VycmVudFN0YWNrVHJhY2UoaW50LCBpbnQpIHsKKyAgcmV0dXJuIFN0cmluZygiIik7Cit9CisKKy8vIEwgPCBtdXRleF8KK3ZvaWQgT3NTdGFja1RyYWNlR2V0dGVyOjpVcG9uTGVhdmluZ0dUZXN0KCkgeworfQorCitjb25zdCBjaGFyKiBjb25zdAorT3NTdGFja1RyYWNlR2V0dGVyOjprRWxpZGVkRnJhbWVzTWFya2VyID0KKyAgICAiLi4uICIgR1RFU1RfTkFNRV8gIiBpbnRlcm5hbCBmcmFtZXMgLi4uIjsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RFdmVudExpc3RlbmVycworCitUZXN0RXZlbnRMaXN0ZW5lcnM6OlRlc3RFdmVudExpc3RlbmVycygpCisgICAgOiByZXBlYXRlcl8obmV3IGludGVybmFsOjpUZXN0RXZlbnRSZXBlYXRlcigpKSwKKyAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKE5VTEwpLAorICAgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyhOVUxMKSB7Cit9CisKK1Rlc3RFdmVudExpc3RlbmVyczo6flRlc3RFdmVudExpc3RlbmVycygpIHsgZGVsZXRlIHJlcGVhdGVyXzsgfQorCisvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQorLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKy8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKy8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgdXNlci4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIHJlcGVhdGVyXy0+QXBwZW5kKGxpc3RlbmVyKTsKK30KKworLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKy8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKy8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXykKKyAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IE5VTEw7CisgIGVsc2UgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pCisgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyA9IE5VTEw7CisgIHJldHVybiByZXBlYXRlcl8tPlJlbGVhc2UobGlzdGVuZXIpOworfQorCisvLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbAorLy8gc3Vic2NyaWJlcnMuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpyZXBlYXRlcigpIHsgcmV0dXJuIHJlcGVhdGVyXzsgfQorCisvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKKy8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gIT0gbGlzdGVuZXIpIHsKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIHRoaXMgbWV0aG9kIGEgbGlzdGVuZXIgdGhhdCBpcyBhbHJlYWR5IGluIHRoZQorICAgIC8vIGxpc3QuCisgICAgZGVsZXRlIFJlbGVhc2UoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8pOworICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKy8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3htbF9nZW5lcmF0b3JfKTsKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUKKy8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KK2Jvb2wgVGVzdEV2ZW50TGlzdGVuZXJzOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gcmVwZWF0ZXJfLT5mb3J3YXJkaW5nX2VuYWJsZWQoKTsKK30KKwordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCkgeworICByZXBlYXRlcl8tPnNldF9mb3J3YXJkaW5nX2VuYWJsZWQoZmFsc2UpOworfQorCisvLyBjbGFzcyBVbml0VGVzdAorCisvLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMKKy8vIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLiAgQ29uc2VjdXRpdmUKKy8vIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG9iamVjdC4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfIGFzIGEgdXNlciBpcyBub3Qgc3VwcG9zZWQgdG8KKy8vIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpIHN0YXJ0cywgZnJvbSB3aGljaCBwb2ludCBvbiB0aGUgcmV0dXJuCisvLyB2YWx1ZSB3aWxsIG5ldmVyIGNoYW5nZS4KK1VuaXRUZXN0ICogVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkgeworICAvLyBXaGVuIGNvbXBpbGVkIHdpdGggTVNWQyA3LjEgaW4gb3B0aW1pemVkIG1vZGUsIGRlc3Ryb3lpbmcgdGhlCisgIC8vIFVuaXRUZXN0IG9iamVjdCB1cG9uIGV4aXRpbmcgdGhlIHByb2dyYW0gbWVzc2VzIHVwIHRoZSBleGl0IGNvZGUsCisgIC8vIGNhdXNpbmcgc3VjY2Vzc2Z1bCB0ZXN0cyB0byBhcHBlYXIgZmFpbGVkLiAgV2UgaGF2ZSB0byB1c2UgYQorICAvLyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBjYXNlIHRvIGJ5cGFzcyB0aGUgY29tcGlsZXIgYnVnLgorICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHRoZSBjb21waWxlciBoYXBweSwgYXQgdGhlIGNvc3Qgb2YKKyAgLy8gbGVha2luZyB0aGUgVW5pdFRlc3Qgb2JqZWN0LgorCisgIC8vIENvZGVHZWFyIEMrK0J1aWxkZXIgaW5zaXN0cyBvbiBhIHB1YmxpYyBkZXN0cnVjdG9yIGZvciB0aGUKKyAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gIFVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHRvIGtlZXAgZ29vZCBPTworICAvLyBkZXNpZ24gd2l0aCBwcml2YXRlIGRlc3RydWN0b3IuCisKKyNpZiAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgc3RhdGljIFVuaXRUZXN0KiBjb25zdCBpbnN0YW5jZSA9IG5ldyBVbml0VGVzdDsKKyAgcmV0dXJuIGluc3RhbmNlOworI2Vsc2UKKyAgc3RhdGljIFVuaXRUZXN0IGluc3RhbmNlOworICByZXR1cm4gJmluc3RhbmNlOworI2VuZGlmICAvLyAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKy8vIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2NvdW50KCk7IH0KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgoraW50IFVuaXRUZXN0OjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5kaXNhYmxlZF90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dGVzdF90b19ydW5fY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KK2ludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OmVsYXBzZWRfdGltZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZWxhcHNlZF90aW1lKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KK2Jvb2wgVW5pdFRlc3Q6OlBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+UGFzc2VkKCk7IH0KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKy8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorYm9vbCBVbml0VGVzdDo6RmFpbGVkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5GYWlsZWQoKTsgfQorCisvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPkdldFRlc3RDYXNlKGkpOworfQorCisvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgeworICByZXR1cm4gaW1wbCgpLT5HZXRNdXRhYmxlVGVzdENhc2UoaSk7Cit9CisKKy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCisvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCitUZXN0RXZlbnRMaXN0ZW5lcnMmIFVuaXRUZXN0OjpsaXN0ZW5lcnMoKSB7CisgIHJldHVybiAqaW1wbCgpLT5saXN0ZW5lcnMoKTsKK30KKworLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAorLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4gdGhlCisvLyBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbSBoYXZlCisvLyBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbiB0aGUKKy8vICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKy8vCisvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgorRW52aXJvbm1lbnQqIFVuaXRUZXN0OjpBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7CisgIGlmIChlbnYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaW1wbF8tPmVudmlyb25tZW50cygpLnB1c2hfYmFjayhlbnYpOworICByZXR1cm4gZW52OworfQorCisvLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwgR29vZ2xlIFRlc3QKKy8vIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKSBldmVudHVhbGx5IGNhbGwKKy8vIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlIHNob3VsZCB1c2UgdGhlCisvLyBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5LgorLy8gTCA8IG11dGV4Xwordm9pZCBVbml0VGVzdDo6QWRkVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6U3RyaW5nJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBtZXNzYWdlOworCisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaWYgKGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSA+IDApIHsKKyAgICBtc2cgPDwgIlxuIiA8PCBHVEVTVF9OQU1FXyA8PCAiIHRyYWNlOiI7CisKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkpOworICAgICAgICAgaSA+IDA7IC0taSkgeworICAgICAgY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UgPSBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKVtpIC0gMV07CisgICAgICBtc2cgPDwgIlxuIiA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRyYWNlLmZpbGUsIHRyYWNlLmxpbmUpCisgICAgICAgICAgPDwgIiAiIDw8IHRyYWNlLm1lc3NhZ2U7CisgICAgfQorICB9CisKKyAgaWYgKG9zX3N0YWNrX3RyYWNlLmNfc3RyKCkgIT0gTlVMTCAmJiAhb3Nfc3RhY2tfdHJhY2UuZW1wdHkoKSkgeworICAgIG1zZyA8PCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIgPDwgb3Nfc3RhY2tfdHJhY2U7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQgPQorICAgIFRlc3RQYXJ0UmVzdWx0KHJlc3VsdF90eXBlLCBmaWxlX25hbWUsIGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgaW1wbF8tPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCktPgorICAgICAgUmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKworICBpZiAocmVzdWx0X3R5cGUgIT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKSB7CisgICAgLy8gZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKyAgICAvLyBndGVzdF90aHJvd19vbl9mYWlsdXJlLiAgVGhpcyBhbGxvd3MgYSB1c2VyIHRvIHNldCB0aGUgbGF0dGVyCisgICAgLy8gaW4gdGhlIGNvZGUgKHBlcmhhcHMgaW4gb3JkZXIgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMKKyAgICAvLyB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmspIGFuZCBzcGVjaWZ5IHRoZSBmb3JtZXIgb24gdGhlCisgICAgLy8gY29tbWFuZCBsaW5lIGZvciBkZWJ1Z2dpbmcuCisgICAgaWYgKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgICAvLyBVc2luZyBEZWJ1Z0JyZWFrIG9uIFdpbmRvd3MgYWxsb3dzIGd0ZXN0IHRvIHN0aWxsIGJyZWFrIGludG8gYSBkZWJ1Z2dlcgorICAgICAgLy8gd2hlbiBhIGZhaWx1cmUgaGFwcGVucyBhbmQgYm90aCB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGFuZAorICAgICAgLy8gdGhlIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBmbGFncyBhcmUgc3BlY2lmaWVkLgorICAgICAgRGVidWdCcmVhaygpOworI2Vsc2UKKyAgICAgIC8vIERlcmVmZXJlbmNlIE5VTEwgdGhyb3VnaCBhIHZvbGF0aWxlIHBvaW50ZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgICAgIC8vIGZyb20gcmVtb3ZpbmcuIFdlIHVzZSB0aGlzIHJhdGhlciB0aGFuIGFib3J0KCkgb3IgX19idWlsdGluX3RyYXAoKSBmb3IKKyAgICAgIC8vIHBvcnRhYmlsaXR5OiBTeW1iaWFuIGRvZXNuJ3QgaW1wbGVtZW50IGFib3J0KCkgd2VsbCwgYW5kIHNvbWUgZGVidWdnZXJzCisgICAgICAvLyBkb24ndCBjb3JyZWN0bHkgdHJhcCBhYm9ydCgpLgorICAgICAgKnN0YXRpY19jYXN0PHZvbGF0aWxlIGludCo+KE5VTEwpID0gMTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgICB0aHJvdyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihyZXN1bHQpOworI2Vsc2UKKyAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIGFib3J0KCkgYXMgaXQgZ2VuZXJhdGVzIGEgcG9wLXVwIGluIGRlYnVnIG1vZGUKKyAgICAgIC8vIHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgaW4gVkMgNy4xIG9yIGJlbG93LgorICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgIH0KKyAgfQorfQorCisvLyBDcmVhdGVzIGFuZCBhZGRzIGEgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdC4gSWYgYSBwcm9wZXJ0eSBtYXRjaGluZworLy8gdGhlIHN1cHBsaWVkIHZhbHVlIGFscmVhZHkgZXhpc3RzLCB1cGRhdGVzIGl0cyB2YWx1ZSBpbnN0ZWFkLgordm9pZCBVbml0VGVzdDo6UmVjb3JkUHJvcGVydHlGb3JDdXJyZW50VGVzdChjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSB0ZXN0X3Byb3BlcnR5KGtleSwgdmFsdWUpOworICBpbXBsXy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5SZWNvcmRQcm9wZXJ0eSh0ZXN0X3Byb3BlcnR5KTsKK30KKworLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0CisvLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KK2ludCBVbml0VGVzdDo6UnVuKCkgeworICAvLyBDYXB0dXJlcyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKS4gIFRoaXMgdmFsdWUgd2lsbCBiZQorICAvLyB1c2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByb2dyYW0uCisgIGltcGwoKS0+c2V0X2NhdGNoX2V4Y2VwdGlvbnMoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisKKyNpZiBHVEVTVF9IQVNfU0VICisgIGNvbnN0IGJvb2wgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzID0KKyAgICAgIGludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5sZW5ndGgoKSA+IDA7CisKKyAgLy8gRWl0aGVyIHRoZSB1c2VyIHdhbnRzIEdvb2dsZSBUZXN0IHRvIGNhdGNoIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZQorICAvLyB0ZXN0cyBvciB0aGlzIGlzIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiBkZWF0aCB0ZXN0IGNoaWxkCisgIC8vIHByb2Nlc3MuIEluIGVpdGhlciBjYXNlIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gc2VlIHBvcC11cCBkaWFsb2dzCisgIC8vIGFib3V0IGNyYXNoZXMgLSB0aGV5IGFyZSBleHBlY3RlZC4KKyAgaWYgKGltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpIHx8IGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcykgeworCisjIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIC8vIFNldEVycm9yTW9kZSBkb2Vzbid0IGV4aXN0IG9uIENFLgorICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgfAorICAgICAgICAgICAgICAgICBTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjIGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBHVEVTVF9PU19XSU5ET1dTX01JTkdXKSAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBEZWF0aCB0ZXN0IGNoaWxkcmVuIGNhbiBiZSB0ZXJtaW5hdGVkIHdpdGggX2Fib3J0KCkuICBPbiBXaW5kb3dzLAorICAgIC8vIF9hYm9ydCgpIGNhbiBzaG93IGEgZGlhbG9nIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUKKyAgICAvLyBhYm9ydCBtZXNzYWdlIHRvIGdvIHRvIHN0ZGVyciBpbnN0ZWFkLgorICAgIF9zZXRfZXJyb3JfbW9kZShfT1VUX1RPX1NUREVSUik7CisjIGVuZGlmCisKKyMgaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nCisgICAgLy8gb2ZmZXJpbmcgYSBjaG9pY2UgdG8gZGVidWcgdGhlIGFib3J0ZWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBzdXBwcmVzcworICAgIC8vIHRoaXMgZGlhbG9nIG9yIGl0IHdpbGwgcG9wIHVwIGZvciBldmVyeSBFWFBFQ1QvQVNTRVJUX0RFQVRIIHN0YXRlbWVudAorICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZAorICAgIC8vIGZhaWx1cmUgdmlhIHN0ZGVyci4KKyAgICAvLworICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4KKyAgICAvLyBVc2VycyBvZiBwcmlvciBWQyB2ZXJzaW9ucyBzaGFsbCBzdWZmZXIgdGhlIGFnb255IGFuZCBwYWluIG9mCisgICAgLy8gY2xpY2tpbmcgdGhyb3VnaCB0aGUgY291bnRsZXNzIGRlYnVnIGRpYWxvZ3MuCisgICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlCisgICAgLy8gZGVidWcgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggVkMgNy4xIG9yIGxvd2VyLgorICAgIGlmICghR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkKKyAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoCisgICAgICAgICAgMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgX1dSSVRFX0FCT1JUX01TRyB8IF9DQUxMX1JFUE9SVEZBVUxUKTsgIC8vIHBvcC11cCB3aW5kb3csIGNvcmUgZHVtcC4KKyMgZW5kaWYKKworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworICByZXR1cm4gaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgaW1wbCgpLAorICAgICAgJmludGVybmFsOjpVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzLAorICAgICAgImF1eGlsaWFyeSB0ZXN0IGNvZGUgKGVudmlyb25tZW50cyBvciBldmVudCBsaXN0ZW5lcnMpIikgPyAwIDogMTsKK30KKworLy8gUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpIHdhcworLy8gZXhlY3V0ZWQuCitjb25zdCBjaGFyKiBVbml0VGVzdDo6b3JpZ2luYWxfd29ya2luZ19kaXIoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+b3JpZ2luYWxfd29ya2luZ19kaXJfLmNfc3RyKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisvLyBMIDwgbXV0ZXhfCitjb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIHJldHVybiBpbXBsXy0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKy8vIEwgPCBtdXRleF8KK2NvbnN0IFRlc3RJbmZvKiBVbml0VGVzdDo6Y3VycmVudF90ZXN0X2luZm8oKSBjb25zdCB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfaW5mbygpOworfQorCisvLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KK2ludCBVbml0VGVzdDo6cmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+cmFuZG9tX3NlZWQoKTsgfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKy8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisvLyBMIDwgbXV0ZXhfCitpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmCisgICAgVW5pdFRlc3Q6OnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpIHsKKyAgcmV0dXJuIGltcGxfLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBVbml0VGVzdC4KK1VuaXRUZXN0OjpVbml0VGVzdCgpIHsKKyAgaW1wbF8gPSBuZXcgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCh0aGlzKTsKK30KKworLy8gRGVzdHJ1Y3RvciBvZiBVbml0VGVzdC4KK1VuaXRUZXN0Ojp+VW5pdFRlc3QoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAorLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisvLyBMIDwgbXV0ZXhfCit2b2lkIFVuaXRUZXN0OjpQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSkgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnB1c2hfYmFjayh0cmFjZSk7Cit9CisKKy8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorLy8gTCA8IG11dGV4Xwordm9pZCBVbml0VGVzdDo6UG9wR1Rlc3RUcmFjZSgpIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5wb3BfYmFjaygpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitVbml0VGVzdEltcGw6OlVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KQorICAgIDogcGFyZW50XyhwYXJlbnQpLAorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgICAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzNTUpICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MzU1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2luZyB0aGlzIGluIGluaXRpYWxpemVyKS4KKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUgYWdhaW4uCisjZWxzZQorICAgICAgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCisgICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCisjZW5kaWYgIC8vIF9NU0NfVkVSCisgICAgICBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXygKKyAgICAgICAgICAmZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAorICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXygKKyAgICAgICAgICAmZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAgICAgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XygpLAorICAgICAgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXyhmYWxzZSksCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisgICAgICBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8oLTEpLAorICAgICAgY3VycmVudF90ZXN0X2Nhc2VfKE5VTEwpLAorICAgICAgY3VycmVudF90ZXN0X2luZm9fKE5VTEwpLAorICAgICAgYWRfaG9jX3Rlc3RfcmVzdWx0XygpLAorICAgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyhOVUxMKSwKKyAgICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8oZmFsc2UpLAorICAgICAgcmFuZG9tX3NlZWRfKDApLCAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICByYW5kb21fKDApLCAgLy8gV2lsbCBiZSByZXNlZWRlZCBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgZWxhcHNlZF90aW1lXygwKSwKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18oTlVMTCksCisgICAgICBkZWF0aF90ZXN0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSksCisjZW5kaWYKKyAgICAgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgY2F0Y2hfZXhjZXB0aW9uc18oZmFsc2UpIHsKKyAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRSZXN1bHRQcmludGVyKG5ldyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIpOworfQorCitVbml0VGVzdEltcGw6On5Vbml0VGVzdEltcGwoKSB7CisgIC8vIERlbGV0ZXMgZXZlcnkgVGVzdENhc2UuCisgIEZvckVhY2godGVzdF9jYXNlc18sIGludGVybmFsOjpEZWxldGU8VGVzdENhc2U+KTsKKworICAvLyBEZWxldGVzIGV2ZXJ5IEVudmlyb25tZW50LgorICBGb3JFYWNoKGVudmlyb25tZW50c18sIGludGVybmFsOjpEZWxldGU8RW52aXJvbm1lbnQ+KTsKKworICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisvLyBEaXNhYmxlcyBldmVudCBmb3J3YXJkaW5nIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBpbiBhIGRlYXRoIHRlc3QKKy8vIHN1YnByb2Nlc3MuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6U3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKSB7CisgIGlmIChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKQorICAgIGxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQorLy8gVW5pdFRlc3RPcHRpb25zLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVhtbE91dHB1dCgpIHsKKyAgY29uc3QgU3RyaW5nJiBvdXRwdXRfZm9ybWF0ID0gVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKTsKKyAgaWYgKG91dHB1dF9mb3JtYXQgPT0gInhtbCIpIHsKKyAgICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKAorICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpLmNfc3RyKCkpKTsKKyAgfSBlbHNlIGlmIChvdXRwdXRfZm9ybWF0ICE9ICIiKSB7CisgICAgcHJpbnRmKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3V0cHV0IGZvcm1hdCBcIiVzXCIgaWdub3JlZC5cbiIsCisgICAgICAgICAgIG91dHB1dF9mb3JtYXQuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KK30KKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKy8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyBpbiBTdHJpbmcgZm9ybS4KKy8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCkgeworICBjb25zdCBzdHJpbmcmIHRhcmdldCA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7CisgIGlmICghdGFyZ2V0LmVtcHR5KCkpIHsKKyAgICBjb25zdCBzaXplX3QgcG9zID0gdGFyZ2V0LmZpbmQoJzonKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgeworICAgICAgbGlzdGVuZXJzKCktPkFwcGVuZChuZXcgU3RyZWFtaW5nTGlzdGVuZXIodGFyZ2V0LnN1YnN0cigwLCBwb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN1YnN0cihwb3MrMSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgc3RyZWFtaW5nIHRhcmdldCBcIiVzXCIgaWdub3JlZC5cbiIsCisgICAgICAgICAgICAgdGFyZ2V0LmNfc3RyKCkpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KKy8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCisvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0CisvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpQb3N0RmxhZ1BhcnNpbmdJbml0KCkgeworICAvLyBFbnN1cmVzIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBleGVjdXRlIG1vcmUgdGhhbiBvbmNlLgorICBpZiAoIXBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8pIHsKKyAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfID0gdHJ1ZTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgICAgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpOworICAgIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgICAvLyBSZWdpc3RlcnMgcGFyYW1ldGVyaXplZCB0ZXN0cy4gVGhpcyBtYWtlcyBwYXJhbWV0ZXJpemVkIHRlc3RzCisgICAgLy8gYXZhaWxhYmxlIHRvIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSSB3aXRob3V0IHJ1bm5pbmcKKyAgICAvLyBSVU5fQUxMX1RFU1RTLgorICAgIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7CisKKyAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3IgWE1MIG91dHB1dC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXNlcnMKKyAgICAvLyB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dCBiZWZvcmUgaW52b2tpbmcgUlVOX0FMTF9URVNUUy4KKyAgICBDb25maWd1cmVYbWxPdXRwdXQoKTsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4KKyAgICBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworICB9Cit9CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBuYW1lIG9mIGEgVGVzdENhc2UgYWdhaW5zdCBhIGtub3duCisvLyB2YWx1ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcyBvbmx5LiAgV2UgcHV0CisvLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKKy8vIG5hbWVzcGFjZS4KKy8vCisvLyBUZXN0Q2FzZU5hbWVJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3RDYXNlTmFtZUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICBleHBsaWNpdCBUZXN0Q2FzZU5hbWVJcyhjb25zdCBTdHJpbmcmIG5hbWUpCisgICAgICA6IG5hbWVfKG5hbWUpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbmFtZSBvZiB0ZXN0X2Nhc2UgbWF0Y2hlcyBuYW1lXy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9jYXNlICE9IE5VTEwgJiYgc3RyY21wKHRlc3RfY2FzZS0+bmFtZSgpLCBuYW1lXy5jX3N0cigpKSA9PSAwOworICB9CisKKyBwcml2YXRlOgorICBTdHJpbmcgbmFtZV87Cit9OworCisvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LiAgSXQncyB0aGUgQ0FMTEVSJ1MKKy8vIFJFU1BPTlNJQklMSVRZIHRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgV0hFTiBUSEUKKy8vIFRFU1RTIEFSRSBOT1QgU0hVRkZMRUQuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2UqIFVuaXRUZXN0SW1wbDo6R2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKSB7CisgIC8vIENhbiB3ZSBmaW5kIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZT8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPjo6Y29uc3RfaXRlcmF0b3IgdGVzdF9jYXNlID0KKyAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X2Nhc2VzXy5iZWdpbigpLCB0ZXN0X2Nhc2VzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZU5hbWVJcyh0ZXN0X2Nhc2VfbmFtZSkpOworCisgIGlmICh0ZXN0X2Nhc2UgIT0gdGVzdF9jYXNlc18uZW5kKCkpCisgICAgcmV0dXJuICp0ZXN0X2Nhc2U7CisKKyAgLy8gTm8uICBMZXQncyBjcmVhdGUgb25lLgorICBUZXN0Q2FzZSogY29uc3QgbmV3X3Rlc3RfY2FzZSA9CisgICAgICBuZXcgVGVzdENhc2UodGVzdF9jYXNlX25hbWUsIHR5cGVfcGFyYW0sIHNldF91cF90YywgdGVhcl9kb3duX3RjKTsKKworICAvLyBJcyB0aGlzIGEgZGVhdGggdGVzdCBjYXNlPworICBpZiAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcihTdHJpbmcodGVzdF9jYXNlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVhdGhUZXN0Q2FzZUZpbHRlcikpIHsKKyAgICAvLyBZZXMuICBJbnNlcnRzIHRoZSB0ZXN0IGNhc2UgYWZ0ZXIgdGhlIGxhc3QgZGVhdGggdGVzdCBjYXNlCisgICAgLy8gZGVmaW5lZCBzbyBmYXIuICBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0aGUgdGVzdCBjYXNlcyBoYXZlbid0CisgICAgLy8gYmVlbiBzaHVmZmxlZC4gIE90aGVyd2lzZSB3ZSBtYXkgZW5kIHVwIHJ1bm5pbmcgYSBkZWF0aCB0ZXN0CisgICAgLy8gYWZ0ZXIgYSBub24tZGVhdGggdGVzdC4KKyAgICArK2xhc3RfZGVhdGhfdGVzdF9jYXNlXzsKKyAgICB0ZXN0X2Nhc2VzXy5pbnNlcnQodGVzdF9jYXNlc18uYmVnaW4oKSArIGxhc3RfZGVhdGhfdGVzdF9jYXNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rlc3RfY2FzZSk7CisgIH0gZWxzZSB7CisgICAgLy8gTm8uICBBcHBlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgdGVzdF9jYXNlc18ucHVzaF9iYWNrKG5ld190ZXN0X2Nhc2UpOworICB9CisKKyAgdGVzdF9jYXNlX2luZGljZXNfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZV9pbmRpY2VzXy5zaXplKCkpKTsKKyAgcmV0dXJuIG5ld190ZXN0X2Nhc2U7Cit9CisKKy8vIEhlbHBlcnMgZm9yIHNldHRpbmcgdXAgLyB0ZWFyaW5nIGRvd24gdGhlIGdpdmVuIGVudmlyb25tZW50LiAgVGhleQorLy8gYXJlIGZvciB1c2UgaW4gdGhlIEZvckVhY2goKSBmdW5jdGlvbi4KK3N0YXRpYyB2b2lkIFNldFVwRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeyBlbnYtPlNldFVwKCk7IH0KK3N0YXRpYyB2b2lkIFRlYXJEb3duRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeyBlbnYtPlRlYXJEb3duKCk7IH0KKworLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKKy8vIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgZXhjZXB0aW9uIGlzCisvLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhlIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dCB0aGUKKy8vIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgorLy8KKy8vIFdoZW4gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCwgaXQgZXhwYW5kcyBhbmQgcmVnaXN0ZXJzCisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpcnN0IGluIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkuCisvLyBBbGwgb3RoZXIgZnVuY3Rpb25zIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzKCkgbWF5IHNhZmVseSBhc3N1bWUgdGhhdAorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgcmVhZHkgdG8gYmUgY291bnRlZCBhbmQgcnVuLgorYm9vbCBVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzKCkgeworICAvLyBNYWtlcyBzdXJlIEluaXRHb29nbGVUZXN0KCkgd2FzIGNhbGxlZC4KKyAgaWYgKCFHVGVzdElzSW5pdGlhbGl6ZWQoKSkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiXG5UaGlzIHRlc3QgcHJvZ3JhbSBkaWQgTk9UIGNhbGwgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCAiCisgICAgICAgICAgICJiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuICBQbGVhc2UgZml4IGl0LlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRG8gbm90IHJ1biBhbnkgdGVzdCBpZiB0aGUgLS1oZWxwIGZsYWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgKGdfaGVscF9mbGFnKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFJlcGVhdHMgdGhlIGNhbGwgdG8gdGhlIHBvc3QtZmxhZyBwYXJzaW5nIGluaXRpYWxpemF0aW9uIGluIGNhc2UgdGhlCisgIC8vIHVzZXIgZGlkbid0IGNhbGwgSW5pdEdvb2dsZVRlc3QuCisgIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKKworICAvLyBFdmVuIGlmIHNoYXJkaW5nIGlzIG5vdCBvbiwgdGVzdCBydW5uZXJzIG1heSB3YW50IHRvIHVzZSB0aGUKKyAgLy8gR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgdG8gcXVlcnkgd2hldGhlciB0aGUgdGVzdCBzdXBwb3J0cyB0aGUgc2hhcmRpbmcKKyAgLy8gcHJvdG9jb2wuCisgIGludGVybmFsOjpXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKKworICAvLyBUcnVlIGlmZiB3ZSBhcmUgaW4gYSBzdWJwcm9jZXNzIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUtc3R5bGUKKyAgLy8gZGVhdGggdGVzdC4KKyAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gZmFsc2U7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIGNvbnN0IGJvb2wgc2hvdWxkX3NoYXJkID0gU2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisgIC8vIENvbXBhcmVzIHRoZSBmdWxsIHRlc3QgbmFtZXMgd2l0aCB0aGUgZmlsdGVyIHRvIGRlY2lkZSB3aGljaAorICAvLyB0ZXN0cyB0byBydW4uCisgIGNvbnN0IGJvb2wgaGFzX3Rlc3RzX3RvX3J1biA9IEZpbHRlclRlc3RzKHNob3VsZF9zaGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IElHTk9SRV9TSEFSRElOR19QUk9UT0NPTCkgPiAwOworCisgIC8vIExpc3RzIHRoZSB0ZXN0cyBhbmQgZXhpdHMgaWYgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB7CisgICAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIEZpbHRlclRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkLgorICAgIExpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHNodWZmbGUpID8KKyAgICAgIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgOiAwOworCisgIC8vIFRydWUgaWZmIGF0IGxlYXN0IG9uZSB0ZXN0IGhhcyBmYWlsZWQuCisgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gbGlzdGVuZXJzKCktPnJlcGVhdGVyKCk7CisKKyAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1TdGFydCgqcGFyZW50Xyk7CisKKyAgLy8gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IHRoZSB0ZXN0cz8gIFdlIGRvbid0IHdhbnQgdG8gcmVwZWF0IHRoZW0KKyAgLy8gd2hlbiB3ZSBhcmUgaW5zaWRlIHRoZSBzdWJwcm9jZXNzIG9mIGEgZGVhdGggdGVzdC4KKyAgY29uc3QgaW50IHJlcGVhdCA9IGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPyAxIDogR1RFU1RfRkxBRyhyZXBlYXQpOworICAvLyBSZXBlYXRzIGZvcmV2ZXIgaWYgdGhlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZS4KKyAgY29uc3QgYm9vbCBmb3JldmVyID0gcmVwZWF0IDwgMDsKKyAgZm9yIChpbnQgaSA9IDA7IGZvcmV2ZXIgfHwgaSAhPSByZXBlYXQ7IGkrKykgeworICAgIC8vIFdlIHdhbnQgdG8gcHJlc2VydmUgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IGFkLWhvYyB0ZXN0CisgICAgLy8gYXNzZXJ0aW9ucyBleGVjdXRlZCBiZWZvcmUgUlVOX0FMTF9URVNUUygpLgorICAgIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCk7CisKKyAgICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBHZXRUaW1lSW5NaWxsaXMoKTsKKworICAgIC8vIFNodWZmbGVzIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1biAmJiBHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgICByYW5kb20oKS0+UmVzZWVkKHJhbmRvbV9zZWVkXyk7CisgICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KCksCisgICAgICAvLyBzdWNoIHRoYXQgYSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGNhbiBzZWUgdGhlIGFjdHVhbCB0ZXN0IG9yZGVyCisgICAgICAvLyBpbiB0aGUgZXZlbnQuCisgICAgICBTaHVmZmxlVGVzdHMoKTsKKyAgICB9CisKKyAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IHRoZSB0ZXN0cyBhcmUgYWJvdXQgdG8gc3RhcnQuCisgICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KCpwYXJlbnRfLCBpKTsKKworICAgIC8vIFJ1bnMgZWFjaCB0ZXN0IGNhc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRlc3QgdG8gcnVuLgorICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuKSB7CisgICAgICAvLyBTZXRzIHVwIGFsbCBlbnZpcm9ubWVudHMgYmVmb3JlaGFuZC4KKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwU3RhcnQoKnBhcmVudF8pOworICAgICAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBTZXRVcEVudmlyb25tZW50KTsKKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwRW5kKCpwYXJlbnRfKTsKKworICAgICAgLy8gUnVucyB0aGUgdGVzdHMgb25seSBpZiB0aGVyZSB3YXMgbm8gZmF0YWwgZmFpbHVyZSBkdXJpbmcgZ2xvYmFsCisgICAgICAvLyBzZXQtdXAuCisgICAgICBpZiAoIVRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgICAgIGZvciAoaW50IHRlc3RfaW5kZXggPSAwOyB0ZXN0X2luZGV4IDwgdG90YWxfdGVzdF9jYXNlX2NvdW50KCk7CisgICAgICAgICAgICAgdGVzdF9pbmRleCsrKSB7CisgICAgICAgICAgR2V0TXV0YWJsZVRlc3RDYXNlKHRlc3RfaW5kZXgpLT5SdW4oKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBUZWFycyBkb3duIGFsbCBlbnZpcm9ubWVudHMgaW4gcmV2ZXJzZSBvcmRlciBhZnRlcndhcmRzLgorICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgqcGFyZW50Xyk7CisgICAgICBzdGQ6OmZvcl9lYWNoKGVudmlyb25tZW50c18ucmJlZ2luKCksIGVudmlyb25tZW50c18ucmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBUZWFyRG93bkVudmlyb25tZW50KTsKKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kKCpwYXJlbnRfKTsKKyAgICB9CisKKyAgICBlbGFwc2VkX3RpbWVfID0gR2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCB0aGUgdGVzdHMgaGF2ZSBqdXN0IGZpbmlzaGVkLgorICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25FbmQoKnBhcmVudF8sIGkpOworCisgICAgLy8gR2V0cyB0aGUgcmVzdWx0IGFuZCBjbGVhcnMgaXQuCisgICAgaWYgKCFQYXNzZWQoKSkgeworICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgdGVzdCBvcmRlciBhZnRlciB0aGUgaXRlcmF0aW9uLiAgVGhpcworICAgIC8vIGFsbG93cyB0aGUgdXNlciB0byBxdWlja2x5IHJlcHJvIGEgZmFpbHVyZSB0aGF0IGhhcHBlbnMgaW4gdGhlCisgICAgLy8gTi10aCBpdGVyYXRpb24gd2l0aG91dCByZXBlYXRpbmcgdGhlIGZpcnN0IChOIC0gMSkgaXRlcmF0aW9ucy4KKyAgICAvLyBUaGlzIGlzIG5vdCBlbmNsb3NlZCBpbiAiaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsgLi4uIH0iLCBpbgorICAgIC8vIGNhc2UgdGhlIHVzZXIgc29tZWhvdyBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBzb21ld2hlcmUKKyAgICAvLyAoaXQncyBhbHdheXMgc2FmZSB0byB1bnNodWZmbGUgdGhlIHRlc3RzKS4KKyAgICBVbnNodWZmbGVUZXN0cygpOworCisgICAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICAgIC8vIFBpY2tzIGEgbmV3IHJhbmRvbSBzZWVkIGZvciBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgIHJhbmRvbV9zZWVkXyA9IEdldE5leHRSYW5kb21TZWVkKHJhbmRvbV9zZWVkXyk7CisgICAgfQorICB9CisKKyAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1FbmQoKnBhcmVudF8pOworCisgIHJldHVybiAhZmFpbGVkOworfQorCisvLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCisvLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKKy8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKKy8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCit2b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgdGVzdF9zaGFyZF9maWxlID0gcG9zaXg6OkdldEVudihrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgIGlmICh0ZXN0X3NoYXJkX2ZpbGUgIT0gTlVMTCkgeworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4odGVzdF9zaGFyZF9maWxlLCAidyIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlIFwiJXNcIiAiCisgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgYnkgdGhlICVzIGVudmlyb25tZW50IHZhcmlhYmxlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9zaGFyZF9maWxlLCBrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICB9Cit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoaS5lLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK2Jvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX2VudiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfZW52LAorICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBJbnQzMkZyb21FbnZPckRpZSh0b3RhbF9zaGFyZHNfZW52LCAtMSk7CisgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoc2hhcmRfaW5kZXhfZW52LCAtMSk7CisKKyAgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggIT0gLTEpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCisgICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA9ICIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyAhPSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKKyAgICAgIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiA9ICIgPDwgdG90YWxfc2hhcmRzCisgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHNoYXJkX2luZGV4IDwgMCB8fCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB3ZSByZXF1aXJlIDAgPD0gIgorICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPCAiIDw8IGtUZXN0VG90YWxTaGFyZHMKKyAgICAgIDw8ICIsIGJ1dCB5b3UgaGF2ZSAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiPSIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiPSIgPDwgdG90YWxfc2hhcmRzIDw8ICIuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NoYXJkcyA+IDE7Cit9CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yCisvLyBhbmQgYWJvcnRzLgorSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCkgeworICBjb25zdCBjaGFyKiBzdHJfdmFsID0gcG9zaXg6OkdldEVudih2YXIpOworICBpZiAoc3RyX3ZhbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsOworICB9CisKKyAgSW50MzIgcmVzdWx0OworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCB2YXIsCisgICAgICAgICAgICAgICAgICBzdHJfdmFsLCAmcmVzdWx0KSkgeworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZChpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKSB7CisgIHJldHVybiAodGVzdF9pZCAlIHRvdGFsX3NoYXJkcykgPT0gc2hhcmRfaW5kZXg7Cit9CisKKy8vIENvbXBhcmVzIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgdG8KKy8vIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4sIHRoZW4gcmVjb3JkcyB0aGUgcmVzdWx0IGluCisvLyBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCisvLyBJZiBzaGFyZF90ZXN0cyA9PSB0cnVlLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMgYmFzZWQgb24gc2hhcmRpbmcKKy8vIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQgLSBzZWUKKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6RmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKSB7CisgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0VG90YWxTaGFyZHMsIC0xKSA6IC0xOworICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpIDogLTE7CisKKyAgLy8gbnVtX3J1bm5hYmxlX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgd2lsbAorICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuCisgIC8vIG51bV9zZWxlY3RlZF90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBydW4gb24KKyAgLy8gdGhpcyBzaGFyZC4KKyAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7CisgIGludCBudW1fc2VsZWN0ZWRfdGVzdHMgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOworICAgIGNvbnN0IFN0cmluZyAmdGVzdF9jYXNlX25hbWUgPSB0ZXN0X2Nhc2UtPm5hbWUoKTsKKyAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKGZhbHNlKTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7CisgICAgICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgY29uc3QgU3RyaW5nIHRlc3RfbmFtZSh0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAvLyBBIHRlc3QgaXMgZGlzYWJsZWQgaWYgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMKKyAgICAgIC8vIGtEaXNhYmxlVGVzdEZpbHRlci4KKyAgICAgIGNvbnN0IGJvb2wgaXNfZGlzYWJsZWQgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpIHx8CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpOworICAgICAgdGVzdF9pbmZvLT5pc19kaXNhYmxlZF8gPSBpc19kaXNhYmxlZDsKKworICAgICAgY29uc3QgYm9vbCBtYXRjaGVzX2ZpbHRlciA9CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTsKKyAgICAgIHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfID0gbWF0Y2hlc19maWx0ZXI7CisKKyAgICAgIGNvbnN0IGJvb2wgaXNfcnVubmFibGUgPQorICAgICAgICAgIChHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSB8fCAhaXNfZGlzYWJsZWQpICYmCisgICAgICAgICAgbWF0Y2hlc19maWx0ZXI7CisKKyAgICAgIGNvbnN0IGJvb2wgaXNfc2VsZWN0ZWQgPSBpc19ydW5uYWJsZSAmJgorICAgICAgICAgIChzaGFyZF90ZXN0cyA9PSBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wgfHwKKyAgICAgICAgICAgU2hvdWxkUnVuVGVzdE9uU2hhcmQodG90YWxfc2hhcmRzLCBzaGFyZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3J1bm5hYmxlX3Rlc3RzKSk7CisKKyAgICAgIG51bV9ydW5uYWJsZV90ZXN0cyArPSBpc19ydW5uYWJsZTsKKyAgICAgIG51bV9zZWxlY3RlZF90ZXN0cyArPSBpc19zZWxlY3RlZDsKKworICAgICAgdGVzdF9pbmZvLT5zaG91bGRfcnVuXyA9IGlzX3NlbGVjdGVkOworICAgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bih0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSB8fCBpc19zZWxlY3RlZCk7CisgICAgfQorICB9CisgIHJldHVybiBudW1fc2VsZWN0ZWRfdGVzdHM7Cit9CisKKy8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VzX1tpXTsKKyAgICBib29sIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSBmYWxzZTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgICAgICB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07CisgICAgICBpZiAodGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcl8pIHsKKyAgICAgICAgaWYgKCFwcmludGVkX3Rlc3RfY2FzZV9uYW1lKSB7CisgICAgICAgICAgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IHRydWU7CisgICAgICAgICAgcHJpbnRmKCIlcy5cbiIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiAgJXNcbiIsIHRlc3RfaW5mby0+bmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4KKy8vCisvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgYXJlCisvLyB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUgaW5wdXQgdGhlCisvLyBjdXJyZW50IGdldHRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKAorICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKSB7CisgIGlmIChvc19zdGFja190cmFjZV9nZXR0ZXJfICE9IGdldHRlcikgeworICAgIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOworICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBnZXR0ZXI7CisgIH0KK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7CisvLyBvdGhlcndpc2UsIGNyZWF0ZXMgYW4gT3NTdGFja1RyYWNlR2V0dGVyLCBtYWtlcyBpdCB0aGUgY3VycmVudAorLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KK09zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogVW5pdFRlc3RJbXBsOjpvc19zdGFja190cmFjZV9nZXR0ZXIoKSB7CisgIGlmIChvc19zdGFja190cmFjZV9nZXR0ZXJfID09IE5VTEwpIHsKKyAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gbmV3IE9zU3RhY2tUcmFjZUdldHRlcjsKKyAgfQorCisgIHJldHVybiBvc19zdGFja190cmFjZV9nZXR0ZXJfOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsIG9yCisvLyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0IGlmIG5vIHRlc3QgaXMgcnVubmluZy4KK1Rlc3RSZXN1bHQqIFVuaXRUZXN0SW1wbDo6Y3VycmVudF90ZXN0X3Jlc3VsdCgpIHsKKyAgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXyA/CisgICAgICAmKGN1cnJlbnRfdGVzdF9pbmZvXy0+cmVzdWx0XykgOiAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsKK30KKworLy8gU2h1ZmZsZXMgYWxsIHRlc3QgY2FzZXMsIGFuZCB0aGUgdGVzdHMgd2l0aGluIGVhY2ggdGVzdCBjYXNlLAorLy8gbWFraW5nIHN1cmUgdGhhdCBkZWF0aCB0ZXN0cyBhcmUgc3RpbGwgcnVuIGZpcnN0Lgordm9pZCBVbml0VGVzdEltcGw6OlNodWZmbGVUZXN0cygpIHsKKyAgLy8gU2h1ZmZsZXMgdGhlIGRlYXRoIHRlc3QgY2FzZXMuCisgIFNodWZmbGVSYW5nZShyYW5kb20oKSwgMCwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7CisKKyAgLy8gU2h1ZmZsZXMgdGhlIG5vbi1kZWF0aCB0ZXN0IGNhc2VzLgorICBTaHVmZmxlUmFuZ2UocmFuZG9tKCksIGxhc3RfZGVhdGhfdGVzdF9jYXNlXyArIDEsCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZXNfLnNpemUoKSksICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOworCisgIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbnNpZGUgZWFjaCB0ZXN0IGNhc2UuCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICB0ZXN0X2Nhc2VzX1tpXS0+U2h1ZmZsZVRlc3RzKHJhbmRvbSgpKTsKKyAgfQorfQorCisvLyBSZXN0b3JlcyB0aGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdG8gdGhlaXIgb3JkZXIgYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgordm9pZCBVbml0VGVzdEltcGw6OlVuc2h1ZmZsZVRlc3RzKCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgLy8gVW5zaHVmZmxlcyB0aGUgdGVzdHMgaW4gZWFjaCB0ZXN0IGNhc2UuCisgICAgdGVzdF9jYXNlc19baV0tPlVuc2h1ZmZsZVRlc3RzKCk7CisgICAgLy8gUmVzZXRzIHRoZSBpbmRleCBvZiBlYWNoIHRlc3QgY2FzZS4KKyAgICB0ZXN0X2Nhc2VfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYSBTdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKC4uLiwgMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4KKy8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK1N0cmluZyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKFVuaXRUZXN0KiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpIHsKKyAgLy8gV2UgcGFzcyBza2lwX2NvdW50ICsgMSB0byBza2lwIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpbiBhZGRpdGlvbgorICAvLyB0byB3aGF0IHRoZSB1c2VyIHJlYWxseSB3YW50cyB0byBza2lwLgorICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3Aoc2tpcF9jb3VudCArIDEpOworfQorCisvLyBVc2VkIGJ5IHRoZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfIG1hY3JvIHRvCisvLyBzdXBwcmVzcyB1bnJlYWNoYWJsZSBjb2RlIHdhcm5pbmdzLgorbmFtZXNwYWNlIHsKK2NsYXNzIENsYXNzVW5pcXVlVG9BbHdheXNUcnVlIHt9OworfQorCitib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9CisKK2Jvb2wgQWx3YXlzVHJ1ZSgpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICAvLyBUaGlzIGNvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2Ugc28gQWx3YXlzVHJ1ZSgpIG5ldmVyIGFjdHVhbGx5IHRocm93cywKKyAgLy8gYnV0IGl0IG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGF0IGl0IG1heSB0aHJvdy4KKyAgaWYgKElzVHJ1ZShmYWxzZSkpCisgICAgdGhyb3cgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0CisvLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKKy8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KK2Jvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKSB7CisgIGNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7CisgIGlmIChzdHJuY21wKCpwc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApIHsKKyAgICAqcHN0ciArPSBwcmVmaXhfbGVuOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlCisvLyB0aGUgZm9ybWF0ICItLWZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlICI9dmFsdWUiCisvLyBwYXJ0IGNhbiBiZSBvbWl0dGVkLgorLy8KKy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KK2NvbnN0IGNoYXIqIFBhcnNlRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgeworICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KKyAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLSIgZm9sbG93ZWQgYnkgR1RFU1RfRkxBR19QUkVGSVhfLgorICBjb25zdCBTdHJpbmcgZmxhZ19zdHIgPSBTdHJpbmc6OkZvcm1hdCgiLS0lcyVzIiwgR1RFU1RfRkxBR19QUkVGSVhfLCBmbGFnKTsKKyAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7CisgIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBOVUxMOworCisgIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCisgIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47CisKKyAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCisgIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7CisgICAgcmV0dXJuIGZsYWdfZW5kOworICB9CisKKyAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCisgIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCisgIC8vIHRoZSBmbGFnIG5hbWUuCisgIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOworCisgIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCisgIHJldHVybiBmbGFnX2VuZCArIDE7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcgorLy8gIi0tZmxhZz12YWx1ZSIgb3IgIi0tZmxhZyIuCisvLworLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBhcyBsb25nIGFzIGl0IGRvZXMKKy8vIG5vdCBzdGFydCB3aXRoICcwJywgJ2YnLCBvciAnRicuCisvLworLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCisgICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgcmV0dXJuIFBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZmxhZyAtLSIgPDwgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZSk7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIFN0cmluZyogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgKnZhbHVlID0gdmFsdWVfc3RyOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGhhcyBhIHByZWZpeCB0aGF0IEdvb2dsZSBUZXN0IHVzZXMgZm9yIGl0cworLy8gZmxhZ3MsIGkuZS4sIHN0YXJ0cyB3aXRoIEdURVNUX0ZMQUdfUFJFRklYXyBvciBHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXy4KKy8vIElmIEdvb2dsZSBUZXN0IGRldGVjdHMgdGhhdCBhIGNvbW1hbmQgbGluZSBmbGFnIGhhcyBpdHMgcHJlZml4IGJ1dCBpcyBub3QKKy8vIHJlY29nbml6ZWQsIGl0IHdpbGwgcHJpbnQgaXRzIGhlbHAgbWVzc2FnZS4gRmxhZ3Mgc3RhcnRpbmcgd2l0aAorLy8gR1RFU1RfSU5URVJOQUxfUFJFRklYXyBmb2xsb3dlZCBieSAiaW50ZXJuYWxfIiBhcmUgY29uc2lkZXJlZCBHb29nbGUgVGVzdAorLy8gaW50ZXJuYWwgZmxhZ3MgYW5kIGRvIG5vdCB0cmlnZ2VyIHRoZSBoZWxwIG1lc3NhZ2UuCitzdGF0aWMgYm9vbCBIYXNHb29nbGVUZXN0RmxhZ1ByZWZpeChjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIChTa2lwUHJlZml4KCItLSIsICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeCgiLSIsICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeCgiLyIsICZzdHIpKSAmJgorICAgICAgICAgIVNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfICJpbnRlcm5hbF8iLCAmc3RyKSAmJgorICAgICAgICAgKFNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfREFTSF8sICZzdHIpKTsKK30KKworLy8gUHJpbnRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29kZS1lbmNvZGVkIHRleHQuICBUaGUgZm9sbG93aW5nIGVzY2FwZQorLy8gc2VxdWVuY2VzIGNhbiBiZSB1c2VkIGluIHRoZSBzdHJpbmcgdG8gY29udHJvbCB0aGUgdGV4dCBjb2xvcjoKKy8vCisvLyAgIEBAICAgIHByaW50cyBhIHNpbmdsZSAnQCcgY2hhcmFjdGVyLgorLy8gICBAUiAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byByZWQuCisvLyAgIEBHICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIGdyZWVuLgorLy8gICBAWSAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byB5ZWxsb3cuCisvLyAgIEBEICAgIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdGVybWluYWwgdGV4dCBjb2xvci4KKy8vCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogV3JpdGUgdGVzdHMgZm9yIHRoaXMgb25jZSB3ZSBhZGQgc3Rkb3V0CisvLyBjYXB0dXJpbmcgdG8gR29vZ2xlIFRlc3QuCitzdGF0aWMgdm9pZCBQcmludENvbG9yRW5jb2RlZChjb25zdCBjaGFyKiBzdHIpIHsKKyAgR1Rlc3RDb2xvciBjb2xvciA9IENPTE9SX0RFRkFVTFQ7ICAvLyBUaGUgY3VycmVudCBjb2xvci4KKworICAvLyBDb25jZXB0dWFsbHksIHdlIHNwbGl0IHRoZSBzdHJpbmcgaW50byBzZWdtZW50cyBkaXZpZGVkIGJ5IGVzY2FwZQorICAvLyBzZXF1ZW5jZXMuICBUaGVuIHdlIHByaW50IG9uZSBzZWdtZW50IGF0IGEgdGltZS4gIEF0IHRoZSBlbmQgb2YKKyAgLy8gZWFjaCBpdGVyYXRpb24sIHRoZSBzdHIgcG9pbnRlciBhZHZhbmNlcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAvLyBuZXh0IHNlZ21lbnQuCisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyKiBwID0gc3RyY2hyKHN0ciwgJ0AnKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiJXMiLCBzdHIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIFN0cmluZyhzdHIsIHAgLSBzdHIpLmNfc3RyKCkpOworCisgICAgY29uc3QgY2hhciBjaCA9IHBbMV07CisgICAgc3RyID0gcCArIDI7CisgICAgaWYgKGNoID09ICdAJykgeworICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIkAiKTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdEJykgeworICAgICAgY29sb3IgPSBDT0xPUl9ERUZBVUxUOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1InKSB7CisgICAgICBjb2xvciA9IENPTE9SX1JFRDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdHJykgeworICAgICAgY29sb3IgPSBDT0xPUl9HUkVFTjsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdZJykgeworICAgICAgY29sb3IgPSBDT0xPUl9ZRUxMT1c7CisgICAgfSBlbHNlIHsKKyAgICAgIC0tc3RyOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciBrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2VbXSA9CisiVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmcgIiBHVEVTVF9OQU1FXyAiLiBZb3UgY2FuIHVzZSB0aGVcbiIKKyJmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOlxuIgorIlxuIgorIlRlc3QgU2VsZWN0aW9uOlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQERcbiIKKyIgICAgICBMaXN0IHRoZSBuYW1lcyBvZiBhbGwgdGVzdHMgaW5zdGVhZCBvZiBydW5uaW5nIHRoZW0uIFRoZSBuYW1lIG9mXG4iCisiICAgICAgVEVTVChGb28sIEJhcikgaXMgXCJGb28uQmFyXCIuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZpbHRlcj1AWVBPU1RJVkVfUEFUVEVSTlMiCisgICAgIltARy1AWU5FR0FUSVZFX1BBVFRFUk5TXUBEXG4iCisiICAgICAgUnVuIG9ubHkgdGhlIHRlc3RzIHdob3NlIG5hbWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGJ1dFxuIgorIiAgICAgIG5vbmUgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiAnPycgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlcjsgJyonXG4iCisiICAgICAgbWF0Y2hlcyBhbnkgc3Vic3RyaW5nOyAnOicgc2VwYXJhdGVzIHR3byBwYXR0ZXJucy5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNARFxuIgorIiAgICAgIFJ1biBhbGwgZGlzYWJsZWQgdGVzdHMgdG9vLlxuIgorIlxuIgorIlRlc3QgRXhlY3V0aW9uOlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyZXBlYXQ9QFlbQ09VTlRdQERcbiIKKyIgICAgICBSdW4gdGhlIHRlc3RzIHJlcGVhdGVkbHk7IHVzZSBhIG5lZ2F0aXZlIGNvdW50IHRvIHJlcGVhdCBmb3JldmVyLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzaHVmZmxlQERcbiIKKyIgICAgICBSYW5kb21pemUgdGVzdHMnIG9yZGVycyBvbiBldmVyeSBpdGVyYXRpb24uXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJhbmRvbV9zZWVkPUBZW05VTUJFUl1ARFxuIgorIiAgICAgIFJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2UgZm9yIHNodWZmbGluZyB0ZXN0IG9yZGVycyAoYmV0d2VlbiAxIGFuZFxuIgorIiAgICAgIDk5OTk5LCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSkuXG4iCisiXG4iCisiVGVzdCBPdXRwdXQ6XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNvbG9yPUBZKEBHeWVzQFl8QEdub0BZfEBHYXV0b0BZKUBEXG4iCisiICAgICAgRW5hYmxlL2Rpc2FibGUgY29sb3JlZCBvdXRwdXQuIFRoZSBkZWZhdWx0IGlzIEBHYXV0b0BELlxuIgorIiAgLUBHLSIgR1RFU1RfRkxBR19QUkVGSVhfICJwcmludF90aW1lPTBARFxuIgorIiAgICAgIERvbid0IHByaW50IHRoZSBlbGFwc2VkIHRpbWUgb2YgZWFjaCB0ZXN0LlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJvdXRwdXQ9eG1sQFlbQEc6QFlESVJFQ1RPUllfUEFUSEBHIgorICAgIEdURVNUX1BBVEhfU0VQXyAiQFl8QEc6QFlGSUxFX1BBVEhdQERcbiIKKyIgICAgICBHZW5lcmF0ZSBhbiBYTUwgcmVwb3J0IGluIHRoZSBnaXZlbiBkaXJlY3Rvcnkgb3Igd2l0aCB0aGUgZ2l2ZW4gZmlsZVxuIgorIiAgICAgIG5hbWUuIEBZRklMRV9QQVRIQEQgZGVmYXVsdHMgdG8gQEd0ZXN0X2RldGFpbHMueG1sQEQuXG4iCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzdHJlYW1fcmVzdWx0X3RvPUBZSE9TVEBHOkBZUE9SVEBEXG4iCisiICAgICAgU3RyZWFtIHRlc3QgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLlxuIgorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisiXG4iCisiQXNzZXJ0aW9uIEJlaGF2aW9yOlxuIgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImRlYXRoX3Rlc3Rfc3R5bGU9QFkoQEdmYXN0QFl8QEd0aHJlYWRzYWZlQFkpQERcbiIKKyIgICAgICBTZXQgdGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS5cbiIKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgJiYgIUdURVNUX09TX1dJTkRPV1MKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYnJlYWtfb25fZmFpbHVyZUBEXG4iCisiICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBkZWJ1Z2dlciBicmVhay1wb2ludHMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInRocm93X29uX2ZhaWx1cmVARFxuIgorIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gQysrIGV4Y2VwdGlvbnMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNhdGNoX2V4Y2VwdGlvbnM9MEBEXG4iCisiICAgICAgRG8gbm90IHJlcG9ydCBleGNlcHRpb25zIGFzIHRlc3QgZmFpbHVyZXMuIEluc3RlYWQsIGFsbG93IHRoZW1cbiIKKyIgICAgICB0byBjcmFzaCB0aGUgcHJvZ3JhbSBvciB0aHJvdyBhIHBvcC11cCAob24gV2luZG93cykuXG4iCisiXG4iCisiRXhjZXB0IGZvciBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHNldCAiCisgICAgInRoZSBjb3JyZXNwb25kaW5nXG4iCisiZW52aXJvbm1lbnQgdmFyaWFibGUgb2YgYSBmbGFnIChhbGwgbGV0dGVycyBpbiB1cHBlci1jYXNlKS4gRm9yIGV4YW1wbGUsIHRvXG4iCisiZGlzYWJsZSBjb2xvcmVkIHRleHQgb3V0cHV0LCB5b3UgY2FuIGVpdGhlciBzcGVjaWZ5IEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXworICAgICJjb2xvcj1ub0BEIG9yIHNldFxuIgorInRoZSBARyIgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJDT0xPUkBEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIEBHbm9ARC5cbiIKKyJcbiIKKyJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgdGhlICIgR1RFU1RfTkFNRV8gIiBkb2N1bWVudGF0aW9uIGF0XG4iCisiQEciIEdURVNUX1BST0pFQ1RfVVJMXyAiQEQuIElmIHlvdSBmaW5kIGEgYnVnIGluICIgR1RFU1RfTkFNRV8gIlxuIgorIihub3Qgb25lIGluIHlvdXIgb3duIGNvZGUgb3IgdGVzdHMpLCBwbGVhc2UgcmVwb3J0IGl0IHRvXG4iCisiQEc8IiBHVEVTVF9ERVZfRU1BSUxfICI+QEQuXG4iOworCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4gIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgKmFyZ2M7IGkrKykgeworICAgIGNvbnN0IFN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZyA9IGFyZ19zdHJpbmcuY19zdHIoKTsKKworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUJvb2xGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUludDMyRmxhZzsKKyAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VTdHJpbmdGbGFnOworCisgICAgLy8gRG8gd2Ugc2VlIGEgR29vZ2xlIFRlc3QgZmxhZz8KKyAgICBpZiAoUGFyc2VCb29sRmxhZyhhcmcsIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0JyZWFrT25GYWlsdXJlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtDYXRjaEV4Y2VwdGlvbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrQ29sb3JGbGFnLCAmR1RFU1RfRkxBRyhjb2xvcikpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtEZWF0aFRlc3RTdHlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtEZWF0aFRlc3RVc2VGb3JrLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRmlsdGVyRmxhZywgJkdURVNUX0ZMQUcoZmlsdGVyKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtMaXN0VGVzdHNGbGFnLCAmR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga091dHB1dEZsYWcsICZHVEVTVF9GTEFHKG91dHB1dCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrUHJpbnRUaW1lRmxhZywgJkdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JhbmRvbVNlZWRGbGFnLCAmR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JlcGVhdEZsYWcsICZHVEVTVF9GTEFHKHJlcGVhdCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrU2h1ZmZsZUZsYWcsICZHVEVTVF9GTEFHKHNodWZmbGUpKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtTdGFja1RyYWNlRGVwdGhGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtTdHJlYW1SZXN1bHRUb0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtUaHJvd09uRmFpbHVyZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpCisgICAgICAgICkgeworICAgICAgLy8gWWVzLiAgU2hpZnQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndiBsaXN0IGxlZnQgYnkgb25lLiAgTm90ZQorICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZworICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzCisgICAgICAvLyB3ZWxsLgorICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgeworICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07CisgICAgICB9CisKKyAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50LgorICAgICAgKCphcmdjKS0tOworCisgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQKKyAgICAgIC8vIGFuIGVsZW1lbnQuCisgICAgICBpLS07CisgICAgfSBlbHNlIGlmIChhcmdfc3RyaW5nID09ICItLWhlbHAiIHx8IGFyZ19zdHJpbmcgPT0gIi1oIiB8fAorICAgICAgICAgICAgICAgYXJnX3N0cmluZyA9PSAiLT8iIHx8IGFyZ19zdHJpbmcgPT0gIi8/IiB8fAorICAgICAgICAgICAgICAgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoYXJnKSkgeworICAgICAgLy8gQm90aCBoZWxwIGZsYWcgYW5kIHVucmVjb2duaXplZCBHb29nbGUgVGVzdCBmbGFncyAoZXhjbHVkaW5nCisgICAgICAvLyBpbnRlcm5hbCBvbmVzKSB0cmlnZ2VyIGhlbHAgZGlzcGxheS4KKyAgICAgIGdfaGVscF9mbGFnID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoZ19oZWxwX2ZsYWcpIHsKKyAgICAvLyBXZSBwcmludCB0aGUgaGVscCBoZXJlIGluc3RlYWQgb2YgaW4gUlVOX0FMTF9URVNUUygpLCBhcyB0aGUKKyAgICAvLyBsYXR0ZXIgbWF5IG5vdCBiZSBjYWxsZWQgYXQgYWxsIGlmIHRoZSB1c2VyIGlzIHVzaW5nIEdvb2dsZQorICAgIC8vIFRlc3Qgd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrLgorICAgIFByaW50Q29sb3JFbmNvZGVkKGtDb2xvckVuY29kZWRIZWxwTWVzc2FnZSk7CisgIH0KK30KKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9Cit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlVGVzdCgpLgorLy8KKy8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yCisvLyB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBJbml0R29vZ2xlVGVzdEltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKKyAgZ19pbml0X2d0ZXN0X2NvdW50Kys7CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUgdHdpY2UuCisgIGlmIChnX2luaXRfZ3Rlc3RfY291bnQgIT0gMSkgcmV0dXJuOworCisgIGlmICgqYXJnYyA8PSAwKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OmdfZXhlY3V0YWJsZV9wYXRoID0gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhhcmd2WzBdKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgZ19hcmd2cy5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSAhPSAqYXJnYzsgaSsrKSB7CisgICAgZ19hcmd2cy5wdXNoX2JhY2soU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pKTsKKyAgfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGFyZ2MsIGFyZ3YpOworICBHZXRVbml0VGVzdEltcGwoKS0+UG9zdEZsYWdQYXJzaW5nSW5pdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCisvLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQorLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCisvLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgorLy8KKy8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQorLy8gdXBkYXRlZC4KKy8vCisvLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0Lgordm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK3ZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgeworICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdF9tYWluLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3NyYy9ndGVzdF9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWJiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvc3JjL2d0ZXN0X21haW4uY2MKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitHVEVTVF9BUElfIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgbWFpbigpIGZyb20gZ3Rlc3RfbWFpbi5jY1xuIjsKKworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwYTEzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYwpAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRlc3RzIHRoYXQgdmVyaWZ5IGludGVyYWN0aW9uIG9mIGV4Y2VwdGlvbnMgYW5kIGRlYXRoIHRlc3RzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjIGlmIEdURVNUX0hBU19TRUgKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4gICAgICAgICAgLy8gRm9yIFJhaXNlRXhjZXB0aW9uKCkuCisjIGVuZGlmCisKKyMgaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKyMgaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworIyAgaW5jbHVkZSA8ZXhjZXB0aW9uPiAgLy8gRm9yIHN0ZDo6ZXhjZXB0aW9uLgorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHJlcG9ydCB0aHJvd24gZXhjZXB0aW9ucyBhcyBmYWlsdXJlcyBhbmQgdGhhdCB0aGUKKy8vIGV4Y2VwdGlvbnMgZG8gbm90IGVzY2FwZSBkZWF0aCB0ZXN0IG1hY3Jvcy4KK1RFU1QoQ3h4RXhjZXB0aW9uRGVhdGhUZXN0LCBFeGNlcHRpb25Jc0ZhaWx1cmUpIHsKKyAgdHJ5IHsKKyAgICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgodGhyb3cgMSwgIiIpLCAidGhyZXcgYW4gZXhjZXB0aW9uIik7CisgIH0gY2F0Y2ggKC4uLikgeyAgLy8gTk9MSU5UCisgICAgRkFJTCgpIDw8ICJBbiBleGNlcHRpb24gZXNjYXBlZCBhIGRlYXRoIHRlc3QgbWFjcm8gaW52b2NhdGlvbiAiCisgICAgICAgICAgIDw8ICJ3aXRoIGNhdGNoX2V4Y2VwdGlvbnMgIgorICAgICAgICAgICA8PCAodGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworICB9Cit9CisKK2NsYXNzIFRlc3RFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24geworIHB1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7IHJldHVybiAiZXhjZXB0aW9uYWwgbWVzc2FnZSI7IH0KK307CisKK1RFU1QoQ3h4RXhjZXB0aW9uRGVhdGhUZXN0LCBQcmludHNNZXNzYWdlRm9yU3RkRXhjZXB0aW9ucykgeworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBleGNlcHRpb24gbWVzc2FnZSBpcyBxdW90ZWQgaW4gdGhlIGZhaWx1cmUgdGV4dC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHRocm93IFRlc3RFeGNlcHRpb24oKSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uYWwgbWVzc2FnZSIpOworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBsb2NhdGlvbiBpcyBtZW50aW9uZWQgaW4gdGhlIGZhaWx1cmUgdGV4dC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHRocm93IFRlc3RFeGNlcHRpb24oKSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjIik7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisjIGlmIEdURVNUX0hBU19TRUgKKy8vIFRlc3RzIHRoYXQgZW5hYmxpbmcgaW50ZXJjZXB0aW9uIG9mIFNFSCBleGNlcHRpb25zIHdpdGggdGhlCisvLyBjYXRjaF9leGNlcHRpb25zIGZsYWcgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggU0VIIGV4Y2VwdGlvbnMgYmVpbmcKKy8vIHRyZWF0ZWQgYXMgZGVhdGggYnkgZGVhdGggdGVzdHMuCitURVNUKFNlaEV4Y2VwdGlvbkRlYXNUZXN0LCBDYXRjaEV4Y2VwdGlvbnNEb2VzTm90SW50ZXJmZXJlKSB7CisgIEVYUEVDVF9ERUFUSChSYWlzZUV4Y2VwdGlvbig0MiwgMHgwLCAwLCBOVUxMKSwgIiIpCisgICAgICA8PCAid2l0aCBjYXRjaF9leGNlcHRpb25zICIKKyAgICAgIDw8ICh0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Cit9CisjIGVuZGlmCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IEdURVNUX0VOQUJMRV9DQVRDSF9FWENFUFRJT05TXyAhPSAwOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjhlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MKQEAgLTAsMCArMSwxMjk2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRlc3RzIGZvciBkZWF0aCB0ZXN0cy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisjICBpbmNsdWRlIDxkaXJlY3QuaD4gICAgICAgICAgLy8gRm9yIGNoZGlyKCkuCisjIGVsc2UKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgaW5jbHVkZSA8c3lzL3dhaXQuaD4gICAgICAgIC8vIEZvciB3YWl0cGlkLgorIyAgaW5jbHVkZSA8bGltaXRzPiAgICAgICAgICAgIC8vIEZvciBzdGQ6Om51bWVyaWNfbGltaXRzLgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorIyBpbmNsdWRlIDxzaWduYWwuaD4KKyMgaW5jbHVkZSA8c3RkaW8uaD4KKworIyBpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyMgZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjIGluY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyMgdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSBwb3NpeCA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OworCit1c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZpbGVQYXRoOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldExhc3RFcnJub0Rlc2NyaXB0aW9uOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpQYXJzZU5hdHVyYWxOdW1iZXI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nOworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyB3aG9zZSBvYmplY3RzIHJlcGxhY2UgdGhlIGRlYXRoIHRlc3QgZmFjdG9yeSBmb3IgYQorLy8gc2luZ2xlIFVuaXRUZXN0IG9iamVjdCBkdXJpbmcgdGhlaXIgbGlmZXRpbWVzLgorY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkoRGVhdGhUZXN0RmFjdG9yeSogbmV3X2ZhY3RvcnkpCisgICAgICA6IHVuaXRfdGVzdF9pbXBsXyhHZXRVbml0VGVzdEltcGwoKSkgeworICAgIG9sZF9mYWN0b3J5XyA9IHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZWxlYXNlKCk7CisgICAgdW5pdF90ZXN0X2ltcGxfLT5kZWF0aF90ZXN0X2ZhY3RvcnlfLnJlc2V0KG5ld19mYWN0b3J5KTsKKyAgfQorCisgIH5SZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSgpIHsKKyAgICB1bml0X3Rlc3RfaW1wbF8tPmRlYXRoX3Rlc3RfZmFjdG9yeV8ucmVsZWFzZSgpOworICAgIHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZXNldChvbGRfZmFjdG9yeV8pOworICB9CisgcHJpdmF0ZToKKyAgLy8gUHJldmVudHMgY29weWluZyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSBvYmplY3RzLgorICBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShjb25zdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSYpOworCisgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0X2ltcGxfOworICBEZWF0aFRlc3RGYWN0b3J5KiBvbGRfZmFjdG9yeV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3ZvaWQgRGllV2l0aE1lc3NhZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZGVycik7ICAvLyBNYWtlIHN1cmUgdGhlIHRleHQgaXMgcHJpbnRlZCBiZWZvcmUgdGhlIHByb2Nlc3MgZXhpdHMuCisKKyAgLy8gV2UgY2FsbCBfZXhpdCgpIGluc3RlYWQgb2YgZXhpdCgpLCBhcyB0aGUgZm9ybWVyIGlzIGEgZGlyZWN0CisgIC8vIHN5c3RlbSBjYWxsIGFuZCB0aHVzIHNhZmVyIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzLiAgZXhpdCgpCisgIC8vIHdpbGwgaW52b2tlIHVzZXItZGVmaW5lZCBleGl0LWhvb2tzLCB3aGljaCBtYXkgZG8gZGFuZ2Vyb3VzCisgIC8vIHRoaW5ncyB0aGF0IGNvbmZsaWN0IHdpdGggZGVhdGggdGVzdHMuCisgIC8vCisgIC8vIFNvbWUgY29tcGlsZXJzIGNhbiByZWNvZ25pemUgdGhhdCBfZXhpdCgpIG5ldmVyIHJldHVybnMgYW5kIGlzc3VlIHRoZQorICAvLyAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyBmb3IgY29kZSBmb2xsb3dpbmcgdGhpcyBmdW5jdGlvbiwgdW5sZXNzCisgIC8vIGZvb2xlZCBieSBhIGZha2UgY29uZGl0aW9uLgorICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIF9leGl0KDEpOworfQorCit2b2lkIERpZUluc2lkZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBmdW5jdGlvbikgeworICBEaWVXaXRoTWVzc2FnZSgiZGVhdGggaW5zaWRlICIgKyBmdW5jdGlvbiArICIoKS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyB3b3JrLgorCitjbGFzcyBUZXN0Rm9yRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgVGVzdEZvckRlYXRoVGVzdCgpIDogb3JpZ2luYWxfZGlyXyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpKSB7fQorCisgIHZpcnR1YWwgflRlc3RGb3JEZWF0aFRlc3QoKSB7CisgICAgcG9zaXg6OkNoRGlyKG9yaWdpbmFsX2Rpcl8uY19zdHIoKSk7CisgIH0KKworICAvLyBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KKyAgc3RhdGljIHZvaWQgU3RhdGljTWVtYmVyRnVuY3Rpb24oKSB7IERpZUluc2lkZSgiU3RhdGljTWVtYmVyRnVuY3Rpb24iKTsgfQorCisgIC8vIEEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgdGhhdCBtYXkgZGllLgorICB2b2lkIE1lbWJlckZ1bmN0aW9uKCkgeworICAgIGlmIChzaG91bGRfZGllXykKKyAgICAgIERpZUluc2lkZSgiTWVtYmVyRnVuY3Rpb24iKTsKKyAgfQorCisgIC8vIFRydWUgaWZmIE1lbWJlckZ1bmN0aW9uKCkgc2hvdWxkIGRpZS4KKyAgYm9vbCBzaG91bGRfZGllXzsKKyAgY29uc3QgRmlsZVBhdGggb3JpZ2luYWxfZGlyXzsKK307CisKKy8vIEEgY2xhc3Mgd2l0aCBhIG1lbWJlciBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCitjbGFzcyBNYXlEaWUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWF5RGllKGJvb2wgc2hvdWxkX2RpZSkgOiBzaG91bGRfZGllXyhzaG91bGRfZGllKSB7fQorCisgIC8vIEEgbWVtYmVyIGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KKyAgdm9pZCBNZW1iZXJGdW5jdGlvbigpIGNvbnN0IHsKKyAgICBpZiAoc2hvdWxkX2RpZV8pCisgICAgICBEaWVJbnNpZGUoIk1heURpZTo6TWVtYmVyRnVuY3Rpb24iKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVHJ1ZSBpZmYgTWVtYmVyRnVuY3Rpb24oKSBzaG91bGQgZGllLgorICBib29sIHNob3VsZF9kaWVfOworfTsKKworLy8gQSBnbG9iYWwgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KK3ZvaWQgR2xvYmFsRnVuY3Rpb24oKSB7IERpZUluc2lkZSgiR2xvYmFsRnVuY3Rpb24iKTsgfQorCisvLyBBIG5vbi12b2lkIGZ1bmN0aW9uIHRoYXQncyBleHBlY3RlZCB0byBkaWUuCitpbnQgTm9uVm9pZEZ1bmN0aW9uKCkgeworICBEaWVJbnNpZGUoIk5vblZvaWRGdW5jdGlvbiIpOworICByZXR1cm4gMTsKK30KKworLy8gQSB1bmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCit2b2lkIERpZUlmKGJvb2wgc2hvdWxkX2RpZSkgeworICBpZiAoc2hvdWxkX2RpZSkKKyAgICBEaWVJbnNpZGUoIkRpZUlmIik7Cit9CisKKy8vIEEgYmluYXJ5IGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KK2Jvb2wgRGllSWZMZXNzVGhhbihpbnQgeCwgaW50IHkpIHsKKyAgaWYgKHggPCB5KSB7CisgICAgRGllSW5zaWRlKCJEaWVJZkxlc3NUaGFuIik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGNhbiBiZSB1c2VkIG91dHNpZGUgYSBURVNULCBURVNUX0YsIG9yIHRlc3QgZml4dHVyZS4KK3ZvaWQgRGVhdGhUZXN0U3Vicm91dGluZSgpIHsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJkZWF0aC4qR2xvYmFsRnVuY3Rpb24iKTsKKyAgQVNTRVJUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJkZWF0aC4qR2xvYmFsRnVuY3Rpb24iKTsKK30KKworLy8gRGVhdGggaW4gZGJnLCBub3Qgb3B0LgoraW50IERpZUluRGVidWdFbHNlMTIoaW50KiBzaWRlZWZmZWN0KSB7CisgIGlmIChzaWRlZWZmZWN0KSAqc2lkZWVmZmVjdCA9IDEyOworCisjIGlmbmRlZiBOREVCVUcKKworICBEaWVJbnNpZGUoIkRpZUluRGVidWdFbHNlMTIiKTsKKworIyBlbmRpZiAgLy8gTkRFQlVHCisKKyAgcmV0dXJuIDEyOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhlIEV4aXRlZFdpdGhDb2RlIHByZWRpY2F0ZS4KK1RFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEV4aXRlZFdpdGhDb2RlKSB7CisgIC8vIE9uIFdpbmRvd3MsIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlzIHRoZSBzYW1lIGFzIGl0cyBleGl0IHN0YXR1cywKKyAgLy8gc28gdGhlIHByZWRpY2F0ZSBqdXN0IGNvbXBhcmVzIHRoZSBpdHMgaW5wdXQgd2l0aCBpdHMgcGFyYW1ldGVyLgorICBFWFBFQ1RfVFJVRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSgwKSk7CisgIEVYUEVDVF9UUlVFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpKDEpKTsKKyAgRVhQRUNUX1RSVUUodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoNDIpKDQyKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSgwKSk7Cit9CisKKyMgZWxzZQorCisvLyBSZXR1cm5zIHRoZSBleGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgdGhhdCBjYWxscyBfZXhpdCgyKSB3aXRoIGEKKy8vIGdpdmVuIGV4aXQgY29kZS4gIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZQorLy8gRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QgdGVzdCBzdWl0ZS4KK3N0YXRpYyBpbnQgTm9ybWFsRXhpdFN0YXR1cyhpbnQgZXhpdF9jb2RlKSB7CisgIHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgX2V4aXQoZXhpdF9jb2RlKTsKKyAgfQorICBpbnQgc3RhdHVzOworICB3YWl0cGlkKGNoaWxkX3BpZCwgJnN0YXR1cywgMCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIFJldHVybnMgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IHJhaXNlcyBhIGdpdmVuIHNpZ25hbC4KKy8vIElmIHRoZSBzaWduYWwgZG9lcyBub3QgY2F1c2UgdGhlIHByb2Nlc3MgdG8gZGllLCB0aGVuIGl0IHJldHVybnMKKy8vIGluc3RlYWQgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IGV4aXRzIG5vcm1hbGx5IHdpdGggZXhpdAorLy8gY29kZSAxLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0CisvLyB0ZXN0IHN1aXRlLgorc3RhdGljIGludCBLaWxsZWRFeGl0U3RhdHVzKGludCBzaWdudW0pIHsKKyAgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICBpZiAoY2hpbGRfcGlkID09IDApIHsKKyAgICByYWlzZShzaWdudW0pOworICAgIF9leGl0KDEpOworICB9CisgIGludCBzdGF0dXM7CisgIHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gVGVzdHMgdGhlIEV4aXRlZFdpdGhDb2RlIHByZWRpY2F0ZS4KK1RFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEV4aXRlZFdpdGhDb2RlKSB7CisgIGNvbnN0IGludCBzdGF0dXMwICA9IE5vcm1hbEV4aXRTdGF0dXMoMCk7CisgIGNvbnN0IGludCBzdGF0dXMxICA9IE5vcm1hbEV4aXRTdGF0dXMoMSk7CisgIGNvbnN0IGludCBzdGF0dXM0MiA9IE5vcm1hbEV4aXRTdGF0dXMoNDIpOworICBjb25zdCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSBwcmVkMCgwKTsKKyAgY29uc3QgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUgcHJlZDEoMSk7CisgIGNvbnN0IHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlIHByZWQ0Mig0Mik7CisgIEVYUEVDVF9QUkVEMShwcmVkMCwgIHN0YXR1czApOworICBFWFBFQ1RfUFJFRDEocHJlZDEsICBzdGF0dXMxKTsKKyAgRVhQRUNUX1BSRUQxKHByZWQ0Miwgc3RhdHVzNDIpOworICBFWFBFQ1RfRkFMU0UocHJlZDAoc3RhdHVzMSkpOworICBFWFBFQ1RfRkFMU0UocHJlZDQyKHN0YXR1czApKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWQxKHN0YXR1czQyKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBLaWxsZWRCeVNpZ25hbCBwcmVkaWNhdGUuCitURVNUKEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0LCBLaWxsZWRCeVNpZ25hbCkgeworICBjb25zdCBpbnQgc3RhdHVzX3NlZ3YgPSBLaWxsZWRFeGl0U3RhdHVzKFNJR1NFR1YpOworICBjb25zdCBpbnQgc3RhdHVzX2tpbGwgPSBLaWxsZWRFeGl0U3RhdHVzKFNJR0tJTEwpOworICBjb25zdCB0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbCBwcmVkX3NlZ3YoU0lHU0VHVik7CisgIGNvbnN0IHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsIHByZWRfa2lsbChTSUdLSUxMKTsKKyAgRVhQRUNUX1BSRUQxKHByZWRfc2Vndiwgc3RhdHVzX3NlZ3YpOworICBFWFBFQ1RfUFJFRDEocHJlZF9raWxsLCBzdGF0dXNfa2lsbCk7CisgIEVYUEVDVF9GQUxTRShwcmVkX3NlZ3Yoc3RhdHVzX2tpbGwpKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWRfa2lsbChzdGF0dXNfc2VndikpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIG1heSBvciBtYXkgbm90CisvLyBiZSBmb2xsb3dlZCBieSBvcGVyYXRvcjw8LCBhbmQgdGhhdCBpbiBlaXRoZXIgY2FzZSB0aGUgY29tcGxldGUgdGV4dAorLy8gY29tcHJpc2VzIG9ubHkgYSBzaW5nbGUgQysrIHN0YXRlbWVudC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgLy8gVGhpcyB3b3VsZCBmYWlsIGlmIGV4ZWN1dGVkOyB0aGlzIGlzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5CisgICAgQVNTRVJUX0RFQVRIKHJldHVybiwgIiIpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgIGVsc2UKKyAgICAvLyBUaGlzIGVtcHR5ICJlbHNlIiBicmFuY2ggaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgRVhQRUNUX0RFQVRICisgICAgLy8gZG9lc24ndCBleHBhbmQgaW50byBhbiAiaWYiIHN0YXRlbWVudCB3aXRob3V0IGFuICJlbHNlIgorICAgIDsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfREVBVEgocmV0dXJuLCAiIikgPDwgImRpZCBub3QgZGllIjsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7CisgIGVsc2UKKyAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAxIDw8IDIgPDwgMzsKK30KKwordm9pZCBEaWVXaXRoRW1iZWRkZWROdWwoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiSGVsbG8lY215IG51bGwgd29ybGQuXG4iLCAnXDAnKTsKKyAgZmZsdXNoKHN0ZGVycik7CisgIF9leGl0KDEpOworfQorCisjIGlmIEdURVNUX1VTRVNfUENSRQorLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCB3b3JrIHdoZW4gdGhlIGVycm9yCisvLyBtZXNzYWdlIGhhcyBhIE5VTCBjaGFyYWN0ZXIgaW4gaXQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRW1iZWRkZWROdWxJbk1lc3NhZ2UpIHsKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IDxyZWdleC5oPiBkb2Vzbid0IHN1cHBvcnQgbWF0Y2hpbmcgc3RyaW5ncworICAvLyB3aXRoIGVtYmVkZGVkIE5VTCBjaGFyYWN0ZXJzIC0gZmluZCBhIHdheSB0byB3b3JrYXJvdW5kIGl0LgorICBFWFBFQ1RfREVBVEgoRGllV2l0aEVtYmVkZGVkTnVsKCksICJteSBudWxsIHdvcmxkIik7CisgIEFTU0VSVF9ERUFUSChEaWVXaXRoRW1iZWRkZWROdWwoKSwgIm15IG51bGwgd29ybGQiKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX1VTRVNfUENSRQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIGludGVyYWN0cyB3ZWxsIHdpdGggc3dpdGNoCisvLyBzdGF0ZW1lbnRzLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN3aXRjaFN0YXRlbWVudCkgeworLy8gTWljcm9zb2Z0IGNvbXBpbGVyIHVzdWFsbHkgY29tcGxhaW5zIGFib3V0IHN3aXRjaCBzdGF0ZW1lbnRzIHdpdGhvdXQKKy8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDY1KQorIyBlbmRpZiAgLy8gX01TQ19WRVIKKworICBzd2l0Y2ggKDApCisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIGRlZmF1bHQgc3dpdGNoIGhhbmRsZXIiOworCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAiZXhpdCBpbiBzd2l0Y2ggY2FzZSI7CisKKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIFRlc3RzIHRoYXQgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgImZhc3QiIHN0eWxlCisvLyBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN0YXRpY01lbWJlckZ1bmN0aW9uRmFzdFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEFTU0VSVF9ERUFUSChTdGF0aWNNZW1iZXJGdW5jdGlvbigpLCAiZGVhdGguKlN0YXRpY01lbWJlciIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2FuIGJlIHVzZWQgaW4gYSAiZmFzdCIKKy8vIHN0eWxlIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWVtYmVyRnVuY3Rpb25GYXN0U3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgc2hvdWxkX2RpZV8gPSB0cnVlOworICBFWFBFQ1RfREVBVEgoTWVtYmVyRnVuY3Rpb24oKSwgImluc2lkZS4qTWVtYmVyRnVuY3Rpb24iKTsKK30KKwordm9pZCBDaGFuZ2VUb1Jvb3REaXIoKSB7IHBvc2l4OjpDaERpcihHVEVTVF9QQVRIX1NFUF8pOyB9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgd29yayBldmVuIGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYXMgYmVlbgorLy8gY2hhbmdlZC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBGYXN0RGVhdGhUZXN0SW5DaGFuZ2VkRGlyKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEVYUEVDVF9FWElUKF9leGl0KDEpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSwgIiIpOworCisgIENoYW5nZVRvUm9vdERpcigpOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKTsKK30KKworLy8gUmVwZWF0cyBhIHJlcHJlc2VudGF0aXZlIHNhbXBsZSBvZiBkZWF0aCB0ZXN0cyBpbiB0aGUgInRocmVhZHNhZmUiIHN0eWxlOgorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU3RhdGljTWVtYmVyRnVuY3Rpb25UaHJlYWRzYWZlU3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgQVNTRVJUX0RFQVRIKFN0YXRpY01lbWJlckZ1bmN0aW9uKCksICJkZWF0aC4qU3RhdGljTWVtYmVyIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBNZW1iZXJGdW5jdGlvblRocmVhZHNhZmVTdHlsZSkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworICBzaG91bGRfZGllXyA9IHRydWU7CisgIEVYUEVDVF9ERUFUSChNZW1iZXJGdW5jdGlvbigpLCAiaW5zaWRlLipNZW1iZXJGdW5jdGlvbiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGhyZWFkc2FmZURlYXRoVGVzdEluTG9vcCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKQorICAgIEVYUEVDVF9FWElUKF9leGl0KGkpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZShpKSwgIiIpIDw8ICI6IGkgPSAiIDw8IGk7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUaHJlYWRzYWZlRGVhdGhUZXN0SW5DaGFuZ2VkRGlyKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEVYUEVDVF9FWElUKF9leGl0KDEpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSwgIiIpOworCisgIENoYW5nZVRvUm9vdERpcigpOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1peGVkU3R5bGVzKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKK30KKworbmFtZXNwYWNlIHsKKworYm9vbCBwdGhyZWFkX2ZsYWc7CisKK3ZvaWQgU2V0UHRocmVhZEZsYWcoKSB7CisgIHB0aHJlYWRfZmxhZyA9IHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisjIGlmIEdURVNUX0hBU19DTE9ORSAmJiBHVEVTVF9IQVNfUFRIUkVBRAorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRG9lc05vdEV4ZWN1dGVBdGZvcmtIb29rcykgeworICBpZiAoIXRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpIHsKKyAgICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworICAgIHB0aHJlYWRfZmxhZyA9IGZhbHNlOworICAgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0Zm9yaygmU2V0UHRocmVhZEZsYWcsIE5VTEwsIE5VTEwpKTsKKyAgICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgICBBU1NFUlRfRkFMU0UocHRocmVhZF9mbGFnKTsKKyAgfQorfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUgJiYgR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gVGVzdHMgdGhhdCBhIG1ldGhvZCBvZiBhbm90aGVyIGNsYXNzIGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBNZXRob2RPZkFub3RoZXJDbGFzcykgeworICBjb25zdCBNYXlEaWUgeCh0cnVlKTsKKyAgQVNTRVJUX0RFQVRIKHguTWVtYmVyRnVuY3Rpb24oKSwgIk1heURpZVxcOlxcOk1lbWJlckZ1bmN0aW9uIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBnbG9iYWwgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEdsb2JhbEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCAiR2xvYmFsRnVuY3Rpb24iKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbnkgdmFsdWUgY29udmVydGlibGUgdG8gYW4gUkUgd29ya3MgYXMgYSBzZWNvbmQKKy8vIGFyZ3VtZW50IHRvIEVYUEVDVF9ERUFUSC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBY2NlcHRzQW55dGhpbmdDb252ZXJ0aWJsZVRvUkUpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgcmVnZXhfY19zdHJbXSA9ICJHbG9iYWxGdW5jdGlvbiI7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9jX3N0cik7CisKKyAgY29uc3QgdGVzdGluZzo6aW50ZXJuYWw6OlJFIHJlZ2V4KHJlZ2V4X2Nfc3RyKTsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksIHJlZ2V4KTsKKworIyBpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIGNvbnN0IHN0cmluZyByZWdleF9zdHIocmVnZXhfY19zdHIpOworICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXhfc3RyKTsKKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBjb25zdCA6OnN0ZDo6c3RyaW5nIHJlZ2V4X3N0ZF9zdHIocmVnZXhfY19zdHIpOworICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXhfc3RkX3N0cik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBub24tdm9pZCBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTm9uVm9pZEZ1bmN0aW9uKSB7CisgIEFTU0VSVF9ERUFUSChOb25Wb2lkRnVuY3Rpb24oKSwgIk5vblZvaWRGdW5jdGlvbiIpOworfQorCisvLyBUZXN0cyB0aGF0IGZ1bmN0aW9ucyB0aGF0IHRha2UgcGFyYW1ldGVyKHMpIGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBGdW5jdGlvbldpdGhQYXJhbWV0ZXIpIHsKKyAgRVhQRUNUX0RFQVRIKERpZUlmKHRydWUpLCAiRGllSWZcXChcXCkiKTsKKyAgRVhQRUNUX0RFQVRIKERpZUlmTGVzc1RoYW4oMiwgMyksICJEaWVJZkxlc3NUaGFuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGNhbiBiZSB1c2VkIG91dHNpZGUgYSBURVNULCBURVNUX0YsIG9yIHRlc3QgZml4dHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBPdXRzaWRlRml4dHVyZSkgeworICBEZWF0aFRlc3RTdWJyb3V0aW5lKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgY2FuIGJlIGRvbmUgaW5zaWRlIGEgbG9vcC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBJbnNpZGVMb29wKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgRVhQRUNUX0RFQVRIKERpZUlmTGVzc1RoYW4oLTEsIGkpLCAiRGllSWZMZXNzVGhhbiIpIDw8ICJ3aGVyZSBpID09ICIgPDwgaTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IGEgY29tcG91bmQgc3RhdGVtZW50IGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBDb21wb3VuZFN0YXRlbWVudCkgeworICBFWFBFQ1RfREVBVEgoeyAgLy8gTk9MSU5UCisgICAgY29uc3QgaW50IHggPSAyOworICAgIGNvbnN0IGludCB5ID0geCArIDE7CisgICAgRGllSWZMZXNzVGhhbih4LCB5KTsKKyAgfSwKKyAgIkRpZUlmTGVzc1RoYW4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBjb2RlIHRoYXQgZG9lc24ndCBkaWUgY2F1c2VzIGEgZGVhdGggdGVzdCB0byBmYWlsLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERvZXNOb3REaWUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGllIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBkZWF0aCB0ZXN0IGZhaWxzIHdoZW4gdGhlIGVycm9yIG1lc3NhZ2UgaXNuJ3QgZXhwZWN0ZWQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXJyb3JNZXNzYWdlTWlzbWF0Y2gpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0RFQVRIKERpZUlmKHRydWUpLCAiRGllSWZMZXNzVGhhbiIpIDw8ICJFbmQgb2YgZGVhdGggdGVzdCBtZXNzYWdlLiI7CisgIH0sICJkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBlcnJvciIpOworfQorCisvLyBPbiBleGl0LCAqYWJvcnRlZCB3aWxsIGJlIHRydWUgaWZmIHRoZSBFWFBFQ1RfREVBVEgoKSBzdGF0ZW1lbnQKKy8vIGFib3J0ZWQgdGhlIGZ1bmN0aW9uLgordm9pZCBFeHBlY3REZWF0aFRlc3RIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICAqYWJvcnRlZCA9IHRydWU7CisgIEVYUEVDVF9ERUFUSChEaWVJZihmYWxzZSksICJEaWVJZiIpOyAgLy8gVGhpcyBhc3NlcnRpb24gc2hvdWxkIGZhaWwuCisgICphYm9ydGVkID0gZmFsc2U7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQVRIIGRvZXNuJ3QgYWJvcnQgdGhlIHRlc3Qgb24gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFWFBFQ1RfREVBVEgpIHsKKyAgYm9vbCBhYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRXhwZWN0RGVhdGhUZXN0SGVscGVyKCZhYm9ydGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkaWUiKTsKKyAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOworfQorCisvLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUFUSCBkb2VzIGFib3J0IHRoZSB0ZXN0IG9uIGZhaWx1cmUuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQVNTRVJUX0RFQVRIKSB7CisgIHN0YXRpYyBib29sIGFib3J0ZWQ7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIGFib3J0ZWQgPSB0cnVlOworICAgIEFTU0VSVF9ERUFUSChEaWVJZihmYWxzZSksICJEaWVJZiIpOyAgLy8gVGhpcyBhc3NlcnRpb24gc2hvdWxkIGZhaWwuCisgICAgYWJvcnRlZCA9IGZhbHNlOworICB9LCAiZmFpbGVkIHRvIGRpZSIpOworICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggZXZhbHVhdGVzIHRoZSBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFNpbmdsZUV2YWx1YXRpb24pIHsKKyAgaW50IHggPSAzOworICBFWFBFQ1RfREVBVEgoRGllSWYoKCsreCkgPT0gNCksICJEaWVJZiIpOworCisgIGNvbnN0IGNoYXIqIHJlZ2V4ID0gIkRpZUlmIjsKKyAgY29uc3QgY2hhciogcmVnZXhfc2F2ZSA9IHJlZ2V4OworICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigzLCA0KSwgcmVnZXgrKyk7CisgIEVYUEVDVF9FUShyZWdleF9zYXZlICsgMSwgcmVnZXgpOworfQorCisvLyBUZXN0cyB0aGF0IHJ1bi1hd2F5IGRlYXRoIHRlc3RzIGFyZSByZXBvcnRlZCBhcyBmYWlsdXJlcy4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBSdW5hd2F5SXNGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSChzdGF0aWNfY2FzdDx2b2lkPigwKSwgIkZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRpZS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyByZXBvcnQgZXhlY3V0aW5nICdyZXR1cm4nIGluIHRoZSBzdGF0ZW1lbnQgYXMKKy8vIGZhaWx1cmUuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgUmV0dXJuSXNGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ERUFUSChyZXR1cm4sICJCYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUJVR19ERUFUSCB3b3JrcyBhcyBleHBlY3RlZCwKKy8vIHRoYXQgaXMsIGluIGRlYnVnIG1vZGUsIGl0OgorLy8gMS4gQXNzZXJ0cyBvbiBkZWF0aC4KKy8vIDIuIEhhcyBubyBzaWRlIGVmZmVjdC4KKy8vCisvLyBBbmQgaW4gb3B0IG1vZGUsIGl0OgorLy8gMS4gIEhhcyBzaWRlIGVmZmVjdHMgYnV0IGRvZXMgbm90IGFzc2VydC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUZXN0RXhwZWN0RGVidWdEZWF0aCkgeworICBpbnQgc2lkZWVmZmVjdCA9IDA7CisKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdFbHNlMTIoJnNpZGVlZmZlY3QpLAorICAgICAgICAgICAgICAgICAgICAgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIik7CisKKyMgaWZkZWYgTkRFQlVHCisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGFzc2lnbm1lbnQgb2NjdXJzIGluIG9wdCBtb2RlIChzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDEyLCBzaWRlZWZmZWN0KTsKKworIyBlbHNlCisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGFzc2lnbm1lbnQgZG9lcyBub3Qgb2NjdXIgaW4gZGJnIG1vZGUgKG5vIHNpZGVlZmZlY3QpLgorICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisKKyMgZW5kaWYKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVCVUdfREVBVEggd29ya3MgYXMgZXhwZWN0ZWQKKy8vIEluIGRlYnVnIG1vZGU6CisvLyAxLiBBc3NlcnRzIG9uIGRlYnVnIGRlYXRoLgorLy8gMi4gSGFzIG5vIHNpZGUgZWZmZWN0LgorLy8KKy8vIEluIG9wdCBtb2RlOgorLy8gMS4gSGFzIHNpZGUgZWZmZWN0cyBhbmQgcmV0dXJucyB0aGUgZXhwZWN0ZWQgdmFsdWUgKDEyKS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUZXN0QXNzZXJ0RGVidWdEZWF0aCkgeworICBpbnQgc2lkZWVmZmVjdCA9IDA7CisKKyAgQVNTRVJUX0RFQlVHX0RFQVRIKHsgIC8vIE5PTElOVAorICAgIC8vIFRlc3RzIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyAxMiBpbiBvcHQgbW9kZS4KKyAgICBFWFBFQ1RfRVEoMTIsIERpZUluRGVidWdFbHNlMTIoJnNpZGVlZmZlY3QpKTsKKyAgICAvLyBUZXN0cyB0aGF0IHRoZSBzaWRlIGVmZmVjdCBvY2N1cnJlZCBpbiBvcHQgbW9kZS4KKyAgICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworICB9LCAiZGVhdGguKkRpZUluRGVidWdFbHNlMTIiKTsKKworIyBpZmRlZiBOREVCVUcKKworICAvLyBDaGVja3MgdGhhdCB0aGUgYXNzaWdubWVudCBvY2N1cnMgaW4gb3B0IG1vZGUgKHNpZGVlZmZlY3QpLgorICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworCisjIGVsc2UKKworICAvLyBDaGVja3MgdGhhdCB0aGUgYXNzaWdubWVudCBkb2VzIG5vdCBvY2N1ciBpbiBkYmcgbW9kZSAobm8gc2lkZWVmZmVjdCkuCisgIEVYUEVDVF9FUSgwLCBzaWRlZWZmZWN0KTsKKworIyBlbmRpZgorfQorCisjIGlmbmRlZiBOREVCVUcKKwordm9pZCBFeHBlY3REZWJ1Z0RlYXRoSGVscGVyKGJvb2wqIGFib3J0ZWQpIHsKKyAgKmFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfREVCVUdfREVBVEgocmV0dXJuLCAiIikgPDwgIlRoaXMgaXMgZXhwZWN0ZWQgdG8gZmFpbC4iOworICAqYWJvcnRlZCA9IGZhbHNlOworfQorCisjICBpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKFBvcFVwRGVhdGhUZXN0LCBEb2VzTm90U2hvd1BvcFVwT25BYm9ydCkgeworICBwcmludGYoIlRoaXMgdGVzdCBzaG91bGQgYmUgY29uc2lkZXJlZCBmYWlsaW5nIGlmIGl0IHNob3dzICIKKyAgICAgICAgICJhbnkgcG9wLXVwIGRpYWxvZ3MuXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7CisKKyAgRVhQRUNUX0RFQVRIKHsKKyAgICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gZmFsc2U7CisgICAgYWJvcnQoKTsKKyAgfSwgIiIpOworfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVCVUdfREVBVEggaW4gZGVidWcgbW9kZSBkb2VzIG5vdCBhYm9ydAorLy8gdGhlIGZ1bmN0aW9uLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEV4cGVjdERlYnVnRGVhdGhEb2VzTm90QWJvcnQpIHsKKyAgYm9vbCBhYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRXhwZWN0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKKyAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOworfQorCit2b2lkIEFzc2VydERlYnVnRGVhdGhIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICAqYWJvcnRlZCA9IHRydWU7CisgIEFTU0VSVF9ERUJVR19ERUFUSChyZXR1cm4sICIiKSA8PCAiVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsLiI7CisgICphYm9ydGVkID0gZmFsc2U7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQlVHX0RFQVRIIGluIGRlYnVnIG1vZGUgYWJvcnRzIHRoZSBmdW5jdGlvbiBvbgorLy8gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzKSB7CisgIHN0YXRpYyBib29sIGFib3J0ZWQ7CisgIGFib3J0ZWQgPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKKyAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Cit9CisKKyMgZW5kaWYgIC8vIF9OREVCVUcKKworLy8gVGVzdHMgdGhlICpfRVhJVCBmYW1pbHkgb2YgbWFjcm9zLCB1c2luZyBhIHZhcmlldHkgb2YgcHJlZGljYXRlcy4KK3N0YXRpYyB2b2lkIFRlc3RFeGl0TWFjcm9zKCkgeworICBFWFBFQ1RfRVhJVChfZXhpdCgxKSwgIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpLCAgIiIpOworICBBU1NFUlRfRVhJVChfZXhpdCg0MiksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDQyKSwgIiIpOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBPZiBhbGwgc2lnbmFscyBlZmZlY3RzIG9uIHRoZSBwcm9jZXNzIGV4aXQgY29kZSwgb25seSB0aG9zZSBvZiBTSUdBQlJUCisgIC8vIGFyZSBkb2N1bWVudGVkIG9uIFdpbmRvd3MuCisgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZHd3emt0NGMoVlMuNzEpLmFzcHguCisgIEVYUEVDVF9FWElUKHJhaXNlKFNJR0FCUlQpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgzKSwgIiIpOworCisjIGVsc2UKKworICBFWFBFQ1RfRVhJVChyYWlzZShTSUdLSUxMKSwgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHS0lMTCksICIiKSA8PCAiZm9vIjsKKyAgQVNTRVJUX0VYSVQocmFpc2UoU0lHVVNSMiksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1VTUjIpLCAiIikgPDwgImJhciI7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VYSVQoX2V4aXQoMCksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1NFR1YpLCAiIikKKyAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgdG9vLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIHRvby4iKTsKKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9FWElUKHJhaXNlKFNJR1NFR1YpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpCisgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEV4aXRNYWNyb3MpIHsKKyAgVGVzdEV4aXRNYWNyb3MoKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEV4aXRNYWNyb3NVc2luZ0ZvcmspIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IHRydWU7CisgIFRlc3RFeGl0TWFjcm9zKCk7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBJbnZhbGlkU3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJyb2NvY28iOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMCksICIiKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RGYWlsZWRPdXRwdXQpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfREVBVEgoRGllV2l0aE1lc3NhZ2UoImRlYXRoXG4iKSwKKyAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbWVzc2FnZSIpLAorICAgICAgIkFjdHVhbCBtc2c6XG4iCisgICAgICAiWyAgREVBVEggICBdIGRlYXRoXG4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdFVuZXhwZWN0ZWRSZXR1cm5PdXRwdXQpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfREVBVEgoeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmV0dXJuaW5nXG4iKTsKKyAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0sICIiKSwKKyAgICAgICIgICAgUmVzdWx0OiBpbGxlZ2FsIHJldHVybiBpbiB0ZXN0IHN0YXRlbWVudC5cbiIKKyAgICAgICIgRXJyb3IgbXNnOlxuIgorICAgICAgIlsgIERFQVRIICAgXSByZXR1cm5pbmdcbiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0QmFkRXhpdENvZGVPdXRwdXQpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfRVhJVChEaWVXaXRoTWVzc2FnZSgiZXhpdGluZyB3aXRoIHJjIDFcbiIpLAorICAgICAgICAgICAgICAgICAgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMyksCisgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbWVzc2FnZSIpLAorICAgICAgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGV4aXQgY29kZTpcbiIKKyAgICAgICIgICAgICAgICAgICBFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAxXG4iCisgICAgICAiQWN0dWFsIG1zZzpcbiIKKyAgICAgICJbICBERUFUSCAgIF0gZXhpdGluZyB3aXRoIHJjIDFcbiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0TXVsdGlMaW5lTWF0Y2hGYWlsKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0RFQVRIKERpZVdpdGhNZXNzYWdlKCJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKSwKKyAgICAgICAgICAgICAgICAgICAibGluZSAxXG54eXpcbmxpbmUgM1xuIiksCisgICAgICAiQWN0dWFsIG1zZzpcbiIKKyAgICAgICJbICBERUFUSCAgIF0gbGluZSAxXG4iCisgICAgICAiWyAgREVBVEggICBdIGxpbmUgMlxuIgorICAgICAgIlsgIERFQVRIICAgXSBsaW5lIDNcbiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0TXVsdGlMaW5lTWF0Y2hQYXNzKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9ERUFUSChEaWVXaXRoTWVzc2FnZSgibGluZSAxXG5saW5lIDJcbmxpbmUgM1xuIiksCisgICAgICAgICAgICAgICAibGluZSAxXG5saW5lIDJcbmxpbmUgM1xuIik7Cit9CisKKy8vIEEgRGVhdGhUZXN0RmFjdG9yeSB0aGF0IHJldHVybnMgTW9ja0RlYXRoVGVzdHMuCitjbGFzcyBNb2NrRGVhdGhUZXN0RmFjdG9yeSA6IHB1YmxpYyBEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIE1vY2tEZWF0aFRlc3RGYWN0b3J5KCk7CisgIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCk7CisKKyAgLy8gU2V0cyB0aGUgcGFyYW1ldGVycyBmb3Igc3Vic2VxdWVudCBjYWxscyB0byBDcmVhdGUuCisgIHZvaWQgU2V0UGFyYW1ldGVycyhib29sIGNyZWF0ZSwgRGVhdGhUZXN0OjpUZXN0Um9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgYm9vbCBwYXNzZWQpOworCisgIC8vIEFjY2Vzc29ycy4KKyAgaW50IEFzc3VtZVJvbGVDYWxscygpIGNvbnN0IHsgcmV0dXJuIGFzc3VtZV9yb2xlX2NhbGxzXzsgfQorICBpbnQgV2FpdENhbGxzKCkgY29uc3QgeyByZXR1cm4gd2FpdF9jYWxsc187IH0KKyAgaW50IFBhc3NlZENhbGxzKCkgY29uc3QgeyByZXR1cm4gcGFzc2VkX2FyZ3NfLnNpemUoKTsgfQorICBib29sIFBhc3NlZEFyZ3VtZW50KGludCBuKSBjb25zdCB7IHJldHVybiBwYXNzZWRfYXJnc19bbl07IH0KKyAgaW50IEFib3J0Q2FsbHMoKSBjb25zdCB7IHJldHVybiBhYm9ydF9hcmdzXy5zaXplKCk7IH0KKyAgRGVhdGhUZXN0OjpBYm9ydFJlYXNvbiBBYm9ydEFyZ3VtZW50KGludCBuKSBjb25zdCB7CisgICAgcmV0dXJuIGFib3J0X2FyZ3NfW25dOworICB9CisgIGJvb2wgVGVzdERlbGV0ZWQoKSBjb25zdCB7IHJldHVybiB0ZXN0X2RlbGV0ZWRfOyB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTW9ja0RlYXRoVGVzdDsKKyAgLy8gSWYgdHJ1ZSwgQ3JlYXRlIHdpbGwgcmV0dXJuIGEgTW9ja0RlYXRoVGVzdDsgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAgLy8gTlVMTC4KKyAgYm9vbCBjcmVhdGVfOworICAvLyBUaGUgdmFsdWUgYSBNb2NrRGVhdGhUZXN0IHdpbGwgcmV0dXJuIGZyb20gaXRzIEFzc3VtZVJvbGUgbWV0aG9kLgorICBEZWF0aFRlc3Q6OlRlc3RSb2xlIHJvbGVfOworICAvLyBUaGUgdmFsdWUgYSBNb2NrRGVhdGhUZXN0IHdpbGwgcmV0dXJuIGZyb20gaXRzIFdhaXQgbWV0aG9kLgorICBpbnQgc3RhdHVzXzsKKyAgLy8gVGhlIHZhbHVlIGEgTW9ja0RlYXRoVGVzdCB3aWxsIHJldHVybiBmcm9tIGl0cyBQYXNzZWQgbWV0aG9kLgorICBib29sIHBhc3NlZF87CisKKyAgLy8gTnVtYmVyIG9mIHRpbWVzIEFzc3VtZVJvbGUgd2FzIGNhbGxlZC4KKyAgaW50IGFzc3VtZV9yb2xlX2NhbGxzXzsKKyAgLy8gTnVtYmVyIG9mIHRpbWVzIFdhaXQgd2FzIGNhbGxlZC4KKyAgaW50IHdhaXRfY2FsbHNfOworICAvLyBUaGUgYXJndW1lbnRzIHRvIHRoZSBjYWxscyB0byBQYXNzZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworICAvLyBTZXRQYXJhbWV0ZXJzLgorICBzdGQ6OnZlY3Rvcjxib29sPiBwYXNzZWRfYXJnc187CisgIC8vIFRoZSBhcmd1bWVudHMgdG8gdGhlIGNhbGxzIHRvIEFib3J0IHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KKyAgLy8gU2V0UGFyYW1ldGVycy4KKyAgc3RkOjp2ZWN0b3I8RGVhdGhUZXN0OjpBYm9ydFJlYXNvbj4gYWJvcnRfYXJnc187CisgIC8vIFRydWUgaWYgdGhlIGxhc3QgTW9ja0RlYXRoVGVzdCByZXR1cm5lZCBieSBDcmVhdGUgaGFzIGJlZW4KKyAgLy8gZGVsZXRlZC4KKyAgYm9vbCB0ZXN0X2RlbGV0ZWRfOworfTsKKworCisvLyBBIERlYXRoVGVzdCBpbXBsZW1lbnRhdGlvbiB1c2VmdWwgaW4gdGVzdGluZy4gIEl0IHJldHVybnMgdmFsdWVzIHNldAorLy8gYXQgaXRzIGNyZWF0aW9uIGZyb20gaXRzIHZhcmlvdXMgaW5oZXJpdGVkIERlYXRoVGVzdCBtZXRob2RzLCBhbmQKKy8vIHJlcG9ydHMgY2FsbHMgdG8gdGhvc2UgbWV0aG9kcyB0byBpdHMgcGFyZW50IE1vY2tEZWF0aFRlc3RGYWN0b3J5CisvLyBvYmplY3QuCitjbGFzcyBNb2NrRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdCB7CisgcHVibGljOgorICBNb2NrRGVhdGhUZXN0KE1vY2tEZWF0aFRlc3RGYWN0b3J5ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgVGVzdFJvbGUgcm9sZSwgaW50IHN0YXR1cywgYm9vbCBwYXNzZWQpIDoKKyAgICAgIHBhcmVudF8ocGFyZW50KSwgcm9sZV8ocm9sZSksIHN0YXR1c18oc3RhdHVzKSwgcGFzc2VkXyhwYXNzZWQpIHsKKyAgfQorICB2aXJ0dWFsIH5Nb2NrRGVhdGhUZXN0KCkgeworICAgIHBhcmVudF8tPnRlc3RfZGVsZXRlZF8gPSB0cnVlOworICB9CisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpIHsKKyAgICArK3BhcmVudF8tPmFzc3VtZV9yb2xlX2NhbGxzXzsKKyAgICByZXR1cm4gcm9sZV87CisgIH0KKyAgdmlydHVhbCBpbnQgV2FpdCgpIHsKKyAgICArK3BhcmVudF8tPndhaXRfY2FsbHNfOworICAgIHJldHVybiBzdGF0dXNfOworICB9CisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBleGl0X3N0YXR1c19vaykgeworICAgIHBhcmVudF8tPnBhc3NlZF9hcmdzXy5wdXNoX2JhY2soZXhpdF9zdGF0dXNfb2spOworICAgIHJldHVybiBwYXNzZWRfOworICB9CisgIHZpcnR1YWwgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pIHsKKyAgICBwYXJlbnRfLT5hYm9ydF9hcmdzXy5wdXNoX2JhY2socmVhc29uKTsKKyAgfQorIHByaXZhdGU6CisgIE1vY2tEZWF0aFRlc3RGYWN0b3J5KiBjb25zdCBwYXJlbnRfOworICBjb25zdCBUZXN0Um9sZSByb2xlXzsKKyAgY29uc3QgaW50IHN0YXR1c187CisgIGNvbnN0IGJvb2wgcGFzc2VkXzsKK307CisKKworLy8gTW9ja0RlYXRoVGVzdEZhY3RvcnkgY29uc3RydWN0b3IuCitNb2NrRGVhdGhUZXN0RmFjdG9yeTo6TW9ja0RlYXRoVGVzdEZhY3RvcnkoKQorICAgIDogY3JlYXRlXyh0cnVlKSwKKyAgICAgIHJvbGVfKERlYXRoVGVzdDo6T1ZFUlNFRV9URVNUKSwKKyAgICAgIHN0YXR1c18oMCksCisgICAgICBwYXNzZWRfKHRydWUpLAorICAgICAgYXNzdW1lX3JvbGVfY2FsbHNfKDApLAorICAgICAgd2FpdF9jYWxsc18oMCksCisgICAgICBwYXNzZWRfYXJnc18oKSwKKyAgICAgIGFib3J0X2FyZ3NfKCkgeworfQorCisKKy8vIFNldHMgdGhlIHBhcmFtZXRlcnMgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gQ3JlYXRlLgordm9pZCBNb2NrRGVhdGhUZXN0RmFjdG9yeTo6U2V0UGFyYW1ldGVycyhib29sIGNyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0OjpUZXN0Um9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCkgeworICBjcmVhdGVfID0gY3JlYXRlOworICByb2xlXyA9IHJvbGU7CisgIHN0YXR1c18gPSBzdGF0dXM7CisgIHBhc3NlZF8gPSBwYXNzZWQ7CisKKyAgYXNzdW1lX3JvbGVfY2FsbHNfID0gMDsKKyAgd2FpdF9jYWxsc18gPSAwOworICBwYXNzZWRfYXJnc18uY2xlYXIoKTsKKyAgYWJvcnRfYXJnc18uY2xlYXIoKTsKK30KKworCisvLyBTZXRzIHRlc3QgdG8gTlVMTCAoaWYgY3JlYXRlXyBpcyBmYWxzZSkgb3IgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcKKy8vIE1vY2tEZWF0aFRlc3Qgb2JqZWN0IHdpdGggcGFyYW1ldGVycyB0YWtlbiBmcm9tIHRoZSBsYXN0IGNhbGwKKy8vIHRvIFNldFBhcmFtZXRlcnMgKGlmIGNyZWF0ZV8gaXMgdHJ1ZSkuICBBbHdheXMgcmV0dXJucyB0cnVlLgorYm9vbCBNb2NrRGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIC8qc3RhdGVtZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUqIC8qcmVnZXgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKmZpbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypsaW5lKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0KiogdGVzdCkgeworICB0ZXN0X2RlbGV0ZWRfID0gZmFsc2U7CisgIGlmIChjcmVhdGVfKSB7CisgICAgKnRlc3QgPSBuZXcgTW9ja0RlYXRoVGVzdCh0aGlzLCByb2xlXywgc3RhdHVzXywgcGFzc2VkXyk7CisgIH0gZWxzZSB7CisgICAgKnRlc3QgPSBOVUxMOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBBIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyB0aGUgbG9naWMgb2YgdGhlIEdURVNUX0RFQVRIX1RFU1RfIG1hY3JvLgorLy8gSXQgaW5zdGFsbHMgYSBNb2NrRGVhdGhUZXN0RmFjdG9yeSB0aGF0IGlzIHVzZWQgZm9yIHRoZSBkdXJhdGlvbgorLy8gb2YgdGhlIHRlc3QgY2FzZS4KK2NsYXNzIE1hY3JvTG9naWNEZWF0aFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdGVzdGluZzo6aW50ZXJuYWw6OlJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KiByZXBsYWNlcl87CisgIHN0YXRpYyBNb2NrRGVhdGhUZXN0RmFjdG9yeSogZmFjdG9yeV87CisKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBmYWN0b3J5XyA9IG5ldyBNb2NrRGVhdGhUZXN0RmFjdG9yeTsKKyAgICByZXBsYWNlcl8gPSBuZXcgdGVzdGluZzo6aW50ZXJuYWw6OlJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KGZhY3RvcnlfKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgZGVsZXRlIHJlcGxhY2VyXzsKKyAgICByZXBsYWNlcl8gPSBOVUxMOworICAgIGRlbGV0ZSBmYWN0b3J5XzsKKyAgICBmYWN0b3J5XyA9IE5VTEw7CisgIH0KKworICAvLyBSdW5zIGEgZGVhdGggdGVzdCB0aGF0IGJyZWFrcyB0aGUgcnVsZXMgYnkgcmV0dXJuaW5nLiAgU3VjaCBhIGRlYXRoCisgIC8vIHRlc3QgY2Fubm90IGJlIHJ1biBkaXJlY3RseSBmcm9tIGEgdGVzdCByb3V0aW5lIHRoYXQgdXNlcyBhCisgIC8vIE1vY2tEZWF0aFRlc3QsIG9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJvdXRpbmUgd2lsbCBub3QgYmUgZXhlY3V0ZWQuCisgIHN0YXRpYyB2b2lkIFJ1blJldHVybmluZ0RlYXRoVGVzdChib29sKiBmbGFnKSB7CisgICAgQVNTRVJUX0RFQVRIKHsgIC8vIE5PTElOVAorICAgICAgKmZsYWcgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0sICIiKTsKKyAgfQorfTsKKwordGVzdGluZzo6aW50ZXJuYWw6OlJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KiBNYWNyb0xvZ2ljRGVhdGhUZXN0OjpyZXBsYWNlcl8KKyAgICA9IE5VTEw7CitNb2NrRGVhdGhUZXN0RmFjdG9yeSogTWFjcm9Mb2dpY0RlYXRoVGVzdDo6ZmFjdG9yeV8gPSBOVUxMOworCisKKy8vIFRlc3QgdGhhdCBub3RoaW5nIGhhcHBlbnMgd2hlbiB0aGUgZmFjdG9yeSBkb2Vzbid0IHJldHVybiBhIERlYXRoVGVzdDoKK1RFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBOb3RoaW5nSGFwcGVucykgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnMoZmFsc2UsIERlYXRoVGVzdDo6T1ZFUlNFRV9URVNULCAwLCB0cnVlKTsKKyAgRVhQRUNUX0RFQVRIKGZsYWcgPSB0cnVlLCAiIik7CisgIEVYUEVDVF9GQUxTRShmbGFnKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9GQUxTRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Cit9CisKKy8vIFRlc3QgdGhhdCB0aGUgcGFyZW50IHByb2Nlc3MgZG9lc24ndCBydW4gdGhlIGRlYXRoIHRlc3QgY29kZSwKKy8vIGFuZCB0aGF0IHRoZSBQYXNzZWQgbWV0aG9kIHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgKHNpbXVsYXRlZCkKKy8vIGNoaWxkIHByb2Nlc3MgZXhpdHMgd2l0aCBzdGF0dXMgMDoKK1RFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBDaGlsZEV4aXRzU3VjY2Vzc2Z1bGx5KSB7CisgIGJvb2wgZmxhZyA9IGZhbHNlOworICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCwgMCwgdHJ1ZSk7CisgIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOworICBFWFBFQ1RfRkFMU0UoZmxhZyk7CisgIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKKyAgQVNTRVJUX0VRKDEsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgRVhQRUNUX0ZBTFNFKGZhY3RvcnlfLT5QYXNzZWRBcmd1bWVudCgwKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBQYXNzZWQgbWV0aG9kIHdhcyBnaXZlbiB0aGUgYXJndW1lbnQgInRydWUiIHdoZW4KKy8vIHRoZSAoc2ltdWxhdGVkKSBjaGlsZCBwcm9jZXNzIGV4aXRzIHdpdGggc3RhdHVzIDE6CitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGRFeGl0c1Vuc3VjY2Vzc2Z1bGx5KSB7CisgIGJvb2wgZmxhZyA9IGZhbHNlOworICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCwgMSwgdHJ1ZSk7CisgIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOworICBFWFBFQ1RfRkFMU0UoZmxhZyk7CisgIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKKyAgQVNTRVJUX0VRKDEsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlBhc3NlZEFyZ3VtZW50KDApKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIChzaW11bGF0ZWQpIGNoaWxkIHByb2Nlc3MgZXhlY3V0ZXMgdGhlIGRlYXRoIHRlc3QKKy8vIGNvZGUsIGFuZCBpcyBhYm9ydGVkIHdpdGggdGhlIGNvcnJlY3QgQWJvcnRSZWFzb24gaWYgaXQKKy8vIGV4ZWN1dGVzIGEgcmV0dXJuIHN0YXRlbWVudC4KK1RFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBDaGlsZFBlcmZvcm1zUmV0dXJuKSB7CisgIGJvb2wgZmxhZyA9IGZhbHNlOworICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVCwgMCwgdHJ1ZSk7CisgIFJ1blJldHVybmluZ0RlYXRoVGVzdCgmZmxhZyk7CisgIEVYUEVDVF9UUlVFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKKyAgRVhQRUNUX0VRKERlYXRoVGVzdDo6VEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAorICAgICAgICAgICAgZmFjdG9yeV8tPkFib3J0QXJndW1lbnQoMCkpOworICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIChzaW11bGF0ZWQpIGNoaWxkIHByb2Nlc3MgaXMgYWJvcnRlZCB3aXRoIHRoZQorLy8gY29ycmVjdCBBYm9ydFJlYXNvbiBpZiBpdCBkb2VzIG5vdCBkaWUuCitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGREb2VzTm90RGllKSB7CisgIGJvb2wgZmxhZyA9IGZhbHNlOworICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVCwgMCwgdHJ1ZSk7CisgIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOworICBFWFBFQ1RfVFJVRShmbGFnKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICAvLyBUaGlzIHRpbWUgdGhlcmUgYXJlIHR3byBjYWxscyB0byBBYm9ydDogb25lIHNpbmNlIHRoZSB0ZXN0IGRpZG4ndAorICAvLyBkaWUsIGFuZCBhbm90aGVyIGZyb20gdGhlIFJldHVyblNlbnRpbmVsIHdoZW4gaXQncyBkZXN0cm95ZWQuICBUaGUKKyAgLy8gc2VudGluZWwgbm9ybWFsbHkgaXNuJ3QgZGVzdHJveWVkIGlmIGEgdGVzdCBkb2Vzbid0IGRpZSwgc2luY2UKKyAgLy8gX2V4aXQoMikgaXMgY2FsbGVkIGluIHRoYXQgY2FzZSBieSBGb3JraW5nRGVhdGhUZXN0LCBidXQgbm90IGJ5CisgIC8vIG91ciBNb2NrRGVhdGhUZXN0LgorICBBU1NFUlRfRVEoMiwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9FUShEZWF0aFRlc3Q6OlRFU1RfRElEX05PVF9ESUUsCisgICAgICAgICAgICBmYWN0b3J5Xy0+QWJvcnRBcmd1bWVudCgwKSk7CisgIEVYUEVDVF9FUShEZWF0aFRlc3Q6OlRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCwKKyAgICAgICAgICAgIGZhY3RvcnlfLT5BYm9ydEFyZ3VtZW50KDEpKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgc3VjY2Vzc2Z1bCBkZWF0aCB0ZXN0IGRvZXMgbm90IHJlZ2lzdGVyIGEgc3VjY2Vzc2Z1bAorLy8gdGVzdCBwYXJ0LgorVEVTVChTdWNjZXNzUmVnaXN0cmF0aW9uRGVhdGhUZXN0LCBOb1N1Y2Nlc3NQYXJ0KSB7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zRGVhdGhUZXN0LCBEZWF0aFRlc3QpIHsKKyAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMCksICIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSI7CisgIH0sICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9ERUFUSChfZXhpdCgwKSwgIiIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIjsKKyAgfSwgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbiByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZQorLy8gbGFzdCBlcnJvciBpcyAwIGFuZCBub24tZW1wdHkgc3RyaW5nIHdoZW4gaXQgaXMgbm9uLXplcm8uCitURVNUKEdldExhc3RFcnJub0Rlc2NyaXB0aW9uLCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbldvcmtzKSB7CisgIGVycm5vID0gRU5PRU5UOworICBFWFBFQ1RfU1RSTkUoIiIsIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgIGVycm5vID0gMDsKKyAgRVhQRUNUX1NUUkVRKCIiLCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpLmNfc3RyKCkpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKK1RFU1QoQXV0b0hhbmRsZVRlc3QsIEF1dG9IYW5kbGVXb3JrcykgeworICBIQU5ETEUgaGFuZGxlID0gOjpDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICBBU1NFUlRfTkUoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIGhhbmRsZSk7CisKKyAgLy8gVGVzdHMgdGhhdCB0aGUgQXV0b0hhbmRsZSBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgd2l0aCBhIGhhbmRsZS4KKyAgdGVzdGluZzo6aW50ZXJuYWw6OkF1dG9IYW5kbGUgYXV0b19oYW5kbGUoaGFuZGxlKTsKKyAgRVhQRUNUX0VRKGhhbmRsZSwgYXV0b19oYW5kbGUuR2V0KCkpOworCisgIC8vIFRlc3RzIHRoYXQgUmVzZXQgYXNzaWducyBJTlZBTElEX0hBTkRMRV9WQUxVRS4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHZlcmlmeSB3aGV0aGVyIHRoZSBvcmlnaW5hbCBoYW5kbGUgaXMgY2xvc2VkLgorICBhdXRvX2hhbmRsZS5SZXNldCgpOworICBFWFBFQ1RfRVEoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIGF1dG9faGFuZGxlLkdldCgpKTsKKworICAvLyBUZXN0cyB0aGF0IFJlc2V0IGFzc2lnbnMgdGhlIG5ldyBoYW5kbGUuCisgIC8vIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCB2ZXJpZnkgd2hldGhlciB0aGUgb3JpZ2luYWwgaGFuZGxlIGlzIGNsb3NlZC4KKyAgaGFuZGxlID0gOjpDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICBBU1NFUlRfTkUoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIGhhbmRsZSk7CisgIGF1dG9faGFuZGxlLlJlc2V0KGhhbmRsZSk7CisgIEVYUEVDVF9FUShoYW5kbGUsIGF1dG9faGFuZGxlLkdldCgpKTsKKworICAvLyBUZXN0cyB0aGF0IEF1dG9IYW5kbGUgY29udGFpbnMgSU5WQUxJRF9IQU5ETEVfVkFMVUUgYnkgZGVmYXVsdC4KKyAgdGVzdGluZzo6aW50ZXJuYWw6OkF1dG9IYW5kbGUgYXV0b19oYW5kbGUyOworICBFWFBFQ1RfRVEoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIGF1dG9faGFuZGxlMi5HZXQoKSk7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IEJpZ2dlc3RQYXJzYWJsZTsKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlOworY29uc3QgQmlnZ2VzdFBhcnNhYmxlIGtCaWdnZXN0UGFyc2FibGVNYXggPSBVTExPTkdfTUFYOworY29uc3QgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlIGtCaWdnZXN0U2lnbmVkUGFyc2FibGVNYXggPSBMTE9OR19NQVg7CisjIGVsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RQYXJzYWJsZTsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBCaWdnZXN0U2lnbmVkUGFyc2FibGU7Citjb25zdCBCaWdnZXN0UGFyc2FibGUga0JpZ2dlc3RQYXJzYWJsZU1heCA9CisgICAgOjpzdGQ6Om51bWVyaWNfbGltaXRzPEJpZ2dlc3RQYXJzYWJsZT46Om1heCgpOworY29uc3QgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlIGtCaWdnZXN0U2lnbmVkUGFyc2FibGVNYXggPQorICAgIDo6c3RkOjpudW1lcmljX2xpbWl0czxCaWdnZXN0U2lnbmVkUGFyc2FibGU+OjptYXgoKTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworVEVTVChQYXJzZU5hdHVyYWxOdW1iZXJUZXN0LCBSZWplY3RzSW52YWxpZEZvcm1hdCkgeworICBCaWdnZXN0UGFyc2FibGUgcmVzdWx0ID0gMDsKKworICAvLyBSZWplY3RzIG5vbi1udW1iZXJzLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKFN0cmluZygibm9uLW51bWJlciBzdHJpbmciKSwgJnJlc3VsdCkpOworCisgIC8vIFJlamVjdHMgbnVtYmVycyB3aXRoIHdoaXRlc3BhY2UgcHJlZml4LgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKFN0cmluZygiIDEyMyIpLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBuZWdhdGl2ZSBudW1iZXJzLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKFN0cmluZygiLTEyMyIpLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBudW1iZXJzIHN0YXJ0aW5nIHdpdGggYSBwbHVzIHNpZ24uCisgIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoU3RyaW5nKCIrMTIzIiksICZyZXN1bHQpKTsKKyAgZXJybm8gPSAwOworfQorCitURVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIFJlamVjdHNPdmVyZmxvd25OdW1iZXJzKSB7CisgIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOworCisgIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoU3RyaW5nKCI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpLCAmcmVzdWx0KSk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKFN0cmluZygiMjAwIiksICZjaGFyX3Jlc3VsdCkpOworICBlcnJubyA9IDA7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgQWNjZXB0c1ZhbGlkTnVtYmVycykgeworICBCaWdnZXN0UGFyc2FibGUgcmVzdWx0ID0gMDsKKworICByZXN1bHQgPSAwOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoU3RyaW5nKCIxMjMiKSwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEoMTIzVSwgcmVzdWx0KTsKKworICAvLyBDaGVjayAwIGFzIGFuIGVkZ2UgY2FzZS4KKyAgcmVzdWx0ID0gMTsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKFN0cmluZygiMCIpLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgwVSwgcmVzdWx0KTsKKworICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoU3RyaW5nKCIwMDAwMCIpLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgwVSwgcmVzdWx0KTsKK30KKworVEVTVChQYXJzZU5hdHVyYWxOdW1iZXJUZXN0LCBBY2NlcHRzVHlwZUxpbWl0cykgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IGtCaWdnZXN0UGFyc2FibGVNYXg7CisKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2cuR2V0U3RyaW5nKCksICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKGtCaWdnZXN0UGFyc2FibGVNYXgsIHJlc3VsdCk7CisKKyAgTWVzc2FnZSBtc2cyOworICBtc2cyIDw8IGtCaWdnZXN0U2lnbmVkUGFyc2FibGVNYXg7CisKKyAgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlIHNpZ25lZF9yZXN1bHQgPSAwOworICBFWFBFQ1RfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIobXNnMi5HZXRTdHJpbmcoKSwgJnNpZ25lZF9yZXN1bHQpKTsKKyAgRVhQRUNUX0VRKGtCaWdnZXN0U2lnbmVkUGFyc2FibGVNYXgsIHNpZ25lZF9yZXN1bHQpOworCisgIE1lc3NhZ2UgbXNnMzsKKyAgbXNnMyA8PCBJTlRfTUFYOworCisgIGludCBpbnRfcmVzdWx0ID0gMDsKKyAgRVhQRUNUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKG1zZzMuR2V0U3RyaW5nKCksICZpbnRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUShJTlRfTUFYLCBpbnRfcmVzdWx0KTsKKworICBNZXNzYWdlIG1zZzQ7CisgIG1zZzQgPDwgVUlOVF9NQVg7CisKKyAgdW5zaWduZWQgaW50IHVpbnRfcmVzdWx0ID0gMDsKKyAgRVhQRUNUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKG1zZzQuR2V0U3RyaW5nKCksICZ1aW50X3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoVUlOVF9NQVgsIHVpbnRfcmVzdWx0KTsKK30KKworVEVTVChQYXJzZU5hdHVyYWxOdW1iZXJUZXN0LCBXb3Jrc0ZvclNob3J0ZXJJbnRlZ2VycykgeworICBzaG9ydCBzaG9ydF9yZXN1bHQgPSAwOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoU3RyaW5nKCIxMjMiKSwgJnNob3J0X3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoMTIzLCBzaG9ydF9yZXN1bHQpOworCisgIHNpZ25lZCBjaGFyIGNoYXJfcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKFN0cmluZygiMTIzIiksICZjaGFyX3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoMTIzLCBjaGFyX3Jlc3VsdCk7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworVEVTVChFbnZpcm9ubWVudFRlc3QsIEhhbmRsZUZpdHNJbnRvU2l6ZVQpIHsKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVtb3ZlIHRoaXMgdGVzdCBhZnRlciB0aGlzIGNvbmRpdGlvbiBpcyB2ZXJpZmllZAorICAvLyBpbiBhIHN0YXRpYyBhc3NlcnRpb24gaW4gZ3Rlc3QtZGVhdGgtdGVzdC5jYyBpbiB0aGUgZnVuY3Rpb24KKyAgLy8gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IuCisgIEFTU0VSVF9UUlVFKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEL0FTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgdHJpZ2dlcgorLy8gZmFpbHVyZXMgd2hlbiBkZWF0aCB0ZXN0cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NEZWF0aFRlc3QsIEV4cGVjdHNEZWF0aFdoZW5EZWF0aFRlc3RzQXZhaWxhYmxlKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoRGllSW5zaWRlKCJDb25kRGVhdGhUZXN0RXhwZWN0TWFjcm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVhdGggaW5zaWRlIENvbmREZWF0aFRlc3RFeHBlY3RNYWNybyIpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKERpZUluc2lkZSgiQ29uZERlYXRoVGVzdEFzc2VydE1hY3JvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYXRoIGluc2lkZSBDb25kRGVhdGhUZXN0QXNzZXJ0TWFjcm8iKTsKKworICAvLyBFbXB0eSBzdGF0ZW1lbnQgd2lsbCBub3QgY3Jhc2gsIHdoaWNoIG11c3QgdHJpZ2dlciBhIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7Cit9CisKKyNlbHNlCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3RkZXJyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3RkZXJyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzsKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEL0FTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgYXJlIHN0aWxsCisvLyBkZWZpbmVkIGJ1dCBkbyBub3QgdHJpZ2dlciBmYWlsdXJlcyB3aGVuIGRlYXRoIHRlc3RzIGFyZSBub3QgYXZhaWxhYmxlIG9uCisvLyB0aGUgc3lzdGVtLgorVEVTVChDb25kaXRpb25hbERlYXRoTWFjcm9zVGVzdCwgV2FybnNXaGVuRGVhdGhUZXN0c05vdEF2YWlsYWJsZSkgeworICAvLyBFbXB0eSBzdGF0ZW1lbnQgd2lsbCBub3QgY3Jhc2gsIGJ1dCB0aGF0IHNob3VsZCBub3QgdHJpZ2dlciBhIGZhaWx1cmUKKyAgLy8gd2hlbiBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKTsKKyAgU3RyaW5nIG91dHB1dCA9IEdldENhcHR1cmVkU3RkZXJyKCk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICI7IikpOworCisgIC8vIFRoZSBzdHJlYW1lZCBtZXNzYWdlIHNob3VsZCBub3QgYmUgcHJpbnRlZCBhcyB0aGVyZSBpcyBubyB0ZXN0IGZhaWx1cmUuCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCg7LCAiIikgPDwgInN0cmVhbWVkIG1lc3NhZ2UiOworICBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMID09IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgInN0cmVhbWVkIG1lc3NhZ2UiKSk7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKTsgIC8vIE5PTElOVAorICBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLCAiOyIpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpIDw8ICJzdHJlYW1lZCBtZXNzYWdlIjsgIC8vIE5PTElOVAorICBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMID09IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgInN0cmVhbWVkIG1lc3NhZ2UiKSk7Cit9CisKK3ZvaWQgRnVuY1dpdGhBc3NlcnQoaW50KiBuKSB7CisgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQocmV0dXJuOywgIiIpOworICAoKm4pKys7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBkb2VzIG5vdCByZXR1cm4gZnJvbSB0aGUgY3VycmVudAorLy8gZnVuY3Rpb24gKGFzIEFTU0VSVF9ERUFUSCBkb2VzKSBpZiBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1Rlc3QsIEFzc2VydERlYXREb2VzTm90UmV0dXJuaElmVW5zdXBwb3J0ZWQpIHsKKyAgaW50IG4gPSAwOworICBGdW5jV2l0aEFzc2VydCgmbik7CisgIEVYUEVDVF9FUSgxLCBuKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdHMgdGhhdCB0aGUgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggbWF5IG9yIG1heSBub3QKKy8vIGJlIGZvbGxvd2VkIGJ5IG9wZXJhdG9yPDwsIGFuZCB0aGF0IGluIGVpdGhlciBjYXNlIHRoZSBjb21wbGV0ZSB0ZXh0CisvLyBjb21wcmlzZXMgb25seSBhIHNpbmdsZSBDKysgc3RhdGVtZW50LgorLy8KKy8vIFRoZSBzeW50YXggc2hvdWxkIHdvcmsgd2hldGhlciBkZWF0aCB0ZXN0cyBhcmUgYXZhaWxhYmxlIG9yIG5vdC4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1N5bnRheERlYXRoVGVzdCwgU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIC8vIFRoaXMgd291bGQgZmFpbCBpZiBleGVjdXRlZDsgdGhpcyBpcyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seQorICAgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQocmV0dXJuLCAiIik7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIik7CisgIGVsc2UKKyAgICAvLyBUaGlzIGVtcHR5ICJlbHNlIiBicmFuY2ggaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgRVhQRUNUX0RFQVRICisgICAgLy8gZG9lc24ndCBleHBhbmQgaW50byBhbiAiaWYiIHN0YXRlbWVudCB3aXRob3V0IGFuICJlbHNlIgorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQocmV0dXJuLCAiIikgPDwgImRpZCBub3QgZGllIjsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7ICAvLyBOT0xJTlQKKyAgZWxzZQorICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoX2V4aXQoMSksICIiKSA8PCAxIDw8IDIgPDwgMzsKK30KKworLy8gVGVzdHMgdGhhdCBjb25kaXRpb25hbCBkZWF0aCB0ZXN0IG1hY3JvcyBleHBhbmQgdG8gY29kZSB3aGljaCBpbnRlcmFjdHMKKy8vIHdlbGwgd2l0aCBzd2l0Y2ggc3RhdGVtZW50cy4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1N5bnRheERlYXRoVGVzdCwgU3dpdGNoU3RhdGVtZW50KSB7CisvLyBNaWNyb3NvZnQgY29tcGlsZXIgdXN1YWxseSBjb21wbGFpbnMgYWJvdXQgc3dpdGNoIHN0YXRlbWVudHMgd2l0aG91dAorLy8gY2FzZSBsYWJlbHMuIFdlIHN1cHByZXNzIHRoYXQgd2FybmluZyBmb3IgdGhpcyB0ZXN0LgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNjUpCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgc3dpdGNoICgwKQorICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIikKKyAgICAgICAgICA8PCAiZXhpdCBpbiBkZWZhdWx0IHN3aXRjaCBoYW5kbGVyIjsKKworICBzd2l0Y2ggKDApCisgICAgY2FzZSAwOgorICAgICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIHN3aXRjaCBjYXNlIjsKKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAgLy8gX01TQ19WRVIKK30KKworLy8gVGVzdHMgdGhhdCBhIHRlc3QgY2FzZSB3aG9zZSBuYW1lIGVuZHMgd2l0aCAiRGVhdGhUZXN0IiB3b3JrcyBmaW5lCisvLyBvbiBXaW5kb3dzLgorVEVTVChOb3RBRGVhdGhUZXN0LCBUZXN0KSB7CisgIFNVQ0NFRUQoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDQxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjCkBAIC0wLDAgKzEsNjk2IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIEdvb2dsZSBUZXN0IGZpbGVwYXRoIHV0aWxpdGllcworLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgZnJvbSBndGVzdF91bml0dGVzdC5jYywgdG8gYXZvaWQgY2hhbmdpbmcKKy8vIGJ1aWxkIG9yIG1ha2UtZmlsZXMgZm9yIHNvbWUgZXhpc3RpbmcgR29vZ2xlIFRlc3QgY2xpZW50cy4gRG8gbm90CisvLyAjaW5jbHVkZSB0aGlzIGZpbGUgYW55d2hlcmUgZWxzZSEKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IE1vdmUgdGhlc2UgdG8gdGhlIFBPU0lYIGFkYXB0ZXIgc2VjdGlvbiBpbgorLy8gZ3Rlc3QtcG9ydC5oLgorCisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSB0aGUgcmVtb3ZlIEMgZnVuY3Rpb24uCitpbnQgcmVtb3ZlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgTFBDV1NUUiB3cGF0aCA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aCk7CisgIGludCByZXQgPSBEZWxldGVGaWxlKHdwYXRoKSA/IDAgOiAtMTsKKyAgZGVsZXRlIFtdIHdwYXRoOworICByZXR1cm4gcmV0OworfQorLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgdGhlIF9ybWRpciBDIGZ1bmN0aW9uLgoraW50IF9ybWRpcihjb25zdCBjaGFyKiBwYXRoKSB7CisgIEZpbGVQYXRoIGZpbGVwYXRoKHBhdGgpOworICBMUENXU1RSIHdwYXRoID0gU3RyaW5nOjpBbnNpVG9VdGYxNigKKyAgICAgIGZpbGVwYXRoLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLmNfc3RyKCkpOworICBpbnQgcmV0ID0gUmVtb3ZlRGlyZWN0b3J5KHdwYXRoKSA/IDAgOiAtMTsKKyAgZGVsZXRlIFtdIHdwYXRoOworICByZXR1cm4gcmV0OworfQorCisjZWxzZQorCitURVNUKEdldEN1cnJlbnREaXJUZXN0LCBSZXR1cm5zQ3VycmVudERpcikgeworICBjb25zdCBGaWxlUGF0aCBvcmlnaW5hbF9kaXIgPSBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpOworICBFWFBFQ1RfRkFMU0Uob3JpZ2luYWxfZGlyLklzRW1wdHkoKSk7CisKKyAgcG9zaXg6OkNoRGlyKEdURVNUX1BBVEhfU0VQXyk7CisgIGNvbnN0IEZpbGVQYXRoIGN3ZCA9IEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCk7CisgIHBvc2l4OjpDaERpcihvcmlnaW5hbF9kaXIuY19zdHIoKSk7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIC8vIFNraXBzIHRoZSAiOiIuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGN3ZF93aXRob3V0X2RyaXZlID0gc3RyY2hyKGN3ZC5jX3N0cigpLCAnOicpOworICBBU1NFUlRfVFJVRShjd2Rfd2l0aG91dF9kcml2ZSAhPSBOVUxMKTsKKyAgRVhQRUNUX1NUUkVRKEdURVNUX1BBVEhfU0VQXywgY3dkX3dpdGhvdXRfZHJpdmUgKyAxKTsKKworIyBlbHNlCisKKyAgRVhQRUNUX1NUUkVRKEdURVNUX1BBVEhfU0VQXywgY3dkLmNfc3RyKCkpOworCisjIGVuZGlmCit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChJc0VtcHR5VGVzdCwgUmV0dXJuc1RydWVGb3JFbXB0eVBhdGgpIHsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIiIpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKE5VTEwpLklzRW1wdHkoKSk7Cit9CisKK1RFU1QoSXNFbXB0eVRlc3QsIFJldHVybnNGYWxzZUZvck5vbkVtcHR5UGF0aCkgeworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImEiKS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIi4iKS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImEvYiIpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYVxcYlxcIikuSXNFbXB0eSgpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiIiAtPiAiIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgV2hlbkVtcHR5TmFtZSkgeworICBFWFBFQ1RfU1RSRVEoIiIsIEZpbGVQYXRoKCIiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuY19zdHIoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBCdXROb0RpcmVjdG9yeSkgeworICBFWFBFQ1RfU1RSRVEoImFmaWxlIiwKKyAgICAgIEZpbGVQYXRoKCJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5jX3N0cigpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiL2FmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBSb290RmlsZVNob3VsZEdpdmVGaWxlTmFtZSkgeworICBFWFBFQ1RfU1RSRVEoImFmaWxlIiwKKyAgICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuY19zdHIoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvIiAtPiAiIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgV2hlcmVUaGVyZUlzTm9GaWxlTmFtZSkgeworICBFWFBFQ1RfU1RSRVEoIiIsCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuY19zdHIoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvYWZpbGUiIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEdpdmVGaWxlTmFtZSkgeworICBFWFBFQ1RfU1RSRVEoImFmaWxlIiwKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICJhZGlyL3N1YmRpci9hZmlsZSIgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgU2hvdWxkQWxzb0dpdmVGaWxlTmFtZSkgeworICBFWFBFQ1RfU1RSRVEoImFmaWxlIiwKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gInN1YmRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpCisgICAgICAuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLmNfc3RyKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgd29ya3Mgd2l0aCB0aGUgYWx0ZXJuYXRlIHNlcGFyYXRvcgorLy8gb24gV2luZG93cy4KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSgiL2FmaWxlIikgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgUm9vdEZpbGVTaG91bGRHaXZlRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX1NUUkVRKCJhZmlsZSIsCisgICAgICAgICAgICAgICBGaWxlUGF0aCgiL2FmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyLyIpIC0+ICIiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVyZVRoZXJlSXNOb0ZpbGVOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwKKyAgICAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyLyIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5jX3N0cigpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSgiYWRpci9hZmlsZSIpIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEdpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfU1RSRVEoImFmaWxlIiwKKyAgICAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL2FmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyL3N1YmRpci9hZmlsZSIpIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEFsc29HaXZlRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX1NUUkVRKCJhZmlsZSIsCisgICAgICAgICAgICAgICBGaWxlUGF0aCgiYWRpci9zdWJkaXIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuY19zdHIoKSk7Cit9CisKKyNlbmRpZgorCisvLyBSZW1vdmVGaWxlTmFtZSAiIiAtPiAiLi8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgRW1wdHlOYW1lKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gT24gV2luZG93cyBDRSwgd2UgdXNlIHRoZSByb290IGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgRVhQRUNUX1NUUkVRKEdURVNUX1BBVEhfU0VQXywKKyAgICAgIEZpbGVQYXRoKCIiKS5SZW1vdmVGaWxlTmFtZSgpLmNfc3RyKCkpOworI2Vsc2UKKyAgRVhQRUNUX1NUUkVRKCIuIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICBGaWxlUGF0aCgiIikuUmVtb3ZlRmlsZU5hbWUoKS5jX3N0cigpKTsKKyNlbmRpZgorfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiYWRpci8iIC0+ICJhZGlyLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBCdXROb0ZpbGUpIHsKKyAgRVhQRUNUX1NUUkVRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVGaWxlTmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiYWRpci9hZmlsZSIgLT4gImFkaXIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzRGlyTmFtZSkgeworICBFWFBFQ1RfU1RSRVEoImFkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikKKyAgICAgIC5SZW1vdmVGaWxlTmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiYWRpci9zdWJkaXIvYWZpbGUiIC0+ICJhZGlyL3N1YmRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJBbmRTdWJEaXJOYW1lKSB7CisgIEVYUEVDVF9TVFJFUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gInN1YmRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpCisgICAgICAuUmVtb3ZlRmlsZU5hbWUoKS5jX3N0cigpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgIi9hZmlsZSIgLT4gIi8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNSb290RGlyKSB7CisgIEVYUEVDVF9TVFJFUShHVEVTVF9QQVRIX1NFUF8sCisgICAgICBGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikuUmVtb3ZlRmlsZU5hbWUoKS5jX3N0cigpKTsKK30KKworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlRmlsZU5hbWUoKSB3b3JrcyB3aXRoIHRoZSBhbHRlcm5hdGUgc2VwYXJhdG9yIG9uCisvLyBXaW5kb3dzLgorCisvLyBSZW1vdmVGaWxlTmFtZSgiYWRpci8iKSAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgQnV0Tm9GaWxlRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9TVFJFUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvIikuUmVtb3ZlRmlsZU5hbWUoKS5jX3N0cigpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUoImFkaXIvYWZpbGUiKSAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9TVFJFUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSgiYWRpci9zdWJkaXIvYWZpbGUiKSAtPiAiYWRpci9zdWJkaXIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzRGlyQW5kU3ViRGlyTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfU1RSRVEoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAic3ViZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICAgICAgICAgICBGaWxlUGF0aCgiYWRpci9zdWJkaXIvYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSgiL2FmaWxlIikgLT4gIlwiCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNSb290RGlyRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9TVFJFUShHVEVTVF9QQVRIX1NFUF8sCisgICAgICAgICAgICAgICBGaWxlUGF0aCgiL2FmaWxlIikuUmVtb3ZlRmlsZU5hbWUoKS5jX3N0cigpKTsKK30KKworI2VuZGlmCisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVXaGVuTnVtYmVySXNaZXJvKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoImZvbyIpLCBGaWxlUGF0aCgiYmFyIiksCisgICAgICAwLCAieG1sIik7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuY19zdHIoKSk7Cit9CisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZU51bWJlckd0WmVybykgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iKSwgRmlsZVBhdGgoImJhciIpLAorICAgICAgMTIsICJ4bWwiKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyXzEyLnhtbCIsIGFjdHVhbC5jX3N0cigpKTsKK30KKworVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZUZpbGVOYW1lV2l0aFNsYXNoTnVtYmVySXNaZXJvKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKSwKKyAgICAgIEZpbGVQYXRoKCJiYXIiKSwgMCwgInhtbCIpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIiwgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVXaXRoU2xhc2hOdW1iZXJHdFplcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIpLCAxMiwgInhtbCIpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXJfMTIueG1sIiwgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlV2hlbk51bWJlcklzWmVyb0FuZERpcklzRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiIiksIEZpbGVQYXRoKCJiYXIiKSwKKyAgICAgIDAsICJ4bWwiKTsKKyAgRVhQRUNUX1NUUkVRKCJiYXIueG1sIiwgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlV2hlbk51bWJlcklzTm90WmVyb0FuZERpcklzRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiIiksIEZpbGVQYXRoKCJiYXIiKSwKKyAgICAgIDE0LCAieG1sIik7CisgIEVYUEVDVF9TVFJFUSgiYmFyXzE0LnhtbCIsIGFjdHVhbC5jX3N0cigpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFdvcmtzV2hlbkRpckRvZXNOb3RFbmRXaXRoUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhci54bWwiKSk7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuY19zdHIoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBXb3Jrc1doZW5QYXRoMUVuZHNXaXRoUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIueG1sIikpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIiwgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDFCZWluZ0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiYmFyLnhtbCIpKTsKKyAgRVhQRUNUX1NUUkVRKCJiYXIueG1sIiwgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJCZWluZ0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiIikpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLCBhY3R1YWwuY19zdHIoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBCb3RoUGF0aEJlaW5nRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCIiKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDFDb250YWluc1BhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiZm9vYmFyLnhtbCIpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiBHVEVTVF9QQVRIX1NFUF8gImZvb2Jhci54bWwiLAorICAgICAgICAgICAgICAgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJDb250YWluc1BhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKSwKKyAgICAgIEZpbGVQYXRoKCJiYXIiIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLAorICAgICAgICAgICAgICAgYWN0dWFsLmNfc3RyKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJFbmRzV2l0aFBhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIiIEdURVNUX1BBVEhfU0VQXykpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXywgYWN0dWFsLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgIiIgLT4gIiIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgRW1wdHlTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCIiLAorICAgICAgRmlsZVBhdGgoIiIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvbyIgLT4gImZvbyIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgRmlsZU5vU2xhc2hTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLAorICAgICAgRmlsZVBhdGgoImZvbyIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLmNfc3RyKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvby8iIC0+ICJmb28iCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIFNob3VsZFJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJmb28iLAorICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5jX3N0cigpKTsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICBFWFBFQ1RfU1RSRVEoImZvbyIsCisgICAgICAgICAgICAgICBGaWxlUGF0aCgiZm9vLyIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLmNfc3RyKCkpOworI2VuZGlmCit9CisKKy8vIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvciAiZm9vL2Jhci8iIC0+ICJmb28vYmFyLyIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgU2hvdWxkUmVtb3ZlTGFzdFNlcGFyYXRvcikgeworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXykKKyAgICAgICAgICAgICAgIC5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5jX3N0cigpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28vYmFyIiAtPiAiZm9vL2JhciIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgU2hvdWxkUmV0dXJuVW5tb2RpZmllZCkgeworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiKQorICAgICAgICAgICAgICAgLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLmNfc3RyKCkpOworfQorCitURVNUKERpcmVjdG9yeVRlc3QsIFJvb3REaXJlY3RvcnlFeGlzdHMpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cy4KKyAgY2hhciBjdXJyZW50X2RyaXZlW19NQVhfUEFUSF07ICAvLyBOT0xJTlQKKyAgY3VycmVudF9kcml2ZVswXSA9IHN0YXRpY19jYXN0PGNoYXI+KF9nZXRkcml2ZSgpICsgJ0EnIC0gMSk7CisgIGN1cnJlbnRfZHJpdmVbMV0gPSAnOic7CisgIGN1cnJlbnRfZHJpdmVbMl0gPSAnXFwnOworICBjdXJyZW50X2RyaXZlWzNdID0gJ1wwJzsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoY3VycmVudF9kcml2ZSkuRGlyZWN0b3J5RXhpc3RzKCkpOworI2Vsc2UKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8iKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKK1RFU1QoRGlyZWN0b3J5VGVzdCwgUm9vdE9mV3JvbmdEcml2ZURvZXNOb3RFeGlzdHMpIHsKKyAgY29uc3QgaW50IHNhdmVkX2RyaXZlXyA9IF9nZXRkcml2ZSgpOworICAvLyBGaW5kIGEgZHJpdmUgdGhhdCBkb2Vzbid0IGV4aXN0LiBTdGFydCB3aXRoICdaJyB0byBhdm9pZCBjb21tb24gb25lcy4KKyAgZm9yIChjaGFyIGRyaXZlID0gJ1onOyBkcml2ZSA+PSAnQSc7IGRyaXZlLS0pCisgICAgaWYgKF9jaGRyaXZlKGRyaXZlIC0gJ0EnICsgMSkgPT0gLTEpIHsKKyAgICAgIGNoYXIgbm9uX2RyaXZlW19NQVhfUEFUSF07ICAvLyBOT0xJTlQKKyAgICAgIG5vbl9kcml2ZVswXSA9IGRyaXZlOworICAgICAgbm9uX2RyaXZlWzFdID0gJzonOworICAgICAgbm9uX2RyaXZlWzJdID0gJ1xcJzsKKyAgICAgIG5vbl9kcml2ZVszXSA9ICdcMCc7CisgICAgICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgobm9uX2RyaXZlKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIF9jaGRyaXZlKHNhdmVkX2RyaXZlXyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gV2luZG93cyBDRSBfZG9lc18gY29uc2lkZXIgYW4gZW1wdHkgZGlyZWN0b3J5IHRvIGV4aXN0LgorVEVTVChEaXJlY3RvcnlUZXN0LCBFbXB0eVBhdGhEaXJlY3RvcnlEb2VzTm90RXhpc3QpIHsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5EaXJlY3RvcnlFeGlzdHMoKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitURVNUKERpcmVjdG9yeVRlc3QsIEN1cnJlbnREaXJlY3RvcnlFeGlzdHMpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cy4KKyMgaWZuZGVmIF9XSU4zMl9DRSAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeS4KKworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLiIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi5cXCIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKworIyBlbmRpZiAgLy8gX1dJTjMyX0NFCisjZWxzZQorICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLiIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4vIikuRGlyZWN0b3J5RXhpc3RzKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKK1RFU1QoTm9ybWFsaXplVGVzdCwgTnVsbFN0cmluZ3NFcXVhbEVtcHR5RGlyZWN0b3J5KSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgRmlsZVBhdGgoTlVMTCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgRmlsZVBhdGgoU3RyaW5nKE5VTEwpKS5jX3N0cigpKTsKK30KKworLy8gImZvby9iYXIiID09IGZvby8vYmFyIiA9PSAiZm9vLy8vYmFyIgorVEVTVChOb3JtYWxpemVUZXN0LCBNdWx0aXBsZUNvbnNlY3V0aXZlU2VwYXBhcmF0b3JzSW5NaWRzdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8KKyAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuY19zdHIoKSk7Cit9CisKKy8vICIvYmFyIiA9PSAvL2JhciIgPT0gIi8vL2JhciIKK1RFU1QoTm9ybWFsaXplVGVzdCwgTXVsdGlwbGVDb25zZWN1dGl2ZVNlcGFwYXJhdG9yc0F0U3RyaW5nU3RhcnQpIHsKKyAgRVhQRUNUX1NUUkVRKEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICBGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gImJhciIpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gImJhciIpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5jX3N0cigpKTsKK30KKworLy8gImZvby8iID09IGZvby8vIiA9PSAiZm9vLy8vIgorVEVTVChOb3JtYWxpemVUZXN0LCBNdWx0aXBsZUNvbnNlY3V0aXZlU2VwYXBhcmF0b3JzQXRTdHJpbmdFbmQpIHsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8pLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfKS5jX3N0cigpKTsKK30KKworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisKKy8vIFRlc3RzIHRoYXQgc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYXJlIG5vcm1hbGl6ZWQKKy8vIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgY29tYmluYXRpb24gKGUuZy4gImZvb1wiID09ImZvby9cIiA9PQorLy8gImZvb1xcLyIpLgorVEVTVChOb3JtYWxpemVUZXN0LCBNaXhBbHRlcm5hdGVTZXBhcmF0b3JBdFN0cmluZ0VuZCkgeworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgICAgRmlsZVBhdGgoImZvby8iKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiLyIpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgICAgRmlsZVBhdGgoImZvby8vIiBHVEVTVF9QQVRIX1NFUF8pLmNfc3RyKCkpOworfQorCisjZW5kaWYKKworVEVTVChBc3NpZ25tZW50T3BlcmF0b3JUZXN0LCBEZWZhdWx0QXNzaWduZWRUb05vbkRlZmF1bHQpIHsKKyAgRmlsZVBhdGggZGVmYXVsdF9wYXRoOworICBGaWxlUGF0aCBub25fZGVmYXVsdF9wYXRoKCJwYXRoIik7CisgIG5vbl9kZWZhdWx0X3BhdGggPSBkZWZhdWx0X3BhdGg7CisgIEVYUEVDVF9TVFJFUSgiIiwgbm9uX2RlZmF1bHRfcGF0aC5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBkZWZhdWx0X3BhdGguY19zdHIoKSk7ICAvLyBSSFMgdmFyIGlzIHVuY2hhbmdlZC4KK30KKworVEVTVChBc3NpZ25tZW50T3BlcmF0b3JUZXN0LCBOb25EZWZhdWx0QXNzaWduZWRUb0RlZmF1bHQpIHsKKyAgRmlsZVBhdGggbm9uX2RlZmF1bHRfcGF0aCgicGF0aCIpOworICBGaWxlUGF0aCBkZWZhdWx0X3BhdGg7CisgIGRlZmF1bHRfcGF0aCA9IG5vbl9kZWZhdWx0X3BhdGg7CisgIEVYUEVDVF9TVFJFUSgicGF0aCIsIGRlZmF1bHRfcGF0aC5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJwYXRoIiwgbm9uX2RlZmF1bHRfcGF0aC5jX3N0cigpKTsgIC8vIFJIUyB2YXIgaXMgdW5jaGFuZ2VkLgorfQorCitURVNUKEFzc2lnbm1lbnRPcGVyYXRvclRlc3QsIENvbnN0QXNzaWduZWRUb05vbkNvbnN0KSB7CisgIGNvbnN0IEZpbGVQYXRoIGNvbnN0X2RlZmF1bHRfcGF0aCgiY29uc3RfcGF0aCIpOworICBGaWxlUGF0aCBub25fZGVmYXVsdF9wYXRoKCJwYXRoIik7CisgIG5vbl9kZWZhdWx0X3BhdGggPSBjb25zdF9kZWZhdWx0X3BhdGg7CisgIEVYUEVDVF9TVFJFUSgiY29uc3RfcGF0aCIsIG5vbl9kZWZhdWx0X3BhdGguY19zdHIoKSk7Cit9CisKK2NsYXNzIERpcmVjdG9yeUNyZWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICB0ZXN0ZGF0YV9wYXRoXy5TZXQoRmlsZVBhdGgoU3RyaW5nOjpGb3JtYXQoIiVzJXMlcyIsCisgICAgICAgIFRlbXBEaXIoKS5jX3N0cigpLCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5jX3N0cigpLAorICAgICAgICAiX2RpcmVjdG9yeV9jcmVhdGlvbiIgR1RFU1RfUEFUSF9TRVBfICJ0ZXN0IiBHVEVTVF9QQVRIX1NFUF8pKSk7CisgICAgdGVzdGRhdGFfZmlsZV8uU2V0KHRlc3RkYXRhX3BhdGhfLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKworICAgIHVuaXF1ZV9maWxlMF8uU2V0KEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUodGVzdGRhdGFfcGF0aF8sIEZpbGVQYXRoKCJ1bmlxdWUiKSwKKyAgICAgICAgMCwgInR4dCIpKTsKKyAgICB1bmlxdWVfZmlsZTFfLlNldChGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLCBGaWxlUGF0aCgidW5pcXVlIiksCisgICAgICAgIDEsICJ0eHQiKSk7CisKKyAgICByZW1vdmUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMF8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMV8uY19zdHIoKSk7CisgICAgcG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHJlbW92ZSh0ZXN0ZGF0YV9maWxlXy5jX3N0cigpKTsKKyAgICByZW1vdmUodW5pcXVlX2ZpbGUwXy5jX3N0cigpKTsKKyAgICByZW1vdmUodW5pcXVlX2ZpbGUxXy5jX3N0cigpKTsKKyAgICBwb3NpeDo6Um1EaXIodGVzdGRhdGFfcGF0aF8uY19zdHIoKSk7CisgIH0KKworICBTdHJpbmcgVGVtcERpcigpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIHJldHVybiBTdHJpbmcoIlxcdGVtcFxcIik7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgY29uc3QgY2hhciogdGVtcF9kaXIgPSBwb3NpeDo6R2V0RW52KCJURU1QIik7CisgICAgaWYgKHRlbXBfZGlyID09IE5VTEwgfHwgdGVtcF9kaXJbMF0gPT0gJ1wwJykKKyAgICAgIHJldHVybiBTdHJpbmcoIlxcdGVtcFxcIik7CisgICAgZWxzZSBpZiAoU3RyaW5nKHRlbXBfZGlyKS5FbmRzV2l0aCgiXFwiKSkKKyAgICAgIHJldHVybiBTdHJpbmcodGVtcF9kaXIpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXNcXCIsIHRlbXBfZGlyKTsKKyNlbHNlCisgICAgcmV0dXJuIFN0cmluZygiL3RtcC8iKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgfQorCisgIHZvaWQgQ3JlYXRlVGV4dEZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgICBGSUxFKiBmID0gcG9zaXg6OkZPcGVuKGZpbGVuYW1lLCAidyIpOworICAgIGZwcmludGYoZiwgInRleHRcbiIpOworICAgIGZjbG9zZShmKTsKKyAgfQorCisgIC8vIFN0cmluZ3MgcmVwcmVzZW50aW5nIGEgZGlyZWN0b3J5IGFuZCBhIGZpbGUsIHdpdGggaWRlbnRpY2FsIHBhdGhzCisgIC8vIGV4Y2VwdCBmb3IgdGhlIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIgdGhhdCBkaXN0aW5xdWlzaGVzCisgIC8vIGEgZGlyZWN0b3J5IG5hbWVkICd0ZXN0JyBmcm9tIGEgZmlsZSBuYW1lZCAndGVzdCcuIEV4YW1wbGUgbmFtZXM6CisgIEZpbGVQYXRoIHRlc3RkYXRhX3BhdGhfOyAgLy8gIi90bXAvZGlyZWN0b3J5X2NyZWF0aW9uL3Rlc3QvIgorICBGaWxlUGF0aCB0ZXN0ZGF0YV9maWxlXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0IgorICBGaWxlUGF0aCB1bmlxdWVfZmlsZTBfOyAgLy8gIi90bXAvZGlyZWN0b3J5X2NyZWF0aW9uL3Rlc3QvdW5pcXVlLnR4dCIKKyAgRmlsZVBhdGggdW5pcXVlX2ZpbGUxXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0L3VuaXF1ZV8xLnR4dCIKK307CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkpIHsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX3BhdGhfLkRpcmVjdG9yeUV4aXN0cygpKSA8PCB0ZXN0ZGF0YV9wYXRoXy5jX3N0cigpOworICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9wYXRoXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9wYXRoXy5EaXJlY3RvcnlFeGlzdHMoKSk7Cit9CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzRm9yQWxyZWFkeUV4aXN0aW5nUGF0aCkgeworICBFWFBFQ1RfRkFMU0UodGVzdGRhdGFfcGF0aF8uRGlyZWN0b3J5RXhpc3RzKCkpIDw8IHRlc3RkYXRhX3BhdGhfLmNfc3RyKCk7CisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7CisgIC8vIENhbGwgJ2NyZWF0ZScgYWdhaW4uLi4gc2hvdWxkIHN0aWxsIHN1Y2NlZWQuCisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Cit9CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzQW5kVW5pcXVlRmlsZW5hbWUpIHsKKyAgRmlsZVBhdGggZmlsZV9wYXRoKEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLAorICAgICAgRmlsZVBhdGgoInVuaXF1ZSIpLCAidHh0IikpOworICBFWFBFQ1RfU1RSRVEodW5pcXVlX2ZpbGUwXy5jX3N0cigpLCBmaWxlX3BhdGguY19zdHIoKSk7CisgIEVYUEVDVF9GQUxTRShmaWxlX3BhdGguRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOyAgLy8gZmlsZSBub3QgdGhlcmUKKworICB0ZXN0ZGF0YV9wYXRoXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCk7CisgIEVYUEVDVF9GQUxTRShmaWxlX3BhdGguRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOyAgLy8gZmlsZSBzdGlsbCBub3QgdGhlcmUKKyAgQ3JlYXRlVGV4dEZpbGUoZmlsZV9wYXRoLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShmaWxlX3BhdGguRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworCisgIEZpbGVQYXRoIGZpbGVfcGF0aDIoRmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUodGVzdGRhdGFfcGF0aF8sCisgICAgICBGaWxlUGF0aCgidW5pcXVlIiksICJ0eHQiKSk7CisgIEVYUEVDVF9TVFJFUSh1bmlxdWVfZmlsZTFfLmNfc3RyKCksIGZpbGVfcGF0aDIuY19zdHIoKSk7CisgIEVYUEVDVF9GQUxTRShmaWxlX3BhdGgyLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsgIC8vIGZpbGUgbm90IHRoZXJlCisgIENyZWF0ZVRleHRGaWxlKGZpbGVfcGF0aDIuY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKGZpbGVfcGF0aDIuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworfQorCitURVNUX0YoRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVEaXJlY3Rvcmllc0ZhaWwpIHsKKyAgLy8gZm9yY2UgYSBmYWlsdXJlIGJ5IHB1dHRpbmcgYSBmaWxlIHdoZXJlIHdlIHdpbGwgdHJ5IHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgQ3JlYXRlVGV4dEZpbGUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX2ZpbGVfLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX2ZpbGVfLkRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX2ZpbGVfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Cit9CisKK1RFU1QoTm9EaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZU5vRGlyZWN0b3JpZXNGb3JEZWZhdWx0WG1sRmlsZSkgeworICBjb25zdCBGaWxlUGF0aCB0ZXN0X2RldGFpbF94bWwoInRlc3RfZGV0YWlsLnhtbCIpOworICBFWFBFQ1RfRkFMU0UodGVzdF9kZXRhaWxfeG1sLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgRmlsZVBhdGggZnA7CisgIEVYUEVDVF9TVFJFUSgiIiwgZnAuY19zdHIoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBDaGFyQW5kQ29weUNvbnN0cnVjdG9ycykgeworICBjb25zdCBGaWxlUGF0aCBmcCgic3BpY3kiKTsKKyAgRVhQRUNUX1NUUkVRKCJzcGljeSIsIGZwLmNfc3RyKCkpOworCisgIGNvbnN0IEZpbGVQYXRoIGZwX2NvcHkoZnApOworICBFWFBFQ1RfU1RSRVEoInNwaWN5IiwgZnBfY29weS5jX3N0cigpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFN0cmluZ0NvbnN0cnVjdG9yKSB7CisgIGNvbnN0IEZpbGVQYXRoIGZwKFN0cmluZygiY2lkZXIiKSk7CisgIEVYUEVDVF9TVFJFUSgiY2lkZXIiLCBmcC5jX3N0cigpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFNldCkgeworICBjb25zdCBGaWxlUGF0aCBhcHBsZSgiYXBwbGUiKTsKKyAgRmlsZVBhdGggbWFjKCJtYWMiKTsKKyAgbWFjLlNldChhcHBsZSk7ICAvLyBJbXBsZW1lbnQgU2V0KCkgc2luY2Ugb3ZlcmxvYWRpbmcgb3BlcmF0b3I9IGlzIGZvcmJpZGRlbi4KKyAgRVhQRUNUX1NUUkVRKCJhcHBsZSIsIG1hYy5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJhcHBsZSIsIGFwcGxlLmNfc3RyKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgVG9TdHJpbmcpIHsKKyAgY29uc3QgRmlsZVBhdGggZmlsZSgiZHJpbmsiKTsKKyAgU3RyaW5nIHN0cihmaWxlLlRvU3RyaW5nKCkpOworICBFWFBFQ1RfU1RSRVEoImRyaW5rIiwgc3RyLmNfc3RyKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgUmVtb3ZlRXh0ZW5zaW9uKSB7CisgIEVYUEVDVF9TVFJFUSgiYXBwIiwgRmlsZVBhdGgoImFwcC5leGUiKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIkFQUCIsIEZpbGVQYXRoKCJBUFAuRVhFIikuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKS5jX3N0cigpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFJlbW92ZUV4dGVuc2lvbldoZW5UaGVyZUlzTm9FeHRlbnNpb24pIHsKKyAgRVhQRUNUX1NUUkVRKCJhcHAiLCBGaWxlUGF0aCgiYXBwIikuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKS5jX3N0cigpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIElzRGlyZWN0b3J5KSB7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiY29sYSIpLklzRGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgia29hbGEiIEdURVNUX1BBVEhfU0VQXykuSXNEaXJlY3RvcnkoKSk7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImtvYWxhLyIpLklzRGlyZWN0b3J5KCkpOworI2VuZGlmCit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBJc0Fic29sdXRlUGF0aCkgeworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImlzIiBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiYzpcXCIgR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiCisgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjOmZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImM6LyIgR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiCisgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyNlbHNlCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiaXNfbm90IiBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikKKyAgICAgICAgICAgICAgLklzQWJzb2x1dGVQYXRoKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBJc1Jvb3REaXJlY3RvcnkpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJhOlxcIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiWjovIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiZTovLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYjoiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYjphIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIjg6LyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjfC8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisjZWxzZQorICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8vIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIiIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJcXCIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIveCIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU1MDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjCkBAIC0wLDAgKzEsMTU1IEBACisvLyBDb3B5cmlnaHQgMjAwMywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQorLy8gUG9ydGVkIHRvIFdpbmRvd3M6IFZhZGltIEJlcm1hbiAodmFkaW1iQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit1c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI7CisKK2ludCBudW07CitNZXNzYWdlKiBoaXN0b3J5ID0gTlVMTDsKKworLy8gQ2xhc3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCitjbGFzcyBBIHsKKyBwdWJsaWM6CisgIEEoKTogbXludW0obnVtKyspIHsgKmhpc3RvcnkgPDwgIkEiIDw8IG15bnVtIDw8ICIgY3RvclxuIjsgfQorICB2aXJ0dWFsIH5BKCkgeyAqaGlzdG9yeSA8PCAiQSIgPDwgbXludW0gPDwgIiBkdG9yXG4iOyB9CisgIHZpcnR1YWwgdm9pZCBVc2UoKSB7ICpoaXN0b3J5IDw8ICJBIiA8PCBteW51bSA8PCAiIHVzZVxuIjsgfQorIHByb3RlY3RlZDoKKyAgaW50IG15bnVtOworfTsKKworLy8gU3ViY2xhc3MKK2NsYXNzIEIgOiBwdWJsaWMgQSB7CisgcHVibGljOgorICBCKCkgeyAqaGlzdG9yeSA8PCAiQiIgPDwgbXludW0gPDwgIiBjdG9yXG4iOyB9CisgIH5CKCkgeyAqaGlzdG9yeSA8PCAiQiIgPDwgbXludW0gPDwgIiBkdG9yXG4iOyB9CisgIHZpcnR1YWwgdm9pZCBVc2UoKSB7ICpoaXN0b3J5IDw8ICJCIiA8PCBteW51bSA8PCAiIHVzZVxuIjsgfQorfTsKKworY2xhc3MgTGlua2VkUHRyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIExpbmtlZFB0clRlc3QoKSB7CisgICAgbnVtID0gMDsKKyAgICBoaXN0b3J5ID0gbmV3IE1lc3NhZ2U7CisgIH0KKworICB2aXJ0dWFsIH5MaW5rZWRQdHJUZXN0KCkgeworICAgIGRlbGV0ZSBoaXN0b3J5OworICAgIGhpc3RvcnkgPSBOVUxMOworICB9Cit9OworCitURVNUX0YoTGlua2VkUHRyVGVzdCwgR2VuZXJhbFRlc3QpIHsKKyAgeworICAgIGxpbmtlZF9wdHI8QT4gYTAsIGExLCBhMjsKKyAgICAvLyBVc2UgZXhwbGljaXQgZnVuY3Rpb24gY2FsbCBub3RhdGlvbiBoZXJlIHRvIHN1cHByZXNzIHNlbGYtYXNzaWduIHdhcm5pbmcuCisgICAgYTAub3BlcmF0b3I9KGEwKTsKKyAgICBhMSA9IGEyOworICAgIEFTU0VSVF9FUShhMC5nZXQoKSwgc3RhdGljX2Nhc3Q8QSo+KE5VTEwpKTsKKyAgICBBU1NFUlRfRVEoYTEuZ2V0KCksIHN0YXRpY19jYXN0PEEqPihOVUxMKSk7CisgICAgQVNTRVJUX0VRKGEyLmdldCgpLCBzdGF0aWNfY2FzdDxBKj4oTlVMTCkpOworICAgIEFTU0VSVF9UUlVFKGEwID09IE5VTEwpOworICAgIEFTU0VSVF9UUlVFKGExID09IE5VTEwpOworICAgIEFTU0VSVF9UUlVFKGEyID09IE5VTEwpOworCisgICAgeworICAgICAgbGlua2VkX3B0cjxBPiBhMyhuZXcgQSk7CisgICAgICBhMCA9IGEzOworICAgICAgQVNTRVJUX1RSVUUoYTAgPT0gYTMpOworICAgICAgQVNTRVJUX1RSVUUoYTAgIT0gTlVMTCk7CisgICAgICBBU1NFUlRfVFJVRShhMC5nZXQoKSA9PSBhMyk7CisgICAgICBBU1NFUlRfVFJVRShhMCA9PSBhMy5nZXQoKSk7CisgICAgICBsaW5rZWRfcHRyPEE+IGE0KGEwKTsKKyAgICAgIGExID0gYTQ7CisgICAgICBsaW5rZWRfcHRyPEE+IGE1KG5ldyBBKTsKKyAgICAgIEFTU0VSVF9UUlVFKGE1LmdldCgpICE9IGEzKTsKKyAgICAgIEFTU0VSVF9UUlVFKGE1ICE9IGEzLmdldCgpKTsKKyAgICAgIGEyID0gYTU7CisgICAgICBsaW5rZWRfcHRyPEI+IGIwKG5ldyBCKTsKKyAgICAgIGxpbmtlZF9wdHI8QT4gYTYoYjApOworICAgICAgQVNTRVJUX1RSVUUoYjAgPT0gYTYpOworICAgICAgQVNTRVJUX1RSVUUoYTYgPT0gYjApOworICAgICAgQVNTRVJUX1RSVUUoYjAgIT0gTlVMTCk7CisgICAgICBhNSA9IGIwOworICAgICAgYTUgPSBiMDsKKyAgICAgIGEzLT5Vc2UoKTsKKyAgICAgIGE0LT5Vc2UoKTsKKyAgICAgIGE1LT5Vc2UoKTsKKyAgICAgIGE2LT5Vc2UoKTsKKyAgICAgIGIwLT5Vc2UoKTsKKyAgICAgICgqYjApLlVzZSgpOworICAgICAgYjAuZ2V0KCktPlVzZSgpOworICAgIH0KKworICAgIGEwLT5Vc2UoKTsKKyAgICBhMS0+VXNlKCk7CisgICAgYTItPlVzZSgpOworCisgICAgYTEgPSBhMjsKKyAgICBhMi5yZXNldChuZXcgQSk7CisgICAgYTAucmVzZXQoKTsKKworICAgIGxpbmtlZF9wdHI8QT4gYTc7CisgIH0KKworICBBU1NFUlRfU1RSRVEoCisgICAgIkEwIGN0b3JcbiIKKyAgICAiQTEgY3RvclxuIgorICAgICJBMiBjdG9yXG4iCisgICAgIkIyIGN0b3JcbiIKKyAgICAiQTAgdXNlXG4iCisgICAgIkEwIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIGR0b3JcbiIKKyAgICAiQTIgZHRvclxuIgorICAgICJBMCB1c2VcbiIKKyAgICAiQTAgdXNlXG4iCisgICAgIkExIHVzZVxuIgorICAgICJBMyBjdG9yXG4iCisgICAgIkEwIGR0b3JcbiIKKyAgICAiQTMgZHRvclxuIgorICAgICJBMSBkdG9yXG4iLAorICAgIGhpc3RvcnktPkdldFN0cmluZygpLmNfc3RyKCkKKyAgKTsKK30KKworfSAgLy8gVW5uYW1lZCBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTA4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjCkBAIC0wLDAgKzEsMzEzIEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBmaWxlIHZlcmlmaWVzIEdvb2dsZSBUZXN0IGV2ZW50IGxpc3RlbmVycyByZWNlaXZlIGV2ZW50cyBhdCB0aGUKKy8vIHJpZ2h0IHRpbWVzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50OwordXNpbmcgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudDsKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzsKKworLy8gVXNlZCBieSB0ZXN0cyB0byByZWdpc3RlciB0aGVpciBldmVudHMuCitzdGQ6OnZlY3RvcjxTdHJpbmc+KiBnX2V2ZW50cyA9IE5VTEw7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcihjb25zdCBjaGFyKiBuYW1lKSA6IG5hbWVfKG5hbWUpIHt9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RQcm9ncmFtU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgICAgTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UgPDwgR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEl0ZXJhdGlvblN0YXJ0IikKKyAgICAgICAgICAgIDw8ICIoIiA8PCBpdGVyYXRpb24gPDwgIikiOworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2sobWVzc2FnZS5HZXRTdHJpbmcoKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1NldFVwRW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdENhc2VTdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdFN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIC8qdGVzdF9wYXJ0X3Jlc3VsdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UGFydFJlc3VsdCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RFbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdENhc2VFbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1RlYXJEb3duRW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgICAgTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UgPDwgR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEl0ZXJhdGlvbkVuZCIpCisgICAgICAgICAgICA8PCAiKCIgIDw8IGl0ZXJhdGlvbiA8PCAiKSI7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhtZXNzYWdlLkdldFN0cmluZygpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UHJvZ3JhbUVuZCIpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nIEdldEZ1bGxNZXRob2ROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgbWVzc2FnZSA8PCBuYW1lXyA8PCAiLiIgPDwgbmFtZTsKKyAgICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsKKyAgfQorCisgIFN0cmluZyBuYW1lXzsKK307CisKK2NsYXNzIEVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXIgOiBwdWJsaWMgRW52aXJvbm1lbnQgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soU3RyaW5nKCJFbnZpcm9ubWVudDo6U2V0VXAiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhTdHJpbmcoIkVudmlyb25tZW50OjpUZWFyRG93biIpKTsKKyAgfQorfTsKKworY2xhc3MgTGlzdGVuZXJUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKFN0cmluZygiTGlzdGVuZXJUZXN0OjpTZXRVcFRlc3RDYXNlIikpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKFN0cmluZygiTGlzdGVuZXJUZXN0OjpUZWFyRG93blRlc3RDYXNlIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soU3RyaW5nKCJMaXN0ZW5lclRlc3Q6OlNldFVwIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soU3RyaW5nKCJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIikpOworICB9Cit9OworCitURVNUX0YoTGlzdGVuZXJUZXN0LCBEb2VzRm9vKSB7CisgIC8vIFRlc3QgZXhlY3V0aW9uIG9yZGVyIHdpdGhpbiBhIHRlc3QgY2FzZSBpcyBub3QgZ3VhcmFudGVlZCBzbyB3ZSBhcmUgbm90CisgIC8vIHJlY29yZGluZyB0aGUgdGVzdCBuYW1lLgorICBnX2V2ZW50cy0+cHVzaF9iYWNrKFN0cmluZygiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIpKTsKKyAgU1VDQ0VFRCgpOyAgLy8gVHJpZ2dlcnMgT25UZXN0UGFydFJlc3VsdC4KK30KKworVEVTVF9GKExpc3RlbmVyVGVzdCwgRG9lc0JhcikgeworICBnX2V2ZW50cy0+cHVzaF9iYWNrKFN0cmluZygiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIpKTsKKyAgU1VDQ0VFRCgpOyAgLy8gVHJpZ2dlcnMgT25UZXN0UGFydFJlc3VsdC4KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpFdmVudFJlY29yZGluZ0xpc3RlbmVyOworCit2b2lkIFZlcmlmeVJlc3VsdHMoY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nPiYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogZXhwZWN0ZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfZGF0YV9zaXplKSB7CisgIGNvbnN0IGludCBhY3R1YWxfc2l6ZSA9IGRhdGEuc2l6ZSgpOworICAvLyBJZiB0aGUgZm9sbG93aW5nIGFzc2VydGlvbiBmYWlscywgYSBuZXcgZW50cnkgd2lsbCBiZSBhcHBlbmRlZCB0bworICAvLyBkYXRhLiAgSGVuY2Ugd2Ugc2F2ZSBkYXRhLnNpemUoKSBmaXJzdC4KKyAgRVhQRUNUX0VRKGV4cGVjdGVkX2RhdGFfc2l6ZSwgYWN0dWFsX3NpemUpOworCisgIC8vIENvbXBhcmVzIHRoZSBjb21tb24gcHJlZml4LgorICBjb25zdCBpbnQgc2hvcnRlcl9zaXplID0gZXhwZWN0ZWRfZGF0YV9zaXplIDw9IGFjdHVhbF9zaXplID8KKyAgICAgIGV4cGVjdGVkX2RhdGFfc2l6ZSA6IGFjdHVhbF9zaXplOworICBpbnQgaSA9IDA7CisgIGZvciAoOyBpIDwgc2hvcnRlcl9zaXplOyArK2kpIHsKKyAgICBBU1NFUlRfU1RSRVEoZXhwZWN0ZWRfZGF0YVtpXSwgZGF0YVtpXS5jX3N0cigpKQorICAgICAgICA8PCAiYXQgcG9zaXRpb24gIiA8PCBpOworICB9CisKKyAgLy8gUHJpbnRzIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBhY3R1YWwgZGF0YS4KKyAgZm9yICg7IGkgPCBhY3R1YWxfc2l6ZTsgKytpKSB7CisgICAgcHJpbnRmKCIgIEFjdHVhbCBldmVudCAjJWQ6ICVzXG4iLCBpLCBkYXRhW2ldLmNfc3RyKCkpOworICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBzdGQ6OnZlY3RvcjxTdHJpbmc+IGV2ZW50czsKKyAgZ19ldmVudHMgPSAmZXZlbnRzOworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLkFwcGVuZCgKKyAgICAgIG5ldyBFdmVudFJlY29yZGluZ0xpc3RlbmVyKCIxc3QiKSk7CisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5BcHBlbmQoCisgICAgICBuZXcgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcigiMm5kIikpOworCisgIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRW52aXJvbm1lbnRJbnZvY2F0aW9uQ2F0Y2hlcik7CisKKyAgR1RFU1RfQ0hFQ0tfKGV2ZW50cy5zaXplKCkgPT0gMCkKKyAgICAgIDw8ICJBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQgc2hvdWxkIG5vdCBnZW5lcmF0ZSBhbnkgZXZlbnRzIGl0c2VsZi4iOworCisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyhyZXBlYXQpID0gMjsKKyAgaW50IHJldF92YWwgPSBSVU5fQUxMX1RFU1RTKCk7CisKKyAgY29uc3QgY2hhciogY29uc3QgZXhwZWN0ZWRfZXZlbnRzW10gPSB7CisgICAgIjFzdC5PblRlc3RQcm9ncmFtU3RhcnQiLAorICAgICIybmQuT25UZXN0UHJvZ3JhbVN0YXJ0IiwKKyAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDApIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDApIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6U2V0VXAiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKKyAgICAiMXN0Lk9uVGVzdENhc2VTdGFydCIsCisgICAgIjJuZC5PblRlc3RDYXNlU3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwVGVzdENhc2UiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duVGVzdENhc2UiLAorICAgICIybmQuT25UZXN0Q2FzZUVuZCIsCisgICAgIjFzdC5PblRlc3RDYXNlRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6VGVhckRvd24iLAorICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvbkVuZCgwKSIsCisgICAgIjFzdC5PblRlc3RJdGVyYXRpb25FbmQoMCkiLAorICAgICIxc3QuT25UZXN0SXRlcmF0aW9uU3RhcnQoMSkiLAorICAgICIybmQuT25UZXN0SXRlcmF0aW9uU3RhcnQoMSkiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCisgICAgIkVudmlyb25tZW50OjpTZXRVcCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiLAorICAgICIxc3QuT25UZXN0Q2FzZVN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdENhc2VTdGFydCIsCisgICAgIkxpc3RlbmVyVGVzdDo6U2V0VXBUZXN0Q2FzZSIsCisgICAgIjFzdC5PblRlc3RTdGFydCIsCisgICAgIjJuZC5PblRlc3RTdGFydCIsCisgICAgIkxpc3RlbmVyVGVzdDo6U2V0VXAiLAorICAgICJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5IiwKKyAgICAiMXN0Lk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICIybmQuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iLAorICAgICIybmQuT25UZXN0RW5kIiwKKyAgICAiMXN0Lk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RTdGFydCIsCisgICAgIjJuZC5PblRlc3RTdGFydCIsCisgICAgIkxpc3RlbmVyVGVzdDo6U2V0VXAiLAorICAgICJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5IiwKKyAgICAiMXN0Lk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICIybmQuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iLAorICAgICIybmQuT25UZXN0RW5kIiwKKyAgICAiMXN0Lk9uVGVzdEVuZCIsCisgICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd25UZXN0Q2FzZSIsCisgICAgIjJuZC5PblRlc3RDYXNlRW5kIiwKKyAgICAiMXN0Lk9uVGVzdENhc2VFbmQiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCisgICAgIkVudmlyb25tZW50OjpUZWFyRG93biIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiLAorICAgICIybmQuT25UZXN0SXRlcmF0aW9uRW5kKDEpIiwKKyAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvbkVuZCgxKSIsCisgICAgIjJuZC5PblRlc3RQcm9ncmFtRW5kIiwKKyAgICAiMXN0Lk9uVGVzdFByb2dyYW1FbmQiCisgIH07CisgIFZlcmlmeVJlc3VsdHMoZXZlbnRzLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V2ZW50cywKKyAgICAgICAgICAgICAgICBzaXplb2YoZXhwZWN0ZWRfZXZlbnRzKS9zaXplb2YoZXhwZWN0ZWRfZXZlbnRzWzBdKSk7CisKKyAgLy8gV2UgbmVlZCB0byBjaGVjayBtYW51YWxseSBmb3IgYWQgaG9jIHRlc3QgZmFpbHVyZXMgdGhhdCBoYXBwZW4gYWZ0ZXIKKyAgLy8gUlVOX0FMTF9URVNUUyBmaW5pc2hlcy4KKyAgaWYgKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5GYWlsZWQoKSkKKyAgICByZXRfdmFsID0gMTsKKworICByZXR1cm4gcmV0X3ZhbDsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDljNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTY2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRlc3RzIGZvciB0aGUgTWVzc2FnZSBjbGFzcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKKworLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCB0dXJucyBhIE1lc3NhZ2UgaW50byBhIEMgc3RyaW5nLgorY29uc3QgY2hhciogVG9DU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1zZykgeworICBzdGF0aWMgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZyByZXN1bHQ7CisgIHJlc3VsdCA9IG1zZy5HZXRTdHJpbmcoKTsKKyAgcmV0dXJuIHJlc3VsdC5jX3N0cigpOworfQorCisvLyBUZXN0cyB0aGUgdGVzdGluZzo6TWVzc2FnZSBjbGFzcworCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KK1RFU1QoTWVzc2FnZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICBjb25zdCBNZXNzYWdlIG1zZzsKKyAgRVhQRUNUX1NUUkVRKCIiLCBUb0NTdHJpbmcobXNnKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorVEVTVChNZXNzYWdlVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE1lc3NhZ2UgbXNnMSgiSGVsbG8iKTsKKyAgY29uc3QgTWVzc2FnZSBtc2cyKG1zZzEpOworICBFWFBFQ1RfU1RSRVEoIkhlbGxvIiwgVG9DU3RyaW5nKG1zZzIpKTsKK30KKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgTWVzc2FnZSBmcm9tIGEgQy1zdHJpbmcuCitURVNUKE1lc3NhZ2VUZXN0LCBDb25zdHJ1Y3RzRnJvbUNTdHJpbmcpIHsKKyAgTWVzc2FnZSBtc2coIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBUb0NTdHJpbmcobXNnKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIGZsb2F0LgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0Zsb2F0KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHMgPSBUb0NTdHJpbmcoTWVzc2FnZSgpIDw8IDEuMjM0NTZGIDw8ICIgIiA8PCAyLjM0NTY3Rik7CisgIC8vIEJvdGggbnVtYmVycyBzaG91bGQgYmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24uCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICIxLjIzNDU2MCIsIHMpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiIDIuMzQ1NjY5Iiwgcyk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIGRvdWJsZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNEb3VibGUpIHsKKyAgY29uc3QgY2hhciogY29uc3QgcyA9IFRvQ1N0cmluZyhNZXNzYWdlKCkgPDwgMTI2MDU3MDg4MC40NTU1NDk3IDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEyNjA1NzIyNjUuMTk1NDUzNCk7CisgIC8vIEJvdGggbnVtYmVycyBzaG91bGQgYmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24uCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICIxMjYwNTcwODgwLjQ1Iiwgcyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICIgMTI2MDU3MjI2NS4xOSIsIHMpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBub24tY2hhciBwb2ludGVyLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1BvaW50ZXIpIHsKKyAgaW50IG4gPSAwOworICBpbnQqIHAgPSAmbjsKKyAgRVhQRUNUX1NUUk5FKCIobnVsbCkiLCBUb0NTdHJpbmcoTWVzc2FnZSgpIDw8IHApKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgTlVMTCBub24tY2hhciBwb2ludGVyLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc051bGxQb2ludGVyKSB7CisgIGludCogcCA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwgVG9DU3RyaW5nKE1lc3NhZ2UoKSA8PCBwKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIEMgc3RyaW5nLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0NTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJGb28iLCBUb0NTdHJpbmcoTWVzc2FnZSgpIDw8ICJGb28iKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIE5VTEwgQyBzdHJpbmcuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zTnVsbENTdHJpbmcpIHsKKyAgY2hhciogcCA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwgVG9DU3RyaW5nKE1lc3NhZ2UoKSA8PCBwKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBzdGQ6OnN0cmluZy4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNTdHJpbmcpIHsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIoIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBUb0NTdHJpbmcoTWVzc2FnZSgpIDw8IHN0cikpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgc3RyaW5ncyBjb250YWluaW5nIGVtYmVkZGVkIE5VTHMuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zU3RyaW5nV2l0aEVtYmVkZGVkTlVMKSB7CisgIGNvbnN0IGNoYXIgY2hhcl9hcnJheV93aXRoX251bFtdID0KKyAgICAgICJIZXJlJ3MgYSBOVUxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyI7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyaW5nX3dpdGhfbnVsKGNoYXJfYXJyYXlfd2l0aF9udWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyX2FycmF5X3dpdGhfbnVsKSAtIDEpOworICBFWFBFQ1RfU1RSRVEoIkhlcmUncyBhIE5VTFxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyIsCisgICAgICAgICAgICAgICBUb0NTdHJpbmcoTWVzc2FnZSgpIDw8IHN0cmluZ193aXRoX251bCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBOVUwgY2hhci4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNOVUxDaGFyKSB7CisgIEVYUEVDVF9TVFJFUSgiXFwwIiwgVG9DU3RyaW5nKE1lc3NhZ2UoKSA8PCAnXDAnKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBpbnQuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zSW50KSB7CisgIEVYUEVDVF9TVFJFUSgiMTIzIiwgVG9DU3RyaW5nKE1lc3NhZ2UoKSA8PCAxMjMpKTsKK30KKworLy8gVGVzdHMgdGhhdCBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgY2FuIGJlCisvLyBzdHJlYW1lZCB0byBNZXNzYWdlLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0Jhc2ljSW9NYW5pcCkgeworICBFWFBFQ1RfU1RSRVEoIkxpbmUgMS5cbkEgTlVMIGNoYXIgXFwwIGluIGxpbmUgMi4iLAorICAgICAgICAgICAgICAgVG9DU3RyaW5nKE1lc3NhZ2UoKSA8PCAiTGluZSAxLiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkEgTlVMIGNoYXIgIiA8PCBzdGQ6OmVuZHMgPDwgc3RkOjpmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gbGluZSAyLiIpKTsKK30KKworLy8gVGVzdHMgTWVzc2FnZTo6R2V0U3RyaW5nKCkKK1RFU1QoTWVzc2FnZVRlc3QsIEdldFN0cmluZykgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IDEgPDwgIiBsYW1iIjsKKyAgRVhQRUNUX1NUUkVRKCIxIGxhbWIiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIE1lc3NhZ2Ugb2JqZWN0IHRvIGFuIG9zdHJlYW0uCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zVG9PU3RyZWFtKSB7CisgIE1lc3NhZ2UgbXNnKCJIZWxsbyIpOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBtc2c7CisgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nU3RyZWFtVG9TdHJpbmcoJnNzKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIE1lc3NhZ2Ugb2JqZWN0IGRvZXNuJ3QgdGFrZSB1cCB0b28gbXVjaCBzdGFjayBzcGFjZS4KK1RFU1QoTWVzc2FnZVRlc3QsIERvZXNOb3RUYWtlVXBNdWNoU3RhY2tTcGFjZSkgeworICBFWFBFQ1RfTEUoc2l6ZW9mKE1lc3NhZ2UpLCAxNlUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk4ZjNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjCkBAIC0wLDAgKzEsMjEyIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIEdvb2dsZSBUZXN0IFVuaXRUZXN0T3B0aW9ucyB0ZXN0cworLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgZnJvbSBndGVzdC5jYywgdG8gYXZvaWQgY2hhbmdpbmcgYnVpbGQgb3IKKy8vIG1ha2UtZmlsZXMgb24gV2luZG93cyBhbmQgb3RoZXIgcGxhdGZvcm1zLiBEbyBub3QgI2luY2x1ZGUgdGhpcyBmaWxlCisvLyBhbnl3aGVyZSBlbHNlIQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworLy8gVHVybnMgdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGggaW50byBhbiBhYnNvbHV0ZSBwYXRoLgorRmlsZVBhdGggR2V0QWJzb2x1dGVQYXRoT2YoY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgcmV0dXJuIEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLCByZWxhdGl2ZV9wYXRoKTsKK30KKworLy8gVGVzdGluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdC9HZXRPdXRwdXRGaWxlLgorCitURVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZvcm1hdERlZmF1bHQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgIEVYUEVDVF9TVFJFUSgiIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGb3JtYXQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmaWxlbmFtZSI7CisgIEVYUEVDVF9TVFJFUSgieG1sIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlRGVmYXVsdCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgRVhQRUNUX1NUUkVRKEdldEFic29sdXRlUGF0aE9mKEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkuY19zdHIoKSk7Cit9CisKK1RFU1QoWG1sT3V0cHV0VGVzdCwgR2V0T3V0cHV0RmlsZVNpbmdsZUZpbGUpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmaWxlbmFtZS5hYmMiOworICBFWFBFQ1RfU1RSRVEoR2V0QWJzb2x1dGVQYXRoT2YoRmlsZVBhdGgoImZpbGVuYW1lLmFiYyIpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlRnJvbURpcmVjdG9yeVBhdGgpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpwYXRoIiBHVEVTVF9QQVRIX1NFUF87CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX291dHB1dF9maWxlID0KKyAgICAgIEdldEFic29sdXRlUGF0aE9mKAorICAgICAgICAgIEZpbGVQYXRoKHN0ZDo6c3RyaW5nKCJwYXRoIikgKyBHVEVTVF9QQVRIX1NFUF8gKworICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLmNfc3RyKCkgKyAiLnhtbCIpKS5jX3N0cigpOworICBjb25zdCBTdHJpbmcmIG91dHB1dF9maWxlID0gVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK1RFU1QoT3V0cHV0RmlsZUhlbHBlcnNUZXN0LCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhlX3N0ciA9IEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLmNfc3RyKCk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBjb25zdCBib29sIHN1Y2Nlc3MgPQorICAgICAgX3N0cmNtcGkoImd0ZXN0LW9wdGlvbnNfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAorICAgICAgX3N0cmNtcGkoImd0ZXN0LW9wdGlvbnMtZXhfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAorICAgICAgX3N0cmNtcGkoImd0ZXN0X2FsbF90ZXN0IiwgZXhlX3N0ci5jX3N0cigpKSA9PSAwIHx8CisgICAgICBfc3RyY21waSgiZ3Rlc3RfZGxsX3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDA7CisjZWxzZQorICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVtb3ZlIHRoZSBoYXJkLWNvZGVkICJsdC0iIHByZWZpeCB3aGVuCisgIC8vICAgQ2hhbmRsZXIgQ2FycnV0aCdzIGxpYnRvb2wgcmVwbGFjZW1lbnQgaXMgcmVhZHkuCisgIGNvbnN0IGJvb2wgc3VjY2VzcyA9CisgICAgICBleGVfc3RyID09ICJndGVzdC1vcHRpb25zX3Rlc3QiIHx8CisgICAgICBleGVfc3RyID09ICJndGVzdF9hbGxfdGVzdCIgfHwKKyAgICAgIGV4ZV9zdHIgPT0gImx0LWd0ZXN0X2FsbF90ZXN0IiB8fAorICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3RfZGxsX3Rlc3QiOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIGlmICghc3VjY2VzcykKKyAgICBGQUlMKCkgPDwgIkdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHJldHVybnMgIiA8PCBleGVfc3RyOworfQorCitjbGFzcyBYbWxPdXRwdXRDaGFuZ2VEaXJUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXyA9IEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCk7CisgICAgcG9zaXg6OkNoRGlyKCIuLiIpOworICAgIC8vIFRoaXMgd2lsbCBtYWtlIHRoZSB0ZXN0IGZhaWwgaWYgcnVuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgIEVYUEVDVF9TVFJORShvcmlnaW5hbF93b3JraW5nX2Rpcl8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKS5jX3N0cigpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfd29ya2luZ19kaXJfLmNfc3RyKCkpOworICB9CisKKyAgRmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworfTsKKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgIEVYUEVDVF9TVFJFUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihYbWxPdXRwdXRDaGFuZ2VEaXJUZXN0LCBQcmVzZXJ2ZU9yaWdpbmFsV29ya2luZ0RpcldpdGhEZWZhdWx0WE1MKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWwiOworICBFWFBFQ1RfU1RSRVEoRmlsZVBhdGg6OkNvbmNhdFBhdGhzKG9yaWdpbmFsX3dvcmtpbmdfZGlyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgidGVzdF9kZXRhaWwueG1sIikpLmNfc3RyKCksCisgICAgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpLmNfc3RyKCkpOworfQorCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoUmVsYXRpdmVGaWxlKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6ZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX1NUUkVRKEZpbGVQYXRoOjpDb25jYXRQYXRocyhvcmlnaW5hbF93b3JraW5nX2Rpcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImZpbGVuYW1lLmFiYyIpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlUGF0aCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOnBhdGgiIEdURVNUX1BBVEhfU0VQXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0X2ZpbGUgPQorICAgICAgRmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXywKKyAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKKyAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5jX3N0cigpICsgIi54bWwiKSkuY19zdHIoKTsKKyAgY29uc3QgU3RyaW5nJiBvdXRwdXRfZmlsZSA9IFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkX291dHB1dF9maWxlLmNfc3RyKCksIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2Vsc2UKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX291dHB1dF9maWxlLCBvdXRwdXRfZmlsZS5jX3N0cigpKTsKKyNlbmRpZgorfQorCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoQWJzb2x1dGVGaWxlKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmM6XFx0bXBcXGZpbGVuYW1lLmFiYyI7CisgIEVYUEVDVF9TVFJFUShGaWxlUGF0aCgiYzpcXHRtcFxcZmlsZW5hbWUuYWJjIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkuY19zdHIoKSk7CisjZWxzZQorICBHVEVTVF9GTEFHKG91dHB1dCkgPSJ4bWw6L3RtcC9maWxlbmFtZS5hYmMiOworICBFWFBFQ1RfU1RSRVEoRmlsZVBhdGgoIi90bXAvZmlsZW5hbWUuYWJjIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkuY19zdHIoKSk7CisjZW5kaWYKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aEFic29sdXRlUGF0aCkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICJjOlxcdG1wXFwiOworI2Vsc2UKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICIvdG1wLyI7CisjZW5kaWYKKworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOiIgKyBwYXRoOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9CisgICAgICBwYXRoICsgR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkuY19zdHIoKSArICIueG1sIjsKKyAgY29uc3QgU3RyaW5nJiBvdXRwdXRfZmlsZSA9IFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3ODJmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYyBjb25zdHJ1Y3RzIG9mCisvLyBHb29nbGUgVGVzdCB3b3JrLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgInRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlczsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yOworCisvLyBUZXN0cyB0aGF0IGdlbmVyYXRvcnMgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0CisvLyBhcmUgZnVuY3Rpb25hbC4gVGhlIHRlc3QgdXNpbmcgZXh0ZXJuX2dlbiBpcyBkZWZpbmVkCisvLyBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MuCitQYXJhbUdlbmVyYXRvcjxpbnQ+IGV4dGVybl9nZW4gPSBWYWx1ZXMoMzMpOworCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgaW4gb25lIHRyYW5zbGF0aW9uIHVuaXQKKy8vIGFuZCBpbnN0YW50aWF0ZWQgaW4gYW5vdGhlci4gVGhlIHRlc3QgaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MKKy8vIGFuZCBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IGZpeHR1cmUgY2xhc3MgaXMgZGVmaW5lZCBpbgorLy8gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmguCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNdWx0aXBsZXNPZjMzLAorICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygzMywgNjYpKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBpbnN0YW50aWF0ZWQKKy8vIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzLiBBbm90aGVyIGluc3RhbnRpYXRpb24gaXMgZGVmaW5lZAorLy8gaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIGFuZCBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QKKy8vIGZpeHR1cmUgaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaAorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyKjMsIDQyKjQsIDQyKjUpKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVApkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTUzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MKQEAgLTAsMCArMSw4OTUgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZi4gVGhpcyBmaWxlIHZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycyBvYmplY3RzIHByb2R1Y2UgY29ycmVjdCBwYXJhbWV0ZXIgc2VxdWVuY2VzIGFuZCB0aGF0CisvLyBHb29nbGUgVGVzdCBydW50aW1lIGluc3RhbnRpYXRlcyBjb3JyZWN0IHRlc3RzIGZyb20gdGhvc2Ugc2VxdWVuY2VzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyMgaW5jbHVkZSA8YWxnb3JpdGhtPgorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKyMgaW5jbHVkZSA8bGlzdD4KKyMgaW5jbHVkZSA8c3N0cmVhbT4KKyMgaW5jbHVkZSA8c3RyaW5nPgorIyBpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRvIGluY2x1ZGUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmguCisjIGRlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorIyBpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiICAvLyBmb3IgVW5pdFRlc3RPcHRpb25zCisjIHVuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjIGluY2x1ZGUgInRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgiCisKK3VzaW5nIDo6c3RkOjp2ZWN0b3I7Cit1c2luZyA6OnN0ZDo6c29ydDsKKwordXNpbmcgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQ7Cit1c2luZyA6OnRlc3Rpbmc6OkJvb2w7Cit1c2luZyA6OnRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyA6OnRlc3Rpbmc6OlJhbmdlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlc0luOworCisjIGlmIEdURVNUX0hBU19DT01CSU5FCit1c2luZyA6OnRlc3Rpbmc6OkNvbWJpbmU7Cit1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7Cit1c2luZyA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGU7CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczsKKworLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcuCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbW92ZSBQcmludFZhbHVlKCkgd2hlbiB3ZSBtb3ZlIG1hdGNoZXJzIGFuZAorLy8gRVhQRUNUX1RIQVQoKSBmcm9tIEdvb2dsZSBNb2NrIHRvIEdvb2dsZSBUZXN0LiAgQXQgdGhhdCB0aW1lLCB3ZQorLy8gY2FuIHdyaXRlIEVYUEVDVF9USEFUKHgsIEVxKHkpKSB0byBjb21wYXJlIHR3byB0dXBsZXMgeCBhbmQgeSwgYXMKKy8vIEVYUEVDVF9USEFUKCkgYW5kIHRoZSBtYXRjaGVycyBrbm93IGhvdyB0byBwcmludCB0dXBsZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8IHZhbHVlOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFRoZXNlIG92ZXJsb2FkcyBhbGxvdyBwcmludGluZyB0dXBsZXMgaW4gb3VyIHRlc3RzLiAgV2UgY2Fubm90CisvLyBkZWZpbmUgYW4gb3BlcmF0b3I8PCBmb3IgdHVwbGVzLCBhcyB0aGF0IGRlZmluaXRpb24gbmVlZHMgdG8gYmUgaW4KKy8vIHRoZSBzdGQgbmFtZXNwYWNlIGluIG9yZGVyIHRvIGJlIHBpY2tlZCB1cCBieSBHb29nbGUgVGVzdCB2aWEKKy8vIEFyZ3VtZW50LURlcGVuZGVudCBMb29rdXAsIHlldCBkZWZpbmluZyBhbnl0aGluZyBpbiB0aGUgc3RkCisvLyBuYW1lc3BhY2UgaW4gbm9uLVNUTCBjb2RlIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKzo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZShjb25zdCB0dXBsZTxUMSwgVDI+JiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8ICIoIiA8PCBnZXQ8MD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDE+KHZhbHVlKSA8PCAiKSI7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorOjpzdGQ6OnN0cmluZyBQcmludFZhbHVlKGNvbnN0IHR1cGxlPFQxLCBUMiwgVDM+JiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8ICIoIiA8PCBnZXQ8MD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDE+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDwyPih2YWx1ZSkgPDwgIikiOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Cis6OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoCisgICAgY29uc3QgdHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIHN0cmVhbSA8PCAiKCIgPDwgZ2V0PDA+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwxPih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8Mj4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDM+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDw0Pih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8NT4odmFsdWUpCisgICAgICAgICA8PCAiLCAiPDwgZ2V0PDY+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDw3Pih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8OD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDk+KHZhbHVlKSA8PCAiKSI7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFZlcmlmaWVzIHRoYXQgYSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvciBhbmQgYWNjZXNzZWQKKy8vIHZpYSB0aGUgaXRlcmF0b3Igb2JqZWN0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIG9uZSB1c2luZyBHb29nbGUgVGVzdAorLy8gYXNzZXJ0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3ZvaWQgVmVyaWZ5R2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ+JiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUICgmZXhwZWN0ZWRfdmFsdWVzKVtOXSkgeworICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUPjo6aXRlcmF0b3IgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgZWxlbWVudCAiIDw8IGkgPDwgIiB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKKyAgICAvLyBXZSBjYW5ub3QgdXNlIEVYUEVDVF9FUSgpIGhlcmUgYXMgdGhlIHZhbHVlcyBtYXkgYmUgdHVwbGVzLAorICAgIC8vIHdoaWNoIGRvbid0IHN1cHBvcnQgPDwuCisgICAgRVhQRUNUX1RSVUUoZXhwZWN0ZWRfdmFsdWVzW2ldID09ICppdCkKKyAgICAgICAgPDwgIndoZXJlIGkgaXMgIiA8PCBpCisgICAgICAgIDw8ICIsIGV4cGVjdGVkX3ZhbHVlc1tpXSBpcyAiIDw8IFByaW50VmFsdWUoZXhwZWN0ZWRfdmFsdWVzW2ldKQorICAgICAgICA8PCAiLCAqaXQgaXMgIiA8PCBQcmludFZhbHVlKCppdCkKKyAgICAgICAgPDwgIiwgYW5kICdpdCcgaXMgYW4gaXRlcmF0b3IgY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKKyAgICBpdCsrOworICB9CisgIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKKyAgICAgICAgPDwgIkF0IHRoZSBwcmVzdW1lZCBlbmQgb2Ygc2VxdWVuY2Ugd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKKyAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7CisKKyAgLy8gVGVzdCB0aGUgaXRlcmF0b3IgYXNzaWdubWVudC4gVGhlIGZvbGxvd2luZyBsaW5lcyB2ZXJpZnkgdGhhdAorICAvLyB0aGUgc2VxdWVuY2UgYWNjZXNzZWQgdmlhIGFuIGl0ZXJhdG9yIGluaXRpYWxpemVkIHZpYSB0aGUKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvciAoYXMgb3Bwb3NlZCB0byBhIGNvcHkgY29uc3RydWN0b3IpIG1hdGNoZXMKKyAgLy8ganVzdCB0aGUgc2FtZS4KKyAgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgZWxlbWVudCAiIDw8IGkgPDwgIiB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLlxuIjsKKyAgICBFWFBFQ1RfVFJVRShleHBlY3RlZF92YWx1ZXNbaV0gPT0gKml0KQorICAgICAgICA8PCAid2hlcmUgaSBpcyAiIDw8IGkKKyAgICAgICAgPDwgIiwgZXhwZWN0ZWRfdmFsdWVzW2ldIGlzICIgPDwgUHJpbnRWYWx1ZShleHBlY3RlZF92YWx1ZXNbaV0pCisgICAgICAgIDw8ICIsICppdCBpcyAiIDw8IFByaW50VmFsdWUoKml0KQorICAgICAgICA8PCAiLCBhbmQgJ2l0JyBpcyBhbiBpdGVyYXRvciBjcmVhdGVkIHdpdGggdGhlIGNvcHkgY29uc3RydWN0b3IuXG4iOworICAgIGl0Kys7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgdGhlIHByZXN1bWVkIGVuZCBvZiBzZXF1ZW5jZSB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLlxuIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoY29uc3QgUGFyYW1HZW5lcmF0b3I8VD4mIGdlbmVyYXRvcikgeworICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUPjo6aXRlcmF0b3IgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKTsKKworICBpdCA9IGdlbmVyYXRvci5iZWdpbigpOworICBFWFBFQ1RfVFJVRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpOworfQorCisvLyBHZW5lcmF0b3IgdGVzdHMuIFRoZXkgdGVzdCB0aGF0IGVhY2ggb2YgdGhlIHByb3ZpZGVkIGdlbmVyYXRvciBmdW5jdGlvbnMKKy8vIGdlbmVyYXRlcyBhbiBleHBlY3RlZCBzZXF1ZW5jZSBvZiB2YWx1ZXMuIFRoZSBnZW5lcmFsIHRlc3QgcGF0dGVybgorLy8gaW5zdGFudGlhdGVzIGEgZ2VuZXJhdG9yIHVzaW5nIG9uZSBvZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9ucywKKy8vIGNoZWNrcyB0aGUgc2VxdWVuY2UgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvciB1c2luZyBpdHMgaXRlcmF0b3IgQVBJLAorLy8gYW5kIHRoZW4gcmVzZXRzIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlCisvLyBhbmQgY2hlY2tzIHRoZSBzZXF1ZW5jZSBhZ2Fpbi4KKworLy8gVGVzdHMgdGhhdCBpdGVyYXRvcnMgcHJvZHVjZWQgYnkgZ2VuZXJhdG9yIGZ1bmN0aW9ucyBjb25mb3JtIHRvIHRoZQorLy8gRm9yd2FyZEl0ZXJhdG9yIGNvbmNlcHQuCitURVNUKEl0ZXJhdG9yVGVzdCwgUGFyYW1JdGVyYXRvckNvbmZvcm1zVG9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0KSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMTApOworICBQYXJhbUdlbmVyYXRvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGdlbi5iZWdpbigpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgaXRlcmF0b3IgaW5pdGlhbGl6YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgIFBhcmFtR2VuZXJhdG9yPGludD46Oml0ZXJhdG9yIGl0MiA9IGl0OworICBFWFBFQ1RfVFJVRSgqaXQgPT0gKml0MikgPDwgIkluaXRpYWxpemVkIGl0ZXJhdG9ycyBtdXN0IHBvaW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZWxlbWVudCBzYW1lIGFzIGl0cyBzb3VyY2UgcG9pbnRzIHRvIjsKKworICAvLyBWZXJpZmllcyB0aGF0IGl0ZXJhdG9yIGFzc2lnbm1lbnQgd29ya3MgYXMgZXhwZWN0ZWQuCisgIGl0Kys7CisgIEVYUEVDVF9GQUxTRSgqaXQgPT0gKml0Mik7CisgIGl0MiA9IGl0OworICBFWFBFQ1RfVFJVRSgqaXQgPT0gKml0MikgPDwgIkFzc2lnbmVkIGl0ZXJhdG9ycyBtdXN0IHBvaW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZWxlbWVudCBzYW1lIGFzIGl0cyBzb3VyY2UgcG9pbnRzIHRvIjsKKworICAvLyBWZXJpZmllcyB0aGF0IHByZWZpeCBvcGVyYXRvcisrKCkgcmV0dXJucyAqdGhpcy4KKyAgRVhQRUNUX0VRKCZpdCwgJigrK2l0KSkgPDwgIlJlc3VsdCBvZiB0aGUgcHJlZml4IG9wZXJhdG9yKysgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJyZWZlciB0byB0aGUgb3JpZ2luYWwgb2JqZWN0IjsKKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIHBvc3RmaXggb3BlcmF0b3IrKyBwb2ludHMgdG8gdGhlIHZhbHVlCisgIC8vIHBvaW50ZWQgdG8gYnkgdGhlIG9yaWdpbmFsIGl0ZXJhdG9yLgorICBpbnQgb3JpZ2luYWxfdmFsdWUgPSAqaXQ7ICAvLyBIYXZlIHRvIGNvbXB1dGUgaXQgb3V0c2lkZSBvZiBtYWNybyBjYWxsIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWZmZWN0ZWQgYnkgdGhlIHBhcmFtZXRlciBldmFsdWF0aW9uIG9yZGVyLgorICBFWFBFQ1RfRVEob3JpZ2luYWxfdmFsdWUsICooaXQrKykpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgcHJlZml4IGFuZCBwb3N0Zml4IG9wZXJhdG9yKysoKSBhZHZhbmNlIGFuIGl0ZXJhdG9yCisgIC8vIGFsbCB0aGUgc2FtZS4KKyAgaXQyID0gaXQ7CisgIGl0Kys7CisgICsraXQyOworICBFWFBFQ1RfVFJVRSgqaXQgPT0gKml0Mik7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmFuZ2UoKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlV2l0aERlZmF1bHRTdGVwKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMyk7CisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswLCAxLCAyfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFJhbmdlKCkgZ2VuZXJhdGVzIHRoZSBzaW5nbGUgZWxlbWVudCBzZXF1ZW5jZQorLy8gYXMgZXhwZWN0ZWQgd2hlbiBwcm92aWRlZCB3aXRoIHJhbmdlIGxpbWl0cyB0aGF0IGFyZSBlcXVhbC4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVNpbmdsZVZhbHVlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMSk7CisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFJhbmdlKCkgd2l0aCBnZW5lcmF0ZXMgZW1wdHkgc2VxdWVuY2Ugd2hlbgorLy8gc3VwcGxpZWQgd2l0aCBhbiBlbXB0eSByYW5nZS4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZUVtcHR5KSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMCk7CisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gVGVzdHMgdGhhdCBSYW5nZSgpIHdpdGggY3VzdG9tIHN0ZXAgKGdyZWF0ZXIgdGhlbiBvbmUpIGdlbmVyYXRlcworLy8gdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlV2l0aEN1c3RvbVN0ZXApIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCA5LCAzKTsKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezAsIDMsIDZ9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IFJhbmdlKCkgd2l0aCBjdXN0b20gc3RlcCAoZ3JlYXRlciB0aGVuIG9uZSkgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugd2hlbiB0aGUgbGFzdCBlbGVtZW50IGRvZXMgbm90IGZhbGwgb24gdGhlCisvLyB1cHBlciByYW5nZSBsaW1pdC4gU2VxdWVuY2VzIGdlbmVyYXRlZCBieSBSYW5nZSgpIG11c3Qgbm90IGhhdmUKKy8vIGVsZW1lbnRzIGJleW9uZCB0aGUgcmFuZ2UgbGltaXRzLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlV2l0aEN1c3RvbVN0ZXBPdmVyVXBwZXJCb3VuZCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDQsIDMpOworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MCwgM307CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgUmFuZ2Ugd29ya3Mgd2l0aCB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBkZWZpbmUKKy8vIGNvcHkgY29uc3RydWN0b3IsIG9wZXJhdG9yPSgpLCBvcGVyYXRvcisoKSwgYW5kIG9wZXJhdG9yPCgpLgorY2xhc3MgRG9nQWRkZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRG9nQWRkZXIoY29uc3QgY2hhciogYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKyAgRG9nQWRkZXIoY29uc3QgRG9nQWRkZXImIG90aGVyKSA6IHZhbHVlXyhvdGhlci52YWx1ZV8uY19zdHIoKSkge30KKworICBEb2dBZGRlciBvcGVyYXRvcj0oY29uc3QgRG9nQWRkZXImIG90aGVyKSB7CisgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBEb2dBZGRlciBvcGVyYXRvcisoY29uc3QgRG9nQWRkZXImIG90aGVyKSBjb25zdCB7CisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8IHZhbHVlXy5jX3N0cigpIDw8IG90aGVyLnZhbHVlXy5jX3N0cigpOworICAgIHJldHVybiBEb2dBZGRlcihtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRG9nQWRkZXImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyA8IG90aGVyLnZhbHVlXzsKKyAgfQorICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmcgdmFsdWVfOworfTsKKworVEVTVChSYW5nZVRlc3QsIFdvcmtzV2l0aEFDdXN0b21UeXBlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPERvZ0FkZGVyPiBnZW4gPQorICAgICAgUmFuZ2UoRG9nQWRkZXIoImNhdCIpLCBEb2dBZGRlcigiY2F0ZG9nZG9nIiksIERvZ0FkZGVyKCJkb2ciKSk7CisgIFBhcmFtR2VuZXJhdG9yPERvZ0FkZGVyPjo6aXRlcmF0b3IgaXQgPSBnZW4uYmVnaW4oKTsKKworICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuLmVuZCgpKTsKKyAgRVhQRUNUX1NUUkVRKCJjYXQiLCBpdC0+dmFsdWUoKS5jX3N0cigpKTsKKworICBBU1NFUlRfRkFMU0UoKytpdCA9PSBnZW4uZW5kKCkpOworICBFWFBFQ1RfU1RSRVEoImNhdGRvZyIsIGl0LT52YWx1ZSgpLmNfc3RyKCkpOworCisgIEVYUEVDVF9UUlVFKCsraXQgPT0gZ2VuLmVuZCgpKTsKK30KKworY2xhc3MgSW50V3JhcHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBJbnRXcmFwcGVyKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorICBJbnRXcmFwcGVyKGNvbnN0IEludFdyYXBwZXImIG90aGVyKSA6IHZhbHVlXyhvdGhlci52YWx1ZV8pIHt9CisKKyAgSW50V3JhcHBlciBvcGVyYXRvcj0oY29uc3QgSW50V3JhcHBlciYgb3RoZXIpIHsKKyAgICB2YWx1ZV8gPSBvdGhlci52YWx1ZV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vIG9wZXJhdG9yKygpIGFkZHMgYSBkaWZmZXJlbnQgdHlwZS4KKyAgSW50V3JhcHBlciBvcGVyYXRvcisoaW50IG90aGVyKSBjb25zdCB7IHJldHVybiBJbnRXcmFwcGVyKHZhbHVlXyArIG90aGVyKTsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBJbnRXcmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gPCBvdGhlci52YWx1ZV87CisgIH0KKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworVEVTVChSYW5nZVRlc3QsIFdvcmtzV2l0aEFDdXN0b21UeXBlV2l0aERpZmZlcmVudEluY3JlbWVudFR5cGUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8SW50V3JhcHBlcj4gZ2VuID0gUmFuZ2UoSW50V3JhcHBlcigwKSwgSW50V3JhcHBlcigyKSk7CisgIFBhcmFtR2VuZXJhdG9yPEludFdyYXBwZXI+OjppdGVyYXRvciBpdCA9IGdlbi5iZWdpbigpOworCisgIEFTU0VSVF9GQUxTRShpdCA9PSBnZW4uZW5kKCkpOworICBFWFBFQ1RfRVEoMCwgaXQtPnZhbHVlKCkpOworCisgIEFTU0VSVF9GQUxTRSgrK2l0ID09IGdlbi5lbmQoKSk7CisgIEVYUEVDVF9FUSgxLCBpdC0+dmFsdWUoKSk7CisKKyAgRVhQRUNUX1RSVUUoKytpdCA9PSBnZW4uZW5kKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgd2l0aCBhbiBhcnJheSBwYXJhbWV0ZXIgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5BcnJheSkgeworICBpbnQgYXJyYXlbXSA9IHszLCA1LCA4fTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbihhcnJheSk7CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGFycmF5KTsKK30KKworLy8gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHdpdGggYSBjb25zdCBhcnJheSBwYXJhbWV0ZXIgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5Db25zdEFycmF5KSB7CisgIGNvbnN0IGludCBhcnJheVtdID0gezMsIDUsIDh9OworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKGFycmF5KTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgYXJyYXkpOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSB3aXRoIGFuIGFycmF5IHBhcmFtZXRlciBjb250YWluaW5nIGEKKy8vIHNpbmdsZSBlbGVtZW50IGdlbmVyYXRlcyB0aGUgc2luZ2xlIGVsZW1lbnQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5TaW5nbGVFbGVtZW50QXJyYXkpIHsKKyAgaW50IGFycmF5W10gPSB7NDJ9OworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKGFycmF5KTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgYXJyYXkpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBmb3IgYW4gU1RMCisvLyBjb250YWluZXIgKHZlY3RvcikuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5WZWN0b3IpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGludD4gQ29udGFpbmVyVHlwZTsKKyAgQ29udGFpbmVyVHlwZSB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soMyk7CisgIHZhbHVlcy5wdXNoX2JhY2soNSk7CisgIHZhbHVlcy5wdXNoX2JhY2soOCk7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNSwgOH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luSXRlcmF0b3JSYW5nZSkgeworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOworICBDb250YWluZXJUeXBlIHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjaygzKTsKKyAgdmFsdWVzLnB1c2hfYmFjayg1KTsKKyAgdmFsdWVzLnB1c2hfYmFjayg4KTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNSwgOH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHByb3ZpZGVkIHdpdGggYW4gaXRlcmF0b3IgcmFuZ2Ugc3BlY2lmeWluZyBhCisvLyBzaW5nbGUgdmFsdWUgZ2VuZXJhdGVzIGEgc2luZ2xlLWVsZW1lbnQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5TaW5nbGVFbGVtZW50SXRlcmF0b3JSYW5nZSkgeworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOworICBDb250YWluZXJUeXBlIHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjayg0Mik7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezQyfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFZhbHVlc0luKCkgcHJvdmlkZWQgd2l0aCBhbiBlbXB0eSBpdGVyYXRvciByYW5nZQorLy8gZ2VuZXJhdGVzIGFuIGVtcHR5IHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luRW1wdHlJdGVyYXRvclJhbmdlKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7CisgIENvbnRhaW5lclR5cGUgdmFsdWVzOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworCisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgVmFsdWVzKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV29ya3MpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXMoMywgNSwgOCk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezMsIDUsIDh9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlcygpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2VzIGZyb20gZWxlbWVudHMgb2YKKy8vIGRpZmZlcmVudCB0eXBlcyBjb252ZXJ0aWJsZSB0byBQYXJhbUdlbmVyYXRvcidzIHBhcmFtZXRlciB0eXBlLgorVEVTVChWYWx1ZXNUZXN0LCBWYWx1ZXNXb3Jrc0ZvclZhbHVlc09mQ29tcGF0aWJsZVR5cGVzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGRvdWJsZT4gZ2VuID0gVmFsdWVzKDMsIDUuMGYsIDguMCk7CisKKyAgY29uc3QgZG91YmxlIGV4cGVjdGVkX3ZhbHVlc1tdID0gezMuMCwgNS4wLCA4LjB9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCitURVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dvcmtzRm9yTWF4TGVuZ3RoTGlzdCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcygKKyAgICAgIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAsIDEwMCwKKyAgICAgIDExMCwgMTIwLCAxMzAsIDE0MCwgMTUwLCAxNjAsIDE3MCwgMTgwLCAxOTAsIDIwMCwKKyAgICAgIDIxMCwgMjIwLCAyMzAsIDI0MCwgMjUwLCAyNjAsIDI3MCwgMjgwLCAyOTAsIDMwMCwKKyAgICAgIDMxMCwgMzIwLCAzMzAsIDM0MCwgMzUwLCAzNjAsIDM3MCwgMzgwLCAzOTAsIDQwMCwKKyAgICAgIDQxMCwgNDIwLCA0MzAsIDQ0MCwgNDUwLCA0NjAsIDQ3MCwgNDgwLCA0OTAsIDUwMCk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0geworICAgICAgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwLAorICAgICAgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsIDE2MCwgMTcwLCAxODAsIDE5MCwgMjAwLAorICAgICAgMjEwLCAyMjAsIDIzMCwgMjQwLCAyNTAsIDI2MCwgMjcwLCAyODAsIDI5MCwgMzAwLAorICAgICAgMzEwLCAzMjAsIDMzMCwgMzQwLCAzNTAsIDM2MCwgMzcwLCAzODAsIDM5MCwgNDAwLAorICAgICAgNDEwLCA0MjAsIDQzMCwgNDQwLCA0NTAsIDQ2MCwgNDcwLCA0ODAsIDQ5MCwgNTAwfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlIHRlc3QuIFRlc3RzIHRoYXQgc2luZ2xlLXBhcmFtZXRlciBWYWx1ZXMoKSBnZW5lcmF0ZXMgdGhlIHNlcXVlbmNlCisvLyB3aXRoIHRoZSBzaW5nbGUgdmFsdWUuCitURVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dpdGhTaW5nbGVQYXJhbWV0ZXIpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXMoNDIpOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHs0Mn07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQm9vbCgpIGdlbmVyYXRlcyBzZXF1ZW5jZSAoZmFsc2UsIHRydWUpLgorVEVTVChCb29sVGVzdCwgQm9vbFdvcmtzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGJvb2w+IGdlbiA9IEJvb2woKTsKKworICBjb25zdCBib29sIGV4cGVjdGVkX3ZhbHVlc1tdID0ge2ZhbHNlLCB0cnVlfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorCisvLyBUZXN0cyB0aGF0IENvbWJpbmUoKSB3aXRoIHR3byBwYXJhbWV0ZXJzIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aFR3b1BhcmFtZXRlcnMpIHsKKyAgY29uc3QgY2hhciogZm9vID0gImZvbyI7CisgIGNvbnN0IGNoYXIqIGJhciA9ICJiYXIiOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxjb25zdCBjaGFyKiwgaW50PiA+IGdlbiA9CisgICAgICBDb21iaW5lKFZhbHVlcyhmb28sIGJhciksIFZhbHVlcygzLCA0KSk7CisKKyAgdHVwbGU8Y29uc3QgY2hhciosIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7CisgICAgbWFrZV90dXBsZShmb28sIDMpLCBtYWtlX3R1cGxlKGZvbywgNCksCisgICAgbWFrZV90dXBsZShiYXIsIDMpLCBtYWtlX3R1cGxlKGJhciwgNCl9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IENvbWJpbmUoKSB3aXRoIHRocmVlIHBhcmFtZXRlcnMgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoVGhyZWVQYXJhbWV0ZXJzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMywgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNSwgNikpOworICB0dXBsZTxpbnQsIGludCwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHsKKyAgICBtYWtlX3R1cGxlKDAsIDMsIDUpLCBtYWtlX3R1cGxlKDAsIDMsIDYpLAorICAgIG1ha2VfdHVwbGUoMCwgNCwgNSksIG1ha2VfdHVwbGUoMCwgNCwgNiksCisgICAgbWFrZV90dXBsZSgxLCAzLCA1KSwgbWFrZV90dXBsZSgxLCAzLCA2KSwKKyAgICBtYWtlX3R1cGxlKDEsIDQsIDUpLCBtYWtlX3R1cGxlKDEsIDQsIDYpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgQ29tYmluZSgpIHdpdGggdGhlIGZpcnN0IHBhcmFtZXRlciBnZW5lcmF0aW5nIGEgc2luZ2xlIHZhbHVlCisvLyBzZXF1ZW5jZSBnZW5lcmF0ZXMgYSBzZXF1ZW5jZSB3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlCisvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlci4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoRmlyc3RQYXJhbWV0ZXJTaW5nbGVWYWx1ZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcyg0MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDAsIDEpKTsKKworICB0dXBsZTxpbnQsIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7bWFrZV90dXBsZSg0MiwgMCksIG1ha2VfdHVwbGUoNDIsIDEpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgQ29tYmluZSgpIHdpdGggdGhlIHNlY29uZCBwYXJhbWV0ZXIgZ2VuZXJhdGluZyBhIHNpbmdsZSB2YWx1ZQorLy8gc2VxdWVuY2UgZ2VuZXJhdGVzIGEgc2VxdWVuY2Ugd2l0aCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZQorLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGZpcnN0IHBhcmFtZXRlci4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoU2Vjb25kUGFyYW1ldGVyU2luZ2xlVmFsdWUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyKSk7CisKKyAgdHVwbGU8aW50LCBpbnQ+IGV4cGVjdGVkX3ZhbHVlc1tdID0ge21ha2VfdHVwbGUoMCwgNDIpLCBtYWtlX3R1cGxlKDEsIDQyKX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiB0aGUgZmlyc3QgcGFyYW1ldGVyIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLAorLy8gQ29tYmluZSgpIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLCB0b28uCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aEZpcnN0UGFyYW1ldGVyRW1wdHlSYW5nZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygwLCAxKSk7CisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLAorLy8gQ29tYmluZSgpIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLCB0b28uCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aFNlY29uZFBhcmFtZXRlckVtcHR5UmFuZ2UpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UoMSwgMSkpOworICBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGdlbik7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBjb21iaW5lIHdvcmtzIHdpdGggdGhlIG1heGltdW0gbnVtYmVyCisvLyBvZiBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSBHb29nbGUgVGVzdCAoY3VycmVudGx5IDEwKS4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoTWF4TnVtYmVyT2ZQYXJhbWV0ZXJzKSB7CisgIGNvbnN0IGNoYXIqIGZvbyA9ICJmb28iOworICBjb25zdCBjaGFyKiBiYXIgPSAiYmFyIjsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8Y29uc3QgY2hhciosIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoZm9vLCBiYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygxKSwgVmFsdWVzKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygzKSwgVmFsdWVzKDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg1KSwgVmFsdWVzKDYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg3KSwgVmFsdWVzKDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg5KSk7CisKKyAgdHVwbGU8Y29uc3QgY2hhciosIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQ+CisgICAgICBleHBlY3RlZF92YWx1ZXNbXSA9IHttYWtlX3R1cGxlKGZvbywgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKGJhciwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSl9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisvLyBUZXN0cyB0aGF0IGFuIGdlbmVyYXRvciBwcm9kdWNlcyBjb3JyZWN0IHNlcXVlbmNlIGFmdGVyIGJlaW5nCisvLyBhc3NpZ25lZCBmcm9tIGFub3RoZXIgZ2VuZXJhdG9yLgorVEVTVChQYXJhbUdlbmVyYXRvclRlc3QsIEFzc2lnbm1lbnRXb3JrcykgeworICBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcygxLCAyKTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4yID0gVmFsdWVzKDMsIDQpOworICBnZW4gPSBnZW4yOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA0fTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIHRlc3RzIGFyZSBleHBhbmRlZCBhbmQgcnVuIGFzIHNwZWNpZmllZDoKKy8vIG9uZSB0ZXN0IHBlciBlbGVtZW50IGZyb20gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IKKy8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9URVNUX0NBU0VfUC4gSXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSB0ZXN0J3MKKy8vIGZpeHR1cmUgY29uc3RydWN0b3IsIFNldFVwKCksIGFuZCBUZWFyRG93bigpIGhhdmUgcnVuIGFuZCBoYXZlIGJlZW4KKy8vIHN1cHBsaWVkIHdpdGggdGhlIGNvcnJlY3QgcGFyYW1ldGVycy4KKworLy8gVGhlIHVzZSBvZiBlbnZpcm9ubWVudCBvYmplY3QgYWxsb3dzIGRldGVjdGlvbiBvZiB0aGUgY2FzZSB3aGVyZSBubyB0ZXN0CisvLyBjYXNlIGZ1bmN0aW9uYWxpdHkgaXMgcnVuIGF0IGFsbC4gSW4gdGhpcyBjYXNlIFRlc3RDYXNlVGVhckRvd24gd2lsbCBub3QKKy8vIGJlIGFibGUgdG8gZGV0ZWN0IG1pc3NpbmcgdGVzdHMsIG5hdHVyYWxseS4KK3RlbXBsYXRlIDxpbnQga0V4cGVjdGVkQ2FsbHM+CitjbGFzcyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgc3RhdGljIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQqIEluc3RhbmNlKCkgeworICAgIHN0YXRpYyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50KiBpbnN0YW5jZSA9IG5ldyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50OworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfQorCisgIHZvaWQgRml4dHVyZUNvbnN0cnVjdG9yRXhlY3V0ZWQoKSB7IGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfKys7IH0KKyAgdm9pZCBTZXRVcEV4ZWN1dGVkKCkgeyBzZXRfdXBfY291bnRfKys7IH0KKyAgdm9pZCBUZWFyRG93bkV4ZWN1dGVkKCkgeyB0ZWFyX2Rvd25fY291bnRfKys7IH0KKyAgdm9pZCBUZXN0Qm9keUV4ZWN1dGVkKCkgeyB0ZXN0X2JvZHlfY291bnRfKys7IH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gSWYgYWxsIE11bHRpcGxlVGVzdEdlbmVyYXRpb25UZXN0IHRlc3RzIGhhdmUgYmVlbiBkZS1zZWxlY3RlZAorICAgIC8vIGJ5IHRoZSBmaWx0ZXIgZmxhZywgdGhlIGZvbGxvd2luZyBjaGVja3MgbWFrZSBubyBzZW5zZS4KKyAgICBib29sIHBlcmZvcm1fY2hlY2sgPSBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0V4cGVjdGVkQ2FsbHM7ICsraSkgeworICAgICAgTWVzc2FnZSBtc2c7CisgICAgICBtc2cgPDwgIlRlc3RzRXhwYW5kZWRBbmRSdW4vIiA8PCBpOworICAgICAgaWYgKFVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoCisgICAgICAgICAgICAgIlRlc3RFeHBhbnNpb25Nb2R1bGUvTXVsdGlwbGVUZXN0R2VuZXJhdGlvblRlc3QiLAorICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSkpIHsKKyAgICAgICAgcGVyZm9ybV9jaGVjayA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChwZXJmb3JtX2NoZWNrKSB7CisgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfKQorICAgICAgICAgIDw8ICJGaXh0dXJlIGNvbnN0cnVjdG9yIG9mIFBhcmFtVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgImhhcyBub3QgYmVlbiBydW4gYXMgZXhwZWN0ZWQuIjsKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgc2V0X3VwX2NvdW50XykKKyAgICAgICAgICA8PCAiRml4dHVyZSBTZXRVcCBtZXRob2Qgb2YgUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOworICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZENhbGxzLCB0ZWFyX2Rvd25fY291bnRfKQorICAgICAgICAgIDw8ICJGaXh0dXJlIFRlYXJEb3duIG1ldGhvZCBvZiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7CisgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIHRlc3RfYm9keV9jb3VudF8pCisgICAgICAgICAgPDwgIlRlc3QgaW4gUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorIHByaXZhdGU6CisgIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQoKSA6IGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfKDApLCBzZXRfdXBfY291bnRfKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fY291bnRfKDApLCB0ZXN0X2JvZHlfY291bnRfKDApIHt9CisKKyAgaW50IGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfOworICBpbnQgc2V0X3VwX2NvdW50XzsKKyAgaW50IHRlYXJfZG93bl9jb3VudF87CisgIGludCB0ZXN0X2JvZHlfY291bnRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCk7Cit9OworCitjb25zdCBpbnQgdGVzdF9nZW5lcmF0aW9uX3BhcmFtc1tdID0gezM2LCA0MiwgNzJ9OworCitjbGFzcyBUZXN0R2VuZXJhdGlvblRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsKKyBwdWJsaWM6CisgIGVudW0geworICAgIFBBUkFNRVRFUl9DT1VOVCA9CisgICAgICAgIHNpemVvZih0ZXN0X2dlbmVyYXRpb25fcGFyYW1zKS9zaXplb2YodGVzdF9nZW5lcmF0aW9uX3BhcmFtc1swXSkKKyAgfTsKKworICB0eXBlZGVmIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQ8UEFSQU1FVEVSX0NPVU5UPiBFbnZpcm9ubWVudDsKKworICBUZXN0R2VuZXJhdGlvblRlc3QoKSB7CisgICAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPkZpeHR1cmVDb25zdHJ1Y3RvckV4ZWN1dGVkKCk7CisgICAgY3VycmVudF9wYXJhbWV0ZXJfID0gR2V0UGFyYW0oKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlNldFVwRXhlY3V0ZWQoKTsKKyAgICBFWFBFQ1RfRVEoY3VycmVudF9wYXJhbWV0ZXJfLCBHZXRQYXJhbSgpKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlRlYXJEb3duRXhlY3V0ZWQoKTsKKyAgICBFWFBFQ1RfRVEoY3VycmVudF9wYXJhbWV0ZXJfLCBHZXRQYXJhbSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgYm9vbCBhbGxfdGVzdHNfaW5fdGVzdF9jYXNlX3NlbGVjdGVkID0gdHJ1ZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUEFSQU1FVEVSX0NPVU5UOyArK2kpIHsKKyAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lOworICAgICAgdGVzdF9uYW1lIDw8ICJUZXN0c0V4cGFuZGVkQW5kUnVuLyIgPDwgaTsKKyAgICAgIGlmICggIVVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoCisgICAgICAgICAgICAgICAgIlRlc3RFeHBhbnNpb25Nb2R1bGUvTXVsdGlwbGVUZXN0R2VuZXJhdGlvblRlc3QiLAorICAgICAgICAgICAgICAgIHRlc3RfbmFtZS5HZXRTdHJpbmcoKSkpIHsKKyAgICAgICAgYWxsX3Rlc3RzX2luX3Rlc3RfY2FzZV9zZWxlY3RlZCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfVFJVRShhbGxfdGVzdHNfaW5fdGVzdF9jYXNlX3NlbGVjdGVkKQorICAgICAgICA8PCAiV2hlbiBydW5uaW5nIHRoZSBUZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlIGFsbCBvZiBpdHMgdGVzdHNcbiIKKyAgICAgICAgPDwgIm11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGZpbHRlciBmbGFnIGZvciB0aGUgdGVzdCBjYXNlIHRvIHBhc3MuXG4iCisgICAgICAgIDw8ICJJZiBub3QgYWxsIG9mIHRoZW0gYXJlIGVuYWJsZWQsIHdlIGNhbid0IHJlbGlhYmx5IGNvbmNsdWRlXG4iCisgICAgICAgIDw8ICJ0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiB0ZXN0cyBoYXZlIGJlZW4gZ2VuZXJhdGVkLiI7CisKKyAgICBjb2xsZWN0ZWRfcGFyYW1ldGVyc18uY2xlYXIoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgdmVjdG9yPGludD4gZXhwZWN0ZWRfdmFsdWVzKHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXMgKyBQQVJBTUVURVJfQ09VTlQpOworICAgIC8vIFRlc3QgZXhlY3V0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGJ5IEdvb2dsZSBUZXN0LAorICAgIC8vIHNvIHRoZSBvcmRlciBvZiB2YWx1ZXMgaW4gY29sbGVjdGVkX3BhcmFtZXRlcnNfIGNhbiBiZQorICAgIC8vIGRpZmZlcmVudCBhbmQgd2UgaGF2ZSB0byBzb3J0IHRvIGNvbXBhcmUuCisgICAgc29ydChleHBlY3RlZF92YWx1ZXMuYmVnaW4oKSwgZXhwZWN0ZWRfdmFsdWVzLmVuZCgpKTsKKyAgICBzb3J0KGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5iZWdpbigpLCBjb2xsZWN0ZWRfcGFyYW1ldGVyc18uZW5kKCkpOworCisgICAgRVhQRUNUX1RSVUUoY29sbGVjdGVkX3BhcmFtZXRlcnNfID09IGV4cGVjdGVkX3ZhbHVlcyk7CisgIH0KKyBwcm90ZWN0ZWQ6CisgIGludCBjdXJyZW50X3BhcmFtZXRlcl87CisgIHN0YXRpYyB2ZWN0b3I8aW50PiBjb2xsZWN0ZWRfcGFyYW1ldGVyc187CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RHZW5lcmF0aW9uVGVzdCk7Cit9OwordmVjdG9yPGludD4gVGVzdEdlbmVyYXRpb25UZXN0Ojpjb2xsZWN0ZWRfcGFyYW1ldGVyc187CisKK1RFU1RfUChUZXN0R2VuZXJhdGlvblRlc3QsIFRlc3RzRXhwYW5kZWRBbmRSdW4pIHsKKyAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlRlc3RCb2R5RXhlY3V0ZWQoKTsKKyAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7CisgIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5wdXNoX2JhY2soR2V0UGFyYW0oKSk7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0RXhwYW5zaW9uTW9kdWxlLCBUZXN0R2VuZXJhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbih0ZXN0X2dlbmVyYXRpb25fcGFyYW1zKSk7CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBlbGVtZW50IHNlcXVlbmNlICh0aGlyZCBwYXJhbWV0ZXIgb2YKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKSBpcyBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSBhbmQgbmVpdGhlciBhdAorLy8gdGhlIGNhbGwgc2l0ZSBvZiBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBub3IgaW4gUlVOX0FMTF9URVNUUygpLiAgRm9yCisvLyB0aGF0LCB3ZSBkZWNsYXJlIHBhcmFtX3ZhbHVlXyB0byBiZSBhIHN0YXRpYyBtZW1iZXIgb2YKKy8vIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0IGFuZCBpbml0aWFsaXplIGl0IHRvIDAuICBXZSBzZXQgaXQgdG8gMSBpbgorLy8gbWFpbigpLCBqdXN0IGJlZm9yZSBpbnZvY2F0aW9uIG9mIEluaXRHb29nbGVUZXN0KCkuICBBZnRlciBjYWxsaW5nCisvLyBJbml0R29vZ2xlVGVzdCgpLCB3ZSBzZXQgdGhlIHZhbHVlIHRvIDIuICBJZiB0aGUgc2VxdWVuY2UgaXMgZXZhbHVhdGVkCisvLyBiZWZvcmUgb3IgYWZ0ZXIgSW5pdEdvb2dsZVRlc3QsIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgY3JlYXRlIGEKKy8vIHRlc3Qgd2l0aCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiAxLCBhbmQgdGhlIHRlc3QgYm9keSB3aWxsIGZhaWwgdGhlCisvLyBhc3NlcnRpb24uCitjbGFzcyBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geworIHB1YmxpYzoKKyAgc3RhdGljIGludCBwYXJhbV92YWx1ZSgpIHsgcmV0dXJuIHBhcmFtX3ZhbHVlXzsgfQorICBzdGF0aWMgdm9pZCBzZXRfcGFyYW1fdmFsdWUoaW50IHBhcmFtX3ZhbHVlKSB7IHBhcmFtX3ZhbHVlXyA9IHBhcmFtX3ZhbHVlOyB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IHBhcmFtX3ZhbHVlXzsKK307CitpbnQgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnBhcmFtX3ZhbHVlXyA9IDA7CisKK1RFU1RfUChHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCwgR2VuZXJhdG9yc0V2YWx1YXRlZEluTWFpbikgeworICBFWFBFQ1RfRVEoMSwgR2V0UGFyYW0oKSk7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChHZW5FdmFsTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnBhcmFtX3ZhbHVlKCkpKTsKKworLy8gVGVzdHMgdGhhdCBnZW5lcmF0b3JzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdCBhcmUKKy8vIGZ1bmN0aW9uYWwuIEdlbmVyYXRvciBleHRlcm5fZ2VuIGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4KK2V4dGVybiBQYXJhbUdlbmVyYXRvcjxpbnQ+IGV4dGVybl9nZW47CitjbGFzcyBFeHRlcm5hbEdlbmVyYXRvclRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworVEVTVF9QKEV4dGVybmFsR2VuZXJhdG9yVGVzdCwgRXh0ZXJuYWxHZW5lcmF0b3IpIHsKKyAgLy8gU2VxdWVuY2UgcHJvZHVjZWQgYnkgZXh0ZXJuX2dlbiBjb250YWlucyBvbmx5IGEgc2luZ2xlIHZhbHVlCisgIC8vIHdoaWNoIHdlIHZlcmlmeSBoZXJlLgorICBFWFBFQ1RfRVEoR2V0UGFyYW0oKSwgMzMpOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRXh0ZXJuYWxHZW5lcmF0b3JNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbEdlbmVyYXRvclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fZ2VuKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBkZWZpbmVkIGluIG9uZSB0cmFuc2xhdGlvbgorLy8gdW5pdCBhbmQgaW5zdGFudGlhdGVkIGluIGFub3RoZXIuIFRoaXMgdGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbgorLy8gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4gRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCBmaXh0dXJlIGNsYXNzIGlzCisvLyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oLgorVEVTVF9QKEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QsIElzTXVsdGlwbGVPZjMzKSB7CisgIEVYUEVDVF9FUSgwLCBHZXRQYXJhbSgpICUgMzMpOworfQorCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIG11bHRpcGxlCisvLyBnZW5lcmF0b3JzLgorY2xhc3MgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307CitURVNUX1AoTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgQWxsb3dzTXVsdGlwbGVJbnN0YW5jZXMpIHsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMSwgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgVmFsdWVzKDEsIDIpKTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMiwgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgUmFuZ2UoMywgNSkpOworCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZAorLy8gaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMuIFRoaXMgdGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZAorLy8gaGVyZSBhbmQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4KKy8vIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYXRpb25Vbml0c1Rlc3QgZml4dHVyZSBjbGFzcworLy8gaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaC4KK1RFU1RfUChJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QsIElzTXVsdGlwbGVPZjQyKSB7CisgIEVYUEVDVF9FUSgwLCBHZXRQYXJhbSgpICUgNDIpOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyLCA0MioyKSk7CisKKy8vIFRlc3RzIHRoYXQgZWFjaCBpdGVyYXRpb24gb2YgcGFyYW1ldGVyaXplZCB0ZXN0IHJ1bnMgaW4gYSBzZXBhcmF0ZSB0ZXN0CisvLyBvYmplY3QuCitjbGFzcyBTZXBhcmF0ZUluc3RhbmNlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geworIHB1YmxpYzoKKyAgU2VwYXJhdGVJbnN0YW5jZVRlc3QoKSA6IGNvdW50XygwKSB7fQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgRVhQRUNUX0dFKGdsb2JhbF9jb3VudF8sIDIpCisgICAgICAgIDw8ICJJZiBzb21lIChidXQgbm90IGFsbCkgU2VwYXJhdGVJbnN0YW5jZVRlc3QgdGVzdHMgaGF2ZSBiZWVuICIKKyAgICAgICAgPDwgImZpbHRlcmVkIG91dCB0aGlzIHRlc3Qgd2lsbCBmYWlsLiBNYWtlIHN1cmUgdGhhdCBhbGwgIgorICAgICAgICA8PCAiR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgYXJlIHNlbGVjdGVkIG9yIGRlLXNlbGVjdGVkIHRvZ2V0aGVyICIKKyAgICAgICAgPDwgImJ5IHRoZSB0ZXN0IGZpbHRlci4iOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGludCBjb3VudF87CisgIHN0YXRpYyBpbnQgZ2xvYmFsX2NvdW50XzsKK307CitpbnQgU2VwYXJhdGVJbnN0YW5jZVRlc3Q6Omdsb2JhbF9jb3VudF8gPSAwOworCitURVNUX1AoU2VwYXJhdGVJbnN0YW5jZVRlc3QsIFRlc3RzUnVuSW5TZXBhcmF0ZUluc3RhbmNlcykgeworICBFWFBFQ1RfRVEoMCwgY291bnRfKyspOworICBnbG9iYWxfY291bnRfKys7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChGb3VyRWxlbVNlcXVlbmNlLCBTZXBhcmF0ZUluc3RhbmNlVGVzdCwgUmFuZ2UoMSwgNCkpOworCisvLyBUZXN0cyB0aGF0IGFsbCBpbnN0YW50aWF0aW9ucyBvZiBhIHRlc3QgaGF2ZSBuYW1lZCBhcHByb3ByaWF0ZWx5LiBUZXN0CisvLyBkZWZpbmVkIHdpdGggVEVTVF9QKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIGFuZCBpbnN0YW50aWF0ZWQgd2l0aAorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2VOYW1lLCBUZXN0Q2FzZU5hbWUsIGdlbmVyYXRvcikgbXVzdCBiZSBuYW1lZAorLy8gU2VxdWVuY2VOYW1lL1Rlc3RDYXNlTmFtZS5UZXN0TmFtZS9pLCB3aGVyZSBpIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZQorLy8gc2VxdWVuY2UgZWxlbWVudCB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0LgorY2xhc3MgTmFtaW5nVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307CisKK1RFU1RfUChOYW1pbmdUZXN0LCBUZXN0c1JlcG9ydENvcnJlY3ROYW1lc0FuZFBhcmFtZXRlcnMpIHsKKyAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKworICBFWFBFQ1RfU1RSRVEoIlplcm9Ub0ZpdmVTZXF1ZW5jZS9OYW1pbmdUZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKworICBNZXNzYWdlIGluZGV4X3N0cmVhbTsKKyAgaW5kZXhfc3RyZWFtIDw8ICJUZXN0c1JlcG9ydENvcnJlY3ROYW1lc0FuZFBhcmFtZXRlcnMvIiA8PCBHZXRQYXJhbSgpOworICBFWFBFQ1RfU1RSRVEoaW5kZXhfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksIHRlc3RfaW5mby0+bmFtZSgpKTsKKworICBFWFBFQ1RfRVEoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLCB0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChaZXJvVG9GaXZlU2VxdWVuY2UsIE5hbWluZ1Rlc3QsIFJhbmdlKDAsIDUpKTsKKworLy8gQ2xhc3MgdGhhdCBjYW5ub3QgYmUgc3RyZWFtZWQgaW50byBhbiBvc3RyZWFtLiAgSXQgbmVlZHMgdG8gYmUgY29weWFibGUKKy8vIChhbmQsIGluIGNhc2Ugb2YgTVNWQywgYWxzbyBhc3NpZ25hYmxlKSBpbiBvcmRlciB0byBiZSBhIHRlc3QgcGFyYW1ldGVyCisvLyB0eXBlLiAgSXRzIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBkbyBleGFjdGx5CisvLyB3aGF0IHdlIG5lZWQuCitjbGFzcyBVbnN0cmVhbWFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5zdHJlYW1hYmxlKGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworY2xhc3MgQ29tbWVudFRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxVbnN0cmVhbWFibGU+IHt9OworCitURVNUX1AoQ29tbWVudFRlc3QsIFRlc3RzQ29ycmVjdGx5UmVwb3J0VW5zdHJlYW1hYmxlUGFyYW1zKSB7CisgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisKKyAgRVhQRUNUX0VRKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhHZXRQYXJhbSgpKSwgdGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbldpdGhDb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKFVuc3RyZWFtYWJsZSgxKSkpOworCisvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHRlc3QgZml4dHVyZXMsIHdoZXJlIHRoZSBiYXNlCisvLyBjbGFzcyBmaXh0dXJlIGlzIG5vdCBwYXJhbWV0ZXJpemVkIGFuZCB0aGUgZGVyaXZlZCBjbGFzcyBpcy4gSW4gdGhpcyBjYXNlCisvLyBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QgaW5oZXJpdHMgZnJvbSBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QuICBXZQorLy8gcGVyZm9ybSBzaW1wbGUgdGVzdHMgb24gYm90aC4KK2NsYXNzIE5vblBhcmFtZXRlcml6ZWRCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0KCkgOiBuXygxNykgeyB9CisgcHJvdGVjdGVkOgorICBpbnQgbl87Cit9OworCitjbGFzcyBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QgOiBwdWJsaWMgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworIHByb3RlY3RlZDoKKyAgUGFyYW1ldGVyaXplZERlcml2ZWRUZXN0KCkgOiBjb3VudF8oMCkgeyB9CisgIGludCBjb3VudF87CisgIHN0YXRpYyBpbnQgZ2xvYmFsX2NvdW50XzsKK307CisKK2ludCBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3Q6Omdsb2JhbF9jb3VudF8gPSAwOworCitURVNUX0YoTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0LCBGaXh0dXJlSXNJbml0aWFsaXplZCkgeworICBFWFBFQ1RfRVEoMTcsIG5fKTsKK30KKworVEVTVF9QKFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCwgU2Vlc1NlcXVlbmNlKSB7CisgIEVYUEVDVF9FUSgxNywgbl8pOworICBFWFBFQ1RfRVEoMCwgY291bnRfKyspOworICBFWFBFQ1RfRVEoR2V0UGFyYW0oKSwgZ2xvYmFsX2NvdW50XysrKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUmFuZ2VaZXJvVG9GaXZlLCBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QsIFJhbmdlKDAsIDUpKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCitURVNUKENvbXBpbGVUZXN0LCBDb21iaW5lSXNEZWZpbmVkT25seVdoZW5HdGVzdEhhc1BhcmFtVGVzdElzRGVmaW5lZCkgeworI2lmIEdURVNUX0hBU19DT01CSU5FICYmICFHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBGQUlMKCkgPDwgIkdURVNUX0hBU19DT01CSU5FIGlzIGRlZmluZWQgd2hpbGUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgaXMgbm90XG4iCisjZW5kaWYKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gVXNlZCBpbiBUZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlLgorICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoVGVzdEdlbmVyYXRpb25UZXN0OjpFbnZpcm9ubWVudDo6SW5zdGFuY2UoKSk7CisgIC8vIFVzZWQgaW4gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgdGVzdCBjYXNlLiBUZXN0cyB0aGF0IHRoZSB1cGRhdGVkIHZhbHVlCisgIC8vIHdpbGwgYmUgcGlja2VkIHVwIGZvciBpbnN0YW50aWF0aW5nIHRlc3RzIGluIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0LgorICBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdDo6c2V0X3BhcmFtX3ZhbHVlKDEpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gVXNlZCBpbiBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCB0ZXN0IGNhc2UuIFRlc3RzIHRoYXQgdmFsdWUgdXBkYXRlZAorICAvLyBoZXJlIHdpbGwgTk9UIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGVzdHMgaW4KKyAgLy8gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QuCisgIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpzZXRfcGFyYW1fdmFsdWUoMik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmNjU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIHByb3ZpZGVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkKKy8vIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZi4KKworI2lmbmRlZiBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXworI2RlZmluZSBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBkZWZpbml0aW9uIGFuZCBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdAorLy8gaW4gc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdHMuCitjbGFzcyBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworCisvLyBUZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgaW5zdGFudGlhdGlvbiBvZiBhIHRlc3QgaW4gbXVsdGlwbGUKKy8vIHRyYW5zbGF0aW9uIHVuaXRzLgorY2xhc3MgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4ge307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNmUyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MKQEAgLTAsMCArMSwxMjA2IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldiksIHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBpbnRlcm5hbCBjcm9zcy1wbGF0Zm9ybSBzdXBwb3J0IHV0aWxpdGllcy4KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBHVEVTVF9PU19NQUMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4gIC8vIEZvciBzdGQ6OnBhaXIgYW5kIHN0ZDo6bWFrZV9wYWlyLgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCit1c2luZyBzdGQ6Om1ha2VfcGFpcjsKK3VzaW5nIHN0ZDo6cGFpcjsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgQmFzZSB7CisgcHVibGljOgorICAvLyBDb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIGRvIGV4YWN0bHkgd2hhdCB3ZSBuZWVkLCBzbyB3ZQorICAvLyB1c2UgdGhlbS4KKyAgQmFzZSgpIDogbWVtYmVyXygwKSB7fQorICBleHBsaWNpdCBCYXNlKGludCBuKSA6IG1lbWJlcl8obikge30KKyAgdmlydHVhbCB+QmFzZSgpIHt9CisgIGludCBtZW1iZXIoKSB7IHJldHVybiBtZW1iZXJfOyB9CisKKyBwcml2YXRlOgorICBpbnQgbWVtYmVyXzsKK307CisKK2NsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZXJpdmVkKGludCBuKSA6IEJhc2Uobikge30KK307CisKK1RFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ29udmVydHNQb2ludGVycykgeworICBEZXJpdmVkIGRlcml2ZWQoMCk7CisgIEVYUEVDVF9UUlVFKCZkZXJpdmVkID09IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZSo+KCZkZXJpdmVkKSk7Cit9CisKK1RFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlSW5oZXJpdGFuY2UpIHsKKyAgRGVyaXZlZCBkZXJpdmVkKDEpOworICBCYXNlIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGRlcml2ZWQpOworICBFWFBFQ1RfRVEoZGVyaXZlZC5tZW1iZXIoKSwgYmFzZS5tZW1iZXIoKSk7Cit9CisKK2NsYXNzIENhc3RhYmxlIHsKKyBwdWJsaWM6CisgIENhc3RhYmxlKGJvb2wqIGNvbnZlcnRlZCkgOiBjb252ZXJ0ZWRfKGNvbnZlcnRlZCkge30KKyAgb3BlcmF0b3IgQmFzZSgpIHsKKyAgICAqY29udmVydGVkXyA9IHRydWU7CisgICAgcmV0dXJuIEJhc2UoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCogY29udmVydGVkXzsKK307CisKK1RFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlTm9uQ29uc3RDYXN0T3BlcmF0b3IpIHsKKyAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgQ2FzdGFibGUgY2FzdGFibGUoJmNvbnZlcnRlZCk7CisgIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY2FzdGFibGUpOworICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOworfQorCitjbGFzcyBDb25zdENhc3RhYmxlIHsKKyBwdWJsaWM6CisgIENvbnN0Q2FzdGFibGUoYm9vbCogY29udmVydGVkKSA6IGNvbnZlcnRlZF8oY29udmVydGVkKSB7fQorICBvcGVyYXRvciBCYXNlKCkgY29uc3QgeworICAgICpjb252ZXJ0ZWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gQmFzZSgpOworICB9CisKKyBwcml2YXRlOgorICBib29sKiBjb252ZXJ0ZWRfOworfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VDb25zdENhc3RPcGVyYXRvck9uQ29uc3RWYWx1ZXMpIHsKKyAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgY29uc3QgQ29uc3RDYXN0YWJsZSBjb25zdF9jYXN0YWJsZSgmY29udmVydGVkKTsKKyAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjb25zdF9jYXN0YWJsZSk7CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7Cit9CisKK2NsYXNzIENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZSB7CisgcHVibGljOgorICBDb25zdEFuZE5vbkNvbnN0Q2FzdGFibGUoYm9vbCogY29udmVydGVkLCBib29sKiBjb25zdF9jb252ZXJ0ZWQpCisgICAgICA6IGNvbnZlcnRlZF8oY29udmVydGVkKSwgY29uc3RfY29udmVydGVkXyhjb25zdF9jb252ZXJ0ZWQpIHt9CisgIG9wZXJhdG9yIEJhc2UoKSB7CisgICAgKmNvbnZlcnRlZF8gPSB0cnVlOworICAgIHJldHVybiBCYXNlKCk7CisgIH0KKyAgb3BlcmF0b3IgQmFzZSgpIGNvbnN0IHsKKyAgICAqY29uc3RfY29udmVydGVkXyA9IHRydWU7CisgICAgcmV0dXJuIEJhc2UoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCogY29udmVydGVkXzsKKyAgYm9vbCogY29uc3RfY29udmVydGVkXzsKK307CisKK1RFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuU2VsZWN0QmV0d2VlbkNvbnN0QW5kTm9uQ29uc3RDYXNyQXBwcm9wcmlhdGVseSkgeworICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICBib29sIGNvbnN0X2NvbnZlcnRlZCA9IGZhbHNlOworICBDb25zdEFuZE5vbkNvbnN0Q2FzdGFibGUgY2FzdGFibGUoJmNvbnZlcnRlZCwgJmNvbnN0X2NvbnZlcnRlZCk7CisgIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY2FzdGFibGUpOworICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOworICBFWFBFQ1RfRkFMU0UoY29uc3RfY29udmVydGVkKTsKKworICBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgY29uc3RfY29udmVydGVkID0gZmFsc2U7CisgIGNvbnN0IENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZSBjb25zdF9jYXN0YWJsZSgmY29udmVydGVkLCAmY29uc3RfY29udmVydGVkKTsKKyAgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY29uc3RfY2FzdGFibGUpOworICBFWFBFQ1RfRkFMU0UoY29udmVydGVkKTsKKyAgRVhQRUNUX1RSVUUoY29uc3RfY29udmVydGVkKTsKK30KKworY2xhc3MgVG8geworIHB1YmxpYzoKKyAgVG8oYm9vbCogY29udmVydGVkKSB7ICpjb252ZXJ0ZWQgPSB0cnVlOyB9ICAvLyBOT0xJTlQKK307CisKK1RFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlSW1wbGljaXRDb25zdHJ1Y3RvcikgeworICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICBUbyB0byA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88VG8+KCZjb252ZXJ0ZWQpOworICAodm9pZCl0bzsKKyAgRVhQRUNUX1RSVUUoY29udmVydGVkKTsKK30KKworVEVTVChJdGVyYXRvclRyYWl0c1Rlc3QsIFdvcmtzRm9yU1RMQ29udGFpbmVySXRlcmF0b3JzKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsCisgICAgICBJdGVyYXRvclRyYWl0czwgOjpzdGQ6OnZlY3RvcjxpbnQ+Ojpjb25zdF9pdGVyYXRvcj46OnZhbHVlX3R5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLAorICAgICAgSXRlcmF0b3JUcmFpdHM8IDo6c3RkOjpsaXN0PGJvb2w+OjppdGVyYXRvcj46OnZhbHVlX3R5cGU+KCk7Cit9CisKK1RFU1QoSXRlcmF0b3JUcmFpdHNUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb05vbkNvbnN0KSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjaGFyLCBJdGVyYXRvclRyYWl0czxjaGFyKj46OnZhbHVlX3R5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCB2b2lkKiwgSXRlcmF0b3JUcmFpdHM8Y29uc3Qgdm9pZCoqPjo6dmFsdWVfdHlwZT4oKTsKK30KKworVEVTVChJdGVyYXRvclRyYWl0c1Rlc3QsIFdvcmtzRm9yUG9pbnRlclRvQ29uc3QpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIEl0ZXJhdG9yVHJhaXRzPGNvbnN0IGNoYXIqPjo6dmFsdWVfdHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IHZvaWQqLAorICAgICAgSXRlcmF0b3JUcmFpdHM8Y29uc3Qgdm9pZCogY29uc3QqPjo6dmFsdWVfdHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgZWxlbWVudF90eXBlIHR5cGVkZWYgaXMgYXZhaWxhYmxlIGluIHNjb3BlZF9wdHIgYW5kIHJlZmVycworLy8gdG8gdGhlIHBhcmFtZXRlciB0eXBlLgorVEVTVChTY29wZWRQdHJUZXN0LCBEZWZpbmVzRWxlbWVudFR5cGUpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjxpbnQ+OjplbGVtZW50X3R5cGU+KCk7Cit9CisKKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEltcGxlbWVudCBUSEUgUkVTVCBvZiBzY29wZWRfcHRyIHRlc3RzLgorCitURVNUKEd0ZXN0Q2hlY2tTeW50YXhUZXN0LCBCZWhhdmVzTGlrZUFTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgR1RFU1RfQ0hFQ0tfKGZhbHNlKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCdzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5LiI7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBHVEVTVF9DSEVDS18odHJ1ZSk7CisgIGVsc2UKKyAgICA7ICAvLyBOT0xJTlQKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7ICAvLyBOT0xJTlQKKyAgZWxzZQorICAgIEdURVNUX0NIRUNLXyh0cnVlKSA8PCAiIjsKK30KKworVEVTVChHdGVzdENoZWNrU3ludGF4VGVzdCwgV29ya3NXaXRoU3dpdGNoKSB7CisgIHN3aXRjaCAoMCkgeworICAgIGNhc2UgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9DSEVDS18odHJ1ZSk7CisgIH0KKworICBzd2l0Y2goMCkKKyAgICBjYXNlIDA6CisgICAgICBHVEVTVF9DSEVDS18odHJ1ZSkgPDwgIkNoZWNrIGZhaWxlZCBpbiBzd2l0Y2ggY2FzZSI7Cit9CisKKy8vIFZlcmlmaWVzIGJlaGF2aW9yIG9mIEZvcm1hdEZpbGVMb2NhdGlvbi4KK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c0ZpbGVMb2NhdGlvbikgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiZm9vLmNjIiwgRm9ybWF0RmlsZUxvY2F0aW9uKCJmb28uY2MiLCA0MikpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiNDIiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7Cit9CisKK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vua25vd25GaWxlKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoCisgICAgICBJc1N1YnN0cmluZywgInVua25vd24gZmlsZSIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCA0MikpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiNDIiLCBGb3JtYXRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKK30KKworVEVTVChGb3JtYXRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duTGluZSkgeworICBFWFBFQ1RfRVEoImZvby5jYzoiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIC0xKSk7Cit9CisKK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkZpbGVBbmRMaW5lKSB7CisgIEVYUEVDVF9FUSgidW5rbm93biBmaWxlOiIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCAtMSkpOworfQorCisvLyBWZXJpZmllcyBiZWhhdmlvciBvZiBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uLgorVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c0ZpbGVMb2NhdGlvbikgeworICBFWFBFQ1RfRVEoImZvby5jYzo0MiIsIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7Cit9CisKK1RFU1QoRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25GaWxlKSB7CisgIEVYUEVDVF9FUSgidW5rbm93biBmaWxlOjQyIiwKKyAgICAgICAgICAgIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKK30KKworVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkxpbmUpIHsKKyAgRVhQRUNUX0VRKCJmb28uY2MiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCJmb28uY2MiLCAtMSkpOworfQorCitURVNUKEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duRmlsZUFuZExpbmUpIHsKKyAgRVhQRUNUX0VRKCJ1bmtub3duIGZpbGUiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKE5VTEwsIC0xKSk7Cit9CisKKyNpZiBHVEVTVF9PU19NQUMKK3ZvaWQqIFRocmVhZEZ1bmModm9pZCogZGF0YSkgeworICBwdGhyZWFkX211dGV4X3QqIG11dGV4ID0gc3RhdGljX2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4oZGF0YSk7CisgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK1RFU1QoR2V0VGhyZWFkQ291bnRUZXN0LCBSZXR1cm5zQ29ycmVjdFZhbHVlKSB7CisgIEVYUEVDVF9FUSgxVSwgR2V0VGhyZWFkQ291bnQoKSk7CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKKyAgcHRocmVhZF9hdHRyX3QgIGF0dHI7CisgIHB0aHJlYWRfdCAgICAgICB0aHJlYWRfaWQ7CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogdHVybiBtdXRleCBpbnRvIGludGVybmFsOjpNdXRleCBmb3IgYXV0b21hdGljCisgIC8vIGRlc3RydWN0aW9uLgorICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LCBOVUxMKTsKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CisgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cikpOworICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSkpOworCisgIGNvbnN0IGludCBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkX2lkLCAmYXR0ciwgJlRocmVhZEZ1bmMsICZtdXRleCk7CisgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cikpOworICBBU1NFUlRfRVEoMCwgc3RhdHVzKTsKKyAgRVhQRUNUX0VRKDJVLCBHZXRUaHJlYWRDb3VudCgpKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKKworICB2b2lkKiBkdW1teTsKKyAgQVNTRVJUX0VRKDAsIHB0aHJlYWRfam9pbih0aHJlYWRfaWQsICZkdW1teSkpOworCisgIC8vIE1hY09TIFggbWF5IG5vdCBpbW1lZGlhdGVseSByZXBvcnQgdGhlIHVwZGF0ZWQgdGhyZWFkIGNvdW50IGFmdGVyCisgIC8vIGpvaW5pbmcgYSB0aHJlYWQsIGNhdXNpbmcgZmxha2luZXNzIGluIHRoaXMgdGVzdC4gVG8gY291bnRlciB0aGF0LCB3ZQorICAvLyB3YWl0IGZvciB1cCB0byAuNSBzZWNvbmRzIGZvciB0aGUgT1MgdG8gcmVwb3J0IHRoZSBjb3JyZWN0IHZhbHVlLgorICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIGlmIChHZXRUaHJlYWRDb3VudCgpID09IDEpCisgICAgICBicmVhazsKKworICAgIFNsZWVwTWlsbGlzZWNvbmRzKDEwMCk7CisgIH0KKyAgRVhQRUNUX0VRKDFVLCBHZXRUaHJlYWRDb3VudCgpKTsKKyAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleCk7Cit9CisjZWxzZQorVEVTVChHZXRUaHJlYWRDb3VudFRlc3QsIFJldHVybnNaZXJvV2hlblVuYWJsZVRvQ291bnRUaHJlYWRzKSB7CisgIEVYUEVDVF9FUSgwVSwgR2V0VGhyZWFkQ291bnQoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX01BQworCitURVNUKEd0ZXN0Q2hlY2tEZWF0aFRlc3QsIERpZXNXaXRoQ29ycmVjdE91dHB1dE9uRmFpbHVyZSkgeworICBjb25zdCBib29sIGFfZmFsc2VfY29uZGl0aW9uID0gZmFsc2U7CisgIGNvbnN0IGNoYXIgcmVnZXhbXSA9CisjaWZkZWYgX01TQ19WRVIKKyAgICAgImd0ZXN0LXBvcnRfdGVzdFxcLmNjXFwoXFxkK1xcKToiCisjZWxpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisgICAgICJndGVzdC1wb3J0X3Rlc3RcXC5jYzpbMC05XSsiCisjZWxzZQorICAgICAiZ3Rlc3QtcG9ydF90ZXN0XFwuY2M6XFxkKyIKKyNlbmRpZiAgLy8gX01TQ19WRVIKKyAgICAgIi4qYV9mYWxzZV9jb25kaXRpb24uKkV4dHJhIGluZm8uKiI7CisKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChHVEVTVF9DSEVDS18oYV9mYWxzZV9jb25kaXRpb24pIDw8ICJFeHRyYSBpbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleCk7Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCitURVNUKEd0ZXN0Q2hlY2tEZWF0aFRlc3QsIExpdmVzU2lsZW50bHlPblN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VYSVQoeworICAgICAgR1RFU1RfQ0hFQ0tfKHRydWUpIDw8ICJFeHRyYSBpbmZvIjsKKyAgICAgIDo6c3RkOjpjZXJyIDw8ICJTdWNjZXNzXG4iOworICAgICAgZXhpdCgwKTsgfSwKKyAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICJTdWNjZXNzIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCBjaG9vc2UgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBhcHByb3ByaWF0ZSB0bworLy8gdGhlIHBsYXRmb3JtLiBUaGUgdGVzdCB3aWxsIHByb2R1Y2UgY29tcGlsZXIgZXJyb3JzIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vIEZvciBzaW1wbGljaXR5LCB3ZSBvbmx5IGNvdmVyIHRoZSBtb3N0IGltcG9ydGFudCBwbGF0Zm9ybXMgaGVyZS4KK1RFU1QoUmVnZXhFbmdpbmVTZWxlY3Rpb25UZXN0LCBTZWxlY3RzQ29ycmVjdFJlZ2V4RW5naW5lKSB7CisjaWYgR1RFU1RfSEFTX1BPU0lYX1JFCisKKyAgRVhQRUNUX1RSVUUoR1RFU1RfVVNFU19QT1NJWF9SRSk7CisKKyNlbHNlCisKKyAgRVhQRUNUX1RSVUUoR1RFU1RfVVNFU19TSU1QTEVfUkUpOworCisjZW5kaWYKK30KKworI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUKKworIyBpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyPgorY2xhc3MgUkVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7fTsKKworLy8gRGVmaW5lcyBTdHJpbmdUeXBlcyBhcyB0aGUgbGlzdCBvZiBhbGwgc3RyaW5nIHR5cGVzIHRoYXQgY2xhc3MgUkUKKy8vIHN1cHBvcnRzLgordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczwKKyAgICA6OnN0ZDo6c3RyaW5nLAorIyAgaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKyAgICA6OnN0cmluZywKKyMgIGVuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICAgIGNvbnN0IGNoYXIqPiBTdHJpbmdUeXBlczsKKworVFlQRURfVEVTVF9DQVNFKFJFVGVzdCwgU3RyaW5nVHlwZXMpOworCisvLyBUZXN0cyBSRSdzIGltcGxpY2l0IGNvbnN0cnVjdG9ycy4KK1RZUEVEX1RFU1QoUkVUZXN0LCBJbXBsaWNpdENvbnN0cnVjdG9yV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoVHlwZVBhcmFtKCIiKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgZW1wdHkucGF0dGVybigpKTsKKworICBjb25zdCBSRSBzaW1wbGUoVHlwZVBhcmFtKCJoZWxsbyIpKTsKKyAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIHNpbXBsZS5wYXR0ZXJuKCkpOworCisgIGNvbnN0IFJFIG5vcm1hbChUeXBlUGFyYW0oIi4qKFxcdyspIikpOworICBFWFBFQ1RfU1RSRVEoIi4qKFxcdyspIiwgbm9ybWFsLnBhdHRlcm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUkUncyBjb25zdHJ1Y3RvcnMgcmVqZWN0IGludmFsaWQgcmVndWxhciBleHByZXNzaW9ucy4KK1RZUEVEX1RFU1QoUkVUZXN0LCBSZWplY3RzSW52YWxpZFJlZ2V4KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBjb25zdCBSRSBpbnZhbGlkKFR5cGVQYXJhbSgiPyIpKTsKKyAgfSwgIlwiP1wiIGlzIG5vdCBhIHZhbGlkIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iKTsKK30KKworLy8gVGVzdHMgUkU6OkZ1bGxNYXRjaCgpLgorVFlQRURfVEVTVChSRVRlc3QsIEZ1bGxNYXRjaFdvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KFR5cGVQYXJhbSgiIikpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiIiksIGVtcHR5KSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYSIpLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlKFR5cGVQYXJhbSgiYS4qeiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImF6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJheHl6IiksIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYmF6IiksIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYXp5IiksIHJlKSk7Cit9CisKKy8vIFRlc3RzIFJFOjpQYXJ0aWFsTWF0Y2goKS4KK1RZUEVEX1RFU1QoUkVUZXN0LCBQYXJ0aWFsTWF0Y2hXb3JrcykgeworICBjb25zdCBSRSBlbXB0eShUeXBlUGFyYW0oIiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oIiIpLCBlbXB0eSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYSIpLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlKFR5cGVQYXJhbSgiYS4qeiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImF6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJheHl6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJiYXoiKSwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImF6eSIpLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oInp6YSIpLCByZSkpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisjZWxpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCitURVNUKElzSW5TZXRUZXN0LCBOdWxDaGFySXNOb3RJbkFueVNldCkgeworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnXDAnLCAiIikpOworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnXDAnLCAiXDAiKSk7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdcMCcsICJhIikpOworfQorCitURVNUKElzSW5TZXRUZXN0LCBXb3Jrc0Zvck5vbk51bENoYXJzKSB7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdhJywgIkFiIikpOworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnYycsICIiKSk7CisKKyAgRVhQRUNUX1RSVUUoSXNJblNldCgnYicsICJiY2QiKSk7CisgIEVYUEVDVF9UUlVFKElzSW5TZXQoJ2InLCAiYWIiKSk7Cit9CisKK1RFU1QoSXNBc2NpaURpZ2l0VGVzdCwgSXNGYWxzZUZvck5vbkRpZ2l0KSB7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCcrJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCctJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCcuJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCdhJykpOworfQorCitURVNUKElzQXNjaWlEaWdpdFRlc3QsIElzVHJ1ZUZvckRpZ2l0KSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnMCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaURpZ2l0KCcxJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzUnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnOScpKTsKK30KKworVEVTVChJc0FzY2lpUHVuY3RUZXN0LCBJc0ZhbHNlRm9yTm9uUHVuY3QpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJyAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJ1xuJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCdhJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCcwJykpOworfQorCitURVNUKElzQXNjaWlQdW5jdFRlc3QsIElzVHJ1ZUZvclB1bmN0KSB7CisgIGZvciAoY29uc3QgY2hhciogcCA9ICJeLSFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxdX2B7fH1+IjsgKnA7IHArKykgeworICAgIEVYUEVDVF9QUkVEMShJc0FzY2lpUHVuY3QsICpwKTsKKyAgfQorfQorCitURVNUKElzUmVwZWF0VGVzdCwgSXNGYWxzZUZvck5vblJlcGVhdENoYXIpIHsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnMScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCctJykpOworfQorCitURVNUKElzUmVwZWF0VGVzdCwgSXNUcnVlRm9yUmVwZWF0Q2hhcikgeworICBFWFBFQ1RfVFJVRShJc1JlcGVhdCgnPycpKTsKKyAgRVhQRUNUX1RSVUUoSXNSZXBlYXQoJyonKSk7CisgIEVYUEVDVF9UUlVFKElzUmVwZWF0KCcrJykpOworfQorCitURVNUKElzQXNjaWlXaGl0ZVNwYWNlVGVzdCwgSXNGYWxzZUZvck5vbldoaXRlU3BhY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCdhJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJzEnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnKycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCdfJykpOworfQorCitURVNUKElzQXNjaWlXaGl0ZVNwYWNlVGVzdCwgSXNUcnVlRm9yV2hpdGVTcGFjZSkgeworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnICcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1xuJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXHInKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcdCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1x2JykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXGYnKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNGYWxzZUZvck5vbldvcmRDaGFyKSB7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV29yZENoYXIoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCcrJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCcuJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCdcbicpKTsKK30KKworVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc1RydWVGb3JMZXR0ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdhJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ2InKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignQScpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdaJykpOworfQorCitURVNUKElzQXNjaWlXb3JkQ2hhclRlc3QsIElzVHJ1ZUZvckRpZ2l0KSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignMCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCcxJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzcnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignOScpKTsKK30KKworVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc1RydWVGb3JVbmRlcnNjb3JlKSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignXycpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvck5vblByaW50YWJsZSkgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdcMDA3JykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yRGlnaXQpIHsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJzAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCc5JykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yV2hpdGVTcGFjZSkgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1xuJykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yU29tZUxldHRlcikgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1onKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzVHJ1ZUZvclB1bmN0KSB7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJy4nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJy0nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ14nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJyQnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJygnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ10nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3snKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3wnKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzVHJ1ZUZvclNvbWVMZXR0ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnZCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnRCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgncycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnUycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgndycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnVycpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkUHVuY3QpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXFwnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1xcJywgJyAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ18nLCAnLicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnLicsICdhJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXFwnLCAnXFwnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXycsICdfJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJysnLCAnKycpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICcuJywgJy4nKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9kKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICcuJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICcwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnOScpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX0QpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICcwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJzknKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJy0nKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9zKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICcuJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJzknKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJyAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICdcbicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ1x0JykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfUykgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJyAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnXHInKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJzknKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF93KSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnKycpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICcgJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ1xuJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICcwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnYicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ0MnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdfJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfVykgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ0EnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnYicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICc5JykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ18nKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnKicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ1xuJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRXaGl0ZVNwYWNlKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2YnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2YnLCAnXG4nKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ24nLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ24nLCAnXHInKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3InLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3InLCAnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndCcsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndCcsICd0JykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd2JywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd2JywgJ1xmJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZicsICdcZicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICduJywgJ1xuJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3InLCAnXHInKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndCcsICdcdCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd2JywgJ1x2JykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIFVuZXNjYXBlZERvdCkgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICdcbicpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJy4nKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICcgJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIFVuZXNjYXBlZENoYXIpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJ2EnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICdhJywgJ2InKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICckJywgJ2EnKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnJCcsICckJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICc1JywgJzUnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJ1onLCAnWicpKTsKK30KKworVEVTVChWYWxpZGF0ZVJlZ2V4VGVzdCwgR2VuZXJhdGVzRmFpbHVyZUFuZFJldHVybnNGYWxzZUZvckludmFsaWQpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoTlVMTCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImFcXCIpKSwKKyAgICAgICJTeW50YXggZXJyb3IgYXQgaW5kZXggMSBpbiBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIFwiYVxcXCI6ICIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYVxcIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIlxcblxcIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIlxcc1xcaGIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcaFwiIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJeXiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiLipeYiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiJCQiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIl4kYSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIickJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYShiIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJygnIGlzIHVuc3VwcG9ydGVkIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhYikiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInKScgaXMgdW5zdXBwb3J0ZWQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIlthYiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidbJyBpcyB1bnN1cHBvcnRlZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYXsyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3snIGlzIHVuc3VwcG9ydGVkIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCI/IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJz8nIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIl4qIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJyonIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIjUqKyIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicrJyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7Cit9CisKK1RFU1QoVmFsaWRhdGVSZWdleFRlc3QsIFJldHVybnNUcnVlRm9yVmFsaWQpIHsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJhIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCIuKiIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiXmFfKyIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiXmFcXHRcXCY/IikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCIwOSokIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJeWiQiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoImFcXF5aXFwkXFwoXFwpXFx8XFxbXFxdXFx7XFx9IikpOworfQorCitURVNUKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NGb3JaZXJvT3JPbmUpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImEiLCAiYmEiKSk7CisgIC8vIFJlcGVhdGluZyBtb3JlIHRoYW4gb25jZS4KKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImIiLCAiYWFiIikpOworCisgIC8vIFJlcGVhdGluZyB6ZXJvIHRpbWVzLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJiIiwgImJhIikpOworICAvLyBSZXBlYXRpbmcgb25jZS4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICdhJywgJz8nLCAiYiIsICJhYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcjJywgJz8nLCAiLiIsICIjIyIpKTsKK30KKworVEVTVChNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZFRlc3QsIFdvcmtzRm9yWmVyb09yTWFueSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJyonLCAiYSQiLCAiYmFhYiIpKTsKKworICAvLyBSZXBlYXRpbmcgemVybyB0aW1lcy4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJyonLCAiYiIsICJiYyIpKTsKKyAgLy8gUmVwZWF0aW5nIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcqJywgImIiLCAiYWJjIikpOworICAvLyBSZXBlYXRpbmcgbW9yZSB0aGFuIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKHRydWUsICd3JywgJyonLCAiLSIsICJhYl8xLWciKSk7Cit9CisKK1RFU1QoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc0Zvck9uZU9yTWFueSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJysnLCAiYSQiLCAiYmFhYiIpKTsKKyAgLy8gUmVwZWF0aW5nIHplcm8gdGltZXMuCisgIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKycsICJiIiwgImJjIikpOworCisgIC8vIFJlcGVhdGluZyBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKycsICJiIiwgImFiYyIpKTsKKyAgLy8gUmVwZWF0aW5nIG1vcmUgdGhhbiBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCh0cnVlLCAndycsICcrJywgIi0iLCAiYWJfMS1nIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBSZXR1cm5zVHJ1ZUZvckVtcHR5UmVnZXgpIHsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiIiwgIiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiIiwgImFiIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc1doZW5Eb2xsYXJJc0luUmVnZXgpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIiQiLCAiYSIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCIkIiwgIiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiYSQiLCAiYSIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoRXNjYXBlU2VxdWVuY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIlxcdyIsICIrIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFxXIiwgImFiIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcc2EiLCAiXG5hYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxkIiwgIjFhIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc1doZW5SZWdleFN0YXJ0c1dpdGhSZXBldGl0aW9uKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCIuK2EiLCAiYWJjIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiYT9iIiwgImFhYiIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCIuKmEiLCAiYmMxMi1hYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiYT9iIiwgImIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImE/YiIsICJhYiIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwKKyAgICAgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoUmVwZXRpb25PZkVzY2FwZVNlcXVlbmNlKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXC4rYSIsICJhYmMiKSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXHM/YiIsICIgIGIiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFwoKmEiLCAiKCgoKGFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXF4/YiIsICJeYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxcXD9iIiwgImIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcXFw/YiIsICJcXGIiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIE1hdGNoZXNTZXF1ZW50aWFsbHkpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoImFiLipjIiwgImFjYWJjIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImFiLipjIiwgImFiLWZzYyIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuU3RyaW5nSXNOdWxsKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoIiIsIE5VTEwpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBXb3Jrc1doZW5SZWdleFN0YXJ0c1dpdGhDYXJldCkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCJeYSIsICJiYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXiQiLCAiYSIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIl5hIiwgImFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIl4iLCAiYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXiQiLCAiIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5Ob01hdGNoKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoImEiLCAiYmNkZTEyMyIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiYS4rYSIsICItLWFhODg4ODg4ODgiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuTWF0Y2hpbmdQcmVmaXgpIHsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJcXHcrIiwgImFiMV8gLSA1IikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIi4qPSIsICI9IikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoInguKmFiPy4qYmMiLCAieGFhYWJjIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNUcnVlV2hlbk1hdGNoaW5nTm9uUHJlZml4KSB7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXFx3KyIsICIkJCQgYWIxXyAtIDUiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXFwuKz0iLCAiPSAgLi4uPSIpKTsKK30KKworLy8gVGVzdHMgUkUncyBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMuCitURVNUKFJFVGVzdCwgSW1wbGljaXRDb25zdHJ1Y3RvcldvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KCIiKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBlbXB0eS5wYXR0ZXJuKCkpOworCisgIGNvbnN0IFJFIHNpbXBsZSgiaGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIHNpbXBsZS5wYXR0ZXJuKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFJFJ3MgY29uc3RydWN0b3JzIHJlamVjdCBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCitURVNUKFJFVGVzdCwgUmVqZWN0c0ludmFsaWRSZWdleCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgY29uc3QgUkUgbm9ybWFsKE5VTEwpOworICB9LCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIik7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGNvbnN0IFJFIG5vcm1hbCgiLiooXFx3KyIpOworICB9LCAiJygnIGlzIHVuc3VwcG9ydGVkIik7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGNvbnN0IFJFIGludmFsaWQoIl4/Iik7CisgIH0sICInPycgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbiIpOworfQorCisvLyBUZXN0cyBSRTo6RnVsbE1hdGNoKCkuCitURVNUKFJFVGVzdCwgRnVsbE1hdGNoV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoIiIpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCIiLCBlbXB0eSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaCgiYSIsIGVtcHR5KSk7CisKKyAgY29uc3QgUkUgcmUxKCJhIik7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goImEiLCByZTEpKTsKKworICBjb25zdCBSRSByZSgiYS4qeiIpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCJheiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goImF4eXoiLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaCgiYmF6IiwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goImF6eSIsIHJlKSk7Cit9CisKKy8vIFRlc3RzIFJFOjpQYXJ0aWFsTWF0Y2goKS4KK1RFU1QoUkVUZXN0LCBQYXJ0aWFsTWF0Y2hXb3JrcykgeworICBjb25zdCBSRSBlbXB0eSgiIik7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goIiIsIGVtcHR5KSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImEiLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlKCJhLip6Iik7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImF6IiwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiYXh5eiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImJheiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImF6eSIsIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6UGFydGlhbE1hdGNoKCJ6emEiLCByZSkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfUE9TSVhfUkUKKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitURVNUKENhcHR1cmVUZXN0LCBDYXB0dXJlc1N0ZG91dCkgeworICBDYXB0dXJlU3Rkb3V0KCk7CisgIGZwcmludGYoc3Rkb3V0LCAiYWJjIik7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgR2V0Q2FwdHVyZWRTdGRvdXQoKS5jX3N0cigpKTsKKworICBDYXB0dXJlU3Rkb3V0KCk7CisgIGZwcmludGYoc3Rkb3V0LCAiZGVmJWNnaGkiLCAnXDAnKTsKKyAgRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImRlZlwwZ2hpIiwgNyksIDo6c3RkOjpzdHJpbmcoR2V0Q2FwdHVyZWRTdGRvdXQoKSkpOworfQorCitURVNUKENhcHR1cmVUZXN0LCBDYXB0dXJlc1N0ZGVycikgeworICBDYXB0dXJlU3RkZXJyKCk7CisgIGZwcmludGYoc3RkZXJyLCAiamtsIik7CisgIEVYUEVDVF9TVFJFUSgiamtsIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKS5jX3N0cigpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIGZwcmludGYoc3RkZXJyLCAiamtsJWNtbm8iLCAnXDAnKTsKKyAgRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImprbFwwbW5vIiwgNyksIDo6c3RkOjpzdHJpbmcoR2V0Q2FwdHVyZWRTdGRlcnIoKSkpOworfQorCisvLyBUZXN0cyB0aGF0IHN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmUgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci4KK1RFU1QoQ2FwdHVyZVRlc3QsIENhcHR1cmVzU3Rkb3V0QW5kU3RkZXJyKSB7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBmcHJpbnRmKHN0ZG91dCwgInBxciIpOworICBmcHJpbnRmKHN0ZGVyciwgInN0dSIpOworICBFWFBFQ1RfU1RSRVEoInBxciIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgic3R1IiwgR2V0Q2FwdHVyZWRTdGRlcnIoKS5jX3N0cigpKTsKK30KKworVEVTVChDYXB0dXJlRGVhdGhUZXN0LCBDYW5ub3RSZWVudGVyU3Rkb3V0Q2FwdHVyZSkgeworICBDYXB0dXJlU3Rkb3V0KCk7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoQ2FwdHVyZVN0ZG91dCgpOywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25seSBvbmUgc3Rkb3V0IGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUiKTsKKyAgR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKworICAvLyBXZSBjYW5ub3QgdGVzdCBzdGRlcnIgY2FwdHVyaW5nIHVzaW5nIGRlYXRoIHRlc3RzIGFzIHRoZXkgdXNlIGl0CisgIC8vIHRoZW1zZWx2ZXMuCit9CisKKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JJbml0aWFsaXplc1RvRGVmYXVsdFZhbHVlcykgeworICBUaHJlYWRMb2NhbDxpbnQ+IHQxOworICBFWFBFQ1RfRVEoMCwgdDEuZ2V0KCkpOworCisgIFRocmVhZExvY2FsPHZvaWQqPiB0MjsKKyAgRVhQRUNUX1RSVUUodDIuZ2V0KCkgPT0gTlVMTCk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBTaW5nbGVQYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXNUb1BhcmFtKSB7CisgIFRocmVhZExvY2FsPGludD4gdDEoMTIzKTsKKyAgRVhQRUNUX0VRKDEyMywgdDEuZ2V0KCkpOworCisgIGludCBpID0gMDsKKyAgVGhyZWFkTG9jYWw8aW50Kj4gdDIoJmkpOworICBFWFBFQ1RfRVEoJmksIHQyLmdldCgpKTsKK30KKworY2xhc3MgTm9EZWZhdWx0Q29udHJ1Y3RvciB7CisgcHVibGljOgorICBleHBsaWNpdCBOb0RlZmF1bHRDb250cnVjdG9yKGNvbnN0IGNoYXIqKSB7fQorICBOb0RlZmF1bHRDb250cnVjdG9yKGNvbnN0IE5vRGVmYXVsdENvbnRydWN0b3ImKSB7fQorfTsKKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFZhbHVlRGVmYXVsdENvbnRydWN0b3JJc05vdFJlcXVpcmVkRm9yUGFyYW1WZXJzaW9uKSB7CisgIFRocmVhZExvY2FsPE5vRGVmYXVsdENvbnRydWN0b3I+IGJhcihOb0RlZmF1bHRDb250cnVjdG9yKCJmb28iKSk7CisgIGJhci5wb2ludGVyKCk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBHZXRBbmRQb2ludGVyUmV0dXJuU2FtZVZhbHVlKSB7CisgIFRocmVhZExvY2FsPFN0cmluZz4gdGhyZWFkX2xvY2FsOworCisgIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWwucG9pbnRlcigpLCAmKHRocmVhZF9sb2NhbC5nZXQoKSkpOworCisgIC8vIFZlcmlmaWVzIHRoZSBjb25kaXRpb24gc3RpbGwgaG9sZHMgYWZ0ZXIgY2FsbGluZyBzZXQuCisgIHRocmVhZF9sb2NhbC5zZXQoImZvbyIpOworICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsLnBvaW50ZXIoKSwgJih0aHJlYWRfbG9jYWwuZ2V0KCkpKTsKK30KKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFBvaW50ZXJBbmRDb25zdFBvaW50ZXJSZXR1cm5TYW1lVmFsdWUpIHsKKyAgVGhyZWFkTG9jYWw8U3RyaW5nPiB0aHJlYWRfbG9jYWw7CisgIGNvbnN0IFRocmVhZExvY2FsPFN0cmluZz4mIGNvbnN0X3RocmVhZF9sb2NhbCA9IHRocmVhZF9sb2NhbDsKKworICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsLnBvaW50ZXIoKSwgY29uc3RfdGhyZWFkX2xvY2FsLnBvaW50ZXIoKSk7CisKKyAgdGhyZWFkX2xvY2FsLnNldCgiZm9vIik7CisgIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWwucG9pbnRlcigpLCBjb25zdF90aHJlYWRfbG9jYWwucG9pbnRlcigpKTsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKwordm9pZCBBZGRUd28oaW50KiBwYXJhbSkgeyAqcGFyYW0gKz0gMjsgfQorCitURVNUKFRocmVhZFdpdGhQYXJhbVRlc3QsIENvbnN0cnVjdG9yRXhlY3V0ZXNUaHJlYWRGdW5jKSB7CisgIGludCBpID0gNDA7CisgIFRocmVhZFdpdGhQYXJhbTxpbnQqPiB0aHJlYWQoJkFkZFR3bywgJmksIE5VTEwpOworICB0aHJlYWQuSm9pbigpOworICBFWFBFQ1RfRVEoNDIsIGkpOworfQorCitURVNUKE11dGV4RGVhdGhUZXN0LCBBc3NlcnRIZWxkU2hvdWxkQXNzZXJ0V2hlbk5vdExvY2tlZCkgeworICAvLyBBc3NlcnRIZWxkKCkgaXMgZmxha3kgb25seSBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgdGhyZWFkcyBhY2Nlc3NpbmcKKyAgLy8gdGhlIGxvY2suIEluIHRoaXMgY2FzZSwgdGhlIHRlc3QgaXMgcm9idXN0LgorICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICBNdXRleCBtOworICAgIHsgTXV0ZXhMb2NrIGxvY2soJm0pOyB9CisgICAgbS5Bc3NlcnRIZWxkKCk7CisgIH0sCisgICJ0aHJlYWQgLipob2xkIik7Cit9CisKK1RFU1QoTXV0ZXhUZXN0LCBBc3NlcnRIZWxkU2hvdWxkTm90QXNzZXJ0V2hlbkxvY2tlZCkgeworICBNdXRleCBtOworICBNdXRleExvY2sgbG9jaygmbSk7CisgIG0uQXNzZXJ0SGVsZCgpOworfQorCitjbGFzcyBBdG9taWNDb3VudGVyV2l0aE11dGV4IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEF0b21pY0NvdW50ZXJXaXRoTXV0ZXgoTXV0ZXgqIG11dGV4KSA6CisgICAgdmFsdWVfKDApLCBtdXRleF8obXV0ZXgpLCByYW5kb21fKDQyKSB7fQorCisgIHZvaWQgSW5jcmVtZW50KCkgeworICAgIE11dGV4TG9jayBsb2NrKG11dGV4Xyk7CisgICAgaW50IHRlbXAgPSB2YWx1ZV87CisgICAgeworICAgICAgLy8gTG9ja2luZyBhIG11dGV4IHB1dHMgdXAgYSBtZW1vcnkgYmFycmllciwgcHJldmVudGluZyByZWFkcyBhbmQKKyAgICAgIC8vIHdyaXRlcyB0byB2YWx1ZV8gcmVhcnJhbmdlZCB3aGVuIG9ic2VydmVkIGZyb20gb3RoZXIgdGhyZWFkcy4KKyAgICAgIC8vCisgICAgICAvLyBXZSBjYW5ub3QgdXNlIE11dGV4IGFuZCBNdXRleExvY2sgaGVyZSBvciByZWx5IG9uIHRoZWlyIG1lbW9yeQorICAgICAgLy8gYmFycmllciBmdW5jdGlvbmFsaXR5IGFzIHdlIGFyZSB0ZXN0aW5nIHRoZW0gaGVyZS4KKyAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtZW1vcnlfYmFycmllcl9tdXRleDsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbWVtb3J5X2JhcnJpZXJfbXV0ZXgsIE5VTEwpKTsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfbG9jaygmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKKworICAgICAgU2xlZXBNaWxsaXNlY29uZHMocmFuZG9tXy5HZW5lcmF0ZSgzMCkpOworCisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X3VubG9jaygmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKKyAgICB9CisgICAgdmFsdWVfID0gdGVtcCArIDE7CisgIH0KKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICB2b2xhdGlsZSBpbnQgdmFsdWVfOworICBNdXRleCogY29uc3QgbXV0ZXhfOyAgLy8gUHJvdGVjdHMgdmFsdWVfLgorICBSYW5kb20gICAgICAgcmFuZG9tXzsKK307CisKK3ZvaWQgQ291bnRpbmdUaHJlYWRGdW5jKHBhaXI8QXRvbWljQ291bnRlcldpdGhNdXRleCosIGludD4gcGFyYW0pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5zZWNvbmQ7ICsraSkKKyAgICAgIHBhcmFtLmZpcnN0LT5JbmNyZW1lbnQoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbXV0ZXggb25seSBsZXRzIG9uZSB0aHJlYWQgYXQgYSB0aW1lIHRvIGxvY2sgaXQuCitURVNUKE11dGV4VGVzdCwgT25seU9uZVRocmVhZENhbkxvY2tBdEFUaW1lKSB7CisgIE11dGV4IG11dGV4OworICBBdG9taWNDb3VudGVyV2l0aE11dGV4IGxvY2tlZF9jb3VudGVyKCZtdXRleCk7CisKKyAgdHlwZWRlZiBUaHJlYWRXaXRoUGFyYW08cGFpcjxBdG9taWNDb3VudGVyV2l0aE11dGV4KiwgaW50PiA+IFRocmVhZFR5cGU7CisgIGNvbnN0IGludCBrQ3ljbGVDb3VudCA9IDIwOworICBjb25zdCBpbnQga1RocmVhZENvdW50ID0gNzsKKyAgc2NvcGVkX3B0cjxUaHJlYWRUeXBlPiBjb3VudGluZ190aHJlYWRzW2tUaHJlYWRDb3VudF07CisgIE5vdGlmaWNhdGlvbiB0aHJlYWRzX2Nhbl9zdGFydDsKKyAgLy8gQ3JlYXRlcyBhbmQgcnVucyBrVGhyZWFkQ291bnQgdGhyZWFkcyB0aGF0IGluY3JlbWVudCBsb2NrZWRfY291bnRlcgorICAvLyBrQ3ljbGVDb3VudCB0aW1lcyBlYWNoLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRDb3VudDsgKytpKSB7CisgICAgY291bnRpbmdfdGhyZWFkc1tpXS5yZXNldChuZXcgVGhyZWFkVHlwZSgmQ291bnRpbmdUaHJlYWRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCZsb2NrZWRfY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ3ljbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkc19jYW5fc3RhcnQpKTsKKyAgfQorICB0aHJlYWRzX2Nhbl9zdGFydC5Ob3RpZnkoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkKKyAgICBjb3VudGluZ190aHJlYWRzW2ldLT5Kb2luKCk7CisKKyAgLy8gSWYgdGhlIG11dGV4IGxldHMgbW9yZSB0aGFuIG9uZSB0aHJlYWQgdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIGF0IGEKKyAgLy8gdGltZSwgdGhleSBhcmUgbGlrZWx5IHRvIGVuY291bnRlciBhIHJhY2UgY29uZGl0aW9uIGFuZCBoYXZlIHNvbWUKKyAgLy8gaW5jcmVtZW50cyBvdmVyd3JpdHRlbiwgcmVzdWx0aW5nIGluIHRoZSBsb3dlciB0aGVuIGV4cGVjdGVkIGNvdW50ZXIKKyAgLy8gdmFsdWUuCisgIEVYUEVDVF9FUShrQ3ljbGVDb3VudCAqIGtUaHJlYWRDb3VudCwgbG9ja2VkX2NvdW50ZXIudmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBSdW5Gcm9tVGhyZWFkKHZvaWQgKGZ1bmMpKFQpLCBUIHBhcmFtKSB7CisgIFRocmVhZFdpdGhQYXJhbTxUPiB0aHJlYWQoZnVuYywgcGFyYW0sIE5VTEwpOworICB0aHJlYWQuSm9pbigpOworfQorCit2b2lkIFJldHJpZXZlVGhyZWFkTG9jYWxWYWx1ZShwYWlyPFRocmVhZExvY2FsPFN0cmluZz4qLCBTdHJpbmcqPiBwYXJhbSkgeworICAqcGFyYW0uc2Vjb25kID0gcGFyYW0uZmlyc3QtPmdldCgpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgUGFyYW1ldGVyaXplZENvbnN0cnVjdG9yU2V0c0RlZmF1bHQpIHsKKyAgVGhyZWFkTG9jYWw8U3RyaW5nPiB0aHJlYWRfbG9jYWwoImZvbyIpOworICBFWFBFQ1RfU1RSRVEoImZvbyIsIHRocmVhZF9sb2NhbC5nZXQoKS5jX3N0cigpKTsKKworICB0aHJlYWRfbG9jYWwuc2V0KCJiYXIiKTsKKyAgRVhQRUNUX1NUUkVRKCJiYXIiLCB0aHJlYWRfbG9jYWwuZ2V0KCkuY19zdHIoKSk7CisKKyAgU3RyaW5nIHJlc3VsdDsKKyAgUnVuRnJvbVRocmVhZCgmUmV0cmlldmVUaHJlYWRMb2NhbFZhbHVlLCBtYWtlX3BhaXIoJnRocmVhZF9sb2NhbCwgJnJlc3VsdCkpOworICBFWFBFQ1RfU1RSRVEoImZvbyIsIHJlc3VsdC5jX3N0cigpKTsKK30KKworLy8gRGVzdHJ1Y3RvclRyYWNrZXIga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBpdHMgaW5zdGFuY2VzIGhhdmUgYmVlbgorLy8gZGVzdHJveWVkLgorc3RhdGljIHN0ZDo6dmVjdG9yPGJvb2w+IGdfZGVzdHJveWVkOworCitjbGFzcyBEZXN0cnVjdG9yVHJhY2tlciB7CisgcHVibGljOgorICBEZXN0cnVjdG9yVHJhY2tlcigpIDogaW5kZXhfKEdldE5ld0luZGV4KCkpIHt9CisgIERlc3RydWN0b3JUcmFja2VyKGNvbnN0IERlc3RydWN0b3JUcmFja2VyJiAvKiByaHMgKi8pCisgICAgICA6IGluZGV4XyhHZXROZXdJbmRleCgpKSB7fQorICB+RGVzdHJ1Y3RvclRyYWNrZXIoKSB7CisgICAgLy8gV2UgbmV2ZXIgYWNjZXNzIGdfZGVzdHJveWVkIGNvbmN1cnJlbnRseSwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgIC8vIHByb3RlY3QgdGhlIHdyaXRlIG9wZXJhdGlvbiB1bmRlciBhIG11dGV4LgorICAgIGdfZGVzdHJveWVkW2luZGV4X10gPSB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IEdldE5ld0luZGV4KCkgeworICAgIGdfZGVzdHJveWVkLnB1c2hfYmFjayhmYWxzZSk7CisgICAgcmV0dXJuIGdfZGVzdHJveWVkLnNpemUoKSAtIDE7CisgIH0KKyAgY29uc3QgaW50IGluZGV4XzsKK307CisKK3R5cGVkZWYgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+KiBUaHJlYWRQYXJhbTsKKwordm9pZCBDYWxsVGhyZWFkTG9jYWxHZXQoVGhyZWFkUGFyYW0gdGhyZWFkX2xvY2FsKSB7CisgIHRocmVhZF9sb2NhbC0+Z2V0KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIFRocmVhZExvY2FsIG9iamVjdCBkaWVzIGluIGEgdGhyZWFkLCBpdCBkZXN0cm95cworLy8gdGhlIG1hbmFnZWQgb2JqZWN0IGZvciB0aGF0IHRocmVhZC4KK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZXN0cm95c01hbmFnZWRPYmplY3RGb3JPd25UaHJlYWRXaGVuRHlpbmcpIHsKKyAgZ19kZXN0cm95ZWQuY2xlYXIoKTsKKworICB7CisgICAgLy8gVGhlIG5leHQgbGluZSBkZWZhdWx0IGNvbnN0cnVjdHMgYSBEZXN0cnVjdG9yVHJhY2tlciBvYmplY3QgYXMKKyAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBvYmplY3RzIG1hbmFnZWQgYnkgdGhyZWFkX2xvY2FsLgorICAgIFRocmVhZExvY2FsPERlc3RydWN0b3JUcmFja2VyPiB0aHJlYWRfbG9jYWw7CisgICAgQVNTRVJUX0VRKDFVLCBnX2Rlc3Ryb3llZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShnX2Rlc3Ryb3llZFswXSk7CisKKyAgICAvLyBUaGlzIGNyZWF0ZXMgYW5vdGhlciBEZXN0cnVjdG9yVHJhY2tlciBvYmplY3QgZm9yIHRoZSBtYWluIHRocmVhZC4KKyAgICB0aHJlYWRfbG9jYWwuZ2V0KCk7CisgICAgQVNTRVJUX0VRKDJVLCBnX2Rlc3Ryb3llZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShnX2Rlc3Ryb3llZFswXSk7CisgICAgQVNTRVJUX0ZBTFNFKGdfZGVzdHJveWVkWzFdKTsKKyAgfQorCisgIC8vIE5vdyB0aHJlYWRfbG9jYWwgaGFzIGRpZWQuICBJdCBzaG91bGQgaGF2ZSBkZXN0cm95ZWQgYm90aCB0aGUKKyAgLy8gZGVmYXVsdCB2YWx1ZSBzaGFyZWQgYnkgYWxsIHRocmVhZHMgYW5kIHRoZSB2YWx1ZSBmb3IgdGhlIG1haW4KKyAgLy8gdGhyZWFkLgorICBBU1NFUlRfRVEoMlUsIGdfZGVzdHJveWVkLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKGdfZGVzdHJveWVkWzBdKTsKKyAgRVhQRUNUX1RSVUUoZ19kZXN0cm95ZWRbMV0pOworCisgIGdfZGVzdHJveWVkLmNsZWFyKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIHRocmVhZCBleGl0cywgdGhlIHRocmVhZC1sb2NhbCBvYmplY3QgZm9yIHRoYXQKKy8vIHRocmVhZCBpcyBkZXN0cm95ZWQuCitURVNUKFRocmVhZExvY2FsVGVzdCwgRGVzdHJveXNNYW5hZ2VkT2JqZWN0QXRUaHJlYWRFeGl0KSB7CisgIGdfZGVzdHJveWVkLmNsZWFyKCk7CisKKyAgeworICAgIC8vIFRoZSBuZXh0IGxpbmUgZGVmYXVsdCBjb25zdHJ1Y3RzIGEgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGFzCisgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWUgb2Ygb2JqZWN0cyBtYW5hZ2VkIGJ5IHRocmVhZF9sb2NhbC4KKyAgICBUaHJlYWRMb2NhbDxEZXN0cnVjdG9yVHJhY2tlcj4gdGhyZWFkX2xvY2FsOworICAgIEFTU0VSVF9FUSgxVSwgZ19kZXN0cm95ZWQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZ19kZXN0cm95ZWRbMF0pOworCisgICAgLy8gVGhpcyBjcmVhdGVzIGFub3RoZXIgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGluIHRoZSBuZXcgdGhyZWFkLgorICAgIFRocmVhZFdpdGhQYXJhbTxUaHJlYWRQYXJhbT4gdGhyZWFkKAorICAgICAgICAmQ2FsbFRocmVhZExvY2FsR2V0LCAmdGhyZWFkX2xvY2FsLCBOVUxMKTsKKyAgICB0aHJlYWQuSm9pbigpOworCisgICAgLy8gTm93IHRoZSBuZXcgdGhyZWFkIGhhcyBleGl0ZWQuICBUaGUgcGVyLXRocmVhZCBvYmplY3QgZm9yIGl0CisgICAgLy8gc2hvdWxkIGhhdmUgYmVlbiBkZXN0cm95ZWQuCisgICAgQVNTRVJUX0VRKDJVLCBnX2Rlc3Ryb3llZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShnX2Rlc3Ryb3llZFswXSk7CisgICAgQVNTRVJUX1RSVUUoZ19kZXN0cm95ZWRbMV0pOworICB9CisKKyAgLy8gTm93IHRocmVhZF9sb2NhbCBoYXMgZGllZC4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBoYXZlIGJlZW4KKyAgLy8gZGVzdHJveWVkIHRvby4KKyAgQVNTRVJUX0VRKDJVLCBnX2Rlc3Ryb3llZC5zaXplKCkpOworICBFWFBFQ1RfVFJVRShnX2Rlc3Ryb3llZFswXSk7CisgIEVYUEVDVF9UUlVFKGdfZGVzdHJveWVkWzFdKTsKKworICBnX2Rlc3Ryb3llZC5jbGVhcigpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgVGhyZWFkTG9jYWxNdXRhdGlvbnNBZmZlY3RPbmx5Q3VycmVudFRocmVhZCkgeworICBUaHJlYWRMb2NhbDxTdHJpbmc+IHRocmVhZF9sb2NhbDsKKyAgdGhyZWFkX2xvY2FsLnNldCgiRm9vIik7CisgIEVYUEVDVF9TVFJFUSgiRm9vIiwgdGhyZWFkX2xvY2FsLmdldCgpLmNfc3RyKCkpOworCisgIFN0cmluZyByZXN1bHQ7CisgIFJ1bkZyb21UaHJlYWQoJlJldHJpZXZlVGhyZWFkTG9jYWxWYWx1ZSwgbWFrZV9wYWlyKCZ0aHJlYWRfbG9jYWwsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0LmNfc3RyKCkgPT0gTlVMTCk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC1wcmludGVyc190ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjkyYzdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYwpAQCAtMCwwICsxLDEzMDcgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIGhhc2hfbWFwIGFuZCBoYXNoX3NldCBhcmUgYXZhaWxhYmxlIHVuZGVyIFZpc3VhbCBDKysuCisjaWYgX01TQ19WRVIKKyMgZGVmaW5lIEdURVNUX0hBU19IQVNIX01BUF8gMSAgLy8gSW5kaWNhdGVzIHRoYXQgaGFzaF9tYXAgaXMgYXZhaWxhYmxlLgorIyBpbmNsdWRlIDxoYXNoX21hcD4gICAgICAgICAgICAvLyBOT0xJTlQKKyMgZGVmaW5lIEdURVNUX0hBU19IQVNIX1NFVF8gMSAgLy8gSW5kaWNhdGVzIHRoYXQgaGFzaF9zZXQgaXMgYXZhaWxhYmxlLgorIyBpbmNsdWRlIDxoYXNoX3NldD4gICAgICAgICAgICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBTb21lIHVzZXItZGVmaW5lZCB0eXBlcyBmb3IgdGVzdGluZyB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIuCisKKy8vIEFuIGFub255bW91cyBlbnVtIHR5cGUuCitlbnVtIEFub255bW91c0VudW0geworICBrQUUxID0gLTEsCisgIGtBRTIgPSAxCit9OworCisvLyBBbiBlbnVtIHdpdGhvdXQgYSB1c2VyLWRlZmluZWQgcHJpbnRlci4KK2VudW0gRW51bVdpdGhvdXRQcmludGVyIHsKKyAga0VXUDEgPSAtMiwKKyAga0VXUDIgPSA0MgorfTsKKworLy8gQW4gZW51bSB3aXRoIGEgPDwgb3BlcmF0b3IuCitlbnVtIEVudW1XaXRoU3RyZWFtaW5nIHsKKyAga0VXUzEgPSAxMAorfTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIEVudW1XaXRoU3RyZWFtaW5nIGUpIHsKKyAgcmV0dXJuIG9zIDw8IChlID09IGtFV1MxID8gImtFV1MxIiA6ICJpbnZhbGlkIik7Cit9CisKKy8vIEFuIGVudW0gd2l0aCBhIFByaW50VG8oKSBmdW5jdGlvbi4KK2VudW0gRW51bVdpdGhQcmludFRvIHsKKyAga0VXUFQxID0gMQorfTsKKwordm9pZCBQcmludFRvKEVudW1XaXRoUHJpbnRUbyBlLCBzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAoZSA9PSBrRVdQVDEgPyAia0VXUFQxIiA6ICJpbnZhbGlkIik7Cit9CisKKy8vIEEgY2xhc3MgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LgorY2xhc3MgQmlnZ2VzdEludENvbnZlcnRpYmxlIHsKKyBwdWJsaWM6CisgIG9wZXJhdG9yIDo6dGVzdGluZzo6aW50ZXJuYWw6OkJpZ2dlc3RJbnQoKSBjb25zdCB7IHJldHVybiA0MjsgfQorfTsKKworLy8gQSB1c2VyLWRlZmluZWQgdW5wcmludGFibGUgY2xhc3MgdGVtcGxhdGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVucHJpbnRhYmxlVGVtcGxhdGVJbkdsb2JhbCB7CisgcHVibGljOgorICBVbnByaW50YWJsZVRlbXBsYXRlSW5HbG9iYWwoKSA6IHZhbHVlXygpIHt9CisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87Cit9OworCisvLyBBIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIHR5cGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitjbGFzcyBTdHJlYW1hYmxlSW5HbG9iYWwgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U3RyZWFtYWJsZUluR2xvYmFsKCkge30KK307CisKK2lubGluZSB2b2lkIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJlYW1hYmxlSW5HbG9iYWwmIC8qIHggKi8pIHsKKyAgb3MgPDwgIlN0cmVhbWFibGVJbkdsb2JhbCI7Cit9CisKK3ZvaWQgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0cmVhbWFibGVJbkdsb2JhbCogLyogeCAqLykgeworICBvcyA8PCAiU3RyZWFtYWJsZUluR2xvYmFsKiI7Cit9CisKK25hbWVzcGFjZSBmb28geworCisvLyBBIHVzZXItZGVmaW5lZCB1bnByaW50YWJsZSB0eXBlIGluIGEgdXNlciBuYW1lc3BhY2UuCitjbGFzcyBVbnByaW50YWJsZUluRm9vIHsKKyBwdWJsaWM6CisgIFVucHJpbnRhYmxlSW5Gb28oKSA6IHpfKDApIHsgbWVtY3B5KHh5XywgIlx4RUZceDEyXHgwXHgwXHgzNFx4QUJceDBceDAiLCA4KTsgfQorIHByaXZhdGU6CisgIGNoYXIgeHlfWzhdOworICBkb3VibGUgel87Cit9OworCisvLyBBIHVzZXItZGVmaW5lZCBwcmludGFibGUgdHlwZSBpbiBhIHVzZXItY2hvc2VuIG5hbWVzcGFjZS4KK3N0cnVjdCBQcmludGFibGVWaWFQcmludFRvIHsKKyAgUHJpbnRhYmxlVmlhUHJpbnRUbygpIDogdmFsdWUoKSB7fQorICBpbnQgdmFsdWU7Cit9OworCit2b2lkIFByaW50VG8oY29uc3QgUHJpbnRhYmxlVmlhUHJpbnRUbyYgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAiUHJpbnRhYmxlVmlhUHJpbnRUbzogIiA8PCB4LnZhbHVlOworfQorCisvLyBBIHR5cGUgd2l0aCBhIHVzZXItZGVmaW5lZCA8PCBmb3IgcHJpbnRpbmcgaXRzIHBvaW50ZXIuCitzdHJ1Y3QgUG9pbnRlclByaW50YWJsZSB7Cit9OworCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyUHJpbnRhYmxlKiAvKiB4ICovKSB7CisgIHJldHVybiBvcyA8PCAiUG9pbnRlclByaW50YWJsZSoiOworfQorCisvLyBBIHVzZXItZGVmaW5lZCBwcmludGFibGUgY2xhc3MgdGVtcGxhdGUgaW4gYSB1c2VyLWNob3NlbiBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZSB7CisgcHVibGljOgorICBleHBsaWNpdCBQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGUoY29uc3QgVCYgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKworICBjb25zdCBUJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VG8oY29uc3QgUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlPFQ+JiB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICJQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU6ICIgPDwgeC52YWx1ZSgpOworfQorCisvLyBBIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIGNsYXNzIHRlbXBsYXRlIGluIGEgdXNlciBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN0cmVhbWFibGVUZW1wbGF0ZUluRm9vIHsKKyBwdWJsaWM6CisgIFN0cmVhbWFibGVUZW1wbGF0ZUluRm9vKCkgOiB2YWx1ZV8oKSB7fQorCisgIGNvbnN0IFQmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSA6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb288VD4mIHgpIHsKKyAgcmV0dXJuIG9zIDw8ICJTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzogIiA8PCB4LnZhbHVlKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmb28KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGd0ZXN0X3ByaW50ZXJzX3Rlc3QgeworCit1c2luZyA6OnN0ZDo6ZGVxdWU7Cit1c2luZyA6OnN0ZDo6bGlzdDsKK3VzaW5nIDo6c3RkOjptYWtlX3BhaXI7Cit1c2luZyA6OnN0ZDo6bWFwOwordXNpbmcgOjpzdGQ6Om11bHRpbWFwOwordXNpbmcgOjpzdGQ6Om11bHRpc2V0OwordXNpbmcgOjpzdGQ6OnBhaXI7Cit1c2luZyA6OnN0ZDo6c2V0OwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKK3VzaW5nIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZzsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok5hdGl2ZUFycmF5OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkU7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmdzOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludDsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OmtSZWZlcmVuY2U7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc7CisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCit1c2luZyA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGU7CisjZW5kaWYKKworI2lmIF9NU0NfVkVSCisvLyBNU1ZDIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGluIHRoZSA6OnN0ZGV4dCBuYW1lc3BhY2Ugd2hpbGUKKy8vIGdjYyBkZWZpbmVzIHRoZW0gaW4gdGhlIDo6IG5hbWVzcGFjZS4gIE5vdGUgdGhhdCB0aGV5IGFyZSBub3QgcGFydAorLy8gb2YgdGhlIEMrKyBzdGFuZGFyZC4KK3VzaW5nIDo6c3RkZXh0OjpoYXNoX21hcDsKK3VzaW5nIDo6c3RkZXh0OjpoYXNoX3NldDsKK3VzaW5nIDo6c3RkZXh0OjpoYXNoX211bHRpbWFwOwordXNpbmcgOjpzdGRleHQ6Omhhc2hfbXVsdGlzZXQ7CisjZW5kaWYKKworLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyLiAgVGhpcworLy8gaXMgYSBoZWxwZXIgZm9yIHRlc3RpbmcgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBmb3IgdmFyaW91cyB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RyaW5nIFByaW50KGNvbnN0IFQmIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCAmc3MpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIFByaW50cyBhIHZhbHVlIHBhc3NlZCBieSByZWZlcmVuY2UgdG8gYSBzdHJpbmcsIHVzaW5nIHRoZSB1bml2ZXJzYWwKKy8vIHZhbHVlIHByaW50ZXIuICBUaGlzIGlzIGEgaGVscGVyIGZvciB0ZXN0aW5nCisvLyBVbml2ZXJzYWxQcmludGVyPFQmPjo6UHJpbnQoKSBmb3IgdmFyaW91cyB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RyaW5nIFByaW50QnlSZWYoY29uc3QgVCYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsUHJpbnRlcjxUJj46OlByaW50KHZhbHVlLCAmc3MpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHZhcmlvdXMgZW51bSB0eXBlcy4KKworVEVTVChQcmludEVudW1UZXN0LCBBbm9ueW1vdXNFbnVtKSB7CisgIEVYUEVDVF9FUSgiLTEiLCBQcmludChrQUUxKSk7CisgIEVYUEVDVF9FUSgiMSIsIFByaW50KGtBRTIpKTsKK30KKworVEVTVChQcmludEVudW1UZXN0LCBFbnVtV2l0aG91dFByaW50ZXIpIHsKKyAgRVhQRUNUX0VRKCItMiIsIFByaW50KGtFV1AxKSk7CisgIEVYUEVDVF9FUSgiNDIiLCBQcmludChrRVdQMikpOworfQorCitURVNUKFByaW50RW51bVRlc3QsIEVudW1XaXRoU3RyZWFtaW5nKSB7CisgIEVYUEVDVF9FUSgia0VXUzEiLCBQcmludChrRVdTMSkpOworICBFWFBFQ1RfRVEoImludmFsaWQiLCBQcmludChzdGF0aWNfY2FzdDxFbnVtV2l0aFN0cmVhbWluZz4oMCkpKTsKK30KKworVEVTVChQcmludEVudW1UZXN0LCBFbnVtV2l0aFByaW50VG8pIHsKKyAgRVhQRUNUX0VRKCJrRVdQVDEiLCBQcmludChrRVdQVDEpKTsKKyAgRVhQRUNUX0VRKCJpbnZhbGlkIiwgUHJpbnQoc3RhdGljX2Nhc3Q8RW51bVdpdGhQcmludFRvPigwKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIGNsYXNzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludC4KKworVEVTVChQcmludENsYXNzVGVzdCwgQmlnZ2VzdEludENvbnZlcnRpYmxlKSB7CisgIEVYUEVDVF9FUSgiNDIiLCBQcmludChCaWdnZXN0SW50Q29udmVydGlibGUoKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyB2YXJpb3VzIGNoYXIgdHlwZXMuCisKKy8vIGNoYXIuCitURVNUKFByaW50Q2hhclRlc3QsIFBsYWluQ2hhcikgeworICBFWFBFQ1RfRVEoIidcXDAnIiwgUHJpbnQoJ1wwJykpOworICBFWFBFQ1RfRVEoIidcXCcnICgzOSwgMHgyNykiLCBQcmludCgnXCcnKSk7CisgIEVYUEVDVF9FUSgiJ1wiJyAoMzQsIDB4MjIpIiwgUHJpbnQoJyInKSk7CisgIEVYUEVDVF9FUSgiJz8nICg2MywgMHgzRikiLCBQcmludCgnPycpKTsKKyAgRVhQRUNUX0VRKCInXFxcXCcgKDkyLCAweDVDKSIsIFByaW50KCdcXCcpKTsKKyAgRVhQRUNUX0VRKCInXFxhJyAoNykiLCBQcmludCgnXGEnKSk7CisgIEVYUEVDVF9FUSgiJ1xcYicgKDgpIiwgUHJpbnQoJ1xiJykpOworICBFWFBFQ1RfRVEoIidcXGYnICgxMiwgMHhDKSIsIFByaW50KCdcZicpKTsKKyAgRVhQRUNUX0VRKCInXFxuJyAoMTAsIDB4QSkiLCBQcmludCgnXG4nKSk7CisgIEVYUEVDVF9FUSgiJ1xccicgKDEzLCAweEQpIiwgUHJpbnQoJ1xyJykpOworICBFWFBFQ1RfRVEoIidcXHQnICg5KSIsIFByaW50KCdcdCcpKTsKKyAgRVhQRUNUX0VRKCInXFx2JyAoMTEsIDB4QikiLCBQcmludCgnXHYnKSk7CisgIEVYUEVDVF9FUSgiJ1xceDdGJyAoMTI3KSIsIFByaW50KCdceDdGJykpOworICBFWFBFQ1RfRVEoIidcXHhGRicgKDI1NSkiLCBQcmludCgnXHhGRicpKTsKKyAgRVhQRUNUX0VRKCInICcgKDMyLCAweDIwKSIsIFByaW50KCcgJykpOworICBFWFBFQ1RfRVEoIidhJyAoOTcsIDB4NjEpIiwgUHJpbnQoJ2EnKSk7Cit9CisKKy8vIHNpZ25lZCBjaGFyLgorVEVTVChQcmludENoYXJUZXN0LCBTaWduZWRDaGFyKSB7CisgIEVYUEVDVF9FUSgiJ1xcMCciLCBQcmludChzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oJ1wwJykpKTsKKyAgRVhQRUNUX0VRKCInXFx4Q0UnICgtNTApIiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigtNTApKSk7Cit9CisKKy8vIHVuc2lnbmVkIGNoYXIuCitURVNUKFByaW50Q2hhclRlc3QsIFVuc2lnbmVkQ2hhcikgeworICBFWFBFQ1RfRVEoIidcXDAnIiwgUHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oJ1wwJykpKTsKKyAgRVhQRUNUX0VRKCInYicgKDk4LCAweDYyKSIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPignYicpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIG90aGVyIHNpbXBsZSwgYnVpbHQtaW4gdHlwZXMuCisKKy8vIGJvb2wuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBCb29sKSB7CisgIEVYUEVDVF9FUSgiZmFsc2UiLCBQcmludChmYWxzZSkpOworICBFWFBFQ1RfRVEoInRydWUiLCBQcmludCh0cnVlKSk7Cit9CisKKy8vIHdjaGFyX3QuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBXY2hhcl90KSB7CisgIEVYUEVDVF9FUSgiTCdcXDAnIiwgUHJpbnQoTCdcMCcpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcJycgKDM5LCAweDI3KSIsIFByaW50KEwnXCcnKSk7CisgIEVYUEVDVF9FUSgiTCdcIicgKDM0LCAweDIyKSIsIFByaW50KEwnIicpKTsKKyAgRVhQRUNUX0VRKCJMJz8nICg2MywgMHgzRikiLCBQcmludChMJz8nKSk7CisgIEVYUEVDVF9FUSgiTCdcXFxcJyAoOTIsIDB4NUMpIiwgUHJpbnQoTCdcXCcpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcYScgKDcpIiwgUHJpbnQoTCdcYScpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcYicgKDgpIiwgUHJpbnQoTCdcYicpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcZicgKDEyLCAweEMpIiwgUHJpbnQoTCdcZicpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcbicgKDEwLCAweEEpIiwgUHJpbnQoTCdcbicpKTsKKyAgRVhQRUNUX0VRKCJMJ1xccicgKDEzLCAweEQpIiwgUHJpbnQoTCdccicpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcdCcgKDkpIiwgUHJpbnQoTCdcdCcpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcdicgKDExLCAweEIpIiwgUHJpbnQoTCdcdicpKTsKKyAgRVhQRUNUX0VRKCJMJ1xceDdGJyAoMTI3KSIsIFByaW50KEwnXHg3RicpKTsKKyAgRVhQRUNUX0VRKCJMJ1xceEZGJyAoMjU1KSIsIFByaW50KEwnXHhGRicpKTsKKyAgRVhQRUNUX0VRKCJMJyAnICgzMiwgMHgyMCkiLCBQcmludChMJyAnKSk7CisgIEVYUEVDVF9FUSgiTCdhJyAoOTcsIDB4NjEpIiwgUHJpbnQoTCdhJykpOworICBFWFBFQ1RfRVEoIkwnXFx4NTc2JyAoMTM5OCkiLCBQcmludChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDU3NikpKTsKKyAgRVhQRUNUX0VRKCJMJ1xceEM3NEQnICg1MTAyMSkiLCBQcmludChzdGF0aWNfY2FzdDx3Y2hhcl90PigweEM3NEQpKSk7Cit9CisKKy8vIFRlc3QgdGhhdCBJbnQ2NCBwcm92aWRlcyBtb3JlIHN0b3JhZ2UgdGhhbiB3Y2hhcl90LgorVEVTVChQcmludFR5cGVTaXplVGVzdCwgV2NoYXJfdCkgeworICBFWFBFQ1RfTFQoc2l6ZW9mKHdjaGFyX3QpLCBzaXplb2YodGVzdGluZzo6aW50ZXJuYWw6OkludDY0KSk7Cit9CisKKy8vIFZhcmlvdXMgaW50ZWdlciB0eXBlcy4KK1RFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIEludGVnZXIpIHsKKyAgRVhQRUNUX0VRKCInXFx4RkYnICgyNTUpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMjU1KSkpOyAgLy8gdWludDgKKyAgRVhQRUNUX0VRKCInXFx4ODAnICgtMTI4KSIsIFByaW50KHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigtMTI4KSkpOyAgLy8gaW50OAorICBFWFBFQ1RfRVEoIjY1NTM1IiwgUHJpbnQoVVNIUlRfTUFYKSk7ICAvLyB1aW50MTYKKyAgRVhQRUNUX0VRKCItMzI3NjgiLCBQcmludChTSFJUX01JTikpOyAgLy8gaW50MTYKKyAgRVhQRUNUX0VRKCI0Mjk0OTY3Mjk1IiwgUHJpbnQoVUlOVF9NQVgpKTsgIC8vIHVpbnQzMgorICBFWFBFQ1RfRVEoIi0yMTQ3NDgzNjQ4IiwgUHJpbnQoSU5UX01JTikpOyAgLy8gaW50MzIKKyAgRVhQRUNUX0VRKCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx0ZXN0aW5nOjppbnRlcm5hbDo6VUludDY0PigtMSkpKTsgIC8vIHVpbnQ2NAorICBFWFBFQ1RfRVEoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2ND4oMSkgPDwgNjMpKTsgIC8vIGludDY0Cit9CisKKy8vIFNpemUgdHlwZXMuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBTaXplX3QpIHsKKyAgRVhQRUNUX0VRKCIxIiwgUHJpbnQoc2l6ZW9mKCdhJykpKTsgIC8vIHNpemVfdC4KKyNpZiAhR1RFU1RfT1NfV0lORE9XUworICAvLyBXaW5kb3dzIGhhcyBubyBzc2l6ZV90IHR5cGUuCisgIEVYUEVDVF9FUSgiLTIiLCBQcmludChzdGF0aWNfY2FzdDxzc2l6ZV90PigtMikpKTsgIC8vIHNzaXplX3QuCisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCit9CisKKy8vIEZsb2F0aW5nLXBvaW50cy4KK1RFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIEZsb2F0aW5nUG9pbnRzKSB7CisgIEVYUEVDVF9FUSgiMS41IiwgUHJpbnQoMS41ZikpOyAgIC8vIGZsb2F0CisgIEVYUEVDVF9FUSgiLTIuNSIsIFByaW50KC0yLjUpKTsgIC8vIGRvdWJsZQorfQorCisvLyBTaW5jZSA6OnN0ZDo6c3RyaW5nc3RyZWFtOjpvcGVyYXRvcjw8KGNvbnN0IHZvaWQgKikgZm9ybWF0cyB0aGUgcG9pbnRlcgorLy8gb3V0cHV0IGRpZmZlcmVudGx5IHdpdGggZGlmZmVyZW50IGNvbXBpbGVycywgd2UgaGF2ZSB0byBjcmVhdGUgdGhlIGV4cGVjdGVkCisvLyBvdXRwdXQgZmlyc3QgYW5kIHVzZSBpdCBhcyBvdXIgZXhwZWN0YXRpb24uCitzdGF0aWMgc3RyaW5nIFByaW50UG9pbnRlcihjb25zdCB2b2lkICpwKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWRfcmVzdWx0X3N0cmVhbTsKKyAgZXhwZWN0ZWRfcmVzdWx0X3N0cmVhbSA8PCBwOworICByZXR1cm4gZXhwZWN0ZWRfcmVzdWx0X3N0cmVhbS5zdHIoKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgQyBzdHJpbmdzLgorCisvLyBjb25zdCBjaGFyKi4KK1RFU1QoUHJpbnRDU3RyaW5nVGVzdCwgQ29uc3QpIHsKKyAgY29uc3QgY2hhciogcCA9ICJXb3JsZCI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIFwiV29ybGRcIiIsIFByaW50KHApKTsKK30KKworLy8gY2hhciouCitURVNUKFByaW50Q1N0cmluZ1Rlc3QsIE5vbkNvbnN0KSB7CisgIGNoYXIgcFtdID0gIkhpIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gXCJIaVwiIiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PGNoYXIqPihwKSkpOworfQorCisvLyBOVUxMIEMgc3RyaW5nLgorVEVTVChQcmludENTdHJpbmdUZXN0LCBOdWxsKSB7CisgIGNvbnN0IGNoYXIqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQyBzdHJpbmdzIGFyZSBlc2NhcGVkIHByb3Blcmx5LgorVEVTVChQcmludENTdHJpbmdUZXN0LCBFc2NhcGVzUHJvcGVybHkpIHsKKyAgY29uc3QgY2hhciogcCA9ICInXCI/XFxcYVxiXGZcblxyXHRcdlx4N0ZceEZGIGEiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBcIidcXFwiP1xcXFxcXGFcXGJcXGYiCisgICAgICAgICAgICAiXFxuXFxyXFx0XFx2XFx4N0ZcXHhGRiBhXCIiLAorICAgICAgICAgICAgUHJpbnQocCkpOworfQorCisKKworLy8gTVNWQyBjb21waWxlciBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2hhcl90IGFzIGEgdHlwZWRlZgorLy8gb2YgdW5zaWduZWQgc2hvcnQuIERlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdCB3Y2hhcl90KiBpbiB0aGF0IGNhc2UKKy8vIHdvdWxkIGNhdXNlIHBvaW50ZXJzIHRvIHVuc2lnbmVkIHNob3J0cyBiZSBwcmludGVkIGFzIHdpZGUgc3RyaW5ncywKKy8vIHBvc3NpYmx5IGFjY2Vzc2luZyBtb3JlIG1lbW9yeSB0aGFuIGludGVuZGVkIGFuZCBjYXVzaW5nIGludmFsaWQKKy8vIG1lbW9yeSBhY2Nlc3Nlcy4gTVNWQyBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuCisvLyB3Y2hhcl90IGlzIGltcGxlbWVudGVkIGFzIGEgbmF0aXZlIHR5cGUuCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX05BVElWRV9XQ0hBUl9UX0RFRklORUQpCisKKy8vIGNvbnN0IHdjaGFyX3QqLgorVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgQ29uc3QpIHsKKyAgY29uc3Qgd2NoYXJfdCogcCA9IEwiV29ybGQiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBMXCJXb3JsZFwiIiwgUHJpbnQocCkpOworfQorCisvLyB3Y2hhcl90Ki4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIE5vbkNvbnN0KSB7CisgIHdjaGFyX3QgcFtdID0gTCJIaSI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIExcIkhpXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdCo+KHApKSk7Cit9CisKKy8vIE5VTEwgd2lkZSBDIHN0cmluZy4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIE51bGwpIHsKKyAgY29uc3Qgd2NoYXJfdCogcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aWRlIEMgc3RyaW5ncyBhcmUgZXNjYXBlZCBwcm9wZXJseS4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIEVzY2FwZXNQcm9wZXJseSkgeworICBjb25zdCB3Y2hhcl90IHNbXSA9IHsnXCcnLCAnIicsICc/JywgJ1xcJywgJ1xhJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1x0JywgJ1x2JywgMHhEMywgMHg1NzYsIDB4OEQzLCAweEM3NEQsICcgJywgJ2EnLCAnXDAnfTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzKSArICIgcG9pbnRpbmcgdG8gTFwiJ1xcXCI/XFxcXFxcYVxcYlxcZiIKKyAgICAgICAgICAgICJcXG5cXHJcXHRcXHZcXHhEM1xceDU3NlxceDhEM1xceEM3NEQgYVwiIiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPihzKSkpOworfQorI2VuZGlmICAvLyBuYXRpdmUgd2NoYXJfdAorCisvLyBUZXN0cyBwcmludGluZyBwb2ludGVycyB0byBvdGhlciBjaGFyIHR5cGVzLgorCisvLyBzaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBTaWduZWRDaGFyKSB7CisgIHNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxzaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gY29uc3Qgc2lnbmVkIGNoYXIqLgorVEVTVChQcmludENoYXJQb2ludGVyVGVzdCwgQ29uc3RTaWduZWRDaGFyKSB7CisgIHNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxzaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gdW5zaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBVbnNpZ25lZENoYXIpIHsKKyAgdW5zaWduZWQgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gY29uc3QgdW5zaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBDb25zdFVuc2lnbmVkQ2hhcikgeworICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBwb2ludGVycyB0byBzaW1wbGUsIGJ1aWx0LWluIHR5cGVzLgorCisvLyBib29sKi4KK1RFU1QoUHJpbnRQb2ludGVyVG9CdWlsdEluVHlwZVRlc3QsIEJvb2wpIHsKKyAgYm9vbCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vbCo+KDB4QUJDRCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gdm9pZCouCitURVNUKFByaW50UG9pbnRlclRvQnVpbHRJblR5cGVUZXN0LCBWb2lkKSB7CisgIHZvaWQqIHAgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigweEFCQ0QpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIGNvbnN0IHZvaWQqLgorVEVTVChQcmludFBvaW50ZXJUb0J1aWx0SW5UeXBlVGVzdCwgQ29uc3RWb2lkKSB7CisgIGNvbnN0IHZvaWQqIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigweEFCQ0QpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHBvaW50ZXJzIHRvIHBvaW50ZXJzLgorVEVTVChQcmludFBvaW50ZXJUb1BvaW50ZXJUZXN0LCBJbnRQb2ludGVyUG9pbnRlcikgeworICBpbnQqKiBwID0gcmVpbnRlcnByZXRfY2FzdDxpbnQqKj4oMHhBQkNEKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyBwcmludGluZyAobm9uLW1lbWJlcikgZnVuY3Rpb24gcG9pbnRlcnMuCisKK3ZvaWQgTXlGdW5jdGlvbihpbnQgLyogbiAqLykge30KKworVEVTVChQcmludFBvaW50ZXJUZXN0LCBOb25NZW1iZXJGdW5jdGlvblBvaW50ZXIpIHsKKyAgLy8gV2UgY2Fubm90IGRpcmVjdGx5IGNhc3QgJk15RnVuY3Rpb24gdG8gY29uc3Qgdm9pZCogYmVjYXVzZSB0aGUKKyAgLy8gc3RhbmRhcmQgZGlzYWxsb3dzIGNhc3RpbmcgYmV0d2VlbiBwb2ludGVycyB0byBmdW5jdGlvbnMgYW5kCisgIC8vIHBvaW50ZXJzIHRvIG9iamVjdHMsIGFuZCBzb21lIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40KSBlbmZvcmNlCisgIC8vIHRoaXMgbGltaXRhdGlvbi4KKyAgRVhQRUNUX0VRKAorICAgICAgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OkJpZ2dlc3RJbnQ+KCZNeUZ1bmN0aW9uKSkpLAorICAgICAgUHJpbnQoJk15RnVuY3Rpb24pKTsKKyAgaW50ICgqcCkoYm9vbCkgPSBOVUxMOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gQW4gYXNzZXJ0aW9uIHByZWRpY2F0ZSBkZXRlcm1pbmluZyB3aGV0aGVyIGEgb25lIHN0cmluZyBpcyBhIHByZWZpeCBmb3IKKy8vIGFub3RoZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK0Fzc2VydGlvblJlc3VsdCBIYXNQcmVmaXgoY29uc3QgU3RyaW5nVHlwZSYgc3RyLCBjb25zdCBTdHJpbmdUeXBlJiBwcmVmaXgpIHsKKyAgaWYgKHN0ci5maW5kKHByZWZpeCwgMCkgPT0gMCkKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YocHJlZml4WzBdKSA+IDE7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGJlZ2luX3N0cmluZ19xdW90ZSA9IGlzX3dpZGVfc3RyaW5nID8gIkxcIiIgOiAiXCIiOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgcHJlZml4IDw8ICJcIiBpcyBub3QgYSBwcmVmaXggb2YgIgorICAgICAgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IHN0ciA8PCAiXCJcbiI7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIG1lbWJlciB2YXJpYWJsZSBwb2ludGVycy4gIEFsdGhvdWdoIHRoZXkgYXJlIGNhbGxlZAorLy8gcG9pbnRlcnMsIHRoZXkgZG9uJ3QgcG9pbnQgdG8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4KKy8vIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBUaHVzIHRoZXkgd2lsbCBiZQorLy8gcHJpbnRlZCBhcyByYXcgYnl0ZXMuCisKK3N0cnVjdCBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vKCkge30KKyAgaW50IE15TWV0aG9kKGNoYXIgeCkgeyByZXR1cm4geCArIDE7IH0KKyAgdmlydHVhbCBjaGFyIE15VmlydHVhbE1ldGhvZChpbnQgLyogbiAqLykgeyByZXR1cm4gJ2EnOyB9CisKKyAgaW50IHZhbHVlOworfTsKKworVEVTVChQcmludFBvaW50ZXJUZXN0LCBNZW1iZXJWYXJpYWJsZVBvaW50ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KCZGb286OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZigmRm9vOjp2YWx1ZSkpICsgIi1ieXRlIG9iamVjdCAiKSk7CisgIGludCAoRm9vOjoqcCkgPSBOVUxMOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLiAgQWx0aG91Z2ggdGhleSBhcmUgY2FsbGVkCisvLyBwb2ludGVycywgdGhleSBkb24ndCBwb2ludCB0byBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLgorLy8gVGhlaXIgcmVwcmVzZW50YXRpb24gaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIFRodXMgdGhleSB3aWxsIGJlCisvLyBwcmludGVkIGFzIHJhdyBieXRlcy4KK1RFU1QoUHJpbnRQb2ludGVyVGVzdCwgTWVtYmVyRnVuY3Rpb25Qb2ludGVyKSB7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludCgmRm9vOjpNeU1ldGhvZCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludChzaXplb2YoJkZvbzo6TXlNZXRob2QpKSArICItYnl0ZSBvYmplY3QgIikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEhhc1ByZWZpeChQcmludCgmRm9vOjpNeVZpcnR1YWxNZXRob2QpLAorICAgICAgICAgICAgICAgIFByaW50KHNpemVvZigoJkZvbzo6TXlWaXJ0dWFsTWV0aG9kKSkpICsgIi1ieXRlIG9iamVjdCAiKSk7CisgIGludCAoRm9vOjoqcCkoY2hhcikgPSBOVUxMOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgQyBhcnJheXMuCisKKy8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgUHJpbnQoKSBpcyB0aGF0IGl0IGVuc3VyZXMgdGhhdCB0aGUKKy8vIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorc3RyaW5nIFByaW50QXJyYXlIZWxwZXIoVCAoJmEpW05dKSB7CisgIHJldHVybiBQcmludChhKTsKK30KKworLy8gT25lLWRpbWVuc2lvbmFsIGFycmF5LgorVEVTVChQcmludEFycmF5VGVzdCwgT25lRGltZW5zaW9uYWxBcnJheSkgeworICBpbnQgYVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworICBFWFBFQ1RfRVEoInsgMSwgMiwgMywgNCwgNSB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIFR3by1kaW1lbnNpb25hbCBhcnJheS4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIFR3b0RpbWVuc2lvbmFsQXJyYXkpIHsKKyAgaW50IGFbMl1bNV0gPSB7CisgICAgeyAxLCAyLCAzLCA0LCA1IH0sCisgICAgeyA2LCA3LCA4LCA5LCAwIH0KKyAgfTsKKyAgRVhQRUNUX0VRKCJ7IHsgMSwgMiwgMywgNCwgNSB9LCB7IDYsIDcsIDgsIDksIDAgfSB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIEFycmF5IG9mIGNvbnN0IGVsZW1lbnRzLgorVEVTVChQcmludEFycmF5VGVzdCwgQ29uc3RBcnJheSkgeworICBjb25zdCBib29sIGFbMV0gPSB7IGZhbHNlIH07CisgIEVYUEVDVF9FUSgieyBmYWxzZSB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIENoYXIgYXJyYXkuCitURVNUKFByaW50QXJyYXlUZXN0LCBDaGFyQXJyYXkpIHsKKyAgLy8gQXJyYXkgYSBjb250YWlucyAnXDAnIGluIHRoZSBtaWRkbGUgYW5kIGRvZXNuJ3QgZW5kIHdpdGggJ1wwJy4KKyAgY2hhciBhWzNdID0geyAnSCcsICdcMCcsICdpJyB9OworICBFWFBFQ1RfRVEoIlwiSFxcMGlcIiIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBDb25zdCBjaGFyIGFycmF5LgorVEVTVChQcmludEFycmF5VGVzdCwgQ29uc3RDaGFyQXJyYXkpIHsKKyAgY29uc3QgY2hhciBhWzRdID0gIlwwSGkiOworICBFWFBFQ1RfRVEoIlwiXFwwSGlcXDBcIiIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBBcnJheSBvZiBvYmplY3RzLgorVEVTVChQcmludEFycmF5VGVzdCwgT2JqZWN0QXJyYXkpIHsKKyAgc3RyaW5nIGFbM10gPSB7ICJIaSIsICJIZWxsbyIsICJOaSBoYW8iIH07CisgIEVYUEVDVF9FUSgieyBcIkhpXCIsIFwiSGVsbG9cIiwgXCJOaSBoYW9cIiB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIEFycmF5IHdpdGggbWFueSBlbGVtZW50cy4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIEJpZ0FycmF5KSB7CisgIGludCBhWzEwMF0gPSB7IDEsIDIsIDMgfTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMsIDAsIDAsIDAsIDAsIDAsIC4uLiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9IiwKKyAgICAgICAgICAgIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyA6OnN0cmluZyBhbmQgOjpzdGQ6OnN0cmluZy4KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyA6OnN0cmluZy4KK1RFU1QoUHJpbnRTdHJpbmdUZXN0LCBTdHJpbmdJbkdsb2JhbE5hbWVzcGFjZSkgeworICBjb25zdCBjaGFyIHNbXSA9ICInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHg3Rlx4RkYgYSI7CisgIGNvbnN0IDo6c3RyaW5nIHN0cihzLCBzaXplb2YocykpOworICBFWFBFQ1RfRVEoIlwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdlxceDdGXFx4RkYgYVxcMFwiIiwKKyAgICAgICAgICAgIFByaW50KHN0cikpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisvLyA6OnN0ZDo6c3RyaW5nLgorVEVTVChQcmludFN0cmluZ1Rlc3QsIFN0cmluZ0luU3RkTmFtZXNwYWNlKSB7CisgIGNvbnN0IGNoYXIgc1tdID0gIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceDdGXHhGRiBhIjsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIocywgc2l6ZW9mKHMpKTsKKyAgRVhQRUNUX0VRKCJcIidcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXDBcXHJcXHRcXHZcXHg3RlxceEZGIGFcXDBcIiIsCisgICAgICAgICAgICBQcmludChzdHIpKTsKK30KKworVEVTVChQcmludFN0cmluZ1Rlc3QsIFN0cmluZ0FtYmlndW91c0hleCkgeworICAvLyAiXHg2QkFOQU5BIiBpcyBhbWJpZ3VvdXMsIGl0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBzdGFydGluZyB3aXRoIGVpdGhlciBvZjoKKyAgLy8gJ1x4NicsICdceDZCJywgb3IgJ1x4NkJBJy4KKworICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBkZWNpbWFsIGRpZ2l0CisgIEVYUEVDVF9FUSgiXCIwXFx4MTJcIiBcIjNcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIjBceDEyIiAiMyIpKSk7CisgIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIGhleCBkaWdpdCAobG93ZXItY2FzZSkKKyAgRVhQRUNUX0VRKCJcIm1tXFx4NlwiIFwiYmFuYW5hc1wiIiwgUHJpbnQoOjpzdGQ6OnN0cmluZygibW1ceDYiICJiYW5hbmFzIikpKTsKKyAgLy8gYSBoZXggZXNjYXBpbmcgc2VxdWVuY2UgZm9sbG93aW5nIGJ5IGEgaGV4IGRpZ2l0ICh1cHBlci1jYXNlKQorICBFWFBFQ1RfRVEoIlwiTk9NXFx4NlwiIFwiQkFOQU5BXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCJOT01ceDYiICJCQU5BTkEiKSkpOworICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBub24teGRpZ2l0CisgIEVYUEVDVF9FUSgiXCIhXFx4NS0hXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCIhXHg1LSEiKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyA6OndzdHJpbmcgYW5kIDo6c3RkOjp3c3RyaW5nLgorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyA6OndzdHJpbmcuCitURVNUKFByaW50V2lkZVN0cmluZ1Rlc3QsIFN0cmluZ0luR2xvYmFsTmFtZXNwYWNlKSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0gTCInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHhEM1x4NTc2XHg4RDNceEM3NEQgYSI7CisgIGNvbnN0IDo6d3N0cmluZyBzdHIocywgc2l6ZW9mKHMpL3NpemVvZih3Y2hhcl90KSk7CisgIEVYUEVDVF9FUSgiTFwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdiIKKyAgICAgICAgICAgICJcXHhEM1xceDU3NlxceDhEM1xceEM3NEQgYVxcMFwiIiwKKyAgICAgICAgICAgIFByaW50KHN0cikpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gOjpzdGQ6OndzdHJpbmcuCitURVNUKFByaW50V2lkZVN0cmluZ1Rlc3QsIFN0cmluZ0luU3RkTmFtZXNwYWNlKSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0gTCInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHhEM1x4NTc2XHg4RDNceEM3NEQgYSI7CisgIGNvbnN0IDo6c3RkOjp3c3RyaW5nIHN0cihzLCBzaXplb2Yocykvc2l6ZW9mKHdjaGFyX3QpKTsKKyAgRVhQRUNUX0VRKCJMXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2IgorICAgICAgICAgICAgIlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RCBhXFwwXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RyKSk7Cit9CisKK1RFU1QoUHJpbnRXaWRlU3RyaW5nVGVzdCwgU3RyaW5nQW1iaWd1b3VzSGV4KSB7CisgIC8vIHNhbWUgZm9yIHdpZGUgc3RyaW5ncy4KKyAgRVhQRUNUX0VRKCJMXCIwXFx4MTJcIiBMXCIzXCIiLCBQcmludCg6OnN0ZDo6d3N0cmluZyhMIjBceDEyIiBMIjMiKSkpOworICBFWFBFQ1RfRVEoIkxcIm1tXFx4NlwiIExcImJhbmFuYXNcIiIsCisgICAgICAgICAgICBQcmludCg6OnN0ZDo6d3N0cmluZyhMIm1tXHg2IiBMImJhbmFuYXMiKSkpOworICBFWFBFQ1RfRVEoIkxcIk5PTVxceDZcIiBMXCJCQU5BTkFcIiIsCisgICAgICAgICAgICBQcmludCg6OnN0ZDo6d3N0cmluZyhMIk5PTVx4NiIgTCJCQU5BTkEiKSkpOworICBFWFBFQ1RfRVEoIkxcIiFcXHg1LSFcIiIsIFByaW50KDo6c3RkOjp3c3RyaW5nKEwiIVx4NS0hIikpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIHByaW50aW5nIHR5cGVzIHRoYXQgc3VwcG9ydCBnZW5lcmljIHN0cmVhbWluZyAoaS5lLiBzdHJlYW1pbmcKKy8vIHRvIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiBmb3IgYW55IHZhbGlkIENoYXIgYW5kCisvLyBDaGFyVHJhaXRzIHR5cGVzKS4KKworLy8gVGVzdHMgcHJpbnRpbmcgYSBub24tdGVtcGxhdGUgdHlwZSB0aGF0IHN1cHBvcnRzIGdlbmVyaWMgc3RyZWFtaW5nLgorCitjbGFzcyBBbGxvd3NHZW5lcmljU3RyZWFtaW5nIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cz4KK3N0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLAorICAgIGNvbnN0IEFsbG93c0dlbmVyaWNTdHJlYW1pbmcmIC8qIGEgKi8pIHsKKyAgcmV0dXJuIG9zIDw8ICJBbGxvd3NHZW5lcmljU3RyZWFtaW5nIjsKK30KKworVEVTVChQcmludFR5cGVXaXRoR2VuZXJpY1N0cmVhbWluZ1Rlc3QsIE5vblRlbXBsYXRlVHlwZSkgeworICBBbGxvd3NHZW5lcmljU3RyZWFtaW5nIGE7CisgIEVYUEVDVF9FUSgiQWxsb3dzR2VuZXJpY1N0cmVhbWluZyIsIFByaW50KGEpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSB0ZW1wbGF0ZSB0eXBlIHRoYXQgc3VwcG9ydHMgZ2VuZXJpYyBzdHJlYW1pbmcuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KK3N0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLAorICAgIGNvbnN0IEFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZTxUPiYgLyogYSAqLykgeworICByZXR1cm4gb3MgPDwgIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZSI7Cit9CisKK1RFU1QoUHJpbnRUeXBlV2l0aEdlbmVyaWNTdHJlYW1pbmdUZXN0LCBUZW1wbGF0ZVR5cGUpIHsKKyAgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlPGludD4gYTsKKyAgRVhQRUNUX0VRKCJBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGUiLCBQcmludChhKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgdHlwZSB0aGF0IHN1cHBvcnRzIGdlbmVyaWMgc3RyZWFtaW5nIGFuZCBjYW4gYmUKKy8vIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGFub3RoZXIgcHJpbnRhYmxlIHR5cGUuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlIHsKKyBwdWJsaWM6CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+CitzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoCisgICAgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywKKyAgICBjb25zdCBBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGU8VD4mIC8qIGEgKi8pIHsKKyAgcmV0dXJuIG9zIDw8ICJBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGUiOworfQorCitURVNUKFByaW50VHlwZVdpdGhHZW5lcmljU3RyZWFtaW5nVGVzdCwgVHlwZUltcGxpY2l0bHlDb252ZXJ0aWJsZSkgeworICBBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGU8aW50PiBhOworICBFWFBFQ1RfRVEoIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZSIsIFByaW50KGEpKTsKK30KKworI2lmIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCisKKy8vIFRlc3RzIHByaW50aW5nIFN0cmluZ1BpZWNlLgorCitURVNUKFByaW50U3RyaW5nUGllY2VUZXN0LCBTaW1wbGVTdHJpbmdQaWVjZSkgeworICBjb25zdCBTdHJpbmdQaWVjZSBzcCA9ICJIZWxsbyI7CisgIEVYUEVDVF9FUSgiXCJIZWxsb1wiIiwgUHJpbnQoc3ApKTsKK30KKworVEVTVChQcmludFN0cmluZ1BpZWNlVGVzdCwgVW5wcmludGFibGVDaGFyYWN0ZXJzKSB7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAiTlVMIChcMCkgYW5kIFxyXHQiOworICBjb25zdCBTdHJpbmdQaWVjZSBzcChzdHIsIHNpemVvZihzdHIpIC0gMSk7CisgIEVYUEVDVF9FUSgiXCJOVUwgKFxcMCkgYW5kIFxcclxcdFwiIiwgUHJpbnQoc3ApKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXworCisvLyBUZXN0cyBwcmludGluZyBTVEwgY29udGFpbmVycy4KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEVtcHR5RGVxdWUpIHsKKyAgZGVxdWU8Y2hhcj4gZW1wdHk7CisgIEVYUEVDVF9FUSgie30iLCBQcmludChlbXB0eSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTm9uRW1wdHlEZXF1ZSkgeworICBkZXF1ZTxpbnQ+IG5vbl9lbXB0eTsKKyAgbm9uX2VtcHR5LnB1c2hfYmFjaygxKTsKKyAgbm9uX2VtcHR5LnB1c2hfYmFjaygzKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDMgfSIsIFByaW50KG5vbl9lbXB0eSkpOworfQorCisjaWYgR1RFU1RfSEFTX0hBU0hfTUFQXworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgT25lRWxlbWVudEhhc2hNYXApIHsKKyAgaGFzaF9tYXA8aW50LCBjaGFyPiBtYXAxOworICBtYXAxWzFdID0gJ2EnOworICBFWFBFQ1RfRVEoInsgKDEsICdhJyAoOTcsIDB4NjEpKSB9IiwgUHJpbnQobWFwMSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgSGFzaE11bHRpTWFwKSB7CisgIGhhc2hfbXVsdGltYXA8aW50LCBib29sPiBtYXAxOworICBtYXAxLmluc2VydChtYWtlX3BhaXIoNSwgdHJ1ZSkpOworICBtYXAxLmluc2VydChtYWtlX3BhaXIoNSwgZmFsc2UpKTsKKworICAvLyBFbGVtZW50cyBvZiBoYXNoX211bHRpbWFwIGNhbiBiZSBwcmludGVkIGluIGFueSBvcmRlci4KKyAgY29uc3Qgc3RyaW5nIHJlc3VsdCA9IFByaW50KG1hcDEpOworICBFWFBFQ1RfVFJVRShyZXN1bHQgPT0gInsgKDUsIHRydWUpLCAoNSwgZmFsc2UpIH0iIHx8CisgICAgICAgICAgICAgIHJlc3VsdCA9PSAieyAoNSwgZmFsc2UpLCAoNSwgdHJ1ZSkgfSIpCisgICAgICAgICAgICAgICAgICA8PCAiIHdoZXJlIFByaW50KG1hcDEpIHJldHVybnMgXCIiIDw8IHJlc3VsdCA8PCAiXCIuIjsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfSEFTSF9NQVBfCisKKyNpZiBHVEVTVF9IQVNfSEFTSF9TRVRfCisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBIYXNoU2V0KSB7CisgIGhhc2hfc2V0PHN0cmluZz4gc2V0MTsKKyAgc2V0MS5pbnNlcnQoImhlbGxvIik7CisgIEVYUEVDVF9FUSgieyBcImhlbGxvXCIgfSIsIFByaW50KHNldDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEhhc2hNdWx0aVNldCkgeworICBjb25zdCBpbnQga1NpemUgPSA1OworICBpbnQgYVtrU2l6ZV0gPSB7IDEsIDEsIDIsIDUsIDEgfTsKKyAgaGFzaF9tdWx0aXNldDxpbnQ+IHNldDEoYSwgYSArIGtTaXplKTsKKworICAvLyBFbGVtZW50cyBvZiBoYXNoX211bHRpc2V0IGNhbiBiZSBwcmludGVkIGluIGFueSBvcmRlci4KKyAgY29uc3Qgc3RyaW5nIHJlc3VsdCA9IFByaW50KHNldDEpOworICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfcGF0dGVybiA9ICJ7IGQsIGQsIGQsIGQsIGQgfSI7ICAvLyBkIG1lYW5zIGEgZGlnaXQuCisKKyAgLy8gVmVyaWZpZXMgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBleHBlY3RlZCBwYXR0ZXJuOyBhbHNvIGV4dHJhY3RzCisgIC8vIHRoZSBudW1iZXJzIGluIHRoZSByZXN1bHQuCisgIEFTU0VSVF9FUShleHBlY3RlZF9wYXR0ZXJuLmxlbmd0aCgpLCByZXN1bHQubGVuZ3RoKCkpOworICBzdGQ6OnZlY3RvcjxpbnQ+IG51bWJlcnM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHJlc3VsdC5sZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKGV4cGVjdGVkX3BhdHRlcm5baV0gPT0gJ2QnKSB7CisgICAgICBBU1NFUlRfVFJVRShpc2RpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJlc3VsdFtpXSkpICE9IDApOworICAgICAgbnVtYmVycy5wdXNoX2JhY2socmVzdWx0W2ldIC0gJzAnKTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkX3BhdHRlcm5baV0sIHJlc3VsdFtpXSkgPDwgIiB3aGVyZSByZXN1bHQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0OworICAgIH0KKyAgfQorCisgIC8vIE1ha2VzIHN1cmUgdGhlIHJlc3VsdCBjb250YWlucyB0aGUgcmlnaHQgbnVtYmVycy4KKyAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CisgIHN0ZDo6c29ydChhLCBhICsga1NpemUpOworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGEsIGEgKyBrU2l6ZSwgbnVtYmVycy5iZWdpbigpKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0hBU0hfU0VUXworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTGlzdCkgeworICBjb25zdCBzdHJpbmcgYVtdID0geworICAgICJoZWxsbyIsCisgICAgIndvcmxkIgorICB9OworICBjb25zdCBsaXN0PHN0cmluZz4gc3RyaW5ncyhhLCBhICsgMik7CisgIEVYUEVDVF9FUSgieyBcImhlbGxvXCIsIFwid29ybGRcIiB9IiwgUHJpbnQoc3RyaW5ncykpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTWFwKSB7CisgIG1hcDxpbnQsIGJvb2w+IG1hcDE7CisgIG1hcDFbMV0gPSB0cnVlOworICBtYXAxWzVdID0gZmFsc2U7CisgIG1hcDFbM10gPSB0cnVlOworICBFWFBFQ1RfRVEoInsgKDEsIHRydWUpLCAoMywgdHJ1ZSksICg1LCBmYWxzZSkgfSIsIFByaW50KG1hcDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE11bHRpTWFwKSB7CisgIG11bHRpbWFwPGJvb2wsIGludD4gbWFwMTsKKyAgLy8gVGhlIG1ha2VfcGFpciB0ZW1wbGF0ZSBmdW5jdGlvbiB3b3VsZCBkZWR1Y2UgdGhlIHR5cGUgYXMKKyAgLy8gcGFpcjxib29sLCBpbnQ+IGhlcmUsIGFuZCBzaW5jZSB0aGUga2V5IHBhcnQgaW4gYSBtdWx0aW1hcCBoYXMgdG8KKyAgLy8gYmUgY29uc3RhbnQsIHdpdGhvdXQgYSB0ZW1wbGF0ZWQgY3RvciBpbiB0aGUgcGFpciBjbGFzcyAoYXMgaW4KKyAgLy8gbGliQ3N0ZCBvbiBTb2xhcmlzKSwgbWFrZV9wYWlyIGNhbGwgd291bGQgZmFpbCB0byBjb21waWxlIGFzIG5vCisgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgZm91bmQuICBUaHVzIGV4cGxpY2l0IHR5cGVuYW1lIGlzIHVzZWQKKyAgLy8gaGVyZSBpbnN0ZWFkLgorICBtYXAxLmluc2VydChwYWlyPGNvbnN0IGJvb2wsIGludD4odHJ1ZSwgMCkpOworICBtYXAxLmluc2VydChwYWlyPGNvbnN0IGJvb2wsIGludD4odHJ1ZSwgMSkpOworICBtYXAxLmluc2VydChwYWlyPGNvbnN0IGJvb2wsIGludD4oZmFsc2UsIDIpKTsKKyAgRVhQRUNUX0VRKCJ7IChmYWxzZSwgMiksICh0cnVlLCAwKSwgKHRydWUsIDEpIH0iLCBQcmludChtYXAxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBTZXQpIHsKKyAgY29uc3QgdW5zaWduZWQgaW50IGFbXSA9IHsgMywgMCwgNSB9OworICBzZXQ8dW5zaWduZWQgaW50PiBzZXQxKGEsIGEgKyAzKTsKKyAgRVhQRUNUX0VRKCJ7IDAsIDMsIDUgfSIsIFByaW50KHNldDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE11bHRpU2V0KSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDEsIDIsIDUsIDEgfTsKKyAgbXVsdGlzZXQ8aW50PiBzZXQxKGEsIGEgKyA1KTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDEsIDEsIDIsIDUgfSIsIFByaW50KHNldDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFBhaXIpIHsKKyAgcGFpcjxjb25zdCBib29sLCBpbnQ+IHAodHJ1ZSwgNSk7CisgIEVYUEVDVF9FUSgiKHRydWUsIDUpIiwgUHJpbnQocCkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgVmVjdG9yKSB7CisgIHZlY3RvcjxpbnQ+IHY7CisgIHYucHVzaF9iYWNrKDEpOworICB2LnB1c2hfYmFjaygyKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIgfSIsIFByaW50KHYpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIExvbmdTZXF1ZW5jZSkgeworICBjb25zdCBpbnQgYVsxMDBdID0geyAxLCAyLCAzIH07CisgIGNvbnN0IHZlY3RvcjxpbnQ+IHYoYSwgYSArIDEwMCk7CisgIEVYUEVDVF9FUSgieyAxLCAyLCAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAiCisgICAgICAgICAgICAiMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLi4uIH0iLCBQcmludCh2KSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBOZXN0ZWRDb250YWluZXIpIHsKKyAgY29uc3QgaW50IGExW10gPSB7IDEsIDIgfTsKKyAgY29uc3QgaW50IGEyW10gPSB7IDMsIDQsIDUgfTsKKyAgY29uc3QgbGlzdDxpbnQ+IGwxKGExLCBhMSArIDIpOworICBjb25zdCBsaXN0PGludD4gbDIoYTIsIGEyICsgMyk7CisKKyAgdmVjdG9yPGxpc3Q8aW50PiA+IHY7CisgIHYucHVzaF9iYWNrKGwxKTsKKyAgdi5wdXNoX2JhY2sobDIpOworICBFWFBFQ1RfRVEoInsgeyAxLCAyIH0sIHsgMywgNCwgNSB9IH0iLCBQcmludCh2KSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBPbmVEaW1lbnNpb25hbE5hdGl2ZUFycmF5KSB7CisgIGNvbnN0IGludCBhWzNdID0geyAxLCAyLCAzIH07CisgIE5hdGl2ZUFycmF5PGludD4gYihhLCAzLCBrUmVmZXJlbmNlKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMgfSIsIFByaW50KGIpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFR3b0RpbWVuc2lvbmFsTmF0aXZlQXJyYXkpIHsKKyAgY29uc3QgaW50IGFbMl1bM10gPSB7IHsgMSwgMiwgMyB9LCB7IDQsIDUsIDYgfSB9OworICBOYXRpdmVBcnJheTxpbnRbM10+IGIoYSwgMiwga1JlZmVyZW5jZSk7CisgIEVYUEVDVF9FUSgieyB7IDEsIDIsIDMgfSwgeyA0LCA1LCA2IH0gfSIsIFByaW50KGIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGNsYXNzIG5hbWVkIGl0ZXJhdG9yIGlzbid0IHRyZWF0ZWQgYXMgYSBjb250YWluZXIuCisKK3N0cnVjdCBpdGVyYXRvciB7CisgIGNoYXIgeDsKK307CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBJdGVyYXRvcikgeworICBpdGVyYXRvciBpdCA9IHt9OworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsIFByaW50KGl0KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBjbGFzcyBuYW1lZCBjb25zdF9pdGVyYXRvciBpc24ndCB0cmVhdGVkIGFzIGEgY29udGFpbmVyLgorCitzdHJ1Y3QgY29uc3RfaXRlcmF0b3IgeworICBjaGFyIHg7Cit9OworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgQ29uc3RJdGVyYXRvcikgeworICBjb25zdF9pdGVyYXRvciBpdCA9IHt9OworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsIFByaW50KGl0KSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCisvLyBUZXN0cyBwcmludGluZyB0dXBsZXMuCisKKy8vIFR1cGxlcyBvZiB2YXJpb3VzIGFyaXRpZXMuCitURVNUKFByaW50VHVwbGVUZXN0LCBWYXJpb3VzU2l6ZXMpIHsKKyAgdHVwbGU8PiB0MDsKKyAgRVhQRUNUX0VRKCIoKSIsIFByaW50KHQwKSk7CisKKyAgdHVwbGU8aW50PiB0MSg1KTsKKyAgRVhQRUNUX0VRKCIoNSkiLCBQcmludCh0MSkpOworCisgIHR1cGxlPGNoYXIsIGJvb2w+IHQyKCdhJywgdHJ1ZSk7CisgIEVYUEVDVF9FUSgiKCdhJyAoOTcsIDB4NjEpLCB0cnVlKSIsIFByaW50KHQyKSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQ+IHQzKGZhbHNlLCAyLCAzKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMpIiwgUHJpbnQodDMpKTsKKworICB0dXBsZTxib29sLCBpbnQsIGludCwgaW50PiB0NChmYWxzZSwgMiwgMywgNCk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0KSIsIFByaW50KHQ0KSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbD4gdDUoZmFsc2UsIDIsIDMsIDQsIHRydWUpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSkiLCBQcmludCh0NSkpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludD4gdDYoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNikiLCBQcmludCh0NikpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50PiB0NyhmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNyk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3KSIsIFByaW50KHQ3KSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50LCBpbnQsIGJvb2w+IHQ4KAorICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSkiLCBQcmludCh0OCkpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50LCBib29sLCBpbnQ+IHQ5KAorICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUsIDkpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSwgOSkiLCBQcmludCh0OSkpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICI4IjsKKyAgdHVwbGU8Ym9vbCwgY2hhciwgc2hvcnQsIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiwgIC8vIE5PTElOVAorICAgICAgdGVzdGluZzo6aW50ZXJuYWw6OkludDY0LCBmbG9hdCwgZG91YmxlLCBjb25zdCBjaGFyKiwgdm9pZCosIHN0cmluZz4KKyAgICAgIHQxMChmYWxzZSwgJ2EnLCAzLCA0LCA1LCAxLjVGLCAtMi41LCBzdHIsIE5VTEwsICIxMCIpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgJ2EnICg5NywgMHg2MSksIDMsIDQsIDUsIDEuNSwgLTIuNSwgIiArIFByaW50UG9pbnRlcihzdHIpICsKKyAgICAgICAgICAgICIgcG9pbnRpbmcgdG8gXCI4XCIsIE5VTEwsIFwiMTBcIikiLAorICAgICAgICAgICAgUHJpbnQodDEwKSk7Cit9CisKKy8vIE5lc3RlZCB0dXBsZXMuCitURVNUKFByaW50VHVwbGVUZXN0LCBOZXN0ZWRUdXBsZSkgeworICB0dXBsZTx0dXBsZTxpbnQsIGJvb2w+LCBjaGFyPiBuZXN0ZWQobWFrZV90dXBsZSg1LCB0cnVlKSwgJ2EnKTsKKyAgRVhQRUNUX0VRKCIoKDUsIHRydWUpLCAnYScgKDk3LCAweDYxKSkiLCBQcmludChuZXN0ZWQpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCB1bnByaW50YWJsZSB0eXBlcy4KKworLy8gVW5wcmludGFibGUgdHlwZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitURVNUKFByaW50VW5wcmludGFibGVUeXBlVGVzdCwgSW5HbG9iYWxOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCIxLWJ5dGUgb2JqZWN0IDwwMD4iLAorICAgICAgICAgICAgUHJpbnQoVW5wcmludGFibGVUZW1wbGF0ZUluR2xvYmFsPGNoYXI+KCkpKTsKK30KKworLy8gVW5wcmludGFibGUgdHlwZXMgaW4gYSB1c2VyIG5hbWVzcGFjZS4KK1RFU1QoUHJpbnRVbnByaW50YWJsZVR5cGVUZXN0LCBJblVzZXJOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCIxNi1ieXRlIG9iamVjdCA8RUYtMTIgMDAtMDAgMzQtQUIgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDA+IiwKKyAgICAgICAgICAgIFByaW50KDo6Zm9vOjpVbnByaW50YWJsZUluRm9vKCkpKTsKK30KKworLy8gVW5wcmludGFibGUgdHlwZXMgYXJlIHRoYXQgdG9vIGJpZyB0byBiZSBwcmludGVkIGNvbXBsZXRlbHkuCisKK3N0cnVjdCBCaWcgeworICBCaWcoKSB7IG1lbXNldChhcnJheSwgMCwgc2l6ZW9mKGFycmF5KSk7IH0KKyAgY2hhciBhcnJheVsyNTddOworfTsKKworVEVTVChQcmludFVucHJpdGFibGVUeXBlVGVzdCwgQmlnT2JqZWN0KSB7CisgIEVYUEVDVF9FUSgiMjU3LWJ5dGUgb2JqZWN0IDwwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAuLi4gMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDA+IiwKKyAgICAgICAgICAgIFByaW50KEJpZygpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIHR5cGVzLgorCisvLyBTdHJlYW1hYmxlIHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorVEVTVChQcmludFN0cmVhbWFibGVUeXBlVGVzdCwgSW5HbG9iYWxOYW1lc3BhY2UpIHsKKyAgU3RyZWFtYWJsZUluR2xvYmFsIHg7CisgIEVYUEVDVF9FUSgiU3RyZWFtYWJsZUluR2xvYmFsIiwgUHJpbnQoeCkpOworICBFWFBFQ1RfRVEoIlN0cmVhbWFibGVJbkdsb2JhbCoiLCBQcmludCgmeCkpOworfQorCisvLyBQcmludGFibGUgdGVtcGxhdGUgdHlwZXMgaW4gYSB1c2VyIG5hbWVzcGFjZS4KK1RFU1QoUHJpbnRTdHJlYW1hYmxlVHlwZVRlc3QsIFRlbXBsYXRlVHlwZUluVXNlck5hbWVzcGFjZSkgeworICBFWFBFQ1RfRVEoIlN0cmVhbWFibGVUZW1wbGF0ZUluRm9vOiAwIiwKKyAgICAgICAgICAgIFByaW50KDo6Zm9vOjpTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzxpbnQ+KCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgaGF2ZSBhIFByaW50VG8oKSBmdW5jdGlvbi4KK1RFU1QoUHJpbnRQcmludGFibGVUeXBlVGVzdCwgSW5Vc2VyTmFtZXNwYWNlKSB7CisgIEVYUEVDVF9FUSgiUHJpbnRhYmxlVmlhUHJpbnRUbzogMCIsCisgICAgICAgICAgICBQcmludCg6OmZvbzo6UHJpbnRhYmxlVmlhUHJpbnRUbygpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgcG9pbnRlciB0byBhIHVzZXItZGVmaW5lZCB0eXBlIHRoYXQgaGFzIGEgPDwKKy8vIG9wZXJhdG9yIGZvciBpdHMgcG9pbnRlci4KK1RFU1QoUHJpbnRQcmludGFibGVUeXBlVGVzdCwgUG9pbnRlckluVXNlck5hbWVzcGFjZSkgeworICA6OmZvbzo6UG9pbnRlclByaW50YWJsZSB4OworICBFWFBFQ1RfRVEoIlBvaW50ZXJQcmludGFibGUqIiwgUHJpbnQoJngpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdXNlci1kZWZpbmVkIGNsYXNzIHRlbXBsYXRlIHRoYXQgaGF2ZSBhIFByaW50VG8oKSBmdW5jdGlvbi4KK1RFU1QoUHJpbnRQcmludGFibGVUeXBlVGVzdCwgVGVtcGxhdGVJblVzZXJOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCJQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU6IDUiLAorICAgICAgICAgICAgUHJpbnQoOjpmb286OlByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZTxpbnQ+KDUpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFRlc3RzIHByaW50aW5nIGEgcHJvdG9jb2wgbWVzc2FnZS4KK1RFU1QoUHJpbnRQcm90b2NvbE1lc3NhZ2VUZXN0LCBQcmludHNTaG9ydERlYnVnU3RyaW5nKSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0TWVzc2FnZSBtc2c7CisgIG1zZy5zZXRfbWVtYmVyKCJ5ZXMiKTsKKyAgRVhQRUNUX0VRKCI8bWVtYmVyOlwieWVzXCI+IiwgUHJpbnQobXNnKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgc2hvcnQgcHJvdG8yIG1lc3NhZ2UuCitURVNUKFByaW50UHJvdG8yTWVzc2FnZVRlc3QsIFByaW50c1Nob3J0RGVidWdTdHJpbmdXaGVuSXRJc1Nob3J0KSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpGb29NZXNzYWdlIG1zZzsKKyAgbXNnLnNldF9pbnRfZmllbGQoMik7CisgIG1zZy5zZXRfc3RyaW5nX2ZpZWxkKCJoZWxsbyIpOworICBFWFBFQ1RfUFJFRDIoUkU6OkZ1bGxNYXRjaCwgUHJpbnQobXNnKSwKKyAgICAgICAgICAgICAgICI8aW50X2ZpZWxkOlxccyoyXFxzK3N0cmluZ19maWVsZDpcXHMqXCJoZWxsb1wiPiIpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIGxvbmcgcHJvdG8yIG1lc3NhZ2UuCitURVNUKFByaW50UHJvdG8yTWVzc2FnZVRlc3QsIFByaW50c0RlYnVnU3RyaW5nV2hlbkl0SXNMb25nKSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpGb29NZXNzYWdlIG1zZzsKKyAgbXNnLnNldF9pbnRfZmllbGQoMik7CisgIG1zZy5zZXRfc3RyaW5nX2ZpZWxkKCJoZWxsbyIpOworICBtc2cuYWRkX25hbWVzKCJwZXRlciIpOworICBtc2cuYWRkX25hbWVzKCJwYXVsIik7CisgIG1zZy5hZGRfbmFtZXMoIm1hcnkiKTsKKyAgRVhQRUNUX1BSRUQyKFJFOjpGdWxsTWF0Y2gsIFByaW50KG1zZyksCisgICAgICAgICAgICAgICAiPFxuIgorICAgICAgICAgICAgICAgImludF9maWVsZDpcXHMqMlxuIgorICAgICAgICAgICAgICAgInN0cmluZ19maWVsZDpcXHMqXCJoZWxsb1wiXG4iCisgICAgICAgICAgICAgICAibmFtZXM6XFxzKlwicGV0ZXJcIlxuIgorICAgICAgICAgICAgICAgIm5hbWVzOlxccypcInBhdWxcIlxuIgorICAgICAgICAgICAgICAgIm5hbWVzOlxccypcIm1hcnlcIlxuIgorICAgICAgICAgICAgICAgIj4iKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBib3RoIHRoZSBhZGRyZXNzIGFuZCB0aGUKKy8vIHZhbHVlIG9mIGEgcmVmZXJlbmNlLgorVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIFByaW50c0FkZHJlc3NBbmRWYWx1ZSkgeworICBpbnQgbiA9IDU7CisgIEVYUEVDVF9FUSgiQCIgKyBQcmludFBvaW50ZXIoJm4pICsgIiA1IiwgUHJpbnRCeVJlZihuKSk7CisKKyAgaW50IGFbMl1bM10gPSB7CisgICAgeyAwLCAxLCAyIH0sCisgICAgeyAzLCA0LCA1IH0KKyAgfTsKKyAgRVhQRUNUX0VRKCJAIiArIFByaW50UG9pbnRlcihhKSArICIgeyB7IDAsIDEsIDIgfSwgeyAzLCA0LCA1IH0gfSIsCisgICAgICAgICAgICBQcmludEJ5UmVmKGEpKTsKKworICBjb25zdCA6OmZvbzo6VW5wcmludGFibGVJbkZvbyB4OworICBFWFBFQ1RfRVEoIkAiICsgUHJpbnRQb2ludGVyKCZ4KSArICIgMTYtYnl0ZSBvYmplY3QgIgorICAgICAgICAgICAgIjxFRi0xMiAwMC0wMCAzNC1BQiAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMD4iLAorICAgICAgICAgICAgUHJpbnRCeVJlZih4KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBhIGZ1bmN0aW9uIHBvaW50ZXIgcGFzc2VkIGJ5CisvLyByZWZlcmVuY2UuCitURVNUKFByaW50UmVmZXJlbmNlVGVzdCwgSGFuZGxlc0Z1bmN0aW9uUG9pbnRlcikgeworICB2b2lkICgqZnApKGludCBuKSA9ICZNeUZ1bmN0aW9uOworICBjb25zdCBzdHJpbmcgZnBfcG9pbnRlcl9zdHJpbmcgPQorICAgICAgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZmcCkpOworICAvLyBXZSBjYW5ub3QgZGlyZWN0bHkgY2FzdCAmTXlGdW5jdGlvbiB0byBjb25zdCB2b2lkKiBiZWNhdXNlIHRoZQorICAvLyBzdGFuZGFyZCBkaXNhbGxvd3MgY2FzdGluZyBiZXR3ZWVuIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBhbmQKKyAgLy8gcG9pbnRlcnMgdG8gb2JqZWN0cywgYW5kIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyAzLjQpIGVuZm9yY2UKKyAgLy8gdGhpcyBsaW1pdGF0aW9uLgorICBjb25zdCBzdHJpbmcgZnBfc3RyaW5nID0gUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6QmlnZ2VzdEludD4oZnApKSk7CisgIEVYUEVDVF9FUSgiQCIgKyBmcF9wb2ludGVyX3N0cmluZyArICIgIiArIGZwX3N0cmluZywKKyAgICAgICAgICAgIFByaW50QnlSZWYoZnApKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgdW5pdmVyc2FsIHByaW50ZXIgcHJpbnRzIGEgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIKKy8vIHBhc3NlZCBieSByZWZlcmVuY2UuCitURVNUKFByaW50UmVmZXJlbmNlVGVzdCwgSGFuZGxlc01lbWJlckZ1bmN0aW9uUG9pbnRlcikgeworICBpbnQgKEZvbzo6KnApKGNoYXIgY2gpID0gJkZvbzo6TXlNZXRob2Q7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeCgKKyAgICAgIFByaW50QnlSZWYocCksCisgICAgICAiQCIgKyBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJnApKSArICIgIiArCisgICAgICAgICAgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOworCisgIGNoYXIgKEZvbzo6KnAyKShpbnQgbikgPSAmRm9vOjpNeVZpcnR1YWxNZXRob2Q7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeCgKKyAgICAgIFByaW50QnlSZWYocDIpLAorICAgICAgIkAiICsgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZwMikpICsgIiAiICsKKyAgICAgICAgICBQcmludChzaXplb2YocDIpKSArICItYnl0ZSBvYmplY3QgIikpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYSBtZW1iZXIgdmFyaWFibGUgcG9pbnRlcgorLy8gcGFzc2VkIGJ5IHJlZmVyZW5jZS4KK1RFU1QoUHJpbnRSZWZlcmVuY2VUZXN0LCBIYW5kbGVzTWVtYmVyVmFyaWFibGVQb2ludGVyKSB7CisgIGludCAoRm9vOjoqcCkgPSAmRm9vOjp2YWx1ZTsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoCisgICAgICBQcmludEJ5UmVmKHApLAorICAgICAgIkAiICsgUHJpbnRQb2ludGVyKCZwKSArICIgIiArIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVXNlZnVsIGZvciB0ZXN0aW5nIFByaW50VG9TdHJpbmcoKS4gIFdlIGNhbm5vdCB1c2UgRVhQRUNUX0VRKCkKKy8vIHRoZXJlIGFzIGl0cyBpbXBsZW1lbnRhdGlvbiB1c2VzIFByaW50VG9TdHJpbmcoKS4gIFRoZSBjYWxsZXIgbXVzdAorLy8gZW5zdXJlIHRoYXQgJ3ZhbHVlJyBoYXMgbm8gc2lkZSBlZmZlY3QuCisjZGVmaW5lIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHZhbHVlLCBleHBlY3RlZF9zdHJpbmcpICAgICAgICAgXAorICBFWFBFQ1RfVFJVRShQcmludFRvU3RyaW5nKHZhbHVlKSA9PSAoZXhwZWN0ZWRfc3RyaW5nKSkgICAgICAgIFwKKyAgICAgIDw8ICIgd2hlcmUgIiAjdmFsdWUgIiBwcmludHMgYXMgIiA8PCAoUHJpbnRUb1N0cmluZyh2YWx1ZSkpCisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yU2NhbGFyKSB7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKDEyMywgIjEyMyIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb0NvbnN0Q2hhcikgeworICBjb25zdCBjaGFyKiBwID0gImhlbGxvIjsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocCwgIlwiaGVsbG9cIiIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb05vbkNvbnN0Q2hhcikgeworICBjaGFyIHNbXSA9ICJoZWxsbyI7CisgIGNoYXIqIHAgPSBzOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhwLCAiXCJoZWxsb1wiIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yQXJyYXkpIHsKKyAgaW50IG5bM10gPSB7IDEsIDIsIDMgfTsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18obiwgInsgMSwgMiwgMyB9Iik7Cit9CisKKyN1bmRlZiBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXworCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUZXN0LCBXb3Jrc0Zvck5vblJlZmVyZW5jZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxUZXJzZVByaW50KDEyMywgJnNzKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7CisgIGNvbnN0IGludCYgbiA9IDEyMzsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsVGVyc2VQcmludChuLCAmc3MpOworICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VGVzdCwgV29ya3NGb3JDU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIqIHMxID0gImFiYyI7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MxOworICBVbml2ZXJzYWxUZXJzZVByaW50KHMxLCAmc3MxKTsKKyAgRVhQRUNUX0VRKCJcImFiY1wiIiwgc3MxLnN0cigpKTsKKworICBjaGFyKiBzMiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHMxKTsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczI7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQoczIsICZzczIpOworICBFWFBFQ1RfRVEoIlwiYWJjXCIiLCBzczIuc3RyKCkpOworCisgIGNvbnN0IGNoYXIqIHMzID0gTlVMTDsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczM7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQoczMsICZzczMpOworICBFWFBFQ1RfRVEoIk5VTEwiLCBzczMuc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFByaW50VGVzdCwgV29ya3NGb3JOb25SZWZlcmVuY2UpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsUHJpbnQoMTIzLCAmc3MpOworICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7CisgIGNvbnN0IGludCYgbiA9IDEyMzsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsUHJpbnQobiwgJnNzKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsUHJpbnRUZXN0LCBXb3Jrc0ZvckNTdHJpbmcpIHsKKyAgY29uc3QgY2hhciogczEgPSAiYWJjIjsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczE7CisgIFVuaXZlcnNhbFByaW50KHMxLCAmc3MxKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzMSkgKyAiIHBvaW50aW5nIHRvIFwiYWJjXCIiLCBzdHJpbmcoc3MxLnN0cigpKSk7CisKKyAgY2hhciogczIgPSBjb25zdF9jYXN0PGNoYXIqPihzMSk7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MyOworICBVbml2ZXJzYWxQcmludChzMiwgJnNzMik7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoczIpICsgIiBwb2ludGluZyB0byBcImFiY1wiIiwgc3RyaW5nKHNzMi5zdHIoKSkpOworCisgIGNvbnN0IGNoYXIqIHMzID0gTlVMTDsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczM7CisgIFVuaXZlcnNhbFByaW50KHMzLCAmc3MzKTsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgc3MzLnN0cigpKTsKK30KKworCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3QsIFByaW50c0VtcHR5VHVwbGUpIHsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MobWFrZV90dXBsZSgpKTsKKyAgRVhQRUNUX0VRKDB1LCByZXN1bHQuc2l6ZSgpKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNPbmVUdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhtYWtlX3R1cGxlKDEpKTsKKyAgQVNTRVJUX0VRKDF1LCByZXN1bHQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCIxIiwgcmVzdWx0WzBdKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNUd29UdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhtYWtlX3R1cGxlKDEsICdhJykpOworICBBU1NFUlRfRVEoMnUsIHJlc3VsdC5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOworICBFWFBFQ1RfRVEoIidhJyAoOTcsIDB4NjEpIiwgcmVzdWx0WzFdKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNUZXJzZWx5KSB7CisgIGNvbnN0IGludCBuID0gMTsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisgICAgICB0dXBsZTxjb25zdCBpbnQmLCBjb25zdCBjaGFyKj4obiwgImEiKSk7CisgIEFTU0VSVF9FUSgydSwgcmVzdWx0LnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7CisgIEVYUEVDVF9FUSgiXCJhXCIiLCByZXN1bHRbMV0pOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X3ByaW50ZXJzX3Rlc3QKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGJhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYwpAQCAtMCwwICsxLDIwOCBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBtaGV1bGVAZ29vZ2xlLmNvbSAoTWFya3VzIEhldWxlKQorLy8KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OlRlc3Q7Cit1c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXk7CisKK25hbWVzcGFjZSB7CisKKy8vIFRlc3RzIHRoZSBUZXN0UGFydFJlc3VsdCBjbGFzcy4KKworLy8gVGhlIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBUZXN0UGFydFJlc3VsdC4KK2NsYXNzIFRlc3RQYXJ0UmVzdWx0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFRlc3RQYXJ0UmVzdWx0VGVzdCgpCisgICAgICA6IHIxXyhUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MsICJmb28vYmFyLmNjIiwgMTAsICJTdWNjZXNzISIpLAorICAgICAgICByMl8oVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsICJmb28vYmFyLmNjIiwgLTEsICJGYWlsdXJlISIpLAorICAgICAgICByM18oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIE5VTEwsIC0xLCAiRmFpbHVyZSEiKSB7fQorCisgIFRlc3RQYXJ0UmVzdWx0IHIxXywgcjJfLCByM187Cit9OworCisKK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIENvbnN0cnVjdG9yV29ya3MpIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlIDw8ICJzb21ldGhpbmcgaXMgdGVycmlibHkgd3JvbmciOworICBtZXNzYWdlIDw8IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPih0ZXN0aW5nOjppbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIpOworICBtZXNzYWdlIDw8ICJzb21lIHVuaW1wb3J0YW50IHN0YWNrIHRyYWNlIjsKKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29tZV9maWxlLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIHJlc3VsdC50eXBlKCkpOworICBFWFBFQ1RfU1RSRVEoInNvbWVfZmlsZS5jYyIsIHJlc3VsdC5maWxlX25hbWUoKSk7CisgIEVYUEVDVF9FUSg0MiwgcmVzdWx0LmxpbmVfbnVtYmVyKCkpOworICBFWFBFQ1RfU1RSRVEobWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpLCByZXN1bHQubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJzb21ldGhpbmcgaXMgdGVycmlibHkgd3JvbmciLCByZXN1bHQuc3VtbWFyeSgpKTsKK30KKworVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgUmVzdWx0QWNjZXNzb3JzV29yaykgeworICBjb25zdCBUZXN0UGFydFJlc3VsdCBzdWNjZXNzKFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiKTsKKyAgRVhQRUNUX1RSVUUoc3VjY2Vzcy5wYXNzZWQoKSk7CisgIEVYUEVDVF9GQUxTRShzdWNjZXNzLmZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3Mubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShzdWNjZXNzLmZhdGFsbHlfZmFpbGVkKCkpOworCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IG5vbmZhdGFsX2ZhaWx1cmUoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIik7CisgIEVYUEVDVF9GQUxTRShub25mYXRhbF9mYWlsdXJlLnBhc3NlZCgpKTsKKyAgRVhQRUNUX1RSVUUobm9uZmF0YWxfZmFpbHVyZS5mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKG5vbmZhdGFsX2ZhaWx1cmUubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShub25mYXRhbF9mYWlsdXJlLmZhdGFsbHlfZmFpbGVkKCkpOworCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IGZhdGFsX2ZhaWx1cmUoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIik7CisgIEVYUEVDVF9GQUxTRShmYXRhbF9mYWlsdXJlLnBhc3NlZCgpKTsKKyAgRVhQRUNUX1RSVUUoZmF0YWxfZmFpbHVyZS5mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShmYXRhbF9mYWlsdXJlLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShmYXRhbF9mYWlsdXJlLmZhdGFsbHlfZmFpbGVkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6dHlwZSgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgdHlwZSkgeworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLCByMV8udHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCByMl8udHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCByM18udHlwZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OmZpbGVfbmFtZSgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgZmlsZV9uYW1lKSB7CisgIEVYUEVDVF9TVFJFUSgiZm9vL2Jhci5jYyIsIHIxXy5maWxlX25hbWUoKSk7CisgIEVYUEVDVF9TVFJFUShOVUxMLCByM18uZmlsZV9uYW1lKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6bGluZV9udW1iZXIoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIGxpbmVfbnVtYmVyKSB7CisgIEVYUEVDVF9FUSgxMCwgcjFfLmxpbmVfbnVtYmVyKCkpOworICBFWFBFQ1RfRVEoLTEsIHIyXy5saW5lX251bWJlcigpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6Om1lc3NhZ2UoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX1NUUkVRKCJTdWNjZXNzISIsIHIxXy5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6cGFzc2VkKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBQYXNzZWQpIHsKKyAgRVhQRUNUX1RSVUUocjFfLnBhc3NlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHIyXy5wYXNzZWQoKSk7CisgIEVYUEVDVF9GQUxTRShyM18ucGFzc2VkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6ZmFpbGVkKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBGYWlsZWQpIHsKKyAgRVhQRUNUX0ZBTFNFKHIxXy5mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHIyXy5mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHIzXy5mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpmYXRhbGx5X2ZhaWxlZCgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgRmF0YWxseUZhaWxlZCkgeworICBFWFBFQ1RfRkFMU0UocjFfLmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0UocjJfLmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShyM18uZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0Ojpub25mYXRhbGx5X2ZhaWxlZCgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgTm9uZmF0YWxseUZhaWxlZCkgeworICBFWFBFQ1RfRkFMU0UocjFfLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShyMl8ubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShyM18ubm9uZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBUZXN0UGFydFJlc3VsdEFycmF5IGNsYXNzLgorCitjbGFzcyBUZXN0UGFydFJlc3VsdEFycmF5VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0KCkKKyAgICAgIDogcjFfKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCAiZm9vL2Jhci5jYyIsIC0xLCAiRmFpbHVyZSAxIiksCisgICAgICAgIHIyXyhUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgImZvby9iYXIuY2MiLCAtMSwgIkZhaWx1cmUgMiIpIHt9CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgcjFfLCByMl87Cit9OworCisvLyBUZXN0cyB0aGF0IFRlc3RQYXJ0UmVzdWx0QXJyYXkgaW5pdGlhbGx5IGhhcyBzaXplIDAuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QsIEluaXRpYWxTaXplSXNaZXJvKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgRVhQRUNUX0VRKDAsIHJlc3VsdHMuc2l6ZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdAorLy8gYWZ0ZXIgb25lIEFwcGVuZCgpIG9wZXJhdGlvbi4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5VGVzdCwgQ29udGFpbnNHaXZlblJlc3VsdEFmdGVyQXBwZW5kKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgcmVzdWx0cy5BcHBlbmQocjFfKTsKKyAgRVhQRUNUX0VRKDEsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJGYWlsdXJlIDEiLCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gVGVzdFBhcnRSZXN1bHRzCisvLyBhZnRlciB0d28gQXBwZW5kKCkgb3BlcmF0aW9ucy4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5VGVzdCwgQ29udGFpbnNHaXZlblJlc3VsdHNBZnRlclR3b0FwcGVuZHMpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOworICByZXN1bHRzLkFwcGVuZChyMV8pOworICByZXN1bHRzLkFwcGVuZChyMl8pOworICBFWFBFQ1RfRVEoMiwgcmVzdWx0cy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIkZhaWx1cmUgMSIsIHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJGYWlsdXJlIDIiLCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLm1lc3NhZ2UoKSk7Cit9CisKK3R5cGVkZWYgVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QgVGVzdFBhcnRSZXN1bHRBcnJheURlYXRoVGVzdDsKKworLy8gVGVzdHMgdGhhdCB0aGUgcHJvZ3JhbSBkaWVzIHdoZW4gR2V0VGVzdFBhcnRSZXN1bHQoKSBpcyBjYWxsZWQgd2l0aAorLy8gYW4gaW52YWxpZCBpbmRleC4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5RGVhdGhUZXN0LCBEaWVzV2hlbkluZGV4SXNPdXRPZkJvdW5kKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgcmVzdWx0cy5BcHBlbmQocjFfKTsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoLTEpLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKSwgIiIpOworfQorCisvLyBUT0RPKG1oZXVsZUBnb29nbGUuY29tKTogQWRkIGEgdGVzdCBmb3IgdGhlIGNsYXNzIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlci4KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmFhM2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYwpAQCAtMCwwICsxLDMyMCBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7Cit1c2luZyA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGU7Cit1c2luZyA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50OwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTsKK3VzaW5nIDo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOworCisvLyBUZXN0cyB0aGF0IHR1cGxlX2VsZW1lbnQ8SywgdHVwbGU8VDAsIFQxLCAuLi4sIFROPiA+Ojp0eXBlIHJldHVybnMgVEsuCitURVNUKHR1cGxlX2VsZW1lbnRfVGVzdCwgUmV0dXJuc0VsZW1lbnRUeXBlKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8aW50LCBjaGFyPiA+Ojp0eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50JiwgdHVwbGVfZWxlbWVudDwxLCB0dXBsZTxkb3VibGUsIGludCY+ID46OnR5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLCB0dXBsZV9lbGVtZW50PDIsIHR1cGxlPGRvdWJsZSwgaW50LCBib29sPiA+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IHR1cGxlX3NpemU8VD46OnZhbHVlIGdpdmVzIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlCisvLyB0eXBlIFQuCitURVNUKHR1cGxlX3NpemVfVGVzdCwgUmV0dXJuc051bWJlck9mRmllbGRzKSB7CisgIEVYUEVDVF9FUSgwLCArdHVwbGVfc2l6ZTx0dXBsZTw+ID46OnZhbHVlKTsKKyAgRVhQRUNUX0VRKDEsICt0dXBsZV9zaXplPHR1cGxlPHZvaWQqPiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9FUSgxLCArdHVwbGVfc2l6ZTx0dXBsZTxjaGFyPiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9FUSgxLCArKHR1cGxlX3NpemU8dHVwbGU8dHVwbGU8aW50LCBkb3VibGU+ID4gPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0VRKDIsICsodHVwbGVfc2l6ZTx0dXBsZTxpbnQmLCBjb25zdCBjaGFyPiA+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRVEoMywgKyh0dXBsZV9zaXplPHR1cGxlPGNoYXIqLCB2b2lkLCBjb25zdCBib29sJj4gPjo6dmFsdWUpKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIGEgdHVwbGUgd2l0aCBpdHNlbGYuCitURVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1dpdGhTZWxmKSB7CisgIGNvbnN0IHR1cGxlPGludCwgY2hhciwgYm9vbD4gYSg1LCAnYScsIGZhbHNlKTsKKworICBFWFBFQ1RfVFJVRShhID09IGEpOworICBFWFBFQ1RfRkFMU0UoYSAhPSBhKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHR3byB0dXBsZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KK1RFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzRXF1YWxUdXBsZXMpIHsKKyAgY29uc3QgdHVwbGU8aW50LCBib29sPiBhKDUsIHRydWUpLCBiKDUsIHRydWUpOworCisgIEVYUEVDVF9UUlVFKGEgPT0gYik7CisgIEVYUEVDVF9GQUxTRShhICE9IGIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgdHdvIGRpZmZlcmVudCB0dXBsZXMgdGhhdCBoYXZlIG5vIHJlZmVyZW5jZSBmaWVsZHMuCitURVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1VuZXF1YWxUdXBsZXNXaXRob3V0UmVmZXJlbmNlRmllbGRzKSB7CisgIHR5cGVkZWYgdHVwbGU8Y29uc3QgaW50LCBjaGFyPiBGb29UdXBsZTsKKworICBjb25zdCBGb29UdXBsZSBhKDAsICd4Jyk7CisgIGNvbnN0IEZvb1R1cGxlIGIoMSwgJ2EnKTsKKworICBFWFBFQ1RfVFJVRShhICE9IGIpOworICBFWFBFQ1RfRkFMU0UoYSA9PSBiKTsKKworICBjb25zdCBGb29UdXBsZSBjKDEsICdiJyk7CisKKyAgRVhQRUNUX1RSVUUoYiAhPSBjKTsKKyAgRVhQRUNUX0ZBTFNFKGIgPT0gYyk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB0d28gZGlmZmVyZW50IHR1cGxlcyB0aGF0IGhhdmUgcmVmZXJlbmNlIGZpZWxkcy4KK1RFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzVW5lcXVhbFR1cGxlc1dpdGhSZWZlcmVuY2VGaWVsZHMpIHsKKyAgdHlwZWRlZiB0dXBsZTxpbnQmLCBjb25zdCBjaGFyJj4gRm9vVHVwbGU7CisKKyAgaW50IGkgPSA1OworICBjb25zdCBjaGFyIGNoID0gJ2EnOworICBjb25zdCBGb29UdXBsZSBhKGksIGNoKTsKKworICBpbnQgaiA9IDY7CisgIGNvbnN0IEZvb1R1cGxlIGIoaiwgY2gpOworCisgIEVYUEVDVF9UUlVFKGEgIT0gYik7CisgIEVYUEVDVF9GQUxTRShhID09IGIpOworCisgIGogPSA1OworICBjb25zdCBjaGFyIGNoMiA9ICdiJzsKKyAgY29uc3QgRm9vVHVwbGUgYyhqLCBjaDIpOworCisgIEVYUEVDVF9UUlVFKGIgIT0gYyk7CisgIEVYUEVDVF9GQUxTRShiID09IGMpOworfQorCisvLyBUZXN0cyB0aGF0IGEgdHVwbGUgZmllbGQgd2l0aCBhIHJlZmVyZW5jZSB0eXBlIGlzIGFuIGFsaWFzIG9mIHRoZQorLy8gdmFyaWFibGUgaXQncyBzdXBwb3NlZCB0byByZWZlcmVuY2UuCitURVNUKFJlZmVyZW5jZUZpZWxkVGVzdCwgSXNBbGlhc09mUmVmZXJlbmNlZFZhcmlhYmxlKSB7CisgIGludCBuID0gMDsKKyAgdHVwbGU8Ym9vbCwgaW50Jj4gdCh0cnVlLCBuKTsKKworICBuID0gMTsKKyAgRVhQRUNUX0VRKG4sIGdldDwxPih0KSkKKyAgICAgIDw8ICJDaGFuZ2luZyBhIHVuZGVybHlpbmcgdmFyaWFibGUgc2hvdWxkIHVwZGF0ZSB0aGUgcmVmZXJlbmNlIGZpZWxkLiI7CisKKyAgLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nIGZ1bm55IHdpdGgKKyAgLy8gdGhlICYgb3BlcmF0b3IgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBnZXQ8PigpLgorICBFWFBFQ1RfRVEoJm4sICYoZ2V0PDE+KHQpKSkKKyAgICAgIDw8ICJUaGUgYWRkcmVzcyBvZiBhIHJlZmVyZW5jZSBmaWVsZCBzaG91bGQgZXF1YWwgdGhlIGFkZHJlc3Mgb2YgIgorICAgICAgPDwgInRoZSB1bmRlcmx5aW5nIHZhcmlhYmxlLiI7CisKKyAgZ2V0PDE+KHQpID0gMjsKKyAgRVhQRUNUX0VRKDIsIG4pCisgICAgICA8PCAiQ2hhbmdpbmcgYSByZWZlcmVuY2UgZmllbGQgc2hvdWxkIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YXJpYWJsZS4iOworfQorCisvLyBUZXN0cyB0aGF0IHR1cGxlJ3MgZGVmYXVsdCBjb25zdHJ1Y3RvciBkZWZhdWx0IGluaXRpYWxpemVzIGVhY2ggZmllbGQuCisvLyBUaGlzIHRlc3QgbmVlZHMgdG8gY29tcGlsZSB3aXRob3V0IGdlbmVyYXRpbmcgd2FybmluZ3MuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JEZWZhdWx0SW5pdGlhbGl6ZXNFYWNoRmllbGQpIHsKKyAgLy8gVGhlIFRSMSByZXBvcnQgcmVxdWlyZXMgdGhhdCB0dXBsZSdzIGRlZmF1bHQgY29uc3RydWN0b3IgZGVmYXVsdAorICAvLyBpbml0aWFsaXplcyBlYWNoIGZpZWxkLCBldmVuIGlmIGl0J3MgYSBwcmltaXRpdmUgdHlwZS4gIElmIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBmb3JnZXRzIHRvIGRvIHRoaXMsIHRoaXMgdGVzdCB3aWxsIGNhdGNoIGl0IGJ5CisgIC8vIGdlbmVyYXRpbmcgd2FybmluZ3MgYWJvdXQgdXNpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgKGFzc3VtaW5nCisgIC8vIGEgZGVjZW50IGNvbXBpbGVyKS4KKworICB0dXBsZTw+IGVtcHR5OworCisgIHR1cGxlPGludD4gYTEsIGIxOworICBiMSA9IGExOworICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIxKSk7CisKKyAgdHVwbGU8aW50LCBkb3VibGU+IGEyLCBiMjsKKyAgYjIgPSBhMjsKKyAgRVhQRUNUX0VRKDAsIGdldDwwPihiMikpOworICBFWFBFQ1RfRVEoMC4wLCBnZXQ8MT4oYjIpKTsKKworICB0dXBsZTxkb3VibGUsIGNoYXIsIGJvb2wqPiBhMywgYjM7CisgIGIzID0gYTM7CisgIEVYUEVDVF9FUSgwLjAsIGdldDwwPihiMykpOworICBFWFBFQ1RfRVEoJ1wwJywgZ2V0PDE+KGIzKSk7CisgIEVYUEVDVF9UUlVFKGdldDwyPihiMykgPT0gTlVMTCk7CisKKyAgdHVwbGU8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBhMTAsIGIxMDsKKyAgYjEwID0gYTEwOworICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDE+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDI+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDM+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDQ+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDU+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDY+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDc+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDg+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDk+KGIxMCkpOworfQorCisvLyBUZXN0cyBjb25zdHJ1Y3RpbmcgYSB0dXBsZSBmcm9tIGl0cyBmaWVsZHMuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBDb25zdHJ1Y3RzRnJvbUZpZWxkcykgeworICBpbnQgbiA9IDE7CisgIC8vIFJlZmVyZW5jZSBmaWVsZC4KKyAgdHVwbGU8aW50Jj4gYShuKTsKKyAgRVhQRUNUX0VRKCZuLCAmKGdldDwwPihhKSkpOworCisgIC8vIE5vbi1yZWZlcmVuY2UgZmllbGRzLgorICB0dXBsZTxpbnQsIGNoYXI+IGIoNSwgJ2EnKTsKKyAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSgnYScsIGdldDwxPihiKSk7CisKKyAgLy8gQ29uc3QgcmVmZXJlbmNlIGZpZWxkLgorICBjb25zdCBpbnQgbSA9IDI7CisgIHR1cGxlPGJvb2wsIGNvbnN0IGludCY+IGModHJ1ZSwgbSk7CisgIEVYUEVDVF9UUlVFKGdldDwwPihjKSk7CisgIEVYUEVDVF9FUSgmbSwgJihnZXQ8MT4oYykpKTsKK30KKworLy8gVGVzdHMgdHVwbGUncyBjb3B5IGNvbnN0cnVjdG9yLgorVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIHR1cGxlPGRvdWJsZSwgYm9vbD4gYSgwLjAsIHRydWUpOworICB0dXBsZTxkb3VibGUsIGJvb2w+IGIoYSk7CisKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIGdldDwwPihiKSk7CisgIEVYUEVDVF9UUlVFKGdldDwxPihiKSk7Cit9CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIHR1cGxlIGZyb20gYW5vdGhlciB0dXBsZSB0aGF0IGhhcyBhIGNvbXBhdGlibGUKKy8vIGJ1dCBkaWZmZXJlbnQgdHlwZS4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tRGlmZmVyZW50VHVwbGVUeXBlKSB7CisgIHR1cGxlPGludCwgaW50LCBjaGFyPiBhKDAsIDEsICdhJyk7CisgIHR1cGxlPGRvdWJsZSwgbG9uZywgaW50PiBiKGEpOworCisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoMSwgZ2V0PDE+KGIpKTsKKyAgRVhQRUNUX0VRKCdhJywgZ2V0PDI+KGIpKTsKK30KKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgMi10dXBsZSBmcm9tIGFuIHN0ZDo6cGFpci4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tUGFpcikgeworICA6OnN0ZDo6cGFpcjxpbnQsIGNoYXI+IGEoMSwgJ2EnKTsKKyAgdHVwbGU8aW50LCBjaGFyPiBiKGEpOworICB0dXBsZTxpbnQsIGNvbnN0IGNoYXImPiBjKGEpOworfQorCisvLyBUZXN0cyBhc3NpZ25pbmcgYSB0dXBsZSB0byBhbm90aGVyIHR1cGxlIHdpdGggdGhlIHNhbWUgdHlwZS4KK1RFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc1RvU2FtZVR1cGxlVHlwZSkgeworICBjb25zdCB0dXBsZTxpbnQsIGxvbmc+IGEoNSwgN0wpOworICB0dXBsZTxpbnQsIGxvbmc+IGI7CisgIGIgPSBhOworICBFWFBFQ1RfRVEoNSwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX0VRKDdMLCBnZXQ8MT4oYikpOworfQorCisvLyBUZXN0cyBhc3NpZ25pbmcgYSB0dXBsZSB0byBhbm90aGVyIHR1cGxlIHdpdGggYSBkaWZmZXJlbnQgYnV0CisvLyBjb21wYXRpYmxlIHR5cGUuCitURVNUKFR1cGxlQXNzaWdubWVudFRlc3QsIEFzc2lnbnNUb0RpZmZlcmVudFR1cGxlVHlwZSkgeworICBjb25zdCB0dXBsZTxpbnQsIGxvbmcsIGJvb2w+IGEoMSwgN0wsIHRydWUpOworICB0dXBsZTxsb25nLCBpbnQsIGJvb2w+IGI7CisgIGIgPSBhOworICBFWFBFQ1RfRVEoMUwsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSg3LCBnZXQ8MT4oYikpOworICBFWFBFQ1RfVFJVRShnZXQ8Mj4oYikpOworfQorCisvLyBUZXN0cyBhc3NpZ25pbmcgYW4gc3RkOjpwYWlyIHRvIGEgMi10dXBsZS4KK1RFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc0Zyb21QYWlyKSB7CisgIGNvbnN0IDo6c3RkOjpwYWlyPGludCwgYm9vbD4gYSg1LCB0cnVlKTsKKyAgdHVwbGU8aW50LCBib29sPiBiOworICBiID0gYTsKKyAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7CisgIEVYUEVDVF9UUlVFKGdldDwxPihiKSk7CisKKyAgdHVwbGU8bG9uZywgYm9vbD4gYzsKKyAgYyA9IGE7CisgIEVYUEVDVF9FUSg1TCwgZ2V0PDA+KGMpKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDE+KGMpKTsKK30KKworLy8gQSBmaXh0dXJlIGZvciB0ZXN0aW5nIGJpZyB0dXBsZXMuCitjbGFzcyBCaWdUdXBsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludD4gQmlnVHVwbGU7CisKKyAgQmlnVHVwbGVUZXN0KCkgOgorICAgICAgYV8oMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiksCisgICAgICBiXygxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzKSB7fQorCisgIEJpZ1R1cGxlIGFfLCBiXzsKK307CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBiaWcgdHVwbGVzLgorVEVTVF9GKEJpZ1R1cGxlVGVzdCwgQ29uc3RydWN0aW9uKSB7CisgIEJpZ1R1cGxlIGE7CisgIEJpZ1R1cGxlIGIoYl8pOworfQorCisvLyBUZXN0cyB0aGF0IGdldDxOPih0KSByZXR1cm5zIHRoZSBOLXRoICgwLWJhc2VkKSBmaWVsZCBvZiB0dXBsZSB0LgorVEVTVF9GKEJpZ1R1cGxlVGVzdCwgZ2V0KSB7CisgIEVYUEVDVF9FUSgxLCBnZXQ8MD4oYV8pKTsKKyAgRVhQRUNUX0VRKDIsIGdldDw5PihhXykpOworCisgIC8vIFRlc3RzIHRoYXQgZ2V0KCkgd29ya3Mgb24gYSBjb25zdCB0dXBsZSB0b28uCisgIGNvbnN0IEJpZ1R1cGxlIGEoYV8pOworICBFWFBFQ1RfRVEoMSwgZ2V0PDA+KGEpKTsKKyAgRVhQRUNUX0VRKDIsIGdldDw5PihhKSk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBiaWcgdHVwbGVzLgorVEVTVF9GKEJpZ1R1cGxlVGVzdCwgQ29tcGFyaXNvbnMpIHsKKyAgRVhQRUNUX1RSVUUoYV8gPT0gYV8pOworICBFWFBFQ1RfRkFMU0UoYV8gIT0gYV8pOworCisgIEVYUEVDVF9UUlVFKGFfICE9IGJfKTsKKyAgRVhQRUNUX0ZBTFNFKGFfID09IGJfKTsKK30KKworVEVTVChNYWtlVHVwbGVUZXN0LCBXb3Jrc0ZvclNjYWxhclR5cGVzKSB7CisgIHR1cGxlPGJvb2wsIGludD4gYTsKKyAgYSA9IG1ha2VfdHVwbGUodHJ1ZSwgNSk7CisgIEVYUEVDVF9UUlVFKGdldDwwPihhKSk7CisgIEVYUEVDVF9FUSg1LCBnZXQ8MT4oYSkpOworCisgIHR1cGxlPGNoYXIsIGludCwgbG9uZz4gYjsKKyAgYiA9IG1ha2VfdHVwbGUoJ2EnLCAnYicsIDUpOworICBFWFBFQ1RfRVEoJ2EnLCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoJ2InLCBnZXQ8MT4oYikpOworICBFWFBFQ1RfRVEoNSwgZ2V0PDI+KGIpKTsKK30KKworVEVTVChNYWtlVHVwbGVUZXN0LCBXb3Jrc0ZvclBvaW50ZXJzKSB7CisgIGludCBhW10gPSB7IDEsIDIsIDMsIDQgfTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gImhpIjsKKyAgaW50KiBjb25zdCBwID0gYTsKKworICB0dXBsZTxjb25zdCBjaGFyKiwgaW50Kj4gdDsKKyAgdCA9IG1ha2VfdHVwbGUoc3RyLCBwKTsKKyAgRVhQRUNUX0VRKHN0ciwgZ2V0PDA+KHQpKTsKKyAgRVhQRUNUX0VRKHAsIGdldDwxPih0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NDcwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBUZXN0cyB0aGF0IHRoZSBzYW1lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlCisvLyBpbnN0YW50aWF0ZWQgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KKy8vIChDb250YWluZXJUZXN0IGlzIGFsc28gaW5zdGFudGlhdGVkIGluIGd0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYy4pCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChWZWN0b3IsIENvbnRhaW5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpUeXBlczxzdGQ6OnZlY3RvcjxpbnQ+ID4pOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRiYTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCkBAIC0wLDAgKzEsMzYwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyB0ZXN0aW5nOjpUZXN0OworCisvLyBVc2VkIGZvciB0ZXN0aW5nIHRoYXQgU2V0VXBUZXN0Q2FzZSgpL1RlYXJEb3duVGVzdENhc2UoKSwgZml4dHVyZQorLy8gY3Rvci9kdG9yLCBhbmQgU2V0VXAoKS9UZWFyRG93bigpIHdvcmsgY29ycmVjdGx5IGluIHR5cGVkIHRlc3RzIGFuZAorLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENvbW1vblRlc3QgOiBwdWJsaWMgVGVzdCB7CisgIC8vIEZvciBzb21lIHRlY2huaWNhbCByZWFzb24sIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpCisgIC8vIG11c3QgYmUgcHVibGljLgorIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBzaGFyZWRfID0gbmV3IFQoNSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGRlbGV0ZSBzaGFyZWRfOworICAgIHNoYXJlZF8gPSBOVUxMOworICB9CisKKyAgLy8gVGhpcyAncHJvdGVjdGVkOicgaXMgb3B0aW9uYWwuICBUaGVyZSdzIG5vIGhhcm0gaW4gbWFraW5nIGFsbAorICAvLyBtZW1iZXJzIG9mIHRoaXMgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBwdWJsaWMuCisgcHJvdGVjdGVkOgorICAvLyBXZSB1c2VkIHRvIHVzZSBzdGQ6Omxpc3QgaGVyZSwgYnV0IHN3aXRjaGVkIHRvIHN0ZDo6dmVjdG9yIHNpbmNlCisgIC8vIE1TVkMncyA8bGlzdD4gZG9lc24ndCBjb21waWxlIGNsZWFubHkgd2l0aCAvVzQuCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VD4gVmVjdG9yOworICB0eXBlZGVmIHN0ZDo6c2V0PGludD4gSW50U2V0OworCisgIENvbW1vblRlc3QoKSA6IHZhbHVlXygxKSB7fQorCisgIHZpcnR1YWwgfkNvbW1vblRlc3QoKSB7IEVYUEVDVF9FUSgzLCB2YWx1ZV8pOyB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEVYUEVDVF9FUSgxLCB2YWx1ZV8pOworICAgIHZhbHVlXysrOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEVYUEVDVF9FUSgyLCB2YWx1ZV8pOworICAgIHZhbHVlXysrOworICB9CisKKyAgVCB2YWx1ZV87CisgIHN0YXRpYyBUKiBzaGFyZWRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBDb21tb25UZXN0PFQ+OjpzaGFyZWRfID0gTlVMTDsKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdHlwZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7CisKKy8vIFRlc3RzIHRoYXQgU2V0VXBUZXN0Q2FzZSgpL1RlYXJEb3duVGVzdENhc2UoKSwgZml4dHVyZSBjdG9yL2R0b3IsCisvLyBhbmQgU2V0VXAoKS9UZWFyRG93bigpIHdvcmsgY29ycmVjdGx5IGluIHR5cGVkIHRlc3RzCisKK3R5cGVkZWYgVHlwZXM8Y2hhciwgaW50PiBUd29UeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShDb21tb25UZXN0LCBUd29UeXBlcyk7CisKK1RZUEVEX1RFU1QoQ29tbW9uVGVzdCwgVmFsdWVzQXJlQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYmUgdmlzaXRlZCB2aWEKKyAgLy8gdGhlIFRlc3RGaXh0dXJlOjogcHJlZml4LgorICBFWFBFQ1RfRVEoNSwgKlRlc3RGaXh0dXJlOjpzaGFyZWRfKTsKKworICAvLyBUeXBlZGVmcyBpbiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYmUgdmlzaXRlZCB2aWEgdGhlCisgIC8vICJ0eXBlbmFtZSBUZXN0Rml4dHVyZTo6IiBwcmVmaXguCisgIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpWZWN0b3IgZW1wdHk7CisgIEVYUEVDVF9FUSgwVSwgZW1wdHkuc2l6ZSgpKTsKKworICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6SW50U2V0IGVtcHR5MjsKKyAgRVhQRUNUX0VRKDBVLCBlbXB0eTIuc2l6ZSgpKTsKKworICAvLyBOb24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgbXVzdCBiZSB2aXNpdGVkIHZpYQorICAvLyAndGhpcycsIGFzIHJlcXVpcmVkIGJ5IEMrKyBmb3IgY2xhc3MgdGVtcGxhdGVzLgorICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKK30KKworLy8gVGhlIHNlY29uZCB0ZXN0IG1ha2VzIHN1cmUgc2hhcmVkXyBpcyBub3QgZGVsZXRlZCBhZnRlciB0aGUgZmlyc3QKKy8vIHRlc3QuCitUWVBFRF9URVNUKENvbW1vblRlc3QsIFZhbHVlc0FyZVN0aWxsQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYWxzbyBiZSB2aXNpdGVkCisgIC8vIHZpYSAndGhpcycuCisgIEFTU0VSVF9UUlVFKHRoaXMtPnNoYXJlZF8gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSg1LCAqdGhpcy0+c2hhcmVkXyk7CisKKyAgLy8gVHlwZVBhcmFtIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PFR5cGVQYXJhbT4oMiksIHRoaXMtPnZhbHVlXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbXVsdGlwbGUgVFlQRURfVEVTVF9DQVNFJ3MgY2FuIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUKKy8vIHRyYW5zbGF0aW9uIHVuaXQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0MSA6IHB1YmxpYyBUZXN0IHsKK307CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBUWVBFRF9URVNUX0NBU0UgY2FuIGJlIGEKKy8vIHNpbmdsZSB0eXBlLgorVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdDEsIGludCk7CitUWVBFRF9URVNUKFR5cGVkVGVzdDEsIEEpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0MiA6IHB1YmxpYyBUZXN0IHsKK307CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBUWVBFRF9URVNUX0NBU0UgY2FuIGJlIGEKKy8vIFR5cGVzPC4uLj4gdHlwZSBsaXN0LgorVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdDIsIFR5cGVzPGludD4pOworCisvLyBUaGlzIGFsc28gdmVyaWZpZXMgdGhhdCB0ZXN0cyBmcm9tIGRpZmZlcmVudCB0eXBlZCB0ZXN0IGNhc2VzIGNhbgorLy8gc2hhcmUgdGhlIHNhbWUgbmFtZS4KK1RZUEVEX1RFU1QoVHlwZWRUZXN0MiwgQSkge30KKworLy8gVGVzdHMgdGhhdCBhIHR5cGVkIHRlc3QgY2FzZSBjYW4gYmUgZGVmaW5lZCBpbiBhIG5hbWVzcGFjZS4KKworbmFtZXNwYWNlIGxpYnJhcnkxIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBOdW1lcmljVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK3R5cGVkZWYgVHlwZXM8aW50LCBsb25nPiBOdW1lcmljVHlwZXM7CitUWVBFRF9URVNUX0NBU0UoTnVtZXJpY1Rlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoTnVtZXJpY1Rlc3QsIERlZmF1bHRJc1plcm8pIHsKKyAgRVhQRUNUX0VRKDAsIFR5cGVQYXJhbSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGxpYnJhcnkxCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZWRUZXN0Q2FzZVBTdGF0ZTsKKworLy8gVGVzdHMgVHlwZWRUZXN0Q2FzZVBTdGF0ZS4KKworY2xhc3MgVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAwLCAiRm9vVGVzdCIsICJBIik7CisgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAwLCAiRm9vVGVzdCIsICJCIik7CisgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAwLCAiRm9vVGVzdCIsICJDIik7CisgIH0KKworICBUeXBlZFRlc3RDYXNlUFN0YXRlIHN0YXRlXzsKK307CisKK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlVGVzdCwgU3VjY2VlZHNGb3JNYXRjaGluZ0xpc3QpIHsKKyAgY29uc3QgY2hhciogdGVzdHMgPSAiQSwgQiwgQyI7CisgIEVYUEVDVF9FUSh0ZXN0cywKKyAgICAgICAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCB0ZXN0cykpOworfQorCisvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSB0ZXN0cyBhbmQgc3BhY2VzIGFyb3VuZCB0aGUgbmFtZXMKKy8vIGRvbid0IG1hdHRlci4KK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlVGVzdCwgSWdub3Jlc09yZGVyQW5kU3BhY2VzKSB7CisgIGNvbnN0IGNoYXIqIHRlc3RzID0gIkEsQywgICBCIjsKKyAgRVhQRUNUX0VRKHRlc3RzLAorICAgICAgICAgICAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsIHRlc3RzKSk7Cit9CisKK3R5cGVkZWYgVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QgVHlwZWRUZXN0Q2FzZVBTdGF0ZURlYXRoVGVzdDsKKworVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNEdXBsaWNhdGVzKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEIsIEEsIEMiKSwKKyAgICAgICJmb29cXC5jYy4xLj86IFRlc3QgQSBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2VcXC4iKTsKK30KKworVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNFeHRyYVRlc3QpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQiwgQywgRCIpLAorICAgICAgImZvb1xcLmNjLjEuPzogTm8gdGVzdCBuYW1lZCBEIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHRlc3QgY2FzZVxcLiIpOworfQorCitURVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZURlYXRoVGVzdCwgRGV0ZWN0c01pc3NlZFRlc3QpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQyIpLAorICAgICAgImZvb1xcLmNjLjEuPzogWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgQlxcLiIpOworfQorCisvLyBUZXN0cyB0aGF0IGRlZmluaW5nIGEgdGVzdCBmb3IgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBnZW5lcmF0ZXMKKy8vIGEgcnVuLXRpbWUgZXJyb3IgaWYgdGhlIHRlc3QgY2FzZSBoYXMgYmVlbiByZWdpc3RlcmVkLgorVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNUZXN0QWZ0ZXJSZWdpc3RyYXRpb24pIHsKKyAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsICJBLCBCLCBDIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uQWRkVGVzdE5hbWUoImZvby5jYyIsIDIsICJGb29UZXN0IiwgIkQiKSwKKyAgICAgICJmb29cXC5jYy4yLj86IFRlc3QgRCBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QIgorICAgICAgIlxcKEZvb1Rlc3QsIFxcLlxcLlxcLlxcKVxcLiIpOworfQorCisvLyBUZXN0cyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUgY3Rvci9kdG9yLAorLy8gYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQ29tbW9uVGVzdDxUPiB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChEZXJpdmVkVGVzdCk7CisKK1RZUEVEX1RFU1RfUChEZXJpdmVkVGVzdCwgVmFsdWVzQXJlQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYmUgdmlzaXRlZCB2aWEKKyAgLy8gdGhlIFRlc3RGaXh0dXJlOjogcHJlZml4LgorICBFWFBFQ1RfRVEoNSwgKlRlc3RGaXh0dXJlOjpzaGFyZWRfKTsKKworICAvLyBOb24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgbXVzdCBiZSB2aXNpdGVkIHZpYQorICAvLyAndGhpcycsIGFzIHJlcXVpcmVkIGJ5IEMrKyBmb3IgY2xhc3MgdGVtcGxhdGVzLgorICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKK30KKworLy8gVGhlIHNlY29uZCB0ZXN0IG1ha2VzIHN1cmUgc2hhcmVkXyBpcyBub3QgZGVsZXRlZCBhZnRlciB0aGUgZmlyc3QKKy8vIHRlc3QuCitUWVBFRF9URVNUX1AoRGVyaXZlZFRlc3QsIFZhbHVlc0FyZVN0aWxsQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYWxzbyBiZSB2aXNpdGVkCisgIC8vIHZpYSAndGhpcycuCisgIEFTU0VSVF9UUlVFKHRoaXMtPnNoYXJlZF8gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSg1LCAqdGhpcy0+c2hhcmVkXyk7CisgIEVYUEVDVF9FUSgyLCB0aGlzLT52YWx1ZV8pOworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChEZXJpdmVkVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0FyZUNvcnJlY3QsIFZhbHVlc0FyZVN0aWxsQ29ycmVjdCk7CisKK3R5cGVkZWYgVHlwZXM8c2hvcnQsIGxvbmc+IE15VHdvVHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRGVyaXZlZFRlc3QsIE15VHdvVHlwZXMpOworCisvLyBUZXN0cyB0aGF0IG11bHRpcGxlIFRZUEVEX1RFU1RfQ0FTRV9QJ3MgY2FuIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUKKy8vIHRyYW5zbGF0aW9uIHVuaXQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0UDEgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMSk7CisKKy8vIEZvciB0ZXN0aW5nIHRoYXQgdGhlIGNvZGUgYmV0d2VlbiBUWVBFRF9URVNUX0NBU0VfUCgpIGFuZAorLy8gVFlQRURfVEVTVF9QKCkgaXMgbm90IGVuY2xvc2VkIGluIGEgbmFtZXNwYWNlLgordHlwZWRlZiBpbnQgSW50QWZ0ZXJUeXBlZFRlc3RDYXNlUDsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAxLCBBKSB7fQorVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAxLCBCKSB7fQorCisvLyBGb3IgdGVzdGluZyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9QKCkgYW5kCisvLyBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCgpIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG5hbWVzcGFjZS4KK3R5cGVkZWYgaW50IEludEJlZm9yZVJlZ2lzdGVyVHlwZWRUZXN0Q2FzZVA7CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAxLCBBLCBCKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3RQMiA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAyKTsKKworLy8gVGhpcyBhbHNvIHZlcmlmaWVzIHRoYXQgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdHlwZS1wYXJhbWV0ZXJpemVkCisvLyB0ZXN0IGNhc2VzIGNhbiBzaGFyZSB0aGUgc2FtZSBuYW1lLgorVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAyLCBBKSB7fQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMiwgQSk7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvZGUgYmV0d2VlbiBUWVBFRF9URVNUX0NBU0VfUCgpIGFuZAorLy8gUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoKSBpcyBub3QgZW5jbG9zZWQgaW4gYSBuYW1lc3BhY2UuCitJbnRBZnRlclR5cGVkVGVzdENhc2VQIGFmdGVyID0gMDsKK0ludEJlZm9yZVJlZ2lzdGVyVHlwZWRUZXN0Q2FzZVAgYmVmb3JlID0gMDsKKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgbGFzdCBhcmd1bWVudCBvZiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUCgpCisvLyBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHR5cGUgb3IgYSBUeXBlczwuLi4+IHR5cGUgbGlzdC4KK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKEludCwgVHlwZWRUZXN0UDEsIGludCk7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChJbnQsIFR5cGVkVGVzdFAyLCBUeXBlczxpbnQ+KTsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHRyYW5zbGF0aW9uIHVuaXQuCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChEb3VibGUsIFR5cGVkVGVzdFAyLCBUeXBlczxkb3VibGU+KTsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCisvLyAoQ29udGFpbmVyVGVzdCBpcyBhbHNvIGluc3RhbnRpYXRlZCBpbiBndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MuKQordHlwZWRlZiBUeXBlczxzdGQ6OnZlY3Rvcjxkb3VibGU+LCBzdGQ6OnNldDxjaGFyPiA+IE15Q29udGFpbmVyczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBDb250YWluZXJUZXN0LCBNeUNvbnRhaW5lcnMpOworCisvLyBUZXN0cyB0aGF0IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgZGVmaW5lZCBhbmQKKy8vIGluc3RhbnRpYXRlZCBpbiBhIG5hbWVzcGFjZS4KKworbmFtZXNwYWNlIGxpYnJhcnkyIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBOdW1lcmljVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKE51bWVyaWNUZXN0KTsKKworVFlQRURfVEVTVF9QKE51bWVyaWNUZXN0LCBEZWZhdWx0SXNaZXJvKSB7CisgIEVYUEVDVF9FUSgwLCBUeXBlUGFyYW0oKSk7Cit9CisKK1RZUEVEX1RFU1RfUChOdW1lcmljVGVzdCwgWmVyb0lzTGVzc1RoYW5PbmUpIHsKKyAgRVhQRUNUX0xUKFR5cGVQYXJhbSgwKSwgVHlwZVBhcmFtKDEpKTsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoTnVtZXJpY1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0SXNaZXJvLCBaZXJvSXNMZXNzVGhhbk9uZSk7Cit0eXBlZGVmIFR5cGVzPGludCwgZG91YmxlPiBOdW1lcmljVHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgTnVtZXJpY1Rlc3QsIE51bWVyaWNUeXBlcyk7CisKK30gIC8vIG5hbWVzcGFjZSBsaWJyYXJ5MgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2lmICFkZWZpbmVkKEdURVNUX0hBU19UWVBFRF9URVNUKSAmJiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVF9QKQorCisvLyBHb29nbGUgVGVzdCBtYXkgbm90IHN1cHBvcnQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggc29tZQorLy8gY29tcGlsZXJzLiBJZiB3ZSB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gY29tcGlsZSBvdXQgYWxsCisvLyBjb2RlIHJlZmVycmluZyB0byB0aGUgZ3Rlc3RfbWFpbiBsaWJyYXJ5LCBNU1ZDIGxpbmtlciB3aWxsIG5vdCBsaW5rCisvLyB0aGF0IGxpYnJhcnkgYXQgYWxsIGFuZCBjb25zZXF1ZW50bHkgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBlbnRyeQorLy8gcG9pbnQgZGVmaW5lZCBpbiB0aGF0IGxpYnJhcnkgKGZhdGFsIGVycm9yIExOSzE1NjE6IGVudHJ5IHBvaW50CisvLyBtdXN0IGJlIGRlZmluZWQpLiBUaGlzIGR1bW15IHRlc3Qga2VlcHMgZ3Rlc3RfbWFpbiBsaW5rZWQgaW4uCitURVNUKER1bW15VGVzdCwgVHlwZWRUZXN0c0FyZU5vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQorCisjZW5kaWYgIC8vICNpZiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVCkgJiYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkNzU3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9URVNUX0dURVNUX1RZUEVEX1RFU1RfVEVTVF9IXworI2RlZmluZSBHVEVTVF9URVNUX0dURVNUX1RZUEVEX1RFU1RfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworLy8gRm9yIHRlc3RpbmcgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCisvLyBDb250YWluZXJUZXN0IHdpbGwgYmUgaW5zdGFudGlhdGVkIGluIGJvdGggZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCisvLyBhbmQgZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDb250YWluZXJUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoQ29udGFpbmVyVGVzdCk7CisKK1RZUEVEX1RFU1RfUChDb250YWluZXJUZXN0LCBDYW5CZURlZmF1bHRDb25zdHJ1Y3RlZCkgeworICBUeXBlUGFyYW0gY29udGFpbmVyOworfQorCitUWVBFRF9URVNUX1AoQ29udGFpbmVyVGVzdCwgSW5pdGlhbFNpemVJc1plcm8pIHsKKyAgVHlwZVBhcmFtIGNvbnRhaW5lcjsKKyAgRVhQRUNUX0VRKDBVLCBjb250YWluZXIuc2l6ZSgpKTsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoQ29udGFpbmVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbkJlRGVmYXVsdENvbnN0cnVjdGVkLCBJbml0aWFsU2l6ZUlzWmVybyk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisjZW5kaWYgIC8vIEdURVNUX1RFU1RfR1RFU1RfVFlQRURfVEVTVF9URVNUX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0LXVuaXR0ZXN0LWFwaV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDgzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYwpAQCAtMCwwICsxLDM0MSBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgdmVyaWZ5aW5nIGNvcnJlY3RuZXNzIG9mIGRhdGEgcHJvdmlkZWQgdmlhCisvLyBVbml0VGVzdCdzIHB1YmxpYyBtZXRob2RzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIHN0cmNtcC4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IExlc3NCeU5hbWUgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCogYSwgY29uc3QgVCogYikgeworICAgIHJldHVybiBzdHJjbXAoYS0+bmFtZSgpLCBiLT5uYW1lKCkpIDwgMDsKKyAgfQorfTsKKworY2xhc3MgVW5pdFRlc3RIZWxwZXIgeworIHB1YmxpYzoKKyAgLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHRlc3QgY2FzZXMgc29ydGVkIGJ5IHRoZSB0ZXN0IGNhc2UKKyAgLy8gbmFtZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBhcnJheS4KKyAgc3RhdGljIFRlc3RDYXNlIGNvbnN0KiogY29uc3QgR2V0U29ydGVkVGVzdENhc2VzKCkgeworICAgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisgICAgVGVzdENhc2UgY29uc3QqKiBjb25zdCB0ZXN0X2Nhc2VzID0KKyAgICAgICAgbmV3IGNvbnN0IFRlc3RDYXNlKlt1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCldOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkKKyAgICAgIHRlc3RfY2FzZXNbaV0gPSB1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisKKyAgICBzdGQ6OnNvcnQodGVzdF9jYXNlcywKKyAgICAgICAgICAgICAgdGVzdF9jYXNlcyArIHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSwKKyAgICAgICAgICAgICAgTGVzc0J5TmFtZTxUZXN0Q2FzZT4oKSk7CisgICAgcmV0dXJuIHRlc3RfY2FzZXM7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgYnkgaXRzIG5hbWUuICBUaGUgY2FsbGVyIGRvZXNuJ3Qgb3duIHRoZSByZXR1cm5lZAorICAvLyBwb2ludGVyLgorICBzdGF0aWMgY29uc3QgVGVzdENhc2UqIEZpbmRUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgVW5pdFRlc3QmIHVuaXRfdGVzdCA9ICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgICAgaWYgKDAgPT0gc3RyY21wKHRlc3RfY2FzZS0+bmFtZSgpLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIHRlc3RfY2FzZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBhcnJheSBvZiBwb2ludGVycyB0byBhbGwgdGVzdHMgaW4gYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZQorICAvLyBzb3J0ZWQgYnkgdGhlIHRlc3QgbmFtZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQorICAvLyBhcnJheS4KKyAgc3RhdGljIFRlc3RJbmZvIGNvbnN0KiogY29uc3QgR2V0U29ydGVkVGVzdHMoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICAgIFRlc3RJbmZvIGNvbnN0KiogY29uc3QgdGVzdHMgPQorICAgICAgICBuZXcgY29uc3QgVGVzdEluZm8qW3Rlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkKKyAgICAgIHRlc3RzW2ldID0gdGVzdF9jYXNlLT5HZXRUZXN0SW5mbyhpKTsKKworICAgIHN0ZDo6c29ydCh0ZXN0cywgdGVzdHMgKyB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICAgICAgTGVzc0J5TmFtZTxUZXN0SW5mbz4oKSk7CisgICAgcmV0dXJuIHRlc3RzOworICB9Cit9OworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUZXN0Q2FzZVdpdGhDb21tZW50VGVzdCA6IHB1YmxpYyBUZXN0IHt9OworVFlQRURfVEVTVF9DQVNFKFRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LCBUeXBlczxpbnQ+KTsKK1RZUEVEX1RFU1QoVGVzdENhc2VXaXRoQ29tbWVudFRlc3QsIER1bW15KSB7fQorCitjb25zdCBpbnQga1R5cGVkVGVzdENhc2VzID0gMTsKK2NvbnN0IGludCBrVHlwZWRUZXN0cyA9IDE7CisjZWxzZQorY29uc3QgaW50IGtUeXBlZFRlc3RDYXNlcyA9IDA7Citjb25zdCBpbnQga1R5cGVkVGVzdHMgPSAwOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBXZSBjYW4gb25seSB0ZXN0IHRoZSBhY2Nlc3NvcnMgdGhhdCBkbyBub3QgY2hhbmdlIHZhbHVlIHdoaWxlIHRlc3RzIHJ1bi4KKy8vIFNpbmNlIHRlc3RzIGNhbiBiZSBydW4gaW4gYW55IG9yZGVyLCB0aGUgdmFsdWVzIHRoZSBhY2Nlc3NvcnMgdGhhdCB0cmFjaworLy8gdGVzdCBleGVjdXRpb24gKHN1Y2ggYXMgZmFpbGVkX3Rlc3RfY291bnQpIGNhbiBub3QgYmUgcHJlZGljdGVkLgorVEVTVChBcGlUZXN0LCBVbml0VGVzdEltbXV0YWJsZUFjY2Vzc29yc1dvcmspIHsKKyAgVW5pdFRlc3QqIHVuaXRfdGVzdCA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgIEFTU0VSVF9FUSgyICsga1R5cGVkVGVzdENhc2VzLCB1bml0X3Rlc3QtPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDIsIHVuaXRfdGVzdC0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDUgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMyArIGtUeXBlZFRlc3RzLCB1bml0X3Rlc3QtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworCisgIGNvbnN0IFRlc3RDYXNlKiogY29uc3QgdGVzdF9jYXNlcyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0Q2FzZXMoKTsKKworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2VzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX1Rlc3QiLCB0ZXN0X2Nhc2VzWzFdLT5uYW1lKCkpOworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RfY2FzZXNbMl0tPm5hbWUoKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyAgZGVsZXRlW10gdGVzdF9jYXNlczsKKworICAvLyBUaGUgZm9sbG93aW5nIGxpbmVzIGluaXRpYXRlIGFjdGlvbnMgdG8gdmVyaWZ5IGNlcnRhaW4gbWV0aG9kcyBpbgorICAvLyBGaW5hbFN1Y2Nlc3NDaGVja2VyOjpUZWFyRG93bi4KKworICAvLyBSZWNvcmRzIGEgdGVzdCBwcm9wZXJ0eSB0byB2ZXJpZnkgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KCkuCisgIFJlY29yZFByb3BlcnR5KCJrZXkiLCAidmFsdWUiKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTnVsbChjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCAiYXJndW1lbnQgaXMgIiA8PCBzdHI7CisgIH0KKyAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKK30KKworVEVTVChBcGlUZXN0LCBUZXN0Q2FzZUltbXV0YWJsZUFjY2Vzc29yc1dvcmspIHsKKyAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkFwaVRlc3QiKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOworCisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpKTsKKyAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDMsIHRlc3RfY2FzZS0+dGVzdF90b19ydW5fY291bnQoKSk7CisgIEFTU0VSVF9FUSg0LCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSk7CisKKyAgY29uc3QgVGVzdEluZm8qKiB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOworCisgIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfRHVtbXkxIiwgdGVzdHNbMF0tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzBdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKKworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlRGlzYWJsZWRBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMV0tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzFdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzFdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5zaG91bGRfcnVuKCkpOworCisgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMl0tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzJdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzJdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5zaG91bGRfcnVuKCkpOworCisgIEVYUEVDVF9TVFJFUSgiVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbM10tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzNdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzNdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5zaG91bGRfcnVuKCkpOworCisgIGRlbGV0ZVtdIHRlc3RzOworICB0ZXN0cyA9IE5VTEw7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIik7CisgIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKKworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUShHZXRUeXBlTmFtZTxpbnQ+KCkuY19zdHIoKSwgdGVzdF9jYXNlLT50eXBlX3BhcmFtKCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOworCisgIHRlc3RzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RzKHRlc3RfY2FzZSk7CisKKyAgRVhQRUNUX1NUUkVRKCJEdW1teSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RzWzBdLT50eXBlX3BhcmFtKCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKKworICBkZWxldGVbXSB0ZXN0czsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKK30KKworVEVTVChBcGlUZXN0LCBUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yaykgeworICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiRElTQUJMRURfVGVzdCIpOworICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7CisKKyAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlLT50eXBlX3BhcmFtKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpKTsKKyAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZS0+dGVzdF90b19ydW5fY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSk7CisKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8oMCk7CisgIEVYUEVDVF9TVFJFUSgiRHVtbXkyIiwgdGVzdF9pbmZvLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2luZm8tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfRkFMU0UodGVzdF9pbmZvLT5zaG91bGRfcnVuKCkpOworfQorCisvLyBUaGVzZSB0d28gdGVzdHMgYXJlIGhlcmUgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0ZXN0aW5nCisvLyB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50LCBkaXNhYmxlZF90ZXN0X2NvdW50LCBhbmQgdGVzdF90b19ydW5fY291bnQuCitURVNUKEFwaVRlc3QsIERJU0FCTEVEX0R1bW15MSkge30KK1RFU1QoRElTQUJMRURfVGVzdCwgRHVtbXkyKSB7fQorCitjbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyIDogcHVibGljIEVudmlyb25tZW50IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBVbml0VGVzdCogdW5pdF90ZXN0ID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisKKyAgICBFWFBFQ1RfRVEoMSArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMyArIGtUeXBlZFRlc3RzLCB1bml0X3Rlc3QtPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdW5pdF90ZXN0LT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCB1bml0X3Rlc3QtPmZhaWxlZF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKHVuaXRfdGVzdC0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9GQUxTRSh1bml0X3Rlc3QtPkZhaWxlZCgpKTsKKyAgICBBU1NFUlRfRVEoMiArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSk7CisKKyAgICBjb25zdCBUZXN0Q2FzZSoqIGNvbnN0IHRlc3RfY2FzZXMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdENhc2VzKCk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2VzWzBdLT5uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2Nhc2VzWzBdLT50eXBlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzBdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzBdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICAgIEFTU0VSVF9FUSg0LCB0ZXN0X2Nhc2VzWzBdLT50b3RhbF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgzLCB0ZXN0X2Nhc2VzWzBdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMF0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMF0tPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdF9jYXNlc1swXS0+RmFpbGVkKCkpOworCisgICAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlc1sxXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlc1sxXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZXNbMV0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZXNbMV0tPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZXNbMV0tPnRvdGFsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMV0tPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlc1sxXS0+ZmFpbGVkX3Rlc3RfY291bnQoKSk7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RfY2FzZXNbMl0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0X2Nhc2VzWzJdLT50eXBlX3BhcmFtKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMl0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMl0tPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZXNbMl0tPnRvdGFsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZXNbMl0tPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlc1syXS0+ZmFpbGVkX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlc1syXS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VzWzJdLT5GYWlsZWQoKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiQXBpVGVzdCIpOworICAgIGNvbnN0IFRlc3RJbmZvKiogdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX0R1bW15MSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlRGlzYWJsZWRBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMV0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbMV0tPnRlc3RfY2FzZV9uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dmFsdWVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMV0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMV0tPnJlc3VsdCgpLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RzWzFdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMl0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbMl0tPnRlc3RfY2FzZV9uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dmFsdWVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMl0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMl0tPnJlc3VsdCgpLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RzWzJdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbM10tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbM10tPnRlc3RfY2FzZV9uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dmFsdWVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbM10tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbM10tPnJlc3VsdCgpLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3RzWzNdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5ID0gdGVzdHNbM10tPnJlc3VsdCgpLT5HZXRUZXN0UHJvcGVydHkoMCk7CisgICAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJ2YWx1ZSIsIHByb3BlcnR5LnZhbHVlKCkpOworCisgICAgZGVsZXRlW10gdGVzdHM7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICAgIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiKTsKKyAgICB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOworCisgICAgRVhQRUNUX1NUUkVRKCJEdW1teSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RzWzBdLT50eXBlX3BhcmFtKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzBdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzBdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1swXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgICBkZWxldGVbXSB0ZXN0czsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgICBkZWxldGVbXSB0ZXN0X2Nhc2VzOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyB0ZXN0aW5nOjppbnRlcm5hbDo6RmluYWxTdWNjZXNzQ2hlY2tlcigpKTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9hbGxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVhYTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGJ1aWxkIG1vc3Qgb2YgR29vZ2xlIFRlc3QncyBvd24gdGVzdHMKKy8vIGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLiAgVGhpcyBmaWxlIHNlcnZlcyB0aGlzIHB1cnBvc2UuCisjaW5jbHVkZSAidGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9wcm9kdWN0aW9uLmNjIgpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weSBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzgxOTE4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwyMTggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyBicmVhay1vbi1mYWlsdXJlIG1vZGUuCisKK0EgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIHNlZy1mYXVsdCB3aGVuIGFuIGFzc2VydGlvbiBmYWlscywgdXNpbmcKK2VpdGhlciB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUKKy0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnLiAgVGhpcyBzY3JpcHQgdGVzdHMgc3VjaCBmdW5jdGlvbmFsaXR5CitieSBpbnZva2luZyBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyAoYSBwcm9ncmFtIHdyaXR0ZW4gd2l0aAorR29vZ2xlIFRlc3QpIHdpdGggZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworCisjIENvbnN0YW50cy4KKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBicmVhay1vbi1mYWlsdXJlIG1vZGUuCitCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIgPSAnR1RFU1RfQlJFQUtfT05fRkFJTFVSRScKKworIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorQlJFQUtfT05fRkFJTFVSRV9GTEFHID0gJ2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmUnCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZS4KK1RIUk9XX09OX0ZBSUxVUkVfRU5WX1ZBUiA9ICdHVEVTVF9USFJPV19PTl9GQUlMVVJFJworCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBjYXRjaC1leGNlcHRpb25zIG1vZGUuCitDQVRDSF9FWENFUFRJT05TX0VOVl9WQVIgPSAnR1RFU1RfQ0FUQ0hfRVhDRVBUSU9OUycKKworIyBQYXRoIHRvIHRoZSBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyBwcm9ncmFtLgorRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAnZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8nKQorCisKKyMgVXRpbGl0aWVzLgorCisKK2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdmFsdWU7IHVuc2V0cyBpdCB3aGVuIHRoZQorICBnaXZlbiB2YWx1ZSBpcyBOb25lLgorICAiIiIKKworICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICBlbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKKyAgZWxpZiBlbnZfdmFyIGluIGVudmlyb246CisgICAgZGVsIGVudmlyb25bZW52X3Zhcl0KKworCitkZWYgUnVuKGNvbW1hbmQpOgorICAiIiJSdW5zIGEgY29tbWFuZDsgcmV0dXJucyAxIGlmIGl0IHdhcyBraWxsZWQgYnkgYSBzaWduYWwsIG9yIDAgb3RoZXJ3aXNlLiIiIgorCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCwgZW52PWVudmlyb24pCisgIGlmIHAudGVybWluYXRlZF9ieV9zaWduYWw6CisgICAgcmV0dXJuIDEKKyAgZWxzZToKKyAgICByZXR1cm4gMAorCisKKyMgVGhlIHRlc3RzLgorCisKK2NsYXNzIEdUZXN0QnJlYWtPbkZhaWx1cmVVbml0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdXNpbmcgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IKKyAgdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIHRvIHR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8KKyAgc2VnbWVudGF0aW9uIGZhdWx0cy4KKyAgIiIiCisKKyAgZGVmIFJ1bkFuZFZlcmlmeShzZWxmLCBlbnZfdmFyX3ZhbHVlLCBmbGFnX3ZhbHVlLCBleHBlY3Rfc2VnX2ZhdWx0KToKKyAgICAiIiJSdW5zIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IGRvZXMKKyAgICAob3IgZG9lcyBub3QpIGhhdmUgYSBzZWctZmF1bHQuCisKKyAgICBBcmdzOgorICAgICAgZW52X3Zhcl92YWx1ZTogICAgdmFsdWUgb2YgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOyBOb25lIGlmIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgdW5zZXQuCisgICAgICBmbGFnX3ZhbHVlOiAgICAgICB2YWx1ZSBvZiB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWc7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKyAgICAgIGV4cGVjdF9zZWdfZmF1bHQ6IDEgaWYgdGhlIHByb2dyYW0gaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgYSBzZWctZmF1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAwIG90aGVyd2lzZS4KKyAgICAiIiIKKworICAgIFNldEVudlZhcihCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIsIGVudl92YXJfdmFsdWUpCisKKyAgICBpZiBlbnZfdmFyX3ZhbHVlIGlzIE5vbmU6CisgICAgICBlbnZfdmFyX3ZhbHVlX21zZyA9ICcgaXMgbm90IHNldCcKKyAgICBlbHNlOgorICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnPScgKyBlbnZfdmFyX3ZhbHVlCisKKyAgICBpZiBmbGFnX3ZhbHVlIGlzIE5vbmU6CisgICAgICBmbGFnID0gJycKKyAgICBlbGlmIGZsYWdfdmFsdWUgPT0gJzAnOgorICAgICAgZmxhZyA9ICctLSVzPTAnICUgQlJFQUtfT05fRkFJTFVSRV9GTEFHCisgICAgZWxzZToKKyAgICAgIGZsYWcgPSAnLS0lcycgJSBCUkVBS19PTl9GQUlMVVJFX0ZMQUcKKworICAgIGNvbW1hbmQgPSBbRVhFX1BBVEhdCisgICAgaWYgZmxhZzoKKyAgICAgIGNvbW1hbmQuYXBwZW5kKGZsYWcpCisKKyAgICBpZiBleHBlY3Rfc2VnX2ZhdWx0OgorICAgICAgc2hvdWxkX29yX25vdCA9ICdzaG91bGQnCisgICAgZWxzZToKKyAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkIG5vdCcKKworICAgIGhhc19zZWdfZmF1bHQgPSBSdW4oY29tbWFuZCkKKworICAgIFNldEVudlZhcihCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIsIE5vbmUpCisKKyAgICBtc2cgPSAoJ3doZW4gJXMlcywgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gIiVzIiAlcyBjYXVzZSBhIHNlZy1mYXVsdC4nICUKKyAgICAgICAgICAgKEJSRUFLX09OX0ZBSUxVUkVfRU5WX1ZBUiwgZW52X3Zhcl92YWx1ZV9tc2csICcgJy5qb2luKGNvbW1hbmQpLAorICAgICAgICAgICAgc2hvdWxkX29yX25vdCkpCisgICAgc2VsZi5hc3NlcnRfKGhhc19zZWdfZmF1bHQgPT0gZXhwZWN0X3NlZ19mYXVsdCwgbXNnKQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBtb2RlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisKKyAgZGVmIHRlc3RFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisKKyAgZGVmIHRlc3RGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKworICBkZWYgdGVzdEZsYWdPdmVycmlkZXNFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCB0aGUgZmxhZyBvdmVycmlkZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorCisgIGRlZiB0ZXN0QnJlYWtPbkZhaWx1cmVPdmVycmlkZXNUaHJvd09uRmFpbHVyZShzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgb3ZlcnJpZGVzIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuIiIiCisKKyAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRV9FTlZfVkFSLCAnMScpCisgICAgdHJ5OgorICAgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisgICAgZmluYWxseToKKyAgICAgIFNldEVudlZhcihUSFJPV19PTl9GQUlMVVJFX0VOVl9WQVIsIE5vbmUpCisKKyAgaWYgSVNfV0lORE9XUzoKKyAgICBkZWYgdGVzdENhdGNoRXhjZXB0aW9uc0RvZXNOb3RJbnRlcmZlcmUoc2VsZik6CisgICAgICAiIiJUZXN0cyB0aGF0IGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZG9lc24ndCBpbnRlcmZlcmUuIiIiCisKKyAgICAgIFNldEVudlZhcihDQVRDSF9FWENFUFRJT05TX0VOVl9WQVIsICcxJykKKyAgICAgIHRyeToKKyAgICAgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisgICAgICBmaW5hbGx5OgorICAgICAgICBTZXRFbnZWYXIoQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSLCBOb25lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorLy8KKy8vIEEgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIHNlZy1mYXVsdCB3aGVuIGFuIGFzc2VydGlvbiBmYWlscywgdXNpbmcKKy8vIGVpdGhlciB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUKKy8vIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnLiAgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3VjaAorLy8gZnVuY3Rpb25hbGl0eS4KKy8vCisvLyBUaGlzIHByb2dyYW0gd2lsbCBiZSBpbnZva2VkIGZyb20gYSBQeXRob24gdW5pdCB0ZXN0LiAgSXQgaXMKKy8vIGV4cGVjdGVkIHRvIGZhaWwuICBEb24ndCBydW4gaXQgZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKKy8vIEEgdGVzdCB0aGF0J3MgZXhwZWN0ZWQgdG8gZmFpbC4KK1RFU1QoRm9vLCBCYXIpIHsKKyAgRVhQRUNUX0VRKDIsIDMpOworfQorCisjaWYgR1RFU1RfSEFTX1NFSCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIE9uIFdpbmRvd3MgTW9iaWxlIGdsb2JhbCBleGNlcHRpb24gaGFuZGxlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuCitMT05HIFdJTkFQSSBFeGl0V2l0aEV4Y2VwdGlvbkNvZGUoCisgICAgc3RydWN0IF9FWENFUFRJT05fUE9JTlRFUlMqIGV4Y2VwdGlvbl9wb2ludGVycykgeworICBleGl0KGV4Y2VwdGlvbl9wb2ludGVycy0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBTdXBwcmVzc2VzIGRpc3BsYXkgb2YgdGhlIFdpbmRvd3MgZXJyb3IgZGlhbG9nIHVwb24gZW5jb3VudGVyaW5nCisgIC8vIGEgZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IChzZWdtZW50IHZpb2xhdGlvbikuCisgIFNldEVycm9yTW9kZShTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKKworIyBpZiBHVEVTVF9IQVNfU0VIICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIC8vIFRoZSBkZWZhdWx0IHVuaGFuZGxlZCBleGNlcHRpb24gZmlsdGVyIGRvZXMgbm90IGFsd2F5cyBleGl0CisgIC8vIHdpdGggdGhlIGV4Y2VwdGlvbiBjb2RlIGFzIGV4aXQgY29kZSAtIGZvciBleGFtcGxlIGl0IGV4aXRzIHdpdGgKKyAgLy8gMCBmb3IgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04gYW5kIDEgZm9yIEVYQ0VQVElPTl9CUkVBS1BPSU5UCisgIC8vIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLiBUaHVzIHdlIHVzZSBvdXIgb3duCisgIC8vIGZpbHRlciB3aGljaCBhbHdheXMgZXhpdHMgd2l0aCB0aGUgZXhjZXB0aW9uIGNvZGUgZm9yIHVuaGFuZGxlZAorICAvLyBleGNlcHRpb25zLgorICBTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIoRXhpdFdpdGhFeGNlcHRpb25Db2RlKTsKKworIyBlbmRpZgorI2VuZGlmCisKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZkN2RiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdC5weQpAQCAtMCwwICsxLDIyMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgR29vZ2xlIFRlc3QncyBleGNlcHRpb24gY2F0Y2hpbmcgYmVoYXZpb3IuCisKK1RoaXMgc2NyaXB0IGludm9rZXMgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0XyBhbmQKK2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfZXhfdGVzdF8gKHByb2dyYW1zIHdyaXR0ZW4gd2l0aAorR29vZ2xlIFRlc3QpIGFuZCB2ZXJpZmllcyB0aGVpciBvdXRwdXQuCisiIiIKKworX19hdXRob3JfXyA9ICd2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KScKKworaW1wb3J0IG9zCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29uc3RhbnRzLgorRkxBR19QUkVGSVggPSAnLS1ndGVzdF8nCitMSVNUX1RFU1RTX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdsaXN0X3Rlc3RzJworTk9fQ0FUQ0hfRVhDRVBUSU9OU19GTEFHID0gRkxBR19QUkVGSVggKyAnY2F0Y2hfZXhjZXB0aW9ucz0wJworRklMVEVSX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdmaWx0ZXInCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XyBiaW5hcnksIGNvbXBpbGVkIHdpdGgKKyMgZXhjZXB0aW9ucyBlbmFibGVkLgorRVhfRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAnZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XycpCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0XyBiaW5hcnksIGNvbXBpbGVkIHdpdGgKKyMgZXhjZXB0aW9ucyBkaXNhYmxlZC4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfbm9fZXhfdGVzdF8nKQorCitURVNUX0xJU1QgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0VYRV9QQVRILCBMSVNUX1RFU1RTX0ZMQUddKS5vdXRwdXQKKworU1VQUE9SVFNfU0VIX0VYQ0VQVElPTlMgPSAnVGhyb3dzU2VoRXhjZXB0aW9uJyBpbiBURVNUX0xJU1QKKworaWYgU1VQUE9SVFNfU0VIX0VYQ0VQVElPTlM6CisgIEJJTkFSWV9PVVRQVVQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0VYRV9QQVRIXSkub3V0cHV0CisKK0VYX0JJTkFSWV9PVVRQVVQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0VYX0VYRV9QQVRIXSkub3V0cHV0CisKKyMgVGhlIHRlc3RzLgoraWYgU1VQUE9SVFNfU0VIX0VYQ0VQVElPTlM6CisgICMgcHlsaW50OmRpc2FibGUtbXNnPUM2MzAyCisgIGNsYXNzIENhdGNoU2VoRXhjZXB0aW9uc1Rlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZXhjZXB0aW9uLWNhdGNoaW5nIGJlaGF2aW9yLiIiIgorCisKKyAgICBkZWYgVGVzdFNlaEV4Y2VwdGlvbnMoc2VsZiwgdGVzdF9vdXRwdXQpOgorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgY29uc3RydWN0b3InCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duICcKKyAgICAgICAgICAgICAgICAgICAnaW4gdGhlIHRlc3QgZml4dHVyZVwncyBkZXN0cnVjdG9yJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiBTZXRVcFRlc3RDYXNlKCknCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIFRlYXJEb3duVGVzdENhc2UoKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gU2V0VXAoKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gVGVhckRvd24oKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gdGhlIHRlc3QgYm9keScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKworICAgIGRlZiB0ZXN0Q2F0Y2hlc1NlaEV4Y2VwdGlvbnNXaXRoQ3h4RXhjZXB0aW9uc0VuYWJsZWQoc2VsZik6CisgICAgICBzZWxmLlRlc3RTZWhFeGNlcHRpb25zKEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgICBkZWYgdGVzdENhdGNoZXNTZWhFeGNlcHRpb25zV2l0aEN4eEV4Y2VwdGlvbnNEaXNhYmxlZChzZWxmKToKKyAgICAgIHNlbGYuVGVzdFNlaEV4Y2VwdGlvbnMoQklOQVJZX09VVFBVVCkKKworCitjbGFzcyBDYXRjaEN4eEV4Y2VwdGlvbnNUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyBDKysgZXhjZXB0aW9uLWNhdGNoaW5nIGJlaGF2aW9yLgorCisgICAgIFRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHZlcmlmeSB0aGF0OgorICAgICAqIEMrKyBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIGxvZ2dlZCBhcyBDKysgKG5vdCBTRUgpIGV4Y2VwdGlvbnMKKyAgICAgKiBFeGNlcHRpb24gdGhyb3duIGFmZmVjdCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0IHdvcmsgZmxvdyBpbiB0aGUKKyAgICAgICBleHBlY3RlZCBtYW5uZXIuCisgICIiIgorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJbkZpeHR1cmVDb25zdHJ1Y3RvcihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAnCisgICAgICAgICAgICAgICAgICciU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIgdGhyb3duICcKKyAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgY29uc3RydWN0b3InCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCd1bmV4cGVjdGVkJyBub3QgaW4gRVhfQklOQVJZX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgJ1RoaXMgZmFpbHVyZSBiZWxvbmdzIGluIHRoaXMgdGVzdCBvbmx5IGlmICcKKyAgICAgICAgICAgICAgICAgJyJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCIgKG5vIHF1b3RlcykgJworICAgICAgICAgICAgICAgICAnYXBwZWFycyBvbiB0aGUgc2FtZSBsaW5lIGFzIHdvcmRzICJjYWxsZWQgdW5leHBlY3RlZGx5IicpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luRml4dHVyZURlc3RydWN0b3Ioc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gJworICAgICAgICAgICAgICAgICAnIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iIHRocm93biAnCisgICAgICAgICAgICAgICAgICdpbiB0aGUgdGVzdCBmaXh0dXJlXCdzIGRlc3RydWN0b3InCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5TZXRVcFRlc3RDYXNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKKyAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gU2V0VXBUZXN0Q2FzZSgpJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBjb25zdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBkZXN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpTZXRVcCgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpUZWFyRG93bigpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IHRlc3QgYm9keSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblRlYXJEb3duVGVzdENhc2Uoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBUZWFyRG93blRlc3RDYXNlKCknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luU2V0VXAoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBTZXRVcCgpJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgZGVzdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiBFWF9CSU5BUllfT1VUUFVULAorICAgICAgICAgICAgICAgICAnVGhpcyBmYWlsdXJlIGJlbG9uZ3MgaW4gdGhpcyB0ZXN0IG9ubHkgaWYgJworICAgICAgICAgICAgICAgICAnIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IiAobm8gcXVvdGVzKSAnCisgICAgICAgICAgICAgICAgICdhcHBlYXJzIG9uIHRoZSBzYW1lIGxpbmUgYXMgd29yZHMgImNhbGxlZCB1bmV4cGVjdGVkbHkiJykKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5UZWFyRG93bihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCisgICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFRlYXJEb3duKCknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCBkZXN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luVGVzdEJvZHkoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiB0aGUgdGVzdCBib2R5JworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QgZGVzdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNOb25TdGRDeHhFeGNlcHRpb25zKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnVW5rbm93biBDKysgZXhjZXB0aW9uIHRocm93biBpbiB0aGUgdGVzdCBib2R5JworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0VW5oYW5kbGVkQ3h4RXhjZXB0aW9uc0Fib3J0VGhlUHJvZ3JhbShzZWxmKToKKyAgICAjIEZpbHRlcnMgb3V0IFNFSCBleGNlcHRpb24gdGVzdHMgb24gV2luZG93cy4gVW5oYW5kbGVkIFNFSCBleGNlcHRpb25zCisgICAgIyBjYXVzZSB0ZXN0cyB0byBzaG93IHBvcC11cCB3aW5kb3dzIHRoZXJlLgorICAgIEZJVExFUl9PVVRfU0VIX1RFU1RTX0ZMQUcgPSBGSUxURVJfRkxBRyArICc9LSpTZWgqJworICAgICMgQnkgZGVmYXVsdCwgR29vZ2xlIFRlc3QgZG9lc24ndCBjYXRjaCB0aGUgZXhjZXB0aW9ucy4KKyAgICB1bmNhdWdodF9leGNlcHRpb25zX2V4X2JpbmFyeV9vdXRwdXQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgICAgIFtFWF9FWEVfUEFUSCwKKyAgICAgICAgIE5PX0NBVENIX0VYQ0VQVElPTlNfRkxBRywKKyAgICAgICAgIEZJVExFUl9PVVRfU0VIX1RFU1RTX0ZMQUddKS5vdXRwdXQKKworICAgIHNlbGYuYXNzZXJ0XygnVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0nCisgICAgICAgICAgICAgICAgIGluIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCkKKyAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiB1bmNhdWdodF9leGNlcHRpb25zX2V4X2JpbmFyeV9vdXRwdXQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTEwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMzA4IEBACisvLyBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYuIFRlc3RzIGluIHRoaXMgZmlsZSB0aHJvdyBDKysgb3IgU0VICisvLyBleGNlcHRpb25zLCBhbmQgdGhlIG91dHB1dCBpcyB2ZXJpZmllZCBieSBndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIGV4aXQoKS4KKworI2lmIEdURVNUX0hBU19TRUgKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyBpbmNsdWRlIDxleGNlcHRpb24+ICAvLyBGb3Igc2V0X3Rlcm1pbmF0ZSgpLgorIyBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworI2lmIEdURVNUX0hBU19TRUgKKworY2xhc3MgU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBTZWhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QsIFRocm93c0V4Y2VwdGlvbkluQ29uc3RydWN0b3IpIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICB+U2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblNldFVwVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXApIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93bikge30KKworVEVTVChTZWhFeGNlcHRpb25UZXN0LCBUaHJvd3NTZWhFeGNlcHRpb24pIHsKKyAgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7CisgICAgLy8gV2l0aG91dCB0aGlzIG1hY3JvIFZDKysgY29tcGxhaW5zIGFib3V0IHVucmVhY2hhYmxlIGNvZGUgYXQgdGhlIGVuZCBvZgorICAgIC8vIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKAorICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0OjpTZXRVcCgpICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0LCBUaHJvd3NFeGNlcHRpb25JbkNvbnN0cnVjdG9yKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IHRlc3QgYm9keSAiCisgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKK30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QoKSB7CisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXygKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIikpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yKSB7fQorCitjbGFzcyBDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgY29uc3RydWN0b3IgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlNldFVwKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpUZWFyRG93bigpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlKSB7CisgIHByaW50ZigiJXMiLAorICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgdGVzdCBib2R5ICIKKyAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKK30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0LCBUaHJvd3NFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2UpIHt9CisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7IH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd24oKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0LCBUaHJvd3NFeGNlcHRpb25JblNldFVwKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IHRlc3QgYm9keSAiCisgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKK30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QsIFRocm93c0V4Y2VwdGlvbkluVGVhckRvd24pIHt9CisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0OjpUZWFyRG93bigpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QsIFRocm93c1N0ZEN4eEV4Y2VwdGlvbikgeworICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsKK30KKworVEVTVChDeHhFeGNlcHRpb25UZXN0LCBUaHJvd3NOb25TdGRDeHhFeGNlcHRpb24pIHsKKyAgdGhyb3cgIkMtc3RyaW5nIjsKK30KKworLy8gVGhpcyB0ZXJtaW5hdGUgaGFuZGxlciBhYm9ydHMgdGhlIHByb2dyYW0gdXNpbmcgZXhpdCgpIHJhdGhlciB0aGFuIGFib3J0KCkuCisvLyBUaGlzIGF2b2lkcyBzaG93aW5nIHBvcC11cHMgb24gV2luZG93cyBzeXN0ZW1zIGFuZCBjb3JlIGR1bXBzIG9uIFVuaXgtbGlrZQorLy8gb25lcy4KK3ZvaWQgVGVybWluYXRlSGFuZGxlcigpIHsKKyAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgIlVuaGFuZGxlZCBDKysgZXhjZXB0aW9uIHRlcm1pbmF0aW5nIHRoZSBwcm9ncmFtLiIpOworICBmZmx1c2goTlVMTCk7CisgIGV4aXQoMyk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgc3RkOjpzZXRfdGVybWluYXRlKCZUZXJtaW5hdGVIYW5kbGVyKTsKKyNlbmRpZgorICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5IGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMDJhNTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdC5weQpAQCAtMCwwICsxLDEzMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCBjb3JyZWN0bHkgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBjb2xvcnMuIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCitJU19XSU5ET1dTID0gb3MubmFtZSA9ICdudCcKKworQ09MT1JfRU5WX1ZBUiA9ICdHVEVTVF9DT0xPUicKK0NPTE9SX0ZMQUcgPSAnZ3Rlc3RfY29sb3InCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2NvbG9yX3Rlc3RfJykKKworCitkZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKKyAgIiIiU2V0cyB0aGUgZW52IHZhcmlhYmxlIHRvICd2YWx1ZSc7IHVuc2V0cyBpdCB3aGVuICd2YWx1ZScgaXMgTm9uZS4iIiIKKworICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICBvcy5lbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKKyAgZWxpZiBlbnZfdmFyIGluIG9zLmVudmlyb246CisgICAgZGVsIG9zLmVudmlyb25bZW52X3Zhcl0KKworCitkZWYgVXNlc0NvbG9yKHRlcm0sIGNvbG9yX2Vudl92YXIsIGNvbG9yX2ZsYWcpOgorICAiIiJSdW5zIGd0ZXN0X2NvbG9yX3Rlc3RfIGFuZCByZXR1cm5zIGl0cyBleGl0IGNvZGUuIiIiCisKKyAgU2V0RW52VmFyKCdURVJNJywgdGVybSkKKyAgU2V0RW52VmFyKENPTE9SX0VOVl9WQVIsIGNvbG9yX2Vudl92YXIpCisKKyAgaWYgY29sb3JfZmxhZyBpcyBOb25lOgorICAgIGFyZ3MgPSBbXQorICBlbHNlOgorICAgIGFyZ3MgPSBbJy0tJXM9JXMnICUgKENPTE9SX0ZMQUcsIGNvbG9yX2ZsYWcpXQorICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIGFyZ3MpCisgIHJldHVybiBub3QgcC5leGl0ZWQgb3IgcC5leGl0X2NvZGUKKworCitjbGFzcyBHVGVzdENvbG9yVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgZGVmIHRlc3ROb0VudlZhck5vRmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlJ3MgbmVpdGhlciBHVEVTVF9DT0xPUiBub3IgLS1ndGVzdF9jb2xvci4iIiIKKworICAgIGlmIG5vdCBJU19XSU5ET1dTOgorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCBOb25lKSkKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdlbWFjcycsIE5vbmUsIE5vbmUpKQorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtLW1vbm8nLCBOb25lLCBOb25lKSkKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd1bmtub3duJywgTm9uZSwgTm9uZSkpCisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcihOb25lLCBOb25lLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdsaW51eCcsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2N5Z3dpbicsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tY29sb3InLCBOb25lLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS0yNTZjb2xvcicsIE5vbmUsIE5vbmUpKQorCisgIGRlZiB0ZXN0RmxhZ09ubHkoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSdzIC0tZ3Rlc3RfY29sb3IgYnV0IG5vdCBHVEVTVF9DT0xPUi4iIiIKKworICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJ25vJykpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgTm9uZSwgJ25vJykpCisgICAgaWYgbm90IElTX1dJTkRPV1M6CisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZW1hY3MnLCBOb25lLCAnYXV0bycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ2F1dG8nKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJ3llcycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ3llcycpKQorCisgIGRlZiB0ZXN0RW52VmFyT25seShzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlJ3MgR1RFU1RfQ09MT1IgYnV0IG5vdCAtLWd0ZXN0X2NvbG9yLiIiIgorCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2R1bWInLCAnbm8nLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAnbm8nLCBOb25lKSkKKyAgICBpZiBub3QgSVNfV0lORE9XUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdkdW1iJywgJ2F1dG8nLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICdhdXRvJywgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsICd5ZXMnLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICd5ZXMnLCBOb25lKSkKKworICBkZWYgdGVzdEVudlZhckFuZEZsYWcoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSBhcmUgYm90aCBHVEVTVF9DT0xPUiBhbmQgLS1ndGVzdF9jb2xvci4iIiIKKworICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICdubycsICdubycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCAnbm8nLCAneWVzJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAnbm8nLCAnYXV0bycpKQorCisgIGRlZiB0ZXN0QWxpYXNlc09mWWVzQW5kTm8oc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgYWxpYXNlcyBpbiBzcGVjaWZ5aW5nIC0tZ3Rlc3RfY29sb3IuIiIiCisKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJ3RydWUnKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJ1lFUycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAnVCcpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAnMScpKQorCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ2YnKSkKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAnZmFsc2UnKSkKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAnMCcpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICd1bmtub3duJykpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEEgaGVscGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgaG93IEdvb2dsZSBUZXN0IGRldGVybWluZXMgd2hldGhlciB0byB1c2UKKy8vIGNvbG9ycyBpbiB0aGUgb3V0cHV0LiAgSXQgcHJpbnRzICJZRVMiIGFuZCByZXR1cm5zIDEgaWYgR29vZ2xlIFRlc3QKKy8vIGRlY2lkZXMgdG8gdXNlIGNvbG9ycywgYW5kIHByaW50cyAiTk8iIGFuZCByZXR1cm5zIDAgb3RoZXJ3aXNlLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkVXNlQ29sb3I7CisKKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIFVuaXRUZXN0IHNpbmdsZXRvbiBpcworLy8gY3JlYXRlZCBiZWZvcmUgbWFpbigpIGlzIGVudGVyZWQsIGFuZCB0aHVzIHRoYXQgU2hvdWxkVXNlQ29sb3IoKQorLy8gd29ya3MgdGhlIHNhbWUgd2F5IGFzIGluIGEgcmVhbCBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0LiAgV2UgZG9uJ3QgYWN0dWFsCisvLyBydW4gdGhlIFRFU1QgaXRzZWxmLgorVEVTVChHVGVzdENvbG9yVGVzdCwgRHVtbXkpIHsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBpZiAoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpIHsKKyAgICAvLyBHb29nbGUgVGVzdCBkZWNpZGVzIHRvIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dCAoYXNzdW1pbmcgaXQKKyAgICAvLyBnb2VzIHRvIGEgVFRZKS4KKyAgICBwcmludGYoIllFU1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgLy8gR29vZ2xlIFRlc3QgZGVjaWRlcyBub3QgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorICAgIHByaW50ZigiTk9cbiIpOworICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWMyNDMzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weQpAQCAtMCwwICsxLDEwMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCBjb3JyZWN0bHkgcGFyc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcy4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKK0lTX0xJTlVYID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy51bmFtZSgpWzBdID09ICdMaW51eCcKKworQ09NTUFORCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9lbnZfdmFyX3Rlc3RfJykKKworZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCisKKworZGVmIEFzc2VydEVxKGV4cGVjdGVkLCBhY3R1YWwpOgorICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6CisgICAgcHJpbnQgJ0V4cGVjdGVkOiAlcycgJSAoZXhwZWN0ZWQsKQorICAgIHByaW50ICcgIEFjdHVhbDogJXMnICUgKGFjdHVhbCwpCisgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworCitkZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKKyAgIiIiU2V0cyB0aGUgZW52IHZhcmlhYmxlIHRvICd2YWx1ZSc7IHVuc2V0cyBpdCB3aGVuICd2YWx1ZScgaXMgTm9uZS4iIiIKKworICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICBlbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKKyAgZWxpZiBlbnZfdmFyIGluIGVudmlyb246CisgICAgZGVsIGVudmlyb25bZW52X3Zhcl0KKworCitkZWYgR2V0RmxhZyhmbGFnKToKKyAgIiIiUnVucyBndGVzdF9lbnZfdmFyX3Rlc3RfIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQuIiIiCisKKyAgYXJncyA9IFtDT01NQU5EXQorICBpZiBmbGFnIGlzIG5vdCBOb25lOgorICAgIGFyZ3MgKz0gW2ZsYWddCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoYXJncywgZW52PWVudmlyb24pLm91dHB1dAorCisKK2RlZiBUZXN0RmxhZyhmbGFnLCB0ZXN0X3ZhbCwgZGVmYXVsdF92YWwpOgorICAiIiJWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBmbGFnIGlzIGFmZmVjdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVudiB2YXIuIiIiCisKKyAgZW52X3ZhciA9ICdHVEVTVF8nICsgZmxhZy51cHBlcigpCisgIFNldEVudlZhcihlbnZfdmFyLCB0ZXN0X3ZhbCkKKyAgQXNzZXJ0RXEodGVzdF92YWwsIEdldEZsYWcoZmxhZykpCisgIFNldEVudlZhcihlbnZfdmFyLCBOb25lKQorICBBc3NlcnRFcShkZWZhdWx0X3ZhbCwgR2V0RmxhZyhmbGFnKSkKKworCitjbGFzcyBHVGVzdEVudlZhclRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgIGRlZiB0ZXN0RW52VmFyQWZmZWN0c0ZsYWcoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzaG91bGQgYWZmZWN0IHRoZSBjb3JyZXNwb25kaW5nIGZsYWcuIiIiCisKKyAgICBUZXN0RmxhZygnYnJlYWtfb25fZmFpbHVyZScsICcxJywgJzAnKQorICAgIFRlc3RGbGFnKCdjb2xvcicsICd5ZXMnLCAnYXV0bycpCisgICAgVGVzdEZsYWcoJ2ZpbHRlcicsICdGb29UZXN0LkJhcicsICcqJykKKyAgICBUZXN0RmxhZygnb3V0cHV0JywgJ3htbDp0bXAvZm9vLnhtbCcsICcnKQorICAgIFRlc3RGbGFnKCdwcmludF90aW1lJywgJzAnLCAnMScpCisgICAgVGVzdEZsYWcoJ3JlcGVhdCcsICc5OTknLCAnMScpCisgICAgVGVzdEZsYWcoJ3Rocm93X29uX2ZhaWx1cmUnLCAnMScsICcwJykKKyAgICBUZXN0RmxhZygnZGVhdGhfdGVzdF9zdHlsZScsICd0aHJlYWRzYWZlJywgJ2Zhc3QnKQorICAgIFRlc3RGbGFnKCdjYXRjaF9leGNlcHRpb25zJywgJzAnLCAnMScpCisKKyAgICBpZiBJU19MSU5VWDoKKyAgICAgIFRlc3RGbGFnKCdkZWF0aF90ZXN0X3VzZV9mb3JrJywgJzEnLCAnMCcpCisgICAgICBUZXN0RmxhZygnc3RhY2tfdHJhY2VfZGVwdGgnLCAnMCcsICcxMDAnKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlhZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYwpAQCAtMCwwICsxLDEyNiBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gQSBoZWxwZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyB0aGF0IEdvb2dsZSBUZXN0IHBhcnNlcyB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlcyBjb3JyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK3VzaW5nIDo6c3RkOjpjb3V0OworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gbWFrZSB0aGUgdGVzdCBtb3JlIHJlYWxpc3RpYyBieSBlbnN1cmluZworLy8gdGhhdCB0aGUgVW5pdFRlc3Qgc2luZ2xldG9uIGlzIGNyZWF0ZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLgorLy8gV2UgZG9uJ3QgYWN0dWFsIHJ1biB0aGUgVEVTVCBpdHNlbGYuCitURVNUKEdUZXN0RW52VmFyVGVzdCwgRHVtbXkpIHsKK30KKwordm9pZCBQcmludEZsYWcoY29uc3QgY2hhciogZmxhZykgeworICBpZiAoc3RyY21wKGZsYWcsICJicmVha19vbl9mYWlsdXJlIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJjYXRjaF9leGNlcHRpb25zIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJjb2xvciIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoY29sb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImRlYXRoX3Rlc3Rfc3R5bGUiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImRlYXRoX3Rlc3RfdXNlX2ZvcmsiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImZpbHRlciIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoZmlsdGVyKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJvdXRwdXQiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKG91dHB1dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAicHJpbnRfdGltZSIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAicmVwZWF0IikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhyZXBlYXQpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgInN0YWNrX3RyYWNlX2RlcHRoIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAidGhyb3dfb25fZmFpbHVyZSIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgY291dCA8PCAiSW52YWxpZCBmbGFnIG5hbWUgIiA8PCBmbGFnCisgICAgICAgPDwgIi4gIFZhbGlkIG5hbWVzIGFyZSBicmVha19vbl9mYWlsdXJlLCBjb2xvciwgZmlsdGVyLCBldGMuXG4iOworICBleGl0KDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGlmIChhcmdjICE9IDIpIHsKKyAgICBjb3V0IDw8ICJVc2FnZTogZ3Rlc3RfZW52X3Zhcl90ZXN0XyBOQU1FX09GX0ZMQUdcbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB0ZXN0aW5nOjpQcmludEZsYWcoYXJndlsxXSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5YWEyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MKQEAgLTAsMCArMSwxOTEgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgdXNpbmcgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzLgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxICAvLyBSZXF1aXJlZCBmb3IgdGhlIG5leHQgI2luY2x1ZGUuCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsKK30KKworbmFtZXNwYWNlIHsKKworZW51bSBGYWlsdXJlVHlwZSB7CisgIE5PX0ZBSUxVUkUsIE5PTl9GQVRBTF9GQUlMVVJFLCBGQVRBTF9GQUlMVVJFCit9OworCisvLyBGb3IgdGVzdGluZyB1c2luZyBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMuCitjbGFzcyBNeUVudmlyb25tZW50IDogcHVibGljIHRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIE15RW52aXJvbm1lbnQoKSB7IFJlc2V0KCk7IH0KKworICAvLyBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGZhaWx1cmVfaW5fc2V0X3VwXywgU2V0VXAoKSB3aWxsCisgIC8vIGdlbmVyYXRlIGEgbm9uLWZhdGFsIGZhaWx1cmUsIGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZSwgb3IKKyAgLy8gc3VjY2VlZC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHNldF91cF93YXNfcnVuXyA9IHRydWU7CisKKyAgICBzd2l0Y2ggKGZhaWx1cmVfaW5fc2V0X3VwXykgeworICAgICAgY2FzZSBOT05fRkFUQUxfRkFJTFVSRToKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgaW4gZ2xvYmFsIHNldC11cC4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkFUQUxfRkFJTFVSRToKKyAgICAgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlIGluIGdsb2JhbCBzZXQtdXAuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHRlYXJfZG93bl93YXNfcnVuXyA9IHRydWU7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgaW4gZ2xvYmFsIHRlYXItZG93bi4iOworICB9CisKKyAgLy8gUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZW52aXJvbm1lbnQgcy50LiBpdCBjYW4gYmUgcmV1c2VkLgorICB2b2lkIFJlc2V0KCkgeworICAgIGZhaWx1cmVfaW5fc2V0X3VwXyA9IE5PX0ZBSUxVUkU7CisgICAgc2V0X3VwX3dhc19ydW5fID0gZmFsc2U7CisgICAgdGVhcl9kb3duX3dhc19ydW5fID0gZmFsc2U7CisgIH0KKworICAvLyBXZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSB0eXBlIG9mIGZhaWx1cmUgU2V0VXAoKSBzaG91bGQKKyAgLy8gZ2VuZXJhdGUuCisgIHZvaWQgc2V0X2ZhaWx1cmVfaW5fc2V0X3VwKEZhaWx1cmVUeXBlIHR5cGUpIHsKKyAgICBmYWlsdXJlX2luX3NldF91cF8gPSB0eXBlOworICB9CisKKyAgLy8gV2FzIFNldFVwKCkgcnVuPworICBib29sIHNldF91cF93YXNfcnVuKCkgY29uc3QgeyByZXR1cm4gc2V0X3VwX3dhc19ydW5fOyB9CisKKyAgLy8gV2FzIFRlYXJEb3duKCkgcnVuPworICBib29sIHRlYXJfZG93bl93YXNfcnVuKCkgY29uc3QgeyByZXR1cm4gdGVhcl9kb3duX3dhc19ydW5fOyB9CisgcHJpdmF0ZToKKyAgRmFpbHVyZVR5cGUgZmFpbHVyZV9pbl9zZXRfdXBfOworICBib29sIHNldF91cF93YXNfcnVuXzsKKyAgYm9vbCB0ZWFyX2Rvd25fd2FzX3J1bl87Cit9OworCisvLyBXYXMgdGhlIFRFU1QgcnVuPworYm9vbCB0ZXN0X3dhc19ydW47CisKKy8vIFRoZSBzb2xlIHB1cnBvc2Ugb2YgdGhpcyBURVNUIGlzIHRvIGVuYWJsZSB1cyB0byBjaGVjayB3aGV0aGVyIGl0CisvLyB3YXMgcnVuLgorVEVTVChGb29UZXN0LCBCYXIpIHsKKyAgdGVzdF93YXNfcnVuID0gdHJ1ZTsKK30KKworLy8gUHJpbnRzIHRoZSBtZXNzYWdlIGFuZCBhYm9ydHMgdGhlIHByb2dyYW0gaWYgY29uZGl0aW9uIGlzIGZhbHNlLgordm9pZCBDaGVjayhib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogbXNnKSB7CisgIGlmICghY29uZGl0aW9uKSB7CisgICAgcHJpbnRmKCJGQUlMRUQ6ICVzXG4iLCBtc2cpOworICAgIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorCisvLyBSdW5zIHRoZSB0ZXN0cy4gIFJldHVybiB0cnVlIGlmZiBzdWNjZXNzZnVsLgorLy8KKy8vIFRoZSAnZmFpbHVyZScgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBmYWlsdXJlIHRoYXQgc2hvdWxkCisvLyBiZSBnZW5lcmF0ZWQgYnkgdGhlIGdsb2JhbCBzZXQtdXAuCitpbnQgUnVuQWxsVGVzdHMoTXlFbnZpcm9ubWVudCogZW52LCBGYWlsdXJlVHlwZSBmYWlsdXJlKSB7CisgIGVudi0+UmVzZXQoKTsKKyAgZW52LT5zZXRfZmFpbHVyZV9pbl9zZXRfdXAoZmFpbHVyZSk7CisgIHRlc3Rfd2FzX3J1biA9IGZhbHNlOworICB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPkNsZWFyQWRIb2NUZXN0UmVzdWx0KCk7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIFJlZ2lzdGVycyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LCBhbmQgdmVyaWZpZXMgdGhhdCB0aGUKKyAgLy8gcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHJldHVybnMgaXRzIGFyZ3VtZW50LgorICBNeUVudmlyb25tZW50KiBjb25zdCBlbnYgPSBuZXcgTXlFbnZpcm9ubWVudDsKKyAgQ2hlY2sodGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGVudikgPT0gZW52LAorICAgICAgICAiQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KCkgc2hvdWxkIHJldHVybiBpdHMgYXJndW1lbnQuIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBSVU5fQUxMX1RFU1RTKCkgcnVucyB0aGUgdGVzdHMgd2hlbiB0aGUgZ2xvYmFsCisgIC8vIHNldC11cCBpcyBzdWNjZXNzZnVsLgorICBDaGVjayhSdW5BbGxUZXN0cyhlbnYsIE5PX0ZBSUxVUkUpICE9IDAsCisgICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgdGhlIGdsb2JhbCB0ZWFyLWRvd24gIgorICAgICAgICAic2hvdWxkIGdlbmVyYXRlIGEgZmFpbHVyZS4iKTsKKyAgQ2hlY2sodGVzdF93YXNfcnVuLAorICAgICAgICAiVGhlIHRlc3RzIHNob3VsZCBydW4sIGFzIHRoZSBnbG9iYWwgc2V0LXVwIHNob3VsZCBnZW5lcmF0ZSBubyAiCisgICAgICAgICJmYWlsdXJlIik7CisgIENoZWNrKGVudi0+dGVhcl9kb3duX3dhc19ydW4oKSwKKyAgICAgICAgIlRoZSBnbG9iYWwgdGVhci1kb3duIHNob3VsZCBydW4sIGFzIHRoZSBnbG9iYWwgc2V0LXVwIHdhcyBydW4uIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBSVU5fQUxMX1RFU1RTKCkgcnVucyB0aGUgdGVzdHMgd2hlbiB0aGUgZ2xvYmFsCisgIC8vIHNldC11cCBnZW5lcmF0ZXMgbm8gZmF0YWwgZmFpbHVyZS4KKyAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT05fRkFUQUxfRkFJTFVSRSkgIT0gMCwKKyAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvLCBhcyBib3RoIHRoZSBnbG9iYWwgc2V0LXVwICIKKyAgICAgICAgImFuZCB0aGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgZ2VuZXJhdGUgYSBub24tZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2sodGVzdF93YXNfcnVuLAorICAgICAgICAiVGhlIHRlc3RzIHNob3VsZCBydW4sIGFzIHRoZSBnbG9iYWwgc2V0LXVwIHNob3VsZCBnZW5lcmF0ZSBubyAiCisgICAgICAgICJmYXRhbCBmYWlsdXJlLiIpOworICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgbm8gdGVzdCB3aGVuIHRoZSBnbG9iYWwgc2V0LXVwCisgIC8vIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUuCisgIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgRkFUQUxfRkFJTFVSRSkgIT0gMCwKKyAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvLCBhcyB0aGUgZ2xvYmFsIHNldC11cCAiCisgICAgICAgICJzaG91bGQgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlLiIpOworICBDaGVjayghdGVzdF93YXNfcnVuLAorICAgICAgICAiVGhlIHRlc3RzIHNob3VsZCBub3QgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgIgorICAgICAgICAiYSBmYXRhbCBmYWlsdXJlLiIpOworICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIGRvZXNuJ3QgZG8gZ2xvYmFsIHNldC11cCBvcgorICAvLyB0ZWFyLWRvd24gd2hlbiB0aGVyZSBpcyBubyB0ZXN0IHRvIHJ1bi4KKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhmaWx0ZXIpID0gIi0qIjsKKyAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT19GQUlMVVJFKSA9PSAwLAorICAgICAgICAiUlVOX0FMTF9URVNUUygpIHNob3VsZCByZXR1cm4gemVybywgYXMgdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uIik7CisgIENoZWNrKCFlbnYtPnNldF91cF93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHNldC11cCBzaG91bGQgbm90IHJ1biwgYXMgdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uIik7CisgIENoZWNrKCFlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgbm90IHJ1biwgIgorICAgICAgICAiYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIG5vdCBydW4uIik7CisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQxYTc3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weQpAQCAtMCwwICsxLDYzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IHRlc3QgZmlsdGVycy4KKworQSB1c2VyIGNhbiBzcGVjaWZ5IHdoaWNoIHRlc3QocykgaW4gYSBHb29nbGUgVGVzdCBwcm9ncmFtIHRvIHJ1biB2aWEgZWl0aGVyCit0aGUgR1RFU1RfRklMVEVSIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVGhpcyBzY3JpcHQgdGVzdHMgc3VjaCBmdW5jdGlvbmFsaXR5IGJ5IGludm9raW5nCitndGVzdF9maWx0ZXJfdW5pdHRlc3RfIChhIHByb2dyYW0gd3JpdHRlbiB3aXRoIEdvb2dsZSBUZXN0KSB3aXRoIGRpZmZlcmVudAorZW52aXJvbm1lbnRzIGFuZCBjb21tYW5kIGxpbmUgZmxhZ3MuCisKK05vdGUgdGhhdCB0ZXN0IHNoYXJkaW5nIG1heSBhbHNvIGluZmx1ZW5jZSB3aGljaCB0ZXN0cyBhcmUgZmlsdGVyZWQuIFRoZXJlZm9yZSwKK3dlIHRlc3QgdGhhdCBoZXJlIGFsc28uCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzZXRzCitpbXBvcnQgc3lzCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29uc3RhbnRzLgorCisjIENoZWNrcyBpZiB0aGlzIHBsYXRmb3JtIGNhbiBwYXNzIGVtcHR5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjaGlsZAorIyBwcm9jZXNzZXMuICBXZSBzZXQgYW4gZW52IHZhcmlhYmxlIHRvIGFuIGVtcHR5IHN0cmluZyBhbmQgaW52b2tlIGEgcHl0aG9uCisjIHNjcmlwdCBpbiBhIHN1YnByb2Nlc3MgdG8gcHJpbnQgd2hldGhlciB0aGUgdmFyaWFibGUgaXMgU1RJTEwgaW4KKyMgb3MuZW52aXJvbi4gIFdlIHRoZW4gdXNlICdldmFsJyB0byBwYXJzZSB0aGUgY2hpbGQncyBvdXRwdXQgc28gdGhhdCBhbgorIyBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbnB1dCBpcyBhbnl0aGluZyBvdGhlciB0aGFuICdUcnVlJyBub3IgJ0ZhbHNlJy4KK29zLmVudmlyb25bJ0VNUFRZX1ZBUiddID0gJycKK2NoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ2ltcG9ydCBvczsgcHJpbnQgXCdFTVBUWV9WQVJcJyBpbiBvcy5lbnZpcm9uJ10pCitDQU5fUEFTU19FTVBUWV9FTlYgPSBldmFsKGNoaWxkLm91dHB1dCkKKworCisjIENoZWNrIGlmIHRoaXMgcGxhdGZvcm0gY2FuIHVuc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBjaGlsZCBwcm9jZXNzZXMuCisjIFdlIHNldCBhbiBlbnYgdmFyaWFibGUgdG8gYSBub24tZW1wdHkgc3RyaW5nLCB1bnNldCBpdCwgYW5kIGludm9rZQorIyBhIHB5dGhvbiBzY3JpcHQgaW4gYSBzdWJwcm9jZXNzIHRvIHByaW50IHdoZXRoZXIgdGhlIHZhcmlhYmxlCisjIGlzIE5PIExPTkdFUiBpbiBvcy5lbnZpcm9uLgorIyBXZSB1c2UgJ2V2YWwnIHRvIHBhcnNlIHRoZSBjaGlsZCdzIG91dHB1dCBzbyB0aGF0IGFuIGV4Y2VwdGlvbgorIyBpcyB0aHJvd24gaWYgdGhlIGlucHV0IGlzIG5laXRoZXIgJ1RydWUnIG5vciAnRmFsc2UnLgorb3MuZW52aXJvblsnVU5TRVRfVkFSJ10gPSAnWCcKK2RlbCBvcy5lbnZpcm9uWydVTlNFVF9WQVInXQorY2hpbGQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAnaW1wb3J0IG9zOyBwcmludCBcJ1VOU0VUX1ZBUlwnIG5vdCBpbiBvcy5lbnZpcm9uJ10pCitDQU5fVU5TRVRfRU5WID0gZXZhbChjaGlsZC5vdXRwdXQpCisKKworIyBDaGVja3MgaWYgd2Ugc2hvdWxkIHRlc3Qgd2l0aCBhbiBlbXB0eSBmaWx0ZXIuIFRoaXMgZG9lc24ndAorIyBtYWtlIHNlbnNlIG9uIHBsYXRmb3JtcyB0aGF0IGNhbm5vdCBwYXNzIGVtcHR5IGVudiB2YXJpYWJsZXMgKFdpbjMyKQorIyBhbmQgb24gcGxhdGZvcm1zIHRoYXQgY2Fubm90IHVuc2V0IHZhcmlhYmxlcyAoc2luY2Ugd2UgY2Fubm90IHRlbGwKKyMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIiBhbmQgTlVMTCAtLSBCb3JsYW5kIGFuZCBTb2xhcmlzIDwgNS4xMCkKK0NBTl9URVNUX0VNUFRZX0ZJTFRFUiA9IChDQU5fUEFTU19FTVBUWV9FTlYgYW5kIENBTl9VTlNFVF9FTlYpCisKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHNwZWNpZnlpbmcgdGhlIHRlc3QgZmlsdGVycy4KK0ZJTFRFUl9FTlZfVkFSID0gJ0dURVNUX0ZJTFRFUicKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0ZXN0IHNoYXJkaW5nLgorVE9UQUxfU0hBUkRTX0VOVl9WQVIgPSAnR1RFU1RfVE9UQUxfU0hBUkRTJworU0hBUkRfSU5ERVhfRU5WX1ZBUiA9ICdHVEVTVF9TSEFSRF9JTkRFWCcKK1NIQVJEX1NUQVRVU19GSUxFX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUnCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBzcGVjaWZ5aW5nIHRoZSB0ZXN0IGZpbHRlcnMuCitGSUxURVJfRkxBRyA9ICdndGVzdF9maWx0ZXInCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBpbmNsdWRpbmcgZGlzYWJsZWQgdGVzdHMuCitBTFNPX1JVTl9ESVNBQkVEX1RFU1RTX0ZMQUcgPSAnZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMnCisKKyMgQ29tbWFuZCB0byBydW4gdGhlIGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gcHJvZ3JhbS4KK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XycpCisKKyMgUmVnZXggZm9yIGRldGVybWluaW5nIHdoZXRoZXIgcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCBpbiB0aGUgYmluYXJ5LgorUEFSQU1fVEVTVF9SRUdFWCA9IHJlLmNvbXBpbGUocicvUGFyYW1UZXN0JykKKworIyBSZWdleCBmb3IgcGFyc2luZyB0ZXN0IGNhc2UgbmFtZXMgZnJvbSBHb29nbGUgVGVzdCdzIG91dHB1dC4KK1RFU1RfQ0FTRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXFtcLStcXSBcZCsgdGVzdHM/IGZyb20gKFx3KygvXHcrKT8pJykKKworIyBSZWdleCBmb3IgcGFyc2luZyB0ZXN0IG5hbWVzIGZyb20gR29vZ2xlIFRlc3QncyBvdXRwdXQuCitURVNUX1JFR0VYID0gcmUuY29tcGlsZShyJ15cW1xzKlJVTlxzKlxdLipcLihcdysoL1x3Kyk/KScpCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIHRvIHRlbGwgR29vZ2xlIFRlc3QgdG8gb3V0cHV0IHRoZSBsaXN0IG9mIHRlc3RzIGl0CisjIHdpbGwgcnVuLgorTElTVF9URVNUU19GTEFHID0gJy0tZ3Rlc3RfbGlzdF90ZXN0cycKKworIyBJbmRpY2F0ZXMgd2hldGhlciBHb29nbGUgVGVzdCBzdXBwb3J0cyBkZWF0aCB0ZXN0cy4KK1NVUFBPUlRTX0RFQVRIX1RFU1RTID0gJ0hhc0RlYXRoVGVzdCcgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtDT01NQU5ELCBMSVNUX1RFU1RTX0ZMQUddKS5vdXRwdXQKKworIyBGdWxsIG5hbWVzIG9mIGFsbCB0ZXN0cyBpbiBndGVzdF9maWx0ZXJfdW5pdHRlc3RzXy4KK1BBUkFNX1RFU1RTID0gWworICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMScsCisgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8xJywKKyAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RYLzEnLAorICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFkvMScsCisgICAgXQorCitESVNBQkxFRF9URVNUUyA9IFsKKyAgICAnQmFyVGVzdC5ESVNBQkxFRF9UZXN0Rm91cicsCisgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZpdmUnLAorICAgICdCYXpUZXN0LkRJU0FCTEVEX1Rlc3RDJywKKyAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MScsCisgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuRElTQUJMRURfVGVzdDInLAorICAgICdESVNBQkxFRF9Gb29iYXJiYXpUZXN0LlRlc3RBJywKKyAgICBdCisKK2lmIFNVUFBPUlRTX0RFQVRIX1RFU1RTOgorICBERUFUSF9URVNUUyA9IFsKKyAgICAnSGFzRGVhdGhUZXN0LlRlc3QxJywKKyAgICAnSGFzRGVhdGhUZXN0LlRlc3QyJywKKyAgICBdCitlbHNlOgorICBERUFUSF9URVNUUyA9IFtdCisKKyMgQWxsIHRoZSBub24tZGlzYWJsZWQgdGVzdHMuCitBQ1RJVkVfVEVTVFMgPSBbCisgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAnRm9vVGVzdC5YeXonLAorCisgICAgJ0JhclRlc3QuVGVzdE9uZScsCisgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKworICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAnQmF6VGVzdC5UZXN0QicsCisgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMKKworcGFyYW1fdGVzdHNfcHJlc2VudCA9IE5vbmUKKworIyBVdGlsaXRpZXMuCisKK2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBlbnYgdmFyaWFibGUgdG8gJ3ZhbHVlJzsgdW5zZXRzIGl0IHdoZW4gJ3ZhbHVlJyBpcyBOb25lLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIGVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gZW52aXJvbjoKKyAgICBkZWwgZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBSdW5BbmRSZXR1cm5PdXRwdXQoYXJncyA9IE5vbmUpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgaXRzIG91dHB1dC4iIiIKKworICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIChhcmdzIG9yIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikub3V0cHV0CisKKworZGVmIFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzID0gTm9uZSk6CisgICIiIlJ1bnMgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlIGFuZCBhIGxpc3Qgb2YgdGVzdHMgcnVuLiIiIgorCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgKGFyZ3Mgb3IgW10pLCBlbnY9ZW52aXJvbikKKyAgdGVzdHNfcnVuID0gW10KKyAgdGVzdF9jYXNlID0gJycKKyAgdGVzdCA9ICcnCisgIGZvciBsaW5lIGluIHAub3V0cHV0LnNwbGl0KCdcbicpOgorICAgIG1hdGNoID0gVEVTVF9DQVNFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CisgICAgICB0ZXN0X2Nhc2UgPSBtYXRjaC5ncm91cCgxKQorICAgIGVsc2U6CisgICAgICBtYXRjaCA9IFRFU1RfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgorICAgICAgICB0ZXN0ID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgdGVzdHNfcnVuLmFwcGVuZCh0ZXN0X2Nhc2UgKyAnLicgKyB0ZXN0KQorICByZXR1cm4gKHRlc3RzX3J1biwgcC5leGl0X2NvZGUpCisKKworZGVmIEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsIGZ1bmN0aW9uLCAqYXJncywgKiprd2FyZ3MpOgorICAiIiJSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGluIGEgbW9kaWZpZWQgZW52aXJvbm1lbnQuIiIiCisgIHRyeToKKyAgICBvcmlnaW5hbF9lbnYgPSBlbnZpcm9uLmNvcHkoKQorICAgIGVudmlyb24udXBkYXRlKGV4dHJhX2VudikKKyAgICByZXR1cm4gZnVuY3Rpb24oKmFyZ3MsICoqa3dhcmdzKQorICBmaW5hbGx5OgorICAgIGVudmlyb24uY2xlYXIoKQorICAgIGVudmlyb24udXBkYXRlKG9yaWdpbmFsX2VudikKKworCitkZWYgUnVuV2l0aFNoYXJkaW5nKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsIGNvbW1hbmQpOgorICAiIiJSdW5zIGEgdGVzdCBwcm9ncmFtIHNoYXJkIGFuZCByZXR1cm5zIGV4aXQgY29kZSBhbmQgYSBsaXN0IG9mIHRlc3RzIHJ1bi4iIiIKKworICBleHRyYV9lbnYgPSB7U0hBUkRfSU5ERVhfRU5WX1ZBUjogc3RyKHNoYXJkX2luZGV4KSwKKyAgICAgICAgICAgICAgIFRPVEFMX1NIQVJEU19FTlZfVkFSOiBzdHIodG90YWxfc2hhcmRzKX0KKyAgcmV0dXJuIEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsIFJ1bkFuZEV4dHJhY3RUZXN0TGlzdCwgY29tbWFuZCkKKworIyBUaGUgdW5pdCB0ZXN0LgorCisKK2NsYXNzIEdUZXN0RmlsdGVyVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRoZSBlbnYgdmFyaWFibGUgb3IgdGhlIGNvbW1hbmQgbGluZSBmbGFnIHRvIGZpbHRlciB0ZXN0cy4iIiIKKworICAjIFV0aWxpdGllcy4KKworICBkZWYgQXNzZXJ0U2V0RXF1YWwoc2VsZiwgbGhzLCByaHMpOgorICAgICIiIkFzc2VydHMgdGhhdCB0d28gc2V0cyBhcmUgZXF1YWwuIiIiCisKKyAgICBmb3IgZWxlbSBpbiBsaHM6CisgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiByaHMsICclcyBpbiAlcycgJSAoZWxlbSwgcmhzKSkKKworICAgIGZvciBlbGVtIGluIHJoczoKKyAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIGxocywgJyVzIGluICVzJyAlIChlbGVtLCBsaHMpKQorCisgIGRlZiBBc3NlcnRQYXJ0aXRpb25Jc1ZhbGlkKHNlbGYsIHNldF92YXIsIGxpc3Rfb2Zfc2V0cyk6CisgICAgIiIiQXNzZXJ0cyB0aGF0IGxpc3Rfb2Zfc2V0cyBpcyBhIHZhbGlkIHBhcnRpdGlvbiBvZiBzZXRfdmFyLiIiIgorCisgICAgZnVsbF9wYXJ0aXRpb24gPSBbXQorICAgIGZvciBzbGljZV92YXIgaW4gbGlzdF9vZl9zZXRzOgorICAgICAgZnVsbF9wYXJ0aXRpb24uZXh0ZW5kKHNsaWNlX3ZhcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXRfdmFyKSwgbGVuKGZ1bGxfcGFydGl0aW9uKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNldHMuU2V0KHNldF92YXIpLCBzZXRzLlNldChmdWxsX3BhcnRpdGlvbikpCisKKyAgZGVmIEFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyhzZWxmLCB0ZXN0c190b19ydW4pOgorICAgICIiIkFkanVzdCB0ZXN0c190b19ydW4gaW4gY2FzZSB2YWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBkaXNhYmxlZC4iIiIKKworICAgIGdsb2JhbCBwYXJhbV90ZXN0c19wcmVzZW50CisgICAgaWYgbm90IHBhcmFtX3Rlc3RzX3ByZXNlbnQ6CisgICAgICByZXR1cm4gbGlzdChzZXRzLlNldCh0ZXN0c190b19ydW4pIC0gc2V0cy5TZXQoUEFSQU1fVEVTVFMpKQorICAgIGVsc2U6CisgICAgICByZXR1cm4gdGVzdHNfdG9fcnVuCisKKyAgZGVmIFJ1bkFuZFZlcmlmeShzZWxmLCBndGVzdF9maWx0ZXIsIHRlc3RzX3RvX3J1bik6CisgICAgIiIiQ2hlY2tzIHRoYXQgdGhlIGJpbmFyeSBydW5zIGNvcnJlY3Qgc2V0IG9mIHRlc3RzIGZvciBhIGdpdmVuIGZpbHRlci4iIiIKKworICAgIHRlc3RzX3RvX3J1biA9IHNlbGYuQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHRlc3RzX3RvX3J1bikKKworICAgICMgRmlyc3QsIHRlc3RzIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgICMgV2luZG93cyByZW1vdmVzIGVtcHR5IHZhcmlhYmxlcyBmcm9tIHRoZSBlbnZpcm9ubWVudCB3aGVuIHBhc3NpbmcgaXQKKyAgICAjIHRvIGEgbmV3IHByb2Nlc3MuICBUaGlzIG1lYW5zIGl0IGlzIGltcG9zc2libGUgdG8gcGFzcyBhbiBlbXB0eSBmaWx0ZXIKKyAgICAjIGludG8gYSBwcm9jZXNzIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEhvd2V2ZXIsIHdlIGNhbiBzdGlsbAorICAgICMgdGVzdCB0aGUgY2FzZSB3aGVuIHRoZSB2YXJpYWJsZSBpcyBub3Qgc3VwcGxpZWQgKGkuZS4sIGd0ZXN0X2ZpbHRlciBpcworICAgICMgTm9uZSkuCisgICAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2NDAzCisgICAgaWYgQ0FOX1RFU1RfRU1QVFlfRklMVEVSIG9yIGd0ZXN0X2ZpbHRlciAhPSAnJzoKKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgZ3Rlc3RfZmlsdGVyKQorICAgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KClbMF0KKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgTm9uZSkKKyAgICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCB0ZXN0c190b19ydW4pCisgICAgIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzY0MDMKKworICAgICMgTmV4dCwgdGVzdHMgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBmbGFnLgorCisgICAgaWYgZ3Rlc3RfZmlsdGVyIGlzIE5vbmU6CisgICAgICBhcmdzID0gW10KKyAgICBlbHNlOgorICAgICAgYXJncyA9IFsnLS0lcz0lcycgJSAoRklMVEVSX0ZMQUcsIGd0ZXN0X2ZpbHRlcildCisKKyAgICB0ZXN0c19ydW4gPSBSdW5BbmRFeHRyYWN0VGVzdExpc3QoYXJncylbMF0KKyAgICBzZWxmLkFzc2VydFNldEVxdWFsKHRlc3RzX3J1biwgdGVzdHNfdG9fcnVuKQorCisgIGRlZiBSdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoc2VsZiwgZ3Rlc3RfZmlsdGVyLCB0b3RhbF9zaGFyZHMsIHRlc3RzX3RvX3J1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPU5vbmUsIGNoZWNrX2V4aXRfMD1GYWxzZSk6CisgICAgIiIiQ2hlY2tzIHRoYXQgYmluYXJ5IHJ1bnMgY29ycmVjdCB0ZXN0cyBmb3IgdGhlIGdpdmVuIGZpbHRlciBhbmQgc2hhcmQuCisKKyAgICBSdW5zIGFsbCBzaGFyZHMgb2YgZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyB3aXRoIHRoZSBnaXZlbiBmaWx0ZXIsIGFuZAorICAgIHZlcmlmaWVzIHRoYXQgdGhlIHJpZ2h0IHNldCBvZiB0ZXN0cyB3ZXJlIHJ1bi4gVGhlIHVuaW9uIG9mIHRlc3RzIHJ1bgorICAgIG9uIGVhY2ggc2hhcmQgc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0ZXN0c190b19ydW4sIHdpdGhvdXQgZHVwbGljYXRlcy4KKworICAgIEFyZ3M6CisgICAgICBndGVzdF9maWx0ZXI6IEEgZmlsdGVyIHRvIGFwcGx5IHRvIHRoZSB0ZXN0cy4KKyAgICAgIHRvdGFsX3NoYXJkczogQSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzIHRvIHNwbGl0IHRlc3QgcnVuIGludG8uCisgICAgICB0ZXN0c190b19ydW46IEEgc2V0IG9mIHRlc3RzIGV4cGVjdGVkIHRvIHJ1bi4KKyAgICAgIGFyZ3MgICA6ICAgICAgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRvIHRoZSB0ZXN0IGJpbmFyeS4KKyAgICAgIGNoZWNrX2V4aXRfMDogV2hlbiBzZXQgdG8gYSB0cnVlIHZhbHVlLCBtYWtlIHN1cmUgdGhhdCBhbGwgc2hhcmRzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLgorICAgICIiIgorCisgICAgdGVzdHNfdG9fcnVuID0gc2VsZi5BZGp1c3RGb3JQYXJhbWV0ZXJpemVkVGVzdHModGVzdHNfdG9fcnVuKQorCisgICAgIyBXaW5kb3dzIHJlbW92ZXMgZW1wdHkgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50IHdoZW4gcGFzc2luZyBpdAorICAgICMgdG8gYSBuZXcgcHJvY2Vzcy4gIFRoaXMgbWVhbnMgaXQgaXMgaW1wb3NzaWJsZSB0byBwYXNzIGFuIGVtcHR5IGZpbHRlcgorICAgICMgaW50byBhIHByb2Nlc3MgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSG93ZXZlciwgd2UgY2FuIHN0aWxsCisgICAgIyB0ZXN0IHRoZSBjYXNlIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdCBzdXBwbGllZCAoaS5lLiwgZ3Rlc3RfZmlsdGVyIGlzCisgICAgIyBOb25lKS4KKyAgICAjIHB5bGludDogZGlzYWJsZS1tc2c9QzY0MDMKKyAgICBpZiBDQU5fVEVTVF9FTVBUWV9GSUxURVIgb3IgZ3Rlc3RfZmlsdGVyICE9ICcnOgorICAgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBndGVzdF9maWx0ZXIpCisgICAgICBwYXJ0aXRpb24gPSBbXQorICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgdG90YWxfc2hhcmRzKToKKyAgICAgICAgKHRlc3RzX3J1biwgZXhpdF9jb2RlKSA9IFJ1bldpdGhTaGFyZGluZyh0b3RhbF9zaGFyZHMsIGksIGFyZ3MpCisgICAgICAgIGlmIGNoZWNrX2V4aXRfMDoKKyAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4aXRfY29kZSkKKyAgICAgICAgcGFydGl0aW9uLmFwcGVuZCh0ZXN0c19ydW4pCisKKyAgICAgIHNlbGYuQXNzZXJ0UGFydGl0aW9uSXNWYWxpZCh0ZXN0c190b19ydW4sIHBhcnRpdGlvbikKKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgTm9uZSkKKyAgICAjIHB5bGludDogZW5hYmxlLW1zZz1DNjQwMworCisgIGRlZiBSdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKHNlbGYsIGd0ZXN0X2ZpbHRlciwgdGVzdHNfdG9fcnVuKToKKyAgICAiIiJDaGVja3MgdGhhdCB0aGUgYmluYXJ5IHJ1bnMgY29ycmVjdCBzZXQgb2YgdGVzdHMgZm9yIHRoZSBnaXZlbiBmaWx0ZXIuCisKKyAgICBSdW5zIGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gd2l0aCB0aGUgZ2l2ZW4gZmlsdGVyLCBhbmQgZW5hYmxlcworICAgIGRpc2FibGVkIHRlc3RzLiBWZXJpZmllcyB0aGF0IHRoZSByaWdodCBzZXQgb2YgdGVzdHMgd2VyZSBydW4uCisKKyAgICBBcmdzOgorICAgICAgZ3Rlc3RfZmlsdGVyOiBBIGZpbHRlciB0byBhcHBseSB0byB0aGUgdGVzdHMuCisgICAgICB0ZXN0c190b19ydW46IEEgc2V0IG9mIHRlc3RzIGV4cGVjdGVkIHRvIHJ1bi4KKyAgICAiIiIKKworICAgIHRlc3RzX3RvX3J1biA9IHNlbGYuQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHRlc3RzX3RvX3J1bikKKworICAgICMgQ29uc3RydWN0IHRoZSBjb21tYW5kIGxpbmUuCisgICAgYXJncyA9IFsnLS0lcycgJSBBTFNPX1JVTl9ESVNBQkVEX1RFU1RTX0ZMQUddCisgICAgaWYgZ3Rlc3RfZmlsdGVyIGlzIG5vdCBOb25lOgorICAgICAgYXJncy5hcHBlbmQoJy0tJXM9JXMnICUgKEZJTFRFUl9GTEFHLCBndGVzdF9maWx0ZXIpKQorCisgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MpWzBdCisgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIHRlc3RzX3RvX3J1bikKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgIiIiU2V0cyB1cCB0ZXN0IGNhc2UuCisKKyAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCBpbiB0aGUgYmluYXJ5IGFuZAorICAgIHNldHMgdGhlIGZsYWdzIGFjY29yZGluZ2x5LgorICAgICIiIgorCisgICAgZ2xvYmFsIHBhcmFtX3Rlc3RzX3ByZXNlbnQKKyAgICBpZiBwYXJhbV90ZXN0c19wcmVzZW50IGlzIE5vbmU6CisgICAgICBwYXJhbV90ZXN0c19wcmVzZW50ID0gUEFSQU1fVEVTVF9SRUdFWC5zZWFyY2goCisgICAgICAgICAgUnVuQW5kUmV0dXJuT3V0cHV0KCkpIGlzIG5vdCBOb25lCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3Ioc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIG9mIG5vdCBzcGVjaWZ5aW5nIHRoZSBmaWx0ZXIuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShOb25lLCBBQ1RJVkVfVEVTVFMpCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3JXaXRoU2hhcmRzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciB3aXRob3V0IHRoZSBmaWx0ZXIsIHdpdGggc2hhcmRpbmcgZW5hYmxlZC4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIDEsIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCAyLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgbGVuKEFDVElWRV9URVNUUykgLSAxLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgbGVuKEFDVElWRV9URVNUUyksIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCBsZW4oQUNUSVZFX1RFU1RTKSArIDEsIEFDVElWRV9URVNUUykKKworICBkZWYgdGVzdEVtcHR5RmlsdGVyKHNlbGYpOgorICAgICIiIlRlc3RzIGFuIGVtcHR5IGZpbHRlci4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcnLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZygnJywgMSwgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJycsIDIsIFtdKQorCisgIGRlZiB0ZXN0QmFkRmlsdGVyKHNlbGYpOgorICAgICIiIlRlc3RzIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBub3RoaW5nLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0JhZEZpbHRlcicsIFtdKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnQmFkRmlsdGVyJywgW10pCisKKyAgZGVmIHRlc3RGdWxsTmFtZShzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJpbmcgYnkgZnVsbCBuYW1lLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0Zvb1Rlc3QuWHl6JywgWydGb29UZXN0Llh5eiddKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnRm9vVGVzdC5YeXonLCBbJ0Zvb1Rlc3QuWHl6J10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJ0Zvb1Rlc3QuWHl6JywgNSwgWydGb29UZXN0Llh5eiddKQorCisgIGRlZiB0ZXN0VW5pdmVyc2FsRmlsdGVycyhzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJzIHRoYXQgbWF0Y2ggZXZlcnl0aGluZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqJywgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLionLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJyouKicsIGxlbihBQ1RJVkVfVEVTVFMpIC0gMywgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKicsIEFDVElWRV9URVNUUyArIERJU0FCTEVEX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKi4qJywgQUNUSVZFX1RFU1RTICsgRElTQUJMRURfVEVTVFMpCisKKyAgZGVmIHRlc3RGaWx0ZXJCeVRlc3RDYXNlKHNlbGYpOgorICAgICIiIlRlc3RzIGZpbHRlcmluZyBieSB0ZXN0IGNhc2UgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdGb29UZXN0LionLCBbJ0Zvb1Rlc3QuQWJjJywgJ0Zvb1Rlc3QuWHl6J10pCisKKyAgICBCQVpfVEVTVFMgPSBbJ0JhelRlc3QuVGVzdE9uZScsICdCYXpUZXN0LlRlc3RBJywgJ0JhelRlc3QuVGVzdEInXQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdCYXpUZXN0LionLCBCQVpfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdCYXpUZXN0LionLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVpfVEVTVFMgKyBbJ0JhelRlc3QuRElTQUJMRURfVGVzdEMnXSkKKworICBkZWYgdGVzdEZpbHRlckJ5VGVzdChzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJpbmcgYnkgdGVzdCBuYW1lLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyouVGVzdE9uZScsIFsnQmFyVGVzdC5UZXN0T25lJywgJ0JhelRlc3QuVGVzdE9uZSddKQorCisgIGRlZiB0ZXN0RmlsdGVyRGlzYWJsZWRUZXN0cyhzZWxmKToKKyAgICAiIiJTZWxlY3Qgb25seSB0aGUgZGlzYWJsZWQgdGVzdHMgdG8gcnVuLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnXSkKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqRElTQUJMRURfKicsIFtdKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKkRJU0FCTEVEXyonLCBESVNBQkxFRF9URVNUUykKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLkRJU0FCTEVEXyonLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJyouRElTQUJMRURfKicsIFsKKyAgICAgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZvdXInLAorICAgICAgICAnQmFyVGVzdC5ESVNBQkxFRF9UZXN0Rml2ZScsCisgICAgICAgICdCYXpUZXN0LkRJU0FCTEVEX1Rlc3RDJywKKyAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuRElTQUJMRURfVGVzdDInLAorICAgICAgICBdKQorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0RJU0FCTEVEXyonLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0RJU0FCTEVEXyonLCBbCisgICAgICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywKKyAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuRElTQUJMRURfVGVzdDInLAorICAgICAgICAnRElTQUJMRURfRm9vYmFyYmF6VGVzdC5UZXN0QScsCisgICAgICAgIF0pCisKKyAgZGVmIHRlc3RXaWxkY2FyZEluVGVzdENhc2VOYW1lKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHdpbGRjYXJkIGluIHRoZSB0ZXN0IGNhc2UgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqYSouKicsIFsKKyAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCisgICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgICdCYXpUZXN0LlRlc3RCJywgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCisKKyAgZGVmIHRlc3RXaWxkY2FyZEluVGVzdE5hbWUoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgd2lsZGNhcmQgaW4gdGhlIHRlc3QgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLipBKicsIFsnRm9vVGVzdC5BYmMnLCAnQmF6VGVzdC5UZXN0QSddKQorCisgIGRlZiB0ZXN0RmlsdGVyV2l0aG91dERvdChzZWxmKToKKyAgICAiIiJUZXN0cyBhIGZpbHRlciB0aGF0IGhhcyBubyAnLicgaW4gaXQuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKnoqJywgWworICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgICdCYXpUZXN0LlRlc3RCJywKKyAgICAgICAgXSkKKworICBkZWYgdGVzdFR3b1BhdHRlcm5zKHNlbGYpOgorICAgICIiIlRlc3RzIGZpbHRlcnMgdGhhdCBjb25zaXN0IG9mIHR3byBwYXR0ZXJucy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdGb28qLio6KkEqJywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAgICAgXSkKKworICAgICMgQW4gZW1wdHkgcGF0dGVybiArIGEgbm9uLWVtcHR5IG9uZQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCc6KkEqJywgWydGb29UZXN0LkFiYycsICdCYXpUZXN0LlRlc3RBJ10pCisKKyAgZGVmIHRlc3RUaHJlZVBhdHRlcm5zKHNlbGYpOgorICAgICIiIlRlc3RzIGZpbHRlcnMgdGhhdCBjb25zaXN0IG9mIHRocmVlIHBhdHRlcm5zLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJypvbyo6KkEqOipPbmUnLCBbCisgICAgICAgICdGb29UZXN0LkFiYycsCisgICAgICAgICdGb29UZXN0Llh5eicsCisKKyAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCisKKyAgICAgICAgJ0JhelRlc3QuVGVzdE9uZScsCisgICAgICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAgICAgXSkKKworICAgICMgVGhlIDJuZCBwYXR0ZXJuIGlzIGVtcHR5LgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqb28qOjoqT25lJywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICBdKQorCisgICAgIyBUaGUgbGFzdCAyIHBhdHRlcm5zIGFyZSBlbXB0eS4KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKm9vKjo6JywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0TmVnYXRpdmVGaWx0ZXJzKHNlbGYpOgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLUJhelRlc3QuVGVzdE9uZScsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisKKyAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QicsCisgICAgICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyotRm9vVGVzdC5BYmM6QmF6VGVzdC4qJywgWworICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKyAgICAgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnQmFyVGVzdC4qLUJhclRlc3QuVGVzdE9uZScsIFsKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisgICAgICAgIF0pCisKKyAgICAjIFRlc3RzIHdpdGhvdXQgbGVhZGluZyAnKicuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJy1Gb29UZXN0LkFiYzpGb29UZXN0Llh5ejpCYXpUZXN0LionLCBbCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKyAgICAgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCisKKyAgICAjIFZhbHVlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyovKicsIFBBUkFNX1RFU1RTKQorCisgICAgIyBWYWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpbHRlcmluZyBieSB0aGUgc2VxdWVuY2UgbmFtZS4KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnU2VxUC8qJywgWworICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8xJywKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMScsCisgICAgICAgIF0pCisKKyAgICAjIFZhbHVlIHBhcmFtZXRlcml6ZWQgdGVzdHMgZmlsdGVyaW5nIGJ5IHRoZSB0ZXN0IG5hbWUuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyovMCcsIFsKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMCcsCisgICAgICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0RmxhZ092ZXJyaWRlc0VudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBmaWx0ZXIgZmxhZyBvdmVycmlkZXMgdGhlIGZpbHRlcmluZyBlbnYuIHZhcmlhYmxlLiIiIgorCisgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCAnRm9vKicpCisgICAgYXJncyA9IFsnLS0lcz0lcycgJSAoRklMVEVSX0ZMQUcsICcqT25lJyldCisgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MpWzBdCisgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBOb25lKQorCisgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIFsnQmFyVGVzdC5UZXN0T25lJywgJ0JhelRlc3QuVGVzdE9uZSddKQorCisgIGRlZiB0ZXN0U2hhcmRTdGF0dXNGaWxlSXNDcmVhdGVkKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgdGhlIHNoYXJkIGZpbGUgaXMgY3JlYXRlZCBpZiBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50LiIiIgorCisgICAgc2hhcmRfc3RhdHVzX2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXJkX3N0YXR1c19maWxlJykKKyAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHNoYXJkX3N0YXR1c19maWxlKSkKKworICAgIGV4dHJhX2VudiA9IHtTSEFSRF9TVEFUVVNfRklMRV9FTlZfVkFSOiBzaGFyZF9zdGF0dXNfZmlsZX0KKyAgICB0cnk6CisgICAgICBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LCBSdW5BbmRSZXR1cm5PdXRwdXQpCisgICAgZmluYWxseToKKyAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCisgICAgICBvcy5yZW1vdmUoc2hhcmRfc3RhdHVzX2ZpbGUpCisKKyAgZGVmIHRlc3RTaGFyZFN0YXR1c0ZpbGVJc0NyZWF0ZWRXaXRoTGlzdFRlc3RzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgdGhlIHNoYXJkIGZpbGUgaXMgY3JlYXRlZCB3aXRoIHRoZSAibGlzdF90ZXN0cyIgZmxhZy4iIiIKKworICAgIHNoYXJkX3N0YXR1c19maWxlID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFyZF9zdGF0dXNfZmlsZTInKQorICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQorCisgICAgZXh0cmFfZW52ID0ge1NIQVJEX1NUQVRVU19GSUxFX0VOVl9WQVI6IHNoYXJkX3N0YXR1c19maWxlfQorICAgIHRyeToKKyAgICAgIG91dHB1dCA9IEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuQW5kUmV0dXJuT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMSVNUX1RFU1RTX0ZMQUddKQorICAgIGZpbmFsbHk6CisgICAgICAjIFRoaXMgYXNzZXJ0aW9uIGVuc3VyZXMgdGhhdCBHb29nbGUgVGVzdCBlbnVtZXJhdGVkIHRoZSB0ZXN0cyBhcworICAgICAgIyBvcHBvc2VkIHRvIHJ1bm5pbmcgdGhlbS4KKyAgICAgIHNlbGYuYXNzZXJ0XygnWz09PT09PT09PT1dJyBub3QgaW4gb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIG91dHB1dCBkdXJpbmcgdGVzdCBlbnVtZXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGVuc3VyZSB0aGF0IExJU1RfVEVTVFNfRkxBRyBpcyBhc3NpZ25lZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnY29ycmVjdCBmbGFnIHZhbHVlIGZvciBsaXN0aW5nIEdvb2dsZSBUZXN0IHRlc3RzLicpCisKKyAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCisgICAgICBvcy5yZW1vdmUoc2hhcmRfc3RhdHVzX2ZpbGUpCisKKyAgaWYgU1VQUE9SVFNfREVBVEhfVEVTVFM6CisgICAgZGVmIHRlc3RTaGFyZGluZ1dvcmtzV2l0aERlYXRoVGVzdHMoc2VsZik6CisgICAgICAiIiJUZXN0cyBpbnRlZ3JhdGlvbiB3aXRoIGRlYXRoIHRlc3RzIGFuZCBzaGFyZGluZy4iIiIKKworICAgICAgZ3Rlc3RfZmlsdGVyID0gJ0hhc0RlYXRoVGVzdC4qOlNlcVAvKicKKyAgICAgIGV4cGVjdGVkX3Rlc3RzID0gWworICAgICAgICAgICdIYXNEZWF0aFRlc3QuVGVzdDEnLAorICAgICAgICAgICdIYXNEZWF0aFRlc3QuVGVzdDInLAorCisgICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8xJywKKyAgICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMCcsCisgICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzEnLAorICAgICAgICAgIF0KKworICAgICAgZm9yIGZsYWcgaW4gWyctLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZScsCisgICAgICAgICAgICAgICAgICAgJy0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT1mYXN0J106CisgICAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKGd0ZXN0X2ZpbHRlciwgMywgZXhwZWN0ZWRfdGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2V4aXRfMD1UcnVlLCBhcmdzPVtmbGFnXSkKKyAgICAgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoZ3Rlc3RfZmlsdGVyLCA1LCBleHBlY3RlZF90ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfZXhpdF8wPVRydWUsIGFyZ3M9W2ZsYWddKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MKQEAgLTAsMCArMSwxNDAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QgdGVzdCBmaWx0ZXJzLgorLy8KKy8vIEEgdXNlciBjYW4gc3BlY2lmeSB3aGljaCB0ZXN0KHMpIGluIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0byBydW4gdmlhCisvLyBlaXRoZXIgdGhlIEdURVNUX0ZJTFRFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGZsYWcuICBUaGlzIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3VjaCBmdW5jdGlvbmFsaXR5LgorLy8KKy8vIFRoZSBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIERvbid0IHJ1biBpdAorLy8gZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCisvLyBUZXN0IGNhc2UgRm9vVGVzdC4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsKK30KKworVEVTVF9GKEZvb1Rlc3QsIFh5eikgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdCBjYXNlIEJhclRlc3QuCisKK1RFU1QoQmFyVGVzdCwgVGVzdE9uZSkgeworfQorCitURVNUKEJhclRlc3QsIFRlc3RUd28pIHsKK30KKworVEVTVChCYXJUZXN0LCBUZXN0VGhyZWUpIHsKK30KKworVEVTVChCYXJUZXN0LCBESVNBQkxFRF9UZXN0Rm91cikgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworVEVTVChCYXJUZXN0LCBESVNBQkxFRF9UZXN0Rml2ZSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdCBjYXNlIEJhelRlc3QuCisKK1RFU1QoQmF6VGVzdCwgVGVzdE9uZSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworVEVTVChCYXpUZXN0LCBUZXN0QSkgeworfQorCitURVNUKEJhelRlc3QsIFRlc3RCKSB7Cit9CisKK1RFU1QoQmF6VGVzdCwgRElTQUJMRURfVGVzdEMpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBIYXNEZWF0aFRlc3QKKworVEVTVChIYXNEZWF0aFRlc3QsIFRlc3QxKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoZXhpdCgxKSwgIi4qIik7Cit9CisKKy8vIFdlIG5lZWQgYXQgbGVhc3QgdHdvIGRlYXRoIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhbGwgZGVhdGggdGVzdHMKKy8vIGFyZW4ndCBvbiB0aGUgZmlyc3Qgc2hhcmQuCitURVNUKEhhc0RlYXRoVGVzdCwgVGVzdDIpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChleGl0KDEpLCAiLioiKTsKK30KKworLy8gVGVzdCBjYXNlIEZvb2JhclRlc3QKKworVEVTVChESVNBQkxFRF9Gb29iYXJUZXN0LCBUZXN0MSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworVEVTVChESVNBQkxFRF9Gb29iYXJUZXN0LCBESVNBQkxFRF9UZXN0MikgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdCBjYXNlIEZvb2JhcmJhelRlc3QKKworVEVTVChESVNBQkxFRF9Gb29iYXJiYXpUZXN0LCBUZXN0QSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCitjbGFzcyBQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKK307CisKK1RFU1RfUChQYXJhbVRlc3QsIFRlc3RYKSB7Cit9CisKK1RFU1RfUChQYXJhbVRlc3QsIFRlc3RZKSB7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcVAsIFBhcmFtVGVzdCwgdGVzdGluZzo6VmFsdWVzKDEsIDIpKTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcVEsIFBhcmFtVGVzdCwgdGVzdGluZzo6VmFsdWVzKDUsIDYpKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5IGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5M2M4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIHRoZSAtLWhlbHAgZmxhZyBvZiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorCitTWU5PUFNJUworICAgICAgIGd0ZXN0X2hlbHBfdGVzdC5weSAtLWJ1aWxkX2Rpcj1CVUlMRC9ESVIKKyAgICAgICAgICMgd2hlcmUgQlVJTEQvRElSIGNvbnRhaW5zIHRoZSBidWlsdCBndGVzdF9oZWxwX3Rlc3RfIGZpbGUuCisgICAgICAgZ3Rlc3RfaGVscF90ZXN0LnB5CisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworSVNfTElOVVggPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kIG9zLnVuYW1lKClbMF0gPT0gJ0xpbnV4JworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworCitQUk9HUkFNX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfaGVscF90ZXN0XycpCitGTEFHX1BSRUZJWCA9ICctLWd0ZXN0XycKK0RFQVRIX1RFU1RfU1RZTEVfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2RlYXRoX3Rlc3Rfc3R5bGUnCitTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdzdHJlYW1fcmVzdWx0X3RvJworVU5LTk9XTl9GTEFHID0gRkxBR19QUkVGSVggKyAndW5rbm93bl9mbGFnX2Zvcl90ZXN0aW5nJworTElTVF9URVNUU19GTEFHID0gRkxBR19QUkVGSVggKyAnbGlzdF90ZXN0cycKK0lOQ09SUkVDVF9GTEFHX1ZBUklBTlRTID0gW3JlLnN1YignXi0tJywgJy0nLCBMSVNUX1RFU1RTX0ZMQUcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuc3ViKCdeLS0nLCAnLycsIExJU1RfVEVTVFNfRkxBRyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5zdWIoJ18nLCAnLScsIExJU1RfVEVTVFNfRkxBRyldCitJTlRFUk5BTF9GTEFHX0ZPUl9URVNUSU5HID0gRkxBR19QUkVGSVggKyAnaW50ZXJuYWxfZmxhZ19mb3JfdGVzdGluZycKKworU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAiRGVhdGhUZXN0IiBpbiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW1BST0dSQU1fUEFUSCwgTElTVF9URVNUU19GTEFHXSkub3V0cHV0CisKKyMgVGhlIGhlbHAgbWVzc2FnZSBtdXN0IG1hdGNoIHRoaXMgcmVnZXguCitIRUxQX1JFR0VYID0gcmUuY29tcGlsZSgKKyAgICBGTEFHX1BSRUZJWCArIHInbGlzdF90ZXN0cy4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ2ZpbHRlcj0uKicgKworICAgIEZMQUdfUFJFRklYICsgcidhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cy4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3JlcGVhdD0uKicgKworICAgIEZMQUdfUFJFRklYICsgcidzaHVmZmxlLionICsKKyAgICBGTEFHX1BSRUZJWCArIHIncmFuZG9tX3NlZWQ9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInY29sb3I9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHIncHJpbnRfdGltZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ291dHB1dD0uKicgKworICAgIEZMQUdfUFJFRklYICsgcidicmVha19vbl9mYWlsdXJlLionICsKKyAgICBGTEFHX1BSRUZJWCArIHIndGhyb3dfb25fZmFpbHVyZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ2NhdGNoX2V4Y2VwdGlvbnM9MC4qJywKKyAgICByZS5ET1RBTEwpCisKKworZGVmIFJ1bldpdGhGbGFnKGZsYWcpOgorICAiIiJSdW5zIGd0ZXN0X2hlbHBfdGVzdF8gd2l0aCB0aGUgZ2l2ZW4gZmxhZy4KKworICBSZXR1cm5zOgorICAgIHRoZSBleGl0IGNvZGUgYW5kIHRoZSB0ZXh0IG91dHB1dCBhcyBhIHR1cGxlLgorICBBcmdzOgorICAgIGZsYWc6IHRoZSBjb21tYW5kLWxpbmUgZmxhZyB0byBwYXNzIHRvIGd0ZXN0X2hlbHBfdGVzdF8sIG9yIE5vbmUuCisgICIiIgorCisgIGlmIGZsYWcgaXMgTm9uZToKKyAgICBjb21tYW5kID0gW1BST0dSQU1fUEFUSF0KKyAgZWxzZToKKyAgICBjb21tYW5kID0gW1BST0dSQU1fUEFUSCwgZmxhZ10KKyAgY2hpbGQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKKyAgcmV0dXJuIGNoaWxkLmV4aXRfY29kZSwgY2hpbGQub3V0cHV0CisKKworY2xhc3MgR1Rlc3RIZWxwVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdGhlIC0taGVscCBmbGFnIGFuZCBpdHMgZXF1aXZhbGVudCBmb3Jtcy4iIiIKKworICBkZWYgVGVzdEhlbHBGbGFnKHNlbGYsIGZsYWcpOgorICAgICIiIlZlcmlmaWVzIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLgorCisgICAgVGhlIHJpZ2h0IG1lc3NhZ2UgbXVzdCBiZSBwcmludGVkIGFuZCB0aGUgdGVzdHMgbXVzdAorICAgIHNraXBwZWQgd2hlbiB0aGUgZ2l2ZW4gZmxhZyBpcyBzcGVjaWZpZWQuCisKKyAgICBBcmdzOgorICAgICAgZmxhZzogIEEgZmxhZyB0byBwYXNzIHRvIHRoZSBiaW5hcnkgb3IgTm9uZS4KKyAgICAiIiIKKworICAgIGV4aXRfY29kZSwgb3V0cHV0ID0gUnVuV2l0aEZsYWcoZmxhZykKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBleGl0X2NvZGUpCisgICAgc2VsZi5hc3NlcnRfKEhFTFBfUkVHRVguc2VhcmNoKG91dHB1dCksIG91dHB1dCkKKworICAgIGlmIElTX0xJTlVYOgorICAgICAgc2VsZi5hc3NlcnRfKFNUUkVBTV9SRVNVTFRfVE9fRkxBRyBpbiBvdXRwdXQsIG91dHB1dCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKFNUUkVBTV9SRVNVTFRfVE9fRkxBRyBub3QgaW4gb3V0cHV0LCBvdXRwdXQpCisKKyAgICBpZiBTVVBQT1JUU19ERUFUSF9URVNUUyBhbmQgbm90IElTX1dJTkRPV1M6CisgICAgICBzZWxmLmFzc2VydF8oREVBVEhfVEVTVF9TVFlMRV9GTEFHIGluIG91dHB1dCwgb3V0cHV0KQorICAgIGVsc2U6CisgICAgICBzZWxmLmFzc2VydF8oREVBVEhfVEVTVF9TVFlMRV9GTEFHIG5vdCBpbiBvdXRwdXQsIG91dHB1dCkKKworICBkZWYgVGVzdE5vbkhlbHBGbGFnKHNlbGYsIGZsYWcpOgorICAgICIiIlZlcmlmaWVzIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBubyBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLgorCisgICAgVmVyaWZpZXMgdGhhdCB3aGVuIG5vIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSB0ZXN0cyBhcmUgcnVuCisgICAgYW5kIHRoZSBoZWxwIG1lc3NhZ2UgaXMgbm90IHByaW50ZWQuCisKKyAgICBBcmdzOgorICAgICAgZmxhZzogIEEgZmxhZyB0byBwYXNzIHRvIHRoZSBiaW5hcnkgb3IgTm9uZS4KKyAgICAiIiIKKworICAgIGV4aXRfY29kZSwgb3V0cHV0ID0gUnVuV2l0aEZsYWcoZmxhZykKKyAgICBzZWxmLmFzc2VydF8oZXhpdF9jb2RlICE9IDApCisgICAgc2VsZi5hc3NlcnRfKG5vdCBIRUxQX1JFR0VYLnNlYXJjaChvdXRwdXQpLCBvdXRwdXQpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aEZ1bGxGbGFnKHNlbGYpOgorICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctLWhlbHAnKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhTaG9ydEZsYWcoc2VsZik6CisgICAgc2VsZi5UZXN0SGVscEZsYWcoJy1oJykKKworICBkZWYgdGVzdFByaW50c0hlbHBXaXRoUXVlc3Rpb25GbGFnKHNlbGYpOgorICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctPycpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aFdpbmRvd3NTdHlsZVF1ZXN0aW9uRmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZygnLz8nKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhVbnJlY29nbml6ZWRHb29nbGVUZXN0RmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZyhVTktOT1dOX0ZMQUcpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aEluY29ycmVjdEZsYWdTdHlsZShzZWxmKToKKyAgICBmb3IgaW5jb3JyZWN0X2ZsYWcgaW4gSU5DT1JSRUNUX0ZMQUdfVkFSSUFOVFM6CisgICAgICBzZWxmLlRlc3RIZWxwRmxhZyhpbmNvcnJlY3RfZmxhZykKKworICBkZWYgdGVzdFJ1bnNUZXN0c1dpdGhvdXRIZWxwRmxhZyhzZWxmKToKKyAgICAiIiJWZXJpZmllcyB0aGF0IHdoZW4gbm8gaGVscCBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIHRlc3RzIGFyZSBydW4KKyAgICBhbmQgdGhlIGhlbHAgbWVzc2FnZSBpcyBub3QgcHJpbnRlZC4iIiIKKworICAgIHNlbGYuVGVzdE5vbkhlbHBGbGFnKE5vbmUpCisKKyAgZGVmIHRlc3RSdW5zVGVzdHNXaXRoR3Rlc3RJbnRlcm5hbEZsYWcoc2VsZik6CisgICAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgdGVzdHMgYXJlIHJ1biBhbmQgbm8gaGVscCBtZXNzYWdlIGlzIHByaW50ZWQgd2hlbgorICAgIGEgZmxhZyBzdGFydGluZyB3aXRoIEdvb2dsZSBUZXN0IHByZWZpeCBhbmQgJ2ludGVybmFsXycgaXMgc3VwcGxpZWQuIiIiCisKKyAgICBzZWxmLlRlc3ROb25IZWxwRmxhZyhJTlRFUk5BTF9GTEFHX0ZPUl9URVNUSU5HKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9oZWxwX3Rlc3RfLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWY3OGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYwpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUaGlzIHByb2dyYW0gaXMgbWVhbnQgdG8gYmUgcnVuIGJ5IGd0ZXN0X2hlbHBfdGVzdC5weS4gIERvIG5vdCBydW4KKy8vIGl0IGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gV2hlbiBhIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoaXMgcHJvZ3JhbSBzaG91bGQgc2tpcCB0aGUgdGVzdHMKKy8vIGFuZCBleGl0IHdpdGggMDsgb3RoZXJ3aXNlIHRoZSBmb2xsb3dpbmcgdGVzdCB3aWxsIGJlIGV4ZWN1dGVkLAorLy8gY2F1c2luZyB0aGlzIHByb2dyYW0gdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KK1RFU1QoSGVscEZsYWdUZXN0LCBTaG91bGROb3RCZVJ1bikgeworICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlRlc3RzIHNob3VsZG4ndCBiZSBydW4gd2hlbiAtLWhlbHAgaXMgc3BlY2lmaWVkLiI7Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorVEVTVChEZWF0aFRlc3QsIFVzZWRCeVB5dGhvblNjcmlwdFRvRGV0ZWN0U3VwcG9ydEZvckRlYXRoVGVzdHNJblRoaXNCaW5hcnkpIHt9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlOGMzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTc3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuCisKK0EgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIGxpc3QgYWxsIHRlc3RzIGJ5IHNwZWNpZnlpbmcgdGhlCistLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4gIFRoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eQorYnkgaW52b2tpbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLgorIiIiCisKK19fYXV0aG9yX18gPSAncGhhbm5hQGdvb2dsZS5jb20gKFBhdHJpY2sgSGFubmEpJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKKyMgQ29uc3RhbnRzLgorCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIGxpc3RpbmcgYWxsIHRlc3RzLgorTElTVF9URVNUU19GTEFHID0gJ2d0ZXN0X2xpc3RfdGVzdHMnCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gcHJvZ3JhbS4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfJykKKworIyBUaGUgZXhwZWN0ZWQgb3V0cHV0IHdoZW4gcnVubmluZyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyB3aXRoCisjIC0tZ3Rlc3RfbGlzdF90ZXN0cworRVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUiA9ICIiIkZvb0RlYXRoVGVzdC4KKyAgVGVzdDEKK0Zvby4KKyAgQmFyMQorICBCYXIyCisgIERJU0FCTEVEX0JhcjMKK0FiYy4KKyAgWHl6CisgIERlZgorRm9vQmFyLgorICBCYXoKK0Zvb1Rlc3QuCisgIFRlc3QxCisgIERJU0FCTEVEX1Rlc3QyCisgIFRlc3QzCisiIiIKKworIyBUaGUgZXhwZWN0ZWQgb3V0cHV0IHdoZW4gcnVubmluZyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyB3aXRoCisjIC0tZ3Rlc3RfbGlzdF90ZXN0cyBhbmQgLS1ndGVzdF9maWx0ZXI9Rm9vKi4KK0VYUEVDVEVEX09VVFBVVF9GSUxURVJfRk9PID0gIiIiRm9vRGVhdGhUZXN0LgorICBUZXN0MQorRm9vLgorICBCYXIxCisgIEJhcjIKKyAgRElTQUJMRURfQmFyMworRm9vQmFyLgorICBCYXoKK0Zvb1Rlc3QuCisgIFRlc3QxCisgIERJU0FCTEVEX1Rlc3QyCisgIFRlc3QzCisiIiIKKworIyBVdGlsaXRpZXMuCisKKworZGVmIFJ1bihhcmdzKToKKyAgIiIiUnVucyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZiB0ZXN0cyBwcmludGVkLiIiIgorCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0VYRV9QQVRIXSArIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9zdGRlcnI9RmFsc2UpLm91dHB1dAorCisKKyMgVGhlIHVuaXQgdGVzdC4KKworY2xhc3MgR1Rlc3RMaXN0VGVzdHNVbml0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHRvIGxpc3QgYWxsIHRlc3RzLiIiIgorCisgIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZmxhZ192YWx1ZSwgZXhwZWN0ZWRfb3V0cHV0LCBvdGhlcl9mbGFnKToKKyAgICAiIiJSdW5zIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IHByaW50cworICAgIHRoZSBjb3JyZWN0IHRlc3RzLgorCisgICAgQXJnczoKKyAgICAgIGZsYWdfdmFsdWU6ICAgICAgIHZhbHVlIG9mIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgorCisgICAgICBleHBlY3RlZF9vdXRwdXQ6ICB0aGUgZXhwZWN0ZWQgb3V0cHV0IGFmdGVyIHJ1bm5pbmcgY29tbWFuZDsKKworICAgICAgb3RoZXJfZmxhZzogICAgICAgYSBkaWZmZXJlbnQgZmxhZyB0byBiZSBwYXNzZWQgdG8gY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgYWxvbmcgd2l0aCBndGVzdF9saXN0X3Rlc3RzOworICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSBpZiB0aGUgZmxhZyBzaG91bGQgbm90IGJlIHByZXNlbnQuCisgICAgIiIiCisKKyAgICBpZiBmbGFnX3ZhbHVlIGlzIE5vbmU6CisgICAgICBmbGFnID0gJycKKyAgICAgIGZsYWdfZXhwcmVzc2lvbiA9ICdub3Qgc2V0JworICAgIGVsaWYgZmxhZ192YWx1ZSA9PSAnMCc6CisgICAgICBmbGFnID0gJy0tJXM9MCcgJSBMSVNUX1RFU1RTX0ZMQUcKKyAgICAgIGZsYWdfZXhwcmVzc2lvbiA9ICcwJworICAgIGVsc2U6CisgICAgICBmbGFnID0gJy0tJXMnICUgTElTVF9URVNUU19GTEFHCisgICAgICBmbGFnX2V4cHJlc3Npb24gPSAnMScKKworICAgIGFyZ3MgPSBbZmxhZ10KKworICAgIGlmIG90aGVyX2ZsYWcgaXMgbm90IE5vbmU6CisgICAgICBhcmdzICs9IFtvdGhlcl9mbGFnXQorCisgICAgb3V0cHV0ID0gUnVuKGFyZ3MpCisKKyAgICBtc2cgPSAoJ3doZW4gJXMgaXMgJXMsIHRoZSBvdXRwdXQgb2YgIiVzIiBpcyAiJXMiLicgJQorICAgICAgICAgICAoTElTVF9URVNUU19GTEFHLCBmbGFnX2V4cHJlc3Npb24sICcgJy5qb2luKGFyZ3MpLCBvdXRwdXQpKQorCisgICAgaWYgZXhwZWN0ZWRfb3V0cHV0IGlzIG5vdCBOb25lOgorICAgICAgc2VsZi5hc3NlcnRfKG91dHB1dCA9PSBleHBlY3RlZF9vdXRwdXQsIG1zZykKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKG91dHB1dCAhPSBFWFBFQ1RFRF9PVVRQVVRfTk9fRklMVEVSLCBtc2cpCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3Ioc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IG1vZGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz1Ob25lKQorCisgIGRlZiB0ZXN0RmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPU5vbmUpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0PUVYUEVDVEVEX09VVFBVVF9OT19GSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz1Ob25lKQorCisgIGRlZiB0ZXN0T3ZlcnJpZGVOb25GaWx0ZXJGbGFncyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IC0tZ3Rlc3RfbGlzdF90ZXN0cyBvdmVycmlkZXMgdGhlIG5vbi1maWx0ZXIgZmxhZ3MuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQ9RVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPSctLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUnKQorCisgIGRlZiB0ZXN0V2l0aEZpbHRlckZsYWdzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgLS1ndGVzdF9saXN0X3Rlc3RzIHRha2VzIGludG8gYWNjb3VudCB0aGUKKyAgICAtLWd0ZXN0X2ZpbHRlciBmbGFnLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0PUVYUEVDVEVEX09VVFBVVF9GSUxURVJfRk9PLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Jy0tZ3Rlc3RfZmlsdGVyPUZvbyonKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWQwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBwaGFubmFAZ29vZ2xlLmNvbSAoUGF0cmljayBIYW5uYSkKKworLy8gVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnLgorLy8KKy8vIEEgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIGxpc3QgYWxsIHRlc3RzIHRoYXQgd2lsbCBydW4KKy8vIHNvIHRoYXQgd2hlbiB1c2luZyBhIGZpbHRlciwgYSB1c2VyIHdpbGwga25vdyB3aGF0CisvLyB0ZXN0cyB0byBsb29rIGZvci4gVGhlIHRlc3RzIHdpbGwgbm90IGJlIHJ1biBhZnRlciBsaXN0aW5nLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuCisvLyBEb24ndCBydW4gaXQgZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCisvLyBTZXZlcmFsIGRpZmZlcmVudCB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0aGF0IHdpbGwgYmUgbGlzdGVkLgorVEVTVChGb28sIEJhcjEpIHsKK30KKworVEVTVChGb28sIEJhcjIpIHsKK30KKworVEVTVChGb28sIERJU0FCTEVEX0JhcjMpIHsKK30KKworVEVTVChBYmMsIFh5eikgeworfQorCitURVNUKEFiYywgRGVmKSB7Cit9CisKK1RFU1QoRm9vQmFyLCBCYXopIHsKK30KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MSkgeworfQorCitURVNUX0YoRm9vVGVzdCwgRElTQUJMRURfVGVzdDIpIHsKK30KKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QzKSB7Cit9CisKK1RFU1QoRm9vRGVhdGhUZXN0LCBUZXN0MSkgeworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfbWFpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Q5YmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfbWFpbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVGVzdHMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRlZmluZSBtYWluKCkgd2hlbiB3ZSBsaW5rIHRvCisvLyBndGVzdF9tYWluIGluc3RlYWQgb2YgZ3Rlc3QuCisKK25hbWVzcGFjZSB7CisKK1RFU1QoR1Rlc3RNYWluVGVzdCwgU2hvdWxkU3VjY2VlZCkgeworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gV2UgYXJlIHVzaW5nIHRoZSBtYWluKCkgZnVuY3Rpb24gZGVmaW5lZCBpbiBzcmMvZ3Rlc3RfbWFpbi5jYywgc28KKy8vIHdlIGRvbid0IGRlZmluZSBpdCBoZXJlLgpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhODVmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUZXN0cyB0aGF0IGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0aGF0IGhhcyBubyB0ZXN0IGRlZmluZWQgY2FuIHJ1bgorLy8gc3VjY2Vzc2Z1bGx5LgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBBbiBhZC1ob2MgYXNzZXJ0aW9uIG91dHNpZGUgb2YgYWxsIHRlc3RzLgorICAvLworICAvLyBUaGlzIHNlcnZlcyB0aHJlZSBwdXJwb3NlczoKKyAgLy8KKyAgLy8gMS4gSXQgdmVyaWZpZXMgdGhhdCBhbiBhZC1ob2MgYXNzZXJ0aW9uIGNhbiBiZSBleGVjdXRlZCBldmVuIGlmCisgIC8vICAgIG5vIHRlc3QgaXMgZGVmaW5lZC4KKyAgLy8gMi4gSXQgdmVyaWZpZXMgdGhhdCBhIGZhaWxlZCBhZC1ob2MgYXNzZXJ0aW9uIGNhdXNlcyB0aGUgdGVzdAorICAvLyAgICBwcm9ncmFtIHRvIGZhaWwuCisgIC8vIDMuIFdlIGhhZCBhIGJ1ZyB3aGVyZSB0aGUgWE1MIG91dHB1dCB3b24ndCBiZSBnZW5lcmF0ZWQgaWYgYW4KKyAgLy8gICAgYXNzZXJ0aW9uIGlzIGV4ZWN1dGVkIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkLCBldmVuCisgIC8vICAgIHRob3VnaCAtLWd0ZXN0X291dHB1dD14bWwgaXMgc3BlY2lmaWVkLiAgVGhpcyBtYWtlcyBzdXJlIHRoZQorICAvLyAgICBidWcgaXMgZml4ZWQgYW5kIGRvZXNuJ3QgcmVncmVzcy4KKyAgRVhQRUNUX0VRKDEsIDIpOworCisgIC8vIFRoZSBhYm92ZSBFWFBFQ1RfRVEoKSBzaG91bGQgY2F1c2UgUlVOX0FMTF9URVNUUygpIHRvIHJldHVybiBub24temVyby4KKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKSA/IDAgOiAxOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDA5ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKQEAgLTAsMCArMSwzMzUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIHRoZSB0ZXh0IG91dHB1dCBvZiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorCitTWU5PUFNJUworICAgICAgIGd0ZXN0X291dHB1dF90ZXN0LnB5IC0tYnVpbGRfZGlyPUJVSUxEL0RJUiAtLWdlbmdvbGRlbgorICAgICAgICAgIyB3aGVyZSBCVUlMRC9ESVIgY29udGFpbnMgdGhlIGJ1aWx0IGd0ZXN0X291dHB1dF90ZXN0XyBmaWxlLgorICAgICAgIGd0ZXN0X291dHB1dF90ZXN0LnB5IC0tZ2VuZ29sZGVuCisgICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCisjIFRoZSBmbGFnIGZvciBnZW5lcmF0aW5nIHRoZSBnb2xkZW4gZmlsZQorR0VOR09MREVOX0ZMQUcgPSAnLS1nZW5nb2xkZW4nCitDQVRDSF9FWENFUFRJT05TX0VOVl9WQVJfTkFNRSA9ICdHVEVTVF9DQVRDSF9FWENFUFRJT05TJworCitJU19XSU5ET1dTID0gb3MubmFtZSA9PSAnbnQnCisKKyMgVE9ETyh2bGFkbEBnb29nbGUuY29tKTogcmVtb3ZlIHRoZSBfbGluIHN1ZmZpeC4KK0dPTERFTl9OQU1FID0gJ2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0JworCitQUk9HUkFNX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3Rfb3V0cHV0X3Rlc3RfJykKKworIyBBdCBsZWFzdCBvbmUgY29tbWFuZCB3ZSBleGVyY2lzZSBtdXN0IG5vdCBoYXZlIHRoZQorIyAtLWd0ZXN0X2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cyBmbGFnLgorQ09NTUFORF9MSVNUX1RFU1RTID0gKHt9LCBbUFJPR1JBTV9QQVRILCAnLS1ndGVzdF9saXN0X3Rlc3RzJ10pCitDT01NQU5EX1dJVEhfQ09MT1IgPSAoe30sIFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2NvbG9yPXllcyddKQorQ09NTUFORF9XSVRIX1RJTUUgPSAoe30sIFtQUk9HUkFNX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X3ByaW50X3RpbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1ndGVzdF9pbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1ndGVzdF9maWx0ZXI9RmF0YWxGYWlsdXJlVGVzdC4qOkxvZ2dpbmdUZXN0LionXSkKK0NPTU1BTkRfV0lUSF9ESVNBQkxFRCA9ICgKKyAgICB7fSwgW1BST0dSQU1fUEFUSCwKKyAgICAgICAgICctLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzJywKKyAgICAgICAgICctLWd0ZXN0X2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCisgICAgICAgICAnLS1ndGVzdF9maWx0ZXI9KkRJU0FCTEVEXyonXSkKK0NPTU1BTkRfV0lUSF9TSEFSRElORyA9ICgKKyAgICB7J0dURVNUX1NIQVJEX0lOREVYJzogJzEnLCAnR1RFU1RfVE9UQUxfU0hBUkRTJzogJzInfSwKKyAgICBbUFJPR1JBTV9QQVRILAorICAgICAnLS1ndGVzdF9pbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMnLAorICAgICAnLS1ndGVzdF9maWx0ZXI9UGFzc2luZ1Rlc3QuKiddKQorCitHT0xERU5fUEFUSCA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFNvdXJjZURpcigpLCBHT0xERU5fTkFNRSkKKworCitkZWYgVG9Vbml4TGluZUVuZGluZyhzKToKKyAgIiIiQ2hhbmdlcyBhbGwgV2luZG93cy9NYWMgbGluZSBlbmRpbmdzIGluIHMgdG8gVU5JWCBsaW5lIGVuZGluZ3MuIiIiCisKKyAgcmV0dXJuIHMucmVwbGFjZSgnXHJcbicsICdcbicpLnJlcGxhY2UoJ1xyJywgJ1xuJykKKworCitkZWYgUmVtb3ZlTG9jYXRpb25zKHRlc3Rfb3V0cHV0KToKKyAgIiIiUmVtb3ZlcyBhbGwgZmlsZSBsb2NhdGlvbiBpbmZvIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIEFyZ3M6CisgICAgICAgdGVzdF9vdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KKworICBSZXR1cm5zOgorICAgICAgIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gKGluIHRoZSBmb3JtIG9mCisgICAgICAgJ0RJUkVDVE9SWS9GSUxFX05BTUU6TElORV9OVU1CRVI6ICdvcgorICAgICAgICdESVJFQ1RPUllcXEZJTEVfTkFNRShMSU5FX05VTUJFUik6ICcpIHJlcGxhY2VkIGJ5CisgICAgICAgJ0ZJTEVfTkFNRTojOiAnLgorICAiIiIKKworICByZXR1cm4gcmUuc3ViKHInLipbL1xcXSguKykoXDpcZCt8XChcZCtcKSlcOiAnLCByJ1wxOiM6ICcsIHRlc3Rfb3V0cHV0KQorCisKK2RlZiBSZW1vdmVTdGFja1RyYWNlRGV0YWlscyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCBzdGFjayB0cmFjZXMgZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuIiIiCisKKyAgIyAqPyBtZWFucyAiZmluZCB0aGUgc2hvcnRlc3Qgc3RyaW5nIHRoYXQgbWF0Y2hlcyIuCisgIHJldHVybiByZS5zdWIocidTdGFjayB0cmFjZTooLnxcbikqP1xuXG4nLAorICAgICAgICAgICAgICAgICdTdGFjayB0cmFjZTogKG9taXR0ZWQpXG5cbicsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlU3RhY2tUcmFjZXMob3V0cHV0KToKKyAgIiIiUmVtb3ZlcyBhbGwgdHJhY2VzIG9mIHN0YWNrIHRyYWNlcyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKKworICAjICo/IG1lYW5zICJmaW5kIHRoZSBzaG9ydGVzdCBzdHJpbmcgdGhhdCBtYXRjaGVzIi4KKyAgcmV0dXJuIHJlLnN1YihyJ1N0YWNrIHRyYWNlOigufFxuKSo/XG5cbicsICcnLCBvdXRwdXQpCisKKworZGVmIFJlbW92ZVRpbWUob3V0cHV0KToKKyAgIiIiUmVtb3ZlcyBhbGwgdGltZSBpbmZvcm1hdGlvbiBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKKworICByZXR1cm4gcmUuc3ViKHInXChcZCsgbXMnLCAnKD8gbXMnLCBvdXRwdXQpCisKKworZGVmIFJlbW92ZVR5cGVJbmZvRGV0YWlscyh0ZXN0X291dHB1dCk6CisgICIiIlJlbW92ZXMgY29tcGlsZXItc3BlY2lmaWMgdHlwZSBpbmZvIGZyb20gR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4KKworICBBcmdzOgorICAgICAgIHRlc3Rfb3V0cHV0OiAgdGhlIG91dHB1dCBvZiBhIEdvb2dsZSBUZXN0IHByb2dyYW0uCisKKyAgUmV0dXJuczoKKyAgICAgICBvdXRwdXQgd2l0aCB0eXBlIGluZm9ybWF0aW9uIG5vcm1hbGl6ZWQgdG8gY2Fub25pY2FsIGZvcm0uCisgICIiIgorCisgICMgc29tZSBjb21waWxlcnMgb3V0cHV0IHRoZSBuYW1lIG9mIHR5cGUgJ3Vuc2lnbmVkIGludCcgYXMgJ3Vuc2lnbmVkJworICByZXR1cm4gcmUuc3ViKHIndW5zaWduZWQgaW50JywgJ3Vuc2lnbmVkJywgdGVzdF9vdXRwdXQpCisKKworZGVmIE5vcm1hbGl6ZVRvQ3VycmVudFBsYXRmb3JtKHRlc3Rfb3V0cHV0KToKKyAgIiIiTm9ybWFsaXplcyBwbGF0Zm9ybSBzcGVjaWZpYyBvdXRwdXQgZGV0YWlscyBmb3IgZWFzaWVyIGNvbXBhcmlzb24uIiIiCisKKyAgaWYgSVNfV0lORE9XUzoKKyAgICAjIFJlbW92ZXMgdGhlIGNvbG9yIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IHByZXNlbnQgb24gV2luZG93cy4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YignXHgxYlxcWygwOzNcZCk/bScsICcnLCB0ZXN0X291dHB1dCkKKyAgICAjIENoYW5nZXMgZmFpbHVyZSBtZXNzYWdlIGhlYWRlcnMgaW50byB0aGUgV2luZG93cyBmb3JtYXQuCisgICAgdGVzdF9vdXRwdXQgPSByZS5zdWIocic6IEZhaWx1cmVcbicsIHInOiBlcnJvcjogJywgdGVzdF9vdXRwdXQpCisgICAgIyBDaGFuZ2VzIGZpbGUobGluZV9udW1iZXIpIHRvIGZpbGU6bGluZV9udW1iZXIuCisgICAgdGVzdF9vdXRwdXQgPSByZS5zdWIocicoKFx3fFwuKSspXCgoXGQrKVwpOicsIHInXDE6XDM6JywgdGVzdF9vdXRwdXQpCisKKyAgcmV0dXJuIHRlc3Rfb3V0cHV0CisKKworZGVmIFJlbW92ZVRlc3RDb3VudHMob3V0cHV0KToKKyAgIiIiUmVtb3ZlcyB0ZXN0IGNvdW50cyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKKworICBvdXRwdXQgPSByZS5zdWIocidcZCsgdGVzdHM/LCBsaXN0ZWQgYmVsb3cnLAorICAgICAgICAgICAgICAgICAgJz8gdGVzdHMsIGxpc3RlZCBiZWxvdycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIEZBSUxFRCBURVNUUycsCisgICAgICAgICAgICAgICAgICAnPyBGQUlMRUQgVEVTVFMnLCBvdXRwdXQpCisgIG91dHB1dCA9IHJlLnN1YihyJ1xkKyB0ZXN0cz8gZnJvbSBcZCsgdGVzdCBjYXNlcz8nLAorICAgICAgICAgICAgICAgICAgJz8gdGVzdHMgZnJvbSA/IHRlc3QgY2FzZXMnLCBvdXRwdXQpCisgIG91dHB1dCA9IHJlLnN1YihyJ1xkKyB0ZXN0cz8gZnJvbSAoW2EtekEtWl9dKScsCisgICAgICAgICAgICAgICAgICByJz8gdGVzdHMgZnJvbSBcMScsIG91dHB1dCkKKyAgcmV0dXJuIHJlLnN1YihyJ1xkKyB0ZXN0cz9cLicsICc/IHRlc3RzLicsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgcGF0dGVybik6CisgICIiIlJlbW92ZXMgb3V0cHV0IG9mIHNwZWNpZmllZCB0ZXN0cyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4KKworICBUaGlzIGZ1bmN0aW9uIHN0cmlwcyBub3Qgb25seSB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgdGVzdCBidXQgYWxzbworICBhbGwgb3V0cHV0IGluIGJldHdlZW4uCisKKyAgQXJnczoKKyAgICB0ZXN0X291dHB1dDogICAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgdGVzdCBvdXRwdXQuCisgICAgcGF0dGVybjogICAgICAgICAgIEEgcmVnZXggc3RyaW5nIHRoYXQgbWF0Y2hlcyBuYW1lcyBvZiB0ZXN0IGNhc2VzIG9yCisgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzIHRvIHJlbW92ZS4KKworICBSZXR1cm5zOgorICAgIENvbnRlbnRzIG9mIHRlc3Rfb3V0cHV0IHdpdGggdGVzdHMgd2hvc2UgbmFtZXMgbWF0Y2ggcGF0dGVybiByZW1vdmVkLgorICAiIiIKKworICB0ZXN0X291dHB1dCA9IHJlLnN1YigKKyAgICAgIHInLipcWyBSVU4gICAgICBcXSAuKiVzKC58XG4pKj9cWyggIEZBSUxFRCAgfCAgICAgICBPSyApXF0gLiolcy4qXG4nICUgKAorICAgICAgICAgIHBhdHRlcm4sIHBhdHRlcm4pLAorICAgICAgJycsCisgICAgICB0ZXN0X291dHB1dCkKKyAgcmV0dXJuIHJlLnN1YihyJy4qJXMuKlxuJyAlIHBhdHRlcm4sICcnLCB0ZXN0X291dHB1dCkKKworCitkZWYgTm9ybWFsaXplT3V0cHV0KG91dHB1dCk6CisgICIiIk5vcm1hbGl6ZXMgb3V0cHV0ICh0aGUgb3V0cHV0IG9mIGd0ZXN0X291dHB1dF90ZXN0Xy5leGUpLiIiIgorCisgIG91dHB1dCA9IFRvVW5peExpbmVFbmRpbmcob3V0cHV0KQorICBvdXRwdXQgPSBSZW1vdmVMb2NhdGlvbnMob3V0cHV0KQorICBvdXRwdXQgPSBSZW1vdmVTdGFja1RyYWNlRGV0YWlscyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZVRpbWUob3V0cHV0KQorICByZXR1cm4gb3V0cHV0CisKKworZGVmIEdldFNoZWxsQ29tbWFuZE91dHB1dChlbnZfY21kKToKKyAgIiIiUnVucyBhIGNvbW1hbmQgaW4gYSBzdWItcHJvY2VzcywgYW5kIHJldHVybnMgaXRzIG91dHB1dCBpbiBhIHN0cmluZy4KKworICBBcmdzOgorICAgIGVudl9jbWQ6IFRoZSBzaGVsbCBjb21tYW5kLiBBIDItdHVwbGUgd2hlcmUgZWxlbWVudCAwIGlzIGEgZGljdCBvZiBleHRyYQorICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQsIGFuZCBlbGVtZW50IDEgaXMgYSBzdHJpbmcgd2l0aAorICAgICAgICAgICAgIHRoZSBjb21tYW5kIGFuZCBhbnkgZmxhZ3MuCisKKyAgUmV0dXJuczoKKyAgICBBIHN0cmluZyB3aXRoIHRoZSBjb21tYW5kJ3MgY29tYmluZWQgc3RhbmRhcmQgYW5kIGRpYWdub3N0aWMgb3V0cHV0LgorICAiIiIKKworICAjIFNwYXducyBjbWQgaW4gYSBzdWItcHJvY2VzcywgYW5kIGdldHMgaXRzIHN0YW5kYXJkIEkvTyBmaWxlIG9iamVjdHMuCisgICMgU2V0IGFuZCBzYXZlIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJseS4KKyAgZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCisgIGVudmlyb24udXBkYXRlKGVudl9jbWRbMF0pCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoZW52X2NtZFsxXSwgZW52PWVudmlyb24pCisKKyAgcmV0dXJuIHAub3V0cHV0CisKKworZGVmIEdldENvbW1hbmRPdXRwdXQoZW52X2NtZCk6CisgICIiIlJ1bnMgYSBjb21tYW5kIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQgd2l0aCBhbGwgZmlsZSBsb2NhdGlvbgorICBpbmZvIHN0cmlwcGVkIG9mZi4KKworICBBcmdzOgorICAgIGVudl9jbWQ6ICBUaGUgc2hlbGwgY29tbWFuZC4gQSAyLXR1cGxlIHdoZXJlIGVsZW1lbnQgMCBpcyBhIGRpY3Qgb2YgZXh0cmEKKyAgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCwgYW5kIGVsZW1lbnQgMSBpcyBhIHN0cmluZyB3aXRoCisgICAgICAgICAgICAgIHRoZSBjb21tYW5kIGFuZCBhbnkgZmxhZ3MuCisgICIiIgorCisgICMgRGlzYWJsZXMgZXhjZXB0aW9uIHBvcC11cHMgb24gV2luZG93cy4KKyAgZW52aXJvbiwgY21kbGluZSA9IGVudl9jbWQKKyAgZW52aXJvbiA9IGRpY3QoZW52aXJvbikgICMgRW5zdXJlcyB3ZSBhcmUgbW9kaWZ5aW5nIGEgY29weS4KKyAgZW52aXJvbltDQVRDSF9FWENFUFRJT05TX0VOVl9WQVJfTkFNRV0gPSAnMScKKyAgcmV0dXJuIE5vcm1hbGl6ZU91dHB1dChHZXRTaGVsbENvbW1hbmRPdXRwdXQoKGVudmlyb24sIGNtZGxpbmUpKSkKKworCitkZWYgR2V0T3V0cHV0T2ZBbGxDb21tYW5kcygpOgorICAiIiJSZXR1cm5zIGNvbmNhdGVuYXRlZCBvdXRwdXQgZnJvbSBzZXZlcmFsIHJlcHJlc2VudGF0aXZlIGNvbW1hbmRzLiIiIgorCisgIHJldHVybiAoR2V0Q29tbWFuZE91dHB1dChDT01NQU5EX1dJVEhfQ09MT1IpICsKKyAgICAgICAgICBHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9USU1FKSArCisgICAgICAgICAgR2V0Q29tbWFuZE91dHB1dChDT01NQU5EX1dJVEhfRElTQUJMRUQpICsKKyAgICAgICAgICBHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9TSEFSRElORykpCisKKwordGVzdF9saXN0ID0gR2V0U2hlbGxDb21tYW5kT3V0cHV0KENPTU1BTkRfTElTVF9URVNUUykKK1NVUFBPUlRTX0RFQVRIX1RFU1RTID0gJ0RlYXRoVGVzdCcgaW4gdGVzdF9saXN0CitTVVBQT1JUU19UWVBFRF9URVNUUyA9ICdUeXBlZFRlc3QnIGluIHRlc3RfbGlzdAorU1VQUE9SVFNfVEhSRUFEUyA9ICdFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0JyBpbiB0ZXN0X2xpc3QKK1NVUFBPUlRTX1NUQUNLX1RSQUNFUyA9IEZhbHNlCisKK0NBTl9HRU5FUkFURV9HT0xERU5fRklMRSA9IChTVVBQT1JUU19ERUFUSF9URVNUUyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JUU19UWVBFRF9URVNUUyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JUU19USFJFQURTKQorCisKK2NsYXNzIEdUZXN0T3V0cHV0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgZGVmIFJlbW92ZVVuc3VwcG9ydGVkVGVzdHMoc2VsZiwgdGVzdF9vdXRwdXQpOgorICAgIGlmIG5vdCBTVVBQT1JUU19ERUFUSF9URVNUUzoKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ0RlYXRoVGVzdCcpCisgICAgaWYgbm90IFNVUFBPUlRTX1RZUEVEX1RFU1RTOgorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZWRUZXN0JykKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ1R5cGVkRGVhdGhUZXN0JykKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ1R5cGVQYXJhbURlYXRoVGVzdCcpCisgICAgaWYgbm90IFNVUFBPUlRTX1RIUkVBRFM6CisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3Jrc0NvbmN1cnJlbnRseScpCisgICAgaWYgbm90IFNVUFBPUlRTX1NUQUNLX1RSQUNFUzoKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlU3RhY2tUcmFjZXModGVzdF9vdXRwdXQpCisKKyAgICByZXR1cm4gdGVzdF9vdXRwdXQKKworICBkZWYgdGVzdE91dHB1dChzZWxmKToKKyAgICBvdXRwdXQgPSBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCkKKworICAgIGdvbGRlbl9maWxlID0gb3BlbihHT0xERU5fUEFUSCwgJ3JiJykKKyAgICAjIEEgbWlzLWNvbmZpZ3VyZWQgc291cmNlIGNvbnRyb2wgc3lzdGVtIGNhbiBjYXVzZSBcciBhcHBlYXIgaW4gRU9MCisgICAgIyBzZXF1ZW5jZXMgd2hlbiB3ZSByZWFkIHRoZSBnb2xkZW4gZmlsZSBpcnJlc3BlY3RpdmUgb2YgYW4gb3BlcmF0aW5nCisgICAgIyBzeXN0ZW0gdXNlZC4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN0cmlwIHRob3NlIFxyJ3MgZnJvbSBuZXdsaW5lcworICAgICMgdW5jb25kaXRpb25hbGx5LgorICAgIGdvbGRlbiA9IFRvVW5peExpbmVFbmRpbmcoZ29sZGVuX2ZpbGUucmVhZCgpKQorICAgIGdvbGRlbl9maWxlLmNsb3NlKCkKKworICAgICMgV2Ugd2FudCB0aGUgdGVzdCB0byBwYXNzIHJlZ2FyZGxlc3Mgb2YgY2VydGFpbiBmZWF0dXJlcyBiZWluZworICAgICMgc3VwcG9ydGVkIG9yIG5vdC4KKworICAgICMgV2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdHlwZSBuYW1lIHNwZWNpZmljcyBpbiBhbGwgY2FzZXMuCisgICAgbm9ybWFsaXplZF9hY3R1YWwgPSBSZW1vdmVUeXBlSW5mb0RldGFpbHMob3V0cHV0KQorICAgIG5vcm1hbGl6ZWRfZ29sZGVuID0gUmVtb3ZlVHlwZUluZm9EZXRhaWxzKGdvbGRlbikKKworICAgIGlmIENBTl9HRU5FUkFURV9HT0xERU5fRklMRToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWFsaXplZF9nb2xkZW4sIG5vcm1hbGl6ZWRfYWN0dWFsKQorICAgIGVsc2U6CisgICAgICBub3JtYWxpemVkX2FjdHVhbCA9IE5vcm1hbGl6ZVRvQ3VycmVudFBsYXRmb3JtKAorICAgICAgICAgIFJlbW92ZVRlc3RDb3VudHMobm9ybWFsaXplZF9hY3R1YWwpKQorICAgICAgbm9ybWFsaXplZF9nb2xkZW4gPSBOb3JtYWxpemVUb0N1cnJlbnRQbGF0Zm9ybSgKKyAgICAgICAgICBSZW1vdmVUZXN0Q291bnRzKHNlbGYuUmVtb3ZlVW5zdXBwb3J0ZWRUZXN0cyhub3JtYWxpemVkX2dvbGRlbikpKQorCisgICAgICAjIFRoaXMgY29kZSBpcyB2ZXJ5IGhhbmR5IHdoZW4gZGVidWdnaW5nIGdvbGRlbiBmaWxlIGRpZmZlcmVuY2VzOgorICAgICAgaWYgb3MuZ2V0ZW52KCdERUJVR19HVEVTVF9PVVRQVVRfVEVTVCcpOgorICAgICAgICBvcGVuKG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksCisgICAgICAgICAgICAnX2d0ZXN0X291dHB1dF90ZXN0X25vcm1hbGl6ZWRfYWN0dWFsLnR4dCcpLCAnd2InKS53cml0ZSgKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkX2FjdHVhbCkKKyAgICAgICAgb3Blbihvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBndGVzdF90ZXN0X3V0aWxzLkdldFNvdXJjZURpcigpLAorICAgICAgICAgICAgJ19ndGVzdF9vdXRwdXRfdGVzdF9ub3JtYWxpemVkX2dvbGRlbi50eHQnKSwgJ3diJykud3JpdGUoCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZF9nb2xkZW4pCisKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWFsaXplZF9nb2xkZW4sIG5vcm1hbGl6ZWRfYWN0dWFsKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGlmIHN5cy5hcmd2WzE6XSA9PSBbR0VOR09MREVOX0ZMQUddOgorICAgIGlmIENBTl9HRU5FUkFURV9HT0xERU5fRklMRToKKyAgICAgIG91dHB1dCA9IEdldE91dHB1dE9mQWxsQ29tbWFuZHMoKQorICAgICAgZ29sZGVuX2ZpbGUgPSBvcGVuKEdPTERFTl9QQVRILCAnd2InKQorICAgICAgZ29sZGVuX2ZpbGUud3JpdGUob3V0cHV0KQorICAgICAgZ29sZGVuX2ZpbGUuY2xvc2UoKQorICAgIGVsc2U6CisgICAgICBtZXNzYWdlID0gKAorICAgICAgICAgICIiIlVuYWJsZSB0byB3cml0ZSBhIGdvbGRlbiBmaWxlIHdoZW4gY29tcGlsZWQgaW4gYW4gZW52aXJvbm1lbnQKK3RoYXQgZG9lcyBub3Qgc3VwcG9ydCBhbGwgdGhlIHJlcXVpcmVkIGZlYXR1cmVzIChkZWF0aCB0ZXN0cywgdHlwZWQgdGVzdHMsCithbmQgbXVsdGlwbGUgdGhyZWFkcykuICBQbGVhc2UgZ2VuZXJhdGUgdGhlIGdvbGRlbiBmaWxlIHVzaW5nIGEgYmluYXJ5IGJ1aWx0Cit3aXRoIHRob3NlIGZlYXR1cmVzIGVuYWJsZWQuIiIiKQorCisgICAgICBzeXMuc3RkZXJyLndyaXRlKG1lc3NhZ2UpCisgICAgICBzeXMuZXhpdCgxKQorICBlbHNlOgorICAgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkYmVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X291dHB1dF90ZXN0Xy5jYwpAQCAtMCwwICsxLDEwMjAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBIHVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYworLy8gY29uc3RydWN0cyBvZiBHb29nbGUgVGVzdCB3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCit1c2luZyB0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXk7CisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpOb3RpZmljYXRpb247Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VGhyZWFkV2l0aFBhcmFtOworI2VuZGlmCisKK25hbWVzcGFjZSBwb3NpeCA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOworCisvLyBUZXN0cyBjYXRjaGluZyBmYXRhbCBmYWlsdXJlcy4KKworLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgordm9pZCBUZXN0RXExKGludCB4KSB7CisgIEFTU0VSVF9FUSgxLCB4KTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjYWxscyBhIHRlc3Qgc3Vicm91dGluZSwgY2F0Y2hlcyB0aGUgZmF0YWwgZmFpbHVyZSBpdAorLy8gZ2VuZXJhdGVzLCBhbmQgdGhlbiByZXR1cm5zIGVhcmx5Lgordm9pZCBUcnlUZXN0U3Vicm91dGluZSgpIHsKKyAgLy8gQ2FsbHMgYSBzdWJyb3VudGluZSB0aGF0IHlpZWxkcyBhIGZhdGFsIGZhaWx1cmUuCisgIFRlc3RFcTEoMik7CisKKyAgLy8gQ2F0Y2hlcyB0aGUgZmF0YWwgZmFpbHVyZSBhbmQgYWJvcnRzIHRoZSB0ZXN0LgorICAvLworICAvLyBUaGUgdGVzdGluZzo6VGVzdDo6IHByZWZpeCBpcyBuZWNlc3Nhcnkgd2hlbiBjYWxsaW5nCisgIC8vIEhhc0ZhdGFsRmFpbHVyZSgpIG91dHNpZGUgb2YgYSBURVNULCBURVNUX0YsIG9yIHRlc3QgZml4dHVyZS4KKyAgaWYgKHRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisKKyAgLy8gSWYgd2UgZ2V0IGhlcmUsIHNvbWV0aGluZyBpcyB3cm9uZy4KKyAgRkFJTCgpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLiI7Cit9CisKK1RFU1QoUGFzc2luZ1Rlc3QsIFBhc3NpbmdUZXN0MSkgeworfQorCitURVNUKFBhc3NpbmdUZXN0LCBQYXNzaW5nVGVzdDIpIHsKK30KKworLy8gVGVzdHMgdGhhdCBwYXJhbWV0ZXJzIG9mIGZhaWxpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgcHJpbnRlZCBpbiB0aGUKKy8vIGZhaWxpbmcgdGVzdCBzdW1tYXJ5LgorY2xhc3MgRmFpbGluZ1BhcmFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4ge307CisKK1RFU1RfUChGYWlsaW5nUGFyYW1UZXN0LCBGYWlscykgeworICBFWFBFQ1RfRVEoMSwgR2V0UGFyYW0oKSk7Cit9CisKKy8vIFRoaXMgZ2VuZXJhdGVzIGEgdGVzdCB3aGljaCB3aWxsIGZhaWwuIEdvb2dsZSBUZXN0IGlzIGV4cGVjdGVkIHRvIHByaW50CisvLyBpdHMgcGFyYW1ldGVyIHdoZW4gaXQgb3V0cHV0cyB0aGUgbGlzdCBvZiBhbGwgZmFpbGVkIHRlc3RzLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUHJpbnRpbmdGYWlsaW5nUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgRmFpbGluZ1BhcmFtVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygyKSk7CisKKy8vIFRlc3RzIGNhdGNoaW5nIGEgZmF0YWwgZmFpbHVyZSBpbiBhIHN1YnJvdXRpbmUuCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIEZhdGFsRmFpbHVyZUluU3Vicm91dGluZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSlcbiIpOworCisgIFRyeVRlc3RTdWJyb3V0aW5lKCk7Cit9CisKKy8vIFRlc3RzIGNhdGNoaW5nIGEgZmF0YWwgZmFpbHVyZSBpbiBhIG5lc3RlZCBzdWJyb3V0aW5lLgorVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBGYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpXG4iKTsKKworICAvLyBDYWxscyBhIHN1YnJvdW50aW5lIHRoYXQgeWllbGRzIGEgZmF0YWwgZmFpbHVyZS4KKyAgVHJ5VGVzdFN1YnJvdXRpbmUoKTsKKworICAvLyBDYXRjaGVzIHRoZSBmYXRhbCBmYWlsdXJlIGFuZCBhYm9ydHMgdGhlIHRlc3QuCisgIC8vCisgIC8vIFdoZW4gY2FsbGluZyBIYXNGYXRhbEZhaWx1cmUoKSBpbnNpZGUgYSBURVNULCBURVNUX0YsIG9yIHRlc3QKKyAgLy8gZml4dHVyZSwgdGhlIHRlc3Rpbmc6OlRlc3Q6OiBwcmVmaXggaXMgbm90IG5lZWRlZC4KKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisKKyAgLy8gSWYgd2UgZ2V0IGhlcmUsIHNvbWV0aGluZyBpcyB3cm9uZy4KKyAgRkFJTCgpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLiI7Cit9CisKKy8vIFRlc3RzIEhhc0ZhdGFsRmFpbHVyZSgpIGFmdGVyIGEgZmFpbGVkIEVYUEVDVCBjaGVjay4KK1RFU1QoRmF0YWxGYWlsdXJlVGVzdCwgTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpXG4iKTsKKyAgRVhQRUNUX1RSVUUoZmFsc2UpOyAgLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZQorICBBU1NFUlRfRkFMU0UoSGFzRmF0YWxGYWlsdXJlKCkpOyAgLy8gVGhpcyBzaG91bGQgc3VjY2VlZC4KK30KKworLy8gVGVzdHMgaW50ZXJsZWF2aW5nIHVzZXIgbG9nZ2luZyBhbmQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucy4KK1RFU1QoTG9nZ2luZ1Rlc3QsIEludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgYVs0XSA9IHsKKyAgICAzLCA5LCAyLCA2CisgIH07CisKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSlcbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKGEpL3NpemVvZigqYSkpOyBpKyspIHsKKyAgICBwcmludGYoImkgPT0gJWRcbiIsIGkpOworICAgIEVYUEVDVF9HRSgzLCBhW2ldKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGUgU0NPUEVEX1RSQUNFIG1hY3JvLgorCisvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgdGVzdGluZyBTQ09QRURfVFJBQ0UuCit2b2lkIFN1YldpdGhvdXRUcmFjZShpbnQgbikgeworICBFWFBFQ1RfRVEoMSwgbik7CisgIEFTU0VSVF9FUSgyLCBuKTsKK30KKworLy8gQW5vdGhlciBoZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RpbmcgU0NPUEVEX1RSQUNFLgordm9pZCBTdWJXaXRoVHJhY2UoaW50IG4pIHsKKyAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAibiA9ICIgPDwgbik7CisKKyAgU3ViV2l0aG91dFRyYWNlKG4pOworfQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpIG9iZXlzIGxleGljYWwgc2NvcGVzLgorVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBPYmV5c1Njb3BlcykgeworICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHRyYWNlIGJlZm9yZSBTQ09QRURfVFJBQ0UoKSBpcyBpbnZva2VkLgorICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLiI7CisKKyAgeworICAgIFNDT1BFRF9UUkFDRSgiRXhwZWN0ZWQgdHJhY2UiKTsKKyAgICAvLyBBZnRlciBTQ09QRURfVFJBQ0UoKSwgYSBmYWlsdXJlIGluIHRoZSBjdXJyZW50IHNjb3BlIHNob3VsZCBjb250YWluCisgICAgLy8gdGhlIHRyYWNlLgorICAgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBoYXZlIGEgdHJhY2UuIjsKKyAgfQorCisgIC8vIE9uY2UgdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBzY29wZSBvZiB0aGUgU0NPUEVEX1RSQUNFKCksIHRoZXJlCisgIC8vIHNob3VsZCBiZSBubyB0cmFjZSBhZ2Fpbi4KKyAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkbid0IGhhdmUgYSB0cmFjZS4iOworfQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSB3b3JrcyBpbnNpZGUgYSBsb29wLgorVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBXb3Jrc0luTG9vcCkgeworICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMjsgaSsrKSB7CisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaSA9ICIgPDwgaSk7CisKKyAgICBTdWJXaXRob3V0VHJhY2UoaSk7CisgIH0KK30KKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0Ugd29ya3MgaW4gYSBzdWJyb3V0aW5lLgorVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBXb3Jrc0luU3Vicm91dGluZSkgeworICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7CisKKyAgU3ViV2l0aFRyYWNlKDEpOworICBTdWJXaXRoVHJhY2UoMik7Cit9CisKKy8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFIGNhbiBiZSBuZXN0ZWQuCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIENhbkJlTmVzdGVkKSB7CisgIHByaW50ZigiKGV4cGVjdGVkIHRvIGZhaWwpXG4iKTsKKworICBTQ09QRURfVFJBQ0UoIiIpOyAgLy8gQSB0cmFjZSB3aXRob3V0IGEgbWVzc2FnZS4KKworICBTdWJXaXRoVHJhY2UoMik7Cit9CisKKy8vIFRlc3RzIHRoYXQgbXVsdGlwbGUgU0NPUEVEX1RSQUNFcyBjYW4gYmUgdXNlZCBpbiB0aGUgc2FtZSBzY29wZS4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgQ2FuQmVSZXBlYXRlZCkgeworICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7CisKKyAgU0NPUEVEX1RSQUNFKCJBIik7CisgIEFERF9GQUlMVVJFKCkKKyAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLiI7CisKKyAgU0NPUEVEX1RSQUNFKCJCIik7CisgIEFERF9GQUlMVVJFKCkKKyAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBIGFuZCBCLiI7CisKKyAgeworICAgIFNDT1BFRF9UUkFDRSgiQyIpOworICAgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0cmFjZSBwb2ludCBBLCBCLCBhbmQgQy4iOworICB9CisKKyAgU0NPUEVEX1RSQUNFKCJEIik7CisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluICIKKyAgICAgICAgICAgICAgICA8PCAidHJhY2UgcG9pbnQgQSwgQiwgYW5kIEQuIjsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKy8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFKClzIGNhbiBiZSB1c2VkIGNvbmN1cnJlbnRseSBmcm9tIG11bHRpcGxlCisvLyB0aHJlYWRzLiAgTmFtZWx5LCBhbiBhc3NlcnRpb24gc2hvdWxkIGJlIGFmZmVjdGVkIGJ5CisvLyBTQ09QRURfVFJBQ0UoKXMgaW4gaXRzIG93biB0aHJlYWQgb25seS4KKworLy8gSGVyZSdzIHRoZSBzZXF1ZW5jZSBvZiBhY3Rpb25zIHRoYXQgaGFwcGVuIGluIHRoZSB0ZXN0OgorLy8KKy8vICAgVGhyZWFkIEEgKG1haW4pICAgICAgICAgICAgICAgIHwgVGhyZWFkIEIgKHNwYXduZWQpCisvLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgc3Bhd25zIHRocmVhZCBCICAgICAgICAgICAgICAgIHwKKy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICB3YWl0cyBmb3IgbjEgICAgICAgICAgICAgICAgICAgfCBTQ09QRURfVFJBQ0UoIlRyYWNlIEIiKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVzIGZhaWx1cmUgIzEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbm90aWZpZXMgbjEKKy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBTQ09QRURfVFJBQ0UoIlRyYWNlIEEiKTsgICAgICAgfCB3YWl0cyBmb3IgbjIKKy8vICAgZ2VuZXJhdGVzIGZhaWx1cmUgIzIgICAgICAgICAgIHwKKy8vICAgbm90aWZpZXMgbjIgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICB3YWl0cyBmb3IgbjMgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZXMgZmFpbHVyZSAjMworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFjZSBCIGRpZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVzIGZhaWx1cmUgIzQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbm90aWZpZXMgbjMKKy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICBnZW5lcmF0ZXMgZmFpbHVyZSAjNSAgICAgICAgICAgfCBmaW5pc2hlcworLy8gICB0cmFjZSBBIGRpZXMgICAgICAgICAgICAgICAgICAgfAorLy8gICBnZW5lcmF0ZXMgZmFpbHVyZSAjNiAgICAgICAgICAgfAorLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHdhaXRzIGZvciB0aHJlYWQgQiB0byBmaW5pc2ggICB8CisKK3N0cnVjdCBDaGVja1BvaW50cyB7CisgIE5vdGlmaWNhdGlvbiBuMTsKKyAgTm90aWZpY2F0aW9uIG4yOworICBOb3RpZmljYXRpb24gbjM7Cit9OworCitzdGF0aWMgdm9pZCBUaHJlYWRXaXRoU2NvcGVkVHJhY2UoQ2hlY2tQb2ludHMqIGNoZWNrX3BvaW50cykgeworICB7CisgICAgU0NPUEVEX1RSQUNFKCJUcmFjZSBCIik7CisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQiBhbGl2ZSkuIjsKKyAgICBjaGVja19wb2ludHMtPm4xLk5vdGlmeSgpOworICAgIGNoZWNrX3BvaW50cy0+bjIuV2FpdEZvck5vdGlmaWNhdGlvbigpOworCisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMyAoaW4gdGhyZWFkIEIsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLiI7CisgIH0gIC8vIFRyYWNlIEIgZGllcyBoZXJlLgorICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNCAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuIjsKKyAgY2hlY2tfcG9pbnRzLT5uMy5Ob3RpZnkoKTsKK30KKworVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBXb3Jrc0NvbmN1cnJlbnRseSkgeworICBwcmludGYoIihleHBlY3RpbmcgNiBmYWlsdXJlcylcbiIpOworCisgIENoZWNrUG9pbnRzIGNoZWNrX3BvaW50czsKKyAgVGhyZWFkV2l0aFBhcmFtPENoZWNrUG9pbnRzKj4gdGhyZWFkKCZUaHJlYWRXaXRoU2NvcGVkVHJhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tfcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGNoZWNrX3BvaW50cy5uMS5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7CisKKyAgeworICAgIFNDT1BFRF9UUkFDRSgiVHJhY2UgQSIpOworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIgKGluIHRocmVhZCBBLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4iOworICAgIGNoZWNrX3BvaW50cy5uMi5Ob3RpZnkoKTsKKyAgICBjaGVja19wb2ludHMubjMuV2FpdEZvck5vdGlmaWNhdGlvbigpOworCisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNSAoaW4gdGhyZWFkIEEsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuIjsKKyAgfSAgLy8gVHJhY2UgQSBkaWVzIGhlcmUuCisgIEFERF9GQUlMVVJFKCkKKyAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM2IChpbiB0aHJlYWQgQSwgbm8gdHJhY2UgYWxpdmUpLiI7CisgIHRocmVhZC5Kb2luKCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworVEVTVChEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QsCisgICAgIERJU0FCTEVEX0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1N1cHByZXNzZXNXYXJuaW5nKSB7CisgIC8vIFRoaXMgdGVzdCBib2R5IGlzIGludGVudGlvbmFsbHkgZW1wdHkuICBJdHMgc29sZSBwdXJwb3NlIGlzIGZvcgorICAvLyB2ZXJpZnlpbmcgdGhhdCB0aGUgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnCisgIC8vIHN1cHByZXNzZXMgdGhlICJZT1UgSEFWRSAxMiBESVNBQkxFRCBURVNUUyIgd2FybmluZyBhdCB0aGUgZW5kIG9mCisgIC8vIHRoZSB0ZXN0IG91dHB1dC4KK30KKworLy8gVGVzdHMgdXNpbmcgYXNzZXJ0aW9ucyBvdXRzaWRlIG9mIFRFU1QgYW5kIFRFU1RfRi4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdHdvIGZhaWx1cmVzIGludGVudGlvbmFsbHkuCit2b2lkIEFkSG9jVGVzdCgpIHsKKyAgcHJpbnRmKCJUaGUgbm9uLXRlc3QgcGFydCBvZiB0aGUgY29kZSBpcyBleHBlY3RlZCB0byBoYXZlIDIgZmFpbHVyZXMuXG5cbiIpOworICBFWFBFQ1RfVFJVRShmYWxzZSk7CisgIEVYUEVDVF9FUSgyLCAzKTsKK30KKworLy8gUnVucyBhbGwgVEVTVHMsIGFsbCBURVNUX0ZzLCBhbmQgdGhlIGFkIGhvYyB0ZXN0LgoraW50IFJ1bkFsbFRlc3RzKCkgeworICBBZEhvY1Rlc3QoKTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KKworLy8gVGVzdHMgbm9uLWZhdGFsIGZhaWx1cmVzIGluIHRoZSBmaXh0dXJlIGNvbnN0cnVjdG9yLgorY2xhc3MgTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgeworICAgIHByaW50ZigiKGV4cGVjdGluZyA1IGZhaWx1cmVzKVxuIik7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4iOworICB9CisKKyAgfk5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM1LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzQsIGluIFRlYXJEb3duLiI7CisgIH0KK307CisKK1RFU1RfRihOb25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QsIEZhaWx1cmVJbkNvbnN0cnVjdG9yKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMsIGluIHRoZSB0ZXN0IGJvZHkuIjsKK30KKworLy8gVGVzdHMgZmF0YWwgZmFpbHVyZXMgaW4gdGhlIGZpeHR1cmUgY29uc3RydWN0b3IuCitjbGFzcyBGYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBGYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgZmFpbHVyZXMpXG4iKTsKKyAgICBJbml0KCk7CisgIH0KKworICB+RmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gU2V0VXAoKS4gICIKKyAgICAgICAgICAgICAgICAgIDw8ICJXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFzIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IgIgorICAgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gVGVhckRvd24oKS4gICIKKyAgICAgICAgICAgICAgICAgIDw8ICJXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFzIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IgIgorICAgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKKyAgfQorIHByaXZhdGU6CisgIHZvaWQgSW5pdCgpIHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuIjsKKyAgfQorfTsKKworVEVTVF9GKEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCwgRmFpbHVyZUluQ29uc3RydWN0b3IpIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIHRoZSB0ZXN0IGJvZHkuICAiCisgICAgICAgICAgICAgICAgPDwgIldlIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgYXMgdGhlIHRlc3QgZml4dHVyZSBjJ3RvciAiCisgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdHMgbm9uLWZhdGFsIGZhaWx1cmVzIGluIFNldFVwKCkuCitjbGFzcyBOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfk5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0KCkgeworICAgIERlaW5pdCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiKGV4cGVjdGluZyA0IGZhaWx1cmVzKVxuIik7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gVGVhckRvd24oKS4iOworICB9CisgcHJpdmF0ZToKKyAgdm9pZCBEZWluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCwgRmFpbHVyZUluU2V0VXApIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmdW5jdGlvbi4iOworfQorCisvLyBUZXN0cyBmYXRhbCBmYWlsdXJlcyBpbiBTZXRVcCgpLgorY2xhc3MgRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5GYXRhbEZhaWx1cmVJblNldFVwVGVzdCgpIHsKKyAgICBEZWluaXQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgMyBmYWlsdXJlcylcbiIpOworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gVGVhckRvd24oKS4iOworICB9CisgcHJpdmF0ZToKKyAgdm9pZCBEZWluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihGYXRhbEZhaWx1cmVJblNldFVwVGVzdCwgRmFpbHVyZUluU2V0VXApIHsKKyAgRkFJTCgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gdGhlIHRlc3QgZnVuY3Rpb24uICAiCisgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyBTZXRVcCgpIGZhaWxlZC4iOworfQorCitURVNUKEFkZEZhaWx1cmVBdFRlc3QsIE1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyKSB7CisgIEFERF9GQUlMVVJFX0FUKCJmb28uY2MiLCA0MikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgaW4gZm9vLmNjIjsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gQSB1bmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCit2b2lkIERpZUlmKGJvb2wgc2hvdWxkX2RpZSkgeworICBHVEVTVF9DSEVDS18oIXNob3VsZF9kaWUpIDw8ICIgLSBkZWF0aCBpbnNpZGUgRGllSWYoKS4iOworfQorCisvLyBUZXN0cyBydW5uaW5nIGRlYXRoIHRlc3RzIGluIGEgbXVsdGktdGhyZWFkZWQgY29udGV4dC4KKworLy8gVXNlZCBmb3IgY29vcmRpbmF0aW9uIGJldHdlZW4gdGhlIG1haW4gYW5kIHRoZSBzcGF3biB0aHJlYWQuCitzdHJ1Y3QgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zIHsKKyAgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zKCkge30KKworICBOb3RpZmljYXRpb24gc3Bhd25fdGhyZWFkX3N0YXJ0ZWQ7CisgIE5vdGlmaWNhdGlvbiBzcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMpOworfTsKKworLy8gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSB0aHJlYWQgc3Bhd24gYnkgdGhlCisvLyBNdWx0aXBsZVRocmVhZHMgdGVzdCAoYmVsb3cpLgorc3RhdGljIHZvaWQgVGhyZWFkUm91dGluZShTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqIG5vdGlmaWNhdGlvbnMpIHsKKyAgLy8gU2lnbmFscyB0aGUgbWFpbiB0aHJlYWQgdGhhdCB0aGlzIHRocmVhZCBoYXMgc3RhcnRlZC4KKyAgbm90aWZpY2F0aW9ucy0+c3Bhd25fdGhyZWFkX3N0YXJ0ZWQuTm90aWZ5KCk7CisKKyAgLy8gV2FpdHMgZm9yIHBlcm1pc3Npb24gdG8gZmluaXNoIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICBub3RpZmljYXRpb25zLT5zcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlLldhaXRGb3JOb3RpZmljYXRpb24oKTsKK30KKworLy8gVGhpcyBpcyBhIGRlYXRoLXRlc3QgdGVzdCwgYnV0IGl0J3Mgbm90IG5hbWVkIHdpdGggYSBEZWF0aFRlc3QKKy8vIHN1ZmZpeC4gIEl0IHN0YXJ0cyB0aHJlYWRzIHdoaWNoIG1pZ2h0IGludGVyZmVyZSB3aXRoIGxhdGVyCisvLyBkZWF0aCB0ZXN0cywgc28gaXQgbXVzdCBydW4gYWZ0ZXIgYWxsIG90aGVyIGRlYXRoIHRlc3RzLgorY2xhc3MgRGVhdGhUZXN0QW5kTXVsdGlUaHJlYWRzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFN0YXJ0cyBhIHRocmVhZCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlZ2luLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgdGhyZWFkXy5yZXNldChuZXcgVGhyZWFkV2l0aFBhcmFtPFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyo+KAorICAgICAgICAmVGhyZWFkUm91dGluZSwgJm5vdGlmaWNhdGlvbnNfLCBOVUxMKSk7CisgICAgbm90aWZpY2F0aW9uc18uc3Bhd25fdGhyZWFkX3N0YXJ0ZWQuV2FpdEZvck5vdGlmaWNhdGlvbigpOworICB9CisgIC8vIFRlbGxzIHRoZSB0aHJlYWQgdG8gZmluaXNoLCBhbmQgcmVhcHMgaXQuCisgIC8vIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgdGhyZWFkIGxpYnJhcnkgaW4gdXNlLAorICAvLyBhIG1hbmFnZXIgdGhyZWFkIG1pZ2h0IHN0aWxsIGJlIGxlZnQgcnVubmluZyB0aGF0IHdpbGwgaW50ZXJmZXJlCisgIC8vIHdpdGggbGF0ZXIgZGVhdGggdGVzdHMuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBidXQgdGhpcyBjbGFzcworICAvLyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIGFzIGJlc3QgaXQgY2FuLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgbm90aWZpY2F0aW9uc18uc3Bhd25fdGhyZWFkX29rX3RvX3Rlcm1pbmF0ZS5Ob3RpZnkoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zIG5vdGlmaWNhdGlvbnNfOworICBzY29wZWRfcHRyPFRocmVhZFdpdGhQYXJhbTxTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqPiA+IHRocmVhZF87Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGhlIE1peGVkVXBUZXN0Q2FzZVRlc3QgdGVzdCBjYXNlIHZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3Qgd2lsbCBmYWlsIGEKKy8vIHRlc3QgaWYgaXQgdXNlcyBhIGRpZmZlcmVudCBmaXh0dXJlIGNsYXNzIHRoYW4gd2hhdCBvdGhlciB0ZXN0cyBpbgorLy8gdGhlIHNhbWUgdGVzdCBjYXNlIHVzZS4gIEl0IGRlbGliZXJhdGVseSBjb250YWlucyB0d28gZml4dHVyZQorLy8gY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRlZmluZWQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCisKKy8vIFRoZSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCB0ZXN0IGNhc2UgdmVyaWZpZXMgdGhhdAorLy8gd2hlbiB0aGUgdXNlciBkZWZpbmVzIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIHRlc3QgY2FzZSBuYW1lIEFORAorLy8gc2FtZSB0ZXN0IG5hbWUgKGJ1dCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyksIHRoZSBzZWNvbmQgdGVzdCB3aWxsCisvLyBmYWlsLgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBGaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCwKKyAgICAgICBUaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbCkge30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgYmFyIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUKKy8vIGdvbGRlbiBmaWxlIHRvIGNoZWNrIHRoYXQgR29vZ2xlIFRlc3QgZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsVG9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUX0YoTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCisgICAgICAgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBiYXIKKworLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdCBjYXNlcyB2ZXJpZnkgdGhhdCBHb29nbGUgVGVzdCBjYXRjaGVzIHRoZSB1c2VyCisvLyBlcnJvciBvZiBtaXhpbmcgVEVTVCBhbmQgVEVTVF9GIGluIHRoZSBzYW1lIHRlc3QgY2FzZS4gIFRoZSBmaXJzdAorLy8gdGVzdCBjYXNlIGNoZWNrcyB0aGUgc2NlbmFyaW8gd2hlcmUgVEVTVF9GIGFwcGVhcnMgYmVmb3JlIFRFU1QsIGFuZAorLy8gdGhlIHNlY29uZCBvbmUgY2hlY2tzIHdoZXJlIFRFU1QgYXBwZWFycyBiZWZvcmUgVEVTVF9GLgorCitjbGFzcyBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUX0YpIHt9CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUKFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwpIHt9CisKK2NsYXNzIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1QoVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUKSB7fQorCisvLyBFeHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gY2hlY2sgdGhhdCBHb29nbGUgVGVzdAorLy8gZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbCkgeworfQorCisvLyBVc2VkIGZvciB0ZXN0aW5nIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYW5kIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkuCitpbnQgZ2xvYmFsX2ludGVnZXIgPSAwOworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBnbG9iYWwgdmFyaWFibGVzLgorVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMpIHsKKyAgZ2xvYmFsX2ludGVnZXIgPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKDEsIGdsb2JhbF9pbnRlZ2VyKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMKKy8vIChzdGF0aWMgb3Igbm90KS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMpIHsKKyAgaW50IG0gPSAwOworICBzdGF0aWMgaW50IG47CisgIG4gPSAxOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKG0sIG4pIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBzdWNjZWVkcyB3aGVuIHRoZXJlIGlzIGV4YWN0bHkKKy8vIG9uZSBub24tZmF0YWwgZmFpbHVyZSBhbmQgbm8gZmF0YWwgZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBubworLy8gbm9uLWZhdGFsIGZhaWx1cmUuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBub24tZmF0YWwgZmFpbHVyZXMuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAxLiI7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMi4iOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBmYXRhbAorLy8gZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW4gcmVmZXJlbmNlIGdsb2JhbCB2YXJpYWJsZXMuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcykgeworICBnbG9iYWxfaW50ZWdlciA9IDA7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBBU1NFUlRfRVEoMSwgZ2xvYmFsX2ludGVnZXIpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7CisgIH0sICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCBzdGF0aWMKKy8vIHZhcmlhYmxlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMpIHsKKyAgc3RhdGljIGludCBuOworICBuID0gMTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEFTU0VSVF9FUSgwLCBuKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIHN1Y2NlZWRzIHdoZW4gdGhlcmUgaXMgZXhhY3RseQorLy8gb25lIGZhdGFsIGZhaWx1cmUgYW5kIG5vIG5vbi1mYXRhbCBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBTdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG5vIGZhdGFsCisvLyBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgIH0sICIiKTsKK30KKworLy8gQSBoZWxwZXIgZm9yIGdlbmVyYXRpbmcgYSBmYXRhbCBmYWlsdXJlLgordm9pZCBGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBmYXRhbCBmYWlsdXJlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEZhdGFsRmFpbHVyZSgpOworICAgIEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBub24tZmF0YWwKKy8vIGZhaWx1cmUuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHRoZSBvdXRwdXQgb2YgdHlwZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCB0ZXN0aW5nOjpUeXBlczxpbnQ+KTsKKworVFlQRURfVEVTVChUeXBlZFRlc3QsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDAsIFR5cGVQYXJhbSgpKTsKK30KKworVFlQRURfVEVTVChUeXBlZFRlc3QsIEZhaWx1cmUpIHsKKyAgRVhQRUNUX0VRKDEsIFR5cGVQYXJhbSgpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdGhlIG91dHB1dCBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDBVLCBUeXBlUGFyYW0oKSk7Cit9CisKK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQLCBGYWlsdXJlKSB7CisgIEVYUEVDVF9FUSgxVSwgVHlwZVBhcmFtKCkpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UCwgU3VjY2VzcywgRmFpbHVyZSk7CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8dW5zaWduZWQgY2hhciwgdW5zaWduZWQgaW50PiBVbnNpZ25lZFR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoVW5zaWduZWQsIFR5cGVkVGVzdFAsIFVuc2lnbmVkVHlwZXMpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIHZlcmlmeSB0aGF0IHRlc3RzIHdob3NlIHRlc3QgY2FzZQorLy8gbmFtZSBlbmRzIHdpdGggRGVhdGhUZXN0IGFyZSBydW4gZmlyc3QuCisKK1RFU1QoQURlYXRoVGVzdCwgU2hvdWxkUnVuRmlyc3QpIHsKK30KKworIyBpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlZCB0ZXN0cyB3aG9zZSB0ZXN0CisvLyBjYXNlIG5hbWUgZW5kcyB3aXRoIERlYXRoVGVzdCBhcmUgcnVuIGZpcnN0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFUeXBlZERlYXRoVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBkb3VibGU+IE51bWVyaWNUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShBVHlwZWREZWF0aFRlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoQVR5cGVkRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisjIGlmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworCisvLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIHdob3NlIHRlc3QgY2FzZSBuYW1lIGVuZHMgd2l0aCBEZWF0aFRlc3QgYXJlIHJ1biBmaXJzdC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBBVHlwZVBhcmFtRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoQVR5cGVQYXJhbURlYXRoVGVzdCk7CisKK1RZUEVEX1RFU1RfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCk7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBBVHlwZVBhcmFtRGVhdGhUZXN0LCBOdW1lcmljVHlwZXMpOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdHMgdmFyaW91cyBmYWlsdXJlIGNvbmRpdGlvbnMgb2YKKy8vIEVYUEVDVF97LE5PTn1GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9LgorY2xhc3MgRXhwZWN0RmFpbHVyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOiAgLy8gTXVzdCBiZSBwdWJsaWMgYW5kIG5vdCBwcm90ZWN0ZWQgZHVlIHRvIGEgYnVnIGluIGcrKyAzLjQuMi4KKyAgZW51bSBGYWlsdXJlTW9kZSB7CisgICAgRkFUQUxfRkFJTFVSRSwKKyAgICBOT05GQVRBTF9GQUlMVVJFCisgIH07CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmUoRmFpbHVyZU1vZGUgZmFpbHVyZSkgeworICAgIGlmIChmYWlsdXJlID09IEZBVEFMX0ZBSUxVUkUpIHsKKyAgICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICAgIH0KKyAgfQorfTsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmUpIHsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLCAiRXhwZWN0ZWQgbm9uLWZhdGFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmUpIHsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworICAvLyBXcm9uZyBtZXNzYWdlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksICJTb21lIG90aGVyIG5vbi1mYXRhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCitjbGFzcyBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0IDogcHVibGljIEV4cGVjdEZhaWx1cmVUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZhaWx1cmVNb2RlIGZhaWx1cmUpIHsKKyAgICBUaHJlYWRXaXRoUGFyYW08RmFpbHVyZU1vZGU+IHRocmVhZCgmQWRkRmFpbHVyZSwgZmFpbHVyZSwgTlVMTCk7CisgICAgdGhyZWFkLkpvaW4oKTsKKyAgfQorfTsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZSkgeworICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZSkgeworICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKK3R5cGVkZWYgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgdGhlIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIG9ubHkgY2F0Y2hlcyBmYWlsdXJlcyBmcm9tCisvLyB0aGUgY3VycmVudCB0aHJlYWQgaWYgaXQgaXMgaW5zdGFudGlhdGVkIHdpdGggSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQuCitURVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LCBJbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZCkgeworICBwcmludGYoIihleHBlY3RpbmcgMiBmYWlsdXJlcylcbiIpOworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAorICAgICAgICAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSk7CisgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSk7CisgIH0KKyAgLy8gVGhlIHR3byBmYWlsdXJlcyBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnRlcmNlcHRlZC4KKyAgRVhQRUNUX0VRKDAsIHJlc3VsdHMuc2l6ZSgpKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworICAvLyBXcm9uZyBtZXNzYWdlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisKKy8vIFR3byB0ZXN0IGVudmlyb25tZW50cyBmb3IgdGVzdGluZyB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKS4KKworY2xhc3MgRm9vRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLCAiRm9vRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsICJGb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfQorfTsKKworY2xhc3MgQmFyRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLCAiQmFyRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsICJCYXJFbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9Cit9OworCitib29sIEdURVNUX0ZMQUcoaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzKSA9IGZhbHNlOworCisvLyBUaGUgbWFpbiBmdW5jdGlvbi4KKy8vCisvLyBUaGUgaWRlYSBpcyB0byB1c2UgR29vZ2xlIFRlc3QgdG8gcnVuIGFsbCB0aGUgdGVzdHMgd2UgaGF2ZSBkZWZpbmVkIChzb21lCisvLyBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsKSwgYW5kIHRoZW4gY29tcGFyZSB0aGUgdGVzdCByZXN1bHRzCisvLyB3aXRoIHRoZSAiZ29sZGVuIiBmaWxlLgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBmYWxzZTsKKworICAvLyBXZSBqdXN0IHJ1biB0aGUgdGVzdHMsIGtub3dpbmcgc29tZSBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsLgorICAvLyBXZSB3aWxsIHVzZSBhIHNlcGFyYXRlIFB5dGhvbiBzY3JpcHQgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mCisgIC8vIHRoaXMgcHJvZ3JhbSB3aXRoIHRoZSBnb2xkZW4gZmlsZS4KKworICAvLyBJdCdzIGhhcmQgdG8gdGVzdCBJbml0R29vZ2xlVGVzdCgpIGRpcmVjdGx5LCBhcyBpdCBoYXMgbWFueQorICAvLyBnbG9iYWwgc2lkZSBlZmZlY3RzLiAgVGhlIGZvbGxvd2luZyBsaW5lIHNlcnZlcyBhcyBhIHNhbml0eSB0ZXN0CisgIC8vIGZvciBpdC4KKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpZiAoYXJnYyA+PSAyICYmCisgICAgICBTdHJpbmcoYXJndlsxXSkgPT0gIi0tZ3Rlc3RfaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzIikKKyAgICBHVEVTVF9GTEFHKGludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cykgPSB0cnVlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaWYgKHRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSAhPSAiIikgeworICAgIC8vIFNraXAgdGhlIHVzdWFsIG91dHB1dCBjYXB0dXJpbmcgaWYgd2UncmUgcnVubmluZyBhcyB0aGUgY2hpbGQKKyAgICAvLyBwcm9jZXNzIG9mIGFuIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdC4KKyMgaWYgR1RFU1RfT1NfV0lORE9XUworICAgIHBvc2l4OjpGUmVvcGVuKCJudWw6IiwgInciLCBzdGRvdXQpOworIyBlbHNlCisgICAgcG9zaXg6OkZSZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3Rkb3V0KTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzKSkKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFJlZ2lzdGVycyB0d28gZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzLgorICAvLyBUaGUgZ29sZGVuIGZpbGUgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBzZXQgdXAgaW4gdGhlIG9yZGVyIHRoZXkKKyAgLy8gYXJlIHJlZ2lzdGVyZWQsIGFuZCB0b3JuIGRvd24gaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEJhckVudmlyb25tZW50KTsKKworICByZXR1cm4gUnVuQWxsVGVzdHMoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0IGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkMzQyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0CkBAIC0wLDAgKzEsNzExIEBACitUaGUgbm9uLXRlc3QgcGFydCBvZiB0aGUgY29kZSBpcyBleHBlY3RlZCB0byBoYXZlIDIgZmFpbHVyZXMuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogZmFsc2UKKyAgQWN0dWFsOiBmYWxzZQorRXhwZWN0ZWQ6IHRydWUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogMworRXhwZWN0ZWQ6IDIKKxtbMDszMm1bPT09PT09PT09PV0gG1ttUnVubmluZyA2MiB0ZXN0cyBmcm9tIDI3IHRlc3QgY2FzZXMuCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK0Zvb0Vudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KK0JhckVudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQURlYXRoVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21BRGVhdGhUZXN0LlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFEZWF0aFRlc3QuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQVR5cGVkRGVhdGhUZXN0LzAsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMybVsgUlVOICAgICAgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBVHlwZWREZWF0aFRlc3QvMSwgd2hlcmUgVHlwZVBhcmFtID0gZG91YmxlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21NeS9BVHlwZVBhcmFtRGVhdGhUZXN0LzAuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLCB3aGVyZSBUeXBlUGFyYW0gPSBkb3VibGUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMS5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gUGFzc2luZ1Rlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QxCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MQorG1swOzMybVsgUlVOICAgICAgXSAbW21QYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTMgdGVzdHMgZnJvbSBGYXRhbEZhaWx1cmVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IHgKKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiB4CisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIG9uIGZhbHNlKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBmYWxzZQorICBBY3R1YWw6IGZhbHNlCitFeHBlY3RlZDogdHJ1ZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBMb2dnaW5nVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21Mb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworKGV4cGVjdGluZyAyIGZhaWx1cmVzIG9uICgzKSA+PSAoYVtpXSkpCitpID09IDAKK2kgPT0gMQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgOQoraSA9PSAyCitpID09IDMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogKDMpID49IChhW2ldKSwgYWN0dWFsOiAzIHZzIDYKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTG9nZ2luZ1Rlc3QuSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttNiB0ZXN0cyBmcm9tIFNDT1BFRF9UUkFDRVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5PYmV5c1Njb3BlcworKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGhhdmUgYSB0cmFjZS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEV4cGVjdGVkIHRyYWNlCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0Lk9iZXlzU2NvcGVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJbkxvb3AKKyhleHBlY3RlZCB0byBmYWlsKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBuCisgIEFjdHVhbDogMQorRXhwZWN0ZWQ6IDIKK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IGkgPSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogaSA9IDIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luTG9vcAorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5TdWJyb3V0aW5lCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDEKK0V4cGVjdGVkOiAyCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBuID0gMQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBuCisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IG4gPSAyCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAorKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogbiA9IDIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiAKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlUmVwZWF0ZWQKKyhleHBlY3RlZCB0byBmYWlsKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEgYW5kIEIuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBCCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEMuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBDCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEsIEIsIGFuZCBELgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRAorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBBCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVSZXBlYXRlZAorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzQ29uY3VycmVudGx5CisoZXhwZWN0aW5nIDYgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMxIChpbiB0aHJlYWQgQiwgb25seSB0cmFjZSBCIGFsaXZlKS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIgKGluIHRocmVhZCBBLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzMgKGluIHRocmVhZCBCLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzQgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEEgYWxpdmUpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNSAoaW4gdGhyZWFkIEEsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBUcmFjZSBBCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM2IChpbiB0aHJlYWQgQSwgbm8gdHJhY2UgYWxpdmUpLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzQ29uY3VycmVudGx5CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKyhleHBlY3RpbmcgNSBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiBTZXRVcCgpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gdGhlIHRlc3QgYm9keS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzQsIGluIFRlYXJEb3duLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNSwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKyhleHBlY3RpbmcgMiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QuRmFpbHVyZUluU2V0VXAKKyhleHBlY3RpbmcgNCBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzEsIGluIFNldFVwKCkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmdW5jdGlvbi4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzMsIGluIFRlYXJEb3duKCkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBGYXRhbEZhaWx1cmVJblNldFVwVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorKGV4cGVjdGluZyAzIGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFRlYXJEb3duKCkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBZGRGYWlsdXJlQXRUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKK2Zvby5jYzo0MjogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlIGluIGZvby5jYworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21BZGRGYWlsdXJlQXRUZXN0Lk1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTQgdGVzdHMgZnJvbSBNaXhlZFVwVGVzdENhc2VUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbworG1swOzMybVsgICAgICAgT0sgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LkZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28KKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5TZWNvbmRUZXN0RnJvbU5hbWVzcGFjZUZvbworG1swOzMybVsgICAgICAgT0sgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWwKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKK2NsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlIE1peGVkVXBUZXN0Q2FzZVRlc3QsCit5b3UgZGVmaW5lZCB0ZXN0IEZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28gYW5kIHRlc3QgVGhpc1Nob3VsZEZhaWwKK3VzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYKK3RoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvbgordW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZQorb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWxUb28KK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKK2NsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlIE1peGVkVXBUZXN0Q2FzZVRlc3QsCit5b3UgZGVmaW5lZCB0ZXN0IEZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28gYW5kIHRlc3QgVGhpc1Nob3VsZEZhaWxUb28KK3VzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYKK3RoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvbgordW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZQorb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsVG9vCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorG1swOzMybVsgICAgICAgT0sgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCit5b3UgZGVmaW5lZCB0ZXN0IFRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsIGFuZCB0ZXN0IFRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCit1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmCit0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb24KK3VuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmUKK29mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QuVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZQorG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0YKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RBbmRTaG91bGRGYWlsCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXMKK2lsbGVnYWwuICBJbiB0ZXN0IGNhc2UgVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLAordGVzdCBEZWZpbmVkVXNpbmdURVNUX0YgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0Cit0ZXN0IERlZmluZWRVc2luZ1RFU1RBbmRTaG91bGRGYWlsIGlzIGRlZmluZWQgdXNpbmcgVEVTVC4gIFlvdSBwcm9iYWJseQord2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0CitjYXNlLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZQorG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVAorG1swOzMybVsgICAgICAgT0sgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVAorG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MsIHNvIG1peGluZyBURVNUX0YgYW5kIFRFU1QgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGlzCitpbGxlZ2FsLiAgSW4gdGVzdCBjYXNlIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwKK3Rlc3QgRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbCBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXQKK3Rlc3QgRGVmaW5lZFVzaW5nVEVTVCBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHkKK3dhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdAorY2FzZS4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttOCB0ZXN0cyBmcm9tIEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VMb2NhbFZhcmlhYmxlcworG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsVmFyaWFibGVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LlN1Y2NlZWRzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vTm9uZmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29Ob25mYXRhbEZhaWx1cmVzCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMiBmYWlsdXJlcworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAxLgorCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIDIuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttOCB0ZXN0cyBmcm9tIEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VMb2NhbFN0YXRpY1ZhcmlhYmxlcworG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsU3RhdGljVmFyaWFibGVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQorG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LlN1Y2NlZWRzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b0ZhdGFsRmFpbHVyZXMKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDIgZmFpbHVyZXMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBUeXBlZFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVR5cGVkVGVzdC8wLlN1Y2Nlc3MKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttVHlwZWRUZXN0LzAuU3VjY2VzcworG1swOzMybVsgUlVOICAgICAgXSAbW21UeXBlZFRlc3QvMC5GYWlsdXJlCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IFR5cGVQYXJhbSgpCisgIEFjdHVhbDogMAorRXhwZWN0ZWQ6IDEKK0V4cGVjdGVkIGZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVHlwZWRUZXN0LzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBVbnNpZ25lZC9UeXBlZFRlc3RQLzAsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGNoYXIKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLlN1Y2Nlc3MKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLlN1Y2Nlc3MKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLkZhaWx1cmUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogVHlwZVBhcmFtKCkKKyAgQWN0dWFsOiAnXDAnCitFeHBlY3RlZDogMVUKK1doaWNoIGlzOiAxCitFeHBlY3RlZCBmYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBjaGFyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBVbnNpZ25lZC9UeXBlZFRlc3RQLzEsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGludAorG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuU3VjY2VzcworG1swOzMybVsgICAgICAgT0sgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuU3VjY2VzcworG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuRmFpbHVyZQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBUeXBlUGFyYW0oKQorICBBY3R1YWw6IDAKK0V4cGVjdGVkOiAxVQorV2hpY2ggaXM6IDEKK0V4cGVjdGVkIGZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8xLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGludAorG1swOzMybVstLS0tLS0tLS0tXSAbW200IHRlc3RzIGZyb20gRXhwZWN0RmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6CitTdWNjZWVkZWQKKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIGZhdGFsIGZhaWx1cmUgZXhwZWN0ZWQuIgorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgorU3VjY2VlZGVkCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBub24tZmF0YWwgZmFpbHVyZS4iCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgorU3VjY2VlZGVkCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBmYXRhbCBmYWlsdXJlIGV4cGVjdGVkLiIKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogU3VjY2VzczoKK1N1Y2NlZWRlZAorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlIGNvbnRhaW5pbmcgIlNvbWUgb3RoZXIgbm9uLWZhdGFsIGZhaWx1cmUuIgorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcworG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyAyIGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LkludGVyY2VwdE9ubHlDdXJyZW50VGhyZWFkCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdC5JbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBQcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IEdldFBhcmFtKCkKKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wLCB3aGVyZSBHZXRQYXJhbSgpID0gMgorG1swOzMybVstLS0tLS0tLS0tXSAbW21HbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK0JhckVudmlyb25tZW50OjpUZWFyRG93bigpIGNhbGxlZC4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorRm9vRW52aXJvbm1lbnQ6OlRlYXJEb3duKCkgY2FsbGVkLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKxtbMDszMm1bPT09PT09PT09PV0gG1ttNjIgdGVzdHMgZnJvbSAyNyB0ZXN0IGNhc2VzIHJhbi4KKxtbMDszMm1bICBQQVNTRUQgIF0gG1ttMjEgdGVzdHMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbTQxIHRlc3RzLCBsaXN0ZWQgYmVsb3c6CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUxvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuT2JleXNTY29wZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luTG9vcAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5TdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVOZXN0ZWQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZVJlcGVhdGVkCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NDb25jdXJyZW50bHkKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21BZGRGYWlsdXJlQXRUZXN0Lk1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWwKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbFRvbworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb0ZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVR5cGVkVGVzdC8wLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgY2hhcgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgaW50CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QuSW50ZXJjZXB0T25seUN1cnJlbnRUaHJlYWQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttUHJpbnRpbmdGYWlsaW5nUGFyYW1zL0ZhaWxpbmdQYXJhbVRlc3QuRmFpbHMvMCwgd2hlcmUgR2V0UGFyYW0oKSA9IDIKKworNDEgRkFJTEVEIFRFU1RTCisbWzA7MzNtICBZT1UgSEFWRSAxIERJU0FCTEVEIFRFU1QKKworG1ttTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gRmF0YWxGYWlsdXJlVGVzdC4qOkxvZ2dpbmdUZXN0LioKK1s9PT09PT09PT09XSBSdW5uaW5nIDQgdGVzdHMgZnJvbSAyIHRlc3QgY2FzZXMuCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLgorWy0tLS0tLS0tLS1dIDMgdGVzdHMgZnJvbSBGYXRhbEZhaWx1cmVUZXN0CitbIFJVTiAgICAgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUgKD8gbXMpCitbIFJVTiAgICAgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUgKD8gbXMpCitbIFJVTiAgICAgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIG9uIGZhbHNlKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBmYWxzZQorICBBY3R1YWw6IGZhbHNlCitFeHBlY3RlZDogdHJ1ZQorWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lICg/IG1zKQorWy0tLS0tLS0tLS1dIDMgdGVzdHMgZnJvbSBGYXRhbEZhaWx1cmVUZXN0ICg/IG1zIHRvdGFsKQorCitbLS0tLS0tLS0tLV0gMSB0ZXN0IGZyb20gTG9nZ2luZ1Rlc3QKK1sgUlVOICAgICAgXSBMb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworKGV4cGVjdGluZyAyIGZhaWx1cmVzIG9uICgzKSA+PSAoYVtpXSkpCitpID09IDAKK2kgPT0gMQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgOQoraSA9PSAyCitpID09IDMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogKDMpID49IChhW2ldKSwgYWN0dWFsOiAzIHZzIDYKK1sgIEZBSUxFRCAgXSBMb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucyAoPyBtcykKK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBMb2dnaW5nVGVzdCAoPyBtcyB0b3RhbCkKKworWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorWz09PT09PT09PT1dIDQgdGVzdHMgZnJvbSAyIHRlc3QgY2FzZXMgcmFuLiAoPyBtcyB0b3RhbCkKK1sgIFBBU1NFRCAgXSAwIHRlc3RzLgorWyAgRkFJTEVEICBdIDQgdGVzdHMsIGxpc3RlZCBiZWxvdzoKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKK1sgIEZBSUxFRCAgXSBMb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworCisgNCBGQUlMRUQgVEVTVFMKKyAgWU9VIEhBVkUgMSBESVNBQkxFRCBURVNUCisKK05vdGU6IEdvb2dsZSBUZXN0IGZpbHRlciA9ICpESVNBQkxFRF8qCitbPT09PT09PT09PV0gUnVubmluZyAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZS4KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCitbLS0tLS0tLS0tLV0gMSB0ZXN0IGZyb20gRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0CitbIFJVTiAgICAgIF0gRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0LkRJU0FCTEVEX0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1N1cHByZXNzZXNXYXJuaW5nCitbICAgICAgIE9LIF0gRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0LkRJU0FCTEVEX0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1N1cHByZXNzZXNXYXJuaW5nCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duCitbPT09PT09PT09PV0gMSB0ZXN0IGZyb20gMSB0ZXN0IGNhc2UgcmFuLgorWyAgUEFTU0VEICBdIDEgdGVzdC4KK05vdGU6IEdvb2dsZSBUZXN0IGZpbHRlciA9IFBhc3NpbmdUZXN0LioKK05vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAyIG9mIDIuCitbPT09PT09PT09PV0gUnVubmluZyAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZS4KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCitbLS0tLS0tLS0tLV0gMSB0ZXN0IGZyb20gUGFzc2luZ1Rlc3QKK1sgUlVOICAgICAgXSBQYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKK1sgICAgICAgT0sgXSBQYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZSByYW4uCitbICBQQVNTRUQgIF0gMSB0ZXN0LgorCisgIFlPVSBIQVZFIDEgRElTQUJMRUQgVEVTVAorCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkYzliYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDI0MjcgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uIDA5LzI0LzIwMTAgYnkgY29tbWFuZAorLy8gJ2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgNScuICBETyBOT1QgRURJVCBCWSBIQU5EIQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGd0ZXN0X3ByZWRfaW1wbC5oCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIHNjcmlwdCBhbmQgcXVpdGUgbG9uZy4gIElmIHlvdSBpbnRlbmQgdG8KKy8vIGxlYXJuIGhvdyBHb29nbGUgVGVzdCB3b3JrcyBieSByZWFkaW5nIGl0cyB1bml0IHRlc3RzLCByZWFkCisvLyBndGVzdF91bml0dGVzdC5jYyBpbnN0ZWFkLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBHb29nbGUgVGVzdCBwcmVkaWNhdGUKKy8vIGFzc2VydGlvbnMuICBXZSBjb21waWxlIGl0IGFzIHBhcnQgb2YgdGhlIGd0ZXN0X3VuaXR0ZXN0IHRhcmdldAorLy8gb25seSB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiB0aWR5IGFuZCBjb21wYWN0LCBhcyBpdCBpcyBxdWl0ZQorLy8gaW52b2x2ZWQgdG8gc2V0IHVwIHRoZSBzdGFnZSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCB1c2luZyBHb29nbGUKKy8vIFRlc3QgaXRzZWxmLgorLy8KKy8vIEN1cnJlbnRseSwgZ3Rlc3RfdW5pdHRlc3QgdGFrZXMgfjExIHNlY29uZHMgdG8gcnVuIGluIHRoZSB0ZXN0aW5nCisvLyBkYWVtb24uICBJbiB0aGUgZnV0dXJlLCBpZiBpdCBncm93cyB0b28gbGFyZ2UgYW5kIG5lZWRzIG11Y2ggbW9yZQorLy8gdGltZSB0byBmaW5pc2gsIHdlIHNob3VsZCBjb25zaWRlciBzZXBhcmF0aW5nIHRoaXMgZmlsZSBpbnRvIGEKKy8vIHN0YW5kLWFsb25lIHJlZ3Jlc3Npb24gdGVzdC4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gQSB1c2VyLWRlZmluZWQgZGF0YSB0eXBlLgorc3RydWN0IEJvb2wgeworICBleHBsaWNpdCBCb29sKGludCB2YWwpIDogdmFsdWUodmFsICE9IDApIHt9CisKKyAgYm9vbCBvcGVyYXRvcj4oaW50IG4pIGNvbnN0IHsgcmV0dXJuIHZhbHVlID4gQm9vbChuKS52YWx1ZTsgfQorCisgIEJvb2wgb3BlcmF0b3IrKGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gQm9vbCh2YWx1ZSArIHJocy52YWx1ZSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiB2YWx1ZSA9PSByaHMudmFsdWU7IH0KKworICBib29sIHZhbHVlOworfTsKKworLy8gRW5hYmxlcyBCb29sIHRvIGJlIHVzZWQgaW4gYXNzZXJ0aW9ucy4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCb29sJiB4KSB7CisgIHJldHVybiBvcyA8PCAoeC52YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIHVuYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2Jvb2wgUHJlZEZ1bmN0aW9uMShUMSB2MSkgeworICByZXR1cm4gdjEgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb24xSW50KGludCB2MSkgeworICByZXR1cm4gdjEgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb24xQm9vbChCb29sIHYxKSB7CisgIHJldHVybiB2MSA+IDA7Cit9CisKKy8vIEEgdW5hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3IxIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxKSB7CisgICAgcmV0dXJuIHYxID4gMDsKKyAgfQorfTsKKworLy8gQSB1bmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjEoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjEodjEpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgPDwgIi4iOworfQorCisvLyBBIHVuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjEgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uMShlMSwgdjEpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMS4KKworY2xhc3MgUHJlZGljYXRlMVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworfTsKKworYm9vbCBQcmVkaWNhdGUxVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlMVRlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGUxVGVzdDo6bjFfOworCit0eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUxVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMVRlc3QgRVhQRUNUX1BSRUQxVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMVRlc3QgQVNTRVJUX1BSRUQxVGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKKyAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3Rpb24xQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3Rpb24xSW50LAorICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3Rpb24xSW50LAorICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKKyAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgYmluYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIGJpbmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBQcmVkRnVuY3Rpb24yKFQxIHYxLCBUMiB2MikgeworICByZXR1cm4gdjEgKyB2MiA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbjJJbnQoaW50IHYxLCBpbnQgdjIpIHsKKyAgcmV0dXJuIHYxICsgdjIgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb24yQm9vbChCb29sIHYxLCBCb29sIHYyKSB7CisgIHJldHVybiB2MSArIHYyID4gMDsKK30KKworLy8gQSBiaW5hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3IyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgeworICAgIHJldHVybiB2MSArIHYyID4gMDsKKyAgfQorfTsKKworLy8gQSBiaW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uMihjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7CisgIGlmIChQcmVkRnVuY3Rpb24yKHYxLCB2MikpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBlMSA8PCAiICsgIiA8PCBlMgorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCB2MSArIHYyIDw8ICIuIjsKK30KKworLy8gQSBiaW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yMiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uMihlMSwgZTIsIHYxLCB2Mik7CisgIH0KK307CisKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQyLgorCitjbGFzcyBQcmVkaWNhdGUyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKKyAgICBmaW5pc2hlZF8gPSBmYWxzZTsKKyAgICBuMV8gPSBuMl8gPSAwOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIG4xXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAyICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuMl8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworICBzdGF0aWMgaW50IG4yXzsKK307CisKK2Jvb2wgUHJlZGljYXRlMlRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTJUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlMlRlc3Q6Om4xXzsKK2ludCBQcmVkaWNhdGUyVGVzdDo6bjJfOworCit0eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUyVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMlRlc3QgRVhQRUNUX1BSRUQyVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMlRlc3QgQVNTRVJUX1BSRUQyVGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIHRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgdGVybmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK2Jvb2wgUHJlZEZ1bmN0aW9uMyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb24zSW50KGludCB2MSwgaW50IHYyLCBpbnQgdjMpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbjNCb29sKEJvb2wgdjEsIEJvb2wgdjIsIEJvb2wgdjMpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyA+IDA7Cit9CisKKy8vIEEgdGVybmFyeSBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvcjMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgeworICAgIHJldHVybiB2MSArIHYyICsgdjMgPiAwOworICB9Cit9OworCisvLyBBIHRlcm5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjMoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSB7CisgIGlmIChQcmVkRnVuY3Rpb24zKHYxLCB2MiwgdjMpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgKyB2MiArIHYzIDw8ICIuIjsKK30KKworLy8gQSB0ZXJuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgY29uc3QgeworICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb24zKGUxLCBlMiwgZTMsIHYxLCB2MiwgdjMpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMy4KKworY2xhc3MgUHJlZGljYXRlM1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gbjNfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4zXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA0ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgorICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKKyAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOworCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87CisKKyAgc3RhdGljIGludCBuMV87CisgIHN0YXRpYyBpbnQgbjJfOworICBzdGF0aWMgaW50IG4zXzsKK307CisKK2Jvb2wgUHJlZGljYXRlM1Rlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTNUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlM1Rlc3Q6Om4xXzsKK2ludCBQcmVkaWNhdGUzVGVzdDo6bjJfOworaW50IFByZWRpY2F0ZTNUZXN0OjpuM187CisKK3R5cGVkZWYgUHJlZGljYXRlM1Rlc3QgRVhQRUNUX1BSRURfRk9STUFUM1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTNUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBFWFBFQ1RfUFJFRDNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBBU1NFUlRfUFJFRDNUZXN0OworCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIDQtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIDQtYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2Jvb2wgUHJlZEZ1bmN0aW9uNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb240SW50KGludCB2MSwgaW50IHYyLCBpbnQgdjMsIGludCB2NCkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb240Qm9vbChCb29sIHYxLCBCb29sIHYyLCBCb29sIHYzLCBCb29sIHY0KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCA+IDA7Cit9CisKKy8vIEEgNC1hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3I0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7CisgICAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKKyAgfQorfTsKKworLy8gQSA0LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjQoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjQodjEsIHYyLCB2MywgdjQpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgKyB2MiArIHYzICsgdjQgPDwgIi4iOworfQorCisvLyBBIDQtYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uNChlMSwgZTIsIGUzLCBlNCwgdjEsIHYyLCB2MywgdjQpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNC4KKworY2xhc3MgUHJlZGljYXRlNFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gbjNfID0gbjRfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4zXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA0ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuNF8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNSAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworICBzdGF0aWMgaW50IG4yXzsKKyAgc3RhdGljIGludCBuM187CisgIHN0YXRpYyBpbnQgbjRfOworfTsKKworYm9vbCBQcmVkaWNhdGU0VGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlNFRlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGU0VGVzdDo6bjFfOworaW50IFByZWRpY2F0ZTRUZXN0OjpuMl87CitpbnQgUHJlZGljYXRlNFRlc3Q6Om4zXzsKK2ludCBQcmVkaWNhdGU0VGVzdDo6bjRfOworCit0eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU0VGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNFRlc3QgRVhQRUNUX1BSRUQ0VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNFRlc3QgQVNTRVJUX1BSRUQ0VGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENChQcmVkRnVuY3Rpb240Qm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3Rpb240SW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENChQcmVkRnVuY3Rpb240SW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgNS1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgNS1hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2Jvb2wgUHJlZEZ1bmN0aW9uNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb241SW50KGludCB2MSwgaW50IHYyLCBpbnQgdjMsIGludCB2NCwgaW50IHY1KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKK30KK2Jvb2wgUHJlZEZ1bmN0aW9uNUJvb2woQm9vbCB2MSwgQm9vbCB2MiwgQm9vbCB2MywgQm9vbCB2NCwgQm9vbCB2NSkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7Cit9CisKKy8vIEEgNS1hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3I1IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgeworICAgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKKyAgfQorfTsKKworLy8gQSA1LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb241KGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjUodjEsIHYyLCB2MywgdjQsIHY1KSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0IDw8ICIgKyAiIDw8IGU1CisgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKKyAgICAgIDw8IHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPDwgIi4iOworfQorCisvLyBBIDUtYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjUgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjUoZTEsIGUyLCBlMywgZTQsIGU1LCB2MSwgdjIsIHYzLCB2NCwgdjUpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNS4KKworY2xhc3MgUHJlZGljYXRlNVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gbjNfID0gbjRfID0gbjVfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4zXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA0ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuNF8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNSAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjVfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDYgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKworICBzdGF0aWMgaW50IG4xXzsKKyAgc3RhdGljIGludCBuMl87CisgIHN0YXRpYyBpbnQgbjNfOworICBzdGF0aWMgaW50IG40XzsKKyAgc3RhdGljIGludCBuNV87Cit9OworCitib29sIFByZWRpY2F0ZTVUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOworYm9vbCBQcmVkaWNhdGU1VGVzdDo6ZmluaXNoZWRfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuMV87CitpbnQgUHJlZGljYXRlNVRlc3Q6Om4yXzsKK2ludCBQcmVkaWNhdGU1VGVzdDo6bjNfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuNF87CitpbnQgUHJlZGljYXRlNVRlc3Q6Om41XzsKKwordHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNVRlc3QgQVNTRVJUX1BSRURfRk9STUFUNVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEVYUEVDVF9QUkVENVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEFTU0VSVF9QUkVENVRlc3Q7CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241SW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGFiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBVbml0IHRlc3QgZm9yIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0L3Byb2R1Y3Rpb24uaCIKKworLy8gVGVzdHMgdGhhdCBwcml2YXRlIG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYSBURVNUIGRlY2xhcmVkIGFzCisvLyBhIGZyaWVuZCBvZiB0aGUgY2xhc3MuCitURVNUKFByaXZhdGVDb2RlVGVzdCwgQ2FuQWNjZXNzUHJpdmF0ZU1lbWJlcnMpIHsKKyAgUHJpdmF0ZUNvZGUgYTsKKyAgRVhQRUNUX0VRKDAsIGEueF8pOworCisgIGEuc2V0X3goMSk7CisgIEVYUEVDVF9FUSgxLCBhLnhfKTsKK30KKwordHlwZWRlZiB0ZXN0aW5nOjpUZXN0IFByaXZhdGVDb2RlRml4dHVyZVRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgcHJpdmF0ZSBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGEgVEVTVF9GIGRlY2xhcmVkCisvLyBhcyBhIGZyaWVuZCBvZiB0aGUgY2xhc3MuCitURVNUX0YoUHJpdmF0ZUNvZGVGaXh0dXJlVGVzdCwgQ2FuQWNjZXNzUHJpdmF0ZU1lbWJlcnMpIHsKKyAgUHJpdmF0ZUNvZGUgYTsKKyAgRVhQRUNUX0VRKDAsIGEueF8pOworCisgIGEuc2V0X3goMik7CisgIEVYUEVDVF9FUSgyLCBhLnhfKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyM2RjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjCkBAIC0wLDAgKzEsMjUzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyB0aGUgLS1ndGVzdF9yZXBlYXQ9bnVtYmVyIGZsYWcuCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZGVhdGhfdGVzdF9zdHlsZSk7CitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsKK0dURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGZpbHRlcik7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCk7CisKK25hbWVzcGFjZSB7CisKKy8vIFdlIG5lZWQgdGhpcyB3aGVuIHdlIGFyZSB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZiBhbmQgdGhlcmVmb3JlCisvLyBjYW5ub3QgdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuCisjZGVmaW5lIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBkbyB7XAorICAgIGNvbnN0IGludCBleHBlY3RlZF92YWwgPSAoZXhwZWN0ZWQpO1wKKyAgICBjb25zdCBpbnQgYWN0dWFsX3ZhbCA9IChhY3R1YWwpO1wKKyAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGV4cGVjdGVkX3ZhbCAhPSBhY3R1YWxfdmFsKSkge1wKKyAgICAgIDo6c3RkOjpjb3V0IDw8ICJWYWx1ZSBvZjogIiAjYWN0dWFsICJcbiJcCisgICAgICAgICAgICAgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ZhbCA8PCAiXG4iXAorICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiICNleHBlY3RlZCAiXG4iXAorICAgICAgICAgICAgICAgICAgPDwgIldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbCA8PCAiXG4iO1wKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpO1wKKyAgICB9XAorICB9IHdoaWxlKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKworLy8gVXNlZCBmb3IgdmVyaWZ5aW5nIHRoYXQgZ2xvYmFsIGVudmlyb25tZW50IHNldC11cCBhbmQgdGVhci1kb3duIGFyZQorLy8gaW5zaWRlIHRoZSBndGVzdF9yZXBlYXQgbG9vcC4KKworaW50IGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKK2ludCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCA9IDA7CisKK2NsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgTXlFbnZpcm9ubWVudCgpIHt9CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgZ19lbnZpcm9ubWVudF9zZXRfdXBfY291bnQrKzsgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50Kys7IH0KK307CisKKy8vIEEgdGVzdCB0aGF0IHNob3VsZCBmYWlsLgorCitpbnQgZ19zaG91bGRfZmFpbF9jb3VudCA9IDA7CisKK1RFU1QoRm9vVGVzdCwgU2hvdWxkRmFpbCkgeworICBnX3Nob3VsZF9mYWlsX2NvdW50Kys7CisgIEVYUEVDVF9FUSgwLCAxKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOworfQorCisvLyBBIHRlc3QgdGhhdCBzaG91bGQgcGFzcy4KKworaW50IGdfc2hvdWxkX3Bhc3NfY291bnQgPSAwOworCitURVNUKEZvb1Rlc3QsIFNob3VsZFBhc3MpIHsKKyAgZ19zaG91bGRfcGFzc19jb3VudCsrOworfQorCisvLyBBIHRlc3QgdGhhdCBjb250YWlucyBhIHRocmVhZC1zYWZlIGRlYXRoIHRlc3QgYW5kIGEgZmFzdCBkZWF0aAorLy8gdGVzdC4gIEl0IHNob3VsZCBwYXNzLgorCitpbnQgZ19kZWF0aF90ZXN0X2NvdW50ID0gMDsKKworVEVTVChCYXJEZWF0aFRlc3QsIFRocmVhZFNhZmVBbmRGYXN0KSB7CisgIGdfZGVhdGhfdGVzdF9jb3VudCsrOworCisgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCksICIiKTsKKworICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpLCAiIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAoraW50IGdfcGFyYW1fdGVzdF9jb3VudCA9IDA7CisKK2NvbnN0IGludCBrTnVtYmVyT2ZQYXJhbVRlc3RzID0gMTA7CisKK2NsYXNzIE15UGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7fTsKKworVEVTVF9QKE15UGFyYW1UZXN0LCBTaG91bGRQYXNzKSB7CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgcGFyYW1ldGVyIHZhbHVlIGNoZWNraW5nIHJvYnVzdAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBXUlQgb3JkZXIgb2YgdGVzdHMuCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZ19wYXJhbV90ZXN0X2NvdW50ICUga051bWJlck9mUGFyYW1UZXN0cywgR2V0UGFyYW0oKSk7CisgIGdfcGFyYW1fdGVzdF9jb3VudCsrOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXlQYXJhbVNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXlQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpSYW5nZSgwLCBrTnVtYmVyT2ZQYXJhbVRlc3RzKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFJlc2V0cyB0aGUgY291bnQgZm9yIGVhY2ggdGVzdC4KK3ZvaWQgUmVzZXRDb3VudHMoKSB7CisgIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKKyAgZ19lbnZpcm9ubWVudF90ZWFyX2Rvd25fY291bnQgPSAwOworICBnX3Nob3VsZF9mYWlsX2NvdW50ID0gMDsKKyAgZ19zaG91bGRfcGFzc19jb3VudCA9IDA7CisgIGdfZGVhdGhfdGVzdF9jb3VudCA9IDA7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgZ19wYXJhbV90ZXN0X2NvdW50ID0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKK30KKworLy8gQ2hlY2tzIHRoYXQgdGhlIGNvdW50IGZvciBlYWNoIHRlc3QgaXMgZXhwZWN0ZWQuCit2b2lkIENoZWNrQ291bnRzKGludCBleHBlY3RlZCkgeworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgZ19zaG91bGRfZmFpbF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfc2hvdWxkX3Bhc3NfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2RlYXRoX3Rlc3RfY291bnQpOworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCisvLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgR29vZ2xlIFRlc3Qgd2hlbiAtLWd0ZXN0X3JlcGVhdCBpcyBub3Qgc3BlY2lmaWVkLgordm9pZCBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKSB7CisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKKyAgQ2hlY2tDb3VudHMoMSk7Cit9CisKKy8vIFRlc3RzIHRoZSBiZWhhdmlvciBvZiBHb29nbGUgVGVzdCB3aGVuIC0tZ3Rlc3RfcmVwZWF0IGhhcyB0aGUgZ2l2ZW4gdmFsdWUuCit2b2lkIFRlc3RSZXBlYXQoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisKKyAgUmVzZXRDb3VudHMoKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgPiAwID8gMSA6IDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKHJlcGVhdCk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIC0tZ3Rlc3RfcmVwZWF0IHdoZW4gLS1ndGVzdF9maWx0ZXIgc3BlY2lmaWVzIGFuIGVtcHR5CisvLyBzZXQgb2YgdGVzdHMuCit2b2lkIFRlc3RSZXBlYXRXaXRoRW1wdHlGaWx0ZXIoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICJOb25lIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKDApOworfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgorLy8gc3VjY2Vzc2Z1bCB0ZXN0cy4KK3ZvaWQgVGVzdFJlcGVhdFdpdGhGaWx0ZXJGb3JTdWNjZXNzZnVsVGVzdHMoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIqLSpTaG91bGRGYWlsIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMCwgZ19zaG91bGRfZmFpbF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX3Nob3VsZF9wYXNzX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZGVhdGhfdGVzdF9jb3VudCk7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgorLy8gZmFpbGVkIHRlc3RzLgordm9pZCBUZXN0UmVwZWF0V2l0aEZpbHRlckZvckZhaWxlZFRlc3RzKGludCByZXBlYXQpIHsKKyAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OworICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiKlNob3VsZEZhaWwiOworCisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfc2hvdWxkX2ZhaWxfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfc2hvdWxkX3Bhc3NfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfZGVhdGhfdGVzdF9jb3VudCk7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBNeUVudmlyb25tZW50KTsKKworICBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKTsKKyAgVGVzdFJlcGVhdCgwKTsKKyAgVGVzdFJlcGVhdCgxKTsKKyAgVGVzdFJlcGVhdCg1KTsKKworICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDIpOworICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDMpOworCisgIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yU3VjY2Vzc2Z1bFRlc3RzKDMpOworCisgIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yRmFpbGVkVGVzdHMoNCk7CisKKyAgLy8gSXQgd291bGQgYmUgbmljZSB0byB2ZXJpZnkgdGhhdCB0aGUgdGVzdHMgaW5kZWVkIGxvb3AgZm9yZXZlcgorICAvLyB3aGVuIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBuZWdhdGl2ZSwgYnV0IHRoaXMgdGVzdCB3aWxsIGJlIHF1aXRlCisgIC8vIGNvbXBsaWNhdGVkIHRvIHdyaXRlLiAgU2luY2UgdGhpcyBmbGFnIGlzIGZvciBpbnRlcmFjdGl2ZQorICAvLyBkZWJ1Z2dpbmcgb25seSBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIG5vcm1hbCB0ZXN0IHJlc3VsdCwgc3VjaCBhCisgIC8vIHRlc3Qgd291bGQgYmUgYW4gb3ZlcmtpbGwuCisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzBkMDMwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weQpAQCAtMCwwICsxLDMyNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IHRlc3Qgc2h1ZmZsaW5nIHdvcmtzLiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29tbWFuZCB0byBydW4gdGhlIGd0ZXN0X3NodWZmbGVfdGVzdF8gcHJvZ3JhbS4KK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3Rfc2h1ZmZsZV90ZXN0XycpCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGVzdCBzaGFyZGluZy4KK1RPVEFMX1NIQVJEU19FTlZfVkFSID0gJ0dURVNUX1RPVEFMX1NIQVJEUycKK1NIQVJEX0lOREVYX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfSU5ERVgnCisKK1RFU1RfRklMVEVSID0gJ0EqLkE6QSouQjpDKicKKworQUxMX1RFU1RTID0gW10KK0FDVElWRV9URVNUUyA9IFtdCitGSUxURVJFRF9URVNUUyA9IFtdCitTSEFSREVEX1RFU1RTID0gW10KKworU0hVRkZMRURfQUxMX1RFU1RTID0gW10KK1NIVUZGTEVEX0FDVElWRV9URVNUUyA9IFtdCitTSFVGRkxFRF9GSUxURVJFRF9URVNUUyA9IFtdCitTSFVGRkxFRF9TSEFSREVEX1RFU1RTID0gW10KKworCitkZWYgQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCk6CisgIHJldHVybiAnLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cycKKworCitkZWYgRmlsdGVyRmxhZyh0ZXN0X2ZpbHRlcik6CisgIHJldHVybiAnLS1ndGVzdF9maWx0ZXI9JXMnICUgKHRlc3RfZmlsdGVyLCkKKworCitkZWYgUmVwZWF0RmxhZyhuKToKKyAgcmV0dXJuICctLWd0ZXN0X3JlcGVhdD0lcycgJSAobiwpCisKKworZGVmIFNodWZmbGVGbGFnKCk6CisgIHJldHVybiAnLS1ndGVzdF9zaHVmZmxlJworCisKK2RlZiBSYW5kb21TZWVkRmxhZyhuKToKKyAgcmV0dXJuICctLWd0ZXN0X3JhbmRvbV9zZWVkPSVzJyAlIChuLCkKKworCitkZWYgUnVuQW5kUmV0dXJuT3V0cHV0KGV4dHJhX2VudiwgYXJncyk6CisgICIiIlJ1bnMgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgb3V0cHV0LiIiIgorCisgIGVudmlyb25fY29weSA9IG9zLmVudmlyb24uY29weSgpCisgIGVudmlyb25fY29weS51cGRhdGUoZXh0cmFfZW52KQorCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgYXJncywgZW52PWVudmlyb25fY29weSkub3V0cHV0CisKKworZGVmIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyhleHRyYV9lbnYsIGFyZ3MpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgYSBsaXN0IG9mIHRlc3QgbGlzdHMuCisKKyAgQXJnczoKKyAgICBleHRyYV9lbnY6IGEgbWFwIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZWlyIHZhbHVlcworICAgIGFyZ3M6IGNvbW1hbmQgbGluZSBmbGFncyB0byBwYXNzIHRvIGd0ZXN0X3NodWZmbGVfdGVzdF8KKworICBSZXR1cm5zOgorICAgIEEgbGlzdCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IGlzIHRoZSBsaXN0IG9mIHRlc3RzIHJ1biBpbiB0aGUgaS10aAorICAgIHRlc3QgaXRlcmF0aW9uLgorICAiIiIKKworICB0ZXN0X2l0ZXJhdGlvbnMgPSBbXQorICBmb3IgbGluZSBpbiBSdW5BbmRSZXR1cm5PdXRwdXQoZXh0cmFfZW52LCBhcmdzKS5zcGxpdCgnXG4nKToKKyAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy0tLS0nKToKKyAgICAgIHRlc3RzID0gW10KKyAgICAgIHRlc3RfaXRlcmF0aW9ucy5hcHBlbmQodGVzdHMpCisgICAgZWxpZiBsaW5lLnN0cmlwKCk6CisgICAgICB0ZXN0cy5hcHBlbmQobGluZS5zdHJpcCgpKSAgIyAnVGVzdENhc2VOYW1lLlRlc3ROYW1lJworCisgIHJldHVybiB0ZXN0X2l0ZXJhdGlvbnMKKworCitkZWYgR2V0VGVzdENhc2VzKHRlc3RzKToKKyAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgdGVzdCBjYXNlcyBpbiB0aGUgZ2l2ZW4gZnVsbCB0ZXN0IG5hbWVzLgorCisgIEFyZ3M6CisgICAgdGVzdHM6IGEgbGlzdCBvZiBmdWxsIHRlc3QgbmFtZXMKKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiB0ZXN0IGNhc2VzIGZyb20gJ3Rlc3RzJywgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuCisgICAgQ29uc2VjdXRpdmUgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZC4KKyAgIiIiCisKKyAgdGVzdF9jYXNlcyA9IFtdCisgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgIHRlc3RfY2FzZSA9IHRlc3Quc3BsaXQoJy4nKVswXQorICAgIGlmIG5vdCB0ZXN0X2Nhc2UgaW4gdGVzdF9jYXNlczoKKyAgICAgIHRlc3RfY2FzZXMuYXBwZW5kKHRlc3RfY2FzZSkKKworICByZXR1cm4gdGVzdF9jYXNlcworCisKK2RlZiBDYWxjdWxhdGVUZXN0TGlzdHMoKToKKyAgIiIiQ2FsY3VsYXRlcyB0aGUgbGlzdCBvZiB0ZXN0cyBydW4gdW5kZXIgZGlmZmVyZW50IGZsYWdzLiIiIgorCisgIGlmIG5vdCBBTExfVEVTVFM6CisgICAgQUxMX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCldKVswXSkKKworICBpZiBub3QgQUNUSVZFX1RFU1RTOgorICAgIEFDVElWRV9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbXSlbMF0pCisKKyAgaWYgbm90IEZJTFRFUkVEX1RFU1RTOgorICAgIEZJTFRFUkVEX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbRmlsdGVyRmxhZyhURVNUX0ZJTFRFUildKVswXSkKKworICBpZiBub3QgU0hBUkRFRF9URVNUUzoKKyAgICBTSEFSREVEX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJEX0lOREVYX0VOVl9WQVI6ICcxJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0FMTF9URVNUUzoKKyAgICBTSFVGRkxFRF9BTExfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcoKSwgU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKVswXSkKKworICBpZiBub3QgU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgIFNIVUZGTEVEX0FDVElWRV9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgorICAgIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLmV4dGVuZChHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSksIEZpbHRlckZsYWcoVEVTVF9GSUxURVIpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgU0hVRkZMRURfU0hBUkRFRF9URVNUUy5leHRlbmQoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKworY2xhc3MgR1Rlc3RTaHVmZmxlVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRlc3Qgc2h1ZmZsaW5nLiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBDYWxjdWxhdGVUZXN0TGlzdHMoKQorCisgIGRlZiB0ZXN0U2h1ZmZsZVByZXNlcnZlc051bWJlck9mVGVzdHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQUxMX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0FMTF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQUNUSVZFX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0FDVElWRV9URVNUUykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oRklMVEVSRURfVEVTVFMpLCBsZW4oU0hVRkZMRURfRklMVEVSRURfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFNIQVJERURfVEVTVFMpLCBsZW4oU0hVRkZMRURfU0hBUkRFRF9URVNUUykpCisKKyAgZGVmIHRlc3RTaHVmZmxlQ2hhbmdlc1Rlc3RPcmRlcihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfQUxMX1RFU1RTICE9IEFMTF9URVNUUywgU0hVRkZMRURfQUxMX1RFU1RTKQorICAgIHNlbGYuYXNzZXJ0XyhTSFVGRkxFRF9BQ1RJVkVfVEVTVFMgIT0gQUNUSVZFX1RFU1RTLCBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTICE9IEZJTFRFUkVEX1RFU1RTLAorICAgICAgICAgICAgICAgICBTSFVGRkxFRF9GSUxURVJFRF9URVNUUykKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfU0hBUkRFRF9URVNUUyAhPSBTSEFSREVEX1RFU1RTLAorICAgICAgICAgICAgICAgICBTSFVGRkxFRF9TSEFSREVEX1RFU1RTKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUNoYW5nZXNUZXN0Q2FzZU9yZGVyKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XyhHZXRUZXN0Q2FzZXMoU0hVRkZMRURfQUxMX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoQUxMX1RFU1RTKSwKKyAgICAgICAgICAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FMTF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfQUNUSVZFX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoQUNUSVZFX1RFU1RTKSwKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FDVElWRV9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpICE9IEdldFRlc3RDYXNlcyhGSUxURVJFRF9URVNUUyksCisgICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9GSUxURVJFRF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfU0hBUkRFRF9URVNUUykgIT0gR2V0VGVzdENhc2VzKFNIQVJERURfVEVTVFMpLAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfU0hBUkRFRF9URVNUUykpCisKKyAgZGVmIHRlc3RTaHVmZmxlRG9lc05vdFJlcGVhdFRlc3Qoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9BTExfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLmNvdW50KHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFNIVUZGTEVEX1NIQVJERURfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlRG9lc05vdENyZWF0ZU5ld1Rlc3Qoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gQUxMX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gQUNUSVZFX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBGSUxURVJFRF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSEFSREVEX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlSW5jbHVkZXNBbGxUZXN0cyhzZWxmKToKKyAgICBmb3IgdGVzdCBpbiBBTExfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSFVGRkxFRF9BTExfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIEZJTFRFUkVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hBUkRFRF9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlTGVhdmVzRGVhdGhUZXN0c0F0RnJvbnQoc2VsZik6CisgICAgbm9uX2RlYXRoX3Rlc3RfZm91bmQgPSBGYWxzZQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKKyAgICAgIGlmICdEZWF0aFRlc3QuJyBpbiB0ZXN0OgorICAgICAgICBzZWxmLmFzc2VydF8obm90IG5vbl9kZWF0aF90ZXN0X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgJyVzIGFwcGVhcnMgYWZ0ZXIgYSBub24tZGVhdGggdGVzdCcgJSAodGVzdCwpKQorICAgICAgZWxzZToKKyAgICAgICAgbm9uX2RlYXRoX3Rlc3RfZm91bmQgPSBUcnVlCisKKyAgZGVmIF9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoc2VsZiwgdGVzdHMpOgorICAgIHRlc3RfY2FzZXMgPSBbXQorICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgW3Rlc3RfY2FzZSwgX10gPSB0ZXN0LnNwbGl0KCcuJykKKyAgICAgIGlmIHRlc3RfY2FzZXMgYW5kIHRlc3RfY2FzZXNbLTFdICE9IHRlc3RfY2FzZToKKyAgICAgICAgdGVzdF9jYXNlcy5hcHBlbmQodGVzdF9jYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHRlc3RfY2FzZXMuY291bnQodGVzdF9jYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBjYXNlICVzIGlzIG5vdCBncm91cGVkIHRvZ2V0aGVyIGluICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfY2FzZSwgdGVzdHMpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RJbnRlcmxlYXZlVGVzdENhc2VzKHNlbGYpOgorICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9BTExfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX0FDVElWRV9URVNUUykKKyAgICBzZWxmLl9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpCisKKyAgZGVmIHRlc3RTaHVmZmxlUmVzdG9yZXNPcmRlckFmdGVyRWFjaEl0ZXJhdGlvbihzZWxmKToKKyAgICAjIEdldCB0aGUgdGVzdCBsaXN0cyBpbiBhbGwgMyBpdGVyYXRpb25zLCB1c2luZyByYW5kb20gc2VlZCAxLCAyLAorICAgICMgYW5kIDMgcmVzcGVjdGl2ZWx5LiAgR29vZ2xlIFRlc3QgcGlja3MgYSBkaWZmZXJlbnQgc2VlZCBpbiBlYWNoCisgICAgIyBpdGVyYXRpb24sIGFuZCB0aGlzIHRlc3QgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgICMgcGlja2luZyBzdWNjZXNzaXZlIG51bWJlcnMuICBUaGlzIGRlcGVuZGVuY3kgaXMgbm90IGlkZWFsLCBidXQKKyAgICAjIG1ha2VzIHRoZSB0ZXN0IG11Y2ggZWFzaWVyIHRvIHdyaXRlLgorICAgIFt0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c19pbl9pdGVyYXRpb24yLCB0ZXN0c19pbl9pdGVyYXRpb24zXSA9ICgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKSwgUmVwZWF0RmxhZygzKV0pKQorCisgICAgIyBNYWtlIHN1cmUgcnVubmluZyB0aGUgdGVzdHMgd2l0aCByYW5kb20gc2VlZCAxIGdldHMgdGhlIHNhbWUKKyAgICAjIG9yZGVyIGFzIGluIGl0ZXJhdGlvbiAxIGFib3ZlLgorICAgIFt0ZXN0c193aXRoX3NlZWQxXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c193aXRoX3NlZWQxKQorCisgICAgIyBNYWtlIHN1cmUgcnVubmluZyB0aGUgdGVzdHMgd2l0aCByYW5kb20gc2VlZCAyIGdldHMgdGhlIHNhbWUKKyAgICAjIG9yZGVyIGFzIGluIGl0ZXJhdGlvbiAyIGFib3ZlLiAgU3VjY2VzcyBtZWFucyB0aGF0IEdvb2dsZSBUZXN0CisgICAgIyBjb3JyZWN0bHkgcmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgYmVmb3JlIHJlLXNodWZmbGluZyBhdCB0aGUKKyAgICAjIGJlZ2lubmluZyBvZiBpdGVyYXRpb24gMi4KKyAgICBbdGVzdHNfd2l0aF9zZWVkMl0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMildKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHNfaW5faXRlcmF0aW9uMiwgdGVzdHNfd2l0aF9zZWVkMikKKworICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMyBnZXRzIHRoZSBzYW1lCisgICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMyBhYm92ZS4gIFN1Y2Nlc3MgbWVhbnMgdGhhdCBHb29nbGUgVGVzdAorICAgICMgY29ycmVjdGx5IHJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIGJlZm9yZSByZS1zaHVmZmxpbmcgYXQgdGhlCisgICAgIyBiZWdpbm5pbmcgb2YgaXRlcmF0aW9uIDMuCisgICAgW3Rlc3RzX3dpdGhfc2VlZDNdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDMpXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RzX2luX2l0ZXJhdGlvbjMsIHRlc3RzX3dpdGhfc2VlZDMpCisKKyAgZGVmIHRlc3RTaHVmZmxlR2VuZXJhdGVzTmV3T3JkZXJJbkVhY2hJdGVyYXRpb24oc2VsZik6CisgICAgW3Rlc3RzX2luX2l0ZXJhdGlvbjEsIHRlc3RzX2luX2l0ZXJhdGlvbjIsIHRlc3RzX2luX2l0ZXJhdGlvbjNdID0gKAorICAgICAgICBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpLCBSZXBlYXRGbGFnKDMpXSkpCisKKyAgICBzZWxmLmFzc2VydF8odGVzdHNfaW5faXRlcmF0aW9uMSAhPSB0ZXN0c19pbl9pdGVyYXRpb24yLAorICAgICAgICAgICAgICAgICB0ZXN0c19pbl9pdGVyYXRpb24xKQorICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0c19pbl9pdGVyYXRpb24xICE9IHRlc3RzX2luX2l0ZXJhdGlvbjMsCisgICAgICAgICAgICAgICAgIHRlc3RzX2luX2l0ZXJhdGlvbjEpCisgICAgc2VsZi5hc3NlcnRfKHRlc3RzX2luX2l0ZXJhdGlvbjIgIT0gdGVzdHNfaW5faXRlcmF0aW9uMywKKyAgICAgICAgICAgICAgICAgdGVzdHNfaW5faXRlcmF0aW9uMikKKworICBkZWYgdGVzdFNodWZmbGVTaGFyZGVkVGVzdHNQcmVzZXJ2ZXNQYXJ0aXRpb24oc2VsZik6CisgICAgIyBJZiB3ZSBydW4gTSB0ZXN0cyBvbiBOIHNoYXJkcywgdGhlIHNhbWUgTSB0ZXN0cyBzaG91bGQgYmUgcnVuIGluCisgICAgIyB0b3RhbCwgcmVnYXJkbGVzcyBvZiB0aGUgcmFuZG9tIHNlZWRzIHVzZWQgYnkgdGhlIHNoYXJkcy4KKyAgICBbdGVzdHMxXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzAnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKQorICAgIFt0ZXN0czJdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygyMCldKQorICAgIFt0ZXN0czNdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMid9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygyNSldKQorICAgIHNvcnRlZF9zaGFyZGVkX3Rlc3RzID0gdGVzdHMxICsgdGVzdHMyICsgdGVzdHMzCisgICAgc29ydGVkX3NoYXJkZWRfdGVzdHMuc29ydCgpCisgICAgc29ydGVkX2FjdGl2ZV90ZXN0cyA9IFtdCisgICAgc29ydGVkX2FjdGl2ZV90ZXN0cy5leHRlbmQoQUNUSVZFX1RFU1RTKQorICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWRfYWN0aXZlX3Rlc3RzLCBzb3J0ZWRfc2hhcmRlZF90ZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdF8uY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTI3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTA0IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBWZXJpZmllcyB0aGF0IHRlc3Qgc2h1ZmZsaW5nIHdvcmtzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOworCisvLyBUaGUgdGVzdCBtZXRob2RzIGFyZSBlbXB0eSwgYXMgdGhlIHNvbGUgcHVycG9zZSBvZiB0aGlzIHByb2dyYW0gaXMKKy8vIHRvIHByaW50IHRoZSB0ZXN0IG5hbWVzIGJlZm9yZS9hZnRlciBzaHVmZmxpbmcuCisKK2NsYXNzIEEgOiBwdWJsaWMgVGVzdCB7fTsKK1RFU1RfRihBLCBBKSB7fQorVEVTVF9GKEEsIEIpIHt9CisKK1RFU1QoQURlYXRoVGVzdCwgQSkge30KK1RFU1QoQURlYXRoVGVzdCwgQikge30KK1RFU1QoQURlYXRoVGVzdCwgQykge30KKworVEVTVChCLCBBKSB7fQorVEVTVChCLCBCKSB7fQorVEVTVChCLCBDKSB7fQorVEVTVChCLCBESVNBQkxFRF9EKSB7fQorVEVTVChCLCBESVNBQkxFRF9FKSB7fQorCitURVNUKEJEZWF0aFRlc3QsIEEpIHt9CitURVNUKEJEZWF0aFRlc3QsIEIpIHt9CisKK1RFU1QoQywgQSkge30KK1RFU1QoQywgQikge30KK1RFU1QoQywgQykge30KK1RFU1QoQywgRElTQUJMRURfRCkge30KKworVEVTVChDRGVhdGhUZXN0LCBBKSB7fQorCitURVNUKERJU0FCTEVEX0QsIEEpIHt9CitURVNUKERJU0FCTEVEX0QsIERJU0FCTEVEX0IpIHt9CisKKy8vIFRoaXMgcHJpbnRlciBwcmludHMgdGhlIGZ1bGwgdGVzdCBuYW1lcyBvbmx5LCBzdGFydGluZyBlYWNoIHRlc3QKKy8vIGl0ZXJhdGlvbiB3aXRoIGEgIi0tLS0iIG1hcmtlci4KK2NsYXNzIFRlc3ROYW1lUHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGl0ZXJhdGlvbiAqLykgeworICAgIHByaW50ZigiLS0tLVxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIHByaW50ZigiJXMuJXNcbiIsIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLy8gUmVwbGFjZXMgdGhlIGRlZmF1bHQgcHJpbnRlciB3aXRoIFRlc3ROYW1lUHJpbnRlciwgd2hpY2ggcHJpbnRzCisgIC8vIHRoZSB0ZXN0IG5hbWUgb25seS4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7CisgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgVGVzdE5hbWVQcmludGVyKTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdC5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMDkxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBHb29nbGUgVGVzdCBieSBpbmNsdWRpbmcKKy8vIHRoZSBndGVzdC5oIGhlYWRlciBmaWxlIGFsb25lLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordm9pZCBTdWJyb3V0aW5lKCkgeworICBFWFBFQ1RfRVEoNDIsIDQyKTsKK30KKworVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKDspOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTVUNDRUVEKCkpOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWJyb3V0aW5lKCkpOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRSh7IFNVQ0NFRUQoKTsgfSk7Cit9CisKK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZSkgeworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSg7KTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3Vicm91dGluZSgpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoeyBTVUNDRUVEKCk7IH0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3ZDliZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjCkBAIC0wLDAgKzEsMjU3IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpIGFuZCB2YXJpb3VzIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgY2FuIGJlCisvLyB1c2VkIGluIGEgbGFyZ2UgbnVtYmVyIG9mIHRocmVhZHMgY29uY3VycmVudGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gV2UgbXVzdCBkZWZpbmUgdGhpcyBtYWNybyBpbiBvcmRlciB0byAjaW5jbHVkZQorLy8gZ3Rlc3QtaW50ZXJuYWwtaW5sLmguICBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBwcmV2ZW50cyBhIHVzZXIgZnJvbQorLy8gYWNjaWRlbnRhbGx5IGRlcGVuZGluZyBvbiBpdHMgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgeworCit1c2luZyBpbnRlcm5hbDo6Tm90aWZpY2F0aW9uOwordXNpbmcgaW50ZXJuYWw6OlN0cmluZzsKK3VzaW5nIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJczsKK3VzaW5nIGludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07Cit1c2luZyBpbnRlcm5hbDo6c2NvcGVkX3B0cjsKKworLy8gSW4gb3JkZXIgdG8gcnVuIHRlc3RzIGluIHRoaXMgZmlsZSwgZm9yIHBsYXRmb3JtcyB3aGVyZSBHb29nbGUgVGVzdCBpcworLy8gdGhyZWFkIHNhZmUsIGltcGxlbWVudCBUaHJlYWRXaXRoUGFyYW0uIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaXRzIEFQSQorLy8gaW4gZ3Rlc3QtcG9ydC5oLCB3aGVyZSBpdCBpcyBkZWZpbmVkIGZvciBhbHJlYWR5IHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisKKy8vIEhvdyBtYW55IHRocmVhZHMgdG8gY3JlYXRlPworY29uc3QgaW50IGtUaHJlYWRDb3VudCA9IDUwOworCitTdHJpbmcgSWRUb0tleShpbnQgaWQsIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICBNZXNzYWdlIGtleTsKKyAga2V5IDw8ICJrZXlfIiA8PCBpZCA8PCAiXyIgPDwgc3VmZml4OworICByZXR1cm4ga2V5LkdldFN0cmluZygpOworfQorCitTdHJpbmcgSWRUb1N0cmluZyhpbnQgaWQpIHsKKyAgTWVzc2FnZSBpZF9tZXNzYWdlOworICBpZF9tZXNzYWdlIDw8IGlkOworICByZXR1cm4gaWRfbWVzc2FnZS5HZXRTdHJpbmcoKTsKK30KKwordm9pZCBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHByb3BlcnRpZXMsCisgICAgaW50IGlkLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgVGVzdFByb3BlcnR5S2V5SXMgbWF0Y2hlc19rZXkoSWRUb0tleShpZCwgc3VmZml4KS5jX3N0cigpKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6Y29uc3RfaXRlcmF0b3IgcHJvcGVydHkgPQorICAgICAgc3RkOjpmaW5kX2lmKHByb3BlcnRpZXMuYmVnaW4oKSwgcHJvcGVydGllcy5lbmQoKSwgbWF0Y2hlc19rZXkpOworICBBU1NFUlRfVFJVRShwcm9wZXJ0eSAhPSBwcm9wZXJ0aWVzLmVuZCgpKQorICAgICAgPDwgImV4cGVjdGluZyAiIDw8IHN1ZmZpeCA8PCAiIHZhbHVlIGZvciBpZCAiIDw8IGlkOworICBFWFBFQ1RfU1RSRVEoSWRUb1N0cmluZyhpZCkuY19zdHIoKSwgcHJvcGVydHktPnZhbHVlKCkpOworfQorCisvLyBDYWxscyBhIGxhcmdlIG51bWJlciBvZiBHb29nbGUgVGVzdCBhc3NlcnRpb25zLCB3aGVyZSBleGFjdGx5IG9uZSBvZiB0aGVtCisvLyB3aWxsIGZhaWwuCit2b2lkIE1hbnlBc3NlcnRzKGludCBpZCkgeworICBHVEVTVF9MT0dfKElORk8pIDw8ICJUaHJlYWQgIyIgPDwgaWQgPDwgIiBydW5uaW5nLi4uIjsKKworICBTQ09QRURfVFJBQ0UoTWVzc2FnZSgpIDw8ICJUaHJlYWQgIyIgPDwgaWQpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyBpKyspIHsKKyAgICBTQ09QRURfVFJBQ0UoTWVzc2FnZSgpIDw8ICJJdGVyYXRpb24gIyIgPDwgaSk7CisKKyAgICAvLyBBIGJ1bmNoIG9mIGFzc2VydGlvbnMgdGhhdCBzaG91bGQgc3VjY2VlZC4KKyAgICBFWFBFQ1RfVFJVRSh0cnVlKTsKKyAgICBBU1NFUlRfRkFMU0UoZmFsc2UpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7CisgICAgRVhQRUNUX1NUUkVRKCJhIiwgImEiKTsKKyAgICBBU1NFUlRfTEUoNSwgNik7CisgICAgRVhQRUNUX0VRKGksIGkpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7CisKKyAgICAvLyBSZWNvcmRQcm9wZXJ0eSgpIHNob3VsZCBpbnRlcmFjdCBzYWZlbHkgd2l0aCBvdGhlciB0aHJlYWRzIGFzIHdlbGwuCisgICAgLy8gVGhlIHNoYXJlZF9rZXkgZm9yY2VzIHByb3BlcnR5IHVwZGF0ZXMuCisgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoSWRUb0tleShpZCwgInN0cmluZyIpLmNfc3RyKCksIElkVG9TdHJpbmcoaWQpLmNfc3RyKCkpOworICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KElkVG9LZXkoaWQsICJpbnQiKS5jX3N0cigpLCBpZCk7CisgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoInNoYXJlZF9rZXkiLCBJZFRvU3RyaW5nKGlkKS5jX3N0cigpKTsKKworICAgIC8vIFRoaXMgYXNzZXJ0aW9uIHNob3VsZCBmYWlsIGtUaHJlYWRDb3VudCB0aW1lcyBwZXIgdGhyZWFkLiAgSXQKKyAgICAvLyBpcyBmb3IgdGVzdGluZyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiBoYW5kbGUgZmFpbGVkIGFzc2VydGlvbnMgaW4gYQorICAgIC8vIG11bHRpLXRocmVhZGVkIGNvbnRleHQuCisgICAgRVhQRUNUX0xUKGksIDApIDw8ICJUaGlzIHNob3VsZCBhbHdheXMgZmFpbC4iOworICB9Cit9CisKK3ZvaWQgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KGludCBleHBlY3RlZF9mYWlsdXJlcykgeworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBUZXN0UmVzdWx0KiBjb25zdCByZXN1bHQgPSBpbmZvLT5yZXN1bHQoKTsKKyAgR1RFU1RfQ0hFQ0tfKGV4cGVjdGVkX2ZhaWx1cmVzID09IHJlc3VsdC0+dG90YWxfcGFydF9jb3VudCgpKQorICAgICAgPDwgIkxvZ2dlZCAiIDw8IHJlc3VsdC0+dG90YWxfcGFydF9jb3VudCgpIDw8ICIgZmFpbHVyZXMgIgorICAgICAgPDwgIiB2cy4gIiA8PCBleHBlY3RlZF9mYWlsdXJlcyA8PCAiIGV4cGVjdGVkIjsKK30KKworLy8gVGVzdHMgdXNpbmcgU0NPUEVEX1RSQUNFKCkgYW5kIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gbWFueSB0aHJlYWRzCisvLyBjb25jdXJyZW50bHkuCitURVNUKFN0cmVzc1Rlc3QsIENhblVzZVNjb3BlZFRyYWNlQW5kQXNzZXJ0aW9uc0luTWFueVRocmVhZHMpIHsKKyAgeworICAgIHNjb3BlZF9wdHI8VGhyZWFkV2l0aFBhcmFtPGludD4gPiB0aHJlYWRzW2tUaHJlYWRDb3VudF07CisgICAgTm90aWZpY2F0aW9uIHRocmVhZHNfY2FuX3N0YXJ0OworICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGtUaHJlYWRDb3VudDsgaSsrKQorICAgICAgdGhyZWFkc1tpXS5yZXNldChuZXcgVGhyZWFkV2l0aFBhcmFtPGludD4oJk1hbnlBc3NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRzX2Nhbl9zdGFydCkpOworCisgICAgdGhyZWFkc19jYW5fc3RhcnQuTm90aWZ5KCk7CisKKyAgICAvLyBCbG9ja3MgdW50aWwgYWxsIHRoZSB0aHJlYWRzIGFyZSBkb25lLgorICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGtUaHJlYWRDb3VudDsgaSsrKQorICAgICAgdGhyZWFkc1tpXS0+Sm9pbigpOworICB9CisKKyAgLy8gRW5zdXJlcyB0aGF0IGtUaHJlYWRDb3VudCprVGhyZWFkQ291bnQgZmFpbHVyZXMgaGF2ZSBiZWVuIHJlcG9ydGVkLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBUZXN0UmVzdWx0KiBjb25zdCByZXN1bHQgPSBpbmZvLT5yZXN1bHQoKTsKKworICBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+IHByb3BlcnRpZXM7CisgIC8vIFdlIGhhdmUgbm8gYWNjZXNzIHRvIHRoZSBUZXN0UmVzdWx0J3MgbGlzdCBvZiBwcm9wZXJ0aWVzIGJ1dCB3ZSBjYW4KKyAgLy8gY29weSB0aGVtIG9uZSBieSBvbmUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkKKyAgICBwcm9wZXJ0aWVzLnB1c2hfYmFjayhyZXN1bHQtPkdldFRlc3RQcm9wZXJ0eShpKSk7CisKKyAgRVhQRUNUX0VRKGtUaHJlYWRDb3VudCAqIDIgKyAxLCByZXN1bHQtPnRlc3RfcHJvcGVydHlfY291bnQoKSkKKyAgICAgIDw8ICJTdHJpbmcgYW5kIGludCB2YWx1ZXMgcmVjb3JkZWQgb24gZWFjaCB0aHJlYWQsICIKKyAgICAgIDw8ICJhcyB3ZWxsIGFzIG9uZSBzaGFyZWRfa2V5IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkgeworICAgIEV4cGVjdEtleUFuZFZhbHVlV2VyZVJlY29yZGVkRm9ySWQocHJvcGVydGllcywgaSwgInN0cmluZyIpOworICAgIEV4cGVjdEtleUFuZFZhbHVlV2VyZVJlY29yZGVkRm9ySWQocHJvcGVydGllcywgaSwgImludCIpOworICB9CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudChrVGhyZWFkQ291bnQqa1RocmVhZENvdW50KTsKK30KKwordm9pZCBGYWlsaW5nVGhyZWFkKGJvb2wgaXNfZmF0YWwpIHsKKyAgaWYgKGlzX2ZhdGFsKQorICAgIEZBSUwoKSA8PCAiRmF0YWwgZmFpbHVyZSBpbiBzb21lIG90aGVyIHRocmVhZC4gIgorICAgICAgICAgICA8PCAiKFRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4pIjsKKyAgZWxzZQorICAgIEFERF9GQUlMVVJFKCkgPDwgIk5vbi1mYXRhbCBmYWlsdXJlIGluIHNvbWUgb3RoZXIgdGhyZWFkLiAiCisgICAgICAgICAgICAgICAgICA8PCAiKFRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4pIjsKK30KKwordm9pZCBHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZChib29sIGlzX2ZhdGFsKSB7CisgIFRocmVhZFdpdGhQYXJhbTxib29sPiB0aHJlYWQoJkZhaWxpbmdUaHJlYWQsIGlzX2ZhdGFsLCBOVUxMKTsKKyAgdGhyZWFkLkpvaW4oKTsKK30KKworVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMpIHsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQodHJ1ZSkpOworICAvLyBXZSBzaG91bGQgb25seSBoYXZlIG9uZSBmYWlsdXJlICh0aGUgb25lIGZyb20KKyAgLy8gR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoKSksIHNpbmNlIHRoZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRQorICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDEpOworfQorCit2b2lkIEFzc2VydE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMoKSB7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpKTsKK30KK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIC8vIFVzaW5nIGEgc3Vicm91dGluZSwgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZSB0ZXN0IGNvbnRpbnVlcy4KKyAgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcygpOworICAvLyBXZSBzaG91bGQgb25seSBoYXZlIG9uZSBmYWlsdXJlICh0aGUgb25lIGZyb20KKyAgLy8gR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoKSksIHNpbmNlIHRoZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRQorICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDEpOworfQorCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBmYWlsLCBzaW5jZSB0aGUgY3VycmVudCB0aHJlYWQgZG9lc24ndCBnZW5lcmF0ZSBhCisgIC8vIGZhdGFsIGZhaWx1cmUsIG9ubHkgYW5vdGhlciBvbmUgZG9lcy4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQodHJ1ZSksICJleHBlY3RlZCIpOworICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoMik7Cit9CisKK1RFU1QoRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzVGVzdCwgRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBzdWNjZWVkLCBiZWNhdXNlIGZhaWx1cmVzIGluIGFsbCB0aHJlYWRzIGFyZQorICAvLyBjb25zaWRlcmVkLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUygKKyAgICAgIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDApOworICAvLyBXZSBuZWVkIHRvIGFkZCBhIGZhaWx1cmUsIGJlY2F1c2UgbWFpbigpIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBmYWlsdXJlcy4KKyAgLy8gQnV0IHdoZW4gb25seSB0aGlzIHRlc3QgaXMgcnVuLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgZmFpbHVyZXMuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgaXMgYW4gZXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKK30KKworVEVTVChOb25GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgeworICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgZmFpbCwgc2luY2UgdGhlIGN1cnJlbnQgdGhyZWFkIGRvZXNuJ3QgZ2VuZXJhdGUgYQorICAvLyBmYXRhbCBmYWlsdXJlLCBvbmx5IGFub3RoZXIgb25lIGRvZXMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIik7CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgyKTsKK30KKworVEVTVChOb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHNUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIHN1Y2NlZWQsIGJlY2F1c2UgZmFpbHVyZXMgaW4gYWxsIHRocmVhZHMgYXJlCisgIC8vIGNvbnNpZGVyZWQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKAorICAgICAgR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoZmFsc2UpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDApOworICAvLyBXZSBuZWVkIHRvIGFkZCBhIGZhaWx1cmUsIGJlY2F1c2UgbWFpbigpIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBmYWlsdXJlcywKKyAgLy8gQnV0IHdoZW4gb25seSB0aGlzIHRlc3QgaXMgcnVuLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgZmFpbHVyZXMuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgaXMgYW4gZXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGNvbnN0IGludCByZXN1bHQgPSBSVU5fQUxMX1RFU1RTKCk7ICAvLyBFeHBlY3RlZCB0byBmYWlsLgorICBHVEVTVF9DSEVDS18ocmVzdWx0ID09IDEpIDw8ICJSVU5fQUxMX1RFU1RTKCkgZGlkIG5vdCBmYWlsIGFzIGV4cGVjdGVkIjsKKworICBwcmludGYoIlxuUEFTU1xuIik7CisgIHJldHVybiAwOworfQorCisjZWxzZQorVEVTVChTdHJlc3NUZXN0LAorICAgICBESVNBQkxFRF9UaHJlYWRTYWZldHlUZXN0c0FyZVNraXBwZWRXaGVuR29vZ2xlVGVzdElzTm90VGhyZWFkU2FmZSkgeworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF90ZXN0X3V0aWxzLnB5IGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTg5N2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpAQCAtMCwwICsxLDMwNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IHV0aWxpdGllcyBmb3IgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yay4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IGF0ZXhpdAoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorX3Rlc3RfbW9kdWxlID0gdW5pdHRlc3QKKworIyBTdXBwcmVzc2VzIHRoZSAnSW1wb3J0IG5vdCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlJyBsaW50IGNvbXBsYWludC4KKyMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjIwNAordHJ5OgorICBpbXBvcnQgc3VicHJvY2VzcworICBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFID0gVHJ1ZQorZXhjZXB0OgorICBpbXBvcnQgcG9wZW4yCisgIF9TVUJQUk9DRVNTX01PRFVMRV9BVkFJTEFCTEUgPSBGYWxzZQorIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzYyMDQKKworR1RFU1RfT1VUUFVUX1ZBUl9OQU1FID0gJ0dURVNUX09VVFBVVCcKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworSVNfQ1lHV0lOID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnQ1lHV0lOJyBpbiBvcy51bmFtZSgpWzBdCisKKyMgSGVyZSB3ZSBleHBvc2UgYSBjbGFzcyBmcm9tIGEgcGFydGljdWxhciBtb2R1bGUsIGRlcGVuZGluZyBvbiB0aGUKKyMgZW52aXJvbm1lbnQuIFRoZSBjb21tZW50IHN1cHByZXNzZXMgdGhlICdJbnZhbGlkIHZhcmlhYmxlIG5hbWUnIGxpbnQKKyMgY29tcGxhaW50LgorVGVzdENhc2UgPSBfdGVzdF9tb2R1bGUuVGVzdENhc2UgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjQwOQorCisjIEluaXRpYWxseSBtYXBzIGEgZmxhZyB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gQWZ0ZXIKKyMgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKCkgaXMgY2FsbGVkLCBtYXBzIGEgZmxhZyB0byBpdHMgYWN0dWFsIHZhbHVlLgorX2ZsYWdfbWFwID0geydzb3VyY2VfZGlyJzogb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwKKyAgICAgICAgICAgICAnYnVpbGRfZGlyJzogb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKX0KK19ndGVzdF9mbGFnc19hcmVfcGFyc2VkID0gRmFsc2UKKworCitkZWYgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKGFyZ3YpOgorICAiIiJQYXJzZXMgYW5kIHN0cmlwcyBHb29nbGUgVGVzdCBmbGFncyBmcm9tIGFyZ3YuICBUaGlzIGlzIGlkZW1wb3RlbnQuIiIiCisKKyAgIyBTdXBwcmVzc2VzIHRoZSBsaW50IGNvbXBsYWludCBhYm91dCBhIGdsb2JhbCB2YXJpYWJsZSBzaW5jZSB3ZSBuZWVkIGl0CisgICMgaGVyZSB0byBtYWludGFpbiBtb2R1bGUtd2lkZSBzdGF0ZS4KKyAgZ2xvYmFsIF9ndGVzdF9mbGFnc19hcmVfcGFyc2VkICAjIHB5bGludDogZGlzYWJsZS1tc2c9VzA2MDMKKyAgaWYgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQ6CisgICAgcmV0dXJuCisKKyAgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQgPSBUcnVlCisgIGZvciBmbGFnIGluIF9mbGFnX21hcDoKKyAgICAjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgaWYgZmxhZy51cHBlcigpIGluIG9zLmVudmlyb246CisgICAgICBfZmxhZ19tYXBbZmxhZ10gPSBvcy5lbnZpcm9uW2ZsYWcudXBwZXIoKV0KKworICAgICMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaSA9IDEgICMgU2tpcHMgdGhlIHByb2dyYW0gbmFtZS4KKyAgICB3aGlsZSBpIDwgbGVuKGFyZ3YpOgorICAgICAgcHJlZml4ID0gJy0tJyArIGZsYWcgKyAnPScKKyAgICAgIGlmIGFyZ3ZbaV0uc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICBfZmxhZ19tYXBbZmxhZ10gPSBhcmd2W2ldW2xlbihwcmVmaXgpOl0KKyAgICAgICAgZGVsIGFyZ3ZbaV0KKyAgICAgICAgYnJlYWsKKyAgICAgIGVsc2U6CisgICAgICAgICMgV2UgZG9uJ3QgaW5jcmVtZW50IGkgaW4gY2FzZSB3ZSBqdXN0IGZvdW5kIGEgLS1ndGVzdF8qIGZsYWcKKyAgICAgICAgIyBhbmQgcmVtb3ZlZCBpdCBmcm9tIGFyZ3YuCisgICAgICAgIGkgKz0gMQorCisKK2RlZiBHZXRGbGFnKGZsYWcpOgorICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmxhZy4iIiIKKworICAjIEluIGNhc2UgR2V0RmxhZygpIGlzIGNhbGxlZCBiZWZvcmUgTWFpbigpLCB3ZSBhbHdheXMgY2FsbAorICAjIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGhlcmUgdG8gbWFrZSBzdXJlIHRoZSAtLWd0ZXN0XyogZmxhZ3MKKyAgIyBhcmUgcGFyc2VkLgorICBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3Moc3lzLmFyZ3YpCisKKyAgcmV0dXJuIF9mbGFnX21hcFtmbGFnXQorCisKK2RlZiBHZXRTb3VyY2VEaXIoKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSAucHkgZmlsZXMgYXJlLiIiIgorCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoR2V0RmxhZygnc291cmNlX2RpcicpKQorCisKK2RlZiBHZXRCdWlsZERpcigpOgorICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3QgYmluYXJpZXMgYXJlLiIiIgorCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoR2V0RmxhZygnYnVpbGRfZGlyJykpCisKKworX3RlbXBfZGlyID0gTm9uZQorCitkZWYgX1JlbW92ZVRlbXBEaXIoKToKKyAgaWYgX3RlbXBfZGlyOgorICAgIHNodXRpbC5ybXRyZWUoX3RlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKK2F0ZXhpdC5yZWdpc3RlcihfUmVtb3ZlVGVtcERpcikKKworCitkZWYgR2V0VGVtcERpcigpOgorICAiIiJSZXR1cm5zIGEgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgZmlsZXMuIiIiCisKKyAgZ2xvYmFsIF90ZW1wX2RpcgorICBpZiBub3QgX3RlbXBfZGlyOgorICAgIF90ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICByZXR1cm4gX3RlbXBfZGlyCisKKworZGVmIEdldFRlc3RFeGVjdXRhYmxlUGF0aChleGVjdXRhYmxlX25hbWUsIGJ1aWxkX2Rpcj1Ob25lKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBiaW5hcnkgZ2l2ZW4gaXRzIG5hbWUuCisKKyAgVGhlIGZ1bmN0aW9uIHdpbGwgcHJpbnQgYSBtZXNzYWdlIGFuZCBhYm9ydCB0aGUgcHJvZ3JhbSBpZiB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgZG9lc24ndCBleGlzdC4KKworICBBcmdzOgorICAgIGV4ZWN1dGFibGVfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBiaW5hcnkgdGhhdCB0aGUgdGVzdCBzY3JpcHQgcnVucy4KKyAgICBidWlsZF9kaXI6ICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBsb29rIGZvciBleGVjdXRhYmxlcywgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiBHZXRCdWlsZERpcigpLgorCisgIFJldHVybnM6CisgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRlc3QgYmluYXJ5LgorICAiIiIKKworICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihidWlsZF9kaXIgb3IgR2V0QnVpbGREaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9uYW1lKSkKKyAgaWYgKElTX1dJTkRPV1Mgb3IgSVNfQ1lHV0lOKSBhbmQgbm90IHBhdGguZW5kc3dpdGgoJy5leGUnKToKKyAgICBwYXRoICs9ICcuZXhlJworCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICBtZXNzYWdlID0gKAorICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdGhlIHRlc3QgYmluYXJ5LiBQbGVhc2UgbWFrZSBzdXJlIHRvIHByb3ZpZGUgcGF0aFxuJworICAgICAgICAndG8gdGhlIGJpbmFyeSB2aWEgdGhlIC0tYnVpbGRfZGlyIGZsYWcgb3IgdGhlIEJVSUxEX0RJUlxuJworICAgICAgICAnZW52aXJvbm1lbnQgdmFyaWFibGUuJykKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtZXNzYWdlCisgICAgc3lzLmV4aXQoMSkKKworICByZXR1cm4gcGF0aAorCisKK2RlZiBHZXRFeGl0U3RhdHVzKGV4aXRfY29kZSk6CisgICIiIlJldHVybnMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSwgb3IgLTEgaWYgZXhpdCgpIHdhc24ndCBjYWxsZWQuCisKKyAgQXJnczoKKyAgICBleGl0X2NvZGU6IHRoZSByZXN1bHQgdmFsdWUgb2Ygb3Muc3lzdGVtKGNvbW1hbmQpLgorICAiIiIKKworICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgIyBPbiBXaW5kb3dzLCBvcy5XRVhJVFNUQVRVUygpIGRvZXNuJ3Qgd29yayBhbmQgb3Muc3lzdGVtKCkgcmV0dXJucworICAgICMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSBkaXJlY3RseS4KKyAgICByZXR1cm4gZXhpdF9jb2RlCisgIGVsc2U6CisgICAgIyBPbiBVbml4LCBvcy5XRVhJVFNUQVRVUygpIG11c3QgYmUgdXNlZCB0byBleHRyYWN0IHRoZSBleGl0IHN0YXR1cworICAgICMgZnJvbSB0aGUgcmVzdWx0IG9mIG9zLnN5c3RlbSgpLgorICAgIGlmIG9zLldJRkVYSVRFRChleGl0X2NvZGUpOgorICAgICAgcmV0dXJuIG9zLldFWElUU1RBVFVTKGV4aXRfY29kZSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIC0xCisKKworY2xhc3MgU3VicHJvY2VzczoKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIHdvcmtpbmdfZGlyPU5vbmUsIGNhcHR1cmVfc3RkZXJyPVRydWUsIGVudj1Ob25lKToKKyAgICAiIiJDaGFuZ2VzIGludG8gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBpZiBwcm92aWRlZCwgYW5kIGV4ZWN1dGVzIGEgY29tbWFuZC4KKworICAgIFJlc3RvcmVzIHRoZSBvbGQgZGlyZWN0b3J5IGFmdGVyd2FyZHMuCisKKyAgICBBcmdzOgorICAgICAgY29tbWFuZDogICAgICAgIFRoZSBjb21tYW5kIHRvIHJ1biwgaW4gdGhlIGZvcm0gb2Ygc3lzLmFyZ3YuCisgICAgICB3b3JraW5nX2RpcjogICAgVGhlIGRpcmVjdG9yeSB0byBjaGFuZ2UgaW50by4KKyAgICAgIGNhcHR1cmVfc3RkZXJyOiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY2FwdHVyZSBzdGRlcnIgaW4gdGhlIG91dHB1dCBtZW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICBvciB0byBkaXNjYXJkIGl0LgorICAgICAgZW52OiAgICAgICAgICAgIERpY3Rpb25hcnkgd2l0aCBlbnZpcm9ubWVudCB0byBwYXNzIHRvIHRoZSBzdWJwcm9jZXNzLgorCisgICAgUmV0dXJuczoKKyAgICAgIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgb3V0Y29tZSBvZiB0aGUgZXhlY3V0ZWQgcHJvY2Vzcy4gSXQgaGFzIHRoZQorICAgICAgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgIHRlcm1pbmF0ZWRfYnlfc2lnbmFsICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGEgc2lnbmFsLgorICAgICAgICBzaWduYWwgICAgICAgICAgICAgICAgIFN5Z25hbCB0aGF0IHRlcm1pbmF0ZWQgdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgIGV4aXRlZCAgICAgICAgICAgICAgICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkIG5vcm1hbGx5LgorICAgICAgICBleGl0X2NvZGUgICAgICAgICAgICAgIFRoZSBjb2RlIHdpdGggd2hpY2ggdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkLgorICAgICAgICBvdXRwdXQgICAgICAgICAgICAgICAgIENoaWxkIHByb2Nlc3MncyBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCBpbiBhIHN0cmluZy4KKyAgICAiIiIKKworICAgICMgVGhlIHN1YnByb2Nlc3MgbW9kdWxlIGlzIHRoZSBwcmVmZXJyYWJsZSB3YXkgb2YgcnVubmluZyBwcm9ncmFtcworICAgICMgc2luY2UgaXQgaXMgYXZhaWxhYmxlIGFuZCBiZWhhdmVzIGNvbnNpc3RlbnRseSBvbiBhbGwgcGxhdGZvcm1zLAorICAgICMgaW5jbHVkaW5nIFdpbmRvd3MuIEJ1dCBpdCBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyBpbiBweXRob24gMi40LgorICAgICMgSW4gZWFybGllciBweXRob24gdmVyc2lvbnMsIHdlIHJldmVydCB0byB0aGUgcG9wZW4yIG1vZHVsZSwgd2hpY2ggaXMKKyAgICAjIGF2YWlsYWJsZSBpbiBweXRob24gMi4wIGFuZCBsYXRlciBidXQgZG9lc24ndCBwcm92aWRlIHJlcXVpcmVkCisgICAgIyBmdW5jdGlvbmFsaXR5IChQb3BlbjQpIHVuZGVyIFdpbmRvd3MuIFRoaXMgYWxsb3dzIHVzIHRvIHN1cHBvcnQgTWFjCisgICAgIyBPUyBYIDEwLjQgVGlnZXIsIHdoaWNoIGhhcyBweXRob24gMi4zIGluc3RhbGxlZC4KKyAgICBpZiBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFOgorICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6CisgICAgICAgIHN0ZGVyciA9IHN1YnByb2Nlc3MuU1RET1VUCisgICAgICBlbHNlOgorICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlBJUEUKKworICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9d29ya2luZ19kaXIsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLCBlbnY9ZW52KQorICAgICAgIyBjb21tdW5pY2F0ZSByZXR1cm5zIGEgdHVwbGUgd2l0aCB0aGUgZmlsZSBvYmVjdCBmb3IgdGhlIGNoaWxkJ3MKKyAgICAgICMgb3V0cHV0LgorICAgICAgc2VsZi5vdXRwdXQgPSBwLmNvbW11bmljYXRlKClbMF0KKyAgICAgIHNlbGYuX3JldHVybl9jb2RlID0gcC5yZXR1cm5jb2RlCisgICAgZWxzZToKKyAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorCisgICAgICBkZWYgX1JlcGxhY2VFbnZEaWN0KGRlc3QsIHNyYyk6CisgICAgICAgICMgQ2hhbmdlcyBtYWRlIGJ5IG9zLmVudmlyb24uY2xlYXIgYXJlIG5vdCBpbmhlcml0YWJsZSBieSBjaGlsZAorICAgICAgICAjIHByb2Nlc3NlcyB1bnRpbCBQeXRob24gMi42LiBUbyBwcm9kdWNlIGluaGVyaXRhYmxlIGNoYW5nZXMgd2UgaGF2ZQorICAgICAgICAjIHRvIGRlbGV0ZSBlbnZpcm9ubWVudCBpdGVtcyB3aXRoIHRoZSBkZWwgc3RhdGVtZW50LgorICAgICAgICBmb3Iga2V5IGluIGRlc3Q6CisgICAgICAgICAgZGVsIGRlc3Rba2V5XQorICAgICAgICBkZXN0LnVwZGF0ZShzcmMpCisKKyAgICAgICMgV2hlbiAnZW52JyBpcyBub3QgTm9uZSwgYmFja3VwIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHJlcGxhY2UKKyAgICAgICMgdGhlbSB3aXRoIHRoZSBwYXNzZWQgJ2VudicuIFdoZW4gJ2VudicgaXMgTm9uZSwgd2Ugc2ltcGx5IHVzZSB0aGUKKyAgICAgICMgY3VycmVudCAnb3MuZW52aXJvbicgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3VicHJvY2Vzcy5Qb3BlbgorICAgICAgIyBzZW1hbnRpY3MgdXNlZCBhYm92ZS4KKyAgICAgIGlmIGVudiBpcyBub3QgTm9uZToKKyAgICAgICAgb2xkX2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBfUmVwbGFjZUVudkRpY3Qob3MuZW52aXJvbiwgZW52KQorCisgICAgICB0cnk6CisgICAgICAgIGlmIHdvcmtpbmdfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgIG9zLmNoZGlyKHdvcmtpbmdfZGlyKQorICAgICAgICBpZiBjYXB0dXJlX3N0ZGVycjoKKyAgICAgICAgICBwID0gcG9wZW4yLlBvcGVuNChjb21tYW5kKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHAgPSBwb3BlbjIuUG9wZW4zKGNvbW1hbmQpCisgICAgICAgIHAudG9jaGlsZC5jbG9zZSgpCisgICAgICAgIHNlbGYub3V0cHV0ID0gcC5mcm9tY2hpbGQucmVhZCgpCisgICAgICAgIHJldF9jb2RlID0gcC53YWl0KCkKKyAgICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBvbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICMgaWYgdGhleSB3ZXJlIHJlcGxhY2VkLgorICAgICAgICBpZiBlbnYgaXMgbm90IE5vbmU6CisgICAgICAgICAgX1JlcGxhY2VFbnZEaWN0KG9zLmVudmlyb24sIG9sZF9lbnZpcm9uKQorCisgICAgICAjIENvbnZlcnRzIHJldF9jb2RlIHRvIG1hdGNoIHRoZSBzZW1hbnRpY3Mgb2YKKyAgICAgICMgc3VicHJvY2Vzcy5Qb3Blbi5yZXR1cm5jb2RlLgorICAgICAgaWYgb3MuV0lGU0lHTkFMRUQocmV0X2NvZGUpOgorICAgICAgICBzZWxmLl9yZXR1cm5fY29kZSA9IC1vcy5XVEVSTVNJRyhyZXRfY29kZSkKKyAgICAgIGVsc2U6ICAjIG9zLldJRkVYSVRFRChyZXRfY29kZSkgc2hvdWxkIHJldHVybiBUcnVlIGhlcmUuCisgICAgICAgIHNlbGYuX3JldHVybl9jb2RlID0gb3MuV0VYSVRTVEFUVVMocmV0X2NvZGUpCisKKyAgICBpZiBzZWxmLl9yZXR1cm5fY29kZSA8IDA6CisgICAgICBzZWxmLnRlcm1pbmF0ZWRfYnlfc2lnbmFsID0gVHJ1ZQorICAgICAgc2VsZi5leGl0ZWQgPSBGYWxzZQorICAgICAgc2VsZi5zaWduYWwgPSAtc2VsZi5fcmV0dXJuX2NvZGUKKyAgICBlbHNlOgorICAgICAgc2VsZi50ZXJtaW5hdGVkX2J5X3NpZ25hbCA9IEZhbHNlCisgICAgICBzZWxmLmV4aXRlZCA9IFRydWUKKyAgICAgIHNlbGYuZXhpdF9jb2RlID0gc2VsZi5fcmV0dXJuX2NvZGUKKworCitkZWYgTWFpbigpOgorICAiIiJSdW5zIHRoZSB1bml0IHRlc3QuIiIiCisKKyAgIyBXZSBtdXN0IGNhbGwgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKCkgYmVmb3JlIGNhbGxpbmcKKyAgIyB1bml0dGVzdC5tYWluKCkuICBPdGhlcndpc2UgdGhlIGxhdHRlciB3aWxsIGJlIGNvbmZ1c2VkIGJ5IHRoZQorICAjIC0tZ3Rlc3RfKiBmbGFncy4KKyAgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKHN5cy5hcmd2KQorICAjIFRoZSB0ZXN0ZWQgYmluYXJpZXMgc2hvdWxkIG5vdCBiZSB3cml0aW5nIFhNTCBvdXRwdXQgZmlsZXMgdW5sZXNzIHRoZQorICAjIHNjcmlwdCBleHBsaWNpdGx5IGluc3RydWN0cyB0aGVtIHRvLgorICAjIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1vdmUgdGhpcyBpbnRvIFN1YnByb2Nlc3Mgd2hlbiB3ZSBpbXBsZW1lbnQKKyAgIyBwYXNzaW5nIGVudmlyb25tZW50IGludG8gaXQgYXMgYSBwYXJhbWV0ZXIuCisgIGlmIEdURVNUX09VVFBVVF9WQVJfTkFNRSBpbiBvcy5lbnZpcm9uOgorICAgIGRlbCBvcy5lbnZpcm9uW0dURVNUX09VVFBVVF9WQVJfTkFNRV0KKworICBfdGVzdF9tb2R1bGUubWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NmM3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYwpAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyBHb29nbGUgVGVzdCdzIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZW5hYmxlZC4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UgYW5kIGV4aXRzIHRoZSBwcm9ncmFtIHdpdGgKKy8vIG5vbi16ZXJvLiAgV2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBhIEdvb2dsZSBUZXN0IGFzc2VydGlvbiB0bworLy8gaW5kaWNhdGUgYSBmYWlsdXJlLCBhcyB0aGUgbGF0dGVyIGlzIGJlZW4gdGVzdGVkIGFuZCBjYW5ub3QgYmUKKy8vIHJlbGllZCBvbi4KK3ZvaWQgRmFpbChjb25zdCBjaGFyKiBtc2cpIHsKKyAgcHJpbnRmKCJGQUlMVVJFOiAlc1xuIiwgbXNnKTsKKyAgZmZsdXNoKHN0ZG91dCk7CisgIGV4aXQoMSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgdGhyb3dzIGEgc3ViY2xhc3Mgb2YKKy8vIHN0ZDo6cnVudGltZV9lcnJvci4KK3ZvaWQgVGVzdEZhaWx1cmVUaHJvd3NSdW50aW1lRXJyb3IoKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0cnVlOworCisgIC8vIEEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gc2hvdWxkbid0IHRocm93LgorICB0cnkgeworICAgIEVYUEVDVF9FUSgzLCAzKTsKKyAgfSBjYXRjaCguLi4pIHsKKyAgICBGYWlsKCJBIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHdyb25nZnVsbHkgdGhyZXcuIik7CisgIH0KKworICAvLyBBIGZhaWxlZCBhc3NlcnRpb24gc2hvdWxkIHRocm93IGEgc3ViY2xhc3Mgb2Ygc3RkOjpydW50aW1lX2Vycm9yLgorICB0cnkgeworICAgIEVYUEVDVF9FUSgyLCAzKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7CisgIH0gY2F0Y2goY29uc3Qgc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CisgICAgaWYgKHN0cnN0cihlLndoYXQoKSwgIkV4cGVjdGVkIGZhaWx1cmUiKSAhPSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJBIGZhaWxlZCBhc3NlcnRpb24gZGlkIHRocm93IGFuIGV4Y2VwdGlvbiBvZiB0aGUgcmlnaHQgdHlwZSwgIgorICAgICAgICAgICAiYnV0IHRoZSBtZXNzYWdlIGlzIGluY29ycmVjdC4gIEluc3RlYWQgb2YgY29udGFpbmluZyBcIkV4cGVjdGVkICIKKyAgICAgICAgICAgImZhaWx1cmVcIiwgaXQgaXM6XG4iKTsKKyAgICBGYWlsKGUud2hhdCgpKTsKKyAgfSBjYXRjaCguLi4pIHsKKyAgICBGYWlsKCJBIGZhaWxlZCBhc3NlcnRpb24gdGhyZXcgdGhlIHdyb25nIHR5cGUgb2YgZXhjZXB0aW9uLiIpOworICB9CisgIEZhaWwoIkEgZmFpbGVkIGFzc2VydGlvbiBzaG91bGQndmUgdGhyb3duIGJ1dCBkaWRuJ3QuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBwZW9wbGUgY2FuIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluCisgIC8vIG90aGVyIHRlc3RpbmcgZnJhbWV3b3JrcywgYXMgbG9uZyBhcyB0aGV5IGluaXRpYWxpemUgR29vZ2xlIFRlc3QKKyAgLy8gcHJvcGVybHkgYW5kIHNldCB0aGUgdGhyb3duLW9uLWZhaWx1cmUgbW9kZS4gIFRoZXJlZm9yZSwgd2UgZG9uJ3QKKyAgLy8gdXNlIEdvb2dsZSBUZXN0J3MgY29uc3RydWN0cyBmb3IgZGVmaW5pbmcgYW5kIHJ1bm5pbmcgdGVzdHMKKyAgLy8gKGUuZy4gVEVTVCBhbmQgUlVOX0FMTF9URVNUUykgaGVyZS4KKworICBUZXN0RmFpbHVyZVRocm93c1J1bnRpbWVFcnJvcigpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weSBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Njc4ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5CkBAIC0wLDAgKzEsMTcxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyBHb29nbGUgVGVzdCdzIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisKK1RoaXMgc2NyaXB0IGludm9rZXMgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XyAoYSBwcm9ncmFtIHdyaXR0ZW4gd2l0aAorR29vZ2xlIFRlc3QpIHdpdGggZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCisjIENvbnN0YW50cy4KKworIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlLgorVEhST1dfT05fRkFJTFVSRSA9ICdndGVzdF90aHJvd19vbl9mYWlsdXJlJworCisjIFBhdGggdG8gdGhlIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gcHJvZ3JhbSwgY29tcGlsZWQgd2l0aAorIyBleGNlcHRpb25zIGRpc2FibGVkLgorRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAnZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XycpCisKKworIyBVdGlsaXRpZXMuCisKKworZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6CisgICIiIlNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSBnaXZlbiB2YWx1ZTsgdW5zZXRzIGl0IHdoZW4gdGhlCisgIGdpdmVuIHZhbHVlIGlzIE5vbmUuCisgICIiIgorCisgIGVudl92YXIgPSBlbnZfdmFyLnVwcGVyKCkKKyAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgb3MuZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCisgIGVsaWYgZW52X3ZhciBpbiBvcy5lbnZpcm9uOgorICAgIGRlbCBvcy5lbnZpcm9uW2Vudl92YXJdCisKKworZGVmIFJ1bihjb21tYW5kKToKKyAgIiIiUnVucyBhIGNvbW1hbmQ7IHJldHVybnMgVHJ1ZS9GYWxzZSBpZiBpdHMgZXhpdCBjb2RlIGlzL2lzbid0IDAuIiIiCisKKyAgcHJpbnQgJ1J1bm5pbmcgIiVzIi4gLiAuJyAlICcgJy5qb2luKGNvbW1hbmQpCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKKyAgcmV0dXJuIHAuZXhpdGVkIGFuZCBwLmV4aXRfY29kZSA9PSAwCisKKworIyBUaGUgdGVzdHMuICBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVmYWN0b3IgdGhlIGNsYXNzIHRvIHNoYXJlIGNvbW1vbgorIyBsb2dpYyB3aXRoIGNvZGUgaW4gZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weS4KK2NsYXNzIFRocm93T25GYWlsdXJlVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZS4iIiIKKworICBkZWYgUnVuQW5kVmVyaWZ5KHNlbGYsIGVudl92YXJfdmFsdWUsIGZsYWdfdmFsdWUsIHNob3VsZF9mYWlsKToKKyAgICAiIiJSdW5zIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gYW5kIHZlcmlmaWVzIHRoYXQgaXQgZG9lcworICAgIChvciBkb2VzIG5vdCkgZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KKworICAgIEFyZ3M6CisgICAgICBlbnZfdmFyX3ZhbHVlOiAgICB2YWx1ZSBvZiB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU7IE5vbmUgaWYgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSB1bnNldC4KKyAgICAgIGZsYWdfdmFsdWU6ICAgICAgIHZhbHVlIG9mIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgorICAgICAgc2hvdWxkX2ZhaWw6ICAgICAgVHJ1ZSBpZmYgdGhlIHByb2dyYW0gaXMgZXhwZWN0ZWQgdG8gZmFpbC4KKyAgICAiIiIKKworICAgIFNldEVudlZhcihUSFJPV19PTl9GQUlMVVJFLCBlbnZfdmFyX3ZhbHVlKQorCisgICAgaWYgZW52X3Zhcl92YWx1ZSBpcyBOb25lOgorICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnIGlzIG5vdCBzZXQnCisgICAgZWxzZToKKyAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJz0nICsgZW52X3Zhcl92YWx1ZQorCisgICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgorICAgICAgZmxhZyA9ICcnCisgICAgZWxpZiBmbGFnX3ZhbHVlID09ICcwJzoKKyAgICAgIGZsYWcgPSAnLS0lcz0wJyAlIFRIUk9XX09OX0ZBSUxVUkUKKyAgICBlbHNlOgorICAgICAgZmxhZyA9ICctLSVzJyAlIFRIUk9XX09OX0ZBSUxVUkUKKworICAgIGNvbW1hbmQgPSBbRVhFX1BBVEhdCisgICAgaWYgZmxhZzoKKyAgICAgIGNvbW1hbmQuYXBwZW5kKGZsYWcpCisKKyAgICBpZiBzaG91bGRfZmFpbDoKKyAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkJworICAgIGVsc2U6CisgICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCBub3QnCisKKyAgICBmYWlsZWQgPSBub3QgUnVuKGNvbW1hbmQpCisKKyAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRSwgTm9uZSkKKworICAgIG1zZyA9ICgnd2hlbiAlcyVzLCBhbiBhc3NlcnRpb24gZmFpbHVyZSBpbiAiJXMiICVzIGNhdXNlIGEgbm9uLXplcm8gJworICAgICAgICAgICAnZXhpdCBjb2RlLicgJQorICAgICAgICAgICAoVEhST1dfT05fRkFJTFVSRSwgZW52X3Zhcl92YWx1ZV9tc2csICcgJy5qb2luKGNvbW1hbmQpLAorICAgICAgICAgICAgc2hvdWxkX29yX25vdCkpCisgICAgc2VsZi5hc3NlcnRfKGZhaWxlZCA9PSBzaG91bGRfZmFpbCwgbXNnKQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBtb2RlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLCBmbGFnX3ZhbHVlPU5vbmUsIHNob3VsZF9mYWlsPUZhbHNlKQorCisgIGRlZiB0ZXN0VGhyb3dPbkZhaWx1cmVFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgdGhlIEdURVNUX1RIUk9XX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPVRydWUpCisKKyAgZGVmIHRlc3RUaHJvd09uRmFpbHVyZUZsYWcoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQorCisgIGRlZiB0ZXN0VGhyb3dPbkZhaWx1cmVGbGFnT3ZlcnJpZGVzRW52VmFyKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlIG92ZXJyaWRlcyBHVEVTVF9USFJPV19PTl9GQUlMVVJFLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1GYWxzZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc3NmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0Xy5jYwpAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyBHb29nbGUgVGVzdCdzIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisvLworLy8gVGhpcyBwcm9ncmFtIG11c3QgYmUgY29tcGlsZWQgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLiAgSXQgd2lsbCBiZQorLy8gaW52b2tlZCBieSBndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3QucHksIGFuZCBpcyBleHBlY3RlZCB0byBleGl0CisvLyB3aXRoIG5vbi16ZXJvIGluIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgb3IgMCBvdGhlcndpc2UuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcGVvcGxlIGNhbiB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbgorICAvLyBvdGhlciB0ZXN0aW5nIGZyYW1ld29ya3MsIGFzIGxvbmcgYXMgdGhleSBpbml0aWFsaXplIEdvb2dsZSBUZXN0CisgIC8vIHByb3Blcmx5IGFuZCBzZXQgdGhlIHRocm93bi1vbi1mYWlsdXJlIG1vZGUuICBUaGVyZWZvcmUsIHdlIGRvbid0CisgIC8vIHVzZSBHb29nbGUgVGVzdCdzIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIGFuZCBydW5uaW5nIHRlc3RzCisgIC8vIChlLmcuIFRFU1QgYW5kIFJVTl9BTExfVEVTVFMpIGhlcmUuCisKKyAgLy8gSW4gdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQsIHRoaXMKKyAgLy8gYXNzZXJ0aW9uIHdpbGwgY2F1c2UgdGhlIHByb2dyYW0gdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KKyAgRVhQRUNUX0VRKDIsIDMpOworCisgIC8vIFdoZW4gbm90IGluIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUsIHRoZSBjb250cm9sIHdpbGwgcmVhY2gKKyAgLy8gaGVyZS4KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmFlNTdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IHdhcm5zIHRoZSB1c2VyIHdoZW4gbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0XycpCisKKworZGVmIEFzc2VydChjb25kaXRpb24pOgorICBpZiBub3QgY29uZGl0aW9uOgorICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisKKworZGVmIEFzc2VydEVxKGV4cGVjdGVkLCBhY3R1YWwpOgorICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6CisgICAgcHJpbnQgJ0V4cGVjdGVkOiAlcycgJSAoZXhwZWN0ZWQsKQorICAgIHByaW50ICcgIEFjdHVhbDogJXMnICUgKGFjdHVhbCwpCisgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworCitkZWYgVGVzdEV4aXRDb2RlQW5kT3V0cHV0KGNvbW1hbmQpOgorICAiIiJSdW5zIHRoZSBnaXZlbiBjb21tYW5kIGFuZCB2ZXJpZmllcyBpdHMgZXhpdCBjb2RlIGFuZCBvdXRwdXQuIiIiCisKKyAgIyBWZXJpZmllcyB0aGF0ICdjb21tYW5kJyBleGl0cyB3aXRoIGNvZGUgMS4KKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICBBc3NlcnQocC5leGl0ZWQpCisgIEFzc2VydEVxKDEsIHAuZXhpdF9jb2RlKQorICBBc3NlcnQoJ0luaXRHb29nbGVUZXN0JyBpbiBwLm91dHB1dCkKKworCitjbGFzcyBHVGVzdFVuaW5pdGlhbGl6ZWRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdEV4aXRDb2RlQW5kT3V0cHV0KHNlbGYpOgorICAgIFRlc3RFeGl0Q29kZUFuZE91dHB1dChDT01NQU5EKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3RfLmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDMxNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYwpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworVEVTVChEdW1teVRlc3QsIER1bW15KSB7CisgIC8vIFRoaXMgdGVzdCBkb2Vzbid0IHZlcmlmeSBhbnl0aGluZy4gIFdlIGp1c3QgbmVlZCBpdCB0byBjcmVhdGUgYQorICAvLyByZWFsaXN0aWMgc3RhZ2UgZm9yIHRlc3RpbmcgdGhlIGJlaGF2aW9yIG9mIEdvb2dsZSBUZXN0IHdoZW4KKyAgLy8gUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCB3aXRob3V0IHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkgYmVpbmcKKyAgLy8gY2FsbGVkIGZpcnN0LgorfQorCitpbnQgbWFpbigpIHsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNjg2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNzMzNyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYyBjb25zdHJ1Y3RzIG9mCisvLyBHb29nbGUgVGVzdCB3b3JrLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29tbWFuZCBsaW5lIGZsYWcgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZAorLy8gaW4gY29kZSBvbmNlIDxndGVzdC9ndGVzdC5oPiBoYXMgYmVlbiAjaW5jbHVkZWQuCisvLyBEbyBub3QgbW92ZSBpdCBhZnRlciBvdGhlciAjaW5jbHVkZXMuCitURVNUKENvbW1hbmRMaW5lRmxhZ3NUZXN0LCBDYW5CZUFjY2Vzc2VkSW5Db2RlT25jZUdUZXN0SElzSW5jbHVkZWQpIHsKKyAgYm9vbCBkdW1teSA9IHRlc3Rpbmc6OkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNvbG9yKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcobGlzdF90ZXN0cykKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCkgPiAwCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPiAwCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pICE9ICJ1bmtub3duIgorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgRVhQRUNUX1RSVUUoZHVtbXkgfHwgIWR1bW15KTsgIC8vIFN1cHByZXNzZXMgd2FybmluZyB0aGF0IGR1bW15IGlzIHVudXNlZC4KK30KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gRm9yIElOVF9NQVguCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm92aWRlcyBhY2Nlc3MgdG8gb3RoZXJ3aXNlIHByaXZhdGUgcGFydHMgb2YgdGhlIFRlc3RFdmVudExpc3RlbmVycyBjbGFzcworLy8gdGhhdCBhcmUgbmVlZGVkIHRvIHRlc3QgaXQuCitjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvciB7CisgcHVibGljOgorICBzdGF0aWMgVGVzdEV2ZW50TGlzdGVuZXIqIEdldFJlcGVhdGVyKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy0+cmVwZWF0ZXIoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgICBsaXN0ZW5lcnMtPlNldERlZmF1bHRSZXN1bHRQcmludGVyKGxpc3RlbmVyKTsKKyAgfQorICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICAgIGxpc3RlbmVycy0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihsaXN0ZW5lcik7CisgIH0KKworICBzdGF0aWMgYm9vbCBFdmVudEZvcndhcmRpbmdFbmFibGVkKGNvbnN0IFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy5FdmVudEZvcndhcmRpbmdFbmFibGVkKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZyhUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycykgeworICAgIGxpc3RlbmVycy0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0OwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzczsKK3VzaW5nIHRlc3Rpbmc6OkRvdWJsZUxFOwordXNpbmcgdGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIHRlc3Rpbmc6OkZsb2F0TEU7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhjb2xvcik7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhmaWx0ZXIpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7Cit1c2luZyB0ZXN0aW5nOjpJc05vdFN1YnN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OklzU3Vic3RyaW5nOwordXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwordXNpbmcgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwordXNpbmcgdGVzdGluZzo6VGVzdDsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgdGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5OwordXNpbmcgdGVzdGluZzo6VGVzdFByb3BlcnR5OwordXNpbmcgdGVzdGluZzo6VGVzdFJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgdGVzdGluZzo6a01heFN0YWNrVHJhY2VEZXB0aDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBZGRSZWZlcmVuY2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBcHBlbmRVc2VyTWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBcnJheUF3YXJlRmluZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBcnJheUVxOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNvZGVQb2ludFRvVXRmODsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb3B5QXJyYXk7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q291bnRJZjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpFcUZhaWx1cmU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RmxvYXRpbmdQb2ludDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JFYWNoOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kczsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHVGVzdEZsYWdTYXZlcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldEVsZW1lbnRPcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXROZXh0UmFuZG9tU2VlZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRSYW5kb21TZWVkRnJvbUZsYWc7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGVzdFR5cGVJZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRUeXBlSWQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMkZyb21FbnZPckRpZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNDb250YWluZXI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNDb250YWluZXJUZXN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OklzTm90Q29udGFpbmVyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6Ok5hdGl2ZUFycmF5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlBhcnNlSW50MzJGbGFnOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlJlbW92ZUNvbnN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlJlbW92ZVJlZmVyZW5jZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaG91bGRSdW5UZXN0T25TaGFyZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaG91bGRTaGFyZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaG91bGRVc2VDb2xvcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaHVmZmxlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNodWZmbGVSYW5nZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTa2lwUHJlZml4OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdFJlc3VsdEFjY2Vzc29yOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlVJbnQzMjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpXaWRlU3RyaW5nVG9VdGY4OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtDb3B5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtNYXhSYW5kb21TZWVkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtSZWZlcmVuY2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3Q7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3Rkb3V0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3Rkb3V0OworI2VuZGlmCisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VGhyZWFkV2l0aFBhcmFtOworI2VuZGlmCisKK2NsYXNzIFRlc3RpbmdWZWN0b3IgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8aW50PiB7Cit9OworCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgb3MgPDwgInsgIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICBvcyA8PCB2ZWN0b3JbaV0gPDwgIiAiOworICB9CisgIG9zIDw8ICJ9IjsKKyAgcmV0dXJuIG9zOworfQorCisvLyBUaGlzIGxpbmUgdGVzdHMgdGhhdCB3ZSBjYW4gZGVmaW5lIHRlc3RzIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlLgorbmFtZXNwYWNlIHsKKworVEVTVChHZXRSYW5kb21TZWVkRnJvbUZsYWdUZXN0LCBIYW5kbGVzWmVybykgeworICBjb25zdCBpbnQgc2VlZCA9IEdldFJhbmRvbVNlZWRGcm9tRmxhZygwKTsKKyAgRVhQRUNUX0xFKDEsIHNlZWQpOworICBFWFBFQ1RfTEUoc2VlZCwgc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCkpOworfQorCitURVNUKEdldFJhbmRvbVNlZWRGcm9tRmxhZ1Rlc3QsIFByZXNlcnZlc1ZhbGlkU2VlZCkgeworICBFWFBFQ1RfRVEoMSwgR2V0UmFuZG9tU2VlZEZyb21GbGFnKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEdldFJhbmRvbVNlZWRGcm9tRmxhZygyKSk7CisgIEVYUEVDVF9FUShrTWF4UmFuZG9tU2VlZCAtIDEsIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhrTWF4UmFuZG9tU2VlZCAtIDEpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpLAorICAgICAgICAgICAgR2V0UmFuZG9tU2VlZEZyb21GbGFnKGtNYXhSYW5kb21TZWVkKSk7Cit9CisKK1RFU1QoR2V0UmFuZG9tU2VlZEZyb21GbGFnVGVzdCwgTm9ybWFsaXplc0ludmFsaWRTZWVkKSB7CisgIGNvbnN0IGludCBzZWVkMSA9IEdldFJhbmRvbVNlZWRGcm9tRmxhZygtMSk7CisgIEVYUEVDVF9MRSgxLCBzZWVkMSk7CisgIEVYUEVDVF9MRShzZWVkMSwgc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCkpOworCisgIGNvbnN0IGludCBzZWVkMiA9IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhrTWF4UmFuZG9tU2VlZCArIDEpOworICBFWFBFQ1RfTEUoMSwgc2VlZDIpOworICBFWFBFQ1RfTEUoc2VlZDIsIHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpKTsKK30KKworVEVTVChHZXROZXh0UmFuZG9tU2VlZFRlc3QsIFdvcmtzRm9yVmFsaWRJbnB1dCkgeworICBFWFBFQ1RfRVEoMiwgR2V0TmV4dFJhbmRvbVNlZWQoMSkpOworICBFWFBFQ1RfRVEoMywgR2V0TmV4dFJhbmRvbVNlZWQoMikpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCksCisgICAgICAgICAgICBHZXROZXh0UmFuZG9tU2VlZChrTWF4UmFuZG9tU2VlZCAtIDEpKTsKKyAgRVhQRUNUX0VRKDEsIEdldE5leHRSYW5kb21TZWVkKGtNYXhSYW5kb21TZWVkKSk7CisKKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IGRvbid0IHRlc3QgR2V0TmV4dFJhbmRvbVNlZWQoKSB3aXRoIGludmFsaWQKKyAgLy8gaW5wdXRzLCBhcyB0aGF0IHJlcXVpcmVzIGRlYXRoIHRlc3RzLCB3aGljaCBhcmUgZXhwZW5zaXZlLiAgVGhpcworICAvLyBpcyBmaW5lIGFzIEdldE5leHRSYW5kb21TZWVkKCkgaXMgaW50ZXJuYWwgYW5kIGhhcyBhCisgIC8vIHN0cmFpZ2h0Zm9yd2FyZCBkZWZpbml0aW9uLgorfQorCitzdGF0aWMgdm9pZCBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKSB7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoCisgICAgICBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpKTsKK30KKworLy8gVGVzdHMgR2V0VHlwZUlkLgorCitURVNUKEdldFR5cGVJZFRlc3QsIFJldHVybnNTYW1lVmFsdWVGb3JTYW1lVHlwZSkgeworICBFWFBFQ1RfRVEoR2V0VHlwZUlkPGludD4oKSwgR2V0VHlwZUlkPGludD4oKSk7CisgIEVYUEVDVF9FUShHZXRUeXBlSWQ8VGVzdD4oKSwgR2V0VHlwZUlkPFRlc3Q+KCkpOworfQorCitjbGFzcyBTdWJDbGFzc09mVGVzdCA6IHB1YmxpYyBUZXN0IHt9OworY2xhc3MgQW5vdGhlclN1YkNsYXNzT2ZUZXN0IDogcHVibGljIFRlc3Qge307CisKK1RFU1QoR2V0VHlwZUlkVGVzdCwgUmV0dXJuc0RpZmZlcmVudFZhbHVlc0ZvckRpZmZlcmVudFR5cGVzKSB7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8aW50PigpLCBHZXRUeXBlSWQ8Y29uc3QgaW50PigpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxpbnQ+KCksIEdldFR5cGVJZDxjaGFyPigpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxpbnQ+KCksIEdldFRlc3RUeXBlSWQoKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8U3ViQ2xhc3NPZlRlc3Q+KCksIEdldFRlc3RUeXBlSWQoKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8QW5vdGhlclN1YkNsYXNzT2ZUZXN0PigpLCBHZXRUZXN0VHlwZUlkKCkpOworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPEFub3RoZXJTdWJDbGFzc09mVGVzdD4oKSwgR2V0VHlwZUlkPFN1YkNsYXNzT2ZUZXN0PigpKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBHZXRUZXN0VHlwZUlkKCkgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSwgbm8gbWF0dGVyIGl0CisvLyBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgR29vZ2xlIFRlc3Qgb3Igb3V0c2lkZSBvZiBpdC4KK1RFU1QoR2V0VGVzdFR5cGVJZFRlc3QsIFJldHVybnNUaGVTYW1lVmFsdWVJbnNpZGVPck91dHNpZGVPZkdvb2dsZVRlc3QpIHsKKyAgRVhQRUNUX0VRKGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0LCBHZXRUZXN0VHlwZUlkKCkpOworfQorCisvLyBUZXN0cyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoKS4KKworVEVTVChGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHNUZXN0LCBGb3JtYXRzWmVybykgeworICBFWFBFQ1RfRVEoIjAiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMCkpOworfQorCitURVNUKEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kc1Rlc3QsIEZvcm1hdHNQb3NpdGl2ZU51bWJlcikgeworICBFWFBFQ1RfRVEoIjAuMDAzIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDMpKTsKKyAgRVhQRUNUX0VRKCIwLjAxIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDEwKSk7CisgIEVYUEVDVF9FUSgiMC4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDIwMCkpOworICBFWFBFQ1RfRVEoIjEuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygxMjAwKSk7CisgIEVYUEVDVF9FUSgiMyIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygzMDAwKSk7Cit9CisKK1RFU1QoRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzVGVzdCwgRm9ybWF0c05lZ2F0aXZlTnVtYmVyKSB7CisgIEVYUEVDVF9FUSgiLTAuMDAzIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0zKSk7CisgIEVYUEVDVF9FUSgiLTAuMDEiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTEwKSk7CisgIEVYUEVDVF9FUSgiLTAuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMjAwKSk7CisgIEVYUEVDVF9FUSgiLTEuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMTIwMCkpOworICBFWFBFQ1RfRVEoIi0zIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0zMDAwKSk7Cit9CisKKyNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisKKyMgaWZkZWYgX19CT1JMQU5EQ19fCisvLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgorIyAgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyMgZW5kaWYKKworLy8gVGVzdHMgdGhhdCBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGlzIHRydWUgd2hlbiB4IGlzIGEgbnVsbAorLy8gcG9pbnRlciBsaXRlcmFsLgorVEVTVChOdWxsTGl0ZXJhbFRlc3QsIElzVHJ1ZUZvck51bGxMaXRlcmFscykgeworICBFWFBFQ1RfVFJVRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKE5VTEwpKTsKKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwKSk7CisgIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMFUpKTsKKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwTCkpOworCisjIGlmbmRlZiBfX0JPUkxBTkRDX18KKworICAvLyBTb21lIGNvbXBpbGVycyBtYXkgZmFpbCB0byBkZXRlY3Qgc29tZSBudWxsIHBvaW50ZXIgbGl0ZXJhbHM7CisgIC8vIGFzIGxvbmcgYXMgdXNlcnMgb2YgdGhlIGZyYW1ld29yayBkb24ndCB1c2Ugc3VjaCBsaXRlcmFscywgdGhpcworICAvLyBpcyBoYXJtbGVzcy4KKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygxIC0gMSkpOworCisjIGVuZGlmCit9CisKKy8vIFRlc3RzIHRoYXQgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBpcyBmYWxzZSB3aGVuIHggaXMgbm90IGEgbnVsbAorLy8gcG9pbnRlciBsaXRlcmFsLgorVEVTVChOdWxsTGl0ZXJhbFRlc3QsIElzRmFsc2VGb3JOb25OdWxsTGl0ZXJhbHMpIHsKKyAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oMSkpOworICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwLjApKTsKKyAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHN0YXRpY19jYXN0PHZvaWQqPihOVUxMKSkpOworfQorCisjIGlmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHByZXNzZWQgdGhlbS4KKyMgIHByYWdtYSBvcHRpb24gcG9wCisjIGVuZGlmCisKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorLy8KKy8vIFRlc3RzIENvZGVQb2ludFRvVXRmOCgpLgorCisvLyBUZXN0cyB0aGF0IHRoZSBOVUwgY2hhcmFjdGVyIEwnXDAnIGlzIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGVOdWwpIHsKKyAgY2hhciBidWZmZXJbMzJdOworICBFWFBFQ1RfU1RSRVEoIiIsIENvZGVQb2ludFRvVXRmOChMJ1wwJywgYnVmZmVyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNDSUkgY2hhcmFjdGVycyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkuCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZUFzY2lpKSB7CisgIGNoYXIgYnVmZmVyWzMyXTsKKyAgRVhQRUNUX1NUUkVRKCJhIiwgQ29kZVBvaW50VG9VdGY4KEwnYScsIGJ1ZmZlcikpOworICBFWFBFQ1RfU1RSRVEoIloiLCBDb2RlUG9pbnRUb1V0ZjgoTCdaJywgYnVmZmVyKSk7CisgIEVYUEVDVF9TVFJFUSgiJiIsIENvZGVQb2ludFRvVXRmOChMJyYnLCBidWZmZXIpKTsKKyAgRVhQRUNUX1NUUkVRKCJceDdGIiwgQ29kZVBvaW50VG9VdGY4KEwnXHg3RicsIGJ1ZmZlcikpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDggdG8gMTEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTEweHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZThUbzExQml0cykgeworICBjaGFyIGJ1ZmZlclszMl07CisgIC8vIDAwMCAxMTAxIDAwMTEgPT4gMTEwLTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfU1RSRVEoIlx4QzNceDkzIiwgQ29kZVBvaW50VG9VdGY4KEwnXHhEMycsIGJ1ZmZlcikpOworCisgIC8vIDEwMSAwMTExIDAxMTAgPT4gMTEwLTEwMTAxIDEwLTExMDExMAorICAvLyBTb21lIGNvbXBpbGVycyAoZS5nLiwgR0NDIG9uIE1pbkdXKSBjYW5ub3QgaGFuZGxlIG5vbi1BU0NJSSBjb2RlcG9pbnRzCisgIC8vIGluIHdpZGUgc3RyaW5ncyBhbmQgd2lkZSBjaGFycy4gSW4gb3JkZXIgdG8gYWNjb21vZGF0ZSB0aGVtLCB3ZSBoYXZlIHRvCisgIC8vIGludHJvZHVjZSBzdWNoIGNoYXJhY3RlciBjb25zdGFudHMgYXMgaW50ZWdlcnMuCisgIEVYUEVDVF9TVFJFUSgiXHhENVx4QjYiLAorICAgICAgICAgICAgICAgQ29kZVBvaW50VG9VdGY4KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4NTc2KSwgYnVmZmVyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTIgdG8gMTYgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZTEyVG8xNkJpdHMpIHsKKyAgY2hhciBidWZmZXJbMzJdOworICAvLyAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTAtMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhFMFx4QTNceDkzIiwKKyAgICAgICAgICAgICAgIENvZGVQb2ludFRvVXRmOChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDhEMyksIGJ1ZmZlcikpOworCisgIC8vIDExMDAgMDExMSAwMTAwIDExMDEgPT4gMTExMC0xMTAwIDEwLTAxMTEwMSAxMC0wMDExMDEKKyAgRVhQRUNUX1NUUkVRKCJceEVDXHg5RFx4OEQiLAorICAgICAgICAgICAgICAgQ29kZVBvaW50VG9VdGY4KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4Qzc0RCksIGJ1ZmZlcikpOworfQorCisjaWYgIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisvLyBUZXN0cyBpbiB0aGlzIGdyb3VwIHJlcXVpcmUgYSB3Y2hhcl90IHRvIGhvbGQgPiAxNiBiaXRzLCBhbmQgdGh1cworLy8gYXJlIHNraXBwZWQgb24gV2luZG93cywgQ3lnd2luLCBhbmQgU3ltYmlhbiwgd2hlcmUgYSB3Y2hhcl90IGlzCisvLyAxNi1iaXQgd2lkZS4gVGhpcyBjb2RlIG1heSBub3QgY29tcGlsZSBvbiB0aG9zZSBzeXN0ZW1zLgorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDE3IHRvIDIxIGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGUxN1RvMjFCaXRzKSB7CisgIGNoYXIgYnVmZmVyWzMyXTsKKyAgLy8gMCAwMDAxIDAwMDAgMTAwMCAxMTAxIDAwMTEgPT4gMTExMTAtMDAwIDEwLTAxMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceEEzXHg5MyIsIENvZGVQb2ludFRvVXRmOChMJ1x4MTA4RDMnLCBidWZmZXIpKTsKKworICAvLyAwIDAwMDEgMDAwMCAwMTAwIDAwMDAgMDAwMCA9PiAxMTExMC0wMDAgMTAtMDEwMDAwIDEwLTAxMDAwMCAxMC0wMDAwMDAKKyAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4OTBceDgwIiwgQ29kZVBvaW50VG9VdGY4KEwnXHgxMDQwMCcsIGJ1ZmZlcikpOworCisgIC8vIDEgMDAwMCAxMDAwIDAxMTAgMDAxMSAwMTAwID0+IDExMTEwLTEwMCAxMC0wMDEwMDAgMTAtMDExMDAwIDEwLTExMDEwMAorICBFWFBFQ1RfU1RSRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwODYzNCcsIGJ1ZmZlcikpOworfQorCisvLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgY29kZS1wb2ludCBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK1RFU1QoQ29kZVBvaW50VG9VdGY4VGVzdCwgQ2FuRW5jb2RlSW52YWxpZENvZGVQb2ludCkgeworICBjaGFyIGJ1ZmZlclszMl07CisgIEVYUEVDVF9TVFJFUSgiKEludmFsaWQgVW5pY29kZSAweDEyMzRBQkNEKSIsCisgICAgICAgICAgICAgICBDb2RlUG9pbnRUb1V0ZjgoTCdceDEyMzRBQkNEJywgYnVmZmVyKSk7Cit9CisKKyNlbmRpZiAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisKKy8vIFRlc3RzIFdpZGVTdHJpbmdUb1V0ZjgoKS4KKworLy8gVGVzdHMgdGhhdCB0aGUgTlVMIGNoYXJhY3RlciBMJ1wwJyBpcyBlbmNvZGVkIGNvcnJlY3RseS4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZU51bCkgeworICBFWFBFQ1RfU1RSRVEoIiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCIiLCAwKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBXaWRlU3RyaW5nVG9VdGY4KEwiIiwgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IEFTQ0lJIHN0cmluZ3MgYXJlIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlQXNjaWkpIHsKKyAgRVhQRUNUX1NUUkVRKCJhIiwgV2lkZVN0cmluZ1RvVXRmOChMImEiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJhYiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhYiIsIDIpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImEiLCBXaWRlU3RyaW5nVG9VdGY4KEwiYSIsIC0xKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJhYiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhYiIsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSA4IHRvIDExIGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMHh4eHh4IDEweHh4eHh4LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlOFRvMTFCaXRzKSB7CisgIC8vIDAwMCAxMTAxIDAwMTEgPT4gMTEwLTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfU1RSRVEoIlx4QzNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4RDMiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEMzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceEQzIiwgLTEpLmNfc3RyKCkpOworCisgIC8vIDEwMSAwMTExIDAxMTAgPT4gMTEwLTEwMTAxIDEwLTExMDExMAorICBjb25zdCB3Y2hhcl90IHNbXSA9IHsgMHg1NzYsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEQ1XHhCNiIsIFdpZGVTdHJpbmdUb1V0ZjgocywgMSkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXHhENVx4QjYiLCBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSAxMiB0byAxNiBiaXRzIGFyZSBlbmNvZGVkCisvLyBhcyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eC4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZTEyVG8xNkJpdHMpIHsKKyAgLy8gMDAwMCAxMDAwIDExMDEgMDAxMSA9PiAxMTEwLTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQorICBjb25zdCB3Y2hhcl90IHMxW10gPSB7IDB4OEQzLCAnXDAnIH07CisgIEVYUEVDVF9TVFJFUSgiXHhFMFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChzMSwgMSkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXHhFMFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChzMSwgLTEpLmNfc3RyKCkpOworCisgIC8vIDExMDAgMDExMSAwMTAwIDExMDEgPT4gMTExMC0xMTAwIDEwLTAxMTEwMSAxMC0wMDExMDEKKyAgY29uc3Qgd2NoYXJfdCBzMltdID0geyAweEM3NEQsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVDXHg5RFx4OEQiLCBXaWRlU3RyaW5nVG9VdGY4KHMyLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEVDXHg5RFx4OEQiLCBXaWRlU3RyaW5nVG9VdGY4KHMyLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGNvbnZlcnNpb24gc3RvcHMgd2hlbiB0aGUgZnVuY3Rpb24gZW5jb3VudGVycyBcMCBjaGFyYWN0ZXIuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBTdG9wc09uTnVsQ2hhcmFjdGVyKSB7CisgIEVYUEVDVF9TVFJFUSgiQUJDIiwgV2lkZVN0cmluZ1RvVXRmOChMIkFCQ1wwWFlaIiwgMTAwKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgY29udmVyc2lvbiBzdG9wcyB3aGVuIHRoZSBmdW5jdGlvbiByZWFjaGVzIHRoZSBsaW1pdAorLy8gc3BlY2lmaWVkIGJ5IHRoZSAnbGVuZ3RoJyBwYXJhbWV0ZXIuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBTdG9wc1doZW5MZW5ndGhMaW1pdFJlYWNoZWQpIHsKKyAgRVhQRUNUX1NUUkVRKCJBQkMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiQUJDREVGIiwgMykuY19zdHIoKSk7Cit9CisKKyNpZiAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKy8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTcgdG8gMjEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHguIFRoaXMgY29kZSBtYXkgbm90IGNvbXBpbGUKKy8vIG9uIHRoZSBzeXN0ZW1zIHVzaW5nIFVURi0xNiBlbmNvZGluZy4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZTE3VG8yMUJpdHMpIHsKKyAgLy8gMCAwMDAxIDAwMDAgMTAwMCAxMTAxIDAwMTEgPT4gMTExMTAtMDAwIDEwLTAxMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceEEzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwOEQzIiwgMSkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceEEzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwOEQzIiwgLTEpLmNfc3RyKCkpOworCisgIC8vIDEgMDAwMCAxMDAwIDAxMTAgMDAxMSAwMTAwID0+IDExMTEwLTEwMCAxMC0wMDEwMDAgMTAtMDExMDAwIDEwLTExMDEwMAorICBFWFBFQ1RfU1RSRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHgxMDg2MzQiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEY0XHg4OFx4OThceEI0IiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4NjM0IiwgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgY29kZS1wb2ludCBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZUludmFsaWRDb2RlUG9pbnQpIHsKKyAgRVhQRUNUX1NUUkVRKCIoSW52YWxpZCBVbmljb2RlIDB4QUJDREZGKSIsCisgICAgICAgICAgICAgICBXaWRlU3RyaW5nVG9VdGY4KEwiXHhBQkNERkYiLCAtMSkuY19zdHIoKSk7Cit9CisjZWxzZSAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisvLyBUZXN0cyB0aGF0IHN1cnJvZ2F0ZSBwYWlycyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkgb24gdGhlIHN5c3RlbXMgdXNpbmcKKy8vIFVURi0xNiBlbmNvZGluZyBpbiB0aGUgd2lkZSBzdHJpbmdzLgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlVmFsaWRVdGYxNlNVcnJvZ2F0ZVBhaXJzKSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweEQ4MDEsIDB4REMwMCwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RjBceDkwXHg5MFx4ODAiLCBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBlbmNvZGluZyBhbiBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorLy8gZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCByZXN1bHQuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVJbnZhbGlkVXRmMTZTdXJyb2dhdGVQYWlyKSB7CisgIC8vIExlYWRpbmcgc3Vycm9nYXRlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgY29uc3Qgd2NoYXJfdCBzMVtdID0geyAweEQ4MDAsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVEXHhBMFx4ODAiLCBXaWRlU3RyaW5nVG9VdGY4KHMxLCAtMSkuY19zdHIoKSk7CisgIC8vIExlYWRpbmcgc3Vycm9nYXRlIGlzIG5vdCBmb2xsb3dlZCBieSB0aGUgdHJhaWxpbmcgc3Vycm9nYXRlLgorICBjb25zdCB3Y2hhcl90IHMyW10gPSB7IDB4RDgwMCwgJ00nLCAnXDAnIH07CisgIEVYUEVDVF9TVFJFUSgiXHhFRFx4QTBceDgwTSIsIFdpZGVTdHJpbmdUb1V0ZjgoczIsIC0xKS5jX3N0cigpKTsKKyAgLy8gVHJhaWxpbmcgc3Vycm9nYXRlIGFwcGVhcmFzIHdpdGhvdXQgYSBsZWFkaW5nIHN1cnJvZ2F0ZS4KKyAgY29uc3Qgd2NoYXJfdCBzM1tdID0geyAweERDMDAsICdQJywgJ1EnLCAnUicsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVEXHhCMFx4ODBQUVIiLCBXaWRlU3RyaW5nVG9VdGY4KHMzLCAtMSkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworCisvLyBUZXN0cyB0aGF0IGNvZGVwb2ludCBjb25jYXRlbmF0aW9uIHdvcmtzIGNvcnJlY3RseS4KKyNpZiAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENvbmNhdGVuYXRlc0NvZGVwb2ludHNDb3JyZWN0bHkpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4MTA4NjM0LCAweEM3NEQsICdcbicsIDB4NTc2LCAweDhEMywgMHgxMDg2MzQsICdcMCd9OworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiXHhGNFx4ODhceDk4XHhCNCIKKyAgICAgICAgICAiXHhFQ1x4OURceDhEIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAiXHhENVx4QjYiCisgICAgICAgICAgIlx4RTBceEEzXHg5MyIKKyAgICAgICAgICAiXHhGNFx4ODhceDk4XHhCNCIsCisgICAgICBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKK30KKyNlbHNlCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDb25jYXRlbmF0ZXNDb2RlcG9pbnRzQ29ycmVjdGx5KSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweEM3NEQsICdcbicsIDB4NTc2LCAweDhEMywgJ1wwJ307CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJceEVDXHg5RFx4OEQiICJcbiIgIlx4RDVceEI2IiAiXHhFMFx4QTNceDkzIiwKKyAgICAgIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKworLy8gVGVzdHMgdGhlIFJhbmRvbSBjbGFzcy4KKworVEVTVChSYW5kb21EZWF0aFRlc3QsIEdlbmVyYXRlc0NyYXNoZXNPbkludmFsaWRSYW5nZSkgeworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbSg0Mik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICByYW5kb20uR2VuZXJhdGUoMCksCisgICAgICAiQ2Fubm90IGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBcXFswLCAwXFwpIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICByYW5kb20uR2VuZXJhdGUodGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbTo6a01heFJhbmdlICsgMSksCisgICAgICAiR2VuZXJhdGlvbiBvZiBhIG51bWJlciBpbiBcXFswLCAyMTQ3NDgzNjQ5XFwpIHdhcyByZXF1ZXN0ZWQsICIKKyAgICAgICJidXQgdGhpcyBjYW4gb25seSBnZW5lcmF0ZSBudW1iZXJzIGluIFxcWzAsIDIxNDc0ODM2NDhcXCkiKTsKK30KKworVEVTVChSYW5kb21UZXN0LCBHZW5lcmF0ZXNOdW1iZXJzV2l0aGluUmFuZ2UpIHsKKyAgY29uc3QgVUludDMyIGtSYW5nZSA9IDEwMDAwOworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbSgxMjM0NSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEVYUEVDVF9MVChyYW5kb20uR2VuZXJhdGUoa1JhbmdlKSwga1JhbmdlKSA8PCAiIGZvciBpdGVyYXRpb24gIiA8PCBpOworICB9CisKKyAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20yKHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb206OmtNYXhSYW5nZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEVYUEVDVF9MVChyYW5kb20yLkdlbmVyYXRlKGtSYW5nZSksIGtSYW5nZSkgPDwgIiBmb3IgaXRlcmF0aW9uICIgPDwgaTsKKyAgfQorfQorCitURVNUKFJhbmRvbVRlc3QsIFJlcGVhdHNXaGVuUmVzZWVkZWQpIHsKKyAgY29uc3QgaW50IGtTZWVkID0gMTIzOworICBjb25zdCBpbnQga0FycmF5U2l6ZSA9IDEwOworICBjb25zdCBVSW50MzIga1JhbmdlID0gMTAwMDA7CisgIFVJbnQzMiB2YWx1ZXNba0FycmF5U2l6ZV07CisKKyAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20oa1NlZWQpOworICBmb3IgKGludCBpID0gMDsgaSA8IGtBcnJheVNpemU7IGkrKykgeworICAgIHZhbHVlc1tpXSA9IHJhbmRvbS5HZW5lcmF0ZShrUmFuZ2UpOworICB9CisKKyAgcmFuZG9tLlJlc2VlZChrU2VlZCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0FycmF5U2l6ZTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKHZhbHVlc1tpXSwgcmFuZG9tLkdlbmVyYXRlKGtSYW5nZSkpIDw8ICIgZm9yIGl0ZXJhdGlvbiAiIDw8IGk7CisgIH0KK30KKworLy8gVGVzdHMgU1RMIGNvbnRhaW5lciB1dGlsaXRpZXMuCisKKy8vIFRlc3RzIENvdW50SWYoKS4KKworc3RhdGljIGJvb2wgSXNQb3NpdGl2ZShpbnQgbikgeyByZXR1cm4gbiA+IDA7IH0KKworVEVTVChDb250YWluZXJVdGlsaXR5VGVzdCwgQ291bnRJZikgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIEVYUEVDVF9FUSgwLCBDb3VudElmKHYsIElzUG9zaXRpdmUpKTsgIC8vIFdvcmtzIGZvciBhbiBlbXB0eSBjb250YWluZXIuCisKKyAgdi5wdXNoX2JhY2soLTEpOworICB2LnB1c2hfYmFjaygwKTsKKyAgRVhQRUNUX0VRKDAsIENvdW50SWYodiwgSXNQb3NpdGl2ZSkpOyAgLy8gV29ya3Mgd2hlbiBubyB2YWx1ZSBzYXRpc2ZpZXMuCisKKyAgdi5wdXNoX2JhY2soMik7CisgIHYucHVzaF9iYWNrKC0xMCk7CisgIHYucHVzaF9iYWNrKDEwKTsKKyAgRVhQRUNUX0VRKDIsIENvdW50SWYodiwgSXNQb3NpdGl2ZSkpOworfQorCisvLyBUZXN0cyBGb3JFYWNoKCkuCisKK3N0YXRpYyBpbnQgZ19zdW0gPSAwOworc3RhdGljIHZvaWQgQWNjdW11bGF0ZShpbnQgbikgeyBnX3N1bSArPSBuOyB9CisKK1RFU1QoQ29udGFpbmVyVXRpbGl0eVRlc3QsIEZvckVhY2gpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworICBnX3N1bSA9IDA7CisgIEZvckVhY2godiwgQWNjdW11bGF0ZSk7CisgIEVYUEVDVF9FUSgwLCBnX3N1bSk7ICAvLyBXb3JrcyBmb3IgYW4gZW1wdHkgY29udGFpbmVyOworCisgIGdfc3VtID0gMDsKKyAgdi5wdXNoX2JhY2soMSk7CisgIEZvckVhY2godiwgQWNjdW11bGF0ZSk7CisgIEVYUEVDVF9FUSgxLCBnX3N1bSk7ICAvLyBXb3JrcyBmb3IgYSBjb250YWluZXIgd2l0aCBvbmUgZWxlbWVudC4KKworICBnX3N1bSA9IDA7CisgIHYucHVzaF9iYWNrKDIwKTsKKyAgdi5wdXNoX2JhY2soMzAwKTsKKyAgRm9yRWFjaCh2LCBBY2N1bXVsYXRlKTsKKyAgRVhQRUNUX0VRKDMyMSwgZ19zdW0pOworfQorCisvLyBUZXN0cyBHZXRFbGVtZW50T3IoKS4KK1RFU1QoQ29udGFpbmVyVXRpbGl0eVRlc3QsIEdldEVsZW1lbnRPcikgeworICBzdGQ6OnZlY3RvcjxjaGFyPiBhOworICBFWFBFQ1RfRVEoJ3gnLCBHZXRFbGVtZW50T3IoYSwgMCwgJ3gnKSk7CisKKyAgYS5wdXNoX2JhY2soJ2EnKTsKKyAgYS5wdXNoX2JhY2soJ2InKTsKKyAgRVhQRUNUX0VRKCdhJywgR2V0RWxlbWVudE9yKGEsIDAsICd4JykpOworICBFWFBFQ1RfRVEoJ2InLCBHZXRFbGVtZW50T3IoYSwgMSwgJ3gnKSk7CisgIEVYUEVDVF9FUSgneCcsIEdldEVsZW1lbnRPcihhLCAtMiwgJ3gnKSk7CisgIEVYUEVDVF9FUSgneCcsIEdldEVsZW1lbnRPcihhLCAyLCAneCcpKTsKK30KKworVEVTVChDb250YWluZXJVdGlsaXR5RGVhdGhUZXN0LCBTaHVmZmxlUmFuZ2UpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBhOworICBhLnB1c2hfYmFjaygwKTsKKyAgYS5wdXNoX2JhY2soMSk7CisgIGEucHVzaF9iYWNrKDIpOworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbSgxKTsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIC0xLCAxLCAmYSksCisgICAgICAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0IC0xOiBtdXN0IGJlIGluIHJhbmdlIFxcWzAsIDNcXF0iKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIFNodWZmbGVSYW5nZSgmcmFuZG9tLCA0LCA0LCAmYSksCisgICAgICAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0IDQ6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMCwgM1xcXSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIDMsIDIsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoIDI6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMywgM1xcXSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIDMsIDQsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoIDQ6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMywgM1xcXSIpOworfQorCitjbGFzcyBWZWN0b3JTaHVmZmxlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBpbnQga1ZlY3RvclNpemUgPSAyMDsKKworICBWZWN0b3JTaHVmZmxlVGVzdCgpIDogcmFuZG9tXygxKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmVjdG9yU2l6ZTsgaSsrKSB7CisgICAgICB2ZWN0b3JfLnB1c2hfYmFjayhpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc0NvcnJ1cHQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgICAgaWYgKGtWZWN0b3JTaXplICE9IHN0YXRpY19jYXN0PGludD4odmVjdG9yLnNpemUoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZm91bmRfaW5fdmVjdG9yW2tWZWN0b3JTaXplXSA9IHsgZmFsc2UgfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgY29uc3QgaW50IGUgPSB2ZWN0b3JbaV07CisgICAgICBpZiAoZSA8IDAgfHwgZSA+PSBrVmVjdG9yU2l6ZSB8fCBmb3VuZF9pbl92ZWN0b3JbZV0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBmb3VuZF9pbl92ZWN0b3JbZV0gPSB0cnVlOworICAgIH0KKworICAgIC8vIFZlY3RvciBzaXplIGlzIGNvcnJlY3QsIGVsZW1lbnRzJyByYW5nZSBpcyBjb3JyZWN0LCBubworICAgIC8vIGR1cGxpY2F0ZSBlbGVtZW50cy4gIFRoZXJlZm9yZSBubyBjb3JydXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc05vdENvcnJ1cHQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgICAgcmV0dXJuICFWZWN0b3JJc0NvcnJ1cHQodmVjdG9yKTsKKyAgfQorCisgIHN0YXRpYyBib29sIFJhbmdlSXNTaHVmZmxlZChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IsIGludCBiZWdpbiwgaW50IGVuZCkgeworICAgIGZvciAoaW50IGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICBpZiAoaSAhPSB2ZWN0b3JbaV0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBib29sIFJhbmdlSXNVbnNodWZmbGVkKAorICAgICAgY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yLCBpbnQgYmVnaW4sIGludCBlbmQpIHsKKyAgICByZXR1cm4gIVJhbmdlSXNTaHVmZmxlZCh2ZWN0b3IsIGJlZ2luLCBlbmQpOworICB9CisKKyAgc3RhdGljIGJvb2wgVmVjdG9ySXNTaHVmZmxlZChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICByZXR1cm4gUmFuZ2VJc1NodWZmbGVkKHZlY3RvciwgMCwgc3RhdGljX2Nhc3Q8aW50Pih2ZWN0b3Iuc2l6ZSgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc1Vuc2h1ZmZsZWQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgICAgcmV0dXJuICFWZWN0b3JJc1NodWZmbGVkKHZlY3Rvcik7CisgIH0KKworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87CisgIFRlc3RpbmdWZWN0b3IgdmVjdG9yXzsKK307ICAvLyBjbGFzcyBWZWN0b3JTaHVmZmxlVGVzdAorCitjb25zdCBpbnQgVmVjdG9yU2h1ZmZsZVRlc3Q6OmtWZWN0b3JTaXplOworCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIEhhbmRsZXNFbXB0eVJhbmdlKSB7CisgIC8vIFRlc3RzIGFuIGVtcHR5IHJhbmdlIGF0IHRoZSBiZWdpbm5pbmcuLi4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCAwLCAwLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5pbiB0aGUgbWlkZGxlLi4uCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUvMiwga1ZlY3RvclNpemUvMiwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7CisKKyAgLy8gLi4uYXQgdGhlIGVuZC4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplIC0gMSwga1ZlY3RvclNpemUgLSAxLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5hbmQgcGFzdCB0aGUgZW5kLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplLCBrVmVjdG9yU2l6ZSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7Cit9CisKK1RFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgSGFuZGxlc1JhbmdlT2ZTaXplT25lKSB7CisgIC8vIFRlc3RzIGEgc2l6ZSBvbmUgcmFuZ2UgYXQgdGhlIGJlZ2lubmluZy4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIDAsIDEsICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOworCisgIC8vIC4uLmluIHRoZSBtaWRkbGUuLi4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZS8yLCBrVmVjdG9yU2l6ZS8yICsgMSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7CisKKyAgLy8gLi4uYW5kIGF0IHRoZSBlbmQuCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUgLSAxLCBrVmVjdG9yU2l6ZSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7Cit9CisKKy8vIEJlY2F1c2Ugd2UgdXNlIG91ciBvd24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYW5kIGEgZml4ZWQgc2VlZCwKKy8vIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUgZm9sbG93aW5nICJyYW5kb20iIHRlc3RzIHdpbGwgc3VjY2VlZC4KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc0VudGlyZVZlY3RvcikgeworICBTaHVmZmxlKCZyYW5kb21fLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBFWFBFQ1RfRkFMU0UoVmVjdG9ySXNVbnNodWZmbGVkKHZlY3Rvcl8pKSA8PCB2ZWN0b3JfOworCisgIC8vIFRlc3RzIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50cyBpbiBwYXJ0aWN1bGFyIHRvIGVuc3VyZSB0aGF0CisgIC8vIHRoZXJlIGFyZSBubyBvZmYtYnktb25lIHByb2JsZW1zIGluIG91ciBzaHVmZmxlIGFsZ29yaXRobS4KKyAgRVhQRUNUX05FKDAsIHZlY3Rvcl9bMF0pOworICBFWFBFQ1RfTkUoa1ZlY3RvclNpemUgLSAxLCB2ZWN0b3JfW2tWZWN0b3JTaXplIC0gMV0pOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzU3RhcnRPZlZlY3RvcikgeworICBjb25zdCBpbnQga1JhbmdlU2l6ZSA9IGtWZWN0b3JTaXplLzI7CisKKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCAwLCBrUmFuZ2VTaXplLCAmdmVjdG9yXyk7CisKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzU2h1ZmZsZWQsIHZlY3Rvcl8sIDAsIGtSYW5nZVNpemUpOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIGtSYW5nZVNpemUsIGtWZWN0b3JTaXplKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc0VuZE9mVmVjdG9yKSB7CisgIGNvbnN0IGludCBrUmFuZ2VTaXplID0ga1ZlY3RvclNpemUgLyAyOworICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtSYW5nZVNpemUsIGtWZWN0b3JTaXplLCAmdmVjdG9yXyk7CisKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzVW5zaHVmZmxlZCwgdmVjdG9yXywgMCwga1JhbmdlU2l6ZSk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzU2h1ZmZsZWQsIHZlY3Rvcl8sIGtSYW5nZVNpemUsIGtWZWN0b3JTaXplKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc01pZGRsZU9mVmVjdG9yKSB7CisgIGludCBrUmFuZ2VTaXplID0ga1ZlY3RvclNpemUvMzsKKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrUmFuZ2VTaXplLCAyKmtSYW5nZVNpemUsICZ2ZWN0b3JfKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCAwLCBrUmFuZ2VTaXplKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNTaHVmZmxlZCwgdmVjdG9yXywga1JhbmdlU2l6ZSwgMiprUmFuZ2VTaXplKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCAyKmtSYW5nZVNpemUsIGtWZWN0b3JTaXplKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc1JlcGVhdGFibHkpIHsKKyAgVGVzdGluZ1ZlY3RvciB2ZWN0b3IyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtWZWN0b3JTaXplOyBpKyspIHsKKyAgICB2ZWN0b3IyLnB1c2hfYmFjayhpKTsKKyAgfQorCisgIHJhbmRvbV8uUmVzZWVkKDEyMzQpOworICBTaHVmZmxlKCZyYW5kb21fLCAmdmVjdG9yXyk7CisgIHJhbmRvbV8uUmVzZWVkKDEyMzQpOworICBTaHVmZmxlKCZyYW5kb21fLCAmdmVjdG9yMik7CisKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3RvcjIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1ZlY3RvclNpemU7IGkrKykgeworICAgIEVYUEVDVF9FUSh2ZWN0b3JfW2ldLCB2ZWN0b3IyW2ldKSA8PCAiIHdoZXJlIGkgaXMgIiA8PCBpOworICB9Cit9CisKKy8vIFRlc3RzIHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MuCisKK1RFU1QoQXNzZXJ0SGVscGVyVGVzdCwgQXNzZXJ0SGVscGVySXNTbWFsbCkgeworICAvLyBUbyBhdm9pZCBicmVha2luZyBjbGllbnRzIHRoYXQgdXNlIGxvdHMgb2YgYXNzZXJ0aW9ucyBpbiBvbmUKKyAgLy8gZnVuY3Rpb24sIHdlIGNhbm5vdCBncm93IHRoZSBzaXplIG9mIEFzc2VydEhlbHBlci4KKyAgRVhQRUNUX0xFKHNpemVvZih0ZXN0aW5nOjppbnRlcm5hbDo6QXNzZXJ0SGVscGVyKSwgc2l6ZW9mKHZvaWQqKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBTdHJpbmcgY2xhc3MuCisKKy8vIFRlc3RzIFN0cmluZydzIGNvbnN0cnVjdG9ycy4KK1RFU1QoU3RyaW5nVGVzdCwgQ29uc3RydWN0b3JzKSB7CisgIC8vIERlZmF1bHQgY3Rvci4KKyAgU3RyaW5nIHMxOworICAvLyBXZSBhcmVuJ3QgdXNpbmcgRVhQRUNUX0VRKE5VTEwsIHMxLmNfc3RyKCkpIGJlY2F1c2UgY29tcGFyaW5nCisgIC8vIHBvaW50ZXJzIHdpdGggTlVMTCBpc24ndCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtcy4KKyAgRVhQRUNUX0VRKDBVLCBzMS5sZW5ndGgoKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gczEuY19zdHIoKSk7CisKKyAgLy8gSW1wbGljaXRseSBjb25zdHJ1Y3RzIGZyb20gYSBDLXN0cmluZy4KKyAgU3RyaW5nIHMyID0gIkhpIjsKKyAgRVhQRUNUX0VRKDJVLCBzMi5sZW5ndGgoKSk7CisgIEVYUEVDVF9TVFJFUSgiSGkiLCBzMi5jX3N0cigpKTsKKworICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBDLXN0cmluZyBhbmQgYSBsZW5ndGguCisgIFN0cmluZyBzMygiaGVsbG8iLCAzKTsKKyAgRVhQRUNUX0VRKDNVLCBzMy5sZW5ndGgoKSk7CisgIEVYUEVDVF9TVFJFUSgiaGVsIiwgczMuY19zdHIoKSk7CisKKyAgLy8gVGhlIGVtcHR5IFN0cmluZyBzaG91bGQgYmUgY3JlYXRlZCB3aGVuIFN0cmluZyBpcyBjb25zdHJ1Y3RlZCB3aXRoCisgIC8vIGEgTlVMTCBwb2ludGVyIGFuZCBsZW5ndGggMC4KKyAgRVhQRUNUX0VRKDBVLCBTdHJpbmcoTlVMTCwgMCkubGVuZ3RoKCkpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKE5VTEwsIDApLmNfc3RyKCkgPT0gTlVMTCk7CisKKyAgLy8gQ29uc3RydWN0cyBhIFN0cmluZyB0aGF0IGNvbnRhaW5zICdcMCcuCisgIFN0cmluZyBzNCgiYVwwYmNkIiwgNCk7CisgIEVYUEVDVF9FUSg0VSwgczQubGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoJ2EnLCBzNC5jX3N0cigpWzBdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIHM0LmNfc3RyKClbMV0pOworICBFWFBFQ1RfRVEoJ2InLCBzNC5jX3N0cigpWzJdKTsKKyAgRVhQRUNUX0VRKCdjJywgczQuY19zdHIoKVszXSk7CisKKyAgLy8gQ29weSBjdG9yIHdoZXJlIHRoZSBzb3VyY2UgaXMgTlVMTC4KKyAgY29uc3QgU3RyaW5nIG51bGxfc3RyOworICBTdHJpbmcgczUgPSBudWxsX3N0cjsKKyAgRVhQRUNUX1RSVUUoczUuY19zdHIoKSA9PSBOVUxMKTsKKworICAvLyBDb3B5IGN0b3Igd2hlcmUgdGhlIHNvdXJjZSBpc24ndCBOVUxMLgorICBTdHJpbmcgczYgPSBzMzsKKyAgRVhQRUNUX0VRKDNVLCBzNi5sZW5ndGgoKSk7CisgIEVYUEVDVF9TVFJFUSgiaGVsIiwgczYuY19zdHIoKSk7CisKKyAgLy8gQ29weSBjdG9yIHdoZXJlIHRoZSBzb3VyY2UgY29udGFpbnMgJ1wwJy4KKyAgU3RyaW5nIHM3ID0gczQ7CisgIEVYUEVDVF9FUSg0VSwgczcubGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoJ2EnLCBzNy5jX3N0cigpWzBdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIHM3LmNfc3RyKClbMV0pOworICBFWFBFQ1RfRVEoJ2InLCBzNy5jX3N0cigpWzJdKTsKKyAgRVhQRUNUX0VRKCdjJywgczcuY19zdHIoKVszXSk7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQ29udmVydHNGcm9tU3RkU3RyaW5nKSB7CisgIC8vIEFuIGVtcHR5IHN0ZDo6c3RyaW5nLgorICBjb25zdCBzdGQ6OnN0cmluZyBzcmMxKCIiKTsKKyAgY29uc3QgU3RyaW5nIGRlc3QxID0gc3JjMTsKKyAgRVhQRUNUX0VRKDBVLCBkZXN0MS5sZW5ndGgoKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgZGVzdDEuY19zdHIoKSk7CisKKyAgLy8gQSBub3JtYWwgc3RkOjpzdHJpbmcuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHNyYzIoIkhpIik7CisgIGNvbnN0IFN0cmluZyBkZXN0MiA9IHNyYzI7CisgIEVYUEVDVF9FUSgyVSwgZGVzdDIubGVuZ3RoKCkpOworICBFWFBFQ1RfU1RSRVEoIkhpIiwgZGVzdDIuY19zdHIoKSk7CisKKyAgLy8gQW4gc3RkOjpzdHJpbmcgd2l0aCBhbiBlbWJlZGRlZCBOVUwgY2hhcmFjdGVyLgorICBjb25zdCBjaGFyIHNyYzNbXSA9ICJhXDBiIjsKKyAgY29uc3QgU3RyaW5nIGRlc3QzID0gc3RkOjpzdHJpbmcoc3JjMywgc2l6ZW9mKHNyYzMpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihzcmMzKSwgZGVzdDMubGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoJ2EnLCBkZXN0My5jX3N0cigpWzBdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGRlc3QzLmNfc3RyKClbMV0pOworICBFWFBFQ1RfRVEoJ2InLCBkZXN0My5jX3N0cigpWzJdKTsKK30KKworVEVTVChTdHJpbmdUZXN0LCBDb252ZXJ0c1RvU3RkU3RyaW5nKSB7CisgIC8vIEFuIGVtcHR5IFN0cmluZy4KKyAgY29uc3QgU3RyaW5nIHNyYzEoIiIpOworICBjb25zdCBzdGQ6OnN0cmluZyBkZXN0MSA9IHNyYzE7CisgIEVYUEVDVF9FUSgiIiwgZGVzdDEpOworCisgIC8vIEEgbm9ybWFsIFN0cmluZy4KKyAgY29uc3QgU3RyaW5nIHNyYzIoIkhpIik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlc3QyID0gc3JjMjsKKyAgRVhQRUNUX0VRKCJIaSIsIGRlc3QyKTsKKworICAvLyBBIFN0cmluZyBjb250YWluaW5nIGEgJ1wwJy4KKyAgY29uc3QgU3RyaW5nIHNyYzMoInhcMHkiLCAzKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZGVzdDMgPSBzcmMzOworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoInhcMHkiLCAzKSwgZGVzdDMpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworVEVTVChTdHJpbmdUZXN0LCBDb252ZXJ0c0Zyb21HbG9iYWxTdHJpbmcpIHsKKyAgLy8gQW4gZW1wdHkgOjpzdHJpbmcuCisgIGNvbnN0IDo6c3RyaW5nIHNyYzEoIiIpOworICBjb25zdCBTdHJpbmcgZGVzdDEgPSBzcmMxOworICBFWFBFQ1RfRVEoMFUsIGRlc3QxLmxlbmd0aCgpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBkZXN0MS5jX3N0cigpKTsKKworICAvLyBBIG5vcm1hbCA6OnN0cmluZy4KKyAgY29uc3QgOjpzdHJpbmcgc3JjMigiSGkiKTsKKyAgY29uc3QgU3RyaW5nIGRlc3QyID0gc3JjMjsKKyAgRVhQRUNUX0VRKDJVLCBkZXN0Mi5sZW5ndGgoKSk7CisgIEVYUEVDVF9TVFJFUSgiSGkiLCBkZXN0Mi5jX3N0cigpKTsKKworICAvLyBBbiA6OnN0cmluZyB3aXRoIGFuIGVtYmVkZGVkIE5VTCBjaGFyYWN0ZXIuCisgIGNvbnN0IGNoYXIgc3JjM1tdID0gInhcMHkiOworICBjb25zdCBTdHJpbmcgZGVzdDMgPSA6OnN0cmluZyhzcmMzLCBzaXplb2Yoc3JjMykpOworICBFWFBFQ1RfRVEoc2l6ZW9mKHNyYzMpLCBkZXN0My5sZW5ndGgoKSk7CisgIEVYUEVDVF9FUSgneCcsIGRlc3QzLmNfc3RyKClbMF0pOworICBFWFBFQ1RfRVEoJ1wwJywgZGVzdDMuY19zdHIoKVsxXSk7CisgIEVYUEVDVF9FUSgneScsIGRlc3QzLmNfc3RyKClbMl0pOworfQorCitURVNUKFN0cmluZ1Rlc3QsIENvbnZlcnRzVG9HbG9iYWxTdHJpbmcpIHsKKyAgLy8gQW4gZW1wdHkgU3RyaW5nLgorICBjb25zdCBTdHJpbmcgc3JjMSgiIik7CisgIGNvbnN0IDo6c3RyaW5nIGRlc3QxID0gc3JjMTsKKyAgRVhQRUNUX0VRKCIiLCBkZXN0MSk7CisKKyAgLy8gQSBub3JtYWwgU3RyaW5nLgorICBjb25zdCBTdHJpbmcgc3JjMigiSGkiKTsKKyAgY29uc3QgOjpzdHJpbmcgZGVzdDIgPSBzcmMyOworICBFWFBFQ1RfRVEoIkhpIiwgZGVzdDIpOworCisgIGNvbnN0IFN0cmluZyBzcmMzKCJ4XDB5IiwgMyk7CisgIGNvbnN0IDo6c3RyaW5nIGRlc3QzID0gc3JjMzsKKyAgRVhQRUNUX0VRKDo6c3RyaW5nKCJ4XDB5IiwgMyksIGRlc3QzKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisvLyBUZXN0cyBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKCkuCitURVNUKFN0cmluZ1Rlc3QsIFNob3dDU3RyaW5nUXVvdGVkKSB7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwKKyAgICAgICAgICAgICAgIFN0cmluZzo6U2hvd0NTdHJpbmdRdW90ZWQoTlVMTCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXCJcIiIsCisgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKCIiKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJcImZvb1wiIiwKKyAgICAgICAgICAgICAgIFN0cmluZzo6U2hvd0NTdHJpbmdRdW90ZWQoImZvbyIpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBTdHJpbmc6OmVtcHR5KCkuCitURVNUKFN0cmluZ1Rlc3QsIEVtcHR5KSB7CisgIEVYUEVDVF9UUlVFKFN0cmluZygiIikuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmcoKS5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZyhOVUxMKS5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZygiYSIpLmVtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKCJcMCIsIDEpLmVtcHR5KCkpOworfQorCisvLyBUZXN0cyBTdHJpbmc6OkNvbXBhcmUoKS4KK1RFU1QoU3RyaW5nVGVzdCwgQ29tcGFyZSkgeworICAvLyBOVUxMIHZzIE5VTEwuCisgIEVYUEVDVF9FUSgwLCBTdHJpbmcoKS5Db21wYXJlKFN0cmluZygpKSk7CisKKyAgLy8gTlVMTCB2cyBub24tTlVMTC4KKyAgRVhQRUNUX0VRKC0xLCBTdHJpbmcoKS5Db21wYXJlKFN0cmluZygiIikpKTsKKworICAvLyBOb24tTlVMTCB2cyBOVUxMLgorICBFWFBFQ1RfRVEoMSwgU3RyaW5nKCIiKS5Db21wYXJlKFN0cmluZygpKSk7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBjb3ZlcnMgbm9uLU5VTEwgdnMgbm9uLU5VTEwuCisKKyAgLy8gIiIgdnMgIiIuCisgIEVYUEVDVF9FUSgwLCBTdHJpbmcoIiIpLkNvbXBhcmUoU3RyaW5nKCIiKSkpOworCisgIC8vICIiIHZzIG5vbi0iIi4KKyAgRVhQRUNUX0VRKC0xLCBTdHJpbmcoIiIpLkNvbXBhcmUoU3RyaW5nKCJcMCIsIDEpKSk7CisgIEVYUEVDVF9FUSgtMSwgU3RyaW5nKCIiKS5Db21wYXJlKCIgIikpOworCisgIC8vIE5vbi0iIiB2cyAiIi4KKyAgRVhQRUNUX0VRKDEsIFN0cmluZygiYSIpLkNvbXBhcmUoU3RyaW5nKCIiKSkpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgY292ZXJzIG5vbi0iIiB2cyBub24tIiIuCisKKyAgLy8gU2FtZSBsZW5ndGggYW5kIGVxdWFsLgorICBFWFBFQ1RfRVEoMCwgU3RyaW5nKCJhIikuQ29tcGFyZShTdHJpbmcoImEiKSkpOworCisgIC8vIFNhbWUgbGVuZ3RoIGFuZCBkaWZmZXJlbnQuCisgIEVYUEVDVF9FUSgtMSwgU3RyaW5nKCJhXDBiIiwgMykuQ29tcGFyZShTdHJpbmcoImFcMGMiLCAzKSkpOworICBFWFBFQ1RfRVEoMSwgU3RyaW5nKCJiIikuQ29tcGFyZShTdHJpbmcoImEiKSkpOworCisgIC8vIERpZmZlcmVudCBsZW5ndGhzLgorICBFWFBFQ1RfRVEoLTEsIFN0cmluZygiYSIpLkNvbXBhcmUoU3RyaW5nKCJhYiIpKSk7CisgIEVYUEVDVF9FUSgtMSwgU3RyaW5nKCJhIikuQ29tcGFyZShTdHJpbmcoImFcMCIsIDIpKSk7CisgIEVYUEVDVF9FUSgxLCBTdHJpbmcoImFiYyIpLkNvbXBhcmUoU3RyaW5nKCJhYWNkIikpKTsKK30KKworLy8gVGVzdHMgU3RyaW5nOjpvcGVyYXRvcj09KCkuCitURVNUKFN0cmluZ1Rlc3QsIEVxdWFscykgeworICBjb25zdCBTdHJpbmcgbnVsbChOVUxMKTsKKyAgRVhQRUNUX1RSVUUobnVsbCA9PSBOVUxMKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRkFMU0UobnVsbCA9PSAiIik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBTFNFKG51bGwgPT0gImJhciIpOyAgLy8gTk9MSU5UCisKKyAgY29uc3QgU3RyaW5nIGVtcHR5KCIiKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5ID09IE5VTEwpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGVtcHR5ID09ICIiKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRkFMU0UoZW1wdHkgPT0gImJhciIpOyAgLy8gTk9MSU5UCisKKyAgY29uc3QgU3RyaW5nIGZvbygiZm9vIik7CisgIEVYUEVDVF9GQUxTRShmb28gPT0gTlVMTCk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBTFNFKGZvbyA9PSAiIik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBTFNFKGZvbyA9PSAiYmFyIik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoZm9vID09ICJmb28iKTsgIC8vIE5PTElOVAorCisgIGNvbnN0IFN0cmluZyBiYXIoInhcMHkiLCAzKTsKKyAgRVhQRUNUX0ZBTFNFKGJhciA9PSAieCIpOworfQorCisvLyBUZXN0cyBTdHJpbmc6Om9wZXJhdG9yIT0oKS4KK1RFU1QoU3RyaW5nVGVzdCwgTm90RXF1YWxzKSB7CisgIGNvbnN0IFN0cmluZyBudWxsKE5VTEwpOworICBFWFBFQ1RfRkFMU0UobnVsbCAhPSBOVUxMKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShudWxsICE9ICIiKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShudWxsICE9ICJiYXIiKTsgIC8vIE5PTElOVAorCisgIGNvbnN0IFN0cmluZyBlbXB0eSgiIik7CisgIEVYUEVDVF9UUlVFKGVtcHR5ICE9IE5VTEwpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQUxTRShlbXB0eSAhPSAiIik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoZW1wdHkgIT0gImJhciIpOyAgLy8gTk9MSU5UCisKKyAgY29uc3QgU3RyaW5nIGZvbygiZm9vIik7CisgIEVYUEVDVF9UUlVFKGZvbyAhPSBOVUxMKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShmb28gIT0gIiIpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGZvbyAhPSAiYmFyIik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBTFNFKGZvbyAhPSAiZm9vIik7ICAvLyBOT0xJTlQKKworICBjb25zdCBTdHJpbmcgYmFyKCJ4XDB5IiwgMyk7CisgIEVYUEVDVF9UUlVFKGJhciAhPSAieCIpOworfQorCisvLyBUZXN0cyBTdHJpbmc6Omxlbmd0aCgpLgorVEVTVChTdHJpbmdUZXN0LCBMZW5ndGgpIHsKKyAgRVhQRUNUX0VRKDBVLCBTdHJpbmcoKS5sZW5ndGgoKSk7CisgIEVYUEVDVF9FUSgwVSwgU3RyaW5nKCIiKS5sZW5ndGgoKSk7CisgIEVYUEVDVF9FUSgyVSwgU3RyaW5nKCJhYiIpLmxlbmd0aCgpKTsKKyAgRVhQRUNUX0VRKDNVLCBTdHJpbmcoImFcMGIiLCAzKS5sZW5ndGgoKSk7Cit9CisKKy8vIFRlc3RzIFN0cmluZzo6RW5kc1dpdGgoKS4KK1RFU1QoU3RyaW5nVGVzdCwgRW5kc1dpdGgpIHsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nKCJmb29iYXIiKS5FbmRzV2l0aCgiYmFyIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmcoImZvb2JhciIpLkVuZHNXaXRoKCIiKSk7CisgIEVYUEVDVF9UUlVFKFN0cmluZygiIikuRW5kc1dpdGgoIiIpKTsKKworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKCJmb29iYXIiKS5FbmRzV2l0aCgiZm9vIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKCIiKS5FbmRzV2l0aCgiZm9vIikpOworfQorCisvLyBUZXN0cyBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCkuCitURVNUKFN0cmluZ1Rlc3QsIEVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKSB7CisgIEVYUEVDVF9UUlVFKFN0cmluZygiZm9vYmFyIikuRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoIkJBUiIpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nKCJmb29iYVIiKS5FbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiYmFyIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmcoImZvb2JhciIpLkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCIiKSk7CisgIEVYUEVDVF9UUlVFKFN0cmluZygiIikuRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoIiIpKTsKKworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKCJGb29iYXIiKS5FbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKCJmb29iYXIiKS5FbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiRm9vIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nKCIiKS5FbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vIikpOworfQorCisvLyBDKytCdWlsZGVyJ3MgcHJlcHJvY2Vzc29yIGlzIGJ1Z2d5OyBpdCBmYWlscyB0byBleHBhbmQgbWFjcm9zIHRoYXQKKy8vIGFwcGVhciBpbiBtYWNybyBwYXJhbWV0ZXJzIGFmdGVyIHdpZGUgY2hhciBsaXRlcmFscy4gIFByb3ZpZGUgYW4gYWxpYXMKKy8vIGZvciBOVUxMIGFzIGEgd29ya2Fyb3VuZC4KK3N0YXRpYyBjb25zdCB3Y2hhcl90KiBjb25zdCBrTnVsbCA9IE5VTEw7CisKKy8vIFRlc3RzIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMKK1RFU1QoU3RyaW5nVGVzdCwgQ2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMpIHsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhOVUxMLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGtOdWxsLCBMIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCIiLCBrTnVsbCkpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhrTnVsbCwgTCJmb29iYXIiKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiZm9vYmFyIiwga051bGwpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMImZvb2JhciIsIEwiZm9vYmFyIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiZm9vYmFyIiwgTCJGT09CQVIiKSk7CisgIEVYUEVDVF9UUlVFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJGT09CQVIiLCBMImZvb2JhciIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBOVUxMIGNhbiBiZSBhc3NpZ25lZCB0byBhIFN0cmluZy4KK1RFU1QoU3RyaW5nVGVzdCwgQ2FuQmVBc3NpZ25lZE5VTEwpIHsKKyAgY29uc3QgU3RyaW5nIHNyYyhOVUxMKTsKKyAgU3RyaW5nIGRlc3Q7CisKKyAgZGVzdCA9IHNyYzsKKyAgRVhQRUNUX1NUUkVRKE5VTEwsIGRlc3QuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGVtcHR5IHN0cmluZyAiIiBjYW4gYmUgYXNzaWduZWQgdG8gYSBTdHJpbmcuCitURVNUKFN0cmluZ1Rlc3QsIENhbkJlQXNzaWduZWRFbXB0eSkgeworICBjb25zdCBTdHJpbmcgc3JjKCIiKTsKKyAgU3RyaW5nIGRlc3Q7CisKKyAgZGVzdCA9IHNyYzsKKyAgRVhQRUNUX1NUUkVRKCIiLCBkZXN0LmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbm9uLWVtcHR5IHN0cmluZyBjYW4gYmUgYXNzaWduZWQgdG8gYSBTdHJpbmcuCitURVNUKFN0cmluZ1Rlc3QsIENhbkJlQXNzaWduZWROb25FbXB0eSkgeworICBjb25zdCBTdHJpbmcgc3JjKCJoZWxsbyIpOworICBTdHJpbmcgZGVzdDsKKyAgZGVzdCA9IHNyYzsKKyAgRVhQRUNUX0VRKDVVLCBkZXN0Lmxlbmd0aCgpKTsKKyAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIGRlc3QuY19zdHIoKSk7CisKKyAgY29uc3QgU3RyaW5nIHNyYzIoInhcMHkiLCAzKTsKKyAgU3RyaW5nIGRlc3QyOworICBkZXN0MiA9IHNyYzI7CisgIEVYUEVDVF9FUSgzVSwgZGVzdDIubGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoJ3gnLCBkZXN0Mi5jX3N0cigpWzBdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGRlc3QyLmNfc3RyKClbMV0pOworICBFWFBFQ1RfRVEoJ3knLCBkZXN0Mi5jX3N0cigpWzJdKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIFN0cmluZyBjYW4gYmUgYXNzaWduZWQgdG8gaXRzZWxmLgorVEVTVChTdHJpbmdUZXN0LCBDYW5CZUFzc2lnbmVkU2VsZikgeworICBTdHJpbmcgZGVzdCgiaGVsbG8iKTsKKworICAvLyBVc2UgZXhwbGljaXQgZnVuY3Rpb24gY2FsbCBub3RhdGlvbiBoZXJlIHRvIHN1cHByZXNzIHNlbGYtYXNzaWduIHdhcm5pbmcuCisgIGRlc3Qub3BlcmF0b3I9KGRlc3QpOworICBFWFBFQ1RfU1RSRVEoImhlbGxvIiwgZGVzdC5jX3N0cigpKTsKK30KKworLy8gU3VuIFN0dWRpbyA8IDEyIGluY29ycmVjdGx5IHJlamVjdHMgdGhpcyBjb2RlIGR1ZSB0byBhbiBvdmVybG9hZGluZworLy8gYW1iaWd1aXR5LgorI2lmICEoZGVmaW5lZChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDU5MCkKKy8vIFRlc3RzIHN0cmVhbWluZyBhIFN0cmluZy4KK1RFU1QoU3RyaW5nVGVzdCwgU3RyZWFtcykgeworICBFWFBFQ1RfRVEoU3RyZWFtYWJsZVRvU3RyaW5nKFN0cmluZygpKSwgIihudWxsKSIpOworICBFWFBFQ1RfRVEoU3RyZWFtYWJsZVRvU3RyaW5nKFN0cmluZygiIikpLCAiIik7CisgIEVYUEVDVF9FUShTdHJlYW1hYmxlVG9TdHJpbmcoU3RyaW5nKCJhXDBiIiwgMykpLCAiYVxcMGIiKTsKK30KKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IFN0cmluZzo6Rm9ybWF0KCkgd29ya3MuCitURVNUKFN0cmluZ1Rlc3QsIEZvcm1hdFdvcmtzKSB7CisgIC8vIE5vcm1hbCBjYXNlOiB0aGUgZm9ybWF0IHNwZWMgaXMgdmFsaWQsIHRoZSBhcmd1bWVudHMgbWF0Y2ggdGhlCisgIC8vIHNwZWMsIGFuZCB0aGUgcmVzdWx0IGlzIDwgNDA5NSBjaGFyYWN0ZXJzLgorICBFWFBFQ1RfU1RSRVEoIkhlbGxvLCA0MiIsIFN0cmluZzo6Rm9ybWF0KCIlcywgJWQiLCAiSGVsbG8iLCA0MikuY19zdHIoKSk7CisKKyAgLy8gRWRnZSBjYXNlOiB0aGUgcmVzdWx0IGlzIDQwOTUgY2hhcmFjdGVycy4KKyAgY2hhciBidWZmZXJbNDA5Nl07CisgIGNvbnN0IHNpemVfdCBrU2l6ZSA9IHNpemVvZihidWZmZXIpOworICBtZW1zZXQoYnVmZmVyLCAnYScsIGtTaXplIC0gMSk7CisgIGJ1ZmZlcltrU2l6ZSAtIDFdID0gJ1wwJzsKKyAgRVhQRUNUX1NUUkVRKGJ1ZmZlciwgU3RyaW5nOjpGb3JtYXQoIiVzIiwgYnVmZmVyKS5jX3N0cigpKTsKKworICAvLyBUaGUgcmVzdWx0IG5lZWRzIHRvIGJlIDQwOTYgY2hhcmFjdGVycywgZXhjZWVkaW5nIEZvcm1hdCgpJ3MgbGltaXQuCisgIEVYUEVDVF9TVFJFUSgiPGZvcm1hdHRpbmcgZXJyb3Igb3IgYnVmZmVyIGV4Y2VlZGVkPiIsCisgICAgICAgICAgICAgICBTdHJpbmc6OkZvcm1hdCgieCVzIiwgYnVmZmVyKS5jX3N0cigpKTsKKworI2lmIEdURVNUX09TX0xJTlVYCisgIC8vIE9uIExpbnV4LCBpbnZhbGlkIGZvcm1hdCBzcGVjIHNob3VsZCBsZWFkIHRvIGFuIGVycm9yIG1lc3NhZ2UuCisgIC8vIEluIG90aGVyIGVudmlyb25tZW50IChlLmcuIE1TVkMgb24gV2luZG93cyksIFN0cmluZzo6Rm9ybWF0KCkgbWF5CisgIC8vIHNpbXBseSBpZ25vcmUgYSBiYWQgZm9ybWF0IHNwZWMsIHNvIHRoaXMgYXNzZXJ0aW9uIGlzIHJ1biBvbgorICAvLyBMaW51eCBvbmx5LgorICBFWFBFQ1RfU1RSRVEoIjxmb3JtYXR0aW5nIGVycm9yIG9yIGJ1ZmZlciBleGNlZWRlZD4iLAorICAgICAgICAgICAgICAgU3RyaW5nOjpGb3JtYXQoIiUiKS5jX3N0cigpKTsKKyNlbmRpZgorfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZygpLgorVEVTVChTdHJpbmdUZXN0LCBTaG93V2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLAorICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTlVMTCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTCIiKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhMImZvbyIpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZCgpLgorVEVTVChTdHJpbmdUZXN0LCBTaG93V2lkZUNTdHJpbmdRdW90ZWQpIHsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLAorICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoTlVMTCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiTFwiXCIiLAorICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoTCIiKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJMXCJmb29cIiIsCisgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZChMImZvbyIpLmNfc3RyKCkpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitURVNUKFN0cmluZ1Rlc3QsIEFuc2lBbmRVdGYxNk51bGwpIHsKKyAgRVhQRUNUX0VRKE5VTEwsIFN0cmluZzo6QW5zaVRvVXRmMTYoTlVMTCkpOworICBFWFBFQ1RfRVEoTlVMTCwgU3RyaW5nOjpVdGYxNlRvQW5zaShOVUxMKSk7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2Q29udmVydEJhc2ljKSB7CisgIGNvbnN0IGNoYXIqIGFuc2kgPSBTdHJpbmc6OlV0ZjE2VG9BbnNpKEwic3RyIik7CisgIEVYUEVDVF9TVFJFUSgic3RyIiwgYW5zaSk7CisgIGRlbGV0ZSBbXSBhbnNpOworICBjb25zdCBXQ0hBUiogdXRmMTYgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KCJzdHIiKTsKKyAgRVhQRUNUX0VRKDAsIHdjc25jbXAoTCJzdHIiLCB1dGYxNiwgMykpOworICBkZWxldGUgW10gdXRmMTY7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2Q29udmVydFBhdGhDaGFycykgeworICBjb25zdCBjaGFyKiBhbnNpID0gU3RyaW5nOjpVdGYxNlRvQW5zaShMIi46XFwgXCIqPyIpOworICBFWFBFQ1RfU1RSRVEoIi46XFwgXCIqPyIsIGFuc2kpOworICBkZWxldGUgW10gYW5zaTsKKyAgY29uc3QgV0NIQVIqIHV0ZjE2ID0gU3RyaW5nOjpBbnNpVG9VdGYxNigiLjpcXCBcIio/Iik7CisgIEVYUEVDVF9FUSgwLCB3Y3NuY21wKEwiLjpcXCBcIio/IiwgdXRmMTYsIDMpKTsKKyAgZGVsZXRlIFtdIHV0ZjE2OworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIFRlc3RQcm9wZXJ0eSBjb25zdHJ1Y3Rpb24uCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFN0cmluZ1ZhbHVlKSB7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgIjEiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UHJvcGVydHkgcmVwbGFjaW5nIGEgdmFsdWUuCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFJlcGxhY2VTdHJpbmdWYWx1ZSkgeworICBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleSIsICIxIik7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHByb3BlcnR5LnZhbHVlKCkpOworICBwcm9wZXJ0eS5TZXRWYWx1ZSgiMiIpOworICBFWFBFQ1RfU1RSRVEoIjIiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gQWRkRmF0YWxGYWlsdXJlKCkgYW5kIEFkZE5vbmZhdGFsRmFpbHVyZSgpIG11c3QgYmUgc3RhbmQtYWxvbmUKKy8vIGZ1bmN0aW9ucyAoaS5lLiB0aGVpciBkZWZpbml0aW9ucyBjYW5ub3QgYmUgaW5saW5lZCBhdCB0aGUgY2FsbAorLy8gc2l0ZXMpLCBvciBDKytCdWlsZGVyIHdvbid0IGNvbXBpbGUgdGhlIGNvZGUuCitzdGF0aWMgdm9pZCBBZGRGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCitzdGF0aWMgdm9pZCBBZGROb25mYXRhbEZhaWx1cmUoKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Cit9CisKK2NsYXNzIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6ICAvLyBNdXN0IGJlIHB1YmxpYyBhbmQgbm90IHByb3RlY3RlZCBkdWUgdG8gYSBidWcgaW4gZysrIDMuNC4yLgorICBlbnVtIEZhaWx1cmVNb2RlIHsKKyAgICBGQVRBTF9GQUlMVVJFLAorICAgIE5PTkZBVEFMX0ZBSUxVUkUKKyAgfTsKKyAgc3RhdGljIHZvaWQgQWRkRmFpbHVyZShGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgaWYgKGZhaWx1cmUgPT0gRkFUQUxfRkFJTFVSRSkgeworICAgICAgQWRkRmF0YWxGYWlsdXJlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZE5vbmZhdGFsRmFpbHVyZSgpOworICAgIH0KKyAgfQorfTsKKworLy8gVGVzdHMgdGhhdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBpbnRlcmNlcHRzIHRlc3QKKy8vIGZhaWx1cmVzLgorVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCwgSW50ZXJjZXB0c1Rlc3RGYWlsdXJlcykgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAorICAgICAgICAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpOworICB9CisKKyAgRVhQRUNUX0VRKDIsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCwgRGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIC8vIFRlc3RzLCB0aGF0IHRoZSBkZXByZWNhdGVkIGNvbnN0cnVjdG9yIHN0aWxsIHdvcmtzLgorICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKCZyZXN1bHRzKTsKKyAgICBBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpOworICB9CisgIEVYUEVDVF9FUSgxLCByZXN1bHRzLnNpemUoKSk7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisKK2NsYXNzIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0CisgIDogcHVibGljIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgVGhyZWFkV2l0aFBhcmFtPEZhaWx1cmVNb2RlPiB0aHJlYWQoJkFkZEZhaWx1cmUsIGZhaWx1cmUsIE5VTEwpOworICAgIHRocmVhZC5Kb2luKCk7CisgIH0KK307CisKK1RFU1RfRihTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcldpdGhUaHJlYWRzVGVzdCwKKyAgICAgICBJbnRlcmNlcHRzVGVzdEZhaWx1cmVzSW5BbGxUaHJlYWRzKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKAorICAgICAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX0FMTF9USFJFQURTLCAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpOworICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpOworICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpOworICB9CisKKyAgRVhQRUNUX0VRKDQsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgyKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgzKS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKKy8vIFRlc3RzIEVYUEVDVF9GQVRBTF9GQUlMVVJFeyxPTl9BTExfVEhSRUFEU30uICBNYWtlcyBzdXJlIHRoYXQgdGhleQorLy8gd29yayBldmVuIGlmIHRoZSBmYWlsdXJlIGlzIGdlbmVyYXRlZCBpbiBhIGNhbGxlZCBmdW5jdGlvbiByYXRoZXIgdGhhbgorLy8gdGhlIGN1cnJlbnQgY29udGV4dC4KKwordHlwZWRlZiBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QgRXhwZWN0RmF0YWxGYWlsdXJlVGVzdDsKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhdGNoZXNGYXRhbEZhbGl1cmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhdGFsRmFpbHVyZSgpLCA6OnN0cmluZygiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKSk7Cit9CisjZW5kaWYKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNTdGRTdHJpbmdPYmplY3QpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIikpOworfQorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc0ZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBXZSBoYXZlIGFub3RoZXIgdGVzdCBiZWxvdyB0byB2ZXJpZnkgdGhhdCB0aGUgbWFjcm8gY2F0Y2hlcyBmYXRhbAorICAvLyBmYWlsdXJlcyBnZW5lcmF0ZWQgb24gYW5vdGhlciB0aHJlYWQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MKKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIGJlIHVzZWQgaW4gYSBub24tdm9pZAorLy8gZnVuY3Rpb24gZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQgaW4gaXQgY29udGFpbnMgQVNTRVJUXyouCisKK2ludCBOb25Wb2lkRnVuY3Rpb24oKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKGZhbHNlKSwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhGQUlMKCksICIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBDYW5CZVVzZWRJbk5vblZvaWRGdW5jdGlvbikgeworICBOb25Wb2lkRnVuY3Rpb24oKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIC4uLikgZG9lc24ndCBhYm9ydCB0aGUKKy8vIGN1cnJlbnQgZnVuY3Rpb24gZXZlbiB0aG91Z2ggJ3N0YXRlbWVudCcgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZS4KKwordm9pZCBEb2VzTm90QWJvcnRIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShmYWxzZSksICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoRkFJTCgpLCAiIik7CisKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHByZXNzZWQgdGhlbS4KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRG9lc05vdEFib3J0KSB7CisgIGJvb2wgYWJvcnRlZCA9IHRydWU7CisgIERvZXNOb3RBYm9ydEhlbHBlcigmYWJvcnRlZCk7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkV7LF9PTl9BTExfVEhSRUFEU30gYWNjZXB0cyBhCisvLyBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHdoaWNoIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuCisvLyB1bnByb3RlY3RlZCBjb21tYS4KKworc3RhdGljIGludCBnbG9iYWxfdmFyID0gMDsKKyNkZWZpbmUgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXyBnbG9iYWxfdmFyKyssIGdsb2JhbF92YXIrKworCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEpIHsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfOworICAgIEFkZEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7CisjZW5kaWYKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGRGYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRXssT05fQUxMX1RIUkVBRFN9LgorCit0eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCBFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0OworCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc05vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGROb25mYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmluZygiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIikpOworfQorI2VuZGlmCisKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RkU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKSk7Cit9CisKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYXRjaGVzTm9uZmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFdlIGhhdmUgYW5vdGhlciB0ZXN0IGJlbG93IHRvIHZlcmlmeSB0aGF0IHRoZSBtYWNybyBjYXRjaGVzCisgIC8vIG5vbi1mYXRhbCBmYWlsdXJlcyBnZW5lcmF0ZWQgb24gYW5vdGhlciB0aHJlYWQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9IGFjY2VwdHMgYQorLy8gc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB3aGljaCBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbgorLy8gdW5wcm90ZWN0ZWQgY29tbWEuCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV87CisgICAgQWRkTm9uZmF0YWxGYWlsdXJlKCk7CisgIH0sICIiKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGROb25mYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCit0eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0CisgICAgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdDsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKK1RFU1RfRihFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoCisgICAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChOT05GQVRBTF9GQUlMVVJFKSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGVzdHMgdGhlIFRlc3RQcm9wZXJ0eSBjbGFzcy4KKworVEVTVChUZXN0UHJvcGVydHlUZXN0LCBDb25zdHJ1Y3RvcldvcmtzKSB7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgInZhbHVlIik7CisgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoInZhbHVlIiwgcHJvcGVydHkudmFsdWUoKSk7Cit9CisKK1RFU1QoVGVzdFByb3BlcnR5VGVzdCwgU2V0VmFsdWUpIHsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXkiLCAidmFsdWVfMSIpOworICBFWFBFQ1RfU1RSRVEoImtleSIsIHByb3BlcnR5LmtleSgpKTsKKyAgcHJvcGVydHkuU2V0VmFsdWUoInZhbHVlXzIiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgidmFsdWVfMiIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyB0aGUgVGVzdFJlc3VsdCBjbGFzcworCisvLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIFRlc3RSZXN1bHQuCitjbGFzcyBUZXN0UmVzdWx0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IFRQUlZlY3RvcjsKKworICAvLyBXZSBtYWtlIHVzZSBvZiAyIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMsCisgIFRlc3RQYXJ0UmVzdWx0ICogcHIxLCAqIHByMjsKKworICAvLyAuLi4gYW5kIDMgVGVzdFJlc3VsdCBvYmplY3RzLgorICBUZXN0UmVzdWx0ICogcjAsICogcjEsICogcjI7CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIHByMSBpcyBmb3Igc3VjY2Vzcy4KKyAgICBwcjEgPSBuZXcgVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vL2Jhci5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VjY2VzcyEiKTsKKworICAgIC8vIHByMiBpcyBmb3IgZmF0YWwgZmFpbHVyZS4KKyAgICBwcjIgPSBuZXcgVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28vYmFyLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsICAvLyBUaGlzIGxpbmUgbnVtYmVyIG1lYW5zICJ1bmtub3duIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSEiKTsKKworICAgIC8vIENyZWF0ZXMgdGhlIFRlc3RSZXN1bHQgb2JqZWN0cy4KKyAgICByMCA9IG5ldyBUZXN0UmVzdWx0KCk7CisgICAgcjEgPSBuZXcgVGVzdFJlc3VsdCgpOworICAgIHIyID0gbmV3IFRlc3RSZXN1bHQoKTsKKworICAgIC8vIEluIG9yZGVyIHRvIHRlc3QgVGVzdFJlc3VsdCwgd2UgbmVlZCB0byBtb2RpZnkgaXRzIGludGVybmFsCisgICAgLy8gc3RhdGUsIGluIHBhcnRpY3VsYXIgdGhlIFRlc3RQYXJ0UmVzdWx0IHZlY3RvciBpdCBob2xkcy4KKyAgICAvLyB0ZXN0X3BhcnRfcmVzdWx0cygpIHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuCisgICAgLy8gV2UgY2FzdCBpdCB0byBhIG5vbi1jb25zdCBvYmplY3Qgcy50LiBpdCBjYW4gYmUgbW9kaWZpZWQgKHllcywKKyAgICAvLyB0aGlzIGlzIGEgaGFjaykuCisgICAgVFBSVmVjdG9yKiByZXN1bHRzMSA9IGNvbnN0X2Nhc3Q8VFBSVmVjdG9yKj4oCisgICAgICAgICZUZXN0UmVzdWx0QWNjZXNzb3I6OnRlc3RfcGFydF9yZXN1bHRzKCpyMSkpOworICAgIFRQUlZlY3RvciogcmVzdWx0czIgPSBjb25zdF9jYXN0PFRQUlZlY3Rvcio+KAorICAgICAgICAmVGVzdFJlc3VsdEFjY2Vzc29yOjp0ZXN0X3BhcnRfcmVzdWx0cygqcjIpKTsKKworICAgIC8vIHIwIGlzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCisKKyAgICAvLyByMSBjb250YWlucyBhIHNpbmdsZSBTVUNDRVNTIFRlc3RQYXJ0UmVzdWx0LgorICAgIHJlc3VsdHMxLT5wdXNoX2JhY2soKnByMSk7CisKKyAgICAvLyByMiBjb250YWlucyBhIFNVQ0NFU1MsIGFuZCBhIEZBSUxVUkUuCisgICAgcmVzdWx0czItPnB1c2hfYmFjaygqcHIxKTsKKyAgICByZXN1bHRzMi0+cHVzaF9iYWNrKCpwcjIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGRlbGV0ZSBwcjE7CisgICAgZGVsZXRlIHByMjsKKworICAgIGRlbGV0ZSByMDsKKyAgICBkZWxldGUgcjE7CisgICAgZGVsZXRlIHIyOworICB9CisKKyAgLy8gSGVscGVyIHRoYXQgY29tcGFyZXMgdHdvIHR3byBUZXN0UGFydFJlc3VsdHMuCisgIHN0YXRpYyB2b2lkIENvbXBhcmVUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgYWN0dWFsKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnR5cGUoKSwgYWN0dWFsLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmZpbGVfbmFtZSgpLCBhY3R1YWwuZmlsZV9uYW1lKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5saW5lX251bWJlcigpLCBhY3R1YWwubGluZV9udW1iZXIoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLnN1bW1hcnkoKSwgYWN0dWFsLnN1bW1hcnkoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLm1lc3NhZ2UoKSwgYWN0dWFsLm1lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBhc3NlZCgpLCBhY3R1YWwucGFzc2VkKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5mYWlsZWQoKSwgYWN0dWFsLmZhaWxlZCgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubm9uZmF0YWxseV9mYWlsZWQoKSwgYWN0dWFsLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5mYXRhbGx5X2ZhaWxlZCgpLCBhY3R1YWwuZmF0YWxseV9mYWlsZWQoKSk7CisgIH0KK307CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgdG90YWxfcGFydF9jb3VudCkgeworICBBU1NFUlRfRVEoMCwgcjAtPnRvdGFsX3BhcnRfY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCByMS0+dG90YWxfcGFydF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDIsIHIyLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpQYXNzZWQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgUGFzc2VkKSB7CisgIEFTU0VSVF9UUlVFKHIwLT5QYXNzZWQoKSk7CisgIEFTU0VSVF9UUlVFKHIxLT5QYXNzZWQoKSk7CisgIEFTU0VSVF9GQUxTRShyMi0+UGFzc2VkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpGYWlsZWQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgRmFpbGVkKSB7CisgIEFTU0VSVF9GQUxTRShyMC0+RmFpbGVkKCkpOworICBBU1NFUlRfRkFMU0UocjEtPkZhaWxlZCgpKTsKKyAgQVNTRVJUX1RSVUUocjItPkZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoKS4KKwordHlwZWRlZiBUZXN0UmVzdWx0VGVzdCBUZXN0UmVzdWx0RGVhdGhUZXN0OworCitURVNUX0YoVGVzdFJlc3VsdERlYXRoVGVzdCwgR2V0VGVzdFBhcnRSZXN1bHQpIHsKKyAgQ29tcGFyZVRlc3RQYXJ0UmVzdWx0KCpwcjEsIHIyLT5HZXRUZXN0UGFydFJlc3VsdCgwKSk7CisgIENvbXBhcmVUZXN0UGFydFJlc3VsdCgqcHIyLCByMi0+R2V0VGVzdFBhcnRSZXN1bHQoMSkpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHIyLT5HZXRUZXN0UGFydFJlc3VsdCgyKSwgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHIyLT5HZXRUZXN0UGFydFJlc3VsdCgtMSksICIiKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgbm8gcHJvcGVydGllcyB3aGVuIG5vbmUgYXJlIGFkZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBOb1Byb3BlcnRpZXNGb3VuZFdoZW5Ob25lQXJlQWRkZWQpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKDAsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIHRoZSBleHBlY3RlZCBwcm9wZXJ0eSB3aGVuIGFkZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBPbmVQcm9wZXJ0eUZvdW5kV2hlbkFkZGVkKSB7CisgIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgcHJvcGVydHkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHkgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7CisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBhY3R1YWxfcHJvcGVydHkudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIG11bHRpcGxlIHByb3BlcnRpZXMgd2hlbiBhZGRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgTXVsdGlwbGVQcm9wZXJ0aWVzRm91bmRXaGVuQWRkZWQpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzEoImtleV8xIiwgIjEiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzIoImtleV8yIiwgIjIiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgcHJvcGVydHlfMik7CisgIEFTU0VSVF9FUSgyLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8xID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwgYWN0dWFsX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBhY3R1YWxfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8yID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDEpOworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgYWN0dWFsX3Byb3BlcnR5XzIua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIiLCBhY3R1YWxfcHJvcGVydHlfMi52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoKSBvdmVycmlkZXMgdmFsdWVzIGZvciBkdXBsaWNhdGUga2V5cy4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgT3ZlcnJpZGVzVmFsdWVzRm9yRHVwbGljYXRlS2V5cykgeworICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMV8xKCJrZXlfMSIsICIxIik7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8yXzEoImtleV8yIiwgIjIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzFfMigia2V5XzEiLCAiMTIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzJfMigia2V5XzIiLCAiMjIiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzFfMSk7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eV8yXzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgcHJvcGVydHlfMV8yKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzJfMik7CisKKyAgQVNTRVJUX0VRKDIsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5XzEgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7CisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHlfMS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMTIiLCBhY3R1YWxfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8yID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDEpOworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgYWN0dWFsX3Byb3BlcnR5XzIua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIyIiwgYWN0dWFsX3Byb3BlcnR5XzIudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eSgpLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlEZWF0aFRlc3QsIEdldFRlc3RQcm9wZXJ0eSkgeworICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMSgia2V5XzEiLCAiMSIpOworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMigia2V5XzIiLCAiMiIpOworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMygia2V5XzMiLCAiMyIpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgcHJvcGVydHlfMSk7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eV8yKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzMpOworCisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgZmV0Y2hlZF9wcm9wZXJ0eV8xID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOworICBjb25zdCBUZXN0UHJvcGVydHkmIGZldGNoZWRfcHJvcGVydHlfMiA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgxKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBmZXRjaGVkX3Byb3BlcnR5XzMgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMik7CisKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsIGZldGNoZWRfcHJvcGVydHlfMS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMSIsIGZldGNoZWRfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgZmV0Y2hlZF9wcm9wZXJ0eV8yLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIyIiwgZmV0Y2hlZF9wcm9wZXJ0eV8yLnZhbHVlKCkpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzMiLCBmZXRjaGVkX3Byb3BlcnR5XzMua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjMiLCBmZXRjaGVkX3Byb3BlcnR5XzMudmFsdWUoKSk7CisKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMyksICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoLTEpLCAiIik7Cit9CisKKy8vIFdoZW4gYSBwcm9wZXJ0eSB1c2luZyBhIHJlc2VydmVkIGtleSBpcyBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uLCBpdCB0ZXN0cworLy8gdGhhdCBhIG5vbi1mYXRhbCBmYWlsdXJlIGlzIGFkZGVkLCBhIGZhdGFsIGZhaWx1cmUgaXMgbm90IGFkZGVkLCBhbmQgdGhhdCB0aGUKKy8vIHByb3BlcnR5IGlzIG5vdCByZWNvcmRlZC4KK3ZvaWQgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoY29uc3QgY2hhcioga2V5KSB7CisgIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eShrZXksICIxIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5KSwKKyAgICAgICJSZXNlcnZlZCBrZXkiKTsKKyAgQVNTRVJUX0VRKDAsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSkgPDwgIk5vdCByZWNvcmRlZCI7Cit9CisKKy8vIEF0dGVtcHRpbmcgdG8gcmVjb3JkaW5nIGEgcHJvcGVydHkgd2l0aCB0aGUgUmVzZXJ2ZWQgbGl0ZXJhbCAibmFtZSIKKy8vIHNob3VsZCBhZGQgYSBub24tZmF0YWwgZmFpbHVyZSBhbmQgdGhlIHByb3BlcnR5IHNob3VsZCBub3QgYmUgcmVjb3JkZWQuCitURVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIEFkZEZhaWx1cmVXaGVuVXNpbmdSZXNlcnZlZEtleUNhbGxlZE5hbWUpIHsKKyAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoIm5hbWUiKTsKK30KKworLy8gQXR0ZW1wdGluZyB0byByZWNvcmRpbmcgYSBwcm9wZXJ0eSB3aXRoIHRoZSBSZXNlcnZlZCBsaXRlcmFsICJzdGF0dXMiCisvLyBzaG91bGQgYWRkIGEgbm9uLWZhdGFsIGZhaWx1cmUgYW5kIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHJlY29yZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBBZGRGYWlsdXJlV2hlblVzaW5nUmVzZXJ2ZWRLZXlDYWxsZWRTdGF0dXMpIHsKKyAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoInN0YXR1cyIpOworfQorCisvLyBBdHRlbXB0aW5nIHRvIHJlY29yZGluZyBhIHByb3BlcnR5IHdpdGggdGhlIFJlc2VydmVkIGxpdGVyYWwgInRpbWUiCisvLyBzaG91bGQgYWRkIGEgbm9uLWZhdGFsIGZhaWx1cmUgYW5kIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHJlY29yZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBBZGRGYWlsdXJlV2hlblVzaW5nUmVzZXJ2ZWRLZXlDYWxsZWRUaW1lKSB7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KCJ0aW1lIik7Cit9CisKKy8vIEF0dGVtcHRpbmcgdG8gcmVjb3JkaW5nIGEgcHJvcGVydHkgd2l0aCB0aGUgUmVzZXJ2ZWQgbGl0ZXJhbCAiY2xhc3NuYW1lIgorLy8gc2hvdWxkIGFkZCBhIG5vbi1mYXRhbCBmYWlsdXJlIGFuZCB0aGUgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSByZWNvcmRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgQWRkRmFpbHVyZVdoZW5Vc2luZ1Jlc2VydmVkS2V5Q2FsbGVkQ2xhc3NuYW1lKSB7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KCJjbGFzc25hbWUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBHVGVzdEZsYWdTYXZlciB3b3JrcyBvbiBXaW5kb3dzIGFuZCBNYWMuCisKK2NsYXNzIEdUZXN0RmxhZ1NhdmVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFNhdmVzIHRoZSBHb29nbGUgVGVzdCBmbGFncyBzdWNoIHRoYXQgd2UgY2FuIHJlc3RvcmUgdGhlbSBsYXRlciwgYW5kCisgIC8vIHRoZW4gc2V0cyB0aGVtIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAgVGhpcyB3aWxsIGJlIGNhbGxlZAorICAvLyBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UgaXMgcnVuLgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIHNhdmVyXyA9IG5ldyBHVGVzdEZsYWdTYXZlcjsKKworICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhjb2xvcikgPSAiYXV0byI7CisgICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gIiI7CisgICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICIiOworICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSB0cnVlOworICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gMDsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSAxOworICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IGtNYXhTdGFja1RyYWNlRGVwdGg7CisgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9ICIiOworICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSBmYWxzZTsKKyAgfQorCisgIC8vIFJlc3RvcmVzIHRoZSBHb29nbGUgVGVzdCBmbGFncyB0aGF0IHRoZSB0ZXN0cyBoYXZlIG1vZGlmaWVkLiAgVGhpcyB3aWxsCisgIC8vIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIGlzIHJ1bi4KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBkZWxldGUgc2F2ZXJfOworICAgIHNhdmVyXyA9IE5VTEw7CisgIH0KKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBHb29nbGUgVGVzdCBmbGFncyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlbgorICAvLyBtb2RpZmllcyBlYWNoIG9mIHRoZW0uCisgIHZvaWQgVmVyaWZ5QW5kTW9kaWZ5RmxhZ3MoKSB7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpOworICAgIEVYUEVDVF9TVFJFUSgiYXV0byIsIEdURVNUX0ZMQUcoY29sb3IpLmNfc3RyKCkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUoR1RFU1RfRkxBRyhwcmludF90aW1lKSk7CisgICAgRVhQRUNUX0VRKDAsIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKTsKKyAgICBFWFBFQ1RfRVEoMSwgR1RFU1RfRkxBRyhyZXBlYXQpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhzaHVmZmxlKSk7CisgICAgRVhQRUNUX0VRKGtNYXhTdGFja1RyYWNlRGVwdGgsIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykuY19zdHIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpOworCisgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSB0cnVlOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSB0cnVlOworICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSB0cnVlOworICAgIEdURVNUX0ZMQUcoY29sb3IpID0gIm5vIjsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiYWJjIjsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZvby54bWwiOworICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IDE7CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gMTAwOworICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSB0cnVlOworICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0gMTsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gImxvY2FsaG9zdDoxMjM0IjsKKyAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKyAgfQorIHByaXZhdGU6CisgIC8vIEZvciBzYXZpbmcgR29vZ2xlIFRlc3QgZmxhZ3MgZHVyaW5nIHRoaXMgdGVzdCBjYXNlLgorICBzdGF0aWMgR1Rlc3RGbGFnU2F2ZXIqIHNhdmVyXzsKK307CisKK0dUZXN0RmxhZ1NhdmVyKiBHVGVzdEZsYWdTYXZlclRlc3Q6OnNhdmVyXyA9IE5VTEw7CisKKy8vIEdvb2dsZSBUZXN0IGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBvZiB0ZXN0cy4gIFRoZSBmb2xsb3dpbmcgdHdvCisvLyB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gd29yayByZWdhcmRsZXNzIG9mIHRoZWlyIG9yZGVyLgorCisvLyBNb2RpZmllcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gdGhlIHRlc3QgYm9keS4KK1RFU1RfRihHVGVzdEZsYWdTYXZlclRlc3QsIE1vZGlmeUdUZXN0RmxhZ3MpIHsKKyAgVmVyaWZ5QW5kTW9kaWZ5RmxhZ3MoKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gdGhlIGJvZHkgb2YgdGhlIHByZXZpb3VzIHRlc3Qgd2VyZQorLy8gcmVzdG9yZWQgdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLgorVEVTVF9GKEdUZXN0RmxhZ1NhdmVyVGVzdCwgVmVyaWZ5R1Rlc3RGbGFncykgeworICBWZXJpZnlBbmRNb2RpZnlGbGFncygpOworfQorCisvLyBTZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlIGdpdmVuCisvLyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBhcmd1bWVudCBpcyAiIiwgdW5zZXRzIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGUuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYm90aCBhcmd1bWVudHMgYXJlIG5vdCBOVUxMLgorc3RhdGljIHZvaWQgU2V0RW52KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCisgIHJldHVybjsKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQorICAvLyBDKytCdWlsZGVyJ3MgcHV0ZW52IG9ubHkgc3RvcmVzIGEgcG9pbnRlciB0byBpdHMgcGFyYW1ldGVyOyB3ZSBoYXZlIHRvCisgIC8vIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIGl0IG1pZ2h0IGJlIG5lZWRlZC4KKyAgLy8gV2UgdXNlIGFuIHN0ZDo6bWFwIHRvIGRvIHNvLgorICBzdGF0aWMgc3RkOjptYXA8U3RyaW5nLCBTdHJpbmcqPiBhZGRlZF9lbnY7CisKKyAgLy8gQmVjYXVzZSBwdXRlbnYgc3RvcmVzIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGJ1ZmZlciwgd2UgY2FuJ3QgZGVsZXRlIHRoZQorICAvLyBwcmV2aW91cyBzdHJpbmcgKGlmIHByZXNlbnQpIHVudGlsIGFmdGVyIGl0J3MgcmVwbGFjZWQuCisgIFN0cmluZyAqcHJldl9lbnYgPSBOVUxMOworICBpZiAoYWRkZWRfZW52LmZpbmQobmFtZSkgIT0gYWRkZWRfZW52LmVuZCgpKSB7CisgICAgcHJldl9lbnYgPSBhZGRlZF9lbnZbbmFtZV07CisgIH0KKyAgYWRkZWRfZW52W25hbWVdID0gbmV3IFN0cmluZygoTWVzc2FnZSgpIDw8IG5hbWUgPDwgIj0iIDw8IHZhbHVlKS5HZXRTdHJpbmcoKSk7CisKKyAgLy8gVGhlIHN0YW5kYXJkIHNpZ25hdHVyZSBvZiBwdXRlbnYgYWNjZXB0cyBhICdjaGFyKicgYXJndW1lbnQuIE90aGVyCisgIC8vIGltcGxlbWVudGF0aW9ucywgbGlrZSBDKytCdWlsZGVyJ3MsIGFjY2VwdCBhICdjb25zdCBjaGFyKicuCisgIC8vIFdlIGNhc3QgYXdheSB0aGUgJ2NvbnN0JyBzaW5jZSB0aGF0IHdvdWxkIHdvcmsgZm9yIGJvdGggdmFyaWFudHMuCisgIHB1dGVudihjb25zdF9jYXN0PGNoYXIqPihhZGRlZF9lbnZbbmFtZV0tPmNfc3RyKCkpKTsKKyAgZGVsZXRlIHByZXZfZW52OworI2VsaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gSWYgd2UgYXJlIG9uIFdpbmRvd3MgcHJvcGVyLgorICBfcHV0ZW52KChNZXNzYWdlKCkgPDwgbmFtZSA8PCAiPSIgPDwgdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOworI2Vsc2UKKyAgaWYgKCp2YWx1ZSA9PSAnXDAnKSB7CisgICAgdW5zZXRlbnYobmFtZSk7CisgIH0gZWxzZSB7CisgICAgc2V0ZW52KG5hbWUsIHZhbHVlLCAxKTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRS4KKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52OworCisvLyBUZXN0cyBJbnQzMkZyb21HVGVzdEVudigpLgorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUdUZXN0RW52KCkgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuIHRoZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4KK1RFU1QoSW50MzJGcm9tR1Rlc3RFbnZUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYXJpYWJsZUlzTm90U2V0KSB7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiIik7CisgIEVYUEVDVF9FUSgxMCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAxMCkpOworfQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUdUZXN0RW52KCkgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuIHRoZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcmZsb3dzIGFzIGFuIEludDMyLgorVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhbHVlT3ZlcmZsb3dzKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyAyIHdhcm5pbmdzKVxuIik7CisKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIxMjM0NTY3ODk4NzY1NDMyMSIpOworICBFWFBFQ1RfRVEoMjAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMjApKTsKKworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIi0xMjM0NTY3ODk4NzY1NDMyMSIpOworICBFWFBFQ1RfRVEoMzAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMzApKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRlY2ltYWwgaW50ZWdlci4KK1RFU1QoSW50MzJGcm9tR1Rlc3RFbnZUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZUlzSW52YWxpZCkgeworICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiQTEiKTsKKyAgRVhQRUNUX0VRKDQwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDQwKSk7CisKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIxMlgiKTsKKyAgRVhQRUNUX0VRKDUwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDUwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSBwYXJzZXMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBpdCByZXByZXNlbnRzIGEgdmFsaWQgZGVjaW1hbCBpbnRlZ2VyIGluCisvLyB0aGUgcmFuZ2Ugb2YgYW4gSW50MzIuCitURVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUGFyc2VzQW5kUmV0dXJuc1ZhbGlkVmFsdWUpIHsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIxMjMiKTsKKyAgRVhQRUNUX0VRKDEyMywgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAwKSk7CisKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICItMzIxIik7CisgIEVYUEVDVF9FUSgtMzIxLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDApKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFRlc3RzIFBhcnNlSW50MzJGbGFnKCkuCisKKy8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IGNoYW5nZSB0aGUKKy8vIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBmbGFnIGhhcyB3cm9uZyBmb3JtYXQKK1RFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBSZXR1cm5zRmFsc2VGb3JJbnZhbGlkRmxhZykgeworICBJbnQzMiB2YWx1ZSA9IDEyMzsKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWE9MTAwIiwgImIiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiYT0xMDAiLCAiYSIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IGNoYW5nZSB0aGUKKy8vIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBmbGFnIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KK1RFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZU92ZXJmbG93cykgeworICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOworCisgIEludDMyIHZhbHVlID0gMTIzOworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYWJjPTEyMzQ1Njc4OTg3NjU0MzIxIiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7CisKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz0tMTIzNDU2Nzg5ODc2NTQzMjEiLCAiYWJjIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBQYXJzZUludDMyRmxhZygpIHJldHVybnMgZmFsc2UgYW5kIGRvZXNuJ3QgY2hhbmdlIHRoZQorLy8gb3V0cHV0IHZhbHVlIHdoZW4gdGhlIGZsYWcgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgZGVjaW1hbAorLy8gaW50ZWdlci4KK1RFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZUlzSW52YWxpZCkgeworICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOworCisgIEludDMyIHZhbHVlID0gMTIzOworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYWJjPUExIiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7CisKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz0xMlgiLCAiYWJjIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBQYXJzZUludDMyRmxhZygpIHBhcnNlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYW5kCisvLyByZXR1cm5zIHRydWUgd2hlbiB0aGUgZmxhZyByZXByZXNlbnRzIGEgdmFsaWQgZGVjaW1hbCBpbnRlZ2VyIGluCisvLyB0aGUgcmFuZ2Ugb2YgYW4gSW50MzIuCitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUGFyc2VzQW5kUmV0dXJuc1ZhbGlkVmFsdWUpIHsKKyAgSW50MzIgdmFsdWUgPSAxMjM7CisgIEVYUEVDVF9UUlVFKFBhcnNlSW50MzJGbGFnKCItLSIgR1RFU1RfRkxBR19QUkVGSVhfICJhYmM9NDU2IiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoNDU2LCB2YWx1ZSk7CisKKyAgRVhQRUNUX1RSVUUoUGFyc2VJbnQzMkZsYWcoIi0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFiYz0tNzg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoLTc4OSwgdmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUVudk9yRGllKCkgcGFyc2VzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyIG9yCisvLyByZXR1cm5zIHRoZSBjb3JyZWN0IGRlZmF1bHQuCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRS4KKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK1RFU1QoSW50MzJGcm9tRW52T3JEaWVUZXN0LCBQYXJzZXNBbmRSZXR1cm5zVmFsaWRWYWx1ZSkgeworICBFWFBFQ1RfRVEoMzMzLCBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgMzMzKSk7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgIjEyMyIpOworICBFWFBFQ1RfRVEoMTIzLCBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgMzMzKSk7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgIi0xMjMiKTsKKyAgRVhQRUNUX0VRKC0xMjMsIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVW5zZXRWYXIiLCAzMzMpKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tRW52T3JEaWUoKSBhYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlCisvLyBpZiB0aGUgdmFyaWFibGUgaXMgbm90IGFuIEludDMyLgorVEVTVChJbnQzMkZyb21FbnZPckRpZURlYXRoVGVzdCwgQWJvcnRzT25GYWlsdXJlKSB7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsICJ4eHgiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVkFSIiwgMTIzKSwKKyAgICAgICIuKiIpOworfQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUVudk9yRGllKCkgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZQorLy8gaWYgdGhlIHZhcmlhYmxlIGNhbm5vdCBiZSByZXByZXNudGVkIGJ5IGFuIEludDMyLgorVEVTVChJbnQzMkZyb21FbnZPckRpZURlYXRoVGVzdCwgQWJvcnRzT25JbnQzMk92ZXJmbG93KSB7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsICIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0Iik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsIDEyMyksCisgICAgICAiLioiKTsKK30KKworLy8gVGVzdHMgdGhhdCBTaG91bGRSdW5UZXN0T25TaGFyZCgpIHNlbGVjdHMgYWxsIHRlc3RzCisvLyB3aGVyZSB0aGVyZSBpcyAxIHNoYXJkLgorVEVTVChTaG91bGRSdW5UZXN0T25TaGFyZFRlc3QsIElzUGFydGl0aW9uV2hlblRoZXJlSXNPbmVTaGFyZCkgeworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAwKSk7CisgIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDEpKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMikpOworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAzKSk7CisgIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDQpKTsKK30KKworY2xhc3MgU2hvdWxkU2hhcmRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGluZGV4X3Zhcl8gPSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIklOREVYIjsKKyAgICB0b3RhbF92YXJfID0gR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJUT1RBTCI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgU2V0RW52KGluZGV4X3Zhcl8sICIiKTsKKyAgICBTZXRFbnYodG90YWxfdmFyXywgIiIpOworICB9CisKKyAgY29uc3QgY2hhciogaW5kZXhfdmFyXzsKKyAgY29uc3QgY2hhciogdG90YWxfdmFyXzsKK307CisKKy8vIFRlc3RzIHRoYXQgc2hhcmRpbmcgaXMgZGlzYWJsZWQgaWYgbmVpdGhlciBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisvLyBhcmUgc2V0LgorVEVTVF9GKFNob3VsZFNoYXJkVGVzdCwgUmV0dXJuc0ZhbHNlV2hlbk5laXRoZXJFbnZWYXJJc1NldCkgeworICBTZXRFbnYoaW5kZXhfdmFyXywgIiIpOworICBTZXRFbnYodG90YWxfdmFyXywgIiIpOworCisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOworfQorCisvLyBUZXN0cyB0aGF0IHNoYXJkaW5nIGlzIG5vdCBlbmFibGVkIGlmIHRvdGFsX3NoYXJkcyAgPT0gMS4KK1RFU1RfRihTaG91bGRTaGFyZFRlc3QsIFJldHVybnNGYWxzZVdoZW5Ub3RhbFNoYXJkSXNPbmUpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIwIik7CisgIFNldEVudih0b3RhbF92YXJfLCAiMSIpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKK30KKworLy8gVGVzdHMgdGhhdCBzaGFyZGluZyBpcyBlbmFibGVkIGlmIHRvdGFsX3NoYXJkcyA+IDEgYW5kCisvLyB3ZSBhcmUgbm90IGluIGEgZGVhdGggdGVzdCBzdWJwcm9jZXNzLgorLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitURVNUX0YoU2hvdWxkU2hhcmRUZXN0LCBXb3Jrc1doZW5TaGFyZEVudlZhcnNBcmVWYWxpZCkgeworICBTZXRFbnYoaW5kZXhfdmFyXywgIjQiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICIyMiIpOworICBFWFBFQ1RfVFJVRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOworCisgIFNldEVudihpbmRleF92YXJfLCAiOCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjkiKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKKworICBTZXRFbnYoaW5kZXhfdmFyXywgIjAiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICI5Iik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBUZXN0cyB0aGF0IHdlIGV4aXQgaW4gZXJyb3IgaWYgdGhlIHNoYXJkaW5nIHZhbHVlcyBhcmUgbm90IHZhbGlkLgorCit0eXBlZGVmIFNob3VsZFNoYXJkVGVzdCBTaG91bGRTaGFyZERlYXRoVGVzdDsKKworVEVTVF9GKFNob3VsZFNoYXJkRGVhdGhUZXN0LCBBYm9ydHNXaGVuU2hhcmRpbmdFbnZWYXJzQXJlSW52YWxpZCkgeworICBTZXRFbnYoaW5kZXhfdmFyXywgIjQiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICI0Iik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKKworICBTZXRFbnYoaW5kZXhfdmFyXywgIjQiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICItMiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI1Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKKworICBTZXRFbnYoaW5kZXhfdmFyXywgIiIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjUiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSksICIuKiIpOworfQorCisvLyBUZXN0cyB0aGF0IFNob3VsZFJ1blRlc3RPblNoYXJkIGlzIGEgcGFydGl0aW9uIHdoZW4gNQorLy8gc2hhcmRzIGFyZSB1c2VkLgorVEVTVChTaG91bGRSdW5UZXN0T25TaGFyZFRlc3QsIElzUGFydGl0aW9uV2hlblRoZXJlQXJlRml2ZVNoYXJkcykgeworICAvLyBDaG9vc2UgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0ZXN0cyBhbmQgc2hhcmRzLgorICBjb25zdCBpbnQgbnVtX3Rlc3RzID0gMTc7CisgIGNvbnN0IGludCBudW1fc2hhcmRzID0gNTsKKworICAvLyBDaGVjayBwYXJ0aXRpb25pbmc6IGVhY2ggdGVzdCBzaG91bGQgYmUgb24gZXhhY3RseSAxIHNoYXJkLgorICBmb3IgKGludCB0ZXN0X2lkID0gMDsgdGVzdF9pZCA8IG51bV90ZXN0czsgdGVzdF9pZCsrKSB7CisgICAgaW50IHByZXZfc2VsZWN0ZWRfc2hhcmRfaW5kZXggPSAtMTsKKyAgICBmb3IgKGludCBzaGFyZF9pbmRleCA9IDA7IHNoYXJkX2luZGV4IDwgbnVtX3NoYXJkczsgc2hhcmRfaW5kZXgrKykgeworICAgICAgaWYgKFNob3VsZFJ1blRlc3RPblNoYXJkKG51bV9zaGFyZHMsIHNoYXJkX2luZGV4LCB0ZXN0X2lkKSkgeworICAgICAgICBpZiAocHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA8IDApIHsKKyAgICAgICAgICBwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4ID0gc2hhcmRfaW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiU2hhcmQgIiA8PCBwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4IDw8ICIgYW5kICIKKyAgICAgICAgICAgIDw8IHNoYXJkX2luZGV4IDw8ICIgYXJlIGJvdGggc2VsZWN0ZWQgdG8gcnVuIHRlc3QgIiA8PCB0ZXN0X2lkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgYmFsYW5jZTogVGhpcyBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIHNoYXJkaW5nIHByb3RvY29sLCBidXQgaXMgYQorICAvLyBkZXNpcmFibGUgcHJvcGVydHkgZm9yIHBlcmZvcm1hbmNlLgorICBmb3IgKGludCBzaGFyZF9pbmRleCA9IDA7IHNoYXJkX2luZGV4IDwgbnVtX3NoYXJkczsgc2hhcmRfaW5kZXgrKykgeworICAgIGludCBudW1fdGVzdHNfb25fc2hhcmQgPSAwOworICAgIGZvciAoaW50IHRlc3RfaWQgPSAwOyB0ZXN0X2lkIDwgbnVtX3Rlc3RzOyB0ZXN0X2lkKyspIHsKKyAgICAgIG51bV90ZXN0c19vbl9zaGFyZCArPQorICAgICAgICBTaG91bGRSdW5UZXN0T25TaGFyZChudW1fc2hhcmRzLCBzaGFyZF9pbmRleCwgdGVzdF9pZCk7CisgICAgfQorICAgIEVYUEVDVF9HRShudW1fdGVzdHNfb25fc2hhcmQsIG51bV90ZXN0cyAvIG51bV9zaGFyZHMpOworICB9Cit9CisKKy8vIEZvciB0aGUgc2FtZSByZWFzb24gd2UgYXJlIG5vdCBleHBsaWNpdGx5IHRlc3RpbmcgZXZlcnl0aGluZyBpbiB0aGUKKy8vIFRlc3QgY2xhc3MsIHRoZXJlIGFyZSBubyBzZXBhcmF0ZSB0ZXN0cyBmb3IgdGhlIGZvbGxvd2luZyBjbGFzc2VzCisvLyAoZXhjZXB0IGZvciBzb21lIHRyaXZpYWwgY2FzZXMpOgorLy8KKy8vICAgVGVzdENhc2UsIFVuaXRUZXN0LCBVbml0VGVzdFJlc3VsdFByaW50ZXIuCisvLworLy8gU2ltaWxhcmx5LCB0aGVyZSBhcmUgbm8gc2VwYXJhdGUgdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorLy8KKy8vICAgVEVTVCwgVEVTVF9GLCBSVU5fQUxMX1RFU1RTCisKK1RFU1QoVW5pdFRlc3RUZXN0LCBDYW5HZXRPcmlnaW5hbFdvcmtpbmdEaXIpIHsKKyAgQVNTRVJUX1RSVUUoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgIT0gTlVMTCk7CisgIEVYUEVDVF9TVFJORShVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSwgIiIpOworfQorCisvLyBUaGlzIGdyb3VwIG9mIHRlc3RzIGlzIGZvciBwcmVkaWNhdGUgYXNzZXJ0aW9ucyAoQVNTRVJUX1BSRUQqLCBldGMpCisvLyBvZiB2YXJpb3VzIGFyaXRpZXMuICBUaGV5IGRvIG5vdCBhdHRlbXB0IHRvIGJlIGV4aGF1c3RpdmUuICBSYXRoZXIsCisvLyB2aWV3IHRoZW0gYXMgc21va2UgdGVzdHMgdGhhdCBjYW4gYmUgZWFzaWx5IHJldmlld2VkIGFuZCB2ZXJpZmllZC4KKy8vIEEgbW9yZSBjb21wbGV0ZSBzZXQgb2YgdGVzdHMgZm9yIHByZWRpY2F0ZSBhc3NlcnRpb25zIGNhbiBiZSBmb3VuZAorLy8gaW4gZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjLgorCisvLyBGaXJzdCwgc29tZSBwcmVkaWNhdGVzIGFuZCBwcmVkaWNhdGUtZm9ybWF0dGVycyBuZWVkZWQgYnkgdGhlIHRlc3RzLgorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhcmd1bWVudCBpcyBhbiBldmVuIG51bWJlci4KK2Jvb2wgSXNFdmVuKGludCBuKSB7CisgIHJldHVybiAobiAlIDIpID09IDA7Cit9CisKKy8vIEEgZnVuY3RvciB0aGF0IHJldHVybnMgdHJ1ZSBpZmYgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4gbnVtYmVyLgorc3RydWN0IElzRXZlbkZ1bmN0b3IgeworICBib29sIG9wZXJhdG9yKCkoaW50IG4pIHsgcmV0dXJuIElzRXZlbihuKTsgfQorfTsKKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uIHRoYXQgYXNzZXJ0cyB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbgorLy8gbnVtYmVyLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydElzRXZlbihjb25zdCBjaGFyKiBleHByLCBpbnQgbikgeworICBpZiAoSXNFdmVuKG4pKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IG4gPDwgIiwgd2hpY2ggaXMgbm90IGV2ZW4uIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworLy8gQSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIEFzc2VydGlvblJlc3VsdCBmb3IgdXNlIGluCisvLyBFWFBFQ1QvQVNTRVJUX1RSVUUvRkFMU0UuCitBc3NlcnRpb25SZXN1bHQgUmVzdWx0SXNFdmVuKGludCBuKSB7CisgIGlmIChJc0V2ZW4obikpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisgIGVsc2UKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorCisvLyBBIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgQXNzZXJ0aW9uUmVzdWx0IGJ1dCBnaXZlcyBubworLy8gZXhwbGFuYXRpb24gd2h5IGl0IHN1Y2NlZWRzLiBOZWVkZWQgZm9yIHRlc3RpbmcgdGhhdAorLy8gRVhQRUNUL0FTU0VSVF9GQUxTRSBoYW5kbGVzIHN1Y2ggZnVuY3Rpb25zIGNvcnJlY3RseS4KK0Fzc2VydGlvblJlc3VsdCBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKGludCBuKSB7CisgIGlmIChJc0V2ZW4obikpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgZWxzZQorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Cit9CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yIHRoYXQgYXNzZXJ0cyB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbgorLy8gbnVtYmVyLgorc3RydWN0IEFzc2VydElzRXZlbkZ1bmN0b3IgeworICBBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBleHByLCBpbnQgbikgeworICAgIHJldHVybiBBc3NlcnRJc0V2ZW4oZXhwciwgbik7CisgIH0KK307CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHN1bSBvZiB0aGUgYXJndW1lbnRzIGlzIGFuIGV2ZW4gbnVtYmVyLgorYm9vbCBTdW1Jc0V2ZW4yKGludCBuMSwgaW50IG4yKSB7CisgIHJldHVybiBJc0V2ZW4objEgKyBuMik7Cit9CisKKy8vIEEgZnVuY3RvciB0aGF0IHJldHVybnMgdHJ1ZSBpZmYgdGhlIHN1bSBvZiB0aGUgYXJndW1lbnRzIGlzIGFuIGV2ZW4KKy8vIG51bWJlci4KK3N0cnVjdCBTdW1Jc0V2ZW4zRnVuY3RvciB7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgbjEsIGludCBuMiwgaW50IG4zKSB7CisgICAgcmV0dXJuIElzRXZlbihuMSArIG4yICsgbjMpOworICB9Cit9OworCisvLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24gdGhhdCBhc3NlcnRzIHRoZSBzdW0gb2YgdGhlCisvLyBhcmd1bWVudHMgaXMgYW4gZXZlbiBudW1iZXIuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0U3VtSXNFdmVuNCgKKyAgICBjb25zdCBjaGFyKiBlMSwgY29uc3QgY2hhciogZTIsIGNvbnN0IGNoYXIqIGUzLCBjb25zdCBjaGFyKiBlNCwKKyAgICBpbnQgbjEsIGludCBuMiwgaW50IG4zLCBpbnQgbjQpIHsKKyAgY29uc3QgaW50IHN1bSA9IG4xICsgbjIgKyBuMyArIG40OworICBpZiAoSXNFdmVuKHN1bSkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMyA8PCAiICsgIiA8PCBlNAorICAgICAgPDwgIiAoIiA8PCBuMSA8PCAiICsgIiA8PCBuMiA8PCAiICsgIiA8PCBuMyA8PCAiICsgIiA8PCBuNAorICAgICAgPDwgIikgZXZhbHVhdGVzIHRvICIgPDwgc3VtIDw8ICIsIHdoaWNoIGlzIG5vdCBldmVuLiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yIHRoYXQgYXNzZXJ0cyB0aGUgc3VtIG9mIHRoZSBhcmd1bWVudHMKKy8vIGlzIGFuIGV2ZW4gbnVtYmVyLgorc3RydWN0IEFzc2VydFN1bUlzRXZlbjVGdW5jdG9yIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoCisgICAgICBjb25zdCBjaGFyKiBlMSwgY29uc3QgY2hhciogZTIsIGNvbnN0IGNoYXIqIGUzLCBjb25zdCBjaGFyKiBlNCwKKyAgICAgIGNvbnN0IGNoYXIqIGU1LCBpbnQgbjEsIGludCBuMiwgaW50IG4zLCBpbnQgbjQsIGludCBuNSkgeworICAgIGNvbnN0IGludCBzdW0gPSBuMSArIG4yICsgbjMgKyBuNCArIG41OworICAgIGlmIChJc0V2ZW4oc3VtKSkgeworICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBNZXNzYWdlIG1zZzsKKyAgICBtc2cgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQgPDwgIiArICIgPDwgZTUKKyAgICAgICAgPDwgIiAoIgorICAgICAgICA8PCBuMSA8PCAiICsgIiA8PCBuMiA8PCAiICsgIiA8PCBuMyA8PCAiICsgIiA8PCBuNCA8PCAiICsgIiA8PCBuNQorICAgICAgICA8PCAiKSBldmFsdWF0ZXMgdG8gIiA8PCBzdW0gPDwgIiwgd2hpY2ggaXMgbm90IGV2ZW4uIjsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOworICB9Cit9OworCisKKy8vIFRlc3RzIHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBUZXN0cyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IGRvbid0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWQxVGVzdCwgV2l0aG91dEZvcm1hdCkgeworICAvLyBTdWNjZXNzIGNhc2VzLgorICBFWFBFQ1RfUFJFRDEoSXNFdmVuRnVuY3RvcigpLCAyKSA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgQVNTRVJUX1BSRUQxKElzRXZlbiwgNCk7CisKKyAgLy8gRmFpbHVyZSBjYXNlcy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKElzRXZlbiwgNSkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfUFJFRDEoSXNFdmVuRnVuY3RvcigpLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgImV2YWx1YXRlcyB0byBmYWxzZSIpOworfQorCisvLyBUZXN0cyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWQxVGVzdCwgV2l0aEZvcm1hdCkgeworICAvLyBTdWNjZXNzIGNhc2VzLgorICBFWFBFQ1RfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbiwgMik7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuRnVuY3RvcigpLCA0KQorICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgVU5FWFBFQ1RFRCEiOworCisgIC8vIEZhaWx1cmUgY2FzZXMuCisgIGNvbnN0IGludCBuID0gNTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW5GdW5jdG9yKCksIG4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibiBldmFsdWF0ZXMgdG8gNSwgd2hpY2ggaXMgbm90IGV2ZW4uIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuLCA1KSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMgZXZhbHVhdGVzIHRoZWlyIGFyZ3VtZW50cworLy8gZXhhY3RseSBvbmNlLgorVEVTVChQcmVkMVRlc3QsIFNpbmdsZUV2YWx1YXRpb25PbkZhaWx1cmUpIHsKKyAgLy8gQSBzdWNjZXNzIGNhc2UuCisgIHN0YXRpYyBpbnQgbiA9IDA7CisgIEVYUEVDVF9QUkVEMShJc0V2ZW4sIG4rKyk7CisgIEVYUEVDVF9FUSgxLCBuKSA8PCAiVGhlIGFyZ3VtZW50IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQSBmYWlsdXJlIGNhc2UuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuRnVuY3RvcigpLCBuKyspCisgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0VRKDIsIG4pIDw8ICJUaGUgYXJndW1lbnQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKK30KKworCisvLyBUZXN0cyBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB3aG9zZSBhcml0eSBpcyA+PSAyLgorCisvLyBUZXN0cyBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IGRvbid0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWRUZXN0LCBXaXRob3V0Rm9ybWF0KSB7CisgIC8vIFN1Y2Nlc3MgY2FzZXMuCisgIEFTU0VSVF9QUkVEMihTdW1Jc0V2ZW4yLCAyLCA0KSA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgRVhQRUNUX1BSRUQzKFN1bUlzRXZlbjNGdW5jdG9yKCksIDQsIDYsIDgpOworCisgIC8vIEZhaWx1cmUgY2FzZXMuCisgIGNvbnN0IGludCBuMSA9IDE7CisgIGNvbnN0IGludCBuMiA9IDI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihTdW1Jc0V2ZW4yLCBuMSwgbjIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFN1bUlzRXZlbjNGdW5jdG9yKCksIDEsIDIsIDQpOworICB9LCAiZXZhbHVhdGVzIHRvIGZhbHNlIik7Cit9CisKKy8vIFRlc3RzIHByZWRpY2F0ZSBhc3NlcnRpb25zIHRoYXQgdXNlIGEgY3VzdG9tIGZvcm1hdHRlci4KK1RFU1QoUHJlZFRlc3QsIFdpdGhGb3JtYXQpIHsKKyAgLy8gU3VjY2VzcyBjYXNlcy4KKyAgQVNTRVJUX1BSRURfRk9STUFUNChBc3NlcnRTdW1Jc0V2ZW40LCA0LCA2LCA4LCAxMCkgPDwKKyAgICAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvcigpLCAyLCA0LCA2LCA4LCAxMCk7CisKKyAgLy8gRmFpbHVyZSBjYXNlcy4KKyAgY29uc3QgaW50IG4xID0gMTsKKyAgY29uc3QgaW50IG4yID0gMjsKKyAgY29uc3QgaW50IG4zID0gNDsKKyAgY29uc3QgaW50IG40ID0gNjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChBc3NlcnRTdW1Jc0V2ZW40LCBuMSwgbjIsIG4zLCBuNCk7CisgIH0sICJldmFsdWF0ZXMgdG8gMTMsIHdoaWNoIGlzIG5vdCBldmVuLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KEFzc2VydFN1bUlzRXZlbjVGdW5jdG9yKCksIDEsIDIsIDQsIDYsIDgpCisgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBldmFsdWF0ZXMgdGhlaXIgYXJndW1lbnRzCisvLyBleGFjdGx5IG9uY2UuCitURVNUKFByZWRUZXN0LCBTaW5nbGVFdmFsdWF0aW9uT25GYWlsdXJlKSB7CisgIC8vIEEgc3VjY2VzcyBjYXNlLgorICBpbnQgbjEgPSAwOworICBpbnQgbjIgPSAwOworICBFWFBFQ1RfUFJFRDIoU3VtSXNFdmVuMiwgbjErKywgbjIrKyk7CisgIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworCisgIC8vIEFub3RoZXIgc3VjY2VzcyBjYXNlLgorICBuMSA9IG4yID0gMDsKKyAgaW50IG4zID0gMDsKKyAgaW50IG40ID0gMDsKKyAgaW50IG41ID0gMDsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgIG4xKyssIG4yKyssIG4zKyssIG40KyssIG41KyspCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgRVhQRUNUX0VRKDEsIG4xKSA8PCAiQXJndW1lbnQgMSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjIpIDw8ICJBcmd1bWVudCAyIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMykgPDwgIkFyZ3VtZW50IDMgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG40KSA8PCAiQXJndW1lbnQgNCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjUpIDw8ICJBcmd1bWVudCA1IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQSBmYWlsdXJlIGNhc2UuCisgIG4xID0gbjIgPSBuMyA9IDA7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhTdW1Jc0V2ZW4zRnVuY3RvcigpLCArK24xLCBuMisrLCBuMysrKQorICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjMpIDw8ICJBcmd1bWVudCAzIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQW5vdGhlciBmYWlsdXJlIGNhc2UuCisgIG4xID0gbjIgPSBuMyA9IG40ID0gMDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChBc3NlcnRTdW1Jc0V2ZW40LCArK24xLCBuMisrLCBuMysrLCBuNCsrKTsKKyAgfSwgImV2YWx1YXRlcyB0byAxLCB3aGljaCBpcyBub3QgZXZlbi4iKTsKKyAgRVhQRUNUX0VRKDEsIG4xKSA8PCAiQXJndW1lbnQgMSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjIpIDw8ICJBcmd1bWVudCAyIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMykgPDwgIkFyZ3VtZW50IDMgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG40KSA8PCAiQXJndW1lbnQgNCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworfQorCisKKy8vIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyB1c2luZyBvdmVybG9hZGVkL3RlbXBsYXRlCisvLyBmdW5jdGlvbnMgd2l0aCBBU1NFUlRfUFJFRG4gYW5kIEVYUEVDVF9QUkVEbi4KKworYm9vbCBJc1Bvc2l0aXZlKGRvdWJsZSB4KSB7CisgIHJldHVybiB4ID4gMDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIElzTmVnYXRpdmUoVCB4KSB7CisgIHJldHVybiB4IDwgMDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgR3JlYXRlclRoYW4oVDEgeDEsIFQyIHgyKSB7CisgIHJldHVybiB4MSA+IHgyOworfQorCisvLyBUZXN0cyB0aGF0IG92ZXJsb2FkZWQgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluICpfUFJFRCogYXMgbG9uZyBhcworLy8gdGhlaXIgdHlwZXMgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorVEVTVChQcmVkaWNhdGVBc3NlcnRpb25UZXN0LCBBY2NlcHRzT3ZlcmxvYWRlZEZ1bmN0aW9uKSB7CisgIC8vIEMrK0J1aWxkZXIgcmVxdWlyZXMgQy1zdHlsZSBjYXN0cyByYXRoZXIgdGhhbiBzdGF0aWNfY2FzdC4KKyAgRVhQRUNUX1BSRUQxKChib29sICgqKShpbnQpKShJc1Bvc2l0aXZlKSwgNSk7ICAvLyBOT0xJTlQKKyAgQVNTRVJUX1BSRUQxKChib29sICgqKShkb3VibGUpKShJc1Bvc2l0aXZlKSwgNi4wKTsgIC8vIE5PTElOVAorfQorCisvLyBUZXN0cyB0aGF0IHRlbXBsYXRlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRUQqIGFzIGxvbmcgYXMKKy8vIHRoZWlyIHR5cGVzIGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KK1RFU1QoUHJlZGljYXRlQXNzZXJ0aW9uVGVzdCwgQWNjZXB0c1RlbXBsYXRlRnVuY3Rpb24pIHsKKyAgRVhQRUNUX1BSRUQxKElzTmVnYXRpdmU8aW50PiwgLTUpOworICAvLyBNYWtlcyBzdXJlIHRoYXQgd2UgY2FuIGhhbmRsZSB0ZW1wbGF0ZXMgd2l0aCBtb3JlIHRoYW4gb25lCisgIC8vIHBhcmFtZXRlci4KKyAgQVNTRVJUX1BSRUQyKChHcmVhdGVyVGhhbjxpbnQsIGludD4pLCA1LCAwKTsKK30KKworCisvLyBTb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgdXNpbmcgb3ZlcmxvYWRlZC90ZW1wbGF0ZQorLy8gZnVuY3Rpb25zIHdpdGggQVNTRVJUX1BSRURfRk9STUFUbiBhbmQgRVhQRUNUX1BSRURfRk9STUFUbi4KKworQXNzZXJ0aW9uUmVzdWx0IElzUG9zaXRpdmVGb3JtYXQoY29uc3QgY2hhciogLyogZXhwciAqLywgaW50IG4pIHsKKyAgcmV0dXJuIG4gPiAwID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKKyAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1Bvc2l0aXZlRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIgKi8sIGRvdWJsZSB4KSB7CisgIHJldHVybiB4ID4gMCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6CisgICAgICBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiRmFpbHVyZSIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Fzc2VydGlvblJlc3VsdCBJc05lZ2F0aXZlRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIgKi8sIFQgeCkgeworICByZXR1cm4geCA8IDAgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgorICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK0Fzc2VydGlvblJlc3VsdCBFcXVhbHNGb3JtYXQoY29uc3QgY2hhciogLyogZXhwcjEgKi8sIGNvbnN0IGNoYXIqIC8qIGV4cHIyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgeDEsIGNvbnN0IFQyJiB4MikgeworICByZXR1cm4geDEgPT0geDIgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgorICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRURfRk9STUFUKgorLy8gd2l0aG91dCBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlaXIgdHlwZXMuCitURVNUKFByZWRpY2F0ZUZvcm1hdEFzc2VydGlvblRlc3QsIEFjY2VwdHNPdmVybG9hZGVkRnVuY3Rpb24pIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShJc1Bvc2l0aXZlRm9ybWF0LCA1KTsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShJc1Bvc2l0aXZlRm9ybWF0LCA2LjApOworfQorCisvLyBUZXN0cyB0aGF0IHRlbXBsYXRlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRURfRk9STUFUKiB3aXRob3V0CisvLyBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlaXIgdHlwZXMuCitURVNUKFByZWRpY2F0ZUZvcm1hdEFzc2VydGlvblRlc3QsIEFjY2VwdHNUZW1wbGF0ZUZ1bmN0aW9uKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNOZWdhdGl2ZUZvcm1hdCwgLTUpOworICBBU1NFUlRfUFJFRF9GT1JNQVQyKEVxdWFsc0Zvcm1hdCwgMywgMyk7Cit9CisKKworLy8gVGVzdHMgc3RyaW5nIGFzc2VydGlvbnMuCisKKy8vIFRlc3RzIEFTU0VSVF9TVFJFUSB3aXRoIG5vbi1OVUxMIGFyZ3VtZW50cy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUkVRKSB7CisgIGNvbnN0IGNoYXIgKiBjb25zdCBwMSA9ICJnb29kIjsKKyAgQVNTRVJUX1NUUkVRKHAxLCBwMSk7CisKKyAgLy8gTGV0IHAyIGhhdmUgdGhlIHNhbWUgY29udGVudCBhcyBwMSwgYnV0IGJlIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MuCisgIGNvbnN0IGNoYXIgcDJbXSA9ICJnb29kIjsKKyAgQVNTRVJUX1NUUkVRKHAxLCBwMik7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKCJiYWQiLCAiZ29vZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFwiYmFkXCIiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUkVRIHdpdGggTlVMTCBhcmd1bWVudHMuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJFUV9OdWxsKSB7CisgIEFTU0VSVF9TVFJFUShzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KE5VTEwpLCBOVUxMKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKE5VTEwsICJub24tbnVsbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAibm9uLW51bGwiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUkVRIHdpdGggTlVMTCBhcmd1bWVudHMuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJFUV9OdWxsMikgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSRVEoIm5vbi1udWxsIiwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICJub24tbnVsbCIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfU1RSTkUuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJORSkgeworICBBU1NFUlRfU1RSTkUoImhpIiwgIkhpIik7CisgIEFTU0VSVF9TVFJORSgiSGkiLCBOVUxMKTsKKyAgQVNTRVJUX1NUUk5FKE5VTEwsICJIaSIpOworICBBU1NFUlRfU1RSTkUoIiIsIE5VTEwpOworICBBU1NFUlRfU1RSTkUoTlVMTCwgIiIpOworICBBU1NFUlRfU1RSTkUoIiIsICJIaSIpOworICBBU1NFUlRfU1RSTkUoIkhpIiwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSTkUoIkhpIiwgIkhpIiksCisgICAgICAgICAgICAgICAgICAgICAgICJcIkhpXCIgdnMgXCJIaVwiIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJDQVNFRVEuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJDQVNFRVEpIHsKKyAgQVNTRVJUX1NUUkNBU0VFUSgiaGkiLCAiSGkiKTsKKyAgQVNTRVJUX1NUUkNBU0VFUShzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KE5VTEwpLCBOVUxMKTsKKworICBBU1NFUlRfU1RSQ0FTRUVRKCIiLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFRVEoIkhpIiwgImhpMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAiKGlnbm9yaW5nIGNhc2UpIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJDQVNFTkUuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJDQVNFTkUpIHsKKyAgQVNTRVJUX1NUUkNBU0VORSgiaGkxIiwgIkhpMiIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCJIaSIsIE5VTEwpOworICBBU1NFUlRfU1RSQ0FTRU5FKE5VTEwsICJIaSIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCIiLCBOVUxMKTsKKyAgQVNTRVJUX1NUUkNBU0VORShOVUxMLCAiIik7CisgIEFTU0VSVF9TVFJDQVNFTkUoIiIsICJIaSIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCJIaSIsICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VORSgiSGkiLCAiaGkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIihpZ25vcmluZyBjYXNlKSIpOworfQorCisvLyBUZXN0cyAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgU1RSRVFfV2lkZSkgeworICAvLyBOVUxMIHN0cmluZ3MuCisgIEFTU0VSVF9TVFJFUShzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90ICo+KE5VTEwpLCBOVUxMKTsKKworICAvLyBFbXB0eSBzdHJpbmdzLgorICBBU1NFUlRfU1RSRVEoTCIiLCBMIiIpOworCisgIC8vIE5vbi1udWxsIHZzIE5VTEwuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUShMIm5vbi1udWxsIiwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tbnVsbCIpOworCisgIC8vIEVxdWFsIHN0cmluZ3MuCisgIEVYUEVDVF9TVFJFUShMIkhpIiwgTCJIaSIpOworCisgIC8vIFVuZXF1YWwgc3RyaW5ncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkVRKEwiYWJjIiwgTCJBYmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFiYyIpOworCisgIC8vIFN0cmluZ3MgY29udGFpbmluZyB3aWRlIGNoYXJhY3RlcnMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTIwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiKTsKK30KKworLy8gVGVzdHMgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIFNUUk5FX1dpZGUpIHsKKyAgLy8gTlVMTCBzdHJpbmdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfU1RSTkUoc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCAqPihOVUxMKSwgTlVMTCk7CisgIH0sICIiKTsKKworICAvLyBFbXB0eSBzdHJpbmdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoTCIiLCBMIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTFwiXCIiKTsKKworICAvLyBOb24tbnVsbCB2cyBOVUxMLgorICBBU1NFUlRfU1RSTkUoTCJub24tbnVsbCIsIE5VTEwpOworCisgIC8vIEVxdWFsIHN0cmluZ3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORShMIkhpIiwgTCJIaSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTFwiSGlcIiIpOworCisgIC8vIFVuZXF1YWwgc3RyaW5ncy4KKyAgRVhQRUNUX1NUUk5FKEwiYWJjIiwgTCJBYmMiKTsKKworICAvLyBTdHJpbmdzIGNvbnRhaW5pbmcgd2lkZSBjaGFyYWN0ZXJzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoTCJhYmNceDgxMTkiLCBMImFiY1x4ODExOSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIik7Cit9CisKKy8vIFRlc3RzIGZvciA6OnRlc3Rpbmc6OklzU3Vic3RyaW5nKCkuCisKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCBjaGFyKi4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvckNTdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTlVMTCwgImEiKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsICJiIiwgTlVMTCkpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCAibmVlZGxlIiwgImhheXN0YWNrIikpOworCisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KE5VTEwpLCBOVUxMKSk7CisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJ0d28gbmVlZGxlcyIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IHdjaGFyX3QqLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yV2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwga051bGwsIEwiYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJiIiwga051bGwpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMImhheXN0YWNrIikpOworCisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KE5VTEwpLCBOVUxMKSk7CisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMInR3byBuZWVkbGVzIikpOworfQorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3QgY2hhciouCitURVNUKElzU3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IFwibmVlZGxlXCJcbiIKKyAgICAgICAgICAgICAgICJFeHBlY3RlZDogYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgorICAgICAgICAgICAgICAgIldoaWNoIGlzOiBcImhheXN0YWNrXCIiLAorICAgICAgICAgICAgICAgSXNTdWJzdHJpbmcoIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRsZSIsICJoYXlzdGFjayIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6c3RyaW5nLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0c0ZvclN0ZFN0cmluZykgeworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIHN0ZDo6c3RyaW5nKCJoZWxsbyIpLCAiYWhlbGxvYiIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgImhlbGxvIiwgc3RkOjpzdHJpbmcoIndvcmxkIikpKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6d3N0cmluZy4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvclN0ZFdzdHJpbmcpIHsKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCA6OnN0ZDo6d3N0cmluZyhMIm5lZWRsZSIpLCBMInR3byBuZWVkbGVzIikpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIDo6c3RkOjp3c3RyaW5nKEwiaGF5c3RhY2siKSkpOworfQorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OndzdHJpbmcuCitURVNUKElzU3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JXc3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IExcIm5lZWRsZVwiXG4iCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrX2V4cHJcbiIKKyAgICAgICAgICAgICAgICJXaGljaCBpczogTFwiaGF5c3RhY2tcIiIsCisgICAgICAgICAgICAgICBJc1N1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCisgICAgICAgICAgICAgICAgICAgOjpzdGQ6OndzdHJpbmcoTCJuZWVkbGUiKSwgTCJoYXlzdGFjayIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgZm9yIDo6dGVzdGluZzo6SXNOb3RTdWJzdHJpbmcoKS4KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IGNoYXIqLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yQ1N0cmluZykgeworICBFWFBFQ1RfVFJVRShJc05vdFN1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAiaGF5c3RhY2siKSk7CisgIEVYUEVDVF9GQUxTRShJc05vdFN1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAidHdvIG5lZWRsZXMiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCB3Y2hhcl90Ki4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvcldpZGVDU3RyaW5nKSB7CisgIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMImhheXN0YWNrIikpOworICBFWFBFQ1RfRkFMU0UoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwidHdvIG5lZWRsZXMiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCB3Y2hhcl90Ki4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvcldpZGVDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IExcIm5lZWRsZVwiXG4iCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IG5vdCBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCisgICAgICAgICAgICAgICAiV2hpY2ggaXM6IExcInR3byBuZWVkbGVzXCIiLAorICAgICAgICAgICAgICAgSXNOb3RTdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgIEwibmVlZGxlIiwgTCJ0d28gbmVlZGxlcyIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6c3RyaW5nLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0c0ZvclN0ZFN0cmluZykgeworICBFWFBFQ1RfRkFMU0UoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBzdGQ6OnN0cmluZygiaGVsbG8iKSwgImFoZWxsb2IiKSk7CisgIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgImhlbGxvIiwgc3RkOjpzdHJpbmcoIndvcmxkIikpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBtZXNzYWdlIHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjpzdHJpbmcuCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JTdGRTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKKyAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJuZWVkbGVcIlxuIgorICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBub3QgYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgorICAgICAgICAgICAgICAgIldoaWNoIGlzOiBcInR3byBuZWVkbGVzXCIiLAorICAgICAgICAgICAgICAgSXNOb3RTdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIm5lZWRsZSIpLCAidHdvIG5lZWRsZXMiKS5mYWlsdXJlX21lc3NhZ2UoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6d3N0cmluZy4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvclN0ZFdzdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgSXNOb3RTdWJzdHJpbmcoIiIsICIiLCA6OnN0ZDo6d3N0cmluZyhMIm5lZWRsZSIpLCBMInR3byBuZWVkbGVzIikpOworICBFWFBFQ1RfVFJVRShJc05vdFN1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgOjpzdGQ6OndzdHJpbmcoTCJoYXlzdGFjayIpKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIGZsb2F0aW5nLXBvaW50IGFzc2VydGlvbnMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorCisgIC8vIFByZS1jYWxjdWxhdGVkIG51bWJlcnMgdG8gYmUgdXNlZCBieSB0aGUgdGVzdHMuCisgIHN0cnVjdCBUZXN0VmFsdWVzIHsKKyAgICBSYXdUeXBlIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm87CisgICAgUmF3VHlwZSBjbG9zZV90b19uZWdhdGl2ZV96ZXJvOworICAgIFJhd1R5cGUgZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm87CisKKyAgICBSYXdUeXBlIGNsb3NlX3RvX29uZTsKKyAgICBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9vbmU7CisKKyAgICBSYXdUeXBlIGluZmluaXR5OworICAgIFJhd1R5cGUgY2xvc2VfdG9faW5maW5pdHk7CisgICAgUmF3VHlwZSBmdXJ0aGVyX2Zyb21faW5maW5pdHk7CisKKyAgICBSYXdUeXBlIG5hbjE7CisgICAgUmF3VHlwZSBuYW4yOworICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gRmxvYXRpbmc7CisgIHR5cGVkZWYgdHlwZW5hbWUgRmxvYXRpbmc6OkJpdHMgQml0czsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgY29uc3Qgc2l6ZV90IG1heF91bHBzID0gRmxvYXRpbmc6OmtNYXhVbHBzOworCisgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMC4wLgorICAgIGNvbnN0IEJpdHMgemVyb19iaXRzID0gRmxvYXRpbmcoMCkuYml0cygpOworCisgICAgLy8gTWFrZXMgc29tZSBudW1iZXJzIGNsb3NlIHRvIDAuMC4KKyAgICB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8gPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICB6ZXJvX2JpdHMgKyBtYXhfdWxwcy8yKTsKKyAgICB2YWx1ZXNfLmNsb3NlX3RvX25lZ2F0aXZlX3plcm8gPSAtRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgemVyb19iaXRzICsgbWF4X3VscHMgLSBtYXhfdWxwcy8yKTsKKyAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvID0gLUZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIHplcm9fYml0cyArIG1heF91bHBzICsgMSAtIG1heF91bHBzLzIpOworCisgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMS4wLgorICAgIGNvbnN0IEJpdHMgb25lX2JpdHMgPSBGbG9hdGluZygxKS5iaXRzKCk7CisKKyAgICAvLyBNYWtlcyBzb21lIG51bWJlcnMgY2xvc2UgdG8gMS4wLgorICAgIHZhbHVlc18uY2xvc2VfdG9fb25lID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhvbmVfYml0cyArIG1heF91bHBzKTsKKyAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICBvbmVfYml0cyArIG1heF91bHBzICsgMSk7CisKKyAgICAvLyAraW5maW5pdHkuCisgICAgdmFsdWVzXy5pbmZpbml0eSA9IEZsb2F0aW5nOjpJbmZpbml0eSgpOworCisgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgK2luZmluaXR5LgorICAgIGNvbnN0IEJpdHMgaW5maW5pdHlfYml0cyA9IEZsb2F0aW5nKHZhbHVlc18uaW5maW5pdHkpLmJpdHMoKTsKKworICAgIC8vIE1ha2VzIHNvbWUgbnVtYmVycyBjbG9zZSB0byBpbmZpbml0eS4KKyAgICB2YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5ID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgaW5maW5pdHlfYml0cyAtIG1heF91bHBzKTsKKyAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9pbmZpbml0eSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIGluZmluaXR5X2JpdHMgLSBtYXhfdWxwcyAtIDEpOworCisgICAgLy8gTWFrZXMgc29tZSBOQU4ncy4gIFNldHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmcmFjdGlvbiBzbyB0aGF0CisgICAgLy8gb3VyIE5hTidzIGFyZSBxdWlldDsgdHJ5aW5nIHRvIHByb2Nlc3MgYSBzaWduYWxpbmcgTmFOIHdvdWxkIHJhaXNlIGFuCisgICAgLy8gZXhjZXB0aW9uIGlmIG91ciBlbnZpcm9ubWVudCBlbmFibGVzIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMuCisgICAgdmFsdWVzXy5uYW4xID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhGbG9hdGluZzo6a0V4cG9uZW50Qml0TWFzaworICAgICAgICB8IChzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoRmxvYXRpbmc6OmtGcmFjdGlvbkJpdENvdW50IC0gMSkpIHwgMSk7CisgICAgdmFsdWVzXy5uYW4yID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhGbG9hdGluZzo6a0V4cG9uZW50Qml0TWFzaworICAgICAgICB8IChzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoRmxvYXRpbmc6OmtGcmFjdGlvbkJpdENvdW50IC0gMSkpIHwgMjAwKTsKKyAgfQorCisgIHZvaWQgVGVzdFNpemUoKSB7CisgICAgRVhQRUNUX0VRKHNpemVvZihSYXdUeXBlKSwgc2l6ZW9mKEJpdHMpKTsKKyAgfQorCisgIHN0YXRpYyBUZXN0VmFsdWVzIHZhbHVlc187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK3R5cGVuYW1lIEZsb2F0aW5nUG9pbnRUZXN0PFJhd1R5cGU+OjpUZXN0VmFsdWVzCisgICAgRmxvYXRpbmdQb2ludFRlc3Q8UmF3VHlwZT46OnZhbHVlc187CisKKy8vIEluc3RhbnRpYXRlcyBGbG9hdGluZ1BvaW50VGVzdCBmb3IgdGVzdGluZyAqX0ZMT0FUX0VRLgordHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxmbG9hdD4gRmxvYXRUZXN0OworCisvLyBUZXN0cyB0aGF0IHRoZSBzaXplIG9mIEZsb2F0OjpCaXRzIG1hdGNoZXMgdGhlIHNpemUgb2YgZmxvYXQuCitURVNUX0YoRmxvYXRUZXN0LCBTaXplKSB7CisgIFRlc3RTaXplKCk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoICswIGFuZCAtMC4KK1RFU1RfRihGbG9hdFRlc3QsIFplcm9zKSB7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjAsIC0wLjApOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoLTAuMCwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkxPQVRfRVEoMC4wLCAxLjUpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS41Iik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIDAuCisvLworLy8gVGhpcyBlbnN1cmVzIHRoYXQgKl9GTE9BVF9FUSBoYW5kbGVzIHRoZSBzaWduIGNvcnJlY3RseSBhbmQgbm8KKy8vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlIGFic29sdXRlIHZhbHVlIGlzIHZlcnkKKy8vIHNtYWxsLgorVEVTVF9GKEZsb2F0VGVzdCwgQWxtb3N0WmVyb3MpIHsKKyAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQorICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCisgIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgorICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCisgIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKKyAgLy8gKHBhcmVudGhlc2VzKS4KKyAgc3RhdGljIGNvbnN0IEZsb2F0VGVzdDo6VGVzdFZhbHVlcyYgdiA9IHRoaXMtPnZhbHVlc187CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMCwgdi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0wLjAsIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7CisgIEVYUEVDVF9GTE9BVF9FUSh2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0ZMT0FUX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywKKyAgICAgICAgICAgICAgICAgICAgdi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyk7CisgIH0sICJ2LmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIGVhY2ggb3RoZXIuCitURVNUX0YoRmxvYXRUZXN0LCBTbWFsbERpZmYpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGZhciBhcGFydC4KK1RFU1RfRihGbG9hdFRlc3QsIExhcmdlRGlmZikgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMi41LCAzLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4wIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoIGluZmluaXR5LgorLy8KKy8vIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlCisvLyBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5IGxhcmdlLgorVEVTVF9GKEZsb2F0VGVzdCwgSW5maW5pdHkpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkpOworICBFWFBFQ1RfRkxPQVRfRVEoLXZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmluZmluaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi12YWx1ZXNfLmluZmluaXR5Iik7CisKKyAgLy8gVGhpcyBpcyBpbnRlcmVzdGluZyBhcyB0aGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IGFuZCBuYW4xCisgIC8vIGFyZSBvbmx5IDEgRExQIGFwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18ubmFuMSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0IGNvbXBhcmluZyB3aXRoIE5BTiBhbHdheXMgcmV0dXJucyBmYWxzZS4KK1RFU1RfRihGbG9hdFRlc3QsIE5hTikgeworI2lmICFHVEVTVF9PU19TWU1CSUFOCisvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKworICAvLyBJbiBDKytCdWlsZGVyLCBuYW1lcyB3aXRoaW4gbG9jYWwgY2xhc3NlcyAoc3VjaCBhcyB1c2VkIGJ5CisgIC8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFKSBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUKKyAgLy8gc2NvcGluZyBjbGFzcy4gIFVzZSBhIHN0YXRpYyBsb2NhbCBhbGlhcyBhcyBhIHdvcmthcm91bmQuCisgIC8vIFdlIHVzZSB0aGUgYXNzaWdubWVudCBzeW50YXggc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgU3VuIFN0dWRpbywKKyAgLy8gZG9uJ3QgYWxsb3cgaW5pdGlhbGl6aW5nIHJlZmVyZW5jZXMgdXNpbmcgY29uc3RydWN0aW9uIHN5bnRheAorICAvLyAocGFyZW50aGVzZXMpLgorICBzdGF0aWMgY29uc3QgRmxvYXRUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodi5uYW4xLCB2Lm5hbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidi5uYW4xIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2Lm5hbjEsIHYubmFuMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Lm5hbjIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdi5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOworCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GTE9BVF9FUSh2Lm5hbjEsIHYuaW5maW5pdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAidi5pbmZpbml0eSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0ICpfRkxPQVRfRVEgYXJlIHJlZmxleGl2ZS4KK1RFU1RfRihGbG9hdFRlc3QsIFJlZmxleGl2ZSkgeworICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCAwLjApOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wLCAxLjApOworICBBU1NFUlRfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5pbmZpbml0eSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgKl9GTE9BVF9FUSBhcmUgY29tbXV0YXRpdmUuCitURVNUX0YoRmxvYXRUZXN0LCBDb21tdXRhdGl2ZSkgeworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmNsb3NlX3RvX29uZSkuCisgIEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmNsb3NlX3RvX29uZSwgMS4wKTsKKworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9ORUFSLgorVEVTVF9GKEZsb2F0VGVzdCwgRVhQRUNUX05FQVIpIHsKKyAgRVhQRUNUX05FQVIoLTEuMGYsIC0xLjFmLCAwLjJmKTsKKyAgRVhQRUNUX05FQVIoMi4wZiwgMy4wZiwgMS4wZik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORUFSKDEuMGYsMS41ZiwgMC4yNWYpLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMGYgYW5kIDEuNWYgaXMgMC41LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjVmIik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBsaW5lLgorfQorCisvLyBUZXN0cyBBU1NFUlRfTkVBUi4KK1RFU1RfRihGbG9hdFRlc3QsIEFTU0VSVF9ORUFSKSB7CisgIEFTU0VSVF9ORUFSKC0xLjBmLCAtMS4xZiwgMC4yZik7CisgIEFTU0VSVF9ORUFSKDIuMGYsIDMuMGYsIDEuMGYpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLjBmLDEuNWYsIDAuMjVmKSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjBmIGFuZCAxLjVmIGlzIDAuNSwgIgorICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1ZiIpOworICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCisgIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgbGluZS4KK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIEZsb2F0TEUoKSBzaG91bGQgc3VjY2VlZC4KK1RFU1RfRihGbG9hdFRlc3QsIEZsb2F0TEVTdWNjZWVkcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIDEuMGYsIDIuMGYpOyAgLy8gV2hlbiB2YWwxIDwgdmFsMiwKKyAgQVNTRVJUX1BSRURfRk9STUFUMihGbG9hdExFLCAxLjBmLCAxLjBmKTsgIC8vIHZhbDEgPT0gdmFsMiwKKworICAvLyBvciB3aGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuLCBidXQgYWxtb3N0IGVxdWFscyB0bywgdmFsMi4KKyAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIDAuMGYpOworfQorCisvLyBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgRmxvYXRMRSgpIHNob3VsZCBmYWlsLgorVEVTVF9GKEZsb2F0VGVzdCwgRmxvYXRMRUZhaWxzKSB7CisgIC8vIFdoZW4gdmFsMSBpcyBncmVhdGVyIHRoYW4gdmFsMiBieSBhIGxhcmdlIG1hcmdpbiwKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCAyLjBmLCAxLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyLjBmKSA8PSAoMS4wZikiKTsKKworICAvLyBvciBieSBhIHNtYWxsIHlldCBub24tbmVnbGlnaWJsZSBtYXJnaW4sCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjBmKTsKKyAgfSwgIih2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpIDw9ICgxLjBmKSIpOworCisjaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgLy8gQysrQnVpbGRlciBnaXZlcyBiYWQgcmVzdWx0cyBmb3Igb3JkZXJlZCBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcworICAvLyBkdWUgdG8gY29tcGlsZXIgYnVncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLm5hbjEsIHZhbHVlc18uaW5maW5pdHkpOworICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18uaW5maW5pdHkpIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgLXZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSk7CisgIH0sICIoLXZhbHVlc18uaW5maW5pdHkpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLm5hbjEpOworICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18ubmFuMSkiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisvLyBJbnN0YW50aWF0ZXMgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgKl9ET1VCTEVfRVEuCit0eXBlZGVmIEZsb2F0aW5nUG9pbnRUZXN0PGRvdWJsZT4gRG91YmxlVGVzdDsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2l6ZSBvZiBEb3VibGU6OkJpdHMgbWF0Y2hlcyB0aGUgc2l6ZSBvZiBkb3VibGUuCitURVNUX0YoRG91YmxlVGVzdCwgU2l6ZSkgeworICBUZXN0U2l6ZSgpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgd2l0aCArMCBhbmQgLTAuCitURVNUX0YoRG91YmxlVGVzdCwgWmVyb3MpIHsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIC0wLjApOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKC0wLjAsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RPVUJMRV9FUSgwLjAsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgY2xvc2UgdG8gMC4KKy8vCisvLyBUaGlzIGVuc3VyZXMgdGhhdCAqX0RPVUJMRV9FUSBoYW5kbGVzIHRoZSBzaWduIGNvcnJlY3RseSBhbmQgbm8KKy8vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlIGFic29sdXRlIHZhbHVlIGlzIHZlcnkKKy8vIHNtYWxsLgorVEVTVF9GKERvdWJsZVRlc3QsIEFsbW9zdFplcm9zKSB7CisgIC8vIEluIEMrK0J1aWxkZXIsIG5hbWVzIHdpdGhpbiBsb2NhbCBjbGFzc2VzIChzdWNoIGFzIHVzZWQgYnkKKyAgLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUpIGNhbm5vdCBiZSByZXNvbHZlZCBhZ2FpbnN0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZQorICAvLyBzY29waW5nIGNsYXNzLiAgVXNlIGEgc3RhdGljIGxvY2FsIGFsaWFzIGFzIGEgd29ya2Fyb3VuZC4KKyAgLy8gV2UgdXNlIHRoZSBhc3NpZ25tZW50IHN5bnRheCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSBTdW4gU3R1ZGlvLAorICAvLyBkb24ndCBhbGxvdyBpbml0aWFsaXppbmcgcmVmZXJlbmNlcyB1c2luZyBjb25zdHJ1Y3Rpb24gc3ludGF4CisgIC8vIChwYXJlbnRoZXNlcykuCisgIHN0YXRpYyBjb25zdCBEb3VibGVUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKKworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgdi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgtMC4wLCB2LmNsb3NlX3RvX25lZ2F0aXZlX3plcm8pOworICBFWFBFQ1RfRE9VQkxFX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywgdi5jbG9zZV90b19uZWdhdGl2ZV96ZXJvKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRE9VQkxFX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywKKyAgICAgICAgICAgICAgICAgICAgIHYuZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8pOworICB9LCAidi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBjbG9zZSB0byBlYWNoIG90aGVyLgorVEVTVF9GKERvdWJsZVRlc3QsIFNtYWxsRGlmZikgeworICBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18uZnVydGhlcl9mcm9tX29uZSIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBmYXIgYXBhcnQuCitURVNUX0YoRG91YmxlVGVzdCwgTGFyZ2VEaWZmKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMi4wLCAzLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4wIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoIGluZmluaXR5LgorLy8KKy8vIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlCisvLyBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5IGxhcmdlLgorVEVTVF9GKERvdWJsZVRlc3QsIEluZmluaXR5KSB7CisgIEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLXZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmluZmluaXR5LCAtdmFsdWVzXy5pbmZpbml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICItdmFsdWVzXy5pbmZpbml0eSIpOworCisgIC8vIFRoaXMgaXMgaW50ZXJlc3RpbmcgYXMgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eV8gYW5kIG5hbjFfCisgIC8vIGFyZSBvbmx5IDEgRExQIGFwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXNfLm5hbjEiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KK30KKworLy8gVGVzdHMgdGhhdCBjb21wYXJpbmcgd2l0aCBOQU4gYWx3YXlzIHJldHVybnMgZmFsc2UuCitURVNUX0YoRG91YmxlVGVzdCwgTmFOKSB7CisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQorICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCisgIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgorICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCisgIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKKyAgLy8gKHBhcmVudGhlc2VzKS4KKyAgc3RhdGljIGNvbnN0IERvdWJsZVRlc3Q6OlRlc3RWYWx1ZXMmIHYgPSB0aGlzLT52YWx1ZXNfOworCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHYubmFuMSwgdi5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHYubmFuMSwgdi5uYW4yKSwgInYubmFuMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdi5uYW4xKSwgInYubmFuMSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRE9VQkxFX0VRKHYubmFuMSwgdi5pbmZpbml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICJ2LmluZmluaXR5Iik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCit9CisKKy8vIFRlc3RzIHRoYXQgKl9ET1VCTEVfRVEgYXJlIHJlZmxleGl2ZS4KK1RFU1RfRihEb3VibGVUZXN0LCBSZWZsZXhpdmUpIHsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIDAuMCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCAxLjApOworI2lmICFHVEVTVF9PU19TWU1CSUFOCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICBBU1NFUlRfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uaW5maW5pdHkpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0ICpfRE9VQkxFX0VRIGFyZSBjb21tdXRhdGl2ZS4KK1RFU1RfRihEb3VibGVUZXN0LCBDb21tdXRhdGl2ZSkgeworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpLgorICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uY2xvc2VfdG9fb25lLCAxLjApOworCisgIC8vIFdlIGFscmVhZHkgdGVzdGVkIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTkVBUi4KK1RFU1RfRihEb3VibGVUZXN0LCBFWFBFQ1RfTkVBUikgeworICBFWFBFQ1RfTkVBUigtMS4wLCAtMS4xLCAwLjIpOworICBFWFBFQ1RfTkVBUigyLjAsIDMuMCwgMS4wKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FQVIoMS4wLCAxLjUsIDAuMjUpLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMCBhbmQgMS41IGlzIDAuNSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1Iik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQuCit9CisKKy8vIFRlc3RzIEFTU0VSVF9ORUFSLgorVEVTVF9GKERvdWJsZVRlc3QsIEFTU0VSVF9ORUFSKSB7CisgIEFTU0VSVF9ORUFSKC0xLjAsIC0xLjEsIDAuMik7CisgIEFTU0VSVF9ORUFSKDIuMCwgMy4wLCAxLjApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLjAsIDEuNSwgMC4yNSksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCAxLjUgaXMgMC41LCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjUiKTsKKyAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubworICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIHN0YXRlbWVudC4KK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIERvdWJsZUxFKCkgc2hvdWxkIHN1Y2NlZWQuCitURVNUX0YoRG91YmxlVGVzdCwgRG91YmxlTEVTdWNjZWVkcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAxLjAsIDIuMCk7ICAvLyBXaGVuIHZhbDEgPCB2YWwyLAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAxLjAsIDEuMCk7ICAvLyB2YWwxID09IHZhbDIsCisKKyAgLy8gb3Igd2hlbiB2YWwxIGlzIGdyZWF0ZXIgdGhhbiwgYnV0IGFsbW9zdCBlcXVhbHMgdG8sIHZhbDIuCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18uY2xvc2VfdG9fcG9zaXRpdmVfemVybywgMC4wKTsKK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIERvdWJsZUxFKCkgc2hvdWxkIGZhaWwuCitURVNUX0YoRG91YmxlVGVzdCwgRG91YmxlTEVGYWlscykgeworICAvLyBXaGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuIHZhbDIgYnkgYSBsYXJnZSBtYXJnaW4sCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIDIuMCwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyLjApIDw9ICgxLjApIik7CisKKyAgLy8gb3IgYnkgYSBzbWFsbCB5ZXQgbm9uLW5lZ2xpZ2libGUgbWFyZ2luLAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUsIDEuMCk7CisgIH0sICIodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSA8PSAoMS4wKSIpOworCisjaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgLy8gQysrQnVpbGRlciBnaXZlcyBiYWQgcmVzdWx0cyBmb3Igb3JkZXJlZCBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcworICAvLyBkdWUgdG8gY29tcGlsZXIgYnVncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLmluZmluaXR5KTsKKyAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLmluZmluaXR5KSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAtdmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKTsKKyAgfSwgIiAoLXZhbHVlc18uaW5maW5pdHkpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18ubmFuMSwgdmFsdWVzXy5uYW4xKTsKKyAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKK30KKworCisvLyBWZXJpZmllcyB0aGF0IGEgdGVzdCBvciB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBESVNBQkxFRF8gaXMKKy8vIG5vdCBydW4uCisKKy8vIEEgdGVzdCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXy4KKy8vIFNob3VsZCBub3QgcnVuLgorVEVTVChEaXNhYmxlZFRlc3QsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworLy8gQSB0ZXN0IHdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCBESVNBQkxFRF8uCisvLyBTaG91bGQgcnVuLgorVEVTVChEaXNhYmxlZFRlc3QsIE5vdERJU0FCTEVEX1Rlc3RTaG91bGRSdW4pIHsKKyAgRVhQRUNUX0VRKDEsIDEpOworfQorCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXy4KKy8vIFNob3VsZCBub3QgcnVuLgorVEVTVChESVNBQkxFRF9UZXN0Q2FzZSwgVGVzdFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogVGVzdCBpbiBkaXNhYmxlZCB0ZXN0IGNhc2Ugc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworLy8gQSB0ZXN0IGNhc2UgYW5kIHRlc3Qgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBESVNBQkxFRF8uCisvLyBTaG91bGQgbm90IHJ1bi4KK1RFU1QoRElTQUJMRURfVGVzdENhc2UsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IFRlc3QgaW4gZGlzYWJsZWQgdGVzdCBjYXNlIHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKKy8vIENoZWNrIHRoYXQgd2hlbiBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UgYXJlIGRpc2FibGVkLCBTZXR1cFRlc3RDYXNlKCkgYW5kCisvLyBUZWFyRG93blRlc3RDYXNlKCkgYXJlIG5vdCBjYWxsZWQuCitjbGFzcyBEaXNhYmxlZFRlc3RzVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IEFsbCB0ZXN0cyBkaXNhYmxlZCBpbiB0ZXN0IGNhc2UuICIKKyAgICAgICAgICAgICAgIlNldHVwVGVzdENhc2UoKSBzaG91bGQgbm90IGJlIGNhbGxlZC4iOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogQWxsIHRlc3RzIGRpc2FibGVkIGluIHRlc3QgY2FzZS4gIgorICAgICAgICAgICAgICAiVGVhckRvd25UZXN0Q2FzZSgpIHNob3VsZCBub3QgYmUgY2FsbGVkLiI7CisgIH0KK307CisKK1RFU1RfRihEaXNhYmxlZFRlc3RzVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bl8xKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKK1RFU1RfRihEaXNhYmxlZFRlc3RzVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bl8yKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGlzYWJsZWQgdHlwZWQgdGVzdHMgYXJlbid0IHJ1bi4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0IDogcHVibGljIFRlc3QgeworfTsKKwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOworVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdCwgTnVtZXJpY1R5cGVzKTsKKworVFlQRURfVEVTVChUeXBlZFRlc3QsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdHlwZWQgdGVzdCBzaG91bGQgbm90IHJ1bi4iOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERJU0FCTEVEX1R5cGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRShESVNBQkxFRF9UeXBlZFRlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoRElTQUJMRURfVHlwZWRUZXN0LCBTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHR5cGVkIHRlc3Qgc2hvdWxkIG5vdCBydW4uIjsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBUZXN0cyB0aGF0IGRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmVuJ3QgcnVuLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIgorICAgICAgICAgPDwgIkRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bik7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBUeXBlZFRlc3RQLCBOdW1lcmljVHlwZXMpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERJU0FCTEVEX1R5cGVkVGVzdFAgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChESVNBQkxFRF9UeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKERJU0FCTEVEX1R5cGVkVGVzdFAsIFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIgorICAgICAgICAgPDwgIkRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKERJU0FCTEVEX1R5cGVkVGVzdFAsIFNob3VsZE5vdFJ1bik7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBESVNBQkxFRF9UeXBlZFRlc3RQLCBOdW1lcmljVHlwZXMpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisKK2NsYXNzIFNpbmdsZUV2YWx1YXRpb25UZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzogIC8vIE11c3QgYmUgcHVibGljIGFuZCBub3QgcHJvdGVjdGVkIGR1ZSB0byBhIGJ1ZyBpbiBnKysgMy40LjIuCisgIC8vIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSB0aGUgRmFpbGVkQVNTRVJUX1NUUkVRIHRlc3QKKyAgLy8gYmVsb3cuICBJdCdzIHB1YmxpYyB0byB3b3JrIGFyb3VuZCBDKytCdWlsZGVyJ3MgYnVnIHdpdGggc2NvcGluZyBsb2NhbAorICAvLyBjbGFzc2VzLgorICBzdGF0aWMgdm9pZCBDb21wYXJlQW5kSW5jcmVtZW50Q2hhclB0cnMoKSB7CisgICAgQVNTRVJUX1NUUkVRKHAxXysrLCBwMl8rKyk7CisgIH0KKworICAvLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgdGhlIEZhaWxlZEFTU0VSVF9ORSB0ZXN0IGJlbG93LiAgSXQncworICAvLyBwdWJsaWMgdG8gd29yayBhcm91bmQgQysrQnVpbGRlcidzIGJ1ZyB3aXRoIHNjb3BpbmcgbG9jYWwgY2xhc3Nlcy4KKyAgc3RhdGljIHZvaWQgQ29tcGFyZUFuZEluY3JlbWVudEludHMoKSB7CisgICAgQVNTRVJUX05FKGFfKyssIGJfKyspOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFNpbmdsZUV2YWx1YXRpb25UZXN0KCkgeworICAgIHAxXyA9IHMxXzsKKyAgICBwMl8gPSBzMl87CisgICAgYV8gPSAwOworICAgIGJfID0gMDsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzMV87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzMl87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBwMV87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBwMl87CisKKyAgc3RhdGljIGludCBhXzsKKyAgc3RhdGljIGludCBiXzsKK307CisKK2NvbnN0IGNoYXIqIGNvbnN0IFNpbmdsZUV2YWx1YXRpb25UZXN0OjpzMV8gPSAiMDEyMzQiOworY29uc3QgY2hhciogY29uc3QgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnMyXyA9ICJhYmNkZSI7Citjb25zdCBjaGFyKiBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6cDFfOworY29uc3QgY2hhciogU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnAyXzsKK2ludCBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6YV87CitpbnQgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OmJfOworCisvLyBUZXN0cyB0aGF0IHdoZW4gQVNTRVJUX1NUUkVRIGZhaWxzLCBpdCBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cworLy8gZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBGYWlsZWRBU1NFUlRfU1RSRVEpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoU2luZ2xlRXZhbHVhdGlvblRlc3Q6OkNvbXBhcmVBbmRJbmNyZW1lbnRDaGFyUHRycygpLAorICAgICAgICAgICAgICAgICAgICAgICAicDJfKysiKTsKKyAgRVhQRUNUX0VRKHMxXyArIDEsIHAxXyk7CisgIEVYUEVDVF9FUShzMl8gKyAxLCBwMl8pOworfQorCisvLyBUZXN0cyB0aGF0IHN0cmluZyBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBBU1NFUlRfU1RSKSB7CisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1NUUk5FCisgIEVYUEVDVF9TVFJORShwMV8rKywgcDJfKyspOworICBFWFBFQ1RfRVEoczFfICsgMSwgcDFfKTsKKyAgRVhQRUNUX0VRKHMyXyArIDEsIHAyXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9TVFJDQVNFRVEKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VFUShwMV8rKywgcDJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JpbmcgY2FzZSIpOworICBFWFBFQ1RfRVEoczFfICsgMiwgcDFfKTsKKyAgRVhQRUNUX0VRKHMyXyArIDIsIHAyXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBBU1NFUlRfTkUgZmFpbHMsIGl0IGV2YWx1YXRlcyBpdHMgYXJndW1lbnRzIGV4YWN0bHkKKy8vIG9uY2UuCitURVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIEZhaWxlZEFTU0VSVF9ORSkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShTaW5nbGVFdmFsdWF0aW9uVGVzdDo6Q29tcGFyZUFuZEluY3JlbWVudEludHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIihhXysrKSAhPSAoYl8rKykiKTsKKyAgRVhQRUNUX0VRKDEsIGFfKTsKKyAgRVhQRUNUX0VRKDEsIGJfKTsKK30KKworLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBPdGhlckNhc2VzKSB7CisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1RSVUUKKyAgRVhQRUNUX1RSVUUoMCA9PSBhXysrKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMSwgYV8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfVFJVRQorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgtMSA9PSBhXysrKSwgIi0xID09IGFfKysiKTsKKyAgRVhQRUNUX0VRKDIsIGFfKTsKKworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9HVAorICBFWFBFQ1RfR1QoYV8rKywgYl8rKyk7CisgIEVYUEVDVF9FUSgzLCBhXyk7CisgIEVYUEVDVF9FUSgxLCBiXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9MVAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoYV8rKywgYl8rKyksICIoYV8rKykgPCAoYl8rKykiKTsKKyAgRVhQRUNUX0VRKDQsIGFfKTsKKyAgRVhQRUNUX0VRKDIsIGJfKTsKKworICAvLyBzdWNjZXNzZnVsIEFTU0VSVF9UUlVFCisgIEFTU0VSVF9UUlVFKDAgPCBhXysrKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoNSwgYV8pOworCisgIC8vIHN1Y2Nlc3NmdWwgQVNTRVJUX0dUCisgIEFTU0VSVF9HVChhXysrLCBiXysrKTsKKyAgRVhQRUNUX0VRKDYsIGFfKTsKKyAgRVhQRUNUX0VRKDMsIGJfKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK3ZvaWQgVGhyb3dBbkludGVnZXIoKSB7CisgIHRocm93IDE7Cit9CisKKy8vIFRlc3RzIHRoYXQgYXNzZXJ0aW9uIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4KK1RFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgRXhjZXB0aW9uVGVzdHMpIHsKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfVEhST1cKKyAgRVhQRUNUX1RIUk9XKHsgIC8vIE5PTElOVAorICAgIGFfKys7CisgICAgVGhyb3dBbkludGVnZXIoKTsKKyAgfSwgaW50KTsKKyAgRVhQRUNUX0VRKDEsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX1RIUk9XLCB0aHJvd3MgZGlmZmVyZW50CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyh7ICAvLyBOT0xJTlQKKyAgICBhXysrOworICAgIFRocm93QW5JbnRlZ2VyKCk7CisgIH0sIGJvb2wpLCAidGhyb3dzIGEgZGlmZmVyZW50IHR5cGUiKTsKKyAgRVhQRUNUX0VRKDIsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX1RIUk9XLCB0aHJvd3Mgbm90aGluZworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coYV8rKywgYm9vbCksICJ0aHJvd3Mgbm90aGluZyIpOworICBFWFBFQ1RfRVEoMywgYV8pOworCisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX05PX1RIUk9XCisgIEVYUEVDVF9OT19USFJPVyhhXysrKTsKKyAgRVhQRUNUX0VRKDQsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX05PX1RIUk9XCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyh7ICAvLyBOT0xJTlQKKyAgICBhXysrOworICAgIFRocm93QW5JbnRlZ2VyKCk7CisgIH0pLCAiaXQgdGhyb3dzIik7CisgIEVYUEVDVF9FUSg1LCBhXyk7CisKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfQU5ZX1RIUk9XCisgIEVYUEVDVF9BTllfVEhST1coeyAgLy8gTk9MSU5UCisgICAgYV8rKzsKKyAgICBUaHJvd0FuSW50ZWdlcigpOworICB9KTsKKyAgRVhQRUNUX0VRKDYsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX0FOWV9USFJPVworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKGFfKyspLCAiaXQgZG9lc24ndCIpOworICBFWFBFQ1RfRVEoNywgYV8pOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFLgorY2xhc3MgTm9GYXRhbEZhaWx1cmVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTdWNjZWVkcygpIHt9CisgIHZvaWQgRmFpbHNOb25GYXRhbCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJzb21lIG5vbi1mYXRhbCBmYWlsdXJlIjsKKyAgfQorICB2b2lkIEZhaWxzKCkgeworICAgIEZBSUwoKSA8PCAic29tZSBmYXRhbCBmYWlsdXJlIjsKKyAgfQorCisgIHZvaWQgRG9Bc3NlcnROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHMoKSk7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAic2hvbGQgbm90IHJlYWNoIGhlcmUuIjsKKyAgfQorCisgIHZvaWQgRG9FeHBlY3ROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKSB7CisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHMoKSk7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAib3RoZXIgZmFpbHVyZSI7CisgIH0KK307CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE5vRmFpbHVyZSkgeworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWNjZWVkcygpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3VjY2VlZHMoKSk7Cit9CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE5vbkZhdGFsSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShGYWlsc05vbkZhdGFsKCkpLAorICAgICAgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGYWlsc05vbkZhdGFsKCkpLAorICAgICAgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiKTsKK30KKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVPbkZhdGFsRmFpbHVyZSkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOworICB7CisgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKKyAgICBEb0Fzc2VydE5vRmF0YWxGYWlsdXJlT25GYWlscygpOworICB9CisgIEFTU0VSVF9FUSgyLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAic29tZSBmYXRhbCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiaXQgZG9lcyIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKK30KKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgRXhwZWN0Tm9GYXRhbEZhaWx1cmVPbkZhdGFsRmFpbHVyZSkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOworICB7CisgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKKyAgICBEb0V4cGVjdE5vRmF0YWxGYWlsdXJlT25GYWlscygpOworICB9CisgIEFTU0VSVF9FUSgzLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgyKS50eXBlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAic29tZSBmYXRhbCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiaXQgZG9lcyIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIm90aGVyIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDIpLm1lc3NhZ2UoKSk7Cit9CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE1lc3NhZ2VJc1N0cmVhbWFibGUpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlczsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKCZndGVzdF9mYWlsdXJlcyk7CisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8ICJmb28iKSA8PCAibXkgbWVzc2FnZSI7CisgIH0KKyAgQVNTRVJUX0VRKDIsIGd0ZXN0X2ZhaWx1cmVzLnNpemUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLnR5cGUoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJmb28iLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJteSBtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyBub24tc3RyaW5nIGFzc2VydGlvbnMuCisKKy8vIFRlc3RzIEVxRmFpbHVyZSgpLCB1c2VkIGZvciBpbXBsZW1lbnRpbmcgKkVRKiBhc3NlcnRpb25zLgorVEVTVChBc3NlcnRpb25UZXN0LCBFcUZhaWx1cmUpIHsKKyAgY29uc3QgU3RyaW5nIGZvb192YWwoIjUiKSwgYmFyX3ZhbCgiNiIpOworICBjb25zdCBTdHJpbmcgbXNnMSgKKyAgICAgIEVxRmFpbHVyZSgiZm9vIiwgImJhciIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKQorICAgICAgLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiBiYXJcbiIKKyAgICAgICIgIEFjdHVhbDogNlxuIgorICAgICAgIkV4cGVjdGVkOiBmb29cbiIKKyAgICAgICJXaGljaCBpczogNSIsCisgICAgICBtc2cxLmNfc3RyKCkpOworCisgIGNvbnN0IFN0cmluZyBtc2cyKAorICAgICAgRXFGYWlsdXJlKCJmb28iLCAiNiIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKQorICAgICAgLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IGZvb1xuIgorICAgICAgIldoaWNoIGlzOiA1IiwKKyAgICAgIG1zZzIuY19zdHIoKSk7CisKKyAgY29uc3QgU3RyaW5nIG1zZzMoCisgICAgICBFcUZhaWx1cmUoIjUiLCAiYmFyIiwgZm9vX3ZhbCwgYmFyX3ZhbCwgZmFsc2UpCisgICAgICAuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IGJhclxuIgorICAgICAgIiAgQWN0dWFsOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IDUiLAorICAgICAgbXNnMy5jX3N0cigpKTsKKworICBjb25zdCBTdHJpbmcgbXNnNCgKKyAgICAgIEVxRmFpbHVyZSgiNSIsICI2IiwgZm9vX3ZhbCwgYmFyX3ZhbCwgZmFsc2UpLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IDUiLAorICAgICAgbXNnNC5jX3N0cigpKTsKKworICBjb25zdCBTdHJpbmcgbXNnNSgKKyAgICAgIEVxRmFpbHVyZSgiZm9vIiwgImJhciIsCisgICAgICAgICAgICAgICAgU3RyaW5nKCJcInhcIiIpLCBTdHJpbmcoIlwieVwiIiksCisgICAgICAgICAgICAgICAgdHJ1ZSkuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IGJhclxuIgorICAgICAgIiAgQWN0dWFsOiBcInlcIlxuIgorICAgICAgIkV4cGVjdGVkOiBmb28gKGlnbm9yaW5nIGNhc2UpXG4iCisgICAgICAiV2hpY2ggaXM6IFwieFwiIiwKKyAgICAgIG1zZzUuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIEFwcGVuZFVzZXJNZXNzYWdlKCksIHVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgKkVRKiBtYWNyb3MuCitURVNUKEFzc2VydGlvblRlc3QsIEFwcGVuZFVzZXJNZXNzYWdlKSB7CisgIGNvbnN0IFN0cmluZyBmb28oImZvbyIpOworCisgIE1lc3NhZ2UgbXNnOworICBFWFBFQ1RfU1RSRVEoImZvbyIsCisgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShmb28sIG1zZykuY19zdHIoKSk7CisKKyAgbXNnIDw8ICJiYXIiOworICBFWFBFQ1RfU1RSRVEoImZvb1xuYmFyIiwKKyAgICAgICAgICAgICAgIEFwcGVuZFVzZXJNZXNzYWdlKGZvbywgbXNnKS5jX3N0cigpKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyNlbmRpZgorCisvLyBUZXN0cyBBU1NFUlRfVFJVRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1RSVUUpIHsKKyAgQVNTRVJUX1RSVUUoMiA+IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKDIgPCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjIgPCAxIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9UUlVFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQXNzZXJ0VHJ1ZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKKyAgQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuKDIpKTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKFJlc3VsdElzRXZlbigzKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKKyNlbmRpZgorICBBU1NFUlRfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9GQUxTRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0ZBTFNFKSB7CisgIEFTU0VSVF9GQUxTRSgyIDwgMSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKDIgPiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyID4gMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfRkFMU0UocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgorVEVTVChBc3NlcnRpb25UZXN0LCBBc3NlcnRGYWxzZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKKyAgQVNTRVJUX0ZBTFNFKFJlc3VsdElzRXZlbigzKSk7CisjaWZuZGVmIF9fQk9STEFORENfXworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlICgyIGlzIGV2ZW4pXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKKyNlbmRpZgorICBBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQorIyBwcmFnbWEgb3B0aW9uIHBvcAorI2VuZGlmCisKKy8vIFRlc3RzIHVzaW5nIEFTU0VSVF9FUSBvbiBkb3VibGUgdmFsdWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZQorLy8gc3VyZSB0aGF0IHRoZSBzcGVjaWFsaXphdGlvbiB3ZSBkaWQgZm9yIGludGVnZXIgYW5kIGFub255bW91cyBlbnVtcworLy8gaXNuJ3QgdXNlZCBmb3IgZG91YmxlIGFyZ3VtZW50cy4KK1RFU1QoRXhwZWN0VGVzdCwgQVNTRVJUX0VRX0RvdWJsZSkgeworICAvLyBBIHN1Y2Nlc3MuCisgIEFTU0VSVF9FUSg1LjYsIDUuNik7CisKKyAgLy8gQSBmYWlsdXJlLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoNS4xLCA1LjIpLAorICAgICAgICAgICAgICAgICAgICAgICAiNS4xIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9FUS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0VRKSB7CisgIEFTU0VSVF9FUSg1LCAyICsgMyk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSg1LCAyKjMpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIqM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IDZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiA1Iik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9FUShOVUxMLCBwb2ludGVyKS4KKyNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9FUV9OVUxMKSB7CisgIC8vIEEgc3VjY2Vzcy4KKyAgY29uc3QgY2hhciogcCA9IE5VTEw7CisgIC8vIFNvbWUgb2xkZXIgR0NDIHZlcnNpb25zIG1heSBpc3N1ZSBhIHNwdXJpb3VzIHdhcmluZyBpbiB0aGlzIG9yIHRoZSBuZXh0CisgIC8vIGFzc2VydGlvbiBzdGF0ZW1lbnQuIFRoaXMgd2FybmluZyBzaG91bGQgbm90IGJlIHN1cHByZXNzZWQgd2l0aAorICAvLyBzdGF0aWNfY2FzdCBzaW5jZSB0aGUgdGVzdCB2ZXJpZmllcyB0aGUgYWJpbGl0eSB0byB1c2UgYmFyZSBOVUxMIGFzIHRoZQorICAvLyBleHBlY3RlZCBwYXJhbWV0ZXIgdG8gdGhlIG1hY3JvLgorICBBU1NFUlRfRVEoTlVMTCwgcCk7CisKKyAgLy8gQSBmYWlsdXJlLgorICBzdGF0aWMgaW50IG4gPSAwOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoTlVMTCwgJm4pLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6ICZuXG4iKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorCisvLyBUZXN0cyBBU1NFUlRfRVEoMCwgbm9uX3BvaW50ZXIpLiAgU2luY2UgdGhlIGxpdGVyYWwgMCBjYW4gYmUKKy8vIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgYnkgdGhlIGNvbXBpbGVyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCBBU1NFUlRfRVEoMCwgbm9uX3BvaW50ZXIpIGlzbid0IGludGVycHJldGVkIGJ5IEdvb2dsZSBUZXN0IGFzCisvLyBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8dm9pZCo+KE5VTEwpLCBub25fcG9pbnRlcikuCitURVNUKEV4cGVjdFRlc3QsIEFTU0VSVF9FUV8wKSB7CisgIGludCBuID0gMDsKKworICAvLyBBIHN1Y2Nlc3MuCisgIEFTU0VSVF9FUSgwLCBuKTsKKworICAvLyBBIGZhaWx1cmUuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSgwLCA1LjYpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDAiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX05FLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTkUpIHsKKyAgQVNTRVJUX05FKDYsIDcpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkUoJ2EnLCAnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgnYScpICE9ICgnYScpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJhY3R1YWw6ICdhJyAoOTcsIDB4NjEpIHZzICdhJyAoOTcsIDB4NjEpIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9MRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0xFKSB7CisgIEFTU0VSVF9MRSgyLCAzKTsKKyAgQVNTRVJUX0xFKDIsIDIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTEUoMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDw9ICgwKSwgYWN0dWFsOiAyIHZzIDAiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0xULgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTFQpIHsKKyAgQVNTRVJUX0xUKDIsIDMpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTFQoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDwgKDIpLCBhY3R1YWw6IDIgdnMgMiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfR0UuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9HRSkgeworICBBU1NFUlRfR0UoMiwgMSk7CisgIEFTU0VSVF9HRSgyLCAyKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKDIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+PSAoMyksIGFjdHVhbDogMiB2cyAzIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9HVC4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0dUKSB7CisgIEFTU0VSVF9HVCgyLCAxKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dUKDIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK3ZvaWQgVGhyb3dOb3RoaW5nKCkge30KKworLy8gVGVzdHMgQVNTRVJUX1RIUk9XLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfVEhST1cpIHsKKyAgQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCk7CisKKyMgaWZuZGVmIF9fQk9STEFORENfXworCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIgMjAwNyBhbmQgMjAwOS4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCisgICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiIpOworIyBlbmRpZgorCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCisgICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfTk9fVEhST1cuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9OT19USFJPVykgeworICBBU1NFUlRfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbi4iCisgICAgICAgICAgICAgICAgICAgICAgICJcbiAgQWN0dWFsOiBpdCB0aHJvd3MuIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9BTllfVEhST1cuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9BTllfVEhST1cpIHsKKyAgQVNTRVJUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIKKyAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBNYWtlcyBzdXJlIHdlIGRlYWwgd2l0aCB0aGUgcHJlY2VkZW5jZSBvZiA8PC4gIFRoaXMgdGVzdCBzaG91bGQKKy8vIGNvbXBpbGUuCitURVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFByZWNlZGVuY2UpIHsKKyAgQVNTRVJUX0VRKDEgPCAyLCB0cnVlKTsKKyAgYm9vbCBmYWxzZV92YWx1ZSA9IGZhbHNlOworICBBU1NFUlRfRVEodHJ1ZSAmJiBmYWxzZV92YWx1ZSwgZmFsc2UpOworfQorCisvLyBBIHN1YnJvdXRpbmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIHRlc3QuCit2b2lkIFRlc3RFcTEoaW50IHgpIHsKKyAgQVNTRVJUX0VRKDEsIHgpOworfQorCisvLyBUZXN0cyBjYWxsaW5nIGEgdGVzdCBzdWJyb3V0aW5lIHRoYXQncyBub3QgcGFydCBvZiBhIGZpeHR1cmUuCitURVNUKEFzc2VydGlvblRlc3QsIE5vbkZpeHR1cmVTdWJyb3V0aW5lKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RFcTEoMiksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogeCIpOworfQorCisvLyBBbiB1bmNvcHlhYmxlIGNsYXNzLgorY2xhc3MgVW5jb3B5YWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBVbmNvcHlhYmxlKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorCisgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5jb3B5YWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlKCkgPT0gcmhzLnZhbHVlKCk7CisgIH0KKyBwcml2YXRlOgorICAvLyBUaGlzIGNvbnN0cnVjdG9yIGRlbGliZXJhdGVseSBoYXMgbm8gaW1wbGVtZW50YXRpb24sIGFzIHdlIGRvbid0CisgIC8vIHdhbnQgdGhpcyBjbGFzcyB0byBiZSBjb3B5YWJsZS4KKyAgVW5jb3B5YWJsZShjb25zdCBVbmNvcHlhYmxlJik7ICAvLyBOT0xJTlQKKworICBpbnQgdmFsdWVfOworfTsKKworOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBVbmNvcHlhYmxlJiB2YWx1ZSkgeworICByZXR1cm4gb3MgPDwgdmFsdWUudmFsdWUoKTsKK30KKworCitib29sIElzUG9zaXRpdmVVbmNvcHlhYmxlKGNvbnN0IFVuY29weWFibGUmIHgpIHsKKyAgcmV0dXJuIHgudmFsdWUoKSA+IDA7Cit9CisKKy8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KK3ZvaWQgVGVzdEFzc2VydE5vblBvc2l0aXZlKCkgeworICBVbmNvcHlhYmxlIHkoLTEpOworICBBU1NFUlRfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHkpOworfQorLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgordm9pZCBUZXN0QXNzZXJ0RXF1YWxzVW5jb3B5YWJsZSgpIHsKKyAgVW5jb3B5YWJsZSB4KDUpOworICBVbmNvcHlhYmxlIHkoLTEpOworICBBU1NFUlRfRVEoeCwgeSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdW5jb3B5YWJsZSBvYmplY3RzIGNhbiBiZSB1c2VkIGluIGFzc2VydGlvbnMuCitURVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFdvcmtzV2l0aFVuY29weWFibGVPYmplY3QpIHsKKyAgVW5jb3B5YWJsZSB4KDUpOworICBBU1NFUlRfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHgpOworICBBU1NFUlRfRVEoeCwgeCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RBc3NlcnROb25Qb3NpdGl2ZSgpLAorICAgICJJc1Bvc2l0aXZlVW5jb3B5YWJsZSh5KSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlXG55IGV2YWx1YXRlcyB0byAtMSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShUZXN0QXNzZXJ0RXF1YWxzVW5jb3B5YWJsZSgpLAorICAgICJWYWx1ZSBvZjogeVxuICBBY3R1YWw6IC0xXG5FeHBlY3RlZDogeFxuV2hpY2ggaXM6IDUiKTsKK30KKworLy8gVGVzdHMgdGhhdCB1bmNvcHlhYmxlIG9iamVjdHMgY2FuIGJlIHVzZWQgaW4gZXhwZWN0cy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgRXhwZWN0V29ya3NXaXRoVW5jb3B5YWJsZU9iamVjdCkgeworICBVbmNvcHlhYmxlIHgoNSk7CisgIEVYUEVDVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeCk7CisgIFVuY29weWFibGUgeSgtMSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeSksCisgICAgIklzUG9zaXRpdmVVbmNvcHlhYmxlKHkpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmVcbnkgZXZhbHVhdGVzIHRvIC0xIik7CisgIEVYUEVDVF9FUSh4LCB4KTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHgsIHkpLAorICAgICJWYWx1ZSBvZjogeVxuICBBY3R1YWw6IC0xXG5FeHBlY3RlZDogeFxuV2hpY2ggaXM6IDUiKTsKK30KKworZW51bSBOYW1lZEVudW0geworICBrRTEgPSAwLAorICBrRTIgPSAxCit9OworCitURVNUKEFzc2VydGlvblRlc3QsIE5hbWVkRW51bSkgeworICBFWFBFQ1RfRVEoa0UxLCBrRTEpOworICBFWFBFQ1RfTFQoa0UxLCBrRTIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoa0UxLCBrRTIpLCAiV2hpY2ggaXM6IDAiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKGtFMSwga0UyKSwgIkFjdHVhbDogMSIpOworfQorCisvLyBUaGUgdmVyc2lvbiBvZiBnY2MgdXNlZCBpbiBYQ29kZSAyLjIgaGFzIGEgYnVnIGFuZCBkb2Vzbid0IGFsbG93CisvLyBhbm9ueW1vdXMgZW51bXMgaW4gYXNzZXJ0aW9ucy4gIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHRlc3QgaXMgbm90CisvLyBkb25lIG9uIE1hYy4KKy8vIFN1biBTdHVkaW8gYW5kIEhQIGFDQyBhbHNvIHJlamVjdCB0aGlzIGNvZGUuCisjaWYgIUdURVNUX09TX01BQyAmJiAhZGVmaW5lZChfX1NVTlBST19DQykgJiYgIWRlZmluZWQoX19IUF9hQ0MpCisKKy8vIFRlc3RzIHVzaW5nIGFzc2VydGlvbnMgd2l0aCBhbm9ueW1vdXMgZW51bXMuCitlbnVtIHsKKyAga0Nhc2VBID0gLTEsCisKKyMgaWYgR1RFU1RfT1NfTElOVVgKKworICAvLyBXZSB3YW50IHRvIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIHNpemUgb2YgdGhlIGFub255bW91cyBlbnVtIGlzCisgIC8vIGxhcmdlciB0aGFuIHNpemVvZihpbnQpLCB0byBtYWtlIHN1cmUgb3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAvLyBhc3NlcnRpb25zIGRvZXNuJ3QgdHJ1bmNhdGUgdGhlIGVudW1zLiAgSG93ZXZlciwgTVNWQworICAvLyAoaW5jb3JyZWN0bHkpIGRvZXNuJ3QgYWxsb3cgYW4gZW51bSB2YWx1ZSB0byBleGNlZWQgdGhlIHJhbmdlIG9mCisgIC8vIGFuIGludCwgc28gdGhpcyBoYXMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KKyAgLy8KKyAgLy8gT24gTGludXgsIGtDYXNlQiBhbmQga0Nhc2VBIGhhdmUgdGhlIHNhbWUgdmFsdWUgd2hlbiB0cnVuY2F0ZWQgdG8KKyAgLy8gaW50IHNpemUuICBXZSB3YW50IHRvIHRlc3Qgd2hldGhlciB0aGlzIHdpbGwgY29uZnVzZSB0aGUKKyAgLy8gYXNzZXJ0aW9ucy4KKyAga0Nhc2VCID0gdGVzdGluZzo6aW50ZXJuYWw6OmtNYXhCaWdnZXN0SW50LAorCisjIGVsc2UKKworICBrQ2FzZUIgPSBJTlRfTUFYLAorCisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisgIGtDYXNlQyA9IDQyCit9OworCitURVNUKEFzc2VydGlvblRlc3QsIEFub255bW91c0VudW0pIHsKKyMgaWYgR1RFU1RfT1NfTElOVVgKKworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrQ2FzZUEpLCBzdGF0aWNfY2FzdDxpbnQ+KGtDYXNlQikpOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisgIEVYUEVDVF9FUShrQ2FzZUEsIGtDYXNlQSk7CisgIEVYUEVDVF9ORShrQ2FzZUEsIGtDYXNlQik7CisgIEVYUEVDVF9MVChrQ2FzZUEsIGtDYXNlQik7CisgIEVYUEVDVF9MRShrQ2FzZUEsIGtDYXNlQik7CisgIEVYUEVDVF9HVChrQ2FzZUIsIGtDYXNlQSk7CisgIEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoa0Nhc2VBKSA+PSAoa0Nhc2VCKSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0Uoa0Nhc2VBLCBrQ2FzZUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLTEgdnMgNDIiKTsKKworICBBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUEpOworICBBU1NFUlRfTkUoa0Nhc2VBLCBrQ2FzZUIpOworICBBU1NFUlRfTFQoa0Nhc2VBLCBrQ2FzZUIpOworICBBU1NFUlRfTEUoa0Nhc2VBLCBrQ2FzZUIpOworICBBU1NFUlRfR1Qoa0Nhc2VCLCBrQ2FzZUEpOworICBBU1NFUlRfR0Uoa0Nhc2VBLCBrQ2FzZUEpOworCisjIGlmbmRlZiBfX0JPUkxBTkRDX18KKworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUIpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IGtDYXNlQiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsOiA0MiIpOworIyBlbmRpZgorCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShrQ2FzZUEsIGtDYXNlQyksCisgICAgICAgICAgICAgICAgICAgICAgICJXaGljaCBpczogLTEiKTsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfT1NfTUFDICYmICFkZWZpbmVkKF9fU1VOUFJPX0NDKQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCitzdGF0aWMgSFJFU1VMVCBVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSB7CisgIHJldHVybiBFX1VORVhQRUNURUQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIE9rSFJFU1VMVFN1Y2Nlc3MoKSB7CisgIHJldHVybiBTX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBGYWxzZUhSRVNVTFRTdWNjZXNzKCkgeworICByZXR1cm4gU19GQUxTRTsKK30KKworLy8gSFJFU1VMVCBhc3NlcnRpb24gdGVzdHMgdGVzdCBib3RoIHplcm8gYW5kIG5vbi16ZXJvCisvLyBzdWNjZXNzIGNvZGVzIGFzIHdlbGwgYXMgZmFpbHVyZSBtZXNzYWdlIGZvciBlYWNoLgorLy8KKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBzdXBwb3J0IG1lc3NhZ2UgdGV4dHMuCitURVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQpIHsKKyAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFNfT0spOworICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19GQUxTRSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSwKKyAgICAiRXhwZWN0ZWQ6IChVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSkgc3VjY2VlZHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDgwMDBGRkZGIik7Cit9CisKK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRCkgeworICBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoU19PSyk7CisgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX0ZBTFNFKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkpLAorICAgICJFeHBlY3RlZDogKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSBzdWNjZWVkcy5cbiIKKyAgICAiICBBY3R1YWw6IDB4ODAwMEZGRkYiKTsKK30KKworVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKSB7CisgIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChPa0hSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKE9rSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAwMDAwMDAwIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAwMDAwMDAxIik7Cit9CisKK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRCkgeworICBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoRV9VTkVYUEVDVEVEKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9GQUlMRUQoT2tIUkVTVUxUU3VjY2VzcygpKSwKKyAgICAiRXhwZWN0ZWQ6IChPa0hSRVNVTFRTdWNjZXNzKCkpIGZhaWxzLlxuIgorICAgICIgIEFjdHVhbDogMHgwMDAwMDAwMCIpOworIyBlbmRpZgorCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAwMDAwMDAxIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RyZWFtaW5nIHRvIHRoZSBIUkVTVUxUIG1hY3JvcyB3b3Jrcy4KK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIFN0cmVhbWluZykgeworICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19PSykgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX09LKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKEVfVU5FWFBFQ1RFRCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKEVfVU5FWFBFQ1RFRCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChFX1VORVhQRUNURUQpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisjIGVuZGlmCisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoU19PSykgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChTX09LKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IHRoZSBhc3NlcnRpb24gbWFjcm9zIGJlaGF2ZSBsaWtlIHNpbmdsZSBzdGF0ZW1lbnRzLgorVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBCYXNpY0Fzc2VydGlvbnNCZWhhdmVzTGlrZVNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCdzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5LiI7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBFWFBFQ1RfRkFMU0UoZmFsc2UpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX0xUKDEsIDMpOworCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgRVhQRUNUX0dUKDMsIDIpIDw8ICIiOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKy8vIFRlc3RzIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIGNvZGUgaW4gdGhlCisvLyBFWFBFQ1RfVEhST1cvRVhQRUNUX0FOWV9USFJPVy9FWFBFQ1RfTk9fVEhST1cgbWFjcm9zLgorVEVTVChFeHBlY3RUaHJvd1Rlc3QsIERvZXNOb3RHZW5lcmF0ZVVucmVhY2hhYmxlQ29kZVdhcm5pbmcpIHsKKyAgaW50IG4gPSAwOworCisgIEVYUEVDVF9USFJPVyh0aHJvdyAxLCBpbnQpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1cobisrLCBpbnQpLCAiIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyh0aHJvdyAxLCBjb25zdCBjaGFyKiksICIiKTsKKyAgRVhQRUNUX05PX1RIUk9XKG4rKyk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyh0aHJvdyAxKSwgIiIpOworICBFWFBFQ1RfQU5ZX1RIUk9XKHRocm93IDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKG4rKyksICIiKTsKK30KKworVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBFeGNlcHRpb25Bc3NlcnRpb25zQmVoYXZlc0xpa2VTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgRVhQRUNUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKTsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgRVhQRUNUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX05PX1RIUk9XKFRocm93Tm90aGluZygpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCitURVNUKEFzc2VydGlvblN5bnRheFRlc3QsIE5vRmF0YWxGYWlsdXJlQXNzZXJ0aW9uc0JlaGF2ZXNMaWtlU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEZBSUwoKSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiSXQncyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seS4iOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpKSA8PCAiIjsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYXNzZXJ0aW9uIG1hY3JvcyB3b3JrIHdlbGwgd2l0aCBzd2l0Y2ggc3RhdGVtZW50cy4KK1RFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgV29ya3NXaXRoU3dpdGNoKSB7CisgIHN3aXRjaCAoMCkgeworICAgIGNhc2UgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlRfVFJVRSh0cnVlKTsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfRkFMU0UoZmFsc2UpIDw8ICJFWFBFQ1RfRkFMU0UgZmFpbGVkIGluIHN3aXRjaCBjYXNlIjsKKworICAvLyBCaW5hcnkgYXNzZXJ0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYSBkaWZmZXJlbnQgY29kZSBwYXRoCisgIC8vIHRoYW4gdGhlIEJvb2xlYW4gYXNzZXJ0aW9ucy4gIEhlbmNlIHdlIHRlc3QgdGhlbSBzZXBhcmF0ZWx5LgorICBzd2l0Y2ggKDApIHsKKyAgICBjYXNlIDE6CisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9FUSgxLCAxKSA8PCAiQVNTRVJUX0VRIGZhaWxlZCBpbiBkZWZhdWx0IHN3aXRjaCBoYW5kbGVyIjsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfTkUoMSwgMik7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit2b2lkIFRocm93QVN0cmluZygpIHsKKyAgICB0aHJvdyAiU3RyaW5nIjsKK30KKworLy8gVGVzdCB0aGF0IHRoZSBleGNlcHRpb24gYXNzZXJ0aW9uIG1hY3JvcyBjb21waWxlIGFuZCB3b3JrIHdpdGggY29uc3QKKy8vIHR5cGUgcXVhbGlmaWVyLgorVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBXb3Jrc1dpdGhDb25zdCkgeworICAgIEFTU0VSVF9USFJPVyhUaHJvd0FTdHJpbmcoKSwgY29uc3QgY2hhciopOworCisgICAgRVhQRUNUX1RIUk9XKFRocm93QVN0cmluZygpLCBjb25zdCBjaGFyKik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCB0cmFja3MgU1VDQ0VFRCouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBTVUNDRUVEKSB7CisgIFNVQ0NFRUQoKTsKKyAgU1VDQ0VFRCgpIDw8ICJPSyI7CisgIEVYUEVDVF9FUSgyLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzc2Z1bCBFWFBFQ1RfKi4KK1RFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIEVYUEVDVCkgeworICBFWFBFQ1RfVFJVRSh0cnVlKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEVYUEVDVF9TVFIqLgorVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgRVhQRUNUX1NUUikgeworICBFWFBFQ1RfU1RSRVEoIiIsICIiKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEFTU0VSVF8qLgorVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgQVNTRVJUKSB7CisgIEFTU0VSVF9UUlVFKHRydWUpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgQVNTRVJUX1NUUiouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSKSB7CisgIEFTU0VSVF9TVFJFUSgiIiwgIiIpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworbmFtZXNwYWNlIHsKKworLy8gVGVzdHMgRVhQRUNUX1RSVUUuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9UUlVFKSB7CisgIEVYUEVDVF9UUlVFKDIgPiAxKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgyIDwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogMiA8IDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoMiA+IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiA+IDMiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX1RSVUUocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgorVEVTVChFeHBlY3RUZXN0LCBFeHBlY3RUcnVlV2l0aEFzc2VydGlvblJlc3VsdCkgeworICBFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW4oMikpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW4oMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbigzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7CisgIEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMikpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0ZBTFNFLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRkFMU0UpIHsKKyAgRVhQRUNUX0ZBTFNFKDIgPCAxKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoMiA+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIgPiAxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSgyIDwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIyIDwgMyIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfRkFMU0UocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgorVEVTVChFeHBlY3RUZXN0LCBFeHBlY3RGYWxzZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKKyAgRVhQRUNUX0ZBTFNFKFJlc3VsdElzRXZlbigzKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW4oMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbigyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWUgKDIgaXMgZXZlbilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworICBFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQorIyBwcmFnbWEgb3B0aW9uIHBvcAorI2VuZGlmCisKKy8vIFRlc3RzIEVYUEVDVF9FUS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRKSB7CisgIEVYUEVDVF9FUSg1LCAyICsgMyk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg1LCAyKjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIqM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IDZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiA1Iik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg1LCAyIC0gMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIyIC0gMyIpOworfQorCisvLyBUZXN0cyB1c2luZyBFWFBFQ1RfRVEgb24gZG91YmxlIHZhbHVlcy4gIFRoZSBwdXJwb3NlIGlzIHRvIG1ha2UKKy8vIHN1cmUgdGhhdCB0aGUgc3BlY2lhbGl6YXRpb24gd2UgZGlkIGZvciBpbnRlZ2VyIGFuZCBhbm9ueW1vdXMgZW51bXMKKy8vIGlzbid0IHVzZWQgZm9yIGRvdWJsZSBhcmd1bWVudHMuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9FUV9Eb3VibGUpIHsKKyAgLy8gQSBzdWNjZXNzLgorICBFWFBFQ1RfRVEoNS42LCA1LjYpOworCisgIC8vIEEgZmFpbHVyZS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDUuMSwgNS4yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjUuMSIpOworfQorCisjaWYgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorLy8gVGVzdHMgRVhQRUNUX0VRKE5VTEwsIHBvaW50ZXIpLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVFfTlVMTCkgeworICAvLyBBIHN1Y2Nlc3MuCisgIGNvbnN0IGNoYXIqIHAgPSBOVUxMOworICAvLyBTb21lIG9sZGVyIEdDQyB2ZXJzaW9ucyBtYXkgaXNzdWUgYSBzcHVyaW91cyB3YXJuaW5nIGluIHRoaXMgb3IgdGhlIG5leHQKKyAgLy8gYXNzZXJ0aW9uIHN0YXRlbWVudC4gVGhpcyB3YXJuaW5nIHNob3VsZCBub3QgYmUgc3VwcHJlc3NlZCB3aXRoCisgIC8vIHN0YXRpY19jYXN0IHNpbmNlIHRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBhYmlsaXR5IHRvIHVzZSBiYXJlIE5VTEwgYXMgdGhlCisgIC8vIGV4cGVjdGVkIHBhcmFtZXRlciB0byB0aGUgbWFjcm8uCisgIEVYUEVDVF9FUShOVUxMLCBwKTsKKworICAvLyBBIGZhaWx1cmUuCisgIGludCBuID0gMDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKE5VTEwsICZuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAmblxuIik7Cit9CisjZW5kaWYgIC8vIEdURVNUX0NBTl9DT01QQVJFX05VTEwKKworLy8gVGVzdHMgRVhQRUNUX0VRKDAsIG5vbl9wb2ludGVyKS4gIFNpbmNlIHRoZSBsaXRlcmFsIDAgY2FuIGJlCisvLyB0cmVhdGVkIGFzIGEgbnVsbCBwb2ludGVyIGJ5IHRoZSBjb21waWxlciwgd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgRVhQRUNUX0VRKDAsIG5vbl9wb2ludGVyKSBpc24ndCBpbnRlcnByZXRlZCBieSBHb29nbGUgVGVzdCBhcworLy8gRVhQRUNUX0VRKHN0YXRpY19jYXN0PHZvaWQqPihOVUxMKSwgbm9uX3BvaW50ZXIpLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVFfMCkgeworICBpbnQgbiA9IDA7CisKKyAgLy8gQSBzdWNjZXNzLgorICBFWFBFQ1RfRVEoMCwgbik7CisKKyAgLy8gQSBmYWlsdXJlLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoMCwgNS42KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAwIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9ORS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX05FKSB7CisgIEVYUEVDVF9ORSg2LCA3KTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUoJ2EnLCAnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgnYScpICE9ICgnYScpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3R1YWw6ICdhJyAoOTcsIDB4NjEpIHZzICdhJyAoOTcsIDB4NjEpIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORSgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiKTsKKyAgY2hhciogY29uc3QgcDAgPSBOVUxMOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUocDAsIHAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInAwIik7CisgIC8vIE9ubHkgd2F5IHRvIGdldCB0aGUgTm9raWEgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgY2FzdAorICAvLyBpcyB0byBoYXZlIGEgc2VwYXJhdGUgdm9pZCogdmFyaWFibGUgZmlyc3QuIFB1dHRpbmcKKyAgLy8gdGhlIHR3byBjYXN0cyBvbiB0aGUgc2FtZSBsaW5lIGRvZXNuJ3Qgd29yaywgbmVpdGhlciBkb2VzCisgIC8vIGEgZGlyZWN0IEMtc3R5bGUgdG8gY2hhciouCisgIHZvaWQqIHB2MSA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKKyAgY2hhciogY29uc3QgcDEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdjEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUocDEsIHAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInAxIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9MRS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0xFKSB7CisgIEVYUEVDVF9MRSgyLCAzKTsKKyAgRVhQRUNUX0xFKDIsIDIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTEUoMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDw9ICgwKSwgYWN0dWFsOiAyIHZzIDAiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xFKDEuMSwgMC45KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigxLjEpIDw9ICgwLjkpIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9MVC4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0xUKSB7CisgIEVYUEVDVF9MVCgyLCAzKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA8ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIDwgKDEpIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9HRS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0dFKSB7CisgIEVYUEVDVF9HRSgyLCAxKTsKKyAgRVhQRUNUX0dFKDIsIDIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0UoMiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpID49ICgzKSwgYWN0dWFsOiAyIHZzIDMiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dFKDAuOSwgMS4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigwLjkpID49ICgxLjEpIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9HVC4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0dUKSB7CisgIEVYUEVDVF9HVCgyLCAxKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKDIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKDIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpID4gKDMpIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBUZXN0cyBFWFBFQ1RfVEhST1cuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9USFJPVykgeworICBFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIGJvb2wuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCisgICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTk9fVEhST1cuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9OT19USFJPVykgeworICBFWFBFQ1RfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSBkb2Vzbid0IHRocm93IGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbi5cbiAgQWN0dWFsOiBpdCB0aHJvd3MuIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9BTllfVEhST1cuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9BTllfVEhST1cpIHsKKyAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIKKyAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBNYWtlIHN1cmUgd2UgZGVhbCB3aXRoIHRoZSBwcmVjZWRlbmNlIG9mIDw8LgorVEVTVChFeHBlY3RUZXN0LCBFeHBlY3RQcmVjZWRlbmNlKSB7CisgIEVYUEVDVF9FUSgxIDwgMiwgdHJ1ZSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh0cnVlLCB0cnVlICYmIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiB0cnVlICYmIGZhbHNlIik7Cit9CisKKworLy8gVGVzdHMgdGhlIFN0cmVhbWFibGVUb1N0cmluZygpIGZ1bmN0aW9uLgorCisvLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIHNjYWxhci4KK1RFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgU2NhbGFyKSB7CisgIEVYUEVDVF9TVFJFUSgiNSIsIFN0cmVhbWFibGVUb1N0cmluZyg1KS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBub24tY2hhciBwb2ludGVyLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBQb2ludGVyKSB7CisgIGludCBuID0gMDsKKyAgaW50KiBwID0gJm47CisgIEVYUEVDVF9TVFJORSgiKG51bGwpIiwgU3RyZWFtYWJsZVRvU3RyaW5nKHApLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIE5VTEwgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgTnVsbFBvaW50ZXIpIHsKKyAgaW50KiBwID0gTlVMTDsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLCBTdHJlYW1hYmxlVG9TdHJpbmcocCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgQyBzdHJpbmcuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIENTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJGb28iLCBTdHJlYW1hYmxlVG9TdHJpbmcoIkZvbyIpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIE5VTEwgQyBzdHJpbmcuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIE51bGxDU3RyaW5nKSB7CisgIGNoYXIqIHAgPSBOVUxMOworICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsIFN0cmVhbWFibGVUb1N0cmluZyhwKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgc3RyZWFtYWJsZSB2YWx1ZXMgYXMgYXNzZXJ0aW9uIG1lc3NhZ2VzLgorCisvLyBUZXN0cyB1c2luZyBzdGQ6OnN0cmluZyBhcyBhbiBhc3NlcnRpb24gbWVzc2FnZS4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIHN0cmluZykgeworICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc3RyKAorICAgICAgIlRoaXMgZmFpbHVyZSBtZXNzYWdlIGlzIGEgc3RkOjpzdHJpbmcsIGFuZCBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgc3RyaW5ncyBjb250YWluaW5nIGVtYmVkZGVkIE5VTHMuCisvLyBMaW1pdGVkIHRvIExpbnV4IGJlY2F1c2Ugd2UgY2FuIG9ubHkgZG8gdGhpcyB3aXRoIHN0ZDo6c3RyaW5nJ3MuCitURVNUKFN0cmVhbWFibGVUZXN0LCBzdHJpbmdXaXRoRW1iZWRkZWROVUwpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcl9hcnJheV93aXRoX251bFtdID0KKyAgICAgICJIZXJlJ3MgYSBOVUxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyI7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdfd2l0aF9udWwoY2hhcl9hcnJheV93aXRoX251bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcl9hcnJheV93aXRoX251bCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpOyAgLy8gZHJvcHMgdGhlIHRyYWlsaW5nIE5VTAorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgc3RyaW5nX3dpdGhfbnVsLAorICAgICAgICAgICAgICAgICAgICAgICAiSGVyZSdzIGEgTlVMXFwwIGFuZCBzb21lIG1vcmUgc3RyaW5nIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIG91dHB1dCBhIE5VTCBjaGFyLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgTlVMQ2hhcikgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBGQUlMKCkgPDwgIkEgTlVMIiA8PCAnXDAnIDw8ICIgYW5kIHNvbWUgbW9yZSBzdHJpbmciOworICB9LCAiQSBOVUxcXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciKTsKK30KKworLy8gVGVzdHMgdXNpbmcgaW50IGFzIGFuIGFzc2VydGlvbiBtZXNzYWdlLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgaW50KSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCA5MDA5MTMsCisgICAgICAgICAgICAgICAgICAgICAgICI5MDA5MTMiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgTlVMTCBjaGFyIHBvaW50ZXIgYXMgYW4gYXNzZXJ0aW9uIG1lc3NhZ2UuCisvLworLy8gSW4gTVNWQywgc3RyZWFtaW5nIGEgTlVMTCBjaGFyICogY2F1c2VzIGFjY2VzcyB2aW9sYXRpb24uICBHb29nbGUgVGVzdAorLy8gaW1wbGVtZW50ZWQgYSB3b3JrYXJvdW5kIChzdWJzdGl0dXRpbmcgIihudWxsKSIgZm9yIE5VTEwpLiAgVGhpcworLy8gdGVzdHMgd2hldGhlciB0aGUgd29ya2Fyb3VuZCB3b3Jrcy4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIE51bGxDaGFyUHRyKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICIobnVsbCkiKTsKK30KKworLy8gVGVzdHMgdGhhdCBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgY2FuIGJlCisvLyBzdHJlYW1lZCB0byB0ZXN0aW5nOjpNZXNzYWdlLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgQmFzaWNJb01hbmlwKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEZBSUwoKSA8PCAiTGluZSAxLiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgIDw8ICJBIE5VTCBjaGFyICIgPDwgc3RkOjplbmRzIDw8IHN0ZDo6Zmx1c2ggPDwgIiBpbiBsaW5lIDIuIjsKKyAgfSwgIkxpbmUgMS5cbkEgTlVMIGNoYXIgXFwwIGluIGxpbmUgMi4iKTsKK30KKworLy8gVGVzdHMgdGhlIG1hY3JvcyB0aGF0IGhhdmVuJ3QgYmVlbiBjb3ZlcmVkIHNvIGZhci4KKwordm9pZCBBZGRGYWlsdXJlSGVscGVyKGJvb2wqIGFib3J0ZWQpIHsKKyAgKmFib3J0ZWQgPSB0cnVlOworICBBRERfRkFJTFVSRSgpIDw8ICJGYWlsdXJlIjsKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworLy8gVGVzdHMgQUREX0ZBSUxVUkUuCitURVNUKE1hY3JvVGVzdCwgQUREX0ZBSUxVUkUpIHsKKyAgYm9vbCBhYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZUhlbHBlcigmYWJvcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsdXJlIik7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgQUREX0ZBSUxVUkVfQVQuCitURVNUKE1hY3JvVGVzdCwgQUREX0ZBSUxVUkVfQVQpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBBRERfRkFJTFVSRV9BVCBkb2VzIGdlbmVyYXRlIGEgbm9uZmF0YWwgZmFpbHVyZSBhbmQKKyAgLy8gdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUgdXNlci1zdHJlYW1lZCBwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpIDw8ICJXcm9uZyEiLCAiV3JvbmchIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdXNlci1zdHJlYW1lZCBwYXJ0IGlzIG9wdGlvbmFsLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpLCAiRmFpbGVkIik7CisKKyAgLy8gVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHZlcmlmeSB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMKKyAgLy8gdGhlIHJpZ2h0IGZpbGUgcGF0aCBhbmQgbGluZSBudW1iZXIgdGhlIHNhbWUgd2F5LCBhcworICAvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGRvZXNuJ3QgZ2V0IHRvIHNlZSB0aGUgZmlsZSBwYXRoIGFuZAorICAvLyBsaW5lIG51bWJlci4gIEluc3RlYWQsIHdlIGRvIHRoYXQgaW4gZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjLgorfQorCisvLyBUZXN0cyBGQUlMLgorVEVTVChNYWNyb1Rlc3QsIEZBSUwpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgU1VDQ0VFRAorVEVTVChNYWNyb1Rlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpOworICBTVUNDRUVEKCkgPDwgIkV4cGxpY2l0IHN1Y2Nlc3MuIjsKK30KKworCisvLyBUZXN0cyBmb3IgRVhQRUNUX0VRKCkgYW5kIEFTU0VSVF9FUSgpLgorLy8KKy8vIFRoZXNlIHRlc3RzIGZhaWwgKmludGVudGlvbmFsbHkqLCBzLnQuIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIGNhbiBiZQorLy8gZ2VuZXJhdGVkIGFuZCB0ZXN0ZWQuCisvLworLy8gV2UgaGF2ZSBkaWZmZXJlbnQgdGVzdHMgZm9yIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcy4KKworLy8gVGVzdHMgdXNpbmcgYm9vbCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIEJvb2wpIHsKKyAgRVhQRUNUX0VRKHRydWUsICB0cnVlKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgICAgYm9vbCBmYWxzZV92YWx1ZSA9IGZhbHNlOworICAgICAgQVNTRVJUX0VRKGZhbHNlX3ZhbHVlLCB0cnVlKTsKKyAgICB9LCAiVmFsdWUgb2Y6IHRydWUiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgaW50IHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgSW50KSB7CisgIEFTU0VSVF9FUSgzMiwgMzIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoMzIsIDMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjMzIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHRpbWVfdCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFRpbWVfVCkgeworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dGltZV90PigwKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHRpbWVfdD4oMCkpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8dGltZV90PigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRpbWVfdD4oMTIzNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAiMTIzNCIpOworfQorCisvLyBUZXN0cyB1c2luZyBjaGFyIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgQ2hhcikgeworICBBU1NFUlRfRVEoJ3onLCAneicpOworICBjb25zdCBjaGFyIGNoID0gJ2InOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoJ1wwJywgY2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2giKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKCdhJywgY2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2giKTsKK30KKworLy8gVGVzdHMgdXNpbmcgd2NoYXJfdCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFdpZGVDaGFyKSB7CisgIEVYUEVDVF9FUShMJ2InLCBMJ2InKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoTCdcMCcsIEwneCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IEwneCdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBMJ3gnICgxMjAsIDB4NzgpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogTCdcMCdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaWNoIGlzOiBMJ1wwJyAoMCwgMHgwKSIpOworCisgIHN0YXRpYyB3Y2hhcl90IHdjaGFyOworICB3Y2hhciA9IEwnYic7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShMJ2EnLCB3Y2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3Y2hhciIpOworICB3Y2hhciA9IDB4ODExOTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4ODEyMCksIHdjaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiB3Y2hhciIpOworfQorCisvLyBUZXN0cyB1c2luZyA6OnN0ZDo6c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgU3RkU3RyaW5nKSB7CisgIC8vIENvbXBhcmVzIGEgY29uc3QgY2hhciogdG8gYW4gc3RkOjpzdHJpbmcgdGhhdCBoYXMgaWRlbnRpY2FsCisgIC8vIGNvbnRlbnQuCisgIEFTU0VSVF9FUSgiVGVzdCIsIDo6c3RkOjpzdHJpbmcoIlRlc3QiKSk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCBzdGQ6OnN0cmluZ3MuCisgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cjEoIkEgKiBpbiB0aGUgbWlkZGxlIik7CisgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cjIoc3RyMSk7CisgIEVYUEVDVF9FUShzdHIxLCBzdHIyKTsKKworICAvLyBDb21wYXJlcyBhIGNvbnN0IGNoYXIqIHRvIGFuIHN0ZDo6c3RyaW5nIHRoYXQgaGFzIGRpZmZlcmVudAorICAvLyBjb250ZW50CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgiVGVzdCIsIDo6c3RkOjpzdHJpbmcoInRlc3QiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICI6OnN0ZDo6c3RyaW5nKFwidGVzdFwiKSIpOworCisgIC8vIENvbXBhcmVzIGFuIHN0ZDo6c3RyaW5nIHRvIGEgY2hhciogdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIGNoYXIqIGNvbnN0IHAxID0gY29uc3RfY2FzdDxjaGFyKj4oImZvbyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoOjpzdGQ6OnN0cmluZygiYmFyIiksIHAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInAxIik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHN0ZDo6c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2YKKyAgLy8gd2hpY2ggaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLiAgVGhpcyBzaG91bGQgZmFpbC4KKyAgc3RhdGljIDo6c3RkOjpzdHJpbmcgc3RyMyhzdHIxKTsKKyAgc3RyMy5hdCgyKSA9ICdcMCc7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdHIxLCBzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBzdHIzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJBIFxcMCBpbiB0aGUgbWlkZGxlXCIiKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworCisvLyBUZXN0cyB1c2luZyA6OnN0ZDo6d3N0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFN0ZFdpZGVTdHJpbmcpIHsKKyAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCBzdGQ6OndzdHJpbmdzLgorICBjb25zdCA6OnN0ZDo6d3N0cmluZyB3c3RyMShMIkEgKiBpbiB0aGUgbWlkZGxlIik7CisgIGNvbnN0IDo6c3RkOjp3c3RyaW5nIHdzdHIyKHdzdHIxKTsKKyAgQVNTRVJUX0VRKHdzdHIxLCB3c3RyMik7CisKKyAgLy8gQ29tcGFyZXMgYW4gc3RkOjp3c3RyaW5nIHRvIGEgY29uc3Qgd2NoYXJfdCogdGhhdCBoYXMgaWRlbnRpY2FsCisgIC8vIGNvbnRlbnQuCisgIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODExOVtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODExOSwgJ1wwJyB9OworICBFWFBFQ1RfRVEoOjpzdGQ6OndzdHJpbmcoa1Rlc3RYODExOSksIGtUZXN0WDgxMTkpOworCisgIC8vIENvbXBhcmVzIGFuIHN0ZDo6d3N0cmluZyB0byBhIGNvbnN0IHdjaGFyX3QqIHRoYXQgaGFzIGRpZmZlcmVudAorICAvLyBjb250ZW50LgorICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMjBbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMjAsICdcMCcgfTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0VRKDo6c3RkOjp3c3RyaW5nKGtUZXN0WDgxMTkpLCBrVGVzdFg4MTIwKTsKKyAgfSwgImtUZXN0WDgxMjAiKTsKKworICAvLyBDb21wYXJlcyB0d28gc3RkOjp3c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2YKKyAgLy8gd2hpY2ggaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLgorICA6OnN0ZDo6d3N0cmluZyB3c3RyMyh3c3RyMSk7CisgIHdzdHIzLmF0KDIpID0gTCdcMCc7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh3c3RyMSwgd3N0cjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid3N0cjMiKTsKKworICAvLyBDb21wYXJlcyBhIHdjaGFyX3QqIHRvIGFuIHN0ZDo6d3N0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQKKyAgLy8gY29udGVudC4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VRKGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KEwiZm9vIiksIDo6c3RkOjp3c3RyaW5nKEwiYmFyIikpOworICB9LCAiIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gVGVzdHMgdXNpbmcgOjpzdHJpbmcgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBHbG9iYWxTdHJpbmcpIHsKKyAgLy8gQ29tcGFyZXMgYSBjb25zdCBjaGFyKiB0byBhIDo6c3RyaW5nIHRoYXQgaGFzIGlkZW50aWNhbCBjb250ZW50LgorICBFWFBFQ1RfRVEoIlRlc3QiLCA6OnN0cmluZygiVGVzdCIpKTsKKworICAvLyBDb21wYXJlcyB0d28gaWRlbnRpY2FsIDo6c3RyaW5ncy4KKyAgY29uc3QgOjpzdHJpbmcgc3RyMSgiQSAqIGluIHRoZSBtaWRkbGUiKTsKKyAgY29uc3QgOjpzdHJpbmcgc3RyMihzdHIxKTsKKyAgQVNTRVJUX0VRKHN0cjEsIHN0cjIpOworCisgIC8vIENvbXBhcmVzIGEgOjpzdHJpbmcgdG8gYSBjb25zdCBjaGFyKiB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDo6c3RyaW5nKCJUZXN0IiksICJ0ZXN0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0Iik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIDo6c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2Ygd2hpY2gKKyAgLy8gaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLgorICA6OnN0cmluZyBzdHIzKHN0cjEpOworICBzdHIzLmF0KDIpID0gJ1wwJzsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHN0cjEsIHN0cjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyMyIpOworCisgIC8vIENvbXBhcmVzIGEgOjpzdHJpbmcgdG8gYSBjaGFyKiB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VRKDo6c3RyaW5nKCJiYXIiKSwgY29uc3RfY2FzdDxjaGFyKj4oImZvbyIpKTsKKyAgfSwgIiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gVGVzdHMgdXNpbmcgOjp3c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgR2xvYmFsV2lkZVN0cmluZykgeworICAvLyBDb21wYXJlcyB0d28gaWRlbnRpY2FsIDo6d3N0cmluZ3MuCisgIHN0YXRpYyBjb25zdCA6OndzdHJpbmcgd3N0cjEoTCJBICogaW4gdGhlIG1pZGRsZSIpOworICBzdGF0aWMgY29uc3QgOjp3c3RyaW5nIHdzdHIyKHdzdHIxKTsKKyAgRVhQRUNUX0VRKHdzdHIxLCB3c3RyMik7CisKKyAgLy8gQ29tcGFyZXMgYSBjb25zdCB3Y2hhcl90KiB0byBhIDo6d3N0cmluZyB0aGF0IGhhcyBpZGVudGljYWwgY29udGVudC4KKyAgY29uc3Qgd2NoYXJfdCBrVGVzdFg4MTE5W10gPSB7ICdUJywgJ2UnLCAncycsICd0JywgMHg4MTE5LCAnXDAnIH07CisgIEFTU0VSVF9FUShrVGVzdFg4MTE5LCA6OndzdHJpbmcoa1Rlc3RYODExOSkpOworCisgIC8vIENvbXBhcmVzIGEgY29uc3Qgd2NoYXJfdCogdG8gYSA6OndzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50CisgIC8vIGNvbnRlbnQuCisgIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODEyMFtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODEyMCwgJ1wwJyB9OworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfRVEoa1Rlc3RYODEyMCwgOjp3c3RyaW5nKGtUZXN0WDgxMTkpKTsKKyAgfSwgIlRlc3RcXHg4MTE5Iik7CisKKyAgLy8gQ29tcGFyZXMgYSB3Y2hhcl90KiB0byBhIDo6d3N0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KKyAgd2NoYXJfdCogY29uc3QgcDEgPSBjb25zdF9jYXN0PHdjaGFyX3QqPihMImZvbyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDEsIDo6d3N0cmluZyhMImJhciIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJhciIpOworCisgIC8vIENvbXBhcmVzIHR3byA6OndzdHJpbmdzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMsIG9uZSBvZiB3aGljaAorICAvLyBoYXZpbmcgYSBOVUwgY2hhcmFjdGVyIGluIHRoZSBtaWRkbGUuCisgIHN0YXRpYyA6OndzdHJpbmcgd3N0cjM7CisgIHdzdHIzID0gd3N0cjE7CisgIHdzdHIzLmF0KDIpID0gTCdcMCc7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSh3c3RyMSwgd3N0cjMpLAorICAgICAgICAgICAgICAgICAgICAgICAid3N0cjMiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gVGVzdHMgdXNpbmcgY2hhciBwb2ludGVycyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgQ2hhclBvaW50ZXIpIHsKKyAgY2hhciogY29uc3QgcDAgPSBOVUxMOworICAvLyBPbmx5IHdheSB0byBnZXQgdGhlIE5va2lhIGNvbXBpbGVyIHRvIGNvbXBpbGUgdGhlIGNhc3QKKyAgLy8gaXMgdG8gaGF2ZSBhIHNlcGFyYXRlIHZvaWQqIHZhcmlhYmxlIGZpcnN0LiBQdXR0aW5nCisgIC8vIHRoZSB0d28gY2FzdHMgb24gdGhlIHNhbWUgbGluZSBkb2Vzbid0IHdvcmssIG5laXRoZXIgZG9lcworICAvLyBhIGRpcmVjdCBDLXN0eWxlIHRvIGNoYXIqLgorICB2b2lkKiBwdjEgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCisgIHZvaWQqIHB2MiA9ICh2b2lkKikweEFCQzA7ICAvLyBOT0xJTlQKKyAgY2hhciogY29uc3QgcDEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdjEpOworICBjaGFyKiBjb25zdCBwMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHB2Mik7CisgIEFTU0VSVF9FUShwMSwgcDEpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMCwgcDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHAyIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMSwgcDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KDB4MTIzNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigweEFCQzApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFCQzAiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgd2NoYXJfdCBwb2ludGVycyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgV2lkZUNoYXJQb2ludGVyKSB7CisgIHdjaGFyX3QqIGNvbnN0IHAwID0gTlVMTDsKKyAgLy8gT25seSB3YXkgdG8gZ2V0IHRoZSBOb2tpYSBjb21waWxlciB0byBjb21waWxlIHRoZSBjYXN0CisgIC8vIGlzIHRvIGhhdmUgYSBzZXBhcmF0ZSB2b2lkKiB2YXJpYWJsZSBmaXJzdC4gUHV0dGluZworICAvLyB0aGUgdHdvIGNhc3RzIG9uIHRoZSBzYW1lIGxpbmUgZG9lc24ndCB3b3JrLCBuZWl0aGVyIGRvZXMKKyAgLy8gYSBkaXJlY3QgQy1zdHlsZSB0byBjaGFyKi4KKyAgdm9pZCogcHYxID0gKHZvaWQqKTB4MTIzNDsgIC8vIE5PTElOVAorICB2b2lkKiBwdjIgPSAodm9pZCopMHhBQkMwOyAgLy8gTk9MSU5UCisgIHdjaGFyX3QqIGNvbnN0IHAxID0gcmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4ocHYxKTsKKyAgd2NoYXJfdCogY29uc3QgcDIgPSByZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihwdjIpOworICBFWFBFQ1RfRVEocDAsIHAwKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDAsIHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBwMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDEsIHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInAyIik7CisgIHZvaWQqIHB2MyA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKKyAgdm9pZCogcHY0ID0gKHZvaWQqKTB4QUJDMDsgIC8vIE5PTElOVAorICBjb25zdCB3Y2hhcl90KiBwMyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHB2Myk7CisgIGNvbnN0IHdjaGFyX3QqIHA0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4ocHY0KTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAzLCBwNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwNCIpOworfQorCisvLyBUZXN0cyB1c2luZyBvdGhlciB0eXBlcyBvZiBwb2ludGVycyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgT3RoZXJQb2ludGVyKSB7CisgIEFTU0VSVF9FUShzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihOVUxMKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGludCo+KE5VTEwpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0YXRpY19jYXN0PGNvbnN0IGludCo+KE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQqPigweDEyMzQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjB4MTIzNCIpOworfQorCisvLyBBIGNsYXNzIHRoYXQgc3VwcG9ydHMgYmluYXJ5IGNvbXBhcmlzb24gb3BlcmF0b3JzIGJ1dCBub3Qgc3RyZWFtaW5nLgorY2xhc3MgVW5wcmludGFibGVDaGFyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFVucHJpbnRhYmxlQ2hhcihjaGFyIGNoKSA6IGNoYXJfKGNoKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyA9PSByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfICE9IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyA8IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPD0gcmhzLmNoYXJfOworICB9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfID4gcmhzLmNoYXJfOworICB9CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyA+PSByaHMuY2hhcl87CisgIH0KKworIHByaXZhdGU6CisgIGNoYXIgY2hhcl87Cit9OworCisvLyBUZXN0cyB0aGF0IEFTU0VSVF9FUSgpIGFuZCBmcmllbmRzIGRvbid0IHJlcXVpcmUgdGhlIGFyZ3VtZW50cyB0bworLy8gYmUgcHJpbnRhYmxlLgorVEVTVChDb21wYXJpc29uQXNzZXJ0aW9uVGVzdCwgQWNjZXB0c1VucHJpbnRhYmxlQXJncykgeworICBjb25zdCBVbnByaW50YWJsZUNoYXIgeCgneCcpLCB5KCd5Jyk7CisgIEFTU0VSVF9FUSh4LCB4KTsKKyAgRVhQRUNUX05FKHgsIHkpOworICBBU1NFUlRfTFQoeCwgeSk7CisgIEVYUEVDVF9MRSh4LCB5KTsKKyAgQVNTRVJUX0dUKHksIHgpOworICBFWFBFQ1RfR0UoeCwgeCk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHgsIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoeSwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKHgsIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOworCisgIC8vIENvZGUgdGVzdGVkIGJ5IEVYUEVDVF9GQVRBTF9GQUlMVVJFIGNhbm5vdCByZWZlcmVuY2UgbG9jYWwKKyAgLy8gdmFyaWFibGVzLCBzbyB3ZSBoYXZlIHRvIHdyaXRlIFVucHJpbnRhYmxlQ2hhcigneCcpIGluc3RlYWQgb2YgeC4KKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ORShVbnByaW50YWJsZUNoYXIoJ3gnKSwgVW5wcmludGFibGVDaGFyKCd4JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MRShVbnByaW50YWJsZUNoYXIoJ3knKSwgVW5wcmludGFibGVDaGFyKCd4JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7CisjZW5kaWYKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xFKFVucHJpbnRhYmxlQ2hhcigneScpLCBVbnByaW50YWJsZUNoYXIoJ3gnKSksCisgICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKFVucHJpbnRhYmxlQ2hhcigneCcpLCBVbnByaW50YWJsZUNoYXIoJ3knKSksCisgICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OD4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKFVucHJpbnRhYmxlQ2hhcigneCcpLCBVbnByaW50YWJsZUNoYXIoJ3knKSksCisgICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKK30KKworLy8gVGVzdHMgdGhlIEZSSUVORF9URVNUIG1hY3JvLgorCisvLyBUaGlzIGNsYXNzIGhhcyBhIHByaXZhdGUgbWVtYmVyIHdlIHdhbnQgdG8gdGVzdC4gIFdlIHdpbGwgdGVzdCBpdAorLy8gYm90aCBpbiBhIFRFU1QgYW5kIGluIGEgVEVTVF9GLgorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIEZvbygpIHt9CisKKyBwcml2YXRlOgorICBpbnQgQmFyKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgIC8vIERlY2xhcmVzIHRoZSBmcmllbmQgdGVzdHMgdGhhdCBjYW4gYWNjZXNzIHRoZSBwcml2YXRlIG1lbWJlcgorICAvLyBCYXIoKS4KKyAgRlJJRU5EX1RFU1QoRlJJRU5EX1RFU1RfVGVzdCwgVEVTVCk7CisgIEZSSUVORF9URVNUKEZSSUVORF9URVNUX1Rlc3QyLCBURVNUX0YpOworfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgRlJJRU5EX1RFU1QgZGVjbGFyYXRpb24gYWxsb3dzIGEgVEVTVCB0byBhY2Nlc3MgYQorLy8gY2xhc3MncyBwcml2YXRlIG1lbWJlcnMuICBUaGlzIHNob3VsZCBjb21waWxlLgorVEVTVChGUklFTkRfVEVTVF9UZXN0LCBURVNUKSB7CisgIEFTU0VSVF9FUSgxLCBGb28oKS5CYXIoKSk7Cit9CisKKy8vIFRoZSBmaXh0dXJlIG5lZWRlZCB0byB0ZXN0IHVzaW5nIEZSSUVORF9URVNUIHdpdGggVEVTVF9GLgorY2xhc3MgRlJJRU5EX1RFU1RfVGVzdDIgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBGb28gZm9vOworfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgRlJJRU5EX1RFU1QgZGVjbGFyYXRpb24gYWxsb3dzIGEgVEVTVF9GIHRvIGFjY2VzcyBhCisvLyBjbGFzcydzIHByaXZhdGUgbWVtYmVycy4gIFRoaXMgc2hvdWxkIGNvbXBpbGUuCitURVNUX0YoRlJJRU5EX1RFU1RfVGVzdDIsIFRFU1RfRikgeworICBBU1NFUlRfRVEoMSwgZm9vLkJhcigpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpZmUgY3ljbGUgb2YgVGVzdCBvYmplY3RzLgorCisvLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIHRoZSBsaWZlIGN5Y2xlIG9mIFRlc3Qgb2JqZWN0cy4KKy8vCisvLyBUaGlzIGNsYXNzIGNvdW50cyB0aGUgbnVtYmVyIG9mIGxpdmUgdGVzdCBvYmplY3RzIHRoYXQgdXNlcyB0aGlzCisvLyBmaXh0dXJlLgorY2xhc3MgVGVzdExpZmVDeWNsZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBDb25zdHJ1Y3Rvci4gIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzCisgIC8vIHRoaXMgZml4dHVyZS4KKyAgVGVzdExpZmVDeWNsZVRlc3QoKSB7IGNvdW50XysrOyB9CisKKyAgLy8gRGVzdHJ1Y3Rvci4gIERlY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzIHRoaXMKKyAgLy8gZml4dHVyZS4KKyAgflRlc3RMaWZlQ3ljbGVUZXN0KCkgeyBjb3VudF8tLTsgfQorCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBsaXZlIHRlc3Qgb2JqZWN0cyB0aGF0IHVzZXMgdGhpcyBmaXh0dXJlLgorICBpbnQgY291bnQoKSBjb25zdCB7IHJldHVybiBjb3VudF87IH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgY291bnRfOworfTsKKworaW50IFRlc3RMaWZlQ3ljbGVUZXN0Ojpjb3VudF8gPSAwOworCisvLyBUZXN0cyB0aGUgbGlmZSBjeWNsZSBvZiB0ZXN0IG9iamVjdHMuCitURVNUX0YoVGVzdExpZmVDeWNsZVRlc3QsIFRlc3QxKSB7CisgIC8vIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSB0ZXN0IG9iamVjdCBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0J3MKKyAgLy8gY3VycmVudGx5IGFsaXZlLgorICBBU1NFUlRfRVEoMSwgY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaWZlIGN5Y2xlIG9mIHRlc3Qgb2JqZWN0cy4KK1RFU1RfRihUZXN0TGlmZUN5Y2xlVGVzdCwgVGVzdDIpIHsKKyAgLy8gQWZ0ZXIgVGVzdDEgaXMgZG9uZSBhbmQgVGVzdDIgaXMgc3RhcnRlZCwgdGhlcmUgc2hvdWxkIHN0aWxsIGJlCisgIC8vIG9ubHkgb25lIGxpdmUgdGVzdCBvYmplY3QsIGFzIHRoZSBvYmplY3QgZm9yIFRlc3QxIHNob3VsZCd2ZSBiZWVuCisgIC8vIGRlbGV0ZWQuCisgIEFTU0VSVF9FUSgxLCBjb3VudCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRlc3RzIHRoYXQgdGhlIGNvcHkgY29uc3RydWN0b3Igd29ya3Mgd2hlbiBpdCBpcyBOT1Qgb3B0aW1pemVkIGF3YXkgYnkKKy8vIHRoZSBjb21waWxlci4KK1RFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgQ29weUNvbnN0cnVjdG9yV29ya3NXaGVuTm90T3B0aW1pZWQpIHsKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGNvcHkgY29uc3RydWN0b3IgZG9lc24ndCB0cnkgdG8gZGVyZWZlcmVuY2UgTlVMTCBwb2ludGVycworICAvLyBpbiB0aGUgc291cmNlIG9iamVjdC4KKyAgQXNzZXJ0aW9uUmVzdWx0IHIxID0gQXNzZXJ0aW9uU3VjY2VzcygpOworICBBc3NlcnRpb25SZXN1bHQgcjIgPSByMTsKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGFkZGVkIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gb3B0aW1pemluZworICAvLyBhd2F5IHRoZSBjb25zdHJ1Y3RvciBjYWxsLgorICByMSA8PCAiYWJjIjsKKworICBBc3NlcnRpb25SZXN1bHQgcjMgPSByMTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGJvb2w+KHIzKSwgc3RhdGljX2Nhc3Q8Ym9vbD4ocjEpKTsKKyAgRVhQRUNUX1NUUkVRKCJhYmMiLCByMS5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyB0aGF0IEFzc2VydGlvblN1Y2Nlc3MgYW5kIEFzc2VydGlvbkZhaWx1cmUgY29uc3RydWN0CisvLyBBc3NlcnRpb25SZXN1bHQgb2JqZWN0cyBhcyBleHBlY3RlZC4KK1RFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgQ29uc3RydWN0aW9uV29ya3MpIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IHIxID0gQXNzZXJ0aW9uU3VjY2VzcygpOworICBFWFBFQ1RfVFJVRShyMSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgcjEubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjIgPSBBc3NlcnRpb25TdWNjZXNzKCkgPDwgImFiYyI7CisgIEVYUEVDVF9UUlVFKHIyKTsKKyAgRVhQRUNUX1NUUkVRKCJhYmMiLCByMi5tZXNzYWdlKCkpOworCisgIEFzc2VydGlvblJlc3VsdCByMyA9IEFzc2VydGlvbkZhaWx1cmUoKTsKKyAgRVhQRUNUX0ZBTFNFKHIzKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCByMy5tZXNzYWdlKCkpOworCisgIEFzc2VydGlvblJlc3VsdCByNCA9IEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiZGVmIjsKKyAgRVhQRUNUX0ZBTFNFKHI0KTsKKyAgRVhQRUNUX1NUUkVRKCJkZWYiLCByNC5tZXNzYWdlKCkpOworCisgIEFzc2VydGlvblJlc3VsdCByNSA9IEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJnaGkiKTsKKyAgRVhQRUNUX0ZBTFNFKHI1KTsKKyAgRVhQRUNUX1NUUkVRKCJnaGkiLCByNS5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBuZWdhdGlvbiBmbGlwcyB0aGUgcHJlZGljYXRlIHJlc3VsdCBidXQga2VlcHMgdGhlIG1lc3NhZ2UuCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIE5lZ2F0aW9uV29ya3MpIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IHIxID0gQXNzZXJ0aW9uU3VjY2VzcygpIDw8ICJhYmMiOworICBFWFBFQ1RfRkFMU0UoIXIxKTsKKyAgRVhQRUNUX1NUUkVRKCJhYmMiLCAoIXIxKS5tZXNzYWdlKCkpOworCisgIEFzc2VydGlvblJlc3VsdCByMiA9IEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiZGVmIjsKKyAgRVhQRUNUX1RSVUUoIXIyKTsKKyAgRVhQRUNUX1NUUkVRKCJkZWYiLCAoIXIyKS5tZXNzYWdlKCkpOworfQorCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIFN0cmVhbWluZ1dvcmtzKSB7CisgIEFzc2VydGlvblJlc3VsdCByID0gQXNzZXJ0aW9uU3VjY2VzcygpOworICByIDw8ICJhYmMiIDw8ICdkJyA8PCAwIDw8IHRydWU7CisgIEVYUEVDVF9TVFJFUSgiYWJjZDB0cnVlIiwgci5tZXNzYWdlKCkpOworfQorCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENhblN0cmVhbU9zdHJlYW1NYW5pcHVsYXRvcnMpIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IHIgPSBBc3NlcnRpb25TdWNjZXNzKCk7CisgIHIgPDwgIkRhdGEiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmZsdXNoIDw8IHN0ZDo6ZW5kcyA8PCAiV2lsbCBiZSB2aXNpYmxlIjsKKyAgRVhQRUNUX1NUUkVRKCJEYXRhXG5cXDBXaWxsIGJlIHZpc2libGUiLCByLm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGFuZCBvcGVyYXRvciA8PCBhcmUKKy8vIGJvdGggaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEJhc2UoaW50IGFuX3gpIDogeF8oYW5feCkge30KKyAgaW50IHgoKSBjb25zdCB7IHJldHVybiB4XzsgfQorIHByaXZhdGU6CisgIGludCB4XzsKK307CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNlJiB2YWwpIHsKKyAgcmV0dXJuIG9zIDw8IHZhbC54KCk7Cit9CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNlKiBwb2ludGVyKSB7CisgIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJbkdsb2JhbE5hbWVTcGFjZSkgeworICBNZXNzYWdlIG1zZzsKKyAgQmFzZSBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyA6Om9wZXJhdG9yPDwuCisgIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gYW5kIG9wZXJhdG9yPDwgYXJlCisvLyBib3RoIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlLgorbmFtZXNwYWNlIHsKK2NsYXNzIE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSA6IHB1YmxpYyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZShpbnQgYW5feCk6IEJhc2UoYW5feCkge30KK307CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNeVR5cGVJblVubmFtZWROYW1lU3BhY2UmIHZhbCkgeworICByZXR1cm4gb3MgPDwgdmFsLngoKTsKK30KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSogcG9pbnRlcikgeworICByZXR1cm4gb3MgPDwgIigiIDw8IHBvaW50ZXItPngoKSA8PCAiKSI7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJblVubmFtZWROYW1lU3BhY2UpIHsKKyAgTWVzc2FnZSBtc2c7CisgIE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyA8dW5uYW1lZF9uYW1lc3BhY2U+OjpvcGVyYXRvcjw8LgorICBFWFBFQ1RfU1RSRVEoIjEoMSkiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGFuZCBvcGVyYXRvcjw8IGFyZQorLy8gYm90aCBpbiBhIHVzZXIgbmFtZXNwYWNlLgorbmFtZXNwYWNlIG5hbWVzcGFjZTEgeworY2xhc3MgTXlUeXBlSW5OYW1lU3BhY2UxIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXlUeXBlSW5OYW1lU3BhY2UxKGludCBhbl94KTogQmFzZShhbl94KSB7fQorfTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluTmFtZVNwYWNlMSYgdmFsKSB7CisgIHJldHVybiBvcyA8PCB2YWwueCgpOworfQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5OYW1lU3BhY2UxKiBwb2ludGVyKSB7CisgIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKK30KK30gIC8vIG5hbWVzcGFjZSBuYW1lc3BhY2UxCisKK1RFU1QoTWVzc2FnZVRlc3QsIENhblN0cmVhbVVzZXJUeXBlSW5Vc2VyTmFtZVNwYWNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBuYW1lc3BhY2UxOjpNeVR5cGVJbk5hbWVTcGFjZTEgYSgxKTsKKworICBtc2cgPDwgYSA8PCAmYTsgIC8vIFVzZXMgbmFtZXNwYWNlMTo6b3BlcmF0b3I8PC4KKyAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSB1c2VyIHR5cGUgd2hvc2UgZGVmaW5pdGlvbiBpcyBpbiBhIHVzZXIgbmFtZXNwYWNlCisvLyBidXQgd2hvc2Ugb3BlcmF0b3I8PCBpcyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK25hbWVzcGFjZSBuYW1lc3BhY2UyIHsKK2NsYXNzIE15VHlwZUluTmFtZVNwYWNlMiA6IHB1YmxpYyA6OkJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXlUeXBlSW5OYW1lU3BhY2UyKGludCBhbl94KTogQmFzZShhbl94KSB7fQorfTsKK30gIC8vIG5hbWVzcGFjZSBuYW1lc3BhY2UyCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2UyOjpNeVR5cGVJbk5hbWVTcGFjZTImIHZhbCkgeworICByZXR1cm4gb3MgPDwgdmFsLngoKTsKK30KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZTI6Ok15VHlwZUluTmFtZVNwYWNlMiogcG9pbnRlcikgeworICByZXR1cm4gb3MgPDwgIigiIDw8IHBvaW50ZXItPngoKSA8PCAiKSI7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIENhblN0cmVhbVVzZXJUeXBlSW5Vc2VyTmFtZVNwYWNlV2l0aFN0cmVhbU9wZXJhdG9ySW5HbG9iYWwpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG5hbWVzcGFjZTI6Ok15VHlwZUluTmFtZVNwYWNlMiBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyA6Om9wZXJhdG9yPDwuCisgIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIE5VTEwgcG9pbnRlcnMgdG8gdGVzdGluZzo6TWVzc2FnZS4KK1RFU1QoTWVzc2FnZVRlc3QsIE51bGxQb2ludGVycykgeworICBNZXNzYWdlIG1zZzsKKyAgY2hhciogY29uc3QgcDEgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyKiBjb25zdCBwMiA9IE5VTEw7CisgIGludCogcDMgPSBOVUxMOworICBkb3VibGUqIHA0ID0gTlVMTDsKKyAgYm9vbCogcDUgPSBOVUxMOworICBNZXNzYWdlKiBwNiA9IE5VTEw7CisKKyAgbXNnIDw8IHAxIDw8IHAyIDw8IHAzIDw8IHA0IDw8IHA1IDw8IHA2OworICBBU1NFUlRfU1RSRVEoIihudWxsKShudWxsKShudWxsKShudWxsKShudWxsKShudWxsKSIsCisgICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyB3aWRlIHN0cmluZ3MgdG8gdGVzdGluZzo6TWVzc2FnZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFdpZGVTdHJpbmdzKSB7CisgIC8vIFN0cmVhbXMgYSBOVUxMIG9mIHR5cGUgY29uc3Qgd2NoYXJfdCouCisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0X3dzdHIgPSBOVUxMOworICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGNvbnN0X3dzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIC8vIFN0cmVhbXMgYSBOVUxMIG9mIHR5cGUgd2NoYXJfdCouCisgIHdjaGFyX3QqIHdzdHIgPSBOVUxMOworICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IHdzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIC8vIFN0cmVhbXMgYSBub24tTlVMTCBvZiB0eXBlIGNvbnN0IHdjaGFyX3QqLgorICBjb25zdF93c3RyID0gTCJhYmNceDgxMTkiOworICBFWFBFQ1RfU1RSRVEoImFiY1x4ZThceDg0XHg5OSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGNvbnN0X3dzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIC8vIFN0cmVhbXMgYSBub24tTlVMTCBvZiB0eXBlIHdjaGFyX3QqLgorICB3c3RyID0gY29uc3RfY2FzdDx3Y2hhcl90Kj4oY29uc3Rfd3N0cik7CisgIEVYUEVDVF9TVFJFUSgiYWJjXHhlOFx4ODRceDk5IiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKworLy8gVGhpcyBsaW5lIHRlc3RzIHRoYXQgd2UgY2FuIGRlZmluZSB0ZXN0cyBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2UuCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRlc3RzIHRoZSBUZXN0SW5mbyBjbGFzcy4KKworY2xhc3MgVGVzdEluZm9UZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IFRlc3RJbmZvKiBHZXRUZXN0SW5mbyhjb25zdCBjaGFyKiB0ZXN0X25hbWUpIHsKKyAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gR2V0VW5pdFRlc3RJbXBsKCktPgorICAgICAgICBHZXRUZXN0Q2FzZSgiVGVzdEluZm9UZXN0IiwgIiIsIE5VTEwsIE5VTEwpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gdGVzdF9jYXNlLT5HZXRUZXN0SW5mbyhpKTsKKyAgICAgIGlmIChzdHJjbXAodGVzdF9uYW1lLCB0ZXN0X2luZm8tPm5hbWUoKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRlc3RfaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzdGF0aWMgY29uc3QgVGVzdFJlc3VsdCogR2V0VGVzdFJlc3VsdCgKKyAgICAgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5yZXN1bHQoKTsKKyAgfQorfTsKKworLy8gVGVzdHMgVGVzdEluZm86OnRlc3RfY2FzZV9uYW1lKCkgYW5kIFRlc3RJbmZvOjpuYW1lKCkuCitURVNUX0YoVGVzdEluZm9UZXN0LCBOYW1lcykgeworICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gR2V0VGVzdEluZm8oIk5hbWVzIik7CisKKyAgQVNTRVJUX1NUUkVRKCJUZXN0SW5mb1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworICBBU1NFUlRfU1RSRVEoIk5hbWVzIiwgdGVzdF9pbmZvLT5uYW1lKCkpOworfQorCisvLyBUZXN0cyBUZXN0SW5mbzo6cmVzdWx0KCkuCitURVNUX0YoVGVzdEluZm9UZXN0LCByZXN1bHQpIHsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IEdldFRlc3RJbmZvKCJyZXN1bHQiKTsKKworICAvLyBJbml0aWFsbHksIHRoZXJlIGlzIG5vIFRlc3RQYXJ0UmVzdWx0IGZvciB0aGlzIHRlc3QuCisgIEFTU0VSVF9FUSgwLCBHZXRUZXN0UmVzdWx0KHRlc3RfaW5mbyktPnRvdGFsX3BhcnRfY291bnQoKSk7CisKKyAgLy8gQWZ0ZXIgdGhlIHByZXZpb3VzIGFzc2VydGlvbiwgdGhlcmUgaXMgc3RpbGwgbm9uZS4KKyAgQVNTRVJUX0VRKDAsIEdldFRlc3RSZXN1bHQodGVzdF9pbmZvKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGEgdGVzdCBjYXNlLgorCitjbGFzcyBTZXRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UKKyAgLy8gaXMgcnVuLgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIHByaW50ZigiU2V0dGluZyB1cCB0aGUgdGVzdCBjYXNlIC4gLiAuXG4iKTsKKworICAgIC8vIEluaXRpYWxpemVzIHNvbWUgc2hhcmVkIHJlc291cmNlLiAgSW4gdGhpcyBzaW1wbGUgZXhhbXBsZSwgd2UKKyAgICAvLyBqdXN0IGNyZWF0ZSBhIEMgc3RyaW5nLiAgTW9yZSBjb21wbGV4IHN0dWZmIGNhbiBiZSBkb25lIGlmCisgICAgLy8gZGVzaXJlZC4KKyAgICBzaGFyZWRfcmVzb3VyY2VfID0gIjEyMyI7CisKKyAgICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAuCisgICAgY291bnRlcl8rKzsKKworICAgIC8vIFNldFVwVGVzdENhc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMSwgY291bnRlcl8pOworICB9CisKKyAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UgaXMKKyAgLy8gcnVuLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiVGVhcmluZyBkb3duIHRoZSB0ZXN0IGNhc2UgLiAuIC5cbiIpOworCisgICAgLy8gRGVjcmVtZW50cyB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwLgorICAgIGNvdW50ZXJfLS07CisKKyAgICAvLyBUZWFyRG93blRlc3RDYXNlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXJfKTsKKworICAgIC8vIENsZWFucyB1cCB0aGUgc2hhcmVkIHJlc291cmNlLgorICAgIHNoYXJlZF9yZXNvdXJjZV8gPSBOVUxMOworICB9CisKKyAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gU2V0VXBUZXN0Q2FzZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLCBzbyBjb3VudGVyXyBzaG91bGQKKyAgICAvLyBhbHdheXMgYmUgMS4KKyAgICBFWFBFQ1RfRVEoMSwgY291bnRlcl8pOworICB9CisKKyAgLy8gTnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwLgorICBzdGF0aWMgaW50IGNvdW50ZXJfOworCisgIC8vIFNvbWUgcmVzb3VyY2UgdG8gYmUgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIHNoYXJlZF9yZXNvdXJjZV87Cit9OworCitpbnQgU2V0VXBUZXN0Q2FzZVRlc3Q6OmNvdW50ZXJfID0gMDsKK2NvbnN0IGNoYXIqIFNldFVwVGVzdENhc2VUZXN0OjpzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKKworLy8gQSB0ZXN0IHRoYXQgdXNlcyB0aGUgc2hhcmVkIHJlc291cmNlLgorVEVTVF9GKFNldFVwVGVzdENhc2VUZXN0LCBUZXN0MSkgeworICBFWFBFQ1RfU1RSTkUoTlVMTCwgc2hhcmVkX3Jlc291cmNlXyk7Cit9CisKKy8vIEFub3RoZXIgdGVzdCB0aGF0IHVzZXMgdGhlIHNoYXJlZCByZXNvdXJjZS4KK1RFU1RfRihTZXRVcFRlc3RDYXNlVGVzdCwgVGVzdDIpIHsKKyAgRVhQRUNUX1NUUkVRKCIxMjMiLCBzaGFyZWRfcmVzb3VyY2VfKTsKK30KKworLy8gVGhlIEluaXRHb29nbGVUZXN0VGVzdCB0ZXN0IGNhc2UgdGVzdHMgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKS4KKworLy8gVGhlIEZsYWdzIHN0cnVjdCBzdG9yZXMgYSBjb3B5IG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4KK3N0cnVjdCBGbGFncyB7CisgIC8vIENvbnN0cnVjdHMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgZWFjaCBmbGFnIGhhcyBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgRmxhZ3MoKSA6IGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKGZhbHNlKSwKKyAgICAgICAgICAgIGJyZWFrX29uX2ZhaWx1cmUoZmFsc2UpLAorICAgICAgICAgICAgY2F0Y2hfZXhjZXB0aW9ucyhmYWxzZSksCisgICAgICAgICAgICBkZWF0aF90ZXN0X3VzZV9mb3JrKGZhbHNlKSwKKyAgICAgICAgICAgIGZpbHRlcigiIiksCisgICAgICAgICAgICBsaXN0X3Rlc3RzKGZhbHNlKSwKKyAgICAgICAgICAgIG91dHB1dCgiIiksCisgICAgICAgICAgICBwcmludF90aW1lKHRydWUpLAorICAgICAgICAgICAgcmFuZG9tX3NlZWQoMCksCisgICAgICAgICAgICByZXBlYXQoMSksCisgICAgICAgICAgICBzaHVmZmxlKGZhbHNlKSwKKyAgICAgICAgICAgIHN0YWNrX3RyYWNlX2RlcHRoKGtNYXhTdGFja1RyYWNlRGVwdGgpLAorICAgICAgICAgICAgc3RyZWFtX3Jlc3VsdF90bygiIiksCisgICAgICAgICAgICB0aHJvd19vbl9mYWlsdXJlKGZhbHNlKSB7fQorCisgIC8vIEZhY3RvcnkgbWV0aG9kcy4KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBBbHNvUnVuRGlzYWJsZWRUZXN0cyhib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgPSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0czsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIEJyZWFrT25GYWlsdXJlKGJvb2wgYnJlYWtfb25fZmFpbHVyZSkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmJyZWFrX29uX2ZhaWx1cmUgPSBicmVha19vbl9mYWlsdXJlOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgQ2F0Y2hFeGNlcHRpb25zKGJvb2wgY2F0Y2hfZXhjZXB0aW9ucykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmNhdGNoX2V4Y2VwdGlvbnMgPSBjYXRjaF9leGNlcHRpb25zOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2RlYXRoX3Rlc3RfdXNlX2ZvcmsgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgRGVhdGhUZXN0VXNlRm9yayhib29sIGRlYXRoX3Rlc3RfdXNlX2ZvcmspIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5kZWF0aF90ZXN0X3VzZV9mb3JrID0gZGVhdGhfdGVzdF91c2VfZm9yazsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9maWx0ZXIgZmxhZyBoYXMgdGhlIGdpdmVuCisgIC8vIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgRmlsdGVyKGNvbnN0IGNoYXIqIGZpbHRlcikgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmZpbHRlciA9IGZpbHRlcjsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9saXN0X3Rlc3RzIGZsYWcgaGFzIHRoZQorICAvLyBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIExpc3RUZXN0cyhib29sIGxpc3RfdGVzdHMpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5saXN0X3Rlc3RzID0gbGlzdF90ZXN0czsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9vdXRwdXQgZmxhZyBoYXMgdGhlIGdpdmVuCisgIC8vIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgT3V0cHV0KGNvbnN0IGNoYXIqIG91dHB1dCkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLm91dHB1dCA9IG91dHB1dDsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9wcmludF90aW1lIGZsYWcgaGFzIHRoZSBnaXZlbgorICAvLyB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFByaW50VGltZShib29sIHByaW50X3RpbWUpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5wcmludF90aW1lID0gcHJpbnRfdGltZTsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9yYW5kb21fc2VlZCBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBSYW5kb21TZWVkKEludDMyIHJhbmRvbV9zZWVkKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MucmFuZG9tX3NlZWQgPSByYW5kb21fc2VlZDsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9yZXBlYXQgZmxhZyBoYXMgdGhlIGdpdmVuCisgIC8vIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgUmVwZWF0KEludDMyIHJlcGVhdCkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnJlcGVhdCA9IHJlcGVhdDsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9zaHVmZmxlIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFNodWZmbGUoYm9vbCBzaHVmZmxlKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3Muc2h1ZmZsZSA9IHNodWZmbGU7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgU3RhY2tUcmFjZURlcHRoKEludDMyIHN0YWNrX3RyYWNlX2RlcHRoKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3Muc3RhY2tfdHJhY2VfZGVwdGggPSBzdGFja190cmFjZV9kZXB0aDsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFN0cmVhbVJlc3VsdFRvKGNvbnN0IGNoYXIqIHN0cmVhbV9yZXN1bHRfdG8pIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5zdHJlYW1fcmVzdWx0X3RvID0gc3RyZWFtX3Jlc3VsdF90bzsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF90aHJvd19vbl9mYWlsdXJlIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFRocm93T25GYWlsdXJlKGJvb2wgdGhyb3dfb25fZmFpbHVyZSkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnRocm93X29uX2ZhaWx1cmUgPSB0aHJvd19vbl9mYWlsdXJlOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIFRoZXNlIGZpZWxkcyBzdG9yZSB0aGUgZmxhZyB2YWx1ZXMuCisgIGJvb2wgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM7CisgIGJvb2wgYnJlYWtfb25fZmFpbHVyZTsKKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zOworICBib29sIGRlYXRoX3Rlc3RfdXNlX2Zvcms7CisgIGNvbnN0IGNoYXIqIGZpbHRlcjsKKyAgYm9vbCBsaXN0X3Rlc3RzOworICBjb25zdCBjaGFyKiBvdXRwdXQ7CisgIGJvb2wgcHJpbnRfdGltZTsKKyAgSW50MzIgcmFuZG9tX3NlZWQ7CisgIEludDMyIHJlcGVhdDsKKyAgYm9vbCBzaHVmZmxlOworICBJbnQzMiBzdGFja190cmFjZV9kZXB0aDsKKyAgY29uc3QgY2hhciogc3RyZWFtX3Jlc3VsdF90bzsKKyAgYm9vbCB0aHJvd19vbl9mYWlsdXJlOworfTsKKworLy8gRml4dHVyZSBmb3IgdGVzdGluZyBJbml0R29vZ2xlVGVzdCgpLgorY2xhc3MgSW5pdEdvb2dsZVRlc3RUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gQ2xlYXJzIHRoZSBmbGFncyBiZWZvcmUgZWFjaCB0ZXN0LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiIjsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSAwOworICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IDE7CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0ga01heFN0YWNrVHJhY2VEZXB0aDsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gIiI7CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IGZhbHNlOworICB9CisKKyAgLy8gQXNzZXJ0cyB0aGF0IHR3byBuYXJyb3cgb3Igd2lkZSBzdHJpbmcgYXJyYXlzIGFyZSBlcXVhbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgorICBzdGF0aWMgdm9pZCBBc3NlcnRTdHJpbmdBcnJheUVxKHNpemVfdCBzaXplMSwgQ2hhclR5cGUqKiBhcnJheTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUyLCBDaGFyVHlwZSoqIGFycmF5MikgeworICAgIEFTU0VSVF9FUShzaXplMSwgc2l6ZTIpIDw8ICIgQXJyYXkgc2l6ZXMgZGlmZmVyZW50LiI7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBzaXplMTsgaSsrKSB7CisgICAgICBBU1NFUlRfU1RSRVEoYXJyYXkxW2ldLCBhcnJheTJbaV0pIDw8ICIgd2hlcmUgaSA9PSAiIDw8IGk7CisgICAgfQorICB9CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZmxhZyB2YWx1ZXMgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlcy4KKyAgc3RhdGljIHZvaWQgQ2hlY2tGbGFncyhjb25zdCBGbGFncyYgZXhwZWN0ZWQpIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCisgICAgICAgICAgICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuYnJlYWtfb25fZmFpbHVyZSwgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLmNhdGNoX2V4Y2VwdGlvbnMsIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5kZWF0aF90ZXN0X3VzZV9mb3JrLCBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKTsKKyAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQuZmlsdGVyLCBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLmxpc3RfdGVzdHMsIEdURVNUX0ZMQUcobGlzdF90ZXN0cykpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5vdXRwdXQsIEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucHJpbnRfdGltZSwgR1RFU1RfRkxBRyhwcmludF90aW1lKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnJhbmRvbV9zZWVkLCBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnJlcGVhdCwgR1RFU1RfRkxBRyhyZXBlYXQpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuc2h1ZmZsZSwgR1RFU1RfRkxBRyhzaHVmZmxlKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnN0YWNrX3RyYWNlX2RlcHRoLCBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLnN0cmVhbV9yZXN1bHRfdG8sCisgICAgICAgICAgICAgICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnRocm93X29uX2ZhaWx1cmUsIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpOworICB9CisKKyAgLy8gUGFyc2VzIGEgY29tbWFuZCBsaW5lIChzcGVjaWZpZWQgYnkgYXJnYzEgYW5kIGFyZ3YxKSwgdGhlbgorICAvLyB2ZXJpZmllcyB0aGF0IHRoZSBmbGFnIHZhbHVlcyBhcmUgZXhwZWN0ZWQgYW5kIHRoYXQgdGhlCisgIC8vIHJlY29nbml6ZWQgZmxhZ3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CisgIHN0YXRpYyB2b2lkIFRlc3RQYXJzaW5nRmxhZ3MoaW50IGFyZ2MxLCBjb25zdCBDaGFyVHlwZSoqIGFyZ3YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjMiwgY29uc3QgQ2hhclR5cGUqKiBhcmd2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbGFncyYgZXhwZWN0ZWQsIGJvb2wgc2hvdWxkX3ByaW50X2hlbHApIHsKKyAgICBjb25zdCBib29sIHNhdmVkX2hlbHBfZmxhZyA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnOworICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnID0gZmFsc2U7CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisgICAgQ2FwdHVyZVN0ZG91dCgpOworI2VuZGlmCisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZS4KKyAgICBpbnRlcm5hbDo6UGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KCZhcmdjMSwgY29uc3RfY2FzdDxDaGFyVHlwZSoqPihhcmd2MSkpOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorICAgIGNvbnN0IFN0cmluZyBjYXB0dXJlZF9zdGRvdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOworI2VuZGlmCisKKyAgICAvLyBWZXJpZmllcyB0aGUgZmxhZyB2YWx1ZXMuCisgICAgQ2hlY2tGbGFncyhleHBlY3RlZCk7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSByZWNvZ25pemVkIGZsYWdzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbW1hbmQKKyAgICAvLyBsaW5lLgorICAgIEFzc2VydFN0cmluZ0FycmF5RXEoYXJnYzEgKyAxLCBhcmd2MSwgYXJnYzIgKyAxLCBhcmd2Mik7CisKKyAgICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkgc2hvdWxkIG5laXRoZXIgc2V0IGdfaGVscF9mbGFnIG5vciBwcmludCB0aGUKKyAgICAvLyBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBmbGFncyBpdCByZWNvZ25pemVzLgorICAgIEVYUEVDVF9FUShzaG91bGRfcHJpbnRfaGVscCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWcpOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQgPQorICAgICAgICAiVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmciOworICAgIGlmIChzaG91bGRfcHJpbnRfaGVscCkgeworICAgICAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgZXhwZWN0ZWRfaGVscF9mcmFnbWVudCwgY2FwdHVyZWRfc3Rkb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX1BSRURfRk9STUFUMihJc05vdFN1YnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaGVscF9mcmFnbWVudCwgY2FwdHVyZWRfc3Rkb3V0KTsKKyAgICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnID0gc2F2ZWRfaGVscF9mbGFnOworICB9CisKKyAgLy8gVGhpcyBtYWNybyB3cmFwcyBUZXN0UGFyc2luZ0ZsYWdzIHMudC4gdGhlIHVzZXIgZG9lc24ndCBuZWVkCisgIC8vIHRvIHNwZWNpZnkgdGhlIGFycmF5IHNpemVzLgorCisjZGVmaW5lIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndjEsIGFyZ3YyLCBleHBlY3RlZCwgc2hvdWxkX3ByaW50X2hlbHApIFwKKyAgVGVzdFBhcnNpbmdGbGFncyhzaXplb2YoYXJndjEpL3NpemVvZigqYXJndjEpIC0gMSwgYXJndjEsIFwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoYXJndjIpL3NpemVvZigqYXJndjIpIC0gMSwgYXJndjIsIFwKKyAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgc2hvdWxkX3ByaW50X2hlbHApCit9OworCisvLyBUZXN0cyBwYXJzaW5nIGFuIGVtcHR5IGNvbW1hbmQgbGluZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3MoKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIGEgY29tbWFuZCBsaW5lIHRoYXQgaGFzIG5vIGZsYWcuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBOb0ZsYWcpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzKCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIGJhZCAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyQmFkKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiIiksIHRydWUpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIGFuIGVtcHR5IC0tZ3Rlc3RfZmlsdGVyIGZsYWcuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBGaWx0ZXJFbXB0eSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2ZpbHRlcj0iLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiIiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIG5vbi1lbXB0eSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyTm9uRW1wdHkpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9maWx0ZXI9YWJjIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoImFiYyIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVXaXRob3V0VmFsdWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKKyAgICBOVUxMCit9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MC4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlRmFsc2VfMCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPWYuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBCcmVha09uRmFpbHVyZUZhbHNlX2YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPWYiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1GLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVGYWxzZV9GKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1GIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCisvLyBkZWZpbml0aW9uLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVUcnVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT0xIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucy4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIENhdGNoRXhjZXB0aW9ucykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkNhdGNoRXhjZXB0aW9ucyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yay4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIERlYXRoVGVzdFVzZUZvcmspIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9kZWF0aF90ZXN0X3VzZV9mb3JrIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpEZWF0aFRlc3RVc2VGb3JrKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyB0aGUgc2FtZSBmbGFnIHR3aWNlIHdpdGggZGlmZmVyZW50IHZhbHVlcy4gIFRoZQorLy8gZXhwZWN0ZWQgYmVoYXZpb3IgaXMgdGhhdCB0aGUgb25lIGNvbWluZyBsYXN0IHRha2VzIHByZWNlZGVuY2UuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBEdXBsaWNhdGVkRmxhZ3MpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9maWx0ZXI9YSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyPWIiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiYiIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhbiB1bnJlY29nbml6ZWQgZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVW5yZWNvZ25pemVkRmxhZykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUiLAorICAgICJiYXIiLCAgLy8gVW5yZWNvZ25pemVkIGJ5IEdvb2dsZSBUZXN0LgorICAgICItLWd0ZXN0X2ZpbHRlcj1iIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgImJhciIsCisgICAgTlVMTAorICB9OworCisgIEZsYWdzIGZsYWdzOworICBmbGFncy5icmVha19vbl9mYWlsdXJlID0gdHJ1ZTsKKyAgZmxhZ3MuZmlsdGVyID0gImIiOworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBmbGFncywgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZworVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmxhZykgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2xpc3RfdGVzdHMiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdpdGggYSAidHJ1ZSIgdmFsdWUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIExpc3RUZXN0c1RydWUpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzPTEiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdpdGggYSAiZmFsc2UiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9MCIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9saXN0X3Rlc3RzPWYuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZV9mKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz1mIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9saXN0X3Rlc3RzPUYuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZV9GKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz1GIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQgKGludmFsaWQpLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0RW1wdHkpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFncygpLCB0cnVlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X291dHB1dD14bWwKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X291dHB1dD14bWwiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Ok91dHB1dCgieG1sIiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X291dHB1dD14bWw6ZmlsZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0WG1sRmlsZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X291dHB1dD14bWw6ZmlsZSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6T3V0cHV0KCJ4bWw6ZmlsZSIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sOmRpcmVjdG9yeS9wYXRoLworVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0WG1sRGlyZWN0b3J5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDpkaXJlY3RvcnkvcGF0aC8iLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6T3V0cHV0KCJ4bWw6ZGlyZWN0b3J5L3BhdGgvIiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZsYWcpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9wcmludF90aW1lIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X3ByaW50X3RpbWUgZmxhZyB3aXRoIGEgInRydWUiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBQcmludFRpbWVUcnVlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZT0xIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X3ByaW50X3RpbWUgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2UpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9wcmludF90aW1lPTAiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcHJpbnRfdGltZT1mLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2VfZikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3ByaW50X3RpbWU9ZiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcHJpbnRfdGltZT1GLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2VfRikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3ByaW50X3RpbWU9RiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcmFuZG9tX3NlZWQ9bnVtYmVyCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBSYW5kb21TZWVkKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfcmFuZG9tX3NlZWQ9MTAwMCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UmFuZG9tU2VlZCgxMDAwKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcmVwZWF0PW51bWJlcgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUmVwZWF0KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfcmVwZWF0PTEwMDAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlJlcGVhdCgxMDAwKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEFsc29SdW5EaXNhYmxlZFRlc3RzRmxhZykgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOjpBbHNvUnVuRGlzYWJsZWRUZXN0cyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgd2l0aCBhICJ0cnVlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQWxzb1J1bkRpc2FibGVkVGVzdHNUcnVlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM9MSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHModHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIHdpdGggYSAiZmFsc2UiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBBbHNvUnVuRGlzYWJsZWRUZXN0c0ZhbHNlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM9MCIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zaHVmZmxlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZVdpdGhvdXRWYWx1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3NodWZmbGUiLAorICAgIE5VTEwKK307CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTaHVmZmxlKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zaHVmZmxlPTAuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTaHVmZmxlRmFsc2VfMCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3NodWZmbGU9MCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6U2h1ZmZsZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3Rfc2h1ZmZsZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCisvLyBkZWZpbml0aW9uLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZVRydWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zaHVmZmxlPTEiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlNodWZmbGUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoPW51bWJlci4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFN0YWNrVHJhY2VEZXB0aCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoPTUiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlN0YWNrVHJhY2VEZXB0aCg1KSwgZmFsc2UpOworfQorCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTdHJlYW1SZXN1bHRUbykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3N0cmVhbV9yZXN1bHRfdG89bG9jYWxob3N0OjEyMzQiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXygKKyAgICAgIGFyZ3YsIGFyZ3YyLCBGbGFnczo6U3RyZWFtUmVzdWx0VG8oImxvY2FsaG9zdDoxMjM0IiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBUaHJvd09uRmFpbHVyZVdpdGhvdXRWYWx1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUiLAorICAgIE5VTEwKK307CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0wLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVGYWxzZV8wKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0wIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCisvLyBkZWZpbml0aW9uLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVUcnVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0xIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gVGVzdHMgcGFyc2luZyB3aWRlIHN0cmluZ3MuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBXaWRlU3RyaW5ncykgeworICBjb25zdCB3Y2hhcl90KiBhcmd2W10gPSB7CisgICAgTCJmb28uZXhlIiwKKyAgICBMIi0tZ3Rlc3RfZmlsdGVyPUZvbyoiLAorICAgIEwiLS1ndGVzdF9saXN0X3Rlc3RzPTEiLAorICAgIEwiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKKyAgICBMIi0tbm9uX2d0ZXN0X2ZsYWciLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCB3Y2hhcl90KiBhcmd2MltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTCItLW5vbl9ndGVzdF9mbGFnIiwKKyAgICBOVUxMCisgIH07CisKKyAgRmxhZ3MgZXhwZWN0ZWRfZmxhZ3M7CisgIGV4cGVjdGVkX2ZsYWdzLmJyZWFrX29uX2ZhaWx1cmUgPSB0cnVlOworICBleHBlY3RlZF9mbGFncy5maWx0ZXIgPSAiRm9vKiI7CisgIGV4cGVjdGVkX2ZsYWdzLmxpc3RfdGVzdHMgPSB0cnVlOworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIGV4cGVjdGVkX2ZsYWdzLCBmYWxzZSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgY3VycmVudF90ZXN0X2luZm8oKSBpbiBVbml0VGVzdC4KK2NsYXNzIEN1cnJlbnRUZXN0SW5mb1Rlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBOVUxMIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbgorICAvLyB0aGUgdGVzdCBjYXNlIGlzIHJ1bi4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gdGVzdHMgcnVubmluZyBhdCB0aGlzIHBvaW50LgorICAgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9pbmZvID09IE5VTEwpCisgICAgICAgIDw8ICJUaGVyZSBzaG91bGQgYmUgbm8gdGVzdHMgcnVubmluZyBhdCB0aGlzIHBvaW50LiI7CisgIH0KKworICAvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBOVUxMIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4KKyAgLy8gdGhlIHRlc3QgY2FzZSBoYXMgcnVuLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9pbmZvID09IE5VTEwpCisgICAgICAgIDw8ICJUaGVyZSBzaG91bGQgYmUgbm8gdGVzdHMgcnVubmluZyBhdCB0aGlzIHBvaW50LiI7CisgIH0KK307CisKKy8vIFRlc3RzIHRoYXQgY3VycmVudF90ZXN0X2luZm8oKSByZXR1cm5zIFRlc3RJbmZvIGZvciBjdXJyZW50bHkgcnVubmluZworLy8gdGVzdCBieSBjaGVja2luZyB0aGUgZXhwZWN0ZWQgdGVzdCBuYW1lIGFnYWluc3QgdGhlIGFjdHVhbCBvbmUuCitURVNUX0YoQ3VycmVudFRlc3RJbmZvVGVzdCwgV29ya3NGb3JGaXJzdFRlc3RJbkFUZXN0Q2FzZSkgeworICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KKyAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSB0ZXN0X2luZm8pCisgICAgICA8PCAiVGhlcmUgaXMgYSB0ZXN0IHJ1bm5pbmcgc28gd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBUZXN0SW5mby4iOworICBFWFBFQ1RfU1RSRVEoIkN1cnJlbnRUZXN0SW5mb1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpCisgICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QgY2FzZS4iOworICBFWFBFQ1RfU1RSRVEoIldvcmtzRm9yRmlyc3RUZXN0SW5BVGVzdENhc2UiLCB0ZXN0X2luZm8tPm5hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4iOworfQorCisvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBUZXN0SW5mbyBmb3IgY3VycmVudGx5IHJ1bm5pbmcKKy8vIHRlc3QgYnkgY2hlY2tpbmcgdGhlIGV4cGVjdGVkIHRlc3QgbmFtZSBhZ2FpbnN0IHRoZSBhY3R1YWwgb25lLiAgV2UKKy8vIHVzZSB0aGlzIHRlc3QgdG8gc2VlIHRoYXQgdGhlIFRlc3RJbmZvIG9iamVjdCBhY3R1YWxseSBjaGFuZ2VkIGZyb20KKy8vIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uLgorVEVTVF9GKEN1cnJlbnRUZXN0SW5mb1Rlc3QsIFdvcmtzRm9yU2Vjb25kVGVzdEluQVRlc3RDYXNlKSB7CisgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHRlc3RfaW5mbykKKyAgICAgIDw8ICJUaGVyZSBpcyBhIHRlc3QgcnVubmluZyBzbyB3ZSBzaG91bGQgaGF2ZSBhIHZhbGlkIFRlc3RJbmZvLiI7CisgIEVYUEVDVF9TVFJFUSgiQ3VycmVudFRlc3RJbmZvVGVzdCIsIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdCBjYXNlLiI7CisgIEVYUEVDVF9TVFJFUSgiV29ya3NGb3JTZWNvbmRUZXN0SW5BVGVzdENhc2UiLCB0ZXN0X2luZm8tPm5hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4iOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBUaGVzZSB0d28gbGluZXMgdGVzdCB0aGF0IHdlIGNhbiBkZWZpbmUgdGVzdHMgaW4gYSBuYW1lc3BhY2UgdGhhdAorLy8gaGFzIHRoZSBuYW1lICJ0ZXN0aW5nIiBhbmQgaXMgbmVzdGVkIGluIGFub3RoZXIgbmFtZXNwYWNlLgorbmFtZXNwYWNlIG15X25hbWVzcGFjZSB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBURVNUIGtub3dzIHRvIHVzZSA6OnRlc3Rpbmc6OlRlc3QgaW5zdGVhZCBvZgorLy8gOjpteV9uYW1lc3BhY2U6OnRlc3Rpbmc6OlRlc3QuCitjbGFzcyBUZXN0IHt9OworCisvLyBNYWtlcyBzdXJlIHRoYXQgYW4gYXNzZXJ0aW9uIGtub3dzIHRvIHVzZSA6OnRlc3Rpbmc6Ok1lc3NhZ2UgaW5zdGVhZCBvZgorLy8gOjpteV9uYW1lc3BhY2U6OnRlc3Rpbmc6Ok1lc3NhZ2UuCitjbGFzcyBNZXNzYWdlIHt9OworCisvLyBNYWtlcyBzdXJlIHRoYXQgYW4gYXNzZXJ0aW9uIGtub3dzIHRvIHVzZQorLy8gOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgaW5zdGVhZCBvZgorLy8gOjpteV9uYW1lc3BhY2U6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4KK2NsYXNzIEFzc2VydGlvblJlc3VsdCB7fTsKKworLy8gVGVzdHMgdGhhdCBhbiBhc3NlcnRpb24gdGhhdCBzaG91bGQgc3VjY2VlZCB3b3JrcyBhcyBleHBlY3RlZC4KK1RFU1QoTmVzdGVkVGVzdGluZ05hbWVzcGFjZVRlc3QsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW4gYXNzZXJ0aW9uIHRoYXQgc2hvdWxkIGZhaWwgd29ya3MgYXMgZXhwZWN0ZWQuCitURVNUKE5lc3RlZFRlc3RpbmdOYW1lc3BhY2VUZXN0LCBGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgbXlfbmFtZXNwYWNlCisKKy8vIFRlc3RzIHRoYXQgb25lIGNhbiBjYWxsIHN1cGVyY2xhc3MgU2V0VXAgYW5kIFRlYXJEb3duIG1ldGhvZHMtLQorLy8gdGhhdCBpcywgdGhhdCB0aGV5IGFyZSBub3QgcHJpdmF0ZS4KKy8vIE5vIHRlc3RzIGFyZSBiYXNlZCBvbiB0aGlzIGZpeHR1cmU7IHRoZSB0ZXN0ICJwYXNzZXMiIGlmIGl0IGNvbXBpbGVzCisvLyBzdWNjZXNzZnVsbHkuCitjbGFzcyBQcm90ZWN0ZWRGaXh0dXJlTWV0aG9kc1Rlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgVGVzdDo6U2V0VXAoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgVGVzdDo6VGVhckRvd24oKTsKKyAgfQorfTsKKworLy8gU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QgdGVzdHMgdGhlIHN0cmVhbWluZyB2ZXJzaW9ucyBvZiBhIHJlcHJlc2VudGF0aXZlCisvLyBzYW1wbGUgb2YgYXNzZXJ0aW9ucy4KK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFVuY29uZGl0aW9uYWwpIHsKKyAgU1VDQ0VFRCgpIDw8ICJleHBlY3RlZCBzdWNjZXNzIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQUREX0ZBSUxVUkUoKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwgIlVucmVhY2hhYmxlIGNvZGUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MgLXctcmNoCisjZW5kaWYKKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVHJ1dGgpIHsKKyAgRVhQRUNUX1RSVUUodHJ1ZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9UUlVFKHRydWUpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShmYWxzZSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShmYWxzZSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBUcnV0aDIpIHsKKyAgRVhQRUNUX0ZBTFNFKGZhbHNlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0ZBTFNFKGZhbHNlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKHRydWUpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKHRydWUpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHJlc3NlZCB0aGVtCisjIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgSW50ZWdlckVxdWFscykgeworICBFWFBFQ1RfRVEoMSwgMSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9FUSgxLCAxKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDEsIDIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKDEsIDIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgSW50ZWdlckxlc3NUaGFuKSB7CisgIEVYUEVDVF9MVCgxLCAyKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0xUKDEsIDIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoMiwgMSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTFQoMiwgMSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBTdHJpbmdzRXF1YWwpIHsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCAiZm9vIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9TVFJFUSgiZm9vIiwgImZvbyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nc05vdEVxdWFsKSB7CisgIEVYUEVDVF9TVFJORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfU1RSTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKCJmb28iLCAiZm9vIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSTkUoImZvbyIsICJmb28iKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ3NFcXVhbElnbm9yaW5nQ2FzZSkgeworICBFWFBFQ1RfU1RSQ0FTRUVRKCJmb28iLCAiRk9PIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9TVFJDQVNFRVEoImZvbyIsICJGT08iKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nTm90RXF1YWxJZ25vcmluZ0Nhc2UpIHsKKyAgRVhQRUNUX1NUUkNBU0VORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfU1RSQ0FTRU5FKCJmb28iLCAiYmFyIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJDQVNFTkUoImZvbyIsICJGT08iKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFTkUoImJhciIsICJCQVIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEZsb2F0aW5nUG9pbnRFcXVhbHMpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgMS4wKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0ZMT0FUX0VRKDEuMCwgMS4wKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDAuMCwgMS4wKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GTE9BVF9FUSgwLjAsIDEuMCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVGhyb3cpIHsKKyAgRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBOb1Rocm93KSB7CisgIEVYUEVDVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEFueVRocm93KSB7CisgIEVYUEVDVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgY29ycmVjdGx5IGRlY2lkZXMgd2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuR1Rlc3RDb2xvckZsYWdJc1llcykgeworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJ5ZXMiOworCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc0NvbG9yc1doZW5HVGVzdENvbG9yRmxhZ0lzQWxpYXNPZlllcykgeworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gIlRydWUiOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJ0IjsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiMSI7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorfQorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzTm9Db2xvcldoZW5HVGVzdENvbG9yRmxhZ0lzTm8pIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAibm8iOworCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNOb0NvbG9yV2hlbkdUZXN0Q29sb3JGbGFnSXNJbnZhbGlkKSB7CisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiRiI7CisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiMCI7CisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAidW5rbm93biI7CisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuU3Rkb3V0SXNUdHkpIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiYXV0byI7CisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAgIC8vIFN0ZG91dCBpcyBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc0NvbG9yc1doZW5UZXJtU3VwcG9ydHNDb2xvcnMpIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiYXV0byI7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIE9uIFdpbmRvd3MsIHdlIGlnbm9yZSB0aGUgVEVSTSB2YXJpYWJsZSBhcyBpdCdzIHVzdWFsbHkgbm90IHNldC4KKworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgIiIpOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyNlbHNlCisgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcywgd2UgcmVseSBvbiBURVJNIHRvIGRldGVybWluZSBpZiB0aGUKKyAgLy8gdGVybWluYWwgc3VwcG9ydHMgY29sb3JzLgorCisgIFNldEVudigiVEVSTSIsICJkdW1iIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgImVtYWNzIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInZ0MTAwIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtLW1vbm8iKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtLWNvbG9yIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ4dGVybS0yNTZjb2xvciIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAic2NyZWVuIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJsaW51eCIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiY3lnd2luIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKy8vIFZlcmlmaWVzIHRoYXQgU3RhdGljQXNzZXJ0VHlwZUVxIHdvcmtzIGluIGEgbmFtZXNwYWNlIHNjb3BlLgorCitzdGF0aWMgYm9vbCBkdW1teTEgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBTdGF0aWNBc3NlcnRUeXBlRXE8Ym9vbCwgYm9vbD4oKTsKK3N0YXRpYyBib29sIGR1bW15MiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9CisgICAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGludCwgY29uc3QgaW50PigpOworCisvLyBWZXJpZmllcyB0aGF0IFN0YXRpY0Fzc2VydFR5cGVFcSB3b3JrcyBpbiBhIGNsYXNzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXIgeworIHB1YmxpYzoKKyAgU3RhdGljQXNzZXJ0VHlwZUVxVGVzdEhlbHBlcigpIHsgU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsIFQ+KCk7IH0KK307CisKK1RFU1QoU3RhdGljQXNzZXJ0VHlwZUVxVGVzdCwgV29ya3NJbkNsYXNzKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXI8Ym9vbD4oKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBTdGF0aWNBc3NlcnRUeXBlRXEgd29ya3MgaW5zaWRlIGEgZnVuY3Rpb24uCisKK3R5cGVkZWYgaW50IEludEFsaWFzOworCitURVNUKFN0YXRpY0Fzc2VydFR5cGVFcVRlc3QsIENvbXBpbGVzRm9yRXF1YWxUeXBlcykgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBJbnRBbGlhcz4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCosIEludEFsaWFzKj4oKTsKK30KKworVEVTVChHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wVGVzdCwgUmV0dXJuc1RoZVN0YWNrVHJhY2UpIHsKKyAgdGVzdGluZzo6VW5pdFRlc3QqIGNvbnN0IHVuaXRfdGVzdCA9IHRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgIC8vIFdlIGRvbid0IGhhdmUgYSBzdGFjayB3YWxrZXIgaW4gR29vZ2xlIFRlc3QgeWV0LgorICBFWFBFQ1RfU1RSRVEoIiIsIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AodW5pdF90ZXN0LCAwKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKHVuaXRfdGVzdCwgMSkuY19zdHIoKSk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc05vbmZhdGFsRmFpbHVyZSgpKTsKK30KKworc3RhdGljIHZvaWQgRmFpbEZhdGFsbHkoKSB7IEZBSUwoKTsgfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5UaGVyZUlzT25seUZhdGFsRmFpbHVyZSkgeworICBGYWlsRmF0YWxseSgpOworICBjb25zdCBib29sIGhhc19ub25mYXRhbF9mYWlsdXJlID0gSGFzTm9uZmF0YWxGYWlsdXJlKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfRkFMU0UoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNOb25mYXRhbEZhaWx1cmUpIHsKKyAgQUREX0ZBSUxVUkUoKTsKKyAgY29uc3QgYm9vbCBoYXNfbm9uZmF0YWxfZmFpbHVyZSA9IEhhc05vbmZhdGFsRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlQXJlRmF0YWxBbmROb25mYXRhbEZhaWx1cmVzKSB7CisgIEZhaWxGYXRhbGx5KCk7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKK30KKworLy8gQSB3cmFwcGVyIGZvciBjYWxsaW5nIEhhc05vbmZhdGFsRmFpbHVyZSBvdXRzaWRlIG9mIGEgdGVzdCBib2R5Lgorc3RhdGljIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCkgeworICByZXR1cm4gdGVzdGluZzo6VGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgV29ya3NPdXRzaWRlT2ZUZXN0Qm9keSkgeworICBFWFBFQ1RfRkFMU0UoSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCkpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFdvcmtzT3V0c2lkZU9mVGVzdEJvZHkyKSB7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc0ZhaWx1cmUoKSk7Cit9CisKK1RFU1QoSGFzRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNGYXRhbEZhaWx1cmUpIHsKKyAgRmFpbEZhdGFsbHkoKTsKKyAgY29uc3QgYm9vbCBoYXNfZmFpbHVyZSA9IEhhc0ZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19mYWlsdXJlKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVJc05vbmZhdGFsRmFpbHVyZSkgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUFyZUZhdGFsQW5kTm9uZmF0YWxGYWlsdXJlcykgeworICBGYWlsRmF0YWxseSgpOworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCisvLyBBIHdyYXBwZXIgZm9yIGNhbGxpbmcgSGFzRmFpbHVyZSBvdXRzaWRlIG9mIGEgdGVzdCBib2R5Lgorc3RhdGljIGJvb2wgSGFzRmFpbHVyZUhlbHBlcigpIHsgcmV0dXJuIHRlc3Rpbmc6OlRlc3Q6Okhhc0ZhaWx1cmUoKTsgfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5KSB7CisgIEVYUEVDVF9GQUxTRShIYXNGYWlsdXJlSGVscGVyKCkpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5MikgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZUhlbHBlcigpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitjbGFzcyBUZXN0TGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0TGlzdGVuZXIoKSA6IG9uX3N0YXJ0X2NvdW50ZXJfKE5VTEwpLCBpc19kZXN0cm95ZWRfKE5VTEwpIHt9CisgIFRlc3RMaXN0ZW5lcihpbnQqIG9uX3N0YXJ0X2NvdW50ZXIsIGJvb2wqIGlzX2Rlc3Ryb3llZCkKKyAgICAgIDogb25fc3RhcnRfY291bnRlcl8ob25fc3RhcnRfY291bnRlciksCisgICAgICAgIGlzX2Rlc3Ryb3llZF8oaXNfZGVzdHJveWVkKSB7fQorCisgIHZpcnR1YWwgflRlc3RMaXN0ZW5lcigpIHsKKyAgICBpZiAoaXNfZGVzdHJveWVkXykKKyAgICAgICppc19kZXN0cm95ZWRfID0gdHJ1ZTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgaWYgKG9uX3N0YXJ0X2NvdW50ZXJfICE9IE5VTEwpCisgICAgICAoKm9uX3N0YXJ0X2NvdW50ZXJfKSsrOworICB9CisKKyBwcml2YXRlOgorICBpbnQqIG9uX3N0YXJ0X2NvdW50ZXJfOworICBib29sKiBpc19kZXN0cm95ZWRfOworfTsKKworLy8gVGVzdHMgdGhlIGNvbnN0cnVjdG9yLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBDb25zdHJ1Y3Rpb25Xb3JrcykgeworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworCisgIEVYUEVDVF9UUlVFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKSAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpID09IE5VTEwpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBUZXN0RXZlbnRMaXN0ZW5lcnMgZGVzdHJ1Y3RvciBkZWxldGVzIGFsbCB0aGUgbGlzdGVuZXJzIGl0CisvLyBvd25zLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBEZXN0cnVjdGlvbldvcmtzKSB7CisgIGJvb2wgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgYm9vbCBkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBib29sIGV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfaXNfZGVzdHJveWVkKTsKKyAgVGVzdExpc3RlbmVyKiBkZWZhdWx0X3htbF9wcmludGVyID0gbmV3IFRlc3RMaXN0ZW5lcigKKyAgICAgIE5VTEwsICZkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIFRlc3RMaXN0ZW5lciogZXh0cmFfbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCk7CisKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIpOworICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF94bWxfcHJpbnRlcik7CisgICAgbGlzdGVuZXJzLkFwcGVuZChleHRyYV9saXN0ZW5lcik7CisgIH0KKyAgRVhQRUNUX1RSVUUoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQpOworICBFWFBFQ1RfVFJVRShkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIEVYUEVDVF9UUlVFKGV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBBcHBlbmQnZWQgdG8gYSBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdCBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMuCitURVNUKFRlc3RFdmVudExpc3RlbmVyc1Rlc3QsIEFwcGVuZCkgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworICB9CisgIEVYUEVDVF9UUlVFKGlzX2Rlc3Ryb3llZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbGlzdGVuZXJzIHJlY2VpdmUgZXZlbnRzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYXBwZW5kZWQgdG8KKy8vIHRoZSBsaXN0LCBleGNlcHQgZm9yICpFbmQgcmVxdWVzdHMsIHdoaWNoIG11c3QgYmUgcmVjZWl2ZWQgaW4gdGhlIHJldmVyc2UKKy8vIG9yZGVyLgorY2xhc3MgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcihzdGQ6OnZlY3RvcjxTdHJpbmc+KiB2ZWN0b3IsIGNvbnN0IGNoYXIqIGlkKQorICAgICAgOiB2ZWN0b3JfKHZlY3RvciksIGlkXyhpZCkge30KKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RQcm9ncmFtU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RQcm9ncmFtRW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgICB2ZWN0b3JfLT5wdXNoX2JhY2soR2V0RXZlbnREZXNjcmlwdGlvbigiT25UZXN0SXRlcmF0aW9uU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdEl0ZXJhdGlvbkVuZCIpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nIEdldEV2ZW50RGVzY3JpcHRpb24oY29uc3QgY2hhciogbWV0aG9kKSB7CisgICAgTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UgPDwgaWRfIDw8ICIuIiA8PCBtZXRob2Q7CisgICAgcmV0dXJuIG1lc3NhZ2UuR2V0U3RyaW5nKCk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxTdHJpbmc+KiB2ZWN0b3JfOworICBjb25zdCBjaGFyKiBjb25zdCBpZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcik7Cit9OworCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBBcHBlbmRLZWVwc09yZGVyKSB7CisgIHN0ZDo6dmVjdG9yPFN0cmluZz4gdmVjOworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcigmdmVjLCAiMXN0IikpOworICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcigmdmVjLCAiMm5kIikpOworICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcigmdmVjLCAiM3JkIikpOworCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0UHJvZ3JhbVN0YXJ0IiwgdmVjWzBdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RQcm9ncmFtU3RhcnQiLCB2ZWNbMV0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiM3JkLk9uVGVzdFByb2dyYW1TdGFydCIsIHZlY1syXS5jX3N0cigpKTsKKworICB2ZWMuY2xlYXIoKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtRW5kKAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0UHJvZ3JhbUVuZCIsIHZlY1swXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIybmQuT25UZXN0UHJvZ3JhbUVuZCIsIHZlY1sxXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0UHJvZ3JhbUVuZCIsIHZlY1syXS5jX3N0cigpKTsKKworICB2ZWMuY2xlYXIoKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RJdGVyYXRpb25TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSwgMCk7CisgIEFTU0VSVF9FUSgzVSwgdmVjLnNpemUoKSk7CisgIEVYUEVDVF9TVFJFUSgiMXN0Lk9uVGVzdEl0ZXJhdGlvblN0YXJ0IiwgdmVjWzBdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RJdGVyYXRpb25TdGFydCIsIHZlY1sxXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0SXRlcmF0aW9uU3RhcnQiLCB2ZWNbMl0uY19zdHIoKSk7CisKKyAgdmVjLmNsZWFyKCk7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0SXRlcmF0aW9uRW5kKAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLCAwKTsKKyAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0SXRlcmF0aW9uRW5kIiwgdmVjWzBdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RJdGVyYXRpb25FbmQiLCB2ZWNbMV0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMXN0Lk9uVGVzdEl0ZXJhdGlvbkVuZCIsIHZlY1syXS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGxpc3RlbmVyIHJlbW92ZWQgZnJvbSBhIFRlc3RFdmVudExpc3RlbmVycyBsaXN0IHN0b3BzIHJlY2VpdmluZworLy8gZXZlbnRzIGFuZCBpcyBub3QgZGVsZXRlZCB3aGVuIHRoZSBsaXN0IGlzIGRlc3Ryb3llZC4KK1RFU1QoVGVzdEV2ZW50TGlzdGVuZXJzVGVzdCwgUmVsZWFzZSkgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIC8vIEFsdGhvdWdoIEFwcGVuZCBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCB0byB0aGUgbGlzdCwKKyAgLy8gdGhlIGZvbGxvd2luZyBjYWxscyByZWxlYXNlIGl0LCBhbmQgd2UgbmVlZCB0byBkZWxldGUgaXQgYmVmb3JlIHRoZQorICAvLyB0ZXN0IGVuZHMuCisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7CisgICAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcikpOworICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICAgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSA9PSBOVUxMKTsKKyAgfQorICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7CisgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworICBkZWxldGUgbGlzdGVuZXI7Cit9CisKKy8vIFRlc3RzIHRoYXQgbm8gZXZlbnRzIGFyZSBmb3J3YXJkZWQgd2hlbiBldmVudCBmb3J3YXJkaW5nIGlzIGRpc2FibGVkLgorVEVTVChFdmVudExpc3RlbmVyVGVzdCwgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgTlVMTCk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7CisgIEFTU0VSVF9UUlVFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKGxpc3RlbmVycykpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoJmxpc3RlbmVycyk7CisgIEFTU0VSVF9GQUxTRShUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6RXZlbnRGb3J3YXJkaW5nRW5hYmxlZChsaXN0ZW5lcnMpKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7Cit9CisKKy8vIFRlc3RzIHRoYXQgZXZlbnRzIGdlbmVyYXRlZCBieSBHb29nbGUgVGVzdCBhcmUgbm90IGZvcndhcmRlZCBpbgorLy8gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCitURVNUKEV2ZW50TGlzdGVuZXJEZWF0aFRlc3QsIEV2ZW50c05vdEZvcndhcmRlZEluRGVhdGhUZXN0U3VicHJlY2Vzc2VzKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgICAgR1RFU1RfQ0hFQ0tfKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKAorICAgICAgICAgICpHZXRVbml0VGVzdEltcGwoKS0+bGlzdGVuZXJzKCkpKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSI7fSwKKyAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBpbnN0YWxsZWQgdmlhIFNldERlZmF1bHRSZXN1bHRQcmludGVyKCkgc3RhcnRzCisvLyByZWNlaXZpbmcgZXZlbnRzIGFuZCBpcyByZXR1cm5lZCB2aWEgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpIGFuZCB0aGF0CisvLyB0aGUgcHJldmlvdXMgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QgYW5kIGRlbGV0ZWQuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7CisKKyAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisKKyAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworCisgIC8vIFJlcGxhY2luZyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIHdpdGggc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHJlbW92ZSBpdAorICAvLyBmcm9tIHRoZSBsaXN0IGFuZCBkZXN0cm95IGl0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoJmxpc3RlbmVycywgTlVMTCk7CisKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoaXNfZGVzdHJveWVkKTsKKworICAvLyBBZnRlciBicm9hZGNhc3RpbmcgYW4gZXZlbnQgdGhlIGNvdW50ZXIgaXMgc3RpbGwgdGhlIHNhbWUsIGluZGljYXRpbmcKKyAgLy8gdGhlIGxpc3RlbmVyIGlzIG5vdCBpbiB0aGUgbGlzdCBhbnltb3JlLgorICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBsaXN0ZW5lciBzdG9wcyByZWNlaXZpbmcgZXZlbnRzCisvLyB3aGVuIHJlbW92ZWQgdmlhIFJlbGVhc2UgYW5kIHRoYXQgaXMgbm90IG93bmVkIGJ5IHRoZSBsaXN0IGFueW1vcmUuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBSZW1vdmluZ0RlZmF1bHRSZXN1bHRQcmludGVyV29ya3MpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICAvLyBBbHRob3VnaCBBcHBlbmQgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QgdG8gdGhlIGxpc3QsCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMgcmVsZWFzZSBpdCwgYW5kIHdlIG5lZWQgdG8gZGVsZXRlIGl0IGJlZm9yZSB0aGUKKyAgLy8gdGVzdCBlbmRzLgorICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisgIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7CisKKyAgICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSk7CisgICAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKKworICAgIC8vIEJyb2FkY2FzdGluZyBldmVudHMgbm93IHNob3VsZCBub3QgYWZmZWN0IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIuCisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX0VRKDAsIG9uX3N0YXJ0X2NvdW50ZXIpOworICB9CisgIC8vIERlc3Ryb3lpbmcgdGhlIGxpc3Qgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGxpc3RlbmVyIG5vdywgdG9vLgorICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKKyAgZGVsZXRlIGxpc3RlbmVyOworfQorCisvLyBUZXN0cyB0aGF0IGEgbGlzdGVuZXIgaW5zdGFsbGVkIHZpYSBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCkgc3RhcnRzCisvLyByZWNlaXZpbmcgZXZlbnRzIGFuZCBpcyByZXR1cm5lZCB2aWEgZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgYW5kIHRoYXQKKy8vIHRoZSBwcmV2aW91cyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFuZCBkZWxldGVkLgorVEVTVChFdmVudExpc3RlbmVyVGVzdCwgZGVmYXVsdF94bWxfZ2VuZXJhdG9yKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKworICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworCisgIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKKworICAvLyBSZXBsYWNpbmcgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIHdpdGggc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHJlbW92ZSBpdAorICAvLyBmcm9tIHRoZSBsaXN0IGFuZCBkZXN0cm95IGl0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcigmbGlzdGVuZXJzLCBOVUxMKTsKKworICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGlzX2Rlc3Ryb3llZCk7CisKKyAgLy8gQWZ0ZXIgYnJvYWRjYXN0aW5nIGFuIGV2ZW50IHRoZSBjb3VudGVyIGlzIHN0aWxsIHRoZSBzYW1lLCBpbmRpY2F0aW5nCisgIC8vIHRoZSBsaXN0ZW5lciBpcyBub3QgaW4gdGhlIGxpc3QgYW55bW9yZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBsaXN0ZW5lciBzdG9wcyByZWNlaXZpbmcgZXZlbnRzCisvLyB3aGVuIHJlbW92ZWQgdmlhIFJlbGVhc2UgYW5kIHRoYXQgaXMgbm90IG93bmVkIGJ5IHRoZSBsaXN0IGFueW1vcmUuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBSZW1vdmluZ0RlZmF1bHRYbWxHZW5lcmF0b3JXb3JrcykgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIC8vIEFsdGhvdWdoIEFwcGVuZCBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCB0byB0aGUgbGlzdCwKKyAgLy8gdGhlIGZvbGxvd2luZyBjYWxscyByZWxlYXNlIGl0LCBhbmQgd2UgbmVlZCB0byBkZWxldGUgaXQgYmVmb3JlIHRoZQorICAvLyB0ZXN0IGVuZHMuCisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoJmxpc3RlbmVycywgbGlzdGVuZXIpOworCisgICAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcikpOworICAgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKKworICAgIC8vIEJyb2FkY2FzdGluZyBldmVudHMgbm93IHNob3VsZCBub3QgYWZmZWN0IGRlZmF1bHRfeG1sX2dlbmVyYXRvci4KKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7CisgIH0KKyAgLy8gRGVzdHJveWluZyB0aGUgbGlzdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgbGlzdGVuZXIgbm93LCB0b28uCisgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworICBkZWxldGUgbGlzdGVuZXI7Cit9CisKKy8vIFNhbml0eSB0ZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgYWx0ZXJuYXRpdmUsIHZlcmJvc2Ugc3BlbGxpbmdzIG9mCisvLyBzb21lIG9mIHRoZSBtYWNyb3Mgd29yay4gIFdlIGRvbid0IHRlc3QgdGhlbSB0aG9yb3VnaGx5IGFzIHRoYXQKKy8vIHdvdWxkIGJlIHF1aXRlIGludm9sdmVkLiAgU2luY2UgdGhlaXIgaW1wbGVtZW50YXRpb25zIGFyZQorLy8gc3RyYWlnaHRmb3J3YXJkLCBhbmQgdGhleSBhcmUgcmFyZWx5IHVzZWQsIHdlJ2xsIGp1c3QgcmVseSBvbiB0aGUKKy8vIHVzZXJzIHRvIHRlbGwgdXMgd2hlbiB0aGV5IGFyZSBicm9rZW4uCitHVEVTVF9URVNUKEFsdGVybmF0aXZlTmFtZVRlc3QsIFdvcmtzKSB7ICAvLyBHVEVTVF9URVNUIGlzIHRoZSBzYW1lIGFzIFRFU1QuCisgIEdURVNUX1NVQ0NFRUQoKSA8PCAiT0siOyAgLy8gR1RFU1RfU1VDQ0VFRCBpcyB0aGUgc2FtZSBhcyBTVUNDRUVELgorCisgIC8vIEdURVNUX0ZBSUwgaXMgdGhlIHNhbWUgYXMgRkFJTC4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfRkFJTCgpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICAvLyBHVEVTVF9BU1NFUlRfWFkgaXMgdGhlIHNhbWUgYXMgQVNTRVJUX1hZLgorCisgIEdURVNUX0FTU0VSVF9FUSgwLCAwKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0VRKDAsIDEpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0VRKDEsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfTkUoMCwgMSk7CisgIEdURVNUX0FTU0VSVF9ORSgxLCAwKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX05FKDAsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfTEUoMCwgMCk7CisgIEdURVNUX0FTU0VSVF9MRSgwLCAxKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0xFKDEsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfTFQoMCwgMSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9MVCgwLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9MVCgxLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgR1RFU1RfQVNTRVJUX0dFKDAsIDApOworICBHVEVTVF9BU1NFUlRfR0UoMSwgMCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9HRSgwLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgR1RFU1RfQVNTRVJUX0dUKDEsIDApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfR1QoMCwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfR1QoMSwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisvLyBUZXN0cyBmb3IgaW50ZXJuYWwgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuaXZlcnNhbAorLy8gcHJpbnRpbmcuCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBGaW5kIGEgYmV0dGVyIGhvbWUgZm9yIHRoZW0uCisKK2NsYXNzIENvbnZlcnNpb25IZWxwZXJCYXNlIHt9OworY2xhc3MgQ29udmVyc2lvbkhlbHBlckRlcml2ZWQgOiBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckJhc2Uge307CisKKy8vIFRlc3RzIHRoYXQgSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KK1RFU1QoSXNBUHJvdG9jb2xNZXNzYWdlVGVzdCwgVmFsdWVJc0NvbXBpbGVUaW1lQ29uc3RhbnQpIHsKKyAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKElzQVByb3RvY29sTWVzc2FnZTxQcm90b2NvbE1lc3NhZ2U+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3RydWUpOworICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oIUlzQVByb3RvY29sTWVzc2FnZTxpbnQ+Ojp2YWx1ZSwgY29uc3RfZmFsc2UpOworfQorCisvLyBUZXN0cyB0aGF0IElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgdHJ1ZSB3aGVuIFQgaXMKKy8vIHByb3RvMjo6TWVzc2FnZSBvciBhIHN1Yi1jbGFzcyBvZiBpdC4KK1RFU1QoSXNBUHJvdG9jb2xNZXNzYWdlVGVzdCwgVmFsdWVJc1RydWVXaGVuVHlwZUlzQVByb3RvY29sTWVzc2FnZSkgeworICBFWFBFQ1RfVFJVRShJc0FQcm90b2NvbE1lc3NhZ2U8IDo6cHJvdG8yOjpNZXNzYWdlPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShJc0FQcm90b2NvbE1lc3NhZ2U8UHJvdG9jb2xNZXNzYWdlPjo6dmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgZmFsc2Ugd2hlbiBUIGlzIG5laXRoZXIKKy8vIFByb3RvY29sTWVzc2FnZSBub3IgYSBzdWItY2xhc3Mgb2YgaXQuCitURVNUKElzQVByb3RvY29sTWVzc2FnZVRlc3QsIFZhbHVlSXNGYWxzZVdoZW5UeXBlSXNOb3RBUHJvdG9jb2xNZXNzYWdlKSB7CisgIEVYUEVDVF9GQUxTRShJc0FQcm90b2NvbE1lc3NhZ2U8aW50Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoSXNBUHJvdG9jb2xNZXNzYWdlPGNvbnN0IENvbnZlcnNpb25IZWxwZXJCYXNlPjo6dmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsIGNvbXBpbGVzIHdoZW4gdGhlIHR5cGUgYXJndW1lbnRzIGFyZQorLy8gZXF1YWwuCitURVNUKENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsLCBDb21waWxlc1doZW5UeXBlc0FyZUVxdWFsKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIHZvaWQ+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCosIGludCo+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlUmVmZXJlbmNlIGRvZXMgbm90IGFmZmVjdCBub24tcmVmZXJlbmNlIHR5cGVzLgorVEVTVChSZW1vdmVSZWZlcmVuY2VUZXN0LCBEb2VzTm90QWZmZWN0Tm9uUmVmZXJlbmNlVHlwZSkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZVJlZmVyZW5jZTxpbnQ+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyLCBSZW1vdmVSZWZlcmVuY2U8Y29uc3QgY2hhcj46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlUmVmZXJlbmNlIHJlbW92ZXMgcmVmZXJlbmNlIGZyb20gcmVmZXJlbmNlIHR5cGVzLgorVEVTVChSZW1vdmVSZWZlcmVuY2VUZXN0LCBSZW1vdmVzUmVmZXJlbmNlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlUmVmZXJlbmNlPGludCY+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyLCBSZW1vdmVSZWZlcmVuY2U8Y29uc3QgY2hhciY+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlKCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVDIpPigpOworfQorCitURVNUKFJlbW92ZVJlZmVyZW5jZVRlc3QsIE1hY3JvVmVyc2lvbikgeworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2U8aW50LCBpbnQ+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZTxjb25zdCBjaGFyLCBjb25zdCBjaGFyJj4oKTsKK30KKworCisvLyBUZXN0cyB0aGF0IFJlbW92ZUNvbnN0IGRvZXMgbm90IGFmZmVjdCBub24tY29uc3QgdHlwZXMuCitURVNUKFJlbW92ZUNvbnN0VGVzdCwgRG9lc05vdEFmZmVjdE5vbkNvbnN0VHlwZSkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZUNvbnN0PGludD46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXImLCBSZW1vdmVDb25zdDxjaGFyJj46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlQ29uc3QgcmVtb3ZlcyBjb25zdCBmcm9tIGNvbnN0IHR5cGVzLgorVEVTVChSZW1vdmVDb25zdFRlc3QsIFJlbW92ZXNDb25zdCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZUNvbnN0PGNvbnN0IGludD46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXJbMl0sIFJlbW92ZUNvbnN0PGNvbnN0IGNoYXJbMl0+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjaGFyWzJdWzNdLCBSZW1vdmVDb25zdDxjb25zdCBjaGFyWzJdWzNdPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfUkVNT1ZFX0NPTlNUXy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgVGVzdEdUZXN0UmVtb3ZlQ29uc3QoKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRU1PVkVfQ09OU1RfKFQyKT4oKTsKK30KKworVEVTVChSZW1vdmVDb25zdFRlc3QsIE1hY3JvVmVyc2lvbikgeworICBUZXN0R1Rlc3RSZW1vdmVDb25zdDxpbnQsIGludD4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlQ29uc3Q8ZG91YmxlJiwgZG91YmxlJj4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlQ29uc3Q8Y2hhciwgY29uc3QgY2hhcj4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdCgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUMik+KCk7Cit9CisKK1RFU1QoUmVtb3ZlUmVmZXJlbmNlVG9Db25zdFRlc3QsIFdvcmtzKSB7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGludCwgaW50PigpOworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxkb3VibGUsIGRvdWJsZSY+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGNoYXIsIGNvbnN0IGNoYXI+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGNoYXIsIGNvbnN0IGNoYXImPigpOworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxjb25zdCBjaGFyKiwgY29uc3QgY2hhcio+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQWRkUmVmZXJlbmNlIGRvZXMgbm90IGFmZmVjdCByZWZlcmVuY2UgdHlwZXMuCitURVNUKEFkZFJlZmVyZW5jZVRlc3QsIERvZXNOb3RBZmZlY3RSZWZlcmVuY2VUeXBlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCYsIEFkZFJlZmVyZW5jZTxpbnQmPjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciYsIEFkZFJlZmVyZW5jZTxjb25zdCBjaGFyJj46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQWRkUmVmZXJlbmNlIGFkZHMgcmVmZXJlbmNlIHRvIG5vbi1yZWZlcmVuY2UgdHlwZXMuCitURVNUKEFkZFJlZmVyZW5jZVRlc3QsIEFkZHNSZWZlcmVuY2UpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50JiwgQWRkUmVmZXJlbmNlPGludD46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXImLCBBZGRSZWZlcmVuY2U8Y29uc3QgY2hhcj46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIEdURVNUX0FERF9SRUZFUkVOQ0VfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RBZGRSZWZlcmVuY2UoKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9BRERfUkVGRVJFTkNFXyhUMik+KCk7Cit9CisKK1RFU1QoQWRkUmVmZXJlbmNlVGVzdCwgTWFjcm9WZXJzaW9uKSB7CisgIFRlc3RHVGVzdEFkZFJlZmVyZW5jZTxpbnQmLCBpbnQ+KCk7CisgIFRlc3RHVGVzdEFkZFJlZmVyZW5jZTxjb25zdCBjaGFyJiwgY29uc3QgY2hhciY+KCk7Cit9CisKKy8vIFRlc3RzIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3QoKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfKFQyKT4oKTsKK30KKworVEVTVChHVGVzdFJlZmVyZW5jZVRvQ29uc3RUZXN0LCBXb3JrcykgeworICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IGNoYXImLCBjaGFyPigpOworICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IGludCYsIGNvbnN0IGludD4oKTsKKyAgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdDxjb25zdCBkb3VibGUmLCBkb3VibGU+KCk7CisgIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbXBsaWNpdGx5Q29udmVydGlibGU8VDEsIFQyPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCitURVNUKEltcGxpY2l0bHlDb252ZXJ0aWJsZVRlc3QsIFZhbHVlSXNDb21waWxlVGltZUNvbnN0YW50KSB7CisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCwgaW50Pjo6dmFsdWUpLCBjb25zdF90cnVlKTsKKyAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCghSW1wbGljaXRseUNvbnZlcnRpYmxlPHZvaWQqLCBpbnQqPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfZmFsc2UpOworfQorCisvLyBUZXN0cyB0aGF0IEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUMSwgVDI+Ojp2YWx1ZSBpcyB0cnVlIHdoZW4gVDEgY2FuCisvLyBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBUMi4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc1RydWVXaGVuQ29udmVydGlibGUpIHsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQsIGRvdWJsZT46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8ZG91YmxlLCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCosIHZvaWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQqLCBjb25zdCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxDb252ZXJzaW9uSGVscGVyRGVyaXZlZCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udmVyc2lvbkhlbHBlckJhc2UmPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBDb252ZXJzaW9uSGVscGVyQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uSGVscGVyQmFzZT46OnZhbHVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW1wbGljaXRseUNvbnZlcnRpYmxlPFQxLCBUMj46OnZhbHVlIGlzIGZhbHNlIHdoZW4gVDEKKy8vIGNhbm5vdCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBUMi4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc0ZhbHNlV2hlbk5vdENvbnZlcnRpYmxlKSB7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGRvdWJsZSwgaW50Kj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPHZvaWQqLCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgaW50KiwgaW50Kj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPENvbnZlcnNpb25IZWxwZXJCYXNlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbkhlbHBlckRlcml2ZWQmPjo6dmFsdWUpKTsKK30KKworLy8gVGVzdHMgSXNDb250YWluZXJUZXN0LgorCitjbGFzcyBOb25Db250YWluZXIge307CisKK1RFU1QoSXNDb250YWluZXJUZXN0VGVzdCwgV29ya3NGb3JOb25Db250YWluZXIpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihJc05vdENvbnRhaW5lciksIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8aW50PigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxjaGFyWzVdPigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxOb25Db250YWluZXI+KDApKSk7Cit9CisKK1RFU1QoSXNDb250YWluZXJUZXN0VGVzdCwgV29ya3NGb3JDb250YWluZXIpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihJc0NvbnRhaW5lciksCisgICAgICAgICAgICBzaXplb2YoSXNDb250YWluZXJUZXN0PHN0ZDo6dmVjdG9yPGJvb2w+ID4oMCkpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihJc0NvbnRhaW5lciksCisgICAgICAgICAgICBzaXplb2YoSXNDb250YWluZXJUZXN0PHN0ZDo6bWFwPGludCwgZG91YmxlPiA+KDApKSk7Cit9CisKKy8vIFRlc3RzIEFycmF5RXEoKS4KKworVEVTVChBcnJheUVxVGVzdCwgV29ya3NGb3JEZWdlbmVyYXRlZEFycmF5cykgeworICBFWFBFQ1RfVFJVRShBcnJheUVxKDUsIDVMKSk7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKCdhJywgMCkpOworfQorCitURVNUKEFycmF5RXFUZXN0LCBXb3Jrc0Zvck9uZURpbWVuc2lvbmFsQXJyYXlzKSB7CisgIGNvbnN0IGludCBhW10gPSB7IDAsIDEgfTsKKyAgbG9uZyBiW10gPSB7IDAsIDEgfTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgMiwgYikpOworCisgIGJbMF0gPSAyOworICBFWFBFQ1RfRkFMU0UoQXJyYXlFcShhLCBiKSk7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIDEsIGIpKTsKK30KKworVEVTVChBcnJheUVxVGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbEFycmF5cykgeworICBjb25zdCBjaGFyIGFbXVszXSA9IHsgImhpIiwgImxvIiB9OworICBjb25zdCBjaGFyIGJbXVszXSA9IHsgImhpIiwgImxvIiB9OworICBjb25zdCBjaGFyIGNbXVszXSA9IHsgImhpIiwgImxpIiB9OworCisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYikpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIDIsIGIpKTsKKworICBFWFBFQ1RfRkFMU0UoQXJyYXlFcShhLCBjKSk7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIDIsIGMpKTsKK30KKworLy8gVGVzdHMgQXJyYXlBd2FyZUZpbmQoKS4KKworVEVTVChBcnJheUF3YXJlRmluZFRlc3QsIFdvcmtzRm9yT25lRGltZW5zaW9uYWxBcnJheSkgeworICBjb25zdCBjaGFyIGFbXSA9ICJoZWxsbyI7CisgIEVYUEVDVF9FUShhICsgNCwgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDUsICdvJykpOworICBFWFBFQ1RfRVEoYSArIDUsIEFycmF5QXdhcmVGaW5kKGEsIGEgKyA1LCAneCcpKTsKK30KKworVEVTVChBcnJheUF3YXJlRmluZFRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheSkgeworICBpbnQgYVtdWzJdID0geyB7IDAsIDEgfSwgeyAyLCAzIH0sIHsgNCwgNSB9IH07CisgIGNvbnN0IGludCBiWzJdID0geyAyLCAzIH07CisgIEVYUEVDVF9FUShhICsgMSwgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDMsIGIpKTsKKworICBjb25zdCBpbnQgY1syXSA9IHsgNiwgNyB9OworICBFWFBFQ1RfRVEoYSArIDMsIEFycmF5QXdhcmVGaW5kKGEsIGEgKyAzLCBjKSk7Cit9CisKKy8vIFRlc3RzIENvcHlBcnJheSgpLgorCitURVNUKENvcHlBcnJheVRlc3QsIFdvcmtzRm9yRGVnZW5lcmF0ZWRBcnJheXMpIHsKKyAgaW50IG4gPSAwOworICBDb3B5QXJyYXkoJ2EnLCAmbik7CisgIEVYUEVDVF9FUSgnYScsIG4pOworfQorCitURVNUKENvcHlBcnJheVRlc3QsIFdvcmtzRm9yT25lRGltZW5zaW9uYWxBcnJheXMpIHsKKyAgY29uc3QgY2hhciBhWzNdID0gImhpIjsKKyAgaW50IGJbM107CisjaWZuZGVmIF9fQk9STEFORENfXyAgLy8gQysrQnVpbGRlciBjYW5ub3QgY29tcGlsZSBzb21lIGFycmF5IHNpemUgZGVkdWN0aW9ucy4KKyAgQ29weUFycmF5KGEsICZiKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7CisjZW5kaWYKKworICBpbnQgY1szXTsKKyAgQ29weUFycmF5KGEsIDMsIGMpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGMpKTsKK30KKworVEVTVChDb3B5QXJyYXlUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXlzKSB7CisgIGNvbnN0IGludCBhWzJdWzNdID0geyB7IDAsIDEsIDIgfSwgeyAzLCA0LCA1IH0gfTsKKyAgaW50IGJbMl1bM107CisjaWZuZGVmIF9fQk9STEFORENfXyAgLy8gQysrQnVpbGRlciBjYW5ub3QgY29tcGlsZSBzb21lIGFycmF5IHNpemUgZGVkdWN0aW9ucy4KKyAgQ29weUFycmF5KGEsICZiKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7CisjZW5kaWYKKworICBpbnQgY1syXVszXTsKKyAgQ29weUFycmF5KGEsIDIsIGMpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGMpKTsKK30KKworLy8gVGVzdHMgTmF0aXZlQXJyYXkuCisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBDb25zdHJ1Y3RvckZyb21BcnJheVdvcmtzKSB7CisgIGNvbnN0IGludCBhWzNdID0geyAwLCAxLCAyIH07CisgIE5hdGl2ZUFycmF5PGludD4gbmEoYSwgMywga1JlZmVyZW5jZSk7CisgIEVYUEVDVF9FUSgzVSwgbmEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGEsIG5hLmJlZ2luKCkpOworfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgQ3JlYXRlc0FuZERlbGV0ZXNDb3B5T2ZBcnJheVdoZW5Bc2tlZFRvKSB7CisgIHR5cGVkZWYgaW50IEFycmF5WzJdOworICBBcnJheSogYSA9IG5ldyBBcnJheVsxXTsKKyAgKCphKVswXSA9IDA7CisgICgqYSlbMV0gPSAxOworICBOYXRpdmVBcnJheTxpbnQ+IG5hKCphLCAyLCBrQ29weSk7CisgIEVYUEVDVF9ORSgqYSwgbmEuYmVnaW4oKSk7CisgIGRlbGV0ZVtdIGE7CisgIEVYUEVDVF9FUSgwLCBuYS5iZWdpbigpWzBdKTsKKyAgRVhQRUNUX0VRKDEsIG5hLmJlZ2luKClbMV0pOworCisgIC8vIFdlIHJlbHkgb24gdGhlIGhlYXAgY2hlY2tlciB0byB2ZXJpZnkgdGhhdCBuYSBkZWxldGVzIHRoZSBjb3B5IG9mCisgIC8vIGFycmF5LgorfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgVHlwZU1lbWJlcnNBcmVDb3JyZWN0KSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjaGFyLCBOYXRpdmVBcnJheTxjaGFyPjo6dmFsdWVfdHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludFsyXSwgTmF0aXZlQXJyYXk8aW50WzJdPjo6dmFsdWVfdHlwZT4oKTsKKworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgY2hhciosIE5hdGl2ZUFycmF5PGNoYXI+Ojpjb25zdF9pdGVyYXRvcj4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGJvb2woKilbMl0sIE5hdGl2ZUFycmF5PGJvb2xbMl0+Ojpjb25zdF9pdGVyYXRvcj4oKTsKK30KKworVEVTVChOYXRpdmVBcnJheVRlc3QsIE1ldGhvZHNXb3JrKSB7CisgIGNvbnN0IGludCBhWzNdID0geyAwLCAxLCAyIH07CisgIE5hdGl2ZUFycmF5PGludD4gbmEoYSwgMywga0NvcHkpOworICBBU1NFUlRfRVEoM1UsIG5hLnNpemUoKSk7CisgIEVYUEVDVF9FUSgzLCBuYS5lbmQoKSAtIG5hLmJlZ2luKCkpOworCisgIE5hdGl2ZUFycmF5PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmEuYmVnaW4oKTsKKyAgRVhQRUNUX0VRKDAsICppdCk7CisgICsraXQ7CisgIEVYUEVDVF9FUSgxLCAqaXQpOworICBpdCsrOworICBFWFBFQ1RfRVEoMiwgKml0KTsKKyAgKytpdDsKKyAgRVhQRUNUX0VRKG5hLmVuZCgpLCBpdCk7CisKKyAgRVhQRUNUX1RSVUUobmEgPT0gbmEpOworCisgIE5hdGl2ZUFycmF5PGludD4gbmEyKGEsIDMsIGtSZWZlcmVuY2UpOworICBFWFBFQ1RfVFJVRShuYSA9PSBuYTIpOworCisgIGNvbnN0IGludCBiMVszXSA9IHsgMCwgMSwgMSB9OworICBjb25zdCBpbnQgYjJbNF0gPSB7IDAsIDEsIDIsIDMgfTsKKyAgRVhQRUNUX0ZBTFNFKG5hID09IE5hdGl2ZUFycmF5PGludD4oYjEsIDMsIGtSZWZlcmVuY2UpKTsKKyAgRVhQRUNUX0ZBTFNFKG5hID09IE5hdGl2ZUFycmF5PGludD4oYjIsIDQsIGtDb3B5KSk7Cit9CisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXkpIHsKKyAgY29uc3QgY2hhciBhWzJdWzNdID0geyAiaGkiLCAibG8iIH07CisgIE5hdGl2ZUFycmF5PGNoYXJbM10+IG5hKGEsIDIsIGtSZWZlcmVuY2UpOworICBBU1NFUlRfRVEoMlUsIG5hLnNpemUoKSk7CisgIEVYUEVDVF9FUShhLCBuYS5iZWdpbigpKTsKK30KKworLy8gVGVzdHMgU2tpcFByZWZpeCgpLgorCitURVNUKFNraXBQcmVmaXhUZXN0LCBTa2lwc1doZW5QcmVmaXhNYXRjaGVzKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICJoZWxsbyI7CisKKyAgY29uc3QgY2hhciogcCA9IHN0cjsKKyAgRVhQRUNUX1RSVUUoU2tpcFByZWZpeCgiIiwgJnApKTsKKyAgRVhQRUNUX0VRKHN0ciwgcCk7CisKKyAgcCA9IHN0cjsKKyAgRVhQRUNUX1RSVUUoU2tpcFByZWZpeCgiaGVsbCIsICZwKSk7CisgIEVYUEVDVF9FUShzdHIgKyA0LCBwKTsKK30KKworVEVTVChTa2lwUHJlZml4VGVzdCwgRG9lc05vdFNraXBXaGVuUHJlZml4RG9lc05vdE1hdGNoKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICJ3b3JsZCI7CisKKyAgY29uc3QgY2hhciogcCA9IHN0cjsKKyAgRVhQRUNUX0ZBTFNFKFNraXBQcmVmaXgoIlciLCAmcCkpOworICBFWFBFQ1RfRVEoc3RyLCBwKTsKKworICBwID0gc3RyOworICBFWFBFQ1RfRkFMU0UoU2tpcFByZWZpeCgid29ybGQhIiwgJnApKTsKKyAgRVhQRUNUX0VRKHN0ciwgcCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8uY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxY2VkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYwpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisvLworLy8gZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfIHdyaXRlcyBzb21lIHhtbCB2aWEgVGVzdFByb3BlcnR5IHVzZWQgYnkKKy8vIGd0ZXN0X3htbF9vdXRmaWxlc190ZXN0LnB5CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitjbGFzcyBQcm9wZXJ0eU9uZSA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiU2V0VXBQcm9wIiwgMSk7CisgIH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFJlY29yZFByb3BlcnR5KCJUZWFyRG93blByb3AiLCAxKTsKKyAgfQorfTsKKworVEVTVF9GKFByb3BlcnR5T25lLCBUZXN0U29tZVByb3BlcnRpZXMpIHsKKyAgUmVjb3JkUHJvcGVydHkoIlRlc3RTb21lUHJvcGVydHkiLCAxKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQwMGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfLmNjCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8gd3JpdGVzIHNvbWUgeG1sIHZpYSBUZXN0UHJvcGVydHkgdXNlZCBieQorLy8gZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIFByb3BlcnR5VHdvIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIFJlY29yZFByb3BlcnR5KCJTZXRVcFByb3AiLCAyKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duUHJvcCIsIDIpOworICB9Cit9OworCitURVNUX0YoUHJvcGVydHlUd28sIFRlc3RTb21lUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgiVGVzdFNvbWVQcm9wZXJ0eSIsIDIpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZmU5NDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKQEAgLTAsMCArMSwxMzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgdGhlIGd0ZXN0X3htbF9vdXRwdXQgbW9kdWxlLiIiIgorCitfX2F1dGhvcl9fID0gImtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkiCisKK2ltcG9ydCBvcworZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCitpbXBvcnQgZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMKKworCitHVEVTVF9PVVRQVVRfU1VCRElSID0gInhtbF9vdXRmaWxlcyIKK0dURVNUX09VVFBVVF8xX1RFU1QgPSAiZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfIgorR1RFU1RfT1VUUFVUXzJfVEVTVCA9ICJndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8iCisKK0VYUEVDVEVEX1hNTF8xID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIgbmFtZT0iQWxsVGVzdHMiPgorICA8dGVzdHN1aXRlIG5hbWU9IlByb3BlcnR5T25lIiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUZXN0U29tZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5T25lIiBTZXRVcFByb3A9IjEiIFRlc3RTb21lUHJvcGVydHk9IjEiIFRlYXJEb3duUHJvcD0iMSIgLz4KKyAgPC90ZXN0c3VpdGU+Cis8L3Rlc3RzdWl0ZXM+CisiIiIKKworRVhQRUNURURfWE1MXzIgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHRlc3RzdWl0ZXMgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIiBuYW1lPSJBbGxUZXN0cyI+CisgIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlUd28iIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlRlc3RTb21lUHJvcGVydGllcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iUHJvcGVydHlUd28iIFNldFVwUHJvcD0iMiIgVGVzdFNvbWVQcm9wZXJ0eT0iMiIgVGVhckRvd25Qcm9wPSIyIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KKyIiIgorCisKK2NsYXNzIEdUZXN0WE1MT3V0RmlsZXNUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgorICAiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCBmdW5jdGlvbmFsaXR5LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAjIFdlIHdhbnQgdGhlIHRyYWlsaW5nICcvJyB0aGF0IHRoZSBsYXN0ICIiIHByb3ZpZGVzIGluIG9zLnBhdGguam9pbiwgZm9yCisgICAgIyB0ZWxsaW5nIEdvb2dsZSBUZXN0IHRvIGNyZWF0ZSBhbiBvdXRwdXQgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBzaW5nbGUgZmlsZQorICAgICMgZm9yIHhtbCBvdXRwdXQuCisgICAgc2VsZi5vdXRwdXRfZGlyXyA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX09VVFBVVF9TVUJESVIsICIiKQorICAgIHNlbGYuRGVsZXRlRmlsZXNBbmREaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLkRlbGV0ZUZpbGVzQW5kRGlyKCkKKworICBkZWYgRGVsZXRlRmlsZXNBbmREaXIoc2VsZik6CisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMV9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMl9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3Mucm1kaXIoc2VsZi5vdXRwdXRfZGlyXykKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisKKyAgZGVmIHRlc3RPdXRmaWxlMShzZWxmKToKKyAgICBzZWxmLl9UZXN0T3V0RmlsZShHVEVTVF9PVVRQVVRfMV9URVNULCBFWFBFQ1RFRF9YTUxfMSkKKworICBkZWYgdGVzdE91dGZpbGUyKHNlbGYpOgorICAgIHNlbGYuX1Rlc3RPdXRGaWxlKEdURVNUX09VVFBVVF8yX1RFU1QsIEVYUEVDVEVEX1hNTF8yKQorCisgIGRlZiBfVGVzdE91dEZpbGUoc2VsZiwgdGVzdF9uYW1lLCBleHBlY3RlZF94bWwpOgorICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKHRlc3RfbmFtZSkKKyAgICBjb21tYW5kID0gW2d0ZXN0X3Byb2dfcGF0aCwgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDolcyIgJSBzZWxmLm91dHB1dF9kaXJfXQorICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQorICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKKworICAgICMgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxpYnRvb2wgY2F1c2VzIHRoZSBidWlsdCB0ZXN0IGJpbmFyeSB0byBiZQorICAgICMgICBuYW1lZCBsdC1ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8gaW5zdGVhZCBvZgorICAgICMgICBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8uICBUbyBhY2NvdW50IGZvciB0aGlzIHBvc3NpYmlsbGl0eSwgd2UKKyAgICAjICAgYWxsb3cgYm90aCBuYW1lcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuICBXZSBzaG91bGQgcmVtb3ZlIHRoaXMKKyAgICAjICAgaGFjayB3aGVuIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IHRvb2wgaXMgcmVhZHkuCisgICAgb3V0cHV0X2ZpbGVfbmFtZTEgPSB0ZXN0X25hbWUgKyAiLnhtbCIKKyAgICBvdXRwdXRfZmlsZTEgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyXywgb3V0cHV0X2ZpbGVfbmFtZTEpCisgICAgb3V0cHV0X2ZpbGVfbmFtZTIgPSAnbHQtJyArIG91dHB1dF9maWxlX25hbWUxCisgICAgb3V0cHV0X2ZpbGUyID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpcl8sIG91dHB1dF9maWxlX25hbWUyKQorICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZmlsZShvdXRwdXRfZmlsZTEpIG9yIG9zLnBhdGguaXNmaWxlKG91dHB1dF9maWxlMiksCisgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlMSkKKworICAgIGV4cGVjdGVkID0gbWluaWRvbS5wYXJzZVN0cmluZyhleHBlY3RlZF94bWwpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUxKToKKyAgICAgIGFjdHVhbCA9IG1pbmlkb20ucGFyc2Uob3V0cHV0X2ZpbGUxKQorICAgIGVsc2U6CisgICAgICBhY3R1YWwgPSBtaW5pZG9tLnBhcnNlKG91dHB1dF9maWxlMikKKyAgICBzZWxmLk5vcm1hbGl6ZVhtbChhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIHNlbGYuQXNzZXJ0RXF1aXZhbGVudE5vZGVzKGV4cGVjdGVkLmRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIGV4cGVjdGVkLnVubGluaygpCisgICAgYWN0dWFsLnVubGluaygpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgb3MuZW52aXJvblsiR1RFU1RfU1RBQ0tfVFJBQ0VfREVQVEgiXSA9ICIwIgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdC5weSBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRkNTAzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwyNDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgdGhlIGd0ZXN0X3htbF9vdXRwdXQgbW9kdWxlIiIiCisKK19fYXV0aG9yX18gPSAnZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpJworCitpbXBvcnQgZXJybm8KK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCitpbXBvcnQgZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMKKworCitHVEVTVF9PVVRQVVRfRkxBRyAgICAgICAgID0gIi0tZ3Rlc3Rfb3V0cHV0IgorR1RFU1RfREVGQVVMVF9PVVRQVVRfRklMRSA9ICJ0ZXN0X2RldGFpbC54bWwiCitHVEVTVF9QUk9HUkFNX05BTUUgPSAiZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8iCisKK1NVUFBPUlRTX1NUQUNLX1RSQUNFUyA9IEZhbHNlCisKK2lmIFNVUFBPUlRTX1NUQUNLX1RSQUNFUzoKKyAgU1RBQ0tfVFJBQ0VfVEVNUExBVEUgPSAiXG5TdGFjayB0cmFjZTpcbioiCitlbHNlOgorICBTVEFDS19UUkFDRV9URU1QTEFURSA9ICIiCisKK0VYUEVDVEVEX05PTl9FTVBUWV9YTUwgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHRlc3RzdWl0ZXMgdGVzdHM9IjIzIiBmYWlsdXJlcz0iNCIgZGlzYWJsZWQ9IjIiIGVycm9ycz0iMCIgdGltZT0iKiIgbmFtZT0iQWxsVGVzdHMiPgorICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJTdWNjZWVkcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU3VjY2Vzc2Z1bFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iRmFpbGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRmFpbHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkZhaWxlZFRlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iVmFsdWUgb2Y6IDImI3gwQTtFeHBlY3RlZDogMSIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitWYWx1ZSBvZjogMgorRXhwZWN0ZWQ6IDElKHN0YWNrKXNdXT48L2ZhaWx1cmU+CisgICAgPC90ZXN0Y2FzZT4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iTWl4ZWRSZXN1bHRUZXN0IiB0ZXN0cz0iMyIgZmFpbHVyZXM9IjEiIGRpc2FibGVkPSIxIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJTdWNjZWVkcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTWl4ZWRSZXN1bHRUZXN0Ii8+CisgICAgPHRlc3RjYXNlIG5hbWU9IkZhaWxzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJNaXhlZFJlc3VsdFRlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iVmFsdWUgb2Y6IDImI3gwQTtFeHBlY3RlZDogMSIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitWYWx1ZSBvZjogMgorRXhwZWN0ZWQ6IDElKHN0YWNrKXNdXT48L2ZhaWx1cmU+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJWYWx1ZSBvZjogMyYjeDBBO0V4cGVjdGVkOiAyIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK1ZhbHVlIG9mOiAzCitFeHBlY3RlZDogMiUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJESVNBQkxFRF90ZXN0IiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJNaXhlZFJlc3VsdFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iWG1sUXVvdGluZ1Rlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ik91dHB1dHNDRGF0YSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iWG1sUXVvdGluZ1Rlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iRmFpbGVkJiN4MEE7WE1MIG91dHB1dDogJmx0Oz94bWwgZW5jb2Rpbmc9JnF1b3Q7dXRmLTgmcXVvdDsmZ3Q7Jmx0O3RvcCZndDsmbHQ7IVtDREFUQVtjZGF0YSB0ZXh0XV0mZ3Q7Jmx0Oy90b3AmZ3Q7IiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK0ZhaWxlZAorWE1MIG91dHB1dDogPD94bWwgZW5jb2Rpbmc9InV0Zi04Ij48dG9wPjwhW0NEQVRBW2NkYXRhIHRleHRdXT5dXSZndDs8IVtDREFUQVs8L3RvcD4lKHN0YWNrKXNdXT48L2ZhaWx1cmU+CisgICAgPC90ZXN0Y2FzZT4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iSW52YWxpZENoYXJhY3RlcnNUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjEiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJJbnZhbGlkQ2hhcmFjdGVyc0luTWVzc2FnZSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iSW52YWxpZENoYXJhY3RlcnNUZXN0Ij4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9IkZhaWxlZCYjeDBBO0ludmFsaWQgY2hhcmFjdGVycyBpbiBicmFja2V0cyBbXSIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitGYWlsZWQKK0ludmFsaWQgY2hhcmFjdGVycyBpbiBicmFja2V0cyBbXSUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJEaXNhYmxlZFRlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjEiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IkRJU0FCTEVEX3Rlc3Rfbm90X3J1biIgc3RhdHVzPSJub3RydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iRGlzYWJsZWRUZXN0Ii8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIgdGVzdHM9IjQiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iT25lUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiLz4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSW50VmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5X2ludD0iMSIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUaHJlZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiIGtleV8yPSIyIiBrZXlfMz0iMyIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eVJlY29yZGluZ1Rlc3QiIGtleV8xPSIyIi8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9Ik5vRml4dHVyZVRlc3QiIHRlc3RzPSIzIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJSZWNvcmRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5PSIxIi8+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5X2Zvcl91dGlsaXR5X2ludD0iMSIvPgorICAgICA8dGVzdGNhc2UgbmFtZT0iRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkU3RyaW5nVmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik5vRml4dHVyZVRlc3QiIGtleV9mb3JfdXRpbGl0eV9zdHJpbmc9IjEiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJUeXBlZFRlc3QvMCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJUeXBlZFRlc3QvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iVHlwZWRUZXN0LzEiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iVHlwZWRUZXN0LzEiIC8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlNpbmdsZS9UeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLzAiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTaW5nbGUvVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZS8xIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4iIiIgJSB7J3N0YWNrJzogU1RBQ0tfVFJBQ0VfVEVNUExBVEV9CisKKworRVhQRUNURURfRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIwIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIgbmFtZT0iQWxsVGVzdHMiPgorPC90ZXN0c3VpdGVzPiIiIgorCisKK2NsYXNzIEdUZXN0WE1MT3V0cHV0VW5pdFRlc3QoZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMuR1Rlc3RYTUxUZXN0Q2FzZSk6CisgICIiIgorICBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCBmdW5jdGlvbmFsaXR5LgorICAiIiIKKworICBkZWYgdGVzdE5vbkVtcHR5WG1sT3V0cHV0KHNlbGYpOgorICAgICIiIgorICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYSBub24tZW1wdHkgWE1MIG91dHB1dCwgYW5kCisgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KKyAgICAiIiIKKyAgICBzZWxmLl9UZXN0WG1sT3V0cHV0KEdURVNUX1BST0dSQU1fTkFNRSwgRVhQRUNURURfTk9OX0VNUFRZX1hNTCwgMSkKKworICBkZWYgdGVzdEVtcHR5WG1sT3V0cHV0KHNlbGYpOgorICAgICIiIgorICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kCisgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KKyAgICAiIiIKKworICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoImd0ZXN0X25vX3Rlc3RfdW5pdHRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfRU1QVFlfWE1MLCAwKQorCisgIGRlZiB0ZXN0RGVmYXVsdE91dHB1dEZpbGUoc2VsZik6CisgICAgIiIiCisgICAgQ29uZmlybXMgdGhhdCBHb29nbGUgVGVzdCBwcm9kdWNlcyBhbiBYTUwgb3V0cHV0IGZpbGUgd2l0aCB0aGUgZXhwZWN0ZWQKKyAgICBkZWZhdWx0IG5hbWUgaWYgbm8gbmFtZSBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgICAiIiIKKyAgICBvdXRwdXRfZmlsZSA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9ERUZBVUxUX09VVFBVVF9GSUxFKQorICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKAorICAgICAgICAiZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdCIpCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG91dHB1dF9maWxlKQorICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgIHJhaXNlCisKKyAgICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgICAgICBbZ3Rlc3RfcHJvZ19wYXRoLCAiJXM9eG1sIiAlIEdURVNUX09VVFBVVF9GTEFHXSwKKyAgICAgICAgd29ya2luZ19kaXI9Z3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCkpCisgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIHAuZXhpdF9jb2RlKQorICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZmlsZShvdXRwdXRfZmlsZSkpCisKKyAgZGVmIHRlc3RTdXBwcmVzc2VkWG1sT3V0cHV0KHNlbGYpOgorICAgICIiIgorICAgIFRlc3RzIHRoYXQgbm8gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkIGlmIHRoZSBkZWZhdWx0IFhNTCBsaXN0ZW5lciBpcworICAgIHNodXQgZG93biBiZWZvcmUgUlVOX0FMTF9URVNUUyBpcyBpbnZva2VkLgorICAgICIiIgorCisgICAgeG1sX3BhdGggPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUFJPR1JBTV9OQU1FICsgIm91dC54bWwiKQorICAgIGlmIG9zLnBhdGguaXNmaWxlKHhtbF9wYXRoKToKKyAgICAgIG9zLnJlbW92ZSh4bWxfcGF0aCkKKworICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKEdURVNUX1BST0dSQU1fTkFNRSkKKworICAgIGNvbW1hbmQgPSBbZ3Rlc3RfcHJvZ19wYXRoLAorICAgICAgICAgICAgICAgIiVzPXhtbDolcyIgJSAoR1RFU1RfT1VUUFVUX0ZMQUcsIHhtbF9wYXRoKSwKKyAgICAgICAgICAgICAgICItLXNodXRfZG93bl94bWwiXQorICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKKyAgICBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsOgorICAgICAgc2VsZi5hc3NlcnRfKEZhbHNlLAorICAgICAgICAgICAgICAgICAgICIlcyB3YXMga2lsbGVkIGJ5IHNpZ25hbCAlZCIgJSAoZ3Rlc3RfcHJvZ19uYW1lLCBwLnNpZ25hbCkpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIHAuZXhpdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZXhpdGVkIHdpdGggY29kZSAlcywgd2hpY2ggZG9lc24ndCBtYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGV4cGVjdGVkIGV4aXQgY29kZSAlcy4iCisgICAgICAgICAgICAgICAgICAgICAgICAlIChjb21tYW5kLCBwLmV4aXRfY29kZSwgMSkpCisKKyAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguaXNmaWxlKHhtbF9wYXRoKSkKKworCisgIGRlZiBfVGVzdFhtbE91dHB1dChzZWxmLCBndGVzdF9wcm9nX25hbWUsIGV4cGVjdGVkX3htbCwgZXhwZWN0ZWRfZXhpdF9jb2RlKToKKyAgICAiIiIKKyAgICBBc3NlcnRzIHRoYXQgdGhlIFhNTCBkb2N1bWVudCBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbQorICAgIGd0ZXN0X3Byb2dfbmFtZSBtYXRjaGVzIGV4cGVjdGVkX3htbCwgYSBzdHJpbmcgY29udGFpbmluZyBhbm90aGVyCisgICAgWE1MIGRvY3VtZW50LiAgRnVydGhlcm1vcmUsIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIG11c3QgYmUKKyAgICBleHBlY3RlZF9leGl0X2NvZGUuCisgICAgIiIiCisgICAgeG1sX3BhdGggPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfcHJvZ19uYW1lICsgIm91dC54bWwiKQorICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKGd0ZXN0X3Byb2dfbmFtZSkKKworICAgIGNvbW1hbmQgPSBbZ3Rlc3RfcHJvZ19wYXRoLCAiJXM9eG1sOiVzIiAlIChHVEVTVF9PVVRQVVRfRkxBRywgeG1sX3BhdGgpXQorICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKKyAgICBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsOgorICAgICAgc2VsZi5hc3NlcnRfKEZhbHNlLAorICAgICAgICAgICAgICAgICAgICIlcyB3YXMga2lsbGVkIGJ5IHNpZ25hbCAlZCIgJSAoZ3Rlc3RfcHJvZ19uYW1lLCBwLnNpZ25hbCkpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2V4aXRfY29kZSwgcC5leGl0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleGl0ZWQgd2l0aCBjb2RlICVzLCB3aGljaCBkb2Vzbid0IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZXhwZWN0ZWQgZXhpdCBjb2RlICVzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbW1hbmQsIHAuZXhpdF9jb2RlLCBleHBlY3RlZF9leGl0X2NvZGUpKQorCisgICAgZXhwZWN0ZWQgPSBtaW5pZG9tLnBhcnNlU3RyaW5nKGV4cGVjdGVkX3htbCkKKyAgICBhY3R1YWwgICA9IG1pbmlkb20ucGFyc2UoeG1sX3BhdGgpCisgICAgc2VsZi5Ob3JtYWxpemVYbWwoYWN0dWFsLmRvY3VtZW50RWxlbWVudCkKKyAgICBzZWxmLkFzc2VydEVxdWl2YWxlbnROb2RlcyhleHBlY3RlZC5kb2N1bWVudEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsLmRvY3VtZW50RWxlbWVudCkKKyAgICBleHBlY3RlZC51bmxpbmsoKQorICAgIGFjdHVhbCAgLnVubGluaygpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBvcy5lbnZpcm9uWydHVEVTVF9TVEFDS19UUkFDRV9ERVBUSCddID0gJzEnCisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MWE4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IFhNTCBvdXRwdXQuCisvLworLy8gQSB1c2VyIGNhbiBzcGVjaWZ5IFhNTCBvdXRwdXQgaW4gYSBHb29nbGUgVGVzdCBwcm9ncmFtIHRvIHJ1biB2aWEKKy8vIGVpdGhlciB0aGUgR1RFU1RfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZSAtLWd0ZXN0X291dHB1dAorLy8gZmxhZy4gIFRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZyBzdWNoIGZ1bmN0aW9uYWxpdHkuCisvLworLy8gVGhpcyBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIERvbid0IHJ1biBpdAorLy8gZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUeXBlczsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzOworCitjbGFzcyBTdWNjZXNzZnVsVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RFU1RfRihTdWNjZXNzZnVsVGVzdCwgU3VjY2VlZHMpIHsKKyAgU1VDQ0VFRCgpIDw8ICJUaGlzIGlzIGEgc3VjY2Vzcy4iOworICBBU1NFUlRfRVEoMSwgMSk7Cit9CisKK2NsYXNzIEZhaWxlZFRlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitURVNUX0YoRmFpbGVkVGVzdCwgRmFpbHMpIHsKKyAgQVNTRVJUX0VRKDEsIDIpOworfQorCitjbGFzcyBEaXNhYmxlZFRlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitURVNUX0YoRGlzYWJsZWRUZXN0LCBESVNBQkxFRF90ZXN0X25vdF9ydW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4iOworfQorCitURVNUKE1peGVkUmVzdWx0VGVzdCwgU3VjY2VlZHMpIHsKKyAgRVhQRUNUX0VRKDEsIDEpOworICBBU1NFUlRfRVEoMSwgMSk7Cit9CisKK1RFU1QoTWl4ZWRSZXN1bHRUZXN0LCBGYWlscykgeworICBFWFBFQ1RfRVEoMSwgMik7CisgIEFTU0VSVF9FUSgyLCAzKTsKK30KKworVEVTVChNaXhlZFJlc3VsdFRlc3QsIERJU0FCTEVEX3Rlc3QpIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4iOworfQorCitURVNUKFhtbFF1b3RpbmdUZXN0LCBPdXRwdXRzQ0RhdGEpIHsKKyAgRkFJTCgpIDw8ICJYTUwgb3V0cHV0OiAiCisgICAgICAgICAgICAiPD94bWwgZW5jb2Rpbmc9XCJ1dGYtOFwiPjx0b3A+PCFbQ0RBVEFbY2RhdGEgdGV4dF1dPjwvdG9wPiI7Cit9CisKKy8vIEhlbHBzIHRvIHRlc3QgdGhhdCBpbnZhbGlkIGNoYXJhY3RlcnMgcHJvZHVjZWQgYnkgdGVzdCBjb2RlIGRvIG5vdCBtYWtlCisvLyBpdCBpbnRvIHRoZSBYTUwgZmlsZS4KK1RFU1QoSW52YWxpZENoYXJhY3RlcnNUZXN0LCBJbnZhbGlkQ2hhcmFjdGVyc0luTWVzc2FnZSkgeworICBGQUlMKCkgPDwgIkludmFsaWQgY2hhcmFjdGVycyBpbiBicmFja2V0cyBbXHgxXHgyXSI7Cit9CisKK2NsYXNzIFByb3BlcnR5UmVjb3JkaW5nVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIE9uZVByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7Cit9CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIEludFZhbHVlZFByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfaW50IiwgMSk7Cit9CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIFRocmVlUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzIiLCAiMiIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzMiLCAiMyIpOworfQorCitURVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlKSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIyIik7Cit9CisKK1RFU1QoTm9GaXh0dXJlVGVzdCwgUmVjb3JkUHJvcGVydHkpIHsKKyAgUmVjb3JkUHJvcGVydHkoImtleSIsICIxIik7Cit9CisKK3ZvaWQgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkUHJvcGVydHkoY29uc3QgY2hhcioga2V5LCBpbnQgdmFsdWUpIHsKKyAgdGVzdGluZzo6VGVzdDo6UmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkUHJvcGVydHkoY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSkgeworICB0ZXN0aW5nOjpUZXN0OjpSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKK30KKworVEVTVChOb0ZpeHR1cmVUZXN0LCBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSkgeworICBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRQcm9wZXJ0eSgia2V5X2Zvcl91dGlsaXR5X2ludCIsIDEpOworfQorCitURVNUKE5vRml4dHVyZVRlc3QsIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFN0cmluZ1ZhbHVlZFByb3BlcnR5KSB7CisgIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KCJrZXlfZm9yX3V0aWxpdHlfc3RyaW5nIiwgIjEiKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgaXMgb3V0cHV0IGluIHRoZSAndmFsdWVfcGFyYW0nCisvLyBYTUwgYXR0cmlidXRlIGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorY2xhc3MgVmFsdWVQYXJhbVRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBIYXNWYWx1ZVBhcmFtQXR0cmlidXRlKSB7fQorVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlKSB7fQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2luZ2xlLCBWYWx1ZVBhcmFtVGVzdCwgVmFsdWVzKDMzLCA0MikpOworCisvLyBWZXJpZmllcyB0aGF0IHRoZSB0eXBlIHBhcmFtZXRlciBuYW1lIGlzIG91dHB1dCBpbiB0aGUgJ3R5cGVfcGFyYW0nCisvLyBYTUwgYXR0cmlidXRlIGZvciB0eXBlZCB0ZXN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKK3R5cGVkZWYgVHlwZXM8aW50LCBsb25nPiBUeXBlZFRlc3RUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QsIFR5cGVkVGVzdFR5cGVzKTsKK1RZUEVEX1RFU1QoVHlwZWRUZXN0LCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpIHt9CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUgaXMgb3V0cHV0IGluIHRoZSAndHlwZV9wYXJhbScKKy8vIFhNTCBhdHRyaWJ1dGUgZm9yIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIDogcHVibGljIFRlc3Qge307CitUWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlKTsKK1RZUEVEX1RFU1RfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpIHt9CitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpOwordHlwZWRlZiBUeXBlczxpbnQsIGxvbmc+IFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2VUeXBlczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFNpbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlVHlwZXMpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi0tc2h1dF9kb3duX3htbCIpID09IDApIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKKyAgICBkZWxldGUgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpKTsKKyAgfQorICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjU1YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkKQEAgLTAsMCArMSwxNzkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCB1dGlsaXRpZXMgZm9yIGd0ZXN0X3htbF9vdXRwdXQiIiIKKworX19hdXRob3JfXyA9ICdlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSknCisKK2ltcG9ydCByZQorZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworR1RFU1RfT1VUUFVUX0ZMQUcgICAgICAgICA9ICItLWd0ZXN0X291dHB1dCIKK0dURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSAidGVzdF9kZXRhaWwueG1sIgorCitjbGFzcyBHVGVzdFhNTFRlc3RDYXNlKGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiIKKyAgQmFzZSBjbGFzcyBmb3IgdGVzdHMgb2YgR29vZ2xlIFRlc3QncyBYTUwgb3V0cHV0IGZ1bmN0aW9uYWxpdHkuCisgICIiIgorCisKKyAgZGVmIEFzc2VydEVxdWl2YWxlbnROb2RlcyhzZWxmLCBleHBlY3RlZF9ub2RlLCBhY3R1YWxfbm9kZSk6CisgICAgIiIiCisgICAgQXNzZXJ0cyB0aGF0IGFjdHVhbF9ub2RlIChhIERPTSBub2RlIG9iamVjdCkgaXMgZXF1aXZhbGVudCB0bworICAgIGV4cGVjdGVkX25vZGUgKGFub3RoZXIgRE9NIG5vZGUgb2JqZWN0KSwgaW4gdGhhdCBlaXRoZXIgYm90aCBvZgorICAgIHRoZW0gYXJlIENEQVRBIG5vZGVzIGFuZCBoYXZlIHRoZSBzYW1lIHZhbHVlLCBvciBib3RoIGFyZSBET00KKyAgICBlbGVtZW50cyBhbmQgYWN0dWFsX25vZGUgbWVldHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICogIEl0IGhhcyB0aGUgc2FtZSB0YWcgbmFtZSBhcyBleHBlY3RlZF9ub2RlLgorICAgICogIEl0IGhhcyB0aGUgc2FtZSBzZXQgb2YgYXR0cmlidXRlcyBhcyBleHBlY3RlZF9ub2RlLCBlYWNoIHdpdGgKKyAgICAgICB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgZXhwZWN0ZWRfbm9kZS4KKyAgICAgICBFeGNlcHRpb25zIGFyZSBhbnkgYXR0cmlidXRlIG5hbWVkICJ0aW1lIiwgd2hpY2ggbmVlZHMgb25seSBiZQorICAgICAgIGNvbnZlcnRpYmxlIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCBhbnkgYXR0cmlidXRlIG5hbWVkCisgICAgICAgInR5cGVfcGFyYW0iIHdoaWNoIG9ubHkgaGFzIHRvIGJlIG5vbi1lbXB0eS4KKyAgICAqICBJdCBoYXMgYW4gZXF1aXZhbGVudCBzZXQgb2YgY2hpbGQgbm9kZXMgKGluY2x1ZGluZyBlbGVtZW50cyBhbmQKKyAgICAgICBDREFUQSBzZWN0aW9ucykgYXMgZXhwZWN0ZWRfbm9kZS4gIE5vdGUgdGhhdCB3ZSBpZ25vcmUgdGhlCisgICAgICAgb3JkZXIgb2YgdGhlIGNoaWxkcmVuIGFzIHRoZXkgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGluIGFueQorICAgICAgIHBhcnRpY3VsYXIgb3JkZXIuCisgICAgIiIiCisKKyAgICBpZiBleHBlY3RlZF9ub2RlLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5DREFUQV9TRUNUSU9OX05PREUsIGFjdHVhbF9ub2RlLm5vZGVUeXBlKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfbm9kZS5ub2RlVmFsdWUsIGFjdHVhbF9ub2RlLm5vZGVWYWx1ZSkKKyAgICAgIHJldHVybgorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIGFjdHVhbF9ub2RlLm5vZGVUeXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vZGUuRUxFTUVOVF9OT0RFLCBleHBlY3RlZF9ub2RlLm5vZGVUeXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX25vZGUudGFnTmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSkKKworICAgIGV4cGVjdGVkX2F0dHJpYnV0ZXMgPSBleHBlY3RlZF9ub2RlLmF0dHJpYnV0ZXMKKyAgICBhY3R1YWxfYXR0cmlidXRlcyAgID0gYWN0dWFsX25vZGUgIC5hdHRyaWJ1dGVzCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIGV4cGVjdGVkX2F0dHJpYnV0ZXMubGVuZ3RoLCBhY3R1YWxfYXR0cmlidXRlcy5sZW5ndGgsCisgICAgICAgICJhdHRyaWJ1dGUgbnVtYmVycyBkaWZmZXIgaW4gZWxlbWVudCAiICsgYWN0dWFsX25vZGUudGFnTmFtZSkKKyAgICBmb3IgaSBpbiByYW5nZShleHBlY3RlZF9hdHRyaWJ1dGVzLmxlbmd0aCk6CisgICAgICBleHBlY3RlZF9hdHRyID0gZXhwZWN0ZWRfYXR0cmlidXRlcy5pdGVtKGkpCisgICAgICBhY3R1YWxfYXR0ciAgID0gYWN0dWFsX2F0dHJpYnV0ZXMuZ2V0KGV4cGVjdGVkX2F0dHIubmFtZSkKKyAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICBhY3R1YWxfYXR0ciBpcyBub3QgTm9uZSwKKyAgICAgICAgICAiZXhwZWN0ZWQgYXR0cmlidXRlICVzIG5vdCBmb3VuZCBpbiBlbGVtZW50ICVzIiAlCisgICAgICAgICAgKGV4cGVjdGVkX2F0dHIubmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSkpCisgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF9hdHRyLnZhbHVlLCBhY3R1YWxfYXR0ci52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdmFsdWVzIG9mIGF0dHJpYnV0ZSAlcyBpbiBlbGVtZW50ICVzIGRpZmZlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdGVkX2F0dHIubmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSkpCisKKyAgICBleHBlY3RlZF9jaGlsZHJlbiA9IHNlbGYuX0dldENoaWxkcmVuKGV4cGVjdGVkX25vZGUpCisgICAgYWN0dWFsX2NoaWxkcmVuID0gc2VsZi5fR2V0Q2hpbGRyZW4oYWN0dWFsX25vZGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIGxlbihleHBlY3RlZF9jaGlsZHJlbiksIGxlbihhY3R1YWxfY2hpbGRyZW4pLAorICAgICAgICAibnVtYmVyIG9mIGNoaWxkIGVsZW1lbnRzIGRpZmZlciBpbiBlbGVtZW50ICIgKyBhY3R1YWxfbm9kZS50YWdOYW1lKQorICAgIGZvciBjaGlsZF9pZCwgY2hpbGQgaW4gZXhwZWN0ZWRfY2hpbGRyZW4uaXRlcml0ZW1zKCk6CisgICAgICBzZWxmLmFzc2VydF8oY2hpbGRfaWQgaW4gYWN0dWFsX2NoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgICc8JXM+IGlzIG5vdCBpbiA8JXM+IChpbiBlbGVtZW50ICVzKScgJQorICAgICAgICAgICAgICAgICAgIChjaGlsZF9pZCwgYWN0dWFsX2NoaWxkcmVuLCBhY3R1YWxfbm9kZS50YWdOYW1lKSkKKyAgICAgIHNlbGYuQXNzZXJ0RXF1aXZhbGVudE5vZGVzKGNoaWxkLCBhY3R1YWxfY2hpbGRyZW5bY2hpbGRfaWRdKQorCisgIGlkZW50aWZ5aW5nX2F0dHJpYnV0ZSA9IHsKKyAgICAidGVzdHN1aXRlcyI6ICJuYW1lIiwKKyAgICAidGVzdHN1aXRlIjogIm5hbWUiLAorICAgICJ0ZXN0Y2FzZSI6ICAibmFtZSIsCisgICAgImZhaWx1cmUiOiAgICJtZXNzYWdlIiwKKyAgICB9CisKKyAgZGVmIF9HZXRDaGlsZHJlbihzZWxmLCBlbGVtZW50KToKKyAgICAiIiIKKyAgICBGZXRjaGVzIGFsbCBvZiB0aGUgY2hpbGQgbm9kZXMgb2YgZWxlbWVudCwgYSBET00gRWxlbWVudCBvYmplY3QuCisgICAgUmV0dXJucyB0aGVtIGFzIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBJRHMgb2YgdGhlCisgICAgY2hpbGRyZW4uICBGb3IgPHRlc3RzdWl0ZXM+LCA8dGVzdHN1aXRlPiBhbmQgPHRlc3RjYXNlPiBlbGVtZW50cywgdGhlIElECisgICAgaXMgdGhlIHZhbHVlIG9mIHRoZWlyICJuYW1lIiBhdHRyaWJ1dGU7IGZvciA8ZmFpbHVyZT4gZWxlbWVudHMsIGl0IGlzCisgICAgdGhlIHZhbHVlIG9mIHRoZSAibWVzc2FnZSIgYXR0cmlidXRlOyBDREFUQSBzZWN0aW9ucyBhbmQgbm9uLXdoaXRlc3BhY2UKKyAgICB0ZXh0IG5vZGVzIGFyZSBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSBDREFUQSBzZWN0aW9uIHdpdGggSUQKKyAgICAiZGV0YWlsIi4gIEFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgYW55IGVsZW1lbnQgb3RoZXIgdGhhbiB0aGUgYWJvdmUKKyAgICBmb3VyIGlzIGVuY291bnRlcmVkLCBpZiB0d28gY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBpZGVudGlmeWluZworICAgIGF0dHJpYnV0ZXMgYXJlIGVuY291bnRlcmVkLCBvciBpZiBhbnkgb3RoZXIgdHlwZSBvZiBub2RlIGlzIGVuY291bnRlcmVkLgorICAgICIiIgorCisgICAgY2hpbGRyZW4gPSB7fQorICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoaWxkLnRhZ05hbWUgaW4gc2VsZi5pZGVudGlmeWluZ19hdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAiRW5jb3VudGVyZWQgdW5rbm93biBlbGVtZW50IDwlcz4iICUgY2hpbGQudGFnTmFtZSkKKyAgICAgICAgY2hpbGRJRCA9IGNoaWxkLmdldEF0dHJpYnV0ZShzZWxmLmlkZW50aWZ5aW5nX2F0dHJpYnV0ZVtjaGlsZC50YWdOYW1lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoaWxkSUQgbm90IGluIGNoaWxkcmVuKQorICAgICAgICBjaGlsZHJlbltjaGlsZElEXSA9IGNoaWxkCisgICAgICBlbGlmIGNoaWxkLm5vZGVUeXBlIGluIFtOb2RlLlRFWFRfTk9ERSwgTm9kZS5DREFUQV9TRUNUSU9OX05PREVdOgorICAgICAgICBpZiAiZGV0YWlsIiBub3QgaW4gY2hpbGRyZW46CisgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIG9yCisgICAgICAgICAgICAgIG5vdCBjaGlsZC5ub2RlVmFsdWUuaXNzcGFjZSgpKToKKyAgICAgICAgICAgIGNoaWxkcmVuWyJkZXRhaWwiXSA9IGNoaWxkLm93bmVyRG9jdW1lbnQuY3JlYXRlQ0RBVEFTZWN0aW9uKAorICAgICAgICAgICAgICAgIGNoaWxkLm5vZGVWYWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBjaGlsZHJlblsiZGV0YWlsIl0ubm9kZVZhbHVlICs9IGNoaWxkLm5vZGVWYWx1ZQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5mYWlsKCJFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIG5vZGUgdHlwZSAlZCIgJSBjaGlsZC5ub2RlVHlwZSkKKyAgICByZXR1cm4gY2hpbGRyZW4KKworICBkZWYgTm9ybWFsaXplWG1sKHNlbGYsIGVsZW1lbnQpOgorICAgICIiIgorICAgIE5vcm1hbGl6ZXMgR29vZ2xlIFRlc3QncyBYTUwgb3V0cHV0IHRvIGVsaW1pbmF0ZSByZWZlcmVuY2VzIHRvIHRyYW5zaWVudAorICAgIGluZm9ybWF0aW9uIHRoYXQgbWF5IGNoYW5nZSBmcm9tIHJ1biB0byBydW4uCisKKyAgICAqICBUaGUgInRpbWUiIGF0dHJpYnV0ZSBvZiA8dGVzdHN1aXRlcz4sIDx0ZXN0c3VpdGU+IGFuZCA8dGVzdGNhc2U+CisgICAgICAgZWxlbWVudHMgaXMgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBhc3RlcmlzaywgaWYgaXQgY29udGFpbnMKKyAgICAgICBvbmx5IGRpZ2l0IGNoYXJhY3RlcnMuCisgICAgKiAgVGhlICJ0eXBlX3BhcmFtIiBhdHRyaWJ1dGUgb2YgPHRlc3RjYXNlPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEKKyAgICAgICBzaW5nbGUgYXN0ZXJpc2sgKGlmIGl0IHNuIG5vbi1lbXB0eSkgYXMgaXQgaXMgdGhlIHR5cGUgbmFtZSByZXR1cm5lZAorICAgICAgIGJ5IHRoZSBjb21waWxlciBhbmQgaXMgcGxhdGZvcm0gZGVwZW5kZW50LgorICAgICogIFRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBpbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgIm1lc3NhZ2UiCisgICAgICAgYXR0cmlidXRlIG9mIDxmYWlsdXJlPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIGFzdGVyaXNrLgorICAgICogIFRoZSBkaXJlY3RvcnkgbmFtZXMgaW4gZmlsZSBwYXRocyBhcmUgcmVtb3ZlZC4KKyAgICAqICBUaGUgc3RhY2sgdHJhY2VzIGFyZSByZW1vdmVkLgorICAgICIiIgorCisgICAgaWYgZWxlbWVudC50YWdOYW1lIGluICgidGVzdHN1aXRlcyIsICJ0ZXN0c3VpdGUiLCAidGVzdGNhc2UiKToKKyAgICAgIHRpbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoInRpbWUiKQorICAgICAgdGltZS52YWx1ZSA9IHJlLnN1YihyIl5cZCsoXC5cZCspPyQiLCAiKiIsIHRpbWUudmFsdWUpCisgICAgICB0eXBlX3BhcmFtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJ0eXBlX3BhcmFtIikKKyAgICAgIGlmIHR5cGVfcGFyYW0gYW5kIHR5cGVfcGFyYW0udmFsdWU6CisgICAgICAgIHR5cGVfcGFyYW0udmFsdWUgPSAiKiIKKyAgICBlbGlmIGVsZW1lbnQudGFnTmFtZSA9PSAiZmFpbHVyZSI6CisgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudC5jaGlsZE5vZGVzOgorICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKKyAgICAgICAgICAjIFJlbW92ZXMgdGhlIHNvdXJjZSBsaW5lIG51bWJlci4KKyAgICAgICAgICBjZGF0YSA9IHJlLnN1YihyIl4uKlsvXFxdKC4qOilcZCtcbiIsICJcXDEqXG4iLCBjaGlsZC5ub2RlVmFsdWUpCisgICAgICAgICAgIyBSZW1vdmVzIHRoZSBhY3R1YWwgc3RhY2sgdHJhY2UuCisgICAgICAgICAgY2hpbGQubm9kZVZhbHVlID0gcmUuc3ViKHIiXG5TdGFjayB0cmFjZTpcbigufFxuKSoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY2RhdGEpCisgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKKyAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICBzZWxmLk5vcm1hbGl6ZVhtbChjaGlsZCkKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L3Byb2R1Y3Rpb24uY2MgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9wcm9kdWN0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGE0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9wcm9kdWN0aW9uLmNjCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhpcyBpcyBwYXJ0IG9mIHRoZSB1bml0IHRlc3QgZm9yIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oLgorCisjaW5jbHVkZSAicHJvZHVjdGlvbi5oIgorCitQcml2YXRlQ29kZTo6UHJpdmF0ZUNvZGUoKSA6IHhfKDApIHt9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9wcm9kdWN0aW9uLmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvdGVzdC9wcm9kdWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy90ZXN0L3Byb2R1Y3Rpb24uaApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgaXMgcGFydCBvZiB0aGUgdW5pdCB0ZXN0IGZvciBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaC4KKworI2lmbmRlZiBHVEVTVF9URVNUX1BST0RVQ1RJT05fSF8KKyNkZWZpbmUgR1RFU1RfVEVTVF9QUk9EVUNUSU9OX0hfCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdF9wcm9kLmgiCisKK2NsYXNzIFByaXZhdGVDb2RlIHsKKyBwdWJsaWM6CisgIC8vIERlY2xhcmVzIGEgZnJpZW5kIHRlc3QgdGhhdCBkb2VzIG5vdCB1c2UgYSBmaXh0dXJlLgorICBGUklFTkRfVEVTVChQcml2YXRlQ29kZVRlc3QsIENhbkFjY2Vzc1ByaXZhdGVNZW1iZXJzKTsKKworICAvLyBEZWNsYXJlcyBhIGZyaWVuZCB0ZXN0IHRoYXQgdXNlcyBhIGZpeHR1cmUuCisgIEZSSUVORF9URVNUKFByaXZhdGVDb2RlRml4dHVyZVRlc3QsIENhbkFjY2Vzc1ByaXZhdGVNZW1iZXJzKTsKKworICBQcml2YXRlQ29kZSgpOworCisgIGludCB4KCkgY29uc3QgeyByZXR1cm4geF87IH0KKyBwcml2YXRlOgorICB2b2lkIHNldF94KGludCBhbl94KSB7IHhfID0gYW5feDsgfQorICBpbnQgeF87Cit9OworCisjZW5kaWYgIC8vIEdURVNUX1RFU1RfUFJPRFVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY4MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcKQEAgLTAsMCArMSwzMCBAQAorLy8KKy8vICBEZWJ1Z1Byb2plY3QueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIERlYnVnIENvbmZpZ3VyYXRpb24gcHJvamVjdCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yayBhbmQKKy8vICBleGFtcGxlcy4gSXQgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlByb2plY3QiIGluZm8KKy8vICBkaWFsb2cuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKyNpbmNsdWRlICJHZW5lcmFsLnhjY29uZmlnIgorCisvLyBObyBvcHRpbWl6YXRpb24KK0dDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwCisKKy8vIERlcGxveW1lbnQgcG9zdHByb2Nlc3NpbmcgaXMgd2hhdCB0cmlnZ2VycyBYY29kZSB0byBzdHJpcCwgdHVybiBpdCBvZmYKK0RFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBOTworCisvLyBEZWFkIGNvZGUgc3RyaXBwaW5nIG9mZgorREVBRF9DT0RFX1NUUklQUElORyA9IE5PCisKKy8vIERlYnVnIHN5bWJvbHMgc2hvdWxkIGJlIG9uIG9idmlvdXNseQorR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTCisKKy8vIERlZmluZSB0aGUgREVCVUcgbWFjcm8gaW4gYWxsIGRlYnVnIGJ1aWxkcworT1RIRVJfQ0ZMQUdTID0gJChPVEhFUl9DRkxBR1MpIC1EREVCVUc9MQorCisvLyBUaGVzZSBhcmUgdHVybmVkIG9mZiB0byBhdm9pZCBTVEwgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBjbGllbnQgY29kZQorLy8gLy8gVHVybnMgb24gc3BlY2lhbCBDKysgU1RMIGNoZWNrcyB0byAiZW5jb3VyYWdlIiBnb29kIFNUTCB1c2UKKy8vIEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMpIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDIF9HTElCQ1hYX0RFQlVHIF9HTElCQ1BQX0NPTkNFUFRfQ0hFQ0tTCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1N2IxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACisvLworLy8gIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgRnJhbWV3b3JrIHRhcmdldCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yayBhbmQgZXhhbXBsZXMuIEl0CisvLyAgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlRhcmdldCIgaW5mbyBkaWFsb2cuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKy8vIER5bmFtaWMgbGlicyBuZWVkIHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50CitHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTworCisvLyBEeW5hbWljIGxpYnMgc2hvdWxkIG5vdCBoYXZlIHRoZWlyIGV4dGVybmFsIHN5bWJvbHMgc3RyaXBwZWQuCitTVFJJUF9TVFlMRSA9IG5vbi1nbG9iYWwKKworLy8gTGV0IHRoZSB1c2VyIGluc3RhbGwgYnkgc3BlY2lmeWluZyB0aGUgJERTVFJPT1Qgd2l0aCB4Y29kZWJ1aWxkCitTS0lQX0lOU1RBTEwgPSBOTwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2UzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcKQEAgLTAsMCArMSw0MSBAQAorLy8KKy8vICBHZW5lcmFsLnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBHZW5lcmFsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kCisvLyAgZXhhbXBsZXMuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKy8vIEJ1aWxkIGZvciBQUEMgYW5kIEludGVsLCAzMi0gYW5kIDY0LWJpdAorQVJDSFMgPSBpMzg2IHg4Nl82NCBwcGMgcHBjNjQKKworLy8gWmVyb2xpbmsgcHJldmVudHMgbGluayB3YXJuaW5ncyBzbyB0dXJuIGl0IG9mZgorWkVST19MSU5LID0gTk8KKworLy8gUHJlYmluZGluZyBjb25zaWRlcmVkIHVuaGVscGZ1bCBpbiAxMC4zIGFuZCBsYXRlcgorUFJFQklORElORyA9IE5PCisKKy8vIFN0cmljdGVzdCB3YXJuaW5nIHBvbGljeQorV0FSTklOR19DRkxBR1MgPSAtV2FsbCAtV2Vycm9yIC1XZW5kaWYtbGFiZWxzIC1XbmV3bGluZS1lb2YgLVduby1zaWduLWNvbXBhcmUgLVdzaGFkb3cKKworLy8gV29yayBhcm91bmQgWGNvZGUgYnVncyBieSB1c2luZyBleHRlcm5hbCBzdHJpcC4gU2VlOgorLy8gaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9YY29kZS11c2Vycy8yMDA2L0ZlYi9tc2cwMDA1MC5odG1sCitTRVBBUkFURV9TVFJJUCA9IFlFUworCisvLyBGb3JjZSBDOTkgZGlhbGVjdAorR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBjOTkKKworLy8gbm90IHN1cmUgd2h5IGFwcGxlIGRlZmF1bHRzIHRoaXMgb24sIGJ1dCBpdCdzIHByZXR0eSByaXNreQorQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk8KKworLy8gVHVybiBvbiBwb3NpdGlvbiBkZXBlbmRlbnQgY29kZSBmb3IgbW9zdCBjYXNlcyAob3ZlcnJpZGRlbiB3aGVyZSBhcHByb3ByaWF0ZSkKK0dDQ19EWU5BTUlDX05PX1BJQyA9IFlFUworCisvLyBEZWZhdWx0IFNESyBhbmQgbWluaW11bSBPUyB2ZXJzaW9uIGlzIDEwLjQKK1NES1JPT1QgPSAkKERFVkVMT1BFUl9TREtfRElSKS9NYWNPU1gxMC40dS5zZGsKK01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCA9IDEwLjQKK0dDQ19WRVJTSU9OID0gNC4wCisKKy8vIFZFUlNJT05JTkcgQlVJTEQgU0VUVElOR1MgKHVzZWQgaW4gSW5mby5wbGlzdCkKK0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUID0gIMKpIDIwMDggR29vZ2xlIEluYy4KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9Db25maWcvUmVsZWFzZVByb2plY3QueGNjb25maWcgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDlmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnCkBAIC0wLDAgKzEsMzIgQEAKKy8vCisvLyAgUmVsZWFzZVByb2plY3QueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIFJlbGVhc2UgQ29uZmlndXJhdGlvbiBwcm9qZWN0IHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrCisvLyAgYW5kIGV4YW1wbGVzLiBJdCBpcyBzZXQgaW4gdGhlICJCYXNlZCBPbjoiIGRyb3Bkb3duIGluIHRoZSAiUHJvamVjdCIgaW5mbworLy8gIGRpYWxvZy4KKy8vICBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIFhjb2RlIENvbmZpZ3VyYXRpb24gZmlsZXMgaW46CisvLyAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS10b29sYm94LWZvci1tYWMvCisvLyAKKworI2luY2x1ZGUgIkdlbmVyYWwueGNjb25maWciCisKKy8vIHN1YmNvbmZpZy9SZWxlYXNlLnhjY29uZmlnCisKKy8vIE9wdGltaXplIGZvciBzcGFjZSBhbmQgc2l6ZSAoQXBwbGUgcmVjb21tZW5kYXRpb24pCitHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gcworCisvLyBEZXBsb21lbnQgcG9zdHByb2Nlc3NpbmcgaXMgd2hhdCB0cmlnZ2VycyBYY29kZSB0byBzdHJpcAorREVQTE9ZTUVOVF9QT1NUUFJPQ0VTU0lORyA9IFlFUworCisvLyBObyBzeW1ib2xzCitHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTworCisvLyBEZWFkIGNvZGUgc3RyaXAgZG9lcyBub3QgYWZmZWN0IE9iakMgY29kZSBidXQgY2FuIGhlbHAgZm9yIEMKK0RFQURfQ09ERV9TVFJJUFBJTkcgPSBZRVMKKworLy8gTkRFQlVHIGlzIHVzZWQgYnkgdGhpbmdzIGxpa2UgYXNzZXJ0LmgsIHNvIGRlZmluZSBpdCBmb3IgZ2VuZXJhbCBjb21wYXQuCisvLyBBU1NFUlQgZ29pbmcgYXdheSBpbiByZWxlYXNlIHRlbmRzIHRvIGNyZWF0ZSB1bnVzZWQgdmFycy4KK09USEVSX0NGTEFHUyA9ICQoT1RIRVJfQ0ZMQUdTKSAtRE5ERUJVRz0xIC1Xbm8tdW51c2VkLXZhcmlhYmxlCisKKy8vIFdoZW4gd2Ugc3RyaXAgd2Ugd2FudCB0byBzdHJpcCBhbGwgc3ltYm9scyBpbiByZWxlYXNlLCBidXQgc2F2ZSBleHRlcm5hbHMuCitTVFJJUF9TVFlMRSA9IGFsbApkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjJmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSwxOCBAQAorLy8KKy8vICBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBzdGF0aWMgbGlicmFyeSB0YXJnZXQgc2V0dGluZ3MgZm9yIGxpYmd0ZXN0LmEuIEl0CisvLyAgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlRhcmdldCIgaW5mbyBkaWFsb2cuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKy8vIFN0YXRpYyBsaWJzIGNhbiBiZSBpbmNsdWRlZCBpbiBidW5kbGVzIHNvIG1ha2UgdGhlbSBwb3NpdGlvbiBpbmRlcGVuZGVudAorR0NDX0RZTkFNSUNfTk9fUElDID0gTk8KKworLy8gU3RhdGljIGxpYnMgc2hvdWxkIG5vdCBoYXZlIHRoZWlyIGludGVybmFsIGdsb2JhbHMgb3IgZXh0ZXJuYWwgc3ltYm9scworLy8gc3RyaXBwZWQuCitTVFJJUF9TVFlMRSA9IGRlYnVnZ2luZworCisvLyBMZXQgdGhlIHVzZXIgaW5zdGFsbCBieSBzcGVjaWZ5aW5nIHRoZSAkRFNUUk9PVCB3aXRoIHhjb2RlYnVpbGQKK1NLSVBfSU5TVEFMTCA9IE5PCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2NTJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZwpAQCAtMCwwICsxLDggQEAKKy8vCisvLyAgVGVzdFRhcmdldC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgVGVzdCB0YXJnZXQgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kIGV4YW1wbGVzLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorCitQUk9EVUNUX05BTUUgPSAkKFRBUkdFVF9OQU1FKQorSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyOGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS5nb29nbGUuJHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5GTVdLPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz5HVEVTVF9WRVJTSU9OSU5GT19MT05HPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+R1RFU1RfVkVSU0lPTklORk9fU0hPUlQ8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9IEdURVNUX1ZFUlNJT05JTkZPX0xPTkcsICR7R1RFU1RfVkVSU0lPTklORk9fQUJPVVR9PC9zdHJpbmc+CisJPGtleT5OU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQ8L2tleT4KKwk8c3RyaW5nPiR7R1RFU1RfVkVSU0lPTklORk9fQUJPVVR9PC9zdHJpbmc+CisJPGtleT5DU1Jlc291cmNlc0ZpbGVNYXBwZWQ8L2tleT4KKwk8dHJ1ZS8+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL0luZm8ucGxpc3QgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg1MmVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL0luZm8ucGxpc3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLmdvb2dsZS5ndGVzdC4ke1BST0RVQ1RfTkFNRTppZGVudGlmaWVyfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz4ke1BST0RVQ1RfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkZNV0s8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q1NSZXNvdXJjZXNGaWxlTWFwcGVkPC9rZXk+CisJPHRydWUvPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc2MTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsNDU3IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDI7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJNDAyNEQxNjIxMTNEN0QyNDAwQzcwNTlFIC8qIFRlc3QgKi8gPSB7CisJCQlpc2EgPSBQQlhBZ2dyZWdhdGVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDAyNEQxNjkxMTNEN0Q0NjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwMjREMTYxMTEzRDdEMjQwMEM3MDU5RSAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDAyNEQxNjYxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IFRlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IFRlc3RBbmRCdWlsZDsKKwkJfTsKKwkJNDAyNEQxRTkxMTNEODNGRjAwQzcwNTlFIC8qIFRlc3RBbmRCdWlsZCAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDI0RDFGMDExM0Q4NDJCMDBDNzA1OUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlRlc3RBbmRCdWlsZCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDAyNEQxRUQxMTNEODQwOTAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDAyNEQxRUYxMTNEODQwRDAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IFRlc3RBbmRCdWlsZDsKKwkJCXByb2R1Y3ROYW1lID0gVGVzdEFuZEJ1aWxkOworCQl9OworLyogRW5kIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisJCTNCN0VCMTI1MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQjdFQjEyMzBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjICovOyB9OworCQkzQjdFQjEyNjBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQjdFQjEyNDBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkzQjdFQjEyODBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQjdFQjEyNzBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgKi87IH07CisJCTNCN0VCMTQ4MEU1QUYzQjQwMEM3RjIzOSAvKiBXaWRnZXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOEQwN0YyQzgwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldC5mcmFtZXdvcmsgKi87IH07CisJCTQwMjREMTg4MTEzRDdENzgwMEM3MDU5RSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDAyNEQxODUxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgKi87IH07CisJCTQwMjREMTg5MTEzRDdEN0EwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDI0RDE4MzExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTNCMDdCREYwMEUzRjNGQUUwMDY0Nzg2OSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gZ1Rlc3RFeGFtcGxlOworCQl9OworCQk0MDI0RDE2NTExM0Q3RDMxMDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5OworCQkJcmVtb3RlSW5mbyA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7CisJCX07CisJCTQwMjREMUVDMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gV2lkZ2V0RnJhbWV3b3JrOworCQl9OworCQk0MDI0RDFFRTExM0Q4NDBEMDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDAyNEQxNjIxMTNEN0QyNDAwQzcwNTlFOworCQkJcmVtb3RlSW5mbyA9IFRlc3Q7CisJCX07CisvKiBFbmQgUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTNCMDdCREVBMEUzRjNGOUUwMDY0Nzg2OSAvKiBXaWRnZXRGcmFtZXdvcmtUZXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBXaWRnZXRGcmFtZXdvcmtUZXN0OyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkzQjdFQjEyMzBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gd2lkZ2V0LmNjOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQjdFQjEyNDBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHdpZGdldC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQjdFQjEyNzBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSB3aWRnZXRfdGVzdC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDAyNEQxODMxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSBsaWJndGVzdF9tYWluLmE7IHBhdGggPSAvdXNyL2xvY2FsL2xpYi9saWJndGVzdF9tYWluLmE7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTQwMjREMTg1MTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdC5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9IGxpYmd0ZXN0LmE7IHBhdGggPSAvdXNyL2xvY2FsL2xpYi9saWJndGVzdC5hOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQk0MDI0RDFFMjExM0Q4MzgyMDBDNzA1OUUgLyogcnVudGVzdHMuc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnNjcmlwdC5zaDsgcGF0aCA9IHJ1bnRlc3RzLnNoOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDA3RjJDNzA0ODZDQzdBMDA3Q0QxRDAgLyogSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Q7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IFdpZGdldC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IwN0JERTgwRTNGM0Y5RTAwNjQ3ODY5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDI0RDE4OTExM0Q3RDdBMDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDAyNEQxODgxMTNEN0Q3ODAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQjdFQjE0ODBFNUFGM0I0MDBDN0YyMzkgLyogV2lkZ2V0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk4RDA3RjJDMzA0ODZDQzdBMDA3Q0QxRDAgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovLAorCQkJCTNCMDdCREVBMEUzRjNGOUUwMDY0Nzg2OSAvKiBXaWRnZXRGcmFtZXdvcmtUZXN0ICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBnVGVzdEV4YW1wbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMUUxMTEzRDgzNkMwMEM3MDU5RSAvKiBTY3JpcHRzICovLAorCQkJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8sCisJCQkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLywKKwkJCQkzQjA3QkUzNTBFNDA5NEU0MDA2NDc4NjkgLyogVGVzdCAqLywKKwkJCQkwODY3RDY5QUZFODQwMjhGQzAyQUFDMDcgLyogRXh0ZXJuYWwgRnJhbWV3b3JrcyBhbmQgTGlicmFyaWVzICovLAorCQkJCTAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gZ1Rlc3RFeGFtcGxlOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg2N0Q2OUFGRTg0MDI4RkMwMkFBQzA3IC8qIEV4dGVybmFsIEZyYW1ld29ya3MgYW5kIExpYnJhcmllcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDAyNEQxODMxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSAqLywKKwkJCQk0MDI0RDE4NTExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSAqLywKKwkJCSk7CisJCQluYW1lID0gIkV4dGVybmFsIEZyYW1ld29ya3MgYW5kIExpYnJhcmllcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODlDMTY2NUZFODQxMTU4QzAyQUFDMDcgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDA3RjJDNzA0ODZDQzdBMDA3Q0QxRDAgLyogSW5mby5wbGlzdCAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDhGQjc3QUNGRTg0MTcwN0MwMkFBQzA3IC8qIFNvdXJjZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLywKKwkJCQkzQjdFQjEyNDBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmggKi8sCisJCQkpOworCQkJbmFtZSA9IFNvdXJjZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTNCMDdCRTM1MEU0MDk0RTQwMDY0Nzg2OSAvKiBUZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQjdFQjEyNzBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgKi8sCisJCQkpOworCQkJbmFtZSA9IFRlc3Q7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQk0MDI0RDFFMTExM0Q4MzZDMDBDNzA1OUUgLyogU2NyaXB0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDAyNEQxRTIxMTNEODM4MjAwQzcwNTlFIC8qIHJ1bnRlc3RzLnNoICovLAorCQkJKTsKKwkJCW5hbWUgPSBTY3JpcHRzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQwN0YyQkQwNDg2Q0M3QTAwN0NEMUQwIC8qIEhlYWRlcnMgKi8gPSB7CisJCQlpc2EgPSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyNjBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmggaW4gSGVhZGVycyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCTNCMDdCREU5MEUzRjNGOUUwMDY0Nzg2OSAvKiBXaWRnZXRGcmFtZXdvcmtUZXN0ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDNCMDdCREY0MEUzRjNGQjYwMDY0Nzg2OSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrVGVzdCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkzQjA3QkRFNzBFM0YzRjlFMDA2NDc4NjkgLyogU291cmNlcyAqLywKKwkJCQkzQjA3QkRFODBFM0YzRjlFMDA2NDc4NjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkzQjA3QkRGMTBFM0YzRkFFMDA2NDc4NjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsKKwkJCXByb2R1Y3ROYW1lID0gZ1Rlc3RFeGFtcGxlVGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNEZBREMyNDIwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJXaWRnZXRGcmFtZXdvcmsiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQwN0YyQzMwNDg2Q0M3QTAwN0NEMUQwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJOEQwN0YyQkQwNDg2Q0M3QTAwN0NEMUQwIC8qIEhlYWRlcnMgKi8sCisJCQkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLywKKwkJCQk4RDA3RjJDNTA0ODZDQzdBMDA3Q0QxRDAgLyogUmV6ICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSBXaWRnZXRGcmFtZXdvcms7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiOworCQkJcHJvZHVjdE5hbWUgPSBnVGVzdEV4YW1wbGU7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOEQwN0YyQzgwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldC5mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmZyYW1ld29yayI7CisJCX07CisvKiBFbmQgUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUHJvamVjdCBzZWN0aW9uICovCisJCTA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFByb2plY3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNEZBREMyNDYwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiV2lkZ2V0RnJhbWV3b3JrIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDIuNCI7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCW1haW5Hcm91cCA9IDA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBnVGVzdEV4YW1wbGUgKi87CisJCQlwcm9kdWN0UmVmR3JvdXAgPSAwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJvb3QgPSAiIjsKKwkJCXRhcmdldHMgPSAoCisJCQkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldEZyYW1ld29yayAqLywKKwkJCQkzQjA3QkRFOTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLywKKwkJCQk0MDI0RDE2MjExM0Q3RDI0MDBDNzA1OUUgLyogVGVzdCAqLywKKwkJCQk0MDI0RDFFOTExM0Q4M0ZGMDBDNzA1OUUgLyogVGVzdEFuZEJ1aWxkICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXpCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQwN0YyQzUwNDg2Q0M3QTAwN0NEMUQwIC8qIFJleiAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlekJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTQwMjREMTYxMTEzRDdEMjQwMEM3MDU5RSAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIi9iaW4vYmFzaCAkU1JDUk9PVC9ydW50ZXN0cy5zaCAkQlVJTFRfUFJPRFVDVFNfRElSL1dpZGdldEZyYW1ld29ya1Rlc3RcbiI7CisJCX07CisvKiBFbmQgUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkzQjA3QkRFNzBFM0YzRjlFMDA2NDc4NjkgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTNCN0VCMTI4MEU1QUVFNDYwMEM3RjIzOSAvKiB3aWRnZXRfdGVzdC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTNCN0VCMTI1MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCQkzQjA3QkRGMTBFM0YzRkFFMDA2NDc4NjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0RnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSAzQjA3QkRGMDBFM0YzRkFFMDA2NDc4NjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MDI0RDE2NjExM0Q3RDMxMDBDNzA1OUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAzQjA3QkRFOTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDAyNEQxNjUxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDAyNEQxRUQxMTNEODQwOTAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldEZyYW1ld29yayAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDAyNEQxRUMxMTNEODQwOTAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDAyNEQxRUYxMTNEODQwRDAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDAyNEQxNjIxMTNEN0QyNDAwQzcwNTlFIC8qIFRlc3QgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMUVFMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisvKiBFbmQgUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJM0IwN0JERUMwRTNGM0Y5RjAwNjQ3ODY5IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkzQjA3QkRFRDBFM0YzRjlGMDA2NDc4NjkgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDI0RDE2MzExM0Q3RDI0MDBDNzA1OUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gVGVzdEFuZEJ1aWxkOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDAyNEQxNjQxMTNEN0QyNDAwQzcwNTlFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gVGVzdEFuZEJ1aWxkOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDI0RDFFQTExM0Q4M0ZGMDBDNzA1OUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gVGVzdEFuZEJ1aWxkOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDAyNEQxRUIxMTNEODNGRjAwQzcwNTlFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gVGVzdEFuZEJ1aWxkOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIkBsb2FkZXJfcGF0aC8uLi9GcmFtZXdvcmtzIjsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXQ7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAxOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9IDE7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiQGxvYWRlcl9wYXRoLy4uL0ZyYW1ld29ya3MiOworCQkJCVBST0RVQ1RfTkFNRSA9IFdpZGdldDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDcwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSA0LjA7CisJCQkJU0RLUk9PVCA9IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGs7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwkJM0IwN0JERjQwRTNGM0ZCNjAwNjQ3ODY5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJXaWRnZXRGcmFtZXdvcmtUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTNCMDdCREVDMEUzRjNGOUYwMDY0Nzg2OSAvKiBEZWJ1ZyAqLywKKwkJCQkzQjA3QkRFRDBFM0YzRjlGMDA2NDc4NjkgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDI0RDE2OTExM0Q3RDQ2MDBDNzA1OUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlRlc3QiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDAyNEQxNjMxMTNEN0QyNDAwQzcwNTlFIC8qIERlYnVnICovLAorCQkJCTQwMjREMTY0MTEzRDdEMjQwMEM3MDU5RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwMjREMUYwMTEzRDg0MkIwMEM3MDU5RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVGVzdEFuZEJ1aWxkIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwMjREMUVBMTEzRDgzRkYwMEM3MDU5RSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDI0RDFFQjExM0Q4M0ZGMDBDNzA1OUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIldpZGdldEZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDYwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiV2lkZ2V0RnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLywKKwkJCQk0RkFEQzI0ODA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCX07CisJcm9vdE9iamVjdCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTBkNDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3J1bnRlc3RzLnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBFeGVjdXRlcyB0aGUgc2FtcGxlcyBhbmQgdGVzdHMgZm9yIHRoZSBHb29nbGUgVGVzdCBGcmFtZXdvcmsuCisKKyMgSGVscCB0aGUgZHluYW1pYyBsaW5rZXIgZmluZCB0aGUgcGF0aCB0byB0aGUgbGlicmFyaWVzLgorZXhwb3J0IERZTERfRlJBTUVXT1JLX1BBVEg9JEJVSUxUX1BST0RVQ1RTX0RJUgorZXhwb3J0IERZTERfTElCUkFSWV9QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKKworIyBDcmVhdGUgc29tZSBleGVjdXRhYmxlcy4KK3Rlc3RfZXhlY3V0YWJsZXM9JEAKKworIyBOb3cgZXhlY3V0ZSBlYWNoIG9uZSBpbiB0dXJuIGtlZXBpbmcgdHJhY2sgb2YgaG93IG1hbnkgc3VjY2VlZGVkIGFuZCBmYWlsZWQuCitzdWNjZWVkZWQ9MAorZmFpbGVkPTAKK2ZhaWxlZF9saXN0PSgpCitmb3IgdGVzdCBpbiAke3Rlc3RfZXhlY3V0YWJsZXNbKl19OyBkbworICAiJHRlc3QiCisgIHJlc3VsdD0kPworICBpZiBbICRyZXN1bHQgLWVxIDAgXTsgdGhlbgorICAgIHN1Y2NlZWRlZD0kKCggJHN1Y2NlZWRlZCArIDEgKSkKKyAgZWxzZQorICAgIGZhaWxlZD0kKCggZmFpbGVkICsgMSApKQorICAgIGZhaWxlZF9saXN0PSIkZmFpbGVkX2xpc3QgJHRlc3QiCisgIGZpCitkb25lCisKKyMgUmVwb3J0IHRoZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHRvIHRoZSBjb25zb2xlLgorZWNobyAiVGVzdHMgY29tcGxldGUgd2l0aCAkc3VjY2VlZGVkIHN1Y2Nlc3NlcyBhbmQgJGZhaWxlZCBmYWlsdXJlcy4iCitpZiBbICRmYWlsZWQgLW5lIDAgXTsgdGhlbgorICBlY2hvICJUaGUgZm9sbG93aW5nIHRlc3RzIGZhaWxlZDoiCisgIGVjaG8gJGZhaWxlZF9saXN0CitmaQorZXhpdCAkZmFpbGVkCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM0ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYwpAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBwcmVzdG9uLmEuamFja3NvbkBnbWFpbC5jb20gKFByZXN0b24gSmFja3NvbikKKy8vCisvLyBHb29nbGUgVGVzdCAtIEZyYW1ld29ya1NhbXBsZQorLy8gd2lkZ2V0LmNjCisvLworCisvLyBXaWRnZXQgaXMgYSB2ZXJ5IHNpbXBsZSBjbGFzcyB1c2VkIGZvciBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgZ3Rlc3QKKworI2luY2x1ZGUgIndpZGdldC5oIgorCitXaWRnZXQ6OldpZGdldChpbnQgbnVtYmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKyAgICA6IG51bWJlcl8obnVtYmVyKSwKKyAgICAgIG5hbWVfKG5hbWUpIHt9CisKK1dpZGdldDo6fldpZGdldCgpIHt9CisKK2Zsb2F0IFdpZGdldDo6R2V0RmxvYXRWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG51bWJlcl87Cit9CisKK2ludCBXaWRnZXQ6OkdldEludFZhbHVlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihudW1iZXJfKTsKK30KKworc3RkOjpzdHJpbmcgV2lkZ2V0OjpHZXRTdHJpbmdWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfOworfQorCit2b2lkIFdpZGdldDo6R2V0Q2hhclB0clZhbHVlKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IG1heF9zaXplKSBjb25zdCB7CisgIC8vIENvcHkgdGhlIGNoYXIqIHJlcHJlc2VudGF0aW9uIG9mIG5hbWVfIGludG8gYnVmZmVyLCB1cCB0byBtYXhfc2l6ZS4KKyAgc3RybmNweShidWZmZXIsIG5hbWVfLmNfc3RyKCksIG1heF9zaXplLTEpOworICBidWZmZXJbbWF4X3NpemUtMV0gPSAnXDAnOworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmggYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NWNkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaApAQCAtMCwwICsxLDU5IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBwcmVzdG9uLmEuamFja3NvbkBnbWFpbC5jb20gKFByZXN0b24gSmFja3NvbikKKy8vCisvLyBHb29nbGUgVGVzdCAtIEZyYW1ld29ya1NhbXBsZQorLy8gd2lkZ2V0LmgKKy8vCisKKy8vIFdpZGdldCBpcyBhIHZlcnkgc2ltcGxlIGNsYXNzIHVzZWQgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiBndGVzdC4gSXQKKy8vIHNpbXBseSBzdG9yZXMgdHdvIHZhbHVlcyBhIHN0cmluZyBhbmQgYW4gaW50ZWdlciwgd2hpY2ggYXJlIHJldHVybmVkIHZpYQorLy8gcHVibGljIGFjY2Vzc29ycyBpbiBtdWx0aXBsZSBmb3Jtcy4KKworI2ltcG9ydCA8c3RyaW5nPgorCitjbGFzcyBXaWRnZXQgeworIHB1YmxpYzoKKyAgV2lkZ2V0KGludCBudW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgfldpZGdldCgpOworCisgIC8vIFB1YmxpYyBhY2Nlc3NvcnMgdG8gbnVtYmVyIGRhdGEKKyAgZmxvYXQgR2V0RmxvYXRWYWx1ZSgpIGNvbnN0OworICBpbnQgR2V0SW50VmFsdWUoKSBjb25zdDsKKworICAvLyBQdWJsaWMgYWNjZXNzb3JzIHRvIHRoZSBzdHJpbmcgZGF0YQorICBzdGQ6OnN0cmluZyBHZXRTdHJpbmdWYWx1ZSgpIGNvbnN0OworICB2b2lkIEdldENoYXJQdHJWYWx1ZShjaGFyKiBidWZmZXIsIHNpemVfdCBtYXhfc2l6ZSkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBEYXRhIG1lbWJlcnMKKyAgZmxvYXQgbnVtYmVyXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjU5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0X3Rlc3QuY2MKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldF90ZXN0LmNjCisvLworCisvLyBUaGlzIGlzIGEgc2ltcGxlIHRlc3QgZmlsZSBmb3IgdGhlIFdpZGdldCBjbGFzcyBpbiB0aGUgV2lkZ2V0LmZyYW1ld29yaworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxXaWRnZXQvd2lkZ2V0Lmg+CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUKKy8vIFdpZGdldCBjbGFzcyBjb3JyZWN0bHkuCitURVNUKFdpZGdldEluaXRpYWxpemVyVGVzdCwgVGVzdENvbnN0cnVjdG9yKSB7CisgIFdpZGdldCB3aWRnZXQoMS4wZiwgIm5hbWUiKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMGYsIHdpZGdldC5HZXRGbG9hdFZhbHVlKCkpOworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIm5hbWUiKSwgd2lkZ2V0LkdldFN0cmluZ1ZhbHVlKCkpOworfQorCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGZsb2F0IGFuZCBzdHJpbmcgdmFsdWVzIHRvIGludCBhbmQKKy8vIGNoYXIqLCByZXNwZWN0aXZlbHkuCitURVNUKFdpZGdldEluaXRpYWxpemVyVGVzdCwgVGVzdENvbnZlcnNpb24pIHsKKyAgV2lkZ2V0IHdpZGdldCgxLjBmLCAibmFtZSIpOworICBFWFBFQ1RfRVEoMSwgd2lkZ2V0LkdldEludFZhbHVlKCkpOworCisgIHNpemVfdCBtYXhfc2l6ZSA9IDEyODsKKyAgY2hhciBidWZmZXJbbWF4X3NpemVdOworICB3aWRnZXQuR2V0Q2hhclB0clZhbHVlKGJ1ZmZlciwgbWF4X3NpemUpOworICBFWFBFQ1RfU1RSRVEoIm5hbWUiLCBidWZmZXIpOworfQorCisvLyBVc2UgdGhlIEdvb2dsZSBUZXN0IG1haW4gdGhhdCBpcyBsaW5rZWQgaW50byB0aGUgZnJhbWV3b3JrLiBJdCBkb2VzIHNvbWV0aGluZworLy8gbGlrZSB0aGlzOgorLy8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisvLyAgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKy8vICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKKy8vIH0KZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZjMjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoCkBAIC0wLDAgKzEsNjUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBFeGVjdXRlcyB0aGUgc2FtcGxlcyBhbmQgdGVzdHMgZm9yIHRoZSBHb29nbGUgVGVzdCBGcmFtZXdvcmsuCisKKyMgSGVscCB0aGUgZHluYW1pYyBsaW5rZXIgZmluZCB0aGUgcGF0aCB0byB0aGUgbGlicmFyaWVzLgorZXhwb3J0IERZTERfRlJBTUVXT1JLX1BBVEg9JEJVSUxUX1BST0RVQ1RTX0RJUgorZXhwb3J0IERZTERfTElCUkFSWV9QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKKworIyBDcmVhdGUgc29tZSBleGVjdXRhYmxlcy4KK3Rlc3RfZXhlY3V0YWJsZXM9KCIkQlVJTFRfUFJPRFVDVFNfRElSL2d0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayIKKyAgICAgICAgICAgICAgICAgICIkQlVJTFRfUFJPRFVDVFNfRElSL2d0ZXN0X3VuaXR0ZXN0IgorICAgICAgICAgICAgICAgICAgIiRCVUlMVF9QUk9EVUNUU19ESVIvc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiCisgICAgICAgICAgICAgICAgICAiJEJVSUxUX1BST0RVQ1RTX0RJUi9zYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyIpCisKKyMgTm93IGV4ZWN1dGUgZWFjaCBvbmUgaW4gdHVybiBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHN1Y2NlZWRlZCBhbmQgZmFpbGVkLiAKK3N1Y2NlZWRlZD0wCitmYWlsZWQ9MAorZmFpbGVkX2xpc3Q9KCkKK2ZvciB0ZXN0IGluICR7dGVzdF9leGVjdXRhYmxlc1sqXX07IGRvCisgICIkdGVzdCIKKyAgcmVzdWx0PSQ/CisgIGlmIFsgJHJlc3VsdCAtZXEgMCBdOyB0aGVuCisgICAgc3VjY2VlZGVkPSQoKCAkc3VjY2VlZGVkICsgMSApKQorICBlbHNlCisgICAgZmFpbGVkPSQoKCBmYWlsZWQgKyAxICkpCisgICAgZmFpbGVkX2xpc3Q9IiRmYWlsZWRfbGlzdCAkdGVzdCIKKyAgZmkKK2RvbmUKKworIyBSZXBvcnQgdGhlIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgdG8gdGhlIGNvbnNvbGUuCitlY2hvICJUZXN0cyBjb21wbGV0ZSB3aXRoICRzdWNjZWVkZWQgc3VjY2Vzc2VzIGFuZCAkZmFpbGVkIGZhaWx1cmVzLiIKK2lmIFsgJGZhaWxlZCAtbmUgMCBdOyB0aGVuCisgIGVjaG8gIlRoZSBmb2xsb3dpbmcgdGVzdHMgZmFpbGVkOiIKKyAgZWNobyAkZmFpbGVkX2xpc3QKK2ZpCitleGl0ICRmYWlsZWQKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weSBiL2xpYnZweC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MWRlOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5CkBAIC0wLDAgKzEsMTAwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJBIHNjcmlwdCB0byBwcmVwYXJlIHZlcnNpb24gaW5mb3JtdGlvbiBmb3IgdXNlIHRoZSBndGVzdCBJbmZvLnBsaXN0IGZpbGUuCisKKyAgVGhpcyBzY3JpcHQgZXh0cmFjdHMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgY29uZmlndXJlLmFjIGZpbGUgYW5kCisgIHVzZXMgaXQgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBzYW1lIGluZm9ybWF0aW9uLiBUaGUKKyAgI2RlZmluZXMgaW4gdGhpcyBoZWFkZXIgZmlsZSB3aWxsIGJlIGluY2x1ZGVkIGluIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZgorICB0aGUgSW5mby5wbGlzdCBvZiB0aGUgZnJhbWV3b3JrLCBnaXZpbmcgdGhlIGNvcnJlY3QgdmFsdWUgdG8gdGhlIHZlcnNpb24KKyAgc2hvd24gaW4gdGhlIEZpbmRlci4KKworICBUaGlzIHNjcmlwdCBtYWtlcyB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zICh0aGVzZSBhcmUgZmF1bHRzIG9mIHRoZSBzY3JpcHQsCisgIG5vdCBwcm9ibGVtcyB3aXRoIHRoZSBBdXRvY29uZik6CisgICAgMS4gVGhlIEFDX0lOSVQgbWFjcm8gd2lsbCBiZSBjb250YWluZWQgd2l0aGluIHRoZSBmaXJzdCAxMDI0IGNoYXJhY3RlcnMKKyAgICAgICBvZiBjb25maWd1cmUuYWMKKyAgICAyLiBUaGUgdmVyc2lvbiBzdHJpbmcgd2lsbCBiZSAzIGludGVnZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzIGFuZCB3aWxsIGJlCisgICAgICAgc3Vycm91bmRlZCBieSBzcXVyZSBicmFja2V0cywgIlsiIGFuZCAiXSIgKGUuZy4gWzEuMC4xXSkuIFRoZSBmaXJzdAorICAgICAgIHNlZ21lbnQgcmVwcmVzZW50cyB0aGUgbWFqb3IgdmVyc2lvbiwgdGhlIHNlY29uZCByZXByZXNlbnRzIHRoZSBtaW5vcgorICAgICAgIHZlcnNpb24gYW5kIHRoZSB0aGlyZCByZXByZXNlbnRzIHRoZSBmaXggdmVyc2lvbi4KKyAgICAzLiBObyAiKSIgY2hhcmFjdGVyIGV4aXN0cyBiZXR3ZWVuIHRoZSBvcGVuaW5nICIoIiBhbmQgY2xvc2luZyAiKSIgb2YKKyAgICAgICBBQ19JTklULCBpbmNsdWRpbmcgaW4gY29tbWVudHMgYW5kIGNoYXJhY3RlciBzdHJpbmdzLgorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQorCisjIFJlYWQgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCAodGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIFZlcnNpb24uaCkKK2lmIChsZW4oc3lzLmFyZ3YpIDwgMyk6CisgIHByaW50ICJVc2FnZTogdmVyc2lvbmdlbmVyYXRlLnB5IGlucHV0X2RpciBvdXRwdXRfZGlyIgorICBzeXMuZXhpdCgxKQorZWxzZToKKyAgaW5wdXRfZGlyID0gc3lzLmFyZ3ZbMV0KKyAgb3V0cHV0X2RpciA9IHN5cy5hcmd2WzJdCisKKyMgUmVhZCB0aGUgZmlyc3QgMTAyNCBjaGFyYWN0ZXJzIG9mIHRoZSBjb25maWd1cmUuYWMgZmlsZQorY29uZmlnX2ZpbGUgPSBvcGVuKCIlcy9jb25maWd1cmUuYWMiICUgaW5wdXRfZGlyLCAncicpCitidWZmZXJfc2l6ZSA9IDEwMjQKK29wZW5pbmdfc3RyaW5nID0gY29uZmlnX2ZpbGUucmVhZChidWZmZXJfc2l6ZSkKK2NvbmZpZ19maWxlLmNsb3NlKCkKKworIyBFeHRyYWN0IHRoZSB2ZXJzaW9uIHN0cmluZyBmcm9tIHRoZSBBQ19JTklUIG1hY3JvCisjICAgVGhlIGZvbGxvd2luZyBpbml0X2V4cHJlc3Npb24gbWVhbnM6CisjICAgICBFeHRyYWN0IHRocmVlIGludGVnZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzIGFuZCBzdXJyb3VuZGVkIGJ5IHNxdXJlCisjICAgICBicmFja2V0cyhlLmcuICJbMS4wLjFdIikgYmV0d2VlbiAiQUNfSU5JVCgiIGFuZCAiKSIuIERvIG5vdCBiZSBncmVlZHkKKyMgICAgICgqPyBpcyB0aGUgbm9uLWdyZWVkeSBmbGFnKSBzaW5jZSB0aGF0IHdvdWxkIHB1bGwgaW4gZXZlcnl0aGluZyBiZXR3ZWVuCisjICAgICB0aGUgZmlyc3QgIigiIGFuZCB0aGUgbGFzdCAiKSIgaW4gdGhlIGZpbGUuCit2ZXJzaW9uX2V4cHJlc3Npb24gPSByZS5jb21waWxlKHIiQUNfSU5JVFwoLio/XFsoXGQrKVwuKFxkKylcLihcZCspXF0uKj9cKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLkRPVEFMTCkKK3ZlcnNpb25fdmFsdWVzID0gdmVyc2lvbl9leHByZXNzaW9uLnNlYXJjaChvcGVuaW5nX3N0cmluZykKK21ham9yX3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgxKQorbWlub3JfdmVyc2lvbiA9IHZlcnNpb25fdmFsdWVzLmdyb3VwKDIpCitmaXhfdmVyc2lvbiA9IHZlcnNpb25fdmFsdWVzLmdyb3VwKDMpCisKKyMgV3JpdGUgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gdG8gYSBoZWFkZXIgZmlsZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgSW5mby5wbGlzdCBmaWxlLgorZmlsZV9kYXRhID0gIiIiLy8KKy8vIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIChidXQgeW91IGNhbiBkZWxldGUgaXQpCisvLworLy8gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgYnkgdGhlIHZlcnNpb25nZW5lcmF0ZS5weSBzY3JpcHQuIFRoaXMgc2NyaXB0CisvLyBpcyBleGVjdXRlZCBpbiBhICJSdW4gU2NyaXB0IiBidWlsZCBwaGFzZSB3aGVuIGNyZWF0aW5nIGd0ZXN0LmZyYW1ld29yay4gVGhpcworLy8gaGVhZGVyIGZpbGUgaXMgbm90IHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uIG9mIEMtc291cmNlLiBSYXRoZXIsIGl0IHNpbXBseQorLy8gZGVmaW5lcyBzb21lIHZlcnNpb24gc3RyaW5ncyBmb3Igc3Vic3RpdHV0aW9uIGluIHRoZSBJbmZvLnBsaXN0LiBCZWNhdXNlIG9mCisvLyB0aGlzLCB3ZSBhcmUgbm90IG5vdCByZXN0cmljdGVkIHRvIEMtc3ludGF4IG5vciBhcmUgd2UgdXNpbmcgaW5jbHVkZSBndWFyZHMuCisvLworCisjZGVmaW5lIEdURVNUX1ZFUlNJT05JTkZPX1NIT1JUICVzLiVzCisjZGVmaW5lIEdURVNUX1ZFUlNJT05JTkZPX0xPTkcgJXMuJXMuJXMKKworIiIiICUgKG1ham9yX3ZlcnNpb24sIG1pbm9yX3ZlcnNpb24sIG1ham9yX3ZlcnNpb24sIG1pbm9yX3ZlcnNpb24sIGZpeF92ZXJzaW9uKQordmVyc2lvbl9maWxlID0gb3BlbigiJXMvVmVyc2lvbi5oIiAlIG91dHB1dF9kaXIsICd3JykKK3ZlcnNpb25fZmlsZS53cml0ZShmaWxlX2RhdGEpCit2ZXJzaW9uX2ZpbGUuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL2d0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9saWJ2cHgvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMveGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE3ODE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL3hjb2RlL2d0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSwxMDg0IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDI7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJM0IyMzhGNUYwRTgyOEI1NDAwODQ2RTExIC8qIENoZWNrICovID0geworCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDNCMjM4RkEzMEU4MjhCQjYwMDg0NkUxMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiQ2hlY2siICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJM0IyMzhGNUUwRTgyOEI1NDAwODQ2RTExIC8qIFNoZWxsU2NyaXB0ICovLAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MDg5OUY5RDBGRkE3NDBGMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCQk0MEM4NDlGNzEwMUE0MzQ0MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCQk0MDg5QTA5ODBGRkFEMzRBMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCQk0MEM4NDlGOTEwMUE0MzQ5MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gQ2hlY2s7CisJCQlwcm9kdWN0TmFtZSA9IENoZWNrOworCQl9OworCQk0MEM0NEFEQzBFMzc5OEY0MDA4RkNDNTEgLyogVmVyc2lvbiBJbmZvICovID0geworCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzQ0QUU0MEUzNzk5MDUwMDhGQ0M1MSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVmVyc2lvbiBJbmZvIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzQ0QURCMEUzNzk4RjQwMDhGQ0M1MSAvKiBHZW5lcmF0ZSBWZXJzaW9uLmggKi8sCisJCQkpOworCQkJY29tbWVudHMgPSAiVGhlIGdlbmVyYXRpb24gb2YgVmVyc2lvbi5oIG11c3QgYmUgcGVyZm9ybWVkIGluIGl0cyBvd24gdGFyZ2V0LiBTaW5jZSB0aGUgSW5mby5wbGlzdCBpcyBwcmVwcm9jZXNzZWQgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgYnVpbGQgcGhhc2VzIGluIGd0ZXN0LCB0aGUgVmVyc2lvbi5oIGZpbGUgd291bGQgbm90IGJlIHJlYWR5IGlmIGluY2x1ZGVkIGFzIGEgYnVpbGQgcGhhc2Ugb2YgdGhhdCB0YXJnZXQuIjsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gIlZlcnNpb24gSW5mbyI7CisJCQlwcm9kdWN0TmFtZSA9IFZlcnNpb24uaDsKKwkJfTsKKy8qIEVuZCBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkyMjRBMTJBMzBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkzQkY2RjJBMDBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCRjZGMjlGMEU3OUI1QUQwMDBGMkVFRSAvKiBndGVzdC10eXBlLXV0aWwuaCAqLzsgfTsKKwkJM0JGNkYyQTUwRTc5QjYxNjAwMEYyRUVFIC8qIGd0ZXN0LXR5cGVkLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCRjZGMkE0MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzODBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZGVhdGgtdGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDM5MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNEQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNDA0ODg0M0EwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNDA0ODg0M0IwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNERTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNDMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0RGMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNEMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcm9kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNDA0ODg0NTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRjYwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSAqLzsgfTsKKwkJNDA0ODg0QTAwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLzsgfTsKKwkJNDA0ODg0QTEwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWZpbGVwYXRoLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0UzMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oICovOyB9OworCQk0MDQ4ODRBMjBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWludGVybmFsLmggKi87IH07CisJCTQwNDg4NEEzMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U1MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggKi87IH07CisJCTQwNDg4NEE0MEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTYwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oICovOyB9OworCQk0MDQ4ODRBQzBFMkY3Q0Q5MDBDRjc2NTggLyogQ0hBTkdFUyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0QTkwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgKi87IH07CisJCTQwNDg4NEFEMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi87IH07CisJCTQwNDg4NEFFMEUyRjdDRDkwMENGNzY1OCAvKiBDT1BZSU5HIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODRBQjBFMkY3Q0Q5MDBDRjc2NTggLyogQ09QWUlORyAqLzsgfTsKKwkJNDA4OTlGM0EwRkZBNzBENDAwMEIyOUFFIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi87IH07CisJCTQwODk5RjUwMEZGQTcyODEwMDBCMjlBRSAvKiBndGVzdC10dXBsZS5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLzsgfTsKKwkJNDA4OTlGNTMwRkZBNzJBMDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovOyB9OworCQk0MDg5QTA0NDBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovOyB9OworCQk0MDg5QTA0NjBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovOyB9OworCQk0MEM4NDhGRjEwMUEyMTE1MDA4MzY0MkEgLyogZ3Rlc3QtYWxsLmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjI0QTEyQTEwRTlFQURBNzAwQkQxN0ZEIC8qIGd0ZXN0LWFsbC5jYyAqLzsgfTsKKwkJNDBDODQ5MTUxMDFBMjFERjAwODM2NDJBIC8qIGd0ZXN0X21haW4uY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLzsgfTsKKwkJNDBDODQ5MTYxMDFBMjM1QjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi87IH07CisJCTQwQzg0OTIxMTAxQTIzQUQwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworCQk0MEM4NDk3ODEwMUEzNjU0MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworCQk0MEM4NDk4MDEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi87IH07CisJCTQwQzg0OTgyMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi87IH07CisJCTQwQzg0OTgzMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworCQk0MEM4NDk4RjEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovOyB9OworCQk0MEM4NDk5MDEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovOyB9OworCQk0MEM4NDk5MjEwMUEzNkE2MDA4MzY0MkEgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MEM4NDk5MzEwMUEzNkE2MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5QTIxMDFBMzcwNTAwODM2NDJBIC8qIGd0ZXN0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi87IH07CisJCTQwQzg0OUE0MTAxQTM3MTUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOyB9OworCQk0NTM5QzkzNDBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzMwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQ1MzlDOTM4MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1saW5rZWRfcHRyLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTM1MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1saW5rZWRfcHRyLmggKi87IH07CisJCTQ1MzlDOTM5MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzkzNjBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCAqLzsgfTsKKwkJNDUzOUM5M0EwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzcwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCAqLzsgfTsKKwkJNDU2N0M4MTgxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTY3QzgxNzEyNjRGRjcxMDA3NzQwQkUgLyogZ3Rlc3QtcHJpbnRlcnMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KKwkJNDA4OTlGOUMwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwODk5RjQyMEZGQTcxODQwMDBCMjlBRTsKKwkJCXJlbW90ZUluZm8gPSBndGVzdF91bml0dGVzdDsKKwkJfTsKKwkJNDA4OUEwOTcwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRTsKKwkJCXJlbW90ZUluZm8gPSBzYW1wbGUxX3VuaXR0ZXN0OworCQl9OworCQk0MDhCRUMwRjEwNDZDRkU5MDBERUY1MjIgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBOworCQkJcmVtb3RlSW5mbyA9ICJndGVzdC1zdGF0aWMiOworCQl9OworCQk0MEM0NEFFNTBFMzc5OTIyMDA4RkNDNTEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxOworCQkJcmVtb3RlSW5mbyA9IFZlcnNpb24uaDsKKwkJfTsKKwkJNDBDODQ5N0MxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5N0UxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfbWFpbi1zdGF0aWMiOworCQl9OworCQk0MEM4NDk4QjEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBOworCQkJcmVtb3RlSW5mbyA9ICJndGVzdC1zdGF0aWMiOworCQl9OworCQk0MEM4NDk4RDEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBOworCQkJcmVtb3RlSW5mbyA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTlCMTAxQTM2REMwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X21haW4tc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OUQxMDFBMzZFNTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMDsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3QtZnJhbWV3b3JrIjsKKwkJfTsKKwkJNDBDODQ5OUYxMDFBMzZGMTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMDsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3QtZnJhbWV3b3JrIjsKKwkJfTsKKwkJNDBDODQ5RjYxMDFBNDM0NDAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5RjgxMDFBNDM0OTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTg5MTAxQTM2QTYwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOworCQl9OworLyogRW5kIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk0MDQ4ODRBNTBFMkY3QzA0MDBDRjc2NTggLyogQ29weSBIZWFkZXJzIEludGVybmFsICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gSGVhZGVycy9pbnRlcm5hbDsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSA2OworCQkJZmlsZXMgPSAoCisJCQkJNDA0ODg0QTAwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDA0ODg0QTEwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWZpbGVwYXRoLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEEyMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCQk0NTM5QzkzODBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCQk0NTM5QzkzOTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5M0EwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDA0ODg0QTMwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LXBvcnQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDA0ODg0QTQwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCQk0MDg5OUY1MDBGRkE3MjgxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJM0JGNkYyQTAwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCSk7CisJCQluYW1lID0gIkNvcHkgSGVhZGVycyBJbnRlcm5hbCI7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gImd0ZXN0LWFsbC5jYyI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTIyNEExMkEyMEU5RUFEQ0MwMEJEMTdGRCAvKiBndGVzdC10ZXN0LXBhcnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC10ZXN0LXBhcnQuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNCMjM4QzEyMEU3RkUxM0MwMDg0NkUxMSAvKiBndGVzdF91bml0dGVzdC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGd0ZXN0X3VuaXR0ZXN0LmNjOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQjg3RDIxMDBFOTZCOTJFMDAwRDE4NTIgLyogcnVudGVzdHMuc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnNjcmlwdC5zaDsgcGF0aCA9IHJ1bnRlc3RzLnNoOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC10eXBlLXV0aWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNCRjZGMkE0MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC10eXBlZC10ZXN0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDNFRTM3QzBFMzc3ODIyMDA0QkQxRTIgLyogdmVyc2lvbmdlbmVyYXRlLnB5ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQucHl0aG9uOyBwYXRoID0gdmVyc2lvbmdlbmVyYXRlLnB5OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNEQjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZGVhdGgtdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtZGVhdGgtdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LW1lc3NhZ2UuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXNwaS5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzREUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RGMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZ3Rlc3RfcHJlZF9pbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0UwMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcm9kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0X3Byb2QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0UzMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtZmlsZXBhdGguaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtaW50ZXJuYWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0U1MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wb3J0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1zdHJpbmcuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0Y2MEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gUkVBRE1FOyBwYXRoID0gLi4vUkVBRE1FOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NDBEMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9tYWluLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gZ3Rlc3RfbWFpbi5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODg0QTkwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ0hBTkdFUzsgcGF0aCA9IC4uL0NIQU5HRVM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJNDA0ODg0QUEwRTJGN0NEOTAwQ0Y3NjU4IC8qIENPTlRSSUJVVE9SUyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBDT05UUklCVVRPUlM7IHBhdGggPSAuLi9DT05UUklCVVRPUlM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIENPUFlJTkcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ09QWUlORzsgcGF0aCA9IC4uL0NPUFlJTkc7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJNDA4OTlGNDMwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwODk5RjREMEZGQTcyNzEwMDBCMjlBRSAvKiBndGVzdC10dXBsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHVwbGUuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwODlBMDEzMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNDA4OUEwMkMwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTEuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBzYW1wbGUxLmNjOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAyRDBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBzYW1wbGUxLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gc2FtcGxlMV91bml0dGVzdC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IGFyY2hpdmUuYXI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYmd0ZXN0LmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IGFyY2hpdmUuYXI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYmd0ZXN0X21haW4uYTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBndGVzdF91bml0dGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MEQ0Q0RGMTBFMzBFMDc0MDAyOTQ4MDEgLyogRGVidWdQcm9qZWN0LnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IERlYnVnUHJvamVjdC54Y2NvbmZpZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBGcmFtZXdvcmtUYXJnZXQueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDREYzMEUzMEUwNzQwMDI5NDgwMSAvKiBHZW5lcmFsLnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IEdlbmVyYWwueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDREY0MEUzMEUwNzQwMDI5NDgwMSAvKiBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDBENENGNTEwRTMwRjVFMjAwMjk0ODAxIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBndGVzdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS10ZXN0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtbGlua2VkX3B0ci5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDUzOUM5MzcwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXBhcmFtLXV0aWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1NjdDODE3MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcHJpbnRlcnMuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA4OTlGNDEwRkZBNzE4NDAwMEIyOUFFIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MEM4NDlBNDEwMUEzNzE1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5MTYxMDFBMjM1QjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MDg5QTAxMTBGRkFDRUZDMDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OUEyMTAxQTM3MDUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQk0MEM4NDkyMTEwMUEyM0FEMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OTgxMTAxQTM2ODUwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5ODIxMDFBMzY4NTAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQk0MEM4NDk4MzEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OTkxMTAxQTM2QTYwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5OTIxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQk0MEM4NDk5MzEwMUEzNkE2MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLywKKwkJCQk0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLywKKwkJCQk0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovLAorCQkJCTQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovLAorCQkJCTQwODlBMDEzMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk5NzEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGd0ZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MEQ0Q0RGMDBFMzBFMDc0MDAyOTQ4MDEgLyogQ29uZmlnICovLAorCQkJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8sCisJCQkJNDBENENGNEUwRTMwRjVFMjAwMjk0ODAxIC8qIFJlc291cmNlcyAqLywKKwkJCQk0MDNFRTM3QjBFMzc3ODIyMDA0QkQxRTIgLyogU2NyaXB0cyAqLywKKwkJCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9IGd0ZXN0OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDhGQjc3QUNGRTg0MTcwN0MwMkFBQzA3IC8qIFNvdXJjZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDA0ODg0QTkwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgKi8sCisJCQkJNDA0ODg0QUEwRTJGN0NEOTAwQ0Y3NjU4IC8qIENPTlRSSUJVVE9SUyAqLywKKwkJCQk0MDQ4ODRBQjBFMkY3Q0Q5MDBDRjc2NTggLyogQ09QWUlORyAqLywKKwkJCQk0MDQ4ODNGNjBFMkY3OTlCMDBDRjc2NTggLyogUkVBRE1FICovLAorCQkJCTQwNDg4M0Q5MEUyRjc5OUIwMENGNzY1OCAvKiBpbmNsdWRlICovLAorCQkJCTQwODlBMDJGMEZGQUNGODQwMDBCMjlBRSAvKiBzYW1wbGVzICovLAorCQkJCTQwNDg4NDA3MEUyRjc5OUIwMENGNzY1OCAvKiBzcmMgKi8sCisJCQkJM0IyMzhCRjAwRTdGRTEzQjAwODQ2RTExIC8qIHRlc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IFNvdXJjZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTNCMjM4QkYwMEU3RkUxM0IwMDg0NkUxMSAvKiB0ZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi8sCisJCQkpOworCQkJbmFtZSA9IHRlc3Q7CisJCQlwYXRoID0gLi4vdGVzdDsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJNDAzRUUzN0IwRTM3NzgyMjAwNEJEMUUyIC8qIFNjcmlwdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwM0VFMzdDMEUzNzc4MjIwMDRCRDFFMiAvKiB2ZXJzaW9uZ2VuZXJhdGUucHkgKi8sCisJCQkJM0I4N0QyMTAwRTk2QjkyRTAwMEQxODUyIC8qIHJ1bnRlc3RzLnNoICovLAorCQkJKTsKKwkJCXBhdGggPSBTY3JpcHRzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDA0ODgzRDkwRTJGNzk5QjAwQ0Y3NjU4IC8qIGluY2x1ZGUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwNDg4M0RBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdCAqLywKKwkJCSk7CisJCQluYW1lID0gaW5jbHVkZTsKKwkJCXBhdGggPSAuLi9pbmNsdWRlOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQk0MDQ4ODNEQTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwNDg4M0UxMEUyRjc5OUIwMENGNzY1OCAvKiBpbnRlcm5hbCAqLywKKwkJCQkyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi8sCisJCQkJNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLywKKwkJCQk0MDQ4ODNEQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oICovLAorCQkJCTQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi8sCisJCQkJNDU2N0M4MTcxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggKi8sCisJCQkJNDA0ODgzREQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oICovLAorCQkJCTQwNDg4M0RFMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oICovLAorCQkJCTQwNDg4M0RGMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCAqLywKKwkJCQk0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovLAorCQkJCTNCRjZGMkE0MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggKi8sCisJCQkpOworCQkJcGF0aCA9IGd0ZXN0OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDA0ODgzRTEwRTJGNzk5QjAwQ0Y3NjU4IC8qIGludGVybmFsICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNFMjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oICovLAorCQkJCTQwNDg4M0UzMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oICovLAorCQkJCTQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovLAorCQkJCTQ1MzlDOTM1MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1saW5rZWRfcHRyLmggKi8sCisJCQkJNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi8sCisJCQkJNDUzOUM5MzcwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCAqLywKKwkJCQk0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovLAorCQkJCTQwNDg4M0U2MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCAqLywKKwkJCQk0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLywKKwkJCQkzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi8sCisJCQkpOworCQkJcGF0aCA9IGludGVybmFsOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDA0ODg0MDcwRTJGNzk5QjAwQ0Y3NjU4IC8qIHNyYyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMjI0QTEyQTEwRTlFQURBNzAwQkQxN0ZEIC8qIGd0ZXN0LWFsbC5jYyAqLywKKwkJCQk0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLywKKwkJCSk7CisJCQluYW1lID0gc3JjOworCQkJcGF0aCA9IC4uL3NyYzsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJNDA4OUEwMkYwRkZBQ0Y4NDAwMEIyOUFFIC8qIHNhbXBsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovLAorCQkJCTQwODlBMDJEMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmggKi8sCisJCQkJNDA4OUEwMkUwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgKi8sCisJCQkpOworCQkJbmFtZSA9IHNhbXBsZXM7CisJCQlwYXRoID0gLi4vc2FtcGxlczsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJNDBENENERjAwRTMwRTA3NDAwMjk0ODAxIC8qIENvbmZpZyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGMjBFMzBFMDc0MDAyOTQ4MDEgLyogRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnICovLAorCQkJCTQwRDRDREYzMEUzMEUwNzQwMDI5NDgwMSAvKiBHZW5lcmFsLnhjY29uZmlnICovLAorCQkJCTQwRDRDREY0MEUzMEUwNzQwMDI5NDgwMSAvKiBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZyAqLywKKwkJCQk0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLywKKwkJCSk7CisJCQlwYXRoID0gQ29uZmlnOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDBENENGNEUwRTMwRjVFMjAwMjk0ODAxIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDBENENGNTEwRTMwRjVFMjAwMjk0ODAxIC8qIEluZm8ucGxpc3QgKi8sCisJCQkpOworCQkJcGF0aCA9IFJlc291cmNlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDA0ODg0MzgwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDM5MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggaW4gSGVhZGVycyAqLywKKwkJCQk0NTM5QzkzNDBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDU2N0M4MTgxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggaW4gSGVhZGVycyAqLywKKwkJCQkzQkY2RjJBNTBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0EwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0IwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggaW4gSGVhZGVycyAqLywKKwkJCQk0MDQ4ODQzQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQk0MDQ4ODQzRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMjI0QTEyQTMwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oIGluIEhlYWRlcnMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQk0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwODk5RjRBMEZGQTcxQkMwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwODk5RjQwMEZGQTcxODQwMDBCMjlBRSAvKiBTb3VyY2VzICovLAorCQkJCTQwODk5RjQxMEZGQTcxODQwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwQzg0OUEwMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDA4OTlGNDMwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDg5QTAyNDBGRkFDRjAxMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwODlBMDEwMEZGQUNFRkMwMDBCMjlBRSAvKiBTb3VyY2VzICovLAorCQkJCTQwODlBMDExMEZGQUNFRkMwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwQzg0OTlFMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJcHJvZHVjdE5hbWUgPSBzYW1wbGUxX3VuaXR0ZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDQwODlBMDEzMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5MDIxMDFBMjEyRTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdC1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ4RjcxMDFBMjA5QzAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJndGVzdC1zdGF0aWMiOworCQkJcHJvZHVjdE5hbWUgPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOworCQl9OworCQk0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5MTIxMDFBMjFEMjAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF9tYWluLXN0YXRpYyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MEM4NDkwODEwMUEyMTdFMDA4MzY0MkEgLyogU291cmNlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gImd0ZXN0X21haW4tc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gImd0ZXN0X21haW4tc3RhdGljIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LnN0YXRpYyI7CisJCX07CisJCTQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC1zdGF0aWMgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5ODQxMDFBMzY4NTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF91bml0dGVzdC1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5N0YxMDFBMzY4NTAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkJNDBDODQ5ODExMDFBMzY4NTAwODM2NDJBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDODQ5N0IxMDFBMzY4NTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5N0QxMDFBMzY4NTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJndGVzdF91bml0dGVzdC1zdGF0aWMiOworCQkJcHJvZHVjdE5hbWUgPSBndGVzdF91bml0dGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDk4NzEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3QgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5OTQxMDFBMzZBNjAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MEM4NDk4RTEwMUEzNkE2MDA4MzY0MkEgLyogU291cmNlcyAqLywKKwkJCQk0MEM4NDk5MTEwMUEzNkE2MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDk4QTEwMUEzNkE2MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCQk0MEM4NDk4QzEwMUEzNkE2MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gc2FtcGxlMV91bml0dGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDk5NzEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogZ3Rlc3QtZnJhbWV3b3JrICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3QtZnJhbWV3b3JrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovLAorCQkJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovLAorCQkJCTQwNDg4NEE1MEUyRjdDMDQwMENGNzY1OCAvKiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM0NEFFNjBFMzc5OTIyMDA4RkNDNTEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCQk0MDhCRUMxMDEwNDZDRkU5MDBERUY1MjIgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCQk0MEM4NDk5QzEwMUEzNkRDMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gImd0ZXN0LWZyYW1ld29yayI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiOworCQkJcHJvZHVjdE5hbWUgPSBndGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5mcmFtZXdvcmsiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImd0ZXN0IiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDIuNCI7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQlFbmdsaXNoLAorCQkJCUphcGFuZXNlLAorCQkJCUZyZW5jaCwKKwkJCQlHZXJtYW4sCisJCQkJZW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGd0ZXN0ICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLywKKwkJCQk0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi8sCisJCQkJNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJCTQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8sCisJCQkJM0IyMzhGNUYwRTgyOEI1NDAwODQ2RTExIC8qIENoZWNrICovLAorCQkJCTQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MSAvKiBWZXJzaW9uIEluZm8gKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDA0ODg0NTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSBpbiBSZXNvdXJjZXMgKi8sCisJCQkJNDA0ODg0QUMwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFEMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFFMEUyRjdDRDkwMENGNzY1OCAvKiBDT1BZSU5HIGluIFJlc291cmNlcyAqLywKKwkJCQk0MEM4NDk3ODEwMUEzNjU0MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IyMzhGNUUwRTgyOEI1NDAwODQ2RTExIC8qIFNoZWxsU2NyaXB0ICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSZW1lbWJlciwgdGhpcyBcIlJ1biBTY3JpcHRcIiBidWlsZCBwaGFzZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gJFNSQ1JPT1Rcbi9iaW4vYmFzaCBTY3JpcHRzL3J1bnRlc3RzLnNoIjsKKwkJfTsKKwkJNDBDNDRBREIwRTM3OThGNDAwOEZDQzUxIC8qIEdlbmVyYXRlIFZlcnNpb24uaCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJCSIkKFNSQ1JPT1QpL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IiwKKwkJCQkiJChTUkNST09UKS8uLi9jb25maWd1cmUuYWMiLAorCQkJKTsKKwkJCW5hbWUgPSAiR2VuZXJhdGUgVmVyc2lvbi5oIjsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJCSIkKFBST0pFQ1RfVEVNUF9ESVIpL1ZlcnNpb24uaCIsCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSZW1lbWJlciwgdGhpcyBcIlJ1biBTY3JpcHRcIiBidWlsZCBwaGFzZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gJFNSQ1JPT1Rcbi91c3IvYmluL3B5dGhvbiBTY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weSAuLi8gJFBST0pFQ1RfVEVNUF9ESVIiOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA4OTlGNDAwRkZBNzE4NDAwMEIyOUFFIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5OUY1MzBGRkE3MkEwMDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDA4OUEwMTAwRkZBQ0VGQzAwMEIyOUFFIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5QTA0NDBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovLAorCQkJCTQwODlBMDQ2MEZGQUQxQkUwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OEY3MTAxQTIwOUMwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ4RkYxMDFBMjExNTAwODM2NDJBIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDkwODEwMUEyMTdFMDA4MzY0MkEgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTE1MTAxQTIxREYwMDgzNjQyQSAvKiBndGVzdF9tYWluLmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OTdGMTAxQTM2ODUwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5ODAxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OThFMTAxQTM2QTYwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5OEYxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLywKKwkJCQk0MEM4NDk5MDEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwODk5RjNBMEZGQTcwRDQwMDBCMjlBRSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCQk0MDg5OUY5RDBGRkE3NDBGMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDg5OUY5QzBGRkE3NDBGMDAwQjI5QUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MDg5QTA5ODBGRkFEMzRBMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwODlBMDk3MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwOEJFQzEwMTA0NkNGRTkwMERFRjUyMiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwOEJFQzBGMTA0NkNGRTkwMERFRjUyMiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzQ0QUU2MEUzNzk5MjIwMDhGQ0M1MSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MSAvKiBWZXJzaW9uIEluZm8gKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzQ0QUU1MEUzNzk5MjIwMDhGQ0M1MSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTdCMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTdDMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTdEMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQSAvKiBndGVzdF9tYWluLXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5N0UxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OEExMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5OEIxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OEMxMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk4RDEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDk5QzEwMUEzNkRDMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlCMTAxQTM2REMwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTlFMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlEMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUEwMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlGMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUY3MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OUY2MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUY5MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTg5MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5RjgxMDFBNDM0OTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKy8qIEVuZCBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQkzQjIzOEY2MDBFODI4QjU0MDA4NDZFMTEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCVBST0RVQ1RfTkFNRSA9IENoZWNrOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJM0IyMzhGNjEwRTgyOEI1NDAwODQ2RTExIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBDaGVjazsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDA4OTlGNDUwRkZBNzE4NTAwMEIyOUFFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi87CisJCQkJUFJPRFVDVF9OQU1FID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MDg5OUY0NjBGRkE3MTg1MDAwQjI5QUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDg5QTAxNTBGRkFDRUZEMDAwQjI5QUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwODlBMDE2MEZGQUNFRkQwMDBCMjlBRSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzQ0QURGMEUzNzk4RjQwMDhGQ0M1MSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlUQVJHRVRfTkFNRSA9IGd0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDNDRBRTAwRTM3OThGNDAwOEZDQzUxIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQkJVEFSR0VUX05BTUUgPSBndGVzdDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ4RkIxMDFBMjA5RDAwODM2NDJBIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ4RkMxMDFBMjA5RDAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19JTkxJTkVTX0FSRV9QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTBFMTAxQTIxN0YwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0X21haW47CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MEM4NDkwRjEwMUEyMTdGMDA4MzY0MkEgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0X21haW47CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTg1MTAxQTM2ODUwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0X3VuaXR0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5ODYxMDFBMzY4NTAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uLzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF91bml0dGVzdDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ5OTUxMDFBMzZBNjAwODM2NDJBIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MEM4NDk5NjEwMUEzNkE2MDA4MzY0MkEgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IFJlc291cmNlcy9JbmZvLnBsaXN0OworCQkJCUlORk9QTElTVF9QUkVGSVhfSEVBREVSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvVmVyc2lvbi5oIjsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTUyA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlWRVJTSU9OSU5HX1NZU1RFTSA9ICJhcHBsZS1nZW5lcmljIjsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBSZXNvdXJjZXMvSW5mby5wbGlzdDsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpL1ZlcnNpb24uaCI7CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1MgPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiYXBwbGUtZ2VuZXJpYyI7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGMTBFMzBFMDc0MDAyOTQ4MDEgLyogRGVidWdQcm9qZWN0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREY0MEUzMEUwNzQwMDI5NDgwMSAvKiBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwkJM0IyMzhGQTMwRTgyOEJCNjAwODQ2RTExIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJDaGVjayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkzQjIzOEY2MDBFODI4QjU0MDA4NDZFMTEgLyogRGVidWcgKi8sCisJCQkJM0IyMzhGNjEwRTgyOEI1NDAwODQ2RTExIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDA4OTlGNEEwRkZBNzFCQzAwMEIyOUFFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDA4OTlGNDUwRkZBNzE4NTAwMEIyOUFFIC8qIERlYnVnICovLAorCQkJCTQwODk5RjQ2MEZGQTcxODUwMDBCMjlBRSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwODlBMDI0MEZGQUNGMDEwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDA4OUEwMTUwRkZBQ0VGRDAwMEIyOUFFIC8qIERlYnVnICovLAorCQkJCTQwODlBMDE2MEZGQUNFRkQwMDBCMjlBRSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzQ0QUU0MEUzNzk5MDUwMDhGQ0M1MSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVmVyc2lvbiBJbmZvIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzQ0QURGMEUzNzk4RjQwMDhGQ0M1MSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM0NEFFMDBFMzc5OEY0MDA4RkNDNTEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDkwMjEwMUEyMTJFMDA4MzY0MkEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LXN0YXRpYyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MEM4NDhGQjEwMUEyMDlEMDA4MzY0MkEgLyogRGVidWcgKi8sCisJCQkJNDBDODQ4RkMxMDFBMjA5RDAwODM2NDJBIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ5MTIxMDFBMjFEMjAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF9tYWluLXN0YXRpYyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MEM4NDkwRTEwMUEyMTdGMDA4MzY0MkEgLyogRGVidWcgKi8sCisJCQkJNDBDODQ5MEYxMDFBMjE3RjAwODM2NDJBIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ5ODQxMDFBMzY4NTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF91bml0dGVzdC1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ5ODUxMDFBMzY4NTAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OTg2MTAxQTM2ODUwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTk0MTAxQTM2QTYwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ5OTUxMDFBMzZBNjAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OTk2MTAxQTM2QTYwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTRGQURDMjQzMDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLywKKwkJCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0NjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJndGVzdCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvbGlieXV2L1JFQURNRS53ZWJtIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9SRUFETUUud2VibQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ5NWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9SRUFETUUud2VibQpAQCAtMCwwICsxLDE3IEBACitOYW1lOiBsaWJ5dXYKK1VSTDogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2xpYnl1di8KK1ZlcnNpb246IDEwMgorTGljZW5zZTogQlNECitMaWNlbnNlIEZpbGU6IExJQ0VOU0UKKworRGVzY3JpcHRpb246CitsaWJ5dXYgaXMgYW4gb3BlbiBzb3VyY2UgcHJvamVjdCB0aGF0IGluY2x1ZGVzIFlVViBjb252ZXJzaW9uIGFuZCBzY2FsaW5nCitmdW5jdGlvbmFsaXR5LgorCitUaGUgb3B0aW1pemVkIHNjYWxlciBpbiBsaWJ5dXYgaXMgdXNlZCBpbiBtdWx0aXBsZSByZXNvbHV0aW9uIGVuY29kZXIgZXhhbXBsZSwKK3doaWNoIGRvd24tc2FtcGxlcyB0aGUgb3JpZ2luYWwgaW5wdXQgdmlkZW8gKGYuZy4gMTI4MHg3MjApIGEgbnVtYmVyIG9mIHRpbWVzCitpbiBvcmRlciB0byBlbmNvZGUgbXVsdGlwbGUgcmVzb2x1dGlvbiBiaXQgc3RyZWFtcy4KKworTG9jYWwgTW9kaWZpY2F0aW9uczoKK01vZGlmaWVkIHRoZSBvcmlnaW5hbCBzY2FsZXIgY29kZSBmcm9tIEMrKyB0byBDIHRvIGZpdCBpbiBvdXIgY3VycmVudCBidWlsZAorc3lzdGVtLiBUaGlzIGlzIGEgdGVtcG9yYWwgc29sdXRpb24sIGFuZCB3aWxsIGJlIGltcHJvdmVkIGxhdGVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvaW5jbHVkZS9saWJ5dXYvYmFzaWNfdHlwZXMuaCBiL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvaW5jbHVkZS9saWJ5dXYvYmFzaWNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDUwNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9iYXNpY190eXBlcy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBMaWJZdXYgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfTElCWVVWX0JBU0lDX1RZUEVTX0hfCisjZGVmaW5lIElOQ0xVREVfTElCWVVWX0JBU0lDX1RZUEVTX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBOVUxMLCBzaXplX3QKKworI2lmICEoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDwgMTYwMCkpCisjaW5jbHVkZSA8c3RkaW50Lmg+ICAvLyBmb3IgdWludHB0cl90CisjZW5kaWYKKworI2lmbmRlZiBJTlRfVFlQRVNfREVGSU5FRAorI2RlZmluZSBJTlRfVFlQRVNfREVGSU5FRAorI2lmZGVmIENPTVBJTEVSX01TVkMKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjQ7Cit0eXBlZGVmIF9faW50NjQgaW50NjQ7CisjaWZuZGVmIElOVDY0X0MKKyNkZWZpbmUgSU5UNjRfQyh4KSB4ICMjIEk2NAorI2VuZGlmCisjaWZuZGVmIFVJTlQ2NF9DCisjZGVmaW5lIFVJTlQ2NF9DKHgpIHggIyMgVUk2NAorI2VuZGlmCisjZGVmaW5lIElOVDY0X0YgIkk2NCIKKyNlbHNlICAvLyBDT01QSUxFUl9NU1ZDCisjaWZkZWYgX19MUDY0X18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjQ7Cit0eXBlZGVmIGxvbmcgaW50NjQ7CisjaWZuZGVmIElOVDY0X0MKKyNkZWZpbmUgSU5UNjRfQyh4KSB4ICMjIEwKKyNlbmRpZgorI2lmbmRlZiBVSU5UNjRfQworI2RlZmluZSBVSU5UNjRfQyh4KSB4ICMjIFVMCisjZW5kaWYKKyNkZWZpbmUgSU5UNjRfRiAibCIKKyNlbHNlICAvLyBfX0xQNjRfXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0OwordHlwZWRlZiBsb25nIGxvbmcgaW50NjQ7CisjaWZuZGVmIElOVDY0X0MKKyNkZWZpbmUgSU5UNjRfQyh4KSB4ICMjIExMCisjZW5kaWYKKyNpZm5kZWYgVUlOVDY0X0MKKyNkZWZpbmUgVUlOVDY0X0MoeCkgeCAjIyBVTEwKKyNlbmRpZgorI2RlZmluZSBJTlQ2NF9GICJsbCIKKyNlbmRpZiAgLy8gX19MUDY0X18KKyNlbmRpZiAgLy8gQ09NUElMRVJfTVNWQwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwordHlwZWRlZiBpbnQgaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNjsKK3R5cGVkZWYgc2hvcnQgaW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7Cit0eXBlZGVmIGNoYXIgaW50ODsKKyNlbmRpZiAgLy8gSU5UX1RZUEVTX0RFRklORUQKKworLy8gRGV0ZWN0IGNvbXBpbGVyIGlzIGZvciB4ODYgb3IgeDY0LgorI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpIHx8IFwKKyAgICBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpCisjZGVmaW5lIENQVV9YODYgMQorI2VuZGlmCisKKyNkZWZpbmUgQUxJR05QKHAsIHQpIFwKKyAgKCh1aW50OCopKCgoKHVpbnRwdHJfdCkocCkgKyBcCisgICgodCktMSkpICYgfigodCktMSkpKSkKKworI2VuZGlmIC8vIElOQ0xVREVfTElCWVVWX0JBU0lDX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvbGlieXV2L2luY2x1ZGUvbGlieXV2L2NwdV9pZC5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9jcHVfaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTUzYjViCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9jcHVfaWQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgTGliWXV2IHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX0xJQllVVl9DUFVfSURfSF8KKyNkZWZpbmUgSU5DTFVERV9MSUJZVVZfQ1BVX0lEX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworbmFtZXNwYWNlIGxpYnl1diB7CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBUaGVzZSBmbGFncyBhcmUgb25seSB2YWxpZCBvbiB4ODYgcHJvY2Vzc29ycworc3RhdGljIGNvbnN0IGludCBrQ3B1SGFzU1NFMiA9IDE7CitzdGF0aWMgY29uc3QgaW50IGtDcHVIYXNTU1NFMyA9IDI7CisKKy8vIFRoZXNlIGZsYWdzIGFyZSBvbmx5IHZhbGlkIG9uIEFSTSBwcm9jZXNzb3JzCitzdGF0aWMgY29uc3QgaW50IGtDcHVIYXNORU9OID0gNDsKKworLy8gSW50ZXJuYWwgZmxhZyB0byBpbmRpY2F0ZSBjcHVpZCBpcyBpbml0aWFsaXplZC4KK3N0YXRpYyBjb25zdCBpbnQga0NwdUluaXRpYWxpemVkID0gODsKKworLy8gRGV0ZWN0IENQVSBoYXMgU1NFMiBldGMuCisvLyB0ZXN0X2ZsYWcgcGFyYW1ldGVyIHNob3VsZCBiZSBvbmUgb2Yga0NwdUhhcyBjb25zdGFudHMgYWJvdmUKKy8vIHJldHVybnMgbm9uLXplcm8gaWYgaW5zdHJ1Y3Rpb24gc2V0IGlzIGRldGVjdGVkCitzdGF0aWMgX19pbmxpbmUgaW50IFRlc3RDcHVGbGFnKGludCB0ZXN0X2ZsYWcpIHsKKyAgZXh0ZXJuIGludCBjcHVfaW5mb187CisgIGV4dGVybiBpbnQgSW5pdENwdUZsYWdzKCk7CisgIHJldHVybiAoY3B1X2luZm9fID8gY3B1X2luZm9fIDogSW5pdENwdUZsYWdzKCkpICYgdGVzdF9mbGFnOworfQorCisvLyBGb3IgdGVzdGluZywgYWxsb3cgQ1BVIGZsYWdzIHRvIGJlIGRpc2FibGVkLgorLy8gaWUgTWFza0NwdUZsYWdzKH5rQ3B1SGFzU1NTRTMpIHRvIGRpc2FibGUgU1NTRTMuCisvLyAtMSB0byBlbmFibGUgYWxsIGNwdSBzcGVjaWZpYyBvcHRpbWl6YXRpb25zLgorLy8gMCB0byBkaXNhYmxlIGFsbCBjcHUgc3BlY2lmaWMgb3B0aW1pemF0aW9ucy4KK3ZvaWQgTWFza0NwdUZsYWdzKGludCBlbmFibGVfZmxhZ3MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKK30gIC8vIG5hbWVzcGFjZSBsaWJ5dXYKKyNlbmRpZgorCisjZW5kaWYgIC8vIElOQ0xVREVfTElCWVVWX0NQVV9JRF9IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9zY2FsZS5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9zY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmUzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvbGlieXV2L2luY2x1ZGUvbGlieXV2L3NjYWxlLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIExpYll1diBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9MSUJZVVZfU0NBTEVfSF8KKyNkZWZpbmUgSU5DTFVERV9MSUJZVVZfU0NBTEVfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9iYXNpY190eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBsaWJ5dXYgeworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gU3VwcG9ydGVkIGZpbHRlcmluZwordHlwZWRlZiBlbnVtIHsKKyAga0ZpbHRlck5vbmUgPSAwLCAgLy8gUG9pbnQgc2FtcGxlOyBGYXN0ZXN0CisgIGtGaWx0ZXJCaWxpbmVhciA9IDEsICAvLyBGYXN0ZXIgdGhhbiBib3gsIGJ1dCBsb3dlciBxdWFsaXR5IHNjYWxpbmcgZG93bi4KKyAga0ZpbHRlckJveCA9IDIgIC8vIEhpZ2hlc3QgcXVhbGl0eQorfUZpbHRlck1vZGU7CisKKy8vIFNjYWxlcyBhIFlVViA0OjI6MCBpbWFnZSBmcm9tIHRoZSBzcmMgd2lkdGggYW5kIGhlaWdodCB0byB0aGUKKy8vIGRzdCB3aWR0aCBhbmQgaGVpZ2h0LgorLy8gSWYgZmlsdGVyaW5nIGlzIGtGaWx0ZXJOb25lLCBhIHNpbXBsZSBuZWFyZXN0LW5laWdoYm9yIGFsZ29yaXRobSBpcworLy8gdXNlZC4gVGhpcyBwcm9kdWNlcyBiYXNpYyAoYmxvY2t5KSBxdWFsaXR5IGF0IHRoZSBmYXN0ZXN0IHNwZWVkLgorLy8gSWYgZmlsdGVyaW5nIGlzIGtGaWx0ZXJCaWxpbmVhciwgaW50ZXJwb2xhdGlvbiBpcyB1c2VkIHRvIHByb2R1Y2UgYSBiZXR0ZXIKKy8vIHF1YWxpdHkgaW1hZ2UsIGF0IHRoZSBleHBlbnNlIG9mIHNwZWVkLgorLy8gSWYgZmlsdGVyaW5nIGlzIGtGaWx0ZXJCb3gsIGF2ZXJhZ2luZyBpcyB1c2VkIHRvIHByb2R1Y2UgZXZlciBiZXR0ZXIKKy8vIHF1YWxpdHkgaW1hZ2UsIGF0IGZ1cnRoZXIgZXhwZW5zZSBvZiBzcGVlZC4KKy8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgorCitpbnQgSTQyMFNjYWxlKGNvbnN0IHVpbnQ4KiBzcmNfeSwgaW50IHNyY19zdHJpZGVfeSwKKyAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyY191LCBpbnQgc3JjX3N0cmlkZV91LAorICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3YsIGludCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICB1aW50OCogZHN0X3ksIGludCBkc3Rfc3RyaWRlX3ksCisgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgaW50IGRzdF9zdHJpZGVfdSwKKyAgICAgICAgICAgICAgdWludDgqIGRzdF92LCBpbnQgZHN0X3N0cmlkZV92LAorICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgRmlsdGVyTW9kZSBmaWx0ZXJpbmcpOworCisvLyBMZWdhY3kgQVBJLiAgRGVwcmVjYXRlZAoraW50IFNjYWxlKGNvbnN0IHVpbnQ4KiBzcmNfeSwgY29uc3QgdWludDgqIHNyY191LCBjb25zdCB1aW50OCogc3JjX3YsCisgICAgICAgICAgaW50IHNyY19zdHJpZGVfeSwgaW50IHNyY19zdHJpZGVfdSwgaW50IHNyY19zdHJpZGVfdiwKKyAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICB1aW50OCogZHN0X3ksIHVpbnQ4KiBkc3RfdSwgdWludDgqIGRzdF92LAorICAgICAgICAgIGludCBkc3Rfc3RyaWRlX3ksIGludCBkc3Rfc3RyaWRlX3UsIGludCBkc3Rfc3RyaWRlX3YsCisgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCisgICAgICAgICAgaW50IGludGVycG9sYXRlKTsKKworLy8gTGVnYWN5IEFQSS4gIERlcHJlY2F0ZWQKK2ludCBTY2FsZU9mZnNldChjb25zdCB1aW50OCogc3JjLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICB1aW50OCogZHN0LCBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF95b2Zmc2V0LAorICAgICAgICAgICAgICAgIGludCBpbnRlcnBvbGF0ZSk7CisKKy8vIEZvciB0ZXN0aW5nLCBhbGxvdyBkaXNhYmxpbmcgb2Ygb3B0aW1pemF0aW9ucy4KK3ZvaWQgU2V0VXNlUmVmZXJlbmNlSW1wbChpbnQgdXNlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCit9ICAvLyBuYW1lc3BhY2UgbGlieXV2CisjZW5kaWYKKworI2VuZGlmIC8vIElOQ0xVREVfTElCWVVWX1NDQUxFX0hfCmRpZmYgLS1naXQgYS9saWJ2cHgvdGhpcmRfcGFydHkvbGlieXV2L3NvdXJjZS9jcHVfaWQuYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvc291cmNlL2NwdV9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjY2YzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdGhpcmRfcGFydHkvbGlieXV2L3NvdXJjZS9jcHVfaWQuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgTGliWXV2IHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9jcHVfaWQuaCIKKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50cmluLmg+CisjZW5kaWYKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGNwdS1mZWF0dXJlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ5dXYvaW5jbHVkZS9saWJ5dXYvYmFzaWNfdHlwZXMuaCIgIC8vIGZvciBDUFVfWDg2CisKKy8vIFRPRE8oZmJhcmNoYXJkKTogVXNlIGNwdWlkLmggd2hlbiBnY2MgNC40IGlzIHVzZWQgb24gT1NYIGFuZCBMaW51eC4KKyNpZiAoZGVmaW5lZChfX3BpY19fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykpICYmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVpZChpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgICAibW92ICUlZWJ4LCAlJWVkaSAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImNwdWlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ4Y2hnICUlZWRpLCAlJWVieCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPUQiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCisgICAgOiAiYSIoaW5mb190eXBlKQorICApOworfQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIGlubGluZSB2b2lkIF9fY3B1aWQoaW50IGNwdV9pbmZvWzRdLCBpbnQgaW5mb190eXBlKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICAgImNwdWlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgIDogIj1hIihjcHVfaW5mb1swXSksICI9YiIoY3B1X2luZm9bMV0pLCAiPWMiKGNwdV9pbmZvWzJdKSwgIj1kIihjcHVfaW5mb1szXSkKKyAgICA6ICJhIihpbmZvX3R5cGUpCisgICk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCituYW1lc3BhY2UgbGlieXV2IHsKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIENQVSBkZXRlY3QgZnVuY3Rpb24gZm9yIFNJTUQgaW5zdHJ1Y3Rpb24gc2V0cy4KK2ludCBjcHVfaW5mb18gPSAwOworCitpbnQgSW5pdENwdUZsYWdzKCkgeworI2lmZGVmIENQVV9YODYKKyAgaW50IGNwdV9pbmZvWzRdOworICBfX2NwdWlkKGNwdV9pbmZvLCAxKTsKKyAgY3B1X2luZm9fID0gKGNwdV9pbmZvWzNdICYgMHgwNDAwMDAwMCA/IGtDcHVIYXNTU0UyIDogMCkgfAorICAgICAgICAgICAgICAoY3B1X2luZm9bMl0gJiAweDAwMDAwMjAwID8ga0NwdUhhc1NTU0UzIDogMCkgfAorICAgICAgICAgICAgICBrQ3B1SW5pdGlhbGl6ZWQ7CisjZWxpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBkZWZpbmVkKF9fQVJNX05FT05fXykKKyAgdWludDY0X3QgZmVhdHVyZXMgPSBhbmRyb2lkX2dldENwdUZlYXR1cmVzKCk7CisgIGNwdV9pbmZvXyA9ICgoZmVhdHVyZXMgJiBBTkRST0lEX0NQVV9BUk1fRkVBVFVSRV9ORU9OKSA/IGtDcHVIYXNORU9OIDogMCkgfAorICAgICAgICAgICAgICBrQ3B1SW5pdGlhbGl6ZWQ7CisjZWxpZiBkZWZpbmVkKF9fQVJNX05FT05fXykKKyAgLy8gZ2NjIC1tZnB1PW5lb24gZGVmaW5lcyBfX0FSTV9ORU9OX18KKyAgLy8gRW5hYmxlIE5lb24gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgTmVvbiBhbmQgQXJtLCBhbmQgdXNlIE1hc2tDcHVGbGFncworICAvLyB0byBkaXNhYmxlIE5lb24gb24gZGV2aWNlcyB0aGF0IGRvIG5vdCBoYXZlIGl0LgorICBjcHVfaW5mb18gPSBrQ3B1SGFzTkVPTiB8IGtDcHVJbml0aWFsaXplZDsKKyNlbHNlCisgIGNwdV9pbmZvXyA9IGtDcHVJbml0aWFsaXplZDsKKyNlbmRpZgorICByZXR1cm4gY3B1X2luZm9fOworfQorCit2b2lkIE1hc2tDcHVGbGFncyhpbnQgZW5hYmxlX2ZsYWdzKSB7CisgIEluaXRDcHVGbGFncygpOworICBjcHVfaW5mb18gPSAoY3B1X2luZm9fICYgZW5hYmxlX2ZsYWdzKSB8IGtDcHVJbml0aWFsaXplZDsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCit9ICAvLyBuYW1lc3BhY2UgbGlieXV2CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvc291cmNlL3Jvdy5oIGIvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9zb3VyY2Uvcm93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiZTE4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvc291cmNlL3Jvdy5oCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgTGliWXV2IHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBMSUJZVVZfU09VUkNFX1JPV19IXworI2RlZmluZSBMSUJZVVZfU09VUkNFX1JPV19IXworCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlieXV2L2luY2x1ZGUvbGlieXV2L2Jhc2ljX3R5cGVzLmgiCisKKyNkZWZpbmUga01heFN0cmlkZSAoMjA0OCAqIDQpCisjZGVmaW5lIElTX0FMSUdORUQocCwgYSkgKCEoKHVpbnRwdHJfdCkocCkgJiAoKGEpIC0gMSkpKQorCisjaWYgZGVmaW5lZChDT1ZFUkFHRV9FTkFCTEVEKSB8fCBkZWZpbmVkKFRBUkdFVF9JUEhPTkVfU0lNVUxBVE9SKQorI2RlZmluZSBZVVZfRElTQUJMRV9BU00KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pICYmICFkZWZpbmVkKFlVVl9ESVNBQkxFX0FTTSkKKyNkZWZpbmUgSEFTX0ZBU1RDT05WRVJUWVVWVE9BUkdCUk9XX05FT04KK3ZvaWQgRmFzdENvbnZlcnRZVVZUb0FSR0JSb3dfTkVPTihjb25zdCB1aW50OCogeV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworI2RlZmluZSBIQVNfRkFTVENPTlZFUlRZVVZUT0JHUkFST1dfTkVPTgordm9pZCBGYXN0Q29udmVydFlVVlRvQkdSQVJvd19ORU9OKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7CisjZGVmaW5lIEhBU19GQVNUQ09OVkVSVFlVVlRPQUJHUlJPV19ORU9OCit2b2lkIEZhc3RDb252ZXJ0WVVWVG9BQkdSUm93X05FT04oY29uc3QgdWludDgqIHlfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKKyNlbmRpZgorCisvLyBUaGUgZm9sbG93aW5nIGFyZSBhdmFpbGFibGUgb24gYWxsIHg4NiBwbGF0Zm9ybXMKKyNpZiAoZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19pMzg2X18pKSAmJiBcCisgICAgIWRlZmluZWQoWVVWX0RJU0FCTEVfQVNNKQorI2RlZmluZSBIQVNfQUJHUlRPQVJHQlJPV19TU1NFMworI2RlZmluZSBIQVNfQkdSQVRPQVJHQlJPV19TU1NFMworI2RlZmluZSBIQVNfQkcyNFRPQVJHQlJPV19TU1NFMworI2RlZmluZSBIQVNfUkFXVE9BUkdCUk9XX1NTU0UzCisjZGVmaW5lIEhBU19SR0IyNFRPWVJPV19TU1NFMworI2RlZmluZSBIQVNfUkFXVE9ZUk9XX1NTU0UzCisjZGVmaW5lIEhBU19SR0IyNFRPVVZST1dfU1NTRTMKKyNkZWZpbmUgSEFTX1JBV1RPVVZST1dfU1NTRTMKKyNkZWZpbmUgSEFTX0FSR0JUT1lST1dfU1NTRTMKKyNkZWZpbmUgSEFTX0JHUkFUT1lST1dfU1NTRTMKKyNkZWZpbmUgSEFTX0FCR1JUT1lST1dfU1NTRTMKKyNkZWZpbmUgSEFTX0FSR0JUT1VWUk9XX1NTU0UzCisjZGVmaW5lIEhBU19CR1JBVE9VVlJPV19TU1NFMworI2RlZmluZSBIQVNfQUJHUlRPVVZST1dfU1NTRTMKKyNkZWZpbmUgSEFTX0k0MDBUT0FSR0JST1dfU1NFMgorI2RlZmluZSBIQVNfRkFTVENPTlZFUlRZVE9BUkdCUk9XX1NTRTIKKyNkZWZpbmUgSEFTX0ZBU1RDT05WRVJUWVVWVE9BUkdCUk9XX1NTU0UzCisjZGVmaW5lIEhBU19GQVNUQ09OVkVSVFlVVlRPQkdSQVJPV19TU1NFMworI2RlZmluZSBIQVNfRkFTVENPTlZFUlRZVVZUT0FCR1JST1dfU1NTRTMKKyNkZWZpbmUgSEFTX0ZBU1RDT05WRVJUWVVWNDQ0VE9BUkdCUk9XX1NTU0UzCisjZGVmaW5lIEhBU19SRVZFUlNFX1JPV19TU1NFMworI2VuZGlmCisKKy8vIFRoZSBmb2xsb3dpbmcgYXJlIGF2YWlsYWJsZSBvbiBOZW9uIHBsYXRmb3JtcworI2lmIGRlZmluZWQoX19BUk1fTkVPTl9fKSAmJiAhZGVmaW5lZChZVVZfRElTQUJMRV9BU00pCisjZGVmaW5lIEhBU19SRVZFUlNFX1JPV19ORU9OCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCituYW1lc3BhY2UgbGlieXV2IHsKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBIQVNfQVJHQlRPWVJPV19TU1NFMwordm9pZCBBUkdCVG9ZUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYiwgdWludDgqIGRzdF95LCBpbnQgcGl4KTsKK3ZvaWQgQkdSQVRvWVJvd19TU1NFMyhjb25zdCB1aW50OCogc3JjX2FyZ2IsIHVpbnQ4KiBkc3RfeSwgaW50IHBpeCk7Cit2b2lkIEFCR1JUb1lSb3dfU1NTRTMoY29uc3QgdWludDgqIHNyY19hcmdiLCB1aW50OCogZHN0X3ksIGludCBwaXgpOwordm9pZCBBUkdCVG9VVlJvd19TU1NFMyhjb25zdCB1aW50OCogc3JjX2FyZ2IwLCBpbnQgc3JjX3N0cmlkZV9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3UsIHVpbnQ4KiBkc3RfdiwgaW50IHdpZHRoKTsKK3ZvaWQgQkdSQVRvVVZSb3dfU1NTRTMoY29uc3QgdWludDgqIHNyY19hcmdiMCwgaW50IHNyY19zdHJpZGVfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF91LCB1aW50OCogZHN0X3YsIGludCB3aWR0aCk7Cit2b2lkIEFCR1JUb1VWUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYjAsIGludCBzcmNfc3RyaWRlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgdWludDgqIGRzdF92LCBpbnQgd2lkdGgpOworI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQkcyNFRPQVJHQlJPV19TU1NFMykgJiYgZGVmaW5lZChIQVNfQVJHQlRPWVJPV19TU1NFMykKKyNkZWZpbmUgSEFTUkdCMjRUT1lST1dfU1NTRTMKKyNlbmRpZgorI2lmZGVmIEhBU1JHQjI0VE9ZUk9XX1NTU0UzCit2b2lkIFJHQjI0VG9ZUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYiwgdWludDgqIGRzdF95LCBpbnQgcGl4KTsKK3ZvaWQgUkFXVG9ZUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYiwgdWludDgqIGRzdF95LCBpbnQgcGl4KTsKK3ZvaWQgUkdCMjRUb1VWUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYjAsIGludCBzcmNfc3RyaWRlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3UsIHVpbnQ4KiBkc3RfdiwgaW50IHdpZHRoKTsKK3ZvaWQgUkFXVG9VVlJvd19TU1NFMyhjb25zdCB1aW50OCogc3JjX2FyZ2IwLCBpbnQgc3JjX3N0cmlkZV9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgdWludDgqIGRzdF92LCBpbnQgd2lkdGgpOworI2VuZGlmCisjaWZkZWYgSEFTX1JFVkVSU0VfUk9XX1NTU0UzCit2b2lkIFJldmVyc2VSb3dfU1NTRTMoY29uc3QgdWludDgqIHNyYywgdWludDgqIGRzdCwgaW50IHdpZHRoKTsKKyNlbmRpZgorI2lmZGVmIEhBU19SRVZFUlNFX1JPV19ORU9OCit2b2lkIFJldmVyc2VSb3dfTkVPTihjb25zdCB1aW50OCogc3JjLCB1aW50OCogZHN0LCBpbnQgd2lkdGgpOworI2VuZGlmCit2b2lkIFJldmVyc2VSb3dfQyhjb25zdCB1aW50OCogc3JjLCB1aW50OCogZHN0LCBpbnQgd2lkdGgpOworCit2b2lkIEFSR0JUb1lSb3dfQyhjb25zdCB1aW50OCogc3JjX2FyZ2IsIHVpbnQ4KiBkc3RfeSwgaW50IHBpeCk7Cit2b2lkIEJHUkFUb1lSb3dfQyhjb25zdCB1aW50OCogc3JjX2FyZ2IsIHVpbnQ4KiBkc3RfeSwgaW50IHBpeCk7Cit2b2lkIEFCR1JUb1lSb3dfQyhjb25zdCB1aW50OCogc3JjX2FyZ2IsIHVpbnQ4KiBkc3RfeSwgaW50IHBpeCk7Cit2b2lkIFJHQjI0VG9ZUm93X0MoY29uc3QgdWludDgqIHNyY19hcmdiLCB1aW50OCogZHN0X3ksIGludCBwaXgpOwordm9pZCBSQVdUb1lSb3dfQyhjb25zdCB1aW50OCogc3JjX2FyZ2IsIHVpbnQ4KiBkc3RfeSwgaW50IHBpeCk7Cit2b2lkIEFSR0JUb1VWUm93X0MoY29uc3QgdWludDgqIHNyY19hcmdiMCwgaW50IHNyY19zdHJpZGVfYXJnYiwKKyAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3UsIHVpbnQ4KiBkc3RfdiwgaW50IHdpZHRoKTsKK3ZvaWQgQkdSQVRvVVZSb3dfQyhjb25zdCB1aW50OCogc3JjX2FyZ2IwLCBpbnQgc3JjX3N0cmlkZV9hcmdiLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgdWludDgqIGRzdF92LCBpbnQgd2lkdGgpOwordm9pZCBBQkdSVG9VVlJvd19DKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYjAsIGludCBzcmNfc3RyaWRlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF91LCB1aW50OCogZHN0X3YsIGludCB3aWR0aCk7Cit2b2lkIFJHQjI0VG9VVlJvd19DKGNvbnN0IHVpbnQ4KiBzcmNfYXJnYjAsIGludCBzcmNfc3RyaWRlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgdWludDgqIGRzdF92LCBpbnQgd2lkdGgpOwordm9pZCBSQVdUb1VWUm93X0MoY29uc3QgdWludDgqIHNyY19hcmdiMCwgaW50IHNyY19zdHJpZGVfYXJnYiwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgdWludDgqIGRzdF92LCBpbnQgd2lkdGgpOworCisjaWZkZWYgSEFTX0JHMjRUT0FSR0JST1dfU1NTRTMKK3ZvaWQgQUJHUlRvQVJHQlJvd19TU1NFMyhjb25zdCB1aW50OCogc3JjX2FiZ3IsIHVpbnQ4KiBkc3RfYXJnYiwgaW50IHBpeCk7Cit2b2lkIEJHUkFUb0FSR0JSb3dfU1NTRTMoY29uc3QgdWludDgqIHNyY19iZ3JhLCB1aW50OCogZHN0X2FyZ2IsIGludCBwaXgpOwordm9pZCBCRzI0VG9BUkdCUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYmcyNCwgdWludDgqIGRzdF9hcmdiLCBpbnQgcGl4KTsKK3ZvaWQgUkFXVG9BUkdCUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfYmcyNCwgdWludDgqIGRzdF9hcmdiLCBpbnQgcGl4KTsKKyNlbmRpZgordm9pZCBBQkdSVG9BUkdCUm93X0MoY29uc3QgdWludDgqIHNyY19hYmdyLCB1aW50OCogZHN0X2FyZ2IsIGludCBwaXgpOwordm9pZCBCR1JBVG9BUkdCUm93X0MoY29uc3QgdWludDgqIHNyY19iZ3JhLCB1aW50OCogZHN0X2FyZ2IsIGludCBwaXgpOwordm9pZCBCRzI0VG9BUkdCUm93X0MoY29uc3QgdWludDgqIHNyY19iZzI0LCB1aW50OCogZHN0X2FyZ2IsIGludCBwaXgpOwordm9pZCBSQVdUb0FSR0JSb3dfQyhjb25zdCB1aW50OCogc3JjX2JnMjQsIHVpbnQ4KiBkc3RfYXJnYiwgaW50IHBpeCk7CisKKyNpZmRlZiBIQVNfSTQwMFRPQVJHQlJPV19TU0UyCit2b2lkIEk0MDBUb0FSR0JSb3dfU1NFMihjb25zdCB1aW50OCogc3JjX3ksIHVpbnQ4KiBkc3RfYXJnYiwgaW50IHBpeCk7CisjZW5kaWYKK3ZvaWQgSTQwMFRvQVJHQlJvd19DKGNvbnN0IHVpbnQ4KiBzcmNfeSwgdWludDgqIGRzdF9hcmdiLCBpbnQgcGl4KTsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFNJTURfQUxJR05FRCh2YXIpIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB2YXIKK3R5cGVkZWYgX19kZWNsc3BlYyhhbGlnbigxNikpIHNpZ25lZCBjaGFyIHZlYzhbMTZdOwordHlwZWRlZiBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdW5zaWduZWQgY2hhciB1dmVjOFsxNl07Cit0eXBlZGVmIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSBzaWduZWQgc2hvcnQgdmVjMTZbOF07CisjZWxzZSAvLyBfX0dOVUNfXworI2RlZmluZSBTSU1EX0FMSUdORUQodmFyKSB2YXIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQordHlwZWRlZiBzaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSB2ZWM4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHV2ZWM4OwordHlwZWRlZiBzaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgdmVjMTY7CisjZW5kaWYKKworLy9leHRlcm4gIkMiCitTSU1EX0FMSUdORUQoY29uc3QgaW50MTYga0NvZWZmaWNpZW50c1JnYllbNzY4XVs0XSk7CisvL2V4dGVybiAiQyIKK1NJTURfQUxJR05FRChjb25zdCBpbnQxNiBrQ29lZmZpY2llbnRzQmdyYVlbNzY4XVs0XSk7CisvL2V4dGVybiAiQyIKK1NJTURfQUxJR05FRChjb25zdCBpbnQxNiBrQ29lZmZpY2llbnRzQWJncllbNzY4XVs0XSk7CisKK3ZvaWQgRmFzdENvbnZlcnRZVVZUb0FSR0JSb3dfQyhjb25zdCB1aW50OCogeV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCit2b2lkIEZhc3RDb252ZXJ0WVVWVG9CR1JBUm93X0MoY29uc3QgdWludDgqIHlfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKKwordm9pZCBGYXN0Q29udmVydFlVVlRvQUJHUlJvd19DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7CisKK3ZvaWQgRmFzdENvbnZlcnRZVVY0NDRUb0FSR0JSb3dfQyhjb25zdCB1aW50OCogeV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCit2b2lkIEZhc3RDb252ZXJ0WVRvQVJHQlJvd19DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7CisKKyNpZmRlZiBIQVNfRkFTVENPTlZFUlRZVVZUT0FSR0JST1dfU1NFMgordm9pZCBGYXN0Q29udmVydFlVVlRvQVJHQlJvd19TU0UyKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7CisKK3ZvaWQgRmFzdENvbnZlcnRZVVZUb0FSR0JSb3c0X1NTRTIoY29uc3QgdWludDgqIHlfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7CisKK3ZvaWQgRmFzdENvbnZlcnRZVVZUb0JHUkFSb3dfU1NFMihjb25zdCB1aW50OCogeV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCit2b2lkIEZhc3RDb252ZXJ0WVVWVG9BQkdSUm93X1NTRTIoY29uc3QgdWludDgqIHlfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKKwordm9pZCBGYXN0Q29udmVydFlVVjQ0NFRvQVJHQlJvd19TU0UyKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7CisKK3ZvaWQgRmFzdENvbnZlcnRZVG9BUkdCUm93X1NTRTIoY29uc3QgdWludDgqIHlfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX0ZBU1RDT05WRVJUWVVWVE9BUkdCUk9XX1NTU0UzCit2b2lkIEZhc3RDb252ZXJ0WVVWVG9BUkdCUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCit2b2lkIEZhc3RDb252ZXJ0WVVWVG9CR1JBUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCit2b2lkIEZhc3RDb252ZXJ0WVVWVG9BQkdSUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCit2b2lkIEZhc3RDb252ZXJ0WVVWNDQ0VG9BUkdCUm93X1NTU0UzKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCisjZW5kaWYKKworI2lmZGVmIEhBU19GQVNUQ09OVkVSVFlUT0FSR0JST1dfU1NFMgordm9pZCBGYXN0Q29udmVydFlUb0FSR0JSb3dfU1NFMihjb25zdCB1aW50OCogeV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOworCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCit9ICAvLyBuYW1lc3BhY2UgbGlieXV2CisjZW5kaWYKKworI2VuZGlmICAvLyBMSUJZVVZfU09VUkNFX1JPV19IXwpkaWZmIC0tZ2l0IGEvbGlidnB4L3RoaXJkX3BhcnR5L2xpYnl1di9zb3VyY2Uvc2NhbGUuYyBiL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvc291cmNlL3NjYWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0MmExNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC90aGlyZF9wYXJ0eS9saWJ5dXYvc291cmNlL3NjYWxlLmMKQEAgLTAsMCArMSwzODg0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgTGliWXV2IHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9zY2FsZS5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ5dXYvaW5jbHVkZS9saWJ5dXYvY3B1X2lkLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlieXV2L3NvdXJjZS9yb3cuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCituYW1lc3BhY2UgbGlieXV2IHsKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBOb3RlOiBEZWZpbmluZyBZVVZfRElTQUJMRV9BU00gYWxsb3dzIHRvIHVzZSBjIHZlcnNpb24uCisgKi8KKy8vI2RlZmluZSBZVVZfRElTQUJMRV9BU00KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIEFMSUdOMTYodmFyKSBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdmFyCisjZWxzZQorI2RlZmluZSBBTElHTjE2KHZhcikgdmFyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkKKyNlbmRpZgorCisvLyBOb3RlOiBBIE5lb24gcmVmZXJlbmNlIG1hbnVhbAorLy8gaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZHVpMDIwNGovQ0pBSklJR0cuaHRtbAorLy8gTm90ZTogU29tZSBTU0UyIHJlZmVyZW5jZSBtYW51YWxzCisvLyBjcHV2b2wxLnBkZiBhZ25lcl9pbnN0cnVjdGlvbl90YWJsZXMucGRmIDI1MzY2Ni5wZGYgMjUzNjY3LnBkZgorCisvLyBTZXQgdGhlIGZvbGxvd2luZyBmbGFnIHRvIHRydWUgdG8gcmV2ZXJ0IHRvIG9ubHkKKy8vIHVzaW5nIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gU2NhbGVQbGFuZUJveCgpLCBhbmQKKy8vIE5PVCB0aGUgb3B0aW1pemVkIHZlcnNpb25zLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQKKy8vIHdoZW4gY29tcGFyaW5nIHRoZSBxdWFsaXR5IG9mIHRoZSByZXN1bHRpbmcgWVVWIHBsYW5lcworLy8gYXMgcHJvZHVjZWQgYnkgdGhlIG9wdGltaXplZCBhbmQgbm9uLW9wdGltaXplZCB2ZXJzaW9ucy4KKworc3RhdGljIGludCB1c2VfcmVmZXJlbmNlX2ltcGxfID0gMDsKKwordm9pZCBTZXRVc2VSZWZlcmVuY2VJbXBsKGludCB1c2UpIHsKKyAgdXNlX3JlZmVyZW5jZV9pbXBsXyA9IHVzZTsKK30KKworLy8gU2NhbGVSb3dEb3duMkludCBhbHNvIHVzZWQgYnkgcGxhbmFyIGZ1bmN0aW9ucworCisvKioKKyAqIE5FT04gZG93bnNjYWxlcnMgd2l0aCBpbnRlcnBvbGF0aW9uLgorICoKKyAqIFByb3ZpZGVkIGJ5IEZyaXR6IEtvZW5pZworICoKKyAqLworCisjaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pICYmICFkZWZpbmVkKFlVVl9ESVNBQkxFX0FTTSkKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjJfTkVPTgordm9pZCBTY2FsZVJvd0Rvd24yX05FT04oY29uc3QgdWludDgqIHNyY19wdHIsIGludCAgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3QsIGludCBkc3Rfd2lkdGgpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDIudTggICAge3EwLHExfSwgWyUwXSEgICAgICAgICAgICAgICAgIFxuIiAgLy8gbG9hZCBldmVuIHBpeGVscyBpbnRvIHEwLCBvZGQgaW50byBxMQorICAgICJ2c3QxLnU4ICAgIHtxMH0sIFslMV0hICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHN0b3JlIGV2ZW4gcGl4ZWxzCisgICAgInN1YnMgICAgICAgJTIsICUyLCAjMTYgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gMTYgcHJvY2Vzc2VkIHBlciBsb29wCisgICAgImJoaSAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgIDogIityIihzcmNfcHRyKSwgICAgICAgICAgLy8gJTAKKyAgICAgICIrciIoZHN0KSwgICAgICAgICAgICAgIC8vICUxCisgICAgICAiK3IiKGRzdF93aWR0aCkgICAgICAgICAvLyAlMgorICAgIDoKKyAgICA6ICJxMCIsICJxMSIgICAgICAgICAgICAgIC8vIENsb2JiZXIgTGlzdAorICApOworfQorCit2b2lkIFNjYWxlUm93RG93bjJJbnRfTkVPTihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0LCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICAgImFkZCAgICAgICAgJTEsICUwICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gY2hhbmdlIHRoZSBzdHJpZGUgdG8gcm93IDIgcG9pbnRlcgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmxkMS51OCAgICB7cTAscTF9LCBbJTBdISAgICAgICAgICAgICAgICAgXG4iICAvLyBsb2FkIHJvdyAxIGFuZCBwb3N0IGluY3JlbWVudAorICAgICJ2bGQxLnU4ICAgIHtxMixxM30sIFslMV0hICAgICAgICAgICAgICAgICBcbiIgIC8vIGxvYWQgcm93IDIgYW5kIHBvc3QgaW5jcmVtZW50CisgICAgInZwYWRkbC51OCAgcTAsIHEwICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcm93IDEgYWRkIGFkamFjZW50CisgICAgInZwYWRkbC51OCAgcTEsIHExICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cGFkYWwudTggIHEwLCBxMiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHJvdyAyIGFkZCBhZGphY2VudCwgYWRkIHJvdyAxIHRvIHJvdyAyCisgICAgInZwYWRhbC51OCAgcTEsIHEzICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNocm4udTE2IGQwLCBxMCwgIzIgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIGRvd25zaGlmdCwgcm91bmQgYW5kIHBhY2sKKyAgICAidnJzaHJuLnUxNiBkMSwgcTEsICMyICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZzdDEudTggICAge3EwfSwgWyUyXSEgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJzdWJzICAgICAgICUzLCAlMywgIzE2ICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIDE2IHByb2Nlc3NlZCBwZXIgbG9vcAorICAgICJiaGkgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICA6ICIrciIoc3JjX3B0ciksICAgICAgICAgIC8vICUwCisgICAgICAiK3IiKHNyY19zdHJpZGUpLCAgICAgICAvLyAlMQorICAgICAgIityIihkc3QpLCAgICAgICAgICAgICAgLy8gJTIKKyAgICAgICIrciIoZHN0X3dpZHRoKSAgICAgICAgIC8vICUzCisgICAgOgorICAgIDogInEwIiwgInExIiwgInEyIiwgInEzIiAgICAgLy8gQ2xvYmJlciBMaXN0CisgICApOworfQorCisjZGVmaW5lIEhBU19TQ0FMRVJPV0RPV040X05FT04KK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjRfTkVPTihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDIudTggICAge2QwLCBkMX0sIFslMF0hICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLnU4ICAgIGQxLCBkMCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnNocm4udTE2ICBkMCwgcTAsICM4ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZzdDEudTMyICAge2QwWzFdfSwgWyUxXSEgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInN1YnMgICAgICAgJTIsICM0ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJiaGkgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICA6ICIrciIoc3JjX3B0ciksICAgICAgICAgIC8vICUwCisgICAgICAiK3IiKGRzdF9wdHIpLCAgICAgICAgICAvLyAlMQorICAgICAgIityIihkc3Rfd2lkdGgpICAgICAgICAgLy8gJTIKKyAgICA6CisgICAgOiAicTAiLCAicTEiLCAibWVtb3J5IiwgImNjIgorICApOworfQorCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd240SW50X05FT04oY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICAgImFkZCAgICAgICAgcjQsICUwLCAlMyAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJhZGQgICAgICAgIHI1LCByNCwgJTMgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiYWRkICAgICAgICAlMywgcjUsICUzICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bGQxLnU4ICAgIHtxMH0sIFslMF0hICAgICAgICAgICAgICAgICAgICBcbiIgICAvLyBsb2FkIHVwIDE2eDQgYmxvY2sgb2YgaW5wdXQgZGF0YQorICAgICJ2bGQxLnU4ICAgIHtxMX0sIFtyNF0hICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmxkMS51OCAgICB7cTJ9LCBbcjVdISAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDEudTggICAge3EzfSwgWyUzXSEgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZwYWRkbC51OCAgcTAsIHEwICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cGFkYWwudTggIHEwLCBxMSAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnBhZGFsLnU4ICBxMCwgcTIgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZwYWRhbC51OCAgcTAsIHEzICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZwYWRkbC51MTYgcTAsIHEwICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZyc2hybi51MzIgZDAsIHEwLCAjNCAgICAgICAgICAgICAgICAgICAgIFxuIiAgIC8vIGRpdmlkZSBieSAxNiB3L3JvdW5kaW5nCisKKyAgICAidm1vdm4udTE2ICBkMCwgcTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZzdDEudTMyICAge2QwWzBdfSwgWyUxXSEgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInN1YnMgICAgICAgJTIsICM0ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJiaGkgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIDogIityIihzcmNfcHRyKSwgICAgICAgICAgLy8gJTAKKyAgICAgICIrciIoZHN0X3B0ciksICAgICAgICAgIC8vICUxCisgICAgICAiK3IiKGRzdF93aWR0aCkgICAgICAgICAvLyAlMgorICAgIDogInIiKHNyY19zdHJpZGUpICAgICAgICAgLy8gJTMKKyAgICA6ICJyNCIsICJyNSIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJtZW1vcnkiLCAiY2MiCisgICk7Cit9CisKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjM0X05FT04KKy8vIERvd24gc2NhbGUgZnJvbSA0IHRvIDMgcGl4ZWxzLiAgVXNlIHRoZSBuZW9uIG11bHRpbGFuZSByZWFkL3dyaXRlCisvLyAgdG8gbG9hZCB1cCB0aGUgZXZlcnkgNHRoIHBpeGVsIGludG8gYSA0IGRpZmZlcmVudCByZWdpc3RlcnMuCisvLyBQb2ludCBzYW1wbGVzIDMyIHBpeGVscyB0byAyNCBwaXhlbHMuCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zNF9ORU9OKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDQudTggICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbJTBdISAgICAgIFxuIiAvLyBzcmMgbGluZSAwCisgICAgInZtb3YgICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgICAgIFxuIiAvLyBvcmRlciBuZWVkcyB0byBiZSBkMCwgZDEsIGQyCisgICAgInZzdDMudTggICAgICB7ZDAsIGQxLCBkMn0sIFslMV0hICAgICAgICAgIFxuIgorICAgICJzdWJzICAgICAgICAgJTIsICMyNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiYmhpICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgOiAiK3IiKHNyY19wdHIpLCAgICAgICAgICAvLyAlMAorICAgICAgIityIihkc3RfcHRyKSwgICAgICAgICAgLy8gJTEKKyAgICAgICIrciIoZHN0X3dpZHRoKSAgICAgICAgIC8vICUyCisgICAgOgorICAgIDogImQwIiwgImQxIiwgImQyIiwgImQzIiwgIm1lbW9yeSIsICJjYyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duMzRfMF9JbnRfTkVPTihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICAgInZtb3YudTggICAgICBkMjQsICMzICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJhZGQgICAgICAgICAgJTMsICUwICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDQudTggICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbJTBdISAgICAgIFxuIiAvLyBzcmMgbGluZSAwCisgICAgInZsZDQudTggICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbJTNdISAgICAgIFxuIiAvLyBzcmMgbGluZSAxCisKKyAgICAvLyBmaWx0ZXIgc3JjIGxpbmUgMCB3aXRoIHNyYyBsaW5lIDEKKyAgICAvLyBleHBhbmQgY2hhcnMgdG8gc2hvcnRzIHRvIGFsbG93IGZvciByb29tCisgICAgLy8gd2hlbiBhZGRpbmcgbGluZXMgdG9nZXRoZXIKKyAgICAidm1vdmwudTggICAgIHE4LCBkNCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZtb3ZsLnU4ICAgICBxOSwgZDUgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bW92bC51OCAgICAgcTEwLCBkNiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1vdmwudTggICAgIHExMSwgZDcgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyAzICogbGluZV8wICsgbGluZV8xCisgICAgInZtbGFsLnU4ICAgICBxOCwgZDAsIGQyNCAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bWxhbC51OCAgICAgcTksIGQxLCBkMjQgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1sYWwudTggICAgIHExMCwgZDIsIGQyNCAgICAgICAgICAgICAgICAgXG4iCisgICAgInZtbGFsLnU4ICAgICBxMTEsIGQzLCBkMjQgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gKDMgKiBsaW5lXzAgKyBsaW5lXzEpID4+IDIKKyAgICAidnFyc2hybi51MTYgIGQwLCBxOCwgIzIgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxcnNocm4udTE2ICBkMSwgcTksICMyICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXJzaHJuLnUxNiAgZDIsIHExMCwgIzIgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFyc2hybi51MTYgIGQzLCBxMTEsICMyICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBhMCA9IChzcmNbMF0gKiAzICsgc1sxXSAqIDEpID4+IDIKKyAgICAidm1vdmwudTggICAgIHE4LCBkMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZtbGFsLnU4ICAgICBxOCwgZDAsIGQyNCAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXJzaHJuLnUxNiAgZDAsIHE4LCAjMiAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGExID0gKHNyY1sxXSAqIDEgKyBzWzJdICogMSkgPj4gMQorICAgICJ2cmhhZGQudTggICAgZDEsIGQxLCBkMiAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGEyID0gKHNyY1syXSAqIDEgKyBzWzNdICogMykgPj4gMgorICAgICJ2bW92bC51OCAgICAgcTgsIGQyICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1sYWwudTggICAgIHE4LCBkMywgZDI0ICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxcnNocm4udTE2ICBkMiwgcTgsICMyICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzdDMudTggICAgICB7ZDAsIGQxLCBkMn0sIFslMV0hICAgICAgICAgIFxuIgorCisgICAgInN1YnMgICAgICAgICAlMiwgIzI0ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJiaGkgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICA6ICIrciIoc3JjX3B0ciksICAgICAgICAgIC8vICUwCisgICAgICAiK3IiKGRzdF9wdHIpLCAgICAgICAgICAvLyAlMQorICAgICAgIityIihkc3Rfd2lkdGgpLCAgICAgICAgLy8gJTIKKyAgICAgICIrciIoc3JjX3N0cmlkZSkgICAgICAgIC8vICUzCisgICAgOgorICAgIDogInEwIiwgInExIiwgInEyIiwgInEzIiwgInE4IiwgInE5IiwgInExMCIsICJxMTEiLCAiZDI0IiwgIm1lbW9yeSIsICJjYyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duMzRfMV9JbnRfTkVPTihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICAgInZtb3YudTggICAgICBkMjQsICMzICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJhZGQgICAgICAgICAgJTMsICUwICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDQudTggICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbJTBdISAgICAgIFxuIiAvLyBzcmMgbGluZSAwCisgICAgInZsZDQudTggICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbJTNdISAgICAgIFxuIiAvLyBzcmMgbGluZSAxCisKKyAgICAvLyBhdmVyYWdlIHNyYyBsaW5lIDAgd2l0aCBzcmMgbGluZSAxCisgICAgInZyaGFkZC51OCAgICBxMCwgcTAsIHEyICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cmhhZGQudTggICAgcTEsIHExLCBxMyAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGEwID0gKHNyY1swXSAqIDMgKyBzWzFdICogMSkgPj4gMgorICAgICJ2bW92bC51OCAgICAgcTMsIGQxICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1sYWwudTggICAgIHEzLCBkMCwgZDI0ICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxcnNocm4udTE2ICBkMCwgcTMsICMyICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gYTEgPSAoc3JjWzFdICogMSArIHNbMl0gKiAxKSA+PiAxCisgICAgInZyaGFkZC51OCAgICBkMSwgZDEsIGQyICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gYTIgPSAoc3JjWzJdICogMSArIHNbM10gKiAzKSA+PiAyCisgICAgInZtb3ZsLnU4ICAgICBxMywgZDIgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bWxhbC51OCAgICAgcTMsIGQzLCBkMjQgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFyc2hybi51MTYgIGQyLCBxMywgIzIgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnN0My51OCAgICAgIHtkMCwgZDEsIGQyfSwgWyUxXSEgICAgICAgICAgXG4iCisKKyAgICAic3VicyAgICAgICAgICUyLCAjMjQgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImJoaSAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgIDogIityIihzcmNfcHRyKSwgICAgICAgICAgLy8gJTAKKyAgICAgICIrciIoZHN0X3B0ciksICAgICAgICAgIC8vICUxCisgICAgICAiK3IiKGRzdF93aWR0aCksICAgICAgICAvLyAlMgorICAgICAgIityIihzcmNfc3RyaWRlKSAgICAgICAgLy8gJTMKKyAgICA6CisgICAgOiAicjQiLCAicTAiLCAicTEiLCAicTIiLCAicTMiLCAiZDI0IiwgIm1lbW9yeSIsICJjYyIKKyAgKTsKK30KKworI2RlZmluZSBIQVNfU0NBTEVST1dET1dOMzhfTkVPTgorY29uc3QgdWludDggc2h1ZjM4WzE2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSA9CisgIHsgMCwgMywgNiwgOCwgMTEsIDE0LCAxNiwgMTksIDIyLCAyNCwgMjcsIDMwLCAwLCAwLCAwLCAwIH07Citjb25zdCB1aW50OCBzaHVmMzhfMlsxNl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgPQorICB7IDAsIDgsIDE2LCAyLCAxMCwgMTcsIDQsIDEyLCAxOCwgNiwgMTQsIDE5LCAwLCAwLCAwLCAwIH07Citjb25zdCB1bnNpZ25lZCBzaG9ydCBtdWx0MzhfZGl2Nls4XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSA9CisgIHsgNjU1MzYgLyAxMiwgNjU1MzYgLyAxMiwgNjU1MzYgLyAxMiwgNjU1MzYgLyAxMiwKKyAgICA2NTUzNiAvIDEyLCA2NTUzNiAvIDEyLCA2NTUzNiAvIDEyLCA2NTUzNiAvIDEyIH07Citjb25zdCB1bnNpZ25lZCBzaG9ydCBtdWx0MzhfZGl2OVs4XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSA9CisgIHsgNjU1MzYgLyAxOCwgNjU1MzYgLyAxOCwgNjU1MzYgLyAxOCwgNjU1MzYgLyAxOCwKKyAgICA2NTUzNiAvIDE4LCA2NTUzNiAvIDE4LCA2NTUzNiAvIDE4LCA2NTUzNiAvIDE4IH07CisKKy8vIDMyIC0+IDEyCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF9ORU9OKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgICAidmxkMS51OCAgICAgIHtxM30sIFslM10gICAgICAgICAgICAgICAgICAgXG4iCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bGQxLnU4ICAgICAge2QwLCBkMSwgZDIsIGQzfSwgWyUwXSEgICAgICBcbiIKKyAgICAidnRibC51OCAgICAgIGQ0LCB7ZDAsIGQxLCBkMiwgZDN9LCBkNiAgICAgXG4iCisgICAgInZ0YmwudTggICAgICBkNSwge2QwLCBkMSwgZDIsIGQzfSwgZDcgICAgIFxuIgorICAgICJ2c3QxLnU4ICAgICAge2Q0fSwgWyUxXSEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnN0MS51MzIgICAgIHtkNVswXX0sIFslMV0hICAgICAgICAgICAgICAgXG4iCisgICAgInN1YnMgICAgICAgICAlMiwgIzEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJiaGkgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICA6ICIrciIoc3JjX3B0ciksICAgICAgICAgIC8vICUwCisgICAgICAiK3IiKGRzdF9wdHIpLCAgICAgICAgICAvLyAlMQorICAgICAgIityIihkc3Rfd2lkdGgpICAgICAgICAgLy8gJTIKKyAgICA6ICJyIihzaHVmMzgpICAgICAgICAgICAgIC8vICUzCisgICAgOiAiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiZDQiLCAiZDUiLCAibWVtb3J5IiwgImNjIgorICApOworfQorCisvLyAzMngzIC0+IDEyeDEKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM4XzNfSW50X05FT04oY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBhc20gdm9sYXRpbGUgKAorICAgICJ2bGQxLnUxNiAgICAge3ExM30sIFslNF0gICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmxkMS51OCAgICAgIHtxMTR9LCBbJTVdICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZsZDEudTggICAgICB7cTE1fSwgWyU2XSAgICAgICAgICAgICAgICAgIFxuIgorICAgICJhZGQgICAgICAgICAgcjQsICUwLCAlMywgbHNsICMxICAgICAgICAgICBcbiIKKyAgICAiYWRkICAgICAgICAgICUzLCAlMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDAgPSAwMCA0MCAwMSA0MSAwMiA0MiAwMyA0MworICAgIC8vIGQxID0gMTAgNTAgMTEgNTEgMTIgNTIgMTMgNTMKKyAgICAvLyBkMiA9IDIwIDYwIDIxIDYxIDIyIDYyIDIzIDYzCisgICAgLy8gZDMgPSAzMCA3MCAzMSA3MSAzMiA3MiAzMyA3MworICAgICJ2bGQ0LnU4ICAgICAge2QwLCBkMSwgZDIsIGQzfSwgWyUwXSEgICAgICBcbiIKKyAgICAidmxkNC51OCAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFslM10hICAgICAgXG4iCisgICAgInZsZDQudTggICAgICB7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3I0XSEgIFxuIgorCisgICAgLy8gU2h1ZmZsZSB0aGUgaW5wdXQgZGF0YSBhcm91bmQgdG8gZ2V0IGFsaWduIHRoZSBkYXRhCisgICAgLy8gIHNvIGFkamFjZW50IGRhdGEgY2FuIGJlIGFkZGVkLiAgMCwxIC0gMiwzIC0gNCw1IC0gNiw3CisgICAgLy8gZDAgPSAwMCAxMCAwMSAxMSAwMiAxMiAwMyAxMworICAgIC8vIGQxID0gNDAgNTAgNDEgNTEgNDIgNTIgNDMgNTMKKyAgICAidnRybi51OCAgICAgIGQwLCBkMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4udTggICAgICBkNCwgZDUgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLnU4ICAgICAgZDE2LCBkMTcgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyID0gMjAgMzAgMjEgMzEgMjIgMzIgMjMgMzMKKyAgICAvLyBkMyA9IDYwIDcwIDYxIDcxIDYyIDcyIDYzIDczCisgICAgInZ0cm4udTggICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLnU4ICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi51OCAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMCA9IDAwKzEwIDAxKzExIDAyKzEyIDAzKzEzCisgICAgLy8gZDIgPSA0MCs1MCA0MSs1MSA0Mis1MiA0Mys1MworICAgICJ2cGFkZGwudTggICAgcTAsIHEwICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnBhZGRsLnU4ICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZwYWRkbC51OCAgICBxOCwgcTggICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDMgPSA2MCs3MCA2MSs3MSA2Mis3MiA2Mys3MworICAgICJ2cGFkZGwudTggICAgZDMsIGQzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnBhZGRsLnU4ICAgIGQ3LCBkNyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZwYWRkbC51OCAgICBkMTksIGQxOSAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gY29tYmluZSBzb3VyY2UgbGluZXMKKyAgICAidmFkZC51MTYgICAgIHEwLCBxMiAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZhZGQudTE2ICAgICBxMCwgcTggICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2YWRkLnUxNiAgICAgZDQsIGQzLCBkNyAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmFkZC51MTYgICAgIGQ0LCBkMTkgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkc3RfcHRyWzNdID0gKHNbNiArIHN0ICogMF0gKyBzWzcgKyBzdCAqIDBdCisgICAgLy8gICAgICAgICAgICAgKyBzWzYgKyBzdCAqIDFdICsgc1s3ICsgc3QgKiAxXQorICAgIC8vICAgICAgICAgICAgICsgc1s2ICsgc3QgKiAyXSArIHNbNyArIHN0ICogMl0pIC8gNgorICAgICJ2cXJkbXVsaC5zMTYgcTIsIHExMyAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1vdm4udTE2ICAgIGQ0LCBxMiAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBTaHVmZmxlIDIsMyByZWcgYXJvdW5kIHNvIHRoYXQgMiBjYW4gYmUgYWRkZWQgdG8gdGhlCisgICAgLy8gIDAsMSByZWcgYW5kIDMgY2FuIGJlIGFkZGVkIHRvIHRoZSA0LDUgcmVnLiAgVGhpcworICAgIC8vICByZXF1aXJlcyBleHBhbmRpbmcgZnJvbSB1OCB0byB1MTYgYXMgdGhlIDAsMSBhbmQgNCw1CisgICAgLy8gIHJlZ2lzdGVycyBhcmUgYWxyZWFkeSBleHBhbmRlZC4gIFRoZW4gZG8gdHJhbnNwb3NlcworICAgIC8vICB0byBnZXQgYWxpZ25lZC4KKyAgICAvLyBxMiA9IHh4IDIwIHh4IDMwIHh4IDIxIHh4IDMxIHh4IDIyIHh4IDMyIHh4IDIzIHh4IDMzCisgICAgInZtb3ZsLnU4ICAgICBxMSwgZDIgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bW92bC51OCAgICAgcTMsIGQ2ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1vdmwudTggICAgIHE5LCBkMTggICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBjb21iaW5lIHNvdXJjZSBsaW5lcworICAgICJ2YWRkLnUxNiAgICAgcTEsIHEzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmFkZC51MTYgICAgIHExLCBxOSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkNCA9IHh4IDIwIHh4IDMwIHh4IDIyIHh4IDMyCisgICAgLy8gZDUgPSB4eCAyMSB4eCAzMSB4eCAyMyB4eCAzMworICAgICJ2dHJuLnUzMiAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQ0ID0geHggMjAgeHggMjEgeHggMjIgeHggMjMKKyAgICAvLyBkNSA9IHh4IDMwIHh4IDMxIHh4IDMyIHh4IDMzCisgICAgInZ0cm4udTE2ICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gMCsxKzIsIDMrNCs1CisgICAgInZhZGQudTE2ICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gTmVlZCB0byBkaXZpZGUsIGJ1dCBjYW4ndCBkb3duc2hpZnQgYXMgdGhlIHRoZSB2YWx1ZQorICAgIC8vICBpc24ndCBhIHBvd2VyIG9mIDIuICBTbyBtdWx0aXBseSBieSA2NTUzNiAvIG4KKyAgICAvLyAgYW5kIHRha2UgdGhlIHVwcGVyIDE2IGJpdHMuCisgICAgInZxcmRtdWxoLnMxNiBxMCwgcTE1ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gQWxpZ24gZm9yIHRhYmxlIGxvb2t1cCwgdnRibCByZXF1aXJlcyByZWdpc3RlcnMgdG8KKyAgICAvLyAgYmUgYWRqYWNlbnQKKyAgICAidm1vdi51OCAgICAgIGQyLCBkNCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnRibC51OCAgICAgIGQzLCB7ZDAsIGQxLCBkMn0sIGQyOCAgICAgICAgXG4iCisgICAgInZ0YmwudTggICAgICBkNCwge2QwLCBkMSwgZDJ9LCBkMjkgICAgICAgIFxuIgorCisgICAgInZzdDEudTggICAgICB7ZDN9LCBbJTFdISAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2c3QxLnUzMiAgICAge2Q0WzBdfSwgWyUxXSEgICAgICAgICAgICAgICBcbiIKKyAgICAic3VicyAgICAgICAgICUyLCAjMTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImJoaSAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgIDogIityIihzcmNfcHRyKSwgICAgICAgICAgLy8gJTAKKyAgICAgICIrciIoZHN0X3B0ciksICAgICAgICAgIC8vICUxCisgICAgICAiK3IiKGRzdF93aWR0aCksICAgICAgICAvLyAlMgorICAgICAgIityIihzcmNfc3RyaWRlKSAgICAgICAgLy8gJTMKKyAgICA6ICJyIihtdWx0MzhfZGl2NiksICAgICAgIC8vICU0CisgICAgICAiciIoc2h1ZjM4XzIpLCAgICAgICAgICAvLyAlNQorICAgICAgInIiKG11bHQzOF9kaXY5KSAgICAgICAgLy8gJTYKKyAgICA6ICJyNCIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxOCIsICJxOSIsCisgICAgICAicTEzIiwgInExNCIsICJxMTUiLCAibWVtb3J5IiwgImNjIgorICApOworfQorCisvLyAzMngyIC0+IDEyeDEKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM4XzJfSW50X05FT04oY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBhc20gdm9sYXRpbGUgKAorICAgICJ2bGQxLnUxNiAgICAge3ExM30sIFslNF0gICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmxkMS51OCAgICAgIHtxMTR9LCBbJTVdICAgICAgICAgICAgICAgICAgXG4iCisgICAgImFkZCAgICAgICAgICAlMywgJTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQwID0gMDAgNDAgMDEgNDEgMDIgNDIgMDMgNDMKKyAgICAvLyBkMSA9IDEwIDUwIDExIDUxIDEyIDUyIDEzIDUzCisgICAgLy8gZDIgPSAyMCA2MCAyMSA2MSAyMiA2MiAyMyA2MworICAgIC8vIGQzID0gMzAgNzAgMzEgNzEgMzIgNzIgMzMgNzMKKyAgICAidmxkNC51OCAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFslMF0hICAgICAgXG4iCisgICAgInZsZDQudTggICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbJTNdISAgICAgIFxuIgorCisgICAgLy8gU2h1ZmZsZSB0aGUgaW5wdXQgZGF0YSBhcm91bmQgdG8gZ2V0IGFsaWduIHRoZSBkYXRhCisgICAgLy8gIHNvIGFkamFjZW50IGRhdGEgY2FuIGJlIGFkZGVkLiAgMCwxIC0gMiwzIC0gNCw1IC0gNiw3CisgICAgLy8gZDAgPSAwMCAxMCAwMSAxMSAwMiAxMiAwMyAxMworICAgIC8vIGQxID0gNDAgNTAgNDEgNTEgNDIgNTIgNDMgNTMKKyAgICAidnRybi51OCAgICAgIGQwLCBkMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4udTggICAgICBkNCwgZDUgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIgPSAyMCAzMCAyMSAzMSAyMiAzMiAyMyAzMworICAgIC8vIGQzID0gNjAgNzAgNjEgNzEgNjIgNzIgNjMgNzMKKyAgICAidnRybi51OCAgICAgIGQyLCBkMyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4udTggICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDAgPSAwMCsxMCAwMSsxMSAwMisxMiAwMysxMworICAgIC8vIGQyID0gNDArNTAgNDErNTEgNDIrNTIgNDMrNTMKKyAgICAidnBhZGRsLnU4ICAgIHEwLCBxMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZwYWRkbC51OCAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDMgPSA2MCs3MCA2MSs3MSA2Mis3MiA2Mys3MworICAgICJ2cGFkZGwudTggICAgZDMsIGQzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnBhZGRsLnU4ICAgIGQ3LCBkNyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBjb21iaW5lIHNvdXJjZSBsaW5lcworICAgICJ2YWRkLnUxNiAgICAgcTAsIHEyICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidmFkZC51MTYgICAgIGQ0LCBkMywgZDcgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkc3RfcHRyWzNdID0gKHNbNl0gKyBzWzddICsgc1s2K3N0XSArIHNbNytzdF0pIC8gNAorICAgICJ2cXJzaHJuLnUxNiAgZDQsIHEyLCAjMiAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIFNodWZmbGUgMiwzIHJlZyBhcm91bmQgc28gdGhhdCAyIGNhbiBiZSBhZGRlZCB0byB0aGUKKyAgICAvLyAgMCwxIHJlZyBhbmQgMyBjYW4gYmUgYWRkZWQgdG8gdGhlIDQsNSByZWcuICBUaGlzCisgICAgLy8gIHJlcXVpcmVzIGV4cGFuZGluZyBmcm9tIHU4IHRvIHUxNiBhcyB0aGUgMCwxIGFuZCA0LDUKKyAgICAvLyAgcmVnaXN0ZXJzIGFyZSBhbHJlYWR5IGV4cGFuZGVkLiAgVGhlbiBkbyB0cmFuc3Bvc2VzCisgICAgLy8gIHRvIGdldCBhbGlnbmVkLgorICAgIC8vIHEyID0geHggMjAgeHggMzAgeHggMjEgeHggMzEgeHggMjIgeHggMzIgeHggMjMgeHggMzMKKyAgICAidm1vdmwudTggICAgIHExLCBkMiAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZtb3ZsLnU4ICAgICBxMywgZDYgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gY29tYmluZSBzb3VyY2UgbGluZXMKKyAgICAidmFkZC51MTYgICAgIHExLCBxMyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkNCA9IHh4IDIwIHh4IDMwIHh4IDIyIHh4IDMyCisgICAgLy8gZDUgPSB4eCAyMSB4eCAzMSB4eCAyMyB4eCAzMworICAgICJ2dHJuLnUzMiAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQ0ID0geHggMjAgeHggMjEgeHggMjIgeHggMjMKKyAgICAvLyBkNSA9IHh4IDMwIHh4IDMxIHh4IDMyIHh4IDMzCisgICAgInZ0cm4udTE2ICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gMCsxKzIsIDMrNCs1CisgICAgInZhZGQudTE2ICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gTmVlZCB0byBkaXZpZGUsIGJ1dCBjYW4ndCBkb3duc2hpZnQgYXMgdGhlIHRoZSB2YWx1ZQorICAgIC8vICBpc24ndCBhIHBvd2VyIG9mIDIuICBTbyBtdWx0aXBseSBieSA2NTUzNiAvIG4KKyAgICAvLyAgYW5kIHRha2UgdGhlIHVwcGVyIDE2IGJpdHMuCisgICAgInZxcmRtdWxoLnMxNiBxMCwgcTEzICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gQWxpZ24gZm9yIHRhYmxlIGxvb2t1cCwgdnRibCByZXF1aXJlcyByZWdpc3RlcnMgdG8KKyAgICAvLyAgYmUgYWRqYWNlbnQKKyAgICAidm1vdi51OCAgICAgIGQyLCBkNCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnRibC51OCAgICAgIGQzLCB7ZDAsIGQxLCBkMn0sIGQyOCAgICAgICAgXG4iCisgICAgInZ0YmwudTggICAgICBkNCwge2QwLCBkMSwgZDJ9LCBkMjkgICAgICAgIFxuIgorCisgICAgInZzdDEudTggICAgICB7ZDN9LCBbJTFdISAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2c3QxLnUzMiAgICAge2Q0WzBdfSwgWyUxXSEgICAgICAgICAgICAgICBcbiIKKyAgICAic3VicyAgICAgICAgICUyLCAjMTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImJoaSAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgIDogIityIihzcmNfcHRyKSwgICAgICAgICAgLy8gJTAKKyAgICAgICIrciIoZHN0X3B0ciksICAgICAgICAgIC8vICUxCisgICAgICAiK3IiKGRzdF93aWR0aCksICAgICAgICAvLyAlMgorICAgICAgIityIihzcmNfc3RyaWRlKSAgICAgICAgLy8gJTMKKyAgICA6ICJyIihtdWx0MzhfZGl2NiksICAgICAgIC8vICU0CisgICAgICAiciIoc2h1ZjM4XzIpICAgICAgICAgICAvLyAlNQorICAgIDogInEwIiwgInExIiwgInEyIiwgInEzIiwgInExMyIsICJxMTQiLCAibWVtb3J5IiwgImNjIgorICApOworfQorCisvKioKKyAqIFNTRTIgZG93bnNjYWxlcnMgd2l0aCBpbnRlcnBvbGF0aW9uLgorICoKKyAqIFByb3ZpZGVkIGJ5IEZyYW5rIEJhcmNoYXJkIChmYmFyY2hhcmRAZ29vZ2xlLmNvbSkKKyAqCisgKi8KKworLy8gQ29uc3RhbnRzIGZvciBTU0UyIGNvZGUKKyNlbGlmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmIFwKKyAgICAhZGVmaW5lZChZVVZfRElTQUJMRV9BU00pCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgVEFMSUdOMTYodCwgdmFyKSBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdCBfICMjIHZhcgorI2VsaWYgKGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBUQUxJR04xNih0LCB2YXIpIHQgdmFyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkKKyNlbHNlCisjZGVmaW5lIFRBTElHTjE2KHQsIHZhcikgdCBfICMjIHZhciBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSkgJiYgXAorICAgIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIERFQ0xBUkVfRlVOQ1RJT04obmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIudGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmdsb2JsIF8iICNuYW1lICIgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisiXyIgI25hbWUgIjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorI2Vsc2UKKyNkZWZpbmUgREVDTEFSRV9GVU5DVElPTihuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIi50ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIuZ2xvYmFsICIgI25hbWUgIiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNuYW1lICI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisjZW5kaWYKKworCisvLyBPZmZzZXRzIGZvciBzb3VyY2UgYnl0ZXMgMCB0byA5CisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQ4LCBzaHVmMFsxNl0pID0KKyAgeyAwLCAxLCAzLCA0LCA1LCA3LCA4LCA5LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9OworCisvLyBPZmZzZXRzIGZvciBzb3VyY2UgYnl0ZXMgMTEgdG8gMjAgd2l0aCA4IHN1YnRyYWN0ZWQgPSAzIHRvIDEyLgorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZjFbMTZdKSA9CisgIHsgMywgNCwgNSwgNywgOCwgOSwgMTEsIDEyLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9OworCisvLyBPZmZzZXRzIGZvciBzb3VyY2UgYnl0ZXMgMjEgdG8gMzEgd2l0aCAxNiBzdWJ0cmFjdGVkID0gNSB0byAzMS4KKy8vZXh0ZXJuICJDIgorVEFMSUdOMTYoY29uc3QgdWludDgsIHNodWYyWzE2XSkgPQorICB7IDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9OworCisvLyBPZmZzZXRzIGZvciBzb3VyY2UgYnl0ZXMgMCB0byAxMAorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZjAxWzE2XSkgPQorICB7IDAsIDEsIDEsIDIsIDIsIDMsIDQsIDUsIDUsIDYsIDYsIDcsIDgsIDksIDksIDEwIH07CisKKy8vIE9mZnNldHMgZm9yIHNvdXJjZSBieXRlcyAxMCB0byAyMSB3aXRoIDggc3VidHJhY3RlZCA9IDMgdG8gMTMuCisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQ4LCBzaHVmMTFbMTZdKSA9CisgIHsgMiwgMywgNCwgNSwgNSwgNiwgNiwgNywgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTIsIDEzIH07CisKKy8vIE9mZnNldHMgZm9yIHNvdXJjZSBieXRlcyAyMSB0byAzMSB3aXRoIDE2IHN1YnRyYWN0ZWQgPSA1IHRvIDMxLgorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZjIxWzE2XSkgPQorICB7IDUsIDYsIDYsIDcsIDgsIDksIDksIDEwLCAxMCwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUgfTsKKworLy8gQ29lZmZpY2llbnRzIGZvciBzb3VyY2UgYnl0ZXMgMCB0byAxMAorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgbWFkZDAxWzE2XSkgPQorICB7IDMsIDEsIDIsIDIsIDEsIDMsIDMsIDEsIDIsIDIsIDEsIDMsIDMsIDEsIDIsIDIgfTsKKworLy8gQ29lZmZpY2llbnRzIGZvciBzb3VyY2UgYnl0ZXMgMTAgdG8gMjEKKy8vZXh0ZXJuICJDIgorVEFMSUdOMTYoY29uc3QgdWludDgsIG1hZGQxMVsxNl0pID0KKyAgeyAxLCAzLCAzLCAxLCAyLCAyLCAxLCAzLCAzLCAxLCAyLCAyLCAxLCAzLCAzLCAxIH07CisKKy8vIENvZWZmaWNpZW50cyBmb3Igc291cmNlIGJ5dGVzIDIxIHRvIDMxCisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQ4LCBtYWRkMjFbMTZdKSA9CisgIHsgMiwgMiwgMSwgMywgMywgMSwgMiwgMiwgMSwgMywgMywgMSwgMiwgMiwgMSwgMyB9OworCisvLyBDb2VmZmljaWVudHMgZm9yIHNvdXJjZSBieXRlcyAyMSB0byAzMQorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCBpbnQxNiwgcm91bmQzNFs4XSkgPQorICB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfTsKKworLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZjM4YVsxNl0pID0KKyAgeyAwLCAzLCA2LCA4LCAxMSwgMTQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9OworCisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQ4LCBzaHVmMzhiWzE2XSkgPQorICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDAsIDMsIDYsIDgsIDExLCAxNCwgMTI4LCAxMjgsIDEyOCwgMTI4IH07CisKKy8vIEFycmFuZ2Ugd29yZHMgMCwzLDYgaW50byAwLDEsMgorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZmFjMFsxNl0pID0KKyAgeyAwLCAxLCA2LCA3LCAxMiwgMTMsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9OworCisvLyBBcnJhbmdlIHdvcmRzIDAsMyw2IGludG8gMyw0LDUKKy8vZXh0ZXJuICJDIgorVEFMSUdOMTYoY29uc3QgdWludDgsIHNodWZhYzNbMTZdKSA9CisgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMCwgMSwgNiwgNywgMTIsIDEzLCAxMjgsIDEyOCwgMTI4LCAxMjggfTsKKworLy8gU2NhbGluZyB2YWx1ZXMgZm9yIGJveGVzIG9mIDN4MyBhbmQgMngzCisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQxNiwgc2NhbGVhYzNbOF0pID0KKyAgeyA2NTUzNiAvIDksIDY1NTM2IC8gOSwgNjU1MzYgLyA2LCA2NTUzNiAvIDksIDY1NTM2IC8gOSwgNjU1MzYgLyA2LCAwLCAwIH07CisKKy8vIEFycmFuZ2UgZmlyc3QgdmFsdWUgZm9yIHBpeGVscyAwLDEsMiwzLDQsNQorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZmFiMFsxNl0pID0KKyAgeyAwLCAxMjgsIDMsIDEyOCwgNiwgMTI4LCA4LCAxMjgsIDExLCAxMjgsIDE0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9OworCisvLyBBcnJhbmdlIHNlY29uZCB2YWx1ZSBmb3IgcGl4ZWxzIDAsMSwyLDMsNCw1CisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQ4LCBzaHVmYWIxWzE2XSkgPQorICB7IDEsIDEyOCwgNCwgMTI4LCA3LCAxMjgsIDksIDEyOCwgMTIsIDEyOCwgMTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH07CisKKy8vIEFycmFuZ2UgdGhpcmQgdmFsdWUgZm9yIHBpeGVscyAwLDEsMiwzLDQsNQorLy9leHRlcm4gIkMiCitUQUxJR04xNihjb25zdCB1aW50OCwgc2h1ZmFiMlsxNl0pID0KKyAgeyAyLCAxMjgsIDUsIDEyOCwgMTI4LCAxMjgsIDEwLCAxMjgsIDEzLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfTsKKworLy8gU2NhbGluZyB2YWx1ZXMgZm9yIGJveGVzIG9mIDN4MiBhbmQgMngyCisvL2V4dGVybiAiQyIKK1RBTElHTjE2KGNvbnN0IHVpbnQxNiwgc2NhbGVhYjJbOF0pID0KKyAgeyA2NTUzNiAvIDMsIDY1NTM2IC8gMywgNjU1MzYgLyAyLCA2NTUzNiAvIDMsIDY1NTM2IC8gMywgNjU1MzYgLyAyLCAwLCAwIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoX01fSVg4NikgJiYgIWRlZmluZWQoWVVWX0RJU0FCTEVfQVNNKQorCisjZGVmaW5lIEhBU19TQ0FMRVJPV0RPV04yX1NTRTIKKy8vIFJlYWRzIDMyIHBpeGVscywgdGhyb3dzIGhhbGYgYXdheSBhbmQgd3JpdGVzIDE2IHBpeGVscy4KKy8vIEFsaWdubWVudCByZXF1aXJlbWVudDogc3JjX3B0ciAxNiBieXRlIGFsaWduZWQsIGRzdF9wdHIgMTYgYnl0ZSBhbGlnbmVkLgorX19kZWNsc3BlYyhuYWtlZCkKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjJfU1NFMihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgX19hc20geworICAgIG1vdiAgICAgICAgZWF4LCBbZXNwICsgNF0gICAgICAgIC8vIHNyY19wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmNfc3RyaWRlIGlnbm9yZWQKKyAgICBtb3YgICAgICAgIGVkeCwgW2VzcCArIDEyXSAgICAgICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyAxNl0gICAgICAgLy8gZHN0X3dpZHRoCisgICAgcGNtcGVxYiAgICB4bW01LCB4bW01ICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbWFzayAweDAwZmYwMGZmCisgICAgcHNybHcgICAgICB4bW01LCA4CisKKyAgd2xvb3A6CisgICAgbW92ZHFhICAgICB4bW0wLCBbZWF4XQorICAgIG1vdmRxYSAgICAgeG1tMSwgW2VheCArIDE2XQorICAgIGxlYSAgICAgICAgZWF4LCAgW2VheCArIDMyXQorICAgIHBhbmQgICAgICAgeG1tMCwgeG1tNQorICAgIHBhbmQgICAgICAgeG1tMSwgeG1tNQorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMQorICAgIG1vdmRxYSAgICAgW2VkeF0sIHhtbTAKKyAgICBsZWEgICAgICAgIGVkeCwgW2VkeCArIDE2XQorICAgIHN1YiAgICAgICAgZWN4LCAxNgorICAgIGphICAgICAgICAgd2xvb3AKKworICAgIHJldAorICB9Cit9CisvLyBCbGVuZHMgMzJ4MiByZWN0YW5nbGUgdG8gMTZ4MS4KKy8vIEFsaWdubWVudCByZXF1aXJlbWVudDogc3JjX3B0ciAxNiBieXRlIGFsaWduZWQsIGRzdF9wdHIgMTYgYnl0ZSBhbGlnbmVkLgorX19kZWNsc3BlYyhuYWtlZCkKK3ZvaWQgU2NhbGVSb3dEb3duMkludF9TU0UyKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIF9fYXNtIHsKKyAgICBwdXNoICAgICAgIGVzaQorICAgIG1vdiAgICAgICAgZWF4LCBbZXNwICsgNCArIDRdICAgIC8vIHNyY19wdHIKKyAgICBtb3YgICAgICAgIGVzaSwgW2VzcCArIDQgKyA4XSAgICAvLyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICBlZHgsIFtlc3AgKyA0ICsgMTJdICAgLy8gZHN0X3B0cgorICAgIG1vdiAgICAgICAgZWN4LCBbZXNwICsgNCArIDE2XSAgIC8vIGRzdF93aWR0aAorICAgIHBjbXBlcWIgICAgeG1tNSwgeG1tNSAgICAgICAgICAgIC8vIGdlbmVyYXRlIG1hc2sgMHgwMGZmMDBmZgorICAgIHBzcmx3ICAgICAgeG1tNSwgOAorCisgIHdsb29wOgorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VheF0KKyAgICBtb3ZkcWEgICAgIHhtbTEsIFtlYXggKyAxNl0KKyAgICBtb3ZkcWEgICAgIHhtbTIsIFtlYXggKyBlc2ldCisgICAgbW92ZHFhICAgICB4bW0zLCBbZWF4ICsgZXNpICsgMTZdCisgICAgbGVhICAgICAgICBlYXgsICBbZWF4ICsgMzJdCisgICAgcGF2Z2IgICAgICB4bW0wLCB4bW0yICAgICAgICAgICAgLy8gYXZlcmFnZSByb3dzCisgICAgcGF2Z2IgICAgICB4bW0xLCB4bW0zCisKKyAgICBtb3ZkcWEgICAgIHhtbTIsIHhtbTAgICAgICAgICAgICAvLyBhdmVyYWdlIGNvbHVtbnMgKDMyIHRvIDE2IHBpeGVscykKKyAgICBwc3JsdyAgICAgIHhtbTAsIDgKKyAgICBtb3ZkcWEgICAgIHhtbTMsIHhtbTEKKyAgICBwc3JsdyAgICAgIHhtbTEsIDgKKyAgICBwYW5kICAgICAgIHhtbTIsIHhtbTUKKyAgICBwYW5kICAgICAgIHhtbTMsIHhtbTUKKyAgICBwYXZndyAgICAgIHhtbTAsIHhtbTIKKyAgICBwYXZndyAgICAgIHhtbTEsIHhtbTMKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTEKKworICAgIG1vdmRxYSAgICAgW2VkeF0sIHhtbTAKKyAgICBsZWEgICAgICAgIGVkeCwgW2VkeCArIDE2XQorICAgIHN1YiAgICAgICAgZWN4LCAxNgorICAgIGphICAgICAgICAgd2xvb3AKKworICAgIHBvcCAgICAgICAgZXNpCisgICAgcmV0CisgIH0KK30KKworI2RlZmluZSBIQVNfU0NBTEVST1dET1dONF9TU0UyCisvLyBQb2ludCBzYW1wbGVzIDMyIHBpeGVscyB0byA4IHBpeGVscy4KKy8vIEFsaWdubWVudCByZXF1aXJlbWVudDogc3JjX3B0ciAxNiBieXRlIGFsaWduZWQsIGRzdF9wdHIgOCBieXRlIGFsaWduZWQuCitfX2RlY2xzcGVjKG5ha2VkKQorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duNF9TU0UyKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyY19zdHJpZGUgaWdub3JlZAorICAgIG1vdiAgICAgICAgZWRpLCBbZXNwICsgMzIgKyAxMl0gIC8vIGRzdF9wdHIKKyAgICBtb3YgICAgICAgIGVjeCwgW2VzcCArIDMyICsgMTZdICAvLyBkc3Rfd2lkdGgKKyAgICBwY21wZXFiICAgIHhtbTUsIHhtbTUgICAgICAgICAgICAvLyBnZW5lcmF0ZSBtYXNrIDB4MDAwMDAwZmYKKyAgICBwc3JsZCAgICAgIHhtbTUsIDI0CisKKyAgd2xvb3A6CisgICAgbW92ZHFhICAgICB4bW0wLCBbZXNpXQorICAgIG1vdmRxYSAgICAgeG1tMSwgW2VzaSArIDE2XQorICAgIGxlYSAgICAgICAgZXNpLCAgW2VzaSArIDMyXQorICAgIHBhbmQgICAgICAgeG1tMCwgeG1tNQorICAgIHBhbmQgICAgICAgeG1tMSwgeG1tNQorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMQorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMAorICAgIG1vdnEgICAgICAgcXdvcmQgcHRyIFtlZGldLCB4bW0wCisgICAgbGVhICAgICAgICBlZGksIFtlZGkgKyA4XQorICAgIHN1YiAgICAgICAgZWN4LCA4CisgICAgamEgICAgICAgICB3bG9vcAorCisgICAgcG9wYWQKKyAgICByZXQKKyAgfQorfQorCisvLyBCbGVuZHMgMzJ4NCByZWN0YW5nbGUgdG8gOHgxLgorLy8gQWxpZ25tZW50IHJlcXVpcmVtZW50OiBzcmNfcHRyIDE2IGJ5dGUgYWxpZ25lZCwgZHN0X3B0ciA4IGJ5dGUgYWxpZ25lZC4KK19fZGVjbHNwZWMobmFrZWQpCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd240SW50X1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIF9fYXNtIHsKKyAgICBwdXNoYWQKKyAgICBtb3YgICAgICAgIGVzaSwgW2VzcCArIDMyICsgNF0gICAvLyBzcmNfcHRyCisgICAgbW92ICAgICAgICBlYngsIFtlc3AgKyAzMiArIDhdICAgLy8gc3JjX3N0cmlkZQorICAgIG1vdiAgICAgICAgZWRpLCBbZXNwICsgMzIgKyAxMl0gIC8vIGRzdF9wdHIKKyAgICBtb3YgICAgICAgIGVjeCwgW2VzcCArIDMyICsgMTZdICAvLyBkc3Rfd2lkdGgKKyAgICBwY21wZXFiICAgIHhtbTcsIHhtbTcgICAgICAgICAgICAvLyBnZW5lcmF0ZSBtYXNrIDB4MDBmZjAwZmYKKyAgICBwc3JsdyAgICAgIHhtbTcsIDgKKyAgICBsZWEgICAgICAgIGVkeCwgW2VieCArIGVieCAqIDJdICAvLyBzcmNfc3RyaWRlICogMworCisgIHdsb29wOgorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VzaV0KKyAgICBtb3ZkcWEgICAgIHhtbTEsIFtlc2kgKyAxNl0KKyAgICBtb3ZkcWEgICAgIHhtbTIsIFtlc2kgKyBlYnhdCisgICAgbW92ZHFhICAgICB4bW0zLCBbZXNpICsgZWJ4ICsgMTZdCisgICAgcGF2Z2IgICAgICB4bW0wLCB4bW0yICAgICAgICAgICAgLy8gYXZlcmFnZSByb3dzCisgICAgcGF2Z2IgICAgICB4bW0xLCB4bW0zCisgICAgbW92ZHFhICAgICB4bW0yLCBbZXNpICsgZWJ4ICogMl0KKyAgICBtb3ZkcWEgICAgIHhtbTMsIFtlc2kgKyBlYnggKiAyICsgMTZdCisgICAgbW92ZHFhICAgICB4bW00LCBbZXNpICsgZWR4XQorICAgIG1vdmRxYSAgICAgeG1tNSwgW2VzaSArIGVkeCArIDE2XQorICAgIGxlYSAgICAgICAgZXNpLCBbZXNpICsgMzJdCisgICAgcGF2Z2IgICAgICB4bW0yLCB4bW00CisgICAgcGF2Z2IgICAgICB4bW0zLCB4bW01CisgICAgcGF2Z2IgICAgICB4bW0wLCB4bW0yCisgICAgcGF2Z2IgICAgICB4bW0xLCB4bW0zCisKKyAgICBtb3ZkcWEgICAgIHhtbTIsIHhtbTAgICAgICAgICAgICAvLyBhdmVyYWdlIGNvbHVtbnMgKDMyIHRvIDE2IHBpeGVscykKKyAgICBwc3JsdyAgICAgIHhtbTAsIDgKKyAgICBtb3ZkcWEgICAgIHhtbTMsIHhtbTEKKyAgICBwc3JsdyAgICAgIHhtbTEsIDgKKyAgICBwYW5kICAgICAgIHhtbTIsIHhtbTcKKyAgICBwYW5kICAgICAgIHhtbTMsIHhtbTcKKyAgICBwYXZndyAgICAgIHhtbTAsIHhtbTIKKyAgICBwYXZndyAgICAgIHhtbTEsIHhtbTMKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTEKKworICAgIG1vdmRxYSAgICAgeG1tMiwgeG1tMCAgICAgICAgICAgIC8vIGF2ZXJhZ2UgY29sdW1ucyAoMTYgdG8gOCBwaXhlbHMpCisgICAgcHNybHcgICAgICB4bW0wLCA4CisgICAgcGFuZCAgICAgICB4bW0yLCB4bW03CisgICAgcGF2Z3cgICAgICB4bW0wLCB4bW0yCisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0wCisKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWRpXSwgeG1tMAorICAgIGxlYSAgICAgICAgZWRpLCBbZWRpICsgOF0KKyAgICBzdWIgICAgICAgIGVjeCwgOAorICAgIGphICAgICAgICAgd2xvb3AKKworICAgIHBvcGFkCisgICAgcmV0CisgIH0KK30KKworI2RlZmluZSBIQVNfU0NBTEVST1dET1dOOF9TU0UyCisvLyBQb2ludCBzYW1wbGVzIDMyIHBpeGVscyB0byA0IHBpeGVscy4KKy8vIEFsaWdubWVudCByZXF1aXJlbWVudDogc3JjX3B0ciAxNiBieXRlIGFsaWduZWQsIGRzdF9wdHIgNCBieXRlIGFsaWduZWQuCitfX2RlY2xzcGVjKG5ha2VkKQorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duOF9TU0UyKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyY19zdHJpZGUgaWdub3JlZAorICAgIG1vdiAgICAgICAgZWRpLCBbZXNwICsgMzIgKyAxMl0gIC8vIGRzdF9wdHIKKyAgICBtb3YgICAgICAgIGVjeCwgW2VzcCArIDMyICsgMTZdICAvLyBkc3Rfd2lkdGgKKyAgICBwY21wZXFiICAgIHhtbTUsIHhtbTUgICAgICAgICAgICAvLyBnZW5lcmF0ZSBtYXNrIGlzb2xhdGluZyAxIHNyYyA4IGJ5dGVzCisgICAgcHNybHEgICAgICB4bW01LCA1NgorCisgIHdsb29wOgorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VzaV0KKyAgICBtb3ZkcWEgICAgIHhtbTEsIFtlc2kgKyAxNl0KKyAgICBsZWEgICAgICAgIGVzaSwgIFtlc2kgKyAzMl0KKyAgICBwYW5kICAgICAgIHhtbTAsIHhtbTUKKyAgICBwYW5kICAgICAgIHhtbTEsIHhtbTUKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTEgIC8vIDMyLT4xNgorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMCAgLy8gMTYtPjgKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTAgIC8vIDgtPjQKKyAgICBtb3ZkICAgICAgIGR3b3JkIHB0ciBbZWRpXSwgeG1tMAorICAgIGxlYSAgICAgICAgZWRpLCBbZWRpICsgNF0KKyAgICBzdWIgICAgICAgIGVjeCwgNAorICAgIGphICAgICAgICAgd2xvb3AKKworICAgIHBvcGFkCisgICAgcmV0CisgIH0KK30KKworLy8gQmxlbmRzIDMyeDggcmVjdGFuZ2xlIHRvIDR4MS4KKy8vIEFsaWdubWVudCByZXF1aXJlbWVudDogc3JjX3B0ciAxNiBieXRlIGFsaWduZWQsIGRzdF9wdHIgNCBieXRlIGFsaWduZWQuCitfX2RlY2xzcGVjKG5ha2VkKQorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duOEludF9TU0UyKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgIG1vdiAgICAgICAgZWJ4LCBbZXNwICsgMzIgKyA4XSAgIC8vIHNyY19zdHJpZGUKKyAgICBtb3YgICAgICAgIGVkaSwgW2VzcCArIDMyICsgMTJdICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyAzMiArIDE2XSAgLy8gZHN0X3dpZHRoCisgICAgbGVhICAgICAgICBlZHgsIFtlYnggKyBlYnggKiAyXSAgLy8gc3JjX3N0cmlkZSAqIDMKKyAgICBweG9yICAgICAgIHhtbTcsIHhtbTcKKworICB3bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldICAgICAgICAgICAvLyBhdmVyYWdlIDggcm93cyB0byAxCisgICAgbW92ZHFhICAgICB4bW0xLCBbZXNpICsgMTZdCisgICAgbW92ZHFhICAgICB4bW0yLCBbZXNpICsgZWJ4XQorICAgIG1vdmRxYSAgICAgeG1tMywgW2VzaSArIGVieCArIDE2XQorICAgIHBhdmdiICAgICAgeG1tMCwgeG1tMgorICAgIHBhdmdiICAgICAgeG1tMSwgeG1tMworICAgIG1vdmRxYSAgICAgeG1tMiwgW2VzaSArIGVieCAqIDJdCisgICAgbW92ZHFhICAgICB4bW0zLCBbZXNpICsgZWJ4ICogMiArIDE2XQorICAgIG1vdmRxYSAgICAgeG1tNCwgW2VzaSArIGVkeF0KKyAgICBtb3ZkcWEgICAgIHhtbTUsIFtlc2kgKyBlZHggKyAxNl0KKyAgICBsZWEgICAgICAgIGVicCwgW2VzaSArIGVieCAqIDRdCisgICAgbGVhICAgICAgICBlc2ksIFtlc2kgKyAzMl0KKyAgICBwYXZnYiAgICAgIHhtbTIsIHhtbTQKKyAgICBwYXZnYiAgICAgIHhtbTMsIHhtbTUKKyAgICBwYXZnYiAgICAgIHhtbTAsIHhtbTIKKyAgICBwYXZnYiAgICAgIHhtbTEsIHhtbTMKKworICAgIG1vdmRxYSAgICAgeG1tMiwgW2VicF0KKyAgICBtb3ZkcWEgICAgIHhtbTMsIFtlYnAgKyAxNl0KKyAgICBtb3ZkcWEgICAgIHhtbTQsIFtlYnAgKyBlYnhdCisgICAgbW92ZHFhICAgICB4bW01LCBbZWJwICsgZWJ4ICsgMTZdCisgICAgcGF2Z2IgICAgICB4bW0yLCB4bW00CisgICAgcGF2Z2IgICAgICB4bW0zLCB4bW01CisgICAgbW92ZHFhICAgICB4bW00LCBbZWJwICsgZWJ4ICogMl0KKyAgICBtb3ZkcWEgICAgIHhtbTUsIFtlYnAgKyBlYnggKiAyICsgMTZdCisgICAgbW92ZHFhICAgICB4bW02LCBbZWJwICsgZWR4XQorICAgIHBhdmdiICAgICAgeG1tNCwgeG1tNgorICAgIG1vdmRxYSAgICAgeG1tNiwgW2VicCArIGVkeCArIDE2XQorICAgIHBhdmdiICAgICAgeG1tNSwgeG1tNgorICAgIHBhdmdiICAgICAgeG1tMiwgeG1tNAorICAgIHBhdmdiICAgICAgeG1tMywgeG1tNQorICAgIHBhdmdiICAgICAgeG1tMCwgeG1tMgorICAgIHBhdmdiICAgICAgeG1tMSwgeG1tMworCisgICAgcHNhZGJ3ICAgICB4bW0wLCB4bW03ICAgICAgICAgICAgLy8gYXZlcmFnZSAzMiBwaXhlbHMgdG8gNAorICAgIHBzYWRidyAgICAgeG1tMSwgeG1tNworICAgIHBzaHVmZCAgICAgeG1tMCwgeG1tMCwgMHhkOCAgICAgIC8vIHgxeDAgLT4geHgwMQorICAgIHBzaHVmZCAgICAgeG1tMSwgeG1tMSwgMHg4ZCAgICAgIC8vIHgzeDIgLT4gMzJ4eAorICAgIHBvciAgICAgICAgeG1tMCwgeG1tMSAgICAgICAgICAgIC8vICAgICAgLT4gMzIwMQorICAgIHBzcmx3ICAgICAgeG1tMCwgMworICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMAorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMAorICAgIG1vdmQgICAgICAgZHdvcmQgcHRyIFtlZGldLCB4bW0wCisKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSArIDRdCisgICAgc3ViICAgICAgICBlY3gsIDQKKyAgICBqYSAgICAgICAgIHdsb29wCisKKyAgICBwb3BhZAorICAgIHJldAorICB9Cit9CisKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjM0X1NTU0UzCisvLyBQb2ludCBzYW1wbGVzIDMyIHBpeGVscyB0byAyNCBwaXhlbHMuCisvLyBQcm9kdWNlcyB0aHJlZSA4IGJ5dGUgdmFsdWVzLiAgRm9yIGVhY2ggOCBieXRlcywgMTYgYnl0ZXMgYXJlIHJlYWQuCisvLyBUaGVuIHNodWZmbGVkIHRvIGRvIHRoZSBzY2FsaW5nLgorCisvLyBOb3RlIHRoYXQgbW92ZHFhK3BhbGlnbiBtYXkgYmUgYmV0dGVyIHRoYW4gbW92ZHF1LgorLy8gQWxpZ25tZW50IHJlcXVpcmVtZW50OiBzcmNfcHRyIDE2IGJ5dGUgYWxpZ25lZCwgZHN0X3B0ciA4IGJ5dGUgYWxpZ25lZC4KK19fZGVjbHNwZWMobmFrZWQpCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zNF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyY19zdHJpZGUgaWdub3JlZAorICAgIG1vdiAgICAgICAgZWRpLCBbZXNwICsgMzIgKyAxMl0gIC8vIGRzdF9wdHIKKyAgICBtb3YgICAgICAgIGVjeCwgW2VzcCArIDMyICsgMTZdICAvLyBkc3Rfd2lkdGgKKyAgICBtb3ZkcWEgICAgIHhtbTMsIF9zaHVmMAorICAgIG1vdmRxYSAgICAgeG1tNCwgX3NodWYxCisgICAgbW92ZHFhICAgICB4bW01LCBfc2h1ZjIKKworICB3bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldCisgICAgbW92ZHFhICAgICB4bW0xLCBbZXNpICsgMTZdCisgICAgbGVhICAgICAgICBlc2ksICBbZXNpICsgMzJdCisgICAgbW92ZHFhICAgICB4bW0yLCB4bW0xCisgICAgcGFsaWduciAgICB4bW0xLCB4bW0wLCA4CisgICAgcHNodWZiICAgICB4bW0wLCB4bW0zCisgICAgcHNodWZiICAgICB4bW0xLCB4bW00CisgICAgcHNodWZiICAgICB4bW0yLCB4bW01CisgICAgbW92cSAgICAgICBxd29yZCBwdHIgW2VkaV0sIHhtbTAKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWRpICsgOF0sIHhtbTEKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWRpICsgMTZdLCB4bW0yCisgICAgbGVhICAgICAgICBlZGksIFtlZGkgKyAyNF0KKyAgICBzdWIgICAgICAgIGVjeCwgMjQKKyAgICBqYSAgICAgICAgIHdsb29wCisKKyAgICBwb3BhZAorICAgIHJldAorICB9Cit9CisKKy8vIEJsZW5kcyAzMngyIHJlY3RhbmdsZSB0byAyNHgxCisvLyBQcm9kdWNlcyB0aHJlZSA4IGJ5dGUgdmFsdWVzLiAgRm9yIGVhY2ggOCBieXRlcywgMTYgYnl0ZXMgYXJlIHJlYWQuCisvLyBUaGVuIHNodWZmbGVkIHRvIGRvIHRoZSBzY2FsaW5nLgorCisvLyBSZWdpc3RlciB1c2FnZToKKy8vIHhtbTAgc3JjX3JvdyAwCisvLyB4bW0xIHNyY19yb3cgMQorLy8geG1tMiBzaHVmIDAKKy8vIHhtbTMgc2h1ZiAxCisvLyB4bW00IHNodWYgMgorLy8geG1tNSBtYWRkIDAKKy8vIHhtbTYgbWFkZCAxCisvLyB4bW03IHJvdW5kMzQKKworLy8gTm90ZSB0aGF0IG1vdmRxYStwYWxpZ24gbWF5IGJlIGJldHRlciB0aGFuIG1vdmRxdS4KKy8vIEFsaWdubWVudCByZXF1aXJlbWVudDogc3JjX3B0ciAxNiBieXRlIGFsaWduZWQsIGRzdF9wdHIgOCBieXRlIGFsaWduZWQuCitfX2RlY2xzcGVjKG5ha2VkKQorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duMzRfMV9JbnRfU1NTRTMoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgX19hc20geworICAgIHB1c2hhZAorICAgIG1vdiAgICAgICAgZXNpLCBbZXNwICsgMzIgKyA0XSAgIC8vIHNyY19wdHIKKyAgICBtb3YgICAgICAgIGVieCwgW2VzcCArIDMyICsgOF0gICAvLyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICBlZGksIFtlc3AgKyAzMiArIDEyXSAgLy8gZHN0X3B0cgorICAgIG1vdiAgICAgICAgZWN4LCBbZXNwICsgMzIgKyAxNl0gIC8vIGRzdF93aWR0aAorICAgIG1vdmRxYSAgICAgeG1tMiwgX3NodWYwMQorICAgIG1vdmRxYSAgICAgeG1tMywgX3NodWYxMQorICAgIG1vdmRxYSAgICAgeG1tNCwgX3NodWYyMQorICAgIG1vdmRxYSAgICAgeG1tNSwgX21hZGQwMQorICAgIG1vdmRxYSAgICAgeG1tNiwgX21hZGQxMQorICAgIG1vdmRxYSAgICAgeG1tNywgX3JvdW5kMzQKKworICB3bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldICAgICAgICAgICAvLyBwaXhlbHMgMC4uNworICAgIG1vdmRxYSAgICAgeG1tMSwgW2VzaStlYnhdCisgICAgcGF2Z2IgICAgICB4bW0wLCB4bW0xCisgICAgcHNodWZiICAgICB4bW0wLCB4bW0yCisgICAgcG1hZGR1YnN3ICB4bW0wLCB4bW01CisgICAgcGFkZHN3ICAgICB4bW0wLCB4bW03CisgICAgcHNybHcgICAgICB4bW0wLCAyCisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0wCisgICAgbW92cSAgICAgICBxd29yZCBwdHIgW2VkaV0sIHhtbTAKKyAgICBtb3ZkcXUgICAgIHhtbTAsIFtlc2krOF0gICAgICAgICAvLyBwaXhlbHMgOC4uMTUKKyAgICBtb3ZkcXUgICAgIHhtbTEsIFtlc2krZWJ4KzhdCisgICAgcGF2Z2IgICAgICB4bW0wLCB4bW0xCisgICAgcHNodWZiICAgICB4bW0wLCB4bW0zCisgICAgcG1hZGR1YnN3ICB4bW0wLCB4bW02CisgICAgcGFkZHN3ICAgICB4bW0wLCB4bW03CisgICAgcHNybHcgICAgICB4bW0wLCAyCisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0wCisgICAgbW92cSAgICAgICBxd29yZCBwdHIgW2VkaSs4XSwgeG1tMAorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VzaSsxNl0gICAgICAgIC8vIHBpeGVscyAxNi4uMjMKKyAgICBtb3ZkcWEgICAgIHhtbTEsIFtlc2krZWJ4KzE2XQorICAgIGxlYSAgICAgICAgZXNpLCBbZXNpKzMyXQorICAgIHBhdmdiICAgICAgeG1tMCwgeG1tMQorICAgIHBzaHVmYiAgICAgeG1tMCwgeG1tNAorICAgIG1vdmRxYSAgICAgeG1tMSwgX21hZGQyMQorICAgIHBtYWRkdWJzdyAgeG1tMCwgeG1tMQorICAgIHBhZGRzdyAgICAgeG1tMCwgeG1tNworICAgIHBzcmx3ICAgICAgeG1tMCwgMgorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMAorICAgIG1vdnEgICAgICAgcXdvcmQgcHRyIFtlZGkrMTZdLCB4bW0wCisgICAgbGVhICAgICAgICBlZGksIFtlZGkrMjRdCisgICAgc3ViICAgICAgICBlY3gsIDI0CisgICAgamEgICAgICAgICB3bG9vcAorCisgICAgcG9wYWQKKyAgICByZXQKKyAgfQorfQorCisvLyBOb3RlIHRoYXQgbW92ZHFhK3BhbGlnbiBtYXkgYmUgYmV0dGVyIHRoYW4gbW92ZHF1LgorLy8gQWxpZ25tZW50IHJlcXVpcmVtZW50OiBzcmNfcHRyIDE2IGJ5dGUgYWxpZ25lZCwgZHN0X3B0ciA4IGJ5dGUgYWxpZ25lZC4KK19fZGVjbHNwZWMobmFrZWQpCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zNF8wX0ludF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgIG1vdiAgICAgICAgZWJ4LCBbZXNwICsgMzIgKyA4XSAgIC8vIHNyY19zdHJpZGUKKyAgICBtb3YgICAgICAgIGVkaSwgW2VzcCArIDMyICsgMTJdICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyAzMiArIDE2XSAgLy8gZHN0X3dpZHRoCisgICAgbW92ZHFhICAgICB4bW0yLCBfc2h1ZjAxCisgICAgbW92ZHFhICAgICB4bW0zLCBfc2h1ZjExCisgICAgbW92ZHFhICAgICB4bW00LCBfc2h1ZjIxCisgICAgbW92ZHFhICAgICB4bW01LCBfbWFkZDAxCisgICAgbW92ZHFhICAgICB4bW02LCBfbWFkZDExCisgICAgbW92ZHFhICAgICB4bW03LCBfcm91bmQzNAorCisgIHdsb29wOgorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VzaV0gICAgICAgICAgIC8vIHBpeGVscyAwLi43CisgICAgbW92ZHFhICAgICB4bW0xLCBbZXNpK2VieF0KKyAgICBwYXZnYiAgICAgIHhtbTEsIHhtbTAKKyAgICBwYXZnYiAgICAgIHhtbTAsIHhtbTEKKyAgICBwc2h1ZmIgICAgIHhtbTAsIHhtbTIKKyAgICBwbWFkZHVic3cgIHhtbTAsIHhtbTUKKyAgICBwYWRkc3cgICAgIHhtbTAsIHhtbTcKKyAgICBwc3JsdyAgICAgIHhtbTAsIDIKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTAKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWRpXSwgeG1tMAorICAgIG1vdmRxdSAgICAgeG1tMCwgW2VzaSs4XSAgICAgICAgIC8vIHBpeGVscyA4Li4xNQorICAgIG1vdmRxdSAgICAgeG1tMSwgW2VzaStlYngrOF0KKyAgICBwYXZnYiAgICAgIHhtbTEsIHhtbTAKKyAgICBwYXZnYiAgICAgIHhtbTAsIHhtbTEKKyAgICBwc2h1ZmIgICAgIHhtbTAsIHhtbTMKKyAgICBwbWFkZHVic3cgIHhtbTAsIHhtbTYKKyAgICBwYWRkc3cgICAgIHhtbTAsIHhtbTcKKyAgICBwc3JsdyAgICAgIHhtbTAsIDIKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTAKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWRpKzhdLCB4bW0wCisgICAgbW92ZHFhICAgICB4bW0wLCBbZXNpKzE2XSAgICAgICAgLy8gcGl4ZWxzIDE2Li4yMworICAgIG1vdmRxYSAgICAgeG1tMSwgW2VzaStlYngrMTZdCisgICAgbGVhICAgICAgICBlc2ksIFtlc2krMzJdCisgICAgcGF2Z2IgICAgICB4bW0xLCB4bW0wCisgICAgcGF2Z2IgICAgICB4bW0wLCB4bW0xCisgICAgcHNodWZiICAgICB4bW0wLCB4bW00CisgICAgbW92ZHFhICAgICB4bW0xLCBfbWFkZDIxCisgICAgcG1hZGR1YnN3ICB4bW0wLCB4bW0xCisgICAgcGFkZHN3ICAgICB4bW0wLCB4bW03CisgICAgcHNybHcgICAgICB4bW0wLCAyCisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0wCisgICAgbW92cSAgICAgICBxd29yZCBwdHIgW2VkaSsxNl0sIHhtbTAKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSsyNF0KKyAgICBzdWIgICAgICAgIGVjeCwgMjQKKyAgICBqYSAgICAgICAgIHdsb29wCisKKyAgICBwb3BhZAorICAgIHJldAorICB9Cit9CisKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjM4X1NTU0UzCisvLyAzLzggcG9pbnQgc2FtcGxlcgorCisvLyBTY2FsZSAzMiBwaXhlbHMgdG8gMTIKK19fZGVjbHNwZWMobmFrZWQpCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgIG1vdiAgICAgICAgZWR4LCBbZXNwICsgMzIgKyA4XSAgIC8vIHNyY19zdHJpZGUKKyAgICBtb3YgICAgICAgIGVkaSwgW2VzcCArIDMyICsgMTJdICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyAzMiArIDE2XSAgLy8gZHN0X3dpZHRoCisgICAgbW92ZHFhICAgICB4bW00LCBfc2h1ZjM4YQorICAgIG1vdmRxYSAgICAgeG1tNSwgX3NodWYzOGIKKworICB4bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldICAgICAgICAgICAvLyAxNiBwaXhlbHMgLT4gMCwxLDIsMyw0LDUKKyAgICBtb3ZkcWEgICAgIHhtbTEsIFtlc2kgKyAxNl0gICAgICAvLyAxNiBwaXhlbHMgLT4gNiw3LDgsOSwxMCwxMQorICAgIGxlYSAgICAgICAgZXNpLCBbZXNpICsgMzJdCisgICAgcHNodWZiICAgICB4bW0wLCB4bW00CisgICAgcHNodWZiICAgICB4bW0xLCB4bW01CisgICAgcGFkZHVzYiAgICB4bW0wLCB4bW0xCisKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWRpXSwgeG1tMCAvLyB3cml0ZSAxMiBwaXhlbHMKKyAgICBtb3ZobHBzICAgIHhtbTEsIHhtbTAKKyAgICBtb3ZkICAgICAgIFtlZGkgKyA4XSwgeG1tMQorICAgIGxlYSAgICAgICAgZWRpLCBbZWRpICsgMTJdCisgICAgc3ViICAgICAgICBlY3gsIDEyCisgICAgamEgICAgICAgICB4bG9vcAorCisgICAgcG9wYWQKKyAgICByZXQKKyAgfQorfQorCisvLyBTY2FsZSAxNngzIHBpeGVscyB0byA2eDEgd2l0aCBpbnRlcnBvbGF0aW9uCitfX2RlY2xzcGVjKG5ha2VkKQorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duMzhfM19JbnRfU1NTRTMoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgX19hc20geworICAgIHB1c2hhZAorICAgIG1vdiAgICAgICAgZXNpLCBbZXNwICsgMzIgKyA0XSAgIC8vIHNyY19wdHIKKyAgICBtb3YgICAgICAgIGVkeCwgW2VzcCArIDMyICsgOF0gICAvLyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICBlZGksIFtlc3AgKyAzMiArIDEyXSAgLy8gZHN0X3B0cgorICAgIG1vdiAgICAgICAgZWN4LCBbZXNwICsgMzIgKyAxNl0gIC8vIGRzdF93aWR0aAorICAgIG1vdmRxYSAgICAgeG1tNCwgX3NodWZhYzAKKyAgICBtb3ZkcWEgICAgIHhtbTUsIF9zaHVmYWMzCisgICAgbW92ZHFhICAgICB4bW02LCBfc2NhbGVhYzMKKyAgICBweG9yICAgICAgIHhtbTcsIHhtbTcKKworICB4bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldICAgICAgICAgICAvLyBzdW0gdXAgMyByb3dzIGludG8geG1tMC8xCisgICAgbW92ZHFhICAgICB4bW0yLCBbZXNpICsgZWR4XQorICAgIG1vdmhscHMgICAgeG1tMSwgeG1tMAorICAgIG1vdmhscHMgICAgeG1tMywgeG1tMgorICAgIHB1bnBja2xidyAgeG1tMCwgeG1tNworICAgIHB1bnBja2xidyAgeG1tMSwgeG1tNworICAgIHB1bnBja2xidyAgeG1tMiwgeG1tNworICAgIHB1bnBja2xidyAgeG1tMywgeG1tNworICAgIHBhZGR1c3cgICAgeG1tMCwgeG1tMgorICAgIHBhZGR1c3cgICAgeG1tMSwgeG1tMworICAgIG1vdmRxYSAgICAgeG1tMiwgW2VzaSArIGVkeCAqIDJdCisgICAgbGVhICAgICAgICBlc2ksIFtlc2kgKyAxNl0KKyAgICBtb3ZobHBzICAgIHhtbTMsIHhtbTIKKyAgICBwdW5wY2tsYncgIHhtbTIsIHhtbTcKKyAgICBwdW5wY2tsYncgIHhtbTMsIHhtbTcKKyAgICBwYWRkdXN3ICAgIHhtbTAsIHhtbTIKKyAgICBwYWRkdXN3ICAgIHhtbTEsIHhtbTMKKworICAgIG1vdmRxYSAgICAgeG1tMiwgeG1tMCAgICAgICAgICAgIC8vIDggcGl4ZWxzIC0+IDAsMSwyIG9mIHhtbTIKKyAgICBwc3JsZHEgICAgIHhtbTAsIDIKKyAgICBwYWRkdXN3ICAgIHhtbTIsIHhtbTAKKyAgICBwc3JsZHEgICAgIHhtbTAsIDIKKyAgICBwYWRkdXN3ICAgIHhtbTIsIHhtbTAKKyAgICBwc2h1ZmIgICAgIHhtbTIsIHhtbTQKKworICAgIG1vdmRxYSAgICAgeG1tMywgeG1tMSAgICAgICAgICAgIC8vIDggcGl4ZWxzIC0+IDMsNCw1IG9mIHhtbTIKKyAgICBwc3JsZHEgICAgIHhtbTEsIDIKKyAgICBwYWRkdXN3ICAgIHhtbTMsIHhtbTEKKyAgICBwc3JsZHEgICAgIHhtbTEsIDIKKyAgICBwYWRkdXN3ICAgIHhtbTMsIHhtbTEKKyAgICBwc2h1ZmIgICAgIHhtbTMsIHhtbTUKKyAgICBwYWRkdXN3ICAgIHhtbTIsIHhtbTMKKworICAgIHBtdWxodXcgICAgeG1tMiwgeG1tNiAgICAgICAgICAgIC8vIGRpdmlkZSBieSA5LDksNiwgOSw5LDYKKyAgICBwYWNrdXN3YiAgIHhtbTIsIHhtbTIKKworICAgIG1vdmQgICAgICAgW2VkaV0sIHhtbTIgICAgICAgICAgIC8vIHdyaXRlIDYgcGl4ZWxzCisgICAgcGV4dHJ3ICAgICBlYXgsIHhtbTIsIDIKKyAgICBtb3YgICAgICAgIFtlZGkgKyA0XSwgYXgKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSArIDZdCisgICAgc3ViICAgICAgICBlY3gsIDYKKyAgICBqYSAgICAgICAgIHhsb29wCisKKyAgICBwb3BhZAorICAgIHJldAorICB9Cit9CisKKy8vIFNjYWxlIDE2eDIgcGl4ZWxzIHRvIDZ4MSB3aXRoIGludGVycG9sYXRpb24KK19fZGVjbHNwZWMobmFrZWQpCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF8yX0ludF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBfX2FzbSB7CisgICAgcHVzaGFkCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyAzMiArIDRdICAgLy8gc3JjX3B0cgorICAgIG1vdiAgICAgICAgZWR4LCBbZXNwICsgMzIgKyA4XSAgIC8vIHNyY19zdHJpZGUKKyAgICBtb3YgICAgICAgIGVkaSwgW2VzcCArIDMyICsgMTJdICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyAzMiArIDE2XSAgLy8gZHN0X3dpZHRoCisgICAgbW92ZHFhICAgICB4bW00LCBfc2h1ZmFiMAorICAgIG1vdmRxYSAgICAgeG1tNSwgX3NodWZhYjEKKyAgICBtb3ZkcWEgICAgIHhtbTYsIF9zaHVmYWIyCisgICAgbW92ZHFhICAgICB4bW03LCBfc2NhbGVhYjIKKworICB4bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTIsIFtlc2ldICAgICAgICAgICAvLyBhdmVyYWdlIDIgcm93cyBpbnRvIHhtbTIKKyAgICBwYXZnYiAgICAgIHhtbTIsIFtlc2kgKyBlZHhdCisgICAgbGVhICAgICAgICBlc2ksIFtlc2kgKyAxNl0KKworICAgIG1vdmRxYSAgICAgeG1tMCwgeG1tMiAgICAgICAgICAgIC8vIDE2IHBpeGVscyAtPiAwLDEsMiwzLDQsNSBvZiB4bW0wCisgICAgcHNodWZiICAgICB4bW0wLCB4bW00CisgICAgbW92ZHFhICAgICB4bW0xLCB4bW0yCisgICAgcHNodWZiICAgICB4bW0xLCB4bW01CisgICAgcGFkZHVzdyAgICB4bW0wLCB4bW0xCisgICAgcHNodWZiICAgICB4bW0yLCB4bW02CisgICAgcGFkZHVzdyAgICB4bW0wLCB4bW0yCisKKyAgICBwbXVsaHV3ICAgIHhtbTAsIHhtbTcgICAgICAgICAgICAvLyBkaXZpZGUgYnkgMywzLDIsIDMsMywyCisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0wCisKKyAgICBtb3ZkICAgICAgIFtlZGldLCB4bW0wICAgICAgICAgICAvLyB3cml0ZSA2IHBpeGVscworICAgIHBleHRydyAgICAgZWF4LCB4bW0wLCAyCisgICAgbW92ICAgICAgICBbZWRpICsgNF0sIGF4CisgICAgbGVhICAgICAgICBlZGksIFtlZGkgKyA2XQorICAgIHN1YiAgICAgICAgZWN4LCA2CisgICAgamEgICAgICAgICB4bG9vcAorCisgICAgcG9wYWQKKyAgICByZXQKKyAgfQorfQorCisjZGVmaW5lIEhBU19TQ0FMRUFERFJPV1NfU1NFMgorCisvLyBSZWFkcyA4eE4gYnl0ZXMgYW5kIHByb2R1Y2VzIDE2IHNob3J0cyBhdCBhIHRpbWUuCitfX2RlY2xzcGVjKG5ha2VkKQorc3RhdGljIHZvaWQgU2NhbGVBZGRSb3dzX1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2KiBkc3RfcHRyLCBpbnQgc3JjX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQpIHsKKyAgX19hc20geworICAgIHB1c2hhZAorICAgIG1vdiAgICAgICAgZXNpLCBbZXNwICsgMzIgKyA0XSAgIC8vIHNyY19wdHIKKyAgICBtb3YgICAgICAgIGVkeCwgW2VzcCArIDMyICsgOF0gICAvLyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICBlZGksIFtlc3AgKyAzMiArIDEyXSAgLy8gZHN0X3B0cgorICAgIG1vdiAgICAgICAgZWN4LCBbZXNwICsgMzIgKyAxNl0gIC8vIGRzdF93aWR0aAorICAgIG1vdiAgICAgICAgZWJ4LCBbZXNwICsgMzIgKyAyMF0gIC8vIGhlaWdodAorICAgIHB4b3IgICAgICAgeG1tNSwgeG1tNQorICAgIGRlYyAgICAgICAgZWJ4CisKKyAgeGxvb3A6CisgICAgLy8gZmlyc3Qgcm93CisgICAgbW92ZHFhICAgICB4bW0yLCBbZXNpXQorICAgIGxlYSAgICAgICAgZWF4LCBbZXNpICsgZWR4XQorICAgIG1vdmhscHMgICAgeG1tMywgeG1tMgorICAgIG1vdiAgICAgICAgZWJwLCBlYngKKyAgICBwdW5wY2tsYncgIHhtbTIsIHhtbTUKKyAgICBwdW5wY2tsYncgIHhtbTMsIHhtbTUKKworICAgIC8vIHN1bSByZW1haW5pbmcgcm93cworICB5bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlYXhdICAgICAgIC8vIHJlYWQgMTYgcGl4ZWxzCisgICAgbGVhICAgICAgICBlYXgsIFtlYXggKyBlZHhdICAvLyBhZHZhbmNlIHRvIG5leHQgcm93CisgICAgbW92aGxwcyAgICB4bW0xLCB4bW0wCisgICAgcHVucGNrbGJ3ICB4bW0wLCB4bW01CisgICAgcHVucGNrbGJ3ICB4bW0xLCB4bW01CisgICAgcGFkZHVzdyAgICB4bW0yLCB4bW0wICAgICAgICAvLyBzdW0gMTYgd29yZHMKKyAgICBwYWRkdXN3ICAgIHhtbTMsIHhtbTEKKyAgICBzdWIgICAgICAgIGVicCwgMQorICAgIGphICAgICAgICAgeWxvb3AKKworICAgIG1vdmRxYSAgICAgW2VkaV0sIHhtbTIKKyAgICBtb3ZkcWEgICAgIFtlZGkgKyAxNl0sIHhtbTMKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSArIDMyXQorICAgIGxlYSAgICAgICAgZXNpLCBbZXNpICsgMTZdCisKKyAgICBzdWIgICAgICAgIGVjeCwgMTYKKyAgICBqYSAgICAgICAgIHhsb29wCisKKyAgICBwb3BhZAorICAgIHJldAorICB9Cit9CisKKy8vIEJpbGluZWFyIHJvdyBmaWx0ZXJpbmcgY29tYmluZXMgMTZ4MiAtPiAxNngxLiBTU0UyIHZlcnNpb24uCisjZGVmaW5lIEhBU19TQ0FMRUZJTFRFUlJPV1NfU1NFMgorX19kZWNsc3BlYyhuYWtlZCkKK3N0YXRpYyB2b2lkIFNjYWxlRmlsdGVyUm93c19TU0UyKHVpbnQ4KiBkc3RfcHRyLCBjb25zdCB1aW50OCogc3JjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCBpbnQgZHN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV95X2ZyYWN0aW9uKSB7CisgIF9fYXNtIHsKKyAgICBwdXNoICAgICAgIGVzaQorICAgIHB1c2ggICAgICAgZWRpCisgICAgbW92ICAgICAgICBlZGksIFtlc3AgKyA4ICsgNF0gICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyA4ICsgOF0gICAvLyBzcmNfcHRyCisgICAgbW92ICAgICAgICBlZHgsIFtlc3AgKyA4ICsgMTJdICAvLyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyA4ICsgMTZdICAvLyBkc3Rfd2lkdGgKKyAgICBtb3YgICAgICAgIGVheCwgW2VzcCArIDggKyAyMF0gIC8vIHNvdXJjZV95X2ZyYWN0aW9uICgwLi4yNTUpCisgICAgY21wICAgICAgICBlYXgsIDAKKyAgICBqZSAgICAgICAgIHhsb29wMQorICAgIGNtcCAgICAgICAgZWF4LCAxMjgKKyAgICBqZSAgICAgICAgIHhsb29wMgorCisgICAgbW92ZCAgICAgICB4bW02LCBlYXggICAgICAgICAgICAvLyB4bW02ID0geSBmcmFjdGlvbgorICAgIHB1bnBja2x3ZCAgeG1tNiwgeG1tNgorICAgIHBzaHVmZCAgICAgeG1tNiwgeG1tNiwgMAorICAgIG5lZyAgICAgICAgZWF4ICAgICAgICAgICAgICAgICAgLy8geG1tNSA9IDI1NiAtIHkgZnJhY3Rpb24KKyAgICBhZGQgICAgICAgIGVheCwgMjU2CisgICAgbW92ZCAgICAgICB4bW01LCBlYXgKKyAgICBwdW5wY2tsd2QgIHhtbTUsIHhtbTUKKyAgICBwc2h1ZmQgICAgIHhtbTUsIHhtbTUsIDAKKyAgICBweG9yICAgICAgIHhtbTcsIHhtbTcKKworICB4bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldCisgICAgbW92ZHFhICAgICB4bW0yLCBbZXNpICsgZWR4XQorICAgIGxlYSAgICAgICAgZXNpLCBbZXNpICsgMTZdCisgICAgbW92ZHFhICAgICB4bW0xLCB4bW0wCisgICAgbW92ZHFhICAgICB4bW0zLCB4bW0yCisgICAgcHVucGNrbGJ3ICB4bW0wLCB4bW03CisgICAgcHVucGNrbGJ3ICB4bW0yLCB4bW03CisgICAgcHVucGNraGJ3ICB4bW0xLCB4bW03CisgICAgcHVucGNraGJ3ICB4bW0zLCB4bW03CisgICAgcG11bGx3ICAgICB4bW0wLCB4bW01ICAgICAgICAgICAvLyBzY2FsZSByb3cgMAorICAgIHBtdWxsdyAgICAgeG1tMSwgeG1tNQorICAgIHBtdWxsdyAgICAgeG1tMiwgeG1tNiAgICAgICAgICAgLy8gc2NhbGUgcm93IDEKKyAgICBwbXVsbHcgICAgIHhtbTMsIHhtbTYKKyAgICBwYWRkdXN3ICAgIHhtbTAsIHhtbTIgICAgICAgICAgIC8vIHN1bSByb3dzCisgICAgcGFkZHVzdyAgICB4bW0xLCB4bW0zCisgICAgcHNybHcgICAgICB4bW0wLCA4CisgICAgcHNybHcgICAgICB4bW0xLCA4CisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0xCisgICAgbW92ZHFhICAgICBbZWRpXSwgeG1tMAorICAgIGxlYSAgICAgICAgZWRpLCBbZWRpICsgMTZdCisgICAgc3ViICAgICAgICBlY3gsIDE2CisgICAgamEgICAgICAgICB4bG9vcAorCisgICAgbW92ICAgICAgICBhbCwgW2VkaSAtIDFdCisgICAgbW92ICAgICAgICBbZWRpXSwgYWwKKyAgICBwb3AgICAgICAgIGVkaQorICAgIHBvcCAgICAgICAgZXNpCisgICAgcmV0CisKKyAgeGxvb3AxOgorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VzaV0KKyAgICBsZWEgICAgICAgIGVzaSwgW2VzaSArIDE2XQorICAgIG1vdmRxYSAgICAgW2VkaV0sIHhtbTAKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSArIDE2XQorICAgIHN1YiAgICAgICAgZWN4LCAxNgorICAgIGphICAgICAgICAgeGxvb3AxCisKKyAgICBtb3YgICAgICAgIGFsLCBbZWRpIC0gMV0KKyAgICBtb3YgICAgICAgIFtlZGldLCBhbAorICAgIHBvcCAgICAgICAgZWRpCisgICAgcG9wICAgICAgICBlc2kKKyAgICByZXQKKworICB4bG9vcDI6CisgICAgbW92ZHFhICAgICB4bW0wLCBbZXNpXQorICAgIG1vdmRxYSAgICAgeG1tMiwgW2VzaSArIGVkeF0KKyAgICBsZWEgICAgICAgIGVzaSwgW2VzaSArIDE2XQorICAgIHBhdmdiICAgICAgeG1tMCwgeG1tMgorICAgIG1vdmRxYSAgICAgW2VkaV0sIHhtbTAKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSArIDE2XQorICAgIHN1YiAgICAgICAgZWN4LCAxNgorICAgIGphICAgICAgICAgeGxvb3AyCisKKyAgICBtb3YgICAgICAgIGFsLCBbZWRpIC0gMV0KKyAgICBtb3YgICAgICAgIFtlZGldLCBhbAorICAgIHBvcCAgICAgICAgZWRpCisgICAgcG9wICAgICAgICBlc2kKKyAgICByZXQKKyAgfQorfQorCisvLyBCaWxpbmVhciByb3cgZmlsdGVyaW5nIGNvbWJpbmVzIDE2eDIgLT4gMTZ4MS4gU1NTRTMgdmVyc2lvbi4KKyNkZWZpbmUgSEFTX1NDQUxFRklMVEVSUk9XU19TU1NFMworX19kZWNsc3BlYyhuYWtlZCkKK3N0YXRpYyB2b2lkIFNjYWxlRmlsdGVyUm93c19TU1NFMyh1aW50OCogZHN0X3B0ciwgY29uc3QgdWludDgqIHNyY19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV95X2ZyYWN0aW9uKSB7CisgIF9fYXNtIHsKKyAgICBwdXNoICAgICAgIGVzaQorICAgIHB1c2ggICAgICAgZWRpCisgICAgbW92ICAgICAgICBlZGksIFtlc3AgKyA4ICsgNF0gICAvLyBkc3RfcHRyCisgICAgbW92ICAgICAgICBlc2ksIFtlc3AgKyA4ICsgOF0gICAvLyBzcmNfcHRyCisgICAgbW92ICAgICAgICBlZHgsIFtlc3AgKyA4ICsgMTJdICAvLyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICBlY3gsIFtlc3AgKyA4ICsgMTZdICAvLyBkc3Rfd2lkdGgKKyAgICBtb3YgICAgICAgIGVheCwgW2VzcCArIDggKyAyMF0gIC8vIHNvdXJjZV95X2ZyYWN0aW9uICgwLi4yNTUpCisgICAgY21wICAgICAgICBlYXgsIDAKKyAgICBqZSAgICAgICAgIHhsb29wMQorICAgIGNtcCAgICAgICAgZWF4LCAxMjgKKyAgICBqZSAgICAgICAgIHhsb29wMgorCisgICAgc2hyICAgICAgICBlYXgsIDEKKyAgICBtb3YgICAgICAgIGFoLGFsCisgICAgbmVnICAgICAgICBhbAorICAgIGFkZCAgICAgICAgYWwsIDEyOAorICAgIG1vdmQgICAgICAgeG1tNSwgZWF4CisgICAgcHVucGNrbHdkICB4bW01LCB4bW01CisgICAgcHNodWZkICAgICB4bW01LCB4bW01LCAwCisKKyAgeGxvb3A6CisgICAgbW92ZHFhICAgICB4bW0wLCBbZXNpXQorICAgIG1vdmRxYSAgICAgeG1tMiwgW2VzaSArIGVkeF0KKyAgICBsZWEgICAgICAgIGVzaSwgW2VzaSArIDE2XQorICAgIG1vdmRxYSAgICAgeG1tMSwgeG1tMAorICAgIHB1bnBja2xidyAgeG1tMCwgeG1tMgorICAgIHB1bnBja2hidyAgeG1tMSwgeG1tMgorICAgIHBtYWRkdWJzdyAgeG1tMCwgeG1tNQorICAgIHBtYWRkdWJzdyAgeG1tMSwgeG1tNQorICAgIHBzcmx3ICAgICAgeG1tMCwgNworICAgIHBzcmx3ICAgICAgeG1tMSwgNworICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMQorICAgIG1vdmRxYSAgICAgW2VkaV0sIHhtbTAKKyAgICBsZWEgICAgICAgIGVkaSwgW2VkaSArIDE2XQorICAgIHN1YiAgICAgICAgZWN4LCAxNgorICAgIGphICAgICAgICAgeGxvb3AKKworICAgIG1vdiAgICAgICAgYWwsIFtlZGkgLSAxXQorICAgIG1vdiAgICAgICAgW2VkaV0sIGFsCisgICAgcG9wICAgICAgICBlZGkKKyAgICBwb3AgICAgICAgIGVzaQorICAgIHJldAorCisgIHhsb29wMToKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlc2ldCisgICAgbGVhICAgICAgICBlc2ksIFtlc2kgKyAxNl0KKyAgICBtb3ZkcWEgICAgIFtlZGldLCB4bW0wCisgICAgbGVhICAgICAgICBlZGksIFtlZGkgKyAxNl0KKyAgICBzdWIgICAgICAgIGVjeCwgMTYKKyAgICBqYSAgICAgICAgIHhsb29wMQorCisgICAgbW92ICAgICAgICBhbCwgW2VkaSAtIDFdCisgICAgbW92ICAgICAgICBbZWRpXSwgYWwKKyAgICBwb3AgICAgICAgIGVkaQorICAgIHBvcCAgICAgICAgZXNpCisgICAgcmV0CisKKyAgeGxvb3AyOgorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VzaV0KKyAgICBtb3ZkcWEgICAgIHhtbTIsIFtlc2kgKyBlZHhdCisgICAgbGVhICAgICAgICBlc2ksIFtlc2kgKyAxNl0KKyAgICBwYXZnYiAgICAgIHhtbTAsIHhtbTIKKyAgICBtb3ZkcWEgICAgIFtlZGldLCB4bW0wCisgICAgbGVhICAgICAgICBlZGksIFtlZGkgKyAxNl0KKyAgICBzdWIgICAgICAgIGVjeCwgMTYKKyAgICBqYSAgICAgICAgIHhsb29wMgorCisgICAgbW92ICAgICAgICBhbCwgW2VkaSAtIDFdCisgICAgbW92ICAgICAgICBbZWRpXSwgYWwKKyAgICBwb3AgICAgICAgIGVkaQorICAgIHBvcCAgICAgICAgZXNpCisgICAgcmV0CisKKyAgfQorfQorCisvLyBOb3RlIHRoYXQgbW92ZHFhK3BhbGlnbiBtYXkgYmUgYmV0dGVyIHRoYW4gbW92ZHF1LgorLy8gQWxpZ25tZW50IHJlcXVpcmVtZW50OiBzcmNfcHRyIDE2IGJ5dGUgYWxpZ25lZCwgZHN0X3B0ciA4IGJ5dGUgYWxpZ25lZC4KK19fZGVjbHNwZWMobmFrZWQpCitzdGF0aWMgdm9pZCBTY2FsZUZpbHRlckNvbHMzNF9TU1NFMyh1aW50OCogZHN0X3B0ciwgY29uc3QgdWludDgqIHNyY19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoKSB7CisgIF9fYXNtIHsKKyAgICBtb3YgICAgICAgIGVkeCwgW2VzcCArIDRdICAgIC8vIGRzdF9wdHIKKyAgICBtb3YgICAgICAgIGVheCwgW2VzcCArIDhdICAgIC8vIHNyY19wdHIKKyAgICBtb3YgICAgICAgIGVjeCwgW2VzcCArIDEyXSAgIC8vIGRzdF93aWR0aAorICAgIG1vdmRxYSAgICAgeG1tMSwgX3JvdW5kMzQKKyAgICBtb3ZkcWEgICAgIHhtbTIsIF9zaHVmMDEKKyAgICBtb3ZkcWEgICAgIHhtbTMsIF9zaHVmMTEKKyAgICBtb3ZkcWEgICAgIHhtbTQsIF9zaHVmMjEKKyAgICBtb3ZkcWEgICAgIHhtbTUsIF9tYWRkMDEKKyAgICBtb3ZkcWEgICAgIHhtbTYsIF9tYWRkMTEKKyAgICBtb3ZkcWEgICAgIHhtbTcsIF9tYWRkMjEKKworICB3bG9vcDoKKyAgICBtb3ZkcWEgICAgIHhtbTAsIFtlYXhdICAgICAgICAgICAvLyBwaXhlbHMgMC4uNworICAgIHBzaHVmYiAgICAgeG1tMCwgeG1tMgorICAgIHBtYWRkdWJzdyAgeG1tMCwgeG1tNQorICAgIHBhZGRzdyAgICAgeG1tMCwgeG1tMQorICAgIHBzcmx3ICAgICAgeG1tMCwgMgorICAgIHBhY2t1c3diICAgeG1tMCwgeG1tMAorICAgIG1vdnEgICAgICAgcXdvcmQgcHRyIFtlZHhdLCB4bW0wCisgICAgbW92ZHF1ICAgICB4bW0wLCBbZWF4KzhdICAgICAgICAgLy8gcGl4ZWxzIDguLjE1CisgICAgcHNodWZiICAgICB4bW0wLCB4bW0zCisgICAgcG1hZGR1YnN3ICB4bW0wLCB4bW02CisgICAgcGFkZHN3ICAgICB4bW0wLCB4bW0xCisgICAgcHNybHcgICAgICB4bW0wLCAyCisgICAgcGFja3Vzd2IgICB4bW0wLCB4bW0wCisgICAgbW92cSAgICAgICBxd29yZCBwdHIgW2VkeCs4XSwgeG1tMAorICAgIG1vdmRxYSAgICAgeG1tMCwgW2VheCsxNl0gICAgICAgIC8vIHBpeGVscyAxNi4uMjMKKyAgICBsZWEgICAgICAgIGVheCwgW2VheCszMl0KKyAgICBwc2h1ZmIgICAgIHhtbTAsIHhtbTQKKyAgICBwbWFkZHVic3cgIHhtbTAsIHhtbTcKKyAgICBwYWRkc3cgICAgIHhtbTAsIHhtbTEKKyAgICBwc3JsdyAgICAgIHhtbTAsIDIKKyAgICBwYWNrdXN3YiAgIHhtbTAsIHhtbTAKKyAgICBtb3ZxICAgICAgIHF3b3JkIHB0ciBbZWR4KzE2XSwgeG1tMAorICAgIGxlYSAgICAgICAgZWR4LCBbZWR4KzI0XQorICAgIHN1YiAgICAgICAgZWN4LCAyNAorICAgIGphICAgICAgICAgd2xvb3AKKyAgICByZXQKKyAgfQorfQorCisjZWxpZiAoZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSkgJiYgIWRlZmluZWQoWVVWX0RJU0FCTEVfQVNNKQorCisvLyBHQ0MgdmVyc2lvbnMgb2Ygcm93IGZ1bmN0aW9ucyBhcmUgdmVyYmF0aW0gY29udmVyc2lvbnMgZnJvbSBWaXN1YWwgQy4KKy8vIEdlbmVyYXRlZCB1c2luZyBnY2MgZGlzYXNzZW1ibHkgb24gVmlzdWFsIEMgb2JqZWN0IGZpbGU6CisvLyBvYmpkdW1wIC1EIHl1dnNjYWxlci5vYmogPnl1dnNjYWxlci50eHQKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjJfU1NFMgorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duMl9TU0UyKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBhc20gdm9sYXRpbGUgKAorICAicGNtcGVxYiAgICAlJXhtbTUsJSV4bW01ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzcmx3ICAgICAgJDB4OCwlJXhtbTUgICAgICAgICAgICAgICAgICAgICAgXG4iCisiMToiCisgICJtb3ZkcWEgICAgICglMCksJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUwKSwlJXhtbTEgICAgICAgICAgICAgICAgICBcbiIKKyAgImxlYSAgICAgICAgMHgyMCglMCksJTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYW5kICAgICAgICUleG1tNSwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFuZCAgICAgICAlJXhtbTUsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICUleG1tMCwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDEwKCUxKSwlMSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInN1YiAgICAgICAgJDB4MTAsJTIgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJqYSAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICA6ICIrciIoc3JjX3B0ciksICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgLy8gJTEKKyAgICAiK3IiKGRzdF93aWR0aCkgICAvLyAlMgorICA6CisgIDogIm1lbW9yeSIsICJjYyIKKyk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjJJbnRfU1NFMihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgInBjbXBlcWIgICAgJSV4bW01LCUleG1tNSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDgsJSV4bW01ICAgICAgICAgICAgICAgICAgICAgIFxuIgorIjE6IgorICAibW92ZHFhICAgICAoJTApLCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCksJSV4bW0xICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICglMCwlMywxKSwlJXhtbTIgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUwLCUzLDEpLCUleG1tMyAgICAgICAgICAgICBcbiIKKyAgImxlYSAgICAgICAgMHgyMCglMCksJTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTMsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgJSV4bW0wLCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDgsJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAlJXhtbTEsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzcmx3ICAgICAgJDB4OCwlJXhtbTEgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYW5kICAgICAgICUleG1tNSwlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFuZCAgICAgICAlJXhtbTUsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmd3ICAgICAgJSV4bW0yLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZndyAgICAgICUleG1tMywlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTEsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgJSV4bW0wLCglMSkgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MTAoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHgxMCwlMiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgLy8gJTAKKyAgICAiK3IiKGRzdF9wdHIpLCAgICAvLyAlMQorICAgICIrciIoZHN0X3dpZHRoKSAgIC8vICUyCisgIDogInIiKChpbnRwdHJfdCkoc3JjX3N0cmlkZSkpICAgLy8gJTMKKyAgOiAibWVtb3J5IiwgImNjIgorKTsKK30KKworI2RlZmluZSBIQVNfU0NBTEVST1dET1dONF9TU0UyCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd240X1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICJwY21wZXFiICAgICUleG1tNSwlJXhtbTUgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybGQgICAgICAkMHgxOCwlJXhtbTUgICAgICAgICAgICAgICAgICAgICBcbiIKKyIxOiIKKyAgIm1vdmRxYSAgICAgKCUwKSwlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJTApLCUleG1tMSAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDIwKCUwKSwlMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhbmQgICAgICAgJSV4bW01LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYW5kICAgICAgICUleG1tNSwlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTEsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0wLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZxICAgICAgICUleG1tMCwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDgoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInN1YiAgICAgICAgJDB4OCwlMiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJqYSAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICA6ICIrciIoc3JjX3B0ciksICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgLy8gJTEKKyAgICAiK3IiKGRzdF93aWR0aCkgICAvLyAlMgorICA6CisgIDogIm1lbW9yeSIsICJjYyIKKyk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjRJbnRfU1NFMihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgaW50cHRyX3QgdGVtcCA9IDA7CisgIGFzbSB2b2xhdGlsZSAoCisgICJwY21wZXFiICAgICUleG1tNywlJXhtbTcgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybHcgICAgICAkMHg4LCUleG1tNyAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImxlYSAgICAgICAgKCU0LCU0LDIpLCUzICAgICAgICAgICAgICAgICAgICAgXG4iCisiMToiCisgICJtb3ZkcWEgICAgICglMCksJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUwKSwlJXhtbTEgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCUwLCU0LDEpLCUleG1tMiAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJTAsJTQsMSksJSV4bW0zICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTIsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0zLCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICglMCwlNCwyKSwlJXhtbTIgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUwLCU0LDIpLCUleG1tMyAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCUwLCUzLDEpLCUleG1tNCAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJTAsJTMsMSksJSV4bW01ICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDIwKCUwKSwlMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW00LCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTUsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0zLCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICUleG1tMCwlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybHcgICAgICAkMHg4LCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgJSV4bW0xLCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDgsJSV4bW0xICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFuZCAgICAgICAlJXhtbTcsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhbmQgICAgICAgJSV4bW03LCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZndyAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z3cgICAgICAlJXhtbTMsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICUleG1tMCwlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybHcgICAgICAkMHg4LCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhbmQgICAgICAgJSV4bW03LCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZndyAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdnEgICAgICAgJSV4bW0wLCglMSkgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4OCglMSksJTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHg4LCUyICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgIC8vICUxCisgICAgIityIihkc3Rfd2lkdGgpLCAgIC8vICUyCisgICAgIityIih0ZW1wKSAgICAgICAgIC8vICUzCisgIDogInIiKChpbnRwdHJfdCkoc3JjX3N0cmlkZSkpICAgIC8vICU0CisgIDogIm1lbW9yeSIsICJjYyIKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisgICAgLCAieG1tNiIsICJ4bW03IgorI2VuZGlmCispOworfQorCisjZGVmaW5lIEhBU19TQ0FMRVJPV0RPV044X1NTRTIKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjhfU1NFMihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgInBjbXBlcWIgICAgJSV4bW01LCUleG1tNSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JscSAgICAgICQweDM4LCUleG1tNSAgICAgICAgICAgICAgICAgICAgIFxuIgorIjE6IgorICAibW92ZHFhICAgICAoJTApLCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCksJSV4bW0xICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MjAoJTApLCUwICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFuZCAgICAgICAlJXhtbTUsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhbmQgICAgICAgJSV4bW01LCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWNrdXN3YiAgICUleG1tMSwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0wLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkICAgICAgICUleG1tMCwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDQoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInN1YiAgICAgICAgJDB4NCwlMiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJqYSAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICA6ICIrciIoc3JjX3B0ciksICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgLy8gJTEKKyAgICAiK3IiKGRzdF93aWR0aCkgICAvLyAlMgorICA6CisgIDogIm1lbW9yeSIsICJjYyIKKyk7Cit9CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQordm9pZCBTY2FsZVJvd0Rvd244SW50X1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCk7CisgIGFzbSgKKyAgICBERUNMQVJFX0ZVTkNUSU9OKFNjYWxlUm93RG93bjhJbnRfU1NFMikKKyAgICAicHVzaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI0KCVlc3ApLCVlc2kgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyOCglZXNwKSwlZWJ4ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MmMoJWVzcCksJWVkaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDMwKCVlc3ApLCVlY3ggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgKCVlYngsJWVieCwyKSwlZWR4ICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHhvciAgICV4bW03LCV4bW03ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyIxOiIKKyAgICAibW92ZHFhICglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDEwKCVlc2kpLCV4bW0xICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgKCVlc2ksJWVieCwxKSwleG1tMiAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIDB4MTAoJWVzaSwlZWJ4LDEpLCV4bW0zICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tMiwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTMsJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICglZXNpLCVlYngsMiksJXhtbTIgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDEwKCVlc2ksJWVieCwyKSwleG1tMyAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgKCVlc2ksJWVkeCwxKSwleG1tNCAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIDB4MTAoJWVzaSwlZWR4LDEpLCV4bW01ICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAoJWVzaSwlZWJ4LDQpLCVlYnAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgyMCglZXNpKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW00LCV4bW0yICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tNSwleG1tMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW0zLCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDAoJWVicCksJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgMHgxMCglZWJwKSwleG1tMyAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIDB4MCglZWJwLCVlYngsMSksJXhtbTQgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDEwKCVlYnAsJWVieCwxKSwleG1tNSAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTQsJXhtbTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW01LCV4bW0zICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDAoJWVicCwlZWJ4LDIpLCV4bW00ICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgMHgxMCglZWJwLCVlYngsMiksJXhtbTUgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIDB4MCglZWJwLCVlZHgsMSksJXhtbTYgICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tNiwleG1tNCAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgMHgxMCglZWJwLCVlZHgsMSksJXhtbTYgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW02LCV4bW01ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tNCwleG1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTUsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW0yLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tMywleG1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2FkYncgJXhtbTcsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNhZGJ3ICV4bW03LCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzaHVmZCAkMHhkOCwleG1tMCwleG1tMCAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmQgJDB4OGQsJXhtbTEsJXhtbTEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9yICAgICV4bW0xLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmx3ICAkMHgzLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWNrdXN3YiAleG1tMCwleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFja3Vzd2IgJXhtbTAsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmQgICAleG1tMCwoJWVkaSkgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHg0KCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDQsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3BhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCispOworCisvLyBmcGljIGlzIHVzZWQgZm9yIG1hZ2ljY2FtIHBsdWdpbgorI2lmICFkZWZpbmVkKF9fUElDX18pCisjZGVmaW5lIEhBU19TQ0FMRVJPV0RPV04zNF9TU1NFMwordm9pZCBTY2FsZVJvd0Rvd24zNF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpOworICBhc20oCisgICAgREVDTEFSRV9GVU5DVElPTihTY2FsZVJvd0Rvd24zNF9TU1NFMykKKyAgICAicHVzaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI0KCVlc3ApLCVlc2kgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyYyglZXNwKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MzAoJWVzcCksJWVjeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfc2h1ZjAsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NodWYxLCV4bW00ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9zaHVmMiwleG1tNSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyIxOiIKKyAgICAibW92ZHFhICglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDEwKCVlc2kpLCV4bW0yICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgyMCglZXNpKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0yLCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhbGlnbnIgJDB4OCwleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmIgJXhtbTMsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW00LCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzaHVmYiAleG1tNSwleG1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZxICAgJXhtbTAsKCVlZGkpICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92cSAgICV4bW0xLDB4OCglZWRpKSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdnEgICAleG1tMiwweDEwKCVlZGkpICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxOCglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDE4LCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3BhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCispOworCit2b2lkIFNjYWxlUm93RG93bjM0XzFfSW50X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCk7CisgIGFzbSgKKyAgICBERUNMQVJFX0ZVTkNUSU9OKFNjYWxlUm93RG93bjM0XzFfSW50X1NTU0UzKQorICAgICJwdXNoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MjQoJWVzcCksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI4KCVlc3ApLCVlYnAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyYyglZXNwKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MzAoJWVzcCksJWVjeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfc2h1ZjAxLCV4bW0yICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NodWYxMSwleG1tMyAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9zaHVmMjEsJXhtbTQgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfbWFkZDAxLCV4bW01ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX21hZGQxMSwleG1tNiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9yb3VuZDM0LCV4bW03ICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyIxOiIKKyAgICAibW92ZHFhICglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAoJWVzaSwlZWJwKSwleG1tMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTEsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW0yLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBtYWRkdWJzdyAleG1tNSwleG1tMCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkc3cgJXhtbTcsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybHcgICQweDIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhY2t1c3diICV4bW0wLCV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZxICAgJXhtbTAsKCVlZGkpICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHF1IDB4OCglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxdSAweDgoJWVzaSwlZWJwKSwleG1tMSAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTEsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW0zLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBtYWRkdWJzdyAleG1tNiwleG1tMCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkc3cgJXhtbTcsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybHcgICQweDIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhY2t1c3diICV4bW0wLCV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZxICAgJXhtbTAsMHg4KCVlZGkpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIDB4MTAoJWVzaSksJXhtbTAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDEwKCVlc2ksJWVicCksJXhtbTEgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgyMCglZXNpKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW0xLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzaHVmYiAleG1tNCwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgIF9tYWRkMjEsJXhtbTEgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG1hZGR1YnN3ICV4bW0xLCV4bW0wICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGRzdyAleG1tNywleG1tMCAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc3JsdyAgJDB4MiwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFja3Vzd2IgJXhtbTAsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdnEgICAleG1tMCwweDEwKCVlZGkpICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxOCglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDE4LCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInBvcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyk7CisKK3ZvaWQgU2NhbGVSb3dEb3duMzRfMF9JbnRfU1NTRTMoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKTsKKyAgYXNtKAorICAgIERFQ0xBUkVfRlVOQ1RJT04oU2NhbGVSb3dEb3duMzRfMF9JbnRfU1NTRTMpCisgICAgInB1c2hhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyNCglZXNwKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MjgoJWVzcCksJWVicCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDJjKCVlc3ApLCVlZGkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgzMCglZXNwKSwlZWN4ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9zaHVmMDEsJXhtbTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfc2h1ZjExLCV4bW0zICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NodWYyMSwleG1tNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9tYWRkMDEsJXhtbTUgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfbWFkZDExLCV4bW02ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3JvdW5kMzQsJXhtbTcgICAgICAgICAgICAgICAgICAgICBcbiIKKworIjE6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICglZXNpLCVlYnAsMSksJXhtbTEgICAgICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTEsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW0yLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBtYWRkdWJzdyAleG1tNSwleG1tMCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkc3cgJXhtbTcsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybHcgICQweDIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhY2t1c3diICV4bW0wLCV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZxICAgJXhtbTAsKCVlZGkpICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHF1IDB4OCglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxdSAweDgoJWVzaSwlZWJwLDEpLCV4bW0xICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTAsJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW0xLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzaHVmYiAleG1tMywleG1tMCAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwbWFkZHVic3cgJXhtbTYsJXhtbTAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFkZHN3ICV4bW03LCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmx3ICAkMHgyLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWNrdXN3YiAleG1tMCwleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92cSAgICV4bW0wLDB4OCglZWRpKSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAweDEwKCVlc2kpLCV4bW0wICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgMHgxMCglZXNpLCVlYnAsMSksJXhtbTEgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4MjAoJWVzaSksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhdmdiICAleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTEsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW00LCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAgX21hZGQyMSwleG1tMSAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwbWFkZHVic3cgJXhtbTEsJXhtbTAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFkZHN3ICV4bW03LCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmx3ICAkMHgyLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWNrdXN3YiAleG1tMCwleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92cSAgICV4bW0wLDB4MTAoJWVkaSkgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDE4KCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJzdWIgICAgJDB4MTgsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamEgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBvcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyk7CisKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjM4X1NTU0UzCit2b2lkIFNjYWxlUm93RG93bjM4X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCk7CisgIGFzbSgKKyAgICBERUNMQVJFX0ZVTkNUSU9OKFNjYWxlUm93RG93bjM4X1NTU0UzKQorICAgICJwdXNoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MjQoJWVzcCksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI4KCVlc3ApLCVlZHggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyYyglZXNwKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MzAoJWVzcCksJWVjeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfc2h1ZjM4YSAsJXhtbTQgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NodWYzOGIgLCV4bW01ICAgICAgICAgICAgICAgICAgICBcbiIKKworIjE6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIDB4MTAoJWVzaSksJXhtbTEgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDIwKCVlc2kpLCVlc2kgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmIgJXhtbTQsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW01LCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c2IgJXhtbTEsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZxICAgJXhtbTAsKCVlZGkpICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92aGxwcyAleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmQgICAleG1tMSwweDgoJWVkaSkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHhjKCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweGMsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3BhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCispOworCit2b2lkIFNjYWxlUm93RG93bjM4XzNfSW50X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCk7CisgIGFzbSgKKyAgICBERUNMQVJFX0ZVTkNUSU9OKFNjYWxlUm93RG93bjM4XzNfSW50X1NTU0UzKQorICAgICJwdXNoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MjQoJWVzcCksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI4KCVlc3ApLCVlZHggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyYyglZXNwKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MzAoJWVzcCksJWVjeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfc2h1ZmFjMCwleG1tNCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NodWZhYzMsJXhtbTUgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9zY2FsZWFjMywleG1tNiAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInB4b3IgICAleG1tNywleG1tNyAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisiMToiCisgICAgIm1vdmRxYSAoJWVzaSksJXhtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgKCVlc2ksJWVkeCwxKSwleG1tMiAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92aGxwcyAleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmhscHMgJXhtbTIsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsYncgJXhtbTcsJXhtbTAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVucGNrbGJ3ICV4bW03LCV4bW0xICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInB1bnBja2xidyAleG1tNywleG1tMiAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsYncgJXhtbTcsJXhtbTMgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFkZHVzdyAleG1tMiwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c3cgJXhtbTMsJXhtbTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgKCVlc2ksJWVkeCwyKSwleG1tMiAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4MTAoJWVzaSksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmhscHMgJXhtbTIsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsYncgJXhtbTcsJXhtbTIgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVucGNrbGJ3ICV4bW03LCV4bW0zICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c3cgJXhtbTIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkdXN3ICV4bW0zLCV4bW0xICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0wLCV4bW0yICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmxkcSAkMHgyLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkdXN3ICV4bW0wLCV4bW0yICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybGRxICQweDIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c3cgJXhtbTAsJXhtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmIgJXhtbTQsJXhtbTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0xLCV4bW0zICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmxkcSAkMHgyLCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkdXN3ICV4bW0xLCV4bW0zICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybGRxICQweDIsJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c3cgJXhtbTEsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmIgJXhtbTUsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFkZHVzdyAleG1tMywleG1tMiAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBtdWxodXcgJXhtbTYsJXhtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWNrdXN3YiAleG1tMiwleG1tMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZCAgICV4bW0yLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBleHRydyAkMHgyLCV4bW0yLCVlYXggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgJWF4LDB4NCglZWRpKSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4NiglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInN1YiAgICAkMHg2LCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJqYSAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9wYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorKTsKKwordm9pZCBTY2FsZVJvd0Rvd24zOF8yX0ludF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpOworICBhc20oCisgICAgREVDTEFSRV9GVU5DVElPTihTY2FsZVJvd0Rvd24zOF8yX0ludF9TU1NFMykKKyAgICAicHVzaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI0KCVlc3ApLCVlc2kgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyOCglZXNwKSwlZWR4ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MmMoJWVzcCksJWVkaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDMwKCVlc3ApLCVlY3ggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NodWZhYjAsJXhtbTQgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhIF9zaHVmYWIxLCV4bW01ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSBfc2h1ZmFiMiwleG1tNiAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgX3NjYWxlYWIyLCV4bW03ICAgICAgICAgICAgICAgICAgICBcbiIKKworIjE6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0yICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICglZXNpLCVlZHgsMSksJXhtbTIgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDEwKCVlc2kpLCVlc2kgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgJXhtbTIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZiICV4bW00LCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMiwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmIgJXhtbTUsJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFkZHVzdyAleG1tMSwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzaHVmYiAleG1tNiwleG1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkdXN3ICV4bW0yLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG11bGh1dyAleG1tNywleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhY2t1c3diICV4bW0wLCV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkICAgJXhtbTAsKCVlZGkpICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGV4dHJ3ICQweDIsJXhtbTAsJWVheCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAlYXgsMHg0KCVlZGkpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHg2KCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDYsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3BhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCispOworI2VuZGlmIC8vIF9fUElDX18KKworI2RlZmluZSBIQVNfU0NBTEVBRERST1dTX1NTRTIKK3ZvaWQgU2NhbGVBZGRSb3dzX1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNiogZHN0X3B0ciwgaW50IHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCk7CisgIGFzbSgKKyAgICBERUNMQVJFX0ZVTkNUSU9OKFNjYWxlQWRkUm93c19TU0UyKQorICAgICJwdXNoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MjQoJWVzcCksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDI4KCVlc3ApLCVlZHggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgyYyglZXNwKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MzAoJWVzcCksJWVjeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDM0KCVlc3ApLCVlYnggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJweG9yICAgJXhtbTUsJXhtbTUgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworIjE6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0yICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgICglZXNpLCVlZHgsMSksJWVheCAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmhscHMgJXhtbTIsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgLTB4MSglZWJ4KSwlZWJwICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVucGNrbGJ3ICV4bW01LCV4bW0yICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInB1bnBja2xidyAleG1tNSwleG1tMyAgICAgICAgICAgICAgICAgICAgIFxuIgorCisiMjoiCisgICAgIm1vdmRxYSAoJWVheCksJXhtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgKCVlYXgsJWVkeCwxKSwlZWF4ICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92aGxwcyAleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInB1bnBja2xidyAleG1tNSwleG1tMCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsYncgJXhtbTUsJXhtbTEgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGFkZHVzdyAleG1tMCwleG1tMiAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c3cgJXhtbTEsJXhtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJzdWIgICAgJDB4MSwlZWJwICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamEgICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAibW92ZHFhICV4bW0yLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMywweDEwKCVlZGkpICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgyMCglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4MTAoJWVzaSksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInN1YiAgICAkMHgxMCwlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJqYSAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9wYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorKTsKKworLy8gQmlsaW5lYXIgcm93IGZpbHRlcmluZyBjb21iaW5lcyAxNngyIC0+IDE2eDEuIFNTRTIgdmVyc2lvbgorI2RlZmluZSBIQVNfU0NBTEVGSUxURVJST1dTX1NTRTIKK3ZvaWQgU2NhbGVGaWx0ZXJSb3dzX1NTRTIodWludDgqIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBzb3VyY2VfeV9mcmFjdGlvbik7CisgIGFzbSgKKyAgICBERUNMQVJFX0ZVTkNUSU9OKFNjYWxlRmlsdGVyUm93c19TU0UyKQorICAgICJwdXNoICAgJWVzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVzaCAgICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweGMoJWVzcCksJWVkaSAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgxMCglZXNwKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MTQoJWVzcCksJWVkeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDE4KCVlc3ApLCVlY3ggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgxYyglZXNwKSwlZWF4ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiY21wICAgICQweDAsJWVheCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImplICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJjbXAgICAgJDB4ODAsJWVheCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamUgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmQgICAlZWF4LCV4bW02ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsd2QgJXhtbTYsJXhtbTYgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNodWZkICQweDAsJXhtbTYsJXhtbTYgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm5lZyAgICAlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJhZGQgICAgJDB4MTAwLCVlYXggICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZCAgICVlYXgsJXhtbTUgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInB1bnBja2x3ZCAleG1tNSwleG1tNSAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwc2h1ZmQgJDB4MCwleG1tNSwleG1tNSAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHhvciAgICV4bW03LCV4bW03ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyIxOiIKKyAgICAibW92ZHFhICglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAoJWVzaSwlZWR4LDEpLCV4bW0yICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxMCglZXNpKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0wLCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMiwleG1tMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsYncgJXhtbTcsJXhtbTAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVucGNrbGJ3ICV4bW03LCV4bW0yICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInB1bnBja2hidyAleG1tNywleG1tMSAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2toYncgJXhtbTcsJXhtbTMgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG11bGx3ICV4bW01LCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBtdWxsdyAleG1tNSwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwbXVsbHcgJXhtbTYsJXhtbTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG11bGx3ICV4bW02LCV4bW0zICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBhZGR1c3cgJXhtbTIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWRkdXN3ICV4bW0zLCV4bW0xICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybHcgICQweDgsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmx3ICAkMHg4LCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWNrdXN3YiAleG1tMSwleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0wLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDEwKCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJzdWIgICAgJDB4MTAsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamEgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAtMHgxKCVlZGkpLCVhbCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgJWFsLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9wICAgICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBvcCAgICAlZXNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworIjI6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4MTAoJWVzaSksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMCwoJWVkaSkgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxMCglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDEwLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgIm1vdiAgICAtMHgxKCVlZGkpLCVhbCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgJWFsLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9wICAgICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBvcCAgICAlZXNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworIjM6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICglZXNpLCVlZHgsMSksJXhtbTIgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDEwKCVlc2kpLCVlc2kgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYXZnYiAgJXhtbTIsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0wLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDEwKCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJzdWIgICAgJDB4MTAsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamEgICAgIDNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAibW92ICAgIC0weDEoJWVkaSksJWFsICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAlYWwsKCVlZGkpICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3AgICAgJWVkaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9wICAgICVlc2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorKTsKKworLy8gQmlsaW5lYXIgcm93IGZpbHRlcmluZyBjb21iaW5lcyAxNngyIC0+IDE2eDEuIFNTU0UzIHZlcnNpb24KKyNkZWZpbmUgSEFTX1NDQUxFRklMVEVSUk9XU19TU1NFMwordm9pZCBTY2FsZUZpbHRlclJvd3NfU1NTRTModWludDgqIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IHNvdXJjZV95X2ZyYWN0aW9uKTsKKyAgYXNtKAorICAgIERFQ0xBUkVfRlVOQ1RJT04oU2NhbGVGaWx0ZXJSb3dzX1NTU0UzKQorICAgICJwdXNoICAgJWVzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVzaCAgICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweGMoJWVzcCksJWVkaSAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgxMCglZXNwKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgIDB4MTQoJWVzcCksJWVkeCAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAweDE4KCVlc3ApLCVlY3ggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgMHgxYyglZXNwKSwlZWF4ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiY21wICAgICQweDAsJWVheCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImplICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJjbXAgICAgJDB4ODAsJWVheCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamUgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInNociAgICAlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgJWFsLCVhaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibmVnICAgICVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImFkZCAgICAkMHg4MCwlYWwgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkICAgJWVheCwleG1tNSAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVucGNrbHdkICV4bW01LCV4bW01ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzaHVmZCAkMHgwLCV4bW01LCV4bW01ICAgICAgICAgICAgICAgICAgIFxuIgorCisiMToiCisgICAgIm1vdmRxYSAoJWVzaSksJXhtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3ZkcWEgKCVlc2ksJWVkeCwxKSwleG1tMiAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4MTAoJWVzaSksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMCwleG1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwdW5wY2tsYncgJXhtbTIsJXhtbTAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHVucGNraGJ3ICV4bW0yLCV4bW0xICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBtYWRkdWJzdyAleG1tNSwleG1tMCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwbWFkZHVic3cgJXhtbTUsJXhtbTEgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicHNybHcgICQweDcsJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBzcmx3ICAkMHg3LCV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwYWNrdXN3YiAleG1tMSwleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ZHFhICV4bW0wLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImxlYSAgICAweDEwKCVlZGkpLCVlZGkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJzdWIgICAgJDB4MTAsJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAiamEgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdiAgICAtMHgxKCVlZGkpLCVhbCAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgJWFsLCglZWRpKSAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicG9wICAgICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBvcCAgICAlZXNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworIjI6IgorICAgICJtb3ZkcWEgKCVlc2kpLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibGVhICAgIDB4MTAoJWVzaSksJWVzaSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMCwoJWVkaSkgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxMCglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDEwLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgLTB4MSglZWRpKSwlYWwgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgICVhbCwoJWVkaSkgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBvcCAgICAlZWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3AgICAgJWVzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyIzOiIKKyAgICAibW92ZHFhICglZXNpKSwleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAoJWVzaSwlZWR4LDEpLCV4bW0yICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxMCglZXNpKSwlZXNpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicGF2Z2IgICV4bW0yLCV4bW0wICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgIm1vdmRxYSAleG1tMCwoJWVkaSkgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJsZWEgICAgMHgxMCglZWRpKSwlZWRpICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAic3ViICAgICQweDEwLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgImphICAgICAzYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJtb3YgICAgLTB4MSglZWRpKSwlYWwgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAibW92ICAgICVhbCwoJWVkaSkgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInBvcCAgICAlZWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJwb3AgICAgJWVzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAicmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCispOworCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd244SW50X1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICJsZWEgICAgICAgICglMywlMywyKSwlJXIxMCAgICAgICAgICAgICAgICAgIFxuIgorICAicHhvciAgICAgICAlJXhtbTcsJSV4bW03ICAgICAgICAgICAgICAgICAgICBcbiIKKyIxOiIKKyAgIm1vdmRxYSAgICAgKCUwKSwlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJTApLCUleG1tMSAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAoJTAsJTMsMSksJSV4bW0yICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCwlMywxKSwlJXhtbTMgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTMsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCUwLCUzLDIpLCUleG1tMiAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJTAsJTMsMiksJSV4bW0zICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAoJTAsJSVyMTAsMSksJSV4bW00ICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCwlJXIxMCwxKSwlJXhtbTUgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgICglMCwlMyw0KSwlJXIxMSAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDIwKCUwKSwlMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW00LCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tNSwlJXhtbTMgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTIsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0zLCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MCglJXIxMSksJSV4bW0yICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUlcjExKSwlJXhtbTMgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgwKCUlcjExLCUzLDEpLCUleG1tNCAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJSVyMTEsJTMsMSksJSV4bW01ICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTQsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW01LCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MCglJXIxMSwlMywyKSwlJXhtbTQgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUlcjExLCUzLDIpLCUleG1tNSAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgwKCUlcjExLCUlcjEwLDEpLCUleG1tNiAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tNiwlJXhtbTQgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUlcjExLCUlcjEwLDEpLCUleG1tNiAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW02LCUleG1tNSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tNCwlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTUsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0yLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tMywlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNhZGJ3ICAgICAlJXhtbTcsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzYWRidyAgICAgJSV4bW03LCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmQgICAgICQweGQ4LCUleG1tMCwlJXhtbTAgICAgICAgICAgICAgIFxuIgorICAicHNodWZkICAgICAkMHg4ZCwlJXhtbTEsJSV4bW0xICAgICAgICAgICAgICBcbiIKKyAgInBvciAgICAgICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDMsJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0wLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkICAgICAgICUleG1tMCwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDQoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInN1YiAgICAgICAgJDB4NCwlMiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJqYSAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICA6ICIrciIoc3JjX3B0ciksICAgICAvLyAlMAorICAgICIrciIoZHN0X3B0ciksICAgICAvLyAlMQorICAgICIrciIoZHN0X3dpZHRoKSAgICAvLyAlMgorICA6ICJyIigoaW50cHRyX3QpKHNyY19zdHJpZGUpKSAgIC8vICUzCisgIDogIm1lbW9yeSIsICJjYyIsICJyMTAiLCAicjExIiwgInhtbTYiLCAieG1tNyIKKyk7Cit9CisKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjM0X1NTU0UzCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zNF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBhc20gdm9sYXRpbGUgKAorICAibW92ZHFhICAgICAoJTMpLCUleG1tMyAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCU0KSwlJXhtbTQgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICglNSksJSV4bW01ICAgICAgICAgICAgICAgICAgICAgIFxuIgorIjE6IgorICAibW92ZHFhICAgICAoJTApLCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCksJSV4bW0yICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MjAoJTApLCUwICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAlJXhtbTIsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhbGlnbnIgICAgJDB4OCwlJXhtbTAsJSV4bW0xICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmIgICAgICUleG1tMywlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNodWZiICAgICAlJXhtbTQsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzaHVmYiAgICAgJSV4bW01LCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZxICAgICAgICUleG1tMCwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92cSAgICAgICAlJXhtbTEsMHg4KCUxKSAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdnEgICAgICAgJSV4bW0yLDB4MTAoJTEpICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MTgoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHgxOCwlMiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgIC8vICUxCisgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgIDogInIiKF9zaHVmMCksICAgLy8gJTMKKyAgICAiciIoX3NodWYxKSwgICAvLyAlNAorICAgICJyIihfc2h1ZjIpICAgIC8vICU1CisgIDogIm1lbW9yeSIsICJjYyIKKyk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM0XzFfSW50X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICJtb3ZkcWEgICAgICglNCksJSV4bW0yICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gX3NodWYwMQorICAibW92ZHFhICAgICAoJTUpLCUleG1tMyAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIF9zaHVmMTEKKyAgIm1vdmRxYSAgICAgKCU2KSwlJXhtbTQgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBfc2h1ZjIxCisgICJtb3ZkcWEgICAgICglNyksJSV4bW01ICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gX21hZGQwMQorICAibW92ZHFhICAgICAoJTgpLCUleG1tNiAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIF9tYWRkMTEKKyAgIm1vdmRxYSAgICAgKCU5KSwlJXhtbTcgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBfcm91bmQzNAorICAibW92ZHFhICAgICAoJTEwKSwlJXhtbTggICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIF9tYWRkMjEKKyIxOiIKKyAgIm1vdmRxYSAgICAgKCUwKSwlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICglMCwlMyksJSV4bW0xICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTEsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzaHVmYiAgICAgJSV4bW0yLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwbWFkZHVic3cgICUleG1tNSwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHN3ICAgICAlJXhtbTcsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzcmx3ICAgICAgJDB4MiwlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWNrdXN3YiAgICUleG1tMCwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92cSAgICAgICAlJXhtbTAsKCUxKSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxdSAgICAgMHg4KCUwKSwlJXhtbTAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcXUgICAgIDB4OCglMCwlMyksJSV4bW0xICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTEsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzaHVmYiAgICAgJSV4bW0zLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwbWFkZHVic3cgICUleG1tNiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHN3ICAgICAlJXhtbTcsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzcmx3ICAgICAgJDB4MiwlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWNrdXN3YiAgICUleG1tMCwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92cSAgICAgICAlJXhtbTAsMHg4KCUxKSAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCksJSV4bW0wICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgIDB4MTAoJTAsJTMpLCUleG1tMSAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDIwKCUwKSwlMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmIgICAgICUleG1tNCwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicG1hZGR1YnN3ICAlJXhtbTgsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGRzdyAgICAgJSV4bW03LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDIsJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdnEgICAgICAgJSV4bW0wLDB4MTAoJTEpICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MTgoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHgxOCwlMiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgIC8vICUxCisgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgIDogInIiKChpbnRwdHJfdCkoc3JjX3N0cmlkZSkpLCAgLy8gJTMKKyAgICAiciIoX3NodWYwMSksICAgLy8gJTQKKyAgICAiciIoX3NodWYxMSksICAgLy8gJTUKKyAgICAiciIoX3NodWYyMSksICAgLy8gJTYKKyAgICAiciIoX21hZGQwMSksICAgLy8gJTcKKyAgICAiciIoX21hZGQxMSksICAgLy8gJTgKKyAgICAiciIoX3JvdW5kMzQpLCAgLy8gJTkKKyAgICAiciIoX21hZGQyMSkgICAgLy8gJTEwCisgIDogIm1lbW9yeSIsICJjYyIsICJ4bW02IiwgInhtbTciLCAieG1tOCIKKyk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM0XzBfSW50X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICJtb3ZkcWEgICAgICglNCksJSV4bW0yICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gX3NodWYwMQorICAibW92ZHFhICAgICAoJTUpLCUleG1tMyAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIF9zaHVmMTEKKyAgIm1vdmRxYSAgICAgKCU2KSwlJXhtbTQgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBfc2h1ZjIxCisgICJtb3ZkcWEgICAgICglNyksJSV4bW01ICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gX21hZGQwMQorICAibW92ZHFhICAgICAoJTgpLCUleG1tNiAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIF9tYWRkMTEKKyAgIm1vdmRxYSAgICAgKCU5KSwlJXhtbTcgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBfcm91bmQzNAorICAibW92ZHFhICAgICAoJTEwKSwlJXhtbTggICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIF9tYWRkMjEKKyIxOiIKKyAgIm1vdmRxYSAgICAgKCUwKSwlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICglMCwlMywxKSwlJXhtbTEgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTAsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmIgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicG1hZGR1YnN3ICAlJXhtbTUsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGRzdyAgICAgJSV4bW03LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDIsJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdnEgICAgICAgJSV4bW0wLCglMSkgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcXUgICAgIDB4OCglMCksJSV4bW0wICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHF1ICAgICAweDgoJTAsJTMsMSksJSV4bW0xICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0wLCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICUleG1tMSwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNodWZiICAgICAlJXhtbTMsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBtYWRkdWJzdyAgJSV4bW02LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWRkc3cgICAgICUleG1tNywlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybHcgICAgICAkMHgyLCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0wLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZxICAgICAgICUleG1tMCwweDgoJTEpICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUwKSwlJXhtbTAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgMHgxMCglMCwlMywxKSwlJXhtbTEgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MjAoJTApLCUwICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGF2Z2IgICAgICAlJXhtbTAsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhdmdiICAgICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmIgICAgICUleG1tNCwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicG1hZGR1YnN3ICAlJXhtbTgsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGRzdyAgICAgJSV4bW03LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsdyAgICAgICQweDIsJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdnEgICAgICAgJSV4bW0wLDB4MTAoJTEpICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MTgoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHgxOCwlMiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgIC8vICUxCisgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgIDogInIiKChpbnRwdHJfdCkoc3JjX3N0cmlkZSkpLCAgLy8gJTMKKyAgICAiciIoX3NodWYwMSksICAgLy8gJTQKKyAgICAiciIoX3NodWYxMSksICAgLy8gJTUKKyAgICAiciIoX3NodWYyMSksICAgLy8gJTYKKyAgICAiciIoX21hZGQwMSksICAgLy8gJTcKKyAgICAiciIoX21hZGQxMSksICAgLy8gJTgKKyAgICAiciIoX3JvdW5kMzQpLCAgLy8gJTkKKyAgICAiciIoX21hZGQyMSkgICAgLy8gJTEwCisgIDogIm1lbW9yeSIsICJjYyIsICJ4bW02IiwgInhtbTciLCAieG1tOCIKKyk7Cit9CisKKyNkZWZpbmUgSEFTX1NDQUxFUk9XRE9XTjM4X1NTU0UzCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBhc20gdm9sYXRpbGUgKAorICAibW92ZHFhICAgICAoJTMpLCUleG1tNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCU0KSwlJXhtbTUgICAgICAgICAgICAgICAgICAgICAgXG4iCisiMToiCisgICJtb3ZkcWEgICAgICglMCksJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAweDEwKCUwKSwlJXhtbTEgICAgICAgICAgICAgICAgICBcbiIKKyAgImxlYSAgICAgICAgMHgyMCglMCksJTAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmIgICAgICUleG1tNCwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNodWZiICAgICAlJXhtbTUsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGR1c2IgICAgJSV4bW0xLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZxICAgICAgICUleG1tMCwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92aGxwcyAgICAlJXhtbTAsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmQgICAgICAgJSV4bW0xLDB4OCglMSkgICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4YyglMSksJTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHhjLCUyICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgIC8vICUxCisgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgIDogInIiKF9zaHVmMzhhKSwgIC8vICUzCisgICAgInIiKF9zaHVmMzhiKSAgIC8vICU0CisgIDogIm1lbW9yeSIsICJjYyIKKyk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM4XzNfSW50X1NTU0UzKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIGFzbSB2b2xhdGlsZSAoCisgICJtb3ZkcWEgICAgICglNCksJSV4bW00ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAoJTUpLCUleG1tNSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCU2KSwlJXhtbTYgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJweG9yICAgICAgICUleG1tNywlJXhtbTcgICAgICAgICAgICAgICAgICAgIFxuIgorIjE6IgorICAibW92ZHFhICAgICAoJTApLCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCUwLCUzLDEpLCUleG1tMiAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZobHBzICAgICUleG1tMCwlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92aGxwcyAgICAlJXhtbTIsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInB1bnBja2xidyAgJSV4bW03LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwdW5wY2tsYncgICUleG1tNywlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHVucGNrbGJ3ICAlJXhtbTcsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInB1bnBja2xidyAgJSV4bW03LCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWRkdXN3ICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHVzdyAgICAlJXhtbTMsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCUwLCUzLDIpLCUleG1tMiAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MTAoJTApLCUwICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92aGxwcyAgICAlJXhtbTIsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInB1bnBja2xidyAgJSV4bW03LCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwdW5wY2tsYncgICUleG1tNywlJXhtbTMgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHVzdyAgICAlJXhtbTIsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGR1c3cgICAgJSV4bW0zLCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICUleG1tMCwlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybGRxICAgICAkMHgyLCUleG1tMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGR1c3cgICAgJSV4bW0wLCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsZHEgICAgICQweDIsJSV4bW0wICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHVzdyAgICAlJXhtbTAsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzaHVmYiAgICAgJSV4bW00LCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICUleG1tMSwlJXhtbTMgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNybGRxICAgICAkMHgyLCUleG1tMSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGR1c3cgICAgJSV4bW0xLCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc3JsZHEgICAgICQweDIsJSV4bW0xICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHVzdyAgICAlJXhtbTEsJSV4bW0zICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzaHVmYiAgICAgJSV4bW01LCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWRkdXN3ICAgICUleG1tMywlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuIgorICAicG11bGh1dyAgICAlJXhtbTYsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhY2t1c3diICAgJSV4bW0yLCUleG1tMiAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkICAgICAgICUleG1tMiwoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGV4dHJ3ICAgICAkMHgyLCUleG1tMiwlJWVheCAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdiAgICAgICAgJSVheCwweDQoJTEpICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4NiglMSksJTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAic3ViICAgICAgICAkMHg2LCUyICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIDogIityIihzcmNfcHRyKSwgICAgIC8vICUwCisgICAgIityIihkc3RfcHRyKSwgICAgIC8vICUxCisgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgIDogInIiKChpbnRwdHJfdCkoc3JjX3N0cmlkZSkpLCAgLy8gJTMKKyAgICAiciIoX3NodWZhYzApLCAgIC8vICU0CisgICAgInIiKF9zaHVmYWMzKSwgICAvLyAlNQorICAgICJyIihfc2NhbGVhYzMpICAgLy8gJTYKKyAgOiAibWVtb3J5IiwgImNjIiwgInJheCIsICJ4bW02IiwgInhtbTciCispOworfQorCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF8yX0ludF9TU1NFMyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCkgeworICBhc20gdm9sYXRpbGUgKAorICAibW92ZHFhICAgICAoJTQpLCUleG1tNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgKCU1KSwlJXhtbTUgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJtb3ZkcWEgICAgICglNiksJSV4bW02ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAoJTcpLCUleG1tNyAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIxOiIKKyAgIm1vdmRxYSAgICAgKCUwKSwlJXhtbTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYXZnYiAgICAgICglMCwlMywxKSwlJXhtbTIgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDEwKCUwKSwlMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgJSV4bW0yLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwc2h1ZmIgICAgICUleG1tNCwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibW92ZHFhICAgICAlJXhtbTIsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBzaHVmYiAgICAgJSV4bW01LCUleG1tMSAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwYWRkdXN3ICAgICUleG1tMSwlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicHNodWZiICAgICAlJXhtbTYsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGR1c3cgICAgJSV4bW0yLCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwbXVsaHV3ICAgICUleG1tNywlJXhtbTAgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFja3Vzd2IgICAlJXhtbTAsJSV4bW0wICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmQgICAgICAgJSV4bW0wLCglMSkgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwZXh0cncgICAgICQweDIsJSV4bW0wLCUlZWF4ICAgICAgICAgICAgICAgIFxuIgorICAibW92ICAgICAgICAlJWF4LDB4NCglMSkgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgImxlYSAgICAgICAgMHg2KCUxKSwlMSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJzdWIgICAgICAgICQweDYsJTIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAiamEgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgOiAiK3IiKHNyY19wdHIpLCAgICAgLy8gJTAKKyAgICAiK3IiKGRzdF9wdHIpLCAgICAgLy8gJTEKKyAgICAiK3IiKGRzdF93aWR0aCkgICAgLy8gJTIKKyAgOiAiciIoKGludHB0cl90KShzcmNfc3RyaWRlKSksICAvLyAlMworICAgICJyIihfc2h1ZmFiMCksICAgLy8gJTQKKyAgICAiciIoX3NodWZhYjEpLCAgIC8vICU1CisgICAgInIiKF9zaHVmYWIyKSwgICAvLyAlNgorICAgICJyIihfc2NhbGVhYjIpICAgLy8gJTcKKyAgOiAibWVtb3J5IiwgImNjIiwgInJheCIsICJ4bW02IiwgInhtbTciCispOworfQorCisjZGVmaW5lIEhBU19TQ0FMRUFERFJPV1NfU1NFMgorc3RhdGljIHZvaWQgU2NhbGVBZGRSb3dzX1NTRTIoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2KiBkc3RfcHRyLCBpbnQgc3JjX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQpIHsKKyAgYXNtIHZvbGF0aWxlICgKKyAgInB4b3IgICAgICAgJSV4bW01LCUleG1tNSAgICAgICAgICAgICAgICAgICAgXG4iCisiMToiCisgICJtb3ZkcWEgICAgICglMCksJSV4bW0yICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAoJTAsJTQsMSksJSVyMTAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmhscHMgICAgJSV4bW0yLCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIC0weDEoJTMpLCUlcjExICAgICAgICAgICAgICAgICAgIFxuIgorICAicHVucGNrbGJ3ICAlJXhtbTUsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInB1bnBja2xidyAgJSV4bW01LCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisKKyIyOiIKKyAgIm1vdmRxYSAgICAgKCUlcjEwKSwlJXhtbTAgICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgICglJXIxMCwlNCwxKSwlJXIxMCAgICAgICAgICAgICAgIFxuIgorICAibW92aGxwcyAgICAlJXhtbTAsJSV4bW0xICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInB1bnBja2xidyAgJSV4bW01LCUleG1tMCAgICAgICAgICAgICAgICAgICAgXG4iCisgICJwdW5wY2tsYncgICUleG1tNSwlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuIgorICAicGFkZHVzdyAgICAlJXhtbTAsJSV4bW0yICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInBhZGR1c3cgICAgJSV4bW0xLCUleG1tMyAgICAgICAgICAgICAgICAgICAgXG4iCisgICJzdWIgICAgICAgICQweDEsJSVyMTEgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAiamEgICAgICAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAibW92ZHFhICAgICAlJXhtbTIsKCUxKSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgIm1vdmRxYSAgICAgJSV4bW0zLDB4MTAoJTEpICAgICAgICAgICAgICAgICAgXG4iCisgICJsZWEgICAgICAgIDB4MjAoJTEpLCUxICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAibGVhICAgICAgICAweDEwKCUwKSwlMCAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgInN1YiAgICAgICAgJDB4MTAsJTIgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICJqYSAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICA6ICIrciIoc3JjX3B0ciksICAgICAvLyAlMAorICAgICIrciIoZHN0X3B0ciksICAgICAvLyAlMQorICAgICIrciIoc3JjX3dpZHRoKSwgICAvLyAlMgorICAgICIrciIoc3JjX2hlaWdodCkgICAvLyAlMworICA6ICJyIigoaW50cHRyX3QpKHNyY19zdHJpZGUpKSAgLy8gJTQKKyAgOiAibWVtb3J5IiwgImNjIiwgInIxMCIsICJyMTEiCispOworfQorCisvLyBCaWxpbmVhciByb3cgZmlsdGVyaW5nIGNvbWJpbmVzIDE2eDIgLT4gMTZ4MS4gU1NFMiB2ZXJzaW9uCisjZGVmaW5lIEhBU19TQ0FMRUZJTFRFUlJPV1NfU1NFMgorc3RhdGljIHZvaWQgU2NhbGVGaWx0ZXJSb3dzX1NTRTIodWludDgqIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgc291cmNlX3lfZnJhY3Rpb24pIHsKKyAgaWYgKHNvdXJjZV95X2ZyYWN0aW9uID09IDApIHsKKyAgICBhc20gdm9sYXRpbGUgKAorICAgICIxOiIKKyAgICAgICJtb3ZkcWEgICAgICglMSksJSV4bW0wICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibGVhICAgICAgICAweDEwKCUxKSwlMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdmRxYSAgICAgJSV4bW0wLCglMCkgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJsZWEgICAgICAgIDB4MTAoJTApLCUwICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAic3ViICAgICAgICAkMHgxMCwlMiAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3YgICAgICAgIC0weDEoJTApLCUlYWwgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ICAgICAgICAlJWFsLCglMCkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgOiAiK3IiKGRzdF9wdHIpLCAgICAgLy8gJTAKKyAgICAgICAgIityIihzcmNfcHRyKSwgICAgIC8vICUxCisgICAgICAgICIrciIoZHN0X3dpZHRoKSAgICAvLyAlMgorICAgICAgOgorICAgICAgOiAibWVtb3J5IiwgImNjIiwgInJheCIKKyAgICApOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChzb3VyY2VfeV9mcmFjdGlvbiA9PSAxMjgpIHsKKyAgICBhc20gdm9sYXRpbGUgKAorICAgICIxOiIKKyAgICAgICJtb3ZkcWEgICAgICglMSksJSV4bW0wICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZHFhICAgICAoJTEsJTMsMSksJSV4bW0yICAgICAgICAgICAgIFxuIgorICAgICAgImxlYSAgICAgICAgMHgxMCglMSksJTEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwYXZnYiAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZHFhICAgICAlJXhtbTAsKCUwKSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImxlYSAgICAgICAgMHgxMCglMCksJTAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJzdWIgICAgICAgICQweDEwLCUyICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAiamEgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdiAgICAgICAgLTB4MSglMCksJSVhbCAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3YgICAgICAgICUlYWwsKCUwKSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICA6ICIrciIoZHN0X3B0ciksICAgICAvLyAlMAorICAgICAgICAiK3IiKHNyY19wdHIpLCAgICAgLy8gJTEKKyAgICAgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgICAgICA6ICJyIigoaW50cHRyX3QpKHNyY19zdHJpZGUpKSAgLy8gJTMKKyAgICAgIDogIm1lbW9yeSIsICJjYyIsICJyYXgiCisgICAgKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgYXNtIHZvbGF0aWxlICgKKyAgICAgICJtb3YgICAgICAgICUzLCUlZWF4ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZCAgICAgICAlJWVheCwlJXhtbTYgICAgICAgICAgICAgICAgIFxuIgorICAgICAgInB1bnBja2x3ZCAgJSV4bW02LCUleG1tNiAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwc2h1ZmQgICAgICQweDAsJSV4bW02LCUleG1tNiAgICAgICAgICAgXG4iCisgICAgICAibmVnICAgICAgICAlJWVheCAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImFkZCAgICAgICAgJDB4MTAwLCUlZWF4ICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3ZkICAgICAgICUlZWF4LCUleG1tNSAgICAgICAgICAgICAgICAgXG4iCisgICAgICAicHVucGNrbHdkICAlJXhtbTUsJSV4bW01ICAgICAgICAgICAgICAgIFxuIgorICAgICAgInBzaHVmZCAgICAgJDB4MCwlJXhtbTUsJSV4bW01ICAgICAgICAgICBcbiIKKyAgICAgICJweG9yICAgICAgICUleG1tNywlJXhtbTcgICAgICAgICAgICAgICAgXG4iCisgICAgIjE6IgorICAgICAgIm1vdmRxYSAgICAgKCUxKSwlJXhtbTAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3ZkcWEgICAgICglMSwlNCwxKSwlJXhtbTIgICAgICAgICAgICAgXG4iCisgICAgICAibGVhICAgICAgICAweDEwKCUxKSwlMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdmRxYSAgICAgJSV4bW0wLCUleG1tMSAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3ZkcWEgICAgICUleG1tMiwlJXhtbTMgICAgICAgICAgICAgICAgXG4iCisgICAgICAicHVucGNrbGJ3ICAlJXhtbTcsJSV4bW0wICAgICAgICAgICAgICAgIFxuIgorICAgICAgInB1bnBja2xidyAgJSV4bW03LCUleG1tMiAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwdW5wY2toYncgICUleG1tNywlJXhtbTEgICAgICAgICAgICAgICAgXG4iCisgICAgICAicHVucGNraGJ3ICAlJXhtbTcsJSV4bW0zICAgICAgICAgICAgICAgIFxuIgorICAgICAgInBtdWxsdyAgICAgJSV4bW01LCUleG1tMCAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwbXVsbHcgICAgICUleG1tNSwlJXhtbTEgICAgICAgICAgICAgICAgXG4iCisgICAgICAicG11bGx3ICAgICAlJXhtbTYsJSV4bW0yICAgICAgICAgICAgICAgIFxuIgorICAgICAgInBtdWxsdyAgICAgJSV4bW02LCUleG1tMyAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwYWRkdXN3ICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgXG4iCisgICAgICAicGFkZHVzdyAgICAlJXhtbTMsJSV4bW0xICAgICAgICAgICAgICAgIFxuIgorICAgICAgInBzcmx3ICAgICAgJDB4OCwlJXhtbTAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwc3JsdyAgICAgICQweDgsJSV4bW0xICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAicGFja3Vzd2IgICAlJXhtbTEsJSV4bW0wICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdmRxYSAgICAgJSV4bW0wLCglMCkgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJsZWEgICAgICAgIDB4MTAoJTApLCUwICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAic3ViICAgICAgICAkMHgxMCwlMiAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3YgICAgICAgIC0weDEoJTApLCUlYWwgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ICAgICAgICAlJWFsLCglMCkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgOiAiK3IiKGRzdF9wdHIpLCAgICAgLy8gJTAKKyAgICAgICAgIityIihzcmNfcHRyKSwgICAgIC8vICUxCisgICAgICAgICIrciIoZHN0X3dpZHRoKSwgICAvLyAlMgorICAgICAgICAiK3IiKHNvdXJjZV95X2ZyYWN0aW9uKSAgLy8gJTMKKyAgICAgIDogInIiKChpbnRwdHJfdCkoc3JjX3N0cmlkZSkpICAvLyAlNAorICAgICAgOiAibWVtb3J5IiwgImNjIiwgInJheCIsICJ4bW02IiwgInhtbTciCisgICAgKTsKKyAgfQorICByZXR1cm47Cit9CisKKy8vIEJpbGluZWFyIHJvdyBmaWx0ZXJpbmcgY29tYmluZXMgMTZ4MiAtPiAxNngxLiBTU1NFMyB2ZXJzaW9uCisjZGVmaW5lIEhBU19TQ0FMRUZJTFRFUlJPV1NfU1NTRTMKK3N0YXRpYyB2b2lkIFNjYWxlRmlsdGVyUm93c19TU1NFMyh1aW50OCogZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IHNvdXJjZV95X2ZyYWN0aW9uKSB7CisgIGlmIChzb3VyY2VfeV9mcmFjdGlvbiA9PSAwKSB7CisgICAgYXNtIHZvbGF0aWxlICgKKyAgICIxOiIKKyAgICAgICJtb3ZkcWEgICAgICglMSksJSV4bW0wICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibGVhICAgICAgICAweDEwKCUxKSwlMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdmRxYSAgICAgJSV4bW0wLCglMCkgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJsZWEgICAgICAgIDB4MTAoJTApLCUwICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAic3ViICAgICAgICAkMHgxMCwlMiAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImphICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3YgICAgICAgIC0weDEoJTApLCUlYWwgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ICAgICAgICAlJWFsLCglMCkgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgOiAiK3IiKGRzdF9wdHIpLCAgICAgLy8gJTAKKyAgICAgICAgIityIihzcmNfcHRyKSwgICAgIC8vICUxCisgICAgICAgICIrciIoZHN0X3dpZHRoKSAgICAvLyAlMgorICAgICAgOgorICAgICAgOiAibWVtb3J5IiwgImNjIiwgInJheCIKKyAgICApOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChzb3VyY2VfeV9mcmFjdGlvbiA9PSAxMjgpIHsKKyAgICBhc20gdm9sYXRpbGUgKAorICAgICIxOiIKKyAgICAgICJtb3ZkcWEgICAgICglMSksJSV4bW0wICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZHFhICAgICAoJTEsJTMsMSksJSV4bW0yICAgICAgICAgICAgIFxuIgorICAgICAgImxlYSAgICAgICAgMHgxMCglMSksJTEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwYXZnYiAgICAgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZHFhICAgICAlJXhtbTAsKCUwKSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImxlYSAgICAgICAgMHgxMCglMCksJTAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJzdWIgICAgICAgICQweDEwLCUyICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAiamEgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdiAgICAgICAgLTB4MSglMCksJSVhbCAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3YgICAgICAgICUlYWwsKCUwKSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICA6ICIrciIoZHN0X3B0ciksICAgICAvLyAlMAorICAgICAgICAiK3IiKHNyY19wdHIpLCAgICAgLy8gJTEKKyAgICAgICAgIityIihkc3Rfd2lkdGgpICAgIC8vICUyCisgICAgICA6ICJyIigoaW50cHRyX3QpKHNyY19zdHJpZGUpKSAgLy8gJTMKKyAgICAgOiAibWVtb3J5IiwgImNjIiwgInJheCIKKyAgICApOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBhc20gdm9sYXRpbGUgKAorICAgICAgIm1vdiAgICAgICAgJTMsJSVlYXggICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJzaHIgICAgICAgICUlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ICAgICAgICAlJWFsLCUlYWggICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm5lZyAgICAgICAgJSVhbCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJhZGQgICAgICAgICQweDgwLCUlYWwgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZCAgICAgICAlJWVheCwlJXhtbTUgICAgICAgICAgICAgICAgIFxuIgorICAgICAgInB1bnBja2x3ZCAgJSV4bW01LCUleG1tNSAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwc2h1ZmQgICAgICQweDAsJSV4bW01LCUleG1tNSAgICAgICAgICAgXG4iCisgICAgIjE6IgorICAgICAgIm1vdmRxYSAgICAgKCUxKSwlJXhtbTAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3ZkcWEgICAgICglMSwlNCwxKSwlJXhtbTIgICAgICAgICAgICAgXG4iCisgICAgICAibGVhICAgICAgICAweDEwKCUxKSwlMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdmRxYSAgICAgJSV4bW0wLCUleG1tMSAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwdW5wY2tsYncgICUleG1tMiwlJXhtbTAgICAgICAgICAgICAgICAgXG4iCisgICAgICAicHVucGNraGJ3ICAlJXhtbTIsJSV4bW0xICAgICAgICAgICAgICAgIFxuIgorICAgICAgInBtYWRkdWJzdyAgJSV4bW01LCUleG1tMCAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwbWFkZHVic3cgICUleG1tNSwlJXhtbTEgICAgICAgICAgICAgICAgXG4iCisgICAgICAicHNybHcgICAgICAkMHg3LCUleG1tMCAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgInBzcmx3ICAgICAgJDB4NywlJXhtbTEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJwYWNrdXN3YiAgICUleG1tMSwlJXhtbTAgICAgICAgICAgICAgICAgXG4iCisgICAgICAibW92ZHFhICAgICAlJXhtbTAsKCUwKSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgImxlYSAgICAgICAgMHgxMCglMCksJTAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJzdWIgICAgICAgICQweDEwLCUyICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAiamEgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgIm1vdiAgICAgICAgLTB4MSglMCksJSVhbCAgICAgICAgICAgICAgICBcbiIKKyAgICAgICJtb3YgICAgICAgICUlYWwsKCUwKSAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICA6ICIrciIoZHN0X3B0ciksICAgICAvLyAlMAorICAgICAgICAiK3IiKHNyY19wdHIpLCAgICAgLy8gJTEKKyAgICAgICAgIityIihkc3Rfd2lkdGgpLCAgIC8vICUyCisgICAgICAgICIrciIoc291cmNlX3lfZnJhY3Rpb24pICAvLyAlMworICAgICAgOiAiciIoKGludHB0cl90KShzcmNfc3RyaWRlKSkgIC8vICU0CisgICAgICA6ICJtZW1vcnkiLCAiY2MiLCAicmF4IgorICAgICk7CisgIH0KKyAgcmV0dXJuOworfQorI2VuZGlmCisjZW5kaWYKKworLy8gQ1BVIGFnbm9zdGljIHJvdyBmdW5jdGlvbnMKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjJfQyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdCwgaW50IGRzdF93aWR0aCkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IGRzdF93aWR0aDsgKyt4KSB7CisgICAgKmRzdCsrID0gKnNyY19wdHI7CisgICAgc3JjX3B0ciArPSAyOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjJJbnRfQyhjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdCwgaW50IGRzdF93aWR0aCkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IGRzdF93aWR0aDsgKyt4KSB7CisgICAgKmRzdCsrID0gKHNyY19wdHJbMF0gKyBzcmNfcHRyWzFdICsKKyAgICAgICAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlXSArIHNyY19wdHJbc3JjX3N0cmlkZSArIDFdICsgMikgPj4gMjsKKyAgICBzcmNfcHRyICs9IDI7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duNF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0LCBpbnQgZHN0X3dpZHRoKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgZHN0X3dpZHRoOyArK3gpIHsKKyAgICAqZHN0KysgPSAqc3JjX3B0cjsKKyAgICBzcmNfcHRyICs9IDQ7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duNEludF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0LCBpbnQgZHN0X3dpZHRoKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgZHN0X3dpZHRoOyArK3gpIHsKKyAgICAqZHN0KysgPSAoc3JjX3B0clswXSArIHNyY19wdHJbMV0gKyBzcmNfcHRyWzJdICsgc3JjX3B0clszXSArCisgICAgICAgICAgICAgIHNyY19wdHJbc3JjX3N0cmlkZSArIDBdICsgc3JjX3B0cltzcmNfc3RyaWRlICsgMV0gKworICAgICAgICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKyAyXSArIHNyY19wdHJbc3JjX3N0cmlkZSArIDNdICsKKyAgICAgICAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICogMiArIDBdICsgc3JjX3B0cltzcmNfc3RyaWRlICogMiArIDFdICsKKyAgICAgICAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICogMiArIDJdICsgc3JjX3B0cltzcmNfc3RyaWRlICogMiArIDNdICsKKyAgICAgICAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICogMyArIDBdICsgc3JjX3B0cltzcmNfc3RyaWRlICogMyArIDFdICsKKyAgICAgICAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICogMyArIDJdICsgc3JjX3B0cltzcmNfc3RyaWRlICogMyArIDNdICsKKyAgICAgICAgICAgICAgOCkgPj4gNDsKKyAgICBzcmNfcHRyICs9IDQ7CisgIH0KK30KKworLy8gNjQwIG91dHB1dCBwaXhlbHMgaXMgZW5vdWdoIHRvIGFsbG93IDUxMjAgaW5wdXQgcGl4ZWxzIHdpdGggMS84IHNjYWxlIGRvd24uCisvLyBLZWVwaW5nIHRoZSB0b3RhbCBidWZmZXIgdW5kZXIgNDA5NiBieXRlcyBhdm9pZHMgYSBzdGFja2NoZWNrLCBzYXZpbmcgNCUgY3B1LgorLy8gVGhlIGZvbGxvd2luZyAyIGxpbmVzIGNhdXNlIGVycm9yIG9uIFdpbmRvd3MuCisvL3N0YXRpYyBjb25zdCBpbnQga01heE91dHB1dFdpZHRoID0gNjQwOworLy9zdGF0aWMgY29uc3QgaW50IGtNYXhSb3cxMiA9IDEyODA7ICAgICAgICAgLy9rTWF4T3V0cHV0V2lkdGggKiAyOworI2RlZmluZSBrTWF4T3V0cHV0V2lkdGggICA2NDAKKyNkZWZpbmUga01heFJvdzEyICAgICAgICAgMTI4MAorCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd244X0MoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3QsIGludCBkc3Rfd2lkdGgpIHsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IHggPCBkc3Rfd2lkdGg7ICsreCkgeworICAgICpkc3QrKyA9ICpzcmNfcHRyOworICAgIHNyY19wdHIgKz0gODsKKyAgfQorfQorCisvLyBOb3RlIGNhbGxpbmcgY29kZSBjaGVja3Mgd2lkdGggaXMgbGVzcyB0aGFuIG1heCBhbmQgaWYgbm90CisvLyB1c2VzIFNjYWxlUm93RG93bjhfQyBpbnN0ZWFkLgorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duOEludF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0LCBpbnQgZHN0X3dpZHRoKSB7CisgIEFMSUdOMTYodWludDggc3JjX3Jvd1trTWF4Um93MTIgKiAyXSk7CisgIGFzc2VydChkc3Rfd2lkdGggPD0ga01heE91dHB1dFdpZHRoKTsKKyAgU2NhbGVSb3dEb3duNEludF9DKHNyY19wdHIsIHNyY19zdHJpZGUsIHNyY19yb3csIGRzdF93aWR0aCAqIDIpOworICBTY2FsZVJvd0Rvd240SW50X0Moc3JjX3B0ciArIHNyY19zdHJpZGUgKiA0LCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgc3JjX3JvdyArIGtNYXhPdXRwdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdF93aWR0aCAqIDIpOworICBTY2FsZVJvd0Rvd24ySW50X0Moc3JjX3Jvdywga01heE91dHB1dFdpZHRoLCBkc3QsIGRzdF93aWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM0X0MoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0LCBpbnQgZHN0X3dpZHRoKSB7CisgIHVpbnQ4KiBkZW5kOworICBhc3NlcnQoKGRzdF93aWR0aCAlIDMgPT0gMCkgJiYgKGRzdF93aWR0aCA+IDApKTsKKyAgZGVuZCA9IGRzdCArIGRzdF93aWR0aDsKKyAgZG8geworICAgIGRzdFswXSA9IHNyY19wdHJbMF07CisgICAgZHN0WzFdID0gc3JjX3B0clsxXTsKKyAgICBkc3RbMl0gPSBzcmNfcHRyWzNdOworICAgIGRzdCArPSAzOworICAgIHNyY19wdHIgKz0gNDsKKyAgfSB3aGlsZSAoZHN0IDwgZGVuZCk7Cit9CisKKy8vIEZpbHRlciByb3dzIDAgYW5kIDEgdG9nZXRoZXIsIDMgOiAxCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zNF8wX0ludF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGQsIGludCBkc3Rfd2lkdGgpIHsKKyAgdWludDgqIGRlbmQ7CisgIGNvbnN0IHVpbnQ4KiBzOworICBjb25zdCB1aW50OCogdDsKKyAgYXNzZXJ0KChkc3Rfd2lkdGggJSAzID09IDApICYmIChkc3Rfd2lkdGggPiAwKSk7CisgIGRlbmQgPSBkICsgZHN0X3dpZHRoOworICBzID0gc3JjX3B0cjsKKyAgdCA9IHNyY19wdHIgKyBzcmNfc3RyaWRlOworICBkbyB7CisgICAgdWludDggYTAgPSAoc1swXSAqIDMgKyBzWzFdICogMSArIDIpID4+IDI7CisgICAgdWludDggYTEgPSAoc1sxXSAqIDEgKyBzWzJdICogMSArIDEpID4+IDE7CisgICAgdWludDggYTIgPSAoc1syXSAqIDEgKyBzWzNdICogMyArIDIpID4+IDI7CisgICAgdWludDggYjAgPSAodFswXSAqIDMgKyB0WzFdICogMSArIDIpID4+IDI7CisgICAgdWludDggYjEgPSAodFsxXSAqIDEgKyB0WzJdICogMSArIDEpID4+IDE7CisgICAgdWludDggYjIgPSAodFsyXSAqIDEgKyB0WzNdICogMyArIDIpID4+IDI7CisgICAgZFswXSA9IChhMCAqIDMgKyBiMCArIDIpID4+IDI7CisgICAgZFsxXSA9IChhMSAqIDMgKyBiMSArIDIpID4+IDI7CisgICAgZFsyXSA9IChhMiAqIDMgKyBiMiArIDIpID4+IDI7CisgICAgZCArPSAzOworICAgIHMgKz0gNDsKKyAgICB0ICs9IDQ7CisgIH0gd2hpbGUgKGQgPCBkZW5kKTsKK30KKworLy8gRmlsdGVyIHJvd3MgMSBhbmQgMiB0b2dldGhlciwgMSA6IDEKK3N0YXRpYyB2b2lkIFNjYWxlUm93RG93bjM0XzFfSW50X0MoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZCwgaW50IGRzdF93aWR0aCkgeworICB1aW50OCogZGVuZDsKKyAgY29uc3QgdWludDgqIHM7CisgIGNvbnN0IHVpbnQ4KiB0OworICBhc3NlcnQoKGRzdF93aWR0aCAlIDMgPT0gMCkgJiYgKGRzdF93aWR0aCA+IDApKTsKKyAgZGVuZCA9IGQgKyBkc3Rfd2lkdGg7CisgIHMgPSBzcmNfcHRyOworICB0ID0gc3JjX3B0ciArIHNyY19zdHJpZGU7CisgIGRvIHsKKyAgICB1aW50OCBhMCA9IChzWzBdICogMyArIHNbMV0gKiAxICsgMikgPj4gMjsKKyAgICB1aW50OCBhMSA9IChzWzFdICogMSArIHNbMl0gKiAxICsgMSkgPj4gMTsKKyAgICB1aW50OCBhMiA9IChzWzJdICogMSArIHNbM10gKiAzICsgMikgPj4gMjsKKyAgICB1aW50OCBiMCA9ICh0WzBdICogMyArIHRbMV0gKiAxICsgMikgPj4gMjsKKyAgICB1aW50OCBiMSA9ICh0WzFdICogMSArIHRbMl0gKiAxICsgMSkgPj4gMTsKKyAgICB1aW50OCBiMiA9ICh0WzJdICogMSArIHRbM10gKiAzICsgMikgPj4gMjsKKyAgICBkWzBdID0gKGEwICsgYjAgKyAxKSA+PiAxOworICAgIGRbMV0gPSAoYTEgKyBiMSArIDEpID4+IDE7CisgICAgZFsyXSA9IChhMiArIGIyICsgMSkgPj4gMTsKKyAgICBkICs9IDM7CisgICAgcyArPSA0OworICAgIHQgKz0gNDsKKyAgfSB3aGlsZSAoZCA8IGRlbmQpOworfQorCisjaWYgZGVmaW5lZChIQVNfU0NBTEVGSUxURVJST1dTX1NTRTIpCisvLyBGaWx0ZXIgcm93IHRvIDMvNAorc3RhdGljIHZvaWQgU2NhbGVGaWx0ZXJDb2xzMzRfQyh1aW50OCogZHN0X3B0ciwgY29uc3QgdWludDgqIHNyY19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgpIHsKKyAgdWludDgqIGRlbmQ7CisgIGNvbnN0IHVpbnQ4KiBzOworICBhc3NlcnQoKGRzdF93aWR0aCAlIDMgPT0gMCkgJiYgKGRzdF93aWR0aCA+IDApKTsKKyAgZGVuZCA9IGRzdF9wdHIgKyBkc3Rfd2lkdGg7CisgIHMgPSBzcmNfcHRyOworICBkbyB7CisgICAgZHN0X3B0clswXSA9IChzWzBdICogMyArIHNbMV0gKiAxICsgMikgPj4gMjsKKyAgICBkc3RfcHRyWzFdID0gKHNbMV0gKiAxICsgc1syXSAqIDEgKyAxKSA+PiAxOworICAgIGRzdF9wdHJbMl0gPSAoc1syXSAqIDEgKyBzWzNdICogMyArIDIpID4+IDI7CisgICAgZHN0X3B0ciArPSAzOworICAgIHMgKz0gNDsKKyAgfSB3aGlsZSAoZHN0X3B0ciA8IGRlbmQpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFNjYWxlRmlsdGVyQ29sc19DKHVpbnQ4KiBkc3RfcHRyLCBjb25zdCB1aW50OCogc3JjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkeCkgeworICBpbnQgeCA9IDA7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgZHN0X3dpZHRoOyArK2opIHsKKyAgICBpbnQgeGkgPSB4ID4+IDE2OworICAgIGludCB4ZjEgPSB4ICYgMHhmZmZmOworICAgIGludCB4ZjAgPSA2NTUzNiAtIHhmMTsKKworICAgICpkc3RfcHRyKysgPSAoc3JjX3B0clt4aV0gKiB4ZjAgKyBzcmNfcHRyW3hpICsgMV0gKiB4ZjEpID4+IDE2OworICAgIHggKz0gZHg7CisgIH0KK30KKworLy9Ob3Qgd29yayBvbiBXaW5kb3dzCisvL3N0YXRpYyBjb25zdCBpbnQga01heElucHV0V2lkdGggPSAyNTYwOworI2RlZmluZSBrTWF4SW5wdXRXaWR0aCAgICAyNTYwCisjaWYgZGVmaW5lZChIQVNfU0NBTEVGSUxURVJST1dTX1NTRTIpCisjZGVmaW5lIEhBU19TQ0FMRVJPV0RPV04zNF9TU0UyCisvLyBGaWx0ZXIgcm93cyAwIGFuZCAxIHRvZ2V0aGVyLCAzIDogMQorc3RhdGljIHZvaWQgU2NhbGVSb3dEb3duMzRfMF9JbnRfU1NFMihjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKSB7CisgIEFMSUdOMTYodWludDggcm93W2tNYXhJbnB1dFdpZHRoXSk7CisgIGFzc2VydCgoZHN0X3dpZHRoICUgMyA9PSAwKSAmJiAoZHN0X3dpZHRoID4gMCkpOworICBTY2FsZUZpbHRlclJvd3NfU1NFMihyb3csIHNyY19wdHIsIHNyY19zdHJpZGUsIGRzdF93aWR0aCAqIDQgLyAzLCAyNTYgLyA0KTsKKyAgU2NhbGVGaWx0ZXJDb2xzMzRfQyhkc3RfcHRyLCByb3csIGRzdF93aWR0aCk7Cit9CisKKy8vIEZpbHRlciByb3dzIDEgYW5kIDIgdG9nZXRoZXIsIDEgOiAxCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zNF8xX0ludF9TU0UyKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgQUxJR04xNih1aW50OCByb3dba01heElucHV0V2lkdGhdKTsKKyAgYXNzZXJ0KChkc3Rfd2lkdGggJSAzID09IDApICYmIChkc3Rfd2lkdGggPiAwKSk7CisgIFNjYWxlRmlsdGVyUm93c19TU0UyKHJvdywgc3JjX3B0ciwgc3JjX3N0cmlkZSwgZHN0X3dpZHRoICogNCAvIDMsIDI1NiAvIDIpOworICBTY2FsZUZpbHRlckNvbHMzNF9DKGRzdF9wdHIsIHJvdywgZHN0X3dpZHRoKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdCwgaW50IGRzdF93aWR0aCkgeworICBpbnQgeDsKKyAgYXNzZXJ0KGRzdF93aWR0aCAlIDMgPT0gMCk7CisgIGZvciAoeCA9IDA7IHggPCBkc3Rfd2lkdGg7IHggKz0gMykgeworICAgIGRzdFswXSA9IHNyY19wdHJbMF07CisgICAgZHN0WzFdID0gc3JjX3B0clszXTsKKyAgICBkc3RbMl0gPSBzcmNfcHRyWzZdOworICAgIGRzdCArPSAzOworICAgIHNyY19wdHIgKz0gODsKKyAgfQorfQorCisvLyA4eDMgLT4gM3gxCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF8zX0ludF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgaW50IGk7CisgIGFzc2VydCgoZHN0X3dpZHRoICUgMyA9PSAwKSAmJiAoZHN0X3dpZHRoID4gMCkpOworICBmb3IgKGkgPSAwOyBpIDwgZHN0X3dpZHRoOyBpKz0zKSB7CisgICAgZHN0X3B0clswXSA9IChzcmNfcHRyWzBdICsgc3JjX3B0clsxXSArIHNyY19wdHJbMl0gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKyAwXSArIHNyY19wdHJbc3JjX3N0cmlkZSArIDFdICsKKyAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICsgMl0gKyBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgMF0gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgMV0gKyBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgMl0pICoKKyAgICAgICAgKDY1NTM2IC8gOSkgPj4gMTY7CisgICAgZHN0X3B0clsxXSA9IChzcmNfcHRyWzNdICsgc3JjX3B0cls0XSArIHNyY19wdHJbNV0gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKyAzXSArIHNyY19wdHJbc3JjX3N0cmlkZSArIDRdICsKKyAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICsgNV0gKyBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgM10gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgNF0gKyBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgNV0pICoKKyAgICAgICAgKDY1NTM2IC8gOSkgPj4gMTY7CisgICAgZHN0X3B0clsyXSA9IChzcmNfcHRyWzZdICsgc3JjX3B0cls3XSArCisgICAgICAgIHNyY19wdHJbc3JjX3N0cmlkZSArIDZdICsgc3JjX3B0cltzcmNfc3RyaWRlICsgN10gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgNl0gKyBzcmNfcHRyW3NyY19zdHJpZGUgKiAyICsgN10pICoKKyAgICAgICAgKDY1NTM2IC8gNikgPj4gMTY7CisgICAgc3JjX3B0ciArPSA4OworICAgIGRzdF9wdHIgKz0gMzsKKyAgfQorfQorCisvLyA4eDIgLT4gM3gxCitzdGF0aWMgdm9pZCBTY2FsZVJvd0Rvd24zOF8yX0ludF9DKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpIHsKKyAgaW50IGk7CisgIGFzc2VydCgoZHN0X3dpZHRoICUgMyA9PSAwKSAmJiAoZHN0X3dpZHRoID4gMCkpOworICBmb3IgKGkgPSAwOyBpIDwgZHN0X3dpZHRoOyBpKz0zKSB7CisgICAgZHN0X3B0clswXSA9IChzcmNfcHRyWzBdICsgc3JjX3B0clsxXSArIHNyY19wdHJbMl0gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKyAwXSArIHNyY19wdHJbc3JjX3N0cmlkZSArIDFdICsKKyAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICsgMl0pICogKDY1NTM2IC8gNikgPj4gMTY7CisgICAgZHN0X3B0clsxXSA9IChzcmNfcHRyWzNdICsgc3JjX3B0cls0XSArIHNyY19wdHJbNV0gKworICAgICAgICBzcmNfcHRyW3NyY19zdHJpZGUgKyAzXSArIHNyY19wdHJbc3JjX3N0cmlkZSArIDRdICsKKyAgICAgICAgc3JjX3B0cltzcmNfc3RyaWRlICsgNV0pICogKDY1NTM2IC8gNikgPj4gMTY7CisgICAgZHN0X3B0clsyXSA9IChzcmNfcHRyWzZdICsgc3JjX3B0cls3XSArCisgICAgICAgIHNyY19wdHJbc3JjX3N0cmlkZSArIDZdICsgc3JjX3B0cltzcmNfc3RyaWRlICsgN10pICoKKyAgICAgICAgKDY1NTM2IC8gNCkgPj4gMTY7CisgICAgc3JjX3B0ciArPSA4OworICAgIGRzdF9wdHIgKz0gMzsKKyAgfQorfQorCisvLyBDIHZlcnNpb24gOHgyIC0+IDh4MQorc3RhdGljIHZvaWQgU2NhbGVGaWx0ZXJSb3dzX0ModWludDgqIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgc291cmNlX3lfZnJhY3Rpb24pIHsKKyAgaW50IHkxX2ZyYWN0aW9uOworICBpbnQgeTBfZnJhY3Rpb247CisgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyMTsKKyAgdWludDgqIGVuZDsKKyAgYXNzZXJ0KGRzdF93aWR0aCA+IDApOworICB5MV9mcmFjdGlvbiA9IHNvdXJjZV95X2ZyYWN0aW9uOworICB5MF9mcmFjdGlvbiA9IDI1NiAtIHkxX2ZyYWN0aW9uOworICBzcmNfcHRyMSA9IHNyY19wdHIgKyBzcmNfc3RyaWRlOworICBlbmQgPSBkc3RfcHRyICsgZHN0X3dpZHRoOworICBkbyB7CisgICAgZHN0X3B0clswXSA9IChzcmNfcHRyWzBdICogeTBfZnJhY3Rpb24gKyBzcmNfcHRyMVswXSAqIHkxX2ZyYWN0aW9uKSA+PiA4OworICAgIGRzdF9wdHJbMV0gPSAoc3JjX3B0clsxXSAqIHkwX2ZyYWN0aW9uICsgc3JjX3B0cjFbMV0gKiB5MV9mcmFjdGlvbikgPj4gODsKKyAgICBkc3RfcHRyWzJdID0gKHNyY19wdHJbMl0gKiB5MF9mcmFjdGlvbiArIHNyY19wdHIxWzJdICogeTFfZnJhY3Rpb24pID4+IDg7CisgICAgZHN0X3B0clszXSA9IChzcmNfcHRyWzNdICogeTBfZnJhY3Rpb24gKyBzcmNfcHRyMVszXSAqIHkxX2ZyYWN0aW9uKSA+PiA4OworICAgIGRzdF9wdHJbNF0gPSAoc3JjX3B0cls0XSAqIHkwX2ZyYWN0aW9uICsgc3JjX3B0cjFbNF0gKiB5MV9mcmFjdGlvbikgPj4gODsKKyAgICBkc3RfcHRyWzVdID0gKHNyY19wdHJbNV0gKiB5MF9mcmFjdGlvbiArIHNyY19wdHIxWzVdICogeTFfZnJhY3Rpb24pID4+IDg7CisgICAgZHN0X3B0cls2XSA9IChzcmNfcHRyWzZdICogeTBfZnJhY3Rpb24gKyBzcmNfcHRyMVs2XSAqIHkxX2ZyYWN0aW9uKSA+PiA4OworICAgIGRzdF9wdHJbN10gPSAoc3JjX3B0cls3XSAqIHkwX2ZyYWN0aW9uICsgc3JjX3B0cjFbN10gKiB5MV9mcmFjdGlvbikgPj4gODsKKyAgICBzcmNfcHRyICs9IDg7CisgICAgc3JjX3B0cjEgKz0gODsKKyAgICBkc3RfcHRyICs9IDg7CisgIH0gd2hpbGUgKGRzdF9wdHIgPCBlbmQpOworICBkc3RfcHRyWzBdID0gZHN0X3B0clstMV07Cit9CisKK3ZvaWQgU2NhbGVBZGRSb3dzX0MoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICB1aW50MTYqIGRzdF9wdHIsIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0KSB7CisgIGludCB4LHk7CisgIGFzc2VydChzcmNfd2lkdGggPiAwKTsKKyAgYXNzZXJ0KHNyY19oZWlnaHQgPiAwKTsKKyAgZm9yICh4ID0gMDsgeCA8IHNyY193aWR0aDsgKyt4KSB7CisgICAgY29uc3QgdWludDgqIHMgPSBzcmNfcHRyICsgeDsKKyAgICBpbnQgc3VtID0gMDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2hlaWdodDsgKyt5KSB7CisgICAgICBzdW0gKz0gc1swXTsKKyAgICAgIHMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgICAgZHN0X3B0clt4XSA9IHN1bTsKKyAgfQorfQorCisvKioKKyAqIFNjYWxlIHBsYW5lLCAxLzIKKyAqCisgKiBUaGlzIGlzIGFuIG9wdGltaXplZCB2ZXJzaW9uIGZvciBzY2FsaW5nIGRvd24gYSBwbGFuZSB0byAxLzIgb2YKKyAqIGl0cyBvcmlnaW5hbCBzaXplLgorICoKKyAqLworc3RhdGljIHZvaWQgU2NhbGVQbGFuZURvd24yKGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyTW9kZSBmaWx0ZXJpbmcpIHsKKyAgdm9pZCAoKlNjYWxlUm93RG93bjIpKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKTsKKyAgYXNzZXJ0KElTX0FMSUdORUQoc3JjX3dpZHRoLCAyKSk7CisgIGFzc2VydChJU19BTElHTkVEKHNyY19oZWlnaHQsIDIpKTsKKworI2lmIGRlZmluZWQoSEFTX1NDQUxFUk9XRE9XTjJfTkVPTikKKyAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNORU9OKSAmJgorICAgICAgSVNfQUxJR05FRChkc3Rfd2lkdGgsIDE2KSkgeworICAgIFNjYWxlUm93RG93bjIgPSBmaWx0ZXJpbmcgPyBTY2FsZVJvd0Rvd24ySW50X05FT04gOiBTY2FsZVJvd0Rvd24yX05FT047CisgIH0gZWxzZQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfU0NBTEVST1dET1dOMl9TU0UyKQorICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc1NTRTIpICYmCisgICAgICBJU19BTElHTkVEKGRzdF93aWR0aCwgMTYpICYmCisgICAgICBJU19BTElHTkVEKHNyY19wdHIsIDE2KSAmJiBJU19BTElHTkVEKHNyY19zdHJpZGUsIDE2KSAmJgorICAgICAgSVNfQUxJR05FRChkc3RfcHRyLCAxNikgJiYgSVNfQUxJR05FRChkc3Rfc3RyaWRlLCAxNikpIHsKKyAgICBTY2FsZVJvd0Rvd24yID0gZmlsdGVyaW5nID8gU2NhbGVSb3dEb3duMkludF9TU0UyIDogU2NhbGVSb3dEb3duMl9TU0UyOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgU2NhbGVSb3dEb3duMiA9IGZpbHRlcmluZyA/IFNjYWxlUm93RG93bjJJbnRfQyA6IFNjYWxlUm93RG93bjJfQzsKKyAgfQorCisgIHsKKyAgICBpbnQgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgKyt5KSB7CisgICAgICBTY2FsZVJvd0Rvd24yKHNyY19wdHIsIHNyY19zdHJpZGUsIGRzdF9wdHIsIGRzdF93aWR0aCk7CisgICAgICBzcmNfcHRyICs9IChzcmNfc3RyaWRlIDw8IDEpOworICAgICAgZHN0X3B0ciArPSBkc3Rfc3RyaWRlOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNjYWxlIHBsYW5lLCAxLzQKKyAqCisgKiBUaGlzIGlzIGFuIG9wdGltaXplZCB2ZXJzaW9uIGZvciBzY2FsaW5nIGRvd24gYSBwbGFuZSB0byAxLzQgb2YKKyAqIGl0cyBvcmlnaW5hbCBzaXplLgorICovCitzdGF0aWMgdm9pZCBTY2FsZVBsYW5lRG93bjQoaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCB1aW50OCogZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJNb2RlIGZpbHRlcmluZykgeworICB2b2lkICgqU2NhbGVSb3dEb3duNCkoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpOworICBhc3NlcnQoSVNfQUxJR05FRChzcmNfd2lkdGgsIDQpKTsKKyAgYXNzZXJ0KElTX0FMSUdORUQoc3JjX2hlaWdodCwgNCkpOworCisjaWYgZGVmaW5lZChIQVNfU0NBTEVST1dET1dONF9ORU9OKQorICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc05FT04pICYmCisgICAgICBJU19BTElHTkVEKGRzdF93aWR0aCwgNCkpIHsKKyAgICBTY2FsZVJvd0Rvd240ID0gZmlsdGVyaW5nID8gU2NhbGVSb3dEb3duNEludF9ORU9OIDogU2NhbGVSb3dEb3duNF9ORU9OOworICB9IGVsc2UKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX1NDQUxFUk9XRE9XTjRfU1NFMikKKyAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNTU0UyKSAmJgorICAgICAgSVNfQUxJR05FRChkc3Rfd2lkdGgsIDgpICYmCisgICAgICBJU19BTElHTkVEKHNyY19wdHIsIDE2KSAmJiBJU19BTElHTkVEKHNyY19zdHJpZGUsIDE2KSAmJgorICAgICAgSVNfQUxJR05FRChkc3RfcHRyLCA4KSAmJiBJU19BTElHTkVEKGRzdF9zdHJpZGUsIDgpKSB7CisgICAgU2NhbGVSb3dEb3duNCA9IGZpbHRlcmluZyA/IFNjYWxlUm93RG93bjRJbnRfU1NFMiA6IFNjYWxlUm93RG93bjRfU1NFMjsKKyAgfSBlbHNlCisjZW5kaWYKKyAgeworICAgIFNjYWxlUm93RG93bjQgPSBmaWx0ZXJpbmcgPyBTY2FsZVJvd0Rvd240SW50X0MgOiBTY2FsZVJvd0Rvd240X0M7CisgIH0KKworICB7CisgICAgaW50IHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7ICsreSkgeworICAgICAgU2NhbGVSb3dEb3duNChzcmNfcHRyLCBzcmNfc3RyaWRlLCBkc3RfcHRyLCBkc3Rfd2lkdGgpOworICAgICAgc3JjX3B0ciArPSAoc3JjX3N0cmlkZSA8PCAyKTsKKyAgICAgIGRzdF9wdHIgKz0gZHN0X3N0cmlkZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBTY2FsZSBwbGFuZSwgMS84CisgKgorICogVGhpcyBpcyBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBmb3Igc2NhbGluZyBkb3duIGEgcGxhbmUgdG8gMS84CisgKiBvZiBpdHMgb3JpZ2luYWwgc2l6ZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIFNjYWxlUGxhbmVEb3duOChpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyY19wdHIsIHVpbnQ4KiBkc3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlck1vZGUgZmlsdGVyaW5nKSB7CisgIHZvaWQgKCpTY2FsZVJvd0Rvd244KShjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0X3B0ciwgaW50IGRzdF93aWR0aCk7CisgIGFzc2VydChJU19BTElHTkVEKHNyY193aWR0aCwgOCkpOworICBhc3NlcnQoSVNfQUxJR05FRChzcmNfaGVpZ2h0LCA4KSk7CisKKyNpZiBkZWZpbmVkKEhBU19TQ0FMRVJPV0RPV044X1NTRTIpCisgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NFMikgJiYKKyAgICAgIElTX0FMSUdORUQoZHN0X3dpZHRoLCA0KSAmJgorICAgICAgSVNfQUxJR05FRChzcmNfcHRyLCAxNikgJiYgSVNfQUxJR05FRChzcmNfc3RyaWRlLCAxNikgJiYKKyAgICAgIElTX0FMSUdORUQoZHN0X3B0ciwgNCkgJiYgSVNfQUxJR05FRChkc3Rfc3RyaWRlLCA0KSkgeworICAgIFNjYWxlUm93RG93bjggPSBmaWx0ZXJpbmcgPyBTY2FsZVJvd0Rvd244SW50X1NTRTIgOiBTY2FsZVJvd0Rvd244X1NTRTI7CisgIH0gZWxzZQorI2VuZGlmCisgIHsKKyAgICBTY2FsZVJvd0Rvd244ID0gZmlsdGVyaW5nICYmIChkc3Rfd2lkdGggPD0ga01heE91dHB1dFdpZHRoKSA/CisgICAgICAgIFNjYWxlUm93RG93bjhJbnRfQyA6IFNjYWxlUm93RG93bjhfQzsKKyAgfQorCisgIHsKKyAgICBpbnQgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgKyt5KSB7CisgICAgICBTY2FsZVJvd0Rvd244KHNyY19wdHIsIHNyY19zdHJpZGUsIGRzdF9wdHIsIGRzdF93aWR0aCk7CisgICAgICBzcmNfcHRyICs9IChzcmNfc3RyaWRlIDw8IDMpOworICAgICAgZHN0X3B0ciArPSBkc3Rfc3RyaWRlOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNjYWxlIHBsYW5lIGRvd24sIDMvNAorICoKKyAqIFByb3ZpZGVkIGJ5IEZyYW5rIEJhcmNoYXJkIChmYmFyY2hhcmRAZ29vZ2xlLmNvbSkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIFNjYWxlUGxhbmVEb3duMzQoaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCB1aW50OCogZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyTW9kZSBmaWx0ZXJpbmcpIHsKKyAgdm9pZCAoKlNjYWxlUm93RG93bjM0XzApKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKTsKKyAgdm9pZCAoKlNjYWxlUm93RG93bjM0XzEpKGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfcHRyLCBpbnQgZHN0X3dpZHRoKTsKKyAgYXNzZXJ0KGRzdF93aWR0aCAlIDMgPT0gMCk7CisjaWYgZGVmaW5lZChIQVNfU0NBTEVST1dET1dOMzRfTkVPTikKKyAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNORU9OKSAmJgorICAgICAgKGRzdF93aWR0aCAlIDI0ID09IDApKSB7CisgICAgaWYgKCFmaWx0ZXJpbmcpIHsKKyAgICAgIFNjYWxlUm93RG93bjM0XzAgPSBTY2FsZVJvd0Rvd24zNF9ORU9OOworICAgICAgU2NhbGVSb3dEb3duMzRfMSA9IFNjYWxlUm93RG93bjM0X05FT047CisgICAgfSBlbHNlIHsKKyAgICAgIFNjYWxlUm93RG93bjM0XzAgPSBTY2FsZVJvd0Rvd24zNF8wX0ludF9ORU9OOworICAgICAgU2NhbGVSb3dEb3duMzRfMSA9IFNjYWxlUm93RG93bjM0XzFfSW50X05FT047CisgICAgfQorICB9IGVsc2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVNfU0NBTEVST1dET1dOMzRfU1NTRTMpCisgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NTRTMpICYmCisgICAgICAoZHN0X3dpZHRoICUgMjQgPT0gMCkgJiYKKyAgICAgIElTX0FMSUdORUQoc3JjX3B0ciwgMTYpICYmIElTX0FMSUdORUQoc3JjX3N0cmlkZSwgMTYpICYmCisgICAgICBJU19BTElHTkVEKGRzdF9wdHIsIDgpICYmIElTX0FMSUdORUQoZHN0X3N0cmlkZSwgOCkpIHsKKyAgICBpZiAoIWZpbHRlcmluZykgeworICAgICAgU2NhbGVSb3dEb3duMzRfMCA9IFNjYWxlUm93RG93bjM0X1NTU0UzOworICAgICAgU2NhbGVSb3dEb3duMzRfMSA9IFNjYWxlUm93RG93bjM0X1NTU0UzOworICAgIH0gZWxzZSB7CisgICAgICBTY2FsZVJvd0Rvd24zNF8wID0gU2NhbGVSb3dEb3duMzRfMF9JbnRfU1NTRTM7CisgICAgICBTY2FsZVJvd0Rvd24zNF8xID0gU2NhbGVSb3dEb3duMzRfMV9JbnRfU1NTRTM7CisgICAgfQorICB9IGVsc2UKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX1NDQUxFUk9XRE9XTjM0X1NTRTIpCisgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NFMikgJiYKKyAgICAgIChkc3Rfd2lkdGggJSAyNCA9PSAwKSAmJiBJU19BTElHTkVEKHNyY19zdHJpZGUsIDE2KSAmJgorICAgICAgSVNfQUxJR05FRChkc3Rfc3RyaWRlLCA4KSAmJgorICAgICAgSVNfQUxJR05FRChzcmNfcHRyLCAxNikgJiYgSVNfQUxJR05FRChkc3RfcHRyLCA4KSAmJgorICAgICAgZmlsdGVyaW5nKSB7CisgICAgU2NhbGVSb3dEb3duMzRfMCA9IFNjYWxlUm93RG93bjM0XzBfSW50X1NTRTI7CisgICAgU2NhbGVSb3dEb3duMzRfMSA9IFNjYWxlUm93RG93bjM0XzFfSW50X1NTRTI7CisgIH0gZWxzZQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWZpbHRlcmluZykgeworICAgICAgU2NhbGVSb3dEb3duMzRfMCA9IFNjYWxlUm93RG93bjM0X0M7CisgICAgICBTY2FsZVJvd0Rvd24zNF8xID0gU2NhbGVSb3dEb3duMzRfQzsKKyAgICB9IGVsc2UgeworICAgICAgU2NhbGVSb3dEb3duMzRfMCA9IFNjYWxlUm93RG93bjM0XzBfSW50X0M7CisgICAgICBTY2FsZVJvd0Rvd24zNF8xID0gU2NhbGVSb3dEb3duMzRfMV9JbnRfQzsKKyAgICB9CisgIH0KKyAgeworICBpbnQgc3JjX3JvdyA9IDA7CisgICAgaW50IHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7ICsreSkgeworICAgIHN3aXRjaCAoc3JjX3JvdykgeworICAgICAgY2FzZSAwOgorICAgICAgICBTY2FsZVJvd0Rvd24zNF8wKHNyY19wdHIsIHNyY19zdHJpZGUsIGRzdF9wdHIsIGRzdF93aWR0aCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE6CisgICAgICAgIFNjYWxlUm93RG93bjM0XzEoc3JjX3B0ciwgc3JjX3N0cmlkZSwgZHN0X3B0ciwgZHN0X3dpZHRoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMChzcmNfcHRyICsgc3JjX3N0cmlkZSwgLXNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3dpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICsrc3JjX3JvdzsKKyAgICBzcmNfcHRyICs9IHNyY19zdHJpZGU7CisgICAgZHN0X3B0ciArPSBkc3Rfc3RyaWRlOworICAgIGlmIChzcmNfcm93ID49IDMpIHsKKyAgICAgIHNyY19wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgIHNyY19yb3cgPSAwOworICAgIH0KKyAgfQorfQorfQorCisvKioKKyAqIFNjYWxlIHBsYW5lLCAzLzgKKyAqCisgKiBUaGlzIGlzIGFuIG9wdGltaXplZCB2ZXJzaW9uIGZvciBzY2FsaW5nIGRvd24gYSBwbGFuZSB0byAzLzgKKyAqIG9mIGl0cyBvcmlnaW5hbCBzaXplLgorICoKKyAqIFJlZHVjZXMgMTZ4MyB0byA2eDEKKyAqLworc3RhdGljIHZvaWQgU2NhbGVQbGFuZURvd24zOChpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyY19wdHIsIHVpbnQ4KiBkc3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJNb2RlIGZpbHRlcmluZykgeworICB2b2lkICgqU2NhbGVSb3dEb3duMzhfMykoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpOworICB2b2lkICgqU2NhbGVSb3dEb3duMzhfMikoY29uc3QgdWludDgqIHNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRzdF9wdHIsIGludCBkc3Rfd2lkdGgpOworICBhc3NlcnQoZHN0X3dpZHRoICUgMyA9PSAwKTsKKyNpZiBkZWZpbmVkKEhBU19TQ0FMRVJPV0RPV04zOF9ORU9OKQorICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc05FT04pICYmCisgICAgICAoZHN0X3dpZHRoICUgMTIgPT0gMCkpIHsKKyAgICBpZiAoIWZpbHRlcmluZykgeworICAgICAgU2NhbGVSb3dEb3duMzhfMyA9IFNjYWxlUm93RG93bjM4X05FT047CisgICAgICBTY2FsZVJvd0Rvd24zOF8yID0gU2NhbGVSb3dEb3duMzhfTkVPTjsKKyAgICB9IGVsc2UgeworICAgICAgU2NhbGVSb3dEb3duMzhfMyA9IFNjYWxlUm93RG93bjM4XzNfSW50X05FT047CisgICAgICBTY2FsZVJvd0Rvd24zOF8yID0gU2NhbGVSb3dEb3duMzhfMl9JbnRfTkVPTjsKKyAgICB9CisgIH0gZWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBU19TQ0FMRVJPV0RPV04zOF9TU1NFMykKKyAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNTU1NFMykgJiYKKyAgICAgIChkc3Rfd2lkdGggJSAyNCA9PSAwKSAmJiBJU19BTElHTkVEKHNyY19zdHJpZGUsIDE2KSAmJgorICAgICAgSVNfQUxJR05FRChkc3Rfc3RyaWRlLCA4KSAmJgorICAgICAgSVNfQUxJR05FRChzcmNfcHRyLCAxNikgJiYgSVNfQUxJR05FRChkc3RfcHRyLCA4KSkgeworICAgIGlmICghZmlsdGVyaW5nKSB7CisgICAgICBTY2FsZVJvd0Rvd24zOF8zID0gU2NhbGVSb3dEb3duMzhfU1NTRTM7CisgICAgICBTY2FsZVJvd0Rvd24zOF8yID0gU2NhbGVSb3dEb3duMzhfU1NTRTM7CisgICAgfSBlbHNlIHsKKyAgICAgIFNjYWxlUm93RG93bjM4XzMgPSBTY2FsZVJvd0Rvd24zOF8zX0ludF9TU1NFMzsKKyAgICAgIFNjYWxlUm93RG93bjM4XzIgPSBTY2FsZVJvd0Rvd24zOF8yX0ludF9TU1NFMzsKKyAgICB9CisgIH0gZWxzZQorI2VuZGlmCisgIHsKKyAgICBpZiAoIWZpbHRlcmluZykgeworICAgICAgU2NhbGVSb3dEb3duMzhfMyA9IFNjYWxlUm93RG93bjM4X0M7CisgICAgICBTY2FsZVJvd0Rvd24zOF8yID0gU2NhbGVSb3dEb3duMzhfQzsKKyAgICB9IGVsc2UgeworICAgICAgU2NhbGVSb3dEb3duMzhfMyA9IFNjYWxlUm93RG93bjM4XzNfSW50X0M7CisgICAgICBTY2FsZVJvd0Rvd24zOF8yID0gU2NhbGVSb3dEb3duMzhfMl9JbnRfQzsKKyAgICB9CisgIH0KKyAgeworICBpbnQgc3JjX3JvdyA9IDA7CisgICAgaW50IHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGRzdF9oZWlnaHQ7ICsreSkgeworICAgIHN3aXRjaCAoc3JjX3JvdykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgICBTY2FsZVJvd0Rvd24zOF8zKHNyY19wdHIsIHNyY19zdHJpZGUsIGRzdF9wdHIsIGRzdF93aWR0aCk7CisgICAgICAgIHNyY19wdHIgKz0gc3JjX3N0cmlkZSAqIDM7CisgICAgICAgICsrc3JjX3JvdzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfMihzcmNfcHRyLCBzcmNfc3RyaWRlLCBkc3RfcHRyLCBkc3Rfd2lkdGgpOworICAgICAgICBzcmNfcHRyICs9IHNyY19zdHJpZGUgKiAyOworICAgICAgICBzcmNfcm93ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRzdF9wdHIgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorfQorCitfX2lubGluZSBzdGF0aWMgdWludDMyIFN1bUJveChpbnQgaWJveHdpZHRoLCBpbnQgaWJveGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdWludDgqIHNyY19wdHIpIHsKKyAgaW50IHgsIHk7CisgIHVpbnQzMiBzdW07CisgIGFzc2VydChpYm94d2lkdGggPiAwKTsKKyAgYXNzZXJ0KGlib3hoZWlnaHQgPiAwKTsKKyAgc3VtID0gMHU7CisgIGZvciAoeSA9IDA7IHkgPCBpYm94aGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgaWJveHdpZHRoOyArK3gpIHsKKyAgICAgIHN1bSArPSBzcmNfcHRyW3hdOworICAgIH0KKyAgICBzcmNfcHRyICs9IHNyY19zdHJpZGU7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHZvaWQgU2NhbGVQbGFuZUJveFJvdyhpbnQgZHN0X3dpZHRoLCBpbnQgYm94aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHgsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIpIHsKKyAgaW50IHggPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGRzdF93aWR0aDsgKytpKSB7CisgICAgaW50IGl4ID0geCA+PiAxNjsKKyAgICBpbnQgYm94d2lkdGg7CisgICAgeCArPSBkeDsKKyAgICBib3h3aWR0aCA9ICh4ID4+IDE2KSAtIGl4OworICAgICpkc3RfcHRyKysgPSBTdW1Cb3goYm94d2lkdGgsIGJveGhlaWdodCwgc3JjX3N0cmlkZSwgc3JjX3B0ciArIGl4KSAvCisgICAgICAgIChib3h3aWR0aCAqIGJveGhlaWdodCk7CisgIH0KK30KKworX19pbmxpbmUgc3RhdGljIHVpbnQzMiBTdW1QaXhlbHMoaW50IGlib3h3aWR0aCwgY29uc3QgdWludDE2KiBzcmNfcHRyKSB7CisgIHVpbnQzMiBzdW07CisgIGludCB4OworICBhc3NlcnQoaWJveHdpZHRoID4gMCk7CisgIHN1bSA9IDB1OworICBmb3IgKHggPSAwOyB4IDwgaWJveHdpZHRoOyArK3gpIHsKKyAgICBzdW0gKz0gc3JjX3B0clt4XTsKKyAgfQorICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBTY2FsZUFkZENvbHMyX0MoaW50IGRzdF93aWR0aCwgaW50IGJveGhlaWdodCwgaW50IGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNiogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIpIHsKKyAgaW50IHNjYWxldGJsWzJdOworICBpbnQgbWluYm94d2lkdGggPSAoZHggPj4gMTYpOworICBzY2FsZXRibFswXSA9IDY1NTM2IC8gKG1pbmJveHdpZHRoICogYm94aGVpZ2h0KTsKKyAgc2NhbGV0YmxbMV0gPSA2NTUzNiAvICgobWluYm94d2lkdGggKyAxKSAqIGJveGhlaWdodCk7CisgIHsKKyAgaW50ICpzY2FsZXB0ciA9IHNjYWxldGJsIC0gbWluYm94d2lkdGg7CisgIGludCB4ID0gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0X3dpZHRoOyArK2kpIHsKKyAgICBpbnQgaXggPSB4ID4+IDE2OworICAgICAgaW50IGJveHdpZHRoOworICAgIHggKz0gZHg7CisgICAgICBib3h3aWR0aCA9ICh4ID4+IDE2KSAtIGl4OworICAgICpkc3RfcHRyKysgPSBTdW1QaXhlbHMoYm94d2lkdGgsIHNyY19wdHIgKyBpeCkgKiBzY2FsZXB0cltib3h3aWR0aF0gPj4gMTY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxlQWRkQ29sczFfQyhpbnQgZHN0X3dpZHRoLCBpbnQgYm94aGVpZ2h0LCBpbnQgZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2KiBzcmNfcHRyLCB1aW50OCogZHN0X3B0cikgeworICBpbnQgYm94d2lkdGggPSAoZHggPj4gMTYpOworICBpbnQgc2NhbGV2YWwgPSA2NTUzNiAvIChib3h3aWR0aCAqIGJveGhlaWdodCk7CisgIGludCB4ID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBkc3Rfd2lkdGg7ICsraSkgeworICAgICpkc3RfcHRyKysgPSBTdW1QaXhlbHMoYm94d2lkdGgsIHNyY19wdHIgKyB4KSAqIHNjYWxldmFsID4+IDE2OworICAgIHggKz0gYm94d2lkdGg7CisgIH0KK30KKworLyoqCisgKiBTY2FsZSBwbGFuZSBkb3duIHRvIGFueSBkaW1lbnNpb25zLCB3aXRoIGludGVycG9sYXRpb24uCisgKiAoYm94ZmlsdGVyKS4KKyAqCisgKiBTYW1lIG1ldGhvZCBhcyBTaW1wbGVTY2FsZSwgd2hpY2ggaXMgZml4ZWQgcG9pbnQsIG91dHB1dHRpbmcKKyAqIG9uZSBwaXhlbCBvZiBkZXN0aW5hdGlvbiB1c2luZyBmaXhlZCBwb2ludCAoMTYuMTYpIHRvIHN0ZXAKKyAqIHRocm91Z2ggc291cmNlLCBzYW1wbGluZyBhIGJveCBvZiBwaXhlbCB3aXRoIHNpbXBsZQorICogYXZlcmFnaW5nLgorICovCitzdGF0aWMgdm9pZCBTY2FsZVBsYW5lQm94KGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIpIHsKKyAgaW50IGR4LCBkeTsKKyAgYXNzZXJ0KGRzdF93aWR0aCA+IDApOworICBhc3NlcnQoZHN0X2hlaWdodCA+IDApOworICBkeSA9IChzcmNfaGVpZ2h0IDw8IDE2KSAvIGRzdF9oZWlnaHQ7CisgIGR4ID0gKHNyY193aWR0aCA8PCAxNikgLyBkc3Rfd2lkdGg7CisgIGlmICghSVNfQUxJR05FRChzcmNfd2lkdGgsIDE2KSB8fCAoc3JjX3dpZHRoID4ga01heElucHV0V2lkdGgpIHx8CisgICAgICBkc3RfaGVpZ2h0ICogMiA+IHNyY19oZWlnaHQpIHsKKyAgICB1aW50OCogZHN0ID0gZHN0X3B0cjsKKyAgICBpbnQgZHkgPSAoc3JjX2hlaWdodCA8PCAxNikgLyBkc3RfaGVpZ2h0OworICAgIGludCBkeCA9IChzcmNfd2lkdGggPDwgMTYpIC8gZHN0X3dpZHRoOworICAgIGludCB5ID0gMDsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgZHN0X2hlaWdodDsgKytqKSB7CisgICAgICBpbnQgaXkgPSB5ID4+IDE2OworICAgICAgY29uc3QgdWludDgqIGNvbnN0IHNyYyA9IHNyY19wdHIgKyBpeSAqIHNyY19zdHJpZGU7CisgICAgICBpbnQgYm94aGVpZ2h0OworICAgICAgeSArPSBkeTsKKyAgICAgIGlmICh5ID4gKHNyY19oZWlnaHQgPDwgMTYpKSB7CisgICAgICAgIHkgPSAoc3JjX2hlaWdodCA8PCAxNik7CisgICAgICB9CisgICAgICBib3hoZWlnaHQgPSAoeSA+PiAxNikgLSBpeTsKKyAgICAgIFNjYWxlUGxhbmVCb3hSb3coZHN0X3dpZHRoLCBib3hoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGR4LCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCk7CisKKyAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBBTElHTjE2KHVpbnQxNiByb3dba01heElucHV0V2lkdGhdKTsKKyAgICB2b2lkICgqU2NhbGVBZGRSb3dzKShjb25zdCB1aW50OCogc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2KiBkc3RfcHRyLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCk7CisgICAgdm9pZCAoKlNjYWxlQWRkQ29scykoaW50IGRzdF93aWR0aCwgaW50IGJveGhlaWdodCwgaW50IGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNiogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIpOworI2lmIGRlZmluZWQoSEFTX1NDQUxFQUREUk9XU19TU0UyKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NFMikgJiYKKyAgICAgICAgSVNfQUxJR05FRChzcmNfc3RyaWRlLCAxNikgJiYgSVNfQUxJR05FRChzcmNfcHRyLCAxNikgJiYKKyAgICAgICAgSVNfQUxJR05FRChzcmNfd2lkdGgsIDE2KSkgeworICAgICAgU2NhbGVBZGRSb3dzID0gU2NhbGVBZGRSb3dzX1NTRTI7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBTY2FsZUFkZFJvd3MgPSBTY2FsZUFkZFJvd3NfQzsKKyAgICB9CisgICAgaWYgKGR4ICYgMHhmZmZmKSB7CisgICAgICBTY2FsZUFkZENvbHMgPSBTY2FsZUFkZENvbHMyX0M7CisgICAgfSBlbHNlIHsKKyAgICAgIFNjYWxlQWRkQ29scyA9IFNjYWxlQWRkQ29sczFfQzsKKyAgICB9CisKKyAgICB7CisgICAgaW50IHkgPSAwOworICAgICAgaW50IGo7CisgICAgICBmb3IgKGogPSAwOyBqIDwgZHN0X2hlaWdodDsgKytqKSB7CisgICAgICBpbnQgaXkgPSB5ID4+IDE2OworICAgICAgY29uc3QgdWludDgqIGNvbnN0IHNyYyA9IHNyY19wdHIgKyBpeSAqIHNyY19zdHJpZGU7CisgICAgICAgIGludCBib3hoZWlnaHQ7CisgICAgICB5ICs9IGR5OworICAgICAgaWYgKHkgPiAoc3JjX2hlaWdodCA8PCAxNikpIHsKKyAgICAgICAgeSA9IChzcmNfaGVpZ2h0IDw8IDE2KTsKKyAgICAgIH0KKyAgICAgICAgYm94aGVpZ2h0ID0gKHkgPj4gMTYpIC0gaXk7CisgICAgICBTY2FsZUFkZFJvd3Moc3JjLCBzcmNfc3RyaWRlLCByb3csIHNyY193aWR0aCwgYm94aGVpZ2h0KTsKKyAgICAgIFNjYWxlQWRkQ29scyhkc3Rfd2lkdGgsIGJveGhlaWdodCwgZHgsIHJvdywgZHN0X3B0cik7CisgICAgICBkc3RfcHRyICs9IGRzdF9zdHJpZGU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogU2NhbGUgcGxhbmUgdG8vZnJvbSBhbnkgZGltZW5zaW9ucywgd2l0aCBpbnRlcnBvbGF0aW9uLgorICovCitzdGF0aWMgdm9pZCBTY2FsZVBsYW5lQmlsaW5lYXJTaW1wbGUoaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCB1aW50OCogZHN0X3B0cikgeworICBpbnQgaSwgajsKKyAgdWludDgqIGRzdCA9IGRzdF9wdHI7CisgIGludCBkeCA9IChzcmNfd2lkdGggPDwgMTYpIC8gZHN0X3dpZHRoOworICBpbnQgZHkgPSAoc3JjX2hlaWdodCA8PCAxNikgLyBkc3RfaGVpZ2h0OworICBpbnQgbWF4eCA9ICgoc3JjX3dpZHRoIC0gMSkgPDwgMTYpIC0gMTsKKyAgaW50IG1heHkgPSAoKHNyY19oZWlnaHQgLSAxKSA8PCAxNikgLSAxOworICBpbnQgeSA9IChkc3RfaGVpZ2h0IDwgc3JjX2hlaWdodCkgPyAzMjc2OCA6CisgICAgICAoc3JjX2hlaWdodCA8PCAxNikgLyBkc3RfaGVpZ2h0IC0gMzI3Njg7CisgIGZvciAoaSA9IDA7IGkgPCBkc3RfaGVpZ2h0OyArK2kpIHsKKyAgICBpbnQgY3kgPSAoeSA8IDApID8gMCA6IHk7CisgICAgaW50IHlpID0gY3kgPj4gMTY7CisgICAgaW50IHlmID0gY3kgJiAweGZmZmY7CisgICAgY29uc3QgdWludDgqIGNvbnN0IHNyYyA9IHNyY19wdHIgKyB5aSAqIHNyY19zdHJpZGU7CisgICAgaW50IHggPSAoZHN0X3dpZHRoIDwgc3JjX3dpZHRoKSA/IDMyNzY4IDoKKyAgICAgICAgKHNyY193aWR0aCA8PCAxNikgLyBkc3Rfd2lkdGggLSAzMjc2ODsKKyAgICBmb3IgKGogPSAwOyBqIDwgZHN0X3dpZHRoOyArK2opIHsKKyAgICAgIGludCBjeCA9ICh4IDwgMCkgPyAwIDogeDsKKyAgICAgIGludCB4aSA9IGN4ID4+IDE2OworICAgICAgaW50IHhmID0gY3ggJiAweGZmZmY7CisgICAgICBpbnQgcjAgPSAoc3JjW3hpXSAqICg2NTUzNiAtIHhmKSArIHNyY1t4aSArIDFdICogeGYpID4+IDE2OworICAgICAgaW50IHIxID0gKHNyY1t4aSArIHNyY19zdHJpZGVdICogKDY1NTM2IC0geGYpICsKKyAgICAgICAgICBzcmNbeGkgKyBzcmNfc3RyaWRlICsgMV0gKiB4ZikgPj4gMTY7CisgICAgICAqZHN0KysgPSAocjAgKiAoNjU1MzYgLSB5ZikgKyByMSAqIHlmKSA+PiAxNjsKKyAgICAgIHggKz0gZHg7CisgICAgICBpZiAoeCA+IG1heHgpCisgICAgICAgIHggPSBtYXh4OworICAgIH0KKyAgICBkc3QgKz0gZHN0X3N0cmlkZSAtIGRzdF93aWR0aDsKKyAgICB5ICs9IGR5OworICAgIGlmICh5ID4gbWF4eSkKKyAgICAgIHkgPSBtYXh5OworICB9Cit9CisKKy8qKgorICogU2NhbGUgcGxhbmUgdG8vZnJvbSBhbnkgZGltZW5zaW9ucywgd2l0aCBiaWxpbmVhcgorICogaW50ZXJwb2xhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgU2NhbGVQbGFuZUJpbGluZWFyKGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIpIHsKKyAgaW50IGR5OworICBpbnQgZHg7CisgIGFzc2VydChkc3Rfd2lkdGggPiAwKTsKKyAgYXNzZXJ0KGRzdF9oZWlnaHQgPiAwKTsKKyAgZHkgPSAoc3JjX2hlaWdodCA8PCAxNikgLyBkc3RfaGVpZ2h0OworICBkeCA9IChzcmNfd2lkdGggPDwgMTYpIC8gZHN0X3dpZHRoOworICBpZiAoIUlTX0FMSUdORUQoc3JjX3dpZHRoLCA4KSB8fCAoc3JjX3dpZHRoID4ga01heElucHV0V2lkdGgpKSB7CisgICAgU2NhbGVQbGFuZUJpbGluZWFyU2ltcGxlKHNyY193aWR0aCwgc3JjX2hlaWdodCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmNfcHRyLCBkc3RfcHRyKTsKKworICB9IGVsc2UgeworICAgIEFMSUdOMTYodWludDggcm93W2tNYXhJbnB1dFdpZHRoICsgMV0pOworICAgIHZvaWQgKCpTY2FsZUZpbHRlclJvd3MpKHVpbnQ4KiBkc3RfcHRyLCBjb25zdCB1aW50OCogc3JjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgc291cmNlX3lfZnJhY3Rpb24pOworICAgIHZvaWQgKCpTY2FsZUZpbHRlckNvbHMpKHVpbnQ4KiBkc3RfcHRyLCBjb25zdCB1aW50OCogc3JjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHgpOworI2lmIGRlZmluZWQoSEFTX1NDQUxFRklMVEVSUk9XU19TU1NFMykKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc1NTU0UzKSAmJgorICAgICAgICBJU19BTElHTkVEKHNyY19zdHJpZGUsIDE2KSAmJiBJU19BTElHTkVEKHNyY19wdHIsIDE2KSAmJgorICAgICAgICBJU19BTElHTkVEKHNyY193aWR0aCwgMTYpKSB7CisgICAgICBTY2FsZUZpbHRlclJvd3MgPSBTY2FsZUZpbHRlclJvd3NfU1NTRTM7CisgICAgfSBlbHNlCisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19TQ0FMRUZJTFRFUlJPV1NfU1NFMikKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc1NTRTIpICYmCisgICAgICAgIElTX0FMSUdORUQoc3JjX3N0cmlkZSwgMTYpICYmIElTX0FMSUdORUQoc3JjX3B0ciwgMTYpICYmCisgICAgICAgIElTX0FMSUdORUQoc3JjX3dpZHRoLCAxNikpIHsKKyAgICAgIFNjYWxlRmlsdGVyUm93cyA9IFNjYWxlRmlsdGVyUm93c19TU0UyOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgU2NhbGVGaWx0ZXJSb3dzID0gU2NhbGVGaWx0ZXJSb3dzX0M7CisgICAgfQorICAgIFNjYWxlRmlsdGVyQ29scyA9IFNjYWxlRmlsdGVyQ29sc19DOworCisgICAgeworICAgIGludCB5ID0gMDsKKyAgICBpbnQgbWF4eSA9ICgoc3JjX2hlaWdodCAtIDEpIDw8IDE2KSAtIDE7IC8vIG1heCBpcyBmaWx0ZXIgb2YgbGFzdCAyIHJvd3MuCisgICAgICBpbnQgajsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBkc3RfaGVpZ2h0OyArK2opIHsKKyAgICAgIGludCBpeSA9IHkgPj4gMTY7CisgICAgICBpbnQgZnkgPSAoeSA+PiA4KSAmIDI1NTsKKyAgICAgIGNvbnN0IHVpbnQ4KiBjb25zdCBzcmMgPSBzcmNfcHRyICsgaXkgKiBzcmNfc3RyaWRlOworICAgICAgU2NhbGVGaWx0ZXJSb3dzKHJvdywgc3JjLCBzcmNfc3RyaWRlLCBzcmNfd2lkdGgsIGZ5KTsKKyAgICAgIFNjYWxlRmlsdGVyQ29scyhkc3RfcHRyLCByb3csIGRzdF93aWR0aCwgZHgpOworICAgICAgZHN0X3B0ciArPSBkc3Rfc3RyaWRlOworICAgICAgeSArPSBkeTsKKyAgICAgIGlmICh5ID4gbWF4eSkgeworICAgICAgICB5ID0gbWF4eTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK30KKworLyoqCisgKiBTY2FsZSBwbGFuZSB0by9mcm9tIGFueSBkaW1lbnNpb25zLCB3aXRob3V0IGludGVycG9sYXRpb24uCisgKiBGaXhlZCBwb2ludCBtYXRoIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlOiBUaGUgdXBwZXIgMTYgYml0cworICogb2YgeCBhbmQgZHggaXMgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgc291cmNlIHBvc2l0aW9uIGFuZAorICogdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRoZSBmaXhlZCBkZWNpbWFsIHBhcnQuCisgKi8KK3N0YXRpYyB2b2lkIFNjYWxlUGxhbmVTaW1wbGUoaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCB1aW50OCogZHN0X3B0cikgeworICB1aW50OCogZHN0ID0gZHN0X3B0cjsKKyAgaW50IGR4ID0gKHNyY193aWR0aCA8PCAxNikgLyBkc3Rfd2lkdGg7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgZHN0X2hlaWdodDsgKyt5KSB7CisgICAgY29uc3QgdWludDgqIGNvbnN0IHNyYyA9IHNyY19wdHIgKyAoeSAqIHNyY19oZWlnaHQgLyBkc3RfaGVpZ2h0KSAqCisgICAgICAgIHNyY19zdHJpZGU7CisgICAgLy8gVE9ETyhmYmFyY2hhcmQpOiBSb3VuZCBYIGNvb3JkaW5hdGUgYnkgc2V0dGluZyB4PTB4ODAwMC4KKyAgICBpbnQgeCA9IDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGRzdF93aWR0aDsgKytpKSB7CisgICAgICAqZHN0KysgPSBzcmNbeCA+PiAxNl07CisgICAgICB4ICs9IGR4OworICAgIH0KKyAgICBkc3QgKz0gZHN0X3N0cmlkZSAtIGRzdF93aWR0aDsKKyAgfQorfQorCisvKioKKyAqIFNjYWxlIHBsYW5lIHRvL2Zyb20gYW55IGRpbWVuc2lvbnMuCisgKi8KK3N0YXRpYyB2b2lkIFNjYWxlUGxhbmVBbnlTaXplKGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3B0ciwgdWludDgqIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJNb2RlIGZpbHRlcmluZykgeworICBpZiAoIWZpbHRlcmluZykgeworICAgIFNjYWxlUGxhbmVTaW1wbGUoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmNfcHRyLCBkc3RfcHRyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBmYWxsIGJhY2sgdG8gbm9uLW9wdGltaXplZCB2ZXJzaW9uCisgICAgU2NhbGVQbGFuZUJpbGluZWFyKHNyY193aWR0aCwgc3JjX2hlaWdodCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmNfcHRyLCBkc3RfcHRyKTsKKyAgfQorfQorCisvKioKKyAqIFNjYWxlIHBsYW5lIGRvd24sIGFueSBzaXplCisgKgorICogVGhpcyBpcyBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBmb3Igc2NhbGluZyBkb3duIGEgcGxhbmUgdG8gYW55IHNpemUuCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB+MTAgdGltZXMgZmFzdGVyIGNvbXBhcmVkIHRvIHRoZQorICogcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGZvciBlLmcuIFhHQS0+TG93UmVzUEFMCisgKgorICovCitzdGF0aWMgdm9pZCBTY2FsZVBsYW5lRG93bihpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyY19wdHIsIHVpbnQ4KiBkc3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyTW9kZSBmaWx0ZXJpbmcpIHsKKyAgaWYgKCFmaWx0ZXJpbmcpIHsKKyAgICBTY2FsZVBsYW5lU2ltcGxlKHNyY193aWR0aCwgc3JjX2hlaWdodCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgZHN0X3N0cmlkZSwgc3JjX3B0ciwgZHN0X3B0cik7CisgIH0gZWxzZSBpZiAoZmlsdGVyaW5nID09IGtGaWx0ZXJCaWxpbmVhciB8fCBzcmNfaGVpZ2h0ICogMiA+IGRzdF9oZWlnaHQpIHsKKyAgICAvLyBiZXR3ZWVuIDEvMnggYW5kIDF4IHVzZSBiaWxpbmVhcgorICAgIFNjYWxlUGxhbmVCaWxpbmVhcihzcmNfd2lkdGgsIHNyY19oZWlnaHQsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgZHN0X3N0cmlkZSwgc3JjX3B0ciwgZHN0X3B0cik7CisgIH0gZWxzZSB7CisgICAgU2NhbGVQbGFuZUJveChzcmNfd2lkdGgsIHNyY19oZWlnaHQsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUsIGRzdF9zdHJpZGUsIHNyY19wdHIsIGRzdF9wdHIpOworICB9Cit9CisKKy8qKgorICogQ29weSBwbGFuZSwgbm8gc2NhbGluZworICoKKyAqIFRoaXMgc2ltcGx5IGNvcGllcyB0aGUgZ2l2ZW4gcGxhbmUgd2l0aG91dCBzY2FsaW5nLgorICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgfjExNSB0aW1lcyBmYXN0ZXIKKyAqIGNvbXBhcmVkIHRvIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCisgKgorICovCitzdGF0aWMgdm9pZCBDb3B5UGxhbmUoaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLCB1aW50OCogZHN0X3B0cikgeworICBpZiAoc3JjX3N0cmlkZSA9PSBzcmNfd2lkdGggJiYgZHN0X3N0cmlkZSA9PSBkc3Rfd2lkdGgpIHsKKyAgICAvLyBBbGwgY29udGlndW91cywgc28gY2FuIHVzZSBSRUFMTFkgZmFzdCBwYXRoLgorICAgIG1lbWNweShkc3RfcHRyLCBzcmNfcHRyLCBzcmNfd2lkdGggKiBzcmNfaGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBOb3QgYWxsIGNvbnRpZ3VvdXM7IG11c3QgY29weSBzY2FubGluZXMgaW5kaXZpZHVhbGx5CisgICAgY29uc3QgdWludDgqIHNyYyA9IHNyY19wdHI7CisgICAgdWludDgqIGRzdCA9IGRzdF9wdHI7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNyY19oZWlnaHQ7ICsraSkgeworICAgICAgbWVtY3B5KGRzdCwgc3JjLCBzcmNfd2lkdGgpOworICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2NhbGVQbGFuZShjb25zdCB1aW50OCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyTW9kZSBmaWx0ZXJpbmcsIGludCB1c2VfcmVmKSB7CisgIC8vIFVzZSBzcGVjaWFsaXplZCBzY2FsZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgY29tbW9uIHJlc29sdXRpb25zLgorICAvLyBGb3IgZXhhbXBsZSwgYWxsIHRoZSAxLzIgc2NhbGluZ3Mgd2lsbCB1c2UgU2NhbGVQbGFuZURvd24yKCkKKyAgaWYgKGRzdF93aWR0aCA9PSBzcmNfd2lkdGggJiYgZHN0X2hlaWdodCA9PSBzcmNfaGVpZ2h0KSB7CisgICAgLy8gU3RyYWlnaHQgY29weS4KKyAgICBDb3B5UGxhbmUoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsIHNyY19zdHJpZGUsCisgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIHNyYywgZHN0KTsKKyAgfSBlbHNlIGlmIChkc3Rfd2lkdGggPD0gc3JjX3dpZHRoICYmIGRzdF9oZWlnaHQgPD0gc3JjX2hlaWdodCkgeworICAgIC8vIFNjYWxlIGRvd24uCisgICAgaWYgKHVzZV9yZWYpIHsKKyAgICAgIC8vIEZvciB0ZXN0aW5nLCBhbGxvdyB0aGUgb3B0aW1pemVkIHZlcnNpb25zIHRvIGJlIGRpc2FibGVkLgorICAgICAgU2NhbGVQbGFuZURvd24oc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmMsIGRzdCwgZmlsdGVyaW5nKTsKKyAgICB9IGVsc2UgaWYgKDQgKiBkc3Rfd2lkdGggPT0gMyAqIHNyY193aWR0aCAmJgorICAgICAgICAgICAgICAgNCAqIGRzdF9oZWlnaHQgPT0gMyAqIHNyY19oZWlnaHQpIHsKKyAgICAgIC8vIG9wdGltaXplZCwgMy80CisgICAgICBTY2FsZVBsYW5lRG93bjM0KHNyY193aWR0aCwgc3JjX2hlaWdodCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmMsIGRzdCwgZmlsdGVyaW5nKTsKKyAgICB9IGVsc2UgaWYgKDIgKiBkc3Rfd2lkdGggPT0gc3JjX3dpZHRoICYmIDIgKiBkc3RfaGVpZ2h0ID09IHNyY19oZWlnaHQpIHsKKyAgICAgIC8vIG9wdGltaXplZCwgMS8yCisgICAgICBTY2FsZVBsYW5lRG93bjIoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgZHN0X3N0cmlkZSwgc3JjLCBkc3QsIGZpbHRlcmluZyk7CisgICAgLy8gMy84IHJvdW5kZWQgdXAgZm9yIG9kZCBzaXplZCBjaHJvbWEgaGVpZ2h0LgorICAgIH0gZWxzZSBpZiAoOCAqIGRzdF93aWR0aCA9PSAzICogc3JjX3dpZHRoICYmCisgICAgICAgICAgICAgICBkc3RfaGVpZ2h0ID09ICgoc3JjX2hlaWdodCAqIDMgKyA3KSAvIDgpKSB7CisgICAgICAvLyBvcHRpbWl6ZWQsIDMvOAorICAgICAgU2NhbGVQbGFuZURvd24zOChzcmNfd2lkdGgsIHNyY19oZWlnaHQsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgZHN0X3N0cmlkZSwgc3JjLCBkc3QsIGZpbHRlcmluZyk7CisgICAgfSBlbHNlIGlmICg0ICogZHN0X3dpZHRoID09IHNyY193aWR0aCAmJiA0ICogZHN0X2hlaWdodCA9PSBzcmNfaGVpZ2h0KSB7CisgICAgICAvLyBvcHRpbWl6ZWQsIDEvNAorICAgICAgU2NhbGVQbGFuZURvd240KHNyY193aWR0aCwgc3JjX2hlaWdodCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUsIGRzdF9zdHJpZGUsIHNyYywgZHN0LCBmaWx0ZXJpbmcpOworICAgIH0gZWxzZSBpZiAoOCAqIGRzdF93aWR0aCA9PSBzcmNfd2lkdGggJiYgOCAqIGRzdF9oZWlnaHQgPT0gc3JjX2hlaWdodCkgeworICAgICAgLy8gb3B0aW1pemVkLCAxLzgKKyAgICAgIFNjYWxlUGxhbmVEb3duOChzcmNfd2lkdGgsIHNyY19oZWlnaHQsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmMsIGRzdCwgZmlsdGVyaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQXJiaXRyYXJ5IGRvd25zYW1wbGUKKyAgICAgIFNjYWxlUGxhbmVEb3duKHNyY193aWR0aCwgc3JjX2hlaWdodCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgZHN0X3N0cmlkZSwgc3JjLCBkc3QsIGZpbHRlcmluZyk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEFyYml0cmFyeSBzY2FsZSB1cCBhbmQvb3IgZG93bi4KKyAgICBTY2FsZVBsYW5lQW55U2l6ZShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBkc3Rfc3RyaWRlLCBzcmMsIGRzdCwgZmlsdGVyaW5nKTsKKyAgfQorfQorCisvKioKKyAqIFNjYWxlIGEgcGxhbmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpbiB0dXJuIGNhbGxzIGEgc2NhbGluZyBmdW5jdGlvbgorICogc3VpdGFibGUgZm9yIGhhbmRsaW5nIHRoZSBkZXNpcmVkIHJlc29sdXRpb25zLgorICoKKyAqLworCitpbnQgSTQyMFNjYWxlKGNvbnN0IHVpbnQ4KiBzcmNfeSwgaW50IHNyY19zdHJpZGVfeSwKKyAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyY191LCBpbnQgc3JjX3N0cmlkZV91LAorICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjX3YsIGludCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICB1aW50OCogZHN0X3ksIGludCBkc3Rfc3RyaWRlX3ksCisgICAgICAgICAgICAgIHVpbnQ4KiBkc3RfdSwgaW50IGRzdF9zdHJpZGVfdSwKKyAgICAgICAgICAgICAgdWludDgqIGRzdF92LCBpbnQgZHN0X3N0cmlkZV92LAorICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwKKyAgICAgICAgICAgICAgRmlsdGVyTW9kZSBmaWx0ZXJpbmcpIHsKKyAgaWYgKCFzcmNfeSB8fCAhc3JjX3UgfHwgIXNyY192IHx8IHNyY193aWR0aCA8PSAwIHx8IHNyY19oZWlnaHQgPT0gMCB8fAorICAgICAgIWRzdF95IHx8ICFkc3RfdSB8fCAhZHN0X3YgfHwgZHN0X3dpZHRoIDw9IDAgfHwgZHN0X2hlaWdodCA8PSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIE5lZ2F0aXZlIGhlaWdodCBtZWFucyBpbnZlcnQgdGhlIGltYWdlLgorICBpZiAoc3JjX2hlaWdodCA8IDApIHsKKyAgICBpbnQgaGFsZmhlaWdodDsKKyAgICBzcmNfaGVpZ2h0ID0gLXNyY19oZWlnaHQ7CisgICAgaGFsZmhlaWdodCA9IChzcmNfaGVpZ2h0ICsgMSkgPj4gMTsKKyAgICBzcmNfeSA9IHNyY195ICsgKHNyY19oZWlnaHQgLSAxKSAqIHNyY19zdHJpZGVfeTsKKyAgICBzcmNfdSA9IHNyY191ICsgKGhhbGZoZWlnaHQgLSAxKSAqIHNyY19zdHJpZGVfdTsKKyAgICBzcmNfdiA9IHNyY192ICsgKGhhbGZoZWlnaHQgLSAxKSAqIHNyY19zdHJpZGVfdjsKKyAgICBzcmNfc3RyaWRlX3kgPSAtc3JjX3N0cmlkZV95OworICAgIHNyY19zdHJpZGVfdSA9IC1zcmNfc3RyaWRlX3U7CisgICAgc3JjX3N0cmlkZV92ID0gLXNyY19zdHJpZGVfdjsKKyAgfQorICB7CisgIGludCBzcmNfaGFsZndpZHRoID0gKHNyY193aWR0aCArIDEpID4+IDE7CisgIGludCBzcmNfaGFsZmhlaWdodCA9IChzcmNfaGVpZ2h0ICsgMSkgPj4gMTsKKyAgaW50IGRzdF9oYWxmd2lkdGggPSAoZHN0X3dpZHRoICsgMSkgPj4gMTsKKyAgaW50IGRzdF9oYWxmaGVpZ2h0ID0gKGRzdF9oZWlnaHQgKyAxKSA+PiAxOworCisgICAgU2NhbGVQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsCisgICAgICAgICAgICAgICBmaWx0ZXJpbmcsIHVzZV9yZWZlcmVuY2VfaW1wbF8pOworICBTY2FsZVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY19oYWxmd2lkdGgsIHNyY19oYWxmaGVpZ2h0LAorICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF9oYWxmd2lkdGgsIGRzdF9oYWxmaGVpZ2h0LAorICAgICAgICAgICAgIGZpbHRlcmluZywgdXNlX3JlZmVyZW5jZV9pbXBsXyk7CisgIFNjYWxlUGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgc3JjX2hhbGZ3aWR0aCwgc3JjX2hhbGZoZWlnaHQsCisgICAgICAgICAgICAgZHN0X3YsIGRzdF9zdHJpZGVfdiwgZHN0X2hhbGZ3aWR0aCwgZHN0X2hhbGZoZWlnaHQsCisgICAgICAgICAgICAgZmlsdGVyaW5nLCB1c2VfcmVmZXJlbmNlX2ltcGxfKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gRGVwcmVjYXRlZCBhcGkKK2ludCBTY2FsZShjb25zdCB1aW50OCogc3JjX3ksIGNvbnN0IHVpbnQ4KiBzcmNfdSwgY29uc3QgdWludDgqIHNyY192LAorICAgICAgICAgIGludCBzcmNfc3RyaWRlX3ksIGludCBzcmNfc3RyaWRlX3UsIGludCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgdWludDgqIGRzdF95LCB1aW50OCogZHN0X3UsIHVpbnQ4KiBkc3RfdiwKKyAgICAgICAgICBpbnQgZHN0X3N0cmlkZV95LCBpbnQgZHN0X3N0cmlkZV91LCBpbnQgZHN0X3N0cmlkZV92LAorICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAorICAgICAgICAgIGludCBpbnRlcnBvbGF0ZSkgeworICBpZiAoIXNyY195IHx8ICFzcmNfdSB8fCAhc3JjX3YgfHwgc3JjX3dpZHRoIDw9IDAgfHwgc3JjX2hlaWdodCA9PSAwIHx8CisgICAgICAhZHN0X3kgfHwgIWRzdF91IHx8ICFkc3RfdiB8fCBkc3Rfd2lkdGggPD0gMCB8fCBkc3RfaGVpZ2h0IDw9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gTmVnYXRpdmUgaGVpZ2h0IG1lYW5zIGludmVydCB0aGUgaW1hZ2UuCisgIGlmIChzcmNfaGVpZ2h0IDwgMCkgeworICAgIGludCBoYWxmaGVpZ2h0OworICAgIHNyY19oZWlnaHQgPSAtc3JjX2hlaWdodDsKKyAgICBoYWxmaGVpZ2h0ID0gKHNyY19oZWlnaHQgKyAxKSA+PiAxOworICAgIHNyY195ID0gc3JjX3kgKyAoc3JjX2hlaWdodCAtIDEpICogc3JjX3N0cmlkZV95OworICAgIHNyY191ID0gc3JjX3UgKyAoaGFsZmhlaWdodCAtIDEpICogc3JjX3N0cmlkZV91OworICAgIHNyY192ID0gc3JjX3YgKyAoaGFsZmhlaWdodCAtIDEpICogc3JjX3N0cmlkZV92OworICAgIHNyY19zdHJpZGVfeSA9IC1zcmNfc3RyaWRlX3k7CisgICAgc3JjX3N0cmlkZV91ID0gLXNyY19zdHJpZGVfdTsKKyAgICBzcmNfc3RyaWRlX3YgPSAtc3JjX3N0cmlkZV92OworICB9CisgIHsKKyAgaW50IHNyY19oYWxmd2lkdGggPSAoc3JjX3dpZHRoICsgMSkgPj4gMTsKKyAgaW50IHNyY19oYWxmaGVpZ2h0ID0gKHNyY19oZWlnaHQgKyAxKSA+PiAxOworICBpbnQgZHN0X2hhbGZ3aWR0aCA9IChkc3Rfd2lkdGggKyAxKSA+PiAxOworICBpbnQgZHN0X2hhbGZoZWlnaHQgPSAoZHN0X2hlaWdodCArIDEpID4+IDE7CisgIEZpbHRlck1vZGUgZmlsdGVyaW5nID0gaW50ZXJwb2xhdGUgPyBrRmlsdGVyQm94IDoga0ZpbHRlck5vbmU7CisKKyAgU2NhbGVQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsCisgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LAorICAgICAgICAgICAgIGZpbHRlcmluZywgdXNlX3JlZmVyZW5jZV9pbXBsXyk7CisgIFNjYWxlUGxhbmUoc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX2hhbGZ3aWR0aCwgc3JjX2hhbGZoZWlnaHQsCisgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X2hhbGZ3aWR0aCwgZHN0X2hhbGZoZWlnaHQsCisgICAgICAgICAgICAgZmlsdGVyaW5nLCB1c2VfcmVmZXJlbmNlX2ltcGxfKTsKKyAgU2NhbGVQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBzcmNfaGFsZndpZHRoLCBzcmNfaGFsZmhlaWdodCwKKyAgICAgICAgICAgICBkc3RfdiwgZHN0X3N0cmlkZV92LCBkc3RfaGFsZndpZHRoLCBkc3RfaGFsZmhlaWdodCwKKyAgICAgICAgICAgICBmaWx0ZXJpbmcsIHVzZV9yZWZlcmVuY2VfaW1wbF8pOworICB9CisgIHJldHVybiAwOworfQorCisvLyBEZXByZWNhdGVkIGFwaQoraW50IFNjYWxlT2Zmc2V0KGNvbnN0IHVpbnQ4KiBzcmMsIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgIHVpbnQ4KiBkc3QsIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBpbnQgZHN0X3lvZmZzZXQsCisgICAgICAgICAgaW50IGludGVycG9sYXRlKSB7CisgIGlmICghc3JjIHx8IHNyY193aWR0aCA8PSAwIHx8IHNyY19oZWlnaHQgPD0gMCB8fAorICAgICAgIWRzdCB8fCBkc3Rfd2lkdGggPD0gMCB8fCBkc3RfaGVpZ2h0IDw9IDAgfHwgZHN0X3lvZmZzZXQgPCAwIHx8CisgICAgICBkc3RfeW9mZnNldCA+PSBkc3RfaGVpZ2h0KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGRzdF95b2Zmc2V0ID0gZHN0X3lvZmZzZXQgJiB+MTsgIC8vIGNocm9tYSByZXF1aXJlcyBvZmZzZXQgdG8gbXVsdGlwbGUgb2YgMi4KKyAgeworICBpbnQgc3JjX2hhbGZ3aWR0aCA9IChzcmNfd2lkdGggKyAxKSA+PiAxOworICBpbnQgc3JjX2hhbGZoZWlnaHQgPSAoc3JjX2hlaWdodCArIDEpID4+IDE7CisgIGludCBkc3RfaGFsZndpZHRoID0gKGRzdF93aWR0aCArIDEpID4+IDE7CisgIGludCBkc3RfaGFsZmhlaWdodCA9IChkc3RfaGVpZ2h0ICsgMSkgPj4gMTsKKyAgaW50IGFoZWlnaHQgPSBkc3RfaGVpZ2h0IC0gZHN0X3lvZmZzZXQgKiAyOyAgLy8gYWN0dWFsIG91dHB1dCBoZWlnaHQKKyAgY29uc3QgdWludDgqIGNvbnN0IHNyY195ID0gc3JjOworICBjb25zdCB1aW50OCogY29uc3Qgc3JjX3UgPSBzcmMgKyBzcmNfd2lkdGggKiBzcmNfaGVpZ2h0OworICBjb25zdCB1aW50OCogY29uc3Qgc3JjX3YgPSBzcmMgKyBzcmNfd2lkdGggKiBzcmNfaGVpZ2h0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2hhbGZ3aWR0aCAqIHNyY19oYWxmaGVpZ2h0OworICB1aW50OCogZHN0X3kgPSBkc3QgKyBkc3RfeW9mZnNldCAqIGRzdF93aWR0aDsKKyAgdWludDgqIGRzdF91ID0gZHN0ICsgZHN0X3dpZHRoICogZHN0X2hlaWdodCArCisgICAgICAgICAgICAgICAgIChkc3RfeW9mZnNldCA+PiAxKSAqIGRzdF9oYWxmd2lkdGg7CisgIHVpbnQ4KiBkc3RfdiA9IGRzdCArIGRzdF93aWR0aCAqIGRzdF9oZWlnaHQgKyBkc3RfaGFsZndpZHRoICogZHN0X2hhbGZoZWlnaHQgKworICAgICAgICAgICAgICAgICAoZHN0X3lvZmZzZXQgPj4gMSkgKiBkc3RfaGFsZndpZHRoOworICByZXR1cm4gU2NhbGUoc3JjX3ksIHNyY191LCBzcmNfdiwgc3JjX3dpZHRoLCBzcmNfaGFsZndpZHRoLCBzcmNfaGFsZndpZHRoLAorICAgICAgICAgICAgICAgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBkc3RfeSwgZHN0X3UsIGRzdF92LCBkc3Rfd2lkdGgsCisgICAgICAgICAgICAgICBkc3RfaGFsZndpZHRoLCBkc3RfaGFsZndpZHRoLCBkc3Rfd2lkdGgsIGFoZWlnaHQsIGludGVycG9sYXRlKTsKKyAgfQorfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKK30gIC8vIG5hbWVzcGFjZSBsaWJ5dXYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rvb2xzL2F1dGhvcl9maXJzdF9yZWxlYXNlLnNoIGIvbGlidnB4L3Rvb2xzL2F1dGhvcl9maXJzdF9yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiMGI3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdG9vbHMvYXV0aG9yX2ZpcnN0X3JlbGVhc2Uuc2gKQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL2Jhc2gKKyMjCisjIyBMaXN0IHRoZSByZWxlYXNlIGVhY2ggYXV0aG9yIGZpcnN0IGNvbnRyaWJ1dGVkIHRvLgorIyMKKyMjIFVzYWdlOiBhdXRob3JfZmlyc3RfcmVsZWFzZS5zaCBbVEFHU10KKyMjCisjIyBJZiB0aGUgVEFHUyBhcmd1bWVudHMgYXJlIHVuc3BlY2lmaWVkLCBhbGwgdGFncyByZXBvcnRlZCBieSBgZ2l0IHRhZ2AKKyMjIHdpbGwgYmUgY29uc2lkZXJlZC4KKyMjCit0YWdzPSR7QDotJChnaXQgdGFnKX0KK2ZvciB0YWcgaW4gJHRhZ3M7IGRvCisgIGdpdCBzaG9ydGxvZyAtbiAtZSAtcyAkdGFnIHwKKyAgICAgIGN1dCAtZjItIHwKKyAgICAgIGF3ayAie3ByaW50IFwiJHt0YWcjdn1cdFwiXCQwfSIKK2RvbmUgfCBzb3J0IC1rMiAgfCB1bmlxIC1mMgpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rvb2xzL2Z0Znkuc2ggYi9saWJ2cHgvdG9vbHMvZnRmeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNWNmZGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rvb2xzL2Z0Znkuc2gKQEAgLTAsMCArMSwxNjAgQEAKKyMhL2Jpbi9zaAorc2VsZj0iJDAiCitkaXJuYW1lX3NlbGY9JChkaXJuYW1lICIkc2VsZiIpCisKK3VzYWdlKCkgeworICBjYXQgPDxFT0YgPiYyCitVc2FnZTogJHNlbGYgW29wdGlvbl0KKworVGhpcyBzY3JpcHQgYXBwbGllcyBhIHdoaXRlc3BhY2UgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGNvbW1pdCBhdCBIRUFELiBJZiBubworb3B0aW9ucyBhcmUgZ2l2ZW4sIHRoZW4gdGhlIG1vZGlmaWVkIGZpbGVzIGFyZSBsZWZ0IGluIHRoZSB3b3JraW5nIHRyZWUuCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgICAgIFNob3dzIHRoaXMgbWVzc2FnZQorICAtbiwgLS1kcnktcnVuICBTaG93cyBhIGRpZmYgb2YgdGhlIGNoYW5nZXMgdG8gYmUgbWFkZS4KKyAgLS1hbWVuZCAgICAgICAgU3F1YXNoZXMgdGhlIGNoYW5nZXMgaW50byB0aGUgY29tbWl0IGF0IEhFQUQKKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHdpbGwgYWxzbyByZWZvcm1hdCB0aGUgY29tbWl0IG1lc3NhZ2UuCisgIC0tY29tbWl0ICAgICAgIENyZWF0ZXMgYSBuZXcgY29tbWl0IGNvbnRhaW5pbmcgb25seSB0aGUgd2hpdGVzcGFjZSBjaGFuZ2VzCisgIC0tbXNnLW9ubHkgICAgIFJlZm9ybWF0IHRoZSBjb21taXQgbWVzc2FnZSBvbmx5LCBpZ25vcmUgdGhlIHBhdGNoIGl0c2VsZi4KKworRU9GCisgIHJtIC1mICR7Q0xFQU5fRklMRVN9CisgIGV4aXQgMQorfQorCisKK2xvZygpIHsKKyAgZWNobyAiJHtzZWxmIyMqL306ICRAIiA+JjIKK30KKworCit2cHhfc3R5bGUoKSB7CisgIGFzdHlsZSAtLXN0eWxlPWJzZCAtLW1pbi1jb25kaXRpb25hbC1pbmRlbnQ9MCAtLWJyZWFrLWJsb2NrcyBcCisgICAgICAgICAtLXBhZC1vcGVyIC0tcGFkLWhlYWRlciAtLXVucGFkLXBhcmVuIFwKKyAgICAgICAgIC0tYWxpZ24tcG9pbnRlcj1uYW1lIFwKKyAgICAgICAgIC0taW5kZW50LXByZXByb2Nlc3NvciAtLWNvbnZlcnQtdGFicyAtLWluZGVudC1sYWJlbHMgXAorICAgICAgICAgLS1zdWZmaXg9bm9uZSAtLXF1aWV0ICIkQCIKKyAgc2VkIC1pICIiICdzL1tbOnNwYWNlOl1dXHsxLFx9LC8sL2cnICIkQCIKK30KKworCithcHBseSgpIHsKKyAgWyAkSU5URVJTRUNUX1JFU1VMVCAtbmUgMCBdICYmIHBhdGNoIC1wMSA8ICIkMSIKK30KKworCitjb21taXQoKSB7CisgIExBU1RfQ0hBTkdFSUQ9JChnaXQgc2hvdyB8IGF3ayAnL0NoYW5nZS1JZDove3ByaW50ICQyfScpCisgIGlmIFsgLXogIiRMQVNUX0NIQU5HRUlEIiBdOyB0aGVuCisgICAgbG9nICJIRUFEIGRvZXNuJ3QgaGF2ZSBhIENoYW5nZS1JZCwgdW5hYmxlIHRvIGdlbmVyYXRlIGEgbmV3IGNvbW1pdCIKKyAgICBleGl0IDEKKyAgZmkKKworICAjIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBDaGFuZ2UtSWQgZnJvbSB0aGUgcGFyZW50J3MKKyAgTkVXX0NIQU5HRUlEPSR7TEFTVF9DSEFOR0VJRH0tc3R5bGVkCisgIE5FV19DSEFOR0VJRD1JJChlY2hvICRORVdfQ0hBTkdFSUQgfCBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbikKKworICAjIENvbW1pdCwgcHJlc2VydmluZyBhdXRob3JzaGlwIGZyb20gdGhlIHBhcmVudCBjb21taXQuCisgIGdpdCBjb21taXQgLWEgLUMgSEVBRCA+IC9kZXYvbnVsbAorICBnaXQgY29tbWl0IC0tYW1lbmQgLUYtIDw8IEVPRgorQ29zbWV0aWM6IEZpeCB3aGl0ZXNwYWNlIGluIGNoYW5nZSAke0xBU1RfQ0hBTkdFSUQ6MDo5fQorCitDaGFuZ2UtSWQ6ICR7TkVXX0NIQU5HRUlEfQorRU9GCit9CisKKworc2hvd19jb21taXRfbXNnX2RpZmYoKSB7CisgIGlmIFsgJERJRkZfTVNHX1JFU1VMVCAtbmUgMCBdOyB0aGVuCisgICAgbG9nICJNb2RpZmllZCBjb21taXQgbWVzc2FnZToiCisgICAgZGlmZiAtdSAiJE9SSUdfQ09NTUlUX01TRyIgIiRORVdfQ09NTUlUX01TRyIgfCB0YWlsIC1uICszCisgIGZpCit9CisKKworYW1lbmQoKSB7CisgIHNob3dfY29tbWl0X21zZ19kaWZmCisgIGlmIFsgJERJRkZfTVNHX1JFU1VMVCAtbmUgMCBdIHx8IFsgJElOVEVSU0VDVF9SRVNVTFQgLW5lIDAgXTsgdGhlbgorICAgIGdpdCBjb21taXQgLWEgLS1hbWVuZCAtRiAiJE5FV19DT01NSVRfTVNHIgorICBmaQorfQorCisKK2RpZmZfbXNnKCkgeworICBnaXQgbG9nIC0xIC0tZm9ybWF0PSVCID4gIiRPUklHX0NPTU1JVF9NU0ciCisgICIke2Rpcm5hbWVfc2VsZn0iL3dyYXAtY29tbWl0LW1zZy5weSBcCisgICAgICA8ICIkT1JJR19DT01NSVRfTVNHIiA+ICIkTkVXX0NPTU1JVF9NU0ciCisgIGNtcCAtcyAiJE9SSUdfQ09NTUlUX01TRyIgIiRORVdfQ09NTUlUX01TRyIKKyAgRElGRl9NU0dfUkVTVUxUPSQ/Cit9CisKKworIyBUZW1wb3JhcnkgZmlsZXMKK09SSUdfRElGRj1vcmlnLmRpZmYuJCQKK01PRElGSUVEX0RJRkY9bW9kaWZpZWQuZGlmZi4kJAorRklOQUxfRElGRj1maW5hbC5kaWZmLiQkCitPUklHX0NPTU1JVF9NU0c9b3JpZy5jb21taXQtbXNnLiQkCitORVdfQ09NTUlUX01TRz1uZXcuY29tbWl0LW1zZy4kJAorQ0xFQU5fRklMRVM9IiR7T1JJR19ESUZGfSAke01PRElGSUVEX0RJRkZ9ICR7RklOQUxfRElGRn0iCitDTEVBTl9GSUxFUz0iJHtDTEVBTl9GSUxFU30gJHtPUklHX0NPTU1JVF9NU0d9ICR7TkVXX0NPTU1JVF9NU0d9IgorCisjIFByZWNvbmRpdGlvbnMKK1sgJCMgLWx0IDIgXSB8fCB1c2FnZQorCisjIENoZWNrIHRoYXQgYXN0eWxlIHN1cHBvcnRzIHBhZC1oZWFkZXIgYW5kIGFsaWduLXBvaW50ZXI9bmFtZQoraWYgISBhc3R5bGUgLS1wYWQtaGVhZGVyIC0tYWxpZ24tcG9pbnRlcj1uYW1lIDwgL2Rldi9udWxsOyB0aGVuCisgIGxvZyAiSW5zdGFsbCBhc3R5bGUgdjEuMjQgb3IgbmV3ZXIiCisgIGV4aXQgMQorZmkKKworaWYgISBnaXQgZGlmZiAtLXF1aWV0IEhFQUQ7IHRoZW4KKyAgbG9nICJXb3JraW5nIHRyZWUgaXMgZGlydHksIGNvbW1pdCB5b3VyIGNoYW5nZXMgZmlyc3QiCisgIGV4aXQgMQorZmkKKworIyBOZWVkIHRvIGJlIGluIHRoZSByb290CitjZCAiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbCkiCisKKyMgQ29sbGVjdCB0aGUgb3JpZ2luYWwgZGlmZgorZ2l0IHNob3cgPiAiJHtPUklHX0RJRkZ9IgorCisjIEFwcGx5IHRoZSBzdHlsZSBndWlkZSBvbiBuZXcgYW5kIG1vZGlmaWVkIGZpbGVzIGFuZCBjb2xsZWN0IGl0cyBkaWZmCitmb3IgZiBpbiAkKGdpdCBkaWZmIEhFQUReIC0tbmFtZS1vbmx5IC1NOTAgLS1kaWZmLWZpbHRlcj1BTSBcCisgICAgICAgICAgIHwgZ3JlcCAnXC5bY2hdJCcpOyBkbworICBjYXNlICIkZiIgaW4KKyAgICB0aGlyZF9wYXJ0eS8qKSBjb250aW51ZTs7CisgICAgbmVzdGVnZy8qKSBjb250aW51ZTs7CisgIGVzYWMKKyAgdnB4X3N0eWxlICIkZiIKK2RvbmUKK2dpdCBkaWZmIC0tbm8tY29sb3IgLS1uby1leHQtZGlmZiA+ICIke01PRElGSUVEX0RJRkZ9IgorCisjIEludGVyc2VjdCB0aGUgdHdvIGRpZmZzCisiJHtkaXJuYW1lX3NlbGZ9Ii9pbnRlcnNlY3QtZGlmZnMucHkgXAorICAgICIke09SSUdfRElGRn0iICIke01PRElGSUVEX0RJRkZ9IiA+ICIke0ZJTkFMX0RJRkZ9IgorSU5URVJTRUNUX1JFU1VMVD0kPworZ2l0IHJlc2V0IC0taGFyZCA+L2Rldi9udWxsCisKKyMgRml4dXAgdGhlIGNvbW1pdCBtZXNzYWdlCitkaWZmX21zZworCisjIEhhbmRsZSBvcHRpb25zCitpZiBbIC1uICIkMSIgXTsgdGhlbgorICBjYXNlICIkMSIgaW4KKyAgICAtaHwtLWhlbHApIHVzYWdlOzsKKyAgICAtbnwtLWRyeS1ydW4pIGNhdCAiJHtGSU5BTF9ESUZGfSI7IHNob3dfY29tbWl0X21zZ19kaWZmOzsKKyAgICAtLWNvbW1pdCkgYXBwbHkgIiR7RklOQUxfRElGRn0iOyBjb21taXQ7OworICAgIC0tYW1lbmQpIGFwcGx5ICIke0ZJTkFMX0RJRkZ9IjsgYW1lbmQ7OworICAgIC0tbXNnLW9ubHkpIGFtZW5kOzsKKyAgICAqKSB1c2FnZTs7CisgIGVzYWMKK2Vsc2UKKyAgYXBwbHkgIiR7RklOQUxfRElGRn0iCisgIGlmICEgZ2l0IGRpZmYgLS1xdWlldDsgdGhlbgorICAgIGxvZyAiRm9ybWF0dGluZyBjaGFuZ2VzIGFwcGxpZWQsIHZlcmlmeSBhbmQgY29tbWl0LiIKKyAgICBsb2cgIlNlZSBhbHNvOiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvY29udmVudGlvbnMvIgorICAgIGdpdCBkaWZmIC0tc3RhdAorICBmaQorZmkKKworcm0gLWYgJHtDTEVBTl9GSUxFU30KZGlmZiAtLWdpdCBhL3Rvb2xzL2dlbl9hdXRob3JzLnNoIGIvbGlidnB4L3Rvb2xzL2dlbl9hdXRob3JzLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9nZW5fYXV0aG9ycy5zaApyZW5hbWUgdG8gbGlidnB4L3Rvb2xzL2dlbl9hdXRob3JzLnNoCmRpZmYgLS1naXQgYS9saWJ2cHgvdG9vbHMvaW50ZXJzZWN0LWRpZmZzLnB5IGIvbGlidnB4L3Rvb2xzL2ludGVyc2VjdC1kaWZmcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZTlkZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3Rvb2xzL2ludGVyc2VjdC1kaWZmcy5weQpAQCAtMCwwICsxLDE4OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIyAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjCisjIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisjIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisjIworIiIiQ2FsY3VsYXRlcyB0aGUgImludGVyc2VjdGlvbiIgb2YgdHdvIHVuaWZpZWQgZGlmZnMuCisKK0dpdmVuIHR3byBkaWZmcywgQSBhbmQgQiwgaXQgZmluZHMgYWxsIGh1bmtzIGluIEIgdGhhdCBoYWQgbm9uLWNvbnRleHQgbGluZXMKK2luIEEgYW5kIHByaW50cyB0aGVtIHRvIHN0ZG91dC4gVGhpcyBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBodW5rcyBpbiBCIHRoYXQKK2FyZSByZWxldmFudCB0byBBLiBUaGUgcmVzdWx0aW5nIGZpbGUgY2FuIGJlIGFwcGxpZWQgd2l0aCBwYXRjaCgxKSBvbiB0b3Agb2YgQS4KKyIiIgorCitfX2F1dGhvcl9fID0gImprb2xlc3phckBnb29nbGUuY29tIgorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworCitjbGFzcyBEaWZmTGluZXMob2JqZWN0KToKKyAgICAiIiJBIGNvbnRhaW5lciBmb3Igb25lIGhhbGYgb2YgYSBkaWZmLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBvZmZzZXQsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLmxlbmd0aCA9IGxlbmd0aAorICAgICAgICBzZWxmLmxpbmVzID0gW10KKyAgICAgICAgc2VsZi5kZWx0YV9saW5lX251bXMgPSBbXQorCisgICAgZGVmIEFwcGVuZChzZWxmLCBsaW5lKToKKyAgICAgICAgbCA9IGxlbihzZWxmLmxpbmVzKQorICAgICAgICBpZiBsaW5lWzBdICE9ICIgIjoKKyAgICAgICAgICAgIHNlbGYuZGVsdGFfbGluZV9udW1zLmFwcGVuZChzZWxmLm9mZnNldCArIGwpCisgICAgICAgIHNlbGYubGluZXMuYXBwZW5kKGxpbmVbMTpdKQorICAgICAgICBhc3NlcnQgbCsxIDw9IHNlbGYubGVuZ3RoCisKKyAgICBkZWYgQ29tcGxldGUoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5saW5lcykgPT0gc2VsZi5sZW5ndGgKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CisgICAgICAgIHJldHVybiBpdGVtID49IHNlbGYub2Zmc2V0IGFuZCBpdGVtIDw9IHNlbGYub2Zmc2V0ICsgc2VsZi5sZW5ndGggLSAxCisKKworY2xhc3MgRGlmZkh1bmsob2JqZWN0KToKKyAgICAiIiJBIGNvbnRhaW5lciBmb3Igb25lIGRpZmYgaHVuaywgY29uc2lzdGluZyBvZiB0d28gRGlmZkxpbmVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlciwgZmlsZV9hLCBmaWxlX2IsIHN0YXJ0X2EsIGxlbl9hLCBzdGFydF9iLCBsZW5fYik6CisgICAgICAgIHNlbGYuaGVhZGVyID0gaGVhZGVyCisgICAgICAgIHNlbGYubGVmdCA9IERpZmZMaW5lcyhmaWxlX2EsIHN0YXJ0X2EsIGxlbl9hKQorICAgICAgICBzZWxmLnJpZ2h0ID0gRGlmZkxpbmVzKGZpbGVfYiwgc3RhcnRfYiwgbGVuX2IpCisgICAgICAgIHNlbGYubGluZXMgPSBbXQorCisgICAgZGVmIEFwcGVuZChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiQWRkcyBhIGxpbmUgdG8gdGhlIERpZmZIdW5rIGFuZCBpdHMgRGlmZkxpbmVzIGNoaWxkcmVuLiIiIgorICAgICAgICBpZiBsaW5lWzBdID09ICItIjoKKyAgICAgICAgICAgIHNlbGYubGVmdC5BcHBlbmQobGluZSkKKyAgICAgICAgZWxpZiBsaW5lWzBdID09ICIrIjoKKyAgICAgICAgICAgIHNlbGYucmlnaHQuQXBwZW5kKGxpbmUpCisgICAgICAgIGVsaWYgbGluZVswXSA9PSAiICI6CisgICAgICAgICAgICBzZWxmLmxlZnQuQXBwZW5kKGxpbmUpCisgICAgICAgICAgICBzZWxmLnJpZ2h0LkFwcGVuZChsaW5lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAoIlVucmVjb2duaXplZCBjaGFyYWN0ZXIgYXQgc3RhcnQgb2YgZGlmZiBsaW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlciIgJSBsaW5lWzBdKQorICAgICAgICBzZWxmLmxpbmVzLmFwcGVuZChsaW5lKQorCisgICAgZGVmIENvbXBsZXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LkNvbXBsZXRlKCkgYW5kIHNlbGYucmlnaHQuQ29tcGxldGUoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkRpZmZIdW5rKCVzLCAlcywgbGVuICVkKSIgJSAoCisgICAgICAgICAgICBzZWxmLmxlZnQuZmlsZW5hbWUsIHNlbGYucmlnaHQuZmlsZW5hbWUsCisgICAgICAgICAgICBtYXgoc2VsZi5sZWZ0Lmxlbmd0aCwgc2VsZi5yaWdodC5sZW5ndGgpKQorCisKK2RlZiBQYXJzZURpZmZIdW5rcyhzdHJlYW0pOgorICAgICIiIldhbGsgYSBmaWxlLWxpa2Ugb2JqZWN0LCB5aWVsZGluZyBEaWZmSHVua3MgYXMgdGhleSdyZSBwYXJzZWQuIiIiCisKKyAgICBmaWxlX3JlZ2V4ID0gcmUuY29tcGlsZShyIihcK1wrXCt8LS0tKSAoXFMrKSIpCisgICAgcmFuZ2VfcmVnZXggPSByZS5jb21waWxlKHIiQEAgLShcZCspKCwoXGQrKSk/IFwrKFxkKykoLChcZCspKT8iKQorICAgIGh1bmsgPSBOb25lCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgbGluZSA9IHN0cmVhbS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBodW5rIGlzIE5vbmU6CisgICAgICAgICAgICAjIFBhcnNlIGZpbGUgbmFtZXMKKyAgICAgICAgICAgIGRpZmZfZmlsZSA9IGZpbGVfcmVnZXgubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIGRpZmZfZmlsZToKKyAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCItLS0iKToKKyAgICAgICAgICAgICAgICAgIGFfbGluZSA9IGxpbmUKKyAgICAgICAgICAgICAgICAgIGEgPSBkaWZmX2ZpbGUuZ3JvdXAoMikKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiKysrIik6CisgICAgICAgICAgICAgICAgICBiX2xpbmUgPSBsaW5lCisgICAgICAgICAgICAgICAgICBiID0gZGlmZl9maWxlLmdyb3VwKDIpCisgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFBhcnNlIG9mZnNldC9sZW5ndGhzCisgICAgICAgICAgICBkaWZmcmFuZ2UgPSByYW5nZV9yZWdleC5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgZGlmZnJhbmdlOgorICAgICAgICAgICAgICAgIGlmIGRpZmZyYW5nZS5ncm91cCgyKToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfYSA9IGludChkaWZmcmFuZ2UuZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgICAgIGxlbl9hID0gaW50KGRpZmZyYW5nZS5ncm91cCgzKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdGFydF9hID0gMQorICAgICAgICAgICAgICAgICAgICBsZW5fYSA9IGludChkaWZmcmFuZ2UuZ3JvdXAoMSkpCisKKyAgICAgICAgICAgICAgICBpZiBkaWZmcmFuZ2UuZ3JvdXAoNSk6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2IgPSBpbnQoZGlmZnJhbmdlLmdyb3VwKDQpKQorICAgICAgICAgICAgICAgICAgICBsZW5fYiA9IGludChkaWZmcmFuZ2UuZ3JvdXAoNikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfYiA9IDEKKyAgICAgICAgICAgICAgICAgICAgbGVuX2IgPSBpbnQoZGlmZnJhbmdlLmdyb3VwKDQpKQorCisgICAgICAgICAgICAgICAgaGVhZGVyID0gW2FfbGluZSwgYl9saW5lLCBsaW5lXQorICAgICAgICAgICAgICAgIGh1bmsgPSBEaWZmSHVuayhoZWFkZXIsIGEsIGIsIHN0YXJ0X2EsIGxlbl9hLCBzdGFydF9iLCBsZW5fYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQWRkIHRoZSBjdXJyZW50IGxpbmUgdG8gdGhlIGh1bmsKKyAgICAgICAgICAgIGh1bmsuQXBwZW5kKGxpbmUpCisKKyAgICAgICAgICAgICMgU2VlIGlmIHRoZSB3aG9sZSBodW5rIGhhcyBiZWVuIHBhcnNlZC4gSWYgc28sIHlpZWxkIGl0IGFuZCBwcmVwYXJlCisgICAgICAgICAgICAjIGZvciB0aGUgbmV4dCBodW5rLgorICAgICAgICAgICAgaWYgaHVuay5Db21wbGV0ZSgpOgorICAgICAgICAgICAgICAgIHlpZWxkIGh1bmsKKyAgICAgICAgICAgICAgICBodW5rID0gTm9uZQorCisgICAgIyBQYXJ0aWFsIGh1bmtzIGFyZSBhIHBhcnNlIGVycm9yCisgICAgYXNzZXJ0IGh1bmsgaXMgTm9uZQorCisKK2RlZiBGb3JtYXREaWZmSHVua3MoaHVua3MpOgorICAgICIiIlJlLXNlcmlhbGl6ZSBhIGxpc3Qgb2YgRGlmZkh1bmtzLiIiIgorICAgIHIgPSBbXQorICAgIGxhc3RfaGVhZGVyID0gTm9uZQorICAgIGZvciBodW5rIGluIGh1bmtzOgorICAgICAgICB0aGlzX2hlYWRlciA9IGh1bmsuaGVhZGVyWzA6Ml0KKyAgICAgICAgaWYgbGFzdF9oZWFkZXIgIT0gdGhpc19oZWFkZXI6CisgICAgICAgICAgICByLmV4dGVuZChodW5rLmhlYWRlcikKKyAgICAgICAgICAgIGxhc3RfaGVhZGVyID0gdGhpc19oZWFkZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHIuZXh0ZW5kKGh1bmsuaGVhZGVyWzJdKQorICAgICAgICByLmV4dGVuZChodW5rLmxpbmVzKQorICAgICAgICByLmFwcGVuZCgiXG4iKQorICAgIHJldHVybiAiIi5qb2luKHIpCisKKworZGVmIFppcEh1bmtzKHJoc19odW5rcywgbGhzX2h1bmtzKToKKyAgICAiIiJKb2luIHR3byBodW5rIGxpc3RzIG9uIGZpbGVuYW1lLiIiIgorICAgIGZvciByaHNfaHVuayBpbiByaHNfaHVua3M6CisgICAgICAgIHJoc19maWxlID0gcmhzX2h1bmsucmlnaHQuZmlsZW5hbWUuc3BsaXQoIi8iKVsxOl0KKworICAgICAgICBmb3IgbGhzX2h1bmsgaW4gbGhzX2h1bmtzOgorICAgICAgICAgICAgbGhzX2ZpbGUgPSBsaHNfaHVuay5sZWZ0LmZpbGVuYW1lLnNwbGl0KCIvIilbMTpdCisgICAgICAgICAgICBpZiBsaHNfZmlsZSAhPSByaHNfZmlsZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWllbGQgKHJoc19odW5rLCBsaHNfaHVuaykKKworCitkZWYgbWFpbigpOgorICAgIG9sZF9odW5rcyA9IFt4IGZvciB4IGluIFBhcnNlRGlmZkh1bmtzKG9wZW4oc3lzLmFyZ3ZbMV0sICJyIikpXQorICAgIG5ld19odW5rcyA9IFt4IGZvciB4IGluIFBhcnNlRGlmZkh1bmtzKG9wZW4oc3lzLmFyZ3ZbMl0sICJyIikpXQorICAgIG91dF9odW5rcyA9IFtdCisKKyAgICAjIEpvaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgb2xkZXIgZGlmZiB3aXRoIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUKKyAgICAjIG5ld2VyIGRpZmYuCisgICAgZm9yIG9sZF9odW5rLCBuZXdfaHVuayBpbiBaaXBIdW5rcyhvbGRfaHVua3MsIG5ld19odW5rcyk6CisgICAgICAgIGlmIG5ld19odW5rIGluIG91dF9odW5rczoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG9sZF9saW5lcyA9IG9sZF9odW5rLnJpZ2h0CisgICAgICAgIG5ld19saW5lcyA9IG5ld19odW5rLmxlZnQKKworICAgICAgICAjIERldGVybWluZSBpZiB0aGlzIGh1bmsgb3ZlcmxhcHMgYW55IG5vbi1jb250ZXh0IGxpbmUgZnJvbSB0aGUgb3RoZXIKKyAgICAgICAgZm9yIGkgaW4gb2xkX2xpbmVzLmRlbHRhX2xpbmVfbnVtczoKKyAgICAgICAgICAgIGlmIGkgaW4gbmV3X2xpbmVzOgorICAgICAgICAgICAgICAgIG91dF9odW5rcy5hcHBlbmQobmV3X2h1bmspCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGlmIG91dF9odW5rczoKKyAgICAgICAgcHJpbnQgRm9ybWF0RGlmZkh1bmtzKG91dF9odW5rcykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYnZweC90b29scy93cmFwLWNvbW1pdC1tc2cucHkgYi9saWJ2cHgvdG9vbHMvd3JhcC1jb21taXQtbXNnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1YjRiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdG9vbHMvd3JhcC1jb21taXQtbXNnLnB5CkBAIC0wLDAgKzEsNzAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyMgIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKyIiIldyYXBzIHBhcmFncmFwaHMgb2YgdGV4dCwgcHJlc2VydmluZyBtYW51YWwgZm9ybWF0dGluZworCitUaGlzIGlzIGxpa2UgZm9sZCgxKSwgYnV0IGhhcyB0aGUgc3BlY2lhbCBjb252ZW50aW9uIG9mIG5vdCBtb2RpZnlpbmcgbGluZXMKK3RoYXQgc3RhcnQgd2l0aCB3aGl0ZXNwYWNlLiBUaGlzIGFsbG93cyB5b3UgdG8gaW50ZXJzcGVyc2UgYmxvY2tzIHdpdGgKK3NwZWNpYWwgZm9ybWF0dGluZywgbGlrZSBjb2RlIGJsb2Nrcywgd2l0aCB3cml0dGVuIHByb3NlLiBUaGUgcHJvc2Ugd2lsbAorYmUgd29yZHdyYXBwZWQsIGFuZCB0aGUgbWFudWFsIGZvcm1hdHRpbmcgd2lsbCBiZSBwcmVzZXJ2ZWQuCisKKyAqIFRoaXMgd29uJ3QgaGFuZGxlIHRoZSBjYXNlIG9mIGEgYnVsbGV0ZWQgKG9yIG9yZGVyZWQpIGxpc3Qgc3BlY2lhbGx5LCBzbworICAgbWFudWFsIHdyYXBwaW5nIG11c3QgYmUgZG9uZS4KKworT2NjYXNpb25hbGx5IGl0J3MgdXNlZnVsIHRvIHB1dCBzb21ldGhpbmcgd2l0aCBleHBsaWNpdCBmb3JtYXR0aW5nIHRoYXQKK2RvZXNuJ3QgbG9vayBhdCBhbGwgbGlrZSBhIGJsb2NrIG9mIHRleHQgaW5saW5lLgorCisgIGluZGljYXRvciA9IGhhc19sZWFkaW5nX3doaXRlc3BhY2UobGluZSk7CisgIGlmIChpbmRpY2F0b3IpCisgICAgcHJlc2VydmVfZm9ybWF0dGluZyhsaW5lKTsKKworVGhlIGludGVudCBpcyB0aGF0IHRoaXMgZG9jc3RyaW5nIHdvdWxkIG1ha2UgaXQgdGhyb3VnaCB0aGUgdHJhbnNmb3JtCithbmQgc3RpbGwgYmUgbGVnaWJsZSBhbmQgcHJlc2VudGVkIGFzIGl0IGlzIGluIHRoZSBzb3VyY2UuIElmIGFkZGl0aW9uYWwKK2Nhc2VzIGFyZSBoYW5kbGVkLCB1cGRhdGUgdGhpcyBkb2MgdG8gZGVzY3JpYmUgdGhlIGVmZmVjdC4KKyIiIgorCitfX2F1dGhvcl9fID0gImprb2xlc3phckBnb29nbGUuY29tIgoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgc3lzCisKK2RlZiB3cmFwKHRleHQpOgorICAgIGlmIHRleHQ6CisgICAgICAgIHJldHVybiB0ZXh0d3JhcC5maWxsKHRleHQsIGJyZWFrX2xvbmdfd29yZHM9RmFsc2UpICsgJ1xuJworICAgIHJldHVybiAiIgorCisKK2RlZiBtYWluKGZpbGVvYmopOgorICAgIHRleHQgPSAiIgorICAgIG91dHB1dCA9ICIiCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgbGluZSA9IGZpbGVvYmoucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgbGluZS5sc3RyaXAoKSA9PSBsaW5lOgorICAgICAgICAgICAgdGV4dCArPSBsaW5lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQgKz0gd3JhcCh0ZXh0KQorICAgICAgICAgICAgdGV4dD0iIgorICAgICAgICAgICAgb3V0cHV0ICs9IGxpbmUKKyAgICBvdXRwdXQgKz0gd3JhcCh0ZXh0KQorCisgICAgIyBSZXBsYWNlIHRoZSBmaWxlIG9yIHdyaXRlIHRvIHN0ZG91dC4KKyAgICBpZiBmaWxlb2JqID09IHN5cy5zdGRpbjoKKyAgICAgICAgZmlsZW9iaiA9IHN5cy5zdGRvdXQKKyAgICBlbHNlOgorICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgZmlsZW9iai50cnVuY2F0ZSgwKQorICAgIGZpbGVvYmoud3JpdGUob3V0cHV0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICBtYWluKG9wZW4oc3lzLmFyZ3ZbMV0sICJyKyIpKQorICAgIGVsc2U6CisgICAgICAgIG1haW4oc3lzLnN0ZGluKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3Rvb2xzX2NvbW1vbi5jIGIvbGlidnB4L3Rvb2xzX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOTUwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdG9vbHNfY29tbW9uLmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidG9vbHNfY29tbW9uLmgiCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19PUzJfXykKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBfX09TMl9fCisjZGVmaW5lIF9zZXRtb2RlICAgIHNldG1vZGUKKyNkZWZpbmUgX2ZpbGVubyAgICAgZmlsZW5vCisjZGVmaW5lIF9PX0JJTkFSWSAgIE9fQklOQVJZCisjZW5kaWYKKyNlbmRpZgorCitGSUxFKiBzZXRfYmluYXJ5X21vZGUoRklMRSAqc3RyZWFtKQoreworICAgICh2b2lkKXN0cmVhbTsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX09TMl9fKQorICAgIF9zZXRtb2RlKF9maWxlbm8oc3RyZWFtKSwgX09fQklOQVJZKTsKKyNlbmRpZgorICAgIHJldHVybiBzdHJlYW07Cit9CmRpZmYgLS1naXQgYS90b29sc19jb21tb24uaCBiL2xpYnZweC90b29sc19jb21tb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHNfY29tbW9uLmgKcmVuYW1lIHRvIGxpYnZweC90b29sc19jb21tb24uaApkaWZmIC0tZ2l0IGEvbGlidnB4L3VzYWdlLmRveCBiL2xpYnZweC91c2FnZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmZDZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC91c2FnZS5kb3gKQEAgLTAsMCArMSwyMDggQEAKKy8qIVxwYWdlIHVzYWdlIFVzYWdlCisKKyAgICBUaGUgdnB4IG11bHRpLWZvcm1hdCBjb2RlYyBTREsgcHJvdmlkZXMgYSB1bmlmaWVkIGludGVyZmFjZSBhbW9uZ3N0IGl0cworICAgIHN1cHBvcnRlZCBjb2RlY3MuIFRoaXMgYWJzdHJhY3Rpb24gYWxsb3dzIGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIFNESyB0bworICAgIGVhc2lseSBzdXBwb3J0IG11bHRpcGxlIHZpZGVvIGZvcm1hdHMgd2l0aCBtaW5pbWFsIGNvZGUgZHVwbGljYXRpb24gb3IKKyAgICAic3BlY2lhbCBjYXNpbmcuIiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgY29tbW9uIHRvIGFsbCBjb2RlY3MuCisgICAgRm9yIGNvZGVjLXNwZWNpZmljIGRldGFpbHMsIHNlZSB0aGUgXHJlZiBjb2RlY3MgcGFnZS4KKworICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIGNvbW1vbiB0byBhbGwgY29kZWNzOgorICAgIC0gXHJlZiB1c2FnZV90eXBlcworICAgIC0gXHJlZiB1c2FnZV9mZWF0dXJlcworICAgIC0gXHJlZiB1c2FnZV9pbml0CisgICAgLSBccmVmIHVzYWdlX2Vycm9ycworCisgICAgRm9yZSBtb3JlIGluZm9ybWF0aW9uIG9uIGRlY29kZXIgYW5kIGVuY29kZXIgc3BlY2lmaWMgdXNhZ2UsIHNlZSB0aGUKKyAgICBmb2xsb3dpbmcgcGFnZXM6CisgICAgXGlmIGRlY29kZXIKKyAgICAtIFxzdWJwYWdlIHVzYWdlX2RlY29kZQorICAgIFxlbmRpZgorICAgIFxpZiBkZWNvZGVyCisgICAgLSBcc3VicGFnZSB1c2FnZV9lbmNvZGUKKyAgICBcZW5kaWYKKworICAgIFxzZWN0aW9uIHVzYWdlX3R5cGVzIEltcG9ydGFudCBEYXRhIFR5cGVzCisgICAgVGhlcmUgYXJlIHR3byBpbXBvcnRhbnQgZGF0YSBzdHJ1Y3R1cmVzIHRvIGNvbnNpZGVyIGluIHRoaXMgaW50ZXJmYWNlLgorCisgICAgXHN1YnNlY3Rpb24gdXNhZ2VfY3R4cyBDb250ZXh0cworICAgIEEgY29udGV4dCBpcyBhIHN0b3JhZ2UgYXJlYSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gdGhhdCB0aGUKKyAgICBjb2RlYyBtYXkgd3JpdGUgaW50byB0byBzdG9yZSBkZXRhaWxzIGFib3V0IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoYXQgY29kZWMuCisgICAgTW9zdCBvZiB0aGUgY29udGV4dCBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYywgYW5kIHRodXMgb3BhcXVlIHRvIHRoZQorICAgIGFwcGxpY2F0aW9uLiBUaGUgY29udGV4dCBzdHJ1Y3R1cmUgYXMgc2VlbiBieSB0aGUgYXBwbGljYXRpb24gaXMgb2YgZml4ZWQKKyAgICBzaXplLCBhbmQgdGh1cyBjYW4gYmUgYWxsb2NhdGVkIHdpdGggYXV0b21hdGljIHN0b3JhZ2Ugb3IgZHluYW1pY2FsbHkKKyAgICBvbiB0aGUgaGVhcC4KKworICAgIE1vc3Qgb3BlcmF0aW9ucyByZXF1aXJlIGFuIGluaXRpYWxpemVkIGNvZGVjIGNvbnRleHQuIENvZGVjIGNvbnRleHQKKyAgICBpbnN0YW5jZXMgYXJlIGNvZGVjIHNwZWNpZmljLiBUaGF0IGlzLCB0aGUgY29kZWMgdG8gYmUgdXNlZCBmb3IgdGhlIGVuY29kZWQKKyAgICB2aWRlbyBtdXN0IGJlIGtub3duIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuIFNlZSAjdnB4X2NvZGVjX2N0eF90IGZvciBmdXJ0aGVyCisgICAgaW5mb3JtYXRpb24uCisKKyAgICBcc3Vic2VjdGlvbiB1c2FnZV9pZmFjZXMgSW50ZXJmYWNlcworICAgIEEgY29kZWMgaW50ZXJmYWNlIGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdGhhdCBjb250cm9scyBob3cgZnVuY3Rpb24gY2FsbHMKKyAgICBpbnRvIHRoZSBnZW5lcmljIGludGVyZmFjZSBhcmUgZGlzcGF0Y2hlZCB0byB0aGVpciBjb2RlYy1zcGVjaWZpYworICAgIGltcGxlbWVudGF0aW9ucy4gQXBwbGljYXRpb25zIFxyZWYgTVVTVE5PVCBhdHRlbXB0IHRvIGV4YW1pbmUgb3Igb3ZlcnJpZGUKKyAgICB0aGlzIHN0b3JhZ2UsIGFzIGl0IGNvbnRhaW5zIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbGlrZWx5IHRvCisgICAgY2hhbmdlIGZyb20gcmVsZWFzZSB0byByZWxlYXNlLgorCisgICAgRWFjaCBzdXBwb3J0ZWQgY29kZWMgd2lsbCBleHBvc2UgYW4gaW50ZXJmYWNlIHN0cnVjdHVyZSB0byB0aGUgYXBwbGljYXRpb24KKyAgICBhcyBhbiA8Y29kZT5leHRlcm48L2NvZGU+IHJlZmVyZW5jZSB0byBhIHN0cnVjdHVyZSBvZiB0aGUgaW5jb21wbGV0ZSB0eXBlCisgICAgI3ZweF9jb2RlY19pZmFjZV90LgorCisgICAgXHNlY3Rpb24gdXNhZ2VfZmVhdHVyZXMgRmVhdHVyZXMKKyAgICBTZXZlcmFsICJmZWF0dXJlcyIgYXJlIGRlZmluZWQgdGhhdCBhcmUgb3B0aW9uYWxseSBpbXBsZW1lbnRlZCBieSBjb2RlYworICAgIGFsZ29yaXRobXMuIEluZGVlZCwgdGhlIHNhbWUgYWxnb3JpdGhtIG1heSBzdXBwb3J0IGRpZmZlcmVudCBmZWF0dXJlcyBvbgorICAgIGRpZmZlcmVudCBwbGF0Zm9ybXMuIFRoZSBwdXJwb3NlIG9mIGRlZmluaW5nIHRoZXNlIGZlYXR1cmVzIGlzIHRoYXQgd2hlbgorICAgIHRoZXkgYXJlIGltcGxlbWVudGVkLCB0aGV5IGNvbmZvcm0gdG8gYSBjb21tb24gaW50ZXJmYWNlLiBUaGUgZmVhdHVyZXMsIG9yCisgICAgY2FwYWJpbGl0aWVzLCBvZiBhbiBhbGdvcml0aG0gY2FuIGJlIHF1ZXJpZWQgZnJvbSBpdCdzIGludGVyZmFjZSBieSB1c2luZworICAgIHRoZSB2cHhfY29kZWNfZ2V0X2NhcHMoKSBtZXRob2QuIEF0dGVtcHRzIHRvIGludm9rZSBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkCisgICAgYnkgYW4gYWxnb3JpdGhtIHdpbGwgZ2VuZXJhbGx5IHJlc3VsdCBpbiAjVlBYX0NPREVDX0lOQ0FQQUJMRS4KKworICAgIEN1cnJlbnRseSBkZWZpbmVkIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycyBpbmNsdWRlOgorICAgIC0gXHN1YnBhZ2UgdXNhZ2VfeG1hCisKKyAgICBcaWYgZGVjb2RlcgorICAgIEN1cnJlbnRseSBkZWZpbmVkIGRlY29kZXIgZmVhdHVyZXMgaW5jbHVkZToKKyAgICAtIFxyZWYgdXNhZ2VfY2IKKyAgICAtIFxyZWYgdXNhZ2VfcG9zdHByb2MKKyAgICBcZW5kaWYKKworICAgIFxzZWN0aW9uIHVzYWdlX2luaXQgSW5pdGlhbGl6YXRpb24KKyAgICBUbyBpbml0aWFsaXplIGEgY29kZWMgaW5zdGFuY2UsIHRoZSBhZGRyZXNzIG9mIHRoZSBjb2RlYyBjb250ZXh0CisgICAgYW5kIGludGVyZmFjZSBzdHJ1Y3R1cmVzIGFyZSBwYXNzZWQgdG8gYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIERlcGVuZGluZworICAgIG9uIHRoZSBccmVmIHVzYWdlX2ZlYXR1cmVzIHRoYXQgdGhlIGNvZGVjIHN1cHBvcnRzLCB0aGUgY29kZWMgY291bGQgYmUKKyAgICBpbml0aWFsaXplZCBpbiBkaWZmZXJlbnQgbW9kZXMuIE1vc3Qgbm90YWJseSwgdGhlIGFwcGxpY2F0aW9uIG1heSBjaG9vc2UgdG8KKyAgICB1c2UgXHJlZiB1c2FnZV94bWEgbW9kZSB0byBnYWluIGZpbmUgZ3JhaW5lZCBjb250cm9sIG92ZXIgaG93IGFuZCB3aGVyZQorICAgIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBjb2RlYy4KKworICAgIFRvIHByZXZlbnQgY2FzZXMgb2YgY29uZnVzaW9uIHdoZXJlIHRoZSBBQkkgb2YgdGhlIGxpYnJhcnkgY2hhbmdlcywKKyAgICB0aGUgQUJJIGlzIHZlcnNpb25lZC4gVGhlIEFCSSB2ZXJzaW9uIG51bWJlciBtdXN0IGJlIHBhc3NlZCBhdAorICAgIGluaXRpYWxpemF0aW9uIHRpbWUgdG8gZW5zdXJlIHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBhIGhlYWRlciBmaWxlIHRoYXQKKyAgICBtYXRjaGVzIHRoZSBsaWJyYXJ5LiBUaGUgY3VycmVudCBBQkkgdmVyc2lvbiBudW1iZXIgaXMgc3RvcmVkIGluIHRoZQorICAgIHByZXByb2Nlc3NvciBtYWNyb3MgI1ZQWF9DT0RFQ19BQklfVkVSU0lPTiwgI1ZQWF9FTkNPREVSX0FCSV9WRVJTSU9OLCBhbmQKKyAgICAjVlBYX0RFQ09ERVJfQUJJX1ZFUlNJT04uIEZvciBjb252ZW5pZW5jZSwgZWFjaCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBoYXMKKyAgICBhIHdyYXBwZXIgbWFjcm8gdGhhdCBpbnNlcnRzIHRoZSBjb3JyZWN0IHZlcnNpb24gbnVtYmVyLiBUaGVzZSBtYWNyb3MgYXJlCisgICAgbmFtZWQgbGlrZSB0aGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kcywgYnV0IHdpdGhvdXQgdGhlIF92ZXIgc3VmZml4LgorCisKKyAgICBUaGUgYXZhaWxhYmxlIGluaXRpYWxpemF0aW9uIG1ldGhvZHMgYXJlOgorICAgIFxpZiBlbmNvZGVyIC0gI3ZweF9jb2RlY19lbmNfaW5pdCAoY2FsbHMgdnB4X2NvZGVjX2VuY19pbml0X3ZlcigpKSBcZW5kaWYKKyAgICBcaWYgbXVsdGktZW5jb2RlciAtICN2cHhfY29kZWNfZW5jX2luaXRfbXVsdGkgKGNhbGxzIHZweF9jb2RlY19lbmNfaW5pdF9tdWx0aV92ZXIoKSkgXGVuZGlmCisgICAgXGlmIGRlY29kZXIgLSAjdnB4X2NvZGVjX2RlY19pbml0IChjYWxscyB2cHhfY29kZWNfZGVjX2luaXRfdmVyKCkpIFxlbmRpZgorCisKKworICAgIFxzZWN0aW9uIHVzYWdlX2Vycm9ycyBFcnJvciBIYW5kbGluZworICAgIEFsbW9zdCBhbGwgY29kZWMgZnVuY3Rpb25zIHJldHVybiBhbiBlcnJvciBzdGF0dXMgb2YgdHlwZSAjdnB4X2NvZGVjX2Vycl90LgorICAgIFRoZSBzZW1hbnRpY3Mgb2YgaG93IGVhY2ggZXJyb3IgY29uZGl0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgaXMgY2xlYXJseQorICAgIGRlZmluZWQgaW4gdGhlIGRlZmluaXRpb25zIG9mIGVhY2ggZW51bWVyYXRlZCB2YWx1ZS4gRXJyb3IgdmFsdWVzIGNhbiBiZQorICAgIGNvbnZlcnRlZCBpbnRvIEFTQ0lJIHN0cmluZ3Mgd2l0aCB0aGUgdnB4X2NvZGVjX2Vycm9yKCkgYW5kCisgICAgdnB4X2NvZGVjX2Vycl90b19zdHJpbmcoKSBtZXRob2RzLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIHR3byBtZXRob2RzIGlzCisgICAgdGhhdCB2cHhfY29kZWNfZXJyb3IoKSByZXR1cm5zIHRoZSBlcnJvciBzdGF0ZSBmcm9tIGFuIGluaXRpYWxpemVkIGNvbnRleHQsCisgICAgd2hlcmVhcyB2cHhfY29kZWNfZXJyX3RvX3N0cmluZygpIGNhbiBiZSB1c2VkIGluIGNhc2VzIHdoZXJlIGFuIGVycm9yIG9jY3VycworICAgIG91dHNpZGUgYW55IGNvbnRleHQuIFRoZSBlbnVtZXJhdGVkIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGxhc3QgY2FsbCBjYW4gYmUKKyAgICByZXRyaWV2ZWQgZnJvbSB0aGUgPGNvZGU+ZXJyPC9jb2RlPiBtZW1iZXIgb2YgdGhlIGRlY29kZXIgY29udGV4dCBhcyB3ZWxsLgorICAgIEZpbmFsbHksIG1vcmUgZGV0YWlsZWQgZXJyb3IgaW5mb3JtYXRpb24gbWF5IGJlIGFibGUgdG8gYmUgb2J0YWluZWQgYnkgdXNpbmcKKyAgICB0aGUgdnB4X2NvZGVjX2Vycm9yX2RldGFpbCgpIG1ldGhvZC4gTm90IGFsbCBlcnJvcnMgcHJvZHVjZSBkZXRhaWxlZCBlcnJvcgorICAgIGluZm9ybWF0aW9uLgorCisgICAgSW4gYWRkaXRpb24gdG8gZXJyb3IgaW5mb3JtYXRpb24sIHRoZSBjb2RlYyBsaWJyYXJ5J3MgYnVpbGQgY29uZmlndXJhdGlvbgorICAgIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lIG9uIHNvbWUgcGxhdGZvcm1zLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSByZXR1cm5lZAorICAgIGJ5IGNhbGxpbmcgdnB4X2NvZGVjX2J1aWxkX2NvbmZpZygpLCBhbmQgaXMgZm9ybWF0dGVkIGFzIGEgYmFzZTY0IGNvZGVkIHN0cmluZworICAgIChjb21wcmlzZWQgb2YgY2hhcmFjdGVycyBpbiB0aGUgc2V0IFthLXpfYS1aMC05Ky9dKS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBub3QKKyAgICB1c2VmdWwgdG8gYW4gYXBwbGljYXRpb24gYXQgcnVudGltZSwgYnV0IG1heSBiZSBvZiB1c2UgdG8gdnB4IGZvciBzdXBwb3J0LgorCisKKyAgICBcc2VjdGlvbiB1c2FnZV9kZWFkbGluZSBEZWFkbGluZQorICAgIEJvdGggdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbnMgaGF2ZSBhIDxjb2RlPmRlYWRsaW5lPC9jb2RlPgorICAgIHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWljcm9zZWNvbmRzCisgICAgKHVzKSwgdGhhdCB0aGUgYXBwbGljYXRpb24gd2FudHMgdGhlIGNvZGVjIHRvIHNwZW5kIHByb2Nlc3NpbmcgYmVmb3JlCisgICAgcmV0dXJuaW5nLiBUaGlzIGlzIGEgc29mdCBkZWFkbGluZSAtLSB0aGF0IGlzLCB0aGUgc2VtYW50aWNzIG9mIHRoZQorICAgIHJlcXVlc3RlZCBvcGVyYXRpb24gdGFrZSBwcmVjZWRlbmNlIG92ZXIgbWVldGluZyB0aGUgZGVhZGxpbmUuIElmLCBmb3IKKyAgICBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBzZXRzIGEgPGNvZGU+ZGVhZGxpbmU8L2NvZGU+IG9mIDEwMDB1cywgYW5kIHRoZQorICAgIGZyYW1lIHRha2VzIDIwMDB1cyB0byBkZWNvZGUsIHRoZSBjYWxsIHRvIHZweF9jb2RlY19kZWNvZGUoKSB3aWxsIHJldHVybgorICAgIGFmdGVyIDIwMDB1cy4gSW4gdGhpcyBjYXNlIHRoZSBkZWFkbGluZSBpcyBub3QgbWV0LCBidXQgdGhlIHNlbWFudGljcyBvZiB0aGUKKyAgICBmdW5jdGlvbiBhcmUgcHJlc2VydmVkLiBJZiwgZm9yIHRoZSBzYW1lIGZyYW1lLCBhbiBhcHBsaWNhdGlvbiBpbnN0ZWFkIHNldHMKKyAgICBhIDxjb2RlPmRlYWRsaW5lPC9jb2RlPiBvZiA1MDAwdXMsIHRoZSBkZWNvZGVyIHdpbGwgc2VlIHRoYXQgaXQgaGFzIDMwMDB1cworICAgIHJlbWFpbmluZyBpbiBpdHMgdGltZSBzbGljZSB3aGVuIGRlY29kaW5nIGNvbXBsZXRlcy4gSXQgY291bGQgdGhlbiBjaG9vc2UgdG8KKyAgICBydW4gYSBzZXQgb2YgXHJlZiB1c2FnZV9wb3N0cHJvYyBmaWx0ZXJzLCBhbmQgcGVyaGFwcyB3b3VsZCByZXR1cm4gYWZ0ZXIKKyAgICA0MDAwdXMgKGluc3RlYWQgb2YgdGhlIGFsbG9jYXRlZCA1MDAwdXMpLiBJbiB0aGlzIGNhc2UgdGhlIGRlYWRsaW5lIGlzIG1ldCwKKyAgICBhbmQgdGhlIHNlbWFudGljcyBvZiB0aGUgY2FsbCBhcmUgcHJlc2VydmVkLCBhcyBiZWZvcmUuCisKKyAgICBUaGUgc3BlY2lhbCB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpcyByZXNlcnZlZCB0byByZXByZXNlbnQgYW4gaW5maW5pdGUKKyAgICBkZWFkbGluZS4gSW4gdGhpcyBjYXNlLCB0aGUgY29kZWMgd2lsbCBwZXJmb3JtIGFzIG11Y2ggcHJvY2Vzc2luZyBhcworICAgIHBvc3NpYmxlIHRvIHlpZWxkIHRoZSBoaWdoZXN0IHF1YWxpdHkgZnJhbWUuCisKKyAgICBCeSBjb252ZW50aW9uLCB0aGUgdmFsdWUgPGNvZGU+MTwvY29kZT4gaXMgdXNlZCB0byBtZWFuICJyZXR1cm4gYXMgZmFzdCBhcworICAgIHBvc3NpYmxlLiIKKworKi8KKworCisvKiEgXHBhZ2UgdXNhZ2VfeG1hIEV4dGVybmFsIE1lbW9yeSBBbGxvY2F0aW9uCisgICAgQXBwbGljYXRpb25zIHRoYXQgd2lzaCB0byBoYXZlIGZpbmUgZ3JhaW5lZCBjb250cm9sIG92ZXIgaG93IGFuZCB3aGVyZQorICAgIGRlY29kZXJzIGFsbG9jYXRlIG1lbW9yeSBccmVmIE1BWSBtYWtlIHVzZSBvZiB0aGUgZVh0ZXJuYWwgTWVtb3J5IEFsbG9jYXRpb24KKyAgICAoWE1BKSBpbnRlcmZhY2UuIE5vdCBhbGwgY29kZWNzIHN1cHBvcnQgdGhlIFhNQSBccmVmIHVzYWdlX2ZlYXR1cmVzLgorCisgICAgVG8gdXNlIGEgZGVjb2RlciBpbiBYTUEgbW9kZSwgdGhlIGRlY29kZXIgXHJlZiBNVVNUIGJlIGluaXRpYWxpemVkIHdpdGggdGhlCisgICAgdnB4X2NvZGVjX3htYV9pbml0X3ZlcigpIGZ1bmN0aW9uLiBUaGUgYW1vdW50IG9mIG1lbW9yeSBhIGRlY29kZXIgbmVlZHMgdG8KKyAgICBhbGxvY2F0ZSBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCB2aWRlbyBmcmFtZXMuIFRoZQorICAgIHNpemUgb2YgdGhlIHZpZGVvIG11c3QgYmUga25vd24gYmVmb3JlIHJlcXVlc3RpbmcgdGhlIGRlY29kZXIncyBtZW1vcnkgbWFwLgorICAgIFRoaXMgc3RyZWFtIGluZm9ybWF0aW9uIGNhbiBiZSBvYnRhaW5lZCB3aXRoIHRoZSB2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbygpCisgICAgZnVuY3Rpb24sIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYSBjb25zdHJ1Y3RlZCBkZWNvZGVyIGNvbnRleHQuIElmIHRoZSBleGFjdAorICAgIHN0cmVhbSBpcyBub3Qga25vd24sIGEgc3RyZWFtIGluZm8gc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkIHRoYXQgcmVmbGVjdHMKKyAgICB0aGUgbWF4aW11bSBzaXplIHRoYXQgdGhlIGRlY29kZXIgaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydC4KKworICAgIE9uY2UgdGhlIGRlY29kZXIgaW5zdGFuY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHRoZSBzdHJlYW0gaW5mb3JtYXRpb24KKyAgICBkZXRlcm1pbmVkLCB0aGUgYXBwbGljYXRpb24gY2FsbHMgdGhlIHZweF9jb2RlY19nZXRfbWVtX21hcCgpIGl0ZXJhdG9yCisgICAgcmVwZWF0ZWRseSB0byBnZXQgYSBsaXN0IG9mIHRoZSBtZW1vcnkgc2VnbWVudHMgcmVxdWVzdGVkIGJ5IHRoZSBkZWNvZGVyLgorICAgIFRoZSBpdGVyYXRvciB2YWx1ZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTCB0byByZXF1ZXN0IHRoZSBmaXJzdAorICAgIGVsZW1lbnQsIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gI1ZQWF9DT0RFQ19MSVNUX0VORCB0byBzaWduYWwgdGhlIGVuZCBvZgorICAgIHRoZSBsaXN0LgorCisgICAgQWZ0ZXIgZWFjaCBzZWdtZW50IGlzIGlkZW50aWZpZWQsIGl0IG11c3QgYmUgcGFzc2VkIHRvIHRoZSBjb2RlYyB0aHJvdWdoIHRoZQorICAgIHZweF9jb2RlY19zZXRfbWVtX21hcCgpIGZ1bmN0aW9uLiBTZWdtZW50cyBccmVmIE1VU1QgYmUgcGFzc2VkIGluIHRoZSBzYW1lCisgICAgb3JkZXIgYXMgdGhleSBhcmUgcmV0dXJuZWQgZnJvbSB2cHhfY29kZWNfZ2V0X21lbV9tYXAoKSwgYnV0IHRoZXJlIGlzIG5vCisgICAgcmVxdWlyZW1lbnQgdGhhdCB2cHhfY29kZWNfZ2V0X21lbV9tYXAoKSBtdXN0IGZpbmlzaCBpdGVyYXRpbmcgYmVmb3JlCisgICAgdnB4X2NvZGVjX3NldF9tZW1fbWFwKCkgaXMgY2FsbGVkLiBGb3IgaW5zdGFuY2UsIHNvbWUgYXBwbGljYXRpb25zIG1heSBjaG9vc2UKKyAgICB0byBnZXQgYSBsaXN0IG9mIGFsbCByZXF1ZXN0cywgY29uc3RydWN0IGFuIG9wdGltYWwgaGVhcCwgYW5kIHRoZW4gc2V0IGFsbAorICAgIG1hcHMgYXQgb25jZSB3aXRoIG9uZSBjYWxsLiBPdGhlciBhcHBsaWNhdGlvbnMgbWF5IHNldCBvbmUgbWFwIGF0IGEgdGltZSwKKyAgICBhbGxvY2F0aW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIGl0IGlzIHJldHVybmVkIGZyb20gdnB4X2NvZGVjX2dldF9tZW1fbWFwKCkuCisKKyAgICBBZnRlciBhbGwgc2VnbWVudHMgaGF2ZSBiZWVuIHNldCB1c2luZyB2cHhfY29kZWNfc2V0X21lbV9tYXAoKSwgdGhlIGNvZGVjIG1heQorICAgIGJlIHVzZWQgYXMgaXQgd291bGQgYmUgaW4gbm9ybWFsIGludGVybmFsIGFsbG9jYXRpb24gbW9kZS4KKworICAgIFxzZWN0aW9uIHVzYWdlX3htYV9zZWdfaWQgU2VnbWVudCBJZGVudGlmaWVycworICAgIEVhY2ggcmVxdWVzdGVkIHNlZ21lbnQgaXMgaWRlbnRpZmllZCBieSBhbiBpZGVudGlmaWVyIHVuaXF1ZSB0bworICAgIHRoYXQgZGVjb2RlciB0eXBlLiBTb21lIG9mIHRoZXNlIGlkZW50aWZpZXJzIGFyZSBwcml2YXRlLCB3aGlsZSBvdGhlcnMgYXJlCisgICAgZW51bWVyYXRlZCBmb3IgYXBwbGljYXRpb24gdXNlLiBJZGVudGlmaWVycyBub3QgZW51bWVyYXRlZCBwdWJsaWNseSBhcmUKKyAgICBzdWJqZWN0IHRvIGNoYW5nZS4gSWRlbnRpZmllcnMgYXJlIG5vbi1jb25zZWN1dGl2ZS4KKworICAgIFxzZWN0aW9uIHVzYWdlX3htYV9zZWdfc3phbGlnbiBTZWdtZW50IFNpemUgYW5kIEFsaWdubWVudAorICAgIFRoZSBzeiAoc2l6ZSkgYW5kIGFsaWduIChhbGlnbm1lbnQpIHBhcmFtZXRlcnMgZGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNpemUKKyAgICBhbmQgYWxpZ25tZW50IG9mIHRoZSByZXF1ZXN0ZWQgc2VnbWVudC4gQWxpZ25tZW50IHdpbGwgYWx3YXlzIGJlIGEgcG93ZXIgb2YKKyAgICB0d28uIEFwcGxpY2F0aW9ucyBccmVmIE1VU1QgaG9ub3IgdGhlIGFsaWdubWVudCByZXF1ZXN0ZWQuIEZhaWx1cmUgdG8gZG8gc28KKyAgICBjb3VsZCByZXN1bHQgaW4gcHJvZ3JhbSBjcmFzaGVzIG9yIG1heSBpbmN1ciBhIHNwZWVkIHBlbmFsdHkuCisKKyAgICBcc2VjdGlvbiB1c2FnZV94bWFfc2VnX2ZsYWdzIFNlZ21lbnQgRmxhZ3MKKyAgICBUaGUgZmxhZ3MgbWVtYmVyIG9mIHRoZSBzZWdtZW50IHN0cnVjdHVyZSBpbmRpY2F0ZXMgYW55IHJlcXVpcmVtZW50cyBvcgorICAgIGRlc2lyZXMgb2YgdGhlIGNvZGVjIGZvciB0aGUgcGFydGljdWxhciBzZWdtZW50LiBUaGUgI1ZQWF9DT0RFQ19NRU1fWkVSTyBmbGFnCisgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgXHJlZiBNVVNUIGJlIHplcm9lZCBieSB0aGUgYXBwbGljYXRpb24gcHJpb3IgdG8KKyAgICBwYXNzaW5nIGl0IHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlICNWUFhfQ09ERUNfTUVNX1dST05MWSBmbGFnIGluZGljYXRlcyB0aGF0CisgICAgdGhlIHNlZ21lbnQgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gaW50byBieSB0aGUgZGVjb2Rlciwgbm90IHJlYWQuIElmIHRoaXMgZmxhZworICAgIGlzIG5vdCBzZXQsIHRoZSBhcHBsaWNhdGlvbiBccmVmIE1VU1QgaW5zdXJlIHRoYXQgdGhlIG1lbW9yeSBzZWdtZW50IGlzCisgICAgcmVhZGFibGUuIE9uIHNvbWUgcGxhdGZvcm1zLCBmcmFtZWJ1ZmZlciBtZW1vcnkgaXMgd3JpdGFibGUgYnV0IG5vdAorICAgIHJlYWRhYmxlLCBmb3IgZXhhbXBsZS4gVGhlICNWUFhfQ09ERUNfTUVNX0ZBU1QgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VnbWVudAorICAgIHdpbGwgYmUgZnJlcXVlbnRseSBhY2Nlc3NlZCwgYW5kIHRoYXQgaXQgc2hvdWxkIGJlIHBsYWNlZCBpbnRvIGZhc3QgbWVtb3J5LAorICAgIGlmIGFueSBpcyBhdmFpbGFibGUuIFRoZSBhcHBsaWNhdGlvbiBccmVmIE1BWSBjaG9vc2UgdG8gcGxhY2Ugb3RoZXIgc2VnbWVudHMKKyAgICBpbiBmYXN0IG1lbW9yeSBhcyB3ZWxsLCBidXQgdGhlIG1vc3QgY3JpdGljYWwgc2VnbWVudHMgd2lsbCBiZSBpZGVudGlmaWVkIGJ5CisgICAgdGhpcyBmbGFnLgorCisgICAgXHNlY3Rpb24gdXNhZ2VfeG1hX3NlZ19iYXNlZHRvciBTZWdtZW50IEJhc2UgQWRkcmVzcyBhbmQgRGVzdHJ1Y3RvcgorICAgIEZvciBlYWNoIHJlcXVlc3RlZCBtZW1vcnkgc2VnbWVudCwgdGhlIGFwcGxpY2F0aW9uIG11c3QgZGV0ZXJtaW5lIHRoZQorICAgIGFkZHJlc3Mgb2YgYSBtZW1vcnkgc2VnbWVudCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGNvZGVjLiBUaGlzCisgICAgYWRkcmVzcyBpcyBzZXQgaW4gdGhlIDxjb2RlPmJhc2U8L2NvZGU+IG1lbWJlciBvZiB0aGUgI3ZweF9jb2RlY19tbWFwCisgICAgc3RydWN0dXJlLiBJZiB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgcHJvY2Vzc2luZyB3aGVuIHRoZSBzZWdtZW50IGlzIG5vCisgICAgbG9uZ2VyIHVzZWQgYnkgdGhlIGNvZGVjIChmb3IgaW5zdGFuY2UgdG8gZGVhbGxvY2F0ZSBpdCBvciBjbG9zZSBhbgorICAgIGFzc29jaWF0ZWQgZmlsZSBkZXNjcmlwdG9yKSB0aGUgPGNvZGU+ZHRvcjwvY29kZT4gYW5kIDxjb2RlPnByaXY8L2NvZGU+CisgICAgbWVtYmVycyBjYW4gYmUgc2V0LgorKi8KZGlmZiAtLWdpdCBhL2xpYnZweC91c2FnZV9jeC5kb3ggYi9saWJ2cHgvdXNhZ2VfY3guZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjNlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdXNhZ2VfY3guZG94CkBAIC0wLDAgKzEsMTMgQEAKKy8qISBccGFnZSB1c2FnZV9lbmNvZGUgRW5jb2RlCisKKyAgICBUaGUgdnB4X2NvZGVjX2VuY29kZSgpIGZ1bmN0aW9uIGlzIGF0IHRoZSBjb3JlIG9mIHRoZSBlbmNvZGUgbG9vcC4gSXQKKyAgICBwcm9jZXNzZXMgcmF3IGltYWdlcyBwYXNzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBwcm9kdWNpbmcgcGFja2V0cyBvZgorICAgIGNvbXByZXNzZWQgZGF0YS4gVGhlIDxjb2RlPmRlYWRsaW5lPC9jb2RlPiBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIGFtb3VudAorICAgIG9mIHRpbWUgaW4gbWljcm9zZWNvbmRzIHRoZSBlbmNvZGVyIHNob3VsZCBzcGVuZCB3b3JraW5nIG9uIHRoZSBmcmFtZS4gRm9yCisgICAgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgPGNvZGU+ZGVhZGxpbmU8L2NvZGU+IHBhcmFtZXRlciwgc2VlCisgICAgXHJlZiB1c2FnZV9kZWFkbGluZS4KKworCisgICAgXHJlZiBzYW1wbGVzCisKKyovCmRpZmYgLS1naXQgYS91c2FnZV9keC5kb3ggYi9saWJ2cHgvdXNhZ2VfZHguZG94CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c2FnZV9keC5kb3gKcmVuYW1lIHRvIGxpYnZweC91c2FnZV9keC5kb3gKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FsbG9jY29tbW9uLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjllOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJibG9ja2QuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJvbnl4Y19pbnQuaCIKKyNpbmNsdWRlICJmaW5kbmVhcm12LmgiCisjaW5jbHVkZSAiZW50cm9weW1vZGUuaCIKKyNpbmNsdWRlICJzeXN0ZW1kZXBlbmRlbnQuaCIKKwordm9pZCB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycyhWUDhfQ09NTU9OICpvY2kpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ZVjEyX0JVRkZFUlM7IGkrKykKKyAgICAgICAgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKCZvY2ktPnl2MTJfZmJbaV0pOworCisgICAgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKCZvY2ktPnRlbXBfc2NhbGVfZnJhbWUpOworI2lmIENPTkZJR19QT1NUUFJPQworICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmb2NpLT5wb3N0X3Byb2NfYnVmZmVyKTsKKyAgICBpZiAob2NpLT5wb3N0X3Byb2NfYnVmZmVyX2ludF91c2VkKQorICAgICAgICB2cDhfeXYxMl9kZV9hbGxvY19mcmFtZV9idWZmZXIoJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcl9pbnQpOworCisgICAgdnB4X2ZyZWUob2NpLT5wcF9saW1pdHNfYnVmZmVyKTsKKyAgICBvY2ktPnBwX2xpbWl0c19idWZmZXIgPSBOVUxMOworI2VuZGlmCisKKyAgICB2cHhfZnJlZShvY2ktPmFib3ZlX2NvbnRleHQpOworICAgIHZweF9mcmVlKG9jaS0+bWlwKTsKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICB2cHhfZnJlZShvY2ktPnByZXZfbWlwKTsKKyAgICBvY2ktPnByZXZfbWlwID0gTlVMTDsKKyNlbmRpZgorCisgICAgb2NpLT5hYm92ZV9jb250ZXh0ID0gTlVMTDsKKyAgICBvY2ktPm1pcCA9IE5VTEw7Cit9CisKK2ludCB2cDhfYWxsb2NfZnJhbWVfYnVmZmVycyhWUDhfQ09NTU9OICpvY2ksIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaTsKKworICAgIHZwOF9kZV9hbGxvY19mcmFtZV9idWZmZXJzKG9jaSk7CisKKyAgICAvKiBvdXIgaW50ZXJuYWwgYnVmZmVycyBhcmUgYWx3YXlzIG11bHRpcGxlcyBvZiAxNiAqLworICAgIGlmICgod2lkdGggJiAweGYpICE9IDApCisgICAgICAgIHdpZHRoICs9IDE2IC0gKHdpZHRoICYgMHhmKTsKKworICAgIGlmICgoaGVpZ2h0ICYgMHhmKSAhPSAwKQorICAgICAgICBoZWlnaHQgKz0gMTYgLSAoaGVpZ2h0ICYgMHhmKTsKKworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ZVjEyX0JVRkZFUlM7IGkrKykKKyAgICB7CisgICAgICAgIG9jaS0+ZmJfaWR4X3JlZl9jbnRbaV0gPSAwOworICAgICAgICBvY2ktPnl2MTJfZmJbaV0uZmxhZ3MgPSAwOworICAgICAgICBpZiAodnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKCZvY2ktPnl2MTJfZmJbaV0sIHdpZHRoLCBoZWlnaHQsIFZQOEJPUkRFUklOUElYRUxTKSA8IDApCisgICAgICAgICAgICBnb3RvIGFsbG9jYXRpb25fZmFpbDsKKyAgICB9CisKKyAgICBvY2ktPm5ld19mYl9pZHggPSAwOworICAgIG9jaS0+bHN0X2ZiX2lkeCA9IDE7CisgICAgb2NpLT5nbGRfZmJfaWR4ID0gMjsKKyAgICBvY2ktPmFsdF9mYl9pZHggPSAzOworCisgICAgb2NpLT5mYl9pZHhfcmVmX2NudFswXSA9IDE7CisgICAgb2NpLT5mYl9pZHhfcmVmX2NudFsxXSA9IDE7CisgICAgb2NpLT5mYl9pZHhfcmVmX2NudFsyXSA9IDE7CisgICAgb2NpLT5mYl9pZHhfcmVmX2NudFszXSA9IDE7CisKKyAgICBpZiAodnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKCZvY2ktPnRlbXBfc2NhbGVfZnJhbWUsICAgd2lkdGgsIDE2LCBWUDhCT1JERVJJTlBJWEVMUykgPCAwKQorICAgICAgICBnb3RvIGFsbG9jYXRpb25fZmFpbDsKKworICAgIG9jaS0+bWJfcm93cyA9IGhlaWdodCA+PiA0OworICAgIG9jaS0+bWJfY29scyA9IHdpZHRoID4+IDQ7CisgICAgb2NpLT5NQnMgPSBvY2ktPm1iX3Jvd3MgKiBvY2ktPm1iX2NvbHM7CisgICAgb2NpLT5tb2RlX2luZm9fc3RyaWRlID0gb2NpLT5tYl9jb2xzICsgMTsKKyAgICBvY2ktPm1pcCA9IHZweF9jYWxsb2MoKG9jaS0+bWJfY29scyArIDEpICogKG9jaS0+bWJfcm93cyArIDEpLCBzaXplb2YoTU9ERV9JTkZPKSk7CisKKyAgICBpZiAoIW9jaS0+bWlwKQorICAgICAgICBnb3RvIGFsbG9jYXRpb25fZmFpbDsKKworICAgIG9jaS0+bWkgPSBvY2ktPm1pcCArIG9jaS0+bW9kZV9pbmZvX3N0cmlkZSArIDE7CisKKyAgICAvKiBBbGxvY2F0aW9uIG9mIHByZXZpb3VzIG1vZGUgaW5mbyB3aWxsIGJlIGRvbmUgaW4gdnA4X2RlY29kZV9mcmFtZSgpCisgICAgICogYXMgaXQgaXMgYSBkZWNvZGVyIG9ubHkgZGF0YSAqLworCisgICAgb2NpLT5hYm92ZV9jb250ZXh0ID0gdnB4X2NhbGxvYyhzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykgKiBvY2ktPm1iX2NvbHMsIDEpOworCisgICAgaWYgKCFvY2ktPmFib3ZlX2NvbnRleHQpCisgICAgICAgIGdvdG8gYWxsb2NhdGlvbl9mYWlsOworCisjaWYgQ09ORklHX1BPU1RQUk9DCisgICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmb2NpLT5wb3N0X3Byb2NfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBWUDhCT1JERVJJTlBJWEVMUykgPCAwKQorICAgICAgICBnb3RvIGFsbG9jYXRpb25fZmFpbDsKKworICAgIG9jaS0+cG9zdF9wcm9jX2J1ZmZlcl9pbnRfdXNlZCA9IDA7CisgICAgdnB4X21lbXNldCgmb2NpLT5wb3N0cHJvY19zdGF0ZSwgMCwgc2l6ZW9mKG9jaS0+cG9zdHByb2Nfc3RhdGUpKTsKKyAgICB2cHhfbWVtc2V0KG9jaS0+cG9zdF9wcm9jX2J1ZmZlci5idWZmZXJfYWxsb2MsIDEyOCwKKyAgICAgICAgICAgICAgIG9jaS0+cG9zdF9wcm9jX2J1ZmZlci5mcmFtZV9zaXplKTsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciB0byBzdG9yZSBwb3N0LXByb2Nlc3NpbmcgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAgICAgKgorICAgICAqIE5vdGU6IFJvdW5kIHVwIG1iX2NvbHMgdG8gc3VwcG9ydCBTSU1EIHJlYWRzCisgICAgICovCisgICAgb2NpLT5wcF9saW1pdHNfYnVmZmVyID0gdnB4X21lbWFsaWduKDE2LCAyNCAqICgob2NpLT5tYl9jb2xzICsgMSkgJiB+MSkpOworICAgIGlmICghb2NpLT5wcF9saW1pdHNfYnVmZmVyKQorICAgICAgICBnb3RvIGFsbG9jYXRpb25fZmFpbDsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7CisKK2FsbG9jYXRpb25fZmFpbDoKKyAgICB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycyhvY2kpOworICAgIHJldHVybiAxOworfQorCit2b2lkIHZwOF9zZXR1cF92ZXJzaW9uKFZQOF9DT01NT04gKmNtKQoreworICAgIHN3aXRjaCAoY20tPnZlcnNpb24pCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgY20tPm5vX2xwZiA9IDA7CisgICAgICAgIGNtLT5maWx0ZXJfdHlwZSA9IE5PUk1BTF9MT09QRklMVEVSOworICAgICAgICBjbS0+dXNlX2JpbGluZWFyX21jX2ZpbHRlciA9IDA7CisgICAgICAgIGNtLT5mdWxsX3BpeGVsID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBjbS0+bm9fbHBmID0gMDsKKyAgICAgICAgY20tPmZpbHRlcl90eXBlID0gU0lNUExFX0xPT1BGSUxURVI7CisgICAgICAgIGNtLT51c2VfYmlsaW5lYXJfbWNfZmlsdGVyID0gMTsKKyAgICAgICAgY20tPmZ1bGxfcGl4ZWwgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGNtLT5ub19scGYgPSAxOworICAgICAgICBjbS0+ZmlsdGVyX3R5cGUgPSBOT1JNQUxfTE9PUEZJTFRFUjsKKyAgICAgICAgY20tPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIgPSAxOworICAgICAgICBjbS0+ZnVsbF9waXhlbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgY20tPm5vX2xwZiA9IDE7CisgICAgICAgIGNtLT5maWx0ZXJfdHlwZSA9IFNJTVBMRV9MT09QRklMVEVSOworICAgICAgICBjbS0+dXNlX2JpbGluZWFyX21jX2ZpbHRlciA9IDE7CisgICAgICAgIGNtLT5mdWxsX3BpeGVsID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyo0LDUsNiw3IGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSovCisgICAgICAgIGNtLT5ub19scGYgPSAwOworICAgICAgICBjbS0+ZmlsdGVyX3R5cGUgPSBOT1JNQUxfTE9PUEZJTFRFUjsKKyAgICAgICAgY20tPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIgPSAwOworICAgICAgICBjbS0+ZnVsbF9waXhlbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KK3ZvaWQgdnA4X2NyZWF0ZV9jb21tb24oVlA4X0NPTU1PTiAqb2NpKQoreworICAgIHZwOF9tYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhvY2kpOworCisgICAgdnA4X2luaXRfbWJtb2RlX3Byb2JzKG9jaSk7CisgICAgdnA4X2RlZmF1bHRfYm1vZGVfcHJvYnMob2NpLT5mYy5ibW9kZV9wcm9iKTsKKworICAgIG9jaS0+bWJfbm9fY29lZmZfc2tpcCA9IDE7CisgICAgb2NpLT5ub19scGYgPSAwOworICAgIG9jaS0+ZmlsdGVyX3R5cGUgPSBOT1JNQUxfTE9PUEZJTFRFUjsKKyAgICBvY2ktPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIgPSAwOworICAgIG9jaS0+ZnVsbF9waXhlbCA9IDA7CisgICAgb2NpLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24gPSBPTkVfUEFSVElUSU9OOworICAgIG9jaS0+Y2xyX3R5cGUgPSBSRUdfWVVWOworICAgIG9jaS0+Y2xhbXBfdHlwZSA9IFJFQ09OX0NMQU1QX1JFUVVJUkVEOworCisgICAgLyogSW5pdGlhbGl6ZSByZWZlcmVuY2UgZnJhbWUgc2lnbiBiaWFzIHN0cnVjdHVyZSB0byBkZWZhdWx0cyAqLworICAgIHZweF9tZW1zZXQob2NpLT5yZWZfZnJhbWVfc2lnbl9iaWFzLCAwLCBzaXplb2Yob2NpLT5yZWZfZnJhbWVfc2lnbl9iaWFzKSk7CisKKyAgICAvKiBEZWZhdWx0IGRpc2FibGUgYnVmZmVyIHRvIGJ1ZmZlciBjb3B5aW5nICovCisgICAgb2NpLT5jb3B5X2J1ZmZlcl90b19nZiA9IDA7CisgICAgb2NpLT5jb3B5X2J1ZmZlcl90b19hcmYgPSAwOworfQorCit2b2lkIHZwOF9yZW1vdmVfY29tbW9uKFZQOF9DT01NT04gKm9jaSkKK3sKKyAgICB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycyhvY2kpOworfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIGIvbGlidnB4L3ZwOC9jb21tb24vYWxsb2Njb21tb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvYmlsaW5lYXJmaWx0ZXJfdjYuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2JpbGluZWFyZmlsdGVyX3Y2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzA0YjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2JpbGluZWFyZmlsdGVyX3Y2LmFzbQpAQCAtMCwwICsxLDIzNyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzc19hcm12NnwKKyAgICBFWFBPUlQgIHx2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzX2FybXY2fAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgcjEgICAgdW5zaWduZWQgc2hvcnQgKmRzdF9wdHIsCis7IHIyICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl0Y2gsCis7IHIzICAgIHVuc2lnbmVkIGludCAgICBoZWlnaHQsCis7IHN0YWNrIHVuc2lnbmVkIGludCAgICB3aWR0aCwKKzsgc3RhY2sgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFRoZSBvdXRwdXQgaXMgdHJhbnNwb3NlZCBzdHJvZWQgaW4gb3V0cHV0IGFycmF5IHRvIG1ha2UgaXQgZWFzeSBmb3Igc2Vjb25kIHBhc3MgZmlsdGVyaW5nLgorfHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzc19hcm12NnwgUFJPQworICAgIHN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQorCisgICAgbGRyICAgICByMTEsIFtzcCwgIzQwXSAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciBhZGRyZXNzCisgICAgbGRyICAgICByNCwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgIDsgd2lkdGgKKworICAgIG1vdiAgICAgcjEyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICA7IG91dGVyLWxvb3AgY291bnRlcgorCisgICAgYWRkICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBuZXh0IHJvdworICAgIHBsZCAgICAgW3IwLCByN10KKworICAgIHN1YiAgICAgcjIsIHIyLCByNCAgICAgICAgICAgICAgICAgICAgICA7IHNyYyBpbmNyZW1lbnQgZm9yIGhlaWdodCBsb29wCisKKyAgICBsZHIgICAgIHI1LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIGZpbHRlciBjb2VmZmljaWVudHMKKworICAgIG1vdiAgICAgcjMsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICA7IGhlaWdodCoyCisgICAgYWRkICAgICByMywgcjMsICMyICAgICAgICAgICAgICAgICAgICAgIDsgcGx1cyAyIHRvIG1ha2Ugb3V0cHV0IGJ1ZmZlciA0LWJpdCBhbGlnbmVkIHNpbmNlIGhlaWdodCBpcyBhY3R1YWxseSAoaGVpZ2h0KzEpCisKKyAgICBtb3YgICAgIHIxMSwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGRzdF9wdHIgZm9yIGVhY2ggcm93CisKKyAgICBjbXAgICAgIHI1LCAjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgOyBpZiBmaWx0ZXIgY29lZiA9IDEyOCwgdGhlbiBza2lwIHRoZSBmaWx0ZXIKKyAgICBiZXEgICAgIGJpbF9udWxsXzFzdF9maWx0ZXIKKworfGJpbF9oZWlnaHRfbG9vcF8xc3RfdjZ8CisgICAgbGRyYiAgICByNiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQorICAgIGxkcmIgICAgcjcsIFtyMCwgIzFdCisgICAgbGRyYiAgICByOCwgW3IwLCAjMl0KKyAgICBtb3YgICAgIGxyLCByNCwgbHNyICMyICAgICAgICAgICAgICAgICAgOyA0LWluLXBhcmVsbGVsIGxvb3AgY291bnRlcgorCit8YmlsX3dpZHRoX2xvb3BfMXN0X3Y2fAorICAgIGxkcmIgICAgcjksIFtyMCwgIzNdCisgICAgbGRyYiAgICByMTAsIFtyMCwgIzRdCisKKyAgICBwa2hidCAgIHI2LCByNiwgcjcsIGxzbCAjMTYgICAgICAgICAgICAgOyBzcmNbMV0gfCBzcmNbMF0KKyAgICBwa2hidCAgIHI3LCByNywgcjgsIGxzbCAjMTYgICAgICAgICAgICAgOyBzcmNbMl0gfCBzcmNbMV0KKworICAgIHNtdWFkICAgcjYsIHI2LCByNSAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IHRoZSBmaWx0ZXIKKyAgICBwa2hidCAgIHI4LCByOCwgcjksIGxzbCAjMTYgICAgICAgICAgICAgOyBzcmNbM10gfCBzcmNbMl0KKyAgICBzbXVhZCAgIHI3LCByNywgcjUKKyAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyBzcmNbNF0gfCBzcmNbM10KKworICAgIHNtdWFkICAgcjgsIHI4LCByNQorICAgIHNtdWFkICAgcjksIHI5LCByNQorCisgICAgYWRkICAgICByMCwgcjAsICM0CisgICAgc3VicyAgICBsciwgbHIsICMxCisKKyAgICBhZGQgICAgIHI2LCByNiwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKKyAgICBhZGQgICAgIHI3LCByNywgIzB4NDAKKyAgICB1c2F0ICAgIHI2LCAjMTYsIHI2LCBhc3IgIzcKKyAgICB1c2F0ICAgIHI3LCAjMTYsIHI3LCBhc3IgIzcKKworICAgIHN0cmggICAgcjYsIFtyMV0sIHIzICAgICAgICAgICAgICAgICAgICA7IHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGFuZCBzdG9yZWQKKworICAgIGFkZCAgICAgcjgsIHI4LCAjMHg0MCAgICAgICAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAorICAgIHN0cmggICAgcjcsIFtyMV0sIHIzCisgICAgYWRkICAgICByOSwgcjksICMweDQwCisgICAgdXNhdCAgICByOCwgIzE2LCByOCwgYXNyICM3CisgICAgdXNhdCAgICByOSwgIzE2LCByOSwgYXNyICM3CisKKyAgICBzdHJoICAgIHI4LCBbcjFdLCByMyAgICAgICAgICAgICAgICAgICAgOyByZXN1bHQgaXMgdHJhbnNwb3NlZCBhbmQgc3RvcmVkCisKKyAgICBsZHJuZWIgIHI2LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHNvdXJjZSBkYXRhCisgICAgc3RyaCAgICByOSwgW3IxXSwgcjMKKworICAgIGxkcm5lYiAgcjcsIFtyMCwgIzFdCisgICAgbGRybmViICByOCwgW3IwLCAjMl0KKworICAgIGJuZSAgICAgYmlsX3dpZHRoX2xvb3BfMXN0X3Y2CisKKyAgICBhZGQgICAgIHIwLCByMCwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIG5leHQgaW5wdXQgcm93CisgICAgc3VicyAgICByMTIsIHIxMiwgIzEKKworICAgIGFkZCAgICAgcjksIHIyLCByNCwgbHNsICMxICAgICAgICAgICAgICA7IGFkZGluZyBiYWNrIGJsb2NrIHdpZHRoCisgICAgcGxkICAgICBbcjAsIHI5XSAgICAgICAgICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBuZXh0IHJvdworCisgICAgYWRkICAgICByMTEsIHIxMSwgIzIgICAgICAgICAgICAgICAgICAgIDsgbW92ZSBvdmVyIHRvIG5leHQgY29sdW1uCisgICAgbW92ICAgICByMSwgcjExCisKKyAgICBibmUgICAgIGJpbF9oZWlnaHRfbG9vcF8xc3RfdjYKKworICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCit8YmlsX251bGxfMXN0X2ZpbHRlcnwKK3xiaWxfaGVpZ2h0X2xvb3BfbnVsbF8xc3R8CisgICAgbW92ICAgICBsciwgcjQsIGxzciAjMiAgICAgICAgICAgICAgICAgIDsgbG9vcCBjb3VudGVyCisKK3xiaWxfd2lkdGhfbG9vcF9udWxsXzFzdHwKKyAgICBsZHJiICAgIHI2LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEKKyAgICBsZHJiICAgIHI3LCBbcjAsICMxXQorICAgIGxkcmIgICAgcjgsIFtyMCwgIzJdCisgICAgbGRyYiAgICByOSwgW3IwLCAjM10KKworICAgIHN0cmggICAgcjYsIFtyMV0sIHIzICAgICAgICAgICAgICAgICAgICA7IHN0b3JlIGl0IHRvIGltbWVkaWF0ZSBidWZmZXIKKyAgICBhZGQgICAgIHIwLCByMCwgIzQKKyAgICBzdHJoICAgIHI3LCBbcjFdLCByMworICAgIHN1YnMgICAgbHIsIGxyLCAjMQorICAgIHN0cmggICAgcjgsIFtyMV0sIHIzCisgICAgc3RyaCAgICByOSwgW3IxXSwgcjMKKworICAgIGJuZSAgICAgYmlsX3dpZHRoX2xvb3BfbnVsbF8xc3QKKworICAgIHN1YnMgICAgcjEyLCByMTIsICMxCisgICAgYWRkICAgICByMCwgcjAsIHIyICAgICAgICAgICAgICAgICAgICAgIDsgbW92ZSB0byBuZXh0IGlucHV0IGxpbmUKKyAgICBhZGQgICAgIHIxMSwgcjExLCAjMiAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIG92ZXIgdG8gbmV4dCBjb2x1bW4KKyAgICBtb3YgICAgIHIxLCByMTEKKworICAgIGJuZSAgICAgYmlsX2hlaWdodF9sb29wX251bGxfMXN0CisKKyAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KKworICAgIEVORFAgIDsgfHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzc19hcm12NnwKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHIwICAgIHVuc2lnbmVkIHNob3J0ICpzcmNfcHRyLAorOyByMSAgICB1bnNpZ25lZCBjaGFyICAqZHN0X3B0ciwKKzsgcjIgICAgaW50ICAgICAgICAgICAgIGRzdF9waXRjaCwKKzsgcjMgICAgdW5zaWduZWQgaW50ICAgIGhlaWdodCwKKzsgc3RhY2sgdW5zaWduZWQgaW50ICAgIHdpZHRoLAorOyBzdGFjayBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3NfYXJtdjZ8IFBST0MKKyAgICBzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KKworICAgIGxkciAgICAgcjExLCBbc3AsICM0MF0gICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgYWRkcmVzcworICAgIGxkciAgICAgcjQsIFtzcCwgIzM2XSAgICAgICAgICAgICAgICAgICA7IHdpZHRoCisKKyAgICBsZHIgICAgIHI1LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBtb3YgICAgIHIxMiwgcjQgICAgICAgICAgICAgICAgICAgICAgICAgOyBvdXRlci1sb29wIGNvdW50ZXIgPSB3aWR0aCwgc2luY2Ugd2Ugd29yayBvbiB0cmFuc3Bvc2VkIGRhdGEgbWF0cml4CisgICAgbW92ICAgICByMTEsIHIxCisKKyAgICBjbXAgICAgIHI1LCAjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgOyBpZiBmaWx0ZXIgY29lZiA9IDEyOCwgdGhlbiBza2lwIHRoZSBmaWx0ZXIKKyAgICBiZXEgICAgIGJpbF9udWxsXzJuZF9maWx0ZXIKKworfGJpbF9oZWlnaHRfbG9vcF8ybmR8CisgICAgbGRyICAgICByNiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCB0aGUgZGF0YQorICAgIGxkciAgICAgcjgsIFtyMCwgIzRdCisgICAgbGRyaCAgICByMTAsIFtyMCwgIzhdCisgICAgbW92ICAgICBsciwgcjMsIGxzciAjMiAgICAgICAgICAgICAgICAgIDsgbG9vcCBjb3VudGVyCisKK3xiaWxfd2lkdGhfbG9vcF8ybmR8CisgICAgcGtodGIgICByNywgcjYsIHI4ICAgICAgICAgICAgICAgICAgICAgIDsgc3JjWzFdIHwgc3JjWzJdCisgICAgcGtodGIgICByOSwgcjgsIHIxMCAgICAgICAgICAgICAgICAgICAgIDsgc3JjWzNdIHwgc3JjWzRdCisKKyAgICBzbXVhZCAgIHI2LCByNiwgcjUgICAgICAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKKyAgICBzbXVhZCAgIHI4LCByOCwgcjUgICAgICAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKKworICAgIHN1YnMgICAgbHIsIGxyLCAjMQorCisgICAgc211YWR4ICByNywgcjcsIHI1ICAgICAgICAgICAgICAgICAgICAgIDsgYXBwbHkgZmlsdGVyCisgICAgc211YWR4ICByOSwgcjksIHI1ICAgICAgICAgICAgICAgICAgICAgIDsgYXBwbHkgZmlsdGVyCisKKyAgICBhZGQgICAgIHIwLCByMCwgIzgKKworICAgIGFkZCAgICAgcjYsIHI2LCAjMHg0MCAgICAgICAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAorICAgIGFkZCAgICAgcjcsIHI3LCAjMHg0MAorICAgIHVzYXQgICAgcjYsICM4LCByNiwgYXNyICM3CisgICAgdXNhdCAgICByNywgIzgsIHI3LCBhc3IgIzcKKyAgICBzdHJiICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgICAgICAgICAgOyB0aGUgcmVzdWx0IGlzIHRyYW5zcG9zZWQgYmFjayBhbmQgc3RvcmVkCisKKyAgICBhZGQgICAgIHI4LCByOCwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKKyAgICBzdHJiICAgIHI3LCBbcjFdLCByMgorICAgIGFkZCAgICAgcjksIHI5LCAjMHg0MAorICAgIHVzYXQgICAgcjgsICM4LCByOCwgYXNyICM3CisgICAgdXNhdCAgICByOSwgIzgsIHI5LCBhc3IgIzcKKyAgICBzdHJiICAgIHI4LCBbcjFdLCByMiAgICAgICAgICAgICAgICAgICAgOyB0aGUgcmVzdWx0IGlzIHRyYW5zcG9zZWQgYmFjayBhbmQgc3RvcmVkCisKKyAgICBsZHJuZSAgIHI2LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEKKyAgICBzdHJiICAgIHI5LCBbcjFdLCByMgorICAgIGxkcm5lICAgcjgsIFtyMCwgIzRdCisgICAgbGRybmVoICByMTAsIFtyMCwgIzhdCisKKyAgICBibmUgICAgIGJpbF93aWR0aF9sb29wXzJuZAorCisgICAgc3VicyAgICByMTIsIHIxMiwgIzEKKyAgICBhZGQgICAgIHIwLCByMCwgIzQgICAgICAgICAgICAgICAgICAgICAgOyB1cGRhdGUgc3JjIGZvciBuZXh0IHJvdworICAgIGFkZCAgICAgcjExLCByMTEsICMxCisgICAgbW92ICAgICByMSwgcjExCisKKyAgICBibmUgICAgIGJpbF9oZWlnaHRfbG9vcF8ybmQKKyAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KKworfGJpbF9udWxsXzJuZF9maWx0ZXJ8Cit8YmlsX2hlaWdodF9sb29wX251bGxfMm5kfAorICAgIG1vdiAgICAgbHIsIHIzLCBsc3IgIzIKKworfGJpbF93aWR0aF9sb29wX251bGxfMm5kfAorICAgIGxkciAgICAgcjYsIFtyMF0sICM0ICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQorICAgIHN1YnMgICAgbHIsIGxyLCAjMQorICAgIGxkciAgICAgcjgsIFtyMF0sICM0CisKKyAgICBzdHJiICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgICAgICAgICAgOyBzdG9yZSBkYXRhCisgICAgbW92ICAgICByNywgcjYsIGxzciAjMTYKKyAgICBzdHJiICAgIHI3LCBbcjFdLCByMgorICAgIG1vdiAgICAgcjksIHI4LCBsc3IgIzE2CisgICAgc3RyYiAgICByOCwgW3IxXSwgcjIKKyAgICBzdHJiICAgIHI5LCBbcjFdLCByMgorCisgICAgYm5lICAgICBiaWxfd2lkdGhfbG9vcF9udWxsXzJuZAorCisgICAgc3VicyAgICByMTIsIHIxMiwgIzEKKyAgICBhZGQgICAgIHIwLCByMCwgIzQKKyAgICBhZGQgICAgIHIxMSwgcjExLCAjMQorICAgIG1vdiAgICAgcjEsIHIxMQorCisgICAgYm5lICAgICBiaWxfaGVpZ2h0X2xvb3BfbnVsbF8ybmQKKworICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorICAgIEVORFAgIDsgfHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NnwKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW0xNngxNl92Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTE2eDE2X3Y2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYwNDhjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW0xNngxNl92Ni5hc20KQEAgLTAsMCArMSwxODYgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfY29weV9tZW0xNngxNl92NnwKKyAgICA7IEFSTQorICAgIDsgUkVRVUlSRTgKKyAgICA7IFBSRVNFUlZFOAorCisgICAgQVJFQSAgICBCbG9jaywgQ09ERSwgUkVBRE9OTFkgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQorO3ZvaWQgY29weV9tZW0xNngxNl92NiggdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSkKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KK3x2cDhfY29weV9tZW0xNngxNl92NnwgUFJPQworICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjd9CisgICAgO3B1c2ggICB7cjQtcjd9CisKKyAgICA7cHJlbG9hZAorICAgIHBsZCAgICAgW3IwLCAjMzFdICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBmb3IgbmV4dCAxNngxNiBibG9jaworCisgICAgYW5kcyAgICByNCwgcjAsICMxNQorICAgIGJlcSAgICAgY29weV9tZW0xNngxNl9mYXN0CisKKyAgICBhbmRzICAgIHI0LCByMCwgIzcKKyAgICBiZXEgICAgIGNvcHlfbWVtMTZ4MTZfOAorCisgICAgYW5kcyAgICByNCwgcjAsICMzCisgICAgYmVxICAgICBjb3B5X21lbTE2eDE2XzQKKworICAgIDtjb3B5IG9uZSBieXRlIGVhY2ggdGltZQorICAgIGxkcmIgICAgcjQsIFtyMF0KKyAgICBsZHJiICAgIHI1LCBbcjAsICMxXQorICAgIGxkcmIgICAgcjYsIFtyMCwgIzJdCisgICAgbGRyYiAgICByNywgW3IwLCAjM10KKworICAgIG1vdiAgICAgcjEyLCAjMTYKKworY29weV9tZW0xNngxNl8xX2xvb3AKKyAgICBzdHJiICAgIHI0LCBbcjJdCisgICAgc3RyYiAgICByNSwgW3IyLCAjMV0KKyAgICBzdHJiICAgIHI2LCBbcjIsICMyXQorICAgIHN0cmIgICAgcjcsIFtyMiwgIzNdCisKKyAgICBsZHJiICAgIHI0LCBbcjAsICM0XQorICAgIGxkcmIgICAgcjUsIFtyMCwgIzVdCisgICAgbGRyYiAgICByNiwgW3IwLCAjNl0KKyAgICBsZHJiICAgIHI3LCBbcjAsICM3XQorCisgICAgc3VicyAgICByMTIsIHIxMiwgIzEKKworICAgIHN0cmIgICAgcjQsIFtyMiwgIzRdCisgICAgc3RyYiAgICByNSwgW3IyLCAjNV0KKyAgICBzdHJiICAgIHI2LCBbcjIsICM2XQorICAgIHN0cmIgICAgcjcsIFtyMiwgIzddCisKKyAgICBsZHJiICAgIHI0LCBbcjAsICM4XQorICAgIGxkcmIgICAgcjUsIFtyMCwgIzldCisgICAgbGRyYiAgICByNiwgW3IwLCAjMTBdCisgICAgbGRyYiAgICByNywgW3IwLCAjMTFdCisKKyAgICBzdHJiICAgIHI0LCBbcjIsICM4XQorICAgIHN0cmIgICAgcjUsIFtyMiwgIzldCisgICAgc3RyYiAgICByNiwgW3IyLCAjMTBdCisgICAgc3RyYiAgICByNywgW3IyLCAjMTFdCisKKyAgICBsZHJiICAgIHI0LCBbcjAsICMxMl0KKyAgICBsZHJiICAgIHI1LCBbcjAsICMxM10KKyAgICBsZHJiICAgIHI2LCBbcjAsICMxNF0KKyAgICBsZHJiICAgIHI3LCBbcjAsICMxNV0KKworICAgIGFkZCAgICAgcjAsIHIwLCByMQorCisgICAgc3RyYiAgICByNCwgW3IyLCAjMTJdCisgICAgc3RyYiAgICByNSwgW3IyLCAjMTNdCisgICAgc3RyYiAgICByNiwgW3IyLCAjMTRdCisgICAgc3RyYiAgICByNywgW3IyLCAjMTVdCisKKyAgICBhZGQgICAgIHIyLCByMiwgcjMKKworICAgIGxkcm5lYiAgcjQsIFtyMF0KKyAgICBsZHJuZWIgIHI1LCBbcjAsICMxXQorICAgIGxkcm5lYiAgcjYsIFtyMCwgIzJdCisgICAgbGRybmViICByNywgW3IwLCAjM10KKworICAgIHBsZCAgICAgW3IwLCAjMzFdICAgICAgICAgICAgICAgOyBwcmVsb2FkIGZvciBuZXh0IDE2eDE2IGJsb2NrCisKKyAgICBibmUgICAgIGNvcHlfbWVtMTZ4MTZfMV9sb29wCisKKyAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQorICAgIDtwb3AgICAgICAgIHtyNC1yN30KKyAgICBtb3YgICAgIHBjLCBscgorCis7Y29weSA0IGJ5dGVzIGVhY2ggdGltZQorY29weV9tZW0xNngxNl80CisgICAgbGRyICAgICByNCwgW3IwXQorICAgIGxkciAgICAgcjUsIFtyMCwgIzRdCisgICAgbGRyICAgICByNiwgW3IwLCAjOF0KKyAgICBsZHIgICAgIHI3LCBbcjAsICMxMl0KKworICAgIG1vdiAgICAgcjEyLCAjMTYKKworY29weV9tZW0xNngxNl80X2xvb3AKKyAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQorICAgIGFkZCAgICAgcjAsIHIwLCByMQorCisgICAgc3RyICAgICByNCwgW3IyXQorICAgIHN0ciAgICAgcjUsIFtyMiwgIzRdCisgICAgc3RyICAgICByNiwgW3IyLCAjOF0KKyAgICBzdHIgICAgIHI3LCBbcjIsICMxMl0KKworICAgIGFkZCAgICAgcjIsIHIyLCByMworCisgICAgbGRybmUgICByNCwgW3IwXQorICAgIGxkcm5lICAgcjUsIFtyMCwgIzRdCisgICAgbGRybmUgICByNiwgW3IwLCAjOF0KKyAgICBsZHJuZSAgIHI3LCBbcjAsICMxMl0KKworICAgIHBsZCAgICAgW3IwLCAjMzFdICAgICAgICAgICAgICAgOyBwcmVsb2FkIGZvciBuZXh0IDE2eDE2IGJsb2NrCisKKyAgICBibmUgICAgIGNvcHlfbWVtMTZ4MTZfNF9sb29wCisKKyAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQorICAgIDtwb3AgICAgICAgIHtyNC1yN30KKyAgICBtb3YgICAgIHBjLCBscgorCis7Y29weSA4IGJ5dGVzIGVhY2ggdGltZQorY29weV9tZW0xNngxNl84CisgICAgc3ViICAgICByMSwgcjEsICMxNgorICAgIHN1YiAgICAgcjMsIHIzLCAjMTYKKworICAgIG1vdiAgICAgcjEyLCAjMTYKKworY29weV9tZW0xNngxNl84X2xvb3AKKyAgICBsZG1pYSAgIHIwISwge3I0LXI1fQorICAgIDtsZG0gICAgICAgIHIwLCB7cjQtcjV9CisgICAgbGRtaWEgICByMCEsIHtyNi1yN30KKworICAgIGFkZCAgICAgcjAsIHIwLCByMQorCisgICAgc3RtaWEgICByMiEsIHtyNC1yNX0KKyAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQorICAgIDtzdG0gICAgICAgIHIyLCB7cjQtcjV9CisgICAgc3RtaWEgICByMiEsIHtyNi1yN30KKworICAgIGFkZCAgICAgcjIsIHIyLCByMworCisgICAgcGxkICAgICBbcjAsICMzMV0gICAgICAgICAgICAgICA7IHByZWxvYWQgZm9yIG5leHQgMTZ4MTYgYmxvY2sKKyAgICBibmUgICAgIGNvcHlfbWVtMTZ4MTZfOF9sb29wCisKKyAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQorICAgIDtwb3AgICAgICAgIHtyNC1yN30KKyAgICBtb3YgICAgIHBjLCBscgorCis7Y29weSAxNiBieXRlcyBlYWNoIHRpbWUKK2NvcHlfbWVtMTZ4MTZfZmFzdAorICAgIDtzdWIgICAgICAgIHIxLCByMSwgIzE2CisgICAgO3N1YiAgICAgICAgcjMsIHIzLCAjMTYKKworICAgIG1vdiAgICAgcjEyLCAjMTYKKworY29weV9tZW0xNngxNl9mYXN0X2xvb3AKKyAgICBsZG1pYSAgIHIwLCB7cjQtcjd9CisgICAgO2xkbSAgICAgICAgcjAsIHtyNC1yN30KKyAgICBhZGQgICAgIHIwLCByMCwgcjEKKworICAgIHN1YnMgICAgcjEyLCByMTIsICMxCisgICAgc3RtaWEgICByMiwge3I0LXI3fQorICAgIDtzdG0gICAgICAgIHIyLCB7cjQtcjd9CisgICAgYWRkICAgICByMiwgcjIsIHIzCisKKyAgICBwbGQgICAgIFtyMCwgIzMxXSAgICAgICAgICAgICAgIDsgcHJlbG9hZCBmb3IgbmV4dCAxNngxNiBibG9jaworICAgIGJuZSAgICAgY29weV9tZW0xNngxNl9mYXN0X2xvb3AKKworICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjd9CisgICAgO3BvcCAgICAgICAge3I0LXI3fQorICAgIG1vdiAgICAgcGMsIGxyCisKKyAgICBFTkRQICA7IHx2cDhfY29weV9tZW0xNngxNl92NnwKKworICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTh4NF92Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTh4NF92Ni5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW04eDRfdjYuYXNtCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTh4NF92Ni5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW04eDhfdjYuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW04eDhfdjYuYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg4X3Y2LmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2NvcHltZW04eDhfdjYuYXNtCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvZGNfb25seV9pZGN0X2FkZF92Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvZGNfb25seV9pZGN0X2FkZF92Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhNjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9kY19vbmx5X2lkY3RfYWRkX3Y2LmFzbQpAQCAtMCwwICsxLDcwIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Cis7ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUworOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKyAgICBFWFBPUlQgIHx2cDhfZGNfb25seV9pZGN0X2FkZF92NnwKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkKKworO3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyhzaG9ydCBpbnB1dF9kYywgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUpCis7IHIwICBpbnB1dF9kYworOyByMSAgcHJlZF9wdHIKKzsgcjIgIHByZWRfc3RyaWRlCis7IHIzICBkc3RfcHRyCis7IHNwICBkc3Rfc3RyaWRlCisKK3x2cDhfZGNfb25seV9pZGN0X2FkZF92NnwgUFJPQworICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjd9CisKKyAgICBhZGQgICAgICAgICByMCwgcjAsICM0ICAgICAgICAgICAgICAgIDsgaW5wdXRfZGMgKz0gNAorICAgIGxkciAgICAgICAgIHIxMiwgYzB4MDAwMEZGRkYKKyAgICBsZHIgICAgICAgICByNCwgW3IxXSwgcjIKKyAgICBhbmQgICAgICAgICByMCwgcjEyLCByMCwgYXNyICMzICAgICAgIDsgaW5wdXRfZGMgPj4gMyArIG1hc2sKKyAgICBsZHIgICAgICAgICByNiwgW3IxXSwgcjIKKyAgICBvcnIgICAgICAgICByMCwgcjAsIHIwLCBsc2wgIzE2ICAgICAgIDsgYTEgfCBhMQorCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICMxNl0gICAgICAgICAgICA7IGRzdCBzdHJpZGUKKworICAgIHV4dGFiMTYgICAgIHI1LCByMCwgcjQgICAgICAgICAgICAgICAgOyBhMSsyIHwgYTErMAorICAgIHV4dGFiMTYgICAgIHI0LCByMCwgcjQsIHJvciAjOCAgICAgICAgOyBhMSszIHwgYTErMQorICAgIHV4dGFiMTYgICAgIHI3LCByMCwgcjYKKyAgICB1eHRhYjE2ICAgICByNiwgcjAsIHI2LCByb3IgIzgKKyAgICB1c2F0MTYgICAgICByNSwgIzgsIHI1CisgICAgdXNhdDE2ICAgICAgcjQsICM4LCByNAorICAgIHVzYXQxNiAgICAgIHI3LCAjOCwgcjcKKyAgICB1c2F0MTYgICAgICByNiwgIzgsIHI2CisgICAgb3JyICAgICAgICAgcjUsIHI1LCByNCwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjcsIHI3LCByNiwgbHNsICM4CisgICAgbGRyICAgICAgICAgcjQsIFtyMV0sIHIyCisgICAgc3RyICAgICAgICAgcjUsIFtyM10sIHIxMgorICAgIGxkciAgICAgICAgIHI2LCBbcjFdCisgICAgc3RyICAgICAgICAgcjcsIFtyM10sIHIxMgorCisgICAgdXh0YWIxNiAgICAgcjUsIHIwLCByNAorICAgIHV4dGFiMTYgICAgIHI0LCByMCwgcjQsIHJvciAjOAorICAgIHV4dGFiMTYgICAgIHI3LCByMCwgcjYKKyAgICB1eHRhYjE2ICAgICByNiwgcjAsIHI2LCByb3IgIzgKKyAgICB1c2F0MTYgICAgICByNSwgIzgsIHI1CisgICAgdXNhdDE2ICAgICAgcjQsICM4LCByNAorICAgIHVzYXQxNiAgICAgIHI3LCAjOCwgcjcKKyAgICB1c2F0MTYgICAgICByNiwgIzgsIHI2CisgICAgb3JyICAgICAgICAgcjUsIHI1LCByNCwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjcsIHI3LCByNiwgbHNsICM4CisgICAgc3RyICAgICAgICAgcjUsIFtyM10sIHIxMgorICAgIHN0ciAgICAgICAgIHI3LCBbcjNdCisKKyAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQorICAgIGJ4ICAgICAgICAgIGxyCisKKyAgICBFTkRQICA7IHx2cDhfZGNfb25seV9pZGN0X2FkZF92NnwKKworOyBDb25zdGFudCBQb29sCitjMHgwMDAwRkZGRiBEQ0QgMHgwMDAwRkZGRgorICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2RlcXVhbnRfaWRjdF92Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvZGVxdWFudF9pZGN0X3Y2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTEwYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2RlcXVhbnRfaWRjdF92Ni5hc20KQEAgLTAsMCArMSwxOTAgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIGFuZCBwYXRlbnQKKzsgIGdyYW50IHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5IGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTCis7ICBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworICAgIEVYUE9SVCB8dnA4X2RlcXVhbnRfaWRjdF9hZGRfdjZ8CisKKyAgICBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZCis7dm9pZCB2cDhfZGVxdWFudF9pZGN0X3Y2KHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLAorOyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgc3RyaWRlKQorOyByMCA9IHEKKzsgcjEgPSBkcQorOyByMiA9IGRzdAorOyByMyA9IHN0cmlkZQorCit8dnA4X2RlcXVhbnRfaWRjdF9hZGRfdjZ8IFBST0MKKyAgICBzdG1kYiAgIHNwISwge3I0LXIxMSwgbHJ9CisKKyAgICBsZHIgICAgIHI0LCBbcjBdICAgICAgICAgICAgICAgIDtpbnB1dAorICAgIGxkciAgICAgcjUsIFtyMV0sICM0ICAgICAgICAgICAgO2RxCisKKyAgICBzdWIgICAgIHNwLCBzcCwgIzQKKyAgICBzdHIgICAgIHIzLCBbc3BdCisKKyAgICBtb3YgICAgIHIxMiwgIzQKKwordnA4X2RlcXVhbnRfYWRkX2xvb3AKKyAgICBzbXVsYmIgIHI2LCByNCwgcjUKKyAgICBzbXVsdHQgIHI3LCByNCwgcjUKKworICAgIGxkciAgICAgcjQsIFtyMCwgIzRdICAgICAgICAgICAgO2lucHV0CisgICAgbGRyICAgICByNSwgW3IxXSwgIzQgICAgICAgICAgICA7ZHEKKworICAgIHN0cmggICAgcjYsIFtyMF0sICMyCisgICAgc3RyaCAgICByNywgW3IwXSwgIzIKKworICAgIHNtdWxiYiAgcjYsIHI0LCByNQorICAgIHNtdWx0dCAgcjcsIHI0LCByNQorCisgICAgc3VicyAgICByMTIsIHIxMiwgIzEKKworICAgIGxkcm5lICAgcjQsIFtyMCwgIzRdCisgICAgbGRybmUgICByNSwgW3IxXSwgIzQKKworICAgIHN0cmggICAgcjYsIFtyMF0sICMyCisgICAgc3RyaCAgICByNywgW3IwXSwgIzIKKworICAgIGJuZSAgICAgdnA4X2RlcXVhbnRfYWRkX2xvb3AKKworICAgIHN1YiAgICAgcjAsIHIwLCAjMzIKKyAgICBtb3YgICAgIHIxLCByMAorCis7IHNob3J0X2lkY3Q0eDRsbG1fdjZfZHVhbAorICAgIGxkciAgICAgcjMsIGNvc3BpOHNxcnQybWludXMxCisgICAgbGRyICAgICByNCwgc2lucGk4c3FydDIKKyAgICBsZHIgICAgIHI2LCBbcjAsICM4XQorICAgIG1vdiAgICAgcjUsICMyCit2cDhfZGVxdWFudF9pZGN0X2xvb3AxX3Y2CisgICAgbGRyICAgICByMTIsIFtyMCwgIzI0XQorICAgIGxkciAgICAgcjE0LCBbcjAsICMxNl0KKyAgICBzbXVsd3QgIHI5LCByMywgcjYKKyAgICBzbXVsd2IgIHI3LCByMywgcjYKKyAgICBzbXVsd3QgIHIxMCwgcjQsIHI2CisgICAgc211bHdiICByOCwgcjQsIHI2CisgICAgcGtoYnQgICByNywgcjcsIHI5LCBsc2wgIzE2CisgICAgc211bHd0ICByMTEsIHIzLCByMTIKKyAgICBwa2hidCAgIHI4LCByOCwgcjEwLCBsc2wgIzE2CisgICAgdWFkZDE2ICByNiwgcjYsIHI3CisgICAgc211bHd0ICByNywgcjQsIHIxMgorICAgIHNtdWx3YiAgcjksIHIzLCByMTIKKyAgICBzbXVsd2IgIHIxMCwgcjQsIHIxMgorICAgIHN1YnMgICAgcjUsIHI1LCAjMQorICAgIHBraGJ0ICAgcjksIHI5LCByMTEsIGxzbCAjMTYKKyAgICBsZHIgICAgIHIxMSwgW3IwXSwgIzQKKyAgICBwa2hidCAgIHIxMCwgcjEwLCByNywgbHNsICMxNgorICAgIHVhZGQxNiAgcjcsIHIxMiwgcjkKKyAgICB1c3ViMTYgIHI3LCByOCwgcjcKKyAgICB1YWRkMTYgIHI2LCByNiwgcjEwCisgICAgdWFkZDE2ICByMTAsIHIxMSwgcjE0CisgICAgdXN1YjE2ICByOCwgcjExLCByMTQKKyAgICB1YWRkMTYgIHI5LCByMTAsIHI2CisgICAgdXN1YjE2ICByMTAsIHIxMCwgcjYKKyAgICB1YWRkMTYgIHI2LCByOCwgcjcKKyAgICB1c3ViMTYgIHI3LCByOCwgcjcKKyAgICBzdHIgICAgIHI2LCBbcjEsICM4XQorICAgIGxkcm5lICAgcjYsIFtyMCwgIzhdCisgICAgc3RyICAgICByNywgW3IxLCAjMTZdCisgICAgc3RyICAgICByMTAsIFtyMSwgIzI0XQorICAgIHN0ciAgICAgcjksIFtyMV0sICM0CisgICAgYm5lICAgICB2cDhfZGVxdWFudF9pZGN0X2xvb3AxX3Y2CisKKyAgICBtb3YgICAgIHI1LCAjMgorICAgIHN1YiAgICAgcjAsIHIxLCAjOAordnA4X2RlcXVhbnRfaWRjdF9sb29wMl92NgorICAgIGxkciAgICAgcjYsIFtyMF0sICM0CisgICAgbGRyICAgICByNywgW3IwXSwgIzQKKyAgICBsZHIgICAgIHI4LCBbcjBdLCAjNAorICAgIGxkciAgICAgcjksIFtyMF0sICM0CisgICAgc211bHd0ICByMSwgcjMsIHI2CisgICAgc211bHd0ICByMTIsIHI0LCByNgorICAgIHNtdWx3dCAgbHIsIHIzLCByOAorICAgIHNtdWx3dCAgcjEwLCByNCwgcjgKKyAgICBwa2hidCAgIHIxMSwgcjgsIHI2LCBsc2wgIzE2CisgICAgcGtoYnQgICByMSwgbHIsIHIxLCBsc2wgIzE2CisgICAgcGtoYnQgICByMTIsIHIxMCwgcjEyLCBsc2wgIzE2CisgICAgcGtodGIgICByNiwgcjYsIHI4LCBhc3IgIzE2CisgICAgdWFkZDE2ICByNiwgcjEsIHI2CisgICAgcGtoYnQgICBsciwgcjksIHI3LCBsc2wgIzE2CisgICAgdWFkZDE2ICByMTAsIHIxMSwgbHIKKyAgICB1c3ViMTYgIGxyLCByMTEsIGxyCisgICAgcGtodGIgICByOCwgcjcsIHI5LCBhc3IgIzE2CisgICAgc3VicyAgICByNSwgcjUsICMxCisgICAgc211bHd0ICByMSwgcjMsIHI4CisgICAgc211bHdiICByNywgcjMsIHI4CisgICAgc211bHd0ICByMTEsIHI0LCByOAorICAgIHNtdWx3YiAgcjksIHI0LCByOAorICAgIHBraGJ0ICAgcjEsIHI3LCByMSwgbHNsICMxNgorICAgIHVhZGQxNiAgcjgsIHIxLCByOAorICAgIHBraGJ0ICAgcjExLCByOSwgcjExLCBsc2wgIzE2CisgICAgdXN1YjE2ICByMSwgcjEyLCByOAorICAgIHVhZGQxNiAgcjgsIHIxMSwgcjYKKyAgICBsZHIgICAgIHI5LCBjMHgwMDA0MDAwNAorICAgIGxkciAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgOyBnZXQgc3RyaWRlIGZyb20gc3RhY2sKKyAgICB1YWRkMTYgIHI2LCByMTAsIHI4CisgICAgdXN1YjE2ICByNywgcjEwLCByOAorICAgIHVhZGQxNiAgcjcsIHI3LCByOQorICAgIHVhZGQxNiAgcjYsIHI2LCByOQorICAgIHVhZGQxNiAgcjEwLCByMTQsIHIxCisgICAgdXN1YjE2ICByMSwgcjE0LCByMQorICAgIHVhZGQxNiAgcjEwLCByMTAsIHI5CisgICAgdWFkZDE2ICByMSwgcjEsIHI5CisgICAgbGRyICAgICByMTEsIFtyMl0gICAgICAgICAgICAgICA7IGxvYWQgaW5wdXQgZnJvbSBkc3QKKyAgICBtb3YgICAgIHI4LCByNywgYXNyICMzCisgICAgcGtodGIgICByOSwgcjgsIHIxMCwgYXNyICMxOQorICAgIG1vdiAgICAgcjgsIHIxLCBhc3IgIzMKKyAgICBwa2h0YiAgIHI4LCByOCwgcjYsIGFzciAjMTkKKyAgICB1eHRiMTYgIGxyLCByMTEsIHJvciAjOAorICAgIHFhZGQxNiAgcjksIHI5LCBscgorICAgIHV4dGIxNiAgbHIsIHIxMQorICAgIHFhZGQxNiAgcjgsIHI4LCBscgorICAgIHVzYXQxNiAgcjksICM4LCByOQorICAgIHVzYXQxNiAgcjgsICM4LCByOAorICAgIG9yciAgICAgcjksIHI4LCByOSwgbHNsICM4CisgICAgbGRyICAgICByMTEsIFtyMiwgcjEyXSAgICAgICAgICA7IGxvYWQgaW5wdXQgZnJvbSBkc3QKKyAgICBtb3YgICAgIHI3LCByNywgbHNsICMxNgorICAgIG1vdiAgICAgcjEsIHIxLCBsc2wgIzE2CisgICAgbW92ICAgICByMTAsIHIxMCwgbHNsICMxNgorICAgIG1vdiAgICAgcjYsIHI2LCBsc2wgIzE2CisgICAgbW92ICAgICByNywgcjcsIGFzciAjMworICAgIHBraHRiICAgcjcsIHI3LCByMTAsIGFzciAjMTkKKyAgICBtb3YgICAgIHIxLCByMSwgYXNyICMzCisgICAgcGtodGIgICByMSwgcjEsIHI2LCBhc3IgIzE5CisgICAgdXh0YjE2ICByOCwgcjExLCByb3IgIzgKKyAgICBxYWRkMTYgIHI3LCByNywgcjgKKyAgICB1eHRiMTYgIHI4LCByMTEKKyAgICBxYWRkMTYgIHIxLCByMSwgcjgKKyAgICB1c2F0MTYgIHI3LCAjOCwgcjcKKyAgICB1c2F0MTYgIHIxLCAjOCwgcjEKKyAgICBvcnIgICAgIHIxLCByMSwgcjcsIGxzbCAjOAorICAgIHN0ciAgICAgcjksIFtyMl0sIHIxMiAgICAgICAgICAgOyBzdG9yZSBvdXRwdXQgdG8gZHN0CisgICAgc3RyICAgICByMSwgW3IyXSwgcjEyICAgICAgICAgICA7IHN0b3JlIG91dHB1dCB0byBkc3QKKyAgICBibmUgICAgIHZwOF9kZXF1YW50X2lkY3RfbG9vcDJfdjYKKworOyB2cHhfbWVtc2V0CisgICAgc3ViICAgICByMCwgcjAsICMzMgorICAgIGFkZCAgICAgc3AsIHNwLCAjNAorCisgICAgbW92ICAgICByMTIsICMwCisgICAgc3RyICAgICByMTIsIFtyMF0KKyAgICBzdHIgICAgIHIxMiwgW3IwLCAjNF0KKyAgICBzdHIgICAgIHIxMiwgW3IwLCAjOF0KKyAgICBzdHIgICAgIHIxMiwgW3IwLCAjMTJdCisgICAgc3RyICAgICByMTIsIFtyMCwgIzE2XQorICAgIHN0ciAgICAgcjEyLCBbcjAsICMyMF0KKyAgICBzdHIgICAgIHIxMiwgW3IwLCAjMjRdCisgICAgc3RyICAgICByMTIsIFtyMCwgIzI4XQorCisgICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9CisgICAgRU5EUCAgICA7IHx2cDhfZGVxdWFudF9pZGN0X2FkZF92NnwKKworOyBDb25zdGFudCBQb29sCitjb3NwaThzcXJ0Mm1pbnVzMSBEQ0QgMHgwMDAwNEU3Qgorc2lucGk4c3FydDIgICAgICAgRENEIDB4MDAwMDhBOEMKK2MweDAwMDQwMDA0ICAgICAgIERDRCAweDAwMDQwMDA0CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2FybS9hcm12Ni9kZXF1YW50aXplX3Y2LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9kZXF1YW50aXplX3Y2LmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2RlY29kZXIvYXJtL2FybXY2L2RlcXVhbnRpemVfdjYuYXNtCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvZGVxdWFudGl6ZV92Ni5hc20KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9maWx0ZXJfdjYuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2ZpbHRlcl92Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhOTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9maWx0ZXJfdjYuYXNtCkBAIC0wLDAgKzEsNjI0IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfYXJtdjZ8CisgICAgRVhQT1JUICB8dnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfMTZ4MTZfYXJtdjZ8CisgICAgRVhQT1JUICB8dnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfOHg4X2FybXY2fAorICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NnwKKyAgICBFWFBPUlQgIHx2cDhfZmlsdGVyNF9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2fAorICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX29ubHlfYXJtdjZ8CisgICAgRVhQT1JUICB8dnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX29ubHlfYXJtdjZ8CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IHIxICAgIHNob3J0ICAgICAgICAgKm91dHB1dF9wdHIKKzsgcjIgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUKKzsgcjMgICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aAorOyBzdGFjayB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodAorOyBzdGFjayBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdnA4X2ZpbHRlciB0aGUgaW5wdXQgYW5kIHB1dCBpbiB0aGUgb3V0cHV0IGFycmF5LiAgQXBwbHkgdGhlIDYgdGFwIEZJUiBmaWx0ZXIgd2l0aAorOyB0aGUgb3V0cHV0IGJlaW5nIGEgMiBieXRlIHZhbHVlIGFuZCB0aGUgaW50cHV0IGJlaW5nIGEgMSBieXRlIHZhbHVlLgorfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX2FybXY2fCBQUk9DCisgICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIGFkZHJlc3MKKyAgICBsZHIgICAgIHI3LCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICAgOyBvdXRwdXQgaGVpZ2h0CisKKyAgICBzdWIgICAgIHIyLCByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBpbnNpZGUgbG9vcCBpbmNyZW1lbnRzIGlucHV0IGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNvIHRoZSBoZWlnaHQgbG9vcCBvbmx5IG5lZWRzIHRvIGFkZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHIyIC0gd2lkdGggdG8gdGhlIGlucHV0IHBvaW50ZXIKKworICAgIG1vdiAgICAgcjMsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICA7IG11bHRpcGx5IHdpZHRoIGJ5IDIgYmVjYXVzZSB1c2luZyBzaG9ydHMKKyAgICBhZGQgICAgIHIxMiwgcjMsICMxNiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgb2ZmIHRoZSBvdXRwdXQKKyAgICBzdWIgICAgIHNwLCBzcCwgIzQKKworICAgIGxkciAgICAgcjQsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBsZHIgICAgIHI1LCBbcjExLCAjNF0KKyAgICBsZHIgICAgIHI2LCBbcjExLCAjOF0KKworICAgIHN0ciAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHB1c2ggZGVzdGluYXRpb24gdG8gc3RhY2sKKyAgICBtb3YgICAgIHI3LCByNywgbHNsICMxNiAgICAgICAgICAgICAgICAgOyBoZWlnaHQgaXMgdG9wIHBhcnQgb2YgY291bnRlcgorCis7IHNpeCB0YXAgZmlsdGVyCit8aGVpZ2h0X2xvb3BfMXN0XzZ8CisgICAgbGRyYiAgICByOCwgW3IwLCAjLTJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQorICAgIGxkcmIgICAgcjksIFtyMCwgIy0xXQorICAgIGxkcmIgICAgcjEwLCBbcjBdLCAjMgorICAgIG9yciAgICAgcjcsIHI3LCByMywgbHNyICMyICAgICAgICAgICAgICA7IGNvbnN0cnVjdCBsb29wIGNvdW50ZXIKKworfHdpZHRoX2xvb3BfMXN0XzZ8CisgICAgbGRyYiAgICByMTEsIFtyMCwgIy0xXQorCisgICAgcGtoYnQgICBsciwgcjgsIHI5LCBsc2wgIzE2ICAgICAgICAgICAgIDsgcjkgfCByOAorICAgIHBraGJ0ICAgcjgsIHI5LCByMTAsIGxzbCAjMTYgICAgICAgICAgICA7IHIxMCB8IHI5CisKKyAgICBsZHJiICAgIHI5LCBbcjBdCisKKyAgICBzbXVhZCAgIGxyLCBsciwgcjQgICAgICAgICAgICAgICAgICAgICAgOyBhcHBseSB0aGUgZmlsdGVyCisgICAgcGtoYnQgICByMTAsIHIxMCwgcjExLCBsc2wgIzE2ICAgICAgICAgIDsgcjExIHwgcjEwCisgICAgc211YWQgICByOCwgcjgsIHI0CisgICAgcGtoYnQgICByMTEsIHIxMSwgcjksIGxzbCAjMTYgICAgICAgICAgIDsgcjkgfCByMTEKKworICAgIHNtbGFkICAgbHIsIHIxMCwgcjUsIGxyCisgICAgbGRyYiAgICByMTAsIFtyMCwgIzFdCisgICAgc21sYWQgICByOCwgcjExLCByNSwgcjgKKyAgICBsZHJiICAgIHIxMSwgW3IwLCAjMl0KKworICAgIHN1YiAgICAgcjcsIHI3LCAjMQorCisgICAgcGtoYnQgICByOSwgcjksIHIxMCwgbHNsICMxNiAgICAgICAgICAgIDsgcjEwIHwgcjkKKyAgICBwa2hidCAgIHIxMCwgcjEwLCByMTEsIGxzbCAjMTYgICAgICAgICAgOyByMTEgfCByMTAKKworICAgIHNtbGFkICAgbHIsIHI5LCByNiwgbHIKKyAgICBzbWxhZCAgIHIxMSwgcjEwLCByNiwgcjgKKworICAgIGFuZHMgICAgcjEwLCByNywgIzB4ZmYgICAgICAgICAgICAgICAgICA7IHRlc3QgbG9vcCBjb3VudGVyCisKKyAgICBhZGQgICAgIGxyLCBsciwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKKyAgICBsZHJuZWIgIHI4LCBbcjAsICMtMl0gICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZm9yIG5leHQgbG9vcAorICAgIHVzYXQgICAgbHIsICM4LCBsciwgYXNyICM3CisgICAgYWRkICAgICByMTEsIHIxMSwgIzB4NDAKKyAgICBsZHJuZWIgIHI5LCBbcjAsICMtMV0KKyAgICB1c2F0ICAgIHIxMSwgIzgsIHIxMSwgYXNyICM3CisKKyAgICBzdHJoICAgIGxyLCBbcjFdLCByMTIgICAgICAgICAgICAgICAgICAgOyByZXN1bHQgaXMgdHJhbnNwb3NlZCBhbmQgc3RvcmVkLCB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHdpbGwgbWFrZSBzZWNvbmQgcGFzcyBmaWx0ZXJpbmcgZWFzaWVyLgorICAgIGxkcm5lYiAgcjEwLCBbcjBdLCAjMgorICAgIHN0cmggICAgcjExLCBbcjFdLCByMTIKKworICAgIGJuZSAgICAgd2lkdGhfbG9vcF8xc3RfNgorCisgICAgbGRyICAgICByMSwgW3NwXSAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBhbmQgdXBkYXRlIGRzdCBhZGRyZXNzCisgICAgc3VicyAgICByNywgcjcsICMweDEwMDAwCisgICAgYWRkICAgICByMCwgcjAsIHIyICAgICAgICAgICAgICAgICAgICAgIDsgbW92ZSB0byBuZXh0IGlucHV0IGxpbmUKKworICAgIGFkZCAgICAgcjEsIHIxLCAjMiAgICAgICAgICAgICAgICAgICAgICA7IG1vdmUgb3ZlciB0byBuZXh0IGNvbHVtbgorICAgIHN0ciAgICAgcjEsIFtzcF0KKworICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMXN0XzYKKworICAgIGFkZCAgICAgc3AsIHNwLCAjNAorICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCisgICAgRU5EUAorCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IDE2eDE2IHZlcnNpb24KKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3x2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc18xNngxNl9hcm12NnwgUFJPQworICAgIHN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQorCisgICAgbGRyICAgICByMTEsIFtzcCwgIzQwXSAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciBhZGRyZXNzCisgICAgbGRyICAgICByNywgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgIDsgb3V0cHV0IGhlaWdodAorCisgICAgYWRkICAgICByNCwgcjIsICMxOCAgICAgICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBuZXh0IGxvdworICAgIHBsZCAgICAgW3IwLCByNF0KKworICAgIHN1YiAgICAgcjIsIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICA7IGluc2lkZSBsb29wIGluY3JlbWVudHMgaW5wdXQgYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc28gdGhlIGhlaWdodCBsb29wIG9ubHkgbmVlZHMgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcjIgLSB3aWR0aCB0byB0aGUgaW5wdXQgcG9pbnRlcgorCisgICAgbW92ICAgICByMywgcjMsIGxzbCAjMSAgICAgICAgICAgICAgICAgIDsgbXVsdGlwbHkgd2lkdGggYnkgMiBiZWNhdXNlIHVzaW5nIHNob3J0cworICAgIGFkZCAgICAgcjEyLCByMywgIzE2ICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBvZmYgdGhlIG91dHB1dAorICAgIHN1YiAgICAgc3AsIHNwLCAjNAorCisgICAgbGRyICAgICByNCwgW3IxMV0gICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCB1cCBwYWNrZWQgZmlsdGVyIGNvZWZmaWNpZW50cworICAgIGxkciAgICAgcjUsIFtyMTEsICM0XQorICAgIGxkciAgICAgcjYsIFtyMTEsICM4XQorCisgICAgc3RyICAgICByMSwgW3NwXSAgICAgICAgICAgICAgICAgICAgICAgIDsgcHVzaCBkZXN0aW5hdGlvbiB0byBzdGFjaworICAgIG1vdiAgICAgcjcsIHI3LCBsc2wgIzE2ICAgICAgICAgICAgICAgICA7IGhlaWdodCBpcyB0b3AgcGFydCBvZiBjb3VudGVyCisKKzsgc2l4IHRhcCBmaWx0ZXIKK3xoZWlnaHRfbG9vcF8xc3RfMTZfNnwKKyAgICBsZHJiICAgIHI4LCBbcjAsICMtMl0gICAgICAgICAgICAgICAgICAgOyBsb2FkIHNvdXJjZSBkYXRhCisgICAgbGRyYiAgICByOSwgW3IwLCAjLTFdCisgICAgbGRyYiAgICByMTAsIFtyMF0sICMyCisgICAgb3JyICAgICByNywgcjcsIHIzLCBsc3IgIzIgICAgICAgICAgICAgIDsgY29uc3RydWN0IGxvb3AgY291bnRlcgorCit8d2lkdGhfbG9vcF8xc3RfMTZfNnwKKyAgICBsZHJiICAgIHIxMSwgW3IwLCAjLTFdCisKKyAgICBwa2hidCAgIGxyLCByOCwgcjksIGxzbCAjMTYgICAgICAgICAgICAgOyByOSB8IHI4CisgICAgcGtoYnQgICByOCwgcjksIHIxMCwgbHNsICMxNiAgICAgICAgICAgIDsgcjEwIHwgcjkKKworICAgIGxkcmIgICAgcjksIFtyMF0KKworICAgIHNtdWFkICAgbHIsIGxyLCByNCAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IHRoZSBmaWx0ZXIKKyAgICBwa2hidCAgIHIxMCwgcjEwLCByMTEsIGxzbCAjMTYgICAgICAgICAgOyByMTEgfCByMTAKKyAgICBzbXVhZCAgIHI4LCByOCwgcjQKKyAgICBwa2hidCAgIHIxMSwgcjExLCByOSwgbHNsICMxNiAgICAgICAgICAgOyByOSB8IHIxMQorCisgICAgc21sYWQgICBsciwgcjEwLCByNSwgbHIKKyAgICBsZHJiICAgIHIxMCwgW3IwLCAjMV0KKyAgICBzbWxhZCAgIHI4LCByMTEsIHI1LCByOAorICAgIGxkcmIgICAgcjExLCBbcjAsICMyXQorCisgICAgc3ViICAgICByNywgcjcsICMxCisKKyAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQorICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAorCisgICAgc21sYWQgICBsciwgcjksIHI2LCBscgorICAgIHNtbGFkICAgcjExLCByMTAsIHI2LCByOAorCisgICAgYW5kcyAgICByMTAsIHI3LCAjMHhmZiAgICAgICAgICAgICAgICAgIDsgdGVzdCBsb29wIGNvdW50ZXIKKworICAgIGFkZCAgICAgbHIsIGxyLCAjMHg0MCAgICAgICAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAorICAgIGxkcm5lYiAgcjgsIFtyMCwgIy0yXSAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmb3IgbmV4dCBsb29wCisgICAgdXNhdCAgICBsciwgIzgsIGxyLCBhc3IgIzcKKyAgICBhZGQgICAgIHIxMSwgcjExLCAjMHg0MAorICAgIGxkcm5lYiAgcjksIFtyMCwgIy0xXQorICAgIHVzYXQgICAgcjExLCAjOCwgcjExLCBhc3IgIzcKKworICAgIHN0cmggICAgbHIsIFtyMV0sIHIxMiAgICAgICAgICAgICAgICAgICA7IHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGFuZCBzdG9yZWQsIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgd2lsbCBtYWtlIHNlY29uZCBwYXNzIGZpbHRlcmluZyBlYXNpZXIuCisgICAgbGRybmViICByMTAsIFtyMF0sICMyCisgICAgc3RyaCAgICByMTEsIFtyMV0sIHIxMgorCisgICAgYm5lICAgICB3aWR0aF9sb29wXzFzdF8xNl82CisKKyAgICBsZHIgICAgIHIxLCBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGFuZCB1cGRhdGUgZHN0IGFkZHJlc3MKKyAgICBzdWJzICAgIHI3LCByNywgIzB4MTAwMDAKKyAgICBhZGQgICAgIHIwLCByMCwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIG5leHQgaW5wdXQgbGluZQorCisgICAgYWRkICAgICByMTEsIHIyLCAjMzQgICAgICAgICAgICAgICAgICAgIDsgYWRkaW5nIGJhY2sgYmxvY2sgd2lkdGgoPTE2KQorICAgIHBsZCAgICAgW3IwLCByMTFdICAgICAgICAgICAgICAgICAgICAgICA7IHByZWxvYWQgbmV4dCBsb3cKKworICAgIGFkZCAgICAgcjEsIHIxLCAjMiAgICAgICAgICAgICAgICAgICAgICA7IG1vdmUgb3ZlciB0byBuZXh0IGNvbHVtbgorICAgIHN0ciAgICAgcjEsIFtzcF0KKworICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMXN0XzE2XzYKKworICAgIGFkZCAgICAgc3AsIHNwLCAjNAorICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCisgICAgRU5EUAorCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IDh4OCB2ZXJzaW9uCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8dnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfOHg4X2FybXY2fCBQUk9DCisgICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIGFkZHJlc3MKKyAgICBsZHIgICAgIHI3LCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICAgOyBvdXRwdXQgaGVpZ2h0CisKKyAgICBhZGQgICAgIHI0LCByMiwgIzEwICAgICAgICAgICAgICAgICAgICAgOyBwcmVsb2FkIG5leHQgbG93CisgICAgcGxkICAgICBbcjAsIHI0XQorCisgICAgc3ViICAgICByMiwgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgaW5zaWRlIGxvb3AgaW5jcmVtZW50cyBpbnB1dCBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzbyB0aGUgaGVpZ2h0IGxvb3Agb25seSBuZWVkcyB0byBhZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMiAtIHdpZHRoIHRvIHRoZSBpbnB1dCBwb2ludGVyCisKKyAgICBtb3YgICAgIHIzLCByMywgbHNsICMxICAgICAgICAgICAgICAgICAgOyBtdWx0aXBseSB3aWR0aCBieSAyIGJlY2F1c2UgdXNpbmcgc2hvcnRzCisgICAgYWRkICAgICByMTIsIHIzLCAjMTYgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIG9mZiB0aGUgb3V0cHV0CisgICAgc3ViICAgICBzcCwgc3AsICM0CisKKyAgICBsZHIgICAgIHI0LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIHBhY2tlZCBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgbGRyICAgICByNSwgW3IxMSwgIzRdCisgICAgbGRyICAgICByNiwgW3IxMSwgIzhdCisKKyAgICBzdHIgICAgIHIxLCBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgOyBwdXNoIGRlc3RpbmF0aW9uIHRvIHN0YWNrCisgICAgbW92ICAgICByNywgcjcsIGxzbCAjMTYgICAgICAgICAgICAgICAgIDsgaGVpZ2h0IGlzIHRvcCBwYXJ0IG9mIGNvdW50ZXIKKworOyBzaXggdGFwIGZpbHRlcgorfGhlaWdodF9sb29wXzFzdF84XzZ8CisgICAgbGRyYiAgICByOCwgW3IwLCAjLTJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQorICAgIGxkcmIgICAgcjksIFtyMCwgIy0xXQorICAgIGxkcmIgICAgcjEwLCBbcjBdLCAjMgorICAgIG9yciAgICAgcjcsIHI3LCByMywgbHNyICMyICAgICAgICAgICAgICA7IGNvbnN0cnVjdCBsb29wIGNvdW50ZXIKKworfHdpZHRoX2xvb3BfMXN0XzhfNnwKKyAgICBsZHJiICAgIHIxMSwgW3IwLCAjLTFdCisKKyAgICBwa2hidCAgIGxyLCByOCwgcjksIGxzbCAjMTYgICAgICAgICAgICAgOyByOSB8IHI4CisgICAgcGtoYnQgICByOCwgcjksIHIxMCwgbHNsICMxNiAgICAgICAgICAgIDsgcjEwIHwgcjkKKworICAgIGxkcmIgICAgcjksIFtyMF0KKworICAgIHNtdWFkICAgbHIsIGxyLCByNCAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IHRoZSBmaWx0ZXIKKyAgICBwa2hidCAgIHIxMCwgcjEwLCByMTEsIGxzbCAjMTYgICAgICAgICAgOyByMTEgfCByMTAKKyAgICBzbXVhZCAgIHI4LCByOCwgcjQKKyAgICBwa2hidCAgIHIxMSwgcjExLCByOSwgbHNsICMxNiAgICAgICAgICAgOyByOSB8IHIxMQorCisgICAgc21sYWQgICBsciwgcjEwLCByNSwgbHIKKyAgICBsZHJiICAgIHIxMCwgW3IwLCAjMV0KKyAgICBzbWxhZCAgIHI4LCByMTEsIHI1LCByOAorICAgIGxkcmIgICAgcjExLCBbcjAsICMyXQorCisgICAgc3ViICAgICByNywgcjcsICMxCisKKyAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQorICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAorCisgICAgc21sYWQgICBsciwgcjksIHI2LCBscgorICAgIHNtbGFkICAgcjExLCByMTAsIHI2LCByOAorCisgICAgYW5kcyAgICByMTAsIHI3LCAjMHhmZiAgICAgICAgICAgICAgICAgIDsgdGVzdCBsb29wIGNvdW50ZXIKKworICAgIGFkZCAgICAgbHIsIGxyLCAjMHg0MCAgICAgICAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAorICAgIGxkcm5lYiAgcjgsIFtyMCwgIy0yXSAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmb3IgbmV4dCBsb29wCisgICAgdXNhdCAgICBsciwgIzgsIGxyLCBhc3IgIzcKKyAgICBhZGQgICAgIHIxMSwgcjExLCAjMHg0MAorICAgIGxkcm5lYiAgcjksIFtyMCwgIy0xXQorICAgIHVzYXQgICAgcjExLCAjOCwgcjExLCBhc3IgIzcKKworICAgIHN0cmggICAgbHIsIFtyMV0sIHIxMiAgICAgICAgICAgICAgICAgICA7IHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGFuZCBzdG9yZWQsIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgd2lsbCBtYWtlIHNlY29uZCBwYXNzIGZpbHRlcmluZyBlYXNpZXIuCisgICAgbGRybmViICByMTAsIFtyMF0sICMyCisgICAgc3RyaCAgICByMTEsIFtyMV0sIHIxMgorCisgICAgYm5lICAgICB3aWR0aF9sb29wXzFzdF84XzYKKworICAgIGxkciAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgYW5kIHVwZGF0ZSBkc3QgYWRkcmVzcworICAgIHN1YnMgICAgcjcsIHI3LCAjMHgxMDAwMAorICAgIGFkZCAgICAgcjAsIHIwLCByMiAgICAgICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gbmV4dCBpbnB1dCBsaW5lCisKKyAgICBhZGQgICAgIHIxMSwgcjIsICMxOCAgICAgICAgICAgICAgICAgICAgOyBhZGRpbmcgYmFjayBibG9jayB3aWR0aCg9OCkKKyAgICBwbGQgICAgIFtyMCwgcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBwcmVsb2FkIG5leHQgbG93CisKKyAgICBhZGQgICAgIHIxLCByMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIG92ZXIgdG8gbmV4dCBjb2x1bW4KKyAgICBzdHIgICAgIHIxLCBbc3BdCisKKyAgICBibmUgICAgIGhlaWdodF9sb29wXzFzdF84XzYKKworICAgIGFkZCAgICAgc3AsIHNwLCAjNAorICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCisgICAgRU5EUAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHIwICAgIHNob3J0ICAgICAgICAgKnNyY19wdHIsCis7IHIxICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCis7IHIyICAgIHVuc2lnbmVkIGludCBvdXRwdXRfcGl0Y2gsCis7IHIzICAgIHVuc2lnbmVkIGludCBjbnQsCis7IHN0YWNrIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8dnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2fCBQUk9DCisgICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBsZHIgICAgIHIxMSwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIGFkZHJlc3MKKyAgICBzdWIgICAgIHNwLCBzcCwgIzQKKyAgICBtb3YgICAgIHI3LCByMywgbHNsICMxNiAgICAgICAgICAgICAgICAgOyBoZWlnaHQgaXMgdG9wIHBhcnQgb2YgY291bnRlcgorICAgIHN0ciAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHB1c2ggZGVzdGluYXRpb24gdG8gc3RhY2sKKworICAgIGxkciAgICAgcjQsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBsZHIgICAgIHI1LCBbcjExLCAjNF0KKyAgICBsZHIgICAgIHI2LCBbcjExLCAjOF0KKworICAgIHBraGJ0ICAgcjEyLCByNSwgcjQgICAgICAgICAgICAgICAgICAgICA7IHBhY2sgdGhlIGZpbHRlciBkaWZmZXJlbnRseQorICAgIHBraGJ0ICAgcjExLCByNiwgcjUKKworICAgIHN1YiAgICAgcjAsIHIwLCAjNCAgICAgICAgICAgICAgICAgICAgICA7IG9mZnNldCBpbnB1dCBidWZmZXIKKworfGhlaWdodF9sb29wXzJuZHwKKyAgICBsZHIgICAgIHI4LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCisgICAgbGRyICAgICByOSwgW3IwLCAjNF0KKyAgICBvcnIgICAgIHI3LCByNywgcjMsIGxzciAjMSAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKKworfHdpZHRoX2xvb3BfMm5kfAorICAgIHNtdWFkICAgbHIsIHI0LCByOCAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IGZpbHRlcgorICAgIHN1YiAgICAgcjcsIHI3LCAjMQorICAgIHNtdWxidCAgcjgsIHI0LCByOAorCisgICAgbGRyICAgICByMTAsIFtyMCwgIzhdCisKKyAgICBzbWxhZCAgIGxyLCByNSwgcjksIGxyCisgICAgc21sYWR4ICByOCwgcjEyLCByOSwgcjgKKworICAgIGxkcmggICAgcjksIFtyMCwgIzEyXQorCisgICAgc21sYWQgICBsciwgcjYsIHIxMCwgbHIKKyAgICBzbWxhZHggIHI4LCByMTEsIHIxMCwgcjgKKworICAgIGFkZCAgICAgcjAsIHIwLCAjNAorICAgIHNtbGF0YiAgcjEwLCByNiwgcjksIHI4CisKKyAgICBhZGQgICAgIGxyLCBsciwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKKyAgICBhbmRzICAgIHI4LCByNywgIzB4ZmYKKyAgICB1c2F0ICAgIGxyLCAjOCwgbHIsIGFzciAjNworICAgIGFkZCAgICAgcjEwLCByMTAsICMweDQwCisgICAgc3RyYiAgICBsciwgW3IxXSwgcjIgICAgICAgICAgICAgICAgICAgIDsgdGhlIHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGJhY2sgYW5kIHN0b3JlZAorICAgIHVzYXQgICAgcjEwLCAjOCwgcjEwLCBhc3IgIzcKKworICAgIGxkcm5lICAgcjgsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmb3IgbmV4dCBsb29wCisgICAgbGRybmUgICByOSwgW3IwLCAjNF0KKyAgICBzdHJiICAgIHIxMCwgW3IxXSwgcjIKKworICAgIGJuZSAgICAgd2lkdGhfbG9vcF8ybmQKKworICAgIGxkciAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHVwZGF0ZSBkc3QgZm9yIG5leHQgbG9vcAorICAgIHN1YnMgICAgcjcsIHI3LCAjMHgxMDAwMAorICAgIGFkZCAgICAgcjAsIHIwLCAjMTYgICAgICAgICAgICAgICAgICAgICA7IHVwZGF0YSBzcmMgZm9yIG5leHQgbG9vcAorICAgIGFkZCAgICAgcjEsIHIxLCAjMQorICAgIHN0ciAgICAgcjEsIFtzcF0KKworICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMm5kCisKKyAgICBhZGQgICAgIHNwLCBzcCwgIzQKKyAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KKworICAgIEVORFAKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyByMCAgICBzaG9ydCAgICAgICAgICpzcmNfcHRyLAorOyByMSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorOyByMiAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAorOyByMyAgICB1bnNpZ25lZCBpbnQgY250LAorOyBzdGFjayBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfHZwOF9maWx0ZXI0X2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjZ8IFBST0MKKyAgICBzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KKworICAgIGxkciAgICAgcjExLCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgYWRkcmVzcworICAgIG1vdiAgICAgcjcsIHIzLCBsc2wgIzE2ICAgICAgICAgICAgICAgICA7IGhlaWdodCBpcyB0b3AgcGFydCBvZiBjb3VudGVyCisKKyAgICBsZHIgICAgIHI0LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIHBhY2tlZCBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgYWRkICAgICBsciwgcjEsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBmaW5hbCBkZXN0aW5hdGlvbiBwb2ludGVyCisgICAgbGRyICAgICByNSwgW3IxMSwgIzRdCisgICAgbGRyICAgICByNiwgW3IxMSwgIzhdCisKKyAgICBwa2hidCAgIHIxMiwgcjUsIHI0ICAgICAgICAgICAgICAgICAgICAgOyBwYWNrIHRoZSBmaWx0ZXIgZGlmZmVyZW50bHkKKyAgICBwa2hidCAgIHIxMSwgcjYsIHI1CisgICAgbW92ICAgICByNCwgIzB4NDAgICAgICAgICAgICAgICAgICAgICAgIDsgcm91bmRpbmcgZmFjdG9yIChmb3Igc21sYWR7eH0pCisKK3xoZWlnaHRfbG9vcF8ybmRfNHwKKyAgICBsZHJkICAgIHI4LCBbcjAsICMtNF0gICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCisgICAgb3JyICAgICByNywgcjcsIHIzLCBsc3IgIzEgICAgICAgICAgICAgIDsgbG9vcCBjb3VudGVyCisKK3x3aWR0aF9sb29wXzJuZF80fAorICAgIGxkciAgICAgcjEwLCBbcjAsICM0XSEKKyAgICBzbWxhZHggIHI2LCByOSwgcjEyLCByNCAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKKyAgICBwa2hidCAgIHI4LCByOSwgcjgKKyAgICBzbWxhZCAgIHI1LCByOCwgcjEyLCByNAorICAgIHBraGJ0ICAgcjgsIHIxMCwgcjkKKyAgICBzbWxhZHggIHI2LCByMTAsIHIxMSwgcjYKKyAgICBzdWIgICAgIHI3LCByNywgIzEKKyAgICBzbWxhZCAgIHI1LCByOCwgcjExLCByNQorCisgICAgbW92ICAgICByOCwgcjkgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgdGhlIGRhdGEgZm9yIHRoZSBuZXh0IGxvb3AKKyAgICBtb3YgICAgIHI5LCByMTAKKworICAgIHVzYXQgICAgcjYsICM4LCByNiwgYXNyICM3ICAgICAgICAgICAgICA7IHNoaWZ0IGFuZCBjbGFtcAorICAgIHVzYXQgICAgcjUsICM4LCByNSwgYXNyICM3CisKKyAgICBzdHJiICAgIHI1LCBbcjFdLCByMiAgICAgICAgICAgICAgICAgICAgOyB0aGUgcmVzdWx0IGlzIHRyYW5zcG9zZWQgYmFjayBhbmQgc3RvcmVkCisgICAgdHN0ICAgICByNywgIzB4ZmYKKyAgICBzdHJiICAgIHI2LCBbcjFdLCByMgorCisgICAgYm5lICAgICB3aWR0aF9sb29wXzJuZF80CisKKyAgICBzdWJzICAgIHI3LCByNywgIzB4MTAwMDAKKyAgICBhZGQgICAgIHIwLCByMCwgIzE2ICAgICAgICAgICAgICAgICAgICAgOyB1cGRhdGUgc3JjIGZvciBuZXh0IGxvb3AKKyAgICBzdWIgICAgIHIxLCBsciwgcjcsIGxzciAjMTYgICAgICAgICAgICAgOyB1cGRhdGUgZHN0IGZvciBuZXh0IGxvb3AKKworICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMm5kXzQKKworICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCisgICAgRU5EUAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsgcjEgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKzsgcjIgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUKKzsgcjMgICAgdW5zaWduZWQgaW50IGNudCwKKzsgc3RhY2sgdW5zaWduZWQgaW50IG91dHB1dF9waXRjaCwKKzsgc3RhY2sgY29uc3Qgc2hvcnQgKnZwOF9maWx0ZXIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3x2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19vbmx5X2FybXY2fCBQUk9DCisgICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBhZGQgICAgIHI3LCByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBwcmVsb2FkIG5leHQgbG93CisgICAgYWRkICAgICByNywgcjcsICMyCisgICAgcGxkICAgICBbcjAsIHI3XQorCisgICAgbGRyICAgICByNCwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgIDsgb3V0cHV0IHBpdGNoCisgICAgbGRyICAgICByMTEsIFtzcCwgIzQwXSAgICAgICAgICAgICAgICAgIDsgSEZpbHRlciBhZGRyZXNzCisgICAgc3ViICAgICBzcCwgc3AsICM4CisKKyAgICBtb3YgICAgIHI3LCByMworICAgIHN1YiAgICAgcjIsIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICA7IGluc2lkZSBsb29wIGluY3JlbWVudHMgaW5wdXQgYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc28gdGhlIGhlaWdodCBsb29wIG9ubHkgbmVlZHMgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcjIgLSB3aWR0aCB0byB0aGUgaW5wdXQgcG9pbnRlcgorCisgICAgc3ViICAgICByNCwgcjQsIHIzCisgICAgc3RyICAgICByNCwgW3NwXSAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBtb2RpZmllZCBvdXRwdXQgcGl0Y2gKKyAgICBzdHIgICAgIHIyLCBbc3AsICM0XQorCisgICAgbW92ICAgICByMiwgIzB4NDAKKworICAgIGxkciAgICAgcjQsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBsZHIgICAgIHI1LCBbcjExLCAjNF0KKyAgICBsZHIgICAgIHI2LCBbcjExLCAjOF0KKworOyBzaXggdGFwIGZpbHRlcgorfGhlaWdodF9sb29wXzFzdF9vbmx5XzZ8CisgICAgbGRyYiAgICByOCwgW3IwLCAjLTJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhCisgICAgbGRyYiAgICByOSwgW3IwLCAjLTFdCisgICAgbGRyYiAgICByMTAsIFtyMF0sICMyCisKKyAgICBtb3YgICAgIHIxMiwgcjMsIGxzciAjMSAgICAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKKworfHdpZHRoX2xvb3BfMXN0X29ubHlfNnwKKyAgICBsZHJiICAgIHIxMSwgW3IwLCAjLTFdCisKKyAgICBwa2hidCAgIGxyLCByOCwgcjksIGxzbCAjMTYgICAgICAgICAgICAgOyByOSB8IHI4CisgICAgcGtoYnQgICByOCwgcjksIHIxMCwgbHNsICMxNiAgICAgICAgICAgIDsgcjEwIHwgcjkKKworICAgIGxkcmIgICAgcjksIFtyMF0KKworOzsgIHNtdWFkICAgbHIsIGxyLCByNAorICAgIHNtbGFkICAgbHIsIGxyLCByNCwgcjIKKyAgICBwa2hidCAgIHIxMCwgcjEwLCByMTEsIGxzbCAjMTYgICAgICAgICAgOyByMTEgfCByMTAKKzs7ICBzbXVhZCAgIHI4LCByOCwgcjQKKyAgICBzbWxhZCAgIHI4LCByOCwgcjQsIHIyCisgICAgcGtoYnQgICByMTEsIHIxMSwgcjksIGxzbCAjMTYgICAgICAgICAgIDsgcjkgfCByMTEKKworICAgIHNtbGFkICAgbHIsIHIxMCwgcjUsIGxyCisgICAgbGRyYiAgICByMTAsIFtyMCwgIzFdCisgICAgc21sYWQgICByOCwgcjExLCByNSwgcjgKKyAgICBsZHJiICAgIHIxMSwgW3IwLCAjMl0KKworICAgIHN1YnMgICAgcjEyLCByMTIsICMxCisKKyAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQorICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAorCisgICAgc21sYWQgICBsciwgcjksIHI2LCBscgorICAgIHNtbGFkICAgcjEwLCByMTAsIHI2LCByOAorCis7OyAgYWRkICAgICBsciwgbHIsICMweDQwICAgICAgICAgICAgICAgICAgIDsgcm91bmRfc2hpZnRfYW5kX2NsYW1wCisgICAgbGRybmViICByOCwgW3IwLCAjLTJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZvciBuZXh0IGxvb3AKKyAgICB1c2F0ICAgIGxyLCAjOCwgbHIsIGFzciAjNworOzsgIGFkZCAgICAgcjEwLCByMTAsICMweDQwCisgICAgc3RyYiAgICBsciwgW3IxXSwgIzEgICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdAorICAgIHVzYXQgICAgcjEwLCAjOCwgcjEwLCBhc3IgIzcKKworICAgIGxkcm5lYiAgcjksIFtyMCwgIy0xXQorICAgIHN0cmIgICAgcjEwLCBbcjFdLCAjMQorICAgIGxkcm5lYiAgcjEwLCBbcjBdLCAjMgorCisgICAgYm5lICAgICB3aWR0aF9sb29wXzFzdF9vbmx5XzYKKworICAgIGxkciAgICAgbHIsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgYmFjayBvdXRwdXQgcGl0Y2gKKyAgICBsZHIgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgICAgICAgICAgOyBsb2FkIGJhY2sgb3V0cHV0IHBpdGNoCisgICAgc3VicyAgICByNywgcjcsICMxCisgICAgYWRkICAgICByMCwgcjAsIHIxMiAgICAgICAgICAgICAgICAgICAgIDsgdXBkYXRhIHNyYyBmb3IgbmV4dCBsb29wCisKKyAgICBhZGQgICAgIHIxMSwgcjEyLCByMyAgICAgICAgICAgICAgICAgICAgOyBwcmVsb2FkIG5leHQgbG93CisgICAgYWRkICAgICByMTEsIHIxMSwgIzIKKyAgICBwbGQgICAgIFtyMCwgcjExXQorCisgICAgYWRkICAgICByMSwgcjEsIGxyICAgICAgICAgICAgICAgICAgICAgIDsgdXBkYXRlIGRzdCBmb3IgbmV4dCBsb29wCisKKyAgICBibmUgICAgIGhlaWdodF9sb29wXzFzdF9vbmx5XzYKKworICAgIGFkZCAgICAgc3AsIHNwLCAjOAorICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQorICAgIEVORFAgIDsgfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX29ubHlfYXJtdjZ8CisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyByMSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorOyByMiAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZQorOyByMyAgICB1bnNpZ25lZCBpbnQgY250LAorOyBzdGFjayB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAorOyBzdGFjayBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19vbmx5X2FybXY2fCBQUk9DCisgICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyBWRmlsdGVyIGFkZHJlc3MKKyAgICBsZHIgICAgIHIxMiwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgOyBvdXRwdXQgcGl0Y2gKKworICAgIG1vdiAgICAgcjcsIHIzLCBsc2wgIzE2ICAgICAgICAgICAgICAgICA7IGhlaWdodCBpcyB0b3AgcGFydCBvZiBjb3VudGVyCisgICAgc3ViICAgICByMCwgcjAsIHIyLCBsc2wgIzEgICAgICAgICAgICAgIDsgbmVlZCA2IGVsZW1lbnRzIGZvciBmaWx0ZXJpbmcsIDIgYmVmb3JlLCAzIGFmdGVyCisKKyAgICBzdWIgICAgIHNwLCBzcCwgIzgKKworICAgIGxkciAgICAgcjQsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBsZHIgICAgIHI1LCBbcjExLCAjNF0KKyAgICBsZHIgICAgIHI2LCBbcjExLCAjOF0KKworICAgIHN0ciAgICAgcjAsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcjAgdG8gc3RhY2sKKyAgICBzdHIgICAgIHIxLCBbc3AsICM0XSAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGRzdCB0byBzdGFjaworCis7IHNpeCB0YXAgZmlsdGVyCit8d2lkdGhfbG9vcF8ybmRfb25seV82fAorICAgIGxkcmIgICAgcjgsIFtyMF0sIHIyICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQorICAgIG9yciAgICAgcjcsIHI3LCByMyAgICAgICAgICAgICAgICAgICAgICA7IGxvb3AgY291bnRlcgorICAgIGxkcmIgICAgcjksIFtyMF0sIHIyCisgICAgbGRyYiAgICByMTAsIFtyMF0sIHIyCisKK3xoZWlnaHRfbG9vcF8ybmRfb25seV82fAorICAgIDsgZmlsdGVyIGZpcnN0IGNvbHVtbiBpbiB0aGlzIGlubmVyIGxvb3AsIHRoYW4sIG1vdmUgdG8gbmV4dCBjb2x1bS4KKyAgICBsZHJiICAgIHIxMSwgW3IwXSwgcjIKKworICAgIHBraGJ0ICAgbHIsIHI4LCByOSwgbHNsICMxNiAgICAgICAgICAgICA7IHI5IHwgcjgKKyAgICBwa2hidCAgIHI4LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQorCisgICAgbGRyYiAgICByOSwgW3IwXSwgcjIKKworICAgIHNtdWFkICAgbHIsIGxyLCByNAorICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAorICAgIHNtdWFkICAgcjgsIHI4LCByNAorICAgIHBraGJ0ICAgcjExLCByMTEsIHI5LCBsc2wgIzE2ICAgICAgICAgICA7IHI5IHwgcjExCisKKyAgICBzbWxhZCAgIGxyLCByMTAsIHI1LCBscgorICAgIGxkcmIgICAgcjEwLCBbcjBdLCByMgorICAgIHNtbGFkICAgcjgsIHIxMSwgcjUsIHI4CisgICAgbGRyYiAgICByMTEsIFtyMF0KKworICAgIHN1YiAgICAgcjcsIHI3LCAjMgorICAgIHN1YiAgICAgcjAsIHIwLCByMiwgbHNsICMyCisKKyAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQorICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAorCisgICAgc21sYWQgICBsciwgcjksIHI2LCBscgorICAgIHNtbGFkICAgcjEwLCByMTAsIHI2LCByOAorCisgICAgYW5kcyAgICByOSwgcjcsICMweGZmCisKKyAgICBhZGQgICAgIGxyLCBsciwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKKyAgICBsZHJuZWIgIHI4LCBbcjBdLCByMiAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZm9yIG5leHQgbG9vcAorICAgIHVzYXQgICAgbHIsICM4LCBsciwgYXNyICM3CisgICAgYWRkICAgICByMTAsIHIxMCwgIzB4NDAKKyAgICBzdHJiICAgIGxyLCBbcjFdLCByMTIgICAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0IGZvciB0aGUgY29sdW1uCisgICAgdXNhdCAgICByMTAsICM4LCByMTAsIGFzciAjNworCisgICAgbGRybmViICByOSwgW3IwXSwgcjIKKyAgICBzdHJiICAgIHIxMCwgW3IxXSwgcjEyCisgICAgbGRybmViICByMTAsIFtyMF0sIHIyCisKKyAgICBibmUgICAgIGhlaWdodF9sb29wXzJuZF9vbmx5XzYKKworICAgIGxkciAgICAgcjAsIFtzcF0KKyAgICBsZHIgICAgIHIxLCBbc3AsICM0XQorICAgIHN1YnMgICAgcjcsIHI3LCAjMHgxMDAwMAorICAgIGFkZCAgICAgcjAsIHIwLCAjMSAgICAgICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gZmlsdGVyIG5leHQgY29sdW1uCisgICAgc3RyICAgICByMCwgW3NwXQorICAgIGFkZCAgICAgcjEsIHIxLCAjMQorICAgIHN0ciAgICAgcjEsIFtzcCwgIzRdCisKKyAgICBibmUgICAgIHdpZHRoX2xvb3BfMm5kX29ubHlfNgorCisgICAgYWRkICAgICBzcCwgc3AsICM4CisKKyAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KKyAgICBFTkRQICA7IHx2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3Nfb25seV9hcm12NnwKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2lkY3RfYmxrX3Y2LmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaWRjdF9ibGtfdjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDAyYzBmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2lkY3RfYmxrX3Y2LmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorCisKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja192NihzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChlb2JzWzBdID4gMSkKKyAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3Y2IChxLCBkcSwgZHN0LCBzdHJpZGUpOworICAgICAgICBlbHNlIGlmIChlb2JzWzBdID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChxWzBdKmRxWzBdLCBkc3QsIHN0cmlkZSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9ic1sxXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF92NiAocSsxNiwgZHEsIGRzdCs0LCBzdHJpZGUpOworICAgICAgICBlbHNlIGlmIChlb2JzWzFdID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChxWzE2XSpkcVswXSwgZHN0KzQsIHN0cmlkZSwgZHN0KzQsIHN0cmlkZSk7CisgICAgICAgICAgICAoKGludCAqKShxKzE2KSlbMF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVvYnNbMl0gPiAxKQorICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYgKHErMzIsIGRxLCBkc3QrOCwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZiAoZW9ic1syXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF92NiAocVszMl0qZHFbMF0sIGRzdCs4LCBzdHJpZGUsIGRzdCs4LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKikocSszMikpWzBdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlb2JzWzNdID4gMSkKKyAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3Y2IChxKzQ4LCBkcSwgZHN0KzEyLCBzdHJpZGUpOworICAgICAgICBlbHNlIGlmIChlb2JzWzNdID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChxWzQ4XSpkcVswXSwgZHN0KzEyLCBzdHJpZGUsZHN0KzEyLHN0cmlkZSk7CisgICAgICAgICAgICAoKGludCAqKShxKzQ4KSlbMF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgcSAgICArPSA2NDsKKyAgICAgICAgZHN0ICArPSA0KnN0cmlkZTsKKyAgICAgICAgZW9icyArPSA0OworICAgIH0KK30KKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja192NihzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3R1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3R2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChlb2JzWzBdID4gMSkKKyAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3Y2IChxLCBkcSwgZHN0dSwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZiAoZW9ic1swXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF92NiAocVswXSpkcVswXSwgZHN0dSwgc3RyaWRlLCBkc3R1LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9ic1sxXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF92NiAocSsxNiwgZHEsIGRzdHUrNCwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZiAoZW9ic1sxXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF92NiAocVsxNl0qZHFbMF0sIGRzdHUrNCwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3R1KzQsIHN0cmlkZSk7CisgICAgICAgICAgICAoKGludCAqKShxKzE2KSlbMF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgcSAgICArPSAzMjsKKyAgICAgICAgZHN0dSArPSA0KnN0cmlkZTsKKyAgICAgICAgZW9icyArPSAyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBpZiAoZW9ic1swXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF92NiAocSwgZHEsIGRzdHYsIHN0cmlkZSk7CisgICAgICAgIGVsc2UgaWYgKGVvYnNbMF0gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYgKHFbMF0qZHFbMF0sIGRzdHYsIHN0cmlkZSwgZHN0diwgc3RyaWRlKTsKKyAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVvYnNbMV0gPiAxKQorICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYgKHErMTYsIGRxLCBkc3R2KzQsIHN0cmlkZSk7CisgICAgICAgIGVsc2UgaWYgKGVvYnNbMV0gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYgKHFbMTZdKmRxWzBdLCBkc3R2KzQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0dis0LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKikocSsxNikpWzBdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHEgICAgKz0gMzI7CisgICAgICAgIGRzdHYgKz0gNCpzdHJpZGU7CisgICAgICAgIGVvYnMgKz0gMjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaWRjdF92Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaWRjdF92Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkNDRjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9pZGN0X3Y2LmFzbQpAQCAtMCwwICsxLDIwMiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9zaG9ydF9pZGN0NHg0bGxtX3Y2X2R1YWx8CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCisKKworOyB2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2Moc2hvcnQgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcGl0Y2gsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUpCis7IHIwICAgIHNob3J0KiBpbnB1dAorOyByMSAgICB1bnNpZ25lZCBjaGFyKiBwcmVkCis7IHIyICAgIGludCBwaXRjaAorOyByMyAgICB1bnNpZ25lZCBjaGFyKiBkc3QKKzsgc3AgICAgaW50IHN0cmlkZQorCit8dnA4X3Nob3J0X2lkY3Q0eDRsbG1fdjZfZHVhbHwgUFJPQworICAgIHN0bWRiICAgc3AhLCB7cjQtcjExLCBscn0KKworICAgIHN1YiAgICAgc3AsIHNwLCAjNAorCisgICAgbW92ICAgICByNCwgIzB4MDAwMDhBMDAgICAgICAgICA7IHNpbgorICAgIG9yciAgICAgcjQsIHI0LCAjMHgwMDAwMDA4QyAgICAgOyBzaW5waThzcXJ0MgorCisgICAgbW92ICAgICByNSwgIzB4MDAwMDRFMDAgICAgICAgICA7IGNvcworICAgIG9yciAgICAgcjUsIHI1LCAjMHgwMDAwMDA3QiAgICAgOyBjb3NwaThzcXJ0Mm1pbnVzMQorICAgIG9yciAgICAgcjUsIHI1LCAjMTw8MzEgICAgICAgICAgOyBsb29wIGNvdW50ZXIgb24gdG9wIGJpdAorCitsb29wMV9kdWFsCisgICAgbGRyICAgICByNiwgW3IwLCAjKDQqMildICAgICAgICA7IGk1IHwgaTQKKyAgICBsZHIgICAgIHIxMiwgW3IwLCAjKDEyKjIpXSAgICAgIDsgaTEzfGkxMgorICAgIGxkciAgICAgcjE0LCBbcjAsICMoOCoyKV0gICAgICAgOyBpOSB8IGk4CisKKyAgICBzbXVsYnQgIHI5LCByNSwgcjYgICAgICAgICAgICAgIDsgKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2CisgICAgc211bGJiICByNywgcjUsIHI2ICAgICAgICAgICAgICA7IChpcFs0XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNgorICAgIHNtdWx3dCAgcjEwLCByNCwgcjYgICAgICAgICAgICAgOyAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTYKKyAgICBzbXVsd2IgIHI4LCByNCwgcjYgICAgICAgICAgICAgIDsgKGlwWzRdICogc2lucGk4c3FydDIpID4+IDE2CisKKyAgICBzbXVsYnQgIHIxMSwgcjUsIHIxMiAgICAgICAgICAgIDsgKGlwWzEzXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNgorICAgIHBraHRiICAgcjcsIHI5LCByNywgYXNyICMxNiAgICAgOyA1YyB8IDRjCisgICAgcGtoYnQgICByOCwgcjgsIHIxMCwgbHNsICMxNiAgICA7IDVzIHwgNHMKKyAgICB1YWRkMTYgIHI2LCByNiwgcjcgICAgICAgICAgICAgIDsgNWMrNSB8IDRjKzQKKworICAgIHNtdWx3dCAgcjcsIHI0LCByMTIgICAgICAgICAgICAgOyAoaXBbMTNdICogc2lucGk4c3FydDIpID4+IDE2CisgICAgc211bGJiICByOSwgcjUsIHIxMiAgICAgICAgICAgICA7IChpcFsxMl0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYKKyAgICBzbXVsd2IgIHIxMCwgcjQsIHIxMiAgICAgICAgICAgIDsgKGlwWzEyXSAqIHNpbnBpOHNxcnQyKSA+PiAxNgorCisgICAgc3VicyAgICByNSwgcjUsICMxPDwzMSAgICAgICAgICA7IGktLQorCisgICAgcGtodGIgICByOSwgcjExLCByOSwgYXNyICMxNiAgICA7IDEzYyB8IDEyYworICAgIGxkciAgICAgcjExLCBbcjBdICAgICAgICAgICAgICAgOyBpMSB8IGkwCisgICAgcGtoYnQgICByMTAsIHIxMCwgcjcsIGxzbCAjMTYgICA7IDEzcyB8IDEycworICAgIHVhZGQxNiAgcjcsIHIxMiwgcjkgICAgICAgICAgICAgOyAxM2MrMTMgfCAxMmMrMTIKKworICAgIHVzdWIxNiAgcjcsIHI4LCByNyAgICAgICAgICAgICAgOyBjCisgICAgdWFkZDE2ICByNiwgcjYsIHIxMCAgICAgICAgICAgICA7IGQKKyAgICB1YWRkMTYgIHIxMCwgcjExLCByMTQgICAgICAgICAgIDsgYQorICAgIHVzdWIxNiAgcjgsIHIxMSwgcjE0ICAgICAgICAgICAgOyBiCisKKyAgICB1YWRkMTYgIHI5LCByMTAsIHI2ICAgICAgICAgICAgIDsgYStkCisgICAgdXN1YjE2ICByMTAsIHIxMCwgcjYgICAgICAgICAgICA7IGEtZAorICAgIHVhZGQxNiAgcjYsIHI4LCByNyAgICAgICAgICAgICAgOyBiK2MKKyAgICB1c3ViMTYgIHI3LCByOCwgcjcgICAgICAgICAgICAgIDsgYi1jCisKKyAgICA7IHVzZSBpbnB1dCBidWZmZXIgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMKKyAgICBzdHIgICAgICByNiwgW3IwLCAjKDQqMildICAgICAgIDsgbzUgfCBvNAorICAgIHN0ciAgICAgIHI3LCBbcjAsICMoOCoyKV0gICAgICAgOyBvOSB8IG84CisgICAgc3RyICAgICAgcjEwLFtyMCwgIygxMioyKV0gICAgICA7IG8xM3xvMTIKKyAgICBzdHIgICAgICByOSwgW3IwXSwgIzQgICAgICAgICAgIDsgbzEgfCBvMAorCisgICAgYmNzIGxvb3AxX2R1YWwKKworICAgIHN1YiAgICAgcjAsIHIwLCAjOCAgICAgICAgICAgICAgOyByZXNldCBpbnB1dC9vdXRwdXQKKyAgICBzdHIgICAgIHIwLCBbc3BdCisKK2xvb3AyX2R1YWwKKworICAgIGxkciAgICAgcjYsIFtyMCwgIyg0KjIpXSAgICAgICAgOyBpNSB8IGk0CisgICAgbGRyICAgICByMTIsW3IwLCAjKDIqMildICAgICAgICA7IGkzIHwgaTIKKyAgICBsZHIgICAgIHIxNCxbcjAsICMoNioyKV0gICAgICAgIDsgaTcgfCBpNgorICAgIGxkciAgICAgcjAsIFtyMCwgIygwKjIpXSAgICAgICAgOyBpMSB8IGkwCisKKyAgICBzbXVsYnQgIHI5LCByNSwgcjYgICAgICAgICAgICAgIDsgKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2CisgICAgc211bGJ0ICByNywgcjUsIHIwICAgICAgICAgICAgICA7IChpcFsxXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNgorICAgIHNtdWx3dCAgcjEwLCByNCwgcjYgICAgICAgICAgICAgOyAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTYKKyAgICBzbXVsd3QgIHI4LCByNCwgcjAgICAgICAgICAgICAgIDsgKGlwWzFdICogc2lucGk4c3FydDIpID4+IDE2CisKKyAgICBwa2hidCAgIHIxMSwgcjYsIHIwLCBsc2wgIzE2ICAgIDsgaTAgfCBpNAorICAgIHBraHRiICAgcjcsIHI3LCByOSwgYXNyICMxNiAgICAgOyAxYyB8IDVjCisgICAgcGtodGIgICByMCwgcjAsIHI2LCBhc3IgIzE2ICAgICA7IGkxIHwgaTUKKyAgICBwa2hidCAgIHI4LCByMTAsIHI4LCBsc2wgIzE2ICAgIDsgMXMgfCA1cyA9IHRlbXAxCisKKyAgICB1YWRkMTYgIHIwLCByNywgcjAgICAgICAgICAgICAgIDsgMWMrMSB8IDVjKzUgPSB0ZW1wMgorICAgIHBraGJ0ICAgcjksIHIxNCwgcjEyLCBsc2wgIzE2ICAgOyBpMiB8IGk2CisgICAgdWFkZDE2ICByMTAsIHIxMSwgcjkgICAgICAgICAgICA7IGEKKyAgICB1c3ViMTYgIHI5LCByMTEsIHI5ICAgICAgICAgICAgIDsgYgorICAgIHBraHRiICAgcjYsIHIxMiwgcjE0LCBhc3IgIzE2ICAgOyBpMyB8IGk3CisKKyAgICBzdWJzICAgIHI1LCByNSwgIzE8PDMxICAgICAgICAgIDsgaS0tCisKKyAgICBzbXVsYnQgIHI3LCByNSwgcjYgICAgICAgICAgICAgIDsgKGlwWzNdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2CisgICAgc211bHd0ICByMTEsIHI0LCByNiAgICAgICAgICAgICA7IChpcFszXSAqIHNpbnBpOHNxcnQyKSA+PiAxNgorICAgIHNtdWxiYiAgcjEyLCByNSwgcjYgICAgICAgICAgICAgOyAoaXBbN10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYKKyAgICBzbXVsd2IgIHIxNCwgcjQsIHI2ICAgICAgICAgICAgIDsgKGlwWzddICogc2lucGk4c3FydDIpID4+IDE2CisKKyAgICBwa2h0YiAgIHI3LCByNywgcjEyLCBhc3IgIzE2ICAgIDsgM2MgfCA3YworICAgIHBraGJ0ICAgcjExLCByMTQsIHIxMSwgbHNsICMxNiAgOyAzcyB8IDdzID0gdGVtcDEKKworICAgIHVhZGQxNiAgcjYsIHI3LCByNiAgICAgICAgICAgICAgOyAzYyszIHwgN2MrNyA9IHRlbXAyCisgICAgdXN1YjE2ICByMTIsIHI4LCByNiAgICAgICAgICAgICA7IGMgKG8xIHwgbzUpCisgICAgdWFkZDE2ICByNiwgcjExLCByMCAgICAgICAgICAgICA7IGQgKG8zIHwgbzcpCisgICAgdWFkZDE2ICByNywgcjEwLCByNiAgICAgICAgICAgICA7IGErZAorCisgICAgbW92ICAgICByOCwgIzQgICAgICAgICAgICAgICAgICA7IHNldCB1cCA0J3MKKyAgICBvcnIgICAgIHI4LCByOCwgIzB4NDAwMDAgICAgICAgIDsgNHw0CisKKyAgICB1c3ViMTYgIHI2LCByMTAsIHI2ICAgICAgICAgICAgIDsgYS1kCisgICAgdWFkZDE2ICByNiwgcjYsIHI4ICAgICAgICAgICAgICA7IGEtZCs0LCAzfDcKKyAgICB1YWRkMTYgIHI3LCByNywgcjggICAgICAgICAgICAgIDsgYStkKzQsIDB8NAorICAgIHVhZGQxNiAgcjEwLCByOSwgcjEyICAgICAgICAgICAgOyBiK2MKKyAgICB1c3ViMTYgIHIwLCByOSwgcjEyICAgICAgICAgICAgIDsgYi1jCisgICAgdWFkZDE2ICByMTAsIHIxMCwgcjggICAgICAgICAgICA7IGIrYys0LCAxfDUKKyAgICB1YWRkMTYgIHI4LCByMCwgcjggICAgICAgICAgICAgIDsgYi1jKzQsIDJ8NgorCisgICAgbGRyICAgICBsciwgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdCBzdHJpZGUKKworICAgIGxkcmIgICAgcjAsIFtyMV0gICAgICAgICAgICAgICAgOyBwcmVkIHAwCisgICAgbGRyYiAgICByMTEsIFtyMSwgIzFdICAgICAgICAgICA7IHByZWQgcDEKKyAgICBsZHJiICAgIHIxMiwgW3IxLCAjMl0gICAgICAgICAgIDsgcHJlZCBwMgorCisgICAgYWRkICAgICByMCwgcjAsIHI3LCBhc3IgIzE5ICAgICA7IHAwICsgbzAKKyAgICBhZGQgICAgIHIxMSwgcjExLCByMTAsIGFzciAjMTkgIDsgcDEgKyBvMQorICAgIGFkZCAgICAgcjEyLCByMTIsIHI4LCBhc3IgIzE5ICAgOyBwMiArIG8yCisKKyAgICB1c2F0ICAgIHIwLCAjOCwgcjAgICAgICAgICAgICAgIDsgZDAgPSBjbGlwOChwMCArIG8wKQorICAgIHVzYXQgICAgcjExLCAjOCwgcjExICAgICAgICAgICAgOyBkMSA9IGNsaXA4KHAxICsgbzEpCisgICAgdXNhdCAgICByMTIsICM4LCByMTIgICAgICAgICAgICA7IGQyID0gY2xpcDgocDIgKyBvMikKKworICAgIGFkZCAgICAgcjAsIHIwLCByMTEsIGxzbCAjOCAgICAgOyB8LS18LS18ZDF8ZDB8CisKKyAgICBsZHJiICAgIHIxMSwgW3IxLCAjM10gICAgICAgICAgIDsgcHJlZCBwMworCisgICAgYWRkICAgICByMCwgcjAsIHIxMiwgbHNsICMxNiAgICA7IHwtLXxkMnxkMXxkMHwKKworICAgIGFkZCAgICAgcjExLCByMTEsIHI2LCBhc3IgIzE5ICAgOyBwMyArIG8zCisKKyAgICBzeHRoICAgIHI3LCByNyAgICAgICAgICAgICAgICAgIDsKKyAgICBzeHRoICAgIHIxMCwgcjEwICAgICAgICAgICAgICAgIDsKKworICAgIHVzYXQgICAgcjExLCAjOCwgcjExICAgICAgICAgICAgOyBkMyA9IGNsaXA4KHAzICsgbzMpCisKKyAgICBzeHRoICAgIHI4LCByOCAgICAgICAgICAgICAgICAgIDsKKyAgICBzeHRoICAgIHI2LCByNiAgICAgICAgICAgICAgICAgIDsKKworICAgIGFkZCAgICAgcjAsIHIwLCByMTEsIGxzbCAjMjQgICAgOyB8ZDN8ZDJ8ZDF8ZDB8CisKKyAgICBsZHJiICAgIHIxMiwgW3IxLCByMl0hICAgICAgICAgIDsgcHJlZCBwNAorICAgIHN0ciAgICAgcjAsIFtyM10sIGxyCisgICAgbGRyYiAgICByMTEsIFtyMSwgIzFdICAgICAgICAgICA7IHByZWQgcDUKKworICAgIGFkZCAgICAgcjEyLCByMTIsIHI3LCBhc3IgIzMgICAgOyBwNCArIG80CisgICAgYWRkICAgICByMTEsIHIxMSwgcjEwLCBhc3IgIzMgICA7IHA1ICsgbzUKKworICAgIHVzYXQgICAgcjEyLCAjOCwgcjEyICAgICAgICAgICAgOyBkNCA9IGNsaXA4KHA0ICsgbzQpCisgICAgdXNhdCAgICByMTEsICM4LCByMTEgICAgICAgICAgICA7IGQ1ID0gY2xpcDgocDUgKyBvNSkKKworICAgIGxkcmIgICAgcjcsIFtyMSwgIzJdICAgICAgICAgICAgOyBwcmVkIHA2CisgICAgbGRyYiAgICByMTAsIFtyMSwgIzNdICAgICAgICAgICA7IHByZWQgcDYKKworICAgIGFkZCAgICAgcjEyLCByMTIsIHIxMSwgbHNsICM4ICAgOyB8LS18LS18ZDV8ZDR8CisKKyAgICBhZGQgICAgIHI3LCByNywgcjgsIGFzciAjMyAgICAgIDsgcDYgKyBvNgorICAgIGFkZCAgICAgcjEwLCByMTAsIHI2LCBhc3IgIzMgICAgOyBwNyArIG83CisKKyAgICBsZHIgICAgIHIwLCBbc3BdICAgICAgICAgICAgICAgIDsgbG9hZCBpbnB1dCBwb2ludGVyCisKKyAgICB1c2F0ICAgIHI3LCAjOCwgcjcgICAgICAgICAgICAgIDsgZDYgPSBjbGlwOChwNiArIG82KQorICAgIHVzYXQgICAgcjEwLCAjOCwgcjEwICAgICAgICAgICAgOyBkNyA9IGNsaXA4KHA3ICsgbzcpCisKKyAgICBhZGQgICAgIHIxMiwgcjEyLCByNywgbHNsICMxNiAgIDsgfC0tfGQ2fGQ1fGQ0fAorICAgIGFkZCAgICAgcjEyLCByMTIsIHIxMCwgbHNsICMyNCAgOyB8ZDd8ZDZ8ZDV8ZDR8CisKKyAgICBzdHIgICAgIHIxMiwgW3IzXSwgbHIKKyAgICBhZGQgICAgIHIwLCByMCwgIzE2CisgICAgYWRkICAgICByMSwgcjEsIHIyICAgICAgICAgICAgICA7IHByZWQgKyBwaXRjaAorCisgICAgYmNzIGxvb3AyX2R1YWwKKworICAgIGFkZCAgICAgc3AsIHNwLCAjNCAgICAgICAgICAgICAgOyBpZGN0X291dHB1dCBidWZmZXIKKyAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KKworICAgIEVORFAKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2ludHJhNHg0X3ByZWRpY3RfdjYuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2ludHJhNHg0X3ByZWRpY3RfdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZWM4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaW50cmE0eDRfcHJlZGljdF92Ni5hc20KQEAgLTAsMCArMSw2MTEgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfaW50cmE0eDRfcHJlZGljdF9hcm12NnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworCis7dm9pZCB2cDhfaW50cmE0eDRfcHJlZGljdF9hcm12Nih1bnNpZ25lZCBjaGFyICpBYm92ZSwgdW5zaWduZWQgY2hhciAqeWxlZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX1BSRURJQ1RJT05fTU9ERSBsZWZ0X3N0cmlkZSwgaW50IGJfbW9kZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0KQorCis7IHIwOiAqQWJvdmUKKzsgcjE6ICp5bGVmdAorOyByMjogbGVmdF9zdHJpZGUKKzsgcjM6IGJfbW9kZQorOyBzcCArICM0MDogZHN0Cis7IHNwICsgIzQ0OiBkc3Rfc3RyaWRlCis7IHNwICsgIzQ4OiB0b3BfbGVmdAorfHZwOF9pbnRyYTR4NF9wcmVkaWN0X2FybXY2fCBQUk9DCisgICAgcHVzaCAgICAgICAge3I0LXIxMiwgbHJ9CisKKyAgICBjbXAgICAgICAgICByMywgIzEwCisgICAgYWRkbHQgICAgICAgcGMsIHBjLCByMywgbHNsICMyICAgICAgIDsgcG9zaXRpb24gaW5kZXBlbmRlbnQgc3dpdGNoCisgICAgcG9wICAgICAgICAge3I0LXIxMiwgcGN9ICAgICAgICAgICAgIDsgZGVmYXVsdAorICAgIGIgICAgICAgICAgIGJfZGNfcHJlZAorICAgIGIgICAgICAgICAgIGJfdG1fcHJlZAorICAgIGIgICAgICAgICAgIGJfdmVfcHJlZAorICAgIGIgICAgICAgICAgIGJfaGVfcHJlZAorICAgIGIgICAgICAgICAgIGJfbGRfcHJlZAorICAgIGIgICAgICAgICAgIGJfcmRfcHJlZAorICAgIGIgICAgICAgICAgIGJfdnJfcHJlZAorICAgIGIgICAgICAgICAgIGJfdmxfcHJlZAorICAgIGIgICAgICAgICAgIGJfaGRfcHJlZAorICAgIGIgICAgICAgICAgIGJfaHVfcHJlZAorCitiX2RjX3ByZWQKKyAgICA7IGxvYWQgdmFsdWVzCisgICAgbGRyICAgICAgICAgcjgsIFtyMF0gICAgICAgICAgICAgICAgIDsgQWJvdmUKKyAgICBsZHJiICAgICAgICByNCwgW3IxXSwgcjIgICAgICAgICAgICAgOyBMZWZ0WzBdCisgICAgbW92ICAgICAgICAgcjksICMwCisgICAgbGRyYiAgICAgICAgcjUsIFtyMV0sIHIyICAgICAgICAgICAgIDsgTGVmdFsxXQorICAgIGxkcmIgICAgICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgICA7IExlZnRbMl0KKyAgICB1c2FkOCAgICAgICByMTIsIHI4LCByOQorICAgIGxkcmIgICAgICAgIHI3LCBbcjFdICAgICAgICAgICAgICAgICA7IExlZnRbM10KKworICAgIDsgY2FsY3VsYXRlIGRjCisgICAgYWRkICAgICAgICAgcjQsIHI0LCByNQorICAgIGFkZCAgICAgICAgIHI0LCByNCwgcjYKKyAgICBhZGQgICAgICAgICByNCwgcjQsIHI3CisgICAgYWRkICAgICAgICAgcjQsIHI0LCByMTIKKyAgICBhZGQgICAgICAgICByNCwgcjQsICM0CisgICAgbGRyICAgICAgICAgcjAsIFtzcCwgIzQ0XSAgICAgICAgICAgOyBkc3Rfc3RyaWRlCisgICAgbW92ICAgICAgICAgcjEyLCByNCwgYXNyICMzICAgICAgICAgOyAoZXhwZWN0ZWRfZGMgKyA0KSA+PiAzCisKKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgcjEyLCBsc2wgIzgKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdAorICAgIGFkZCAgICAgICAgIHIxMiwgcjEyLCByMTIsIGxzbCAjMTYKKworICAgIDsgc3RvcmUgdmFsdWVzCisgICAgc3RyICAgICAgICAgcjEyLCBbcjNdLCByMAorICAgIHN0ciAgICAgICAgIHIxMiwgW3IzXSwgcjAKKyAgICBzdHIgICAgICAgICByMTIsIFtyM10sIHIwCisgICAgc3RyICAgICAgICAgcjEyLCBbcjNdCisKKyAgICBwb3AgICAgICAgIHtyNC1yMTIsIHBjfQorCitiX3RtX3ByZWQKKyAgICBsZHIgICAgICAgICByOCwgW3IwXSAgICAgICAgICAgICAgICA7IEFib3ZlCisgICAgbGRyYiAgICAgICAgcjksIFtzcCwgIzQ4XSAgICAgICAgICAgOyB0b3BfbGVmdAorICAgIGxkcmIgICAgICAgIHI0LCBbcjFdLCByMiAgICAgICAgICAgIDsgTGVmdFswXQorICAgIGxkcmIgICAgICAgIHI1LCBbcjFdLCByMiAgICAgICAgICAgIDsgTGVmdFsxXQorICAgIGxkcmIgICAgICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgIDsgTGVmdFsyXQorICAgIGxkcmIgICAgICAgIHI3LCBbcjFdICAgICAgICAgICAgICAgIDsgTGVmdFszXQorICAgIGxkciAgICAgICAgIHIwLCBbc3AsICM0NF0gICAgICAgICAgIDsgZHN0X3N0cmlkZQorICAgIGxkciAgICAgICAgIHIzLCBbc3AsICM0MF0gICAgICAgICAgIDsgZHN0CisKKyAgICBhZGQgICAgICAgICByOSwgcjksIHI5LCBsc2wgIzE2ICAgICA7IFt0bHx0bF0KKyAgICB1eHRiMTYgICAgICByMTAsIHI4ICAgICAgICAgICAgICAgICA7IGFbMnwwXQorICAgIHV4dGIxNiAgICAgIHIxMSwgcjgsIHJvciAjOCAgICAgICAgIDsgYVszfDFdCisgICAgc3N1YjE2ICAgICAgcjEwLCByMTAsIHI5ICAgICAgICAgICAgOyBhWzJ8MF0gLSBbdGx8dGxdCisgICAgc3N1YjE2ICAgICAgcjExLCByMTEsIHI5ICAgICAgICAgICAgOyBhWzN8MV0gLSBbdGx8dGxdCisKKyAgICBhZGQgICAgICAgICByNCwgcjQsIHI0LCBsc2wgIzE2ICAgICA7IGxbMHwwXQorICAgIGFkZCAgICAgICAgIHI1LCByNSwgcjUsIGxzbCAjMTYgICAgIDsgbFsxfDFdCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByNiwgbHNsICMxNiAgICAgOyBsWzJ8Ml0KKyAgICBhZGQgICAgICAgICByNywgcjcsIHI3LCBsc2wgIzE2ICAgICA7IGxbM3wzXQorCisgICAgc2FkZDE2ICAgICAgcjEsIHI0LCByMTAgICAgICAgICAgICAgOyBsWzB8MF0gKyBhWzJ8MF0gLSBbdGx8dGxdCisgICAgc2FkZDE2ICAgICAgcjIsIHI0LCByMTEgICAgICAgICAgICAgOyBsWzB8MF0gKyBhWzN8MV0gLSBbdGx8dGxdCisgICAgdXNhdDE2ICAgICAgcjEsICM4LCByMQorICAgIHVzYXQxNiAgICAgIHIyLCAjOCwgcjIKKworICAgIHNhZGQxNiAgICAgIHI0LCByNSwgcjEwICAgICAgICAgICAgIDsgbFsxfDFdICsgYVsyfDBdIC0gW3RsfHRsXQorICAgIHNhZGQxNiAgICAgIHI1LCByNSwgcjExICAgICAgICAgICAgIDsgbFsxfDFdICsgYVszfDFdIC0gW3RsfHRsXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMSwgcjIsIGxzbCAjOCAgICAgOyBbM3wyfDF8MF0KKyAgICBzdHIgICAgICAgICByMTIsIFtyM10sIHIwCisKKyAgICB1c2F0MTYgICAgICByNCwgIzgsIHI0CisgICAgdXNhdDE2ICAgICAgcjUsICM4LCByNQorCisgICAgc2FkZDE2ICAgICAgcjEsIHI2LCByMTAgICAgICAgICAgICAgOyBsWzJ8Ml0gKyBhWzJ8MF0gLSBbdGx8dGxdCisgICAgc2FkZDE2ICAgICAgcjIsIHI2LCByMTEgICAgICAgICAgICAgOyBsWzJ8Ml0gKyBhWzN8MV0gLSBbdGx8dGxdCisKKyAgICBhZGQgICAgICAgICByMTIsIHI0LCByNSwgbHNsICM4ICAgICA7IFszfDJ8MXwwXQorICAgIHN0ciAgICAgICAgIHIxMiwgW3IzXSwgcjAKKworICAgIHVzYXQxNiAgICAgIHIxLCAjOCwgcjEKKyAgICB1c2F0MTYgICAgICByMiwgIzgsIHIyCisKKyAgICBzYWRkMTYgICAgICByNCwgcjcsIHIxMCAgICAgICAgICAgICA7IGxbM3wzXSArIGFbMnwwXSAtIFt0bHx0bF0KKyAgICBzYWRkMTYgICAgICByNSwgcjcsIHIxMSAgICAgICAgICAgICA7IGxbM3wzXSArIGFbM3wxXSAtIFt0bHx0bF0KKworICAgIGFkZCAgICAgICAgIHIxMiwgcjEsIHIyLCBsc2wgIzggICAgIDsgWzN8MnwxfDBdCisKKyAgICB1c2F0MTYgICAgICByNCwgIzgsIHI0CisgICAgdXNhdDE2ICAgICAgcjUsICM4LCByNQorCisgICAgc3RyICAgICAgICAgcjEyLCBbcjNdLCByMAorCisgICAgYWRkICAgICAgICAgcjEyLCByNCwgcjUsIGxzbCAjOCAgICAgOyBbM3wyfDF8MF0KKyAgICBzdHIgICAgICAgICByMTIsIFtyM10KKworICAgIHBvcCAgICAgICAge3I0LXIxMiwgcGN9CisKK2JfdmVfcHJlZAorICAgIGxkciAgICAgICAgIHI4LCBbcjBdICAgICAgICAgICAgICAgIDsgYVszfDJ8MXwwXQorICAgIGxkciAgICAgICAgIHIxMSwgYzAwRkYwMEZGCisgICAgbGRyYiAgICAgICAgcjksIFtzcCwgIzQ4XSAgICAgICAgICAgOyB0b3BfbGVmdAorICAgIGxkcmIgICAgICAgIHIxMCwgW3IwLCAjNF0gICAgICAgICAgIDsgYVs0XQorCisgICAgbGRyICAgICAgICAgcjAsIGMwMDAyMDAwMgorCisgICAgdXh0YjE2ICAgICAgcjQsIHI4ICAgICAgICAgICAgICAgICAgOyBhWzJ8MF0KKyAgICB1eHRiMTYgICAgICByNSwgcjgsIHJvciAjOCAgICAgICAgICA7IGFbM3wxXQorICAgIGxkciAgICAgICAgIHIyLCBbc3AsICM0NF0gICAgICAgICAgIDsgZHN0X3N0cmlkZQorICAgIHBraGJ0ICAgICAgIHI5LCByOSwgcjUsIGxzbCAjMTYgICAgIDsgYVsxfC0xXQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCByNCwgbHNsICMxICAgICAgO1thWzFdKzIqYVsyXSAgICAgICB8IHRsKzIqYVswXSAgICAgICBdCisgICAgdXh0YWIxNiAgICAgcjksIHI5LCByNSAgICAgICAgICAgICAgO1thWzFdKzIqYVsyXSthWzNdICB8IHRsKzIqYVswXSthWzFdICBdCisgICAgbGRyICAgICAgICAgcjMsIFtzcCwgIzQwXSAgICAgICAgICAgOyBkc3QKKyAgICB1eHRhYjE2ICAgICByOSwgcjksIHIwICAgICAgICAgICAgICA7W2FbMV0rMiphWzJdK2FbM10rMnwgdGwrMiphWzBdK2FbMV0rMl0KKworICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEwLCBsc2wgIzE2ICAgIDtbYVs0XSsyICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgMl0KKyAgICBhZGQgICAgICAgICByMCwgcjAsIHI0LCBhc3IgIzE2ICAgICA7W2FbNF0rMiAgICAgICAgICAgIHwgICAgICAgICAgICBhWzJdKzJdCisgICAgYWRkICAgICAgICAgcjAsIHIwLCByNSwgbHNsICMxICAgICAgO1thWzRdKzIqYVszXSsyICAgICB8ICAgICBhWzJdKzIqYVsxXSsyXQorICAgIHVhZGQxNiAgICAgIHI0LCByNCwgcjAgICAgICAgICAgICAgIDtbYVs0XSsyKmFbM10rYVsyXSsyfGFbMl0rMiphWzFdK2FbMF0rMl0KKworICAgIGFuZCAgICAgICAgIHI5LCByMTEsIHI5LCBhc3IgIzIKKyAgICBhbmQgICAgICAgICByNCwgcjExLCByNCwgYXNyICMyCisgICAgYWRkICAgICAgICAgcjksIHI5LCByNCwgbHNsICM4CisKKyAgICA7IHN0b3JlIHZhbHVlcworICAgIHN0ciAgICAgICAgIHI5LCBbcjNdLCByMgorICAgIHN0ciAgICAgICAgIHI5LCBbcjNdLCByMgorICAgIHN0ciAgICAgICAgIHI5LCBbcjNdLCByMgorICAgIHN0ciAgICAgICAgIHI5LCBbcjNdCisKKyAgICBwb3AgICAgICAgIHtyNC1yMTIsIHBjfQorCisKK2JfaGVfcHJlZAorICAgIGxkcmIgICAgICAgIHI0LCBbcjFdLCByMiAgICAgICAgICAgIDsgTGVmdFswXQorICAgIGxkcmIgICAgICAgIHI4LCBbc3AsICM0OF0gICAgICAgICAgIDsgdG9wX2xlZnQKKyAgICBsZHJiICAgICAgICByNSwgW3IxXSwgcjIgICAgICAgICAgICA7IExlZnRbMV0KKyAgICBsZHJiICAgICAgICByNiwgW3IxXSwgcjIgICAgICAgICAgICA7IExlZnRbMl0KKyAgICBsZHJiICAgICAgICByNywgW3IxXSAgICAgICAgICAgICAgICA7IExlZnRbM10KKworICAgIGFkZCAgICAgICAgIHI4LCByOCwgcjQgICAgICAgICAgICAgIDsgdGwgICArIGxbMF0KKyAgICBhZGQgICAgICAgICByOSwgcjQsIHI1ICAgICAgICAgICAgICA7IGxbMF0gKyBsWzFdCisgICAgYWRkICAgICAgICAgcjEwLCByNSwgcjYgICAgICAgICAgICAgOyBsWzFdICsgbFsyXQorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsIHI3ICAgICAgICAgICAgIDsgbFsyXSArIGxbM10KKworICAgIG1vdiAgICAgICAgIHIwLCAjMjw8MTQKKworICAgIGFkZCAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgIDsgdGwgKyAyKmxbMF0gKyBsWzFdCisgICAgYWRkICAgICAgICAgcjQsIHI5LCByMTAgICAgICAgICAgICAgOyBsWzBdICsgMipsWzFdICsgbFsyXQorICAgIGFkZCAgICAgICAgIHI1LCByMTAsIHIxMSAgICAgICAgICAgIDsgbFsxXSArIDIqbFsyXSArIGxbM10KKyAgICBhZGQgICAgICAgICByNiwgcjExLCByNywgbHNsICMxICAgICA7IGxbMl0gKyAyKmxbM10gKyBsWzNdCisKKworICAgIGFkZCAgICAgICAgIHI4LCByMCwgcjgsIGxzbCAjMTQgICAgIDsgKHRsICsgMipsWzBdICsgbFsxXSk+PjIgaW4gdG9wIGhhbGYKKyAgICBhZGQgICAgICAgICByOSwgcjAsIHI0LCBsc2wgIzE0ICAgICA7IChsWzBdICsgMipsWzFdICsgbFsyXSk+PjIgaW4gdG9wIGhhbGYKKyAgICBhZGQgICAgICAgICByMTAscjAsIHI1LCBsc2wgIzE0ICAgICA7IChsWzFdICsgMipsWzJdICsgbFszXSk+PjIgaW4gdG9wIGhhbGYKKyAgICBhZGQgICAgICAgICByMTEscjAsIHI2LCBsc2wgIzE0ICAgICA7IChsWzJdICsgMipsWzNdICsgbFszXSk+PjIgaW4gdG9wIGhhbGYKKworICAgIHBraHRiICAgICAgIHI4LCByOCwgcjgsIGFzciAjMTYgICAgIDsgbFstfDB8LXwwXQorICAgIHBraHRiICAgICAgIHI5LCByOSwgcjksIGFzciAjMTYgICAgIDsgbFstfDF8LXwxXQorICAgIHBraHRiICAgICAgIHIxMCwgcjEwLCByMTAsIGFzciAjMTYgIDsgbFstfDJ8LXwyXQorICAgIHBraHRiICAgICAgIHIxMSwgcjExLCByMTEsIGFzciAjMTYgIDsgbFstfDN8LXwzXQorCisgICAgbGRyICAgICAgICAgcjAsIFtzcCwgIzQ0XSAgICAgICAgICAgOyBkc3Rfc3RyaWRlCisgICAgbGRyICAgICAgICAgcjMsIFtzcCwgIzQwXSAgICAgICAgICAgOyBkc3QKKworICAgIGFkZCAgICAgICAgIHI4LCByOCwgcjgsIGxzbCAjOCAgICAgIDsgbFswfDB8MHwwXQorICAgIGFkZCAgICAgICAgIHI5LCByOSwgcjksIGxzbCAjOCAgICAgIDsgbFsxfDF8MXwxXQorICAgIGFkZCAgICAgICAgIHIxMCwgcjEwLCByMTAsIGxzbCAjOCAgIDsgbFsyfDJ8MnwyXQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByMTEsIGxzbCAjOCAgIDsgbFszfDN8M3wzXQorCisgICAgOyBzdG9yZSB2YWx1ZXMKKyAgICBzdHIgICAgICAgICByOCwgW3IzXSwgcjAKKyAgICBzdHIgICAgICAgICByOSwgW3IzXSwgcjAKKyAgICBzdHIgICAgICAgICByMTAsIFtyM10sIHIwCisgICAgc3RyICAgICAgICAgcjExLCBbcjNdCisKKyAgICBwb3AgICAgICAgIHtyNC1yMTIsIHBjfQorCitiX2xkX3ByZWQKKyAgICBsZHIgICAgICAgICByNCwgW3IwXSAgICAgICAgICAgICAgICA7IEFib3ZlWzAtM10KKyAgICBsZHIgICAgICAgICByMTIsIGMwMDAyMDAwMgorICAgIGxkciAgICAgICAgIHI1LCBbcjAsICM0XSAgICAgICAgICAgIDsgQWJvdmVbNC03XQorICAgIGxkciAgICAgICAgIGxyLCAgYzAwRkYwMEZGCisKKyAgICB1eHRiMTYgICAgICByNiwgcjQgICAgICAgICAgICAgICAgICA7IGFbMnwwXQorICAgIHV4dGIxNiAgICAgIHI3LCByNCwgcm9yICM4ICAgICAgICAgIDsgYVszfDFdCisgICAgdXh0YjE2ICAgICAgcjgsIHI1ICAgICAgICAgICAgICAgICAgOyBhWzZ8NF0KKyAgICB1eHRiMTYgICAgICByOSwgcjUsIHJvciAjOCAgICAgICAgICA7IGFbN3w1XQorICAgIHBraHRiICAgICAgIHIxMCwgcjYsIHI4ICAgICAgICAgICAgIDsgYVsyfDRdCisgICAgcGtodGIgICAgICAgcjExLCByNywgcjkgICAgICAgICAgICAgOyBhWzN8NV0KKworICAgIGFkZCAgICAgICAgIHI0LCByNiwgcjcsIGxzbCAjMSAgICAgIDsgW2EyKzIqYTMgICAgICB8ICAgICAgYTArMiphMV0KKyAgICBhZGQgICAgICAgICByNCwgcjQsIHIxMCwgcm9yICMxNiAgICA7IFthMisyKmEzK2E0ICAgfCAgIGEwKzIqYTErYTJdCisgICAgdXh0YWIxNiAgICAgcjQsIHI0LCByMTIgICAgICAgICAgICAgOyBbYTIrMiphMythNCsyIHwgYTArMiphMSthMisyXQorCisgICAgYWRkICAgICAgICAgcjUsIHI3LCByMTAsIHJvciAjMTUgICAgOyBbYTMrMiphNCAgICAgIHwgICAgICBhMSsyKmEyXQorICAgIGFkZCAgICAgICAgIHI1LCByNSwgcjExLCByb3IgIzE2ICAgIDsgW2EzKzIqYTQrYTUgICB8ICAgYTErMiphMithM10KKyAgICB1eHRhYjE2ICAgICByNSwgcjUsIHIxMiAgICAgICAgICAgICA7IFthMysyKmE0K2E1KzIgfCBhMSsyKmEyK2EzKzJdCisKKyAgICBwa2h0YiAgICAgICByNywgcjksIHI4LCBhc3IgIzE2CisgICAgYWRkICAgICAgICAgcjYsIHI4LCByOSwgbHNsICMxICAgICAgOyBbYTYrMiphNyAgICAgIHwgICAgICBhNCsyKmE1XQorICAgIHVhZGQxNiAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgIDsgW2E2KzIqYTcrYTcgICB8ICAgYTQrMiphNSthNl0KKyAgICB1eHRhYjE2ICAgICByNiwgcjYsIHIxMiAgICAgICAgICAgICA7IFthNisyKmE3K2E3KzIgfCBhNCsyKmE1K2E2KzJdCisKKyAgICB1eHRoICAgICAgICByNywgcjkgICAgICAgICAgICAgICAgICA7IFsgICAgICAgICAgICAgICAgICAgICAgICAgYTVdCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOCwgYXNyICMxNSAgICAgOyBbICAgICAgICAgICAgICAgICAgICBhNSsyKmE2XQorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjksIGFzciAjMTYgICAgIDsgWyAgICAgICAgICAgICAgICAgYTUrMiphNithN10KKyAgICB1eHRhaCAgICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICA7IFsgICAgICAgICAgICAgICBhNSsyKmE2K2E3KzJdCisKKyAgICBsZHIgICAgICAgICByMCwgW3NwLCAjNDRdICAgICAgICAgICA7IGRzdF9zdHJpZGUKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdAorCisgICAgOyBzY2FsZSBkb3duCisgICAgYW5kICAgICAgICAgcjQsIGxyLCByNCwgYXNyICMyCisgICAgYW5kICAgICAgICAgcjUsIGxyLCByNSwgYXNyICMyCisgICAgYW5kICAgICAgICAgcjYsIGxyLCByNiwgYXNyICMyCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBhc3IgIzIKKworICAgIGFkZCAgICAgICAgIHI4LCByNCwgcjUsIGxzbCAjOCAgICAgIDsgWzN8MnwxfDBdCisgICAgc3RyICAgICAgICAgcjgsIFtyM10sIHIwCisKKyAgICBtb3YgICAgICAgICByOSwgcjgsIGxzciAjOAorICAgIGFkZCAgICAgICAgIHI5LCByOSwgcjYsIGxzbCAjMjQgICAgIDsgWzR8M3wyfDFdCisgICAgc3RyICAgICAgICAgcjksIFtyM10sIHIwCisKKyAgICBtb3YgICAgICAgICByMTAsIHI5LCBsc3IgIzgKKyAgICBhZGQgICAgICAgICByMTAsIHIxMCwgcjcsIGxzbCAjMjQgICA7IFs1fDR8M3wyXQorICAgIHN0ciAgICAgICAgIHIxMCwgW3IzXSwgcjAKKworICAgIG1vdiAgICAgICAgIHI2LCByNiwgbHNyICMxNgorICAgIG1vdiAgICAgICAgIHIxMSwgcjEwLCBsc3IgIzgKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjYsIGxzbCAjMjQgICA7IFs2fDV8NHwzXQorICAgIHN0ciAgICAgICAgIHIxMSwgW3IzXQorCisgICAgcG9wICAgICAgICB7cjQtcjEyLCBwY30KKworYl9yZF9wcmVkCisgICAgbGRyYiAgICAgICAgcjcsIFtyMV0sIHIyICAgICAgICAgICAgOyBsWzBdID0gcHBbM10KKyAgICBsZHIgICAgICAgICBsciwgW3IwXSAgICAgICAgICAgICAgICA7IEFib3ZlID0gcHBbOHw3fDZ8NV0KKyAgICBsZHJiICAgICAgICByOCwgW3NwLCAjNDhdICAgICAgICAgICA7IHRsICAgPSBwcFs0XQorICAgIGxkcmIgICAgICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgIDsgbFsxXSA9IHBwWzJdCisgICAgbGRyYiAgICAgICAgcjUsIFtyMV0sIHIyICAgICAgICAgICAgOyBsWzJdID0gcHBbMV0KKyAgICBsZHJiICAgICAgICByNCwgW3IxXSwgcjIgICAgICAgICAgICA7IGxbM10gPSBwcFswXQorCisKKyAgICB1eHRiMTYgICAgICByOSwgbHIgICAgICAgICAgICAgICAgICA7IHBbN3w1XQorICAgIHV4dGIxNiAgICAgIHIxMCwgbHIsIHJvciAjOCAgICAgICAgIDsgcFs4fDZdCisgICAgYWRkICAgICAgICAgcjQsIHI0LCByNiwgbHNsICMxNiAgICAgOyBwWzJ8MF0KKyAgICBhZGQgICAgICAgICByNSwgcjUsIHI3LCBsc2wgIzE2ICAgICA7IHBbM3wxXQorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjgsIGxzbCAjMTYgICAgIDsgcFs0fDJdCisgICAgcGtoYnQgICAgICAgcjcsIHI3LCByOSwgbHNsICMxNiAgICAgOyBwWzV8M10KKyAgICBwa2hidCAgICAgICByOCwgcjgsIHIxMCwgbHNsICMxNiAgICA7IHBbNnw0XQorCisgICAgbGRyICAgICAgICAgcjEyLCBjMDAwMjAwMDIKKyAgICBsZHIgICAgICAgICBsciwgIGMwMEZGMDBGRgorCisgICAgYWRkICAgICAgICAgcjQsIHI0LCByNSwgbHNsICMxICAgICAgOyBbcDIrMipwMyAgICAgIHwgICAgICBwMCsyKnAxXQorICAgIGFkZCAgICAgICAgIHI0LCByNCwgcjYgICAgICAgICAgICAgIDsgW3AyKzIqcDMrcDQgICB8ICAgcDArMipwMStwMl0KKyAgICB1eHRhYjE2ICAgICByNCwgcjQsIHIxMiAgICAgICAgICAgICA7IFtwMisyKnAzK3A0KzIgfCBwMCsyKnAxK3AyKzJdCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsIHI2LCBsc2wgIzEgICAgICA7IFtwMysyKnA0ICAgICAgfCAgICAgIHAxKzIqcDJdCisgICAgYWRkICAgICAgICAgcjUsIHI1LCByNyAgICAgICAgICAgICAgOyBbcDMrMipwNCtwNSAgIHwgICBwMSsyKnAyK3AzXQorICAgIHV4dGFiMTYgICAgIHI1LCByNSwgcjEyICAgICAgICAgICAgIDsgW3AzKzIqcDQrcDUrMiB8IHAxKzIqcDIrcDMrMl0KKworICAgIGFkZCAgICAgICAgIHI2LCByNywgcjgsIGxzbCAjMSAgICAgIDsgW3A1KzIqcDYgICAgICB8ICAgICAgcDMrMipwNF0KKyAgICBhZGQgICAgICAgICByNiwgcjYsIHI5ICAgICAgICAgICAgICA7IFtwNSsyKnA2K3A3ICAgfCAgIHAzKzIqcDQrcDVdCisgICAgdXh0YWIxNiAgICAgcjYsIHI2LCByMTIgICAgICAgICAgICAgOyBbcDUrMipwNitwNysyIHwgcDMrMipwNCtwNSsyXQorCisgICAgYWRkICAgICAgICAgcjcsIHI4LCByOSwgbHNsICMxICAgICAgOyBbcDYrMipwNyAgICAgIHwgICAgICBwNCsyKnA1XQorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIDsgW3A2KzIqcDcrcDggICB8ICAgcDQrMipwNStwNl0KKyAgICB1eHRhYjE2ICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICA7IFtwNisyKnA3K3A4KzIgfCBwNCsyKnA1K3A2KzJdCisKKyAgICBsZHIgICAgICAgICByMCwgW3NwLCAjNDRdICAgICAgICAgICA7IGRzdF9zdHJpZGUKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdAorCisgICAgOyBzY2FsZSBkb3duCisgICAgYW5kICAgICAgICAgcjcsIGxyLCByNywgYXNyICMyCisgICAgYW5kICAgICAgICAgcjYsIGxyLCByNiwgYXNyICMyCisgICAgYW5kICAgICAgICAgcjUsIGxyLCByNSwgYXNyICMyCisgICAgYW5kICAgICAgICAgcjQsIGxyLCByNCwgYXNyICMyCisKKyAgICBhZGQgICAgICAgICByOCwgcjYsIHI3LCBsc2wgIzggICAgICA7IFs2fDV8NHwzXQorICAgIHN0ciAgICAgICAgIHI4LCBbcjNdLCByMAorCisgICAgbW92ICAgICAgICAgcjksIHI4LCBsc2wgIzggICAgICAgICAgOyBbNXw0fDN8LV0KKyAgICB1eHRhYiAgICAgICByOSwgcjksIHI0LCByb3IgIzE2ICAgICA7IFs1fDR8M3wyXQorICAgIHN0ciAgICAgICAgIHI5LCBbcjNdLCByMAorCisgICAgbW92ICAgICAgICAgcjEwLCByOSwgbHNsICM4ICAgICAgICAgOyBbNHwzfDJ8LV0KKyAgICB1eHRhYiAgICAgICByMTAsIHIxMCwgcjUgICAgICAgICAgICA7IFs0fDN8MnwxXQorICAgIHN0ciAgICAgICAgIHIxMCwgW3IzXSwgcjAKKworICAgIG1vdiAgICAgICAgIHIxMSwgcjEwLCBsc2wgIzggICAgICAgIDsgWzN8MnwxfC1dCisgICAgdXh0YWIgICAgICAgcjExLCByMTEsIHI0ICAgICAgICAgICAgOyBbM3wyfDF8MF0KKyAgICBzdHIgICAgICAgICByMTEsIFtyM10KKworICAgIHBvcCAgICAgICAge3I0LXIxMiwgcGN9CisKK2JfdnJfcHJlZAorICAgIGxkcmIgICAgICAgIHI3LCBbcjFdLCByMiAgICAgICAgICAgIDsgbFswXSA9IHBwWzNdCisgICAgbGRyICAgICAgICAgbHIsIFtyMF0gICAgICAgICAgICAgICAgOyBBYm92ZSA9IHBwWzh8N3w2fDVdCisgICAgbGRyYiAgICAgICAgcjgsIFtzcCwgIzQ4XSAgICAgICAgICAgOyB0bCAgID0gcHBbNF0KKyAgICBsZHJiICAgICAgICByNiwgW3IxXSwgcjIgICAgICAgICAgICA7IGxbMV0gPSBwcFsyXQorICAgIGxkcmIgICAgICAgIHI1LCBbcjFdLCByMiAgICAgICAgICAgIDsgbFsyXSA9IHBwWzFdCisgICAgbGRyYiAgICAgICAgcjQsIFtyMV0gICAgICAgICAgICAgICAgOyBsWzNdID0gcHBbMF0KKworICAgIGFkZCAgICAgICAgIHI1LCByNSwgcjcsIGxzbCAjMTYgICAgIDsgcFszfDFdCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByOCwgbHNsICMxNiAgICAgOyBwWzR8Ml0KKyAgICB1eHRiMTYgICAgICByOSwgbHIgICAgICAgICAgICAgICAgICA7IHBbN3w1XQorICAgIHV4dGIxNiAgICAgIHIxMCwgbHIsIHJvciAjOCAgICAgICAgIDsgcFs4fDZdCisgICAgcGtoYnQgICAgICAgcjcsIHI3LCByOSwgbHNsICMxNiAgICAgOyBwWzV8M10KKyAgICBwa2hidCAgICAgICByOCwgcjgsIHIxMCwgbHNsICMxNiAgICA7IHBbNnw0XQorCisgICAgbGRyICAgICAgICAgcjQsICBjMDAwMTAwMDEKKyAgICBsZHIgICAgICAgICByMTIsIGMwMDAyMDAwMgorICAgIGxkciAgICAgICAgIGxyLCAgYzAwRkYwMEZGCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsIHI2LCBsc2wgIzEgICAgICA7IFtwMysyKnA0ICAgICAgfCAgICAgIHAxKzIqcDJdCisgICAgYWRkICAgICAgICAgcjUsIHI1LCByNyAgICAgICAgICAgICAgOyBbcDMrMipwNCtwNSAgIHwgICBwMSsyKnAyK3AzXQorICAgIHV4dGFiMTYgICAgIHI1LCByNSwgcjEyICAgICAgICAgICAgIDsgW3AzKzIqcDQrcDUrMiB8IHAxKzIqcDIrcDMrMl0KKworICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjcsIGxzbCAjMSAgICAgIDsgW3A0KzIqcDUgICAgICB8ICAgICAgcDIrMipwM10KKyAgICBhZGQgICAgICAgICByNiwgcjYsIHI4ICAgICAgICAgICAgICA7IFtwNCsyKnA1K3A2ICAgfCAgIHAyKzIqcDMrcDRdCisgICAgdXh0YWIxNiAgICAgcjYsIHI2LCByMTIgICAgICAgICAgICAgOyBbcDQrMipwNStwNisyIHwgcDIrMipwMytwNCsyXQorCisgICAgdWFkZDE2ICAgICAgcjExLCByOCwgcjkgICAgICAgICAgICAgOyBbcDYrcDcgICAgICAgIHwgICAgICAgIHA0K3A1XQorICAgIHVoYWRkMTYgICAgIHIxMSwgcjExLCByNCAgICAgICAgICAgIDsgWyhwNitwNysxKT4+MSB8IChwNCtwNSsxKT4+MV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFtGfEVdCisKKyAgICBhZGQgICAgICAgICByNywgcjcsIHI4LCBsc2wgIzEgICAgICA7IFtwNSsyKnA2ICAgICAgfCAgICAgIHAzKzIqcDRdCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOSAgICAgICAgICAgICAgOyBbcDUrMipwNitwNyAgIHwgICBwMysyKnA0K3A1XQorICAgIHV4dGFiMTYgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgIDsgW3A1KzIqcDYrcDcrMiB8IHAzKzIqcDQrcDUrMl0KKworICAgIHVhZGQxNiAgICAgIHIyLCByOSwgcjEwICAgICAgICAgICAgIDsgW3A3K3A4ICAgICAgICB8ICAgICAgICBwNStwNl0KKyAgICB1aGFkZDE2ICAgICByMiwgcjIsIHI0ICAgICAgICAgICAgICA7IFsocDcrcDgrMSk+PjEgfCAocDUrcDYrMSk+PjFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBbSnxJXQorCisgICAgYWRkICAgICAgICAgcjgsIHI4LCByOSwgbHNsICMxICAgICAgOyBbcDYrMipwNyAgICAgIHwgICAgICBwNCsyKnA1XQorICAgIGFkZCAgICAgICAgIHI4LCByOCwgcjEwICAgICAgICAgICAgIDsgW3A2KzIqcDcrcDggICB8ICAgcDQrMipwNStwNl0KKyAgICB1eHRhYjE2ICAgICByOCwgcjgsIHIxMiAgICAgICAgICAgICA7IFtwNisyKnA3K3A4KzIgfCBwNCsyKnA1K3A2KzJdCisKKyAgICBsZHIgICAgICAgICByMCwgW3NwLCAjNDRdICAgICAgICAgICA7IGRzdF9zdHJpZGUKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdAorCisgICAgOyBzY2FsZSBkb3duCisgICAgYW5kICAgICAgICAgcjUsIGxyLCByNSwgYXNyICMyICAgICAgOyBbQnxBXQorICAgIGFuZCAgICAgICAgIHI2LCBsciwgcjYsIGFzciAjMiAgICAgIDsgW0R8Q10KKyAgICBhbmQgICAgICAgICByNywgbHIsIHI3LCBhc3IgIzIgICAgICA7IFtIfEddCisgICAgYW5kICAgICAgICAgcjgsIGxyLCByOCwgYXNyICMyICAgICAgOyBbTHxLXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMTEsIHIyLCBsc2wgIzggICAgOyBbSnxGfEl8RV0KKyAgICBzdHIgICAgICAgICByMTIsIFtyM10sIHIwCisKKyAgICBhZGQgICAgICAgICByMTIsIHI3LCByOCwgbHNsICM4ICAgICA7IFtMfEh8S3xHXQorICAgIHN0ciAgICAgICAgIHIxMiwgW3IzXSwgcjAKKworICAgIHBraGJ0ICAgICAgIHIyLCByNiwgcjIsIGxzbCAjMTYgICAgIDsgWy18SXwtfENdCisgICAgYWRkICAgICAgICAgcjIsIHIyLCByMTEsIGxzbCAjOCAgICAgOyBbRnxJfEV8Q10KKworICAgIHBraHRiICAgICAgIHIxMiwgcjYsIHI1ICAgICAgICAgICAgIDsgWy18RHwtfEFdCisgICAgcGtodGIgICAgICAgcjEwLCByNywgcjUsIGFzciAjMTYgICAgOyBbLXxIfC18Ql0KKyAgICBzdHIgICAgICAgICByMiwgW3IzXSwgcjAKKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgcjEwLCBsc2wgIzggICA7IFtIfER8QnxBXQorICAgIHN0ciAgICAgICAgIHIxMiwgW3IzXQorCisgICAgcG9wICAgICAgICB7cjQtcjEyLCBwY30KKworYl92bF9wcmVkCisgICAgbGRyICAgICAgICAgcjQsIFtyMF0gICAgICAgICAgICAgICAgOyBbM3wyfDF8MF0gPSBBYm92ZVswLTNdCisgICAgbGRyICAgICAgICAgcjEyLCBjMDAwMjAwMDIKKyAgICBsZHIgICAgICAgICByNSwgW3IwLCAjNF0gICAgICAgICAgICA7IFs3fDZ8NXw0XSA9IEFib3ZlWzQtN10KKyAgICBsZHIgICAgICAgICBsciwgIGMwMEZGMDBGRgorICAgIGxkciAgICAgICAgIHIyLCAgYzAwMDEwMDAxCisKKyAgICBtb3YgICAgICAgICByMCwgcjQsIGxzciAjMTYgICAgICAgICA7IFstfC18M3wyXQorICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjUsIGxzbCAjMTYgICAgIDsgWzV8NHwzfDJdCisgICAgdXh0YjE2ICAgICAgcjYsIHI0ICAgICAgICAgICAgICAgICAgOyBbMnwwXQorICAgIHV4dGIxNiAgICAgIHI3LCByNCwgcm9yICM4ICAgICAgICAgIDsgWzN8MV0KKyAgICB1eHRiMTYgICAgICByOCwgcjAgICAgICAgICAgICAgICAgICA7IFs0fDJdCisgICAgdXh0YjE2ICAgICAgcjksIHIwLCByb3IgIzggICAgICAgICAgOyBbNXwzXQorICAgIHV4dGIxNiAgICAgIHIxMCwgcjUgICAgICAgICAgICAgICAgIDsgWzZ8NF0KKyAgICB1eHRiMTYgICAgICByMTEsIHI1LCByb3IgIzggICAgICAgICA7IFs3fDVdCisKKyAgICB1YWRkMTYgICAgICByNCwgcjYsIHI3ICAgICAgICAgICAgICA7IFtwMitwMyAgICAgICAgfCAgICAgICAgcDArcDFdCisgICAgdWhhZGQxNiAgICAgcjQsIHI0LCByMiAgICAgICAgICAgICAgOyBbKHAyK3AzKzEpPj4xIHwgKHAwK3AxKzEpPj4xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgW0J8QV0KKworICAgIGFkZCAgICAgICAgIHI1LCByNiwgcjcsIGxzbCAjMSAgICAgIDsgW3AyKzIqcDMgICAgICB8ICAgICAgcDArMipwMV0KKyAgICBhZGQgICAgICAgICByNSwgcjUsIHI4ICAgICAgICAgICAgICA7IFtwMisyKnAzK3A0ICAgfCAgIHAwKzIqcDErcDJdCisgICAgdXh0YWIxNiAgICAgcjUsIHI1LCByMTIgICAgICAgICAgICAgOyBbcDIrMipwMytwNCsyIHwgcDArMipwMStwMisyXQorCisgICAgdWFkZDE2ICAgICAgcjYsIHI3LCByOCAgICAgICAgICAgICAgOyBbcDMrcDQgICAgICAgIHwgICAgICAgIHAxK3AyXQorICAgIHVoYWRkMTYgICAgIHI2LCByNiwgcjIgICAgICAgICAgICAgIDsgWyhwMytwNCsxKT4+MSB8IChwMStwMisxKT4+MV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFtGfEVdCisKKyAgICBhZGQgICAgICAgICByNywgcjcsIHI4LCBsc2wgIzEgICAgICA7IFtwMysyKnA0ICAgICAgfCAgICAgIHAxKzIqcDJdCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOSAgICAgICAgICAgICAgOyBbcDMrMipwNCtwNSAgIHwgICBwMSsyKnAyK3AzXQorICAgIHV4dGFiMTYgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgIDsgW3AzKzIqcDQrcDUrMiB8IHAxKzIqcDIrcDMrMl0KKworICAgIGFkZCAgICAgICAgIHI4LCByOCwgcjksIGxzbCAjMSAgICAgIDsgW3A0KzIqcDUgICAgICB8ICAgICAgcDIrMipwM10KKyAgICBhZGQgICAgICAgICByOCwgcjgsIHIxMCAgICAgICAgICAgICA7IFtwNCsyKnA1K3A2ICAgfCAgIHAyKzIqcDMrcDRdCisgICAgdXh0YWIxNiAgICAgcjgsIHI4LCByMTIgICAgICAgICAgICAgOyBbcDQrMipwNStwNisyIHwgcDIrMipwMytwNCsyXQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCByMTAsIGxzbCAjMSAgICAgOyBbcDUrMipwNiAgICAgIHwgICAgICBwMysyKnA0XQorICAgIGFkZCAgICAgICAgIHI5LCByOSwgcjExICAgICAgICAgICAgIDsgW3A1KzIqcDYrcDcgICB8ICAgcDMrMipwNCtwNV0KKyAgICB1eHRhYjE2ICAgICByOSwgcjksIHIxMiAgICAgICAgICAgICA7IFtwNSsyKnA2K3A3KzIgfCBwMysyKnA0K3A1KzJdCisKKyAgICBsZHIgICAgICAgICByMCwgW3NwLCAjNDRdICAgICAgICAgICA7IGRzdF9zdHJpZGUKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdAorCisgICAgOyBzY2FsZSBkb3duCisgICAgYW5kICAgICAgICAgcjUsIGxyLCByNSwgYXNyICMyICAgICAgOyBbRHxDXQorICAgIGFuZCAgICAgICAgIHI3LCBsciwgcjcsIGFzciAjMiAgICAgIDsgW0h8R10KKyAgICBhbmQgICAgICAgICByOCwgbHIsIHI4LCBhc3IgIzIgICAgICA7IFtJfERdCisgICAgYW5kICAgICAgICAgcjksIGxyLCByOSwgYXNyICMyICAgICAgOyBbSnxIXQorCisgICAgYWRkICAgICAgICAgcjEwLCByNCwgcjYsIGxzbCAjOCAgICAgOyBbRnxCfEV8QV0KKyAgICBzdHIgICAgICAgICByMTAsIFtyM10sIHIwCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsIHI3LCBsc2wgIzggICAgICA7IFtIfEN8R3xEXQorICAgIHN0ciAgICAgICAgIHI1LCBbcjNdLCByMAorCisgICAgcGtodGIgICAgICAgcjEyLCByOCwgcjQsIGFzciAjMTYgICAgOyBbLXxJfC18Ql0KKyAgICBwa2h0YiAgICAgICByMTAsIHI5LCByOCAgICAgICAgICAgICA7IFstfEp8LXxEXQorCisgICAgYWRkICAgICAgICAgcjEyLCByNiwgcjEyLCBsc2wgIzggICAgOyBbSXxGfEJ8RV0KKyAgICBzdHIgICAgICAgICByMTIsIFtyM10sIHIwCisKKyAgICBhZGQgICAgICAgICByMTAsIHI3LCByMTAsIGxzbCAjOCAgICA7IFtKfEh8RHxHXQorICAgIHN0ciAgICAgICAgIHIxMCwgW3IzXQorCisgICAgcG9wICAgICAgICB7cjQtcjEyLCBwY30KKworYl9oZF9wcmVkCisgICAgbGRyYiAgICAgICAgcjcsIFtyMV0sIHIyICAgICAgICAgICAgOyBsWzBdID0gcHBbM10KKyAgICBsZHIgICAgICAgICBsciwgW3IwXSAgICAgICAgICAgICAgICA7IEFib3ZlID0gcHBbOHw3fDZ8NV0KKyAgICBsZHJiICAgICAgICByOCwgW3NwLCAjNDhdICAgICAgICAgICA7IHRsICAgPSBwcFs0XQorICAgIGxkcmIgICAgICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgIDsgbFsxXSA9IHBwWzJdCisgICAgbGRyYiAgICAgICAgcjUsIFtyMV0sIHIyICAgICAgICAgICAgOyBsWzJdID0gcHBbMV0KKyAgICBsZHJiICAgICAgICByNCwgW3IxXSAgICAgICAgICAgICAgICA7IGxbM10gPSBwcFswXQorCisgICAgdXh0YjE2ICAgICAgcjksIGxyICAgICAgICAgICAgICAgICAgOyBwWzd8NV0KKyAgICB1eHRiMTYgICAgICByMTAsIGxyLCByb3IgIzggICAgICAgICA7IHBbOHw2XQorCisgICAgYWRkICAgICAgICAgcjQsIHI0LCByNSwgbHNsICMxNiAgICAgOyBwWzF8MF0KKyAgICBhZGQgICAgICAgICByNSwgcjUsIHI2LCBsc2wgIzE2ICAgICA7IHBbMnwxXQorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjcsIGxzbCAjMTYgICAgIDsgcFszfDJdCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOCwgbHNsICMxNiAgICAgOyBwWzR8M10KKworICAgIGxkciAgICAgICAgIHIxMiwgYzAwMDIwMDAyCisgICAgbGRyICAgICAgICAgbHIsICBjMDBGRjAwRkYKKyAgICBsZHIgICAgICAgICByMiwgIGMwMDAxMDAwMQorCisgICAgcGtodGIgICAgICAgcjgsIHI3LCByOSAgICAgICAgICAgICAgOyBwWzR8NV0KKyAgICBwa2h0YiAgICAgICByMSwgcjksIHIxMCAgICAgICAgICAgICA7IHBbN3w2XQorICAgIHBraGJ0ICAgICAgIHIxMCwgcjgsIHIxMCwgbHNsICMxNiAgIDsgcFs2fDVdCisKKyAgICB1YWRkMTYgICAgICByMTEsIHI0LCByNSAgICAgICAgICAgICA7IFtwMStwMiAgICAgICAgfCAgICAgICAgcDArcDFdCisgICAgdWhhZGQxNiAgICAgcjExLCByMTEsIHIyICAgICAgICAgICAgOyBbKHAxK3AyKzEpPj4xIHwgKHAwK3AxKzEpPj4xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgW0J8QV0KKworICAgIGFkZCAgICAgICAgIHI0LCByNCwgcjUsIGxzbCAjMSAgICAgIDsgW3AxKzIqcDIgICAgICB8ICAgICAgcDArMipwMV0KKyAgICBhZGQgICAgICAgICByNCwgcjQsIHI2ICAgICAgICAgICAgICA7IFtwMSsyKnAyK3AzICAgfCAgIHAwKzIqcDErcDJdCisgICAgdXh0YWIxNiAgICAgcjQsIHI0LCByMTIgICAgICAgICAgICAgOyBbcDErMipwMitwMysyIHwgcDArMipwMStwMisyXQorCisgICAgdWFkZDE2ICAgICAgcjAsIHI2LCByNyAgICAgICAgICAgICAgOyBbcDMrcDQgICAgICAgIHwgICAgICAgIHAyK3AzXQorICAgIHVoYWRkMTYgICAgIHIwLCByMCwgcjIgICAgICAgICAgICAgIDsgWyhwMytwNCsxKT4+MSB8IChwMitwMysxKT4+MV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFtGfEVdCisKKyAgICBhZGQgICAgICAgICByNSwgcjYsIHI3LCBsc2wgIzEgICAgICA7IFtwMysyKnA0ICAgICAgfCAgICAgIHAyKzIqcDNdCisgICAgYWRkICAgICAgICAgcjUsIHI1LCByOCwgcm9yICMxNiAgICAgOyBbcDMrMipwNCtwNSAgIHwgICBwMisyKnAzK3A0XQorICAgIHV4dGFiMTYgICAgIHI1LCByNSwgcjEyICAgICAgICAgICAgIDsgW3AzKzIqcDQrcDUrMiB8IHAyKzIqcDMrcDQrMl0KKworICAgIGFkZCAgICAgICAgIHI2LCByMTIsIHI4LCByb3IgIzE2ICAgIDsgW3A1KzIgICAgICAgICB8ICAgICAgICAgcDQrMl0KKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCwgbHNsICMxICAgICA7IFtwNSsyKzIqcDYgICAgfCAgICBwNCsyKzIqcDVdCisgICAgdXh0YWIxNiAgICAgcjYsIHI2LCByMSAgICAgICAgICAgICAgOyBbcDUrMisyKnA2K3A3IHwgcDQrMisyKnA1K3A2XQorCisgICAgOyBzY2FsZSBkb3duCisgICAgYW5kICAgICAgICAgcjQsIGxyLCByNCwgYXNyICMyICAgICAgOyBbRHxDXQorICAgIGFuZCAgICAgICAgIHI1LCBsciwgcjUsIGFzciAjMiAgICAgIDsgW0h8R10KKyAgICBhbmQgICAgICAgICByNiwgbHIsIHI2LCBhc3IgIzIgICAgICA7IFtKfEldCisKKyAgICBsZHIgICAgICAgICBsciwgW3NwLCAjNDRdICAgICAgICAgICA7IGRzdF9zdHJpZGUKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNDBdICAgICAgICAgICA7IGRzdAorCisgICAgcGtodGIgICAgICAgcjIsIHIwLCByNiAgICAgICAgICAgICAgOyBbLXxGfC18SV0KKyAgICBwa2h0YiAgICAgICByMTIsIHI2LCByNSwgYXNyICMxNiAgICA7IFstfEp8LXxIXQorICAgIGFkZCAgICAgICAgIHIxMiwgcjEyLCByMiwgbHNsICM4ICAgIDsgW0Z8SnxJfEhdCisgICAgYWRkICAgICAgICAgcjIsIHIwLCByNSwgbHNsICM4ICAgICAgOyBbSHxGfEd8RV0KKyAgICBtb3YgICAgICAgICByMTIsIHIxMiwgcm9yICMyNCAgICAgICA7IFtKfEl8SHxGXQorICAgIHN0ciAgICAgICAgIHIxMiwgW3IzXSwgbHIKKworICAgIG1vdiAgICAgICAgIHI3LCByMTEsIGFzciAjMTYgICAgICAgIDsgWy18LXwtfEJdCisgICAgc3RyICAgICAgICAgcjIsIFtyM10sIGxyCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMCwgbHNsICMxNiAgICAgOyBbLXxFfC18Ql0KKyAgICBhZGQgICAgICAgICByNywgcjcsIHI0LCBhc3IgIzggICAgICA7IFstfEV8RHxCXQorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjUsIGxzbCAjMjQgICAgIDsgW0d8RXxEfEJdCisgICAgc3RyICAgICAgICAgcjcsIFtyM10sIGxyCisKKyAgICBhZGQgICAgICAgICByNSwgcjExLCByNCwgbHNsICM4ICAgICA7IFtEfEJ8Q3xBXQorICAgIHN0ciAgICAgICAgIHI1LCBbcjNdCisKKyAgICBwb3AgICAgICAgIHtyNC1yMTIsIHBjfQorCisKKworYl9odV9wcmVkCisgICAgbGRyYiAgICAgICAgcjQsIFtyMV0sIHIyICAgICAgICAgICAgOyBMZWZ0WzBdCisgICAgbGRyICAgICAgICAgcjEyLCBjMDAwMjAwMDIKKyAgICBsZHJiICAgICAgICByNSwgW3IxXSwgcjIgICAgICAgICAgICA7IExlZnRbMV0KKyAgICBsZHIgICAgICAgICBsciwgIGMwMEZGMDBGRgorICAgIGxkcmIgICAgICAgIHI2LCBbcjFdLCByMiAgICAgICAgICAgIDsgTGVmdFsyXQorICAgIGxkciAgICAgICAgIHIyLCAgYzAwMDEwMDAxCisgICAgbGRyYiAgICAgICAgcjcsIFtyMV0gICAgICAgICAgICAgICAgOyBMZWZ0WzNdCisKKyAgICBhZGQgICAgICAgICByNCwgcjQsIHI1LCBsc2wgIzE2ICAgICA7IFsxfDBdCisgICAgYWRkICAgICAgICAgcjUsIHI1LCByNiwgbHNsICMxNiAgICAgOyBbMnwxXQorICAgIGFkZCAgICAgICAgIHI5LCByNiwgcjcsIGxzbCAjMTYgICAgIDsgWzN8Ml0KKworICAgIHVhZGQxNiAgICAgIHI4LCByNCwgcjUgICAgICAgICAgICAgIDsgW3AxK3AyICAgICAgICB8ICAgICAgICBwMCtwMV0KKyAgICB1aGFkZDE2ICAgICByOCwgcjgsIHIyICAgICAgICAgICAgICA7IFsocDErcDIrMSk+PjEgfCAocDArcDErMSk+PjFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBbQnxBXQorCisgICAgYWRkICAgICAgICAgcjQsIHI0LCByNSwgbHNsICMxICAgICAgOyBbcDErMipwMiAgICAgIHwgICAgICBwMCsyKnAxXQorICAgIGFkZCAgICAgICAgIHI0LCByNCwgcjkgICAgICAgICAgICAgIDsgW3AxKzIqcDIrcDMgICB8ICAgcDArMipwMStwMl0KKyAgICB1eHRhYjE2ICAgICByNCwgcjQsIHIxMiAgICAgICAgICAgICA7IFtwMSsyKnAyK3AzKzIgfCBwMCsyKnAxK3AyKzJdCisgICAgbGRyICAgICAgICAgcjIsIFtzcCwgIzQ0XSAgICAgICAgICAgOyBkc3Rfc3RyaWRlCisgICAgbGRyICAgICAgICAgcjMsIFtzcCwgIzQwXSAgICAgICAgICAgOyBkc3QKKyAgICBhbmQgICAgICAgICByNCwgbHIsIHI0LCBhc3IgIzIgICAgICA7IFtEfENdCisKKyAgICBhZGQgICAgICAgICByMTAsIHI2LCByNyAgICAgICAgICAgICA7IFtwMitwM10KKyAgICBhZGQgICAgICAgICByMTEsIHIxMCwgcjcsIGxzbCAjMSAgICA7IFtwMiszKnAzXQorICAgIGFkZCAgICAgICAgIHIxMCwgcjEwLCAjMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCAjMgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzEgICAgICAgIDsgW0VdCisgICAgbW92ICAgICAgICAgcjExLCByMTEsIGFzciAjMiAgICAgICAgOyBbRl0KKworICAgIGFkZCAgICAgICAgIHI5LCByNywgcjksIGFzciAjOCAgICAgIDsgWy18LXxHfEddCisgICAgYWRkICAgICAgICAgcjAsIHI4LCByNCwgbHNsICM4ICAgICAgOyBbRHxCfEN8QV0KKyAgICBhZGQgICAgICAgICByNywgcjksIHI5LCBsc2wgIzE2ICAgICA7IFtHfEd8R3xHXQorCisgICAgc3RyICAgICAgICAgcjAsIFtyM10sIHIyCisKKyAgICBtb3YgICAgICAgICByMSwgcjgsIGFzciAjMTYgICAgICAgICA7IFstfC18LXxCXQorICAgIGFkZCAgICAgICAgIHIxLCByMSwgcjQsIGFzciAjOCAgICAgIDsgWy18LXxEfEJdCisgICAgYWRkICAgICAgICAgcjEsIHIxLCByMTAsIGxzbCAjMTYgICAgOyBbLXxFfER8Ql0KKyAgICBhZGQgICAgICAgICByMSwgcjEsIHIxMSwgbHNsICMyNCAgICA7IFtGfEV8RHxCXQorICAgIHN0ciAgICAgICAgIHIxLCBbcjNdLCByMgorCisgICAgYWRkICAgICAgICAgcjEwLCByMTEsIGxzbCAjOCAgICAgICAgOyBbLXwtfEZ8RV0KKyAgICBhZGQgICAgICAgICByMTAsIHIxMCwgcjksIGxzbCAjMTYgICA7IFtHfEd8RnxFXQorICAgIHN0ciAgICAgICAgIHIxMCwgW3IzXSwgcjIKKworICAgIHN0ciAgICAgICAgIHI3LCBbcjNdCisKKyAgICBwb3AgICAgICAgIHtyNC1yMTIsIHBjfQorCisgICAgRU5EUAorCis7IGNvbnN0YW50cworYzAwMDEwMDAxCisgICAgRENEICAgICAgICAgMHgwMDAxMDAwMQorYzAwMDIwMDAyCisgICAgRENEICAgICAgICAgMHgwMDAyMDAwMgorYzAwRkYwMEZGCisgICAgRENEICAgICAgICAgMHgwMEZGMDBGRgorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaXdhbHNoX3Y2LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9pd2Fsc2hfdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWYwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaXdhbHNoX3Y2LmFzbQpAQCAtMCwwICsxLDEzNiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKyAgICBFWFBPUlQgfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjZ8CisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQorCis7c2hvcnQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF92NihzaG9ydCAqaW5wdXQsIHNob3J0ICptYl9kcWNvZWZmKQorfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjZ8IFBST0MKKworICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjEyLCBscn0KKworICAgIGxkciAgICAgICAgIHIyLCBbcjAsICMwXSAgICAgICAgIDsgWzEgIHwgIDBdCisgICAgbGRyICAgICAgICAgcjMsIFtyMCwgIzRdICAgICAgICAgOyBbMyAgfCAgMl0KKyAgICBsZHIgICAgICAgICByNCwgW3IwLCAjOF0gICAgICAgICA7IFs1ICB8ICA0XQorICAgIGxkciAgICAgICAgIHI1LCBbcjAsICMxMl0gICAgICAgIDsgWzcgIHwgIDZdCisgICAgbGRyICAgICAgICAgcjYsIFtyMCwgIzE2XSAgICAgICAgOyBbOSAgfCAgOF0KKyAgICBsZHIgICAgICAgICByNywgW3IwLCAjMjBdICAgICAgICA7IFsxMSB8IDEwXQorICAgIGxkciAgICAgICAgIHI4LCBbcjAsICMyNF0gICAgICAgIDsgWzEzIHwgMTJdCisgICAgbGRyICAgICAgICAgcjksIFtyMCwgIzI4XSAgICAgICAgOyBbMTUgfCAxNF0KKworICAgIHFhZGQxNiAgICAgIHIxMCwgcjIsIHI4ICAgICAgICAgIDsgYTEgWzErMTMgIHwgIDArMTJdCisgICAgcWFkZDE2ICAgICAgcjExLCByNCwgcjYgICAgICAgICAgOyBiMSBbNSs5ICAgfCAgNCs4XQorICAgIHFzdWIxNiAgICAgIHIxMiwgcjQsIHI2ICAgICAgICAgIDsgYzEgWzUtOSAgIHwgIDQtOF0KKyAgICBxc3ViMTYgICAgICBsciwgcjIsIHI4ICAgICAgICAgICA7IGQxIFsxLTEzICB8ICAwLTEyXQorCisgICAgcWFkZDE2ICAgICAgcjIsIHIxMCwgcjExICAgICAgICAgOyBhMSArIGIxIFsxICB8ICAwXQorICAgIHFhZGQxNiAgICAgIHI0LCByMTIsIGxyICAgICAgICAgIDsgYzEgKyBkMSBbNSAgfCAgNF0KKyAgICBxc3ViMTYgICAgICByNiwgcjEwLCByMTEgICAgICAgICA7IGExIC0gYjEgWzkgIHwgIDhdCisgICAgcXN1YjE2ICAgICAgcjgsIGxyLCByMTIgICAgICAgICAgOyBkMSAtIGMxIFsxMyB8IDEyXQorCisgICAgcWFkZDE2ICAgICAgcjEwLCByMywgcjkgICAgICAgICAgOyBhMSBbMysxNSAgfCAgMisxNF0KKyAgICBxYWRkMTYgICAgICByMTEsIHI1LCByNyAgICAgICAgICA7IGIxIFs3KzExICB8ICA2KzEwXQorICAgIHFzdWIxNiAgICAgIHIxMiwgcjUsIHI3ICAgICAgICAgIDsgYzEgWzctMTEgIHwgIDYtMTBdCisgICAgcXN1YjE2ICAgICAgbHIsIHIzLCByOSAgICAgICAgICAgOyBkMSBbMy0xNSAgfCAgMi0xNF0KKworICAgIHFhZGQxNiAgICAgIHIzLCByMTAsIHIxMSAgICAgICAgIDsgYTEgKyBiMSBbMyAgfCAgMl0KKyAgICBxYWRkMTYgICAgICByNSwgcjEyLCBsciAgICAgICAgICA7IGMxICsgZDEgWzcgIHwgIDZdCisgICAgcXN1YjE2ICAgICAgcjcsIHIxMCwgcjExICAgICAgICAgOyBhMSAtIGIxIFsxMSB8IDEwXQorICAgIHFzdWIxNiAgICAgIHI5LCBsciwgcjEyICAgICAgICAgIDsgZDEgLSBjMSBbMTUgfCAxNF0KKworICAgIDsgZmlyc3QgdHJhbnNmb3JtIGNvbXBsZXRlCisKKyAgICBxc3ViYWRkeCAgICByMTAsIHIyLCByMyAgICAgICAgICA7IFtjMXxhMV0gWzEtMiAgIHwgICAwKzNdCisgICAgcWFkZHN1YnggICAgcjExLCByMiwgcjMgICAgICAgICAgOyBbYjF8ZDFdIFsxKzIgICB8ICAgMC0zXQorICAgIHFzdWJhZGR4ICAgIHIxMiwgcjQsIHI1ICAgICAgICAgIDsgW2MxfGExXSBbNS02ICAgfCAgIDQrN10KKyAgICBxYWRkc3VieCAgICBsciwgcjQsIHI1ICAgICAgICAgICA7IFtiMXxkMV0gWzUrNiAgIHwgICA0LTddCisKKyAgICBxYWRkc3VieCAgICByMiwgcjEwLCByMTEgICAgICAgICA7IFtiMnxjMl0gW2MxK2QxIHwgYTEtYjFdCisgICAgcWFkZHN1YnggICAgcjMsIHIxMSwgcjEwICAgICAgICAgOyBbYTJ8ZDJdIFtiMSthMSB8IGQxLWMxXQorICAgIGxkciAgICAgICAgIHIxMCwgYzB4MDAwMzAwMDMKKyAgICBxYWRkc3VieCAgICByNCwgcjEyLCBsciAgICAgICAgICA7IFtiMnxjMl0gW2MxK2QxIHwgYTEtYjFdCisgICAgcWFkZHN1YnggICAgcjUsIGxyLCByMTIgICAgICAgICAgOyBbYTJ8ZDJdIFtiMSthMSB8IGQxLWMxXQorCisgICAgcWFkZDE2ICAgICAgcjIsIHIyLCByMTAgICAgICAgICAgOyBbYjIrM3xjMiszXQorICAgIHFhZGQxNiAgICAgIHIzLCByMywgcjEwICAgICAgICAgIDsgW2EyKzN8ZDIrM10KKyAgICBxYWRkMTYgICAgICByNCwgcjQsIHIxMCAgICAgICAgICA7IFtiMiszfGMyKzNdCisgICAgcWFkZDE2ICAgICAgcjUsIHI1LCByMTAgICAgICAgICAgOyBbYTIrM3xkMiszXQorCisgICAgYXNyICAgICAgICAgcjEyLCByMywgIzE5ICAgICAgICAgOyBbMF0KKyAgICBzdHJoICAgICAgICByMTIsIFtyMV0sICMzMgorICAgIGFzciAgICAgICAgIGxyLCByMiwgIzE5ICAgICAgICAgIDsgWzFdCisgICAgc3RyaCAgICAgICAgbHIsIFtyMV0sICMzMgorICAgIHN4dGggICAgICAgIHIyLCByMgorICAgIHN4dGggICAgICAgIHIzLCByMworICAgIGFzciAgICAgICAgIHIyLCByMiwgIzMgICAgICAgICAgIDsgWzJdCisgICAgc3RyaCAgICAgICAgcjIsIFtyMV0sICMzMgorICAgIGFzciAgICAgICAgIHIzLCByMywgIzMgICAgICAgICAgIDsgWzNdCisgICAgc3RyaCAgICAgICAgcjMsIFtyMV0sICMzMgorCisgICAgYXNyICAgICAgICAgcjEyLCByNSwgIzE5ICAgICAgICAgOyBbNF0KKyAgICBzdHJoICAgICAgICByMTIsIFtyMV0sICMzMgorICAgIGFzciAgICAgICAgIGxyLCByNCwgIzE5ICAgICAgICAgIDsgWzVdCisgICAgc3RyaCAgICAgICAgbHIsIFtyMV0sICMzMgorICAgIHN4dGggICAgICAgIHI0LCByNAorICAgIHN4dGggICAgICAgIHI1LCByNQorICAgIGFzciAgICAgICAgIHI0LCByNCwgIzMgICAgICAgICAgIDsgWzZdCisgICAgc3RyaCAgICAgICAgcjQsIFtyMV0sICMzMgorICAgIGFzciAgICAgICAgIHI1LCByNSwgIzMgICAgICAgICAgIDsgWzddCisgICAgc3RyaCAgICAgICAgcjUsIFtyMV0sICMzMgorCisgICAgcXN1YmFkZHggICAgcjIsIHI2LCByNyAgICAgICAgICAgOyBbYzF8YTFdIFs5LTEwICB8ICA4KzExXQorICAgIHFhZGRzdWJ4ICAgIHIzLCByNiwgcjcgICAgICAgICAgIDsgW2IxfGQxXSBbOSsxMCAgfCAgOC0xMV0KKyAgICBxc3ViYWRkeCAgICByNCwgcjgsIHI5ICAgICAgICAgICA7IFtjMXxhMV0gWzEzLTE0IHwgMTIrMTVdCisgICAgcWFkZHN1YnggICAgcjUsIHI4LCByOSAgICAgICAgICAgOyBbYjF8ZDFdIFsxMysxNCB8IDEyLTE1XQorCisgICAgcWFkZHN1YnggICAgcjYsIHIyLCByMyAgICAgICAgICAgOyBbYjJ8YzJdIFtjMStkMSB8IGExLWIxXQorICAgIHFhZGRzdWJ4ICAgIHI3LCByMywgcjIgICAgICAgICAgIDsgW2EyfGQyXSBbYjErYTEgfCBkMS1jMV0KKyAgICBxYWRkc3VieCAgICByOCwgcjQsIHI1ICAgICAgICAgICA7IFtiMnxjMl0gW2MxK2QxIHwgYTEtYjFdCisgICAgcWFkZHN1YnggICAgcjksIHI1LCByNCAgICAgICAgICAgOyBbYTJ8ZDJdIFtiMSthMSB8IGQxLWMxXQorCisgICAgcWFkZDE2ICAgICAgcjYsIHI2LCByMTAgICAgICAgICAgOyBbYjIrM3xjMiszXQorICAgIHFhZGQxNiAgICAgIHI3LCByNywgcjEwICAgICAgICAgIDsgW2EyKzN8ZDIrM10KKyAgICBxYWRkMTYgICAgICByOCwgcjgsIHIxMCAgICAgICAgICA7IFtiMiszfGMyKzNdCisgICAgcWFkZDE2ICAgICAgcjksIHI5LCByMTAgICAgICAgICAgOyBbYTIrM3xkMiszXQorCisgICAgYXNyICAgICAgICAgcjEyLCByNywgIzE5ICAgICAgICAgOyBbOF0KKyAgICBzdHJoICAgICAgICByMTIsIFtyMV0sICMzMgorICAgIGFzciAgICAgICAgIGxyLCByNiwgIzE5ICAgICAgICAgIDsgWzldCisgICAgc3RyaCAgICAgICAgbHIsIFtyMV0sICMzMgorICAgIHN4dGggICAgICAgIHI2LCByNgorICAgIHN4dGggICAgICAgIHI3LCByNworICAgIGFzciAgICAgICAgIHI2LCByNiwgIzMgICAgICAgICAgIDsgWzEwXQorICAgIHN0cmggICAgICAgIHI2LCBbcjFdLCAjMzIKKyAgICBhc3IgICAgICAgICByNywgcjcsICMzICAgICAgICAgICA7IFsxMV0KKyAgICBzdHJoICAgICAgICByNywgW3IxXSwgIzMyCisKKyAgICBhc3IgICAgICAgICByMTIsIHI5LCAjMTkgICAgICAgICA7IFsxMl0KKyAgICBzdHJoICAgICAgICByMTIsIFtyMV0sICMzMgorICAgIGFzciAgICAgICAgIGxyLCByOCwgIzE5ICAgICAgICAgIDsgWzEzXQorICAgIHN0cmggICAgICAgIGxyLCBbcjFdLCAjMzIKKyAgICBzeHRoICAgICAgICByOCwgcjgKKyAgICBzeHRoICAgICAgICByOSwgcjkKKyAgICBhc3IgICAgICAgICByOCwgcjgsICMzICAgICAgICAgICA7IFsxNF0KKyAgICBzdHJoICAgICAgICByOCwgW3IxXSwgIzMyCisgICAgYXNyICAgICAgICAgcjksIHI5LCAjMyAgICAgICAgICAgOyBbMTVdCisgICAgc3RyaCAgICAgICAgcjksIFtyMV0sICMzMgorCisgICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTIsIHBjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjZ8CisKKworOyBDb25zdGFudCBQb29sCitjMHgwMDAzMDAwMyBEQ0QgMHgwMDAzMDAwMworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2xvb3BmaWx0ZXJfdjYuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L2xvb3BmaWx0ZXJfdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmJiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvbG9vcGZpbHRlcl92Ni5hc20KQEAgLTAsMCArMSwxMjgyIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUIHx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2fAorICAgIEVYUE9SVCB8dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2fAorICAgIEVYUE9SVCB8dnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8CisgICAgRVhQT1JUIHx2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2fAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQorCisgICAgTUFDUk8KKyAgICBUUkFOU1BPU0VfTUFUUklYICRhMCwgJGExLCAkYTIsICRhMywgJGIwLCAkYjEsICRiMiwgJGIzCisgICAgOyBpbnB1dDogJGEwLCAkYTEsICRhMiwgJGEzOyBvdXRwdXQ6ICRiMCwgJGIxLCAkYjIsICRiMworICAgIDsgYTA6IDAzIDAyIDAxIDAwCisgICAgOyBhMTogMTMgMTIgMTEgMTAKKyAgICA7IGEyOiAyMyAyMiAyMSAyMAorICAgIDsgYTM6IDMzIDMyIDMxIDMwCisgICAgOyAgICAgYjMgYjIgYjEgYjAKKworICAgIHV4dGIxNiAgICAgICRiMSwgJGExICAgICAgICAgICAgICAgICAgICA7IHh4IDEyIHh4IDEwCisgICAgdXh0YjE2ICAgICAgJGIwLCAkYTAgICAgICAgICAgICAgICAgICAgIDsgeHggMDIgeHggMDAKKyAgICB1eHRiMTYgICAgICAkYjMsICRhMyAgICAgICAgICAgICAgICAgICAgOyB4eCAzMiB4eCAzMAorICAgIHV4dGIxNiAgICAgICRiMiwgJGEyICAgICAgICAgICAgICAgICAgICA7IHh4IDIyIHh4IDIwCisgICAgb3JyICAgICAgICAgJGIxLCAkYjAsICRiMSwgbHNsICM4ICAgICAgIDsgMTIgMDIgMTAgMDAKKyAgICBvcnIgICAgICAgICAkYjMsICRiMiwgJGIzLCBsc2wgIzggICAgICAgOyAzMiAyMiAzMCAyMAorCisgICAgdXh0YjE2ICAgICAgJGExLCAkYTEsIHJvciAjOCAgICAgICAgICAgIDsgeHggMTMgeHggMTEKKyAgICB1eHRiMTYgICAgICAkYTMsICRhMywgcm9yICM4ICAgICAgICAgICAgOyB4eCAzMyB4eCAzMQorICAgIHV4dGIxNiAgICAgICRhMCwgJGEwLCByb3IgIzggICAgICAgICAgICA7IHh4IDAzIHh4IDAxCisgICAgdXh0YjE2ICAgICAgJGEyLCAkYTIsIHJvciAjOCAgICAgICAgICAgIDsgeHggMjMgeHggMjEKKyAgICBvcnIgICAgICAgICAkYTAsICRhMCwgJGExLCBsc2wgIzggICAgICAgOyAxMyAwMyAxMSAwMQorICAgIG9yciAgICAgICAgICRhMiwgJGEyLCAkYTMsIGxzbCAjOCAgICAgICA7IDMzIDIzIDMxIDIxCisKKyAgICBwa2h0YiAgICAgICAkYjIsICRiMywgJGIxLCBhc3IgIzE2ICAgICAgOyAzMiAyMiAxMiAwMiAgIC0tIHAxCisgICAgcGtoYnQgICAgICAgJGIwLCAkYjEsICRiMywgbHNsICMxNiAgICAgIDsgMzAgMjAgMTAgMDAgICAtLSBwMworCisgICAgcGtodGIgICAgICAgJGIzLCAkYTIsICRhMCwgYXNyICMxNiAgICAgIDsgMzMgMjMgMTMgMDMgICAtLSBwMAorICAgIHBraGJ0ICAgICAgICRiMSwgJGEwLCAkYTIsIGxzbCAjMTYgICAgICA7IDMxIDIxIDExIDAxICAgLS0gcDIKKyAgICBNRU5ECisKKworc3JjICAgICAgICAgUk4gIHIwCitwc3RlcCAgICAgICBSTiAgcjEKK2NvdW50ICAgICAgIFJOICByNQorCis7cjAgICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7cjEgICAgIGludCBzcmNfcGl4ZWxfc3RlcCwKKztyMiAgICAgY29uc3QgY2hhciAqYmxpbWl0LAorO3IzICAgICBjb25zdCBjaGFyICpsaW1pdCwKKztzdGFjayAgY29uc3QgY2hhciAqdGhyZXNoLAorO3N0YWNrICBpbnQgIGNvdW50CisKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjZ8IFBST0MKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCisgICAgbGRyICAgICAgICAgY291bnQsIFtzcCwgIzQwXSAgICAgICAgICAgIDsgY291bnQgZm9yIDgtaW4tcGFyYWxsZWwKKyAgICBsZHIgICAgICAgICByNiwgW3NwLCAjMzZdICAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaCBhZGRyZXNzCisgICAgc3ViICAgICAgICAgc3AsIHNwLCAjMTYgICAgICAgICAgICAgICAgIDsgY3JlYXRlIHRlbXAgYnVmZmVyCisKKyAgICBsZHIgICAgICAgICByOSwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBwMworICAgIGxkcmIgICAgICAgIHI0LCBbcjJdICAgICAgICAgICAgICAgICAgICA7IGJsaW1pdAorICAgIGxkciAgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHAyCisgICAgbGRyYiAgICAgICAgcjIsIFtyM10gICAgICAgICAgICAgICAgICAgIDsgbGltaXQKKyAgICBsZHIgICAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMQorICAgIG9yciAgICAgICAgIHI0LCByNCwgcjQsIGxzbCAjOAorICAgIGxkcmIgICAgICAgIHIzLCBbcjZdICAgICAgICAgICAgICAgICAgICA7IHRocmVzaAorICAgIG9yciAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjOAorICAgIG1vdiAgICAgICAgIGNvdW50LCBjb3VudCwgbHNsICMxICAgICAgICA7IDQtaW4tcGFyYWxsZWwKKyAgICBvcnIgICAgICAgICByNCwgcjQsIHI0LCBsc2wgIzE2CisgICAgb3JyICAgICAgICAgcjMsIHIzLCByMywgbHNsICM4CisgICAgb3JyICAgICAgICAgcjIsIHIyLCByMiwgbHNsICMxNgorICAgIG9yciAgICAgICAgIHIzLCByMywgcjMsIGxzbCAjMTYKKworfEhuZXh0OHwKKyAgICA7IHZwOF9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCisgICAgOyBjYWxjdWxhdGUgYnJlYWtvdXQgY29uZGl0aW9ucworICAgIGxkciAgICAgICAgIHIxMiwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHAwCisKKyAgICB1cXN1YjggICAgICByNiwgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBwMyAtIHAyCisgICAgdXFzdWI4ICAgICAgcjcsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcDIgLSBwMworICAgIHVxc3ViOCAgICAgIHI4LCByMTAsIHIxMSAgICAgICAgICAgICAgICA7IHAyIC0gcDEKKyAgICB1cXN1YjggICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBwMSAtIHAyCisKKyAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAzLXAyKQorICAgIG9yciAgICAgICAgIHI4LCByOCwgcjEwICAgICAgICAgICAgICAgICA7IGFicyAocDItcDEpCisgICAgdXFzdWI4ICAgICAgbHIsIHI2LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdC4gbHI6IHZwOF9maWx0ZXJfbWFzaworICAgIHVxc3ViOCAgICAgIHI4LCByOCwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKyAgICB1cXN1YjggICAgICByNiwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBwMSAtIHAwCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByOAorICAgIHVxc3ViOCAgICAgIHI3LCByMTIsIHIxMSAgICAgICAgICAgICAgICA7IHAwIC0gcDEKKyAgICBsZHIgICAgICAgICByOSwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBxMAorICAgIGxkciAgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHExCisgICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMS1wMCkKKyAgICB1cXN1YjggICAgICByNywgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisgICAgdXFzdWI4ICAgICAgcjgsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byB0aHJlc2ggIC0tIHNhdmUgcjggZm9yIGxhdGVyCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByNworCisgICAgdXFzdWI4ICAgICAgcjYsIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcDEgLSBxMQorICAgIHVxc3ViOCAgICAgIHI3LCByMTAsIHIxMSAgICAgICAgICAgICAgICA7IHExIC0gcDEKKyAgICB1cXN1YjggICAgICByMTEsIHIxMiwgcjkgICAgICAgICAgICAgICAgOyBwMCAtIHEwCisgICAgdXFzdWI4ICAgICAgcjEyLCByOSwgcjEyICAgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgIG9yciAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICA7IGFicyAocDEtcTEpCisgICAgbGRyICAgICAgICAgcjcsIGMweDdGN0Y3RjdGCisgICAgb3JyICAgICAgICAgcjEyLCByMTEsIHIxMiAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkKKyAgICBsZHIgICAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBxMgorICAgIHVxYWRkOCAgICAgIHIxMiwgcjEyLCByMTIgICAgICAgICAgICAgICA7IGFicyAocDAtcTApICogMgorICAgIGFuZCAgICAgICAgIHI2LCByNywgcjYsIGxzciAjMSAgICAgICAgICA7IGFicyAocDEtcTEpIC8gMgorICAgIHVxc3ViOCAgICAgIHI3LCByOSwgcjEwICAgICAgICAgICAgICAgICA7IHEwIC0gcTEKKyAgICB1cWFkZDggICAgICByMTIsIHIxMiwgcjYgICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKSoyICsgYWJzIChwMS1xMSkvMgorICAgIHVxc3ViOCAgICAgIHI2LCByMTAsIHI5ICAgICAgICAgICAgICAgICA7IHExIC0gcTAKKyAgICB1cXN1YjggICAgICByMTIsIHIxMiwgcjQgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGZsaW1pdAorICAgIHVxc3ViOCAgICAgIHI5LCByMTEsIHIxMCAgICAgICAgICAgICAgICA7IHEyIC0gcTEKKworICAgIG9yciAgICAgICAgIGxyLCBsciwgcjEyCisKKyAgICBsZHIgICAgICAgICByMTIsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBxMworICAgIHVxc3ViOCAgICAgIHIxMCwgcjEwLCByMTEgICAgICAgICAgICAgICA7IHExIC0gcTIKKyAgICBvcnIgICAgICAgICByNiwgcjcsIHI2ICAgICAgICAgICAgICAgICAgOyBhYnMgKHExLXEwKQorICAgIG9yciAgICAgICAgIHIxMCwgcjksIHIxMCAgICAgICAgICAgICAgICA7IGFicyAocTItcTEpCisgICAgdXFzdWI4ICAgICAgcjcsIHI2LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAorICAgIHVxc3ViOCAgICAgIHIxMCwgcjEwLCByMiAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKyAgICB1cXN1YjggICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaCAtLSBzYXZlIHI2IGZvciBsYXRlcgorICAgIG9yciAgICAgICAgIGxyLCBsciwgcjcKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHIxMAorCisgICAgdXFzdWI4ICAgICAgcjEwLCByMTIsIHIxMSAgICAgICAgICAgICAgIDsgcTMgLSBxMgorICAgIHVxc3ViOCAgICAgIHI5LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHEyIC0gcTMKKworICAgIG12biAgICAgICAgIHIxMSwgIzAgICAgICAgICAgICAgICAgICAgICA7IHIxMSA9PSAtMQorCisgICAgb3JyICAgICAgICAgcjEwLCByMTAsIHI5ICAgICAgICAgICAgICAgIDsgYWJzIChxMy1xMikKKyAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjIgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisKKyAgICBtb3YgICAgICAgICByMTIsICMwCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgorCisgICAgdXN1YjggICAgICAgbHIsIHIxMiwgbHIgICAgICAgICAgICAgICAgIDsgdXNlIHVzdWI4IGluc3RlYWQgb2Ygc3N1YjgKKyAgICBzZWwgICAgICAgICBsciwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBmaWx0ZXIgbWFzazogbHIKKworICAgIGNtcCAgICAgICAgIGxyLCAjMAorICAgIGJlcSAgICAgICAgIGhza2lwX2ZpbHRlciAgICAgICAgICAgICAgICAgOyBza2lwIGZpbHRlcmluZworCisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzEgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDYgbGluZXMKKworICAgIDt2cDhfaGV2bWFzaygpIGZ1bmN0aW9uCisgICAgO2NhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKKyAgICBvcnIgICAgICAgICByMTAsIHI2LCByOCAgICAgICAgICAgICAgICAgOyBjYWxjdWxhdGUgdnA4X2hldm1hc2sKKworICAgIGxkciAgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAxCisKKyAgICB1c3ViOCAgICAgICByMTAsIHIxMiwgcjEwICAgICAgICAgICAgICAgOyB1c2UgdXN1YjggaW5zdGVhZCBvZiBzc3ViOAorICAgIHNlbCAgICAgICAgIHI2LCByMTIsIHIxMSAgICAgICAgICAgICAgICA7IG9idGFpbiB2cDhfaGV2bWFzazogcjYKKworICAgIDt2cDhfZmlsdGVyKCkgZnVuY3Rpb24KKyAgICBsZHIgICAgICAgICByOCwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBwMAorICAgIGxkciAgICAgICAgIHIxMiwgYzB4ODA4MDgwODAKKyAgICBsZHIgICAgICAgICByOSwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBxMAorICAgIGxkciAgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHExCisKKyAgICBlb3IgICAgICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICAgICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorICAgIGVvciAgICAgICAgIHI4LCByOCwgcjEyICAgICAgICAgICAgICAgICA7IHAwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisgICAgZW9yICAgICAgICAgcjksIHI5LCByMTIgICAgICAgICAgICAgICAgIDsgcTAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKyAgICBlb3IgICAgICAgICByMTAsIHIxMCwgcjEyICAgICAgICAgICAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorCisgICAgc3RyICAgICAgICAgcjksIFtzcF0gICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgcXMwIHRlbXBvcmFyaWx5CisgICAgc3RyICAgICAgICAgcjgsIFtzcCwgIzRdICAgICAgICAgICAgICAgIDsgc3RvcmUgcHMwIHRlbXBvcmFyaWx5CisgICAgc3RyICAgICAgICAgcjEwLCBbc3AsICM4XSAgICAgICAgICAgICAgIDsgc3RvcmUgcXMxIHRlbXBvcmFyaWx5CisgICAgc3RyICAgICAgICAgcjcsIFtzcCwgIzEyXSAgICAgICAgICAgICAgIDsgc3RvcmUgcHMxIHRlbXBvcmFyaWx5CisKKyAgICBxc3ViOCAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxLXFzMSkKKyAgICBxc3ViOCAgICAgICByOCwgcjksIHI4ICAgICAgICAgICAgICAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCisKKyAgICBhbmQgICAgICAgICByNywgcjcsIHI2ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIChyNykgJj0gaGV2CisKKyAgICBxYWRkOCAgICAgICByNywgcjcsIHI4CisgICAgbGRyICAgICAgICAgcjksIGMweDAzMDMwMzAzICAgICAgICAgICAgIDsgcjkgPSAzIC0tbW9kaWZpZWQgZm9yIHZwOAorCisgICAgcWFkZDggICAgICAgcjcsIHI3LCByOAorICAgIGxkciAgICAgICAgIHIxMCwgYzB4MDQwNDA0MDQKKworICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjgKKyAgICBhbmQgICAgICAgICByNywgcjcsIGxyICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IG1hc2s7CisKKyAgICA7bW9kaWZ5IGNvZGUgZm9yIHZwOCAtLSBGaWx0ZXIxID0gdnA4X2ZpbHRlciAocjcpCisgICAgcWFkZDggICAgICAgcjggLCByNyAsIHI5ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAocjgpID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrMykKKyAgICBxYWRkOCAgICAgICByNyAsIHI3ICwgcjEwICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrNCkKKworICAgIG1vdiAgICAgICAgIHI5LCAjMAorICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByOSAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49IDMKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgcjkgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID4+PSAzCisgICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHI5CisgICAgc2hhZGQ4ICAgICAgcjcgLCByNyAsIHI5CisgICAgc2hhZGQ4ICAgICAgbHIgLCByOCAsIHI5ICAgICAgICAgICAgICAgIDsgbHI6IEZpbHRlcjIKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgcjkgICAgICAgICAgICAgICAgOyByNzogZmlsdGVyCisKKyAgICA7dXN1YjggICAgICBsciwgcjgsIHIxMCAgICAgICAgICAgICAgICAgOyBzID0gKHM9PTQpKi0xCisgICAgO3NlbCAgICAgICAgbHIsIHIxMSwgcjkKKyAgICA7dXN1YjggICAgICByOCwgcjEwLCByOAorICAgIDtzZWwgICAgICAgIHI4LCByMTEsIHI5CisgICAgO2FuZCAgICAgICAgcjgsIHI4LCBsciAgICAgICAgICAgICAgICAgIDsgLTEgZm9yIGVhY2ggZWxlbWVudCB0aGF0IGVxdWFscyA0CisKKyAgICA7Y2FsY3VsYXRlIG91dHB1dAorICAgIDtxYWRkOCAgICAgIGxyLCByOCwgcjcgICAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocyArIHZwOF9maWx0ZXIpCisKKyAgICBsZHIgICAgICAgICByOCwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAorICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IGxvYWQgcHMwCisKKyAgICBsZHIgICAgICAgICByMTAsIGMweDAxMDEwMTAxCisKKyAgICBxc3ViOCAgICAgICByOCAscjgsIHI3ICAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHZwOF9maWx0ZXIpCisgICAgcWFkZDggICAgICAgcjksIHI5LCBsciAgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKQorCisgICAgO2VuZCBvZiBtb2RpZmljYXRpb24gZm9yIHZwOAorCisgICAgbW92ICAgICAgICAgbHIsICMwCisgICAgc2FkZDggICAgICAgcjcsIHI3ICwgcjEwICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciArPSAxCisgICAgc2hhZGQ4ICAgICAgcjcsIHI3LCBsciAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA+Pj0gMQorCisgICAgbGRyICAgICAgICAgcjExLCBbc3AsICMxMl0gICAgICAgICAgICAgIDsgbG9hZCBwczEKKyAgICBsZHIgICAgICAgICByMTAsIFtzcCwgIzhdICAgICAgICAgICAgICAgOyBsb2FkIHFzMQorCisgICAgYmljICAgICAgICAgcjcsIHI3LCByNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSB+aGV2CisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIKKworICAgIHFhZGQ4ICAgICAgIHIxMSwgcjExLCByNyAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxICsgdnA4X2ZpbHRlcikKKyAgICBxc3ViOCAgICAgICByMTAsIHIxMCxyNyAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHZwOF9maWx0ZXIpCisKKyAgICBlb3IgICAgICAgICByMTEsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyAqb3AxID0gdV4weDgwCisgICAgc3RyICAgICAgICAgcjExLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgc3RvcmUgb3AxCisgICAgZW9yICAgICAgICAgcjksIHI5LCByMTIgICAgICAgICAgICAgICAgIDsgKm9wMCA9IHVeMHg4MAorICAgIHN0ciAgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHN0b3JlIG9wMCByZXN1bHQKKyAgICBlb3IgICAgICAgICByOCwgcjgsIHIxMiAgICAgICAgICAgICAgICAgOyAqb3EwID0gdV4weDgwCisgICAgc3RyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgc3RvcmUgb3EwIHJlc3VsdAorICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCByMTIgICAgICAgICAgICAgICA7ICpvcTEgPSB1XjB4ODAKKyAgICBzdHIgICAgICAgICByMTAsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBzdG9yZSBvcTEKKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMxCisKK3xoc2tpcF9maWx0ZXJ8CisgICAgYWRkICAgICAgICAgc3JjLCBzcmMsICM0CisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIKKworICAgIHN1YnMgICAgICAgIGNvdW50LCBjb3VudCwgIzEKKworICAgIGxkcm5lICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAzCisgICAgbGRybmUgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDIKKyAgICBsZHJuZSAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMQorCisgICAgYm5lICAgICAgICAgSG5leHQ4CisKKyAgICBhZGQgICAgICAgICBzcCwgc3AsICMxNgorICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KKyAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2fAorCisKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12NnwgUFJPQworOy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCisgICAgc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQorCisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgbGluZXMKKyAgICBsZHIgICAgICAgICBjb3VudCwgW3NwLCAjNDBdICAgICAgICAgICAgOyBjb3VudCBmb3IgOC1pbi1wYXJhbGxlbAorICAgIGxkciAgICAgICAgIHI2LCBbc3AsICMzNl0gICAgICAgICAgICAgICA7IGxvYWQgdGhyZXNoIGFkZHJlc3MKKyAgICBzdWIgICAgICAgICBzcCwgc3AsICMxNiAgICAgICAgICAgICAgICAgOyBjcmVhdGUgdGVtcCBidWZmZXIKKworICAgIGxkciAgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAzCisgICAgbGRyYiAgICAgICAgcjQsIFtyMl0gICAgICAgICAgICAgICAgICAgIDsgYmxpbWl0CisgICAgbGRyICAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDIKKyAgICBsZHJiICAgICAgICByMiwgW3IzXSAgICAgICAgICAgICAgICAgICAgOyBsaW1pdAorICAgIGxkciAgICAgICAgIHIxMSwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHAxCisgICAgb3JyICAgICAgICAgcjQsIHI0LCByNCwgbHNsICM4CisgICAgbGRyYiAgICAgICAgcjMsIFtyNl0gICAgICAgICAgICAgICAgICAgIDsgdGhyZXNoCisgICAgb3JyICAgICAgICAgcjIsIHIyLCByMiwgbHNsICM4CisgICAgbW92ICAgICAgICAgY291bnQsIGNvdW50LCBsc2wgIzEgICAgICAgIDsgNC1pbi1wYXJhbGxlbAorICAgIG9yciAgICAgICAgIHI0LCByNCwgcjQsIGxzbCAjMTYKKyAgICBvcnIgICAgICAgICByMywgcjMsIHIzLCBsc2wgIzgKKyAgICBvcnIgICAgICAgICByMiwgcjIsIHIyLCBsc2wgIzE2CisgICAgb3JyICAgICAgICAgcjMsIHIzLCByMywgbHNsICMxNgorCit8TUJIbmV4dDh8CisKKyAgICA7IHZwOF9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCisgICAgOyBjYWxjdWxhdGUgYnJlYWtvdXQgY29uZGl0aW9ucworICAgIGxkciAgICAgICAgIHIxMiwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHAwCisKKyAgICB1cXN1YjggICAgICByNiwgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBwMyAtIHAyCisgICAgdXFzdWI4ICAgICAgcjcsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcDIgLSBwMworICAgIHVxc3ViOCAgICAgIHI4LCByMTAsIHIxMSAgICAgICAgICAgICAgICA7IHAyIC0gcDEKKyAgICB1cXN1YjggICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBwMSAtIHAyCisKKyAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAzLXAyKQorICAgIG9yciAgICAgICAgIHI4LCByOCwgcjEwICAgICAgICAgICAgICAgICA7IGFicyAocDItcDEpCisgICAgdXFzdWI4ICAgICAgbHIsIHI2LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdC4gbHI6IHZwOF9maWx0ZXJfbWFzaworICAgIHVxc3ViOCAgICAgIHI4LCByOCwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKworICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHAxIC0gcDAKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHI4CisgICAgdXFzdWI4ICAgICAgcjcsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgcDAgLSBwMQorICAgIGxkciAgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHEwCisgICAgbGRyICAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcTEKKyAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAxLXAwKQorICAgIHVxc3ViOCAgICAgIHI3LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKyAgICB1cXN1YjggICAgICByOCwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaCAgLS0gc2F2ZSByOCBmb3IgbGF0ZXIKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHI3CisKKyAgICB1cXN1YjggICAgICByNiwgcjExLCByMTAgICAgICAgICAgICAgICAgOyBwMSAtIHExCisgICAgdXFzdWI4ICAgICAgcjcsIHIxMCwgcjExICAgICAgICAgICAgICAgIDsgcTEgLSBwMQorICAgIHVxc3ViOCAgICAgIHIxMSwgcjEyLCByOSAgICAgICAgICAgICAgICA7IHAwIC0gcTAKKyAgICB1cXN1YjggICAgICByMTIsIHI5LCByMTIgICAgICAgICAgICAgICAgOyBxMCAtIHAwCisgICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMS1xMSkKKyAgICBsZHIgICAgICAgICByNywgYzB4N0Y3RjdGN0YKKyAgICBvcnIgICAgICAgICByMTIsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKQorICAgIGxkciAgICAgICAgIHIxMSwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHEyCisgICAgdXFhZGQ4ICAgICAgcjEyLCByMTIsIHIxMiAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkgKiAyCisgICAgYW5kICAgICAgICAgcjYsIHI3LCByNiwgbHNyICMxICAgICAgICAgIDsgYWJzIChwMS1xMSkgLyAyCisgICAgdXFzdWI4ICAgICAgcjcsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcTAgLSBxMQorICAgIHVxYWRkOCAgICAgIHIxMiwgcjEyLCByNiAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApKjIgKyBhYnMgKHAxLXExKS8yCisgICAgdXFzdWI4ICAgICAgcjYsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcTEgLSBxMAorICAgIHVxc3ViOCAgICAgIHIxMiwgcjEyLCByNCAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gZmxpbWl0CisgICAgdXFzdWI4ICAgICAgcjksIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcTIgLSBxMQorCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByMTIKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHEzCisKKyAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjExICAgICAgICAgICAgICAgOyBxMSAtIHEyCisgICAgb3JyICAgICAgICAgcjYsIHI3LCByNiAgICAgICAgICAgICAgICAgIDsgYWJzIChxMS1xMCkKKyAgICBvcnIgICAgICAgICByMTAsIHI5LCByMTAgICAgICAgICAgICAgICAgOyBhYnMgKHEyLXExKQorICAgIHVxc3ViOCAgICAgIHI3LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKyAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjIgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisgICAgdXFzdWI4ICAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byB0aHJlc2ggLS0gc2F2ZSByNiBmb3IgbGF0ZXIKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHI3CisgICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKKworICAgIHVxc3ViOCAgICAgIHIxMCwgcjEyLCByMTEgICAgICAgICAgICAgICA7IHEzIC0gcTIKKyAgICB1cXN1YjggICAgICByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBxMiAtIHEzCisKKyAgICBtdm4gICAgICAgICByMTEsICMwICAgICAgICAgICAgICAgICAgICAgOyByMTEgPT0gLTEKKworICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByOSAgICAgICAgICAgICAgICA7IGFicyAocTMtcTIpCisgICAgdXFzdWI4ICAgICAgcjEwLCByMTAsIHIyICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAorCisgICAgbW92ICAgICAgICAgcjEyLCAjMAorCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKKworICAgIHVzdWI4ICAgICAgIGxyLCByMTIsIGxyICAgICAgICAgICAgICAgICA7IHVzZSB1c3ViOCBpbnN0ZWFkIG9mIHNzdWI4CisgICAgc2VsICAgICAgICAgbHIsIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgZmlsdGVyIG1hc2s6IGxyCisKKyAgICBjbXAgICAgICAgICBsciwgIzAKKyAgICBiZXEgICAgICAgICBtYmhza2lwX2ZpbHRlciAgICAgICAgICAgICAgIDsgc2tpcCBmaWx0ZXJpbmcKKworICAgIDt2cDhfaGV2bWFzaygpIGZ1bmN0aW9uCisgICAgO2NhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNiBsaW5lcworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMxCisKKyAgICBvcnIgICAgICAgICByMTAsIHI2LCByOAorICAgIGxkciAgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAxCisKKyAgICB1c3ViOCAgICAgICByMTAsIHIxMiwgcjEwCisgICAgc2VsICAgICAgICAgcjYsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgaGV2IG1hc2s6IHI2CisKKyAgICA7dnA4X21iZmlsdGVyKCkgZnVuY3Rpb24KKyAgICA7cDIsIHEyIGFyZSBvbmx5IG5lZWRlZCBhdCB0aGUgZW5kLiBEb24ndCBuZWVkIHRvIGxvYWQgdGhlbSBpbiBub3cuCisgICAgbGRyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcDAKKyAgICBsZHIgICAgICAgICByMTIsIGMweDgwODA4MDgwCisgICAgbGRyICAgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcTAKKyAgICBsZHIgICAgICAgICByMTAsIFtzcmNdICAgICAgICAgICAgICAgICAgOyBxMQorCisgICAgZW9yICAgICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgICAgIDsgcHMxCisgICAgZW9yICAgICAgICAgcjgsIHI4LCByMTIgICAgICAgICAgICAgICAgIDsgcHMwCisgICAgZW9yICAgICAgICAgcjksIHI5LCByMTIgICAgICAgICAgICAgICAgIDsgcXMwCisgICAgZW9yICAgICAgICAgcjEwLCByMTAsIHIxMiAgICAgICAgICAgICAgIDsgcXMxCisKKyAgICBxc3ViOCAgICAgICByMTIsIHI5LCByOCAgICAgICAgICAgICAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCisgICAgc3RyICAgICAgICAgcjcsIFtzcCwgIzEyXSAgICAgICAgICAgICAgIDsgc3RvcmUgcHMxIHRlbXBvcmFyaWx5CisgICAgcXN1YjggICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMS1xczEpCisgICAgc3RyICAgICAgICAgcjEwLCBbc3AsICM4XSAgICAgICAgICAgICAgIDsgc3RvcmUgcXMxIHRlbXBvcmFyaWx5CisgICAgcWFkZDggICAgICAgcjcsIHI3LCByMTIKKyAgICBzdHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBzdG9yZSBxczAgdGVtcG9yYXJpbHkKKyAgICBxYWRkOCAgICAgICByNywgcjcsIHIxMgorICAgIHN0ciAgICAgICAgIHI4LCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IHN0b3JlIHBzMCB0ZW1wb3JhcmlseQorICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXI6IHI3CisKKyAgICBsZHIgICAgICAgICByMTAsIGMweDAzMDMwMzAzICAgICAgICAgICAgOyByMTAgPSAzIC0tbW9kaWZpZWQgZm9yIHZwOAorICAgIGxkciAgICAgICAgIHI5LCBjMHgwNDA0MDQwNAorCisgICAgYW5kICAgICAgICAgcjcsIHI3LCBsciAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrIChsciBpcyBmcmVlKQorCisgICAgbW92ICAgICAgICAgcjEyLCByNyAgICAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMjogcjEyCisgICAgYW5kICAgICAgICAgcjEyLCByMTIsIHI2ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAmPSBoZXYKKworICAgIDttb2RpZnkgY29kZSBmb3IgdnA4CisgICAgO3NhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMKKyAgICBxYWRkOCAgICAgICByOCAsIHIxMiAsIHI5ICAgICAgICAgICAgICAgOyBGaWx0ZXIxIChyOCkgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMis0KQorICAgIHFhZGQ4ICAgICAgIHIxMiAsIHIxMiAsIHIxMCAgICAgICAgICAgICA7IEZpbHRlcjIgKHIxMikgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiszKQorCisgICAgbW92ICAgICAgICAgcjEwLCAjMAorICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKKyAgICBzaGFkZDggICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCisgICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHIxMAorICAgIHNoYWRkOCAgICAgIHIxMiAsIHIxMiAsIHIxMAorICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IHI4OiBGaWx0ZXIxCisgICAgc2hhZGQ4ICAgICAgcjEyICwgcjEyICwgcjEwICAgICAgICAgICAgIDsgcjEyOiBGaWx0ZXIyCisKKyAgICBsZHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAorICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgcHMwCisKKyAgICBxc3ViOCAgICAgICByOSAsIHI5LCByOCAgICAgICAgICAgICAgICAgOyBxczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSkKKyAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBwczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMikKKworICAgIDtzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszCisgICAgO2FuZCAgICAgICAgICAgIHI4LCByMTIsIHIxMCAgICAgICAgICAgICAgICA7IHMgPSBGaWx0ZXIyICYgNyAoczogcjgpCisgICAgO3FhZGQ4ICAgICAgcjEyICwgcjEyICwgcjkgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyKzQpCisgICAgO21vdiAgICAgICAgICAgIHIxMCwgIzAKKyAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCisgICAgO3VzdWI4ICAgICAgbHIsIHI4LCByOSAgICAgICAgICAgICAgICAgIDsgcyA9IChzPT00KSotMQorICAgIDtzZWwgICAgICAgICAgICBsciwgcjExLCByMTAKKyAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAKKyAgICA7dXN1YjggICAgICByOCwgcjksIHI4CisgICAgO3NlbCAgICAgICAgICAgIHI4LCByMTEsIHIxMAorICAgIDtsZHIgICAgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAorICAgIDtsZHIgICAgICAgICAgICByMTEsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHBzMAorICAgIDtzaGFkZDggICAgIHIxMiAsIHIxMiAsIHIxMAorICAgIDthbmQgICAgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAtMSBmb3IgZWFjaCBlbGVtZW50IHRoYXQgZXF1YWxzIDQKKyAgICA7cWFkZDggICAgICByMTAsIHI4LCByMTIgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHMgKyBGaWx0ZXIyKQorICAgIDtxc3ViOCAgICAgIHI5ICwgcjksIHIxMiAgICAgICAgICAgICAgICA7IHFzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSBGaWx0ZXIyKQorICAgIDtxYWRkOCAgICAgIHIxMSwgcjExLCByMTAgICAgICAgICAgICAgICA7IHBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KQorCisgICAgO2VuZCBvZiBtb2RpZmljYXRpb24gZm9yIHZwOAorCisgICAgYmljICAgICAgICAgcjEyLCByNywgcjYgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSB+aGV2ICAgICggcjYgaXMgZnJlZSkKKyAgICA7bW92ICAgICAgICByMTIsIHI3CisKKyAgICA7cm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgIG1vdiAgICAgICAgIGxyLCAjMHgxYiAgICAgICAgICAgICAgICAgICA7IDI3CisgICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKKworICAgIHN4dGIxNiAgICAgIHI2LCByMTIKKyAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4CisgICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKKyAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNworICAgIHNtbGFiYiAgICAgIHI3LCByMTAsIGxyLCByNworICAgIHNtdWx0YiAgICAgIHIxMCwgcjEwLCBscgorICAgIHNzYXQgICAgICAgIHI4LCAjOCwgcjgsIGFzciAjNworICAgIHNzYXQgICAgICAgIHI2LCAjOCwgcjYsIGFzciAjNworICAgIGFkZCAgICAgICAgIHIxMCwgcjEwLCAjNjMKKyAgICBzc2F0ICAgICAgICByNywgIzgsIHI3LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNworCisgICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCisKKyAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2CisgICAgcGtoYnQgICAgICAgcjEwLCByNywgcjEwLCBsc2wgIzE2CisgICAgdXh0YjE2ICAgICAgcjYsIHI2CisgICAgdXh0YjE2ICAgICAgcjEwLCByMTAKKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcAorCisgICAgb3JyICAgICAgICAgcjEwLCByNiwgcjEwLCBsc2wgIzggICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpPj43KQorCisgICAgcXN1YjggICAgICAgcjgsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB1KQorICAgIHFhZGQ4ICAgICAgIHIxMCwgcjExLCByMTAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgdSkKKyAgICBlb3IgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAqb3EwID0gc14weDgwCisgICAgc3RyICAgICAgICAgcjgsIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgKm9xMAorICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcAorICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgICAgICAgICA7ICpvcDAgPSBzXjB4ODAKKyAgICBzdHIgICAgICAgICByMTAsIFtzcmNdICAgICAgICAgICAgICAgICAgOyBzdG9yZSAqb3AwCisKKyAgICA7cm91Z2hseSAyLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgIG1vdiAgICAgICAgIGxyLCAjMHgxMiAgICAgICAgICAgICAgICAgICA7IDE4CisgICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKKworICAgIHN4dGIxNiAgICAgIHI2LCByMTIKKyAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4CisgICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKKyAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNworICAgIHNtbGFiYiAgICAgIHI5LCByMTAsIGxyLCByNworICAgIHNtbGF0YiAgICAgIHIxMCwgcjEwLCBsciwgcjcKKyAgICBzc2F0ICAgICAgICByOCwgIzgsIHI4LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByNiwgIzgsIHI2LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByOSwgIzgsIHI5LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNworCisgICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCisKKyAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2CisgICAgcGtoYnQgICAgICAgcjEwLCByOSwgcjEwLCBsc2wgIzE2CisKKyAgICBsZHIgICAgICAgICByOSwgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBsb2FkIHFzMQorICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IGxvYWQgcHMxCisKKyAgICB1eHRiMTYgICAgICByNiwgcjYKKyAgICB1eHRiMTYgICAgICByMTAsIHIxMAorCisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwCisKKyAgICBvcnIgICAgICAgICByMTAsIHI2LCByMTAsIGxzbCAjOCAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAxOCk+PjcpCisKKyAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSArIHUpCisgICAgcXN1YjggICAgICAgcjgsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB1KQorICAgIGVvciAgICAgICAgIHIxMSwgcjExLCBsciAgICAgICAgICAgICAgICA7ICpvcDEgPSBzXjB4ODAKKyAgICBzdHIgICAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBzdG9yZSAqb3AxCisgICAgZW9yICAgICAgICAgcjgsIHI4LCBsciAgICAgICAgICAgICAgICAgIDsgKm9xMSA9IHNeMHg4MAorICAgIGFkZCAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMxCisKKyAgICBtb3YgICAgICAgICByNywgIzB4M2YgICAgICAgICAgICAgICAgICAgOyA2MworCisgICAgc3RyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgc3RvcmUgKm9xMQorCisgICAgO3JvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKKyAgICBtb3YgICAgICAgICBsciwgIzB4OSAgICAgICAgICAgICAgICAgICAgOyA5CisgICAgbGRyICAgICAgICAgcjksIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBxMgorCisgICAgc3h0YjE2ICAgICAgcjYsIHIxMgorICAgIHN4dGIxNiAgICAgIHIxMCwgcjEyLCByb3IgIzgKKyAgICBzbWxhYmIgICAgICByOCwgcjYsIGxyLCByNworICAgIHNtbGF0YiAgICAgIHI2LCByNiwgbHIsIHI3CisgICAgc21sYWJiICAgICAgcjEyLCByMTAsIGxyLCByNworICAgIHNtbGF0YiAgICAgIHIxMCwgcjEwLCBsciwgcjcKKyAgICBzc2F0ICAgICAgICByOCwgIzgsIHI4LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByNiwgIzgsIHI2LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByMTIsICM4LCByMTIsIGFzciAjNworICAgIHNzYXQgICAgICAgIHIxMCwgIzgsIHIxMCwgYXNyICM3CisKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgorCisgICAgcGtoYnQgICAgICAgcjYsIHI4LCByNiwgbHNsICMxNgorICAgIHBraGJ0ICAgICAgIHIxMCwgcjEyLCByMTAsIGxzbCAjMTYKKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcAorICAgIGxkciAgICAgICAgIGxyLCBjMHg4MDgwODA4MAorCisgICAgbGRyICAgICAgICAgcjExLCBbc3JjXSAgICAgICAgICAgICAgICAgIDsgbG9hZCBwMgorCisgICAgdXh0YjE2ICAgICAgcjYsIHI2CisgICAgdXh0YjE2ICAgICAgcjEwLCByMTAKKworICAgIGVvciAgICAgICAgIHI5LCByOSwgbHIKKyAgICBlb3IgICAgICAgICByMTEsIHIxMSwgbHIKKworICAgIG9yciAgICAgICAgIHIxMCwgcjYsIHIxMCwgbHNsICM4ICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpPj43KQorCisgICAgcWFkZDggICAgICAgcjgsIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgKyB1KQorICAgIHFzdWI4ICAgICAgIHIxMCwgcjksIHIxMCAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSkKKyAgICBlb3IgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAqb3AyID0gc14weDgwCisgICAgc3RyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCwgbHNsICMyICAgIDsgc3RvcmUgKm9wMgorICAgIGFkZCAgICAgICAgIHNyYywgc3JjLCBwc3RlcAorICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgICAgICAgICA7ICpvcTIgPSBzXjB4ODAKKyAgICBzdHIgICAgICAgICByMTAsIFtzcmNdLCBwc3RlcCwgbHNsICMxICAgOyBzdG9yZSAqb3EyCisKK3xtYmhza2lwX2ZpbHRlcnwKKyAgICBhZGQgICAgICAgICBzcmMsIHNyYywgIzQKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMworICAgIHN1YnMgICAgICAgIGNvdW50LCBjb3VudCwgIzEKKworICAgIGxkcm5lICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAzCisgICAgbGRybmUgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDIKKyAgICBsZHJuZSAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMQorCisgICAgYm5lICAgICAgICAgTUJIbmV4dDgKKworICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzE2CisgICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12NnwKKworCis7LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KK3x2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12NnwgUFJPQworOy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCisgICAgc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQorCisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsICM0ICAgICAgICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQKKyAgICBsZHIgICAgICAgICBjb3VudCwgW3NwLCAjNDBdICAgICAgICAgICAgOyBjb3VudCBmb3IgOC1pbi1wYXJhbGxlbAorICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjMzZdICAgICAgICAgICAgICA7IGxvYWQgdGhyZXNoIGFkZHJlc3MKKyAgICBzdWIgICAgICAgICBzcCwgc3AsICMxNiAgICAgICAgICAgICAgICAgOyBjcmVhdGUgdGVtcCBidWZmZXIKKworICAgIGxkciAgICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKKyAgICBsZHJiICAgICAgICByNCwgW3IyXSAgICAgICAgICAgICAgICAgICAgOyBibGltaXQKKyAgICBsZHIgICAgICAgICByNywgW3NyY10sIHBzdGVwCisgICAgbGRyYiAgICAgICAgcjIsIFtyM10gICAgICAgICAgICAgICAgICAgIDsgbGltaXQKKyAgICBsZHIgICAgICAgICByOCwgW3NyY10sIHBzdGVwCisgICAgb3JyICAgICAgICAgcjQsIHI0LCByNCwgbHNsICM4CisgICAgbGRyYiAgICAgICAgcjMsIFtyMTJdICAgICAgICAgICAgICAgICAgIDsgdGhyZXNoCisgICAgb3JyICAgICAgICAgcjIsIHIyLCByMiwgbHNsICM4CisgICAgbGRyICAgICAgICAgbHIsIFtzcmNdLCBwc3RlcAorICAgIG1vdiAgICAgICAgIGNvdW50LCBjb3VudCwgbHNsICMxICAgICAgICA7IDQtaW4tcGFyYWxsZWwKKyAgICBvcnIgICAgICAgICByNCwgcjQsIHI0LCBsc2wgIzE2CisgICAgb3JyICAgICAgICAgcjMsIHIzLCByMywgbHNsICM4CisgICAgb3JyICAgICAgICAgcjIsIHIyLCByMiwgbHNsICMxNgorICAgIG9yciAgICAgICAgIHIzLCByMywgcjMsIGxzbCAjMTYKKworfFZuZXh0OHwKKworICAgIDsgdnA4X2ZpbHRlcl9tYXNrKCkgZnVuY3Rpb24KKyAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zCisgICAgOyB0cmFuc3Bvc2UgdGhlIHNvdXJjZSBkYXRhIGZvciA0LWluLXBhcmFsbGVsIG9wZXJhdGlvbgorICAgIFRSQU5TUE9TRV9NQVRSSVggcjYsIHI3LCByOCwgbHIsIHI5LCByMTAsIHIxMSwgcjEyCisKKyAgICB1cXN1YjggICAgICByNywgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBwMyAtIHAyCisgICAgdXFzdWI4ICAgICAgcjgsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcDIgLSBwMworICAgIHVxc3ViOCAgICAgIHI5LCByMTAsIHIxMSAgICAgICAgICAgICAgICA7IHAyIC0gcDEKKyAgICB1cXN1YjggICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBwMSAtIHAyCisgICAgb3JyICAgICAgICAgcjcsIHI3LCByOCAgICAgICAgICAgICAgICAgIDsgYWJzIChwMy1wMikKKyAgICBvcnIgICAgICAgICByMTAsIHI5LCByMTAgICAgICAgICAgICAgICAgOyBhYnMgKHAyLXAxKQorICAgIHVxc3ViOCAgICAgIGxyLCByNywgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQuIGxyOiB2cDhfZmlsdGVyX21hc2sKKyAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjIgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBsaW5lcworCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKKworICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHAxIC0gcDAKKyAgICB1cXN1YjggICAgICByNywgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBwMCAtIHAxCisgICAgYWRkICAgICAgICAgc3JjLCBzcmMsICM0ICAgICAgICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciB1cCBieSA0CisgICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMS1wMCkKKyAgICBzdHIgICAgICAgICByMTEsIFtzcCwgIzEyXSAgICAgICAgICAgICAgOyBzYXZlIHAxCisgICAgdXFzdWI4ICAgICAgcjEwLCByNiwgcjIgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAorICAgIHVxc3ViOCAgICAgIHIxMSwgcjYsIHIzICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gdGhyZXNoCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKKworICAgIDsgdHJhbnNwb3NlIHVzZXMgOCByZWdzKHI2IC0gcjEyIGFuZCBscikuIE5lZWQgdG8gc2F2ZSByZWcgdmFsdWUgbm93CisgICAgOyB0cmFuc3Bvc2UgdGhlIHNvdXJjZSBkYXRhIGZvciA0LWluLXBhcmFsbGVsIG9wZXJhdGlvbgorICAgIGxkciAgICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKKyAgICBzdHIgICAgICAgICByMTEsIFtzcF0gICAgICAgICAgICAgICAgICAgOyBwdXNoIHIxMSB0byBzdGFjaworICAgIGxkciAgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKKyAgICBzdHIgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBzYXZlIGN1cnJlbnQgcmVnIGJlZm9yZSBsb2FkIHEwIC0gcTMgZGF0YQorICAgIGxkciAgICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKKyAgICBzdHIgICAgICAgICBsciwgW3NwLCAjOF0KKyAgICBsZHIgICAgICAgICBsciwgW3NyY10sIHBzdGVwCisKKyAgICBUUkFOU1BPU0VfTUFUUklYIHI2LCByNywgcjgsIGxyLCByOSwgcjEwLCByMTEsIHIxMgorCisgICAgbGRyICAgICAgICAgbHIsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgbG9hZCBiYWNrIChmKWxpbWl0IGFjY3VtdWxhdG9yCisKKyAgICB1cXN1YjggICAgICByNiwgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBxMyAtIHEyCisgICAgdXFzdWI4ICAgICAgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgcTIgLSBxMworICAgIHVxc3ViOCAgICAgIHIxMiwgcjExLCByMTAgICAgICAgICAgICAgICA7IHEyIC0gcTEKKyAgICB1cXN1YjggICAgICByMTEsIHIxMCwgcjExICAgICAgICAgICAgICAgOyBxMSAtIHEyCisgICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChxMy1xMikKKyAgICBvcnIgICAgICAgICByNywgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBhYnMgKHEyLXExKQorICAgIHVxc3ViOCAgICAgIHI2LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKyAgICB1cXN1YjggICAgICByNywgcjcsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisgICAgbGRyICAgICAgICAgcjExLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCBiYWNrIHAwCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICMxMl0gICAgICAgICAgICAgIDsgbG9hZCBiYWNrIHAxCisgICAgb3JyICAgICAgICAgbHIsIGxyLCByNgorICAgIG9yciAgICAgICAgIGxyLCBsciwgcjcKKworICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHI5ICAgICAgICAgICAgICAgICA7IHAwIC0gcTAKKyAgICB1cXN1YjggICAgICByNywgcjksIHIxMSAgICAgICAgICAgICAgICAgOyBxMCAtIHAwCisgICAgdXFzdWI4ICAgICAgcjgsIHIxMiwgcjEwICAgICAgICAgICAgICAgIDsgcDEgLSBxMQorICAgIHVxc3ViOCAgICAgIHIxMSwgcjEwLCByMTIgICAgICAgICAgICAgICA7IHExIC0gcDEKKyAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKQorICAgIGxkciAgICAgICAgIHI3LCBjMHg3RjdGN0Y3RgorICAgIG9yciAgICAgICAgIHI4LCByOCwgcjExICAgICAgICAgICAgICAgICA7IGFicyAocDEtcTEpCisgICAgdXFhZGQ4ICAgICAgcjYsIHI2LCByNiAgICAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkgKiAyCisgICAgYW5kICAgICAgICAgcjgsIHI3LCByOCwgbHNyICMxICAgICAgICAgIDsgYWJzIChwMS1xMSkgLyAyCisgICAgdXFzdWI4ICAgICAgcjExLCByMTAsIHI5ICAgICAgICAgICAgICAgIDsgcTEgLSBxMAorICAgIHVxYWRkOCAgICAgIHI2LCByOCwgcjYgICAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApKjIgKyBhYnMgKHAxLXExKS8yCisgICAgdXFzdWI4ICAgICAgcjEyLCByOSwgcjEwICAgICAgICAgICAgICAgIDsgcTAgLSBxMQorICAgIHVxc3ViOCAgICAgIHI2LCByNiwgcjQgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gZmxpbWl0CisKKyAgICBvcnIgICAgICAgICByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBhYnMgKHExLXEwKQorICAgIHVxc3ViOCAgICAgIHI4LCByOSwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKyAgICB1cXN1YjggICAgICByMTAsIHI5LCByMyAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaAorICAgIG9yciAgICAgICAgIGxyLCBsciwgcjYKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHI4CisKKyAgICBtdm4gICAgICAgICByMTEsICMwICAgICAgICAgICAgICAgICAgICAgOyByMTEgPT0gLTEKKyAgICBtb3YgICAgICAgICByMTIsICMwCisKKyAgICB1c3ViOCAgICAgICBsciwgcjEyLCBscgorICAgIGxkciAgICAgICAgIHI5LCBbc3BdICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdGhlIGNvbXBhcmVkIHJlc3VsdAorICAgIHNlbCAgICAgICAgIGxyLCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IGZpbHRlciBtYXNrOiBscgorCisgICAgY21wICAgICAgICAgbHIsICMwCisgICAgYmVxICAgICAgICAgdnNraXBfZmlsdGVyICAgICAgICAgICAgICAgICA7IHNraXAgZmlsdGVyaW5nCisKKyAgICA7dnA4X2hldm1hc2soKSBmdW5jdGlvbgorICAgIDtjYWxjdWxhdGUgaGlnaCBlZGdlIHZhcmlhbmNlCisKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBsaW5lcworCisgICAgb3JyICAgICAgICAgcjksIHI5LCByMTAKKworICAgIGxkcmggICAgICAgIHI3LCBbc3JjLCAjLTJdCisgICAgbGRyaCAgICAgICAgcjgsIFtzcmNdLCBwc3RlcAorCisgICAgdXN1YjggICAgICAgcjksIHIxMiwgcjkKKyAgICBzZWwgICAgICAgICByNiwgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBoZXYgbWFzazogcjYKKworICAgIDt2cDhfZmlsdGVyKCkgZnVuY3Rpb24KKyAgICA7IGxvYWQgc291cmUgZGF0YSB0byByNiwgcjExLCByMTIsIGxyCisgICAgbGRyaCAgICAgICAgcjksIFtzcmMsICMtMl0KKyAgICBsZHJoICAgICAgICByMTAsIFtzcmNdLCBwc3RlcAorCisgICAgcGtoYnQgICAgICAgcjEyLCByNywgcjgsIGxzbCAjMTYKKworICAgIGxkcmggICAgICAgIHI3LCBbc3JjLCAjLTJdCisgICAgbGRyaCAgICAgICAgcjgsIFtzcmNdLCBwc3RlcAorCisgICAgcGtoYnQgICAgICAgcjExLCByOSwgcjEwLCBsc2wgIzE2CisKKyAgICBsZHJoICAgICAgICByOSwgW3NyYywgIy0yXQorICAgIGxkcmggICAgICAgIHIxMCwgW3NyY10sIHBzdGVwCisKKyAgICA7IFRyYW5zcG9zZSBuZWVkcyA4IHJlZ3MocjYgLSByMTIsIGFuZCBscikuIFNhdmUgcjYgYW5kIGxyIGZpcnN0CisgICAgc3RyICAgICAgICAgcjYsIFtzcF0KKyAgICBzdHIgICAgICAgICBsciwgW3NwLCAjNF0KKworICAgIHBraGJ0ICAgICAgIHI2LCByNywgcjgsIGxzbCAjMTYKKyAgICBwa2hidCAgICAgICBsciwgcjksIHIxMCwgbHNsICMxNgorCisgICAgO3RyYW5zcG9zZSByMTIsIHIxMSwgcjYsIGxyIHRvIHI3LCByOCwgcjksIHIxMAorICAgIFRSQU5TUE9TRV9NQVRSSVggcjEyLCByMTEsIHI2LCBsciwgcjcsIHI4LCByOSwgcjEwCisKKyAgICA7bG9hZCBiYWNrIGhldl9tYXNrIHI2IGFuZCBmaWx0ZXJfbWFzayBscgorICAgIGxkciAgICAgICAgIHIxMiwgYzB4ODA4MDgwODAKKyAgICBsZHIgICAgICAgICByNiwgW3NwXQorICAgIGxkciAgICAgICAgIGxyLCBbc3AsICM0XQorCisgICAgZW9yICAgICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKyAgICBlb3IgICAgICAgICByOCwgcjgsIHIxMiAgICAgICAgICAgICAgICAgOyBwMCBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorICAgIGVvciAgICAgICAgIHI5LCByOSwgcjEyICAgICAgICAgICAgICAgICA7IHEwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisgICAgZW9yICAgICAgICAgcjEwLCByMTAsIHIxMiAgICAgICAgICAgICAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKworICAgIHN0ciAgICAgICAgIHI5LCBbc3BdICAgICAgICAgICAgICAgICAgICA7IHN0b3JlIHFzMCB0ZW1wb3JhcmlseQorICAgIHN0ciAgICAgICAgIHI4LCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IHN0b3JlIHBzMCB0ZW1wb3JhcmlseQorICAgIHN0ciAgICAgICAgIHIxMCwgW3NwLCAjOF0gICAgICAgICAgICAgICA7IHN0b3JlIHFzMSB0ZW1wb3JhcmlseQorICAgIHN0ciAgICAgICAgIHI3LCBbc3AsICMxMl0gICAgICAgICAgICAgICA7IHN0b3JlIHBzMSB0ZW1wb3JhcmlseQorCisgICAgcXN1YjggICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMS1xczEpCisgICAgcXN1YjggICAgICAgcjgsIHI5LCByOCAgICAgICAgICAgICAgICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzICogKCBxczAgLSBwczApKQorCisgICAgYW5kICAgICAgICAgcjcsIHI3LCByNiAgICAgICAgICAgICAgICAgIDsgIHZwOF9maWx0ZXIgKHI3KSAmPSBoZXYgKHI3IDogZmlsdGVyKQorCisgICAgcWFkZDggICAgICAgcjcsIHI3LCByOAorICAgIGxkciAgICAgICAgIHI5LCBjMHgwMzAzMDMwMyAgICAgICAgICAgICA7IHI5ID0gMyAtLW1vZGlmaWVkIGZvciB2cDgKKworICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjgKKyAgICBsZHIgICAgICAgICByMTAsIGMweDA0MDQwNDA0CisKKyAgICBxYWRkOCAgICAgICByNywgcjcsIHI4CisgICAgO212biAgICAgICAgIHIxMSwgIzAgICAgICAgICAgICAgICAgICAgICA7IHIxMSA9PSAtMQorCisgICAgYW5kICAgICAgICAgcjcsIHI3LCBsciAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrCisKKyAgICA7bW9kaWZ5IGNvZGUgZm9yIHZwOCAtLSBGaWx0ZXIxID0gdnA4X2ZpbHRlciAocjcpCisgICAgcWFkZDggICAgICAgcjggLCByNyAsIHI5ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAocjgpID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrMykKKyAgICBxYWRkOCAgICAgICByNyAsIHI3ICwgcjEwICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrNCkKKworICAgIG1vdiAgICAgICAgIHI5LCAjMAorICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByOSAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49IDMKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgcjkgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID4+PSAzCisgICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHI5CisgICAgc2hhZGQ4ICAgICAgcjcgLCByNyAsIHI5CisgICAgc2hhZGQ4ICAgICAgbHIgLCByOCAsIHI5ICAgICAgICAgICAgICAgIDsgbHI6IGZpbHRlcjIKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgcjkgICAgICAgICAgICAgICAgOyByNzogZmlsdGVyCisKKyAgICA7dXN1YjggICAgICBsciwgcjgsIHIxMCAgICAgICAgICAgICAgICAgOyBzID0gKHM9PTQpKi0xCisgICAgO3NlbCAgICAgICAgICAgIGxyLCByMTEsIHI5CisgICAgO3VzdWI4ICAgICAgcjgsIHIxMCwgcjgKKyAgICA7c2VsICAgICAgICAgICAgcjgsIHIxMSwgcjkKKyAgICA7YW5kICAgICAgICAgICAgcjgsIHI4LCBsciAgICAgICAgICAgICAgICAgIDsgLTEgZm9yIGVhY2ggZWxlbWVudCB0aGF0IGVxdWFscyA0IC0tIHI4OiBzCisKKyAgICA7Y2FsY3VsYXRlIG91dHB1dAorICAgIDtxYWRkOCAgICAgIGxyLCByOCwgcjcgICAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocyArIHZwOF9maWx0ZXIpCisKKyAgICBsZHIgICAgICAgICByOCwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAorICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IGxvYWQgcHMwCisKKyAgICBsZHIgICAgICAgICByMTAsIGMweDAxMDEwMTAxCisKKyAgICBxc3ViOCAgICAgICByOCwgcjgsIHI3ICAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHZwOF9maWx0ZXIpCisgICAgcWFkZDggICAgICAgcjksIHI5LCBsciAgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKQorICAgIDtlbmQgb2YgbW9kaWZpY2F0aW9uIGZvciB2cDgKKworICAgIGVvciAgICAgICAgIHI4LCByOCwgcjEyCisgICAgZW9yICAgICAgICAgcjksIHI5LCByMTIKKworICAgIG1vdiAgICAgICAgIGxyLCAjMAorCisgICAgc2FkZDggICAgICAgcjcsIHI3LCByMTAKKyAgICBzaGFkZDggICAgICByNywgcjcsIGxyCisKKyAgICBsZHIgICAgICAgICByMTAsIFtzcCwgIzhdICAgICAgICAgICAgICAgOyBsb2FkIHFzMQorICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IGxvYWQgcHMxCisKKyAgICBiaWMgICAgICAgICByNywgcjcsIHI2ICAgICAgICAgICAgICAgICAgOyByNzogdnA4X2ZpbHRlcgorCisgICAgcXN1YjggICAgICAgcjEwICwgcjEwLCByNyAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB2cDhfZmlsdGVyKQorICAgIHFhZGQ4ICAgICAgIHIxMSwgcjExLCByNyAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxICsgdnA4X2ZpbHRlcikKKyAgICBlb3IgICAgICAgICByMTAsIHIxMCwgcjEyCisgICAgZW9yICAgICAgICAgcjExLCByMTEsIHIxMgorCisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIKKworICAgIDt3ZSBjYW4gdXNlIFRSQU5TUE9TRV9NQVRSSVggbWFjcm8gdG8gdHJhbnNwb3NlIG91dHB1dCAtIGlucHV0OiBxMSwgcTAsIHAwLCBwMQorICAgIDtvdXRwdXQgaXMgYjAsIGIxLCBiMiwgYjMKKyAgICA7YjA6IDAzIDAyIDAxIDAwCisgICAgO2IxOiAxMyAxMiAxMSAxMAorICAgIDtiMjogMjMgMjIgMjEgMjAKKyAgICA7YjM6IDMzIDMyIDMxIDMwCisgICAgOyAgICBwMSBwMCBxMCBxMQorICAgIDsgICAoYTMgYTIgYTEgYTApCisgICAgVFJBTlNQT1NFX01BVFJJWCByMTEsIHI5LCByOCwgcjEwLCByNiwgcjcsIHIxMiwgbHIKKworICAgIHN0cmggICAgICAgIHI2LCBbc3JjLCAjLTJdICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHQKKyAgICBtb3YgICAgICAgICByNiwgcjYsIGxzciAjMTYKKyAgICBzdHJoICAgICAgICByNiwgW3NyY10sIHBzdGVwCisKKyAgICBzdHJoICAgICAgICByNywgW3NyYywgIy0yXQorICAgIG1vdiAgICAgICAgIHI3LCByNywgbHNyICMxNgorICAgIHN0cmggICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKKworICAgIHN0cmggICAgICAgIHIxMiwgW3NyYywgIy0yXQorICAgIG1vdiAgICAgICAgIHIxMiwgcjEyLCBsc3IgIzE2CisgICAgc3RyaCAgICAgICAgcjEyLCBbc3JjXSwgcHN0ZXAKKworICAgIHN0cmggICAgICAgIGxyLCBbc3JjLCAjLTJdCisgICAgbW92ICAgICAgICAgbHIsIGxyLCBsc3IgIzE2CisgICAgc3RyaCAgICAgICAgbHIsIFtzcmNdLCBwc3RlcAorCit8dnNraXBfZmlsdGVyfAorICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCAjNAorICAgIHN1YnMgICAgICAgIGNvdW50LCBjb3VudCwgIzEKKworICAgIGxkcm5lICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKKyAgICBsZHJuZSAgICAgICByNywgW3NyY10sIHBzdGVwCisgICAgbGRybmUgICAgICAgcjgsIFtzcmNdLCBwc3RlcAorICAgIGxkcm5lICAgICAgIGxyLCBbc3JjXSwgcHN0ZXAKKworICAgIGJuZSAgICAgICAgIFZuZXh0OAorCisgICAgYWRkICAgICAgICAgc3AsIHNwLCAjMTYKKworICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KKyAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12NnwKKworCisKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorfHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8IFBST0MKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCAjNCAgICAgICAgICAgICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0CisgICAgbGRyICAgICAgICAgY291bnQsIFtzcCwgIzQwXSAgICAgICAgICAgIDsgY291bnQgZm9yIDgtaW4tcGFyYWxsZWwKKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzM2XSAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaCBhZGRyZXNzCisgICAgcGxkICAgICAgICAgW3NyYywgIzIzXSAgICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBmb3IgbmV4dCBibG9jaworICAgIHN1YiAgICAgICAgIHNwLCBzcCwgIzE2ICAgICAgICAgICAgICAgICA7IGNyZWF0ZSB0ZW1wIGJ1ZmZlcgorCisgICAgbGRyICAgICAgICAgcjYsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQorICAgIGxkcmIgICAgICAgIHI0LCBbcjJdICAgICAgICAgICAgICAgICAgICA7IGJsaW1pdAorICAgIHBsZCAgICAgICAgIFtzcmMsICMyM10KKyAgICBsZHIgICAgICAgICByNywgW3NyY10sIHBzdGVwCisgICAgbGRyYiAgICAgICAgcjIsIFtyM10gICAgICAgICAgICAgICAgICAgIDsgbGltaXQKKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcAorICAgIG9yciAgICAgICAgIHI0LCByNCwgcjQsIGxzbCAjOAorICAgIGxkcmIgICAgICAgIHIzLCBbcjEyXSAgICAgICAgICAgICAgICAgICA7IHRocmVzaAorICAgIG9yciAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjOAorICAgIHBsZCAgICAgICAgIFtzcmMsICMyM10KKyAgICBsZHIgICAgICAgICBsciwgW3NyY10sIHBzdGVwCisgICAgbW92ICAgICAgICAgY291bnQsIGNvdW50LCBsc2wgIzEgICAgICAgIDsgNC1pbi1wYXJhbGxlbAorICAgIG9yciAgICAgICAgIHI0LCByNCwgcjQsIGxzbCAjMTYKKyAgICBvcnIgICAgICAgICByMywgcjMsIHIzLCBsc2wgIzgKKyAgICBvcnIgICAgICAgICByMiwgcjIsIHIyLCBsc2wgIzE2CisgICAgb3JyICAgICAgICAgcjMsIHIzLCByMywgbHNsICMxNgorCit8TUJWbmV4dDh8CisgICAgOyB2cDhfZmlsdGVyX21hc2soKSBmdW5jdGlvbgorICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMKKyAgICA7IHRyYW5zcG9zZSB0aGUgc291cmNlIGRhdGEgZm9yIDQtaW4tcGFyYWxsZWwgb3BlcmF0aW9uCisgICAgVFJBTlNQT1NFX01BVFJJWCByNiwgcjcsIHI4LCBsciwgcjksIHIxMCwgcjExLCByMTIKKworICAgIHVxc3ViOCAgICAgIHI3LCByOSwgcjEwICAgICAgICAgICAgICAgICA7IHAzIC0gcDIKKyAgICB1cXN1YjggICAgICByOCwgcjEwLCByOSAgICAgICAgICAgICAgICAgOyBwMiAtIHAzCisgICAgdXFzdWI4ICAgICAgcjksIHIxMCwgcjExICAgICAgICAgICAgICAgIDsgcDIgLSBwMQorICAgIHVxc3ViOCAgICAgIHIxMCwgcjExLCByMTAgICAgICAgICAgICAgICA7IHAxIC0gcDIKKyAgICBvcnIgICAgICAgICByNywgcjcsIHI4ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAzLXAyKQorICAgIG9yciAgICAgICAgIHIxMCwgcjksIHIxMCAgICAgICAgICAgICAgICA7IGFicyAocDItcDEpCisgICAgdXFzdWI4ICAgICAgbHIsIHI3LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdC4gbHI6IHZwOF9maWx0ZXJfbWFzaworICAgIHVxc3ViOCAgICAgIHIxMCwgcjEwLCByMiAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCisKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHIxMAorCisgICAgdXFzdWI4ICAgICAgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgcDEgLSBwMAorICAgIHVxc3ViOCAgICAgIHI3LCByMTIsIHIxMSAgICAgICAgICAgICAgICA7IHAwIC0gcDEKKyAgICBhZGQgICAgICAgICBzcmMsIHNyYywgIzQgICAgICAgICAgICAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIHVwIGJ5IDQKKyAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAxLXAwKQorICAgIHN0ciAgICAgICAgIHIxMSwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IHNhdmUgcDEKKyAgICB1cXN1YjggICAgICByMTAsIHI2LCByMiAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisgICAgdXFzdWI4ICAgICAgcjExLCByNiwgcjMgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byB0aHJlc2gKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHIxMAorCisgICAgOyB0cmFuc3Bvc2UgdXNlcyA4IHJlZ3MocjYgLSByMTIgYW5kIGxyKS4gTmVlZCB0byBzYXZlIHJlZyB2YWx1ZSBub3cKKyAgICA7IHRyYW5zcG9zZSB0aGUgc291cmNlIGRhdGEgZm9yIDQtaW4tcGFyYWxsZWwgb3BlcmF0aW9uCisgICAgbGRyICAgICAgICAgcjYsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQorICAgIHN0ciAgICAgICAgIHIxMSwgW3NwXSAgICAgICAgICAgICAgICAgICA7IHB1c2ggcjExIHRvIHN0YWNrCisgICAgbGRyICAgICAgICAgcjcsIFtzcmNdLCBwc3RlcAorICAgIHN0ciAgICAgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IHNhdmUgY3VycmVudCByZWcgYmVmb3JlIGxvYWQgcTAgLSBxMyBkYXRhCisgICAgbGRyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcAorICAgIHN0ciAgICAgICAgIGxyLCBbc3AsICM4XQorICAgIGxkciAgICAgICAgIGxyLCBbc3JjXSwgcHN0ZXAKKworCisgICAgVFJBTlNQT1NFX01BVFJJWCByNiwgcjcsIHI4LCBsciwgcjksIHIxMCwgcjExLCByMTIKKworICAgIGxkciAgICAgICAgIGxyLCBbc3AsICM4XSAgICAgICAgICAgICAgICA7IGxvYWQgYmFjayAoZilsaW1pdCBhY2N1bXVsYXRvcgorCisgICAgdXFzdWI4ICAgICAgcjYsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgcTMgLSBxMgorICAgIHVxc3ViOCAgICAgIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHEyIC0gcTMKKyAgICB1cXN1YjggICAgICByMTIsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBxMiAtIHExCisgICAgdXFzdWI4ICAgICAgcjExLCByMTAsIHIxMSAgICAgICAgICAgICAgIDsgcTEgLSBxMgorICAgIG9yciAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICA7IGFicyAocTMtcTIpCisgICAgb3JyICAgICAgICAgcjcsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgYWJzIChxMi1xMSkKKyAgICB1cXN1YjggICAgICByNiwgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisgICAgdXFzdWI4ICAgICAgcjcsIHI3LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAorICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgYmFjayBwMAorICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IGxvYWQgYmFjayBwMQorICAgIG9yciAgICAgICAgIGxyLCBsciwgcjYKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHI3CisKKyAgICB1cXN1YjggICAgICByNiwgcjExLCByOSAgICAgICAgICAgICAgICAgOyBwMCAtIHEwCisgICAgdXFzdWI4ICAgICAgcjcsIHI5LCByMTEgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgIHVxc3ViOCAgICAgIHI4LCByMTIsIHIxMCAgICAgICAgICAgICAgICA7IHAxIC0gcTEKKyAgICB1cXN1YjggICAgICByMTEsIHIxMCwgcjEyICAgICAgICAgICAgICAgOyBxMSAtIHAxCisgICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkKKyAgICBsZHIgICAgICAgICByNywgYzB4N0Y3RjdGN0YKKyAgICBvcnIgICAgICAgICByOCwgcjgsIHIxMSAgICAgICAgICAgICAgICAgOyBhYnMgKHAxLXExKQorICAgIHVxYWRkOCAgICAgIHI2LCByNiwgcjYgICAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApICogMgorICAgIGFuZCAgICAgICAgIHI4LCByNywgcjgsIGxzciAjMSAgICAgICAgICA7IGFicyAocDEtcTEpIC8gMgorICAgIHVxc3ViOCAgICAgIHIxMSwgcjEwLCByOSAgICAgICAgICAgICAgICA7IHExIC0gcTAKKyAgICB1cWFkZDggICAgICByNiwgcjgsIHI2ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKSoyICsgYWJzIChwMS1xMSkvMgorICAgIHVxc3ViOCAgICAgIHIxMiwgcjksIHIxMCAgICAgICAgICAgICAgICA7IHEwIC0gcTEKKyAgICB1cXN1YjggICAgICByNiwgcjYsIHI0ICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGZsaW1pdAorCisgICAgb3JyICAgICAgICAgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgYWJzIChxMS1xMCkKKyAgICB1cXN1YjggICAgICByOCwgcjksIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0CisgICAgdXFzdWI4ICAgICAgcjEwLCByOSwgcjMgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byB0aHJlc2gKKyAgICBvcnIgICAgICAgICBsciwgbHIsIHI2CisgICAgb3JyICAgICAgICAgbHIsIGxyLCByOAorCisgICAgbXZuICAgICAgICAgcjExLCAjMCAgICAgICAgICAgICAgICAgICAgIDsgcjExID09IC0xCisgICAgbW92ICAgICAgICAgcjEyLCAjMAorCisgICAgdXN1YjggICAgICAgbHIsIHIxMiwgbHIKKyAgICBsZHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBjb21wYXJlZCByZXN1bHQKKyAgICBzZWwgICAgICAgICBsciwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBmaWx0ZXIgbWFzazogbHIKKworICAgIGNtcCAgICAgICAgIGxyLCAjMAorICAgIGJlcSAgICAgICAgIG1idnNraXBfZmlsdGVyICAgICAgICAgICAgICAgOyBza2lwIGZpbHRlcmluZworCisKKworICAgIDt2cDhfaGV2bWFzaygpIGZ1bmN0aW9uCisgICAgO2NhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCisKKyAgICBvcnIgICAgICAgICByOSwgcjksIHIxMAorCisgICAgbGRyaCAgICAgICAgcjcsIFtzcmMsICMtMl0KKyAgICBsZHJoICAgICAgICByOCwgW3NyY10sIHBzdGVwCisKKyAgICB1c3ViOCAgICAgICByOSwgcjEyLCByOQorICAgIHNlbCAgICAgICAgIHI2LCByMTIsIHIxMSAgICAgICAgICAgICAgICA7IGhldiBtYXNrOiByNgorCisKKyAgICA7IHZwOF9tYmZpbHRlcigpIGZ1bmN0aW9uCisgICAgOyBwMiwgcTIgYXJlIG9ubHkgbmVlZGVkIGF0IHRoZSBlbmQuIERvbid0IG5lZWQgdG8gbG9hZCB0aGVtIGluIG5vdy4KKyAgICA7IFRyYW5zcG9zZSBuZWVkcyA4IHJlZ3MocjYgLSByMTIsIGFuZCBscikuIFNhdmUgcjYgYW5kIGxyIGZpcnN0CisgICAgOyBsb2FkIHNvdXJlIGRhdGEgdG8gcjYsIHIxMSwgcjEyLCBscgorICAgIGxkcmggICAgICAgIHI5LCBbc3JjLCAjLTJdCisgICAgbGRyaCAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAKKworICAgIHBraGJ0ICAgICAgIHIxMiwgcjcsIHI4LCBsc2wgIzE2CisKKyAgICBsZHJoICAgICAgICByNywgW3NyYywgIy0yXQorICAgIGxkcmggICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKKworICAgIHBraGJ0ICAgICAgIHIxMSwgcjksIHIxMCwgbHNsICMxNgorCisgICAgbGRyaCAgICAgICAgcjksIFtzcmMsICMtMl0KKyAgICBsZHJoICAgICAgICByMTAsIFtzcmNdLCBwc3RlcAorCisgICAgc3RyICAgICAgICAgcjYsIFtzcF0gICAgICAgICAgICAgICAgICAgIDsgc2F2ZSByNgorICAgIHN0ciAgICAgICAgIGxyLCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IHNhdmUgbHIKKworICAgIHBraGJ0ICAgICAgIHI2LCByNywgcjgsIGxzbCAjMTYKKyAgICBwa2hidCAgICAgICBsciwgcjksIHIxMCwgbHNsICMxNgorCisgICAgO3RyYW5zcG9zZSByMTIsIHIxMSwgcjYsIGxyIHRvIHAxLCBwMCwgcTAsIHExCisgICAgVFJBTlNQT1NFX01BVFJJWCByMTIsIHIxMSwgcjYsIGxyLCByNywgcjgsIHI5LCByMTAKKworICAgIDtsb2FkIGJhY2sgaGV2X21hc2sgcjYgYW5kIGZpbHRlcl9tYXNrIGxyCisgICAgbGRyICAgICAgICAgcjEyLCBjMHg4MDgwODA4MAorICAgIGxkciAgICAgICAgIHI2LCBbc3BdCisgICAgbGRyICAgICAgICAgbHIsIFtzcCwgIzRdCisKKyAgICBlb3IgICAgICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICAgICAgOyBwczEKKyAgICBlb3IgICAgICAgICByOCwgcjgsIHIxMiAgICAgICAgICAgICAgICAgOyBwczAKKyAgICBlb3IgICAgICAgICByOSwgcjksIHIxMiAgICAgICAgICAgICAgICAgOyBxczAKKyAgICBlb3IgICAgICAgICByMTAsIHIxMCwgcjEyICAgICAgICAgICAgICAgOyBxczEKKworICAgIHFzdWI4ICAgICAgIHIxMiwgcjksIHI4ICAgICAgICAgICAgICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKKyAgICBzdHIgICAgICAgICByNywgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBzdG9yZSBwczEgdGVtcG9yYXJpbHkKKyAgICBxc3ViOCAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxLXFzMSkKKyAgICBzdHIgICAgICAgICByMTAsIFtzcCwgIzhdICAgICAgICAgICAgICAgOyBzdG9yZSBxczEgdGVtcG9yYXJpbHkKKyAgICBxYWRkOCAgICAgICByNywgcjcsIHIxMgorICAgIHN0ciAgICAgICAgIHI5LCBbc3BdICAgICAgICAgICAgICAgICAgICA7IHN0b3JlIHFzMCB0ZW1wb3JhcmlseQorICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjEyCisgICAgc3RyICAgICAgICAgcjgsIFtzcCwgIzRdICAgICAgICAgICAgICAgIDsgc3RvcmUgcHMwIHRlbXBvcmFyaWx5CisgICAgcWFkZDggICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlcjogcjcKKworICAgIGxkciAgICAgICAgIHIxMCwgYzB4MDMwMzAzMDMgICAgICAgICAgICA7IHIxMCA9IDMgLS1tb2RpZmllZCBmb3IgdnA4CisgICAgbGRyICAgICAgICAgcjksIGMweDA0MDQwNDA0CisgICAgO212biAgICAgICAgIHIxMSwgIzAgICAgICAgICAgICAgICAgICAgICA7IHIxMSA9PSAtMQorCisgICAgYW5kICAgICAgICAgcjcsIHI3LCBsciAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrIChsciBpcyBmcmVlKQorCisgICAgbW92ICAgICAgICAgcjEyLCByNyAgICAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMjogcjEyCisgICAgYW5kICAgICAgICAgcjEyLCByMTIsIHI2ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAmPSBoZXYKKworICAgIDttb2RpZnkgY29kZSBmb3IgdnA4CisgICAgO3NhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMKKyAgICBxYWRkOCAgICAgICByOCAsIHIxMiAsIHI5ICAgICAgICAgICAgICAgOyBGaWx0ZXIxIChyOCkgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMis0KQorICAgIHFhZGQ4ICAgICAgIHIxMiAsIHIxMiAsIHIxMCAgICAgICAgICAgICA7IEZpbHRlcjIgKHIxMikgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiszKQorCisgICAgbW92ICAgICAgICAgcjEwLCAjMAorICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKKyAgICBzaGFkZDggICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCisgICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHIxMAorICAgIHNoYWRkOCAgICAgIHIxMiAsIHIxMiAsIHIxMAorICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IHI4OiBGaWx0ZXIxCisgICAgc2hhZGQ4ICAgICAgcjEyICwgcjEyICwgcjEwICAgICAgICAgICAgIDsgcjEyOiBGaWx0ZXIyCisKKyAgICBsZHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAorICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgcHMwCisKKyAgICBxc3ViOCAgICAgICByOSAsIHI5LCByOCAgICAgICAgICAgICAgICAgOyBxczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSkKKyAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBwczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMikKKworICAgIDtzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszCisgICAgO2FuZCAgICAgICAgICAgIHI4LCByMTIsIHIxMCAgICAgICAgICAgICAgICA7IHMgPSBGaWx0ZXIyICYgNyAoczogcjgpCisgICAgO3FhZGQ4ICAgICAgcjEyICwgcjEyICwgcjkgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyKzQpCisgICAgO21vdiAgICAgICAgICAgIHIxMCwgIzAKKyAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCisgICAgO3VzdWI4ICAgICAgbHIsIHI4LCByOSAgICAgICAgICAgICAgICAgIDsgcyA9IChzPT00KSotMQorICAgIDtzZWwgICAgICAgICAgICBsciwgcjExLCByMTAKKyAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAKKyAgICA7dXN1YjggICAgICByOCwgcjksIHI4CisgICAgO3NlbCAgICAgICAgICAgIHI4LCByMTEsIHIxMAorICAgIDtsZHIgICAgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAorICAgIDtsZHIgICAgICAgICAgICByMTEsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHBzMAorICAgIDtzaGFkZDggICAgIHIxMiAsIHIxMiAsIHIxMAorICAgIDthbmQgICAgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAtMSBmb3IgZWFjaCBlbGVtZW50IHRoYXQgZXF1YWxzIDQKKyAgICA7cWFkZDggICAgICByMTAsIHI4LCByMTIgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHMgKyBGaWx0ZXIyKQorICAgIDtxc3ViOCAgICAgIHI5ICwgcjksIHIxMiAgICAgICAgICAgICAgICA7IHFzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSBGaWx0ZXIyKQorICAgIDtxYWRkOCAgICAgIHIxMSwgcjExLCByMTAgICAgICAgICAgICAgICA7IHBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KQorCisgICAgO2VuZCBvZiBtb2RpZmljYXRpb24gZm9yIHZwOAorCisgICAgYmljICAgICAgICAgcjEyLCByNywgcjYgICAgICAgICAgICAgICAgIDt2cDhfZmlsdGVyICY9IH5oZXYgICAgKCByNiBpcyBmcmVlKQorICAgIDttb3YgICAgICAgICAgICByMTIsIHI3CisKKyAgICA7cm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgIG1vdiAgICAgICAgIGxyLCAjMHgxYiAgICAgICAgICAgICAgICAgICA7IDI3CisgICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKKworICAgIHN4dGIxNiAgICAgIHI2LCByMTIKKyAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4CisgICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKKyAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNworICAgIHNtbGFiYiAgICAgIHI3LCByMTAsIGxyLCByNworICAgIHNtdWx0YiAgICAgIHIxMCwgcjEwLCBscgorICAgIHNzYXQgICAgICAgIHI4LCAjOCwgcjgsIGFzciAjNworICAgIHNzYXQgICAgICAgIHI2LCAjOCwgcjYsIGFzciAjNworICAgIGFkZCAgICAgICAgIHIxMCwgcjEwLCAjNjMKKyAgICBzc2F0ICAgICAgICByNywgIzgsIHI3LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNworCisgICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCisKKyAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2CisgICAgcGtoYnQgICAgICAgcjEwLCByNywgcjEwLCBsc2wgIzE2CisgICAgdXh0YjE2ICAgICAgcjYsIHI2CisgICAgdXh0YjE2ICAgICAgcjEwLCByMTAKKworICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCisKKyAgICBvcnIgICAgICAgICByMTAsIHI2LCByMTAsIGxzbCAjOCAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAyNyk+PjcpCisKKyAgICBxc3ViOCAgICAgICByOCwgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpCisgICAgcWFkZDggICAgICAgcjEwLCByMTEsIHIxMCAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KQorICAgIGVvciAgICAgICAgIHI4LCByOCwgbHIgICAgICAgICAgICAgICAgICA7ICpvcTAgPSBzXjB4ODAKKyAgICBlb3IgICAgICAgICByMTAsIHIxMCwgbHIgICAgICAgICAgICAgICAgOyAqb3AwID0gc14weDgwCisKKyAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtMV0gICAgICAgICAgICAgOyBzdG9yZSBvcDAgcmVzdWx0CisgICAgc3RyYiAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgc3RvcmUgb3EwIHJlc3VsdAorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKKyAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAorICAgIHN0cmIgICAgICAgIHIxMCwgW3NyYywgIy0xXQorICAgIHN0cmIgICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNyICM4CisgICAgbW92ICAgICAgICAgcjgsIHI4LCBsc3IgIzgKKyAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtMV0KKyAgICBzdHJiICAgICAgICByOCwgW3NyY10sIHBzdGVwCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzciAjOAorICAgIG1vdiAgICAgICAgIHI4LCByOCwgbHNyICM4CisgICAgc3RyYiAgICAgICAgcjEwLCBbc3JjLCAjLTFdCisgICAgc3RyYiAgICAgICAgcjgsIFtzcmNdLCBwc3RlcAorCisgICAgO3JvdWdobHkgMi83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKKyAgICBtb3YgICAgICAgICBsciwgIzB4MTIgICAgICAgICAgICAgICAgICAgOyAxOAorICAgIG1vdiAgICAgICAgIHI3LCAjMHgzZiAgICAgICAgICAgICAgICAgICA7IDYzCisKKyAgICBzeHRiMTYgICAgICByNiwgcjEyCisgICAgc3h0YjE2ICAgICAgcjEwLCByMTIsIHJvciAjOAorICAgIHNtbGFiYiAgICAgIHI4LCByNiwgbHIsIHI3CisgICAgc21sYXRiICAgICAgcjYsIHI2LCBsciwgcjcKKyAgICBzbWxhYmIgICAgICByOSwgcjEwLCBsciwgcjcKKworICAgIHNtbGF0YiAgICAgIHIxMCwgcjEwLCBsciwgcjcKKyAgICBzc2F0ICAgICAgICByOCwgIzgsIHI4LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByNiwgIzgsIHI2LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByOSwgIzgsIHI5LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNworCisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgbGluZXMKKworICAgIHBraGJ0ICAgICAgIHI2LCByOCwgcjYsIGxzbCAjMTYKKyAgICBwa2hidCAgICAgICByMTAsIHI5LCByMTAsIGxzbCAjMTYKKworICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM4XSAgICAgICAgICAgICAgICA7IGxvYWQgcXMxCisgICAgbGRyICAgICAgICAgcjExLCBbc3AsICMxMl0gICAgICAgICAgICAgIDsgbG9hZCBwczEKKyAgICBsZHIgICAgICAgICBsciwgYzB4ODA4MDgwODAKKworICAgIHV4dGIxNiAgICAgIHI2LCByNgorICAgIHV4dGIxNiAgICAgIHIxMCwgcjEwCisKKyAgICBhZGQgICAgICAgICBzcmMsIHNyYywgIzIKKworICAgIG9yciAgICAgICAgIHIxMCwgcjYsIHIxMCwgbHNsICM4ICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDE4KT4+NykKKworICAgIHFzdWI4ICAgICAgIHI4LCByOSwgcjEwICAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMxIC0gdSkKKyAgICBxYWRkOCAgICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSArIHUpCisgICAgZW9yICAgICAgICAgcjgsIHI4LCBsciAgICAgICAgICAgICAgICAgIDsgKm9xMSA9IHNeMHg4MAorICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgICAgICAgICA7ICpvcDEgPSBzXjB4ODAKKworICAgIGxkcmIgICAgICAgIHIxMSwgW3NyYywgIy01XSAgICAgICAgICAgICA7IGxvYWQgcDIgZm9yIDEvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5CisgICAgc3RyYiAgICAgICAgcjEwLCBbc3JjLCAjLTRdICAgICAgICAgICAgIDsgc3RvcmUgb3AxCisgICAgc3RyYiAgICAgICAgcjgsIFtzcmMsICMtMV0gICAgICAgICAgICAgIDsgc3RvcmUgb3ExCisgICAgbGRyYiAgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgbG9hZCBxMiBmb3IgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKKworICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKKyAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAorCisgICAgbGRyYiAgICAgICAgcjYsIFtzcmMsICMtNV0KKyAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtNF0KKyAgICBzdHJiICAgICAgICByOCwgW3NyYywgIy0xXQorICAgIGxkcmIgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKKworICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKKyAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAorICAgIG9yciAgICAgICAgIHIxMSwgcjExLCByNiwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjksIHI5LCByNywgbHNsICM4CisKKyAgICBsZHJiICAgICAgICByNiwgW3NyYywgIy01XQorICAgIHN0cmIgICAgICAgIHIxMCwgW3NyYywgIy00XQorICAgIHN0cmIgICAgICAgIHI4LCBbc3JjLCAjLTFdCisgICAgbGRyYiAgICAgICAgcjcsIFtzcmNdLCBwc3RlcAorCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzciAjOAorICAgIG1vdiAgICAgICAgIHI4LCByOCwgbHNyICM4CisgICAgb3JyICAgICAgICAgcjExLCByMTEsIHI2LCBsc2wgIzE2CisgICAgb3JyICAgICAgICAgcjksIHI5LCByNywgbHNsICMxNgorCisgICAgbGRyYiAgICAgICAgcjYsIFtzcmMsICMtNV0KKyAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtNF0KKyAgICBzdHJiICAgICAgICByOCwgW3NyYywgIy0xXQorICAgIGxkcmIgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKKyAgICBvcnIgICAgICAgICByMTEsIHIxMSwgcjYsIGxzbCAjMjQKKyAgICBvcnIgICAgICAgICByOSwgcjksIHI3LCBsc2wgIzI0CisKKyAgICA7cm91Z2hseSAxLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgIGVvciAgICAgICAgIHI5LCByOSwgbHIKKyAgICBlb3IgICAgICAgICByMTEsIHIxMSwgbHIKKworICAgIG1vdiAgICAgICAgIGxyLCAjMHg5ICAgICAgICAgICAgICAgICAgICA7IDkKKyAgICBtb3YgICAgICAgICByNywgIzB4M2YgICAgICAgICAgICAgICAgICAgOyA2MworCisgICAgc3h0YjE2ICAgICAgcjYsIHIxMgorICAgIHN4dGIxNiAgICAgIHIxMCwgcjEyLCByb3IgIzgKKyAgICBzbWxhYmIgICAgICByOCwgcjYsIGxyLCByNworICAgIHNtbGF0YiAgICAgIHI2LCByNiwgbHIsIHI3CisgICAgc21sYWJiICAgICAgcjEyLCByMTAsIGxyLCByNworICAgIHNtbGF0YiAgICAgIHIxMCwgcjEwLCBsciwgcjcKKyAgICBzc2F0ICAgICAgICByOCwgIzgsIHI4LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByNiwgIzgsIHI2LCBhc3IgIzcKKyAgICBzc2F0ICAgICAgICByMTIsICM4LCByMTIsIGFzciAjNworICAgIHNzYXQgICAgICAgIHIxMCwgIzgsIHIxMCwgYXNyICM3CisKKyAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgorCisgICAgcGtoYnQgICAgICAgcjYsIHI4LCByNiwgbHNsICMxNgorICAgIHBraGJ0ICAgICAgIHIxMCwgcjEyLCByMTAsIGxzbCAjMTYKKworICAgIHV4dGIxNiAgICAgIHI2LCByNgorICAgIHV4dGIxNiAgICAgIHIxMCwgcjEwCisKKyAgICBsZHIgICAgICAgICBsciwgYzB4ODA4MDgwODAKKworICAgIG9yciAgICAgICAgIHIxMCwgcjYsIHIxMCwgbHNsICM4ICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpPj43KQorCisgICAgcWFkZDggICAgICAgcjgsIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgKyB1KQorICAgIHFzdWI4ICAgICAgIHIxMCwgcjksIHIxMCAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSkKKyAgICBlb3IgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAqb3AyID0gc14weDgwCisgICAgZW9yICAgICAgICAgcjEwLCByMTAsIGxyICAgICAgICAgICAgICAgIDsgKm9xMiA9IHNeMHg4MAorCisgICAgc3RyYiAgICAgICAgcjgsIFtzcmMsICMtNV0gICAgICAgICAgICAgIDsgc3RvcmUgKm9wMgorICAgIHN0cmIgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHN0b3JlICpvcTIKKyAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKKyAgICBzdHJiICAgICAgICByOCwgW3NyYywgIy01XQorICAgIHN0cmIgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwCisgICAgbW92ICAgICAgICAgcjgsIHI4LCBsc3IgIzgKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNyICM4CisgICAgc3RyYiAgICAgICAgcjgsIFtzcmMsICMtNV0KKyAgICBzdHJiICAgICAgICByMTAsIFtzcmNdLCBwc3RlcAorICAgIG1vdiAgICAgICAgIHI4LCByOCwgbHNyICM4CisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzciAjOAorICAgIHN0cmIgICAgICAgIHI4LCBbc3JjLCAjLTVdCisgICAgc3RyYiAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAKKworICAgIDthZGp1c3Qgc3JjIHBvaW50ZXIgZm9yIG5leHQgbG9vcAorICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCAjMgorCit8bWJ2c2tpcF9maWx0ZXJ8CisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsICM0CisgICAgc3VicyAgICAgICAgY291bnQsIGNvdW50LCAjMQorCisgICAgcGxkICAgICAgICAgW3NyYywgIzIzXSAgICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBmb3IgbmV4dCBibG9jaworICAgIGxkcm5lICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRybmUgICAgICAgcjcsIFtzcmNdLCBwc3RlcAorICAgIHBsZCAgICAgICAgIFtzcmMsICMyM10KKyAgICBsZHJuZSAgICAgICByOCwgW3NyY10sIHBzdGVwCisgICAgcGxkICAgICAgICAgW3NyYywgIzIzXQorICAgIGxkcm5lICAgICAgIGxyLCBbc3JjXSwgcHN0ZXAKKworICAgIGJuZSAgICAgICAgIE1CVm5leHQ4CisKKyAgICBhZGQgICAgICAgICBzcCwgc3AsICMxNgorCisgICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8CisKKzsgQ29uc3RhbnQgUG9vbAorYzB4ODA4MDgwODAgRENEICAgICAweDgwODA4MDgwCitjMHgwMzAzMDMwMyBEQ0QgICAgIDB4MDMwMzAzMDMKK2MweDA0MDQwNDA0IERDRCAgICAgMHgwNDA0MDQwNAorYzB4MDEwMTAxMDEgRENEICAgICAweDAxMDEwMTAxCitjMHg3RjdGN0Y3RiBEQ0QgICAgIDB4N0Y3RjdGN0YKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3NpbXBsZWxvb3BmaWx0ZXJfdjYuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3NpbXBsZWxvb3BmaWx0ZXJfdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDBjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvc2ltcGxlbG9vcGZpbHRlcl92Ni5hc20KQEAgLTAsMCArMSwyODYgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2FybXY2fAorICAgIEVYUE9SVCB8dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2FybXY2fAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQorCisgICAgTUFDUk8KKyAgICBUUkFOU1BPU0VfTUFUUklYICRhMCwgJGExLCAkYTIsICRhMywgJGIwLCAkYjEsICRiMiwgJGIzCisgICAgOyBpbnB1dDogJGEwLCAkYTEsICRhMiwgJGEzOyBvdXRwdXQ6ICRiMCwgJGIxLCAkYjIsICRiMworICAgIDsgYTA6IDAzIDAyIDAxIDAwCisgICAgOyBhMTogMTMgMTIgMTEgMTAKKyAgICA7IGEyOiAyMyAyMiAyMSAyMAorICAgIDsgYTM6IDMzIDMyIDMxIDMwCisgICAgOyAgICAgYjMgYjIgYjEgYjAKKworICAgIHV4dGIxNiAgICAgICRiMSwgJGExICAgICAgICAgICAgICAgICAgICA7IHh4IDEyIHh4IDEwCisgICAgdXh0YjE2ICAgICAgJGIwLCAkYTAgICAgICAgICAgICAgICAgICAgIDsgeHggMDIgeHggMDAKKyAgICB1eHRiMTYgICAgICAkYjMsICRhMyAgICAgICAgICAgICAgICAgICAgOyB4eCAzMiB4eCAzMAorICAgIHV4dGIxNiAgICAgICRiMiwgJGEyICAgICAgICAgICAgICAgICAgICA7IHh4IDIyIHh4IDIwCisgICAgb3JyICAgICAgICAgJGIxLCAkYjAsICRiMSwgbHNsICM4ICAgICAgIDsgMTIgMDIgMTAgMDAKKyAgICBvcnIgICAgICAgICAkYjMsICRiMiwgJGIzLCBsc2wgIzggICAgICAgOyAzMiAyMiAzMCAyMAorCisgICAgdXh0YjE2ICAgICAgJGExLCAkYTEsIHJvciAjOCAgICAgICAgICAgIDsgeHggMTMgeHggMTEKKyAgICB1eHRiMTYgICAgICAkYTMsICRhMywgcm9yICM4ICAgICAgICAgICAgOyB4eCAzMyB4eCAzMQorICAgIHV4dGIxNiAgICAgICRhMCwgJGEwLCByb3IgIzggICAgICAgICAgICA7IHh4IDAzIHh4IDAxCisgICAgdXh0YjE2ICAgICAgJGEyLCAkYTIsIHJvciAjOCAgICAgICAgICAgIDsgeHggMjMgeHggMjEKKyAgICBvcnIgICAgICAgICAkYTAsICRhMCwgJGExLCBsc2wgIzggICAgICAgOyAxMyAwMyAxMSAwMQorICAgIG9yciAgICAgICAgICRhMiwgJGEyLCAkYTMsIGxzbCAjOCAgICAgICA7IDMzIDIzIDMxIDIxCisKKyAgICBwa2h0YiAgICAgICAkYjIsICRiMywgJGIxLCBhc3IgIzE2ICAgICAgOyAzMiAyMiAxMiAwMiAgIC0tIHAxCisgICAgcGtoYnQgICAgICAgJGIwLCAkYjEsICRiMywgbHNsICMxNiAgICAgIDsgMzAgMjAgMTAgMDAgICAtLSBwMworCisgICAgcGtodGIgICAgICAgJGIzLCAkYTIsICRhMCwgYXNyICMxNiAgICAgIDsgMzMgMjMgMTMgMDMgICAtLSBwMAorICAgIHBraGJ0ICAgICAgICRiMSwgJGEwLCAkYTIsIGxzbCAjMTYgICAgICA7IDMxIDIxIDExIDAxICAgLS0gcDIKKyAgICBNRU5ECisKKworCitzcmMgICAgICAgICBSTiAgcjAKK3BzdGVwICAgICAgIFJOICByMQorCis7cjAgICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7cjEgICAgIGludCBzcmNfcGl4ZWxfc3RlcCwKKztyMiAgICAgY29uc3QgY2hhciAqYmxpbWl0CisKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2FybXY2fCBQUk9DCis7LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KKyAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBsZHJiICAgICAgICByMTIsIFtyMl0gICAgICAgICAgICAgICAgICAgOyBibGltaXQKKyAgICBsZHIgICAgICAgICByMywgW3NyYywgLXBzdGVwLCBsc2wgIzFdICAgOyBwMQorICAgIGxkciAgICAgICAgIHI0LCBbc3JjLCAtcHN0ZXBdICAgICAgICAgICA7IHAwCisgICAgbGRyICAgICAgICAgcjUsIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgcTAKKyAgICBsZHIgICAgICAgICByNiwgW3NyYywgcHN0ZXBdICAgICAgICAgICAgOyBxMQorICAgIG9yciAgICAgICAgIHIxMiwgcjEyLCByMTIsIGxzbCAjOCAgICAgICA7IGJsaW1pdAorICAgIGxkciAgICAgICAgIHIyLCBjMHg4MDgwODA4MAorICAgIG9yciAgICAgICAgIHIxMiwgcjEyLCByMTIsIGxzbCAjMTYgICAgICA7IGJsaW1pdAorICAgIG1vdiAgICAgICAgIHI5LCAjNCAgICAgICAgICAgICAgICAgICAgICA7IGRvdWJsZSB0aGUgY291bnQuIHdlJ3JlIGRvaW5nIDQgYXQgYSB0aW1lCisgICAgbW92ICAgICAgICAgbHIsICMwICAgICAgICAgICAgICAgICAgICAgIDsgbmVlZCAwIGluIGEgY291cGxlIHBsYWNlcworCit8c2ltcGxlX2huZXh0OHwKKyAgICA7IHZwOF9zaW1wbGVfZmlsdGVyX21hc2soKQorCisgICAgdXFzdWI4ICAgICAgcjcsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMQorICAgIHVxc3ViOCAgICAgIHI4LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IHExIC0gcDEKKyAgICB1cXN1YjggICAgICByMTAsIHI0LCByNSAgICAgICAgICAgICAgICAgOyBwMCAtIHEwCisgICAgdXFzdWI4ICAgICAgcjExLCByNSwgcjQgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgIG9yciAgICAgICAgIHI4LCByOCwgcjcgICAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKQorICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByMTEgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorICAgIHVxYWRkOCAgICAgIHIxMCwgcjEwLCByMTAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIKKyAgICB1aGFkZDggICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBxMikgPj4gMQorICAgIHVxYWRkOCAgICAgIHIxMCwgcjEwLCByOCAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSoyICsgYWJzKHAxIC0gcTEpLzIKKyAgICBtdm4gICAgICAgICByOCwgIzAKKyAgICB1c3ViOCAgICAgICByMTAsIHIxMiwgcjEwICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGZsaW1pdC4gdXN1Yjggc2V0cyBHRSBmbGFncworICAgIHNlbCAgICAgICAgIHIxMCwgcjgsIGxyICAgICAgICAgICAgICAgICA7IGZpbHRlciBtYXNrOiBGIG9yIDAKKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgYmVxICAgICAgICAgc2ltcGxlX2hza2lwX2ZpbHRlciAgICAgICAgIDsgc2tpcCBmaWx0ZXJpbmcgaWYgYWxsIG1hc2tzIGFyZSAweDAwCisKKyAgICA7dnA4X3NpbXBsZV9maWx0ZXIoKQorCisgICAgZW9yICAgICAgICAgcjMsIHIzLCByMiAgICAgICAgICAgICAgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKyAgICBlb3IgICAgICAgICByNiwgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorICAgIGVvciAgICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7IHAwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisgICAgZW9yICAgICAgICAgcjUsIHI1LCByMiAgICAgICAgICAgICAgICAgIDsgcTAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKworICAgIHFzdWI4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSBwMSAtIHExCisgICAgcXN1YjggICAgICAgcjYsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgIHFhZGQ4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7ICs9IHEwIC0gcDAKKyAgICBsZHIgICAgICAgICByNywgYzB4MDQwNDA0MDQKKyAgICBxYWRkOCAgICAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyArPSBxMCAtIHAwCisgICAgbGRyICAgICAgICAgcjgsIGMweDAzMDMwMzAzCisgICAgcWFkZDggICAgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHAxLXExICsgMyoocTAtcDApKQorICAgIDtTVEFMTAorICAgIGFuZCAgICAgICAgIHIzLCByMywgcjEwICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzaworCisgICAgcWFkZDggICAgICAgcjcgLCByMyAsIHI3ICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA9IHZwOF9maWx0ZXIgKyA0CisgICAgcWFkZDggICAgICAgcjggLCByMyAsIHI4ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9maWx0ZXIgKyAzCisKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgbHIKKyAgICBzaGFkZDggICAgICByOCAsIHI4ICwgbHIKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgbHIKKyAgICBzaGFkZDggICAgICByOCAsIHI4ICwgbHIKKyAgICBzaGFkZDggICAgICByNyAsIHI3ICwgbHIgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID4+PSAzCisgICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIGxyICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMworCisgICAgcXN1YjggICAgICAgcjUgLHI1LCByNyAgICAgICAgICAgICAgICAgIDsgdSA9IHEwIC0gRmlsdGVyMQorICAgIHFhZGQ4ICAgICAgIHI0LCByNCwgcjggICAgICAgICAgICAgICAgICA7IHUgPSBwMCArIEZpbHRlcjIKKyAgICBlb3IgICAgICAgICByNSwgcjUsIHIyICAgICAgICAgICAgICAgICAgOyAqb3EwID0gdV4weDgwCisgICAgc3RyICAgICAgICAgcjUsIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgb3EwIHJlc3VsdAorICAgIGVvciAgICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7ICpvcDAgPSB1XjB4ODAKKyAgICBzdHIgICAgICAgICByNCwgW3NyYywgLXBzdGVwXSAgICAgICAgICAgOyBzdG9yZSBvcDAgcmVzdWx0CisKK3xzaW1wbGVfaHNraXBfZmlsdGVyfAorICAgIHN1YnMgICAgICAgIHI5LCByOSwgIzEKKyAgICBhZGRuZSAgICAgICBzcmMsIHNyYywgIzQgICAgICAgICAgICAgICAgOyBuZXh0IHJvdworCisgICAgbGRybmUgICAgICAgcjMsIFtzcmMsIC1wc3RlcCwgbHNsICMxXSAgIDsgcDEKKyAgICBsZHJuZSAgICAgICByNCwgW3NyYywgLXBzdGVwXSAgICAgICAgICAgOyBwMAorICAgIGxkcm5lICAgICAgIHI1LCBbc3JjXSAgICAgICAgICAgICAgICAgICA7IHEwCisgICAgbGRybmUgICAgICAgcjYsIFtzcmMsIHBzdGVwXSAgICAgICAgICAgIDsgcTEKKworICAgIGJuZSAgICAgICAgIHNpbXBsZV9obmV4dDgKKworICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KKyAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12NnwKKworCis7LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KK3x2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8IFBST0MKKzstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KKworICAgIGxkcmIgICAgICAgIHIxMiwgW3IyXSAgICAgICAgICAgICAgICAgICA7IHIxMjogYmxpbWl0CisgICAgbGRyICAgICAgICAgcjIsIGMweDgwODA4MDgwCisgICAgb3JyICAgICAgICAgcjEyLCByMTIsIHIxMiwgbHNsICM4CisKKyAgICA7IGxvYWQgc291cmUgZGF0YSB0byByNywgcjgsIHI5LCByMTAKKyAgICBsZHJoICAgICAgICByMywgW3NyYywgIy0yXQorICAgIHBsZCAgICAgICAgIFtzcmMsICMyM10gICAgICAgICAgICAgICAgICA7IHByZWxvYWQgZm9yIG5leHQgYmxvY2sKKyAgICBsZHJoICAgICAgICByNCwgW3NyY10sIHBzdGVwCisgICAgb3JyICAgICAgICAgcjEyLCByMTIsIHIxMiwgbHNsICMxNgorCisgICAgbGRyaCAgICAgICAgcjUsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRyaCAgICAgICAgcjYsIFtzcmNdLCBwc3RlcAorCisgICAgcGtoYnQgICAgICAgcjcsIHIzLCByNCwgbHNsICMxNgorCisgICAgbGRyaCAgICAgICAgcjMsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRyaCAgICAgICAgcjQsIFtzcmNdLCBwc3RlcAorCisgICAgcGtoYnQgICAgICAgcjgsIHI1LCByNiwgbHNsICMxNgorCisgICAgbGRyaCAgICAgICAgcjUsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRyaCAgICAgICAgcjYsIFtzcmNdLCBwc3RlcAorICAgIG1vdiAgICAgICAgIHIxMSwgIzQgICAgICAgICAgICAgICAgICAgICA7IGRvdWJsZSB0aGUgY291bnQuIHdlJ3JlIGRvaW5nIDQgYXQgYSB0aW1lCisKK3xzaW1wbGVfdm5leHQ4fAorICAgIDsgdnA4X3NpbXBsZV9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCisgICAgcGtoYnQgICAgICAgcjksIHIzLCByNCwgbHNsICMxNgorICAgIHBraGJ0ICAgICAgIHIxMCwgcjUsIHI2LCBsc2wgIzE2CisKKyAgICA7dHJhbnNwb3NlIHI3LCByOCwgcjksIHIxMCB0byByMywgcjQsIHI1LCByNgorICAgIFRSQU5TUE9TRV9NQVRSSVggcjcsIHI4LCByOSwgcjEwLCByMywgcjQsIHI1LCByNgorCisgICAgdXFzdWI4ICAgICAgcjcsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMQorICAgIHVxc3ViOCAgICAgIHI4LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IHExIC0gcDEKKyAgICB1cXN1YjggICAgICByOSwgcjQsIHI1ICAgICAgICAgICAgICAgICAgOyBwMCAtIHEwCisgICAgdXFzdWI4ICAgICAgcjEwLCByNSwgcjQgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgIG9yciAgICAgICAgIHI3LCByNywgcjggICAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKQorICAgIG9yciAgICAgICAgIHI5LCByOSwgcjEwICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorICAgIG1vdiAgICAgICAgIHI4LCAjMAorICAgIHVxYWRkOCAgICAgIHI5LCByOSwgcjkgICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIKKyAgICB1aGFkZDggICAgICByNywgcjcsIHI4ICAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBxMSkgLyAyCisgICAgdXFhZGQ4ICAgICAgcjcsIHI3LCByOSAgICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApKjIgKyBhYnMocDEgLSBxMSkvMgorICAgIG12biAgICAgICAgIHIxMCwgIzAgICAgICAgICAgICAgICAgICAgICA7IHIxMCA9PSAtMQorCisgICAgdXN1YjggICAgICAgcjcsIHIxMiwgcjcgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBmbGltaXQKKyAgICBzZWwgICAgICAgICBsciwgcjEwLCByOCAgICAgICAgICAgICAgICAgOyBmaWx0ZXIgbWFzaworCisgICAgY21wICAgICAgICAgbHIsICMwCisgICAgYmVxICAgICAgICAgc2ltcGxlX3Zza2lwX2ZpbHRlciAgICAgICAgIDsgc2tpcCBmaWx0ZXJpbmcKKworICAgIDt2cDhfc2ltcGxlX2ZpbHRlcigpIGZ1bmN0aW9uCisgICAgZW9yICAgICAgICAgcjMsIHIzLCByMiAgICAgICAgICAgICAgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKyAgICBlb3IgICAgICAgICByNiwgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorICAgIGVvciAgICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7IHAwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisgICAgZW9yICAgICAgICAgcjUsIHI1LCByMiAgICAgICAgICAgICAgICAgIDsgcTAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKworICAgIHFzdWI4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSBwMSAtIHExCisgICAgcXN1YjggICAgICAgcjYsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAorCisgICAgcWFkZDggICAgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciArPSBxMCAtIHAwCisgICAgbGRyICAgICAgICAgcjksIGMweDAzMDMwMzAzICAgICAgICAgICAgIDsgcjkgPSAzCisKKyAgICBxYWRkOCAgICAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICs9IHEwIC0gcDAKKyAgICBsZHIgICAgICAgICByNywgYzB4MDQwNDA0MDQKKworICAgIHFhZGQ4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSBwMS1xMSArIDMqKHEwLXAwKSkKKyAgICA7U1RBTEwKKyAgICBhbmQgICAgICAgICByMywgcjMsIGxyICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IG1hc2sKKworICAgIHFhZGQ4ICAgICAgIHI5ICwgcjMgLCByOSAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPSB2cDhfZmlsdGVyICsgMworICAgIHFhZGQ4ICAgICAgIHIzICwgcjMgLCByNyAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPSB2cDhfZmlsdGVyICsgNAorCisgICAgc2hhZGQ4ICAgICAgcjkgLCByOSAsIHI4CisgICAgc2hhZGQ4ICAgICAgcjMgLCByMyAsIHI4CisgICAgc2hhZGQ4ICAgICAgcjkgLCByOSAsIHI4CisgICAgc2hhZGQ4ICAgICAgcjMgLCByMyAsIHI4CisgICAgc2hhZGQ4ICAgICAgcjkgLCByOSAsIHI4ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMworICAgIHNoYWRkOCAgICAgIHIzICwgcjMgLCByOCAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKKworICAgIDtjYWxjdWxhdGUgb3V0cHV0CisgICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIKKworICAgIHFhZGQ4ICAgICAgIHI0LCByNCwgcjkgICAgICAgICAgICAgICAgICA7IHUgPSBwMCArIEZpbHRlcjIKKyAgICBxc3ViOCAgICAgICByNSwgcjUsIHIzICAgICAgICAgICAgICAgICAgOyB1ID0gcTAgLSBGaWx0ZXIxCisgICAgZW9yICAgICAgICAgcjQsIHI0LCByMiAgICAgICAgICAgICAgICAgIDsgKm9wMCA9IHVeMHg4MAorICAgIGVvciAgICAgICAgIHI1LCByNSwgcjIgICAgICAgICAgICAgICAgICA7ICpvcTAgPSB1XjB4ODAKKworICAgIHN0cmIgICAgICAgIHI0LCBbc3JjLCAjLTFdICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHQKKyAgICBtb3YgICAgICAgICByNCwgcjQsIGxzciAjOAorICAgIHN0cmIgICAgICAgIHI1LCBbc3JjXSwgcHN0ZXAKKyAgICBtb3YgICAgICAgICByNSwgcjUsIGxzciAjOAorCisgICAgc3RyYiAgICAgICAgcjQsIFtzcmMsICMtMV0KKyAgICBtb3YgICAgICAgICByNCwgcjQsIGxzciAjOAorICAgIHN0cmIgICAgICAgIHI1LCBbc3JjXSwgcHN0ZXAKKyAgICBtb3YgICAgICAgICByNSwgcjUsIGxzciAjOAorCisgICAgc3RyYiAgICAgICAgcjQsIFtzcmMsICMtMV0KKyAgICBtb3YgICAgICAgICByNCwgcjQsIGxzciAjOAorICAgIHN0cmIgICAgICAgIHI1LCBbc3JjXSwgcHN0ZXAKKyAgICBtb3YgICAgICAgICByNSwgcjUsIGxzciAjOAorCisgICAgc3RyYiAgICAgICAgcjQsIFtzcmMsICMtMV0KKyAgICBzdHJiICAgICAgICByNSwgW3NyY10sIHBzdGVwCisKK3xzaW1wbGVfdnNraXBfZmlsdGVyfAorICAgIHN1YnMgICAgICAgIHIxMSwgcjExLCAjMQorCisgICAgOyBsb2FkIHNvdXJlIGRhdGEgdG8gcjcsIHI4LCByOSwgcjEwCisgICAgbGRybmVoICAgICAgcjMsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdICAgICAgICAgICAgICAgICAgOyBwcmVsb2FkIGZvciBuZXh0IGJsb2NrCisgICAgbGRybmVoICAgICAgcjQsIFtzcmNdLCBwc3RlcAorCisgICAgbGRybmVoICAgICAgcjUsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRybmVoICAgICAgcjYsIFtzcmNdLCBwc3RlcAorCisgICAgcGtoYnQgICAgICAgcjcsIHIzLCByNCwgbHNsICMxNgorCisgICAgbGRybmVoICAgICAgcjMsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRybmVoICAgICAgcjQsIFtzcmNdLCBwc3RlcAorCisgICAgcGtoYnQgICAgICAgcjgsIHI1LCByNiwgbHNsICMxNgorCisgICAgbGRybmVoICAgICAgcjUsIFtzcmMsICMtMl0KKyAgICBwbGQgICAgICAgICBbc3JjLCAjMjNdCisgICAgbGRybmVoICAgICAgcjYsIFtzcmNdLCBwc3RlcAorCisgICAgYm5lICAgICAgICAgc2ltcGxlX3ZuZXh0OAorCisgICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9hcm12NnwKKworOyBDb25zdGFudCBQb29sCitjMHg4MDgwODA4MCBEQ0QgICAgIDB4ODA4MDgwODAKK2MweDAzMDMwMzAzIERDRCAgICAgMHgwMzAzMDMwMworYzB4MDQwNDA0MDQgRENEICAgICAweDA0MDQwNDA0CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9zaXh0YXBwcmVkaWN0OHg0X3Y2LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni9zaXh0YXBwcmVkaWN0OHg0X3Y2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFhZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3NpeHRhcHByZWRpY3Q4eDRfdjYuYXNtCkBAIC0wLDAgKzEsMjczIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3NpeHRhcF9wcmVkaWN0OHg0X2FybXY2fAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyByMiAgICBpbnQgIHhvZmZzZXQsCis7IHIzICAgIGludCAgeW9mZnNldCwKKzsgc3RhY2sgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgc3RhY2sgaW50ICBkc3RfcGl0Y2gKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7bm90ZTogSW4gZmlyc3QgcGFzcywgc3RvcmUgdGhlIHJlc3VsdCBpbiB0cmFuc3Bvc2UoOGxpbmVzeDljb2x1bW5zKSBvbiBzdGFjay4gVGVtcG9yYXJ5IHN0YWNrIHNpemUgaXMgMTg0LgorO0xpbmUgd2lkdGggaXMgMjAgdGhhdCBpcyA5IHNob3J0IGRhdGEgcGx1cyAyIHRvIG1ha2UgaXQgNGJ5dGVzIGFsaWduZWQuIEluIHNlY29uZCBwYXNzLCBsb2FkIGRhdGEgZnJvbSBzdGFjaywKKzthbmQgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdHJhbnNwb3NlLgorfHZwOF9zaXh0YXBfcHJlZGljdDh4NF9hcm12NnwgUFJPQworICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KKyAgICBzdHIgICAgICAgICByMywgW3NwLCAjLTE4NF0hICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlLCBzdG9yZSB5b2Zmc2V0CisKKyAgICBjbXAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCisgICAgYWRkICAgICAgICAgbHIsIHNwLCAjNCAgICAgICAgICAgICAgICAgIDtwb2ludCB0byB0ZW1wb3JhcnkgYnVmZmVyCisgICAgYmVxICAgICAgICAgc2tpcF9maXJzdHBhc3NfZmlsdGVyCisKKztmaXJzdC1wYXNzIGZpbHRlcgorICAgIGFkciAgICAgICAgIHIxMiwgZmlsdGVyOF9jb2VmZgorICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQorCisgICAgYWRkICAgICAgICAgcjMsIHIxLCAjMTAgICAgICAgICAgICAgICAgIDsgcHJlbG9hZCBuZXh0IGxvdworICAgIHBsZCAgICAgICAgIFtyMCwgcjNdCisKKyAgICBhZGQgICAgICAgICByMiwgcjEyLCByMiwgbHNsICM0ICAgICAgICAgO2NhbGN1bGF0ZSBmaWx0ZXIgbG9jYXRpb24KKyAgICBhZGQgICAgICAgICByMCwgcjAsICMzICAgICAgICAgICAgICAgICAgO2FkanVzdCBzcmMgb25seSBmb3IgbG9hZGluZyBjb252aW5pZW5jZQorCisgICAgbGRyICAgICAgICAgcjMsIFtyMl0gICAgICAgICAgICAgICAgICAgIDsgbG9hZCB1cCBwYWNrZWQgZmlsdGVyIGNvZWZmaWNpZW50cworICAgIGxkciAgICAgICAgIHI0LCBbcjIsICM0XQorICAgIGxkciAgICAgICAgIHI1LCBbcjIsICM4XQorCisgICAgbW92ICAgICAgICAgcjIsICMweDkwMDAwICAgICAgICAgICAgICAgIDsgaGVpZ2h0PTkgaXMgdG9wIHBhcnQgb2YgY291bnRlcgorCisgICAgc3ViICAgICAgICAgcjEsIHIxLCAjOAorCit8Zmlyc3RfcGFzc19obG9vcF92NnwKKyAgICBsZHJiICAgICAgICByNiwgW3IwLCAjLTVdICAgICAgICAgICAgICAgOyBsb2FkIHNvdXJjZSBkYXRhCisgICAgbGRyYiAgICAgICAgcjcsIFtyMCwgIy00XQorICAgIGxkcmIgICAgICAgIHI4LCBbcjAsICMtM10KKyAgICBsZHJiICAgICAgICByOSwgW3IwLCAjLTJdCisgICAgbGRyYiAgICAgICAgcjEwLCBbcjAsICMtMV0KKworICAgIG9yciAgICAgICAgIHIyLCByMiwgIzB4NCAgICAgICAgICAgICAgICA7IGNvbnN0cnVjdCBsb29wIGNvdW50ZXIuIHdpZHRoPTg9NHgyCisKKyAgICBwa2hidCAgICAgICByNiwgcjYsIHI3LCBsc2wgIzE2ICAgICAgICAgOyByNyB8IHI2CisgICAgcGtoYnQgICAgICAgcjcsIHI3LCByOCwgbHNsICMxNiAgICAgICAgIDsgcjggfCByNworCisgICAgcGtoYnQgICAgICAgcjgsIHI4LCByOSwgbHNsICMxNiAgICAgICAgIDsgcjkgfCByOAorICAgIHBraGJ0ICAgICAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICA7IHIxMCB8IHI5CisKK3xmaXJzdF9wYXNzX3dsb29wX3Y2fAorICAgIHNtdWFkICAgICAgIHIxMSwgcjYsIHIzICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXJbMF0sIHZwOF9maWx0ZXJbMV0KKyAgICBzbXVhZCAgICAgICByMTIsIHI3LCByMworCisgICAgbGRyYiAgICAgICAgcjYsIFtyMF0sICMxCisKKyAgICBzbWxhZCAgICAgICByMTEsIHI4LCByNCwgcjExICAgICAgICAgICAgOyB2cDhfZmlsdGVyWzJdLCB2cDhfZmlsdGVyWzNdCisgICAgbGRyYiAgICAgICAgcjcsIFtyMF0sICMxCisgICAgc21sYWQgICAgICAgcjEyLCByOSwgcjQsIHIxMgorCisgICAgcGtoYnQgICAgICAgcjEwLCByMTAsIHI2LCBsc2wgIzE2ICAgICAgIDsgcjEwIHwgcjkKKyAgICBwa2hidCAgICAgICByNiwgcjYsIHI3LCBsc2wgIzE2ICAgICAgICAgOyByMTEgfCByMTAKKyAgICBzbWxhZCAgICAgICByMTEsIHIxMCwgcjUsIHIxMSAgICAgICAgICAgOyB2cDhfZmlsdGVyWzRdLCB2cDhfZmlsdGVyWzVdCisgICAgc21sYWQgICAgICAgcjEyLCByNiwgcjUsIHIxMgorCisgICAgc3ViICAgICAgICAgcjIsIHIyLCAjMQorCisgICAgYWRkICAgICAgICAgcjExLCByMTEsICMweDQwICAgICAgICAgICAgIDsgcm91bmRfc2hpZnRfYW5kX2NsYW1wCisgICAgdHN0ICAgICAgICAgcjIsICMweGZmICAgICAgICAgICAgICAgICAgIDsgdGVzdCBsb29wIGNvdW50ZXIKKyAgICB1c2F0ICAgICAgICByMTEsICM4LCByMTEsIGFzciAjNworICAgIGFkZCAgICAgICAgIHIxMiwgcjEyLCAjMHg0MAorICAgIHN0cmggICAgICAgIHIxMSwgW2xyXSwgIzIwICAgICAgICAgICAgICA7IHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGFuZCBzdG9yZWQsIHdoaWNoCisgICAgdXNhdCAgICAgICAgcjEyLCAjOCwgcjEyLCBhc3IgIzcKKworICAgIHN0cmggICAgICAgIHIxMiwgW2xyXSwgIzIwCisKKyAgICBtb3ZuZSAgICAgICByMTEsIHI2CisgICAgbW92bmUgICAgICAgcjEyLCByNworCisgICAgbW92bmUgICAgICAgcjYsIHI4CisgICAgbW92bmUgICAgICAgcjcsIHI5CisgICAgbW92bmUgICAgICAgcjgsIHIxMAorICAgIG1vdm5lICAgICAgIHI5LCByMTEKKyAgICBtb3ZuZSAgICAgICByMTAsIHIxMgorCisgICAgYm5lICAgICAgICAgZmlyc3RfcGFzc193bG9vcF92NgorCisgICAgOzthZGQgICAgICAgcjksIHBwbCwgIzMwICAgICAgICAgICAgICAgIDsgYXR0ZW1wdCB0byBsb2FkIDIgYWRqYWNlbnQgY2FjaGUgbGluZXMKKyAgICA7O0lGIEFSQ0hJVEVDVFVSRT02CisgICAgO3BsZCAgICAgICAgW3NyYywgcHBsXQorICAgIDs7cGxkICAgICAgIFtzcmMsIHI5XQorICAgIDs7RU5ESUYKKworICAgIHN1YnMgICAgICAgIHIyLCByMiwgIzB4MTAwMDAKKworICAgIHN1YiAgICAgICAgIGxyLCBsciwgIzE1OAorCisgICAgYWRkICAgICAgICAgcjAsIHIwLCByMSAgICAgICAgICAgICAgICAgIDsgbW92ZSB0byBuZXh0IGlucHV0IGxpbmUKKworICAgIGFkZCAgICAgICAgIHIxMSwgcjEsICMxOCAgICAgICAgICAgICAgICA7IHByZWxvYWQgbmV4dCBsb3cuIGFkZGluZyBiYWNrIGJsb2NrIHdpZHRoKD04KSwgd2hpY2ggaXMgc3VidHJhY3RlZCBlYXJsaWVyCisgICAgcGxkICAgICAgICAgW3IwLCByMTFdCisKKyAgICBibmUgICAgICAgICBmaXJzdF9wYXNzX2hsb29wX3Y2CisKKztzZWNvbmQgcGFzcyBmaWx0ZXIKK3NlY29uZHBhc3NfZmlsdGVyCisgICAgbGRyICAgICAgICAgcjMsIFtzcF0sICM0ICAgICAgICAgICAgICAgIDsgbG9hZCBiYWNrIHlvZmZzZXQKKyAgICBsZHIgICAgICAgICByMCwgW3NwLCAjMjE2XSAgICAgICAgICAgICAgOyBsb2FkIGRzdCBhZGRyZXNzIGZyb20gc3RhY2sgMTgwKzM2CisgICAgbGRyICAgICAgICAgcjEsIFtzcCwgIzIyMF0gICAgICAgICAgICAgIDsgbG9hZCBkc3Qgc3RyaWRlIGZyb20gc3RhY2sgMTgwKzQwCisKKyAgICBjbXAgICAgICAgICByMywgIzAKKyAgICBiZXEgICAgICAgICBza2lwX3NlY29uZHBhc3NfZmlsdGVyCisKKyAgICBhZHIgICAgICAgICByMTIsIGZpbHRlcjhfY29lZmYKKyAgICBhZGQgICAgICAgICBsciwgcjEyLCByMywgbHNsICM0ICAgICAgICAgO2NhbGN1bGF0ZSBmaWx0ZXIgbG9jYXRpb24KKworICAgIG1vdiAgICAgICAgIHIyLCAjMHgwMDA4MDAwMAorCisgICAgbGRyICAgICAgICAgcjMsIFtscl0gICAgICAgICAgICAgICAgICAgIDsgbG9hZCB1cCBwYWNrZWQgZmlsdGVyIGNvZWZmaWNpZW50cworICAgIGxkciAgICAgICAgIHI0LCBbbHIsICM0XQorICAgIGxkciAgICAgICAgIHI1LCBbbHIsICM4XQorCisgICAgcGtoYnQgICAgICAgcjEyLCByNCwgcjMgICAgICAgICAgICAgICAgIDsgcGFjayB0aGUgZmlsdGVyIGRpZmZlcmVudGx5CisgICAgcGtoYnQgICAgICAgcjExLCByNSwgcjQKKworc2Vjb25kX3Bhc3NfaGxvb3BfdjYKKyAgICBsZHIgICAgICAgICByNiwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCisgICAgbGRyICAgICAgICAgcjcsIFtzcCwgIzRdCisKKyAgICBvcnIgICAgICAgICByMiwgcjIsICMyICAgICAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKKworc2Vjb25kX3Bhc3Nfd2xvb3BfdjYKKyAgICBzbXVhZCAgICAgICBsciwgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKKyAgICBzbXVsYnQgICAgICByMTAsIHIzLCByNgorCisgICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzhdCisKKyAgICBzbWxhZCAgICAgICBsciwgcjQsIHI3LCBscgorICAgIHNtbGFkeCAgICAgIHIxMCwgcjEyLCByNywgcjEwCisKKyAgICBsZHJoICAgICAgICByOSwgW3NwLCAjMTJdCisKKyAgICBzbWxhZCAgICAgICBsciwgcjUsIHI4LCBscgorICAgIHNtbGFkeCAgICAgIHIxMCwgcjExLCByOCwgcjEwCisKKyAgICBhZGQgICAgICAgICBzcCwgc3AsICM0CisgICAgc21sYXRiICAgICAgcjEwLCByNSwgcjksIHIxMAorCisgICAgc3ViICAgICAgICAgcjIsIHIyLCAjMQorCisgICAgYWRkICAgICAgICAgbHIsIGxyLCAjMHg0MCAgICAgICAgICAgICAgIDsgcm91bmRfc2hpZnRfYW5kX2NsYW1wCisgICAgdHN0ICAgICAgICAgcjIsICMweGZmCisgICAgdXNhdCAgICAgICAgbHIsICM4LCBsciwgYXNyICM3CisgICAgYWRkICAgICAgICAgcjEwLCByMTAsICMweDQwCisgICAgc3RyYiAgICAgICAgbHIsIFtyMF0sIHIxICAgICAgICAgICAgICAgIDsgdGhlIHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGJhY2sgYW5kIHN0b3JlZAorICAgIHVzYXQgICAgICAgIHIxMCwgIzgsIHIxMCwgYXNyICM3CisKKyAgICBzdHJiICAgICAgICByMTAsIFtyMF0scjEKKworICAgIG1vdm5lICAgICAgIHI2LCByNworICAgIG1vdm5lICAgICAgIHI3LCByOAorCisgICAgYm5lICAgICAgICAgc2Vjb25kX3Bhc3Nfd2xvb3BfdjYKKworICAgIHN1YnMgICAgICAgIHIyLCByMiwgIzB4MTAwMDAKKyAgICBhZGQgICAgICAgICBzcCwgc3AsICMxMiAgICAgICAgICAgICAgICAgOyB1cGRhdGEgc3JjIGZvciBuZXh0IGxvb3AgKDIwLTgpCisgICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMyCisgICAgYWRkICAgICAgICAgcjAsIHIwLCAjMQorCisgICAgYm5lICAgICAgICAgc2Vjb25kX3Bhc3NfaGxvb3BfdjYKKworICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzIwCisgICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NraXBfZmlyc3RwYXNzX2ZpbHRlcgorICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQorICAgIHN1YiAgICAgICAgIHIxLCByMSwgIzgKKyAgICBtb3YgICAgICAgICByMiwgIzkKKworc2tpcF9maXJzdHBhc3NfaGxvb3AKKyAgICBsZHJiICAgICAgICByNCwgW3IwXSwgIzEgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEKKyAgICBzdWJzICAgICAgICByMiwgcjIsICMxCisgICAgbGRyYiAgICAgICAgcjUsIFtyMF0sICMxCisgICAgc3RyaCAgICAgICAgcjQsIFtscl0sICMyMCAgICAgICAgICAgICAgIDsgc3RvcmUgaXQgdG8gaW1tZWRpYXRlIGJ1ZmZlcgorICAgIGxkcmIgICAgICAgIHI2LCBbcjBdLCAjMSAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQorICAgIHN0cmggICAgICAgIHI1LCBbbHJdLCAjMjAKKyAgICBsZHJiICAgICAgICByNywgW3IwXSwgIzEKKyAgICBzdHJoICAgICAgICByNiwgW2xyXSwgIzIwCisgICAgbGRyYiAgICAgICAgcjgsIFtyMF0sICMxCisgICAgc3RyaCAgICAgICAgcjcsIFtscl0sICMyMAorICAgIGxkcmIgICAgICAgIHI5LCBbcjBdLCAjMQorICAgIHN0cmggICAgICAgIHI4LCBbbHJdLCAjMjAKKyAgICBsZHJiICAgICAgICByMTAsIFtyMF0sICMxCisgICAgc3RyaCAgICAgICAgcjksIFtscl0sICMyMAorICAgIGxkcmIgICAgICAgIHIxMSwgW3IwXSwgIzEKKyAgICBzdHJoICAgICAgICByMTAsIFtscl0sICMyMAorICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEgICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gbmV4dCBpbnB1dCBsaW5lCisgICAgc3RyaCAgICAgICAgcjExLCBbbHJdLCAjMjAKKworICAgIHN1YiAgICAgICAgIGxyLCBsciwgIzE1OCAgICAgICAgICAgICAgICA7IG1vdmUgb3ZlciB0byBuZXh0IGNvbHVtbgorICAgIGJuZSAgICAgICAgIHNraXBfZmlyc3RwYXNzX2hsb29wCisKKyAgICBiICAgICAgICAgICBzZWNvbmRwYXNzX2ZpbHRlcgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NraXBfc2Vjb25kcGFzc19maWx0ZXIKKyAgICBtb3YgICAgICAgICByMiwgIzgKKyAgICBhZGQgICAgICAgICBzcCwgc3AsICM0ICAgICAgICAgICAgICAgICAgO3N0YXJ0IGZyb20gc3JjWzBdIGluc3RlYWQgb2Ygc3JjWy0yXQorCitza2lwX3NlY29uZHBhc3NfaGxvb3AKKyAgICBsZHIgICAgICAgICByNiwgW3NwXSwgIzQKKyAgICBzdWJzICAgICAgICByMiwgcjIsICMxCisgICAgbGRyICAgICAgICAgcjgsIFtzcF0sICM0CisKKyAgICBtb3YgICAgICAgICByNywgcjYsIGxzciAjMTYgICAgICAgICAgICAgOyB1bnBhY2sKKyAgICBzdHJiICAgICAgICByNiwgW3IwXSwgcjEKKyAgICBtb3YgICAgICAgICByOSwgcjgsIGxzciAjMTYKKyAgICBzdHJiICAgICAgICByNywgW3IwXSwgcjEKKyAgICBhZGQgICAgICAgICBzcCwgc3AsICMxMiAgICAgICAgICAgICAgICAgOyAyMC04CisgICAgc3RyYiAgICAgICAgcjgsIFtyMF0sIHIxCisgICAgc3RyYiAgICAgICAgcjksIFtyMF0sIHIxCisKKyAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzIKKyAgICBhZGQgICAgICAgICByMCwgcjAsICMxCisKKyAgICBibmUgICAgICAgICBza2lwX3NlY29uZHBhc3NfaGxvb3AKKworICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzE2ICAgICAgICAgICAgICAgICA7IDE4MCAtICgxNjAgKzQpCisKKyAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9CisKKyAgICBFTkRQCisKKzstLS0tLS0tLS0tLS0tLS0tLQorO09uZSB3b3JkIGVhY2ggaXMgcmVzZXJ2ZWQuIExhYmVsIGZpbHRlcl9jb2VmZiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGEuCis7RGF0YSBhZGRyZXNzOiBmaWx0ZXJfY29lZmYsIGZpbHRlcl9jb2VmZis0LCBmaWx0ZXJfY29lZmYrOCAuLi4KK2ZpbHRlcjhfY29lZmYKKyAgICBEQ0QgICAgIDB4MDAwMDAwMDAsICAgICAweDAwMDAwMDgwLCAgICAgMHgwMDAwMDAwMCwgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmYTAwMDAsICAgICAweDAwMGMwMDdiLCAgICAgMHgwMDAwZmZmZiwgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmNTAwMDIsICAgICAweDAwMjQwMDZjLCAgICAgMHgwMDAxZmZmOCwgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmNzAwMDAsICAgICAweDAwMzIwMDVkLCAgICAgMHgwMDAwZmZmYSwgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmMDAwMDMsICAgICAweDAwNGQwMDRkLCAgICAgMHgwMDAzZmZmMCwgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmYTAwMDAsICAgICAweDAwNWQwMDMyLCAgICAgMHgwMDAwZmZmNywgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmODAwMDEsICAgICAweDAwNmMwMDI0LCAgICAgMHgwMDAyZmZmNSwgICAgIDB4MDAwMDAwMDAKKyAgICBEQ0QgICAgIDB4ZmZmZjAwMDAsICAgICAweDAwN2IwMDBjLCAgICAgMHgwMDAwZmZmYSwgICAgIDB4MDAwMDAwMDAKKworICAgIDtEQ0QgICAgICAgIDAsICAwLCAgMTI4LCAgICAwLCAgIDAsICAwCisgICAgO0RDRCAgICAgICAgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAKKyAgICA7RENEICAgICAgICAyLCAtMTEsIDEwOCwgICAzNiwgIC04LCAgMQorICAgIDtEQ0QgICAgICAgIDAsIC05LCAgIDkzLCAgIDUwLCAgLTYsICAwCisgICAgO0RDRCAgICAgICAgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMKKyAgICA7RENEICAgICAgICAwLCAtNiwgICA1MCwgICA5MywgIC05LCAgMAorICAgIDtEQ0QgICAgICAgIDEsIC04LCAgIDM2LCAgMTA4LCAtMTEsICAyCisgICAgO0RDRCAgICAgICAgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgIDAKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF9zYWQxNngxNl9hcm12Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3NhZDE2eDE2X2FybXY2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjRmNWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF9zYWQxNngxNl9hcm12Ni5hc20KQEAgLTAsMCArMSw5NiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9zYWQxNngxNl9hcm12NnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IHIxICAgIGludCAgc3JjX3N0cmlkZQorOyByMiAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCis7IHIzICAgIGludCAgcmVmX3N0cmlkZQorOyBzdGFjayBtYXhfc2FkIChub3QgdXNlZCkKK3x2cDhfc2FkMTZ4MTZfYXJtdjZ8IFBST0MKKyAgICBzdG1mZCAgIHNwISwge3I0LXIxMiwgbHJ9CisKKyAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMF0KKyAgICBwbGQgICAgIFtyMiwgcjMsIGxzbCAjMF0KKyAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMV0KKyAgICBwbGQgICAgIFtyMiwgcjMsIGxzbCAjMV0KKworICAgIG1vdiAgICAgcjQsICMwICAgICAgICAgICAgICA7IHNhZCA9IDA7CisgICAgbW92ICAgICByNSwgIzggICAgICAgICAgICAgIDsgbG9vcCBjb3VudAorCitsb29wCisgICAgOyAxc3Qgcm93CisgICAgbGRyICAgICByNiwgW3IwLCAjMHgwXSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgKDFBKQorICAgIGxkciAgICAgcjgsIFtyMiwgIzB4MF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzICgxQSkKKyAgICBsZHIgICAgIHI3LCBbcjAsICMweDRdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMUEpCisgICAgbGRyICAgICByOSwgW3IyLCAjMHg0XSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMgKDFBKQorICAgIGxkciAgICAgcjEwLCBbcjAsICMweDhdICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzICgxQikKKyAgICBsZHIgICAgIHIxMSwgW3IwLCAjMHhDXSAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMUIpCisKKyAgICB1c2FkYTggIHI0LCByOCwgcjYsIHI0ICAgICAgOyBjYWxjdWxhdGUgc2FkIGZvciA0IHBpeGVscworICAgIHVzYWQ4ICAgcjgsIHI3LCByOSAgICAgICAgICA7IGNhbGN1bGF0ZSBzYWQgZm9yIDQgcGl4ZWxzCisKKyAgICBsZHIgICAgIHIxMiwgW3IyLCAjMHg4XSAgICAgOyBsb2FkIDQgcmVmIHBpeGVscyAoMUIpCisgICAgbGRyICAgICBsciwgW3IyLCAjMHhDXSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMgKDFCKQorCisgICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyYyBwb2ludGVyIHRvIG5leHQgcm93CisgICAgYWRkICAgICByMiwgcjIsIHIzICAgICAgICAgIDsgc2V0IGRzdCBwb2ludGVyIHRvIG5leHQgcm93CisKKyAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMV0KKyAgICBwbGQgICAgIFtyMiwgcjMsIGxzbCAjMV0KKworICAgIHVzYWRhOCAgcjQsIHIxMCwgcjEyLCByNCAgICA7IGNhbGN1bGF0ZSBzYWQgZm9yIDQgcGl4ZWxzCisgICAgdXNhZGE4ICByOCwgcjExLCBsciwgcjggICAgIDsgY2FsY3VsYXRlIHNhZCBmb3IgNCBwaXhlbHMKKworICAgIGxkciAgICAgcjYsIFtyMCwgIzB4MF0gICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzICgyQSkKKyAgICBsZHIgICAgIHI3LCBbcjAsICMweDRdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMkEpCisgICAgYWRkICAgICByNCwgcjQsIHI4ICAgICAgICAgIDsgYWRkIHBhcnRpYWwgc2FkIHZhbHVlcworCisgICAgOyAybmQgcm93CisgICAgbGRyICAgICByOCwgW3IyLCAjMHgwXSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMgKDJBKQorICAgIGxkciAgICAgcjksIFtyMiwgIzB4NF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzICgyQSkKKyAgICBsZHIgICAgIHIxMCwgW3IwLCAjMHg4XSAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMkIpCisgICAgbGRyICAgICByMTEsIFtyMCwgIzB4Q10gICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgKDJCKQorCisgICAgdXNhZGE4ICByNCwgcjYsIHI4LCByNCAgICAgIDsgY2FsY3VsYXRlIHNhZCBmb3IgNCBwaXhlbHMKKyAgICB1c2FkOCAgIHI4LCByNywgcjkgICAgICAgICAgOyBjYWxjdWxhdGUgc2FkIGZvciA0IHBpeGVscworCisgICAgbGRyICAgICByMTIsIFtyMiwgIzB4OF0gICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMgKDJCKQorICAgIGxkciAgICAgbHIsIFtyMiwgIzB4Q10gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzICgyQikKKworICAgIGFkZCAgICAgcjAsIHIwLCByMSAgICAgICAgICA7IHNldCBzcmMgcG9pbnRlciB0byBuZXh0IHJvdworICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3QgcG9pbnRlciB0byBuZXh0IHJvdworCisgICAgdXNhZGE4ICByNCwgcjEwLCByMTIsIHI0ICAgIDsgY2FsY3VsYXRlIHNhZCBmb3IgNCBwaXhlbHMKKyAgICB1c2FkYTggIHI4LCByMTEsIGxyLCByOCAgICAgOyBjYWxjdWxhdGUgc2FkIGZvciA0IHBpeGVscworCisgICAgcGxkICAgICBbcjAsIHIxLCBsc2wgIzFdCisgICAgcGxkICAgICBbcjIsIHIzLCBsc2wgIzFdCisKKyAgICBzdWJzICAgIHI1LCByNSwgIzEgICAgICAgICAgOyBkZWNyZW1lbnQgbG9vcCBjb3VudGVyCisgICAgYWRkICAgICByNCwgcjQsIHI4ICAgICAgICAgIDsgYWRkIHBhcnRpYWwgc2FkIHZhbHVlcworCisgICAgYm5lICAgICBsb29wCisKKyAgICBtb3YgICAgIHIwLCByNCAgICAgICAgICAgICAgOyByZXR1cm4gc2FkCisgICAgbGRtZmQgICBzcCEsIHtyNC1yMTIsIHBjfQorCisgICAgRU5EUAorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2UxNngxNl9hcm12Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODRjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYuYXNtCkBAIC0wLDAgKzEsMTU0IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjZ8CisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCisKKzsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cgorOyByMSAgICBpbnQgc291cmNlX3N0cmlkZQorOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCis7IHIzICAgIGludCAgcmVjb25fc3RyaWRlCis7IHN0YWNrIHVuc2lnbmVkIGludCAqc3NlCit8dnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjZ8IFBST0MKKworICAgIHN0bWZkICAgc3AhLCB7cjQtcjEyLCBscn0KKworICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMwXQorICAgIHBsZCAgICAgW3IyLCByMywgbHNsICMwXQorCisgICAgbW92ICAgICByOCwgIzAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzdW0gPSAwCisgICAgbW92ICAgICByMTEsICMwICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzc2UgPSAwCisgICAgbW92ICAgICByMTIsICMxNiAgICAgICAgICAgIDsgc2V0IGxvb3AgY291bnRlciB0byAxNiAoPWJsb2NrIGhlaWdodCkKKworbG9vcAorICAgIDsgMXN0IDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjMF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI1LCBbcjIsICMwXSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworCisgICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgIDsgY29uc3RhbnQgemVybworCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMV0KKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByOSwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHBsZCAgICAgW3IyLCByMywgbHNsICMxXQorICAgIHNlbCAgICAgcjYsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisgICAgOyBjYWxjdWxhdGUgdG90YWwgc3VtCisgICAgYWRkcyAgICByOCwgcjgsIHI0ICAgICAgICAgIDsgYWRkIHBvc2l0aXZlIGRpZmZlcmVuY2VzIHRvIHN1bQorICAgIHN1YnMgICAgcjgsIHI4LCByNSAgICAgICAgICA7IHN1YnN0cmFjdCBuZWdhdGl2ZSBkaWZmZXJlbmNlcyBmcm9tIHN1bQorCisgICAgOyBjYWxjdWxhdGUgc3NlCisgICAgdXh0YjE2ICByNSwgcjYgICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCisgICAgdXh0YjE2ICByMTAsIHI2LCByb3IgIzggICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcworICAgIHNtbGFkICAgcjExLCByNSwgcjUsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCisKKyAgICA7IDJuZCA0IHBpeGVscworICAgIGxkciAgICAgcjQsIFtyMCwgIzRdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCisgICAgbGRyICAgICByNSwgW3IyLCAjNF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKyAgICBzbWxhZCAgIHIxMSwgcjEwLCByMTAsIHIxMSAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQorCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByOSwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHNlbCAgICAgcjYsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHIxMCwgcjYsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgM3JkIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjOF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI1LCBbcjIsICM4XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworICAgIHNtbGFkICAgcjExLCByMTAsIHIxMCwgcjExICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI5LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgc2VsICAgICByNiwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKworICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQorICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KKyAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjEwLCByNiwgcm9yICM4ICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorCisgICAgOyA0dGggNCBwaXhlbHMKKyAgICBsZHIgICAgIHI0LCBbcjAsICMxMl0gICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscworICAgIGxkciAgICAgcjUsIFtyMiwgIzEyXSAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCisgICAgc21sYWQgICByMTEsIHIxMCwgcjEwLCByMTEgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKKworICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCisgICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyY19wdHIgdG8gbmV4dCByb3cKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByOSwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3RfcHRyIHRvIG5leHQgcm93CisgICAgc2VsICAgICByNiwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKworICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQorICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KKyAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjEwLCByNiwgcm9yICM4ICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorICAgIHNtbGFkICAgcjExLCByMTAsIHIxMCwgcjExICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKworICAgIHN1YnMgICAgcjEyLCByMTIsICMxCisKKyAgICBibmUgICAgIGxvb3AKKworICAgIDsgcmV0dXJuIHN0dWZmCisgICAgbGRyICAgICByNiwgW3NwLCAjNDBdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCisgICAgbXVsICAgICByMCwgcjgsIHI4ICAgICAgICAgIDsgc3VtICogc3VtCisgICAgc3RyICAgICByMTEsIFtyNl0gICAgICAgICAgIDsgc3RvcmUgc3NlCisgICAgc3ViICAgICByMCwgcjExLCByMCwgbHNyICM4IDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gOCkpCisKKyAgICBsZG1mZCAgIHNwISwge3I0LXIxMiwgcGN9CisKKyAgICBFTkRQCisKKyAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZTh4OF9hcm12Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlOHg4X2FybXY2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMzNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZTh4OF9hcm12Ni5hc20KQEAgLTAsMCArMSwxMDEgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2U4eDhfYXJtdjZ8CisKKyAgICBBUk0KKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsgcjEgICAgaW50IHNvdXJjZV9zdHJpZGUKKzsgcjIgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyByMyAgICBpbnQgIHJlY29uX3N0cmlkZQorOyBzdGFjayB1bnNpZ25lZCBpbnQgKnNzZQorfHZwOF92YXJpYW5jZTh4OF9hcm12NnwgUFJPQworCisgICAgcHVzaCAgICB7cjQtcjEwLCBscn0KKworICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMwXQorICAgIHBsZCAgICAgW3IyLCByMywgbHNsICMwXQorCisgICAgbW92ICAgICByMTIsICM4ICAgICAgICAgICAgIDsgc2V0IGxvb3AgY291bnRlciB0byA4ICg9YmxvY2sgaGVpZ2h0KQorICAgIG1vdiAgICAgcjQsICMwICAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3VtID0gMAorICAgIG1vdiAgICAgcjUsICMwICAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAorCitsb29wCisgICAgOyAxc3QgNCBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjAsICMweDBdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscworICAgIGxkciAgICAgcjcsIFtyMiwgIzB4MF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCisKKyAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgOyBjb25zdGFudCB6ZXJvCisKKyAgICB1c3ViOCAgIHI4LCByNiwgcjcgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMxXQorICAgIHNlbCAgICAgcjEwLCByOCwgbHIgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI5LCByNywgcjYgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgcGxkICAgICBbcjIsIHIzLCBsc2wgIzFdCisgICAgc2VsICAgICByOCwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNiwgcjEwLCBsciAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjcsIHI4LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI4LCByOCwgcjEwICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgcjQsIHI0LCByNiAgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgIHI0LCByNCwgcjcgICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI3LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHIxMCwgcjgsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByNSwgcjcsIHI3LCByNSAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgMm5kIDQgcGl4ZWxzCisgICAgbGRyICAgICByNiwgW3IwLCAjMHg0XSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI3LCBbcjIsICMweDRdICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworICAgIHNtbGFkICAgcjUsIHIxMCwgcjEwLCByNSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICB1c3ViOCAgIHI4LCByNiwgcjcgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIGFkZCAgICAgcjAsIHIwLCByMSAgICAgICAgICA7IHNldCBzcmNfcHRyIHRvIG5leHQgcm93CisgICAgc2VsICAgICByMTAsIHI4LCBsciAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQorICAgIHVzdWI4ICAgcjksIHI3LCByNiAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKKyAgICBhZGQgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBzZXQgZHN0X3B0ciB0byBuZXh0IHJvdworICAgIHNlbCAgICAgcjgsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjYsIHIxMCwgbHIgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI3LCByOCwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByOCwgcjgsIHIxMCAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI0LCByNCwgcjYgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByNCwgcjQsIHI3ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI3LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHIxMCwgcjgsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByNSwgcjcsIHI3LCByNSAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKyAgICBzdWJzICAgIHIxMiwgcjEyLCAjMSAgICAgICAgOyBuZXh0IHJvdworICAgIHNtbGFkICAgcjUsIHIxMCwgcjEwLCByNSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICBibmUgICAgIGxvb3AKKworICAgIDsgcmV0dXJuIHN0dWZmCisgICAgbGRyICAgICByOCwgW3NwLCAjMzJdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCisgICAgbXVsICAgICByMSwgcjQsIHI0ICAgICAgICAgIDsgc3VtICogc3VtCisgICAgc3RyICAgICByNSwgW3I4XSAgICAgICAgICAgIDsgc3RvcmUgc3NlCisgICAgc3ViICAgICByMCwgcjUsIHIxLCBBU1IgIzYgIDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gNikpCisKKyAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQorCisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmNlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2LmFzbQpAQCAtMCwwICsxLDE4MiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9hcm12NnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKKzsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKKzsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKK3x2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjZ8IFBST0MKKworICAgIHN0bWZkICAgc3AhLCB7cjQtcjEyLCBscn0KKworICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMwXQorICAgIHBsZCAgICAgW3IyLCByMywgbHNsICMwXQorCisgICAgbW92ICAgICByOCwgIzAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzdW0gPSAwCisgICAgbGRyICAgICByMTAsIGM4MDgwODA4MAorICAgIG1vdiAgICAgcjExLCAjMCAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAorICAgIG1vdiAgICAgcjEyLCAjMTYgICAgICAgICAgICA7IHNldCBsb29wIGNvdW50ZXIgdG8gMTYgKD1ibG9jayBoZWlnaHQpCisgICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgIDsgY29uc3RhbnQgemVybworbG9vcAorICAgIDsgMXN0IDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjMF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjAsICMxXSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyB3aXRoIDEgYnl0ZSBvZmZzZXQKKyAgICBsZHIgICAgIHI1LCBbcjIsICMwXSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworCisgICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgbXZuICAgICByNiwgcjYKKyAgICB1aHN1YjggIHI0LCByNCwgcjYKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisKKyAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMxXQorICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI2LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgcGxkICAgICBbcjIsIHIzLCBsc2wgIzFdCisgICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGRzICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3VicyAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgMm5kIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjNF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjAsICM1XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyB3aXRoIDEgYnl0ZSBvZmZzZXQKKyAgICBsZHIgICAgIHI1LCBbcjIsICM0XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworCisgICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgbXZuICAgICByNiwgcjYKKyAgICB1aHN1YjggIHI0LCByNCwgcjYKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisKKyAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQorCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgM3JkIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjOF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjAsICM5XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyB3aXRoIDEgYnl0ZSBvZmZzZXQKKyAgICBsZHIgICAgIHI1LCBbcjIsICM4XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworCisgICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgbXZuICAgICByNiwgcjYKKyAgICB1aHN1YjggIHI0LCByNCwgcjYKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisKKyAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKKworICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCisgICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQorICAgIHVzdWI4ICAgcjYsIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKKyAgICBzZWwgICAgIHI2LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBuZWdhdGl2ZSBkaWZmZXJlbmNlCisKKyAgICA7IGNhbGN1bGF0ZSBwYXJ0aWFsIHN1bXMKKyAgICB1c2FkOCAgIHI0LCByNywgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIHBvc2l0aXZlIGRpZmZlcmVuY2VzCisgICAgdXNhZDggICByNSwgcjYsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBuZWdhdGl2ZSBkaWZmZXJlbmNlcworICAgIG9yciAgICAgcjYsIHI2LCByNyAgICAgICAgICA7IGRpZmZlcmVuY2VzIG9mIGFsbCA0IHBpeGVscworCisgICAgOyBjYWxjdWxhdGUgdG90YWwgc3VtCisgICAgYWRkICAgICByOCwgcjgsIHI0ICAgICAgICAgIDsgYWRkIHBvc2l0aXZlIGRpZmZlcmVuY2VzIHRvIHN1bQorICAgIHN1YiAgICAgcjgsIHI4LCByNSAgICAgICAgICA7IHN1YnN0cmFjdCBuZWdhdGl2ZSBkaWZmZXJlbmNlcyBmcm9tIHN1bQorCisgICAgOyBjYWxjdWxhdGUgc3NlCisgICAgdXh0YjE2ICByNSwgcjYgICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCisgICAgdXh0YjE2ICByNywgcjYsIHJvciAjOCAgICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcworICAgIHNtbGFkICAgcjExLCByNSwgcjUsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCisKKyAgICA7IDR0aCA0IHBpeGVscworICAgIGxkciAgICAgcjQsIFtyMCwgIzEyXSAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCisgICAgbGRyICAgICByNiwgW3IwLCAjMTNdICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgd2l0aCAxIGJ5dGUgb2Zmc2V0CisgICAgbGRyICAgICByNSwgW3IyLCAjMTJdICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKworICAgIDsgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIG12biAgICAgcjYsIHI2CisgICAgdWhzdWI4ICByNCwgcjQsIHI2CisgICAgZW9yICAgICByNCwgcjQsIHIxMAorCisgICAgc21sYWQgICByMTEsIHI3LCByNywgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKKworICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCisgICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyY19wdHIgdG8gbmV4dCByb3cKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3RfcHRyIHRvIG5leHQgcm93CisgICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKworICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQorICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KKyAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjcsIHI2LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQorCisgICAgYm5lICAgICBsb29wCisKKyAgICA7IHJldHVybiBzdHVmZgorICAgIGxkciAgICAgcjYsIFtzcCwgIzQwXSAgICAgICA7IGdldCBhZGRyZXNzIG9mIHNzZQorICAgIG11bCAgICAgcjAsIHI4LCByOCAgICAgICAgICA7IHN1bSAqIHN1bQorICAgIHN0ciAgICAgcjExLCBbcjZdICAgICAgICAgICA7IHN0b3JlIHNzZQorICAgIHN1YiAgICAgcjAsIHIxMSwgcjAsIGxzciAjOCA7IHJldHVybiAoc3NlIC0gKChzdW0gKiBzdW0pID4+IDgpKQorCisgICAgbGRtZmQgICBzcCEsIHtyNC1yMTIsIHBjfQorCisgICAgRU5EUAorCitjODA4MDgwODAKKyAgICBEQ0QgICAgIDB4ODA4MDgwODAKKworICAgIEVORAorCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12Ni5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3MmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2FybXY2LmFzbQpAQCAtMCwwICsxLDIyMiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjZ8CisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCisKKzsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cgorOyByMSAgICBpbnQgc291cmNlX3N0cmlkZQorOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCis7IHIzICAgIGludCAgcmVjb25fc3RyaWRlCis7IHN0YWNrIHVuc2lnbmVkIGludCAqc3NlCit8dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12NnwgUFJPQworCisgICAgc3RtZmQgICBzcCEsIHtyNC1yMTIsIGxyfQorCisgICAgcGxkICAgICBbcjAsIHIxLCBsc2wgIzBdCisgICAgcGxkICAgICBbcjIsIHIzLCBsc2wgIzBdCisKKyAgICBtb3YgICAgIHI4LCAjMCAgICAgICAgICAgICAgOyBpbml0aWFsaXplIHN1bSA9IDAKKyAgICBsZHIgICAgIHIxMCwgYzgwODA4MDgwCisgICAgbW92ICAgICByMTEsICMwICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzc2UgPSAwCisgICAgbW92ICAgICByMTIsICMxNiAgICAgICAgICAgIDsgc2V0IGxvb3AgY291bnRlciB0byAxNiAoPWJsb2NrIGhlaWdodCkKKyAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgOyBjb25zdGFudCB6ZXJvCitsb29wCisgICAgYWRkICAgICByOSwgcjAsIHIxICAgICAgICAgIDsgcG9pbnRlciB0byBwaXhlbHMgb24gdGhlIG5leHQgcm93CisgICAgOyAxc3QgNCBwaXhlbHMKKyAgICBsZHIgICAgIHI0LCBbcjAsICMwXSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgYSwgcm93IE4KKyAgICBsZHIgICAgIHI2LCBbcjAsICMxXSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgYiwgcm93IE4KKyAgICBsZHIgICAgIHI1LCBbcjksICMwXSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgYywgcm93IE4rMQorICAgIGxkciAgICAgcjcsIFtyOSwgIzFdICAgICAgICA7IGxvYWQgc291cmNlIHBpeGVscyBkLCByb3cgTisxCisKKyAgICA7IHggPSAoYSArIGIgKyAxKSA+PiAxLCBpbnRlcnBvbGF0ZSBwaXhlbHMgaG9yaXpvbnRhbGx5IG9uIHJvdyBOCisgICAgbXZuICAgICByNiwgcjYKKyAgICB1aHN1YjggIHI0LCByNCwgcjYKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisgICAgOyB5ID0gKGMgKyBkICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTisxCisgICAgbXZuICAgICByNywgcjcKKyAgICB1aHN1YjggIHI1LCByNSwgcjcKKyAgICBlb3IgICAgIHI1LCByNSwgcjEwCisgICAgOyB6ID0gKHggKyB5ICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgaGFsZiBwaXhlbCB2YWx1ZXMgdmVydGljYWxseQorICAgIG12biAgICAgcjUsIHI1CisgICAgdWhzdWI4ICByNCwgcjQsIHI1CisgICAgbGRyICAgICByNSwgW3IyLCAjMF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisKKyAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMxXQorICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI2LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgcGxkICAgICBbcjIsIHIzLCBsc2wgIzFdCisgICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGRzICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3VicyAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgMm5kIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjNF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGEsIHJvdyBOCisgICAgbGRyICAgICByNiwgW3IwLCAjNV0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGIsIHJvdyBOCisgICAgbGRyICAgICByNSwgW3I5LCAjNF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGMsIHJvdyBOKzEKKworICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICBsZHIgICAgIHI3LCBbcjksICM1XSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgZCwgcm93IE4rMQorCisgICAgOyB4ID0gKGEgKyBiICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTgorICAgIG12biAgICAgcjYsIHI2CisgICAgdWhzdWI4ICByNCwgcjQsIHI2CisgICAgZW9yICAgICByNCwgcjQsIHIxMAorICAgIDsgeSA9IChjICsgZCArIDEpID4+IDEsIGludGVycG9sYXRlIHBpeGVscyBob3Jpem9udGFsbHkgb24gcm93IE4rMQorICAgIG12biAgICAgcjcsIHI3CisgICAgdWhzdWI4ICByNSwgcjUsIHI3CisgICAgZW9yICAgICByNSwgcjUsIHIxMAorICAgIDsgeiA9ICh4ICsgeSArIDEpID4+IDEsIGludGVycG9sYXRlIGhhbGYgcGl4ZWwgdmFsdWVzIHZlcnRpY2FsbHkKKyAgICBtdm4gICAgIHI1LCByNQorICAgIHVoc3ViOCAgcjQsIHI0LCByNQorICAgIGxkciAgICAgcjUsIFtyMiwgIzRdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCisgICAgZW9yICAgICByNCwgcjQsIHIxMAorCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgM3JkIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjOF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGEsIHJvdyBOCisgICAgbGRyICAgICByNiwgW3IwLCAjOV0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGIsIHJvdyBOCisgICAgbGRyICAgICByNSwgW3I5LCAjOF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGMsIHJvdyBOKzEKKworICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICBsZHIgICAgIHI3LCBbcjksICM5XSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgZCwgcm93IE4rMQorCisgICAgOyB4ID0gKGEgKyBiICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTgorICAgIG12biAgICAgcjYsIHI2CisgICAgdWhzdWI4ICByNCwgcjQsIHI2CisgICAgZW9yICAgICByNCwgcjQsIHIxMAorICAgIDsgeSA9IChjICsgZCArIDEpID4+IDEsIGludGVycG9sYXRlIHBpeGVscyBob3Jpem9udGFsbHkgb24gcm93IE4rMQorICAgIG12biAgICAgcjcsIHI3CisgICAgdWhzdWI4ICByNSwgcjUsIHI3CisgICAgZW9yICAgICByNSwgcjUsIHIxMAorICAgIDsgeiA9ICh4ICsgeSArIDEpID4+IDEsIGludGVycG9sYXRlIGhhbGYgcGl4ZWwgdmFsdWVzIHZlcnRpY2FsbHkKKyAgICBtdm4gICAgIHI1LCByNQorICAgIHVoc3ViOCAgcjQsIHI0LCByNQorICAgIGxkciAgICAgcjUsIFtyMiwgIzhdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCisgICAgZW9yICAgICByNCwgcjQsIHIxMAorCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgNHRoIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjMTJdICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGEsIHJvdyBOCisgICAgbGRyICAgICByNiwgW3IwLCAjMTNdICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGIsIHJvdyBOCisgICAgbGRyICAgICByNSwgW3I5LCAjMTJdICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGMsIHJvdyBOKzEKKyAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQorICAgIGxkciAgICAgcjcsIFtyOSwgIzEzXSAgICAgICA7IGxvYWQgc291cmNlIHBpeGVscyBkLCByb3cgTisxCisKKyAgICA7IHggPSAoYSArIGIgKyAxKSA+PiAxLCBpbnRlcnBvbGF0ZSBwaXhlbHMgaG9yaXpvbnRhbGx5IG9uIHJvdyBOCisgICAgbXZuICAgICByNiwgcjYKKyAgICB1aHN1YjggIHI0LCByNCwgcjYKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisgICAgOyB5ID0gKGMgKyBkICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTisxCisgICAgbXZuICAgICByNywgcjcKKyAgICB1aHN1YjggIHI1LCByNSwgcjcKKyAgICBlb3IgICAgIHI1LCByNSwgcjEwCisgICAgOyB6ID0gKHggKyB5ICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgaGFsZiBwaXhlbCB2YWx1ZXMgdmVydGljYWxseQorICAgIG12biAgICAgcjUsIHI1CisgICAgdWhzdWI4ICByNCwgcjQsIHI1CisgICAgbGRyICAgICByNSwgW3IyLCAjMTJdICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisKKyAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIGFkZCAgICAgcjAsIHIwLCByMSAgICAgICAgICA7IHNldCBzcmNfcHRyIHRvIG5leHQgcm93CisgICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQorICAgIHVzdWI4ICAgcjYsIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKKyAgICBhZGQgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBzZXQgZHN0X3B0ciB0byBuZXh0IHJvdworICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKyAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQorICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICBibmUgICAgIGxvb3AKKworICAgIDsgcmV0dXJuIHN0dWZmCisgICAgbGRyICAgICByNiwgW3NwLCAjNDBdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCisgICAgbXVsICAgICByMCwgcjgsIHI4ICAgICAgICAgIDsgc3VtICogc3VtCisgICAgc3RyICAgICByMTEsIFtyNl0gICAgICAgICAgIDsgc3RvcmUgc3NlCisgICAgc3ViICAgICByMCwgcjExLCByMCwgbHNyICM4IDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gOCkpCisKKyAgICBsZG1mZCAgIHNwISwge3I0LXIxMiwgcGN9CisKKyAgICBFTkRQCisKK2M4MDgwODA4MAorICAgIERDRCAgICAgMHg4MDgwODA4MAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZGE5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2LmFzbQpAQCAtMCwwICsxLDE4NCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9hcm12NnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKKzsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKKzsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKK3x2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjZ8IFBST0MKKworICAgIHN0bWZkICAgc3AhLCB7cjQtcjEyLCBscn0KKworICAgIHBsZCAgICAgW3IwLCByMSwgbHNsICMwXQorICAgIHBsZCAgICAgW3IyLCByMywgbHNsICMwXQorCisgICAgbW92ICAgICByOCwgIzAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzdW0gPSAwCisgICAgbGRyICAgICByMTAsIGM4MDgwODA4MAorICAgIG1vdiAgICAgcjExLCAjMCAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAorICAgIG1vdiAgICAgcjEyLCAjMTYgICAgICAgICAgICA7IHNldCBsb29wIGNvdW50ZXIgdG8gMTYgKD1ibG9jayBoZWlnaHQpCisgICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgIDsgY29uc3RhbnQgemVybworbG9vcAorICAgIGFkZCAgICAgcjksIHIwLCByMSAgICAgICAgICA7IHNldCBzcmMgcG9pbnRlciB0byBuZXh0IHJvdworICAgIDsgMXN0IDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjMF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjksICMwXSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyBmcm9tIG5leHQgcm93CisgICAgbGRyICAgICByNSwgW3IyLCAjMF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKworICAgIDsgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIG12biAgICAgcjYsIHI2CisgICAgdWhzdWI4ICByNCwgcjQsIHI2CisgICAgZW9yICAgICByNCwgcjQsIHIxMAorCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMV0KKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHBsZCAgICAgW3IyLCByMywgbHNsICMxXQorICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisgICAgOyBjYWxjdWxhdGUgdG90YWwgc3VtCisgICAgYWRkcyAgICByOCwgcjgsIHI0ICAgICAgICAgIDsgYWRkIHBvc2l0aXZlIGRpZmZlcmVuY2VzIHRvIHN1bQorICAgIHN1YnMgICAgcjgsIHI4LCByNSAgICAgICAgICA7IHN1YnN0cmFjdCBuZWdhdGl2ZSBkaWZmZXJlbmNlcyBmcm9tIHN1bQorCisgICAgOyBjYWxjdWxhdGUgc3NlCisgICAgdXh0YjE2ICByNSwgcjYgICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCisgICAgdXh0YjE2ICByNywgcjYsIHJvciAjOCAgICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcworICAgIHNtbGFkICAgcjExLCByNSwgcjUsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCisKKyAgICA7IDJuZCA0IHBpeGVscworICAgIGxkciAgICAgcjQsIFtyMCwgIzRdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCisgICAgbGRyICAgICByNiwgW3I5LCAjNF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgZnJvbSBuZXh0IHJvdworICAgIGxkciAgICAgcjUsIFtyMiwgIzRdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCisKKyAgICA7IGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBtdm4gICAgIHI2LCByNgorICAgIHVoc3ViOCAgcjQsIHI0LCByNgorICAgIGVvciAgICAgcjQsIHI0LCByMTAKKworICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI2LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKworICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQorICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KKyAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjcsIHI2LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorCisgICAgOyAzcmQgNCBwaXhlbHMKKyAgICBsZHIgICAgIHI0LCBbcjAsICM4XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscworICAgIGxkciAgICAgcjYsIFtyOSwgIzhdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzIGZyb20gbmV4dCByb3cKKyAgICBsZHIgICAgIHI1LCBbcjIsICM4XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworCisgICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgbXZuICAgICByNiwgcjYKKyAgICB1aHN1YjggIHI0LCByNCwgcjYKKyAgICBlb3IgICAgIHI0LCByNCwgcjEwCisKKyAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQorCisgICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKKworICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcworICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKKyAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KKyAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCisgICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgNHRoIDQgcGl4ZWxzCisgICAgbGRyICAgICByNCwgW3IwLCAjMTJdICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjksICMxMl0gICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyBmcm9tIG5leHQgcm93CisgICAgbGRyICAgICByNSwgW3IyLCAjMTJdICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKworICAgIDsgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIG12biAgICAgcjYsIHI2CisgICAgdWhzdWI4ICByNCwgcjQsIHI2CisgICAgZW9yICAgICByNCwgcjQsIHIxMAorCisgICAgc21sYWQgICByMTEsIHI3LCByNywgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKKworICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCisgICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyY19wdHIgdG8gbmV4dCByb3cKKyAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCisgICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcworICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3RfcHRyIHRvIG5leHQgcm93CisgICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKworICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQorICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KKyAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjcsIHI2LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKworICAgIHN1YnMgICAgcjEyLCByMTIsICMxCisKKyAgICBibmUgICAgIGxvb3AKKworICAgIDsgcmV0dXJuIHN0dWZmCisgICAgbGRyICAgICByNiwgW3NwLCAjNDBdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCisgICAgbXVsICAgICByMCwgcjgsIHI4ICAgICAgICAgIDsgc3VtICogc3VtCisgICAgc3RyICAgICByMTEsIFtyNl0gICAgICAgICAgIDsgc3RvcmUgc3NlCisgICAgc3ViICAgICByMCwgcjExLCByMCwgbHNyICM4IDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gOCkpCisKKyAgICBsZG1mZCAgIHNwISwge3I0LXIxMiwgcGN9CisKKyAgICBFTkRQCisKK2M4MDgwODA4MAorICAgIERDRCAgICAgMHg4MDgwODA4MAorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uYyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMwNzNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2JpbGluZWFyZmlsdGVyX2FybS5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAidnA4L2NvbW1vbi9maWx0ZXIuaCIKKyNpbmNsdWRlICJiaWxpbmVhcmZpbHRlcl9hcm0uaCIKKwordm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2FybXY2CisoCisgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgICBkc3RfcGl0Y2gsCisgICAgY29uc3Qgc2hvcnQgICAqSEZpbHRlciwKKyAgICBjb25zdCBzaG9ydCAgICpWRmlsdGVyLAorICAgIGludCAgICAgICAgICAgIFdpZHRoLAorICAgIGludCAgICAgICAgICAgIEhlaWdodAorKQoreworICAgIHVuc2lnbmVkIHNob3J0IEZEYXRhWzM2KjE2XTsgLyogVGVtcCBkYXRhIGJ1ZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLworCisgICAgLyogRmlyc3QgZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KKyAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciwgRkRhdGEsIHNyY19waXRjaCwgSGVpZ2h0ICsgMSwgV2lkdGgsIEhGaWx0ZXIpOworCisgICAgLyogdGhlbiAxLUQgdmVydGljYWxseS4uLiAqLworICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEsIGRzdF9wdHIsIGRzdF9waXRjaCwgSGVpZ2h0LCBXaWR0aCwgVkZpbHRlcik7Cit9CisKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9hcm12NgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7CisgICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOworICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKworICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCA0LCA0KTsKK30KKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9hcm12NgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50ICBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7CisgICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOworICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKworICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCA4LCA4KTsKK30KKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9hcm12NgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50ICBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7CisgICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOworICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKworICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCA4LCA0KTsKK30KKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2FybXY2CisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgIGRzdF9waXRjaAorKQoreworICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlcjsKKyAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXI7CisKKyAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07CisgICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOworCisgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9hcm12NihzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcGl0Y2gsIEhGaWx0ZXIsIFZGaWx0ZXIsIDE2LCAxNik7Cit9CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uaCBiL2xpYnZweC92cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmgKcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uaApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2RlcXVhbnRpemVfYXJtLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vZGVxdWFudGl6ZV9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU3MmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2RlcXVhbnRpemVfYXJtLmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKworI2lmIEhBVkVfTkVPTgorZXh0ZXJuIHZvaWQgdnA4X2RlcXVhbnRpemVfYl9sb29wX25lb24oc2hvcnQgKlEsIHNob3J0ICpEUUMsIHNob3J0ICpEUSk7CisjZW5kaWYKKworI2lmIEhBVkVfTUVESUEKK2V4dGVybiB2b2lkIHZwOF9kZXF1YW50aXplX2JfbG9vcF92NihzaG9ydCAqUSwgc2hvcnQgKkRRQywgc2hvcnQgKkRRKTsKKyNlbmRpZgorCisjaWYgSEFWRV9ORU9OCisKK3ZvaWQgdnA4X2RlcXVhbnRpemVfYl9uZW9uKEJMT0NLRCAqZCwgc2hvcnQgKkRRQykKK3sKKyAgICBzaG9ydCAqRFEgID0gZC0+ZHFjb2VmZjsKKyAgICBzaG9ydCAqUSAgID0gZC0+cWNvZWZmOworCisgICAgdnA4X2RlcXVhbnRpemVfYl9sb29wX25lb24oUSwgRFFDLCBEUSk7Cit9CisjZW5kaWYKKworI2lmIEhBVkVfTUVESUEKK3ZvaWQgdnA4X2RlcXVhbnRpemVfYl92NihCTE9DS0QgKmQsIHNob3J0ICpEUUMpCit7CisgICAgc2hvcnQgKkRRICA9IGQtPmRxY29lZmY7CisgICAgc2hvcnQgKlEgICA9IGQtPnFjb2VmZjsKKworICAgIHZwOF9kZXF1YW50aXplX2JfbG9vcF92NihRLCBEUUMsIERRKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL2ZpbHRlcl9hcm0uYyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9maWx0ZXJfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4OTUxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9maWx0ZXJfYXJtLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgInZwOC9jb21tb24vZmlsdGVyLmgiCisjaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgorCitleHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19hcm12NgorKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgc2hvcnQgICAgICAgICAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCispOworCisvLyA4eDgKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzXzh4OF9hcm12NgorKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgc2hvcnQgICAgICAgICAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCispOworCisvLyAxNngxNgorZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfMTZ4MTZfYXJtdjYKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIHNob3J0ICAgICAgICAgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKKyAgICBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgorKTsKKworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2CisoCisgICAgc2hvcnQgICAgICAgICAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfcGl0Y2gsCisgICAgdW5zaWduZWQgaW50IGNudCwKKyAgICBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgorKTsKKworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcjRfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NgorKAorICAgIHNob3J0ICAgICAgICAgKnNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAorICAgIHVuc2lnbmVkIGludCBjbnQsCisgICAgY29uc3Qgc2hvcnQgKnZwOF9maWx0ZXIKKyk7CisKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX29ubHlfYXJtdjYKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IGNudCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAorICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCispOworCisKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19vbmx5X2FybXY2CisoCisgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBjbnQsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF9waXRjaCwKKyAgICBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgorKTsKKworI2lmIEhBVkVfTUVESUEKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0NHg0X2FybXY2CisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgIGRzdF9waXRjaAorKQoreworICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlcjsKKyAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXI7CisgICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDQsIHNob3J0LCBGRGF0YSwgMTIqNCk7IC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKworCisgICAgSEZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeG9mZnNldF07ICAgLyogNiB0YXAgKi8KKyAgICBWRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t5b2Zmc2V0XTsgICAvKiA2IHRhcCAqLworCisgICAgLyogVmZpbHRlciBpcyBudWxsLiBGaXJzdCBwYXNzIG9ubHkgKi8KKyAgICBpZiAoeG9mZnNldCAmJiAheW9mZnNldCkKKyAgICB7CisgICAgICAgIC8qdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfYXJtdjYgKCBzcmNfcHRyLCBGRGF0YSsyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCA0LCBIRmlsdGVyICk7CisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NiAoIEZEYXRhKzIsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgVkZpbHRlciApOyovCisKKyAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Nfb25seV9hcm12NihzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCBkc3RfcGl0Y2gsIEhGaWx0ZXIpOworICAgIH0KKyAgICAvKiBIZmlsdGVyIGlzIG51bGwuIFNlY29uZCBwYXNzIG9ubHkgKi8KKyAgICBlbHNlIGlmICgheG9mZnNldCAmJiB5b2Zmc2V0KQorICAgIHsKKyAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX29ubHlfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgNCwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVmZpbHRlciBpcyBhIDQgdGFwIGZpbHRlciAqLworICAgICAgICBpZiAoeW9mZnNldCAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciAtIHNyY19waXhlbHNfcGVyX2xpbmUsIEZEYXRhICsgMSwgc3JjX3BpeGVsc19wZXJfbGluZSwgNCwgNywgSEZpbHRlcik7CisgICAgICAgICAgICB2cDhfZmlsdGVyNF9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2KEZEYXRhICsgMiwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCBWRmlsdGVyKTsKKyAgICAgICAgfQorICAgICAgICAvKiBWZmlsdGVyIGlzIDYgdGFwIGZpbHRlciAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX2FybXY2KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwgNCwgOSwgSEZpbHRlcik7CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDQsIFZGaWx0ZXIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9hcm12NgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50ICBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7CisgICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSg0LCBzaG9ydCwgRkRhdGEsIDE2KjgpOyAvKiBUZW1wIGRhdGEgYnVmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisKKyAgICBIRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t4b2Zmc2V0XTsgICAvKiA2IHRhcCAqLworICAgIFZGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3lvZmZzZXRdOyAgIC8qIDYgdGFwICovCisKKyAgICBpZiAoeG9mZnNldCAmJiAheW9mZnNldCkKKyAgICB7CisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX29ubHlfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgOCwgZHN0X3BpdGNoLCBIRmlsdGVyKTsKKyAgICB9CisgICAgLyogSGZpbHRlciBpcyBudWxsLiBTZWNvbmQgcGFzcyBvbmx5ICovCisgICAgZWxzZSBpZiAoIXhvZmZzZXQgJiYgeW9mZnNldCkKKyAgICB7CisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19vbmx5X2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDgsIGRzdF9waXRjaCwgVkZpbHRlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh5b2Zmc2V0ICYgMHgxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc184eDhfYXJtdjYoc3JjX3B0ciAtIHNyY19waXhlbHNfcGVyX2xpbmUsIEZEYXRhICsgMSwgc3JjX3BpeGVsc19wZXJfbGluZSwgOCwgMTEsIEhGaWx0ZXIpOworICAgICAgICAgICAgdnA4X2ZpbHRlcjRfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NihGRGF0YSArIDIsIGRzdF9wdHIsIGRzdF9waXRjaCwgOCwgVkZpbHRlcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc184eDhfYXJtdjYoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA4LCAxMywgSEZpbHRlcik7CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIFZGaWx0ZXIpOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYXJtdjYKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCAgZHN0X3BpdGNoCispCit7CisgICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOworICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKKyAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoNCwgc2hvcnQsIEZEYXRhLCAyNCoxNik7ICAgIC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKworICAgIEhGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3hvZmZzZXRdOyAgIC8qIDYgdGFwICovCisgICAgVkZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeW9mZnNldF07ICAgLyogNiB0YXAgKi8KKworICAgIGlmICh4b2Zmc2V0ICYmICF5b2Zmc2V0KQorICAgIHsKKyAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Nfb25seV9hcm12NihzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxNiwgZHN0X3BpdGNoLCBIRmlsdGVyKTsKKyAgICB9CisgICAgLyogSGZpbHRlciBpcyBudWxsLiBTZWNvbmQgcGFzcyBvbmx5ICovCisgICAgZWxzZSBpZiAoIXhvZmZzZXQgJiYgeW9mZnNldCkKKyAgICB7CisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19vbmx5X2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDE2LCBkc3RfcGl0Y2gsIFZGaWx0ZXIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoeW9mZnNldCAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfMTZ4MTZfYXJtdjYoc3JjX3B0ciAtIHNyY19waXhlbHNfcGVyX2xpbmUsIEZEYXRhICsgMSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMTYsIDE5LCBIRmlsdGVyKTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXI0X2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCBWRmlsdGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzXzE2eDE2X2FybXY2KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMTYsIDIxLCBIRmlsdGVyKTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NihGRGF0YSArIDIsIGRzdF9wdHIsIGRzdF9waXRjaCwgMTYsIFZGaWx0ZXIpOworICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9sb29wZmlsdGVyX2FybS5jIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL2xvb3BmaWx0ZXJfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmOWJkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9sb29wZmlsdGVyX2FybS5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vbG9vcGZpbHRlci5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCisKKyNkZWZpbmUgcHJvdG90eXBlX2xvb3BmaWx0ZXIoc3ltKSBcCisgICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCxcCisgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRocmVzaCwgaW50IGNvdW50KQorCisjaWYgSEFWRV9NRURJQQorZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYpOworZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KTsKK2V4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYpOworZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjYpOworI2VuZGlmCisKKyNpZiBIQVZFX05FT04KK3R5cGVkZWYgdm9pZCBsb29wZmlsdGVyX3lfbmVvbih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBwaXRjaCwKKyAgICAgICAgdW5zaWduZWQgY2hhciBibGltaXQsIHVuc2lnbmVkIGNoYXIgbGltaXQsIHVuc2lnbmVkIGNoYXIgdGhyZXNoKTsKK3R5cGVkZWYgdm9pZCBsb29wZmlsdGVyX3V2X25lb24odW5zaWduZWQgY2hhciAqdSwgaW50IHBpdGNoLAorICAgICAgICB1bnNpZ25lZCBjaGFyIGJsaW1pdCwgdW5zaWduZWQgY2hhciBsaW1pdCwgdW5zaWduZWQgY2hhciB0aHJlc2gsCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnYpOworCitleHRlcm4gbG9vcGZpbHRlcl95X25lb24gdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb247CitleHRlcm4gbG9vcGZpbHRlcl95X25lb24gdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uOworZXh0ZXJuIGxvb3BmaWx0ZXJfeV9uZW9uIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb247CitleHRlcm4gbG9vcGZpbHRlcl95X25lb24gdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb247CisKK2V4dGVybiBsb29wZmlsdGVyX3V2X25lb24gdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9uZW9uOworZXh0ZXJuIGxvb3BmaWx0ZXJfdXZfbmVvbiB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9uOworZXh0ZXJuIGxvb3BmaWx0ZXJfdXZfbmVvbiB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbjsKK2V4dGVybiBsb29wZmlsdGVyX3V2X25lb24gdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9uOworI2VuZGlmCisKKyNpZiBIQVZFX01FRElBCisvKiBBUk1WNi9NRURJQSBsb29wZmlsdGVyIGZ1bmN0aW9ucyovCisvKiBIb3Jpem9udGFsIE1CIGZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX2FybXY2KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12Nih1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKKworICAgIGlmICh2X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHZfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDEpOworfQorCisvKiBWZXJ0aWNhbCBNQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9hcm12Nih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjYoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKKworICAgIGlmICh2X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih2X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKworLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfYXJtdjYodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYoeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12Nih1X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKKworICAgIGlmICh2X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12Nih2X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhzX2FybXY2KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCBpbnQgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KQoreworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHlfcHRyICsgNCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgYmxpbWl0KTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12Nih5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGJsaW1pdCk7CisgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYXJtdjYoeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgYmxpbWl0KTsKK30KKworLyogVmVydGljYWwgQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X2FybXY2KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciArIDQsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KHlfcHRyICsgOCwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjYoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KHVfcHRyICsgNCwgdXZfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDEpOworCisgICAgaWYgKHZfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih2X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX2FybXY2KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCBpbnQgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KQoreworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciArIDQsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciArIDgsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciArIDEyLCB5X3N0cmlkZSwgYmxpbWl0KTsKK30KKyNlbmRpZgorCisjaWYgSEFWRV9ORU9OCisvKiBORU9OIGxvb3BmaWx0ZXIgZnVuY3Rpb25zICovCisvKiBIb3Jpem9udGFsIE1CIGZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX25lb24odW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHVuc2lnbmVkIGNoYXIgbWJsaW0gPSAqbGZpLT5tYmxpbTsKKyAgICB1bnNpZ25lZCBjaGFyIGxpbSA9ICpsZmktPmxpbTsKKyAgICB1bnNpZ25lZCBjaGFyIGhldl90aHIgPSAqbGZpLT5oZXZfdGhyOworICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb24oeV9wdHIsIHlfc3RyaWRlLCBtYmxpbSwgbGltLCBoZXZfdGhyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb24odV9wdHIsIHV2X3N0cmlkZSwgbWJsaW0sIGxpbSwgaGV2X3Rociwgdl9wdHIpOworfQorCisvKiBWZXJ0aWNhbCBNQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9uZW9uKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1ibGltID0gKmxmaS0+bWJsaW07CisgICAgdW5zaWduZWQgY2hhciBsaW0gPSAqbGZpLT5saW07CisgICAgdW5zaWduZWQgY2hhciBoZXZfdGhyID0gKmxmaS0+aGV2X3RocjsKKworICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uKHlfcHRyLCB5X3N0cmlkZSwgbWJsaW0sIGxpbSwgaGV2X3Rocik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbih1X3B0ciwgdXZfc3RyaWRlLCBtYmxpbSwgbGltLCBoZXZfdGhyLCB2X3B0cik7Cit9CisKKy8qIEhvcml6b250YWwgQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoX25lb24odW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdW5zaWduZWQgY2hhciBibGltID0gKmxmaS0+YmxpbTsKKyAgICB1bnNpZ25lZCBjaGFyIGxpbSA9ICpsZmktPmxpbTsKKyAgICB1bnNpZ25lZCBjaGFyIGhldl90aHIgPSAqbGZpLT5oZXZfdGhyOworCisgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb24oeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBibGltLCBsaW0sIGhldl90aHIpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9uZW9uKHlfcHRyICsgOCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgYmxpbSwgbGltLCBoZXZfdGhyKTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbih5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBibGltLCBsaW0sIGhldl90aHIpOworCisgICAgaWYgKHVfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb24odV9wdHIgKyA0ICogdXZfc3RyaWRlLCB1dl9zdHJpZGUsIGJsaW0sIGxpbSwgaGV2X3Rociwgdl9wdHIgKyA0ICogdXZfc3RyaWRlKTsKK30KKworLyogVmVydGljYWwgQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X25lb24odW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdW5zaWduZWQgY2hhciBibGltID0gKmxmaS0+YmxpbTsKKyAgICB1bnNpZ25lZCBjaGFyIGxpbSA9ICpsZmktPmxpbTsKKyAgICB1bnNpZ25lZCBjaGFyIGhldl90aHIgPSAqbGZpLT5oZXZfdGhyOworCisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uKHlfcHRyICsgNCwgeV9zdHJpZGUsIGJsaW0sIGxpbSwgaGV2X3Rocik7CisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uKHlfcHRyICsgOCwgeV9zdHJpZGUsIGJsaW0sIGxpbSwgaGV2X3Rocik7CisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uKHlfcHRyICsgMTIsIHlfc3RyaWRlLCBibGltLCBsaW0sIGhldl90aHIpOworCisgICAgaWYgKHVfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9uKHVfcHRyICsgNCwgdXZfc3RyaWRlLCBibGltLCBsaW0sIGhldl90aHIsIHZfcHRyICsgNCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0MTZ4MTZfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3QxNngxNl9uZW9uLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3QxNngxNl9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0MTZ4MTZfbmVvbi5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0NHg0X25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0NHg0X25lb24uYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDR4NF9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0NHg0X25lb24uYXNtCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4NF9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4NF9uZW9uLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3Q4eDRfbmVvbi5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4NF9uZW9uLmFzbQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3Q4eDhfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3Q4eDhfbmVvbi5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0OHg4X25lb24uYXNtCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3Q4eDhfbmVvbi5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vYnVpbGRpbnRyYXByZWRpY3RvcnNtYnlfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9idWlsZGludHJhcHJlZGljdG9yc21ieV9uZW9uLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9hcm0vbmVvbi9idWlsZGludHJhcHJlZGljdG9yc21ieV9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vYnVpbGRpbnRyYXByZWRpY3RvcnNtYnlfbmVvbi5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTE2eDE2X25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTE2eDE2X25lb24uYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL2FybS9uZW9uL2NvcHltZW0xNngxNl9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTE2eDE2X25lb24uYXNtCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDRfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9jb3B5bWVtOHg0X25lb24uYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDRfbmVvbi5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDRfbmVvbi5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTh4OF9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDhfbmVvbi5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTh4OF9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vY29weW1lbTh4OF9uZW9uLmFzbQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vZGNfb25seV9pZGN0X2FkZF9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2RjX29ubHlfaWRjdF9hZGRfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmZjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2RjX29ubHlfaWRjdF9hZGRfbmVvbi5hc20KQEAgLTAsMCArMSw1NCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgYW5kIHBhdGVudAorOyAgZ3JhbnQgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMKKzsgIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfZGNfb25seV9pZGN0X2FkZF9uZW9ufAorICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworO3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyhzaG9ydCBpbnB1dF9kYywgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUpCisKKzsgcjAgIGlucHV0X2RjCis7IHIxICBwcmVkX3B0cgorOyByMiAgcHJlZF9zdHJpZGUKKzsgcjMgIGRzdF9wdHIKKzsgc3AgIGRzdF9zdHJpZGUKKworfHZwOF9kY19vbmx5X2lkY3RfYWRkX25lb258IFBST0MKKyAgICBhZGQgICAgICAgICAgICAgcjAsIHIwLCAjNAorICAgIGFzciAgICAgICAgICAgICByMCwgcjAsICMzCisgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgIHZkdXAuMTYgICAgICAgICBxMCwgcjAKKworICAgIHZsZDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjFdLCByMgorICAgIHZsZDEuMzIgICAgICAgICB7ZDJbMV19LCBbcjFdLCByMgorICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMF19LCBbcjFdLCByMgorICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMV19LCBbcjFdCisKKyAgICB2YWRkdy51OCAgICAgICAgcTEsIHEwLCBkMgorICAgIHZhZGR3LnU4ICAgICAgICBxMiwgcTAsIGQ0CisKKyAgICB2cW1vdnVuLnMxNiAgICAgZDIsIHExCisgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCBxMgorCisgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sIFtyM10sIHIxMgorICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCBbcjNdLCByMTIKKyAgICB2c3QxLjMyICAgICAgICAge2Q0WzBdfSwgW3IzXSwgcjEyCisgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyM10KKworICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9kZXF1YW50X2lkY3RfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9kZXF1YW50X2lkY3RfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyY2NlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2RlcXVhbnRfaWRjdF9uZW9uLmFzbQpAQCAtMCwwICsxLDEzMSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9kZXF1YW50X2lkY3RfYWRkX25lb258CisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorO3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbmVvbihzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgc3RyaWRlKQorOyByMCAgICBzaG9ydCAqaW5wdXQsCis7IHIxICAgIHNob3J0ICpkcSwKKzsgcjIgICAgdW5zaWduZWQgY2hhciAqZGVzdAorOyByMyAgICBpbnQgc3RyaWRlCisKK3x2cDhfZGVxdWFudF9pZGN0X2FkZF9uZW9ufCBQUk9DCisgICAgdmxkMS4xNiAgICAgICAgIHtxMywgcTR9LCBbcjBdCisgICAgdmxkMS4xNiAgICAgICAgIHtxNSwgcTZ9LCBbcjFdCisKKyAgICBhZGQgICAgICAgICAgICAgcjEsIHIyLCByMyAgICAgICAgICAgICAgOyByMSA9IGRlc3QgKyBzdHJpZGUKKyAgICBsc2wgICAgICAgICAgICAgcjMsICMxICAgICAgICAgICAgICAgICAgOyAyeCBzdHJpZGUKKworICAgIHZsZDEuMzIgICAgICAgICB7ZDE0WzBdfSwgW3IyXSwgcjMKKyAgICB2bGQxLjMyICAgICAgICAge2QxNFsxXX0sIFtyMV0sIHIzCisgICAgdmxkMS4zMiAgICAgICAgIHtkMTVbMF19LCBbcjJdCisgICAgdmxkMS4zMiAgICAgICAgIHtkMTVbMV19LCBbcjFdCisKKyAgICBhZHIgICAgICAgICAgICAgcjEyLCBjb3NwaThzcXJ0Mm1pbnVzMSAgOyBwb2ludGVyIHRvIHRoZSBmaXJzdCBjb25zdGFudAorCisgICAgdm11bC5pMTYgICAgICAgIHExLCBxMywgcTUgICAgICAgICAgICAgIDtpbnB1dCBmb3Igc2hvcnRfaWRjdDR4NGxsbV9uZW9uCisgICAgdm11bC5pMTYgICAgICAgIHEyLCBxNCwgcTYKKworO3xzaG9ydF9pZGN0NHg0bGxtX25lb258IFBST0MKKyAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3IxMl0KKyAgICB2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgO3EyKHZwWzRdIHZwWzEyXSkKKworICAgIHZxZG11bGguczE2ICAgICBxMywgcTIsIGQwWzJdCisgICAgdnFkbXVsaC5zMTYgICAgIHE0LCBxMiwgZDBbMF0KKworICAgIHZxYWRkLnMxNiAgICAgICBkMTIsIGQyLCBkMyAgICAgICAgICAgICA7YTEKKyAgICB2cXN1Yi5zMTYgICAgICAgZDEzLCBkMiwgZDMgICAgICAgICAgICAgO2IxCisKKyAgICB2c2hyLnMxNiAgICAgICAgcTMsIHEzLCAjMQorICAgIHZzaHIuczE2ICAgICAgICBxNCwgcTQsICMxCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTMsIHEzLCBxMgorICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTQsIHEyCisKKyAgICB2cXN1Yi5zMTYgICAgICAgZDEwLCBkNiwgZDkgICAgICAgICAgICAgO2MxCisgICAgdnFhZGQuczE2ICAgICAgIGQxMSwgZDcsIGQ4ICAgICAgICAgICAgIDtkMQorCisgICAgdnFhZGQuczE2ICAgICAgIGQyLCBkMTIsIGQxMQorICAgIHZxYWRkLnMxNiAgICAgICBkMywgZDEzLCBkMTAKKyAgICB2cXN1Yi5zMTYgICAgICAgZDQsIGQxMywgZDEwCisgICAgdnFzdWIuczE2ICAgICAgIGQ1LCBkMTIsIGQxMQorCisgICAgdnRybi4zMiAgICAgICAgIGQyLCBkNAorICAgIHZ0cm4uMzIgICAgICAgICBkMywgZDUKKyAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQzCisgICAgdnRybi4xNiAgICAgICAgIGQ0LCBkNQorCis7IG1lbXNldChpbnB1dCwgMCwgMzIpIC0tIDMyYnl0ZXMKKyAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAorCisgICAgdnN3cCAgICAgICAgICAgIGQzLCBkNAorICAgIHZxZG11bGguczE2ICAgICBxMywgcTIsIGQwWzJdCisgICAgdnFkbXVsaC5zMTYgICAgIHE0LCBxMiwgZDBbMF0KKworICAgIHZxYWRkLnMxNiAgICAgICBkMTIsIGQyLCBkMyAgICAgICAgICAgICA7YTEKKyAgICB2cXN1Yi5zMTYgICAgICAgZDEzLCBkMiwgZDMgICAgICAgICAgICAgO2IxCisKKyAgICB2bW92ICAgICAgICAgICAgcTE1LCBxMTQKKworICAgIHZzaHIuczE2ICAgICAgICBxMywgcTMsICMxCisgICAgdnNoci5zMTYgICAgICAgIHE0LCBxNCwgIzEKKworICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTMsIHEyCisgICAgdnFhZGQuczE2ICAgICAgIHE0LCBxNCwgcTIKKworICAgIHZxc3ViLnMxNiAgICAgICBkMTAsIGQ2LCBkOSAgICAgICAgICAgICA7YzEKKyAgICB2cWFkZC5zMTYgICAgICAgZDExLCBkNywgZDggICAgICAgICAgICAgO2QxCisKKyAgICB2cWFkZC5zMTYgICAgICAgZDIsIGQxMiwgZDExCisgICAgdnFhZGQuczE2ICAgICAgIGQzLCBkMTMsIGQxMAorICAgIHZxc3ViLnMxNiAgICAgICBkNCwgZDEzLCBkMTAKKyAgICB2cXN1Yi5zMTYgICAgICAgZDUsIGQxMiwgZDExCisKKyAgICB2c3QxLjE2ICAgICAgICAge3ExNCwgcTE1fSwgW3IwXQorCisgICAgdnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMKKyAgICB2cnNoci5zMTYgICAgICAgZDMsIGQzLCAjMworICAgIHZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzCisgICAgdnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMKKworICAgIHZ0cm4uMzIgICAgICAgICBkMiwgZDQKKyAgICB2dHJuLjMyICAgICAgICAgZDMsIGQ1CisgICAgdnRybi4xNiAgICAgICAgIGQyLCBkMworICAgIHZ0cm4uMTYgICAgICAgICBkNCwgZDUKKworICAgIHZhZGR3LnU4ICAgICAgICBxMSwgcTEsIGQxNAorICAgIHZhZGR3LnU4ICAgICAgICBxMiwgcTIsIGQxNQorCisgICAgc3ViICAgICAgICAgICAgIHIyLCByMiwgcjMKKyAgICBzdWIgICAgICAgICAgICAgcjEsIHIxLCByMworCisgICAgdnFtb3Z1bi5zMTYgICAgIGQwLCBxMQorICAgIHZxbW92dW4uczE2ICAgICBkMSwgcTIKKworICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCBbcjJdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCBbcjFdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbcjJdCisgICAgdnN0MS4zMiAgICAgICAgIHtkMVsxXX0sIFtyMV0KKworICAgIGJ4ICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQICAgICAgICAgICA7IHx2cDhfZGVxdWFudF9pZGN0X2FkZF9uZW9ufAorCis7IENvbnN0YW50IFBvb2wKK2Nvc3BpOHNxcnQybWludXMxIERDRCAweDRlN2I0ZTdiCitzaW5waThzcXJ0MiAgICAgICBEQ0QgMHg4YThjOGE4YworCisgICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9hcm0vbmVvbi9kZXF1YW50aXplYl9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2RlcXVhbnRpemViX25lb24uYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvZGVjb2Rlci9hcm0vbmVvbi9kZXF1YW50aXplYl9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vZGVxdWFudGl6ZWJfbmVvbi5hc20KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2lkY3RfYmxrX25lb24uYyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2lkY3RfYmxrX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdmMjIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vaWRjdF9ibGtfbmVvbi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorCisvKiBwbGFjZSB0aGVzZSBkZWNsYXJhdGlvbnMgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4gdGhlbQorICogb3V0c2lkZSBvZiB0aGlzIHNjb3BlCisgKi8KK3ZvaWQgaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbihzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSk7Cit2b2lkIGlkY3RfZGVxdWFudF8wXzJ4X25lb24oc2hvcnQgKnEsIHNob3J0IGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSk7CisKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX25lb24oc2hvcnQgKnEsIHNob3J0ICpkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzBdKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKChzaG9ydCAqKWVvYnMpWzBdICYgMHhmZWZlKQorICAgICAgICAgICAgICAgIGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24gKHEsIGRxLCBkc3QsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfbmVvbiAocSwgZHFbMF0sIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoc2hvcnQgKillb2JzKVsxXSAmIDB4ZmVmZSkKKyAgICAgICAgICAgICAgICBpZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9uIChxKzMyLCBkcSwgZHN0KzgsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfbmVvbiAocSszMiwgZHFbMF0sIGRzdCs4LCBzdHJpZGUpOworICAgICAgICB9CisgICAgICAgIHEgICAgKz0gNjQ7CisgICAgICAgIGRzdCAgKz0gNCpzdHJpZGU7CisgICAgICAgIGVvYnMgKz0gNDsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfbmVvbihzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQoreworICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVswXSkKKyAgICB7CisgICAgICAgIGlmICgoKHNob3J0ICopZW9icylbMF0gJiAweGZlZmUpCisgICAgICAgICAgICBpZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9uIChxLCBkcSwgZHN0dSwgc3RyaWRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfbmVvbiAocSwgZHFbMF0sIGRzdHUsIHN0cmlkZSk7CisgICAgfQorCisgICAgcSAgICArPSAzMjsKKyAgICBkc3R1ICs9IDQqc3RyaWRlOworCisgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzFdKQorICAgIHsKKyAgICAgICAgaWYgKCgoc2hvcnQgKillb2JzKVsxXSAmIDB4ZmVmZSkKKyAgICAgICAgICAgIGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24gKHEsIGRxLCBkc3R1LCBzdHJpZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpZGN0X2RlcXVhbnRfMF8yeF9uZW9uIChxLCBkcVswXSwgZHN0dSwgc3RyaWRlKTsKKyAgICB9CisKKyAgICBxICs9IDMyOworCisgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzJdKQorICAgIHsKKyAgICAgICAgaWYgKCgoc2hvcnQgKillb2JzKVsyXSAmIDB4ZmVmZSkKKyAgICAgICAgICAgIGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24gKHEsIGRxLCBkc3R2LCBzdHJpZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpZGN0X2RlcXVhbnRfMF8yeF9uZW9uIChxLCBkcVswXSwgZHN0diwgc3RyaWRlKTsKKyAgICB9CisKKyAgICBxICAgICs9IDMyOworICAgIGRzdHYgKz0gNCpzdHJpZGU7CisKKyAgICBpZiAoKChzaG9ydCAqKShlb2JzKSlbM10pCisgICAgeworICAgICAgICBpZiAoKChzaG9ydCAqKWVvYnMpWzNdICYgMHhmZWZlKQorICAgICAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbiAocSwgZHEsIGRzdHYsIHN0cmlkZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlkY3RfZGVxdWFudF8wXzJ4X25lb24gKHEsIGRxWzBdLCBkc3R2LCBzdHJpZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2lkY3RfZGVxdWFudF8wXzJ4X25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vaWRjdF9kZXF1YW50XzBfMnhfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyOWM1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2lkY3RfZGVxdWFudF8wXzJ4X25lb24uYXNtCkBAIC0wLDAgKzEsNzkgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIGFuZCBwYXRlbnQKKzsgIGdyYW50IHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5IGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTCis7ICBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8aWRjdF9kZXF1YW50XzBfMnhfbmVvbnwKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCis7dm9pZCBpZGN0X2RlcXVhbnRfMF8yeF9uZW9uKHNob3J0ICpxLCBzaG9ydCBkcSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlKTsKKzsgcjAgICAqcQorOyByMSAgIGRxCis7IHIyICAgKmRzdAorOyByMyAgIHN0cmlkZQorfGlkY3RfZGVxdWFudF8wXzJ4X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICAgICAge3I0LCByNX0KKworICAgIGFkZCAgICAgICAgICAgICByMTIsIHIyLCAjNAorICAgIHZsZDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjJdLCByMworICAgIHZsZDEuMzIgICAgICAgICB7ZDhbMF19LCBbcjEyXSwgcjMKKyAgICB2bGQxLjMyICAgICAgICAge2QyWzFdfSwgW3IyXSwgcjMKKyAgICB2bGQxLjMyICAgICAgICAge2Q4WzFdfSwgW3IxMl0sIHIzCisgICAgdmxkMS4zMiAgICAgICAgIHtkNFswXX0sIFtyMl0sIHIzCisgICAgdmxkMS4zMiAgICAgICAgIHtkMTBbMF19LCBbcjEyXSwgcjMKKyAgICB2bGQxLjMyICAgICAgICAge2Q0WzFdfSwgW3IyXSwgcjMKKyAgICB2bGQxLjMyICAgICAgICAge2QxMFsxXX0sIFtyMTJdLCByMworCisgICAgbGRyaCAgICAgICAgICAgIHIxMiwgW3IwXSAgICAgICAgICAgICAgIDsgbG8gcQorICAgIGxkcmggICAgICAgICAgICByNCwgW3IwLCAjMzJdICAgICAgICAgICA7IGhpIHEKKyAgICBtb3YgICAgICAgICAgICAgcjUsICMwCisgICAgc3RyaCAgICAgICAgICAgIHI1LCBbcjBdCisgICAgc3RyaCAgICAgICAgICAgIHI1LCBbcjAsICMzMl0KKworICAgIHN4dGggICAgICAgICAgICByMTIsIHIxMiAgICAgICAgICAgICAgICA7IGxvCisgICAgbXVsICAgICAgICAgICAgIHIwLCByMTIsIHIxCisgICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzQKKyAgICBhc3IgICAgICAgICAgICAgcjAsIHIwLCAjMworICAgIHZkdXAuMTYgICAgICAgICBxMCwgcjAKKyAgICBzeHRoICAgICAgICAgICAgcjQsIHI0ICAgICAgICAgICAgICAgICAgOyBoaQorICAgIG11bCAgICAgICAgICAgICByMCwgcjQsIHIxCisgICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzQKKyAgICBhc3IgICAgICAgICAgICAgcjAsIHIwLCAjMworICAgIHZkdXAuMTYgICAgICAgICBxMywgcjAKKworICAgIHZhZGR3LnU4ICAgICAgICBxMSwgcTAsIGQyICAgICAgICAgICAgICA7IGxvCisgICAgdmFkZHcudTggICAgICAgIHEyLCBxMCwgZDQKKyAgICB2YWRkdy51OCAgICAgICAgcTQsIHEzLCBkOCAgICAgICAgICAgICAgOyBoaQorICAgIHZhZGR3LnU4ICAgICAgICBxNSwgcTMsIGQxMAorCisgICAgc3ViICAgICAgICAgICAgIHIyLCByMiwgcjMsIGxzbCAjMiAgICAgIDsgZHN0IC0gNCpzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICAgcjAsIHIyLCAjNAorCisgICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMSAgICAgICAgICAgICAgICAgIDsgbG8KKyAgICB2cW1vdnVuLnMxNiAgICAgZDQsIHEyCisgICAgdnFtb3Z1bi5zMTYgICAgIGQ4LCBxNCAgICAgICAgICAgICAgICAgIDsgaGkKKyAgICB2cW1vdnVuLnMxNiAgICAgZDEwLCBxNQorCisgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sIFtyMl0sIHIzICAgICAgIDsgbG8KKyAgICB2c3QxLjMyICAgICAgICAge2Q4WzBdfSwgW3IwXSwgcjMgICAgICAgOyBoaQorICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCBbcjJdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDhbMV19LCBbcjBdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCBbcjJdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDEwWzBdfSwgW3IwXSwgcjMKKyAgICB2c3QxLjMyICAgICAgICAge2Q0WzFdfSwgW3IyXQorICAgIHZzdDEuMzIgICAgICAgICB7ZDEwWzFdfSwgW3IwXQorCisgICAgcG9wICAgICAgICAgICAgIHtyNCwgcjV9CisgICAgYnggICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQICAgICAgICAgICAgOyB8aWRjdF9kZXF1YW50XzBfMnhfbmVvbnwKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2lkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkY2U2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2lkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24uYXNtCkBAIC0wLDAgKzEsMTk2IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYm0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8aWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbnwKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCis7dm9pZCBpZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9uKHNob3J0ICpxLCBzaG9ydCAqZHEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSk7Cis7IHIwICAgICpxLAorOyByMSAgICAqZHEsCis7IHIyICAgICpkc3QKKzsgcjMgICAgc3RyaWRlCit8aWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbnwgUFJPQworICAgIHZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgW3IxXSAgICAgICAgICA7IGRxIChzYW1lIGwvcikKKyAgICB2bGQxLjE2ICAgICAgICAge3EyLCBxM30sIFtyMF0gICAgICAgICAgOyBsIHEKKyAgICBhZGQgICAgICAgICAgICAgcjAsIHIwLCAjMzIKKyAgICB2bGQxLjE2ICAgICAgICAge3E0LCBxNX0sIFtyMF0gICAgICAgICAgOyByIHEKKyAgICBhZGQgICAgICAgICAgICAgcjEyLCByMiwgIzQKKworICAgIDsgaW50ZXJsZWF2ZSB0aGUgcHJlZGljdG9ycworICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzBdfSwgW3IyXSwgIHIzICAgICA7IGwgcHJlCisgICAgdmxkMS4zMiAgICAgICAgIHtkMjhbMV19LCBbcjEyXSwgcjMgICAgIDsgciBwcmUKKyAgICB2bGQxLjMyICAgICAgICAge2QyOVswXX0sIFtyMl0sICByMworICAgIHZsZDEuMzIgICAgICAgICB7ZDI5WzFdfSwgW3IxMl0sIHIzCisgICAgdmxkMS4zMiAgICAgICAgIHtkMzBbMF19LCBbcjJdLCAgcjMKKyAgICB2bGQxLjMyICAgICAgICAge2QzMFsxXX0sIFtyMTJdLCByMworICAgIHZsZDEuMzIgICAgICAgICB7ZDMxWzBdfSwgW3IyXSwgIHIzCisgICAgdmxkMS4zMiAgICAgICAgIHtkMzFbMV19LCBbcjEyXQorCisgICAgYWRyICAgICAgICAgICAgIHIxLCBjb3NwaThzcXJ0Mm1pbnVzMSAgIDsgcG9pbnRlciB0byB0aGUgZmlyc3QgY29uc3RhbnQKKworICAgIDsgZGVxdWFudDogcVtpXSA9IHFbaV0gKiBkcVtpXQorICAgIHZtdWwuaTE2ICAgICAgICBxMiwgcTIsIHEwCisgICAgdm11bC5pMTYgICAgICAgIHEzLCBxMywgcTEKKyAgICB2bXVsLmkxNiAgICAgICAgcTQsIHE0LCBxMAorICAgIHZtdWwuaTE2ICAgICAgICBxNSwgcTUsIHExCisKKyAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3IxXQorCisgICAgOyBxMjogbDByMCAgcTM6IGw4cjgKKyAgICA7IHE0OiBsNHI0ICBxNTogbDEycjEyCisgICAgdnN3cCAgICAgICAgICAgIGQ1LCBkOAorICAgIHZzd3AgICAgICAgICAgICBkNywgZDEwCisKKyAgICA7IF9DT05TVEFOVFNfICogNCwxMiA+PiAxNgorICAgIDsgcTY6ICA0ICogc2lucGkgOiBjMS90ZW1wMQorICAgIDsgcTc6IDEyICogc2lucGkgOiBkMS90ZW1wMgorICAgIDsgcTg6ICA0ICogY29zcGkKKyAgICA7IHE5OiAxMiAqIGNvc3BpCisgICAgdnFkbXVsaC5zMTYgICAgIHE2LCBxNCwgZDBbMl0gICAgICAgICAgIDsgc2lucGk4c3FydDIKKyAgICB2cWRtdWxoLnMxNiAgICAgcTcsIHE1LCBkMFsyXQorICAgIHZxZG11bGguczE2ICAgICBxOCwgcTQsIGQwWzBdICAgICAgICAgICA7IGNvc3BpOHNxcnQybWludXMxCisgICAgdnFkbXVsaC5zMTYgICAgIHE5LCBxNSwgZDBbMF0KKworICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHEyLCBxMyAgICAgICAgICAgICA7IGExID0gMCArIDgKKyAgICB2cXN1Yi5zMTYgICAgICAgcTExLCBxMiwgcTMgICAgICAgICAgICAgOyBiMSA9IDAgLSA4CisKKyAgICA7IHZxZG11bGggb25seSBhY2NlcHRzIHNpZ25lZCB2YWx1ZXMuIHRoaXMgd2FzIGEgcHJvYmxlbSBiZWNhdXNlCisgICAgOyBvdXIgY29uc3RhbnQgaGFkIHRoZSBoaWdoIGJpdCBzZXQsIGFuZCB3YXMgdHJlYXRlZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgorICAgIDsgdnFkbXVsaCBhbHNvIGRvdWJsZXMgdGhlIHZhbHVlIGJlZm9yZSBpdCBzaGlmdHMgYnkgMTYuIHdlIG5lZWQgdG8KKyAgICA7IGNvbXBlbnNhdGUgZm9yIHRoaXMuIGluIHRoZSBjYXNlIG9mIHNpbnBpOHNxcnQyLCB0aGUgbG93ZXN0IGJpdCBpcyAwLAorICAgIDsgc28gd2UgY2FuIHNoaWZ0IHRoZSBjb25zdGFudCB3aXRob3V0IGxvc2luZyBwcmVjaXNpb24uIHRoaXMgYXZvaWRzCisgICAgOyBzaGlmdCBhZ2FpbiBhZnRlcndhcmQsIGJ1dCBhbHNvIGF2b2lkcyB0aGUgc2lnbiBpc3N1ZS4gd2luIHdpbiEKKyAgICA7IGZvciBjb3NwaThzcXJ0Mm1pbnVzMSB0aGUgbG93ZXN0IGJpdCBpcyAxLCBzbyB3ZSBsb3NlIHByZWNpc2lvbiBpZiB3ZQorICAgIDsgcHJlLXNoaWZ0IGl0CisgICAgdnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEKKyAgICB2c2hyLnMxNiAgICAgICAgcTksIHE5LCAjMQorCisgICAgOyBxNDogIDQgKyAgNCAqIGNvc3BpIDogZDEvdGVtcDEKKyAgICA7IHE1OiAxMiArIDEyICogY29zcGkgOiBjMS90ZW1wMgorICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTQsIHE4CisgICAgdnFhZGQuczE2ICAgICAgIHE1LCBxNSwgcTkKKworICAgIDsgYzEgPSB0ZW1wMSAtIHRlbXAyCisgICAgOyBkMSA9IHRlbXAxICsgdGVtcDIKKyAgICB2cXN1Yi5zMTYgICAgICAgcTIsIHE2LCBxNQorICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTQsIHE3CisKKyAgICA7IFswXTogYTErZDEKKyAgICA7IFsxXTogYjErYzEKKyAgICA7IFsyXTogYjEtYzEKKyAgICA7IFszXTogYTEtZDEKKyAgICB2cWFkZC5zMTYgICAgICAgcTQsIHExMCwgcTMKKyAgICB2cWFkZC5zMTYgICAgICAgcTUsIHExMSwgcTIKKyAgICB2cXN1Yi5zMTYgICAgICAgcTYsIHExMSwgcTIKKyAgICB2cXN1Yi5zMTYgICAgICAgcTcsIHExMCwgcTMKKworICAgIDsgcm90YXRlCisgICAgdnRybi4zMiAgICAgICAgIHE0LCBxNgorICAgIHZ0cm4uMzIgICAgICAgICBxNSwgcTcKKyAgICB2dHJuLjE2ICAgICAgICAgcTQsIHE1CisgICAgdnRybi4xNiAgICAgICAgIHE2LCBxNworICAgIDsgaWRjdCBsb29wIDIKKyAgICA7IHE0OiBsIDAsIDQsIDgsMTIgciAwLCA0LCA4LDEyCisgICAgOyBxNTogbCAxLCA1LCA5LDEzIHIgMSwgNSwgOSwxMworICAgIDsgcTY6IGwgMiwgNiwxMCwxNCByIDIsIDYsMTAsMTQKKyAgICA7IHE3OiBsIDMsIDcsMTEsMTUgciAzLCA3LDExLDE1CisKKyAgICA7IHE4OiAgMSAqIHNpbnBpIDogYzEvdGVtcDEKKyAgICA7IHE5OiAgMyAqIHNpbnBpIDogZDEvdGVtcDIKKyAgICA7IHExMDogMSAqIGNvc3BpCisgICAgOyBxMTE6IDMgKiBjb3NwaQorICAgIHZxZG11bGguczE2ICAgICBxOCwgcTUsIGQwWzJdICAgICAgICAgICA7IHNpbnBpOHNxcnQyCisgICAgdnFkbXVsaC5zMTYgICAgIHE5LCBxNywgZDBbMl0KKyAgICB2cWRtdWxoLnMxNiAgICAgcTEwLCBxNSwgZDBbMF0gICAgICAgICAgOyBjb3NwaThzcXJ0Mm1pbnVzMQorICAgIHZxZG11bGguczE2ICAgICBxMTEsIHE3LCBkMFswXQorCisgICAgdnFhZGQuczE2ICAgICAgIHEyLCBxNCwgcTYgICAgICAgICAgICAgOyBhMSA9IDAgKyAyCisgICAgdnFzdWIuczE2ICAgICAgIHEzLCBxNCwgcTYgICAgICAgICAgICAgOyBiMSA9IDAgLSAyCisKKyAgICA7IHNlZSBub3RlIG9uIHNoaWZ0aW5nIGFib3ZlCisgICAgdnNoci5zMTYgICAgICAgIHExMCwgcTEwLCAjMQorICAgIHZzaHIuczE2ICAgICAgICBxMTEsIHExMSwgIzEKKworICAgIDsgcTEwOiAxICsgMSAqIGNvc3BpIDogZDEvdGVtcDEKKyAgICA7IHExMTogMyArIDMgKiBjb3NwaSA6IGMxL3RlbXAyCisgICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTUsIHExMAorICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHE3LCBxMTEKKworICAgIDsgcTg6IGMxID0gdGVtcDEgLSB0ZW1wMgorICAgIDsgcTk6IGQxID0gdGVtcDEgKyB0ZW1wMgorICAgIHZxc3ViLnMxNiAgICAgICBxOCwgcTgsIHExMQorICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTEwLCBxOQorCisgICAgOyBhMStkMQorICAgIDsgYjErYzEKKyAgICA7IGIxLWMxCisgICAgOyBhMS1kMQorICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTIsIHE5CisgICAgdnFhZGQuczE2ICAgICAgIHE1LCBxMywgcTgKKyAgICB2cXN1Yi5zMTYgICAgICAgcTYsIHEzLCBxOAorICAgIHZxc3ViLnMxNiAgICAgICBxNywgcTIsIHE5CisKKyAgICA7ICs0ID4+IDMgKHJvdW5kaW5nKQorICAgIHZyc2hyLnMxNiAgICAgICBxNCwgcTQsICMzICAgICAgICAgICAgICA7IGxvCisgICAgdnJzaHIuczE2ICAgICAgIHE1LCBxNSwgIzMKKyAgICB2cnNoci5zMTYgICAgICAgcTYsIHE2LCAjMyAgICAgICAgICAgICAgOyBoaQorICAgIHZyc2hyLnMxNiAgICAgICBxNywgcTcsICMzCisKKyAgICB2dHJuLjMyICAgICAgICAgcTQsIHE2CisgICAgdnRybi4zMiAgICAgICAgIHE1LCBxNworICAgIHZ0cm4uMTYgICAgICAgICBxNCwgcTUKKyAgICB2dHJuLjE2ICAgICAgICAgcTYsIHE3CisKKyAgICA7IGFkZGluZyBwcmUKKyAgICA7IGlucHV0IGlzIHN0aWxsIHBhY2tlZC4gcHJlIHdhcyByZWFkIGludGVybGVhdmVkCisgICAgdmFkZHcudTggICAgICAgIHE0LCBxNCwgZDI4CisgICAgdmFkZHcudTggICAgICAgIHE1LCBxNSwgZDI5CisgICAgdmFkZHcudTggICAgICAgIHE2LCBxNiwgZDMwCisgICAgdmFkZHcudTggICAgICAgIHE3LCBxNywgZDMxCisKKyAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAorICAgIHZtb3YgICAgICAgICAgICBxMTUsIHExNAorICAgIHZzdDEuMTYgICAgICAgICB7cTE0LCBxMTV9LCBbcjBdICAgICAgICA7IHdyaXRlIG92ZXIgaGlnaCBpbnB1dAorICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMzMgorICAgIHZzdDEuMTYgICAgICAgICB7cTE0LCBxMTV9LCBbcjBdICAgICAgICA7IHdyaXRlIG92ZXIgbG93IGlucHV0CisKKyAgICBzdWIgICAgICAgICAgICAgcjIsIHIyLCByMywgbHNsICMyICAgICAgOyBkc3QgLSA0KnN0cmlkZQorICAgIGFkZCAgICAgICAgICAgICByMSwgcjIsICM0ICAgICAgICAgICAgICA7IGhpCisKKyAgICA7c2F0dXJhdGUgYW5kIG5hcnJvdworICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTQgICAgICAgICAgICAgICAgICA7IGxvCisgICAgdnFtb3Z1bi5zMTYgICAgIGQxLCBxNQorICAgIHZxbW92dW4uczE2ICAgICBkMiwgcTYgICAgICAgICAgICAgICAgICA7IGhpCisgICAgdnFtb3Z1bi5zMTYgICAgIGQzLCBxNworCisgICAgdnN0MS4zMiAgICAgICAgIHtkMFswXX0sIFtyMl0sIHIzICAgICAgIDsgbG8KKyAgICB2c3QxLjMyICAgICAgICAge2QwWzFdfSwgW3IxXSwgcjMgICAgICAgOyBoaQorICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbcjJdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCBbcjFdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjJdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCBbcjFdLCByMworICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCBbcjJdCisgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sIFtyMV0KKworICAgIGJ4ICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQICAgICAgICAgICA7IHxpZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9ufAorCis7IENvbnN0YW50IFBvb2wKK2Nvc3BpOHNxcnQybWludXMxIERDRCAweDRlN2IKKzsgYmVjYXVzZSB0aGUgbG93ZXN0IGJpdCBpbiAweDhhOGMgaXMgMCwgd2UgY2FuIHByZS1zaGlmdCB0aGlzCitzaW5waThzcXJ0MiAgICAgICBEQ0QgMHg0NTQ2CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2l3YWxzaF9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2l3YWxzaF9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGVhMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vaXdhbHNoX25lb24uYXNtCkBAIC0wLDAgKzEsODcgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworICAgIEVYUE9SVCAgfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbmVvbnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCisKKztzaG9ydCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X25lb24oc2hvcnQgKmlucHV0LCBzaG9ydCAqbWJfZHFjb2VmZikKK3x2cDhfc2hvcnRfaW52X3dhbHNoNHg0X25lb258IFBST0MKKworICAgIDsgcmVhZCBpbiBhbGwgZm91ciBsaW5lcyBvZiB2YWx1ZXM6IGQwLT5kMworICAgIHZsZDEuaTE2IHtxMC1xMX0sIFtyMEAxMjhdCisKKyAgICA7IGZpcnN0IGZvciBsb29wCisgICAgdmFkZC5zMTYgZDQsIGQwLCBkMyA7YSA9IFswXSArIFsxMl0KKyAgICB2YWRkLnMxNiBkNiwgZDEsIGQyIDtiID0gWzRdICsgWzhdCisgICAgdnN1Yi5zMTYgZDUsIGQwLCBkMyA7ZCA9IFswXSAtIFsxMl0KKyAgICB2c3ViLnMxNiBkNywgZDEsIGQyIDtjID0gWzRdIC0gWzhdCisKKyAgICB2YWRkLnMxNiBxMCwgcTIsIHEzIDsgYStiIGQrYworICAgIHZzdWIuczE2IHExLCBxMiwgcTMgOyBhLWIgZC1jCisKKyAgICB2dHJuLjMyIGQwLCBkMiA7ZDA6ICAwICAxICA4ICA5CisgICAgICAgICAgICAgICAgICAgO2QyOiAgMiAgMyAxMCAxMQorICAgIHZ0cm4uMzIgZDEsIGQzIDtkMTogIDQgIDUgMTIgMTMKKyAgICAgICAgICAgICAgICAgICA7ZDM6ICA2ICA3IDE0IDE1CisKKyAgICB2dHJuLjE2IGQwLCBkMSA7ZDA6ICAwICA0ICA4IDEyCisgICAgICAgICAgICAgICAgICAgO2QxOiAgMSAgNSAgOSAxMworICAgIHZ0cm4uMTYgZDIsIGQzIDtkMjogIDIgIDYgMTAgMTQKKyAgICAgICAgICAgICAgICAgICA7ZDM6ICAzICA3IDExIDE1CisKKyAgICA7IHNlY29uZCBmb3IgbG9vcAorCisgICAgdmFkZC5zMTYgZDQsIGQwLCBkMyA7YSA9IFswXSArIFszXQorICAgIHZhZGQuczE2IGQ2LCBkMSwgZDIgO2IgPSBbMV0gKyBbMl0KKyAgICB2c3ViLnMxNiBkNSwgZDAsIGQzIDtkID0gWzBdIC0gWzNdCisgICAgdnN1Yi5zMTYgZDcsIGQxLCBkMiA7YyA9IFsxXSAtIFsyXQorCisgICAgdm1vdi5pMTYgcTgsICMzCisKKyAgICB2YWRkLnMxNiBxMCwgcTIsIHEzIDsgYStiIGQrYworICAgIHZzdWIuczE2IHExLCBxMiwgcTMgOyBhLWIgZC1jCisKKyAgICB2YWRkLmkxNiBxMCwgcTAsIHE4IDtlL2YgKz0gMworICAgIHZhZGQuaTE2IHExLCBxMSwgcTggO2cvaCArPSAzCisKKyAgICB2c2hyLnMxNiBxMCwgcTAsICMzIDtlL2YgPj4gMworICAgIHZzaHIuczE2IHExLCBxMSwgIzMgO2cvaCA+PiAzCisKKyAgICBtb3YgICAgICByMiwgIzY0CisgICAgYWRkICAgICAgcjMsIHIxLCAjMzIKKworICAgIHZzdDEuaTE2IGQwWzBdLCBbcjFdLHIyCisgICAgdnN0MS5pMTYgZDFbMF0sIFtyM10scjIKKyAgICB2c3QxLmkxNiBkMlswXSwgW3IxXSxyMgorICAgIHZzdDEuaTE2IGQzWzBdLCBbcjNdLHIyCisKKyAgICB2c3QxLmkxNiBkMFsxXSwgW3IxXSxyMgorICAgIHZzdDEuaTE2IGQxWzFdLCBbcjNdLHIyCisgICAgdnN0MS5pMTYgZDJbMV0sIFtyMV0scjIKKyAgICB2c3QxLmkxNiBkM1sxXSwgW3IzXSxyMgorCisgICAgdnN0MS5pMTYgZDBbMl0sIFtyMV0scjIKKyAgICB2c3QxLmkxNiBkMVsyXSwgW3IzXSxyMgorICAgIHZzdDEuaTE2IGQyWzJdLCBbcjFdLHIyCisgICAgdnN0MS5pMTYgZDNbMl0sIFtyM10scjIKKworICAgIHZzdDEuaTE2IGQwWzNdLCBbcjFdLHIyCisgICAgdnN0MS5pMTYgZDFbM10sIFtyM10scjIKKyAgICB2c3QxLmkxNiBkMlszXSwgW3IxXQorICAgIHZzdDEuaTE2IGQzWzNdLCBbcjNdCisKKyAgICBieCBscgorICAgIEVORFAgICAgOyB8dnA4X3Nob3J0X2ludl93YWxzaDR4NF9uZW9ufAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyX25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcl9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRiZTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcl9uZW9uLmFzbQpAQCAtMCwwICsxLDM5NyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9uZW9ufAorICAgIEVYUE9SVCAgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258CisgICAgRVhQT1JUICB8dnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbnwKKyAgICBBUk0KKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyYworOyByMSAgICBpbnQgcGl0Y2gKKzsgcjIgICAgdW5zaWduZWQgY2hhciBibGltaXQKKzsgcjMgICAgdW5zaWduZWQgY2hhciBsaW1pdAorOyBzcCAgICB1bnNpZ25lZCBjaGFyIHRocmVzaCwKK3x2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgIHtscn0KKyAgICB2ZHVwLnU4ICAgICBxMCwgcjIgICAgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSBibGltaXQKKyAgICB2ZHVwLnU4ICAgICBxMSwgcjMgICAgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSBsaW1pdAorICAgIHN1YiAgICAgICAgIHIyLCByMCwgcjEsIGxzbCAjMiAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgbGluZXMKKyAgICBsZHIgICAgICAgICByMywgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgdGhyZXNoCisgICAgYWRkICAgICAgICAgcjEyLCByMiwgcjEKKyAgICBhZGQgICAgICAgICByMSwgcjEsIHIxCisKKyAgICB2ZHVwLnU4ICAgICBxMiwgcjMgICAgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSB0aHJlc2gKKworICAgIHZsZDEudTggICAgIHtxM30sIFtyMkAxMjhdLCByMSAgICAgICAgICAgICAgOyBwMworICAgIHZsZDEudTggICAgIHtxNH0sIFtyMTJAMTI4XSwgcjEgICAgICAgICAgICAgOyBwMgorICAgIHZsZDEudTggICAgIHtxNX0sIFtyMkAxMjhdLCByMSAgICAgICAgICAgICAgOyBwMQorICAgIHZsZDEudTggICAgIHtxNn0sIFtyMTJAMTI4XSwgcjEgICAgICAgICAgICAgOyBwMAorICAgIHZsZDEudTggICAgIHtxN30sIFtyMkAxMjhdLCByMSAgICAgICAgICAgICAgOyBxMAorICAgIHZsZDEudTggICAgIHtxOH0sIFtyMTJAMTI4XSwgcjEgICAgICAgICAgICAgOyBxMQorICAgIHZsZDEudTggICAgIHtxOX0sIFtyMkAxMjhdICAgICAgICAgICAgICAgICAgOyBxMgorICAgIHZsZDEudTggICAgIHtxMTB9LCBbcjEyQDEyOF0gICAgICAgICAgICAgICAgOyBxMworCisgICAgc3ViICAgICAgICAgcjIsIHIyLCByMSwgbHNsICMxCisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzEKKworICAgIGJsICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9uZW9uCisKKyAgICB2c3QxLnU4ICAgICB7cTV9LCBbcjJAMTI4XSwgcjEgICAgICAgICAgICAgIDsgc3RvcmUgb3AxCisgICAgdnN0MS51OCAgICAge3E2fSwgW3IxMkAxMjhdLCByMSAgICAgICAgICAgICA7IHN0b3JlIG9wMAorICAgIHZzdDEudTggICAgIHtxN30sIFtyMkAxMjhdLCByMSAgICAgICAgICAgICAgOyBzdG9yZSBvcTAKKyAgICB2c3QxLnU4ICAgICB7cTh9LCBbcjEyQDEyOF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgb3ExCisKKyAgICBwb3AgICAgICAgICB7cGN9CisgICAgRU5EUCAgICAgICAgOyB8dnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb258CisKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICp1LAorOyByMSAgICBpbnQgcGl0Y2gsCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgYmxpbWl0Cis7IHIzICAgIHVuc2lnbmVkIGNoYXIgbGltaXQKKzsgc3AgICAgdW5zaWduZWQgY2hhciB0aHJlc2gsCis7IHNwKzQgIHVuc2lnbmVkIGNoYXIgKnYKK3x2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICB7bHJ9CisgICAgdmR1cC51OCAgICAgcTAsIHIyICAgICAgICAgICAgICAgICAgICAgIDsgZHVwbGljYXRlIGJsaW1pdAorICAgIHZkdXAudTggICAgIHExLCByMyAgICAgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSBsaW1pdAorICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgdGhyZXNoCisgICAgbGRyICAgICAgICAgcjIsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgbG9hZCB2IHB0cgorICAgIHZkdXAudTggICAgIHEyLCByMTIgICAgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSB0aHJlc2gKKworICAgIHN1YiAgICAgICAgIHIzLCByMCwgcjEsIGxzbCAjMiAgICAgICAgICA7IG1vdmUgdSBwb2ludGVyIGRvd24gYnkgNCBsaW5lcworICAgIHN1YiAgICAgICAgIHIxMiwgcjIsIHIxLCBsc2wgIzIgICAgICAgICA7IG1vdmUgdiBwb2ludGVyIGRvd24gYnkgNCBsaW5lcworCisgICAgdmxkMS51OCAgICAge2Q2fSwgW3IzQDY0XSwgcjEgICAgICAgICAgICAgIDsgcDMKKyAgICB2bGQxLnU4ICAgICB7ZDd9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICAgOyBwMworICAgIHZsZDEudTggICAgIHtkOH0sIFtyM0A2NF0sIHIxICAgICAgICAgICAgICA7IHAyCisgICAgdmxkMS51OCAgICAge2Q5fSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgIDsgcDIKKyAgICB2bGQxLnU4ICAgICB7ZDEwfSwgW3IzQDY0XSwgcjEgICAgICAgICAgICAgOyBwMQorICAgIHZsZDEudTggICAgIHtkMTF9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICA7IHAxCisgICAgdmxkMS51OCAgICAge2QxMn0sIFtyM0A2NF0sIHIxICAgICAgICAgICAgIDsgcDAKKyAgICB2bGQxLnU4ICAgICB7ZDEzfSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgOyBwMAorICAgIHZsZDEudTggICAgIHtkMTR9LCBbcjNANjRdLCByMSAgICAgICAgICAgICA7IHEwCisgICAgdmxkMS51OCAgICAge2QxNX0sIFtyMTJANjRdLCByMSAgICAgICAgICAgIDsgcTAKKyAgICB2bGQxLnU4ICAgICB7ZDE2fSwgW3IzQDY0XSwgcjEgICAgICAgICAgICAgOyBxMQorICAgIHZsZDEudTggICAgIHtkMTd9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICA7IHExCisgICAgdmxkMS51OCAgICAge2QxOH0sIFtyM0A2NF0sIHIxICAgICAgICAgICAgIDsgcTIKKyAgICB2bGQxLnU4ICAgICB7ZDE5fSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgOyBxMgorICAgIHZsZDEudTggICAgIHtkMjB9LCBbcjNANjRdICAgICAgICAgICAgICAgICA7IHEzCisgICAgdmxkMS51OCAgICAge2QyMX0sIFtyMTJANjRdICAgICAgICAgICAgICAgIDsgcTMKKworICAgIGJsICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9uZW9uCisKKyAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEKKyAgICBzdWIgICAgICAgICByMiwgcjIsIHIxLCBsc2wgIzEKKworICAgIHZzdDEudTggICAgIHtkMTB9LCBbcjBANjRdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHUgb3AxCisgICAgdnN0MS51OCAgICAge2QxMX0sIFtyMkA2NF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdiBvcDEKKyAgICB2c3QxLnU4ICAgICB7ZDEyfSwgW3IwQDY0XSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB1IG9wMAorICAgIHZzdDEudTggICAgIHtkMTN9LCBbcjJANjRdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHYgb3AwCisgICAgdnN0MS51OCAgICAge2QxNH0sIFtyMEA2NF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdSBvcTAKKyAgICB2c3QxLnU4ICAgICB7ZDE1fSwgW3IyQDY0XSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB2IG9xMAorICAgIHZzdDEudTggICAgIHtkMTZ9LCBbcjBANjRdICAgICAgICAgICAgICAgICA7IHN0b3JlIHUgb3ExCisgICAgdnN0MS51OCAgICAge2QxN30sIFtyMkA2NF0gICAgICAgICAgICAgICAgIDsgc3RvcmUgdiBvcTEKKworICAgIHBvcCAgICAgICAgIHtwY30KKyAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb258CisKKzsgdm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQorOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmMKKzsgcjEgICAgaW50IHBpdGNoCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgYmxpbWl0Cis7IHIzICAgIHVuc2lnbmVkIGNoYXIgbGltaXQKKzsgc3AgICAgdW5zaWduZWQgY2hhciB0aHJlc2gsCisKK3x2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICB7bHJ9CisgICAgdmR1cC51OCAgICAgcTAsIHIyICAgICAgICAgICAgICAgICAgICAgOyBkdXBsaWNhdGUgYmxpbWl0CisgICAgdmR1cC51OCAgICAgcTEsIHIzICAgICAgICAgICAgICAgICAgICAgOyBkdXBsaWNhdGUgbGltaXQKKyAgICBzdWIgICAgICAgICByMiwgcjAsICM0ICAgICAgICAgICAgICAgICA7IHNyYyBwdHIgZG93biBieSA0IGNvbHVtbnMKKyAgICBhZGQgICAgICAgICByMSwgcjEsIHIxCisgICAgbGRyICAgICAgICAgcjMsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaAorICAgIGFkZCAgICAgICAgIHIxMiwgcjIsIHIxLCBhc3IgIzEKKworICAgIHZsZDEudTggICAgIHtkNn0sIFtyMl0sIHIxCisgICAgdmxkMS51OCAgICAge2Q4fSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxMH0sIFtyMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxMn0sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTR9LCBbcjJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTZ9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE4fSwgW3IyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDIwfSwgW3IxMl0sIHIxCisKKyAgICB2bGQxLnU4ICAgICB7ZDd9LCBbcjJdLCByMSAgICAgICAgICAgICAgOyBsb2FkIHNlY29uZCA4LWxpbmUgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICB7ZDl9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDExfSwgW3IyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDEzfSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxNX0sIFtyMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxN30sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTl9LCBbcjJdCisgICAgdmxkMS51OCAgICAge2QyMX0sIFtyMTJdCisKKyAgICA7dHJhbnNwb3NlIHRvIDh4MTYgbWF0cml4CisgICAgdnRybi4zMiAgICAgcTMsIHE3CisgICAgdnRybi4zMiAgICAgcTQsIHE4CisgICAgdnRybi4zMiAgICAgcTUsIHE5CisgICAgdnRybi4zMiAgICAgcTYsIHExMAorCisgICAgdmR1cC51OCAgICAgcTIsIHIzICAgICAgICAgICAgICAgICAgICAgOyBkdXBsaWNhdGUgdGhyZXNoCisKKyAgICB2dHJuLjE2ICAgICBxMywgcTUKKyAgICB2dHJuLjE2ICAgICBxNCwgcTYKKyAgICB2dHJuLjE2ICAgICBxNywgcTkKKyAgICB2dHJuLjE2ICAgICBxOCwgcTEwCisKKyAgICB2dHJuLjggICAgICBxMywgcTQKKyAgICB2dHJuLjggICAgICBxNSwgcTYKKyAgICB2dHJuLjggICAgICBxNywgcTgKKyAgICB2dHJuLjggICAgICBxOSwgcTEwCisKKyAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbmVvbgorCisgICAgdnN3cCAgICAgICAgZDEyLCBkMTEKKyAgICB2c3dwICAgICAgICBkMTYsIGQxMworCisgICAgc3ViICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgICAgOyBkc3QgcHRyCisKKyAgICB2c3dwICAgICAgICBkMTQsIGQxMgorICAgIHZzd3AgICAgICAgIGQxNiwgZDE1CisKKyAgICBhZGQgICAgICAgICByMTIsIHIwLCByMSwgYXNyICMxCisKKyAgICA7c3RvcmUgb3AxLCBvcDAsIG9xMCwgb3ExCisgICAgdnN0NC44ICAgICAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFsxXSwgZDExWzFdLCBkMTJbMV0sIGQxM1sxXX0sIFtyMTJdLCByMQorICAgIHZzdDQuOCAgICAgIHtkMTBbMl0sIGQxMVsyXSwgZDEyWzJdLCBkMTNbMl19LCBbcjBdLCByMQorICAgIHZzdDQuOCAgICAgIHtkMTBbM10sIGQxMVszXSwgZDEyWzNdLCBkMTNbM119LCBbcjEyXSwgcjEKKyAgICB2c3Q0LjggICAgICB7ZDEwWzRdLCBkMTFbNF0sIGQxMls0XSwgZDEzWzRdfSwgW3IwXSwgcjEKKyAgICB2c3Q0LjggICAgICB7ZDEwWzVdLCBkMTFbNV0sIGQxMls1XSwgZDEzWzVdfSwgW3IxMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFs2XSwgZDExWzZdLCBkMTJbNl0sIGQxM1s2XX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFs3XSwgZDExWzddLCBkMTJbN10sIGQxM1s3XX0sIFtyMTJdLCByMQorCisgICAgdnN0NC44ICAgICAge2QxNFswXSwgZDE1WzBdLCBkMTZbMF0sIGQxN1swXX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFsxXSwgZDE1WzFdLCBkMTZbMV0sIGQxN1sxXX0sIFtyMTJdLCByMQorICAgIHZzdDQuOCAgICAgIHtkMTRbMl0sIGQxNVsyXSwgZDE2WzJdLCBkMTdbMl19LCBbcjBdLCByMQorICAgIHZzdDQuOCAgICAgIHtkMTRbM10sIGQxNVszXSwgZDE2WzNdLCBkMTdbM119LCBbcjEyXSwgcjEKKyAgICB2c3Q0LjggICAgICB7ZDE0WzRdLCBkMTVbNF0sIGQxNls0XSwgZDE3WzRdfSwgW3IwXSwgcjEKKyAgICB2c3Q0LjggICAgICB7ZDE0WzVdLCBkMTVbNV0sIGQxNls1XSwgZDE3WzVdfSwgW3IxMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFs2XSwgZDE1WzZdLCBkMTZbNl0sIGQxN1s2XX0sIFtyMF0KKyAgICB2c3Q0LjggICAgICB7ZDE0WzddLCBkMTVbN10sIGQxNls3XSwgZDE3WzddfSwgW3IxMl0KKworICAgIHBvcCAgICAgICAgIHtwY30KKyAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258CisKKzsgdm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9uKHVuc2lnbmVkIGNoYXIgKnUsIGludCBwaXRjaAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICp0aHJlc2gsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2KQorOyByMCAgICB1bnNpZ25lZCBjaGFyICp1LAorOyByMSAgICBpbnQgcGl0Y2gsCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgYmxpbWl0Cis7IHIzICAgIHVuc2lnbmVkIGNoYXIgbGltaXQKKzsgc3AgICAgdW5zaWduZWQgY2hhciB0aHJlc2gsCis7IHNwKzQgIHVuc2lnbmVkIGNoYXIgKnYKK3x2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAge2xyfQorICAgIHZkdXAudTggICAgIHEwLCByMiAgICAgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSBibGltaXQKKyAgICBzdWIgICAgICAgICByMTIsIHIwLCAjNCAgICAgICAgICAgICAgICAgOyBtb3ZlIHUgcG9pbnRlciBkb3duIGJ5IDQgY29sdW1ucworICAgIGxkciAgICAgICAgIHIyLCBbc3AsICM4XSAgICAgICAgICAgICAgICA7IGxvYWQgdiBwdHIKKyAgICB2ZHVwLnU4ICAgICBxMSwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBkdXBsaWNhdGUgbGltaXQKKyAgICBzdWIgICAgICAgICByMywgcjIsICM0ICAgICAgICAgICAgICAgICAgOyBtb3ZlIHYgcG9pbnRlciBkb3duIGJ5IDQgY29sdW1ucworCisgICAgdmxkMS51OCAgICAge2Q2fSwgW3IxMl0sIHIxICAgICAgICAgICAgIDtsb2FkIHUgZGF0YQorICAgIHZsZDEudTggICAgIHtkN30sIFtyM10sIHIxICAgICAgICAgICAgICA7bG9hZCB2IGRhdGEKKyAgICB2bGQxLnU4ICAgICB7ZDh9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDl9LCBbcjNdLCByMQorICAgIHZsZDEudTggICAgIHtkMTB9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDExfSwgW3IzXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDEyfSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxM30sIFtyM10sIHIxCisgICAgdmxkMS51OCAgICAge2QxNH0sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTV9LCBbcjNdLCByMQorICAgIHZsZDEudTggICAgIHtkMTZ9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE3fSwgW3IzXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE4fSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxOX0sIFtyM10sIHIxCisgICAgdmxkMS51OCAgICAge2QyMH0sIFtyMTJdCisgICAgdmxkMS51OCAgICAge2QyMX0sIFtyM10KKworICAgIGxkciAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2gKKworICAgIDt0cmFuc3Bvc2UgdG8gOHgxNiBtYXRyaXgKKyAgICB2dHJuLjMyICAgICBxMywgcTcKKyAgICB2dHJuLjMyICAgICBxNCwgcTgKKyAgICB2dHJuLjMyICAgICBxNSwgcTkKKyAgICB2dHJuLjMyICAgICBxNiwgcTEwCisKKyAgICB2ZHVwLnU4ICAgICBxMiwgcjEyICAgICAgICAgICAgICAgICAgICAgOyBkdXBsaWNhdGUgdGhyZXNoCisKKyAgICB2dHJuLjE2ICAgICBxMywgcTUKKyAgICB2dHJuLjE2ICAgICBxNCwgcTYKKyAgICB2dHJuLjE2ICAgICBxNywgcTkKKyAgICB2dHJuLjE2ICAgICBxOCwgcTEwCisKKyAgICB2dHJuLjggICAgICBxMywgcTQKKyAgICB2dHJuLjggICAgICBxNSwgcTYKKyAgICB2dHJuLjggICAgICBxNywgcTgKKyAgICB2dHJuLjggICAgICBxOSwgcTEwCisKKyAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbmVvbgorCisgICAgdnN3cCAgICAgICAgZDEyLCBkMTEKKyAgICB2c3dwICAgICAgICBkMTYsIGQxMworICAgIHZzd3AgICAgICAgIGQxNCwgZDEyCisgICAgdnN3cCAgICAgICAgZDE2LCBkMTUKKworICAgIHN1YiAgICAgICAgIHIwLCByMCwgIzIKKyAgICBzdWIgICAgICAgICByMiwgcjIsICMyCisKKyAgICA7c3RvcmUgb3AxLCBvcDAsIG9xMCwgb3ExCisgICAgdnN0NC44ICAgICAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFswXSwgZDE1WzBdLCBkMTZbMF0sIGQxN1swXX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFsxXSwgZDExWzFdLCBkMTJbMV0sIGQxM1sxXX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFsxXSwgZDE1WzFdLCBkMTZbMV0sIGQxN1sxXX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFsyXSwgZDExWzJdLCBkMTJbMl0sIGQxM1syXX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFsyXSwgZDE1WzJdLCBkMTZbMl0sIGQxN1syXX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFszXSwgZDExWzNdLCBkMTJbM10sIGQxM1szXX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFszXSwgZDE1WzNdLCBkMTZbM10sIGQxN1szXX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFs0XSwgZDExWzRdLCBkMTJbNF0sIGQxM1s0XX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFs0XSwgZDE1WzRdLCBkMTZbNF0sIGQxN1s0XX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFs1XSwgZDExWzVdLCBkMTJbNV0sIGQxM1s1XX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFs1XSwgZDE1WzVdLCBkMTZbNV0sIGQxN1s1XX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFs2XSwgZDExWzZdLCBkMTJbNl0sIGQxM1s2XX0sIFtyMF0sIHIxCisgICAgdnN0NC44ICAgICAge2QxNFs2XSwgZDE1WzZdLCBkMTZbNl0sIGQxN1s2XX0sIFtyMl0sIHIxCisgICAgdnN0NC44ICAgICAge2QxMFs3XSwgZDExWzddLCBkMTJbN10sIGQxM1s3XX0sIFtyMF0KKyAgICB2c3Q0LjggICAgICB7ZDE0WzddLCBkMTVbN10sIGQxNls3XSwgZDE3WzddfSwgW3IyXQorCisgICAgcG9wICAgICAgICAge3BjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb258CisKKzsgdm9pZCB2cDhfbG9vcF9maWx0ZXJfbmVvbigpOworOyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbG9vcGZpbHRlcnMuIFRoZSBpbnZpZHVhbCBmdW5jdGlvbnMgZG8gdGhlCis7IG5lY2Vzc2FyeSBsb2FkLCB0cmFuc3Bvc2UgKGlmIG5lY2Vzc2FyeSkgYW5kIHN0b3JlLgorCis7IHIwLXIzIFBSRVNFUlZFCis7IHEwICAgIGZsaW1pdAorOyBxMSAgICBsaW1pdAorOyBxMiAgICB0aHJlc2gKKzsgcTMgICAgcDMKKzsgcTQgICAgcDIKKzsgcTUgICAgcDEKKzsgcTYgICAgcDAKKzsgcTcgICAgcTAKKzsgcTggICAgcTEKKzsgcTkgICAgcTIKKzsgcTEwICAgcTMKK3x2cDhfbG9vcF9maWx0ZXJfbmVvbnwgUFJPQworCisgICAgOyB2cDhfZmlsdGVyX21hc2sKKyAgICB2YWJkLnU4ICAgICBxMTEsIHEzLCBxNCAgICAgICAgICAgICAgICAgOyBhYnMocDMgLSBwMikKKyAgICB2YWJkLnU4ICAgICBxMTIsIHE0LCBxNSAgICAgICAgICAgICAgICAgOyBhYnMocDIgLSBwMSkKKyAgICB2YWJkLnU4ICAgICBxMTMsIHE1LCBxNiAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBwMCkKKyAgICB2YWJkLnU4ICAgICBxMTQsIHE4LCBxNyAgICAgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkKKyAgICB2YWJkLnU4ICAgICBxMywgcTksIHE4ICAgICAgICAgICAgICAgICAgOyBhYnMocTIgLSBxMSkKKyAgICB2YWJkLnU4ICAgICBxNCwgcTEwLCBxOSAgICAgICAgICAgICAgICAgOyBhYnMocTMgLSBxMikKKworICAgIHZtYXgudTggICAgIHExMSwgcTExLCBxMTIKKyAgICB2bWF4LnU4ICAgICBxMTIsIHExMywgcTE0CisgICAgdm1heC51OCAgICAgcTMsIHEzLCBxNAorICAgIHZtYXgudTggICAgIHExNSwgcTExLCBxMTIKKworICAgIHZhYmQudTggICAgIHE5LCBxNiwgcTcgICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorCisgICAgOyB2cDhfaGV2bWFzaworICAgIHZjZ3QudTggICAgIHExMywgcTEzLCBxMiAgICAgICAgICAgICAgICA7IChhYnMocDEgLSBwMCkgPiB0aHJlc2gpKi0xCisgICAgdmNndC51OCAgICAgcTE0LCBxMTQsIHEyICAgICAgICAgICAgICAgIDsgKGFicyhxMSAtIHEwKSA+IHRocmVzaCkqLTEKKyAgICB2bWF4LnU4ICAgICBxMTUsIHExNSwgcTMKKworICAgIHZtb3YudTggICAgIHExMCwgIzB4ODAgICAgICAgICAgICAgICAgICAgOyAweDgwCisKKyAgICB2YWJkLnU4ICAgICBxMiwgcTUsIHE4ICAgICAgICAgICAgICAgICAgOyBhID0gYWJzKHAxIC0gcTEpCisgICAgdnFhZGQudTggICAgcTksIHE5LCBxOSAgICAgICAgICAgICAgICAgIDsgYiA9IGFicyhwMCAtIHEwKSAqIDIKKworICAgIHZjZ2UudTggICAgIHExNSwgcTEsIHExNQorCisgICAgOyB2cDhfZmlsdGVyKCkgZnVuY3Rpb24KKyAgICA7IGNvbnZlcnQgdG8gc2lnbmVkCisgICAgdmVvciAgICAgICAgcTcsIHE3LCBxMTAgICAgICAgICAgICAgICAgIDsgcXMwCisgICAgdnNoci51OCAgICAgcTIsIHEyLCAjMSAgICAgICAgICAgICAgICAgIDsgYSA9IGEgLyAyCisgICAgdmVvciAgICAgICAgcTYsIHE2LCBxMTAgICAgICAgICAgICAgICAgIDsgcHMwCisKKyAgICB2ZW9yICAgICAgICBxNSwgcTUsIHExMCAgICAgICAgICAgICAgICAgOyBwczEKKyAgICB2cWFkZC51OCAgICBxOSwgcTksIHEyICAgICAgICAgICAgICAgICAgOyBhID0gYiArIGEKKworICAgIHZlb3IgICAgICAgIHE4LCBxOCwgcTEwICAgICAgICAgICAgICAgICA7IHFzMQorCisgICAgdm1vdi51OCAgICAgcTEwLCAjMyAgICAgICAgICAgICAgICAgICAgIDsgIzMKKworICAgIHZzdWJsLnM4ICAgIHEyLCBkMTQsIGQxMiAgICAgICAgICAgICAgICA7ICggcXMwIC0gcHMwKQorICAgIHZzdWJsLnM4ICAgIHExMSwgZDE1LCBkMTMKKworICAgIHZjZ2UudTggICAgIHE5LCBxMCwgcTkgICAgICAgICAgICAgICAgICA7IChhID4gZmxpbWl0ICogMiArIGxpbWl0KSAqIC0xCisKKyAgICB2bW92bC51OCAgICBxNCwgZDIwCisKKyAgICB2cXN1Yi5zOCAgICBxMSwgcTUsIHE4ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gY2xhbXAocHMxLXFzMSkKKyAgICB2b3JyICAgICAgICBxMTQsIHExMywgcTE0ICAgICAgICAgICAgICAgOyB2cDhfaGV2bWFzaworCisgICAgdm11bC5pMTYgICAgcTIsIHEyLCBxNCAgICAgICAgICAgICAgICAgIDsgMyAqICggcXMwIC0gcHMwKQorICAgIHZtdWwuaTE2ICAgIHExMSwgcTExLCBxNAorCisgICAgdmFuZCAgICAgICAgcTEsIHExLCBxMTQgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBoZXYKKyAgICB2YW5kICAgICAgICBxMTUsIHExNSwgcTkgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyX21hc2sKKworICAgIHZhZGR3LnM4ICAgIHEyLCBxMiwgZDIKKyAgICB2YWRkdy5zOCAgICBxMTEsIHExMSwgZDMKKworICAgIHZtb3YudTggICAgIHE5LCAjNCAgICAgICAgICAgICAgICAgICAgICA7ICM0CisKKyAgICA7IHZwOF9maWx0ZXIgPSBjbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKKyAgICB2cW1vdm4uczE2ICBkMiwgcTIKKyAgICB2cW1vdm4uczE2ICBkMywgcTExCisgICAgdmFuZCAgICAgICAgcTEsIHExLCBxMTUgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrCisKKyAgICB2cWFkZC5zOCAgICBxMiwgcTEsIHExMCAgICAgICAgICAgICAgICAgOyBGaWx0ZXIyID0gY2xhbXAodnA4X2ZpbHRlciszKQorICAgIHZxYWRkLnM4ICAgIHExLCBxMSwgcTkgICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPSBjbGFtcCh2cDhfZmlsdGVyKzQpCisgICAgdnNoci5zOCAgICAgcTIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMworICAgIHZzaHIuczggICAgIHExLCBxMSwgIzMgICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKKworCisgICAgdnFhZGQuczggICAgcTExLCBxNiwgcTIgICAgICAgICAgICAgICAgIDsgdSA9IGNsYW1wKHBzMCArIEZpbHRlcjIpCisgICAgdnFzdWIuczggICAgcTEwLCBxNywgcTEgICAgICAgICAgICAgICAgIDsgdSA9IGNsYW1wKHFzMCAtIEZpbHRlcjEpCisKKyAgICA7IG91dGVyIHRhcCBhZGp1c3RtZW50czogKyt2cDhfZmlsdGVyID4+IDEKKyAgICB2cnNoci5zOCAgICBxMSwgcTEsICMxCisgICAgdmJpYyAgICAgICAgcTEsIHExLCBxMTQgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSB+aGV2CisgICAgdm1vdi51OCAgICAgcTAsICMweDgwICAgICAgICAgICAgICAgICAgIDsgMHg4MAorICAgIHZxYWRkLnM4ICAgIHExMywgcTUsIHExICAgICAgICAgICAgICAgICA7IHUgPSBjbGFtcChwczEgKyB2cDhfZmlsdGVyKQorICAgIHZxc3ViLnM4ICAgIHExMiwgcTgsIHExICAgICAgICAgICAgICAgICA7IHUgPSBjbGFtcChxczEgLSB2cDhfZmlsdGVyKQorCisgICAgdmVvciAgICAgICAgcTYsIHExMSwgcTAgICAgICAgICAgICAgICAgIDsgKm9wMCA9IHVeMHg4MAorICAgIHZlb3IgICAgICAgIHE3LCBxMTAsIHEwICAgICAgICAgICAgICAgICA7ICpvcTAgPSB1XjB4ODAKKyAgICB2ZW9yICAgICAgICBxNSwgcTEzLCBxMCAgICAgICAgICAgICAgICAgOyAqb3AxID0gdV4weDgwCisgICAgdmVvciAgICAgICAgcTgsIHExMiwgcTAgICAgICAgICAgICAgICAgIDsgKm9xMSA9IHVeMHg4MAorCisgICAgYnggICAgICAgICAgbHIKKyAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwKKworOy0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGVob3Jpem9udGFsZWRnZV9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGVob3Jpem9udGFsZWRnZV9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGY4NDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcnNpbXBsZWhvcml6b250YWxlZGdlX25lb24uYXNtCkBAIC0wLDAgKzEsMTE3IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgO0VYUE9SVCAgfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX25lb258CisgICAgRVhQT1JUICB8dnA4X2xvb3BfZmlsdGVyX2Joc19uZW9ufAorICAgIEVYUE9SVCAgfHZwOF9sb29wX2ZpbHRlcl9tYmhzX25lb258CisgICAgQVJNCisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICpzLCBQUkVTRVJWRQorOyByMSAgICBpbnQgcCwgUFJFU0VSVkUKKzsgcTEgICAgbGltaXQsIFBSRVNFUlZFCisKK3x2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9uZW9ufCBQUk9DCisKKyAgICBzdWIgICAgICAgICByMywgcjAsIHIxLCBsc2wgIzEgICAgICAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgMiBsaW5lcworCisgICAgdmxkMS51OCAgICAge3E3fSwgW3IwQDEyOF0sIHIxICAgICAgICAgIDsgcTAKKyAgICB2bGQxLnU4ICAgICB7cTV9LCBbcjNAMTI4XSwgcjEgICAgICAgICAgOyBwMAorICAgIHZsZDEudTggICAgIHtxOH0sIFtyMEAxMjhdICAgICAgICAgICAgICA7IHExCisgICAgdmxkMS51OCAgICAge3E2fSwgW3IzQDEyOF0gICAgICAgICAgICAgIDsgcDEKKworICAgIHZhYmQudTggICAgIHExNSwgcTYsIHE3ICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorICAgIHZhYmQudTggICAgIHExNCwgcTUsIHE4ICAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKQorCisgICAgdnFhZGQudTggICAgcTE1LCBxMTUsIHExNSAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICogMgorICAgIHZzaHIudTggICAgIHExNCwgcTE0LCAjMSAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKSAvIDIKKyAgICB2bW92LnU4ICAgICBxMCwgIzB4ODAgICAgICAgICAgICAgICAgICAgOyAweDgwCisgICAgdm1vdi5zMTYgICAgcTEzLCAjMworICAgIHZxYWRkLnU4ICAgIHExNSwgcTE1LCBxMTQgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyCisKKyAgICB2ZW9yICAgICAgICBxNywgcTcsIHEwICAgICAgICAgICAgICAgICAgOyBxczA6IHEwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisgICAgdmVvciAgICAgICAgcTYsIHE2LCBxMCAgICAgICAgICAgICAgICAgIDsgcHMwOiBwMCBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorICAgIHZlb3IgICAgICAgIHE1LCBxNSwgcTAgICAgICAgICAgICAgICAgICA7IHBzMTogcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKyAgICB2ZW9yICAgICAgICBxOCwgcTgsIHEwICAgICAgICAgICAgICAgICAgOyBxczE6IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisKKyAgICB2Y2dlLnU4ICAgICBxMTUsIHExLCBxMTUgICAgICAgICAgICAgICAgOyAoYWJzKHAwIC0gcTApKjIgKyBhYnMocDEtcTEpLzIgPiBsaW1pdCkqLTEKKworICAgIHZzdWJsLnM4ICAgIHEyLCBkMTQsIGQxMiAgICAgICAgICAgICAgICA7ICggcXMwIC0gcHMwKQorICAgIHZzdWJsLnM4ICAgIHEzLCBkMTUsIGQxMworCisgICAgdnFzdWIuczggICAgcTQsIHE1LCBxOCAgICAgICAgICAgICAgICAgIDsgcTQ6IHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxLXFzMSkKKworICAgIHZtdWwuczE2ICAgIHEyLCBxMiwgcTEzICAgICAgICAgICAgICAgICA7ICAzICogKCBxczAgLSBwczApCisgICAgdm11bC5zMTYgICAgcTMsIHEzLCBxMTMKKworICAgIHZtb3YudTggICAgIHExMCwgIzB4MDMgICAgICAgICAgICAgICAgICA7IDB4MDMKKyAgICB2bW92LnU4ICAgICBxOSwgIzB4MDQgICAgICAgICAgICAgICAgICAgOyAweDA0CisKKyAgICB2YWRkdy5zOCAgICBxMiwgcTIsIGQ4ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKQorICAgIHZhZGR3LnM4ICAgIHEzLCBxMywgZDkKKworICAgIHZxbW92bi5zMTYgIGQ4LCBxMiAgICAgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCisgICAgdnFtb3ZuLnMxNiAgZDksIHEzCisKKyAgICB2YW5kICAgICAgICBxMTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IG1hc2sKKworICAgIHZxYWRkLnM4ICAgIHEyLCBxMTQsIHExMCAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciszKQorICAgIHZxYWRkLnM4ICAgIHEzLCBxMTQsIHE5ICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlcis0KQorICAgIHZzaHIuczggICAgIHEyLCBxMiwgIzMgICAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49IDMKKyAgICB2c2hyLnM4ICAgICBxNCwgcTMsICMzICAgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID4+PSAzCisKKyAgICBzdWIgICAgICAgICByMCwgcjAsIHIxCisKKyAgICA7Y2FsY3VsYXRlIG91dHB1dAorICAgIHZxYWRkLnM4ICAgIHExMSwgcTYsIHEyICAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMikKKyAgICB2cXN1Yi5zOCAgICBxMTAsIHE3LCBxNCAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpCisKKyAgICB2ZW9yICAgICAgICBxNiwgcTExLCBxMCAgICAgICAgICAgICAgICAgOyAqb3AwID0gdV4weDgwCisgICAgdmVvciAgICAgICAgcTcsIHExMCwgcTAgICAgICAgICAgICAgICAgIDsgKm9xMCA9IHVeMHg4MAorCisgICAgdnN0MS51OCAgICAge3E2fSwgW3IzQDEyOF0gICAgICAgICAgICAgIDsgc3RvcmUgb3AwCisgICAgdnN0MS51OCAgICAge3E3fSwgW3IwQDEyOF0gICAgICAgICAgICAgIDsgc3RvcmUgb3EwCisKKyAgICBieCAgICAgICAgICBscgorICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX25lb258CisKKzsgcjAgICAgdW5zaWduZWQgY2hhciAqeQorOyByMSAgICBpbnQgeXN0cmlkZQorOyByMiAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQKKworfHZwOF9sb29wX2ZpbHRlcl9iaHNfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgIHtyNCwgbHJ9CisgICAgbGRyYiAgICAgICAgcjMsIFtyMl0gICAgICAgICAgICAgICAgICAgIDsgbG9hZCBibGltIGZyb20gbWVtCisgICAgdmR1cC5zOCAgICAgcTEsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgZHVwbGljYXRlIGJsaW0KKworICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMiAgICAgICAgICA7IHNyYyA9IHlfcHRyICsgNCAqIHlfc3RyaWRlCisgICAgYmwgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbmVvbgorICAgIDsgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbmVvbiBwcmVzZXJ2ZXMgcjAsIHIxIGFuZCBxMQorICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMiAgICAgICAgICA7IHNyYyA9IHlfcHRyICsgOCogeV9zdHJpZGUKKyAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9uZW9uCisgICAgYWRkICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMyICAgICAgICAgIDsgc3JjID0geV9wdHIgKyAxMiAqIHlfc3RyaWRlCisgICAgcG9wICAgICAgICAge3I0LCBscn0KKyAgICBiICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9uZW9uCisgICAgRU5EUCAgICAgICAgO3x2cDhfbG9vcF9maWx0ZXJfYmhzX25lb258CisKKzsgcjAgICAgdW5zaWduZWQgY2hhciAqeQorOyByMSAgICBpbnQgeXN0cmlkZQorOyByMiAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQKKworfHZwOF9sb29wX2ZpbHRlcl9tYmhzX25lb258IFBST0MKKyAgICBsZHJiICAgICAgICByMywgW3IyXSAgICAgICAgICAgICAgICAgICA7IGxvYWQgYmxpbSBmcm9tIG1lbQorICAgIHZkdXAuczggICAgIHExLCByMyAgICAgICAgICAgICAgICAgICAgIDsgZHVwbGljYXRlIG1ibGltCisgICAgYiAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbmVvbgorICAgIEVORFAgICAgICAgIDt8dnA4X2xvb3BfZmlsdGVyX2Joc19uZW9ufAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyc2ltcGxldmVydGljYWxlZGdlX25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcnNpbXBsZXZlcnRpY2FsZWRnZV9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjkwZGYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcnNpbXBsZXZlcnRpY2FsZWRnZV9uZW9uLmFzbQpAQCAtMCwwICsxLDE1NCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIDtFWFBPUlQgIHx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbmVvbnwKKyAgICBFWFBPUlQgfHZwOF9sb29wX2ZpbHRlcl9idnNfbmVvbnwKKyAgICBFWFBPUlQgfHZwOF9sb29wX2ZpbHRlcl9tYnZzX25lb258CisgICAgQVJNCisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICpzLCBQUkVTRVJWRQorOyByMSAgICBpbnQgcCwgUFJFU0VSVkUKKzsgcTEgICAgbGltaXQsIFBSRVNFUlZFCisKK3x2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbmVvbnwgUFJPQworICAgIHN1YiAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSAyIGNvbHVtbnMKKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByMQorICAgIGFkZCAgICAgICAgIHIzLCByMCwgcjEKKworICAgIHZsZDQuOCAgICAgIHtkNlswXSwgZDdbMF0sIGQ4WzBdLCBkOVswXX0sIFtyMF0sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNlsxXSwgZDdbMV0sIGQ4WzFdLCBkOVsxXX0sIFtyM10sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNlsyXSwgZDdbMl0sIGQ4WzJdLCBkOVsyXX0sIFtyMF0sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNlszXSwgZDdbM10sIGQ4WzNdLCBkOVszXX0sIFtyM10sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNls0XSwgZDdbNF0sIGQ4WzRdLCBkOVs0XX0sIFtyMF0sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNls1XSwgZDdbNV0sIGQ4WzVdLCBkOVs1XX0sIFtyM10sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNls2XSwgZDdbNl0sIGQ4WzZdLCBkOVs2XX0sIFtyMF0sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkNls3XSwgZDdbN10sIGQ4WzddLCBkOVs3XX0sIFtyM10sIHIxMgorCisgICAgdmxkNC44ICAgICAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtyMF0sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkMTBbMV0sIGQxMVsxXSwgZDEyWzFdLCBkMTNbMV19LCBbcjNdLCByMTIKKyAgICB2bGQ0LjggICAgICB7ZDEwWzJdLCBkMTFbMl0sIGQxMlsyXSwgZDEzWzJdfSwgW3IwXSwgcjEyCisgICAgdmxkNC44ICAgICAge2QxMFszXSwgZDExWzNdLCBkMTJbM10sIGQxM1szXX0sIFtyM10sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkMTBbNF0sIGQxMVs0XSwgZDEyWzRdLCBkMTNbNF19LCBbcjBdLCByMTIKKyAgICB2bGQ0LjggICAgICB7ZDEwWzVdLCBkMTFbNV0sIGQxMls1XSwgZDEzWzVdfSwgW3IzXSwgcjEyCisgICAgdmxkNC44ICAgICAge2QxMFs2XSwgZDExWzZdLCBkMTJbNl0sIGQxM1s2XX0sIFtyMF0sIHIxMgorICAgIHZsZDQuOCAgICAgIHtkMTBbN10sIGQxMVs3XSwgZDEyWzddLCBkMTNbN119LCBbcjNdCisKKyAgICB2c3dwICAgICAgICBkNywgZDEwCisgICAgdnN3cCAgICAgICAgZDEyLCBkOQorCisgICAgO3ZwOF9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCisgICAgO3ZwOF9oZXZtYXNrKCkgZnVuY3Rpb24KKyAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzQKKyAgICB2YWJkLnU4ICAgICBxMTUsIHE1LCBxNCAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKKyAgICB2YWJkLnU4ICAgICBxMTQsIHEzLCBxNiAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBxMSkKKworICAgIHZxYWRkLnU4ICAgIHExNSwgcTE1LCBxMTUgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIKKyAgICB2c2hyLnU4ICAgICBxMTQsIHExNCwgIzEgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBxMSkgLyAyCisgICAgdm1vdi51OCAgICAgcTAsICMweDgwICAgICAgICAgICAgICAgICAgIDsgMHg4MAorICAgIHZtb3YuczE2ICAgIHExMSwgIzMKKyAgICB2cWFkZC51OCAgICBxMTUsIHExNSwgcTE0ICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkgKiAyICsgYWJzKHAxIC0gcTEpIC8gMgorCisgICAgdmVvciAgICAgICAgcTQsIHE0LCBxMCAgICAgICAgICAgICAgICAgIDsgcXMwOiBxMCBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorICAgIHZlb3IgICAgICAgIHE1LCBxNSwgcTAgICAgICAgICAgICAgICAgICA7IHBzMDogcDAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKKyAgICB2ZW9yICAgICAgICBxMywgcTMsIHEwICAgICAgICAgICAgICAgICAgOyBwczE6IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCisgICAgdmVvciAgICAgICAgcTYsIHE2LCBxMCAgICAgICAgICAgICAgICAgIDsgcXMxOiBxMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQorCisgICAgdmNnZS51OCAgICAgcTE1LCBxMSwgcTE1ICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApKjIgKyBhYnMocDEtcTEpLzIgPiBmbGltaXQqMiArIGxpbWl0KSotMQorCisgICAgdnN1YmwuczggICAgcTIsIGQ4LCBkMTAgICAgICAgICAgICAgICAgIDsgKCBxczAgLSBwczApCisgICAgdnN1YmwuczggICAgcTEzLCBkOSwgZDExCisKKyAgICB2cXN1Yi5zOCAgICBxMTQsIHEzLCBxNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEtcXMxKQorCisgICAgdm11bC5zMTYgICAgcTIsIHEyLCBxMTEgICAgICAgICAgICAgICAgIDsgIDMgKiAoIHFzMCAtIHBzMCkKKyAgICB2bXVsLnMxNiAgICBxMTMsIHExMywgcTExCisKKyAgICB2bW92LnU4ICAgICBxMTEsICMweDAzICAgICAgICAgICAgICAgICAgOyAweDAzCisgICAgdm1vdi51OCAgICAgcTEyLCAjMHgwNCAgICAgICAgICAgICAgICAgIDsgMHgwNAorCisgICAgdmFkZHcuczggICAgcTIsIHEyLCBkMjggICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgKyAzICogKCBxczAgLSBwczApCisgICAgdmFkZHcuczggICAgcTEzLCBxMTMsIGQyOQorCisgICAgdnFtb3ZuLnMxNiAgZDI4LCBxMiAgICAgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCisgICAgdnFtb3ZuLnMxNiAgZDI5LCBxMTMKKworICAgIGFkZCAgICAgICAgIHIwLCByMCwgIzEKKyAgICBhZGQgICAgICAgICByMywgcjAsIHIxCisKKyAgICB2YW5kICAgICAgICBxMTQsIHExNCwgcTE1ICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzaworCisgICAgdnFhZGQuczggICAgcTIsIHExNCwgcTExICAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciszKQorICAgIHZxYWRkLnM4ICAgIHEzLCBxMTQsIHExMiAgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrNCkKKyAgICB2c2hyLnM4ICAgICBxMiwgcTIsICMzICAgICAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCisgICAgdnNoci5zOCAgICAgcTE0LCBxMywgIzMgICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKKworICAgIDtjYWxjdWxhdGUgb3V0cHV0CisgICAgdnFhZGQuczggICAgcTExLCBxNSwgcTIgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKQorICAgIHZxc3ViLnM4ICAgIHExMCwgcTQsIHExNCAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpCisKKyAgICB2ZW9yICAgICAgICBxNiwgcTExLCBxMCAgICAgICAgICAgICAgICAgOyAqb3AwID0gdV4weDgwCisgICAgdmVvciAgICAgICAgcTcsIHExMCwgcTAgICAgICAgICAgICAgICAgIDsgKm9xMCA9IHVeMHg4MAorICAgIGFkZCAgICAgICAgIHIxMiwgcjEsIHIxCisgICAgdnN3cCAgICAgICAgZDEzLCBkMTQKKworICAgIDtzdG9yZSBvcDEsIG9wMCwgb3EwLCBvcTEKKyAgICB2c3QyLjggICAgICB7ZDEyWzBdLCBkMTNbMF19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzFdLCBkMTNbMV19LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzJdLCBkMTNbMl19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzNdLCBkMTNbM119LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzRdLCBkMTNbNF19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzVdLCBkMTNbNV19LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzZdLCBkMTNbNl19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDEyWzddLCBkMTNbN119LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzBdLCBkMTVbMF19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzFdLCBkMTVbMV19LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzJdLCBkMTVbMl19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzNdLCBkMTVbM119LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzRdLCBkMTVbNF19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzVdLCBkMTVbNV19LCBbcjNdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzZdLCBkMTVbNl19LCBbcjBdLCByMTIKKyAgICB2c3QyLjggICAgICB7ZDE0WzddLCBkMTVbN119LCBbcjNdCisKKyAgICBieCAgICAgICAgICBscgorICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9uZW9ufAorCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnkKKzsgcjEgICAgaW50IHlzdHJpZGUKKzsgcjIgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0CisKK3x2cDhfbG9vcF9maWx0ZXJfYnZzX25lb258IFBST0MKKyAgICBwdXNoICAgICAgICB7cjQsIGxyfQorICAgIGxkcmIgICAgICAgIHIzLCBbcjJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBibGltIGZyb20gbWVtCisgICAgbW92ICAgICAgICAgcjQsIHIwCisgICAgYWRkICAgICAgICAgcjAsIHIwLCAjNAorICAgIHZkdXAuczggICAgIHExLCByMyAgICAgICAgICAgICAgICAgICAgIDsgZHVwbGljYXRlIGJsaW0KKyAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbmVvbgorICAgIDsgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb24gcHJlc2VydmVzICByMSBhbmQgcTEKKyAgICBhZGQgICAgICAgICByMCwgcjQsICM4CisgICAgYmwgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb24KKyAgICBhZGQgICAgICAgICByMCwgcjQsICMxMgorICAgIHBvcCAgICAgICAgIHtyNCwgbHJ9CisgICAgYiAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb24KKyAgICBFTkRQICAgICAgICA7fHZwOF9sb29wX2ZpbHRlcl9idnNfbmVvbnwKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICp5Cis7IHIxICAgIGludCB5c3RyaWRlCis7IHIyICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdAorCit8dnA4X2xvb3BfZmlsdGVyX21idnNfbmVvbnwgUFJPQworICAgIGxkcmIgICAgICAgIHIzLCBbcjJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBtYmxpbSBmcm9tIG1lbQorICAgIHZkdXAuczggICAgIHExLCByMyAgICAgICAgICAgICAgICAgICAgIDsgZHVwbGljYXRlIG1ibGltCisgICAgYiAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb24KKyAgICBFTkRQICAgICAgICA7fHZwOF9sb29wX2ZpbHRlcl9idnNfbmVvbnwKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL21ibG9vcGZpbHRlcl9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL21ibG9vcGZpbHRlcl9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDFjMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vbWJsb29wZmlsdGVyX25lb24uYXNtCkBAIC0wLDAgKzEsNDY5IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb258CisgICAgQVJNCisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyB2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW1pdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRocmVzaCkKKzsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjLAorOyByMSAgICBpbnQgcGl0Y2gsCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgYmxpbWl0Cis7IHIzICAgIHVuc2lnbmVkIGNoYXIgbGltaXQKKzsgc3AgICAgdW5zaWduZWQgY2hhciB0aHJlc2gsCit8dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgIHtscn0KKyAgICBhZGQgICAgICAgICByMSwgcjEsIHIxICAgICAgICAgICAgICAgICAgOyBkb3VibGUgc3RyaWRlCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2gKKyAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEgICAgICAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBsaW5lcworICAgIHZkdXAudTggICAgIHEyLCByMTIgICAgICAgICAgICAgICAgICAgICA7IHRocmVzaAorICAgIGFkZCAgICAgICAgIHIxMiwgcjAsIHIxLCAgbHNyICMxICAgICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgdXAgYnkgMSBsaW5lCisKKyAgICB2bGQxLnU4ICAgICB7cTN9LCBbcjBAMTI4XSwgcjEgICAgICAgICAgICAgIDsgcDMKKyAgICB2bGQxLnU4ICAgICB7cTR9LCBbcjEyQDEyOF0sIHIxICAgICAgICAgICAgIDsgcDIKKyAgICB2bGQxLnU4ICAgICB7cTV9LCBbcjBAMTI4XSwgcjEgICAgICAgICAgICAgIDsgcDEKKyAgICB2bGQxLnU4ICAgICB7cTZ9LCBbcjEyQDEyOF0sIHIxICAgICAgICAgICAgIDsgcDAKKyAgICB2bGQxLnU4ICAgICB7cTd9LCBbcjBAMTI4XSwgcjEgICAgICAgICAgICAgIDsgcTAKKyAgICB2bGQxLnU4ICAgICB7cTh9LCBbcjEyQDEyOF0sIHIxICAgICAgICAgICAgIDsgcTEKKyAgICB2bGQxLnU4ICAgICB7cTl9LCBbcjBAMTI4XSwgcjEgICAgICAgICAgICAgIDsgcTIKKyAgICB2bGQxLnU4ICAgICB7cTEwfSwgW3IxMkAxMjhdLCByMSAgICAgICAgICAgIDsgcTMKKworICAgIGJsICAgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX25lb24KKworICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMyCisgICAgYWRkICAgICAgICAgcjAsIHIxMiwgcjEsIGxzciAjMQorCisgICAgdnN0MS51OCAgICAge3E0fSwgW3IxMkAxMjhdLHIxICAgICAgICAgOyBzdG9yZSBvcDIKKyAgICB2c3QxLnU4ICAgICB7cTV9LCBbcjBAMTI4XSxyMSAgICAgICAgICA7IHN0b3JlIG9wMQorICAgIHZzdDEudTggICAgIHtxNn0sIFtyMTJAMTI4XSwgcjEgICAgICAgIDsgc3RvcmUgb3AwCisgICAgdnN0MS51OCAgICAge3E3fSwgW3IwQDEyOF0scjEgICAgICAgICAgOyBzdG9yZSBvcTAKKyAgICB2c3QxLnU4ICAgICB7cTh9LCBbcjEyQDEyOF0gICAgICAgICAgICA7IHN0b3JlIG9xMQorICAgIHZzdDEudTggICAgIHtxOX0sIFtyMEAxMjhdICAgICAgICAgICAgIDsgc3RvcmUgb3EyCisKKyAgICBwb3AgICAgICAgICB7cGN9CisgICAgRU5EUCAgICAgICAgOyB8dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwKKworOyB2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9uZW9uKHVuc2lnbmVkIGNoYXIgKnUsIGludCBwaXRjaCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGhyZXNoLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnYpCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnUsCis7IHIxICAgIGludCBwaXRjaCwKKzsgcjIgICAgdW5zaWduZWQgY2hhciBibGltaXQKKzsgcjMgICAgdW5zaWduZWQgY2hhciBsaW1pdAorOyBzcCAgICB1bnNpZ25lZCBjaGFyIHRocmVzaCwKKzsgc3ArNCAgdW5zaWduZWQgY2hhciAqdgorCit8dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICB7bHJ9CisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaAorICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMiAgICAgICAgICAgIDsgbW92ZSB1IHBvaW50ZXIgZG93biBieSA0IGxpbmVzCisgICAgdmR1cC51OCAgICAgcTIsIHIxMiAgICAgICAgICAgICAgICAgICAgICAgOyB0aHJlc2gKKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICAgICAgICA7IGxvYWQgdiBwdHIKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMiAgICAgICAgICA7IG1vdmUgdiBwb2ludGVyIGRvd24gYnkgNCBsaW5lcworCisgICAgdmxkMS51OCAgICAge2Q2fSwgW3IwQDY0XSwgcjEgICAgICAgICAgICAgIDsgcDMKKyAgICB2bGQxLnU4ICAgICB7ZDd9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICAgIDsgcDMKKyAgICB2bGQxLnU4ICAgICB7ZDh9LCBbcjBANjRdLCByMSAgICAgICAgICAgICAgOyBwMgorICAgIHZsZDEudTggICAgIHtkOX0sIFtyMTJANjRdLCByMSAgICAgICAgICAgICAgOyBwMgorICAgIHZsZDEudTggICAgIHtkMTB9LCBbcjBANjRdLCByMSAgICAgICAgICAgICA7IHAxCisgICAgdmxkMS51OCAgICAge2QxMX0sIFtyMTJANjRdLCByMSAgICAgICAgICAgICA7IHAxCisgICAgdmxkMS51OCAgICAge2QxMn0sIFtyMEA2NF0sIHIxICAgICAgICAgICAgIDsgcDAKKyAgICB2bGQxLnU4ICAgICB7ZDEzfSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgIDsgcDAKKyAgICB2bGQxLnU4ICAgICB7ZDE0fSwgW3IwQDY0XSwgcjEgICAgICAgICAgICAgOyBxMAorICAgIHZsZDEudTggICAgIHtkMTV9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICAgOyBxMAorICAgIHZsZDEudTggICAgIHtkMTZ9LCBbcjBANjRdLCByMSAgICAgICAgICAgICA7IHExCisgICAgdmxkMS51OCAgICAge2QxN30sIFtyMTJANjRdLCByMSAgICAgICAgICAgICA7IHExCisgICAgdmxkMS51OCAgICAge2QxOH0sIFtyMEA2NF0sIHIxICAgICAgICAgICAgIDsgcTIKKyAgICB2bGQxLnU4ICAgICB7ZDE5fSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgIDsgcTIKKyAgICB2bGQxLnU4ICAgICB7ZDIwfSwgW3IwQDY0XSwgcjEgICAgICAgICAgICAgOyBxMworICAgIHZsZDEudTggICAgIHtkMjF9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICAgOyBxMworCisgICAgYmwgICAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfbmVvbgorCisgICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMzCisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzMKKworICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEKKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgcjEKKworICAgIHZzdDEudTggICAgIHtkOH0sIFtyMEA2NF0sIHIxICAgICAgICAgICAgICA7IHN0b3JlIHUgb3AyCisgICAgdnN0MS51OCAgICAge2Q5fSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgICA7IHN0b3JlIHYgb3AyCisgICAgdnN0MS51OCAgICAge2QxMH0sIFtyMEA2NF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdSBvcDEKKyAgICB2c3QxLnU4ICAgICB7ZDExfSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdiBvcDEKKyAgICB2c3QxLnU4ICAgICB7ZDEyfSwgW3IwQDY0XSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB1IG9wMAorICAgIHZzdDEudTggICAgIHtkMTN9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB2IG9wMAorICAgIHZzdDEudTggICAgIHtkMTR9LCBbcjBANjRdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHUgb3EwCisgICAgdnN0MS51OCAgICAge2QxNX0sIFtyMTJANjRdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHYgb3EwCisgICAgdnN0MS51OCAgICAge2QxNn0sIFtyMEA2NF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdSBvcTEKKyAgICB2c3QxLnU4ICAgICB7ZDE3fSwgW3IxMkA2NF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdiBvcTEKKyAgICB2c3QxLnU4ICAgICB7ZDE4fSwgW3IwQDY0XSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB1IG9xMgorICAgIHZzdDEudTggICAgIHtkMTl9LCBbcjEyQDY0XSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB2IG9xMgorCisgICAgcG9wICAgICAgICAge3BjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9uZW9ufAorCis7IHZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbWl0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRocmVzaCkKKzsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjLAorOyByMSAgICBpbnQgcGl0Y2gsCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgYmxpbWl0Cis7IHIzICAgIHVuc2lnbmVkIGNoYXIgbGltaXQKKzsgc3AgICAgdW5zaWduZWQgY2hhciB0aHJlc2gsCit8dnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICB7bHJ9CisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2gKKyAgICBzdWIgICAgICAgICByMCwgcjAsICM0ICAgICAgICAgICAgICAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBjb2x1bW5zCisgICAgdmR1cC5zOCAgICAgcTIsIHIxMiAgICAgICAgICAgICAgICAgICAgIDsgdGhyZXNoCisgICAgYWRkICAgICAgICAgcjEyLCByMCwgcjEsIGxzbCAjMyAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDggbGluZXMKKworICAgIHZsZDEudTggICAgIHtkNn0sIFtyMF0sIHIxICAgICAgICAgICAgICA7IGxvYWQgZmlyc3QgOC1saW5lIHNyYyBkYXRhCisgICAgdmxkMS51OCAgICAge2Q3fSwgW3IxMl0sIHIxICAgICAgICAgICAgIDsgbG9hZCBzZWNvbmQgOC1saW5lIHNyYyBkYXRhCisgICAgdmxkMS51OCAgICAge2Q4fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDl9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDEwfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDExfSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxMn0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAge2QxM30sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTR9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgIHtkMTV9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE2fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE3fSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxOH0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAge2QxOX0sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMjB9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgIHtkMjF9LCBbcjEyXSwgcjEKKworICAgIDt0cmFuc3Bvc2UgdG8gOHgxNiBtYXRyaXgKKyAgICB2dHJuLjMyICAgICBxMywgcTcKKyAgICB2dHJuLjMyICAgICBxNCwgcTgKKyAgICB2dHJuLjMyICAgICBxNSwgcTkKKyAgICB2dHJuLjMyICAgICBxNiwgcTEwCisKKyAgICB2dHJuLjE2ICAgICBxMywgcTUKKyAgICB2dHJuLjE2ICAgICBxNCwgcTYKKyAgICB2dHJuLjE2ICAgICBxNywgcTkKKyAgICB2dHJuLjE2ICAgICBxOCwgcTEwCisKKyAgICB2dHJuLjggICAgICBxMywgcTQKKyAgICB2dHJuLjggICAgICBxNSwgcTYKKyAgICB2dHJuLjggICAgICBxNywgcTgKKyAgICB2dHJuLjggICAgICBxOSwgcTEwCisKKyAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzMKKworICAgIGJsICAgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX25lb24KKworICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMzCisKKyAgICA7dHJhbnNwb3NlIHRvIDE2eDggbWF0cml4CisgICAgdnRybi4zMiAgICAgcTMsIHE3CisgICAgdnRybi4zMiAgICAgcTQsIHE4CisgICAgdnRybi4zMiAgICAgcTUsIHE5CisgICAgdnRybi4zMiAgICAgcTYsIHExMAorCisgICAgdnRybi4xNiAgICAgcTMsIHE1CisgICAgdnRybi4xNiAgICAgcTQsIHE2CisgICAgdnRybi4xNiAgICAgcTcsIHE5CisgICAgdnRybi4xNiAgICAgcTgsIHExMAorCisgICAgdnRybi44ICAgICAgcTMsIHE0CisgICAgdnRybi44ICAgICAgcTUsIHE2CisgICAgdnRybi44ICAgICAgcTcsIHE4CisgICAgdnRybi44ICAgICAgcTksIHExMAorCisgICAgO3N0b3JlIG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTIKKyAgICB2c3QxLjggICAgICB7ZDZ9LCBbcjBdLCByMQorICAgIHZzdDEuOCAgICAgIHtkN30sIFtyMTJdLCByMQorICAgIHZzdDEuOCAgICAgIHtkOH0sIFtyMF0sIHIxCisgICAgdnN0MS44ICAgICAge2Q5fSwgW3IxMl0sIHIxCisgICAgdnN0MS44ICAgICAge2QxMH0sIFtyMF0sIHIxCisgICAgdnN0MS44ICAgICAge2QxMX0sIFtyMTJdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTJ9LCBbcjBdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTN9LCBbcjEyXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDE0fSwgW3IwXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDE1fSwgW3IxMl0sIHIxCisgICAgdnN0MS44ICAgICAge2QxNn0sIFtyMF0sIHIxCisgICAgdnN0MS44ICAgICAge2QxN30sIFtyMTJdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTh9LCBbcjBdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTl9LCBbcjEyXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDIwfSwgW3IwXQorICAgIHZzdDEuOCAgICAgIHtkMjF9LCBbcjEyXQorCisgICAgcG9wICAgICAgICAge3BjfQorICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9ufAorCis7IHZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9uKHVuc2lnbmVkIGNoYXIgKnUsIGludCBwaXRjaCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW1pdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGhyZXNoLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2KQorOyByMCAgICB1bnNpZ25lZCBjaGFyICp1LAorOyByMSAgICBpbnQgcGl0Y2gsCis7IHIyICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCis7IHIzICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKKzsgc3AgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKKzsgc3ArNCAgdW5zaWduZWQgY2hhciAqdgorfHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgIHtscn0KKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaAorICAgIHN1YiAgICAgICAgIHIwLCByMCwgIzQgICAgICAgICAgICAgICAgICA7IG1vdmUgdSBwb2ludGVyIGRvd24gYnkgNCBjb2x1bW5zCisgICAgdmR1cC51OCAgICAgcTIsIHIxMiAgICAgICAgICAgICAgICAgICAgIDsgdGhyZXNoCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgICAgIDsgbG9hZCB2IHB0cgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCAjNCAgICAgICAgICAgICAgICA7IG1vdmUgdiBwb2ludGVyIGRvd24gYnkgNCBjb2x1bW5zCisKKyAgICB2bGQxLnU4ICAgICB7ZDZ9LCBbcjBdLCByMSAgICAgICAgICAgICAgO2xvYWQgdSBkYXRhCisgICAgdmxkMS51OCAgICAge2Q3fSwgW3IxMl0sIHIxICAgICAgICAgICAgIDtsb2FkIHYgZGF0YQorICAgIHZsZDEudTggICAgIHtkOH0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAge2Q5fSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxMH0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAge2QxMX0sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTJ9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgIHtkMTN9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE0fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDE1fSwgW3IxMl0sIHIxCisgICAgdmxkMS51OCAgICAge2QxNn0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAge2QxN30sIFtyMTJdLCByMQorICAgIHZsZDEudTggICAgIHtkMTh9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgIHtkMTl9LCBbcjEyXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDIwfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICB7ZDIxfSwgW3IxMl0sIHIxCisKKyAgICA7dHJhbnNwb3NlIHRvIDh4MTYgbWF0cml4CisgICAgdnRybi4zMiAgICAgcTMsIHE3CisgICAgdnRybi4zMiAgICAgcTQsIHE4CisgICAgdnRybi4zMiAgICAgcTUsIHE5CisgICAgdnRybi4zMiAgICAgcTYsIHExMAorCisgICAgdnRybi4xNiAgICAgcTMsIHE1CisgICAgdnRybi4xNiAgICAgcTQsIHE2CisgICAgdnRybi4xNiAgICAgcTcsIHE5CisgICAgdnRybi4xNiAgICAgcTgsIHExMAorCisgICAgdnRybi44ICAgICAgcTMsIHE0CisgICAgdnRybi44ICAgICAgcTUsIHE2CisgICAgdnRybi44ICAgICAgcTcsIHE4CisgICAgdnRybi44ICAgICAgcTksIHExMAorCisgICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMzCisKKyAgICBibCAgICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9uZW9uCisKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMworCisgICAgO3RyYW5zcG9zZSB0byAxNng4IG1hdHJpeAorICAgIHZ0cm4uMzIgICAgIHEzLCBxNworICAgIHZ0cm4uMzIgICAgIHE0LCBxOAorICAgIHZ0cm4uMzIgICAgIHE1LCBxOQorICAgIHZ0cm4uMzIgICAgIHE2LCBxMTAKKworICAgIHZ0cm4uMTYgICAgIHEzLCBxNQorICAgIHZ0cm4uMTYgICAgIHE0LCBxNgorICAgIHZ0cm4uMTYgICAgIHE3LCBxOQorICAgIHZ0cm4uMTYgICAgIHE4LCBxMTAKKworICAgIHZ0cm4uOCAgICAgIHEzLCBxNAorICAgIHZ0cm4uOCAgICAgIHE1LCBxNgorICAgIHZ0cm4uOCAgICAgIHE3LCBxOAorICAgIHZ0cm4uOCAgICAgIHE5LCBxMTAKKworICAgIDtzdG9yZSBvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyCisgICAgdnN0MS44ICAgICAge2Q2fSwgW3IwXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDd9LCBbcjEyXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDh9LCBbcjBdLCByMQorICAgIHZzdDEuOCAgICAgIHtkOX0sIFtyMTJdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTB9LCBbcjBdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTF9LCBbcjEyXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDEyfSwgW3IwXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDEzfSwgW3IxMl0sIHIxCisgICAgdnN0MS44ICAgICAge2QxNH0sIFtyMF0sIHIxCisgICAgdnN0MS44ICAgICAge2QxNX0sIFtyMTJdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTZ9LCBbcjBdLCByMQorICAgIHZzdDEuOCAgICAgIHtkMTd9LCBbcjEyXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDE4fSwgW3IwXSwgcjEKKyAgICB2c3QxLjggICAgICB7ZDE5fSwgW3IxMl0sIHIxCisgICAgdnN0MS44ICAgICAge2QyMH0sIFtyMF0KKyAgICB2c3QxLjggICAgICB7ZDIxfSwgW3IxMl0KKworICAgIHBvcCAgICAgICAgIHtwY30KKyAgICBFTkRQICAgICAgICA7IHx2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb258CisKKzsgdm9pZCB2cDhfbWJsb29wX2ZpbHRlcl9uZW9uKCkKKzsgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIG1hY3JvYmxvY2sgbG9vcGZpbHRlcnMuIFRoZSBpbmRpdmlkdWFsCis7IGZ1bmN0aW9ucyBkbyB0aGUgbmVjZXNzYXJ5IGxvYWQsIHRyYW5zcG9zZSAoaWYgbmVjZXNzYXJ5KSwgcHJlc2VydmUgKGlmCis7IG5lY2Vzc2FyeSkgYW5kIHN0b3JlLgorCis7IHIwLHIxIFBSRVNFUlZFCis7IHIyICAgIG1ibGltaXQKKzsgcjMgICAgbGltaXQKKworOyBxMiAgICB0aHJlc2gKKzsgcTMgICAgcDMgUFJFU0VSVkUKKzsgcTQgICAgcDIKKzsgcTUgICAgcDEKKzsgcTYgICAgcDAKKzsgcTcgICAgcTAKKzsgcTggICAgcTEKKzsgcTkgICAgcTIKKzsgcTEwICAgcTMgUFJFU0VSVkUKKworfHZwOF9tYmxvb3BfZmlsdGVyX25lb258IFBST0MKKworICAgIDsgdnA4X2ZpbHRlcl9tYXNrCisgICAgdmFiZC51OCAgICAgcTExLCBxMywgcTQgICAgICAgICAgICAgICAgIDsgYWJzKHAzIC0gcDIpCisgICAgdmFiZC51OCAgICAgcTEyLCBxNCwgcTUgICAgICAgICAgICAgICAgIDsgYWJzKHAyIC0gcDEpCisgICAgdmFiZC51OCAgICAgcTEzLCBxNSwgcTYgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApCisgICAgdmFiZC51OCAgICAgcTE0LCBxOCwgcTcgICAgICAgICAgICAgICAgIDsgYWJzKHExIC0gcTApCisgICAgdmFiZC51OCAgICAgcTEsIHE5LCBxOCAgICAgICAgICAgICAgICAgIDsgYWJzKHEyIC0gcTEpCisgICAgdmFiZC51OCAgICAgcTAsIHExMCwgcTkgICAgICAgICAgICAgICAgIDsgYWJzKHEzIC0gcTIpCisKKyAgICB2bWF4LnU4ICAgICBxMTEsIHExMSwgcTEyCisgICAgdm1heC51OCAgICAgcTEyLCBxMTMsIHExNAorICAgIHZtYXgudTggICAgIHExLCBxMSwgcTAKKyAgICB2bWF4LnU4ICAgICBxMTUsIHExMSwgcTEyCisKKyAgICB2YWJkLnU4ICAgICBxMTIsIHE2LCBxNyAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKKworICAgIDsgdnA4X2hldm1hc2sKKyAgICB2Y2d0LnU4ICAgICBxMTMsIHExMywgcTIgICAgICAgICAgICAgICAgOyAoYWJzKHAxIC0gcDApID4gdGhyZXNoKSAqIC0xCisgICAgdmNndC51OCAgICAgcTE0LCBxMTQsIHEyICAgICAgICAgICAgICAgIDsgKGFicyhxMSAtIHEwKSA+IHRocmVzaCkgKiAtMQorICAgIHZtYXgudTggICAgIHExNSwgcTE1LCBxMQorCisgICAgdmR1cC51OCAgICAgcTEsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgbGltaXQKKyAgICB2ZHVwLnU4ICAgICBxMiwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBtYmxpbWl0CisKKyAgICB2bW92LnU4ICAgICBxMCwgIzB4ODAgICAgICAgICAgICAgICAgICAgOyAweDgwCisKKyAgICB2Y2dlLnU4ICAgICBxMTUsIHExLCBxMTUKKworICAgIHZhYmQudTggICAgIHExLCBxNSwgcTggICAgICAgICAgICAgICAgICA7IGEgPSBhYnMocDEgLSBxMSkKKyAgICB2cWFkZC51OCAgICBxMTIsIHExMiwgcTEyICAgICAgICAgICAgICAgOyBiID0gYWJzKHAwIC0gcTApICogMgorICAgIHZtb3YudTE2ICAgIHExMSwgIzMgICAgICAgICAgICAgICAgICAgICA7ICMzCisKKyAgICA7IHZwOF9maWx0ZXIKKyAgICA7IGNvbnZlcnQgdG8gc2lnbmVkCisgICAgdmVvciAgICAgICAgcTcsIHE3LCBxMCAgICAgICAgICAgICAgICAgIDsgcXMwCisgICAgdnNoci51OCAgICAgcTEsIHExLCAjMSAgICAgICAgICAgICAgICAgIDsgYSA9IGEgLyAyCisgICAgdmVvciAgICAgICAgcTYsIHE2LCBxMCAgICAgICAgICAgICAgICAgIDsgcHMwCisgICAgdmVvciAgICAgICAgcTUsIHE1LCBxMCAgICAgICAgICAgICAgICAgIDsgcHMxCisKKyAgICB2cWFkZC51OCAgICBxMTIsIHExMiwgcTEgICAgICAgICAgICAgICAgOyBhID0gYiArIGEKKworICAgIHZlb3IgICAgICAgIHE4LCBxOCwgcTAgICAgICAgICAgICAgICAgICA7IHFzMQorICAgIHZlb3IgICAgICAgIHE0LCBxNCwgcTAgICAgICAgICAgICAgICAgICA7IHBzMgorICAgIHZlb3IgICAgICAgIHE5LCBxOSwgcTAgICAgICAgICAgICAgICAgICA7IHFzMgorCisgICAgdm9yciAgICAgICAgcTE0LCBxMTMsIHExNCAgICAgICAgICAgICAgIDsgdnA4X2hldm1hc2sKKworICAgIHZjZ2UudTggICAgIHExMiwgcTIsIHExMiAgICAgICAgICAgICAgICA7IChhID4gZmxpbWl0ICogMiArIGxpbWl0KSAqIC0xCisKKyAgICB2c3VibC5zOCAgICBxMiwgZDE0LCBkMTIgICAgICAgICAgICAgICAgOyBxczAgLSBwczAKKyAgICB2c3VibC5zOCAgICBxMTMsIGQxNSwgZDEzCisKKyAgICB2cXN1Yi5zOCAgICBxMSwgcTUsIHE4ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gY2xhbXAocHMxLXFzMSkKKworICAgIHZtdWwuaTE2ICAgIHEyLCBxMiwgcTExICAgICAgICAgICAgICAgICA7IDMgKiAoIHFzMCAtIHBzMCkKKworICAgIHZhbmQgICAgICAgIHExNSwgcTE1LCBxMTIgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXJfbWFzaworCisgICAgdm11bC5pMTYgICAgcTEzLCBxMTMsIHExMQorCisgICAgdm1vdi51OCAgICAgcTEyLCAjMyAgICAgICAgICAgICAgICAgICAgIDsgIzMKKworICAgIHZhZGR3LnM4ICAgIHEyLCBxMiwgZDIgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgKyAzICogKCBxczAgLSBwczApCisgICAgdmFkZHcuczggICAgcTEzLCBxMTMsIGQzCisKKyAgICB2bW92LnU4ICAgICBxMTEsICM0ICAgICAgICAgICAgICAgICAgICAgOyAjNAorCisgICAgOyB2cDhfZmlsdGVyID0gY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCisgICAgdnFtb3ZuLnMxNiAgZDIsIHEyCisgICAgdnFtb3ZuLnMxNiAgZDMsIHExMworCisgICAgdmFuZCAgICAgICAgcTEsIHExLCBxMTUgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrCisKKyAgICB2bW92LnUxNiAgICBxMTUsICM2MyAgICAgICAgICAgICAgICAgICAgOyAjNjMKKworICAgIHZhbmQgICAgICAgIHExMywgcTEsIHExNCAgICAgICAgICAgICAgICA7IEZpbHRlcjIgJj0gaGV2CisKKyAgICB2cWFkZC5zOCAgICBxMiwgcTEzLCBxMTEgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID0gY2xhbXAoRmlsdGVyMis0KQorICAgIHZxYWRkLnM4ICAgIHExMywgcTEzLCBxMTIgICAgICAgICAgICAgICA7IEZpbHRlcjIgPSBjbGFtcChGaWx0ZXIyKzMpCisKKyAgICB2bW92ICAgICAgICBxMCwgcTE1CisKKyAgICB2c2hyLnM4ICAgICBxMiwgcTIsICMzICAgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID4+PSAzCisgICAgdnNoci5zOCAgICAgcTEzLCBxMTMsICMzICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMworCisgICAgdm1vdiAgICAgICAgcTExLCBxMTUKKyAgICB2bW92ICAgICAgICBxMTIsIHExNQorCisgICAgdnFzdWIuczggICAgcTcsIHE3LCBxMiAgICAgICAgICAgICAgICAgIDsgcXMwID0gY2xhbXAocXMwIC0gRmlsdGVyMSkKKworICAgIHZxYWRkLnM4ICAgIHE2LCBxNiwgcTEzICAgICAgICAgICAgICAgICA7IHBzMCA9IGNsYW1wKHBzMCArIEZpbHRlcjIpCisKKyAgICB2YmljICAgICAgICBxMSwgcTEsIHExNCAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IH5oZXYKKworICAgIDsgcm91Z2hseSAxLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgIDsgcm91Z2hseSAyLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgIDsgcm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorCisgICAgdm1vdi51OCAgICAgZDUsICM5ICAgICAgICAgICAgICAgICAgICAgIDsgIzkKKyAgICB2bW92LnU4ICAgICBkNCwgIzE4ICAgICAgICAgICAgICAgICAgICAgOyAjMTgKKworICAgIHZtb3YgICAgICAgIHExMywgcTE1CisgICAgdm1vdiAgICAgICAgcTE0LCBxMTUKKworICAgIHZtbGFsLnM4ICAgIHEwLCBkMiwgZDUgICAgICAgICAgICAgICAgICA7IDYzICsgRmlsdGVyMiAqIDkKKyAgICB2bWxhbC5zOCAgICBxMTEsIGQzLCBkNQorICAgIHZtb3YudTggICAgIGQ1LCAjMjcgICAgICAgICAgICAgICAgICAgICA7ICMyNworICAgIHZtbGFsLnM4ICAgIHExMiwgZDIsIGQ0ICAgICAgICAgICAgICAgICA7IDYzICsgRmlsdGVyMiAqIDE4CisgICAgdm1sYWwuczggICAgcTEzLCBkMywgZDQKKyAgICB2bWxhbC5zOCAgICBxMTQsIGQyLCBkNSAgICAgICAgICAgICAgICAgOyA2MyArIEZpbHRlcjIgKiAyNworICAgIHZtbGFsLnM4ICAgIHExNSwgZDMsIGQ1CisKKyAgICB2cXNocm4uczE2ICBkMCwgcTAsICM3ICAgICAgICAgICAgICAgICAgOyB1ID0gY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpPj43KQorICAgIHZxc2hybi5zMTYgIGQxLCBxMTEsICM3CisgICAgdnFzaHJuLnMxNiAgZDI0LCBxMTIsICM3ICAgICAgICAgICAgICAgIDsgdSA9IGNsYW1wKCg2MyArIEZpbHRlcjIgKiAxOCk+PjcpCisgICAgdnFzaHJuLnMxNiAgZDI1LCBxMTMsICM3CisgICAgdnFzaHJuLnMxNiAgZDI4LCBxMTQsICM3ICAgICAgICAgICAgICAgIDsgdSA9IGNsYW1wKCg2MyArIEZpbHRlcjIgKiAyNyk+PjcpCisgICAgdnFzaHJuLnMxNiAgZDI5LCBxMTUsICM3CisKKyAgICB2bW92LnU4ICAgICBxMSwgIzB4ODAgICAgICAgICAgICAgICAgICAgOyAweDgwCisKKyAgICB2cXN1Yi5zOCAgICBxMTEsIHE5LCBxMCAgICAgICAgICAgICAgICAgOyBzID0gY2xhbXAocXMyIC0gdSkKKyAgICB2cWFkZC5zOCAgICBxMCwgcTQsIHEwICAgICAgICAgICAgICAgICAgOyBzID0gY2xhbXAocHMyICsgdSkKKyAgICB2cXN1Yi5zOCAgICBxMTMsIHE4LCBxMTIgICAgICAgICAgICAgICAgOyBzID0gY2xhbXAocXMxIC0gdSkKKyAgICB2cWFkZC5zOCAgICBxMTIsIHE1LCBxMTIgICAgICAgICAgICAgICAgOyBzID0gY2xhbXAocHMxICsgdSkKKyAgICB2cXN1Yi5zOCAgICBxMTUsIHE3LCBxMTQgICAgICAgICAgICAgICAgOyBzID0gY2xhbXAocXMwIC0gdSkKKyAgICB2cWFkZC5zOCAgICBxMTQsIHE2LCBxMTQgICAgICAgICAgICAgICAgOyBzID0gY2xhbXAocHMwICsgdSkKKworICAgIHZlb3IgICAgICAgIHE5LCBxMTEsIHExICAgICAgICAgICAgICAgICA7ICpvcTIgPSBzXjB4ODAKKyAgICB2ZW9yICAgICAgICBxNCwgcTAsIHExICAgICAgICAgICAgICAgICAgOyAqb3AyID0gc14weDgwCisgICAgdmVvciAgICAgICAgcTgsIHExMywgcTEgICAgICAgICAgICAgICAgIDsgKm9xMSA9IHNeMHg4MAorICAgIHZlb3IgICAgICAgIHE1LCBxMTIsIHExICAgICAgICAgICAgICAgICA7ICpvcDIgPSBzXjB4ODAKKyAgICB2ZW9yICAgICAgICBxNywgcTE1LCBxMSAgICAgICAgICAgICAgICAgOyAqb3EwID0gc14weDgwCisgICAgdmVvciAgICAgICAgcTYsIHExNCwgcTEgICAgICAgICAgICAgICAgIDsgKm9wMCA9IHNeMHg4MAorCisgICAgYnggICAgICAgICAgbHIKKyAgICBFTkRQICAgICAgICA7IHx2cDhfbWJsb29wX2ZpbHRlcl9uZW9ufAorCis7LS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL25lb24vc2FkMTZfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zYWQxNl9uZW9uLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2VuY29kZXIvYXJtL25lb24vc2FkMTZfbmVvbi5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3NhZDE2X25lb24uYXNtCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vbmVvbi9zYWQ4X25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2FkOF9uZW9uLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2VuY29kZXIvYXJtL25lb24vc2FkOF9uZW9uLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2FkOF9uZW9uLmFzbQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9zYXZlX25lb25fcmVnLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3NhdmVfcmVnX25lb24uYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL2FybS9uZW9uL3NhdmVfbmVvbl9yZWcuYXNtCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zYXZlX3JlZ19uZW9uLmFzbQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDJhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fbmVvbi5hc20KQEAgLTAsMCArMSwxMzkgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfc2hvcnRfaWRjdDR4NGxsbV9uZW9ufAorICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzt2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2Moc2hvcnQgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcGl0Y2gsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSkKKztyMCBzaG9ydCAqIGlucHV0Cis7cjEgc2hvcnQgKiBwcmVkCis7cjIgaW50IHBpdGNoCis7cjMgdW5zaWduZWQgY2hhciBkc3QKKztzcCBpbnQgc3RyaWRlCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7IHN0YXRpYyBjb25zdCBpbnQgY29zcGk4c3FydDJtaW51czE9MjAwOTE7Cis7IHN0YXRpYyBjb25zdCBpbnQgc2lucGk4c3FydDIgICAgICA9MzU0Njg7Cis7IHN0YXRpYyBjb25zdCBpbnQgcm91bmRpbmcgPSAwOworCis7IE9wdGltaXphdGlvbiBub3RlOiBUaGUgcmVzdWx0ZWQgZGF0YSBmcm9tIGRlcXVhbnRpemF0aW9uIGFyZSBzaWduZWQKKzsgMTMtYml0IGRhdGEgdGhhdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgWy00MDk2LCA0MDk1XS4gVGhpcyBhbGxvd3MgdG8KKzsgdXNlICJ2cWRtdWxoIihuZW9uKSBpbnN0cnVjdGlvbiBzaW5jZSBpdCB3b24ndCBnbyBvdXQgb2YgcmFuZ2UKKzsgKDEzKzE2KzE9MzBiaXRzPDMyYml0cykuIFRoaXMgaW5zdHJ1Y3Rpb24gZ2l2ZXMgdGhlIGhpZ2ggaGFsZgorOyByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIHRoYXQgaXMgbmVlZGVkIGluIElEQ1QuCisKK3x2cDhfc2hvcnRfaWRjdDR4NGxsbV9uZW9ufCBQUk9DCisgICAgYWRyICAgICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZgorICAgIHZsZDEuMTYgICAgICAgICB7cTEsIHEyfSwgW3IwXQorICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyXQorCisgICAgdnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgIDtxMih2cFs0XSB2cFsxMl0pCisgICAgbGRyICAgICAgICAgICAgIHIwLCBbc3BdICAgICAgICAgICAgICAgIDsgc3RyaWRlCisKKyAgICB2cWRtdWxoLnMxNiAgICAgcTMsIHEyLCBkMFsyXQorICAgIHZxZG11bGguczE2ICAgICBxNCwgcTIsIGQwWzBdCisKKyAgICB2cWFkZC5zMTYgICAgICAgZDEyLCBkMiwgZDMgICAgICAgICAgICAgO2ExCisgICAgdnFzdWIuczE2ICAgICAgIGQxMywgZDIsIGQzICAgICAgICAgICAgIDtiMQorCisgICAgdnNoci5zMTYgICAgICAgIHEzLCBxMywgIzEKKyAgICB2c2hyLnMxNiAgICAgICAgcTQsIHE0LCAjMQorCisgICAgdnFhZGQuczE2ICAgICAgIHEzLCBxMywgcTIgICAgICAgICAgICAgIDttb2RpZnkgc2luY2Ugc2lucGk4c3FydDIgPiA2NTUzNi8yIChuZWd0aXZlIG51bWJlcikKKyAgICB2cWFkZC5zMTYgICAgICAgcTQsIHE0LCBxMgorCisgICAgO2Q2IC0gYzE6dGVtcDEKKyAgICA7ZDcgLSBkMTp0ZW1wMgorICAgIDtkOCAtIGQxOnRlbXAxCisgICAgO2Q5IC0gYzE6dGVtcDIKKworICAgIHZxc3ViLnMxNiAgICAgICBkMTAsIGQ2LCBkOSAgICAgICAgICAgICA7YzEKKyAgICB2cWFkZC5zMTYgICAgICAgZDExLCBkNywgZDggICAgICAgICAgICAgO2QxCisKKyAgICB2cWFkZC5zMTYgICAgICAgZDIsIGQxMiwgZDExCisgICAgdnFhZGQuczE2ICAgICAgIGQzLCBkMTMsIGQxMAorICAgIHZxc3ViLnMxNiAgICAgICBkNCwgZDEzLCBkMTAKKyAgICB2cXN1Yi5zMTYgICAgICAgZDUsIGQxMiwgZDExCisKKyAgICB2dHJuLjMyICAgICAgICAgZDIsIGQ0CisgICAgdnRybi4zMiAgICAgICAgIGQzLCBkNQorICAgIHZ0cm4uMTYgICAgICAgICBkMiwgZDMKKyAgICB2dHJuLjE2ICAgICAgICAgZDQsIGQ1CisKKyAgICB2c3dwICAgICAgICAgICAgZDMsIGQ0CisKKyAgICB2cWRtdWxoLnMxNiAgICAgcTMsIHEyLCBkMFsyXQorICAgIHZxZG11bGguczE2ICAgICBxNCwgcTIsIGQwWzBdCisKKyAgICB2cWFkZC5zMTYgICAgICAgZDEyLCBkMiwgZDMgICAgICAgICAgICAgO2ExCisgICAgdnFzdWIuczE2ICAgICAgIGQxMywgZDIsIGQzICAgICAgICAgICAgIDtiMQorCisgICAgdnNoci5zMTYgICAgICAgIHEzLCBxMywgIzEKKyAgICB2c2hyLnMxNiAgICAgICAgcTQsIHE0LCAjMQorCisgICAgdnFhZGQuczE2ICAgICAgIHEzLCBxMywgcTIgICAgICAgICAgICAgIDttb2RpZnkgc2luY2Ugc2lucGk4c3FydDIgPiA2NTUzNi8yIChuZWd0aXZlIG51bWJlcikKKyAgICB2cWFkZC5zMTYgICAgICAgcTQsIHE0LCBxMgorCisgICAgdnFzdWIuczE2ICAgICAgIGQxMCwgZDYsIGQ5ICAgICAgICAgICAgIDtjMQorICAgIHZxYWRkLnMxNiAgICAgICBkMTEsIGQ3LCBkOCAgICAgICAgICAgICA7ZDEKKworICAgIHZxYWRkLnMxNiAgICAgICBkMiwgZDEyLCBkMTEKKyAgICB2cWFkZC5zMTYgICAgICAgZDMsIGQxMywgZDEwCisgICAgdnFzdWIuczE2ICAgICAgIGQ0LCBkMTMsIGQxMAorICAgIHZxc3ViLnMxNiAgICAgICBkNSwgZDEyLCBkMTEKKworICAgIHZyc2hyLnMxNiAgICAgICBkMiwgZDIsICMzCisgICAgdnJzaHIuczE2ICAgICAgIGQzLCBkMywgIzMKKyAgICB2cnNoci5zMTYgICAgICAgZDQsIGQ0LCAjMworICAgIHZyc2hyLnMxNiAgICAgICBkNSwgZDUsICMzCisKKyAgICB2dHJuLjMyICAgICAgICAgZDIsIGQ0CisgICAgdnRybi4zMiAgICAgICAgIGQzLCBkNQorICAgIHZ0cm4uMTYgICAgICAgICBkMiwgZDMKKyAgICB2dHJuLjE2ICAgICAgICAgZDQsIGQ1CisKKyAgICA7IGxvYWQgcHJlZGljdGlvbiBkYXRhCisgICAgdmxkMS4zMiAgICAgICAgIGQ2WzBdLCBbcjFdLCByMgorICAgIHZsZDEuMzIgICAgICAgICBkNlsxXSwgW3IxXSwgcjIKKyAgICB2bGQxLjMyICAgICAgICAgZDdbMF0sIFtyMV0sIHIyCisgICAgdmxkMS4zMiAgICAgICAgIGQ3WzFdLCBbcjFdLCByMgorCisgICAgOyBhZGQgcHJlZGljdGlvbiBhbmQgcmVzaWR1YWwKKyAgICB2YWRkdy51OCAgICAgICAgcTEsIHExLCBkNgorICAgIHZhZGR3LnU4ICAgICAgICBxMiwgcTIsIGQ3CisKKyAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHExCisgICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMgorCisgICAgOyBzdG9yZSB0byBkZXN0aW5hdGlvbgorICAgIHZzdDEuMzIgICAgICAgICBkMVswXSwgW3IzXSwgcjAKKyAgICB2c3QxLjMyICAgICAgICAgZDFbMV0sIFtyM10sIHIwCisgICAgdnN0MS4zMiAgICAgICAgIGQyWzBdLCBbcjNdLCByMAorICAgIHZzdDEuMzIgICAgICAgICBkMlsxXSwgW3IzXSwgcjAKKworICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCis7LS0tLS0tLS0tLS0tLS0tLS0KKworaWRjdF9jb2VmZgorICAgIERDRCAgICAgMHg0ZTdiNGU3YiwgMHg4YThjOGE4YworCis7MjAwOTEsIDIwMDkxLCAzNTQ2OCwgMzU0NjgKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDE2eDE2X25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDE2eDE2X25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGFmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0MTZ4MTZfbmVvbi5hc20KQEAgLTAsMCArMSw0OTAgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9uZW9ufAorICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworZmlsdGVyMTZfY29lZmYKKyAgICBEQ0QgICAgIDAsICAwLCAgMTI4LCAgICAwLCAgIDAsICAwLCAgIDAsICAwCisgICAgRENEICAgICAwLCAtNiwgIDEyMywgICAxMiwgIC0xLCAgMCwgICAwLCAgMAorICAgIERDRCAgICAgMiwgLTExLCAxMDgsICAgMzYsICAtOCwgIDEsICAgMCwgIDAKKyAgICBEQ0QgICAgIDAsIC05LCAgIDkzLCAgIDUwLCAgLTYsICAwLCAgIDAsICAwCisgICAgRENEICAgICAzLCAtMTYsICA3NywgICA3NywgLTE2LCAgMywgICAwLCAgMAorICAgIERDRCAgICAgMCwgLTYsICAgNTAsICAgOTMsICAtOSwgIDAsICAgMCwgIDAKKyAgICBEQ0QgICAgIDEsIC04LCAgIDM2LCAgMTA4LCAtMTEsICAyLCAgIDAsICAwCisgICAgRENEICAgICAwLCAtMSwgICAxMiwgIDEyMywgIC02LCAgIDAsICAwLCAgMAorCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyByMSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7IHIyICAgIGludCAgeG9mZnNldCwKKzsgcjMgICAgaW50ICB5b2Zmc2V0LAorOyByNCAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyBzdGFjayhyNSkgaW50ICBkc3RfcGl0Y2gKKworO05vdGU6IFRvIHRha2UgYWR2YW50YWdlIG9mIDgtYml0IG11bHBsaWNhdGlvbiBpbnN0cnVjdGlvbiBpbiBORU9OLiBGaXJzdCBhcHBseSBhYnMoKSB0bworOyBmaWx0ZXIgY29lZmZzIHRvIG1ha2UgdGhlbSB1OC4gVGhlbiwgdXNlIHZtbHNsIGZvciBuZWd0aXZlIGNvZWZmcy4gQWZ0ZXIgbXVsdGlwbGljYXRpb24sCis7IHRoZSByZXN1bHQgY2FuIGJlIG5lZ3RpdmUuIFNvLCBJIHRyZWF0IHRoZSByZXN1bHQgYXMgczE2LiBCdXQsIHNpbmNlIGl0IGlzIGFsc28gcG9zc2libGUKKzsgdGhhdCB0aGUgcmVzdWx0IGNhbiBiZSBhIGxhcmdlIHBvc2l0aXZlIG51bWJlciAoPiAyXjE1LTEpLCB3aGljaCBjb3VsZCBiZSBjb25mdXNlZCBhcyBhCis7IG5lZ3RpdmUgbnVtYmVyLiBUbyBhdm9pZCB0aGF0IGVycm9yLCBhcHBseSBmaWx0ZXIgY29lZmZzIGluIHRoZSBvcmRlciBvZiAwLCAxLCA0ICw1ICwyLAorOyB3aGljaCBlbnN1cmVzIHRoYXQgdGhlIHJlc3VsdCBzdGF5cyBpbiBzMTYgcmFuZ2UuIEZpbmFsbHksIHNhdHVyYXRlZCBhZGQgdGhlIHJlc3VsdCBieQorOyBhcHBseWluZyAzcmQgZmlsdGVyIGNvZWZmLiBTYW1lIGFwcGx5cyB0byBvdGhlciBmaWx0ZXIgZnVuY3Rpb25zLgorCit8dnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgICAgICB7cjQtcjUsIGxyfQorCisgICAgYWRyICAgICAgICAgICAgIHIxMiwgZmlsdGVyMTZfY29lZmYKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtzcCwgIzEyXSAgICAgICAgICAgO2xvYWQgcGFyYW1ldGVycyBmcm9tIHN0YWNrCisgICAgbGRyICAgICAgICAgICAgIHI1LCBbc3AsICMxNl0gICAgICAgICAgIDtsb2FkIHBhcmFtZXRlcnMgZnJvbSBzdGFjaworCisgICAgY21wICAgICAgICAgICAgIHIyLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAorICAgIGJlcSAgICAgICAgICAgICBzZWNvbmRwYXNzX2ZpbHRlcjE2eDE2X29ubHkKKworICAgIGFkZCAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICM1ICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgorCisgICAgY21wICAgICAgICAgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKKworICAgIHZsZDEuczMyICAgICAgICB7cTE0LCBxMTV9LCBbcjJdICAgICAgICA7bG9hZCBmaXJzdF9wYXNzIGZpbHRlcgorCisgICAgYmVxICAgICAgICAgICAgIGZpcnN0cGFzc19maWx0ZXIxNngxNl9vbmx5CisKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMzM2ICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgbW92ICAgICAgICAgICAgIGxyLCBzcAorCisgICAgdmFicy5zMzIgICAgICAgIHExMiwgcTE0CisgICAgdmFicy5zMzIgICAgICAgIHExMywgcTE1CisKKyAgICBtb3YgICAgICAgICAgICAgcjIsICM3ICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgorICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMyICAgICAgICAgICAgICA7bW92ZSBzcmNwdHIgYmFjayB0byAobGluZS0yKSBhbmQgKGNvbHVtbi0yKQorICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEKKworICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDI0WzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwLWQ1KQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDI0WzRdCisgICAgdmR1cC44ICAgICAgICAgIGQyLCBkMjVbMF0KKyAgICB2ZHVwLjggICAgICAgICAgZDMsIGQyNVs0XQorICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDI2WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMjZbNF0KKworO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMjF4MTYpCitmaWx0X2JsazJkX2ZwMTZ4MTZfbG9vcF9uZW9uCisgICAgdmxkMS51OCAgICAgICAgIHtkNiwgZDcsIGQ4fSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHZsZDEudTggICAgICAgICB7ZDksIGQxMCwgZDExfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxMiwgZDEzLCBkMTR9LCBbcjBdLCByMQorCisgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KKyAgICBwbGQgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQorCisgICAgdm11bGwudTggICAgICAgIHE4LCBkNiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDcsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMCwgZDksIGQwCisgICAgdm11bGwudTggICAgICAgIHExMSwgZDEwLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQxMiwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTEzLCBkMTMsIGQwCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMxICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ5LCBkMTAsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICMxCisKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOCwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQyOSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTEyLCBkMzAsIGQxCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNywgZDgsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEzLCBkMTQsICMxCisKKyAgICB2bWxzbC51OCAgICAgICAgcTksIGQyOCwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxMTEsIGQyOSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTEzLCBkMzAsIGQxCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM0ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDksIGQxMCwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzQKKworICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI4LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMjksIGQ0CisgICAgdm1sc2wudTggICAgICAgIHExMiwgZDMwLCBkNAorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDcsIGQ4LCAjNAorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjNAorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMywgZDE0LCAjNAorCisgICAgdm1sc2wudTggICAgICAgIHE5LCBkMjgsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQorICAgIHZtbHNsLnU4ICAgICAgICBxMTEsIGQyOSwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTEzLCBkMzAsIGQ0CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDksIGQxMCwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzUKKworICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQorICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQyOSwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMzAsIGQ1CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNywgZDgsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEzLCBkMTQsICM1CisKKyAgICB2bWxhbC51OCAgICAgICAgcTksIGQyOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bWxhbC51OCAgICAgICAgcTExLCBkMjksIGQ1CisgICAgdm1sYWwudTggICAgICAgIHExMywgZDMwLCBkNQorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMiAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ5LCBkMTAsICMyCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICMyCisKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMjksIGQyCisgICAgdm1sYWwudTggICAgICAgIHExMiwgZDMwLCBkMgorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDcsIGQ4LCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMywgZDE0LCAjMgorCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMjgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHExMSwgZDI5LCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxMTMsIGQzMCwgZDIKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzMgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOSwgZDEwLCAjMworICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMworCisgICAgdmV4dC44ICAgICAgICAgIGQxNSwgZDcsIGQ4LCAjMworICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMCwgZDExLCAjMworICAgIHZleHQuOCAgICAgICAgICBkNiwgZDEzLCBkMTQsICMzCisKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOCwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyOSwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQzMCwgZDMKKworICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCisgICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTUKKyAgICB2cWFkZC5zMTYgICAgICAgcTEyLCBxNgorCisgICAgdm11bGwudTggICAgICAgIHE2LCBkMTUsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCisgICAgdm11bGwudTggICAgICAgIHE3LCBkMzEsIGQzCisgICAgdm11bGwudTggICAgICAgIHEzLCBkNiwgZDMKKworICAgIHN1YnMgICAgICAgICAgICByMiwgcjIsICMxCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTksIHE2CisgICAgdnFhZGQuczE2ICAgICAgIHExMSwgcTcKKyAgICB2cWFkZC5zMTYgICAgICAgcTEzLCBxMworCisgICAgdnFyc2hydW4uczE2ICAgIGQ2LCBxOCwgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkNywgcTksICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQ4LCBxMTAsICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQ5LCBxMTEsICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQxMCwgcTEyLCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkMTEsIHExMywgIzcKKworICAgIHZzdDEudTggICAgICAgICB7ZDYsIGQ3LCBkOH0sIFtscl0hICAgICA7c3RvcmUgcmVzdWx0CisgICAgdnN0MS51OCAgICAgICAgIHtkOSwgZDEwLCBkMTF9LCBbbHJdIQorCisgICAgYm5lICAgICAgICAgICAgIGZpbHRfYmxrMmRfZnAxNngxNl9sb29wX25lb24KKworO1NlY29uZCBwYXNzOiAxNngxNgorO3NlY29uZHBhc3NfZmlsdGVyIC0gZG8gZmlyc3QgOC1jb2x1bW5zIGFuZCB0aGVuIHNlY29uZCA4LWNvbHVtbnMKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQorICAgIHN1YiAgICAgICAgICAgICBsciwgbHIsICMzMzYKKworICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKKyAgICBtb3YgICAgICAgICAgICAgcjMsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgorCisgICAgdmFicy5zMzIgICAgICAgIHE3LCBxNQorICAgIHZhYnMuczMyICAgICAgICBxOCwgcTYKKworICAgIG1vdiAgICAgICAgICAgICByMiwgIzE2CisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQxNFswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMC1kNSkKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMTVbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCisKK2ZpbHRfYmxrMmRfc3AxNngxNl9vdXRsb29wX25lb24KKyAgICB2bGQxLnU4ICAgICAgICAge2QxOH0sIFtscl0sIHIyICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxOX0sIFtscl0sIHIyCisgICAgdmxkMS51OCAgICAgICAgIHtkMjB9LCBbbHJdLCByMgorICAgIHZsZDEudTggICAgICAgICB7ZDIxfSwgW2xyXSwgcjIKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNCAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgorICAgIHZsZDEudTggICAgICAgICB7ZDIyfSwgW2xyXSwgcjIKKworc2Vjb25kcGFzc19pbm5lcl9sb29wX25lb24KKyAgICB2bGQxLnU4ICAgICAgICAge2QyM30sIFtscl0sIHIyICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyNH0sIFtscl0sIHIyCisgICAgdmxkMS51OCAgICAgICAgIHtkMjV9LCBbbHJdLCByMgorICAgIHZsZDEudTggICAgICAgICB7ZDI2fSwgW2xyXSwgcjIKKworICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDE4LCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQxOSwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyMCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyMSwgZDAKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDE5LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE0LCBkMjAsIGQxCisgICAgdm1sc2wudTggICAgICAgIHE1LCBkMjEsIGQxCisgICAgdm1sc2wudTggICAgICAgIHE2LCBkMjIsIGQxCisKKyAgICB2bWxzbC51OCAgICAgICAgcTMsIGQyMiwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCisgICAgdm1sc2wudTggICAgICAgIHE0LCBkMjMsIGQ0CisgICAgdm1sc2wudTggICAgICAgIHE1LCBkMjQsIGQ0CisgICAgdm1sc2wudTggICAgICAgIHE2LCBkMjUsIGQ0CisKKyAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyMCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyMSwgZDIKKyAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyMiwgZDIKKyAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyMywgZDIKKworICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIzLCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI0LCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI1LCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI2LCBkNQorCisgICAgdm11bGwudTggICAgICAgIHE3LCBkMjEsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCisgICAgdm11bGwudTggICAgICAgIHE4LCBkMjIsIGQzCisgICAgdm11bGwudTggICAgICAgIHE5LCBkMjMsIGQzCisgICAgdm11bGwudTggICAgICAgIHExMCwgZDI0LCBkMworCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorCisgICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0CisgICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQorICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2CisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDYsIHE3LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hydW4uczE2ICAgIGQ3LCBxOCwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDgsIHE5LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTEwLCAjNworCisgICAgdnN0MS51OCAgICAgICAgIHtkNn0sIFtyNF0sIHI1ICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2bW92ICAgICAgICAgICAgcTksIHExMQorICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBxMTAsIHExMgorICAgIHZzdDEudTggICAgICAgICB7ZDh9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBkMjIsIGQyNgorICAgIHZzdDEudTggICAgICAgICB7ZDl9LCBbcjRdLCByNQorCisgICAgYm5lICAgICAgICAgICAgIHNlY29uZHBhc3NfaW5uZXJfbG9vcF9uZW9uCisKKyAgICBzdWJzICAgICAgICAgICAgcjMsIHIzLCAjMQorICAgIHN1YiAgICAgICAgICAgICBsciwgbHIsICMzMzYKKyAgICBhZGQgICAgICAgICAgICAgbHIsIGxyLCAjOAorCisgICAgc3ViICAgICAgICAgICAgIHI0LCByNCwgcjUsIGxzbCAjNAorICAgIGFkZCAgICAgICAgICAgICByNCwgcjQsICM4CisKKyAgICBibmUgZmlsdF9ibGsyZF9zcDE2eDE2X291dGxvb3BfbmVvbgorCisgICAgYWRkICAgICAgICAgICAgIHNwLCBzcCwgIzMzNgorICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUscGN9CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLQorZmlyc3RwYXNzX2ZpbHRlcjE2eDE2X29ubHkKKyAgICB2YWJzLnMzMiAgICAgICAgcTEyLCBxMTQKKyAgICB2YWJzLnMzMiAgICAgICAgcTEzLCBxMTUKKworICAgIG1vdiAgICAgICAgICAgICByMiwgIzggICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCisgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgIDttb3ZlIHNyY3B0ciBiYWNrIHRvIChjb2x1bW4tMikKKworICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDI0WzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwLWQ1KQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDI0WzRdCisgICAgdmR1cC44ICAgICAgICAgIGQyLCBkMjVbMF0KKyAgICB2ZHVwLjggICAgICAgICAgZDMsIGQyNVs0XQorICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDI2WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMjZbNF0KKworO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMTZ4MTYpCitmaWx0X2JsazJkX2ZwbzE2eDE2X2xvb3BfbmVvbgorICAgIHZsZDEudTggICAgICAgICB7ZDYsIGQ3LCBkOH0sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge2Q5LCBkMTAsIGQxMX0sIFtyMF0sIHIxCisKKyAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxXQorCisgICAgdm11bGwudTggICAgICAgIHE2LCBkNiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDcsIGQwCisgICAgdm11bGwudTggICAgICAgIHE4LCBkOSwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQxMCwgZDAKKworICAgIHZleHQuOCAgICAgICAgICBkMjAsIGQ2LCBkNywgIzEgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCisgICAgdmV4dC44ICAgICAgICAgIGQyMSwgZDksIGQxMCwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDIyLCBkNywgZDgsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQyMywgZDEwLCBkMTEsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQyNCwgZDYsIGQ3LCAjNCAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQorICAgIHZleHQuOCAgICAgICAgICBkMjUsIGQ5LCBkMTAsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyNiwgZDcsIGQ4LCAjNAorICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQxMCwgZDExLCAjNAorICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOSwgZDEwLCAjNQorCisgICAgdm1sc2wudTggICAgICAgIHE2LCBkMjAsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyMSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyMiwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDIzLCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxNiwgZDI0LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyNSwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyNiwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCisgICAgdm1sc2wudTggICAgICAgIHE5LCBkMjcsIGQ0CisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjgsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjksIGQ1CisKKyAgICB2ZXh0LjggICAgICAgICAgZDIwLCBkNywgZDgsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyMSwgZDEwLCBkMTEsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyMiwgZDYsIGQ3LCAjMiAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQorICAgIHZleHQuOCAgICAgICAgICBkMjMsIGQ5LCBkMTAsICMyCisgICAgdmV4dC44ICAgICAgICAgIGQyNCwgZDcsIGQ4LCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMjUsIGQxMCwgZDExLCAjMgorCisgICAgdmV4dC44ICAgICAgICAgIGQyNiwgZDYsIGQ3LCAjMyAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQorICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ5LCBkMTAsICMzCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDcsIGQ4LCAjMworICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMworCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMjAsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMjEsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjIsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjMsIGQyCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMjQsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMjUsIGQyCisKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMjYsIGQzICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTExLCBkMjcsIGQzCisgICAgdm11bGwudTggICAgICAgIHExMiwgZDI4LCBkMyAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCisgICAgdm11bGwudTggICAgICAgIHExNSwgZDI5LCBkMworCisgICAgdnFhZGQuczE2ICAgICAgIHE2LCBxMTAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHExMQorICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTEyCisgICAgdnFhZGQuczE2ICAgICAgIHE5LCBxMTUKKworICAgIHN1YnMgICAgICAgICAgICByMiwgcjIsICMxCisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDYsIHE2LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hydW4uczE2ICAgIGQ3LCBxNywgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDgsIHE4LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTksICM3CisKKyAgICB2c3QxLnU4ICAgICAgICAge3EzfSwgW3I0XSwgcjUgICAgICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLnU4ICAgICAgICAge3E0fSwgW3I0XSwgcjUKKworICAgIGJuZSAgICAgICAgICAgICBmaWx0X2JsazJkX2ZwbzE2eDE2X2xvb3BfbmVvbgorCisgICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZWNvbmRwYXNzX2ZpbHRlcjE2eDE2X29ubHkKKztTZWNvbmQgcGFzczogMTZ4MTYKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQorICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEKKworICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKKyAgICBtb3YgICAgICAgICAgICAgcjMsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgorCisgICAgdmFicy5zMzIgICAgICAgIHE3LCBxNQorICAgIHZhYnMuczMyICAgICAgICBxOCwgcTYKKworICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDE0WzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwLWQ1KQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDE0WzRdCisgICAgdmR1cC44ICAgICAgICAgIGQyLCBkMTVbMF0KKyAgICB2ZHVwLjggICAgICAgICAgZDMsIGQxNVs0XQorICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDE2WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMTZbNF0KKworZmlsdF9ibGsyZF9zcG8xNngxNl9vdXRsb29wX25lb24KKyAgICB2bGQxLnU4ICAgICAgICAge2QxOH0sIFtyMF0sIHIxICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxOX0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMjB9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDIxfSwgW3IwXSwgcjEKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNCAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgorICAgIHZsZDEudTggICAgICAgICB7ZDIyfSwgW3IwXSwgcjEKKworc2Vjb25kcGFzc19vbmx5X2lubmVyX2xvb3BfbmVvbgorICAgIHZsZDEudTggICAgICAgICB7ZDIzfSwgW3IwXSwgcjEgICAgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHZsZDEudTggICAgICAgICB7ZDI0fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyNX0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMjZ9LCBbcjBdLCByMQorCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMTgsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDE5LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDIwLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDIxLCBkMAorCisgICAgdm1sc2wudTggICAgICAgIHEzLCBkMTksIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyMCwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyMSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyMiwgZDEKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDIyLCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyMywgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyNCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNSwgZDQKKworICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIwLCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDIxLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDIyLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDIzLCBkMgorCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjMsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjQsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjUsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjYsIGQ1CisKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyMSwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyMiwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQyMywgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMjQsIGQzCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTcsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQorICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQKKyAgICB2cWFkZC5zMTYgICAgICAgcTksIHE1CisgICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTYKKworICAgIHZxcnNocnVuLnMxNiAgICBkNiwgcTcsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDcsIHE4LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkOCwgcTksICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQ5LCBxMTAsICM3CisKKyAgICB2c3QxLnU4ICAgICAgICAge2Q2fSwgW3I0XSwgcjUgICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZtb3YgICAgICAgICAgICBxOSwgcTExCisgICAgdnN0MS51OCAgICAgICAgIHtkN30sIFtyNF0sIHI1CisgICAgdm1vdiAgICAgICAgICAgIHExMCwgcTEyCisgICAgdnN0MS51OCAgICAgICAgIHtkOH0sIFtyNF0sIHI1CisgICAgdm1vdiAgICAgICAgICAgIGQyMiwgZDI2CisgICAgdnN0MS51OCAgICAgICAgIHtkOX0sIFtyNF0sIHI1CisKKyAgICBibmUgICAgICAgICAgICAgc2Vjb25kcGFzc19vbmx5X2lubmVyX2xvb3BfbmVvbgorCisgICAgc3VicyAgICAgICAgICAgIHIzLCByMywgIzEKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICM0CisgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMgorICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxCisgICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzgKKworICAgIHN1YiAgICAgICAgICAgICByNCwgcjQsIHI1LCBsc2wgIzQKKyAgICBhZGQgICAgICAgICAgICAgcjQsIHI0LCAjOAorCisgICAgYm5lIGZpbHRfYmxrMmRfc3BvMTZ4MTZfb3V0bG9vcF9uZW9uCisKKyAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorCisgICAgRU5EUAorCis7LS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q0eDRfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0NHg0X25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjIyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0NHg0X25lb24uYXNtCkBAIC0wLDAgKzEsNDIyIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3NpeHRhcF9wcmVkaWN0NHg0X25lb258CisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorCitmaWx0ZXI0X2NvZWZmCisgICAgRENEICAgICAwLCAgMCwgIDEyOCwgICAgMCwgICAwLCAgMCwgICAwLCAgMAorICAgIERDRCAgICAgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAsICAgMCwgIDAKKyAgICBEQ0QgICAgIDIsIC0xMSwgMTA4LCAgIDM2LCAgLTgsICAxLCAgIDAsICAwCisgICAgRENEICAgICAwLCAtOSwgICA5MywgICA1MCwgIC02LCAgMCwgICAwLCAgMAorICAgIERDRCAgICAgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMsICAgMCwgIDAKKyAgICBEQ0QgICAgIDAsIC02LCAgIDUwLCAgIDkzLCAgLTksICAwLCAgIDAsICAwCisgICAgRENEICAgICAxLCAtOCwgICAzNiwgIDEwOCwgLTExLCAgMiwgICAwLCAgMAorICAgIERDRCAgICAgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgICAwLCAgMCwgIDAKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyByMiAgICBpbnQgIHhvZmZzZXQsCis7IHIzICAgIGludCAgeW9mZnNldCwKKzsgc3RhY2socjQpIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCis7IHN0YWNrKGxyKSBpbnQgIGRzdF9waXRjaAorCit8dnA4X3NpeHRhcF9wcmVkaWN0NHg0X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KKworICAgIGFkciAgICAgICAgICAgICByMTIsIGZpbHRlcjRfY29lZmYKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtzcCwgIzhdICAgICAgICAgICAgO2xvYWQgcGFyYW1ldGVycyBmcm9tIHN0YWNrCisgICAgbGRyICAgICAgICAgICAgIGxyLCBbc3AsICMxMl0gICAgICAgICAgIDtsb2FkIHBhcmFtZXRlcnMgZnJvbSBzdGFjaworCisgICAgY21wICAgICAgICAgICAgIHIyLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAorICAgIGJlcSAgICAgICAgICAgICBzZWNvbmRwYXNzX2ZpbHRlcjR4NF9vbmx5CisKKyAgICBhZGQgICAgICAgICAgICAgcjIsIHIxMiwgcjIsIGxzbCAjNSAgICAgO2NhbGN1bGF0ZSBmaWx0ZXIgbG9jYXRpb24KKworICAgIGNtcCAgICAgICAgICAgICByMywgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCisgICAgdmxkMS5zMzIgICAgICAgIHtxMTQsIHExNX0sIFtyMl0gICAgICAgIDtsb2FkIGZpcnN0X3Bhc3MgZmlsdGVyCisKKyAgICBiZXEgICAgICAgICAgICAgZmlyc3RwYXNzX2ZpbHRlcjR4NF9vbmx5CisKKyAgICB2YWJzLnMzMiAgICAgICAgcTEyLCBxMTQgICAgICAgICAgICAgICAgO2dldCBhYnMoZmlsZXJfcGFyYW1ldGVycykKKyAgICB2YWJzLnMzMiAgICAgICAgcTEzLCBxMTUKKworICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMyICAgICAgICAgICAgICA7Z28gYmFjayAyIGNvbHVtbnMgb2Ygc3JjIGRhdGEKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxICAgICAgO2dvIGJhY2sgMiBsaW5lcyBvZiBzcmMgZGF0YQorCis7Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICg5eDQpCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIGZpcnN0IDQtbGluZSBzcmMgZGF0YQorICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDI0WzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwLWQ1KQorICAgIHZsZDEudTggICAgICAgICB7cTR9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDI0WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCisgICAgdmR1cC44ICAgICAgICAgIGQyLCBkMjVbMF0KKyAgICB2bGQxLnU4ICAgICAgICAge3E2fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDMsIGQyNVs0XQorICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDI2WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMjZbNF0KKworICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCisgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KKworICAgIHZleHQuOCAgICAgICAgICBkMTgsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KKyAgICB2ZXh0LjggICAgICAgICAgZDE5LCBkOCwgZDksICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyMCwgZDEwLCBkMTEsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyMSwgZDEyLCBkMTMsICM1CisKKyAgICB2c3dwICAgICAgICAgICAgZDcsIGQ4ICAgICAgICAgICAgICAgICAgO2Rpc2NhcmQgMm5kIGhhbGYgZGF0YSBhZnRlciBzcmNfcHRyWzNdIGlzIGRvbmUKKyAgICB2c3dwICAgICAgICAgICAgZDExLCBkMTIKKworICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbM10pCisgICAgdnppcC4zMiAgICAgICAgIGQyMCwgZDIxCisgICAgdm11bGwudTggICAgICAgIHE3LCBkMTgsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm11bGwudTggICAgICAgIHE4LCBkMjAsIGQ1CisKKyAgICB2bW92ICAgICAgICAgICAgcTQsIHEzICAgICAgICAgICAgICAgICAgO2tlZXAgb3JpZ2luYWwgc3JjIGRhdGEgaW4gcTQgcTYKKyAgICB2bW92ICAgICAgICAgICAgcTYsIHE1CisKKyAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0yXSwgYW5kIHB1dCAyLWxpbmUgZGF0YSB0b2dldGhlcgorICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQorICAgIHZzaHIudTY0ICAgICAgICBxOSwgcTQsICM4ICAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCisgICAgdnNoci51NjQgICAgICAgIHExMCwgcTYsICM4CisgICAgdm1sYWwudTggICAgICAgIHE3LCBkNiwgZDAgICAgICAgICAgICAgIDsrKHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQxMCwgZDAKKworICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbLTFdKQorICAgIHZ6aXAuMzIgICAgICAgICBkMjAsIGQyMQorICAgIHZzaHIudTY0ICAgICAgICBxMywgcTQsICMzMiAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KKyAgICB2c2hyLnU2NCAgICAgICAgcTUsIHE2LCAjMzIKKyAgICB2bWxzbC51OCAgICAgICAgcTcsIGQxOCwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDIwLCBkMQorCisgICAgdnppcC4zMiAgICAgICAgIGQ2LCBkNyAgICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clsyXSkKKyAgICB2emlwLjMyICAgICAgICAgZDEwLCBkMTEKKyAgICB2c2hyLnU2NCAgICAgICAgcTksIHE0LCAjMTYgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCisgICAgdnNoci51NjQgICAgICAgIHExMCwgcTYsICMxNgorICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDYsIGQ0ICAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQxMCwgZDQKKworICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbMF0pCisgICAgdnppcC4zMiAgICAgICAgIGQyMCwgZDIxCisgICAgdnNoci51NjQgICAgICAgIHEzLCBxNCwgIzI0ICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQorICAgIHZzaHIudTY0ICAgICAgICBxNSwgcTYsICMyNAorICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDE4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDIwLCBkMgorCisgICAgdnppcC4zMiAgICAgICAgIGQ2LCBkNyAgICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clsxXSkKKyAgICB2emlwLjMyICAgICAgICAgZDEwLCBkMTEKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQ2LCBkMyAgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTAsIGQzCisKKyAgICB2bGQxLnU4ICAgICAgICAge3EzfSwgW3IwXSwgcjEgICAgICAgICAgO2xvYWQgcmVzdCA1LWxpbmUgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKKworICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTkgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCisgICAgdnFhZGQuczE2ICAgICAgIHE4LCBxMTAKKworICAgIHZsZDEudTggICAgICAgICB7cTV9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQorCisgICAgdnFyc2hydW4uczE2ICAgIGQyNywgcTcsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkMjgsIHE4LCAjNworCisgICAgO0ZpcnN0IFBhc3Mgb24gcmVzdCA1LWxpbmUgZGF0YQorICAgIHZsZDEudTggICAgICAgICB7cTExfSwgW3IwXSwgcjEKKworICAgIHZleHQuOCAgICAgICAgICBkMTgsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KKyAgICB2ZXh0LjggICAgICAgICAgZDE5LCBkOCwgZDksICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyMCwgZDEwLCBkMTEsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyMSwgZDEyLCBkMTMsICM1CisKKyAgICB2c3dwICAgICAgICAgICAgZDcsIGQ4ICAgICAgICAgICAgICAgICAgO2Rpc2NhcmQgMm5kIGhhbGYgZGF0YSBhZnRlciBzcmNfcHRyWzNdIGlzIGRvbmUKKyAgICB2c3dwICAgICAgICAgICAgZDExLCBkMTIKKworICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbM10pCisgICAgdnppcC4zMiAgICAgICAgIGQyMCwgZDIxCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDIyLCBkMjMsICM1ICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQorICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDE4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQorICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDIwLCBkNQorICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQzMSwgZDUgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQorCisgICAgdm1vdiAgICAgICAgICAgIHE0LCBxMyAgICAgICAgICAgICAgICAgIDtrZWVwIG9yaWdpbmFsIHNyYyBkYXRhIGluIHE0IHE2CisgICAgdm1vdiAgICAgICAgICAgIHE2LCBxNQorCisgICAgdnppcC4zMiAgICAgICAgIGQ2LCBkNyAgICAgICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMl0sIGFuZCBwdXQgMi1saW5lIGRhdGEgdG9nZXRoZXIKKyAgICB2emlwLjMyICAgICAgICAgZDEwLCBkMTEKKyAgICB2c2hyLnU2NCAgICAgICAgcTksIHE0LCAjOCAgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQorICAgIHZzaHIudTY0ICAgICAgICBxMTAsIHE2LCAjOAorCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkNiwgZDAgICAgICAgICAgICAgIDsrKHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQxMCwgZDAKKyAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMjIsIGQwICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisKKyAgICB2emlwLjMyICAgICAgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWy0xXSkKKyAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKKyAgICB2c2hyLnU2NCAgICAgICAgcTMsIHE0LCAjMzIgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCisgICAgdnNoci51NjQgICAgICAgIHE1LCBxNiwgIzMyCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDIyLCBkMjMsICMxICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KKworICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDE4LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMjAsIGQxCisgICAgdm1sc2wudTggICAgICAgIHExMiwgZDMxLCBkMSAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKworICAgIHZ6aXAuMzIgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbMl0pCisgICAgdnppcC4zMiAgICAgICAgIGQxMCwgZDExCisgICAgdnNoci51NjQgICAgICAgIHE5LCBxNCwgIzE2ICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQorICAgIHZzaHIudTY0ICAgICAgICBxMTAsIHE2LCAjMTYKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMjIsIGQyMywgIzQgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCisKKyAgICB2bWxzbC51OCAgICAgICAgcTcsIGQ2LCBkNCAgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMTAsIGQ0CisgICAgdm1sc2wudTggICAgICAgIHExMiwgZDMxLCBkNCAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQorCisgICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clswXSkKKyAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKKyAgICB2c2hyLnU2NCAgICAgICAgcTMsIHE0LCAjMjQgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgdnNoci51NjQgICAgICAgIHE1LCBxNiwgIzI0CisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDIyLCBkMjMsICMyICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQorCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMTgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjAsIGQyCisgICAgdm1sYWwudTggICAgICAgIHExMiwgZDMxLCBkMiAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisKKyAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzFdKQorICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQyMiwgZDIzLCAjMyAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQ2LCBkMyAgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTAsIGQzCisgICAgdm11bGwudTggICAgICAgIHExMSwgZDMxLCBkMyAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCisKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQorCisgICAgdnFhZGQuczE2ICAgICAgIHE3LCBxOSAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHExMAorICAgIHZxYWRkLnMxNiAgICAgICBxMTIsIHExMQorCisgICAgdmV4dC44ICAgICAgICAgIGQyMywgZDI3LCBkMjgsICM0CisgICAgdmxkMS5zMzIgICAgICAgIHtxNSwgcTZ9LCBbcjNdICAgICAgICAgIDtsb2FkIHNlY29uZF9wYXNzIGZpbHRlcgorCisgICAgdnFyc2hydW4uczE2ICAgIGQyOSwgcTcsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkMzAsIHE4LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkMzEsIHExMiwgIzcKKworO1NlY29uZCBwYXNzOiA0eDQKKyAgICB2YWJzLnMzMiAgICAgICAgcTcsIHE1CisgICAgdmFicy5zMzIgICAgICAgIHE4LCBxNgorCisgICAgdmV4dC44ICAgICAgICAgIGQyNCwgZDI4LCBkMjksICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyNSwgZDI5LCBkMzAsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyNiwgZDMwLCBkMzEsICM0CisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQxNFswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMC1kNSkKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMTVbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCisKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyNywgZDAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE0LCBkMjgsIGQwCisKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyNSwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyNiwgZDUKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDI5LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQzMCwgZDQKKworICAgIHZtbHNsLnU4ICAgICAgICBxNSwgZDIzLCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE2LCBkMjQsIGQxCisKKyAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyOSwgZDIKKworICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI0LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI1LCBkMworCisgICAgYWRkICAgICAgICAgICAgIHIwLCByNCwgbHIKKyAgICBhZGQgICAgICAgICAgICAgcjEsIHIwLCBscgorICAgIGFkZCAgICAgICAgICAgICByMiwgcjEsIGxyCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTUsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQorICAgIHZxYWRkLnMxNiAgICAgICBxNiwgcTQKKworICAgIHZxcnNocnVuLnMxNiAgICBkMywgcTUsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDQsIHE2LCAjNworCisgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sIFtyNF0gICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgW3IwXQorICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCBbcjFdCisgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMl0KKworICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ZpcnN0cGFzc19maWx0ZXI0eDRfb25seQorICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNCAgICAgICAgICAgICAgICA7Z2V0IGFicyhmaWxlcl9wYXJhbWV0ZXJzKQorICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQorCisgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgIDtnbyBiYWNrIDIgY29sdW1ucyBvZiBzcmMgZGF0YQorCis7Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICg0eDQpCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIGZpcnN0IDQtbGluZSBzcmMgZGF0YQorICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDI0WzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwLWQ1KQorICAgIHZsZDEudTggICAgICAgICB7cTR9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDI0WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCisgICAgdmR1cC44ICAgICAgICAgIGQyLCBkMjVbMF0KKyAgICB2bGQxLnU4ICAgICAgICAge3E2fSwgW3IwXSwgcjEKKworICAgIHZkdXAuOCAgICAgICAgICBkMywgZDI1WzRdCisgICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMjZbMF0KKyAgICB2ZHVwLjggICAgICAgICAgZDUsIGQyNls0XQorCisgICAgdmV4dC44ICAgICAgICAgIGQxOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQorICAgIHZleHQuOCAgICAgICAgICBkMTksIGQ4LCBkOSwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDIwLCBkMTAsIGQxMSwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDIxLCBkMTIsIGQxMywgIzUKKworICAgIHZzd3AgICAgICAgICAgICBkNywgZDggICAgICAgICAgICAgICAgICA7ZGlzY2FyZCAybmQgaGFsZiBkYXRhIGFmdGVyIHNyY19wdHJbM10gaXMgZG9uZQorICAgIHZzd3AgICAgICAgICAgICBkMTEsIGQxMgorCisgICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clszXSkKKyAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQxOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyMCwgZDUKKworICAgIHZtb3YgICAgICAgICAgICBxNCwgcTMgICAgICAgICAgICAgICAgICA7a2VlcCBvcmlnaW5hbCBzcmMgZGF0YSBpbiBxNCBxNgorICAgIHZtb3YgICAgICAgICAgICBxNiwgcTUKKworICAgIHZ6aXAuMzIgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTJdLCBhbmQgcHV0IDItbGluZSBkYXRhIHRvZ2V0aGVyCisgICAgdnppcC4zMiAgICAgICAgIGQxMCwgZDExCisgICAgdnNoci51NjQgICAgICAgIHE5LCBxNCwgIzggICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KKyAgICB2c2hyLnU2NCAgICAgICAgcTEwLCBxNiwgIzgKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQ2LCBkMCAgICAgICAgICAgICAgOysoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDEwLCBkMAorCisgICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clstMV0pCisgICAgdnppcC4zMiAgICAgICAgIGQyMCwgZDIxCisgICAgdnNoci51NjQgICAgICAgIHEzLCBxNCwgIzMyICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQorICAgIHZzaHIudTY0ICAgICAgICBxNSwgcTYsICMzMgorICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDE4LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMjAsIGQxCisKKyAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzJdKQorICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQorICAgIHZzaHIudTY0ICAgICAgICBxOSwgcTQsICMxNiAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KKyAgICB2c2hyLnU2NCAgICAgICAgcTEwLCBxNiwgIzE2CisgICAgdm1sc2wudTggICAgICAgIHE3LCBkNiwgZDQgICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQorICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDEwLCBkNAorCisgICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clswXSkKKyAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKKyAgICB2c2hyLnU2NCAgICAgICAgcTMsIHE0LCAjMjQgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgdnNoci51NjQgICAgICAgIHE1LCBxNiwgIzI0CisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMTgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjAsIGQyCisKKyAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzFdKQorICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQorICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDYsIGQzICAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQorICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMCwgZDMKKworICAgIGFkZCAgICAgICAgICAgICByMCwgcjQsIGxyCisgICAgYWRkICAgICAgICAgICAgIHIxLCByMCwgbHIKKyAgICBhZGQgICAgICAgICAgICAgcjIsIHIxLCBscgorCisgICAgdnFhZGQuczE2ICAgICAgIHE3LCBxOSAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHExMAorCisgICAgdnFyc2hydW4uczE2ICAgIGQyNywgcTcsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkMjgsIHE4LCAjNworCisgICAgdnN0MS4zMiAgICAgICAgIHtkMjdbMF19LCBbcjRdICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLjMyICAgICAgICAge2QyN1sxXX0sIFtyMF0KKyAgICB2c3QxLjMyICAgICAgICAge2QyOFswXX0sIFtyMV0KKyAgICB2c3QxLjMyICAgICAgICAge2QyOFsxXX0sIFtyMl0KKworICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NlY29uZHBhc3NfZmlsdGVyNHg0X29ubHkKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCisgICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzUKKworICAgIHZsZDEuMzIgICAgICAgICB7ZDI3WzBdfSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKKyAgICB2bGQxLjMyICAgICAgICAge2QyN1sxXX0sIFtyMF0sIHIxCisgICAgdmFicy5zMzIgICAgICAgIHE3LCBxNQorICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzBdfSwgW3IwXSwgcjEKKyAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2CisgICAgdmxkMS4zMiAgICAgICAgIHtkMjhbMV19LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDE0WzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwLWQ1KQorICAgIHZsZDEuMzIgICAgICAgICB7ZDI5WzBdfSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQorICAgIHZsZDEuMzIgICAgICAgICB7ZDI5WzFdfSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDIsIGQxNVswXQorICAgIHZsZDEuMzIgICAgICAgICB7ZDMwWzBdfSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDMsIGQxNVs0XQorICAgIHZsZDEuMzIgICAgICAgICB7ZDMwWzFdfSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQorICAgIHZsZDEuMzIgICAgICAgICB7ZDMxWzBdfSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDUsIGQxNls0XQorCisgICAgdmV4dC44ICAgICAgICAgIGQyMywgZDI3LCBkMjgsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyNCwgZDI4LCBkMjksICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyNSwgZDI5LCBkMzAsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyNiwgZDMwLCBkMzEsICM0CisKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyNywgZDAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE0LCBkMjgsIGQwCisKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyNSwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyNiwgZDUKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDI5LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQzMCwgZDQKKworICAgIHZtbHNsLnU4ICAgICAgICBxNSwgZDIzLCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE2LCBkMjQsIGQxCisKKyAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyOSwgZDIKKworICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI0LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI1LCBkMworCisgICAgYWRkICAgICAgICAgICAgIHIwLCByNCwgbHIKKyAgICBhZGQgICAgICAgICAgICAgcjEsIHIwLCBscgorICAgIGFkZCAgICAgICAgICAgICByMiwgcjEsIGxyCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTUsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQorICAgIHZxYWRkLnMxNiAgICAgICBxNiwgcTQKKworICAgIHZxcnNocnVuLnMxNiAgICBkMywgcTUsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDQsIHE2LCAjNworCisgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sIFtyNF0gICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgW3IwXQorICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCBbcjFdCisgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMl0KKworICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorCisgICAgRU5EUAorCis7LS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4NF9uZW9uLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDRfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZWMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDRfbmVvbi5hc20KQEAgLTAsMCArMSw0NzMgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbmVvbnwKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCisKK2ZpbHRlcjhfY29lZmYKKyAgICBEQ0QgICAgIDAsICAwLCAgMTI4LCAgICAwLCAgIDAsICAwLCAgIDAsICAwCisgICAgRENEICAgICAwLCAtNiwgIDEyMywgICAxMiwgIC0xLCAgMCwgICAwLCAgMAorICAgIERDRCAgICAgMiwgLTExLCAxMDgsICAgMzYsICAtOCwgIDEsICAgMCwgIDAKKyAgICBEQ0QgICAgIDAsIC05LCAgIDkzLCAgIDUwLCAgLTYsICAwLCAgIDAsICAwCisgICAgRENEICAgICAzLCAtMTYsICA3NywgICA3NywgLTE2LCAgMywgICAwLCAgMAorICAgIERDRCAgICAgMCwgLTYsICAgNTAsICAgOTMsICAtOSwgIDAsICAgMCwgIDAKKyAgICBEQ0QgICAgIDEsIC04LCAgIDM2LCAgMTA4LCAtMTEsICAyLCAgIDAsICAwCisgICAgRENEICAgICAwLCAtMSwgICAxMiwgIDEyMywgIC02LCAgIDAsICAwLCAgMAorCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyByMSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7IHIyICAgIGludCAgeG9mZnNldCwKKzsgcjMgICAgaW50ICB5b2Zmc2V0LAorOyByNCAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyBzdGFjayhyNSkgaW50ICBkc3RfcGl0Y2gKKworfHZwOF9zaXh0YXBfcHJlZGljdDh4NF9uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNSwgbHJ9CisKKyAgICBhZHIgICAgICAgICAgICAgcjEyLCBmaWx0ZXI4X2NvZWZmCisgICAgbGRyICAgICAgICAgICAgIHI0LCBbc3AsICMxMl0gICAgICAgICAgIDtsb2FkIHBhcmFtZXRlcnMgZnJvbSBzdGFjaworICAgIGxkciAgICAgICAgICAgICByNSwgW3NwLCAjMTZdICAgICAgICAgICA7bG9hZCBwYXJhbWV0ZXJzIGZyb20gc3RhY2sKKworICAgIGNtcCAgICAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKKyAgICBiZXEgICAgICAgICAgICAgc2Vjb25kcGFzc19maWx0ZXI4eDRfb25seQorCisgICAgYWRkICAgICAgICAgICAgIHIyLCByMTIsIHIyLCBsc2wgIzUgICAgIDtjYWxjdWxhdGUgZmlsdGVyIGxvY2F0aW9uCisKKyAgICBjbXAgICAgICAgICAgICAgcjMsICMwICAgICAgICAgICAgICAgICAgO3NraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAorCisgICAgdmxkMS5zMzIgICAgICAgIHtxMTQsIHExNX0sIFtyMl0gICAgICAgIDtsb2FkIGZpcnN0X3Bhc3MgZmlsdGVyCisKKyAgICBiZXEgICAgICAgICAgICAgZmlyc3RwYXNzX2ZpbHRlcjh4NF9vbmx5CisKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMzIgICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgdmFicy5zMzIgICAgICAgIHExMiwgcTE0CisgICAgdmFicy5zMzIgICAgICAgIHExMywgcTE1CisKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgO21vdmUgc3JjcHRyIGJhY2sgdG8gKGxpbmUtMikgYW5kIChjb2x1bW4tMikKKyAgICBtb3YgICAgICAgICAgICAgbHIsIHNwCisgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQorCisgICAgdmR1cC44ICAgICAgICAgIGQwLCBkMjRbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAtZDUpCisgICAgdmR1cC44ICAgICAgICAgIGQxLCBkMjRbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDIsIGQyNVswXQorCis7Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICg5eDgpCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMjVbNF0KKyAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQyNlswXQorICAgIHZsZDEudTggICAgICAgICB7cTV9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDI2WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisKKyAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxXQorICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCisKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQ2LCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE4LCBkOCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQxMCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTIsIGQwCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMxICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzEKKworICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDI4LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMjksIGQxCisgICAgdm1sc2wudTggICAgICAgIHE5LCBkMzAsIGQxCisgICAgdm1sc2wudTggICAgICAgIHExMCwgZDMxLCBkMQorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNCAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzQKKworICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDI4LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOSwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTksIGQzMCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMzEsIGQ0CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMyICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMgorCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMjgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjksIGQyCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMzAsIGQyCisgICAgdm1sYWwudTggICAgICAgIHExMCwgZDMxLCBkMgorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzUKKworICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDMwLCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzMSwgZDUKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzMgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMzCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMzCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMzCisKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyOCwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOSwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQzMCwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQzMSwgZDMKKworICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCisgICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAorICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKKyAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgorCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDIyLCBxNywgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hydW4uczE2ICAgIGQyMywgcTgsICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQyNCwgcTksICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQyNSwgcTEwLCAjNworCisgICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCisgICAgdnN0MS51OCAgICAgICAgIHtkMjJ9LCBbbHJdISAgICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKKyAgICB2c3QxLnU4ICAgICAgICAge2QyM30sIFtscl0hCisgICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisgICAgdnN0MS51OCAgICAgICAgIHtkMjR9LCBbbHJdIQorICAgIHZsZDEudTggICAgICAgICB7cTd9LCBbcjBdLCByMQorICAgIHZzdDEudTggICAgICAgICB7ZDI1fSwgW2xyXSEKKworICAgIDtmaXJzdF9wYXNzIGZpbHRlcmluZyBvbiB0aGUgcmVzdCA1LWxpbmUgZGF0YQorICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDYsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQ4LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTExLCBkMTIsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMiwgZDE0LCBkMAorCisgICAgdmV4dC44ICAgICAgICAgIGQyNywgZDYsIGQ3LCAjMSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkOCwgZDksICMxCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDE0LCBkMTUsICMxCisKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyNywgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDI4LCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQyOSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTExLCBkMzAsIGQxCisgICAgdm1sc2wudTggICAgICAgIHExMiwgZDMxLCBkMQorCisgICAgdmV4dC44ICAgICAgICAgIGQyNywgZDYsIGQ3LCAjNCAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQorICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ4LCBkOSwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTQsIGQxNSwgIzQKKworICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI3LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTksIGQyOCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMjksIGQ0CisgICAgdm1sc2wudTggICAgICAgIHExMSwgZDMwLCBkNAorICAgIHZtbHNsLnU4ICAgICAgICBxMTIsIGQzMSwgZDQKKworICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzIgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkOCwgZDksICMyCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICMyCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICMyCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDE0LCBkMTUsICMyCisKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyNywgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTksIGQyOCwgZDIKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMjksIGQyCisgICAgdm1sYWwudTggICAgICAgIHExMSwgZDMwLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQzMSwgZDIKKworICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkOCwgZDksICM1CisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDE0LCBkMTUsICM1CisKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyNywgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bWxhbC51OCAgICAgICAgcTksIGQyOCwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMjksIGQ1CisgICAgdm1sYWwudTggICAgICAgIHExMSwgZDMwLCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQzMSwgZDUKKworICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzMgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkOCwgZDksICMzCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICMzCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICMzCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDE0LCBkMTUsICMzCisKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyNywgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOCwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyOSwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQzMCwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQzMSwgZDMKKworICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCisgICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNAorICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE1CisgICAgdnFhZGQuczE2ICAgICAgIHExMSwgcTYKKyAgICB2cWFkZC5zMTYgICAgICAgcTEyLCBxNworCisgICAgdnFyc2hydW4uczE2ICAgIGQyNiwgcTgsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkMjcsIHE5LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkMjgsIHExMCwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDI5LCBxMTEsICM3ICAgICAgICAgICAgICAgIDtsb2FkIGludGVybWVkaWF0ZSBkYXRhIGZyb20gc3RhY2sKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDMwLCBxMTIsICM3CisKKztTZWNvbmQgcGFzczogOHg0Cis7c2Vjb25kcGFzc19maWx0ZXIKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQorICAgIHN1YiAgICAgICAgICAgICBsciwgbHIsICMzMgorCisgICAgdmxkMS5zMzIgICAgICAgIHtxNSwgcTZ9LCBbcjNdICAgICAgICAgIDtsb2FkIHNlY29uZF9wYXNzIGZpbHRlcgorICAgIHZsZDEudTggICAgICAgICB7cTExfSwgW2xyXSEKKworICAgIHZhYnMuczMyICAgICAgICBxNywgcTUKKyAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2CisKKyAgICB2bGQxLnU4ICAgICAgICAge3ExMn0sIFtscl0hCisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQxNFswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMC1kNSkKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMTVbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCisKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyMiwgZDAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE0LCBkMjMsIGQwCisgICAgdm11bGwudTggICAgICAgIHE1LCBkMjQsIGQwCisgICAgdm11bGwudTggICAgICAgIHE2LCBkMjUsIGQwCisKKyAgICB2bWxzbC51OCAgICAgICAgcTMsIGQyMywgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxNCwgZDI0LCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxNSwgZDI1LCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxNiwgZDI2LCBkMQorCisgICAgdm1sc2wudTggICAgICAgIHEzLCBkMjYsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQorICAgIHZtbHNsLnU4ICAgICAgICBxNCwgZDI3LCBkNAorICAgIHZtbHNsLnU4ICAgICAgICBxNSwgZDI4LCBkNAorICAgIHZtbHNsLnU4ICAgICAgICBxNiwgZDI5LCBkNAorCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjQsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjUsIGQyCisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjYsIGQyCisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjcsIGQyCisKKyAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyNywgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyOCwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyOSwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTYsIGQzMCwgZDUKKworICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDI1LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQorICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDI2LCBkMworICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDI3LCBkMworICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQyOCwgZDMKKworICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCisgICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAorICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKKyAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgorCisgICAgdnFyc2hydW4uczE2ICAgIGQ2LCBxNywgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkNywgcTgsICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQ4LCBxOSwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDksIHExMCwgIzcKKworICAgIHZzdDEudTggICAgICAgICB7ZDZ9LCBbcjRdLCByNSAgICAgICAgICA7c3RvcmUgcmVzdWx0CisgICAgdnN0MS51OCAgICAgICAgIHtkN30sIFtyNF0sIHI1CisgICAgdnN0MS51OCAgICAgICAgIHtkOH0sIFtyNF0sIHI1CisgICAgdnN0MS51OCAgICAgICAgIHtkOX0sIFtyNF0sIHI1CisKKyAgICBhZGQgICAgICAgICAgICAgc3AsIHNwLCAjMzIKKyAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ZpcnN0cGFzc19maWx0ZXI4eDRfb25seQorICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNAorICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQorCisgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgIDttb3ZlIHNyY3B0ciBiYWNrIHRvIChsaW5lLTIpIGFuZCAoY29sdW1uLTIpCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQyNFswXSAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMC1kNSkKKyAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQyNFs0XQorICAgIHZsZDEudTggICAgICAgICB7cTV9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDI1WzBdCisgICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMjVbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQyNlswXQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDI2WzRdCisKKztGaXJzdCBwYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDR4OCkKKyAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxXQorICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCisKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQ2LCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE4LCBkOCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQxMCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTIsIGQwCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMxICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzEKKworICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDI4LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMjksIGQxCisgICAgdm1sc2wudTggICAgICAgIHE5LCBkMzAsIGQxCisgICAgdm1sc2wudTggICAgICAgIHExMCwgZDMxLCBkMQorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNCAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzQKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzQKKworICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDI4LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOSwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTksIGQzMCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMzEsIGQ0CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMyICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMgorCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMjgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjksIGQyCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMzAsIGQyCisgICAgdm1sYWwudTggICAgICAgIHExMCwgZDMxLCBkMgorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzUKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzUKKworICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDMwLCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzMSwgZDUKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzMgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMzCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMzCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMzCisKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyOCwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOSwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQzMCwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQzMSwgZDMKKworICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCisgICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAorICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKKyAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgorCisgICAgdnFyc2hydW4uczE2ICAgIGQyMiwgcTcsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocnVuLnMxNiAgICBkMjMsIHE4LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkMjQsIHE5LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkMjUsIHExMCwgIzcKKworICAgIHZzdDEudTggICAgICAgICB7ZDIyfSwgW3I0XSwgcjUgICAgICAgICA7c3RvcmUgcmVzdWx0CisgICAgdnN0MS51OCAgICAgICAgIHtkMjN9LCBbcjRdLCByNQorICAgIHZzdDEudTggICAgICAgICB7ZDI0fSwgW3I0XSwgcjUKKyAgICB2c3QxLnU4ICAgICAgICAge2QyNX0sIFtyNF0sIHI1CisKKyAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZWNvbmRwYXNzX2ZpbHRlcjh4NF9vbmx5Cis7U2Vjb25kIHBhc3M6IDh4NAorICAgIGFkZCAgICAgICAgICAgICByMywgcjEyLCByMywgbHNsICM1CisgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQorICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKKyAgICB2YWJzLnMzMiAgICAgICAgcTcsIHE1CisgICAgdmFicy5zMzIgICAgICAgIHE4LCBxNgorCisgICAgdmxkMS51OCAgICAgICAgIHtkMjJ9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDIzfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyNH0sIFtyMF0sIHIxCisgICAgdmR1cC44ICAgICAgICAgIGQwLCBkMTRbMF0gICAgICAgICAgICAgIDtzZWNvbmRfcGFzcyBmaWx0ZXIgcGFyYW1ldGVycyAoZDAtZDUpCisgICAgdmxkMS51OCAgICAgICAgIHtkMjV9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDE0WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtkMjZ9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCisgICAgdmxkMS51OCAgICAgICAgIHtkMjd9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMywgZDE1WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtkMjh9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDE2WzBdCisgICAgdmxkMS51OCAgICAgICAgIHtkMjl9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtkMzB9LCBbcjBdLCByMQorCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMjIsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDIzLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI0LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDI1LCBkMAorCisgICAgdm1sc2wudTggICAgICAgIHEzLCBkMjMsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyNCwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyNSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNiwgZDEKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDI2LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyNywgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyOCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyOSwgZDQKKworICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDI0LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI1LCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI2LCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI3LCBkMgorCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjcsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjgsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjksIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMzAsIGQ1CisKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyNSwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyNiwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQyNywgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMjgsIGQzCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTcsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQorICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQKKyAgICB2cWFkZC5zMTYgICAgICAgcTksIHE1CisgICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTYKKworICAgIHZxcnNocnVuLnMxNiAgICBkNiwgcTcsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDcsIHE4LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkOCwgcTksICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQ5LCBxMTAsICM3CisKKyAgICB2c3QxLnU4ICAgICAgICAge2Q2fSwgW3I0XSwgcjUgICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjRdLCByNQorICAgIHZzdDEudTggICAgICAgICB7ZDh9LCBbcjRdLCByNQorICAgIHZzdDEudTggICAgICAgICB7ZDl9LCBbcjRdLCByNQorCisgICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KKworICAgIEVORFAKKworOy0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDhfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0OHg4X25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWQ1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0OHg4X25lb24uYXNtCkBAIC0wLDAgKzEsNTI0IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3NpeHRhcF9wcmVkaWN0OHg4X25lb258CisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorCitmaWx0ZXI4X2NvZWZmCisgICAgRENEICAgICAwLCAgMCwgIDEyOCwgICAgMCwgICAwLCAgMCwgICAwLCAgMAorICAgIERDRCAgICAgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAsICAgMCwgIDAKKyAgICBEQ0QgICAgIDIsIC0xMSwgMTA4LCAgIDM2LCAgLTgsICAxLCAgIDAsICAwCisgICAgRENEICAgICAwLCAtOSwgICA5MywgICA1MCwgIC02LCAgMCwgICAwLCAgMAorICAgIERDRCAgICAgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMsICAgMCwgIDAKKyAgICBEQ0QgICAgIDAsIC02LCAgIDUwLCAgIDkzLCAgLTksICAwLCAgIDAsICAwCisgICAgRENEICAgICAxLCAtOCwgICAzNiwgIDEwOCwgLTExLCAgMiwgICAwLCAgMAorICAgIERDRCAgICAgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgICAwLCAgMCwgIDAKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyByMiAgICBpbnQgIHhvZmZzZXQsCis7IHIzICAgIGludCAgeW9mZnNldCwKKzsgc3RhY2socjQpIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCis7IHN0YWNrKHI1KSBpbnQgIGRzdF9waXRjaAorCit8dnA4X3NpeHRhcF9wcmVkaWN0OHg4X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICAgICAge3I0LXI1LCBscn0KKworICAgIGFkciAgICAgICAgICAgICByMTIsIGZpbHRlcjhfY29lZmYKKworICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjMTJdICAgICAgICAgICA7bG9hZCBwYXJhbWV0ZXJzIGZyb20gc3RhY2sKKyAgICBsZHIgICAgICAgICAgICAgcjUsIFtzcCwgIzE2XSAgICAgICAgICAgO2xvYWQgcGFyYW1ldGVycyBmcm9tIHN0YWNrCisKKyAgICBjbXAgICAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCisgICAgYmVxICAgICAgICAgICAgIHNlY29uZHBhc3NfZmlsdGVyOHg4X29ubHkKKworICAgIGFkZCAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICM1ICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgorCisgICAgY21wICAgICAgICAgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKKworICAgIHZsZDEuczMyICAgICAgICB7cTE0LCBxMTV9LCBbcjJdICAgICAgICA7bG9hZCBmaXJzdF9wYXNzIGZpbHRlcgorCisgICAgYmVxICAgICAgICAgICAgIGZpcnN0cGFzc19maWx0ZXI4eDhfb25seQorCisgICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzY0ICAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQorICAgIG1vdiAgICAgICAgICAgICBsciwgc3AKKworICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNAorICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQorCisgICAgbW92ICAgICAgICAgICAgIHIyLCAjMiAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgO21vdmUgc3JjcHRyIGJhY2sgdG8gKGxpbmUtMikgYW5kIChjb2x1bW4tMikKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQyNFswXSAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMC1kNSkKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQyNFs0XQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDI1WzBdCisKKztGaXJzdCBwYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDEzeDgpCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMjVbNF0KKyAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQyNlswXQorICAgIHZsZDEudTggICAgICAgICB7cTV9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDI2WzRdCisgICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisKK2ZpbHRfYmxrMmRfZnA4eDhfbG9vcF9uZW9uCisgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KKyAgICBwbGQgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQorCisgICAgdm11bGwudTggICAgICAgIHE3LCBkNiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDgsIGQwCisgICAgdm11bGwudTggICAgICAgIHE5LCBkMTAsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMCwgZDEyLCBkMAorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMxCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMxCisKKyAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyOCwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQorICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI5LCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDMwLCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQzMSwgZDEKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzQgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICM0CisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICM0CisKKyAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyOCwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMjksIGQ0CisgICAgdm1sc2wudTggICAgICAgIHE5LCBkMzAsIGQ0CisgICAgdm1sc2wudTggICAgICAgIHExMCwgZDMxLCBkNAorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMiAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzIKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzIKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzIKKworICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDMwLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzMSwgZDIKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICM1CisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICM1CisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICM1CisKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOSwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTksIGQzMCwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMzEsIGQ1CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMzICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMworICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMworICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMworCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMjgsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCisgICAgdm11bGwudTggICAgICAgIHE0LCBkMjksIGQzCisgICAgdm11bGwudTggICAgICAgIHE1LCBkMzAsIGQzCisgICAgdm11bGwudTggICAgICAgIHE2LCBkMzEsIGQzCisKKyAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQorCisgICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0CisgICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQorICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2CisKKyAgICB2bGQxLnU4ICAgICAgICAge3EzfSwgW3IwXSwgcjEgICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKworICAgIHZxcnNocnVuLnMxNiAgICBkMjIsIHE3LCAjNyAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDIzLCBxOCwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDI0LCBxOSwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDI1LCBxMTAsICM3CisKKyAgICB2c3QxLnU4ICAgICAgICAge2QyMn0sIFtscl0hICAgICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZsZDEudTggICAgICAgICB7cTR9LCBbcjBdLCByMQorICAgIHZzdDEudTggICAgICAgICB7ZDIzfSwgW2xyXSEKKyAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKKyAgICB2c3QxLnU4ICAgICAgICAge2QyNH0sIFtscl0hCisgICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisgICAgdnN0MS51OCAgICAgICAgIHtkMjV9LCBbbHJdIQorCisgICAgYm5lICAgICAgICAgICAgIGZpbHRfYmxrMmRfZnA4eDhfbG9vcF9uZW9uCisKKyAgICA7Zmlyc3RfcGFzcyBmaWx0ZXJpbmcgb24gdGhlIHJlc3QgNS1saW5lIGRhdGEKKyAgICA7dmxkMS51OCAgICAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgO3ZsZDEudTggICAgICAgICAgICB7cTR9LCBbcjBdLCByMQorICAgIDt2bGQxLnU4ICAgICAgICAgICAge3E1fSwgW3IwXSwgcjEKKyAgICA7dmxkMS51OCAgICAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtxN30sIFtyMF0sIHIxCisKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQ2LCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE5LCBkOCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTAsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMSwgZDEyLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQxNCwgZDAKKworICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzEgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjMQorCisgICAgdm1sc2wudTggICAgICAgIHE4LCBkMjcsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTksIGQyOCwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMjksIGQxCisgICAgdm1sc2wudTggICAgICAgIHExMSwgZDMwLCBkMQorICAgIHZtbHNsLnU4ICAgICAgICBxMTIsIGQzMSwgZDEKKworICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzQgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkOCwgZDksICM0CisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICM0CisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDE0LCBkMTUsICM0CisKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyNywgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCisgICAgdm1sc2wudTggICAgICAgIHE5LCBkMjgsIGQ0CisgICAgdm1sc2wudTggICAgICAgIHExMCwgZDI5LCBkNAorICAgIHZtbHNsLnU4ICAgICAgICBxMTEsIGQzMCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTEyLCBkMzEsIGQ0CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICMyICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMgorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjMgorCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjcsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMjgsIGQyCisgICAgdm1sYWwudTggICAgICAgIHExMCwgZDI5LCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQzMCwgZDIKKyAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMzEsIGQyCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjNQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjNQorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjNQorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjNQorCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjcsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMjgsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHExMCwgZDI5LCBkNQorICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQzMCwgZDUKKyAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMzEsIGQ1CisKKyAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICMzICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjMworICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMworICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMworICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjMworCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMjcsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCisgICAgdm11bGwudTggICAgICAgIHE0LCBkMjgsIGQzCisgICAgdm11bGwudTggICAgICAgIHE1LCBkMjksIGQzCisgICAgdm11bGwudTggICAgICAgIHE2LCBkMzAsIGQzCisgICAgdm11bGwudTggICAgICAgIHE3LCBkMzEsIGQzCisKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQorICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTQKKyAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNQorICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHE2CisgICAgdnFhZGQuczE2ICAgICAgIHExMiwgcTcKKworICAgIGFkZCAgICAgICAgICAgICByMywgcjEyLCByMywgbHNsICM1CisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDI2LCBxOCwgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgc3ViICAgICAgICAgICAgIGxyLCBsciwgIzY0CisgICAgdnFyc2hydW4uczE2ICAgIGQyNywgcTksICM3CisgICAgdmxkMS51OCAgICAgICAgIHtxOX0sIFtscl0hICAgICAgICAgICAgIDtsb2FkIGludGVybWVkaWF0ZSBkYXRhIGZyb20gc3RhY2sKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDI4LCBxMTAsICM3CisgICAgdmxkMS51OCAgICAgICAgIHtxMTB9LCBbbHJdIQorCisgICAgdmxkMS5zMzIgICAgICAgIHtxNSwgcTZ9LCBbcjNdICAgICAgICAgIDtsb2FkIHNlY29uZF9wYXNzIGZpbHRlcgorCisgICAgdnFyc2hydW4uczE2ICAgIGQyOSwgcTExLCAjNworICAgIHZsZDEudTggICAgICAgICB7cTExfSwgW2xyXSEKKworICAgIHZhYnMuczMyICAgICAgICBxNywgcTUKKyAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2CisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDMwLCBxMTIsICM3CisgICAgdmxkMS51OCAgICAgICAgIHtxMTJ9LCBbbHJdIQorCis7U2Vjb25kIHBhc3M6IDh4OAorICAgIG1vdiAgICAgICAgICAgICByMywgIzIgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQxNFswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMC1kNSkKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQorICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCisgICAgdmR1cC44ICAgICAgICAgIGQzLCBkMTVbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQorICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCisKK2ZpbHRfYmxrMmRfc3A4eDhfbG9vcF9uZW9uCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMTgsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDE5LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDIwLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDIxLCBkMAorCisgICAgdm1sc2wudTggICAgICAgIHEzLCBkMTksIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyMCwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyMSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyMiwgZDEKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDIyLCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyMywgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyNCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNSwgZDQKKworICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIwLCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDIxLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDIyLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDIzLCBkMgorCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjMsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjQsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjUsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjYsIGQ1CisKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyMSwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyMiwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQyMywgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMjQsIGQzCisKKyAgICBzdWJzICAgICAgICAgICAgcjMsIHIzLCAjMQorCisgICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0CisgICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQorICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2CisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDYsIHE3LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hydW4uczE2ICAgIGQ3LCBxOCwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDgsIHE5LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTEwLCAjNworCisgICAgdm1vdiAgICAgICAgICAgIHE5LCBxMTEKKyAgICB2c3QxLnU4ICAgICAgICAge2Q2fSwgW3I0XSwgcjUgICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZtb3YgICAgICAgICAgICBxMTAsIHExMgorICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBxMTEsIHExMworICAgIHZzdDEudTggICAgICAgICB7ZDh9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBxMTIsIHExNAorICAgIHZzdDEudTggICAgICAgICB7ZDl9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBkMjYsIGQzMAorCisgICAgYm5lIGZpbHRfYmxrMmRfc3A4eDhfbG9vcF9uZW9uCisKKyAgICBhZGQgICAgICAgICAgICAgc3AsIHNwLCAjNjQKKyAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaXJzdHBhc3NfZmlsdGVyOHg4X29ubHkKKyAgICA7YWRkICAgICAgICAgICAgICAgIHIyLCByMTIsIHIyLCBsc2wgIzUgICAgIDtjYWxjdWxhdGUgZmlsdGVyIGxvY2F0aW9uCisgICAgO3ZsZDEuczMyICAgICAgIHtxMTQsIHExNX0sIFtyMl0gICAgICAgIDtsb2FkIGZpcnN0X3Bhc3MgZmlsdGVyCisgICAgdmFicy5zMzIgICAgICAgIHExMiwgcTE0CisgICAgdmFicy5zMzIgICAgICAgIHExMywgcTE1CisKKyAgICBtb3YgICAgICAgICAgICAgcjIsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgorICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMyICAgICAgICAgICAgICA7bW92ZSBzcmNwdHIgYmFjayB0byAobGluZS0yKSBhbmQgKGNvbHVtbi0yKQorCisgICAgdmR1cC44ICAgICAgICAgIGQwLCBkMjRbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAtZDUpCisgICAgdmR1cC44ICAgICAgICAgIGQxLCBkMjRbNF0KKyAgICB2ZHVwLjggICAgICAgICAgZDIsIGQyNVswXQorICAgIHZkdXAuOCAgICAgICAgICBkMywgZDI1WzRdCisgICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMjZbMF0KKyAgICB2ZHVwLjggICAgICAgICAgZDUsIGQyNls0XQorCis7Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICg4eDgpCitmaWx0X2JsazJkX2Zwbzh4OF9sb29wX25lb24KKyAgICB2bGQxLnU4ICAgICAgICAge3EzfSwgW3IwXSwgcjEgICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge3E2fSwgW3IwXSwgcjEKKworICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCisgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KKworICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDYsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQ4LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDEwLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMiwgZDAKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzEgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMQorCisgICAgdm1sc2wudTggICAgICAgIHE3LCBkMjgsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTksIGQzMCwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMzEsIGQxCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM0ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjNAorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjNAorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjNAorCisgICAgdm1sc2wudTggICAgICAgIHE3LCBkMjgsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQorICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI5LCBkNAorICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDMwLCBkNAorICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQzMSwgZDQKKworICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzIgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KKyAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMyCisgICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMyCisgICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMyCisKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOSwgZDIKKyAgICB2bWxhbC51OCAgICAgICAgcTksIGQzMCwgZDIKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMzEsIGQyCisKKyAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCisgICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjNQorICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjNQorICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjNQorCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMjgsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMjksIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMzAsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHExMCwgZDMxLCBkNQorCisgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMyAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQorICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzMKKyAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzMKKyAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzMKKworICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI4LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQorICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDI5LCBkMworICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDMwLCBkMworICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDMxLCBkMworIDsKKyAgICB2cWFkZC5zMTYgICAgICAgcTcsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQorICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQKKyAgICB2cWFkZC5zMTYgICAgICAgcTksIHE1CisgICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTYKKworICAgIHN1YnMgICAgICAgICAgICByMiwgcjIsICMxCisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDIyLCBxNywgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hydW4uczE2ICAgIGQyMywgcTgsICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQyNCwgcTksICM3CisgICAgdnFyc2hydW4uczE2ICAgIGQyNSwgcTEwLCAjNworCisgICAgdnN0MS51OCAgICAgICAgIHtkMjJ9LCBbcjRdLCByNSAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLnU4ICAgICAgICAge2QyM30sIFtyNF0sIHI1CisgICAgdnN0MS51OCAgICAgICAgIHtkMjR9LCBbcjRdLCByNQorICAgIHZzdDEudTggICAgICAgICB7ZDI1fSwgW3I0XSwgcjUKKworICAgIGJuZSAgICAgICAgICAgICBmaWx0X2JsazJkX2Zwbzh4OF9sb29wX25lb24KKworICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUscGN9CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NlY29uZHBhc3NfZmlsdGVyOHg4X29ubHkKKyAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCisgICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzUKKworICAgIHZsZDEudTggICAgICAgICB7ZDE4fSwgW3IwXSwgcjEgICAgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKKyAgICB2bGQxLnU4ICAgICAgICAge2QxOX0sIFtyMF0sIHIxCisgICAgdmFicy5zMzIgICAgICAgIHE3LCBxNQorICAgIHZsZDEudTggICAgICAgICB7ZDIwfSwgW3IwXSwgcjEKKyAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2CisgICAgdmxkMS51OCAgICAgICAgIHtkMjF9LCBbcjBdLCByMQorICAgIG1vdiAgICAgICAgICAgICByMywgIzIgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCisgICAgdmxkMS51OCAgICAgICAgIHtkMjJ9LCBbcjBdLCByMQorICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDE0WzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwLWQ1KQorICAgIHZsZDEudTggICAgICAgICB7ZDIzfSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQorICAgIHZsZDEudTggICAgICAgICB7ZDI0fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDIsIGQxNVswXQorICAgIHZsZDEudTggICAgICAgICB7ZDI1fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDMsIGQxNVs0XQorICAgIHZsZDEudTggICAgICAgICB7ZDI2fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQorICAgIHZsZDEudTggICAgICAgICB7ZDI3fSwgW3IwXSwgcjEKKyAgICB2ZHVwLjggICAgICAgICAgZDUsIGQxNls0XQorICAgIHZsZDEudTggICAgICAgICB7ZDI4fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyOX0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMzB9LCBbcjBdLCByMQorCis7U2Vjb25kIHBhc3M6IDh4OAorZmlsdF9ibGsyZF9zcG84eDhfbG9vcF9uZW9uCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMTgsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDE5LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDIwLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDIxLCBkMAorCisgICAgdm1sc2wudTggICAgICAgIHEzLCBkMTksIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyMCwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyMSwgZDEKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyMiwgZDEKKworICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDIyLCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKKyAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyMywgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyNCwgZDQKKyAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNSwgZDQKKworICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIwLCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQorICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDIxLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDIyLCBkMgorICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDIzLCBkMgorCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjMsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjQsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjUsIGQ1CisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjYsIGQ1CisKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyMSwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyMiwgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQyMywgZDMKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMjQsIGQzCisKKyAgICBzdWJzICAgICAgICAgICAgcjMsIHIzLCAjMQorCisgICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKKyAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0CisgICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQorICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2CisKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDYsIHE3LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hydW4uczE2ICAgIGQ3LCBxOCwgIzcKKyAgICB2cXJzaHJ1bi5zMTYgICAgZDgsIHE5LCAjNworICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTEwLCAjNworCisgICAgdm1vdiAgICAgICAgICAgIHE5LCBxMTEKKyAgICB2c3QxLnU4ICAgICAgICAge2Q2fSwgW3I0XSwgcjUgICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZtb3YgICAgICAgICAgICBxMTAsIHExMgorICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBxMTEsIHExMworICAgIHZzdDEudTggICAgICAgICB7ZDh9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBxMTIsIHExNAorICAgIHZzdDEudTggICAgICAgICB7ZDl9LCBbcjRdLCByNQorICAgIHZtb3YgICAgICAgICAgICBkMjYsIGQzMAorCisgICAgYm5lIGZpbHRfYmxrMmRfc3BvOHg4X2xvb3BfbmVvbgorCisgICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KKworICAgIEVORFAKKworOy0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3ZhcmlhbmNlX25lb24uYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vdmFyaWFuY2VfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNDgzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3ZhcmlhbmNlX25lb24uYXNtCkBAIC0wLDAgKzEsMjc2IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3ZhcmlhbmNlMTZ4MTZfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2UxNng4X25lb258CisgICAgRVhQT1JUICB8dnA4X3ZhcmlhbmNlOHgxNl9uZW9ufAorICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZTh4OF9uZW9ufAorCisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsgcjEgICAgaW50IHNvdXJjZV9zdHJpZGUKKzsgcjIgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyByMyAgICBpbnQgIHJlY29uX3N0cmlkZQorOyBzdGFjayB1bnNpZ25lZCBpbnQgKnNzZQorfHZwOF92YXJpYW5jZTE2eDE2X25lb258IFBST0MKKyAgICB2bW92Lmk4ICAgICAgICAgcTgsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQorICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E5LCBxMTAgLSBzc2UKKyAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAorCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKKwordmFyaWFuY2UxNngxNl9uZW9uX2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IwXSwgcjEgICAgICAgICAgICAgIDtMb2FkIHVwIHNvdXJjZSBhbmQgcmVmZXJlbmNlCisgICAgdmxkMS44ICAgICAgICAgIHtxMn0sIFtyMl0sIHIzCisgICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyMF0sIHIxCisgICAgdmxkMS44ICAgICAgICAgIHtxM30sIFtyMl0sIHIzCisKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkMCwgZDQgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgZGlmZgorICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQxLCBkNQorICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQyLCBkNgorICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQzLCBkNworCisgICAgO1ZQQURBTCBhZGRzIGFkamFjZW50IHBhaXJzIG9mIGVsZW1lbnRzIG9mIGEgdmVjdG9yLCBhbmQgYWNjdW11bGF0ZXMKKyAgICA7dGhlIHJlc3VsdHMgaW50byB0aGUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4gVGhlIGV4cGxhbmF0aW9uCisgICAgO2luIEFSTSBndWlkZSBpcyB3cm9uZy4KKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgc3VtCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHNzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI0LCBkMjQKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjUsIGQyNQorICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEzCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjYsIGQyNgorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNywgZDI3CisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTQKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyOCwgZDI4CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI5LCBkMjkKKworICAgIGJuZSAgICAgICAgICAgICB2YXJpYW5jZTE2eDE2X25lb25fbG9vcAorCisgICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKKyAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQorCisgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKKworICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTEwCisgICAgdmFkZC5zNjQgICAgICAgIGQwLCBkMCwgZDEKKyAgICB2YWRkLnU2NCAgICAgICAgZDEsIGQyLCBkMworCisgICAgO3Ztb3YuMzIgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7dGhpcyBpbnN0cnVjdGlvbiBjb3N0cyBhIGxvdAorICAgIDt2bW92LjMyICAgICAgICByMSwgZDFbMF0KKyAgICA7bXVsICAgICAgICAgICAgcjAsIHIwLCByMAorICAgIDtzdHIgICAgICAgICAgICByMSwgW3IxMl0KKyAgICA7c3ViICAgICAgICAgICAgcjAsIHIxLCByMCwgbHNyICM4CisKKyAgICA7IHdoaWxlIHN1bSBpcyBzaWduZWQsIHN1bSAqIHN1bSBpcyBhbHdheXMgcG9zaXRpdmUgYW5kIG11c3QgYmUgdHJlYXRlZCBhcworICAgIDsgdW5zaWduZWQgdG8gYXZvaWQgcHJvcGFnYXRpbmcgdGhlIHNpZ24gYml0LgorICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCisgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyMTJdICAgICAgICAgICAgICA7c3RvcmUgc3NlCisgICAgdnNoci51MzIgICAgICAgIGQxMCwgZDEwLCAjOAorICAgIHZzdWIudTMyICAgICAgICBkMCwgZDEsIGQxMAorCisgICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCisgICAgYnggICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorO3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNng4X2MoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc291cmNlX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWNvbl9zdHJpZGUsCis7ICAgdW5zaWduZWQgaW50ICpzc2UpCit8dnA4X3ZhcmlhbmNlMTZ4OF9uZW9ufCBQUk9DCisgICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KKyAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCisgICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKKworICAgIG1vdiAgICAgICAgICAgICByMTIsICM0CisKK3ZhcmlhbmNlMTZ4OF9uZW9uX2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IwXSwgcjEgICAgICAgICAgICAgIDtMb2FkIHVwIHNvdXJjZSBhbmQgcmVmZXJlbmNlCisgICAgdmxkMS44ICAgICAgICAgIHtxMn0sIFtyMl0sIHIzCisgICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyMF0sIHIxCisgICAgdmxkMS44ICAgICAgICAgIHtxM30sIFtyMl0sIHIzCisKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkMCwgZDQgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgZGlmZgorICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQxLCBkNQorICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQyLCBkNgorICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQzLCBkNworCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTEgICAgICAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHN1bQorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIyLCBkMjIgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjMsIGQyMworCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTIKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNCwgZDI0CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI1LCBkMjUKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI2LCBkMjYKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjcsIGQyNworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTE0CisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjgsIGQyOAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyOSwgZDI5CisKKyAgICBibmUgICAgICAgICAgICAgdmFyaWFuY2UxNng4X25lb25fbG9vcAorCisgICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKKyAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQorCisgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKKworICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTEwCisgICAgdmFkZC5zNjQgICAgICAgIGQwLCBkMCwgZDEKKyAgICB2YWRkLnU2NCAgICAgICAgZDEsIGQyLCBkMworCisgICAgdm11bGwuczMyICAgICAgIHE1LCBkMCwgZDAKKyAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgW3IxMl0gICAgICAgICAgICAgIDtzdG9yZSBzc2UKKyAgICB2c2hyLnUzMiAgICAgICAgZDEwLCBkMTAsICM3CisgICAgdnN1Yi51MzIgICAgICAgIGQwLCBkMSwgZDEwCisKKyAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDtyZXR1cm4KKyAgICBieCAgICAgICAgICAgICAgbHIKKworICAgIEVORFAKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorO3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDE2X2MoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc291cmNlX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWNvbl9zdHJpZGUsCis7ICAgdW5zaWduZWQgaW50ICpzc2UpCisKK3x2cDhfdmFyaWFuY2U4eDE2X25lb258IFBST0MKKyAgICB2bW92Lmk4ICAgICAgICAgcTgsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQorICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E5LCBxMTAgLSBzc2UKKyAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAorCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKKwordmFyaWFuY2U4eDE2X25lb25fbG9vcAorICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKKyAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IyXSwgcjMKKworICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkNCAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBkaWZmCisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDIsIGQ2CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgc3VtCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHNzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI0LCBkMjQKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjUsIGQyNQorCisgICAgYm5lICAgICAgICAgICAgIHZhcmlhbmNlOHgxNl9uZW9uX2xvb3AKKworICAgIHZhZGQudTMyICAgICAgICBxMTAsIHE5LCBxMTAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3NlCisgICAgdnBhZGRsLnMzMiAgICAgIHEwLCBxOCAgICAgICAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzdW0KKworICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0gICAgICAgICAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCisKKyAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAorICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCisgICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKKworICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCisgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyMTJdICAgICAgICAgICAgICA7c3RvcmUgc3NlCisgICAgdnNoci51MzIgICAgICAgIGQxMCwgZDEwLCAjNworICAgIHZzdWIudTMyICAgICAgICBkMCwgZDEsIGQxMAorCisgICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCisgICAgYnggICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsgcjEgICAgaW50IHNvdXJjZV9zdHJpZGUKKzsgcjIgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyByMyAgICBpbnQgIHJlY29uX3N0cmlkZQorOyBzdGFjayB1bnNpZ25lZCBpbnQgKnNzZQorfHZwOF92YXJpYW5jZTh4OF9uZW9ufCBQUk9DCisgICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KKyAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCisgICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKKworICAgIG1vdiAgICAgICAgICAgICByMTIsICMyCisKK3ZhcmlhbmNlOHg4X25lb25fbG9vcAorICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKKyAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q1fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q3fSwgW3IyXSwgcjMKKworICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkNCAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBkaWZmCisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1CisgICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2CisgICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgc3VtCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHNzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI0LCBkMjQKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjUsIGQyNQorICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEzCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjYsIGQyNgorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNywgZDI3CisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTQKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyOCwgZDI4CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI5LCBkMjkKKworICAgIGJuZSAgICAgICAgICAgICB2YXJpYW5jZTh4OF9uZW9uX2xvb3AKKworICAgIHZhZGQudTMyICAgICAgICBxMTAsIHE5LCBxMTAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3NlCisgICAgdnBhZGRsLnMzMiAgICAgIHEwLCBxOCAgICAgICAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzdW0KKworICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0gICAgICAgICAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCisKKyAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAorICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCisgICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKKworICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCisgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyMTJdICAgICAgICAgICAgICA7c3RvcmUgc3NlCisgICAgdnNoci51MzIgICAgICAgIGQxMCwgZDEwLCAjNgorICAgIHZzdWIudTMyICAgICAgICBkMCwgZDEsIGQxMAorCisgICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCisgICAgYnggICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQCisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlMTZ4MTZfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2X25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTNlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2X25lb24uYXNtCkBAIC0wLDAgKzEsNDIzIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCitiaWxpbmVhcl90YXBzX2NvZWZmCisgICAgRENEICAgICAxMjgsIDAsIDExMiwgMTYsIDk2LCAzMiwgODAsIDQ4LCA2NCwgNjQsIDQ4LCA4MCwgMzIsIDk2LCAxNiwgMTEyCisKKzstLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRVhQT1JUICB8dnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb25fZnVuY3wKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCis7IHIwICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyByMSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7IHIyICAgIGludCAgeG9mZnNldCwKKzsgcjMgICAgaW50ICB5b2Zmc2V0LAorOyBzdGFjayhyNCkgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgc3RhY2socjUpIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorOyBzdGFjayhyNikgdW5zaWduZWQgaW50ICpzc2UKKztub3RlOiBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvcGllZCBmcm9tIGJpbGluZWFyX3ByZWRpY3QxNngxNl9uZW9uIGFuZCB2cDhfdmFyaWFuY2UxNngxNl9uZW9uLgorCit8dnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb25fZnVuY3wgUFJPQworICAgIHB1c2ggICAgICAgICAgICB7cjQtcjYsIGxyfQorCisgICAgYWRyICAgICAgICAgICAgIHIxMiwgYmlsaW5lYXJfdGFwc19jb2VmZgorICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjMTZdICAgICAgICAgICA7bG9hZCAqZHN0X3B0ciBmcm9tIHN0YWNrCisgICAgbGRyICAgICAgICAgICAgIHI1LCBbc3AsICMyMF0gICAgICAgICAgIDtsb2FkIGRzdF9waXhlbHNfcGVyX2xpbmUgZnJvbSBzdGFjaworICAgIGxkciAgICAgICAgICAgICByNiwgW3NwLCAjMjRdICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKKworICAgIGNtcCAgICAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKKyAgICBiZXEgICAgICAgICAgICAgc2Vjb25kcGFzc19iZmlsdGVyMTZ4MTZfb25seQorCisgICAgYWRkICAgICAgICAgICAgIHIyLCByMTIsIHIyLCBsc2wgIzMgICAgIDtjYWxjdWxhdGUgZmlsdGVyIGxvY2F0aW9uCisKKyAgICBjbXAgICAgICAgICAgICAgcjMsICMwICAgICAgICAgICAgICAgICAgO3NraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAorCisgICAgdmxkMS5zMzIgICAgICAgIHtkMzF9LCBbcjJdICAgICAgICAgICAgIDtsb2FkIGZpcnN0X3Bhc3MgZmlsdGVyCisKKyAgICBiZXEgICAgICAgICAgICAgZmlyc3RwYXNzX2JmaWx0ZXIxNngxNl9vbmx5CisKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMjcyICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgdmxkMS51OCAgICAgICAgIHtkMiwgZDMsIGQ0fSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIG1vdiAgICAgICAgICAgICBsciwgc3AKKyAgICB2bGQxLnU4ICAgICAgICAge2Q1LCBkNiwgZDd9LCBbcjBdLCByMQorCisgICAgbW92ICAgICAgICAgICAgIHIyLCAjMyAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwfSwgW3IwXSwgcjEKKworICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDMxWzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwIGQxKQorICAgIHZsZDEudTggICAgICAgICB7ZDExLCBkMTIsIGQxM30sIFtyMF0sIHIxCisKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQzMVs0XQorCis7Rmlyc3QgUGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICgxN3gxNikKK3ZwOGVfZmlsdF9ibGsyZF9mcDE2eDE2X2xvb3BfbmVvbgorICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCisgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KKworICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDIsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE4LCBkMywgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQ1LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQ2LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTEsIGQ4LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQ5LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTMsIGQxMSwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTE0LCBkMTIsIGQwCisKKyAgICB2ZXh0LjggICAgICAgICAgZDIsIGQyLCBkMywgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgdmV4dC44ICAgICAgICAgIGQ1LCBkNSwgZDYsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQ4LCBkOCwgZDksICMxCisgICAgdmV4dC44ICAgICAgICAgIGQxMSwgZDExLCBkMTIsICMxCisKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyLCBkMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzFdKQorICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDUsIGQxCisgICAgdm1sYWwudTggICAgICAgIHExMSwgZDgsIGQxCisgICAgdm1sYWwudTggICAgICAgIHExMywgZDExLCBkMQorCisgICAgdmV4dC44ICAgICAgICAgIGQzLCBkMywgZDQsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQ2LCBkNiwgZDcsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQ5LCBkOSwgZDEwLCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMTIsIGQxMiwgZDEzLCAjMQorCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMywgZDEgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclsxXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkNiwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkOSwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTE0LCBkMTIsIGQxCisKKyAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQorCisgICAgdnFyc2hybi51MTYgICAgZDE0LCBxNywgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAorICAgIHZxcnNocm4udTE2ICAgIGQxNSwgcTgsICM3CisgICAgdnFyc2hybi51MTYgICAgZDE2LCBxOSwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMTcsIHExMCwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMTgsIHExMSwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMTksIHExMiwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMjAsIHExMywgIzcKKworICAgIHZsZDEudTggICAgICAgICB7ZDIsIGQzLCBkNH0sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2cXJzaHJuLnUxNiAgICBkMjEsIHExNCwgIzcKKyAgICB2bGQxLnU4ICAgICAgICAge2Q1LCBkNiwgZDd9LCBbcjBdLCByMQorCisgICAgdnN0MS51OCAgICAgICAgIHtkMTQsIGQxNSwgZDE2LCBkMTd9LCBbbHJdISAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZsZDEudTggICAgICAgICB7ZDgsIGQ5LCBkMTB9LCBbcjBdLCByMQorICAgIHZzdDEudTggICAgICAgICB7ZDE4LCBkMTksIGQyMCwgZDIxfSwgW2xyXSEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxMSwgZDEyLCBkMTN9LCBbcjBdLCByMQorCisgICAgYm5lICAgICAgICAgICAgIHZwOGVfZmlsdF9ibGsyZF9mcDE2eDE2X2xvb3BfbmVvbgorCis7Rmlyc3QtcGFzcyBmaWx0ZXJpbmcgZm9yIHJlc3QgNSBsaW5lcworICAgIHZsZDEudTggICAgICAgICB7ZDE0LCBkMTUsIGQxNn0sIFtyMF0sIHIxCisKKyAgICB2bXVsbC51OCAgICAgICAgcTksIGQyLCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzBdKQorICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQzLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTEsIGQ1LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQ2LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTMsIGQ4LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTQsIGQ5LCBkMAorCisgICAgdmV4dC44ICAgICAgICAgIGQyLCBkMiwgZDMsICMxICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQorICAgIHZleHQuOCAgICAgICAgICBkNSwgZDUsIGQ2LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkOCwgZDgsIGQ5LCAjMQorCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkMiwgZDEgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclsxXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTExLCBkNSwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTEzLCBkOCwgZDEKKworICAgIHZleHQuOCAgICAgICAgICBkMywgZDMsIGQ0LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkNiwgZDYsIGQ3LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkOSwgZDksIGQxMCwgIzEKKworICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzLCBkMSAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMV0pCisgICAgdm1sYWwudTggICAgICAgIHExMiwgZDYsIGQxCisgICAgdm1sYWwudTggICAgICAgIHExNCwgZDksIGQxCisKKyAgICB2bXVsbC51OCAgICAgICAgcTEsIGQxMSwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTIsIGQxMiwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQxNCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQxNSwgZDAKKworICAgIHZleHQuOCAgICAgICAgICBkMTEsIGQxMSwgZDEyLCAjMSAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDE0LCBkMTQsIGQxNSwgIzEKKworICAgIHZtbGFsLnU4ICAgICAgICBxMSwgZDExLCBkMSAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMV0pCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMTQsIGQxCisKKyAgICB2ZXh0LjggICAgICAgICAgZDEyLCBkMTIsIGQxMywgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDE1LCBkMTUsIGQxNiwgIzEKKworICAgIHZtbGFsLnU4ICAgICAgICBxMiwgZDEyLCBkMSAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMV0pCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMTUsIGQxCisKKyAgICB2cXJzaHJuLnUxNiAgICBkMTAsIHE5LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hybi51MTYgICAgZDExLCBxMTAsICM3CisgICAgdnFyc2hybi51MTYgICAgZDEyLCBxMTEsICM3CisgICAgdnFyc2hybi51MTYgICAgZDEzLCBxMTIsICM3CisgICAgdnFyc2hybi51MTYgICAgZDE0LCBxMTMsICM3CisgICAgdnFyc2hybi51MTYgICAgZDE1LCBxMTQsICM3CisgICAgdnFyc2hybi51MTYgICAgZDE2LCBxMSwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMTcsIHEyLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQxOCwgcTMsICM3CisgICAgdnFyc2hybi51MTYgICAgZDE5LCBxNCwgIzcKKworICAgIHZzdDEudTggICAgICAgICB7ZDEwLCBkMTEsIGQxMiwgZDEzfSwgW2xyXSEgICAgICAgICA7c3RvcmUgcmVzdWx0CisgICAgdnN0MS51OCAgICAgICAgIHtkMTQsIGQxNSwgZDE2LCBkMTd9LCBbbHJdIQorICAgIHZzdDEudTggICAgICAgICB7ZDE4LCBkMTl9LCBbbHJdIQorCis7U2Vjb25kIHBhc3M6IDE2eDE2Cis7c2Vjb25kcGFzc19maWx0ZXIKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjMworICAgIHN1YiAgICAgICAgICAgICBsciwgbHIsICMyNzIKKworICAgIHZsZDEudTMyICAgICAgICB7ZDMxfSwgW3IzXSAgICAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKKworICAgIHN1YiAgICAgICAgICAgICBzcCwgc3AsICMyNTYKKyAgICBtb3YgICAgICAgICAgICAgcjMsIHNwCisKKyAgICB2bGQxLnU4ICAgICAgICAge2QyMiwgZDIzfSwgW2xyXSEgICAgICAgO2xvYWQgc3JjIGRhdGEKKworICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDMxWzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwIGQxKQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDMxWzRdCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKwordnA4ZV9maWx0X2JsazJkX3NwMTZ4MTZfbG9vcF9uZW9uCisgICAgdmxkMS51OCAgICAgICAgIHtkMjQsIGQyNX0sIFtscl0hCisgICAgdm11bGwudTggICAgICAgIHExLCBkMjIsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclswXSkKKyAgICB2bGQxLnU4ICAgICAgICAge2QyNiwgZDI3fSwgW2xyXSEKKyAgICB2bXVsbC51OCAgICAgICAgcTIsIGQyMywgZDAKKyAgICB2bGQxLnU4ICAgICAgICAge2QyOCwgZDI5fSwgW2xyXSEKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyNCwgZDAKKyAgICB2bGQxLnU4ICAgICAgICAge2QzMCwgZDMxfSwgW2xyXSEKKworICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDI1LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI2LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDI3LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDI4LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDI5LCBkMAorCisgICAgdm1sYWwudTggICAgICAgIHExLCBkMjQsIGQxICAgICAgICAgICAgIDsoc3JjX3B0cltwaXhlbF9zdGVwXSAqIEZpbHRlclsxXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTIsIGQyNSwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyNiwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyNywgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyOCwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyOSwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQzMCwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQzMSwgZDEKKworICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKworICAgIHZxcnNocm4udTE2ICAgIGQyLCBxMSwgIzcgICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2cXJzaHJuLnUxNiAgICBkMywgcTIsICM3CisgICAgdnFyc2hybi51MTYgICAgZDQsIHEzLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQ1LCBxNCwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkNiwgcTUsICM3CisgICAgdnFyc2hybi51MTYgICAgZDcsIHE2LCAjNworICAgIHZxcnNocm4udTE2ICAgIGQ4LCBxNywgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkOSwgcTgsICM3CisKKyAgICB2c3QxLnU4ICAgICAgICAge2QyLCBkM30sIFtyM10hICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZzdDEudTggICAgICAgICB7ZDQsIGQ1fSwgW3IzXSEKKyAgICB2c3QxLnU4ICAgICAgICAge2Q2LCBkN30sIFtyM10hCisgICAgdm1vdiAgICAgICAgICAgIHExMSwgcTE1CisgICAgdnN0MS51OCAgICAgICAgIHtkOCwgZDl9LCBbcjNdIQorCisgICAgYm5lICAgICAgICAgICAgIHZwOGVfZmlsdF9ibGsyZF9zcDE2eDE2X2xvb3BfbmVvbgorCisgICAgYiAgICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaXJzdHBhc3NfYmZpbHRlcjE2eDE2X29ubHkKKyAgICBtb3YgICAgICAgICAgICAgcjIsICM0ICAgICAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjNTI4ICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgdmR1cC44ICAgICAgICAgIGQwLCBkMzFbMF0gICAgICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwIGQxKQorICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDMxWzRdCisgICAgbW92ICAgICAgICAgICAgIHIzLCBzcAorCis7Rmlyc3QgUGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICgxNngxNikKK3ZwOGVfZmlsdF9ibGsyZF9mcG8xNngxNl9sb29wX25lb24KKyAgICB2bGQxLnU4ICAgICAgICAge2QyLCBkMywgZDR9LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgdmxkMS51OCAgICAgICAgIHtkNSwgZDYsIGQ3fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxMSwgZDEyLCBkMTN9LCBbcjBdLCByMQorCisgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KKyAgICBwbGQgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQorCisgICAgdm11bGwudTggICAgICAgIHE3LCBkMiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclswXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQzLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDUsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMCwgZDYsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMSwgZDgsIGQwCisgICAgdm11bGwudTggICAgICAgIHExMiwgZDksIGQwCisgICAgdm11bGwudTggICAgICAgIHExMywgZDExLCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxMTQsIGQxMiwgZDAKKworICAgIHZleHQuOCAgICAgICAgICBkMiwgZDIsIGQzLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgZDUsIGQ1LCBkNiwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDgsIGQ4LCBkOSwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDExLCBkMTEsIGQxMiwgIzEKKworICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDIsIGQxICAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMV0pCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkNSwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTExLCBkOCwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTEzLCBkMTEsIGQxCisKKyAgICB2ZXh0LjggICAgICAgICAgZDMsIGQzLCBkNCwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDYsIGQ2LCBkNywgIzEKKyAgICB2ZXh0LjggICAgICAgICAgZDksIGQ5LCBkMTAsICMxCisgICAgdmV4dC44ICAgICAgICAgIGQxMiwgZDEyLCBkMTMsICMxCisKKyAgICB2bWxhbC51OCAgICAgICAgcTgsIGQzLCBkMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzFdKQorICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQ2LCBkMQorICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQ5LCBkMQorICAgIHZtbGFsLnU4ICAgICAgICBxMTQsIGQxMiwgZDEKKworICAgIHN1YnMgICAgICAgICAgICByMiwgcjIsICMxCisKKyAgICB2cXJzaHJuLnUxNiAgICBkMTQsIHE3LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hybi51MTYgICAgZDE1LCBxOCwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMTYsIHE5LCAjNworICAgIHZxcnNocm4udTE2ICAgIGQxNywgcTEwLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQxOCwgcTExLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQxOSwgcTEyLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQyMCwgcTEzLCAjNworICAgIHZzdDEudTggICAgICAgICB7ZDE0LCBkMTV9LCBbcjNdISAgICAgICA7c3RvcmUgcmVzdWx0CisgICAgdnFyc2hybi51MTYgICAgZDIxLCBxMTQsICM3CisKKyAgICB2c3QxLnU4ICAgICAgICAge2QxNiwgZDE3fSwgW3IzXSEKKyAgICB2c3QxLnU4ICAgICAgICAge2QxOCwgZDE5fSwgW3IzXSEKKyAgICB2c3QxLnU4ICAgICAgICAge2QyMCwgZDIxfSwgW3IzXSEKKworICAgIGJuZSAgICAgICAgICAgICB2cDhlX2ZpbHRfYmxrMmRfZnBvMTZ4MTZfbG9vcF9uZW9uCisKKyAgICBiICAgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZWNvbmRwYXNzX2JmaWx0ZXIxNngxNl9vbmx5Cis7U2Vjb25kIHBhc3M6IDE2eDE2Cis7c2Vjb25kcGFzc19maWx0ZXIKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjNTI4ICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzMKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNCAgICAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICB2bGQxLnUzMiAgICAgICAge2QzMX0sIFtyM10gICAgICAgICAgICAgICAgIDtsb2FkIHNlY29uZF9wYXNzIGZpbHRlcgorICAgIHZsZDEudTggICAgICAgICB7ZDIyLCBkMjN9LCBbcjBdLCByMSAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICBtb3YgICAgICAgICAgICAgcjMsIHNwCisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQzMVswXSAgICAgICAgICAgICAgICAgIDtzZWNvbmRfcGFzcyBmaWx0ZXIgcGFyYW1ldGVycyAoZDAgZDEpCisgICAgdmR1cC44ICAgICAgICAgIGQxLCBkMzFbNF0KKwordnA4ZV9maWx0X2JsazJkX3NwbzE2eDE2X2xvb3BfbmVvbgorICAgIHZsZDEudTggICAgICAgICB7ZDI0LCBkMjV9LCBbcjBdLCByMQorICAgIHZtdWxsLnU4ICAgICAgICBxMSwgZDIyLCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMF0pCisgICAgdmxkMS51OCAgICAgICAgIHtkMjYsIGQyN30sIFtyMF0sIHIxCisgICAgdm11bGwudTggICAgICAgIHEyLCBkMjMsIGQwCisgICAgdmxkMS51OCAgICAgICAgIHtkMjgsIGQyOX0sIFtyMF0sIHIxCisgICAgdm11bGwudTggICAgICAgIHEzLCBkMjQsIGQwCisgICAgdmxkMS51OCAgICAgICAgIHtkMzAsIGQzMX0sIFtyMF0sIHIxCisKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyNSwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyNiwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyNywgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyOCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyOSwgZDAKKworICAgIHZtbGFsLnU4ICAgICAgICBxMSwgZDI0LCBkMSAgICAgICAgICAgICA7KHNyY19wdHJbcGl4ZWxfc3RlcF0gKiBGaWx0ZXJbMV0pCisgICAgdm1sYWwudTggICAgICAgIHEyLCBkMjUsIGQxCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjYsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjcsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjgsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjksIGQxCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMzAsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMzEsIGQxCisKKyAgICB2cXJzaHJuLnUxNiAgICBkMiwgcTEsICM3ICAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hybi51MTYgICAgZDMsIHEyLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQ0LCBxMywgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkNSwgcTQsICM3CisgICAgdnFyc2hybi51MTYgICAgZDYsIHE1LCAjNworICAgIHZxcnNocm4udTE2ICAgIGQ3LCBxNiwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkOCwgcTcsICM3CisgICAgdnFyc2hybi51MTYgICAgZDksIHE4LCAjNworCisgICAgdnN0MS51OCAgICAgICAgIHtkMiwgZDN9LCBbcjNdISAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgdnN0MS51OCAgICAgICAgIHtkNCwgZDV9LCBbcjNdIQorICAgIHZtb3YgICAgICAgICAgICBxMTEsIHExNQorICAgIHZzdDEudTggICAgICAgICB7ZDYsIGQ3fSwgW3IzXSEKKyAgICB2c3QxLnU4ICAgICAgICAge2Q4LCBkOX0sIFtyM10hCisKKyAgICBibmUgICAgICAgICAgICAgdnA4ZV9maWx0X2JsazJkX3NwbzE2eDE2X2xvb3BfbmVvbgorCisgICAgYiAgICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzt2YXJpYW5jZTE2eDE2CitzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9uZW9uCisgICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KKyAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCisgICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKKworICAgIHN1YiAgICAgICAgICAgICByMywgcjMsICMyNTYKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjOAorCitzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9uZW9uX2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IzXSEgICAgICAgICAgICAgICAgIDtMb2FkIHVwIHNvdXJjZSBhbmQgcmVmZXJlbmNlCisgICAgdmxkMS44ICAgICAgICAgIHtxMn0sIFtyNF0sIHI1CisgICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyM10hCisgICAgdmxkMS44ICAgICAgICAgIHtxM30sIFtyNF0sIHI1CisKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkMCwgZDQgICAgICAgICAgICAgICAgIDtkaWZmCisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1CisgICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2CisgICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtzdW0KKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyMiwgZDIyICAgICAgICAgICAgICAgIDtzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjMsIGQyMworCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTIKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNCwgZDI0CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI1LCBkMjUKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI2LCBkMjYKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjcsIGQyNworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTE0CisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjgsIGQyOAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyOSwgZDI5CisKKyAgICBibmUgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9sb29wCisKKyAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxOSwgcTEwICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHNzZQorICAgIHZwYWRkbC5zMzIgICAgICBxMCwgcTggICAgICAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3VtCisKKyAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAorICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCisgICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKKworICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCisgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyNl0gICAgICAgICAgICAgICA7c3RvcmUgc3NlCisgICAgdnNoci51MzIgICAgICAgIGQxMCwgZDEwLCAjOAorICAgIHZzdWIudTMyICAgICAgICBkMCwgZDEsIGQxMAorCisgICAgYWRkICAgICAgICAgICAgIHNwLCBzcCwgIzUyOAorICAgIHZtb3YuMzIgICAgICAgICByMCwgZDBbMF0gICAgICAgICAgICAgICAgICAgO3JldHVybgorCisgICAgcG9wICAgICAgICAgICAgIHtyNC1yNixwY30KKworICAgIEVORFAKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2UxNngxNnNfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2c19uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTViZTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2UxNngxNnNfbmVvbi5hc20KQEAgLTAsMCArMSw1NzIgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X25lb258CisgICAgRVhQT1JUICB8dnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2c19uZW9ufAorICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorO3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbmVvbgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIHIwCis7ICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwgIHIxCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsICByMgorOyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwgICByMworOyAgICB1bnNpZ25lZCBpbnQgKnNzZQorOyk7Cis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX25lb258IFBST0MKKyAgICBwdXNoICAgICAgICAgICAge2xyfQorCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCisgICAgbGRyICAgICAgICAgICAgIGxyLCBbc3AsICM0XSAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCisgICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KKyAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCisgICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKKworO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMTZ4MTYpCit2cDhfZmlsdF9mcG8xNngxNnNfNF8wX2xvb3BfbmVvbgorICAgIHZsZDEudTggICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgdmxkMS44ICAgICAgICAgIHtxMTF9LCBbcjJdLCByMworICAgIHZsZDEudTggICAgICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbcjBdLCByMQorICAgIHZsZDEuOCAgICAgICAgICB7cTEyfSwgW3IyXSwgcjMKKyAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdLCByMQorICAgIHZsZDEuOCAgICAgICAgICB7cTEzfSwgW3IyXSwgcjMKKyAgICB2bGQxLnU4ICAgICAgICAge2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyMF0sIHIxCisKKyAgICA7cGxkICAgICAgICAgICAgICAgIFtyMF0KKyAgICA7cGxkICAgICAgICAgICAgICAgIFtyMCwgcjFdCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCisKKyAgICB2ZXh0LjggICAgICAgICAgcTEsIHEwLCBxMSwgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgdmV4dC44ICAgICAgICAgIHEzLCBxMiwgcTMsICMxCisgICAgdmV4dC44ICAgICAgICAgIHE1LCBxNCwgcTUsICMxCisgICAgdmV4dC44ICAgICAgICAgIHE3LCBxNiwgcTcsICMxCisKKyAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdK3NyY19wdHJbMV0pL3JvdW5kL3NoaWZ0IHJpZ2h0IDEKKyAgICB2bGQxLjggICAgICAgICAge3ExNH0sIFtyMl0sIHIzCisgICAgdnJoYWRkLnU4ICAgICAgIHExLCBxMiwgcTMKKyAgICB2cmhhZGQudTggICAgICAgcTIsIHE0LCBxNQorICAgIHZyaGFkZC51OCAgICAgICBxMywgcTYsIHE3CisKKyAgICB2c3VibC51OCAgICAgICAgcTQsIGQwLCBkMjIgICAgICAgICAgICAgICAgIDtkaWZmCisgICAgdnN1YmwudTggICAgICAgIHE1LCBkMSwgZDIzCisgICAgdnN1YmwudTggICAgICAgIHE2LCBkMiwgZDI0CisgICAgdnN1YmwudTggICAgICAgIHE3LCBkMywgZDI1CisgICAgdnN1YmwudTggICAgICAgIHEwLCBkNCwgZDI2CisgICAgdnN1YmwudTggICAgICAgIHExLCBkNSwgZDI3CisgICAgdnN1YmwudTggICAgICAgIHEyLCBkNiwgZDI4CisgICAgdnN1YmwudTggICAgICAgIHEzLCBkNywgZDI5CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHE0ICAgICAgICAgICAgICAgICAgICAgO3N1bQorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDgsIGQ4ICAgICAgICAgICAgICAgIDtzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkOSwgZDkKKworICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTUKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQxMCwgZDEwCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDExLCBkMTEKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHE2CisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMTIsIGQxMgorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQxMywgZDEzCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxNworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDE0LCBkMTQKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMTUsIGQxNQorCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMCAgICAgICAgICAgICAgICAgICAgIDtzdW0KKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQwLCBkMCAgICAgICAgICAgICAgICA7c3NlCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDEsIGQxCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMQorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIsIGQyCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDMsIGQzCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDQsIGQ0CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDUsIGQ1CisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDYsIGQ2CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDcsIGQ3CisKKyAgICBibmUgICAgICAgICAgICAgdnA4X2ZpbHRfZnBvMTZ4MTZzXzRfMF9sb29wX25lb24KKworICAgIHZhZGQudTMyICAgICAgICBxMTAsIHE5LCBxMTAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3NlCisgICAgdnBhZGRsLnMzMiAgICAgIHEwLCBxOCAgICAgICAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzdW0KKworICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTEwCisgICAgdmFkZC5zNjQgICAgICAgIGQwLCBkMCwgZDEKKyAgICB2YWRkLnU2NCAgICAgICAgZDEsIGQyLCBkMworCisgICAgdm11bGwuczMyICAgICAgIHE1LCBkMCwgZDAKKyAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgW2xyXSAgICAgICAgICAgICAgIDtzdG9yZSBzc2UKKyAgICB2c2hyLnUzMiAgICAgICAgZDEwLCBkMTAsICM4CisgICAgdnN1Yi51MzIgICAgICAgIGQwLCBkMSwgZDEwCisKKyAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDtyZXR1cm4KKyAgICBwb3AgICAgICAgICAgICAge3BjfQorICAgIEVORFAKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorO3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIHIwCis7ICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwgIHIxCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsICByMgorOyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwgICByMworOyAgICB1bnNpZ25lZCBpbnQgKnNzZQorOyk7Cis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICAgICAge2xyfQorCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQgICAgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCisKKyAgICB2bGQxLnU4ICAgICAgICAge3EwfSwgW3IwXSwgcjEgICAgICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgbGRyICAgICAgICAgICAgIGxyLCBbc3AsICM0XSAgICAgICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKKworICAgIHZtb3YuaTggICAgICAgICBxOCwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E4IC0gc3VtCisgICAgdm1vdi5pOCAgICAgICAgIHE5LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTksIHExMCAtIHNzZQorICAgIHZtb3YuaTggICAgICAgICBxMTAsICMwCisKK3ZwOF9maWx0X3NwbzE2eDE2c18wXzRfbG9vcF9uZW9uCisgICAgdmxkMS51OCAgICAgICAgIHtxMn0sIFtyMF0sIHIxCisgICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyMl0sIHIzCisgICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCisgICAgdmxkMS44ICAgICAgICAgIHtxM30sIFtyMl0sIHIzCisgICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCisgICAgdmxkMS44ICAgICAgICAgIHtxNX0sIFtyMl0sIHIzCisgICAgdmxkMS51OCAgICAgICAgIHtxMTV9LCBbcjBdLCByMQorCisgICAgdnJoYWRkLnU4ICAgICAgIHEwLCBxMCwgcTIKKyAgICB2bGQxLjggICAgICAgICAge3E3fSwgW3IyXSwgcjMKKyAgICB2cmhhZGQudTggICAgICAgcTIsIHEyLCBxNAorICAgIHZyaGFkZC51OCAgICAgICBxNCwgcTQsIHE2CisgICAgdnJoYWRkLnU4ICAgICAgIHE2LCBxNiwgcTE1CisKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkMCwgZDIgICAgICAgICAgICAgICAgIDtkaWZmCisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQzCisgICAgdnN1YmwudTggICAgICAgIHExMywgZDQsIGQ2CisgICAgdnN1YmwudTggICAgICAgIHExNCwgZDUsIGQ3CisgICAgdnN1YmwudTggICAgICAgIHEwLCBkOCwgZDEwCisgICAgdnN1YmwudTggICAgICAgIHExLCBkOSwgZDExCisgICAgdnN1YmwudTggICAgICAgIHEyLCBkMTIsIGQxNAorICAgIHZzdWJsLnU4ICAgICAgICBxMywgZDEzLCBkMTUKKworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTExICAgICAgICAgICAgICAgICAgICAgO3N1bQorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIyLCBkMjIgICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI0LCBkMjQKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjUsIGQyNQorICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEzCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjYsIGQyNgorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNywgZDI3CisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTQKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyOCwgZDI4CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI5LCBkMjkKKworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTAgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMCwgZDAgICAgICAgICAgICAgICAgIDtzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMSwgZDEKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMiwgZDIKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMywgZDMKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEyCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNCwgZDQKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkNSwgZDUKKworICAgIHZtb3YgICAgICAgICAgICBxMCwgcTE1CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEzCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNiwgZDYKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkNywgZDcKKworICAgIGJuZSAgICAgICAgICAgICB2cDhfZmlsdF9zcG8xNngxNnNfMF80X2xvb3BfbmVvbgorCisgICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKKyAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQorCisgICAgdnBhZGRsLnUzMiAgICAgIHExLCBxMTAKKyAgICB2YWRkLnM2NCAgICAgICAgZDAsIGQwLCBkMQorICAgIHZhZGQudTY0ICAgICAgICBkMSwgZDIsIGQzCisKKyAgICB2bXVsbC5zMzIgICAgICAgcTUsIGQwLCBkMAorICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbbHJdICAgICAgICAgICAgICAgO3N0b3JlIHNzZQorICAgIHZzaHIudTMyICAgICAgICBkMTAsIGQxMCwgIzgKKyAgICB2c3ViLnUzMiAgICAgICAgZDAsIGQxLCBkMTAKKworICAgIHZtb3YuMzIgICAgICAgICByMCwgZDBbMF0gICAgICAgICAgICAgICAgICAgO3JldHVybgorICAgIHBvcCAgICAgICAgICAgICB7cGN9CisgICAgRU5EUAorCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7dW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfbmVvbgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIHIwCis7ICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwgIHIxCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsICByMgorOyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwgICByMworOyAgICB1bnNpZ25lZCBpbnQgKnNzZQorOyk7Cis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAgICAgIHtscn0KKworICAgIHZsZDEudTggICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCisKKyAgICBsZHIgICAgICAgICAgICAgbHIsIFtzcCwgIzRdICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKKyAgICB2bW92Lmk4ICAgICAgICAgcTEzLCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KKyAgICB2ZXh0LjggICAgICAgICAgcTEsIHEwLCBxMSwgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisKKyAgICB2bW92Lmk4ICAgICAgICAgcTE0LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTksIHExMCAtIHNzZQorICAgIHZtb3YuaTggICAgICAgICBxMTUsICMwCisKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNCAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdK3NyY19wdHJbMV0pL3JvdW5kL3NoaWZ0IHJpZ2h0IDEKKworO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMTd4MTYpCit2cDhfZmlsdDE2eDE2c180XzRfbG9vcF9uZW9uCisgICAgdmxkMS51OCAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkOCwgZDksIGQxMCwgZDExfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjBdLCByMQorCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjBdCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjAsIHIxXQorICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQorCisgICAgdmV4dC44ICAgICAgICAgIHEzLCBxMiwgcTMsICMxICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQorICAgIHZleHQuOCAgICAgICAgICBxNSwgcTQsIHE1LCAjMQorICAgIHZleHQuOCAgICAgICAgICBxNywgcTYsIHE3LCAjMQorICAgIHZleHQuOCAgICAgICAgICBxOSwgcTgsIHE5LCAjMQorCisgICAgdnJoYWRkLnU4ICAgICAgIHExLCBxMiwgcTMgICAgICAgICAgICAgIDsoc3JjX3B0clswXStzcmNfcHRyWzFdKS9yb3VuZC9zaGlmdCByaWdodCAxCisgICAgdnJoYWRkLnU4ICAgICAgIHEyLCBxNCwgcTUKKyAgICB2cmhhZGQudTggICAgICAgcTMsIHE2LCBxNworICAgIHZyaGFkZC51OCAgICAgICBxNCwgcTgsIHE5CisKKyAgICB2bGQxLjggICAgICAgICAge3E1fSwgW3IyXSwgcjMKKyAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMQorICAgIHZsZDEuOCAgICAgICAgICB7cTZ9LCBbcjJdLCByMworICAgIHZyaGFkZC51OCAgICAgICBxMSwgcTEsIHEyCisgICAgdmxkMS44ICAgICAgICAgIHtxN30sIFtyMl0sIHIzCisgICAgdnJoYWRkLnU4ICAgICAgIHEyLCBxMiwgcTMKKyAgICB2bGQxLjggICAgICAgICAge3E4fSwgW3IyXSwgcjMKKyAgICB2cmhhZGQudTggICAgICAgcTMsIHEzLCBxNAorCisgICAgdnN1YmwudTggICAgICAgIHE5LCBkMCwgZDEwICAgICAgICAgICAgICAgICA7ZGlmZgorICAgIHZzdWJsLnU4ICAgICAgICBxMTAsIGQxLCBkMTEKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkMiwgZDEyCisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDMsIGQxMworCisgICAgdnN1YmwudTggICAgICAgIHEwLCBkNCwgZDE0ICAgICAgICAgICAgICAgICA7ZGlmZgorICAgIHZzdWJsLnU4ICAgICAgICBxMSwgZDUsIGQxNQorICAgIHZzdWJsLnU4ICAgICAgICBxNSwgZDYsIGQxNgorICAgIHZzdWJsLnU4ICAgICAgICBxNiwgZDcsIGQxNworCisgICAgdnBhZGFsLnMxNiAgICAgIHExMywgcTkgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDE4LCBkMTggICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQxOSwgZDE5CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxMTAgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDIwLCBkMjAgICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQyMSwgZDIxCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxMTEgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDIyLCBkMjIgICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQyMywgZDIzCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxMTIgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDI0LCBkMjQgICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQyNSwgZDI1CisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxMCAgICAgICAgICAgICAgICAgICAgIDtzdW0KKyAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMCwgZDAgICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQxLCBkMQorCisgICAgdnBhZGFsLnMxNiAgICAgIHExMywgcTEgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDIsIGQyICAgICAgICAgICAgICAgIDtzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTE1LCBkMywgZDMKKworICAgIHZwYWRhbC5zMTYgICAgICBxMTMsIHE1ICAgICAgICAgICAgICAgICAgICAgO3N1bQorICAgIHZtbGFsLnMxNiAgICAgICBxMTQsIGQxMCwgZDEwICAgICAgICAgICAgICAgIDtzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTE1LCBkMTEsIGQxMQorCisgICAgdm1vdiAgICAgICAgICAgIHEwLCBxNAorCisgICAgdnBhZGFsLnMxNiAgICAgIHExMywgcTYgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDEyLCBkMTIgICAgICAgICAgICAgICAgO3NzZQorICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQxMywgZDEzCisKKyAgICBibmUgICAgICAgICAgICAgdnA4X2ZpbHQxNngxNnNfNF80X2xvb3BfbmVvbgorCisgICAgdmFkZC51MzIgICAgICAgIHExNSwgcTE0LCBxMTUgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3NlCisgICAgdnBhZGRsLnMzMiAgICAgIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3VtCisKKyAgICB2cGFkZGwudTMyICAgICAgcTEsIHExNQorICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCisgICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKKworICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCisgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtscl0gICAgICAgICAgICAgICA7c3RvcmUgc3NlCisgICAgdnNoci51MzIgICAgICAgIGQxMCwgZDEwLCAjOAorICAgIHZzdWIudTMyICAgICAgICBkMCwgZDEsIGQxMAorCisgICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCisgICAgcG9wICAgICAgICAgICAgIHtwY30KKyAgICBFTkRQCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsgcjAgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCis7IHIxICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgcjIgICAgaW50ICB4b2Zmc2V0LAorOyByMyAgICBpbnQgIHlvZmZzZXQsCis7IHN0YWNrIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCis7IHN0YWNrIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorOyBzdGFjayB1bnNpZ25lZCBpbnQgKnNzZQorO25vdGU6IGluIHZwOF9maW5kX2Jlc3RfaGFsZl9waXhlbF9zdGVwKCkoY2FsbGVkIHdoZW4gODxTcGVlZDwxNSksIGFuZCBmaXJzdCBjYWxsIG9mIHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXAoKQorOyhjYWxsZWQgd2hlbiBzcGVlZDw9OCkuIHhvZmZzZXQveW9mZnNldCBjYW4gb25seSBiZSA0IG9yIDAsIHdoaWNoIG1lYW5zIGVpdGhlciBieSBwYXNzIHRoZSBmaWx0ZXIsCis7b3IgZmlsdGVyIGNvZWZmIGlzIHs2NCwgNjR9LiBUaGlzIHNpbXBsaWZpZWQgcHJvZ3JhbSBvbmx5IHdvcmtzIGluIHRoaXMgc2l0dWF0aW9uLgorO25vdGU6IEl0IGhhcHBlbnMgdGhhdCBib3RoIHhvZmZzZXQgYW5kIHlvZmZzZXQgYXJlIHplcm8uIFRoaXMgY2FuIGJlIGhhbmRsZWQgaW4gYyBjb2RlIGxhdGVyLgorCit8dnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2c19uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtzcCwgIzhdICAgICAgICAgICAgO2xvYWQgKmRzdF9wdHIgZnJvbSBzdGFjaworICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzEyXSAgICAgICAgICA7bG9hZCBkc3RfcGl4ZWxzX3Blcl9saW5lIGZyb20gc3RhY2sKKyAgICBsZHIgICAgICAgICAgICAgbHIsIFtzcCwgIzE2XSAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCisKKyAgICBjbXAgICAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCisgICAgYmVxICAgICAgICAgICAgIHNlY29uZHBhc3NfYmZpbHRlcjE2eDE2c19vbmx5CisKKyAgICBjbXAgICAgICAgICAgICAgcjMsICMwICAgICAgICAgICAgICAgICAgO3NraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAorICAgIGJlcSAgICAgICAgICAgICBmaXJzdHBhc3NfYmZpbHRlcjE2eDE2c19vbmx5CisKKyAgICB2bGQxLnU4ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHN1YiAgICAgICAgICAgICBzcCwgc3AsICMyNTYgICAgICAgICAgICA7cmVzZXJ2ZSBzcGFjZSBvbiBzdGFjayBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAgICB2ZXh0LjggICAgICAgICAgcTEsIHEwLCBxMSwgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCisgICAgbW92ICAgICAgICAgICAgIHIzLCBzcAorICAgIG1vdiAgICAgICAgICAgICByMiwgIzQgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCisgICAgdnJoYWRkLnU4ICAgICAgIHEwLCBxMCwgcTEgICAgICAgICAgICAgIDsoc3JjX3B0clswXStzcmNfcHRyWzFdKS9yb3VuZC9zaGlmdCByaWdodCAxCisKKztGaXJzdCBQYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDE3eDE2KQordnA4ZV9maWx0X2JsazJkX2ZwMTZ4MTZzX2xvb3BfbmVvbgorICAgIHZsZDEudTggICAgICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMTIsIGQxMywgZDE0LCBkMTV9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3IwXSwgcjEKKworICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwXQorICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwLCByMV0KKyAgICA7cGxkICAgICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KKworICAgIHZleHQuOCAgICAgICAgICBxMywgcTIsIHEzLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2ZXh0LjggICAgICAgICAgcTUsIHE0LCBxNSwgIzEKKyAgICB2ZXh0LjggICAgICAgICAgcTcsIHE2LCBxNywgIzEKKyAgICB2ZXh0LjggICAgICAgICAgcTksIHE4LCBxOSwgIzEKKworICAgIHZyaGFkZC51OCAgICAgICBxMSwgcTIsIHEzICAgICAgICAgICAgICA7KHNyY19wdHJbMF0rc3JjX3B0clsxXSkvcm91bmQvc2hpZnQgcmlnaHQgMQorICAgIHZyaGFkZC51OCAgICAgICBxMiwgcTQsIHE1CisgICAgdnJoYWRkLnU4ICAgICAgIHEzLCBxNiwgcTcKKyAgICB2cmhhZGQudTggICAgICAgcTQsIHE4LCBxOQorCisgICAgdnJoYWRkLnU4ICAgICAgIHEwLCBxMCwgcTEKKyAgICB2cmhhZGQudTggICAgICAgcTEsIHExLCBxMgorICAgIHZyaGFkZC51OCAgICAgICBxMiwgcTIsIHEzCisgICAgdnJoYWRkLnU4ICAgICAgIHEzLCBxMywgcTQKKworICAgIHN1YnMgICAgICAgICAgICByMiwgcjIsICMxCisgICAgdnN0MS51OCAgICAgICAgIHtkMCwgZDEgLGQyLCBkM30sIFtyM10hICAgICAgICAgO3N0b3JlIHJlc3VsdAorICAgIHZtb3YgICAgICAgICAgICBxMCwgcTQKKyAgICB2c3QxLnU4ICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IzXSEKKworICAgIGJuZSAgICAgICAgICAgICB2cDhlX2ZpbHRfYmxrMmRfZnAxNngxNnNfbG9vcF9uZW9uCisKKyAgICBiICAgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb24KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaXJzdHBhc3NfYmZpbHRlcjE2eDE2c19vbmx5CisgICAgbW92ICAgICAgICAgICAgIHIyLCAjMiAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMjU2ICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgbW92ICAgICAgICAgICAgIHIzLCBzcAorCis7Rmlyc3QgUGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICgxNngxNikKK3ZwOGVfZmlsdF9ibGsyZF9mcG8xNngxNnNfbG9vcF9uZW9uCisgICAgdmxkMS51OCAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICB2bGQxLnU4ICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IwXSwgcjEKKworICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwXQorICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwLCByMV0KKyAgICA7cGxkICAgICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KKworICAgIHZleHQuOCAgICAgICAgICBxMSwgcTAsIHExLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KKyAgICB2bGQxLnU4ICAgICAgICAge2QxNiwgZDE3LCBkMTgsIGQxOX0sIFtyMF0sIHIxCisgICAgdmV4dC44ICAgICAgICAgIHEzLCBxMiwgcTMsICMxCisgICAgdmxkMS51OCAgICAgICAgIHtkMjAsIGQyMSwgZDIyLCBkMjN9LCBbcjBdLCByMQorICAgIHZleHQuOCAgICAgICAgICBxNSwgcTQsIHE1LCAjMQorICAgIHZsZDEudTggICAgICAgICB7ZDI0LCBkMjUsIGQyNiwgZDI3fSwgW3IwXSwgcjEKKyAgICB2ZXh0LjggICAgICAgICAgcTcsIHE2LCBxNywgIzEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyOCwgZDI5LCBkMzAsIGQzMX0sIFtyMF0sIHIxCisgICAgdmV4dC44ICAgICAgICAgIHE5LCBxOCwgcTksICMxCisgICAgdmV4dC44ICAgICAgICAgIHExMSwgcTEwLCBxMTEsICMxCisgICAgdmV4dC44ICAgICAgICAgIHExMywgcTEyLCBxMTMsICMxCisgICAgdmV4dC44ICAgICAgICAgIHExNSwgcTE0LCBxMTUsICMxCisKKyAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdK3NyY19wdHJbMV0pL3JvdW5kL3NoaWZ0IHJpZ2h0IDEKKyAgICB2cmhhZGQudTggICAgICAgcTEsIHEyLCBxMworICAgIHZyaGFkZC51OCAgICAgICBxMiwgcTQsIHE1CisgICAgdnJoYWRkLnU4ICAgICAgIHEzLCBxNiwgcTcKKyAgICB2cmhhZGQudTggICAgICAgcTQsIHE4LCBxOQorICAgIHZyaGFkZC51OCAgICAgICBxNSwgcTEwLCBxMTEKKyAgICB2cmhhZGQudTggICAgICAgcTYsIHExMiwgcTEzCisgICAgdnJoYWRkLnU4ICAgICAgIHE3LCBxMTQsIHExNQorCisgICAgc3VicyAgICAgICAgICAgIHIyLCByMiwgIzEKKworICAgIHZzdDEudTggICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjNdISAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLnU4ICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IzXSEKKyAgICB2c3QxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjNdIQorICAgIHZzdDEudTggICAgICAgICB7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IzXSEKKworICAgIGJuZSAgICAgICAgICAgICB2cDhlX2ZpbHRfYmxrMmRfZnBvMTZ4MTZzX2xvb3BfbmVvbgorCisgICAgYiAgICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTE2eDE2c19uZW9uCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NlY29uZHBhc3NfYmZpbHRlcjE2eDE2c19vbmx5CisgICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzI1NiAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQorCisgICAgbW92ICAgICAgICAgICAgIHIyLCAjMiAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKKyAgICB2bGQxLnU4ICAgICAgICAge2QwLCBkMX0sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICBtb3YgICAgICAgICAgICAgcjMsIHNwCisKK3ZwOGVfZmlsdF9ibGsyZF9zcG8xNngxNnNfbG9vcF9uZW9uCisgICAgdmxkMS51OCAgICAgICAgIHtkMiwgZDN9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDQsIGQ1fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2Q2LCBkN30sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkOCwgZDl9LCBbcjBdLCByMQorCisgICAgdnJoYWRkLnU4ICAgICAgIHEwLCBxMCwgcTEKKyAgICB2bGQxLnU4ICAgICAgICAge2QxMCwgZDExfSwgW3IwXSwgcjEKKyAgICB2cmhhZGQudTggICAgICAgcTEsIHExLCBxMgorICAgIHZsZDEudTggICAgICAgICB7ZDEyLCBkMTN9LCBbcjBdLCByMQorICAgIHZyaGFkZC51OCAgICAgICBxMiwgcTIsIHEzCisgICAgdmxkMS51OCAgICAgICAgIHtkMTQsIGQxNX0sIFtyMF0sIHIxCisgICAgdnJoYWRkLnU4ICAgICAgIHEzLCBxMywgcTQKKyAgICB2bGQxLnU4ICAgICAgICAge2QxNiwgZDE3fSwgW3IwXSwgcjEKKyAgICB2cmhhZGQudTggICAgICAgcTQsIHE0LCBxNQorICAgIHZyaGFkZC51OCAgICAgICBxNSwgcTUsIHE2CisgICAgdnJoYWRkLnU4ICAgICAgIHE2LCBxNiwgcTcKKyAgICB2cmhhZGQudTggICAgICAgcTcsIHE3LCBxOAorCisgICAgc3VicyAgICAgICAgICAgIHIyLCByMiwgIzEKKworICAgIHZzdDEudTggICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjNdISAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2bW92ICAgICAgICAgICAgcTAsIHE4CisgICAgdnN0MS51OCAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtyM10hCisgICAgdnN0MS51OCAgICAgICAgIHtkOCwgZDksIGQxMCwgZDExfSwgW3IzXSEgICAgICAgICAgIDtzdG9yZSByZXN1bHQKKyAgICB2c3QxLnU4ICAgICAgICAge2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyM10hCisKKyAgICBibmUgICAgICAgICAgICAgdnA4ZV9maWx0X2JsazJkX3NwbzE2eDE2c19sb29wX25lb24KKworICAgIGIgICAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNnNfbmVvbgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorO3ZhcmlhbmNlMTZ4MTYKK3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2c19uZW9uCisgICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KKyAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCisgICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKKworICAgIHN1YiAgICAgICAgICAgICByMywgcjMsICMyNTYKKyAgICBtb3YgICAgICAgICAgICAgcjIsICM0CisKK3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2c19uZW9uX2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IzXSEgICAgICAgICAgICAgICAgIDtMb2FkIHVwIHNvdXJjZSBhbmQgcmVmZXJlbmNlCisgICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyNF0sIHIxMgorICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjNdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCBbcjRdLCByMTIKKyAgICB2bGQxLjggICAgICAgICAge3E0fSwgW3IzXSEKKyAgICB2bGQxLjggICAgICAgICAge3E1fSwgW3I0XSwgcjEyCisgICAgdmxkMS44ICAgICAgICAgIHtxNn0sIFtyM10hCisgICAgdmxkMS44ICAgICAgICAgIHtxN30sIFtyNF0sIHIxMgorCisgICAgdnN1YmwudTggICAgICAgIHExMSwgZDAsIGQyICAgICAgICAgICAgICAgICA7ZGlmZgorICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQxLCBkMworICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQ0LCBkNgorICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQ1LCBkNworICAgIHZzdWJsLnU4ICAgICAgICBxMCwgZDgsIGQxMAorICAgIHZzdWJsLnU4ICAgICAgICBxMSwgZDksIGQxMQorICAgIHZzdWJsLnU4ICAgICAgICBxMiwgZDEyLCBkMTQKKyAgICB2c3VibC51OCAgICAgICAgcTMsIGQxMywgZDE1CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtzdW0KKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyMiwgZDIyICAgICAgICAgICAgICAgIDtzc2UKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjMsIGQyMworCisgICAgc3VicyAgICAgICAgICAgIHIyLCByMiwgIzEKKworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEyCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjQsIGQyNAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNSwgZDI1CisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTMKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNiwgZDI2CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI3LCBkMjcKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExNAorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI4LCBkMjgKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjksIGQyOQorCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMCAgICAgICAgICAgICAgICAgICAgIDtzdW0KKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQwLCBkMCAgICAgICAgICAgICAgICA7c3NlCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDEsIGQxCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMQorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIsIGQyCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDMsIGQzCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDQsIGQ0CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDUsIGQ1CisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDYsIGQ2CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDcsIGQ3CisKKyAgICBibmUgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb25fbG9vcAorCisgICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKKyAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQorCisgICAgdnBhZGRsLnUzMiAgICAgIHExLCBxMTAKKyAgICB2YWRkLnM2NCAgICAgICAgZDAsIGQwLCBkMQorICAgIHZhZGQudTY0ICAgICAgICBkMSwgZDIsIGQzCisKKyAgICB2bXVsbC5zMzIgICAgICAgcTUsIGQwLCBkMAorICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbbHJdICAgICAgICAgICAgICAgO3N0b3JlIHNzZQorICAgIHZzaHIudTMyICAgICAgICBkMTAsIGQxMCwgIzgKKyAgICB2c3ViLnUzMiAgICAgICAgZDAsIGQxLCBkMTAKKworICAgIGFkZCAgICAgICAgICAgICBzcCwgc3AsICMyNTYKKyAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDtyZXR1cm4KKworICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorICAgIEVORFAKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2U4eDhfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTh4OF9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI2ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2U4eDhfbmVvbi5hc20KQEAgLTAsMCArMSwyMjIgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb258CisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyByMiAgICBpbnQgIHhvZmZzZXQsCis7IHIzICAgIGludCAgeW9mZnNldCwKKzsgc3RhY2socjQpIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCis7IHN0YWNrKHI1KSBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKzsgc3RhY2socjYpIHVuc2lnbmVkIGludCAqc3NlCis7bm90ZTogbW9zdCBvZiB0aGUgY29kZSBpcyBjb3BpZWQgZnJvbSBiaWxpbmVhcl9wcmVkaWN0OHg4X25lb24gYW5kIHZwOF92YXJpYW5jZTh4OF9uZW9uLgorCit8dnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNSwgbHJ9CisKKyAgICBhZHIgICAgICAgICAgICAgcjEyLCBiaWxpbmVhcl90YXBzX2NvZWZmCisgICAgbGRyICAgICAgICAgICAgIHI0LCBbc3AsICMxMl0gICAgICAgICAgIDtsb2FkICpkc3RfcHRyIGZyb20gc3RhY2sKKyAgICBsZHIgICAgICAgICAgICAgcjUsIFtzcCwgIzE2XSAgICAgICAgICAgO2xvYWQgZHN0X3BpeGVsc19wZXJfbGluZSBmcm9tIHN0YWNrCisgICAgbGRyICAgICAgICAgICAgIGxyLCBbc3AsICMyMF0gICAgICAgICAgIDtsb2FkICpzc2UgZnJvbSBzdGFjaworCisgICAgY21wICAgICAgICAgICAgIHIyLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAorICAgIGJlcSAgICAgICAgICAgICBza2lwX2ZpcnN0cGFzc19maWx0ZXIKKworO0ZpcnN0IHBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoOXg4KQorICAgIGFkZCAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICMzICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgorCisgICAgdmxkMS51OCAgICAgICAgIHtxMX0sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCisgICAgdmxkMS51MzIgICAgICAgIHtkMzF9LCBbcjJdICAgICAgICAgICAgIDtsb2FkIGZpcnN0X3Bhc3MgZmlsdGVyCisgICAgdmxkMS51OCAgICAgICAgIHtxMn0sIFtyMF0sIHIxCisgICAgdmR1cC44ICAgICAgICAgIGQwLCBkMzFbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAgZDEpCisgICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxCisgICAgdmR1cC44ICAgICAgICAgIGQxLCBkMzFbNF0KKyAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKKworICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDIsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMF0pCisgICAgdm11bGwudTggICAgICAgIHE3LCBkNCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQ2LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDgsIGQwCisKKyAgICB2ZXh0LjggICAgICAgICAgZDMsIGQyLCBkMywgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQorICAgIHZleHQuOCAgICAgICAgICBkNSwgZDQsIGQ1LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkNywgZDYsIGQ3LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkOSwgZDgsIGQ5LCAjMQorCisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMywgZDEgICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIEZpbHRlclsxXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQ1LCBkMQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDcsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkOSwgZDEKKworICAgIHZsZDEudTggICAgICAgICB7cTF9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHZxcnNocm4udTE2ICAgIGQyMiwgcTYsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKKyAgICB2bGQxLnU4ICAgICAgICAge3EyfSwgW3IwXSwgcjEKKyAgICB2cXJzaHJuLnUxNiAgICBkMjMsIHE3LCAjNworICAgIHZsZDEudTggICAgICAgICB7cTN9LCBbcjBdLCByMQorICAgIHZxcnNocm4udTE2ICAgIGQyNCwgcTgsICM3CisgICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCisgICAgdnFyc2hybi51MTYgICAgZDI1LCBxOSwgIzcKKworICAgIDtmaXJzdF9wYXNzIGZpbHRlcmluZyBvbiB0aGUgcmVzdCA1LWxpbmUgZGF0YQorICAgIHZsZDEudTggICAgICAgICB7cTV9LCBbcjBdLCByMQorCisgICAgdm11bGwudTggICAgICAgIHE2LCBkMiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclswXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQ0LCBkMAorICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDYsIGQwCisgICAgdm11bGwudTggICAgICAgIHE5LCBkOCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTAsIGQwCisKKyAgICB2ZXh0LjggICAgICAgICAgZDMsIGQyLCBkMywgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQorICAgIHZleHQuOCAgICAgICAgICBkNSwgZDQsIGQ1LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkNywgZDYsIGQ3LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkOSwgZDgsIGQ5LCAjMQorICAgIHZleHQuOCAgICAgICAgICBkMTEsIGQxMCwgZDExLCAjMQorCisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMywgZDEgICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIEZpbHRlclsxXSkKKyAgICB2bWxhbC51OCAgICAgICAgcTcsIGQ1LCBkMQorICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDcsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE5LCBkOSwgZDEKKyAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMTEsIGQxCisKKyAgICB2cXJzaHJuLnUxNiAgICBkMjYsIHE2LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hybi51MTYgICAgZDI3LCBxNywgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMjgsIHE4LCAjNworICAgIHZxcnNocm4udTE2ICAgIGQyOSwgcTksICM3CisgICAgdnFyc2hybi51MTYgICAgZDMwLCBxMTAsICM3CisKKztTZWNvbmQgcGFzczogOHg4CitzZWNvbmRwYXNzX2ZpbHRlcgorICAgIGNtcCAgICAgICAgICAgICByMywgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCisgICAgO3NraXBfc2Vjb25kcGFzc19maWx0ZXIKKyAgICBiZXEgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb24KKworICAgIGFkZCAgICAgICAgICAgICByMywgcjEyLCByMywgbHNsICMzCisKKyAgICB2bGQxLnUzMiAgICAgICAge2QzMX0sIFtyM10gICAgICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCisKKyAgICB2ZHVwLjggICAgICAgICAgZDAsIGQzMVswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMCBkMSkKKyAgICB2ZHVwLjggICAgICAgICAgZDEsIGQzMVs0XQorCisgICAgdm11bGwudTggICAgICAgIHExLCBkMjIsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclswXSkKKyAgICB2bXVsbC51OCAgICAgICAgcTIsIGQyMywgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyNCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyNSwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyNiwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyNywgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyOCwgZDAKKyAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyOSwgZDAKKworICAgIHZtbGFsLnU4ICAgICAgICBxMSwgZDIzLCBkMSAgICAgICAgICAgICA7KHNyY19wdHJbcGl4ZWxfc3RlcF0gKiBGaWx0ZXJbMV0pCisgICAgdm1sYWwudTggICAgICAgIHEyLCBkMjQsIGQxCisgICAgdm1sYWwudTggICAgICAgIHEzLCBkMjUsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE0LCBkMjYsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE1LCBkMjcsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE2LCBkMjgsIGQxCisgICAgdm1sYWwudTggICAgICAgIHE3LCBkMjksIGQxCisgICAgdm1sYWwudTggICAgICAgIHE4LCBkMzAsIGQxCisKKyAgICB2cXJzaHJuLnUxNiAgICBkMjIsIHExLCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4CisgICAgdnFyc2hybi51MTYgICAgZDIzLCBxMiwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMjQsIHEzLCAjNworICAgIHZxcnNocm4udTE2ICAgIGQyNSwgcTQsICM3CisgICAgdnFyc2hybi51MTYgICAgZDI2LCBxNSwgIzcKKyAgICB2cXJzaHJuLnUxNiAgICBkMjcsIHE2LCAjNworICAgIHZxcnNocm4udTE2ICAgIGQyOCwgcTcsICM3CisgICAgdnFyc2hybi51MTYgICAgZDI5LCBxOCwgIzcKKworICAgIGIgICAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2U4eDhfbmVvbgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NraXBfZmlyc3RwYXNzX2ZpbHRlcgorICAgIHZsZDEudTggICAgICAgICB7ZDIyfSwgW3IwXSwgcjEgICAgICAgICA7bG9hZCBzcmMgZGF0YQorICAgIHZsZDEudTggICAgICAgICB7ZDIzfSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyNH0sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMjV9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDI2fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QyN30sIFtyMF0sIHIxCisgICAgdmxkMS51OCAgICAgICAgIHtkMjh9LCBbcjBdLCByMQorICAgIHZsZDEudTggICAgICAgICB7ZDI5fSwgW3IwXSwgcjEKKyAgICB2bGQxLnU4ICAgICAgICAge2QzMH0sIFtyMF0sIHIxCisKKyAgICBiICAgICAgICAgICAgICAgc2Vjb25kcGFzc19maWx0ZXIKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzt2cDhfdmFyaWFuY2U4eDhfbmVvbgorc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb24KKyAgICB2bW92Lmk4ICAgICAgICAgcTgsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQorICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E5LCBxMTAgLSBzc2UKKyAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAorCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzIKKworc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb25fbG9vcAorICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjRdLCByNSAgICAgICAgICAgICAgO2xvYWQgZHN0IGRhdGEKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgdmxkMS44ICAgICAgICAgIHtkMX0sIFtyNF0sIHI1CisgICAgdmxkMS44ICAgICAgICAgIHtkMn0sIFtyNF0sIHI1CisgICAgdnN1YmwudTggICAgICAgIHE0LCBkMjIsIGQwICAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIGRpZmYKKyAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3I0XSwgcjUKKworICAgIHZzdWJsLnU4ICAgICAgICBxNSwgZDIzLCBkMQorICAgIHZzdWJsLnU4ICAgICAgICBxNiwgZDI0LCBkMgorCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxNCAgICAgICAgICAgICAgICAgICAgICA7c3VtCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkOCwgZDggICAgICAgICAgICAgICAgICA7c3NlCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDksIGQ5CisKKyAgICB2c3VibC51OCAgICAgICAgcTcsIGQyNSwgZDMKKworICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTUKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQxMCwgZDEwCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDExLCBkMTEKKworICAgIHZtb3YgICAgICAgICAgICBxMTEsIHExMworCisgICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxNgorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDEyLCBkMTIKKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMTMsIGQxMworCisgICAgdm1vdiAgICAgICAgICAgIHExMiwgcTE0CisKKyAgICB2cGFkYWwuczE2ICAgICAgcTgsIHE3CisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMTQsIGQxNAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQxNSwgZDE1CisKKyAgICBibmUgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb25fbG9vcAorCisgICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKKyAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQorCisgICAgdnBhZGRsLnUzMiAgICAgIHExLCBxMTAKKyAgICB2YWRkLnM2NCAgICAgICAgZDAsIGQwLCBkMQorICAgIHZhZGQudTY0ICAgICAgICBkMSwgZDIsIGQzCisKKyAgICB2bXVsbC5zMzIgICAgICAgcTUsIGQwLCBkMAorICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbbHJdICAgICAgICAgICAgICAgO3N0b3JlIHNzZQorICAgIHZzaHIudTMyICAgICAgICBkMTAsIGQxMCwgIzYKKyAgICB2c3ViLnUzMiAgICAgICAgZDAsIGQxLCBkMTAKKworICAgIHZtb3YuMzIgICAgICAgICByMCwgZDBbMF0gICAgICAgICAgICAgICAgICAgO3JldHVybgorICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUsIHBjfQorCisgICAgRU5EUAorCis7LS0tLS0tLS0tLS0tLS0tLS0KKworYmlsaW5lYXJfdGFwc19jb2VmZgorICAgIERDRCAgICAgMTI4LCAwLCAxMTIsIDE2LCA5NiwgMzIsIDgwLCA0OCwgNjQsIDY0LCA0OCwgODAsIDMyLCA5NiwgMTYsIDExMgorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vcmVjb25pbnRyYV9hcm0uYyBiL2xpYnZweC92cDgvY29tbW9uL2FybS9yZWNvbmludHJhX2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWUwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vcmVjb25pbnRyYV9hcm0uYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisKKyNpZiBIQVZFX05FT04KK2V4dGVybiB2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9uZW9uX2Z1bmMoCisgICAgdW5zaWduZWQgY2hhciAqeV9idWZmZXIsCisgICAgdW5zaWduZWQgY2hhciAqeXByZWRfcHRyLAorICAgIGludCB5X3N0cmlkZSwKKyAgICBpbnQgbW9kZSwKKyAgICBpbnQgVXAsCisgICAgaW50IExlZnQpOworCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9uZW9uKE1BQ1JPQkxPQ0tEICp4KQoreworICAgIHVuc2lnbmVkIGNoYXIgKnlfYnVmZmVyID0geC0+ZHN0LnlfYnVmZmVyOworICAgIHVuc2lnbmVkIGNoYXIgKnlwcmVkX3B0ciA9IHgtPnByZWRpY3RvcjsKKyAgICBpbnQgeV9zdHJpZGUgPSB4LT5kc3QueV9zdHJpZGU7CisgICAgaW50IG1vZGUgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlOworICAgIGludCBVcCA9IHgtPnVwX2F2YWlsYWJsZTsKKyAgICBpbnQgTGVmdCA9IHgtPmxlZnRfYXZhaWxhYmxlOworCisgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X25lb25fZnVuYyh5X2J1ZmZlciwgeXByZWRfcHRyLCB5X3N0cmlkZSwgbW9kZSwgVXAsIExlZnQpOworfQorCitleHRlcm4gdm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19uZW9uX2Z1bmMoCisgICAgdW5zaWduZWQgY2hhciAqeV9idWZmZXIsCisgICAgdW5zaWduZWQgY2hhciAqeXByZWRfcHRyLAorICAgIGludCB5X3N0cmlkZSwKKyAgICBpbnQgbW9kZSwKKyAgICBpbnQgVXAsCisgICAgaW50IExlZnQpOworCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zX25lb24oTUFDUk9CTE9DS0QgKngpCit7CisgICAgdW5zaWduZWQgY2hhciAqeV9idWZmZXIgPSB4LT5kc3QueV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciAqeXByZWRfcHRyID0geC0+cHJlZGljdG9yOworICAgIGludCB5X3N0cmlkZSA9IHgtPmRzdC55X3N0cmlkZTsKKyAgICBpbnQgbW9kZSA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGU7CisgICAgaW50IFVwID0geC0+dXBfYXZhaWxhYmxlOworICAgIGludCBMZWZ0ID0geC0+bGVmdF9hdmFpbGFibGU7CisKKyAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19uZW9uX2Z1bmMoeV9idWZmZXIsIHlwcmVkX3B0ciwgeV9zdHJpZGUsIG1vZGUsIFVwLCBMZWZ0KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vdmFyaWFuY2VfYXJtLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9hcm0vdmFyaWFuY2VfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxZDc2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2FybS92YXJpYW5jZV9hcm0uYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi92YXJpYW5jZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZmlsdGVyLmgiCisKKyNpZiBIQVZFX01FRElBCisjaW5jbHVkZSAidnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmgiCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X2FybXY2CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIHVuc2lnbmVkIHNob3J0IGZpcnN0X3Bhc3NbMTAqOF07CisgICAgdW5zaWduZWQgY2hhciAgc2Vjb25kX3Bhc3NbOCo4XTsKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKyAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07CisgICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOworCisgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzX2FybXY2KHNyY19wdHIsIGZpcnN0X3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDgsIEhGaWx0ZXIpOworICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3NfYXJtdjYoZmlyc3RfcGFzcywgc2Vjb25kX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA4LCA4LCBWRmlsdGVyKTsKKworICAgIHJldHVybiB2cDhfdmFyaWFuY2U4eDhfYXJtdjYoc2Vjb25kX3Bhc3MsIDgsIGRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Cit9CisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYXJtdjYKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgdW5zaWduZWQgc2hvcnQgZmlyc3RfcGFzc1szNioxNl07CisgICAgdW5zaWduZWQgY2hhciAgc2Vjb25kX3Bhc3NbMjAqMTZdOworICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLCAqVkZpbHRlcjsKKyAgICB1bnNpZ25lZCBpbnQgdmFyOworCisgICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCisgICAgeworICAgICAgICB2YXIgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2YXIgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2YXIgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2FybXY2KHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCBzc2UpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07CisgICAgICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciwgZmlyc3RfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgMTYsIEhGaWx0ZXIpOworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzX2FybXY2KGZpcnN0X3Bhc3MsIHNlY29uZF9wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNiwgMTYsIFZGaWx0ZXIpOworCisgICAgICAgIHZhciA9IHZwOF92YXJpYW5jZTE2eDE2X2FybXY2KHNlY29uZF9wYXNzLCAxNiwgZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7CisgICAgfQorICAgIHJldHVybiB2YXI7Cit9CisKKyNlbmRpZiAvKiBIQVZFX01FRElBICovCisKKworI2lmIEhBVkVfTkVPTgorCitleHRlcm4gdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9uZW9uX2Z1bmMKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispOworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24KKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSAwKQorICAgIHJldHVybiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbmVvbihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCBzc2UpOworICBlbHNlIGlmICh4b2Zmc2V0ID09IDAgJiYgeW9mZnNldCA9PSA0KQorICAgIHJldHVybiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCBzc2UpOworICBlbHNlIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSA0KQorICAgIHJldHVybiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X25lb24oc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKKyAgZWxzZQorICAgIHJldHVybiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9mdW5jKHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vYXNtX2NvbV9vZmZzZXRzLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9hc21fY29tX29mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTIyYjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vYXNtX2NvbV9vZmZzZXRzLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9hc21fb2Zmc2V0cy5oIgorI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKworI2lmIENPTkZJR19QT1NUUFJPQworI2luY2x1ZGUgInBvc3Rwcm9jLmgiCisjZW5kaWYgLyogQ09ORklHX1BPU1RQUk9DICovCisKK0JFR0lOCisKKy8qIHZweF9zY2FsZSAqLworREVGSU5FKHl2MTJfYnVmZmVyX2NvbmZpZ195X3dpZHRoLCAgICAgICAgICAgICAgb2Zmc2V0b2YoWVYxMl9CVUZGRVJfQ09ORklHLCB5X3dpZHRoKSk7CitERUZJTkUoeXYxMl9idWZmZXJfY29uZmlnX3lfaGVpZ2h0LCAgICAgICAgICAgICBvZmZzZXRvZihZVjEyX0JVRkZFUl9DT05GSUcsIHlfaGVpZ2h0KSk7CitERUZJTkUoeXYxMl9idWZmZXJfY29uZmlnX3lfc3RyaWRlLCAgICAgICAgICAgICBvZmZzZXRvZihZVjEyX0JVRkZFUl9DT05GSUcsIHlfc3RyaWRlKSk7CitERUZJTkUoeXYxMl9idWZmZXJfY29uZmlnX3V2X3dpZHRoLCAgICAgICAgICAgICBvZmZzZXRvZihZVjEyX0JVRkZFUl9DT05GSUcsIHV2X3dpZHRoKSk7CitERUZJTkUoeXYxMl9idWZmZXJfY29uZmlnX3V2X2hlaWdodCwgICAgICAgICAgICBvZmZzZXRvZihZVjEyX0JVRkZFUl9DT05GSUcsIHV2X2hlaWdodCkpOworREVGSU5FKHl2MTJfYnVmZmVyX2NvbmZpZ191dl9zdHJpZGUsICAgICAgICAgICAgb2Zmc2V0b2YoWVYxMl9CVUZGRVJfQ09ORklHLCB1dl9zdHJpZGUpKTsKK0RFRklORSh5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXIsICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgeV9idWZmZXIpKTsKK0RFRklORSh5djEyX2J1ZmZlcl9jb25maWdfdV9idWZmZXIsICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgdV9idWZmZXIpKTsKK0RFRklORSh5djEyX2J1ZmZlcl9jb25maWdfdl9idWZmZXIsICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgdl9idWZmZXIpKTsKK0RFRklORSh5djEyX2J1ZmZlcl9jb25maWdfYm9yZGVyLCAgICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgYm9yZGVyKSk7CitERUZJTkUoVlA4Qk9SREVSSU5QSVhFTFNfVkFMLCAgICAgICAgICAgICAgICAgICBWUDhCT1JERVJJTlBJWEVMUyk7CisKKyNpZiBDT05GSUdfUE9TVFBST0MKKy8qIG1mcWUuYyAvIGZpbHRlcl9ieV93ZWlnaHQgKi8KK0RFRklORShNRlFFX1BSRUNJU0lPTl9WQUwsICAgICAgICAgICAgICAgICAgICAgIE1GUUVfUFJFQ0lTSU9OKTsKKyNlbmRpZiAvKiBDT05GSUdfUE9TVFBST0MgKi8KKworRU5ECisKKy8qIGFkZCBhc3NlcnRzIGZvciBhbnkgb2Zmc2V0IHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBhc3NlbWJseSBjb2RlICovCisvKiBhZGQgYXNzZXJ0cyBmb3IgYW55IHNpemUgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFzc2VtYmx5IGNvZGUgKi8KKworI2lmIEhBVkVfTUVESUEKKy8qIHN3aXRjaCBjYXNlIGluIHZwOF9pbnRyYTR4NF9wcmVkaWN0X2FybXY2IGlzIGJhc2VkIG9uIHRoZXNlIGVudW1lcmF0ZWQgdmFsdWVzICovCitjdF9hc3NlcnQoQl9EQ19QUkVELCBCX0RDX1BSRUQgPT0gMCk7CitjdF9hc3NlcnQoQl9UTV9QUkVELCBCX1RNX1BSRUQgPT0gMSk7CitjdF9hc3NlcnQoQl9WRV9QUkVELCBCX1ZFX1BSRUQgPT0gMik7CitjdF9hc3NlcnQoQl9IRV9QUkVELCBCX0hFX1BSRUQgPT0gMyk7CitjdF9hc3NlcnQoQl9MRF9QUkVELCBCX0xEX1BSRUQgPT0gNCk7CitjdF9hc3NlcnQoQl9SRF9QUkVELCBCX1JEX1BSRUQgPT0gNSk7CitjdF9hc3NlcnQoQl9WUl9QUkVELCBCX1ZSX1BSRUQgPT0gNik7CitjdF9hc3NlcnQoQl9WTF9QUkVELCBCX1ZMX1BSRUQgPT0gNyk7CitjdF9hc3NlcnQoQl9IRF9QUkVELCBCX0hEX1BSRUQgPT0gOCk7CitjdF9hc3NlcnQoQl9IVV9QUkVELCBCX0hVX1BSRUQgPT0gOSk7CisjZW5kaWYKKworI2lmIEhBVkVfTkVPTgorLyogdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbiBtYWtlcyBzZXZlcmFsIGFzc3VtcHRpb25zIGJhc2VkIG9uIHRoaXMgKi8KK2N0X2Fzc2VydChWUDhCT1JERVJJTlBJWEVMU19WQUwsIFZQOEJPUkRFUklOUElYRUxTID09IDMyKQorI2VuZGlmCisKKyNpZiBIQVZFX1NTRTIKKyNpZiBDT05GSUdfUE9TVFBST0MKKy8qIHZwOF9maWx0ZXJfYnlfd2VpZ2h0MTZ4MTYgYW5kIDh4OCAqLworY3RfYXNzZXJ0KE1GUUVfUFJFQ0lTSU9OX1ZBTCwgTUZRRV9QUkVDSVNJT04gPT0gNCkKKyNlbmRpZiAvKiBDT05GSUdfUE9TVFBST0MgKi8KKyNlbmRpZiAvKiBIQVZFX1NTRTIgKi8KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYmxvY2tkLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9ibG9ja2QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9ibG9ja2QuYwpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vYmxvY2tkLmMKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2Jsb2NrZC5oIGIvbGlidnB4L3ZwOC9jb21tb24vYmxvY2tkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmZjU3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2Jsb2NrZC5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19CTE9DS0RfSAorI2RlZmluZSBfX0lOQ19CTE9DS0RfSAorCit2b2lkIHZweF9sb2coY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCisjaW5jbHVkZSAibXYuaCIKKyNpbmNsdWRlICJ0cmVlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCisKKy8qI2RlZmluZSBEQ1BSRUQgMSovCisjZGVmaW5lIERDUFJFRFNJTVRIUkVTSCAwCisjZGVmaW5lIERDUFJFRENOVFRIUkVTSCAzCisKKyNkZWZpbmUgTUJfRkVBVFVSRV9UUkVFX1BST0JTICAgMworI2RlZmluZSBNQVhfTUJfU0VHTUVOVFMgICAgICAgICA0CisKKyNkZWZpbmUgTUFYX1JFRl9MRl9ERUxUQVMgICAgICAgNAorI2RlZmluZSBNQVhfTU9ERV9MRl9ERUxUQVMgICAgICA0CisKKy8qIFNlZ21lbnQgRmVhdHVyZSBNYXNrcyAqLworI2RlZmluZSBTRUdNRU5UX0RFTFRBREFUQSAgIDAKKyNkZWZpbmUgU0VHTUVOVF9BQlNEQVRBICAgICAxCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IHIsIGM7Cit9IFBPUzsKKworI2RlZmluZSBQTEFORV9UWVBFX1lfTk9fREMgICAgMAorI2RlZmluZSBQTEFORV9UWVBFX1kyICAgICAgICAgMQorI2RlZmluZSBQTEFORV9UWVBFX1VWICAgICAgICAgMgorI2RlZmluZSBQTEFORV9UWVBFX1lfV0lUSF9EQyAgMworCisKK3R5cGVkZWYgY2hhciBFTlRST1BZX0NPTlRFWFQ7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIEVOVFJPUFlfQ09OVEVYVCB5MVs0XTsKKyAgICBFTlRST1BZX0NPTlRFWFQgdVsyXTsKKyAgICBFTlRST1BZX0NPTlRFWFQgdlsyXTsKKyAgICBFTlRST1BZX0NPTlRFWFQgeTI7Cit9IEVOVFJPUFlfQ09OVEVYVF9QTEFORVM7CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHZwOF9ibG9jazJsZWZ0WzI1XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHZwOF9ibG9jazJhYm92ZVsyNV07CisKKyNkZWZpbmUgVlA4X0NPTUJJTkVFTlRST1BZQ09OVEVYVFMoIERlc3QsIEEsIEIpIFwKKyAgICBEZXN0ID0gKEEpKyhCKTsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBLRVlfRlJBTUUgPSAwLAorICAgIElOVEVSX0ZSQU1FID0gMQorfSBGUkFNRV9UWVBFOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBEQ19QUkVELCAgICAgICAgICAgIC8qIGF2ZXJhZ2Ugb2YgYWJvdmUgYW5kIGxlZnQgcGl4ZWxzICovCisgICAgVl9QUkVELCAgICAgICAgICAgICAvKiB2ZXJ0aWNhbCBwcmVkaWN0aW9uICovCisgICAgSF9QUkVELCAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHByZWRpY3Rpb24gKi8KKyAgICBUTV9QUkVELCAgICAgICAgICAgIC8qIFRydWVtb3Rpb24gcHJlZGljdGlvbiAqLworICAgIEJfUFJFRCwgICAgICAgICAgICAgLyogYmxvY2sgYmFzZWQgcHJlZGljdGlvbiwgZWFjaCBibG9jayBoYXMgaXRzIG93biBwcmVkaWN0aW9uIG1vZGUgKi8KKworICAgIE5FQVJFU1RNViwKKyAgICBORUFSTVYsCisgICAgWkVST01WLAorICAgIE5FV01WLAorICAgIFNQTElUTVYsCisKKyAgICBNQl9NT0RFX0NPVU5UCit9IE1CX1BSRURJQ1RJT05fTU9ERTsKKworLyogTWFjcm9ibG9jayBsZXZlbCBmZWF0dXJlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTUJfTFZMX0FMVF9RID0gMCwgICAgICAgICAgICAgICAvKiBVc2UgYWx0ZXJuYXRlIFF1YW50aXplciAuLi4uICovCisgICAgTUJfTFZMX0FMVF9MRiA9IDEsICAgICAgICAgICAgICAvKiBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlLi4uICovCisgICAgTUJfTFZMX01BWCA9IDIgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgTUIgbGV2ZWwgZmVhdHVyZXMgc3VwcG9ydGVkICovCisKK30gTUJfTFZMX0ZFQVRVUkVTOworCisvKiBTZWdtZW50IEZlYXR1cmUgTWFza3MgKi8KKyNkZWZpbmUgU0VHTUVOVF9BTFRRICAgIDB4MDEKKyNkZWZpbmUgU0VHTUVOVF9BTFRfTEYgIDB4MDIKKworI2RlZmluZSBWUDhfWU1PREVTICAoQl9QUkVEICsgMSkKKyNkZWZpbmUgVlA4X1VWX01PREVTIChUTV9QUkVEICsgMSkKKworI2RlZmluZSBWUDhfTVZSRUZTICgxICsgU1BMSVRNViAtIE5FQVJFU1RNVikKKwordHlwZWRlZiBlbnVtCit7CisgICAgQl9EQ19QUkVELCAgICAgICAgICAvKiBhdmVyYWdlIG9mIGFib3ZlIGFuZCBsZWZ0IHBpeGVscyAqLworICAgIEJfVE1fUFJFRCwKKworICAgIEJfVkVfUFJFRCwgICAgICAgICAgIC8qIHZlcnRpY2FsIHByZWRpY3Rpb24gKi8KKyAgICBCX0hFX1BSRUQsICAgICAgICAgICAvKiBob3Jpem9udGFsIHByZWRpY3Rpb24gKi8KKworICAgIEJfTERfUFJFRCwKKyAgICBCX1JEX1BSRUQsCisKKyAgICBCX1ZSX1BSRUQsCisgICAgQl9WTF9QUkVELAorICAgIEJfSERfUFJFRCwKKyAgICBCX0hVX1BSRUQsCisKKyAgICBMRUZUNFg0LAorICAgIEFCT1ZFNFg0LAorICAgIFpFUk80WDQsCisgICAgTkVXNFg0LAorCisgICAgQl9NT0RFX0NPVU5UCit9IEJfUFJFRElDVElPTl9NT0RFOworCisjZGVmaW5lIFZQOF9CSU5UUkFNT0RFUyAoQl9IVV9QUkVEICsgMSkgIC8qIDEwICovCisjZGVmaW5lIFZQOF9TVUJNVlJFRlMgKDEgKyBORVc0WDQgLSBMRUZUNFg0KQorCisvKiBGb3Iga2V5ZnJhbWVzLCBpbnRyYSBibG9jayBtb2RlcyBhcmUgcHJlZGljdGVkIGJ5IHRoZSAoYWxyZWFkeSBkZWNvZGVkKQorICAgbW9kZXMgZm9yIHRoZSBZIGJsb2NrcyB0byB0aGUgbGVmdCBhbmQgYWJvdmUgdXM7IGZvciBpbnRlcmZyYW1lcywgdGhlcmUKKyAgIGlzIGEgc2luZ2xlIHByb2JhYmlsaXR5IHRhYmxlLiAqLworCit1bmlvbiBiX21vZGVfaW5mbworeworICAgIEJfUFJFRElDVElPTl9NT0RFIGFzX21vZGU7CisgICAgaW50X212IG12OworfTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgSU5UUkFfRlJBTUUgPSAwLAorICAgIExBU1RfRlJBTUUgPSAxLAorICAgIEdPTERFTl9GUkFNRSA9IDIsCisgICAgQUxUUkVGX0ZSQU1FID0gMywKKyAgICBNQVhfUkVGX0ZSQU1FUyA9IDQKK30gTVZfUkVGRVJFTkNFX0ZSQU1FOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgbW9kZSwgdXZfbW9kZTsKKyAgICB1aW50OF90IHJlZl9mcmFtZTsKKyAgICB1aW50OF90IGlzXzR4NDsKKyAgICBpbnRfbXYgbXY7CisKKyAgICB1aW50OF90IHBhcnRpdGlvbmluZzsKKyAgICB1aW50OF90IG1iX3NraXBfY29lZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2VzIHRoaXMgbWIgaGFzIGNvZWZmaWNpZW50cyBhdCBhbGwsIDE9bm8gY29lZmZpY2llbnRzLCAwPW5lZWQgZGVjb2RlIHRva2VucyAqLworICAgIHVpbnQ4X3QgbmVlZF90b19jbGFtcF9tdnM7CisgICAgdWludDhfdCBzZWdtZW50X2lkOyAgICAgICAgICAgICAgICAgIC8qIFdoaWNoIHNldCBvZiBzZWdtZW50YXRpb24gcGFyYW1ldGVycyBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBNQiAqLworfSBNQl9NT0RFX0lORk87CisKK3R5cGVkZWYgc3RydWN0IG1vZGVpbmZvCit7CisgICAgTUJfTU9ERV9JTkZPIG1ibWk7CisgICAgdW5pb24gYl9tb2RlX2luZm8gYm1pWzE2XTsKK30gTU9ERV9JTkZPOworCisjaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworLyogVGhlIG1iLWxldmVsIGluZm9ybWF0aW9uIG5lZWRlZCB0byBiZSBzdG9yZWQgZm9yIGhpZ2hlci1yZXNvbHV0aW9uIGVuY29kZXIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTUJfUFJFRElDVElPTl9NT0RFIG1vZGU7CisgICAgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZTsKKyAgICBpbnRfbXYgbXY7CisgICAgaW50IGRpc3NpbTsgICAgLyogZGlzc2ltaWxhcml0eSBsZXZlbCBvZiB0aGUgbWFjcm9ibG9jayAqLworfSBMT1dFUl9SRVNfTUJfSU5GTzsKKworLyogVGhlIGZyYW1lLWxldmVsIGluZm9ybWF0aW9uIG5lZWRlZCB0byBiZSBzdG9yZWQgZm9yIGhpZ2hlci1yZXNvbHV0aW9uCisgKiAgZW5jb2RlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7CisgICAgaW50IGlzX2ZyYW1lX2Ryb3BwZWQ7CisgICAgLyogVGhlIGZyYW1lIG51bWJlciBvZiBlYWNoIHJlZmVyZW5jZSBmcmFtZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgbG93X3Jlc19yZWZfZnJhbWVzW01BWF9SRUZfRlJBTUVTXTsKKyAgICBMT1dFUl9SRVNfTUJfSU5GTyAqbWJfaW5mbzsKK30gTE9XRVJfUkVTX0ZSQU1FX0lORk87CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgYmxvY2tkCit7CisgICAgc2hvcnQgKnFjb2VmZjsKKyAgICBzaG9ydCAqZHFjb2VmZjsKKyAgICB1bnNpZ25lZCBjaGFyICAqcHJlZGljdG9yOworICAgIHNob3J0ICpkZXF1YW50OworCisgICAgaW50IG9mZnNldDsKKyAgICBjaGFyICplb2I7CisKKyAgICB1bmlvbiBiX21vZGVfaW5mbyBibWk7Cit9IEJMT0NLRDsKKwordHlwZWRlZiB2b2lkICgqdnA4X3N1YnBpeF9mbl90KSh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworCit0eXBlZGVmIHN0cnVjdCBtYWNyb2Jsb2NrZAoreworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdW5zaWduZWQgY2hhciwgIHByZWRpY3RvclszODRdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBxY29lZmZbNDAwXSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgZHFjb2VmZls0MDBdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGNoYXIsICBlb2JzWzI1XSk7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCAgZGVxdWFudF95MVsxNl0pOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsICBkZXF1YW50X3kxX2RjWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgIGRlcXVhbnRfeTJbMTZdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCAgZGVxdWFudF91dlsxNl0pOworCisgICAgLyogMTYgWSBibG9ja3MsIDQgVSwgNCBWLCAxIERDIDJuZCBvcmRlciBibG9jaywgZWFjaCB3aXRoIDE2IGVudHJpZXMuICovCisgICAgQkxPQ0tEIGJsb2NrWzI1XTsKKyAgICBpbnQgZnVsbHBpeGVsX21hc2s7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgcHJlOyAvKiBGaWx0ZXJlZCBjb3B5IG9mIHByZXZpb3VzIGZyYW1lIHJlY29uc3RydWN0aW9uICovCisgICAgWVYxMl9CVUZGRVJfQ09ORklHIGRzdDsKKworICAgIE1PREVfSU5GTyAqbW9kZV9pbmZvX2NvbnRleHQ7CisgICAgaW50IG1vZGVfaW5mb19zdHJpZGU7CisKKyAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7CisKKyAgICBpbnQgdXBfYXZhaWxhYmxlOworICAgIGludCBsZWZ0X2F2YWlsYWJsZTsKKworICAgIHVuc2lnbmVkIGNoYXIgKnJlY29uX2Fib3ZlWzNdOworICAgIHVuc2lnbmVkIGNoYXIgKnJlY29uX2xlZnRbM107CisgICAgaW50IHJlY29uX2xlZnRfc3RyaWRlWzJdOworCisgICAgLyogWSxVLFYsWTIgKi8KKyAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTICphYm92ZV9jb250ZXh0OworICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgKmxlZnRfY29udGV4dDsKKworICAgIC8qIDAgaW5kaWNhdGVzIHNlZ21lbnRhdGlvbiBhdCBNQiBsZXZlbCBpcyBub3QgZW5hYmxlZC4gT3RoZXJ3aXNlIHRoZSBpbmRpdmlkdWFsIGJpdHMgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgYXJlIGFjdGl2ZS4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNlZ21lbnRhdGlvbl9lbmFibGVkOworCisgICAgLyogMCAoZG8gbm90IHVwZGF0ZSkgMSAodXBkYXRlKSB0aGUgbWFjcm9ibG9jayBzZWdtZW50YXRpb24gbWFwLiAqLworICAgIHVuc2lnbmVkIGNoYXIgdXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXA7CisKKyAgICAvKiAwIChkbyBub3QgdXBkYXRlKSAxICh1cGRhdGUpIHRoZSBtYWNyb2Jsb2NrIHNlZ21lbnRhdGlvbiBmZWF0dXJlIGRhdGEuICovCisgICAgdW5zaWduZWQgY2hhciB1cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGE7CisKKyAgICAvKiAwIChkbyBub3QgdXBkYXRlKSAxICh1cGRhdGUpIHRoZSBtYWNyb2Jsb2NrIHNlZ21lbnRhdGlvbiBmZWF0dXJlIGRhdGEuICovCisgICAgdW5zaWduZWQgY2hhciBtYl9zZWdlbWVudF9hYnNfZGVsdGE7CisKKyAgICAvKiBQZXIgZnJhbWUgZmxhZ3MgdGhhdCBkZWZpbmUgd2hpY2ggTUIgbGV2ZWwgZmVhdHVyZXMgKHN1Y2ggYXMgcXVhbnRpemVyIG9yIGxvb3AgZmlsdGVyIGxldmVsKSAqLworICAgIC8qIGFyZSBlbmFibGVkIGFuZCB3aGVuIGVuYWJsZWQgdGhlIHByb2FiaWxpdGllcyB1c2VkIHRvIGRlY29kZSB0aGUgcGVyIE1CIGZsYWdzIGluIE1CX01PREVfSU5GTyAqLworICAgIHZwOF9wcm9iIG1iX3NlZ21lbnRfdHJlZV9wcm9ic1tNQl9GRUFUVVJFX1RSRUVfUFJPQlNdOyAgICAgICAgIC8qIFByb2JhYmlsaXR5IFRyZWUgdXNlZCB0byBjb2RlIFNlZ21lbnQgbnVtYmVyICovCisKKyAgICBzaWduZWQgY2hhciBzZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfTUFYXVtNQVhfTUJfU0VHTUVOVFNdOyAgICAgICAgICAgIC8qIFNlZ21lbnQgcGFyYW1ldGVycyAqLworCisgICAgLyogbW9kZV9iYXNlZCBMb29wIGZpbHRlciBhZGp1c3RtZW50ICovCisgICAgdW5zaWduZWQgY2hhciBtb2RlX3JlZl9sZl9kZWx0YV9lbmFibGVkOworICAgIHVuc2lnbmVkIGNoYXIgbW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlOworCisgICAgLyogRGVsdGEgdmFsdWVzIGhhdmUgdGhlIHJhbmdlICsvLSBNQVhfTE9PUF9GSUxURVIgKi8KKyAgICBzaWduZWQgY2hhciBsYXN0X3JlZl9sZl9kZWx0YXNbTUFYX1JFRl9MRl9ERUxUQVNdOyAgICAgICAgICAgICAgICAvKiAwID0gSW50cmEsIExhc3QsIEdGLCBBUkYgKi8KKyAgICBzaWduZWQgY2hhciByZWZfbGZfZGVsdGFzW01BWF9SRUZfTEZfREVMVEFTXTsgICAgICAgICAgICAgICAgICAgICAvKiAwID0gSW50cmEsIExhc3QsIEdGLCBBUkYgKi8KKyAgICBzaWduZWQgY2hhciBsYXN0X21vZGVfbGZfZGVsdGFzW01BWF9NT0RFX0xGX0RFTFRBU107ICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPSBCUFJFRCwgWkVST19NViwgTVYsIFNQTElUICovCisgICAgc2lnbmVkIGNoYXIgbW9kZV9sZl9kZWx0YXNbTUFYX01PREVfTEZfREVMVEFTXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwID0gQlBSRUQsIFpFUk9fTVYsIE1WLCBTUExJVCAqLworCisgICAgLyogRGlzdGFuY2Ugb2YgTUIgYXdheSBmcm9tIGZyYW1lIGVkZ2VzICovCisgICAgaW50IG1iX3RvX2xlZnRfZWRnZTsKKyAgICBpbnQgbWJfdG9fcmlnaHRfZWRnZTsKKyAgICBpbnQgbWJfdG9fdG9wX2VkZ2U7CisgICAgaW50IG1iX3RvX2JvdHRvbV9lZGdlOworCisKKworICAgIHZwOF9zdWJwaXhfZm5fdCAgc3VicGl4ZWxfcHJlZGljdDsKKyAgICB2cDhfc3VicGl4X2ZuX3QgIHN1YnBpeGVsX3ByZWRpY3Q4eDQ7CisgICAgdnA4X3N1YnBpeF9mbl90ICBzdWJwaXhlbF9wcmVkaWN0OHg4OworICAgIHZwOF9zdWJwaXhfZm5fdCAgc3VicGl4ZWxfcHJlZGljdDE2eDE2OworCisgICAgdm9pZCAqY3VycmVudF9iYzsKKworICAgIGludCBjb3JydXB0ZWQ7CisKKyNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAorICAgIC8qIFRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBjdXJyZW50bHkgdXNlZCBpbiBzdWItcGl4ZWwgbW90aW9uIHNlYXJjaAorICAgICAqIHRvIGtlZXAgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2UgYXJlYS4gVGhpcyBidWZmZXIgY2FuIGJlIHVzZWQgZm9yIG90aGVyCisgICAgICogcHVycG9zZS4KKyAgICAgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIHVuc2lnbmVkIGNoYXIsIHlfYnVmWzIyKjMyXSk7CisjZW5kaWYKK30gTUFDUk9CTE9DS0Q7CisKKworZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2Jsb2NrX2RvZmZzZXRzKE1BQ1JPQkxPQ0tEICp4KTsKK2V4dGVybiB2b2lkIHZwOF9zZXR1cF9ibG9ja19kcHRycyhNQUNST0JMT0NLRCAqeCk7CisKKyNlbmRpZiAgLyogX19JTkNfQkxPQ0tEX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2NvZWZ1cGRhdGVwcm9icy5oIGIvbGlidnB4L3ZwOC9jb21tb24vY29lZnVwZGF0ZXByb2JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxOTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2NvZWZ1cGRhdGVwcm9icy5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyogVXBkYXRlIHByb2JhYmlsaXRpZXMgZm9yIHRoZSBub2RlcyBpbiB0aGUgdG9rZW4gZW50cm9weSB0cmVlLgorICAgR2VuZXJhdGVkIGZpbGUgaW5jbHVkZWQgYnkgZW50cm9weS5jICovCisKK2NvbnN0IHZwOF9wcm9iIHZwOF9jb2VmX3VwZGF0ZV9wcm9icyBbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbRU5UUk9QWV9OT0RFU10gPQoreworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MTc2LCAyNDYsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjIzLCAyNDEsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjQ5LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI0NCwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyMzQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjQ2LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezIzOSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNDgsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjUxLCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTEsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU0LCAyNTMsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1MCwgMjU1LCAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHsyMTcsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyMjUsIDI1MiwgMjQxLCAyNTMsIDI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyMzQsIDI1MCwgMjQxLCAyNTAsIDI1MywgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezIyMywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezIzOCwgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNDgsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjQ5LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNDcsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1NCwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICB7MTg2LCAyNTEsIDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjM0LCAyNTEsIDI0NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjUxLCAyNTEsIDI0MywgMjUzLCAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyMzYsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTEsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgezI0OCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1MCwgMjU0LCAyNTIsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI0OCwgMjU0LCAyNDksIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjQ2LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjUyLCAyNTQsIDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1NCwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNDgsIDI1NCwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjUxLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI0NSwgMjUxLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1MywgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTEsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjUyLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsyNTUsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNDksIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgezI1NSwgMjU1LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCisgICAgICAgIH0sCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9jb21tb24uaCBiL2xpYnZweC92cDgvY29tbW9uL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYzFjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9jb21tb24uaApAQCAtMCwwICsxLDQwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBjb21tb25faAorI2RlZmluZSBjb21tb25faCAxCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogSW50ZXJmYWNlIGhlYWRlciBmb3IgY29tbW9uIGNvbnN0YW50IGRhdGEgc3RydWN0dXJlcyBhbmQgbG9va3VwIHRhYmxlcyAqLworCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisKKy8qIE9ubHkgbmVlZCB0aGlzIGZvciBmaXhlZC1zaXplIGFycmF5cywgZm9yIHN0cnVjdHMganVzdCBhc3NpZ24uICovCisKKyNkZWZpbmUgdnA4X2NvcHkoIERlc3QsIFNyYykgeyBcCisgICAgICAgIGFzc2VydCggc2l6ZW9mKCBEZXN0KSA9PSBzaXplb2YoIFNyYykpOyBcCisgICAgICAgIHZweF9tZW1jcHkoIERlc3QsIFNyYywgc2l6ZW9mKCBTcmMpKTsgXAorICAgIH0KKworLyogVXNlIHRoaXMgZm9yIHZhcmlhYmx5LXNpemVkIGFycmF5cy4gKi8KKworI2RlZmluZSB2cDhfY29weV9hcnJheSggRGVzdCwgU3JjLCBOKSB7IFwKKyAgICAgICAgYXNzZXJ0KCBzaXplb2YoICpEZXN0KSA9PSBzaXplb2YoICpTcmMpKTsgXAorICAgICAgICB2cHhfbWVtY3B5KCBEZXN0LCBTcmMsIE4gKiBzaXplb2YoICpTcmMpKTsgXAorICAgIH0KKworI2RlZmluZSB2cDhfemVybyggRGVzdCkgIHZweF9tZW1zZXQoICZEZXN0LCAwLCBzaXplb2YoIERlc3QpKTsKKworI2RlZmluZSB2cDhfemVyb19hcnJheSggRGVzdCwgTikgIHZweF9tZW1zZXQoIERlc3QsIDAsIE4gKiBzaXplb2YoICpEZXN0KSk7CisKKworI2VuZGlmICAvKiBjb21tb25faCAqLwpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9jb250ZXh0LmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9jb250ZXh0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vY29udGV4dC5jCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9jb250ZXh0LmMKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2RlYnVnbW9kZXMuYyBiL2xpYnZweC92cDgvY29tbW9uL2RlYnVnbW9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vZGVidWdtb2Rlcy5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYmxvY2tkLmgiCisKKwordm9pZCB2cDhfcHJpbnRfbW9kZXNfYW5kX21vdGlvbl92ZWN0b3JzKE1PREVfSU5GTyAqbWksIGludCByb3dzLCBpbnQgY29scywgaW50IGZyYW1lKQoreworCisgICAgaW50IG1iX3JvdzsKKyAgICBpbnQgbWJfY29sOworICAgIGludCBtYl9pbmRleCA9IDA7CisgICAgRklMRSAqbXZzID0gZm9wZW4oIm12cy5zdHQiLCAiYSIpOworCisgICAgLyogcHJpbnQgb3V0IHRoZSBtYWNyb2Jsb2NrIFkgbW9kZXMgKi8KKyAgICBtYl9pbmRleCA9IDA7CisgICAgZnByaW50ZihtdnMsICJNYiBNb2RlcyBmb3IgRnJhbWUgJWRcbiIsIGZyYW1lKTsKKworICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgcm93czsgbWJfcm93KyspCisgICAgeworICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNvbHM7IG1iX2NvbCsrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZwcmludGYobXZzLCAiJTJkICIsIG1pW21iX2luZGV4XS5tYm1pLm1vZGUpOworCisgICAgICAgICAgICBtYl9pbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgZnByaW50ZihtdnMsICJcbiIpOworICAgICAgICBtYl9pbmRleCsrOworICAgIH0KKworICAgIGZwcmludGYobXZzLCAiXG4iKTsKKworICAgIG1iX2luZGV4ID0gMDsKKyAgICBmcHJpbnRmKG12cywgIk1iIG12IHJlZiBmb3IgRnJhbWUgJWRcbiIsIGZyYW1lKTsKKworICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgcm93czsgbWJfcm93KyspCisgICAgeworICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNvbHM7IG1iX2NvbCsrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZwcmludGYobXZzLCAiJTJkICIsIG1pW21iX2luZGV4XS5tYm1pLnJlZl9mcmFtZSk7CisKKyAgICAgICAgICAgIG1iX2luZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKG12cywgIlxuIik7CisgICAgICAgIG1iX2luZGV4Kys7CisgICAgfQorCisgICAgZnByaW50ZihtdnMsICJcbiIpOworCisgICAgLyogcHJpbnQgb3V0IHRoZSBtYWNyb2Jsb2NrIFVWIG1vZGVzICovCisgICAgbWJfaW5kZXggPSAwOworICAgIGZwcmludGYobXZzLCAiVVYgTW9kZXMgZm9yIEZyYW1lICVkXG4iLCBmcmFtZSk7CisKKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IHJvd3M7IG1iX3JvdysrKQorICAgIHsKKyAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjb2xzOyBtYl9jb2wrKykKKyAgICAgICAgeworCisgICAgICAgICAgICBmcHJpbnRmKG12cywgIiUyZCAiLCBtaVttYl9pbmRleF0ubWJtaS51dl9tb2RlKTsKKworICAgICAgICAgICAgbWJfaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIG1iX2luZGV4Kys7CisgICAgICAgIGZwcmludGYobXZzLCAiXG4iKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKG12cywgIlxuIik7CisKKyAgICAvKiBwcmludCBvdXQgdGhlIGJsb2NrIG1vZGVzICovCisgICAgbWJfaW5kZXggPSAwOworICAgIGZwcmludGYobXZzLCAiTWJzIGZvciBGcmFtZSAlZFxuIiwgZnJhbWUpOworICAgIHsKKyAgICAgICAgaW50IGJfcm93OworCisgICAgICAgIGZvciAoYl9yb3cgPSAwOyBiX3JvdyA8IDQgKiByb3dzOyBiX3JvdysrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYl9jb2w7CisgICAgICAgICAgICBpbnQgYmluZGV4OworCisgICAgICAgICAgICBmb3IgKGJfY29sID0gMDsgYl9jb2wgPCA0ICogY29sczsgYl9jb2wrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl9pbmRleCA9IChiX3JvdyA+PiAyKSAqIChjb2xzICsgMSkgKyAoYl9jb2wgPj4gMik7CisgICAgICAgICAgICAgICAgYmluZGV4ID0gKGJfcm93ICYgMykgKiA0ICsgKGJfY29sICYgMyk7CisKKyAgICAgICAgICAgICAgICBpZiAobWlbbWJfaW5kZXhdLm1ibWkubW9kZSA9PSBCX1BSRUQpCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYobXZzLCAiJTJkICIsIG1pW21iX2luZGV4XS5ibWlbYmluZGV4XS5hc19tb2RlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYobXZzLCAieHggIik7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnByaW50ZihtdnMsICJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGZwcmludGYobXZzLCAiXG4iKTsKKworICAgIC8qIHByaW50IG91dCB0aGUgbWFjcm9ibG9jayBtdnMgKi8KKyAgICBtYl9pbmRleCA9IDA7CisgICAgZnByaW50ZihtdnMsICJNVnMgZm9yIEZyYW1lICVkXG4iLCBmcmFtZSk7CisKKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IHJvd3M7IG1iX3JvdysrKQorICAgIHsKKyAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjb2xzOyBtYl9jb2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihtdnMsICIlNWQ6JS01ZCIsIG1pW21iX2luZGV4XS5tYm1pLm12LmFzX212LnJvdyAvIDIsIG1pW21iX2luZGV4XS5tYm1pLm12LmFzX212LmNvbCAvIDIpOworCisgICAgICAgICAgICBtYl9pbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgbWJfaW5kZXgrKzsKKyAgICAgICAgZnByaW50ZihtdnMsICJcbiIpOworICAgIH0KKworICAgIGZwcmludGYobXZzLCAiXG4iKTsKKworCisgICAgLyogcHJpbnQgb3V0IHRoZSBibG9jayBtb2RlcyAqLworICAgIG1iX2luZGV4ID0gMDsKKyAgICBmcHJpbnRmKG12cywgIk1WcyBmb3IgRnJhbWUgJWRcbiIsIGZyYW1lKTsKKyAgICB7CisgICAgICAgIGludCBiX3JvdzsKKworICAgICAgICBmb3IgKGJfcm93ID0gMDsgYl9yb3cgPCA0ICogcm93czsgYl9yb3crKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJfY29sOworICAgICAgICAgICAgaW50IGJpbmRleDsKKworICAgICAgICAgICAgZm9yIChiX2NvbCA9IDA7IGJfY29sIDwgNCAqIGNvbHM7IGJfY29sKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfaW5kZXggPSAoYl9yb3cgPj4gMikgKiAoY29scyArIDEpICsgKGJfY29sID4+IDIpOworICAgICAgICAgICAgICAgIGJpbmRleCA9IChiX3JvdyAmIDMpICogNCArIChiX2NvbCAmIDMpOworICAgICAgICAgICAgICAgIGZwcmludGYobXZzLCAiJTNkOiUtM2QgIiwgbWlbbWJfaW5kZXhdLmJtaVtiaW5kZXhdLm12LmFzX212LnJvdywgbWlbbWJfaW5kZXhdLmJtaVtiaW5kZXhdLm12LmFzX212LmNvbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnByaW50ZihtdnMsICJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGZwcmludGYobXZzLCAiXG4iKTsKKworCisgICAgZmNsb3NlKG12cyk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9kZWZhdWx0X2NvZWZfcHJvYnMuaCBiL2xpYnZweC92cDgvY29tbW9uL2RlZmF1bHRfY29lZl9wcm9icy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTk1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9kZWZhdWx0X2NvZWZfcHJvYnMuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyovCisKKworLypHZW5lcmF0ZWQgZmlsZSwgaW5jbHVkZWQgYnkgZW50cm9weS5jKi8KKworCitzdGF0aWMgY29uc3QgdnA4X3Byb2IgZGVmYXVsdF9jb2VmX3Byb2JzIFtCTE9DS19UWVBFU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NPRUZfQkFORFNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVWX0NPRUZfQ09OVEVYVFNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtFTlRST1BZX05PREVTXSA9Cit7CisgICAgeyAvKiBCbG9jayBUeXBlICggMCApICovCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDAgKSovCisgICAgICAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggMSApKi8KKyAgICAgICAgICAgIHsgMjUzLCAxMzYsIDI1NCwgMjU1LCAyMjgsIDIxOSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTg5LCAxMjksIDI0MiwgMjU1LCAyMjcsIDIxMywgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTA2LCAxMjYsIDIyNywgMjUyLCAyMTQsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCAyICkqLworICAgICAgICAgICAgeyAgIDEsICA5OCwgMjQ4LCAyNTUsIDIzNiwgMjI2LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxODEsIDEzMywgMjM4LCAyNTQsIDIyMSwgMjM0LCAyNTUsIDE1NCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgNzgsIDEzNCwgMjAyLCAyNDcsIDE5OCwgMTgwLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDMgKSovCisgICAgICAgICAgICB7ICAgMSwgMTg1LCAyNDksIDI1NSwgMjQzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE4NCwgMTUwLCAyNDcsIDI1NSwgMjM2LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICA3NywgMTEwLCAyMTYsIDI1NSwgMjM2LCAyMzAsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggNCApKi8KKyAgICAgICAgICAgIHsgICAxLCAxMDEsIDI1MSwgMjU1LCAyNDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTcwLCAxMzksIDI0MSwgMjUyLCAyMzYsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDM3LCAxMTYsIDE5NiwgMjQzLCAyMjgsIDI1NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCA1ICkqLworICAgICAgICAgICAgeyAgIDEsIDIwNCwgMjU0LCAyNTUsIDI0NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyMDcsIDE2MCwgMjUwLCAyNTUsIDIzOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxMDIsIDEwMywgMjMxLCAyNTUsIDIxMSwgMTcxLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDYgKSovCisgICAgICAgICAgICB7ICAgMSwgMTUyLCAyNTIsIDI1NSwgMjQwLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE3NywgMTM1LCAyNDMsIDI1NSwgMjM0LCAyMjUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICA4MCwgMTI5LCAyMTEsIDI1NSwgMTk0LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggNyApKi8KKyAgICAgICAgICAgIHsgICAxLCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjQ2LCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9CisgICAgfSwKKyAgICB7IC8qIEJsb2NrIFR5cGUgKCAxICkgKi8KKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggMCApKi8KKyAgICAgICAgICAgIHsgMTk4LCAgMzUsIDIzNywgMjIzLCAxOTMsIDE4NywgMTYyLCAxNjAsIDE0NSwgMTU1LCAgNjIgfSwKKyAgICAgICAgICAgIHsgMTMxLCAgNDUsIDE5OCwgMjIxLCAxNzIsIDE3NiwgMjIwLCAxNTcsIDI1MiwgMjIxLCAgIDEgfSwKKyAgICAgICAgICAgIHsgIDY4LCAgNDcsIDE0NiwgMjA4LCAxNDksIDE2NywgMjIxLCAxNjIsIDI1NSwgMjIzLCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCAxICkqLworICAgICAgICAgICAgeyAgIDEsIDE0OSwgMjQxLCAyNTUsIDIyMSwgMjI0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxODQsIDE0MSwgMjM0LCAyNTMsIDIyMiwgMjIwLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgODEsICA5OSwgMTgxLCAyNDIsIDE3NiwgMTkwLCAyNDksIDIwMiwgMjU1LCAyNTUsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDIgKSovCisgICAgICAgICAgICB7ICAgMSwgMTI5LCAyMzIsIDI1MywgMjE0LCAxOTcsIDI0MiwgMTk2LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICAgICAgICB7ICA5OSwgMTIxLCAyMTAsIDI1MCwgMjAxLCAxOTgsIDI1NSwgMjAyLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAyMywgIDkxLCAxNjMsIDI0MiwgMTcwLCAxODcsIDI0NywgMjEwLCAyNTUsIDI1NSwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggMyApKi8KKyAgICAgICAgICAgIHsgICAxLCAyMDAsIDI0NiwgMjU1LCAyMzQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTA5LCAxNzgsIDI0MSwgMjU1LCAyMzEsIDI0NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDQ0LCAxMzAsIDIwMSwgMjUzLCAyMDUsIDE5MiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCA0ICkqLworICAgICAgICAgICAgeyAgIDEsIDEzMiwgMjM5LCAyNTEsIDIxOSwgMjA5LCAyNTUsIDE2NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgOTQsIDEzNiwgMjI1LCAyNTEsIDIxOCwgMTkwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgMjIsIDEwMCwgMTc0LCAyNDUsIDE4NiwgMTYxLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDUgKSovCisgICAgICAgICAgICB7ICAgMSwgMTgyLCAyNDksIDI1NSwgMjMyLCAyMzUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyNCwgMTQzLCAyNDEsIDI1NSwgMjI3LCAyMzQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAzNSwgIDc3LCAxODEsIDI1MSwgMTkzLCAyMTEsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggNiApKi8KKyAgICAgICAgICAgIHsgICAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTIxLCAxNDEsIDIzNSwgMjU1LCAyMjUsIDIyNywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDQ1LCAgOTksIDE4OCwgMjUxLCAxOTUsIDIxNywgMjU1LCAyMjQsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCA3ICkqLworICAgICAgICAgICAgeyAgIDEsICAgMSwgMjUxLCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyMDMsICAgMSwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxMzcsICAgMSwgMTc3LCAyNTUsIDIyNCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgLyogQmxvY2sgVHlwZSAoIDIgKSAqLworICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCAwICkqLworICAgICAgICAgICAgeyAyNTMsICAgOSwgMjQ4LCAyNTEsIDIwNywgMjA4LCAyNTUsIDE5MiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxNzUsICAxMywgMjI0LCAyNDMsIDE5MywgMTg1LCAyNDksIDE5OCwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgICAgICAgeyAgNzMsICAxNywgMTcxLCAyMjEsIDE2MSwgMTc5LCAyMzYsIDE2NywgMjU1LCAyMzQsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDEgKSovCisgICAgICAgICAgICB7ICAgMSwgIDk1LCAyNDcsIDI1MywgMjEyLCAxODMsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDIzOSwgIDkwLCAyNDQsIDI1MCwgMjExLCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE1NSwgIDc3LCAxOTUsIDI0OCwgMTg4LCAxOTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggMiApKi8KKyAgICAgICAgICAgIHsgICAxLCAgMjQsIDIzOSwgMjUxLCAyMTgsIDIxOSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjAxLCAgNTEsIDIxOSwgMjU1LCAxOTYsIDE4NiwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDY5LCAgNDYsIDE5MCwgMjM5LCAyMDEsIDIxOCwgMjU1LCAyMjgsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCAzICkqLworICAgICAgICAgICAgeyAgIDEsIDE5MSwgMjUxLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyMjMsIDE2NSwgMjQ5LCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxNDEsIDEyNCwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDQgKSovCisgICAgICAgICAgICB7ICAgMSwgIDE2LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE5MCwgIDM2LCAyMzAsIDI1NSwgMjM2LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE0OSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggNSApKi8KKyAgICAgICAgICAgIHsgICAxLCAyMjYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjQ3LCAxOTIsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjQwLCAxMjgsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCA2ICkqLworICAgICAgICAgICAgeyAgIDEsIDEzNCwgMjUyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyMTMsICA2MiwgMjUwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgNTUsICA5MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDcgKSovCisgICAgICAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAvKiBCbG9jayBUeXBlICggMyApICovCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDAgKSovCisgICAgICAgICAgICB7IDIwMiwgIDI0LCAyMTMsIDIzNSwgMTg2LCAxOTEsIDIyMCwgMTYwLCAyNDAsIDE3NSwgMjU1IH0sCisgICAgICAgICAgICB7IDEyNiwgIDM4LCAxODIsIDIzMiwgMTY5LCAxODQsIDIyOCwgMTc0LCAyNTUsIDE4NywgMTI4IH0sCisgICAgICAgICAgICB7ICA2MSwgIDQ2LCAxMzgsIDIxOSwgMTUxLCAxNzgsIDI0MCwgMTcwLCAyNTUsIDIxNiwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggMSApKi8KKyAgICAgICAgICAgIHsgICAxLCAxMTIsIDIzMCwgMjUwLCAxOTksIDE5MSwgMjQ3LCAxNTksIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTY2LCAxMDksIDIyOCwgMjUyLCAyMTEsIDIxNSwgMjU1LCAxNzQsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDM5LCAgNzcsIDE2MiwgMjMyLCAxNzIsIDE4MCwgMjQ1LCAxNzgsIDI1NSwgMjU1LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCAyICkqLworICAgICAgICAgICAgeyAgIDEsICA1MiwgMjIwLCAyNDYsIDE5OCwgMTk5LCAyNDksIDIyMCwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgICAgICAgeyAxMjQsICA3NCwgMTkxLCAyNDMsIDE4MywgMTkzLCAyNTAsIDIyMSwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgICAgICAgeyAgMjQsICA3MSwgMTMwLCAyMTksIDE1NCwgMTcwLCAyNDMsIDE4MiwgMjU1LCAyNTUsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDMgKSovCisgICAgICAgICAgICB7ICAgMSwgMTgyLCAyMjUsIDI0OSwgMjE5LCAyNDAsIDI1NSwgMjI0LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE0OSwgMTUwLCAyMjYsIDI1MiwgMjE2LCAyMDUsIDI1NSwgMTcxLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAyOCwgMTA4LCAxNzAsIDI0MiwgMTgzLCAxOTQsIDI1NCwgMjIzLCAyNTUsIDI1NSwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggNCApKi8KKyAgICAgICAgICAgIHsgICAxLCAgODEsIDIzMCwgMjUyLCAyMDQsIDIwMywgMjU1LCAxOTIsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTIzLCAxMDIsIDIwOSwgMjQ3LCAxODgsIDE5NiwgMjU1LCAyMzMsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDIwLCAgOTUsIDE1MywgMjQzLCAxNjQsIDE3MywgMjU1LCAyMDMsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9LAorICAgICAgICB7IC8qIENvZWZmIEJhbmQgKCA1ICkqLworICAgICAgICAgICAgeyAgIDEsIDIyMiwgMjQ4LCAyNTUsIDIxNiwgMjEzLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxNjgsIDE3NSwgMjQ2LCAyNTIsIDIzNSwgMjA1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgNDcsIDExNiwgMjE1LCAyNTUsIDIxMSwgMjEyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgICAgIH0sCisgICAgICAgIHsgLyogQ29lZmYgQmFuZCAoIDYgKSovCisgICAgICAgICAgICB7ICAgMSwgMTIxLCAyMzYsIDI1MywgMjEyLCAyMTQsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE0MSwgIDg0LCAyMTMsIDI1MiwgMjAxLCAyMDIsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICA0MiwgIDgwLCAxNjAsIDI0MCwgMTYyLCAxODUsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBDb2VmZiBCYW5kICggNyApKi8KKyAgICAgICAgICAgIHsgICAxLCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjQ0LCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjM4LCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgICAgICB9CisgICAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2RlcXVhbnRpemUuYyBiL2xpYnZweC92cDgvY29tbW9uL2RlcXVhbnRpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRhNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vZGVxdWFudGl6ZS5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKwordm9pZCB2cDhfZGVxdWFudGl6ZV9iX2MoQkxPQ0tEICpkLCBzaG9ydCAqRFFDKQoreworICAgIGludCBpOworICAgIHNob3J0ICpEUSAgPSBkLT5kcWNvZWZmOworICAgIHNob3J0ICpRICAgPSBkLT5xY29lZmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIERRW2ldID0gUVtpXSAqIERRQ1tpXTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgc3RyaWRlKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBpbnB1dFtpXSA9IGRxW2ldICogaW5wdXRbaV07CisgICAgfQorCisgICAgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYyhpbnB1dCwgZGVzdCwgc3RyaWRlLCBkZXN0LCBzdHJpZGUpOworCisgICAgdnB4X21lbXNldChpbnB1dCwgMCwgMzIpOworCit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9lbnRyb3B5LmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9lbnRyb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNDZhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHkuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAiZW50cm9weS5oIgorI2luY2x1ZGUgImJsb2NrZC5oIgorI2luY2x1ZGUgIm9ueXhjX2ludC5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorCisjaW5jbHVkZSAiY29lZnVwZGF0ZXByb2JzLmgiCisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgdW5zaWduZWQgY2hhciwgdnA4X25vcm1bMjU2XSkgPQoreworICAgIDAsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgdW5zaWduZWQgY2hhciwgdnA4X2NvZWZfYmFuZHNbMTZdKSA9Cit7IDAsIDEsIDIsIDMsIDYsIDQsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDd9OworCitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgdnA4X3ByZXZfdG9rZW5fY2xhc3NbTUFYX0VOVFJPUFlfVE9LRU5TXSkgPQoreyAwLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAwfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBpbnQsIHZwOF9kZWZhdWx0X3ppZ196YWcxZFsxNl0pID0KK3sKKyAgICAwLCAgMSwgIDQsICA4LAorICAgIDUsICAyLCAgMywgIDYsCisgICAgOSwgMTIsIDEzLCAxMCwKKyAgICA3LCAxMSwgMTQsIDE1LAorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X2RlZmF1bHRfaW52X3ppZ196YWdbMTZdKSA9Cit7CisgICAgMSwgIDIsICA2LCAgNywKKyAgICAzLCAgNSwgIDgsIDEzLAorICAgIDQsICA5LCAxMiwgMTQsCisgICAxMCwgMTEsIDE1LCAxNgorfTsKKworLyogdnA4X2RlZmF1bHRfemlnX3phZ19tYXNrIGdlbmVyYXRlZCB3aXRoOgorCisgICAgdm9pZCB2cDhfaW5pdF9zY2FuX29yZGVyX21hc2soKQorICAgIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9kZWZhdWx0X3ppZ196YWdfbWFza1t2cDhfZGVmYXVsdF96aWdfemFnMWRbaV1dID0gMSA8PCBpOworICAgICAgICB9CisKKyAgICB9CisqLworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X2RlZmF1bHRfemlnX3phZ19tYXNrWzE2XSkgPQoreworICAgICAxLCAgICAyLCAgICAzMiwgICAgIDY0LAorICAgICA0LCAgIDE2LCAgIDEyOCwgICA0MDk2LAorICAgICA4LCAgMjU2LCAgMjA0OCwgICA4MTkyLAorICAgNTEyLCAxMDI0LCAxNjM4NCwgLTMyNzY4Cit9OworCitjb25zdCBpbnQgdnA4X21iX2ZlYXR1cmVfZGF0YV9iaXRzW01CX0xWTF9NQVhdID0gezcsIDZ9OworCisvKiBBcnJheSBpbmRpY2VzIGFyZSBpZGVudGljYWwgdG8gcHJldmlvdXNseS1leGlzdGluZyBDT05URVhUX05PREUgaW5kaWNlcyAqLworCitjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfY29lZl90cmVlWyAyMl0gPSAgICAgLyogY29ycmVzcG9uZGluZyBfQ09OVEVYVF9OT0RFcyAqLworeworICAgIC1EQ1RfRU9CX1RPS0VOLCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9IEVPQiAqLworICAgIC1aRVJPX1RPS0VOLCA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxID0gWkVSTyAqLworICAgIC1PTkVfVE9LRU4sIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPSBPTkUgKi8KKyAgICA4LCAxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgPSBMT1dfVkFMICovCisgICAgLVRXT19UT0tFTiwgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgPSBUV08gKi8KKyAgICAtVEhSRUVfVE9LRU4sIC1GT1VSX1RPS0VOLCAgICAgICAgICAgICAgICAvKiA1ID0gVEhSRUUgKi8KKyAgICAxNCwgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiA9IEhJR0hfTE9XICovCisgICAgLURDVF9WQUxfQ0FURUdPUlkxLCAtRENUX1ZBTF9DQVRFR09SWTIsICAgLyogNyA9IENBVF9PTkUgKi8KKyAgICAxOCwgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4ID0gQ0FUX1RIUkVFRk9VUiAqLworICAgIC1EQ1RfVkFMX0NBVEVHT1JZMywgLURDVF9WQUxfQ0FURUdPUlk0LCAgLyogOSA9IENBVF9USFJFRSAqLworICAgIC1EQ1RfVkFMX0NBVEVHT1JZNSwgLURDVF9WQUxfQ0FURUdPUlk2ICAgLyogMTAgPSBDQVRfRklWRSAqLworfTsKKworLyogdnA4X2NvZWZfZW5jb2RpbmdzIGdlbmVyYXRlZCB3aXRoOgorICAgIHZwOF90b2tlbnNfZnJvbV90cmVlKHZwOF9jb2VmX2VuY29kaW5ncywgdnA4X2NvZWZfdHJlZSk7CisqLwordnA4X3Rva2VuIHZwOF9jb2VmX2VuY29kaW5nc1tNQVhfRU5UUk9QWV9UT0tFTlNdID0KK3sKKyAgICB7MiwgMn0sCisgICAgezYsIDN9LAorICAgIHsyOCwgNX0sCisgICAgezU4LCA2fSwKKyAgICB7NTksIDZ9LAorICAgIHs2MCwgNn0sCisgICAgezYxLCA2fSwKKyAgICB7MTI0LCA3fSwKKyAgICB7MTI1LCA3fSwKKyAgICB7MTI2LCA3fSwKKyAgICB7MTI3LCA3fSwKKyAgICB7MCwgMX0KK307CisKKy8qIFRyZWVzIGZvciBleHRyYSBiaXRzLiAgUHJvYmFiaWxpdGllcyBhcmUgY29uc3RhbnQgYW5kCisgICBkbyBub3QgZGVwZW5kIG9uIHByZXZpb3VzbHkgZW5jb2RlZCBiaXRzICovCisKK3N0YXRpYyBjb25zdCB2cDhfcHJvYiBQY2F0MVtdID0geyAxNTl9Oworc3RhdGljIGNvbnN0IHZwOF9wcm9iIFBjYXQyW10gPSB7IDE2NSwgMTQ1fTsKK3N0YXRpYyBjb25zdCB2cDhfcHJvYiBQY2F0M1tdID0geyAxNzMsIDE0OCwgMTQwfTsKK3N0YXRpYyBjb25zdCB2cDhfcHJvYiBQY2F0NFtdID0geyAxNzYsIDE1NSwgMTQwLCAxMzV9Oworc3RhdGljIGNvbnN0IHZwOF9wcm9iIFBjYXQ1W10gPSB7IDE4MCwgMTU3LCAxNDEsIDEzNCwgMTMwfTsKK3N0YXRpYyBjb25zdCB2cDhfcHJvYiBQY2F0NltdID0KK3sgMjU0LCAyNTQsIDI0MywgMjMwLCAxOTYsIDE3NywgMTUzLCAxNDAsIDEzMywgMTMwLCAxMjl9OworCisKKy8qIHRyZWUgaW5kZXggdGFibGVzIGdlbmVyYXRlZCB3aXRoOgorCisgICAgdm9pZCBpbml0X2JpdF90cmVlKHZwOF90cmVlX2luZGV4ICpwLCBpbnQgbikKKyAgICB7CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICB3aGlsZSAoKytpIDwgbikKKyAgICAgICAgeworICAgICAgICAgICAgcFswXSA9IHBbMV0gPSBpIDw8IDE7CisgICAgICAgICAgICBwICs9IDI7CisgICAgICAgIH0KKworICAgICAgICBwWzBdID0gcFsxXSA9IDA7CisgICAgfQorCisgICAgdm9pZCBpbml0X2JpdF90cmVlcygpCisgICAgeworICAgICAgICBpbml0X2JpdF90cmVlKGNhdDEsIDEpOworICAgICAgICBpbml0X2JpdF90cmVlKGNhdDIsIDIpOworICAgICAgICBpbml0X2JpdF90cmVlKGNhdDMsIDMpOworICAgICAgICBpbml0X2JpdF90cmVlKGNhdDQsIDQpOworICAgICAgICBpbml0X2JpdF90cmVlKGNhdDUsIDUpOworICAgICAgICBpbml0X2JpdF90cmVlKGNhdDYsIDExKTsKKyAgICB9CisqLworCitzdGF0aWMgY29uc3QgdnA4X3RyZWVfaW5kZXggY2F0MVsyXSA9IHsgMCwgMCB9Oworc3RhdGljIGNvbnN0IHZwOF90cmVlX2luZGV4IGNhdDJbNF0gPSB7IDIsIDIsIDAsIDAgfTsKK3N0YXRpYyBjb25zdCB2cDhfdHJlZV9pbmRleCBjYXQzWzZdID0geyAyLCAyLCA0LCA0LCAwLCAwIH07CitzdGF0aWMgY29uc3QgdnA4X3RyZWVfaW5kZXggY2F0NFs4XSA9IHsgMiwgMiwgNCwgNCwgNiwgNiwgMCwgMCB9Oworc3RhdGljIGNvbnN0IHZwOF90cmVlX2luZGV4IGNhdDVbMTBdID0geyAyLCAyLCA0LCA0LCA2LCA2LCA4LCA4LCAwLCAwIH07CitzdGF0aWMgY29uc3QgdnA4X3RyZWVfaW5kZXggY2F0NlsyMl0gPSB7IDIsIDIsIDQsIDQsIDYsIDYsIDgsIDgsIDEwLCAxMCwgMTIsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LCAxNCwgMTYsIDE2LCAxOCwgMTgsIDIwLCAyMCwgMCwgMCB9OworCitjb25zdCB2cDhfZXh0cmFfYml0X3N0cnVjdCB2cDhfZXh0cmFfYml0c1sxMl0gPQoreworICAgIHsgMCwgMCwgMCwgMH0sCisgICAgeyAwLCAwLCAwLCAxfSwKKyAgICB7IDAsIDAsIDAsIDJ9LAorICAgIHsgMCwgMCwgMCwgM30sCisgICAgeyAwLCAwLCAwLCA0fSwKKyAgICB7IGNhdDEsIFBjYXQxLCAxLCA1fSwKKyAgICB7IGNhdDIsIFBjYXQyLCAyLCA3fSwKKyAgICB7IGNhdDMsIFBjYXQzLCAzLCAxMX0sCisgICAgeyBjYXQ0LCBQY2F0NCwgNCwgMTl9LAorICAgIHsgY2F0NSwgUGNhdDUsIDUsIDM1fSwKKyAgICB7IGNhdDYsIFBjYXQ2LCAxMSwgNjd9LAorICAgIHsgMCwgMCwgMCwgMH0KK307CisKKyNpbmNsdWRlICJkZWZhdWx0X2NvZWZfcHJvYnMuaCIKKwordm9pZCB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKFZQOF9DT01NT04gKnBjKQoreworICAgIHZweF9tZW1jcHkocGMtPmZjLmNvZWZfcHJvYnMsIGRlZmF1bHRfY29lZl9wcm9icywKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZGVmYXVsdF9jb2VmX3Byb2JzKSk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHkuaCBiL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg5YmMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vZW50cm9weS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19FTlRST1BZX0gKKyNkZWZpbmUgX19JTkNfRU5UUk9QWV9ICisKKyNpbmNsdWRlICJ0cmVlY29kZXIuaCIKKyNpbmNsdWRlICJibG9ja2QuaCIKKworLyogQ29lZmZpY2llbnQgdG9rZW4gYWxwaGFiZXQgKi8KKworI2RlZmluZSBaRVJPX1RPS0VOICAgICAgICAgICAgICAwICAgICAgIC8qIDAgICAgICAgICBFeHRyYSBCaXRzIDArMCAqLworI2RlZmluZSBPTkVfVE9LRU4gICAgICAgICAgICAgICAxICAgICAgIC8qIDEgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLworI2RlZmluZSBUV09fVE9LRU4gICAgICAgICAgICAgICAyICAgICAgIC8qIDIgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLworI2RlZmluZSBUSFJFRV9UT0tFTiAgICAgICAgICAgICAzICAgICAgIC8qIDMgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLworI2RlZmluZSBGT1VSX1RPS0VOICAgICAgICAgICAgICA0ICAgICAgIC8qIDQgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLworI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZMSAgICAgICA1ICAgICAgIC8qIDUtNiAgICAgICBFeHRyYSBCaXRzIDErMSAqLworI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZMiAgICAgICA2ICAgICAgIC8qIDctMTAgICAgICBFeHRyYSBCaXRzIDIrMSAqLworI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZMyAgICAgICA3ICAgICAgIC8qIDExLTE4ICAgICBFeHRyYSBCaXRzIDMrMSAqLworI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZNCAgICAgICA4ICAgICAgIC8qIDE5LTM0ICAgICBFeHRyYSBCaXRzIDQrMSAqLworI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZNSAgICAgICA5ICAgICAgIC8qIDM1LTY2ICAgICBFeHRyYSBCaXRzIDUrMSAqLworI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZNiAgICAgICAxMCAgICAgIC8qIDY3KyAgICAgICBFeHRyYSBCaXRzIDExKzEgKi8KKyNkZWZpbmUgRENUX0VPQl9UT0tFTiAgICAgICAgICAgMTEgICAgICAvKiBFT0IgICAgICAgRXh0cmEgQml0cyAwKzAgKi8KKworI2RlZmluZSBNQVhfRU5UUk9QWV9UT0tFTlMgMTIKKyNkZWZpbmUgRU5UUk9QWV9OT0RFUyAxMQorCitleHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X2NvZWZfdHJlZVtdOworCitleHRlcm4gY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X2NvZWZfZW5jb2RpbmdzW01BWF9FTlRST1BZX1RPS0VOU107CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdnA4X3RyZWVfcCB0cmVlOworICAgIGNvbnN0IHZwOF9wcm9iICpwcm9iOworICAgIGludCBMZW47CisgICAgaW50IGJhc2VfdmFsOworfSB2cDhfZXh0cmFfYml0X3N0cnVjdDsKKworZXh0ZXJuIGNvbnN0IHZwOF9leHRyYV9iaXRfc3RydWN0IHZwOF9leHRyYV9iaXRzWzEyXTsgICAgLyogaW5kZXhlZCBieSB0b2tlbiB2YWx1ZSAqLworCisjZGVmaW5lIFBST0JfVVBEQVRFX0JBU0VMSU5FX0NPU1QgICA3CisKKyNkZWZpbmUgTUFYX1BST0IgICAgICAgICAgICAgICAgMjU1CisjZGVmaW5lIERDVF9NQVhfVkFMVUUgICAgICAgICAgIDIwNDgKKworCisvKiBDb2VmZmljaWVudHMgYXJlIHByZWRpY3RlZCB2aWEgYSAzLWRpbWVuc2lvbmFsIHByb2JhYmlsaXR5IHRhYmxlLiAqLworCisvKiBPdXRzaWRlIGRpbWVuc2lvbi4gIDAgPSBZIG5vIERDLCAxID0gWTIsIDIgPSBVViwgMyA9IFkgd2l0aCBEQyAqLworCisjZGVmaW5lIEJMT0NLX1RZUEVTIDQKKworLyogTWlkZGxlIGRpbWVuc2lvbiBpcyBhIGNvYXJzZW5pbmcgb2YgdGhlIGNvZWZmaWNpZW50J3MKKyAgIHBvc2l0aW9uIHdpdGhpbiB0aGUgNHg0IERDVC4gKi8KKworI2RlZmluZSBDT0VGX0JBTkRTIDgKK2V4dGVybiBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHVuc2lnbmVkIGNoYXIsIHZwOF9jb2VmX2JhbmRzWzE2XSk7CisKKy8qIEluc2lkZSBkaW1lbnNpb24gaXMgMy12YWx1ZWQgbWVhc3VyZSBvZiBuZWFyYnkgY29tcGxleGl0eSwgdGhhdCBpcywKKyAgIHRoZSBleHRlbnQgdG8gd2hpY2ggbmVhcmJ5IGNvZWZmaWNpZW50cyBhcmUgbm9uemVyby4gIEZvciB0aGUgZmlyc3QKKyAgIGNvZWZmaWNpZW50IChEQywgdW5sZXNzIGJsb2NrIHR5cGUgaXMgMCksIHdlIGxvb2sgYXQgdGhlIChhbHJlYWR5IGVuY29kZWQpCisgICBibG9ja3MgYWJvdmUgYW5kIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrLiAgVGhlIGNvbnRleHQgaW5kZXggaXMKKyAgIHRoZW4gdGhlIG51bWJlciAoMCwxLG9yIDIpIG9mIHRoZXNlIGJsb2NrcyBoYXZpbmcgbm9uemVybyBjb2VmZmljaWVudHMuCisgICBBZnRlciBkZWNvZGluZyBhIGNvZWZmaWNpZW50LCB0aGUgbWVhc3VyZSBpcyByb3VnaGx5IHRoZSBzaXplIG9mIHRoZQorICAgbW9zdCByZWNlbnRseSBkZWNvZGVkIGNvZWZmaWNpZW50ICgwIGZvciAwLCAxIGZvciAxLCAyIGZvciA+MSkuCisgICBOb3RlIHRoYXQgdGhlIGludHVpdGl2ZSBtZWFuaW5nIG9mIHRoaXMgbWVhc3VyZSBjaGFuZ2VzIGFzIGNvZWZmaWNpZW50cworICAgYXJlIGRlY29kZWQsIGUuZy4sIHByaW9yIHRvIHRoZSBmaXJzdCB0b2tlbiwgYSB6ZXJvIG1lYW5zIHRoYXQgbXkgbmVpZ2hib3JzCisgICBhcmUgZW1wdHkgd2hpbGUsIGFmdGVyIHRoZSBmaXJzdCB0b2tlbiwgYmVjYXVzZSBvZiB0aGUgdXNlIG9mIGVuZC1vZi1ibG9jaywKKyAgIGEgemVybyBtZWFucyB3ZSBqdXN0IGRlY29kZWQgYSB6ZXJvIGFuZCBoZW5jZSBndWFyYW50ZWVzIHRoYXQgYSBub24temVybworICAgY29lZmZpY2llbnQgd2lsbCBhcHBlYXIgbGF0ZXIgaW4gdGhpcyBibG9jay4gIEhvd2V2ZXIsIHRoaXMgc2hpZnQKKyAgIGluIG1lYW5pbmcgaXMgcGVyZmVjdGx5IE9LIGJlY2F1c2Ugb3VyIGNvbnRleHQgZGVwZW5kcyBhbHNvIG9uIHRoZQorICAgY29lZmZpY2llbnQgYmFuZCAoYW5kIHNpbmNlIHppZ3phZyBwb3NpdGlvbnMgMCwgMSwgYW5kIDIgYXJlIGluCisgICBkaXN0aW5jdCBiYW5kcykuICovCisKKy8qIyBkZWZpbmUgRENfVE9LRU5fQ09OVEVYVFMgICAgICAgIDMqLyAvKiAwMCwgMCEwLCAhMCEwICovCisjICAgZGVmaW5lIFBSRVZfQ09FRl9DT05URVhUUyAgICAgICAzCisKK2V4dGVybiBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHVuc2lnbmVkIGNoYXIsIHZwOF9wcmV2X3Rva2VuX2NsYXNzW01BWF9FTlRST1BZX1RPS0VOU10pOworCitleHRlcm4gY29uc3QgdnA4X3Byb2IgdnA4X2NvZWZfdXBkYXRlX3Byb2JzIFtCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFtFTlRST1BZX05PREVTXTsKKworCitzdHJ1Y3QgVlA4Q29tbW9uOwordm9pZCB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKHN0cnVjdCBWUDhDb21tb24gKik7CisKK2V4dGVybiBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IGludCwgdnA4X2RlZmF1bHRfemlnX3phZzFkWzE2XSk7CitleHRlcm4gREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X2RlZmF1bHRfaW52X3ppZ196YWdbMTZdKTsKK2V4dGVybiBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHNob3J0LCB2cDhfZGVmYXVsdF96aWdfemFnX21hc2tbMTZdKTsKK2V4dGVybiBjb25zdCBpbnQgdnA4X21iX2ZlYXR1cmVfZGF0YV9iaXRzW01CX0xWTF9NQVhdOworCit2b2lkIHZwOF9jb2VmX3RyZWVfaW5pdGlhbGl6ZSh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vZW50cm9weW1vZGUuYyBiL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHltb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxZTRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHltb2RlLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2RlZmluZSBVU0VfUFJFQlVJTFRfVEFCTEVTCisKKyNpbmNsdWRlICJlbnRyb3B5bW9kZS5oIgorI2luY2x1ZGUgImVudHJvcHkuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKworI2luY2x1ZGUgInZwOF9lbnRyb3B5bW9kZWRhdGEuaCIKKworaW50IHZwOF9tdl9jb250KGNvbnN0IGludF9tdiAqbCwgY29uc3QgaW50X212ICphKQoreworICAgIGludCBsZXogPSAobC0+YXNfaW50ID09IDApOworICAgIGludCBhZXogPSAoYS0+YXNfaW50ID09IDApOworICAgIGludCBsZWEgPSAobC0+YXNfaW50ID09IGEtPmFzX2ludCk7CisKKyAgICBpZiAobGVhICYmIGxleikKKyAgICAgICAgcmV0dXJuIFNVQk1WUkVGX0xFRlRfQUJPVkVfWkVEOworCisgICAgaWYgKGxlYSkKKyAgICAgICAgcmV0dXJuIFNVQk1WUkVGX0xFRlRfQUJPVkVfU0FNRTsKKworICAgIGlmIChhZXopCisgICAgICAgIHJldHVybiBTVUJNVlJFRl9BQk9WRV9aRUQ7CisKKyAgICBpZiAobGV6KQorICAgICAgICByZXR1cm4gU1VCTVZSRUZfTEVGVF9aRUQ7CisKKyAgICByZXR1cm4gU1VCTVZSRUZfTk9STUFMOworfQorCitzdGF0aWMgY29uc3QgdnA4X3Byb2Igc3ViX212X3JlZl9wcm9iIFtWUDhfU1VCTVZSRUZTLTFdID0geyAxODAsIDE2MiwgMjV9OworCitjb25zdCB2cDhfcHJvYiB2cDhfc3ViX212X3JlZl9wcm9iMiBbU1VCTVZSRUZfQ09VTlRdW1ZQOF9TVUJNVlJFRlMtMV0gPQoreworICAgIHsgMTQ3LCAxMzYsIDE4IH0sCisgICAgeyAxMDYsIDE0NSwgMSAgfSwKKyAgICB7IDE3OSwgMTIxLCAxICB9LAorICAgIHsgMjIzLCAxICAsIDM0IH0sCisgICAgeyAyMDgsIDEgICwgMSAgfQorfTsKKworCisKK2NvbnN0IHZwOF9tYnNwbGl0IHZwOF9tYnNwbGl0cyBbVlA4X05VTU1CU1BMSVRTXSA9Cit7CisgICAgeworICAgICAgICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLAorICAgICAgICAxLCAgMSwgIDEsICAxLAorICAgICAgICAxLCAgMSwgIDEsICAxLAorICAgIH0sCisgICAgeworICAgICAgICAwLCAgMCwgIDEsICAxLAorICAgICAgICAwLCAgMCwgIDEsICAxLAorICAgICAgICAwLCAgMCwgIDEsICAxLAorICAgICAgICAwLCAgMCwgIDEsICAxLAorICAgIH0sCisgICAgeworICAgICAgICAwLCAgMCwgIDEsICAxLAorICAgICAgICAwLCAgMCwgIDEsICAxLAorICAgICAgICAyLCAgMiwgIDMsICAzLAorICAgICAgICAyLCAgMiwgIDMsICAzLAorICAgIH0sCisgICAgeworICAgICAgICAwLCAgMSwgIDIsICAzLAorICAgICAgICA0LCAgNSwgIDYsICA3LAorICAgICAgICA4LCAgOSwgIDEwLCAxMSwKKyAgICAgICAgMTIsIDEzLCAxNCwgMTUsCisgICAgfQorfTsKKworY29uc3QgaW50IHZwOF9tYnNwbGl0X2NvdW50IFtWUDhfTlVNTUJTUExJVFNdID0geyAyLCAyLCA0LCAxNn07CisKK2NvbnN0IHZwOF9wcm9iIHZwOF9tYnNwbGl0X3Byb2JzIFtWUDhfTlVNTUJTUExJVFMtMV0gPSB7IDExMCwgMTExLCAxNTB9OworCisKKy8qIEFycmF5IGluZGljZXMgYXJlIGlkZW50aWNhbCB0byBwcmV2aW91c2x5LWV4aXN0aW5nIElOVFJBTU9ERUNPTlRFWFROT0RFUy4gKi8KKworY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X2Jtb2RlX3RyZWVbMThdID0gICAgIC8qIElOVFJBTU9ERUNPTlRFWFROT0RFIHZhbHVlICovCit7CisgICAgLUJfRENfUFJFRCwgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPSBEQ19OT0RFICovCisgICAgLUJfVE1fUFJFRCwgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA9IFRNX05PREUgKi8KKyAgICAtQl9WRV9QUkVELCA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPSBWRV9OT0RFICovCisgICAgOCwgMTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgPSBDT01fTk9ERSAqLworICAgIC1CX0hFX1BSRUQsIDEwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgPSBIRV9OT0RFICovCisgICAgLUJfUkRfUFJFRCwgLUJfVlJfUFJFRCwgICAgICAgICAgICAgICAvKiA1ID0gUkRfTk9ERSAqLworICAgIC1CX0xEX1BSRUQsIDE0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYgPSBMRF9OT0RFICovCisgICAgLUJfVkxfUFJFRCwgMTYsICAgICAgICAgICAgICAgICAgICAgIC8qIDcgPSBWTF9OT0RFICovCisgICAgLUJfSERfUFJFRCwgLUJfSFVfUFJFRCAgICAgICAgICAgICAvKiA4ID0gSERfTk9ERSAqLworfTsKKworLyogQWdhaW4sIHRoZXNlIHRyZWVzIHVzZSB0aGUgc2FtZSBwcm9iYWJpbGl0eSBpbmRpY2VzIGFzIHRoZWlyCisgICBleHBsaWNpdGx5LXByb2dyYW1tZWQgcHJlZGVjZXNzb3JzLiAqLworCitjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfeW1vZGVfdHJlZVs4XSA9Cit7CisgICAgLURDX1BSRUQsIDIsCisgICAgNCwgNiwKKyAgICAtVl9QUkVELCAtSF9QUkVELAorICAgIC1UTV9QUkVELCAtQl9QUkVECit9OworCitjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfa2ZfeW1vZGVfdHJlZVs4XSA9Cit7CisgICAgLUJfUFJFRCwgMiwKKyAgICA0LCA2LAorICAgIC1EQ19QUkVELCAtVl9QUkVELAorICAgIC1IX1BSRUQsIC1UTV9QUkVECit9OworCitjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfdXZfbW9kZV90cmVlWzZdID0KK3sKKyAgICAtRENfUFJFRCwgMiwKKyAgICAtVl9QUkVELCA0LAorICAgIC1IX1BSRUQsIC1UTV9QUkVECit9OworCitjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfbWJzcGxpdF90cmVlWzZdID0KK3sKKyAgICAtMywgMiwKKyAgICAtMiwgNCwKKyAgICAtMCwgLTEKK307CisKK2NvbnN0IHZwOF90cmVlX2luZGV4IHZwOF9tdl9yZWZfdHJlZVs4XSA9Cit7CisgICAgLVpFUk9NViwgMiwKKyAgICAtTkVBUkVTVE1WLCA0LAorICAgIC1ORUFSTVYsIDYsCisgICAgLU5FV01WLCAtU1BMSVRNVgorfTsKKworY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X3N1Yl9tdl9yZWZfdHJlZVs2XSA9Cit7CisgICAgLUxFRlQ0WDQsIDIsCisgICAgLUFCT1ZFNFg0LCA0LAorICAgIC1aRVJPNFg0LCAtTkVXNFg0Cit9OworCitjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfc21hbGxfbXZ0cmVlIFsxNF0gPQoreworICAgIDIsIDgsCisgICAgNCwgNiwKKyAgICAtMCwgLTEsCisgICAgLTIsIC0zLAorICAgIDEwLCAxMiwKKyAgICAtNCwgLTUsCisgICAgLTYsIC03Cit9OworCit2b2lkIHZwOF9pbml0X21ibW9kZV9wcm9icyhWUDhfQ09NTU9OICp4KQoreworICAgIHZweF9tZW1jcHkoeC0+ZmMueW1vZGVfcHJvYiwgdnA4X3ltb2RlX3Byb2IsIHNpemVvZih2cDhfeW1vZGVfcHJvYikpOworICAgIHZweF9tZW1jcHkoeC0+ZmMudXZfbW9kZV9wcm9iLCB2cDhfdXZfbW9kZV9wcm9iLCBzaXplb2YodnA4X3V2X21vZGVfcHJvYikpOworICAgIHZweF9tZW1jcHkoeC0+ZmMuc3ViX212X3JlZl9wcm9iLCBzdWJfbXZfcmVmX3Byb2IsIHNpemVvZihzdWJfbXZfcmVmX3Byb2IpKTsKK30KKwordm9pZCB2cDhfZGVmYXVsdF9ibW9kZV9wcm9icyh2cDhfcHJvYiBwIFtWUDhfQklOVFJBTU9ERVMtMV0pCit7CisgICAgdnB4X21lbWNweShwLCB2cDhfYm1vZGVfcHJvYiwgc2l6ZW9mKHZwOF9ibW9kZV9wcm9iKSk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHltb2RlLmggYi9saWJ2cHgvdnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjBmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX0VOVFJPUFlNT0RFX0gKKyNkZWZpbmUgX19JTkNfRU5UUk9QWU1PREVfSAorCisjaW5jbHVkZSAib255eGNfaW50LmgiCisjaW5jbHVkZSAidHJlZWNvZGVyLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIFNVQk1WUkVGX05PUk1BTCwKKyAgICBTVUJNVlJFRl9MRUZUX1pFRCwKKyAgICBTVUJNVlJFRl9BQk9WRV9aRUQsCisgICAgU1VCTVZSRUZfTEVGVF9BQk9WRV9TQU1FLAorICAgIFNVQk1WUkVGX0xFRlRfQUJPVkVfWkVECit9IHN1bXZmcmVmX3Q7CisKK3R5cGVkZWYgaW50IHZwOF9tYnNwbGl0WzE2XTsKKworI2RlZmluZSBWUDhfTlVNTUJTUExJVFMgNAorCitleHRlcm4gY29uc3QgdnA4X21ic3BsaXQgdnA4X21ic3BsaXRzIFtWUDhfTlVNTUJTUExJVFNdOworCitleHRlcm4gY29uc3QgaW50IHZwOF9tYnNwbGl0X2NvdW50IFtWUDhfTlVNTUJTUExJVFNdOyAgICAvKiAjIG9mIHN1YnNldHMgKi8KKworZXh0ZXJuIGNvbnN0IHZwOF9wcm9iIHZwOF9tYnNwbGl0X3Byb2JzIFtWUDhfTlVNTUJTUExJVFMtMV07CisKK2V4dGVybiBpbnQgdnA4X212X2NvbnQoY29uc3QgaW50X212ICpsLCBjb25zdCBpbnRfbXYgKmEpOworI2RlZmluZSBTVUJNVlJFRl9DT1VOVCA1CitleHRlcm4gY29uc3QgdnA4X3Byb2IgdnA4X3N1Yl9tdl9yZWZfcHJvYjIgW1NVQk1WUkVGX0NPVU5UXVtWUDhfU1VCTVZSRUZTLTFdOworCisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgdnA4X2tmX2RlZmF1bHRfYm1vZGVfY291bnRzIFtWUDhfQklOVFJBTU9ERVNdIFtWUDhfQklOVFJBTU9ERVNdIFtWUDhfQklOVFJBTU9ERVNdOworCisKK2V4dGVybiBjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfYm1vZGVfdHJlZVtdOworCitleHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggIHZwOF95bW9kZV90cmVlW107CitleHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggIHZwOF9rZl95bW9kZV90cmVlW107CitleHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggIHZwOF91dl9tb2RlX3RyZWVbXTsKKworZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4ICB2cDhfbWJzcGxpdF90cmVlW107CitleHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggIHZwOF9tdl9yZWZfdHJlZVtdOworZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4ICB2cDhfc3ViX212X3JlZl90cmVlW107CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfYm1vZGVfZW5jb2RpbmdzW1ZQOF9CSU5UUkFNT0RFU107CitleHRlcm4gY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X3ltb2RlX2VuY29kaW5nc1tWUDhfWU1PREVTXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfa2ZfeW1vZGVfZW5jb2RpbmdzW1ZQOF9ZTU9ERVNdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF91dl9tb2RlX2VuY29kaW5nc1tWUDhfVVZfTU9ERVNdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF9tYnNwbGl0X2VuY29kaW5nc1tWUDhfTlVNTUJTUExJVFNdOworCisvKiBJbnRlciBtb2RlIHZhbHVlcyBkbyBub3Qgc3RhcnQgYXQgemVybyAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X212X3JlZl9lbmNvZGluZ19hcnJheVtWUDhfTVZSRUZTXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfc3ViX212X3JlZl9lbmNvZGluZ19hcnJheVtWUDhfU1VCTVZSRUZTXTsKKworZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4IHZwOF9zbWFsbF9tdnRyZWVbXTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF9zbWFsbF9tdmVuY29kaW5nc1s4XTsKKworLyogS2V5IGZyYW1lIGRlZmF1bHQgbW9kZSBwcm9icyAqLworZXh0ZXJuIGNvbnN0IHZwOF9wcm9iIHZwOF9rZl9ibW9kZV9wcm9iW1ZQOF9CSU5UUkFNT0RFU11bVlA4X0JJTlRSQU1PREVTXQorW1ZQOF9CSU5UUkFNT0RFUy0xXTsKK2V4dGVybiBjb25zdCB2cDhfcHJvYiB2cDhfa2ZfdXZfbW9kZV9wcm9iW1ZQOF9VVl9NT0RFUy0xXTsKK2V4dGVybiBjb25zdCB2cDhfcHJvYiB2cDhfa2ZfeW1vZGVfcHJvYltWUDhfWU1PREVTLTFdOworCit2b2lkIHZwOF9pbml0X21ibW9kZV9wcm9icyhWUDhfQ09NTU9OICp4KTsKK3ZvaWQgdnA4X2RlZmF1bHRfYm1vZGVfcHJvYnModnA4X3Byb2IgZGVzdCBbVlA4X0JJTlRSQU1PREVTLTFdKTsKK3ZvaWQgdnA4X2tmX2RlZmF1bHRfYm1vZGVfcHJvYnModnA4X3Byb2IgZGVzdCBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTLTFdKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2VudHJvcHltdi5jIGIvbGlidnB4L3ZwOC9jb21tb24vZW50cm9weW12LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vZW50cm9weW12LmMKcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL2VudHJvcHltdi5jCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9lbnRyb3B5bXYuaCBiL2xpYnZweC92cDgvY29tbW9uL2VudHJvcHltdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjFlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9lbnRyb3B5bXYuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19FTlRST1BZTVZfSAorI2RlZmluZSBfX0lOQ19FTlRST1BZTVZfSAorCisjaW5jbHVkZSAidHJlZWNvZGVyLmgiCisKK2VudW0KK3sKKyAgICBtdl9tYXggID0gMTAyMywgICAgICAgICAgICAgIC8qIG1heCBhYnNvbHV0ZSB2YWx1ZSBvZiBhIE1WIGNvbXBvbmVudCAqLworICAgIE1WdmFscyA9ICgyICogbXZfbWF4KSArIDEsICAgLyogIyBwb3NzaWJsZSB2YWx1ZXMgIiIgKi8KKyAgICBtdmZwX21heCAgPSAyNTUsICAgICAgICAgICAgICAvKiBtYXggYWJzb2x1dGUgdmFsdWUgb2YgYSBmdWxsIHBpeGVsIE1WIGNvbXBvbmVudCAqLworICAgIE1WZnB2YWxzID0gKDIgKiBtdmZwX21heCkgKzEsIC8qICMgcG9zc2libGUgZnVsbCBwaXhlbCBNViB2YWx1ZXMgKi8KKworICAgIG12bG9uZ193aWR0aCA9IDEwLCAgICAgICAvKiBMYXJnZSBNVnMgaGF2ZSA5IGJpdCBtYWduaXR1ZGVzICovCisgICAgbXZudW1fc2hvcnQgPSA4LCAgICAgICAgIC8qIG1hZ25pdHVkZXMgMCB0aHJvdWdoIDcgKi8KKworICAgIC8qIHByb2JhYmlsaXR5IG9mZnNldHMgZm9yIGNvZGluZyBlYWNoIE1WIGNvbXBvbmVudCAqLworCisgICAgbXZwaXNfc2hvcnQgPSAwLCAgICAgICAgIC8qIHNob3J0ICg8PSA3KSB2cyBsb25nICg+PSA4KSAqLworICAgIE1WUHNpZ24sICAgICAgICAgICAgICAgIC8qIHNpZ24gZm9yIG5vbi16ZXJvICovCisgICAgTVZQc2hvcnQsICAgICAgICAgICAgICAgLyogOCBzaG9ydCB2YWx1ZXMgPSA3LXBvc2l0aW9uIHRyZWUgKi8KKworICAgIE1WUGJpdHMgPSBNVlBzaG9ydCArIG12bnVtX3Nob3J0IC0gMSwgLyogbXZsb25nX3dpZHRoIGxvbmcgdmFsdWUgYml0cyAqLworICAgIE1WUGNvdW50ID0gTVZQYml0cyArIG12bG9uZ193aWR0aCAgICAvKiAod2l0aCBpbmRlcGVuZGVudCBwcm9iYWJpbGl0aWVzKSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbXZfY29udGV4dAoreworICAgIHZwOF9wcm9iIHByb2JbTVZQY291bnRdOyAgLyogb2Z0ZW4gY29tZSBpbiByb3csIGNvbCBwYWlycyAqLworfSBNVl9DT05URVhUOworCitleHRlcm4gY29uc3QgTVZfQ09OVEVYVCB2cDhfbXZfdXBkYXRlX3Byb2JzWzJdLCB2cDhfZGVmYXVsdF9tdl9jb250ZXh0WzJdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2V4dGVuZC5jIGIvbGlidnB4L3ZwOC9jb21tb24vZXh0ZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZGQyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2V4dGVuZC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgImV4dGVuZC5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorCisKK3N0YXRpYyB2b2lkIGNvcHlfYW5kX2V4dGVuZF9wbGFuZQorKAorICAgIHVuc2lnbmVkIGNoYXIgKnMsIC8qIHNvdXJjZSAqLworICAgIGludCBzcCwgICAgICAgICAgIC8qIHNvdXJjZSBwaXRjaCAqLworICAgIHVuc2lnbmVkIGNoYXIgKmQsIC8qIGRlc3RpbmF0aW9uICovCisgICAgaW50IGRwLCAgICAgICAgICAgLyogZGVzdGluYXRpb24gcGl0Y2ggKi8KKyAgICBpbnQgaCwgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICBpbnQgdywgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgIGludCBldCwgICAgICAgICAgIC8qIGV4dGVuZCB0b3AgYm9yZGVyICovCisgICAgaW50IGVsLCAgICAgICAgICAgLyogZXh0ZW5kIGxlZnQgYm9yZGVyICovCisgICAgaW50IGViLCAgICAgICAgICAgLyogZXh0ZW5kIGJvdHRvbSBib3JkZXIgKi8KKyAgICBpbnQgZXIgICAgICAgICAgICAvKiBleHRlbmQgcmlnaHQgYm9yZGVyICovCispCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cjEsICpzcmNfcHRyMjsKKyAgICB1bnNpZ25lZCBjaGFyICpkZXN0X3B0cjEsICpkZXN0X3B0cjI7CisgICAgaW50IGxpbmVzaXplOworCisgICAgLyogY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dCAqLworICAgIHNyY19wdHIxID0gczsKKyAgICBzcmNfcHRyMiA9IHMgKyB3IC0gMTsKKyAgICBkZXN0X3B0cjEgPSBkIC0gZWw7CisgICAgZGVzdF9wdHIyID0gZCArIHc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKQorICAgIHsKKyAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjEsIHNyY19wdHIxWzBdLCBlbCk7CisgICAgICAgIHZweF9tZW1jcHkoZGVzdF9wdHIxICsgZWwsIHNyY19wdHIxLCB3KTsKKyAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBlcik7CisgICAgICAgIHNyY19wdHIxICArPSBzcDsKKyAgICAgICAgc3JjX3B0cjIgICs9IHNwOworICAgICAgICBkZXN0X3B0cjEgKz0gZHA7CisgICAgICAgIGRlc3RfcHRyMiArPSBkcDsKKyAgICB9CisKKyAgICAvKiBOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUKKyAgICAgKiBib3JkZXJzCisgICAgICovCisgICAgc3JjX3B0cjEgPSBkIC0gZWw7CisgICAgc3JjX3B0cjIgPSBkICsgZHAgKiAoaCAtIDEpIC0gZWw7CisgICAgZGVzdF9wdHIxID0gZCArIGRwICogKC1ldCkgLSBlbDsKKyAgICBkZXN0X3B0cjIgPSBkICsgZHAgKiAoaCkgLSBlbDsKKyAgICBsaW5lc2l6ZSA9IGVsICsgZXIgKyB3OworCisgICAgZm9yIChpID0gMDsgaSA8IGV0OyBpKyspCisgICAgeworICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIGxpbmVzaXplKTsKKyAgICAgICAgZGVzdF9wdHIxICs9IGRwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBlYjsgaSsrKQorICAgIHsKKyAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBsaW5lc2l6ZSk7CisgICAgICAgIGRlc3RfcHRyMiArPSBkcDsKKyAgICB9Cit9CisKKwordm9pZCB2cDhfY29weV9hbmRfZXh0ZW5kX2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0KQoreworICAgIGludCBldCA9IGRzdC0+Ym9yZGVyOworICAgIGludCBlbCA9IGRzdC0+Ym9yZGVyOworICAgIGludCBlYiA9IGRzdC0+Ym9yZGVyICsgZHN0LT55X2hlaWdodCAtIHNyYy0+eV9oZWlnaHQ7CisgICAgaW50IGVyID0gZHN0LT5ib3JkZXIgKyBkc3QtPnlfd2lkdGggLSBzcmMtPnlfd2lkdGg7CisKKyAgICBjb3B5X2FuZF9leHRlbmRfcGxhbmUoc3JjLT55X2J1ZmZlciwgc3JjLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT55X2J1ZmZlciwgZHN0LT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT55X2hlaWdodCwgc3JjLT55X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBldCwgZWwsIGViLCBlcik7CisKKyAgICBldCA9IGRzdC0+Ym9yZGVyID4+IDE7CisgICAgZWwgPSBkc3QtPmJvcmRlciA+PiAxOworICAgIGViID0gKGRzdC0+Ym9yZGVyID4+IDEpICsgZHN0LT51dl9oZWlnaHQgLSBzcmMtPnV2X2hlaWdodDsKKyAgICBlciA9IChkc3QtPmJvcmRlciA+PiAxKSArIGRzdC0+dXZfd2lkdGggLSBzcmMtPnV2X3dpZHRoOworCisgICAgY29weV9hbmRfZXh0ZW5kX3BsYW5lKHNyYy0+dV9idWZmZXIsIHNyYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnVfYnVmZmVyLCBkc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT51dl9oZWlnaHQsIHNyYy0+dXZfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0LCBlbCwgZWIsIGVyKTsKKworICAgIGNvcHlfYW5kX2V4dGVuZF9wbGFuZShzcmMtPnZfYnVmZmVyLCBzcmMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT52X2J1ZmZlciwgZHN0LT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+dXZfaGVpZ2h0LCBzcmMtPnV2X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBldCwgZWwsIGViLCBlcik7Cit9CisKKwordm9pZCB2cDhfY29weV9hbmRfZXh0ZW5kX2ZyYW1lX3dpdGhfcmVjdChZVjEyX0JVRkZFUl9DT05GSUcgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN5LCBpbnQgc3JjeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY2gsIGludCBzcmN3KQoreworICAgIGludCBldCA9IGRzdC0+Ym9yZGVyOworICAgIGludCBlbCA9IGRzdC0+Ym9yZGVyOworICAgIGludCBlYiA9IGRzdC0+Ym9yZGVyICsgZHN0LT55X2hlaWdodCAtIHNyYy0+eV9oZWlnaHQ7CisgICAgaW50IGVyID0gZHN0LT5ib3JkZXIgKyBkc3QtPnlfd2lkdGggLSBzcmMtPnlfd2lkdGg7CisgICAgaW50IHNyY195X29mZnNldCA9IHNyY3kgKiBzcmMtPnlfc3RyaWRlICsgc3JjeDsKKyAgICBpbnQgZHN0X3lfb2Zmc2V0ID0gc3JjeSAqIGRzdC0+eV9zdHJpZGUgKyBzcmN4OworICAgIGludCBzcmNfdXZfb2Zmc2V0ID0gKChzcmN5ICogc3JjLT51dl9zdHJpZGUpID4+IDEpICsgKHNyY3ggPj4gMSk7CisgICAgaW50IGRzdF91dl9vZmZzZXQgPSAoKHNyY3kgKiBkc3QtPnV2X3N0cmlkZSkgPj4gMSkgKyAoc3JjeCA+PiAxKTsKKworICAgIC8qIElmIHRoZSBzaWRlIGlzIG5vdCB0b3VjaGluZyB0aGUgYm91bmRlciB0aGVuIGRvbid0IGV4dGVuZC4gKi8KKyAgICBpZiAoc3JjeSkKKyAgICAgIGV0ID0gMDsKKyAgICBpZiAoc3JjeCkKKyAgICAgIGVsID0gMDsKKyAgICBpZiAoc3JjeSArIHNyY2ggIT0gc3JjLT55X2hlaWdodCkKKyAgICAgIGViID0gMDsKKyAgICBpZiAoc3JjeCArIHNyY3cgIT0gc3JjLT55X3dpZHRoKQorICAgICAgZXIgPSAwOworCisgICAgY29weV9hbmRfZXh0ZW5kX3BsYW5lKHNyYy0+eV9idWZmZXIgKyBzcmNfeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+eV9idWZmZXIgKyBkc3RfeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2gsIHNyY3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0LCBlbCwgZWIsIGVyKTsKKworICAgIGV0ID0gKGV0ICsgMSkgPj4gMTsKKyAgICBlbCA9IChlbCArIDEpID4+IDE7CisgICAgZWIgPSAoZWIgKyAxKSA+PiAxOworICAgIGVyID0gKGVyICsgMSkgPj4gMTsKKyAgICBzcmNoID0gKHNyY2ggKyAxKSA+PiAxOworICAgIHNyY3cgPSAoc3JjdyArIDEpID4+IDE7CisKKyAgICBjb3B5X2FuZF9leHRlbmRfcGxhbmUoc3JjLT51X2J1ZmZlciArIHNyY191dl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnVfYnVmZmVyICsgZHN0X3V2X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2gsIHNyY3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0LCBlbCwgZWIsIGVyKTsKKworICAgIGNvcHlfYW5kX2V4dGVuZF9wbGFuZShzcmMtPnZfYnVmZmVyICsgc3JjX3V2X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+dl9idWZmZXIgKyBkc3RfdXZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjaCwgc3JjdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXQsIGVsLCBlYiwgZXIpOworfQorCisKKy8qIG5vdGUgdGhlIGV4dGVuc2lvbiBpcyBvbmx5IGZvciB0aGUgbGFzdCByb3csIGZvciBpbnRyYSBwcmVkaWN0aW9uIHB1cnBvc2UgKi8KK3ZvaWQgdnA4X2V4dGVuZF9tYl9yb3coWVYxMl9CVUZGRVJfQ09ORklHICp5YmYsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKllQdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKlVQdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKlZQdHIpCit7CisgICAgaW50IGk7CisKKyAgICBZUHRyICs9IHliZi0+eV9zdHJpZGUgKiAxNDsKKyAgICBVUHRyICs9IHliZi0+dXZfc3RyaWRlICogNjsKKyAgICBWUHRyICs9IHliZi0+dXZfc3RyaWRlICogNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBZUHRyW2ldID0gWVB0clstMV07CisgICAgICAgIFVQdHJbaV0gPSBVUHRyWy0xXTsKKyAgICAgICAgVlB0cltpXSA9IFZQdHJbLTFdOworICAgIH0KKworICAgIFlQdHIgKz0geWJmLT55X3N0cmlkZTsKKyAgICBVUHRyICs9IHliZi0+dXZfc3RyaWRlOworICAgIFZQdHIgKz0geWJmLT51dl9zdHJpZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgWVB0cltpXSA9IFlQdHJbLTFdOworICAgICAgICBVUHRyW2ldID0gVVB0clstMV07CisgICAgICAgIFZQdHJbaV0gPSBWUHRyWy0xXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9leHRlbmQuaCBiL2xpYnZweC92cDgvY29tbW9uL2V4dGVuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTBiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9leHRlbmQuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19FWFRFTkRfSAorI2RlZmluZSBfX0lOQ19FWFRFTkRfSAorCisjaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKKwordm9pZCB2cDhfZXh0ZW5kX21iX3JvdyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZiwgdW5zaWduZWQgY2hhciAqWVB0ciwgdW5zaWduZWQgY2hhciAqVVB0ciwgdW5zaWduZWQgY2hhciAqVlB0cik7Cit2b2lkIHZwOF9jb3B5X2FuZF9leHRlbmRfZnJhbWUoWVYxMl9CVUZGRVJfQ09ORklHICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3QpOwordm9pZCB2cDhfY29weV9hbmRfZXh0ZW5kX2ZyYW1lX3dpdGhfcmVjdChZVjEyX0JVRkZFUl9DT05GSUcgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN5LCBpbnQgc3JjeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY2gsIGludCBzcmN3KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9maWx0ZXIuYyBiL2xpYnZweC92cDgvY29tbW9uL2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDFlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9maWx0ZXIuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmaWx0ZXIuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3Qgc2hvcnQsIHZwOF9iaWxpbmVhcl9maWx0ZXJzWzhdWzJdKSA9Cit7CisgICAgeyAxMjgsICAgMCB9LAorICAgIHsgMTEyLCAgMTYgfSwKKyAgICB7ICA5NiwgIDMyIH0sCisgICAgeyAgODAsICA0OCB9LAorICAgIHsgIDY0LCAgNjQgfSwKKyAgICB7ICA0OCwgIDgwIH0sCisgICAgeyAgMzIsICA5NiB9LAorICAgIHsgIDE2LCAxMTIgfQorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X3N1Yl9wZWxfZmlsdGVyc1s4XVs2XSkgPQoreworCisgICAgeyAwLCAgMCwgIDEyOCwgICAgMCwgICAwLCAgMCB9LCAgICAgICAgIC8qIG5vdGUgdGhhdCAxLzggcGVsIHBvc2l0aW9ucyBhcmUganVzdCBhcyBwZXIgYWxwaGEgLTAuNSBiaWN1YmljICovCisgICAgeyAwLCAtNiwgIDEyMywgICAxMiwgIC0xLCAgMCB9LAorICAgIHsgMiwgLTExLCAxMDgsICAgMzYsICAtOCwgIDEgfSwgICAgICAgICAvKiBOZXcgMS80IHBlbCA2IHRhcCBmaWx0ZXIgKi8KKyAgICB7IDAsIC05LCAgIDkzLCAgIDUwLCAgLTYsICAwIH0sCisgICAgeyAzLCAtMTYsICA3NywgICA3NywgLTE2LCAgMyB9LCAgICAgICAgIC8qIE5ldyAxLzIgcGVsIDYgdGFwIGZpbHRlciAqLworICAgIHsgMCwgLTYsICAgNTAsICAgOTMsICAtOSwgIDAgfSwKKyAgICB7IDEsIC04LCAgIDM2LCAgMTA4LCAtMTEsICAyIH0sICAgICAgICAgLyogTmV3IDEvNCBwZWwgNiB0YXAgZmlsdGVyICovCisgICAgeyAwLCAtMSwgICAxMiwgIDEyMywgIC02LCAgMCB9LAorfTsKKworc3RhdGljIHZvaWQgZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcworKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfd2lkdGgsCisgICAgY29uc3Qgc2hvcnQgKnZwOF9maWx0ZXIKKykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICBpbnQgIFRlbXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0X2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dF93aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wID0gKChpbnQpc3JjX3B0clstMiAqIChpbnQpcGl4ZWxfc3RlcF0gKiB2cDhfZmlsdGVyWzBdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clstMSAqIChpbnQpcGl4ZWxfc3RlcF0gKiB2cDhfZmlsdGVyWzFdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clswXSAgICAgICAgICAgICAgICAgKiB2cDhfZmlsdGVyWzJdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0cltwaXhlbF9zdGVwXSAgICAgICAgICogdnA4X2ZpbHRlclszXSkgKworICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbMipwaXhlbF9zdGVwXSAgICAgICAqIHZwOF9maWx0ZXJbNF0pICsKKyAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyWzMqcGl4ZWxfc3RlcF0gICAgICAgKiB2cDhfZmlsdGVyWzVdKSArCisgICAgICAgICAgICAgICAgICAgKFZQOF9GSUxURVJfV0VJR0hUID4+IDEpOyAgICAgIC8qIFJvdW5kaW5nICovCisKKyAgICAgICAgICAgIC8qIE5vcm1hbGl6ZSBiYWNrIHRvIDAtMjU1ICovCisgICAgICAgICAgICBUZW1wID0gVGVtcCA+PiBWUDhfRklMVEVSX1NISUZUOworCisgICAgICAgICAgICBpZiAoVGVtcCA8IDApCisgICAgICAgICAgICAgICAgVGVtcCA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wID4gMjU1KQorICAgICAgICAgICAgICAgIFRlbXAgPSAyNTU7CisKKyAgICAgICAgICAgIG91dHB1dF9wdHJbal0gPSBUZW1wOworICAgICAgICAgICAgc3JjX3B0cisrOworICAgICAgICB9CisKKyAgICAgICAgLyogTmV4dCByb3cuLi4gKi8KKyAgICAgICAgc3JjX3B0ciAgICArPSBzcmNfcGl4ZWxzX3Blcl9saW5lIC0gb3V0cHV0X3dpZHRoOworICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF93aWR0aDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzCisoCisgICAgaW50ICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCisgICAgaW50IG91dHB1dF9waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCispCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgaW50ICBUZW1wOworCisgICAgZm9yIChpID0gMDsgaSA8IG91dHB1dF9oZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRfd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQXBwbHkgZmlsdGVyICovCisgICAgICAgICAgICBUZW1wID0gKChpbnQpc3JjX3B0clstMiAqIChpbnQpcGl4ZWxfc3RlcF0gKiB2cDhfZmlsdGVyWzBdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clstMSAqIChpbnQpcGl4ZWxfc3RlcF0gKiB2cDhfZmlsdGVyWzFdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clswXSAgICAgICAgICAgICAgICAgKiB2cDhfZmlsdGVyWzJdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0cltwaXhlbF9zdGVwXSAgICAgICAgICogdnA4X2ZpbHRlclszXSkgKworICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbMipwaXhlbF9zdGVwXSAgICAgICAqIHZwOF9maWx0ZXJbNF0pICsKKyAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyWzMqcGl4ZWxfc3RlcF0gICAgICAgKiB2cDhfZmlsdGVyWzVdKSArCisgICAgICAgICAgICAgICAgICAgKFZQOF9GSUxURVJfV0VJR0hUID4+IDEpOyAgIC8qIFJvdW5kaW5nICovCisKKyAgICAgICAgICAgIC8qIE5vcm1hbGl6ZSBiYWNrIHRvIDAtMjU1ICovCisgICAgICAgICAgICBUZW1wID0gVGVtcCA+PiBWUDhfRklMVEVSX1NISUZUOworCisgICAgICAgICAgICBpZiAoVGVtcCA8IDApCisgICAgICAgICAgICAgICAgVGVtcCA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wID4gMjU1KQorICAgICAgICAgICAgICAgIFRlbXAgPSAyNTU7CisKKyAgICAgICAgICAgIG91dHB1dF9wdHJbal0gPSAodW5zaWduZWQgY2hhcilUZW1wOworICAgICAgICAgICAgc3JjX3B0cisrOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RhcnQgbmV4dCByb3cgKi8KKyAgICAgICAgc3JjX3B0ciAgICArPSBzcmNfcGl4ZWxzX3Blcl9saW5lIC0gb3V0cHV0X3dpZHRoOworICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF9waXRjaDsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZmlsdGVyX2Jsb2NrMmQKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgb3V0cHV0X3BpdGNoLAorICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlciwKKyAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXIKKykKK3sKKyAgICBpbnQgRkRhdGFbOSo0XTsgLyogVGVtcCBkYXRhIGJ1ZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLworCisgICAgLyogRmlyc3QgZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KKyAgICBmaWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgNCwgSEZpbHRlcik7CisKKyAgICAvKiB0aGVuIGZpbHRlciB2ZXJ0aWNhbHkuLi4gKi8KKyAgICBmaWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzcyhGRGF0YSArIDgsIG91dHB1dF9wdHIsIG91dHB1dF9waXRjaCwgNCwgNCwgNCwgNCwgVkZpbHRlcik7Cit9CisKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYworKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7CisgICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeG9mZnNldF07ICAgLyogNiB0YXAgKi8KKyAgICBWRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t5b2Zmc2V0XTsgICAvKiA2IHRhcCAqLworCisgICAgZmlsdGVyX2Jsb2NrMmQoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyKTsKK30KK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCAgZHN0X3BpdGNoCispCit7CisgICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOworICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKKyAgICBpbnQgRkRhdGFbMTMqMTZdOyAgIC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKworICAgIEhGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3hvZmZzZXRdOyAgIC8qIDYgdGFwICovCisgICAgVkZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeW9mZnNldF07ICAgLyogNiB0YXAgKi8KKworICAgIC8qIEZpcnN0IGZpbHRlciAxLUQgaG9yaXpvbnRhbGx5Li4uICovCisgICAgZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDEzLCA4LCBIRmlsdGVyKTsKKworCisgICAgLyogdGhlbiBmaWx0ZXIgdmVydGljYWx5Li4uICovCisgICAgZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3MoRkRhdGEgKyAxNiwgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCA4LCA4LCA4LCBWRmlsdGVyKTsKKworfQorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9jCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgIGRzdF9waXRjaAorKQoreworICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlcjsKKyAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXI7CisgICAgaW50IEZEYXRhWzEzKjE2XTsgICAvKiBUZW1wIGRhdGEgYnVmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisKKyAgICBIRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t4b2Zmc2V0XTsgICAvKiA2IHRhcCAqLworICAgIFZGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3lvZmZzZXRdOyAgIC8qIDYgdGFwICovCisKKyAgICAvKiBGaXJzdCBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLworICAgIGZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Moc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA5LCA4LCBIRmlsdGVyKTsKKworCisgICAgLyogdGhlbiBmaWx0ZXIgdmVydGljYWx5Li4uICovCisgICAgZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3MoRkRhdGEgKyAxNiwgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCA4LCA0LCA4LCBWRmlsdGVyKTsKKworfQorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCAgZHN0X3BpdGNoCispCit7CisgICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOworICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKKyAgICBpbnQgRkRhdGFbMjEqMjRdOyAgIC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKworCisgICAgSEZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeG9mZnNldF07ICAgLyogNiB0YXAgKi8KKyAgICBWRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t5b2Zmc2V0XTsgICAvKiA2IHRhcCAqLworCisgICAgLyogRmlyc3QgZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KKyAgICBmaWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMjEsIDE2LCBIRmlsdGVyKTsKKworICAgIC8qIHRoZW4gZmlsdGVyIHZlcnRpY2FseS4uLiAqLworICAgIGZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzKEZEYXRhICsgMzIsIGRzdF9wdHIsIGRzdF9waXRjaCwgMTYsIDE2LCAxNiwgMTYsIFZGaWx0ZXIpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IGZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzCisgKgorICogIElOUFVUUyAgICAgICAgOiBVSU5UOCAgKnNyY19wdHIgICAgOiBQb2ludGVyIHRvIHNvdXJjZSBibG9jay4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyICBzcmNfc3RyaWRlIDogU3RyaWRlIG9mIHNvdXJjZSBibG9jay4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyICBoZWlnaHQgICAgIDogQmxvY2sgaGVpZ2h0LgorICogICAgICAgICAgICAgICAgICBVSU5UMzIgIHdpZHRoICAgICAgOiBCbG9jayB3aWR0aC4KKyAqICAgICAgICAgICAgICAgICAgSU5UMzIgICp2cDhfZmlsdGVyIDogQXJyYXkgb2YgMiBiaS1saW5lYXIgZmlsdGVyIHRhcHMuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBJTlQzMiAgKmRzdF9wdHIgICAgOiBQb2ludGVyIHRvIGZpbHRlcmVkIGJsb2NrLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogQXBwbGllcyBhIDEtRCAyLXRhcCBiaS1saW5lYXIgZmlsdGVyIHRvIHRoZSBzb3VyY2UgYmxvY2sKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uIHRvIHByb2R1Y2UgdGhlIGZpbHRlcmVkIG91dHB1dAorICogICAgICAgICAgICAgICAgICBibG9jay4gVXNlZCB0byBpbXBsZW1lbnQgZmlyc3QtcGFzcyBvZiAyLUQgc2VwYXJhYmxlIGZpbHRlci4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFByb2R1Y2VzIElOVDMyIG91dHB1dCB0byByZXRhaW4gcHJlY2lzaW9uIGZvciBuZXh0IHBhc3MuCisgKiAgICAgICAgICAgICAgICAgIFR3byBmaWx0ZXIgdGFwcyBzaG91bGQgc3VtIHRvIFZQOF9GSUxURVJfV0VJR0hULgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3MKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBzaG9ydCAqZHN0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgICAgaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICB3aWR0aCwKKyAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgorKQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFwcGx5IGJpbGluZWFyIGZpbHRlciAqLworICAgICAgICAgICAgZHN0X3B0cltqXSA9ICgoKGludClzcmNfcHRyWzBdICogdnA4X2ZpbHRlclswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyWzFdICogdnA4X2ZpbHRlclsxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoVlA4X0ZJTFRFUl9XRUlHSFQgLyAyKSkgPj4gVlA4X0ZJTFRFUl9TSElGVDsKKyAgICAgICAgICAgIHNyY19wdHIrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5leHQgcm93Li4uICovCisgICAgICAgIHNyY19wdHIgKz0gc3JjX3N0cmlkZSAtIHdpZHRoOworICAgICAgICBkc3RfcHRyICs9IHdpZHRoOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IGZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcworICoKKyAqICBJTlBVVFMgICAgICAgIDogSU5UMzIgICpzcmNfcHRyICAgIDogUG9pbnRlciB0byBzb3VyY2UgYmxvY2suCisgKiAgICAgICAgICAgICAgICAgIFVJTlQzMiAgZHN0X3BpdGNoICA6IERlc3RpbmF0aW9uIGJsb2NrIHBpdGNoLgorICogICAgICAgICAgICAgICAgICBVSU5UMzIgIGhlaWdodCAgICAgOiBCbG9jayBoZWlnaHQuCisgKiAgICAgICAgICAgICAgICAgIFVJTlQzMiAgd2lkdGggICAgICA6IEJsb2NrIHdpZHRoLgorICogICAgICAgICAgICAgICAgICBJTlQzMiAgKnZwOF9maWx0ZXIgOiBBcnJheSBvZiAyIGJpLWxpbmVhciBmaWx0ZXIgdGFwcy4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IFVJTlQxNiAqZHN0X3B0ciAgICA6IFBvaW50ZXIgdG8gZmlsdGVyZWQgYmxvY2suCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBBcHBsaWVzIGEgMS1EIDItdGFwIGJpLWxpbmVhciBmaWx0ZXIgdG8gdGhlIHNvdXJjZSBibG9jaworICogICAgICAgICAgICAgICAgICBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uIHRvIHByb2R1Y2UgdGhlIGZpbHRlcmVkIG91dHB1dAorICogICAgICAgICAgICAgICAgICBibG9jay4gVXNlZCB0byBpbXBsZW1lbnQgc2Vjb25kLXBhc3Mgb2YgMi1EIHNlcGFyYWJsZSBmaWx0ZXIuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBSZXF1aXJlcyAzMi1iaXQgaW5wdXQgYXMgcHJvZHVjZWQgYnkgZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3MuCisgKiAgICAgICAgICAgICAgICAgIFR3byBmaWx0ZXIgdGFwcyBzaG91bGQgc3VtIHRvIFZQOF9GSUxURVJfV0VJR0hULgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzCisoCisgICAgdW5zaWduZWQgc2hvcnQgKnNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAgKmRzdF9wdHIsCisgICAgaW50ICAgICAgICAgICAgIGRzdF9waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgICAgaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICB3aWR0aCwKKyAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgorKQoreworICAgIHVuc2lnbmVkIGludCAgaSwgajsKKyAgICBpbnQgIFRlbXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQXBwbHkgZmlsdGVyICovCisgICAgICAgICAgICBUZW1wID0gKChpbnQpc3JjX3B0clswXSAgICAgKiB2cDhfZmlsdGVyWzBdKSArCisgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clt3aWR0aF0gKiB2cDhfZmlsdGVyWzFdKSArCisgICAgICAgICAgICAgICAgICAgKFZQOF9GSUxURVJfV0VJR0hUIC8gMik7CisgICAgICAgICAgICBkc3RfcHRyW2pdID0gKHVuc2lnbmVkIGludCkoVGVtcCA+PiBWUDhfRklMVEVSX1NISUZUKTsKKyAgICAgICAgICAgIHNyY19wdHIrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5leHQgcm93Li4uICovCisgICAgICAgIGRzdF9wdHIgKz0gZHN0X3BpdGNoOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogZmlsdGVyX2Jsb2NrMmRfYmlsCisgKgorICogIElOUFVUUyAgICAgICAgOiBVSU5UOCAgKnNyY19wdHIgICAgICAgICAgOiBQb2ludGVyIHRvIHNvdXJjZSBibG9jay4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyICBzcmNfcGl0Y2ggICAgICAgIDogU3RyaWRlIG9mIHNvdXJjZSBibG9jay4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyICBkc3RfcGl0Y2ggICAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGJsb2NrLgorICogICAgICAgICAgICAgICAgICBJTlQzMiAgKkhGaWx0ZXIgICAgICAgICAgOiBBcnJheSBvZiAyIGhvcml6b250YWwgZmlsdGVyIHRhcHMuCisgKiAgICAgICAgICAgICAgICAgIElOVDMyICAqVkZpbHRlciAgICAgICAgICA6IEFycmF5IG9mIDIgdmVydGljYWwgZmlsdGVyIHRhcHMuCisgKiAgICAgICAgICAgICAgICAgIElOVDMyICBXaWR0aCAgICAgICAgICAgICA6IEJsb2NrIHdpZHRoCisgKiAgICAgICAgICAgICAgICAgIElOVDMyICBIZWlnaHQgICAgICAgICAgICA6IEJsb2NrIGhlaWdodAorICoKKyAqICBPVVRQVVRTICAgICAgIDogVUlOVDE2ICpkc3RfcHRyICAgICAgIDogUG9pbnRlciB0byBmaWx0ZXJlZCBibG9jay4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IDItRCBmaWx0ZXJzIGFuIGlucHV0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgMi10YXAKKyAqICAgICAgICAgICAgICAgICAgYmktbGluZWFyIGZpbHRlciBob3Jpem9udGFsbHkgZm9sbG93ZWQgYnkgYSAyLXRhcAorICogICAgICAgICAgICAgICAgICBiaS1saW5lYXIgZmlsdGVyIHZlcnRpY2FsbHkgb24gdGhlIHJlc3VsdC4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSBsYXJnZXN0IGJsb2NrIHNpemUgY2FuIGJlIGhhbmRsZWQgaGVyZSBpcyAxNngxNgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZmlsdGVyX2Jsb2NrMmRfYmlsCisoCisgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgICBkc3RfcGl0Y2gsCisgICAgY29uc3Qgc2hvcnQgICAqSEZpbHRlciwKKyAgICBjb25zdCBzaG9ydCAgICpWRmlsdGVyLAorICAgIGludCAgICAgICAgICAgIFdpZHRoLAorICAgIGludCAgICAgICAgICAgIEhlaWdodAorKQoreworCisgICAgdW5zaWduZWQgc2hvcnQgRkRhdGFbMTcqMTZdOyAgICAvKiBUZW1wIGRhdGEgYnVmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisKKyAgICAvKiBGaXJzdCBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLworICAgIGZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzKHNyY19wdHIsIEZEYXRhLCBzcmNfcGl0Y2gsIEhlaWdodCArIDEsIFdpZHRoLCBIRmlsdGVyKTsKKworICAgIC8qIHRoZW4gMS1EIHZlcnRpY2FsbHkuLi4gKi8KKyAgICBmaWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3MoRkRhdGEsIGRzdF9wdHIsIGRzdF9waXRjaCwgSGVpZ2h0LCBXaWR0aCwgVkZpbHRlcik7Cit9CisKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9jCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXRjaAorKQoreworICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyOworICAgIGNvbnN0IHNob3J0ICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOworICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKyNpZiAwCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wMVsxNl07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcDJbMTZdOworCisgICAgICAgIGJpbGluZWFyX3ByZWRpY3Q0eDRfbW14KHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIHRlbXAxLCA0KTsKKyAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsKHNyY19wdHIsIHRlbXAyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCBIRmlsdGVyLCBWRmlsdGVyLCA0LCA0KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRlbXAxW2ldICE9IHRlbXAyW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpbGluZWFyX3ByZWRpY3Q0eDRfbW14KHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIHRlbXAxLCA0KTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWwoc3JjX3B0ciwgdGVtcDIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDQsIEhGaWx0ZXIsIFZGaWx0ZXIsIDQsIDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgZmlsdGVyX2Jsb2NrMmRfYmlsKHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlciwgNCwgNCk7CisKK30KKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9jCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgIGRzdF9waXRjaAorKQoreworICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyOworICAgIGNvbnN0IHNob3J0ICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOworICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKworICAgIGZpbHRlcl9ibG9jazJkX2JpbChzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcGl0Y2gsIEhGaWx0ZXIsIFZGaWx0ZXIsIDgsIDgpOworCit9CisKK3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfYworKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50ICBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlcjsKKyAgICBjb25zdCBzaG9ydCAqVkZpbHRlcjsKKworICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKKyAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07CisKKyAgICBmaWx0ZXJfYmxvY2syZF9iaWwoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCA4LCA0KTsKKworfQorCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYworKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50ICBkc3RfcGl0Y2gKKykKK3sKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlcjsKKyAgICBjb25zdCBzaG9ydCAqVkZpbHRlcjsKKworICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKKyAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07CisKKyAgICBmaWx0ZXJfYmxvY2syZF9iaWwoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCAxNiwgMTYpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vZmlsdGVyLmggYi9saWJ2cHgvdnA4L2NvbW1vbi9maWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU5MWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vZmlsdGVyLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgRklMVEVSX0gKKyNkZWZpbmUgRklMVEVSX0gKKworI2RlZmluZSBCTE9DS19IRUlHSFRfV0lEVEggNAorI2RlZmluZSBWUDhfRklMVEVSX1dFSUdIVCAxMjgKKyNkZWZpbmUgVlA4X0ZJTFRFUl9TSElGVCAgNworCitleHRlcm4gY29uc3Qgc2hvcnQgdnA4X2JpbGluZWFyX2ZpbHRlcnNbOF1bMl07CitleHRlcm4gY29uc3Qgc2hvcnQgdnA4X3N1Yl9wZWxfZmlsdGVyc1s4XVs2XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9maW5kbmVhcm12LmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9maW5kbmVhcm12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlZTQwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2ZpbmRuZWFybXYuYwpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJmaW5kbmVhcm12LmgiCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X21ic3BsaXRfb2Zmc2V0WzRdWzE2XSA9IHsKKyAgICB7IDAsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSwKKyAgICB7IDAsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSwKKyAgICB7IDAsICAyLCAgOCwgMTAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSwKKyAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1fQorfTsKKworLyogUHJlZGljdCBtb3Rpb24gdmVjdG9ycyB1c2luZyB0aG9zZSBmcm9tIGFscmVhZHktZGVjb2RlZCBuZWFyYnkgYmxvY2tzLgorICAgTm90ZSB0aGF0IHdlIG9ubHkgY29uc2lkZXIgb25lIDR4NCBzdWJibG9jayBmcm9tIGVhY2ggY2FuZGlkYXRlIDE2eDE2CisgICBtYWNyb2Jsb2NrLiAgICovCit2b2lkIHZwOF9maW5kX25lYXJfbXZzCisoCisgICAgTUFDUk9CTE9DS0QgKnhkLAorICAgIGNvbnN0IE1PREVfSU5GTyAqaGVyZSwKKyAgICBpbnRfbXYgKm5lYXJlc3QsCisgICAgaW50X212ICpuZWFyYnksCisgICAgaW50X212ICpiZXN0X212LAorICAgIGludCBjbnRbNF0sCisgICAgaW50IHJlZmZyYW1lLAorICAgIGludCAqcmVmX2ZyYW1lX3NpZ25fYmlhcworKQoreworICAgIGNvbnN0IE1PREVfSU5GTyAqYWJvdmUgPSBoZXJlIC0geGQtPm1vZGVfaW5mb19zdHJpZGU7CisgICAgY29uc3QgTU9ERV9JTkZPICpsZWZ0ID0gaGVyZSAtIDE7CisgICAgY29uc3QgTU9ERV9JTkZPICphYm92ZWxlZnQgPSBhYm92ZSAtIDE7CisgICAgaW50X212ICAgICAgICAgICAgbmVhcl9tdnNbNF07CisgICAgaW50X212ICAgICAgICAgICAqbXYgPSBuZWFyX212czsKKyAgICBpbnQgICAgICAgICAgICAgKmNudHggPSBjbnQ7CisgICAgZW51bSB7Q05UX0lOVFJBLCBDTlRfTkVBUkVTVCwgQ05UX05FQVIsIENOVF9TUExJVE1WfTsKKworICAgIC8qIFplcm8gYWNjdW11bGF0b3JzICovCisgICAgbXZbMF0uYXNfaW50ID0gbXZbMV0uYXNfaW50ID0gbXZbMl0uYXNfaW50ID0gMDsKKyAgICBjbnRbMF0gPSBjbnRbMV0gPSBjbnRbMl0gPSBjbnRbM10gPSAwOworCisgICAgLyogUHJvY2VzcyBhYm92ZSAqLworICAgIGlmIChhYm92ZS0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgeworICAgICAgICBpZiAoYWJvdmUtPm1ibWkubXYuYXNfaW50KQorICAgICAgICB7CisgICAgICAgICAgICAoKyttdiktPmFzX2ludCA9IGFib3ZlLT5tYm1pLm12LmFzX2ludDsKKyAgICAgICAgICAgIG12X2JpYXMocmVmX2ZyYW1lX3NpZ25fYmlhc1thYm92ZS0+bWJtaS5yZWZfZnJhbWVdLCByZWZmcmFtZSwgbXYsIHJlZl9mcmFtZV9zaWduX2JpYXMpOworICAgICAgICAgICAgKytjbnR4OworICAgICAgICB9CisKKyAgICAgICAgKmNudHggKz0gMjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGxlZnQgKi8KKyAgICBpZiAobGVmdC0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgeworICAgICAgICBpZiAobGVmdC0+bWJtaS5tdi5hc19pbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludF9tdiB0aGlzX212OworCisgICAgICAgICAgICB0aGlzX212LmFzX2ludCA9IGxlZnQtPm1ibWkubXYuYXNfaW50OworICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2xlZnQtPm1ibWkucmVmX2ZyYW1lXSwgcmVmZnJhbWUsICZ0aGlzX212LCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKKworICAgICAgICAgICAgaWYgKHRoaXNfbXYuYXNfaW50ICE9IG12LT5hc19pbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCsrbXYpLT5hc19pbnQgPSB0aGlzX212LmFzX2ludDsKKyAgICAgICAgICAgICAgICArK2NudHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpjbnR4ICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY250W0NOVF9JTlRSQV0gKz0gMjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGFib3ZlIGxlZnQgKi8KKyAgICBpZiAoYWJvdmVsZWZ0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICB7CisgICAgICAgIGlmIChhYm92ZWxlZnQtPm1ibWkubXYuYXNfaW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnRfbXYgdGhpc19tdjsKKworICAgICAgICAgICAgdGhpc19tdi5hc19pbnQgPSBhYm92ZWxlZnQtPm1ibWkubXYuYXNfaW50OworICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2Fib3ZlbGVmdC0+bWJtaS5yZWZfZnJhbWVdLCByZWZmcmFtZSwgJnRoaXNfbXYsIHJlZl9mcmFtZV9zaWduX2JpYXMpOworCisgICAgICAgICAgICBpZiAodGhpc19tdi5hc19pbnQgIT0gbXYtPmFzX2ludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKyttdiktPmFzX2ludCA9IHRoaXNfbXYuYXNfaW50OworICAgICAgICAgICAgICAgICsrY250eDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmNudHggKz0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjbnRbQ05UX0lOVFJBXSArPSAxOworICAgIH0KKworICAgIC8qIElmIHdlIGhhdmUgdGhyZWUgZGlzdGluY3QgTVYncyAuLi4gKi8KKyAgICBpZiAoY250W0NOVF9TUExJVE1WXSkKKyAgICB7CisgICAgICAgIC8qIFNlZSBpZiBhYm92ZS1sZWZ0IE1WIGNhbiBiZSBtZXJnZWQgd2l0aCBORUFSRVNUICovCisgICAgICAgIGlmIChtdi0+YXNfaW50ID09IG5lYXJfbXZzW0NOVF9ORUFSRVNUXS5hc19pbnQpCisgICAgICAgICAgICBjbnRbQ05UX05FQVJFU1RdICs9IDE7CisgICAgfQorCisgICAgY250W0NOVF9TUExJVE1WXSA9ICgoYWJvdmUtPm1ibWkubW9kZSA9PSBTUExJVE1WKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAobGVmdC0+bWJtaS5tb2RlID09IFNQTElUTVYpKSAqIDIKKyAgICAgICAgICAgICAgICAgICAgICAgKyAoYWJvdmVsZWZ0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVik7CisKKyAgICAvKiBTd2FwIG5lYXIgYW5kIG5lYXJlc3QgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKGNudFtDTlRfTkVBUl0gPiBjbnRbQ05UX05FQVJFU1RdKQorICAgIHsKKyAgICAgICAgaW50IHRtcDsKKyAgICAgICAgdG1wID0gY250W0NOVF9ORUFSRVNUXTsKKyAgICAgICAgY250W0NOVF9ORUFSRVNUXSA9IGNudFtDTlRfTkVBUl07CisgICAgICAgIGNudFtDTlRfTkVBUl0gPSB0bXA7CisgICAgICAgIHRtcCA9IG5lYXJfbXZzW0NOVF9ORUFSRVNUXS5hc19pbnQ7CisgICAgICAgIG5lYXJfbXZzW0NOVF9ORUFSRVNUXS5hc19pbnQgPSBuZWFyX212c1tDTlRfTkVBUl0uYXNfaW50OworICAgICAgICBuZWFyX212c1tDTlRfTkVBUl0uYXNfaW50ID0gdG1wOworICAgIH0KKworICAgIC8qIFVzZSBuZWFyX212c1swXSB0byBzdG9yZSB0aGUgImJlc3QiIE1WICovCisgICAgaWYgKGNudFtDTlRfTkVBUkVTVF0gPj0gY250W0NOVF9JTlRSQV0pCisgICAgICAgIG5lYXJfbXZzW0NOVF9JTlRSQV0gPSBuZWFyX212c1tDTlRfTkVBUkVTVF07CisKKyAgICAvKiBTZXQgdXAgcmV0dXJuIHZhbHVlcyAqLworICAgIGJlc3RfbXYtPmFzX2ludCA9IG5lYXJfbXZzWzBdLmFzX2ludDsKKyAgICBuZWFyZXN0LT5hc19pbnQgPSBuZWFyX212c1tDTlRfTkVBUkVTVF0uYXNfaW50OworICAgIG5lYXJieS0+YXNfaW50ID0gbmVhcl9tdnNbQ05UX05FQVJdLmFzX2ludDsKK30KKworCitzdGF0aWMgdm9pZCBpbnZlcnRfYW5kX2NsYW1wX212cyhpbnRfbXYgKmludiwgaW50X212ICpzcmMsIE1BQ1JPQkxPQ0tEICp4ZCkKK3sKKyAgICBpbnYtPmFzX212LnJvdyA9IHNyYy0+YXNfbXYucm93ICogLTE7CisgICAgaW52LT5hc19tdi5jb2wgPSBzcmMtPmFzX212LmNvbCAqIC0xOworICAgIHZwOF9jbGFtcF9tdjIoaW52LCB4ZCk7CisgICAgdnA4X2NsYW1wX212MihzcmMsIHhkKTsKK30KKworCitpbnQgdnA4X2ZpbmRfbmVhcl9tdnNfYmlhcworKAorICAgIE1BQ1JPQkxPQ0tEICp4ZCwKKyAgICBjb25zdCBNT0RFX0lORk8gKmhlcmUsCisgICAgaW50X212IG1vZGVfbXZfc2JbMl1bTUJfTU9ERV9DT1VOVF0sCisgICAgaW50X212IGJlc3RfbXZfc2JbMl0sCisgICAgaW50IGNudFs0XSwKKyAgICBpbnQgcmVmZnJhbWUsCisgICAgaW50ICpyZWZfZnJhbWVfc2lnbl9iaWFzCispCit7CisgICAgaW50IHNpZ25fYmlhcyA9IHJlZl9mcmFtZV9zaWduX2JpYXNbcmVmZnJhbWVdOworCisgICAgdnA4X2ZpbmRfbmVhcl9tdnMoeGQsCisgICAgICAgICAgICAgICAgICAgICAgaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAmbW9kZV9tdl9zYltzaWduX2JpYXNdW05FQVJFU1RNVl0sCisgICAgICAgICAgICAgICAgICAgICAgJm1vZGVfbXZfc2Jbc2lnbl9iaWFzXVtORUFSTVZdLAorICAgICAgICAgICAgICAgICAgICAgICZiZXN0X212X3NiW3NpZ25fYmlhc10sCisgICAgICAgICAgICAgICAgICAgICAgY250LAorICAgICAgICAgICAgICAgICAgICAgIHJlZmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHJlZl9mcmFtZV9zaWduX2JpYXMpOworCisgICAgaW52ZXJ0X2FuZF9jbGFtcF9tdnMoJm1vZGVfbXZfc2JbIXNpZ25fYmlhc11bTkVBUkVTVE1WXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZV9tdl9zYltzaWduX2JpYXNdW05FQVJFU1RNVl0sIHhkKTsKKyAgICBpbnZlcnRfYW5kX2NsYW1wX212cygmbW9kZV9tdl9zYlshc2lnbl9iaWFzXVtORUFSTVZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlX212X3NiW3NpZ25fYmlhc11bTkVBUk1WXSwgeGQpOworICAgIGludmVydF9hbmRfY2xhbXBfbXZzKCZiZXN0X212X3NiWyFzaWduX2JpYXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICZiZXN0X212X3NiW3NpZ25fYmlhc10sIHhkKTsKKworICAgIHJldHVybiBzaWduX2JpYXM7Cit9CisKKwordnA4X3Byb2IgKnZwOF9tdl9yZWZfcHJvYnMoCisgICAgdnA4X3Byb2IgcFtWUDhfTVZSRUZTLTFdLCBjb25zdCBpbnQgbmVhcl9tdl9yZWZfY3RbNF0KKykKK3sKKyAgICBwWzBdID0gdnA4X21vZGVfY29udGV4dHMgW25lYXJfbXZfcmVmX2N0WzBdXSBbMF07CisgICAgcFsxXSA9IHZwOF9tb2RlX2NvbnRleHRzIFtuZWFyX212X3JlZl9jdFsxXV0gWzFdOworICAgIHBbMl0gPSB2cDhfbW9kZV9jb250ZXh0cyBbbmVhcl9tdl9yZWZfY3RbMl1dIFsyXTsKKyAgICBwWzNdID0gdnA4X21vZGVfY29udGV4dHMgW25lYXJfbXZfcmVmX2N0WzNdXSBbM107CisgICAgLypwWzNdID0gdnA4X21vZGVfY29udGV4dHMgW25lYXJfbXZfcmVmX2N0WzFdICsgbmVhcl9tdl9yZWZfY3RbMl0gKyBuZWFyX212X3JlZl9jdFszXV0gWzNdOyovCisgICAgcmV0dXJuIHA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2ZpbmRuZWFybXYuaCBiL2xpYnZweC92cDgvY29tbW9uL2ZpbmRuZWFybXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVmMDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vZmluZG5lYXJtdi5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19GSU5ETkVBUk1WX0gKKyNkZWZpbmUgX19JTkNfRklORE5FQVJNVl9ICisKKyNpbmNsdWRlICJtdi5oIgorI2luY2x1ZGUgImJsb2NrZC5oIgorI2luY2x1ZGUgIm1vZGVjb250LmgiCisjaW5jbHVkZSAidHJlZWNvZGVyLmgiCisKKworc3RhdGljIHZvaWQgbXZfYmlhcyhpbnQgcmVmbWJfcmVmX2ZyYW1lX3NpZ25fYmlhcywgaW50IHJlZmZyYW1lLCBpbnRfbXYgKm12cCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpyZWZfZnJhbWVfc2lnbl9iaWFzKQoreworICAgIGlmIChyZWZtYl9yZWZfZnJhbWVfc2lnbl9iaWFzICE9IHJlZl9mcmFtZV9zaWduX2JpYXNbcmVmZnJhbWVdKQorICAgIHsKKyAgICAgICAgbXZwLT5hc19tdi5yb3cgKj0gLTE7CisgICAgICAgIG12cC0+YXNfbXYuY29sICo9IC0xOworICAgIH0KK30KKworI2RlZmluZSBMRUZUX1RPUF9NQVJHSU4gKDE2IDw8IDMpCisjZGVmaW5lIFJJR0hUX0JPVFRPTV9NQVJHSU4gKDE2IDw8IDMpCitzdGF0aWMgdm9pZCB2cDhfY2xhbXBfbXYyKGludF9tdiAqbXYsIGNvbnN0IE1BQ1JPQkxPQ0tEICp4ZCkKK3sKKyAgICBpZiAobXYtPmFzX212LmNvbCA8ICh4ZC0+bWJfdG9fbGVmdF9lZGdlIC0gTEVGVF9UT1BfTUFSR0lOKSkKKyAgICAgICAgbXYtPmFzX212LmNvbCA9IHhkLT5tYl90b19sZWZ0X2VkZ2UgLSBMRUZUX1RPUF9NQVJHSU47CisgICAgZWxzZSBpZiAobXYtPmFzX212LmNvbCA+IHhkLT5tYl90b19yaWdodF9lZGdlICsgUklHSFRfQk9UVE9NX01BUkdJTikKKyAgICAgICAgbXYtPmFzX212LmNvbCA9IHhkLT5tYl90b19yaWdodF9lZGdlICsgUklHSFRfQk9UVE9NX01BUkdJTjsKKworICAgIGlmIChtdi0+YXNfbXYucm93IDwgKHhkLT5tYl90b190b3BfZWRnZSAtIExFRlRfVE9QX01BUkdJTikpCisgICAgICAgIG12LT5hc19tdi5yb3cgPSB4ZC0+bWJfdG9fdG9wX2VkZ2UgLSBMRUZUX1RPUF9NQVJHSU47CisgICAgZWxzZSBpZiAobXYtPmFzX212LnJvdyA+IHhkLT5tYl90b19ib3R0b21fZWRnZSArIFJJR0hUX0JPVFRPTV9NQVJHSU4pCisgICAgICAgIG12LT5hc19tdi5yb3cgPSB4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgKyBSSUdIVF9CT1RUT01fTUFSR0lOOworfQorCitzdGF0aWMgdm9pZCB2cDhfY2xhbXBfbXYoaW50X212ICptdiwgaW50IG1iX3RvX2xlZnRfZWRnZSwgaW50IG1iX3RvX3JpZ2h0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3RvX3RvcF9lZGdlLCBpbnQgbWJfdG9fYm90dG9tX2VkZ2UpCit7CisgICAgbXYtPmFzX212LmNvbCA9IChtdi0+YXNfbXYuY29sIDwgbWJfdG9fbGVmdF9lZGdlKSA/CisgICAgICAgIG1iX3RvX2xlZnRfZWRnZSA6IG12LT5hc19tdi5jb2w7CisgICAgbXYtPmFzX212LmNvbCA9IChtdi0+YXNfbXYuY29sID4gbWJfdG9fcmlnaHRfZWRnZSkgPworICAgICAgICBtYl90b19yaWdodF9lZGdlIDogbXYtPmFzX212LmNvbDsKKyAgICBtdi0+YXNfbXYucm93ID0gKG12LT5hc19tdi5yb3cgPCBtYl90b190b3BfZWRnZSkgPworICAgICAgICBtYl90b190b3BfZWRnZSA6IG12LT5hc19tdi5yb3c7CisgICAgbXYtPmFzX212LnJvdyA9IChtdi0+YXNfbXYucm93ID4gbWJfdG9fYm90dG9tX2VkZ2UpID8KKyAgICAgICAgbWJfdG9fYm90dG9tX2VkZ2UgOiBtdi0+YXNfbXYucm93OworfQorc3RhdGljIHVuc2lnbmVkIGludCB2cDhfY2hlY2tfbXZfYm91bmRzKGludF9tdiAqbXYsIGludCBtYl90b19sZWZ0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90b19yaWdodF9lZGdlLCBpbnQgbWJfdG9fdG9wX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90b19ib3R0b21fZWRnZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbmVlZF90b19jbGFtcDsKKyAgICBuZWVkX3RvX2NsYW1wID0gKG12LT5hc19tdi5jb2wgPCBtYl90b19sZWZ0X2VkZ2UpOworICAgIG5lZWRfdG9fY2xhbXAgfD0gKG12LT5hc19tdi5jb2wgPiBtYl90b19yaWdodF9lZGdlKTsKKyAgICBuZWVkX3RvX2NsYW1wIHw9IChtdi0+YXNfbXYucm93IDwgbWJfdG9fdG9wX2VkZ2UpOworICAgIG5lZWRfdG9fY2xhbXAgfD0gKG12LT5hc19tdi5yb3cgPiBtYl90b19ib3R0b21fZWRnZSk7CisgICAgcmV0dXJuIG5lZWRfdG9fY2xhbXA7Cit9CisKK3ZvaWQgdnA4X2ZpbmRfbmVhcl9tdnMKKygKKyAgICBNQUNST0JMT0NLRCAqeGQsCisgICAgY29uc3QgTU9ERV9JTkZPICpoZXJlLAorICAgIGludF9tdiAqbmVhcmVzdCwgaW50X212ICpuZWFyYnksIGludF9tdiAqYmVzdCwKKyAgICBpbnQgbmVhcl9tdl9yZWZfY3RzWzRdLAorICAgIGludCByZWZmcmFtZSwKKyAgICBpbnQgKnJlZl9mcmFtZV9zaWduX2JpYXMKKyk7CisKKworaW50IHZwOF9maW5kX25lYXJfbXZzX2JpYXMKKygKKyAgICBNQUNST0JMT0NLRCAqeGQsCisgICAgY29uc3QgTU9ERV9JTkZPICpoZXJlLAorICAgIGludF9tdiBtb2RlX212X3NiWzJdW01CX01PREVfQ09VTlRdLAorICAgIGludF9tdiBiZXN0X212X3NiWzJdLAorICAgIGludCBjbnRbNF0sCisgICAgaW50IHJlZmZyYW1lLAorICAgIGludCAqcmVmX2ZyYW1lX3NpZ25fYmlhcworKTsKKworCit2cDhfcHJvYiAqdnA4X212X3JlZl9wcm9icygKKyAgICB2cDhfcHJvYiBwW1ZQOF9NVlJFRlMtMV0sIGNvbnN0IGludCBuZWFyX212X3JlZl9jdFs0XQorKTsKKworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X21ic3BsaXRfb2Zmc2V0WzRdWzE2XTsKKworCitzdGF0aWMgaW50IGxlZnRfYmxvY2tfbXYoY29uc3QgTU9ERV9JTkZPICpjdXJfbWIsIGludCBiKQoreworICAgIGlmICghKGIgJiAzKSkKKyAgICB7CisgICAgICAgIC8qIE9uIEwgZWRnZSwgZ2V0IGZyb20gTUIgdG8gbGVmdCBvZiB1cyAqLworICAgICAgICAtLWN1cl9tYjsKKworICAgICAgICBpZihjdXJfbWItPm1ibWkubW9kZSAhPSBTUExJVE1WKQorICAgICAgICAgICAgcmV0dXJuIGN1cl9tYi0+bWJtaS5tdi5hc19pbnQ7CisgICAgICAgIGIgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gKGN1cl9tYi0+Ym1pICsgYiAtIDEpLT5tdi5hc19pbnQ7Cit9CisKK3N0YXRpYyBpbnQgYWJvdmVfYmxvY2tfbXYoY29uc3QgTU9ERV9JTkZPICpjdXJfbWIsIGludCBiLCBpbnQgbWlfc3RyaWRlKQoreworICAgIGlmICghKGIgPj4gMikpCisgICAgeworICAgICAgICAvKiBPbiB0b3AgZWRnZSwgZ2V0IGZyb20gTUIgYWJvdmUgdXMgKi8KKyAgICAgICAgY3VyX21iIC09IG1pX3N0cmlkZTsKKworICAgICAgICBpZihjdXJfbWItPm1ibWkubW9kZSAhPSBTUExJVE1WKQorICAgICAgICAgICAgcmV0dXJuIGN1cl9tYi0+bWJtaS5tdi5hc19pbnQ7CisgICAgICAgIGIgKz0gMTY7CisgICAgfQorCisgICAgcmV0dXJuIChjdXJfbWItPmJtaSArIGIgLSA0KS0+bXYuYXNfaW50OworfQorc3RhdGljIEJfUFJFRElDVElPTl9NT0RFIGxlZnRfYmxvY2tfbW9kZShjb25zdCBNT0RFX0lORk8gKmN1cl9tYiwgaW50IGIpCit7CisgICAgaWYgKCEoYiAmIDMpKQorICAgIHsKKyAgICAgICAgLyogT24gTCBlZGdlLCBnZXQgZnJvbSBNQiB0byBsZWZ0IG9mIHVzICovCisgICAgICAgIC0tY3VyX21iOworICAgICAgICBzd2l0Y2ggKGN1cl9tYi0+bWJtaS5tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJfUFJFRDoKKyAgICAgICAgICAgICAgcmV0dXJuIChjdXJfbWItPmJtaSArIGIgKyAzKS0+YXNfbW9kZTsKKyAgICAgICAgICAgIGNhc2UgRENfUFJFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQl9EQ19QUkVEOworICAgICAgICAgICAgY2FzZSBWX1BSRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJfVkVfUFJFRDsKKyAgICAgICAgICAgIGNhc2UgSF9QUkVEOgorICAgICAgICAgICAgICAgIHJldHVybiBCX0hFX1BSRUQ7CisgICAgICAgICAgICBjYXNlIFRNX1BSRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJfVE1fUFJFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJfRENfUFJFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoY3VyX21iLT5ibWkgKyBiIC0gMSktPmFzX21vZGU7Cit9CisKK3N0YXRpYyBCX1BSRURJQ1RJT05fTU9ERSBhYm92ZV9ibG9ja19tb2RlKGNvbnN0IE1PREVfSU5GTyAqY3VyX21iLCBpbnQgYiwgaW50IG1pX3N0cmlkZSkKK3sKKyAgICBpZiAoIShiID4+IDIpKQorICAgIHsKKyAgICAgICAgLyogT24gdG9wIGVkZ2UsIGdldCBmcm9tIE1CIGFib3ZlIHVzICovCisgICAgICAgIGN1cl9tYiAtPSBtaV9zdHJpZGU7CisKKyAgICAgICAgc3dpdGNoIChjdXJfbWItPm1ibWkubW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCX1BSRUQ6CisgICAgICAgICAgICAgIHJldHVybiAoY3VyX21iLT5ibWkgKyBiICsgMTIpLT5hc19tb2RlOworICAgICAgICAgICAgY2FzZSBEQ19QUkVEOgorICAgICAgICAgICAgICAgIHJldHVybiBCX0RDX1BSRUQ7CisgICAgICAgICAgICBjYXNlIFZfUFJFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQl9WRV9QUkVEOworICAgICAgICAgICAgY2FzZSBIX1BSRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJfSEVfUFJFRDsKKyAgICAgICAgICAgIGNhc2UgVE1fUFJFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQl9UTV9QUkVEOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQl9EQ19QUkVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChjdXJfbWItPmJtaSArIGIgLSA0KS0+YXNfbW9kZTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9nZW5lcmljL3N5c3RlbWRlcGVuZGVudC5jIGIvbGlidnB4L3ZwOC9jb21tb24vZ2VuZXJpYy9zeXN0ZW1kZXBlbmRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZhYzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vZ2VuZXJpYy9zeXN0ZW1kZXBlbmRlbnQuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2lmIEFSQ0hfQVJNCisjaW5jbHVkZSAidnB4X3BvcnRzL2FybS5oIgorI2VsaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKKyNpbmNsdWRlICJ2cHhfcG9ydHMveDg2LmgiCisjZW5kaWYKKyNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhjX2ludC5oIgorCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisjaWYgSEFWRV9VTklTVERfSCAmJiAhZGVmaW5lZChfX09TMl9fKQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VsaWYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiB2b2lkIChXSU5BUEkgKlBHTlNJKShMUFNZU1RFTV9JTkZPKTsKKyNlbGlmIGRlZmluZWQoX19PUzJfXykKKyNkZWZpbmUgSU5DTF9ET1MKKyNkZWZpbmUgSU5DTF9ET1NTUElOTE9DSworI2luY2x1ZGUgPG9zMi5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorc3RhdGljIGludCBnZXRfY3B1X2NvdW50KCkKK3sKKyAgICBpbnQgY29yZV9jb3VudCA9IDE2OworCisjaWYgSEFWRV9VTklTVERfSCAmJiAhZGVmaW5lZChfX09TMl9fKQorI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY29yZV9jb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2VsaWYgZGVmaW5lZChfU0NfTlBST0NfT05MTikKKyAgICBjb3JlX2NvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorICAgIHsKKyAgICAgICAgUEdOU0kgcEdOU0k7CisgICAgICAgIFNZU1RFTV9JTkZPIHN5c2luZm87CisKKyAgICAgICAgLyogQ2FsbCBHZXROYXRpdmVTeXN0ZW1JbmZvIGlmIHN1cHBvcnRlZCBvcgorICAgICAgICAgKiBHZXRTeXN0ZW1JbmZvIG90aGVyd2lzZS4gKi8KKworICAgICAgICBwR05TSSA9IChQR05TSSkgR2V0UHJvY0FkZHJlc3MoCisgICAgICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKFRFWFQoImtlcm5lbDMyLmRsbCIpKSwgIkdldE5hdGl2ZVN5c3RlbUluZm8iKTsKKyAgICAgICAgaWYgKHBHTlNJICE9IE5VTEwpCisgICAgICAgICAgICBwR05TSSgmc3lzaW5mbyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEdldFN5c3RlbUluZm8oJnN5c2luZm8pOworCisgICAgICAgIGNvcmVfY291bnQgPSBzeXNpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworICAgIH0KKyNlbGlmIGRlZmluZWQoX19PUzJfXykKKyAgICB7CisgICAgICAgIFVMT05HIHByb2NfaWQ7CisgICAgICAgIFVMT05HIHN0YXR1czsKKworICAgICAgICBjb3JlX2NvdW50ID0gMDsKKyAgICAgICAgZm9yIChwcm9jX2lkID0gMTsgOyBwcm9jX2lkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChEb3NHZXRQcm9jZXNzb3JTdGF0dXMocHJvY19pZCwgJnN0YXR1cykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFJPQ19PTkxJTkUpCisgICAgICAgICAgICAgICAgY29yZV9jb3VudCsrOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICAvKiBvdGhlciBwbGF0Zm9ybXMgKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIGNvcmVfY291bnQgPiAwID8gY29yZV9jb3VudCA6IDE7Cit9CisjZW5kaWYKKworCit2b2lkIHZwOF9tYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhWUDhfQ09NTU9OICpjdHgpCit7CisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgY3R4LT5wcm9jZXNzb3JfY29yZV9jb3VudCA9IGdldF9jcHVfY291bnQoKTsKKyNlbmRpZiAvKiBDT05GSUdfTVVMVElUSFJFQUQgKi8KKworI2lmIEFSQ0hfQVJNCisgICAgY3R4LT5jcHVfY2FwcyA9IGFybV9jcHVfY2FwcygpOworI2VsaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKKyAgICBjdHgtPmNwdV9jYXBzID0geDg2X3NpbWRfY2FwcygpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2hlYWRlci5oIGIvbGlidnB4L3ZwOC9jb21tb24vaGVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vaGVhZGVyLmgKcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL2hlYWRlci5oCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9pZGN0X2Jsay5jIGIvbGlidnB4L3ZwOC9jb21tb24vaWRjdF9ibGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjA1OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vaWRjdF9ibGsuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBzdHJpZGUpOwordm9pZCB2cDhfZGNfb25seV9pZGN0X2FkZF9jKHNob3J0IGlucHV0X2RjLCB1bnNpZ25lZCBjaGFyICogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUpOworCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYworICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqZW9icysrID4gMSkKKyAgICAgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9jIChxLCBkcSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX2MgKHFbMF0qZHFbMF0sIGRzdCwgc3RyaWRlLCBkc3QsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHEgICArPSAxNjsKKyAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IDQqc3RyaWRlIC0gMTY7CisgICAgfQorfQorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2MKKyAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdHUsIHVuc2lnbmVkIGNoYXIgKmRzdHYsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCplb2JzKysgPiAxKQorICAgICAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX2MgKHEsIGRxLCBkc3R1LCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX2MgKHFbMF0qZHFbMF0sIGRzdHUsIHN0cmlkZSwgZHN0dSwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcSAgICArPSAxNjsKKyAgICAgICAgICAgIGRzdHUgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdHUgKz0gNCpzdHJpZGUgLSA4OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKmVvYnMrKyA+IDEpCisgICAgICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfYyAocSwgZHEsIGRzdHYsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyAocVswXSpkcVswXSwgZHN0diwgc3RyaWRlLCBkc3R2LCBzdHJpZGUpOworICAgICAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBxICAgICs9IDE2OworICAgICAgICAgICAgZHN0diArPSA0OworICAgICAgICB9CisKKyAgICAgICAgZHN0diArPSA0KnN0cmlkZSAtIDg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vaWRjdGxsbS5jIGIvbGlidnB4L3ZwOC9jb21tb24vaWRjdGxsbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YWY1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9pZGN0bGxtLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTm90ZXM6CisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB1c2Ugb2YgMTYgYml0IGZpeGVkIHBvaW50IHZlcmlvIG9mIHR3byBtdWx0aXBseQorICogY29uc3RhbnRzOgorICogICAgICAgICAxLiAgIHNxcnQoMikgKiBjb3MgKHBpLzgpCisgKiAgICAgICAgIDIuICAgc3FydCgyKSAqIHNpbiAocGkvOCkKKyAqIEJlY3Vhc2UgdGhlIGZpcnN0IGNvbnN0YW50IGlzIGJpZ2dlciB0aGFuIDEsIHRvIG1haW50YWluIHRoZSBzYW1lIDE2IGJpdAorICogZml4ZWQgcG9pbnQgcHJlY2lzaW9uIGFzIHRoZSBzZWNvbmQgb25lLCB3ZSB1c2UgYSB0cmljayBvZgorICogICAgICAgICB4ICogYSA9IHggKyB4KihhLTEpCisgKiBzbworICogICAgICAgICB4ICogc3FydCgyKSAqIGNvcyAocGkvOCkgPSB4ICsgeCAqIChzcXJ0KDIpICpjb3MocGkvOCktMSkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgaW50IGNvc3BpOHNxcnQybWludXMxID0gMjAwOTE7CitzdGF0aWMgY29uc3QgaW50IHNpbnBpOHNxcnQyICAgICAgPSAzNTQ2ODsKKwordm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV9jKHNob3J0ICppbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKQoreworICAgIGludCBpOworICAgIGludCByLCBjOworICAgIGludCBhMSwgYjEsIGMxLCBkMTsKKyAgICBzaG9ydCBvdXRwdXRbMTZdOworICAgIHNob3J0ICppcCA9IGlucHV0OworICAgIHNob3J0ICpvcCA9IG91dHB1dDsKKyAgICBpbnQgdGVtcDEsIHRlbXAyOworICAgIGludCBzaG9ydHBpdGNoID0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBhMSA9IGlwWzBdICsgaXBbOF07CisgICAgICAgIGIxID0gaXBbMF0gLSBpcFs4XTsKKworICAgICAgICB0ZW1wMSA9IChpcFs0XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICAgICAgdGVtcDIgPSBpcFsxMl0gKyAoKGlwWzEyXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgICAgIGMxID0gdGVtcDEgLSB0ZW1wMjsKKworICAgICAgICB0ZW1wMSA9IGlwWzRdICsgKChpcFs0XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgICAgIHRlbXAyID0gKGlwWzEyXSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICAgICAgZDEgPSB0ZW1wMSArIHRlbXAyOworCisgICAgICAgIG9wW3Nob3J0cGl0Y2gqMF0gPSBhMSArIGQxOworICAgICAgICBvcFtzaG9ydHBpdGNoKjNdID0gYTEgLSBkMTsKKworICAgICAgICBvcFtzaG9ydHBpdGNoKjFdID0gYjEgKyBjMTsKKyAgICAgICAgb3Bbc2hvcnRwaXRjaCoyXSA9IGIxIC0gYzE7CisKKyAgICAgICAgaXArKzsKKyAgICAgICAgb3ArKzsKKyAgICB9CisKKyAgICBpcCA9IG91dHB1dDsKKyAgICBvcCA9IG91dHB1dDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBhMSA9IGlwWzBdICsgaXBbMl07CisgICAgICAgIGIxID0gaXBbMF0gLSBpcFsyXTsKKworICAgICAgICB0ZW1wMSA9IChpcFsxXSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICAgICAgdGVtcDIgPSBpcFszXSArICgoaXBbM10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgICAgICBjMSA9IHRlbXAxIC0gdGVtcDI7CisKKyAgICAgICAgdGVtcDEgPSBpcFsxXSArICgoaXBbMV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgICAgICB0ZW1wMiA9IChpcFszXSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICAgICAgZDEgPSB0ZW1wMSArIHRlbXAyOworCisKKyAgICAgICAgb3BbMF0gPSAoYTEgKyBkMSArIDQpID4+IDM7CisgICAgICAgIG9wWzNdID0gKGExIC0gZDEgKyA0KSA+PiAzOworCisgICAgICAgIG9wWzFdID0gKGIxICsgYzEgKyA0KSA+PiAzOworICAgICAgICBvcFsyXSA9IChiMSAtIGMxICsgNCkgPj4gMzsKKworICAgICAgICBpcCArPSBzaG9ydHBpdGNoOworICAgICAgICBvcCArPSBzaG9ydHBpdGNoOworICAgIH0KKworICAgIGlwID0gb3V0cHV0OworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYSA9IGlwW2NdICsgcHJlZF9wdHJbY10gOworCisgICAgICAgICAgICBpZiAoYSA8IDApCisgICAgICAgICAgICAgICAgYSA9IDA7CisKKyAgICAgICAgICAgIGlmIChhID4gMjU1KQorICAgICAgICAgICAgICAgIGEgPSAyNTU7CisKKyAgICAgICAgICAgIGRzdF9wdHJbY10gPSAodW5zaWduZWQgY2hhcikgYSA7CisgICAgICAgIH0KKyAgICAgICAgaXAgKz0gNDsKKyAgICAgICAgZHN0X3B0ciArPSBkc3Rfc3RyaWRlOworICAgICAgICBwcmVkX3B0ciArPSBwcmVkX3N0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyhzaG9ydCBpbnB1dF9kYywgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKQoreworICAgIGludCBhMSA9ICgoaW5wdXRfZGMgKyA0KSA+PiAzKTsKKyAgICBpbnQgciwgYzsKKworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYSA9IGExICsgcHJlZF9wdHJbY10gOworCisgICAgICAgICAgICBpZiAoYSA8IDApCisgICAgICAgICAgICAgICAgYSA9IDA7CisKKyAgICAgICAgICAgIGlmIChhID4gMjU1KQorICAgICAgICAgICAgICAgIGEgPSAyNTU7CisKKyAgICAgICAgICAgIGRzdF9wdHJbY10gPSAodW5zaWduZWQgY2hhcikgYSA7CisgICAgICAgIH0KKworICAgICAgICBkc3RfcHRyICs9IGRzdF9zdHJpZGU7CisgICAgICAgIHByZWRfcHRyICs9IHByZWRfc3RyaWRlOworICAgIH0KKworfQorCit2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICptYl9kcWNvZWZmKQoreworICAgIHNob3J0IG91dHB1dFsxNl07CisgICAgaW50IGk7CisgICAgaW50IGExLCBiMSwgYzEsIGQxOworICAgIGludCBhMiwgYjIsIGMyLCBkMjsKKyAgICBzaG9ydCAqaXAgPSBpbnB1dDsKKyAgICBzaG9ydCAqb3AgPSBvdXRwdXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgYTEgPSBpcFswXSArIGlwWzEyXTsKKyAgICAgICAgYjEgPSBpcFs0XSArIGlwWzhdOworICAgICAgICBjMSA9IGlwWzRdIC0gaXBbOF07CisgICAgICAgIGQxID0gaXBbMF0gLSBpcFsxMl07CisKKyAgICAgICAgb3BbMF0gPSBhMSArIGIxOworICAgICAgICBvcFs0XSA9IGMxICsgZDE7CisgICAgICAgIG9wWzhdID0gYTEgLSBiMTsKKyAgICAgICAgb3BbMTJdID0gZDEgLSBjMTsKKyAgICAgICAgaXArKzsKKyAgICAgICAgb3ArKzsKKyAgICB9CisKKyAgICBpcCA9IG91dHB1dDsKKyAgICBvcCA9IG91dHB1dDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBhMSA9IGlwWzBdICsgaXBbM107CisgICAgICAgIGIxID0gaXBbMV0gKyBpcFsyXTsKKyAgICAgICAgYzEgPSBpcFsxXSAtIGlwWzJdOworICAgICAgICBkMSA9IGlwWzBdIC0gaXBbM107CisKKyAgICAgICAgYTIgPSBhMSArIGIxOworICAgICAgICBiMiA9IGMxICsgZDE7CisgICAgICAgIGMyID0gYTEgLSBiMTsKKyAgICAgICAgZDIgPSBkMSAtIGMxOworCisgICAgICAgIG9wWzBdID0gKGEyICsgMykgPj4gMzsKKyAgICAgICAgb3BbMV0gPSAoYjIgKyAzKSA+PiAzOworICAgICAgICBvcFsyXSA9IChjMiArIDMpID4+IDM7CisgICAgICAgIG9wWzNdID0gKGQyICsgMykgPj4gMzsKKworICAgICAgICBpcCArPSA0OworICAgICAgICBvcCArPSA0OworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBtYl9kcWNvZWZmW2kgKiAxNl0gPSBvdXRwdXRbaV07CisgICAgfQorfQorCit2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm1iX2RxY29lZmYpCit7CisgICAgaW50IGk7CisgICAgaW50IGExOworCisgICAgYTEgPSAoKGlucHV0WzBdICsgMykgPj4gMyk7CisgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIG1iX2RxY29lZmZbaSAqIDE2XSA9IGExOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2ludnRyYW5zLmggYi9saWJ2cHgvdnA4L2NvbW1vbi9pbnZ0cmFucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDg2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9pbnZ0cmFucy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX0lOVlRSQU5TX0gKKyNkZWZpbmUgX19JTkNfSU5WVFJBTlNfSAorCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAiYmxvY2tkLmgiCisjaW5jbHVkZSAib255eGNfaW50LmgiCisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBlb2JfYWRqdXN0KGNoYXIgKmVvYnMsIHNob3J0ICpkaWZmKQoreworICAgIC8qIGVvYiBhZGp1c3QuLi4uIHRoZSBpZGN0IGNhbiBvbmx5IHNraXAgaWYgYm90aCB0aGUgZGMgYW5kIGVvYiBhcmUgemVybyAqLworICAgIGludCBqczsKKyAgICBmb3IoanMgPSAwOyBqcyA8IDE2OyBqcysrKQorICAgIHsKKyAgICAgICAgaWYoKGVvYnNbanNdID09IDApICYmIChkaWZmWzBdICE9IDApKQorICAgICAgICAgICAgZW9ic1tqc10rKzsKKyAgICAgICAgZGlmZis9MTY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fbWJ5KE1BQ1JPQkxPQ0tEICp4ZCkKK3sKKyAgICBzaG9ydCAqRFFDID0geGQtPmRlcXVhbnRfeTE7CisKKyAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKKyAgICB7CisgICAgICAgIC8qIGRvIDJuZCBvcmRlciB0cmFuc2Zvcm0gb24gdGhlIGRjIGJsb2NrICovCisgICAgICAgIGlmICh4ZC0+ZW9ic1syNF0gPiAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfc2hvcnRfaW52X3dhbHNoNHg0CisgICAgICAgICAgICAgICAgKCZ4ZC0+YmxvY2tbMjRdLmRxY29lZmZbMF0sIHhkLT5xY29lZmYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xCisgICAgICAgICAgICAgICAgKCZ4ZC0+YmxvY2tbMjRdLmRxY29lZmZbMF0sIHhkLT5xY29lZmYpOworICAgICAgICB9CisgICAgICAgIGVvYl9hZGp1c3QoeGQtPmVvYnMsIHhkLT5xY29lZmYpOworCisgICAgICAgIERRQyA9IHhkLT5kZXF1YW50X3kxX2RjOworICAgIH0KKyAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICh4ZC0+cWNvZWZmLCBEUUMsCisgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwgeGQtPmVvYnMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9sb29wZmlsdGVyLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9sb29wZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiNGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2xvb3BmaWx0ZXIuYwpAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJsb29wZmlsdGVyLmgiCisjaW5jbHVkZSAib255eGNfaW50LmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKKworc3RhdGljIHZvaWQgbGZfaW5pdF9sdXQobG9vcF9maWx0ZXJfaW5mb19uICpsZmkpCit7CisgICAgaW50IGZpbHRfbHZsOworCisgICAgZm9yIChmaWx0X2x2bCA9IDA7IGZpbHRfbHZsIDw9IE1BWF9MT09QX0ZJTFRFUjsgZmlsdF9sdmwrKykKKyAgICB7CisgICAgICAgIGlmIChmaWx0X2x2bCA+PSA0MCkKKyAgICAgICAgeworICAgICAgICAgICAgbGZpLT5oZXZfdGhyX2x1dFtLRVlfRlJBTUVdW2ZpbHRfbHZsXSA9IDI7CisgICAgICAgICAgICBsZmktPmhldl90aHJfbHV0W0lOVEVSX0ZSQU1FXVtmaWx0X2x2bF0gPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZpbHRfbHZsID49IDIwKQorICAgICAgICB7CisgICAgICAgICAgICBsZmktPmhldl90aHJfbHV0W0tFWV9GUkFNRV1bZmlsdF9sdmxdID0gMTsKKyAgICAgICAgICAgIGxmaS0+aGV2X3Rocl9sdXRbSU5URVJfRlJBTUVdW2ZpbHRfbHZsXSA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmlsdF9sdmwgPj0gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxmaS0+aGV2X3Rocl9sdXRbS0VZX0ZSQU1FXVtmaWx0X2x2bF0gPSAxOworICAgICAgICAgICAgbGZpLT5oZXZfdGhyX2x1dFtJTlRFUl9GUkFNRV1bZmlsdF9sdmxdID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxmaS0+aGV2X3Rocl9sdXRbS0VZX0ZSQU1FXVtmaWx0X2x2bF0gPSAwOworICAgICAgICAgICAgbGZpLT5oZXZfdGhyX2x1dFtJTlRFUl9GUkFNRV1bZmlsdF9sdmxdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxmaS0+bW9kZV9sZl9sdXRbRENfUFJFRF0gPSAxOworICAgIGxmaS0+bW9kZV9sZl9sdXRbVl9QUkVEXSA9IDE7CisgICAgbGZpLT5tb2RlX2xmX2x1dFtIX1BSRURdID0gMTsKKyAgICBsZmktPm1vZGVfbGZfbHV0W1RNX1BSRURdID0gMTsKKyAgICBsZmktPm1vZGVfbGZfbHV0W0JfUFJFRF0gID0gMDsKKworICAgIGxmaS0+bW9kZV9sZl9sdXRbWkVST01WXSAgPSAxOworICAgIGxmaS0+bW9kZV9sZl9sdXRbTkVBUkVTVE1WXSA9IDI7CisgICAgbGZpLT5tb2RlX2xmX2x1dFtORUFSTVZdID0gMjsKKyAgICBsZmktPm1vZGVfbGZfbHV0W05FV01WXSA9IDI7CisgICAgbGZpLT5tb2RlX2xmX2x1dFtTUExJVE1WXSA9IDM7CisKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfdXBkYXRlX3NoYXJwbmVzcyhsb29wX2ZpbHRlcl9pbmZvX24gKmxmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYXJwbmVzc19sdmwpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBGb3IgZWFjaCBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGxvb3AgZmlsdGVyIGZpbGwgb3V0IGxpbWl0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPT1BfRklMVEVSOyBpKyspCisgICAgeworICAgICAgICBpbnQgZmlsdF9sdmwgPSBpOworICAgICAgICBpbnQgYmxvY2tfaW5zaWRlX2xpbWl0ID0gMDsKKworICAgICAgICAvKiBTZXQgbG9vcCBmaWx0ZXIgcGFyYW1hZXRlcnMgdGhhdCBjb250cm9sIHNoYXJwbmVzcy4gKi8KKyAgICAgICAgYmxvY2tfaW5zaWRlX2xpbWl0ID0gZmlsdF9sdmwgPj4gKHNoYXJwbmVzc19sdmwgPiAwKTsKKyAgICAgICAgYmxvY2tfaW5zaWRlX2xpbWl0ID0gYmxvY2tfaW5zaWRlX2xpbWl0ID4+IChzaGFycG5lc3NfbHZsID4gNCk7CisKKyAgICAgICAgaWYgKHNoYXJwbmVzc19sdmwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmxvY2tfaW5zaWRlX2xpbWl0ID4gKDkgLSBzaGFycG5lc3NfbHZsKSkKKyAgICAgICAgICAgICAgICBibG9ja19pbnNpZGVfbGltaXQgPSAoOSAtIHNoYXJwbmVzc19sdmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJsb2NrX2luc2lkZV9saW1pdCA8IDEpCisgICAgICAgICAgICBibG9ja19pbnNpZGVfbGltaXQgPSAxOworCisgICAgICAgIHZweF9tZW1zZXQobGZpLT5saW1baV0sIGJsb2NrX2luc2lkZV9saW1pdCwgU0lNRF9XSURUSCk7CisgICAgICAgIHZweF9tZW1zZXQobGZpLT5ibGltW2ldLCAoMiAqIGZpbHRfbHZsICsgYmxvY2tfaW5zaWRlX2xpbWl0KSwKKyAgICAgICAgICAgICAgICBTSU1EX1dJRFRIKTsKKyAgICAgICAgdnB4X21lbXNldChsZmktPm1ibGltW2ldLCAoMiAqIChmaWx0X2x2bCArIDIpICsgYmxvY2tfaW5zaWRlX2xpbWl0KSwKKyAgICAgICAgICAgICAgICBTSU1EX1dJRFRIKTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2luaXQoVlA4X0NPTU1PTiAqY20pCit7CisgICAgbG9vcF9maWx0ZXJfaW5mb19uICpsZmkgPSAmY20tPmxmX2luZm87CisgICAgaW50IGk7CisKKyAgICAvKiBpbml0IGxpbWl0cyBmb3IgZ2l2ZW4gc2hhcnBuZXNzKi8KKyAgICB2cDhfbG9vcF9maWx0ZXJfdXBkYXRlX3NoYXJwbmVzcyhsZmksIGNtLT5zaGFycG5lc3NfbGV2ZWwpOworICAgIGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGNtLT5zaGFycG5lc3NfbGV2ZWw7CisKKyAgICAvKiBpbml0IExVVCBmb3IgbHZsICBhbmQgaGV2IHRociBwaWNraW5nICovCisgICAgbGZfaW5pdF9sdXQobGZpKTsKKworICAgIC8qIGluaXQgaGV2IHRocmVzaG9sZCBjb25zdCB2ZWN0b3JzICovCisgICAgZm9yKGkgPSAwOyBpIDwgNCA7IGkrKykKKyAgICB7CisgICAgICAgIHZweF9tZW1zZXQobGZpLT5oZXZfdGhyW2ldLCBpLCBTSU1EX1dJRFRIKTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQoVlA4X0NPTU1PTiAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0tEICptYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0X2ZpbHRfbHZsKQoreworICAgIGludCBzZWcsICAvKiBzZWdtZW50IG51bWJlciAqLworICAgICAgICByZWYsICAvKiBpbmRleCBpbiByZWZfbGZfZGVsdGFzICovCisgICAgICAgIG1vZGU7IC8qIGluZGV4IGluIG1vZGVfbGZfZGVsdGFzICovCisKKyAgICBsb29wX2ZpbHRlcl9pbmZvX24gKmxmaSA9ICZjbS0+bGZfaW5mbzsKKworICAgIC8qIHVwZGF0ZSBsaW1pdHMgaWYgc2hhcnBuZXNzIGhhcyBjaGFuZ2VkICovCisgICAgaWYoY20tPmxhc3Rfc2hhcnBuZXNzX2xldmVsICE9IGNtLT5zaGFycG5lc3NfbGV2ZWwpCisgICAgeworICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdXBkYXRlX3NoYXJwbmVzcyhsZmksIGNtLT5zaGFycG5lc3NfbGV2ZWwpOworICAgICAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOworICAgIH0KKworICAgIGZvcihzZWcgPSAwOyBzZWcgPCBNQVhfTUJfU0VHTUVOVFM7IHNlZysrKQorICAgIHsKKyAgICAgICAgaW50IGx2bF9zZWcgPSBkZWZhdWx0X2ZpbHRfbHZsOworICAgICAgICBpbnQgbHZsX3JlZiwgbHZsX21vZGU7CisKKyAgICAgICAgLyogTm90ZSB0aGUgYmFzZWxpbmUgZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBzZWdtZW50ICovCisgICAgICAgIGlmIChtYmQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBYnMgdmFsdWUgKi8KKyAgICAgICAgICAgIGlmIChtYmQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbHZsX3NlZyA9IG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bc2VnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8qIERlbHRhIFZhbHVlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbHZsX3NlZyArPSBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdW3NlZ107CisgICAgICAgICAgICAgICAgbHZsX3NlZyA9IChsdmxfc2VnID4gMCkgPyAoKGx2bF9zZWcgPiA2MykgPyA2MzogbHZsX3NlZykgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtYmQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGNvdWxkIGdldCByaWQgb2YgdGhpcyBpZiB3ZSBhc3N1bWUgdGhhdCBkZWx0YXMgYXJlIHNldCB0bworICAgICAgICAgICAgICogemVybyB3aGVuIG5vdCBpbiB1c2U7IGVuY29kZXIgYWx3YXlzIHVzZXMgZGVsdGFzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHZweF9tZW1zZXQobGZpLT5sdmxbc2VnXVswXSwgbHZsX3NlZywgNCAqIDQgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbHZsX3JlZiA9IGx2bF9zZWc7CisKKyAgICAgICAgLyogSU5UUkFfRlJBTUUgKi8KKyAgICAgICAgcmVmID0gSU5UUkFfRlJBTUU7CisKKyAgICAgICAgLyogQXBwbHkgZGVsdGEgZm9yIHJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICBsdmxfcmVmICs9IG1iZC0+cmVmX2xmX2RlbHRhc1tyZWZdOworCisgICAgICAgIC8qIEFwcGx5IGRlbHRhIGZvciBJbnRyYSBtb2RlcyAqLworICAgICAgICBtb2RlID0gMDsgLyogQl9QUkVEICovCisgICAgICAgIC8qIE9ubHkgdGhlIHNwbGl0IG1vZGUgQlBSRUQgaGFzIGEgZnVydGhlciBzcGVjaWFsIGNhc2UgKi8KKyAgICAgICAgbHZsX21vZGUgPSBsdmxfcmVmICsgIG1iZC0+bW9kZV9sZl9kZWx0YXNbbW9kZV07CisgICAgICAgIGx2bF9tb2RlID0gKGx2bF9tb2RlID4gMCkgPyAobHZsX21vZGUgPiA2MyA/IDYzIDogbHZsX21vZGUpIDogMDsgLyogY2xhbXAgKi8KKworICAgICAgICBsZmktPmx2bFtzZWddW3JlZl1bbW9kZV0gPSBsdmxfbW9kZTsKKworICAgICAgICBtb2RlID0gMTsgLyogYWxsIHRoZSByZXN0IG9mIEludHJhIG1vZGVzICovCisgICAgICAgIGx2bF9tb2RlID0gKGx2bF9yZWYgPiAwKSA/IChsdmxfcmVmID4gNjMgPyA2MyA6IGx2bF9yZWYpICA6IDA7IC8qIGNsYW1wICovCisgICAgICAgIGxmaS0+bHZsW3NlZ11bcmVmXVttb2RlXSA9IGx2bF9tb2RlOworCisgICAgICAgIC8qIExBU1QsIEdPTERFTiwgQUxUICovCisgICAgICAgIGZvcihyZWYgPSAxOyByZWYgPCBNQVhfUkVGX0ZSQU1FUzsgcmVmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsdmxfcmVmID0gbHZsX3NlZzsKKworICAgICAgICAgICAgLyogQXBwbHkgZGVsdGEgZm9yIHJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgbHZsX3JlZiArPSBtYmQtPnJlZl9sZl9kZWx0YXNbcmVmXTsKKworICAgICAgICAgICAgLyogQXBwbHkgZGVsdGEgZm9yIEludGVyIG1vZGVzICovCisgICAgICAgICAgICBmb3IgKG1vZGUgPSAxOyBtb2RlIDwgNDsgbW9kZSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGx2bF9tb2RlID0gbHZsX3JlZiArIG1iZC0+bW9kZV9sZl9kZWx0YXNbbW9kZV07CisgICAgICAgICAgICAgICAgbHZsX21vZGUgPSAobHZsX21vZGUgPiAwKSA/IChsdmxfbW9kZSA+IDYzID8gNjMgOiBsdmxfbW9kZSkgOiAwOyAvKiBjbGFtcCAqLworCisgICAgICAgICAgICAgICAgbGZpLT5sdmxbc2VnXVtyZWZdW21vZGVdID0gbHZsX21vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfcm93X25vcm1hbChWUDhfQ09NTU9OICpjbSwgTU9ERV9JTkZPICptb2RlX2luZm9fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LCBpbnQgcG9zdF95c3RyaWRlLCBpbnQgcG9zdF91dnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdl9wdHIpCit7CisgICAgaW50IG1iX2NvbDsKKyAgICBpbnQgZmlsdGVyX2xldmVsOworICAgIGxvb3BfZmlsdGVyX2luZm9fbiAqbGZpX24gPSAmY20tPmxmX2luZm87CisgICAgbG9vcF9maWx0ZXJfaW5mbyBsZmk7CisgICAgRlJBTUVfVFlQRSBmcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7CisKKyAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNtLT5tYl9jb2xzOyBtYl9jb2wrKykKKyAgICB7CisgICAgICAgIGludCBza2lwX2xmID0gKG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVEICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYpOworCisgICAgICAgIGNvbnN0IGludCBtb2RlX2luZGV4ID0gbGZpX24tPm1vZGVfbGZfbHV0W21vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGVdOworICAgICAgICBjb25zdCBpbnQgc2VnID0gbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZDsKKyAgICAgICAgY29uc3QgaW50IHJlZl9mcmFtZSA9IG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZTsKKworICAgICAgICBmaWx0ZXJfbGV2ZWwgPSBsZmlfbi0+bHZsW3NlZ11bcmVmX2ZyYW1lXVttb2RlX2luZGV4XTsKKworICAgICAgICBpZiAoZmlsdGVyX2xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgaGV2X2luZGV4ID0gbGZpX24tPmhldl90aHJfbHV0W2ZyYW1lX3R5cGVdW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICBsZmkubWJsaW0gPSBsZmlfbi0+bWJsaW1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgIGxmaS5ibGltID0gbGZpX24tPmJsaW1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgIGxmaS5saW0gPSBsZmlfbi0+bGltW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICBsZmkuaGV2X3RociA9IGxmaV9uLT5oZXZfdGhyW2hldl9pbmRleF07CisKKyAgICAgICAgICAgIGlmIChtYl9jb2wgPiAwKQorICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9tYnYKKyAgICAgICAgICAgICAgICAoeV9wdHIsIHVfcHRyLCB2X3B0ciwgcG9zdF95c3RyaWRlLCBwb3N0X3V2c3RyaWRlLCAmbGZpKTsKKworICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9idgorICAgICAgICAgICAgICAgICh5X3B0ciwgdV9wdHIsIHZfcHRyLCBwb3N0X3lzdHJpZGUsIHBvc3RfdXZzdHJpZGUsICZsZmkpOworCisgICAgICAgICAgICAvKiBkb24ndCBhcHBseSBhY3Jvc3MgdW12IGJvcmRlciAqLworICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCisgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX21iaAorICAgICAgICAgICAgICAgICh5X3B0ciwgdV9wdHIsIHZfcHRyLCBwb3N0X3lzdHJpZGUsIHBvc3RfdXZzdHJpZGUsICZsZmkpOworCisgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2JoCisgICAgICAgICAgICAgICAgKHlfcHRyLCB1X3B0ciwgdl9wdHIsIHBvc3RfeXN0cmlkZSwgcG9zdF91dnN0cmlkZSwgJmxmaSk7CisgICAgICAgIH0KKworICAgICAgICB5X3B0ciArPSAxNjsKKyAgICAgICAgdV9wdHIgKz0gODsKKyAgICAgICAgdl9wdHIgKz0gODsKKworICAgICAgICBtb2RlX2luZm9fY29udGV4dCsrOyAgICAgLyogc3RlcCB0byBuZXh0IE1CICovCisgICAgfQorCit9CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3Jvd19zaW1wbGUoVlA4X0NPTU1PTiAqY20sIE1PREVfSU5GTyAqbW9kZV9pbmZvX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3JvdywgaW50IHBvc3RfeXN0cmlkZSwgaW50IHBvc3RfdXZzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZfcHRyKQoreworICAgIGludCBtYl9jb2w7CisgICAgaW50IGZpbHRlcl9sZXZlbDsKKyAgICBsb29wX2ZpbHRlcl9pbmZvX24gKmxmaV9uID0gJmNtLT5sZl9pbmZvOworCisgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sKyspCisgICAgeworICAgICAgICBpbnQgc2tpcF9sZiA9IChtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKTsKKworICAgICAgICBjb25zdCBpbnQgbW9kZV9pbmRleCA9IGxmaV9uLT5tb2RlX2xmX2x1dFttb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlXTsKKyAgICAgICAgY29uc3QgaW50IHNlZyA9IG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQ7CisgICAgICAgIGNvbnN0IGludCByZWZfZnJhbWUgPSBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWU7CisKKyAgICAgICAgZmlsdGVyX2xldmVsID0gbGZpX24tPmx2bFtzZWddW3JlZl9mcmFtZV1bbW9kZV9pbmRleF07CisKKyAgICAgICAgaWYgKGZpbHRlcl9sZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1iX2NvbCA+IDApCisgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYnYKKyAgICAgICAgICAgICAgICAoeV9wdHIsIHBvc3RfeXN0cmlkZSwgbGZpX24tPm1ibGltW2ZpbHRlcl9sZXZlbF0pOworCisgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9idgorICAgICAgICAgICAgICAgICh5X3B0ciwgcG9zdF95c3RyaWRlLCBsZmlfbi0+YmxpbVtmaWx0ZXJfbGV2ZWxdKTsKKworICAgICAgICAgICAgLyogZG9uJ3QgYXBwbHkgYWNyb3NzIHVtdiBib3JkZXIgKi8KKyAgICAgICAgICAgIGlmIChtYl9yb3cgPiAwKQorICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoCisgICAgICAgICAgICAgICAgKHlfcHRyLCBwb3N0X3lzdHJpZGUsIGxmaV9uLT5tYmxpbVtmaWx0ZXJfbGV2ZWxdKTsKKworICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYmgKKyAgICAgICAgICAgICAgICAoeV9wdHIsIHBvc3RfeXN0cmlkZSwgbGZpX24tPmJsaW1bZmlsdGVyX2xldmVsXSk7CisgICAgICAgIH0KKworICAgICAgICB5X3B0ciArPSAxNjsKKyAgICAgICAgdV9wdHIgKz0gODsKKyAgICAgICAgdl9wdHIgKz0gODsKKworICAgICAgICBtb2RlX2luZm9fY29udGV4dCsrOyAgICAgLyogc3RlcCB0byBuZXh0IE1CICovCisgICAgfQorCit9Cit2b2lkIHZwOF9sb29wX2ZpbHRlcl9mcmFtZShWUDhfQ09NTU9OICpjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0tEICptYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfdHlwZSkKK3sKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnBvc3QgPSBjbS0+ZnJhbWVfdG9fc2hvdzsKKyAgICBsb29wX2ZpbHRlcl9pbmZvX24gKmxmaV9uID0gJmNtLT5sZl9pbmZvOworICAgIGxvb3BfZmlsdGVyX2luZm8gbGZpOworCisgICAgaW50IG1iX3JvdzsKKyAgICBpbnQgbWJfY29sOworICAgIGludCBtYl9yb3dzID0gY20tPm1iX3Jvd3M7CisgICAgaW50IG1iX2NvbHMgPSBjbS0+bWJfY29sczsKKworICAgIGludCBmaWx0ZXJfbGV2ZWw7CisKKyAgICB1bnNpZ25lZCBjaGFyICp5X3B0ciwgKnVfcHRyLCAqdl9wdHI7CisKKyAgICAvKiBQb2ludCBhdCBiYXNlIG9mIE1iIE1PREVfSU5GTyBsaXN0ICovCisgICAgY29uc3QgTU9ERV9JTkZPICptb2RlX2luZm9fY29udGV4dCA9IGNtLT5taTsKKyAgICBpbnQgcG9zdF95X3N0cmlkZSA9IHBvc3QtPnlfc3RyaWRlOworICAgIGludCBwb3N0X3V2X3N0cmlkZSA9IHBvc3QtPnV2X3N0cmlkZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGxvb3AgZmlsdGVyIGZvciB0aGlzIGZyYW1lLiAqLworICAgIHZwOF9sb29wX2ZpbHRlcl9mcmFtZV9pbml0KGNtLCBtYmQsIGNtLT5maWx0ZXJfbGV2ZWwpOworCisgICAgLyogU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KKyAgICB5X3B0ciA9IHBvc3QtPnlfYnVmZmVyOworICAgIHVfcHRyID0gcG9zdC0+dV9idWZmZXI7CisgICAgdl9wdHIgPSBwb3N0LT52X2J1ZmZlcjsKKworICAgIC8qIHZwOF9maWx0ZXIgZWFjaCBtYWNybyBibG9jayAqLworICAgIGlmIChjbS0+ZmlsdGVyX3R5cGUgPT0gTk9STUFMX0xPT1BGSUxURVIpCisgICAgeworICAgICAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IG1iX3Jvd3M7IG1iX3JvdysrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IG1iX2NvbHM7IG1iX2NvbCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBza2lwX2xmID0gKG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNViAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGludCBtb2RlX2luZGV4ID0gbGZpX24tPm1vZGVfbGZfbHV0W21vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGVdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBzZWcgPSBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkOworICAgICAgICAgICAgICAgIGNvbnN0IGludCByZWZfZnJhbWUgPSBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWU7CisKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgPSBsZmlfbi0+bHZsW3NlZ11bcmVmX2ZyYW1lXVttb2RlX2luZGV4XTsKKworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfbGV2ZWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGV2X2luZGV4ID0gbGZpX24tPmhldl90aHJfbHV0W2ZyYW1lX3R5cGVdW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5tYmxpbSA9IGxmaV9uLT5tYmxpbVtmaWx0ZXJfbGV2ZWxdOworICAgICAgICAgICAgICAgICAgICBsZmkuYmxpbSA9IGxmaV9uLT5ibGltW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5saW0gPSBsZmlfbi0+bGltW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5oZXZfdGhyID0gbGZpX24tPmhldl90aHJbaGV2X2luZGV4XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9tYnYKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgdV9wdHIsIHZfcHRyLCBwb3N0X3lfc3RyaWRlLCBwb3N0X3V2X3N0cmlkZSwgJmxmaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2J2CisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIHVfcHRyLCB2X3B0ciwgcG9zdF95X3N0cmlkZSwgcG9zdF91dl9zdHJpZGUsICZsZmkpOworCisgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGFwcGx5IGFjcm9zcyB1bXYgYm9yZGVyICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl9yb3cgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX21iaAorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCB1X3B0ciwgdl9wdHIsIHBvc3RfeV9zdHJpZGUsIHBvc3RfdXZfc3RyaWRlLCAmbGZpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgdV9wdHIsIHZfcHRyLCBwb3N0X3lfc3RyaWRlLCBwb3N0X3V2X3N0cmlkZSwgJmxmaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeV9wdHIgKz0gMTY7CisgICAgICAgICAgICAgICAgdV9wdHIgKz0gODsKKyAgICAgICAgICAgICAgICB2X3B0ciArPSA4OworCisgICAgICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQrKzsgICAgIC8qIHN0ZXAgdG8gbmV4dCBNQiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgeV9wdHIgKz0gcG9zdF95X3N0cmlkZSAgKiAxNiAtIHBvc3QtPnlfd2lkdGg7CisgICAgICAgICAgICB1X3B0ciArPSBwb3N0X3V2X3N0cmlkZSAqICA4IC0gcG9zdC0+dXZfd2lkdGg7CisgICAgICAgICAgICB2X3B0ciArPSBwb3N0X3V2X3N0cmlkZSAqICA4IC0gcG9zdC0+dXZfd2lkdGg7CisKKyAgICAgICAgICAgIG1vZGVfaW5mb19jb250ZXh0Kys7ICAgICAgICAgLyogU2tpcCBib3JkZXIgbWIgKi8KKworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogU0lNUExFX0xPT1BGSUxURVIgKi8KKyAgICB7CisgICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgbWJfcm93czsgbWJfcm93KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgbWJfY29sczsgbWJfY29sKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNraXBfbGYgPSAobW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYpOworCisgICAgICAgICAgICAgICAgY29uc3QgaW50IG1vZGVfaW5kZXggPSBsZmlfbi0+bW9kZV9sZl9sdXRbbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHNlZyA9IG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQ7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlZl9mcmFtZSA9IG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZTsKKworICAgICAgICAgICAgICAgIGZpbHRlcl9sZXZlbCA9IGxmaV9uLT5sdmxbc2VnXVtyZWZfZnJhbWVdW21vZGVfaW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfbGV2ZWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogbWJsaW0gPSBsZmlfbi0+bWJsaW1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGJsaW0gPSBsZmlfbi0+YmxpbVtmaWx0ZXJfbGV2ZWxdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl9jb2wgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYnYKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgcG9zdF95X3N0cmlkZSwgbWJsaW0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcF9sZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnYKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgcG9zdF95X3N0cmlkZSwgYmxpbSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgYXBwbHkgYWNyb3NzIHVtdiBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21iaAorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCBwb3N0X3lfc3RyaWRlLCBtYmxpbSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaAorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCBwb3N0X3lfc3RyaWRlLCBibGltKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB5X3B0ciArPSAxNjsKKyAgICAgICAgICAgICAgICB1X3B0ciArPSA4OworICAgICAgICAgICAgICAgIHZfcHRyICs9IDg7CisKKyAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dCsrOyAgICAgLyogc3RlcCB0byBuZXh0IE1CICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB5X3B0ciArPSBwb3N0X3lfc3RyaWRlICAqIDE2IC0gcG9zdC0+eV93aWR0aDsKKyAgICAgICAgICAgIHVfcHRyICs9IHBvc3RfdXZfc3RyaWRlICogIDggLSBwb3N0LT51dl93aWR0aDsKKyAgICAgICAgICAgIHZfcHRyICs9IHBvc3RfdXZfc3RyaWRlICogIDggLSBwb3N0LT51dl93aWR0aDsKKworICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQrKzsgICAgICAgICAvKiBTa2lwIGJvcmRlciBtYiAqLworCisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX3lvbmx5CisoCisgICAgVlA4X0NPTU1PTiAqY20sCisgICAgTUFDUk9CTE9DS0QgKm1iZCwKKyAgICBpbnQgZGVmYXVsdF9maWx0X2x2bAorKQoreworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqcG9zdCA9IGNtLT5mcmFtZV90b19zaG93OworCisgICAgdW5zaWduZWQgY2hhciAqeV9wdHI7CisgICAgaW50IG1iX3JvdzsKKyAgICBpbnQgbWJfY29sOworCisgICAgbG9vcF9maWx0ZXJfaW5mb19uICpsZmlfbiA9ICZjbS0+bGZfaW5mbzsKKyAgICBsb29wX2ZpbHRlcl9pbmZvIGxmaTsKKworICAgIGludCBmaWx0ZXJfbGV2ZWw7CisgICAgRlJBTUVfVFlQRSBmcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7CisKKyAgICAvKiBQb2ludCBhdCBiYXNlIG9mIE1iIE1PREVfSU5GTyBsaXN0ICovCisgICAgY29uc3QgTU9ERV9JTkZPICptb2RlX2luZm9fY29udGV4dCA9IGNtLT5taTsKKworI2lmIDAKKyAgICBpZihkZWZhdWx0X2ZpbHRfbHZsID09IDApIC8qIG5vIGZpbHRlciBhcHBsaWVkICovCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9vcCBmaWx0ZXIgZm9yIHRoaXMgZnJhbWUuICovCisgICAgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQoIGNtLCBtYmQsIGRlZmF1bHRfZmlsdF9sdmwpOworCisgICAgLyogU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KKyAgICB5X3B0ciA9IHBvc3QtPnlfYnVmZmVyOworCisgICAgLyogdnA4X2ZpbHRlciBlYWNoIG1hY3JvIGJsb2NrICovCisgICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCBjbS0+bWJfcm93czsgbWJfcm93KyspCisgICAgeworICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNtLT5tYl9jb2xzOyBtYl9jb2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNraXBfbGYgPSAobW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKTsKKworICAgICAgICAgICAgY29uc3QgaW50IG1vZGVfaW5kZXggPSBsZmlfbi0+bW9kZV9sZl9sdXRbbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZV07CisgICAgICAgICAgICBjb25zdCBpbnQgc2VnID0gbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZDsKKyAgICAgICAgICAgIGNvbnN0IGludCByZWZfZnJhbWUgPSBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWU7CisKKyAgICAgICAgICAgIGZpbHRlcl9sZXZlbCA9IGxmaV9uLT5sdmxbc2VnXVtyZWZfZnJhbWVdW21vZGVfaW5kZXhdOworCisgICAgICAgICAgICBpZiAoZmlsdGVyX2xldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbS0+ZmlsdGVyX3R5cGUgPT0gTk9STUFMX0xPT1BGSUxURVIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGV2X2luZGV4ID0gbGZpX24tPmhldl90aHJfbHV0W2ZyYW1lX3R5cGVdW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5tYmxpbSA9IGxmaV9uLT5tYmxpbVtmaWx0ZXJfbGV2ZWxdOworICAgICAgICAgICAgICAgICAgICBsZmkuYmxpbSA9IGxmaV9uLT5ibGltW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5saW0gPSBsZmlfbi0+bGltW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5oZXZfdGhyID0gbGZpX24tPmhldl90aHJbaGV2X2luZGV4XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9tYnYKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgMCwgMCwgcG9zdC0+eV9zdHJpZGUsIDAsICZsZmkpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcF9sZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9idgorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCAwLCAwLCBwb3N0LT55X3N0cmlkZSwgMCwgJmxmaSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgYXBwbHkgYWNyb3NzIHVtdiBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbWJoCisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIDAsIDAsIHBvc3QtPnlfc3RyaWRlLCAwLCAmbGZpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgMCwgMCwgcG9zdC0+eV9zdHJpZGUsIDAsICZsZmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJ2CisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIHBvc3QtPnlfc3RyaWRlLCBsZmlfbi0+bWJsaW1bZmlsdGVyX2xldmVsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9idgorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCBwb3N0LT55X3N0cmlkZSwgbGZpX24tPmJsaW1bZmlsdGVyX2xldmVsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgYXBwbHkgYWNyb3NzIHVtdiBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21iaAorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCBwb3N0LT55X3N0cmlkZSwgbGZpX24tPm1ibGltW2ZpbHRlcl9sZXZlbF0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcF9sZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgcG9zdC0+eV9zdHJpZGUsIGxmaV9uLT5ibGltW2ZpbHRlcl9sZXZlbF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeV9wdHIgKz0gMTY7CisgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dCArKzsgICAgICAgIC8qIHN0ZXAgdG8gbmV4dCBNQiAqLworCisgICAgICAgIH0KKworICAgICAgICB5X3B0ciArPSBwb3N0LT55X3N0cmlkZSAgKiAxNiAtIHBvc3QtPnlfd2lkdGg7CisgICAgICAgIG1vZGVfaW5mb19jb250ZXh0ICsrOyAgICAgICAgICAgIC8qIFNraXAgYm9yZGVyIG1iICovCisgICAgfQorCit9CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3BhcnRpYWxfZnJhbWUKKygKKyAgICBWUDhfQ09NTU9OICpjbSwKKyAgICBNQUNST0JMT0NLRCAqbWJkLAorICAgIGludCBkZWZhdWx0X2ZpbHRfbHZsCispCit7CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gY20tPmZyYW1lX3RvX3Nob3c7CisKKyAgICB1bnNpZ25lZCBjaGFyICp5X3B0cjsKKyAgICBpbnQgbWJfcm93OworICAgIGludCBtYl9jb2w7CisgICAgaW50IG1iX2NvbHMgPSBwb3N0LT55X3dpZHRoID4+IDQ7CisgICAgaW50IG1iX3Jvd3MgPSBwb3N0LT55X2hlaWdodCA+PiA0OworCisgICAgaW50IGxpbmVzdG9jb3B5LCBpOworCisgICAgbG9vcF9maWx0ZXJfaW5mb19uICpsZmlfbiA9ICZjbS0+bGZfaW5mbzsKKyAgICBsb29wX2ZpbHRlcl9pbmZvIGxmaTsKKworICAgIGludCBmaWx0ZXJfbGV2ZWw7CisgICAgaW50IGFsdF9mbHRfZW5hYmxlZCA9IG1iZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQ7CisgICAgRlJBTUVfVFlQRSBmcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7CisKKyAgICBjb25zdCBNT0RFX0lORk8gKm1vZGVfaW5mb19jb250ZXh0OworCisgICAgaW50IGx2bF9zZWdbTUFYX01CX1NFR01FTlRTXTsKKworICAgIC8qIG51bWJlciBvZiBNQiByb3dzIHRvIHVzZSBpbiBwYXJ0aWFsIGZpbHRlcmluZyAqLworICAgIGxpbmVzdG9jb3B5ID0gbWJfcm93cyAvIFBBUlRJQUxfRlJBTUVfRlJBQ1RJT047CisgICAgbGluZXN0b2NvcHkgPSBsaW5lc3RvY29weSA/IGxpbmVzdG9jb3B5IDw8IDQgOiAxNjsgICAgIC8qIDE2IGxpbmVzIHBlciBNQiAqLworCisgICAgLyogTm90ZSB0aGUgYmFzZWxpbmUgZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBzZWdtZW50ICovCisgICAgLyogU2VlIHZwOF9sb29wX2ZpbHRlcl9mcmFtZV9pbml0LiBSYXRoZXIgdGhhbiBjYWxsIHRoYXQgZm9yIGVhY2ggY2hhbmdlCisgICAgICogdG8gZGVmYXVsdF9maWx0X2x2bCwgY29weSB0aGUgcmVsZXZhbnQgY2FsY3VsYXRpb24gaGVyZS4KKyAgICAgKi8KKyAgICBpZiAoYWx0X2ZsdF9lbmFibGVkKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgaSsrKQorICAgICAgICB7ICAgIC8qIEFicyB2YWx1ZSAqLworICAgICAgICAgICAgaWYgKG1iZC0+bWJfc2VnZW1lbnRfYWJzX2RlbHRhID09IFNFR01FTlRfQUJTREFUQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsdmxfc2VnW2ldID0gbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIERlbHRhIFZhbHVlICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbHZsX3NlZ1tpXSA9IGRlZmF1bHRfZmlsdF9sdmwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVtpXTsKKyAgICAgICAgICAgICAgICBsdmxfc2VnW2ldID0gKGx2bF9zZWdbaV0gPiAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAoKGx2bF9zZWdbaV0gPiA2MykgPyA2MzogbHZsX3NlZ1tpXSkgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnM7IHBhcnRpYWwgaW1hZ2Ugc3RhcnRzIGF0IH5taWRkbGUgb2YgZnJhbWUgKi8KKyAgICB5X3B0ciA9IHBvc3QtPnlfYnVmZmVyICsgKChwb3N0LT55X2hlaWdodCA+PiA1KSAqIDE2KSAqIHBvc3QtPnlfc3RyaWRlOworICAgIG1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pICsgKHBvc3QtPnlfaGVpZ2h0ID4+IDUpICogKG1iX2NvbHMgKyAxKTsKKworICAgIC8qIHZwOF9maWx0ZXIgZWFjaCBtYWNybyBibG9jayAqLworICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93PChsaW5lc3RvY29weSA+PiA0KTsgbWJfcm93KyspCisgICAgeworICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IG1iX2NvbHM7IG1iX2NvbCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2tpcF9sZiA9IChtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKTsKKworICAgICAgICAgICAgaWYgKGFsdF9mbHRfZW5hYmxlZCkKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgPSBsdmxfc2VnW21vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWRdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbHRlcl9sZXZlbCA9IGRlZmF1bHRfZmlsdF9sdmw7CisKKyAgICAgICAgICAgIGlmIChmaWx0ZXJfbGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNtLT5maWx0ZXJfdHlwZSA9PSBOT1JNQUxfTE9PUEZJTFRFUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBoZXZfaW5kZXggPSBsZmlfbi0+aGV2X3Rocl9sdXRbZnJhbWVfdHlwZV1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgICAgICAgICAgbGZpLm1ibGltID0gbGZpX24tPm1ibGltW2ZpbHRlcl9sZXZlbF07CisgICAgICAgICAgICAgICAgICAgIGxmaS5ibGltID0gbGZpX24tPmJsaW1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgICAgICAgICAgbGZpLmxpbSA9IGxmaV9uLT5saW1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgICAgICAgICAgbGZpLmhldl90aHIgPSBsZmlfbi0+aGV2X3RocltoZXZfaW5kZXhdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl9jb2wgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX21idgorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCAwLCAwLCBwb3N0LT55X3N0cmlkZSwgMCwgJmxmaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2J2CisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIDAsIDAsIHBvc3QtPnlfc3RyaWRlLCAwLCAmbGZpKTsKKworICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbWJoCisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIDAsIDAsIHBvc3QtPnlfc3RyaWRlLCAwLCAmbGZpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgMCwgMCwgcG9zdC0+eV9zdHJpZGUsIDAsICZsZmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJ2CisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIHBvc3QtPnlfc3RyaWRlLCBsZmlfbi0+bWJsaW1bZmlsdGVyX2xldmVsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9idgorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyLCBwb3N0LT55X3N0cmlkZSwgbGZpX24tPmJsaW1bZmlsdGVyX2xldmVsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0ciwgcG9zdC0+eV9zdHJpZGUsIGxmaV9uLT5tYmxpbVtmaWx0ZXJfbGV2ZWxdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2JoCisgICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIsIHBvc3QtPnlfc3RyaWRlLCBsZmlfbi0+YmxpbVtmaWx0ZXJfbGV2ZWxdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHlfcHRyICs9IDE2OworICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQgKz0gMTsgICAgICAvKiBzdGVwIHRvIG5leHQgTUIgKi8KKyAgICAgICAgfQorCisgICAgICAgIHlfcHRyICs9IHBvc3QtPnlfc3RyaWRlICAqIDE2IC0gcG9zdC0+eV93aWR0aDsKKyAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQgKz0gMTsgICAgICAgICAgLyogU2tpcCBib3JkZXIgbWIgKi8KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9sb29wZmlsdGVyLmggYi9saWJ2cHgvdnA4L2NvbW1vbi9sb29wZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhZjJkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2xvb3BmaWx0ZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgbG9vcGZpbHRlcl9oCisjZGVmaW5lIGxvb3BmaWx0ZXJfaAorCisjaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorCisjZGVmaW5lIE1BWF9MT09QX0ZJTFRFUiAgICAgICAgICAgICA2MworLyogZnJhY3Rpb24gb2YgdG90YWwgbWFjcm9ibG9jayByb3dzIHRvIGJlIHVzZWQgaW4gZmFzdCBmaWx0ZXIgbGV2ZWwgcGlja2luZyAqLworLyogaGFzIHRvIGJlID4gMiAqLworI2RlZmluZSBQQVJUSUFMX0ZSQU1FX0ZSQUNUSU9OICAgICAgOAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBOT1JNQUxfTE9PUEZJTFRFUiA9IDAsCisgICAgU0lNUExFX0xPT1BGSUxURVIgPSAxCit9IExPT1BGSUxURVJUWVBFOworCisjaWYgQVJDSF9BUk0KKyNkZWZpbmUgU0lNRF9XSURUSCAxCisjZWxzZQorI2RlZmluZSBTSU1EX1dJRFRIIDE2CisjZW5kaWYKKworLyogTmVlZCB0byBhbGlnbiB0aGlzIHN0cnVjdHVyZSBzbyB3aGVuIGl0IGlzIGRlY2xhcmVkIGFuZAorICogcGFzc2VkIGl0IGNhbiBiZSBsb2FkZWQgaW50byB2ZWN0b3IgcmVnaXN0ZXJzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIERFQ0xBUkVfQUxJR05FRChTSU1EX1dJRFRILCB1bnNpZ25lZCBjaGFyLCBtYmxpbVtNQVhfTE9PUF9GSUxURVIgKyAxXVtTSU1EX1dJRFRIXSk7CisgICAgREVDTEFSRV9BTElHTkVEKFNJTURfV0lEVEgsIHVuc2lnbmVkIGNoYXIsIGJsaW1bTUFYX0xPT1BfRklMVEVSICsgMV1bU0lNRF9XSURUSF0pOworICAgIERFQ0xBUkVfQUxJR05FRChTSU1EX1dJRFRILCB1bnNpZ25lZCBjaGFyLCBsaW1bTUFYX0xPT1BfRklMVEVSICsgMV1bU0lNRF9XSURUSF0pOworICAgIERFQ0xBUkVfQUxJR05FRChTSU1EX1dJRFRILCB1bnNpZ25lZCBjaGFyLCBoZXZfdGhyWzRdW1NJTURfV0lEVEhdKTsKKyAgICB1bnNpZ25lZCBjaGFyIGx2bFs0XVs0XVs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGhldl90aHJfbHV0WzJdW01BWF9MT09QX0ZJTFRFUiArIDFdOworICAgIHVuc2lnbmVkIGNoYXIgbW9kZV9sZl9sdXRbMTBdOworfSBsb29wX2ZpbHRlcl9pbmZvX247CisKK3R5cGVkZWYgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8KK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogbWJsaW07CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGJsaW07CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGxpbTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogaGV2X3RocjsKK30gbG9vcF9maWx0ZXJfaW5mbzsKKworCit0eXBlZGVmIHZvaWQgbG9vcF9maWx0ZXJfdXZmdW5jdGlvbgorKAorICAgIHVuc2lnbmVkIGNoYXIgKnUsICAgLyogc291cmNlIHBvaW50ZXIgKi8KKyAgICBpbnQgcCwgICAgICAgICAgICAgIC8qIHBpdGNoICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbWl0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRocmVzaCwKKyAgICB1bnNpZ25lZCBjaGFyICp2CispOworCisvKiBhc3NvcnRlZCBsb29wZmlsdGVyIGZ1bmN0aW9ucyB3aGljaCBnZXQgdXNlZCBlbHNld2hlcmUgKi8KK3N0cnVjdCBWUDhDb21tb247CitzdHJ1Y3QgbWFjcm9ibG9ja2Q7CitzdHJ1Y3QgbW9kZWluZm87CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2luaXQoc3RydWN0IFZQOENvbW1vbiAqY20pOworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9mcmFtZV9pbml0KHN0cnVjdCBWUDhDb21tb24gKmNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWFjcm9ibG9ja2QgKm1iZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfZmlsdF9sdmwpOworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgVlA4Q29tbW9uICpjbSwgc3RydWN0IG1hY3JvYmxvY2tkICptYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfdHlwZSk7CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3BhcnRpYWxfZnJhbWUoc3RydWN0IFZQOENvbW1vbiAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtYWNyb2Jsb2NrZCAqbWJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF9maWx0X2x2bCk7CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX3lvbmx5KHN0cnVjdCBWUDhDb21tb24gKmNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1hY3JvYmxvY2tkICptYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF9maWx0X2x2bCk7CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3VwZGF0ZV9zaGFycG5lc3MobG9vcF9maWx0ZXJfaW5mb19uICpsZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFycG5lc3NfbHZsKTsKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfcm93X25vcm1hbChzdHJ1Y3QgVlA4Q29tbW9uICpjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZGVpbmZvICptb2RlX2luZm9fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3JvdywgaW50IHBvc3RfeXN0cmlkZSwgaW50IHBvc3RfdXZzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdl9wdHIpOworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9yb3dfc2ltcGxlKHN0cnVjdCBWUDhDb21tb24gKmNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbW9kZWluZm8gKm1vZGVfaW5mb19jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LCBpbnQgcG9zdF95c3RyaWRlLCBpbnQgcG9zdF91dnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2X3B0cik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jIGIvbGlidnB4L3ZwOC9jb21tb24vbG9vcGZpbHRlcl9maWx0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzNWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxvb3BmaWx0ZXIuaCIKKyNpbmNsdWRlICJvbnl4Y19pbnQuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjOworCitzdGF0aWMgc2lnbmVkIGNoYXIgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKGludCB0KQoreworICAgIHQgPSAodCA8IC0xMjggPyAtMTI4IDogdCk7CisgICAgdCA9ICh0ID4gMTI3ID8gMTI3IDogdCk7CisgICAgcmV0dXJuIChzaWduZWQgY2hhcikgdDsKK30KKworCisvKiBzaG91bGQgd2UgYXBwbHkgYW55IGZpbHRlciBhdCBhbGwgKCAxMTExMTExMSB5ZXMsIDAwMDAwMDAwIG5vKSAqLworc3RhdGljIHNpZ25lZCBjaGFyIHZwOF9maWx0ZXJfbWFzayh1YyBsaW1pdCwgdWMgYmxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjIHAzLCB1YyBwMiwgdWMgcDEsIHVjIHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjIHEwLCB1YyBxMSwgdWMgcTIsIHVjIHEzKQoreworICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAwOworICAgIG1hc2sgfD0gKGFicyhwMyAtIHAyKSA+IGxpbWl0KTsKKyAgICBtYXNrIHw9IChhYnMocDIgLSBwMSkgPiBsaW1pdCk7CisgICAgbWFzayB8PSAoYWJzKHAxIC0gcDApID4gbGltaXQpOworICAgIG1hc2sgfD0gKGFicyhxMSAtIHEwKSA+IGxpbWl0KTsKKyAgICBtYXNrIHw9IChhYnMocTIgLSBxMSkgPiBsaW1pdCk7CisgICAgbWFzayB8PSAoYWJzKHEzIC0gcTIpID4gbGltaXQpOworICAgIG1hc2sgfD0gKGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICA+IGJsaW1pdCk7CisgICAgcmV0dXJuIG1hc2sgLSAxOworfQorCisvKiBpcyB0aGVyZSBoaWdoIHZhcmlhbmNlIGludGVybmFsIGVkZ2UgKCAxMTExMTExMSB5ZXMsIDAwMDAwMDAwIG5vKSAqLworc3RhdGljIHNpZ25lZCBjaGFyIHZwOF9oZXZtYXNrKHVjIHRocmVzaCwgdWMgcDEsIHVjIHAwLCB1YyBxMCwgdWMgcTEpCit7CisgICAgc2lnbmVkIGNoYXIgaGV2ID0gMDsKKyAgICBoZXYgIHw9IChhYnMocDEgLSBwMCkgPiB0aHJlc2gpICogLTE7CisgICAgaGV2ICB8PSAoYWJzKHExIC0gcTApID4gdGhyZXNoKSAqIC0xOworICAgIHJldHVybiBoZXY7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9maWx0ZXIoc2lnbmVkIGNoYXIgbWFzaywgdWMgaGV2LCB1YyAqb3AxLAorICAgICAgICB1YyAqb3AwLCB1YyAqb3EwLCB1YyAqb3ExKQorCit7CisgICAgc2lnbmVkIGNoYXIgcHMwLCBxczA7CisgICAgc2lnbmVkIGNoYXIgcHMxLCBxczE7CisgICAgc2lnbmVkIGNoYXIgdnA4X2ZpbHRlciwgRmlsdGVyMSwgRmlsdGVyMjsKKyAgICBzaWduZWQgY2hhciB1OworCisgICAgcHMxID0gKHNpZ25lZCBjaGFyKSAqIG9wMSBeIDB4ODA7CisgICAgcHMwID0gKHNpZ25lZCBjaGFyKSAqIG9wMCBeIDB4ODA7CisgICAgcXMwID0gKHNpZ25lZCBjaGFyKSAqIG9xMCBeIDB4ODA7CisgICAgcXMxID0gKHNpZ25lZCBjaGFyKSAqIG9xMSBeIDB4ODA7CisKKyAgICAvKiBhZGQgb3V0ZXIgdGFwcyBpZiB3ZSBoYXZlIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLworICAgIHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxIC0gcXMxKTsKKyAgICB2cDhfZmlsdGVyICY9IGhldjsKKworICAgIC8qIGlubmVyIHRhcHMgKi8KKyAgICB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzICogKHFzMCAtIHBzMCkpOworICAgIHZwOF9maWx0ZXIgJj0gbWFzazsKKworICAgIC8qIHNhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMKKyAgICAgKiBpZiBpdCBlcXVhbHMgNCB3ZSdsbCBzZXQgdG8gYWRqdXN0IGJ5IC0xIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0CisgICAgICogd2UnZCByb3VuZCAzIHRoZSBvdGhlciB3YXkKKyAgICAgKi8KKyAgICBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyA0KTsKKyAgICBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzKTsKKyAgICBGaWx0ZXIxID4+PSAzOworICAgIEZpbHRlcjIgPj49IDM7CisgICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSBGaWx0ZXIxKTsKKyAgICAqb3EwID0gdSBeIDB4ODA7CisgICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKTsKKyAgICAqb3AwID0gdSBeIDB4ODA7CisgICAgdnA4X2ZpbHRlciA9IEZpbHRlcjE7CisKKyAgICAvKiBvdXRlciB0YXAgYWRqdXN0bWVudHMgKi8KKyAgICB2cDhfZmlsdGVyICs9IDE7CisgICAgdnA4X2ZpbHRlciA+Pj0gMTsKKyAgICB2cDhfZmlsdGVyICY9IH5oZXY7CisKKyAgICB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHZwOF9maWx0ZXIpOworICAgICpvcTEgPSB1IF4gMHg4MDsKKyAgICB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSArIHZwOF9maWx0ZXIpOworICAgICpvcDEgPSB1IF4gMHg4MDsKKworfQordm9pZCB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzLAorICAgIGludCBwLCAvKiBwaXRjaCAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW1pdCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0aHJlc2gsCisgICAgaW50IGNvdW50CispCit7CisgICAgaW50ICBoZXYgPSAwOyAvKiBoaWdoIGVkZ2UgdmFyaWFuY2UgKi8KKyAgICBzaWduZWQgY2hhciBtYXNrID0gMDsKKyAgICBpbnQgaSA9IDA7CisKKyAgICAvKiBsb29wIGZpbHRlciBkZXNpZ25lZCB0byB3b3JrIHVzaW5nIGNoYXJzIHNvIHRoYXQgd2UgY2FuIG1ha2UgbWF4aW11bSB1c2UKKyAgICAgKiBvZiA4IGJpdCBzaW1kIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgbWFzayA9IHZwOF9maWx0ZXJfbWFzayhsaW1pdFswXSwgYmxpbWl0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbLTQqcF0sIHNbLTMqcF0sIHNbLTIqcF0sIHNbLTEqcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1swKnBdLCBzWzEqcF0sIHNbMipwXSwgc1szKnBdKTsKKworICAgICAgICBoZXYgPSB2cDhfaGV2bWFzayh0aHJlc2hbMF0sIHNbLTIqcF0sIHNbLTEqcF0sIHNbMCpwXSwgc1sxKnBdKTsKKworICAgICAgICB2cDhfZmlsdGVyKG1hc2ssIGhldiwgcyAtIDIgKiBwLCBzIC0gMSAqIHAsIHMsIHMgKyAxICogcCk7CisKKyAgICAgICAgKytzOworICAgIH0KKyAgICB3aGlsZSAoKytpIDwgY291bnQgKiA4KTsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIGludCAgaGV2ID0gMDsgLyogaGlnaCBlZGdlIHZhcmlhbmNlICovCisgICAgc2lnbmVkIGNoYXIgbWFzayA9IDA7CisgICAgaW50IGkgPSAwOworCisgICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCisgICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCisgICAgICovCisgICAgZG8KKyAgICB7CisgICAgICAgIG1hc2sgPSB2cDhfZmlsdGVyX21hc2sobGltaXRbMF0sIGJsaW1pdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWy00XSwgc1stM10sIHNbLTJdLCBzWy0xXSwgc1swXSwgc1sxXSwgc1syXSwgc1szXSk7CisKKyAgICAgICAgaGV2ID0gdnA4X2hldm1hc2sodGhyZXNoWzBdLCBzWy0yXSwgc1stMV0sIHNbMF0sIHNbMV0pOworCisgICAgICAgIHZwOF9maWx0ZXIobWFzaywgaGV2LCBzIC0gMiwgcyAtIDEsIHMsIHMgKyAxKTsKKworICAgICAgICBzICs9IHA7CisgICAgfQorICAgIHdoaWxlICgrK2kgPCBjb3VudCAqIDgpOworfQorCitzdGF0aWMgdm9pZCB2cDhfbWJmaWx0ZXIoc2lnbmVkIGNoYXIgbWFzaywgdWMgaGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWMgKm9wMiwgdWMgKm9wMSwgdWMgKm9wMCwgdWMgKm9xMCwgdWMgKm9xMSwgdWMgKm9xMikKK3sKKyAgICBzaWduZWQgY2hhciBzLCB1OworICAgIHNpZ25lZCBjaGFyIHZwOF9maWx0ZXIsIEZpbHRlcjEsIEZpbHRlcjI7CisgICAgc2lnbmVkIGNoYXIgcHMyID0gKHNpZ25lZCBjaGFyKSAqIG9wMiBeIDB4ODA7CisgICAgc2lnbmVkIGNoYXIgcHMxID0gKHNpZ25lZCBjaGFyKSAqIG9wMSBeIDB4ODA7CisgICAgc2lnbmVkIGNoYXIgcHMwID0gKHNpZ25lZCBjaGFyKSAqIG9wMCBeIDB4ODA7CisgICAgc2lnbmVkIGNoYXIgcXMwID0gKHNpZ25lZCBjaGFyKSAqIG9xMCBeIDB4ODA7CisgICAgc2lnbmVkIGNoYXIgcXMxID0gKHNpZ25lZCBjaGFyKSAqIG9xMSBeIDB4ODA7CisgICAgc2lnbmVkIGNoYXIgcXMyID0gKHNpZ25lZCBjaGFyKSAqIG9xMiBeIDB4ODA7CisKKyAgICAvKiBhZGQgb3V0ZXIgdGFwcyBpZiB3ZSBoYXZlIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLworICAgIHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxIC0gcXMxKTsKKyAgICB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzICogKHFzMCAtIHBzMCkpOworICAgIHZwOF9maWx0ZXIgJj0gbWFzazsKKworICAgIEZpbHRlcjIgPSB2cDhfZmlsdGVyOworICAgIEZpbHRlcjIgJj0gaGV2OworCisgICAgLyogc2F2ZSBib3R0b20gMyBiaXRzIHNvIHRoYXQgd2Ugcm91bmQgb25lIHNpZGUgKzQgYW5kIHRoZSBvdGhlciArMyAqLworICAgIEZpbHRlcjEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiArIDQpOworICAgIEZpbHRlcjIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiArIDMpOworICAgIEZpbHRlcjEgPj49IDM7CisgICAgRmlsdGVyMiA+Pj0gMzsKKyAgICBxczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSk7CisgICAgcHMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIEZpbHRlcjIpOworCisKKyAgICAvKiBvbmx5IGFwcGx5IHdpZGVyIGZpbHRlciBpZiBub3QgaGlnaCBlZGdlIHZhcmlhbmNlICovCisgICAgdnA4X2ZpbHRlciAmPSB+aGV2OworICAgIEZpbHRlcjIgPSB2cDhfZmlsdGVyOworCisgICAgLyogcm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeSAqLworICAgIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDI3KSA+PiA3KTsKKyAgICBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpOworICAgICpvcTAgPSBzIF4gMHg4MDsKKyAgICBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIHUpOworICAgICpvcDAgPSBzIF4gMHg4MDsKKworICAgIC8qIHJvdWdobHkgMi83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkgKi8KKyAgICB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAxOCkgPj4gNyk7CisgICAgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB1KTsKKyAgICAqb3ExID0gcyBeIDB4ODA7CisgICAgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB1KTsKKyAgICAqb3AxID0gcyBeIDB4ODA7CisKKyAgICAvKiByb3VnaGx5IDEvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5ICovCisgICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogOSkgPj4gNyk7CisgICAgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczIgLSB1KTsKKyAgICAqb3EyID0gcyBeIDB4ODA7CisgICAgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgKyB1KTsKKyAgICAqb3AyID0gcyBeIDB4ODA7Cit9CisKK3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzLAorICAgIGludCBwLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW1pdCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0aHJlc2gsCisgICAgaW50IGNvdW50CispCit7CisgICAgc2lnbmVkIGNoYXIgaGV2ID0gMDsgLyogaGlnaCBlZGdlIHZhcmlhbmNlICovCisgICAgc2lnbmVkIGNoYXIgbWFzayA9IDA7CisgICAgaW50IGkgPSAwOworCisgICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCisgICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCisgICAgICovCisgICAgZG8KKyAgICB7CisKKyAgICAgICAgbWFzayA9IHZwOF9maWx0ZXJfbWFzayhsaW1pdFswXSwgYmxpbWl0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbLTQqcF0sIHNbLTMqcF0sIHNbLTIqcF0sIHNbLTEqcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1swKnBdLCBzWzEqcF0sIHNbMipwXSwgc1szKnBdKTsKKworICAgICAgICBoZXYgPSB2cDhfaGV2bWFzayh0aHJlc2hbMF0sIHNbLTIqcF0sIHNbLTEqcF0sIHNbMCpwXSwgc1sxKnBdKTsKKworICAgICAgICB2cDhfbWJmaWx0ZXIobWFzaywgaGV2LCBzIC0gMyAqIHAsIHMgLSAyICogcCwgcyAtIDEgKiBwLCBzLCBzICsgMSAqIHAsIHMgKyAyICogcCk7CisKKyAgICAgICAgKytzOworICAgIH0KKyAgICB3aGlsZSAoKytpIDwgY291bnQgKiA4KTsKKworfQorCisKK3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIHNpZ25lZCBjaGFyIGhldiA9IDA7IC8qIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLworICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAwOworICAgIGludCBpID0gMDsKKworICAgIGRvCisgICAgeworCisgICAgICAgIG1hc2sgPSB2cDhfZmlsdGVyX21hc2sobGltaXRbMF0sIGJsaW1pdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWy00XSwgc1stM10sIHNbLTJdLCBzWy0xXSwgc1swXSwgc1sxXSwgc1syXSwgc1szXSk7CisKKyAgICAgICAgaGV2ID0gdnA4X2hldm1hc2sodGhyZXNoWzBdLCBzWy0yXSwgc1stMV0sIHNbMF0sIHNbMV0pOworCisgICAgICAgIHZwOF9tYmZpbHRlcihtYXNrLCBoZXYsIHMgLSAzLCBzIC0gMiwgcyAtIDEsIHMsIHMgKyAxLCBzICsgMik7CisKKyAgICAgICAgcyArPSBwOworICAgIH0KKyAgICB3aGlsZSAoKytpIDwgY291bnQgKiA4KTsKKworfQorCisvKiBzaG91bGQgd2UgYXBwbHkgYW55IGZpbHRlciBhdCBhbGwgKCAxMTExMTExMSB5ZXMsIDAwMDAwMDAwIG5vKSAqLworc3RhdGljIHNpZ25lZCBjaGFyIHZwOF9zaW1wbGVfZmlsdGVyX21hc2sodWMgYmxpbWl0LCB1YyBwMSwgdWMgcDAsIHVjIHEwLCB1YyBxMSkKK3sKKy8qIFdoeSBkb2VzIHRoaXMgY2F1c2UgcHJvYmxlbXMgZm9yIHdpbjMyPworICogZXJyb3IgQzIxNDM6IHN5bnRheCBlcnJvciA6IG1pc3NpbmcgJzsnIGJlZm9yZSAndHlwZScKKyAqICAodm9pZCkgbGltaXQ7CisgKi8KKyAgICBzaWduZWQgY2hhciBtYXNrID0gKGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICA8PSBibGltaXQpICogLTE7CisgICAgcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9zaW1wbGVfZmlsdGVyKHNpZ25lZCBjaGFyIG1hc2ssIHVjICpvcDEsIHVjICpvcDAsIHVjICpvcTAsIHVjICpvcTEpCit7CisgICAgc2lnbmVkIGNoYXIgdnA4X2ZpbHRlciwgRmlsdGVyMSwgRmlsdGVyMjsKKyAgICBzaWduZWQgY2hhciBwMSA9IChzaWduZWQgY2hhcikgKiBvcDEgXiAweDgwOworICAgIHNpZ25lZCBjaGFyIHAwID0gKHNpZ25lZCBjaGFyKSAqIG9wMCBeIDB4ODA7CisgICAgc2lnbmVkIGNoYXIgcTAgPSAoc2lnbmVkIGNoYXIpICogb3EwIF4gMHg4MDsKKyAgICBzaWduZWQgY2hhciBxMSA9IChzaWduZWQgY2hhcikgKiBvcTEgXiAweDgwOworICAgIHNpZ25lZCBjaGFyIHU7CisKKyAgICB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHAxIC0gcTEpOworICAgIHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAocTAgLSBwMCkpOworICAgIHZwOF9maWx0ZXIgJj0gbWFzazsKKworICAgIC8qIHNhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMgKi8KKyAgICBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyA0KTsKKyAgICBGaWx0ZXIxID4+PSAzOworICAgIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocTAgLSBGaWx0ZXIxKTsKKyAgICAqb3EwICA9IHUgXiAweDgwOworCisgICAgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyk7CisgICAgRmlsdGVyMiA+Pj0gMzsKKyAgICB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHAwICsgRmlsdGVyMik7CisgICAgKm9wMCA9IHUgXiAweDgwOworfQorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzLAorICAgIGludCBwLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdAorKQoreworICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAwOworICAgIGludCBpID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBtYXNrID0gdnA4X3NpbXBsZV9maWx0ZXJfbWFzayhibGltaXRbMF0sIHNbLTIqcF0sIHNbLTEqcF0sIHNbMCpwXSwgc1sxKnBdKTsKKyAgICAgICAgdnA4X3NpbXBsZV9maWx0ZXIobWFzaywgcyAtIDIgKiBwLCBzIC0gMSAqIHAsIHMsIHMgKyAxICogcCk7CisgICAgICAgICsrczsKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IDE2KTsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYworKAorICAgIHVuc2lnbmVkIGNoYXIgKnMsCisgICAgaW50IHAsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0CispCit7CisgICAgc2lnbmVkIGNoYXIgbWFzayA9IDA7CisgICAgaW50IGkgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIG1hc2sgPSB2cDhfc2ltcGxlX2ZpbHRlcl9tYXNrKGJsaW1pdFswXSwgc1stMl0sIHNbLTFdLCBzWzBdLCBzWzFdKTsKKyAgICAgICAgdnA4X3NpbXBsZV9maWx0ZXIobWFzaywgcyAtIDIsIHMgLSAxLCBzLCBzICsgMSk7CisgICAgICAgIHMgKz0gcDsKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IDE2KTsKKworfQorCisvKiBIb3Jpem9udGFsIE1CIGZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdl9wdHIsIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworCisgICAgaWYgKHVfcHRyKQorICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKKworICAgIGlmICh2X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2Modl9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMSk7Cit9CisKKy8qIFZlcnRpY2FsIE1CIEZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X2ModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdl9wdHIsIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKHVfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDEpOworCisgICAgaWYgKHZfcHRyKQorICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2Modl9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMSk7Cit9CisKKy8qIEhvcml6b250YWwgQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2X3B0ciwgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jKHlfcHRyICsgNCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2MoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworCisgICAgaWYgKHVfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2ModV9wdHIgKyA0ICogdXZfc3RyaWRlLCB1dl9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMSk7CisKKyAgICBpZiAodl9wdHIpCisgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh2X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhzX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIGludCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCkKK3sKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9jKHlfcHRyICsgNCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgYmxpbWl0KTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9jKHlfcHRyICsgOCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgYmxpbWl0KTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9jKHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGJsaW1pdCk7Cit9CisKKy8qIFZlcnRpY2FsIEIgRmlsdGVyaW5nICovCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idl9jKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdl9wdHIsIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIgKyA0LCB5X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKHlfcHRyICsgOCwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYyh5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYyh1X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKKworICAgIGlmICh2X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYyh2X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIGludCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCkKK3sKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYyh5X3B0ciArIDQsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jKHlfcHRyICsgOCwgeV9zdHJpZGUsIGJsaW1pdCk7CisgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGJsaW1pdCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9tYnBpdGNoLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9tYnBpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlMWI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL21icGl0Y2guYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgImJsb2NrZC5oIgorCit2b2lkIHZwOF9zZXR1cF9ibG9ja19kcHRycyhNQUNST0JMT0NLRCAqeCkKK3sKKyAgICBpbnQgciwgYzsKKworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICB4LT5ibG9ja1tyKjQrY10ucHJlZGljdG9yID0geC0+cHJlZGljdG9yICsgciAqIDQgKiAxNiArIGMgKiA0OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChyID0gMDsgciA8IDI7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmJsb2NrWzE2K3IqMitjXS5wcmVkaWN0b3IgPSB4LT5wcmVkaWN0b3IgKyAyNTYgKyByICogNCAqIDggKyBjICogNDsKKworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChyID0gMDsgciA8IDI7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmJsb2NrWzIwK3IqMitjXS5wcmVkaWN0b3IgPSB4LT5wcmVkaWN0b3IgKyAzMjAgKyByICogNCAqIDggKyBjICogNDsKKworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChyID0gMDsgciA8IDI1OyByKyspCisgICAgeworICAgICAgICB4LT5ibG9ja1tyXS5xY29lZmYgID0geC0+cWNvZWZmICArIHIgKiAxNjsKKyAgICAgICAgeC0+YmxvY2tbcl0uZHFjb2VmZiA9IHgtPmRxY29lZmYgKyByICogMTY7CisgICAgICAgIHgtPmJsb2NrW3JdLmVvYiAgICAgPSB4LT5lb2JzICsgcjsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2J1aWxkX2Jsb2NrX2RvZmZzZXRzKE1BQ1JPQkxPQ0tEICp4KQoreworICAgIGludCBibG9jazsKKworICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDE2OyBibG9jaysrKSAvKiB5IGJsb2NrcyAqLworICAgIHsKKyAgICAgICAgeC0+YmxvY2tbYmxvY2tdLm9mZnNldCA9CisgICAgICAgICAgICAoYmxvY2sgPj4gMikgKiA0ICogeC0+ZHN0Lnlfc3RyaWRlICsgKGJsb2NrICYgMykgKiA0OworICAgIH0KKworICAgIGZvciAoYmxvY2sgPSAxNjsgYmxvY2sgPCAyMDsgYmxvY2srKykgLyogVSBhbmQgViBibG9ja3MgKi8KKyAgICB7CisgICAgICAgIHgtPmJsb2NrW2Jsb2NrKzRdLm9mZnNldCA9CisgICAgICAgIHgtPmJsb2NrW2Jsb2NrXS5vZmZzZXQgPQorICAgICAgICAgICAgKChibG9jayAtIDE2KSA+PiAxKSAqIDQgKiB4LT5kc3QudXZfc3RyaWRlICsgKGJsb2NrICYgMSkgKiA0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL21mcWUuYyBiL2xpYnZweC92cDgvY29tbW9uL21mcWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZmMTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vbWZxZS5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyogTUZRRTogTXVsdGlmcmFtZSBRdWFsaXR5IEVuaGFuY2VtZW50CisgKiBJbiByYXRlIGxpbWl0ZWQgc2l0dWF0aW9ucyBrZXlmcmFtZXMgbWF5IGNhdXNlIHNpZ25pZmljYW50IHZpc3VhbCBhcnRpZmFjdHMKKyAqIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzICJwb3BwaW5nLiIgVGhpcyBmaWxlIGltcGxlbWVudHMgYSBwb3N0cHJvY2Nlc2luZworICogYWxnb3JpdGhtIHdoaWNoIGJsZW5kcyBkYXRhIGZyb20gdGhlIHByZWNlZWRpbmcgZnJhbWUgd2hlbiB0aGVyZSBpcyBubworICogbW90aW9uIGFuZCB0aGUgcSBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSBpcyBsb3dlciB3aGljaCBpbmRpY2F0ZXMgdGhhdCBpdCBpcworICogaGlnaGVyIHF1YWxpdHkuCisgKi8KKworI2luY2x1ZGUgInBvc3Rwcm9jLmgiCisjaW5jbHVkZSAidmFyaWFuY2UuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQgZmlsdGVyX2J5X3dlaWdodCh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSwgaW50IHNyY193ZWlnaHQpCit7CisgICAgaW50IGRzdF93ZWlnaHQgPSAoMSA8PCBNRlFFX1BSRUNJU0lPTikgLSBzcmNfd2VpZ2h0OworICAgIGludCByb3VuZGluZ19iaXQgPSAxIDw8IChNRlFFX1BSRUNJU0lPTiAtIDEpOworICAgIGludCByLCBjOworCisgICAgZm9yIChyID0gMDsgciA8IGJsb2NrX3NpemU7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBibG9ja19zaXplOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtjXSA9IChzcmNbY10gKiBzcmNfd2VpZ2h0ICsKKyAgICAgICAgICAgICAgICAgICAgICBkc3RbY10gKiBkc3Rfd2VpZ2h0ICsKKyAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ19iaXQpID4+IE1GUUVfUFJFQ0lTSU9OOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2ZpbHRlcl9ieV93ZWlnaHQxNngxNl9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193ZWlnaHQpCit7CisgICAgZmlsdGVyX2J5X3dlaWdodChzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgMTYsIHNyY193ZWlnaHQpOworfQorCit2b2lkIHZwOF9maWx0ZXJfYnlfd2VpZ2h0OHg4X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2VpZ2h0KQoreworICAgIGZpbHRlcl9ieV93ZWlnaHQoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIDgsIHNyY193ZWlnaHQpOworfQorCit2b2lkIHZwOF9maWx0ZXJfYnlfd2VpZ2h0NHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2VpZ2h0KQoreworICAgIGZpbHRlcl9ieV93ZWlnaHQoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIDQsIHNyY193ZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9pZmFjdG9yKHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp5X2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZfc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdV9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZfZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2VpZ2h0KQoreworICAgIGlmIChibG9ja19zaXplID09IDE2KQorICAgIHsKKyAgICAgICAgdnA4X2ZpbHRlcl9ieV93ZWlnaHQxNngxNih5X3NyYywgeV9zcmNfc3RyaWRlLCB5X2RzdCwgeV9kc3Rfc3RyaWRlLCBzcmNfd2VpZ2h0KTsKKyAgICAgICAgdnA4X2ZpbHRlcl9ieV93ZWlnaHQ4eDgodV9zcmMsIHV2X3NyY19zdHJpZGUsIHVfZHN0LCB1dl9kc3Rfc3RyaWRlLCBzcmNfd2VpZ2h0KTsKKyAgICAgICAgdnA4X2ZpbHRlcl9ieV93ZWlnaHQ4eDgodl9zcmMsIHV2X3NyY19zdHJpZGUsIHZfZHN0LCB1dl9kc3Rfc3RyaWRlLCBzcmNfd2VpZ2h0KTsKKyAgICB9CisgICAgZWxzZSAvKiBpZiAoYmxvY2tfc2l6ZSA9PSA4KSAqLworICAgIHsKKyAgICAgICAgdnA4X2ZpbHRlcl9ieV93ZWlnaHQ4eDgoeV9zcmMsIHlfc3JjX3N0cmlkZSwgeV9kc3QsIHlfZHN0X3N0cmlkZSwgc3JjX3dlaWdodCk7CisgICAgICAgIHZwOF9maWx0ZXJfYnlfd2VpZ2h0NHg0KHVfc3JjLCB1dl9zcmNfc3RyaWRlLCB1X2RzdCwgdXZfZHN0X3N0cmlkZSwgc3JjX3dlaWdodCk7CisgICAgICAgIHZwOF9maWx0ZXJfYnlfd2VpZ2h0NHg0KHZfc3JjLCB1dl9zcmNfc3RyaWRlLCB2X2RzdCwgdXZfZHN0X3N0cmlkZSwgc3JjX3dlaWdodCk7CisgICAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGludF9zcXJ0KHVuc2lnbmVkIGludCB4KQoreworICAgIHVuc2lnbmVkIGludCB5ID0geDsKKyAgICB1bnNpZ25lZCBpbnQgZ3Vlc3M7CisgICAgaW50IHAgPSAxOworICAgIHdoaWxlICh5Pj49MSkgcCsrOworICAgIHA+Pj0xOworCisgICAgZ3Vlc3M9MDsKKyAgICB3aGlsZSAocD49MCkKKyAgICB7CisgICAgICAgIGd1ZXNzIHw9ICgxPDxwKTsKKyAgICAgICAgaWYgKHg8Z3Vlc3MqZ3Vlc3MpCisgICAgICAgICAgICBndWVzcyAtPSAoMTw8cCk7CisgICAgICAgIHAtLTsKKyAgICB9CisgICAgLyogY2hvb3NlIGJldHdlZW4gZ3Vlc3Mgb3IgZ3Vlc3MrMSAqLworICAgIHJldHVybiBndWVzcysoZ3Vlc3MqZ3Vlc3MrZ3Vlc3MrMTw9eCk7Cit9CisKKyNkZWZpbmUgVVNFX1NTRAorc3RhdGljIHZvaWQgbXVsdGlmcmFtZV9xdWFsaXR5X2VuaGFuY2VfYmxvY2sKKygKKyAgICBpbnQgYmxrc2l6ZSwgLyogQ3VycmVudGx5IG9ubHkgdmFsdWVzIHN1cHBvcnRlZCBhcmUgMTYsIDggKi8KKyAgICBpbnQgcWN1cnIsCisgICAgaW50IHFwcmV2LAorICAgIHVuc2lnbmVkIGNoYXIgKnksCisgICAgdW5zaWduZWQgY2hhciAqdSwKKyAgICB1bnNpZ25lZCBjaGFyICp2LAorICAgIGludCB5X3N0cmlkZSwKKyAgICBpbnQgdXZfc3RyaWRlLAorICAgIHVuc2lnbmVkIGNoYXIgKnlkLAorICAgIHVuc2lnbmVkIGNoYXIgKnVkLAorICAgIHVuc2lnbmVkIGNoYXIgKnZkLAorICAgIGludCB5ZF9zdHJpZGUsCisgICAgaW50IHV2ZF9zdHJpZGUKKykKK3sKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBWUDhfWkVST1NbMTZdPQorICAgIHsKKyAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKyAgICB9OworICAgIGludCB1dmJsa3NpemUgPSBibGtzaXplID4+IDE7CisgICAgaW50IHFkaWZmID0gcWN1cnIgLSBxcHJldjsKKworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKnVwOworICAgIHVuc2lnbmVkIGNoYXIgKnVkcDsKKyAgICB1bnNpZ25lZCBjaGFyICp2cDsKKyAgICB1bnNpZ25lZCBjaGFyICp2ZHA7CisKKyAgICB1bnNpZ25lZCBpbnQgYWN0LCBhY3RkLCBzYWQsIHVzYWQsIHZzYWQsIHNzZSwgdGhyLCB0aHJzcSwgYWN0cmlzazsKKworICAgIGlmIChibGtzaXplID09IDE2KQorICAgIHsKKyAgICAgICAgYWN0ZCA9ICh2cDhfdmFyaWFuY2UxNngxNih5ZCwgeWRfc3RyaWRlLCBWUDhfWkVST1MsIDAsICZzc2UpKzEyOCk+Pjg7CisgICAgICAgIGFjdCA9ICh2cDhfdmFyaWFuY2UxNngxNih5LCB5X3N0cmlkZSwgVlA4X1pFUk9TLCAwLCAmc3NlKSsxMjgpPj44OworI2lmZGVmIFVTRV9TU0QKKyAgICAgICAgc2FkID0gKHZwOF92YXJpYW5jZTE2eDE2KHksIHlfc3RyaWRlLCB5ZCwgeWRfc3RyaWRlLCAmc3NlKSk7CisgICAgICAgIHNhZCA9IChzc2UgKyAxMjgpPj44OworICAgICAgICB1c2FkID0gKHZwOF92YXJpYW5jZTh4OCh1LCB1dl9zdHJpZGUsIHVkLCB1dmRfc3RyaWRlLCAmc3NlKSk7CisgICAgICAgIHVzYWQgPSAoc3NlICsgMzIpPj42OworICAgICAgICB2c2FkID0gKHZwOF92YXJpYW5jZTh4OCh2LCB1dl9zdHJpZGUsIHZkLCB1dmRfc3RyaWRlLCAmc3NlKSk7CisgICAgICAgIHZzYWQgPSAoc3NlICsgMzIpPj42OworI2Vsc2UKKyAgICAgICAgc2FkID0gKHZwOF9zYWQxNngxNih5LCB5X3N0cmlkZSwgeWQsIHlkX3N0cmlkZSwgVUlOVF9NQVgpICsgMTI4KSA+PiA4OworICAgICAgICB1c2FkID0gKHZwOF9zYWQ4eDgodSwgdXZfc3RyaWRlLCB1ZCwgdXZkX3N0cmlkZSwgVUlOVF9NQVgpICsgMzIpID4+IDY7CisgICAgICAgIHZzYWQgPSAodnA4X3NhZDh4OCh2LCB1dl9zdHJpZGUsIHZkLCB1dmRfc3RyaWRlLCBVSU5UX01BWCkrIDMyKSA+PiA2OworI2VuZGlmCisgICAgfQorICAgIGVsc2UgLyogaWYgKGJsa3NpemUgPT0gOCkgKi8KKyAgICB7CisgICAgICAgIGFjdGQgPSAodnA4X3ZhcmlhbmNlOHg4KHlkLCB5ZF9zdHJpZGUsIFZQOF9aRVJPUywgMCwgJnNzZSkrMzIpPj42OworICAgICAgICBhY3QgPSAodnA4X3ZhcmlhbmNlOHg4KHksIHlfc3RyaWRlLCBWUDhfWkVST1MsIDAsICZzc2UpKzMyKT4+NjsKKyNpZmRlZiBVU0VfU1NECisgICAgICAgIHNhZCA9ICh2cDhfdmFyaWFuY2U4eDgoeSwgeV9zdHJpZGUsIHlkLCB5ZF9zdHJpZGUsICZzc2UpKTsKKyAgICAgICAgc2FkID0gKHNzZSArIDMyKT4+NjsKKyAgICAgICAgdXNhZCA9ICh2cDhfdmFyaWFuY2U0eDQodSwgdXZfc3RyaWRlLCB1ZCwgdXZkX3N0cmlkZSwgJnNzZSkpOworICAgICAgICB1c2FkID0gKHNzZSArIDgpPj40OworICAgICAgICB2c2FkID0gKHZwOF92YXJpYW5jZTR4NCh2LCB1dl9zdHJpZGUsIHZkLCB1dmRfc3RyaWRlLCAmc3NlKSk7CisgICAgICAgIHZzYWQgPSAoc3NlICsgOCk+PjQ7CisjZWxzZQorICAgICAgICBzYWQgPSAodnA4X3NhZDh4OCh5LCB5X3N0cmlkZSwgeWQsIHlkX3N0cmlkZSwgVUlOVF9NQVgpICsgMzIpID4+IDY7CisgICAgICAgIHVzYWQgPSAodnA4X3NhZDR4NCh1LCB1dl9zdHJpZGUsIHVkLCB1dmRfc3RyaWRlLCBVSU5UX01BWCkgKyA4KSA+PiA0OworICAgICAgICB2c2FkID0gKHZwOF9zYWQ0eDQodiwgdXZfc3RyaWRlLCB2ZCwgdXZkX3N0cmlkZSwgVUlOVF9NQVgpICsgOCkgPj4gNDsKKyNlbmRpZgorICAgIH0KKworICAgIGFjdHJpc2sgPSAoYWN0ZCA+IGFjdCAqIDUpOworCisgICAgLyogdGhyID0gcWRpZmYvMTYgKyBsb2cyKGFjdCkgKyBsb2c0KHFwcmV2KSAqLworICAgIHRociA9IChxZGlmZiA+PiA0KTsKKyAgICB3aGlsZSAoYWN0ZCA+Pj0gMSkgdGhyKys7CisgICAgd2hpbGUgKHFwcmV2ID4+PSAyKSB0aHIrKzsKKworI2lmZGVmIFVTRV9TU0QKKyAgICB0aHJzcSA9IHRociAqIHRocjsKKyAgICBpZiAoc2FkIDwgdGhyc3EgJiYKKyAgICAgICAgLyogYWRkaXRpb25hbCBjaGVja3MgZm9yIGNvbG9yIG1pc21hdGNoIGFuZCBleGNlc3NpdmUgYWRkaXRpb24gb2YKKyAgICAgICAgICogaGlnaC1mcmVxdWVuY2llcyAqLworICAgICAgICA0ICogdXNhZCA8IHRocnNxICYmIDQgKiB2c2FkIDwgdGhyc3EgJiYgIWFjdHJpc2spCisjZWxzZQorICAgIGlmIChzYWQgPCB0aHIgJiYKKyAgICAgICAgLyogYWRkaXRpb25hbCBjaGVja3MgZm9yIGNvbG9yIG1pc21hdGNoIGFuZCBleGNlc3NpdmUgYWRkaXRpb24gb2YKKyAgICAgICAgICogaGlnaC1mcmVxdWVuY2llcyAqLworICAgICAgICAyICogdXNhZCA8IHRociAmJiAyICogdnNhZCA8IHRociAmJiAhYWN0cmlzaykKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaW50IGlmYWN0b3I7CisjaWZkZWYgVVNFX1NTRAorICAgICAgICAvKiBUT0RPOiBvcHRpbWl6ZSB0aGlzIGxhdGVyIHRvIG5vdCBuZWVkIHNxciByb290ICovCisgICAgICAgIHNhZCA9IGludF9zcXJ0KHNhZCk7CisjZW5kaWYKKyAgICAgICAgaWZhY3RvciA9IChzYWQgPDwgTUZRRV9QUkVDSVNJT04pIC8gdGhyOworICAgICAgICBpZmFjdG9yID4+PSAocWRpZmYgPj4gNSk7CisKKyAgICAgICAgaWYgKGlmYWN0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwcGx5X2lmYWN0b3IoeSwgeV9zdHJpZGUsIHlkLCB5ZF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUsIHYsIHV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWQsIHZkLCB1dmRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibGtzaXplLCBpZmFjdG9yKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKiBlbHNlIGltcGxpY2l0bHkgY29weSBmcm9tIHByZXZpb3VzIGZyYW1lICovCisgICAgeworICAgICAgICBpZiAoYmxrc2l6ZSA9PSAxNikKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2NvcHlfbWVtMTZ4MTYoeSwgeV9zdHJpZGUsIHlkLCB5ZF9zdHJpZGUpOworICAgICAgICAgICAgdnA4X2NvcHlfbWVtOHg4KHUsIHV2X3N0cmlkZSwgdWQsIHV2ZF9zdHJpZGUpOworICAgICAgICAgICAgdnA4X2NvcHlfbWVtOHg4KHYsIHV2X3N0cmlkZSwgdmQsIHV2ZF9zdHJpZGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgIC8qIGlmIChibGtzaXplID09IDgpICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9jb3B5X21lbTh4OCh5LCB5X3N0cmlkZSwgeWQsIHlkX3N0cmlkZSk7CisgICAgICAgICAgICBmb3IgKHVwID0gdSwgdWRwID0gdWQsIGkgPSAwOyBpIDwgdXZibGtzaXplOyArK2ksIHVwICs9IHV2X3N0cmlkZSwgdWRwICs9IHV2ZF9zdHJpZGUpCisgICAgICAgICAgICAgICAgdnB4X21lbWNweSh1ZHAsIHVwLCB1dmJsa3NpemUpOworICAgICAgICAgICAgZm9yICh2cCA9IHYsIHZkcCA9IHZkLCBpID0gMDsgaSA8IHV2Ymxrc2l6ZTsgKytpLCB2cCArPSB1dl9zdHJpZGUsIHZkcCArPSB1dmRfc3RyaWRlKQorICAgICAgICAgICAgICAgIHZweF9tZW1jcHkodmRwLCB2cCwgdXZibGtzaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBxdWFsaWZ5X2ludGVyX21iKGNvbnN0IE1PREVfSU5GTyAqbW9kZV9pbmZvX2NvbnRleHQsIGludCAqbWFwKQoreworICAgIGlmIChtb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKQorICAgICAgICBtYXBbMF0gPSBtYXBbMV0gPSBtYXBbMl0gPSBtYXBbM10gPSAxOworICAgIGVsc2UgaWYgKG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGU9PVNQTElUTVYpCisgICAgeworICAgICAgICBzdGF0aWMgaW50IG5keFs0XVs0XSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHswLCAxLCA0LCA1fSwKKyAgICAgICAgICAgIHsyLCAzLCA2LCA3fSwKKyAgICAgICAgICAgIHs4LCA5LCAxMiwgMTN9LAorICAgICAgICAgICAgezEwLCAxMSwgMTQsIDE1fQorICAgICAgICB9OworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBtYXBbaV0gPSAxOworICAgICAgICAgICAgZm9yIChqPTA7IGo8NCAmJiBtYXBbal07ICsraikKKyAgICAgICAgICAgICAgICBtYXBbaV0gJj0gKG1vZGVfaW5mb19jb250ZXh0LT5ibWlbbmR4W2ldW2pdXS5tdi5hc19tdi5yb3cgPD0gMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQtPmJtaVtuZHhbaV1bal1dLm12LmFzX212LmNvbCA8PSAyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtYXBbMF0gPSBtYXBbMV0gPSBtYXBbMl0gPSBtYXBbM10gPQorICAgICAgICAgICAgKG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPiBCX1BSRUQgJiYKKyAgICAgICAgICAgICBhYnMobW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYucm93KSA8PSAyICYmCisgICAgICAgICAgICAgYWJzKG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LmNvbCkgPD0gMik7CisgICAgfQorICAgIHJldHVybiAobWFwWzBdK21hcFsxXSttYXBbMl0rbWFwWzNdKTsKK30KKwordm9pZCB2cDhfbXVsdGlmcmFtZV9xdWFsaXR5X2VuaGFuY2UKKygKKyAgICBWUDhfQ09NTU9OICpjbQorKQoreworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2hvdyA9IGNtLT5mcmFtZV90b19zaG93OworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCA9ICZjbS0+cG9zdF9wcm9jX2J1ZmZlcjsKKworICAgIEZSQU1FX1RZUEUgZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOworICAgIC8qIFBvaW50IGF0IGJhc2Ugb2YgTWIgTU9ERV9JTkZPIGxpc3QgaGFzIG1vdGlvbiB2ZWN0b3JzIGV0YyAqLworICAgIGNvbnN0IE1PREVfSU5GTyAqbW9kZV9pbmZvX2NvbnRleHQgPSBjbS0+bWk7CisgICAgaW50IG1iX3JvdzsKKyAgICBpbnQgbWJfY29sOworICAgIGludCB0b3RtYXAsIG1hcFs0XTsKKyAgICBpbnQgcWN1cnIgPSBjbS0+YmFzZV9xaW5kZXg7CisgICAgaW50IHFwcmV2ID0gY20tPnBvc3Rwcm9jX3N0YXRlLmxhc3RfYmFzZV9xaW5kZXg7CisKKyAgICB1bnNpZ25lZCBjaGFyICp5X3B0ciwgKnVfcHRyLCAqdl9wdHI7CisgICAgdW5zaWduZWQgY2hhciAqeWRfcHRyLCAqdWRfcHRyLCAqdmRfcHRyOworCisgICAgLyogU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KKyAgICB5X3B0ciA9IHNob3ctPnlfYnVmZmVyOworICAgIHVfcHRyID0gc2hvdy0+dV9idWZmZXI7CisgICAgdl9wdHIgPSBzaG93LT52X2J1ZmZlcjsKKyAgICB5ZF9wdHIgPSBkZXN0LT55X2J1ZmZlcjsKKyAgICB1ZF9wdHIgPSBkZXN0LT51X2J1ZmZlcjsKKyAgICB2ZF9wdHIgPSBkZXN0LT52X2J1ZmZlcjsKKworICAgIC8qIHBvc3Rwcm9jZXNzIGVhY2ggbWFjcm8gYmxvY2sgKi8KKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3crKykKKyAgICB7CisgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBtb3Rpb24gaXMgaGlnaCB0aGVyZSB3aWxsIGxpa2VseSBiZSBubyBiZW5lZml0ICovCisgICAgICAgICAgICBpZiAoZnJhbWVfdHlwZSA9PSBJTlRFUl9GUkFNRSkgdG90bWFwID0gcXVhbGlmeV9pbnRlcl9tYihtb2RlX2luZm9fY29udGV4dCwgbWFwKTsKKyAgICAgICAgICAgIGVsc2UgdG90bWFwID0gKGZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FID8gNCA6IDApOworICAgICAgICAgICAgaWYgKHRvdG1hcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodG90bWFwIDwgNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpLCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajwyOyArK2opCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFtpKjIral0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWZyYW1lX3F1YWxpdHlfZW5oYW5jZV9ibG9jayg4LCBxY3VyciwgcXByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfcHRyICsgOCooaSpzaG93LT55X3N0cmlkZStqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9wdHIgKyA0KihpKnNob3ctPnV2X3N0cmlkZStqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9wdHIgKyA0KihpKnNob3ctPnV2X3N0cmlkZStqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3ctPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWRfcHRyICsgOCooaSpkZXN0LT55X3N0cmlkZStqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRfcHRyICsgNCooaSpkZXN0LT51dl9zdHJpZGUraiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkX3B0ciArIDQqKGkqZGVzdC0+dXZfc3RyaWRlK2opLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC0+dXZfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBhIDh4OCBibG9jayAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdXAgPSB1X3B0ciArIDQqKGkqc2hvdy0+dXZfc3RyaWRlK2opOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp1ZHAgPSB1ZF9wdHIgKyA0KihpKmRlc3QtPnV2X3N0cmlkZStqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdnAgPSB2X3B0ciArIDQqKGkqc2hvdy0+dXZfc3RyaWRlK2opOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2ZHAgPSB2ZF9wdHIgKyA0KihpKmRlc3QtPnV2X3N0cmlkZStqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2NvcHlfbWVtOHg4KHlfcHRyICsgOCooaSpzaG93LT55X3N0cmlkZStqKSwgc2hvdy0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZF9wdHIgKyA4KihpKmRlc3QtPnlfc3RyaWRlK2opLCBkZXN0LT55X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyArK2ssIHVwICs9IHNob3ctPnV2X3N0cmlkZSwgdWRwICs9IGRlc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAgKz0gc2hvdy0+dXZfc3RyaWRlLCB2ZHAgKz0gZGVzdC0+dXZfc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KHVkcCwgdXAsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X21lbWNweSh2ZHAsIHZwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAvKiB0b3RtYXAgPSA0ICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtdWx0aWZyYW1lX3F1YWxpdHlfZW5oYW5jZV9ibG9jaygxNiwgcWN1cnIsIHFwcmV2LCB5X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9wdHIsIHZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93LT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZF9wdHIsIHVkX3B0ciwgdmRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC0+dXZfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X2NvcHlfbWVtMTZ4MTYoeV9wdHIsIHNob3ctPnlfc3RyaWRlLCB5ZF9wdHIsIGRlc3QtPnlfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB2cDhfY29weV9tZW04eDgodV9wdHIsIHNob3ctPnV2X3N0cmlkZSwgdWRfcHRyLCBkZXN0LT51dl9zdHJpZGUpOworICAgICAgICAgICAgICAgIHZwOF9jb3B5X21lbTh4OCh2X3B0ciwgc2hvdy0+dXZfc3RyaWRlLCB2ZF9wdHIsIGRlc3QtPnV2X3N0cmlkZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5X3B0ciArPSAxNjsKKyAgICAgICAgICAgIHVfcHRyICs9IDg7CisgICAgICAgICAgICB2X3B0ciArPSA4OworICAgICAgICAgICAgeWRfcHRyICs9IDE2OworICAgICAgICAgICAgdWRfcHRyICs9IDg7CisgICAgICAgICAgICB2ZF9wdHIgKz0gODsKKyAgICAgICAgICAgIG1vZGVfaW5mb19jb250ZXh0Kys7ICAgICAvKiBzdGVwIHRvIG5leHQgTUIgKi8KKyAgICAgICAgfQorCisgICAgICAgIHlfcHRyICs9IHNob3ctPnlfc3RyaWRlICAqIDE2IC0gMTYgKiBjbS0+bWJfY29sczsKKyAgICAgICAgdV9wdHIgKz0gc2hvdy0+dXZfc3RyaWRlICogIDggLSA4ICogY20tPm1iX2NvbHM7CisgICAgICAgIHZfcHRyICs9IHNob3ctPnV2X3N0cmlkZSAqICA4IC0gOCAqIGNtLT5tYl9jb2xzOworICAgICAgICB5ZF9wdHIgKz0gZGVzdC0+eV9zdHJpZGUgICogMTYgLSAxNiAqIGNtLT5tYl9jb2xzOworICAgICAgICB1ZF9wdHIgKz0gZGVzdC0+dXZfc3RyaWRlICogIDggLSA4ICogY20tPm1iX2NvbHM7CisgICAgICAgIHZkX3B0ciArPSBkZXN0LT51dl9zdHJpZGUgKiAgOCAtIDggKiBjbS0+bWJfY29sczsKKworICAgICAgICBtb2RlX2luZm9fY29udGV4dCsrOyAgICAgICAgIC8qIFNraXAgYm9yZGVyIG1iICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9kZXF1YW50aXplX2RzcHIyLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9taXBzL2RzcHIyL2RlcXVhbnRpemVfZHNwcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODIzMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9kZXF1YW50aXplX2RzcHIyLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKworI2lmIEhBVkVfRFNQUjIKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfZHNwcjIoc2hvcnQgKmlucHV0LCBzaG9ydCAqZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBzdHJpZGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGlucHV0W2ldID0gZHFbaV0gKiBpbnB1dFtpXTsKKyAgICB9CisKKyAgICB2cDhfc2hvcnRfaWRjdDR4NGxsbV9kc3ByMihpbnB1dCwgZGVzdCwgc3RyaWRlLCBkZXN0LCBzdHJpZGUpOworCisgICAgdnB4X21lbXNldChpbnB1dCwgMCwgMzIpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9maWx0ZXJfZHNwcjIuYyBiL2xpYnZweC92cDgvY29tbW9uL21pcHMvZHNwcjIvZmlsdGVyX2RzcHIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmZGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL21pcHMvZHNwcjIvZmlsdGVyX2RzcHIyLmMKQEAgLTAsMCArMSwyODIzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgorCisjaWYgSEFWRV9EU1BSMgorI2RlZmluZSBDUk9QX1dJRFRIIDI1NgordW5zaWduZWQgY2hhciBmZl9jcm9wVGJsWzI1NiArIDIgKiBDUk9QX1dJRFRIXTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHN1Yl9wZWxfZmlsdGVyc3NbOF1bM10gPQoreworICAgIHsgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgeyAgICAgIDAsIDB4MDYwMSwgMHg3YjBjfSwKKyAgICB7IDB4MDIwMSwgMHgwYjA4LCAweDZjMjR9LAorICAgIHsgICAgICAwLCAweDA5MDYsIDB4NWQzMn0sCisgICAgeyAweDAzMDMsIDB4MTAxMCwgMHg0ZDRkfSwKKyAgICB7ICAgICAgMCwgMHgwNjA5LCAweDMyNWR9LAorICAgIHsgMHgwMTAyLCAweDA4MGIsIDB4MjQ2Y30sCisgICAgeyAgICAgIDAsIDB4MDEwNiwgMHgwYzdifSwKK307CisKKworc3RhdGljIGNvbnN0IGludCBzdWJfcGVsX2ZpbHRlcnNfaW50WzhdWzNdID0KK3sKKyAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDB9LAorICAgIHsgMHgwMDAwZmZmYSwgMHgwMDdiMDAwYywgMHhmZmZmMDAwMH0sCisgICAgeyAweDAwMDJmZmY1LCAweDAwNmMwMDI0LCAweGZmZjgwMDAxfSwKKyAgICB7IDB4MDAwMGZmZjcsIDB4MDA1ZDAwMzIsIDB4ZmZmYTAwMDB9LAorICAgIHsgMHgwMDAzZmZmMCwgMHgwMDRkMDA0ZCwgMHhmZmYwMDAwM30sCisgICAgeyAweDAwMDBmZmZhLCAweDAwMzIwMDVkLCAweGZmZjcwMDAwfSwKKyAgICB7IDB4MDAwMWZmZjgsIDB4MDAyNDAwNmMsIDB4ZmZmNTAwMDJ9LAorICAgIHsgMHgwMDAwZmZmZiwgMHgwMDBjMDA3YiwgMHhmZmZhMDAwMH0sCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQgc3ViX3BlbF9maWx0ZXJzX2ludls4XVszXSA9Cit7CisgICAgeyAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAwfSwKKyAgICB7IDB4ZmZmYTAwMDAsIDB4MDAwYzAwN2IsIDB4MDAwMGZmZmZ9LAorICAgIHsgMHhmZmY1MDAwMiwgMHgwMDI0MDA2YywgMHgwMDAxZmZmOH0sCisgICAgeyAweGZmZjcwMDAwLCAweDAwMzIwMDVkLCAweDAwMDBmZmZhfSwKKyAgICB7IDB4ZmZmMDAwMDMsIDB4MDA0ZDAwNGQsIDB4MDAwM2ZmZjB9LAorICAgIHsgMHhmZmZhMDAwMCwgMHgwMDVkMDAzMiwgMHgwMDAwZmZmN30sCisgICAgeyAweGZmZjgwMDAxLCAweDAwNmMwMDI0LCAweDAwMDJmZmY1fSwKKyAgICB7IDB4ZmZmZjAwMDAsIDB4MDA3YjAwMGMsIDB4MDAwMGZmZmF9LAorfTsKKworCitzdGF0aWMgY29uc3QgaW50IHN1Yl9wZWxfZmlsdGVyc19pbnRfdGFwXzRbOF1bMl0gPQoreworICAgIHsgICAgICAgICAgMCwgICAgICAgICAgMH0sCisgICAgeyAweGZmZmEwMDdiLCAweDAwMGNmZmZmfSwKKyAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDB9LAorICAgIHsgMHhmZmY3MDA1ZCwgMHgwMDMyZmZmYX0sCisgICAgeyAgICAgICAgICAwLCAgICAgICAgICAwfSwKKyAgICB7IDB4ZmZmYTAwMzIsIDB4MDA1ZGZmZjd9LAorICAgIHsgICAgICAgICAgMCwgICAgICAgICAgMH0sCisgICAgeyAweGZmZmYwMDBjLCAweDAwN2JmZmZhfSwKK307CisKKworc3RhdGljIGNvbnN0IGludCBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80WzhdWzJdID0KK3sKKyAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDB9LAorICAgIHsgMHgwMDdiZmZmYSwgMHhmZmZmMDAwY30sCisgICAgeyAgICAgICAgICAwLCAgICAgICAgICAwfSwKKyAgICB7IDB4MDA1ZGZmZjcsIDB4ZmZmYTAwMzJ9LAorICAgIHsgICAgICAgICAgMCwgICAgICAgICAgMH0sCisgICAgeyAweDAwMzJmZmZhLCAweGZmZjcwMDVkfSwKKyAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDB9LAorICAgIHsgMHgwMDBjZmZmZiwgMHhmZmZhMDA3Yn0sCit9OworCitpbmxpbmUgdm9pZCBwcmVmZXRjaF9sb2FkKHVuc2lnbmVkIGNoYXIgKnNyYykKK3sKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJwcmVmICAgMCwgIDAoJVtzcmNdKSAgIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiBbc3JjXSAiciIgKHNyYykKKyAgICApOworfQorCisKK2lubGluZSB2b2lkIHByZWZldGNoX3N0b3JlKHVuc2lnbmVkIGNoYXIgKmRzdCkKK3sKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJwcmVmICAgMSwgIDAoJVtkc3RdKSAgIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiBbZHN0XSAiciIgKGRzdCkKKyAgICApOworfQorCit2b2lkIGRzcHV0aWxfc3RhdGljX2luaXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgZmZfY3JvcFRibFtpICsgQ1JPUF9XSURUSF0gPSBpOworCisgICAgZm9yIChpID0gMDsgaSA8IENST1BfV0lEVEg7IGkrKykKKyAgICB7CisgICAgICAgIGZmX2Nyb3BUYmxbaV0gPSAwOworICAgICAgICBmZl9jcm9wVGJsW2kgKyBDUk9QX1dJRFRIICsgMjU2XSA9IDI1NTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfNAorKAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIHNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1QgZHN0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKKyAgICBpbnQgeG9mZnNldCwKKyAgICBpbnQgcGl0Y2gKKykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBpbnQgVGVtcDEsIFRlbXAyLCBUZW1wMywgVGVtcDQ7CisKKyAgICB1bnNpZ25lZCBpbnQgdmVjdG9yNGEgPSA2NDsKKyAgICBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYjsKKyAgICB1bnNpZ25lZCBpbnQgdHAxLCB0cDIsIHRuMSwgdG4yOworICAgIHVuc2lnbmVkIGludCBwMSwgcDIsIHAzOworICAgIHVuc2lnbmVkIGludCBuMSwgbjIsIG4zOworICAgIHVuc2lnbmVkIGNoYXIgKmNtID0gZmZfY3JvcFRibCArIENST1BfV0lEVEg7CisKKyAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZbeG9mZnNldF1bMl07CisKKyAgICAvKiBpZiAoeG9mZnNldCA9PSAwKSB3ZSBkb24ndCBuZWVkIGFueSBmaWx0ZXJpbmcgKi8KKyAgICBpZiAodmVjdG9yM2IgPT0gMCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXRfaGVpZ2h0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIHNyY19waXhlbHNfcGVyX2xpbmUpOworICAgICAgICAgICAgZHN0X3B0clswXSA9IHNyY19wdHJbMF07CisgICAgICAgICAgICBkc3RfcHRyWzFdID0gc3JjX3B0clsxXTsKKyAgICAgICAgICAgIGRzdF9wdHJbMl0gPSBzcmNfcHRyWzJdOworICAgICAgICAgICAgZHN0X3B0clszXSA9IHNyY19wdHJbM107CisKKyAgICAgICAgICAgIC8qIG5leHQgcm93Li4uICovCisgICAgICAgICAgICBzcmNfcHRyICs9IHNyY19waXhlbHNfcGVyX2xpbmU7CisgICAgICAgICAgICBkc3RfcHRyICs9IDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHZlY3RvcjNiID4gNjU1MzYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDYgdGFwIGZpbHRlciAqLworCisgICAgICAgICAgICB2ZWN0b3IxYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZbeG9mZnNldF1bMF07CisgICAgICAgICAgICB2ZWN0b3IyYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZbeG9mZnNldF1bMV07CisKKyAgICAgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIHNyY19waXhlbHNfcGVyX2xpbmUpOworCisgICAgICAgICAgICBmb3IgKGkgPSBvdXRwdXRfaGVpZ2h0OyBpLS07KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAxXSwgICAgICAtMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AxXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwM10sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDNdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW3AxXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICVbdHAyXSwgICAgICAlW3RwMV0sICAgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AzXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDFdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIG9kZCAxLiBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RuMl0sICAgICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjNdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW24xXSwgICAgICAgJVt0bjJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuM10sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IzYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGNsYW1wICovCisgICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdHAxXSwgICAgICAlW1RlbXAxXSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0bjFdLCAgICAgICVbVGVtcDJdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RwMl0sICAgICAgJVtUZW1wM10oJVtjbV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbbjJdLCAgICAgICAlW1RlbXA0XSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAxKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW24yXSwgICAgICAgMyglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiPSZyIiAodHAxKSwgW3RwMl0gIj0mciIgKHRwMiksIFt0bjFdICI9JnIiICh0bjEpLAorICAgICAgICAgICAgICAgICAgICAgIFt0bjJdICI9JnIiICh0bjIpLCBbcDFdICI9JnIiIChwMSksIFtwMl0gIj0mciIgKHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbcDNdICI9JnIiIChwMyksIFtuMV0gIj0mciIgKG4xKSwgW24yXSAiPSZyIiAobjIpLAorICAgICAgICAgICAgICAgICAgICAgIFtuM10gIj0mciIgKG4zKSwgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9JnIiIChUZW1wNCkKKyAgICAgICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAorICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFtjbV0gInIiIChjbSksIFtkc3RfcHRyXSAiciIgKGRzdF9wdHIpLAorICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIC8qIE5leHQgcm93Li4uICovCisgICAgICAgICAgICAgICAgc3JjX3B0ciArPSBzcmNfcGl4ZWxzX3Blcl9saW5lOworICAgICAgICAgICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA0IHRhcCBmaWx0ZXIgKi8KKworICAgICAgICAgICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80W3hvZmZzZXRdWzBdOworICAgICAgICAgICAgdmVjdG9yMmIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80W3hvZmZzZXRdWzFdOworCisgICAgICAgICAgICBmb3IgKGkgPSBvdXRwdXRfaGVpZ2h0OyBpLS07KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAxXSwgICAgICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AxXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwM10sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDIuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwM10sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDFdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBvZGQgMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgICAgICAgJVt0bjFdLCAgICAgICVbdHAyXSwgICAgICAgICA4ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYmFsaWduICAgICAgICAgICAlW3RwMl0sICAgICAgJVt0cDFdLCAgICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjNdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBvZGQgMi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAyXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjNdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXA0XSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0cDFdLCAgICAgICVbVGVtcDFdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RuMV0sICAgICAgJVtUZW1wMl0oJVtjbV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdHAyXSwgICAgICAlW1RlbXAzXSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIDAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RuMV0sICAgICAgMSglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbbjJdLCAgICAgICAlW1RlbXA0XSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW24yXSwgICAgICAgMyglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiPSZyIiAodHAxKSwgW3RwMl0gIj0mciIgKHRwMiksIFt0bjFdICI9JnIiICh0bjEpLAorICAgICAgICAgICAgICAgICAgICAgIFtwMV0gIj0mciIgKHAxKSwgW3AyXSAiPSZyIiAocDIpLCBbcDNdICI9JnIiIChwMyksCisgICAgICAgICAgICAgICAgICAgICAgW24xXSAiPSZyIiAobjEpLCBbbjJdICI9JnIiIChuMiksIFtuM10gIj0mciIgKG4zKSwKKyAgICAgICAgICAgICAgICAgICAgICBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj0mciIgKFRlbXA0KQorICAgICAgICAgICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCisgICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW2NtXSAiciIgKGNtKSwgW2RzdF9wdHJdICJyIiAoZHN0X3B0ciksCisgICAgICAgICAgICAgICAgICAgICAgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIC8qICBOZXh0IHJvdy4uLiAqLworICAgICAgICAgICAgICAgIHNyY19wdHIgKz0gc3JjX3BpeGVsc19wZXJfbGluZTsKKyAgICAgICAgICAgICAgICBkc3RfcHRyICs9IHBpdGNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzXzhfYWxsCisoCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1Qgc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBkc3RfcHRyLAorICAgIHVuc2lnbmVkIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIGludCB4b2Zmc2V0LAorICAgIGludCBwaXRjaAorKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCBUZW1wMSwgVGVtcDIsIFRlbXAzLCBUZW1wNDsKKworICAgIHVuc2lnbmVkIGludCB2ZWN0b3I0YSA9IDY0OworICAgIHVuc2lnbmVkIGludCB2ZWN0b3IxYiwgdmVjdG9yMmIsIHZlY3RvcjNiOworICAgIHVuc2lnbmVkIGludCB0cDEsIHRwMiwgdG4xLCB0bjI7CisgICAgdW5zaWduZWQgaW50IHAxLCBwMiwgcDMsIHA0OworICAgIHVuc2lnbmVkIGludCBuMSwgbjIsIG4zLCBuNDsKKworICAgIHVuc2lnbmVkIGNoYXIgKmNtID0gZmZfY3JvcFRibCArIENST1BfV0lEVEg7CisKKyAgICAvKiBpZiAoeG9mZnNldCA9PSAwKSB3ZSBkb24ndCBuZWVkIGFueSBmaWx0ZXJpbmcgKi8KKyAgICBpZiAoeG9mZnNldCA9PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dHB1dF9oZWlnaHQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLworICAgICAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyICsgc3JjX3BpeGVsc19wZXJfbGluZSk7CisKKyAgICAgICAgICAgIGRzdF9wdHJbMF0gPSBzcmNfcHRyWzBdOworICAgICAgICAgICAgZHN0X3B0clsxXSA9IHNyY19wdHJbMV07CisgICAgICAgICAgICBkc3RfcHRyWzJdID0gc3JjX3B0clsyXTsKKyAgICAgICAgICAgIGRzdF9wdHJbM10gPSBzcmNfcHRyWzNdOworICAgICAgICAgICAgZHN0X3B0cls0XSA9IHNyY19wdHJbNF07CisgICAgICAgICAgICBkc3RfcHRyWzVdID0gc3JjX3B0cls1XTsKKyAgICAgICAgICAgIGRzdF9wdHJbNl0gPSBzcmNfcHRyWzZdOworICAgICAgICAgICAgZHN0X3B0cls3XSA9IHNyY19wdHJbN107CisKKyAgICAgICAgICAgIC8qIG5leHQgcm93Li4uICovCisgICAgICAgICAgICBzcmNfcHRyICs9IHNyY19waXhlbHNfcGVyX2xpbmU7CisgICAgICAgICAgICBkc3RfcHRyICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmVjdG9yM2IgPSBzdWJfcGVsX2ZpbHRlcnNfaW52W3hvZmZzZXRdWzJdOworCisgICAgICAgIGlmICh2ZWN0b3IzYiA+IDY1NTM2KQorICAgICAgICB7CisgICAgICAgICAgICAvKiA2IHRhcCBmaWx0ZXIgKi8KKworICAgICAgICAgICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52W3hvZmZzZXRdWzBdOworICAgICAgICAgICAgdmVjdG9yMmIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52W3hvZmZzZXRdWzFdOworCisgICAgICAgICAgICBmb3IgKGkgPSBvdXRwdXRfaGVpZ2h0OyBpLS07KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIgKyBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKKworICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAxXSwgICAgICAtMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AxXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwM10sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDNdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW3AxXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yM2JdICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgImJhbGlnbiAgICAgICAgICAgJVt0cDJdLCAgICAgICVbdHAxXSwgICAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdG4yXSwgICAgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBvZGQgMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24xXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjJdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuM10sICAgICAgICVbdG4yXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuM10sICAgICAgICAgICVbdmVjdG9yM2JdICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDIuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtuMV0sICAgICAgICVbdG4yXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24zXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjFdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMV0sICAgICAgNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AyXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDRdLCAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMl0gIj0mciIgKHRuMiksCisgICAgICAgICAgICAgICAgICAgICAgW3AxXSAiPSZyIiAocDEpLCBbcDJdICI9JnIiIChwMiksIFtwM10gIj0mciIgKHAzKSwKKyAgICAgICAgICAgICAgICAgICAgICBbbjFdICI9JnIiIChuMSksIFtuMl0gIj0mciIgKG4yKSwgW24zXSAiPSZyIiAobjMpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKKyAgICAgICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAorICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICAgICAgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICBkc3RfcHRyWzBdID0gY21bVGVtcDFdOworICAgICAgICAgICAgICAgIGRzdF9wdHJbMV0gPSBjbVtUZW1wMl07CisgICAgICAgICAgICAgICAgZHN0X3B0clsyXSA9IGNtW1RlbXAzXTsKKyAgICAgICAgICAgICAgICBkc3RfcHRyWzNdID0gY21bVGVtcDRdOworCisgICAgICAgICAgICAgICAgLyogbmV4dCA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAzLiBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gNC4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW3A0XSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AxXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwNF0sICAgICAgICAgICVbdmVjdG9yM2JdICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDMuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuMl0sICAgICAgICVbdG4xXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuM10sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDQuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtuNF0sICAgICAgICVbdG4xXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjRdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAyXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDRdLCAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICA6IFt0bjFdICI9JnIiICh0bjEpLCBbbjJdICI9JnIiIChuMiksCisgICAgICAgICAgICAgICAgICAgICAgW3A0XSAiPSZyIiAocDQpLCBbbjRdICI9JnIiIChuNCksCisgICAgICAgICAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9ciIgKFRlbXA0KQorICAgICAgICAgICAgICAgICAgICA6IFt0cDFdICJyIiAodHAxKSwgW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3AyXSAiciIgKHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbbjFdICJyIiAobjEpLCBbcDFdICJyIiAocDEpLAorICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICAgICAgW3AzXSAiciIgKHAzKSwgW24zXSAiciIgKG4zKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICBkc3RfcHRyWzRdID0gY21bVGVtcDFdOworICAgICAgICAgICAgICAgIGRzdF9wdHJbNV0gPSBjbVtUZW1wMl07CisgICAgICAgICAgICAgICAgZHN0X3B0cls2XSA9IGNtW1RlbXAzXTsKKyAgICAgICAgICAgICAgICBkc3RfcHRyWzddID0gY21bVGVtcDRdOworCisgICAgICAgICAgICAgICAgc3JjX3B0ciArPSBzcmNfcGl4ZWxzX3Blcl9saW5lOworICAgICAgICAgICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA0IHRhcCBmaWx0ZXIgKi8KKworICAgICAgICAgICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80W3hvZmZzZXRdWzBdOworICAgICAgICAgICAgdmVjdG9yMmIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80W3hvZmZzZXRdWzFdOworCisgICAgICAgICAgICBmb3IgKGkgPSBvdXRwdXRfaGVpZ2h0OyBpLS07KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIgKyBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKKworICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAxXSwgICAgICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDEuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwMV0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW3AyXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAyXSwgICAgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDIuIHBpeGVsICAqLworICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDNdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwNF0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AzXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICVbdHAyXSwgICAgICAlW3RwMV0sICAgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBvZGQgMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24xXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjJdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjFdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMl0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDNdLCAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RuMl0sICAgICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDIuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuM10sICAgICAgICVbdG4yXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW240XSwgICAgICAgJVt0bjJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjNdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMV0sICAgICAgNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXA0XSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiPSZyIiAodHAxKSwgW3RwMl0gIj0mciIgKHRwMiksCisgICAgICAgICAgICAgICAgICAgICAgW3RuMl0gIj0mciIgKHRuMiksIFtwMV0gIj0mciIgKHAxKSwgW3AyXSAiPSZyIiAocDIpLAorICAgICAgICAgICAgICAgICAgICAgIFtwM10gIj0mciIgKHAzKSwgW3A0XSAiPSZyIiAocDQpLCBbbjFdICI9JnIiIChuMSksCisgICAgICAgICAgICAgICAgICAgICAgW24yXSAiPSZyIiAobjIpLCBbbjNdICI9JnIiIChuMyksIFtuNF0gIj0mciIgKG40KSwKKyAgICAgICAgICAgICAgICAgICAgICBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpCisgICAgICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLworICAgICAgICAgICAgICAgIGRzdF9wdHJbMF0gPSBjbVtUZW1wMV07CisgICAgICAgICAgICAgICAgZHN0X3B0clsxXSA9IGNtW1RlbXAyXTsKKyAgICAgICAgICAgICAgICBkc3RfcHRyWzJdID0gY21bVGVtcDNdOworICAgICAgICAgICAgICAgIGRzdF9wdHJbM10gPSBjbVtUZW1wNF07CisKKyAgICAgICAgICAgICAgICAvKiBuZXh0IDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDMuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AzXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDRdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gNC4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AyXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3A0XSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDMuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuNF0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdG4xXSwgICAgICA4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIG9kZCA0LiBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjJdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjRdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIDogW3RuMV0gIj0mciIgKHRuMSksIFtwMl0gIj0mciIgKHAyKSwgW24yXSAiPSZyIiAobjIpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKKyAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiciIgKHRwMSksIFtwM10gInIiIChwMyksIFtwNF0gInIiIChwNCksCisgICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbbjNdICJyIiAobjMpLCBbbjRdICJyIiAobjQpCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgICAgICAgICAgZHN0X3B0cls0XSA9IGNtW1RlbXAxXTsKKyAgICAgICAgICAgICAgICBkc3RfcHRyWzVdID0gY21bVGVtcDJdOworICAgICAgICAgICAgICAgIGRzdF9wdHJbNl0gPSBjbVtUZW1wM107CisgICAgICAgICAgICAgICAgZHN0X3B0cls3XSA9IGNtW1RlbXA0XTsKKworICAgICAgICAgICAgICAgIC8qIG5leHQgcm93Li4uICovCisgICAgICAgICAgICAgICAgc3JjX3B0ciArPSBzcmNfcGl4ZWxzX3Blcl9saW5lOworICAgICAgICAgICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzZ0YXAKKygKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIGRzdF9wdHIsCisgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCisgICAgaW50IHhvZmZzZXQsCisgICAgaW50IHBpdGNoCispCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0OworCisgICAgdW5zaWduZWQgaW50IHZlY3RvcjRhOworICAgIHVuc2lnbmVkIGludCB2ZWN0b3IxYiwgdmVjdG9yMmIsIHZlY3RvcjNiOworICAgIHVuc2lnbmVkIGludCB0cDEsIHRwMiwgdG4xLCB0bjI7CisgICAgdW5zaWduZWQgaW50IHAxLCBwMiwgcDMsIHA0OworICAgIHVuc2lnbmVkIGludCBuMSwgbjIsIG4zLCBuNDsKKyAgICB1bnNpZ25lZCBjaGFyICpjbSA9IGZmX2Nyb3BUYmwgKyBDUk9QX1dJRFRIOworCisgICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52W3hvZmZzZXRdWzBdOworICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzX2ludlt4b2Zmc2V0XVsxXTsKKyAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZbeG9mZnNldF1bMl07CisgICAgdmVjdG9yNGEgPSA2NDsKKworICAgIGZvciAoaSA9IG91dHB1dF9oZWlnaHQ7IGktLTspCisgICAgeworICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCisgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIHNyY19waXhlbHNfcGVyX2xpbmUpOworCisgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgLTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAyXSwgICAgICAyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgLyogZXZlbiAxLiBwaXhlbCAqLworICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDFdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisKKyAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW3AxXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisKKyAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICAgJVt0cDJdLCAgICAgICVbdHAxXSwgICAgICAgICAgMyAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgICAlW3RuMl0sICAgICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAgICVbVGVtcDFdLCAgICAkYWMzLCAgICAgICAgICAgIDkgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCisgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjNdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IzYl0gICBcblx0IgorCisgICAgICAgICAgICAvKiBvZGQgMi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24xXSwgICAgICAgJVt0bjJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAxXSwgICAgICA2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMl0gIj0mciIgKHRuMiksCisgICAgICAgICAgICAgIFtwMV0gIj0mciIgKHAxKSwgW3AyXSAiPSZyIiAocDIpLCBbcDNdICI9JnIiIChwMyksCisgICAgICAgICAgICAgIFtuMV0gIj0mciIgKG4xKSwgW24yXSAiPSZyIiAobjIpLCBbbjNdICI9JnIiIChuMyksCisgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAorICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpCisgICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCisgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCisgICAgICAgICk7CisKKyAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgZHN0X3B0clswXSA9IGNtW1RlbXAxXTsKKyAgICAgICAgZHN0X3B0clsxXSA9IGNtW1RlbXAyXTsKKyAgICAgICAgZHN0X3B0clsyXSA9IGNtW1RlbXAzXTsKKyAgICAgICAgZHN0X3B0clszXSA9IGNtW1RlbXA0XTsKKworICAgICAgICAvKiBuZXh0IDQgcGl4ZWxzICovCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgIC8qIGV2ZW4gMy4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKworICAgICAgICAgICAgLyogZXZlbiA0LiBwaXhlbCAqLworICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAgICVbcDRdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3A0XSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKyAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA5ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIC8qIG9kZCAzLiBwaXhlbCAqLworICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjJdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAvKiBvZGQgNC4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW240XSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW24xXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuNF0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAyXSwgICAgICAxMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDFdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt0bjFdICI9JnIiICh0bjEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW24yXSAiPSZyIiAobjIpLAorICAgICAgICAgICAgICBbcDRdICI9JnIiIChwNCksIFtuNF0gIj0mciIgKG40KSwKKyAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKKyAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgW3RwMV0gInIiICh0cDEpLCBbbjFdICJyIiAobjEpLCBbcDFdICJyIiAocDEpLAorICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbcDJdICJyIiAocDIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAorICAgICAgICAgICAgICBbcDNdICJyIiAocDMpLCBbbjNdICJyIiAobjMpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICApOworCisgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgIGRzdF9wdHJbNF0gPSBjbVtUZW1wMV07CisgICAgICAgIGRzdF9wdHJbNV0gPSBjbVtUZW1wMl07CisgICAgICAgIGRzdF9wdHJbNl0gPSBjbVtUZW1wM107CisgICAgICAgIGRzdF9wdHJbN10gPSBjbVtUZW1wNF07CisKKyAgICAgICAgLyogbmV4dCA0IHBpeGVscyAqLworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAvKiBldmVuIDUuIHBpeGVsICovCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDRdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisKKyAgICAgICAgICAgIC8qIGV2ZW4gNi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3A0XSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisKKyAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA5ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIC8qIG9kZCA1LiBwaXhlbCAqLworICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjFdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuNF0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAvKiBvZGQgNi4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24zXSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW240XSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjFdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuM10sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAxXSwgICAgICAxNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDRdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt0bjFdICI9JnIiICh0bjEpLCBbdHAxXSAiPSZyIiAodHAxKSwKKyAgICAgICAgICAgICAgW24xXSAiPSZyIiAobjEpLCBbcDNdICI9JnIiIChwMyksIFtuM10gIj0mciIgKG4zKSwKKyAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKKyAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgW3RwMl0gInIiICh0cDIpLCBbcDJdICJyIiAocDIpLCBbbjJdICJyIiAobjIpLAorICAgICAgICAgICAgICBbcDRdICJyIiAocDQpLCBbbjRdICJyIiAobjQpLCBbcDFdICJyIiAocDEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKQorICAgICAgICApOworCisgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgIGRzdF9wdHJbOF0gPSBjbVtUZW1wMV07CisgICAgICAgIGRzdF9wdHJbOV0gPSBjbVtUZW1wMl07CisgICAgICAgIGRzdF9wdHJbMTBdID0gY21bVGVtcDNdOworICAgICAgICBkc3RfcHRyWzExXSA9IGNtW1RlbXA0XTsKKworICAgICAgICAvKiBuZXh0IDQgcGl4ZWxzICovCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgIC8qIGV2ZW4gNy4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3A0XSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKworICAgICAgICAgICAgLyogZXZlbiA4LiBwaXhlbCAqLworICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwNF0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKyAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDE1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA5ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIC8qIG9kZCA3LiBwaXhlbCAqLworICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjRdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW240XSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAvKiBvZGQgOC4gcGl4ZWwgKi8KKyAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24yXSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW24zXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKKyAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjRdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgorICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCisgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgIDkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLworICAgICAgICAgICAgImxidXggICAgICAgICAgICAgICAlW3RwMV0sICAgICAgJVtUZW1wMV0oJVtjbV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAlW1RlbXAyXSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICAgJVtwMl0sICAgICAgICVbVGVtcDNdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgMTIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAxMyglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICAgJVtuMl0sICAgICAgICVbVGVtcDRdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgICAlW3AyXSwgICAgICAgMTQoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAgICVbbjJdLCAgICAgICAxNSglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdG4xXSAiPSZyIiAodG4xKSwgW3AyXSAiPSZyIiAocDIpLCBbbjJdICI9JnIiIChuMiksIFtuNF0gIj0mciIgKG40KSwKKyAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKKyAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgW3RwMV0gInIiICh0cDEpLCBbcDRdICJyIiAocDQpLCBbbjFdICJyIiAobjEpLCBbcDFdICJyIiAocDEpLAorICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLCBbcDNdICJyIiAocDMpLAorICAgICAgICAgICAgICBbbjNdICJyIiAobjMpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgW2NtXSAiciIgKGNtKSwgW2RzdF9wdHJdICJyIiAoZHN0X3B0cikKKyAgICAgICAgKTsKKworICAgICAgICBzcmNfcHRyICs9IHNyY19waXhlbHNfcGVyX2xpbmU7CisgICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7CisgICAgfQorfQorCisKK3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MxNl8wCisoCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1Qgc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lCispCit7CisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0OworICAgIGludCBpOworCisgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLworICAgIHByZWZldGNoX3N0b3JlKG91dHB1dF9wdHIgKyAzMik7CisKKyAgICAvKiBjb3B5IG1lbW9yeSBmcm9tIHNyYyBidWZmZXIgdG8gZHN0IGJ1ZmZlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgICAgeworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAidWx3ICAgICVbVGVtcDFdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMl0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInVsdyAgICAlW1RlbXAzXSwgICA4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICVbVGVtcDRdLCAgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMCglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA0KCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICVbVGVtcDNdLCAgIDgoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVtUZW1wNF0sICAgMTIoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAgICAgJVtzcmNfcGl4ZWxzX3Blcl9saW5lXSAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksIFtUZW1wM10gIj0mciIgKFRlbXAzKSwKKyAgICAgICAgICAgICAgW1RlbXA0XSAiPSZyIiAoVGVtcDQpLCBbc3JjX3B0cl0gIityIiAoc3JjX3B0cikKKyAgICAgICAgICAgIDogW3NyY19waXhlbHNfcGVyX2xpbmVdICJyIiAoc3JjX3BpeGVsc19wZXJfbGluZSksCisgICAgICAgICAgICAgIFtvdXRwdXRfcHRyXSAiciIgKG91dHB1dF9wdHIpCisgICAgICAgICk7CisKKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wM10sICAgOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInVsdyAgICAlW1RlbXA0XSwgICAxMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDE2KCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjAoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW1RlbXAzXSwgICAyNCglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICVbVGVtcDRdLCAgIDI4KCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgJVtzcmNfcHRyXSwgJVtzcmNfcHRyXSwgICAgICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLCBbVGVtcDNdICI9JnIiIChUZW1wMyksCisgICAgICAgICAgICAgIFtUZW1wNF0gIj0mciIgKFRlbXA0KSwgW3NyY19wdHJdICIrciIgKHNyY19wdHIpCisgICAgICAgICAgICA6IFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpLAorICAgICAgICAgICAgICBbb3V0cHV0X3B0cl0gInIiIChvdXRwdXRfcHRyKQorICAgICAgICApOworCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICVbVGVtcDNdLCAgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wNF0sICAgMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICAzMiglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDM2KCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVtUZW1wM10sICAgNDAoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW1RlbXA0XSwgICA0NCglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgOiBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLAorICAgICAgICAgICAgICBbVGVtcDRdICI9JnIiIChUZW1wNCksIFtzcmNfcHRyXSAiK3IiIChzcmNfcHRyKQorICAgICAgICAgICAgOiBbc3JjX3BpeGVsc19wZXJfbGluZV0gInIiIChzcmNfcGl4ZWxzX3Blcl9saW5lKSwKKyAgICAgICAgICAgICAgW291dHB1dF9wdHJdICJyIiAob3V0cHV0X3B0cikKKyAgICAgICAgKTsKKworICAgICAgICBvdXRwdXRfcHRyICs9IDQ4OworICAgIH0KK30KKworCit2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzMTZfNHRhcAorKAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIHNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1Qgb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIGludCB4b2Zmc2V0LAorICAgIGludCB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIGRzdF9wdHIsCisgICAgaW50IHBpdGNoCispCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0OworCisgICAgdW5zaWduZWQgaW50IHZlY3RvcjRhOworICAgIGludCB2ZWN0b3IxYiwgdmVjdG9yMmI7CisgICAgdW5zaWduZWQgaW50IHRwMSwgdHAyLCB0cDMsIHRuMTsKKyAgICB1bnNpZ25lZCBpbnQgcDEsIHAyLCBwMzsKKyAgICB1bnNpZ25lZCBpbnQgbjEsIG4yLCBuMzsKKyAgICB1bnNpZ25lZCBjaGFyICpjbSA9IGZmX2Nyb3BUYmwgKyBDUk9QX1dJRFRIOworCisgICAgdmVjdG9yNGEgPSA2NDsKKworICAgIHZlY3RvcjFiID0gc3ViX3BlbF9maWx0ZXJzX2ludl90YXBfNFt4b2Zmc2V0XVswXTsKKyAgICB2ZWN0b3IyYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZfdGFwXzRbeG9mZnNldF1bMV07CisKKyAgICAvKiBpZiAoeW9mZnNldCA9PSAwKSBkb24ndCBuZWVkIHRlbXAgYnVmZmVyLCBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGRzdF9wdHIgKi8KKyAgICBpZiAoeW9mZnNldCA9PSAwKQorICAgIHsKKyAgICAgICAgb3V0cHV0X2hlaWdodCAtPSA1OworICAgICAgICBzcmNfcHRyICs9IChzcmNfcGl4ZWxzX3Blcl9saW5lICsgc3JjX3BpeGVsc19wZXJfbGluZSk7CisKKyAgICAgICAgZm9yIChpID0gb3V0cHV0X2hlaWdodDsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJ1bHcgICAgICVbdHAzXSwgICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbdHAzXSAiPSZyIiAodHAzKQorICAgICAgICAgICAgICAgIDogW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3NpbmcgNCBhZGphY2VudCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaiArPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAyXSwgICAgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibW92ZSAgICAgICAgICAgICAlW3RwMV0sICAgICAgJVt0cDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDEuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXRoaSAgICAgICAgICAgICAkMCwgICAgICAgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm1vdmUgICAgICAgICAgICAgJVt0cDNdLCAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDFdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW3AyXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwM10sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMl0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDIuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXRoaSAgICAgICAgICAgICAkMCwgICAgICAgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDJdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AzXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0ci53ICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAvKiBvZGQgMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICVbdHAyXSwgICAgICAlW3RwMV0sICAgICAgICAgIDMgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10aGkgICAgICAgICAgICAgJDAsICAgICAgICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjFdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuM10sICAgICAgICVbdG4xXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRyLncgICAgICAgICAgICVbVGVtcDNdLCAgICAkYWMyLCAgICAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDIuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXRoaSAgICAgICAgICAgICAkMCwgICAgICAgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHIudyAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHIudyAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0cDFdLCAgICAgICVbVGVtcDFdKCVbY21dKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdG4xXSwgICAgICAlW1RlbXAyXSglW2NtXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RwMl0sICAgICAgJVtUZW1wM10oJVtjbV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIDAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAxKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW24yXSwgICAgICAgJVtUZW1wNF0oJVtjbV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbbjJdLCAgICAgICAzKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIDogW3RwMV0gIj0mciIgKHRwMSksIFt0cDJdICI9JnIiICh0cDIpLCBbdHAzXSAiPSZyIiAodHAzKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdG4xXSAiPSZyIiAodG4xKSwgW3AxXSAiPSZyIiAocDEpLCBbcDJdICI9JnIiIChwMiksCisgICAgICAgICAgICAgICAgICAgICAgW24xXSAiPSZyIiAobjEpLCBbbjJdICI9JnIiIChuMiksIFtuM10gIj0mciIgKG4zKSwKKyAgICAgICAgICAgICAgICAgICAgICBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwgW3AzXSAiPSZyIiAocDMpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPSZyIiAoVGVtcDQpCisgICAgICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbY21dICJyIiAoY20pLCBbZHN0X3B0cl0gInIiIChkc3RfcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBzcmNfcHRyICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5leHQgcm93Li4uICovCisgICAgICAgICAgICBzcmNfcHRyICs9IHNyY19waXhlbHNfcGVyX2xpbmUgLSAxNjsKKyAgICAgICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gb3V0cHV0X2hlaWdodDsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgLyogcHJvY2Vzc2luZyA0IGFkamFjZW50IHBpeGVscyAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAyXSwgICAgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMS4gcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AxXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDNdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAyLiBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10aGkgICAgICAgICAgICAgJDAsICAgICAgICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHIudyAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdG4xXSwgICAgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYmFsaWduICAgICAgICAgICAlW3RwMl0sICAgICAgJVt0cDFdLCAgICAgICAgICAzICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24xXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtuMl0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjNdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0ci53ICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIG9kZCAyLiBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10aGkgICAgICAgICAgICAgJDAsICAgICAgICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRyLncgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRyLncgICAgICAgICAgICVbVGVtcDRdLCAgICAkYWMyLCAgICAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdHAxXSwgICAgICAlW1RlbXAxXSglW2NtXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RuMV0sICAgICAgJVtUZW1wMl0oJVtjbV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0cDJdLCAgICAgICVbVGVtcDNdKCVbY21dKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdHAxXSwgICAgICAwKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RuMV0sICAgICAgMSglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVtuMl0sICAgICAgICVbVGVtcDRdKCVbY21dKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdHAyXSwgICAgICAyKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW24yXSwgICAgICAgMyglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMV0gIj0mciIgKHRuMSksCisgICAgICAgICAgICAgICAgICAgICAgW3AxXSAiPSZyIiAocDEpLCBbcDJdICI9JnIiIChwMiksIFtwM10gIj0mciIgKHAzKSwKKyAgICAgICAgICAgICAgICAgICAgICBbbjFdICI9JnIiIChuMSksIFtuMl0gIj0mciIgKG4yKSwgW24zXSAiPSZyIiAobjMpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPSZyIiAoVGVtcDQpCisgICAgICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbY21dICJyIiAoY20pLAorICAgICAgICAgICAgICAgICAgICAgIFtvdXRwdXRfcHRyXSAiciIgKG91dHB1dF9wdHIpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBzcmNfcHRyICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG5leHQgcm93Li4uICovCisgICAgICAgICAgICBzcmNfcHRyICs9IHNyY19waXhlbHNfcGVyX2xpbmU7CisgICAgICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF93aWR0aDsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzczQKKygKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIG91dHB1dF9wdHIsCisgICAgaW50IG91dHB1dF9waXRjaCwKKyAgICBpbnQgeW9mZnNldAorKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0OworICAgIHVuc2lnbmVkIGludCB2ZWN0b3IxYiwgdmVjdG9yMmIsIHZlY3RvcjNiLCB2ZWN0b3I0YTsKKworICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9sMjsKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfbDE7CisgICAgdW5zaWduZWQgY2hhciBzcmNfcHRyXzA7CisgICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX3IxOworICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9yMjsKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfcjM7CisKKyAgICB1bnNpZ25lZCBjaGFyICpjbSA9IGZmX2Nyb3BUYmwgKyBDUk9QX1dJRFRIOworCisgICAgdmVjdG9yNGEgPSA2NDsKKworICAgIC8qIGxvYWQgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIHZlY3RvcjFiID0gc3ViX3BlbF9maWx0ZXJzc1t5b2Zmc2V0XVswXTsKKyAgICB2ZWN0b3IyYiA9IHN1Yl9wZWxfZmlsdGVyc3NbeW9mZnNldF1bMl07CisgICAgdmVjdG9yM2IgPSBzdWJfcGVsX2ZpbHRlcnNzW3lvZmZzZXRdWzFdOworCisgICAgaWYgKHZlY3RvcjFiKQorICAgIHsKKyAgICAgICAgLyogNiB0YXAgZmlsdGVyICovCisKKyAgICAgICAgZm9yIChpID0gMjsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLworICAgICAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyKTsKKworICAgICAgICAgICAgLyogZG8gbm90IGFsbG93IGNvbXBpbGVyIHRvIHJlb3JkZXIgaW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC04KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC00KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAxMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC01KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDE1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA0XSwgICAgICAgJGFjMSwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKKyAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLCBbc3JjX3B0cl9yM10gIj0mciIgKHNyY19wdHJfcjMpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLworICAgICAgICAgICAgb3V0cHV0X3B0clswXSA9IGNtW1RlbXAxXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbMV0gPSBjbVtUZW1wMl07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzJdID0gY21bVGVtcDNdOworICAgICAgICAgICAgb3V0cHV0X3B0clszXSA9IGNtW1RlbXA0XTsKKworICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7CisKKyAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC00KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDE4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAxOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDJdICI9JnIiIChzcmNfcHRyX2wyKSwgW3NyY19wdHJfcjNdICI9JnIiIChzcmNfcHRyX3IzKQorICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgICAgIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgIG91dHB1dF9wdHJbMF0gPSBjbVtUZW1wMV07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzFdID0gY21bVGVtcDJdOworICAgICAgICAgICAgb3V0cHV0X3B0clsyXSA9IGNtW1RlbXAzXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbM10gPSBjbVtUZW1wNF07CisKKyAgICAgICAgICAgIHNyY19wdHIgKz0gODsKKyAgICAgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3BpdGNoOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDQgdGFwIGZpbHRlciAqLworCisgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyKTsKKworICAgICAgICBmb3IgKGkgPSAyOyBpLS07KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkbyBub3QgYWxsb3cgY29tcGlsZXIgdG8gcmVvcmRlciBpbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgICAgICBvdXRwdXRfcHRyWzBdID0gY21bVGVtcDFdOworICAgICAgICAgICAgb3V0cHV0X3B0clsxXSA9IGNtW1RlbXAyXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbMl0gPSBjbVtUZW1wM107CisgICAgICAgICAgICBvdXRwdXRfcHRyWzNdID0gY21bVGVtcDRdOworCisgICAgICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF9waXRjaDsKKworICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgICAgICBvdXRwdXRfcHRyWzBdID0gY21bVGVtcDFdOworICAgICAgICAgICAgb3V0cHV0X3B0clsxXSA9IGNtW1RlbXAyXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbMl0gPSBjbVtUZW1wM107CisgICAgICAgICAgICBvdXRwdXRfcHRyWzNdID0gY21bVGVtcDRdOworCisgICAgICAgICAgICBzcmNfcHRyICs9IDg7CisgICAgICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF9waXRjaDsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc184CisoCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1Qgc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBvdXRwdXRfcHRyLAorICAgIGludCBvdXRwdXRfcGl0Y2gsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgeW9mZnNldAorKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0LCBUZW1wNSwgVGVtcDYsIFRlbXA3LCBUZW1wODsKKyAgICB1bnNpZ25lZCBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYiwgdmVjdG9yNGE7CisKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfbDI7CisgICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX2wxOworICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl8wOworICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9yMTsKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfcjI7CisgICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX3IzOworICAgIHVuc2lnbmVkIGNoYXIgKmNtID0gZmZfY3JvcFRibCArIENST1BfV0lEVEg7CisKKyAgICB2ZWN0b3I0YSA9IDY0OworCisgICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNzW3lvZmZzZXRdWzBdOworICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzc1t5b2Zmc2V0XVsyXTsKKyAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc3NbeW9mZnNldF1bMV07CisKKyAgICBpZiAodmVjdG9yMWIpCisgICAgeworICAgICAgICAvKiA2IHRhcCBmaWx0ZXIgKi8KKworICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCisgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0cik7CisKKyAgICAgICAgZm9yIChpID0gb3V0cHV0X2hlaWdodDsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMjQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC03KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDkoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDI1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMV0sICAgICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAyNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDJdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTEzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTkoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMjcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAzXSwgICAgICAgJGFjMCwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLCBbVGVtcDNdICI9JnIiIChUZW1wMyksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLCBbc3JjX3B0cl9yM10gIj0mciIgKHNyY19wdHJfcjMpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgd2l0aCB2ZWN0b3JzIHBhaXJzICovCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAyMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAyOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMjkoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA1XSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0yKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDIyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDMwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAyMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAzMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDddLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wOF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXA0XSAiPSZyIiAoVGVtcDQpLCBbVGVtcDVdICI9JnIiIChUZW1wNSksCisgICAgICAgICAgICAgICAgICBbVGVtcDZdICI9JnIiIChUZW1wNiksIFtUZW1wN10gIj0mciIgKFRlbXA3KSwgW1RlbXA4XSAiPXIiIChUZW1wOCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLFtzcmNfcHRyX3IzXSAiPSZyIiAoc3JjX3B0cl9yMykKKyAgICAgICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCisgICAgICAgICAgICAgICAgICBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLCBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCisgICAgICAgICAgICBvdXRwdXRfcHRyWzBdID0gY21bVGVtcDFdOworICAgICAgICAgICAgb3V0cHV0X3B0clsxXSA9IGNtW1RlbXAyXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbMl0gPSBjbVtUZW1wM107CisgICAgICAgICAgICBvdXRwdXRfcHRyWzNdID0gY21bVGVtcDRdOworICAgICAgICAgICAgb3V0cHV0X3B0cls0XSA9IGNtW1RlbXA1XTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbNV0gPSBjbVtUZW1wNl07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzZdID0gY21bVGVtcDddOworICAgICAgICAgICAgb3V0cHV0X3B0cls3XSA9IGNtW1RlbXA4XTsKKworICAgICAgICAgICAgc3JjX3B0ciArPSA4OworICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCisKKyAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLworICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIpOworCisgICAgICAgIGZvciAoaSA9IG91dHB1dF9oZWlnaHQ7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC04KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC03KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDkoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMV0sICAgICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPXIiIChUZW1wMSksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMikKKyAgICAgICAgICAgICAgICA6IFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgc3JjX3B0cl9sMSA9IHNyY19wdHJbLTZdOworICAgICAgICAgICAgc3JjX3B0cl8wICA9IHNyY19wdHJbMl07CisgICAgICAgICAgICBzcmNfcHRyX3IxID0gc3JjX3B0clsxMF07CisgICAgICAgICAgICBzcmNfcHRyX3IyID0gc3JjX3B0clsxOF07CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAyXSAiPXIiIChUZW1wMikKKyAgICAgICAgICAgICAgICA6IFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gInIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gInIiIChzcmNfcHRyXzApLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICJyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiciIgKHNyY19wdHJfcjIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgc3JjX3B0cl9sMSA9IHNyY19wdHJbLTVdOworICAgICAgICAgICAgc3JjX3B0cl8wICA9IHNyY19wdHJbM107CisgICAgICAgICAgICBzcmNfcHRyX3IxID0gc3JjX3B0clsxMV07CisgICAgICAgICAgICBzcmNfcHRyX3IyID0gc3JjX3B0clsxOV07CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAzXSAiPXIiIChUZW1wMykKKyAgICAgICAgICAgICAgICA6IFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gInIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gInIiIChzcmNfcHRyXzApLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICJyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiciIgKHNyY19wdHJfcjIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgc3JjX3B0cl9sMSA9IHNyY19wdHJbLTRdOworICAgICAgICAgICAgc3JjX3B0cl8wICA9IHNyY19wdHJbNF07CisgICAgICAgICAgICBzcmNfcHRyX3IxID0gc3JjX3B0clsxMl07CisgICAgICAgICAgICBzcmNfcHRyX3IyID0gc3JjX3B0clsyMF07CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXA0XSAiPXIiIChUZW1wNCkKKyAgICAgICAgICAgICAgICA6IFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gInIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gInIiIChzcmNfcHRyXzApLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICJyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiciIgKHNyY19wdHJfcjIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgc3JjX3B0cl9sMSA9IHNyY19wdHJbLTNdOworICAgICAgICAgICAgc3JjX3B0cl8wICA9IHNyY19wdHJbNV07CisgICAgICAgICAgICBzcmNfcHRyX3IxID0gc3JjX3B0clsxM107CisgICAgICAgICAgICBzcmNfcHRyX3IyID0gc3JjX3B0clsyMV07CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNV0sICAgICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXA1XSAiPSZyIiAoVGVtcDUpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICJyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICJyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gInIiIChzcmNfcHRyX3IyKSwKKyAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHNyY19wdHJfbDEgPSBzcmNfcHRyWy0yXTsKKyAgICAgICAgICAgIHNyY19wdHJfMCAgPSBzcmNfcHRyWzZdOworICAgICAgICAgICAgc3JjX3B0cl9yMSA9IHNyY19wdHJbMTRdOworICAgICAgICAgICAgc3JjX3B0cl9yMiA9IHNyY19wdHJbMjJdOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDZdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtUZW1wNl0gIj1yIiAoVGVtcDYpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICJyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICJyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gInIiIChzcmNfcHRyX3IyKSwKKyAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHNyY19wdHJfbDEgPSBzcmNfcHRyWy0xXTsKKyAgICAgICAgICAgIHNyY19wdHJfMCAgPSBzcmNfcHRyWzddOworICAgICAgICAgICAgc3JjX3B0cl9yMSA9IHNyY19wdHJbMTVdOworICAgICAgICAgICAgc3JjX3B0cl9yMiA9IHNyY19wdHJbMjNdOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDddLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDhdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtUZW1wN10gIj0mciIgKFRlbXA3KSwgW1RlbXA4XSAiPXIiIChUZW1wOCkKKyAgICAgICAgICAgICAgICA6IFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gInIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gInIiIChzcmNfcHRyXzApLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICJyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiciIgKHNyY19wdHJfcjIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgIG91dHB1dF9wdHJbMF0gPSBjbVtUZW1wMV07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzFdID0gY21bVGVtcDJdOworICAgICAgICAgICAgb3V0cHV0X3B0clsyXSA9IGNtW1RlbXAzXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbM10gPSBjbVtUZW1wNF07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzRdID0gY21bVGVtcDVdOworICAgICAgICAgICAgb3V0cHV0X3B0cls1XSA9IGNtW1RlbXA2XTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbNl0gPSBjbVtUZW1wN107CisgICAgICAgICAgICBvdXRwdXRfcHRyWzddID0gY21bVGVtcDhdOworCisgICAgICAgICAgICBzcmNfcHRyICs9IDg7CisgICAgICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF9waXRjaDsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzczE2MQorKAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIHNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1Qgb3V0cHV0X3B0ciwKKyAgICBpbnQgb3V0cHV0X3BpdGNoLAorICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp2cDhfZmlsdGVyCispCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICBpbnQgVGVtcDEsIFRlbXAyLCBUZW1wMywgVGVtcDQsIFRlbXA1LCBUZW1wNiwgVGVtcDcsIFRlbXA4OworICAgIHVuc2lnbmVkIGludCB2ZWN0b3I0YTsKKyAgICB1bnNpZ25lZCBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYjsKKworICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9sMjsKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfbDE7CisgICAgdW5zaWduZWQgY2hhciBzcmNfcHRyXzA7CisgICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX3IxOworICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9yMjsKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfcjM7CisgICAgdW5zaWduZWQgY2hhciAqY20gPSBmZl9jcm9wVGJsICsgQ1JPUF9XSURUSDsKKworICAgIHZlY3RvcjRhID0gNjQ7CisKKyAgICB2ZWN0b3IxYiA9IHZwOF9maWx0ZXJbMF07CisgICAgdmVjdG9yMmIgPSB2cDhfZmlsdGVyWzJdOworICAgIHZlY3RvcjNiID0gdnA4X2ZpbHRlclsxXTsKKworICAgIGlmICh2ZWN0b3IxYiA9PSAwKQorICAgIHsKKyAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCisKKyAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLworICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIgKyAxNik7CisKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHVucm9sbGluZyBmb3IgbG9vcCAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDMzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDJdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA0XSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDVdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDIyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC05KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA3XSwgICAgICAgJGFjMSwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wOF0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPSZyIiAoVGVtcDQpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wNV0gIj0mciIgKFRlbXA1KSwgW1RlbXA2XSAiPSZyIiAoVGVtcDYpLAorICAgICAgICAgICAgICAgICAgICAgIFtUZW1wN10gIj0mciIgKFRlbXA3KSwgW1RlbXA4XSAiPXIiIChUZW1wOCksCisgICAgICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCisgICAgICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICI9JnIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICI9JnIiIChzcmNfcHRyX3IyKQorICAgICAgICAgICAgICAgICAgICA6IFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCisgICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICBvdXRwdXRfcHRyW2pdID0gY21bVGVtcDFdOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDFdID0gY21bVGVtcDJdOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDJdID0gY21bVGVtcDNdOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDNdID0gY21bVGVtcDRdOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDRdID0gY21bVGVtcDVdOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDVdID0gY21bVGVtcDZdOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDZdID0gY21bVGVtcDddOworICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiArIDddID0gY21bVGVtcDhdOworCisgICAgICAgICAgICAgICAgc3JjX3B0ciArPSA4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF9waXRjaDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiA0IHRhcCBmaWx0ZXIgKi8KKworICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCisgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIDE2KTsKKworICAgICAgICAvKiB1bnJvbGwgZm9yIGxvb3AgKi8KKyAgICAgICAgZm9yIChpID0gMTY7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0zMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDMyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDQ4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMzEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA0OSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTMwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMCwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDUxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1MiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDRdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTI3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA1XSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDIyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDU0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNl0sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1NSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDddLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wOF0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCisgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj0mciIgKFRlbXA0KSwKKyAgICAgICAgICAgICAgICAgIFtUZW1wNV0gIj0mciIgKFRlbXA1KSwgW1RlbXA2XSAiPSZyIiAoVGVtcDYpLAorICAgICAgICAgICAgICAgICAgW1RlbXA3XSAiPSZyIiAoVGVtcDcpLCBbVGVtcDhdICI9ciIgKFRlbXA4KSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAorICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICI9JnIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICI9JnIiIChzcmNfcHRyX3IyKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wyXSAiPSZyIiAoc3JjX3B0cl9sMiksW3NyY19wdHJfcjNdICI9JnIiIChzcmNfcHRyX3IzKQorICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKKyAgICAgICAgICAgICAgICAgIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgIG91dHB1dF9wdHJbMF0gPSBjbVtUZW1wMV07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzFdID0gY21bVGVtcDJdOworICAgICAgICAgICAgb3V0cHV0X3B0clsyXSA9IGNtW1RlbXAzXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbM10gPSBjbVtUZW1wNF07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzRdID0gY21bVGVtcDVdOworICAgICAgICAgICAgb3V0cHV0X3B0cls1XSA9IGNtW1RlbXA2XTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbNl0gPSBjbVtUZW1wN107CisgICAgICAgICAgICBvdXRwdXRfcHRyWzddID0gY21bVGVtcDhdOworCisgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgd2l0aCB2ZWN0b3JzIHBhaXJzICovCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA0MCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1NiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTIzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgNDEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC02KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDI2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDQyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDU4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA0MyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1OSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTIwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgNDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNjAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA0XSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0zKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDEzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDI5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDQ1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDYxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNV0sICAgICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAzMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA0NiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA2MiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDZdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTE3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMzEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgNDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNjMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA3XSwgICAgICAgJGFjMSwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDhdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAorICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9JnIiIChUZW1wNCksCisgICAgICAgICAgICAgICAgICBbVGVtcDVdICI9JnIiIChUZW1wNSksIFtUZW1wNl0gIj0mciIgKFRlbXA2KSwKKyAgICAgICAgICAgICAgICAgIFtUZW1wN10gIj0mciIgKFRlbXA3KSwgW1RlbXA4XSAiPXIiIChUZW1wOCksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCisgICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLCBbc3JjX3B0cl9yM10gIj0mciIgKHNyY19wdHJfcjMpCisgICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAorICAgICAgICAgICAgICAgICAgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBzcmNfcHRyICs9IDE2OworICAgICAgICAgICAgb3V0cHV0X3B0cls4XSA9IGNtW1RlbXAxXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbOV0gPSBjbVtUZW1wMl07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzEwXSA9IGNtW1RlbXAzXTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbMTFdID0gY21bVGVtcDRdOworICAgICAgICAgICAgb3V0cHV0X3B0clsxMl0gPSBjbVtUZW1wNV07CisgICAgICAgICAgICBvdXRwdXRfcHRyWzEzXSA9IGNtW1RlbXA2XTsKKyAgICAgICAgICAgIG91dHB1dF9wdHJbMTRdID0gY21bVGVtcDddOworICAgICAgICAgICAgb3V0cHV0X3B0clsxNV0gPSBjbVtUZW1wOF07CisKKyAgICAgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3BpdGNoOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0NHg0X2RzcHIyCisoCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1Qgc3JjX3B0ciwKKyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1QgZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpdGNoCispCit7CisgICAgdW5zaWduZWQgY2hhciBGRGF0YVs5ICogNF07IC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisgICAgdW5zaWduZWQgaW50IHBvcyA9IDE2OworCisgICAgLyogYml0IHBvc2l0b24gZm9yIGV4dHJhY3QgZnJvbSBhY2MgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJ3cmRzcCAgICAgICVbcG9zXSwgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiBbcG9zXSAiciIgKHBvcykKKyAgICApOworCisgICAgaWYgKHlvZmZzZXQpCisgICAgeworICAgICAgICAvKiBGaXJzdCBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc180KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCA5LCB4b2Zmc2V0LCA0KTsKKyAgICAgICAgLyogdGhlbiBmaWx0ZXIgdmVydGljYWx5Li4uICovCisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzczQoRkRhdGEgKyA4LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIHlvZmZzZXQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIC8qIGlmICh5b2Zmc3NldCA9PSAwKSB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyBzYXZlIGRhdGEgdG8gZHN0X3B0ciAqLworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc180KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgeG9mZnNldCwgZHN0X3BpdGNoKTsKK30KKworCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9kc3ByMgorKAorICAgIHVuc2lnbmVkIGNoYXIgICAqUkVTVFJJQ1Qgc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBkc3RfcHRyLAorICAgIGludCAgZHN0X3BpdGNoCispCit7CisKKyAgICB1bnNpZ25lZCBjaGFyIEZEYXRhWzEzICogOF07IC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisgICAgdW5zaWduZWQgaW50IHBvcywgVGVtcDEsIFRlbXAyOworCisgICAgcG9zID0gMTY7CisKKyAgICAvKiBiaXQgcG9zaXRvbiBmb3IgZXh0cmFjdCBmcm9tIGFjYyAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgIndyZHNwICAgICAgJVtwb3NdLCAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiBbcG9zXSAiciIgKHBvcykKKyAgICApOworCisgICAgaWYgKHlvZmZzZXQpCisgICAgeworCisgICAgICAgIHNyY19wdHIgPSBzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKKworICAgICAgICBpZiAoeG9mZnNldCkKKyAgICAgICAgICAgIC8qIGZpbHRlciAxLUQgaG9yaXpvbnRhbGx5Li4uICovCisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc184X2FsbChzcmNfcHRyLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLCB4b2Zmc2V0LCA4KTsKKworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDE2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDI0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDMyKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMzYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQwKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNDQoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQ4KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDU2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDY0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDcyKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNzYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDgwKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgODQoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDg4KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgOTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDk2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMTAwKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpCisgICAgICAgICAgICAgICAgOiBbRkRhdGFdICJyIiAoRkRhdGEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlsdGVyIHZlcnRpY2FseS4uLiAqLworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfOChGRGF0YSArIDE2LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIDgsIHlvZmZzZXQpOworICAgIH0KKworICAgIC8qIGlmICh5b2Zmc3NldCA9PSAwKSB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyBzYXZlIGRhdGEgdG8gZHN0X3B0ciAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh4b2Zmc2V0KQorICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfOF9hbGwoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIHhvZmZzZXQsIGRzdF9waXRjaCk7CisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjb3B5IGZyb20gc3JjIGJ1ZmZlciB0byBkc3QgYnVmZmVyICovCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA0KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgOCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAxMiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMTYoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMjQoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyOCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgJVtzcmNfcGl4ZWxzX3Blcl9saW5lXSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMzIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAzNiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNDAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA0NCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNDgoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA1MiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNTYoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA2MCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMikKKyAgICAgICAgICAgICAgICA6IFtkc3RfcHRyXSAiciIgKGRzdF9wdHIpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2RzcHIyCisoCisgICAgdW5zaWduZWQgY2hhciAgICpSRVNUUklDVCBzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIGRzdF9wdHIsCisgICAgaW50ICBkc3RfcGl0Y2gKKykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIEZEYXRhWzkgKiA4XTsgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKyAgICB1bnNpZ25lZCBpbnQgcG9zLCBUZW1wMSwgVGVtcDI7CisKKyAgICBwb3MgPSAxNjsKKworICAgIC8qIGJpdCBwb3NpdG9uIGZvciBleHRyYWN0IGZyb20gYWNjICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAid3Jkc3AgICAgICAlW3Bvc10sICAgICAxICAgICAgICAgICBcblx0IgorICAgICAgICA6CisgICAgICAgIDogW3Bvc10gInIiIChwb3MpCisgICAgKTsKKworICAgIGlmICh5b2Zmc2V0KQorICAgIHsKKworICAgICAgICBzcmNfcHRyID0gc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSk7CisKKyAgICAgICAgaWYgKHhvZmZzZXQpCisgICAgICAgICAgICAvKiBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfOF9hbGwoc3JjX3B0ciwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCB4b2Zmc2V0LCA4KTsKKworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KKyAgICAgICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDE2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDI0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDMyKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMzYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQwKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNDQoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQ4KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDU2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDY0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpCisgICAgICAgICAgICAgICAgOiBbRkRhdGFdICJyIiAoRkRhdGEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlsdGVyIHZlcnRpY2FseS4uLiAqLworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfOChGRGF0YSArIDE2LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDQsIDgsIHlvZmZzZXQpOworICAgIH0KKworICAgIC8qIGlmICh5b2Zmc3NldCA9PSAwKSB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyBzYXZlIGRhdGEgdG8gZHN0X3B0ciAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh4b2Zmc2V0KQorICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfOF9hbGwoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHhvZmZzZXQsIGRzdF9waXRjaCk7CisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjb3B5IGZyb20gc3JjIGJ1ZmZlciB0byBkc3QgYnVmZmVyICovCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA0KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgOCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAxMiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMTYoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgorCisgICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMjQoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyOCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMikKKyAgICAgICAgICAgICAgICA6IFtkc3RfcHRyXSAiciIgKGRzdF9wdHIpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKKyAgICAgICAgICAgICAgICAgIFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfZHNwcjIKKygKKyAgICB1bnNpZ25lZCBjaGFyICAgKlJFU1RSSUNUIHNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1QgZHN0X3B0ciwKKyAgICBpbnQgIGRzdF9waXRjaAorKQoreworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpWRmlsdGVyOworICAgIHVuc2lnbmVkIGNoYXIgRkRhdGFbMjEgKiAxNl07IC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisgICAgdW5zaWduZWQgaW50IHBvczsKKworICAgIFZGaWx0ZXIgPSBzdWJfcGVsX2ZpbHRlcnNzW3lvZmZzZXRdOworCisgICAgcG9zID0gMTY7CisKKyAgICAvKiBiaXQgcG9zaXRvbiBmb3IgZXh0cmFjdCBmcm9tIGFjYyAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgIndyZHNwICAgICAgJVtwb3NdLCAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOgorICAgICAgICA6IFtwb3NdICJyIiAocG9zKQorICAgICk7CisKKyAgICBpZiAoeW9mZnNldCkKKyAgICB7CisKKyAgICAgICAgc3JjX3B0ciA9IHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpOworCisgICAgICAgIHN3aXRjaCAoeG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIC8qIDYgdGFwIGZpbHRlciAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MxNl82dGFwKHNyY19wdHIsIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCB4b2Zmc2V0LCAxNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBvbmx5IGNvcHkgYnVmZmVyICovCisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzAoc3JjX3B0ciwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzR0YXAoc3JjX3B0ciwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCB4b2Zmc2V0LCB5b2Zmc2V0LCBkc3RfcHRyLCBkc3RfcGl0Y2gpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBmaWx0ZXIgdmVydGljYWx5Li4uICovCisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzczE2MShGRGF0YSArIDMyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIFZGaWx0ZXIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBpZiAoeW9mZnNzZXQgPT0gMCkgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Mgc2F2ZSBkYXRhIHRvIGRzdF9wdHIgKi8KKyAgICAgICAgc3dpdGNoICh4b2Zmc2V0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAvKiA2IHRhcCBmaWx0ZXIgKi8KKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzMTZfNnRhcChzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCB4b2Zmc2V0LCBkc3RfcGl0Y2gpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzR0YXAoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIsIGRzdF9waXRjaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9taXBzL2RzcHIyL2lkY3RfYmxrX2RzcHIyLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9taXBzL2RzcHIyL2lkY3RfYmxrX2RzcHIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwZWJkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL21pcHMvZHNwcjIvaWRjdF9ibGtfZHNwcjIuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKworI2lmIEhBVkVfRFNQUjIKKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2RzcHIyCisoc2hvcnQgKnEsIHNob3J0ICpkcSwKKyB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCplb2JzKysgPiAxKQorICAgICAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX2RzcHIyKHEsIGRxLCBkc3QsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfZHNwcjIocVswXSpkcVswXSwgZHN0LCBzdHJpZGUsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcSAgICs9IDE2OworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBkc3QgKz0gNCAqIHN0cmlkZSAtIDE2OworICAgIH0KK30KKwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19kc3ByMgorKHNob3J0ICpxLCBzaG9ydCAqZHEsCisgdW5zaWduZWQgY2hhciAqZHN0dSwgdW5zaWduZWQgY2hhciAqZHN0diwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKmVvYnMrKyA+IDEpCisgICAgICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfZHNwcjIocSwgZHEsIGRzdHUsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfZHNwcjIocVswXSpkcVswXSwgZHN0dSwgc3RyaWRlLCBkc3R1LCBzdHJpZGUpOworICAgICAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBxICAgICs9IDE2OworICAgICAgICAgICAgZHN0dSArPSA0OworICAgICAgICB9CisKKyAgICAgICAgZHN0dSArPSA0ICogc3RyaWRlIC0gODsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCplb2JzKysgPiAxKQorICAgICAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX2RzcHIyKHEsIGRxLCBkc3R2LCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX2RzcHIyKHFbMF0qZHFbMF0sIGRzdHYsIHN0cmlkZSwgZHN0diwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcSAgICArPSAxNjsKKyAgICAgICAgICAgIGRzdHYgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdHYgKz0gNCAqIHN0cmlkZSAtIDg7CisgICAgfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9pZGN0bGxtX2RzcHIyLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9taXBzL2RzcHIyL2lkY3RsbG1fZHNwcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI3OTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9pZGN0bGxtX2RzcHIyLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInZweF9ydGNkLmgiCisKKyNpZiBIQVZFX0RTUFIyCisjZGVmaW5lIENST1BfV0lEVEggMjU2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5vdGVzOgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2IGJpdCBmaXhlZCBwb2ludCB2ZXJzaW9uIG9mIHR3byBtdWx0aXBseQorICogY29uc3RhbnRzOgorICogICAgICAgICAxLiAgIHNxcnQoMikgKiBjb3MgKHBpLzgpCisgKiAgICAgICAgIDIuICAgc3FydCgyKSAqIHNpbiAocGkvOCkKKyAqIFNpbmNlIHRoZSBmaXJzdCBjb25zdGFudCBpcyBiaWdnZXIgdGhhbiAxLCB0byBtYWludGFpbiB0aGUgc2FtZSAxNiBiaXQKKyAqIGZpeGVkIHBvaW50IHByZWNpc2lvbiBhcyB0aGUgc2Vjb25kIG9uZSwgd2UgdXNlIGEgdHJpY2sgb2YKKyAqICAgICAgICAgeCAqIGEgPSB4ICsgeCooYS0xKQorICogc28KKyAqICAgICAgICAgeCAqIHNxcnQoMikgKiBjb3MgKHBpLzgpID0geCArIHggKiAoc3FydCgyKSAqY29zKHBpLzgpLTEpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdW5zaWduZWQgY2hhciBmZl9jcm9wVGJsWzI1NiArIDIgKiBDUk9QX1dJRFRIXTsKK3N0YXRpYyBjb25zdCBpbnQgY29zcGk4c3FydDJtaW51czEgPSAyMDA5MTsKK3N0YXRpYyBjb25zdCBpbnQgc2lucGk4c3FydDIgICAgICA9IDM1NDY4OworCitpbmxpbmUgdm9pZCBwcmVmZXRjaF9sb2FkX3Nob3J0KHNob3J0ICpzcmMpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicHJlZiAgIDAsICAwKCVbc3JjXSkgICBcblx0IgorICAgICAgICA6CisgICAgICAgIDogW3NyY10gInIiIChzcmMpCisgICAgKTsKK30KKwordm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV9kc3ByMihzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKQoreworICAgIGludCByLCBjOworICAgIGludCBhMSwgYjEsIGMxLCBkMTsKKyAgICBzaG9ydCBvdXRwdXRbMTZdOworICAgIHNob3J0ICppcCA9IGlucHV0OworICAgIHNob3J0ICpvcCA9IG91dHB1dDsKKyAgICBpbnQgdGVtcDEsIHRlbXAyOworICAgIGludCBzaG9ydHBpdGNoID0gNDsKKworICAgIGludCBjMiwgZDI7CisgICAgaW50IHRlbXAzLCB0ZW1wNDsKKyAgICB1bnNpZ25lZCBjaGFyICpjbSA9IGZmX2Nyb3BUYmwgKyBDUk9QX1dJRFRIOworCisgICAgLyogcHJlcGFyZSBkYXRhIGZvciBsb2FkICovCisgICAgcHJlZmV0Y2hfbG9hZF9zaG9ydChpcCArIDgpOworCisgICAgLyogZmlyc3QgbG9vcCBpcyB1bnJvbGxlZCAqLworICAgIGExID0gaXBbMF0gKyBpcFs4XTsKKyAgICBiMSA9IGlwWzBdIC0gaXBbOF07CisKKyAgICB0ZW1wMSA9IChpcFs0XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICB0ZW1wMiA9IGlwWzEyXSArICgoaXBbMTJdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICBjMSA9IHRlbXAxIC0gdGVtcDI7CisKKyAgICB0ZW1wMSA9IGlwWzRdICsgKChpcFs0XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgdGVtcDIgPSAoaXBbMTJdICogc2lucGk4c3FydDIpID4+IDE2OworICAgIGQxID0gdGVtcDEgKyB0ZW1wMjsKKworICAgIHRlbXAzID0gKGlwWzVdICogc2lucGk4c3FydDIpID4+IDE2OworICAgIHRlbXA0ID0gaXBbMTNdICsgKChpcFsxM10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIGMyID0gdGVtcDMgLSB0ZW1wNDsKKworICAgIHRlbXAzID0gaXBbNV0gKyAoKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICB0ZW1wNCA9IChpcFsxM10gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgZDIgPSB0ZW1wMyArIHRlbXA0OworCisgICAgb3BbMF0gPSBhMSArIGQxOworICAgIG9wWzEyXSA9IGExIC0gZDE7CisgICAgb3BbNF0gPSBiMSArIGMxOworICAgIG9wWzhdID0gYjEgLSBjMTsKKworICAgIGExID0gaXBbMV0gKyBpcFs5XTsKKyAgICBiMSA9IGlwWzFdIC0gaXBbOV07CisKKyAgICBvcFsxXSA9IGExICsgZDI7CisgICAgb3BbMTNdID0gYTEgLSBkMjsKKyAgICBvcFs1XSA9IGIxICsgYzI7CisgICAgb3BbOV0gPSBiMSAtIGMyOworCisgICAgYTEgPSBpcFsyXSArIGlwWzEwXTsKKyAgICBiMSA9IGlwWzJdIC0gaXBbMTBdOworCisgICAgdGVtcDEgPSAoaXBbNl0gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgdGVtcDIgPSBpcFsxNF0gKyAoKGlwWzE0XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgYzEgPSB0ZW1wMSAtIHRlbXAyOworCisgICAgdGVtcDEgPSBpcFs2XSArICgoaXBbNl0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIHRlbXAyID0gKGlwWzE0XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICBkMSA9IHRlbXAxICsgdGVtcDI7CisKKyAgICB0ZW1wMyA9IChpcFs3XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICB0ZW1wNCA9IGlwWzE1XSArICgoaXBbMTVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICBjMiA9IHRlbXAzIC0gdGVtcDQ7CisKKyAgICB0ZW1wMyA9IGlwWzddICsgKChpcFs3XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgdGVtcDQgPSAoaXBbMTVdICogc2lucGk4c3FydDIpID4+IDE2OworICAgIGQyID0gdGVtcDMgKyB0ZW1wNDsKKworICAgIG9wWzJdID0gYTEgKyBkMTsKKyAgICBvcFsxNF0gPSBhMSAtIGQxOworICAgIG9wWzZdID0gYjEgKyBjMTsKKyAgICBvcFsxMF0gPSBiMSAtIGMxOworCisgICAgYTEgPSBpcFszXSArIGlwWzExXTsKKyAgICBiMSA9IGlwWzNdIC0gaXBbMTFdOworCisgICAgb3BbM10gPSBhMSArIGQyOworICAgIG9wWzE1XSA9IGExIC0gZDI7CisgICAgb3BbN10gPSBiMSArIGMyOworICAgIG9wWzExXSA9IGIxIC0gYzI7CisKKyAgICBpcCA9IG91dHB1dDsKKworICAgIC8qIHByZXBhcmUgZGF0YSBmb3IgbG9hZCAqLworICAgIHByZWZldGNoX2xvYWRfc2hvcnQoaXAgKyBzaG9ydHBpdGNoKTsKKworICAgIC8qIHNlY29uZCBsb29wIGlzIHVucm9sbGVkICovCisgICAgYTEgPSBpcFswXSArIGlwWzJdOworICAgIGIxID0gaXBbMF0gLSBpcFsyXTsKKworICAgIHRlbXAxID0gKGlwWzFdICogc2lucGk4c3FydDIpID4+IDE2OworICAgIHRlbXAyID0gaXBbM10gKyAoKGlwWzNdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICBjMSA9IHRlbXAxIC0gdGVtcDI7CisKKyAgICB0ZW1wMSA9IGlwWzFdICsgKChpcFsxXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisgICAgdGVtcDIgPSAoaXBbM10gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgZDEgPSB0ZW1wMSArIHRlbXAyOworCisgICAgdGVtcDMgPSAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgdGVtcDQgPSBpcFs3XSArICgoaXBbN10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIGMyID0gdGVtcDMgLSB0ZW1wNDsKKworICAgIHRlbXAzID0gaXBbNV0gKyAoKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICB0ZW1wNCA9IChpcFs3XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICBkMiA9IHRlbXAzICsgdGVtcDQ7CisKKyAgICBvcFswXSA9IChhMSArIGQxICsgNCkgPj4gMzsKKyAgICBvcFszXSA9IChhMSAtIGQxICsgNCkgPj4gMzsKKyAgICBvcFsxXSA9IChiMSArIGMxICsgNCkgPj4gMzsKKyAgICBvcFsyXSA9IChiMSAtIGMxICsgNCkgPj4gMzsKKworICAgIGExID0gaXBbNF0gKyBpcFs2XTsKKyAgICBiMSA9IGlwWzRdIC0gaXBbNl07CisKKyAgICBvcFs0XSA9IChhMSArIGQyICsgNCkgPj4gMzsKKyAgICBvcFs3XSA9IChhMSAtIGQyICsgNCkgPj4gMzsKKyAgICBvcFs1XSA9IChiMSArIGMyICsgNCkgPj4gMzsKKyAgICBvcFs2XSA9IChiMSAtIGMyICsgNCkgPj4gMzsKKworICAgIGExID0gaXBbOF0gKyBpcFsxMF07CisgICAgYjEgPSBpcFs4XSAtIGlwWzEwXTsKKworICAgIHRlbXAxID0gKGlwWzldICogc2lucGk4c3FydDIpID4+IDE2OworICAgIHRlbXAyID0gaXBbMTFdICsgKChpcFsxMV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIGMxID0gdGVtcDEgLSB0ZW1wMjsKKworICAgIHRlbXAxID0gaXBbOV0gKyAoKGlwWzldICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKyAgICB0ZW1wMiA9IChpcFsxMV0gKiBzaW5waThzcXJ0MikgPj4gMTY7CisgICAgZDEgPSB0ZW1wMSArIHRlbXAyOworCisgICAgdGVtcDMgPSAoaXBbMTNdICogc2lucGk4c3FydDIpID4+IDE2OworICAgIHRlbXA0ID0gaXBbMTVdICsgKChpcFsxNV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIGMyID0gdGVtcDMgLSB0ZW1wNDsKKworICAgIHRlbXAzID0gaXBbMTNdICsgKChpcFsxM10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworICAgIHRlbXA0ID0gKGlwWzE1XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKKyAgICBkMiA9IHRlbXAzICsgdGVtcDQ7CisKKyAgICBvcFs4XSA9IChhMSArIGQxICsgNCkgPj4gMzsKKyAgICBvcFsxMV0gPSAoYTEgLSBkMSArIDQpID4+IDM7CisgICAgb3BbOV0gPSAoYjEgKyBjMSArIDQpID4+IDM7CisgICAgb3BbMTBdID0gKGIxIC0gYzEgKyA0KSA+PiAzOworCisgICAgYTEgPSBpcFsxMl0gKyBpcFsxNF07CisgICAgYjEgPSBpcFsxMl0gLSBpcFsxNF07CisKKyAgICBvcFsxMl0gPSAoYTEgKyBkMiArIDQpID4+IDM7CisgICAgb3BbMTVdID0gKGExIC0gZDIgKyA0KSA+PiAzOworICAgIG9wWzEzXSA9IChiMSArIGMyICsgNCkgPj4gMzsKKyAgICBvcFsxNF0gPSAoYjEgLSBjMiArIDQpID4+IDM7CisKKyAgICBpcCA9IG91dHB1dDsKKworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydCBhID0gaXBbY10gKyBwcmVkX3B0cltjXSA7CisgICAgICAgICAgICBkc3RfcHRyW2NdID0gY21bYV0gOworICAgICAgICB9CisKKyAgICAgICAgaXAgKz0gNDsKKyAgICAgICAgZHN0X3B0ciArPSBkc3Rfc3RyaWRlOworICAgICAgICBwcmVkX3B0ciArPSBwcmVkX3N0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfZHNwcjIoc2hvcnQgaW5wdXRfZGMsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLCBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBkc3Rfc3RyaWRlKQoreworICAgIGludCBhMTsKKyAgICBpbnQgaSwgYWJzYTE7CisgICAgaW50IHQyLCB2ZWN0b3JfYTEsIHZlY3Rvcl9hOworCisgICAgLyogYTEgPSAoKGlucHV0X2RjICsgNCkgPj4gMyk7ICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAiYWRkaSAgJVthMV0sICVbaW5wdXRfZGNdLCA0ICAgXG5cdCIKKyAgICAgICAgInNyYSAgICVbYTFdLCAlW2ExXSwgICAgICAgMyAgIFxuXHQiCisgICAgICAgIDogW2ExXSAiPXIiIChhMSkKKyAgICAgICAgOiBbaW5wdXRfZGNdICJyIiAoaW5wdXRfZGMpCisgICAgKTsKKworICAgIGlmIChhMSA8IDApCisgICAgeworICAgICAgICAvKiB1c2UgcXVhZC1ieXRlCisgICAgICAgICAqIGlucHV0IGFuZCBvdXRwdXQgbWVtb3J5IGFyZSBmb3VyIGJ5dGUgYWxpZ25lZAorICAgICAgICAgKi8KKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgImFicyAgICAgICAgJVthYnNhMV0sICAgICAlW2ExXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicmVwbHYucWIgICAlW3ZlY3Rvcl9hMV0sICVbYWJzYTFdICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Fic2ExXSAiPXIiIChhYnNhMSksIFt2ZWN0b3JfYTFdICI9ciIgKHZlY3Rvcl9hMSkKKyAgICAgICAgICAgIDogW2ExXSAiciIgKGExKQorICAgICAgICApOworCisgICAgICAgIC8qIHVzZSAoYTEgLSBwcmVkcHRyW2NdKSBpbnN0ZWFkIGExICsgcHJlZHB0cltjXSAqLworICAgICAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgICAgICB7CisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgImx3ICAgICAgICAgICAgICVbdDJdLCAgICAgICAwKCVbcHJlZF9wdHJdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICVbcHJlZF9wdHJdLCAlW3ByZWRfcHRyXSwgICAgJVtwcmVkX3N0cmlkZV0gICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN1YnVfcy5xYiAgICAgICVbdmVjdG9yX2FdLCAlW3QyXSwgICAgICAgICAgJVt2ZWN0b3JfYTFdICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgICAgICAgICVbdmVjdG9yX2FdLCAwKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICVbZHN0X3B0cl0sICAlW2RzdF9wdHJdLCAgICAgJVtkc3Rfc3RyaWRlXSAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbdDJdICI9JnIiICh0MiksIFt2ZWN0b3JfYV0gIj0mciIgKHZlY3Rvcl9hKSwKKyAgICAgICAgICAgICAgICAgIFtkc3RfcHRyXSAiKyZyIiAoZHN0X3B0ciksIFtwcmVkX3B0cl0gIismciIgKHByZWRfcHRyKQorICAgICAgICAgICAgICAgIDogW2RzdF9zdHJpZGVdICJyIiAoZHN0X3N0cmlkZSksIFtwcmVkX3N0cmlkZV0gInIiIChwcmVkX3N0cmlkZSksIFt2ZWN0b3JfYTFdICJyIiAodmVjdG9yX2ExKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiB1c2UgcXVhZC1ieXRlCisgICAgICAgICAqIGlucHV0IGFuZCBvdXRwdXQgbWVtb3J5IGFyZSBmb3VyIGJ5dGUgYWxpZ25lZAorICAgICAgICAgKi8KKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgInJlcGx2LnFiICAgICAgICVbdmVjdG9yX2ExXSwgJVthMV0gICAgIFxuXHQiCisgICAgICAgICAgICA6IFt2ZWN0b3JfYTFdICI9ciIgKHZlY3Rvcl9hMSkKKyAgICAgICAgICAgIDogW2ExXSAiciIgKGExKQorICAgICAgICApOworCisgICAgICAgIGZvciAoaSA9IDQ7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAibHcgICAgICAgICAgICAgJVt0Ml0sICAgICAgIDAoJVtwcmVkX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlW3ByZWRfcHRyXSwgJVtwcmVkX3B0cl0sICAgICVbcHJlZF9zdHJpZGVdIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHVfcy5xYiAgICAgICVbdmVjdG9yX2FdLCAlW3ZlY3Rvcl9hMV0sICAgJVt0Ml0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAgICAgICAgJVt2ZWN0b3JfYV0sIDAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlW2RzdF9wdHJdLCAgJVtkc3RfcHRyXSwgICAgICVbZHN0X3N0cmlkZV0gIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbdDJdICI9JnIiICh0MiksIFt2ZWN0b3JfYV0gIj0mciIgKHZlY3Rvcl9hKSwKKyAgICAgICAgICAgICAgICAgIFtkc3RfcHRyXSAiKyZyIiAoZHN0X3B0ciksIFtwcmVkX3B0cl0gIismciIgKHByZWRfcHRyKQorICAgICAgICAgICAgICAgIDogW2RzdF9zdHJpZGVdICJyIiAoZHN0X3N0cmlkZSksIFtwcmVkX3N0cmlkZV0gInIiIChwcmVkX3N0cmlkZSksIFt2ZWN0b3JfYTFdICJyIiAodmVjdG9yX2ExKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfZHNwcjIoc2hvcnQgKmlucHV0LCBzaG9ydCAqbWJfZHFjb2VmZikKK3sKKyAgICBzaG9ydCBvdXRwdXRbMTZdOworICAgIGludCBpOworICAgIGludCBhMSwgYjEsIGMxLCBkMTsKKyAgICBpbnQgYTIsIGIyLCBjMiwgZDI7CisgICAgc2hvcnQgKmlwID0gaW5wdXQ7CisgICAgc2hvcnQgKm9wID0gb3V0cHV0OworCisgICAgcHJlZmV0Y2hfbG9hZF9zaG9ydChpcCk7CisKKyAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgIHsKKyAgICAgICAgYTEgPSBpcFswXSArIGlwWzEyXTsKKyAgICAgICAgYjEgPSBpcFs0XSArIGlwWzhdOworICAgICAgICBjMSA9IGlwWzRdIC0gaXBbOF07CisgICAgICAgIGQxID0gaXBbMF0gLSBpcFsxMl07CisKKyAgICAgICAgb3BbMF0gPSBhMSArIGIxOworICAgICAgICBvcFs0XSA9IGMxICsgZDE7CisgICAgICAgIG9wWzhdID0gYTEgLSBiMTsKKyAgICAgICAgb3BbMTJdID0gZDEgLSBjMTsKKworICAgICAgICBpcCsrOworICAgICAgICBvcCsrOworICAgIH0KKworICAgIGlwID0gb3V0cHV0OworICAgIG9wID0gb3V0cHV0OworCisgICAgcHJlZmV0Y2hfbG9hZF9zaG9ydChpcCk7CisKKyAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgIHsKKyAgICAgICAgYTEgPSBpcFswXSArIGlwWzNdICsgMzsKKyAgICAgICAgYjEgPSBpcFsxXSArIGlwWzJdOworICAgICAgICBjMSA9IGlwWzFdIC0gaXBbMl07CisgICAgICAgIGQxID0gaXBbMF0gLSBpcFszXSArIDM7CisKKyAgICAgICAgYTIgPSBhMSArIGIxOworICAgICAgICBiMiA9IGQxICsgYzE7CisgICAgICAgIGMyID0gYTEgLSBiMTsKKyAgICAgICAgZDIgPSBkMSAtIGMxOworCisgICAgICAgIG9wWzBdID0gYTIgPj4gMzsKKyAgICAgICAgb3BbMV0gPSBiMiA+PiAzOworICAgICAgICBvcFsyXSA9IGMyID4+IDM7CisgICAgICAgIG9wWzNdID0gZDIgPj4gMzsKKworICAgICAgICBpcCArPSA0OworICAgICAgICBvcCArPSA0OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgbWJfZHFjb2VmZltpICogMTZdID0gb3V0cHV0W2ldOworICAgIH0KK30KKwordm9pZCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfZHNwcjIoc2hvcnQgKmlucHV0LCBzaG9ydCAqbWJfZHFjb2VmZikKK3sKKyAgICBpbnQgYTE7CisKKyAgICBhMSA9ICgoaW5wdXRbMF0gKyAzKSA+PiAzKTsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInNoICAgICAgICAgICAgICVbYTFdLCAwKCVbbWJfZHFjb2VmZl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAgICAgJVthMV0sIDMyKCVbbWJfZHFjb2VmZl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICAgICAlW2ExXSwgNjQoJVttYl9kcWNvZWZmXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgICAgICVbYTFdLCA5NiglW21iX2RxY29lZmZdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAgICAgJVthMV0sIDEyOCglW21iX2RxY29lZmZdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICAgICAlW2ExXSwgMTYwKCVbbWJfZHFjb2VmZl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgICAgICVbYTFdLCAxOTIoJVttYl9kcWNvZWZmXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAgICAgJVthMV0sIDIyNCglW21iX2RxY29lZmZdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICAgICAlW2ExXSwgMjU2KCVbbWJfZHFjb2VmZl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgICAgICVbYTFdLCAyODgoJVttYl9kcWNvZWZmXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAgICAgJVthMV0sIDMyMCglW21iX2RxY29lZmZdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICAgICAlW2ExXSwgMzUyKCVbbWJfZHFjb2VmZl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgICAgICVbYTFdLCAzODQoJVttYl9kcWNvZWZmXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAgICAgJVthMV0sIDQxNiglW21iX2RxY29lZmZdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICAgICAlW2ExXSwgNDQ4KCVbbWJfZHFjb2VmZl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgICAgICVbYTFdLCA0ODAoJVttYl9kcWNvZWZmXSkgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDoKKyAgICAgICAgOiBbYTFdICJyIiAoYTEpLCBbbWJfZHFjb2VmZl0gInIiIChtYl9kcWNvZWZmKQorICAgICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9sb29wZmlsdGVyX2ZpbHRlcnNfZHNwcjIuYyBiL2xpYnZweC92cDgvY29tbW9uL21pcHMvZHNwcjIvbG9vcGZpbHRlcl9maWx0ZXJzX2RzcHIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlNWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL21pcHMvZHNwcjIvbG9vcGZpbHRlcl9maWx0ZXJzX2RzcHIyLmMKQEAgLTAsMCArMSwyNjIyIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKKworI2lmIEhBVkVfRFNQUjIKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKKworLyogcHJlZmV0Y2ggZGF0YSBmb3IgbG9hZCAqLworaW5saW5lIHZvaWQgcHJlZmV0Y2hfbG9hZF9sZih1bnNpZ25lZCBjaGFyICpzcmMpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicHJlZiAgIDAsICAwKCVbc3JjXSkgICBcblx0IgorICAgICAgICA6CisgICAgICAgIDogW3NyY10gInIiIChzcmMpCisgICAgKTsKK30KKworCisvKiBwcmVmZXRjaCBkYXRhIGZvciBzdG9yZSAqLworaW5saW5lIHZvaWQgcHJlZmV0Y2hfc3RvcmVfbGYodW5zaWduZWQgY2hhciAqZHN0KQoreworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInByZWYgICAxLCAgMCglW2RzdF0pICAgXG5cdCIKKyAgICAgICAgOgorICAgICAgICA6IFtkc3RdICJyIiAoZHN0KQorICAgICk7Cit9CisKKy8qIHByb2Nlc3NpbmcgNCBwaXhlbHMgYXQgdGhlIHNhbWUgdGltZQorICogY29tcHV0ZSBoZXYgYW5kIG1hc2sgaW4gdGhlIHNhbWUgZnVuY3Rpb24KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzCisoCisgICAgdWludDMyX3QgbGltaXQsCisgICAgdWludDMyX3QgZmxpbWl0LAorICAgIHVpbnQzMl90IHAxLAorICAgIHVpbnQzMl90IHAwLAorICAgIHVpbnQzMl90IHAzLAorICAgIHVpbnQzMl90IHAyLAorICAgIHVpbnQzMl90IHEwLAorICAgIHVpbnQzMl90IHExLAorICAgIHVpbnQzMl90IHEyLAorICAgIHVpbnQzMl90IHEzLAorICAgIHVpbnQzMl90IHRocmVzaCwKKyAgICB1aW50MzJfdCAqaGV2LAorICAgIHVpbnQzMl90ICptYXNrCispCit7CisgICAgdWludDMyX3QgYywgciwgcjMsIHJfazsKKyAgICB1aW50MzJfdCBzMSwgczIsIHMzOworICAgIHVpbnQzMl90IG9uZXMgPSAweEZGRkZGRkZGOworICAgIHVpbnQzMl90IGhldjE7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgIC8qIG1hc2sgfD0gKGFicyhwMyAtIHAyKSA+IGxpbWl0KSAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AzXSwgICAgICVbcDJdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3AyXSwgICAgICVbcDNdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAkMCwgICAgICAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIC8qIG1hc2sgfD0gKGFicyhwMiAtIHAxKSA+IGxpbWl0KSAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AyXSwgICAgICVbcDFdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3AxXSwgICAgICVbcDJdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIC8qIG1hc2sgfD0gKGFicyhwMSAtIHAwKSA+IGxpbWl0KQorICAgICAgICAgKiBoZXYgIHw9IChhYnMocDEgLSBwMCkgPiB0aHJlc2gpCisgICAgICAgICAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AxXSwgICAgICVbcDBdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3AwXSwgICAgICVbcDFdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW3RocmVzaF0sICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyM10sICAkMCwgICAgICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIC8qIG1hc2sgfD0gKGFicyhxMSAtIHEwKSA+IGxpbWl0KQorICAgICAgICAgKiBoZXYgIHw9IChhYnMocTEgLSBxMCkgPiB0aHJlc2gpCisgICAgICAgICAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3ExXSwgICAgICVbcTBdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3EwXSwgICAgICVbcTFdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW3RocmVzaF0sICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyM10sICAlW3IzXSwgICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIC8qIG1hc2sgfD0gKGFicyhxMiAtIHExKSA+IGxpbWl0KSAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3EyXSwgICAgICVbcTFdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3ExXSwgICAgICVbcTJdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAgICAgICAgJVtyM10sICAgICVbcjNdLCAgICAyNCAgICAgICAgICBcblx0IgorCisgICAgICAgIC8qIG1hc2sgfD0gKGFicyhxMyAtIHEyKSA+IGxpbWl0KSAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3EzXSwgICAgICVbcTJdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3EyXSwgICAgICVbcTNdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIDogW2NdICI9JnIiIChjKSwgW3Jfa10gIj0mciIgKHJfayksCisgICAgICAgICAgW3JdICI9JnIiIChyKSwgW3IzXSAiPSZyIiAocjMpCisgICAgICAgIDogW2xpbWl0XSAiciIgKGxpbWl0KSwgW3AzXSAiciIgKHAzKSwgW3AyXSAiciIgKHAyKSwKKyAgICAgICAgICBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApLCBbcTFdICJyIiAocTEpLCBbcTBdICJyIiAocTApLAorICAgICAgICAgIFtxMl0gInIiIChxMiksIFtxM10gInIiIChxMyksIFt0aHJlc2hdICJyIiAodGhyZXNoKQorICAgICk7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgIC8qIGFicyhwMCAtIHEwKSAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AwXSwgICAgICVbcTBdICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3EwXSwgICAgICVbcDBdICAgICAgICBcblx0IgorICAgICAgICAid3Jkc3AgICAgICAgICAgJVtyM10gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtzMV0sICAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIC8qIGFicyhwMSAtIHExKSAqLworICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAgJVtwMV0sICAgICVbcTFdICAgICAgICBcblx0IgorICAgICAgICAiYWRkdV9zLnFiICAgICAgJVtzM10sICAgJVtzMV0sICAgICVbczFdICAgICAgICBcblx0IgorICAgICAgICAicGljay5xYiAgICAgICAgJVtoZXYxXSwgJVtvbmVzXSwgICQwICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAgJVtxMV0sICAgICVbcDFdICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtzMl0sICAgJVtyX2tdLCAgICVbY10gICAgICAgICBcblx0IgorCisgICAgICAgIC8qIGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICA+IGZsaW1pdCAqIDIgKyBsaW1pdCAqLworICAgICAgICAic2hybC5xYiAgICAgICAgJVtzMl0sICAgJVtzMl0sICAgICAxICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdV9zLnFiICAgICAgJVtzMV0sICAgJVtzMl0sICAgICAlW3MzXSAgICAgICBcblx0IgorICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAgJVtmbGltaXRdLCAlW3MxXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAgJVtyXSwgICAgICAlW2NdICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAgICAgICAgJVtyXSwgICAgJVtyXSwgICAgICAyNCAgICAgICAgICBcblx0IgorCisgICAgICAgICJ3cmRzcCAgICAgICAgICAlW3JdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwaWNrLnFiICAgICAgICAlW3MyXSwgICQwLCAgICAgICAgICVbb25lc10gICAgIFxuXHQiCisKKyAgICAgICAgOiBbY10gIj0mciIgKGMpLCBbcl9rXSAiPSZyIiAocl9rKSwgW3MxXSAiPSZyIiAoczEpLCBbaGV2MV0gIj0mciIgKGhldjEpLAorICAgICAgICAgIFtzMl0gIj0mciIgKHMyKSwgW3JdICIrciIgKHIpLCBbczNdICI9JnIiIChzMykKKyAgICAgICAgOiBbcDBdICJyIiAocDApLCBbcTBdICJyIiAocTApLCBbcDFdICJyIiAocDEpLCBbcjNdICJyIiAocjMpLAorICAgICAgICAgIFtxMV0gInIiIChxMSksIFtvbmVzXSAiciIgKG9uZXMpLCBbZmxpbWl0XSAiciIgKGZsaW1pdCkKKyAgICApOworCisgICAgKmhldiA9IGhldjE7CisgICAgKm1hc2sgPSBzMjsKK30KKworCisvKiBpbnB1dHMgJiBvdXRwdXRzIGFyZSBxdWFkLWJ5dGUgdmVjdG9ycyAqLworc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X2ZpbHRlcl9taXBzCisoCisgICAgdWludDMyX3QgbWFzaywKKyAgICB1aW50MzJfdCBoZXYsCisgICAgdWludDMyX3QgKnBzMSwKKyAgICB1aW50MzJfdCAqcHMwLAorICAgIHVpbnQzMl90ICpxczAsCisgICAgdWludDMyX3QgKnFzMQorKQoreworICAgIGludDMyX3QgdnA4X2ZpbHRlcl9sLCB2cDhfZmlsdGVyX3I7CisgICAgaW50MzJfdCBGaWx0ZXIxX2wsIEZpbHRlcjFfciwgRmlsdGVyMl9sLCBGaWx0ZXIyX3I7CisgICAgaW50MzJfdCBzdWJyX3IsIHN1YnJfbDsKKyAgICB1aW50MzJfdCB0MSwgdDIsIEhXTSwgdDM7CisgICAgdWludDMyX3QgaGV2X2wsIGhldl9yLCBtYXNrX2wsIG1hc2tfciwgaW52aGV2X2wsIGludmhldl9yOworCisgICAgaW50MzJfdCB2cHMxLCB2cHMwLCB2cXMwLCB2cXMxOworICAgIGludDMyX3QgdnBzMV9sLCB2cHMxX3IsIHZwczBfbCwgdnBzMF9yLCB2cXMwX2wsIHZxczBfciwgdnFzMV9sLCB2cXMxX3I7CisgICAgdWludDMyX3QgTjEyODsKKworICAgIE4xMjggPSAweDgwODA4MDgwOworICAgIHQxICA9IDB4MDMwMDAzMDA7CisgICAgdDIgID0gMHgwNDAwMDQwMDsKKyAgICB0MyAgPSAweDAxMDAwMTAwOworICAgIEhXTSA9IDB4RkYwMEZGMDA7CisKKyAgICB2cHMwID0gKCpwczApIF4gTjEyODsKKyAgICB2cHMxID0gKCpwczEpIF4gTjEyODsKKyAgICB2cXMwID0gKCpxczApIF4gTjEyODsKKyAgICB2cXMxID0gKCpxczEpIF4gTjEyODsKKworICAgIC8qIHVzZSBoYWxmd29yZCBwYWlycyBpbnN0ZWFkIHF1YWQtYnl0ZXMgYmVjYXVzZSBvZiBhY2N1cmFjeSAqLworICAgIHZwczBfbCA9IHZwczAgJiBIV007CisgICAgdnBzMF9yID0gdnBzMCA8PCA4OworICAgIHZwczBfciA9IHZwczBfciAmIEhXTTsKKworICAgIHZwczFfbCA9IHZwczEgJiBIV007CisgICAgdnBzMV9yID0gdnBzMSA8PCA4OworICAgIHZwczFfciA9IHZwczFfciAmIEhXTTsKKworICAgIHZxczBfbCA9IHZxczAgJiBIV007CisgICAgdnFzMF9yID0gdnFzMCA8PCA4OworICAgIHZxczBfciA9IHZxczBfciAmIEhXTTsKKworICAgIHZxczFfbCA9IHZxczEgJiBIV007CisgICAgdnFzMV9yID0gdnFzMSA8PCA4OworICAgIHZxczFfciA9IHZxczFfciAmIEhXTTsKKworICAgIG1hc2tfbCA9IG1hc2sgJiBIV007CisgICAgbWFza19yID0gbWFzayA8PCA4OworICAgIG1hc2tfciA9IG1hc2tfciAmIEhXTTsKKworICAgIGhldl9sID0gaGV2ICYgSFdNOworICAgIGhldl9yID0gaGV2IDw8IDg7CisgICAgaGV2X3IgPSBoZXZfciAmIEhXTTsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgLyogdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgLSBxczEpOyAqLworICAgICAgICAic3VicV9zLnBoICAgICVbdnA4X2ZpbHRlcl9sXSwgJVt2cHMxX2xdLCAgICAgICAlW3ZxczFfbF0gICAgICAgXG5cdCIKKyAgICAgICAgInN1YnFfcy5waCAgICAlW3ZwOF9maWx0ZXJfcl0sICVbdnBzMV9yXSwgICAgICAgJVt2cXMxX3JdICAgICAgIFxuXHQiCisKKyAgICAgICAgLyogcXMwIC0gcHMwICovCisgICAgICAgICJzdWJxX3MucGggICAgJVtzdWJyX2xdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbdnBzMF9sXSAgICAgICBcblx0IgorICAgICAgICAic3VicV9zLnBoICAgICVbc3Vicl9yXSwgICAgICAgJVt2cXMwX3JdLCAgICAgICAlW3ZwczBfcl0gICAgICAgXG5cdCIKKworICAgICAgICAvKiB2cDhfZmlsdGVyICY9IGhldjsgKi8KKyAgICAgICAgImFuZCAgICAgICAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVtoZXZfbF0gICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbaGV2X3JdICAgICAgICBcblx0IgorCisgICAgICAgIC8qIHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAocXMwIC0gcHMwKSk7ICovCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbc3Vicl9sXSAgICAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW3N1YnJfcl0gICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgICAlW2ludmhldl9sXSwgICAgICVbaGV2X2xdLCAgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbc3Vicl9sXSAgICAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW3N1YnJfcl0gICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgICAlW2ludmhldl9yXSwgICAgICVbaGV2X3JdLCAgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbc3Vicl9sXSAgICAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW3N1YnJfcl0gICAgICAgXG5cdCIKKworICAgICAgICAvKiB2cDhfZmlsdGVyICY9IG1hc2s7ICovCisgICAgICAgICJhbmQgICAgICAgICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbbWFza19sXSAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW21hc2tfcl0gICAgICAgXG5cdCIKKworICAgICAgICA6IFt2cDhfZmlsdGVyX2xdICI9JnIiICh2cDhfZmlsdGVyX2wpLCBbdnA4X2ZpbHRlcl9yXSAiPSZyIiAodnA4X2ZpbHRlcl9yKSwKKyAgICAgICAgICBbc3Vicl9sXSAiPSZyIiAoc3Vicl9sKSwgW3N1YnJfcl0gIj0mciIgKHN1YnJfciksCisgICAgICAgICAgW2ludmhldl9sXSAiPSZyIiAoaW52aGV2X2wpLCBbaW52aGV2X3JdICI9JnIiIChpbnZoZXZfcikKKworICAgICAgICA6IFt2cHMwX2xdICJyIiAodnBzMF9sKSwgW3ZwczBfcl0gInIiICh2cHMwX3IpLCBbdnBzMV9sXSAiciIgKHZwczFfbCksCisgICAgICAgICAgW3ZwczFfcl0gInIiICh2cHMxX3IpLCBbdnFzMF9sXSAiciIgKHZxczBfbCksIFt2cXMwX3JdICJyIiAodnFzMF9yKSwKKyAgICAgICAgICBbdnFzMV9sXSAiciIgKHZxczFfbCksIFt2cXMxX3JdICJyIiAodnFzMV9yKSwKKyAgICAgICAgICBbbWFza19sXSAiciIgKG1hc2tfbCksIFttYXNrX3JdICJyIiAobWFza19yKSwKKyAgICAgICAgICBbaGV2X2xdICJyIiAoaGV2X2wpLCBbaGV2X3JdICJyIiAoaGV2X3IpLAorICAgICAgICAgIFtIV01dICJyIiAoSFdNKQorICAgICk7CisKKyAgICAvKiBzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAvKiBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzKSA+Pj0gMzsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjFfbF0sICAgICVbdnA4X2ZpbHRlcl9sXSwgJVt0Ml0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVtGaWx0ZXIxX3JdLCAgICAlW3ZwOF9maWx0ZXJfcl0sICVbdDJdICAgICAgICAgICBcblx0IgorCisgICAgICAgIC8qIEZpbHRlcjEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDQpID4+PSAzOyAqLworICAgICAgICAiYWRkcV9zLnBoICAgICVbRmlsdGVyMl9sXSwgICAgJVt2cDhfZmlsdGVyX2xdLCAlW3QxXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjJfcl0sICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt0MV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVtGaWx0ZXIxX3JdLCAgICAlW0ZpbHRlcjFfcl0sICAgIDMgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMV9sXSwgICAgJVtGaWx0ZXIxX2xdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMl9sXSwgICAgJVtGaWx0ZXIyX2xdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW0ZpbHRlcjJfcl0sICAgICVbRmlsdGVyMl9yXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImFuZCAgICAgICAgICAlW0ZpbHRlcjFfbF0sICAgICVbRmlsdGVyMV9sXSwgICAgJVtIV01dICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIxX3JdLCAgICAlW0ZpbHRlcjFfcl0sICAgICVbSFdNXSAgICAgICAgICBcblx0IgorCisgICAgICAgIC8qIHZwczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMik7ICovCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cHMwX2xdLCAgICAgICAlW3ZwczBfbF0sICAgICAgICVbRmlsdGVyMl9sXSAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbdnBzMF9yXSwgICAgICAgJVt2cHMwX3JdLCAgICAgICAlW0ZpbHRlcjJfcl0gICAgXG5cdCIKKworICAgICAgICAvKiB2cXMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpOyAqLworICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMF9sXSwgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW0ZpbHRlcjFfbF0gICAgXG5cdCIKKyAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczBfcl0sICAgICAgICVbdnFzMF9yXSwgICAgICAgJVtGaWx0ZXIxX3JdICAgIFxuXHQiCisKKyAgICAgICAgOiBbRmlsdGVyMV9sXSAiPSZyIiAoRmlsdGVyMV9sKSwgW0ZpbHRlcjFfcl0gIj0mciIgKEZpbHRlcjFfciksCisgICAgICAgICAgW0ZpbHRlcjJfbF0gIj0mciIgKEZpbHRlcjJfbCksIFtGaWx0ZXIyX3JdICI9JnIiIChGaWx0ZXIyX3IpLAorICAgICAgICAgIFt2cHMwX2xdICIrciIgKHZwczBfbCksIFt2cHMwX3JdICIrciIgKHZwczBfciksCisgICAgICAgICAgW3ZxczBfbF0gIityIiAodnFzMF9sKSwgW3ZxczBfcl0gIityIiAodnFzMF9yKQorCisgICAgICAgIDogW3QxXSAiciIgKHQxKSwgW3QyXSAiciIgKHQyKSwKKyAgICAgICAgICBbdnA4X2ZpbHRlcl9sXSAiciIgKHZwOF9maWx0ZXJfbCksIFt2cDhfZmlsdGVyX3JdICJyIiAodnA4X2ZpbHRlcl9yKSwKKyAgICAgICAgICBbSFdNXSAiciIgKEhXTSkKKyAgICApOworCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAvKiAodnA4X2ZpbHRlciArPSAxKSA+Pj0gMSAqLworICAgICAgICAiYWRkcWgucGggICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgICAlW3QzXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHFoLnBoICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIxX3JdLCAgICAgJVt0M10gICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLyogdnA4X2ZpbHRlciAmPSB+aGV2OyAqLworICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMV9sXSwgICAgJVtGaWx0ZXIxX2xdLCAgICAlW2ludmhldl9sXSAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgICAlW0ZpbHRlcjFfcl0sICAgICVbRmlsdGVyMV9yXSwgICAgJVtpbnZoZXZfcl0gICAgIFxuXHQiCisKKyAgICAgICAgLyogdnBzMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB2cDhfZmlsdGVyKTsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczFfbF0sICAgICAgICVbdnBzMV9sXSwgICAgICAgJVtGaWx0ZXIxX2xdICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cHMxX3JdLCAgICAgICAlW3ZwczFfcl0sICAgICAgICVbRmlsdGVyMV9yXSAgICBcblx0IgorCisgICAgICAgIC8qIHZxczEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMxIC0gdnA4X2ZpbHRlcik7ICovCisgICAgICAgICJzdWJxX3MucGggICAgJVt2cXMxX2xdLCAgICAgICAlW3ZxczFfbF0sICAgICAgICVbRmlsdGVyMV9sXSAgICBcblx0IgorICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMV9yXSwgICAgICAgJVt2cXMxX3JdLCAgICAgICAlW0ZpbHRlcjFfcl0gICAgXG5cdCIKKworICAgICAgICA6IFtGaWx0ZXIxX2xdICIrciIgKEZpbHRlcjFfbCksIFtGaWx0ZXIxX3JdICIrciIgKEZpbHRlcjFfciksCisgICAgICAgICAgW3ZwczFfbF0gIityIiAodnBzMV9sKSwgW3ZwczFfcl0gIityIiAodnBzMV9yKSwKKyAgICAgICAgICBbdnFzMV9sXSAiK3IiICh2cXMxX2wpLCBbdnFzMV9yXSAiK3IiICh2cXMxX3IpCisKKyAgICAgICAgOiBbdDNdICJyIiAodDMpLCBbaW52aGV2X2xdICJyIiAoaW52aGV2X2wpLCBbaW52aGV2X3JdICJyIiAoaW52aGV2X3IpCisgICAgKTsKKworICAgIC8qIENyZWF0ZSBxdWFkLWJ5dGVzIGZyb20gaGFsZndvcmQgcGFpcnMgKi8KKyAgICB2cXMwX2wgPSB2cXMwX2wgJiBIV007CisgICAgdnFzMV9sID0gdnFzMV9sICYgSFdNOworICAgIHZwczBfbCA9IHZwczBfbCAmIEhXTTsKKyAgICB2cHMxX2wgPSB2cHMxX2wgJiBIV007CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJzaHJsLnBoICAgICAgJVt2cXMwX3JdLCAgICAgICAlW3ZxczBfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hybC5waCAgICAgICVbdnBzMF9yXSwgICAgICAgJVt2cHMwX3JdLCAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmwucGggICAgICAlW3ZxczFfcl0sICAgICAgICVbdnFzMV9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJsLnBoICAgICAgJVt2cHMxX3JdLCAgICAgICAlW3ZwczFfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3ZwczFfcl0gIityIiAodnBzMV9yKSwgW3ZxczFfcl0gIityIiAodnFzMV9yKSwKKyAgICAgICAgICBbdnBzMF9yXSAiK3IiICh2cHMwX3IpLCBbdnFzMF9yXSAiK3IiICh2cXMwX3IpCisgICAgICAgIDoKKyAgICApOworCisgICAgdnFzMCA9IHZxczBfbCB8IHZxczBfcjsKKyAgICB2cXMxID0gdnFzMV9sIHwgdnFzMV9yOworICAgIHZwczAgPSB2cHMwX2wgfCB2cHMwX3I7CisgICAgdnBzMSA9IHZwczFfbCB8IHZwczFfcjsKKworICAgICpwczAgPSB2cHMwIF4gTjEyODsKKyAgICAqcHMxID0gdnBzMSBeIE4xMjg7CisgICAgKnFzMCA9IHZxczAgXiBOMTI4OworICAgICpxczEgPSB2cXMxIF4gTjEyODsKK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21pcHMKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzLAorICAgIGludCBwLAorICAgIHVuc2lnbmVkIGludCBmbGltaXQsCisgICAgdW5zaWduZWQgaW50IGxpbWl0LAorICAgIHVuc2lnbmVkIGludCB0aHJlc2gsCisgICAgaW50IGNvdW50CispCit7CisgICAgdWludDMyX3QgbWFzazsKKyAgICB1aW50MzJfdCBoZXY7CisgICAgdWludDMyX3QgcG0xLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNjsKKyAgICB1bnNpZ25lZCBjaGFyICpzbTEsICpzMCwgKnMxLCAqczIsICpzMywgKnM0LCAqczUsICpzNjsKKworICAgIG1hc2sgPSAwOworICAgIGhldiA9IDA7CisgICAgcDEgPSAwOworICAgIHAyID0gMDsKKyAgICBwMyA9IDA7CisgICAgcDQgPSAwOworCisgICAgLyogcHJlZmV0Y2ggZGF0YSBmb3Igc3RvcmUgKi8KKyAgICBwcmVmZXRjaF9zdG9yZV9sZihzKTsKKworICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQorICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworCisgICAgc20xID0gcyAtIChwIDw8IDIpOworICAgIHMwID0gcyAtIHAgLSBwIC0gcDsKKyAgICBzMSA9IHMgLSBwIC0gcCA7CisgICAgczIgPSBzIC0gcDsKKyAgICBzMyA9IHM7CisgICAgczQgPSBzICsgcDsKKyAgICBzNSA9IHMgKyBwICsgcDsKKyAgICBzNiA9IHMgKyBwICsgcCArIHA7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICovCisgICAgcDEgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAyID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgcDQgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoc20xKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMwKSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHM2KSk7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMxKSA9IHAxOworICAgICAgICAgICAgKigodWludDMyX3QgKilzMikgPSBwMjsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczMpID0gcDM7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM0KSA9IHA0OworICAgICAgICB9CisgICAgfQorCisgICAgc20xICs9IDQ7CisgICAgczAgICs9IDQ7CisgICAgczEgICs9IDQ7CisgICAgczIgICs9IDQ7CisgICAgczMgICs9IDQ7CisgICAgczQgICs9IDQ7CisgICAgczUgICs9IDQ7CisgICAgczYgICs9IDQ7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICovCisgICAgcDEgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAyID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgcDQgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoc20xKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMwKSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHM2KSk7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMxKSA9IHAxOworICAgICAgICAgICAgKigodWludDMyX3QgKilzMikgPSBwMjsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczMpID0gcDM7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM0KSA9IHA0OworICAgICAgICB9CisgICAgfQorCisgICAgc20xICs9IDQ7CisgICAgczAgICs9IDQ7CisgICAgczEgICs9IDQ7CisgICAgczIgICs9IDQ7CisgICAgczMgICs9IDQ7CisgICAgczQgICs9IDQ7CisgICAgczUgICs9IDQ7CisgICAgczYgICs9IDQ7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICovCisgICAgcDEgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAyID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgcDQgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoc20xKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMwKSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHM2KSk7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMxKSA9IHAxOworICAgICAgICAgICAgKigodWludDMyX3QgKilzMikgPSBwMjsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczMpID0gcDM7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM0KSA9IHA0OworICAgICAgICB9CisgICAgfQorCisgICAgc20xICs9IDQ7CisgICAgczAgICs9IDQ7CisgICAgczEgICs9IDQ7CisgICAgczIgICs9IDQ7CisgICAgczMgICs9IDQ7CisgICAgczQgICs9IDQ7CisgICAgczUgICs9IDQ7CisgICAgczYgICs9IDQ7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICovCisgICAgcDEgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAyID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgcDQgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoc20xKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMwKSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHM2KSk7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMxKSA9IHAxOworICAgICAgICAgICAgKigodWludDMyX3QgKilzMikgPSBwMjsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczMpID0gcDM7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM0KSA9IHA0OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl91dmhvcml6b250YWxfZWRnZV9taXBzCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAorICAgIHVuc2lnbmVkIGludCBsaW1pdCwKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIHVpbnQzMl90IG1hc2s7CisgICAgdWludDMyX3QgaGV2OworICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7CisgICAgdW5zaWduZWQgY2hhciAqc20xLCAqczAsICpzMSwgKnMyLCAqczMsICpzNCwgKnM1LCAqczY7CisKKyAgICBtYXNrID0gMDsKKyAgICBoZXYgPSAwOworICAgIHAxID0gMDsKKyAgICBwMiA9IDA7CisgICAgcDMgPSAwOworICAgIHA0ID0gMDsKKworICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQorICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworCisgICAgc20xID0gcyAtIChwIDw8IDIpOworICAgIHMwICA9IHMgLSBwIC0gcCAtIHA7CisgICAgczEgID0gcyAtIHAgLSBwIDsKKyAgICBzMiAgPSBzIC0gcDsKKyAgICBzMyAgPSBzOworICAgIHM0ICA9IHMgKyBwOworICAgIHM1ICA9IHMgKyBwICsgcDsKKyAgICBzNiAgPSBzICsgcCArIHAgKyBwOworCisgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycworICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAorICAgICAqLworICAgIHAxID0gKigodWludDMyX3QgKikoczEpKTsKKyAgICBwMiA9ICooKHVpbnQzMl90ICopKHMyKSk7CisgICAgcDMgPSAqKCh1aW50MzJfdCAqKShzMykpOworICAgIHA0ID0gKigodWludDMyX3QgKikoczQpKTsKKworICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQorICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqLworICAgIGlmICghKCgocDEgLSBwNCkgPT0gMCkgJiYgKChwMiAtIHAzKSA9PSAwKSkpCisgICAgeworCisgICAgICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHNtMSkpOworICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCAqKShzMCkpOworICAgICAgICBwNSAgPSAqKCh1aW50MzJfdCAqKShzNSkpOworICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCAqKShzNikpOworCisgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7CisKKyAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIGlmIChtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7CisKKyAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZCAqLworICAgICAgICAgICAgKigodWludDMyX3QgKilzMSkgPSBwMTsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczIpID0gcDI7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMzKSA9IHAzOworICAgICAgICAgICAgKigodWludDMyX3QgKilzNCkgPSBwNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNtMSArPSA0OworICAgIHMwICArPSA0OworICAgIHMxICArPSA0OworICAgIHMyICArPSA0OworICAgIHMzICArPSA0OworICAgIHM0ICArPSA0OworICAgIHM1ICArPSA0OworICAgIHM2ICArPSA0OworCisgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycworICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAorICAgICAqLworICAgIHAxID0gKigodWludDMyX3QgKikoczEpKTsKKyAgICBwMiA9ICooKHVpbnQzMl90ICopKHMyKSk7CisgICAgcDMgPSAqKCh1aW50MzJfdCAqKShzMykpOworICAgIHA0ID0gKigodWludDMyX3QgKikoczQpKTsKKworICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQorICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqLworICAgIGlmICghKCgocDEgLSBwNCkgPT0gMCkgJiYgKChwMiAtIHAzKSA9PSAwKSkpCisgICAgeworCisgICAgICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHNtMSkpOworICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCAqKShzMCkpOworICAgICAgICBwNSAgPSAqKCh1aW50MzJfdCAqKShzNSkpOworICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCAqKShzNikpOworCisgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7CisKKyAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIGlmIChtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7CisKKyAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZCAqLworICAgICAgICAgICAgKigodWludDMyX3QgKilzMSkgPSBwMTsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczIpID0gcDI7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMzKSA9IHAzOworICAgICAgICAgICAgKigodWludDMyX3QgKilzNCkgPSBwNDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgZmxpbWl0LAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBsaW1pdCwKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIGludCBpOworICAgIHVpbnQzMl90IG1hc2ssIGhldjsKKyAgICB1aW50MzJfdCBwbTEsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2OworICAgIHVuc2lnbmVkIGNoYXIgKnMxLCAqczIsICpzMywgKnM0OworICAgIHVpbnQzMl90IHByaW0xLCBwcmltMiwgc2VjMywgc2VjNCwgcHJpbTMsIHByaW00OworCisgICAgaGV2ID0gMDsKKyAgICBtYXNrID0gMDsKKyAgICBpID0gMDsKKyAgICBwbTEgPSAwOworICAgIHAwID0gMDsKKyAgICBwMSA9IDA7CisgICAgcDIgPSAwOworICAgIHAzID0gMDsKKyAgICBwNCA9IDA7CisgICAgcDUgPSAwOworICAgIHA2ID0gMDsKKworICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQorICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworCisgICAgLyogYXBwbHkgZmlsdGVyIG9uIDQgcGl4ZXNsIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBkbworICAgIHsKKworICAgICAgICAvKiBwcmVmZXRjaCBkYXRhIGZvciBzdG9yZSAqLworICAgICAgICBwcmVmZXRjaF9zdG9yZV9sZihzICsgcCk7CisKKyAgICAgICAgczEgPSBzOworICAgICAgICBzMiA9IHMgKyBwOworICAgICAgICBzMyA9IHMyICsgcDsKKyAgICAgICAgczQgPSBzMyArIHA7CisgICAgICAgIHMgID0gczQgKyBwOworCisgICAgICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKKyAgICAgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICAgICAqLworICAgICAgICBwMiAgPSAqKCh1aW50MzJfdCAqKShzMSAtIDQpKTsKKyAgICAgICAgcDYgID0gKigodWludDMyX3QgKikoczEpKTsKKyAgICAgICAgcDEgID0gKigodWludDMyX3QgKikoczIgLSA0KSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHMyKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMzIC0gNCkpOworICAgICAgICBwNCAgPSAqKCh1aW50MzJfdCAqKShzMykpOworICAgICAgICBwbTEgPSAqKCh1aW50MzJfdCAqKShzNCAtIDQpKTsKKyAgICAgICAgcDMgID0gKigodWludDMyX3QgKikoczQpKTsKKworICAgICAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgorCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3BtMV0sICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKworICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDJdLCAgICAgICVbcDFdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMF0sICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSAgICAgXG5cdCIKKyAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcG0xXSwgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCisgICAgICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAorICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApLCBbcG0xXSAiK3IiIChwbTEpLAorICAgICAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCisgICAgICAgICAgICA6CisgICAgICAgICk7CisKKyAgICAgICAgLyogdHJhbnNwb3NlIHAzLCBwNCwgcDUsIHA2ICovCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgorCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwNV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKworICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNF0sICAgICAgJVtwM10sICAgICAgJVtzZWM0XSAgICAgXG5cdCIKKyAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3A1XSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCisgICAgICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAorICAgICAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQorICAgICAgICAgICAgOgorICAgICAgICApOworCisgICAgICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQorICAgICAgICAgKiBtYXNrIHdpbGwgYmUgemVybyBhbmQgZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQKKyAgICAgICAgICovCisgICAgICAgIGlmICghKCgocDEgLSBwNCkgPT0gMCkgJiYgKChwMiAtIHAzKSA9PSAwKSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7CisKKyAgICAgICAgICAgIC8qIGlmIG1hc2sgPT0gMCBkbyBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZCAqLworICAgICAgICAgICAgaWYgKG1hc2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZmlsdGVyaW5nICovCisgICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKKworICAgICAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZAorICAgICAgICAgICAgICAgICAqIGRvbid0IHVzZSB0cmFuc3Bvc2Ugb24gb3V0cHV0IGRhdGEKKyAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIG1lbW9yeSBpc24ndCBhbGlnbmVkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzNF0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczRdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzNF0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczRdICJyIiAoczQpLAorICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MzXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczNdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzM10pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MzXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgOiBbcDFdICIrciIgKHAxKQorICAgICAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksIFtwMl0gInIiIChwMikKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MyXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMl0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MyXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMl0gInIiIChzMiksCisgICAgICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczFdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMV0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczFdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwKKyAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHMxID0gczsKKyAgICAgICAgczIgPSBzICsgcDsKKyAgICAgICAgczMgPSBzMiArIHA7CisgICAgICAgIHM0ID0gczMgKyBwOworICAgICAgICBzICA9IHM0ICsgcDsKKworICAgICAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAorICAgICAgICAgKi8KKyAgICAgICAgcDIgID0gKigodWludDMyX3QgKikoczEgLSA0KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHMxKSk7CisgICAgICAgIHAxICA9ICooKHVpbnQzMl90ICopKHMyIC0gNCkpOworICAgICAgICBwNSAgPSAqKCh1aW50MzJfdCAqKShzMikpOworICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCAqKShzMyAtIDQpKTsKKyAgICAgICAgcDQgID0gKigodWludDMyX3QgKikoczMpKTsKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoczQgLSA0KSk7CisgICAgICAgIHAzICA9ICooKHVpbnQzMl90ICopKHM0KSk7CisKKyAgICAgICAgLyogdHJhbnNwb3NlIHBtMSwgcDAsIHAxLCBwMiAqLworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKKworICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcDFdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwbTFdLCAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3AyXSwgICAgICAlW3AxXSwgICAgICAlW3NlYzNdICAgICBcblx0IgorICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCisgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3BtMV0sICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAorICAgICAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKKyAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKSwgW3BtMV0gIityIiAocG0xKSwKKyAgICAgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQorICAgICAgICAgICAgOgorICAgICAgICApOworCisgICAgICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKKworICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwM10sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A2XSwgICAgICAlW3A1XSwgICAgICAlW3NlYzNdICAgICBcblx0IgorICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDRdLCAgICAgICVbcDNdLCAgICAgICVbc2VjNF0gICAgIFxuXHQiCisgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AzXSwgICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAorICAgICAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKKyAgICAgICAgICAgICAgW3A2XSAiK3IiIChwNiksIFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCisgICAgICAgICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKKyAgICAgICAgICAgIDoKKyAgICAgICAgKTsKKworICAgICAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKKyAgICAgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoISgoKHAxIC0gcDQpID09IDApICYmICgocDIgLSBwMykgPT0gMCkpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaCwgJmhldiwgJm1hc2spOworCisgICAgICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgICAgIGlmIChtYXNrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7CisKKyAgICAgICAgICAgICAgICAvKiB1bnBhY2sgcHJvY2Vzc2VkIDR4NCBuZWlnaGJvcmhvb2QKKyAgICAgICAgICAgICAgICAgKiBkb24ndCB1c2UgdHJhbnNwb3NlIG9uIG91dHB1dCBkYXRhCisgICAgICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczRdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzNF0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3M0XSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczRdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3M0XSAiciIgKHM0KSwKKyAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICA6IFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzM10pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczNdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzM10pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDogW3AxXSAiK3IiIChwMSkKKyAgICAgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczNdICJyIiAoczMpLCBbcDJdICJyIiAocDIpCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICA6IFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MyXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczJdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczJdICJyIiAoczIpLAorICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MxXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczFdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMV0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MxXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMV0gInIiIChzMSksCisgICAgICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpICs9IDg7CisgICAgfQorCisgICAgd2hpbGUgKGkgPCBjb3VudCk7Cit9CisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAorICAgIHVuc2lnbmVkIGludCBsaW1pdCwKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIHVpbnQzMl90IG1hc2ssIGhldjsKKyAgICB1aW50MzJfdCBwbTEsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2OworICAgIHVuc2lnbmVkIGNoYXIgKnMxLCAqczIsICpzMywgKnM0OworICAgIHVpbnQzMl90IHByaW0xLCBwcmltMiwgc2VjMywgc2VjNCwgcHJpbTMsIHByaW00OworCisgICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCisgICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCisgICAgICovCisKKyAgICAvKiBhcHBseSBmaWx0ZXIgb24gNCBwaXhlc2wgYXQgdGhlIHNhbWUgdGltZSAqLworCisgICAgczEgPSBzOworICAgIHMyID0gcyArIHA7CisgICAgczMgPSBzMiArIHA7CisgICAgczQgPSBzMyArIHA7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAqLworICAgIHAyICA9ICooKHVpbnQzMl90ICopKHMxIC0gNCkpOworICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHMxKSk7CisgICAgcDEgID0gKigodWludDMyX3QgKikoczIgLSA0KSk7CisgICAgcDUgID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMCAgPSAqKCh1aW50MzJfdCAqKShzMyAtIDQpKTsKKyAgICBwNCAgPSAqKCh1aW50MzJfdCAqKShzMykpOworICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHM0IC0gNCkpOworICAgIHAzICA9ICooKHVpbnQzMl90ICopKHM0KSk7CisKKyAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKKworICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKworICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCisgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAorICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAorICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCisgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQorICAgICAgICA6CisgICAgKTsKKworICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKKyAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKKyAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCisgICAgICAgIDoKKyAgICApOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgKiBtYXNrIHdpbGwgYmUgemVybyBhbmQgZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQKKyAgICAqLworICAgIGlmICghKCgocDEgLSBwNCkgPT0gMCkgJiYgKChwMiAtIHAzKSA9PSAwKSkpCisgICAgeworCisgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7CisKKyAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIGlmIChtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7CisKKyAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZAorICAgICAgICAgICAgICogZG9uJ3QgdXNlIHRyYW5zcG9zZSBvbiBvdXRwdXQgZGF0YQorICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczRdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzNF0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczRdKSAgICBcblx0IgorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzNF0gInIiIChzNCksCisgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczNdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzM10pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczNdKSAgICBcblx0IgorICAgICAgICAgICAgICAgIDogW3AxXSAiK3IiIChwMSkKKyAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksIFtwMl0gInIiIChwMikKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MyXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MyXSAiciIgKHMyKSwKKyAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMV0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczFdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMV0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMxID0gczQgKyBwOworICAgIHMyID0gczEgKyBwOworICAgIHMzID0gczIgKyBwOworICAgIHM0ID0gczMgKyBwOworCisgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycworICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAorICAgICAqLworICAgIHAyICA9ICooKHVpbnQzMl90ICopKHMxIC0gNCkpOworICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHMxKSk7CisgICAgcDEgID0gKigodWludDMyX3QgKikoczIgLSA0KSk7CisgICAgcDUgID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMCAgPSAqKCh1aW50MzJfdCAqKShzMyAtIDQpKTsKKyAgICBwNCAgPSAqKCh1aW50MzJfdCAqKShzMykpOworICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHM0IC0gNCkpOworICAgIHAzICA9ICooKHVpbnQzMl90ICopKHM0KSk7CisKKyAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKKworICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKworICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCisgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAorICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAorICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCisgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQorICAgICAgICA6CisgICAgKTsKKworICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKKyAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKKyAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCisgICAgICAgIDoKKyAgICApOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCisgICAgICAgICAgICAgKiBkb24ndCB1c2UgdHJhbnNwb3NlIG9uIG91dHB1dCBkYXRhCisgICAgICAgICAgICAgKiBiZWNhdXNlIG1lbW9yeSBpc24ndCBhbGlnbmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzNF0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczRdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3M0XSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzNF0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3M0XSAiciIgKHM0KSwKKyAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzM10pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczNdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MzXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzM10pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcDFdICIrciIgKHAxKQorICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MzXSAiciIgKHMzKSwgW3AyXSAiciIgKHAyKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6IFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MyXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMl0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczJdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MyXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczJdICJyIiAoczIpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6IFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MxXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMV0pICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczFdKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MxXSkgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczFdICJyIiAoczEpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogaW5wdXRzICYgb3V0cHV0cyBhcmUgcXVhZC1ieXRlIHZlY3RvcnMgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIHZwOF9tYmZpbHRlcl9taXBzCisoCisgICAgdWludDMyX3QgbWFzaywKKyAgICB1aW50MzJfdCBoZXYsCisgICAgdWludDMyX3QgKnBzMiwKKyAgICB1aW50MzJfdCAqcHMxLAorICAgIHVpbnQzMl90ICpwczAsCisgICAgdWludDMyX3QgKnFzMCwKKyAgICB1aW50MzJfdCAqcXMxLAorICAgIHVpbnQzMl90ICpxczIKKykKK3sKKyAgICBpbnQzMl90IHZwczIsIHZwczEsIHZwczAsIHZxczAsIHZxczEsIHZxczI7CisgICAgaW50MzJfdCB2cHMyX2wsIHZwczFfbCwgdnBzMF9sLCB2cXMwX2wsIHZxczFfbCwgdnFzMl9sOworICAgIGludDMyX3QgdnBzMl9yLCB2cHMxX3IsIHZwczBfciwgdnFzMF9yLCB2cXMxX3IsIHZxczJfcjsKKyAgICB1aW50MzJfdCBIV00sIHZwOF9maWx0ZXJfbCwgdnA4X2ZpbHRlcl9yLCBtYXNrX2wsIG1hc2tfciwgaGV2X2wsIGhldl9yLCBzdWJyX3IsIHN1YnJfbDsKKyAgICB1aW50MzJfdCBGaWx0ZXIyX2wsIEZpbHRlcjJfciwgdDEsIHQyLCBGaWx0ZXIxX2wsIEZpbHRlcjFfciwgaW52aGV2X2wsIGludmhldl9yOworICAgIHVpbnQzMl90IE4xMjgsIFI2MzsKKyAgICB1aW50MzJfdCB1MV9sLCB1MV9yLCB1Ml9sLCB1Ml9yLCB1M19sLCB1M19yOworCisgICAgUjYzICA9IDB4MDAzRjAwM0Y7CisgICAgSFdNICA9IDB4RkYwMEZGMDA7CisgICAgTjEyOCA9IDB4ODA4MDgwODA7CisgICAgdDEgICA9IDB4MDMwMDAzMDA7CisgICAgdDIgICA9IDB4MDQwMDA0MDA7CisKKyAgICB2cHMwID0gKCpwczApIF4gTjEyODsKKyAgICB2cHMxID0gKCpwczEpIF4gTjEyODsKKyAgICB2cHMyID0gKCpwczIpIF4gTjEyODsKKyAgICB2cXMwID0gKCpxczApIF4gTjEyODsKKyAgICB2cXMxID0gKCpxczEpIF4gTjEyODsKKyAgICB2cXMyID0gKCpxczIpIF4gTjEyODsKKworICAgIC8qIHVzZSBoYWxmd29yZCBwYWlycyBpbnN0ZWFkIHF1YWQtYnl0ZXMgYmVjYXVzZSBvZiBhY2N1cmFjeSAqLworICAgIHZwczBfbCA9IHZwczAgJiBIV007CisgICAgdnBzMF9yID0gdnBzMCA8PCA4OworICAgIHZwczBfciA9IHZwczBfciAmIEhXTTsKKworICAgIHZxczBfbCA9IHZxczAgJiBIV007CisgICAgdnFzMF9yID0gdnFzMCA8PCA4OworICAgIHZxczBfciA9IHZxczBfciAmIEhXTTsKKworICAgIHZwczFfbCA9IHZwczEgJiBIV007CisgICAgdnBzMV9yID0gdnBzMSA8PCA4OworICAgIHZwczFfciA9IHZwczFfciAmIEhXTTsKKworICAgIHZxczFfbCA9IHZxczEgJiBIV007CisgICAgdnFzMV9yID0gdnFzMSA8PCA4OworICAgIHZxczFfciA9IHZxczFfciAmIEhXTTsKKworICAgIHZxczJfbCA9IHZxczIgJiBIV007CisgICAgdnFzMl9yID0gdnFzMiA8PCA4OworICAgIHZxczJfciA9IHZxczJfciAmIEhXTTsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgLyogcXMwIC0gcHMwICovCisgICAgICAgICJzdWJxX3MucGggICAgJVtzdWJyX2xdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbdnBzMF9sXSAgICAgICBcblx0IgorICAgICAgICAic3VicV9zLnBoICAgICVbc3Vicl9yXSwgICAgICAgJVt2cXMwX3JdLCAgICAgICAlW3ZwczBfcl0gICAgICAgXG5cdCIKKworICAgICAgICAvKiB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSAtIHFzMSk7ICovCisgICAgICAgICJzdWJxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwczFfbF0sICAgICAgICVbdnFzMV9sXSAgICAgICBcblx0IgorICAgICAgICAic3VicV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cHMxX3JdLCAgICAgICAlW3ZxczFfcl0gICAgICAgXG5cdCIKKworICAgICAgICA6IFt2cDhfZmlsdGVyX2xdICI9JnIiICh2cDhfZmlsdGVyX2wpLCBbdnA4X2ZpbHRlcl9yXSAiPXIiICh2cDhfZmlsdGVyX3IpLAorICAgICAgICAgIFtzdWJyX2xdICI9JnIiIChzdWJyX2wpLCBbc3Vicl9yXSAiPSZyIiAoc3Vicl9yKQorICAgICAgICA6IFt2cHMwX2xdICJyIiAodnBzMF9sKSwgW3ZwczBfcl0gInIiICh2cHMwX3IpLCBbdnBzMV9sXSAiciIgKHZwczFfbCksCisgICAgICAgICAgW3ZwczFfcl0gInIiICh2cHMxX3IpLCBbdnFzMF9sXSAiciIgKHZxczBfbCksIFt2cXMwX3JdICJyIiAodnFzMF9yKSwKKyAgICAgICAgICBbdnFzMV9sXSAiciIgKHZxczFfbCksIFt2cXMxX3JdICJyIiAodnFzMV9yKQorICAgICk7CisKKyAgICB2cHMyX2wgPSB2cHMyICYgSFdNOworICAgIHZwczJfciA9IHZwczIgPDwgODsKKyAgICB2cHMyX3IgPSB2cHMyX3IgJiBIV007CisKKyAgICAvKiBhZGQgb3V0ZXIgdGFwcyBpZiB3ZSBoYXZlIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgLyogdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqIChxczAgLSBwczApKTsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVtzdWJyX2xdICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbc3Vicl9yXSAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAgICVbbWFza19sXSwgICAgICAgJVtIV01dLCAgICAgICAgICAlW21hc2tdICAgICAgICAgXG5cdCIKKyAgICAgICAgInNsbCAgICAgICAgICAlW21hc2tfcl0sICAgICAgICVbbWFza10sICAgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVttYXNrX3JdLCAgICAgICAlW0hXTV0sICAgICAgICAgICVbbWFza19yXSAgICAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9sXSwgJVt2cDhfZmlsdGVyX2xdLCAlW3N1YnJfbF0gICAgICAgXG5cdCIKKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfcl0sICVbdnA4X2ZpbHRlcl9yXSwgJVtzdWJyX3JdICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVtoZXZfbF0sICAgICAgICAlW0hXTV0sICAgICAgICAgICVbaGV2XSAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAgICAgICVbaGV2X3JdLCAgICAgICAgJVtoZXZdLCAgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgICAlW2hldl9yXSwgICAgICAgICVbSFdNXSwgICAgICAgICAgJVtoZXZfcl0gICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbc3Vicl9sXSAgICAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW3N1YnJfcl0gICAgICAgXG5cdCIKKworICAgICAgICAvKiB2cDhfZmlsdGVyICY9IG1hc2s7ICovCisgICAgICAgICJhbmQgICAgICAgICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbbWFza19sXSAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW21hc2tfcl0gICAgICAgXG5cdCIKKworICAgICAgICAvKiBGaWx0ZXIyID0gdnA4X2ZpbHRlciAmIGhldjsgKi8KKyAgICAgICAgImFuZCAgICAgICAgICAlW0ZpbHRlcjJfbF0sICAgICVbdnA4X2ZpbHRlcl9sXSwgJVtoZXZfbF0gICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIyX3JdLCAgICAlW3ZwOF9maWx0ZXJfcl0sICVbaGV2X3JdICAgICAgICBcblx0IgorCisgICAgICAgIDogW3ZwOF9maWx0ZXJfbF0gIityIiAodnA4X2ZpbHRlcl9sKSwgW3ZwOF9maWx0ZXJfcl0gIityIiAodnA4X2ZpbHRlcl9yKSwKKyAgICAgICAgICBbaGV2X2xdICI9JnIiIChoZXZfbCksIFtoZXZfcl0gIj0mciIgKGhldl9yKSwKKyAgICAgICAgICBbbWFza19sXSAiPSZyIiAobWFza19sKSwgW21hc2tfcl0gIj0mciIgKG1hc2tfciksCisgICAgICAgICAgW0ZpbHRlcjJfbF0gIj0mciIgKEZpbHRlcjJfbCksIFtGaWx0ZXIyX3JdICI9JnIiIChGaWx0ZXIyX3IpCisgICAgICAgIDogW3N1YnJfbF0gInIiIChzdWJyX2wpLCBbc3Vicl9yXSAiciIgKHN1YnJfciksCisgICAgICAgICAgW0hXTV0gInIiIChIV00pLCBbaGV2XSAgInIiIChoZXYpLCBbbWFza10gInIiIChtYXNrKQorICAgICk7CisKKyAgICAvKiBzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAvKiBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyA0KSA+Pj0gMzsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjFfbF0sICAgICVbRmlsdGVyMl9sXSwgICAgJVt0Ml0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICAgJVtpbnZoZXZfbF0sICAgICAlW2hldl9sXSwgICAgICAgICVbSFdNXSAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkcV9zLnBoICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIyX3JdLCAgICAlW3QyXSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvKiBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyAzKSA+Pj0gMzsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjJfbF0sICAgICVbRmlsdGVyMl9sXSwgICAgJVt0MV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVtGaWx0ZXIyX3JdLCAgICAlW0ZpbHRlcjJfcl0sICAgICVbdDFdICAgICAgICAgICBcblx0IgorCisgICAgICAgICJzaHJhLnBoICAgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgIDMgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIxX3JdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMl9sXSwgICAgJVtGaWx0ZXIyX2xdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW0ZpbHRlcjJfcl0sICAgICVbRmlsdGVyMl9yXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgICVbSFdNXSAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIxX3JdLCAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgICAlW2ludmhldl9yXSwgICAgICVbaGV2X3JdLCAgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLyogcXMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpOyAqLworICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMF9sXSwgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW0ZpbHRlcjFfbF0gICAgXG5cdCIKKyAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczBfcl0sICAgICAgICVbdnFzMF9yXSwgICAgICAgJVtGaWx0ZXIxX3JdICAgIFxuXHQiCisKKyAgICAgICAgLyogcHMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIEZpbHRlcjIpOyAqLworICAgICAgICAiYWRkcV9zLnBoICAgICVbdnBzMF9sXSwgICAgICAgJVt2cHMwX2xdLCAgICAgICAlW0ZpbHRlcjJfbF0gICAgXG5cdCIKKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczBfcl0sICAgICAgICVbdnBzMF9yXSwgICAgICAgJVtGaWx0ZXIyX3JdICAgIFxuXHQiCisKKyAgICAgICAgOiBbaW52aGV2X2xdICI9JnIiIChpbnZoZXZfbCksIFtpbnZoZXZfcl0gIj0mciIgKGludmhldl9yKSwKKyAgICAgICAgICBbRmlsdGVyMV9sXSAiPSZyIiAoRmlsdGVyMV9sKSwgW0ZpbHRlcjFfcl0gIj0mciIgKEZpbHRlcjFfciksCisgICAgICAgICAgW0ZpbHRlcjJfbF0gIityIiAoRmlsdGVyMl9sKSwgW0ZpbHRlcjJfcl0gIityIiAoRmlsdGVyMl9yKSwKKyAgICAgICAgICBbdnBzMF9sXSAiK3IiICh2cHMwX2wpLCBbdnBzMF9yXSAiK3IiICh2cHMwX3IpLAorICAgICAgICAgIFt2cXMwX2xdICIrciIgKHZxczBfbCksIFt2cXMwX3JdICIrciIgKHZxczBfcikKKyAgICAgICAgOiBbdDFdICJyIiAodDEpLCBbdDJdICJyIiAodDIpLCBbSFdNXSAiciIgKEhXTSksCisgICAgICAgICAgW2hldl9sXSAiciIgKGhldl9sKSwgW2hldl9yXSAiciIgKGhldl9yKQorICAgICk7CisKKyAgICAvKiBvbmx5IGFwcGx5IHdpZGVyIGZpbHRlciBpZiBub3QgaGlnaCBlZGdlIHZhcmlhbmNlICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAvKiB2cDhfZmlsdGVyICY9IH5oZXY7ICovCisgICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIyX2xdLCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbaW52aGV2X2xdICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMl9yXSwgICAgJVt2cDhfZmlsdGVyX3JdLCAlW2ludmhldl9yXSAgICAgXG5cdCIKKworICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMl9sXSwgICAgJVtGaWx0ZXIyX2xdLCAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW0ZpbHRlcjJfcl0sICAgICVbRmlsdGVyMl9yXSwgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbRmlsdGVyMl9sXSAiPSZyIiAoRmlsdGVyMl9sKSwgW0ZpbHRlcjJfcl0gIj0mciIgKEZpbHRlcjJfcikKKyAgICAgICAgOiBbdnA4X2ZpbHRlcl9sXSAiciIgKHZwOF9maWx0ZXJfbCksIFt2cDhfZmlsdGVyX3JdICJyIiAodnA4X2ZpbHRlcl9yKSwKKyAgICAgICAgICBbaW52aGV2X2xdICJyIiAoaW52aGV2X2wpLCBbaW52aGV2X3JdICJyIiAoaW52aGV2X3IpCisgICAgKTsKKworICAgIC8qIHJvdWdobHkgMy83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJzaGxsLnBoICAgICAgJVt1M19sXSwgICAgICAgICAlW0ZpbHRlcjJfbF0sICAgIDMgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsbC5waCAgICAgICVbdTNfcl0sICAgICAgICAgJVtGaWx0ZXIyX3JdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiYWRkcS5waCAgICAgICVbdTNfbF0sICAgICAgICAgJVt1M19sXSwgICAgICAgICAlW0ZpbHRlcjJfbF0gICAgXG5cdCIKKyAgICAgICAgImFkZHEucGggICAgICAlW3UzX3JdLCAgICAgICAgICVbdTNfcl0sICAgICAgICAgJVtGaWx0ZXIyX3JdICAgIFxuXHQiCisKKyAgICAgICAgInNobGwucGggICAgICAlW3UyX2xdLCAgICAgICAgICVbdTNfbF0sICAgICAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsLnBoICAgICAgJVt1Ml9yXSwgICAgICAgICAlW3UzX3JdLCAgICAgICAgIDEgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJhZGRxLnBoICAgICAgJVt1MV9sXSwgICAgICAgICAlW3UzX2xdLCAgICAgICAgICVbdTJfbF0gICAgICAgICBcblx0IgorICAgICAgICAiYWRkcS5waCAgICAgICVbdTFfcl0sICAgICAgICAgJVt1M19yXSwgICAgICAgICAlW3UyX3JdICAgICAgICAgXG5cdCIKKworICAgICAgICAiYWRkcS5waCAgICAgICVbdTJfbF0sICAgICAgICAgJVt1Ml9sXSwgICAgICAgICAlW1I2M10gICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHEucGggICAgICAlW3UyX3JdLCAgICAgICAgICVbdTJfcl0sICAgICAgICAgJVtSNjNdICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImFkZHEucGggICAgICAlW3UzX2xdLCAgICAgICAgICVbdTNfbF0sICAgICAgICAgJVtSNjNdICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxLnBoICAgICAgJVt1M19yXSwgICAgICAgICAlW3UzX3JdLCAgICAgICAgICVbUjYzXSAgICAgICAgICBcblx0IgorCisgICAgICAgIC8qIHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpID4+IDcpCisgICAgICAgICAqIHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMTgpID4+IDcpCisgICAgICAgICAqLworICAgICAgICAiYWRkcS5waCAgICAgICVbdTFfbF0sICAgICAgICAgJVt1MV9sXSwgICAgICAgICAlW1I2M10gICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHEucGggICAgICAlW3UxX3JdLCAgICAgICAgICVbdTFfcl0sICAgICAgICAgJVtSNjNdICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt1MV9sXSwgICAgICAgICAlW3UxX2xdLCAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdTFfcl0sICAgICAgICAgJVt1MV9yXSwgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3UyX2xdLCAgICAgICAgICVbdTJfbF0sICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt1Ml9yXSwgICAgICAgICAlW3UyX3JdLCAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsbC5waCAgICAgICVbdTFfbF0sICAgICAgICAgJVt1MV9sXSwgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNobGwucGggICAgICAlW3UxX3JdLCAgICAgICAgICVbdTFfcl0sICAgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsLnBoICAgICAgJVt1Ml9sXSwgICAgICAgICAlW3UyX2xdLCAgICAgICAgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsbC5waCAgICAgICVbdTJfcl0sICAgICAgICAgJVt1Ml9yXSwgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvKiB2cXMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpOyAqLworICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMF9sXSwgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW3UxX2xdICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczBfcl0sICAgICAgICVbdnFzMF9yXSwgICAgICAgJVt1MV9yXSAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLyogdnBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KTsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczBfbF0sICAgICAgICVbdnBzMF9sXSwgICAgICAgJVt1MV9sXSAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cHMwX3JdLCAgICAgICAlW3ZwczBfcl0sICAgICAgICVbdTFfcl0gICAgICAgICBcblx0IgorCisgICAgICAgIDogW3UxX2xdICI9JnIiICh1MV9sKSwgW3UxX3JdICI9JnIiICh1MV9yKSwgW3UyX2xdICI9JnIiICh1Ml9sKSwKKyAgICAgICAgICBbdTJfcl0gIj0mciIgKHUyX3IpLCBbdTNfbF0gIj0mciIgKHUzX2wpLCBbdTNfcl0gIj0mciIgKHUzX3IpLAorICAgICAgICAgIFt2cHMwX2xdICIrciIgKHZwczBfbCksIFt2cHMwX3JdICIrciIgKHZwczBfciksCisgICAgICAgICAgW3ZxczBfbF0gIityIiAodnFzMF9sKSwgW3ZxczBfcl0gIityIiAodnFzMF9yKQorICAgICAgICA6IFtSNjNdICAiciIgKFI2MyksCisgICAgICAgICAgW0ZpbHRlcjJfbF0gInIiIChGaWx0ZXIyX2wpLCBbRmlsdGVyMl9yXSAiciIgKEZpbHRlcjJfcikKKyAgICApOworCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAvKiB2cXMxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUpOyAqLworICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMV9sXSwgICAgICAgJVt2cXMxX2xdLCAgICAgICAlW3UyX2xdICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczFfbF0sICAgICAgICVbdnBzMV9sXSwgICAgICAgJVt1Ml9sXSAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLyogdnBzMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB1KTsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczFfcl0sICAgICAgICVbdnBzMV9yXSwgICAgICAgJVt1Ml9yXSAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJxX3MucGggICAgJVt2cXMxX3JdLCAgICAgICAlW3ZxczFfcl0sICAgICAgICVbdTJfcl0gICAgICAgICBcblx0IgorCisgICAgICAgIDogW3ZwczFfbF0gIityIiAodnBzMV9sKSwgW3ZwczFfcl0gIityIiAodnBzMV9yKSwKKyAgICAgICAgICBbdnFzMV9sXSAiK3IiICh2cXMxX2wpLCBbdnFzMV9yXSAiK3IiICh2cXMxX3IpCisgICAgICAgIDogW3UyX2xdICJyIiAodTJfbCksIFt1Ml9yXSAiciIgKHUyX3IpCisgICAgKTsKKworICAgIC8qIHJvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgIC8qIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpID4+IDcpOyAqLworICAgICAgICAic2hyYS5waCAgICAgICVbdTNfbF0sICAgICAgICAgJVt1M19sXSwgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3UzX3JdLCAgICAgICAgICVbdTNfcl0sICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsLnBoICAgICAgJVt1M19sXSwgICAgICAgICAlW3UzX2xdLCAgICAgICAgIDggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsbC5waCAgICAgICVbdTNfcl0sICAgICAgICAgJVt1M19yXSwgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvKiB2cXMyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMiAtIHUpOyAqLworICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMl9sXSwgICAgICAgJVt2cXMyX2xdLCAgICAgICAlW3UzX2xdICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczJfcl0sICAgICAgICVbdnFzMl9yXSwgICAgICAgJVt1M19yXSAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLyogdnBzMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgKyB1KTsgKi8KKyAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczJfbF0sICAgICAgICVbdnBzMl9sXSwgICAgICAgJVt1M19sXSAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRxX3MucGggICAgJVt2cHMyX3JdLCAgICAgICAlW3ZwczJfcl0sICAgICAgICVbdTNfcl0gICAgICAgICBcblx0IgorCisgICAgICAgIDogW3UzX2xdICIrciIgKHUzX2wpLCBbdTNfcl0gIityIiAodTNfciksIFt2cHMyX2xdICIrciIgKHZwczJfbCksCisgICAgICAgICAgW3ZwczJfcl0gIityIiAodnBzMl9yKSwgW3ZxczJfbF0gIityIiAodnFzMl9sKSwgW3ZxczJfcl0gIityIiAodnFzMl9yKQorICAgICAgICA6CisgICAgKTsKKworICAgIC8qIENyZWF0ZSBxdWFkLWJ5dGVzIGZyb20gaGFsZndvcmQgcGFpcnMgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJhbmQgICAgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbSFdNXSAgICAgICAgICBcblx0IgorICAgICAgICAic2hybC5waCAgICAgICVbdnFzMF9yXSwgICAgICAgJVt2cXMwX3JdLCAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiYW5kICAgICAgICAgICVbdnBzMF9sXSwgICAgICAgJVt2cHMwX2xdLCAgICAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmwucGggICAgICAlW3ZwczBfcl0sICAgICAgICVbdnBzMF9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImFuZCAgICAgICAgICAlW3ZxczFfbF0sICAgICAgICVbdnFzMV9sXSwgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJsLnBoICAgICAgJVt2cXMxX3JdLCAgICAgICAlW3ZxczFfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJhbmQgICAgICAgICAgJVt2cHMxX2xdLCAgICAgICAlW3ZwczFfbF0sICAgICAgICVbSFdNXSAgICAgICAgICBcblx0IgorICAgICAgICAic2hybC5waCAgICAgICVbdnBzMV9yXSwgICAgICAgJVt2cHMxX3JdLCAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiYW5kICAgICAgICAgICVbdnFzMl9sXSwgICAgICAgJVt2cXMyX2xdLCAgICAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmwucGggICAgICAlW3ZxczJfcl0sICAgICAgICVbdnFzMl9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImFuZCAgICAgICAgICAlW3ZwczJfbF0sICAgICAgICVbdnBzMl9sXSwgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJsLnBoICAgICAgJVt2cHMyX3JdLCAgICAgICAlW3ZwczJfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJvciAgICAgICAgICAgJVt2cXMwX3JdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbdnFzMF9yXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICVbdnBzMF9yXSwgICAgICAgJVt2cHMwX2xdLCAgICAgICAlW3ZwczBfcl0gICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgICAlW3ZxczFfcl0sICAgICAgICVbdnFzMV9sXSwgICAgICAgJVt2cXMxX3JdICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICAgJVt2cHMxX3JdLCAgICAgICAlW3ZwczFfbF0sICAgICAgICVbdnBzMV9yXSAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAgICVbdnFzMl9yXSwgICAgICAgJVt2cXMyX2xdLCAgICAgICAlW3ZxczJfcl0gICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgICAlW3ZwczJfcl0sICAgICAgICVbdnBzMl9sXSwgICAgICAgJVt2cHMyX3JdICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbdnBzMV9sXSAiK3IiICh2cHMxX2wpLCBbdnBzMV9yXSAiK3IiICh2cHMxX3IpLCBbdnFzMV9sXSAiK3IiICh2cXMxX2wpLAorICAgICAgICAgIFt2cXMxX3JdICIrciIgKHZxczFfciksIFt2cHMwX2xdICIrciIgKHZwczBfbCksIFt2cHMwX3JdICIrciIgKHZwczBfciksCisgICAgICAgICAgW3ZxczBfbF0gIityIiAodnFzMF9sKSwgW3ZxczBfcl0gIityIiAodnFzMF9yKSwgW3ZxczJfbF0gIityIiAodnFzMl9sKSwKKyAgICAgICAgICBbdnFzMl9yXSAiK3IiICh2cXMyX3IpLCBbdnBzMl9yXSAiK3IiICh2cHMyX3IpLCBbdnBzMl9sXSAiK3IiICh2cHMyX2wpCisgICAgICAgIDogW0hXTV0gInIiIChIV00pCisgICAgKTsKKworICAgICpwczAgPSB2cHMwX3IgXiBOMTI4OworICAgICpwczEgPSB2cHMxX3IgXiBOMTI4OworICAgICpwczIgPSB2cHMyX3IgXiBOMTI4OworICAgICpxczAgPSB2cXMwX3IgXiBOMTI4OworICAgICpxczEgPSB2cXMxX3IgXiBOMTI4OworICAgICpxczIgPSB2cXMyX3IgXiBOMTI4OworfQorCit2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9taXBzCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAorICAgIHVuc2lnbmVkIGludCBsaW1pdCwKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIGludCBpOworICAgIHVpbnQzMl90IG1hc2ssIGhldjsKKyAgICB1aW50MzJfdCBwbTEsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2OworICAgIHVuc2lnbmVkIGNoYXIgKnNtMSwgKnMwLCAqczEsICpzMiwgKnMzLCAqczQsICpzNSwgKnM2OworCisgICAgbWFzayA9IDA7CisgICAgaGV2ID0gMDsKKyAgICBpID0gMDsKKyAgICBwMSA9IDA7CisgICAgcDIgPSAwOworICAgIHAzID0gMDsKKyAgICBwNCA9IDA7CisKKyAgICAvKiBsb29wIGZpbHRlciBkZXNpZ25lZCB0byB3b3JrIHVzaW5nIGNoYXJzIHNvIHRoYXQgd2UgY2FuIG1ha2UgbWF4aW11bSB1c2UKKyAgICAgKiBvZiA4IGJpdCBzaW1kIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKworICAgIHNtMSA9IHMgLSAocCA8PCAyKTsKKyAgICBzMCAgPSBzIC0gcCAtIHAgLSBwOworICAgIHMxICA9IHMgLSBwIC0gcDsKKyAgICBzMiAgPSBzIC0gcDsKKyAgICBzMyAgPSBzOworICAgIHM0ICA9IHMgKyBwOworICAgIHM1ICA9IHMgKyBwICsgcDsKKyAgICBzNiAgPSBzICsgcCArIHAgKyBwOworCisgICAgLyogcHJlZmV0Y2ggZGF0YSBmb3IgbG9hZCAqLworICAgIHByZWZldGNoX2xvYWRfbGYocyArIHApOworCisgICAgLyogYXBwbHkgZmlsdGVyIG9uIDQgcGl4ZXNsIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycworICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAgICAgICovCisgICAgICAgIHAxID0gKigodWludDMyX3QgKikoczEpKTsKKyAgICAgICAgcDIgPSAqKCh1aW50MzJfdCAqKShzMikpOworICAgICAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgICAgIHA0ID0gKigodWludDMyX3QgKikoczQpKTsKKworICAgICAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKKyAgICAgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoISgoKHAxIC0gcDQpID09IDApICYmICgocDIgLSBwMykgPT0gMCkpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHNtMSkpOworICAgICAgICAgICAgcDAgID0gKigodWludDMyX3QgKikoczApKTsKKyAgICAgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCAqKShzNikpOworCisgICAgICAgICAgICB2cDhfZmlsdGVyX21hc2tfdmVjX21pcHMobGltaXQsIGZsaW1pdCwgcDEsIHAyLCBwbTEsIHAwLCBwMywgcDQsIHA1LCBwNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgICAgICBpZiAobWFzaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgICAgICB2cDhfbWJmaWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMCwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUpOworCisgICAgICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCisgICAgICAgICAgICAgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKigodWludDMyX3QgKilzMCkgPSBwMDsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMxKSA9IHAxOworICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopczIpID0gcDI7CisgICAgICAgICAgICAgICAgKigodWludDMyX3QgKilzMykgPSBwMzsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM0KSA9IHA0OworICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopczUpID0gcDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzbTEgKz0gNDsKKyAgICAgICAgczAgICs9IDQ7CisgICAgICAgIHMxICArPSA0OworICAgICAgICBzMiAgKz0gNDsKKyAgICAgICAgczMgICs9IDQ7CisgICAgICAgIHM0ICArPSA0OworICAgICAgICBzNSAgKz0gNDsKKyAgICAgICAgczYgICs9IDQ7CisKKyAgICAgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycworICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAgICAgICovCisgICAgICAgIHAxID0gKigodWludDMyX3QgKikoczEpKTsKKyAgICAgICAgcDIgPSAqKCh1aW50MzJfdCAqKShzMikpOworICAgICAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgICAgIHA0ID0gKigodWludDMyX3QgKikoczQpKTsKKworICAgICAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKKyAgICAgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoISgoKHAxIC0gcDQpID09IDApICYmICgocDIgLSBwMykgPT0gMCkpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHNtMSkpOworICAgICAgICAgICAgcDAgID0gKigodWludDMyX3QgKikoczApKTsKKyAgICAgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCAqKShzNikpOworCisgICAgICAgICAgICB2cDhfZmlsdGVyX21hc2tfdmVjX21pcHMobGltaXQsIGZsaW1pdCwgcDEsIHAyLCBwbTEsIHAwLCBwMywgcDQsIHA1LCBwNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgICAgICBpZiAobWFzaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgICAgICB2cDhfbWJmaWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMCwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUpOworCisgICAgICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCisgICAgICAgICAgICAgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKigodWludDMyX3QgKilzMCkgPSBwMDsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMxKSA9IHAxOworICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopczIpID0gcDI7CisgICAgICAgICAgICAgICAgKigodWludDMyX3QgKilzMykgPSBwMzsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM0KSA9IHA0OworICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopczUpID0gcDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzbTEgKz0gNDsKKyAgICAgICAgczAgICs9IDQ7CisgICAgICAgIHMxICArPSA0OworICAgICAgICBzMiAgKz0gNDsKKyAgICAgICAgczMgICs9IDQ7CisgICAgICAgIHM0ICArPSA0OworICAgICAgICBzNSAgKz0gNDsKKyAgICAgICAgczYgICs9IDQ7CisKKyAgICAgICAgaSArPSA4OworICAgIH0KKworICAgIHdoaWxlIChpIDwgY291bnQpOworfQorCit2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX3V2aG9yaXpvbnRhbF9lZGdlX21pcHMKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzLAorICAgIGludCBwLAorICAgIHVuc2lnbmVkIGludCBmbGltaXQsCisgICAgdW5zaWduZWQgaW50IGxpbWl0LAorICAgIHVuc2lnbmVkIGludCB0aHJlc2gsCisgICAgaW50IGNvdW50CispCit7CisgICAgdWludDMyX3QgbWFzaywgaGV2OworICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7CisgICAgdW5zaWduZWQgY2hhciAqc20xLCAqczAsICpzMSwgKnMyLCAqczMsICpzNCwgKnM1LCAqczY7CisKKyAgICBtYXNrID0gMDsKKyAgICBoZXYgPSAwOworICAgIHAxID0gMDsKKyAgICBwMiA9IDA7CisgICAgcDMgPSAwOworICAgIHA0ID0gMDsKKworICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQorICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworCisgICAgc20xID0gcyAtIChwIDw8IDIpOworICAgIHMwICA9IHMgLSBwIC0gcCAtIHA7CisgICAgczEgID0gcyAtIHAgLSBwOworICAgIHMyICA9IHMgLSBwOworICAgIHMzICA9IHM7CisgICAgczQgID0gcyArIHA7CisgICAgczUgID0gcyArIHAgKyBwOworICAgIHM2ICA9IHMgKyBwICsgcCArIHA7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICovCisgICAgcDEgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAyID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgcDQgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoc20xKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMwKSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHM2KSk7CisKKyAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7CisKKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCisgICAgICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKigodWludDMyX3QgKilzMCkgPSBwMDsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczEpID0gcDE7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMyKSA9IHAyOworICAgICAgICAgICAgKigodWludDMyX3QgKilzMykgPSBwMzsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczQpID0gcDQ7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM1KSA9IHA1OworICAgICAgICB9CisgICAgfQorCisgICAgc20xICs9IDQ7CisgICAgczAgICs9IDQ7CisgICAgczEgICs9IDQ7CisgICAgczIgICs9IDQ7CisgICAgczMgICs9IDQ7CisgICAgczQgICs9IDQ7CisgICAgczUgICs9IDQ7CisgICAgczYgICs9IDQ7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCisgICAgICovCisgICAgcDEgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAyID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMyA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgcDQgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgcG0xID0gKigodWludDMyX3QgKikoc20xKSk7CisgICAgICAgIHAwICA9ICooKHVpbnQzMl90ICopKHMwKSk7CisgICAgICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHM1KSk7CisgICAgICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHM2KSk7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLworICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKKworICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCisgICAgICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKigodWludDMyX3QgKilzMCkgPSBwMDsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczEpID0gcDE7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXMyKSA9IHAyOworICAgICAgICAgICAgKigodWludDMyX3QgKilzMykgPSBwMzsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopczQpID0gcDQ7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXM1KSA9IHA1OworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAorICAgIHVuc2lnbmVkIGludCBsaW1pdCwKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworCisgICAgaW50IGk7CisgICAgdWludDMyX3QgbWFzaywgaGV2OworICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7CisgICAgdW5zaWduZWQgY2hhciAqczEsICpzMiwgKnMzLCAqczQ7CisgICAgdWludDMyX3QgcHJpbTEsIHByaW0yLCBzZWMzLCBzZWM0LCBwcmltMywgcHJpbTQ7CisKKyAgICBtYXNrID0gMDsKKyAgICBoZXYgPSAwOworICAgIGkgPSAwOworICAgIHBtMSA9IDA7CisgICAgcDAgPSAwOworICAgIHAxID0gMDsKKyAgICBwMiA9IDA7CisgICAgcDMgPSAwOworICAgIHA0ID0gMDsKKyAgICBwNSA9IDA7CisgICAgcDYgPSAwOworCisgICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCisgICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCisgICAgICovCisKKyAgICAvKiBhcHBseSBmaWx0ZXIgb24gNCBwaXhlc2wgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIGRvCisgICAgeworICAgICAgICBzMSA9IHM7CisgICAgICAgIHMyID0gcyArIHA7CisgICAgICAgIHMzID0gczIgKyBwOworICAgICAgICBzNCA9IHMzICsgcDsKKyAgICAgICAgcyAgPSBzNCArIHA7CisKKyAgICAgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycworICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAgICAgICovCisgICAgICAgIHAyICA9ICooKHVpbnQzMl90ICopKHMxIC0gNCkpOworICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgICAgICBwMSAgPSAqKCh1aW50MzJfdCAqKShzMiAtIDQpKTsKKyAgICAgICAgcDUgID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICAgICAgcDAgID0gKigodWludDMyX3QgKikoczMgLSA0KSk7CisgICAgICAgIHA0ICA9ICooKHVpbnQzMl90ICopKHMzKSk7CisgICAgICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHM0IC0gNCkpOworICAgICAgICBwMyAgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgICAgIC8qIHRyYW5zcG9zZSBwbTEsIHAwLCBwMSwgcDIgKi8KKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3AxXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorCisgICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3AwXSwgICAgICAlW3BtMV0sICAgICAlW3NlYzRdICAgICBcblx0IgorICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDFdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKKyAgICAgICAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCisgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCisgICAgICAgICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKKyAgICAgICAgICAgIDoKKyAgICAgICAgKTsKKworICAgICAgICAvKiB0cmFuc3Bvc2UgcDMsIHA0LCBwNSwgcDYgKi8KKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3A1XSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcDNdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorCisgICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNl0sICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKKyAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgorICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDVdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwM10sICAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKKyAgICAgICAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCisgICAgICAgICAgICAgIFtwNl0gIityIiAocDYpLCBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAorICAgICAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCisgICAgICAgICAgICA6CisgICAgICAgICk7CisKKyAgICAgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICAgICAgeworCisgICAgICAgICAgICB2cDhfZmlsdGVyX21hc2tfdmVjX21pcHMobGltaXQsIGZsaW1pdCwgcDEsIHAyLCBwbTEsIHAwLCBwMywgcDQsIHA1LCBwNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKKworICAgICAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgICAgICBpZiAobWFzaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgICAgICB2cDhfbWJmaWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMCwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUpOworCisgICAgICAgICAgICAgICAgLyogZG9uJ3QgdXNlIHRyYW5zcG9zZSBvbiBvdXRwdXQgZGF0YQorICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgbWVtb3J5IGlzbid0IGFsaWduZWQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczRdICJyIiAoczQpLAorICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A1XSwgJVtwNV0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AwXSwgJVtwMF0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICA6IFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCisgICAgICAgICAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksCisgICAgICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDVdLCAlW3A1XSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDBdLCAlW3AwXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDogW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MyXSAiciIgKHMyKSwKKyAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNV0sICVbcDVdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMF0sICVbcDBdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgOiBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAorICAgICAgICAgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczFdICJyIiAoczEpLAorICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaSArPSA0OworICAgIH0KKworICAgIHdoaWxlIChpIDwgY291bnQpOworfQorCit2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzCisoCisgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICBpbnQgcCwKKyAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAorICAgIHVuc2lnbmVkIGludCBsaW1pdCwKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAorICAgIGludCBjb3VudAorKQoreworICAgIHVpbnQzMl90IG1hc2ssIGhldjsKKyAgICB1aW50MzJfdCBwbTEsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2OworICAgIHVuc2lnbmVkIGNoYXIgKnMxLCAqczIsICpzMywgKnM0OworICAgIHVpbnQzMl90IHByaW0xLCBwcmltMiwgc2VjMywgc2VjNCwgcHJpbTMsIHByaW00OworCisgICAgbWFzayA9IDA7CisgICAgaGV2ID0gMDsKKyAgICBwbTEgPSAwOworICAgIHAwID0gMDsKKyAgICBwMSA9IDA7CisgICAgcDIgPSAwOworICAgIHAzID0gMDsKKyAgICBwNCA9IDA7CisgICAgcDUgPSAwOworICAgIHA2ID0gMDsKKworICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQorICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworCisgICAgLyogYXBwbHkgZmlsdGVyIG9uIDQgcGl4ZXNsIGF0IHRoZSBzYW1lIHRpbWUgKi8KKworICAgIHMxID0gczsKKyAgICBzMiA9IHMgKyBwOworICAgIHMzID0gczIgKyBwOworICAgIHM0ID0gczMgKyBwOworCisgICAgLyogcHJlZmV0Y2ggZGF0YSBmb3IgbG9hZCAqLworICAgIHByZWZldGNoX2xvYWRfbGYocyArIDIgKiBwKTsKKworICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKKyAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAgKi8KKyAgICBwMiAgPSAqKCh1aW50MzJfdCAqKShzMSAtIDQpKTsKKyAgICBwNiAgPSAqKCh1aW50MzJfdCAqKShzMSkpOworICAgIHAxICA9ICooKHVpbnQzMl90ICopKHMyIC0gNCkpOworICAgIHA1ICA9ICooKHVpbnQzMl90ICopKHMyKSk7CisgICAgcDAgID0gKigodWludDMyX3QgKikoczMgLSA0KSk7CisgICAgcDQgID0gKigodWludDMyX3QgKikoczMpKTsKKyAgICBwbTEgPSAqKCh1aW50MzJfdCAqKShzNCAtIDQpKTsKKyAgICBwMyAgPSAqKCh1aW50MzJfdCAqKShzNCkpOworCisgICAgLyogdHJhbnNwb3NlIHBtMSwgcDAsIHAxLCBwMiAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcDFdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3BtMV0sICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDJdLCAgICAgICVbcDFdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucGgudyAgICAlW3AwXSwgICAgICAlW3BtMV0sICAgICAlW3NlYzRdICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFwcGVuZCAgICAgICAgICVbcG0xXSwgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKKyAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKKyAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApLCBbcG0xXSAiK3IiIChwbTEpLAorICAgICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKKyAgICAgICAgOgorICAgICk7CisKKyAgICAvKiB0cmFuc3Bvc2UgcDMsIHA0LCBwNSwgcDYgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgorCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3A1XSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtwM10sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorCisgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A2XSwgICAgICAlW3A1XSwgICAgICAlW3NlYzNdICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNF0sICAgICAgJVtwM10sICAgICAgJVtzZWM0XSAgICAgXG5cdCIKKyAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDVdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AzXSwgICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCisgICAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCisgICAgICAgICAgW3A2XSAiK3IiIChwNiksIFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCisgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQorICAgICAgICA6CisgICAgKTsKKworICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQorICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqLworICAgIGlmICghKCgocDEgLSBwNCkgPT0gMCkgJiYgKChwMiAtIHAzKSA9PSAwKSkpCisgICAgeworCisgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7CisKKyAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIGlmIChtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgIHZwOF9tYmZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAwLCAmcDEsICZwMiwgJnAzLCAmcDQsICZwNSk7CisKKyAgICAgICAgICAgIC8qIGRvbid0IHVzZSB0cmFuc3Bvc2Ugb24gb3V0cHV0IGRhdGEKKyAgICAgICAgICAgICAqIGJlY2F1c2UgbWVtb3J5IGlzbid0IGFsaWduZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzNF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzNF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzNF0gInIiIChzNCksCisgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNV0sICVbcDVdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDBdLCAlW3AwXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzM10pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MzXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzM10pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MzXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczNdICJyIiAoczMpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDVdLCAlW3A1XSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AwXSwgJVtwMF0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDogW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCkKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczJdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MyXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczJdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3MyXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MyXSAiciIgKHMyKSwKKyAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A1XSwgJVtwNV0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMF0sICVbcDBdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6IFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCisgICAgICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzMV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMV0gInIiIChzMSksCisgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgczEgPSBzNCArIHA7CisgICAgczIgPSBzMSArIHA7CisgICAgczMgPSBzMiArIHA7CisgICAgczQgPSBzMyArIHA7CisKKyAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCisgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKKyAgICAqLworICAgIHAyICA9ICooKHVpbnQzMl90ICopKHMxIC0gNCkpOworICAgIHA2ICA9ICooKHVpbnQzMl90ICopKHMxKSk7CisgICAgcDEgID0gKigodWludDMyX3QgKikoczIgLSA0KSk7CisgICAgcDUgID0gKigodWludDMyX3QgKikoczIpKTsKKyAgICBwMCAgPSAqKCh1aW50MzJfdCAqKShzMyAtIDQpKTsKKyAgICBwNCAgPSAqKCh1aW50MzJfdCAqKShzMykpOworICAgIHBtMSA9ICooKHVpbnQzMl90ICopKHM0IC0gNCkpOworICAgIHAzICA9ICooKHVpbnQzMl90ICopKHM0KSk7CisKKyAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKKworICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKworICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCisgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAorICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAorICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCisgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQorICAgICAgICA6CisgICAgKTsKKworICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgorICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCisKKyAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgorICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKKyAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKKyAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCisgICAgICAgIDoKKyAgICApOworCisgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCisgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICovCisgICAgaWYgKCEoKChwMSAtIHA0KSA9PSAwKSAmJiAoKHAyIC0gcDMpID09IDApKSkKKyAgICB7CisKKyAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsIHRocmVzaCwgJmhldiwgJm1hc2spOworCisgICAgICAgIC8qIGlmIG1hc2sgPT0gMCBkbyBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZCAqLworICAgICAgICBpZiAobWFzaykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmlsdGVyaW5nICovCisgICAgICAgICAgICB2cDhfbWJmaWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMCwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUpOworCisgICAgICAgICAgICAvKiBkb24ndCB1c2UgdHJhbnNwb3NlIG9uIG91dHB1dCBkYXRhCisgICAgICAgICAgICAgKiBiZWNhdXNlIG1lbW9yeSBpc24ndCBhbGlnbmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzNF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzNF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3M0XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczRdICJyIiAoczQpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDVdLCAlW3A1XSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AwXSwgJVtwMF0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDogW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKKyAgICAgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCkKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzM10pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczNdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzM10pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3MzXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MzXSAiciIgKHMzKSwKKyAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A1XSwgJVtwNV0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMF0sICVbcDBdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6IFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCisgICAgICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3MyXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczJdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MyXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczJdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzMl0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMl0gInIiIChzMiksCisgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNV0sICVbcDVdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDBdLCAlW3AwXSwgOCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzMV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczFdICJyIiAoczEpLAorICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogSG9yaXpvbnRhbCBNQiBmaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9kc3ByMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHVuc2lnbmVkIGludCB0aHJlc2hfdmVjLCBmbGltaXRfdmVjLCBsaW1pdF92ZWM7CisgICAgdW5zaWduZWQgY2hhciB0aHJlc2gsIGZsaW1pdCwgbGltaXQsIGZsaW1pdF90ZW1wOworCisgICAgLyogdXNlIGRpcmVjdCB2YWx1ZSBpbnN0ZWFkIHBvaW50ZXJzICovCisgICAgbGltaXQgPSAqKGxmaS0+bGltKTsKKyAgICBmbGltaXRfdGVtcCA9ICoobGZpLT5tYmxpbSk7CisgICAgdGhyZXNoID0gKihsZmktPmhldl90aHIpOworICAgIGZsaW1pdCA9IGZsaW1pdF90ZW1wOworCisgICAgLyogY3JlYXRlIHF1YWQtYnl0ZSAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgInJlcGx2LnFiICAgICAgICVbdGhyZXNoX3ZlY10sICVbdGhyZXNoXSAgICBcblx0IgorICAgICAgICAicmVwbHYucWIgICAgICAgJVtmbGltaXRfdmVjXSwgJVtmbGltaXRdICAgIFxuXHQiCisgICAgICAgICJyZXBsdi5xYiAgICAgICAlW2xpbWl0X3ZlY10sICAlW2xpbWl0XSAgICAgXG5cdCIKKyAgICAgICAgOiBbdGhyZXNoX3ZlY10gIj0mciIgKHRocmVzaF92ZWMpLCBbZmxpbWl0X3ZlY10gIj0mciIgKGZsaW1pdF92ZWMpLCBbbGltaXRfdmVjXSAiPXIiIChsaW1pdF92ZWMpCisgICAgICAgIDogW3RocmVzaF0gInIiICh0aHJlc2gpLCBbZmxpbWl0XSAiciIgKGZsaW1pdCksIFtsaW1pdF0gInIiIChsaW1pdCkKKyAgICApOworCisgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21pcHMoeV9wdHIsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKKworICAgIGlmICh1X3B0cikKKyAgICB7CisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3V2aG9yaXpvbnRhbF9lZGdlX21pcHModV9wdHIsIHV2X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAwKTsKKyAgICB9CisKKyAgICBpZiAodl9wdHIpCisgICAgeworICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl91dmhvcml6b250YWxfZWRnZV9taXBzKHZfcHRyLCB1dl9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMCk7CisgICAgfQorfQorCisKKy8qIFZlcnRpY2FsIE1CIEZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X2RzcHIyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdW5zaWduZWQgaW50IHRocmVzaF92ZWMsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYzsKKyAgICB1bnNpZ25lZCBjaGFyIHRocmVzaCwgZmxpbWl0LCBsaW1pdCwgZmxpbWl0X3RlbXA7CisKKyAgICAvKiB1c2UgZGlyZWN0IHZhbHVlIGluc3RlYWQgcG9pbnRlcnMgKi8KKyAgICBsaW1pdCA9ICoobGZpLT5saW0pOworICAgIGZsaW1pdF90ZW1wID0gKihsZmktPm1ibGltKTsKKyAgICB0aHJlc2ggPSAqKGxmaS0+aGV2X3Rocik7CisgICAgZmxpbWl0ID0gZmxpbWl0X3RlbXA7CisKKyAgICAvKiBjcmVhdGUgcXVhZC1ieXRlICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicmVwbHYucWIgICAgICAgJVt0aHJlc2hfdmVjXSwgJVt0aHJlc2hdICAgIFxuXHQiCisgICAgICAgICJyZXBsdi5xYiAgICAgICAlW2ZsaW1pdF92ZWNdLCAlW2ZsaW1pdF0gICAgXG5cdCIKKyAgICAgICAgInJlcGx2LnFiICAgICAgICVbbGltaXRfdmVjXSwgICVbbGltaXRdICAgICBcblx0IgorICAgICAgICA6IFt0aHJlc2hfdmVjXSAiPSZyIiAodGhyZXNoX3ZlYyksIFtmbGltaXRfdmVjXSAiPSZyIiAoZmxpbWl0X3ZlYyksIFtsaW1pdF92ZWNdICI9ciIgKGxpbWl0X3ZlYykKKyAgICAgICAgOiBbdGhyZXNoXSAiciIgKHRocmVzaCksIFtmbGltaXRdICJyIiAoZmxpbWl0KSwgW2xpbWl0XSAiciIgKGxpbWl0KQorICAgICk7CisKKyAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21pcHMoeV9wdHIsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdXZ2ZXJ0aWNhbF9lZGdlX21pcHModV9wdHIsIHV2X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAwKTsKKworICAgIGlmICh2X3B0cikKKyAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdXZ2ZXJ0aWNhbF9lZGdlX21pcHModl9wdHIsIHV2X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAwKTsKK30KKworCisvKiBIb3Jpem9udGFsIEIgRmlsdGVyaW5nICovCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9kc3ByMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdW5zaWduZWQgaW50IHRocmVzaF92ZWMsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYzsKKyAgICB1bnNpZ25lZCBjaGFyIHRocmVzaCwgZmxpbWl0LCBsaW1pdCwgZmxpbWl0X3RlbXA7CisKKyAgICAvKiB1c2UgZGlyZWN0IHZhbHVlIGluc3RlYWQgcG9pbnRlcnMgKi8KKyAgICBsaW1pdCA9ICoobGZpLT5saW0pOworICAgIGZsaW1pdF90ZW1wID0gKihsZmktPmJsaW0pOworICAgIHRocmVzaCA9ICoobGZpLT5oZXZfdGhyKTsKKyAgICBmbGltaXQgPSBmbGltaXRfdGVtcDsKKworICAgIC8qIGNyZWF0ZSBxdWFkLWJ5dGUgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJyZXBsdi5xYiAgICAgICAlW3RocmVzaF92ZWNdLCAlW3RocmVzaF0gICAgXG5cdCIKKyAgICAgICAgInJlcGx2LnFiICAgICAgICVbZmxpbWl0X3ZlY10sICVbZmxpbWl0XSAgICBcblx0IgorICAgICAgICAicmVwbHYucWIgICAgICAgJVtsaW1pdF92ZWNdLCAgJVtsaW1pdF0gICAgIFxuXHQiCisgICAgICAgIDogW3RocmVzaF92ZWNdICI9JnIiICh0aHJlc2hfdmVjKSwgW2ZsaW1pdF92ZWNdICI9JnIiIChmbGltaXRfdmVjKSwgW2xpbWl0X3ZlY10gIj1yIiAobGltaXRfdmVjKQorICAgICAgICA6IFt0aHJlc2hdICJyIiAodGhyZXNoKSwgW2ZsaW1pdF0gInIiIChmbGltaXQpLCBbbGltaXRdICJyIiAobGltaXQpCisgICAgKTsKKworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbWlwcyh5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMTYpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbWlwcyh5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMTYpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbWlwcyh5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3V2aG9yaXpvbnRhbF9lZGdlX21pcHModV9wdHIgKyA0ICogdXZfc3RyaWRlLCB1dl9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMCk7CisKKyAgICBpZiAodl9wdHIpCisgICAgICAgIHZwOF9sb29wX2ZpbHRlcl91dmhvcml6b250YWxfZWRnZV9taXBzKHZfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDApOworfQorCisKKy8qIFZlcnRpY2FsIEIgRmlsdGVyaW5nICovCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idl9kc3ByMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdW5zaWduZWQgaW50IHRocmVzaF92ZWMsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYzsKKyAgICB1bnNpZ25lZCBjaGFyIHRocmVzaCwgZmxpbWl0LCBsaW1pdCwgZmxpbWl0X3RlbXA7CisKKyAgICAvKiB1c2UgZGlyZWN0IHZhbHVlIGluc3RlYWQgcG9pbnRlcnMgKi8KKyAgICBsaW1pdCA9ICoobGZpLT5saW0pOworICAgIGZsaW1pdF90ZW1wID0gKihsZmktPmJsaW0pOworICAgIHRocmVzaCA9ICoobGZpLT5oZXZfdGhyKTsKKyAgICBmbGltaXQgPSBmbGltaXRfdGVtcDsKKworICAgIC8qIGNyZWF0ZSBxdWFkLWJ5dGUgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICJyZXBsdi5xYiAgICAgICAlW3RocmVzaF92ZWNdLCAlW3RocmVzaF0gICAgXG5cdCIKKyAgICAgICAgInJlcGx2LnFiICAgICAgICVbZmxpbWl0X3ZlY10sICVbZmxpbWl0XSAgICBcblx0IgorICAgICAgICAicmVwbHYucWIgICAgICAgJVtsaW1pdF92ZWNdLCAgJVtsaW1pdF0gICAgIFxuXHQiCisgICAgICAgIDogW3RocmVzaF92ZWNdICI9JnIiICh0aHJlc2hfdmVjKSwgW2ZsaW1pdF92ZWNdICI9JnIiIChmbGltaXRfdmVjKSwgW2xpbWl0X3ZlY10gIj1yIiAobGltaXRfdmVjKQorICAgICAgICA6IFt0aHJlc2hdICJyIiAodGhyZXNoKSwgW2ZsaW1pdF0gInIiIChmbGltaXQpLCBbbGltaXRdICJyIiAobGltaXQpCisgICAgKTsKKworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21pcHMoeV9wdHIgKyA0LCB5X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAxNik7CisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbWlwcyh5X3B0ciArIDgsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzKHlfcHRyICsgMTIsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzKHVfcHRyICsgNCwgdXZfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDApOworCisgICAgaWYgKHZfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdXZ2ZXJ0aWNhbF9lZGdlX21pcHModl9wdHIgKyA0LCB1dl9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9yZWNvbmludGVyX2RzcHIyLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9taXBzL2RzcHIyL3JlY29uaW50ZXJfZHNwcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTIzOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vbWlwcy9kc3ByMi9yZWNvbmludGVyX2RzcHIyLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbnRlZ2VyLmgiCisKKyNpZiBIQVZFX0RTUFIyCitpbmxpbmUgdm9pZCBwcmVmZXRjaF9sb2FkX2ludCh1bnNpZ25lZCBjaGFyICpzcmMpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgICAicHJlZiAgIDAsICAwKCVbc3JjXSkgICBcblx0IgorICAgICAgICA6CisgICAgICAgIDogW3NyY10gInIiIChzcmMpCisgICAgKTsKK30KKworCitfX2lubGluZSB2b2lkIHZwOF9jb3B5X21lbTE2eDE2X2RzcHIyKAorICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIHNyYywKKyAgICBpbnQgc3JjX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBkc3QsCisgICAgaW50IGRzdF9zdHJpZGUpCit7CisgICAgaW50IHI7CisgICAgdW5zaWduZWQgaW50IGEwLCBhMSwgYTIsIGEzOworCisgICAgZm9yIChyID0gMTY7IHItLTspCisgICAgeworICAgICAgICAvKiBsb2FkIHNyYyBkYXRhIGluIGNhY2hlIG1lbW9yeSAqLworICAgICAgICBwcmVmZXRjaF9sb2FkX2ludChzcmMgKyBzcmNfc3RyaWRlKTsKKworICAgICAgICAvKiB1c2UgdW5hbGlnbmVkIG1lbW9yeSBsb2FkIGFuZCBzdG9yZSAqLworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAgICAgICAidWx3ICAgICVbYTBdLCAwKCVbc3JjXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInVsdyAgICAlW2ExXSwgNCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ1bHcgICAgJVthMl0sIDgoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICVbYTNdLCAxMiglW3NyY10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW2EwXSwgMCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVthMV0sIDQoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICVbYTJdLCA4KCVbZHN0XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW2EzXSwgMTIoJVtkc3RdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2EwXSAiPSZyIiAoYTApLCBbYTFdICI9JnIiIChhMSksCisgICAgICAgICAgICAgIFthMl0gIj0mciIgKGEyKSwgW2EzXSAiPSZyIiAoYTMpCisgICAgICAgICAgICA6IFtzcmNdICJyIiAoc3JjKSwgW2RzdF0gInIiIChkc3QpCisgICAgICAgICk7CisKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KK30KKworCitfX2lubGluZSB2b2lkIHZwOF9jb3B5X21lbTh4OF9kc3ByMigKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBzcmMsCisgICAgaW50IHNyY19zdHJpZGUsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1QgZHN0LAorICAgIGludCBkc3Rfc3RyaWRlKQoreworICAgIGludCByOworICAgIHVuc2lnbmVkIGludCBhMCwgYTE7CisKKyAgICAvKiBsb2FkIHNyYyBkYXRhIGluIGNhY2hlIG1lbW9yeSAqLworICAgIHByZWZldGNoX2xvYWRfaW50KHNyYyArIHNyY19zdHJpZGUpOworCisgICAgZm9yIChyID0gODsgci0tOykKKyAgICB7CisgICAgICAgIC8qIHVzZSB1bmFsaWduZWQgbWVtb3J5IGxvYWQgYW5kIHN0b3JlICovCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICJ1bHcgICAgJVthMF0sIDAoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICVbYTFdLCA0KCVbc3JjXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW2EwXSwgMCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVthMV0sIDQoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFthMF0gIj0mciIgKGEwKSwgW2ExXSAiPSZyIiAoYTEpCisgICAgICAgICAgICA6IFtzcmNdICJyIiAoc3JjKSwgW2RzdF0gInIiIChkc3QpCisgICAgICAgICk7CisKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KK30KKworCitfX2lubGluZSB2b2lkIHZwOF9jb3B5X21lbTh4NF9kc3ByMigKKyAgICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBzcmMsCisgICAgaW50IHNyY19zdHJpZGUsCisgICAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1QgZHN0LAorICAgIGludCBkc3Rfc3RyaWRlKQoreworICAgIGludCByOworICAgIHVuc2lnbmVkIGludCBhMCwgYTE7CisKKyAgICAvKiBsb2FkIHNyYyBkYXRhIGluIGNhY2hlIG1lbW9yeSAqLworICAgIHByZWZldGNoX2xvYWRfaW50KHNyYyArIHNyY19zdHJpZGUpOworCisgICAgZm9yIChyID0gNDsgci0tOykKKyAgICB7CisgICAgICAgIC8qIHVzZSB1bmFsaWduZWQgbWVtb3J5IGxvYWQgYW5kIHN0b3JlICovCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgICAgICJ1bHcgICAgJVthMF0sIDAoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAidWx3ICAgICVbYTFdLCA0KCVbc3JjXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAlW2EwXSwgMCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJVthMV0sIDQoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgIDogW2EwXSAiPSZyIiAoYTApLCBbYTFdICI9JnIiIChhMSkKKyAgICAgICAgICAgOiBbc3JjXSAiciIgKHNyYyksIFtkc3RdICJyIiAoZHN0KQorICAgICAgICApOworCisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9tb2RlY29udC5jIGIvbGlidnB4L3ZwOC9jb21tb24vbW9kZWNvbnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9tb2RlY29udC5jCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9tb2RlY29udC5jCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL21vZGVjb250LmggYi9saWJ2cHgvdnA4L2NvbW1vbi9tb2RlY29udC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL21vZGVjb250LmgKcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL21vZGVjb250LmgKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL212LmggYi9saWJ2cHgvdnA4L2NvbW1vbi9tdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjkxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9tdi5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX01WX0gKKyNkZWZpbmUgX19JTkNfTVZfSAorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHNob3J0IHJvdzsKKyAgICBzaG9ydCBjb2w7Cit9IE1WOworCit0eXBlZGVmIHVuaW9uIGludF9tdgoreworICAgIHVpbnQzMl90ICBhc19pbnQ7CisgICAgTVYgICAgICAgIGFzX212OworfSBpbnRfbXY7ICAgICAgICAvKiBmYWNpbGl0YXRlcyBmYXN0ZXIgZXF1YWxpdHkgdGVzdHMgYW5kIGNvcGllcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL29ueXguaCBiL2xpYnZweC92cDgvY29tbW9uL29ueXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZiNGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vb255eC5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19WUDhfSAorI2RlZmluZSBfX0lOQ19WUDhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgorI2luY2x1ZGUgInBwZmxhZ3MuaCIKKworICAgIHN0cnVjdCBWUDhfQ09NUDsKKworICAgIC8qIENyZWF0ZS9kZXN0cm95IHN0YXRpYyBkYXRhIHN0cnVjdHVyZXMuICovCisKKyAgICB0eXBlZGVmIGVudW0KKyAgICB7CisgICAgICAgIE5PUk1BTCAgICAgID0gMCwKKyAgICAgICAgRk9VUkZJVkUgICAgPSAxLAorICAgICAgICBUSFJFRUZJVkUgICA9IDIsCisgICAgICAgIE9ORVRXTyAgICAgID0gMworCisgICAgfSBWUFhfU0NBTElORzsKKworICAgIHR5cGVkZWYgZW51bQorICAgIHsKKyAgICAgICAgVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSICAgID0gMHgwLAorICAgICAgICBVU0FHRV9MT0NBTF9GSUxFX1BMQVlCQUNLICAgPSAweDEsCisgICAgICAgIFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkgICA9IDB4MgorICAgIH0gRU5EX1VTQUdFOworCisKKyAgICB0eXBlZGVmIGVudW0KKyAgICB7CisgICAgICAgIE1PREVfUkVBTFRJTUUgICAgICAgPSAweDAsCisgICAgICAgIE1PREVfR09PRFFVQUxJVFkgICAgPSAweDEsCisgICAgICAgIE1PREVfQkVTVFFVQUxJVFkgICAgPSAweDIsCisgICAgICAgIE1PREVfRklSU1RQQVNTICAgICAgPSAweDMsCisgICAgICAgIE1PREVfU0VDT05EUEFTUyAgICAgPSAweDQsCisgICAgICAgIE1PREVfU0VDT05EUEFTU19CRVNUID0gMHg1CisgICAgfSBNT0RFOworCisgICAgdHlwZWRlZiBlbnVtCisgICAgeworICAgICAgICBGUkFNRUZMQUdTX0tFWSAgICA9IDEsCisgICAgICAgIEZSQU1FRkxBR1NfR09MREVOID0gMiwKKyAgICAgICAgRlJBTUVGTEFHU19BTFRSRUYgPSA0CisgICAgfSBGUkFNRVRZUEVfRkxBR1M7CisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorICAgIHN0YXRpYyB2b2lkIFNjYWxlMlJhdGlvKGludCBtb2RlLCBpbnQgKmhyLCBpbnQgKmhzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtb2RlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgICAgTk9STUFMOgorICAgICAgICAgICAgKmhyID0gMTsKKyAgICAgICAgICAgICpocyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAgICBGT1VSRklWRToKKyAgICAgICAgICAgICpociA9IDQ7CisgICAgICAgICAgICAqaHMgPSA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgICAgVEhSRUVGSVZFOgorICAgICAgICAgICAgKmhyID0gMzsKKyAgICAgICAgICAgICpocyA9IDU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAgICBPTkVUV086CisgICAgICAgICAgICAqaHIgPSAxOworICAgICAgICAgICAgKmhzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKmhyID0gMTsKKyAgICAgICAgICAgICpocyA9IDE7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICAvKiA0IHZlcnNpb25zIG9mIGJpdHN0cmVhbSBkZWZpbmVkOgorICAgICAgICAgKiAgIDAgYmVzdCBxdWFsaXR5L3Nsb3dlc3QgZGVjb2RlLCAzIGxvd2VzdCBxdWFsaXR5L2Zhc3Rlc3QgZGVjb2RlCisgICAgICAgICAqLworICAgICAgICBpbnQgVmVyc2lvbjsKKyAgICAgICAgaW50IFdpZHRoOworICAgICAgICBpbnQgSGVpZ2h0OworICAgICAgICBzdHJ1Y3QgdnB4X3JhdGlvbmFsICB0aW1lYmFzZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9iYW5kd2lkdGg7ICAgIC8qIGtpbG9iaXRzIHBlciBzZWNvbmQgKi8KKworICAgICAgICAvKiBwYXJhbWV0ZXIgdXNlZCBmb3IgYXBwbHlpbmcgcHJlIHByb2Nlc3NpbmcgYmx1cjogcmVjb21tZW5kYXRpb24gMCAqLworICAgICAgICBpbnQgbm9pc2Vfc2Vuc2l0aXZpdHk7CisKKyAgICAgICAgLyogcGFyYW1ldGVyIHVzZWQgZm9yIHNoYXJwZW5pbmcgb3V0cHV0OiByZWNvbW1lbmRhdGlvbiAwOiAqLworICAgICAgICBpbnQgU2hhcnBuZXNzOworICAgICAgICBpbnQgY3B1X3VzZWQ7CisgICAgICAgIHVuc2lnbmVkIGludCByY19tYXhfaW50cmFfYml0cmF0ZV9wY3Q7CisKKyAgICAgICAgLyogbW9kZSAtPgorICAgICAgICAgKigwKT1SZWFsdGltZS9MaXZlIEVuY29kaW5nLiBUaGlzIG1vZGUgaXMgb3B0aW1pemVkIGZvciByZWFsdGltCisgICAgICAgICAqICAgIGVuY29kaW5nIChmb3IgZXhhbXBsZSwgY2FwdHVyaW5nIGEgdGVsZXZpc2lvbiBzaWduYWwgb3IgZmVlZAorICAgICAgICAgKiAgICBmcm9tIGEgbGl2ZSBjYW1lcmEpLiAoIHNwZWVkIHNldHRpbmcgY29udHJvbHMgaG93IGZhc3QgKQorICAgICAgICAgKigxKT1Hb29kIFF1YWxpdHkgRmFzdCBFbmNvZGluZy4gVGhlIGVuY29kZXIgYmFsYW5jZXMgcXVhbGl0eSB3aXRoCisgICAgICAgICAqICAgIHRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyB0byBlbmNvZGUgdGhlIG91dHB1dC4gKCBzcGVlZAorICAgICAgICAgKiAgICBzZXR0aW5nIGNvbnRyb2xzIGhvdyBmYXN0ICkKKyAgICAgICAgICooMik9T25lIFBhc3MgLSBCZXN0IFF1YWxpdHkuIFRoZSBlbmNvZGVyIHBsYWNlcyBwcmlvcml0eSBvbiB0aGUKKyAgICAgICAgICogICAgcXVhbGl0eSBvZiB0aGUgb3V0cHV0IG92ZXIgZW5jb2Rpbmcgc3BlZWQuIFRoZSBvdXRwdXQgaXMKKyAgICAgICAgICogICAgY29tcHJlc3NlZCBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBxdWFsaXR5LiBUaGlzIG9wdGlvbiB0YWtlcworICAgICAgICAgKiAgICB0aGUgbG9uZ2VzdCBhbW91bnQgb2YgdGltZSB0byBlbmNvZGUuICggc3BlZWQgc2V0dGluZyBpZ25vcmVkCisgICAgICAgICAqICAgICkKKyAgICAgICAgICooMyk9VHdvIFBhc3MgLSBGaXJzdCBQYXNzLiBUaGUgZW5jb2RlciBnZW5lcmF0ZXMgYSBmaWxlIG9mCisgICAgICAgICAqICAgIHN0YXRpc3RpY3MgZm9yIHVzZSBpbiB0aGUgc2Vjb25kIGVuY29kaW5nIHBhc3MuICggc3BlZWQKKyAgICAgICAgICogICAgc2V0dGluZyBjb250cm9scyBob3cgZmFzdCApCisgICAgICAgICAqKDQpPVR3byBQYXNzIC0gU2Vjb25kIFBhc3MuIFRoZSBlbmNvZGVyIHVzZXMgdGhlIHN0YXRpc3RpY3MgdGhhdAorICAgICAgICAgKiAgICB3ZXJlIGdlbmVyYXRlZCBpbiB0aGUgZmlyc3QgZW5jb2RpbmcgcGFzcyB0byBjcmVhdGUgdGhlCisgICAgICAgICAqICAgIGNvbXByZXNzZWQgb3V0cHV0LiAoIHNwZWVkIHNldHRpbmcgY29udHJvbHMgaG93IGZhc3QgKQorICAgICAgICAgKig1KT1Ud28gUGFzcyAtIFNlY29uZCBQYXNzIEJlc3QuICBUaGUgZW5jb2RlciB1c2VzIHRoZSBzdGF0aXN0aWNzCisgICAgICAgICAqICAgIHRoYXQgd2VyZSBnZW5lcmF0ZWQgaW4gdGhlIGZpcnN0IGVuY29kaW5nIHBhc3MgdG8gY3JlYXRlIHRoZQorICAgICAgICAgKiAgICBjb21wcmVzc2VkIG91dHB1dCB1c2luZyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBxdWFsaXR5LCBhbmQKKyAgICAgICAgICogICAgdGFraW5nIGEgbG9uZ2VyIGFtb3VudCBvZiB0aW1lIHRvIGVuY29kZS4uICggc3BlZWQgc2V0dGluZworICAgICAgICAgKiAgICBpZ25vcmVkICkKKyAgICAgICAgICovCisgICAgICAgIGludCBNb2RlOworCisgICAgICAgIC8qIEtleSBGcmFtaW5nIE9wZXJhdGlvbnMgKi8KKyAgICAgICAgaW50IGF1dG9fa2V5OyAgICAgICAvKiBhdXRvbWF0aWNhbGx5IGRldGVjdCBjdXQgc2NlbmVzICovCisgICAgICAgIGludCBrZXlfZnJlcTsgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSB0byBrZXkgZnJhbWUuICovCisKKyAgICAgICAgLyogbGFnZ2VkIGNvbXByZXNzaW9uIChpZiBhbGxvd19sYWcgPT0gMCBsYWdfaW5fZnJhbWVzIGlzIGlnbm9yZWQpICovCisgICAgICAgIGludCBhbGxvd19sYWc7CisgICAgICAgIGludCBsYWdfaW5fZnJhbWVzOyAvKiBob3cgbWFueSBmcmFtZXMgbGFnIGJlZm9yZSB3ZSBzdGFydCBlbmNvZGluZyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIERBVEFSQVRFIENPTlRST0wgT1BUSU9OUworICAgICAgICAgKi8KKworICAgICAgICBpbnQgZW5kX3VzYWdlOyAvKiB2YnIgb3IgY2JyICovCisKKyAgICAgICAgLyogYnVmZmVyIHRhcmdldGluZyBhZ2dyZXNzaXZlbmVzcyAqLworICAgICAgICBpbnQgdW5kZXJfc2hvb3RfcGN0OworICAgICAgICBpbnQgb3Zlcl9zaG9vdF9wY3Q7CisKKyAgICAgICAgLyogYnVmZmVyaW5nIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgaW50NjRfdCBzdGFydGluZ19idWZmZXJfbGV2ZWw7CisgICAgICAgIGludDY0X3Qgb3B0aW1hbF9idWZmZXJfbGV2ZWw7CisgICAgICAgIGludDY0X3QgbWF4aW11bV9idWZmZXJfc2l6ZTsKKworICAgICAgICBpbnQ2NF90IHN0YXJ0aW5nX2J1ZmZlcl9sZXZlbF9pbl9tczsKKyAgICAgICAgaW50NjRfdCBvcHRpbWFsX2J1ZmZlcl9sZXZlbF9pbl9tczsKKyAgICAgICAgaW50NjRfdCBtYXhpbXVtX2J1ZmZlcl9zaXplX2luX21zOworCisgICAgICAgIC8qIGNvbnRyb2xsaW5nIHF1YWxpdHkgKi8KKyAgICAgICAgaW50IGZpeGVkX3E7CisgICAgICAgIGludCB3b3JzdF9hbGxvd2VkX3E7CisgICAgICAgIGludCBiZXN0X2FsbG93ZWRfcTsKKyAgICAgICAgaW50IGNxX2xldmVsOworCisgICAgICAgIC8qIGFsbG93IGludGVybmFsIHJlc2l6aW5nICovCisgICAgICAgIGludCBhbGxvd19zcGF0aWFsX3Jlc2FtcGxpbmc7CisgICAgICAgIGludCByZXNhbXBsZV9kb3duX3dhdGVyX21hcms7CisgICAgICAgIGludCByZXNhbXBsZV91cF93YXRlcl9tYXJrOworCisgICAgICAgIC8qIGFsbG93IGludGVybmFsIGZyYW1lIHJhdGUgYWx0ZXJhdGlvbnMgKi8KKyAgICAgICAgaW50IGFsbG93X2RmOworICAgICAgICBpbnQgZHJvcF9mcmFtZXNfd2F0ZXJfbWFyazsKKworICAgICAgICAvKiB0d28gcGFzcyBkYXRhcmF0ZSBjb250cm9sICovCisgICAgICAgIGludCB0d29fcGFzc192YnJiaWFzOworICAgICAgICBpbnQgdHdvX3Bhc3NfdmJybWluX3NlY3Rpb247CisgICAgICAgIGludCB0d29fcGFzc192YnJtYXhfc2VjdGlvbjsKKworICAgICAgICAvKgorICAgICAgICAgKiBFTkQgREFUQVJBVEUgQ09OVFJPTCBPUFRJT05TCisgICAgICAgICAqLworCisgICAgICAgIC8qIHRoZXNlIHBhcmFtZXRlcnMgYXJlbid0IHRvIGJlIHVzZWQgaW4gZmluYWwgYnVpbGQgZG9uJ3QgdXNlISEhICovCisgICAgICAgIGludCBwbGF5X2FsdGVybmF0ZTsKKyAgICAgICAgaW50IGFsdF9mcmVxOworICAgICAgICBpbnQgYWx0X3E7CisgICAgICAgIGludCBrZXlfcTsKKyAgICAgICAgaW50IGdvbGRfcTsKKworCisgICAgICAgIGludCBtdWx0aV90aHJlYWRlZDsgICAvKiBob3cgbWFueSB0aHJlYWRzIHRvIHJ1biB0aGUgZW5jb2RlciBvbiAqLworICAgICAgICBpbnQgdG9rZW5fcGFydGl0aW9uczsgLyogaG93IG1hbnkgdG9rZW4gcGFydGl0aW9ucyB0byBjcmVhdGUgKi8KKworICAgICAgICAvKiBlYXJseSBicmVha291dCB0aHJlc2hvbGQ6IGZvciB2aWRlbyBjb25mIHJlY29tbWVuZCA4MDAgKi8KKyAgICAgICAgaW50IGVuY29kZV9icmVha291dDsKKworICAgICAgICAvKiBCaXRmaWVsZCBkZWZpbmluZyB0aGUgZXJyb3IgcmVzaWxpZW5jeSBmZWF0dXJlcyB0byBlbmFibGUuCisgICAgICAgICAqIENhbiBwcm92aWRlIGRlY29kYWJsZSBmcmFtZXMgYWZ0ZXIgbG9zc2VzIGluIHByZXZpb3VzCisgICAgICAgICAqIGZyYW1lcyBhbmQgZGVjb2RhYmxlIHBhcnRpdGlvbnMgYWZ0ZXIgbG9zc2VzIGluIHRoZSBzYW1lIGZyYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGVycm9yX3Jlc2lsaWVudF9tb2RlOworCisgICAgICAgIGludCBhcm5yX21heF9mcmFtZXM7CisgICAgICAgIGludCBhcm5yX3N0cmVuZ3RoOworICAgICAgICBpbnQgYXJucl90eXBlOworCisgICAgICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmICAgICAgICB0d29fcGFzc19zdGF0c19pbjsKKyAgICAgICAgc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAgKm91dHB1dF9wa3RfbGlzdDsKKworICAgICAgICB2cDhlX3R1bmluZyB0dW5pbmc7CisKKyAgICAgICAgLyogVGVtcG9yYWwgc2NhbGluZyBwYXJhbWV0ZXJzICovCisgICAgICAgIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfbGF5ZXJzOworICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2JpdHJhdGVbVlBYX1RTX01BWF9QRVJJT0RJQ0lUWV07CisgICAgICAgIHVuc2lnbmVkIGludCByYXRlX2RlY2ltYXRvcltWUFhfVFNfTUFYX1BFUklPRElDSVRZXTsKKyAgICAgICAgdW5zaWduZWQgaW50IHBlcmlvZGljaXR5OworICAgICAgICB1bnNpZ25lZCBpbnQgbGF5ZXJfaWRbVlBYX1RTX01BWF9QRVJJT0RJQ0lUWV07CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgICAgIC8qIE51bWJlciBvZiB0b3RhbCByZXNvbHV0aW9ucyBlbmNvZGVkICovCisgICAgICAgIHVuc2lnbmVkIGludCBtcl90b3RhbF9yZXNvbHV0aW9uczsKKworICAgICAgICAvKiBDdXJyZW50IGVuY29kZXIgSUQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IG1yX2VuY29kZXJfaWQ7CisKKyAgICAgICAgLyogRG93bi1zYW1wbGluZyBmYWN0b3IgKi8KKyAgICAgICAgdnB4X3JhdGlvbmFsX3QgbXJfZG93bl9zYW1wbGluZ19mYWN0b3I7CisKKyAgICAgICAgLyogTWVtb3J5IGxvY2F0aW9uIHRvIHN0b3JlIGxvdy1yZXNvbHV0aW9uIGVuY29kZXIncyBtb2RlIGluZm8gKi8KKyAgICAgICAgdm9pZCogbXJfbG93X3Jlc19tb2RlX2luZm87CisjZW5kaWYKKyAgICB9IFZQOF9DT05GSUc7CisKKworICAgIHZvaWQgdnA4X2luaXRpYWxpemUoKTsKKworICAgIHN0cnVjdCBWUDhfQ09NUCogdnA4X2NyZWF0ZV9jb21wcmVzc29yKFZQOF9DT05GSUcgKm94Y2YpOworICAgIHZvaWQgdnA4X3JlbW92ZV9jb21wcmVzc29yKHN0cnVjdCBWUDhfQ09NUCogKmNvbXApOworCisgICAgdm9pZCB2cDhfaW5pdF9jb25maWcoc3RydWN0IFZQOF9DT01QKiBvbnl4LCBWUDhfQ09ORklHICpveGNmKTsKKyAgICB2b2lkIHZwOF9jaGFuZ2VfY29uZmlnKHN0cnVjdCBWUDhfQ09NUCogb255eCwgVlA4X0NPTkZJRyAqb3hjZik7CisKKyAgICBpbnQgdnA4X3JlY2VpdmVfcmF3X2ZyYW1lKHN0cnVjdCBWUDhfQ09NUCogY29tcCwgdW5zaWduZWQgaW50IGZyYW1lX2ZsYWdzLCBZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBpbnQ2NF90IHRpbWVfc3RhbXAsIGludDY0X3QgZW5kX3RpbWVfc3RhbXApOworICAgIGludCB2cDhfZ2V0X2NvbXByZXNzZWRfZGF0YShzdHJ1Y3QgVlA4X0NPTVAqIGNvbXAsIHVuc2lnbmVkIGludCAqZnJhbWVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGNoYXIgKmRlc3RfZW5kLCBpbnQ2NF90ICp0aW1lX3N0YW1wLCBpbnQ2NF90ICp0aW1lX2VuZCwgaW50IGZsdXNoKTsKKyAgICBpbnQgdnA4X2dldF9wcmV2aWV3X3Jhd19mcmFtZShzdHJ1Y3QgVlA4X0NPTVAqIGNvbXAsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwgdnA4X3BwZmxhZ3NfdCAqZmxhZ3MpOworCisgICAgaW50IHZwOF91c2VfYXNfcmVmZXJlbmNlKHN0cnVjdCBWUDhfQ09NUCogY29tcCwgaW50IHJlZl9mcmFtZV9mbGFncyk7CisgICAgaW50IHZwOF91cGRhdGVfcmVmZXJlbmNlKHN0cnVjdCBWUDhfQ09NUCogY29tcCwgaW50IHJlZl9mcmFtZV9mbGFncyk7CisgICAgaW50IHZwOF9nZXRfcmVmZXJlbmNlKHN0cnVjdCBWUDhfQ09NUCogY29tcCwgZW51bSB2cHhfcmVmX2ZyYW1lX3R5cGUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpOworICAgIGludCB2cDhfc2V0X3JlZmVyZW5jZShzdHJ1Y3QgVlA4X0NPTVAqIGNvbXAsIGVudW0gdnB4X3JlZl9mcmFtZV90eXBlIHJlZl9mcmFtZV9mbGFnLCBZVjEyX0JVRkZFUl9DT05GSUcgKnNkKTsKKyAgICBpbnQgdnA4X3VwZGF0ZV9lbnRyb3B5KHN0cnVjdCBWUDhfQ09NUCogY29tcCwgaW50IHVwZGF0ZSk7CisgICAgaW50IHZwOF9zZXRfcm9pbWFwKHN0cnVjdCBWUDhfQ09NUCogY29tcCwgdW5zaWduZWQgY2hhciAqbWFwLCB1bnNpZ25lZCBpbnQgcm93cywgdW5zaWduZWQgaW50IGNvbHMsIGludCBkZWx0YV9xWzRdLCBpbnQgZGVsdGFfbGZbNF0sIHVuc2lnbmVkIGludCB0aHJlc2hvbGRbNF0pOworICAgIGludCB2cDhfc2V0X2FjdGl2ZV9tYXAoc3RydWN0IFZQOF9DT01QKiBjb21wLCB1bnNpZ25lZCBjaGFyICptYXAsIHVuc2lnbmVkIGludCByb3dzLCB1bnNpZ25lZCBpbnQgY29scyk7CisgICAgaW50IHZwOF9zZXRfaW50ZXJuYWxfc2l6ZShzdHJ1Y3QgVlA4X0NPTVAqIGNvbXAsIFZQWF9TQ0FMSU5HIGhvcml6X21vZGUsIFZQWF9TQ0FMSU5HIHZlcnRfbW9kZSk7CisgICAgaW50IHZwOF9nZXRfcXVhbnRpemVyKHN0cnVjdCBWUDhfQ09NUCogYyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vb255eGNfaW50LmggYi9saWJ2cHgvdnA4L2NvbW1vbi9vbnl4Y19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI1YmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vb255eGNfaW50LmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX1ZQOENfSU5UX0gKKyNkZWZpbmUgX19JTkNfVlA4Q19JTlRfSAorCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvb3BmaWx0ZXIuaCIKKyNpbmNsdWRlICJlbnRyb3B5bXYuaCIKKyNpbmNsdWRlICJlbnRyb3B5LmgiCisjaWYgQ09ORklHX1BPU1RQUk9DCisjaW5jbHVkZSAicG9zdHByb2MuaCIKKyNlbmRpZgorCisvKiNpZmRlZiBQQUNLRVRfVEVTVElORyovCisjaW5jbHVkZSAiaGVhZGVyLmgiCisvKiNlbmRpZiovCisKKyNkZWZpbmUgTUlOUSAwCisjZGVmaW5lIE1BWFEgMTI3CisjZGVmaW5lIFFJTkRFWF9SQU5HRSAoTUFYUSArIDEpCisKKyNkZWZpbmUgTlVNX1lWMTJfQlVGRkVSUyA0CisKKyNkZWZpbmUgTUFYX1BBUlRJVElPTlMgOQorCit0eXBlZGVmIHN0cnVjdCBmcmFtZV9jb250ZXh0cworeworICAgIHZwOF9wcm9iIGJtb2RlX3Byb2IgW1ZQOF9CSU5UUkFNT0RFUy0xXTsKKyAgICB2cDhfcHJvYiB5bW9kZV9wcm9iIFtWUDhfWU1PREVTLTFdOyAgIC8qIGludGVyZnJhbWUgaW50cmEgbW9kZSBwcm9icyAqLworICAgIHZwOF9wcm9iIHV2X21vZGVfcHJvYiBbVlA4X1VWX01PREVTLTFdOworICAgIHZwOF9wcm9iIHN1Yl9tdl9yZWZfcHJvYiBbVlA4X1NVQk1WUkVGUy0xXTsKKyAgICB2cDhfcHJvYiBjb2VmX3Byb2JzIFtCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFtFTlRST1BZX05PREVTXTsKKyAgICBNVl9DT05URVhUIG12Y1syXTsKK30gRlJBTUVfQ09OVEVYVDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgT05FX1BBUlRJVElPTiAgPSAwLAorICAgIFRXT19QQVJUSVRJT04gID0gMSwKKyAgICBGT1VSX1BBUlRJVElPTiA9IDIsCisgICAgRUlHSFRfUEFSVElUSU9OID0gMworfSBUT0tFTl9QQVJUSVRJT047CisKK3R5cGVkZWYgZW51bQoreworICAgIFJFQ09OX0NMQU1QX1JFUVVJUkVEICAgICAgICA9IDAsCisgICAgUkVDT05fQ0xBTVBfTk9UUkVRVUlSRUQgICAgID0gMQorfSBDTEFNUF9UWVBFOworCit0eXBlZGVmIHN0cnVjdCBWUDhDb21tb24KKworeworICAgIHN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbyAgZXJyb3I7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMWRlcXVhbnRbUUlOREVYX1JBTkdFXVsyXSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgWTJkZXF1YW50W1FJTkRFWF9SQU5HRV1bMl0pOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFVWZGVxdWFudFtRSU5ERVhfUkFOR0VdWzJdKTsKKworICAgIGludCBXaWR0aDsKKyAgICBpbnQgSGVpZ2h0OworICAgIGludCBob3Jpel9zY2FsZTsKKyAgICBpbnQgdmVydF9zY2FsZTsKKworICAgIFlVVl9UWVBFIGNscl90eXBlOworICAgIENMQU1QX1RZUEUgIGNsYW1wX3R5cGU7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmZyYW1lX3RvX3Nob3c7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgeXYxMl9mYltOVU1fWVYxMl9CVUZGRVJTXTsKKyAgICBpbnQgZmJfaWR4X3JlZl9jbnRbTlVNX1lWMTJfQlVGRkVSU107CisgICAgaW50IG5ld19mYl9pZHgsIGxzdF9mYl9pZHgsIGdsZF9mYl9pZHgsIGFsdF9mYl9pZHg7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgdGVtcF9zY2FsZV9mcmFtZTsKKworI2lmIENPTkZJR19QT1NUUFJPQworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBwb3N0X3Byb2NfYnVmZmVyOworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBwb3N0X3Byb2NfYnVmZmVyX2ludDsKKyAgICBpbnQgcG9zdF9wcm9jX2J1ZmZlcl9pbnRfdXNlZDsKKyAgICB1bnNpZ25lZCBjaGFyICpwcF9saW1pdHNfYnVmZmVyOyAgIC8qIHBvc3QtcHJvY2Vzc2luZyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisjZW5kaWYKKworICAgIEZSQU1FX1RZUEUgbGFzdF9mcmFtZV90eXBlOyAgLyogU2F2ZSBsYXN0IGZyYW1lJ3MgZnJhbWUgdHlwZSBmb3IgbW90aW9uIHNlYXJjaC4gKi8KKyAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7CisKKyAgICBpbnQgc2hvd19mcmFtZTsKKworICAgIGludCBmcmFtZV9mbGFnczsKKyAgICBpbnQgTUJzOworICAgIGludCBtYl9yb3dzOworICAgIGludCBtYl9jb2xzOworICAgIGludCBtb2RlX2luZm9fc3RyaWRlOworCisgICAgLyogcHJvZmlsZSBzZXR0aW5ncyAqLworICAgIGludCBtYl9ub19jb2VmZl9za2lwOworICAgIGludCBub19scGY7CisgICAgaW50IHVzZV9iaWxpbmVhcl9tY19maWx0ZXI7CisgICAgaW50IGZ1bGxfcGl4ZWw7CisKKyAgICBpbnQgYmFzZV9xaW5kZXg7CisKKyAgICBpbnQgeTFkY19kZWx0YV9xOworICAgIGludCB5MmRjX2RlbHRhX3E7CisgICAgaW50IHkyYWNfZGVsdGFfcTsKKyAgICBpbnQgdXZkY19kZWx0YV9xOworICAgIGludCB1dmFjX2RlbHRhX3E7CisKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVzX3NpbmNlX2dvbGRlbjsKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZTsKKworICAgIC8qIFdlIGFsbG9jYXRlIGEgTU9ERV9JTkZPIHN0cnVjdCBmb3IgZWFjaCBtYWNyb2Jsb2NrLCB0b2dldGhlciB3aXRoCisgICAgICAgYW4gZXh0cmEgcm93IG9uIHRvcCBhbmQgY29sdW1uIG9uIHRoZSBsZWZ0IHRvIHNpbXBsaWZ5IHByZWRpY3Rpb24uICovCisKKyAgICBNT0RFX0lORk8gKm1pcDsgLyogQmFzZSBvZiBhbGxvY2F0ZWQgYXJyYXkgKi8KKyAgICBNT0RFX0lORk8gKm1pOyAgLyogQ29ycmVzcG9uZHMgdG8gdXBwZXIgbGVmdCB2aXNpYmxlIG1hY3JvYmxvY2sgKi8KKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICBNT0RFX0lORk8gKnByZXZfbWlwOyAvKiBNT0RFX0lORk8gYXJyYXkgJ21pcCcgZnJvbSBsYXN0IGRlY29kZWQgZnJhbWUgKi8KKyAgICBNT0RFX0lORk8gKnByZXZfbWk7ICAvKiAnbWknIGZyb20gbGFzdCBmcmFtZSAocG9pbnRzIGludG8gcHJldl9taXApICovCisjZW5kaWYKKworICAgIExPT1BGSUxURVJUWVBFIGZpbHRlcl90eXBlOworCisgICAgbG9vcF9maWx0ZXJfaW5mb19uIGxmX2luZm87CisKKyAgICBpbnQgZmlsdGVyX2xldmVsOworICAgIGludCBsYXN0X3NoYXJwbmVzc19sZXZlbDsKKyAgICBpbnQgc2hhcnBuZXNzX2xldmVsOworCisgICAgaW50IHJlZnJlc2hfbGFzdF9mcmFtZTsgICAgICAgLyogVHdvIHN0YXRlIDAgPSBOTywgMSA9IFlFUyAqLworICAgIGludCByZWZyZXNoX2dvbGRlbl9mcmFtZTsgICAgIC8qIFR3byBzdGF0ZSAwID0gTk8sIDEgPSBZRVMgKi8KKyAgICBpbnQgcmVmcmVzaF9hbHRfcmVmX2ZyYW1lOyAgICAgLyogVHdvIHN0YXRlIDAgPSBOTywgMSA9IFlFUyAqLworCisgICAgaW50IGNvcHlfYnVmZmVyX3RvX2dmOyAgICAgICAgIC8qIDAgbm9uZSwgMSBMYXN0IHRvIEdGLCAyIEFSRiB0byBHRiAqLworICAgIGludCBjb3B5X2J1ZmZlcl90b19hcmY7ICAgICAgICAvKiAwIG5vbmUsIDEgTGFzdCB0byBBUkYsIDIgR0YgdG8gQVJGICovCisKKyAgICBpbnQgcmVmcmVzaF9lbnRyb3B5X3Byb2JzOyAgICAvKiBUd28gc3RhdGUgMCA9IE5PLCAxID0gWUVTICovCisKKyAgICBpbnQgcmVmX2ZyYW1lX3NpZ25fYmlhc1tNQVhfUkVGX0ZSQU1FU107ICAgIC8qIFR3byBzdGF0ZSAwLCAxICovCisKKyAgICAvKiBZLFUsVixZMiAqLworICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgKmFib3ZlX2NvbnRleHQ7ICAgLyogcm93IG9mIGNvbnRleHQgZm9yIGVhY2ggcGxhbmUgKi8KKyAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIGxlZnRfY29udGV4dDsgIC8qICh1cCB0bykgNCBjb250ZXh0cyAiIiAqLworCisgICAgRlJBTUVfQ09OVEVYVCBsZmM7IC8qIGxhc3QgZnJhbWUgZW50cm9weSAqLworICAgIEZSQU1FX0NPTlRFWFQgZmM7ICAvKiB0aGlzIGZyYW1lIGVudHJvcHkgKi8KKworICAgIHVuc2lnbmVkIGludCBjdXJyZW50X3ZpZGVvX2ZyYW1lOworCisgICAgaW50IG5lYXJfYm9mZnNldFszXTsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIFRPS0VOX1BBUlRJVElPTiBtdWx0aV90b2tlbl9wYXJ0aXRpb247CisKKyNpZmRlZiBQQUNLRVRfVEVTVElORworICAgIFZQOF9IRUFERVIgb2g7CisjZW5kaWYKKyAgICBkb3VibGUgYml0cmF0ZTsKKyAgICBkb3VibGUgZnJhbWVyYXRlOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgaW50IHByb2Nlc3Nvcl9jb3JlX2NvdW50OworI2VuZGlmCisjaWYgQ09ORklHX1BPU1RQUk9DCisgICAgc3RydWN0IHBvc3Rwcm9jX3N0YXRlICBwb3N0cHJvY19zdGF0ZTsKKyNlbmRpZgorICAgIGludCBjcHVfY2FwczsKK30gVlA4X0NPTU1PTjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9vbnl4ZC5oIGIvbGlidnB4L3ZwOC9jb21tb24vb255eGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdlMDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vb255eGQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19WUDhEX0gKKyNkZWZpbmUgX19JTkNfVlA4RF9ICisKKworLyogQ3JlYXRlL2Rlc3Ryb3kgc3RhdGljIGRhdGEgc3RydWN0dXJlcy4gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisjaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKKyNpbmNsdWRlICJwcGZsYWdzLmgiCisjaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgorI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKKyNpbmNsdWRlICJ2cHgvdnA4LmgiCisKKyAgICBzdHJ1Y3QgVlA4RF9DT01QOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIGludCAgICAgV2lkdGg7CisgICAgICAgIGludCAgICAgSGVpZ2h0OworICAgICAgICBpbnQgICAgIFZlcnNpb247CisgICAgICAgIGludCAgICAgcG9zdHByb2Nlc3M7CisgICAgICAgIGludCAgICAgbWF4X3RocmVhZHM7CisgICAgICAgIGludCAgICAgZXJyb3JfY29uY2VhbG1lbnQ7CisgICAgICAgIGludCAgICAgaW5wdXRfZnJhZ21lbnRzOworICAgIH0gVlA4RF9DT05GSUc7CisKKyAgICB0eXBlZGVmIGVudW0KKyAgICB7CisgICAgICAgIFZQOERfT0sgPSAwCisgICAgfSBWUDhEX1NFVFRJTkc7CisKKyAgICB2b2lkIHZwOGR4X2luaXRpYWxpemUodm9pZCk7CisKKyAgICB2b2lkIHZwOGR4X3NldF9zZXR0aW5nKHN0cnVjdCBWUDhEX0NPTVAqIGNvbXAsIFZQOERfU0VUVElORyBveHN0LCBpbnQgeCk7CisKKyAgICBpbnQgdnA4ZHhfZ2V0X3NldHRpbmcoc3RydWN0IFZQOERfQ09NUCogY29tcCwgVlA4RF9TRVRUSU5HIG94c3QpOworCisgICAgaW50IHZwOGR4X3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKHN0cnVjdCBWUDhEX0NPTVAqIGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVfc3RhbXApOworICAgIGludCB2cDhkeF9nZXRfcmF3X2ZyYW1lKHN0cnVjdCBWUDhEX0NPTVAqIGNvbXAsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QsIGludDY0X3QgKnRpbWVfc3RhbXAsIGludDY0X3QgKnRpbWVfZW5kX3N0YW1wLCB2cDhfcHBmbGFnc190ICpmbGFncyk7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnA4ZHhfZ2V0X3JlZmVyZW5jZShzdHJ1Y3QgVlA4RF9DT01QKiBjb21wLCBlbnVtIHZweF9yZWZfZnJhbWVfdHlwZSByZWZfZnJhbWVfZmxhZywgWVYxMl9CVUZGRVJfQ09ORklHICpzZCk7CisgICAgdnB4X2NvZGVjX2Vycl90IHZwOGR4X3NldF9yZWZlcmVuY2Uoc3RydWN0IFZQOERfQ09NUCogY29tcCwgZW51bSB2cHhfcmVmX2ZyYW1lX3R5cGUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpOworCisgICAgc3RydWN0IFZQOERfQ09NUCogdnA4ZHhfY3JlYXRlX2RlY29tcHJlc3NvcihWUDhEX0NPTkZJRyAqb3hjZik7CisKKyAgICB2b2lkIHZwOGR4X3JlbW92ZV9kZWNvbXByZXNzb3Ioc3RydWN0IFZQOERfQ09NUCogY29tcCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9wb3N0cHJvYy5jIGIvbGlidnB4L3ZwOC9jb21tb24vcG9zdHByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZhNTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcG9zdHByb2MuYwpAQCAtMCwwICsxLDEyMDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKKyNpbmNsdWRlICJwb3N0cHJvYy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgorI2luY2x1ZGUgInN5c3RlbWRlcGVuZGVudC5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgUkdCX1RPX1lVVih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKDAuMjU3KihmbG9hdCkodD4+MTYpKSArICgwLjUwNCooZmxvYXQpKHQ+PjgmMHhmZikpICsgKDAuMDk4KihmbG9hdCkodCYweGZmKSkgKyAxNiksICBcCisgICAgKC0oMC4xNDgqKGZsb2F0KSh0Pj4xNikpIC0gKDAuMjkxKihmbG9hdCkodD4+OCYweGZmKSkgKyAoMC40MzkqKGZsb2F0KSh0JjB4ZmYpKSArIDEyOCksIFwKKyAgICAoICgwLjQzOSooZmxvYXQpKHQ+PjE2KSkgLSAoMC4zNjgqKGZsb2F0KSh0Pj44JjB4ZmYpKSAtICgwLjA3MSooZmxvYXQpKHQmMHhmZikpICsgMTI4KQorCisvKiBnbG9iYWwgY29uc3RhbnRzICovCisjaWYgQ09ORklHX1BPU1RQUk9DX1ZJU1VBTElaRVIKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIE1CX1BSRURJQ1RJT05fTU9ERV9jb2xvcnNbTUJfTU9ERV9DT1VOVF1bM10gPQoreworICAgIHsgUkdCX1RPX1lVVigweDk4RkI5OCkgfSwgICAvKiBQYWxlR3JlZW4gKi8KKyAgICB7IFJHQl9UT19ZVVYoMHgwMEZGMDApIH0sICAgLyogR3JlZW4gKi8KKyAgICB7IFJHQl9UT19ZVVYoMHhBREZGMkYpIH0sICAgLyogR3JlZW5ZZWxsb3cgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHgyMjhCMjIpIH0sICAgLyogRm9yZXN0R3JlZW4gKi8KKyAgICB7IFJHQl9UT19ZVVYoMHgwMDY0MDApIH0sICAgLyogRGFya0dyZWVuICovCisgICAgeyBSR0JfVE9fWVVWKDB4OThGNUZGKSB9LCAgIC8qIENhZGV0IEJsdWUgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHg2Q0E2Q0QpIH0sICAgLyogU2t5IEJsdWUgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHgwMDAwOEIpIH0sICAgLyogRGFyayBibHVlICovCisgICAgeyBSR0JfVE9fWVVWKDB4NTUxQThCKSB9LCAgIC8qIFB1cnBsZSAqLworICAgIHsgUkdCX1RPX1lVVigweEZGMDAwMCkgfSAgICAvKiBSZWQgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIEJfUFJFRElDVElPTl9NT0RFX2NvbG9yc1tCX01PREVfQ09VTlRdWzNdID0KK3sKKyAgICB7IFJHQl9UT19ZVVYoMHg2NjMzZmYpIH0sICAgLyogUHVycGxlICovCisgICAgeyBSR0JfVE9fWVVWKDB4Y2MzM2ZmKSB9LCAgIC8qIE1hZ2VudGEgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHhmZjMzY2MpIH0sICAgLyogUGluayAqLworICAgIHsgUkdCX1RPX1lVVigweGZmMzM2NikgfSwgICAvKiBDb3JhbCAqLworICAgIHsgUkdCX1RPX1lVVigweDMzNjZmZikgfSwgICAvKiBCbHVlICovCisgICAgeyBSR0JfVE9fWVVWKDB4ZWQwMGY1KSB9LCAgIC8qIERhcmsgQmx1ZSAqLworICAgIHsgUkdCX1RPX1lVVigweDJlMDBiOCkgfSwgICAvKiBEYXJrIFB1cnBsZSAqLworICAgIHsgUkdCX1RPX1lVVigweGZmNjYzMykgfSwgICAvKiBPcmFuZ2UgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHgzM2NjZmYpIH0sICAgLyogTGlnaHQgQmx1ZSAqLworICAgIHsgUkdCX1RPX1lVVigweDhhYjgwMCkgfSwgICAvKiBHcmVlbiAqLworICAgIHsgUkdCX1RPX1lVVigweGZmY2MzMykgfSwgICAvKiBMaWdodCBPcmFuZ2UgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHgzM2ZmY2MpIH0sICAgLyogQXF1YSAqLworICAgIHsgUkdCX1RPX1lVVigweDY2ZmYzMykgfSwgICAvKiBMaWdodCBHcmVlbiAqLworICAgIHsgUkdCX1RPX1lVVigweGNjZmYzMykgfSwgICAvKiBZZWxsb3cgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIE1WX1JFRkVSRU5DRV9GUkFNRV9jb2xvcnNbTUFYX1JFRl9GUkFNRVNdWzNdID0KK3sKKyAgICB7IFJHQl9UT19ZVVYoMHgwMGZmMDApIH0sICAgLyogQmx1ZSAqLworICAgIHsgUkdCX1RPX1lVVigweDAwMDBmZikgfSwgICAvKiBHcmVlbiAqLworICAgIHsgUkdCX1RPX1lVVigweGZmZmYwMCkgfSwgICAvKiBZZWxsb3cgKi8KKyAgICB7IFJHQl9UT19ZVVYoMHhmZjAwMDApIH0sICAgLyogUmVkICovCit9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzaG9ydCBrZXJuZWw1W10gPQoreworICAgIDEsIDEsIDQsIDEsIDEKK307CisKK2NvbnN0IHNob3J0IHZwOF9ydltdID0KK3sKKyAgICA4LCA1LCAyLCAyLCA4LCAxMiwgNCwgOSwgOCwgMywKKyAgICAwLCAzLCA5LCAwLCAwLCAwLCA4LCAzLCAxNCwgNCwKKyAgICAxMCwgMSwgMTEsIDE0LCAxLCAxNCwgOSwgNiwgMTIsIDExLAorICAgIDgsIDYsIDEwLCAwLCAwLCA4LCA5LCAwLCAzLCAxNCwKKyAgICA4LCAxMSwgMTMsIDQsIDIsIDksIDAsIDMsIDksIDYsCisgICAgMSwgMiwgMywgMTQsIDEzLCAxLCA4LCAyLCA5LCA3LAorICAgIDMsIDMsIDEsIDEzLCAxMywgNiwgNiwgNSwgMiwgNywKKyAgICAxMSwgOSwgMTEsIDgsIDcsIDMsIDIsIDAsIDEzLCAxMywKKyAgICAxNCwgNCwgMTIsIDUsIDEyLCAxMCwgOCwgMTAsIDEzLCAxMCwKKyAgICA0LCAxNCwgNCwgMTAsIDAsIDgsIDExLCAxLCAxMywgNywKKyAgICA3LCAxNCwgNiwgMTQsIDEzLCAyLCAxMywgNSwgNCwgNCwKKyAgICAwLCAxMCwgMCwgNSwgMTMsIDIsIDEyLCA3LCAxMSwgMTMsCisgICAgOCwgMCwgNCwgMTAsIDcsIDIsIDcsIDIsIDIsIDUsCisgICAgMywgNCwgNywgMywgMywgMTQsIDE0LCA1LCA5LCAxMywKKyAgICAzLCAxNCwgMywgNiwgMywgMCwgMTEsIDgsIDEzLCAxLAorICAgIDEzLCAxLCAxMiwgMCwgMTAsIDksIDcsIDYsIDIsIDgsCisgICAgNSwgMiwgMTMsIDcsIDEsIDEzLCAxNCwgNywgNiwgNywKKyAgICA5LCA2LCAxMCwgMTEsIDcsIDgsIDcsIDUsIDE0LCA4LAorICAgIDQsIDQsIDAsIDgsIDcsIDEwLCAwLCA4LCAxNCwgMTEsCisgICAgMywgMTIsIDUsIDcsIDE0LCAzLCAxNCwgNSwgMiwgNiwKKyAgICAxMSwgMTIsIDEyLCA4LCAwLCAxMSwgMTMsIDEsIDIsIDAsCisgICAgNSwgMTAsIDE0LCA3LCA4LCAwLCA0LCAxMSwgMCwgOCwKKyAgICAwLCAzLCAxMCwgNSwgOCwgMCwgMTEsIDYsIDcsIDgsCisgICAgMTAsIDcsIDEzLCA5LCAyLCA1LCAxLCA1LCAxMCwgMiwKKyAgICA0LCAzLCA1LCA2LCAxMCwgOCwgOSwgNCwgMTEsIDE0LAorICAgIDAsIDEwLCAwLCA1LCAxMywgMiwgMTIsIDcsIDExLCAxMywKKyAgICA4LCAwLCA0LCAxMCwgNywgMiwgNywgMiwgMiwgNSwKKyAgICAzLCA0LCA3LCAzLCAzLCAxNCwgMTQsIDUsIDksIDEzLAorICAgIDMsIDE0LCAzLCA2LCAzLCAwLCAxMSwgOCwgMTMsIDEsCisgICAgMTMsIDEsIDEyLCAwLCAxMCwgOSwgNywgNiwgMiwgOCwKKyAgICA1LCAyLCAxMywgNywgMSwgMTMsIDE0LCA3LCA2LCA3LAorICAgIDksIDYsIDEwLCAxMSwgNywgOCwgNywgNSwgMTQsIDgsCisgICAgNCwgNCwgMCwgOCwgNywgMTAsIDAsIDgsIDE0LCAxMSwKKyAgICAzLCAxMiwgNSwgNywgMTQsIDMsIDE0LCA1LCAyLCA2LAorICAgIDExLCAxMiwgMTIsIDgsIDAsIDExLCAxMywgMSwgMiwgMCwKKyAgICA1LCAxMCwgMTQsIDcsIDgsIDAsIDQsIDExLCAwLCA4LAorICAgIDAsIDMsIDEwLCA1LCA4LCAwLCAxMSwgNiwgNywgOCwKKyAgICAxMCwgNywgMTMsIDksIDIsIDUsIDEsIDUsIDEwLCAyLAorICAgIDQsIDMsIDUsIDYsIDEwLCA4LCA5LCA0LCAxMSwgMTQsCisgICAgMywgOCwgMywgNywgOCwgNSwgMTEsIDQsIDEyLCAzLAorICAgIDExLCA5LCAxNCwgOCwgMTQsIDEzLCA0LCAzLCAxLCAyLAorICAgIDE0LCA2LCA1LCA0LCA0LCAxMSwgNCwgNiwgMiwgMSwKKyAgICA1LCA4LCA4LCAxMiwgMTMsIDUsIDE0LCAxMCwgMTIsIDEzLAorICAgIDAsIDksIDUsIDUsIDExLCAxMCwgMTMsIDksIDEwLCAxMywKK307CisKK2V4dGVybiB2b2lkIHZwOF9ibGl0X3RleHQoY29uc3QgY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICphZGRyZXNzLCBjb25zdCBpbnQgcGl0Y2gpOworZXh0ZXJuIHZvaWQgdnA4X2JsaXRfbGluZShpbnQgeDAsIGludCB4MSwgaW50IHkwLCBpbnQgeTEsIHVuc2lnbmVkIGNoYXIgKmltYWdlLCBjb25zdCBpbnQgcGl0Y2gpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93X2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgaW50IGNvbHMsCisgICAgdW5zaWduZWQgY2hhciAqZiwKKyAgICBpbnQgc2l6ZQorKQoreworICAgIHVuc2lnbmVkIGNoYXIgKnBfc3JjLCAqcF9kc3Q7CisgICAgaW50IHJvdzsKKyAgICBpbnQgY29sOworICAgIHVuc2lnbmVkIGNoYXIgdjsKKyAgICB1bnNpZ25lZCBjaGFyIGRbNF07CisKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNpemU7IHJvdysrKQorICAgIHsKKyAgICAgICAgLyogcG9zdF9wcm9jX2Rvd24gZm9yIG9uZSByb3cgKi8KKyAgICAgICAgcF9zcmMgPSBzcmNfcHRyOworICAgICAgICBwX2RzdCA9IGRzdF9wdHI7CisKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwX2Fib3ZlMiA9IHBfc3JjW2NvbCAtIDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcF9hYm92ZTEgPSBwX3NyY1tjb2wgLSBzcmNfcGl4ZWxzX3Blcl9saW5lXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcF9iZWxvdzEgPSBwX3NyY1tjb2wgKyBzcmNfcGl4ZWxzX3Blcl9saW5lXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcF9iZWxvdzIgPSBwX3NyY1tjb2wgKyAyICogc3JjX3BpeGVsc19wZXJfbGluZV07CisKKyAgICAgICAgICAgIHYgPSBwX3NyY1tjb2xdOworCisgICAgICAgICAgICBpZiAoKGFicyh2IC0gcF9hYm92ZTIpIDwgZltjb2xdKSAmJiAoYWJzKHYgLSBwX2Fib3ZlMSkgPCBmW2NvbF0pCisgICAgICAgICAgICAgICAgJiYgKGFicyh2IC0gcF9iZWxvdzEpIDwgZltjb2xdKSAmJiAoYWJzKHYgLSBwX2JlbG93MikgPCBmW2NvbF0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgazEsIGsyLCBrMzsKKyAgICAgICAgICAgICAgICBrMSA9IChwX2Fib3ZlMiArIHBfYWJvdmUxICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBrMiA9IChwX2JlbG93MiArIHBfYmVsb3cxICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBrMyA9IChrMSArIGsyICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICB2ID0gKGszICsgdiArIDEpID4+IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBfZHN0W2NvbF0gPSB2OworICAgICAgICB9CisKKyAgICAgICAgLyogbm93IHBvc3RfcHJvY19hY3Jvc3MgKi8KKyAgICAgICAgcF9zcmMgPSBkc3RfcHRyOworICAgICAgICBwX2RzdCA9IGRzdF9wdHI7CisKKyAgICAgICAgcF9zcmNbLTJdID0gcF9zcmNbLTFdID0gcF9zcmNbMF07CisgICAgICAgIHBfc3JjW2NvbHNdID0gcF9zcmNbY29scyArIDFdID0gcF9zcmNbY29scyAtIDFdOworCisgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgY29sczsgY29sKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSBwX3NyY1tjb2xdOworCisgICAgICAgICAgICBpZiAoKGFicyh2IC0gcF9zcmNbY29sIC0gMl0pIDwgZltjb2xdKQorICAgICAgICAgICAgICAgICYmIChhYnModiAtIHBfc3JjW2NvbCAtIDFdKSA8IGZbY29sXSkKKyAgICAgICAgICAgICAgICAmJiAoYWJzKHYgLSBwX3NyY1tjb2wgKyAxXSkgPCBmW2NvbF0pCisgICAgICAgICAgICAgICAgJiYgKGFicyh2IC0gcF9zcmNbY29sICsgMl0pIDwgZltjb2xdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGsxLCBrMiwgazM7CisgICAgICAgICAgICAgICAgazEgPSAocF9zcmNbY29sIC0gMl0gKyBwX3NyY1tjb2wgLSAxXSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgazIgPSAocF9zcmNbY29sICsgMl0gKyBwX3NyY1tjb2wgKyAxXSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgazMgPSAoazEgKyBrMiArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgdiA9IChrMyArIHYgKyAxKSA+PiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkW2NvbCAmIDNdID0gdjsKKworICAgICAgICAgICAgaWYgKGNvbCA+PSAyKQorICAgICAgICAgICAgICAgIHBfZHN0W2NvbCAtIDJdID0gZFsoY29sIC0gMikgJiAzXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhhbmRsZSB0aGUgbGFzdCB0d28gcGl4ZWxzICovCisgICAgICAgIHBfZHN0W2NvbCAtIDJdID0gZFsoY29sIC0gMikgJiAzXTsKKyAgICAgICAgcF9kc3RbY29sIC0gMV0gPSBkWyhjb2wgLSAxKSAmIDNdOworCisgICAgICAgIC8qIG5leHQgcm93ICovCisgICAgICAgIHNyY19wdHIgKz0gc3JjX3BpeGVsc19wZXJfbGluZTsKKyAgICAgICAgZHN0X3B0ciArPSBkc3RfcGl4ZWxzX3Blcl9saW5lOworICAgIH0KK30KKworc3RhdGljIGludCBxMm1ibChpbnQgeCkKK3sKKyAgICBpZiAoeCA8IDIwKSB4ID0gMjA7CisKKyAgICB4ID0gNTAgKyAoeCAtIDUwKSAqIDEwIC8gODsKKyAgICByZXR1cm4geCAqIHggLyAzOworfQordm9pZCB2cDhfbWJwb3N0X3Byb2NfYWNyb3NzX2lwX2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scywgaW50IGZsaW1pdCkKK3sKKyAgICBpbnQgciwgYywgaTsKKworICAgIHVuc2lnbmVkIGNoYXIgKnMgPSBzcmM7CisgICAgdW5zaWduZWQgY2hhciBkWzE2XTsKKworICAgIGZvciAociA9IDA7IHIgPCByb3dzOyByKyspCisgICAgeworICAgICAgICBpbnQgc3Vtc3EgPSAwOworICAgICAgICBpbnQgc3VtICAgPSAwOworCisgICAgICAgIGZvciAoaSA9IC04OyBpPDA7IGkrKykKKyAgICAgICAgICBzW2ldPXNbMF07CisKKyAgICAgICAgLyogMTcgYXZvaWRzIHZhbGdyaW5kIHdhcm5pbmcgLSB3ZSBidWZmZXIgdmFsdWVzIGluIGMgaW4gZAorICAgICAgICAgKiBhbmQgb25seSB3cml0ZSB0aGVtIHdoZW4gd2UndmUgcmVhZCA4IGFoZWFkLi4uCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSBjb2xzOyBpPGNvbHMrMTc7IGkrKykKKyAgICAgICAgICBzW2ldPXNbY29scy0xXTsKKworICAgICAgICBmb3IgKGkgPSAtODsgaSA8PSA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bXNxICs9IHNbaV0gKiBzW2ldOworICAgICAgICAgICAgc3VtICAgKz0gc1tpXTsKKyAgICAgICAgICAgIGRbaSs4XSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY29scyArIDg7IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHggPSBzW2MrN10gLSBzW2MtOF07CisgICAgICAgICAgICBpbnQgeSA9IHNbYys3XSArIHNbYy04XTsKKworICAgICAgICAgICAgc3VtICArPSB4OworICAgICAgICAgICAgc3Vtc3EgKz0geCAqIHk7CisKKyAgICAgICAgICAgIGRbYyYxNV0gPSBzW2NdOworCisgICAgICAgICAgICBpZiAoc3Vtc3EgKiAxNSAtIHN1bSAqIHN1bSA8IGZsaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkW2MmMTVdID0gKDggKyBzdW0gKyBzW2NdKSA+PiA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzW2MtOF0gPSBkWyhjLTgpJjE1XTsKKyAgICAgICAgfQorCisgICAgICAgIHMgKz0gcGl0Y2g7CisgICAgfQorfQorCisKK3ZvaWQgdnA4X21icG9zdF9wcm9jX2Rvd25fYyh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZmxpbWl0KQoreworICAgIGludCByLCBjLCBpOworICAgIGNvbnN0IHNob3J0ICpydjMgPSAmdnA4X3J2WzYzJnJhbmQoKV07CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY29sczsgYysrICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnMgPSAmZHN0W2NdOworICAgICAgICBpbnQgc3Vtc3EgPSAwOworICAgICAgICBpbnQgc3VtICAgPSAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIGRbMTZdOworICAgICAgICBjb25zdCBzaG9ydCAqcnYyID0gcnYzICsgKChjICogMTcpICYgMTI3KTsKKworICAgICAgICBmb3IgKGkgPSAtODsgaSA8IDA7IGkrKykKKyAgICAgICAgICBzW2kqcGl0Y2hdPXNbMF07CisKKyAgICAgICAgLyogMTcgYXZvaWRzIHZhbGdyaW5kIHdhcm5pbmcgLSB3ZSBidWZmZXIgdmFsdWVzIGluIGMgaW4gZAorICAgICAgICAgKiBhbmQgb25seSB3cml0ZSB0aGVtIHdoZW4gd2UndmUgcmVhZCA4IGFoZWFkLi4uCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSByb3dzOyBpIDwgcm93cysxNzsgaSsrKQorICAgICAgICAgIHNbaSpwaXRjaF09c1socm93cy0xKSpwaXRjaF07CisKKyAgICAgICAgZm9yIChpID0gLTg7IGkgPD0gNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdW1zcSArPSBzW2kqcGl0Y2hdICogc1tpKnBpdGNoXTsKKyAgICAgICAgICAgIHN1bSAgICs9IHNbaSpwaXRjaF07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHIgPSAwOyByIDwgcm93cyArIDg7IHIrKykKKyAgICAgICAgeworICAgICAgICAgICAgc3Vtc3EgKz0gc1s3KnBpdGNoXSAqIHNbIDcqcGl0Y2hdIC0gc1stOCpwaXRjaF0gKiBzWy04KnBpdGNoXTsKKyAgICAgICAgICAgIHN1bSAgKz0gc1s3KnBpdGNoXSAtIHNbLTgqcGl0Y2hdOworICAgICAgICAgICAgZFtyJjE1XSA9IHNbMF07CisKKyAgICAgICAgICAgIGlmIChzdW1zcSAqIDE1IC0gc3VtICogc3VtIDwgZmxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRbciYxNV0gPSAocnYyW3ImMTI3XSArIHN1bSArIHNbMF0pID4+IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNbLTgqcGl0Y2hdID0gZFsoci04KSYxNV07CisgICAgICAgICAgICBzICs9IHBpdGNoOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDhfZGVfbWJsb2NrKFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpwb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSkKK3sKKyAgICB2cDhfbWJwb3N0X3Byb2NfYWNyb3NzX2lwKHBvc3QtPnlfYnVmZmVyLCBwb3N0LT55X3N0cmlkZSwgcG9zdC0+eV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0LT55X3dpZHRoLCBxMm1ibChxKSk7CisgICAgdnA4X21icG9zdF9wcm9jX2Rvd24ocG9zdC0+eV9idWZmZXIsIHBvc3QtPnlfc3RyaWRlLCBwb3N0LT55X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0LT55X3dpZHRoLCBxMm1ibChxKSk7Cit9CisKK3ZvaWQgdnA4X2RlYmxvY2soVlA4X0NPTU1PTiAgICAgICAgICAgICAgICAgKmNtLAorICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqcG9zdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHEsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfdmFyX3RocmVzaCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcpCit7CisgICAgZG91YmxlIGxldmVsID0gNi4wZS0wNSAqIHEgKiBxICogcSAtIC4wMDY3ICogcSAqIHEgKyAuMzA2ICogcSArIC4wMDY1OworICAgIGludCBwcGwgPSAoaW50KShsZXZlbCArIC41KTsKKworICAgIGNvbnN0IE1PREVfSU5GTyAqbW9kZV9pbmZvX2NvbnRleHQgPSBjbS0+bWk7CisgICAgaW50IG1iciwgbWJjOworCisgICAgLyogVGhlIHBpeGVsIHRocmVzaG9sZHMgYXJlIGFkanVzdGVkIGFjY29yZGluZyB0byBpZiBvciBub3QgdGhlIG1hY3JvYmxvY2sKKyAgICAgKiBpcyBhIHNraXBwZWQgYmxvY2suICAqLworICAgIHVuc2lnbmVkIGNoYXIgKnlsaW1pdHMgPSBjbS0+cHBfbGltaXRzX2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBjaGFyICp1dmxpbWl0cyA9IGNtLT5wcF9saW1pdHNfYnVmZmVyICsgMTYgKiBjbS0+bWJfY29sczsKKyAgICAodm9pZCkgbG93X3Zhcl90aHJlc2g7CisgICAgKHZvaWQpIGZsYWc7CisKKyAgICBpZiAocHBsID4gMCkKKyAgICB7CisgICAgICAgIGZvciAobWJyID0gMDsgbWJyIDwgY20tPm1iX3Jvd3M7IG1icisrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp5bHB0ciA9IHlsaW1pdHM7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp1dmxwdHIgPSB1dmxpbWl0czsKKyAgICAgICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgY20tPm1iX2NvbHM7IG1iYysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbWJfcHBsOworCisgICAgICAgICAgICAgICAgaWYgKG1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYpCisgICAgICAgICAgICAgICAgICAgIG1iX3BwbCA9ICh1bnNpZ25lZCBjaGFyKXBwbCA+PiAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbWJfcHBsID0gKHVuc2lnbmVkIGNoYXIpcHBsOworCisgICAgICAgICAgICAgICAgdnB4X21lbXNldCh5bHB0ciwgbWJfcHBsLCAxNik7CisgICAgICAgICAgICAgICAgdnB4X21lbXNldCh1dmxwdHIsIG1iX3BwbCwgOCk7CisKKyAgICAgICAgICAgICAgICB5bHB0ciArPSAxNjsKKyAgICAgICAgICAgICAgICB1dmxwdHIgKz0gODsKKyAgICAgICAgICAgICAgICBtb2RlX2luZm9fY29udGV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kZV9pbmZvX2NvbnRleHQrKzsKKworICAgICAgICAgICAgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93KAorICAgICAgICAgICAgICAgIHNvdXJjZS0+eV9idWZmZXIgKyAxNiAqIG1iciAqIHNvdXJjZS0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgcG9zdC0+eV9idWZmZXIgKyAxNiAqIG1iciAqIHBvc3QtPnlfc3RyaWRlLCBzb3VyY2UtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgIHBvc3QtPnlfc3RyaWRlLCBzb3VyY2UtPnlfd2lkdGgsIHlsaW1pdHMsIDE2KTsKKworICAgICAgICAgICAgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93KAorICAgICAgICAgICAgICAgIHNvdXJjZS0+dV9idWZmZXIgKyA4ICogbWJyICogc291cmNlLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgcG9zdC0+dV9idWZmZXIgKyA4ICogbWJyICogcG9zdC0+dXZfc3RyaWRlLCBzb3VyY2UtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICBwb3N0LT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfd2lkdGgsIHV2bGltaXRzLCA4KTsKKyAgICAgICAgICAgIHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21iX3JvdygKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnZfYnVmZmVyICsgOCAqIG1iciAqIHNvdXJjZS0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgIHBvc3QtPnZfYnVmZmVyICsgOCAqIG1iciAqIHBvc3QtPnV2X3N0cmlkZSwgc291cmNlLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgcG9zdC0+dXZfc3RyaWRlLCBzb3VyY2UtPnV2X3dpZHRoLCB1dmxpbWl0cywgOCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWUoc291cmNlLCBwb3N0KTsKKyAgICB9Cit9CisKKyNpZiAhKENPTkZJR19URU1QT1JBTF9ERU5PSVNJTkcpCit2b2lkIHZwOF9kZV9ub2lzZShWUDhfQ09NTU9OICAgICAgICAgICAgICAgICAqY20sCisgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAgICAgICAgKnBvc3QsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfdmFyX3RocmVzaCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnKQoreworICAgIGRvdWJsZSBsZXZlbCA9IDYuMGUtMDUgKiBxICogcSAqIHEgLSAuMDA2NyAqIHEgKiBxICsgLjMwNiAqIHEgKyAuMDA2NTsKKyAgICBpbnQgcHBsID0gKGludCkobGV2ZWwgKyAuNSk7CisgICAgaW50IG1iX3Jvd3MgPSBzb3VyY2UtPnlfd2lkdGggPj4gNDsKKyAgICBpbnQgbWJfY29scyA9IHNvdXJjZS0+eV9oZWlnaHQgPj4gNDsKKyAgICB1bnNpZ25lZCBjaGFyICpsaW1pdHMgPSBjbS0+cHBfbGltaXRzX2J1ZmZlcjs7CisgICAgaW50IG1iciwgbWJjOworICAgICh2b2lkKSBwb3N0OworICAgICh2b2lkKSBsb3dfdmFyX3RocmVzaDsKKyAgICAodm9pZCkgZmxhZzsKKworICAgIHZweF9tZW1zZXQobGltaXRzLCAodW5zaWduZWQgY2hhcilwcGwsIDE2ICogbWJfY29scyk7CisKKyAgICAvKiBUT0RPOiBUaGUgb3JpZ2luYWwgY29kZSBkb24ndCBmaWx0ZXIgdGhlIDIgb3V0ZXIgcm93cyBhbmQgY29sdW1ucy4gKi8KKyAgICBmb3IgKG1iciA9IDA7IG1iciA8IG1iX3Jvd3M7IG1icisrKQorICAgIHsKKyAgICAgICAgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93KAorICAgICAgICAgICAgc291cmNlLT55X2J1ZmZlciArIDE2ICogbWJyICogc291cmNlLT55X3N0cmlkZSwKKyAgICAgICAgICAgIHNvdXJjZS0+eV9idWZmZXIgKyAxNiAqIG1iciAqIHNvdXJjZS0+eV9zdHJpZGUsCisgICAgICAgICAgICBzb3VyY2UtPnlfc3RyaWRlLCBzb3VyY2UtPnlfc3RyaWRlLCBzb3VyY2UtPnlfd2lkdGgsIGxpbWl0cywgMTYpOworCisgICAgICAgIHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21iX3JvdygKKyAgICAgICAgICAgIHNvdXJjZS0+dV9idWZmZXIgKyA4ICogbWJyICogc291cmNlLT51dl9zdHJpZGUsCisgICAgICAgICAgICBzb3VyY2UtPnVfYnVmZmVyICsgOCAqIG1iciAqIHNvdXJjZS0+dXZfc3RyaWRlLAorICAgICAgICAgICAgc291cmNlLT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfc3RyaWRlLCBzb3VyY2UtPnV2X3dpZHRoLCBsaW1pdHMsIDgpOworICAgICAgICB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tYl9yb3coCisgICAgICAgICAgICBzb3VyY2UtPnZfYnVmZmVyICsgOCAqIG1iciAqIHNvdXJjZS0+dXZfc3RyaWRlLAorICAgICAgICAgICAgc291cmNlLT52X2J1ZmZlciArIDggKiBtYnIgKiBzb3VyY2UtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgIHNvdXJjZS0+dXZfc3RyaWRlLCBzb3VyY2UtPnV2X3N0cmlkZSwgc291cmNlLT51dl93aWR0aCwgbGltaXRzLCA4KTsKKyAgICB9Cit9CisjZW5kaWYKKworZG91YmxlIHZwOF9nYXVzc2lhbihkb3VibGUgc2lnbWEsIGRvdWJsZSBtdSwgZG91YmxlIHgpCit7CisgICAgcmV0dXJuIDEgLyAoc2lnbWEgKiBzcXJ0KDIuMCAqIDMuMTQxNTkyNjUpKSAqCisgICAgICAgICAgIChleHAoLSh4IC0gbXUpICogKHggLSBtdSkgLyAoMiAqIHNpZ21hICogc2lnbWEpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxyZChzdHJ1Y3QgcG9zdHByb2Nfc3RhdGUgKnN0YXRlLCBpbnQgcSwgaW50IGEpCit7CisgICAgY2hhciBjaGFyX2Rpc3RbMzAwXTsKKworICAgIGRvdWJsZSBzaWdtYTsKKyAgICBpbnQgYWkgPSBhLCBxaSA9IHEsIGk7CisKKyAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKworICAgIHNpZ21hID0gYWkgKyAuNSArIC42ICogKDYzIC0gcWkpIC8gNjMuMDsKKworICAgIC8qIHNldCB1cCBhIGxvb2t1cCB0YWJsZSBvZiAyNTYgZW50cmllcyB0aGF0IG1hdGNoZXMKKyAgICAgKiBhIGdhdXNzaWFuIGRpc3RyaWJ1dGlvbiB3aXRoIHNpZ21hIGRldGVybWluZWQgYnkgcS4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIGRvdWJsZSBpOworICAgICAgICBpbnQgbmV4dCwgajsKKworICAgICAgICBuZXh0ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAtMzI7IGkgPCAzMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYSA9IChpbnQpKC41ICsgMjU2ICogdnA4X2dhdXNzaWFuKHNpZ21hLCAwLCBpKSk7CisKKyAgICAgICAgICAgIGlmIChhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBhOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyX2Rpc3RbbmV4dCtqXSA9IChjaGFyKSBpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0ICsgajsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IG5leHQgPCAyNTY7IG5leHQrKykKKyAgICAgICAgICAgIGNoYXJfZGlzdFtuZXh0XSA9IDA7CisKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzA3MjsgaSsrKQorICAgIHsKKyAgICAgICAgc3RhdGUtPm5vaXNlW2ldID0gY2hhcl9kaXN0W3JhbmQoKSAmIDB4ZmZdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgc3RhdGUtPmJsYWNrY2xhbXBbaV0gPSAtY2hhcl9kaXN0WzBdOworICAgICAgICBzdGF0ZS0+d2hpdGVjbGFtcFtpXSA9IC1jaGFyX2Rpc3RbMF07CisgICAgICAgIHN0YXRlLT5ib3RoY2xhbXBbaV0gPSAtMiAqIGNoYXJfZGlzdFswXTsKKyAgICB9CisKKyAgICBzdGF0ZS0+bGFzdF9xID0gcTsKKyAgICBzdGF0ZS0+bGFzdF9ub2lzZSA9IGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBwbGFuZV9hZGRfbm9pc2VfYworICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqU3RhcnQgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXIgdG8gYWRkIGdhdXNzaWFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZSB0bworICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgV2lkdGggICAgd2lkdGggb2YgcGxhbmUKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEhlaWdodCAgIGhlaWdodCBvZiBwbGFuZQorICogICAgICAgICAgICAgICAgICBpbnQgIFBpdGNoICAgIGRpc3RhbmNlIGJldHdlZW4gc3Vic2VxdWVudCBsaW5lcyBvZiBmcmFtZQorICogICAgICAgICAgICAgICAgICBpbnQgIHEgICAgICAgIHF1YW50aXplciB1c2VkIHRvIGRldGVybWluZSBhbW91bnQgb2Ygbm9pc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZAorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQuCisgKgorICogIEZVTkNUSU9OICAgICAgOiBhZGRzIGdhdXNzaWFuIG5vaXNlIHRvIGEgcGxhbmUgb2YgcGl4ZWxzCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfcGxhbmVfYWRkX25vaXNlX2ModW5zaWduZWQgY2hhciAqU3RhcnQsIGNoYXIgKm5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBibGFja2NsYW1wWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgd2hpdGVjbGFtcFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJvdGhjbGFtcFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBIZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKlBvcyA9IFN0YXJ0ICsgaSAqIFBpdGNoOworICAgICAgICBjaGFyICAqUmVmID0gKGNoYXIgKikobm9pc2UgKyAocmFuZCgpICYgMHhmZikpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBXaWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUG9zW2pdIDwgYmxhY2tjbGFtcFswXSkKKyAgICAgICAgICAgICAgICBQb3Nbal0gPSBibGFja2NsYW1wWzBdOworCisgICAgICAgICAgICBpZiAoUG9zW2pdID4gMjU1ICsgd2hpdGVjbGFtcFswXSkKKyAgICAgICAgICAgICAgICBQb3Nbal0gPSAyNTUgKyB3aGl0ZWNsYW1wWzBdOworCisgICAgICAgICAgICBQb3Nbal0gKz0gUmVmW2pdOworICAgICAgICB9CisgICAgfQorfQorCisvKiBCbGVuZCB0aGUgbWFjcm8gYmxvY2sgd2l0aCBhIHNvbGlkIGNvbG9yZWQgc3F1YXJlLiAgTGVhdmUgdGhlCisgKiBlZGdlcyB1bmJsZW5kZWQgdG8gZ2l2ZSBkaXN0aW5jdGlvbiB0byBtYWNybyBibG9ja3MgaW4gYXJlYXMKKyAqIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGNvbG9yIGJsb2NrLgorICovCit2b2lkIHZwOF9ibGVuZF9tYl9pbm5lcl9jICh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkxLCBpbnQgdTEsIGludCB2MSwgaW50IGFscGhhLCBpbnQgc3RyaWRlKQoreworICAgIGludCBpLCBqOworICAgIGludCB5MV9jb25zdCA9IHkxKigoMTw8MTYpLWFscGhhKTsKKyAgICBpbnQgdTFfY29uc3QgPSB1MSooKDE8PDE2KS1hbHBoYSk7CisgICAgaW50IHYxX2NvbnN0ID0gdjEqKCgxPDwxNiktYWxwaGEpOworCisgICAgeSArPSAyKnN0cmlkZSArIDI7CisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTI7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgeVtqXSA9ICh5W2pdKmFscGhhICsgeTFfY29uc3QpPj4xNjsKKyAgICAgICAgfQorICAgICAgICB5ICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICBzdHJpZGUgPj49IDE7CisKKyAgICB1ICs9IHN0cmlkZSArIDE7CisgICAgdiArPSBzdHJpZGUgKyAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHVbal0gPSAodVtqXSphbHBoYSArIHUxX2NvbnN0KT4+MTY7CisgICAgICAgICAgICB2W2pdID0gKHZbal0qYWxwaGEgKyB2MV9jb25zdCk+PjE2OworICAgICAgICB9CisgICAgICAgIHUgKz0gc3RyaWRlOworICAgICAgICB2ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKKy8qIEJsZW5kIG9ubHkgdGhlIGVkZ2Ugb2YgdGhlIG1hY3JvIGJsb2NrLiAgTGVhdmUgY2VudGVyCisgKiB1bmJsZW5kZWQgdG8gYWxsb3cgZm9yIG90aGVyIHZpc3VhbGl6YXRpb25zIHRvIGJlIGxheWVyZWQuCisgKi8KK3ZvaWQgdnA4X2JsZW5kX21iX291dGVyX2MgKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeTEsIGludCB1MSwgaW50IHYxLCBpbnQgYWxwaGEsIGludCBzdHJpZGUpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHkxX2NvbnN0ID0geTEqKCgxPDwxNiktYWxwaGEpOworICAgIGludCB1MV9jb25zdCA9IHUxKigoMTw8MTYpLWFscGhhKTsKKyAgICBpbnQgdjFfY29uc3QgPSB2MSooKDE8PDE2KS1hbHBoYSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHlbal0gPSAoeVtqXSphbHBoYSArIHkxX2NvbnN0KT4+MTY7CisgICAgICAgIH0KKyAgICAgICAgeSArPSBzdHJpZGU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgeworICAgICAgICB5WzBdICA9ICh5WzBdKmFscGhhICArIHkxX2NvbnN0KT4+MTY7CisgICAgICAgIHlbMV0gID0gKHlbMV0qYWxwaGEgICsgeTFfY29uc3QpPj4xNjsKKyAgICAgICAgeVsxNF0gPSAoeVsxNF0qYWxwaGEgKyB5MV9jb25zdCk+PjE2OworICAgICAgICB5WzE1XSA9ICh5WzE1XSphbHBoYSArIHkxX2NvbnN0KT4+MTY7CisgICAgICAgIHkgKz0gc3RyaWRlOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgeVtqXSA9ICh5W2pdKmFscGhhICsgeTFfY29uc3QpPj4xNjsKKyAgICAgICAgfQorICAgICAgICB5ICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICBzdHJpZGUgPj49IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHsKKyAgICAgICAgdVtqXSA9ICh1W2pdKmFscGhhICsgdTFfY29uc3QpPj4xNjsKKyAgICAgICAgdltqXSA9ICh2W2pdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKKyAgICB9CisgICAgdSArPSBzdHJpZGU7CisgICAgdiArPSBzdHJpZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgICAgdVswXSA9ICh1WzBdKmFscGhhICsgdTFfY29uc3QpPj4xNjsKKyAgICAgICAgdlswXSA9ICh2WzBdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKKworICAgICAgICB1WzddID0gKHVbN10qYWxwaGEgKyB1MV9jb25zdCk+PjE2OworICAgICAgICB2WzddID0gKHZbN10qYWxwaGEgKyB2MV9jb25zdCk+PjE2OworCisgICAgICAgIHUgKz0gc3RyaWRlOworICAgICAgICB2ICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHsKKyAgICAgICAgdVtqXSA9ICh1W2pdKmFscGhhICsgdTFfY29uc3QpPj4xNjsKKyAgICAgICAgdltqXSA9ICh2W2pdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2JsZW5kX2JfYyAodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5MSwgaW50IHUxLCBpbnQgdjEsIGludCBhbHBoYSwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgeTFfY29uc3QgPSB5MSooKDE8PDE2KS1hbHBoYSk7CisgICAgaW50IHUxX2NvbnN0ID0gdTEqKCgxPDwxNiktYWxwaGEpOworICAgIGludCB2MV9jb25zdCA9IHYxKigoMTw8MTYpLWFscGhhKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB5W2pdID0gKHlbal0qYWxwaGEgKyB5MV9jb25zdCk+PjE2OworICAgICAgICB9CisgICAgICAgIHkgKz0gc3RyaWRlOworICAgIH0KKworICAgIHN0cmlkZSA+Pj0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB1W2pdID0gKHVbal0qYWxwaGEgKyB1MV9jb25zdCk+PjE2OworICAgICAgICAgICAgdltqXSA9ICh2W2pdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKKyAgICAgICAgfQorICAgICAgICB1ICs9IHN0cmlkZTsKKyAgICAgICAgdiArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb25zdHJhaW5fbGluZSAoaW50IHgwLCBpbnQgKngxLCBpbnQgeTAsIGludCAqeTEsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgZHg7CisgICAgaW50IGR5OworCisgICAgaWYgKCp4MSA+IHdpZHRoKQorICAgIHsKKyAgICAgICAgZHggPSAqeDEgLSB4MDsKKyAgICAgICAgZHkgPSAqeTEgLSB5MDsKKworICAgICAgICAqeDEgPSB3aWR0aDsKKyAgICAgICAgaWYgKGR4KQorICAgICAgICAgICAgKnkxID0gKCh3aWR0aC14MCkqZHkpL2R4ICsgeTA7CisgICAgfQorICAgIGlmICgqeDEgPCAwKQorICAgIHsKKyAgICAgICAgZHggPSAqeDEgLSB4MDsKKyAgICAgICAgZHkgPSAqeTEgLSB5MDsKKworICAgICAgICAqeDEgPSAwOworICAgICAgICBpZiAoZHgpCisgICAgICAgICAgICAqeTEgPSAoKDAteDApKmR5KS9keCArIHkwOworICAgIH0KKyAgICBpZiAoKnkxID4gaGVpZ2h0KQorICAgIHsKKyAgICAgICAgZHggPSAqeDEgLSB4MDsKKyAgICAgICAgZHkgPSAqeTEgLSB5MDsKKworICAgICAgICAqeTEgPSBoZWlnaHQ7CisgICAgICAgIGlmIChkeSkKKyAgICAgICAgICAgICp4MSA9ICgoaGVpZ2h0LXkwKSpkeCkvZHkgKyB4MDsKKyAgICB9CisgICAgaWYgKCp5MSA8IDApCisgICAgeworICAgICAgICBkeCA9ICp4MSAtIHgwOworICAgICAgICBkeSA9ICp5MSAtIHkwOworCisgICAgICAgICp5MSA9IDA7CisgICAgICAgIGlmIChkeSkKKyAgICAgICAgICAgICp4MSA9ICgoMC15MCkqZHgpL2R5ICsgeDA7CisgICAgfQorfQorCisjaWYgQ09ORklHX1BPU1RQUk9DCitpbnQgdnA4X3Bvc3RfcHJvY19mcmFtZShWUDhfQ09NTU9OICpvY2ksIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwgdnA4X3BwZmxhZ3NfdCAqcHBmbGFncykKK3sKKyAgICBpbnQgcSA9IG9jaS0+ZmlsdGVyX2xldmVsICogMTAgLyA2OworICAgIGludCBmbGFncyA9IHBwZmxhZ3MtPnBvc3RfcHJvY19mbGFnOworICAgIGludCBkZWJsb2NrX2xldmVsID0gcHBmbGFncy0+ZGVibG9ja2luZ19sZXZlbDsKKyAgICBpbnQgbm9pc2VfbGV2ZWwgPSBwcGZsYWdzLT5ub2lzZV9sZXZlbDsKKworICAgIGlmICghb2NpLT5mcmFtZV90b19zaG93KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAocSA+IDYzKQorICAgICAgICBxID0gNjM7CisKKyAgICBpZiAoIWZsYWdzKQorICAgIHsKKyAgICAgICAgKmRlc3QgPSAqb2NpLT5mcmFtZV90b19zaG93OworCisgICAgICAgIC8qIGhhbmRsZSBwcm9ibGVtIHdpdGggZXh0ZW5kaW5nIGJvcmRlcnMgKi8KKyAgICAgICAgZGVzdC0+eV93aWR0aCA9IG9jaS0+V2lkdGg7CisgICAgICAgIGRlc3QtPnlfaGVpZ2h0ID0gb2NpLT5IZWlnaHQ7CisgICAgICAgIGRlc3QtPnV2X2hlaWdodCA9IGRlc3QtPnlfaGVpZ2h0IC8gMjsKKyAgICAgICAgb2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X2Jhc2VfcWluZGV4ID0gb2NpLT5iYXNlX3FpbmRleDsKKyAgICAgICAgb2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X2ZyYW1lX3ZhbGlkID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgcG9zdF9wcm9jX2J1ZmZlcl9pbnQgaWYgbmVlZGVkICovCisgICAgaWYgKChmbGFncyAmIFZQOERfTUZRRSkgJiYgIW9jaS0+cG9zdF9wcm9jX2J1ZmZlcl9pbnRfdXNlZCkKKyAgICB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBWUDhEX0RFQkxPQ0spIHx8IChmbGFncyAmIFZQOERfREVNQUNST0JMT0NLKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdpZHRoID0gKG9jaS0+V2lkdGggKyAxNSkgJiB+MTU7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKG9jaS0+SGVpZ2h0ICsgMTUpICYgfjE1OworCisgICAgICAgICAgICBpZiAodnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKCZvY2ktPnBvc3RfcHJvY19idWZmZXJfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBWUDhCT1JERVJJTlBJWEVMUykpCisgICAgICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZvY2ktPmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIE1GUUUgZnJhbWVidWZmZXIiKTsKKworICAgICAgICAgICAgb2NpLT5wb3N0X3Byb2NfYnVmZmVyX2ludF91c2VkID0gMTsKKworICAgICAgICAgICAgLyogaW5zdXJlIHRoYXQgcG9zdHByb2MgaXMgc2V0IHRvIGFsbCAwJ3Mgc28gdGhhdCBwb3N0IHByb2MKKyAgICAgICAgICAgICAqIGRvZXNuJ3QgcHVsbCByYW5kb20gZGF0YSBpbiBmcm9tIGVkZ2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdnB4X21lbXNldCgoJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcl9pbnQpLT5idWZmZXJfYWxsb2MsMTI4LCgmb2NpLT5wb3N0X3Byb2NfYnVmZmVyKS0+ZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgIGlmICgoZmxhZ3MgJiBWUDhEX01GUUUpICYmCisgICAgICAgICBvY2ktPnBvc3Rwcm9jX3N0YXRlLmxhc3RfZnJhbWVfdmFsaWQgJiYKKyAgICAgICAgIG9jaS0+Y3VycmVudF92aWRlb19mcmFtZSA+PSAyICYmCisgICAgICAgICBvY2ktPnBvc3Rwcm9jX3N0YXRlLmxhc3RfYmFzZV9xaW5kZXggPCA2MCAmJgorICAgICAgICAgb2NpLT5iYXNlX3FpbmRleCAtIG9jaS0+cG9zdHByb2Nfc3RhdGUubGFzdF9iYXNlX3FpbmRleCA+PSAyMCkKKyAgICB7CisgICAgICAgIHZwOF9tdWx0aWZyYW1lX3F1YWxpdHlfZW5oYW5jZShvY2kpOworICAgICAgICBpZiAoKChmbGFncyAmIFZQOERfREVCTE9DSykgfHwgKGZsYWdzICYgVlA4RF9ERU1BQ1JPQkxPQ0spKSAmJgorICAgICAgICAgICAgb2NpLT5wb3N0X3Byb2NfYnVmZmVyX2ludF91c2VkKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKCZvY2ktPnBvc3RfcHJvY19idWZmZXIsICZvY2ktPnBvc3RfcHJvY19idWZmZXJfaW50KTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFZQOERfREVNQUNST0JMT0NLKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZwOF9kZWJsb2NrKG9jaSwgJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcl9pbnQsICZvY2ktPnBvc3RfcHJvY19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKyAoZGVibG9ja19sZXZlbCAtIDUpICogMTAsIDEsIDApOworICAgICAgICAgICAgICAgIHZwOF9kZV9tYmxvY2soJm9jaS0+cG9zdF9wcm9jX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKyAoZGVibG9ja19sZXZlbCAtIDUpICogMTApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBWUDhEX0RFQkxPQ0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X2RlYmxvY2sob2NpLCAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyX2ludCwgJm9jaS0+cG9zdF9wcm9jX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLCAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBNb3ZlIHBhcnRpYWxseSB0b3dhcmRzIHRoZSBiYXNlIHEgb2YgdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIG9jaS0+cG9zdHByb2Nfc3RhdGUubGFzdF9iYXNlX3FpbmRleCA9ICgzKm9jaS0+cG9zdHByb2Nfc3RhdGUubGFzdF9iYXNlX3FpbmRleCArIG9jaS0+YmFzZV9xaW5kZXgpPj4yOworICAgIH0KKyAgICBlbHNlIGlmIChmbGFncyAmIFZQOERfREVNQUNST0JMT0NLKQorICAgIHsKKyAgICAgICAgdnA4X2RlYmxvY2sob2NpLCBvY2ktPmZyYW1lX3RvX3Nob3csICZvY2ktPnBvc3RfcHJvY19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSArIChkZWJsb2NrX2xldmVsIC0gNSkgKiAxMCwgMSwgMCk7CisgICAgICAgIHZwOF9kZV9tYmxvY2soJm9jaS0+cG9zdF9wcm9jX2J1ZmZlciwgcSArIChkZWJsb2NrX2xldmVsIC0gNSkgKiAxMCk7CisKKyAgICAgICAgb2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X2Jhc2VfcWluZGV4ID0gb2NpLT5iYXNlX3FpbmRleDsKKyAgICB9CisgICAgZWxzZSBpZiAoZmxhZ3MgJiBWUDhEX0RFQkxPQ0spCisgICAgeworICAgICAgICB2cDhfZGVibG9jayhvY2ksIG9jaS0+ZnJhbWVfdG9fc2hvdywgJm9jaS0+cG9zdF9wcm9jX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgcSwgMSwgMCk7CisgICAgICAgIG9jaS0+cG9zdHByb2Nfc3RhdGUubGFzdF9iYXNlX3FpbmRleCA9IG9jaS0+YmFzZV9xaW5kZXg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWUob2NpLT5mcmFtZV90b19zaG93LCAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyKTsKKyAgICAgICAgb2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X2Jhc2VfcWluZGV4ID0gb2NpLT5iYXNlX3FpbmRleDsKKyAgICB9CisgICAgb2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X2ZyYW1lX3ZhbGlkID0gMTsKKworICAgIGlmIChmbGFncyAmIFZQOERfQURETk9JU0UpCisgICAgeworICAgICAgICBpZiAob2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X3EgIT0gcQorICAgICAgICAgICAgfHwgb2NpLT5wb3N0cHJvY19zdGF0ZS5sYXN0X25vaXNlICE9IG5vaXNlX2xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxscmQoJm9jaS0+cG9zdHByb2Nfc3RhdGUsIDYzIC0gcSwgbm9pc2VfbGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgdnA4X3BsYW5lX2FkZF9ub2lzZQorICAgICAgICAob2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfYnVmZmVyLAorICAgICAgICAgb2NpLT5wb3N0cHJvY19zdGF0ZS5ub2lzZSwKKyAgICAgICAgIG9jaS0+cG9zdHByb2Nfc3RhdGUuYmxhY2tjbGFtcCwKKyAgICAgICAgIG9jaS0+cG9zdHByb2Nfc3RhdGUud2hpdGVjbGFtcCwKKyAgICAgICAgIG9jaS0+cG9zdHByb2Nfc3RhdGUuYm90aGNsYW1wLAorICAgICAgICAgb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfd2lkdGgsIG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X2hlaWdodCwKKyAgICAgICAgIG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X3N0cmlkZSk7CisgICAgfQorCisjaWYgQ09ORklHX1BPU1RQUk9DX1ZJU1VBTElaRVIKKyAgICBpZiAoZmxhZ3MgJiBWUDhEX0RFQlVHX1RYVF9GUkFNRV9JTkZPKQorICAgIHsKKyAgICAgICAgY2hhciBtZXNzYWdlWzUxMl07CisgICAgICAgIHNwcmludGYobWVzc2FnZSwgIkYlMWRHJTFkUSUzZEYlM2RQJWRfcyVkeCVkIiwKKyAgICAgICAgICAgICAgICAob2NpLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSksCisgICAgICAgICAgICAgICAgb2NpLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSwKKyAgICAgICAgICAgICAgICBvY2ktPmJhc2VfcWluZGV4LAorICAgICAgICAgICAgICAgIG9jaS0+ZmlsdGVyX2xldmVsLAorICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgIG9jaS0+bWJfY29scywgb2NpLT5tYl9yb3dzKTsKKyAgICAgICAgdnA4X2JsaXRfdGV4dChtZXNzYWdlLCBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9idWZmZXIsIG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X3N0cmlkZSk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVlA4RF9ERUJVR19UWFRfTUJMS19NT0RFUykKKyAgICB7CisgICAgICAgIGludCBpLCBqOworICAgICAgICB1bnNpZ25lZCBjaGFyICp5X3B0cjsKKyAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcjsKKyAgICAgICAgaW50IG1iX3Jvd3MgPSBwb3N0LT55X2hlaWdodCA+PiA0OworICAgICAgICBpbnQgbWJfY29scyA9IHBvc3QtPnlfd2lkdGggID4+IDQ7CisgICAgICAgIGludCBtYl9pbmRleCA9IDA7CisgICAgICAgIE1PREVfSU5GTyAqbWkgPSBvY2ktPm1pOworCisgICAgICAgIHlfcHRyID0gcG9zdC0+eV9idWZmZXIgKyA0ICogcG9zdC0+eV9zdHJpZGUgKyA0OworCisgICAgICAgIC8qIHZwOF9maWx0ZXIgZWFjaCBtYWNybyBibG9jayAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfcm93czsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWJfY29sczsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgenpbNF07CisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHp6LCAiJWMiLCBtaVttYl9pbmRleF0ubWJtaS5tb2RlICsgJ2EnKTsKKworICAgICAgICAgICAgICAgIHZwOF9ibGl0X3RleHQoenosIHlfcHRyLCBwb3N0LT55X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgbWJfaW5kZXggKys7CisgICAgICAgICAgICAgICAgeV9wdHIgKz0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1iX2luZGV4ICsrOyAvKiBib3JkZXIgKi8KKyAgICAgICAgICAgIHlfcHRyICs9IHBvc3QtPnlfc3RyaWRlICAqIDE2IC0gcG9zdC0+eV93aWR0aDsKKworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVlA4RF9ERUJVR19UWFRfRENfRElGRikKKyAgICB7CisgICAgICAgIGludCBpLCBqOworICAgICAgICB1bnNpZ25lZCBjaGFyICp5X3B0cjsKKyAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcjsKKyAgICAgICAgaW50IG1iX3Jvd3MgPSBwb3N0LT55X2hlaWdodCA+PiA0OworICAgICAgICBpbnQgbWJfY29scyA9IHBvc3QtPnlfd2lkdGggID4+IDQ7CisgICAgICAgIGludCBtYl9pbmRleCA9IDA7CisgICAgICAgIE1PREVfSU5GTyAqbWkgPSBvY2ktPm1pOworCisgICAgICAgIHlfcHRyID0gcG9zdC0+eV9idWZmZXIgKyA0ICogcG9zdC0+eV9zdHJpZGUgKyA0OworCisgICAgICAgIC8qIHZwOF9maWx0ZXIgZWFjaCBtYWNybyBibG9jayAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfcm93czsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWJfY29sczsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgenpbNF07CisgICAgICAgICAgICAgICAgaW50IGRjX2RpZmYgPSAhKG1pW21iX2luZGV4XS5tYm1pLm1vZGUgIT0gQl9QUkVEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaVttYl9pbmRleF0ubWJtaS5tb2RlICE9IFNQTElUTVYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pW21iX2luZGV4XS5tYm1pLm1iX3NraXBfY29lZmYpOworCisgICAgICAgICAgICAgICAgaWYgKG9jaS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoenosICJhIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHp6LCAiJWMiLCBkY19kaWZmICsgJzAnKTsKKworICAgICAgICAgICAgICAgIHZwOF9ibGl0X3RleHQoenosIHlfcHRyLCBwb3N0LT55X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgbWJfaW5kZXggKys7CisgICAgICAgICAgICAgICAgeV9wdHIgKz0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1iX2luZGV4ICsrOyAvKiBib3JkZXIgKi8KKyAgICAgICAgICAgIHlfcHRyICs9IHBvc3QtPnlfc3RyaWRlICAqIDE2IC0gcG9zdC0+eV93aWR0aDsKKworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVlA4RF9ERUJVR19UWFRfUkFURV9JTkZPKQorICAgIHsKKyAgICAgICAgY2hhciBtZXNzYWdlWzUxMl07CisgICAgICAgIHNwcmludGYobWVzc2FnZSwgIkJpdHJhdGU6ICUxMC4yZiBmcmFtZV9yYXRlOiAlMTAuMmYgIiwgb2NpLT5iaXRyYXRlLCBvY2ktPmZyYW1lcmF0ZSk7CisgICAgICAgIHZwOF9ibGl0X3RleHQobWVzc2FnZSwgb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfYnVmZmVyLCBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9zdHJpZGUpOworICAgIH0KKworICAgIC8qIERyYXcgbW90aW9uIHZlY3RvcnMgKi8KKyAgICBpZiAoKGZsYWdzICYgVlA4RF9ERUJVR19EUkFXX01WKSAmJiBwcGZsYWdzLT5kaXNwbGF5X212X2ZsYWcpCisgICAgeworICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnBvc3QgPSAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyOworICAgICAgICBpbnQgd2lkdGggID0gcG9zdC0+eV93aWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IHBvc3QtPnlfaGVpZ2h0OworICAgICAgICB1bnNpZ25lZCBjaGFyICp5X2J1ZmZlciA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X2J1ZmZlcjsKKyAgICAgICAgaW50IHlfc3RyaWRlID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfc3RyaWRlOworICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKKyAgICAgICAgaW50IHgwLCB5MDsKKworICAgICAgICBmb3IgKHkwID0gMDsgeTAgPCBoZWlnaHQ7IHkwICs9IDE2KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHgwID0gMDsgeDAgPCB3aWR0aDsgeDAgKz0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHgxLCB5MTsKKworICAgICAgICAgICAgICAgIGlmICghKHBwZmxhZ3MtPmRpc3BsYXlfbXZfZmxhZyAmICgxPDxtaS0+bWJtaS5tb2RlKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobWktPm1ibWkubW9kZSA9PSBTUExJVE1WKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtaS0+bWJtaS5wYXJ0aXRpb25pbmcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6ICAgIC8qIG12X3RvcF9ib3R0b20gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBiX21vZGVfaW5mbyAqYm1pID0gJm1pLT5ibWlbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVYgKm12ID0gJmJtaS0+bXYuYXNfbXY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHgwICsgOCArIChtdi0+Y29sID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geTAgKyA0ICsgKG12LT5yb3cgPj4gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5fbGluZSAoeDArOCwgJngxLCB5MCs0LCAmeTEsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9ibGl0X2xpbmUgICh4MCs4LCAgeDEsIHkwKzQsICB5MSwgeV9idWZmZXIsIHlfc3RyaWRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaSA9ICZtaS0+Ym1pWzhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSB4MCArIDggKyAobXYtPmNvbCA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHkwICsxMiArIChtdi0+cm93ID4+IDMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluX2xpbmUgKHgwKzgsICZ4MSwgeTArMTIsICZ5MSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKHgwKzgsICB4MSwgeTArMTIsICB5MSwgeV9idWZmZXIsIHlfc3RyaWRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogICAgLyogbXZfbGVmdF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGJfbW9kZV9pbmZvICpibWkgPSAmbWktPmJtaVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNViAqbXYgPSAmYm1pLT5tdi5hc19tdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDAgKyA0ICsgKG12LT5jb2wgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5MCArIDggKyAobXYtPnJvdyA+PiAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lICh4MCs0LCAmeDEsIHkwKzgsICZ5MSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKHgwKzQsICB4MSwgeTArOCwgIHkxLCB5X2J1ZmZlciwgeV9zdHJpZGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1pID0gJm1pLT5ibWlbMl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHgwICsxMiArIChtdi0+Y29sID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geTAgKyA4ICsgKG12LT5yb3cgPj4gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5fbGluZSAoeDArMTIsICZ4MSwgeTArOCwgJnkxLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAoeDArMTIsICB4MSwgeTArOCwgIHkxLCB5X2J1ZmZlciwgeV9zdHJpZGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAgICAvKiBtdl9xdWFydGVycyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gYl9tb2RlX2luZm8gKmJtaSA9ICZtaS0+Ym1pWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WICptdiA9ICZibWktPm12LmFzX212OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSB4MCArIDQgKyAobXYtPmNvbCA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHkwICsgNCArIChtdi0+cm93ID4+IDMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluX2xpbmUgKHgwKzQsICZ4MSwgeTArNCwgJnkxLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAoeDArNCwgIHgxLCB5MCs0LCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkgPSAmbWktPmJtaVsyXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDAgKzEyICsgKG12LT5jb2wgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5MCArIDQgKyAobXYtPnJvdyA+PiAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lICh4MCsxMiwgJngxLCB5MCs0LCAmeTEsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9ibGl0X2xpbmUgICh4MCsxMiwgIHgxLCB5MCs0LCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkgPSAmbWktPmJtaVs4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDAgKyA0ICsgKG12LT5jb2wgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5MCArMTIgKyAobXYtPnJvdyA+PiAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lICh4MCs0LCAmeDEsIHkwKzEyLCAmeTEsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9ibGl0X2xpbmUgICh4MCs0LCAgeDEsIHkwKzEyLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkgPSAmbWktPmJtaVsxMF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHgwICsxMiArIChtdi0+Y29sID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geTAgKzEyICsgKG12LT5yb3cgPj4gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5fbGluZSAoeDArMTIsICZ4MSwgeTArMTIsICZ5MSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKHgwKzEyLCAgeDEsIHkwKzEyLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBiX21vZGVfaW5mbyAqYm1pID0gbWktPmJtaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYngwLCBieTA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJ5MCA9IHkwOyBieTAgPCAoeTArMTYpOyBieTAgKz0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYngwID0geDA7IGJ4MCA8ICh4MCsxNik7IGJ4MCArPSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNViAqbXYgPSAmYm1pLT5tdi5hc19tdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSBieDAgKyAyICsgKG12LT5jb2wgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IGJ5MCArIDIgKyAobXYtPnJvdyA+PiAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluX2xpbmUgKGJ4MCsyLCAmeDEsIGJ5MCsyLCAmeTEsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKGJ4MCsyLCAgeDEsIGJ5MCsyLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pLT5tYm1pLm1vZGUgPj0gTkVBUkVTVE1WKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTVYgKm12ID0gJm1pLT5tYm1pLm12LmFzX212OworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHgwID0geDAgKyA4OworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHkwID0geTAgKyA4OworCisgICAgICAgICAgICAgICAgICAgIHgxID0gbHgwICsgKG12LT5jb2wgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIHkxID0gbHkwICsgKG12LT5yb3cgPj4gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHgxICE9IGx4MCAmJiB5MSAhPSBseTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lIChseDAsICZ4MSwgbHkwLTEsICZ5MSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAobHgwLCAgeDEsIGx5MC0xLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lIChseDAsICZ4MSwgbHkwKzEsICZ5MSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAobHgwLCAgeDEsIGx5MCsxLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKGx4MCwgIHgxLCBseTAsICB5MSwgeV9idWZmZXIsIHlfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvbG9yIGluIGJsb2NrIG1vZGVzICovCisgICAgaWYgKChmbGFncyAmIFZQOERfREVCVUdfQ0xSX0JMS19NT0RFUykKKyAgICAgICAgJiYgKHBwZmxhZ3MtPmRpc3BsYXlfbWJfbW9kZXNfZmxhZyB8fCBwcGZsYWdzLT5kaXNwbGF5X2JfbW9kZXNfZmxhZykpCisgICAgeworICAgICAgICBpbnQgeSwgeDsKKyAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcjsKKyAgICAgICAgaW50IHdpZHRoICA9IHBvc3QtPnlfd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQgPSBwb3N0LT55X2hlaWdodDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHIgPSBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9idWZmZXI7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnVfcHRyID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnVfYnVmZmVyOworICAgICAgICB1bnNpZ25lZCBjaGFyICp2X3B0ciA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci52X2J1ZmZlcjsKKyAgICAgICAgaW50IHlfc3RyaWRlID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfc3RyaWRlOworICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDE2KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IFkgPSAwLCBVID0gMCwgViA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAobWktPm1ibWkubW9kZSA9PSBCX1BSRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgKChwcGZsYWdzLT5kaXNwbGF5X21iX21vZGVzX2ZsYWcgJiBCX1BSRUQpIHx8IHBwZmxhZ3MtPmRpc3BsYXlfYl9tb2Rlc19mbGFnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBieSwgYng7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnlsLCAqdWwsICp2bDsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gYl9tb2RlX2luZm8gKmJtaSA9IG1pLT5ibWk7CisKKyAgICAgICAgICAgICAgICAgICAgeWwgPSB5X3B0ciArIHg7CisgICAgICAgICAgICAgICAgICAgIHVsID0gdV9wdHIgKyAoeD4+MSk7CisgICAgICAgICAgICAgICAgICAgIHZsID0gdl9wdHIgKyAoeD4+MSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChieSA9IDA7IGJ5IDwgMTY7IGJ5ICs9IDQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYnggPSAwOyBieCA8IDE2OyBieCArPSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHBmbGFncy0+ZGlzcGxheV9iX21vZGVzX2ZsYWcgJiAoMTw8bWktPm1ibWkubW9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwcGZsYWdzLT5kaXNwbGF5X21iX21vZGVzX2ZsYWcgJiBCX1BSRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSA9IEJfUFJFRElDVElPTl9NT0RFX2NvbG9yc1tibWktPmFzX21vZGVdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVID0gQl9QUkVESUNUSU9OX01PREVfY29sb3JzW2JtaS0+YXNfbW9kZV1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgPSBCX1BSRURJQ1RJT05fTU9ERV9jb2xvcnNbYm1pLT5hc19tb2RlXVsyXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxlbmRfYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHlsK2J4LCB1bCsoYng+PjEpLCB2bCsoYng+PjEpLCBZLCBVLCBWLCAweGMwMDAsIHlfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1pKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHlsICs9IHlfc3RyaWRlKjQ7CisgICAgICAgICAgICAgICAgICAgICAgICB1bCArPSB5X3N0cmlkZSoxOworICAgICAgICAgICAgICAgICAgICAgICAgdmwgKz0geV9zdHJpZGUqMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwcGZsYWdzLT5kaXNwbGF5X21iX21vZGVzX2ZsYWcgJiAoMTw8bWktPm1ibWkubW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBZID0gTUJfUFJFRElDVElPTl9NT0RFX2NvbG9yc1ttaS0+bWJtaS5tb2RlXVswXTsKKyAgICAgICAgICAgICAgICAgICAgVSA9IE1CX1BSRURJQ1RJT05fTU9ERV9jb2xvcnNbbWktPm1ibWkubW9kZV1bMV07CisgICAgICAgICAgICAgICAgICAgIFYgPSBNQl9QUkVESUNUSU9OX01PREVfY29sb3JzW21pLT5tYm1pLm1vZGVdWzJdOworCisgICAgICAgICAgICAgICAgICAgIHZwOF9ibGVuZF9tYl9pbm5lcgorICAgICAgICAgICAgICAgICAgICAgICAgKHlfcHRyK3gsIHVfcHRyKyh4Pj4xKSwgdl9wdHIrKHg+PjEpLCBZLCBVLCBWLCAweGMwMDAsIHlfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeV9wdHIgKz0geV9zdHJpZGUqMTY7CisgICAgICAgICAgICB1X3B0ciArPSB5X3N0cmlkZSo0OworICAgICAgICAgICAgdl9wdHIgKz0geV9zdHJpZGUqNDsKKworICAgICAgICAgICAgbWkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvbG9yIGluIGZyYW1lIHJlZmVyZW5jZSBibG9ja3MgKi8KKyAgICBpZiAoKGZsYWdzICYgVlA4RF9ERUJVR19DTFJfRlJNX1JFRl9CTEtTKSAmJiBwcGZsYWdzLT5kaXNwbGF5X3JlZl9mcmFtZV9mbGFnKQorICAgIHsKKyAgICAgICAgaW50IHksIHg7CisgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqcG9zdCA9ICZvY2ktPnBvc3RfcHJvY19idWZmZXI7CisgICAgICAgIGludCB3aWR0aCAgPSBwb3N0LT55X3dpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gcG9zdC0+eV9oZWlnaHQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnlfcHRyID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfYnVmZmVyOworICAgICAgICB1bnNpZ25lZCBjaGFyICp1X3B0ciA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci51X2J1ZmZlcjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqdl9wdHIgPSBvY2ktPnBvc3RfcHJvY19idWZmZXIudl9idWZmZXI7CisgICAgICAgIGludCB5X3N0cmlkZSA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X3N0cmlkZTsKKyAgICAgICAgTU9ERV9JTkZPICptaSA9IG9jaS0+bWk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAxNikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9MTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IFkgPSAwLCBVID0gMCwgViA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocHBmbGFncy0+ZGlzcGxheV9yZWZfZnJhbWVfZmxhZyAmICgxPDxtaS0+bWJtaS5yZWZfZnJhbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWSA9IE1WX1JFRkVSRU5DRV9GUkFNRV9jb2xvcnNbbWktPm1ibWkucmVmX2ZyYW1lXVswXTsKKyAgICAgICAgICAgICAgICAgICAgVSA9IE1WX1JFRkVSRU5DRV9GUkFNRV9jb2xvcnNbbWktPm1ibWkucmVmX2ZyYW1lXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgViA9IE1WX1JFRkVSRU5DRV9GUkFNRV9jb2xvcnNbbWktPm1ibWkucmVmX2ZyYW1lXVsyXTsKKworICAgICAgICAgICAgICAgICAgICB2cDhfYmxlbmRfbWJfb3V0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0cit4LCB1X3B0cisoeD4+MSksIHZfcHRyKyh4Pj4xKSwgWSwgVSwgViwgMHhjMDAwLCB5X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlfcHRyICs9IHlfc3RyaWRlKjE2OworICAgICAgICAgICAgdV9wdHIgKz0geV9zdHJpZGUqNDsKKyAgICAgICAgICAgIHZfcHRyICs9IHlfc3RyaWRlKjQ7CisKKyAgICAgICAgICAgIG1pKys7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgICpkZXN0ID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyOworCisgICAgLyogaGFuZGxlIHByb2JsZW0gd2l0aCBleHRlbmRpbmcgYm9yZGVycyAqLworICAgIGRlc3QtPnlfd2lkdGggPSBvY2ktPldpZHRoOworICAgIGRlc3QtPnlfaGVpZ2h0ID0gb2NpLT5IZWlnaHQ7CisgICAgZGVzdC0+dXZfaGVpZ2h0ID0gZGVzdC0+eV9oZWlnaHQgLyAyOworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9wb3N0cHJvYy5oIGIvbGlidnB4L3ZwOC9jb21tb24vcG9zdHByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVhMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcG9zdHByb2MuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBQT1NUUFJPQ19ICisjZGVmaW5lIFBPU1RQUk9DX0gKKworI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKK3N0cnVjdCBwb3N0cHJvY19zdGF0ZQoreworICAgIGludCAgICAgICAgICAgbGFzdF9xOworICAgIGludCAgICAgICAgICAgbGFzdF9ub2lzZTsKKyAgICBjaGFyICAgICAgICAgIG5vaXNlWzMwNzJdOworICAgIGludCAgICAgICAgICAgbGFzdF9iYXNlX3FpbmRleDsKKyAgICBpbnQgICAgICAgICAgIGxhc3RfZnJhbWVfdmFsaWQ7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBjaGFyLCBibGFja2NsYW1wWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBjaGFyLCB3aGl0ZWNsYW1wWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBjaGFyLCBib3RoY2xhbXBbMTZdKTsKK307CisjaW5jbHVkZSAib255eGNfaW50LmgiCisjaW5jbHVkZSAicHBmbGFncy5oIgoraW50IHZwOF9wb3N0X3Byb2NfZnJhbWUoc3RydWN0IFZQOENvbW1vbiAqb2NpLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfcHBmbGFnc190ICpmbGFncyk7CisKKwordm9pZCB2cDhfZGVfbm9pc2Uoc3RydWN0IFZQOENvbW1vbiAgICAgICAgICAgKm9jaSwKKyAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqcG9zdCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBxLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxvd192YXJfdGhyZXNoLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcpOworCit2b2lkIHZwOF9kZWJsb2NrKHN0cnVjdCBWUDhDb21tb24gICAgICAgICAgICpvY2ksCisgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpwb3N0LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxvd192YXJfdGhyZXNoLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyk7CisKKyNkZWZpbmUgTUZRRV9QUkVDSVNJT04gNAorCit2b2lkIHZwOF9tdWx0aWZyYW1lX3F1YWxpdHlfZW5oYW5jZShzdHJ1Y3QgVlA4Q29tbW9uICpjbSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcHBjL2NvcHlfYWx0aXZlYy5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9wcGMvY29weV9hbHRpdmVjLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9wcGMvY29weV9hbHRpdmVjLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vcHBjL2NvcHlfYWx0aXZlYy5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcHBjL2ZpbHRlcl9hbHRpdmVjLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3BwYy9maWx0ZXJfYWx0aXZlYy5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vcHBjL2ZpbHRlcl9hbHRpdmVjLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vcHBjL2ZpbHRlcl9hbHRpdmVjLmFzbQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9wcGMvZmlsdGVyX2JpbGluZWFyX2FsdGl2ZWMuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vcHBjL2ZpbHRlcl9iaWxpbmVhcl9hbHRpdmVjLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9wcGMvZmlsdGVyX2JpbGluZWFyX2FsdGl2ZWMuYXNtCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9wcGMvZmlsdGVyX2JpbGluZWFyX2FsdGl2ZWMuYXNtCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3BwYy9pZGN0bGxtX2FsdGl2ZWMuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vcHBjL2lkY3RsbG1fYWx0aXZlYy5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vcHBjL2lkY3RsbG1fYWx0aXZlYy5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL3BwYy9pZGN0bGxtX2FsdGl2ZWMuYXNtCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9wcGMvbG9vcGZpbHRlcl9hbHRpdmVjLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9wcGMvbG9vcGZpbHRlcl9hbHRpdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiZjZlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3BwYy9sb29wZmlsdGVyX2FsdGl2ZWMuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJsb29wZmlsdGVyLmgiCisjaW5jbHVkZSAib255eGNfaW50LmgiCisKK3R5cGVkZWYgdm9pZCBsb29wX2ZpbHRlcl9mdW5jdGlvbl95X3BwYworKAorICAgIHVuc2lnbmVkIGNoYXIgKnMsICAgLy8gc291cmNlIHBvaW50ZXIKKyAgICBpbnQgcCwgICAgICAgICAgICAgIC8vIHBpdGNoCisgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKKyAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCisgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaAorKTsKKwordHlwZWRlZiB2b2lkIGxvb3BfZmlsdGVyX2Z1bmN0aW9uX3V2X3BwYworKAorICAgIHVuc2lnbmVkIGNoYXIgKnUsICAgLy8gc291cmNlIHBvaW50ZXIKKyAgICB1bnNpZ25lZCBjaGFyICp2LCAgIC8vIHNvdXJjZSBwb2ludGVyCisgICAgaW50IHAsICAgICAgICAgICAgICAvLyBwaXRjaAorICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCisgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAorICAgIGNvbnN0IHNpZ25lZCBjaGFyICp0aHJlc2gKKyk7CisKK3R5cGVkZWYgdm9pZCBsb29wX2ZpbHRlcl9mdW5jdGlvbl9zX3BwYworKAorICAgIHVuc2lnbmVkIGNoYXIgKnMsICAgLy8gc291cmNlIHBvaW50ZXIKKyAgICBpbnQgcCwgICAgICAgICAgICAgIC8vIHBpdGNoCisgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdAorKTsKKworbG9vcF9maWx0ZXJfZnVuY3Rpb25feV9wcGMgbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9wcGM7Citsb29wX2ZpbHRlcl9mdW5jdGlvbl95X3BwYyBtYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9wcGM7Citsb29wX2ZpbHRlcl9mdW5jdGlvbl95X3BwYyBsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9wcGM7Citsb29wX2ZpbHRlcl9mdW5jdGlvbl95X3BwYyBsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfcHBjOworCitsb29wX2ZpbHRlcl9mdW5jdGlvbl91dl9wcGMgbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfcHBjOworbG9vcF9maWx0ZXJfZnVuY3Rpb25fdXZfcHBjIG1ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9wcGM7Citsb29wX2ZpbHRlcl9mdW5jdGlvbl91dl9wcGMgbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3BwYzsKK2xvb3BfZmlsdGVyX2Z1bmN0aW9uX3V2X3BwYyBsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X3BwYzsKKworbG9vcF9maWx0ZXJfZnVuY3Rpb25fc19wcGMgbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9wcGM7Citsb29wX2ZpbHRlcl9mdW5jdGlvbl9zX3BwYyBsb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9wcGM7CisKKy8vIEhvcml6b250YWwgTUIgZmlsdGVyaW5nCit2b2lkIGxvb3BfZmlsdGVyX21iaF9wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICBtYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOworCisgICAgaWYgKHVfcHRyKQorICAgICAgICBtYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9wcGModV9wdHIsIHZfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOworfQorCit2b2lkIGxvb3BfZmlsdGVyX21iaHNfcHBjKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgICh2b2lkKXVfcHRyOworICAgICh2b2lkKXZfcHRyOworICAgICh2b2lkKXV2X3N0cmlkZTsKKyAgICBsb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltKTsKK30KKworLy8gVmVydGljYWwgTUIgRmlsdGVyaW5nCit2b2lkIGxvb3BfZmlsdGVyX21idl9wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICBtYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9wcGMoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X3BwYyh1X3B0ciwgdl9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRocik7Cit9CisKK3ZvaWQgbG9vcF9maWx0ZXJfbWJ2c19wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgKHZvaWQpdV9wdHI7CisgICAgKHZvaWQpdl9wdHI7CisgICAgKHZvaWQpdXZfc3RyaWRlOworICAgIGxvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltKTsKK30KKworLy8gSG9yaXpvbnRhbCBCIEZpbHRlcmluZwordm9pZCBsb29wX2ZpbHRlcl9iaF9wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIC8vIFRoZXNlIHNob3VsZCBhbGwgYmUgZG9uZSBhdCBvbmNlIHdpdGggb25lIGNhbGwsIGluc3RlYWQgb2YgMworICAgIGxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X3BwYyh5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKKyAgICBsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9wcGMoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRocik7CisgICAgbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfcHBjKHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3BwYyh1X3B0ciArIDQgKiB1dl9zdHJpZGUsIHZfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRocik7Cit9CisKK3ZvaWQgbG9vcF9maWx0ZXJfYmhzX3BwYyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgICh2b2lkKXVfcHRyOworICAgICh2b2lkKXZfcHRyOworICAgICh2b2lkKXV2X3N0cmlkZTsKKyAgICBsb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3BwYyh5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSk7CisgICAgbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9wcGMoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0pOworICAgIGxvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfcHBjKHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSk7Cit9CisKKy8vIFZlcnRpY2FsIEIgRmlsdGVyaW5nCit2b2lkIGxvb3BfZmlsdGVyX2J2X3BwYyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9wcGModV9wdHIgKyA0LCB2X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOworfQorCit2b2lkIGxvb3BfZmlsdGVyX2J2c19wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICAodm9pZCl1X3B0cjsKKyAgICAodm9pZCl2X3B0cjsKKyAgICAodm9pZCl1dl9zdHJpZGU7CisgICAgbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfcHBjKHlfcHRyICsgNCwgIHlfc3RyaWRlLCBsZmktPmZsaW0pOworICAgIGxvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3BwYyh5X3B0ciArIDgsICB5X3N0cmlkZSwgbGZpLT5mbGltKTsKKyAgICBsb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9wcGMoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGxmaS0+ZmxpbSk7Cit9CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3BwYy9sb29wZmlsdGVyX2ZpbHRlcnNfYWx0aXZlYy5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9wcGMvbG9vcGZpbHRlcl9maWx0ZXJzX2FsdGl2ZWMuYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL3BwYy9sb29wZmlsdGVyX2ZpbHRlcnNfYWx0aXZlYy5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL3BwYy9sb29wZmlsdGVyX2ZpbHRlcnNfYWx0aXZlYy5hc20KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcHBjL3BsYXRmb3JtX2FsdGl2ZWMuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24vcHBjL3BsYXRmb3JtX2FsdGl2ZWMuYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL3BwYy9wbGF0Zm9ybV9hbHRpdmVjLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vcHBjL3BsYXRmb3JtX2FsdGl2ZWMuYXNtCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3BwYy9yZWNvbl9hbHRpdmVjLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3BwYy9yZWNvbl9hbHRpdmVjLmFzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9wcGMvcmVjb25fYWx0aXZlYy5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL3BwYy9yZWNvbl9hbHRpdmVjLmFzbQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcHBjL3NhZF9hbHRpdmVjLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3BwYy9zYWRfYWx0aXZlYy5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9lbmNvZGVyL3BwYy9zYWRfYWx0aXZlYy5hc20KcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL3BwYy9zYWRfYWx0aXZlYy5hc20KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3BwYy9zeXN0ZW1kZXBlbmRlbnQuYyBiL2xpYnZweC92cDgvY29tbW9uL3BwYy9zeXN0ZW1kZXBlbmRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y0Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcHBjL3N5c3RlbWRlcGVuZGVudC5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInN1YnBpeGVsLmgiCisjaW5jbHVkZSAibG9vcGZpbHRlci5oIgorI2luY2x1ZGUgInJlY29uLmgiCisjaW5jbHVkZSAiaWRjdC5oIgorI2luY2x1ZGUgIm9ueXhjX2ludC5oIgorCit2b2lkICgqdnA4X3Nob3J0X2lkY3Q0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKK3ZvaWQgKCp2cDhfc2hvcnRfaWRjdDR4NF8xKShzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Cit2b2lkICgqdnA4X2RjX29ubHlfaWRjdCkoc2hvcnQgaW5wdXRfZGMsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7CisKK2V4dGVybiB2b2lkICgqdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93KSgKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgaW50IGNvbHMsCisgICAgdW5zaWduZWQgY2hhciAqZiwKKyAgICBpbnQgc2l6ZQorKTsKKworZXh0ZXJuIHZvaWQgKCp2cDhfbWJwb3N0X3Byb2NfZG93bikodW5zaWduZWQgY2hhciAqZHN0LCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scywgaW50IGZsaW1pdCk7CitleHRlcm4gdm9pZCB2cDhfbWJwb3N0X3Byb2NfZG93bl9jKHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHBpdGNoLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBmbGltaXQpOworZXh0ZXJuIHZvaWQgKCp2cDhfbWJwb3N0X3Byb2NfYWNyb3NzX2lwKSh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZmxpbWl0KTsKK2V4dGVybiB2b2lkIHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZmxpbWl0KTsKKworZXh0ZXJuIHZvaWQgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93X2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgaW50IGNvbHMsCisgICAgdW5zaWduZWQgY2hhciAqZiwKKyAgICBpbnQgc2l6ZQorKTsKK3ZvaWQgdnA4X3BsYW5lX2FkZF9ub2lzZV9jKHVuc2lnbmVkIGNoYXIgKlN0YXJ0LCB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCwgaW50IHEsIGludCBhKTsKKworZXh0ZXJuIGNvcHlfbWVtX2Jsb2NrX2Z1bmN0aW9uICp2cDhfY29weV9tZW0xNngxNjsKK2V4dGVybiBjb3B5X21lbV9ibG9ja19mdW5jdGlvbiAqdnA4X2NvcHlfbWVtOHg4OworZXh0ZXJuIGNvcHlfbWVtX2Jsb2NrX2Z1bmN0aW9uICp2cDhfY29weV9tZW04eDQ7CisKKy8vIFBQQworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gc2l4dGFwX3ByZWRpY3RfcHBjOworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gc2l4dGFwX3ByZWRpY3Q4eDRfcHBjOworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gc2l4dGFwX3ByZWRpY3Q4eDhfcHBjOworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gc2l4dGFwX3ByZWRpY3QxNngxNl9wcGM7CitleHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiBiaWxpbmVhcl9wcmVkaWN0NHg0X3BwYzsKK2V4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIGJpbGluZWFyX3ByZWRpY3Q4eDRfcHBjOworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gYmlsaW5lYXJfcHJlZGljdDh4OF9wcGM7CitleHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiBiaWxpbmVhcl9wcmVkaWN0MTZ4MTZfcHBjOworCitleHRlcm4gY29weV9tZW1fYmxvY2tfZnVuY3Rpb24gY29weV9tZW0xNngxNl9wcGM7CisKK3ZvaWQgcmVjb25fYl9wcGMoc2hvcnQgKmRpZmZfcHRyLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHN0cmlkZSk7Cit2b2lkIHJlY29uMmJfcHBjKHNob3J0ICpkaWZmX3B0ciwgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBzdHJpZGUpOwordm9pZCByZWNvbjRiX3BwYyhzaG9ydCAqZGlmZl9wdHIsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLCBpbnQgc3RyaWRlKTsKKworZXh0ZXJuIHZvaWQgc2hvcnRfaWRjdDR4NGxsbV9wcGMoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOworCisvLyBHZW5lcmljIEMKK2V4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHZwOF9zaXh0YXBfcHJlZGljdF9jOworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2M7CitleHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfYzsKK2V4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2M7CitleHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9jOworZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfYzsKK2V4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2M7CitleHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2M7CisKK2V4dGVybiBjb3B5X21lbV9ibG9ja19mdW5jdGlvbiB2cDhfY29weV9tZW0xNngxNl9jOworZXh0ZXJuIGNvcHlfbWVtX2Jsb2NrX2Z1bmN0aW9uIHZwOF9jb3B5X21lbTh4OF9jOworZXh0ZXJuIGNvcHlfbWVtX2Jsb2NrX2Z1bmN0aW9uIHZwOF9jb3B5X21lbTh4NF9jOworCit2b2lkIHZwOF9yZWNvbl9iX2Moc2hvcnQgKmRpZmZfcHRyLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHN0cmlkZSk7Cit2b2lkIHZwOF9yZWNvbjJiX2Moc2hvcnQgKmRpZmZfcHRyLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHN0cmlkZSk7Cit2b2lkIHZwOF9yZWNvbjRiX2Moc2hvcnQgKmRpZmZfcHRyLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHN0cmlkZSk7CisKK2V4dGVybiB2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7CitleHRlcm4gdm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKK2V4dGVybiB2b2lkIHZwOF9kY19vbmx5X2lkY3RfYyhzaG9ydCBpbnB1dF9kYywgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKKworLy8gUFBDCitleHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gbG9vcF9maWx0ZXJfbWJ2X3BwYzsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiBsb29wX2ZpbHRlcl9idl9wcGM7CitleHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gbG9vcF9maWx0ZXJfbWJoX3BwYzsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiBsb29wX2ZpbHRlcl9iaF9wcGM7CisKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiBsb29wX2ZpbHRlcl9tYnZzX3BwYzsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiBsb29wX2ZpbHRlcl9idnNfcHBjOworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIGxvb3BfZmlsdGVyX21iaHNfcHBjOworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIGxvb3BfZmlsdGVyX2Joc19wcGM7CisKKy8vIEdlbmVyaWMgQworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIHZwOF9sb29wX2ZpbHRlcl9tYnZfYzsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfYnZfYzsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfbWJoX2M7CitleHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX2JoX2M7CisKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfbWJ2c19jOworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIHZwOF9sb29wX2ZpbHRlcl9idnNfYzsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfbWJoc19jOworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIHZwOF9sb29wX2ZpbHRlcl9iaHNfYzsKKworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uICp2cDhfbGZfbWJ2ZnVsbDsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiAqdnA4X2xmX21iaGZ1bGw7CitleHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gKnZwOF9sZl9idmZ1bGw7CitleHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gKnZwOF9sZl9iaGZ1bGw7CisKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiAqdnA4X2xmX21idnNpbXBsZTsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiAqdnA4X2xmX21iaHNpbXBsZTsKK2V4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiAqdnA4X2xmX2J2c2ltcGxlOworZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uICp2cDhfbGZfYmhzaW1wbGU7CisKK3ZvaWQgdnA4X2NsZWFyX2Modm9pZCkKK3sKK30KKwordm9pZCB2cDhfbWFjaGluZV9zcGVjaWZpY19jb25maWcodm9pZCkKK3sKKyAgICAvLyBQdXJlIEM6CisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSAgICAgICAgICAgICAgICA9IHZwOF9jbGVhcl9jOworICAgIHZwOF9yZWNvbl9iICAgICAgICAgICAgICAgICAgICAgICAgICA9IHZwOF9yZWNvbl9iX2M7CisgICAgdnA4X3JlY29uNGIgICAgICAgICAgICAgICAgICAgICAgICAgPSB2cDhfcmVjb240Yl9jOworICAgIHZwOF9yZWNvbjJiICAgICAgICAgICAgICAgICAgICAgICAgID0gdnA4X3JlY29uMmJfYzsKKworICAgIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTYgICAgICAgICAgICA9IGJpbGluZWFyX3ByZWRpY3QxNngxNl9wcGM7CisgICAgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDggICAgICAgICAgICAgID0gYmlsaW5lYXJfcHJlZGljdDh4OF9wcGM7CisgICAgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDQgICAgICAgICAgICAgID0gYmlsaW5lYXJfcHJlZGljdDh4NF9wcGM7CisgICAgdnA4X2JpbGluZWFyX3ByZWRpY3QgICAgICAgICAgICAgICAgID0gYmlsaW5lYXJfcHJlZGljdDR4NF9wcGM7CisKKyAgICB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiAgICAgICAgICAgICAgPSBzaXh0YXBfcHJlZGljdDE2eDE2X3BwYzsKKyAgICB2cDhfc2l4dGFwX3ByZWRpY3Q4eDggICAgICAgICAgICAgICAgPSBzaXh0YXBfcHJlZGljdDh4OF9wcGM7CisgICAgdnA4X3NpeHRhcF9wcmVkaWN0OHg0ICAgICAgICAgICAgICAgID0gc2l4dGFwX3ByZWRpY3Q4eDRfcHBjOworICAgIHZwOF9zaXh0YXBfcHJlZGljdCAgICAgICAgICAgICAgICAgICA9IHNpeHRhcF9wcmVkaWN0X3BwYzsKKworICAgIHZwOF9zaG9ydF9pZGN0NHg0XzEgICAgICAgICAgICAgICAgICA9IHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfYzsKKyAgICB2cDhfc2hvcnRfaWRjdDR4NCAgICAgICAgICAgICAgICAgICAgPSBzaG9ydF9pZGN0NHg0bGxtX3BwYzsKKyAgICB2cDhfZGNfb25seV9pZGN0ICAgICAgICAgICAgICAgICAgICAgID0gdnA4X2RjX29ubHlfaWRjdF9jOworCisgICAgdnA4X2xmX21idmZ1bGwgICAgICAgICAgICAgICAgICAgICAgID0gbG9vcF9maWx0ZXJfbWJ2X3BwYzsKKyAgICB2cDhfbGZfYnZmdWxsICAgICAgICAgICAgICAgICAgICAgICAgPSBsb29wX2ZpbHRlcl9idl9wcGM7CisgICAgdnA4X2xmX21iaGZ1bGwgICAgICAgICAgICAgICAgICAgICAgID0gbG9vcF9maWx0ZXJfbWJoX3BwYzsKKyAgICB2cDhfbGZfYmhmdWxsICAgICAgICAgICAgICAgICAgICAgICAgPSBsb29wX2ZpbHRlcl9iaF9wcGM7CisKKyAgICB2cDhfbGZfbWJ2c2ltcGxlICAgICAgICAgICAgICAgICAgICAgPSBsb29wX2ZpbHRlcl9tYnZzX3BwYzsKKyAgICB2cDhfbGZfYnZzaW1wbGUgICAgICAgICAgICAgICAgICAgICAgPSBsb29wX2ZpbHRlcl9idnNfcHBjOworICAgIHZwOF9sZl9tYmhzaW1wbGUgICAgICAgICAgICAgICAgICAgICA9IGxvb3BfZmlsdGVyX21iaHNfcHBjOworICAgIHZwOF9sZl9iaHNpbXBsZSAgICAgICAgICAgICAgICAgICAgICA9IGxvb3BfZmlsdGVyX2Joc19wcGM7CisKKyAgICB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tYl9yb3cgPSB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tYl9yb3dfYzsKKyAgICB2cDhfbWJwb3N0X3Byb2NfZG93biAgICAgICAgICAgICAgICAgID0gdnA4X21icG9zdF9wcm9jX2Rvd25fYzsKKyAgICB2cDhfbWJwb3N0X3Byb2NfYWNyb3NzX2lwICAgICAgICAgICAgICA9IHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfYzsKKyAgICB2cDhfcGxhbmVfYWRkX25vaXNlICAgICAgICAgICAgICAgICAgID0gdnA4X3BsYW5lX2FkZF9ub2lzZV9jOworCisgICAgdnA4X2NvcHlfbWVtMTZ4MTYgICAgICAgICAgICAgICAgICAgID0gY29weV9tZW0xNngxNl9wcGM7CisgICAgdnA4X2NvcHlfbWVtOHg4ICAgICAgICAgICAgICAgICAgICAgID0gdnA4X2NvcHlfbWVtOHg4X2M7CisgICAgdnA4X2NvcHlfbWVtOHg0ICAgICAgICAgICAgICAgICAgICAgID0gdnA4X2NvcHlfbWVtOHg0X2M7CisKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3BwYy92YXJpYW5jZV9hbHRpdmVjLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3BwYy92YXJpYW5jZV9hbHRpdmVjLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhkNWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcHBjL3ZhcmlhbmNlX2FsdGl2ZWMuYXNtCkBAIC0wLDAgKzEsMzc1IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgLmdsb2JsIHZwOF9nZXQ4eDh2YXJfcHBjCisgICAgLmdsb2JsIHZwOF9nZXQxNngxNnZhcl9wcGMKKyAgICAuZ2xvYmwgdnA4X21zZTE2eDE2X3BwYworICAgIC5nbG9ibCB2cDhfdmFyaWFuY2UxNngxNl9wcGMKKyAgICAuZ2xvYmwgdnA4X3ZhcmlhbmNlMTZ4OF9wcGMKKyAgICAuZ2xvYmwgdnA4X3ZhcmlhbmNlOHgxNl9wcGMKKyAgICAuZ2xvYmwgdnA4X3ZhcmlhbmNlOHg4X3BwYworICAgIC5nbG9ibCB2cDhfdmFyaWFuY2U0eDRfcHBjCisKKy5tYWNybyBsb2FkX2FsaWduZWRfMTYgViBSIE8KKyAgICBsdnNsICAgIHYzLCAgMCwgXFIgICAgICAgICAgOyMgcGVybXV0YXRlIHZhbHVlIGZvciBhbGlnbm1lbnQKKworICAgIGx2eCAgICAgdjEsICAwLCBcUgorICAgIGx2eCAgICAgdjIsIFxPLCBcUgorCisgICAgdnBlcm0gICBcViwgdjEsIHYyLCB2MworLmVuZG0KKworLm1hY3JvIHByb2xvZ3VlCisgICAgbWZzcHIgICByMTEsIDI1NiAgICAgICAgICAgIDsjIGdldCBvbGQgVlJTQVZFCisgICAgb3JpcyAgICByMTIsIHIxMSwgMHhmZmMwCisgICAgbXRzcHIgICAyNTYsIHIxMiAgICAgICAgICAgIDsjIHNldCBWUlNBVkUKKworICAgIHN0d3UgICAgcjEsIC0zMihyMSkgICAgICAgICA7IyBjcmVhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCisKKyAgICBsaSAgICAgIHIxMCwgMTYgICAgICAgICAgICAgOyMgbG9hZCBvZmZzZXQgYW5kIGxvb3AgY291bnRlcgorCisgICAgdnNwbHRpc3cgdjcsIDAgICAgICAgICAgICAgIDsjIHplcm8gZm9yIG1lcmdpbmcKKyAgICB2c3BsdGlzdyB2OCwgMCAgICAgICAgICAgICAgOyMgemVybyBvdXQgdG90YWwgdG8gc3RhcnQKKyAgICB2c3BsdGlzdyB2OSwgMCAgICAgICAgICAgICAgOyMgemVybyBvdXQgdG90YWwgZm9yIGRpZl4yCisuZW5kbQorCisubWFjcm8gZXBpbG9ndWUKKyAgICBhZGRpICAgIHIxLCByMSwgMzIgICAgICAgICAgOyMgcmVjb3ZlciBzdGFjaworCisgICAgbXRzcHIgICAyNTYsIHIxMSAgICAgICAgICAgIDsjIHJlc2V0IG9sZCBWUlNBVkUKKy5lbmRtCisKKy5tYWNybyBjb21wdXRlX3N1bV9zc2UKKyAgICA7IyBDb21wdXRlIHN1bSBmaXJzdC4gIFVucGFjayB0byBzbyBzaWduZWQgc3VicmFjdAorICAgIDsjICBjYW4gYmUgdXNlZC4gIE9ubHkgaGF2ZSBhIGhhbGYgd29yZCBzaWduZWQKKyAgICA7IyAgc3VicmFjdC4gIERvIGhpZ2gsIHRoZW4gbG93LgorICAgIHZtcmdoYiAgdjIsIHY3LCB2NAorICAgIHZtcmdoYiAgdjMsIHY3LCB2NQorICAgIHZzdWJzaHMgdjIsIHYyLCB2MworICAgIHZzdW00c2hzIHY4LCB2MiwgdjgKKworICAgIHZtcmdsYiAgdjIsIHY3LCB2NAorICAgIHZtcmdsYiAgdjMsIHY3LCB2NQorICAgIHZzdWJzaHMgdjIsIHYyLCB2MworICAgIHZzdW00c2hzIHY4LCB2MiwgdjgKKworICAgIDsjIE5vdyBjb21wdXRlIHNzZS4KKyAgICB2c3VidWJzIHYyLCB2NCwgdjUKKyAgICB2c3VidWJzIHYzLCB2NSwgdjQKKyAgICB2b3IgICAgIHYyLCB2MiwgdjMKKworICAgIHZtc3VtdWJtIHY5LCB2MiwgdjIsIHY5CisuZW5kbQorCisubWFjcm8gdmFyaWFuY2VfMTYgRFMgbG9vcF9sYWJlbCBzdG9yZV9zdW0KK1xsb29wX2xhYmVsOgorICAgIDsjIG9ubHkgb25lIG9mIHRoZSBpbnB1dHMgc2hvdWxkIG5lZWQgdG8gYmUgYWxpZ25lZC4KKyAgICBsb2FkX2FsaWduZWRfMTYgdjQsIHIzLCByMTAKKyAgICBsb2FkX2FsaWduZWRfMTYgdjUsIHI1LCByMTAKKworICAgIDsjIG1vdmUgb250byB0aGUgbmV4dCBsaW5lCisgICAgYWRkICAgICByMywgcjMsIHI0CisgICAgYWRkICAgICByNSwgcjUsIHI2CisKKyAgICBjb21wdXRlX3N1bV9zc2UKKworICAgIGJkbnogICAgXGxvb3BfbGFiZWwKKworICAgIHZzdW1zd3MgdjgsIHY4LCB2NworICAgIHZzdW1zd3MgdjksIHY5LCB2NworCisgICAgc3R2eCAgICB2OCwgMCwgcjEKKyAgICBsd3ogICAgIHIzLCAxMihyMSkKKworICAgIHN0dnggICAgdjksIDAsIHIxCisgICAgbHd6ICAgICByNCwgMTIocjEpCisKKy5pZiBcc3RvcmVfc3VtCisgICAgc3R3ICAgICByMywgMChyOCkgICAgICAgICAgIDsjIHN1bQorLmVuZGlmCisgICAgc3R3ICAgICByNCwgMChyNykgICAgICAgICAgIDsjIHNzZQorCisgICAgbXVsbHcgICByMywgcjMsIHIzICAgICAgICAgIDsjIHN1bSpzdW0KKyAgICBzcmx3aSAgIHIzLCByMywgXERTICAgICAgICAgOyMgKHN1bSpzdW0pID4+IERTCisgICAgc3ViZiAgICByMywgcjMsIHI0ICAgICAgICAgIDsjIHNzZSAtICgoc3VtKnN1bSkgPj4gRFMpCisuZW5kbQorCisubWFjcm8gdmFyaWFuY2VfOCBEUyBsb29wX2xhYmVsIHN0b3JlX3N1bQorXGxvb3BfbGFiZWw6CisgICAgOyMgb25seSBvbmUgb2YgdGhlIGlucHV0cyBzaG91bGQgbmVlZCB0byBiZSBhbGlnbmVkLgorICAgIGxvYWRfYWxpZ25lZF8xNiB2NCwgcjMsIHIxMAorICAgIGxvYWRfYWxpZ25lZF8xNiB2NSwgcjUsIHIxMAorCisgICAgOyMgbW92ZSBvbnRvIHRoZSBuZXh0IGxpbmUKKyAgICBhZGQgICAgIHIzLCByMywgcjQKKyAgICBhZGQgICAgIHI1LCByNSwgcjYKKworICAgIDsjIG9ubHkgb25lIG9mIHRoZSBpbnB1dHMgc2hvdWxkIG5lZWQgdG8gYmUgYWxpZ25lZC4KKyAgICBsb2FkX2FsaWduZWRfMTYgdjYsIHIzLCByMTAKKyAgICBsb2FkX2FsaWduZWRfMTYgdjAsIHI1LCByMTAKKworICAgIDsjIG1vdmUgb250byB0aGUgbmV4dCBsaW5lCisgICAgYWRkICAgICByMywgcjMsIHI0CisgICAgYWRkICAgICByNSwgcjUsIHI2CisKKyAgICB2bXJnaGIgIHY0LCB2NCwgdjYKKyAgICB2bXJnaGIgIHY1LCB2NSwgdjAKKworICAgIGNvbXB1dGVfc3VtX3NzZQorCisgICAgYmRueiAgICBcbG9vcF9sYWJlbAorCisgICAgdnN1bXN3cyB2OCwgdjgsIHY3CisgICAgdnN1bXN3cyB2OSwgdjksIHY3CisKKyAgICBzdHZ4ICAgIHY4LCAwLCByMQorICAgIGx3eiAgICAgcjMsIDEyKHIxKQorCisgICAgc3R2eCAgICB2OSwgMCwgcjEKKyAgICBsd3ogICAgIHI0LCAxMihyMSkKKworLmlmIFxzdG9yZV9zdW0KKyAgICBzdHcgICAgIHIzLCAwKHI4KSAgICAgICAgICAgOyMgc3VtCisuZW5kaWYKKyAgICBzdHcgICAgIHI0LCAwKHI3KSAgICAgICAgICAgOyMgc3NlCisKKyAgICBtdWxsdyAgIHIzLCByMywgcjMgICAgICAgICAgOyMgc3VtKnN1bQorICAgIHNybHdpICAgcjMsIHIzLCBcRFMgICAgICAgICA7IyAoc3VtKnN1bSkgPj4gOAorICAgIHN1YmYgICAgcjMsIHIzLCByNCAgICAgICAgICA7IyBzc2UgLSAoKHN1bSpzdW0pID4+IDgpCisuZW5kbQorCisgICAgLmFsaWduIDIKKzsjIHIzIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsjIHI0IGludCAgc291cmNlX3N0cmlkZQorOyMgcjUgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyMgcjYgaW50ICByZWNvbl9zdHJpZGUKKzsjIHI3IHVuc2lnbmVkIGludCAqU1NFCis7IyByOCBpbnQgKlN1bQorOyMKKzsjIHIzIHJldHVybiB2YWx1ZQordnA4X2dldDh4OHZhcl9wcGM6CisKKyAgICBwcm9sb2d1ZQorCisgICAgbGkgICAgICByOSwgNAorICAgIG10Y3RyICAgcjkKKworICAgIHZhcmlhbmNlXzggNiwgZ2V0OHg4dmFyX2xvb3AsIDEKKworICAgIGVwaWxvZ3VlCisKKyAgICBibHIKKworICAgIC5hbGlnbiAyCis7IyByMyB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IyByNCBpbnQgIHNvdXJjZV9zdHJpZGUKKzsjIHI1IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKKzsjIHI2IGludCAgcmVjb25fc3RyaWRlCis7IyByNyB1bnNpZ25lZCBpbnQgKlNTRQorOyMgcjggaW50ICpTdW0KKzsjCis7IyByMyByZXR1cm4gdmFsdWUKK3ZwOF9nZXQxNngxNnZhcl9wcGM6CisKKyAgICBwcm9sb2d1ZQorCisgICAgbXRjdHIgICByMTAKKworICAgIHZhcmlhbmNlXzE2IDgsIGdldDE2eDE2dmFyX2xvb3AsIDEKKworICAgIGVwaWxvZ3VlCisKKyAgICBibHIKKworICAgIC5hbGlnbiAyCis7IyByMyB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IyByNCBpbnQgIHNvdXJjZV9zdHJpZGUKKzsjIHI1IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKKzsjIHI2IGludCAgcmVjb25fc3RyaWRlCis7IyByNyB1bnNpZ25lZCBpbnQgKnNzZQorOyMKKzsjIHIgMyByZXR1cm4gdmFsdWUKK3ZwOF9tc2UxNngxNl9wcGM6CisgICAgcHJvbG9ndWUKKworICAgIG10Y3RyICAgcjEwCisKK21zZTE2eDE2X2xvb3A6CisgICAgOyMgb25seSBvbmUgb2YgdGhlIGlucHV0cyBzaG91bGQgbmVlZCB0byBiZSBhbGlnbmVkLgorICAgIGxvYWRfYWxpZ25lZF8xNiB2NCwgcjMsIHIxMAorICAgIGxvYWRfYWxpZ25lZF8xNiB2NSwgcjUsIHIxMAorCisgICAgOyMgbW92ZSBvbnRvIHRoZSBuZXh0IGxpbmUKKyAgICBhZGQgICAgIHIzLCByMywgcjQKKyAgICBhZGQgICAgIHI1LCByNSwgcjYKKworICAgIDsjIE5vdyBjb21wdXRlIHNzZS4KKyAgICB2c3VidWJzIHYyLCB2NCwgdjUKKyAgICB2c3VidWJzIHYzLCB2NSwgdjQKKyAgICB2b3IgICAgIHYyLCB2MiwgdjMKKworICAgIHZtc3VtdWJtIHY5LCB2MiwgdjIsIHY5CisKKyAgICBiZG56ICAgIG1zZTE2eDE2X2xvb3AKKworICAgIHZzdW1zd3MgdjksIHY5LCB2NworCisgICAgc3R2eCAgICB2OSwgMCwgcjEKKyAgICBsd3ogICAgIHIzLCAxMihyMSkKKworICAgIHN0dnggICAgdjksIDAsIHIxCisgICAgbHd6ICAgICByMywgMTIocjEpCisKKyAgICBzdHcgICAgIHIzLCAwKHI3KSAgICAgICAgICAgOyMgc3NlCisKKyAgICBlcGlsb2d1ZQorCisgICAgYmxyCisKKyAgICAuYWxpZ24gMgorOyMgcjMgdW5zaWduZWQgY2hhciAqc3JjX3B0cgorOyMgcjQgaW50ICBzb3VyY2Vfc3RyaWRlCis7IyByNSB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCis7IyByNiBpbnQgIHJlY29uX3N0cmlkZQorOyMgcjcgdW5zaWduZWQgaW50ICpzc2UKKzsjCis7IyByMyByZXR1cm4gdmFsdWUKK3ZwOF92YXJpYW5jZTE2eDE2X3BwYzoKKworICAgIHByb2xvZ3VlCisKKyAgICBtdGN0ciAgIHIxMAorCisgICAgdmFyaWFuY2VfMTYgOCwgdmFyaWFuY2UxNngxNl9sb29wLCAwCisKKyAgICBlcGlsb2d1ZQorCisgICAgYmxyCisKKyAgICAuYWxpZ24gMgorOyMgcjMgdW5zaWduZWQgY2hhciAqc3JjX3B0cgorOyMgcjQgaW50ICBzb3VyY2Vfc3RyaWRlCis7IyByNSB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCis7IyByNiBpbnQgIHJlY29uX3N0cmlkZQorOyMgcjcgdW5zaWduZWQgaW50ICpzc2UKKzsjCis7IyByMyByZXR1cm4gdmFsdWUKK3ZwOF92YXJpYW5jZTE2eDhfcHBjOgorCisgICAgcHJvbG9ndWUKKworICAgIGxpICAgICAgcjksIDgKKyAgICBtdGN0ciAgIHI5CisKKyAgICB2YXJpYW5jZV8xNiA3LCB2YXJpYW5jZTE2eDhfbG9vcCwgMAorCisgICAgZXBpbG9ndWUKKworICAgIGJscgorCisgICAgLmFsaWduIDIKKzsjIHIzIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsjIHI0IGludCAgc291cmNlX3N0cmlkZQorOyMgcjUgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyMgcjYgaW50ICByZWNvbl9zdHJpZGUKKzsjIHI3IHVuc2lnbmVkIGludCAqc3NlCis7IworOyMgcjMgcmV0dXJuIHZhbHVlCit2cDhfdmFyaWFuY2U4eDE2X3BwYzoKKworICAgIHByb2xvZ3VlCisKKyAgICBsaSAgICAgIHI5LCA4CisgICAgbXRjdHIgICByOQorCisgICAgdmFyaWFuY2VfOCA3LCB2YXJpYW5jZTh4MTZfbG9vcCwgMAorCisgICAgZXBpbG9ndWUKKworICAgIGJscgorCisgICAgLmFsaWduIDIKKzsjIHIzIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsjIHI0IGludCAgc291cmNlX3N0cmlkZQorOyMgcjUgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyMgcjYgaW50ICByZWNvbl9zdHJpZGUKKzsjIHI3IHVuc2lnbmVkIGludCAqc3NlCis7IworOyMgcjMgcmV0dXJuIHZhbHVlCit2cDhfdmFyaWFuY2U4eDhfcHBjOgorCisgICAgcHJvbG9ndWUKKworICAgIGxpICAgICAgcjksIDQKKyAgICBtdGN0ciAgIHI5CisKKyAgICB2YXJpYW5jZV84IDYsIHZhcmlhbmNlOHg4X2xvb3AsIDAKKworICAgIGVwaWxvZ3VlCisKKyAgICBibHIKKworLm1hY3JvIHRyYW5zZmVyXzR4NCBJIFAKKyAgICBsd3ogICAgIHIwLCAwKFxJKQorICAgIGFkZCAgICAgXEksIFxJLCBcUAorCisgICAgbHd6ICAgICByMTAsMChcSSkKKyAgICBhZGQgICAgIFxJLCBcSSwgXFAKKworICAgIGx3eiAgICAgcjgsIDAoXEkpCisgICAgYWRkICAgICBcSSwgXEksIFxQCisKKyAgICBsd3ogICAgIHI5LCAwKFxJKQorCisgICAgc3R3ICAgICByMCwgIDAocjEpCisgICAgc3R3ICAgICByMTAsIDQocjEpCisgICAgc3R3ICAgICByOCwgIDgocjEpCisgICAgc3R3ICAgICByOSwgMTIocjEpCisuZW5kbQorCisgICAgLmFsaWduIDIKKzsjIHIzIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKKzsjIHI0IGludCAgc291cmNlX3N0cmlkZQorOyMgcjUgdW5zaWduZWQgY2hhciAqcmVmX3B0cgorOyMgcjYgaW50ICByZWNvbl9zdHJpZGUKKzsjIHI3IHVuc2lnbmVkIGludCAqc3NlCis7IworOyMgcjMgcmV0dXJuIHZhbHVlCit2cDhfdmFyaWFuY2U0eDRfcHBjOgorCisgICAgcHJvbG9ndWUKKworICAgIHRyYW5zZmVyXzR4NCByMywgcjQKKyAgICBsdnggICAgIHY0LCAwLCByMQorCisgICAgdHJhbnNmZXJfNHg0IHI1LCByNgorICAgIGx2eCAgICAgdjUsIDAsIHIxCisKKyAgICBjb21wdXRlX3N1bV9zc2UKKworICAgIHZzdW1zd3MgdjgsIHY4LCB2NworICAgIHZzdW1zd3MgdjksIHY5LCB2NworCisgICAgc3R2eCAgICB2OCwgMCwgcjEKKyAgICBsd3ogICAgIHIzLCAxMihyMSkKKworICAgIHN0dnggICAgdjksIDAsIHIxCisgICAgbHd6ICAgICByNCwgMTIocjEpCisKKyAgICBzdHcgICAgIHI0LCAwKHI3KSAgICAgICAgICAgOyMgc3NlCisKKyAgICBtdWxsdyAgIHIzLCByMywgcjMgICAgICAgICAgOyMgc3VtKnN1bQorICAgIHNybHdpICAgcjMsIHIzLCA0ICAgICAgICAgICA7IyAoc3VtKnN1bSkgPj4gNAorICAgIHN1YmYgICAgcjMsIHIzLCByNCAgICAgICAgICA7IyBzc2UgLSAoKHN1bSpzdW0pID4+IDQpCisKKyAgICBlcGlsb2d1ZQorCisgICAgYmxyCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9wcGMvdmFyaWFuY2Vfc3VicGl4ZWxfYWx0aXZlYy5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi9wcGMvdmFyaWFuY2Vfc3VicGl4ZWxfYWx0aXZlYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwODM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3BwYy92YXJpYW5jZV9zdWJwaXhlbF9hbHRpdmVjLmFzbQpAQCAtMCwwICsxLDg2NSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIC5nbG9ibCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X3BwYworICAgIC5nbG9ibCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X3BwYworICAgIC5nbG9ibCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9wcGMKKyAgICAuZ2xvYmwgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfcHBjCisgICAgLmdsb2JsIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9wcGMKKworLm1hY3JvIGxvYWRfYyBWLCBMQUJFTCwgT0ZGLCBSMCwgUjEKKyAgICBsaXMgICAgIFxSMCwgXExBQkVMQGhhCisgICAgbGEgICAgICBcUjEsIFxMQUJFTEBsKFxSMCkKKyAgICBsdnggICAgIFxWLCBcT0ZGLCBcUjEKKy5lbmRtCisKKy5tYWNybyBsb2FkX3ZmaWx0ZXIgVjAsIFYxCisgICAgbG9hZF9jIFxWMCwgdmZpbHRlcl9iLCByNiwgcjEyLCByMTAKKworICAgIGFkZGkgICAgcjYsICByNiwgMTYKKyAgICBsdnggICAgIFxWMSwgcjYsIHIxMAorLmVuZG0KKworLm1hY3JvIEhQcm9sb2cganVtcF9sYWJlbAorICAgIDsjIGxvYWQgdXAgaG9yaXpvbnRhbCBmaWx0ZXIKKyAgICBzbHdpLiAgIHI1LCByNSwgNCAgICAgICAgICAgOyMgaW5kZXggaW50byBob3Jpem9udGFsIGZpbHRlciBhcnJheQorCisgICAgOyMgaW5kZXggdG8gdGhlIG5leHQgc2V0IG9mIHZlY3RvcnMgaW4gdGhlIHJvdy4KKyAgICBsaSAgICAgIHIxMCwgMTYKKworICAgIDsjIGRvd25zaGlmdCBieSA3ICggZGl2aWRlIGJ5IDEyOCApIGF0IHRoZSBlbmQKKyAgICB2c3BsdGlzaCB2MTksIDcKKworICAgIDsjIElmIHRoZXJlIGlzbid0IGFueSBmaWx0ZXJpbmcgdG8gYmUgZG9uZSBmb3IgdGhlIGhvcml6b250YWwsIHRoZW4KKyAgICA7IyAganVzdCBza2lwIHRvIHRoZSBzZWNvbmQgcGFzcy4KKyAgICBiZXEgICAgIFxqdW1wX2xhYmVsCisKKyAgICBsb2FkX2MgdjIwLCBoZmlsdGVyX2IsIHI1LCByMTIsIHIwCisKKyAgICA7IyBzZXR1cCBjb25zdGFudHMKKyAgICA7IyB2MTQgcGVybXV0YXRpb24gdmFsdWUgZm9yIGFsaWdubWVudAorICAgIGxvYWRfYyB2MjgsIGJfaHBlcm1fYiwgMCwgcjEyLCByMAorCisgICAgOyMgaW5kZXggdG8gdGhlIG5leHQgc2V0IG9mIHZlY3RvcnMgaW4gdGhlIHJvdy4KKyAgICBsaSAgICAgIHIxMiwgMzIKKworICAgIDsjIHJvdW5kaW5nIGFkZGVkIGluIG9uIHRoZSBtdWx0aXBseQorICAgIHZzcGx0aXN3IHYyMSwgOAorICAgIHZzcGx0aXN3IHYxOCwgMworICAgIHZzbHcgICAgdjE4LCB2MjEsIHYxOCAgICAgICA7IyAweDAwMDAwMDQwMDAwMDAwNDAwMDAwMDA0MDAwMDAwMDQwCisKKyAgICBzbHdpLiAgIHI2LCByNiwgNSAgICAgICAgICAgOyMgaW5kZXggaW50byB2ZXJ0aWNhbCBmaWx0ZXIgYXJyYXkKKy5lbmRtCisKKzsjIEZpbHRlcnMgYSBob3Jpem9udGFsIGxpbmUKKzsjIGV4cGVjdHM6Cis7IyAgcjMgIHNyY19wdHIKKzsjICByNCAgcGl0Y2gKKzsjICByMTAgMTYKKzsjICByMTIgMzIKKzsjICB2MTcgcGVybSBpbnRwdXQKKzsjICB2MTggcm91bmRpbmcKKzsjICB2MTkgc2hpZnQKKzsjICB2MjAgZmlsdGVyIHRhcHMKKzsjICB2MjEgdG1wCis7IyAgdjIyIHRtcAorOyMgIHYyMyB0bXAKKzsjICB2MjQgdG1wCis7IyAgdjI1IHRtcAorOyMgIHYyNiB0bXAKKzsjICB2MjcgdG1wCis7IyAgdjI4IHBlcm0gb3V0cHV0Cis7IworCisubWFjcm8gaGZpbHRlcl84IFYsIGhwLCBscCwgaW5jcmVtZW50X2NvdW50ZXIKKyAgICBsdnNsICAgIHYxNywgIDAsIHIzICAgICAgICAgOyMgcGVybXV0YXRlIHZhbHVlIGZvciBhbGlnbm1lbnQKKworICAgIDsjIGlucHV0IHRvIGZpbHRlciBpcyA5IGJ5dGVzIHdpZGUsIG91dHB1dCBpcyA4IGJ5dGVzLgorICAgIGx2eCAgICAgdjIxLCAgIDAsIHIzCisgICAgbHZ4ICAgICB2MjIsIHIxMCwgcjMKKworLmlmIFxpbmNyZW1lbnRfY291bnRlcgorICAgIGFkZCAgICAgcjMsIHIzLCByNAorLmVuZGlmCisgICAgdnBlcm0gICB2MjEsIHYyMSwgdjIyLCB2MTcKKworICAgIHZwZXJtICAgdjI0LCB2MjEsIHYyMSwgXGhwICA7IyB2MjAgPSAwMTIzIDEyMzQgMjM0NSAzNDU2CisgICAgdnBlcm0gICB2MjUsIHYyMSwgdjIxLCBcbHAgIDsjIHYyMSA9IDQ1NjcgNTY3OCA2Nzg5IDc4OUEKKworICAgIHZtc3VtbWJtIHYyNCwgdjIwLCB2MjQsIHYxOAorICAgIHZtc3VtbWJtIHYyNSwgdjIwLCB2MjUsIHYxOAorCisgICAgdnBrc3d1cyB2MjQsIHYyNCwgdjI1ICAgICAgIDsjIHYyNCA9IDAgNCA4IEMgMSA1IDkgRCAoMTYtYml0KQorCisgICAgdnNyaCAgICB2MjQsIHYyNCwgdjE5ICAgICAgIDsjIGRpdmlkZSB2MCwgdjEgYnkgMTI4CisKKyAgICB2cGt1aHVzIFxWLCB2MjQsIHYyNCAgICAgICAgOyMgXFYgPSBzY3JhbWJsZWQgOC1iaXQgcmVzdWx0CisuZW5kbQorCisubWFjcm8gdmZpbHRlcl8xNiBQMCBQMQorICAgIHZtdWxldWIgdjIyLCBcUDAsIHYyMCAgICAgICA7IyA2NCArIDQgcG9zaXRpdmUgdGFwcworICAgIHZhZGR1aG0gdjIyLCB2MTgsIHYyMgorICAgIHZtdWxvdWIgdjIzLCBcUDAsIHYyMAorICAgIHZhZGR1aG0gdjIzLCB2MTgsIHYyMworCisgICAgdm11bGV1YiB2MjQsIFxQMSwgdjIxCisgICAgdmFkZHVobSB2MjIsIHYyMiwgdjI0ICAgICAgIDsjIFJlID0gZXZlbnMsIHNhdHVyYXRpb24gdW5uZWNlc3NhcnkKKyAgICB2bXVsb3ViIHYyNSwgXFAxLCB2MjEKKyAgICB2YWRkdWhtIHYyMywgdjIzLCB2MjUgICAgICAgOyMgUm8gPSBvZGRzCisKKyAgICB2c3JoICAgIHYyMiwgdjIyLCB2MTkgICAgICAgOyMgZGl2aWRlIGJ5IDEyOAorICAgIHZzcmggICAgdjIzLCB2MjMsIHYxOSAgICAgICA7IyB2MTYgdjE3ID0gZXZlbnMsIG9kZHMKKyAgICB2bXJnaGggIFxQMCwgdjIyLCB2MjMgICAgICAgOyMgdjE4IHYxOSA9IDE2LWJpdCByZXN1bHQgaW4gb3JkZXIKKyAgICB2bXJnbGggIHYyMywgdjIyLCB2MjMKKyAgICB2cGt1aHVzIFxQMCwgXFAwLCB2MjMgICAgICAgOyMgUDAgPSA4LWJpdCByZXN1bHQKKy5lbmRtCisKKy5tYWNybyBjb21wdXRlX3N1bV9zc2Ugc3JjLCByZWYsIHN1bSwgc3NlLCB0MSwgdDIsIHowCisgICAgOyMgQ29tcHV0ZSBzdW0gZmlyc3QuICBVbnBhY2sgdG8gc28gc2lnbmVkIHN1YnJhY3QKKyAgICA7IyAgY2FuIGJlIHVzZWQuICBPbmx5IGhhdmUgYSBoYWxmIHdvcmQgc2lnbmVkCisgICAgOyMgIHN1YnJhY3QuICBEbyBoaWdoLCB0aGVuIGxvdy4KKyAgICB2bXJnaGIgIFx0MSwgXHowLCBcc3JjCisgICAgdm1yZ2hiICBcdDIsIFx6MCwgXHJlZgorICAgIHZzdWJzaHMgXHQxLCBcdDEsIFx0MgorICAgIHZzdW00c2hzIFxzdW0sIFx0MSwgXHN1bQorCisgICAgdm1yZ2xiICBcdDEsIFx6MCwgXHNyYworICAgIHZtcmdsYiAgXHQyLCBcejAsIFxyZWYKKyAgICB2c3Vic2hzIFx0MSwgXHQxLCBcdDIKKyAgICB2c3VtNHNocyBcc3VtLCBcdDEsIFxzdW0KKworICAgIDsjIE5vdyBjb21wdXRlIHNzZS4KKyAgICB2c3VidWJzIFx0MSwgXHNyYywgXHJlZgorICAgIHZzdWJ1YnMgXHQyLCBccmVmLCBcc3JjCisgICAgdm9yICAgICBcdDEsIFx0MSwgXHQyCisKKyAgICB2bXN1bXVibSBcc3NlLCBcdDEsIFx0MSwgXHNzZQorLmVuZG0KKworLm1hY3JvIHZhcmlhbmNlX2ZpbmFsIHN1bSwgc3NlLCB6MCwgRFMKKyAgICB2c3Vtc3dzIFxzdW0sIFxzdW0sIFx6MAorICAgIHZzdW1zd3MgXHNzZSwgXHNzZSwgXHowCisKKyAgICBzdHZ4ICAgIFxzdW0sIDAsIHIxCisgICAgbHd6ICAgICByMywgMTIocjEpCisKKyAgICBzdHZ4ICAgIFxzc2UsIDAsIHIxCisgICAgbHd6ICAgICByNCwgMTIocjEpCisKKyAgICBzdHcgICAgIHI0LCAwKHI5KSAgICAgICAgICAgOyMgc3NlCisKKyAgICBtdWxsdyAgIHIzLCByMywgcjMgICAgICAgICAgOyMgc3VtKnN1bQorICAgIHNybHdpICAgcjMsIHIzLCBcRFMgICAgICAgICA7IyAoc3VtKnN1bSkgPj4gOAorICAgIHN1YmYgICAgcjMsIHIzLCByNCAgICAgICAgICA7IyBzc2UgLSAoKHN1bSpzdW0pID4+IDgpCisuZW5kbQorCisubWFjcm8gY29tcHV0ZV9zdW1fc3NlXzE2IFYsIGluY3JlbWVudF9jb3VudGVyCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxNiwgcjcsIHI4LCBcaW5jcmVtZW50X2NvdW50ZXIKKyAgICBjb21wdXRlX3N1bV9zc2UgXFYsIHYxNiwgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjMKKy5lbmRtCisKKy5tYWNybyBsb2FkX2FuZF9hbGlnbl8xNiBWLCBSLCBQLCBpbmNyZW1lbnRfY291bnRlcgorICAgIGx2c2wgICAgdjE3LCAgMCwgXFIgICAgICAgICA7IyBwZXJtdXRhdGUgdmFsdWUgZm9yIGFsaWdubWVudAorCisgICAgOyMgaW5wdXQgdG8gZmlsdGVyIGlzIDIxIGJ5dGVzIHdpZGUsIG91dHB1dCBpcyAxNiBieXRlcy4KKyAgICA7IyAgaW5wdXQgd2lsbCBjYW4gc3BhbiB0aHJlZSB2ZWN0b3JzIGlmIG5vdCBhbGlnbmVkIGNvcnJlY3RseS4KKyAgICBsdnggICAgIHYyMSwgICAwLCBcUgorICAgIGx2eCAgICAgdjIyLCByMTAsIFxSCisKKy5pZiBcaW5jcmVtZW50X2NvdW50ZXIKKyAgICBhZGQgICAgIFxSLCBcUiwgXFAKKy5lbmRpZgorCisgICAgdnBlcm0gICBcViwgdjIxLCB2MjIsIHYxNworLmVuZG0KKworICAgIC5hbGlnbiAyCis7IyByMyB1bnNpZ25lZCBjaGFyICAqc3JjX3B0cgorOyMgcjQgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lCis7IyByNSBpbnQgIHhvZmZzZXQKKzsjIHI2IGludCAgeW9mZnNldAorOyMgcjcgdW5zaWduZWQgY2hhciAqZHN0X3B0cgorOyMgcjggaW50IGRzdF9waXhlbHNfcGVyX2xpbmUKKzsjIHI5IHVuc2lnbmVkIGludCAqc3NlCis7IworOyMgcjMgcmV0dXJuIHZhbHVlCit2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X3BwYzoKKyAgICBtZnNwciAgIHIxMSwgMjU2ICAgICAgICAgICAgOyMgZ2V0IG9sZCBWUlNBVkUKKyAgICBvcmlzICAgIHIxMiwgcjExLCAweGY4MzAKKyAgICBvcmkgICAgIHIxMiwgcjEyLCAweGZmZjgKKyAgICBtdHNwciAgIDI1NiwgcjEyICAgICAgICAgICAgOyMgc2V0IFZSU0FWRQorCisgICAgc3R3dSAgICByMSwtMzIocjEpICAgICAgICAgIDsjIGNyZWF0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKKworICAgIEhQcm9sb2cgc2Vjb25kX3Bhc3NfNHg0X3ByZV9jb3B5X2IKKworICAgIDsjIExvYWQgdXAgcGVybXV0YXRpb24gY29uc3RhbnRzCisgICAgbG9hZF9jIHYxMCwgYl8wMTIzX2IsIDAsIHIxMiwgcjAKKyAgICBsb2FkX2MgdjExLCBiXzQ1NjdfYiwgMCwgcjEyLCByMAorCisgICAgaGZpbHRlcl84IHYwLCB2MTAsIHYxMSwgMQorICAgIGhmaWx0ZXJfOCB2MSwgdjEwLCB2MTEsIDEKKyAgICBoZmlsdGVyXzggdjIsIHYxMCwgdjExLCAxCisgICAgaGZpbHRlcl84IHYzLCB2MTAsIHYxMSwgMQorCisgICAgOyMgRmluaXNoZWQgZmlsdGVyaW5nIG1haW4gaG9yaXpvbnRhbCBibG9jay4gIElmIHRoZXJlIGlzIG5vCisgICAgOyMgIHZlcnRpY2FsIGZpbHRlcmluZywganVtcCB0byBzdG9yaW5nIHRoZSBkYXRhLiAgT3RoZXJ3aXNlCisgICAgOyMgIGxvYWQgdXAgYW5kIGZpbHRlciB0aGUgYWRkaXRpb25hbCBsaW5lIHRoYXQgaXMgbmVlZGVkCisgICAgOyMgIGZvciB0aGUgdmVydGljYWwgZmlsdGVyLgorICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzR4NF9iCisKKyAgICBoZmlsdGVyXzggdjQsIHYxMCwgdjExLCAwCisKKyAgICBiICAgc2Vjb25kX3Bhc3NfNHg0X2IKKworc2Vjb25kX3Bhc3NfNHg0X3ByZV9jb3B5X2I6CisgICAgc2x3aSAgICByNiwgcjYsIDUgICAgICAgICAgIDsjIGluZGV4IGludG8gdmVydGljYWwgZmlsdGVyIGFycmF5CisKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MCwgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYyLCByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MywgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjQsIHIzLCByNCwgMAorCitzZWNvbmRfcGFzc180eDRfYjoKKyAgICB2c3BsdGlzaCB2MjAsIDgKKyAgICB2c3BsdGlzaCB2MTgsIDMKKyAgICB2c2xoICAgIHYxOCwgdjIwLCB2MTggICAgICAgOyMgMHgwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAKKworICAgIGxvYWRfdmZpbHRlciB2MjAsIHYyMQorCisgICAgdmZpbHRlcl8xNiB2MCwgIHYxCisgICAgdmZpbHRlcl8xNiB2MSwgIHYyCisgICAgdmZpbHRlcl8xNiB2MiwgIHYzCisgICAgdmZpbHRlcl8xNiB2MywgIHY0CisKK2NvbXB1dGVfc3VtX3NzZV80eDRfYjoKKyAgICB2c3BsdGlzaCB2MTgsIDAgICAgICAgICAgICAgOyMgc3VtCisgICAgdnNwbHRpc2ggdjE5LCAwICAgICAgICAgICAgIDsjIHNzZQorICAgIHZzcGx0aXNoIHYyMywgMCAgICAgICAgICAgICA7IyB1bnBhY2sKKyAgICBsaSAgICAgIHIxMCwgMTYKKworICAgIGxvYWRfYW5kX2FsaWduXzE2IHY0LCByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NSwgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjYsIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY3LCByNywgcjgsIDEKKworICAgIHZtcmdoYiAgdjAsIHYwLCB2MQorICAgIHZtcmdoYiAgdjEsIHYyLCB2MworCisgICAgdm1yZ2hiICB2MiwgdjQsIHY1CisgICAgdm1yZ2hiICB2MywgdjYsIHY3CisKKyAgICBsb2FkX2MgdjEwLCBiX2hpbG9fYiwgMCwgcjEyLCByMAorCisgICAgdnBlcm0gICB2MCwgdjAsIHYxLCB2MTAKKyAgICB2cGVybSAgIHYxLCB2MiwgdjMsIHYxMAorCisgICAgY29tcHV0ZV9zdW1fc3NlIHYwLCB2MSwgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjMKKworICAgIHZhcmlhbmNlX2ZpbmFsIHYxOCwgdjE5LCB2MjMsIDQKKworICAgIGFkZGkgICAgcjEsIHIxLCAzMiAgICAgICAgICA7IyByZWNvdmVyIHN0YWNrCisgICAgbXRzcHIgICAyNTYsIHIxMSAgICAgICAgICAgIDsjIHJlc2V0IG9sZCBWUlNBVkUKKworICAgIGJscgorCisgICAgLmFsaWduIDIKKzsjIHIzIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyCis7IyByNCBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUKKzsjIHI1IGludCAgeG9mZnNldAorOyMgcjYgaW50ICB5b2Zmc2V0Cis7IyByNyB1bnNpZ25lZCBjaGFyICpkc3RfcHRyCis7IyByOCBpbnQgZHN0X3BpeGVsc19wZXJfbGluZQorOyMgcjkgdW5zaWduZWQgaW50ICpzc2UKKzsjCis7IyByMyByZXR1cm4gdmFsdWUKK3ZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfcHBjOgorICAgIG1mc3ByICAgcjExLCAyNTYgICAgICAgICAgICA7IyBnZXQgb2xkIFZSU0FWRQorICAgIG9yaXMgICAgcjEyLCByMTEsIDB4ZmZmMAorICAgIG9yaSAgICAgcjEyLCByMTIsIDB4ZmZmZgorICAgIG10c3ByICAgMjU2LCByMTIgICAgICAgICAgICA7IyBzZXQgVlJTQVZFCisKKyAgICBzdHd1ICAgIHIxLC0zMihyMSkgICAgICAgICAgOyMgY3JlYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworCisgICAgSFByb2xvZyBzZWNvbmRfcGFzc184eDhfcHJlX2NvcHlfYgorCisgICAgOyMgTG9hZCB1cCBwZXJtdXRhdGlvbiBjb25zdGFudHMKKyAgICBsb2FkX2MgdjEwLCBiXzAxMjNfYiwgMCwgcjEyLCByMAorICAgIGxvYWRfYyB2MTEsIGJfNDU2N19iLCAwLCByMTIsIHIwCisKKyAgICBoZmlsdGVyXzggdjAsIHYxMCwgdjExLCAxCisgICAgaGZpbHRlcl84IHYxLCB2MTAsIHYxMSwgMQorICAgIGhmaWx0ZXJfOCB2MiwgdjEwLCB2MTEsIDEKKyAgICBoZmlsdGVyXzggdjMsIHYxMCwgdjExLCAxCisgICAgaGZpbHRlcl84IHY0LCB2MTAsIHYxMSwgMQorICAgIGhmaWx0ZXJfOCB2NSwgdjEwLCB2MTEsIDEKKyAgICBoZmlsdGVyXzggdjYsIHYxMCwgdjExLCAxCisgICAgaGZpbHRlcl84IHY3LCB2MTAsIHYxMSwgMQorCisgICAgOyMgRmluaXNoZWQgZmlsdGVyaW5nIG1haW4gaG9yaXpvbnRhbCBibG9jay4gIElmIHRoZXJlIGlzIG5vCisgICAgOyMgIHZlcnRpY2FsIGZpbHRlcmluZywganVtcCB0byBzdG9yaW5nIHRoZSBkYXRhLiAgT3RoZXJ3aXNlCisgICAgOyMgIGxvYWQgdXAgYW5kIGZpbHRlciB0aGUgYWRkaXRpb25hbCBsaW5lIHRoYXQgaXMgbmVlZGVkCisgICAgOyMgIGZvciB0aGUgdmVydGljYWwgZmlsdGVyLgorICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzh4OF9iCisKKyAgICBoZmlsdGVyXzggdjgsIHYxMCwgdjExLCAwCisKKyAgICBiICAgc2Vjb25kX3Bhc3NfOHg4X2IKKworc2Vjb25kX3Bhc3NfOHg4X3ByZV9jb3B5X2I6CisgICAgc2x3aS4gICByNiwgcjYsIDUgICAgICAgICAgIDsjIGluZGV4IGludG8gdmVydGljYWwgZmlsdGVyIGFycmF5CisKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MCwgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYyLCByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MywgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjQsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY1LCByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NiwgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjcsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY4LCByMywgcjQsIDAKKworICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzh4OF9iCisKK3NlY29uZF9wYXNzXzh4OF9iOgorICAgIHZzcGx0aXNoIHYyMCwgOAorICAgIHZzcGx0aXNoIHYxOCwgMworICAgIHZzbGggICAgdjE4LCB2MjAsIHYxOCAgIDsjIDB4MDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwCisKKyAgICBsb2FkX3ZmaWx0ZXIgdjIwLCB2MjEKKworICAgIHZmaWx0ZXJfMTYgdjAsIHYxCisgICAgdmZpbHRlcl8xNiB2MSwgdjIKKyAgICB2ZmlsdGVyXzE2IHYyLCB2MworICAgIHZmaWx0ZXJfMTYgdjMsIHY0CisgICAgdmZpbHRlcl8xNiB2NCwgdjUKKyAgICB2ZmlsdGVyXzE2IHY1LCB2NgorICAgIHZmaWx0ZXJfMTYgdjYsIHY3CisgICAgdmZpbHRlcl8xNiB2NywgdjgKKworY29tcHV0ZV9zdW1fc3NlXzh4OF9iOgorICAgIHZzcGx0aXNoIHYxOCwgMCAgICAgICAgICAgICA7IyBzdW0KKyAgICB2c3BsdGlzaCB2MTksIDAgICAgICAgICAgICAgOyMgc3NlCisgICAgdnNwbHRpc2ggdjIzLCAwICAgICAgICAgICAgIDsjIHVucGFjaworICAgIGxpICAgICAgcjEwLCAxNgorCisgICAgdm1yZ2hiICB2MCwgdjAsIHYxCisgICAgdm1yZ2hiICB2MSwgdjIsIHYzCisgICAgdm1yZ2hiICB2MiwgdjQsIHY1CisgICAgdm1yZ2hiICB2MywgdjYsIHY3CisKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NCwgIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY1LCAgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjYsICByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NywgIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY4LCAgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjksICByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTAsIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMSwgcjcsIHI4LCAwCisKKyAgICB2bXJnaGIgIHY0LCB2NCwgIHY1CisgICAgdm1yZ2hiICB2NSwgdjYsICB2NworICAgIHZtcmdoYiAgdjYsIHY4LCAgdjkKKyAgICB2bXJnaGIgIHY3LCB2MTAsIHYxMQorCisgICAgY29tcHV0ZV9zdW1fc3NlIHYwLCB2NCwgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjMKKyAgICBjb21wdXRlX3N1bV9zc2UgdjEsIHY1LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2MiwgdjYsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCisgICAgY29tcHV0ZV9zdW1fc3NlIHYzLCB2NywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjMKKworICAgIHZhcmlhbmNlX2ZpbmFsIHYxOCwgdjE5LCB2MjMsIDYKKworICAgIGFkZGkgICAgcjEsIHIxLCAzMiAgICAgICAgICA7IyByZWNvdmVyIHN0YWNrCisgICAgbXRzcHIgICAyNTYsIHIxMSAgICAgICAgICAgIDsjIHJlc2V0IG9sZCBWUlNBVkUKKyAgICBibHIKKworICAgIC5hbGlnbiAyCis7IyByMyB1bnNpZ25lZCBjaGFyICAqc3JjX3B0cgorOyMgcjQgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lCis7IyByNSBpbnQgIHhvZmZzZXQKKzsjIHI2IGludCAgeW9mZnNldAorOyMgcjcgdW5zaWduZWQgY2hhciAqZHN0X3B0cgorOyMgcjggaW50IGRzdF9waXhlbHNfcGVyX2xpbmUKKzsjIHI5IHVuc2lnbmVkIGludCAqc3NlCis7IworOyMgcjMgcmV0dXJuIHZhbHVlCit2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9wcGM6CisgICAgbWZzcHIgICByMTEsIDI1NiAgICAgICAgICAgIDsjIGdldCBvbGQgVlJTQVZFCisgICAgb3JpcyAgICByMTIsIHIxMSwgMHhmZmZmCisgICAgb3JpICAgICByMTIsIHIxMiwgMHhmZmZjCisgICAgbXRzcHIgICAyNTYsIHIxMiAgICAgICAgICAgIDsjIHNldCBWUlNBVkUKKworICAgIHN0d3UgICAgcjEsLTMyKHIxKSAgICAgICAgICA7IyBjcmVhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCisKKyAgICBIUHJvbG9nIHNlY29uZF9wYXNzXzh4MTZfcHJlX2NvcHlfYgorCisgICAgOyMgTG9hZCB1cCBwZXJtdXRhdGlvbiBjb25zdGFudHMKKyAgICBsb2FkX2MgdjI5LCBiXzAxMjNfYiwgMCwgcjEyLCByMAorICAgIGxvYWRfYyB2MzAsIGJfNDU2N19iLCAwLCByMTIsIHIwCisKKyAgICBoZmlsdGVyXzggdjAsICB2MjksIHYzMCwgMQorICAgIGhmaWx0ZXJfOCB2MSwgIHYyOSwgdjMwLCAxCisgICAgaGZpbHRlcl84IHYyLCAgdjI5LCB2MzAsIDEKKyAgICBoZmlsdGVyXzggdjMsICB2MjksIHYzMCwgMQorICAgIGhmaWx0ZXJfOCB2NCwgIHYyOSwgdjMwLCAxCisgICAgaGZpbHRlcl84IHY1LCAgdjI5LCB2MzAsIDEKKyAgICBoZmlsdGVyXzggdjYsICB2MjksIHYzMCwgMQorICAgIGhmaWx0ZXJfOCB2NywgIHYyOSwgdjMwLCAxCisgICAgaGZpbHRlcl84IHY4LCAgdjI5LCB2MzAsIDEKKyAgICBoZmlsdGVyXzggdjksICB2MjksIHYzMCwgMQorICAgIGhmaWx0ZXJfOCB2MTAsIHYyOSwgdjMwLCAxCisgICAgaGZpbHRlcl84IHYxMSwgdjI5LCB2MzAsIDEKKyAgICBoZmlsdGVyXzggdjEyLCB2MjksIHYzMCwgMQorICAgIGhmaWx0ZXJfOCB2MTMsIHYyOSwgdjMwLCAxCisgICAgaGZpbHRlcl84IHYxNCwgdjI5LCB2MzAsIDEKKyAgICBoZmlsdGVyXzggdjE1LCB2MjksIHYzMCwgMQorCisgICAgOyMgRmluaXNoZWQgZmlsdGVyaW5nIG1haW4gaG9yaXpvbnRhbCBibG9jay4gIElmIHRoZXJlIGlzIG5vCisgICAgOyMgIHZlcnRpY2FsIGZpbHRlcmluZywganVtcCB0byBzdG9yaW5nIHRoZSBkYXRhLiAgT3RoZXJ3aXNlCisgICAgOyMgIGxvYWQgdXAgYW5kIGZpbHRlciB0aGUgYWRkaXRpb25hbCBsaW5lIHRoYXQgaXMgbmVlZGVkCisgICAgOyMgIGZvciB0aGUgdmVydGljYWwgZmlsdGVyLgorICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzh4MTZfYgorCisgICAgaGZpbHRlcl84IHYxNiwgdjI5LCB2MzAsIDAKKworICAgIGIgICBzZWNvbmRfcGFzc184eDE2X2IKKworc2Vjb25kX3Bhc3NfOHgxNl9wcmVfY29weV9iOgorICAgIHNsd2kuICAgcjYsIHI2LCA1ICAgICAgICAgICA7IyBpbmRleCBpbnRvIHZlcnRpY2FsIGZpbHRlciBhcnJheQorCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjAsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MSwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYyLCAgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjMsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NCwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY1LCAgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjYsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NywgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHY4LCAgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjksICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTAsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMSwgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEyLCByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTMsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxNCwgcjMsIHI0LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjE1LCByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTYsIHIzLCByNCwgMAorCisgICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfOHgxNl9iCisKK3NlY29uZF9wYXNzXzh4MTZfYjoKKyAgICB2c3BsdGlzaCB2MjAsIDgKKyAgICB2c3BsdGlzaCB2MTgsIDMKKyAgICB2c2xoICAgIHYxOCwgdjIwLCB2MTggICA7IyAweDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MAorCisgICAgbG9hZF92ZmlsdGVyIHYyMCwgdjIxCisKKyAgICB2ZmlsdGVyXzE2IHYwLCAgdjEKKyAgICB2ZmlsdGVyXzE2IHYxLCAgdjIKKyAgICB2ZmlsdGVyXzE2IHYyLCAgdjMKKyAgICB2ZmlsdGVyXzE2IHYzLCAgdjQKKyAgICB2ZmlsdGVyXzE2IHY0LCAgdjUKKyAgICB2ZmlsdGVyXzE2IHY1LCAgdjYKKyAgICB2ZmlsdGVyXzE2IHY2LCAgdjcKKyAgICB2ZmlsdGVyXzE2IHY3LCAgdjgKKyAgICB2ZmlsdGVyXzE2IHY4LCAgdjkKKyAgICB2ZmlsdGVyXzE2IHY5LCAgdjEwCisgICAgdmZpbHRlcl8xNiB2MTAsIHYxMQorICAgIHZmaWx0ZXJfMTYgdjExLCB2MTIKKyAgICB2ZmlsdGVyXzE2IHYxMiwgdjEzCisgICAgdmZpbHRlcl8xNiB2MTMsIHYxNAorICAgIHZmaWx0ZXJfMTYgdjE0LCB2MTUKKyAgICB2ZmlsdGVyXzE2IHYxNSwgdjE2CisKK2NvbXB1dGVfc3VtX3NzZV84eDE2X2I6CisgICAgdnNwbHRpc2ggdjE4LCAwICAgICAgICAgICAgIDsjIHN1bQorICAgIHZzcGx0aXNoIHYxOSwgMCAgICAgICAgICAgICA7IyBzc2UKKyAgICB2c3BsdGlzaCB2MjMsIDAgICAgICAgICAgICAgOyMgdW5wYWNrCisgICAgbGkgICAgICByMTAsIDE2CisKKyAgICB2bXJnaGIgIHYwLCB2MCwgIHYxCisgICAgdm1yZ2hiICB2MSwgdjIsICB2MworICAgIHZtcmdoYiAgdjIsIHY0LCAgdjUKKyAgICB2bXJnaGIgIHYzLCB2NiwgIHY3CisgICAgdm1yZ2hiICB2NCwgdjgsICB2OQorICAgIHZtcmdoYiAgdjUsIHYxMCwgdjExCisgICAgdm1yZ2hiICB2NiwgdjEyLCB2MTMKKyAgICB2bXJnaGIgIHY3LCB2MTQsIHYxNQorCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjgsICByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2OSwgIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMCwgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjExLCByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTIsIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMywgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjE0LCByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTUsIHI3LCByOCwgMQorCisgICAgdm1yZ2hiICB2OCwgIHY4LCAgdjkKKyAgICB2bXJnaGIgIHY5LCAgdjEwLCB2MTEKKyAgICB2bXJnaGIgIHYxMCwgdjEyLCB2MTMKKyAgICB2bXJnaGIgIHYxMSwgdjE0LCB2MTUKKworICAgIGNvbXB1dGVfc3VtX3NzZSB2MCwgdjgsICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2MSwgdjksICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2MiwgdjEwLCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2MywgdjExLCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjgsICByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2OSwgIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMCwgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjExLCByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTIsIHI3LCByOCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMywgcjcsIHI4LCAxCisgICAgbG9hZF9hbmRfYWxpZ25fMTYgdjE0LCByNywgcjgsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTUsIHI3LCByOCwgMAorCisgICAgdm1yZ2hiICB2OCwgIHY4LCAgdjkKKyAgICB2bXJnaGIgIHY5LCAgdjEwLCB2MTEKKyAgICB2bXJnaGIgIHYxMCwgdjEyLCB2MTMKKyAgICB2bXJnaGIgIHYxMSwgdjE0LCB2MTUKKworICAgIGNvbXB1dGVfc3VtX3NzZSB2NCwgdjgsICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2NSwgdjksICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2NiwgdjEwLCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworICAgIGNvbXB1dGVfc3VtX3NzZSB2NywgdjExLCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMworCisgICAgdmFyaWFuY2VfZmluYWwgdjE4LCB2MTksIHYyMywgNworCisgICAgYWRkaSAgICByMSwgcjEsIDMyICAgICAgICAgIDsjIHJlY292ZXIgc3RhY2sKKyAgICBtdHNwciAgIDI1NiwgcjExICAgICAgICAgICAgOyMgcmVzZXQgb2xkIFZSU0FWRQorICAgIGJscgorCis7IyBGaWx0ZXJzIGEgaG9yaXpvbnRhbCBsaW5lCis7IyBleHBlY3RzOgorOyMgIHIzICBzcmNfcHRyCis7IyAgcjQgIHBpdGNoCis7IyAgcjEwIDE2Cis7IyAgcjEyIDMyCis7IyAgdjE3IHBlcm0gaW50cHV0Cis7IyAgdjE4IHJvdW5kaW5nCis7IyAgdjE5IHNoaWZ0Cis7IyAgdjIwIGZpbHRlciB0YXBzCis7IyAgdjIxIHRtcAorOyMgIHYyMiB0bXAKKzsjICB2MjMgdG1wCis7IyAgdjI0IHRtcAorOyMgIHYyNSB0bXAKKzsjICB2MjYgdG1wCis7IyAgdjI3IHRtcAorOyMgIHYyOCBwZXJtIG91dHB1dAorOyMKKy5tYWNybyBoZmlsdGVyXzE2IFYsIGluY3JlbWVudF9jb3VudGVyCisKKyAgICBsdnNsICAgIHYxNywgIDAsIHIzICAgICAgICAgOyMgcGVybXV0YXRlIHZhbHVlIGZvciBhbGlnbm1lbnQKKworICAgIDsjIGlucHV0IHRvIGZpbHRlciBpcyAyMSBieXRlcyB3aWRlLCBvdXRwdXQgaXMgMTYgYnl0ZXMuCisgICAgOyMgIGlucHV0IHdpbGwgY2FuIHNwYW4gdGhyZWUgdmVjdG9ycyBpZiBub3QgYWxpZ25lZCBjb3JyZWN0bHkuCisgICAgbHZ4ICAgICB2MjEsICAgMCwgcjMKKyAgICBsdnggICAgIHYyMiwgcjEwLCByMworICAgIGx2eCAgICAgdjIzLCByMTIsIHIzCisKKy5pZiBcaW5jcmVtZW50X2NvdW50ZXIKKyAgICBhZGQgICAgIHIzLCByMywgcjQKKy5lbmRpZgorICAgIHZwZXJtICAgdjIxLCB2MjEsIHYyMiwgdjE3CisgICAgdnBlcm0gICB2MjIsIHYyMiwgdjIzLCB2MTcgIDsjIHY4IHY5ID0gMjEgaW5wdXQgcGl4ZWxzIGxlZnQtanVzdGlmaWVkCisKKyAgICA7IyBzZXQgMAorICAgIHZtc3VtbWJtIHYyNCwgdjIwLCB2MjEsIHYxOCA7IyB0YXBzIHRpbWVzIGVsZW1lbnRzCisKKyAgICA7IyBzZXQgMQorICAgIHZzbGRvaSAgdjIzLCB2MjEsIHYyMiwgMQorICAgIHZtc3VtbWJtIHYyNSwgdjIwLCB2MjMsIHYxOAorCisgICAgOyMgc2V0IDIKKyAgICB2c2xkb2kgIHYyMywgdjIxLCB2MjIsIDIKKyAgICB2bXN1bW1ibSB2MjYsIHYyMCwgdjIzLCB2MTgKKworICAgIDsjIHNldCAzCisgICAgdnNsZG9pICB2MjMsIHYyMSwgdjIyLCAzCisgICAgdm1zdW1tYm0gdjI3LCB2MjAsIHYyMywgdjE4CisKKyAgICB2cGtzd3VzIHYyNCwgdjI0LCB2MjUgICAgICAgOyMgdjI0ID0gMCA0IDggQyAxIDUgOSBEICgxNi1iaXQpCisgICAgdnBrc3d1cyB2MjUsIHYyNiwgdjI3ICAgICAgIDsjIHYyNSA9IDIgNiBBIEUgMyA3IEIgRgorCisgICAgdnNyaCAgICB2MjQsIHYyNCwgdjE5ICAgICAgIDsjIGRpdmlkZSB2MCwgdjEgYnkgMTI4CisgICAgdnNyaCAgICB2MjUsIHYyNSwgdjE5CisKKyAgICB2cGt1aHVzIFxWLCB2MjQsIHYyNSAgICAgICAgOyMgXFYgPSBzY3JhbWJsZWQgOC1iaXQgcmVzdWx0CisgICAgdnBlcm0gICBcViwgXFYsIHYwLCB2MjggICAgIDsjIFxWID0gY29ycmVjdGx5LW9yZGVyZWQgcmVzdWx0CisuZW5kbQorCisgICAgLmFsaWduIDIKKzsjIHIzIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyCis7IyByNCBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUKKzsjIHI1IGludCAgeG9mZnNldAorOyMgcjYgaW50ICB5b2Zmc2V0Cis7IyByNyB1bnNpZ25lZCBjaGFyICpkc3RfcHRyCis7IyByOCBpbnQgZHN0X3BpeGVsc19wZXJfbGluZQorOyMgcjkgdW5zaWduZWQgaW50ICpzc2UKKzsjCis7IyByMyByZXR1cm4gdmFsdWUKK3ZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3BwYzoKKyAgICBtZnNwciAgIHIxMSwgMjU2ICAgICAgICAgICAgOyMgZ2V0IG9sZCBWUlNBVkUKKyAgICBvcmlzICAgIHIxMiwgcjExLCAweGZmZmYKKyAgICBvcmkgICAgIHIxMiwgcjEyLCAweGZmZjgKKyAgICBtdHNwciAgIDI1NiwgcjEyICAgICAgICAgICAgOyMgc2V0IFZSU0FWRQorCisgICAgc3R3dSAgICByMSwgLTMyKHIxKSAgICAgICAgIDsjIGNyZWF0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKKworICAgIEhQcm9sb2cgc2Vjb25kX3Bhc3NfMTZ4OF9wcmVfY29weV9iCisKKyAgICBoZmlsdGVyXzE2IHYwLCAxCisgICAgaGZpbHRlcl8xNiB2MSwgMQorICAgIGhmaWx0ZXJfMTYgdjIsIDEKKyAgICBoZmlsdGVyXzE2IHYzLCAxCisgICAgaGZpbHRlcl8xNiB2NCwgMQorICAgIGhmaWx0ZXJfMTYgdjUsIDEKKyAgICBoZmlsdGVyXzE2IHY2LCAxCisgICAgaGZpbHRlcl8xNiB2NywgMQorCisgICAgOyMgRmluaXNoZWQgZmlsdGVyaW5nIG1haW4gaG9yaXpvbnRhbCBibG9jay4gIElmIHRoZXJlIGlzIG5vCisgICAgOyMgIHZlcnRpY2FsIGZpbHRlcmluZywganVtcCB0byBzdG9yaW5nIHRoZSBkYXRhLiAgT3RoZXJ3aXNlCisgICAgOyMgIGxvYWQgdXAgYW5kIGZpbHRlciB0aGUgYWRkaXRpb25hbCBsaW5lIHRoYXQgaXMgbmVlZGVkCisgICAgOyMgIGZvciB0aGUgdmVydGljYWwgZmlsdGVyLgorICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzE2eDhfYgorCisgICAgaGZpbHRlcl8xNiB2OCwgMAorCisgICAgYiAgIHNlY29uZF9wYXNzXzE2eDhfYgorCitzZWNvbmRfcGFzc18xNng4X3ByZV9jb3B5X2I6CisgICAgc2x3aS4gICByNiwgcjYsIDUgICAgICAgICAgIDsjIGluZGV4IGludG8gdmVydGljYWwgZmlsdGVyIGFycmF5CisKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjAsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjEsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjIsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjMsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjQsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjUsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjYsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjcsICByMywgcjQsIDEKKyAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjgsICByMywgcjQsIDEKKworICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzE2eDhfYgorCitzZWNvbmRfcGFzc18xNng4X2I6CisgICAgdnNwbHRpc2ggdjIwLCA4CisgICAgdnNwbHRpc2ggdjE4LCAzCisgICAgdnNsaCAgICB2MTgsIHYyMCwgdjE4ICAgOyMgMHgwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAKKworICAgIGxvYWRfdmZpbHRlciB2MjAsIHYyMQorCisgICAgdmZpbHRlcl8xNiB2MCwgIHYxCisgICAgdmZpbHRlcl8xNiB2MSwgIHYyCisgICAgdmZpbHRlcl8xNiB2MiwgIHYzCisgICAgdmZpbHRlcl8xNiB2MywgIHY0CisgICAgdmZpbHRlcl8xNiB2NCwgIHY1CisgICAgdmZpbHRlcl8xNiB2NSwgIHY2CisgICAgdmZpbHRlcl8xNiB2NiwgIHY3CisgICAgdmZpbHRlcl8xNiB2NywgIHY4CisKK2NvbXB1dGVfc3VtX3NzZV8xNng4X2I6CisgICAgdnNwbHRpc2ggdjE4LCAwICAgICAgICAgICAgIDsjIHN1bQorICAgIHZzcGx0aXNoIHYxOSwgMCAgICAgICAgICAgICA7IyBzc2UKKyAgICB2c3BsdGlzaCB2MjMsIDAgICAgICAgICAgICAgOyMgdW5wYWNrCisgICAgbGkgICAgICByMTAsIDE2CisKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjAsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjEsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjIsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjMsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjQsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjUsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjYsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjcsIDAKKworICAgIHZhcmlhbmNlX2ZpbmFsIHYxOCwgdjE5LCB2MjMsIDcKKworICAgIGFkZGkgICAgcjEsIHIxLCAzMiAgICAgICAgICA7IyByZWNvdmVyIHN0YWNrCisKKyAgICBtdHNwciAgIDI1NiwgcjExICAgICAgICAgICAgOyMgcmVzZXQgb2xkIFZSU0FWRQorCisgICAgYmxyCisKKyAgICAuYWxpZ24gMgorOyMgcjMgdW5zaWduZWQgY2hhciAgKnNyY19wdHIKKzsjIHI0IGludCAgc3JjX3BpeGVsc19wZXJfbGluZQorOyMgcjUgaW50ICB4b2Zmc2V0Cis7IyByNiBpbnQgIHlvZmZzZXQKKzsjIHI3IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIKKzsjIHI4IGludCBkc3RfcGl4ZWxzX3Blcl9saW5lCis7IyByOSB1bnNpZ25lZCBpbnQgKnNzZQorOyMKKzsjIHIzIHJldHVybiB2YWx1ZQordnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3BwYzoKKyAgICBtZnNwciAgIHIxMSwgMjU2ICAgICAgICAgICAgOyMgZ2V0IG9sZCBWUlNBVkUKKyAgICBvcmlzICAgIHIxMiwgcjExLCAweGZmZmYKKyAgICBvcmkgICAgIHIxMiwgcjEyLCAweGZmZjgKKyAgICBtdHNwciAgIDI1NiwgcjEyICAgICAgICAgICAgOyMgc2V0IFZSU0FWRQorCisgICAgc3R3dSAgICByMSwgLTMyKHIxKSAgICAgICAgIDsjIGNyZWF0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKKworICAgIEhQcm9sb2cgc2Vjb25kX3Bhc3NfMTZ4MTZfcHJlX2NvcHlfYgorCisgICAgaGZpbHRlcl8xNiB2MCwgIDEKKyAgICBoZmlsdGVyXzE2IHYxLCAgMQorICAgIGhmaWx0ZXJfMTYgdjIsICAxCisgICAgaGZpbHRlcl8xNiB2MywgIDEKKyAgICBoZmlsdGVyXzE2IHY0LCAgMQorICAgIGhmaWx0ZXJfMTYgdjUsICAxCisgICAgaGZpbHRlcl8xNiB2NiwgIDEKKyAgICBoZmlsdGVyXzE2IHY3LCAgMQorICAgIGhmaWx0ZXJfMTYgdjgsICAxCisgICAgaGZpbHRlcl8xNiB2OSwgIDEKKyAgICBoZmlsdGVyXzE2IHYxMCwgMQorICAgIGhmaWx0ZXJfMTYgdjExLCAxCisgICAgaGZpbHRlcl8xNiB2MTIsIDEKKyAgICBoZmlsdGVyXzE2IHYxMywgMQorICAgIGhmaWx0ZXJfMTYgdjE0LCAxCisgICAgaGZpbHRlcl8xNiB2MTUsIDEKKworICAgIDsjIEZpbmlzaGVkIGZpbHRlcmluZyBtYWluIGhvcml6b250YWwgYmxvY2suICBJZiB0aGVyZSBpcyBubworICAgIDsjICB2ZXJ0aWNhbCBmaWx0ZXJpbmcsIGp1bXAgdG8gc3RvcmluZyB0aGUgZGF0YS4gIE90aGVyd2lzZQorICAgIDsjICBsb2FkIHVwIGFuZCBmaWx0ZXIgdGhlIGFkZGl0aW9uYWwgbGluZSB0aGF0IGlzIG5lZWRlZAorICAgIDsjICBmb3IgdGhlIHZlcnRpY2FsIGZpbHRlci4KKyAgICBiZXEgICAgIGNvbXB1dGVfc3VtX3NzZV8xNngxNl9iCisKKyAgICBoZmlsdGVyXzE2IHYxNiwgMAorCisgICAgYiAgIHNlY29uZF9wYXNzXzE2eDE2X2IKKworc2Vjb25kX3Bhc3NfMTZ4MTZfcHJlX2NvcHlfYjoKKyAgICBzbHdpLiAgIHI2LCByNiwgNSAgICAgICAgICAgOyMgaW5kZXggaW50byB2ZXJ0aWNhbCBmaWx0ZXIgYXJyYXkKKworICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MCwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MSwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MiwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MywgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NCwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NSwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NiwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NywgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2OCwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2OSwgIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTAsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTEsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTIsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTMsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTQsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTUsIHIzLCByNCwgMQorICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MTYsIHIzLCByNCwgMAorCisgICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfMTZ4MTZfYgorCitzZWNvbmRfcGFzc18xNngxNl9iOgorICAgIHZzcGx0aXNoIHYyMCwgOAorICAgIHZzcGx0aXNoIHYxOCwgMworICAgIHZzbGggICAgdjE4LCB2MjAsIHYxOCAgIDsjIDB4MDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwCisKKyAgICBsb2FkX3ZmaWx0ZXIgdjIwLCB2MjEKKworICAgIHZmaWx0ZXJfMTYgdjAsICB2MQorICAgIHZmaWx0ZXJfMTYgdjEsICB2MgorICAgIHZmaWx0ZXJfMTYgdjIsICB2MworICAgIHZmaWx0ZXJfMTYgdjMsICB2NAorICAgIHZmaWx0ZXJfMTYgdjQsICB2NQorICAgIHZmaWx0ZXJfMTYgdjUsICB2NgorICAgIHZmaWx0ZXJfMTYgdjYsICB2NworICAgIHZmaWx0ZXJfMTYgdjcsICB2OAorICAgIHZmaWx0ZXJfMTYgdjgsICB2OQorICAgIHZmaWx0ZXJfMTYgdjksICB2MTAKKyAgICB2ZmlsdGVyXzE2IHYxMCwgdjExCisgICAgdmZpbHRlcl8xNiB2MTEsIHYxMgorICAgIHZmaWx0ZXJfMTYgdjEyLCB2MTMKKyAgICB2ZmlsdGVyXzE2IHYxMywgdjE0CisgICAgdmZpbHRlcl8xNiB2MTQsIHYxNQorICAgIHZmaWx0ZXJfMTYgdjE1LCB2MTYKKworY29tcHV0ZV9zdW1fc3NlXzE2eDE2X2I6CisgICAgdnNwbHRpc2ggdjE4LCAwICAgICAgICAgICAgIDsjIHN1bQorICAgIHZzcGx0aXNoIHYxOSwgMCAgICAgICAgICAgICA7IyBzc2UKKyAgICB2c3BsdGlzaCB2MjMsIDAgICAgICAgICAgICAgOyMgdW5wYWNrCisgICAgbGkgICAgICByMTAsIDE2CisKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjAsICAxCisgICAgY29tcHV0ZV9zdW1fc3NlXzE2IHYxLCAgMQorICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MiwgIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjMsICAxCisgICAgY29tcHV0ZV9zdW1fc3NlXzE2IHY0LCAgMQorICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2NSwgIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjYsICAxCisgICAgY29tcHV0ZV9zdW1fc3NlXzE2IHY3LCAgMQorICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2OCwgIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjksICAxCisgICAgY29tcHV0ZV9zdW1fc3NlXzE2IHYxMCwgMQorICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MTEsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjEyLCAxCisgICAgY29tcHV0ZV9zdW1fc3NlXzE2IHYxMywgMQorICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MTQsIDEKKyAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjE1LCAwCisKKyAgICB2YXJpYW5jZV9maW5hbCB2MTgsIHYxOSwgdjIzLCA4CisKKyAgICBhZGRpICAgIHIxLCByMSwgMzIgICAgICAgICAgOyMgcmVjb3ZlciBzdGFjaworCisgICAgbXRzcHIgICAyNTYsIHIxMSAgICAgICAgICAgIDsjIHJlc2V0IG9sZCBWUlNBVkUKKworICAgIGJscgorCisgICAgLmRhdGEKKworICAgIC5hbGlnbiA0CitoZmlsdGVyX2I6CisgICAgLmJ5dGUgICAxMjgsICAwLCAgMCwgIDAsMTI4LCAgMCwgIDAsICAwLDEyOCwgIDAsICAwLCAgMCwxMjgsICAwLCAgMCwgIDAKKyAgICAuYnl0ZSAgIDExMiwgMTYsICAwLCAgMCwxMTIsIDE2LCAgMCwgIDAsMTEyLCAxNiwgIDAsICAwLDExMiwgMTYsICAwLCAgMAorICAgIC5ieXRlICAgIDk2LCAzMiwgIDAsICAwLCA5NiwgMzIsICAwLCAgMCwgOTYsIDMyLCAgMCwgIDAsIDk2LCAzMiwgIDAsICAwCisgICAgLmJ5dGUgICAgODAsIDQ4LCAgMCwgIDAsIDgwLCA0OCwgIDAsICAwLCA4MCwgNDgsICAwLCAgMCwgODAsIDQ4LCAgMCwgIDAKKyAgICAuYnl0ZSAgICA2NCwgNjQsICAwLCAgMCwgNjQsIDY0LCAgMCwgIDAsIDY0LCA2NCwgIDAsICAwLCA2NCwgNjQsICAwLCAgMAorICAgIC5ieXRlICAgIDQ4LCA4MCwgIDAsICAwLCA0OCwgODAsICAwLCAgMCwgNDgsIDgwLCAgMCwgIDAsIDQ4LCA4MCwgIDAsICAwCisgICAgLmJ5dGUgICAgMzIsIDk2LCAgMCwgIDAsIDMyLCA5NiwgIDAsICAwLCAzMiwgOTYsICAwLCAgMCwgMzIsIDk2LCAgMCwgIDAKKyAgICAuYnl0ZSAgICAxNiwxMTIsICAwLCAgMCwgMTYsMTEyLCAgMCwgIDAsIDE2LDExMiwgIDAsICAwLCAxNiwxMTIsICAwLCAgMAorCisgICAgLmFsaWduIDQKK3ZmaWx0ZXJfYjoKKyAgICAuYnl0ZSAgIDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOAorICAgIC5ieXRlICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgLmJ5dGUgICAxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIKKyAgICAuYnl0ZSAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgIC5ieXRlICAgIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2CisgICAgLmJ5dGUgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIKKyAgICAuYnl0ZSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MAorICAgIC5ieXRlICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4CisgICAgLmJ5dGUgICAgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQKKyAgICAuYnl0ZSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NAorICAgIC5ieXRlICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4CisgICAgLmJ5dGUgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAKKyAgICAuYnl0ZSAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMgorICAgIC5ieXRlICAgIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2CisgICAgLmJ5dGUgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyAgICAuYnl0ZSAgIDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMgorCisgICAgLmFsaWduIDQKK2JfaHBlcm1fYjoKKyAgICAuYnl0ZSAgICAgMCwgIDQsICA4LCAxMiwgIDEsICA1LCAgOSwgMTMsICAyLCAgNiwgMTAsIDE0LCAgMywgIDcsIDExLCAxNQorCisgICAgLmFsaWduIDQKK2JfMDEyM19iOgorICAgIC5ieXRlICAgICAwLCAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgNCwgIDIsICAzLCAgNCwgIDUsICAzLCAgNCwgIDUsICA2CisKKyAgICAuYWxpZ24gNAorYl80NTY3X2I6CisgICAgLmJ5dGUgICAgIDQsICA1LCAgNiwgIDcsICA1LCAgNiwgIDcsICA4LCAgNiwgIDcsICA4LCAgOSwgIDcsICA4LCAgOSwgMTAKKworYl9oaWxvX2I6CisgICAgLmJ5dGUgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3BwZmxhZ3MuaCBiL2xpYnZweC92cDgvY29tbW9uL3BwZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjVlMjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcHBmbGFncy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX1BQRkxBR1NfSAorI2RlZmluZSBfX0lOQ19QUEZMQUdTX0gKK2VudW0KK3sKKyAgICBWUDhEX05PRklMVEVSSU5HICAgICAgICAgICAgPSAwLAorICAgIFZQOERfREVCTE9DSyAgICAgICAgICAgICAgICA9IDE8PDAsCisgICAgVlA4RF9ERU1BQ1JPQkxPQ0sgICAgICAgICAgID0gMTw8MSwKKyAgICBWUDhEX0FERE5PSVNFICAgICAgICAgICAgICAgPSAxPDwyLAorICAgIFZQOERfREVCVUdfVFhUX0ZSQU1FX0lORk8gICA9IDE8PDMsCisgICAgVlA4RF9ERUJVR19UWFRfTUJMS19NT0RFUyAgID0gMTw8NCwKKyAgICBWUDhEX0RFQlVHX1RYVF9EQ19ESUZGICAgICAgPSAxPDw1LAorICAgIFZQOERfREVCVUdfVFhUX1JBVEVfSU5GTyAgICA9IDE8PDYsCisgICAgVlA4RF9ERUJVR19EUkFXX01WICAgICAgICAgID0gMTw8NywKKyAgICBWUDhEX0RFQlVHX0NMUl9CTEtfTU9ERVMgICAgPSAxPDw4LAorICAgIFZQOERfREVCVUdfQ0xSX0ZSTV9SRUZfQkxLUyA9IDE8PDksCisgICAgVlA4RF9NRlFFICAgICAgICAgICAgICAgICAgID0gMTw8MTAKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IHBvc3RfcHJvY19mbGFnOworICAgIGludCBkZWJsb2NraW5nX2xldmVsOworICAgIGludCBub2lzZV9sZXZlbDsKKyAgICBpbnQgZGlzcGxheV9yZWZfZnJhbWVfZmxhZzsKKyAgICBpbnQgZGlzcGxheV9tYl9tb2Rlc19mbGFnOworICAgIGludCBkaXNwbGF5X2JfbW9kZXNfZmxhZzsKKyAgICBpbnQgZGlzcGxheV9tdl9mbGFnOworfSB2cDhfcHBmbGFnc190OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcHJhZ21hcy5oIGIvbGlidnB4L3ZwOC9jb21tb24vcHJhZ21hcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvY29tbW9uL3ByYWdtYXMuaApyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vcHJhZ21hcy5oCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9xdWFudF9jb21tb24uYyBiL2xpYnZweC92cDgvY29tbW9uL3F1YW50X2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjkyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9xdWFudF9jb21tb24uYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJxdWFudF9jb21tb24uaCIKKworc3RhdGljIGNvbnN0IGludCBkY19xbG9va3VwW1FJTkRFWF9SQU5HRV0gPQoreworICAgIDQsICAgIDUsICAgIDYsICAgIDcsICAgIDgsICAgIDksICAgMTAsICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTcsCisgICAgMTgsICAgMTksICAgMjAsICAgMjAsICAgMjEsICAgMjEsICAgMjIsICAgMjIsICAgMjMsICAgMjMsICAgMjQsICAgMjUsICAgMjUsICAgMjYsICAgMjcsICAgMjgsCisgICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsICAgMzcsICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsCisgICAgNDQsICAgNDUsICAgNDYsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsCisgICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsICAgNjcsICAgNjgsICAgNjksICAgNzAsICAgNzEsICAgNzIsICAgNzMsICAgNzQsCisgICAgNzUsICAgNzYsICAgNzYsICAgNzcsICAgNzgsICAgNzksICAgODAsICAgODEsICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksCisgICAgOTEsICAgOTMsICAgOTUsICAgOTYsICAgOTgsICAxMDAsICAxMDEsICAxMDIsICAxMDQsICAxMDYsICAxMDgsICAxMTAsICAxMTIsICAxMTQsICAxMTYsICAxMTgsCisgICAgMTIyLCAgMTI0LCAgMTI2LCAgMTI4LCAgMTMwLCAgMTMyLCAgMTM0LCAgMTM2LCAgMTM4LCAgMTQwLCAgMTQzLCAgMTQ1LCAgMTQ4LCAgMTUxLCAgMTU0LCAgMTU3LAorfTsKKworc3RhdGljIGNvbnN0IGludCBhY19xbG9va3VwW1FJTkRFWF9SQU5HRV0gPQoreworICAgIDQsICAgIDUsICAgIDYsICAgIDcsICAgIDgsICAgIDksICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksCisgICAgMjAsICAgMjEsICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsCisgICAgMzYsICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNjAsICAgNjIsICAgNjQsICAgNjYsICAgNjgsICAgNzAsICAgNzIsICAgNzQsICAgNzYsCisgICAgNzgsICAgODAsICAgODIsICAgODQsICAgODYsICAgODgsICAgOTAsICAgOTIsICAgOTQsICAgOTYsICAgOTgsICAxMDAsICAxMDIsICAxMDQsICAxMDYsICAxMDgsCisgICAgMTEwLCAgMTEyLCAgMTE0LCAgMTE2LCAgMTE5LCAgMTIyLCAgMTI1LCAgMTI4LCAgMTMxLCAgMTM0LCAgMTM3LCAgMTQwLCAgMTQzLCAgMTQ2LCAgMTQ5LCAgMTUyLAorICAgIDE1NSwgIDE1OCwgIDE2MSwgIDE2NCwgIDE2NywgIDE3MCwgIDE3MywgIDE3NywgIDE4MSwgIDE4NSwgIDE4OSwgIDE5MywgIDE5NywgIDIwMSwgIDIwNSwgIDIwOSwKKyAgICAyMTMsICAyMTcsICAyMjEsICAyMjUsICAyMjksICAyMzQsICAyMzksICAyNDUsICAyNDksICAyNTQsICAyNTksICAyNjQsICAyNjksICAyNzQsICAyNzksICAyODQsCit9OworCisKK2ludCB2cDhfZGNfcXVhbnQoaW50IFFJbmRleCwgaW50IERlbHRhKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBRSW5kZXggPSBRSW5kZXggKyBEZWx0YTsKKworICAgIGlmIChRSW5kZXggPiAxMjcpCisgICAgICAgIFFJbmRleCA9IDEyNzsKKyAgICBlbHNlIGlmIChRSW5kZXggPCAwKQorICAgICAgICBRSW5kZXggPSAwOworCisgICAgcmV0dmFsID0gZGNfcWxvb2t1cFsgUUluZGV4IF07CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworaW50IHZwOF9kYzJxdWFudChpbnQgUUluZGV4LCBpbnQgRGVsdGEpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIFFJbmRleCA9IFFJbmRleCArIERlbHRhOworCisgICAgaWYgKFFJbmRleCA+IDEyNykKKyAgICAgICAgUUluZGV4ID0gMTI3OworICAgIGVsc2UgaWYgKFFJbmRleCA8IDApCisgICAgICAgIFFJbmRleCA9IDA7CisKKyAgICByZXR2YWwgPSBkY19xbG9va3VwWyBRSW5kZXggXSAqIDI7CisgICAgcmV0dXJuIHJldHZhbDsKKworfQoraW50IHZwOF9kY191dl9xdWFudChpbnQgUUluZGV4LCBpbnQgRGVsdGEpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIFFJbmRleCA9IFFJbmRleCArIERlbHRhOworCisgICAgaWYgKFFJbmRleCA+IDEyNykKKyAgICAgICAgUUluZGV4ID0gMTI3OworICAgIGVsc2UgaWYgKFFJbmRleCA8IDApCisgICAgICAgIFFJbmRleCA9IDA7CisKKyAgICByZXR2YWwgPSBkY19xbG9va3VwWyBRSW5kZXggXTsKKworICAgIGlmIChyZXR2YWwgPiAxMzIpCisgICAgICAgIHJldHZhbCA9IDEzMjsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKK2ludCB2cDhfYWNfeXF1YW50KGludCBRSW5kZXgpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmIChRSW5kZXggPiAxMjcpCisgICAgICAgIFFJbmRleCA9IDEyNzsKKyAgICBlbHNlIGlmIChRSW5kZXggPCAwKQorICAgICAgICBRSW5kZXggPSAwOworCisgICAgcmV0dmFsID0gYWNfcWxvb2t1cFsgUUluZGV4IF07CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworaW50IHZwOF9hYzJxdWFudChpbnQgUUluZGV4LCBpbnQgRGVsdGEpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIFFJbmRleCA9IFFJbmRleCArIERlbHRhOworCisgICAgaWYgKFFJbmRleCA+IDEyNykKKyAgICAgICAgUUluZGV4ID0gMTI3OworICAgIGVsc2UgaWYgKFFJbmRleCA8IDApCisgICAgICAgIFFJbmRleCA9IDA7CisKKyAgICAvKiBGb3IgYWxsIHggaW4gWzAuLjI4NF0sIHgqMTU1LzEwMCBpcyBiaXR3aXNlIGVxdWFsIHRvICh4KjEwMTU4MSkgPj4gMTYuCisgICAgICogVGhlIHNtYWxsZXN0IHByZWNpc2lvbiBmb3IgdGhhdCBpcyAnKHgqNjM0OSkgPj4gMTInIGJ1dCAxNiBpcyBhIGdvb2QKKyAgICAgKiB3b3JkIHNpemUuICovCisgICAgcmV0dmFsID0gKGFjX3Fsb29rdXBbIFFJbmRleCBdICogMTAxNTgxKSA+PiAxNjsKKworICAgIGlmIChyZXR2YWwgPCA4KQorICAgICAgICByZXR2YWwgPSA4OworCisgICAgcmV0dXJuIHJldHZhbDsKK30KK2ludCB2cDhfYWNfdXZfcXVhbnQoaW50IFFJbmRleCwgaW50IERlbHRhKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBRSW5kZXggPSBRSW5kZXggKyBEZWx0YTsKKworICAgIGlmIChRSW5kZXggPiAxMjcpCisgICAgICAgIFFJbmRleCA9IDEyNzsKKyAgICBlbHNlIGlmIChRSW5kZXggPCAwKQorICAgICAgICBRSW5kZXggPSAwOworCisgICAgcmV0dmFsID0gYWNfcWxvb2t1cFsgUUluZGV4IF07CisgICAgcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcXVhbnRfY29tbW9uLmggYi9saWJ2cHgvdnA4L2NvbW1vbi9xdWFudF9jb21tb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9xdWFudF9jb21tb24uaApyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vcXVhbnRfY29tbW9uLmgKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3JlY29uaW50ZXIuYyBiL2xpYnZweC92cDgvY29tbW9uL3JlY29uaW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGEzYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRlci5jCkBAIC0wLDAgKzEsNTk1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorI2luY2x1ZGUgImJsb2NrZC5oIgorI2luY2x1ZGUgInJlY29uaW50ZXIuaCIKKyNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCisjaW5jbHVkZSAib255eGNfaW50LmgiCisjZW5kaWYKKwordm9pZCB2cDhfY29weV9tZW0xNngxNl9jKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICBpbnQgc3JjX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCisgICAgaW50IGRzdF9zdHJpZGUpCit7CisKKyAgICBpbnQgcjsKKworICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQorICAgIHsKKyNpZiAhKENPTkZJR19GQVNUX1VOQUxJR05FRCkKKyAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgIGRzdFsyXSA9IHNyY1syXTsKKyAgICAgICAgZHN0WzNdID0gc3JjWzNdOworICAgICAgICBkc3RbNF0gPSBzcmNbNF07CisgICAgICAgIGRzdFs1XSA9IHNyY1s1XTsKKyAgICAgICAgZHN0WzZdID0gc3JjWzZdOworICAgICAgICBkc3RbN10gPSBzcmNbN107CisgICAgICAgIGRzdFs4XSA9IHNyY1s4XTsKKyAgICAgICAgZHN0WzldID0gc3JjWzldOworICAgICAgICBkc3RbMTBdID0gc3JjWzEwXTsKKyAgICAgICAgZHN0WzExXSA9IHNyY1sxMV07CisgICAgICAgIGRzdFsxMl0gPSBzcmNbMTJdOworICAgICAgICBkc3RbMTNdID0gc3JjWzEzXTsKKyAgICAgICAgZHN0WzE0XSA9IHNyY1sxNF07CisgICAgICAgIGRzdFsxNV0gPSBzcmNbMTVdOworCisjZWxzZQorICAgICAgICAoKHVpbnQzMl90ICopZHN0KVswXSA9ICgodWludDMyX3QgKilzcmMpWzBdIDsKKyAgICAgICAgKCh1aW50MzJfdCAqKWRzdClbMV0gPSAoKHVpbnQzMl90ICopc3JjKVsxXSA7CisgICAgICAgICgodWludDMyX3QgKilkc3QpWzJdID0gKCh1aW50MzJfdCAqKXNyYylbMl0gOworICAgICAgICAoKHVpbnQzMl90ICopZHN0KVszXSA9ICgodWludDMyX3QgKilzcmMpWzNdIDsKKworI2VuZGlmCisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKworICAgIH0KKworfQorCit2b2lkIHZwOF9jb3B5X21lbTh4OF9jKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICBpbnQgc3JjX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCisgICAgaW50IGRzdF9zdHJpZGUpCit7CisgICAgaW50IHI7CisKKyAgICBmb3IgKHIgPSAwOyByIDwgODsgcisrKQorICAgIHsKKyNpZiAhKENPTkZJR19GQVNUX1VOQUxJR05FRCkKKyAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgIGRzdFsyXSA9IHNyY1syXTsKKyAgICAgICAgZHN0WzNdID0gc3JjWzNdOworICAgICAgICBkc3RbNF0gPSBzcmNbNF07CisgICAgICAgIGRzdFs1XSA9IHNyY1s1XTsKKyAgICAgICAgZHN0WzZdID0gc3JjWzZdOworICAgICAgICBkc3RbN10gPSBzcmNbN107CisjZWxzZQorICAgICAgICAoKHVpbnQzMl90ICopZHN0KVswXSA9ICgodWludDMyX3QgKilzcmMpWzBdIDsKKyAgICAgICAgKCh1aW50MzJfdCAqKWRzdClbMV0gPSAoKHVpbnQzMl90ICopc3JjKVsxXSA7CisjZW5kaWYKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworCisgICAgfQorCit9CisKK3ZvaWQgdnA4X2NvcHlfbWVtOHg0X2MoCisgICAgdW5zaWduZWQgY2hhciAqc3JjLAorICAgIGludCBzcmNfc3RyaWRlLAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKyAgICBpbnQgZHN0X3N0cmlkZSkKK3sKKyAgICBpbnQgcjsKKworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworI2lmICEoQ09ORklHX0ZBU1RfVU5BTElHTkVEKQorICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKKyAgICAgICAgZHN0WzJdID0gc3JjWzJdOworICAgICAgICBkc3RbM10gPSBzcmNbM107CisgICAgICAgIGRzdFs0XSA9IHNyY1s0XTsKKyAgICAgICAgZHN0WzVdID0gc3JjWzVdOworICAgICAgICBkc3RbNl0gPSBzcmNbNl07CisgICAgICAgIGRzdFs3XSA9IHNyY1s3XTsKKyNlbHNlCisgICAgICAgICgodWludDMyX3QgKilkc3QpWzBdID0gKCh1aW50MzJfdCAqKXNyYylbMF0gOworICAgICAgICAoKHVpbnQzMl90ICopZHN0KVsxXSA9ICgodWludDMyX3QgKilzcmMpWzFdIDsKKyNlbmRpZgorICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisKKyAgICB9CisKK30KKworCit2b2lkIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoQkxPQ0tEICpkLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmJhc2VfcHJlLCBpbnQgcHJlX3N0cmlkZSwgdnA4X3N1YnBpeF9mbl90IHNwcGYpCit7CisgICAgaW50IHI7CisgICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSBkLT5wcmVkaWN0b3I7CisgICAgdW5zaWduZWQgY2hhciAqcHRyOworICAgIHB0ciA9IGJhc2VfcHJlICsgZC0+b2Zmc2V0ICsgKGQtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBwcmVfc3RyaWRlICsgKGQtPmJtaS5tdi5hc19tdi5jb2wgPj4gMyk7CisKKyAgICBpZiAoZC0+Ym1pLm12LmFzX212LnJvdyAmIDcgfHwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcpCisgICAgeworICAgICAgICBzcHBmKHB0ciwgcHJlX3N0cmlkZSwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcsIGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3LCBwcmVkX3B0ciwgcGl0Y2gpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQorICAgICAgICB7CisjaWYgIShDT05GSUdfRkFTVF9VTkFMSUdORUQpCisgICAgICAgICAgICBwcmVkX3B0clswXSAgPSBwdHJbMF07CisgICAgICAgICAgICBwcmVkX3B0clsxXSAgPSBwdHJbMV07CisgICAgICAgICAgICBwcmVkX3B0clsyXSAgPSBwdHJbMl07CisgICAgICAgICAgICBwcmVkX3B0clszXSAgPSBwdHJbM107CisjZWxzZQorICAgICAgICAgICAgKih1aW50MzJfdCAqKXByZWRfcHRyID0gKih1aW50MzJfdCAqKXB0ciA7CisjZW5kaWYKKyAgICAgICAgICAgIHByZWRfcHRyICAgICArPSBwaXRjaDsKKyAgICAgICAgICAgIHB0ciAgICAgICAgICs9IHByZV9zdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnM0YihNQUNST0JMT0NLRCAqeCwgQkxPQ0tEICpkLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpiYXNlX3ByZSwgaW50IHByZV9zdHJpZGUpCit7CisgICAgdW5zaWduZWQgY2hhciAqcHRyOworICAgIHB0ciA9IGJhc2VfcHJlICsgZC0+b2Zmc2V0ICsgKGQtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBwcmVfc3RyaWRlICsgKGQtPmJtaS5tdi5hc19tdi5jb2wgPj4gMyk7CisKKyAgICBpZiAoZC0+Ym1pLm12LmFzX212LnJvdyAmIDcgfHwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcpCisgICAgeworICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg4KHB0ciwgcHJlX3N0cmlkZSwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcsIGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3LCBkc3QsIGRzdF9zdHJpZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfY29weV9tZW04eDgocHRyLCBwcmVfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYnVpbGRfaW50ZXJfcHJlZGljdG9yczJiKE1BQ1JPQkxPQ0tEICp4LCBCTE9DS0QgKmQsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmJhc2VfcHJlLCBpbnQgcHJlX3N0cmlkZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgcHRyID0gYmFzZV9wcmUgKyBkLT5vZmZzZXQgKyAoZC0+Ym1pLm12LmFzX212LnJvdyA+PiAzKSAqIHByZV9zdHJpZGUgKyAoZC0+Ym1pLm12LmFzX212LmNvbCA+PiAzKTsKKworICAgIGlmIChkLT5ibWkubXYuYXNfbXYucm93ICYgNyB8fCBkLT5ibWkubXYuYXNfbXYuY29sICYgNykKKyAgICB7CisgICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3Q4eDQocHRyLCBwcmVfc3RyaWRlLCBkLT5ibWkubXYuYXNfbXYuY29sICYgNywgZC0+Ym1pLm12LmFzX212LnJvdyAmIDcsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZwOF9jb3B5X21lbTh4NChwdHIsIHByZV9zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBidWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoQkxPQ0tEICpkLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpiYXNlX3ByZSwgaW50IHByZV9zdHJpZGUsIHZwOF9zdWJwaXhfZm5fdCBzcHBmKQoreworICAgIGludCByOworICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKKyAgICBwdHIgPSBiYXNlX3ByZSArIGQtPm9mZnNldCArIChkLT5ibWkubXYuYXNfbXYucm93ID4+IDMpICogcHJlX3N0cmlkZSArIChkLT5ibWkubXYuYXNfbXYuY29sID4+IDMpOworCisgICAgaWYgKGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3IHx8IGQtPmJtaS5tdi5hc19tdi5jb2wgJiA3KQorICAgIHsKKyAgICAgICAgc3BwZihwdHIsIHByZV9zdHJpZGUsIGQtPmJtaS5tdi5hc19tdi5jb2wgJiA3LCBkLT5ibWkubXYuYXNfbXYucm93ICYgNywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKKyAgICAgICAgeworI2lmICEoQ09ORklHX0ZBU1RfVU5BTElHTkVEKQorICAgICAgICAgIGRzdFswXSAgPSBwdHJbMF07CisgICAgICAgICAgZHN0WzFdICA9IHB0clsxXTsKKyAgICAgICAgICBkc3RbMl0gID0gcHRyWzJdOworICAgICAgICAgIGRzdFszXSAgPSBwdHJbM107CisjZWxzZQorICAgICAgICAgICAgKih1aW50MzJfdCAqKWRzdCA9ICoodWludDMyX3QgKilwdHIgOworI2VuZGlmCisgICAgICAgICAgICBkc3QgICAgICs9IGRzdF9zdHJpZGU7CisgICAgICAgICAgICBwdHIgICAgICs9IHByZV9zdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyplbmNvZGVyIG9ubHkqLwordm9pZCB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21idXYoTUFDUk9CTE9DS0QgKngpCit7CisgICAgdW5zaWduZWQgY2hhciAqdXB0ciwgKnZwdHI7CisgICAgdW5zaWduZWQgY2hhciAqdXByZWRfcHRyID0gJngtPnByZWRpY3RvclsyNTZdOworICAgIHVuc2lnbmVkIGNoYXIgKnZwcmVkX3B0ciA9ICZ4LT5wcmVkaWN0b3JbMzIwXTsKKworICAgIGludCBtdl9yb3cgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5yb3c7CisgICAgaW50IG12X2NvbCA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LmNvbDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBwcmVfc3RyaWRlID0geC0+cHJlLnV2X3N0cmlkZTsKKworICAgIC8qIGNhbGMgdXYgbW90aW9uIHZlY3RvcnMgKi8KKyAgICBtdl9yb3cgKz0gMSB8IChtdl9yb3cgPj4gKHNpemVvZihpbnQpICogQ0hBUl9CSVQgLSAxKSk7CisgICAgbXZfY29sICs9IDEgfCAobXZfY29sID4+IChzaXplb2YoaW50KSAqIENIQVJfQklUIC0gMSkpOworICAgIG12X3JvdyAvPSAyOworICAgIG12X2NvbCAvPSAyOworICAgIG12X3JvdyAmPSB4LT5mdWxscGl4ZWxfbWFzazsKKyAgICBtdl9jb2wgJj0geC0+ZnVsbHBpeGVsX21hc2s7CisKKyAgICBvZmZzZXQgPSAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7CisgICAgdXB0ciA9IHgtPnByZS51X2J1ZmZlciArIG9mZnNldDsKKyAgICB2cHRyID0geC0+cHJlLnZfYnVmZmVyICsgb2Zmc2V0OworCisgICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKKyAgICB7CisgICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3Q4eDgodXB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywgdXByZWRfcHRyLCA4KTsKKyAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OCh2cHRyLCBwcmVfc3RyaWRlLCBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCB2cHJlZF9wdHIsIDgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfY29weV9tZW04eDgodXB0ciwgcHJlX3N0cmlkZSwgdXByZWRfcHRyLCA4KTsKKyAgICAgICAgdnA4X2NvcHlfbWVtOHg4KHZwdHIsIHByZV9zdHJpZGUsIHZwcmVkX3B0ciwgOCk7CisgICAgfQorfQorCisvKmVuY29kZXIgb25seSovCit2b2lkIHZwOF9idWlsZF9pbnRlcjR4NF9wcmVkaWN0b3JzX21idXYoTUFDUk9CTE9DS0QgKngpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5wcmUudXZfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmJhc2VfcHJlOworCisgICAgLyogYnVpbGQgdXYgbXZzICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB5b2Zmc2V0ID0gaSAqIDggKyBqICogMjsKKyAgICAgICAgICAgIGludCB1b2Zmc2V0ID0gMTYgKyBpICogMiArIGo7CisgICAgICAgICAgICBpbnQgdm9mZnNldCA9IDIwICsgaSAqIDIgKyBqOworCisgICAgICAgICAgICBpbnQgdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9IHgtPmJsb2NrW3lvZmZzZXQgIF0uYm1pLm12LmFzX212LnJvdworICAgICAgICAgICAgICAgICAgICsgeC0+YmxvY2tbeW9mZnNldCsxXS5ibWkubXYuYXNfbXYucm93CisgICAgICAgICAgICAgICAgICAgKyB4LT5ibG9ja1t5b2Zmc2V0KzRdLmJtaS5tdi5hc19tdi5yb3cKKyAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrNV0uYm1pLm12LmFzX212LnJvdzsKKworICAgICAgICAgICAgdGVtcCArPSA0ICsgKCh0ZW1wID4+IChzaXplb2YoaW50KSAqIENIQVJfQklUIC0gMSkpIDw8IDMpOworCisgICAgICAgICAgICB4LT5ibG9ja1t1b2Zmc2V0XS5ibWkubXYuYXNfbXYucm93ID0gKHRlbXAgLyA4KSAmIHgtPmZ1bGxwaXhlbF9tYXNrOworCisgICAgICAgICAgICB0ZW1wID0geC0+YmxvY2tbeW9mZnNldCAgXS5ibWkubXYuYXNfbXYuY29sCisgICAgICAgICAgICAgICAgICAgKyB4LT5ibG9ja1t5b2Zmc2V0KzFdLmJtaS5tdi5hc19tdi5jb2wKKyAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrNF0uYm1pLm12LmFzX212LmNvbAorICAgICAgICAgICAgICAgICAgICsgeC0+YmxvY2tbeW9mZnNldCs1XS5ibWkubXYuYXNfbXYuY29sOworCisgICAgICAgICAgICB0ZW1wICs9IDQgKyAoKHRlbXAgPj4gKHNpemVvZihpbnQpICogQ0hBUl9CSVQgLSAxKSkgPDwgMyk7CisKKyAgICAgICAgICAgIHgtPmJsb2NrW3VvZmZzZXRdLmJtaS5tdi5hc19tdi5jb2wgPSAodGVtcCAvIDgpICYgeC0+ZnVsbHBpeGVsX21hc2s7CisKKyAgICAgICAgICAgIHgtPmJsb2NrW3ZvZmZzZXRdLmJtaS5tdi5hc19pbnQgPSB4LT5ibG9ja1t1b2Zmc2V0XS5ibWkubXYuYXNfaW50OworICAgICAgICB9CisgICAgfQorCisgICAgYmFzZV9wcmUgPSB4LT5wcmUudV9idWZmZXI7CisgICAgZm9yIChpID0gMTY7IGkgPCAyMDsgaSArPSAyKQorICAgIHsKKyAgICAgICAgQkxPQ0tEICpkMCA9ICZ4LT5ibG9ja1tpXTsKKyAgICAgICAgQkxPQ0tEICpkMSA9ICZ4LT5ibG9ja1tpKzFdOworCisgICAgICAgIGlmIChkMC0+Ym1pLm12LmFzX2ludCA9PSBkMS0+Ym1pLm12LmFzX2ludCkKKyAgICAgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnMyYih4LCBkMCwgZDAtPnByZWRpY3RvciwgOCwgYmFzZV9wcmUsIHByZV9zdHJpZGUpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDAsIDgsIGJhc2VfcHJlLCBwcmVfc3RyaWRlLCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDEsIDgsIGJhc2VfcHJlLCBwcmVfc3RyaWRlLCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJhc2VfcHJlID0geC0+cHJlLnZfYnVmZmVyOworICAgIGZvciAoaSA9IDIwOyBpIDwgMjQ7IGkgKz0gMikKKyAgICB7CisgICAgICAgIEJMT0NLRCAqZDAgPSAmeC0+YmxvY2tbaV07CisgICAgICAgIEJMT0NLRCAqZDEgPSAmeC0+YmxvY2tbaSsxXTsKKworICAgICAgICBpZiAoZDAtPmJtaS5tdi5hc19pbnQgPT0gZDEtPmJtaS5tdi5hc19pbnQpCisgICAgICAgICAgICBidWlsZF9pbnRlcl9wcmVkaWN0b3JzMmIoeCwgZDAsIGQwLT5wcmVkaWN0b3IsIDgsIGJhc2VfcHJlLCBwcmVfc3RyaWRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQwLCA4LCBiYXNlX3ByZSwgcHJlX3N0cmlkZSwgeC0+c3VicGl4ZWxfcHJlZGljdCk7CisgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQxLCA4LCBiYXNlX3ByZSwgcHJlX3N0cmlkZSwgeC0+c3VicGl4ZWxfcHJlZGljdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyplbmNvZGVyIG9ubHkqLwordm9pZCB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21ieShNQUNST0JMT0NLRCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeXN0cmlkZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZTsKKyAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgaW50IG12X3JvdyA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LnJvdzsKKyAgICBpbnQgbXZfY29sID0geC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYuY29sOworICAgIGludCBwcmVfc3RyaWRlID0geC0+cHJlLnlfc3RyaWRlOworCisgICAgcHRyX2Jhc2UgPSB4LT5wcmUueV9idWZmZXI7CisgICAgcHRyID0gcHRyX2Jhc2UgKyAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7CisKKyAgICBpZiAoKG12X3JvdyB8IG12X2NvbCkgJiA3KQorICAgIHsKKyAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2KHB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3RfeXN0cmlkZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZwOF9jb3B5X21lbTE2eDE2KHB0ciwgcHJlX3N0cmlkZSwgZHN0X3ksCisgICAgICAgICAgICBkc3RfeXN0cmlkZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjbGFtcF9tdl90b191bXZfYm9yZGVyKE1WICptdiwgY29uc3QgTUFDUk9CTE9DS0QgKnhkKQoreworICAgIC8qIElmIHRoZSBNViBwb2ludHMgc28gZmFyIGludG8gdGhlIFVNViBib3JkZXIgdGhhdCBubyB2aXNpYmxlIHBpeGVscworICAgICAqIGFyZSB1c2VkIGZvciByZWNvbnN0cnVjdGlvbiwgdGhlIHN1YnBlbCBwYXJ0IG9mIHRoZSBNViBjYW4gYmUKKyAgICAgKiBkaXNjYXJkZWQgYW5kIHRoZSBNViBsaW1pdGVkIHRvIDE2IHBpeGVscyB3aXRoIGVxdWl2YWxlbnQgcmVzdWx0cy4KKyAgICAgKgorICAgICAqIFRoaXMgbGltaXQga2lja3MgaW4gYXQgMTkgcGl4ZWxzIGZvciB0aGUgdG9wIGFuZCBsZWZ0IGVkZ2VzLCBmb3IKKyAgICAgKiB0aGUgMTYgcGl4ZWxzIHBsdXMgMyB0YXBzIHJpZ2h0IG9mIHRoZSBjZW50cmFsIHBpeGVsIHdoZW4gc3VicGVsCisgICAgICogZmlsdGVyaW5nLiBUaGUgYm90dG9tIGFuZCByaWdodCBlZGdlcyB1c2UgMTYgcGl4ZWxzIHBsdXMgMiBwaXhlbHMKKyAgICAgKiBsZWZ0IG9mIHRoZSBjZW50cmFsIHBpeGVsIHdoZW4gZmlsdGVyaW5nLgorICAgICAqLworICAgIGlmIChtdi0+Y29sIDwgKHhkLT5tYl90b19sZWZ0X2VkZ2UgLSAoMTkgPDwgMykpKQorICAgICAgICBtdi0+Y29sID0geGQtPm1iX3RvX2xlZnRfZWRnZSAtICgxNiA8PCAzKTsKKyAgICBlbHNlIGlmIChtdi0+Y29sID4geGQtPm1iX3RvX3JpZ2h0X2VkZ2UgKyAoMTggPDwgMykpCisgICAgICAgIG12LT5jb2wgPSB4ZC0+bWJfdG9fcmlnaHRfZWRnZSArICgxNiA8PCAzKTsKKworICAgIGlmIChtdi0+cm93IDwgKHhkLT5tYl90b190b3BfZWRnZSAtICgxOSA8PCAzKSkpCisgICAgICAgIG12LT5yb3cgPSB4ZC0+bWJfdG9fdG9wX2VkZ2UgLSAoMTYgPDwgMyk7CisgICAgZWxzZSBpZiAobXYtPnJvdyA+IHhkLT5tYl90b19ib3R0b21fZWRnZSArICgxOCA8PCAzKSkKKyAgICAgICAgbXYtPnJvdyA9IHhkLT5tYl90b19ib3R0b21fZWRnZSArICgxNiA8PCAzKTsKK30KKworLyogQSB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBmdW5jdGlvbiBmb3IgY2hyb21hIGJsb2NrIE1Wcy4qLworc3RhdGljIHZvaWQgY2xhbXBfdXZtdl90b191bXZfYm9yZGVyKE1WICptdiwgY29uc3QgTUFDUk9CTE9DS0QgKnhkKQoreworICAgIG12LT5jb2wgPSAoMiptdi0+Y29sIDwgKHhkLT5tYl90b19sZWZ0X2VkZ2UgLSAoMTkgPDwgMykpKSA/CisgICAgICAgICh4ZC0+bWJfdG9fbGVmdF9lZGdlIC0gKDE2IDw8IDMpKSA+PiAxIDogbXYtPmNvbDsKKyAgICBtdi0+Y29sID0gKDIqbXYtPmNvbCA+IHhkLT5tYl90b19yaWdodF9lZGdlICsgKDE4IDw8IDMpKSA/CisgICAgICAgICh4ZC0+bWJfdG9fcmlnaHRfZWRnZSArICgxNiA8PCAzKSkgPj4gMSA6IG12LT5jb2w7CisKKyAgICBtdi0+cm93ID0gKDIqbXYtPnJvdyA8ICh4ZC0+bWJfdG9fdG9wX2VkZ2UgLSAoMTkgPDwgMykpKSA/CisgICAgICAgICh4ZC0+bWJfdG9fdG9wX2VkZ2UgLSAoMTYgPDwgMykpID4+IDEgOiBtdi0+cm93OworICAgIG12LT5yb3cgPSAoMiptdi0+cm93ID4geGQtPm1iX3RvX2JvdHRvbV9lZGdlICsgKDE4IDw8IDMpKSA/CisgICAgICAgICh4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgKyAoMTYgPDwgMykpID4+IDEgOiBtdi0+cm93OworfQorCit2b2lkIHZwOF9idWlsZF9pbnRlcjE2eDE2X3ByZWRpY3RvcnNfbWIoTUFDUk9CTE9DS0QgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF95c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfdXZzdHJpZGUpCit7CisgICAgaW50IG9mZnNldDsKKyAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgdW5zaWduZWQgY2hhciAqdXB0ciwgKnZwdHI7CisKKyAgICBpbnRfbXYgXzE2eDE2bXY7CisKKyAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZSA9IHgtPnByZS55X2J1ZmZlcjsKKyAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPnByZS55X3N0cmlkZTsKKworICAgIF8xNngxNm12LmFzX2ludCA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX2ludDsKKworICAgIGlmICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5uZWVkX3RvX2NsYW1wX212cykKKyAgICB7CisgICAgICAgIGNsYW1wX212X3RvX3Vtdl9ib3JkZXIoJl8xNngxNm12LmFzX212LCB4KTsKKyAgICB9CisKKyAgICBwdHIgPSBwdHJfYmFzZSArICggXzE2eDE2bXYuYXNfbXYucm93ID4+IDMpICogcHJlX3N0cmlkZSArIChfMTZ4MTZtdi5hc19tdi5jb2wgPj4gMyk7CisKKyAgICBpZiAoIF8xNngxNm12LmFzX2ludCAmIDB4MDAwNzAwMDcpCisgICAgeworICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTYocHRyLCBwcmVfc3RyaWRlLCBfMTZ4MTZtdi5hc19tdi5jb2wgJiA3LCAgXzE2eDE2bXYuYXNfbXYucm93ICYgNywgZHN0X3ksIGRzdF95c3RyaWRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdnA4X2NvcHlfbWVtMTZ4MTYocHRyLCBwcmVfc3RyaWRlLCBkc3RfeSwgZHN0X3lzdHJpZGUpOworICAgIH0KKworICAgIC8qIGNhbGMgdXYgbW90aW9uIHZlY3RvcnMgKi8KKyAgICBfMTZ4MTZtdi5hc19tdi5yb3cgKz0gMSB8IChfMTZ4MTZtdi5hc19tdi5yb3cgPj4gKHNpemVvZihpbnQpICogQ0hBUl9CSVQgLSAxKSk7CisgICAgXzE2eDE2bXYuYXNfbXYuY29sICs9IDEgfCAoXzE2eDE2bXYuYXNfbXYuY29sID4+IChzaXplb2YoaW50KSAqIENIQVJfQklUIC0gMSkpOworICAgIF8xNngxNm12LmFzX212LnJvdyAvPSAyOworICAgIF8xNngxNm12LmFzX212LmNvbCAvPSAyOworICAgIF8xNngxNm12LmFzX212LnJvdyAmPSB4LT5mdWxscGl4ZWxfbWFzazsKKyAgICBfMTZ4MTZtdi5hc19tdi5jb2wgJj0geC0+ZnVsbHBpeGVsX21hc2s7CisKKyAgICBwcmVfc3RyaWRlID4+PSAxOworICAgIG9mZnNldCA9ICggXzE2eDE2bXYuYXNfbXYucm93ID4+IDMpICogcHJlX3N0cmlkZSArIChfMTZ4MTZtdi5hc19tdi5jb2wgPj4gMyk7CisgICAgdXB0ciA9IHgtPnByZS51X2J1ZmZlciArIG9mZnNldDsKKyAgICB2cHRyID0geC0+cHJlLnZfYnVmZmVyICsgb2Zmc2V0OworCisgICAgaWYgKCBfMTZ4MTZtdi5hc19pbnQgJiAweDAwMDcwMDA3KQorICAgIHsKKyAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OCh1cHRyLCBwcmVfc3RyaWRlLCBfMTZ4MTZtdi5hc19tdi5jb2wgJiA3LCAgXzE2eDE2bXYuYXNfbXYucm93ICYgNywgZHN0X3UsIGRzdF91dnN0cmlkZSk7CisgICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3Q4eDgodnB0ciwgcHJlX3N0cmlkZSwgXzE2eDE2bXYuYXNfbXYuY29sICYgNywgIF8xNngxNm12LmFzX212LnJvdyAmIDcsIGRzdF92LCBkc3RfdXZzdHJpZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfY29weV9tZW04eDgodXB0ciwgcHJlX3N0cmlkZSwgZHN0X3UsIGRzdF91dnN0cmlkZSk7CisgICAgICAgIHZwOF9jb3B5X21lbTh4OCh2cHRyLCBwcmVfc3RyaWRlLCBkc3RfdiwgZHN0X3V2c3RyaWRlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludGVyNHg0X3ByZWRpY3RvcnNfbWIoTUFDUk9CTE9DS0QgKngpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9kc3QgPSB4LT5kc3QueV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5wcmUueV9idWZmZXI7CisKKyAgICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucGFydGl0aW9uaW5nIDwgMykKKyAgICB7CisgICAgICAgIEJMT0NLRCAqYjsKKyAgICAgICAgaW50IGRzdF9zdHJpZGUgPSB4LT5kc3QueV9zdHJpZGU7CisKKyAgICAgICAgeC0+YmxvY2tbIDBdLmJtaSA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbIDBdOworICAgICAgICB4LT5ibG9ja1sgMl0uYm1pID0geC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVsgMl07CisgICAgICAgIHgtPmJsb2NrWyA4XS5ibWkgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+Ym1pWyA4XTsKKyAgICAgICAgeC0+YmxvY2tbMTBdLmJtaSA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbMTBdOworICAgICAgICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubmVlZF90b19jbGFtcF9tdnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsYW1wX212X3RvX3Vtdl9ib3JkZXIoJngtPmJsb2NrWyAwXS5ibWkubXYuYXNfbXYsIHgpOworICAgICAgICAgICAgY2xhbXBfbXZfdG9fdW12X2JvcmRlcigmeC0+YmxvY2tbIDJdLmJtaS5tdi5hc19tdiwgeCk7CisgICAgICAgICAgICBjbGFtcF9tdl90b191bXZfYm9yZGVyKCZ4LT5ibG9ja1sgOF0uYm1pLm12LmFzX212LCB4KTsKKyAgICAgICAgICAgIGNsYW1wX212X3RvX3Vtdl9ib3JkZXIoJngtPmJsb2NrWzEwXS5ibWkubXYuYXNfbXYsIHgpOworICAgICAgICB9CisKKyAgICAgICAgYiA9ICZ4LT5ibG9ja1sgMF07CisgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnM0Yih4LCBiLCBiYXNlX2RzdCArIGItPm9mZnNldCwgZHN0X3N0cmlkZSwgYmFzZV9wcmUsIGRzdF9zdHJpZGUpOworICAgICAgICBiID0gJngtPmJsb2NrWyAyXTsKKyAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yczRiKHgsIGIsIGJhc2VfZHN0ICsgYi0+b2Zmc2V0LCBkc3Rfc3RyaWRlLCBiYXNlX3ByZSwgZHN0X3N0cmlkZSk7CisgICAgICAgIGIgPSAmeC0+YmxvY2tbIDhdOworICAgICAgICBidWlsZF9pbnRlcl9wcmVkaWN0b3JzNGIoeCwgYiwgYmFzZV9kc3QgKyBiLT5vZmZzZXQsIGRzdF9zdHJpZGUsIGJhc2VfcHJlLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgYiA9ICZ4LT5ibG9ja1sxMF07CisgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnM0Yih4LCBiLCBiYXNlX2RzdCArIGItPm9mZnNldCwgZHN0X3N0cmlkZSwgYmFzZV9wcmUsIGRzdF9zdHJpZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQkxPQ0tEICpkMCA9ICZ4LT5ibG9ja1tpXTsKKyAgICAgICAgICAgIEJMT0NLRCAqZDEgPSAmeC0+YmxvY2tbaSsxXTsKKyAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlID0geC0+ZHN0Lnlfc3RyaWRlOworCisgICAgICAgICAgICB4LT5ibG9ja1tpKzBdLmJtaSA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbaSswXTsKKyAgICAgICAgICAgIHgtPmJsb2NrW2krMV0uYm1pID0geC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVtpKzFdOworICAgICAgICAgICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm5lZWRfdG9fY2xhbXBfbXZzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsYW1wX212X3RvX3Vtdl9ib3JkZXIoJngtPmJsb2NrW2krMF0uYm1pLm12LmFzX212LCB4KTsKKyAgICAgICAgICAgICAgICBjbGFtcF9tdl90b191bXZfYm9yZGVyKCZ4LT5ibG9ja1tpKzFdLmJtaS5tdi5hc19tdiwgeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkMC0+Ym1pLm12LmFzX2ludCA9PSBkMS0+Ym1pLm12LmFzX2ludCkKKyAgICAgICAgICAgICAgICBidWlsZF9pbnRlcl9wcmVkaWN0b3JzMmIoeCwgZDAsIGJhc2VfZHN0ICsgZDAtPm9mZnNldCwgZHN0X3N0cmlkZSwgYmFzZV9wcmUsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnNfYihkMCwgYmFzZV9kc3QgKyBkMC0+b2Zmc2V0LCBkc3Rfc3RyaWRlLCBiYXNlX3ByZSwgZHN0X3N0cmlkZSwgeC0+c3VicGl4ZWxfcHJlZGljdCk7CisgICAgICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQxLCBiYXNlX2RzdCArIGQxLT5vZmZzZXQsIGRzdF9zdHJpZGUsIGJhc2VfcHJlLCBkc3Rfc3RyaWRlLCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisgICAgYmFzZV9kc3QgPSB4LT5kc3QudV9idWZmZXI7CisgICAgYmFzZV9wcmUgPSB4LT5wcmUudV9idWZmZXI7CisgICAgZm9yIChpID0gMTY7IGkgPCAyMDsgaSArPSAyKQorICAgIHsKKyAgICAgICAgQkxPQ0tEICpkMCA9ICZ4LT5ibG9ja1tpXTsKKyAgICAgICAgQkxPQ0tEICpkMSA9ICZ4LT5ibG9ja1tpKzFdOworICAgICAgICBpbnQgZHN0X3N0cmlkZSA9IHgtPmRzdC51dl9zdHJpZGU7CisKKyAgICAgICAgLyogTm90ZTogdXYgbXZzIGFscmVhZHkgY2xhbXBlZCBpbiBidWlsZF80eDR1dm12cygpICovCisKKyAgICAgICAgaWYgKGQwLT5ibWkubXYuYXNfaW50ID09IGQxLT5ibWkubXYuYXNfaW50KQorICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yczJiKHgsIGQwLCBiYXNlX2RzdCArIGQwLT5vZmZzZXQsIGRzdF9zdHJpZGUsIGJhc2VfcHJlLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDAsIGJhc2VfZHN0ICsgZDAtPm9mZnNldCwgZHN0X3N0cmlkZSwgYmFzZV9wcmUsIGRzdF9zdHJpZGUsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOworICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQxLCBiYXNlX2RzdCArIGQxLT5vZmZzZXQsIGRzdF9zdHJpZGUsIGJhc2VfcHJlLCBkc3Rfc3RyaWRlLCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJhc2VfZHN0ID0geC0+ZHN0LnZfYnVmZmVyOworICAgIGJhc2VfcHJlID0geC0+cHJlLnZfYnVmZmVyOworICAgIGZvciAoaSA9IDIwOyBpIDwgMjQ7IGkgKz0gMikKKyAgICB7CisgICAgICAgIEJMT0NLRCAqZDAgPSAmeC0+YmxvY2tbaV07CisgICAgICAgIEJMT0NLRCAqZDEgPSAmeC0+YmxvY2tbaSsxXTsKKyAgICAgICAgaW50IGRzdF9zdHJpZGUgPSB4LT5kc3QudXZfc3RyaWRlOworCisgICAgICAgIC8qIE5vdGU6IHV2IG12cyBhbHJlYWR5IGNsYW1wZWQgaW4gYnVpbGRfNHg0dXZtdnMoKSAqLworCisgICAgICAgIGlmIChkMC0+Ym1pLm12LmFzX2ludCA9PSBkMS0+Ym1pLm12LmFzX2ludCkKKyAgICAgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnMyYih4LCBkMCwgYmFzZV9kc3QgKyBkMC0+b2Zmc2V0LCBkc3Rfc3RyaWRlLCBiYXNlX3ByZSwgZHN0X3N0cmlkZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQwLCBiYXNlX2RzdCArIGQwLT5vZmZzZXQsIGRzdF9zdHJpZGUsIGJhc2VfcHJlLCBkc3Rfc3RyaWRlLCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKKyAgICAgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnNfYihkMSwgYmFzZV9kc3QgKyBkMS0+b2Zmc2V0LCBkc3Rfc3RyaWRlLCBiYXNlX3ByZSwgZHN0X3N0cmlkZSwgeC0+c3VicGl4ZWxfcHJlZGljdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYwordm9pZCBidWlsZF80eDR1dm12cyhNQUNST0JMT0NLRCAqeCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeW9mZnNldCA9IGkgKiA4ICsgaiAqIDI7CisgICAgICAgICAgICBpbnQgdW9mZnNldCA9IDE2ICsgaSAqIDIgKyBqOworICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAyMCArIGkgKiAyICsgajsKKworICAgICAgICAgICAgaW50IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW3lvZmZzZXQgKyAwXS5tdi5hc19tdi5yb3cKKyAgICAgICAgICAgICAgICAgKyB4LT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW3lvZmZzZXQgKyAxXS5tdi5hc19tdi5yb3cKKyAgICAgICAgICAgICAgICAgKyB4LT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW3lvZmZzZXQgKyA0XS5tdi5hc19tdi5yb3cKKyAgICAgICAgICAgICAgICAgKyB4LT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW3lvZmZzZXQgKyA1XS5tdi5hc19tdi5yb3c7CisKKyAgICAgICAgICAgIHRlbXAgKz0gNCArICgodGVtcCA+PiAoc2l6ZW9mKGludCkgKiBDSEFSX0JJVCAtIDEpKSA8PCAzKTsKKworICAgICAgICAgICAgeC0+YmxvY2tbdW9mZnNldF0uYm1pLm12LmFzX212LnJvdyA9ICh0ZW1wIC8gOCkgJiB4LT5mdWxscGl4ZWxfbWFzazsKKworICAgICAgICAgICAgdGVtcCA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbeW9mZnNldCArIDBdLm12LmFzX212LmNvbAorICAgICAgICAgICAgICAgICArIHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbeW9mZnNldCArIDFdLm12LmFzX212LmNvbAorICAgICAgICAgICAgICAgICArIHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbeW9mZnNldCArIDRdLm12LmFzX212LmNvbAorICAgICAgICAgICAgICAgICArIHgtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbeW9mZnNldCArIDVdLm12LmFzX212LmNvbDsKKworICAgICAgICAgICAgdGVtcCArPSA0ICsgKCh0ZW1wID4+IChzaXplb2YoaW50KSAqIENIQVJfQklUIC0gMSkpIDw8IDMpOworCisgICAgICAgICAgICB4LT5ibG9ja1t1b2Zmc2V0XS5ibWkubXYuYXNfbXYuY29sID0gKHRlbXAgLyA4KSAmIHgtPmZ1bGxwaXhlbF9tYXNrOworCisgICAgICAgICAgICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubmVlZF90b19jbGFtcF9tdnMpCisgICAgICAgICAgICAgICAgY2xhbXBfdXZtdl90b191bXZfYm9yZGVyKCZ4LT5ibG9ja1t1b2Zmc2V0XS5ibWkubXYuYXNfbXYsIHgpOworCisgICAgICAgICAgICB4LT5ibG9ja1t2b2Zmc2V0XS5ibWkubXYuYXNfaW50ID0geC0+YmxvY2tbdW9mZnNldF0uYm1pLm12LmFzX2ludDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19tYihNQUNST0JMT0NLRCAqeGQpCit7CisgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCisgICAgeworICAgICAgICB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21iKHhkLCB4ZC0+ZHN0LnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwgeGQtPmRzdC51dl9zdHJpZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidWlsZF80eDR1dm12cyh4ZCk7CisgICAgICAgIGJ1aWxkX2ludGVyNHg0X3ByZWRpY3RvcnNfbWIoeGQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3JlY29uaW50ZXIuaCBiL2xpYnZweC92cDgvY29tbW9uL3JlY29uaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzNjMDJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX1JFQ09OSU5URVJfSAorI2RlZmluZSBfX0lOQ19SRUNPTklOVEVSX0gKKworZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWIoTUFDUk9CTE9DS0QgKngpOworZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyMTZ4MTZfcHJlZGljdG9yc19tYihNQUNST0JMT0NLRCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdF91LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF95c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3V2c3RyaWRlKTsKKworCitleHRlcm4gdm9pZCB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21ieShNQUNST0JMT0NLRCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF95c3RyaWRlKTsKK2V4dGVybiB2b2lkIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoQkxPQ0tEICpkLCBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJhc2VfcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3N1YnBpeF9mbl90IHNwcGYpOworCitleHRlcm4gdm9pZCB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21idXYoTUFDUk9CTE9DS0QgKngpOworZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyNHg0X3ByZWRpY3RvcnNfbWJ1dihNQUNST0JMT0NLRCAqeCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRyYS5jIGIvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjdhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9yZWNvbmludHJhLmMKQEAgLTAsMCArMSwyODggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAiYmxvY2tkLmgiCisKK3ZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfYyhNQUNST0JMT0NLRCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB5YWJvdmVfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHlsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHlwcmVkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHlsZWZ0X2NvbFsxNl07CisgICAgdW5zaWduZWQgY2hhciB5dG9wX2xlZnQgPSB5YWJvdmVfcm93Wy0xXTsKKyAgICBpbnQgciwgYywgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgeWxlZnRfY29sW2ldID0geWxlZnRbaSogbGVmdF9zdHJpZGVdOworICAgIH0KKworICAgIC8qIGZvciBZICovCisgICAgc3dpdGNoICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlKQorICAgIHsKKyAgICBjYXNlIERDX1BSRUQ6CisgICAgeworICAgICAgICBpbnQgZXhwZWN0ZWRfZGM7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgc2hpZnQ7CisgICAgICAgIGludCBhdmVyYWdlID0gMDsKKworCisgICAgICAgIGlmICh4LT51cF9hdmFpbGFibGUgfHwgeC0+bGVmdF9hdmFpbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4LT51cF9hdmFpbGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdmVyYWdlICs9IHlhYm92ZV9yb3dbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoeC0+bGVmdF9hdmFpbGFibGUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UgKz0geWxlZnRfY29sW2ldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgc2hpZnQgPSAzICsgeC0+dXBfYXZhaWxhYmxlICsgeC0+bGVmdF9hdmFpbGFibGU7CisgICAgICAgICAgICBleHBlY3RlZF9kYyA9IChhdmVyYWdlICsgKDEgPDwgKHNoaWZ0IC0gMSkpKSA+PiBzaGlmdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4cGVjdGVkX2RjID0gMTI4OworICAgICAgICB9CisKKyAgICAgICAgLyp2cHhfbWVtc2V0KHlwcmVkX3B0ciwgZXhwZWN0ZWRfZGMsIDI1Nik7Ki8KKyAgICAgICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCBleHBlY3RlZF9kYywgMTYpOworICAgICAgICAgICAgeXByZWRfcHRyICs9IHlfc3RyaWRlOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVl9QUkVEOgorICAgIHsKKworICAgICAgICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKKyAgICAgICAgeworCisgICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbMF0gPSAoKGludCAqKXlhYm92ZV9yb3cpWzBdOworICAgICAgICAgICAgKChpbnQgKil5cHJlZF9wdHIpWzFdID0gKChpbnQgKil5YWJvdmVfcm93KVsxXTsKKyAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVsyXSA9ICgoaW50ICopeWFib3ZlX3JvdylbMl07CisgICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbM10gPSAoKGludCAqKXlhYm92ZV9yb3cpWzNdOworICAgICAgICAgICAgeXByZWRfcHRyICs9IHlfc3RyaWRlOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgSF9QUkVEOgorICAgIHsKKworICAgICAgICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKKyAgICAgICAgeworCisgICAgICAgICAgICB2cHhfbWVtc2V0KHlwcmVkX3B0ciwgeWxlZnRfY29sW3JdLCAxNik7CisgICAgICAgICAgICB5cHJlZF9wdHIgKz0geV9zdHJpZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIFRNX1BSRUQ6CisgICAgeworCisgICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMTY7IGMrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJlZCA9ICB5bGVmdF9jb2xbcl0gKyB5YWJvdmVfcm93WyBjXSAtIHl0b3BfbGVmdDsKKworICAgICAgICAgICAgICAgIGlmIChwcmVkIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlZCA+IDI1NSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDI1NTsKKworICAgICAgICAgICAgICAgIHlwcmVkX3B0cltjXSA9IHByZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHlwcmVkX3B0ciArPSB5X3N0cmlkZTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgQl9QUkVEOgorICAgIGNhc2UgTkVBUkVTVE1WOgorICAgIGNhc2UgTkVBUk1WOgorICAgIGNhc2UgWkVST01WOgorICAgIGNhc2UgTkVXTVY6CisgICAgY2FzZSBTUExJVE1WOgorICAgIGNhc2UgTUJfTU9ERV9DT1VOVDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfc19jKE1BQ1JPQkxPQ0tEICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogdWFib3ZlX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHZhYm92ZV9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB1bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB1cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB2cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkX3N0cmlkZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHVsZWZ0X2NvbFs4XTsKKyAgICB1bnNpZ25lZCBjaGFyIHV0b3BfbGVmdCA9IHVhYm92ZV9yb3dbLTFdOworICAgIHVuc2lnbmVkIGNoYXIgdmxlZnRfY29sWzhdOworICAgIHVuc2lnbmVkIGNoYXIgdnRvcF9sZWZ0ID0gdmFib3ZlX3Jvd1stMV07CisKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgICB1bGVmdF9jb2xbaV0gPSB1bGVmdCBbaSogbGVmdF9zdHJpZGVdOworICAgICAgICB2bGVmdF9jb2xbaV0gPSB2bGVmdCBbaSogbGVmdF9zdHJpZGVdOworICAgIH0KKworICAgIHN3aXRjaCAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSkKKyAgICB7CisgICAgY2FzZSBEQ19QUkVEOgorICAgIHsKKyAgICAgICAgaW50IGV4cGVjdGVkX3VkYzsKKyAgICAgICAgaW50IGV4cGVjdGVkX3ZkYzsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBzaGlmdDsKKyAgICAgICAgaW50IFVhdmVyYWdlID0gMDsKKyAgICAgICAgaW50IFZhdmVyYWdlID0gMDsKKworICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVhdmVyYWdlICs9IHVhYm92ZV9yb3dbaV07CisgICAgICAgICAgICAgICAgVmF2ZXJhZ2UgKz0gdmFib3ZlX3Jvd1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh4LT5sZWZ0X2F2YWlsYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVYXZlcmFnZSArPSB1bGVmdF9jb2xbaV07CisgICAgICAgICAgICAgICAgVmF2ZXJhZ2UgKz0gdmxlZnRfY29sW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCF4LT51cF9hdmFpbGFibGUgJiYgIXgtPmxlZnRfYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBleHBlY3RlZF91ZGMgPSAxMjg7CisgICAgICAgICAgICBleHBlY3RlZF92ZGMgPSAxMjg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzaGlmdCA9IDIgKyB4LT51cF9hdmFpbGFibGUgKyB4LT5sZWZ0X2F2YWlsYWJsZTsKKyAgICAgICAgICAgIGV4cGVjdGVkX3VkYyA9IChVYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7CisgICAgICAgICAgICBleHBlY3RlZF92ZGMgPSAoVmF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OworICAgICAgICB9CisKKworICAgICAgICAvKnZweF9tZW1zZXQodXByZWRfcHRyLGV4cGVjdGVkX3VkYyw2NCk7Ki8KKyAgICAgICAgLyp2cHhfbWVtc2V0KHZwcmVkX3B0cixleHBlY3RlZF92ZGMsNjQpOyovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZweF9tZW1zZXQodXByZWRfcHRyLCBleHBlY3RlZF91ZGMsIDgpOworICAgICAgICAgICAgdnB4X21lbXNldCh2cHJlZF9wdHIsIGV4cGVjdGVkX3ZkYywgOCk7CisgICAgICAgICAgICB1cHJlZF9wdHIgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgICAgICB2cHJlZF9wdHIgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBWX1BSRUQ6CisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2cHhfbWVtY3B5KHVwcmVkX3B0ciwgdWFib3ZlX3JvdywgOCk7CisgICAgICAgICAgICB2cHhfbWVtY3B5KHZwcmVkX3B0ciwgdmFib3ZlX3JvdywgOCk7CisgICAgICAgICAgICB1cHJlZF9wdHIgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgICAgICB2cHJlZF9wdHIgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIEhfUFJFRDoKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZweF9tZW1zZXQodXByZWRfcHRyLCB1bGVmdF9jb2xbaV0sIDgpOworICAgICAgICAgICAgdnB4X21lbXNldCh2cHJlZF9wdHIsIHZsZWZ0X2NvbFtpXSwgOCk7CisgICAgICAgICAgICB1cHJlZF9wdHIgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgICAgICB2cHJlZF9wdHIgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBicmVhazsKKyAgICBjYXNlIFRNX1BSRUQ6CisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwcmVkdSA9IHVsZWZ0X2NvbFtpXSArIHVhYm92ZV9yb3dbal0gLSB1dG9wX2xlZnQ7CisgICAgICAgICAgICAgICAgaW50IHByZWR2ID0gdmxlZnRfY29sW2ldICsgdmFib3ZlX3Jvd1tqXSAtIHZ0b3BfbGVmdDsKKworICAgICAgICAgICAgICAgIGlmIChwcmVkdSA8IDApCisgICAgICAgICAgICAgICAgICAgIHByZWR1ID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChwcmVkdSA+IDI1NSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZHUgPSAyNTU7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlZHYgPCAwKQorICAgICAgICAgICAgICAgICAgICBwcmVkdiA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlZHYgPiAyNTUpCisgICAgICAgICAgICAgICAgICAgIHByZWR2ID0gMjU1OworCisgICAgICAgICAgICAgICAgdXByZWRfcHRyW2pdID0gcHJlZHU7CisgICAgICAgICAgICAgICAgdnByZWRfcHRyW2pdID0gcHJlZHY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVwcmVkX3B0ciArPSBwcmVkX3N0cmlkZTsKKyAgICAgICAgICAgIHZwcmVkX3B0ciArPSBwcmVkX3N0cmlkZTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgQl9QUkVEOgorICAgIGNhc2UgTkVBUkVTVE1WOgorICAgIGNhc2UgTkVBUk1WOgorICAgIGNhc2UgWkVST01WOgorICAgIGNhc2UgTkVXTVY6CisgICAgY2FzZSBTUExJVE1WOgorICAgIGNhc2UgTUJfTU9ERV9DT1VOVDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5jIGIvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjhkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAiYmxvY2tkLmgiCisKK3ZvaWQgdnA4X2ludHJhNHg0X3ByZWRpY3RfYyh1bnNpZ25lZCBjaGFyICpBYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp5bGVmdCwgaW50IGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfUFJFRElDVElPTl9NT0RFIGJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdG9wX2xlZnQpCit7CisgICAgaW50IGksIHIsIGM7CisKKyAgICB1bnNpZ25lZCBjaGFyIExlZnRbNF07CisgICAgTGVmdFswXSA9IHlsZWZ0WzBdOworICAgIExlZnRbMV0gPSB5bGVmdFtsZWZ0X3N0cmlkZV07CisgICAgTGVmdFsyXSA9IHlsZWZ0WzIgKiBsZWZ0X3N0cmlkZV07CisgICAgTGVmdFszXSA9IHlsZWZ0WzMgKiBsZWZ0X3N0cmlkZV07CisKKyAgICBzd2l0Y2ggKGJfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCX0RDX1BSRUQ6CisgICAgeworICAgICAgICBpbnQgZXhwZWN0ZWRfZGMgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4cGVjdGVkX2RjICs9IEFib3ZlW2ldOworICAgICAgICAgICAgZXhwZWN0ZWRfZGMgKz0gTGVmdFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGV4cGVjdGVkX2RjID0gKGV4cGVjdGVkX2RjICsgNCkgPj4gMzsKKworICAgICAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtjXSA9IGV4cGVjdGVkX2RjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIEJfVE1fUFJFRDoKKyAgICB7CisgICAgICAgIC8qIHByZWRpY3Rpb24gc2ltaWxhciB0byB0cnVlX21vdGlvbiBwcmVkaWN0aW9uICovCisgICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHByZWQgPSBBYm92ZVtjXSAtIHRvcF9sZWZ0ICsgTGVmdFtyXTsKKworICAgICAgICAgICAgICAgIGlmIChwcmVkIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlZCA+IDI1NSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDI1NTsKKworICAgICAgICAgICAgICAgIGRzdFtjXSA9IHByZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBCX1ZFX1BSRUQ6CisgICAgeworCisgICAgICAgIHVuc2lnbmVkIGludCBhcFs0XTsKKyAgICAgICAgYXBbMF0gPSAodG9wX2xlZnQgICsgMiAqIEFib3ZlWzBdICsgQWJvdmVbMV0gKyAyKSA+PiAyOworICAgICAgICBhcFsxXSA9IChBYm92ZVswXSArIDIgKiBBYm92ZVsxXSArIEFib3ZlWzJdICsgMikgPj4gMjsKKyAgICAgICAgYXBbMl0gPSAoQWJvdmVbMV0gKyAyICogQWJvdmVbMl0gKyBBYm92ZVszXSArIDIpID4+IDI7CisgICAgICAgIGFwWzNdID0gKEFib3ZlWzJdICsgMiAqIEFib3ZlWzNdICsgQWJvdmVbNF0gKyAyKSA+PiAyOworCisgICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBkc3RbY10gPSBhcFtjXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBicmVhazsKKworCisgICAgY2FzZSBCX0hFX1BSRUQ6CisgICAgeworCisgICAgICAgIHVuc2lnbmVkIGludCBscFs0XTsKKyAgICAgICAgbHBbMF0gPSAodG9wX2xlZnQgKyAyICogTGVmdFswXSArIExlZnRbMV0gKyAyKSA+PiAyOworICAgICAgICBscFsxXSA9IChMZWZ0WzBdICsgMiAqIExlZnRbMV0gKyBMZWZ0WzJdICsgMikgPj4gMjsKKyAgICAgICAgbHBbMl0gPSAoTGVmdFsxXSArIDIgKiBMZWZ0WzJdICsgTGVmdFszXSArIDIpID4+IDI7CisgICAgICAgIGxwWzNdID0gKExlZnRbMl0gKyAyICogTGVmdFszXSArIExlZnRbM10gKyAyKSA+PiAyOworCisgICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2NdID0gbHBbcl07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgQl9MRF9QUkVEOgorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyID0gQWJvdmU7CisgICAgICAgIGRzdFswICogZHN0X3N0cmlkZSArIDBdID0gKHB0clswXSArIHB0clsxXSAqIDIgKyBwdHJbMl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAxXSA9CisgICAgICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAwXSA9IChwdHJbMV0gKyBwdHJbMl0gKiAyICsgcHRyWzNdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgMl0gPQorICAgICAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMV0gPQorICAgICAgICAgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDBdID0gKHB0clsyXSArIHB0clszXSAqIDIgKyBwdHJbNF0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAzXSA9CisgICAgICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAyXSA9CisgICAgICAgICAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMV0gPQorICAgICAgICAgICAgICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAwXSA9IChwdHJbM10gKyBwdHJbNF0gKiAyICsgcHRyWzVdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgM10gPQorICAgICAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMl0gPQorICAgICAgICAgICAgICAgIGRzdFszICogZHN0X3N0cmlkZSArIDFdID0gKHB0cls0XSArIHB0cls1XSAqIDIgKyBwdHJbNl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAzXSA9CisgICAgICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAyXSA9IChwdHJbNV0gKyBwdHJbNl0gKiAyICsgcHRyWzddICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgM10gPSAocHRyWzZdICsgcHRyWzddICogMiArIHB0cls3XSArIDIpID4+IDI7CisKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBCX1JEX1BSRUQ6CisgICAgeworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgcHBbOV07CisKKyAgICAgICAgcHBbMF0gPSBMZWZ0WzNdOworICAgICAgICBwcFsxXSA9IExlZnRbMl07CisgICAgICAgIHBwWzJdID0gTGVmdFsxXTsKKyAgICAgICAgcHBbM10gPSBMZWZ0WzBdOworICAgICAgICBwcFs0XSA9IHRvcF9sZWZ0OworICAgICAgICBwcFs1XSA9IEFib3ZlWzBdOworICAgICAgICBwcFs2XSA9IEFib3ZlWzFdOworICAgICAgICBwcFs3XSA9IEFib3ZlWzJdOworICAgICAgICBwcFs4XSA9IEFib3ZlWzNdOworCisgICAgICAgIGRzdFszICogZHN0X3N0cmlkZSArIDBdID0gKHBwWzBdICsgcHBbMV0gKiAyICsgcHBbMl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAxXSA9CisgICAgICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAwXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgMl0gPQorICAgICAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMV0gPQorICAgICAgICAgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDBdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbNF0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAzXSA9CisgICAgICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAyXSA9CisgICAgICAgICAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMV0gPQorICAgICAgICAgICAgICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAwXSA9IChwcFszXSArIHBwWzRdICogMiArIHBwWzVdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgM10gPQorICAgICAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMl0gPQorICAgICAgICAgICAgICAgIGRzdFswICogZHN0X3N0cmlkZSArIDFdID0gKHBwWzRdICsgcHBbNV0gKiAyICsgcHBbNl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAzXSA9CisgICAgICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAyXSA9IChwcFs1XSArIHBwWzZdICogMiArIHBwWzddICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgM10gPSAocHBbNl0gKyBwcFs3XSAqIDIgKyBwcFs4XSArIDIpID4+IDI7CisKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBCX1ZSX1BSRUQ6CisgICAgeworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgcHBbOV07CisKKyAgICAgICAgcHBbMF0gPSBMZWZ0WzNdOworICAgICAgICBwcFsxXSA9IExlZnRbMl07CisgICAgICAgIHBwWzJdID0gTGVmdFsxXTsKKyAgICAgICAgcHBbM10gPSBMZWZ0WzBdOworICAgICAgICBwcFs0XSA9IHRvcF9sZWZ0OworICAgICAgICBwcFs1XSA9IEFib3ZlWzBdOworICAgICAgICBwcFs2XSA9IEFib3ZlWzFdOworICAgICAgICBwcFs3XSA9IEFib3ZlWzJdOworICAgICAgICBwcFs4XSA9IEFib3ZlWzNdOworCisKKyAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgMF0gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7CisgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDBdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbNF0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAxXSA9CisgICAgICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAwXSA9IChwcFszXSArIHBwWzRdICogMiArIHBwWzVdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMV0gPQorICAgICAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgMF0gPSAocHBbNF0gKyBwcFs1XSArIDEpID4+IDE7CisgICAgICAgIGRzdFszICogZHN0X3N0cmlkZSArIDJdID0KKyAgICAgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDFdID0gKHBwWzRdICsgcHBbNV0gKiAyICsgcHBbNl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAyXSA9CisgICAgICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAxXSA9IChwcFs1XSArIHBwWzZdICsgMSkgPj4gMTsKKyAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgM10gPQorICAgICAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMl0gPSAocHBbNV0gKyBwcFs2XSAqIDIgKyBwcFs3XSArIDIpID4+IDI7CisgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDNdID0KKyAgICAgICAgICAgIGRzdFswICogZHN0X3N0cmlkZSArIDJdID0gKHBwWzZdICsgcHBbN10gKyAxKSA+PiAxOworICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAzXSA9IChwcFs2XSArIHBwWzddICogMiArIHBwWzhdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgM10gPSAocHBbN10gKyBwcFs4XSArIDEpID4+IDE7CisKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBCX1ZMX1BSRUQ6CisgICAgeworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwID0gQWJvdmU7CisKKyAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgMF0gPSAocHBbMF0gKyBwcFsxXSArIDEpID4+IDE7CisgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDBdID0gKHBwWzBdICsgcHBbMV0gKiAyICsgcHBbMl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAwXSA9CisgICAgICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAxXSA9IChwcFsxXSArIHBwWzJdICsgMSkgPj4gMTsKKyAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMV0gPQorICAgICAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgMF0gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7CisgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDFdID0KKyAgICAgICAgICAgIGRzdFswICogZHN0X3N0cmlkZSArIDJdID0gKHBwWzJdICsgcHBbM10gKyAxKSA+PiAxOworICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAxXSA9CisgICAgICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAyXSA9IChwcFsyXSArIHBwWzNdICogMiArIHBwWzRdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgM10gPQorICAgICAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMl0gPSAocHBbM10gKyBwcFs0XSArIDEpID4+IDE7CisgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDNdID0KKyAgICAgICAgICAgIGRzdFszICogZHN0X3N0cmlkZSArIDJdID0gKHBwWzNdICsgcHBbNF0gKiAyICsgcHBbNV0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAzXSA9IChwcFs0XSArIHBwWzVdICogMiArIHBwWzZdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgM10gPSAocHBbNV0gKyBwcFs2XSAqIDIgKyBwcFs3XSArIDIpID4+IDI7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBCX0hEX1BSRUQ6CisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHBwWzldOworICAgICAgICBwcFswXSA9IExlZnRbM107CisgICAgICAgIHBwWzFdID0gTGVmdFsyXTsKKyAgICAgICAgcHBbMl0gPSBMZWZ0WzFdOworICAgICAgICBwcFszXSA9IExlZnRbMF07CisgICAgICAgIHBwWzRdID0gdG9wX2xlZnQ7CisgICAgICAgIHBwWzVdID0gQWJvdmVbMF07CisgICAgICAgIHBwWzZdID0gQWJvdmVbMV07CisgICAgICAgIHBwWzddID0gQWJvdmVbMl07CisgICAgICAgIHBwWzhdID0gQWJvdmVbM107CisKKworICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAwXSA9IChwcFswXSArIHBwWzFdICsgMSkgPj4gMTsKKyAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgMV0gPSAocHBbMF0gKyBwcFsxXSAqIDIgKyBwcFsyXSArIDIpID4+IDI7CisgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDBdID0KKyAgICAgICAgICAgIGRzdFszICogZHN0X3N0cmlkZSArIDJdID0gKHBwWzFdICsgcHBbMl0gKyAxKSA+PiAxOworICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAxXSA9CisgICAgICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAzXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMl0gPQorICAgICAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMF0gPSAocHBbMl0gKyBwcFszXSArIDEpID4+IDE7CisgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDNdID0KKyAgICAgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDFdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbNF0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAyXSA9CisgICAgICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAwXSA9IChwcFszXSArIHBwWzRdICsgMSkgPj4gMTsKKyAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgM10gPQorICAgICAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgMV0gPSAocHBbM10gKyBwcFs0XSAqIDIgKyBwcFs1XSArIDIpID4+IDI7CisgICAgICAgIGRzdFswICogZHN0X3N0cmlkZSArIDJdID0gKHBwWzRdICsgcHBbNV0gKiAyICsgcHBbNl0gKyAyKSA+PiAyOworICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAzXSA9IChwcFs1XSArIHBwWzZdICogMiArIHBwWzddICsgMikgPj4gMjsKKyAgICB9CisgICAgYnJlYWs7CisKKworICAgIGNhc2UgQl9IVV9QUkVEOgorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcHAgPSBMZWZ0OworICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAwXSA9IChwcFswXSArIHBwWzFdICsgMSkgPj4gMTsKKyAgICAgICAgZHN0WzAgKiBkc3Rfc3RyaWRlICsgMV0gPSAocHBbMF0gKyBwcFsxXSAqIDIgKyBwcFsyXSArIDIpID4+IDI7CisgICAgICAgIGRzdFswICogZHN0X3N0cmlkZSArIDJdID0KKyAgICAgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDBdID0gKHBwWzFdICsgcHBbMl0gKyAxKSA+PiAxOworICAgICAgICBkc3RbMCAqIGRzdF9zdHJpZGUgKyAzXSA9CisgICAgICAgICAgICBkc3RbMSAqIGRzdF9zdHJpZGUgKyAxXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKKyAgICAgICAgZHN0WzEgKiBkc3Rfc3RyaWRlICsgMl0gPQorICAgICAgICAgICAgZHN0WzIgKiBkc3Rfc3RyaWRlICsgMF0gPSAocHBbMl0gKyBwcFszXSArIDEpID4+IDE7CisgICAgICAgIGRzdFsxICogZHN0X3N0cmlkZSArIDNdID0KKyAgICAgICAgICAgIGRzdFsyICogZHN0X3N0cmlkZSArIDFdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbM10gKyAyKSA+PiAyOworICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAyXSA9CisgICAgICAgICAgICBkc3RbMiAqIGRzdF9zdHJpZGUgKyAzXSA9CisgICAgICAgICAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgMF0gPQorICAgICAgICAgICAgICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMyAqIGRzdF9zdHJpZGUgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzMgKiBkc3Rfc3RyaWRlICsgM10gPSBwcFszXTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5oIGIvbGlidnB4L3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjBkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgX19JTkNfUkVDT05JTlRSQTR4NF9ICisjZGVmaW5lIF9fSU5DX1JFQ09OSU5UUkE0eDRfSAorI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCisKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KE1BQ1JPQkxPQ0tEICp4ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmFib3ZlX3JpZ2h0X3NyYykKK3sKKyAgICBpbnQgZHN0X3N0cmlkZSA9IHhkLT5kc3QueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYWJvdmVfcmlnaHRfZHN0ID0geGQtPmRzdC55X2J1ZmZlciAtIGRzdF9zdHJpZGUgKyAxNjsKKworICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciA9ICh1bnNpZ25lZCBpbnQgKilhYm92ZV9yaWdodF9zcmM7CisgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyMCA9ICh1bnNpZ25lZCBpbnQgKikoYWJvdmVfcmlnaHRfZHN0ICsgNCAqIGRzdF9zdHJpZGUpOworICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjEgPSAodW5zaWduZWQgaW50ICopKGFib3ZlX3JpZ2h0X2RzdCArIDggKiBkc3Rfc3RyaWRlKTsKKyAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIyID0gKHVuc2lnbmVkIGludCAqKShhYm92ZV9yaWdodF9kc3QgKyAxMiAqIGRzdF9zdHJpZGUpOworCisgICAgKmRzdF9wdHIwID0gKnNyY19wdHI7CisgICAgKmRzdF9wdHIxID0gKnNyY19wdHI7CisgICAgKmRzdF9wdHIyID0gKnNyY19wdHI7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vcnRjZC5jIGIvbGlidnB4L3ZwOC9jb21tb24vcnRjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZGFkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9ydGNkLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjZGVmaW5lIFJUQ0RfQworI2luY2x1ZGUgInZweF9ydGNkLmgiCisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQgJiYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorc3RhdGljIHZvaWQgb25jZSh2b2lkICgqZnVuYykodm9pZCkpCit7CisgICAgc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gKmxvY2s7CisgICAgc3RhdGljIExPTkcgd2FpdGVyczsKKyAgICBzdGF0aWMgaW50IGRvbmU7CisgICAgdm9pZCAqbG9ja19wdHIgPSAmbG9jazsKKworICAgIC8qIElmIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZSwgcmV0dXJuIGVhcmx5LiBUaGlzIGlzbid0IGp1c3QgYW4KKyAgICAgKiBvcHRpbWl6YXRpb24sIGl0IHByZXZlbnRzIHJhY2VzIG9uIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZ2xvYmFsCisgICAgICogbG9jay4KKyAgICAgKi8KKyAgICBpZihkb25lKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRlcmxvY2tlZEluY3JlbWVudCgmd2FpdGVycyk7CisKKyAgICAvKiBHZXQgYSBsb2NrLiBXZSBjcmVhdGUgb25lIGFuZCB0cnkgdG8gbWFrZSBpdCB0aGUgb25lLXRydWUtbG9jaywKKyAgICAgKiB0aHJvd2luZyBpdCBhd2F5IGlmIHdlIGxvc3QgdGhlIHJhY2UuCisgICAgICovCisKKyAgICB7CisgICAgICAgIC8qIFNjb3BlIHRvIHByb3RlY3QgYWNjZXNzIHRvIG5ld19sb2NrICovCisgICAgICAgIENSSVRJQ0FMX1NFQ1RJT04gKm5ld19sb2NrID0gbWFsbG9jKHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CisgICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24obmV3X2xvY2spOworICAgICAgICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKGxvY2tfcHRyLCBuZXdfbG9jaywgTlVMTCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG5ld19sb2NrKTsKKyAgICAgICAgICAgIGZyZWUobmV3X2xvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIGxvY2sgdGhhdCBjYW4gYmUgc3luY2hyb25pemVkIG9uLiBXZSBkb24ndAorICAgICAqIGNhcmUgd2hpY2ggdGhyZWFkIGFjdHVhbGx5IHBlcmZvcm1lZCB0aGUgYWxsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKGxvY2spOworCisgICAgaWYgKCFkb25lKQorICAgIHsKKyAgICAgICAgZnVuYygpOworICAgICAgICBkb25lID0gMTsKKyAgICB9CisKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihsb2NrKTsKKworICAgIC8qIExhc3Qgb25lIG91dCBzaG91bGQgZnJlZSByZXNvdXJjZXMuIFRoZSBkZXN0cnVjdGVkIG9iamVjdHMgYXJlCisgICAgICogcHJvdGVjdGVkIGJ5IGNoZWNraW5nIGlmKGRvbmUpIGFib3ZlLgorICAgICAqLworICAgIGlmKCFJbnRlcmxvY2tlZERlY3JlbWVudCgmd2FpdGVycykpCisgICAgeworICAgICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24obG9jayk7CisgICAgICAgIGZyZWUobG9jayk7CisgICAgICAgIGxvY2sgPSBOVUxMOworICAgIH0KK30KKworCisjZWxpZiBDT05GSUdfTVVMVElUSFJFQUQgJiYgSEFWRV9QVEhSRUFEX0gKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitzdGF0aWMgdm9pZCBvbmNlKHZvaWQgKCpmdW5jKSh2b2lkKSkKK3sKKyAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgbG9jayA9IFBUSFJFQURfT05DRV9JTklUOworICAgIHB0aHJlYWRfb25jZSgmbG9jaywgZnVuYyk7Cit9CisKKworI2Vsc2UKKy8qIE5vLW9wIHZlcnNpb24gdGhhdCBwZXJmb3JtcyBubyBzeW5jaHJvbml6YXRpb24uIHZweF9ydGNkKCkgaXMgaWRlbXBvdGVudCwKKyAqIHNvIGFzIGxvbmcgYXMgeW91ciBwbGF0Zm9ybSBwcm92aWRlcyBhdG9taWMgbG9hZHMvc3RvcmVzIG9mIHBvaW50ZXJzCisgKiBubyBzeW5jaHJvbml6YXRpb24gaXMgc3RyaWN0bHkgbmVjZXNzYXJ5LgorICovCisKK3N0YXRpYyB2b2lkIG9uY2Uodm9pZCAoKmZ1bmMpKHZvaWQpKQoreworICAgIHN0YXRpYyBpbnQgZG9uZTsKKworICAgIGlmKCFkb25lKQorICAgIHsKKyAgICAgICAgZnVuYygpOworICAgICAgICBkb25lID0gMTsKKyAgICB9Cit9CisjZW5kaWYKKworCit2b2lkIHZweF9ydGNkKCkKK3sKKyAgICBvbmNlKHNldHVwX3J0Y2RfaW50ZXJuYWwpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vcnRjZF9kZWZzLnNoIGIvbGlidnB4L3ZwOC9jb21tb24vcnRjZF9kZWZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTUwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9ydGNkX2RlZnMuc2gKQEAgLTAsMCArMSw1NjggQEAKK2NvbW1vbl9mb3J3YXJkX2RlY2xzKCkgeworY2F0IDw8RU9GCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKworc3RydWN0IGJsb2NrZDsKK3N0cnVjdCBtYWNyb2Jsb2NrZDsKK3N0cnVjdCBsb29wX2ZpbHRlcl9pbmZvOworCisvKiBFbmNvZGVyIGZvcndhcmQgZGVjbHMgKi8KK3N0cnVjdCBibG9jazsKK3N0cnVjdCBtYWNyb2Jsb2NrOworc3RydWN0IHZhcmlhbmNlX3Z0YWJsZTsKK3VuaW9uIGludF9tdjsKK3N0cnVjdCB5djEyX2J1ZmZlcl9jb25maWc7CitFT0YKK30KK2ZvcndhcmRfZGVjbHMgY29tbW9uX2ZvcndhcmRfZGVjbHMKKworIworIyBEZXF1YW50CisjCitwcm90b3R5cGUgdm9pZCB2cDhfZGVxdWFudGl6ZV9iICJzdHJ1Y3QgYmxvY2tkKiwgc2hvcnQgKmRxYyIKK3NwZWNpYWxpemUgdnA4X2RlcXVhbnRpemVfYiBtbXggbWVkaWEgbmVvbgordnA4X2RlcXVhbnRpemVfYl9tZWRpYT12cDhfZGVxdWFudGl6ZV9iX3Y2CisKK3Byb3RvdHlwZSB2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkICJzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgc3RyaWRlIgorc3BlY2lhbGl6ZSB2cDhfZGVxdWFudF9pZGN0X2FkZCBtbXggbWVkaWEgbmVvbiBkc3ByMgordnA4X2RlcXVhbnRfaWRjdF9hZGRfbWVkaWE9dnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYKK3ZwOF9kZXF1YW50X2lkY3RfYWRkX2RzcHIyPXZwOF9kZXF1YW50X2lkY3RfYWRkX2RzcHIyCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sgInNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSwgY2hhciAqZW9icyIKK3NwZWNpYWxpemUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jayBtbXggc3NlMiBtZWRpYSBuZW9uIGRzcHIyCit2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX21lZGlhPXZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfdjYKK3ZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfZHNwcjI9dnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19kc3ByMgorCitwcm90b3R5cGUgdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayAic2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIHVuc2lnbmVkIGNoYXIgKmRzdF92LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzIgorc3BlY2lhbGl6ZSB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayBtbXggc3NlMiBtZWRpYSBuZW9uIGRzcHIyCit2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19tZWRpYT12cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja192NgordnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19kc3ByMj12cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2RzcHIyCisKKyMKKyMgTG9vcGZpbHRlcgorIworcHJvdG90eXBlIHZvaWQgdnA4X2xvb3BfZmlsdGVyX21idiAidW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkiCitzcGVjaWFsaXplIHZwOF9sb29wX2ZpbHRlcl9tYnYgbW14IHNzZTIgbWVkaWEgbmVvbiBkc3ByMgordnA4X2xvb3BfZmlsdGVyX21idl9tZWRpYT12cDhfbG9vcF9maWx0ZXJfbWJ2X2FybXY2Cit2cDhfbG9vcF9maWx0ZXJfbWJ2X2RzcHIyPXZwOF9sb29wX2ZpbHRlcl9tYnZfZHNwcjIKKworcHJvdG90eXBlIHZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2ICJ1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSIKK3NwZWNpYWxpemUgdnA4X2xvb3BfZmlsdGVyX2J2IG1teCBzc2UyIG1lZGlhIG5lb24gZHNwcjIKK3ZwOF9sb29wX2ZpbHRlcl9idl9tZWRpYT12cDhfbG9vcF9maWx0ZXJfYnZfYXJtdjYKK3ZwOF9sb29wX2ZpbHRlcl9idl9kc3ByMj12cDhfbG9vcF9maWx0ZXJfYnZfZHNwcjIKKworcHJvdG90eXBlIHZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaCAidW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkiCitzcGVjaWFsaXplIHZwOF9sb29wX2ZpbHRlcl9tYmggbW14IHNzZTIgbWVkaWEgbmVvbiBkc3ByMgordnA4X2xvb3BfZmlsdGVyX21iaF9tZWRpYT12cDhfbG9vcF9maWx0ZXJfbWJoX2FybXY2Cit2cDhfbG9vcF9maWx0ZXJfbWJoX2RzcHIyPXZwOF9sb29wX2ZpbHRlcl9tYmhfZHNwcjIKKworcHJvdG90eXBlIHZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoICJ1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSIKK3NwZWNpYWxpemUgdnA4X2xvb3BfZmlsdGVyX2JoIG1teCBzc2UyIG1lZGlhIG5lb24gZHNwcjIKK3ZwOF9sb29wX2ZpbHRlcl9iaF9tZWRpYT12cDhfbG9vcF9maWx0ZXJfYmhfYXJtdjYKK3ZwOF9sb29wX2ZpbHRlcl9iaF9kc3ByMj12cDhfbG9vcF9maWx0ZXJfYmhfZHNwcjIKKworCitwcm90b3R5cGUgdm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21idiAidW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCIKK3NwZWNpYWxpemUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYnYgbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYnZfYz12cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYwordnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYnZfbW14PXZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9tbXgKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJ2X3NzZTI9dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJ2X21lZGlhPXZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9hcm12NgordnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYnZfbmVvbj12cDhfbG9vcF9maWx0ZXJfbWJ2c19uZW9uCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoICJ1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0Igorc3BlY2lhbGl6ZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21iaCBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21iaF9jPXZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoX21teD12cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9tbXgKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoX3NzZTI9dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2Vfc3NlMgordnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYmhfbWVkaWE9dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYXJtdjYKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoX25lb249dnA4X2xvb3BfZmlsdGVyX21iaHNfbmVvbgorCitwcm90b3R5cGUgdm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2J2ICJ1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0Igorc3BlY2lhbGl6ZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2J2IG1teCBzc2UyIG1lZGlhIG5lb24KK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnZfYz12cDhfbG9vcF9maWx0ZXJfYnZzX2MKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnZfbW14PXZwOF9sb29wX2ZpbHRlcl9idnNfbW14Cit2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2J2X3NzZTI9dnA4X2xvb3BfZmlsdGVyX2J2c19zc2UyCit2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2J2X21lZGlhPXZwOF9sb29wX2ZpbHRlcl9idnNfYXJtdjYKK3ZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnZfbmVvbj12cDhfbG9vcF9maWx0ZXJfYnZzX25lb24KKworcHJvdG90eXBlIHZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaCAidW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCIKK3NwZWNpYWxpemUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaCBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2JoX2M9dnA4X2xvb3BfZmlsdGVyX2Joc19jCit2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2JoX21teD12cDhfbG9vcF9maWx0ZXJfYmhzX21teAordnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaF9zc2UyPXZwOF9sb29wX2ZpbHRlcl9iaHNfc3NlMgordnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9iaF9tZWRpYT12cDhfbG9vcF9maWx0ZXJfYmhzX2FybXY2Cit2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2JoX25lb249dnA4X2xvb3BfZmlsdGVyX2Joc19uZW9uCisKKyMKKyMgSURDVAorIworI2lkY3QxNgorcHJvdG90eXBlIHZvaWQgdnA4X3Nob3J0X2lkY3Q0eDRsbG0gInNob3J0ICppbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHBpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlIgorc3BlY2lhbGl6ZSB2cDhfc2hvcnRfaWRjdDR4NGxsbSBtbXggbWVkaWEgbmVvbiBkc3ByMgordnA4X3Nob3J0X2lkY3Q0eDRsbG1fbWVkaWE9dnA4X3Nob3J0X2lkY3Q0eDRsbG1fdjZfZHVhbAordnA4X3Nob3J0X2lkY3Q0eDRsbG1fZHNwcjI9dnA4X3Nob3J0X2lkY3Q0eDRsbG1fZHNwcjIKKworI2l3YWxzaDEKK3Byb3RvdHlwZSB2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMSAic2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0Igorc3BlY2lhbGl6ZSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzEgZHNwcjIKK3ZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9kc3ByMj12cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfZHNwcjIKKyMgbm8gYXNtIHlldAorCisjaXdhbHNoMTYKK3Byb3RvdHlwZSB2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDQgInNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCIKK3NwZWNpYWxpemUgdnA4X3Nob3J0X2ludl93YWxzaDR4NCBtbXggc3NlMiBtZWRpYSBuZW9uIGRzcHIyCit2cDhfc2hvcnRfaW52X3dhbHNoNHg0X21lZGlhPXZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjYKK3ZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfZHNwcjI9dnA4X3Nob3J0X2ludl93YWxzaDR4NF9kc3ByMgorCisjaWRjdDFfc2NhbGFyX2FkZAorcHJvdG90eXBlIHZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGQgInNob3J0IGlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUiCitzcGVjaWFsaXplIHZwOF9kY19vbmx5X2lkY3RfYWRkCW1teCBtZWRpYSBuZW9uIGRzcHIyCit2cDhfZGNfb25seV9pZGN0X2FkZF9tZWRpYT12cDhfZGNfb25seV9pZGN0X2FkZF92NgordnA4X2RjX29ubHlfaWRjdF9hZGRfZHNwcjI9dnA4X2RjX29ubHlfaWRjdF9hZGRfZHNwcjIKKworIworIyBSRUNPTgorIworcHJvdG90eXBlIHZvaWQgdnA4X2NvcHlfbWVtMTZ4MTYgInVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoIgorc3BlY2lhbGl6ZSB2cDhfY29weV9tZW0xNngxNiBtbXggc3NlMiBtZWRpYSBuZW9uIGRzcHIyCit2cDhfY29weV9tZW0xNngxNl9tZWRpYT12cDhfY29weV9tZW0xNngxNl92NgordnA4X2NvcHlfbWVtMTZ4MTZfZHNwcjI9dnA4X2NvcHlfbWVtMTZ4MTZfZHNwcjIKKworcHJvdG90eXBlIHZvaWQgdnA4X2NvcHlfbWVtOHg4ICJ1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCIKK3NwZWNpYWxpemUgdnA4X2NvcHlfbWVtOHg4IG1teCBtZWRpYSBuZW9uIGRzcHIyCit2cDhfY29weV9tZW04eDhfbWVkaWE9dnA4X2NvcHlfbWVtOHg4X3Y2Cit2cDhfY29weV9tZW04eDhfZHNwcjI9dnA4X2NvcHlfbWVtOHg4X2RzcHIyCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9jb3B5X21lbTh4NCAidW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2giCitzcGVjaWFsaXplIHZwOF9jb3B5X21lbTh4NCBtbXggbWVkaWEgbmVvbiBkc3ByMgordnA4X2NvcHlfbWVtOHg0X21lZGlhPXZwOF9jb3B5X21lbTh4NF92NgordnA4X2NvcHlfbWVtOHg0X2RzcHIyPXZwOF9jb3B5X21lbTh4NF9kc3ByMgorCitwcm90b3R5cGUgdm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyAic3RydWN0IG1hY3JvYmxvY2tkICp4LCB1bnNpZ25lZCBjaGFyICogeWFib3ZlX3JvdywgdW5zaWduZWQgY2hhciAqIHlsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKiB5cHJlZF9wdHIsIGludCB5X3N0cmlkZSIKK3NwZWNpYWxpemUgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3Mgc3NlMiBzc3NlMworI1RPRE86IGZpeCBhc3NlbWJseSBmb3IgbmVvbgorCitwcm90b3R5cGUgdm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MgInN0cnVjdCBtYWNyb2Jsb2NrZCAqeCwgdW5zaWduZWQgY2hhciAqIHVhYm92ZV9yb3csIHVuc2lnbmVkIGNoYXIgKiB2YWJvdmVfcm93LCAgdW5zaWduZWQgY2hhciAqdWxlZnQsIHVuc2lnbmVkIGNoYXIgKnZsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKiB1cHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKiB2cHJlZF9wdHIsIGludCBwcmVkX3N0cmlkZSIKK3NwZWNpYWxpemUgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zIHNzZTIgc3NzZTMKKworcHJvdG90eXBlIHZvaWQgdnA4X2ludHJhNHg0X3ByZWRpY3QgInVuc2lnbmVkIGNoYXIgKkFib3ZlLCB1bnNpZ25lZCBjaGFyICp5bGVmdCwgaW50IGxlZnRfc3RyaWRlLCBCX1BSRURJQ1RJT05fTU9ERSBiX21vZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgdG9wX2xlZnQiCitzcGVjaWFsaXplIHZwOF9pbnRyYTR4NF9wcmVkaWN0IG1lZGlhCit2cDhfaW50cmE0eDRfcHJlZGljdF9tZWRpYT12cDhfaW50cmE0eDRfcHJlZGljdF9hcm12NgorCisjCisjIFBvc3Rwcm9jCisjCitpZiBbICIkQ09ORklHX1BPU1RQUk9DIiA9ICJ5ZXMiIF07IHRoZW4KKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfbWJwb3N0X3Byb2NfZG93biAidW5zaWduZWQgY2hhciAqZHN0LCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scyxpbnQgZmxpbWl0IgorICAgIHNwZWNpYWxpemUgdnA4X21icG9zdF9wcm9jX2Rvd24gbW14IHNzZTIKKyAgICB2cDhfbWJwb3N0X3Byb2NfZG93bl9zc2UyPXZwOF9tYnBvc3RfcHJvY19kb3duX3htbQorCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcCAidW5zaWduZWQgY2hhciAqZHN0LCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scyxpbnQgZmxpbWl0IgorICAgIHNwZWNpYWxpemUgdnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcCBzc2UyCisgICAgdnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF9zc2UyPXZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tCisKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tYl9yb3cgInVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgY29scywgdW5zaWduZWQgY2hhciAqZmxpbWl0cywgaW50IHNpemUiCisgICAgc3BlY2lhbGl6ZSB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tYl9yb3cgc3NlMgorCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X3BsYW5lX2FkZF9ub2lzZSAidW5zaWduZWQgY2hhciAqcywgY2hhciAqbm9pc2UsIGNoYXIgYmxhY2tjbGFtcFsxNl0sIGNoYXIgd2hpdGVjbGFtcFsxNl0sIGNoYXIgYm90aGNsYW1wWzE2XSwgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBpbnQgcGl0Y2giCisgICAgc3BlY2lhbGl6ZSB2cDhfcGxhbmVfYWRkX25vaXNlIG1teCBzc2UyCisgICAgdnA4X3BsYW5lX2FkZF9ub2lzZV9zc2UyPXZwOF9wbGFuZV9hZGRfbm9pc2Vfd210CisKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfYmxlbmRfbWJfaW5uZXIgInVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5MSwgaW50IHUxLCBpbnQgdjEsIGludCBhbHBoYSwgaW50IHN0cmlkZSIKKyAgICAjIG5vIGFzbSB5ZXQKKworICAgIHByb3RvdHlwZSB2b2lkIHZwOF9ibGVuZF9tYl9vdXRlciAidW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHkxLCBpbnQgdTEsIGludCB2MSwgaW50IGFscGhhLCBpbnQgc3RyaWRlIgorICAgICMgbm8gYXNtIHlldAorCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X2JsZW5kX2IgInVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5MSwgaW50IHUxLCBpbnQgdjEsIGludCBhbHBoYSwgaW50IHN0cmlkZSIKKyAgICAjIG5vIGFzbSB5ZXQKKworICAgIHByb3RvdHlwZSB2b2lkIHZwOF9maWx0ZXJfYnlfd2VpZ2h0MTZ4MTYgInVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfd2VpZ2h0IgorICAgIHNwZWNpYWxpemUgdnA4X2ZpbHRlcl9ieV93ZWlnaHQxNngxNiBzc2UyCisKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfZmlsdGVyX2J5X3dlaWdodDh4OCAidW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY193ZWlnaHQiCisgICAgc3BlY2lhbGl6ZSB2cDhfZmlsdGVyX2J5X3dlaWdodDh4OCBzc2UyCisKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfZmlsdGVyX2J5X3dlaWdodDR4NCAidW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY193ZWlnaHQiCisgICAgIyBubyBhc20geWV0CitmaQorCisjCisjIFN1YnBpeGVsCisjCitwcm90b3R5cGUgdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiAidW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoIgorc3BlY2lhbGl6ZSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiBtbXggc3NlMiBzc3NlMyBtZWRpYSBuZW9uIGRzcHIyCit2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9tZWRpYT12cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9hcm12NgordnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfZHNwcjI9dnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfZHNwcjIKKworcHJvdG90eXBlIHZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4ICJ1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2giCitzcGVjaWFsaXplIHZwOF9zaXh0YXBfcHJlZGljdDh4OCBtbXggc3NlMiBzc3NlMyBtZWRpYSBuZW9uIGRzcHIyCit2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfbWVkaWE9dnA4X3NpeHRhcF9wcmVkaWN0OHg4X2FybXY2Cit2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfZHNwcjI9dnA4X3NpeHRhcF9wcmVkaWN0OHg4X2RzcHIyCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NCAidW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoIgorc3BlY2lhbGl6ZSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDQgbW14IHNzZTIgc3NzZTMgbWVkaWEgbmVvbiBkc3ByMgordnA4X3NpeHRhcF9wcmVkaWN0OHg0X21lZGlhPXZwOF9zaXh0YXBfcHJlZGljdDh4NF9hcm12NgordnA4X3NpeHRhcF9wcmVkaWN0OHg0X2RzcHIyPXZwOF9zaXh0YXBfcHJlZGljdDh4NF9kc3ByMgorCitwcm90b3R5cGUgdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDQgInVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCIKK3NwZWNpYWxpemUgdnA4X3NpeHRhcF9wcmVkaWN0NHg0IG1teCBzc3NlMyBtZWRpYSBuZW9uIGRzcHIyCit2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfbWVkaWE9dnA4X3NpeHRhcF9wcmVkaWN0NHg0X2FybXY2Cit2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfZHNwcjI9dnA4X3NpeHRhcF9wcmVkaWN0NHg0X2RzcHIyCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTYgInVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCIKK3NwZWNpYWxpemUgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNiBtbXggc3NlMiBzc3NlMyBtZWRpYSBuZW9uCit2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X21lZGlhPXZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYXJtdjYKKworcHJvdG90eXBlIHZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDggInVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCIKK3NwZWNpYWxpemUgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDggbW14IHNzZTIgc3NzZTMgbWVkaWEgbmVvbgordnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbWVkaWE9dnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYXJtdjYKKworcHJvdG90eXBlIHZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDQgInVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCIKK3NwZWNpYWxpemUgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDQgbW14IG1lZGlhIG5lb24KK3ZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X21lZGlhPXZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2FybXY2CisKK3Byb3RvdHlwZSB2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0ICJ1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2giCitzcGVjaWFsaXplIHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0IG1teCBtZWRpYSBuZW9uCit2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9tZWRpYT12cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9hcm12NgorCisjCisjIFdob2xlLXBpeGVsIFZhcmlhbmNlCisjCitwcm90b3R5cGUgdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTR4NCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF92YXJpYW5jZTR4NCBtbXggc3NlMgordnA4X3ZhcmlhbmNlNHg0X3NzZTI9dnA4X3ZhcmlhbmNlNHg0X3dtdAorCitwcm90b3R5cGUgdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4OCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF92YXJpYW5jZTh4OCBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfdmFyaWFuY2U4eDhfc3NlMj12cDhfdmFyaWFuY2U4eDhfd210Cit2cDhfdmFyaWFuY2U4eDhfbWVkaWE9dnA4X3ZhcmlhbmNlOHg4X2FybXY2CisKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHgxNiAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF92YXJpYW5jZTh4MTYgbW14IHNzZTIgbmVvbgordnA4X3ZhcmlhbmNlOHgxNl9zc2UyPXZwOF92YXJpYW5jZTh4MTZfd210CisKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF92YXJpYW5jZTE2eDggbW14IHNzZTIgbmVvbgordnA4X3ZhcmlhbmNlMTZ4OF9zc2UyPXZwOF92YXJpYW5jZTE2eDhfd210CisKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4MTYgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfdmFyaWFuY2UxNngxNiBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfdmFyaWFuY2UxNngxNl9zc2UyPXZwOF92YXJpYW5jZTE2eDE2X3dtdAordnA4X3ZhcmlhbmNlMTZ4MTZfbWVkaWE9dnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYKKworIworIyBTdWItcGl4ZWwgVmFyaWFuY2UKKyMKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NCAiY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0IG1teCBzc2UyCit2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X3NzZTI9dnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4ICJjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDggbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9zc2UyPXZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfd210Cit2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X21lZGlhPXZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYXJtdjYKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNiAiY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNiBtbXggc3NlMgordnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfc3NlMj12cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OCAiY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OCBtbXggc3NlMiBzc3NlMwordnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfc3NlMj12cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTYgImNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSIKK3NwZWNpYWxpemUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2IG1teCBzc2UyIHNzc2UzIG1lZGlhIG5lb24KK3ZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9zc2UyPXZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl93bXQKK3ZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9tZWRpYT12cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYXJtdjYKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX3NzZTI9dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX3dtdAordnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX21lZGlhPXZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9hcm12NgorCitwcm90b3R5cGUgdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdiAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdiBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3Zfc3NlMj12cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3Zfd210Cit2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbWVkaWE9dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2CisKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odiAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UiCitzcGVjaWFsaXplIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYgbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9zc2UyPXZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfd210Cit2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X21lZGlhPXZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjYKKworIworIyBTaW5nbGUgYmxvY2sgU0FECisjCitwcm90b3R5cGUgdW5zaWduZWQgaW50IHZwOF9zYWQ0eDQgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQiCitzcGVjaWFsaXplIHZwOF9zYWQ0eDQgbW14IHNzZTIgbmVvbgordnA4X3NhZDR4NF9zc2UyPXZwOF9zYWQ0eDRfd210CisKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3NhZDh4OCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCIKK3NwZWNpYWxpemUgdnA4X3NhZDh4OCBtbXggc3NlMiBuZW9uCit2cDhfc2FkOHg4X3NzZTI9dnA4X3NhZDh4OF93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc2FkOHgxNiAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCIKK3NwZWNpYWxpemUgdnA4X3NhZDh4MTYgbW14IHNzZTIgbmVvbgordnA4X3NhZDh4MTZfc3NlMj12cDhfc2FkOHgxNl93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc2FkMTZ4OCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCIKK3NwZWNpYWxpemUgdnA4X3NhZDE2eDggbW14IHNzZTIgbmVvbgordnA4X3NhZDE2eDhfc3NlMj12cDhfc2FkMTZ4OF93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfc2FkMTZ4MTYgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQiCitzcGVjaWFsaXplIHZwOF9zYWQxNngxNiBtbXggc3NlMiBzc2UzIG1lZGlhIG5lb24KK3ZwOF9zYWQxNngxNl9zc2UyPXZwOF9zYWQxNngxNl93bXQKK3ZwOF9zYWQxNngxNl9tZWRpYT12cDhfc2FkMTZ4MTZfYXJtdjYKKworIworIyBNdWx0aS1ibG9jayBTQUQsIGNvbXBhcmluZyBhIHJlZmVyZW5jZSB0byBOIGJsb2NrcyAxIHBpeGVsIGFwYXJ0IGhvcml6b250YWxseQorIworcHJvdG90eXBlIHZvaWQgdnA4X3NhZDR4NHgzICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDR4NHgzIHNzZTMKKworcHJvdG90eXBlIHZvaWQgdnA4X3NhZDh4OHgzICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDh4OHgzIHNzZTMKKworcHJvdG90eXBlIHZvaWQgdnA4X3NhZDh4MTZ4MyAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkiCitzcGVjaWFsaXplIHZwOF9zYWQ4eDE2eDMgc3NlMworCitwcm90b3R5cGUgdm9pZCB2cDhfc2FkMTZ4OHgzICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDE2eDh4MyBzc2UzIHNzc2UzCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zYWQxNngxNngzICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDE2eDE2eDMgc3NlMyBzc3NlMworCisjIE5vdGUgdGhlIG9ubHkgZGlmZmVyZW5jZSBpbiB0aGUgZm9sbG93aW5nIHByb3RvdHlwZXMgaXMgdGhhdCB0aGV5IHJldHVybiBpbnRvCisjIGFuIGFycmF5IG9mIHNob3J0Citwcm90b3R5cGUgdm9pZCB2cDhfc2FkNHg0eDggImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkiCitzcGVjaWFsaXplIHZwOF9zYWQ0eDR4OCBzc2U0XzEKK3ZwOF9zYWQ0eDR4OF9zc2U0XzE9dnA4X3NhZDR4NHg4X3NzZTQKKworcHJvdG90eXBlIHZvaWQgdnA4X3NhZDh4OHg4ICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Igorc3BlY2lhbGl6ZSB2cDhfc2FkOHg4eDggc3NlNF8xCit2cDhfc2FkOHg4eDhfc3NlNF8xPXZwOF9zYWQ4eDh4OF9zc2U0CisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zYWQ4eDE2eDggImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkiCitzcGVjaWFsaXplIHZwOF9zYWQ4eDE2eDggc3NlNF8xCit2cDhfc2FkOHgxNng4X3NzZTRfMT12cDhfc2FkOHgxNng4X3NzZTQKKworcHJvdG90eXBlIHZvaWQgdnA4X3NhZDE2eDh4OCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDE2eDh4OCBzc2U0XzEKK3ZwOF9zYWQxNng4eDhfc3NlNF8xPXZwOF9zYWQxNng4eDhfc3NlNAorCitwcm90b3R5cGUgdm9pZCB2cDhfc2FkMTZ4MTZ4OCAiY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDE2eDE2eDggc3NlNF8xCit2cDhfc2FkMTZ4MTZ4OF9zc2U0XzE9dnA4X3NhZDE2eDE2eDhfc3NlNAorCisjCisjIE11bHRpLWJsb2NrIFNBRCwgY29tcGFyaW5nIGEgcmVmZXJlbmNlIHRvIE4gaW5kZXBlbmRlbnQgYmxvY2tzCisjCitwcm90b3R5cGUgdm9pZCB2cDhfc2FkNHg0eDRkICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDR4NHg0ZCBzc2UzCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zYWQ4eDh4NGQgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5Igorc3BlY2lhbGl6ZSB2cDhfc2FkOHg4eDRkIHNzZTMKKworcHJvdG90eXBlIHZvaWQgdnA4X3NhZDh4MTZ4NGQgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5Igorc3BlY2lhbGl6ZSB2cDhfc2FkOHgxNng0ZCBzc2UzCisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zYWQxNng4eDRkICJjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSIKK3NwZWNpYWxpemUgdnA4X3NhZDE2eDh4NGQgc3NlMworCitwcm90b3R5cGUgdm9pZCB2cDhfc2FkMTZ4MTZ4NGQgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5Igorc3BlY2lhbGl6ZSB2cDhfc2FkMTZ4MTZ4NGQgc3NlMworCisjCisjIEVuY29kZXIgZnVuY3Rpb25zIGJlbG93IHRoaXMgcG9pbnQuCisjCitpZiBbICIkQ09ORklHX1ZQOF9FTkNPREVSIiA9ICJ5ZXMiIF07IHRoZW4KKworIworIyBTdW0gb2Ygc3F1YXJlcyAodmVjdG9yKQorIworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfZ2V0X21iX3NzICJjb25zdCBzaG9ydCAqIgorc3BlY2lhbGl6ZSB2cDhfZ2V0X21iX3NzIG1teCBzc2UyCisKKyMKKyMgU1NFIChTdW0gU3F1YXJlZCBFcnJvcikKKyMKK3Byb3RvdHlwZSB1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF9tc2UxNngxNiAiY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfc3ViX3BpeGVsX21zZTE2eDE2IG1teCBzc2UyCit2cDhfc3ViX3BpeGVsX21zZTE2eDE2X3NzZTI9dnA4X3N1Yl9waXhlbF9tc2UxNngxNl93bXQKKworcHJvdG90eXBlIHVuc2lnbmVkIGludCB2cDhfbXNlMTZ4MTYgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlIgorc3BlY2lhbGl6ZSB2cDhfbXNlMTZ4MTYgbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X21zZTE2eDE2X3NzZTI9dnA4X21zZTE2eDE2X3dtdAordnA4X21zZTE2eDE2X21lZGlhPXZwOF9tc2UxNngxNl9hcm12NgorCitwcm90b3R5cGUgdW5zaWduZWQgaW50IHZwOF9nZXQ0eDRzc2VfY3MgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUiCitzcGVjaWFsaXplIHZwOF9nZXQ0eDRzc2VfY3MgbW14IG5lb24KKworIworIyBCbG9jayBjb3B5CisjCitjYXNlICRhcmNoIGluCisgICAgeDg2KikKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfY29weTMyeG4gImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgaW50IG4iCisgICAgc3BlY2lhbGl6ZSB2cDhfY29weTMyeG4gc3NlMiBzc2UzCisgICAgOzsKK2VzYWMKKworIworIyBTdHJ1Y3R1cmVkIFNpbWlsYXJpdHkgKFNTSU0pCisjCitpZiBbICIkQ09ORklHX0lOVEVSTkFMX1NUQVRTIiA9ICJ5ZXMiIF07IHRoZW4KKyAgICBbICRhcmNoID0gIng4Nl82NCIgXSAmJiBzc2UyX29uX3g4Nl82ND1zc2UyCisKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfc3NpbV9wYXJtc184eDggInVuc2lnbmVkIGNoYXIgKnMsIGludCBzcCwgdW5zaWduZWQgY2hhciAqciwgaW50IHJwLCB1bnNpZ25lZCBsb25nICpzdW1fcywgdW5zaWduZWQgbG9uZyAqc3VtX3IsIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9zLCB1bnNpZ25lZCBsb25nICpzdW1fc3FfciwgdW5zaWduZWQgbG9uZyAqc3VtX3N4ciIKKyAgICBzcGVjaWFsaXplIHZwOF9zc2ltX3Bhcm1zXzh4OCAkc3NlMl9vbl94ODZfNjQKKworICAgIHByb3RvdHlwZSB2b2lkIHZwOF9zc2ltX3Bhcm1zXzE2eDE2ICJ1bnNpZ25lZCBjaGFyICpzLCBpbnQgc3AsIHVuc2lnbmVkIGNoYXIgKnIsIGludCBycCwgdW5zaWduZWQgbG9uZyAqc3VtX3MsIHVuc2lnbmVkIGxvbmcgKnN1bV9yLCB1bnNpZ25lZCBsb25nICpzdW1fc3FfcywgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3IsIHVuc2lnbmVkIGxvbmcgKnN1bV9zeHIiCisgICAgc3BlY2lhbGl6ZSB2cDhfc3NpbV9wYXJtc18xNngxNiAkc3NlMl9vbl94ODZfNjQKK2ZpCisKKyMKKyMgRm9yd2FyZCBEQ1QKKyMKK3Byb3RvdHlwZSB2b2lkIHZwOF9zaG9ydF9mZGN0NHg0ICJzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCIKK3NwZWNpYWxpemUgdnA4X3Nob3J0X2ZkY3Q0eDQgbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X3Nob3J0X2ZkY3Q0eDRfbWVkaWE9dnA4X3Nob3J0X2ZkY3Q0eDRfYXJtdjYKKworcHJvdG90eXBlIHZvaWQgdnA4X3Nob3J0X2ZkY3Q4eDQgInNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoIgorc3BlY2lhbGl6ZSB2cDhfc2hvcnRfZmRjdDh4NCBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfc2hvcnRfZmRjdDh4NF9tZWRpYT12cDhfc2hvcnRfZmRjdDh4NF9hcm12NgorCitwcm90b3R5cGUgdm9pZCB2cDhfc2hvcnRfd2Fsc2g0eDQgInNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoIgorc3BlY2lhbGl6ZSB2cDhfc2hvcnRfd2Fsc2g0eDQgc3NlMiBtZWRpYSBuZW9uCit2cDhfc2hvcnRfd2Fsc2g0eDRfbWVkaWE9dnA4X3Nob3J0X3dhbHNoNHg0X2FybXY2CisKKyMKKyMgUXVhbnRpemVyCisjCitwcm90b3R5cGUgdm9pZCB2cDhfcmVndWxhcl9xdWFudGl6ZV9iICJzdHJ1Y3QgYmxvY2sgKiwgc3RydWN0IGJsb2NrZCAqIgorc3BlY2lhbGl6ZSB2cDhfcmVndWxhcl9xdWFudGl6ZV9iIHNzZTIgc3NlNF8xCit2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTRfMT12cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTQKKworcHJvdG90eXBlIHZvaWQgdnA4X2Zhc3RfcXVhbnRpemVfYiAic3RydWN0IGJsb2NrICosIHN0cnVjdCBibG9ja2QgKiIKK3NwZWNpYWxpemUgdnA4X2Zhc3RfcXVhbnRpemVfYiBzc2UyIHNzc2UzIG1lZGlhIG5lb24KK3ZwOF9mYXN0X3F1YW50aXplX2JfbWVkaWE9dnA4X2Zhc3RfcXVhbnRpemVfYl9hcm12NgorCitwcm90b3R5cGUgdm9pZCB2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3BhaXIgInN0cnVjdCBibG9jayAqYjEsIHN0cnVjdCBibG9jayAqYjIsIHN0cnVjdCBibG9ja2QgKmQxLCBzdHJ1Y3QgYmxvY2tkICpkMiIKKyMgbm8gYXNtIHlldAorCitwcm90b3R5cGUgdm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX3BhaXIgInN0cnVjdCBibG9jayAqYjEsIHN0cnVjdCBibG9jayAqYjIsIHN0cnVjdCBibG9ja2QgKmQxLCBzdHJ1Y3QgYmxvY2tkICpkMiIKK3NwZWNpYWxpemUgdnA4X2Zhc3RfcXVhbnRpemVfYl9wYWlyIG5lb24KKworcHJvdG90eXBlIHZvaWQgdnA4X3F1YW50aXplX21iICJzdHJ1Y3QgbWFjcm9ibG9jayAqIgorc3BlY2lhbGl6ZSB2cDhfcXVhbnRpemVfbWIgbmVvbgorCitwcm90b3R5cGUgdm9pZCB2cDhfcXVhbnRpemVfbWJ5ICJzdHJ1Y3QgbWFjcm9ibG9jayAqIgorc3BlY2lhbGl6ZSB2cDhfcXVhbnRpemVfbWJ5IG5lb24KKworcHJvdG90eXBlIHZvaWQgdnA4X3F1YW50aXplX21idXYgInN0cnVjdCBtYWNyb2Jsb2NrICoiCitzcGVjaWFsaXplIHZwOF9xdWFudGl6ZV9tYnV2IG5lb24KKworIworIyBCbG9jayBzdWJ0cmFjdGlvbgorIworcHJvdG90eXBlIGludCB2cDhfYmxvY2tfZXJyb3IgInNob3J0ICpjb2VmZiwgc2hvcnQgKmRxY29lZmYiCitzcGVjaWFsaXplIHZwOF9ibG9ja19lcnJvciBtbXggc3NlMgordnA4X2Jsb2NrX2Vycm9yX3NzZTI9dnA4X2Jsb2NrX2Vycm9yX3htbQorCitwcm90b3R5cGUgaW50IHZwOF9tYmJsb2NrX2Vycm9yICJzdHJ1Y3QgbWFjcm9ibG9jayAqbWIsIGludCBkYyIKK3NwZWNpYWxpemUgdnA4X21iYmxvY2tfZXJyb3IgbW14IHNzZTIKK3ZwOF9tYmJsb2NrX2Vycm9yX3NzZTI9dnA4X21iYmxvY2tfZXJyb3JfeG1tCisKK3Byb3RvdHlwZSBpbnQgdnA4X21idXZlcnJvciAic3RydWN0IG1hY3JvYmxvY2sgKm1iIgorc3BlY2lhbGl6ZSB2cDhfbWJ1dmVycm9yIG1teCBzc2UyCit2cDhfbWJ1dmVycm9yX3NzZTI9dnA4X21idXZlcnJvcl94bW0KKworcHJvdG90eXBlIHZvaWQgdnA4X3N1YnRyYWN0X2IgInN0cnVjdCBibG9jayAqYmUsIHN0cnVjdCBibG9ja2QgKmJkLCBpbnQgcGl0Y2giCitzcGVjaWFsaXplIHZwOF9zdWJ0cmFjdF9iIG1teCBzc2UyIG1lZGlhIG5lb24KK3ZwOF9zdWJ0cmFjdF9iX21lZGlhPXZwOF9zdWJ0cmFjdF9iX2FybXY2CisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zdWJ0cmFjdF9tYnkgInNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcHJlZF9zdHJpZGUiCitzcGVjaWFsaXplIHZwOF9zdWJ0cmFjdF9tYnkgbW14IHNzZTIgbWVkaWEgbmVvbgordnA4X3N1YnRyYWN0X21ieV9tZWRpYT12cDhfc3VidHJhY3RfbWJ5X2FybXY2CisKK3Byb3RvdHlwZSB2b2lkIHZwOF9zdWJ0cmFjdF9tYnV2ICJzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqdXNyYywgdW5zaWduZWQgY2hhciAqdnNyYywgaW50IHNyY19zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnVwcmVkLCB1bnNpZ25lZCBjaGFyICp2cHJlZCwgaW50IHByZWRfc3RyaWRlIgorc3BlY2lhbGl6ZSB2cDhfc3VidHJhY3RfbWJ1diBtbXggc3NlMiBtZWRpYSBuZW9uCit2cDhfc3VidHJhY3RfbWJ1dl9tZWRpYT12cDhfc3VidHJhY3RfbWJ1dl9hcm12NgorCisjCisjIE1vdGlvbiBzZWFyY2gKKyMKK3Byb3RvdHlwZSBpbnQgdnA4X2Z1bGxfc2VhcmNoX3NhZCAic3RydWN0IG1hY3JvYmxvY2sgKngsIHN0cnVjdCBibG9jayAqYiwgc3RydWN0IGJsb2NrZCAqZCwgdW5pb24gaW50X212ICpyZWZfbXYsIGludCBzYWRfcGVyX2JpdCwgaW50IGRpc3RhbmNlLCBzdHJ1Y3QgdmFyaWFuY2VfdnRhYmxlICpmbl9wdHIsIGludCAqbXZjb3N0WzJdLCB1bmlvbiBpbnRfbXYgKmNlbnRlcl9tdiIKK3NwZWNpYWxpemUgdnA4X2Z1bGxfc2VhcmNoX3NhZCBzc2UzIHNzZTRfMQordnA4X2Z1bGxfc2VhcmNoX3NhZF9zc2UzPXZwOF9mdWxsX3NlYXJjaF9zYWR4MwordnA4X2Z1bGxfc2VhcmNoX3NhZF9zc2U0XzE9dnA4X2Z1bGxfc2VhcmNoX3NhZHg4CisKK3Byb3RvdHlwZSBpbnQgdnA4X3JlZmluaW5nX3NlYXJjaF9zYWQgInN0cnVjdCBtYWNyb2Jsb2NrICp4LCBzdHJ1Y3QgYmxvY2sgKmIsIHN0cnVjdCBibG9ja2QgKmQsIHVuaW9uIGludF9tdiAqcmVmX212LCBpbnQgc2FkX3Blcl9iaXQsIGludCBkaXN0YW5jZSwgc3RydWN0IHZhcmlhbmNlX3Z0YWJsZSAqZm5fcHRyLCBpbnQgKm12Y29zdFsyXSwgdW5pb24gaW50X212ICpjZW50ZXJfbXYiCitzcGVjaWFsaXplIHZwOF9yZWZpbmluZ19zZWFyY2hfc2FkIHNzZTMKK3ZwOF9yZWZpbmluZ19zZWFyY2hfc2FkX3NzZTM9dnA4X3JlZmluaW5nX3NlYXJjaF9zYWR4NAorCitwcm90b3R5cGUgaW50IHZwOF9kaWFtb25kX3NlYXJjaF9zYWQgInN0cnVjdCBtYWNyb2Jsb2NrICp4LCBzdHJ1Y3QgYmxvY2sgKmIsIHN0cnVjdCBibG9ja2QgKmQsIHVuaW9uIGludF9tdiAqcmVmX212LCB1bmlvbiBpbnRfbXYgKmJlc3RfbXYsIGludCBzZWFyY2hfcGFyYW0sIGludCBzYWRfcGVyX2JpdCwgaW50ICpudW0wMCwgc3RydWN0IHZhcmlhbmNlX3Z0YWJsZSAqZm5fcHRyLCBpbnQgKm12Y29zdFsyXSwgdW5pb24gaW50X212ICpjZW50ZXJfbXYiCit2cDhfZGlhbW9uZF9zZWFyY2hfc2FkX3NzZTM9dnA4X2RpYW1vbmRfc2VhcmNoX3NhZHg0CisKKyMKKyMgQWx0LXJlZiBOb2lzZSBSZWR1Y3Rpb24gKEFSTlIpCisjCitpZiBbICIkQ09ORklHX1JFQUxUSU1FX09OTFkiICE9ICJ5ZXMiIF07IHRoZW4KKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5ICJ1bnNpZ25lZCBjaGFyICpmcmFtZTEsIHVuc2lnbmVkIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmZyYW1lMiwgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIGludCBzdHJlbmd0aCwgaW50IGZpbHRlcl93ZWlnaHQsIHVuc2lnbmVkIGludCAqYWNjdW11bGF0b3IsIHVuc2lnbmVkIHNob3J0ICpjb3VudCIKKyAgICBzcGVjaWFsaXplIHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHkgc3NlMgorZmkKKworIworIyBQaWNrIExvb3BmaWx0ZXIKKyMKK3Byb3RvdHlwZSB2b2lkIHZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZSAic3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYyIKK3NwZWNpYWxpemUgdnA4X3l2MTJfY29weV9wYXJ0aWFsX2ZyYW1lIG5lb24KKworIworIyBEZW5vaXNlciBmaWx0ZXIKKyMKK2lmIFsgIiRDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HIiA9ICJ5ZXMiIF07IHRoZW4KKyAgICBwcm90b3R5cGUgaW50IHZwOF9kZW5vaXNlcl9maWx0ZXIgInN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcqIG1jX3J1bm5pbmdfYXZnLCBzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnKiBydW5uaW5nX2F2Zywgc3RydWN0IG1hY3JvYmxvY2sqIHNpZ25hbCwgdW5zaWduZWQgaW50IG1vdGlvbl9tYWduaXR1ZGUyLCBpbnQgeV9vZmZzZXQsIGludCB1dl9vZmZzZXQiCisgICAgc3BlY2lhbGl6ZSB2cDhfZGVub2lzZXJfZmlsdGVyIHNzZTIKK2ZpCisKKyMgRW5kIG9mIGVuY29kZXIgb25seSBmdW5jdGlvbnMKK2ZpCisKKyMgU2NhbGVyIGZ1bmN0aW9ucworaWYgWyAiQ09ORklHX1NQQVRJQUxfUkVTQU1QTElORyIgIT0gInllcyIgXTsgdGhlbgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlICJjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSAidW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlICJ1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGUgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlICJ1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgInVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCIKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZSAiY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCIKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgInVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCIKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSAidW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlICJjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSAidW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlICJ1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGUgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlICJ1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgInVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCIKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSAiY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCIKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgInVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlICJjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIgorICAgIHByb3RvdHlwZSB2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZSAidW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGUgImNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCisgICAgcHJvdG90eXBlIHZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlICJ1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCIKKyAgICBwcm90b3R5cGUgdm9pZCB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSAidW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgiCitmaQorCitwcm90b3R5cGUgdm9pZCB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyAic3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqeWJmIgorc3BlY2lhbGl6ZSB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyBuZW9uCisKK3Byb3RvdHlwZSB2b2lkIHZwOF95djEyX2NvcHlfZnJhbWUgInN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnNyY195YmMsIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMiCitzcGVjaWFsaXplIHZwOF95djEyX2NvcHlfZnJhbWUgbmVvbgorCitwcm90b3R5cGUgdm9pZCB2cDhfeXYxMl9jb3B5X3kgInN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnNyY195YmMsIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMiCitzcGVjaWFsaXplIHZwOF95djEyX2NvcHlfeSBuZW9uCisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3NhZF9jLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi9zYWRfYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzZmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9zYWRfYy5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2ludGVnZXIuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBzYWRfbXhfbl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfc2FkLCBpbnQgbSwgaW50IG4pCit7CisgICAgaW50IHIsIGM7CisgICAgdW5zaWduZWQgaW50IHNhZCA9IDA7CisKKyAgICBmb3IgKHIgPSAwOyByIDwgbjsgcisrKQorICAgIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IG07IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2FkICs9IGFicyhzcmNfcHRyW2NdIC0gcmVmX3B0cltjXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2FkID4gbWF4X3NhZCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBzcmNfcHRyICs9IHNyY19zdHJpZGU7CisgICAgICAgIHJlZl9wdHIgKz0gcmVmX3N0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gc2FkOworfQorCisvKiBtYXhfc2FkIGlzIHByb3ZpZGVkIGFzIGFuIG9wdGlvbmFsIG9wdGltaXphdGlvbiBwb2ludC4gQWx0ZXJuYXRpdmUKKyAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBjaGVjayBpdC4KKyAqLworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9zYWQpCit7CisgICAgcmV0dXJuIHNhZF9teF9uX2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciwgcmVmX3N0cmlkZSwgbWF4X3NhZCwgMTYsIDE2KTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zYWQ4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfc2FkKQoreworICAgIHJldHVybiBzYWRfbXhfbl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIsIHJlZl9zdHJpZGUsIG1heF9zYWQsIDgsIDgpOworfQorCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9zYWQpCit7CisgICAgcmV0dXJuIHNhZF9teF9uX2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciwgcmVmX3N0cmlkZSwgbWF4X3NhZCwgMTYsIDgpOworCit9CisKK3Vuc2lnbmVkIGludCB2cDhfc2FkOHgxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X3NhZCkKK3sKKyAgICByZXR1cm4gc2FkX214X25fYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyLCByZWZfc3RyaWRlLCBtYXhfc2FkLCA4LCAxNik7Cit9CisKK3Vuc2lnbmVkIGludCB2cDhfc2FkNHg0X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X3NhZCkKK3sKKyAgICByZXR1cm4gc2FkX214X25fYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyLCByZWZfc3RyaWRlLCBtYXhfc2FkLCA0LCA0KTsKK30KKwordm9pZCB2cDhfc2FkMTZ4MTZ4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAwLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzFdID0gdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSB2cDhfc2FkMTZ4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworfQorCit2b2lkIHZwOF9zYWQxNngxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSkKK3sKKyAgICBzYWRfYXJyYXlbMF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDAsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbM10gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDMsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDQsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDUsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDYsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbN10gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDcsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkMTZ4OHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDAsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAxLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzJdID0gdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworfQorCit2b2lkIHZwOF9zYWQxNng4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSkKK3sKKyAgICBzYWRfYXJyYXlbMF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMCwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsxXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAxLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzJdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbM10gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMywgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs0XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA0LCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzVdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDUsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA3LCByZWZfc3RyaWRlLCBVSU5UX01BWCk7Cit9CisKK3ZvaWQgdnA4X3NhZDh4OHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSkKK3sKKyAgICBzYWRfYXJyYXlbMF0gPSB2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDAsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSB2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkOHg4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpCit7CisgICAgc2FkX2FycmF5WzBdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMCwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsxXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAyLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzNdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMywgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs0XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDQsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA1LCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzZdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDcsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkOHgxNngzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDAsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAxLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzJdID0gdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworfQorCit2b2lkIHZwOF9zYWQ4eDE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSkKK3sKKyAgICBzYWRfYXJyYXlbMF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMCwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsxXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAxLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzJdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbM10gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMywgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs0XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA0LCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzVdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDUsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA3LCByZWZfc3RyaWRlLCBVSU5UX01BWCk7Cit9CisKK3ZvaWQgdnA4X3NhZDR4NHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSkKK3sKKyAgICBzYWRfYXJyYXlbMF0gPSB2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDAsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSB2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkNHg0eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpCit7CisgICAgc2FkX2FycmF5WzBdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMCwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsxXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAyLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzNdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMywgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs0XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDQsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbNV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA1LCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzZdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDcsIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkMTZ4MTZ4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMF0sIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkMTZ4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzFdLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzJdID0gdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsyXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbM10sIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkMTZ4OHg0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clswXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsxXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsyXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clszXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworfQorCit2b2lkIHZwOF9zYWQ4eDh4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpCit7CisgICAgc2FkX2FycmF5WzBdID0gdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMF0sIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsxXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzJdLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzNdID0gdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbM10sIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKK30KKwordm9pZCB2cDhfc2FkOHgxNng0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clswXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsxXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsyXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clszXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworfQorCit2b2lkIHZwOF9zYWQ0eDR4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KQoreworICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzBdLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgc2FkX2FycmF5WzFdID0gdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMV0sIHJlZl9zdHJpZGUsIFVJTlRfTUFYKTsKKyAgICBzYWRfYXJyYXlbMl0gPSB2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsyXSwgcmVmX3N0cmlkZSwgVUlOVF9NQVgpOworICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzNdLCByZWZfc3RyaWRlLCBVSU5UX01BWCk7Cit9CisKKy8qIENvcHkgMiBtYWNyb2Jsb2NrcyB0byBhIGJ1ZmZlciAqLwordm9pZCB2cDhfY29weTMyeG5fYyh1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCit7CisgICAgaW50IHI7CisKKyAgICBmb3IgKHIgPSAwOyByIDwgaGVpZ2h0OyByKyspCisgICAgeworI2lmICEoQ09ORklHX0ZBU1RfVU5BTElHTkVEKQorICAgICAgICBkc3RfcHRyWzBdID0gc3JjX3B0clswXTsKKyAgICAgICAgZHN0X3B0clsxXSA9IHNyY19wdHJbMV07CisgICAgICAgIGRzdF9wdHJbMl0gPSBzcmNfcHRyWzJdOworICAgICAgICBkc3RfcHRyWzNdID0gc3JjX3B0clszXTsKKyAgICAgICAgZHN0X3B0cls0XSA9IHNyY19wdHJbNF07CisgICAgICAgIGRzdF9wdHJbNV0gPSBzcmNfcHRyWzVdOworICAgICAgICBkc3RfcHRyWzZdID0gc3JjX3B0cls2XTsKKyAgICAgICAgZHN0X3B0cls3XSA9IHNyY19wdHJbN107CisgICAgICAgIGRzdF9wdHJbOF0gPSBzcmNfcHRyWzhdOworICAgICAgICBkc3RfcHRyWzldID0gc3JjX3B0cls5XTsKKyAgICAgICAgZHN0X3B0clsxMF0gPSBzcmNfcHRyWzEwXTsKKyAgICAgICAgZHN0X3B0clsxMV0gPSBzcmNfcHRyWzExXTsKKyAgICAgICAgZHN0X3B0clsxMl0gPSBzcmNfcHRyWzEyXTsKKyAgICAgICAgZHN0X3B0clsxM10gPSBzcmNfcHRyWzEzXTsKKyAgICAgICAgZHN0X3B0clsxNF0gPSBzcmNfcHRyWzE0XTsKKyAgICAgICAgZHN0X3B0clsxNV0gPSBzcmNfcHRyWzE1XTsKKyAgICAgICAgZHN0X3B0clsxNl0gPSBzcmNfcHRyWzE2XTsKKyAgICAgICAgZHN0X3B0clsxN10gPSBzcmNfcHRyWzE3XTsKKyAgICAgICAgZHN0X3B0clsxOF0gPSBzcmNfcHRyWzE4XTsKKyAgICAgICAgZHN0X3B0clsxOV0gPSBzcmNfcHRyWzE5XTsKKyAgICAgICAgZHN0X3B0clsyMF0gPSBzcmNfcHRyWzIwXTsKKyAgICAgICAgZHN0X3B0clsyMV0gPSBzcmNfcHRyWzIxXTsKKyAgICAgICAgZHN0X3B0clsyMl0gPSBzcmNfcHRyWzIyXTsKKyAgICAgICAgZHN0X3B0clsyM10gPSBzcmNfcHRyWzIzXTsKKyAgICAgICAgZHN0X3B0clsyNF0gPSBzcmNfcHRyWzI0XTsKKyAgICAgICAgZHN0X3B0clsyNV0gPSBzcmNfcHRyWzI1XTsKKyAgICAgICAgZHN0X3B0clsyNl0gPSBzcmNfcHRyWzI2XTsKKyAgICAgICAgZHN0X3B0clsyN10gPSBzcmNfcHRyWzI3XTsKKyAgICAgICAgZHN0X3B0clsyOF0gPSBzcmNfcHRyWzI4XTsKKyAgICAgICAgZHN0X3B0clsyOV0gPSBzcmNfcHRyWzI5XTsKKyAgICAgICAgZHN0X3B0clszMF0gPSBzcmNfcHRyWzMwXTsKKyAgICAgICAgZHN0X3B0clszMV0gPSBzcmNfcHRyWzMxXTsKKyNlbHNlCisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9ICgodWludDMyX3QgKilzcmNfcHRyKVswXSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9ICgodWludDMyX3QgKilzcmNfcHRyKVsxXSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsyXSA9ICgodWludDMyX3QgKilzcmNfcHRyKVsyXSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVszXSA9ICgodWludDMyX3QgKilzcmNfcHRyKVszXSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVs0XSA9ICgodWludDMyX3QgKilzcmNfcHRyKVs0XSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVs1XSA9ICgodWludDMyX3QgKilzcmNfcHRyKVs1XSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVs2XSA9ICgodWludDMyX3QgKilzcmNfcHRyKVs2XSA7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVs3XSA9ICgodWludDMyX3QgKilzcmNfcHRyKVs3XSA7CisjZW5kaWYKKyAgICAgICAgc3JjX3B0ciArPSBzcmNfc3RyaWRlOworICAgICAgICBkc3RfcHRyICs9IGRzdF9zdHJpZGU7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uYyBiL2xpYnZweC92cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYWZlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInNldHVwaW50cmFyZWNvbi5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorCit2b2lkIHZwOF9zZXR1cF9pbnRyYV9yZWNvbihZVjEyX0JVRkZFUl9DT05GSUcgKnliZikKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHNldCB1cCBmcmFtZSBuZXcgZnJhbWUgZm9yIGludHJhIGNvZGVkIGJsb2NrcyAqLworICAgIHZweF9tZW1zZXQoeWJmLT55X2J1ZmZlciAtIDEgLSB5YmYtPnlfc3RyaWRlLCAxMjcsIHliZi0+eV93aWR0aCArIDUpOworICAgIGZvciAoaSA9IDA7IGkgPCB5YmYtPnlfaGVpZ2h0OyBpKyspCisgICAgICAgIHliZi0+eV9idWZmZXJbeWJmLT55X3N0cmlkZSAqaSAtIDFdID0gKHVuc2lnbmVkIGNoYXIpIDEyOTsKKworICAgIHZweF9tZW1zZXQoeWJmLT51X2J1ZmZlciAtIDEgLSB5YmYtPnV2X3N0cmlkZSwgMTI3LCB5YmYtPnV2X3dpZHRoICsgNSk7CisgICAgZm9yIChpID0gMDsgaSA8IHliZi0+dXZfaGVpZ2h0OyBpKyspCisgICAgICAgIHliZi0+dV9idWZmZXJbeWJmLT51dl9zdHJpZGUgKmkgLSAxXSA9ICh1bnNpZ25lZCBjaGFyKSAxMjk7CisKKyAgICB2cHhfbWVtc2V0KHliZi0+dl9idWZmZXIgLSAxIC0geWJmLT51dl9zdHJpZGUsIDEyNywgeWJmLT51dl93aWR0aCArIDUpOworICAgIGZvciAoaSA9IDA7IGkgPCB5YmYtPnV2X2hlaWdodDsgaSsrKQorICAgICAgICB5YmYtPnZfYnVmZmVyW3liZi0+dXZfc3RyaWRlICppIC0gMV0gPSAodW5zaWduZWQgY2hhcikgMTI5OworCit9CisKK3ZvaWQgdnA4X3NldHVwX2ludHJhX3JlY29uX3RvcF9saW5lKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKQoreworICAgIHZweF9tZW1zZXQoeWJmLT55X2J1ZmZlciAtIDEgLSB5YmYtPnlfc3RyaWRlLCAxMjcsIHliZi0+eV93aWR0aCArIDUpOworICAgIHZweF9tZW1zZXQoeWJmLT51X2J1ZmZlciAtIDEgLSB5YmYtPnV2X3N0cmlkZSwgMTI3LCB5YmYtPnV2X3dpZHRoICsgNSk7CisgICAgdnB4X21lbXNldCh5YmYtPnZfYnVmZmVyIC0gMSAtIHliZi0+dXZfc3RyaWRlLCAxMjcsIHliZi0+dXZfd2lkdGggKyA1KTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oIGIvbGlidnB4L3ZwOC9jb21tb24vc2V0dXBpbnRyYXJlY29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxNWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKK2V4dGVybiB2b2lkIHZwOF9zZXR1cF9pbnRyYV9yZWNvbihZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7CitleHRlcm4gdm9pZCB2cDhfc2V0dXBfaW50cmFfcmVjb25fdG9wX2xpbmUoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOworCitzdGF0aWMKK3ZvaWQgc2V0dXBfaW50cmFfcmVjb25fbGVmdCh1bnNpZ25lZCBjaGFyICp5X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp1X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2X3N0cmlkZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB5X2J1ZmZlclt5X3N0cmlkZSAqaV0gPSAodW5zaWduZWQgY2hhcikgMTI5OworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgdV9idWZmZXJbdXZfc3RyaWRlICppXSA9ICh1bnNpZ25lZCBjaGFyKSAxMjk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB2X2J1ZmZlclt1dl9zdHJpZGUgKmldID0gKHVuc2lnbmVkIGNoYXIpIDEyOTsKK30KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuYyBiL2xpYnZweC92cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuYwpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuYwpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oIGIvbGlidnB4L3ZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCBiL2xpYnZweC92cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWM0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAordm9pZCB2cHhfcmVzZXRfbW14X3N0YXRlKHZvaWQpOworI2RlZmluZSB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCkgdnB4X3Jlc2V0X21teF9zdGF0ZSgpCisjZWxzZQorI2RlZmluZSB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCkKKyNlbmRpZgorCitzdHJ1Y3QgVlA4Q29tbW9uOwordm9pZCB2cDhfbWFjaGluZV9zcGVjaWZpY19jb25maWcoc3RydWN0IFZQOENvbW1vbiAqKTsKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vdGV4dGJsaXQuYyBiL2xpYnZweC92cDgvY29tbW9uL3RleHRibGl0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vdGV4dGJsaXQuYwpyZW5hbWUgdG8gbGlidnB4L3ZwOC9jb21tb24vdGV4dGJsaXQuYwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24vdGhyZWFkaW5nLmggYi9saWJ2cHgvdnA4L2NvbW1vbi90aHJlYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDllM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vdGhyZWFkaW5nLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9QVEhSRUFEX0VNVUxBVElPTgorI2RlZmluZSBfUFRIUkVBRF9FTVVMQVRJT04KKworI2lmIENPTkZJR19PU19TVVBQT1JUICYmIENPTkZJR19NVUxUSVRIUkVBRAorCisvKiBUaHJlYWQgbWFuYWdlbWVudCBtYWNyb3MgKi8KKyNpZmRlZiBfV0lOMzIKKy8qIFdpbjMyICovCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgVEhSRUFEX0ZVTkNUSU9OIERXT1JEIFdJTkFQSQorI2RlZmluZSBUSFJFQURfRlVOQ1RJT05fUkVUVVJOIERXT1JECisjZGVmaW5lIFRIUkVBRF9TUEVDSUZJQ19JTkRFWCBEV09SRAorI2RlZmluZSBwdGhyZWFkX3QgSEFORExFCisjZGVmaW5lIHB0aHJlYWRfYXR0cl90IERXT1JECisjZGVmaW5lIHB0aHJlYWRfY3JlYXRlKHRoaGFuZGxlLGF0dHIsdGhmdW5jLHRoYXJnKSAoaW50KSgoKnRoaGFuZGxlPShIQU5ETEUpX2JlZ2ludGhyZWFkZXgoTlVMTCwwLCh1bnNpZ25lZCBpbnQgKF9fc3RkY2FsbCAqKSh2b2lkICopKXRoZnVuYyx0aGFyZywwLE5VTEwpKT09TlVMTCkKKyNkZWZpbmUgcHRocmVhZF9qb2luKHRocmVhZCwgcmVzdWx0KSAoKFdhaXRGb3JTaW5nbGVPYmplY3QoKHRocmVhZCksSU5GSU5JVEUpIT1XQUlUX09CSkVDVF8wKSB8fCAhQ2xvc2VIYW5kbGUodGhyZWFkKSkKKyNkZWZpbmUgcHRocmVhZF9kZXRhY2godGhyZWFkKSBpZih0aHJlYWQhPU5VTEwpQ2xvc2VIYW5kbGUodGhyZWFkKQorI2RlZmluZSB0aHJlYWRfc2xlZXAobm1zKSBTbGVlcChubXMpCisjZGVmaW5lIHB0aHJlYWRfY2FuY2VsKHRocmVhZCkgdGVybWluYXRlX3RocmVhZCh0aHJlYWQsMCkKKyNkZWZpbmUgdHNfa2V5X2NyZWF0ZSh0c19rZXksIGRlc3RydWN0b3IpIHt0c19rZXkgPSBUbHNBbGxvYygpO307CisjZGVmaW5lIHB0aHJlYWRfZ2V0c3BlY2lmaWModHNfa2V5KSBUbHNHZXRWYWx1ZSh0c19rZXkpCisjZGVmaW5lIHB0aHJlYWRfc2V0c3BlY2lmaWModHNfa2V5LCB2YWx1ZSkgVGxzU2V0VmFsdWUodHNfa2V5LCAodm9pZCAqKXZhbHVlKQorI2RlZmluZSBwdGhyZWFkX3NlbGYoKSBHZXRDdXJyZW50VGhyZWFkSWQoKQorCisjZWxpZiBkZWZpbmVkKF9fT1MyX18pCisvKiBPUy8yICovCisjZGVmaW5lIElOQ0xfRE9TCisjaW5jbHVkZSA8b3MyLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgVEhSRUFEX0ZVTkNUSU9OIHZvaWQKKyNkZWZpbmUgVEhSRUFEX0ZVTkNUSU9OX1JFVFVSTiB2b2lkCisjZGVmaW5lIFRIUkVBRF9TUEVDSUZJQ19JTkRFWCBQVUxPTkcKKyNkZWZpbmUgcHRocmVhZF90IFRJRAorI2RlZmluZSBwdGhyZWFkX2F0dHJfdCBVTE9ORworI2RlZmluZSBwdGhyZWFkX2NyZWF0ZSh0aGhhbmRsZSxhdHRyLHRoZnVuYyx0aGFyZykgXAorICAgICgoaW50KSgoKih0aGhhbmRsZSk9X2JlZ2ludGhyZWFkKHRoZnVuYyxOVUxMLDEwMjQqMTAyNCx0aGFyZykpPT0tMSkpCisjZGVmaW5lIHB0aHJlYWRfam9pbih0aHJlYWQsIHJlc3VsdCkgKChpbnQpRG9zV2FpdFRocmVhZCgmKHRocmVhZCksMCkpCisjZGVmaW5lIHB0aHJlYWRfZGV0YWNoKHRocmVhZCkgMAorI2RlZmluZSB0aHJlYWRfc2xlZXAobm1zKSBEb3NTbGVlcChubXMpCisjZGVmaW5lIHB0aHJlYWRfY2FuY2VsKHRocmVhZCkgRG9zS2lsbFRocmVhZCh0aHJlYWQpCisjZGVmaW5lIHRzX2tleV9jcmVhdGUodHNfa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgRG9zQWxsb2NUaHJlYWRMb2NhbE1lbW9yeSgxLCAmKHRzX2tleSkpOworI2RlZmluZSBwdGhyZWFkX2dldHNwZWNpZmljKHRzX2tleSkgKCh2b2lkICopKCoodHNfa2V5KSkpCisjZGVmaW5lIHB0aHJlYWRfc2V0c3BlY2lmaWModHNfa2V5LCB2YWx1ZSkgKCoodHNfa2V5KT0oVUxPTkcpKHZhbHVlKSkKKyNkZWZpbmUgcHRocmVhZF9zZWxmKCkgX2dldHRpZCgpCisjZWxzZQorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPG1hY2gvbWFjaF9pbml0Lmg+CisjaW5jbHVkZSA8bWFjaC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3Rhc2suaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNlbHNlCisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKy8qIHB0aHJlYWRzICovCisvKiBOZWFybHkgZXZlcnl0aGluZyBpcyBhbHJlYWR5IGRlZmluZWQgKi8KKyNkZWZpbmUgVEhSRUFEX0ZVTkNUSU9OIHZvaWQgKgorI2RlZmluZSBUSFJFQURfRlVOQ1RJT05fUkVUVVJOIHZvaWQgKgorI2RlZmluZSBUSFJFQURfU1BFQ0lGSUNfSU5ERVggcHRocmVhZF9rZXlfdAorI2RlZmluZSB0c19rZXlfY3JlYXRlKHRzX2tleSwgZGVzdHJ1Y3RvcikgcHRocmVhZF9rZXlfY3JlYXRlICgmKHRzX2tleSksIGRlc3RydWN0b3IpOworI2VuZGlmCisKKy8qIFN5bmNyaHJvbml6YXRpb24gbWFjcm9zOiBXaW4zMiBhbmQgUHRocmVhZHMgKi8KKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgc2VtX3QgSEFORExFCisjZGVmaW5lIHBhdXNlKHZvaWRwYXJhKSBfX2FzbSBQQVVTRQorI2RlZmluZSBzZW1faW5pdChzZW0sIHNlbV9hdHRyMSwgc2VtX2luaXRfdmFsdWUpIChpbnQpKCgqc2VtID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsMCwzMjc2OCxOVUxMKSk9PU5VTEwpCisjZGVmaW5lIHNlbV93YWl0KHNlbSkgKGludCkoV0FJVF9PQkpFQ1RfMCAhPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCpzZW0sSU5GSU5JVEUpKQorI2RlZmluZSBzZW1fcG9zdChzZW0pIFJlbGVhc2VTZW1hcGhvcmUoKnNlbSwxLE5VTEwpCisjZGVmaW5lIHNlbV9kZXN0cm95KHNlbSkgaWYoKnNlbSkoKGludCkoQ2xvc2VIYW5kbGUoKnNlbSkpPT1UUlVFKQorI2RlZmluZSB0aHJlYWRfc2xlZXAobm1zKSBTbGVlcChubXMpCisKKyNlbGlmIGRlZmluZWQoX19PUzJfXykKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSEVWICBldmVudDsKKyAgICBITVRYIHdhaXRfbXV0ZXg7CisgICAgSE1UWCBjb3VudF9tdXRleDsKKyAgICBpbnQgIGNvdW50OworfSBzZW1fdDsKKworc3RhdGljIGlubGluZSBpbnQgc2VtX2luaXQoc2VtX3QgKnNlbSwgaW50IHBzaGFyZWQsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKyAgICBEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmc2VtLT5ldmVudCwgcHNoYXJlZCA/IERDX1NFTV9TSEFSRUQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID4gMCA/IFRSVUUgOiBGQUxTRSk7CisgICAgRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJnNlbS0+d2FpdF9tdXRleCwgMCwgRkFMU0UpOworICAgIERvc0NyZWF0ZU11dGV4U2VtKE5VTEwsICZzZW0tPmNvdW50X211dGV4LCAwLCBGQUxTRSk7CisKKyAgICBzZW0tPmNvdW50ID0gdmFsdWU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VtX3dhaXQoc2VtX3QgKiBzZW0pCit7CisgICAgRG9zUmVxdWVzdE11dGV4U2VtKHNlbS0+d2FpdF9tdXRleCwgLTEpOworCisgICAgRG9zV2FpdEV2ZW50U2VtKHNlbS0+ZXZlbnQsIC0xKTsKKworICAgIERvc1JlcXVlc3RNdXRleFNlbShzZW0tPmNvdW50X211dGV4LCAtMSk7CisKKyAgICBzZW0tPmNvdW50LS07CisgICAgaWYgKHNlbS0+Y291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIFVMT05HIHBvc3RfY291bnQ7CisKKyAgICAgICAgRG9zUmVzZXRFdmVudFNlbShzZW0tPmV2ZW50LCAmcG9zdF9jb3VudCk7CisgICAgfQorCisgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+Y291bnRfbXV0ZXgpOworCisgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+d2FpdF9tdXRleCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VtX3Bvc3Qoc2VtX3QgKiBzZW0pCit7CisgICAgRG9zUmVxdWVzdE11dGV4U2VtKHNlbS0+Y291bnRfbXV0ZXgsIC0xKTsKKworICAgIGlmIChzZW0tPmNvdW50IDwgMzI3NjgpCisgICAgeworICAgICAgICBzZW0tPmNvdW50Kys7CisgICAgICAgIERvc1Bvc3RFdmVudFNlbShzZW0tPmV2ZW50KTsKKyAgICB9CisKKyAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oc2VtLT5jb3VudF9tdXRleCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VtX2Rlc3Ryb3koc2VtX3QgKiBzZW0pCit7CisgICAgRG9zQ2xvc2VFdmVudFNlbShzZW0tPmV2ZW50KTsKKyAgICBEb3NDbG9zZU11dGV4U2VtKHNlbS0+d2FpdF9tdXRleCk7CisgICAgRG9zQ2xvc2VNdXRleFNlbShzZW0tPmNvdW50X211dGV4KTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIHRocmVhZF9zbGVlcChubXMpIERvc1NsZWVwKG5tcykKKworI2Vsc2UKKworI2lmZGVmIF9fQVBQTEVfXworI2RlZmluZSBzZW1fdCBzZW1hcGhvcmVfdAorI2RlZmluZSBzZW1faW5pdChYLFksWikgc2VtYXBob3JlX2NyZWF0ZShtYWNoX3Rhc2tfc2VsZigpLCBYLCBTWU5DX1BPTElDWV9GSUZPLCBaKQorI2RlZmluZSBzZW1fd2FpdChzZW0pIChzZW1hcGhvcmVfd2FpdCgqc2VtKSApCisjZGVmaW5lIHNlbV9wb3N0KHNlbSkgc2VtYXBob3JlX3NpZ25hbCgqc2VtKQorI2RlZmluZSBzZW1fZGVzdHJveShzZW0pIHNlbWFwaG9yZV9kZXN0cm95KG1hY2hfdGFza19zZWxmKCksKnNlbSkKKyNkZWZpbmUgdGhyZWFkX3NsZWVwKG5tcykgLyogeyBzdHJ1Y3QgdGltZXNwZWMgdHM7dHMudHZfc2VjPTA7IHRzLnR2X25zZWMgPSAxMDAwKm5tcztuYW5vc2xlZXAoJnRzLCBOVUxMKTt9ICovCisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjZGVmaW5lIHRocmVhZF9zbGVlcChubXMpIHNjaGVkX3lpZWxkKCk7Lyoge3N0cnVjdCB0aW1lc3BlYyB0czt0cy50dl9zZWM9MDsgdHMudHZfbnNlYyA9IDEwMDAqbm1zO25hbm9zbGVlcCgmdHMsIE5VTEwpO30gKi8KKyNlbmRpZgorLyogTm90IFdpbmRvd3MuIEFzc3VtZSBwdGhyZWFkcyAqLworCisjZW5kaWYKKworI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0CisjaW5jbHVkZSAidnB4X3BvcnRzL3g4Ni5oIgorI2Vsc2UKKyNkZWZpbmUgeDg2X3BhdXNlX2hpbnQoKQorI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfT1NfU1VQUE9SVCAmJiBDT05GSUdfTVVMVElUSFJFQUQgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3RyZWVjb2Rlci5jIGIvbGlidnB4L3ZwOC9jb21tb24vdHJlZWNvZGVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vdHJlZWNvZGVyLmMKcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL3RyZWVjb2Rlci5jCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3RyZWVjb2Rlci5oIGIvbGlidnB4L3ZwOC9jb21tb24vdHJlZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9jb21tb24vdHJlZWNvZGVyLmgKcmVuYW1lIHRvIGxpYnZweC92cDgvY29tbW9uL3RyZWVjb2Rlci5oCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi92YXJpYW5jZS5oIGIvbGlidnB4L3ZwOC9jb21tb24vdmFyaWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE5M2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vdmFyaWFuY2UuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgVkFSSUFOQ0VfSAorI2RlZmluZSBWQVJJQU5DRV9ICisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKK3R5cGVkZWYgdW5zaWduZWQgaW50KCp2cDhfc2FkX2ZuX3QpKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisKK3R5cGVkZWYgdm9pZCAoKnZwOF9jb3B5MzJ4bl9mbl90KSgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50IHJlZl9zdHJpZGUsCisgICAgaW50IG4pOworCit0eXBlZGVmIHZvaWQgKCp2cDhfc2FkX211bHRpX2ZuX3QpKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlZl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworCit0eXBlZGVmIHZvaWQgKCp2cDhfc2FkX211bHRpMV9mbl90KQorICAgICgKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgIGludCAgcmVmX3N0cmlkZSwKKyAgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheQorICAgICk7CisKK3R5cGVkZWYgdm9pZCAoKnZwOF9zYWRfbXVsdGlfZF9mbl90KQorICAgICgKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sCisgICAgIGludCAgcmVmX3N0cmlkZSwKKyAgICAgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkKKyAgICApOworCit0eXBlZGVmIHVuc2lnbmVkIGludCAoKnZwOF92YXJpYW5jZV9mbl90KQorICAgICgKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgIGludCAgcmVmX3N0cmlkZSwKKyAgICAgdW5zaWduZWQgaW50ICpzc2UKKyAgICApOworCit0eXBlZGVmIHVuc2lnbmVkIGludCAoKnZwOF9zdWJwaXh2YXJpYW5jZV9mbl90KQorICAgICgKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgICAgaW50ICB4b2Zmc2V0LAorICAgICAgaW50ICB5b2Zmc2V0LAorICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICAgIGludCBSZWZzdHJpZGUsCisgICAgICB1bnNpZ25lZCBpbnQgKnNzZQorICAgICk7CisKK3R5cGVkZWYgdm9pZCAoKnZwOF9zc2ltcGZfZm5fdCkKKyAgICAgICgKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcywKKyAgICAgICAgaW50IHNwLAorICAgICAgICB1bnNpZ25lZCBjaGFyICpyLAorICAgICAgICBpbnQgcnAsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zLAorICAgICAgICB1bnNpZ25lZCBsb25nICpzdW1fciwKKyAgICAgICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3MsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9yLAorICAgICAgICB1bnNpZ25lZCBsb25nICpzdW1fc3hyCisgICAgICApOworCit0eXBlZGVmIHVuc2lnbmVkIGludCAoKnZwOF9nZXRtYnNzX2ZuX3QpKGNvbnN0IHNob3J0ICopOworCit0eXBlZGVmIHVuc2lnbmVkIGludCAoKnZwOF9nZXQxNngxNnByZWRlcnJvcl9mbl90KQorICAgICgKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgIGludCAgcmVmX3N0cmlkZQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHZhcmlhbmNlX3Z0YWJsZQoreworICAgIHZwOF9zYWRfZm5fdCAgICAgICAgICAgIHNkZjsKKyAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICB2ZjsKKyAgICB2cDhfc3VicGl4dmFyaWFuY2VfZm5fdCBzdmY7CisgICAgdnA4X3ZhcmlhbmNlX2ZuX3QgICAgICAgc3ZmX2hhbGZwaXhfaDsKKyAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICBzdmZfaGFsZnBpeF92OworICAgIHZwOF92YXJpYW5jZV9mbl90ICAgICAgIHN2Zl9oYWxmcGl4X2h2OworICAgIHZwOF9zYWRfbXVsdGlfZm5fdCAgICAgIHNkeDNmOworICAgIHZwOF9zYWRfbXVsdGkxX2ZuX3QgICAgIHNkeDhmOworICAgIHZwOF9zYWRfbXVsdGlfZF9mbl90ICAgIHNkeDRkZjsKKyNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAorICAgIHZwOF9jb3B5MzJ4bl9mbl90ICAgICAgIGNvcHltZW07CisjZW5kaWYKK30gdnA4X3ZhcmlhbmNlX2ZuX3B0cl90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3ZhcmlhbmNlX2MuYyBiL2xpYnZweC92cDgvY29tbW9uL3ZhcmlhbmNlX2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA4YWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24vdmFyaWFuY2VfYy5jCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZhcmlhbmNlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKwordW5zaWduZWQgaW50IHZwOF9nZXRfbWJfc3NfYworKAorICAgIGNvbnN0IHNob3J0ICpzcmNfcHRyCispCit7CisgICAgdW5zaWduZWQgaW50IGkgPSAwLCBzdW0gPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHN1bSArPSAoc3JjX3B0cltpXSAqIHNyY19wdHJbaV0pOworICAgICAgICBpKys7CisgICAgfQorICAgIHdoaWxlIChpIDwgMjU2KTsKKworICAgIHJldHVybiBzdW07Cit9CisKKworc3RhdGljIHZvaWQgdmFyaWFuY2UoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICBpbnQgIHcsCisgICAgaW50ICBoLAorICAgIHVuc2lnbmVkIGludCAqc3NlLAorICAgIGludCAqc3VtKQoreworICAgIGludCBpLCBqOworICAgIGludCBkaWZmOworCisgICAgKnN1bSA9IDA7CisgICAgKnNzZSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZiA9IHNyY19wdHJbal0gLSByZWZfcHRyW2pdOworICAgICAgICAgICAgKnN1bSArPSBkaWZmOworICAgICAgICAgICAgKnNzZSArPSBkaWZmICogZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIHNyY19wdHIgKz0gc291cmNlX3N0cmlkZTsKKyAgICAgICAgcmVmX3B0ciArPSByZWNvbl9zdHJpZGU7CisgICAgfQorfQorCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNngxNl9jKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgdW5zaWduZWQgaW50IHZhcjsKKyAgICBpbnQgYXZnOworCisKKyAgICB2YXJpYW5jZShzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsIDE2LCAxNiwgJnZhciwgJmF2Zyk7CisgICAgKnNzZSA9IHZhcjsKKyAgICByZXR1cm4gKHZhciAtICgodW5zaWduZWQgaW50KShhdmcgKiBhdmcpID4+IDgpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4MTZfYygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc291cmNlX3N0cmlkZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCAgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqc3NlKQoreworICAgIHVuc2lnbmVkIGludCB2YXI7CisgICAgaW50IGF2ZzsKKworCisgICAgdmFyaWFuY2Uoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCA4LCAxNiwgJnZhciwgJmF2Zyk7CisgICAgKnNzZSA9IHZhcjsKKyAgICByZXR1cm4gKHZhciAtICgodW5zaWduZWQgaW50KShhdmcgKiBhdmcpID4+IDcpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDhfYygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc291cmNlX3N0cmlkZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCAgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqc3NlKQoreworICAgIHVuc2lnbmVkIGludCB2YXI7CisgICAgaW50IGF2ZzsKKworCisgICAgdmFyaWFuY2Uoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAxNiwgOCwgJnZhciwgJmF2Zyk7CisgICAgKnNzZSA9IHZhcjsKKyAgICByZXR1cm4gKHZhciAtICgodW5zaWduZWQgaW50KShhdmcgKiBhdmcpID4+IDcpKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHg4X2MoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFyOworICAgIGludCBhdmc7CisKKworICAgIHZhcmlhbmNlKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgOCwgOCwgJnZhciwgJmF2Zyk7CisgICAgKnNzZSA9IHZhcjsKKyAgICByZXR1cm4gKHZhciAtICgodW5zaWduZWQgaW50KShhdmcgKiBhdmcpID4+IDYpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTR4NF9jKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgdW5zaWduZWQgaW50IHZhcjsKKyAgICBpbnQgYXZnOworCisKKyAgICB2YXJpYW5jZShzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsIDQsIDQsICZ2YXIsICZhdmcpOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA0KSk7Cit9CisKKwordW5zaWduZWQgaW50IHZwOF9tc2UxNngxNl9jKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgdW5zaWduZWQgaW50IHZhcjsKKyAgICBpbnQgYXZnOworCisgICAgdmFyaWFuY2Uoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAxNiwgMTYsICZ2YXIsICZhdmcpOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuIHZhcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IFVJTlQ4ICAqc3JjX3B0ciAgICAgICAgICA6IFBvaW50ZXIgdG8gc291cmNlIGJsb2NrLgorICogICAgICAgICAgICAgICAgICBVSU5UMzIgc3JjX3BpeGVsc19wZXJfbGluZSA6IFN0cmlkZSBvZiBpbnB1dCBibG9jay4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyIHBpeGVsX3N0ZXAgICAgICAgIDogT2Zmc2V0IGJldHdlZW4gZmlsdGVyIGlucHV0IHNhbXBsZXMgKHNlZSBub3RlcykuCisgKiAgICAgICAgICAgICAgICAgIFVJTlQzMiBvdXRwdXRfaGVpZ2h0ICAgICA6IElucHV0IGJsb2NrIGhlaWdodC4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyIG91dHB1dF93aWR0aCAgICAgIDogSW5wdXQgYmxvY2sgd2lkdGguCisgKiAgICAgICAgICAgICAgICAgIElOVDMyICAqdnA4X2ZpbHRlciAgICAgICAgICA6IEFycmF5IG9mIDIgYmktbGluZWFyIGZpbHRlciB0YXBzLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogSU5UMzIgKm91dHB1dF9wdHIgICAgICAgIDogUG9pbnRlciB0byBmaWx0ZXJlZCBibG9jay4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IEFwcGxpZXMgYSAxLUQgMi10YXAgYmktbGluZWFyIGZpbHRlciB0byB0aGUgc291cmNlIGJsb2NrIGluCisgKiAgICAgICAgICAgICAgICAgIGVpdGhlciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGRpcmVjdGlvbiB0byBwcm9kdWNlIHRoZQorICogICAgICAgICAgICAgICAgICBmaWx0ZXJlZCBvdXRwdXQgYmxvY2suIFVzZWQgdG8gaW1wbGVtZW50IGZpcnN0LXBhc3MKKyAqICAgICAgICAgICAgICAgICAgb2YgMi1EIHNlcGFyYWJsZSBmaWx0ZXIuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBQcm9kdWNlcyBJTlQzMiBvdXRwdXQgdG8gcmV0YWluIHByZWNpc2lvbiBmb3IgbmV4dCBwYXNzLgorICogICAgICAgICAgICAgICAgICBUd28gZmlsdGVyIHRhcHMgc2hvdWxkIHN1bSB0byBWUDhfRklMVEVSX1dFSUdIVC4KKyAqICAgICAgICAgICAgICAgICAgcGl4ZWxfc3RlcCBkZWZpbmVzIHdoZXRoZXIgdGhlIGZpbHRlciBpcyBhcHBsaWVkCisgKiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxseSAocGl4ZWxfc3RlcD0xKSBvciB2ZXJ0aWNhbGx5IChwaXhlbF9zdGVwPXN0cmlkZSkuCisgKiAgICAgICAgICAgICAgICAgIEl0IGRlZmluZXMgdGhlIG9mZnNldCByZXF1aXJlZCB0byBtb3ZlIGZyb20gb25lIGlucHV0CisgKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBuZXh0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgcGl4ZWxfc3RlcCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCispCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0X2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dF93aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBcHBseSBiaWxpbmVhciBmaWx0ZXIgKi8KKyAgICAgICAgICAgIG91dHB1dF9wdHJbal0gPSAoKChpbnQpc3JjX3B0clswXSAgICAgICAgICAqIHZwOF9maWx0ZXJbMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0cltwaXhlbF9zdGVwXSAqIHZwOF9maWx0ZXJbMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZQOF9GSUxURVJfV0VJR0hUIC8gMikpID4+IFZQOF9GSUxURVJfU0hJRlQ7CisgICAgICAgICAgICBzcmNfcHRyKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZXh0IHJvdy4uLiAqLworICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmUgLSBvdXRwdXRfd2lkdGg7CisgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3dpZHRoOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IGZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcworICoKKyAqICBJTlBVVFMgICAgICAgIDogSU5UMzIgICpzcmNfcHRyICAgICAgICAgIDogUG9pbnRlciB0byBzb3VyY2UgYmxvY2suCisgKiAgICAgICAgICAgICAgICAgIFVJTlQzMiBzcmNfcGl4ZWxzX3Blcl9saW5lIDogU3RyaWRlIG9mIGlucHV0IGJsb2NrLgorICogICAgICAgICAgICAgICAgICBVSU5UMzIgcGl4ZWxfc3RlcCAgICAgICAgOiBPZmZzZXQgYmV0d2VlbiBmaWx0ZXIgaW5wdXQgc2FtcGxlcyAoc2VlIG5vdGVzKS4KKyAqICAgICAgICAgICAgICAgICAgVUlOVDMyIG91dHB1dF9oZWlnaHQgICAgIDogSW5wdXQgYmxvY2sgaGVpZ2h0LgorICogICAgICAgICAgICAgICAgICBVSU5UMzIgb3V0cHV0X3dpZHRoICAgICAgOiBJbnB1dCBibG9jayB3aWR0aC4KKyAqICAgICAgICAgICAgICAgICAgSU5UMzIgICp2cDhfZmlsdGVyICAgICAgICAgIDogQXJyYXkgb2YgMiBiaS1saW5lYXIgZmlsdGVyIHRhcHMuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBVSU5UMTYgKm91dHB1dF9wdHIgICAgICAgOiBQb2ludGVyIHRvIGZpbHRlcmVkIGJsb2NrLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogQXBwbGllcyBhIDEtRCAyLXRhcCBiaS1saW5lYXIgZmlsdGVyIHRvIHRoZSBzb3VyY2UgYmxvY2sgaW4KKyAqICAgICAgICAgICAgICAgICAgZWl0aGVyIGhvcml6b250YWwgb3IgdmVydGljYWwgZGlyZWN0aW9uIHRvIHByb2R1Y2UgdGhlCisgKiAgICAgICAgICAgICAgICAgIGZpbHRlcmVkIG91dHB1dCBibG9jay4gVXNlZCB0byBpbXBsZW1lbnQgc2Vjb25kLXBhc3MKKyAqICAgICAgICAgICAgICAgICAgb2YgMi1EIHNlcGFyYWJsZSBmaWx0ZXIuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBSZXF1aXJlcyAzMi1iaXQgaW5wdXQgYXMgcHJvZHVjZWQgYnkgZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3MuCisgKiAgICAgICAgICAgICAgICAgIFR3byBmaWx0ZXIgdGFwcyBzaG91bGQgc3VtIHRvIFZQOF9GSUxURVJfV0VJR0hULgorICogICAgICAgICAgICAgICAgICBwaXhlbF9zdGVwIGRlZmluZXMgd2hldGhlciB0aGUgZmlsdGVyIGlzIGFwcGxpZWQKKyAqICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbGx5IChwaXhlbF9zdGVwPTEpIG9yIHZlcnRpY2FsbHkgKHBpeGVsX3N0ZXA9c3RyaWRlKS4KKyAqICAgICAgICAgICAgICAgICAgSXQgZGVmaW5lcyB0aGUgb2Zmc2V0IHJlcXVpcmVkIHRvIG1vdmUgZnJvbSBvbmUgaW5wdXQKKyAqICAgICAgICAgICAgICAgICAgdG8gdGhlIG5leHQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB2YXJfZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzCisoCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAgcGl4ZWxfc3RlcCwKKyAgICB1bnNpZ25lZCBpbnQgIG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICBvdXRwdXRfd2lkdGgsCisgICAgY29uc3Qgc2hvcnQgKnZwOF9maWx0ZXIKKykKK3sKKyAgICB1bnNpZ25lZCBpbnQgIGksIGo7CisgICAgaW50ICBUZW1wOworCisgICAgZm9yIChpID0gMDsgaSA8IG91dHB1dF9oZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRfd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQXBwbHkgZmlsdGVyICovCisgICAgICAgICAgICBUZW1wID0gKChpbnQpc3JjX3B0clswXSAgICAgICAgICAqIHZwOF9maWx0ZXJbMF0pICsKKyAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyW3BpeGVsX3N0ZXBdICogdnA4X2ZpbHRlclsxXSkgKworICAgICAgICAgICAgICAgICAgIChWUDhfRklMVEVSX1dFSUdIVCAvIDIpOworICAgICAgICAgICAgb3V0cHV0X3B0cltqXSA9ICh1bnNpZ25lZCBpbnQpKFRlbXAgPj4gVlA4X0ZJTFRFUl9TSElGVCk7CisgICAgICAgICAgICBzcmNfcHRyKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZXh0IHJvdy4uLiAqLworICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmUgLSBvdXRwdXRfd2lkdGg7CisgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3dpZHRoOworICAgIH0KK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisgICAgdW5zaWduZWQgc2hvcnQgRkRhdGEzWzUqNF07IC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisKKyAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07CisgICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOworCisgICAgLyogRmlyc3QgZmlsdGVyIDFkIEhvcml6b250YWwgKi8KKyAgICB2YXJfZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3Moc3JjX3B0ciwgRkRhdGEzLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA1LCA0LCBIRmlsdGVyKTsKKworICAgIC8qIE5vdyBmaWx0ZXIgVmVydGljYWx5ICovCisgICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcyhGRGF0YTMsIHRlbXAyLCA0LCAgNCwgIDQsICA0LCBWRmlsdGVyKTsKKworICAgIHJldHVybiB2cDhfdmFyaWFuY2U0eDRfYyh0ZW1wMiwgNCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9jCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIHVuc2lnbmVkIHNob3J0IEZEYXRhM1s5KjhdOyAvKiBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLworICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKyAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07CisgICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOworCisgICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzKHNyY19wdHIsIEZEYXRhMywgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgOCwgSEZpbHRlcik7CisgICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcyhGRGF0YTMsIHRlbXAyLCA4LCA4LCA4LCA4LCBWRmlsdGVyKTsKKworICAgIHJldHVybiB2cDhfdmFyaWFuY2U4eDhfYyh0ZW1wMiwgOCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9jCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIHVuc2lnbmVkIHNob3J0IEZEYXRhM1sxNyoxNl07ICAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKyAgICB1bnNpZ25lZCBjaGFyICB0ZW1wMlsyMCoxNl07CisgICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsICpWRmlsdGVyOworCisgICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOworICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKKworICAgIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcyhzcmNfcHRyLCBGRGF0YTMsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDE3LCAxNiwgSEZpbHRlcik7CisgICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcyhGRGF0YTMsIHRlbXAyLCAxNiwgMTYsIDE2LCAxNiwgVkZpbHRlcik7CisKKyAgICByZXR1cm4gdnA4X3ZhcmlhbmNlMTZ4MTZfYyh0ZW1wMiwgMTYsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Cit9CisKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9jKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgcmV0dXJuIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9jKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIDQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgc3NlKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2MoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICByZXR1cm4gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2Moc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgMCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCBzc2UpOworfQorCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2MoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICByZXR1cm4gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2Moc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgNCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCBzc2UpOworfQorCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX21zZTE2eDE2X2MKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2Moc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgeG9mZnNldCwgeW9mZnNldCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKKyAgICByZXR1cm4gKnNzZTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X2MKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgdW5zaWduZWQgc2hvcnQgRkRhdGEzWzE2KjldOyAgICAvKiBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLworICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKyAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07CisgICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOworCisgICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzKHNyY19wdHIsIEZEYXRhMywgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgMTYsIEhGaWx0ZXIpOworICAgIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3MoRkRhdGEzLCB0ZW1wMiwgMTYsIDE2LCA4LCAxNiwgVkZpbHRlcik7CisKKyAgICByZXR1cm4gdnA4X3ZhcmlhbmNlMTZ4OF9jKHRlbXAyLCAxNiwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2MKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgdW5zaWduZWQgc2hvcnQgRkRhdGEzWzkqMTZdOyAgICAvKiBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLworICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKworICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKKyAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07CisKKworICAgIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcyhzcmNfcHRyLCBGRGF0YTMsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDE3LCA4LCBIRmlsdGVyKTsKKyAgICB2YXJfZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzKEZEYXRhMywgdGVtcDIsIDgsIDgsIDE2LCA4LCBWRmlsdGVyKTsKKworICAgIHJldHVybiB2cDhfdmFyaWFuY2U4eDE2X2ModGVtcDIsIDgsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi92cDhfZW50cm9weW1vZGVkYXRhLmggYi9saWJ2cHgvdnA4L2NvbW1vbi92cDhfZW50cm9weW1vZGVkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlOWE5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3ZwOF9lbnRyb3B5bW9kZWRhdGEuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyovCisKKworLypHZW5lcmF0ZWQgZmlsZSwgaW5jbHVkZWQgYnkgZW50cm9weW1vZGUuYyovCisKKworY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X2Jtb2RlX2VuY29kaW5nc1tWUDhfQklOVFJBTU9ERVNdID0KK3sKKyAgICB7IDAsIDEgfSwKKyAgICB7IDIsIDIgfSwKKyAgICB7IDYsIDMgfSwKKyAgICB7IDI4LCA1IH0sCisgICAgeyAzMCwgNSB9LAorICAgIHsgNTgsIDYgfSwKKyAgICB7IDU5LCA2IH0sCisgICAgeyA2MiwgNiB9LAorICAgIHsgMTI2LCA3IH0sCisgICAgeyAxMjcsIDcgfQorfTsKKworY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X3ltb2RlX2VuY29kaW5nc1tWUDhfWU1PREVTXSA9Cit7CisgICAgeyAwLCAxIH0sCisgICAgeyA0LCAzIH0sCisgICAgeyA1LCAzIH0sCisgICAgeyA2LCAzIH0sCisgICAgeyA3LCAzIH0KK307CisKK2NvbnN0IHN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF9rZl95bW9kZV9lbmNvZGluZ3NbVlA4X1lNT0RFU10gPQoreworICAgIHsgNCwgMyB9LAorICAgIHsgNSwgMyB9LAorICAgIHsgNiwgMyB9LAorICAgIHsgNywgMyB9LAorICAgIHsgMCwgMSB9Cit9OworCitjb25zdCBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfdXZfbW9kZV9lbmNvZGluZ3NbVlA4X1VWX01PREVTXSA9Cit7CisgICAgeyAwLCAxIH0sCisgICAgeyAyLCAyIH0sCisgICAgeyA2LCAzIH0sCisgICAgeyA3LCAzIH0KK307CisKK2NvbnN0IHN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF9tYnNwbGl0X2VuY29kaW5nc1tWUDhfTlVNTUJTUExJVFNdID0KK3sKKyAgICB7IDYsIDMgfSwKKyAgICB7IDcsIDMgfSwKKyAgICB7IDIsIDIgfSwKKyAgICB7IDAsIDEgfQorfTsKKworY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X212X3JlZl9lbmNvZGluZ19hcnJheVtWUDhfTVZSRUZTXSA9Cit7CisgICAgeyAyLCAyIH0sCisgICAgeyA2LCAzIH0sCisgICAgeyAwLCAxIH0sCisgICAgeyAxNCwgNCB9LAorICAgIHsgMTUsIDQgfQorfTsKKworY29uc3Qgc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X3N1Yl9tdl9yZWZfZW5jb2RpbmdfYXJyYXlbVlA4X1NVQk1WUkVGU10gPQoreworICAgIHsgMCwgMSB9LAorICAgIHsgMiwgMiB9LAorICAgIHsgNiwgMyB9LAorICAgIHsgNywgMyB9Cit9OworCitjb25zdCBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfc21hbGxfbXZlbmNvZGluZ3NbOF0gPQoreworICAgIHsgMCwgMyB9LAorICAgIHsgMSwgMyB9LAorICAgIHsgMiwgMyB9LAorICAgIHsgMywgMyB9LAorICAgIHsgNCwgMyB9LAorICAgIHsgNSwgMyB9LAorICAgIHsgNiwgMyB9LAorICAgIHsgNywgMyB9Cit9OworCitjb25zdCB2cDhfcHJvYiB2cDhfeW1vZGVfcHJvYltWUDhfWU1PREVTLTFdID0KK3sKKyAgICAxMTIsIDg2LCAxNDAsIDM3Cit9OworCitjb25zdCB2cDhfcHJvYiB2cDhfa2ZfeW1vZGVfcHJvYltWUDhfWU1PREVTLTFdID0KK3sKKyAgICAxNDUsIDE1NiwgMTYzLCAxMjgKK307CisKK2NvbnN0IHZwOF9wcm9iIHZwOF91dl9tb2RlX3Byb2JbVlA4X1VWX01PREVTLTFdID0KK3sKKyAgICAxNjIsIDEwMSwgMjA0Cit9OworCitjb25zdCB2cDhfcHJvYiB2cDhfa2ZfdXZfbW9kZV9wcm9iW1ZQOF9VVl9NT0RFUy0xXSA9Cit7CisgICAgMTQyLCAxMTQsIDE4MworfTsKKworY29uc3QgdnA4X3Byb2IgdnA4X2Jtb2RlX3Byb2JbVlA4X0JJTlRSQU1PREVTLTFdID0KK3sKKyAgICAxMjAsIDkwLCA3OSwgMTMzLCA4NywgODUsIDgwLCAxMTEsIDE1MQorfTsKKworCisKK2NvbnN0IHZwOF9wcm9iIHZwOF9rZl9ibW9kZV9wcm9iCitbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTLTFdID0KK3sKKyAgICB7CisgICAgICAgIHsgMjMxLCAxMjAsICA0OCwgIDg5LCAxMTUsIDExMywgMTIwLCAxNTIsIDExMiB9LAorICAgICAgICB7IDE1MiwgMTc5LCAgNjQsIDEyNiwgMTcwLCAxMTgsICA0NiwgIDcwLCAgOTUgfSwKKyAgICAgICAgeyAxNzUsICA2OSwgMTQzLCAgODAsICA4NSwgIDgyLCAgNzIsIDE1NSwgMTAzIH0sCisgICAgICAgIHsgIDU2LCAgNTgsICAxMCwgMTcxLCAyMTgsIDE4OSwgIDE3LCAgMTMsIDE1MiB9LAorICAgICAgICB7IDE0NCwgIDcxLCAgMTAsICAzOCwgMTcxLCAyMTMsIDE0NCwgIDM0LCAgMjYgfSwKKyAgICAgICAgeyAxMTQsICAyNiwgIDE3LCAxNjMsICA0NCwgMTk1LCAgMjEsICAxMCwgMTczIH0sCisgICAgICAgIHsgMTIxLCAgMjQsICA4MCwgMTk1LCAgMjYsICA2MiwgIDQ0LCAgNjQsICA4NSB9LAorICAgICAgICB7IDE3MCwgIDQ2LCAgNTUsICAxOSwgMTM2LCAxNjAsICAzMywgMjA2LCAgNzEgfSwKKyAgICAgICAgeyAgNjMsICAyMCwgICA4LCAxMTQsIDExNCwgMjA4LCAgMTIsICAgOSwgMjI2IH0sCisgICAgICAgIHsgIDgxLCAgNDAsICAxMSwgIDk2LCAxODIsICA4NCwgIDI5LCAgMTYsICAzNiB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTM0LCAxODMsICA4OSwgMTM3LCAgOTgsIDEwMSwgMTA2LCAxNjUsIDE0OCB9LAorICAgICAgICB7ICA3MiwgMTg3LCAxMDAsIDEzMCwgMTU3LCAxMTEsICAzMiwgIDc1LCAgODAgfSwKKyAgICAgICAgeyAgNjYsIDEwMiwgMTY3LCAgOTksICA3NCwgIDYyLCAgNDAsIDIzNCwgMTI4IH0sCisgICAgICAgIHsgIDQxLCAgNTMsICAgOSwgMTc4LCAyNDEsIDE0MSwgIDI2LCAgIDgsIDEwNyB9LAorICAgICAgICB7IDEwNCwgIDc5LCAgMTIsICAyNywgMjE3LCAyNTUsICA4NywgIDE3LCAgIDcgfSwKKyAgICAgICAgeyAgNzQsICA0MywgIDI2LCAxNDYsICA3MywgMTY2LCAgNDksICAyMywgMTU3IH0sCisgICAgICAgIHsgIDY1LCAgMzgsIDEwNSwgMTYwLCAgNTEsICA1MiwgIDMxLCAxMTUsIDEyOCB9LAorICAgICAgICB7ICA4NywgIDY4LCAgNzEsICA0NCwgMTE0LCAgNTEsICAxNSwgMTg2LCAgMjMgfSwKKyAgICAgICAgeyAgNDcsICA0MSwgIDE0LCAxMTAsIDE4MiwgMTgzLCAgMjEsICAxNywgMTk0IH0sCisgICAgICAgIHsgIDY2LCAgNDUsICAyNSwgMTAyLCAxOTcsIDE4OSwgIDIzLCAgMTgsICAyMiB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgIDg4LCAgODgsIDE0NywgMTUwLCAgNDIsICA0NiwgIDQ1LCAxOTYsIDIwNSB9LAorICAgICAgICB7ICA0MywgIDk3LCAxODMsIDExNywgIDg1LCAgMzgsICAzNSwgMTc5LCAgNjEgfSwKKyAgICAgICAgeyAgMzksICA1MywgMjAwLCAgODcsICAyNiwgIDIxLCAgNDMsIDIzMiwgMTcxIH0sCisgICAgICAgIHsgIDU2LCAgMzQsICA1MSwgMTA0LCAxMTQsIDEwMiwgIDI5LCAgOTMsICA3NyB9LAorICAgICAgICB7IDEwNywgIDU0LCAgMzIsICAyNiwgIDUxLCAgIDEsICA4MSwgIDQzLCAgMzEgfSwKKyAgICAgICAgeyAgMzksICAyOCwgIDg1LCAxNzEsICA1OCwgMTY1LCAgOTAsICA5OCwgIDY0IH0sCisgICAgICAgIHsgIDM0LCAgMjIsIDExNiwgMjA2LCAgMjMsICAzNCwgIDQzLCAxNjYsICA3MyB9LAorICAgICAgICB7ICA2OCwgIDI1LCAxMDYsICAyMiwgIDY0LCAxNzEsICAzNiwgMjI1LCAxMTQgfSwKKyAgICAgICAgeyAgMzQsICAxOSwgIDIxLCAxMDIsIDEzMiwgMTg4LCAgMTYsICA3NiwgMTI0IH0sCisgICAgICAgIHsgIDYyLCAgMTgsICA3OCwgIDk1LCAgODUsICA1NywgIDUwLCAgNDgsICA1MSB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTkzLCAxMDEsICAzNSwgMTU5LCAyMTUsIDExMSwgIDg5LCAgNDYsIDExMSB9LAorICAgICAgICB7ICA2MCwgMTQ4LCAgMzEsIDE3MiwgMjE5LCAyMjgsICAyMSwgIDE4LCAxMTEgfSwKKyAgICAgICAgeyAxMTIsIDExMywgIDc3LCAgODUsIDE3OSwgMjU1LCAgMzgsIDEyMCwgMTE0IH0sCisgICAgICAgIHsgIDQwLCAgNDIsICAgMSwgMTk2LCAyNDUsIDIwOSwgIDEwLCAgMjUsIDEwOSB9LAorICAgICAgICB7IDEwMCwgIDgwLCAgIDgsICA0MywgMTU0LCAgIDEsICA1MSwgIDI2LCAgNzEgfSwKKyAgICAgICAgeyAgODgsICA0MywgIDI5LCAxNDAsIDE2NiwgMjEzLCAgMzcsICA0MywgMTU0IH0sCisgICAgICAgIHsgIDYxLCAgNjMsICAzMCwgMTU1LCAgNjcsICA0NSwgIDY4LCAgIDEsIDIwOSB9LAorICAgICAgICB7IDE0MiwgIDc4LCAgNzgsICAxNiwgMjU1LCAxMjgsICAzNCwgMTk3LCAxNzEgfSwKKyAgICAgICAgeyAgNDEsICA0MCwgICA1LCAxMDIsIDIxMSwgMTgzLCAgIDQsICAgMSwgMjIxIH0sCisgICAgICAgIHsgIDUxLCAgNTAsICAxNywgMTY4LCAyMDksIDE5MiwgIDIzLCAgMjUsICA4MiB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTI1LCAgOTgsICA0MiwgIDg4LCAxMDQsICA4NSwgMTE3LCAxNzUsICA4MiB9LAorICAgICAgICB7ICA5NSwgIDg0LCAgNTMsICA4OSwgMTI4LCAxMDAsIDExMywgMTAxLCAgNDUgfSwKKyAgICAgICAgeyAgNzUsICA3OSwgMTIzLCAgNDcsICA1MSwgMTI4LCAgODEsIDE3MSwgICAxIH0sCisgICAgICAgIHsgIDU3LCAgMTcsICAgNSwgIDcxLCAxMDIsICA1NywgIDUzLCAgNDEsICA0OSB9LAorICAgICAgICB7IDExNSwgIDIxLCAgIDIsICAxMCwgMTAyLCAyNTUsIDE2NiwgIDIzLCAgIDYgfSwKKyAgICAgICAgeyAgMzgsICAzMywgIDEzLCAxMjEsICA1NywgIDczLCAgMjYsICAgMSwgIDg1IH0sCisgICAgICAgIHsgIDQxLCAgMTAsICA2NywgMTM4LCAgNzcsIDExMCwgIDkwLCAgNDcsIDExNCB9LAorICAgICAgICB7IDEwMSwgIDI5LCAgMTYsICAxMCwgIDg1LCAxMjgsIDEwMSwgMTk2LCAgMjYgfSwKKyAgICAgICAgeyAgNTcsICAxOCwgIDEwLCAxMDIsIDEwMiwgMjEzLCAgMzQsICAyMCwgIDQzIH0sCisgICAgICAgIHsgMTE3LCAgMjAsICAxNSwgIDM2LCAxNjMsIDEyOCwgIDY4LCAgIDEsICAyNiB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTM4LCAgMzEsICAzNiwgMTcxLCAgMjcsIDE2NiwgIDM4LCAgNDQsIDIyOSB9LAorICAgICAgICB7ICA2NywgIDg3LCAgNTgsIDE2OSwgIDgyLCAxMTUsICAyNiwgIDU5LCAxNzkgfSwKKyAgICAgICAgeyAgNjMsICA1OSwgIDkwLCAxODAsICA1OSwgMTY2LCAgOTMsICA3MywgMTU0IH0sCisgICAgICAgIHsgIDQwLCAgNDAsICAyMSwgMTE2LCAxNDMsIDIwOSwgIDM0LCAgMzksIDE3NSB9LAorICAgICAgICB7ICA1NywgIDQ2LCAgMjIsICAyNCwgMTI4LCAgIDEsICA1NCwgIDE3LCAgMzcgfSwKKyAgICAgICAgeyAgNDcsICAxNSwgIDE2LCAxODMsICAzNCwgMjIzLCAgNDksICA0NSwgMTgzIH0sCisgICAgICAgIHsgIDQ2LCAgMTcsICAzMywgMTgzLCAgIDYsICA5OCwgIDE1LCAgMzIsIDE4MyB9LAorICAgICAgICB7ICA2NSwgIDMyLCAgNzMsIDExNSwgIDI4LCAxMjgsICAyMywgMTI4LCAyMDUgfSwKKyAgICAgICAgeyAgNDAsICAgMywgICA5LCAxMTUsICA1MSwgMTkyLCAgMTgsICAgNiwgMjIzIH0sCisgICAgICAgIHsgIDg3LCAgMzcsICAgOSwgMTE1LCAgNTksICA3NywgIDY0LCAgMjEsICA0NyB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTA0LCAgNTUsICA0NCwgMjE4LCAgIDksICA1NCwgIDUzLCAxMzAsIDIyNiB9LAorICAgICAgICB7ICA2NCwgIDkwLCAgNzAsIDIwNSwgIDQwLCAgNDEsICAyMywgIDI2LCAgNTcgfSwKKyAgICAgICAgeyAgNTQsICA1NywgMTEyLCAxODQsICAgNSwgIDQxLCAgMzgsIDE2NiwgMjEzIH0sCisgICAgICAgIHsgIDMwLCAgMzQsICAyNiwgMTMzLCAxNTIsIDExNiwgIDEwLCAgMzIsIDEzNCB9LAorICAgICAgICB7ICA3NSwgIDMyLCAgMTIsICA1MSwgMTkyLCAyNTUsIDE2MCwgIDQzLCAgNTEgfSwKKyAgICAgICAgeyAgMzksICAxOSwgIDUzLCAyMjEsICAyNiwgMTE0LCAgMzIsICA3MywgMjU1IH0sCisgICAgICAgIHsgIDMxLCAgIDksICA2NSwgMjM0LCAgIDIsICAxNSwgICAxLCAxMTgsICA3MyB9LAorICAgICAgICB7ICA4OCwgIDMxLCAgMzUsICA2NywgMTAyLCAgODUsICA1NSwgMTg2LCAgODUgfSwKKyAgICAgICAgeyAgNTYsICAyMSwgIDIzLCAxMTEsICA1OSwgMjA1LCAgNDUsICAzNywgMTkyIH0sCisgICAgICAgIHsgIDU1LCAgMzgsICA3MCwgMTI0LCAgNzMsIDEwMiwgICAxLCAgMzQsICA5OCB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTAyLCAgNjEsICA3MSwgIDM3LCAgMzQsICA1MywgIDMxLCAyNDMsIDE5MiB9LAorICAgICAgICB7ICA2OSwgIDYwLCAgNzEsICAzOCwgIDczLCAxMTksICAyOCwgMjIyLCAgMzcgfSwKKyAgICAgICAgeyAgNjgsICA0NSwgMTI4LCAgMzQsICAgMSwgIDQ3LCAgMTEsIDI0NSwgMTcxIH0sCisgICAgICAgIHsgIDYyLCAgMTcsICAxOSwgIDcwLCAxNDYsICA4NSwgIDU1LCAgNjIsICA3MCB9LAorICAgICAgICB7ICA3NSwgIDE1LCAgIDksICAgOSwgIDY0LCAyNTUsIDE4NCwgMTE5LCAgMTYgfSwKKyAgICAgICAgeyAgMzcsICA0MywgIDM3LCAxNTQsIDEwMCwgMTYzLCAgODUsIDE2MCwgICAxIH0sCisgICAgICAgIHsgIDYzLCAgIDksICA5MiwgMTM2LCAgMjgsICA2NCwgIDMyLCAyMDEsICA4NSB9LAorICAgICAgICB7ICA4NiwgICA2LCAgMjgsICAgNSwgIDY0LCAyNTUsICAyNSwgMjQ4LCAgIDEgfSwKKyAgICAgICAgeyAgNTYsICAgOCwgIDE3LCAxMzIsIDEzNywgMjU1LCAgNTUsIDExNiwgMTI4IH0sCisgICAgICAgIHsgIDU4LCAgMTUsICAyMCwgIDgyLCAxMzUsICA1NywgIDI2LCAxMjEsICA0MCB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTY0LCAgNTAsICAzMSwgMTM3LCAxNTQsIDEzMywgIDI1LCAgMzUsIDIxOCB9LAorICAgICAgICB7ICA1MSwgMTAzLCAgNDQsIDEzMSwgMTMxLCAxMjMsICAzMSwgICA2LCAxNTggfSwKKyAgICAgICAgeyAgODYsICA0MCwgIDY0LCAxMzUsIDE0OCwgMjI0LCAgNDUsIDE4MywgMTI4IH0sCisgICAgICAgIHsgIDIyLCAgMjYsICAxNywgMTMxLCAyNDAsIDE1NCwgIDE0LCAgIDEsIDIwOSB9LAorICAgICAgICB7ICA4MywgIDEyLCAgMTMsICA1NCwgMTkyLCAyNTUsICA2OCwgIDQ3LCAgMjggfSwKKyAgICAgICAgeyAgNDUsICAxNiwgIDIxLCAgOTEsICA2NCwgMjIyLCAgIDcsICAgMSwgMTk3IH0sCisgICAgICAgIHsgIDU2LCAgMjEsICAzOSwgMTU1LCAgNjAsIDEzOCwgIDIzLCAxMDIsIDIxMyB9LAorICAgICAgICB7ICA4NSwgIDI2LCAgODUsICA4NSwgMTI4LCAxMjgsICAzMiwgMTQ2LCAxNzEgfSwKKyAgICAgICAgeyAgMTgsICAxMSwgICA3LCAgNjMsIDE0NCwgMTcxLCAgIDQsICAgNCwgMjQ2IH0sCisgICAgICAgIHsgIDM1LCAgMjcsICAxMCwgMTQ2LCAxNzQsIDE3MSwgIDEyLCAgMjYsIDEyOCB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTkwLCAgODAsICAzNSwgIDk5LCAxODAsICA4MCwgMTI2LCAgNTQsICA0NSB9LAorICAgICAgICB7ICA4NSwgMTI2LCAgNDcsICA4NywgMTc2LCAgNTEsICA0MSwgIDIwLCAgMzIgfSwKKyAgICAgICAgeyAxMDEsICA3NSwgMTI4LCAxMzksIDExOCwgMTQ2LCAxMTYsIDEyOCwgIDg1IH0sCisgICAgICAgIHsgIDU2LCAgNDEsICAxNSwgMTc2LCAyMzYsICA4NSwgIDM3LCAgIDksICA2MiB9LAorICAgICAgICB7IDE0NiwgIDM2LCAgMTksICAzMCwgMTcxLCAyNTUsICA5NywgIDI3LCAgMjAgfSwKKyAgICAgICAgeyAgNzEsICAzMCwgIDE3LCAxMTksIDExOCwgMjU1LCAgMTcsICAxOCwgMTM4IH0sCisgICAgICAgIHsgMTAxLCAgMzgsICA2MCwgMTM4LCAgNTUsICA3MCwgIDQzLCAgMjYsIDE0MiB9LAorICAgICAgICB7IDEzOCwgIDQ1LCAgNjEsICA2MiwgMjE5LCAgIDEsICA4MSwgMTg4LCAgNjQgfSwKKyAgICAgICAgeyAgMzIsICA0MSwgIDIwLCAxMTcsIDE1MSwgMTQyLCAgMjAsICAyMSwgMTYzIH0sCisgICAgICAgIHsgMTEyLCAgMTksICAxMiwgIDYxLCAxOTUsIDEyOCwgIDQ4LCAgIDQsICAyNCB9CisgICAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9kZXF1YW50aXplX21teC5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvZGVxdWFudGl6ZV9tbXguYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNTUxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvZGVxdWFudGl6ZV9tbXguYXNtCkBAIC0wLDAgKzEsMjU4IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKworO3ZvaWQgdnA4X2RlcXVhbnRpemVfYl9pbXBsX21teChzaG9ydCAqc3EsIHNob3J0ICpkcSwgc2hvcnQgKnEpCitnbG9iYWwgc3ltKHZwOF9kZXF1YW50aXplX2JfaW1wbF9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfZGVxdWFudGl6ZV9iX2ltcGxfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDMKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgcnNpLCBhcmcoMCkgO3NxCisgICAgICAgIG1vdiAgICAgICByZGksIGFyZygxKSA7ZHEKKyAgICAgICAgbW92ICAgICAgIHJheCwgYXJnKDIpIDtxCisKKyAgICAgICAgbW92cSAgICAgIG1tMSwgW3JzaV0KKyAgICAgICAgcG11bGx3ICAgIG1tMSwgW3JheCswXSAgICAgICAgICAgIDsgbW00ICo9IGtlcm5lbCAwIG1vZGlmaWVycy4KKyAgICAgICAgbW92cSAgICAgIFtyZGldLCBtbTEKKworICAgICAgICBtb3ZxICAgICAgbW0xLCBbcnNpKzhdCisgICAgICAgIHBtdWxsdyAgICBtbTEsIFtyYXgrOF0gICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMCBtb2RpZmllcnMuCisgICAgICAgIG1vdnEgICAgICBbcmRpKzhdLCBtbTEKKworICAgICAgICBtb3ZxICAgICAgbW0xLCBbcnNpKzE2XQorICAgICAgICBwbXVsbHcgICAgbW0xLCBbcmF4KzE2XSAgICAgICAgICAgIDsgbW00ICo9IGtlcm5lbCAwIG1vZGlmaWVycy4KKyAgICAgICAgbW92cSAgICAgIFtyZGkrMTZdLCBtbTEKKworICAgICAgICBtb3ZxICAgICAgbW0xLCBbcnNpKzI0XQorICAgICAgICBwbXVsbHcgICAgbW0xLCBbcmF4KzI0XSAgICAgICAgICAgIDsgbW00ICo9IGtlcm5lbCAwIG1vZGlmaWVycy4KKyAgICAgICAgbW92cSAgICAgIFtyZGkrMjRdLCBtbTEKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgZGVxdWFudF9pZGN0X2FkZF9tbXgoCis7c2hvcnQgKmlucHV0LCAgICAgICAgICAgIDAKKztzaG9ydCAqZHEsICAgICAgICAgICAgICAgMQorO3Vuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAyCis7aW50IHN0cmlkZSkgICAgICAgICAgICAgIDMKK2dsb2JhbCBzeW0odnA4X2RlcXVhbnRfaWRjdF9hZGRfbW14KSBQUklWQVRFCitzeW0odnA4X2RlcXVhbnRfaWRjdF9hZGRfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByYXgsICAgIGFyZygwKSA7aW5wdXQKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICBhcmcoMSkgO2RxCisKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtyYXggICBdCisgICAgICAgIHBtdWxsdyAgICAgIG1tMCwgICAgW3JkeF0KKworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgIFtyYXggKzhdCisgICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgW3JkeCArOF0KKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIFtyYXgrMTZdCisgICAgICAgIHBtdWxsdyAgICAgIG1tMiwgICAgW3JkeCsxNl0KKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIFtyYXgrMjRdCisgICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgW3JkeCsyNF0KKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgIGFyZygyKSA7ZGVzdAorCisgICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03CisKKworICAgICAgICBtb3ZxICAgICAgICBbcmF4XSwgICBtbTcKKyAgICAgICAgbW92cSAgICAgICAgW3JheCs4XSwgbW03CisKKyAgICAgICAgbW92cSAgICAgICAgW3JheCsxNl0sbW03CisgICAgICAgIG1vdnEgICAgICAgIFtyYXgrMjRdLG1tNworCisKKyAgICAgICAgbW92c3hkICAgICAgcmRpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3N0cmlkZQorCisgICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBiMT0gMC0yCisgICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKKyAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGExID0wKzIKKworICAgICAgICBwbXVsaHcgICAgICBtbTUsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildOworICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgaXAxICogc2luKHBpLzgpICogc3FydCgyKQorCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOworICAgICAgICBwbXVsaHcgICAgICBtbTcsICAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV07CisKKyAgICAgICAgcGFkZHcgICAgICAgbW03LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKKyAgICAgICAgcHN1YncgICAgICAgbW03LCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGMxCisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0zCisKKyAgICAgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKKworICAgICAgICBwbXVsaHcgICAgICBtbTMsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTQKKworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgZDEKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGExCisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGIxCisgICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzAKKworICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsxCisgICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzIKKworICAgICAgICBwc3VidyAgICAgICBtbTYsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDszCisKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IDAzIDAyIDAxIDAwCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAyMyAyMiAyMSAyMAorCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAorICAgICAgICBwdW5wY2tod2QgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKKworICAgICAgICBwdW5wY2tsd2QgICBtbTMsICAgICAgICAgICAgbW02ICAgICAgICAgICAgIDsgMzEgMjEgMzAgMjAKKyAgICAgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMzIDIzIDMyIDIyCisKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IDExIDAxIDEwIDAwCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMgorCisgICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMCAyMCAxMCAwMAorICAgICAgICBwdW5wY2toZHEgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzEgMjEgMTEgMDEKKworICAgICAgICBwdW5wY2tsZHEgICBtbTIsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMzIgMjIgMTIgMDIKKyAgICAgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCisKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCisKKyAgICAgICAgcHN1YncgICAgICAgbW0wLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGIxPSAwLTIKKyAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQorICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgYTEgPTArMgorCisgICAgICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV07CisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgOyBpcDEgKiBzaW4ocGkvOCkgKiBzcXJ0KDIpCisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxodyAgICAgIG1tNywgICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXTsKKworICAgICAgICBwYWRkdyAgICAgICBtbTcsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgaXAzICogY29zKHBpLzgpICogc3FydCgyKQorICAgICAgICBwc3VidyAgICAgICBtbTcsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgYzEKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTMKKworICAgICAgICBwbXVsaHcgICAgICBtbTUsICAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV0KKyAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgICAgIG1tMQorCisgICAgICAgIHBtdWxodyAgICAgIG1tMywgICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgICAgIG1tNAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyBkMQorICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgICAgICAgICAgW0dMT0JBTChmb3VycyldCisKKyAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIFtHTE9CQUwoZm91cnMpXQorICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgYTEKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgYjEKKyAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7MAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzEKKyAgICAgICAgcHN1YncgICAgICAgbW0wLCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICA7MgorCisgICAgICAgIHBzdWJ3ICAgICAgIG1tNiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzMKKyAgICAgICAgcHNyYXcgICAgICAgbW0yLCAgICAgICAgICAgIDMKKworICAgICAgICBwc3JhdyAgICAgICBtbTAsICAgICAgICAgICAgMworICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICAgICAgMworCisgICAgICAgIHBzcmF3ICAgICAgIG1tNiwgICAgICAgICAgICAzCisKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IDAzIDAyIDAxIDAwCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAyMyAyMiAyMSAyMAorCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAorICAgICAgICBwdW5wY2tod2QgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKKworICAgICAgICBwdW5wY2tsd2QgICBtbTMsICAgICAgICAgICAgbW02ICAgICAgICAgICAgIDsgMzEgMjEgMzAgMjAKKyAgICAgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMzIDIzIDMyIDIyCisKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IDExIDAxIDEwIDAwCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMgorCisgICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMCAyMCAxMCAwMAorICAgICAgICBwdW5wY2toZHEgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzEgMjEgMTEgMDEKKworICAgICAgICBwdW5wY2tsZHEgICBtbTIsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMzIgMjIgMTIgMDIKKyAgICAgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCisKKyAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgICAgIG1tNworCisgICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcmR4XQorICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICAgICAgbW03CisgICAgICAgIHBhZGRzdyAgICAgIG1tMCwgICAgICAgICAgICBtbTQKKyAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICAgICAgICAgIG1tNworICAgICAgICBtb3ZkICAgICAgICBbcmR4XSwgICAgICAgICAgbW0wCisKKyAgICAgICAgbW92ZCAgICAgICAgbW00LCAgICAgICAgICAgIFtyZHgrcmRpXQorICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICAgICAgbW03CisgICAgICAgIHBhZGRzdyAgICAgIG1tMSwgICAgICAgICAgICBtbTQKKyAgICAgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgICAgIG1tNworICAgICAgICBtb3ZkICAgICAgICBbcmR4K3JkaV0sICAgICAgbW0xCisKKyAgICAgICAgbW92ZCAgICAgICAgbW00LCAgICAgICAgICAgIFtyZHgrMipyZGldCisgICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgICAgICBtbTcKKyAgICAgICAgcGFkZHN3ICAgICAgbW0yLCAgICAgICAgICAgIG1tNAorICAgICAgICBwYWNrdXN3YiAgICBtbTIsICAgICAgICAgICAgbW03CisgICAgICAgIG1vdmQgICAgICAgIFtyZHgrcmRpKjJdLCAgICBtbTIKKworICAgICAgICBhZGQgICAgICAgICByZHgsICAgICAgICAgICAgcmRpCisKKyAgICAgICAgbW92ZCAgICAgICAgbW00LCAgICAgICAgICAgIFtyZHgrMipyZGldCisgICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgICAgICBtbTcKKyAgICAgICAgcGFkZHN3ICAgICAgbW01LCAgICAgICAgICAgIG1tNAorICAgICAgICBwYWNrdXN3YiAgICBtbTUsICAgICAgICAgICAgbW03CisgICAgICAgIG1vdmQgICAgICAgIFtyZHgrcmRpKjJdLCAgICBtbTUKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK3hfczFzcXIyOgorICAgIHRpbWVzIDQgZHcgMHg4QThDCithbGlnbiAxNgoreF9jMXNxcjJsZXNzMToKKyAgICB0aW1lcyA0IGR3IDB4NEU3QgorYWxpZ24gMTYKK2ZvdXJzOgorICAgIHRpbWVzIDQgZHcgMHgwMDA0CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvZmlsdGVyX3g4Ni5jIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2ZpbHRlcl94ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFiODE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2ZpbHRlcl94ODYuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3Qgc2hvcnQsIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80WzhdWzhdKSA9Cit7CisgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgIHsgMTEyLCAxMTIsIDExMiwgMTEyLCAgMTYsICAxNiwgIDE2LCAgMTYgfSwKKyAgICB7ICA5NiwgIDk2LCAgOTYsICA5NiwgIDMyLCAgMzIsICAzMiwgIDMyIH0sCisgICAgeyAgODAsICA4MCwgIDgwLCAgODAsICA0OCwgIDQ4LCAgNDgsICA0OCB9LAorICAgIHsgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQgfSwKKyAgICB7ICA0OCwgIDQ4LCAgNDgsICA0OCwgIDgwLCAgODAsICA4MCwgIDgwIH0sCisgICAgeyAgMzIsICAzMiwgIDMyLCAgMzIsICA5NiwgIDk2LCAgOTYsICA5NiB9LAorICAgIHsgIDE2LCAgMTYsICAxNiwgIDE2LCAxMTIsIDExMiwgMTEyLCAxMTIgfQorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzhbOF1bMTZdKSA9Cit7CisgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwKKyAgICB7IDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNiB9LAorICAgIHsgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYsICAzMiwgIDMyLCAgMzIsICAzMiwgIDMyLCAgMzIsICAzMiwgIDMyIH0sCisgICAgeyAgODAsICA4MCwgIDgwLCAgODAsICA4MCwgIDgwLCAgODAsICA4MCwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDggfSwKKyAgICB7ICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCB9LAorICAgIHsgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDgsICA4MCwgIDgwLCAgODAsICA4MCwgIDgwLCAgODAsICA4MCwgIDgwIH0sCisgICAgeyAgMzIsICAzMiwgIDMyLCAgMzIsICAzMiwgIDMyLCAgMzIsICAzMiwgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYgfSwKKyAgICB7ICAxNiwgIDE2LCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNiwgIDE2LCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiB9Cit9OwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L2ZpbHRlcl94ODYuaCBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9maWx0ZXJfeDg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjYzRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9maWx0ZXJfeDg2LmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIEZJTFRFUl9YODZfSAorI2RlZmluZSBGSUxURVJfWDg2X0gKKworLyogeDg2IGFzc2VtYmx5IHNwZWNpZmljIGNvcHkgb2YgdnA4L2NvbW1vbi9maWx0ZXIuYzp2cDhfYmlsaW5lYXJfZmlsdGVycyB3aXRoCisgKiBkdXBsaWNhdGVkIHZhbHVlcyAqLworZXh0ZXJuIGNvbnN0IHNob3J0IHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80WzhdWzhdOyAgLyogZHVwbGljYXRlZCA0eCAqLworZXh0ZXJuIGNvbnN0IHNob3J0IHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl84WzhdWzE2XTsgLyogZHVwbGljYXRlZCA4eCAqLworCisjZW5kaWYgLyogRklMVEVSX1g4Nl9IICovCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvaWRjdF9ibGtfbW14LmMgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvaWRjdF9ibGtfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkZjNmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9pZGN0X2Jsa19tbXguYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKworZXh0ZXJuIHZvaWQgdnA4X2RlcXVhbnRpemVfYl9pbXBsX21teChzaG9ydCAqc3EsIHNob3J0ICpkcSwgc2hvcnQgKnEpOworCit2b2lkIHZwOF9kZXF1YW50aXplX2JfbW14KEJMT0NLRCAqZCwgc2hvcnQgKkRRQykKK3sKKyAgICBzaG9ydCAqc3EgPSAoc2hvcnQgKikgZC0+cWNvZWZmOworICAgIHNob3J0ICpkcSA9IChzaG9ydCAqKSBkLT5kcWNvZWZmOworCisgICAgdnA4X2RlcXVhbnRpemVfYl9pbXBsX21teChzcSwgZHEsIERRQyk7Cit9CisKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19tbXgKKyAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBpZiAoZW9ic1swXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHEsIGRxLCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGVsc2UgaWYgKGVvYnNbMF0gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChxWzBdKmRxWzBdLCBkc3QsIHN0cmlkZSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9ic1sxXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHErMTYsIGRxLCBkc3QrNCwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZiAoZW9ic1sxXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbMTZdKmRxWzBdLCBkc3QrNCwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QrNCwgc3RyaWRlKTsKKyAgICAgICAgICAgICgoaW50ICopKHErMTYpKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9ic1syXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHErMzIsIGRxLCBkc3QrOCwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZiAoZW9ic1syXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbMzJdKmRxWzBdLCBkc3QrOCwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QrOCwgc3RyaWRlKTsKKyAgICAgICAgICAgICgoaW50ICopKHErMzIpKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9ic1szXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHErNDgsIGRxLCBkc3QrMTIsIHN0cmlkZSk7CisgICAgICAgIGVsc2UgaWYgKGVvYnNbM10gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChxWzQ4XSpkcVswXSwgZHN0KzEyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCsxMiwgc3RyaWRlKTsKKyAgICAgICAgICAgICgoaW50ICopKHErNDgpKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBxICAgICs9IDY0OworICAgICAgICBkc3QgICs9IDQqc3RyaWRlOworICAgICAgICBlb2JzICs9IDQ7CisgICAgfQorfQorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX21teAorICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0dSwgdW5zaWduZWQgY2hhciAqZHN0diwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBpZiAoZW9ic1swXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHEsIGRxLCBkc3R1LCBzdHJpZGUpOworICAgICAgICBlbHNlIGlmIChlb2JzWzBdID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCAocVswXSpkcVswXSwgZHN0dSwgc3RyaWRlLCBkc3R1LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9ic1sxXSA+IDEpCisgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHErMTYsIGRxLCBkc3R1KzQsIHN0cmlkZSk7CisgICAgICAgIGVsc2UgaWYgKGVvYnNbMV0gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChxWzE2XSpkcVswXSwgZHN0dSs0LCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHUrNCwgc3RyaWRlKTsKKyAgICAgICAgICAgICgoaW50ICopKHErMTYpKVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBxICAgICs9IDMyOworICAgICAgICBkc3R1ICs9IDQqc3RyaWRlOworICAgICAgICBlb2JzICs9IDI7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChlb2JzWzBdID4gMSkKKyAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21teCAocSwgZHEsIGRzdHYsIHN0cmlkZSk7CisgICAgICAgIGVsc2UgaWYgKGVvYnNbMF0gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChxWzBdKmRxWzBdLCBkc3R2LCBzdHJpZGUsIGRzdHYsIHN0cmlkZSk7CisgICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlb2JzWzFdID4gMSkKKyAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21teCAocSsxNiwgZHEsIGRzdHYrNCwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZiAoZW9ic1sxXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbMTZdKmRxWzBdLCBkc3R2KzQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0dis0LCBzdHJpZGUpOworICAgICAgICAgICAgKChpbnQgKikocSsxNikpWzBdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHEgICAgKz0gMzI7CisgICAgICAgIGRzdHYgKz0gNCpzdHJpZGU7CisgICAgICAgIGVvYnMgKz0gMjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvaWRjdF9ibGtfc3NlMi5jIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2lkY3RfYmxrX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZlMDUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2lkY3RfYmxrX3NzZTIuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKwordm9pZCB2cDhfaWRjdF9kZXF1YW50XzBfMnhfc3NlMgorICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEgLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOwordm9pZCB2cDhfaWRjdF9kZXF1YW50X2Z1bGxfMnhfc3NlMgorICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEgLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOworCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfc3NlMgorICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVswXSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzBdICYgMHhmZWZlKQorICAgICAgICAgICAgICAgIHZwOF9pZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyIChxLCBkcSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZwOF9pZGN0X2RlcXVhbnRfMF8yeF9zc2UyIChxLCBkcSwgZHN0LCBzdHJpZGUpOworICAgICAgICB9CisgICAgICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzFdICYgMHhmZWZlKQorICAgICAgICAgICAgICAgIHZwOF9pZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyIChxKzMyLCBkcSwgZHN0KzgsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdnA4X2lkY3RfZGVxdWFudF8wXzJ4X3NzZTIgKHErMzIsIGRxLCBkc3QrOCwgc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICBxICAgICs9IDY0OworICAgICAgICBkc3QgICs9IHN0cmlkZSo0OworICAgICAgICBlb2JzICs9IDQ7CisgICAgfQorfQorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX3NzZTIKKyAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdHUsIHVuc2lnbmVkIGNoYXIgKmRzdHYsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCit7CisgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzBdKQorICAgIHsKKyAgICAgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzBdICYgMHhmZWZlKQorICAgICAgICAgICAgdnA4X2lkY3RfZGVxdWFudF9mdWxsXzJ4X3NzZTIgKHEsIGRxLCBkc3R1LCBzdHJpZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2cDhfaWRjdF9kZXF1YW50XzBfMnhfc3NlMiAocSwgZHEsIGRzdHUsIHN0cmlkZSk7CisgICAgfQorICAgIHEgICAgKz0gMzI7CisgICAgZHN0dSArPSBzdHJpZGUqNDsKKworICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVsxXSkKKyAgICB7CisgICAgICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVsxXSAmIDB4ZmVmZSkKKyAgICAgICAgICAgIHZwOF9pZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyIChxLCBkcSwgZHN0dSwgc3RyaWRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnA4X2lkY3RfZGVxdWFudF8wXzJ4X3NzZTIgKHEsIGRxLCBkc3R1LCBzdHJpZGUpOworICAgIH0KKyAgICBxICAgICs9IDMyOworCisgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzJdKQorICAgIHsKKyAgICAgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzJdICYgMHhmZWZlKQorICAgICAgICAgICAgdnA4X2lkY3RfZGVxdWFudF9mdWxsXzJ4X3NzZTIgKHEsIGRxLCBkc3R2LCBzdHJpZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2cDhfaWRjdF9kZXF1YW50XzBfMnhfc3NlMiAocSwgZHEsIGRzdHYsIHN0cmlkZSk7CisgICAgfQorICAgIHEgICAgKz0gMzI7CisgICAgZHN0diArPSBzdHJpZGUqNDsKKworICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVszXSkKKyAgICB7CisgICAgICBpZiAoKChzaG9ydCAqKShlb2JzKSlbM10gJiAweGZlZmUpCisgICAgICAgICAgdnA4X2lkY3RfZGVxdWFudF9mdWxsXzJ4X3NzZTIgKHEsIGRxLCBkc3R2LCBzdHJpZGUpOworICAgICAgZWxzZQorICAgICAgICAgIHZwOF9pZGN0X2RlcXVhbnRfMF8yeF9zc2UyIChxLCBkcSwgZHN0diwgc3RyaWRlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvaWRjdGxsbV9tbXguYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2lkY3RsbG1fbW14LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZhMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2lkY3RsbG1fbW14LmFzbQpAQCAtMCwwICsxLDI5NSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7ICogTm90ZXM6Cis7ICoKKzsgKiBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNiBiaXQgZml4ZWQgcG9pbnQgdmVyc2lvbiBvZiB0d28gbXVsdGlwbHkKKzsgKiBjb25zdGFudHM6Cis7ICogICAgICAgIDEuICAgc3FydCgyKSAqIGNvcyAocGkvOCkKKzsgKiAgICAgICAgMi4gICBzcXJ0KDIpICogc2luIChwaS84KQorOyAqIEJlY2F1c2UgdGhlIGZpcnN0IGNvbnN0YW50IGlzIGJpZ2dlciB0aGFuIDEsIHRvIG1haW50YWluIHRoZSBzYW1lIDE2IGJpdAorOyAqIGZpeGVkIHBvaW50IHByZWNpc2lvbiBhcyB0aGUgc2Vjb25kIG9uZSwgd2UgdXNlIGEgdHJpY2sgb2YKKzsgKiAgICAgICAgeCAqIGEgPSB4ICsgeCooYS0xKQorOyAqIHNvCis7ICogICAgICAgIHggKiBzcXJ0KDIpICogY29zIChwaS84KSA9IHggKyB4ICogKHNxcnQoMikgKmNvcyhwaS84KS0xKS4KKzsgKgorOyAqIEZvciB0aGUgc2Vjb25kIGNvbnN0YW50LCBiZWNhdXNlIG9mIHRoZSAxNmJpdCB2ZXJzaW9uIGlzIDM1NDY4LCB3aGljaAorOyAqIGlzIGJpZ2dlciB0aGFuIDMyNzY4LCBpbiBzaWduZWQgMTYgYml0IG11bHRpcGx5LCBpdCBiZWNvbWVzIGEgbmVnYXRpdmUKKzsgKiBudW1iZXIuCis7ICogICAgICAgICh4ICogKHVuc2lnbmVkKTM1NDY4ID4+IDE2KSA9IHggKiAoc2lnbmVkKTM1NDY4ID4+IDE2ICsgeAorOyAqCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKzt2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX21teChzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsCis7aW50IHBpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LGludCBzdHJpZGUpCitnbG9iYWwgc3ltKHZwOF9zaG9ydF9pZGN0NHg0bGxtX21teCkgUFJJVkFURQorc3ltKHZwOF9zaG9ydF9pZGN0NHg0bGxtX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3YgICAgICAgICByYXgsICAgIGFyZygwKSAgICAgICAgICAgICAgO2lucHV0CisgICAgbW92ICAgICAgICAgcnNpLCAgICBhcmcoMSkgICAgICAgICAgICAgIDtwcmVkCisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgIFtyYXggICBdCisgICAgbW92cSAgICAgICAgbW0xLCAgICBbcmF4KyA4XQorICAgIG1vdnEgICAgICAgIG1tMiwgICAgW3JheCsxNl0KKyAgICBtb3ZxICAgICAgICBtbTMsICAgIFtyYXgrMjRdCisKKyVpZiAwCisgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcKKyAgICBtb3ZxICAgICAgICBbcmF4XSwgICBtbTcKKyAgICBtb3ZxICAgICAgICBbcmF4KzhdLCBtbTcKKyAgICBtb3ZxICAgICAgICBbcmF4KzE2XSxtbTcKKyAgICBtb3ZxICAgICAgICBbcmF4KzI0XSxtbTcKKyVlbmRpZgorICAgIG1vdnN4ZCAgICAgIHJheCwgICAgZHdvcmQgcHRyIGFyZygyKSAgICA7cGl0Y2gKKyAgICBtb3YgICAgICAgICByZHgsICAgIGFyZygzKSAgICAgICAgICAgICAgO2Rlc3QKKyAgICBtb3ZzeGQgICAgICByZGksICAgIGR3b3JkIHB0ciBhcmcoNCkgICAgO3N0cmlkZQorCisKKyAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgYjE9IDAtMgorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOworCisgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBhMSA9MCsyCisKKyAgICBwbXVsaHcgICAgICBtbTUsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildOworICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgOyBpcDEgKiBzaW4ocGkvOCkgKiBzcXJ0KDIpCisKKyAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsKKyAgICBwbXVsaHcgICAgICBtbTcsICAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV07CisKKyAgICBwYWRkdyAgICAgICBtbTcsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgaXAzICogY29zKHBpLzgpICogc3FydCgyKQorICAgIHBzdWJ3ICAgICAgIG1tNywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyBjMQorCisgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQorICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTMKKworICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQorICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKKworICAgIHBtdWxodyAgICAgIG1tMywgICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KKyAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW00CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgZDEKKyAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgYTEKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBiMQorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzAKKworICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzEKKyAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsyCisKKyAgICBwc3VidyAgICAgICBtbTYsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDszCisKKyAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMDMgMDIgMDEgMDAKKyAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMjMgMjIgMjEgMjAKKworICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAorICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMgorCisgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMxIDIxIDMwIDIwCisgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMzIDIzIDMyIDIyCisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKKyAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKKworICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMCAyMCAxMCAwMAorICAgIHB1bnBja2hkcSAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMQorCisgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMyIDIyIDEyIDAyCisgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCisKKyAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMKKworICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBiMT0gMC0yCisgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7CisKKyAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCisgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGExID0wKzIKKworICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV07CisgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IGlwMSAqIHNpbihwaS84KSAqIHNxcnQoMikKKworICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOworICAgIHBtdWxodyAgICAgIG1tNywgICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXTsKKworICAgIHBhZGR3ICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyBpcDMgKiBjb3MocGkvOCkgKiBzcXJ0KDIpCisgICAgcHN1YncgICAgICAgbW03LCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGMxCisKKyAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCisgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMworCisgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCisgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgICAgIG1tMQorCisgICAgcG11bGh3ICAgICAgbW0zLCAgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQorICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTQKKworICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyBkMQorICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KKworICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KKyAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgYTEKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBiMQorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzAKKworICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzEKKyAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsyCisKKyAgICBwc3VidyAgICAgICBtbTYsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDszCisgICAgcHNyYXcgICAgICAgbW0yLCAgICAgICAgICAgIDMKKworICAgIHBzcmF3ICAgICAgIG1tMCwgICAgICAgICAgICAzCisgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgICAgIDMKKworICAgIHBzcmF3ICAgICAgIG1tNiwgICAgICAgICAgICAzCisKKyAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMDMgMDIgMDEgMDAKKyAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMjMgMjIgMjEgMjAKKworICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAorICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMgorCisgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMxIDIxIDMwIDIwCisgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMzIDIzIDMyIDIyCisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKKyAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKKworICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMCAyMCAxMCAwMAorICAgIHB1bnBja2hkcSAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMQorCisgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMyIDIyIDEyIDAyCisgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCisKKyAgICBweG9yICAgICAgICBtbTcsICAgICAgICAgICAgbW03CisKKyAgICBtb3ZkICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaV0KKyAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICAgICAgbW03CisgICAgcGFkZHN3ICAgICAgbW0wLCAgICAgICAgICAgIG1tNAorICAgIHBhY2t1c3diICAgIG1tMCwgICAgICAgICAgICBtbTcKKyAgICBtb3ZkICAgICAgICBbcmR4XSwgICAgICAgICAgbW0wCisKKyAgICBtb3ZkICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaStyYXhdCisgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tNworICAgIHBhZGRzdyAgICAgIG1tMSwgICAgICAgICAgICBtbTQKKyAgICBwYWNrdXN3YiAgICBtbTEsICAgICAgICAgICAgbW03CisgICAgbW92ZCAgICAgICAgW3JkeCtyZGldLCAgICAgIG1tMQorCisgICAgbW92ZCAgICAgICAgbW00LCAgICAgICAgICAgIFtyc2krMipyYXhdCisgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tNworICAgIHBhZGRzdyAgICAgIG1tMiwgICAgICAgICAgICBtbTQKKyAgICBwYWNrdXN3YiAgICBtbTIsICAgICAgICAgICAgbW03CisgICAgbW92ZCAgICAgICAgW3JkeCtyZGkqMl0sICAgIG1tMgorCisgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgICAgIHJkaQorICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgICAgICByYXgKKworICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpKzIqcmF4XQorICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgICAgICBtbTcKKyAgICBwYWRkc3cgICAgICBtbTUsICAgICAgICAgICAgbW00CisgICAgcGFja3Vzd2IgICAgbW01LCAgICAgICAgICAgIG1tNworICAgIG1vdmQgICAgICAgIFtyZHgrcmRpKjJdLCAgICBtbTUKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14KAorO3Nob3J0IGlucHV0X2RjLAorO3Vuc2lnbmVkIGNoYXIgKnByZWRfcHRyLAorO2ludCBwcmVkX3N0cmlkZSwKKzt1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorO2ludCBzdHJpZGUpCitnbG9iYWwgc3ltKHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCkgUFJJVkFURQorc3ltKHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ZCAgICAgICAgbW01LCAgICAgICAgICAgIGFyZygwKSA7aW5wdXRfZGMKKyAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygxKSA7cHJlZF9wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO3ByZWRfc3RyaWRlCisKKyAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgICAgIG1tMAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgICAgIFtyZHggKyByZHgqMl0KKworICAgICAgICBwc3JhdyAgICAgICBtbTUsICAgICAgICAgICAgMworCisgICAgICAgIHB1bnBja2x3ZCAgIG1tNSwgICAgICAgICAgICBtbTUKKworICAgICAgICBwdW5wY2tsZHEgICBtbTUsICAgICAgICAgICAgbW01CisKKyAgICAgICAgbW92ZCAgICAgICAgbW0xLCAgICAgICAgICAgIFtyYXhdCisgICAgICAgIG1vdmQgICAgICAgIG1tMiwgICAgICAgICAgICBbcmF4K3JkeF0KKyAgICAgICAgbW92ZCAgICAgICAgbW0zLCAgICAgICAgICAgIFtyYXgrMipyZHhdCisgICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcmF4K3JjeF0KKworICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDMpIDtkIC0tIGRlc3RpbmF0aW9uCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtkc3Rfc3RyaWRlCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgICAgIG1tMAorICAgICAgICBwYWRkc3cgICAgICBtbTEsICAgICAgICAgICAgbW01CisgICAgICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgICAgICBbcmR4ICsgcmR4KjJdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICAgICAgICAgIG1tMAorICAgICAgICBwYWRkc3cgICAgICBtbTIsICAgICAgICAgICAgbW01CisgICAgICAgIHBhY2t1c3diICAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgICAgIG1tMAorICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgICAgICAgICAgbW01CisgICAgICAgIHBhY2t1c3diICAgIG1tMywgICAgICAgICAgICBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tMAorICAgICAgICBwYWRkc3cgICAgICBtbTQsICAgICAgICAgICAgbW01CisgICAgICAgIHBhY2t1c3diICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCisKKyAgICAgICAgbW92ZCAgICAgICAgW3JheF0sICAgICAgICAgIG1tMQorICAgICAgICBtb3ZkICAgICAgICBbcmF4K3JkeF0sICAgICAgbW0yCisgICAgICAgIG1vdmQgICAgICAgIFtyYXgrMipyZHhdLCAgICBtbTMKKyAgICAgICAgbW92ZCAgICAgICAgW3JheCtyY3hdLCAgICAgIG1tNAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDE2Cit4X3Mxc3FyMjoKKyAgICB0aW1lcyA0IGR3IDB4OEE4QworYWxpZ24gMTYKK3hfYzFzcXIybGVzczE6CisgICAgdGltZXMgNCBkdyAweDRFN0IKK2FsaWduIDE2Citmb3VyczoKKyAgICB0aW1lcyA0IGR3IDB4MDAwNApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L2lkY3RsbG1fc3NlMi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvaWRjdGxsbV9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjhlMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2lkY3RsbG1fc3NlMi5hc20KQEAgLTAsMCArMSw3MDggQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworO3ZvaWQgdnA4X2lkY3RfZGVxdWFudF8wXzJ4X3NzZTIKKzsgKAorOyAgIHNob3J0ICpxY29lZmYgICAgICAgLSAwCis7ICAgc2hvcnQgKmRlcXVhbnQgICAgICAtIDEKKzsgICB1bnNpZ25lZCBjaGFyICpkc3QgIC0gMgorOyAgIGludCBkc3Rfc3RyaWRlICAgICAgLSAzCis7ICkKKworZ2xvYmFsIHN5bSh2cDhfaWRjdF9kZXF1YW50XzBfMnhfc3NlMikgUFJJVkFURQorc3ltKHZwOF9pZGN0X2RlcXVhbnRfMF8yeF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKKyAgICBHRVRfR09UICAgICByYngKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDEpIDsgZGVxdWFudAorICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDApIDsgcWNvZWZmCisKKyAgICAgICAgbW92ZCAgICAgICAgeG1tNCwgICAgICAgICAgIFtyYXhdCisgICAgICAgIG1vdmQgICAgICAgIHhtbTUsICAgICAgICAgICBbcmR4XQorCisgICAgICAgIHBpbnNydyAgICAgIHhtbTQsICAgICAgICAgICBbcmF4KzMyXSwgICA0CisgICAgICAgIHBpbnNydyAgICAgIHhtbTUsICAgICAgICAgICBbcmR4XSwgICAgICA0CisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgICAgIHhtbTUKKworICAgIDsgWmVybyBvdXQgeG1tNSwgZm9yIHVzZSB1bnBhY2tpbmcKKyAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUKKworICAgIDsgY2xlYXIgY29lZmZzCisgICAgICAgIG1vdmQgICAgICAgIFtyYXhdLCAgICAgICAgICB4bW01CisgICAgICAgIG1vdmQgICAgICAgIFtyYXgrMzJdLCAgICAgICB4bW01Cis7cHNodWZiCisgICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMikgOyBkc3QKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgOyBkc3Rfc3RyaWRlCisKKyAgICAgICAgcHNodWZsdyAgICAgeG1tNCwgICAgICAgICAgIHhtbTQsICAgICAgIDAwMDAwMDAwYgorICAgICAgICBwc2h1Zmh3ICAgICB4bW00LCAgICAgICAgICAgeG1tNCwgICAgICAgMDAwMDAwMDBiCisKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgICAgIFtyZHggKyByZHgqMl0KKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgIFtHTE9CQUwoZm91cnMpXQorCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAzCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tMCwgICAgICAgICAgIFtyYXhdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgICAgICBbcmF4K3JkeF0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFtyYXgrMipyZHhdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBbcmF4K3JjeF0KKworICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tNQorCisKKyAgICA7IEFkZCB0byBwcmVkaWN0IGJ1ZmZlcgorICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNAorICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNAorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tNAorICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNAorCisgICAgOyBwYWNrIHVwIGJlZm9yZSBzdG9yaW5nCisgICAgICAgIHBhY2t1c3diICAgIHhtbTAsICAgICAgICAgICB4bW01CisgICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgICAgICB4bW01CisgICAgICAgIHBhY2t1c3diICAgIHhtbTIsICAgICAgICAgICB4bW01CisgICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgICAgICB4bW01CisKKyAgICA7IHN0b3JlIGJsb2NrcyBiYWNrIG91dAorICAgICAgICBtb3ZxICAgICAgICBbcmF4XSwgICAgICAgICAgeG1tMAorICAgICAgICBtb3ZxICAgICAgICBbcmF4ICsgcmR4XSwgICAgeG1tMQorCisgICAgICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgICAgICBbcmF4ICsgMipyZHhdCisKKyAgICAgICAgbW92cSAgICAgICAgW3JheF0sICAgICAgICAgIHhtbTIKKyAgICAgICAgbW92cSAgICAgICAgW3JheCArIHJkeF0sICAgIHhtbTMKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIHZwOF9pZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyCis7ICgKKzsgICBzaG9ydCAqcWNvZWZmICAgICAgIC0gMAorOyAgIHNob3J0ICpkZXF1YW50ICAgICAgLSAxCis7ICAgdW5zaWduZWQgY2hhciAqZHN0ICAtIDIKKzsgICBpbnQgZHN0X3N0cmlkZSAgICAgIC0gMworOyApCitnbG9iYWwgc3ltKHZwOF9pZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyKSBQUklWQVRFCitzeW0odnA4X2lkY3RfZGVxdWFudF9mdWxsXzJ4X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDsgc3BlY2lhbCBjYXNlIHdoZW4gMiBibG9ja3MgaGF2ZSAwIG9yIDEgY29lZmZzCisgICAgOyBkYyBpcyBzZXQgYXMgZmlyc3QgY29lZmYsIHNvIG5vIG5lZWQgdG8gbG9hZCBxY29lZmYKKyAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygwKSA7IHFjb2VmZgorICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDEpICA7IGRlcXVhbnQKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7IGRzdAorCisKKyAgICA7IFplcm8gb3V0IHhtbTcsIGZvciB1c2UgdW5wYWNraW5nCisgICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03CisKKworICAgIDsgbm90ZSB0aGUgdHJhbnNwb3NlIG9mIHhtbTEgYW5kIHhtbTIsIG5lY2Vzc2FyeSBmb3Igc2h1ZmZsZQorICAgIDsgICB0byBzcGl0IG91dCBzZW5zaWNsZSBkYXRhCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgICAgICBbcmF4XQorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgW3JheCsxNl0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIFtyYXgrMzJdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICBbcmF4KzQ4XQorCisgICAgOyBDbGVhciBvdXQgY29lZmZzCisgICAgICAgIG1vdmRxYSAgICAgIFtyYXhdLCAgICAgICAgICB4bW03CisgICAgICAgIG1vdmRxYSAgICAgIFtyYXgrMTZdLCAgICAgICB4bW03CisgICAgICAgIG1vdmRxYSAgICAgIFtyYXgrMzJdLCAgICAgICB4bW03CisgICAgICAgIG1vdmRxYSAgICAgIFtyYXgrNDhdLCAgICAgICB4bW03CisKKyAgICA7IGRlcXVhbnRpemUgcWNvZWZmIGJ1ZmZlcgorICAgICAgICBwbXVsbHcgICAgICB4bW0wLCAgICAgICAgICAgW3JkeF0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tMiwgICAgICAgICAgIFtyZHgrMTZdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgICAgICBbcmR4XQorICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICAgICAgW3JkeCsxNl0KKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgOyBkc3Rfc3RyaWRlCisKKyAgICA7IHJlcGFjayBzbyBibG9jayAwIHJvdyB4IGFuZCBibG9jayAxIHJvdyB4IGFyZSB0b2dldGhlcgorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgeG1tMQorICAgICAgICBwdW5wY2toZHEgICB4bW00LCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0wLCAgICAgICAxMTAxMTAwMGIKKyAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQsICAgICAgIDExMDExMDAwYgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0yCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW0zCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgICAgICB4bW0zCisKKyAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgorICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNCwgICAgICAgMTEwMTEwMDBiCisKKyAgICA7IGZpcnN0IHBhc3MKKyAgICAgICAgcHN1YncgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIgICAgICAgIDsgYjEgPSAwLTIKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIgICAgICAgIDsKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgOyBhMSA9IDArMgorCisgICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgICAgIFtyZHggKyByZHgqMl0gICA7ZHN0X3N0cmlkZSAqIDMKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEgICAgICAgIDsgaXAxICogc2luKHBpLzgpICogc3FydCgyKQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW0zCisgICAgICAgIHBtdWxodyAgICAgIHhtbTcsICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0zICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKKyAgICAgICAgcHN1YncgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgIDsgYzEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMworCisgICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQorICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHBtdWxodyAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KKyAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNSAgICAgICAgOyBkMQorICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tMiAgICAgICAgOyBhMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0wICAgICAgICA7IGIxCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0zICAgICAgICA7MAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgICAgICB4bW03ICAgICAgICA7MQorICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNyAgICAgICAgOzIKKworICAgICAgICBwc3VidyAgICAgICB4bW02LCAgICAgICAgICAgeG1tMyAgICAgICAgOzMKKworICAgIDsgdHJhbnNwb3NlIGZvciB0aGUgc2Vjb25kIHBhc3MKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTIgICAgICAgIDsgMTAzIDEwMiAxMDEgMTAwIDAwMyAwMDIgMDAxIDAwMAorICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTcsICAgICAgICAgICB4bW0wICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tNCAgICAgICAgOyAxMTEgMTEwIDEwOSAxMDggMDExIDAxMCAwMDkgMDA4CisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTQsICAgICAgICAgICB4bW02ICAgICAgICA7IDAxNSAwMTEgMDE0IDAxMCAwMTMgMDA5IDAxMiAwMDgKKyAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAxMTQgMTEwIDExMyAxMDkgMTEyIDEwOAorCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDA3IDAwMyAwMDYgMDAyIDAwNSAwMDEgMDA0IDAwMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNCAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMDcgMTAzIDEwNiAxMDIgMTA1IDEwMSAxMDQgMTAwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTcsICAgICAgICAgICB4bW01ICAgICAgICA7IDExMyAxMDkgMTA1IDEwMSAxMTIgMTA4IDEwNCAxMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTE1IDExMSAxMDcgMTAzIDExNCAxMTAgMTA2IDEwMgorCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDEzIDAwOSAwMDUgMDAxIDAxMiAwMDggMDA0IDAwMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMTIgMTA4IDAxMiAwMDggMTA0IDEwMCAwMDQgMDAwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTUsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMyAxMDkgMDEzIDAwOSAxMDUgMTAxIDAwNSAwMDEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMSAgICAgICAgOyAwMTUgMDExIDAwNyAwMDMgMDE0IDAxMCAwMDYgMDAyCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW02ICAgICAgICA7IDExNCAxMTAgMDE0IDAxMCAxMDYgMTAyIDAwNiAwMDIKKyAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAwMTUgMDExIDEwNyAxMDMgMDA3IDAwMworCisgICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0yLCAgICAgICAxMTAxMTAwMGIKKyAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEsICAgICAgIDExMDExMDAwYgorCisgICAgICAgIHBzaHVmZCAgICAgIHhtbTEsICAgICAgICAgICB4bW01LCAgICAgICAxMTAxMTAwMGIKKyAgICAgICAgcHNodWZkICAgICAgeG1tMywgICAgICAgICAgIHhtbTcsICAgICAgIDExMDExMDAwYgorCisgICAgOyBzZWNvbmQgcGFzcworICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgYjEgPSAwLTIKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgYTEgPSAwKzIKKworICAgICAgICBwbXVsaHcgICAgICB4bW01LCAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBpcDEgKiBzaW4ocGkvOCkgKiBzcXJ0KDIpCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTMKKyAgICAgICAgcG11bGh3ICAgICAgeG1tNywgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKKyAgICAgICAgcHN1YncgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGMxCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTMKKworICAgICAgICBwbXVsaHcgICAgICB4bW01LCAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV0KKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEKKworICAgICAgICBwbXVsaHcgICAgICB4bW0zLCAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW00CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGQxCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KKworICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTChmb3VycyldCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBhMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBiMQorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDswCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7MQorICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsyCisKKyAgICAgICAgcHN1YncgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7MworICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICAgICAgMworCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTAsICAgICAgICAgICAzCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAzCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNiwgICAgICAgICAgIDMKKworICAgIDsgdHJhbnNwb3NlIHRvIHNhdmUKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTIgICAgICAgIDsgMTAzIDEwMiAxMDEgMTAwIDAwMyAwMDIgMDAxIDAwMAorICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTcsICAgICAgICAgICB4bW0wICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tNCAgICAgICAgOyAxMTEgMTEwIDEwOSAxMDggMDExIDAxMCAwMDkgMDA4CisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTQsICAgICAgICAgICB4bW02ICAgICAgICA7IDAxNSAwMTEgMDE0IDAxMCAwMTMgMDA5IDAxMiAwMDgKKyAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAxMTQgMTEwIDExMyAxMDkgMTEyIDEwOAorCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDA3IDAwMyAwMDYgMDAyIDAwNSAwMDEgMDA0IDAwMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNCAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMDcgMTAzIDEwNiAxMDIgMTA1IDEwMSAxMDQgMTAwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTcsICAgICAgICAgICB4bW01ICAgICAgICA7IDExMyAxMDkgMTA1IDEwMSAxMTIgMTA4IDEwNCAxMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTE1IDExMSAxMDcgMTAzIDExNCAxMTAgMTA2IDEwMgorCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDEzIDAwOSAwMDUgMDAxIDAxMiAwMDggMDA0IDAwMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMTIgMTA4IDAxMiAwMDggMTA0IDEwMCAwMDQgMDAwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTUsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMyAxMDkgMDEzIDAwOSAxMDUgMTAxIDAwNSAwMDEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMSAgICAgICAgOyAwMTUgMDExIDAwNyAwMDMgMDE0IDAxMCAwMDYgMDAyCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW02ICAgICAgICA7IDExNCAxMTAgMDE0IDAxMCAxMDYgMTAyIDAwNiAwMDIKKyAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAwMTUgMDExIDEwNyAxMDMgMDA3IDAwMworCisgICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0yLCAgICAgICAxMTAxMTAwMGIKKyAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEsICAgICAgIDExMDExMDAwYgorCisgICAgICAgIHBzaHVmZCAgICAgIHhtbTEsICAgICAgICAgICB4bW01LCAgICAgICAxMTAxMTAwMGIKKyAgICAgICAgcHNodWZkICAgICAgeG1tMywgICAgICAgICAgIHhtbTcsICAgICAgIDExMDExMDAwYgorCisgICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03CisKKyAgICA7IExvYWQgdXAgcHJlZGljdCBibG9ja3MKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgICAgIFtyZGldCisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgICAgICBbcmRpK3JkeF0KKworICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW01CisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgICAgIFtyZGkrMipyZHhdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgICAgICBbcmRpK3JjeF0KKworICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW01CisKKy5maW5pc2g6CisKKyAgICA7IHBhY2sgdXAgYmVmb3JlIHN0b3JpbmcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMCwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgICAgIHhtbTcKKworICAgIDsgc3RvcmUgYmxvY2tzIGJhY2sgb3V0CisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICB4bW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHhdLCAgICB4bW0xCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHgqMl0sICB4bW0yCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByY3hdLCAgICB4bW0zCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIHZwOF9pZGN0X2RlcXVhbnRfZGNfMF8yeF9zc2UyCis7ICgKKzsgICBzaG9ydCAqcWNvZWZmICAgICAgIC0gMAorOyAgIHNob3J0ICpkZXF1YW50ICAgICAgLSAxCis7ICAgdW5zaWduZWQgY2hhciAqZHN0ICAtIDIKKzsgICBpbnQgZHN0X3N0cmlkZSAgICAgIC0gMworOyAgIHNob3J0ICpkYyAgICAgICAgICAgLSA0Cis7ICkKK2dsb2JhbCBzeW0odnA4X2lkY3RfZGVxdWFudF9kY18wXzJ4X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfaWRjdF9kZXF1YW50X2RjXzBfMnhfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICA7IHNwZWNpYWwgY2FzZSB3aGVuIDIgYmxvY2tzIGhhdmUgMCBvciAxIGNvZWZmcworICAgIDsgZGMgaXMgc2V0IGFzIGZpcnN0IGNvZWZmLCBzbyBubyBuZWVkIHRvIGxvYWQgcWNvZWZmCisgICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMCkgOyBxY29lZmYKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDsgZHN0CisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoNCkgOyBkYworCisgICAgOyBaZXJvIG91dCB4bW01LCBmb3IgdXNlIHVucGFja2luZworICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNQorCisgICAgOyBsb2FkIHVwIDIgZGMgd29yZHMgaGVyZSA9PSAyKjE2ID0gZG91Ymxld29yZAorICAgICAgICBtb3ZkICAgICAgICB4bW00LCAgICAgICAgICAgW3JkeF0KKworICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7IGRzdF9zdHJpZGUKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCBbcmR4ICsgcmR4KjJdCisgICAgOyBMb2FkIHVwIHByZWRpY3QgYmxvY2tzCisgICAgICAgIG1vdnEgICAgICAgIHhtbTAsICAgICAgICAgICBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgW3JkaStyZHgqMV0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFtyZGkrcmR4KjJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBbcmRpK3JjeF0KKworICAgIDsgRHVwbGljYXRlIGFuZCBleHBhbmQgZGMgYWNyb3NzCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTQsICAgICAgICAgICB4bW00CisgICAgICAgIHB1bnBja2xkcSAgIHhtbTQsICAgICAgICAgICB4bW00CisKKyAgICA7IFJvdW5kaW5nIHRvIGRlcXVhbnQgYW5kIGRvd25zaGlmdAorICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgW0dMT0JBTChmb3VycyldCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAzCisKKyAgICA7IFByZWRpY3QgYnVmZmVyIG5lZWRzIHRvIGJlIGV4cGFuZGVkIGZyb20gYnl0ZXMgdG8gd29yZHMKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTUKKworICAgIDsgQWRkIHRvIHByZWRpY3QgYnVmZmVyCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW00CisKKyAgICA7IHBhY2sgdXAgYmVmb3JlIHN0b3JpbmcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMCwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgICAgIHhtbTUKKworICAgIDsgc3RvcmUgYmxvY2tzIGJhY2sgb3V0CisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICB4bW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHhdLCAgICB4bW0xCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHgqMl0sICB4bW0yCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByY3hdLCAgICB4bW0zCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorO3ZvaWQgdnA4X2lkY3RfZGVxdWFudF9kY19mdWxsXzJ4X3NzZTIKKzsgKAorOyAgIHNob3J0ICpxY29lZmYgICAgICAgLSAwCis7ICAgc2hvcnQgKmRlcXVhbnQgICAgICAtIDEKKzsgICB1bnNpZ25lZCBjaGFyICpkc3QgIC0gMgorOyAgIGludCBkc3Rfc3RyaWRlICAgICAgLSAzCis7ICAgc2hvcnQgKmRjICAgICAgICAgICAtIDQKKzsgKQorZ2xvYmFsIHN5bSh2cDhfaWRjdF9kZXF1YW50X2RjX2Z1bGxfMnhfc3NlMikgUFJJVkFURQorc3ltKHZwOF9pZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICA7IHNwZWNpYWwgY2FzZSB3aGVuIDIgYmxvY2tzIGhhdmUgMCBvciAxIGNvZWZmcworICAgIDsgZGMgaXMgc2V0IGFzIGZpcnN0IGNvZWZmLCBzbyBubyBuZWVkIHRvIGxvYWQgcWNvZWZmCisgICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMCkgOyBxY29lZmYKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgIGFyZygxKSAgOyBkZXF1YW50CisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7IGRzdAorCisgICAgOyBaZXJvIG91dCB4bW03LCBmb3IgdXNlIHVucGFja2luZworICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNworCisKKyAgICA7IG5vdGUgdGhlIHRyYW5zcG9zZSBvZiB4bW0xIGFuZCB4bW0yLCBuZWNlc3NhcnkgZm9yIHNodWZmbGUKKyAgICA7ICAgdG8gc3BpdCBvdXQgc2Vuc2ljbGUgZGF0YQorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgW3JheF0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIFtyYXgrMTZdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICBbcmF4KzMyXQorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgW3JheCs0OF0KKworICAgIDsgQ2xlYXIgb3V0IGNvZWZmcworICAgICAgICBtb3ZkcWEgICAgICBbcmF4XSwgICAgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzE2XSwgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzMyXSwgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzQ4XSwgICAgICAgeG1tNworCisgICAgOyBkZXF1YW50aXplIHFjb2VmZiBidWZmZXIKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHhdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgICAgICBbcmR4KzE2XQorICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICAgICAgW3JkeF0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgICAgIFtyZHgrMTZdCisKKyAgICA7IERDIGNvbXBvbmVudAorICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDQpCisKKyAgICA7IHJlcGFjayBzbyBibG9jayAwIHJvdyB4IGFuZCBibG9jayAxIHJvdyB4IGFyZSB0b2dldGhlcgorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgeG1tMQorICAgICAgICBwdW5wY2toZHEgICB4bW00LCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0wLCAgICAgICAxMTAxMTAwMGIKKyAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQsICAgICAgIDExMDExMDAwYgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0yCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW0zCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgICAgICB4bW0zCisKKyAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgorICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNCwgICAgICAgMTEwMTEwMDBiCisKKyAgICA7IGluc2VydCBEQyBjb21wb25lbnQKKyAgICAgICAgcGluc3J3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHhdLCAgICAgIDAKKyAgICAgICAgcGluc3J3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHgrMl0sICAgIDQKKworICAgIDsgZmlyc3QgcGFzcworICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMiAgICAgICAgOyBiMSA9IDAtMgorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMiAgICAgICAgOworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICA7IGExID0gMCsyCisKKyAgICAgICAgcG11bGh3ICAgICAgeG1tNSwgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQorICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMSAgICAgICAgOyBpcDEgKiBzaW4ocGkvOCkgKiBzcXJ0KDIpCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTMKKyAgICAgICAgcG11bGh3ICAgICAgeG1tNywgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTMgICAgICAgIDsgaXAzICogY29zKHBpLzgpICogc3FydCgyKQorICAgICAgICBwc3VidyAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgOyBjMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0zCisKKyAgICAgICAgcG11bGh3ICAgICAgeG1tNSwgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgcG11bGh3ICAgICAgeG1tMywgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQorICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW01ICAgICAgICA7IGQxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW0yICAgICAgICA7IGExCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTAgICAgICAgIDsgYjEKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTMgICAgICAgIDswCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTcgICAgICAgIDsxCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW03ICAgICAgICA7MgorCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTYsICAgICAgICAgICB4bW0zICAgICAgICA7MworCisgICAgOyB0cmFuc3Bvc2UgZm9yIHRoZSBzZWNvbmQgcGFzcworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAxMDMgMTAyIDEwMSAxMDAgMDAzIDAwMiAwMDEgMDAwCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICA7IDAwNyAwMDMgMDA2IDAwMiAwMDUgMDAxIDAwNCAwMDAKKyAgICAgICAgcHVucGNraHdkICAgeG1tNywgICAgICAgICAgIHhtbTAgICAgICAgIDsgMTA3IDEwMyAxMDYgMTAyIDEwNSAxMDEgMTA0IDEwMAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW00ICAgICAgICA7IDExMSAxMTAgMTA5IDEwOCAwMTEgMDEwIDAwOSAwMDgKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNCwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMDE1IDAxMSAwMTQgMDEwIDAxMyAwMDkgMDEyIDAwOAorICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDExNCAxMTAgMTEzIDEwOSAxMTIgMTA4CisKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxMyAwMDkgMDA1IDAwMSAwMTIgMDA4IDAwNCAwMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgIDsgMDE1IDAxMSAwMDcgMDAzIDAxNCAwMTAgMDA2IDAwMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03ICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKKyAgICAgICAgcHVucGNrbGRxICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTEzIDEwOSAxMDUgMTAxIDExMiAxMDggMTA0IDEwMAorICAgICAgICBwdW5wY2toZHEgICB4bW02LCAgICAgICAgICAgeG1tNSAgICAgICAgOyAxMTUgMTExIDEwNyAxMDMgMTE0IDExMCAxMDYgMTAyCisKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMiAxMDggMDEyIDAwOCAxMDQgMTAwIDAwNCAwMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNSwgICAgICAgICAgIHhtbTcgICAgICAgIDsgMTEzIDEwOSAwMTMgMDA5IDEwNSAxMDEgMDA1IDAwMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE0IDExMCAwMTQgMDEwIDEwNiAxMDIgMDA2IDAwMgorICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDAxNSAwMTEgMTA3IDEwMyAwMDcgMDAzCisKKyAgICAgICAgcHNodWZkICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgorICAgICAgICBwc2h1ZmQgICAgICB4bW0yLCAgICAgICAgICAgeG1tMSwgICAgICAgMTEwMTEwMDBiCisKKyAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTUsICAgICAgIDExMDExMDAwYgorICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNywgICAgICAgMTEwMTEwMDBiCisKKyAgICA7IHNlY29uZCBwYXNzCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBiMSA9IDAtMgorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBhMSA9IDArMgorCisgICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGlwMSAqIHNpbihwaS84KSAqIHNxcnQoMikKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMworICAgICAgICBwbXVsaHcgICAgICB4bW03LCAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV0KKworICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgaXAzICogY29zKHBpLzgpICogc3FydCgyKQorICAgICAgICBwc3VidyAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgYzEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMworCisgICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQorICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHBtdWxodyAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KKyAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgZDEKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMCwgICAgICAgICAgIFtHTE9CQUwoZm91cnMpXQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGExCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IGIxCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0zICAgICAgICAgICAgOzAKKworICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsxCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW03ICAgICAgICAgICAgOzIKKworICAgICAgICBwc3VidyAgICAgICB4bW02LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDszCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgICAgICAzCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMCwgICAgICAgICAgIDMKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgICAgIDMKKworICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICAgICAgMworCisgICAgOyB0cmFuc3Bvc2UgdG8gc2F2ZQorICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAxMDMgMTAyIDEwMSAxMDAgMDAzIDAwMiAwMDEgMDAwCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICA7IDAwNyAwMDMgMDA2IDAwMiAwMDUgMDAxIDAwNCAwMDAKKyAgICAgICAgcHVucGNraHdkICAgeG1tNywgICAgICAgICAgIHhtbTAgICAgICAgIDsgMTA3IDEwMyAxMDYgMTAyIDEwNSAxMDEgMTA0IDEwMAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW00ICAgICAgICA7IDExMSAxMTAgMTA5IDEwOCAwMTEgMDEwIDAwOSAwMDgKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNCwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMDE1IDAxMSAwMTQgMDEwIDAxMyAwMDkgMDEyIDAwOAorICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDExNCAxMTAgMTEzIDEwOSAxMTIgMTA4CisKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxMyAwMDkgMDA1IDAwMSAwMTIgMDA4IDAwNCAwMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgIDsgMDE1IDAxMSAwMDcgMDAzIDAxNCAwMTAgMDA2IDAwMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03ICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKKyAgICAgICAgcHVucGNrbGRxICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTEzIDEwOSAxMDUgMTAxIDExMiAxMDggMTA0IDEwMAorICAgICAgICBwdW5wY2toZHEgICB4bW02LCAgICAgICAgICAgeG1tNSAgICAgICAgOyAxMTUgMTExIDEwNyAxMDMgMTE0IDExMCAxMDYgMTAyCisKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMiAxMDggMDEyIDAwOCAxMDQgMTAwIDAwNCAwMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNSwgICAgICAgICAgIHhtbTcgICAgICAgIDsgMTEzIDEwOSAwMTMgMDA5IDEwNSAxMDEgMDA1IDAwMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE0IDExMCAwMTQgMDEwIDEwNiAxMDIgMDA2IDAwMgorICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDAxNSAwMTEgMTA3IDEwMyAwMDcgMDAzCisKKyAgICAgICAgcHNodWZkICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgorICAgICAgICBwc2h1ZmQgICAgICB4bW0yLCAgICAgICAgICAgeG1tMSwgICAgICAgMTEwMTEwMDBiCisKKyAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTUsICAgICAgIDExMDExMDAwYgorICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNywgICAgICAgMTEwMTEwMDBiCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcKKworICAgIDsgTG9hZCB1cCBwcmVkaWN0IGJsb2NrcworICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7IGRzdF9zdHJpZGUKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgICAgIFtyZGldCisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgICAgICBbcmRpK3JkeF0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgICAgIFtyZHggKyByZHgqMl0KKworICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW01CisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgICAgIFtyZGkrcmR4KjJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgICAgICBbcmRpK3JjeF0KKworICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW01CisKKy5maW5pc2g6CisKKyAgICA7IHBhY2sgdXAgYmVmb3JlIHN0b3JpbmcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMCwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgICAgIHhtbTcKKworICAgIDsgTG9hZCBkZXN0aW5hdGlvbiBzdHJpZGUgYmVmb3JlIHdyaXRpbmcgb3V0LAorICAgIDsgICBkb2Vzbid0IG5lZWQgdG8gcGVyc2lzdAorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7IGRzdF9zdHJpZGUKKworICAgIDsgc3RvcmUgYmxvY2tzIGJhY2sgb3V0CisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICB4bW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHhdLCAgICB4bW0xCisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyAyKnJkeF0KKworICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICAgICAgeG1tMgorICAgICAgICBtb3ZxICAgICAgICBbcmRpICsgcmR4XSwgICAgeG1tMworCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKK1NFQ1RJT05fUk9EQVRBCithbGlnbiAxNgorZm91cnM6CisgICAgdGltZXMgOCBkdyAweDAwMDQKK2FsaWduIDE2Cit4X3Mxc3FyMjoKKyAgICB0aW1lcyA4IGR3IDB4OEE4QworYWxpZ24gMTYKK3hfYzFzcXIybGVzczE6CisgICAgdGltZXMgOCBkdyAweDRFN0IKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9pd2Fsc2hfbW14LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9pd2Fsc2hfbW14LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFjMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2l3YWxzaF9tbXguYXNtCkBAIC0wLDAgKzEsMTQwIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKzt2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbW14KHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKK2dsb2JhbCBzeW0odnA4X3Nob3J0X2ludl93YWxzaDR4NF9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfc2hvcnRfaW52X3dhbHNoNHg0X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyAyCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3YgICAgICAgICByZHgsIGFyZygwKQorICAgIG1vdiAgICAgICAgIHJheCwgMzAwMDNoCisKKyAgICBtb3ZxICAgICAgICBtbTAsIFtyZHggKyAwXSAgICA7aXBbMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyZHggKyA4XSAgICA7aXBbNF0KKyAgICBtb3ZkICAgICAgICBtbTcsIHJheAorCisgICAgbW92cSAgICAgICAgbW0yLCBbcmR4ICsgMTZdICAgO2lwWzhdCisgICAgbW92cSAgICAgICAgbW0zLCBbcmR4ICsgMjRdICAgO2lwWzEyXQorICAgIHB1bnBja2x3ZCAgIG1tNywgbW03ICAgICAgICAgIDswMDAzMDAwMzAwMDMwMDAzaAorICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDEpCisKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNSwgbW0xCisKKyAgICBwYWRkdyAgICAgICBtbTQsIG1tMyAgICAgICAgICA7aXBbMF0gKyBpcFsxMl0gYWthIGFsCisgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgO2lwWzRdICsgaXBbOF0gYWthIGJsCisKKyAgICBtb3ZxICAgICAgICBtbTYsIG1tNCAgICAgICAgICA7dGVtcCBhbAorICAgIHBhZGR3ICAgICAgIG1tNCwgbW01ICAgICAgICAgIDthbCArIGJsCisgICAgcHN1YncgICAgICAgbW02LCBtbTUgICAgICAgICAgO2FsIC0gYmwKKworICAgIHBzdWJ3ICAgICAgIG1tMCwgbW0zICAgICAgICAgIDtpcFswXSAtIGlwWzEyXSBha2EgZDEKKyAgICBwc3VidyAgICAgICBtbTEsIG1tMiAgICAgICAgICA7aXBbNF0gLSBpcFs4XSBha2EgYzEKKworICAgIG1vdnEgICAgICAgIG1tNSwgbW0wICAgICAgICAgIDt0ZW1wIGRsCisgICAgcGFkZHcgICAgICAgbW0wLCBtbTEgICAgICAgICAgO2RsICsgY2wKKyAgICBwc3VidyAgICAgICBtbTUsIG1tMSAgICAgICAgICA7ZGwgLSBjbAorCisgICAgOyAwMyAwMiAwMSAwMAorICAgIDsgMTMgMTIgMTEgMTAKKyAgICA7IDIzIDIyIDIxIDIwCisgICAgOyAzMyAzMiAzMSAzMAorCisgICAgbW92cSAgICAgICAgbW0zLCBtbTQgICAgICAgICAgOyAwMyAwMiAwMSAwMAorICAgIHB1bnBja2x3ZCAgIG1tNCwgbW0wICAgICAgICAgIDsgMTEgMDEgMTAgMDAKKyAgICBwdW5wY2tod2QgICBtbTMsIG1tMCAgICAgICAgICA7IDEzIDAzIDEyIDAyCisKKyAgICBtb3ZxICAgICAgICBtbTEsIG1tNiAgICAgICAgICA7IDIzIDIyIDIxIDIwCisgICAgcHVucGNrbHdkICAgbW02LCBtbTUgICAgICAgICAgOyAzMSAyMSAzMCAyMAorICAgIHB1bnBja2h3ZCAgIG1tMSwgbW01ICAgICAgICAgIDsgMzMgMjMgMzIgMjIKKworICAgIG1vdnEgICAgICAgIG1tMCwgbW00ICAgICAgICAgIDsgMTEgMDEgMTAgMDAKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMyAgICAgICAgICA7IDEzIDAzIDEyIDAyCisKKyAgICBwdW5wY2tsZHEgICBtbTAsIG1tNiAgICAgICAgICA7IDMwIDIwIDEwIDAwIGFrYSBpcFswXQorICAgIHB1bnBja2hkcSAgIG1tNCwgbW02ICAgICAgICAgIDsgMzEgMjEgMTEgMDEgYWthIGlwWzRdCisKKyAgICBwdW5wY2tsZHEgICBtbTIsIG1tMSAgICAgICAgICA7IDMyIDIyIDEyIDAyIGFrYSBpcFs4XQorICAgIHB1bnBja2hkcSAgIG1tMywgbW0xICAgICAgICAgIDsgMzMgMjMgMTMgMDMgYWthIGlwWzEyXQorO35+fn5+fn5+fn5+fn5+fn5+fn5+fgorICAgIG1vdnEgICAgICAgIG1tMSwgbW0wCisgICAgbW92cSAgICAgICAgbW01LCBtbTQKKyAgICBwYWRkdyAgICAgICBtbTEsIG1tMyAgICAgICAgICA7aXBbMF0gKyBpcFsxMl0gYWthIGFsCisgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgO2lwWzRdICsgaXBbOF0gYWthIGJsCisKKyAgICBtb3ZxICAgICAgICBtbTYsIG1tMSAgICAgICAgICA7dGVtcCBhbAorICAgIHBhZGR3ICAgICAgIG1tMSwgbW01ICAgICAgICAgIDthbCArIGJsCisgICAgcHN1YncgICAgICAgbW02LCBtbTUgICAgICAgICAgO2FsIC0gYmwKKyAgICBwYWRkdyAgICAgICBtbTEsIG1tNworICAgIHBhZGR3ICAgICAgIG1tNiwgbW03CisgICAgcHNyYXcgICAgICAgbW0xLCAzCisgICAgcHNyYXcgICAgICAgbW02LCAzCisKKyAgICBwc3VidyAgICAgICBtbTAsIG1tMyAgICAgICAgICA7aXBbMF0gLSBpcFsxMl0gYWthIGQxCisgICAgcHN1YncgICAgICAgbW00LCBtbTIgICAgICAgICAgO2lwWzRdIC0gaXBbOF0gYWthIGMxCisKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMCAgICAgICAgICA7dGVtcCBkbAorICAgIHBhZGR3ICAgICAgIG1tMCwgbW00ICAgICAgICAgIDtkbCArIGNsCisgICAgcHN1YncgICAgICAgbW01LCBtbTQgICAgICAgICAgO2RsIC0gY2wKKyAgICBwYWRkdyAgICAgICBtbTAsIG1tNworICAgIHBhZGR3ICAgICAgIG1tNSwgbW03CisgICAgcHNyYXcgICAgICAgbW0wLCAzCisgICAgcHNyYXcgICAgICAgbW01LCAzCis7fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyAgICBtb3ZkICAgICAgICBlYXgsIG1tMQorICAgIG1vdmQgICAgICAgIGVjeCwgbW0wCisgICAgcHNybHEgICAgICAgbW0wLCAzMgorICAgIHBzcmxxICAgICAgIG1tMSwgMzIKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMF0sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjFdLCBjeAorICAgIHNociAgICAgICAgIGVheCwgMTYKKyAgICBzaHIgICAgICAgICBlY3gsIDE2CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjRdLCBheAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMio1XSwgY3gKKyAgICBtb3ZkICAgICAgICBlYXgsIG1tMQorICAgIG1vdmQgICAgICAgIGVjeCwgbW0wCisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjhdLCBheAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMio5XSwgY3gKKyAgICBzaHIgICAgICAgICBlYXgsIDE2CisgICAgc2hyICAgICAgICAgZWN4LCAxNgorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMioxMl0sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjEzXSwgY3gKKworICAgIG1vdmQgICAgICAgIGVheCwgbW02CisgICAgbW92ZCAgICAgICAgZWN4LCBtbTUKKyAgICBwc3JscSAgICAgICBtbTUsIDMyCisgICAgcHNybHEgICAgICAgbW02LCAzMgorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMioyXSwgYXgKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqM10sIGN4CisgICAgc2hyICAgICAgICAgZWF4LCAxNgorICAgIHNociAgICAgICAgIGVjeCwgMTYKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqNl0sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjddLCBjeAorICAgIG1vdmQgICAgICAgIGVheCwgbW02CisgICAgbW92ZCAgICAgICAgZWN4LCBtbTUKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMTBdLCBheAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMioxMV0sIGN4CisgICAgc2hyICAgICAgICAgZWF4LCAxNgorICAgIHNociAgICAgICAgIGVjeCwgMTYKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMTRdLCBheAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMioxNV0sIGN4CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L2l3YWxzaF9zc2UyLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9pd2Fsc2hfc3NlMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlODZhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9pd2Fsc2hfc3NlMi5hc20KQEAgLTAsMCArMSwxMjEgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworO3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9zc2UyKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKK2dsb2JhbCBzeW0odnA4X3Nob3J0X2ludl93YWxzaDR4NF9zc2UyKSBQUklWQVRFCitzeW0odnA4X3Nob3J0X2ludl93YWxzaDR4NF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDIKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdiAgICAgICAgIHJjeCwgYXJnKDApCisgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMSkKKyAgICBtb3YgICAgICAgICByYXgsIDMwMDAzaAorCisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JjeCArIDBdICAgICA7aXBbNF0gaXBbMF0KKyAgICBtb3ZkcWEgICAgICB4bW0xLCBbcmN4ICsgMTZdICAgIDtpcFsxMl0gaXBbOF0KKworCisgICAgcHNodWZkICAgICAgeG1tMiwgeG1tMSwgNGVoICAgICA7aXBbOF0gaXBbMTJdCisgICAgbW92ZHFhICAgICAgeG1tMywgeG1tMCAgICAgICAgICA7aXBbNF0gaXBbMF0KKworICAgIHBhZGR3ICAgICAgIHhtbTAsIHhtbTIgICAgICAgICAgO2lwWzRdK2lwWzhdIGlwWzBdK2lwWzEyXSBha2EgYjEgYTEKKyAgICBwc3VidyAgICAgICB4bW0zLCB4bW0yICAgICAgICAgIDtpcFs0XS1pcFs4XSBpcFswXS1pcFsxMl0gYWthIGMxIGQxCisKKyAgICBtb3ZkcWEgICAgICB4bW00LCB4bW0wCisgICAgcHVucGNrbHFkcSAgeG1tMCwgeG1tMyAgICAgICAgICA7ZDEgYTEKKyAgICBwdW5wY2tocWRxICB4bW00LCB4bW0zICAgICAgICAgIDtjMSBiMQorCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tNCAgICAgICAgICA7YzEgYjEKKyAgICBwYWRkdyAgICAgICB4bW00LCB4bW0wICAgICAgICAgIDtkbCtjbCBhMStiMSBha2Egb3BbNF0gb3BbMF0KKyAgICBwc3VidyAgICAgICB4bW0wLCB4bW0xICAgICAgICAgIDtkMS1jMSBhMS1iMSBha2Egb3BbMTJdIG9wWzhdCisKKyAgICA7fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAgICA7IDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisgICAgOworICAgIDsgMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAKKyAgICA7CisgICAgbW92ZHFhICAgICAgeG1tMywgeG1tNCAgICAgICAgICA7IDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisgICAgcHVucGNrbHdkICAgeG1tNCwgeG1tMCAgICAgICAgICA7IDIzIDAzIDIyIDAyIDIxIDAxIDIwIDAwCisgICAgcHVucGNraHdkICAgeG1tMywgeG1tMCAgICAgICAgICA7IDMzIDEzIDMyIDEyIDMxIDExIDMwIDEwCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tNCAgICAgICAgICA7IDIzIDAzIDIyIDAyIDIxIDAxIDIwIDAwCisgICAgcHVucGNrbHdkICAgeG1tNCwgeG1tMyAgICAgICAgICA7IDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCisgICAgcHVucGNraHdkICAgeG1tMSwgeG1tMyAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyCisgICAgO35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgICAgbW92ZCAgICAgICAgeG1tMCwgZWF4CisgICAgcHNodWZkICAgICAgeG1tMiwgeG1tMSwgNGVoICAgICA7aXBbOF0gaXBbMTJdCisgICAgbW92ZHFhICAgICAgeG1tMywgeG1tNCAgICAgICAgICA7aXBbNF0gaXBbMF0KKworICAgIHBzaHVmZCAgICAgIHhtbTAsIHhtbTAsIDAgICAgICAgOzAzIDAzIDAzIDAzIDAzIDAzIDAzIDAzCisKKyAgICBwYWRkdyAgICAgICB4bW00LCB4bW0yICAgICAgICAgIDtpcFs0XStpcFs4XSBpcFswXStpcFsxMl0gYWthIGIxIGExCisgICAgcHN1YncgICAgICAgeG1tMywgeG1tMiAgICAgICAgICA7aXBbNF0taXBbOF0gaXBbMF0taXBbMTJdIGFrYSBjMSBkMQorCisgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tNAorICAgIHB1bnBja2xxZHEgIHhtbTQsIHhtbTMgICAgICAgICAgO2QxIGExCisgICAgcHVucGNraHFkcSAgeG1tNSwgeG1tMyAgICAgICAgICA7YzEgYjEKKworICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTUgICAgICAgICAgO2MxIGIxCisgICAgcGFkZHcgICAgICAgeG1tNSwgeG1tNCAgICAgICAgICA7ZGwrY2wgYTErYjEgYWthIG9wWzRdIG9wWzBdCisgICAgcHN1YncgICAgICAgeG1tNCwgeG1tMSAgICAgICAgICA7ZDEtYzEgYTEtYjEgYWthIG9wWzEyXSBvcFs4XQorCisgICAgcGFkZHcgICAgICAgeG1tNSwgeG1tMAorICAgIHBhZGR3ICAgICAgIHhtbTQsIHhtbTAKKyAgICBwc3JhdyAgICAgICB4bW01LCAzCisgICAgcHNyYXcgICAgICAgeG1tNCwgMworCisgICAgbW92ZCAgICAgICAgZWF4LCB4bW01CisgICAgbW92ZCAgICAgICAgZWN4LCB4bW00CisgICAgcHNybGRxICAgICAgeG1tNSwgNAorICAgIHBzcmxkcSAgICAgIHhtbTQsIDQKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMF0sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjJdLCBjeAorICAgIHNociAgICAgICAgIGVheCwgMTYKKyAgICBzaHIgICAgICAgICBlY3gsIDE2CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjRdLCBheAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMio2XSwgY3gKKyAgICBtb3ZkICAgICAgICBlYXgsIHhtbTUKKyAgICBtb3ZkICAgICAgICBlY3gsIHhtbTQKKyAgICBwc3JsZHEgICAgICB4bW01LCA0CisgICAgcHNybGRxICAgICAgeG1tNCwgNAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMio4XSwgYXgKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMTBdLCBjeAorICAgIHNociAgICAgICAgIGVheCwgMTYKKyAgICBzaHIgICAgICAgICBlY3gsIDE2CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjEyXSwgYXgKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMTRdLCBjeAorCisgICAgbW92ZCAgICAgICAgZWF4LCB4bW01CisgICAgbW92ZCAgICAgICAgZWN4LCB4bW00CisgICAgcHNybGRxICAgICAgeG1tNSwgNAorICAgIHBzcmxkcSAgICAgIHhtbTQsIDQKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqMV0sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjNdLCBjeAorICAgIHNociAgICAgICAgIGVheCwgMTYKKyAgICBzaHIgICAgICAgICBlY3gsIDE2CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjVdLCBheAorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMio3XSwgY3gKKyAgICBtb3ZkICAgICAgICBlYXgsIHhtbTUKKyAgICBtb3ZkICAgICAgICBlY3gsIHhtbTQKKyAgICBtb3YgICAgICAgICB3b3JkIHB0cltyZHgrMzIqOV0sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjExXSwgY3gKKyAgICBzaHIgICAgICAgICBlYXgsIDE2CisgICAgc2hyICAgICAgICAgZWN4LCAxNgorICAgIG1vdiAgICAgICAgIHdvcmQgcHRyW3JkeCszMioxM10sIGF4CisgICAgbW92ICAgICAgICAgd29yZCBwdHJbcmR4KzMyKjE1XSwgY3gKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfYmxvY2tfc3NlMi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl9ibG9ja19zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQ0NWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfYmxvY2tfc3NlMi5hc20KQEAgLTAsMCArMSw4MTMgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworJW1hY3JvIExGX0FCUyAyCisgICAgICAgIDsgJTEgdmFsdWUgbm90IHByZXNlcnZlZAorICAgICAgICA7ICUyIHZhbHVlIHByZXNlcnZlZAorICAgICAgICA7IG91dHB1dCBpbiAlMQorICAgICAgICBtb3ZkcWEgICAgICBzY3JhdGNoMSwgJTIgICAgICAgICAgICA7IHYyCisKKyAgICAgICAgcHN1YnVzYiAgICAgc2NyYXRjaDEsICUxICAgICAgICAgICAgOyB2MiAtIHYxCisgICAgICAgIHBzdWJ1c2IgICAgICUxLCAlMiAgICAgICAgICAgICAgICAgIDsgdjEgLSB2MgorICAgICAgICBwb3IgICAgICAgICAlMSwgc2NyYXRjaDEgICAgICAgICAgICA7IGFicyh2MiAtIHYxKQorJWVuZG1hY3JvCisKKyVtYWNybyBMRl9GSUxURVJfSEVWX01BU0sgOC05CisKKyAgICAgICAgTEZfQUJTICAgICAgJTEsICUyICAgICAgICAgICAgICAgICAgOyBhYnMocDMgLSBwMikKKyAgICAgICAgTEZfQUJTICAgICAgJTIsICUzICAgICAgICAgICAgICAgICAgOyBhYnMocDIgLSBwMSkKKyAgICAgICAgcG1heHViICAgICAgJTEsICUyICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIG1hc2sKKyVpZiAlMCA9PSA4CisgICAgICAgIG1vdmRxYSAgICAgIHNjcmF0Y2gyLCAlMyAgICAgICAgICAgIDsgc2F2ZSBwMQorICAgICAgICBMRl9BQlMgICAgICBzY3JhdGNoMiwgJTQgICAgICAgICAgICA7IGFicyhwMSAtIHAwKQorJWVuZGlmCisgICAgICAgIExGX0FCUyAgICAgICU0LCAlNSAgICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCisgICAgICAgIExGX0FCUyAgICAgICU1LCAlNiAgICAgICAgICAgICAgICAgIDsgYWJzKHEwIC0gcTEpCislaWYgJTAgPT0gOAorICAgICAgICBwbWF4dWIgICAgICAlNSwgc2NyYXRjaDIgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaGV2CislZWxzZQorICAgICAgICBwbWF4dWIgICAgICAlNSwgJTkKKyVlbmRpZgorICAgICAgICBwbWF4dWIgICAgICAlMSwgJTUgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgbWFzaworCisgICAgICAgIExGX0FCUyAgICAgICUzLCAlNiAgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcTEpCisgICAgICAgIExGX0FCUyAgICAgICU2LCAlNyAgICAgICAgICAgICAgICAgIDsgYWJzKHExIC0gcTIpCisgICAgICAgIHBtYXh1YiAgICAgICUxLCAlNiAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBtYXNrCisgICAgICAgIExGX0FCUyAgICAgICU3LCAlOCAgICAgICAgICAgICAgICAgIDsgYWJzKHEyIC0gcTMpCisgICAgICAgIHBtYXh1YiAgICAgICUxLCAlNyAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBtYXNrCisKKyAgICAgICAgcGFkZHVzYiAgICAgJTQsICU0ICAgICAgICAgICAgICAgICAgOyAyICogYWJzKHAwIC0gcTApCisgICAgICAgIHBhbmQgICAgICAgICUzLCBbR0xPQkFMKHRmZSldCisgICAgICAgIHBzcmx3ICAgICAgICUzLCAxICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcTEpIC8gMgorICAgICAgICBwYWRkdXNiICAgICAlNCwgJTMgICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyCisKKyAgICAgICAgcHN1YnVzYiAgICAgJTEsIFtsaW1pdF0KKyAgICAgICAgcHN1YnVzYiAgICAgJTQsIFtibGltaXRdCisgICAgICAgIHBvciAgICAgICAgICUxLCAlNAorICAgICAgICBwY21wZXFiICAgICAlMSwgemVybyAgICAgICAgICAgICAgICA7IG1hc2sKKworICAgICAgICBwc3VidXNiICAgICAlNSwgW3RocmVzaF0KKyAgICAgICAgcGNtcGVxYiAgICAgJTUsIHplcm8gICAgICAgICAgICAgICAgOyB+aGV2CislZW5kbWFjcm8KKworJW1hY3JvIExGX0ZJTFRFUiA2CisgICAgICAgIDsgJTEtJTQ6IHAxLXExCisgICAgICAgIDsgJTU6IG1hc2sKKyAgICAgICAgOyAlNjogaGV2CisKKyAgICAgICAgbW92ZHFhICAgICAgc2NyYXRjaDIsICU2ICAgICAgICAgICAgOyBzYXZlIGhldgorCisgICAgICAgIHB4b3IgICAgICAgICUxLCBbR0xPQkFMKHQ4MCldICAgICAgIDsgcHMxCisgICAgICAgIHB4b3IgICAgICAgICU0LCBbR0xPQkFMKHQ4MCldICAgICAgIDsgcXMxCisgICAgICAgIG1vdmRxYSAgICAgIHNjcmF0Y2gxLCAlMQorICAgICAgICBwc3Vic2IgICAgICBzY3JhdGNoMSwgJTQgICAgICAgICAgICA7IHNpZ25lZF9jaGFyX2NsYW1wKHBzMSAtIHFzMSkKKyAgICAgICAgcGFuZG4gICAgICAgc2NyYXRjaDIsIHNjcmF0Y2gxICAgICAgOyB2cDhfZmlsdGVyICY9IGhldgorCisgICAgICAgIHB4b3IgICAgICAgICUyLCBbR0xPQkFMKHQ4MCldICAgICAgIDsgcHMwCisgICAgICAgIHB4b3IgICAgICAgICUzLCBbR0xPQkFMKHQ4MCldICAgICAgIDsgcXMwCisgICAgICAgIG1vdmRxYSAgICAgIHNjcmF0Y2gxLCAlMworICAgICAgICBwc3Vic2IgICAgICBzY3JhdGNoMSwgJTIgICAgICAgICAgICA7IHFzMCAtIHBzMAorICAgICAgICBwYWRkc2IgICAgICBzY3JhdGNoMiwgc2NyYXRjaDEgICAgICA7IHZwOF9maWx0ZXIgKz0gKHFzMCAtIHBzMCkKKyAgICAgICAgcGFkZHNiICAgICAgc2NyYXRjaDIsIHNjcmF0Y2gxICAgICAgOyB2cDhfZmlsdGVyICs9IChxczAgLSBwczApCisgICAgICAgIHBhZGRzYiAgICAgIHNjcmF0Y2gyLCBzY3JhdGNoMSAgICAgIDsgdnA4X2ZpbHRlciArPSAocXMwIC0gcHMwKQorICAgICAgICBwYW5kICAgICAgICAlNSwgc2NyYXRjaDIgICAgICAgICAgICA7ICY9IG1hc2sKKworICAgICAgICBtb3ZkcWEgICAgICBzY3JhdGNoMiwgJTUKKyAgICAgICAgcGFkZHNiICAgICAgJTUsIFtHTE9CQUwodDQpXSAgICAgICAgOyBGaWx0ZXIxCisgICAgICAgIHBhZGRzYiAgICAgIHNjcmF0Y2gyLCBbR0xPQkFMKHQzKV0gIDsgRmlsdGVyMgorCisgICAgICAgIDsgRmlsdGVyMSA+PiAzCisgICAgICAgIG1vdmRxYSAgICAgIHNjcmF0Y2gxLCB6ZXJvCisgICAgICAgIHBjbXBndGIgICAgIHNjcmF0Y2gxLCAlNQorICAgICAgICBwc3JsdyAgICAgICAlNSwgMworICAgICAgICBwYW5kICAgICAgICBzY3JhdGNoMSwgW0dMT0JBTCh0ZTApXQorICAgICAgICBwYW5kICAgICAgICAlNSwgW0dMT0JBTCh0MWYpXQorICAgICAgICBwb3IgICAgICAgICAlNSwgc2NyYXRjaDEKKworICAgICAgICBwc3Vic2IgICAgICAlMywgJTUgICAgICAgICAgICAgICAgICA7IHFzMCAtIEZpbHRlcjEKKyAgICAgICAgcHhvciAgICAgICAgJTMsIFtHTE9CQUwodDgwKV0KKworICAgICAgICA7IEZpbHRlcjIgPj4gMworICAgICAgICBtb3ZkcWEgICAgICBzY3JhdGNoMSwgemVybworICAgICAgICBwY21wZ3RiICAgICBzY3JhdGNoMSwgc2NyYXRjaDIKKyAgICAgICAgcHNybHcgICAgICAgc2NyYXRjaDIsIDMKKyAgICAgICAgcGFuZCAgICAgICAgc2NyYXRjaDEsIFtHTE9CQUwodGUwKV0KKyAgICAgICAgcGFuZCAgICAgICAgc2NyYXRjaDIsIFtHTE9CQUwodDFmKV0KKyAgICAgICAgcG9yICAgICAgICAgc2NyYXRjaDIsIHNjcmF0Y2gxCisKKyAgICAgICAgcGFkZHNiICAgICAgJTIsIHNjcmF0Y2gyICAgICAgICAgICAgOyBwczAgKyBGaWx0ZXIyCisgICAgICAgIHB4b3IgICAgICAgICUyLCBbR0xPQkFMKHQ4MCldCisKKyAgICAgICAgOyBvdXRlciB0YXAgYWRqdXN0bWVudHMKKyAgICAgICAgcGFkZHNiICAgICAgJTUsIFtHTE9CQUwodDEpXQorICAgICAgICBtb3ZkcWEgICAgICBzY3JhdGNoMSwgemVybworICAgICAgICBwY21wZ3RiICAgICBzY3JhdGNoMSwgJTUKKyAgICAgICAgcHNybHcgICAgICAgJTUsIDEKKyAgICAgICAgcGFuZCAgICAgICAgc2NyYXRjaDEsIFtHTE9CQUwodDgwKV0KKyAgICAgICAgcGFuZCAgICAgICAgJTUsIFtHTE9CQUwodDdmKV0KKyAgICAgICAgcG9yICAgICAgICAgJTUsIHNjcmF0Y2gxCisgICAgICAgIHBhbmQgICAgICAgICU1LCAlNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSB+aGV2CisKKyAgICAgICAgcHN1YnNiICAgICAgJTQsICU1ICAgICAgICAgICAgICAgICAgOyBxczEgLSB2cDhfZmlsdGVyCisgICAgICAgIHB4b3IgICAgICAgICU0LCBbR0xPQkFMKHQ4MCldCisKKyAgICAgICAgcGFkZHNiICAgICAgJTEsICU1ICAgICAgICAgICAgICAgICAgOyBwczEgKyB2cDhfZmlsdGVyCisgICAgICAgIHB4b3IgICAgICAgICUxLCBbR0xPQkFMKHQ4MCldCislZW5kbWFjcm8KKworO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoX3lfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgICAgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaAorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX2JoX3lfc3NlMikgUFJJVkFURQorc3ltKHZwOF9sb29wX2ZpbHRlcl9iaF95X3NzZTIpOgorCislaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgJWRlZmluZSBzcmMgICAgICByY3ggOyBzcmNfcHRyCisgICAgJWRlZmluZSBzdHJpZGUgICByZHggOyBzcmNfcGl4ZWxfc3RlcAorICAgICVkZWZpbmUgYmxpbWl0ICAgcjgKKyAgICAlZGVmaW5lIGxpbWl0ICAgIHI5CisgICAgJWRlZmluZSB0aHJlc2ggICByMTAKKworICAgICVkZWZpbmUgc3BwICAgICAgcmF4CisgICAgJWRlZmluZSBzdHJpZGUzICByMTEKKyAgICAlZGVmaW5lIHN0cmlkZTUgIHIxMgorICAgICVkZWZpbmUgc3RyaWRlNyAgcjEzCisKKyAgICBwdXNoICAgIHJicAorICAgIG1vdiAgICAgcmJwLCByc3AKKyAgICBwdXNoICAgIHIxMgorICAgIHB1c2ggICAgcjEzCisgICAgbW92ICAgICB0aHJlc2gsIGFyZyg0KQorJWVsc2UKKyAgICAlZGVmaW5lIHNyYyAgICAgIHJkaSA7IHNyY19wdHIKKyAgICAlZGVmaW5lIHN0cmlkZSAgIHJzaSA7IHNyY19waXhlbF9zdGVwCisgICAgJWRlZmluZSBibGltaXQgICByZHgKKyAgICAlZGVmaW5lIGxpbWl0ICAgIHJjeAorICAgICVkZWZpbmUgdGhyZXNoICAgcjgKKworICAgICVkZWZpbmUgc3BwICAgICAgcmF4CisgICAgJWRlZmluZSBzdHJpZGUzICByOQorICAgICVkZWZpbmUgc3RyaWRlNSAgcjEwCisgICAgJWRlZmluZSBzdHJpZGU3ICByMTEKKyVlbmRpZgorCisgICAgJWRlZmluZSBzY3JhdGNoMSB4bW01CisgICAgJWRlZmluZSBzY3JhdGNoMiB4bW02CisgICAgJWRlZmluZSB6ZXJvICAgICB4bW03CisKKyAgICAlZGVmaW5lIGkwICAgICAgIFtzcmNdCisgICAgJWRlZmluZSBpMSAgICAgICBbc3BwXQorICAgICVkZWZpbmUgaTIgICAgICAgW3NyYyArIDIgKiBzdHJpZGVdCisgICAgJWRlZmluZSBpMyAgICAgICBbc3BwICsgMiAqIHN0cmlkZV0KKyAgICAlZGVmaW5lIGk0ICAgICAgIFtzcmMgKyA0ICogc3RyaWRlXQorICAgICVkZWZpbmUgaTUgICAgICAgW3NwcCArIDQgKiBzdHJpZGVdCisgICAgJWRlZmluZSBpNiAgICAgICBbc3JjICsgMiAqIHN0cmlkZTNdCisgICAgJWRlZmluZSBpNyAgICAgICBbc3BwICsgMiAqIHN0cmlkZTNdCisgICAgJWRlZmluZSBpOCAgICAgICBbc3JjICsgOCAqIHN0cmlkZV0KKyAgICAlZGVmaW5lIGk5ICAgICAgIFtzcHAgKyA4ICogc3RyaWRlXQorICAgICVkZWZpbmUgaTEwICAgICAgW3NyYyArIDIgKiBzdHJpZGU1XQorICAgICVkZWZpbmUgaTExICAgICAgW3NwcCArIDIgKiBzdHJpZGU1XQorICAgICVkZWZpbmUgaTEyICAgICAgW3NyYyArIDQgKiBzdHJpZGUzXQorICAgICVkZWZpbmUgaTEzICAgICAgW3NwcCArIDQgKiBzdHJpZGUzXQorICAgICVkZWZpbmUgaTE0ICAgICAgW3NyYyArIDIgKiBzdHJpZGU3XQorICAgICVkZWZpbmUgaTE1ICAgICAgW3NwcCArIDIgKiBzdHJpZGU3XQorCisgICAgOyBwcmVwIHdvcmsKKyAgICBsZWEgICAgICAgICBzcHAsIFtzcmMgKyBzdHJpZGVdCisgICAgbGVhICAgICAgICAgc3RyaWRlMywgW3N0cmlkZSArIDIgKiBzdHJpZGVdCisgICAgbGVhICAgICAgICAgc3RyaWRlNSwgW3N0cmlkZTMgKyAyICogc3RyaWRlXQorICAgIGxlYSAgICAgICAgIHN0cmlkZTcsIFtzdHJpZGUzICsgNCAqIHN0cmlkZV0KKyAgICBweG9yICAgICAgICB6ZXJvLCB6ZXJvCisKKyAgICAgICAgOyBsb2FkIHRoZSBmaXJzdCBzZXQgaW50byByZWdpc3RlcnMKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTAsIGkwCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xLCBpMQorICAgICAgICBtb3ZkcWEgICAgICAgeG1tMiwgaTIKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTMsIGkzCisgICAgICAgIG1vdmRxYSAgICAgICB4bW00LCBpNAorICAgICAgICBtb3ZkcWEgICAgICAgeG1tOCwgaTUKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTksIGk2ICAgOyBxMiwgd2lsbCBjb250YWluIGFicyhwMS1wMCkKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTEwLCBpNworTEZfRklMVEVSX0hFVl9NQVNLIHhtbTAsIHhtbTEsIHhtbTIsIHhtbTMsIHhtbTQsIHhtbTgsIHhtbTksIHhtbTEwCisKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTEsIGkyCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0yLCBpMworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMywgaTQKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTgsIGk1CitMRl9GSUxURVIgeG1tMSwgeG1tMiwgeG1tMywgeG1tOCwgeG1tMCwgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICAgaTIsIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgIGkzLCB4bW0yCisKKzsgc2Vjb25kIHNldAorICAgICAgICBtb3ZkcWEgICAgICAgaTQsIHhtbTMKKyAgICAgICAgbW92ZHFhICAgICAgIGk1LCB4bW04CisKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTAsIGk2CisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xLCBpNworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMiwgaTgKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTQsIGk5CisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xMCwgaTEwICAgOyBxMiwgd2lsbCBjb250YWluIGFicyhwMS1wMCkKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTExLCBpMTEKK0xGX0ZJTFRFUl9IRVZfTUFTSyB4bW0zLCB4bW04LCB4bW0wLCB4bW0xLCB4bW0yLCB4bW00LCB4bW0xMCwgeG1tMTEsIHhtbTkKKworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMCwgaTYKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTEsIGk3CisgICAgICAgIG1vdmRxYSAgICAgICB4bW00LCBpOAorICAgICAgICBtb3ZkcWEgICAgICAgeG1tOCwgaTkKK0xGX0ZJTFRFUiB4bW0wLCB4bW0xLCB4bW00LCB4bW04LCB4bW0zLCB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgICBpNiwgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICAgaTcsIHhtbTEKKworOyBsYXN0IHNldAorICAgICAgICBtb3ZkcWEgICAgICAgaTgsIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgIGk5LCB4bW04CisKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTAsIGkxMAorICAgICAgICBtb3ZkcWEgICAgICAgeG1tMSwgaTExCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0yLCBpMTIKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTMsIGkxMworICAgICAgICBtb3ZkcWEgICAgICAgeG1tOSwgaTE0ICAgOyBxMiwgd2lsbCBjb250YWluIGFicyhwMS1wMCkKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTExLCBpMTUKK0xGX0ZJTFRFUl9IRVZfTUFTSyB4bW00LCB4bW04LCB4bW0wLCB4bW0xLCB4bW0yLCB4bW0zLCB4bW05LCB4bW0xMSwgeG1tMTAKKworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMCwgaTEwCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xLCBpMTEKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTMsIGkxMgorICAgICAgICBtb3ZkcWEgICAgICAgeG1tOCwgaTEzCitMRl9GSUxURVIgeG1tMCwgeG1tMSwgeG1tMywgeG1tOCwgeG1tNCwgeG1tMgorICAgICAgICBtb3ZkcWEgICAgICAgaTEwLCB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgICBpMTEsIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgIGkxMiwgeG1tMworICAgICAgICBtb3ZkcWEgICAgICAgaTEzLCB4bW04CisKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBwb3AgICAgcjEzCisgICAgcG9wICAgIHIxMgorICAgIHBvcCAgICByYnAKKyVlbmRpZgorCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X3lfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgICAgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaAorOykKKworZ2xvYmFsIHN5bSh2cDhfbG9vcF9maWx0ZXJfYnZfeV9zc2UyKSBQUklWQVRFCitzeW0odnA4X2xvb3BfZmlsdGVyX2J2X3lfc3NlMik6CisKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICAlZGVmaW5lIHNyYyAgICAgIHJjeCA7IHNyY19wdHIKKyAgICAlZGVmaW5lIHN0cmlkZSAgIHJkeCA7IHNyY19waXhlbF9zdGVwCisgICAgJWRlZmluZSBibGltaXQgICByOAorICAgICVkZWZpbmUgbGltaXQgICAgcjkKKyAgICAlZGVmaW5lIHRocmVzaCAgIHIxMAorCisgICAgJWRlZmluZSBzcHAgICAgICByYXgKKyAgICAlZGVmaW5lIHN0cmlkZTMgIHIxMQorICAgICVkZWZpbmUgc3RyaWRlNSAgcjEyCisgICAgJWRlZmluZSBzdHJpZGU3ICByMTMKKworICAgIHB1c2ggICAgcmJwCisgICAgbW92ICAgICByYnAsIHJzcAorICAgIFNBVkVfWE1NIDE1CisgICAgcHVzaCAgICByMTIKKyAgICBwdXNoICAgIHIxMworICAgIG1vdiAgICAgdGhyZXNoLCBhcmcoNCkKKyVlbHNlCisgICAgJWRlZmluZSBzcmMgICAgICByZGkKKyAgICAlZGVmaW5lIHN0cmlkZSAgIHJzaQorICAgICVkZWZpbmUgYmxpbWl0ICAgcmR4CisgICAgJWRlZmluZSBsaW1pdCAgICByY3gKKyAgICAlZGVmaW5lIHRocmVzaCAgIHI4CisKKyAgICAlZGVmaW5lIHNwcCAgICAgIHJheAorICAgICVkZWZpbmUgc3RyaWRlMyAgcjkKKyAgICAlZGVmaW5lIHN0cmlkZTUgIHIxMAorICAgICVkZWZpbmUgc3RyaWRlNyAgcjExCislZW5kaWYKKworICAgICVkZWZpbmUgc2NyYXRjaDEgeG1tNQorICAgICVkZWZpbmUgc2NyYXRjaDIgeG1tNgorICAgICVkZWZpbmUgemVybyAgICAgeG1tNworCisgICAgJWRlZmluZSBzMCAgICAgICBbc3JjXQorICAgICVkZWZpbmUgczEgICAgICAgW3NwcF0KKyAgICAlZGVmaW5lIHMyICAgICAgIFtzcmMgKyAyICogc3RyaWRlXQorICAgICVkZWZpbmUgczMgICAgICAgW3NwcCArIDIgKiBzdHJpZGVdCisgICAgJWRlZmluZSBzNCAgICAgICBbc3JjICsgNCAqIHN0cmlkZV0KKyAgICAlZGVmaW5lIHM1ICAgICAgIFtzcHAgKyA0ICogc3RyaWRlXQorICAgICVkZWZpbmUgczYgICAgICAgW3NyYyArIDIgKiBzdHJpZGUzXQorICAgICVkZWZpbmUgczcgICAgICAgW3NwcCArIDIgKiBzdHJpZGUzXQorICAgICVkZWZpbmUgczggICAgICAgW3NyYyArIDggKiBzdHJpZGVdCisgICAgJWRlZmluZSBzOSAgICAgICBbc3BwICsgOCAqIHN0cmlkZV0KKyAgICAlZGVmaW5lIHMxMCAgICAgIFtzcmMgKyAyICogc3RyaWRlNV0KKyAgICAlZGVmaW5lIHMxMSAgICAgIFtzcHAgKyAyICogc3RyaWRlNV0KKyAgICAlZGVmaW5lIHMxMiAgICAgIFtzcmMgKyA0ICogc3RyaWRlM10KKyAgICAlZGVmaW5lIHMxMyAgICAgIFtzcHAgKyA0ICogc3RyaWRlM10KKyAgICAlZGVmaW5lIHMxNCAgICAgIFtzcmMgKyAyICogc3RyaWRlN10KKyAgICAlZGVmaW5lIHMxNSAgICAgIFtzcHAgKyAyICogc3RyaWRlN10KKworICAgICVkZWZpbmUgaTAgICAgICAgW3JzcF0KKyAgICAlZGVmaW5lIGkxICAgICAgIFtyc3AgKyAxNl0KKyAgICAlZGVmaW5lIGkyICAgICAgIFtyc3AgKyAzMl0KKyAgICAlZGVmaW5lIGkzICAgICAgIFtyc3AgKyA0OF0KKyAgICAlZGVmaW5lIGk0ICAgICAgIFtyc3AgKyA2NF0KKyAgICAlZGVmaW5lIGk1ICAgICAgIFtyc3AgKyA4MF0KKyAgICAlZGVmaW5lIGk2ICAgICAgIFtyc3AgKyA5Nl0KKyAgICAlZGVmaW5lIGk3ICAgICAgIFtyc3AgKyAxMTJdCisgICAgJWRlZmluZSBpOCAgICAgICBbcnNwICsgMTI4XQorICAgICVkZWZpbmUgaTkgICAgICAgW3JzcCArIDE0NF0KKyAgICAlZGVmaW5lIGkxMCAgICAgIFtyc3AgKyAxNjBdCisgICAgJWRlZmluZSBpMTEgICAgICBbcnNwICsgMTc2XQorICAgICVkZWZpbmUgaTEyICAgICAgW3JzcCArIDE5Ml0KKyAgICAlZGVmaW5lIGkxMyAgICAgIFtyc3AgKyAyMDhdCisgICAgJWRlZmluZSBpMTQgICAgICBbcnNwICsgMjI0XQorICAgICVkZWZpbmUgaTE1ICAgICAgW3JzcCArIDI0MF0KKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKworICAgIDsgcmVzZXJ2ZSBzdGFjayBzcGFjZQorICAgICVkZWZpbmUgICAgICB0ZW1wX3N0b3JhZ2UgIDAgOyBzaXplIGlzIDI1NiAoMTYqMTYpCisgICAgJWRlZmluZSAgICAgIHN0YWNrX3NpemUgMjU2CisgICAgc3ViICAgICAgICAgIHJzcCwgc3RhY2tfc2l6ZQorCisgICAgOyBwcmVwIHdvcmsKKyAgICBsZWEgICAgICAgICBzcHAsIFtzcmMgKyBzdHJpZGVdCisgICAgbGVhICAgICAgICAgc3RyaWRlMywgW3N0cmlkZSArIDIgKiBzdHJpZGVdCisgICAgbGVhICAgICAgICAgc3RyaWRlNSwgW3N0cmlkZTMgKyAyICogc3RyaWRlXQorICAgIGxlYSAgICAgICAgIHN0cmlkZTcsIFtzdHJpZGUzICsgNCAqIHN0cmlkZV0KKworICAgICAgICA7IDgtZgorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCBzOAorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCisgICAgICAgIHB1bnBja2xidyAgIHhtbTAsIHM5ICAgICAgICAgICAgICAgIDsgODAgOTAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgczkgICAgICAgICAgICAgICAgOyA4OCA5OAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIHMxMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0yCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsIHMxMSA7IGEwIGIwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTMsIHMxMSA7IGE4IGI4CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgeG1tMAorICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCB4bW0yICAgICAgICAgICAgICA7IDgwIDkwIGEwIGIwCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTQsIHhtbTIgICAgICAgICAgICAgIDsgODQgOTQgYTQgYjQKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0xCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsIHhtbTMgICAgICAgICAgICAgIDsgODggOTggYTggYjgKKyAgICAgICAgcHVucGNraHdkICAgeG1tMiwgeG1tMyAgICAgICAgICAgICAgOyA4YyA5YyBhYyBiYworCisgICAgICAgIDsgdXNpbmcgeG1tWzAxMjRdCisgICAgICAgIDsgd29yayBvbiBuZXh0IDQgcm93cworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsIHMxMgorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCB4bW0zCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsIHMxMyA7IGMwIGQwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTUsIHMxMyA7IGM4IGQ4CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgczE0CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsIHhtbTYKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgczE1IDsgZTAgZjAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNywgczE1IDsgZTggZjgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW04LCB4bW0zCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTMsIHhtbTYgICAgICAgICAgICAgIDsgYzAgZDAgZTAgZjAKKyAgICAgICAgcHVucGNraHdkICAgeG1tOCwgeG1tNiAgICAgICAgICAgICAgOyBjNCBkNCBlNCBmNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsIHhtbTUKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNSwgeG1tNyAgICAgICAgICAgICAgOyBjOCBkOCBlOCBmOAorICAgICAgICBwdW5wY2tod2QgICB4bW02LCB4bW03ICAgICAgICAgICAgICA7IGNjIGRjIGVjIGZjCisKKyAgICAgICAgOyBwdWxsIHRoZSB0aGlyZCBhbmQgZm91cnRoIHNldHMgdG9nZXRoZXIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCB4bW0wCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsIHhtbTMgICAgICAgICAgICAgIDsgODAgOTAgYTAgYjAgYzAgZDAgZTAgZjAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNywgeG1tMyAgICAgICAgICAgICAgOyA4MiA5MiBhMiBiMiBjMiBkMiBlMiBmMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsIHhtbTQKKyAgICAgICAgcHVucGNrbGRxICAgeG1tNCwgeG1tOCAgICAgICAgICAgICAgOyA4NCA5NCBhNCBiNCBjNCBkNCBlNCBmNAorICAgICAgICBwdW5wY2toZHEgICB4bW0zLCB4bW04ICAgICAgICAgICAgICA7IDg2IDk2IGE2IGI2IGM2IGQ2IGU2IGY2CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tOCwgeG1tMQorICAgICAgICBwdW5wY2tsZHEgICB4bW0xLCB4bW01ICAgICAgICAgICAgICA7IDg4IDg4IGE4IGI4IGM4IGQ4IGU4IGY4CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTgsIHhtbTUgICAgICAgICAgICAgIDsgOGEgOWEgYWEgYmEgY2EgZGEgZWEgZmEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCB4bW0yCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsIHhtbTYgICAgICAgICAgICAgIDsgOGMgOWMgYWMgYmMgY2MgZGMgZWMgZmMKKyAgICAgICAgcHVucGNraGRxICAgeG1tNSwgeG1tNiAgICAgICAgICAgICAgOyA4ZSA5ZSBhZSBiZSBjZSBkZSBlZSBmZQorCisgICAgICAgIDsgc2F2ZSB0aGUgY2FsY3VsYXRpb25zLiB3ZSBvbmx5IGhhdmUgMTUgcmVnaXN0ZXJzIC4uLgorICAgICAgICBtb3ZkcWEgICAgICBpMCwgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICBpMSwgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBpMiwgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICBpMywgeG1tMworICAgICAgICBtb3ZkcWEgICAgICBpNCwgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICBpNSwgeG1tOAorICAgICAgICBtb3ZkcWEgICAgICBpNiwgeG1tMgorICAgICAgICBtb3ZkcWEgICAgICBpNywgeG1tNQorCisgICAgICAgIDsgMC03CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTAsIHMwCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgczEgOyAwMCAxMAorICAgICAgICBwdW5wY2toYncgICB4bW0xLCBzMSA7IDA4IDE4CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgczIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgeG1tMgorICAgICAgICBwdW5wY2tsYncgICB4bW0yLCBzMyA7IDIwIDMwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTMsIHMzIDsgMjggMzgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCB4bW0wCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsIHhtbTIgICAgICAgICAgICAgIDsgMDAgMTAgMjAgMzAKKyAgICAgICAgcHVucGNraHdkICAgeG1tNCwgeG1tMiAgICAgICAgICAgICAgOyAwNCAxNCAyNCAzNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgeG1tMyAgICAgICAgICAgICAgOyAwOCAxOCAyOCAzOAorICAgICAgICBwdW5wY2tod2QgICB4bW0yLCB4bW0zICAgICAgICAgICAgICA7IDBjIDFjIDJjIDNjCisKKyAgICAgICAgOyB1c2luZyB4bW1bMDEyNF0KKyAgICAgICAgOyB3b3JrIG9uIG5leHQgNCByb3dzCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgczQKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tMworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCBzNSA7IDQwIDUwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTUsIHM1IDsgNDggNTgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCBzNgorICAgICAgICBtb3ZkcWEgICAgICB4bW03LCB4bW02CisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsIHM3ICAgOyA2MCA3MAorICAgICAgICBwdW5wY2toYncgICB4bW03LCBzNyAgIDsgNjggNzgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW04LCB4bW0zCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTMsIHhtbTYgICAgICAgICAgICAgIDsgNDAgNTAgNjAgNzAKKyAgICAgICAgcHVucGNraHdkICAgeG1tOCwgeG1tNiAgICAgICAgICAgICAgOyA0NCA1NCA2NCA3NAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsIHhtbTUKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNSwgeG1tNyAgICAgICAgICAgICAgOyA0OCA1OCA2OCA3OAorICAgICAgICBwdW5wY2tod2QgICB4bW02LCB4bW03ICAgICAgICAgICAgICA7IDRjIDVjIDZjIDdjCisKKyAgICAgICAgOyBwdWxsIHRoZSBmaXJzdCB0d28gc2V0cyB0b2dldGhlcgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsIHhtbTAKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgeG1tMyAgICAgICAgICAgICAgOyAwMCAxMCAyMCAzMCA0MCA1MCA2MCA3MAorICAgICAgICBwdW5wY2toZHEgICB4bW03LCB4bW0zICAgICAgICAgICAgICA7IDAyIDEyIDIyIDMyIDQyIDUyIDYyIDcyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgeG1tNAorICAgICAgICBwdW5wY2tsZHEgICB4bW00LCB4bW04ICAgICAgICAgICAgICA7IDA0IDE0IDI0IDM0IDQ0IDU0IDY0IDc0CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTMsIHhtbTggICAgICAgICAgICAgIDsgMDYgMTYgMjYgMzYgNDYgNTYgNjYgNzYKKworICAgICAgICBtb3ZkcWEgICAgICB4bW04LCB4bW0xCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsIHhtbTUgICAgICAgICAgICAgIDsgMDggMTggMjggMzggNDggNTggNjggNzgKKyAgICAgICAgcHVucGNraGRxICAgeG1tOCwgeG1tNSAgICAgICAgICAgICAgOyAwYSAxYSAyYSAzYSA0YSA1YSA2YSA3YQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsIHhtbTIKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMiwgeG1tNiAgICAgICAgICAgICAgOyAwYyAxYyAyYyAzYyA0YyA1YyA2YyA3YworICAgICAgICBwdW5wY2toZHEgICB4bW01LCB4bW02ICAgICAgICAgICAgICA7IDBlIDFlIDJlIDNlIDRlIDVlIDZlIDdlCisgICAgICAgIDsgZmluYWwgY29tYmluYXRpb24KKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCB4bW0wCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTAsIGkwCisgICAgICAgIHB1bnBja2hxZHEgIHhtbTYsIGkwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tOSwgeG1tNworICAgICAgICBwdW5wY2tscWRxICB4bW03LCBpMQorICAgICAgICBwdW5wY2tocWRxICB4bW05LCBpMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEwLCB4bW00CisgICAgICAgIHB1bnBja2xxZHEgIHhtbTQsIGkyCisgICAgICAgIHB1bnBja2hxZHEgIHhtbTEwLCBpMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTExLCB4bW0zCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTMsIGkzCisgICAgICAgIHB1bnBja2hxZHEgIHhtbTExLCBpMworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEyLCB4bW0xCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTEsIGk0CisgICAgICAgIHB1bnBja2hxZHEgIHhtbTEyLCBpNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEzLCB4bW04CisgICAgICAgIHB1bnBja2xxZHEgIHhtbTgsIGk1CisgICAgICAgIHB1bnBja2hxZHEgIHhtbTEzLCBpNQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTE0LCB4bW0yCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTIsIGk2CisgICAgICAgIHB1bnBja2hxZHEgIHhtbTE0LCBpNgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTE1LCB4bW01CisgICAgICAgIHB1bnBja2xxZHEgIHhtbTUsIGk3CisgICAgICAgIHB1bnBja2hxZHEgIHhtbTE1LCBpNworCisgICAgICAgIG1vdmRxYSAgICAgIGkwLCB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIGkxLCB4bW02CisgICAgICAgIG1vdmRxYSAgICAgIGkyLCB4bW03CisgICAgICAgIG1vdmRxYSAgICAgIGkzLCB4bW05CisgICAgICAgIG1vdmRxYSAgICAgIGk0LCB4bW00CisgICAgICAgIG1vdmRxYSAgICAgIGk1LCB4bW0xMAorICAgICAgICBtb3ZkcWEgICAgICBpNiwgeG1tMworICAgICAgICBtb3ZkcWEgICAgICBpNywgeG1tMTEKKyAgICAgICAgbW92ZHFhICAgICAgaTgsIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgaTksIHhtbTEyCisgICAgICAgIG1vdmRxYSAgICAgIGkxMCwgeG1tOAorICAgICAgICBtb3ZkcWEgICAgICBpMTEsIHhtbTEzCisgICAgICAgIG1vdmRxYSAgICAgIGkxMiwgeG1tMgorICAgICAgICBtb3ZkcWEgICAgICBpMTMsIHhtbTE0CisgICAgICAgIG1vdmRxYSAgICAgIGkxNCwgeG1tNQorICAgICAgICBtb3ZkcWEgICAgICBpMTUsIHhtbTE1CisKKzsgVFJBTlNQT1NFRCBEQVRBIEFWQUlMQUJMRSBPTiBUSEUgU1RBQ0sKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xMiwgeG1tNgorICAgICAgICBtb3ZkcWEgICAgICB4bW0xMywgeG1tNworCisgICAgICAgIHB4b3IgICAgICAgIHplcm8sIHplcm8KKworTEZfRklMVEVSX0hFVl9NQVNLIHhtbTAsIHhtbTEyLCB4bW0xMywgeG1tOSwgeG1tNCwgeG1tMTAsIHhtbTMsIHhtbTExCisKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTEsIGkyCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0yLCBpMworICAgICAgICBtb3ZkcWEgICAgICAgeG1tOCwgaTQKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTksIGk1CitMRl9GSUxURVIgeG1tMSwgeG1tMiwgeG1tOCwgeG1tOSwgeG1tMCwgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICAgaTIsIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgIGkzLCB4bW0yCisKKzsgc2Vjb25kIHNldAorICAgICAgICBtb3ZkcWEgICAgICAgaTQsIHhtbTgKKyAgICAgICAgbW92ZHFhICAgICAgIGk1LCB4bW05CisKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTAsIGk2CisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xLCBpNworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMiwgaTgKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTQsIGk5CisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xMCwgaTEwICAgOyBxMiwgd2lsbCBjb250YWluIGFicyhwMS1wMCkKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTExLCBpMTEKK0xGX0ZJTFRFUl9IRVZfTUFTSyB4bW04LCB4bW05LCB4bW0wLCB4bW0xLCB4bW0yLCB4bW00LCB4bW0xMCwgeG1tMTEsIHhtbTMKKworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMCwgaTYKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTEsIGk3CisgICAgICAgIG1vdmRxYSAgICAgICB4bW0zLCBpOAorICAgICAgICBtb3ZkcWEgICAgICAgeG1tNCwgaTkKK0xGX0ZJTFRFUiB4bW0wLCB4bW0xLCB4bW0zLCB4bW00LCB4bW04LCB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgICBpNiwgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICAgaTcsIHhtbTEKKworOyBsYXN0IHNldAorICAgICAgICBtb3ZkcWEgICAgICAgaTgsIHhtbTMKKyAgICAgICAgbW92ZHFhICAgICAgIGk5LCB4bW00CisKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTAsIGkxMAorICAgICAgICBtb3ZkcWEgICAgICAgeG1tMSwgaTExCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0yLCBpMTIKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTgsIGkxMworICAgICAgICBtb3ZkcWEgICAgICAgeG1tOSwgaTE0ICAgOyBxMiwgd2lsbCBjb250YWluIGFicyhwMS1wMCkKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTExLCBpMTUKK0xGX0ZJTFRFUl9IRVZfTUFTSyB4bW0zLCB4bW00LCB4bW0wLCB4bW0xLCB4bW0yLCB4bW04LCB4bW05LCB4bW0xMSwgeG1tMTAKKworICAgICAgICBtb3ZkcWEgICAgICAgeG1tMCwgaTEwCisgICAgICAgIG1vdmRxYSAgICAgICB4bW0xLCBpMTEKKyAgICAgICAgbW92ZHFhICAgICAgIHhtbTQsIGkxMgorICAgICAgICBtb3ZkcWEgICAgICAgeG1tOCwgaTEzCitMRl9GSUxURVIgeG1tMCwgeG1tMSwgeG1tNCwgeG1tOCwgeG1tMywgeG1tMgorICAgICAgICBtb3ZkcWEgICAgICAgaTEwLCB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgICBpMTEsIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgIGkxMiwgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICAgaTEzLCB4bW04CisKKworOyBSRVNIVUZGTEUgQU5EIFdSSVRFIE9VVAorICAgICAgICA7IDgtZgorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCBpOAorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCisgICAgICAgIHB1bnBja2xidyAgIHhtbTAsIGk5ICAgICAgICAgICAgICAgIDsgODAgOTAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgaTkgICAgICAgICAgICAgICAgOyA4OCA5OAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIGkxMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0yCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsIGkxMSAgICAgICAgICAgICAgIDsgYTAgYjAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tMywgaTExICAgICAgICAgICAgICAgOyBhOCBiOAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsIHhtbTAKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgeG1tMiAgICAgICAgICAgICAgOyA4MCA5MCBhMCBiMAorICAgICAgICBwdW5wY2tod2QgICB4bW00LCB4bW0yICAgICAgICAgICAgICA7IDg0IDk0IGE0IGI0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgeG1tMQorICAgICAgICBwdW5wY2tsd2QgICB4bW0xLCB4bW0zICAgICAgICAgICAgICA7IDg4IDk4IGE4IGI4CisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTIsIHhtbTMgICAgICAgICAgICAgIDsgOGMgOWMgYWMgYmMKKworICAgICAgICA7IHVzaW5nIHhtbVswMTI0XQorICAgICAgICA7IHdvcmsgb24gbmV4dCA0IHJvd3MKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCBpMTIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tMworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCBpMTMgICAgICAgICAgICAgICA7IGMwIGQwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTUsIGkxMyAgICAgICAgICAgICAgIDsgYzggZDgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCBpMTQKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgeG1tNgorICAgICAgICBwdW5wY2tsYncgICB4bW02LCBpMTUgICAgICAgICAgICAgICA7IGUwIGYwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTcsIGkxNSAgICAgICAgICAgICAgIDsgZTggZjgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW04LCB4bW0zCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTMsIHhtbTYgICAgICAgICAgICAgIDsgYzAgZDAgZTAgZjAKKyAgICAgICAgcHVucGNraHdkICAgeG1tOCwgeG1tNiAgICAgICAgICAgICAgOyBjNCBkNCBlNCBmNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsIHhtbTUKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNSwgeG1tNyAgICAgICAgICAgICAgOyBjOCBkOCBlOCBmOAorICAgICAgICBwdW5wY2tod2QgICB4bW02LCB4bW03ICAgICAgICAgICAgICA7IGNjIGRjIGVjIGZjCisKKyAgICAgICAgOyBwdWxsIHRoZSB0aGlyZCBhbmQgZm91cnRoIHNldHMgdG9nZXRoZXIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCB4bW0wCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsIHhtbTMgICAgICAgICAgICAgIDsgODAgOTAgYTAgYjAgYzAgZDAgZTAgZjAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNywgeG1tMyAgICAgICAgICAgICAgOyA4MiA5MiBhMiBiMiBjMiBkMiBlMiBmMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsIHhtbTQKKyAgICAgICAgcHVucGNrbGRxICAgeG1tNCwgeG1tOCAgICAgICAgICAgICAgOyA4NCA5NCBhNCBiNCBjNCBkNCBlNCBmNAorICAgICAgICBwdW5wY2toZHEgICB4bW0zLCB4bW04ICAgICAgICAgICAgICA7IDg2IDk2IGE2IGI2IGM2IGQ2IGU2IGY2CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tOCwgeG1tMQorICAgICAgICBwdW5wY2tsZHEgICB4bW0xLCB4bW01ICAgICAgICAgICAgICA7IDg4IDg4IGE4IGI4IGM4IGQ4IGU4IGY4CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTgsIHhtbTUgICAgICAgICAgICAgIDsgOGEgOWEgYWEgYmEgY2EgZGEgZWEgZmEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCB4bW0yCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTIsIHhtbTYgICAgICAgICAgICAgIDsgOGMgOWMgYWMgYmMgY2MgZGMgZWMgZmMKKyAgICAgICAgcHVucGNraGRxICAgeG1tNSwgeG1tNiAgICAgICAgICAgICAgOyA4ZSA5ZSBhZSBiZSBjZSBkZSBlZSBmZQorCisgICAgICAgIDsgc2F2ZSB0aGUgY2FsY3VsYXRpb25zLiB3ZSBvbmx5IGhhdmUgMTUgcmVnaXN0ZXJzIC4uLgorICAgICAgICBtb3ZkcWEgICAgICBpOCwgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICBpOSwgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBpMTAsIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgaTExLCB4bW0zCisgICAgICAgIG1vdmRxYSAgICAgIGkxMiwgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICBpMTMsIHhtbTgKKyAgICAgICAgbW92ZHFhICAgICAgaTE0LCB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIGkxNSwgeG1tNQorCisgICAgICAgIDsgMC03CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTAsIGkwCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgaTEgICAgICAgICAgICAgICAgOyAwMCAxMAorICAgICAgICBwdW5wY2toYncgICB4bW0xLCBpMSAgICAgICAgICAgICAgICA7IDA4IDE4CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgaTIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgeG1tMgorICAgICAgICBwdW5wY2tsYncgICB4bW0yLCBpMyAgICAgICAgICAgICAgICA7IDIwIDMwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTMsIGkzICAgICAgICAgICAgICAgIDsgMjggMzgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCB4bW0wCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsIHhtbTIgICAgICAgICAgICAgIDsgMDAgMTAgMjAgMzAKKyAgICAgICAgcHVucGNraHdkICAgeG1tNCwgeG1tMiAgICAgICAgICAgICAgOyAwNCAxNCAyNCAzNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgeG1tMyAgICAgICAgICAgICAgOyAwOCAxOCAyOCAzOAorICAgICAgICBwdW5wY2tod2QgICB4bW0yLCB4bW0zICAgICAgICAgICAgICA7IDBjIDFjIDJjIDNjCisKKyAgICAgICAgOyB1c2luZyB4bW1bMDEyNF0KKyAgICAgICAgOyB3b3JrIG9uIG5leHQgNCByb3dzCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgaTQKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tMworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCBpNSAgICAgICAgICAgICAgICA7IDQwIDUwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTUsIGk1ICAgICAgICAgICAgICAgIDsgNDggNTgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCBpNgorICAgICAgICBtb3ZkcWEgICAgICB4bW03LCB4bW02CisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsIGk3ICAgICAgICAgICAgICAgIDsgNjAgNzAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNywgaTcgICAgICAgICAgICAgICAgOyA2OCA3OAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTgsIHhtbTMKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMywgeG1tNiAgICAgICAgICAgICAgOyA0MCA1MCA2MCA3MAorICAgICAgICBwdW5wY2tod2QgICB4bW04LCB4bW02ICAgICAgICAgICAgICA7IDQ0IDU0IDY0IDc0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgeG1tNQorICAgICAgICBwdW5wY2tsd2QgICB4bW01LCB4bW03ICAgICAgICAgICAgICA7IDQ4IDU4IDY4IDc4CisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTYsIHhtbTcgICAgICAgICAgICAgIDsgNGMgNWMgNmMgN2MKKworICAgICAgICA7IHB1bGwgdGhlIGZpcnN0IHR3byBzZXRzIHRvZ2V0aGVyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgeG1tMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCB4bW0zICAgICAgICAgICAgICA7IDAwIDEwIDIwIDMwIDQwIDUwIDYwIDcwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTcsIHhtbTMgICAgICAgICAgICAgIDsgMDIgMTIgMjIgMzIgNDIgNTIgNjIgNzIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW00CisgICAgICAgIHB1bnBja2xkcSAgIHhtbTQsIHhtbTggICAgICAgICAgICAgIDsgMDQgMTQgMjQgMzQgNDQgNTQgNjQgNzQKKyAgICAgICAgcHVucGNraGRxICAgeG1tMywgeG1tOCAgICAgICAgICAgICAgOyAwNiAxNiAyNiAzNiA0NiA1NiA2NiA3NgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTgsIHhtbTEKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgeG1tNSAgICAgICAgICAgICAgOyAwOCAxOCAyOCAzOCA0OCA1OCA2OCA3OAorICAgICAgICBwdW5wY2toZHEgICB4bW04LCB4bW01ICAgICAgICAgICAgICA7IDBhIDFhIDJhIDNhIDRhIDVhIDZhIDdhCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tMgorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCB4bW02ICAgICAgICAgICAgICA7IDBjIDFjIDJjIDNjIDRjIDVjIDZjIDdjCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTUsIHhtbTYgICAgICAgICAgICAgIDsgMGUgMWUgMmUgM2UgNGUgNWUgNmUgN2UKKyAgICAgICAgOyBmaW5hbCBjb21iaW5hdGlvbgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsIHhtbTAKKyAgICAgICAgcHVucGNrbHFkcSAgeG1tMCwgaTgKKyAgICAgICAgcHVucGNraHFkcSAgeG1tNiwgaTgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW05LCB4bW03CisgICAgICAgIHB1bnBja2xxZHEgIHhtbTcsIGk5CisgICAgICAgIHB1bnBja2hxZHEgIHhtbTksIGk5CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMTAsIHhtbTQKKyAgICAgICAgcHVucGNrbHFkcSAgeG1tNCwgaTEwCisgICAgICAgIHB1bnBja2hxZHEgIHhtbTEwLCBpMTAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xMSwgeG1tMworICAgICAgICBwdW5wY2tscWRxICB4bW0zLCBpMTEKKyAgICAgICAgcHVucGNraHFkcSAgeG1tMTEsIGkxMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEyLCB4bW0xCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTEsIGkxMgorICAgICAgICBwdW5wY2tocWRxICB4bW0xMiwgaTEyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMTMsIHhtbTgKKyAgICAgICAgcHVucGNrbHFkcSAgeG1tOCwgaTEzCisgICAgICAgIHB1bnBja2hxZHEgIHhtbTEzLCBpMTMKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xNCwgeG1tMgorICAgICAgICBwdW5wY2tscWRxICB4bW0yLCBpMTQKKyAgICAgICAgcHVucGNraHFkcSAgeG1tMTQsIGkxNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTE1LCB4bW01CisgICAgICAgIHB1bnBja2xxZHEgIHhtbTUsIGkxNQorICAgICAgICBwdW5wY2tocWRxICB4bW0xNSwgaTE1CisKKyAgICAgICAgbW92ZHFhICAgICAgczAsIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgczEsIHhtbTYKKyAgICAgICAgbW92ZHFhICAgICAgczIsIHhtbTcKKyAgICAgICAgbW92ZHFhICAgICAgczMsIHhtbTkKKyAgICAgICAgbW92ZHFhICAgICAgczQsIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgczUsIHhtbTEwCisgICAgICAgIG1vdmRxYSAgICAgIHM2LCB4bW0zCisgICAgICAgIG1vdmRxYSAgICAgIHM3LCB4bW0xMQorICAgICAgICBtb3ZkcWEgICAgICBzOCwgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICBzOSwgeG1tMTIKKyAgICAgICAgbW92ZHFhICAgICAgczEwLCB4bW04CisgICAgICAgIG1vdmRxYSAgICAgIHMxMSwgeG1tMTMKKyAgICAgICAgbW92ZHFhICAgICAgczEyLCB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIHMxMywgeG1tMTQKKyAgICAgICAgbW92ZHFhICAgICAgczE0LCB4bW01CisgICAgICAgIG1vdmRxYSAgICAgIHMxNSwgeG1tMTUKKworICAgIDsgZnJlZSBzdGFjayBzcGFjZQorICAgIGFkZCAgICAgICAgICByc3AsIHN0YWNrX3NpemUKKworICAgIDsgdW4tQUxJR05fU1RBQ0sKKyAgICBwb3AgICAgICAgICAgcnNwCisKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBwb3AgICAgcjEzCisgICAgcG9wICAgIHIxMgorICAgIFJFU1RPUkVfWE1NCisgICAgcG9wICAgIHJicAorJWVuZGlmCisKKyAgICByZXQKKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDE2Cit0ZTA6CisgICAgdGltZXMgMTYgZGIgMHhlMAorYWxpZ24gMTYKK3Q3ZjoKKyAgICB0aW1lcyAxNiBkYiAweDdmCithbGlnbiAxNgordGZlOgorICAgIHRpbWVzIDE2IGRiIDB4ZmUKK2FsaWduIDE2Cit0MWY6CisgICAgdGltZXMgMTYgZGIgMHgxZgorYWxpZ24gMTYKK3Q4MDoKKyAgICB0aW1lcyAxNiBkYiAweDgwCithbGlnbiAxNgordDE6CisgICAgdGltZXMgMTYgZGIgMHgwMQorYWxpZ24gMTYKK3QzOgorICAgIHRpbWVzIDE2IGRiIDB4MDMKK2FsaWduIDE2Cit0NDoKKyAgICB0aW1lcyAxNiBkYiAweDA0CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl9tbXguYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfbW14LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg4ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfbW14LmFzbQpAQCAtMCwwICsxLDE3NTMgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworCis7dm9pZCB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teAorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50IHNyY19waXhlbF9zdGVwLAorOyAgICBjb25zdCBjaGFyICpibGltaXQsCis7ICAgIGNvbnN0IGNoYXIgKmxpbWl0LAorOyAgICBjb25zdCBjaGFyICp0aHJlc2gsCis7ICAgIGludCAgY291bnQKKzspCitnbG9iYWwgc3ltKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KSBQUklWQVRFCitzeW0odnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgIHJzcCwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgOyByZXNlcnZlIDMyIGJ5dGVzCisgICAgJWRlZmluZSB0MCBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzhdOworICAgICVkZWZpbmUgdDEgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVs4XTsKKworICAgICAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg1KSA7Y291bnQKKy5uZXh0OF9oOgorICAgICAgICBtb3YgICAgICAgICByZHgsIGFyZygzKSA7bGltaXQKKyAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmR4XQorICAgICAgICBtb3YgICAgICAgICByZGksIHJzaSAgICAgICAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZworICAgICAgICBhZGQgICAgICAgICByZGksIHJheAorCisgICAgICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcmRpKzIqcmF4XSAgICAgIDsgcTMKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcnNpKzIqcmF4XSAgICAgIDsgcTIKKyAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTEgICAgICAgICAgICAgIDsgcTIKKyAgICAgICAgcHN1YnVzYiAgICAgbW0xLCBtbTIgICAgICAgICAgICAgIDsgcTItPXEzCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMiwgbW02ICAgICAgICAgICAgICA7IHEzLT1xMgorICAgICAgICBwb3IgICAgICAgICBtbTEsIG1tMiAgICAgICAgICAgICAgOyBhYnMocTMtcTIpCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgbW03ICAgICAgICAgICAgICA7CisKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2krcmF4XSAgICAgICAgOyBxMQorICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBxMQorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNiAgICAgICAgICAgICAgOyBxMS09cTIKKyAgICAgICAgcHN1YnVzYiAgICAgbW02LCBtbTMgICAgICAgICAgICAgIDsgcTItPXExCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgICA7IGFicyhxMi1xMSkKKworICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNworICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00CisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpXSAgICAgICAgICAgIDsgcTAKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBtbTQgICAgICAgICAgICAgIDsgcTAKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgcTAtPXExCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHExLT1xMAorICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBhYnMocTAtcTEpCisgICAgICAgIG1vdnEgICAgICAgIHQwLCBtbTQgICAgICAgICAgICAgICA7IHNhdmUgdG8gdDAKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKKyAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAorCisKKyAgICAgICAgbmVnICAgICAgICAgcmF4ICAgICAgICAgICAgICAgICAgIDsgbmVnYXRlIHBpdGNoIHRvIGRlYWwgd2l0aCBhYm92ZSBib3JkZXIKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtyc2krNCpyYXhdICAgICAgOyBwMworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyZGkrNCpyYXhdICAgICAgOyBwMgorICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBwMgorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tMiAgICAgICAgICAgICAgOyBwMi09cDMKKyAgICAgICAgcHN1YnVzYiAgICAgbW0yLCBtbTUgICAgICAgICAgICAgIDsgcDMtPXAyCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW0yICAgICAgICAgICAgICA7IGFicyhwMyAtIHAyKQorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNworICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00CisKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2krMipyYXhdICAgICAgOyBwMQorICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBwMQorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNSAgICAgICAgICAgICAgOyBwMS09cDIKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCBtbTMgICAgICAgICAgICAgIDsgcDItPXAxCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgICA7IGFicyhwMiAtIHAxKQorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNworICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00CisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgIDsgcDEKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2krcmF4XSAgICAgICAgOyBwMAorICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBwMAorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBwMC09cDEKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTUgICAgICAgICAgICAgIDsgcDEtPXAwCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgICA7IGFicyhwMSAtIHAwKQorICAgICAgICBtb3ZxICAgICAgICB0MSwgbW00ICAgICAgICAgICAgICAgOyBzYXZlIHRvIHQxCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03CisgICAgICAgIHBvciAgICAgICAgbW0xLCBtbTQKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZGldICAgICAgICAgICAgOyBxMQorICAgICAgICBtb3ZxICAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBxMQorICAgICAgICBwc3VidXNiICAgICBtbTMsIG1tMiAgICAgICAgICAgICAgOyBxMS09cDEKKyAgICAgICAgcHN1YnVzYiAgICAgbW0yLCBtbTQgICAgICAgICAgICAgIDsgcDEtPXExCisgICAgICAgIHBvciAgICAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKKyAgICAgICAgcGFuZCAgICAgICAgbW0yLCBbR0xPQkFMKHRmZSldICAgIDsgc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybworICAgICAgICBwc3JsdyAgICAgICBtbTIsIDEgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKKworICAgICAgICBtb3ZxICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBwMAorICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyc2ldICAgICAgICAgICAgOyBxMAorICAgICAgICBwc3VidXNiICAgICBtbTUsIG1tMyAgICAgICAgICAgICAgOyBwMC09cTAKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgcTAtPXAwCisgICAgICAgIHBvciAgICAgICAgIG1tNSwgbW0zICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorICAgICAgICBwYWRkdXNiICAgICBtbTUsIG1tNSAgICAgICAgICAgICAgOyBhYnMocDAtcTApKjIKKyAgICAgICAgcGFkZHVzYiAgICAgbW01LCBtbTIgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgorCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDIpIDtibGltaXQgICAgICAgICAgIDsgZ2V0IGJsaW1pdAorICAgICAgICBtb3ZxICAgICAgICBtbTcsIFtyZHhdICAgICAgICAgICAgOyBibGltaXQKKworICAgICAgICBwc3VidXNiICAgICBtbTUsICAgIG1tNyAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yICA+IGJsaW1pdAorICAgICAgICBwb3IgICAgICAgICBtbTEsICAgIG1tNQorICAgICAgICBweG9yICAgICAgICBtbTUsICAgIG1tNQorICAgICAgICBwY21wZXFiICAgICBtbTEsICAgIG1tNSAgICAgICAgICAgOyBtYXNrIG1tMQorCisgICAgICAgIDsgY2FsY3VsYXRlIGhpZ2ggZWRnZSB2YXJpYW5jZQorICAgICAgICBtb3YgICAgICAgICByZHgsIGFyZyg0KSA7dGhyZXNoICAgICAgICAgICA7IGdldCB0aHJlc2gKKyAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmR4XSAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW00LCB0MCAgICAgICAgICAgICAgIDsgZ2V0IGFicyAocTEgLSBxMCkKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCB0MSAgICAgICAgICAgICAgIDsgZ2V0IGFicyAocDEgLSBwMCkKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTcKKyAgICAgICAgcGFkZGIgICAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgYWJzKHExIC0gcTApID4gdGhyZXNoIHx8IGFicyhwMSAtIHAwKSA+IHRocmVzaAorCisgICAgICAgIHBjbXBlcWIgICAgIG1tNCwgICAgICAgIG1tNQorCisgICAgICAgIHBjbXBlcWIgICAgIG1tNSwgICAgICAgIG1tNQorICAgICAgICBweG9yICAgICAgICBtbTQsICAgICAgICBtbTUKKworCisgICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgW3JzaSsyKnJheF0gICAgICA7IHAxCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgW3JkaV0gICAgICAgICAgICA7IHExCisgICAgICAgIHB4b3IgICAgICAgIG1tMiwgW0dMT0JBTCh0ODApXSAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICAgICAgcHhvciAgICAgICAgbW03LCBbR0xPQkFMKHQ4MCldICAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBwc3Vic2IgICAgICBtbTIsIG1tNyAgICAgICAgICAgICAgOyBwMSAtIHExCisgICAgICAgIHBhbmQgICAgICAgIG1tMiwgbW00ICAgICAgICAgICAgICA7IGhpZ2ggdmFyIG1hc2sgKGh2bSkocDEgLSBxMSkKKyAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICBtbTAsIFtHTE9CQUwodDgwKV0gICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHEwCisgICAgICAgIHBzdWJzYiAgICAgIG1tMCwgbW02ICAgICAgICAgICAgICA7IHEwIC0gcDAKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgIDsgMSAqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKQorICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyAyICogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpCisgICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IDMgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKKyAgICAgICAgcGFuZCAgICAgICAgbW0xLCBtbTIgICAgICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0xCisgICAgICAgIHBhZGRzYiAgICAgIG1tMSwgW0dMT0JBTCh0NCldICAgICA7IDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCBbR0xPQkFMKHQzKV0gICAgIDsgMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgMworCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgIDsKKyAgICAgICAgcHhvciAgICAgICAgbW01LCBtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTIgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2hidyAgIG1tNSwgbW0yICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICBtbTAsIDExICAgICAgICAgICAgIDsKKyAgICAgICAgcHNyYXcgICAgICAgbW01LCAxMQorICAgICAgICBwYWNrc3N3YiAgICBtbTAsIG1tNQorICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgIDsgICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyAzKSA+PiAzOworCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgICA7IDAKKyAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgYWJjZGVmZ2gKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTEgICAgICAgICAgICAgIDsgZTBmMGcwaDAKKyAgICAgICAgcHNyYXcgICAgICAgbW0wLCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIHB4b3IgICAgICAgIG1tMSwgbW0xICAgICAgICAgICAgICA7IDAKKyAgICAgICAgcHVucGNraGJ3ICAgbW0xLCBtbTUgICAgICAgICAgICAgIDsgYTBiMGMwZDAKKyAgICAgICAgcHNyYXcgICAgICAgbW0xLCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICA7IHNhdmUgcmVzdWx0cworCisgICAgICAgIHBhY2tzc3diICAgIG1tMCwgbW0xICAgICAgICAgICAgICA7ICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyA0KSA+PjMKKyAgICAgICAgcGFkZHN3ICAgICAgbW01LCBbR0xPQkFMKG9uZXMpXQorICAgICAgICBwYWRkc3cgICAgICBtbTEsIFtHTE9CQUwob25lcyldCisgICAgICAgIHBzcmF3ICAgICAgIG1tNSwgMSAgICAgICAgICAgICAgICA7IHBhcnRpYWwgc2hpZnRlZCBvbmUgbW9yZSB0aW1lIGZvciAybmQgdGFwCisgICAgICAgIHBzcmF3ICAgICAgIG1tMSwgMSAgICAgICAgICAgICAgICA7IHBhcnRpYWwgc2hpZnRlZCBvbmUgbW9yZSB0aW1lIGZvciAybmQgdGFwCisgICAgICAgIHBhY2tzc3diICAgIG1tNSwgbW0xICAgICAgICAgICAgICA7ICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyA0KSA+PjQKKyAgICAgICAgcGFuZG4gICAgICAgbW00LCBtbTUgICAgICAgICAgICAgIDsgaGlnaCBlZGdlIHZhcmlhbmNlIGFkZGl0aXZlCisKKyAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTIgICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKKyAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgIDsgdW5vZmZzZXQKKyAgICAgICAgbW92cSAgICAgICAgW3JzaStyYXhdLCBtbTYgICAgICAgIDsgd3JpdGUgYmFjaworCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JzaSsyKnJheF0gICAgICA7IHAxCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICA7IHJlb2Zmc2V0CisgICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW00ICAgICAgICAgICAgICA7IHAxKz0gcDEgYWRkCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICA7IHVub2Zmc2V0CisgICAgICAgIG1vdnEgICAgICAgIFtyc2krMipyYXhdLCBtbTYgICAgICA7IHdyaXRlIGJhY2sKKworICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxMC09IHEwIGFkZAorICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0gICAgOyB1bm9mZnNldAorICAgICAgICBtb3ZxICAgICAgICBbcnNpXSwgbW0zICAgICAgICAgICAgOyB3cml0ZSBiYWNrCisKKyAgICAgICAgcHN1YnNiICAgICAgbW03LCBtbTQgICAgICAgICAgICAgIDsgcTEtPSBxMSBhZGQKKyAgICAgICAgcHhvciAgICAgICAgbW03LCBbR0xPQkFMKHQ4MCldICAgIDsgdW5vZmZzZXQKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sIG1tNyAgICAgICAgICAgIDsgd3JpdGUgYmFjaworCisgICAgICAgIGFkZCAgICAgICAgIHJzaSw4CisgICAgICAgIG5lZyAgICAgICAgIHJheAorICAgICAgICBkZWMgICAgICAgICByY3gKKyAgICAgICAgam56ICAgICAgICAgLm5leHQ4X2gKKworICAgIGFkZCByc3AsIDMyCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgKnRocmVzaCwKKzsgICAgaW50IGNvdW50Cis7KQorZ2xvYmFsIHN5bSh2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgICByc3AsIDY0ICAgICAgOyByZXNlcnZlIDY0IGJ5dGVzCisgICAgJWRlZmluZSB0MCAgIFtyc3AgKyAwXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDBbOF07CisgICAgJWRlZmluZSB0MSAgIFtyc3AgKyAxNl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbOF07CisgICAgJWRlZmluZSBzcmN0IFtyc3AgKyAzMl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgc3JjdFszMl07CisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXgqNCAtIDRdCisKKyAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7Y291bnQKKy5uZXh0OF92OgorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICByc2kgICAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmF4CisKKworICAgICAgICA7dHJhbnNwb3NlCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIFtyc2krMipyYXhdICAgICAgICAgICAgICAgICA7IDY3IDY2IDY1IDY0IDYzIDYyIDYxIDYwCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDc3IDc2IDc1IDc0IDczIDcyIDcxIDcwCisKKyAgICAgICAgcHVucGNraGJ3ICAgbW03LCAgICAgICAgW3JkaSsyKnJheF0gICAgICAgICAgICAgICAgIDsgNzcgNjcgNzYgNjYgNzUgNjUgNzQgNjQKKyAgICAgICAgcHVucGNrbGJ3ICAgbW02LCAgICAgICAgW3JkaSsyKnJheF0gICAgICAgICAgICAgICAgIDsgNzMgNjMgNzIgNjIgNzEgNjEgNzAgNjAKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcnNpXSAgICAgICAgICAgICAgICAgICAgICAgOyA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorCisgICAgICAgIHB1bnBja2hidyAgIG1tNSwgICAgICAgIFtyc2krcmF4XSAgICAgICAgICAgICAgICAgICA7IDU3IDQ3IDU2IDQ2IDU1IDQ1IDU0IDQ0CisgICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgIFtyc2krcmF4XSAgICAgICAgICAgICAgICAgICA7IDUzIDQzIDUyIDQyIDUxIDQxIDUwIDQwCisKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTcgNDcgNTYgNDYgNTUgNDUgNTQgNDQKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgNzYgNjYgNTYgNDYKKworICAgICAgICBwdW5wY2tsd2QgICBtbTMsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSA3NCA2NCA1NCA0NAorICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAorCisgICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDcyIDYyIDUyIDQyCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDYxIDUxIDQxIDcwIDYwIDUwIDQwCisKKyAgICAgICAgbmVnICAgICAgICAgcmF4CisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIFtyc2krcmF4KjJdICAgICAgICAgICAgICAgICA7IDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwCisKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMjcgMjYgMjUgMjQgMjMgMjIgMjEgMjAKKyAgICAgICAgcHVucGNraGJ3ICAgbW02LCAgICAgICAgW3JzaStyYXhdICAgICAgICAgICAgICAgICAgIDsgMzcgMjcgMzYgMzYgMzUgMjUgMzQgMjQKKworICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBbcnNpK3JheF0gICAgICAgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAorICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBbcnNpK3JheCo0XTsgICAgICAgICAgICAgICAgOyAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorCisgICAgICAgIHB1bnBja2hidyAgIG1tNywgICAgICAgIFtyZGkrcmF4KjRdICAgICAgICAgICAgICAgICA7IDE3IDA3IDE2IDA2IDE1IDA1IDE0IDA0CisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IDE3IDA3IDE2IDA2IDE1IDA1IDE0IDA0CisKKyAgICAgICAgcHVucGNraHdkICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzcgMjcgMTcgMDcgMzYgMjYgMTYgMDYKKyAgICAgICAgcHVucGNrbHdkICAgbW0wLCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzUgMjUgMTUgMDUgMzQgMjQgMTQgMDQKKworICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAzNyAyNyAxNyAwNyAzNiAyNiAxNiAwNgorICAgICAgICBwdW5wY2toZHEgICBtbTcsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NyA2NyA1NyA0NyAzNyAyNyAxNyAwNyAgPSBxMworCisgICAgICAgIHB1bnBja2xkcSAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2ICA9IHEyCisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzYgNjYgNTYgNDYgMzYgMjYgMTYgMDYKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTItcTMKKworICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMy1xMgorICAgICAgICBwb3IgICAgICAgICBtbTcsICAgICAgICBtbTU7ICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTc9YWJzIChxMy1xMikKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzNSAyNSAxNSAwNSAzNCAyNCAxNCAwNAorICAgICAgICBwdW5wY2toZHEgICBtbTUsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNSA9IHExCisKKyAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzQgNjQgNTQgNDQgMzQgMjQgMTUgMDQgPSBxMAorICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNSA9IHExCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtcTIKKyAgICAgICAgcHN1YnVzYiAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTItcTEKKworICAgICAgICBwb3IgICAgICAgICBtbTYsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTY9YWJzKHEyLXExKQorICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBzcmN0CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkeCsyNF0sICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBxMQorICAgICAgICBtb3ZxICAgICAgICBbcmR4KzE2XSwgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHEwCisKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgW3JzaStyYXgqNF0gICAgICAgICAgICAgICAgIDsgMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgW3JkaStyYXgqNF0gICAgICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAorICAgICAgICBwdW5wY2tsd2QgICBtbTAsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAorCisgICAgICAgIHB1bnBja2h3ZCAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCisKKyAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAgID1wMworICAgICAgICBwdW5wY2toZHEgICBtbTEsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSAgPXAyCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgID1wMgorICAgICAgICBwc3VidXNiICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMi1wMworCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzLXAyCisgICAgICAgIHBvciAgICAgICAgIG1tMCwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMD1hYnMocDMtcDIpCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIKKyAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIgPSBwMQorCisgICAgICAgIHB1bnBja2hkcSAgIG1tMywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzID0gcDAKKyAgICAgICAgbW92cSAgICAgICAgW3JkeCs4XSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBwMAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZHhdLCAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcDEKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW01ID0gcDEKKworICAgICAgICBwc3VidXNiICAgICBtbTIsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMS1wMgorICAgICAgICBwc3VidXNiICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMi1wMQorCisgICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMT1hYnMocDItcDEpCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygzKSA7bGltaXQKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcmR4XSAgICAgICAgICAgICAgICAgICAgICAgOyBtbTQgPSBsaW1pdAorICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTQKKworICAgICAgICBwc3VidXNiICAgICBtbTAsICAgICAgICBtbTQKKyAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW00CisKKyAgICAgICAgcHN1YnVzYiAgICAgbW02LCAgICAgICAgbW00CisgICAgICAgIHBvciAgICAgICAgIG1tNywgICAgICAgIG1tNgorCisgICAgICAgIHBvciAgICAgICAgIG1tMCwgICAgICAgIG1tMQorICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIGFicyhxMy1xMikgPiBsaW1pdCB8fCBhYnMocDMtcDIpID4gbGltaXQgfHxhYnMocDItcDEpID4gbGltaXQgfHwgYWJzKHEyLXExKSA+IGxpbWl0CisKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEKKworICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTM9bW03PXAwCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwIC0gcDEKKworICAgICAgICBwc3VidXNiICAgICBtbTUsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMSAtIHAwCisgICAgICAgIHBvciAgICAgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1wMCkKKworICAgICAgICBtb3ZxICAgICAgICB0MCwgICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGFicyhwMS1wMCkKKyAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgc3JjdAorCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tNAorICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTA9bWFzaworCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIFtyZHgrMTZdICAgICAgICAgICAgICAgICAgICA7IG1tNT1xMAorICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBbcmR4KzI0XSAgICAgICAgICAgICAgICAgICAgOyBtbTc9cTEKKworICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTY9cTAKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtcTEKKworICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMS1xMAorICAgICAgICBwb3IgICAgICAgICBtbTcsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTEtcTApCisKKyAgICAgICAgbW92cSAgICAgICAgdDEsICAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBhYnMocTEtcTApCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNywgICAgICAgIG1tNAorCisgICAgICAgIHBvciAgICAgICAgIG1tMCwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IG1hc2sKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMQorICAgICAgICBwc3VidXNiICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMS09cDEKKyAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEtPXExCisgICAgICAgIHBvciAgICAgICAgIG1tNSwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKKyAgICAgICAgcGFuZCAgICAgICAgbW01LCAgICAgICAgW0dMT0JBTCh0ZmUpXSAgICAgICAgICAgICAgIDsgc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybworICAgICAgICBwc3JsdyAgICAgICBtbTUsICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoMikgO2JsaW1pdCAgICAgICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JkeF0gICAgICAgICAgICAgICAgICAgICAgIDtibGltaXQKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0xPW1tMz1wMAorCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tNz1tbTY9cTAKKyAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDAtcTAKKworICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMC1wMAorICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTAtcDApCisgICAgICAgIHBhZGR1c2IgICAgIG1tMSwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMC1wMCkqMgorICAgICAgICBwYWRkdXNiICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBibGltaXQKKyAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICAgICAgbW0wOyAgICAgICAgICAgICAgICAgICAgICAgIDsgbWFzaworCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMAorICAgICAgICBwY21wZXFiICAgICBtbTEsICAgICAgICBtbTAKKworICAgICAgICA7IGNhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDQpIDt0aHJlc2ggICAgICAgICAgICA7IGdldCB0aHJlc2gKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JkeF0KKyAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICB0MCAgICAgICAgICAgICAgOyBnZXQgYWJzIChxMSAtIHEwKQorICAgICAgICBwc3VidXNiICAgICBtbTQsICAgICAgICBtbTcKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICB0MSAgICAgICAgICAgICAgOyBnZXQgYWJzIChwMSAtIHAwKQorICAgICAgICBwc3VidXNiICAgICBtbTMsICAgICAgICBtbTcKKworICAgICAgICBwb3IgICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2ggfHwgYWJzKHAxIC0gcDApID4gdGhyZXNoCisgICAgICAgIHBjbXBlcWIgICAgIG1tNCwgICAgICAgIG1tMAorCisgICAgICAgIHBjbXBlcWIgICAgIG1tMCwgICAgICAgIG1tMAorICAgICAgICBweG9yICAgICAgICBtbTQsICAgICAgICBtbTAKKworCisKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgc3JjdAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIFtyZHhdICAgICAgICAgICA7IHAxCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIFtyZHgrMjRdICAgICAgICA7IHExCisKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgW3JkeCs4XSAgICAgICAgIDsgcDAKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JkeCsxNl0gICAgICAgIDsgcTAKKworICAgICAgICBweG9yICAgICAgICBtbTIsICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKworICAgICAgICBwc3Vic2IgICAgICBtbTIsICAgICAgICBtbTcgICAgICAgICAgICAgOyBwMSAtIHExCisgICAgICAgIHBhbmQgICAgICAgIG1tMiwgICAgICAgIG1tNCAgICAgICAgICAgICA7IGhpZ2ggdmFyIG1hc2sgKGh2bSkocDEgLSBxMSkKKworICAgICAgICBweG9yICAgICAgICBtbTYsICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTAgICAgICAgICAgICAgOyBxMAorICAgICAgICBwc3Vic2IgICAgICBtbTAsICAgICAgICBtbTYgICAgICAgICAgICAgOyBxMCAtIHAwCisKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCAgICAgICAgbW0wICAgICAgICAgICAgIDsgMSAqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKQorICAgICAgICBwYWRkc2IgICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICAgICAgOyAyICogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpCisKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCAgICAgICAgbW0wICAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKQorICAgICAgICBwYW5kICAgICAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMQorICAgICAgICBwYWRkc2IgICAgICBtbTEsICAgICAgICBbR0xPQkFMKHQ0KV0gICAgICA7IDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQKKworICAgICAgICBwYWRkc2IgICAgICBtbTIsICAgICAgICBbR0xPQkFMKHQzKV0gICAgICA7IDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDMKKyAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgbW0wICAgICAgICAgIDsKKworICAgICAgICBweG9yICAgICAgICBtbTUsICAgICAgICBtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgOworCisgICAgICAgIHB1bnBja2hidyAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgIDsKKyAgICAgICAgcHNyYXcgICAgICAgbW0wLCAgICAgICAgMTEgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JhdyAgICAgICBtbTUsICAgICAgICAxMQorICAgICAgICBwYWNrc3N3YiAgICBtbTAsICAgICAgICBtbTUKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICA7ICAoMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgMykgPj4gMzsKKworICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAgICAgICAgICAgIDsgMAorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgIDsgYWJjZGVmZ2gKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgICAgICBtbTEgICAgICAgICAgIDsgZTBmMGcwaDAKKyAgICAgICAgcHNyYXcgICAgICAgbW0wLCAgICAgICAgMTEgICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKKworICAgICAgICBweG9yICAgICAgICBtbTEsICAgICAgICBtbTEgICAgICAgICAgIDsgMAorICAgICAgICBwdW5wY2toYncgICBtbTEsICAgICAgICBtbTUgICAgICAgICAgIDsgYTBiMGMwZDAKKworICAgICAgICBwc3JhdyAgICAgICBtbTEsICAgICAgICAxMSAgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTAgICAgICAgICAgICAgIDsgc2F2ZSByZXN1bHRzCisKKyAgICAgICAgcGFja3Nzd2IgICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgICA7ICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyA0KSA+PjMKKyAgICAgICAgcGFkZHN3ICAgICAgbW01LCAgICAgICAgW0dMT0JBTChvbmVzKV0KKworICAgICAgICBwYWRkc3cgICAgICBtbTEsICAgICAgICBbR0xPQkFMKG9uZXMpXQorICAgICAgICBwc3JhdyAgICAgICBtbTUsICAgICAgICAxICAgICAgICAgICAgICAgICA7IHBhcnRpYWwgc2hpZnRlZCBvbmUgbW9yZSB0aW1lIGZvciAybmQgdGFwCisKKyAgICAgICAgcHNyYXcgICAgICAgbW0xLCAgICAgICAgMSAgICAgICAgICAgICAgICAgOyBwYXJ0aWFsIHNoaWZ0ZWQgb25lIG1vcmUgdGltZSBmb3IgMm5kIHRhcAorICAgICAgICBwYWNrc3N3YiAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgIDsgKDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQpID4+NAorCisgICAgICAgIHBhbmRuICAgICAgIG1tNCwgICAgICAgIG1tNSAgICAgICAgICAgICA7IGhpZ2ggZWRnZSB2YXJpYW5jZSBhZGRpdGl2ZQorCisgICAgICAgIHBhZGRzYiAgICAgIG1tNiwgICAgICAgIG1tMiAgICAgICAgICAgICA7IHAwKz0gcDAgYWRkCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IHVub2Zmc2V0CisKKyAgICAgICAgOyBtbTY9cDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmR4XSAgICAgICAgICAgOyBwMQorICAgICAgICBweG9yICAgICAgICBtbTEsICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyByZW9mZnNldAorCisgICAgICAgIHBhZGRzYiAgICAgIG1tMSwgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOyBwMSs9IHAxIGFkZAorICAgICAgICBweG9yICAgICAgICBtbTEsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgIDsgdW5vZmZzZXQKKyAgICAgICAgOyBtbTYgPSBwMCBtbTEgPSBwMQorCisgICAgICAgIHBzdWJzYiAgICAgIG1tMywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOyBxMC09IHEwIGFkZAorICAgICAgICBweG9yICAgICAgICBtbTMsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgIDsgdW5vZmZzZXQKKworICAgICAgICA7IG1tMyA9IHEwCisgICAgICAgIHBzdWJzYiAgICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOyBxMS09IHExIGFkZAorICAgICAgICBweG9yICAgICAgICBtbTcsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgIDsgdW5vZmZzZXQKKyAgICAgICAgOyBtbTcgPSBxMQorCisgICAgICAgIDsgdHJhbnBvc2UgYW5kIHdyaXRlIGJhY2sKKyAgICAgICAgOyBtbTEgPSAgICA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorICAgICAgICA7IG1tNiA9ICAgIDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzCisgICAgICAgIDsgbW0zID0gICAgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKKyAgICAgICAgOyBtbTcgPSAgICA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNQorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMSAgICAgICAgICAgICA7IDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICAgICAgIHB1bnBja2xidyAgIG1tMiwgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMzIDMyIDIzIDIyIDEzIDEyIDAzIDAyCisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0zICAgICAgICAgICAgIDsgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKKyAgICAgICAgcHVucGNraGJ3ICAgbW0xLCAgICAgICAgbW02ICAgICAgICAgICAgIDsgNzMgNzIgNjMgNjIgNTMgNTIgNDMgNDIKKworICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICBtbTcgICAgICAgICAgICAgOyAzNSAzNCAyNSAyNCAxNSAxNCAwNSAwNAorICAgICAgICBwdW5wY2toYncgICBtbTMsICAgICAgICBtbTcgICAgICAgICAgICAgOyA3NSA3NCA2NSA2NCA1NSA1NCA0NSA0NAorCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tMiAgICAgICAgICAgICA7IDMzIDMyIDIzIDIyIDEzIDEyIDAzIDAyCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tNCAgICAgICAgICAgICA7IDE1IDE0IDEzIDEyIDA1IDA0IDAzIDAyCisKKyAgICAgICAgcHVucGNraHdkICAgbW02LCAgICAgICAgbW00ICAgICAgICAgICAgIDsgMzUgMzQgMzMgMzIgMjUgMjQgMjMgMjIKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0xICAgICAgICAgICAgIDsgNzMgNzIgNjMgNjIgNTMgNTIgNDMgNDIKKworICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTMgICAgICAgICAgICAgOyA1NSA1NCA1MyA1MiA0NSA0NCA0MyA0MgorICAgICAgICBwdW5wY2tod2QgICBtbTUsICAgICAgICBtbTMgICAgICAgICAgICAgOyA3NSA3NCA3MyA3MiA2NSA2NCA2MyA2MgorCisKKyAgICAgICAgOyBtbTIgPSAxNSAxNCAxMyAxMiAwNSAwNCAwMyAwMgorICAgICAgICA7IG1tNiA9IDM1IDM0IDMzIDMyIDI1IDI0IDIzIDIyCisgICAgICAgIDsgbW01ID0gNTUgNTQgNTMgNTIgNDUgNDQgNDMgNDIKKyAgICAgICAgOyBtbTEgPSA3NSA3NCA3MyA3MiA2NSA2NCA2MyA2MgorCisKKworICAgICAgICBtb3ZkICAgICAgICBbcnNpK3JheCo0KzJdLCBtbTIKKyAgICAgICAgcHNybHEgICAgICAgbW0yLCAgICAgICAgMzIKKworICAgICAgICBtb3ZkICAgICAgICBbcmRpK3JheCo0KzJdLCBtbTIKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaStyYXgqMisyXSwgbW02CisKKyAgICAgICAgcHNybHEgICAgICAgbW02LCAgICAgICAgMzIKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaStyYXgrMl0sbW02CisKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaSsyXSwgICAgbW0xCisgICAgICAgIHBzcmxxICAgICAgIG1tMSwgICAgICAgIDMyCisKKyAgICAgICAgbW92ZCAgICAgICAgW3JkaSsyXSwgICAgbW0xCisgICAgICAgIG5lZyAgICAgICAgIHJheAorCisgICAgICAgIG1vdmQgICAgICAgIFtyZGkrcmF4KzJdLG1tNQorICAgICAgICBwc3JscSAgICAgICBtbTUsICAgICAgICAzMgorCisgICAgICAgIG1vdmQgICAgICAgIFtyZGkrcmF4KjIrMl0sIG1tNQorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjhdCisgICAgICAgIGRlYyAgICAgICAgIHJjeAorICAgICAgICBqbnogICAgICAgICAubmV4dDhfdgorCisgICAgYWRkIHJzcCwgNjQKKyAgICBwb3AgcnNwCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgKnRocmVzaCwKKzsgICAgaW50IGNvdW50Cis7KQorZ2xvYmFsIHN5bSh2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KSBQUklWQVRFCitzeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgc3ViICAgICAgICAgIHJzcCwgMzIgICAgICA7IHJlc2VydmUgMzIgYnl0ZXMKKyAgICAlZGVmaW5lIHQwICAgW3JzcCArIDBdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MFs4XTsKKyAgICAlZGVmaW5lIHQxICAgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVs4XTsKKworICAgICAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg1KSA7Y291bnQKKy5uZXh0OF9tYmg6CisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDMpIDtsaW1pdAorICAgICAgICBtb3ZxICAgICAgICBtbTcsIFtyZHhdCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgcnNpICAgICAgICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgcmF4CisKKyAgICAgICAgOyBjYWxjdWxhdGUgYnJlYWtvdXQgY29uZGl0aW9ucworICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtyZGkrMipyYXhdICAgICAgOyBxMworCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JzaSsyKnJheF0gICAgICA7IHEyCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7IHEyCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgbW0yICAgICAgICAgICAgICA7IHEyLT1xMworICAgICAgICBwc3VidXNiICAgICBtbTIsIG1tNiAgICAgICAgICAgICAgOyBxMy09cTIKKyAgICAgICAgcG9yICAgICAgICAgbW0xLCBtbTIgICAgICAgICAgICAgIDsgYWJzKHEzLXEyKQorICAgICAgICBwc3VidXNiICAgICBtbTEsIG1tNworCisKKyAgICAgICAgOyBtbTEgPSBhYnMocTMtcTIpLCBtbTYgPXEyLCBtbTcgPSBsaW1pdAorICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2krcmF4XSAgICAgICAgOyBxMQorICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBxMQorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNiAgICAgICAgICAgICAgOyBxMS09cTIKKyAgICAgICAgcHN1YnVzYiAgICAgbW02LCBtbTMgICAgICAgICAgICAgIDsgcTItPXExCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgICA7IGFicyhxMi1xMSkKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKKyAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAorCisKKyAgICAgICAgOyBtbTEgPSBtYXNrLCAgICAgIG1tMz1xMSwgbW03ID0gbGltaXQKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2ldICAgICAgICAgICAgOyBxMAorICAgICAgICBtb3ZxICAgICAgICBtbTAsIG1tNCAgICAgICAgICAgICAgOyBxMAorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBxMC09cTEKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcTEtPXEwCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgICA7IGFicyhxMC1xMSkKKyAgICAgICAgbW92cSAgICAgICAgdDAsIG1tNCAgICAgICAgICAgICAgIDsgc2F2ZSB0byB0MAorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNworICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00CisKKworICAgICAgICA7IG1tMSA9IG1hc2ssIG1tMD1xMCwgIG1tNyA9IGxpbWl0LCB0MCA9IGFicyhxMC1xMSkKKworICAgICAgICBuZWcgICAgICAgICByYXggICAgICAgICAgICAgICAgICAgOyBuZWdhdGUgcGl0Y2ggdG8gZGVhbCB3aXRoIGFib3ZlIGJvcmRlcgorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgW3JzaSs0KnJheF0gICAgICA7IHAzCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgW3JkaSs0KnJheF0gICAgICA7IHAyCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgbW00ICAgICAgICAgICAgICA7IHAyCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW0yICAgICAgICAgICAgICA7IHAyLT1wMworICAgICAgICBwc3VidXNiICAgICBtbTIsIG1tNSAgICAgICAgICAgICAgOyBwMy09cDIKKyAgICAgICAgcG9yICAgICAgICAgbW00LCBtbTIgICAgICAgICAgICAgIDsgYWJzKHAzIC0gcDIpCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03CisgICAgICAgIHBvciAgICAgICAgbW0xLCBtbTQKKyAgICAgICAgOyBtbTEgPSBtYXNrLCBtbTA9cTAsICBtbTcgPSBsaW1pdCwgdDAgPSBhYnMocTAtcTEpCisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpKzIqcmF4XSAgICAgIDsgcDEKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTQgICAgICAgICAgICAgIDsgcDEKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTUgICAgICAgICAgICAgIDsgcDEtPXAyCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgbW0zICAgICAgICAgICAgICA7IHAyLT1wMQorICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tNSAgICAgICAgICAgICAgOyBhYnMocDIgLSBwMSkKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKKyAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICA7IHAxCisKKworICAgICAgICA7IG1tMSA9IG1hc2ssIG1tMD1xMCwgIG1tNyA9IGxpbWl0LCB0MCA9IGFicyhxMC1xMSkKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2krcmF4XSAgICAgICAgOyBwMAorICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBwMAorICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBwMC09cDEKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTUgICAgICAgICAgICAgIDsgcDEtPXAwCisgICAgICAgIHBvciAgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgICA7IGFicyhwMSAtIHAwKQorICAgICAgICBtb3ZxICAgICAgICB0MSwgbW00ICAgICAgICAgICAgICAgOyBzYXZlIHRvIHQxCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03CisgICAgICAgIHBvciAgICAgICAgbW0xLCBtbTQKKyAgICAgICAgOyBtbTEgPSBtYXNrLCBtbTA9cTAsICBtbTcgPSBsaW1pdCwgdDAgPSBhYnMocTAtcTEpIHQxID0gYWJzKHAxLXAwKQorICAgICAgICA7IG1tNSA9IHAwCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgW3JkaV0gICAgICAgICAgICA7IHExCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgICA7IHExCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW0yICAgICAgICAgICAgICA7IHExLT1wMQorICAgICAgICBwc3VidXNiICAgICBtbTIsIG1tNCAgICAgICAgICAgICAgOyBwMS09cTEKKyAgICAgICAgcG9yICAgICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgIDsgYWJzKHAxLXExKQorICAgICAgICBwYW5kICAgICAgICBtbTIsIFtHTE9CQUwodGZlKV0gICAgOyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCisgICAgICAgIHBzcmx3ICAgICAgIG1tMiwgMSAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgorCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IHAwCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHEwCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgbW0zICAgICAgICAgICAgICA7IHAwLT1xMAorICAgICAgICBwc3VidXNiICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOyBxMC09cDAKKyAgICAgICAgcG9yICAgICAgICAgbW01LCBtbTMgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCisgICAgICAgIHBhZGR1c2IgICAgIG1tNSwgbW01ICAgICAgICAgICAgICA7IGFicyhwMC1xMCkqMgorICAgICAgICBwYWRkdXNiICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCisKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMikgO2JsaW1pdCAgICAgICAgICAgOyBnZXQgYmxpbWl0CisgICAgICAgIG1vdnEgICAgICAgIG1tNywgW3JkeF0gICAgICAgICAgICA7IGJsaW1pdAorCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgbW03ICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gYmxpbWl0CisgICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgbW01CisgICAgICAgIHB4b3IgICAgICAgIG1tNSwgICAgbW01CisgICAgICAgIHBjbXBlcWIgICAgIG1tMSwgICAgbW01ICAgICAgICAgICA7IG1hc2sgbW0xCisKKyAgICAgICAgOyBtbTEgPSBtYXNrLCBtbTA9cTAsICBtbTcgPSBibGltaXQsIHQwID0gYWJzKHEwLXExKSB0MSA9IGFicyhwMS1wMCkKKyAgICAgICAgOyBtbTYgPSBwMCwKKworICAgICAgICA7IGNhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCBhcmcoNCkgO3RocmVzaCAgICAgICAgICAgOyBnZXQgdGhyZXNoCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgW3JkeF0gICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgdDAgICAgICAgICAgICAgICA7IGdldCBhYnMgKHExIC0gcTApCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgdDEgICAgICAgICAgICAgICA7IGdldCBhYnMgKHAxIC0gcDApCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW03CisgICAgICAgIHBhZGRiICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgICA7IGFicyhxMSAtIHEwKSA+IHRocmVzaCB8fCBhYnMocDEgLSBwMCkgPiB0aHJlc2gKKworICAgICAgICBwY21wZXFiICAgICBtbTQsICAgICAgICBtbTUKKworICAgICAgICBwY21wZXFiICAgICBtbTUsICAgICAgICBtbTUKKyAgICAgICAgcHhvciAgICAgICAgbW00LCAgICAgICAgbW01CisKKworCisgICAgICAgIDsgbW0xID0gbWFzaywgbW0wPXEwLCAgbW03ID0gdGhyZXNoLCB0MCA9IGFicyhxMC1xMSkgdDEgPSBhYnMocDEtcDApCisgICAgICAgIDsgbW02ID0gcDAsIG1tND1oZXYKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcnNpKzIqcmF4XSAgICAgIDsgcDEKKyAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmRpXSAgICAgICAgICAgIDsgcTEKKyAgICAgICAgcHhvciAgICAgICAgbW0yLCBbR0xPQkFMKHQ4MCldICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICBtbTcsIFtHTE9CQUwodDgwKV0gICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHBzdWJzYiAgICAgIG1tMiwgbW03ICAgICAgICAgICAgICA7IHAxIC0gcTEKKworICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0gICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcTAKKyAgICAgICAgcHN1YnNiICAgICAgbW0wLCBtbTYgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyAxICogKHEwIC0gcDApICsgKHAxIC0gcTEpCisgICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IDIgKiAocTAgLSBwMCkKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKSArIChwMSAtIHExKQorICAgICAgICBwYW5kICAgICAgICBtbTEsIG1tMiAgICAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisKKyAgICAgICAgOyBtbTEgPSB2cDhfZmlsdGVyLCBtbTQ9aGV2LCBtbTY9cHMwLCBtbTM9cXMwCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0xICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIKKyAgICAgICAgcGFuZCAgICAgICAgbW0yLCBtbTQ7ICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9maWx0ZXIgJiBoZXYKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgOworICAgICAgICBwYWRkc2IgICAgICBtbTUsICAgICAgICBbR0xPQkFMKHQzKV07CisKKyAgICAgICAgcHhvciAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICAgIDsgMAorICAgICAgICBweG9yICAgICAgICBtbTcsIG1tNyAgICAgICAgICAgICAgOyAwCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTUgICAgICAgICAgICAgIDsgZTBmMGcwaDAKKyAgICAgICAgcHNyYXcgICAgICAgbW0wLCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIHB1bnBja2hidyAgIG1tNywgbW01ICAgICAgICAgICAgICA7IGEwYjBjMGQwCisgICAgICAgIHBzcmF3ICAgICAgIG1tNywgMTEgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMworICAgICAgICBwYWNrc3N3YiAgICBtbTAsIG1tNyAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PTM7CisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgIDsgRmlsdGVyMgorCisgICAgICAgIHBhZGRzYiAgICAgIG1tMiwgW0dMT0JBTCh0NCldICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyICsgNCkKKyAgICAgICAgcHhvciAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICAgIDsgMAorICAgICAgICBweG9yICAgICAgICBtbTcsIG1tNyAgICAgICAgICAgICAgOyAwCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTIgICAgICAgICAgICAgIDsgZTBmMGcwaDAKKyAgICAgICAgcHNyYXcgICAgICAgbW0wLCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIHB1bnBja2hidyAgIG1tNywgbW0yICAgICAgICAgICAgICA7IGEwYjBjMGQwCisgICAgICAgIHBzcmF3ICAgICAgIG1tNywgMTEgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMworICAgICAgICBwYWNrc3N3YiAgICBtbTAsIG1tNyAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PTM7CisKKyAgICAgICAgOyBtbTA9IGZpbHRlcjIgbW0xID0gdnA4X2ZpbHRlciwgIG1tMyA9cXMwIG1tNT1zIG1tNCA9aGV2IG1tNj1wczAKKyAgICAgICAgcHN1YnNiICAgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcXMwID1xczAgLSBmaWx0ZXIxCisgICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IHBzMCA9cHMwICsgRml0bGVyMgorCisgICAgICAgIDsgbW0xPXZwOF9maWx0ZXIsIG1tMz1xczAsIG1tNCA9aGV2IG1tNj1wczAKKyAgICAgICAgOyB2cDhfZmlsdGVyICY9IH5oZXY7CisgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9maWx0ZXI7CisgICAgICAgIHBhbmRuICAgICAgIG1tNCwgbW0xICAgICAgICAgICAgICA7IHZwOF9maWx0ZXImPX5oZXYKKworCisgICAgICAgIDsgbW0zPXFzMCwgbW00PWZpbHRlcjIsIG1tNj1wczAKKworICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDI3KT4+Nyk7CisgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB1KTsKKyAgICAgICAgOyAqb3EwID0gc14weDgwOworICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgdSk7CisgICAgICAgIDsgKm9wMCA9IHNeMHg4MDsKKyAgICAgICAgcHhvciAgICAgICAgbW0wLCBtbTAKKworICAgICAgICBweG9yICAgICAgICBtbTEsIG1tMQorICAgICAgICBweG9yICAgICAgICBtbTIsIG1tMgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNAorICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNAorICAgICAgICBwbXVsaHcgICAgICBtbTEsIFtHTE9CQUwoczI3KV0KKyAgICAgICAgcG11bGh3ICAgICAgbW0yLCBbR0xPQkFMKHMyNyldCisgICAgICAgIHBhZGR3ICAgICAgIG1tMSwgW0dMT0JBTChzNjMpXQorICAgICAgICBwYWRkdyAgICAgICBtbTIsIFtHTE9CQUwoczYzKV0KKyAgICAgICAgcHNyYXcgICAgICAgbW0xLCA3CisgICAgICAgIHBzcmF3ICAgICAgIG1tMiwgNworICAgICAgICBwYWNrc3N3YiAgICBtbTEsIG1tMgorCisgICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0xCisgICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0xCisKKyAgICAgICAgcHhvciAgICAgICAgbW0zLCBbR0xPQkFMKHQ4MCldCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQorICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JheF0sIG1tNgorICAgICAgICBtb3ZxICAgICAgICBbcnNpXSwgICAgIG1tMworCisgICAgICAgIDsgcm91Z2hseSAyLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDE4KT4+Nyk7CisgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB1KTsKKyAgICAgICAgOyAqb3ExID0gc14weDgwOworICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxICsgdSk7CisgICAgICAgIDsgKm9wMSA9IHNeMHg4MDsKKyAgICAgICAgcHhvciAgICAgICAgbW0xLCBtbTEKKyAgICAgICAgcHhvciAgICAgICAgbW0yLCBtbTIKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTQKKyAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTQKKyAgICAgICAgcG11bGh3ICAgICAgbW0xLCBbR0xPQkFMKHMxOCldCisgICAgICAgIHBtdWxodyAgICAgIG1tMiwgW0dMT0JBTChzMTgpXQorICAgICAgICBwYWRkdyAgICAgICBtbTEsIFtHTE9CQUwoczYzKV0KKyAgICAgICAgcGFkZHcgICAgICAgbW0yLCBbR0xPQkFMKHM2MyldCisgICAgICAgIHBzcmF3ICAgICAgIG1tMSwgNworICAgICAgICBwc3JhdyAgICAgICBtbTIsIDcKKyAgICAgICAgcGFja3Nzd2IgICAgbW0xLCBtbTIKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZGldCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JzaStyYXgqMl0gICAgICAgOyBwMQorCisgICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQorICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0KKworICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tMQorICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMQorCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQorICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sIG1tMworICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JheCoyXSwgbW02CisKKyAgICAgICAgOyByb3VnaGx5IDEvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5CisgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogOSk+PjcpOworICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSk7CisgICAgICAgIDsgKm9xMiA9IHNeMHg4MDsKKyAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMiArIHUpOworICAgICAgICA7ICpvcDIgPSBzXjB4ODA7CisgICAgICAgIHB4b3IgICAgICAgIG1tMSwgbW0xCisgICAgICAgIHB4b3IgICAgICAgIG1tMiwgbW0yCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW00CisgICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW00CisgICAgICAgIHBtdWxodyAgICAgIG1tMSwgW0dMT0JBTChzOSldCisgICAgICAgIHBtdWxodyAgICAgIG1tMiwgW0dMT0JBTChzOSldCisgICAgICAgIHBhZGR3ICAgICAgIG1tMSwgW0dMT0JBTChzNjMpXQorICAgICAgICBwYWRkdyAgICAgICBtbTIsIFtHTE9CQUwoczYzKV0KKyAgICAgICAgcHNyYXcgICAgICAgbW0xLCA3CisgICAgICAgIHBzcmF3ICAgICAgIG1tMiwgNworICAgICAgICBwYWNrc3N3YiAgICBtbTEsIG1tMgorCisKKyAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmRpK3JheCo0XQorICAgICAgICBuZWcgICAgICAgICByYXgKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBbcmRpK3JheCAgXQorCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQorICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KKworICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tMQorICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMQorCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQorICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyYXggIF0sIG1tMworICAgICAgICBuZWcgICAgICAgICByYXgKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyYXgqNF0sIG1tNgorCis7RUFSTFlfQlJFQUtfT1VUOgorICAgICAgICBuZWcgICAgICAgICByYXgKKyAgICAgICAgYWRkICAgICAgICAgcnNpLDgKKyAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgIGpueiAgICAgICAgIC5uZXh0OF9tYmgKKworICAgIGFkZCByc3AsIDMyCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teAorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfcGl4ZWxfc3RlcCwKKzsgICAgY29uc3QgY2hhciAqYmxpbWl0LAorOyAgICBjb25zdCBjaGFyICpsaW1pdCwKKzsgICAgY29uc3QgY2hhciAqdGhyZXNoLAorOyAgICBpbnQgY291bnQKKzspCitnbG9iYWwgc3ltKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KSBQUklWQVRFCitzeW0odnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgICByc3AsIDk2ICAgICAgOyByZXNlcnZlIDk2IGJ5dGVzCisgICAgJWRlZmluZSB0MCAgIFtyc3AgKyAwXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDBbOF07CisgICAgJWRlZmluZSB0MSAgIFtyc3AgKyAxNl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbOF07CisgICAgJWRlZmluZSBzcmN0IFtyc3AgKyAzMl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgc3JjdFs2NF07CisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXgqNCAtIDRdCisKKyAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7Y291bnQKKy5uZXh0OF9tYnY6CisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisKKyAgICAgICAgO3RyYW5zcG9zZQorICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBbcmRpKzIqcmF4XSAgICAgICAgICAgICAgICAgOyA3NyA3NiA3NSA3NCA3MyA3MiA3MSA3MAorICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcnNpKzIqcmF4XSAgICAgICAgICAgICAgICAgOyA2NyA2NiA2NSA2NCA2MyA2MiA2MSA2MAorCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDc3IDc2IDc1IDc0IDczIDcyIDcxIDcwCisgICAgICAgIHB1bnBja2hidyAgIG1tNywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDc3IDY3IDc2IDY2IDc1IDY1IDc0IDY0CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW02LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzMgNjMgNzIgNjIgNzEgNjEgNzAgNjAKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzaStyYXhdICAgICAgICAgICAgICAgICAgIDsgNTcgNTYgNTUgNTQgNTMgNTIgNTEgNTAKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcnNpXSAgICAgICAgICAgICAgICAgICAgICAgOyA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorCisgICAgICAgIHB1bnBja2hidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDU3IDQ3IDU2IDQ2IDU1IDQ1IDU0IDQ0CisgICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDUzIDQzIDUyIDQyIDUxIDQxIDUwIDQwCisKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTcgNDcgNTYgNDYgNTUgNDUgNTQgNDQKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgNzYgNjYgNTYgNDYKKworICAgICAgICBwdW5wY2tsd2QgICBtbTMsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSA3NCA2NCA1NCA0NAorICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAorCisgICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDcyIDYyIDUyIDQyCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDYxIDUxIDQxIDcwIDYwIDUwIDQwCisKKyAgICAgICAgbmVnICAgICAgICAgcmF4CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JzaStyYXhdICAgICAgICAgICAgICAgICAgIDsgMzcgMzYgMzUgMzQgMzMgMzIgMzEgMzAKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgW3JzaStyYXgqMl0gICAgICAgICAgICAgICAgIDsgMjcgMjYgMjUgMjQgMjMgMjIgMjEgMjAKKworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMAorICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAzNyAyNyAzNiAzNiAzNSAyNSAzNCAyNAorCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IDMzIDIzIDMyIDIyIDMxIDIxIDMwIDIwCisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JzaStyYXgqNF07ICAgICAgICAgICAgICAgIDsgMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNraGJ3ICAgbW03LCAgICAgICAgW3JkaStyYXgqNF0gICAgICAgICAgICAgICAgIDsgMTcgMDcgMTYgMDYgMTUgMDUgMTQgMDQKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAxNyAwNyAxNiAwNiAxNSAwNSAxNCAwNAorICAgICAgICBwdW5wY2tod2QgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyAzNyAyNyAxNyAwNyAzNiAyNiAxNiAwNgorCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDM1IDI1IDE1IDA1IDM0IDI0IDE0IDA0CisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IDM3IDI3IDE3IDA3IDM2IDI2IDE2IDA2CisKKyAgICAgICAgcHVucGNraGRxICAgbW03LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgMzcgMjcgMTcgMDcgID0gcTMKKyAgICAgICAgcHVucGNrbGRxICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzYgNjYgNTYgNDYgMzYgMjYgMTYgMDYgID0gcTIKKworICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBzcmN0CisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkeCs1Nl0sICAgbW03CisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHEyLXEzCisKKworICAgICAgICBtb3ZxICAgICAgICBbcmR4KzQ4XSwgICBtbTYKKyAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTMtcTIKKworICAgICAgICBwb3IgICAgICAgICBtbTcsICAgICAgICBtbTU7ICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTc9YWJzIChxMy1xMikKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzUgMjUgMTUgMDUgMzQgMjQgMTQgMDQKKworICAgICAgICBwdW5wY2toZHEgICBtbTUsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNSA9IHExCisgICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IDc0IDY0IDU0IDQ0IDM0IDI0IDE1IDA0ID0gcTAKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNSA9IHExCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IHExLXEyCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTItcTEKKyAgICAgICAgcG9yICAgICAgICAgbW02LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW02PWFicyhxMi1xMSkKKworICAgICAgICBtb3ZxICAgICAgICBbcmR4KzQwXSwgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHExCisgICAgICAgIG1vdnEgICAgICAgIFtyZHgrMzJdLCAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcTAKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBbcnNpK3JheCo0XSAgICAgICAgICAgICAgICAgOyAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorICAgICAgICBwdW5wY2tsYncgICBtbTMsICAgICAgICBbcmRpK3JheCo0XSAgICAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCisKKyAgICAgICAgcHVucGNraHdkICAgbW0zLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKKworICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMCAgPXAzCisgICAgICAgIHB1bnBja2hkcSAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxICA9cDIKKworICAgICAgICBtb3ZxICAgICAgICBbcmR4XSwgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHAzCisgICAgICAgIG1vdnEgICAgICAgIFtyZHgrOF0sICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcDIKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSAgPXAyCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IHAyLXAzCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDMtcDIKKyAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0wPWFicyhwMy1wMikKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMgorICAgICAgICBwdW5wY2tsZHEgICBtbTIsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMiA9IHAxCisKKyAgICAgICAgcHVucGNraGRxICAgbW0zLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMgPSBwMAorICAgICAgICBtb3ZxICAgICAgICBbcmR4KzI0XSwgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHAwCisKKyAgICAgICAgbW92cSAgICAgICAgW3JkeCsxNl0sICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBwMQorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSBwMQorCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMiwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxLXAyCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAyLXAxCisKKyAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0xPWFicyhwMi1wMSkKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDMpIDtsaW1pdAorCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyZHhdICAgICAgICAgICAgICAgICAgICAgICA7IG1tNCA9IGxpbWl0CisgICAgICAgIHBzdWJ1c2IgICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMy1xMikgPiBsaW1pdAorCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMCwgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMy1wMikgPiBsaW1pdAorICAgICAgICBwc3VidXNiICAgICBtbTEsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDItcDEpID4gbGltaXQKKworICAgICAgICBwc3VidXNiICAgICBtbTYsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTItcTEpID4gbGltaXQKKyAgICAgICAgcG9yICAgICAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgb3IKKworICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTMtcTIpID4gbGltaXQgfHwgYWJzKHAzLXAyKSA+IGxpbWl0IHx8YWJzKHAyLXAxKSA+IGxpbWl0IHx8IGFicyhxMi1xMSkgPiBsaW1pdAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxCisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0zPW1tNz1wMAorICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMCAtIHAxCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBwMAorICAgICAgICBwb3IgICAgICAgICBtbTUsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcDApCisKKyAgICAgICAgbW92cSAgICAgICAgdDAsICAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBhYnMocDEtcDApCisgICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIHNyY3QKKworICAgICAgICBwc3VidXNiICAgICBtbTUsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSBhYnMocDEtcDApID4gbGltaXQKKyAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0wPW1hc2sKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcmR4KzMyXSAgICAgICAgICAgICAgICAgICAgOyBtbTU9cTAKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JkeCs0MF0gICAgICAgICAgICAgICAgICAgIDsgbW03PXExCisKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW02PXEwCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHExCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwLXExCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtcTAKKyAgICAgICAgcG9yICAgICAgICAgbW03LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHExLXEwKQorCisgICAgICAgIG1vdnEgICAgICAgIHQxLCAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgYWJzKHExLXEwKQorICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTc9YWJzKHExLXEwKT4gbGltaXQKKworICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBtYXNrCisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtPXAxCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxLT1xMQorICAgICAgICBwb3IgICAgICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpCisgICAgICAgIHBhbmQgICAgICAgIG1tNSwgICAgICAgIFtHTE9CQUwodGZlKV0gICAgICAgICAgICAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KKyAgICAgICAgcHNybHcgICAgICAgbW01LCAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKS8yCisKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDIpIDtibGltaXQgICAgICAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyZHhdICAgICAgICAgICAgICAgICAgICAgICA7YmxpbWl0CisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMT1tbTM9cDAKKworICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTc9bW02PXEwCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwLXEwCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtcDAKKyAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHEwLXAwKQorICAgICAgICBwYWRkdXNiICAgICBtbTEsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTAtcDApKjIKKyAgICAgICAgcGFkZHVzYiAgICAgbW0xLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgorCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gYmxpbWl0CisgICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgICAgIG1tMDsgICAgICAgICAgICAgICAgICAgICAgICA7IG1hc2sKKworICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAKKyAgICAgICAgcGNtcGVxYiAgICAgbW0xLCAgICAgICAgbW0wCisKKyAgICAgICAgOyBjYWxjdWxhdGUgaGlnaCBlZGdlIHZhcmlhbmNlCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZyg0KSA7dGhyZXNoICAgICAgICAgICAgOyBnZXQgdGhyZXNoCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIFtyZHhdCisgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgdDAgICAgICAgICAgICAgIDsgZ2V0IGFicyAocTEgLSBxMCkKKyAgICAgICAgcHN1YnVzYiAgICAgbW00LCAgICAgICAgbW03ICAgICAgICAgICAgIDsgYWJzKHExIC0gcTApID4gdGhyZXNoCisKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgdDEgICAgICAgICAgICAgIDsgZ2V0IGFicyAocDEgLSBwMCkKKyAgICAgICAgcHN1YnVzYiAgICAgbW0zLCAgICAgICAgbW03ICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApPiB0aHJlc2gKKworICAgICAgICBwb3IgICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2ggfHwgYWJzKHAxIC0gcDApID4gdGhyZXNoCisgICAgICAgIHBjbXBlcWIgICAgIG1tNCwgICAgICAgIG1tMAorCisgICAgICAgIHBjbXBlcWIgICAgIG1tMCwgICAgICAgIG1tMAorICAgICAgICBweG9yICAgICAgICBtbTQsICAgICAgICBtbTAKKworCisKKworICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycworICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBzcmN0CisKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcmR4KzE2XSAgICAgICAgIDsgcDEKKyAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmR4KzQwXSAgICAgICAgIDsgcTEKKyAgICAgICAgcHhvciAgICAgICAgbW0yLCBbR0xPQkFMKHQ4MCldICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICBtbTcsIFtHTE9CQUwodDgwKV0gICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHBzdWJzYiAgICAgIG1tMiwgbW03ICAgICAgICAgICAgICA7IHAxIC0gcTEKKworICAgICAgICBtb3ZxICAgICAgICBtbTYsIFtyZHgrMjRdICAgICAgICAgOyBwMAorICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyZHgrMzJdICAgICAgICAgOyBxMAorICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0gICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxMAorICAgICAgICBwc3Vic2IgICAgICBtbTAsIG1tNiAgICAgICAgICAgICAgOyBxMCAtIHAwCisgICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IDEgKiAocTAgLSBwMCkgKyAocDEgLSBxMSkKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgIDsgMiAqIChxMCAtIHAwKQorICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyAzICogKHEwIC0gcDApICsgKHAxIC0gcTEpCisgICAgICAgIHBhbmQgICAgICAgbW0xLCBtbTIgICAgICAgICAgIDsgbWFzayBmaWx0ZXIgdmFsdWVzIHdlIGRvbid0IGNhcmUgYWJvdXQKKworICAgICAgICA7IG1tMSA9IHZwOF9maWx0ZXIsIG1tND1oZXYsIG1tNj1wczAsIG1tMz1xczAKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTEgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlcgorICAgICAgICBwYW5kICAgICAgICBtbTIsIG1tNDsgICAgICAgICAgICAgOyBGaWx0ZXIyID0gdnA4X2ZpbHRlciAmIGhldgorCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICA7CisgICAgICAgIHBhZGRzYiAgICAgIG1tNSwgICAgICAgIFtHTE9CQUwodDMpXTsKKworICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgOyAwCisgICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICA7IDAKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNSAgICAgICAgICAgICAgOyBlMGYwZzBoMAorICAgICAgICBwc3JhdyAgICAgICBtbTAsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKKyAgICAgICAgcHVucGNraGJ3ICAgbW03LCBtbTUgICAgICAgICAgICAgIDsgYTBiMGMwZDAKKyAgICAgICAgcHNyYXcgICAgICAgbW03LCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIHBhY2tzc3diICAgIG1tMCwgbW03ICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49MzsKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgOyBGaWx0ZXIyCisKKyAgICAgICAgcGFkZHNiICAgICAgbW0yLCBbR0xPQkFMKHQ0KV0gICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyA0KQorICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgOyAwCisgICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICA7IDAKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tMiAgICAgICAgICAgICAgOyBlMGYwZzBoMAorICAgICAgICBwc3JhdyAgICAgICBtbTAsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKKyAgICAgICAgcHVucGNraGJ3ICAgbW03LCBtbTIgICAgICAgICAgICAgIDsgYTBiMGMwZDAKKyAgICAgICAgcHNyYXcgICAgICAgbW03LCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIHBhY2tzc3diICAgIG1tMCwgbW03ICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49MzsKKworICAgICAgICA7IG1tMD0gZmlsdGVyMiBtbTEgPSB2cDhfZmlsdGVyLCAgbW0zID1xczAgbW01PXMgbW00ID1oZXYgbW02PXBzMAorICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxczAgPXFzMCAtIGZpbHRlcjEKKyAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgcHMwID1wczAgKyBGaXRsZXIyCisKKyAgICAgICAgOyBtbTE9dnA4X2ZpbHRlciwgbW0zPXFzMCwgbW00ID1oZXYgbW02PXBzMAorICAgICAgICA7IHZwOF9maWx0ZXIgJj0gfmhldjsKKyAgICAgICAgOyBGaWx0ZXIyID0gdnA4X2ZpbHRlcjsKKyAgICAgICAgcGFuZG4gICAgICAgbW00LCBtbTEgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciY9fmhldgorCisKKyAgICAgICAgOyBtbTM9cXMwLCBtbTQ9ZmlsdGVyMiwgbW02PXBzMAorCisgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpPj43KTsKKyAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpOworICAgICAgICA7ICpvcTAgPSBzXjB4ODA7CisgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KTsKKyAgICAgICAgOyAqb3AwID0gc14weDgwOworICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMAorCisgICAgICAgIHB4b3IgICAgICAgIG1tMSwgbW0xCisgICAgICAgIHB4b3IgICAgICAgIG1tMiwgbW0yCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW00CisgICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW00CisgICAgICAgIHBtdWxodyAgICAgIG1tMSwgW0dMT0JBTChzMjcpXQorICAgICAgICBwbXVsaHcgICAgICBtbTIsIFtHTE9CQUwoczI3KV0KKyAgICAgICAgcGFkZHcgICAgICAgbW0xLCBbR0xPQkFMKHM2MyldCisgICAgICAgIHBhZGR3ICAgICAgIG1tMiwgW0dMT0JBTChzNjMpXQorICAgICAgICBwc3JhdyAgICAgICBtbTEsIDcKKyAgICAgICAgcHNyYXcgICAgICAgbW0yLCA3CisgICAgICAgIHBhY2tzc3diICAgIG1tMSwgbW0yCisKKyAgICAgICAgcHN1YnNiICAgICAgbW0zLCBtbTEKKyAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTEKKworICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KKyAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCisgICAgICAgIG1vdnEgICAgICAgIFtyZHgrMjRdLCBtbTYKKyAgICAgICAgbW92cSAgICAgICAgW3JkeCszMl0sIG1tMworCisgICAgICAgIDsgcm91Z2hseSAyLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQorICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDE4KT4+Nyk7CisgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB1KTsKKyAgICAgICAgOyAqb3ExID0gc14weDgwOworICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxICsgdSk7CisgICAgICAgIDsgKm9wMSA9IHNeMHg4MDsKKyAgICAgICAgcHhvciAgICAgICAgbW0xLCBtbTEKKyAgICAgICAgcHhvciAgICAgICAgbW0yLCBtbTIKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTQKKyAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTQKKyAgICAgICAgcG11bGh3ICAgICAgbW0xLCBbR0xPQkFMKHMxOCldCisgICAgICAgIHBtdWxodyAgICAgIG1tMiwgW0dMT0JBTChzMTgpXQorICAgICAgICBwYWRkdyAgICAgICBtbTEsIFtHTE9CQUwoczYzKV0KKyAgICAgICAgcGFkZHcgICAgICAgbW0yLCBbR0xPQkFMKHM2MyldCisgICAgICAgIHBzcmF3ICAgICAgIG1tMSwgNworICAgICAgICBwc3JhdyAgICAgICBtbTIsIDcKKyAgICAgICAgcGFja3Nzd2IgICAgbW0xLCBtbTIKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZHggKyA0MF0KKyAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmR4ICsgMTZdICAgICAgIDsgcDEKKyAgICAgICAgcHhvciAgICAgICAgbW0zLCBbR0xPQkFMKHQ4MCldCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQorCisgICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0xCisgICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0xCisKKyAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCisgICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQorICAgICAgICBtb3ZxICAgICAgICBbcmR4ICsgNDBdLCBtbTMKKyAgICAgICAgbW92cSAgICAgICAgW3JkeCArIDE2XSwgbW02CisKKyAgICAgICAgOyByb3VnaGx5IDEvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5CisgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogOSk+PjcpOworICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSk7CisgICAgICAgIDsgKm9xMiA9IHNeMHg4MDsKKyAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMiArIHUpOworICAgICAgICA7ICpvcDIgPSBzXjB4ODA7CisgICAgICAgIHB4b3IgICAgICAgIG1tMSwgbW0xCisgICAgICAgIHB4b3IgICAgICAgIG1tMiwgbW0yCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW00CisgICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW00CisgICAgICAgIHBtdWxodyAgICAgIG1tMSwgW0dMT0JBTChzOSldCisgICAgICAgIHBtdWxodyAgICAgIG1tMiwgW0dMT0JBTChzOSldCisgICAgICAgIHBhZGR3ICAgICAgIG1tMSwgW0dMT0JBTChzNjMpXQorICAgICAgICBwYWRkdyAgICAgICBtbTIsIFtHTE9CQUwoczYzKV0KKyAgICAgICAgcHNyYXcgICAgICAgbW0xLCA3CisgICAgICAgIHBzcmF3ICAgICAgIG1tMiwgNworICAgICAgICBwYWNrc3N3YiAgICBtbTEsIG1tMgorCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JkeCsgOF0KKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBbcmR4KzQ4XQorCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQorICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KKworICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tMQorICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMQorCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICAgICAgICA7IG1tNiA9IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxCisgICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXSAgICAgICAgICA7IG1tMyA9IDc2IDY2IDU2IDQ2IDM2IDI2IDE1IDA2CisKKyAgICAgICAgOyB0cmFucG9zZSBhbmQgd3JpdGUgYmFjaworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtyZHhdICAgICAgICAgICAgICAgOyBtbTAgPSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgIG1tMCAgICAgICAgICAgICAgICAgOyBtbTAgPSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW02ICAgICAgICAgICAgICAgICA7IG1tMCA9IDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCisgICAgICAgIHB1bnBja2hidyAgIG1tMSwgICAgbW02ICAgICAgICAgICAgICAgICA7IG1tMyA9IDcxIDcwIDYxIDYwIDUxIDUwIDQxIDQwCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBbcmR4KzE2XSAgICAgICAgICAgIDsgbW0yID0gNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW0zID0gNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKworICAgICAgICBwdW5wY2tsYncgICBtbTIsICAgIFtyZHgrMjRdICAgICAgICAgICAgOyBtbTIgPSAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgorICAgICAgICBwdW5wY2toYncgICBtbTYsICAgIFtyZHgrMjRdICAgICAgICAgICAgOyBtbTMgPSA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MgorCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0wICAgICAgICAgICAgICAgICA7IG1tNSA9IDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICA7IG1tMCA9IDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW01ID0gMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTEgICAgICAgICAgICAgICAgIDsgbW00ID0gNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAKKworICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAgICAgOyBtbTEgPSA1MyA1MiA1MSA1MCA0MyA0MiA0MSA0MAorICAgICAgICBwdW5wY2tod2QgICBtbTQsICAgIG1tNiAgICAgICAgICAgICAgICAgOyBtbTQgPSA3MyA3MiA3MSA3MCA2MyA2MiA2MSA2MAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgW3JkeCszMl0gICAgICAgICAgICA7IG1tMiA9IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0CisgICAgICAgIHB1bnBja2xidyAgIG1tMiwgICAgW3JkeCs0MF0gICAgICAgICAgICA7IG1tMiA9IDM1IDM0IDI1IDI0IDE1IDE0IDA1IDA0CisKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBtbTMgICAgICAgICAgICAgICAgIDsgbW02ID0gNzYgNjYgNTYgNDYgMzYgMjYgMTUgMDYKKyAgICAgICAgcHVucGNrbGJ3ICAgbW02LCAgICBbcmR4KzU2XSAgICAgICAgICAgIDsgbW02ID0gMzcgMzYgMjcgMjYgMTcgMTYgMDcgMDYKKworICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgIG1tMiAgICAgICAgICAgICAgICAgOyBtbTcgPSAzNSAzNCAyNSAyNCAxNSAxNCAwNSAwNAorICAgICAgICBwdW5wY2tsd2QgICBtbTIsICAgIG1tNiAgICAgICAgICAgICAgICAgOyBtbTIgPSAxNyAxNiAxNSAxNCAwNyAwNiAwNSAwNAorCisgICAgICAgIHB1bnBja2h3ZCAgIG1tNywgICAgbW02ICAgICAgICAgICAgICAgICA7IG1tNyA9IDM3IDM2IDM1IDM0IDI3IDI2IDI1IDI0CisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgbW0wICAgICAgICAgICAgICAgICA7IG1tNiA9IDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisKKyAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW0wID0gMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNraGRxICAgbW02LCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW02ID0gMTcgMTYgMTUgMTQgMTMgMTIgMTEgMTAKKworICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JheCo0XSwgbW0wICAgICAgICAgICAgOyB3cml0ZSBvdXQKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyYXgqNF0sIG1tNiAgICAgICAgICAgIDsgd3JpdGUgb3V0CisKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBtbTUgICAgICAgICAgICAgICAgIDsgbW0wID0gMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAKKyAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgIDsgbW0wID0gMjcgMjYgMjUgMjQgMjMgMjIgMjAgMjAKKworICAgICAgICBwdW5wY2toZHEgICBtbTUsICAgIG1tNyAgICAgICAgICAgICAgICAgOyBtbTUgPSAzNyAzNiAzNSAzNCAzMyAzMiAzMSAzMAorICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JheCoyXSwgbW0wICAgICAgICAgICAgOyB3cml0ZSBvdXQKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JheCoyXSwgbW01ICAgICAgICAgICAgOyB3cml0ZSBvdXQKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBbcmR4KzMyXSAgICAgICAgICAgIDsgbW0yID0gNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKKworICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIFtyZHgrNDBdICAgICAgICAgICAgOyBtbTIgPSA3NSA3NCA2NSA2NCA1NCA1NCA0NSA0NAorICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIFtyZHgrNTZdICAgICAgICAgICAgOyBtbTMgPSA3NyA3NiA2NyA2NiA1NyA1NiA0NyA0NgorCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0yICAgICAgICAgICAgICAgICA7IG1tNSA9IDc1IDc0IDY1IDY0IDU0IDU0IDQ1IDQ0CisgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgbW0zICAgICAgICAgICAgICAgICA7IG1tMiA9IDU3IDU2IDU1IDU0IDQ3IDQ2IDQ1IDQ0CisKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgIDsgbW01ID0gNzcgNzYgNzUgNzQgNjcgNjYgNjUgNjQKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBtbTEgICAgICAgICAgICAgICAgIDsgbW0wPSAgNTMgNTIgNTEgNTAgNDMgNDIgNDEgNDAKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tNCAgICAgICAgICAgICAgICAgOyBtbTQgPSA3MyA3MiA3MSA3MCA2MyA2MiA2MSA2MAorICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgIG1tMiAgICAgICAgICAgICAgICAgOyBtbTAgPSA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorCisgICAgICAgIHB1bnBja2hkcSAgIG1tMSwgICAgbW0yICAgICAgICAgICAgICAgICA7IG1tMSA9IDU3IDU2IDU1IDU0IDUzIDUyIDUxIDUwCisgICAgICAgIG1vdnEgICAgICAgIFtyc2ldLCAgbW0wICAgICAgICAgICAgICAgICA7IHdyaXRlIG91dAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgbW0xICAgICAgICAgICAgICAgICA7IHdyaXRlIG91dAorICAgICAgICBuZWcgICAgICAgICByYXgKKworICAgICAgICBwdW5wY2tsZHEgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgOyBtbTMgPSA2NyA2NiA2NSA2NCA2MyA2MiA2MSA2MAorICAgICAgICBwdW5wY2toZHEgICBtbTQsICAgIG1tNSAgICAgICAgICAgICAgICAgOyBtbTQgPSA3NyA3NiA3NSA3NCA3MyA3MiA3MSA2MAorCisgICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4KjJdLCBtbTMKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyYXgqMl0sIG1tNAorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjhdCisgICAgICAgIGRlYyAgICAgICAgIHJjeAorCisgICAgICAgIGpueiAgICAgICAgIC5uZXh0OF9tYnYKKworICAgIGFkZCByc3AsIDk2CisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgKmJsaW1pdAorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14KSBQUklWQVRFCitzeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDMKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworCisgICAgICAgIG1vdiAgICAgICAgIHJjeCwgMiAgICAgICAgICAgICAgICA7IGNvdW50CisubmV4dHM4X2g6CisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDIpIDtibGltaXQgICAgICAgICAgIDsgZ2V0IGJsaW1pdAorICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZHhdICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgcnNpICAgICAgICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgcmF4CisgICAgICAgIG5lZyAgICAgICAgIHJheAorCisgICAgICAgIDsgY2FsY3VsYXRlIG1hc2sKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcnNpKzIqcmF4XSAgICAgIDsgcDEKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmRpXSAgICAgICAgICAgIDsgcTEKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTEKKyAgICAgICAgbW92cSAgICAgICAgbW03LCBtbTAKKyAgICAgICAgbW92cSAgICAgICAgbW00LCBtbTAKKyAgICAgICAgcHN1YnVzYiAgICAgbW0wLCBtbTEgICAgICAgICAgICAgIDsgcTEtPXAxCisgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgbW00ICAgICAgICAgICAgICA7IHAxLT1xMQorICAgICAgICBwb3IgICAgICAgICBtbTEsIG1tMCAgICAgICAgICAgICAgOyBhYnMocDEtcTEpCisgICAgICAgIHBhbmQgICAgICAgIG1tMSwgW0dMT0JBTCh0ZmUpXSAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KKyAgICAgICAgcHNybHcgICAgICAgbW0xLCAxICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKS8yCisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCBbcnNpK3JheF0gICAgICAgIDsgcDAKKyAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpXSAgICAgICAgICAgIDsgcTAKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBtbTQgICAgICAgICAgICAgIDsgcTAKKyAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgcDAKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsgcDAtPXEwCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW02ICAgICAgICAgICAgICA7IHEwLT1wMAorICAgICAgICBwb3IgICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKKyAgICAgICAgcGFkZHVzYiAgICAgbW01LCBtbTUgICAgICAgICAgICAgIDsgYWJzKHAwLXEwKSoyCisgICAgICAgIHBhZGR1c2IgICAgIG1tNSwgbW0xICAgICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIKKworICAgICAgICBwc3VidXNiICAgICBtbTUsIG1tMyAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gYmxpbWl0CisgICAgICAgIHB4b3IgICAgICAgIG1tMywgbW0zCisgICAgICAgIHBjbXBlcWIgICAgIG1tNSwgbW0zCisKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgcHhvciAgICAgICAgbW0yLCBbR0xPQkFMKHQ4MCldICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICBtbTcsIFtHTE9CQUwodDgwKV0gICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHBzdWJzYiAgICAgIG1tMiwgbW03ICAgICAgICAgICAgICA7IHAxIC0gcTEKKworICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0gICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcTAKKyAgICAgICAgcHN1YnNiICAgICAgbW0wLCBtbTYgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyBwMSAtIHExICsgMSAqIChxMCAtIHAwKQorICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyBwMSAtIHExICsgMiAqIChxMCAtIHAwKQorICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyBwMSAtIHExICsgMyAqIChxMCAtIHAwKQorICAgICAgICBwYW5kICAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisgICAgICAgIDsgZG8gKyA0IHNpZGUKKyAgICAgICAgcGFkZHNiICAgICAgbW01LCBbR0xPQkFMKHQ0KV0gICAgIDsgMyogKHEwIC0gcDApICsgKHAxIC0gcTEpICsgNAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgbW01ICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycworICAgICAgICBwc2xsdyAgICAgICBtbTAsIDggICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDgKKyAgICAgICAgcHNyYXcgICAgICAgbW0wLCAzICAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQorICAgICAgICBwc3JsdyAgICAgICBtbTAsIDgKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBtbTUgICAgICAgICAgICAgIDsgZ2V0IGEgY29weSBvZiBmaWx0ZXJzCisgICAgICAgIHBzcmF3ICAgICAgIG1tMSwgMTEgICAgICAgICAgICAgICA7IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEKKyAgICAgICAgcHNsbHcgICAgICAgbW0xLCA4ICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4IHRvIHB1dCBpdCBiYWNrCisKKyAgICAgICAgcG9yICAgICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgIDsgcHV0IHRoZSB0d28gdG9nZXRoZXIgdG8gZ2V0IHJlc3VsdAorCisgICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHEwLT0gcTAgYWRkCisgICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXSAgICA7IHVub2Zmc2V0CisgICAgICAgIG1vdnEgICAgICAgIFtyc2ldLCBtbTMgICAgICAgICAgICA7IHdyaXRlIGJhY2sKKworCisgICAgICAgIDsgbm93IGRvICszIHNpZGUKKyAgICAgICAgcHN1YnNiICAgICAgbW01LCBbR0xPQkFMKHQxcyldICAgICA7ICszIGluc3RlYWQgb2YgKzQKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsIG1tNSAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKKyAgICAgICAgcHNsbHcgICAgICAgbW0wLCA4ICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4CisgICAgICAgIHBzcmF3ICAgICAgIG1tMCwgMyAgICAgICAgICAgICAgICA7IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEKKyAgICAgICAgcHNybHcgICAgICAgbW0wLCA4CisgICAgICAgIHBzcmF3ICAgICAgIG1tNSwgMTEgICAgICAgICAgICAgICA7IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEKKyAgICAgICAgcHNsbHcgICAgICAgbW01LCA4ICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4IHRvIHB1dCBpdCBiYWNrCisgICAgICAgIHBvciAgICAgICAgIG1tMCwgbW01ICAgICAgICAgICAgICA7IHB1dCB0aGUgdHdvIHRvZ2V0aGVyIHRvIGdldCByZXN1bHQKKworCisgICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0wICAgICAgICAgICAgICA7IHAwKz0gcDAgYWRkCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICA7IHVub2Zmc2V0CisgICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4XSwgbW02ICAgICAgICA7IHdyaXRlIGJhY2sKKworICAgICAgICBhZGQgICAgICAgICByc2ksOAorICAgICAgICBuZWcgICAgICAgICByYXgKKyAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgIGpueiAgICAgICAgIC5uZXh0czhfaAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgKmJsaW1pdAorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCkgUFJJVkFURQorc3ltKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgICByc3AsIDMyICAgICAgOyByZXNlcnZlIDMyIGJ5dGVzCisgICAgJWRlZmluZSB0MCAgIFtyc3AgKyAwXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDBbOF07CisgICAgJWRlZmluZSB0MSAgIFtyc3AgKyAxNl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbOF07CisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxfc3RlcCAgICAgOyBkZXN0aW5hdGlvbiBwaXRjaD8KKworICAgICAgICBsZWEgICAgICAgICByc2ksIFtyc2kgKyByYXgqNC0gMl07ICA7CisgICAgICAgIG1vdiAgICAgICAgIHJjeCwgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBjb3VudAorLm5leHRzOF92OgorCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdOworICAgICAgICBtb3ZkICAgICAgICBtbTAsICAgICAgICBbcmRpICsgcmF4ICogMl0gICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggNzMgNzIgNzEgNzAKKworICAgICAgICBtb3ZkICAgICAgICBtbTYsICAgICAgICBbcnNpICsgcmF4ICogMl0gICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggNjMgNjIgNjEgNjAKKyAgICAgICAgcHVucGNrbGJ3ICAgbW02LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDcyIDYyIDcxIDYxIDcwIDYwCisKKyAgICAgICAgbW92ZCAgICAgICAgbW0wLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDUzIDUyIDUxIDUwCisgICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCA0MyA0MiA0MSA0MAorCisgICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAKKworICAgICAgICBwdW5wY2tsd2QgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgNzAgNjAgNTAgNDAKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDcyIDYyIDUyIDQyCisKKyAgICAgICAgbmVnICAgICAgICAgcmF4CisKKyAgICAgICAgbW92ZCAgICAgICAgbW03LCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDMzIDMyIDMxIDMwCisgICAgICAgIG1vdmQgICAgICAgIG1tNiwgICAgICAgIFtyc2kgKyByYXggKiAyXSAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAyMyAyMiAyMSAyMAorCisgICAgICAgIHB1bnBja2xidyAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAorICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBbcmRpICsgcmF4ICogNF0gICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMTMgMTIgMTEgMTAKKworICAgICAgICBtb3ZkICAgICAgICBtbTAsICAgICAgICBbcnNpICsgcmF4ICogNF0gICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAorCisgICAgICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMgorICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKKworICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAgICAgICAgPSBwMQorICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIKKworICAgICAgICBwdW5wY2toZHEgICBtbTEsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgICAgICAgPSBwMAorICAgICAgICBwdW5wY2tsZHEgICBtbTIsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIgICAgICAgPSBxMAorCisgICAgICAgIHB1bnBja2hkcSAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyAgICAgICA9IHExCisKKworICAgICAgICA7IGNhbGN1bGF0ZSBtYXNrCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMQorICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEKKyAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHExLT1wMQorICAgICAgICBwc3VidXNiICAgICBtbTYsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEtPXExCisgICAgICAgIHBvciAgICAgICAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpCisgICAgICAgIHBhbmQgICAgICAgIG1tNiwgICAgICAgIFtHTE9CQUwodGZlKV0gICAgICAgICAgICAgICAgICAgOyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCisgICAgICAgIHBzcmx3ICAgICAgIG1tNiwgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDAKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwCisKKyAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwLT1xMAorICAgICAgICBwc3VidXNiICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtPXAwCisKKyAgICAgICAgcG9yICAgICAgICAgbW01LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorICAgICAgICBwYWRkdXNiICAgICBtbTUsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAwLXEwKSoyCisgICAgICAgIHBhZGR1c2IgICAgIG1tNSwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCisKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDIpIDtibGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ2V0IGJsaW1pdAorICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBbcmR4XQorCisgICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gYmxpbWl0CisgICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgIG1tNworICAgICAgICBwY21wZXFiICAgICBtbTUsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW01ID0gbWFzaworCisgICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCisgICAgICAgIG1vdnEgICAgICAgIHQwLCAgICAgICAgIG1tMAorICAgICAgICBtb3ZxICAgICAgICB0MSwgICAgICAgICBtbTMKKworICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgICAgICAgICAgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICBtbTMsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgICAgICAgICAgICAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworCisgICAgICAgIHBzdWJzYiAgICAgIG1tMCwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMSAtIHExCisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMAorCisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMAorICAgICAgICBweG9yICAgICAgICBtbTYsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworCisgICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBvZmZzZXRlZCA7IHEwCisKKyAgICAgICAgcHN1YnNiICAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwIC0gcDAKKyAgICAgICAgcGFkZHNiICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAxICogKHEwIC0gcDApCisKKyAgICAgICAgcGFkZHNiICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAyICogKHEwIC0gcDApCisgICAgICAgIHBhZGRzYiAgICAgIG1tMCwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMSAtIHExICsgMyAqIChxMCAtIHAwKQorCisgICAgICAgIHBhbmQgICAgICAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisgICAgICAgIHBhZGRzYiAgICAgIG1tNSwgICAgICAgIFtHTE9CQUwodDQpXSAgICAgICAgICAgICAgICAgICAgOyAgMyogKHEwIC0gcDApICsgKHAxIC0gcTEpICsgNAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKKyAgICAgICAgcHNsbHcgICAgICAgbW0wLCAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0IGxlZnQgOAorICAgICAgICBwc3JhdyAgICAgICBtbTAsICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQorICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgICAgICA4CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycworICAgICAgICBwc3JhdyAgICAgICBtbTcsICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQorICAgICAgICBwc2xsdyAgICAgICBtbTcsICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4IHRvIHB1dCBpdCBiYWNrCisKKyAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHB1dCB0aGUgdHdvIHRvZ2V0aGVyIHRvIGdldCByZXN1bHQKKworICAgICAgICBwc3Vic2IgICAgICBtbTMsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtPSBxMHN6IGFkZAorICAgICAgICBweG9yICAgICAgICBtbTMsICAgICAgICBbR0xPQkFMKHQ4MCldICAgICAgICAgICAgICAgICAgIDsgdW5vZmZzZXQKKworICAgICAgICA7IG5vdyBkbyArMyBzaWRlCisgICAgICAgIHBzdWJzYiAgICAgIG1tNSwgW0dMT0JBTCh0MXMpXSAgICAgICAgICAgICAgICAgICAgICAgICAgOyArMyBpbnN0ZWFkIG9mICs0CisKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycworICAgICAgICBwc2xsdyAgICAgICBtbTAsIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4CisgICAgICAgIHBzcmF3ICAgICAgIG1tMCwgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCisgICAgICAgIHBzcmx3ICAgICAgIG1tMCwgOAorCisgICAgICAgIHBzcmF3ICAgICAgIG1tNSwgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCisgICAgICAgIHBzbGx3ICAgICAgIG1tNSwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDggdG8gcHV0IGl0IGJhY2sKKyAgICAgICAgcG9yICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHB1dCB0aGUgdHdvIHRvZ2V0aGVyIHRvIGdldCByZXN1bHQKKworICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKKyAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgICAgICAgICAgICAgICAgICAgICAgICA7IHVub2Zmc2V0CisKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICB0MAorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICB0MQorCisgICAgICAgIDsgbW0wID0gNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKyAgICAgICAgOyBtbTYgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQorICAgICAgICA7IG1tMyA9IDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICAgICAgIDsgbW00ID0gNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKKyAgICAgICAgOyB0cmFuc3Bvc2UgYmFjayB0byB3cml0ZSBvdXQKKworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAorCisgICAgICAgIHB1bnBja2hidyAgIG1tMSwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDcwIDYxIDYwIDUxIDUwIDQxIDQwCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAKKworICAgICAgICBwdW5wY2toYncgICBtbTMsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MgorICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAorCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisgICAgICAgIHB1bnBja2h3ZCAgIG1tNiwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwCisKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaStyYXgqNF0sIG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgd3JpdGUgMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNrbHdkICAgbW0xLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTMgNTIgNTEgNTAgNDMgNDIgNDEgNDAKKworICAgICAgICBwc3JscSAgICAgICBtbTAsICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAxMyAxMiAxMSAxMAorICAgICAgICBwdW5wY2tod2QgICBtbTUsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA3MiA3MSA3MCA2MyA2MiA2MSA2MAorCisgICAgICAgIG1vdmQgICAgICAgIFtyZGkrcmF4KjRdLCBtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIDEzIDEyIDExIDEwCisgICAgICAgIG1vdmQgICAgICAgIFtyc2krcmF4KjJdLCBtbTYgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIDIzIDIyIDIxIDIwCisKKyAgICAgICAgcHNybHEgICAgICAgbW02LCAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMzIgMzEgMzAKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaV0sICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgd3JpdGUgNDMgNDIgNDEgNDAKKworICAgICAgICBtb3ZkICAgICAgICBbcnNpICsgcmF4XSwgbW02ICAgICAgICAgICAgICAgICAgICAgICAgOyB3cml0ZSAzMyAzMiAzMSAzMAorICAgICAgICBuZWcgICAgICAgICByYXgKKworICAgICAgICBtb3ZkICAgICAgICBbcnNpICsgcmF4KjJdLCBtbTUgICAgICAgICAgICAgICAgICAgICAgOyB3cml0ZSA2MyA2MiA2MSA2MAorICAgICAgICBwc3JscSAgICAgICBtbTEsICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOyA1MyA1MiA1MSA1MAorCisgICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIG91dCA1MyA1MiA1MSA1MAorICAgICAgICBwc3JscSAgICAgICBtbTUsICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA3MiA3MSA3MAorCisgICAgICAgIG1vdmQgICAgICAgIFtyZGkgKyByYXgqMl0sIG1tNSAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIDczIDcyIDcxIDcwCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqOF0gICAgICAgICAgICAgICAgIDsgbmV4dCA4CisKKyAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgIGpueiAgICAgICAgIC5uZXh0czhfdgorCisgICAgYWRkIHJzcCwgMzIKKyAgICBwb3AgcnNwCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKworO3ZvaWQgZmFzdF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlc19tbXgodW5zaWduZWQgY2hhciAqeV9wdHIsCis7ICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKKzt7Cis7Cis7Cis7ICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9tbXgoeV9wdHIrNCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSxsZmktPmxpbSxsZmktPnRociwyKTsKKzsgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCh5X3B0cis4LCB5X3N0cmlkZSwgbGZpLT5mbGltLGxmaS0+bGltLGxmaS0+dGhyLDIpOworOyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14KHlfcHRyKzEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLGxmaS0+bGltLGxmaS0+dGhyLDIpOworO30KKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDE2Cit0ZmU6CisgICAgdGltZXMgOCBkYiAweGZlCithbGlnbiAxNgordDgwOgorICAgIHRpbWVzIDggZGIgMHg4MAorYWxpZ24gMTYKK3QxczoKKyAgICB0aW1lcyA4IGRiIDB4MDEKK2FsaWduIDE2Cit0MzoKKyAgICB0aW1lcyA4IGRiIDB4MDMKK2FsaWduIDE2Cit0NDoKKyAgICB0aW1lcyA4IGRiIDB4MDQKK2FsaWduIDE2CitvbmVzOgorICAgIHRpbWVzIDQgZHcgMHgwMDAxCithbGlnbiAxNgorczI3OgorICAgIHRpbWVzIDQgZHcgMHgxYjAwCithbGlnbiAxNgorczE4OgorICAgIHRpbWVzIDQgZHcgMHgxMjAwCithbGlnbiAxNgorczk6CisgICAgdGltZXMgNCBkdyAweDA5MDAKK2FsaWduIDE2CitzNjM6CisgICAgdGltZXMgNCBkdyAweDAwM2YKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX3NzZTIuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfc3NlMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NzUzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX3NzZTIuYXNtCkBAIC0wLDAgKzEsMTY0MCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorJWRlZmluZSBfdDAgMAorJWRlZmluZSBfdDEgX3QwICsgMTYKKyVkZWZpbmUgX3AzIF90MSArIDE2CislZGVmaW5lIF9wMiBfcDMgKyAxNgorJWRlZmluZSBfcDEgX3AyICsgMTYKKyVkZWZpbmUgX3AwIF9wMSArIDE2CislZGVmaW5lIF9xMCBfcDAgKyAxNgorJWRlZmluZSBfcTEgX3EwICsgMTYKKyVkZWZpbmUgX3EyIF9xMSArIDE2CislZGVmaW5lIF9xMyBfcTIgKyAxNgorJWRlZmluZSBsZl92YXJfc2l6ZSAxNjAKKworOyBVc2Ugb2YgcG1heHViIGluc3RlYWQgb2YgcHN1YnVzYiB0byBjb21wdXRlIGZpbHRlciBtYXNrIHdhcyBzZWVuCis7IGluIGZmdnA4CisKKyVtYWNybyBMRkhfRklMVEVSX0FORF9IRVZfTUFTSyAxCislaWYgJTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkaSsyKnJheF0gICAgICAgOyBxMworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbcnNpKzIqcmF4XSAgICAgICA7IHEyCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtyc2krcmF4XSAgICAgICAgIDsgcTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgOyBxMAorICAgICAgICBuZWcgICAgICAgICByYXggICAgICAgICAgICAgICAgICAgICA7IG5lZ2F0ZSBwaXRjaCB0byBkZWFsIHdpdGggYWJvdmUgYm9yZGVyCislZWxzZQorICAgICAgICBtb3ZscHMgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4KjJdICAgICA7IHEzCisgICAgICAgIG1vdmxwcyAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtyc2kgKyByY3hdICAgICAgIDsgcTIKKyAgICAgICAgbW92bHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgOyBxMQorICAgICAgICBtb3ZscHMgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICBbcnNpICsgcmF4XSAgICAgICA7IHEwCisKKyAgICAgICAgbW92aHBzICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeCoyXQorICAgICAgICBtb3ZocHMgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbcmRpICsgcmN4XQorICAgICAgICBtb3ZocHMgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcmRpXQorICAgICAgICBtb3ZocHMgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICBbcmRpICsgcmF4XQorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIFtyc2kgKyByYXgqNF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICAgICAgW3JkaSArIHJheCo0XQorCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3EyXSwgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgc3RvcmUgcTIKKyAgICAgICAgbW92ZHFhICAgICAgW3JzcCtfcTFdLCAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBzdG9yZSBxMQorJWVuZGlmCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFtyZHhdICAgICAgICAgICAgIDtsaW1pdAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgcTIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBxMQorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcTItPXEzCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcTMtPXEyCisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBxMS09cTIKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBxMi09cTEKKworICAgICAgICBwb3IgICAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICA7IGFicyhxMi1xMSkKKyAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBhYnMocTMtcTIpCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBxMAorICAgICAgICBwbWF4dWIgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW00CisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBxMC09cTEKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBxMS09cTAKKworICAgICAgICBwb3IgICAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGFicyhxMC1xMSkKKyAgICAgICAgbW92ZHFhICAgICAgW3JzcCtfdDBdLCAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBzYXZlIHRvIHQwCisKKyAgICAgICAgcG1heHViICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNQorCislaWYgJTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JzaSs0KnJheF0gICAgICAgOyBwMworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcmRpKzQqcmF4XSAgICAgICA7IHAyCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIFtyc2krMipyYXhdICAgICAgIDsgcDEKKyVlbHNlCisgICAgICAgIG1vdmxwcyAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc2kgKyByYXhdICAgICAgIDsgcDMKKyAgICAgICAgbW92bHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgOyBwMgorICAgICAgICBtb3ZscHMgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4XSAgICAgICA7IHAxCisKKyAgICAgICAgbW92aHBzICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJheF0KKyAgICAgICAgbW92aHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JkaV0KKyAgICAgICAgbW92aHBzICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeF0KKworICAgICAgICBtb3ZkcWEgICAgICBbcnNwK19wMl0sICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IHN0b3JlIHAyCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3AxXSwgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgc3RvcmUgcDEKKyVlbmRpZgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgcDIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBwMQorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcDItPXAzCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgcDMtPXAyCisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBwMS09cDIKKyAgICAgICAgcG1heHViICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBhYnMocDMgLSBwMikKKworICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICA7IHAyLT1wMQorICAgICAgICBwbWF4dWIgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IGFicyhwMyAtIHAyKQorCisgICAgICAgIHBtYXh1YiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgYWJzKHAyIC0gcDEpCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcDEKKworICAgICAgICBwbWF4dWIgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGFicyhwMiAtIHAxKQorJWlmICUxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtyc2krcmF4XSAgICAgICAgIDsgcDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgOyBxMQorJWVsc2UKKyAgICAgICAgbW92bHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JzaSArIHJjeCoyXSAgICAgOyBwMAorICAgICAgICBtb3ZocHMgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcmRpICsgcmN4KjJdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIFtyc3ArX3ExXSAgICAgICAgICAgICAgICA7IHExCislZW5kaWYKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IHAwCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcDAtPXAxCisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBwMS09cDAKKworICAgICAgICBwb3IgICAgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IGFicyhwMSAtIHAwKQorICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgICAgICAgICBhcmcoMikgICAgICAgICAgICA7IGdldCBibGltaXQKKworICAgICAgICBtb3ZkcWEgICAgIFtyc3ArX3QxXSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICA7IHNhdmUgdG8gdDEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IHExCisgICAgICAgIHBtYXh1YiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTYKKworICAgICAgICBwc3VidXNiICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IHExLT1wMQorICAgICAgICBwc3VidXNiICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IHAxLT1xMQorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTcKKyAgICAgICAgcG9yICAgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBhYnMocDEtcTEpCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW3JkeF0gICAgICAgICAgICAgOyBibGltaXQKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICAgICAgYXJnKDQpICAgICAgICAgICAgOyBoZXYgZ2V0IHRocmVzaAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgcTAKKyAgICAgICAgcGFuZCAgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ZmUpXSAgICAgOyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBwMAorICAgICAgICBwc3JsdyAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgIDsgcDAtPXEwCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcTAtPXAwCisgICAgICAgIHBvciAgICAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCisKKyAgICAgICAgcGFkZHVzYiAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBhYnMocDAtcTApKjIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcnNwK190MF0gICAgICAgICAgICAgICAgOyBoZXYgZ2V0IGFicyAocTEgLSBxMCkKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgW3JzcCtfdDFdICAgICAgICAgICAgICAgIDsgZ2V0IGFicyAocDEgLSBwMCkKKworICAgICAgICBwYWRkdXNiICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICA7IGhldgorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBibGltaXQKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBoZXYKKworICAgICAgICBwc3VidXNiICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IGhldgorICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW01CisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tNworICAgICAgICBwYWRkYiAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGhldiBhYnMocTEgLSBxMCkgPiB0aHJlc2ggfHwgYWJzKHAxIC0gcDApID4gdGhyZXNoCisKKyAgICAgICAgcGNtcGVxYiAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBoZXYKKyAgICAgICAgcGNtcGVxYiAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBoZXYKKworICAgICAgICBwY21wZXFiICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICA7IG1hc2sgeG1tMQorICAgICAgICBweG9yICAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGhldgorJWVuZG1hY3JvCisKKyVtYWNybyBCX0ZJTFRFUiAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0KKyVpZiAlMSA9PSAwCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc3ArX3AxXSAgICAgICAgICAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFtyc3ArX3ExXSAgICAgICAgICAgICAgICA7IHExCislZWxpZiAlMSA9PSAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc2krMipyYXhdICAgICAgIDsgcDEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgOyBxMQorJWVsaWYgJTEgPT0gMgorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICBbcnNwK19wMV0gICAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIFtyc3ArX3AwXSAgICAgICAgIDsgcDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgW3JzcCtfcTBdICAgICAgICAgOyBxMAorICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBbcnNwK19xMV0gICAgICAgICA7IHExCislZW5kaWYKKworICAgICAgICBweG9yICAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisKKyAgICAgICAgcHN1YnNiICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgOyBwMSAtIHExCisgICAgICAgIHB4b3IgICAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworCisgICAgICAgIHBhbmQgICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgaGlnaCB2YXIgbWFzayAoaHZtKShwMSAtIHExKQorICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICA7IHEwCisgICAgICAgIHBzdWJzYiAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICA7IDEgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKKyAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgOyAyICogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpCisgICAgICAgIHBhZGRzYiAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKQorICAgICAgICBwYW5kICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMQorICAgICAgICBwYWRkc2IgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ0KV0gICAgICA7IDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQKKyAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0MyldICAgICAgOyAzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyAzCisKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBheGJ4Y3hkeAorICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IGV4ZnhneGh4CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgOyBleGZ4Z3hoeAorICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMworCisgICAgICAgIHB1bnBja2hidyAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgYXhieGN4ZHgKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKKworICAgICAgICBwYWNrc3N3YiAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgICA7ICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyAzKSA+PiAzOworICAgICAgICBwc3JhdyAgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMworCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgc2F2ZSByZXN1bHRzCisKKyAgICAgICAgcGFja3Nzd2IgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgOyAoMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNCkgPj4zCisKKyAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBwMCs9IHAwIGFkZAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwob25lcyldCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tMgorICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICA7IHBhcnRpYWwgc2hpZnRlZCBvbmUgbW9yZSB0aW1lIGZvciAybmQgdGFwCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDsgcGFydGlhbCBzaGlmdGVkIG9uZSBtb3JlIHRpbWUgZm9yIDJuZCB0YXAKKyAgICAgICAgcGFja3Nzd2IgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgOyAoMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNCkgPj40CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0KKworJWlmICUxID09IDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgW3JzcCtfcDFdICAgICAgICAgOyBwMQorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4KjJdCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgICAgIFtyZGkgKyByY3gqMl0KKyVlbGlmICUxID09IDEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgW3JzaSsyKnJheF0gICAgICAgOyBwMQorJWVsaWYgJTEgPT0gMgorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbcnNwK19wMV0gICAgICAgICA7IHAxCislZW5kaWYKKworICAgICAgICBwYW5kbiAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgICA7IGhpZ2ggZWRnZSB2YXJpYW5jZSBhZGRpdGl2ZQorICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IHVub2Zmc2V0CisKKyAgICAgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyByZW9mZnNldAorICAgICAgICBwc3Vic2IgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICA7IHEwLT0gcTAgYWRkCisKKyAgICAgICAgcGFkZHNiICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBwMSs9IHAxIGFkZAorICAgICAgICBweG9yICAgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IHVub2Zmc2V0CisKKyAgICAgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyB1bm9mZnNldAorICAgICAgICBwc3Vic2IgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IHExLT0gcTEgYWRkCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyB1bm9mZnNldAorJWlmICUxID09IDAKKyAgICAgICAgbW92cSAgICAgICAgW3JzaV0sICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBwMAorICAgICAgICBtb3ZocHMgICAgICBbcmRpXSwgICAgICAgICAgICAgICAgICB4bW02CisgICAgICAgIG1vdnEgICAgICAgIFtyc2kgKyByYXhdLCAgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgcDEKKyAgICAgICAgbW92aHBzICAgICAgW3JkaSArIHJheF0sICAgICAgICAgICAgeG1tMQorICAgICAgICBtb3ZxICAgICAgICBbcnNpICsgcmN4XSwgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IHEwCisgICAgICAgIG1vdmhwcyAgICAgIFtyZGkgKyByY3hdLCAgICAgICAgICAgIHhtbTMKKyAgICAgICAgbW92cSAgICAgICAgW3JzaSArIHJjeCoyXSwgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgOyBxMQorICAgICAgICBtb3ZocHMgICAgICBbcmRpICsgcmN4KjJdLCAgICAgICAgICB4bW03CislZWxpZiAlMSA9PSAxCisgICAgICAgIG1vdmRxYSAgICAgIFtyc2krcmF4XSwgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgd3JpdGUgYmFjaworICAgICAgICBtb3ZkcWEgICAgICBbcnNpKzIqcmF4XSwgICAgICAgICAgICB4bW0xICAgICAgICAgICAgICA7IHdyaXRlIGJhY2sKKyAgICAgICAgbW92ZHFhICAgICAgW3JzaV0sICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyB3cml0ZSBiYWNrCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgIDsgd3JpdGUgYmFjaworJWVuZGlmCisKKyVlbmRtYWNybworCislaWYgQUJJX0lTXzMyQklUCisKKzt2b2lkIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgICAgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKKzspCitnbG9iYWwgc3ltKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMikgUFJJVkFURQorc3ltKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgIHJzcCwgbGZfdmFyX3NpemUKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwCisKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICAgICAgYXJnKDMpICAgICAgICAgICA7bGltaXQKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBbcnNpK3JheF0gICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKKworICAgICAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zIGFuZCBoaWdoIGVkZ2UgdmFyaWFuY2UKKyAgICAgICAgTEZIX0ZJTFRFUl9BTkRfSEVWX01BU0sgMQorICAgICAgICA7IGZpbHRlciBhbmQgd3JpdGUgYmFjayB0aGUgcmVzdWx0CisgICAgICAgIEJfRklMVEVSIDEKKworICAgIGFkZCByc3AsIGxmX3Zhcl9zaXplCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCislZW5kaWYKKworO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgICAgICAgICAgICBzcmNfcGl4ZWxfc3RlcCwKKzsgICAgY29uc3QgY2hhciAgICAqYmxpbWl0LAorOyAgICBjb25zdCBjaGFyICAgICpsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqdGhyZXNoLAorOyAgICBpbnQgICAgICAgICAgICBjb3VudAorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyKSBQUklWQVRFCitzeW0odnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgc3ViICAgICAgICAgcnNwLCBsZl92YXJfc2l6ZQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICA7IHUKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICAgICAgYXJnKDUpICAgICAgICAgICAgIDsgdgorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgOyBzcmNfcGl4ZWxfc3RlcAorICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAgICAgICAgICAgICByYXgKKyAgICAgICAgbmVnICAgICAgICAgcmF4ICAgICAgICAgICAgICAgICAgICAgOyBuZWdhdGUgcGl0Y2ggdG8gZGVhbCB3aXRoIGFib3ZlIGJvcmRlcgorCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgICAgIGFyZygzKSAgICAgICAgICAgICA7bGltaXQKKworICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBbcmRpICsgcmN4XQorCisgICAgICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQorICAgICAgICBMRkhfRklMVEVSX0FORF9IRVZfTUFTSyAwCisgICAgICAgIDsgZmlsdGVyIGFuZCB3cml0ZSBiYWNrIHRoZSByZXN1bHQKKyAgICAgICAgQl9GSUxURVIgMAorCisgICAgYWRkIHJzcCwgbGZfdmFyX3NpemUKKyAgICBwb3AgcnNwCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworJW1hY3JvIE1CX0ZJTFRFUl9BTkRfV1JJVEVCQUNLIDEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXQorJWlmICUxID09IDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JzcCtfcDFdICAgICAgICAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFtyc3ArX3ExXSAgICAgICAgICAgICAgOyBxMQorJWVsaWYgJTEgPT0gMQorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICBbcnNpKzIqcmF4XSAgICAgOyBwMQorICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBbcmRpXSAgICAgICAgICAgOyBxMQorCisgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgICAgICAgICAgICAgIHJheAorICAgICAgICBuZWcgICAgICAgICByY3gKKyVlbGlmICUxID09IDIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JzcCtfcDFdICAgICAgIDsgcDEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgW3JzcCtfcDBdICAgICAgIDsgcDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgW3JzcCtfcTBdICAgICAgIDsgcTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW3JzcCtfcTFdICAgICAgIDsgcTEKKyVlbmRpZgorCisgICAgICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKworICAgICAgICBwc3Vic2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBwMSAtIHExCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgcTAKKyAgICAgICAgcHN1YnNiICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgcTAgLSBwMAorICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyAxICogKHEwIC0gcDApICsgKHAxIC0gcTEpCisgICAgICAgIHBhZGRzYiAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IDIgKiAocTAgLSBwMCkKKyAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKSArIChwMSAtIHExKQorICAgICAgICBwYW5kICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHZwOF9maWx0ZXIKKworICAgICAgICBwYW5kICAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIyID0gdnA4X2ZpbHRlciAmIGhldgorICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcGFuZG4gICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgdnA4X2ZpbHRlciY9fmhldgorICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0xCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgRmlsdGVyIDIgKGhpKQorICAgICAgICBwdW5wY2toYncgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIgMiAobG8pCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwoczkpXQorICAgICAgICBwYWRkc2IgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQzKV0gICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiArIDMpCisgICAgICAgIHBhZGRzYiAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDQpXSAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyICsgNCkKKworICAgICAgICBwbXVsaHcgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIgMiAobG8pICogOQorICAgICAgICBwbXVsaHcgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIgMiAoaGkpICogOQorCisgICAgICAgIHB1bnBja2hidyAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGF4YnhjeGR4CisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGV4ZnhneGh4CisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisgICAgICAgIHB1bnBja2hidyAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGF4YnhjeGR4CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgZXhmeGd4aHgKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCisKKyAgICAgICAgcGFja3Nzd2IgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0zOworICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKKworICAgICAgICBwYWNrc3N3YiAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIxID4+PTM7CisKKyAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgcHMwID1wczAgKyBGaXRsZXIyCisKKyAgICAgICAgcHN1YnNiICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcXMwID1xczAgLSBGaWx0ZXIxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHhtbTEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHM2MyldCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIgMiAoaGkpICogOSArIDYzCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IEZpbHRlciAyIChsbykgKiA5ICsgNjMKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNworCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IEZpbHRlciAyIChoaSkgKiAxOAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IEZpbHRlciAyIChsbykgKiAxOAorICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBGaWx0ZXIgMiAoaGkpICogMjcgKyA2MworCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IEZpbHRlciAyIChsbykgKiAyNyArIDYzCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IEZpbHRlciAyIChoaSkgKiAxOCArIDYzCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIDcgICAgICAgICAgICAgICA7IChGaWx0ZXIgMiAoaGkpICogOSArIDYzKSA+PiA3CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgRmlsdGVyIDIgKGxvKSAqIDE4ICsgNjMKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgIDsgKEZpbHRlciAyIChsbykgKiA5ICsgNjMpID4+IDcKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgIDsgKEZpbHRlciAyIChoaSkgKiAxOCArIDYzKSA+PiA3CisKKyAgICAgICAgcGFja3Nzd2IgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgdTEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpPj43KQorCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIDcgICAgICAgICAgICAgICA7IChGaWx0ZXIgMiAobG8pICogMTggKyA2MykgPj4gNworICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgICAgICAgOyAoRmlsdGVyIDIgKGhpKSAqIDI3ICsgNjMpID4+IDcKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgIDsgKEZpbHRlciAyIChsbykgKiAyNyArIDYzKSA+PiA3CisKKyAgICAgICAgcGFja3Nzd2IgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgdTMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDI3KT4+NykKKyAgICAgICAgcGFja3Nzd2IgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgdTIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDE4KT4+NykKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXQorCislaWYgJTEgPT0gMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbcnNwK19xMV0gICAgICAgOyBxMQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcnNwK19wMV0gICAgICAgOyBwMQorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBbcnNpK3JjeCoyXQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBbcmRpK3JjeCoyXQorCislZWxpZiAlMSA9PSAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtyZGldICAgICAgICAgICA7IHExCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtyc2krcmF4KjJdICAgICA7IHAxCislZWxpZiAlMSA9PSAyCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtyc3ArX3AxXSAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtyc3ArX3ExXSAgICAgICA7IHExCislZW5kaWYKKworICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW03CisgICAgICAgIHB4b3IgICAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTcKKworICAgICAgICBwc3Vic2IgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBzcSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB1MykKKyAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgc3AgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwIC0gdTMpCisgICAgICAgIHBzdWJzYiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IHNxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUyKQorICAgICAgICBwYWRkc2IgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBzcCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgLSB1MikKKworJWlmICUxID09IDEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkaStyYXgqNF0gICAgIDsgcDIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgW3JkaStyY3hdICAgICAgIDsgcTIKKyVlbHNlCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc3ArX3AyXSAgICAgICA7IHAyCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIFtyc3ArX3EyXSAgICAgICA7IHEyCislZW5kaWYKKworICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyAqb3ExID0gc3FeMHg4MDsKKyAgICAgICAgcHhvciAgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgKm9wMSA9IHNwXjB4ODA7CisgICAgICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTcKKyAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNworICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBzcCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgLSB1KQorICAgICAgICBwc3Vic2IgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBzcSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczIgLSB1KQorICAgICAgICBweG9yICAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyAqb3AyID0gc3BeMHg4MDsKKyAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgKm9xMiA9IHNxXjB4ODA7CisgICAgICAgIHB4b3IgICAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7ICpvcTAgPSBzcV4weDgwCisgICAgICAgIHB4b3IgICAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7ICpvcTAgPSBzcF4weDgwCislaWYgJTEgPT0gMAorICAgICAgICBtb3ZxICAgICAgICBbcnNpXSwgICAgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBwMAorICAgICAgICBtb3ZocHMgICAgICBbcmRpXSwgICAgICAgICAgICAgICAgICB4bW02CisgICAgICAgIG1vdnEgICAgICAgIFtyc2kgKyByY3hdLCAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHEwCisgICAgICAgIG1vdmhwcyAgICAgIFtyZGkgKyByY3hdLCAgICAgICAgICAgIHhtbTMKKyAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICAgICAgW3JjeCArIHJjeCoyXQorICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JjeCoyXSwgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBxMQorICAgICAgICBtb3ZocHMgICAgICBbcmRpK3JjeCoyXSwgICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92cSAgICAgICAgW3JzaSArIHJheF0sICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgcDEKKyAgICAgICAgbW92aHBzICAgICAgW3JkaSArIHJheF0sICAgICAgICAgICAgeG1tNAorCisgICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4KjJdLCAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IHAyCisgICAgICAgIG1vdmhwcyAgICAgIFtyZGkrcmF4KjJdLCAgICAgICAgICAgIHhtbTIKKworICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JkeF0sICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBxMgorICAgICAgICBtb3ZocHMgICAgICBbcmRpK3JkeF0sICAgICAgICAgICAgICB4bW01CislZWxpZiAlMSA9PSAxCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4XSwgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IHEyCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHExCisgICAgICAgIG1vdmRxYSAgICAgIFtyc2ldLCAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHEwCisgICAgICAgIG1vdmRxYSAgICAgIFtyc2krcmF4ICBdLCAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IHAwCisgICAgICAgIG1vdmRxYSAgICAgIFtyc2krcmF4KjJdLCAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmF4KjRdLCAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IHAyCislZWxpZiAlMSA9PSAyCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3AxXSwgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3AwXSwgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IHAwCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3EwXSwgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHEwCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3ExXSwgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHExCislZW5kaWYKKworJWVuZG1hY3JvCisKKworO3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgICAgICAgICAgIHNyY19waXhlbF9zdGVwLAorOyAgICBjb25zdCBjaGFyICAgICpibGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKmxpbWl0LAorOyAgICBjb25zdCBjaGFyICAgICp0aHJlc2gsCis7KQorZ2xvYmFsIHN5bSh2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMikgUFJJVkFURQorc3ltKHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgc3ViICAgICAgICAgcnNwLCBsZl92YXJfc2l6ZQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgIDtzcmNfcGl4ZWxfc3RlcAorICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgICAgICAgICBhcmcoMykgICAgICAgICAgICA7bGltaXQKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBbcnNpK3JheF0gICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisKKyAgICAgICAgOyBjYWxjdWxhdGUgYnJlYWtvdXQgY29uZGl0aW9ucyBhbmQgaGlnaCBlZGdlIHZhcmlhbmNlCisgICAgICAgIExGSF9GSUxURVJfQU5EX0hFVl9NQVNLIDEKKyAgICAgICAgOyBmaWx0ZXIgYW5kIHdyaXRlIGJhY2sgdGhlIHJlc3VsdHMKKyAgICAgICAgTUJfRklMVEVSX0FORF9XUklURUJBQ0sgMQorCisgICAgYWRkIHJzcCwgbGZfdmFyX3NpemUKKyAgICBwb3AgcnNwCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnUsCis7ICAgIGludCAgICAgICAgICAgIHNyY19waXhlbF9zdGVwLAorOyAgICBjb25zdCBjaGFyICAgICpibGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKmxpbWl0LAorOyAgICBjb25zdCBjaGFyICAgICp0aHJlc2gsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnYKKzspCitnbG9iYWwgc3ltKHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyKSBQUklWQVRFCitzeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICBzdWIgICAgICAgICByc3AsIGxmX3Zhcl9zaXplCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgIDsgdQorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBhcmcoNSkgICAgICAgICAgICAgOyB2CisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICA7IHNyY19waXhlbF9zdGVwCisgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgICAgICAgICAgICAgIHJheAorICAgICAgICBuZWcgICAgICAgICByYXggICAgICAgICAgICAgICAgICAgICA7IG5lZ2F0ZSBwaXRjaCB0byBkZWFsIHdpdGggYWJvdmUgYm9yZGVyCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgICAgIGFyZygzKSAgICAgICAgICAgICA7bGltaXQKKworICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBbcmRpICsgcmN4XQorCisgICAgICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQorICAgICAgICBMRkhfRklMVEVSX0FORF9IRVZfTUFTSyAwCisgICAgICAgIDsgZmlsdGVyIGFuZCB3cml0ZSBiYWNrIHRoZSByZXN1bHRzCisgICAgICAgIE1CX0ZJTFRFUl9BTkRfV1JJVEVCQUNLIDAKKworICAgIGFkZCByc3AsIGxmX3Zhcl9zaXplCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKyVtYWNybyBUUkFOU1BPU0VfMTZYOCAyCisgICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgICAgICAgICAgW3JzaV0gICAgICAgICAgIDsgeHggeHggeHggeHggeHggeHggeHggeHggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgICAgICAgICBbcmRpXSAgICAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMAorICAgICAgICBtb3ZxICAgICAgICB4bW0wLCAgICAgICAgICAgICAgIFtyc2krMipyYXhdICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwCisgICAgICAgIG1vdnEgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgW3JkaSsyKnJheF0gICAgIDsgeHggeHggeHggeHggeHggeHggeHggeHggMzcgMzYgMzUgMzQgMzMgMzIgMzEgMzAKKyAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgICAgICAgICBbcnNpKzQqcmF4XSAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgICAgIFtyZGkrNCpyYXhdICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IDU3IDU2IDU1IDU0IDUzIDUyIDUxIDUwCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyAxNyAwNyAxNiAwNiAxNSAwNSAxNCAwNCAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAorCisgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgW3JkaSsyKnJjeF0gICAgIDsgeHggeHggeHggeHggeHggeHggeHggeHggNzcgNzYgNzUgNzQgNzMgNzIgNzEgNzAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IDE3IDA3IDE2IDA2IDE1IDA1IDE0IDA0IDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCisgICAgICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgMzcgMjcgMzYgMzYgMzUgMjUgMzQgMjQgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKKworICAgICAgICBtb3ZxICAgICAgICB4bW03LCAgICAgICAgICAgICAgIFtyc2krMipyY3hdICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IDY3IDY2IDY1IDY0IDYzIDYyIDYxIDYwCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyA1NyA0NyA1NiA0NiA1NSA0NSA1NCA0NCA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAorJWlmICUxCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaStyYXgqOF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcmRpK3JheCo4XQorJWVsc2UKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBhcmcoNSkgICAgICAgICAgOyB2X3B0cgorJWVuZGlmCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyA1NyA0NyA1NiA0NiA1NSA0NSA1NCA0NCA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAorICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IDc3IDY3IDc2IDY2IDc1IDY1IDc0IDY0IDczIDYzIDcyIDYyIDcxIDYxIDcwIDYwCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTUsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgNzMgNjMgNTMgNDMgNzIgNjIgNTIgNDIgNzEgNjEgNTEgNDEgNzAgNjAgNTAgNDAKKyAgICAgICAgcHVucGNraHdkICAgeG1tNiwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyA3NyA2NyA1NyA0NyA3NiA2NiA1NiA0NiA3NSA2NSA1NSA0NSA3NCA2NCA1NCA0NAorICAgICAgICBwdW5wY2tsd2QgICB4bW0zLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyIDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCisKKyVpZiAlMSA9PSAwCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgW3JzaSArIHJheCAtIDRdIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBbcnNpIC0gNF0KKyVlbmRpZgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKKyAgICAgICAgcHVucGNraHdkICAgeG1tNCwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyAzNyAyNyAxNyAwNyAzNiAyNiAxNiAwNiAzNSAyNSAxNSAwNSAzNCAyNCAxNCAwNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgMzcgMjcgMTcgMDcgMzYgMjYgMTYgMDYgMzUgMjUgMTUgMDUgMzQgMjQgMTQgMDQKKyAgICAgICAgcHVucGNraGRxICAgeG1tMywgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgMzcgMjcgMTcgMDcgNzYgNjYgNTYgNDYgMzYgMjYgMTYgMDYKKworICAgICAgICBwdW5wY2tsZHEgICB4bW00LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0CisKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMiwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3QwXSwgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgc2F2ZSB0byBmcmVlIFhNTTIKKworICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgICAgIFtyc2ldICAgICAgICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IDg3IDg2IDg1IDg0IDgzIDgyIDgxIDgwCisgICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgICAgICAgICAgW3JkaV0gICAgICAgICAgIDsgeHggeHggeHggeHggeHggeHggeHggeHggOTcgOTYgOTUgOTQgOTMgOTIgOTEgOTAKKyAgICAgICAgbW92cSAgICAgICAgeG1tMCwgICAgICAgICAgICAgICBbcnNpKzIqcmF4XSAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCBhNyBhNiBhNSBhNCBhMyBhMiBhMSBhMAorICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICAgICAgICAgIFtyZGkrMipyYXhdICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IGI3IGI2IGI1IGI0IGIzIGIyIGIxIGIwCisgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgW3JzaSs0KnJheF0gICAgIDsgeHggeHggeHggeHggeHggeHggeHggeHggYzcgYzYgYzUgYzQgYzMgYzIgYzEgYzAKKworICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IDk3IDg3IDk2IDg2IDk1IDg1IDk0IDg0IDkzIDgzIDkyIDgyIDkxIDgxIDkwIDgwCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNiwgICAgICAgICAgICAgICBbcmRpKzQqcmF4XSAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCBkNyBkNiBkNSBkNCBkMyBkMiBkMSBkMAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgYjcgYTcgYjYgYTYgYjUgYTUgYjQgYTQgYjMgYTMgYjIgYTIgYjEgYTEgYjAgYTAKKworICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICAgICAgICAgIFtyc2krMipyY3hdICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IGU3IGU2IGU1IGU0IGUzIGUyIGUxIGUwCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBkNyBjNyBkNiBjNiBkNSBjNSBkNCBjNCBkMyBjMyBkMiBjMiBkMSBlMSBkMCBjMAorCisgICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgICAgICAgICAgW3JkaSsyKnJjeF0gICAgIDsgeHggeHggeHggeHggeHggeHggeHggeHggZjcgZjYgZjUgZjQgZjMgZjIgZjEgZjAKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IGY3IGU3IGY2IGU2IGY1IGU1IGY0IGU0IGYzIGUzIGYyIGUyIGYxIGUxIGYwIGUwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tod2QgICB4bW02LCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGY3IGU3IGQ3IGM3IGY2IGU2IGQ2IGM2IGY1IGU1IGQ1IGM1IGY0IGU0IGQ0IGM0CisKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBmMyBlMyBkMyBjMyBmMiBlMiBkMiBjMiBmMSBlMSBkMSBjMSBmMCBlMCBkMCBjMAorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IDk3IDg3IDk2IDg2IDk1IDg1IDk0IDg0IDkzIDgzIDkyIDgyIDkxIDgxIDkwIDgwCisKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNSwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBiMyBhMyA5MyA4MyBiMiBhMiA5MiA4MiBiMSBhMSA5MSA4MSBiMCBhMCA5MCA4MAorCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgYjcgYTcgOTcgODcgYjYgYTYgOTYgODYgYjUgYTUgOTUgODUgYjQgYTQgOTQgODQKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MAorCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBiNyBhNyA5NyA4NyBiNiBhNiA5NiA4NiBiNSBhNSA5NSA4NSBiNCBhNCA5NCA4NAorCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgZjUgZTUgZDUgYzUgYjUgYTUgOTUgODUgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQKKworICAgICAgICBwdW5wY2toZHEgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IGY3IGU3IGQ3IGM3IGI3IGE3IDk3IDg3IGY2IGU2IGQ2IGM2IGI2IGE2IDk2IDg2CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgMzcgMjcgMTcgMDcgNzYgNjYgNTYgNDYgMzYgMjYgMTYgMDYKKworICAgICAgICBwdW5wY2tscWRxICB4bW02LCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGY2IGU2IGQ2IGM2IGI2IGE2IDk2IDg2IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2CisKKyAgICAgICAgcHVucGNraHFkcSAgeG1tNywgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBmNyBlNyBkNyBjNyBiNyBhNyA5NyA4NyA3NyA2NyA1NyA0NyAzNyAyNyAxNyAwNworCislaWYgJTIgPT0gMAorICAgICAgICBtb3ZkcWEgICAgICBbcnNwK19xM10sICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IHNhdmUgNworICAgICAgICBtb3ZkcWEgICAgICBbcnNwK19xMl0sICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IHNhdmUgNgorJWVuZGlmCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgICAgICAgcHVucGNraHFkcSAgeG1tMywgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMworICAgICAgICBwdW5wY2tscWRxICB4bW0yLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3AxXSwgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgc2F2ZSAyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNSA3NCA2NCA1NCA0NCAzNCAyNCAxNCAwNAorICAgICAgICBwdW5wY2tscWRxICB4bW00LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGY0IGU0IGQ0IGM0IGI0IGE0IDk0IDg0IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0CisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3AwXSwgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgc2F2ZSAzCisKKyAgICAgICAgcHVucGNraHFkcSAgeG1tNSwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBmNSBlNSBkNSBjNSBiNSBhNSA5NSA4NSA3NSA2NSA1NSA0NSAzNSAyNSAxNSAwNQorCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3EwXSwgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgc2F2ZSA0CisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3ExXSwgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgc2F2ZSA1CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgW3JzcCtfdDBdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tocWRxICB4bW0xLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IGYxIGUxIGQxIGMxIGIxIGExIDkxIDgxIDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTIsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKworJWlmICUyID09IDAKKyAgICAgICAgbW92ZHFhICAgICAgW3JzcCtfcDJdLCAgICAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3ArX3AzXSwgICAgICAgICAgeG1tMgorJWVuZGlmCisKKyVlbmRtYWNybworCislbWFjcm8gTEZWX0ZJTFRFUl9NQVNLX0hFVl9NQVNLIDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBxMgorICAgICAgICBwc3VidXNiICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IHEyLXEzCisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNywgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBxMy1xMgorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IHExCisKKyAgICAgICAgcG9yICAgICAgICAgeG1tNywgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBhYnMgKHEzLXEyKQorICAgICAgICBwc3VidXNiICAgICB4bW00LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IHExLXEyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW0xCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgcTItcTEKKworICAgICAgICBwb3IgICAgICAgICB4bW02LCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IGFicyAocTItcTEpCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDIgLSBwMzsKKworICAgICAgICBwc3VidXNiICAgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHAzIC0gcDI7CisgICAgICAgIHBvciAgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgYWJzKHAyLXAzKQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgW3JzcCtfcDFdICAgICAgIDsgcDEKKyAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW03CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBwMQorICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHAxLXAyCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDItcDEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHAwCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDAtcDEKKworICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGFicyhwMi1wMSkKKyAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW02CisKKyAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDEKKworICAgICAgICBwc3VidXNiICAgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHAxLXAwCisKKyAgICAgICAgcG9yICAgICAgICAgeG1tMiwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBhYnMocDEtcDApCisKKyAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICBbcnNwK19xMF0gICAgICAgOyBxMAorICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgIFtyc3ArX3ExXSAgICAgICA7IHExCisKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICBhcmcoMykgICAgICAgICAgOyBsaW1pdAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgcTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBxMQorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgcTAtcTEKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNywgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBxMS1xMAorCisgICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgYWJzKHExLXEwKQorCisgICAgICAgIHBtYXh1YiAgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tNworCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTAsICAgICAgICAgICAgICAgW3JkeF0gICAgICAgICAgIDsgbGltaXQKKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgICAgIGFyZygyKSAgICAgICAgICA7IGJsaW1pdAorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IHExCisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNSwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBxMS09cDEKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBwMS09cTEKKworICAgICAgICBwb3IgICAgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGFicyhwMS1xMSkKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBwMAorCisgICAgICAgIHBhbmQgICAgICAgIHhtbTUsICAgICAgICAgICAgICAgW0dMT0JBTCh0ZmUpXSAgIDsgc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybworICAgICAgICBwc3VidXNiICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IHAwLXEwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgOyBibGltaXQKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICBhcmcoNCkgICAgICAgICAgOyBnZXQgdGhyZXNoCisKKyAgICAgICAgcHNybHcgICAgICAgeG1tNSwgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBxMC1wMAorCisgICAgICAgIHBvciAgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgYWJzKHEwLXAwKQorICAgICAgICBwYWRkdXNiICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGFicyhxMC1wMCkqMgorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgICAgIFtyZHhdCisKKyAgICAgICAgcGFkZHVzYiAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgYWJzKHExIC0gcTApID4gdGhyZXNoCisKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNywgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBhYnMocDEgLSBwMCk+IHRocmVzaAorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBibGltaXQKKyAgICAgICAgcG9yICAgICAgICAgeG1tMiwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2ggfHwgYWJzKHAxIC0gcDApID4gdGhyZXNoCisKKyAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBtYXNrCisgICAgICAgIHBjbXBlcWIgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMAorCisgICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMAorICAgICAgICBwY21wZXFiICAgICB4bW00LCAgICAgICAgICAgICAgIHhtbTQKKworICAgICAgICBwY21wZXFiICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHhvciAgICAgICAgeG1tNCwgICAgICAgICAgICAgICB4bW0yCislZW5kbWFjcm8KKworJW1hY3JvIEJWX1RSQU5TUE9TRSAwCisgICAgICAgIDsgeG1tMSA9ICAgIGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICAgICAgIDsgeG1tNiA9ICAgIGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzCisgICAgICAgIDsgeG1tMyA9ICAgIGY0IGU0IGQ0IGM0IGI0IGE0IDk0IDg0IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0CisgICAgICAgIDsgeG1tNyA9ICAgIGY1IGU1IGQ1IGM1IGI1IGE1IDk1IDg1IDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBmMyBmMiBlMyBlMiBkMyBkMiBjMyBjMiBiMyBiMiBhMyBhMiA5MyA5MiA4MyA4MgorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgNzUgNzQgNjUgNjQgNTUgNTQgNDUgNDQgMzUgMzQgMjUgMjQgMTUgMTQgMDUgMDQKKworICAgICAgICBwdW5wY2toYncgICB4bW0zLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IGY1IGY0IGU1IGU0IGQ1IGQ0IGM1IGM0IGI1IGI0IGE1IGE0IDk1IDk0IDg1IDg0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgorICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IDM1IDM0IDMzIDMyIDI1IDI0IDIzIDIyIDE1IDE0IDEzIDEyIDA1IDA0IDAzIDAyCisKKyAgICAgICAgcHVucGNraHdkICAgeG1tNiwgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyA3NSA3NCA3MyA3MiA2NSA2NCA2MyA2MiA1NSA1NCA1MyA1MiA0NSA0NCA0MyA0MgorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCisKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBiNSBiNCBiMyBiMiBhNSBhNCBhMyBhMiA5NSA5NCA5MyA5MiA4NSA4NCA4MyA4MgorCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgZjUgZjQgZjMgZjIgZTUgZTQgZTMgZTIgZDUgZDQgZDMgZDIgYzUgYzQgYzMgYzIKKyAgICAgICAgOyB4bW0yID0gMzUgMzQgMzMgMzIgMjUgMjQgMjMgMjIgMTUgMTQgMTMgMTIgMDUgMDQgMDMgMDIKKyAgICAgICAgOyB4bW02ID0gNzUgNzQgNzMgNzIgNjUgNjQgNjMgNjIgNTUgNTQgNTMgNTIgNDUgNDQgNDMgNDIKKyAgICAgICAgOyB4bW0xID0gYjUgYjQgYjMgYjIgYTUgYTQgYTMgYTIgOTUgOTQgOTMgOTIgODUgODQgODMgODIKKyAgICAgICAgOyB4bW01ID0gZjUgZjQgZjMgZjIgZTUgZTQgZTMgZTIgZDUgZDQgZDMgZDIgYzUgYzQgYzMgYzIKKyVlbmRtYWNybworCislbWFjcm8gQlZfV1JJVEVCQUNLIDIKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaSsyXSwgICAgICAgICAgICAlMQorICAgICAgICBtb3ZkICAgICAgICBbcnNpKzQqcmF4KzJdLCAgICAgICUyCisgICAgICAgIHBzcmxkcSAgICAgICUxLCAgICAgICAgICAgICAgICAgNAorICAgICAgICBwc3JsZHEgICAgICAlMiwgICAgICAgICAgICAgICAgIDQKKyAgICAgICAgbW92ZCAgICAgICAgW3JkaSsyXSwgICAgICAgICAgICAlMQorICAgICAgICBtb3ZkICAgICAgICBbcmRpKzQqcmF4KzJdLCAgICAgICUyCisgICAgICAgIHBzcmxkcSAgICAgICUxLCAgICAgICAgICAgICAgICAgNAorICAgICAgICBwc3JsZHEgICAgICAlMiwgICAgICAgICAgICAgICAgIDQKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaSsyKnJheCsyXSwgICAgICAlMQorICAgICAgICBtb3ZkICAgICAgICBbcnNpKzIqcmN4KzJdLCAgICAgICUyCisgICAgICAgIHBzcmxkcSAgICAgICUxLCAgICAgICAgICAgICAgICAgNAorICAgICAgICBwc3JsZHEgICAgICAlMiwgICAgICAgICAgICAgICAgIDQKKyAgICAgICAgbW92ZCAgICAgICAgW3JkaSsyKnJheCsyXSwgICAgICAlMQorICAgICAgICBtb3ZkICAgICAgICBbcmRpKzIqcmN4KzJdLCAgICAgICUyCislZW5kbWFjcm8KKworJWlmIEFCSV9JU18zMkJJVAorCis7dm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgICAgICAgICAgICBzcmNfcGl4ZWxfc3RlcCwKKzsgICAgY29uc3QgY2hhciAgICAqYmxpbWl0LAorOyAgICBjb25zdCBjaGFyICAgICpsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqdGhyZXNoLAorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2Vfc3NlMikgUFJJVkFURQorc3ltKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICBzdWIgICAgICAgICAgICAgcnNwLCBsZl92YXJfc2l6ZQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgICAgIDsgc3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgICAgICA7IHNyY19waXhlbF9zdGVwCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSAtIDRdCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JheCoyK3JheF0KKworICAgICAgICA7dHJhbnNwb3NlIDE2eDggdG8gOHgxNiwgYW5kIHN0b3JlIHRoZSA4LWxpbmUgcmVzdWx0IG9uIHN0YWNrLgorICAgICAgICBUUkFOU1BPU0VfMTZYOCAxLCAxCisKKyAgICAgICAgOyBjYWxjdWxhdGUgZmlsdGVyIG1hc2sgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQorICAgICAgICBMRlZfRklMVEVSX01BU0tfSEVWX01BU0sKKworICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycworICAgICAgICBCX0ZJTFRFUiAyCisKKyAgICAgICAgOyB0cmFucG9zZSBhbmQgd3JpdGUgYmFjayAtIG9ubHkgd29yayBvbiBxMSwgcTAsIHAwLCBwMQorICAgICAgICBCVl9UUkFOU1BPU0UKKyAgICAgICAgOyBzdG9yZSAxNi1saW5lIHJlc3VsdAorCisgICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyYXhdCisgICAgICAgIG5lZyAgICAgICAgIHJkeAorCisgICAgICAgIEJWX1dSSVRFQkFDSyB4bW0xLCB4bW01CisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyZHgqOF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqOF0KKyAgICAgICAgQlZfV1JJVEVCQUNLIHhtbTIsIHhtbTYKKworICAgIGFkZCByc3AsIGxmX3Zhcl9zaXplCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCislZW5kaWYKKworO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqdSwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgICAgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKKzsgICAgdW5zaWduZWQgY2hhciAqdgorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMikgUFJJVkFURQorc3ltKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICBzdWIgICAgICAgICAgICAgcnNwLCBsZl92YXJfc2l6ZQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgICAgIDsgdV9wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICAgICAgOyBzcmNfcGl4ZWxfc3RlcAorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgLSA0XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcnNpICsgcmF4XSAgICAgICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyYXgrMipyYXhdCisKKyAgICAgICAgO3RyYW5zcG9zZSAxNng4IHRvIDh4MTYsIGFuZCBzdG9yZSB0aGUgOC1saW5lIHJlc3VsdCBvbiBzdGFjay4KKyAgICAgICAgVFJBTlNQT1NFXzE2WDggMCwgMQorCisgICAgICAgIDsgY2FsY3VsYXRlIGZpbHRlciBtYXNrIGFuZCBoaWdoIGVkZ2UgdmFyaWFuY2UKKyAgICAgICAgTEZWX0ZJTFRFUl9NQVNLX0hFVl9NQVNLCisKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgQl9GSUxURVIgMgorCisgICAgICAgIDsgdHJhbnBvc2UgYW5kIHdyaXRlIGJhY2sgLSBvbmx5IHdvcmsgb24gcTEsIHEwLCBwMCwgcDEKKyAgICAgICAgQlZfVFJBTlNQT1NFCisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZworCisgICAgICAgIDsgc3RvcmUgMTYtbGluZSByZXN1bHQKKyAgICAgICAgQlZfV1JJVEVCQUNLIHhtbTEsIHhtbTUKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICAgICA7IHVfcHRyCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgLSA0XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcnNpICsgcmF4XSAgICAgICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisgICAgICAgIEJWX1dSSVRFQkFDSyB4bW0yLCB4bW02CisKKyAgICBhZGQgcnNwLCBsZl92YXJfc2l6ZQorICAgIHBvcCByc3AKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworJW1hY3JvIE1CVl9UUkFOU1BPU0UgMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgICAgIFtyc3ArX3AzXSAgICAgICAgICAgOyBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IDcxIDcwIDYxIDYwIDUxIDUwIDQxIDQwIDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCisgICAgICAgIHB1bnBja2hidyAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICBbcnNwK19wMV0gICAgICAgICAgIDsgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKworICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICAgICAgICAgIFtyc3ArX3AwXSAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgorICAgICAgICBwdW5wY2toYncgICB4bW02LCAgICAgICAgICAgICAgIFtyc3ArX3AwXSAgICAgICAgICAgOyBmMyBmMiBlMyBlMiBkMyBkMiBjMyBjMiBiMyBiMiBhMyBhMiA5MyA5MiA4MyA4MgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7IDcxIDcwIDYxIDYwIDUxIDUwIDQxIDQwIDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwIDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisKKyAgICAgICAgcHVucGNraHdkICAgeG1tMywgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsgNzMgNzIgNzEgNzAgNjMgNjIgNjEgNjAgNTMgNTIgNTEgNTAgNDMgNDIgNDEgNDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgIDsgZjEgZjAgZTEgZTAgZDEgZDAgYzEgYzAgYjEgYjAgYTEgYTAgOTEgOTAgODEgODAKKworICAgICAgICBwdW5wY2tsd2QgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOyBiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMCA5MyA5MiA5MSA5MCA4MyA4MiA4MSA4MAorICAgICAgICBwdW5wY2tod2QgICB4bW00LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOyBmMyBmMiBmMSBmMCBlMyBlMiBlMSBlMCBkMyBkMiBkMSBkMCBjMyBjMiBjMSBjMAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgW3JzcCtfcTBdICAgICAgICAgICA7IGY0IGU0IGQ0IGM0IGI0IGE0IDk0IDg0IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0CisgICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgICAgICAgICAgW3JzcCtfcTFdICAgICAgICAgICA7IDc1IDc0IDY1IDY0IDU1IDU0IDQ1IDQ0IDM1IDM0IDI1IDI0IDE1IDE0IDA1IDA0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgZjYgZTYgZDYgYzYgYjYgYTYgOTYgODYgNzYgNjYgNTYgNDYgMzYgMjYgMTYgMDYKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgICAgICAgICBbcnNwK19xM10gICAgICAgICAgIDsgNzcgNzYgNjcgNjYgNTcgNTYgNDcgNDYgMzcgMzYgMjcgMjYgMTcgMTYgMDcgMDYKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyA3NSA3NCA2NSA2NCA1NSA1NCA0NSA0NCAzNSAzNCAyNSAyNCAxNSAxNCAwNSAwNAorICAgICAgICBwdW5wY2tsd2QgICB4bW03LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOyAzNyAzNiAzNSAzNCAyNyAyNiAyNSAyNCAxNyAxNiAxNSAxNCAwNyAwNiAwNSAwNAorCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTIsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7IDc3IDc2IDc1IDc0IDY3IDY2IDY1IDY0IDU3IDU2IDU1IDU0IDQ3IDQ2IDQ1IDQ0CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwIDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsgMTcgMTYgMTUgMTQgMTMgMTIgMTEgMTAgMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNraGRxICAgeG1tNiwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsgMzcgMzYgMzUgMzQgMzMgMzIgMzEgMzAgMjcgMjYgMjUgMjQgMjMgMjIgMjEgMjAKKyVlbmRtYWNybworCislbWFjcm8gTUJWX1dSSVRFQkFDS18xIDAKKyAgICAgICAgbW92cSAgICAgICAgW3JzaV0sICAgICAgICAgICAgICB4bW0wCisgICAgICAgIG1vdmhwcyAgICAgIFtyZGldLCAgICAgICAgICAgICAgeG1tMAorCisgICAgICAgIG1vdnEgICAgICAgIFtyc2krMipyYXhdLCAgICAgICAgeG1tNgorICAgICAgICBtb3ZocHMgICAgICBbcmRpKzIqcmF4XSwgICAgICAgIHhtbTYKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyA3MyA3MiA3MSA3MCA2MyA2MiA2MSA2MCA1MyA1MiA1MSA1MCA0MyA0MiA0MSA0MAorICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgICAgOyA1NyA1NiA1NSA1NCA1MyA1MiA1MSA1MCA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAorICAgICAgICBwdW5wY2toZHEgICB4bW0zLCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgICAgOyA3NyA3NiA3NSA3NCA3MyA3MiA3MSA3MCA2NyA2NiA2NSA2NCA2MyA2MiA2MSA2MAorCisgICAgICAgIG1vdnEgICAgICAgIFtyc2krNCpyYXhdLCAgICAgICAgeG1tMAorICAgICAgICBtb3ZocHMgICAgICBbcmRpKzQqcmF4XSwgICAgICAgIHhtbTAKKworICAgICAgICBtb3ZxICAgICAgICBbcnNpKzIqcmN4XSwgICAgICAgIHhtbTMKKyAgICAgICAgbW92aHBzICAgICAgW3JkaSsyKnJjeF0sICAgICAgICB4bW0zCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICBbcnNwK19xMF0gICAgICAgICAgIDsgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNywgICAgICAgICAgICAgICBbcnNwK19xMV0gICAgICAgICAgIDsgZjUgZjQgZTUgZTQgZDUgZDQgYzUgYzQgYjUgYjQgYTUgYTQgOTUgOTQgODUgODQKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNSwgICAgICAgICAgICAgICBbcnNwK19xM10gICAgICAgICAgIDsgZjcgZjYgZTcgZTYgZDcgZDYgYzcgYzYgYjcgYjYgYTcgYTYgOTcgOTYgODcgODYKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTcKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgYjcgYjYgYjQgYjQgYTcgYTYgYTUgYTQgOTcgOTYgOTUgOTQgODcgODYgODUgODQKKyAgICAgICAgcHVucGNraHdkICAgeG1tNywgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgZjcgZjYgZjUgZjQgZTcgZTYgZTUgZTQgZDcgZDYgZDUgZDQgYzcgYzYgYzUgYzQKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgOyBiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMCA5MyA5MiA5MSA5MCA4MyA4MiA4MSA4MAorICAgICAgICBwdW5wY2tsZHEgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyA5NyA5NiA5NSA5NCA5MyA5MiA5MSA5MCA4NyA4NiA4NSA4MyA4NCA4MiA4MSA4MAorICAgICAgICBwdW5wY2toZHEgICB4bW01LCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyBiNyBiNiBiNSBiNCBiMyBiMiBiMSBiMCBhNyBhNiBhNSBhNCBhMyBhMiBhMSBhMAorJWVuZG1hY3JvCisKKyVtYWNybyBNQlZfV1JJVEVCQUNLXzIgMAorICAgICAgICBtb3ZxICAgICAgICBbcnNpXSwgICAgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92aHBzICAgICAgW3JkaV0sICAgICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92cSAgICAgICAgW3JzaSsyKnJheF0sICAgICAgICB4bW01CisgICAgICAgIG1vdmhwcyAgICAgIFtyZGkrMipyYXhdLCAgICAgICAgeG1tNQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgICA7IGYzIGYyIGYxIGYwIGUzIGUyIGUxIGUwIGQzIGQyIGQxIGQwIGMzIGMyIGMxIGMwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7IGQ3IGQ2IGQ1IGQ0IGQzIGQyIGQxIGQwIGM3IGM2IGM1IGM0IGMzIGMyIGMxIGMwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7IGY3IGY2IGY0IGY0IGYzIGYyIGYxIGYwIGU3IGU2IGU1IGU0IGUzIGUyIGUxIGUwCisKKyAgICAgICAgbW92cSAgICAgICAgW3JzaSs0KnJheF0sICAgICAgICB4bW0xCisgICAgICAgIG1vdmhwcyAgICAgIFtyZGkrNCpyYXhdLCAgICAgICAgeG1tMQorCisgICAgICAgIG1vdnEgICAgICAgIFtyc2krMipyY3hdLCAgICAgICAgeG1tNAorICAgICAgICBtb3ZocHMgICAgICBbcmRpKzIqcmN4XSwgICAgICAgIHhtbTQKKyVlbmRtYWNybworCisKKzt2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2Vfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgICAgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKKzspCitnbG9iYWwgc3ltKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2Vfc3NlMikgUFJJVkFURQorc3ltKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2Vfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgICByc3AsIGxmX3Zhcl9zaXplCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgIDsgc3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfcGl4ZWxfc3RlcAorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaSAtIDRdCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgW3JzaSArIHJheF0gICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgICAgICAgICAgW3JheCoyK3JheF0KKworICAgICAgICA7IFRyYW5zcG9zZQorICAgICAgICBUUkFOU1BPU0VfMTZYOCAxLCAwCisKKyAgICAgICAgOyBjYWxjdWxhdGUgZmlsdGVyIG1hc2sgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQorICAgICAgICBMRlZfRklMVEVSX01BU0tfSEVWX01BU0sKKworICAgICAgICBuZWcgICAgICAgICByYXgKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgTUJfRklMVEVSX0FORF9XUklURUJBQ0sgMgorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaStyYXgqOF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcmRpK3JheCo4XQorCisgICAgICAgIDsgdHJhbnNwb3NlIGFuZCB3cml0ZSBiYWNrCisgICAgICAgIE1CVl9UUkFOU1BPU0UKKworICAgICAgICBuZWcgICAgICAgICByYXgKKworICAgICAgICBNQlZfV1JJVEVCQUNLXzEKKworCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaStyYXgqOF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcmRpK3JheCo4XQorICAgICAgICBNQlZfV1JJVEVCQUNLXzIKKworICAgIGFkZCByc3AsIGxmX3Zhcl9zaXplCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqdSwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgICAgKmJsaW1pdCwKKzsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCis7ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKKzsgICAgdW5zaWduZWQgY2hhciAqdgorOykKK2dsb2JhbCBzeW0odnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyKSBQUklWQVRFCitzeW0odnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgc3ViICAgICAgICAgIHJzcCwgbGZfdmFyX3NpemUKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgOyB1X3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfcGl4ZWxfc3RlcAorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaSAtIDRdCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgW3JzaSArIHJheF0gICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgICAgICAgICAgW3JheCsyKnJheF0KKworICAgICAgICA7IFRyYW5zcG9zZQorICAgICAgICBUUkFOU1BPU0VfMTZYOCAwLCAwCisKKyAgICAgICAgOyBjYWxjdWxhdGUgZmlsdGVyIG1hc2sgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQorICAgICAgICBMRlZfRklMVEVSX01BU0tfSEVWX01BU0sKKworICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycworICAgICAgICBNQl9GSUxURVJfQU5EX1dSSVRFQkFDSyAyCisKKyAgICAgICAgOyB0cmFuc3Bvc2UgYW5kIHdyaXRlIGJhY2sKKyAgICAgICAgTUJWX1RSQU5TUE9TRQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgIDt1X3B0cgorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgIFtyc2kgLSA0XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgIFtyc2kgKyByYXhdCisgICAgICAgIE1CVl9XUklURUJBQ0tfMQorICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgICAgIGFyZyg1KSAgICAgICAgICAgICA7dl9wdHIKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBbcnNpIC0gNF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcnNpICsgcmF4XQorICAgICAgICBNQlZfV1JJVEVCQUNLXzIKKworICAgIGFkZCByc3AsIGxmX3Zhcl9zaXplCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCis7ICAgIGNvbnN0IGNoYXIgKmJsaW1pdCwKKzspCitnbG9iYWwgc3ltKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDMKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ICAgICAgICAgcmN4LCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpICAgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCBbR0xPQkFMKHRmZSldCisgICAgICAgIGxlYSAgICAgICAgIHJkeCwgW3JjeCArIHJheF0KKyAgICAgICAgbmVnICAgICAgICAgcmF4CisKKyAgICAgICAgOyBjYWxjdWxhdGUgbWFzaworICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCBbcmR4XSAgICAgICAgICAgICA7IHExCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDIpICAgICAgICAgICAgIDtibGltaXQKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgW3JjeCsyKnJheF0gICAgICAgOyBwMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgeG1tMAorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTAsIHhtbTEgICAgICAgICAgICAgIDsgcTEtPXAxCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsIHhtbTMgICAgICAgICAgICAgIDsgcDEtPXExCisgICAgICAgIHBvciAgICAgICAgIHhtbTEsIHhtbTAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKQorICAgICAgICBwYW5kICAgICAgICB4bW0xLCB4bW02ICAgICAgICAgICAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KKyAgICAgICAgcHNybHcgICAgICAgeG1tMSwgMSAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmR4XQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsIFtyY3grcmF4XSAgICAgICAgIDsgcDAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgW3JjeF0gICAgICAgICAgICAgOyBxMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCB4bW00ICAgICAgICAgICAgICA7IHEwCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsIHhtbTUgICAgICAgICAgICAgIDsgcDAKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNSwgeG1tNCAgICAgICAgICAgICAgOyBwMC09cTAKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgeG1tNiAgICAgICAgICAgICAgOyBxMC09cDAKKyAgICAgICAgcG9yICAgICAgICAgeG1tNSwgeG1tNCAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCBbR0xPQkFMKHQ4MCldCisKKyAgICAgICAgcGFkZHVzYiAgICAgeG1tNSwgeG1tNSAgICAgICAgICAgICAgOyBhYnMocDAtcTApKjIKKyAgICAgICAgcGFkZHVzYiAgICAgeG1tNSwgeG1tMSAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsIHhtbTcgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yICA+IGJsaW1pdAorICAgICAgICBweG9yICAgICAgICB4bW03LCB4bW03CisgICAgICAgIHBjbXBlcWIgICAgIHhtbTUsIHhtbTcKKworCisgICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCisgICAgICAgIHB4b3IgICAgICAgIHhtbTIsIHhtbTQgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICB4bW0zLCB4bW00ICAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICAgICAgcHN1YnNiICAgICAgeG1tMiwgeG1tMyAgICAgICAgICAgICAgOyBwMSAtIHExCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNiwgeG1tNCAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIHhtbTAsIHhtbTQgICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0wICAgICAgICAgICAgICA7IHEwCisgICAgICAgIHBzdWJzYiAgICAgIHhtbTAsIHhtbTYgICAgICAgICAgICAgIDsgcTAgLSBwMAorICAgICAgICBwYWRkc2IgICAgICB4bW0yLCB4bW0wICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAxICogKHEwIC0gcDApCisgICAgICAgIHBhZGRzYiAgICAgIHhtbTIsIHhtbTAgICAgICAgICAgICAgIDsgcDEgLSBxMSArIDIgKiAocTAgLSBwMCkKKyAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgeG1tMCAgICAgICAgICAgICAgOyBwMSAtIHExICsgMyAqIChxMCAtIHAwKQorICAgICAgICBwYW5kICAgICAgICB4bW01LCB4bW0yICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgeG1tNQorICAgICAgICBwYWRkc2IgICAgICB4bW01LCAgICAgICAgW0dMT0JBTCh0MyldICAgICAgICAgICAgICAgICAgOyAgMyogKHEwIC0gcDApICsgKHAxIC0gcTEpICsgNAorICAgICAgICBwYWRkc2IgICAgICB4bW0wLCAgICAgICAgW0dMT0JBTCh0NCldICAgICAgICAgICAgICAgICAgOyArMyBpbnN0ZWFkIG9mICs0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgW0dMT0JBTCh0ZTApXQorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCBbR0xPQkFMKHQxZildCisKKzsgICAgICAgIHB4b3IgICAgICAgIHhtbTcsIHhtbTcKKyAgICAgICAgcGNtcGd0YiAgICAgeG1tNywgeG1tMCAgICAgICAgICAgICAgO3NhdmUgc2lnbgorICAgICAgICBwYW5kICAgICAgICB4bW03LCB4bW0xICAgICAgICAgICAgICA7cHJlc2VydmUgdGhlIHVwcGVyIDMgYml0cworICAgICAgICBwc3JsdyAgICAgICB4bW0wLCAzCisgICAgICAgIHBhbmQgICAgICAgIHhtbTAsIHhtbTIgICAgICAgICAgICAgIDtjbGVhciBvdXQgdXBwZXIgMyBiaXRzCisgICAgICAgIHBvciAgICAgICAgIHhtbTAsIHhtbTcgICAgICAgICAgICAgIDthZGQgc2lnbgorICAgICAgICBwc3Vic2IgICAgICB4bW0zLCB4bW0wICAgICAgICAgICAgICA7IHEwLT0gcTBzeiBhZGQKKworICAgICAgICBweG9yICAgICAgICB4bW03LCB4bW03CisgICAgICAgIHBjbXBndGIgICAgIHhtbTcsIHhtbTUgICAgICAgICAgICAgIDtzYXZlIHNpZ24KKyAgICAgICAgcGFuZCAgICAgICAgeG1tNywgeG1tMSAgICAgICAgICAgICAgO3ByZXNlcnZlIHRoZSB1cHBlciAzIGJpdHMKKyAgICAgICAgcHNybHcgICAgICAgeG1tNSwgMworICAgICAgICBwYW5kICAgICAgICB4bW01LCB4bW0yICAgICAgICAgICAgICA7Y2xlYXIgb3V0IHVwcGVyIDMgYml0cworICAgICAgICBwb3IgICAgICAgICB4bW01LCB4bW03ICAgICAgICAgICAgICA7YWRkIHNpZ24KKyAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgeG1tNSAgICAgICAgICAgICAgOyBwMCs9IHAwIGFkZAorCisgICAgICAgIHB4b3IgICAgICAgIHhtbTMsIHhtbTQgICAgIDsgdW5vZmZzZXQKKyAgICAgICAgbW92ZHFhICAgICAgW3JjeF0sIHhtbTMgICAgICAgICAgICAgOyB3cml0ZSBiYWNrCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNiwgeG1tNCAgICAgOyB1bm9mZnNldAorICAgICAgICBtb3ZkcWEgICAgICBbcmN4K3JheF0sIHhtbTYgICAgICAgICA7IHdyaXRlIGJhY2sKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfcGl4ZWxfc3RlcCwKKzsgICAgY29uc3QgY2hhciAqYmxpbWl0LAorOykKK2dsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwICAgICAgICAgOyBzYXZlIG9sZCBiYXNlIHBvaW50ZXIgdmFsdWUuCisgICAgbW92ICAgICAgICAgcmJwLCByc3AgICAgOyBzZXQgbmV3IGJhc2UgcG9pbnRlciB2YWx1ZS4KKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyAzCisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieCAgICAgICAgIDsgc2F2ZSBjYWxsZWUtc2F2ZWQgcmVnCisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgc3ViICAgICAgICAgcnNwLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHJlc2VydmUgMzIgYnl0ZXMKKyAgICAlZGVmaW5lIHQwICBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzE2XTsKKyAgICAlZGVmaW5lIHQxICBbcnNwICsgMTZdICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQxWzE2XTsKKworICAgICAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbF9zdGVwICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPworCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgLSAyIF0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JzaSArIHJheF0KKyAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgW3JzaSArIHJheCo0XQorICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmR4ICsgcmF4XQorCisgICAgICAgIG1vdmQgICAgICAgIHhtbTAsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgICAgIDsgKGhpZ2ggOTYgYml0cyB1bnVzZWQpIDAzIDAyIDAxIDAwCisgICAgICAgIG1vdmQgICAgICAgIHhtbTEsICAgICAgIFtyZHhdICAgICAgICAgICAgICAgICAgIDsgKGhpZ2ggOTYgYml0cyB1bnVzZWQpIDQzIDQyIDQxIDQwCisgICAgICAgIG1vdmQgICAgICAgIHhtbTIsICAgICAgIFtyZGldICAgICAgICAgICAgICAgICAgIDsgMTMgMTIgMTEgMTAKKyAgICAgICAgbW92ZCAgICAgICAgeG1tMywgICAgICAgW3JjeF0gICAgICAgICAgICAgICAgICAgOyA1MyA1MiA1MSA1MAorICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7IChoaWdoIDY0IGJpdHMgdW51c2VkKSA0MyA0MiA0MSA0MCAwMyAwMiAwMSAwMAorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICB4bW0zICAgICAgICAgICAgICAgICAgICA7IDUzIDUyIDUxIDUwIDEzIDEyIDExIDEwCisKKyAgICAgICAgbW92ZCAgICAgICAgeG1tNCwgICAgICAgW3JzaSArIHJheCoyXSAgICAgICAgICAgOyAyMyAyMiAyMSAyMAorICAgICAgICBtb3ZkICAgICAgICB4bW01LCAgICAgICBbcmR4ICsgcmF4KjJdICAgICAgICAgICA7IDYzIDYyIDYxIDYwCisgICAgICAgIG1vdmQgICAgICAgIHhtbTYsICAgICAgIFtyZGkgKyByYXgqMl0gICAgICAgICAgIDsgMzMgMzIgMzEgMzAKKyAgICAgICAgbW92ZCAgICAgICAgeG1tNywgICAgICAgW3JjeCArIHJheCoyXSAgICAgICAgICAgOyA3MyA3MiA3MSA3MAorICAgICAgICBwdW5wY2tsZHEgICB4bW00LCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICA7IDYzIDYyIDYxIDYwIDIzIDIyIDIxIDIwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgIHhtbTcgICAgICAgICAgICAgICAgICAgIDsgNzMgNzIgNzEgNzAgMzMgMzIgMzEgMzAKKworICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICB4bW0yICAgICAgICAgICAgICAgICAgICA7IDUzIDQzIDUyIDQyIDUxIDQxIDUwIDQwIDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCisgICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgIDsgNzMgNjMgNzIgNjIgNzEgNjEgNzAgNjAgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgIHhtbTQgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKKyAgICAgICAgcHVucGNraHdkICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MiA3MSA2MSA1MSA0MSA3MCA2MCA1MCA0MAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAgICAgICBwdW5wY2toZHEgICB4bW0yLCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheCo4XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcnNpICsgcmF4XQorICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBbcnNpICsgcmF4KjRdCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZHggKyByYXhdCisKKyAgICAgICAgbW92ZCAgICAgICAgeG1tNCwgICAgICAgW3JzaV0gICAgICAgICAgICAgICAgICAgOyA4MyA4MiA4MSA4MAorICAgICAgICBtb3ZkICAgICAgICB4bW0xLCAgICAgICBbcmR4XSAgICAgICAgICAgICAgICAgICA7IGMzIGMyIGMxIGMwCisgICAgICAgIG1vdmQgICAgICAgIHhtbTYsICAgICAgIFtyZGldICAgICAgICAgICAgICAgICAgIDsgOTMgOTIgOTEgOTAKKyAgICAgICAgbW92ZCAgICAgICAgeG1tMywgICAgICAgW3JjeF0gICAgICAgICAgICAgICAgICAgOyBkMyBkMiBkMSBkMAorICAgICAgICBwdW5wY2tsZHEgICB4bW00LCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7IGMzIGMyIGMxIGMwIDgzIDgyIDgxIDgwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgICAgIDsgZDMgZDIgZDEgZDAgOTMgOTIgOTEgOTAKKworICAgICAgICBtb3ZkICAgICAgICB4bW0xLCAgICAgICBbcnNpICsgcmF4KjJdICAgICAgICAgICA7IGEzIGEyIGExIGEwCisgICAgICAgIG1vdmQgICAgICAgIHhtbTUsICAgICAgIFtyZHggKyByYXgqMl0gICAgICAgICAgIDsgZTMgZTIgZTEgZTAKKyAgICAgICAgbW92ZCAgICAgICAgeG1tMywgICAgICAgW3JkaSArIHJheCoyXSAgICAgICAgICAgOyBiMyBiMiBiMSBiMAorICAgICAgICBtb3ZkICAgICAgICB4bW03LCAgICAgICBbcmN4ICsgcmF4KjJdICAgICAgICAgICA7IGYzIGYyIGYxIGYwCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsgZTMgZTIgZTEgZTAgYTMgYTIgYTEgYTAKKyAgICAgICAgcHVucGNrbGRxICAgeG1tMywgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgOyBmMyBmMiBmMSBmMCBiMyBiMiBiMSBiMAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgIDsgZDMgYzMgZDIgYzIgZDEgYzEgZDAgYzAgOTMgODMgOTIgODIgOTEgODEgOTAgODAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgOyBmMyBlMyBmMiBlMiBmMSBlMSBmMCBlMCBiMyBhMyBiMiBhMiBiMSBhMSBiMCBhMAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTQKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNCwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBiMyBhMyA5MyA4MyBiMiBhMiA5MiA4MiBiMSBhMSA5MSA4MSBiMCBhMCA5MCA4MAorICAgICAgICBwdW5wY2tod2QgICB4bW03LCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7IGYzIGUzIGQzIGMzIGYyIGUyIGQyIGMyIGYxIGUxIGQxIGMxIGYwIGUwIGQwIGMwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tNAorICAgICAgICBwdW5wY2tsZHEgICB4bW00LCAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICA7IGYxIGUxIGQxIGMxIGIxIGExIDkxIDgxIGYwIGUwIGQwIGMwIGIwIGEwIDkwIDgwCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTYsICAgICAgIHhtbTcgICAgICAgICAgICAgICAgICAgIDsgZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTIKKworICAgICAgICBwdW5wY2tscWRxICB4bW0wLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7IHAxICBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAgICAgICBwdW5wY2tocWRxICB4bW0xLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7IHAwICBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQorICAgICAgICBwdW5wY2tscWRxICB4bW0yLCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7IHEwICBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MiA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorICAgICAgICBwdW5wY2tocWRxICB4bW0zLCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7IHExICBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMworCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgICAgICAgICAgICAgO2JsaW1pdAorCisgICAgICAgIDsgY2FsY3VsYXRlIG1hc2sKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMQorICAgICAgICBwc3VidXNiICAgICB4bW03LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtPXAxCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTYsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMS09cTEKKyAgICAgICAgcG9yICAgICAgICAgeG1tNiwgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKKyAgICAgICAgcGFuZCAgICAgICAgeG1tNiwgICAgICAgW0dMT0JBTCh0ZmUpXSAgICAgICAgICAgICAgICAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KKyAgICAgICAgcHNybHcgICAgICAgeG1tNiwgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsIFtyZHhdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMAorICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICB4bW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDAtPXEwCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTQsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMC09cDAKKyAgICAgICAgcG9yICAgICAgICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQorICAgICAgICBwYWRkdXNiICAgICB4bW01LCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAwLXEwKSoyCisgICAgICAgIHBhZGR1c2IgICAgIHhtbTUsICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgW0dMT0JBTCh0ODApXQorCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gYmxpbWl0CisgICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICB4bW03CisgICAgICAgIHBjbXBlcWIgICAgIHhtbTUsICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSBtYXNrCisKKyAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKKyAgICAgICAgbW92ZHFhICAgICAgICB0MCwgICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgICB0MSwgICAgICAgIHhtbTMKKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBweG9yICAgICAgICB4bW0zLCAgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgICAgICBwc3Vic2IgICAgICB4bW0wLCAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMQorCisgICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgIHhtbTIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG9mZnNldGVkIDsgcTAKKyAgICAgICAgcHN1YnNiICAgICAgeG1tMiwgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwIC0gcDAKKyAgICAgICAgcGFkZHNiICAgICAgeG1tMCwgICAgICAgIHhtbTIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAxICogKHEwIC0gcDApCisgICAgICAgIHBhZGRzYiAgICAgIHhtbTAsICAgICAgICB4bW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMSAtIHExICsgMiAqIChxMCAtIHAwKQorICAgICAgICBwYWRkc2IgICAgICB4bW0wLCAgICAgICAgeG1tMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMSArIDMgKiAocTAgLSBwMCkKKyAgICAgICAgcGFuZCAgICAgICAgeG1tNSwgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgeG1tNQorICAgICAgICBwYWRkc2IgICAgICB4bW01LCAgICAgICAgW0dMT0JBTCh0MyldICAgICAgICAgICAgICAgICAgOyAgMyogKHEwIC0gcDApICsgKHAxIC0gcTEpICsgNAorICAgICAgICBwYWRkc2IgICAgICB4bW0wLCAgICAgICAgW0dMT0JBTCh0NCldICAgICAgICAgICAgICAgICAgOyArMyBpbnN0ZWFkIG9mICs0CisKKyAgICAgICAgbW92ZHFhICB4bW02LCBbR0xPQkFMKHRlMCldCisgICAgICAgIG1vdmRxYSAgeG1tMiwgW0dMT0JBTCh0MWYpXQorCis7ICAgICAgICBweG9yICAgICAgICB4bW03LCB4bW03CisgICAgICAgIHBjbXBndGIgICAgIHhtbTcsIHhtbTAgICAgICAgICAgICAgIDtzYXZlIHNpZ24KKyAgICAgICAgcGFuZCAgICAgICAgeG1tNywgeG1tNiAgICAgICAgICAgICAgO3ByZXNlcnZlIHRoZSB1cHBlciAzIGJpdHMKKyAgICAgICAgcHNybHcgICAgICAgeG1tMCwgMworICAgICAgICBwYW5kICAgICAgICB4bW0wLCB4bW0yICAgICAgICAgICAgICA7Y2xlYXIgb3V0IHVwcGVyIDMgYml0cworICAgICAgICBwb3IgICAgICAgICB4bW0wLCB4bW03ICAgICAgICAgICAgICA7YWRkIHNpZ24KKyAgICAgICAgcHN1YnNiICAgICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgOyBxMC09IHEwc3ogYWRkCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgeG1tNworICAgICAgICBwY21wZ3RiICAgICB4bW03LCB4bW01ICAgICAgICAgICAgICA7c2F2ZSBzaWduCisgICAgICAgIHBhbmQgICAgICAgIHhtbTcsIHhtbTYgICAgICAgICAgICAgIDtwcmVzZXJ2ZSB0aGUgdXBwZXIgMyBiaXRzCisgICAgICAgIHBzcmx3ICAgICAgIHhtbTUsIDMKKyAgICAgICAgcGFuZCAgICAgICAgeG1tNSwgeG1tMiAgICAgICAgICAgICAgO2NsZWFyIG91dCB1cHBlciAzIGJpdHMKKyAgICAgICAgcG9yICAgICAgICAgeG1tNSwgeG1tNyAgICAgICAgICAgICAgO2FkZCBzaWduCisgICAgICAgIHBhZGRzYiAgICAgIHhtbTEsIHhtbTUgICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKKworICAgICAgICBweG9yICAgICAgICB4bW0zLCAgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgIDsgdW5vZmZzZXQgICBxMAorICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgIDsgdW5vZmZzZXQgICBwMAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgICB0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEKKworICAgICAgICA7IHdyaXRlIG91dCBvcmRlcjogeG1tMCB4bW0yIHhtbTEgeG1tMworICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBbcnNpICsgcmF4KjRdCisKKyAgICAgICAgOyB0cmFuc3Bvc2UgYmFjayB0byB3cml0ZSBvdXQKKyAgICAgICAgOyBwMSAgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKyAgICAgICAgOyBwMCAgZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEKKyAgICAgICAgOyBxMCAgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgICAgICAgOyBxMSAgZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAgMzEgMzAgMjEgMjAgMTEgMTAgMDEgMDAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzMgNzIgNjMgNjIgNTMgNTIgNDMgNDIgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICB4bW0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAgMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKKyAgICAgICAgcHVucGNraHdkICAgeG1tMiwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwIDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tNgorICAgICAgICBwdW5wY2tsd2QgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYjMgYjIgYjEgYjAgYTMgYTIgYTEgYTAgOTMgOTIgOTEgOTAgODMgODIgODEgODAKKyAgICAgICAgcHVucGNraHdkICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGYzIGYyIGYxIGYwIGUzIGUyIGUxIGUwIGQzIGQyIGQxIGQwIGMzIGMyIGMxIGMwCisKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaV0sICAgICAgeG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIHRoZSBzZWNvbmQgOC1saW5lIHJlc3VsdAorICAgICAgICBtb3ZkICAgICAgICBbcmR4XSwgICAgICB4bW0zCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgIDQKKyAgICAgICAgcHNybGRxICAgICAgeG1tMywgICAgICAgNAorICAgICAgICBtb3ZkICAgICAgICBbcmRpXSwgICAgICB4bW02CisgICAgICAgIG1vdmQgICAgICAgIFtyY3hdLCAgICAgIHhtbTMKKyAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgNAorICAgICAgICBwc3JsZHEgICAgICB4bW0zLCAgICAgICA0CisgICAgICAgIG1vdmQgICAgICAgIFtyc2kgKyByYXgqMl0sIHhtbTYKKyAgICAgICAgbW92ZCAgICAgICAgW3JkeCArIHJheCoyXSwgeG1tMworICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICA0CisgICAgICAgIHBzcmxkcSAgICAgIHhtbTMsICAgICAgIDQKKyAgICAgICAgbW92ZCAgICAgICAgW3JkaSArIHJheCoyXSwgeG1tNgorICAgICAgICBtb3ZkICAgICAgICBbcmN4ICsgcmF4KjJdLCB4bW0zCisKKyAgICAgICAgbmVnICAgICAgICAgcmF4CisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXgqOF0KKyAgICAgICAgbmVnICAgICAgICAgcmF4CisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdCisgICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyc2kgKyByYXgqNF0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCArIHJheF0KKworICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIHRoZSBmaXJzdCA4LWxpbmUgcmVzdWx0CisgICAgICAgIG1vdmQgICAgICAgIFtyZHhdLCAgICAgIHhtbTIKKyAgICAgICAgcHNybGRxICAgICAgeG1tMCwgICAgICAgNAorICAgICAgICBwc3JsZHEgICAgICB4bW0yLCAgICAgICA0CisgICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgIHhtbTAKKyAgICAgICAgbW92ZCAgICAgICAgW3JjeF0sICAgICAgeG1tMgorICAgICAgICBwc3JsZHEgICAgICB4bW0wLCAgICAgICA0CisgICAgICAgIHBzcmxkcSAgICAgIHhtbTIsICAgICAgIDQKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaSArIHJheCoyXSwgeG1tMAorICAgICAgICBtb3ZkICAgICAgICBbcmR4ICsgcmF4KjJdLCB4bW0yCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTAsICAgICAgIDQKKyAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgNAorICAgICAgICBtb3ZkICAgICAgICBbcmRpICsgcmF4KjJdLCB4bW0wCisgICAgICAgIG1vdmQgICAgICAgIFtyY3ggKyByYXgqMl0sIHhtbTIKKworICAgIGFkZCByc3AsIDMyCisgICAgcG9wIHJzcAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK3RmZToKKyAgICB0aW1lcyAxNiBkYiAweGZlCithbGlnbiAxNgordDgwOgorICAgIHRpbWVzIDE2IGRiIDB4ODAKK2FsaWduIDE2Cit0MXM6CisgICAgdGltZXMgMTYgZGIgMHgwMQorYWxpZ24gMTYKK3QzOgorICAgIHRpbWVzIDE2IGRiIDB4MDMKK2FsaWduIDE2Cit0NDoKKyAgICB0aW1lcyAxNiBkYiAweDA0CithbGlnbiAxNgorb25lczoKKyAgICB0aW1lcyA4IGR3IDB4MDAwMQorYWxpZ24gMTYKK3M5OgorICAgIHRpbWVzIDggZHcgMHgwOTAwCithbGlnbiAxNgorczYzOgorICAgIHRpbWVzIDggZHcgMHgwMDNmCithbGlnbiAxNgordGUwOgorICAgIHRpbWVzIDE2IGRiIDB4ZTAKK2FsaWduIDE2Cit0MWY6CisgICAgdGltZXMgMTYgZGIgMHgxZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmMgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl94ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg2MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vbG9vcGZpbHRlci5oIgorCisjZGVmaW5lIHByb3RvdHlwZV9sb29wZmlsdGVyKHN5bSkgXAorICAgIHZvaWQgc3ltKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHBpdGNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQsXAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbWl0LCBjb25zdCB1bnNpZ25lZCBjaGFyICp0aHJlc2gsIGludCBjb3VudCkKKworI2RlZmluZSBwcm90b3R5cGVfbG9vcGZpbHRlcl9uYyhzeW0pIFwKKyAgICB2b2lkIHN5bSh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBwaXRjaCwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0LFwKKyAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW1pdCwgY29uc3QgdW5zaWduZWQgY2hhciAqdGhyZXNoKQorCisjZGVmaW5lIHByb3RvdHlwZV9zaW1wbGVfbG9vcGZpbHRlcihzeW0pIFwKKyAgICB2b2lkIHN5bSh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KQorCitwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCk7Citwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KTsKK3Byb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCk7Citwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCk7Citwcm90b3R5cGVfc2ltcGxlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14KTsKK3Byb3RvdHlwZV9zaW1wbGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14KTsKKworI2lmIEhBVkVfU1NFMiAmJiBBUkNIX1g4Nl82NAorcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX2J2X3lfc3NlMik7Citwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfYmhfeV9zc2UyKTsKKyNlbHNlCitwcm90b3R5cGVfbG9vcGZpbHRlcl9uYyh2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKTsKK3Byb3RvdHlwZV9sb29wZmlsdGVyX25jKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMik7CisjZW5kaWYKK3Byb3RvdHlwZV9sb29wZmlsdGVyX25jKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2Vfc3NlMik7Citwcm90b3R5cGVfbG9vcGZpbHRlcl9uYyh2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMik7CisKK2V4dGVybiBsb29wX2ZpbHRlcl91dmZ1bmN0aW9uIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfc3NlMjsKK2V4dGVybiBsb29wX2ZpbHRlcl91dmZ1bmN0aW9uIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X3NzZTI7CitleHRlcm4gbG9vcF9maWx0ZXJfdXZmdW5jdGlvbiB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfc3NlMjsKK2V4dGVybiBsb29wX2ZpbHRlcl91dmZ1bmN0aW9uIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMjsKKworI2lmIEhBVkVfTU1YCisvKiBIb3Jpem9udGFsIE1CIGZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX21teCh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgodV9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMSk7CisKKyAgICBpZiAodl9wdHIpCisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgodl9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMSk7Cit9CisKKworLyogVmVydGljYWwgTUIgRmlsdGVyaW5nICovCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZfbW14KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KHVfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDEpOworCisgICAgaWYgKHZfcHRyKQorICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh2X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKworCisvKiBIb3Jpem9udGFsIEIgRmlsdGVyaW5nICovCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9tbXgodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCh5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KHVfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDEpOworCisgICAgaWYgKHZfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCh2X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAxKTsKK30KKworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaHNfbW14KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCBpbnQgeV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCkKK3sKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX21teCh5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGJsaW1pdCk7CisgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14KHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGJsaW1pdCk7Cit9CisKKworLyogVmVydGljYWwgQiBGaWx0ZXJpbmcgKi8KK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X21teCh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKQoreworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDQsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDgsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCAyKTsKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KHVfcHRyICsgNCwgdXZfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDEpOworCisgICAgaWYgKHZfcHRyKQorICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgodl9wdHIgKyA0LCB1dl9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3RociwgMSk7Cit9CisKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX21teCh1bnNpZ25lZCBjaGFyICp5X3B0ciwgaW50IHlfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpCit7CisgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDQsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9tbXgoeV9wdHIgKyA4LCB5X3N0cmlkZSwgYmxpbWl0KTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14KHlfcHRyICsgMTIsIHlfc3RyaWRlLCBibGltaXQpOworfQorI2VuZGlmCisKKworLyogSG9yaXpvbnRhbCBNQiBmaWx0ZXJpbmcgKi8KKyNpZiBIQVZFX1NTRTIKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMih5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIpOworCisgICAgaWYgKHVfcHRyKQorICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfc3NlMih1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCB2X3B0cik7Cit9CisKKworLyogVmVydGljYWwgTUIgRmlsdGVyaW5nICovCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZfc3NlMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCit7CisgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3Rocik7CisKKyAgICBpZiAodV9wdHIpCisgICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMih1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCB2X3B0cik7Cit9CisKKworLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfc3NlMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyNpZiBBUkNIX1g4Nl82NAorICAgIHZwOF9sb29wX2ZpbHRlcl9iaF95X3NzZTIoeV9wdHIsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworI2Vsc2UKKyAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIpOworICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMih5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3Rocik7CisgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9zc2UyKHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3Rocik7CisjZW5kaWYKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyKHVfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIHZfcHRyICsgNCAqIHV2X3N0cmlkZSk7Cit9CisKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhzX3NzZTIodW5zaWduZWQgY2hhciAqeV9wdHIsIGludCB5X3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KQoreworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgYmxpbWl0KTsKK30KKworCisvKiBWZXJ0aWNhbCBCIEZpbHRlcmluZyAqLwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfc3NlMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKK3sKKyNpZiBBUkNIX1g4Nl82NAorICAgIHZwOF9sb29wX2ZpbHRlcl9idl95X3NzZTIoeV9wdHIsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIsIDIpOworI2Vsc2UKKyAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgNCwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3Rocik7CisgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2Vfc3NlMih5X3B0ciArIDgsIHlfc3RyaWRlLCBsZmktPmJsaW0sIGxmaS0+bGltLCBsZmktPmhldl90aHIpOworICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGxmaS0+YmxpbSwgbGZpLT5saW0sIGxmaS0+aGV2X3Rocik7CisjZW5kaWYKKworICAgIGlmICh1X3B0cikKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMih1X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5ibGltLCBsZmktPmxpbSwgbGZpLT5oZXZfdGhyLCB2X3B0ciArIDQpOworfQorCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2c19zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCBpbnQgeV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCkKK3sKKyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMih5X3B0ciArIDQsIHlfc3RyaWRlLCBibGltaXQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgOCwgeV9zdHJpZGUsIGJsaW1pdCk7CisgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGJsaW1pdCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L21mcWVfc3NlMi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvbWZxZV9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQyMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L21mcWVfc3NlMi5hc20KQEAgLTAsMCArMSwyODEgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworO3ZvaWQgdnA4X2ZpbHRlcl9ieV93ZWlnaHQxNngxNl9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmMsCis7ICAgIGludCAgICAgICAgICAgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50ICAgICAgICAgICAgZHN0X3N0cmlkZSwKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3dlaWdodAorOykKK2dsb2JhbCBzeW0odnA4X2ZpbHRlcl9ieV93ZWlnaHQxNngxNl9zc2UyKSBQUklWQVRFCitzeW0odnA4X2ZpbHRlcl9ieV93ZWlnaHQxNngxNl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBTQVZFX1hNTSA2CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3ZkICAgICAgICB4bW0wLCBhcmcoNCkgICAgICAgICAgICAgICAgOyBzcmNfd2VpZ2h0CisgICAgcHNodWZsdyAgICAgeG1tMCwgeG1tMCwgMHgwICAgICAgICAgICAgIDsgcmVwbGljYXRlIHRvIGFsbCBsb3cgd29yZHMKKyAgICBwdW5wY2tscWRxICB4bW0wLCB4bW0wICAgICAgICAgICAgICAgICAgOyByZXBsaWNhdGUgdG8gYWxsIGhpIHdvcmRzCisKKyAgICBtb3ZkcWEgICAgICB4bW0xLCBbR0xPQkFMKHRNRlFFKV0KKyAgICBwc3VidyAgICAgICB4bW0xLCB4bW0wICAgICAgICAgICAgICAgICAgOyBkc3Rfd2VpZ2h0CisKKyAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSAgICAgICAgICAgICAgICAgOyBzcmMKKyAgICBtb3YgICAgICAgICByc2ksIGFyZygxKSAgICAgICAgICAgICAgICAgOyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMikgICAgICAgICAgICAgICAgIDsgZHN0CisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMykgICAgICAgICAgICAgICAgIDsgZHN0X3N0cmlkZQorCisgICAgbW92ICAgICAgICAgcmN4LCAxNiAgICAgICAgICAgICAgICAgICAgIDsgbG9vcCBjb3VudAorICAgIHB4b3IgICAgICAgIHhtbTYsIHhtbTYKKworLmNvbWJpbmUKKyAgICBtb3ZkcWEgICAgICB4bW0yLCBbcmF4XQorICAgIG1vdmRxYSAgICAgIHhtbTQsIFtyZHhdCisgICAgYWRkICAgICAgICAgcmF4LCByc2kKKworICAgIDsgc3JjICogc3JjX3dlaWdodAorICAgIG1vdmRxYSAgICAgIHhtbTMsIHhtbTIKKyAgICBwdW5wY2tsYncgICB4bW0yLCB4bW02CisgICAgcHVucGNraGJ3ICAgeG1tMywgeG1tNgorICAgIHBtdWxsdyAgICAgIHhtbTIsIHhtbTAKKyAgICBwbXVsbHcgICAgICB4bW0zLCB4bW0wCisKKyAgICA7IGRzdCAqIGRzdF93ZWlnaHQKKyAgICBtb3ZkcWEgICAgICB4bW01LCB4bW00CisgICAgcHVucGNrbGJ3ICAgeG1tNCwgeG1tNgorICAgIHB1bnBja2hidyAgIHhtbTUsIHhtbTYKKyAgICBwbXVsbHcgICAgICB4bW00LCB4bW0xCisgICAgcG11bGx3ICAgICAgeG1tNSwgeG1tMQorCisgICAgOyBzdW0sIHJvdW5kIGFuZCBzaGlmdAorICAgIHBhZGR3ICAgICAgIHhtbTIsIHhtbTQKKyAgICBwYWRkdyAgICAgICB4bW0zLCB4bW01CisgICAgcGFkZHcgICAgICAgeG1tMiwgW0dMT0JBTCh0TUZRRV9yb3VuZCldCisgICAgcGFkZHcgICAgICAgeG1tMywgW0dMT0JBTCh0TUZRRV9yb3VuZCldCisgICAgcHNybHcgICAgICAgeG1tMiwgNAorICAgIHBzcmx3ICAgICAgIHhtbTMsIDQKKworICAgIHBhY2t1c3diICAgIHhtbTIsIHhtbTMKKyAgICBtb3ZkcWEgICAgICBbcmR4XSwgeG1tMgorICAgIGFkZCAgICAgICAgIHJkeCwgcmRpCisKKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAuY29tYmluZQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorCisgICAgcmV0CisKKzt2b2lkIHZwOF9maWx0ZXJfYnlfd2VpZ2h0OHg4X3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKKzsgICAgaW50ICAgICAgICAgICAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgICAgICAgICAgICBkc3Rfc3RyaWRlLAorOyAgICBpbnQgICAgICAgICAgICBzcmNfd2VpZ2h0Cis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2J5X3dlaWdodDh4OF9zc2UyKSBQUklWQVRFCitzeW0odnA4X2ZpbHRlcl9ieV93ZWlnaHQ4eDhfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3ZkICAgICAgICB4bW0wLCBhcmcoNCkgICAgICAgICAgICAgICAgOyBzcmNfd2VpZ2h0CisgICAgcHNodWZsdyAgICAgeG1tMCwgeG1tMCwgMHgwICAgICAgICAgICAgIDsgcmVwbGljYXRlIHRvIGFsbCBsb3cgd29yZHMKKyAgICBwdW5wY2tscWRxICB4bW0wLCB4bW0wICAgICAgICAgICAgICAgICAgOyByZXBsaWNhdGUgdG8gYWxsIGhpIHdvcmRzCisKKyAgICBtb3ZkcWEgICAgICB4bW0xLCBbR0xPQkFMKHRNRlFFKV0KKyAgICBwc3VidyAgICAgICB4bW0xLCB4bW0wICAgICAgICAgICAgICAgICAgOyBkc3Rfd2VpZ2h0CisKKyAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSAgICAgICAgICAgICAgICAgOyBzcmMKKyAgICBtb3YgICAgICAgICByc2ksIGFyZygxKSAgICAgICAgICAgICAgICAgOyBzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMikgICAgICAgICAgICAgICAgIDsgZHN0CisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMykgICAgICAgICAgICAgICAgIDsgZHN0X3N0cmlkZQorCisgICAgbW92ICAgICAgICAgcmN4LCA4ICAgICAgICAgICAgICAgICAgICAgIDsgbG9vcCBjb3VudAorICAgIHB4b3IgICAgICAgIHhtbTQsIHhtbTQKKworLmNvbWJpbmUKKyAgICBtb3ZxICAgICAgICB4bW0yLCBbcmF4XQorICAgIG1vdnEgICAgICAgIHhtbTMsIFtyZHhdCisgICAgYWRkICAgICAgICAgcmF4LCByc2kKKworICAgIDsgc3JjICogc3JjX3dlaWdodAorICAgIHB1bnBja2xidyAgIHhtbTIsIHhtbTQKKyAgICBwbXVsbHcgICAgICB4bW0yLCB4bW0wCisKKyAgICA7IGRzdCAqIGRzdF93ZWlnaHQKKyAgICBwdW5wY2tsYncgICB4bW0zLCB4bW00CisgICAgcG11bGx3ICAgICAgeG1tMywgeG1tMQorCisgICAgOyBzdW0sIHJvdW5kIGFuZCBzaGlmdAorICAgIHBhZGR3ICAgICAgIHhtbTIsIHhtbTMKKyAgICBwYWRkdyAgICAgICB4bW0yLCBbR0xPQkFMKHRNRlFFX3JvdW5kKV0KKyAgICBwc3JsdyAgICAgICB4bW0yLCA0CisKKyAgICBwYWNrdXN3YiAgICB4bW0yLCB4bW00CisgICAgbW92cSAgICAgICAgW3JkeF0sIHhtbTIKKyAgICBhZGQgICAgICAgICByZHgsIHJkaQorCisgICAgZGVjICAgICAgICAgcmN4CisgICAgam56ICAgICAgICAgLmNvbWJpbmUKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisKKyAgICByZXQKKworO3ZvaWQgdnA4X3ZhcmlhbmNlX2FuZF9zYWRfMTZ4MTZfc3NlMiB8IGFyZworOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjMSwgICAgICAgICAgMAorOyAgICBpbnQgICAgICAgICAgICBzdHJpZGUxLCAgICAgICAxCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyYzIsICAgICAgICAgIDIKKzsgICAgaW50ICAgICAgICAgICAgc3RyaWRlMiwgICAgICAgMworOyAgICB1bnNpZ25lZCBpbnQgICp2YXJpYW5jZSwgICAgICA0Cis7ICAgIHVuc2lnbmVkIGludCAgKnNhZCwgICAgICAgICAgIDUKKzspCitnbG9iYWwgc3ltKHZwOF92YXJpYW5jZV9hbmRfc2FkXzE2eDE2X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfdmFyaWFuY2VfYW5kX3NhZF8xNngxNl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZygwKSAgICAgICAgICA7IHNyYzEKKyAgICBtb3YgICAgICAgICByY3gsICAgICAgICBhcmcoMSkgICAgICAgICAgOyBzdHJpZGUxCisgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDIpICAgICAgICAgIDsgc3JjMgorICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygzKSAgICAgICAgICA7IHN0cmlkZTIKKworICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIDE2ICAgICAgICAgICAgICA7IGJsb2NrIGhlaWdodAorCisgICAgOyBQcmVwIGFjY3VtdWxhdG9yIHJlZ2lzdGVycworICAgIHB4b3IgICAgICAgIHhtbTMsIHhtbTMgICAgICAgICAgICAgICAgICA7IFNBRAorICAgIHB4b3IgICAgICAgIHhtbTQsIHhtbTQgICAgICAgICAgICAgICAgICA7IHN1bSBvZiBzcmMyCisgICAgcHhvciAgICAgICAgeG1tNSwgeG1tNSAgICAgICAgICAgICAgICAgIDsgc3VtIG9mIHNyYzJeMgorCisgICAgOyBCZWNhdXNlIHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgYWN0dWFsIG91dHB1dCBmcmFtZXMKKyAgICA7IHdlIGNhbid0IGRlcGVuZCBvbiBhbnkga2luZCBvZiBkYXRhIGFsaWdubWVudC4KKy5hY2N1bXVsYXRlCisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JheF0gICAgICAgICAgICAgICAgIDsgc3JjMQorICAgIG1vdmRxYSAgICAgIHhtbTEsIFtyZHhdICAgICAgICAgICAgICAgICA7IHNyYzIKKyAgICBhZGQgICAgICAgICByYXgsIHJjeCAgICAgICAgICAgICAgICAgICAgOyBzcmMxICsgc3RyaWRlMQorICAgIGFkZCAgICAgICAgIHJkeCwgcmRpICAgICAgICAgICAgICAgICAgICA7IHNyYzIgKyBzdHJpZGUyCisKKyAgICA7IFNBRChzcmMxLCBzcmMyKQorICAgIHBzYWRidyAgICAgIHhtbTAsIHhtbTEKKyAgICBwYWRkdXN3ICAgICB4bW0zLCB4bW0wCisKKyAgICA7IFNVTShzcmMyKQorICAgIHB4b3IgICAgICAgIHhtbTIsIHhtbTIKKyAgICBwc2FkYncgICAgICB4bW0yLCB4bW0xICAgICAgICAgICAgICAgICAgOyBzdW0gc3JjMiBieSBtaXN1c2luZyBTQUQgYWdhaW5zdCAwCisgICAgcGFkZHVzdyAgICAgeG1tNCwgeG1tMgorCisgICAgOyBwbWFkZHVic3cgd291bGQgYmUgaWRlYWwgaWYgaXQgdG9vayB0d28gdW5zaWduZWQgdmFsdWVzLiBpbnN0ZWFkLAorICAgIDsgaXQgZXhwZWN0cyBhIHNpZ25lZCBhbmQgYW4gdW5zaWduZWQgdmFsdWUuIHNvIGluc3RlYWQgd2UgemVybyBleHRlbmQKKyAgICA7IGFuZCBvcGVyYXRlIG9uIHdvcmRzLgorICAgIHB4b3IgICAgICAgIHhtbTIsIHhtbTIKKyAgICBtb3ZkcWEgICAgICB4bW0wLCB4bW0xCisgICAgcHVucGNrbGJ3ICAgeG1tMCwgeG1tMgorICAgIHB1bnBja2hidyAgIHhtbTEsIHhtbTIKKyAgICBwbWFkZHdkICAgICB4bW0wLCB4bW0wCisgICAgcG1hZGR3ZCAgICAgeG1tMSwgeG1tMQorICAgIHBhZGRkICAgICAgIHhtbTUsIHhtbTAKKyAgICBwYWRkZCAgICAgICB4bW01LCB4bW0xCisKKyAgICBzdWIgICAgICAgICByc2ksICAgICAgICAxCisgICAgam56ICAgICAgICAgLmFjY3VtdWxhdGUKKworICAgIDsgcGhhZGRkIG9ubHkgb3BlcmF0ZXMgb24gYWRqYWNlbnQgZG91YmxlIHdvcmRzLgorICAgIDsgRmluYWxpemUgU0FEIGFuZCBzdG9yZQorICAgIG1vdmRxYSAgICAgIHhtbTAsIHhtbTMKKyAgICBwc3JsZHEgICAgICB4bW0wLCA4CisgICAgcGFkZHVzdyAgICAgeG1tMCwgeG1tMworICAgIHBhZGRkICAgICAgIHhtbTAsIFtHTE9CQUwodDEyOCldCisgICAgcHNybGQgICAgICAgeG1tMCwgOAorCisgICAgbW92ICAgICAgICAgcmF4LCAgYXJnKDUpCisgICAgbW92ZCAgICAgICAgW3JheF0sIHhtbTAKKworICAgIDsgQWNjdW11bGF0ZSBzdW0gb2Ygc3JjMgorICAgIG1vdmRxYSAgICAgIHhtbTAsIHhtbTQKKyAgICBwc3JsZHEgICAgICB4bW0wLCA4CisgICAgcGFkZHVzdyAgICAgeG1tMCwgeG1tNAorICAgIDsgU3F1YXJlIHNyYzIuIElnbm9yZSBoaWdoIHZhbHVlCisgICAgcG11bHVkcSAgICAgeG1tMCwgeG1tMAorICAgIHBzcmxkICAgICAgIHhtbTAsIDgKKworICAgIDsgcGhhZGR3IGNvdWxkIGJlIHVzZWQgdG8gc3VtIGFkamFjZW50IHZhbHVlcyBidXQgd2Ugd2FudAorICAgIDsgYWxsIHRoZSB2YWx1ZXMgc3VtbWVkLiBwcm9tb3RlIHRvIGRvdWJsZXMsIGFjY3VtdWxhdGUsCisgICAgOyBzaGlmdCBhbmQgc3VtCisgICAgcHhvciAgICAgICAgeG1tMiwgeG1tMgorICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTUKKyAgICBwdW5wY2tsZHEgICB4bW0xLCB4bW0yCisgICAgcHVucGNraGRxICAgeG1tNSwgeG1tMgorICAgIHBhZGRkICAgICAgIHhtbTEsIHhtbTUKKyAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0xCisgICAgcHNybGRxICAgICAgeG1tMSwgOAorICAgIHBhZGRkICAgICAgIHhtbTEsIHhtbTIKKworICAgIHBzdWJkICAgICAgIHhtbTEsIHhtbTAKKworICAgIDsgKHZhcmlhbmNlICsgMTI4KSA+PiA4CisgICAgcGFkZGQgICAgICAgeG1tMSwgW0dMT0JBTCh0MTI4KV0KKyAgICBwc3JsZCAgICAgICB4bW0xLCA4CisgICAgbW92ICAgICAgICAgcmF4LCAgYXJnKDQpCisKKyAgICBtb3ZkICAgICAgICBbcmF4XSwgeG1tMQorCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK3QxMjg6CisgICAgZGRxIDEyOAorYWxpZ24gMTYKK3RNRlFFOiA7IDEgPDwgTUZRRV9QUkVDSVNJT04KKyAgICB0aW1lcyA4IGR3IDB4MTAKK2FsaWduIDE2Cit0TUZRRV9yb3VuZDogOyAxIDw8IChNRlFFX1BSRUNJU0lPTiAtIDEpCisgICAgdGltZXMgOCBkdyAweDA4CisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9wb3N0cHJvY19tbXguYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX21teC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2YzU4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9wb3N0cHJvY19tbXguYXNtCkBAIC0wLDAgKzEsMzE0IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKyVkZWZpbmUgVlA4X0ZJTFRFUl9XRUlHSFQgMTI4CislZGVmaW5lIFZQOF9GSUxURVJfU0hJRlQgIDcKKworO3ZvaWQgdnA4X21icG9zdF9wcm9jX2Rvd25fbW14KHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLGludCBmbGltaXQpCitleHRlcm4gc3ltKHZwOF9ydikKK2dsb2JhbCBzeW0odnA4X21icG9zdF9wcm9jX2Rvd25fbW14KSBQUklWQVRFCitzeW0odnA4X21icG9zdF9wcm9jX2Rvd25fbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICBzdWIgICAgICAgICByc3AsIDEzNgorCisgICAgOyB1bnNpZ25lZCBjaGFyIGRbMTZdWzhdIGF0IFtyc3BdCisgICAgOyBjcmVhdGUgZmxpbWl0MiBhdCBbcnNwKzEyOF0KKyAgICBtb3YgICAgICAgICBlYXgsIGR3b3JkIHB0ciBhcmcoNCkgO2ZsaW1pdAorICAgIG1vdiAgICAgICAgIFtyc3ArMTI4XSwgZWF4CisgICAgbW92ICAgICAgICAgW3JzcCsxMjgrNF0sIGVheAorJWRlZmluZSBmbGltaXQyIFtyc3ArMTI4XQorCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICBsZWEgICAgICAgICByOCwgICAgICAgW0dMT0JBTChzeW0odnA4X3J2KSldCislZW5kaWYKKworICAgIDtyb3dzICs9ODsKKyAgICBhZGQgICAgICAgICBkd29yZCBwdHIgYXJnKDIpLCA4CisKKyAgICA7Zm9yKGM9MDsgYzxjb2xzOyBjKz00KQorLmxvb3BfY29sOgorICAgICAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICA7cworICAgICAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgbW0wICAgICA7CisKKyAgICAgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3BpdGNoICAgICAgIDsKKworICAgICAgICAgICAgOyB0aGlzIGNvcGllcyB0aGUgbGFzdCByb3cgZG93biBpbnRvIHRoZSBib3JkZXIgOCByb3dzCisgICAgICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICByc2kKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygyKQorICAgICAgICAgICAgc3ViICAgICAgICAgcmR4LCAgICAgICAgOQorICAgICAgICAgICAgaW11bCAgICAgICAgcmR4LCAgICAgICAgcmF4CisgICAgICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeF0KKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIHB0cltyZGldICAgICAgICAgICAgICA7IGZpcnN0IHJvdworICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgOAorLmluaXRfYm9yZGVyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGluaXRpYWxpemUgYm9yZGVycworICAgICAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIHJheF0KKyAgICAgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTEKKworICAgICAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgICAgICBqbmUgICAgICAgICAuaW5pdF9ib3JkZXJkCisKKyAgICAgICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHJheCA9IC1waXRjaAorCisgICAgICAgICAgICA7IHRoaXMgY29waWVzIHRoZSBmaXJzdCByb3cgdXAgaW50byB0aGUgYm9yZGVyIDggcm93cworICAgICAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgcnNpCisgICAgICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBRV09SRCBwdHJbcmRpXSAgICAgICAgICAgICAgOyBmaXJzdCByb3cKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIDgKKy5pbml0X2JvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGluaXRpYWxpemUgYm9yZGVycworICAgICAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIHJheF0KKyAgICAgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMQorCisgICAgICAgICAgICBkZWMgICAgICAgICByY3gKKyAgICAgICAgICAgIGpuZSAgICAgICAgIC5pbml0X2JvcmRlcgorCisKKyAgICAgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXgqOF07ICAgICAgICAgICAgICA7IHJkaSA9IHNbLXBpdGNoKjhdCisgICAgICAgICAgICBuZWcgICAgICAgICByYXgKKworCisgICAgICAgICAgICBweG9yICAgICAgICBtbTUsICAgICAgICBtbTUKKyAgICAgICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgIG1tNiAgICAgOworCisgICAgICAgICAgICBweG9yICAgICAgICBtbTcsICAgICAgICBtbTcgICAgIDsKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIHJzaQorCisgICAgICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAxNSAgICAgICAgICA7CisKKy5sb29wX2luaXR2YXI6CisgICAgICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3JkaV07CisgICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTAgICAgIDsKKworICAgICAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgbW0xICAgICA7CisgICAgICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTEgICAgIDsKKworICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xICAgICA7CisgICAgICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTAgICAgIDsKKworICAgICAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgbW0wICAgICA7CisgICAgICAgICAgICBwYWRkZCAgICAgICBtbTYsICAgICAgICBtbTEgICAgIDsKKworICAgICAgICAgICAgcGFkZGQgICAgICAgbW03LCAgICAgICAgbW0yICAgICA7CisgICAgICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JheF0gICA7CisKKyAgICAgICAgICAgIGRlYyAgICAgICAgIHJjeAorICAgICAgICAgICAgam5lICAgICAgICAgLmxvb3BfaW5pdHZhcgorICAgICAgICAgICAgO3NhdmUgdGhlIHZhciBhbmQgc3VtCisgICAgICAgICAgICB4b3IgICAgICAgICByZHgsICAgICAgICByZHgKKy5sb29wX3JvdzoKKyAgICAgICAgICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbcnNpXSAgICAgOyBbcy1waXRjaCo4XQorICAgICAgICAgICAgbW92ZCAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyZGldICAgICA7IFtzK3BpdGNoKjddCisKKyAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tMAorICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICAgICAgbW0wCisKKyAgICAgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgIG1tMgorICAgICAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW0xCisKKyAgICAgICAgICAgIHBtdWxsdyAgICAgIG1tMiwgICAgICAgIG1tMgorICAgICAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0yCisKKyAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tMAorICAgICAgICAgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgbW0wCisKKyAgICAgICAgICAgIHBhZGRkICAgICAgIG1tNiwgICAgICAgIG1tMgorICAgICAgICAgICAgcGFkZGQgICAgICAgbW03LCAgICAgICAgbW00CisKKyAgICAgICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tMQorICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xCisKKyAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tMAorICAgICAgICAgICAgcHN1YmQgICAgICAgbW02LCAgICAgICAgbW0xCisKKyAgICAgICAgICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgIG1tMAorICAgICAgICAgICAgcHN1YmQgICAgICAgbW03LCAgICAgICAgbW0yCisKKworICAgICAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW02CisgICAgICAgICAgICBwc2xsZCAgICAgICBtbTMsICAgICAgICA0CisKKyAgICAgICAgICAgIHBzdWJkICAgICAgIG1tMywgICAgICAgIG1tNgorICAgICAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW01CisKKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tNQorICAgICAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICAgICAgbW0xCisKKyAgICAgICAgICAgIHBtdWxodyAgICAgIG1tNCwgICAgICAgIG1tNAorICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xCisKKyAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tNAorICAgICAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgbW00CisKKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tNworICAgICAgICAgICAgcHNsbGQgICAgICAgbW00LCAgICAgICAgNAorCisgICAgICAgICAgICBwc3ViZCAgICAgICBtbTQsICAgICAgICBtbTcKKworICAgICAgICAgICAgcHN1YmQgICAgICAgbW0zLCAgICAgICAgbW0xCisgICAgICAgICAgICBwc3ViZCAgICAgICBtbTQsICAgICAgICBtbTIKKworICAgICAgICAgICAgcHN1YmQgICAgICAgbW0zLCAgICAgICAgZmxpbWl0MgorICAgICAgICAgICAgcHN1YmQgICAgICAgbW00LCAgICAgICAgZmxpbWl0MgorCisgICAgICAgICAgICBwc3JhZCAgICAgICBtbTMsICAgICAgICAzMQorICAgICAgICAgICAgcHNyYWQgICAgICAgbW00LCAgICAgICAgMzEKKworICAgICAgICAgICAgcGFja3NzZHcgICAgbW0zLCAgICAgICAgbW00CisgICAgICAgICAgICBwYWNrc3N3YiAgICBtbTMsICAgICAgICBtbTAKKworICAgICAgICAgICAgbW92ZCAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyc2krcmF4KjhdCisKKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMQorICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgbW0wCisKKyAgICAgICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIG1tNQorICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgcmR4CisKKyAgICAgICAgICAgIGFuZCAgICAgICAgIHJjeCwgICAgICAgIDEyNworJWlmIEFCSV9JU18zMkJJVD0xICYmIENPTkZJR19QSUM9MQorICAgICAgICAgICAgcHVzaCAgICAgICAgcmF4CisgICAgICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbR0xPQkFMKHN5bSh2cDhfcnYpKV0KKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyYXggKyByY3gqMl0gO3ZwOF9ydltyY3gqMl0KKyAgICAgICAgICAgIHBvcCAgICAgICAgIHJheAorJWVsaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyOCArIHJjeCoyXSA7dnA4X3J2W3JjeCoyXQorJWVsc2UKKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtzeW0odnA4X3J2KSArIHJjeCoyXQorJWVuZGlmCisgICAgICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTQKKyAgICAgICAgICAgIDtwYWRkdyAgICAgeG1tMSwgICAgICAgZWlnaHQ4cworICAgICAgICAgICAgcHNyYXcgICAgICAgbW0xLCAgICAgICAgNAorCisgICAgICAgICAgICBwYWNrdXN3YiAgICBtbTEsICAgICAgICBtbTAKKyAgICAgICAgICAgIHBhbmQgICAgICAgIG1tMSwgICAgICAgIG1tMworCisgICAgICAgICAgICBwYW5kbiAgICAgICBtbTMsICAgICAgICBtbTIKKyAgICAgICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgICAgIG1tMworCisgICAgICAgICAgICBhbmQgICAgICAgICByY3gsICAgICAgICAxNQorICAgICAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSICAgW3JzcCtyY3gqNF0sIG1tMSA7ZFtyY3gqNF0KKworICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgcmR4CisgICAgICAgICAgICBzdWIgICAgICAgICByY3gsICAgICAgICA4CisKKyAgICAgICAgICAgIGFuZCAgICAgICAgIHJjeCwgICAgICAgIDE1CisgICAgICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3JzcCtyY3gqNF0gO2RbcmN4KjRdCisKKyAgICAgICAgICAgIG1vdmQgICAgICAgIFtyc2ldLCAgICAgIG1tMQorICAgICAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXhdCisKKyAgICAgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmF4XQorICAgICAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgMQorCisgICAgICAgICAgICBjbXAgICAgICAgICBlZHgsICAgICAgICBkd29yZCBhcmcoMikgO3Jvd3MKKyAgICAgICAgICAgIGpsICAgICAgICAgIC5sb29wX3JvdworCisKKyAgICAgICAgYWRkICAgICAgICAgZHdvcmQgYXJnKDApLCA0IDsgcyArPSA0CisgICAgICAgIHN1YiAgICAgICAgIGR3b3JkIGFyZygzKSwgNCA7IGNvbHMgLT0gNAorICAgICAgICBjbXAgICAgICAgICBkd29yZCBhcmcoMyksIDAKKyAgICAgICAgamcgICAgICAgICAgLmxvb3BfY29sCisKKyAgICBhZGQgICAgICAgICByc3AsIDEzNgorICAgIHBvcCAgICAgICAgIHJzcAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorJXVuZGVmIGZsaW1pdDIKKworCis7dm9pZCB2cDhfcGxhbmVfYWRkX25vaXNlX21teCAodW5zaWduZWQgY2hhciAqU3RhcnQsIHVuc2lnbmVkIGNoYXIgKm5vaXNlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJsYWNrY2xhbXBbMTZdLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHdoaXRlY2xhbXBbMTZdLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJvdGhjbGFtcFsxNl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBXaWR0aCwgdW5zaWduZWQgaW50IEhlaWdodCwgaW50IFBpdGNoKQorZXh0ZXJuIHN5bShyYW5kKQorZ2xvYmFsIHN5bSh2cDhfcGxhbmVfYWRkX25vaXNlX21teCkgUFJJVkFURQorc3ltKHZwOF9wbGFuZV9hZGRfbm9pc2VfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworLmFkZG5vaXNlX2xvb3A6CisgICAgY2FsbCBzeW0ocmFuZCkgV1JUX1BMVAorICAgIG1vdiAgICAgcmN4LCBhcmcoMSkgO25vaXNlCisgICAgYW5kICAgICByYXgsIDB4ZmYKKyAgICBhZGQgICAgIHJjeCwgcmF4CisKKyAgICA7IHdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGUgY2xhbXBpbmcgdmVjdG9ycyBhcmUgc3RvcmVkIGNvbnRpZ3VvdXNseQorICAgIDsgaW4gYmxhY2svd2hpdGUvYm90aCBvcmRlci4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gcmVsb2FkIHRoaXMgaGVyZSBiZWNhdXNlCisgICAgOyByZHggY291bGQgYmUgdHJhc2hlZCBieSByYW5kKCkKKyAgICBtb3YgICAgIHJkeCwgYXJnKDIpIDsgYmxhY2tjbGFtcAorCisKKyAgICAgICAgICAgIG1vdiAgICAgcmRpLCByY3gKKyAgICAgICAgICAgIG1vdnN4ZCAgcmN4LCBkd29yZCBhcmcoNSkgO1tXaWR0aF0KKyAgICAgICAgICAgIG1vdiAgICAgcnNpLCBhcmcoMCkgO1BvcworICAgICAgICAgICAgeG9yICAgICAgICAgcmF4LHJheAorCisuYWRkbm9pc2VfbmV4dHNldDoKKyAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMSxbcnNpK3JheF0gICAgICAgICA7IGdldCB0aGUgc291cmNlCisKKyAgICAgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgW3JkeF0gICAgO2JsYWNrY2xhbXAgICAgICAgIDsgY2xhbXAgYm90aCBzaWRlcyBzbyB3ZSBkb24ndCBvdXRyYW5nZSBhZGRpbmcgbm9pc2UKKyAgICAgICAgICAgIHBhZGR1c2IgICAgIG1tMSwgW3JkeCszMl0gO2JvdGhjbGFtcAorICAgICAgICAgICAgcHN1YnVzYiAgICAgbW0xLCBbcmR4KzE2XSA7d2hpdGVjbGFtcAorCisgICAgICAgICAgICBtb3ZxICAgICAgICBtbTIsW3JkaStyYXhdICAgICAgICAgOyBnZXQgdGhlIG5vaXNlIGZvciB0aGlzIGxpbmUKKyAgICAgICAgICAgIHBhZGRiICAgICAgIG1tMSxtbTIgICAgICAgICAgICAgIDsgYWRkIGl0IGluCisgICAgICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JheF0sbW0xICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0CisKKyAgICAgICAgICAgIGFkZCAgICAgICAgIHJheCw4ICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gdGhlIG5leHQgbGluZQorCisgICAgICAgICAgICBjbXAgICAgICAgICByYXgsIHJjeAorICAgICAgICAgICAgamwgICAgICAgICAgLmFkZG5vaXNlX25leHRzZXQKKworICAgIG1vdnN4ZCAgcmF4LCBkd29yZCBhcmcoNykgOyBQaXRjaAorICAgIGFkZCAgICAgYXJnKDApLCByYXggOyBTdGFydCArPSBQaXRjaAorICAgIHN1YiAgICAgZHdvcmQgYXJnKDYpLCAxICAgOyBIZWlnaHQgLT0gMQorICAgIGpnICAgICAgLmFkZG5vaXNlX2xvb3AKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK0JsdXI6CisgICAgdGltZXMgMTYgZHcgMTYKKyAgICB0aW1lcyAgOCBkdyA2NAorICAgIHRpbWVzIDE2IGR3IDE2CisgICAgdGltZXMgIDggZHcgIDAKKworcmQ6CisgICAgdGltZXMgNCBkdyAweDQwCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvcG9zdHByb2Nfc3NlMi5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvcG9zdHByb2Nfc3NlMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmODRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9wb3N0cHJvY19zc2UyLmFzbQpAQCAtMCwwICsxLDcyMSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7bWFjcm8gaW4gZGVibG9jayBmdW5jdGlvbnMKKyVtYWNybyBGSVJTVF8yX1JPV1MgMAorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMQorICAgICAgICBwYXZnYiAgICAgICB4bW01LCAgICAgICB4bW0zCisKKyAgICAgICAgO2NhbGN1bGF0ZSBhYnNvbHV0ZSB2YWx1ZQorICAgICAgICBwc3VidXNiICAgICB4bW00LCAgICAgICB4bW0xCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgIHhtbTAKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNiwgICAgICAgeG1tMworICAgICAgICBwc3VidXNiICAgICB4bW0zLCAgICAgICB4bW0wCisgICAgICAgIHBhZGR1c2IgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHVzYiAgICAgeG1tNiwgICAgICAgeG1tMworCisgICAgICAgIDtnZXQgdGhyZXNob2xkCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIGZsaW1pdAorICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTIKKworICAgICAgICA7Z2V0IG1hc2sKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tMiwgICAgICAgeG1tNAorICAgICAgICBwc3VidXNiICAgICB4bW03LCAgICAgICB4bW02CisgICAgICAgIHBjbXBlcWIgICAgIHhtbTIsICAgICAgIHhtbTEKKyAgICAgICAgcGNtcGVxYiAgICAgeG1tNywgICAgICAgeG1tMQorICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICB4bW0yCislZW5kbWFjcm8KKworJW1hY3JvIFNFQ09ORF8yX1JPV1MgMAorICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMQorICAgICAgICBwYXZnYiAgICAgICB4bW0xLCAgICAgICB4bW0zCisKKyAgICAgICAgO2NhbGN1bGF0ZSBhYnNvbHV0ZSB2YWx1ZQorICAgICAgICBwc3VidXNiICAgICB4bW02LCAgICAgICB4bW0yCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgICAgICAgeG1tMworICAgICAgICBwc3VidXNiICAgICB4bW0zLCAgICAgICB4bW0wCisgICAgICAgIHBhZGR1c2IgICAgIHhtbTYsICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHVzYiAgICAgeG1tNCwgICAgICAgeG1tMworCisgICAgICAgIHBhdmdiICAgICAgIHhtbTUsICAgICAgIHhtbTEKKworICAgICAgICA7Z2V0IHRocmVzaG9sZAorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBmbGltaXQKKyAgICAgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICB4bW0yCisKKyAgICAgICAgO2dldCBtYXNrCisgICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgIHhtbTYKKyAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgeG1tNAorICAgICAgICBwY21wZXFiICAgICB4bW0yLCAgICAgICB4bW0xCisgICAgICAgIHBjbXBlcWIgICAgIHhtbTMsICAgICAgIHhtbTEKKworICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICB4bW0yCisgICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgIHhtbTMKKworICAgICAgICBwYXZnYiAgICAgICB4bW01LCAgICAgICB4bW0wCisKKyAgICAgICAgO2RlY2lkZSBpZiBvciBub3QgdG8gdXNlIGZpbHRlcmVkIHZhbHVlCisgICAgICAgIHBhbmQgICAgICAgIHhtbTAsICAgICAgIHhtbTcKKyAgICAgICAgcGFuZG4gICAgICAgeG1tNywgICAgICAgeG1tNQorICAgICAgICBwYWRkdXNiICAgICB4bW0wLCAgICAgICB4bW03CislZW5kbWFjcm8KKworJW1hY3JvIFVQREFURV9GTElNSVQgMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcmJ4XQorICAgICAgICBtb3ZkcWEgICAgICBbcnNwXSwgICAgICB4bW0yCisgICAgICAgIGFkZCAgICAgICAgIHJieCwgICAgICAgIDE2CislZW5kbWFjcm8KKworO3ZvaWQgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93X3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCis7ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKzsgICAgaW50IGNvbHMsCis7ICAgIGludCAqZmxpbWl0cywKKzsgICAgaW50IHNpemUKKzspCitnbG9iYWwgc3ltKHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21iX3Jvd19zc2UyKSBQUklWQVRFCitzeW0odnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbWJfcm93X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNworICAgIFNBVkVfWE1NIDcKKyAgICBwdXNoICAgICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgc3ViICAgICAgICAgcnNwLCAxNgorCisgICAgICAgIDsgcHV0IGZsaW1pdCBvbiBzdGFjaworICAgICAgICBtb3YgICAgICAgICByYngsICAgICAgICBhcmcoNSkgICAgICAgICAgIDtmbGltaXRzIHB0cgorICAgICAgICBVUERBVEVfRkxJTUlUCisKKyVkZWZpbmUgZmxpbWl0IFtyc3BdCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgICAgICAgICAgIDtkc3RfcHRyCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgRFdPUkQgUFRSIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZQorICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBEV09SRCBQVFIgYXJnKDYpIDtyb3dzIGluIGEgbWFjcm9ibG9jaworLm5leHRyb3c6CisgICAgICAgIHhvciAgICAgICAgIHJkeCwgICAgICAgIHJkeCAgICAgICAgICAgICAgO2NvbAorLm5leHRjb2w6CisgICAgICAgIDtsb2FkIGN1cnJlbnQgYW5kIG5leHQgMiByb3dzCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByYXhdCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyAyKnJheF0KKworICAgICAgICBGSVJTVF8yX1JPV1MKKworICAgICAgICA7bG9hZCBhYm92ZSAyIHJvd3MKKyAgICAgICAgbmVnICAgICAgICAgcmF4CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyAyKnJheF0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJheF0KKworICAgICAgICBTRUNPTkRfMl9ST1dTCisKKyAgICAgICAgbW92ZHF1ICAgICAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTAKKworICAgICAgICBuZWcgICAgICAgICByYXggICAgICAgICAgICAgICAgICAgICAgICAgIDsgcG9zaXRpdmUgc3RyaWRlCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIDE2CisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIDE2CisKKyAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgMTYKKyAgICAgICAgY21wICAgICAgICAgZWR4LCAgICAgICAgZHdvcmQgYXJnKDQpICAgICA7Y29scworICAgICAgICBqZ2UgICAgICAgICAuZG93bmRvbmUKKyAgICAgICAgVVBEQVRFX0ZMSU1JVAorICAgICAgICBqbXAgICAgICAgICAubmV4dGNvbAorCisuZG93bmRvbmU6CisgICAgICAgIDsgZG9uZSB3aXRoIHRoZSBhbGwgY29scywgc3RhcnQgdGhlIGFjcm9zcyBmaWx0ZXJpbmcgaW4gcGxhY2UKKyAgICAgICAgc3ViICAgICAgICAgcnNpLCAgICAgICAgcmR4CisgICAgICAgIHN1YiAgICAgICAgIHJkaSwgICAgICAgIHJkeAorCisgICAgICAgIG1vdiAgICAgICAgIHJieCwgICAgICAgIGFyZyg1KSA7IGZsaW1pdHMKKyAgICAgICAgVVBEQVRFX0ZMSU1JVAorCisgICAgICAgIDsgZHVwIHRoZSBmaXJzdCBieXRlIGludG8gdGhlIGxlZnQgYm9yZGVyIDggdGltZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgIFtyZGldCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICBtbTEKKyAgICAgICAgcHVucGNrbHdkICAgbW0xLCAgIG1tMQorICAgICAgICBwdW5wY2tsZHEgICBtbTEsICAgbW0xCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgLTgKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyZHhdLCBtbTEKKworICAgICAgICA7IGR1cCB0aGUgbGFzdCBieXRlIGludG8gdGhlIHJpZ2h0IGJvcmRlcgorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgIGR3b3JkIGFyZyg0KQorICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgW3JkaSArIHJkeCArIC0xXQorICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgbW0xCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICBtbTEKKyAgICAgICAgcHVucGNrbGRxICAgbW0xLCAgIG1tMQorICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JkeF0sIG1tMQorCisgICAgICAgIHhvciAgICAgICAgIHJkeCwgICAgICAgIHJkeAorICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JkaS0xNl07CisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpLThdOworCisuYWNyb3NzbmV4dGNvbDoKKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3JkaSArIHJkeF0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JkaSArIHJkeCAtMl0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JkaSArIHJkeCAtMV0KKworICAgICAgICBGSVJTVF8yX1JPV1MKKworICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpICsgcmR4ICsxXQorICAgICAgICBtb3ZkcXUgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpICsgcmR4ICsyXQorCisgICAgICAgIFNFQ09ORF8yX1JPV1MKKworICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaStyZHgtMTZdLCBtbTAgIDsgc3RvcmUgcHJldmlvdXMgOCBieXRlcworICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaStyZHgtOF0sIG1tMSAgIDsgc3RvcmUgcHJldmlvdXMgOCBieXRlcworICAgICAgICBtb3ZkcTJxICAgICBtbTAsICAgICAgICB4bW0wCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTAsICAgICAgIDgKKyAgICAgICAgbW92ZHEycSAgICAgbW0xLCAgICAgICAgeG1tMAorCisgICAgICAgIGFkZCAgICAgICAgIHJkeCwgICAgICAgIDE2CisgICAgICAgIGNtcCAgICAgICAgIGVkeCwgICAgICAgIGR3b3JkIGFyZyg0KSAgICAgO2NvbHMKKyAgICAgICAgamdlICAgICAgICAgLmFjcm9zc2RvbmUKKyAgICAgICAgVVBEQVRFX0ZMSU1JVAorICAgICAgICBqbXAgICAgICAgICAuYWNyb3NzbmV4dGNvbAorCisuYWNyb3NzZG9uZQorICAgICAgICA7IGxhc3QgMTYgcGl4ZWxzCisgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcmRpK3JkeC0xNl0sIG1tMAorCisgICAgICAgIGNtcCAgICAgICAgIGVkeCwgICAgICAgIGR3b3JkIGFyZyg0KQorICAgICAgICBqbmUgICAgICAgICAudGhyb3dfbGFzdF84CisgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcmRpK3JkeC04XSwgbW0xCisudGhyb3dfbGFzdF84OgorICAgICAgICA7IGRvbmUgd2l0aCB0aGlzIHJ3bworICAgICAgICBhZGQgICAgICAgICByc2kscmF4ICAgICAgICAgICAgICAgICAgICAgIDtuZXh0IHNyYyBsaW5lCisgICAgICAgIG1vdiAgICAgICAgIGVheCwgZHdvcmQgYXJnKDMpICAgICAgICAgICAgO2RzdF9waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgYWRkICAgICAgICAgcmRpLHJheCAgICAgICAgICAgICAgICAgICAgICA7bmV4dCBkZXN0aW5hdGlvbgorICAgICAgICBtb3YgICAgICAgICBlYXgsIGR3b3JkIGFyZygyKSAgICAgICAgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisKKyAgICAgICAgbW92ICAgICAgICAgcmJ4LCAgICAgICAgYXJnKDUpICAgICAgICAgICA7ZmxpbWl0cworICAgICAgICBVUERBVEVfRkxJTUlUCisKKyAgICAgICAgZGVjICAgICAgICAgcmN4ICAgICAgICAgICAgICAgICAgICAgICAgICA7ZGVjcmVtZW50IGNvdW50CisgICAgICAgIGpueiAgICAgICAgIC5uZXh0cm93ICAgICAgICAgICAgICAgICAgICAgO25leHQgcm93CisKKyAgICBhZGQgcnNwLCAxNgorICAgIHBvcCByc3AKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgcG9wIHJieAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorJXVuZGVmIGZsaW1pdAorCis7dm9pZCB2cDhfbWJwb3N0X3Byb2NfZG93bl94bW0odW5zaWduZWQgY2hhciAqZHN0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scyxpbnQgZmxpbWl0KQorZXh0ZXJuIHN5bSh2cDhfcnYpCitnbG9iYWwgc3ltKHZwOF9tYnBvc3RfcHJvY19kb3duX3htbSkgUFJJVkFURQorc3ltKHZwOF9tYnBvc3RfcHJvY19kb3duX3htbSk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgIHJzcCwgMTI4KzE2CisKKyAgICA7IHVuc2lnbmVkIGNoYXIgZFsxNl1bOF0gYXQgW3JzcF0KKyAgICA7IGNyZWF0ZSBmbGltaXQyIGF0IFtyc3ArMTI4XQorICAgIG1vdiAgICAgICAgIGVheCwgZHdvcmQgcHRyIGFyZyg0KSA7ZmxpbWl0CisgICAgbW92ICAgICAgICAgW3JzcCsxMjhdLCBlYXgKKyAgICBtb3YgICAgICAgICBbcnNwKzEyOCs0XSwgZWF4CisgICAgbW92ICAgICAgICAgW3JzcCsxMjgrOF0sIGVheAorICAgIG1vdiAgICAgICAgIFtyc3ArMTI4KzEyXSwgZWF4CislZGVmaW5lIGZsaW1pdDQgW3JzcCsxMjhdCisKKyVpZiBBQklfSVNfMzJCSVQ9MAorICAgIGxlYSAgICAgICAgIHI4LCAgICAgICBbR0xPQkFMKHN5bSh2cDhfcnYpKV0KKyVlbmRpZgorCisgICAgO3Jvd3MgKz04OworICAgIGFkZCAgICAgICAgIGR3b3JkIGFyZygyKSwgOAorCisgICAgO2ZvcihjPTA7IGM8Y29sczsgYys9OCkKKy5sb29wX2NvbDoKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7IHMKKyAgICAgICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAgICAgICAgIDsKKworICAgICAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cGl0Y2ggICAgICAgOworCisgICAgICAgICAgICA7IHRoaXMgY29waWVzIHRoZSBsYXN0IHJvdyBkb3duIGludG8gdGhlIGJvcmRlciA4IHJvd3MKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIHJzaQorICAgICAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDIpCisgICAgICAgICAgICBzdWIgICAgICAgICByZHgsICAgICAgICA5CisgICAgICAgICAgICBpbXVsICAgICAgICByZHgsICAgICAgICByYXgKKyAgICAgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmR4XQorICAgICAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgUVdPUkQgcHRyW3JkaV0gICAgICAgICAgICAgIDsgZmlyc3Qgcm93CisgICAgICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICA4CisuaW5pdF9ib3JkZXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBib3JkZXJzCisgICAgICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgcmF4XQorICAgICAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tMQorCisgICAgICAgICAgICBkZWMgICAgICAgICByY3gKKyAgICAgICAgICAgIGpuZSAgICAgICAgIC5pbml0X2JvcmRlcmQKKworICAgICAgICAgICAgbmVnICAgICAgICAgcmF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcmF4ID0gLXBpdGNoCisKKyAgICAgICAgICAgIDsgdGhpcyBjb3BpZXMgdGhlIGZpcnN0IHJvdyB1cCBpbnRvIHRoZSBib3JkZXIgOCByb3dzCisgICAgICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICByc2kKKyAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFFXT1JEIHB0cltyZGldICAgICAgICAgICAgICA7IGZpcnN0IHJvdworICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgOAorLmluaXRfYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBib3JkZXJzCisgICAgICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgcmF4XQorICAgICAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tMQorCisgICAgICAgICAgICBkZWMgICAgICAgICByY3gKKyAgICAgICAgICAgIGpuZSAgICAgICAgIC5pbml0X2JvcmRlcgorCisKKworICAgICAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheCo4XTsgICAgICAgICAgICAgIDsgcmRpID0gc1stcGl0Y2gqOF0KKyAgICAgICAgICAgIG5lZyAgICAgICAgIHJheAorCisgICAgICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICB4bW01CisgICAgICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICB4bW02ICAgICAgICA7CisKKyAgICAgICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgIHhtbTcgICAgICAgIDsKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIHJzaQorCisgICAgICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAxNSAgICAgICAgICA7CisKKy5sb29wX2luaXR2YXI6CisgICAgICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBRV09SRCBQVFIgW3JkaV07CisgICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wICAgICAgICA7CisKKyAgICAgICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgIDsKKyAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIHhtbTEgICAgICAgIDsKKworICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMSAgICAgICAgOworICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgOworCisgICAgICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICB4bW0wICAgICAgICA7CisgICAgICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICB4bW0xICAgICAgICA7CisKKyAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgICAgIHhtbTIgICAgICAgIDsKKyAgICAgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmF4XSAgIDsKKworICAgICAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgICAgICBqbmUgICAgICAgICAubG9vcF9pbml0dmFyCisgICAgICAgICAgICA7c2F2ZSB0aGUgdmFyIGFuZCBzdW0KKyAgICAgICAgICAgIHhvciAgICAgICAgIHJkeCwgICAgICAgIHJkeAorLmxvb3Bfcm93OgorICAgICAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICA7IFtzLXBpdGNoKjhdCisgICAgICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICBRV09SRCBQVFIgW3JkaV0gICAgIDsgW3MrcGl0Y2gqN10KKworICAgICAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgeG1tMAorCisgICAgICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICB4bW0yCisgICAgICAgICAgICBwc3VidyAgICAgICB4bW01LCAgICAgICB4bW0xCisKKyAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgIHhtbTIKKyAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTIKKworICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMiwgICAgICAgeG1tMAorICAgICAgICAgICAgcHVucGNraHdkICAgeG1tNCwgICAgICAgeG1tMAorCisgICAgICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICB4bW0yCisgICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgICAgICB4bW00CisKKyAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIHhtbTEKKyAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTEKKworICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNiwgICAgICAgeG1tMQorCisgICAgICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICB4bW0wCisgICAgICAgICAgICBwc3ViZCAgICAgICB4bW03LCAgICAgICB4bW0yCisKKworICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tNgorICAgICAgICAgICAgcHNsbGQgICAgICAgeG1tMywgICAgICAgNAorCisgICAgICAgICAgICBwc3ViZCAgICAgICB4bW0zLCAgICAgICB4bW02CisgICAgICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW01CisKKyAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTUKKyAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIHhtbTEKKworICAgICAgICAgICAgcG11bGh3ICAgICAgeG1tNCwgICAgICAgeG1tNAorICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMQorCisgICAgICAgICAgICBwdW5wY2tsd2QgICB4bW0xLCAgICAgICB4bW00CisgICAgICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICB4bW00CisKKyAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTcKKyAgICAgICAgICAgIHBzbGxkICAgICAgIHhtbTQsICAgICAgIDQKKworICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNCwgICAgICAgeG1tNworCisgICAgICAgICAgICBwc3ViZCAgICAgICB4bW0zLCAgICAgICB4bW0xCisgICAgICAgICAgICBwc3ViZCAgICAgICB4bW00LCAgICAgICB4bW0yCisKKyAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTMsICAgICAgIGZsaW1pdDQKKyAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTQsICAgICAgIGZsaW1pdDQKKworICAgICAgICAgICAgcHNyYWQgICAgICAgeG1tMywgICAgICAgMzEKKyAgICAgICAgICAgIHBzcmFkICAgICAgIHhtbTQsICAgICAgIDMxCisKKyAgICAgICAgICAgIHBhY2tzc2R3ICAgIHhtbTMsICAgICAgIHhtbTQKKyAgICAgICAgICAgIHBhY2tzc3diICAgIHhtbTMsICAgICAgIHhtbTAKKworICAgICAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgUVdPUkQgUFRSIFtyc2krcmF4KjhdCisKKyAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIHhtbTEKKyAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAKKworICAgICAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgeG1tNQorICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgcmR4CisKKyAgICAgICAgICAgIGFuZCAgICAgICAgIHJjeCwgICAgICAgIDEyNworJWlmIEFCSV9JU18zMkJJVD0xICYmIENPTkZJR19QSUM9MQorICAgICAgICAgICAgcHVzaCAgICAgICAgcmF4CisgICAgICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbR0xPQkFMKHN5bSh2cDhfcnYpKV0KKyAgICAgICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyYXggKyByY3gqMl0gO3ZwOF9ydltyY3gqMl0KKyAgICAgICAgICAgIHBvcCAgICAgICAgIHJheAorJWVsaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyOCArIHJjeCoyXSA7dnA4X3J2W3JjeCoyXQorJWVsc2UKKyAgICAgICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtzeW0odnA4X3J2KSArIHJjeCoyXQorJWVuZGlmCisKKyAgICAgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIHhtbTQKKyAgICAgICAgICAgIDtwYWRkdyAgICAgeG1tMSwgICAgICAgZWlnaHQ4cworICAgICAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgNAorCisgICAgICAgICAgICBwYWNrdXN3YiAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgICAgICBwYW5kICAgICAgICB4bW0xLCAgICAgICB4bW0zCisKKyAgICAgICAgICAgIHBhbmRuICAgICAgIHhtbTMsICAgICAgIHhtbTIKKyAgICAgICAgICAgIHBvciAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKKworICAgICAgICAgICAgYW5kICAgICAgICAgcmN4LCAgICAgICAgMTUKKyAgICAgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiAgIFtyc3AgKyByY3gqOF0sIHhtbTEgO2RbcmN4KjhdCisKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIHJkeAorICAgICAgICAgICAgc3ViICAgICAgICAgcmN4LCAgICAgICAgOAorCisgICAgICAgICAgICBhbmQgICAgICAgICByY3gsICAgICAgICAxNQorICAgICAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzcCArIHJjeCo4XSA7ZFtyY3gqOF0KKworICAgICAgICAgICAgbW92cSAgICAgICAgW3JzaV0sICAgICAgbW0wCisgICAgICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheF0KKworICAgICAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyYXhdCisgICAgICAgICAgICBhZGQgICAgICAgICByZHgsICAgICAgICAxCisKKyAgICAgICAgICAgIGNtcCAgICAgICAgIGVkeCwgICAgICAgIGR3b3JkIGFyZygyKSA7cm93cworICAgICAgICAgICAgamwgICAgICAgICAgLmxvb3Bfcm93CisKKyAgICAgICAgYWRkICAgICAgICAgZHdvcmQgYXJnKDApLCA4IDsgcyArPSA4CisgICAgICAgIHN1YiAgICAgICAgIGR3b3JkIGFyZygzKSwgOCA7IGNvbHMgLT0gOAorICAgICAgICBjbXAgICAgICAgICBkd29yZCBhcmcoMyksIDAKKyAgICAgICAgamcgICAgICAgICAgLmxvb3BfY29sCisKKyAgICBhZGQgICAgICAgICByc3AsIDEyOCsxNgorICAgIHBvcCAgICAgICAgIHJzcAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisldW5kZWYgZmxpbWl0NAorCisKKzt2b2lkIHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tKHVuc2lnbmVkIGNoYXIgKnNyYywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLGludCBmbGltaXQpCitnbG9iYWwgc3ltKHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tKSBQUklWQVRFCitzeW0odnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF94bW0pOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICBzdWIgICAgICAgICByc3AsIDE2CisKKyAgICA7IGNyZWF0ZSBmbGltaXQ0IGF0IFtyc3BdCisgICAgbW92ICAgICAgICAgZWF4LCBkd29yZCBwdHIgYXJnKDQpIDtmbGltaXQKKyAgICBtb3YgICAgICAgICBbcnNwXSwgZWF4CisgICAgbW92ICAgICAgICAgW3JzcCs0XSwgZWF4CisgICAgbW92ICAgICAgICAgW3JzcCs4XSwgZWF4CisgICAgbW92ICAgICAgICAgW3JzcCsxMl0sIGVheAorJWRlZmluZSBmbGltaXQ0IFtyc3BdCisKKworICAgIDtmb3Iocj0wO3I8cm93cztyKyspCisuaXBfcm93X2xvb3A6CisKKyAgICAgICAgeG9yICAgICAgICAgcmR4LCAgICByZHggO3N1bXNxPTA7CisgICAgICAgIHhvciAgICAgICAgIHJjeCwgICAgcmN4IDtzdW09MDsKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICBhcmcoMCk7IHMKKworCisgICAgICAgIDsgZHVwIHRoZSBmaXJzdCBieXRlIGludG8gdGhlIGxlZnQgYm9yZGVyIDggdGltZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgIFtyc2ldCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICBtbTEKKyAgICAgICAgcHVucGNrbHdkICAgbW0xLCAgIG1tMQorICAgICAgICBwdW5wY2tsZHEgICBtbTEsICAgbW0xCisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAtOAorICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JkaV0sIG1tMQorCisgICAgICAgIDsgZHVwIHRoZSBsYXN0IGJ5dGUgaW50byB0aGUgcmlnaHQgYm9yZGVyCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgZHdvcmQgYXJnKDMpCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICBbcnNpICsgcmR4ICsgLTFdCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICBtbTEKKyAgICAgICAgcHVucGNrbHdkICAgbW0xLCAgIG1tMQorICAgICAgICBwdW5wY2tsZHEgICBtbTEsICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgIFtyc2krcmR4XSwgbW0xCisKKy5pcF92YXJfbG9vcDoKKyAgICAgICAgO2ZvcihpPS04O2k8PTY7aSsrKQorICAgICAgICA7eworICAgICAgICA7ICAgIHN1bXNxICs9IHNbaV0qc1tpXTsKKyAgICAgICAgOyAgICBzdW0gICArPSBzW2ldOworICAgICAgICA7fQorICAgICAgICBtb3Z6eCAgICAgICBlYXgsIGJ5dGUgW3JzaStyZGldCisgICAgICAgIGFkZCAgICAgICAgIGVjeCwgZWF4CisgICAgICAgIG11bCAgICAgICAgIGFsCisgICAgICAgIGFkZCAgICAgICAgIGVkeCwgZWF4CisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgMQorICAgICAgICBjbXAgICAgICAgICByZGksIDYKKyAgICAgICAgamxlICAgICAgICAgLmlwX3Zhcl9sb29wCisKKworICAgICAgICAgICAgO21vdiAgICAgICAgIHJheCwgICAgc3Vtc3EKKyAgICAgICAgICAgIDttb3ZkICAgICAgICB4bW03LCAgIHJheAorICAgICAgICAgICAgbW92ZCAgICAgICAgeG1tNywgICBlZHgKKworICAgICAgICAgICAgO21vdiAgICAgICAgIHJheCwgICAgc3VtCisgICAgICAgICAgICA7bW92ZCAgICAgICAgeG1tNiwgICByYXgKKyAgICAgICAgICAgIG1vdmQgICAgICAgIHhtbTYsICAgZWN4CisKKyAgICAgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgYXJnKDApIDtzCisgICAgICAgICAgICB4b3IgICAgICAgICByY3gsICAgIHJjeAorCisgICAgICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgIGR3b3JkIGFyZygzKSA7Y29scworICAgICAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICA4CisgICAgICAgICAgICBweG9yICAgICAgICBtbTAsICAgIG1tMAorICAgICAgICAgICAgcHhvciAgICAgICAgbW0xLCAgICBtbTEKKworICAgICAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICB4bW0wCisubmV4dGNvbDQ6CisKKyAgICAgICAgICAgIG1vdmQgICAgICAgIHhtbTEsICAgRFdPUkQgUFRSIFtyc2krcmN4LThdICAgOyAtOCAtNyAtNiAtNQorICAgICAgICAgICAgbW92ZCAgICAgICAgeG1tMiwgICBEV09SRCBQVFIgW3JzaStyY3grN10gICA7ICs3ICs4ICs5ICsxMAorCisgICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgZXhwYW5kaW5nCisgICAgICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgZXhwYW5kaW5nCisKKyAgICAgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBleHBhbmRpbmcgdG8gZHdvcmRzCisgICAgICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgZXhwYW5kaW5nIHRvIGR3b3JkcworCisgICAgICAgICAgICBwc3ViZCAgICAgICB4bW0yLCAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsgNy0tOCAgIDgtLTcgICA5LS02IDEwLS01CisgICAgICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsgLTgqMiAgIC03KjIgICAtNioyIC01KjIKKworICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICB4bW0yICAgICAgICAgICAgICAgICAgICA7IDcrLTggICA4Ky03ICAgOSstNiAxMCstNQorICAgICAgICAgICAgcG1hZGR3ZCAgICAgeG1tMSwgICB4bW0yICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZWQgb2YgNystOCAgIDgrLTcgICA5Ky02IDEwKy01CisKKyAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgeG1tMgorICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICB4bW0xCisKKyAgICAgICAgICAgIHBzaHVmZCAgICAgIHhtbTYsICAgeG1tNiwgICAwICAgICAgICAgICAgICAgOyBkdXBsaWNhdGUgdGhlIGxhc3Qgb25lcworICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNywgICB4bW03LCAgIDAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSB0aGUgbGFzdCBvbmVzCisKKyAgICAgICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgIDQgICAgICAgICAgICAgICAgICAgOyA4LS03ICAgOS0tNiAxMC0tNSAgMDAwMAorICAgICAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgNCAgICAgICAgICAgICAgICAgICA7IDgtLTcgICA5LS02IDEwLS01ICAwMDAwCisKKyAgICAgICAgICAgIHBzaHVmZCAgICAgIHhtbTMsICAgeG1tMSwgICAzICAgICAgICAgICAgICAgOyAwMDAwICA4LS03ICAgOC0tNyAgIDgtLTcgc3F1YXJlZAorICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNCwgICB4bW0yLCAgIDMgICAgICAgICAgICAgICA7IDAwMDAgIDgtLTcgICA4LS03ICAgOC0tNyBzcXVhcmVkCisKKyAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgeG1tNAorICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICB4bW0zCisKKyAgICAgICAgICAgIHBzaHVmZCAgICAgIHhtbTMsICAgeG1tMSwgICAwMTAxMTExMWIgICAgICAgOyAwMDAwICAwMDAwICAgOS0tNiAgIDktLTYgc3F1YXJlZAorICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNCwgICB4bW0yLCAgIDAxMDExMTExYiAgICAgICA7IDAwMDAgIDAwMDAgICA5LS02ICAgOS0tNiBzcXVhcmVkCisKKyAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgeG1tMworICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW00CisKKyAgICAgICAgICAgIHBzaHVmZCAgICAgIHhtbTMsICAgeG1tMSwgICAxMDExMTExMWIgICAgICAgOyAwMDAwICAwMDAwICAgOC0tNyAgIDgtLTcgc3F1YXJlZAorICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNCwgICB4bW0yLCAgIDEwMTExMTExYiAgICAgICA7IDAwMDAgIDAwMDAgICA4LS03ICAgOC0tNyBzcXVhcmVkCisKKyAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgeG1tMworICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW00CisKKyAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgeG1tNgorICAgICAgICAgICAgcG1hZGR3ZCAgICAgeG1tMywgICB4bW0zCisKKyAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgeG1tNworICAgICAgICAgICAgcHNsbGQgICAgICAgeG1tNSwgICA0CisKKyAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTUsICAgeG1tNworICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNSwgICB4bW0zCisKKyAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTUsICAgZmxpbWl0NAorICAgICAgICAgICAgcHNyYWQgICAgICAgeG1tNSwgICAzMQorCisgICAgICAgICAgICBwYWNrc3NkdyAgICB4bW01LCAgIHhtbTAKKyAgICAgICAgICAgIHBhY2tzc3diICAgIHhtbTUsICAgeG1tMAorCisgICAgICAgICAgICBtb3ZkICAgICAgICB4bW0xLCAgIERXT1JEIFBUUiBbcnNpK3JjeF0KKyAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgeG1tMQorCisgICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgIHhtbTAKKyAgICAgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgeG1tMAorCisgICAgICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgIHhtbTYKKyAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgW0dMT0JBTChmb3VyOHMpXQorCisgICAgICAgICAgICBwc3JhZCAgICAgICB4bW0xLCAgIDQKKyAgICAgICAgICAgIHBhY2tzc2R3ICAgIHhtbTEsICAgeG1tMAorCisgICAgICAgICAgICBwYWNrdXN3YiAgICB4bW0xLCAgIHhtbTAKKyAgICAgICAgICAgIHBhbmQgICAgICAgIHhtbTEsICAgeG1tNQorCisgICAgICAgICAgICBwYW5kbiAgICAgICB4bW01LCAgIHhtbTIKKyAgICAgICAgICAgIHBvciAgICAgICAgIHhtbTUsICAgeG1tMQorCisgICAgICAgICAgICBtb3ZkICAgICAgICBbcnNpK3JjeC04XSwgIG1tMAorICAgICAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBtbTEKKworICAgICAgICAgICAgbW92ZHEycSAgICAgbW0xLCAgICB4bW01CisgICAgICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgIDEyCisKKyAgICAgICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgMTIKKyAgICAgICAgICAgIGFkZCAgICAgICAgIHJjeCwgICAgNAorCisgICAgICAgICAgICBjbXAgICAgICAgICByY3gsICAgIHJkeAorICAgICAgICAgICAgamwgICAgICAgICAgLm5leHRjb2w0CisKKyAgICAgICAgO3MrPXBpdGNoOworICAgICAgICBtb3ZzeGQgcmF4LCBkd29yZCBhcmcoMSkKKyAgICAgICAgYWRkICAgIGFyZygwKSwgcmF4CisKKyAgICAgICAgc3ViIGR3b3JkIGFyZygyKSwgMSA7cm93cy09MQorICAgICAgICBjbXAgZHdvcmQgYXJnKDIpLCAwCisgICAgICAgIGpnIC5pcF9yb3dfbG9vcAorCisgICAgYWRkICAgICAgICAgcnNwLCAxNgorICAgIHBvcCAgICAgICAgIHJzcAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisldW5kZWYgZmxpbWl0NAorCisKKzt2b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2Vfd210ICh1bnNpZ25lZCBjaGFyICpTdGFydCwgdW5zaWduZWQgY2hhciAqbm9pc2UsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmxhY2tjbGFtcFsxNl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgd2hpdGVjbGFtcFsxNl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYm90aGNsYW1wWzE2XSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFdpZHRoLCB1bnNpZ25lZCBpbnQgSGVpZ2h0LCBpbnQgUGl0Y2gpCitleHRlcm4gc3ltKHJhbmQpCitnbG9iYWwgc3ltKHZwOF9wbGFuZV9hZGRfbm9pc2Vfd210KSBQUklWQVRFCitzeW0odnA4X3BsYW5lX2FkZF9ub2lzZV93bXQpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgOAorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisuYWRkbm9pc2VfbG9vcDoKKyAgICBjYWxsIHN5bShyYW5kKSBXUlRfUExUCisgICAgbW92ICAgICByY3gsIGFyZygxKSA7bm9pc2UKKyAgICBhbmQgICAgIHJheCwgMHhmZgorICAgIGFkZCAgICAgcmN4LCByYXgKKworICAgIDsgd2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSBjbGFtcGluZyB2ZWN0b3JzIGFyZSBzdG9yZWQgY29udGlndW91c2x5CisgICAgOyBpbiBibGFjay93aGl0ZS9ib3RoIG9yZGVyLiBOb3RlIHRoYXQgd2UgaGF2ZSB0byByZWxvYWQgdGhpcyBoZXJlIGJlY2F1c2UKKyAgICA7IHJkeCBjb3VsZCBiZSB0cmFzaGVkIGJ5IHJhbmQoKQorICAgIG1vdiAgICAgcmR4LCBhcmcoMikgOyBibGFja2NsYW1wCisKKworICAgICAgICAgICAgbW92ICAgICByZGksIHJjeAorICAgICAgICAgICAgbW92c3hkICByY3gsIGR3b3JkIGFyZyg1KSA7W1dpZHRoXQorICAgICAgICAgICAgbW92ICAgICByc2ksIGFyZygwKSA7UG9zCisgICAgICAgICAgICB4b3IgICAgICAgICByYXgscmF4CisKKy5hZGRub2lzZV9uZXh0c2V0OgorICAgICAgICAgICAgbW92ZHF1ICAgICAgeG1tMSxbcnNpK3JheF0gICAgICAgICA7IGdldCB0aGUgc291cmNlCisKKyAgICAgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsIFtyZHhdICAgIDtibGFja2NsYW1wICAgICAgICA7IGNsYW1wIGJvdGggc2lkZXMgc28gd2UgZG9uJ3Qgb3V0cmFuZ2UgYWRkaW5nIG5vaXNlCisgICAgICAgICAgICBwYWRkdXNiICAgICB4bW0xLCBbcmR4KzMyXSA7Ym90aGNsYW1wCisgICAgICAgICAgICBwc3VidXNiICAgICB4bW0xLCBbcmR4KzE2XSA7d2hpdGVjbGFtcAorCisgICAgICAgICAgICBtb3ZkcXUgICAgICB4bW0yLFtyZGkrcmF4XSAgICAgICAgIDsgZ2V0IHRoZSBub2lzZSBmb3IgdGhpcyBsaW5lCisgICAgICAgICAgICBwYWRkYiAgICAgICB4bW0xLHhtbTIgICAgICAgICAgICAgIDsgYWRkIGl0IGluCisgICAgICAgICAgICBtb3ZkcXUgICAgICBbcnNpK3JheF0seG1tMSAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdAorCisgICAgICAgICAgICBhZGQgICAgICAgICByYXgsMTYgICAgICAgICAgICAgICAgIDsgbW92ZSB0byB0aGUgbmV4dCBsaW5lCisKKyAgICAgICAgICAgIGNtcCAgICAgICAgIHJheCwgcmN4CisgICAgICAgICAgICBqbCAgICAgICAgICAuYWRkbm9pc2VfbmV4dHNldAorCisgICAgbW92c3hkICByYXgsIGR3b3JkIGFyZyg3KSA7IFBpdGNoCisgICAgYWRkICAgICBhcmcoMCksIHJheCA7IFN0YXJ0ICs9IFBpdGNoCisgICAgc3ViICAgICBkd29yZCBhcmcoNiksIDEgICA7IEhlaWdodCAtPSAxCisgICAgamcgICAgICAuYWRkbm9pc2VfbG9vcAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKK1NFQ1RJT05fUk9EQVRBCithbGlnbiAxNgorZm91cjhzOgorICAgIHRpbWVzIDQgZGQgOApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX3g4Ni5jIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX3g4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzAxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvcG9zdHByb2NfeDg2LmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBPbiBBbmRyb2lkIE5ESywgcmFuZCBpcyBpbmxpbmVkIGZ1bmN0aW9uLCBidXQgcG9zdHByb2MgbmVlZHMgcmFuZCBzeW1ib2wgKi8KKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorI2RlZmluZSByYW5kIF9fcmFuZAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI3VuZGVmIHJhbmQKKworZXh0ZXJuIGludCByYW5kKHZvaWQpCit7CisgIHJldHVybiBfX3JhbmQoKTsKK30KKyNlbHNlCisvKiBJU08gQyBmb3JiaWRzIGFuIGVtcHR5IHRyYW5zbGF0aW9uIHVuaXQuICovCitpbnQgdnA4X3VudXNlZDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L3JlY29uX21teC5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvcmVjb25fbW14LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU5ODcxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3JlY29uX21teC5hc20KQEAgLTAsMCArMSwyNzQgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworCis7dm9pZCBjb3B5X21lbTh4OF9tbXgoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKKzsgICAgaW50IHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfY29weV9tZW04eDhfbW14KSBQUklWQVRFCitzeW0odnA4X2NvcHlfbWVtOHg4X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmM7CisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIFtyc2ldCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZTsKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtkc3Q7CisKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JzaStyYXhdCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIFtyc2krcmF4KjJdCisKKyAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7ZHN0X3N0cmlkZQorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMAorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeF0sICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjJdLCAgICBtbTIKKworCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldCisKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmN4CisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyc2krcmF4XQorCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMworCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgIG1tNAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjJdLCAgICBtbTUKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqMl0KKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBbcnNpK3JheF0KKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JzaStyYXgqMl0KKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeF0sICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sbW0xCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIGNvcHlfbWVtOHg0X21teCgKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjLAorOyAgICBpbnQgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICApCitnbG9iYWwgc3ltKHZwOF9jb3B5X21lbTh4NF9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfY29weV9tZW04eDRfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyYzsKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzaV0KKworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlOworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2RzdDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcnNpK3JheF0KKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JzaStyYXgqMl0KKworICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3Rfc3RyaWRlCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTEKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyXSwgICAgbW0yCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCisKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgW3JzaStyYXhdCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTMKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgY29weV9tZW0xNngxNl9tbXgoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKKzsgICAgaW50IHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfY29weV9tZW0xNngxNl9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfY29weV9tZW0xNngxNl9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjOworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlOworCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7ZHN0OworICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3Rfc3RyaWRlCisKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzhdOworCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpK3JheF0KKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIFtyc2krcmF4KzhdCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBbcnNpK3JheCoyKzhdCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgICAgICByYXgKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrOF0sICAgICAgICBtbTMKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeF0sICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KzhdLCAgICBtbTQKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyXSwgICAgbW0yCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjIrOF0sICBtbTUKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaStyY3gqMl0KKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgICAgIHJjeAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgW3JzaSs4XTsKKworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaStyYXhdCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpK3JheCs4XQorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgW3JzaStyYXgqMis4XQorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIG1tMAorICAgICAgICBtb3ZxICAgICAgICBbcmRpKzhdLCAgICAgICAgbW0zCisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3hdLCAgICAgIG1tMQorICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCs4XSwgICAgbW00CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sICAgIG1tMgorICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyKzhdLCAgbW01CisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkrcmN4KjJdCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgICAgICByY3gKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krOF07CisKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIFtyc2krcmF4XQorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaStyYXgrOF0KKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICAgICAgW3JzaStyYXgqMl0KKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIFtyc2krcmF4KjIrOF0KKworICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaStyYXgqMl0KKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgICAgIHJheAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgW3JkaSs4XSwgICAgICAgIG1tMworCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTEKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3grOF0sICAgIG1tNAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjJdLCAgICBtbTIKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMis4XSwgIG1tNQorCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpK3JjeCoyXQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAgICAgcmN4CisKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzhdOworCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpK3JheF0KKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIFtyc2krcmF4KzhdCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBbcnNpK3JheCoyKzhdCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgICAgICByYXgKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrOF0sICAgICAgICBtbTMKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeF0sICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KzhdLCAgICBtbTQKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyXSwgICAgbW0yCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjIrOF0sICBtbTUKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaStyY3gqMl0KKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgICAgIHJjeAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgW3JzaSs4XTsKKworICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaStyYXhdCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpK3JheCs4XQorCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgW3JzaStyYXgqMis4XQorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIG1tMAorICAgICAgICBtb3ZxICAgICAgICBbcmRpKzhdLCAgICAgICAgbW0zCisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3hdLCAgICAgIG1tMQorICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCs4XSwgICAgbW00CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sICAgIG1tMgorICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyKzhdLCAgbW01CisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkrcmN4KjJdCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgICAgICByY3gKKworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krOF07CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIG1tMAorICAgICAgICBtb3ZxICAgICAgICBbcmRpKzhdLCAgICAgICAgbW0zCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L3JlY29uX3NzZTIuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3JlY29uX3NzZTIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzc0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvcmVjb25fc3NlMi5hc20KQEAgLTAsMCArMSwxMDgwIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKzt2b2lkIGNvcHlfbWVtMTZ4MTZfc3NlMigKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjLAorOyAgICBpbnQgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICApCitnbG9iYWwgc3ltKHZwOF9jb3B5X21lbTE2eDE2X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfY29weV9tZW0xNngxNl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyYzsKKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgW3JzaV0KKworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlOworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2RzdDsKKworICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcnNpK3JheF0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMiwgICAgICAgW3JzaStyYXgqMl0KKworICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3Rfc3RyaWRlCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMAorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKKworICAgICAgICBtb3ZkcWEgICAgICBbcmRpK3JjeF0sICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4KjJdLHhtbTIKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQorICAgICAgICBtb3ZkcXUgICAgICB4bW0zLCAgICAgICBbcnNpXQorCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJjeAorICAgICAgICBtb3ZkcXUgICAgICB4bW00LCAgICAgICBbcnNpK3JheF0KKworICAgICAgICBtb3ZkcXUgICAgICB4bW01LCAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgeG1tMworICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKKworICAgICAgICBtb3ZkcWEgICAgICBbcmRpK3JjeF0sICB4bW00CisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4KjJdLHhtbTUKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQorICAgICAgICBtb3ZkcXUgICAgICB4bW0wLCAgICAgICBbcnNpXQorCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJjeAorICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcnNpK3JheF0KKworICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgIHhtbTAKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4CisKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3hdLCAgeG1tMQorCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4KjJdLCAgICB4bW0yCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldCisKKyAgICAgICAgbW92ZHF1ICAgICAgeG1tNCwgICAgICAgW3JzaStyYXhdCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCisKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmN4CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTUsICAgICAgIFtyc2krcmF4KjJdCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICB4bW0zCisKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4CisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4XSwgIHhtbTQKKworICAgICAgICBtb3ZkcWEgICAgICBbcmRpK3JjeCoyXSx4bW01CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFtyc2ldCisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqMl0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMSwgICAgICAgW3JzaStyYXhdCisKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmN4CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTIsICAgICAgIFtyc2krcmF4KjJdCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMAorCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4XSwgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3gqMl0seG1tMgorCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2krcmF4XQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQorCisgICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4XSwgIHhtbTMKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfdXZfZGNfbW14MigKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICB1bnNpZ25lZCBjaGFyICphYm92ZSwKKzsgICAgdW5zaWduZWQgY2hhciAqbGVmdCwKKzsgICAgaW50IGxlZnRfc3RyaWRlLAorOyAgICApCitnbG9iYWwgc3ltKHZwOF9pbnRyYV9wcmVkX3V2X2RjX21teDIpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF91dl9kY19tbXgyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDsgZnJvbSB0b3AKKyAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2Fib3ZlOworICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygzKSA7bGVmdDsKKyAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtsZWZ0X3N0cmlkZTsKKyAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAKKyAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmRpXQorICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyYXgqM10KKyAgICBwc2FkYncgICAgICBtbTEsICAgICAgICBtbTAKKyAgICA7IGZyb20gbGVmdAorICAgIG1vdnp4ICAgICAgIGVjeCwgICAgICAgIGJ5dGUgW3JzaV0KKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4KjFdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheCoyXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorCisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JkaV0KKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCo0XQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4XQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXgqMl0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmRpXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorCisgICAgOyBhZGQgdXAKKyAgICBwZXh0cncgICAgICBlZHgsICAgICAgICBtbTEsIDB4MAorICAgIGxlYSAgICAgICAgIGVkeCwgICAgICAgIFtlZHgrZWN4KzhdCisgICAgc2FyICAgICAgICAgZWR4LCAgICAgICAgNAorICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIGVkeAorICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO2RzdF9zdHJpZGUKKyAgICBwc2h1ZncgICAgICBtbTEsICAgICAgICBtbTEsIDB4MAorICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygwKSA7ZHN0OworICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgIG1tMQorCisgICAgOyB3cml0ZSBvdXQKKyAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmN4KjNdCisgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgW3JkaStyY3gqNF0KKworICAgIG1vdnEgW3JkaSAgICAgIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkaStyY3ggIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkaStyY3gqMl0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkaStyYXggIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkeCAgICAgIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkeCtyY3ggIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkeCtyY3gqMl0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkeCtyYXggIF0sICAgICAgIG1tMQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIHZwOF9pbnRyYV9wcmVkX3V2X2RjdG9wX21teDIoCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgdW5zaWduZWQgY2hhciAqYWJvdmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmxlZnQsCis7ICAgIGludCBsZWZ0X3N0cmlkZSwKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF91dl9kY3RvcF9tbXgyKSBQUklWQVRFCitzeW0odnA4X2ludHJhX3ByZWRfdXZfZGN0b3BfbW14Mik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICA7YXJnKDMpLCBhcmcoNCkgbm90IHVzZWQKKworICAgIDsgZnJvbSB0b3AKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMikgO2Fib3ZlOworICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMAorICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIFtyc2ldCisgICAgcHNhZGJ3ICAgICAgbW0xLCAgICAgICAgbW0wCisKKyAgICA7IGFkZCB1cAorICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIFtHTE9CQUwoZGNfNCldCisgICAgcHNyYXcgICAgICAgbW0xLCAgICAgICAgMworICAgIHBzaHVmdyAgICAgIG1tMSwgICAgICAgIG1tMSwgMHgwCisgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgbW0xCisKKyAgICA7IHdyaXRlIG91dAorICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygwKSA7ZHN0OworICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO2RzdF9zdHJpZGUKKyAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmN4KjNdCisKKyAgICBtb3ZxIFtyZGkgICAgICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyZGkrcmN4ICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyZGkrcmN4KjJdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyZGkrcmF4ICBdLCAgICAgICBtbTEKKyAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCo0XQorICAgIG1vdnEgW3JkaSAgICAgIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkaStyY3ggIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkaStyY3gqMl0sICAgICAgIG1tMQorICAgIG1vdnEgW3JkaStyYXggIF0sICAgICAgIG1tMQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfdXZfZGNsZWZ0X21teDIoCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgdW5zaWduZWQgY2hhciAqYWJvdmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmxlZnQsCis7ICAgIGludCBsZWZ0X3N0cmlkZSwKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF91dl9kY2xlZnRfbW14MikgUFJJVkFURQorc3ltKHZwOF9pbnRyYV9wcmVkX3V2X2RjbGVmdF9tbXgyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDthcmcoMikgbm90IHVzZWQKKworICAgIDsgZnJvbSBsZWZ0CisgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDMpIDtsZWZ0OworICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO2xlZnRfc3RyaWRlOworICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyYXgqM10KKyAgICBtb3Z6eCAgICAgICBlY3gsICAgICAgICBieXRlIFtyc2ldCisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheF0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4KjJdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JkaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCo0XQorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4XQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXgqMl0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmRpXQorICAgIGxlYSAgICAgICAgIGVkeCwgICAgICAgIFtlY3grZWR4KzRdCisKKyAgICA7IGFkZCB1cAorICAgIHNociAgICAgICAgIGVkeCwgICAgICAgIDMKKyAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBlZHgKKyAgICBwc2h1ZncgICAgICBtbTEsICAgICAgICBtbTEsIDB4MAorICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgIG1tMQorCisgICAgOyB3cml0ZSBvdXQKKyAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMCkgO2RzdDsKKyAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtkc3Rfc3RyaWRlCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JjeCozXQorCisgICAgbW92cSBbcmRpICAgICAgXSwgICAgICAgbW0xCisgICAgbW92cSBbcmRpK3JjeCAgXSwgICAgICAgbW0xCisgICAgbW92cSBbcmRpK3JjeCoyXSwgICAgICAgbW0xCisgICAgbW92cSBbcmRpK3JheCAgXSwgICAgICAgbW0xCisgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqNF0KKyAgICBtb3ZxIFtyZGkgICAgICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyZGkrcmN4ICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyZGkrcmN4KjJdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyZGkrcmF4ICBdLCAgICAgICBtbTEKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfaW50cmFfcHJlZF91dl9kYzEyOF9tbXgoCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgdW5zaWduZWQgY2hhciAqYWJvdmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmxlZnQsCis7ICAgIGludCBsZWZ0X3N0cmlkZSwKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF91dl9kYzEyOF9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF91dl9kYzEyOF9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIEdFVF9HT1QgICAgIHJieAorICAgIDsgZW5kIHByb2xvZworCisgICAgO2FyZygyKSwgYXJnKDMpLCBhcmcoNCkgbm90IHVzZWQKKworICAgIDsgd3JpdGUgb3V0CisgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW0dMT0JBTChkY18xMjgpXQorICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZygwKSA7ZHN0OworICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO2RzdF9zdHJpZGUKKyAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmR4KjNdCisKKyAgICBtb3ZxIFtyYXggICAgICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyYXgrcmR4ICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyYXgrcmR4KjJdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyYXgrcmN4ICBdLCAgICAgICBtbTEKKyAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4K3JkeCo0XQorICAgIG1vdnEgW3JheCAgICAgIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JheCtyZHggIF0sICAgICAgIG1tMQorICAgIG1vdnEgW3JheCtyZHgqMl0sICAgICAgIG1tMQorICAgIG1vdnEgW3JheCtyY3ggIF0sICAgICAgIG1tMQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfdXZfdG1fc3NlMigKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICB1bnNpZ25lZCBjaGFyICphYm92ZSwKKzsgICAgdW5zaWduZWQgY2hhciAqbGVmdCwKKzsgICAgaW50IGxlZnRfc3RyaWRlLAorOyAgICApCislbWFjcm8gdnA4X2ludHJhX3ByZWRfdXZfdG0gMQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF91dl90bV8lMSkgUFJJVkFURQorc3ltKHZwOF9pbnRyYV9wcmVkX3V2X3RtXyUxKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDsgcmVhZCB0b3Agcm93CisgICAgbW92ICAgICAgICAgZWR4LCAgICAgICAgNAorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygyKSA7YWJvdmUKKyAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtsZWZ0X3N0cmlkZTsKKyAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wCislaWZpZG4gJTEsIHNzc2UzCisgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgW0dMT0JBTChkY18xMDI0KV0KKyVlbmRpZgorICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFtyc2ldCisgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMAorCisgICAgOyBzZXQgdXAgbGVmdCBwdHJzIGFucyBzdWJ0cmFjdCB0b3BsZWZ0CisgICAgbW92ZCAgICAgICAgeG1tMywgICAgICAgW3JzaS0xXQorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygzKSA7bGVmdDsKKyVpZmlkbiAlMSwgc3NlMgorICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAKKyAgICBwc2h1Zmx3ICAgICB4bW0zLCAgICAgICB4bW0zLCAweDAKKyAgICBwdW5wY2tscWRxICB4bW0zLCAgICAgICB4bW0zCislZWxzZQorICAgIHBzaHVmYiAgICAgIHhtbTMsICAgICAgIHhtbTIKKyVlbmRpZgorICAgIHBzdWJ3ICAgICAgIHhtbTEsICAgICAgIHhtbTMKKworICAgIDsgc2V0IHVwIGRlc3QgcHRycworICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygwKSA7ZHN0OworICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO2RzdF9zdHJpZGUKKworLnZwOF9pbnRyYV9wcmVkX3V2X3RtXyUxX2xvb3A6CisgICAgbW92ZCAgICAgICAgeG1tMywgICAgICAgW3JzaV0KKyAgICBtb3ZkICAgICAgICB4bW01LCAgICAgICBbcnNpK3JheF0KKyVpZmlkbiAlMSwgc3NlMgorICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAKKyAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wCisgICAgcHNodWZsdyAgICAgeG1tMywgICAgICAgeG1tMywgMHgwCisgICAgcHNodWZsdyAgICAgeG1tNSwgICAgICAgeG1tNSwgMHgwCisgICAgcHVucGNrbHFkcSAgeG1tMywgICAgICAgeG1tMworICAgIHB1bnBja2xxZHEgIHhtbTUsICAgICAgIHhtbTUKKyVlbHNlCisgICAgcHNodWZiICAgICAgeG1tMywgICAgICAgeG1tMgorICAgIHBzaHVmYiAgICAgIHhtbTUsICAgICAgIHhtbTIKKyVlbmRpZgorICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICB4bW0xCisgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgeG1tNQorICAgIG1vdnEgIFtyZGkgICAgXSwgICAgICAgIHhtbTMKKyAgICBtb3ZocHNbcmRpK3JjeF0sICAgICAgICB4bW0zCisgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KKyAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQorICAgIGRlYyAgICAgICAgIGVkeAorICAgIGpueiAudnA4X2ludHJhX3ByZWRfdXZfdG1fJTFfbG9vcAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKyVlbmRtYWNybworCit2cDhfaW50cmFfcHJlZF91dl90bSBzc2UyCit2cDhfaW50cmFfcHJlZF91dl90bSBzc3NlMworCis7dm9pZCB2cDhfaW50cmFfcHJlZF91dl92ZV9tbXgoCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgdW5zaWduZWQgY2hhciAqYWJvdmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmxlZnQsCis7ICAgIGludCBsZWZ0X3N0cmlkZSwKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF91dl92ZV9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF91dl92ZV9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIDsgZW5kIHByb2xvZworCisgICAgOyBhcmcoMyksIGFyZyg0KSBub3QgdXNlZAorCisgICAgOyByZWFkIGZyb20gdG9wCisgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgYXJnKDIpIDtzcmM7CisKKyAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmF4XQorCisgICAgOyB3cml0ZSBvdXQKKyAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoMCkgO2RzdDsKKyAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtkc3Rfc3RyaWRlCisgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCozXQorCisgICAgbW92cSBbcmF4ICAgICAgXSwgICAgICAgbW0xCisgICAgbW92cSBbcmF4K3JkeCAgXSwgICAgICAgbW0xCisgICAgbW92cSBbcmF4K3JkeCoyXSwgICAgICAgbW0xCisgICAgbW92cSBbcmF4K3JjeCAgXSwgICAgICAgbW0xCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCtyZHgqNF0KKyAgICBtb3ZxIFtyYXggICAgICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyYXgrcmR4ICBdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyYXgrcmR4KjJdLCAgICAgICBtbTEKKyAgICBtb3ZxIFtyYXgrcmN4ICBdLCAgICAgICBtbTEKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfaW50cmFfcHJlZF91dl9ob19tbXgyKAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCis7ICAgIGludCBkc3Rfc3RyaWRlCis7ICAgIHVuc2lnbmVkIGNoYXIgKmFib3ZlLAorOyAgICB1bnNpZ25lZCBjaGFyICpsZWZ0LAorOyAgICBpbnQgbGVmdF9zdHJpZGUKKzsgICAgKQorJW1hY3JvIHZwOF9pbnRyYV9wcmVkX3V2X2hvIDEKK2dsb2JhbCBzeW0odnA4X2ludHJhX3ByZWRfdXZfaG9fJTEpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF91dl9ob18lMSk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCislaWZpZG4gJTEsIHNzc2UzCislaWZuZGVmIEdFVF9HT1RfU0FWRV9BUkcKKyAgICBwdXNoICAgICAgICByYngKKyVlbmRpZgorICAgIEdFVF9HT1QgICAgIHJieAorJWVuZGlmCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICA7YXJnKDIpIG5vdCB1c2VkCisKKyAgICA7IHJlYWQgZnJvbSBsZWZ0IGFuZCB3cml0ZSBvdXQKKyVpZmlkbiAlMSwgbW14MgorICAgIG1vdiAgICAgICAgIGVkeCwgICAgICAgIDQKKyVlbmRpZgorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygzKSA7bGVmdAorICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO2xlZnRfc3RyaWRlOworICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygwKSA7ZHN0OworICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO2RzdF9zdHJpZGUKKyVpZmlkbiAlMSwgc3NzZTMKKyAgICBsZWEgICAgICAgICByZHgsICAgICAgICBbcmN4KjNdCisgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgW0dMT0JBTChkY18wMDAwMTExMSldCisgICAgbGVhICAgICAgICAgcmJ4LCAgICAgICAgW3JheCozXQorJWVuZGlmCisKKyVpZmlkbiAlMSwgbW14MgorLnZwOF9pbnRyYV9wcmVkX3V2X2hvXyUxX2xvb3A6CisgICAgbW92ZCAgICAgICAgbW0wLCAgICAgICAgW3JzaV0KKyAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBbcnNpK3JheF0KKyAgICBwdW5wY2tsYncgICBtbTAsICAgICAgICBtbTAKKyAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTEKKyAgICBwc2h1ZncgICAgICBtbTAsICAgICAgICBtbTAsIDB4MAorICAgIHBzaHVmdyAgICAgIG1tMSwgICAgICAgIG1tMSwgMHgwCisgICAgbW92cSAgW3JkaSAgICBdLCAgICAgICAgbW0wCisgICAgbW92cSAgW3JkaStyY3hdLCAgICAgICAgbW0xCisgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KKyAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQorICAgIGRlYyAgICAgICAgIGVkeAorICAgIGpueiAudnA4X2ludHJhX3ByZWRfdXZfaG9fJTFfbG9vcAorJWVsc2UKKyAgICBtb3ZkICAgICAgICB4bW0wLCAgICAgICBbcnNpXQorICAgIG1vdmQgICAgICAgIHhtbTMsICAgICAgIFtyc2krcmF4XQorICAgIG1vdmQgICAgICAgIHhtbTEsICAgICAgIFtyc2krcmF4KjJdCisgICAgbW92ZCAgICAgICAgeG1tNCwgICAgICAgW3JzaStyYnhdCisgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgeG1tMworICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTQKKyAgICBwc2h1ZmIgICAgICB4bW0wLCAgICAgICB4bW0yCisgICAgcHNodWZiICAgICAgeG1tMSwgICAgICAgeG1tMgorICAgIG1vdnEgICBbcmRpICAgIF0sICAgICAgIHhtbTAKKyAgICBtb3ZocHMgW3JkaStyY3hdLCAgICAgICB4bW0wCisgICAgbW92cSBbcmRpK3JjeCoyXSwgICAgICAgeG1tMQorICAgIG1vdmhwcyBbcmRpK3JkeF0sICAgICAgIHhtbTEKKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCo0XQorICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjRdCisgICAgbW92ZCAgICAgICAgeG1tMCwgICAgICAgW3JzaV0KKyAgICBtb3ZkICAgICAgICB4bW0zLCAgICAgICBbcnNpK3JheF0KKyAgICBtb3ZkICAgICAgICB4bW0xLCAgICAgICBbcnNpK3JheCoyXQorICAgIG1vdmQgICAgICAgIHhtbTQsICAgICAgIFtyc2krcmJ4XQorICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgIHhtbTMKKyAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW00CisgICAgcHNodWZiICAgICAgeG1tMCwgICAgICAgeG1tMgorICAgIHBzaHVmYiAgICAgIHhtbTEsICAgICAgIHhtbTIKKyAgICBtb3ZxICAgW3JkaSAgICBdLCAgICAgICB4bW0wCisgICAgbW92aHBzIFtyZGkrcmN4XSwgICAgICAgeG1tMAorICAgIG1vdnEgW3JkaStyY3gqMl0sICAgICAgIHhtbTEKKyAgICBtb3ZocHMgW3JkaStyZHhdLCAgICAgICB4bW0xCislZW5kaWYKKworICAgIDsgYmVnaW4gZXBpbG9nCislaWZpZG4gJTEsIHNzc2UzCisgICAgUkVTVE9SRV9HT1QKKyVpZm5kZWYgR0VUX0dPVF9TQVZFX0FSRworICAgIHBvcCAgICAgICAgIHJieAorJWVuZGlmCislZW5kaWYKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CislZW5kbWFjcm8KKwordnA4X2ludHJhX3ByZWRfdXZfaG8gbW14MgordnA4X2ludHJhX3ByZWRfdXZfaG8gc3NzZTMKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfeV9kY19zc2UyKAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCis7ICAgIGludCBkc3Rfc3RyaWRlCis7ICAgIHVuc2lnbmVkIGNoYXIgKmFib3ZlLAorOyAgICB1bnNpZ25lZCBjaGFyICpsZWZ0LAorOyAgICBpbnQgbGVmdF9zdHJpZGUKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF95X2RjX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF95X2RjX3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgOyBmcm9tIHRvcAorICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7YWJvdmUKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMykgO2xlZnQKKyAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtsZWZ0X3N0cmlkZTsKKworICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAKKyAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmRpXQorICAgIHBzYWRidyAgICAgIHhtbTEsICAgICAgIHhtbTAKKyAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICB4bW0xCisgICAgcHVucGNraHFkcSAgeG1tMSwgICAgICAgeG1tMQorICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIHhtbTIKKworICAgIDsgZnJvbSBsZWZ0CisgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JheCozXQorCisgICAgbW92enggICAgICAgZWN4LCAgICAgICAgYnl0ZSBbcnNpXQorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXhdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheCoyXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyZGldCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqNF0KKworICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4XQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXgqMl0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmRpXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjRdCisKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2ldCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheF0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4KjJdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JkaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCo0XQorCisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXhdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheCoyXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyZGldCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisKKyAgICA7IGFkZCB1cAorICAgIHBleHRydyAgICAgIGVkeCwgICAgICAgIHhtbTEsIDB4MAorICAgIGxlYSAgICAgICAgIGVkeCwgICAgICAgIFtlZHgrZWN4KzE2XQorICAgIHNhciAgICAgICAgIGVkeCwgICAgICAgIDUKKyAgICBtb3ZkICAgICAgICB4bW0xLCAgICAgICBlZHgKKyAgICA7IEZJWE1FIHVzZSBwc2h1ZmIgZm9yIHNzc2UzIHZlcnNpb24KKyAgICBwc2h1Zmx3ICAgICB4bW0xLCAgICAgICB4bW0xLCAweDAKKyAgICBwdW5wY2tscWRxICB4bW0xLCAgICAgICB4bW0xCisgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMQorCisgICAgOyB3cml0ZSBvdXQKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICAyCisgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDApIDtkc3Q7CisgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7ZHN0X3N0cmlkZQorICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyY3gqM10KKworLmxhYmVsCisgICAgbW92ZHFhIFtyZGkgICAgICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmRpK3JjeCAgXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkaStyY3gqMl0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyZGkrcmF4ICBdLCAgICAgeG1tMQorICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjRdCisgICAgbW92ZHFhIFtyZGkgICAgICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmRpK3JjeCAgXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkaStyY3gqMl0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyZGkrcmF4ICBdLCAgICAgeG1tMQorICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjRdCisgICAgZGVjICAgICAgICAgcnNpCisgICAgam56IC5sYWJlbAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIHZwOF9pbnRyYV9wcmVkX3lfZGN0b3Bfc3NlMigKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICB1bnNpZ25lZCBjaGFyICphYm92ZSwKKzsgICAgdW5zaWduZWQgY2hhciAqbGVmdCwKKzsgICAgaW50IGxlZnRfc3RyaWRlCis7ICAgICkKK2dsb2JhbCBzeW0odnA4X2ludHJhX3ByZWRfeV9kY3RvcF9zc2UyKSBQUklWQVRFCitzeW0odnA4X2ludHJhX3ByZWRfeV9kY3RvcF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBHRVRfR09UICAgICByYngKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDthcmcoMyksIGFyZyg0KSBub3QgdXNlZAorCisgICAgOyBmcm9tIHRvcAorICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIGFyZygyKSA7YWJvdmU7CisgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMAorICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyY3hdCisgICAgcHNhZGJ3ICAgICAgeG1tMSwgICAgICAgeG1tMAorICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTEKKyAgICBwdW5wY2tocWRxICB4bW0xLCAgICAgICB4bW0xCisgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgeG1tMgorCisgICAgOyBhZGQgdXAKKyAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICBbR0xPQkFMKGRjXzgpXQorICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgIDQKKyAgICA7IEZJWE1FIHVzZSBwc2h1ZmIgZm9yIHNzc2UzIHZlcnNpb24KKyAgICBwc2h1Zmx3ICAgICB4bW0xLCAgICAgICB4bW0xLCAweDAKKyAgICBwdW5wY2tscWRxICB4bW0xLCAgICAgICB4bW0xCisgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMQorCisgICAgOyB3cml0ZSBvdXQKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICAyCisgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDApIDtkc3Q7CisgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7ZHN0X3N0cmlkZQorICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyY3gqM10KKworLmxhYmVsCisgICAgbW92ZHFhIFtyZHggICAgICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmR4K3JjeCAgXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkeCtyY3gqMl0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyZHgrcmF4ICBdLCAgICAgeG1tMQorICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyZHgrcmN4KjRdCisgICAgbW92ZHFhIFtyZHggICAgICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmR4K3JjeCAgXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkeCtyY3gqMl0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyZHgrcmF4ICBdLCAgICAgeG1tMQorICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyZHgrcmN4KjRdCisgICAgZGVjICAgICAgICAgcnNpCisgICAgam56IC5sYWJlbAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBSRVNUT1JFX0dPVAorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfeV9kY2xlZnRfc3NlMigKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICB1bnNpZ25lZCBjaGFyICphYm92ZSwKKzsgICAgdW5zaWduZWQgY2hhciAqbGVmdCwKKzsgICAgaW50IGxlZnRfc3RyaWRlCis7ICAgICkKK2dsb2JhbCBzeW0odnA4X2ludHJhX3ByZWRfeV9kY2xlZnRfc3NlMikgUFJJVkFURQorc3ltKHZwOF9pbnRyYV9wcmVkX3lfZGNsZWZ0X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgO2FyZygyKSBub3QgdXNlZAorCisgICAgOyBmcm9tIGxlZnQKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMykgO2xlZnQ7CisgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7bGVmdF9zdHJpZGU7CisKKyAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmF4KjNdCisgICAgbW92enggICAgICAgZWN4LCAgICAgICAgYnl0ZSBbcnNpXQorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXhdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheCoyXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyZGldCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqNF0KKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2ldCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheF0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4KjJdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JkaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCo0XQorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaV0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmF4XQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXgqMl0KKyAgICBhZGQgICAgICAgICBlY3gsICAgICAgICBlZHgKKyAgICBtb3Z6eCAgICAgICBlZHgsICAgICAgICBieXRlIFtyc2krcmRpXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjRdCisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyYXhdCisgICAgYWRkICAgICAgICAgZWN4LCAgICAgICAgZWR4CisgICAgbW92enggICAgICAgZWR4LCAgICAgICAgYnl0ZSBbcnNpK3JheCoyXQorICAgIGFkZCAgICAgICAgIGVjeCwgICAgICAgIGVkeAorICAgIG1vdnp4ICAgICAgIGVkeCwgICAgICAgIGJ5dGUgW3JzaStyZGldCisgICAgbGVhICAgICAgICAgZWR4LCAgICAgICAgW2VjeCtlZHgrOF0KKworICAgIDsgYWRkIHVwCisgICAgc2hyICAgICAgICAgZWR4LCAgICAgICAgNAorICAgIG1vdmQgICAgICAgIHhtbTEsICAgICAgIGVkeAorICAgIDsgRklYTUUgdXNlIHBzaHVmYiBmb3Igc3NzZTMgdmVyc2lvbgorICAgIHBzaHVmbHcgICAgIHhtbTEsICAgICAgIHhtbTEsIDB4MAorICAgIHB1bnBja2xxZHEgIHhtbTEsICAgICAgIHhtbTEKKyAgICBwYWNrdXN3YiAgICB4bW0xLCAgICAgICB4bW0xCisKKyAgICA7IHdyaXRlIG91dAorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIDIKKyAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMCkgO2RzdDsKKyAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtkc3Rfc3RyaWRlCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JjeCozXQorCisubGFiZWwKKyAgICBtb3ZkcWEgW3JkaSAgICAgIF0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyZGkrcmN4ICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmRpK3JjeCoyXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkaStyYXggIF0sICAgICB4bW0xCisgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqNF0KKyAgICBtb3ZkcWEgW3JkaSAgICAgIF0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyZGkrcmN4ICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmRpK3JjeCoyXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkaStyYXggIF0sICAgICB4bW0xCisgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqNF0KKyAgICBkZWMgICAgICAgICByc2kKKyAgICBqbnogLmxhYmVsCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfeV9kYzEyOF9zc2UyKAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCis7ICAgIGludCBkc3Rfc3RyaWRlCis7ICAgIHVuc2lnbmVkIGNoYXIgKmFib3ZlLAorOyAgICB1bnNpZ25lZCBjaGFyICpsZWZ0LAorOyAgICBpbnQgbGVmdF9zdHJpZGUKKzsgICAgKQorZ2xvYmFsIHN5bSh2cDhfaW50cmFfcHJlZF95X2RjMTI4X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF95X2RjMTI4X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIHB1c2ggICAgICAgIHJzaQorICAgIEdFVF9HT1QgICAgIHJieAorICAgIDsgZW5kIHByb2xvZworCisgICAgO2FyZygyKSwgYXJnKDMpLCBhcmcoNCkgbm90IHVzZWQKKworICAgIDsgd3JpdGUgb3V0CisgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgMgorICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtHTE9CQUwoZGNfMTI4KV0KKyAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoMCkgO2RzdDsKKyAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtkc3Rfc3RyaWRlCisgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCozXQorCisubGFiZWwKKyAgICBtb3ZkcWEgW3JheCAgICAgIF0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyYXgrcmR4ICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmF4K3JkeCoyXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JheCtyY3ggIF0sICAgICB4bW0xCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCtyZHgqNF0KKyAgICBtb3ZkcWEgW3JheCAgICAgIF0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyYXgrcmR4ICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmF4K3JkeCoyXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JheCtyY3ggIF0sICAgICB4bW0xCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCtyZHgqNF0KKyAgICBkZWMgICAgICAgICByc2kKKyAgICBqbnogLmxhYmVsCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIFJFU1RPUkVfR09UCisgICAgcG9wICAgICAgICAgcnNpCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfaW50cmFfcHJlZF95X3RtX3NzZTIoCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKzsgICAgaW50IGRzdF9zdHJpZGUKKzsgICAgdW5zaWduZWQgY2hhciAqYWJvdmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmxlZnQsCis7ICAgIGludCBsZWZ0X3N0cmlkZQorOyAgICApCislbWFjcm8gdnA4X2ludHJhX3ByZWRfeV90bSAxCitnbG9iYWwgc3ltKHZwOF9pbnRyYV9wcmVkX3lfdG1fJTEpIFBSSVZBVEUKK3N5bSh2cDhfaW50cmFfcHJlZF95X3RtXyUxKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICBHRVRfR09UICAgICByYngKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDsgcmVhZCB0b3Agcm93CisgICAgbW92ICAgICAgICAgZWR4LCAgICAgICAgOAorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygyKSA7YWJvdmUKKyAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtsZWZ0X3N0cmlkZTsKKyAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wCislaWZpZG4gJTEsIHNzc2UzCisgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgW0dMT0JBTChkY18xMDI0KV0KKyVlbmRpZgorICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyc2ldCisgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMQorICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAKKyAgICBwdW5wY2toYncgICB4bW0yLCAgICAgICB4bW0wCisKKyAgICA7IHNldCB1cCBsZWZ0IHB0cnMgYW5zIHN1YnRyYWN0IHRvcGxlZnQKKyAgICBtb3ZkICAgICAgICB4bW00LCAgICAgICBbcnNpLTFdCisgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDMpIDtsZWZ0CislaWZpZG4gJTEsIHNzZTIKKyAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wCisgICAgcHNodWZsdyAgICAgeG1tNCwgICAgICAgeG1tNCwgMHgwCisgICAgcHVucGNrbHFkcSAgeG1tNCwgICAgICAgeG1tNAorJWVsc2UKKyAgICBwc2h1ZmIgICAgICB4bW00LCAgICAgICB4bW0zCislZW5kaWYKKyAgICBwc3VidyAgICAgICB4bW0xLCAgICAgICB4bW00CisgICAgcHN1YncgICAgICAgeG1tMiwgICAgICAgeG1tNAorCisgICAgOyBzZXQgdXAgZGVzdCBwdHJzCisgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDApIDtkc3Q7CisgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7ZHN0X3N0cmlkZQordnA4X2ludHJhX3ByZWRfeV90bV8lMV9sb29wOgorICAgIG1vdmQgICAgICAgIHhtbTQsICAgICAgIFtyc2ldCisgICAgbW92ZCAgICAgICAgeG1tNSwgICAgICAgW3JzaStyYXhdCislaWZpZG4gJTEsIHNzZTIKKyAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wCisgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMAorICAgIHBzaHVmbHcgICAgIHhtbTQsICAgICAgIHhtbTQsIDB4MAorICAgIHBzaHVmbHcgICAgIHhtbTUsICAgICAgIHhtbTUsIDB4MAorICAgIHB1bnBja2xxZHEgIHhtbTQsICAgICAgIHhtbTQKKyAgICBwdW5wY2tscWRxICB4bW01LCAgICAgICB4bW01CislZWxzZQorICAgIHBzaHVmYiAgICAgIHhtbTQsICAgICAgIHhtbTMKKyAgICBwc2h1ZmIgICAgICB4bW01LCAgICAgICB4bW0zCislZW5kaWYKKyAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW00CisgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tNQorICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICB4bW0yCisgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgeG1tMQorICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgIHhtbTIKKyAgICBwYWNrdXN3YiAgICB4bW00LCAgICAgICB4bW02CisgICAgcGFja3Vzd2IgICAgeG1tNSwgICAgICAgeG1tNworICAgIG1vdmRxYSBbcmRpICAgIF0sICAgICAgIHhtbTQKKyAgICBtb3ZkcWEgW3JkaStyY3hdLCAgICAgICB4bW01CisgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KKyAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQorICAgIGRlYyAgICAgICAgIGVkeAorICAgIGpueiB2cDhfaW50cmFfcHJlZF95X3RtXyUxX2xvb3AKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgUkVTVE9SRV9HT1QKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CislZW5kbWFjcm8KKwordnA4X2ludHJhX3ByZWRfeV90bSBzc2UyCit2cDhfaW50cmFfcHJlZF95X3RtIHNzc2UzCisKKzt2b2lkIHZwOF9pbnRyYV9wcmVkX3lfdmVfc3NlMigKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0LAorOyAgICBpbnQgZHN0X3N0cmlkZQorOyAgICB1bnNpZ25lZCBjaGFyICphYm92ZSwKKzsgICAgdW5zaWduZWQgY2hhciAqbGVmdCwKKzsgICAgaW50IGxlZnRfc3RyaWRlCis7ICAgICkKK2dsb2JhbCBzeW0odnA4X2ludHJhX3ByZWRfeV92ZV9zc2UyKSBQUklWQVRFCitzeW0odnA4X2ludHJhX3ByZWRfeV92ZV9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDthcmcoMyksIGFyZyg0KSBub3QgdXNlZAorCisgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgYXJnKDIpIDthYm92ZTsKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICAyCisgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7ZHN0X3N0cmlkZQorCisgICAgOyByZWFkIGZyb20gdG9wCisgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgW3JheF0KKworICAgIDsgd3JpdGUgb3V0CisgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgYXJnKDApIDtkc3Q7CisgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCozXQorCisubGFiZWwKKyAgICBtb3ZkcWEgW3JheCAgICAgIF0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyYXgrcmR4ICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmF4K3JkeCoyXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JheCtyY3ggIF0sICAgICB4bW0xCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCtyZHgqNF0KKyAgICBtb3ZkcWEgW3JheCAgICAgIF0sICAgICB4bW0xCisgICAgbW92ZHFhIFtyYXgrcmR4ICBdLCAgICAgeG1tMQorICAgIG1vdmRxYSBbcmF4K3JkeCoyXSwgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JheCtyY3ggIF0sICAgICB4bW0xCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCtyZHgqNF0KKyAgICBkZWMgICAgICAgICByc2kKKyAgICBqbnogLmxhYmVsCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ludHJhX3ByZWRfeV9ob19zc2UyKAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCis7ICAgIGludCBkc3Rfc3RyaWRlCis7ICAgIHVuc2lnbmVkIGNoYXIgKmFib3ZlLAorOyAgICB1bnNpZ25lZCBjaGFyICpsZWZ0LAorOyAgICBpbnQgbGVmdF9zdHJpZGUsCis7ICAgICkKK2dsb2JhbCBzeW0odnA4X2ludHJhX3ByZWRfeV9ob19zc2UyKSBQUklWQVRFCitzeW0odnA4X2ludHJhX3ByZWRfeV9ob19zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDthcmcoMikgbm90IHVzZWQKKworICAgIDsgcmVhZCBmcm9tIGxlZnQgYW5kIHdyaXRlIG91dAorICAgIG1vdiAgICAgICAgIGVkeCwgICAgICAgIDgKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMykgO2xlZnQ7CisgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7bGVmdF9zdHJpZGU7CisgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDApIDtkc3Q7CisgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7ZHN0X3N0cmlkZQorCit2cDhfaW50cmFfcHJlZF95X2hvX3NzZTJfbG9vcDoKKyAgICBtb3ZkICAgICAgICB4bW0wLCAgICAgICBbcnNpXQorICAgIG1vdmQgICAgICAgIHhtbTEsICAgICAgIFtyc2krcmF4XQorICAgIDsgRklYTUUgdXNlIHBzaHVmYiBmb3Igc3NzZTMgdmVyc2lvbgorICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgIHhtbTAKKyAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0xCisgICAgcHNodWZsdyAgICAgeG1tMCwgICAgICAgeG1tMCwgMHgwCisgICAgcHNodWZsdyAgICAgeG1tMSwgICAgICAgeG1tMSwgMHgwCisgICAgcHVucGNrbHFkcSAgeG1tMCwgICAgICAgeG1tMAorICAgIHB1bnBja2xxZHEgIHhtbTEsICAgICAgIHhtbTEKKyAgICBtb3ZkcWEgW3JkaSAgICBdLCAgICAgICB4bW0wCisgICAgbW92ZHFhIFtyZGkrcmN4XSwgICAgICAgeG1tMQorICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqMl0KKyAgICBkZWMgICAgICAgICBlZHgKKyAgICBqbnogdnA4X2ludHJhX3ByZWRfeV9ob19zc2UyX2xvb3AKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK2RjXzEyODoKKyAgICB0aW1lcyAxNiBkYiAxMjgKK2RjXzQ6CisgICAgdGltZXMgNCBkdyA0CithbGlnbiAxNgorZGNfODoKKyAgICB0aW1lcyA4IGR3IDgKK2FsaWduIDE2CitkY18xMDI0OgorICAgIHRpbWVzIDggZHcgMHg0MDAKK2FsaWduIDE2CitkY18wMDAwMTExMToKKyAgICB0aW1lcyA4IGRiIDAKKyAgICB0aW1lcyA4IGRiIDEKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9yZWNvbl93cmFwcGVyX3NzZTIuYyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9yZWNvbl93cmFwcGVyX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDgyZmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3JlY29uX3dyYXBwZXJfc3NlMi5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorCisjZGVmaW5lIGJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9wcm90b3R5cGUoc3ltKSBcCisgICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFib3ZlLCBcCisgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGVmdCwgaW50IGxlZnRfc3RyaWRlKQordHlwZWRlZiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcHJvdG90eXBlKCgqYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X2ZuX3QpKTsKKworZXh0ZXJuIGJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9wcm90b3R5cGUodnA4X2ludHJhX3ByZWRfdXZfZGNfbW14Mik7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3Byb3RvdHlwZSh2cDhfaW50cmFfcHJlZF91dl9kY3RvcF9tbXgyKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3V2X2RjbGVmdF9tbXgyKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3V2X2RjMTI4X21teCk7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3Byb3RvdHlwZSh2cDhfaW50cmFfcHJlZF91dl9ob19tbXgyKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3V2X2hvX3Nzc2UzKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3V2X3ZlX21teCk7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3Byb3RvdHlwZSh2cDhfaW50cmFfcHJlZF91dl90bV9zc2UyKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3V2X3RtX3Nzc2UzKTsKKworc3RhdGljIHZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl94ODYoTUFDUk9CTE9DS0QgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogdWFib3ZlX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB2YWJvdmVfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHVsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X2ZuX3QgdG1fZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9mbl90IGhvX2Z1bmMpCit7CisgICAgaW50IG1vZGUgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlOworICAgIGJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9mbl90IGZuOworCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgIFZfUFJFRDogZm4gPSB2cDhfaW50cmFfcHJlZF91dl92ZV9tbXg7IGJyZWFrOworICAgICAgICBjYXNlICBIX1BSRUQ6IGZuID0gaG9fZnVuYzsgYnJlYWs7CisgICAgICAgIGNhc2UgVE1fUFJFRDogZm4gPSB0bV9mdW5jOyBicmVhazsKKyAgICAgICAgY2FzZSBEQ19QUkVEOgorICAgICAgICAgICAgaWYgKHgtPnVwX2F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGlmICh4LT5sZWZ0X2F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBmbiA9IHZwOF9pbnRyYV9wcmVkX3V2X2RjX21teDI7IGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZuID0gdnA4X2ludHJhX3ByZWRfdXZfZGN0b3BfbW14MjsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh4LT5sZWZ0X2F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGZuID0gdnA4X2ludHJhX3ByZWRfdXZfZGNsZWZ0X21teDI7IGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbiA9IHZwOF9pbnRyYV9wcmVkX3V2X2RjMTI4X21teDsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuOworICAgIH0KKworICAgIGZuKGRzdF91LCBkc3Rfc3RyaWRlLCB1YWJvdmVfcm93LCB1bGVmdCwgbGVmdF9zdHJpZGUpOworICAgIGZuKGRzdF92LCBkc3Rfc3RyaWRlLCB2YWJvdmVfcm93LCB2bGVmdCwgbGVmdF9zdHJpZGUpOworfQorCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfc19zc2UyKE1BQ1JPQkxPQ0tEICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogdWFib3ZlX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHZhYm92ZV9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB1bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB1cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB2cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkX3N0cmlkZSkKK3sKKyAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3g4Nih4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhYm92ZV9yb3csIHZhYm92ZV9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXByZWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwcmVkX3B0ciwgcHJlZF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2ludHJhX3ByZWRfdXZfdG1fc3NlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfaW50cmFfcHJlZF91dl9ob19tbXgyKTsKK30KKwordm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3Nfc3NzZTMoTUFDUk9CTE9DS0QgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogdWFib3ZlX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB2YWJvdmVfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHVsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHVwcmVkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB2cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9zdHJpZGUpCit7CisgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl94ODYoeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YWJvdmVfcm93LCB2YWJvdmVfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcmVkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHJlZF9wdHIsIHByZWRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9pbnRyYV9wcmVkX3V2X3RtX3Nzc2UzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9pbnRyYV9wcmVkX3V2X2hvX3Nzc2UzKTsKK30KKworI2RlZmluZSBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9wcm90b3R5cGUoc3ltKSBcCisgICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFib3ZlLCBcCisgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGVmdCwgaW50IGxlZnRfc3RyaWRlKQordHlwZWRlZiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9wcm90b3R5cGUoKCpidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9mbl90KSk7CisKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9wcm90b3R5cGUodnA4X2ludHJhX3ByZWRfeV9kY19zc2UyKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9wcm90b3R5cGUodnA4X2ludHJhX3ByZWRfeV9kY3RvcF9zc2UyKTsKK2V4dGVybiBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9wcm90b3R5cGUodnA4X2ludHJhX3ByZWRfeV9kY2xlZnRfc3NlMik7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3lfZGMxMjhfc3NlMik7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3lfaG9fc3NlMik7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3lfdmVfc3NlMik7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3lfdG1fc3NlMik7CitleHRlcm4gYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcHJvdG90eXBlKHZwOF9pbnRyYV9wcmVkX3lfdG1fc3NzZTMpOworCitzdGF0aWMgdm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfeDg2KE1BQ1JPQkxPQ0tEICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogeWFib3ZlX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogeWxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfZm5fdCB0bV9mdW5jKQoreworICAgIGludCBtb2RlID0geC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZTsKKyAgICBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfZm5fdCBmbjsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlICBWX1BSRUQ6IGZuID0gdnA4X2ludHJhX3ByZWRfeV92ZV9zc2UyOyBicmVhazsKKyAgICAgICAgY2FzZSAgSF9QUkVEOiBmbiA9IHZwOF9pbnRyYV9wcmVkX3lfaG9fc3NlMjsgYnJlYWs7CisgICAgICAgIGNhc2UgVE1fUFJFRDogZm4gPSB0bV9mdW5jOyBicmVhazsKKyAgICAgICAgY2FzZSBEQ19QUkVEOgorICAgICAgICAgICAgaWYgKHgtPnVwX2F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGlmICh4LT5sZWZ0X2F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBmbiA9IHZwOF9pbnRyYV9wcmVkX3lfZGNfc3NlMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm4gPSB2cDhfaW50cmFfcHJlZF95X2RjdG9wX3NzZTI7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeC0+bGVmdF9hdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBmbiA9IHZwOF9pbnRyYV9wcmVkX3lfZGNsZWZ0X3NzZTI7IGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbiA9IHZwOF9pbnRyYV9wcmVkX3lfZGMxMjhfc3NlMjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuOworICAgIH0KKworICAgIGZuKGRzdF95LCBkc3Rfc3RyaWRlLCB5YWJvdmVfcm93LCB5bGVmdCwgbGVmdF9zdHJpZGUpOworICAgIHJldHVybjsKK30KKwordm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19zc2UyKE1BQ1JPQkxPQ0tEICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB5YWJvdmVfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB5bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHlwcmVkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUpCit7CisgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3g4Nih4LCB5YWJvdmVfcm93LCB5cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3N0cmlkZSwgeWxlZnQsIGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2ludHJhX3ByZWRfeV90bV9zc2UyKTsKK30KKwordm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19zc3NlMyhNQUNST0JMT0NLRCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIHlhYm92ZV9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiB5bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogeXByZWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUpCit7CisgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3g4Nih4LCB5YWJvdmVfcm93LCB5cHJlZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zdHJpZGUsIHlsZWZ0LCBsZWZ0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9pbnRyYV9wcmVkX3lfdG1fc3NzZTMpOworCit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc2FkX21teC5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc2FkX21teC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyMTEyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zYWRfbW14LmFzbQpAQCAtMCwwICsxLDQyNyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCitnbG9iYWwgc3ltKHZwOF9zYWQxNngxNl9tbXgpIFBSSVZBVEUKK2dsb2JhbCBzeW0odnA4X3NhZDh4MTZfbW14KSBQUklWQVRFCitnbG9iYWwgc3ltKHZwOF9zYWQ4eDhfbW14KSBQUklWQVRFCitnbG9iYWwgc3ltKHZwOF9zYWQ0eDRfbW14KSBQUklWQVRFCitnbG9iYWwgc3ltKHZwOF9zYWQxNng4X21teCkgUFJJVkFURQorCis7dW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl9tbXgoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlKQorc3ltKHZwOF9zYWQxNngxNl9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JheCo4XQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcmN4K3JheCo4XQorICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNiwgICAgICAgIG1tNgorCisueDE2eDE2c2FkX21teF9sb29wOgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFFXT1JEIFBUUiBbcnNpKzhdCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgUVdPUkQgUFRSIFtyZGkrOF0KKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICBtbTIKKworICAgICAgICBwc3VidXNiICAgICAgICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTEsICAgICAgICBtbTQKKworICAgICAgICBwc3VidXNiICAgICAgICAgbW0yLCAgICAgICAgbW0zCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTMsICAgICAgICBtbTUKKworICAgICAgICBwb3IgICAgICAgICAgICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIHBvciAgICAgICAgICAgICBtbTIsICAgICAgICBtbTMKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBtbTIKKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW02CisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTIsICAgICAgICBtbTYKKworICAgICAgICBwdW5wY2toYncgICAgICAgbW0xLCAgICAgICAgbW02CisgICAgICAgIHB1bnBja2hidyAgICAgICBtbTMsICAgICAgICBtbTYKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW0yCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICBtbTMKKworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgIHJkeAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTAKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMQorCisgICAgICAgIGNtcCAgICAgICAgICAgICByc2ksICAgICAgICByY3gKKyAgICAgICAgam5lICAgICAgICAgICAgIC54MTZ4MTZzYWRfbW14X2xvb3AKKworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBtbTcKKworICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0wLCAgICAgICAgbW02CisgICAgICAgIHB1bnBja2h3ZCAgICAgICBtbTcsICAgICAgICBtbTYKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW03CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTAKKworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTAsICAgICAgICAzMgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBtb3YgcnNwLCByYnAKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dW5zaWduZWQgaW50IHZwOF9zYWQ4eDE2X21teCgKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlZl9zdHJpZGUpCitzeW0odnA4X3NhZDh4MTZfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKKyAgICBwdXNoIHJzaQorICAgIHB1c2ggcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtyZWZfcHRyCisKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKKworICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JzaStyYXgqOF0KKworICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyYXgqOF0KKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNworCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTYsICAgICAgICBtbTYKKworLng4eDE2c2FkX21teF9sb29wOgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpXQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKKyAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMCwgICAgICAgIG1tMQorCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTEsICAgICAgICBtbTIKKyAgICAgICAgcG9yICAgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMCwgICAgICAgIG1tNgorCisgICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICBtbTYKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4XQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICByZHgKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTIKKyAgICAgICAgY21wICAgICAgICAgICAgIHJzaSwgICAgICAgIHJjeAorCisgICAgICAgIGpuZSAgICAgICAgICAgICAueDh4MTZzYWRfbW14X2xvb3AKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgbW03CisgICAgICAgIHB1bnBja2x3ZCAgICAgICBtbTAsICAgICAgICBtbTYKKworICAgICAgICBwdW5wY2tod2QgICAgICAgbW03LCAgICAgICAgbW02CisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTAsICAgICAgICBtbTcKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgbW0wCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTAsICAgICAgICAzMgorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBtb3YgcnNwLCByYnAKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dW5zaWduZWQgaW50IHZwOF9zYWQ4eDhfbW14KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSkKK3N5bSh2cDhfc2FkOHg4X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyc2krcmF4KjhdCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTcKKworICAgICAgICBweG9yICAgICAgICAgICAgbW02LCAgICAgICAgbW02CisKKy54OHg4c2FkX21teF9sb29wOgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpXQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKKyAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMCwgICAgICAgIG1tMQorCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTEsICAgICAgICBtbTIKKyAgICAgICAgcG9yICAgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMCwgICAgICAgIG1tNgorCisgICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICBtbTYKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMgorCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgIFtyc2krcmF4XQorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgcmR4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgbW0wCisgICAgICAgIGNtcCAgICAgICAgICAgICByc2ksICAgICAgICByY3gKKworICAgICAgICBqbmUgICAgICAgICAgICAgLng4eDhzYWRfbW14X2xvb3AKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgbW03CisgICAgICAgIHB1bnBja2x3ZCAgICAgICBtbTAsICAgICAgICBtbTYKKworICAgICAgICBwdW5wY2tod2QgICAgICAgbW03LCAgICAgICAgbW02CisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTAsICAgICAgICBtbTcKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgbW0wCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTAsICAgICAgICAzMgorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBtb3YgcnNwLCByYnAKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dW5zaWduZWQgaW50IHZwOF9zYWQ0eDRfbW14KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSkKK3N5bSh2cDhfc2FkNHg0X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMCwgICAgICAgIERXT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyZGldCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcnNpK3JheF0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbcmRpK3JkeF0KKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW0yCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTEsICAgICAgICBtbTMKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgbW0wCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTAsICAgICAgICBtbTEKKworICAgICAgICBwc3VidXNiICAgICAgICAgbW0xLCAgICAgICAgbW0yCisgICAgICAgIHBvciAgICAgICAgICAgICBtbTAsICAgICAgICBtbTEKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgbW0wCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICBtbTMKKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW0zCisgICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICBtbTMKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW0yCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTQsICAgICAgICBEV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNSwgICAgICAgIERXT1JEIFBUUiBbcmRpXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTYsICAgICAgICBEV09SRCBQVFIgW3JzaStyYXhdCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTcsICAgICAgICBEV09SRCBQVFIgW3JkaStyZHhdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNCwgICAgICAgIG1tNgorICAgICAgICBwdW5wY2tsYncgICAgICAgbW01LCAgICAgICAgbW03CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIG1tNAorICAgICAgICBwc3VidXNiICAgICAgICAgbW00LCAgICAgICAgbW01CisKKyAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tNSwgICAgICAgIG1tNgorICAgICAgICBwb3IgICAgICAgICAgICAgbW00LCAgICAgICAgbW01CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIG1tNAorICAgICAgICBwdW5wY2tsYncgICAgICAgbW00LCAgICAgICAgbW0zCisKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tNSwgICAgICAgIG1tMworICAgICAgICBwYWRkdyAgICAgICAgICAgbW00LCAgICAgICAgbW01CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tNAorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgbW0wCisKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMCwgICAgICAgIG1tMworICAgICAgICBwdW5wY2tod2QgICAgICAgbW0xLCAgICAgICAgbW0zCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgbW0wCisKKyAgICAgICAgcHNybHEgICAgICAgICAgIG1tMCwgICAgICAgIDMyCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTAsICAgICAgICBtbTEKKworICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW0wCisKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIG1vdiByc3AsIHJicAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDhfbW14KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSkKK3N5bSh2cDhfc2FkMTZ4OF9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JheCo4XQorICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNiwgICAgICAgIG1tNgorCisueDE2eDhzYWRfbW14X2xvb3A6CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgW3JkaV0KKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgW3JzaSs4XQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgW3JkaSs4XQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIG1tMgorCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTAsICAgICAgICBtbTEKKyAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMSwgICAgICAgIG1tNAorCisgICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTIsICAgICAgICBtbTMKKyAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMywgICAgICAgIG1tNQorCisgICAgICAgIHBvciAgICAgICAgICAgICBtbTAsICAgICAgICBtbTEKKyAgICAgICAgcG9yICAgICAgICAgICAgIG1tMiwgICAgICAgIG1tMworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIG1tMgorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTYKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tMSwgICAgICAgIG1tNgorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTIsICAgICAgICBtbTYKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tMywgICAgICAgIG1tNgorCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgbW0zCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQorICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXhdCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgIHJkeAorICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHJzaSwgICAgICAgIHJjeAorICAgICAgICBqbmUgICAgICAgICAgICAgLngxNng4c2FkX21teF9sb29wCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNworICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0wLCAgICAgICAgbW02CisKKyAgICAgICAgcHVucGNraHdkICAgICAgIG1tNywgICAgICAgIG1tNgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW03CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tMAorICAgICAgICBwc3JscSAgICAgICAgICAgbW0wLCAgICAgICAgMzIKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTcKKworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgbW92IHJzcCwgcmJwCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc2FkX3NzZTIuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3NhZF9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDg2YWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3NhZF9zc2UyLmFzbQpAQCAtMCwwICsxLDQxMCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7dW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl93bXQoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlKQorZ2xvYmFsIHN5bSh2cDhfc2FkMTZ4MTZfd210KSBQUklWQVRFCitzeW0odnA4X3NhZDE2eDE2X3dtdCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0CisgICAgU0FWRV9YTU0gNgorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyc2krcmF4KjhdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmF4KjhdCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICB4bW02CisKKy54MTZ4MTZzYWRfd210X2xvb3A6CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIFFXT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgUVdPUkQgUFRSIFtyc2krOF0KKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgUVdPUkQgUFRSIFtyZGldCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBRV09SRCBQVFIgW3JkaSs4XQorCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW00LCAgICAgICBRV09SRCBQVFIgW3JzaStyYXhdCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW01LCAgICAgICBRV09SRCBQVFIgW3JkaStyZHhdCisKKworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMCwgICAgICAgeG1tMgorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgeG1tMworCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0wLCAgICAgICB4bW0xCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICBRV09SRCBQVFIgW3JzaStyYXgrOF0KKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgUVdPUkQgUFRSIFtyZGkrcmR4KzhdCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNCwgICAgICAgeG1tMgorCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICB4bW0zCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW00LCAgICAgICB4bW01CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTAKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTQKKworICAgICAgICBjbXAgICAgICAgICAgICAgcnNpLCAgICAgICAgcmN4CisgICAgICAgIGpuZSAgICAgICAgICAgICAueDE2eDE2c2FkX3dtdF9sb29wCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTYsICAgICAgIDgKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgorICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgeG1tMAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dW5zaWduZWQgaW50IHZwOF9zYWQ4eDE2X3dtdCgKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlZl9zdHJpZGUsCis7ICAgIGludCAgbWF4X3NhZCkKK2dsb2JhbCBzeW0odnA4X3NhZDh4MTZfd210KSBQUklWQVRFCitzeW0odnA4X3NhZDh4MTZfd210KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JieCo4XQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcmN4K3JieCo4XQorICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03CisKKy54OHgxNnNhZF93bXRfbG9vcDoKKworICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW03CisgICAgICAgIGNtcCAgICAgICAgICAgICBlYXgsICAgICAgICBhcmcoNCkKKyAgICAgICAgamEgICAgICAgICAgICAgIC54OHgxNnNhZF93bXRfZWFybHlfZXhpdAorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpXQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBRV09SRCBQVFIgW3JzaStyYnhdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBRV09SRCBQVFIgW3JkaStyZHhdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMCwgICAgICAgIG1tMQorICAgICAgICBwc2FkYncgICAgICAgICAgbW0yLCAgICAgICAgbW0zCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmJ4KjJdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTAKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMgorCisgICAgICAgIGNtcCAgICAgICAgICAgICByc2ksICAgICAgICByY3gKKyAgICAgICAgam5lICAgICAgICAgICAgIC54OHgxNnNhZF93bXRfbG9vcAorCisgICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTcKKworLng4eDE2c2FkX3dtdF9lYXJseV9leGl0OgorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBwb3AgICAgICAgICByYngKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3Vuc2lnbmVkIGludCB2cDhfc2FkOHg4X3dtdCgKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlZl9zdHJpZGUpCitnbG9iYWwgc3ltKHZwOF9zYWQ4eDhfd210KSBQUklWQVRFCitzeW0odnA4X3NhZDh4OF93bXQpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIHB1c2ggICAgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYngsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyc2krcmJ4KjhdCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTcKKworLng4eDhzYWRfd210X2xvb3A6CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworICAgICAgICBjbXAgICAgICAgICAgICAgZWF4LCAgICAgICAgYXJnKDQpCisgICAgICAgIGphICAgICAgICAgICAgICAueDh4OHNhZF93bXRfZWFybHlfZXhpdAorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTAsICAgICAgICBtbTEKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmJ4XQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICByZHgKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAorCisgICAgICAgIGNtcCAgICAgICAgICAgICByc2ksICAgICAgICByY3gKKyAgICAgICAgam5lICAgICAgICAgICAgIC54OHg4c2FkX3dtdF9sb29wCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworLng4eDhzYWRfd210X2Vhcmx5X2V4aXQ6CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIHBvcCAgICAgICAgIHJieAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3Vuc2lnbmVkIGludCB2cDhfc2FkNHg0X3dtdCgKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlZl9zdHJpZGUpCitnbG9iYWwgc3ltKHZwOF9zYWQ0eDRfd210KSBQUklWQVRFCitzeW0odnA4X3NhZDR4NF93bXQpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMCwgICAgICAgIERXT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyZGldCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcnNpK3JheF0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbcmRpK3JkeF0KKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW0yCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTEsICAgICAgICBtbTMKKworICAgICAgICBwc2FkYncgICAgICAgICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW00LCAgICAgICAgRFdPUkQgUFRSIFtyc2ldCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNSwgICAgICAgIERXT1JEIFBUUiBbcmRpXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW02LCAgICAgICAgRFdPUkQgUFRSIFtyc2krcmF4XQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTcsICAgICAgICBEV09SRCBQVFIgW3JkaStyZHhdCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTQsICAgICAgICBtbTYKKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW01LCAgICAgICAgbW03CisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTQsICAgICAgICBtbTUKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW00CisgICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTAKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3Vuc2lnbmVkIGludCB2cDhfc2FkMTZ4OF93bXQoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlKQorZ2xvYmFsIHN5bSh2cDhfc2FkMTZ4OF93bXQpIFBSSVZBVEUKK3N5bSh2cDhfc2FkMTZ4OF93bXQpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIHB1c2ggICAgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtyZWZfcHRyCisKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJieCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKKworICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JzaStyYngqOF0KKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNworCisueDE2eDhzYWRfd210X2xvb3A6CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworICAgICAgICBjbXAgICAgICAgICAgICAgZWF4LCAgICAgICAgYXJnKDQpCisgICAgICAgIGphICAgICAgICAgICAgICAueDE2eDhzYWRfd210X2Vhcmx5X2V4aXQKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgUVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBRV09SRCBQVFIgW3JzaSs4XQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBRV09SRCBQVFIgW3JkaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIFFXT1JEIFBUUiBbcnNpK3JieF0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFFXT1JEIFBUUiBbcmRpK3JkeF0KKworICAgICAgICBwc2FkYncgICAgICAgICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTMKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFtyc2krcmJ4KzhdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBRV09SRCBQVFIgW3JkaStyZHgrOF0KKworICAgICAgICBwc2FkYncgICAgICAgICAgbW00LCAgICAgICAgbW01CisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgICBtbTMKKworICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYngqMl0KKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmR4KjJdCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW00LCAgICAgICAgbW0xCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAorICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW00CisKKyAgICAgICAgY21wICAgICAgICAgICAgIHJzaSwgICAgICAgIHJjeAorICAgICAgICBqbmUgICAgICAgICAgICAgLngxNng4c2FkX3dtdF9sb29wCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNworCisueDE2eDhzYWRfd210X2Vhcmx5X2V4aXQ6CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIHBvcCAgICAgICAgIHJieAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2NvcHkzMnhuX3NzZTIoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgICAgaW50ICBkc3Rfc3RyaWRlLAorOyAgICBpbnQgaGVpZ2h0KTsKK2dsb2JhbCBzeW0odnA4X2NvcHkzMnhuX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfY29weTMyeG5fc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgU0FWRV9YTU0gNworICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7ZHN0X3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3Rfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtoZWlnaHQKKworLmJsb2NrX2NvcHlfc3NlMl9sb29weDQ6CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIDE2XQorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJheF0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByYXggKyAxNl0KKworICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KKworICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyAxNl0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTYsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByYXhdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmF4ICsgMTZdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgW3JzaStyYXgqMl0KKworICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyAxNl0sIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyByZHhdLCB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpICsgcmR4ICsgMTZdLCB4bW0zCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgW3JkaStyZHgqMl0KKworICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyAxNl0sIHhtbTUKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyByZHhdLCB4bW02CisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpICsgcmR4ICsgMTZdLCB4bW03CisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgW3JkaStyZHgqMl0KKworICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgNAorICAgICAgICBjbXAgICAgICAgICAgICAgcmN4LCAgICAgNAorICAgICAgICBqZ2UgICAgICAgICAgICAgLmJsb2NrX2NvcHlfc3NlMl9sb29weDQKKworICAgICAgICBjbXAgICAgICAgICAgICAgcmN4LCAwCisgICAgICAgIGplICAgICAgICAgICAgICAuY29weV9pc19kb25lCisKKy5ibG9ja19jb3B5X3NzZTJfbG9vcDoKKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgMTZdCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgIFtyc2krcmF4XQorCisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaSArIDE2XSwgeG1tMQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICBbcmRpK3JkeF0KKworICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgMQorICAgICAgICBqbmUgICAgICAgICAgICAgLmJsb2NrX2NvcHlfc3NlMl9sb29wCisKKy5jb3B5X2lzX2RvbmU6CisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9jb21tb24veDg2L3NhZF9zc2UzLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zYWRfc3NlMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwYTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zYWRfc3NlMy5hc20KQEAgLTAsMCArMSw5NjAgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKyVtYWNybyBTVEFDS19GUkFNRV9DUkVBVEVfWDMgMAorJWlmIEFCSV9JU18zMkJJVAorICAlZGVmaW5lICAgICBzcmNfcHRyICAgICAgIHJzaQorICAlZGVmaW5lICAgICBzcmNfc3RyaWRlICAgIHJheAorICAlZGVmaW5lICAgICByZWZfcHRyICAgICAgIHJkaQorICAlZGVmaW5lICAgICByZWZfc3RyaWRlICAgIHJkeAorICAlZGVmaW5lICAgICBlbmRfcHRyICAgICAgIHJjeAorICAlZGVmaW5lICAgICByZXRfdmFyICAgICAgIHJieAorICAlZGVmaW5lICAgICByZXN1bHRfcHRyICAgIGFyZyg0KQorICAlZGVmaW5lICAgICBtYXhfc2FkICAgICAgIGFyZyg0KQorICAlZGVmaW5lICAgICBoZWlnaHQgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsICAgICAgICByc3AKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICBwdXNoICAgICAgICByYngKKworICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgOyBzcmNfcHRyCisgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpICAgICAgICAgICAgICA7IHJlZl9wdHIKKworICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfc3RyaWRlCisgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHJlZl9zdHJpZGUKKyVlbHNlCisgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBTQVZFX1hNTSA3LCB1CisgICAgJWRlZmluZSAgICAgc3JjX3B0ciAgICAgcmN4CisgICAgJWRlZmluZSAgICAgc3JjX3N0cmlkZSAgcmR4CisgICAgJWRlZmluZSAgICAgcmVmX3B0ciAgICAgcjgKKyAgICAlZGVmaW5lICAgICByZWZfc3RyaWRlICByOQorICAgICVkZWZpbmUgICAgIGVuZF9wdHIgICAgIHIxMAorICAgICVkZWZpbmUgICAgIHJldF92YXIgICAgIHIxMQorICAgICVkZWZpbmUgICAgIHJlc3VsdF9wdHIgIFtyc3AreG1tX3N0YWNrX3NwYWNlKzgrNCo4XQorICAgICVkZWZpbmUgICAgIG1heF9zYWQgICAgIFtyc3AreG1tX3N0YWNrX3NwYWNlKzgrNCo4XQorICAgICVkZWZpbmUgICAgIGhlaWdodCAgICAgIGR3b3JkIHB0ciBbcnNwK3htbV9zdGFja19zcGFjZSs4KzQqOF0KKyAgJWVsc2UKKyAgICAlZGVmaW5lICAgICBzcmNfcHRyICAgICByZGkKKyAgICAlZGVmaW5lICAgICBzcmNfc3RyaWRlICByc2kKKyAgICAlZGVmaW5lICAgICByZWZfcHRyICAgICByZHgKKyAgICAlZGVmaW5lICAgICByZWZfc3RyaWRlICByY3gKKyAgICAlZGVmaW5lICAgICBlbmRfcHRyICAgICByOQorICAgICVkZWZpbmUgICAgIHJldF92YXIgICAgIHIxMAorICAgICVkZWZpbmUgICAgIHJlc3VsdF9wdHIgIHI4CisgICAgJWRlZmluZSAgICAgbWF4X3NhZCAgICAgcjgKKyAgICAlZGVmaW5lICAgICBoZWlnaHQgICAgICByOAorICAlZW5kaWYKKyVlbmRpZgorCislZW5kbWFjcm8KKworJW1hY3JvIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDMgMAorICAlZGVmaW5lICAgICBzcmNfcHRyCisgICVkZWZpbmUgICAgIHNyY19zdHJpZGUKKyAgJWRlZmluZSAgICAgcmVmX3B0cgorICAlZGVmaW5lICAgICByZWZfc3RyaWRlCisgICVkZWZpbmUgICAgIGVuZF9wdHIKKyAgJWRlZmluZSAgICAgcmV0X3ZhcgorICAlZGVmaW5lICAgICByZXN1bHRfcHRyCisgICVkZWZpbmUgICAgIG1heF9zYWQKKyAgJWRlZmluZSAgICAgaGVpZ2h0CisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBwb3AgICAgICAgICByYngKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBwb3AgICAgICAgICByYnAKKyVlbHNlCisgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBSRVNUT1JFX1hNTQorICAlZW5kaWYKKyVlbmRpZgorICAgIHJldAorJWVuZG1hY3JvCisKKyVtYWNybyBTVEFDS19GUkFNRV9DUkVBVEVfWDQgMAorJWlmIEFCSV9JU18zMkJJVAorICAlZGVmaW5lICAgICBzcmNfcHRyICAgICAgIHJzaQorICAlZGVmaW5lICAgICBzcmNfc3RyaWRlICAgIHJheAorICAlZGVmaW5lICAgICByMF9wdHIgICAgICAgIHJjeAorICAlZGVmaW5lICAgICByMV9wdHIgICAgICAgIHJkeAorICAlZGVmaW5lICAgICByMl9wdHIgICAgICAgIHJieAorICAlZGVmaW5lICAgICByM19wdHIgICAgICAgIHJkaQorICAlZGVmaW5lICAgICByZWZfc3RyaWRlICAgIHJicAorICAlZGVmaW5lICAgICByZXN1bHRfcHRyICAgIGFyZyg0KQorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgICAgICAgIHJzcAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIHB1c2ggICAgICAgIHJieAorCisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpICAgICAgICAgICAgICA7IHJlZl9wdHJfYmFzZQorCisgICAgTE9BRF9YNF9BRERSRVNTRVMgcmRpLCByY3gsIHJkeCwgcmF4LCByZGkKKworICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgOyBzcmNfcHRyCisKKyAgICBtb3ZzeGQgICAgICByYngsICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgIDsgc3JjX3N0cmlkZQorICAgIG1vdnN4ZCAgICAgIHJicCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgOyByZWZfc3RyaWRlCisKKyAgICB4Y2hnICAgICAgICByYngsICAgICAgICByYXgKKyVlbHNlCisgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBTQVZFX1hNTSA3LCB1CisgICAgJWRlZmluZSAgICAgc3JjX3B0ciAgICAgcmN4CisgICAgJWRlZmluZSAgICAgc3JjX3N0cmlkZSAgcmR4CisgICAgJWRlZmluZSAgICAgcjBfcHRyICAgICAgcnNpCisgICAgJWRlZmluZSAgICAgcjFfcHRyICAgICAgcjEwCisgICAgJWRlZmluZSAgICAgcjJfcHRyICAgICAgcjExCisgICAgJWRlZmluZSAgICAgcjNfcHRyICAgICAgcjgKKyAgICAlZGVmaW5lICAgICByZWZfc3RyaWRlICByOQorICAgICVkZWZpbmUgICAgIHJlc3VsdF9wdHIgIFtyc3AreG1tX3N0YWNrX3NwYWNlKzE2KzQqOF0KKyAgICBwdXNoICAgICAgICByc2kKKworICAgIExPQURfWDRfQUREUkVTU0VTIHI4LCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIKKyAgJWVsc2UKKyAgICAlZGVmaW5lICAgICBzcmNfcHRyICAgICByZGkKKyAgICAlZGVmaW5lICAgICBzcmNfc3RyaWRlICByc2kKKyAgICAlZGVmaW5lICAgICByMF9wdHIgICAgICByOQorICAgICVkZWZpbmUgICAgIHIxX3B0ciAgICAgIHIxMAorICAgICVkZWZpbmUgICAgIHIyX3B0ciAgICAgIHIxMQorICAgICVkZWZpbmUgICAgIHIzX3B0ciAgICAgIHJkeAorICAgICVkZWZpbmUgICAgIHJlZl9zdHJpZGUgIHJjeAorICAgICVkZWZpbmUgICAgIHJlc3VsdF9wdHIgIHI4CisKKyAgICBMT0FEX1g0X0FERFJFU1NFUyByZHgsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0cgorCisgICVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDQgMAorICAlZGVmaW5lICAgICBzcmNfcHRyCisgICVkZWZpbmUgICAgIHNyY19zdHJpZGUKKyAgJWRlZmluZSAgICAgcjBfcHRyCisgICVkZWZpbmUgICAgIHIxX3B0cgorICAlZGVmaW5lICAgICByMl9wdHIKKyAgJWRlZmluZSAgICAgcjNfcHRyCisgICVkZWZpbmUgICAgIHJlZl9zdHJpZGUKKyAgJWRlZmluZSAgICAgcmVzdWx0X3B0cgorCislaWYgQUJJX0lTXzMyQklUCisgICAgcG9wICAgICAgICAgcmJ4CisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgcG9wICAgICAgICAgcmJwCislZWxzZQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9YTU0KKyAgJWVuZGlmCislZW5kaWYKKyAgICByZXQKKyVlbmRtYWNybworCislbWFjcm8gUFJPQ0VTU18xNlgyWDMgNQorJWlmICUxPT0wCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbJTJdCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbJTNdCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUiBbJTMrMV0KKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTcsICAgICAgIFhNTVdPUkQgUFRSIFslMysyXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW02LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW03LCAgICAgICB4bW0wCislZWxzZQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgWyUyXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgWyUzXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgWyUzKzFdCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbJTMrMl0KKworICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0yCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0zCislZW5kaWYKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFslMislNF0KKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFslMyslNV0KKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFslMyslNSsxXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgWyUzKyU1KzJdCisKKyVpZiAlMT09MCB8fCAlMT09MQorICAgICAgICBsZWEgICAgICAgICAgICAgJTIsICAgICAgICAgWyUyKyU0KjJdCisgICAgICAgIGxlYSAgICAgICAgICAgICAlMywgICAgICAgICBbJTMrJTUqMl0KKyVlbmRpZgorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0yLCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0zLCAgICAgICB4bW0wCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTMKKyVlbmRtYWNybworCislbWFjcm8gUFJPQ0VTU184WDJYMyA1CislaWYgJTE9PTAKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgUVdPUkQgUFRSIFslMl0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgUVdPUkQgUFRSIFslM10KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgUVdPUkQgUFRSIFslMysxXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICBRV09SRCBQVFIgWyUzKzJdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNSwgICAgICAgbW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTYsICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW03LCAgICAgICBtbTAKKyVlbHNlCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgIFFXT1JEIFBUUiBbJTJdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgIFFXT1JEIFBUUiBbJTNdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgIFFXT1JEIFBUUiBbJTMrMV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgUVdPUkQgUFRSIFslMysyXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW0yLCAgICAgICBtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMywgICAgICAgbW0wCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNSwgICAgICAgbW0xCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgIG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICBtbTMKKyVlbmRpZgorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICBRV09SRCBQVFIgWyUyKyU0XQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICBRV09SRCBQVFIgWyUzKyU1XQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICBRV09SRCBQVFIgWyUzKyU1KzFdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgIFFXT1JEIFBUUiBbJTMrJTUrMl0KKworJWlmICUxPT0wIHx8ICUxPT0xCisgICAgICAgIGxlYSAgICAgICAgICAgICAlMiwgICAgICAgIFslMislNCoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgJTMsICAgICAgICBbJTMrJTUqMl0KKyVlbmRpZgorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW0yLCAgICAgICBtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMywgICAgICAgbW0wCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNSwgICAgICAgbW0xCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgIG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICBtbTMKKyVlbmRtYWNybworCislbWFjcm8gTE9BRF9YNF9BRERSRVNTRVMgNQorICAgICAgICBtb3YgICAgICAgICAgICAgJTIsICAgICAgICAgWyUxK1JFR19TWl9CWVRFUyowXQorICAgICAgICBtb3YgICAgICAgICAgICAgJTMsICAgICAgICAgWyUxK1JFR19TWl9CWVRFUyoxXQorCisgICAgICAgIG1vdiAgICAgICAgICAgICAlNCwgICAgICAgICBbJTErUkVHX1NaX0JZVEVTKjJdCisgICAgICAgIG1vdiAgICAgICAgICAgICAlNSwgICAgICAgICBbJTErUkVHX1NaX0JZVEVTKjNdCislZW5kbWFjcm8KKworJW1hY3JvIFBST0NFU1NfMTZYMlg0IDgKKyVpZiAlMT09MAorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgWyUyXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgWyUzXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFIgWyU0XQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgWyU1XQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgWyU2XQorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW00LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW02LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW03LCAgICAgICB4bW0wCislZWxzZQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgWyUyXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgWyUzXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgWyU0XQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgWyU1XQorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0yLCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0zLCAgICAgICB4bW0wCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFslNl0KKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTMKKworICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgeG1tMQorJWVuZGlmCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbJTIrJTddCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbJTMrJThdCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbJTQrJThdCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbJTUrJThdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTEsICAgICAgIHhtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTMsICAgICAgIHhtbTAKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNCwgICAgICAgeG1tMQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgWyU2KyU4XQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgeG1tMworCislaWYgJTE9PTAgfHwgJTE9PTEKKyAgICAgICAgbGVhICAgICAgICAgICAgICUyLCAgICAgICAgIFslMislNyoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgJTMsICAgICAgICAgWyUzKyU4KjJdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgICU0LCAgICAgICAgIFslNCslOCoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgJTUsICAgICAgICAgWyU1KyU4KjJdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgICU2LCAgICAgICAgIFslNislOCoyXQorJWVuZGlmCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0xCisKKyVlbmRtYWNybworCislbWFjcm8gUFJPQ0VTU184WDJYNCA4CislaWYgJTE9PTAKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFFXT1JEIFBUUiBbJTJdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICBRV09SRCBQVFIgWyUzXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgUVdPUkQgUFRSIFslNF0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIFFXT1JEIFBUUiBbJTVdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBRV09SRCBQVFIgWyU2XQorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTQsICAgICAgICBtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNSwgICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW02LCAgICAgICAgbW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTcsICAgICAgICBtbTAKKyVlbHNlCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgWyUyXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFslM10KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFFXT1JEIFBUUiBbJTRdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBRV09SRCBQVFIgWyU1XQorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgICBtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMiwgICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW0zLCAgICAgICAgbW0wCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNCwgICAgICAgIG1tMQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFslNl0KKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNSwgICAgICAgIG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICAgbW0zCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMSwgICAgICAgIG1tMAorICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0xCislZW5kaWYKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFFXT1JEIFBUUiBbJTIrJTddCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBRV09SRCBQVFIgWyUzKyU4XQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgUVdPUkQgUFRSIFslNCslOF0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFFXT1JEIFBUUiBbJTUrJThdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMSwgICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW0yLCAgICAgICAgbW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTMsICAgICAgICBtbTAKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW00LCAgICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBRV09SRCBQVFIgWyU2KyU4XQorICAgICAgICBwYWRkdyAgICAgICAgICAgbW01LCAgICAgICAgbW0yCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICBtbTMKKworJWlmICUxPT0wIHx8ICUxPT0xCisgICAgICAgIGxlYSAgICAgICAgICAgICAlMiwgICAgICAgICBbJTIrJTcqMl0KKyAgICAgICAgbGVhICAgICAgICAgICAgICUzLCAgICAgICAgIFslMyslOCoyXQorCisgICAgICAgIGxlYSAgICAgICAgICAgICAlNCwgICAgICAgICBbJTQrJTgqMl0KKyAgICAgICAgbGVhICAgICAgICAgICAgICU1LCAgICAgICAgIFslNSslOCoyXQorCisgICAgICAgIGxlYSAgICAgICAgICAgICAlNiwgICAgICAgICBbJTYrJTgqMl0KKyVlbmRpZgorICAgICAgICBwc2FkYncgICAgICAgICAgbW0xLCAgICAgICAgbW0wCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTEKKworJWVuZG1hY3JvCisKKzt2b2lkIGludCB2cDhfc2FkMTZ4MTZ4M19zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICAqcmVzdWx0cykKK2dsb2JhbCBzeW0odnA4X3NhZDE2eDE2eDNfc3NlMykgUFJJVkFURQorc3ltKHZwOF9zYWQxNngxNngzX3NzZTMpOgorCisgICAgU1RBQ0tfRlJBTUVfQ1JFQVRFX1gzCisKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMCwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYMyAyLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIHJlc3VsdF9wdHIKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQorICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNSwgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW01CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4XSwgICAgICB4bW0wCis7LQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgorICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW02CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzRdLCAgICB4bW0wCis7LQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNworICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW03CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzhdLCAgICB4bW0wCisKKyAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1gzCisKKzt2b2lkIGludCB2cDhfc2FkMTZ4OHgzX3NzZTMoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlLAorOyAgICBpbnQgICpyZXN1bHRzKQorZ2xvYmFsIHN5bSh2cDhfc2FkMTZ4OHgzX3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfc2FkMTZ4OHgzX3NzZTMpOgorCisgICAgU1RBQ0tfRlJBTUVfQ1JFQVRFX1gzCisKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMCwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMiwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTUsICAgICAgIDgKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQorICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeF0sICAgICAgeG1tMAorOy0KKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTYsICAgICAgIDgKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgorICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeCs0XSwgICAgeG1tMAorOy0KKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgIDgKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNworICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeCs4XSwgICAgeG1tMAorCisgICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YMworCis7dm9pZCBpbnQgdnA4X3NhZDh4MTZ4M19zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICAqcmVzdWx0cykKK2dsb2JhbCBzeW0odnA4X3NhZDh4MTZ4M19zc2UzKSBQUklWQVRFCitzeW0odnA4X3NhZDh4MTZ4M19zc2UzKToKKworICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YMworCisgICAgICAgIFBST0NFU1NfOFgyWDMgMCwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU184WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfOFgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU184WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfOFgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlgzIDIsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgcmVzdWx0X3B0cgorCisgICAgICAgIHB1bnBja2xkcSAgICAgICBtbTUsICAgICAgICBtbTYKKworICAgICAgICBtb3ZxICAgICAgICAgICAgW3JjeF0sICAgICAgbW01CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzhdLCAgICBtbTcKKworICAgIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDMKKworO3ZvaWQgaW50IHZwOF9zYWQ4eDh4M19zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICAqcmVzdWx0cykKK2dsb2JhbCBzeW0odnA4X3NhZDh4OHgzX3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfc2FkOHg4eDNfc3NlMyk6CisKKyAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDMKKworICAgICAgICBQUk9DRVNTXzhYMlgzIDAsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU184WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfOFgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlgzIDIsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgcmVzdWx0X3B0cgorCisgICAgICAgIHB1bnBja2xkcSAgICAgICBtbTUsICAgICAgICBtbTYKKworICAgICAgICBtb3ZxICAgICAgICAgICAgW3JjeF0sICAgICAgbW01CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzhdLCAgICBtbTcKKworICAgIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDMKKworO3ZvaWQgaW50IHZwOF9zYWQ0eDR4M19zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICAqcmVzdWx0cykKK2dsb2JhbCBzeW0odnA4X3NhZDR4NHgzX3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfc2FkNHg0eDNfc3NlMyk6CisKKyAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDMKKworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0wLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyZWZfcHRyXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHIrc3JjX3N0cmlkZV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlXQorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTIKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMSwgICAgICAgIG1tMworCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTQsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrMV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNSwgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cisyXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrcmVmX3N0cmlkZSsxXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgRFdPUkQgUFRSIFtyZWZfcHRyK3JlZl9zdHJpZGUrMl0KKworICAgICAgICBwc2FkYncgICAgICAgICAgbW0xLCAgICAgICAgbW0wCisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNCwgICAgICAgIG1tMgorICAgICAgICBwdW5wY2tsYncgICAgICAgbW01LCAgICAgICAgbW0zCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNCwgICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW01LCAgICAgICAgbW0wCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHNyY19wdHIsICAgIFtzcmNfcHRyK3NyY19zdHJpZGUqMl0KKyAgICAgICAgbGVhICAgICAgICAgICAgIHJlZl9wdHIsICAgIFtyZWZfcHRyK3JlZl9zdHJpZGUqMl0KKworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0wLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyZWZfcHRyXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHIrc3JjX3N0cmlkZV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNiwgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlXQorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTMKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMiwgICAgICAgIG1tNgorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrMV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNywgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cisyXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTAKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgbW0yCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlKzFdCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTYsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrcmVmX3N0cmlkZSsyXQorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTMsICAgICAgICBtbTIKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNywgICAgICAgIG1tNgorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTMsICAgICAgICBtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNywgICAgICAgIG1tMAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTMsICAgICAgICBtbTQKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tNQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCisKKyAgICAgICAgcHVucGNrbGRxICAgICAgIG1tMSwgICAgICAgIG1tMworCisgICAgICAgIG1vdnEgICAgICAgICAgICBbcmN4XSwgICAgICBtbTEKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grOF0sICAgIG1tNworCisgICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YMworCis7dW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl9zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICBtYXhfc2FkKQorOyVkZWZpbmUgbGRkcXUgbW92ZHF1CitnbG9iYWwgc3ltKHZwOF9zYWQxNngxNl9zc2UzKSBQUklWQVRFCitzeW0odnA4X3NhZDE2eDE2X3NzZTMpOgorCisgICAgU1RBQ0tfRlJBTUVfQ1JFQVRFX1gzCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIGVuZF9wdHIsICAgIDQKKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTcsICAgICAgICB4bW03CisKKy52cDhfc2FkMTZ4MTZfc3NlM19sb29wOgorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3NyY19wdHJdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbcmVmX3B0cl0KKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFtzcmNfcHRyK3NyY19zdHJpZGVdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlXQorCisgICAgICAgIGxlYSAgICAgICAgICAgICBzcmNfcHRyLCAgICBbc3JjX3B0citzcmNfc3RyaWRlKjJdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZWZfcHRyLCAgICBbcmVmX3B0cityZWZfc3RyaWRlKjJdCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtzcmNfcHRyXQorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFIgW3JlZl9wdHJdCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUiBbc3JjX3B0citzcmNfc3RyaWRlXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0wLCAgICAgICB4bW0xCisKKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyZWZfcHRyK3JlZl9zdHJpZGVdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTIsICAgICAgIHhtbTMKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTQsICAgICAgIHhtbTUKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTYsICAgICAgIHhtbTEKKworICAgICAgICBsZWEgICAgICAgICAgICAgc3JjX3B0ciwgICAgW3NyY19wdHIrc3JjX3N0cmlkZSoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgcmVmX3B0ciwgICAgW3JlZl9wdHIrcmVmX3N0cmlkZSoyXQorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICAgeG1tMAorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgICB4bW00CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICAgeG1tNgorCisgICAgICAgIHN1YiAgICAgICAgICAgICBlbmRfcHRyLCAgICAgMQorICAgICAgICBqbmUgICAgICAgICAgICAgLnZwOF9zYWQxNngxNl9zc2UzX2xvb3AKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNworICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNworICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgeG1tMAorCisgICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YMworCis7dm9pZCB2cDhfY29weTMyeG5fc3NlMygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyAgICBpbnQgIGRzdF9zdHJpZGUsCis7ICAgIGludCBoZWlnaHQpOworZ2xvYmFsIHN5bSh2cDhfY29weTMyeG5fc3NlMykgUFJJVkFURQorc3ltKHZwOF9jb3B5MzJ4bl9zc2UzKToKKworICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YMworCisuYmxvY2tfY29weV9zc2UzX2xvb3B4NDoKKyAgICAgICAgbGVhICAgICAgICAgICAgIGVuZF9wdHIsICAgIFtzcmNfcHRyK3NyY19zdHJpZGUqMl0KKworICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3NyY19wdHJdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbc3JjX3B0ciArIDE2XQorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3NyY19wdHIgKyBzcmNfc3RyaWRlXQorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3NyY19wdHIgKyBzcmNfc3RyaWRlICsgMTZdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbZW5kX3B0cl0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtlbmRfcHRyICsgMTZdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUiBbZW5kX3B0ciArIHNyY19zdHJpZGVdCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbZW5kX3B0ciArIHNyY19zdHJpZGUgKyAxNl0KKworICAgICAgICBsZWEgICAgICAgICAgICAgc3JjX3B0ciwgICAgW3NyY19wdHIrc3JjX3N0cmlkZSo0XQorCisgICAgICAgIGxlYSAgICAgICAgICAgICBlbmRfcHRyLCAgICBbcmVmX3B0cityZWZfc3RyaWRlKjJdCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZWZfcHRyXSwgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW3JlZl9wdHIgKyAxNl0sIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZWZfcHRyICsgcmVmX3N0cmlkZV0sIHhtbTIKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZWZfcHRyICsgcmVmX3N0cmlkZSArIDE2XSwgeG1tMworICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW2VuZF9wdHJdLCB4bW00CisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbZW5kX3B0ciArIDE2XSwgeG1tNQorICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW2VuZF9wdHIgKyByZWZfc3RyaWRlXSwgeG1tNgorICAgICAgICBtb3ZkcWEgICAgICAgICAgWE1NV09SRCBQVFIgW2VuZF9wdHIgKyByZWZfc3RyaWRlICsgMTZdLCB4bW03CisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJlZl9wdHIsICAgIFtyZWZfcHRyK3JlZl9zdHJpZGUqNF0KKworICAgICAgICBzdWIgICAgICAgICAgICAgaGVpZ2h0LCAgICAgNAorICAgICAgICBjbXAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgNAorICAgICAgICBqZ2UgICAgICAgICAgICAgLmJsb2NrX2NvcHlfc3NlM19sb29weDQKKworICAgICAgICA7Q2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgcm93cyBuZWVkIHRvIGJlIGNvcGllZC4KKyAgICAgICAgY21wICAgICAgICAgICAgIGhlaWdodCwgMAorICAgICAgICBqZSAgICAgICAgICAgICAgLmNvcHlfaXNfZG9uZQorCisuYmxvY2tfY29weV9zc2UzX2xvb3A6CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbc3JjX3B0cl0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtzcmNfcHRyICsgMTZdCisgICAgICAgIGxlYSAgICAgICAgICAgICBzcmNfcHRyLCAgICBbc3JjX3B0citzcmNfc3RyaWRlXQorCisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmVmX3B0cl0sIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZWZfcHRyICsgMTZdLCB4bW0xCisgICAgICAgIGxlYSAgICAgICAgICAgICByZWZfcHRyLCAgICBbcmVmX3B0cityZWZfc3RyaWRlXQorCisgICAgICAgIHN1YiAgICAgICAgICAgICBoZWlnaHQsICAgICAxCisgICAgICAgIGpuZSAgICAgICAgICAgICAuYmxvY2tfY29weV9zc2UzX2xvb3AKKworLmNvcHlfaXNfZG9uZToKKyAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1gzCisKKzt2b2lkIHZwOF9zYWQxNngxNng0ZF9zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHJfYmFzZSwKKzsgICAgaW50ICByZWZfc3RyaWRlLAorOyAgICBpbnQgICpyZXN1bHRzKQorZ2xvYmFsIHN5bSh2cDhfc2FkMTZ4MTZ4NGRfc3NlMykgUFJJVkFURQorc3ltKHZwOF9zYWQxNngxNng0ZF9zc2UzKToKKworICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAorCisgICAgICAgIFBST0NFU1NfMTZYMlg0IDAsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYNCAxLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU18xNlgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfMTZYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYNCAxLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU18xNlgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfMTZYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYNCAyLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKworJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBwb3AgICAgICAgICAgICAgcmJwCislZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIHJlc3VsdF9wdHIKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNAorICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNCwgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW00CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4XSwgICAgICB4bW0wCis7LQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQorICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNSwgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW01CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzRdLCAgICB4bW0wCis7LQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgorICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW02CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzhdLCAgICB4bW0wCis7LQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNworICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW03CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzEyXSwgICB4bW0wCisKKyAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1g0CisKKzt2b2lkIHZwOF9zYWQxNng4eDRkX3NzZTMoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cl9iYXNlLAorOyAgICBpbnQgIHJlZl9zdHJpZGUsCis7ICAgIGludCAgKnJlc3VsdHMpCitnbG9iYWwgc3ltKHZwOF9zYWQxNng4eDRkX3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfc2FkMTZ4OHg0ZF9zc2UzKToKKworICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAorCisgICAgICAgIFBST0NFU1NfMTZYMlg0IDAsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzE2WDJYNCAxLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKKyAgICAgICAgUFJPQ0VTU18xNlgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfMTZYMlg0IDIsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIHBvcCAgICAgICAgICAgICByYnAKKyVlbmRpZgorICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgcmVzdWx0X3B0cgorCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW00CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW00LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTQKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3hdLCAgICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW01CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW01LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grNF0sICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW02CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW02LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grOF0sICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW03CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grMTJdLCAgIHhtbTAKKworICAgIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDQKKworO3ZvaWQgaW50IHZwOF9zYWQ4eDE2eDRkX3NzZTMoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlLAorOyAgICBpbnQgICpyZXN1bHRzKQorZ2xvYmFsIHN5bSh2cDhfc2FkOHgxNng0ZF9zc2UzKSBQUklWQVRFCitzeW0odnA4X3NhZDh4MTZ4NGRfc3NlMyk6CisKKyAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDQKKworICAgICAgICBQUk9DRVNTXzhYMlg0IDAsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorICAgICAgICBQUk9DRVNTXzhYMlg0IDIsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQorCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIHBvcCAgICAgICAgICAgICByYnAKKyVlbmRpZgorICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgcmVzdWx0X3B0cgorCisgICAgICAgIHB1bnBja2xkcSAgICAgICBtbTQsICAgICAgICBtbTUKKyAgICAgICAgcHVucGNrbGRxICAgICAgIG1tNiwgICAgICAgIG1tNworCisgICAgICAgIG1vdnEgICAgICAgICAgICBbcmN4XSwgICAgICBtbTQKKyAgICAgICAgbW92cSAgICAgICAgICAgIFtyY3grOF0sICAgIG1tNgorCisgICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YNAorCis7dm9pZCBpbnQgdnA4X3NhZDh4OHg0ZF9zc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICAqcmVzdWx0cykKK2dsb2JhbCBzeW0odnA4X3NhZDh4OHg0ZF9zc2UzKSBQUklWQVRFCitzeW0odnA4X3NhZDh4OHg0ZF9zc2UzKToKKworICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAorCisgICAgICAgIFBST0NFU1NfOFgyWDQgMCwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisgICAgICAgIFBST0NFU1NfOFgyWDQgMiwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgcG9wICAgICAgICAgICAgIHJicAorJWVuZGlmCisgICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCisKKyAgICAgICAgcHVucGNrbGRxICAgICAgIG1tNCwgICAgICAgIG1tNQorICAgICAgICBwdW5wY2tsZHEgICAgICAgbW02LCAgICAgICAgbW03CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIFtyY3hdLCAgICAgIG1tNAorICAgICAgICBtb3ZxICAgICAgICAgICAgW3JjeCs4XSwgICAgbW02CisKKyAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1g0CisKKzt2b2lkIGludCB2cDhfc2FkNHg0eDRkX3NzZTMoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlLAorOyAgICBpbnQgICpyZXN1bHRzKQorZ2xvYmFsIHN5bSh2cDhfc2FkNHg0eDRkX3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfc2FkNHg0eDRkX3NzZTMpOgorCisgICAgU1RBQ0tfRlJBTUVfQ1JFQVRFX1g0CisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMCwgICAgICAgIERXT1JEIFBUUiBbc3JjX3B0cl0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbcjBfcHRyXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHIrc3JjX3N0cmlkZV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbcjBfcHRyK3JlZl9zdHJpZGVdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMCwgICAgICAgIG1tMgorICAgICAgICBwdW5wY2tsYncgICAgICAgbW0xLCAgICAgICAgbW0zCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNCwgICAgICAgIERXT1JEIFBUUiBbcjFfcHRyXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW01LCAgICAgICAgRFdPUkQgUFRSIFtyMl9wdHJdCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNiwgICAgICAgIERXT1JEIFBUUiBbcjNfcHRyXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyMV9wdHIrcmVmX3N0cmlkZV0KKworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgRFdPUkQgUFRSIFtyMl9wdHIrcmVmX3N0cmlkZV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNywgICAgICAgIERXT1JEIFBUUiBbcjNfcHRyK3JlZl9zdHJpZGVdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMSwgICAgICAgIG1tMAorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTQsICAgICAgICBtbTIKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNSwgICAgICAgIG1tMworCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTYsICAgICAgICBtbTcKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNCwgICAgICAgIG1tMAorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTUsICAgICAgICBtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNiwgICAgICAgIG1tMAorCisKKworICAgICAgICBsZWEgICAgICAgICAgICAgc3JjX3B0ciwgICAgW3NyY19wdHIrc3JjX3N0cmlkZSoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgcjBfcHRyLCAgICAgW3IwX3B0cityZWZfc3RyaWRlKjJdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHIxX3B0ciwgICAgIFtyMV9wdHIrcmVmX3N0cmlkZSoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgcjJfcHRyLCAgICAgW3IyX3B0cityZWZfc3RyaWRlKjJdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHIzX3B0ciwgICAgIFtyM19wdHIrcmVmX3N0cmlkZSoyXQorCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTAsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHJdCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3IwX3B0cl0KKworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyK3NyY19zdHJpZGVdCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTcsICAgICAgICBEV09SRCBQVFIgW3IwX3B0cityZWZfc3RyaWRlXQorCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTMKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMiwgICAgICAgIG1tNworCisgICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3IxX3B0cl0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNywgICAgICAgIERXT1JEIFBUUiBbcjJfcHRyXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTAKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIHJicAorCisgICAgICAgIHBvcCAgICAgICAgICAgICByYnAKKyVkZWZpbmUgICAgIHJlZl9zdHJpZGUgICAgcmF4CislZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIHJlc3VsdF9wdHIKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgbW0yCisgICAgICAgIG1vdmQgICAgICAgICAgICBbcnNpXSwgICAgICBtbTEKKworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyMV9wdHIrcmVmX3N0cmlkZV0KKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbcjJfcHRyK3JlZl9zdHJpZGVdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMywgICAgICAgIG1tMgorICAgICAgICBwdW5wY2tsYncgICAgICAgbW03LCAgICAgICAgbW0xCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMywgICAgICAgIG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgbW03LCAgICAgICAgbW0wCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcjNfcHRyXQorICAgICAgICBtb3ZkICAgICAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyM19wdHIrcmVmX3N0cmlkZV0KKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0zLCAgICAgICAgbW00CisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTUKKworICAgICAgICBtb3ZkICAgICAgICAgICAgW3JzaSs0XSwgICAgbW0zCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTIsICAgICAgICBtbTEKKworICAgICAgICBtb3ZkICAgICAgICAgICAgW3JzaSs4XSwgICAgbW03CisgICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTAKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0yLCAgICAgICAgbW02CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcnNpKzEyXSwgICBtbTIKKworCisgICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YNAorCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc2FkX3NzZTQuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3NhZF9zc2U0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ZjY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3NhZF9zc2U0LmFzbQpAQCAtMCwwICsxLDM1MyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCislbWFjcm8gUFJPQ0VTU18xNlgyWDggMQorJWlmICUxCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrMTZdCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0xLCAgICAgICB4bW0zCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0zLCAgICAgICB4bW0yCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIHhtbTEKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTEsICAgICAgIHhtbTAsICAweDAKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTIsICAgICAgIHhtbTAsICAweDUKKworICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tMCwgICAgICAgOAorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICB4bW0zCisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW0zLCAgICAgICB4bW0wLCAgMHgwCisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW00LCAgICAgICB4bW0wLCAgMHg1CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTQKKyVlbHNlCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrMTZdCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW01LCAgICAgICB4bW0zCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0zLCAgICAgICB4bW0yCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIHhtbTUKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTUsICAgICAgIHhtbTAsICAweDAKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTIsICAgICAgIHhtbTAsICAweDUKKworICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tMCwgICAgICAgOAorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICB4bW0zCisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW0zLCAgICAgICB4bW0wLCAgMHgwCisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW00LCAgICAgICB4bW0wLCAgMHg1CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTQKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgeG1tNQorJWVuZGlmCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmF4XQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHhdCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrIHJkeCs4XQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHgrMTZdCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW01LCAgICAgICB4bW0zCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0zLCAgICAgICB4bW0yCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICB4bW01CisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW01LCAgICAgICB4bW0wLCAgMHgwCisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW0yLCAgICAgICB4bW0wLCAgMHg1CisKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTAsICAgICAgIDgKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTQsICAgICAgIHhtbTMKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTMsICAgICAgIHhtbTAsICAweDAKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTQsICAgICAgIHhtbTAsICAweDUKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tNAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW01CislZW5kbWFjcm8KKworJW1hY3JvIFBST0NFU1NfOFgyWDggMQorJWlmICUxCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICBNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyZGldCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrOF0KKyAgICAgICAgcHVucGNrbHFkcSAgICAgIHhtbTEsICAgICAgIHhtbTMKKworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwgICAgICAgeG1tMQorICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tMSwgICAgICAgeG1tMCwgIDB4MAorICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tMiwgICAgICAgeG1tMCwgIDB4NQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgeG1tMgorJWVsc2UKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgIE1NV09SRCBQVFIgW3JkaV0KKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JkaSs4XQorICAgICAgICBwdW5wY2tscWRxICAgICAgeG1tNSwgICAgICAgeG1tMworCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICB4bW01CisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW01LCAgICAgICB4bW0wLCAgMHgwCisgICAgICAgIG1wc2FkYncgICAgICAgICB4bW0yLCAgICAgICB4bW0wLCAgMHg1CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0yCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTUKKyVlbmRpZgorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmF4XQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHhdCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrIHJkeCs4XQorICAgICAgICBwdW5wY2tscWRxICAgICAgeG1tNSwgICAgICAgeG1tMworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KKworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwgICAgICAgeG1tNQorICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tNSwgICAgICAgeG1tMCwgIDB4MAorICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tMiwgICAgICAgeG1tMCwgIDB4NQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMgorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW01CislZW5kbWFjcm8KKworJW1hY3JvIFBST0NFU1NfNFgyWDggMQorJWlmICUxCisgICAgICAgIG1vdmQgICAgICAgICAgICB4bW0wLCAgICAgICBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0xLCAgICAgICB4bW0zCisKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTEsICAgICAgIHhtbTAsICAweDAKKyVlbHNlCisgICAgICAgIG1vdmQgICAgICAgICAgICB4bW0wLCAgICAgICBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCisgICAgICAgIHB1bnBja2xxZHEgICAgICB4bW01LCAgICAgICB4bW0zCisKKyAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTUsICAgICAgIHhtbTAsICAweDAKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgeG1tNQorJWVuZGlmCisgICAgICAgIG1vdmQgICAgICAgICAgICB4bW0wLCAgICAgICBbcnNpICsgcmF4XQorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHhdCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrIHJkeCs4XQorICAgICAgICBwdW5wY2tscWRxICAgICAgeG1tNSwgICAgICAgeG1tMworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KKworICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tNSwgICAgICAgeG1tMCwgIDB4MAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW01CislZW5kbWFjcm8KKworCis7dm9pZCB2cDhfc2FkMTZ4MTZ4OF9zc2U0KAorOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CitnbG9iYWwgc3ltKHZwOF9zYWQxNngxNng4X3NzZTQpIFBSSVZBVEUKK3N5bSh2cDhfc2FkMTZ4MTZ4OF9zc2U0KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpICAgICAgICAgICA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgUFJPQ0VTU18xNlgyWDggMQorICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCisgICAgICAgIFBST0NFU1NfMTZYMlg4IDAKKyAgICAgICAgUFJPQ0VTU18xNlgyWDggMAorICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCisgICAgICAgIFBST0NFU1NfMTZYMlg4IDAKKyAgICAgICAgUFJPQ0VTU18xNlgyWDggMAorICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgO1Jlc3VsdHMKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGldLCAgICB4bW0xCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfc2FkMTZ4OHg4X3NzZTQoCis7ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Cis7KTsKK2dsb2JhbCBzeW0odnA4X3NhZDE2eDh4OF9zc2U0KSBQUklWQVRFCitzeW0odnA4X3NhZDE2eDh4OF9zc2U0KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpICAgICAgICAgICA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgUFJPQ0VTU18xNlgyWDggMQorICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCisgICAgICAgIFBST0NFU1NfMTZYMlg4IDAKKyAgICAgICAgUFJPQ0VTU18xNlgyWDggMAorCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgICAgICAgICAgIDtSZXN1bHRzCisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgeG1tMQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X3NhZDh4OHg4X3NzZTQoCis7ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc3JjX3N0cmlkZSwKKzsgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWZfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Cis7KTsKK2dsb2JhbCBzeW0odnA4X3NhZDh4OHg4X3NzZTQpIFBSSVZBVEUKK3N5bSh2cDhfc2FkOHg4eDhfc3NlNCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSAgICAgICAgICAgO3JlZl9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQorCisgICAgICAgIFBST0NFU1NfOFgyWDggMQorICAgICAgICBQUk9DRVNTXzhYMlg4IDAKKyAgICAgICAgUFJPQ0VTU184WDJYOCAwCisgICAgICAgIFBST0NFU1NfOFgyWDggMAorCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgICAgICAgICAgIDtSZXN1bHRzCisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgeG1tMQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X3NhZDh4MTZ4OF9zc2U0KAorOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheQorOyk7CitnbG9iYWwgc3ltKHZwOF9zYWQ4eDE2eDhfc3NlNCkgUFJJVkFURQorc3ltKHZwOF9zYWQ4eDE2eDhfc3NlNCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSAgICAgICAgICAgO3JlZl9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQorCisgICAgICAgIFBST0NFU1NfOFgyWDggMQorICAgICAgICBQUk9DRVNTXzhYMlg4IDAKKyAgICAgICAgUFJPQ0VTU184WDJYOCAwCisgICAgICAgIFBST0NFU1NfOFgyWDggMAorICAgICAgICBQUk9DRVNTXzhYMlg4IDAKKyAgICAgICAgUFJPQ0VTU184WDJYOCAwCisgICAgICAgIFBST0NFU1NfOFgyWDggMAorICAgICAgICBQUk9DRVNTXzhYMlg4IDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgO1Jlc3VsdHMKKyAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGldLCAgICB4bW0xCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfc2FkNHg0eDhfYygKKzsgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlZl9zdHJpZGUsCis7ICAgIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkKKzspOworZ2xvYmFsIHN5bSh2cDhfc2FkNHg0eDhfc3NlNCkgUFJJVkFURQorc3ltKHZwOF9zYWQ0eDR4OF9zc2U0KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpICAgICAgICAgICA7cmVmX3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgUFJPQ0VTU180WDJYOCAxCisgICAgICAgIFBST0NFU1NfNFgyWDggMAorCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgICAgICAgICAgIDtSZXN1bHRzCisgICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgeG1tMQorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworCisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zYWRfc3NzZTMuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3NhZF9zc3NlMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4ZmMwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zYWRfc3NzZTMuYXNtCkBAIC0wLDAgKzEsMzcwIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKyVtYWNybyBQUk9DRVNTXzE2WDJYMyAxCislaWYgJTEKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcmRpXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgW3JkaSsxXQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW3JkaSsyXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW02LCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW03LCAgICAgICB4bW0wCislZWxzZQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyZGldCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpKzFdCisgICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpKzJdCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTEsICAgICAgIHhtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTMsICAgICAgIHhtbTAKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgeG1tMgorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgeG1tMworJWVuZGlmCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpK3JheF0KKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyZGkrcmR4XQorICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3JkaStyZHgrMV0KKyAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZGkrcmR4KzJdCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQorCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0yLCAgICAgICB4bW0wCisgICAgICAgIHBzYWRidyAgICAgICAgICB4bW0zLCAgICAgICB4bW0wCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTMKKyVlbmRtYWNybworCislbWFjcm8gUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDIKKyVpZiAlMQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyZGldCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbcmRpKzE2XQorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICB4bW03CisgICAgICAgIHBhbGlnbnIgICAgICAgICB4bW01LCAgICAgICB4bW00LCAgICAgICAlMgorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW02LCAgICAgICB4bW03CisgICAgICAgIHBhbGlnbnIgICAgICAgICB4bW02LCAgICAgICB4bW00LCAgICAgICAoJTIrMSkKKworICAgICAgICBwYWxpZ25yICAgICAgICAgeG1tNywgICAgICAgeG1tNCwgICAgICAgKCUyKzIpCisKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTUsICAgICAgIHhtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTYsICAgICAgIHhtbTAKKyAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTcsICAgICAgIHhtbTAKKyVlbHNlCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkaV0KKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZGkrMTZdCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKKyAgICAgICAgcGFsaWduciAgICAgICAgIHhtbTEsICAgICAgIHhtbTQsICAgICAgICUyCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIHhtbTMKKyAgICAgICAgcGFsaWduciAgICAgICAgIHhtbTIsICAgICAgIHhtbTQsICAgICAgICglMisxKQorCisgICAgICAgIHBhbGlnbnIgICAgICAgICB4bW0zLCAgICAgICB4bW00LCAgICAgICAoJTIrMikKKworICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0yCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0zCislZW5kaWYKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2krcmF4XQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkaStyZHhdCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpK3JkeCsxNl0KKworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMSwgICAgICAgeG1tMworICAgICAgICBwYWxpZ25yICAgICAgICAgeG1tMSwgICAgICAgeG1tNCwgICAgICAgJTIKKworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwgICAgICAgeG1tMworICAgICAgICBwYWxpZ25yICAgICAgICAgeG1tMiwgICAgICAgeG1tNCwgICAgICAgKCUyKzEpCisKKyAgICAgICAgcGFsaWduciAgICAgICAgIHhtbTMsICAgICAgIHhtbTQsICAgICAgICglMisyKQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KKworICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAorICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0yCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0zCislZW5kbWFjcm8KKworJW1hY3JvIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMgorJTJfYWxpZ25lZF9ieV8lMToKKworICAgICAgICBzdWIgICAgICAgICAgICAgcmRpLCAgICAgICAgJTEKKworICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMSwgJTEKKyAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCisgICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAwLCAlMQorICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMCwgJTEKKyAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCisgICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAwLCAlMQorICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMCwgJTEKKyAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCisKKyAgICAgICAgam1wICAgICAgICAgICAgICUyX3N0b3JlX29mZgorCislZW5kbWFjcm8KKworJW1hY3JvIFBST0NFU1NfMTZYOFgzX09GRlNFVCAyCislMl9hbGlnbmVkX2J5XyUxOgorCisgICAgICAgIHN1YiAgICAgICAgICAgICByZGksICAgICAgICAlMQorCisgICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAxLCAlMQorICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMCwgJTEKKyAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCisgICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAwLCAlMQorCisgICAgICAgIGptcCAgICAgICAgICAgICAlMl9zdG9yZV9vZmYKKworJWVuZG1hY3JvCisKKzt2b2lkIGludCB2cDhfc2FkMTZ4MTZ4M19zc3NlMygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzcmNfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlZl9zdHJpZGUsCis7ICAgIGludCAgKnJlc3VsdHMpCitnbG9iYWwgc3ltKHZwOF9zYWQxNngxNngzX3Nzc2UzKSBQUklWQVRFCitzeW0odnA4X3NhZDE2eDE2eDNfc3NzZTMpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIFNBVkVfWE1NIDcKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICBwdXNoICAgICAgICByY3gKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmR4LCAgICAgICAgMHhmCisgICAgICAgIGFuZCAgICAgICAgICAgICByZHgsICAgICAgICByZGkKKworICAgICAgICBqbXAgLnZwOF9zYWQxNngxNngzX3Nzc2UzX3NraXB0YWJsZQorLnZwOF9zYWQxNngxNngzX3Nzc2UzX2p1bXB0YWJsZToKKyAgICAgICAgZGQgLnZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMCAgLSAudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcAorICAgICAgICBkZCAudnA4X3NhZDE2eDE2eDNfc3NzZTNfYWxpZ25lZF9ieV8xICAtIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19hbGlnbmVkX2J5XzIgIC0gLnZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgZGQgLnZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMyAgLSAudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcAorICAgICAgICBkZCAudnA4X3NhZDE2eDE2eDNfc3NzZTNfYWxpZ25lZF9ieV80ICAtIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19hbGlnbmVkX2J5XzUgIC0gLnZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgZGQgLnZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfNiAgLSAudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcAorICAgICAgICBkZCAudnA4X3NhZDE2eDE2eDNfc3NzZTNfYWxpZ25lZF9ieV83ICAtIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19hbGlnbmVkX2J5XzggIC0gLnZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgZGQgLnZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfOSAgLSAudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcAorICAgICAgICBkZCAudnA4X3NhZDE2eDE2eDNfc3NzZTNfYWxpZ25lZF9ieV8xMCAtIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19hbGlnbmVkX2J5XzExIC0gLnZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgZGQgLnZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTIgLSAudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcAorICAgICAgICBkZCAudnA4X3NhZDE2eDE2eDNfc3NzZTNfYWxpZ25lZF9ieV8xMyAtIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19hbGlnbmVkX2J5XzE0IC0gLnZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgZGQgLnZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTUgLSAudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcAorLnZwOF9zYWQxNngxNngzX3Nzc2UzX3NraXB0YWJsZToKKworICAgICAgICBjYWxsIC52cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCisudnA4X3NhZDE2eDE2eDNfc3NzZTNfZG9fanVtcDoKKyAgICAgICAgcG9wICAgICAgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCB0aGUgYWRkcmVzcyBvZiBkb19qdW1wCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAudnA4X3NhZDE2eDE2eDNfc3NzZTNfanVtcHRhYmxlIC0gLnZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJheCwgIHJjeCAgOyBnZXQgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdnA4X3NhZDE2eDE2eDNfc3NzZTNfanVtcHRhYmxlCisKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgIGR3b3JkIFtyYXggKyA0KnJkeF0gICA7IGdldCB0aGUgMzIgYml0IG9mZnNldCBmcm9tIHRoZSBqdW1wdGFibGUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJjeCwgICAgICAgIHJheAorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCisKKyAgICAgICAgam1wICAgICAgICAgICAgIHJjeAorCisgICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMCwgIC52cDhfc2FkMTZ4MTZ4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDE2WDNfT0ZGU0VUIDEsICAudnA4X3NhZDE2eDE2eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlgxNlgzX09GRlNFVCAyLCAgLnZwOF9zYWQxNngxNngzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMywgIC52cDhfc2FkMTZ4MTZ4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDE2WDNfT0ZGU0VUIDQsICAudnA4X3NhZDE2eDE2eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlgxNlgzX09GRlNFVCA1LCAgLnZwOF9zYWQxNngxNngzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgNiwgIC52cDhfc2FkMTZ4MTZ4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDE2WDNfT0ZGU0VUIDcsICAudnA4X3NhZDE2eDE2eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlgxNlgzX09GRlNFVCA4LCAgLnZwOF9zYWQxNngxNngzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgOSwgIC52cDhfc2FkMTZ4MTZ4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDE2WDNfT0ZGU0VUIDEwLCAudnA4X3NhZDE2eDE2eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlgxNlgzX09GRlNFVCAxMSwgLnZwOF9zYWQxNngxNngzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMTIsIC52cDhfc2FkMTZ4MTZ4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDE2WDNfT0ZGU0VUIDEzLCAudnA4X3NhZDE2eDE2eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlgxNlgzX09GRlNFVCAxNCwgLnZwOF9zYWQxNngxNngzX3Nzc2UzCisKKy52cDhfc2FkMTZ4MTZ4M19zc3NlM19hbGlnbmVkX2J5XzE1OgorICAgICAgICBQUk9DRVNTXzE2WDJYMyAxCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDAKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAorICAgICAgICBQUk9DRVNTXzE2WDJYMyAwCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDAKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAorICAgICAgICBQUk9DRVNTXzE2WDJYMyAwCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDAKKworLnZwOF9zYWQxNngxNngzX3Nzc2UzX3N0b3JlX29mZjoKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7UmVzdWx0cworCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW01CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW01LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW02CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW02LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGkrNF0sICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW03CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGkrOF0sICAgIHhtbTAKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmN4CisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIGludCB2cDhfc2FkMTZ4OHgzX3Nzc2UzKAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNyY19zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVmX3N0cmlkZSwKKzsgICAgaW50ICAqcmVzdWx0cykKK2dsb2JhbCBzeW0odnA4X3NhZDE2eDh4M19zc3NlMykgUFJJVkFURQorc3ltKHZwOF9zYWQxNng4eDNfc3NzZTMpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIFNBVkVfWE1NIDcKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICBwdXNoICAgICAgICByY3gKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmR4LCAgICAgICAgMHhmCisgICAgICAgIGFuZCAgICAgICAgICAgICByZHgsICAgICAgICByZGkKKworICAgICAgICBqbXAgLnZwOF9zYWQxNng4eDNfc3NzZTNfc2tpcHRhYmxlCisudnA4X3NhZDE2eDh4M19zc3NlM19qdW1wdGFibGU6CisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMCAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMSAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMiAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMyAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfNCAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfNSAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfNiAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfNyAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfOCAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfOSAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTAgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTEgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTIgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTMgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTQgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisgICAgICAgIGRkIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTUgLSAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisudnA4X3NhZDE2eDh4M19zc3NlM19za2lwdGFibGU6CisKKyAgICAgICAgY2FsbCAudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCisudnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wOgorICAgICAgICBwb3AgICAgICAgICAgICAgcmN4ICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ2V0IHRoZSBhZGRyZXNzIG9mIGRvX2p1bXAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2p1bXB0YWJsZSAtIC52cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJheCwgIHJjeCAgOyBnZXQgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdnA4X3NhZDE2eDh4M19zc3NlM19qdW1wdGFibGUKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgZHdvcmQgW3JheCArIDQqcmR4XSAgIDsgZ2V0IHRoZSAzMiBiaXQgb2Zmc2V0IGZyb20gdGhlIGp1bXB0YWJsZQorICAgICAgICBhZGQgICAgICAgICAgICAgcmN4LCAgICAgICAgcmF4CisKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKKworICAgICAgICBqbXAgICAgICAgICAgICAgcmN4CisKKyAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDAsICAudnA4X3NhZDE2eDh4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgMSwgIC52cDhfc2FkMTZ4OHgzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCAyLCAgLnZwOF9zYWQxNng4eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDMsICAudnA4X3NhZDE2eDh4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgNCwgIC52cDhfc2FkMTZ4OHgzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCA1LCAgLnZwOF9zYWQxNng4eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDYsICAudnA4X3NhZDE2eDh4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgNywgIC52cDhfc2FkMTZ4OHgzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCA4LCAgLnZwOF9zYWQxNng4eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDksICAudnA4X3NhZDE2eDh4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgMTAsIC52cDhfc2FkMTZ4OHgzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCAxMSwgLnZwOF9zYWQxNng4eDNfc3NzZTMKKyAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDEyLCAudnA4X3NhZDE2eDh4M19zc3NlMworICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgMTMsIC52cDhfc2FkMTZ4OHgzX3Nzc2UzCisgICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCAxNCwgLnZwOF9zYWQxNng4eDNfc3NzZTMKKworLnZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV8xNToKKworICAgICAgICBQUk9DRVNTXzE2WDJYMyAxCisgICAgICAgIFBST0NFU1NfMTZYMlgzIDAKKyAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAorICAgICAgICBQUk9DRVNTXzE2WDJYMyAwCisKKy52cDhfc2FkMTZ4OHgzX3Nzc2UzX3N0b3JlX29mZjoKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7UmVzdWx0cworCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW01CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW01LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW02CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW02LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGkrNF0sICAgIHhtbTAKKzstCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW03CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICA4CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGkrOF0sICAgIHhtbTAKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmN4CisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfbW14LmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9tbXguYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGQ0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfbW14LmFzbQpAQCAtMCwwICsxLDcwMiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorZXh0ZXJuIHN5bSh2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfOCkKKworCislZGVmaW5lIEJMT0NLX0hFSUdIVF9XSURUSCA0CislZGVmaW5lIHZwOF9maWx0ZXJfd2VpZ2h0IDEyOAorJWRlZmluZSBWUDhfRklMVEVSX1NISUZUICA3CisKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teAorOygKKzsgICAgdW5zaWduZWQgY2hhciAgICpzcmNfcHRyLAorOyAgICB1bnNpZ25lZCBzaG9ydCAgKm91dHB1dF9wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCis7ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgsCis7ICAgIHNob3J0ICAgICAgICAgICAqIHZwOF9maWx0ZXIKKzspCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgIGFyZyg2KSA7dnA4X2ZpbHRlcgorCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgW3JkeCArIDE2XSAgICAgICAgICAgICA7IGRvIGJvdGggdGhlIG5lZ2F0aXZlIHRhcHMgZmlyc3QhISEKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBbcmR4ICsgMzJdICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIFtyZHggKyA0OF0gICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICBbcmR4ICsgNjRdICAgICAgICA7CisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICBhcmcoMSkgO291dHB1dF9wdHIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICBkd29yZCBwdHIgYXJnKDQpIDtvdXRwdXRfaGVpZ2h0CisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgZHdvcmQgcHRyIGFyZyg1KSA7b3V0cHV0X3dpZHRoICAgICAgOyBkZXN0aW5hdGlvbiBwaXRjaD8KKyAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICBtbTAgICAgICAgICAgICAgIDsgbW0wID0gMDAwMDAwMDAKKworLm5leHRyb3c6CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgW3JzaS0yXSAgICAgICAgICA7IG1tMyA9IHAtMi4ucDUKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTMgICAgICAgICAgICAgIDsgbW00ID0gcC0yLi5wNQorICAgICAgICBwc3JscSAgICAgICBtbTMsICAgIDggICAgICAgICAgICAgICAgOyBtbTMgPSBwLTEuLnA1CisgICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgbW0wICAgICAgICAgICAgICA7IG1tMyA9IHAtMS4ucDIKKyAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICBtbTEgICAgICAgICAgICAgIDsgbW0zICo9IGtlcm5lbCAxIG1vZGlmaWVycy4KKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tNCAgICAgICAgICAgICAgOyBtbTUgPSBwLTIuLnA1CisgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW0wICAgICAgICAgICAgICA7IG1tNSA9IHAyLi5wNQorICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgIG1tNyAgICAgICAgICAgICAgOyBtbTUgKj0ga2VybmVsIDQgbW9kaWZpZXJzCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgICAgbW00ICAgICAgICAgICAgICA7IG1tMyArPSBtbTUKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tNSAgICAgICAgICAgICAgOyBtbTQgPSBwLTIuLnA1OworICAgICAgICBwc3JscSAgICAgICBtbTUsICAgIDE2ICAgICAgICAgICAgICAgOyBtbTUgPSBwMC4ucDU7CisgICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgbW0wICAgICAgICAgICAgICA7IG1tNSA9IHAwLi5wMworICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgIG1tMiAgICAgICAgICAgICAgOyBtbTUgKj0ga2VybmVsIDIgbW9kaWZpZXJzCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgICAgbW01ICAgICAgICAgICAgICA7IG1tMyArPSBtbTUKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tNCAgICAgICAgICAgICAgOyBtbTUgPSBwLTIuLnA1CisgICAgICAgIHBzcmxxICAgICAgIG1tNCwgICAgMjQgICAgICAgICAgICAgICA7IG1tNCA9IHAxLi5wNQorICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgIG1tMCAgICAgICAgICAgICAgOyBtbTQgPSBwMS4ucDQKKyAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICBtbTYgICAgICAgICAgICAgIDsgbW01ICo9IGtlcm5lbCAzIG1vZGlmaWVycworICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW01CisKKyAgICAgICAgOyBkbyBvdXRlciBwb3NpdGl2ZSB0YXBzCisgICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgW3JzaSszXQorICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgIG1tMCAgICAgICAgICAgICAgOyBtbTUgPSBwMy4ucDYKKyAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICBbcmR4KzgwXSAgICAgICAgIDsgbW01ICo9IGtlcm5lbCAwIG1vZGlmaWVycworICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW01CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICBtbTAgICAgICAgICAgICAgIDsgbW01ID0gcC0yLi5wMQorICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgIFtyZHhdICAgICAgICAgICAgOyBtbTUgKj0ga2VybmVsIDUgbW9kaWZpZXJzCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgICAgbW01ICAgICAgICAgICAgICA7IG1tMyArPSBtbTUKKworICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgOyBtbTMgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICBWUDhfRklMVEVSX1NISUZUICAgICA7IG1tMyAvPSAxMjgKKyAgICAgICAgcGFja3Vzd2IgICAgbW0zLCAgICBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCisgICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgbW0wICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICBtbTMgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICBkd29yZCBwdHIgYXJnKDIpIDtzcmNfcGl4ZWxzX3Blcl9saW5lIDsgbmV4dCBsaW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgcmF4OworJWVsc2UKKyAgICAgICAgbW92c3hkICAgICAgcjgsICAgICBkd29yZCBwdHIgYXJnKDIpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgcmF4OworCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgcjggICAgICAgICAgICAgICA7IG5leHQgbGluZQorJWVuZGlmCisKKyAgICAgICAgZGVjICAgICAgICAgcmN4ICAgICAgICAgICAgICAgICAgICAgIDsgZGVjcmVtZW50IGNvdW50CisgICAgICAgIGpueiAgICAgICAgIC5uZXh0cm93ICAgICAgICAgICAgICAgICA7IG5leHQgcm93CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgKKzsoCis7ICAgc2hvcnQgKnNyY19wdHIsCis7ICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKzsgICAgaW50IG91dHB1dF9waXRjaCwKKzsgICB1bnNpZ25lZCBpbnQgcGl4ZWxzX3Blcl9saW5lLAorOyAgIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLAorOyAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorOyAgIHVuc2lnbmVkIGludCBvdXRwdXRfd2lkdGgsCis7ICAgc2hvcnQgKiB2cDhfZmlsdGVyCis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWRjX3Y2X21teCkgUFJJVkFURQorc3ltKHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3ZxICAgICAgbW01LCBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHVzaCAgICAgICAgcmJ4CisgICAgICAgIG1vdiAgICAgICAgIHJieCwgYXJnKDcpIDt2cDhfZmlsdGVyCisgICAgICAgIG1vdnEgICAgICBtbTEsIFtyYnggKyAxNl0gICAgICAgICAgICAgOyBkbyBib3RoIHRoZSBuZWdhdGl2ZSB0YXBzIGZpcnN0ISEhCisgICAgICAgIG1vdnEgICAgICBtbTIsIFtyYnggKyAzMl0gICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICBtbTYsIFtyYnggKyA0OF0gICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgIG1tNywgW3JieCArIDY0XSAgICAgICAgOworCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgZHdvcmQgcHRyIGFyZygzKSA7cGl4ZWxzX3Blcl9saW5lCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDEpIDtvdXRwdXRfcHRyCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIHN1YiAgICAgICAgIHJzaSwgcmR4CisgICAgICAgIHN1YiAgICAgICAgIHJzaSwgcmR4CisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgRFdPUkQgUFRSIGFyZyg1KSA7b3V0cHV0X2hlaWdodAorICAgICAgICBtb3ZzeGQgICAgICByYXgsIERXT1JEIFBUUiBhcmcoMikgO291dHB1dF9waXRjaCAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/CisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgICA7IG1tMCA9IDAwMDAwMDAwCisKKworLm5leHRyb3dfY3Y6CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgW3JzaStyZHhdICAgICAgICA7IG1tMyA9IHAwLi5wOCAgPSByb3cgLTEKKyAgICAgICAgcG11bGx3ICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgIDsgbW0zICo9IGtlcm5lbCAxIG1vZGlmaWVycy4KKworCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgW3JzaSArIDQqcmR4XSAgICAgIDsgbW00ID0gcDAuLnAzICA9IHJvdyAyCisgICAgICAgIHBtdWxsdyAgICAgIG1tNCwgbW03ICAgICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgNCBtb2RpZmllcnMuCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgbW00ICAgICAgICAgICAgICA7IG1tMyArPSBtbTQKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2kgKyAyKnJkeF0gICAgICAgICAgIDsgbW00ID0gcDAuLnAzICA9IHJvdyAwCisgICAgICAgIHBtdWxsdyAgICAgIG1tNCwgbW0yICAgICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMiBtb2RpZmllcnMuCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgbW00ICAgICAgICAgICAgICA7IG1tMyArPSBtbTQKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2ldICAgICAgICAgICAgOyBtbTQgPSBwMC4ucDMgID0gcm93IC0yCisgICAgICAgIHBtdWxsdyAgICAgIG1tNCwgW3JieF0gICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMCBtb2RpZmllcnMuCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgbW00ICAgICAgICAgICAgICA7IG1tMyArPSBtbTQKKworCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgcmR4ICAgICAgICAgICAgICA7IG1vdmUgc291cmNlIGZvcndhcmQgMSBsaW5lIHRvIGF2b2lkIDMgKiBwaXRjaAorICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2kgKyAyKnJkeF0gICAgIDsgbW00ID0gcDAuLnAzICA9IHJvdyAxCisgICAgICAgIHBtdWxsdyAgICAgIG1tNCwgbW02ICAgICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMyBtb2RpZmllcnMuCisgICAgICAgIHBhZGRzdyAgICAgIG1tMywgbW00ICAgICAgICAgICAgICA7IG1tMyArPSBtbTQKKworICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2kgKyA0KnJkeF0gICAgOyBtbTQgPSBwMC4ucDMgID0gcm93IDMKKyAgICAgICAgcG11bGx3ICAgICAgbW00LCBbcmJ4ICs4MF0gICAgICAgIDsgbW00ICo9IGtlcm5lbCAzIG1vZGlmaWVycy4KKyAgICAgICAgcGFkZHN3ICAgICAgbW0zLCBtbTQgICAgICAgICAgICAgIDsgbW0zICs9IG1tNAorCisKKyAgICAgICAgcGFkZHN3ICAgICAgbW0zLCBtbTUgICAgICAgICAgICAgICA7IG1tMyArPSByb3VuZCB2YWx1ZQorICAgICAgICBwc3JhdyAgICAgICBtbTMsIFZQOF9GSUxURVJfU0hJRlQgICAgIDsgbW0zIC89IDEyOAorICAgICAgICBwYWNrdXN3YiAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCBzYXR1cmF0ZQorCisgICAgICAgIG1vdmQgICAgICAgIFtyZGldLG1tMyAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICA7IHRoZSBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMgcmVwZWF0IDMgb3V0IG9mIDQgb2YgdGhlc2UgcmVhZHMuICBTaW5jZSB0aGUKKyAgICAgICAgOyByZWNvbiBibG9jayBzaG91bGQgYmUgaW4gY2FjaGUgdGhpcyBzaG91bGRuJ3QgY29zdCBtdWNoLiAgSXRzIG9idmlvdXNseQorICAgICAgICA7IGF2b2lkYWJsZSEhIS4KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgW3JkaStyYXhdIDsKKyAgICAgICAgZGVjICAgICAgICAgcmN4ICAgICAgICAgICAgICAgICAgIDsgZGVjcmVtZW50IGNvdW50CisgICAgICAgIGpueiAgICAgICAgIC5uZXh0cm93X2N2ICAgICAgICAgICA7IG5leHQgcm93CisKKyAgICAgICAgcG9wICAgICAgICAgcmJ4CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICBpbnQgIHhvZmZzZXQsCis7ICAgIGludCAgeW9mZnNldCwKKzsgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyAgICBpbnQgZHN0X3BpdGNoCis7KQorZ2xvYmFsIHN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgO2NvbnN0IHNob3J0ICpIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzhbeG9mZnNldF07CisgICAgO2NvbnN0IHNob3J0ICpWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzhbeW9mZnNldF07CisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7eG9mZnNldAorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO2RzdF9wdHIgICAgICAgICAgIDsKKworICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1IDsgb2Zmc2V0ICogMzIKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzgpKV0KKworICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggOyBIRmlsdGVyCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0ciAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaAorICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBbcmF4KzE2XSAgICAgICAgICAgIDsKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7eW9mZnNldAorCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUgOyBvZmZzZXQqMzIKKyAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4IDsgVkZpbHRlcgorCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdICAgICAgICAgIDsKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7CisKKworCisgICAgICAgIDsgZ2V0IHRoZSBmaXJzdCBob3Jpem9udGFsIGxpbmUgZG9uZSAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2CisgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKKy5uZXh0X3Jvd184eDg6CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2CisgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTAKKworICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOworCisKKyAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICAgICAgW3JheCsxNl0gICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOworCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOworCisgICAgICAgIHBhY2t1c3diICAgIG1tMywgICAgICAgIG1tNAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKworJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaCAgICAgICAgICAgICAgICAgICA7CislZWxzZQorICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOCAgICAgICAgICAgICAgICAgIDtkc3RfcGl0Y2gKKyVlbmRpZgorICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3ggICAgICAgICAgICAgICAgIDsKKyAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93Xzh4OAorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIGJpbGluZWFyX3ByZWRpY3Q4eDRfbW14Cis7KAorOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgaW50ICB4b2Zmc2V0LAorOyAgICBpbnQgIHlvZmZzZXQsCis7ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCis7ICAgIGludCBkc3RfcGl0Y2gKKzspCitnbG9iYWwgc3ltKHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X21teCkgUFJJVkFURQorc3ltKHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICA7Y29uc3Qgc2hvcnQgKkhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfOFt4b2Zmc2V0XTsKKyAgICA7Y29uc3Qgc2hvcnQgKlZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfOFt5b2Zmc2V0XTsKKworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDt4b2Zmc2V0CisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7ZHN0X3B0ciAgICAgICAgICAgOworCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtHTE9CQUwoc3ltKHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl84KSldCisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIgICAgICAgICAgICAgIDsKKyAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4CisKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7ZHN0X3BpdGNoCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIFtyYXhdICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDt5b2Zmc2V0CisKKyAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKKworICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3gKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkaStyZHgqNF0gICAgICAgICAgOworCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgOworCisgICAgICAgIDsgZ2V0IHRoZSBmaXJzdCBob3Jpem9udGFsIGxpbmUgZG9uZSAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2CisgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKKy5uZXh0X3Jvd184eDQ6CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2CisgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTAKKworICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOworCisKKyAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICAgICAgW3JheCsxNl0gICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOworCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOworCisgICAgICAgIHBhY2t1c3diICAgIG1tMywgICAgICAgIG1tNAorCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKworJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaCAgICAgICAgICAgICAgICAgICA7CislZWxzZQorICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAorJWVuZGlmCisgICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgOworICAgICAgICBqbmUgICAgICAgICAubmV4dF9yb3dfOHg0CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgYmlsaW5lYXJfcHJlZGljdDR4NF9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICBpbnQgIHhvZmZzZXQsCis7ICAgIGludCAgeW9mZnNldCwKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgICAgaW50IGRzdF9waXRjaAorOykKK2dsb2JhbCBzeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfbW14KSBQUklWQVRFCitzeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIDtjb25zdCBzaG9ydCAqSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl84W3hvZmZzZXRdOworICAgIDtjb25zdCBzaG9ydCAqVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl84W3lvZmZzZXRdOworCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO3hvZmZzZXQKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpIDtkc3RfcHRyICAgICAgICAgICA7CisKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzgpKV0KKyAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNQorCisgICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeCA7IEhGaWx0ZXIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7bGRzdF9waXRjaAorICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBbcmF4KzE2XSAgICAgICAgICAgIDsKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7eW9mZnNldAorCisgICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1CisKKyAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4CisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjRdICAgICAgICAgIDsKKworICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgIDsKKworICAgICAgICA7IGdldCB0aGUgZmlyc3QgaG9yaXpvbnRhbCBsaW5lIGRvbmUgICAgICAgOworICAgICAgICBtb3ZkICAgICAgICBtbTMsICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2CisKKyAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmQgICAgICAgIG1tNSwgICAgICAgIFtyc2krMV0gICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKworICAgICAgICBwc3JhdyAgICAgICBtbTMsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4CisKKyAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKKy5uZXh0X3Jvd180eDQ6CisgICAgICAgIG1vdmQgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBwdW5wY2tsYncgICBtbTMsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYKKworICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92ZCAgICAgICAgbW01LCAgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tsYncgICBtbTUsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKworICAgICAgICBwc3JhdyAgICAgICBtbTMsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4CisgICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKworCisgICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBwYWNrdXN3YiAgICBtbTMsICAgICAgICBtbTAKKyAgICAgICAgbW92ZCAgICAgICAgW3JkaV0sICAgICAgbW0zICAgICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7ZHN0X3BpdGNoICAgICAgICAgICAgICAgICAgIDsKKyVlbHNlCisgICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaCAgICAgICAgICAgICAgICAgICA7CisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorCisgICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgOworICAgICAgICBqbmUgICAgICAgICAubmV4dF9yb3dfNHg0CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK3JkOgorICAgIHRpbWVzIDQgZHcgMHg0MAorCithbGlnbiAxNgorZ2xvYmFsIEhJRERFTl9EQVRBKHN5bSh2cDhfc2l4X3RhcF9tbXgpKQorc3ltKHZwOF9zaXhfdGFwX21teCk6CisgICAgdGltZXMgOCBkdyAwCisgICAgdGltZXMgOCBkdyAwCisgICAgdGltZXMgOCBkdyAxMjgKKyAgICB0aW1lcyA4IGR3IDAKKyAgICB0aW1lcyA4IGR3IDAKKyAgICB0aW1lcyA4IGR3IDAKKworICAgIHRpbWVzIDggZHcgMAorICAgIHRpbWVzIDggZHcgLTYKKyAgICB0aW1lcyA4IGR3IDEyMworICAgIHRpbWVzIDggZHcgMTIKKyAgICB0aW1lcyA4IGR3IC0xCisgICAgdGltZXMgOCBkdyAwCisKKyAgICB0aW1lcyA4IGR3IDIKKyAgICB0aW1lcyA4IGR3IC0xMQorICAgIHRpbWVzIDggZHcgMTA4CisgICAgdGltZXMgOCBkdyAzNgorICAgIHRpbWVzIDggZHcgLTgKKyAgICB0aW1lcyA4IGR3IDEKKworICAgIHRpbWVzIDggZHcgMAorICAgIHRpbWVzIDggZHcgLTkKKyAgICB0aW1lcyA4IGR3IDkzCisgICAgdGltZXMgOCBkdyA1MAorICAgIHRpbWVzIDggZHcgLTYKKyAgICB0aW1lcyA4IGR3IDAKKworICAgIHRpbWVzIDggZHcgMworICAgIHRpbWVzIDggZHcgLTE2CisgICAgdGltZXMgOCBkdyA3NworICAgIHRpbWVzIDggZHcgNzcKKyAgICB0aW1lcyA4IGR3IC0xNgorICAgIHRpbWVzIDggZHcgMworCisgICAgdGltZXMgOCBkdyAwCisgICAgdGltZXMgOCBkdyAtNgorICAgIHRpbWVzIDggZHcgNTAKKyAgICB0aW1lcyA4IGR3IDkzCisgICAgdGltZXMgOCBkdyAtOQorICAgIHRpbWVzIDggZHcgMAorCisgICAgdGltZXMgOCBkdyAxCisgICAgdGltZXMgOCBkdyAtOAorICAgIHRpbWVzIDggZHcgMzYKKyAgICB0aW1lcyA4IGR3IDEwOAorICAgIHRpbWVzIDggZHcgLTExCisgICAgdGltZXMgOCBkdyAyCisKKyAgICB0aW1lcyA4IGR3IDAKKyAgICB0aW1lcyA4IGR3IC0xCisgICAgdGltZXMgOCBkdyAxMgorICAgIHRpbWVzIDggZHcgMTIzCisgICAgdGltZXMgOCBkdyAtNgorICAgIHRpbWVzIDggZHcgMAorCisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9zc2UyLmFzbSBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWY4ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3N1YnBpeGVsX3NzZTIuYXNtCkBAIC0wLDAgKzEsMTM3MiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorZXh0ZXJuIHN5bSh2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfOCkKKworJWRlZmluZSBCTE9DS19IRUlHSFRfV0lEVEggNAorJWRlZmluZSBWUDhfRklMVEVSX1dFSUdIVCAxMjgKKyVkZWZpbmUgVlA4X0ZJTFRFUl9TSElGVCAgNworCisKKzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IE5vdGVzOiBmaWx0ZXJfYmxvY2sxZF9oNiBhcHBsaWVzIGEgNiB0YXAgZmlsdGVyIGhvcml6b250YWxseSB0byB0aGUgaW5wdXQgcGl4ZWxzLiBUaGUKKzsgaW5wdXQgcGl4ZWwgYXJyYXkgaGFzIG91dHB1dF9oZWlnaHQgcm93cy4gVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBvdXRwdXRfaGVpZ2h0IGlzIGFuCis7IGV2ZW4gbnVtYmVyLiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgOCBwaXhlbHMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24sIGNhbGN1bGF0aW5nIE9ORQorOyByb3dzIGVhY2ggaXRlcmF0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSAxMjggYml0cyBvcGVyYXRpb25zLgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyAgICB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGludCAgICBwaXhlbF9zdGVwLAorOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF93aWR0aCwKKzsgICAgc2hvcnQgICAgICAgICAgICp2cDhfZmlsdGVyCis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNworICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoNikgO3ZwOF9maWx0ZXIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpIDtvdXRwdXRfcHRyCisKKyAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7b3V0cHV0X2hlaWdodAorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgICAgICAgICAgOyBQaXRjaCBmb3IgU291cmNlCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7b3V0cHV0X3dpZHRoCislZW5kaWYKKyAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCisKKy5maWx0ZXJfYmxvY2sxZDhfaDZfcm93bG9vcDoKKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcnNpIC0gMl0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgNl0KKworICAgICAgICBwcmVmZXRjaHQyICBbcnNpK3JheC0yXQorCisgICAgICAgIHBzbGxkcSAgICAgIHhtbTEsICAgICAgIDgKKyAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgeG1tMworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAxIHh4LTEgeHgtMgorICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMCAtMQorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZHhdICAgICAgICAgICA7IHhbLTJdICogSFstMl07IFRhcCAxCisgICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAgeHgtMQorCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyZHgrMTZdICAgICAgICA7IHhbLTFdICogSFstMV07IFRhcCAyCisKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAKKyAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEKKworICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmR4KzMyXSAgICAgICAgICAgICAgICAgICAgOyB4WyAwXSAqIEhbIDBdOyBUYXAgMworCisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMQorICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMgorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyZHgrNDhdICAgICAgICAgICAgICAgICAgICA7IHhbIDFdICogaFsgMV0gOyBUYXAgNAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMgorICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMworCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNywgICAgICAgW3JkeCs2NF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMl0gKiBoWyAyXSA7IFRhcCA1CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwYSB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIFtyZHgrODBdICAgICAgICAgICAgICAgICAgICA7IHhbIDNdICogaFsgM10gOyBUYXAgNgorCisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW01CisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW02CisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMQorICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KKworICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICA3CisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wCisKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQdHIgW3JkaV0sICAgICAgICAgeG1tNAorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4XQorCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFB0ciBhcmcoNSkgO1tvdXRwdXRfd2lkdGhdCislZWxzZQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAorJWVuZGlmCisgICAgICAgIGRlYyAgICAgICAgIHJjeAorCisgICAgICAgIGpueiAgICAgICAgIC5maWx0ZXJfYmxvY2sxZDhfaDZfcm93bG9vcCAgICAgICAgICAgICAgICA7IG5leHQgcm93CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCis7ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgsCis7ICAgIHNob3J0ICAgICAgICAgICAqdnA4X2ZpbHRlcgorOykKKzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IE5vdGVzOiBmaWx0ZXJfYmxvY2sxZF9oNiBhcHBsaWVzIGEgNiB0YXAgZmlsdGVyIGhvcml6b250YWxseSB0byB0aGUgaW5wdXQgcGl4ZWxzLiBUaGUKKzsgaW5wdXQgcGl4ZWwgYXJyYXkgaGFzIG91dHB1dF9oZWlnaHQgcm93cy4gVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBvdXRwdXRfaGVpZ2h0IGlzIGFuCis7IGV2ZW4gbnVtYmVyLiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgOCBwaXhlbHMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24sIGNhbGN1bGF0aW5nIE9ORQorOyByb3dzIGVhY2ggaXRlcmF0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSAxMjggYml0cyBvcGVyYXRpb25zLgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDYpIDt2cDhfZmlsdGVyCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgorCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7b3V0cHV0X3B0cgorCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO291dHB1dF9oZWlnaHQKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICAgICAgICAgIDsgUGl0Y2ggZm9yIFNvdXJjZQorJWlmIEFCSV9JU18zMkJJVD0wCisgICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO291dHB1dF93aWR0aAorJWVuZGlmCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCisKKy5maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTJfcm93bG9vcDoKKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcnNpIC0gMl0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgNl0KKworICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgKzE0XQorICAgICAgICBwc2xsZHEgICAgICB4bW0yLCAgICAgICA4CisKKyAgICAgICAgcG9yICAgICAgICAgeG1tMiwgICAgICAgeG1tMQorICAgICAgICBwcmVmZXRjaHQyICBbcnNpK3JheC0yXQorCisgICAgICAgIHBzbGxkcSAgICAgIHhtbTEsICAgICAgIDgKKyAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgeG1tMworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAxIHh4LTEgeHgtMgorICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMCAtMQorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZHhdICAgICAgICAgICA7IHhbLTJdICogSFstMl07IFRhcCAxCisgICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAgeHgtMQorCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyZHgrMTZdICAgICAgICA7IHhbLTFdICogSFstMV07IFRhcCAyCisKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAKKyAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEKKworICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmR4KzMyXSAgICAgICAgICAgICAgICAgICAgOyB4WyAwXSAqIEhbIDBdOyBUYXAgMworCisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMQorICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMgorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyZHgrNDhdICAgICAgICAgICAgICAgICAgICA7IHhbIDFdICogaFsgMV0gOyBUYXAgNAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMgorICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMworCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNywgICAgICAgW3JkeCs2NF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMl0gKiBoWyAyXSA7IFRhcCA1CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwYSB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIFtyZHgrODBdICAgICAgICAgICAgICAgICAgICA7IHhbIDNdICogaFsgM10gOyBUYXAgNgorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTcKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNQorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNgorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgNworCisgICAgICAgIHBhY2t1c3diICAgIHhtbTQsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMAorCisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUHRyIFtyZGldLCAgICAgICAgIHhtbTQKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0yCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDEgeHgtMSB4eC0yCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTQsICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwIC0xCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JkeF0gICAgICAgICAgIDsgeFstMl0gKiBIWy0yXTsgVGFwIDEKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMCB4eC0xCisKKyAgICAgICAgcHNybGRxICAgICAgeG1tNSwgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkeCsxNl0gICAgICAgIDsgeFstMV0gKiBIWy0xXTsgVGFwIDIKKworCisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMAorICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMQorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyZHgrMzJdICAgICAgICAgICAgICAgICAgICA7IHhbIDBdICogSFsgMF07IFRhcCAzCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JkeCs0OF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMV0gKiBoWyAxXSA7IFRhcCA0CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTIsICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNywgICAgICAgW3JkeCs2NF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMl0gKiBoWyAyXSA7IFRhcCA1CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwYSB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgIFtyZHgrODBdICAgICAgICAgICAgICAgICAgICA7IHhbIDNdICogaFsgM10gOyBUYXAgNgorCisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW01CisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW02CisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMgorICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KKworICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICA3CisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wCisKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQdHIgW3JkaSsxNl0sICAgICAgeG1tNAorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXhdCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFB0ciBhcmcoNSkgO1tvdXRwdXRfd2lkdGhdCislZWxzZQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAorJWVuZGlmCisKKyAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgIGpueiAgICAgICAgIC5maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTJfcm93bG9vcCAgICAgICAgICAgICAgICA7IG5leHQgcm93CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3NzZTIKKzsoCis7ICAgIHNob3J0ICpzcmNfcHRyLAorOyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorOyAgICBpbnQgZHN0X3B0aWNoLAorOyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKKzsgICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCis7ICAgIHVuc2lnbmVkIGludCBvdXRwdXRfd2lkdGgsCis7ICAgIHNob3J0ICogdnA4X2ZpbHRlcgorOykKKzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IE5vdGVzOiBmaWx0ZXJfYmxvY2sxZDhfdjYgYXBwbGllcyBhIDYgdGFwIGZpbHRlciB2ZXJ0aWNhbGx5IHRvIHRoZSBpbnB1dCBwaXhlbHMuIFRoZQorOyBpbnB1dCBwaXhlbCBhcnJheSBoYXMgb3V0cHV0X2hlaWdodCByb3dzLgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NlMikgUFJJVkFURQorc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA4CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7dnA4X2ZpbHRlcgorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtwaXhlbHNfcGVyX2xpbmUKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO291dHB1dF9wdHIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisKKyAgICAgICAgc3ViICAgICAgICAgcnNpLCAgICAgICAgcmR4CisgICAgICAgIHN1YiAgICAgICAgIHJzaSwgICAgICAgIHJkeAorCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIERXT1JEIFBUUiBhcmcoNSkgO1tvdXRwdXRfaGVpZ2h0XQorICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW0dMT0JBTChyZCldCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7IGRzdF9wdGljaAorJWVuZGlmCisKKy52cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3NzZTJfbG9vcDoKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgW3JheF0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4XQorICAgICAgICBwbXVsbHcgICAgICB4bW0yLCAgICAgICBbcmF4ICsgMTZdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIFtyYXggKyAzMl0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JheCArIDY0XQorCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeAorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0KKworICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBbcmF4ICsgNDhdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XQorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyYXggKyA4MF0KKworICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW01CisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTMKKworICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW0xCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTQKKworICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW02CisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTcKKworICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICA3CisgICAgICAgIHBhY2t1c3diICAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgc2F0dXJhdGUKKworICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaV0sIHhtbTIgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDIpIDtbZHN0X3B0aWNoXQorJWVsc2UKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorICAgICAgICBkZWMgICAgICAgICByY3ggICAgICAgICA7IGRlY3JlbWVudCBjb3VudAorICAgICAgICBqbnogICAgICAgICAudnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc2UyX2xvb3AgICAgICAgICAgICAgICA7IG5leHQgcm93CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBzaG9ydCAqc3JjX3B0ciwKKzsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKzsgICAgaW50IGRzdF9wdGljaCwKKzsgICAgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsCis7ICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorOyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorOyAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgorOykKKzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IE5vdGVzOiBmaWx0ZXJfYmxvY2sxZDE2X3Y2IGFwcGxpZXMgYSA2IHRhcCBmaWx0ZXIgdmVydGljYWxseSB0byB0aGUgaW5wdXQgcGl4ZWxzLiBUaGUKKzsgaW5wdXQgcGl4ZWwgYXJyYXkgaGFzIG91dHB1dF9oZWlnaHQgcm93cy4KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyKSBQUklWQVRFCitzeW0odnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA4CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7dnA4X2ZpbHRlcgorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtwaXhlbHNfcGVyX2xpbmUKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO291dHB1dF9wdHIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisKKyAgICAgICAgc3ViICAgICAgICAgcnNpLCAgICAgICAgcmR4CisgICAgICAgIHN1YiAgICAgICAgIHJzaSwgICAgICAgIHJkeAorCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIERXT1JEIFBUUiBhcmcoNSkgO1tvdXRwdXRfaGVpZ2h0XQorJWlmIEFCSV9JU18zMkJJVD0wCisgICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgOyBkc3RfcHRpY2gKKyVlbmRpZgorCisudnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NlMl9sb29wOgorOyBUaGUgb3JkZXIgZm9yIGFkZGluZyA2LXRhcCBpcyAyIDUgMyAxIDQgNi4gUmVhZCBpbiBkYXRhIGluIHRoYXQgb3JkZXIuCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHhdICAgICAgIDsgbGluZSAyCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKyAxNl0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgW3JheCArIDE2XQorICAgICAgICBwbXVsbHcgICAgICB4bW0yLCAgICAgICBbcmF4ICsgMTZdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdICAgICAgIDsgbGluZSA1CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0ICsgMTZdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIFtyYXggKyA2NF0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgW3JheCArIDY0XQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICA7IGxpbmUgMworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMiArIDE2XQorICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmF4ICsgMzJdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyYXggKyAzMl0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXSAgICAgICA7IGxpbmUgMQorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgMTZdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTcsICAgICAgIFtyYXhdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTAsICAgICAgIFtyYXhdCisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgeG1tMworICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW00CisgICAgICAgIHBhZGRzdyAgICAgIHhtbTEsICAgICAgIHhtbTUKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNgorICAgICAgICBwYWRkc3cgICAgICB4bW0xLCAgICAgICB4bW03CisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTAKKworICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0gICAgICAgOyBsaW5lIDQKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDIgKyAxNl0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgW3JheCArIDQ4XQorICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBbcmF4ICsgNDhdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdICAgICAgIDsgbGluZSA2CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0ICsgMTZdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyYXggKyA4MF0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JheCArIDgwXQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIFhNTVdPUkQgUFRSIFtHTE9CQUwocmQpXQorICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wCisKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgeG1tMworICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW00CisgICAgICAgIHBhZGRzdyAgICAgIHhtbTEsICAgICAgIHhtbTUKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNgorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTEsICAgICAgIHhtbTcKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNworCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgIDcKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgNworCisgICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcGFjayBhbmQgc2F0dXJhdGUKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTEgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUFRSIGFyZygyKSA7W2RzdF9wdGljaF0KKyVlbHNlCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4CislZW5kaWYKKyAgICAgICAgZGVjICAgICAgICAgcmN4ICAgICAgICAgOyBkZWNyZW1lbnQgY291bnQKKyAgICAgICAgam56ICAgICAgICAgLnZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3NzZTJfbG9vcCAgICAgICAgICAgICAgOyBuZXh0IHJvdworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9vbmx5X3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCis7ICAgIGludCBkc3RfcHRpY2gsCis7ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAorOyAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgorOykKKzsgRmlyc3QtcGFzcyBmaWx0ZXIgb25seSB3aGVuIHlvZmZzZXQ9PTAKK2dsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9vbmx5X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZyg1KSA7dnA4X2ZpbHRlcgorICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO291dHB1dF9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtvdXRwdXRfaGVpZ2h0CisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgICAgICAgICA7IFBpdGNoIGZvciBTb3VyY2UKKyVpZiBBQklfSVNfMzJCSVQ9MAorICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3RfcHRpY2gKKyVlbmRpZgorICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wIGZvciB1bnBhY2sKKworLmZpbHRlcl9ibG9jazFkOF9oNl9vbmx5X3Jvd2xvb3A6CisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JzaSAtIDJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIE1NV09SRCBQVFIgW3JzaSArIDZdCisKKyAgICAgICAgcHJlZmV0Y2h0MiAgW3JzaStyYXgtMl0KKworICAgICAgICBwc2xsZHEgICAgICB4bW0xLCAgICAgICA4CisgICAgICAgIHBvciAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTEKKworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMSB4eC0xIHh4LTIKKyAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAgLTEKKworICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4XSAgICAgICAgICAgOyB4Wy0yXSAqIEhbLTJdOyBUYXAgMQorICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwIHh4LTEKKworICAgICAgICBwc3JsZHEgICAgICB4bW01LCAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzE2XSAgICAgICAgOyB4Wy0xXSAqIEhbLTFdOyBUYXAgMgorCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JkeCszMl0gICAgICAgICAgICAgICAgICAgIDsgeFsgMF0gKiBIWyAwXTsgVGFwIDMKKworICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEKKyAgICAgICAgcHNybGRxICAgICAgeG1tNywgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIKKworICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICBbcmR4KzQ4XSAgICAgICAgICAgICAgICAgICAgOyB4WyAxXSAqIGhbIDFdIDsgVGFwIDQKKworICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIKKyAgICAgICAgcHNybGRxICAgICAgeG1tMSwgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMKKworCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTcsICAgICAgIFtyZHgrNjRdICAgICAgICAgICAgICAgICAgICA7IHhbIDJdICogaFsgMl0gOyBUYXAgNQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MGEgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMworICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICBbcmR4KzgwXSAgICAgICAgICAgICAgICAgICAgOyB4WyAzXSAqIGhbIDNdIDsgVGFwIDYKKworCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTcKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNQorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNgorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgNworCisgICAgICAgIHBhY2t1c3diICAgIHhtbTQsICAgICAgIHhtbTAKKworICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaV0sICAgeG1tNCAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4XQorCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFB0ciBhcmcoMykgO2RzdF9wdGljaAorJWVsc2UKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorICAgICAgICBkZWMgICAgICAgICByY3gKKworICAgICAgICBqbnogICAgICAgICAuZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfcm93bG9vcCAgICAgICAgICAgICAgIDsgbmV4dCByb3cKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X29ubHlfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKKzsgICAgaW50IGRzdF9wdGljaCwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCis7ICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCis7KQorOyBGaXJzdC1wYXNzIGZpbHRlciBvbmx5IHdoZW4geW9mZnNldD09MAorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9vbmx5X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9vbmx5X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoNSkgO3ZwOF9maWx0ZXIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtvdXRwdXRfcHRyCisKKyAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7b3V0cHV0X2hlaWdodAorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgICAgICAgICAgOyBQaXRjaCBmb3IgU291cmNlCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7ZHN0X3B0aWNoCislZW5kaWYKKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wIGZvciB1bnBhY2sKKworLmZpbHRlcl9ibG9jazFkMTZfaDZfb25seV9zc2UyX3Jvd2xvb3A6CisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JzaSAtIDJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIE1NV09SRCBQVFIgW3JzaSArIDZdCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsxNF0KKyAgICAgICAgcHNsbGRxICAgICAgeG1tMiwgICAgICAgOAorCisgICAgICAgIHBvciAgICAgICAgIHhtbTIsICAgICAgIHhtbTEKKyAgICAgICAgcHJlZmV0Y2h0MiAgW3JzaStyYXgtMl0KKworICAgICAgICBwc2xsZHEgICAgICB4bW0xLCAgICAgICA4CisgICAgICAgIHBvciAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTEKKworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMSB4eC0xIHh4LTIKKyAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAgLTEKKworICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4XSAgICAgICAgICAgOyB4Wy0yXSAqIEhbLTJdOyBUYXAgMQorICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwIHh4LTEKKworICAgICAgICBwc3JsZHEgICAgICB4bW01LCAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzE2XSAgICAgICAgOyB4Wy0xXSAqIEhbLTFdOyBUYXAgMgorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMAorICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMQorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyZHgrMzJdICAgICAgICAgICAgICAgICAgICA7IHhbIDBdICogSFsgMF07IFRhcCAzCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JkeCs0OF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMV0gKiBoWyAxXSA7IFRhcCA0CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNywgICAgICAgW3JkeCs2NF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMl0gKiBoWyAyXSA7IFRhcCA1CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwYSB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIFtyZHgrODBdICAgICAgICAgICAgICAgICAgICA7IHhbIDNdICogaFsgM10gOyBUYXAgNgorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTcKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNQorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNgorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgNworCisgICAgICAgIHBhY2t1c3diICAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IGxvd2VyIDggYnl0ZXMKKworICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQdHIgW3JkaV0sICAgICAgICAgeG1tNCAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0yCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDEgeHgtMSB4eC0yCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTQsICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwIC0xCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JkeF0gICAgICAgICAgIDsgeFstMl0gKiBIWy0yXTsgVGFwIDEKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMCB4eC0xCisKKyAgICAgICAgcHNybGRxICAgICAgeG1tNSwgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkeCsxNl0gICAgICAgIDsgeFstMV0gKiBIWy0xXTsgVGFwIDIKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAKKyAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEKKworICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmR4KzMyXSAgICAgICAgICAgICAgICAgICAgOyB4WyAwXSAqIEhbIDBdOyBUYXAgMworCisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMQorICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMgorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyZHgrNDhdICAgICAgICAgICAgICAgICAgICA7IHhbIDFdICogaFsgMV0gOyBUYXAgNAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMgorICAgICAgICBwc3JsZHEgICAgICB4bW0yLCAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMworCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTcsICAgICAgIFtyZHgrNjRdICAgICAgICAgICAgICAgICAgICA7IHhbIDJdICogaFsgMl0gOyBUYXAgNQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MGEgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMworICAgICAgICBwbXVsbHcgICAgICB4bW0yLCAgICAgICBbcmR4KzgwXSAgICAgICAgICAgICAgICAgICAgOyB4WyAzXSAqIGhbIDNdIDsgVGFwIDYKKworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW03CisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTUKKworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0zCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTYKKworICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0yCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQorCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIDcKKworICAgICAgICBwYWNrdXN3YiAgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBoaWdoZXIgOCBieXRlcworCisgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFB0ciBbcmRpKzhdLCAgICAgIHhtbTQgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXhdCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFB0ciBhcmcoMykgO2RzdF9wdGljaAorJWVsc2UKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorCisgICAgICAgIGRlYyAgICAgICAgIHJjeAorICAgICAgICBqbnogICAgICAgICAuZmlsdGVyX2Jsb2NrMWQxNl9oNl9vbmx5X3NzZTJfcm93bG9vcCAgICAgICAgICAgICAgIDsgbmV4dCByb3cKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfb25seV9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKzsgICAgaW50IGRzdF9wdGljaCwKKzsgICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCis7ICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCis7KQorOyBTZWNvbmQtcGFzcyBmaWx0ZXIgb25seSB3aGVuIHhvZmZzZXQ9PTAKK2dsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9vbmx5X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO291dHB1dF9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtvdXRwdXRfaGVpZ2h0CisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUKKworICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoNSkgO3ZwOF9maWx0ZXIKKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW0dMT0JBTChyZCldCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7IGRzdF9wdGljaAorJWVuZGlmCisKKy52cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMl9sb29wOgorICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIE1NV09SRCBQVFIgW3JzaSArIHJkeF0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0KKyAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0KKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4CisgICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMAorICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICBbcmF4XQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMiwgICAgICAgW3JheCArIDE2XQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgW3JheCArIDMyXQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JheCArIDY0XQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgW3JheCArIDQ4XQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTAKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JheCArIDgwXQorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTUKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tMworCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNAorCisgICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTYKKyAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNworCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgIDcKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCBzYXR1cmF0ZQorCisgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcmRpXSwgeG1tMiAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMykgO1tkc3RfcHRpY2hdCislZWxzZQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAorJWVuZGlmCisgICAgICAgIGRlYyAgICAgICAgIHJjeCAgICAgICAgIDsgZGVjcmVtZW50IGNvdW50CisgICAgICAgIGpueiAgICAgICAgIC52cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMl9sb29wICAgICAgICAgICAgICA7IG5leHQgcm93CisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfdW5wYWNrX2Jsb2NrMWQxNl9oNl9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF93aWR0aAorOykKK2dsb2JhbCBzeW0odnA4X3VucGFja19ibG9jazFkMTZfaDZfc3NlMikgUFJJVkFURQorc3ltKHZwOF91bnBhY2tfYmxvY2sxZDE2X2g2X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO291dHB1dF9wdHIKKworICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtvdXRwdXRfaGVpZ2h0CisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgICAgICAgICA7IFBpdGNoIGZvciBTb3VyY2UKKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wIGZvciB1bnBhY2sKKyVpZiBBQklfSVNfMzJCSVQ9MAorICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtvdXRwdXRfd2lkdGggICAgICAgICAgICA7IFBpdGNoIGZvciBTb3VyY2UKKyVlbmRpZgorCisudW5wYWNrX2Jsb2NrMWQxNl9oNl9zc2UyX3Jvd2xvb3A6CisgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIE1NV09SRCBQVFIgW3JzaV0gICAgICAgICAgICA7IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwIC0xIC0yCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JzaSs4XSAgICAgICAgICA7IG1ha2UgY29weSBvZiB4bW0xCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDEgeHgtMSB4eC0yCisgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAKKworICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFB0ciBbcmRpXSwgICAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUHRyIFtyZGkgKyAxNl0sICAgIHhtbTMKKworICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4XQorJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQdHIgYXJnKDQpIDtbb3V0cHV0X3dpZHRoXQorJWVsc2UKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorICAgICAgICBkZWMgICAgICAgICByY3gKKyAgICAgICAgam56ICAgICAgICAgLnVucGFja19ibG9jazFkMTZfaDZfc3NlMl9yb3dsb29wICAgICAgICAgICAgICAgOyBuZXh0IHJvdworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCis7ICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIGludCAgeG9mZnNldCwKKzsgICAgaW50ICB5b2Zmc2V0LAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyAgICBpbnQgZHN0X3BpdGNoCis7KQorZXh0ZXJuIHN5bSh2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfOCkKK2dsb2JhbCBzeW0odnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9zc2UyKSBQUklWQVRFCitzeW0odnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICA7Y29uc3Qgc2hvcnQgKkhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfOFt4b2Zmc2V0XQorICAgIDtjb25zdCBzaG9ydCAqVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl84W3lvZmZzZXRdCisKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzgpKV0KKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7eG9mZnNldAorCisgICAgICAgIGNtcCAgICAgICAgIHJheCwgICAgICAgIDAgICAgICA7c2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKKyAgICAgICAgamUgICAgICAgICAgLmIxNngxNl9zcF9vbmx5CisKKyAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNQorICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggICAgO0hGaWx0ZXIKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO2RzdF9wdHIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyYXhdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIFtyYXgrMTZdCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7eW9mZnNldAorCisgICAgICAgIGNtcCAgICAgICAgIHJheCwgICAgICAgIDAgICAgICA7c2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCisgICAgICAgIGplICAgICAgICAgIC5iMTZ4MTZfZnBfb25seQorCisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKKyAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4ICAgIDtWRmlsdGVyCisKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkaStyZHgqOF0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyZHgqOF0KKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAKKworJWlmIEFCSV9JU18zMkJJVD0wCisgICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaAorJWVuZGlmCisgICAgICAgIDsgZ2V0IHRoZSBmaXJzdCBob3Jpem9udGFsIGxpbmUgZG9uZQorICAgICAgICBtb3ZkcXUgICAgICB4bW0zLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBtYWtlIGEgY29weSBvZiBjdXJyZW50IGxpbmUKKworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2CisgICAgICAgIHB1bnBja2hidyAgIHhtbTQsICAgICAgIHhtbTAKKworICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICB4bW0xCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIHhtbTEKKworICAgICAgICBtb3ZkcXUgICAgICB4bW01LCAgICAgICBbcnNpKzFdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTUKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2hidyAgIHhtbTYsICAgICAgIHhtbTAKKworICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICB4bW0yCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIHhtbTIKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICB4bW01CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIHhtbTYKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQorICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCisgICAgICAgIHBhY2t1c3diICAgIHhtbTcsICAgICAgIHhtbTQKKworICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCisubmV4dF9yb3c6CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNCwgICAgICAgeG1tMAorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgeG1tMQorCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTUsICAgICAgIFtyc2krMV0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tNQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgeG1tMAorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIHhtbTIKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgeG1tMgorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTUKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgeG1tNgorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTcKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tNworCisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgeG1tMAorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyYXhdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyYXhdCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQorICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMworICAgICAgICBwYWNrdXN3YiAgICB4bW03LCAgICAgICB4bW00CisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgW3JheCsxNl0KKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgW3JheCsxNl0KKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICB4bW01CisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIHhtbTYKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQorICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKworICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW00CisgICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCisKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQorJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDUpIDtkc3RfcGl0Y2gKKyVlbHNlCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4CislZW5kaWYKKworICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3gKKyAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93CisKKyAgICAgICAgam1wICAgICAgICAgLmRvbmUKKworLmIxNngxNl9zcF9vbmx5OgorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDt5b2Zmc2V0CisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKKyAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4ICAgIDtWRmlsdGVyCisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpIDtkc3RfcHRyCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmF4XQorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBbcmF4KzE2XQorCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmR4KjhdCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUKKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wCisKKyAgICAgICAgOyBnZXQgdGhlIGZpcnN0IGhvcml6b250YWwgbGluZSBkb25lCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTcsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJheCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKKy5uZXh0X3Jvd19zcG86CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTcKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tNworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTMKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2hidyAgIHhtbTYsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNgorICAgICAgICBwdW5wY2toYncgICB4bW00LCAgICAgICB4bW0wCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgeG1tMQorICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICB4bW0xCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIHhtbTIKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgeG1tMgorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTUKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgeG1tNgorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKworICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgO2RzdF9waXRjaAorICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3gKKyAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93X3NwbworCisgICAgICAgIGptcCAgICAgICAgIC5kb25lCisKKy5iMTZ4MTZfZnBfb25seToKKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkaStyZHgqOF0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyZHgqOF0KKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQorICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wCisKKy5uZXh0X3Jvd19mcG86CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNCwgICAgICAgeG1tMAorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgeG1tMQorCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTUsICAgICAgIFtyc2krMV0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tNQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgeG1tMAorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIHhtbTIKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgeG1tMgorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTUKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgeG1tNgorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKworICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBkc3RfcGl0Y2gKKyAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4CisgICAgICAgIGpuZSAgICAgICAgIC5uZXh0X3Jvd19mcG8KKworLmRvbmU6CisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCis7ICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIGludCAgeG9mZnNldCwKKzsgICAgaW50ICB5b2Zmc2V0LAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyAgICBpbnQgZHN0X3BpdGNoCis7KQorZ2xvYmFsIHN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9zc2UyKSBQUklWQVRFCitzeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgIHJzcCwgMTQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcmVzZXJ2ZSAxNDQgYnl0ZXMKKworICAgIDtjb25zdCBzaG9ydCAqSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl84W3hvZmZzZXRdCisgICAgO2NvbnN0IHNob3J0ICpWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzhbeW9mZnNldF0KKyAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzgpKV0KKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQorCisgICAgO1JlYWQgOS1saW5lIHVuYWxpZ25lZCBkYXRhIGluIGFuZCBwdXQgdGhlbSBvbiBzdGFjay4gVGhpcyBnaXZlcyBhIGJpZworICAgIDtwZXJmb3JtYW5jZSBib29zdC4KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgW3JzaV0KKyAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JkeCArIHJkeCoyXQorICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcnNpK3JkeF0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMiwgICAgICAgW3JzaStyZHgqMl0KKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyc2krcmR4XQorICAgICAgICBtb3ZkcXUgICAgICB4bW01LCAgICAgICBbcnNpK3JkeCoyXQorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKKyAgICAgICAgbW92ZHF1ICAgICAgeG1tNiwgICAgICAgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tNywgICAgICAgW3JzaStyZHhdCisKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcF0sICAgICAgICAgICAgeG1tMAorCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFtyc2krcmR4KjJdCisKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCsxNl0sICAgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzMyXSwgICAgICAgICB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArNDhdLCAgICAgICAgIHhtbTMKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCs2NF0sICAgICAgICAgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzgwXSwgICAgICAgICB4bW01CisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArOTZdLCAgICAgICAgIHhtbTYKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCsxMTJdLCAgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzEyOF0sICAgICAgICB4bW0wCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7eG9mZnNldAorICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1CisgICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeCAgICA7SEZpbHRlcgorCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7ZHN0X3B0cgorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmF4XQorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBbcmF4KzE2XQorCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3lvZmZzZXQKKyAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNQorICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggICAgO1ZGaWx0ZXIKKworICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo4XQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIFtyYXhdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFtyYXgrMTZdCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMAorCisgICAgICAgIDsgZ2V0IHRoZSBmaXJzdCBob3Jpem9udGFsIGxpbmUgZG9uZQorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNwXQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQorICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4CisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgeG1tMQorICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICB4bW0yCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgeG1tNAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCisgICAgICAgIGFkZCAgICAgICAgIHJzcCwgICAgICAgIDE2ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQorLm5leHRfcm93OHg4OgorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNwXSAgICAgICAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBtYWtlIGEgY29weSBvZiBjdXJyZW50IGxpbmUKKyAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOyAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOAorCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgeG1tMgorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTQKKyAgICAgICAgcG11bGx3ICAgICAgeG1tNywgICAgICAgeG1tNQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zCisKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgeG1tNgorICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICB4bW03CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tNAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW0wCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCisKKyAgICAgICAgYWRkICAgICAgICAgcnNwLCAgICAgICAgMTYgICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJkeAorCisgICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeAorICAgICAgICBqbmUgICAgICAgICAubmV4dF9yb3c4eDgKKworICAgIDthZGQgcnNwLCAxNDQKKyAgICBwb3AgcnNwCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDE2CityZDoKKyAgICB0aW1lcyA4IGR3IDB4NDAKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9zc3NlMy5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfc3NzZTMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfc3NzZTMuYXNtCkBAIC0wLDAgKzEsMTUwNyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCislZGVmaW5lIEJMT0NLX0hFSUdIVF9XSURUSCA0CislZGVmaW5lIFZQOF9GSUxURVJfV0VJR0hUIDEyOAorJWRlZmluZSBWUDhfRklMVEVSX1NISUZUICA3CisKKworOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsgTm90ZXM6IGZpbHRlcl9ibG9jazFkX2g2IGFwcGxpZXMgYSA2IHRhcCBmaWx0ZXIgaG9yaXpvbnRhbGx5IHRvIHRoZSBpbnB1dCBwaXhlbHMuIFRoZQorOyBpbnB1dCBwaXhlbCBhcnJheSBoYXMgb3V0cHV0X2hlaWdodCByb3dzLiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IG91dHB1dF9oZWlnaHQgaXMgYW4KKzsgZXZlbiBudW1iZXIuIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyA4IHBpeGVscyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiwgY2FsY3VsYXRpbmcgT05FCis7IHJvd3MgZWFjaCBpdGVyYXRpb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIDEyOCBiaXRzIG9wZXJhdGlvbnMuCis7Cis7IFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc29tZSBvZiB0aGUgU1NFIG9wdGltaXphdGlvbnMgZmlyc3Qgc2VlbiBpbiBmZnZwOAorOworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfcGl0Y2gsCis7ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAorOyAgICB1bnNpZ25lZCBpbnQgICAgdnA4X2ZpbHRlcl9pbmRleAorOykKK2dsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc3NlMykgUFJJVkFURQorc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfc3NzZTMpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdnN4ZCAgICAgIHJkeCwgRFdPUkQgUFRSIGFyZyg1KSAgIDt0YWJsZSBpbmRleAorICAgIHhvciAgICAgICAgIHJzaSwgcnNpCisgICAgc2hsICAgICAgICAgcmR4LCA0CisKKyAgICBtb3ZkcWEgICAgICB4bW03LCBbR0xPQkFMKHJkKV0KKworICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKyAgICBtb3YgICAgICAgICByZGksIGFyZygyKSAgICAgICAgICAgICA7b3V0cHV0X3B0cgorCisgICAgY21wICAgICAgICAgZXNpLCBEV09SRCBQVFIgW3JheF0KKyAgICBqZSAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g0X3Nzc2UzCisKKyAgICBtb3ZkcWEgICAgICB4bW00LCBYTU1XT1JEIFBUUiBbcmF4XSAgICAgICAgIDtrMF9rNQorICAgIG1vdmRxYSAgICAgIHhtbTUsIFhNTVdPUkQgUFRSIFtyYXgrMjU2XSAgICAgO2syX2s0CisgICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsxMjhdICAgICA7azFfazMKKworICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCisgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpICAgO3NyY19waXhlbHNfcGVyX2xpbmUKKyAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAorCisgICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpICAgO291dHB1dF9waXRjaAorCisgICAgc3ViICAgICAgICAgcmRpLCByZHgKKzt4bW0zIGZyZWUKKy5maWx0ZXJfYmxvY2sxZDhfaDZfcm93bG9vcF9zc3NlMzoKKyAgICBtb3ZxICAgICAgICB4bW0wLCAgIE1NV09SRCBQVFIgW3JzaSAtIDJdICAgIDsgLTIgLTEgIDAgIDEgIDIgIDMgIDQgIDUKKworICAgIG1vdnEgICAgICAgIHhtbTIsICAgTU1XT1JEIFBUUiBbcnNpICsgM10gICAgOyAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMAorCisgICAgcHVucGNrbGJ3ICAgeG1tMCwgICB4bW0yICAgICAgICAgICAgICAgICAgICA7IC0yICAzIC0xICA0ICAwICA1ICAxICA2ICAyICA3ICAzICA4ICA0ICA5ICA1IDEwCisKKyAgICBtb3ZkcWEgICAgICB4bW0xLCAgIHhtbTAKKyAgICBwbWFkZHVic3cgICB4bW0wLCAgIHhtbTQKKworICAgIG1vdmRxYSAgICAgIHhtbTIsICAgeG1tMQorICAgIHBzaHVmYiAgICAgIHhtbTEsICAgW0dMT0JBTChzaHVmMmJmcm9tMSldCisKKyAgICBwc2h1ZmIgICAgICB4bW0yLCAgIFtHTE9CQUwoc2h1ZjNiZnJvbTEpXQorICAgIHBtYWRkdWJzdyAgIHhtbTEsICAgeG1tNQorCisgICAgbGVhICAgICAgICAgcmRpLCAgICBbcmRpICsgcmR4XQorICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgeG1tNgorCisgICAgbGVhICAgICAgICAgcnNpLCAgICBbcnNpICsgcmF4XQorICAgIGRlYyAgICAgICAgIHJjeAorCisgICAgcGFkZHN3ICAgICAgeG1tMCwgICB4bW0xCisgICAgcGFkZHN3ICAgICAgeG1tMiwgICB4bW03CisKKyAgICBwYWRkc3cgICAgICB4bW0wLCAgIHhtbTIKKworICAgIHBzcmF3ICAgICAgIHhtbTAsICAgNworCisgICAgcGFja3Vzd2IgICAgeG1tMCwgICB4bW0wCisKKyAgICBtb3ZxICAgICAgICBNTVdPUkQgUHRyIFtyZGldLCB4bW0wCisgICAgam56ICAgICAgICAgLmZpbHRlcl9ibG9jazFkOF9oNl9yb3dsb29wX3Nzc2UzCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKwordnA4X2ZpbHRlcl9ibG9jazFkOF9oNF9zc3NlMzoKKyAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAorICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyYXgrMTI4XSAgICAgO2sxX2szCisKKyAgICBtb3ZkcWEgICAgICB4bW0zLCBYTU1XT1JEIFBUUiBbR0xPQkFMKHNodWYyYmZyb20xKV0KKyAgICBtb3ZkcWEgICAgICB4bW00LCBYTU1XT1JEIFBUUiBbR0xPQkFMKHNodWYzYmZyb20xKV0KKworICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCisKKyAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICA7c3JjX3BpeGVsc19wZXJfbGluZQorICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg0KSAgIDtvdXRwdXRfaGVpZ2h0CisKKyAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgICA7b3V0cHV0X3BpdGNoCisKKyAgICBzdWIgICAgICAgICByZGksIHJkeAorCisuZmlsdGVyX2Jsb2NrMWQ4X2g0X3Jvd2xvb3Bfc3NzZTM6CisgICAgbW92cSAgICAgICAgeG1tMCwgICBNTVdPUkQgUFRSIFtyc2kgLSAyXSAgICA7IC0yIC0xICAwICAxICAyICAzICA0ICA1CisKKyAgICBtb3ZxICAgICAgICB4bW0xLCAgIE1NV09SRCBQVFIgW3JzaSArIDNdICAgIDsgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAKKworICAgIHB1bnBja2xidyAgIHhtbTAsICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyAtMiAgMyAtMSAgNCAgMCAgNSAgMSAgNiAgMiAgNyAgMyAgOCAgNCAgOSAgNSAxMAorCisgICAgbW92ZHFhICAgICAgeG1tMiwgICB4bW0wCisgICAgcHNodWZiICAgICAgeG1tMCwgICB4bW0zCisKKyAgICBwc2h1ZmIgICAgICB4bW0yLCAgIHhtbTQKKyAgICBwbWFkZHVic3cgICB4bW0wLCAgIHhtbTUKKworICAgIGxlYSAgICAgICAgIHJkaSwgICAgW3JkaSArIHJkeF0KKyAgICBwbWFkZHVic3cgICB4bW0yLCAgIHhtbTYKKworICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KKyAgICBkZWMgICAgICAgICByY3gKKworICAgIHBhZGRzdyAgICAgIHhtbTAsICAgeG1tNworCisgICAgcGFkZHN3ICAgICAgeG1tMCwgICB4bW0yCisKKyAgICBwc3JhdyAgICAgICB4bW0wLCAgIDcKKworICAgIHBhY2t1c3diICAgIHhtbTAsICAgeG1tMAorCisgICAgbW92cSAgICAgICAgTU1XT1JEIFB0ciBbcmRpXSwgeG1tMAorCisgICAgam56ICAgICAgICAgLmZpbHRlcl9ibG9jazFkOF9oNF9yb3dsb29wX3Nzc2UzCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKzt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3Nzc2UzCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAorOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3BpdGNoLAorOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKKzsgICAgdW5zaWduZWQgaW50ICAgIHZwOF9maWx0ZXJfaW5kZXgKKzspCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3Nzc2UzKSBQUklWQVRFCitzeW0odnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdnN4ZCAgICAgIHJkeCwgRFdPUkQgUFRSIGFyZyg1KSAgICAgICAgICAgO3RhYmxlIGluZGV4CisgICAgeG9yICAgICAgICAgcnNpLCByc2kKKyAgICBzaGwgICAgICAgICByZHgsIDQgICAgICA7CisKKyAgICBsZWEgICAgICAgICByYXgsIFtHTE9CQUwoazBfazUpXQorICAgIGFkZCAgICAgICAgIHJheCwgcmR4CisKKyAgICBtb3YgICAgICAgICByZGksIGFyZygyKSAgICAgICAgICAgICAgICAgICAgIDtvdXRwdXRfcHRyCisKKyAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSAgICAgICAgICAgICAgICAgICAgIDtzcmNfcHRyCisKKyAgICBtb3ZkcWEgICAgICB4bW00LCBYTU1XT1JEIFBUUiBbcmF4XSAgICAgICAgIDtrMF9rNQorICAgIG1vdmRxYSAgICAgIHhtbTUsIFhNTVdPUkQgUFRSIFtyYXgrMjU2XSAgICAgO2syX2s0CisgICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsxMjhdICAgICA7azFfazMKKworICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIGFyZygxKSAgICAgICAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKKyAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNCkgICAgICAgICAgIDtvdXRwdXRfaGVpZ2h0CisgICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpICAgICAgICAgICA7b3V0cHV0X3BpdGNoCisKKy5maWx0ZXJfYmxvY2sxZDE2X2g2X3Jvd2xvb3Bfc3NzZTM6CisgICAgbW92cSAgICAgICAgeG1tMCwgICBNTVdPUkQgUFRSIFtyc2kgLSAyXSAgICA7IC0yIC0xICAwICAxICAyICAzICA0ICA1CisKKyAgICBtb3ZxICAgICAgICB4bW0zLCAgIE1NV09SRCBQVFIgW3JzaSArIDNdICAgIDsgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAKKworICAgIHB1bnBja2xidyAgIHhtbTAsICAgeG1tMyAgICAgICAgICAgICAgICAgICAgOyAtMiAgMyAtMSAgNCAgMCAgNSAgMSAgNiAgMiAgNyAgMyAgOCAgNCAgOSAgNSAxMAorCisgICAgbW92ZHFhICAgICAgeG1tMSwgICB4bW0wCisgICAgcG1hZGR1YnN3ICAgeG1tMCwgICB4bW00CisKKyAgICBtb3ZkcWEgICAgICB4bW0yLCAgIHhtbTEKKyAgICBwc2h1ZmIgICAgICB4bW0xLCAgIFtHTE9CQUwoc2h1ZjJiZnJvbTEpXQorCisgICAgcHNodWZiICAgICAgeG1tMiwgICBbR0xPQkFMKHNodWYzYmZyb20xKV0KKyAgICBtb3ZxICAgICAgICB4bW0zLCAgIE1NV09SRCBQVFIgW3JzaSArICA2XQorCisgICAgcG1hZGR1YnN3ICAgeG1tMSwgICB4bW01CisgICAgbW92cSAgICAgICAgeG1tNywgICBNTVdPUkQgUFRSIFtyc2kgKyAxMV0KKworICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgeG1tNgorICAgIHB1bnBja2xidyAgIHhtbTMsICAgeG1tNworCisgICAgcGFkZHN3ICAgICAgeG1tMCwgICB4bW0xCisgICAgbW92ZHFhICAgICAgeG1tMSwgICB4bW0zCisKKyAgICBwbWFkZHVic3cgICB4bW0zLCAgIHhtbTQKKyAgICBwYWRkc3cgICAgICB4bW0wLCAgIHhtbTIKKworICAgIG1vdmRxYSAgICAgIHhtbTIsICAgeG1tMQorICAgIHBhZGRzdyAgICAgIHhtbTAsICAgW0dMT0JBTChyZCldCisKKyAgICBwc2h1ZmIgICAgICB4bW0xLCAgIFtHTE9CQUwoc2h1ZjJiZnJvbTEpXQorICAgIHBzaHVmYiAgICAgIHhtbTIsICAgW0dMT0JBTChzaHVmM2Jmcm9tMSldCisKKyAgICBwc3JhdyAgICAgICB4bW0wLCAgIDcKKyAgICBwbWFkZHVic3cgICB4bW0xLCAgIHhtbTUKKworICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgeG1tNgorICAgIHBhY2t1c3diICAgIHhtbTAsICAgeG1tMAorCisgICAgbGVhICAgICAgICAgcnNpLCAgICBbcnNpICsgcmF4XQorICAgIHBhZGRzdyAgICAgIHhtbTMsICAgeG1tMQorCisgICAgcGFkZHN3ICAgICAgeG1tMywgICB4bW0yCisKKyAgICBwYWRkc3cgICAgICB4bW0zLCAgIFtHTE9CQUwocmQpXQorCisgICAgcHNyYXcgICAgICAgeG1tMywgICA3CisKKyAgICBwYWNrdXN3YiAgICB4bW0zLCAgIHhtbTMKKworICAgIHB1bnBja2xxZHEgIHhtbTAsICAgeG1tMworCisgICAgbW92ZHFhICAgICAgWE1NV09SRCBQdHIgW3JkaV0sIHhtbTAKKworICAgIGxlYSAgICAgICAgIHJkaSwgICAgW3JkaSArIHJkeF0KKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAuZmlsdGVyX2Jsb2NrMWQxNl9oNl9yb3dsb29wX3Nzc2UzCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkNF9oNl9zc3NlMworOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9waXRjaCwKKzsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCis7ICAgIHVuc2lnbmVkIGludCAgICB2cDhfZmlsdGVyX2luZGV4Cis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ0X2g2X3Nzc2UzKSBQUklWQVRFCitzeW0odnA4X2ZpbHRlcl9ibG9jazFkNF9oNl9zc3NlMyk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgbW92c3hkICAgICAgcmR4LCBEV09SRCBQVFIgYXJnKDUpICAgO3RhYmxlIGluZGV4CisgICAgeG9yICAgICAgICAgcnNpLCByc2kKKyAgICBzaGwgICAgICAgICByZHgsIDQgICAgICA7CisKKyAgICBsZWEgICAgICAgICByYXgsIFtHTE9CQUwoazBfazUpXQorICAgIGFkZCAgICAgICAgIHJheCwgcmR4CisgICAgbW92ZHFhICAgICAgeG1tNywgW0dMT0JBTChyZCldCisKKyAgICBjbXAgICAgICAgICBlc2ksIERXT1JEIFBUUiBbcmF4XQorICAgIGplICAgICAgICAgIC52cDhfZmlsdGVyX2Jsb2NrMWQ0X2g0X3Nzc2UzCisKKyAgICBtb3ZkcWEgICAgICB4bW00LCBYTU1XT1JEIFBUUiBbcmF4XSAgICAgICAgIDtrMF9rNQorICAgIG1vdmRxYSAgICAgIHhtbTUsIFhNTVdPUkQgUFRSIFtyYXgrMjU2XSAgICAgO2syX2s0CisgICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsxMjhdICAgICA7azFfazMKKworICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMikgICAgICAgICAgICAgO291dHB1dF9wdHIKKyAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICA7c3JjX3BpeGVsc19wZXJfbGluZQorICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg0KSAgIDtvdXRwdXRfaGVpZ2h0CisKKyAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgICA7b3V0cHV0X3BpdGNoCisKKzt4bW0zIGZyZWUKKy5maWx0ZXJfYmxvY2sxZDRfaDZfcm93bG9vcF9zc3NlMzoKKyAgICBtb3ZkcXUgICAgICB4bW0wLCAgIFhNTVdPUkQgUFRSIFtyc2kgLSAyXQorCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAorICAgIHBzaHVmYiAgICAgIHhtbTAsIFtHTE9CQUwoc2h1ZjFiKV0KKworICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKKyAgICBwc2h1ZmIgICAgICB4bW0xLCBbR0xPQkFMKHNodWYyYildCisgICAgcG1hZGR1YnN3ICAgeG1tMCwgeG1tNAorICAgIHBzaHVmYiAgICAgIHhtbTIsIFtHTE9CQUwoc2h1ZjNiKV0KKyAgICBwbWFkZHVic3cgICB4bW0xLCB4bW01CisKKzstLQorICAgIHBtYWRkdWJzdyAgIHhtbTIsIHhtbTYKKworICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KKzstLQorICAgIHBhZGRzdyAgICAgIHhtbTAsIHhtbTEKKyAgICBwYWRkc3cgICAgICB4bW0wLCB4bW03CisgICAgcHhvciAgICAgICAgeG1tMSwgeG1tMQorICAgIHBhZGRzdyAgICAgIHhtbTAsIHhtbTIKKyAgICBwc3JhdyAgICAgICB4bW0wLCA3CisgICAgcGFja3Vzd2IgICAgeG1tMCwgeG1tMAorCisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtyZGldLCB4bW0wCisKKyAgICBhZGQgICAgICAgICByZGksIHJkeAorICAgIGRlYyAgICAgICAgIHJjeAorICAgIGpueiAgICAgICAgIC5maWx0ZXJfYmxvY2sxZDRfaDZfcm93bG9vcF9zc3NlMworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisudnA4X2ZpbHRlcl9ibG9jazFkNF9oNF9zc3NlMzoKKyAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAorICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyYXgrMTI4XSAgICAgO2sxX2szCisgICAgbW92ZHFhICAgICAgeG1tMCwgWE1NV09SRCBQVFIgW0dMT0JBTChzaHVmMmIpXQorICAgIG1vdmRxYSAgICAgIHhtbTMsIFhNTVdPUkQgUFRSIFtHTE9CQUwoc2h1ZjNiKV0KKworICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMikgICAgICAgICAgICAgO291dHB1dF9wdHIKKyAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICA7c3JjX3BpeGVsc19wZXJfbGluZQorICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg0KSAgIDtvdXRwdXRfaGVpZ2h0CisKKyAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgICA7b3V0cHV0X3BpdGNoCisKKy5maWx0ZXJfYmxvY2sxZDRfaDRfcm93bG9vcF9zc3NlMzoKKyAgICBtb3ZkcXUgICAgICB4bW0xLCAgIFhNTVdPUkQgUFRSIFtyc2kgLSAyXQorCisgICAgbW92ZHFhICAgICAgeG1tMiwgeG1tMQorICAgIHBzaHVmYiAgICAgIHhtbTEsIHhtbTAgOztbR0xPQkFMKHNodWYyYildCisgICAgcHNodWZiICAgICAgeG1tMiwgeG1tMyA7O1tHTE9CQUwoc2h1ZjNiKV0KKyAgICBwbWFkZHVic3cgICB4bW0xLCB4bW01CisKKzstLQorICAgIHBtYWRkdWJzdyAgIHhtbTIsIHhtbTYKKworICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KKzstLQorICAgIHBhZGRzdyAgICAgIHhtbTEsIHhtbTcKKyAgICBwYWRkc3cgICAgICB4bW0xLCB4bW0yCisgICAgcHNyYXcgICAgICAgeG1tMSwgNworICAgIHBhY2t1c3diICAgIHhtbTEsIHhtbTEKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbcmRpXSwgeG1tMQorCisgICAgYWRkICAgICAgICAgcmRpLCByZHgKKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAuZmlsdGVyX2Jsb2NrMWQ0X2g0X3Jvd2xvb3Bfc3NzZTMKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NzZTMKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKKzsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAorOyAgICB1bnNpZ25lZCBpbnQgICBvdXRwdXRfaGVpZ2h0LAorOyAgICB1bnNpZ25lZCBpbnQgICB2cDhfZmlsdGVyX2luZGV4Cis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMykgUFJJVkFURQorc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3Nzc2UzKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoNSkgICA7dGFibGUgaW5kZXgKKyAgICB4b3IgICAgICAgICByc2ksIHJzaQorICAgIHNobCAgICAgICAgIHJkeCwgNCAgICAgIDsKKworICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworICAgIGNtcCAgICAgICAgIGVzaSwgRFdPUkQgUFRSIFtyYXhdCisgICAgamUgICAgICAgICAgLnZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y0X3Nzc2UzCisKKyAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUiBbcmF4XSAgICAgICAgIDtrMF9rNQorICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyYXgrMjU2XSAgICAgO2syX2s0CisgICAgbW92ZHFhICAgICAgeG1tNywgWE1NV09SRCBQVFIgW3JheCsxMjhdICAgICA7azFfazMKKworICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCisgICAgbW92c3hkICAgICAgcmR4LCBEV09SRCBQVFIgYXJnKDEpICAgO3BpeGVsc19wZXJfbGluZQorICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgIDtvdXRwdXRfcHRyCisKKyVpZiBBQklfSVNfMzJCSVQ9MAorICAgIG1vdnN4ZCAgICAgIHI4LCBEV09SRCBQVFIgYXJnKDMpICAgIDtvdXRfcGl0Y2gKKyVlbmRpZgorICAgIG1vdiAgICAgICAgIHJheCwgcnNpCisgICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgYXJnKDQpICAgO291dHB1dF9oZWlnaHQKKyAgICBhZGQgICAgICAgICByYXgsIHJkeAorCisKKy52cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlM19sb29wOgorICAgIG1vdnEgICAgICAgIHhtbTEsIE1NV09SRCBQVFIgW3JzaV0gICAgICAgICAgICAgICAgICA7QQorICAgIG1vdnEgICAgICAgIHhtbTIsIE1NV09SRCBQVFIgW3JzaSArIHJkeF0gICAgICAgICAgICA7QgorICAgIG1vdnEgICAgICAgIHhtbTMsIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdICAgICAgICA7QworICAgIG1vdnEgICAgICAgIHhtbTQsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDJdICAgICAgICA7RAorICAgIG1vdnEgICAgICAgIHhtbTAsIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdICAgICAgICA7RQorCisgICAgcHVucGNrbGJ3ICAgeG1tMiwgeG1tNCAgICAgICAgICAgICAgICAgIDtCIEQKKyAgICBwdW5wY2tsYncgICB4bW0zLCB4bW0wICAgICAgICAgICAgICAgICAgO0MgRQorCisgICAgbW92cSAgICAgICAgeG1tMCwgTU1XT1JEIFBUUiBbcmF4ICsgcmR4ICogNF0gICAgICAgIDtGCisKKyAgICBwbWFkZHVic3cgICB4bW0zLCB4bW02CisgICAgcHVucGNrbGJ3ICAgeG1tMSwgeG1tMCAgICAgICAgICAgICAgICAgIDtBIEYKKyAgICBwbWFkZHVic3cgICB4bW0yLCB4bW03CisgICAgcG1hZGR1YnN3ICAgeG1tMSwgeG1tNQorCisgICAgcGFkZHN3ICAgICAgeG1tMiwgeG1tMworICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTEKKyAgICBwYWRkc3cgICAgICB4bW0yLCBbR0xPQkFMKHJkKV0KKyAgICBwc3JhdyAgICAgICB4bW0yLCA3CisgICAgcGFja3Vzd2IgICAgeG1tMiwgeG1tMgorCisgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUiBbcmRpXSwgeG1tMiAgICAgICAgICA7c3RvcmUgdGhlIHJlc3VsdHMKKworICAgIG1vdnEgICAgICAgIHhtbTEsIE1NV09SRCBQVFIgW3JzaSArIDhdICAgICAgICAgICAgICAgICAgO0EKKyAgICBtb3ZxICAgICAgICB4bW0yLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKyA4XSAgICAgICAgICAgIDtCCisgICAgbW92cSAgICAgICAgeG1tMywgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMiArIDhdICAgICAgICA7QworICAgIG1vdnEgICAgICAgIHhtbTQsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDIgKyA4XSAgICAgICAgO0QKKyAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0ICsgOF0gICAgICAgIDtFCisKKyAgICBwdW5wY2tsYncgICB4bW0yLCB4bW00ICAgICAgICAgICAgICAgICAgO0IgRAorICAgIHB1bnBja2xidyAgIHhtbTMsIHhtbTAgICAgICAgICAgICAgICAgICA7QyBFCisKKyAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyYXggKyByZHggKiA0ICsgOF0gICAgICAgIDtGCisgICAgcG1hZGR1YnN3ICAgeG1tMywgeG1tNgorICAgIHB1bnBja2xidyAgIHhtbTEsIHhtbTAgICAgICAgICAgICAgICAgICA7QSBGCisgICAgcG1hZGR1YnN3ICAgeG1tMiwgeG1tNworICAgIHBtYWRkdWJzdyAgIHhtbTEsIHhtbTUKKworICAgIGFkZCAgICAgICAgIHJzaSwgIHJkeAorICAgIGFkZCAgICAgICAgIHJheCwgIHJkeAorOy0tCis7LS0KKyAgICBwYWRkc3cgICAgICB4bW0yLCB4bW0zCisgICAgcGFkZHN3ICAgICAgeG1tMiwgeG1tMQorICAgIHBhZGRzdyAgICAgIHhtbTIsIFtHTE9CQUwocmQpXQorICAgIHBzcmF3ICAgICAgIHhtbTIsIDcKKyAgICBwYWNrdXN3YiAgICB4bW0yLCB4bW0yCisKKyAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyZGkrOF0sIHhtbTIKKworJWlmIEFCSV9JU18zMkJJVAorICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMykgO291dF9waXRjaAorJWVsc2UKKyAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAorJWVuZGlmCisgICAgZGVjICAgICAgICAgcmN4CisgICAgam56ICAgICAgICAgLnZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3Nzc2UzX2xvb3AKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisudnA4X2ZpbHRlcl9ibG9jazFkMTZfdjRfc3NzZTM6CisgICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKKyAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMworCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKKyAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoMSkgICA7cGl4ZWxzX3Blcl9saW5lCisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMikgICAgICAgICAgICAgO291dHB1dF9wdHIKKworJWlmIEFCSV9JU18zMkJJVD0wCisgICAgbW92c3hkICAgICAgcjgsIERXT1JEIFBUUiBhcmcoMykgICAgO291dF9waXRjaAorJWVuZGlmCisgICAgbW92ICAgICAgICAgcmF4LCByc2kKKyAgICBtb3ZzeGQgICAgICByY3gsIERXT1JEIFBUUiBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAorICAgIGFkZCAgICAgICAgIHJheCwgcmR4CisKKy52cDhfZmlsdGVyX2Jsb2NrMWQxNl92NF9zc3NlM19sb29wOgorICAgIG1vdnEgICAgICAgIHhtbTIsIE1NV09SRCBQVFIgW3JzaSArIHJkeF0gICAgICAgICAgICA7QgorICAgIG1vdnEgICAgICAgIHhtbTMsIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdICAgICAgICA7QworICAgIG1vdnEgICAgICAgIHhtbTQsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDJdICAgICAgICA7RAorICAgIG1vdnEgICAgICAgIHhtbTAsIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdICAgICAgICA7RQorCisgICAgcHVucGNrbGJ3ICAgeG1tMiwgeG1tNCAgICAgICAgICAgICAgICAgIDtCIEQKKyAgICBwdW5wY2tsYncgICB4bW0zLCB4bW0wICAgICAgICAgICAgICAgICAgO0MgRQorCisgICAgcG1hZGR1YnN3ICAgeG1tMywgeG1tNgorICAgIHBtYWRkdWJzdyAgIHhtbTIsIHhtbTcKKyAgICBtb3ZxICAgICAgICB4bW01LCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKyA4XSAgICAgICAgICAgIDtCCisgICAgbW92cSAgICAgICAgeG1tMSwgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMiArIDhdICAgICAgICA7QworICAgIG1vdnEgICAgICAgIHhtbTQsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDIgKyA4XSAgICAgICAgO0QKKyAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0ICsgOF0gICAgICAgIDtFCisKKyAgICBwYWRkc3cgICAgICB4bW0yLCBbR0xPQkFMKHJkKV0KKyAgICBwYWRkc3cgICAgICB4bW0yLCB4bW0zCisgICAgcHNyYXcgICAgICAgeG1tMiwgNworICAgIHBhY2t1c3diICAgIHhtbTIsIHhtbTIKKworICAgIHB1bnBja2xidyAgIHhtbTUsIHhtbTQgICAgICAgICAgICAgICAgICA7QiBECisgICAgcHVucGNrbGJ3ICAgeG1tMSwgeG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKKworICAgIHBtYWRkdWJzdyAgIHhtbTEsIHhtbTYKKyAgICBwbWFkZHVic3cgICB4bW01LCB4bW03CisKKyAgICBtb3ZkcWEgICAgICB4bW00LCBbR0xPQkFMKHJkKV0KKyAgICBhZGQgICAgICAgICByc2ksICByZHgKKyAgICBhZGQgICAgICAgICByYXgsICByZHgKKzstLQorOy0tCisgICAgcGFkZHN3ICAgICAgeG1tNSwgeG1tMQorICAgIHBhZGRzdyAgICAgIHhtbTUsIHhtbTQKKyAgICBwc3JhdyAgICAgICB4bW01LCA3CisgICAgcGFja3Vzd2IgICAgeG1tNSwgeG1tNQorCisgICAgcHVucGNrbHFkcSAgeG1tMiwgeG1tNQorCisgICAgbW92ZHFhICAgICAgIFhNTVdPUkQgUFRSIFtyZGldLCB4bW0yCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtvdXRfcGl0Y2gKKyVlbHNlCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorICAgIGRlYyAgICAgICAgIHJjeAorICAgIGpueiAgICAgICAgIC52cDhfZmlsdGVyX2Jsb2NrMWQxNl92NF9zc3NlM19sb29wCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMworOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgc3JjX3BpdGNoLAorOyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorOyAgICB1bnNpZ25lZCBpbnQgICBvdXRfcGl0Y2gsCis7ICAgIHVuc2lnbmVkIGludCAgIG91dHB1dF9oZWlnaHQsCis7ICAgIHVuc2lnbmVkIGludCAgIHZwOF9maWx0ZXJfaW5kZXgKKzspCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3Nzc2UzKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoNSkgICA7dGFibGUgaW5kZXgKKyAgICB4b3IgICAgICAgICByc2ksIHJzaQorICAgIHNobCAgICAgICAgIHJkeCwgNCAgICAgIDsKKworICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworICAgIG1vdnN4ZCAgICAgIHJkeCwgRFdPUkQgUFRSIGFyZygxKSAgIDtwaXhlbHNfcGVyX2xpbmUKKyAgICBtb3YgICAgICAgICByZGksIGFyZygyKSAgICAgICAgICAgICA7b3V0cHV0X3B0cgorJWlmIEFCSV9JU18zMkJJVD0wCisgICAgbW92c3hkICAgICAgcjgsIERXT1JEIFBUUiBhcmcoMykgICAgOyBvdXRfcGl0Y2gKKyVlbmRpZgorICAgIG1vdnN4ZCAgICAgIHJjeCwgRFdPUkQgUFRSIGFyZyg0KSAgIDtbb3V0cHV0X2hlaWdodF0KKworICAgIGNtcCAgICAgICAgIGVzaSwgRFdPUkQgUFRSIFtyYXhdCisgICAgamUgICAgICAgICAgLnZwOF9maWx0ZXJfYmxvY2sxZDhfdjRfc3NzZTMKKworICAgIG1vdmRxYSAgICAgIHhtbTUsIFhNTVdPUkQgUFRSIFtyYXhdICAgICAgICAgO2swX2s1CisgICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKKyAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMworCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKKworICAgIG1vdiAgICAgICAgIHJheCwgcnNpCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworLnZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTNfbG9vcDoKKyAgICBtb3ZxICAgICAgICB4bW0xLCBNTVdPUkQgUFRSIFtyc2ldICAgICAgICAgICAgICAgICAgO0EKKyAgICBtb3ZxICAgICAgICB4bW0yLCBNTVdPUkQgUFRSIFtyc2kgKyByZHhdICAgICAgICAgICAgO0IKKyAgICBtb3ZxICAgICAgICB4bW0zLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICAgO0MKKyAgICBtb3ZxICAgICAgICB4bW00LCBNTVdPUkQgUFRSIFtyYXggKyByZHggKiAyXSAgICAgICAgO0QKKyAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XSAgICAgICAgO0UKKworICAgIHB1bnBja2xidyAgIHhtbTIsIHhtbTQgICAgICAgICAgICAgICAgICA7QiBECisgICAgcHVucGNrbGJ3ICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKKworICAgIG1vdnEgICAgICAgIHhtbTAsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDRdICAgICAgICA7RgorICAgIG1vdmRxYSAgICAgIHhtbTQsIFtHTE9CQUwocmQpXQorCisgICAgcG1hZGR1YnN3ICAgeG1tMywgeG1tNgorICAgIHB1bnBja2xidyAgIHhtbTEsIHhtbTAgICAgICAgICAgICAgICAgICA7QSBGCisgICAgcG1hZGR1YnN3ICAgeG1tMiwgeG1tNworICAgIHBtYWRkdWJzdyAgIHhtbTEsIHhtbTUKKyAgICBhZGQgICAgICAgICByc2ksICByZHgKKyAgICBhZGQgICAgICAgICByYXgsICByZHgKKzstLQorOy0tCisgICAgcGFkZHN3ICAgICAgeG1tMiwgeG1tMworICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTEKKyAgICBwYWRkc3cgICAgICB4bW0yLCB4bW00CisgICAgcHNyYXcgICAgICAgeG1tMiwgNworICAgIHBhY2t1c3diICAgIHhtbTIsIHhtbTIKKworICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JkaV0sIHhtbTIKKworJWlmIEFCSV9JU18zMkJJVAorICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMykgO1tvdXRfcGl0Y2hdCislZWxzZQorICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4CislZW5kaWYKKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAudnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlM19sb29wCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworLnZwOF9maWx0ZXJfYmxvY2sxZDhfdjRfc3NzZTM6CisgICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKKyAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMworICAgIG1vdmRxYSAgICAgIHhtbTUsIFtHTE9CQUwocmQpXQorCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKKworICAgIG1vdiAgICAgICAgIHJheCwgcnNpCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworLnZwOF9maWx0ZXJfYmxvY2sxZDhfdjRfc3NzZTNfbG9vcDoKKyAgICBtb3ZxICAgICAgICB4bW0yLCBNTVdPUkQgUFRSIFtyc2kgKyByZHhdICAgICAgICAgICAgO0IKKyAgICBtb3ZxICAgICAgICB4bW0zLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICAgO0MKKyAgICBtb3ZxICAgICAgICB4bW00LCBNTVdPUkQgUFRSIFtyYXggKyByZHggKiAyXSAgICAgICAgO0QKKyAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XSAgICAgICAgO0UKKworICAgIHB1bnBja2xidyAgIHhtbTIsIHhtbTQgICAgICAgICAgICAgICAgICA7QiBECisgICAgcHVucGNrbGJ3ICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKKworICAgIHBtYWRkdWJzdyAgIHhtbTMsIHhtbTYKKyAgICBwbWFkZHVic3cgICB4bW0yLCB4bW03CisgICAgYWRkICAgICAgICAgcnNpLCAgcmR4CisgICAgYWRkICAgICAgICAgcmF4LCAgcmR4Cis7LS0KKzstLQorICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTMKKyAgICBwYWRkc3cgICAgICB4bW0yLCB4bW01CisgICAgcHNyYXcgICAgICAgeG1tMiwgNworICAgIHBhY2t1c3diICAgIHhtbTIsIHhtbTIKKworICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JkaV0sIHhtbTIKKworJWlmIEFCSV9JU18zMkJJVAorICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMykgO1tvdXRfcGl0Y2hdCislZWxzZQorICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4CislZW5kaWYKKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAudnA4X2ZpbHRlcl9ibG9jazFkOF92NF9zc3NlM19sb29wCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKzt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDRfdjZfc3NzZTMKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKKzsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKzsgICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAorOyAgICB1bnNpZ25lZCBpbnQgICBvdXRwdXRfaGVpZ2h0LAorOyAgICB1bnNpZ25lZCBpbnQgICB2cDhfZmlsdGVyX2luZGV4Cis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y2X3Nzc2UzKSBQUklWQVRFCitzeW0odnA4X2ZpbHRlcl9ibG9jazFkNF92Nl9zc3NlMyk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCAgICAgICAgcnNpCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKyAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoNSkgICA7dGFibGUgaW5kZXgKKyAgICB4b3IgICAgICAgICByc2ksIHJzaQorICAgIHNobCAgICAgICAgIHJkeCwgNCAgICAgIDsKKworICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworICAgIG1vdnN4ZCAgICAgIHJkeCwgRFdPUkQgUFRSIGFyZygxKSAgIDtwaXhlbHNfcGVyX2xpbmUKKyAgICBtb3YgICAgICAgICByZGksIGFyZygyKSAgICAgICAgICAgICA7b3V0cHV0X3B0cgorJWlmIEFCSV9JU18zMkJJVD0wCisgICAgbW92c3hkICAgICAgcjgsIERXT1JEIFBUUiBhcmcoMykgICAgOyBvdXRfcGl0Y2gKKyVlbmRpZgorICAgIG1vdnN4ZCAgICAgIHJjeCwgRFdPUkQgUFRSIGFyZyg0KSAgIDtbb3V0cHV0X2hlaWdodF0KKworICAgIGNtcCAgICAgICAgIGVzaSwgRFdPUkQgUFRSIFtyYXhdCisgICAgamUgICAgICAgICAgLnZwOF9maWx0ZXJfYmxvY2sxZDRfdjRfc3NzZTMKKworICAgIG1vdnEgICAgICAgIG1tNSwgTU1XT1JEIFBUUiBbcmF4XSAgICAgICAgIDtrMF9rNQorICAgIG1vdnEgICAgICAgIG1tNiwgTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAorICAgIG1vdnEgICAgICAgIG1tNywgTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMworCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKKworICAgIG1vdiAgICAgICAgIHJheCwgcnNpCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworLnZwOF9maWx0ZXJfYmxvY2sxZDRfdjZfc3NzZTNfbG9vcDoKKyAgICBtb3ZkICAgICAgICBtbTEsIERXT1JEIFBUUiBbcnNpXSAgICAgICAgICAgICAgICAgIDtBCisgICAgbW92ZCAgICAgICAgbW0yLCBEV09SRCBQVFIgW3JzaSArIHJkeF0gICAgICAgICAgICA7QgorICAgIG1vdmQgICAgICAgIG1tMywgRFdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICAgO0MKKyAgICBtb3ZkICAgICAgICBtbTQsIERXT1JEIFBUUiBbcmF4ICsgcmR4ICogMl0gICAgICAgIDtECisgICAgbW92ZCAgICAgICAgbW0wLCBEV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdICAgICAgICA7RQorCisgICAgcHVucGNrbGJ3ICAgbW0yLCBtbTQgICAgICAgICAgICAgICAgICA7QiBECisgICAgcHVucGNrbGJ3ICAgbW0zLCBtbTAgICAgICAgICAgICAgICAgICA7QyBFCisKKyAgICBtb3ZkICAgICAgICBtbTAsIERXT1JEIFBUUiBbcmF4ICsgcmR4ICogNF0gICAgICAgIDtGCisKKyAgICBtb3ZxICAgICAgICBtbTQsIFtHTE9CQUwocmQpXQorCisgICAgcG1hZGR1YnN3ICAgbW0zLCBtbTYKKyAgICBwdW5wY2tsYncgICBtbTEsIG1tMCAgICAgICAgICAgICAgICAgIDtBIEYKKyAgICBwbWFkZHVic3cgICBtbTIsIG1tNworICAgIHBtYWRkdWJzdyAgIG1tMSwgbW01CisgICAgYWRkICAgICAgICAgcnNpLCAgcmR4CisgICAgYWRkICAgICAgICAgcmF4LCAgcmR4Cis7LS0KKzstLQorICAgIHBhZGRzdyAgICAgIG1tMiwgbW0zCisgICAgcGFkZHN3ICAgICAgbW0yLCBtbTEKKyAgICBwYWRkc3cgICAgICBtbTIsIG1tNAorICAgIHBzcmF3ICAgICAgIG1tMiwgNworICAgIHBhY2t1c3diICAgIG1tMiwgbW0yCisKKyAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW3JkaV0sIG1tMgorCislaWYgQUJJX0lTXzMyQklUCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W291dF9waXRjaF0KKyVlbHNlCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorICAgIGRlYyAgICAgICAgIHJjeAorICAgIGpueiAgICAgICAgIC52cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y2X3Nzc2UzX2xvb3AKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworLnZwOF9maWx0ZXJfYmxvY2sxZDRfdjRfc3NzZTM6CisgICAgbW92cSAgICAgICAgbW02LCBNTVdPUkQgUFRSIFtyYXgrMjU2XSAgICAgO2syX2s0CisgICAgbW92cSAgICAgICAgbW03LCBNTVdPUkQgUFRSIFtyYXgrMTI4XSAgICAgO2sxX2szCisgICAgbW92cSAgICAgICAgbW01LCBNTVdPUkQgUFRSIFtHTE9CQUwocmQpXQorCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKKworICAgIG1vdiAgICAgICAgIHJheCwgcnNpCisgICAgYWRkICAgICAgICAgcmF4LCByZHgKKworLnZwOF9maWx0ZXJfYmxvY2sxZDRfdjRfc3NzZTNfbG9vcDoKKyAgICBtb3ZkICAgICAgICBtbTIsIERXT1JEIFBUUiBbcnNpICsgcmR4XSAgICAgICAgICAgIDtCCisgICAgbW92ZCAgICAgICAgbW0zLCBEV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdICAgICAgICA7QworICAgIG1vdmQgICAgICAgIG1tNCwgRFdPUkQgUFRSIFtyYXggKyByZHggKiAyXSAgICAgICAgO0QKKyAgICBtb3ZkICAgICAgICBtbTAsIERXT1JEIFBUUiBbcnNpICsgcmR4ICogNF0gICAgICAgIDtFCisKKyAgICBwdW5wY2tsYncgICBtbTIsIG1tNCAgICAgICAgICAgICAgICAgIDtCIEQKKyAgICBwdW5wY2tsYncgICBtbTMsIG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKKworICAgIHBtYWRkdWJzdyAgIG1tMywgbW02CisgICAgcG1hZGR1YnN3ICAgbW0yLCBtbTcKKyAgICBhZGQgICAgICAgICByc2ksICByZHgKKyAgICBhZGQgICAgICAgICByYXgsICByZHgKKzstLQorOy0tCisgICAgcGFkZHN3ICAgICAgbW0yLCBtbTMKKyAgICBwYWRkc3cgICAgICBtbTIsIG1tNQorICAgIHBzcmF3ICAgICAgIG1tMiwgNworICAgIHBhY2t1c3diICAgIG1tMiwgbW0yCisKKyAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW3JkaV0sIG1tMgorCislaWYgQUJJX0lTXzMyQklUCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W291dF9waXRjaF0KKyVlbHNlCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKKyVlbmRpZgorICAgIGRlYyAgICAgICAgIHJjeAorICAgIGpueiAgICAgICAgIC52cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y0X3Nzc2UzX2xvb3AKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9zc3NlMworOygKKzsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCis7ICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIGludCAgeG9mZnNldCwKKzsgICAgaW50ICB5b2Zmc2V0LAorOyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorOyAgICBpbnQgZHN0X3BpdGNoCis7KQorZ2xvYmFsIHN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3Nzc2UzKSBQUklWQVRFCitzeW0odnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9zc3NlMyk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtHTE9CQUwodnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NzZTMpXQorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpICAgIDsgeG9mZnNldAorCisgICAgICAgIGNtcCAgICAgICAgIHJheCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgOyBza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAorICAgICAgICBqZSAgICAgICAgICAuYjE2eDE2X3NwX29ubHkKKworICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA0CisgICAgICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyYXggKyByY3hdICAgICAgICAgOyBIRmlsdGVyCisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpICAgICAgICAgICAgICA7IGRzdF9wdHIKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7IHNyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSAgICA7IGRzdF9waXRjaAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyYXhdCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHlvZmZzZXQKKworICAgICAgICBjbXAgICAgICAgICByYXgsICAgICAgICAwICAgICAgICAgICAgICAgICAgIDsgc2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCisgICAgICAgIGplICAgICAgICAgIC5iMTZ4MTZfZnBfb25seQorCisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDQKKyAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCArIHJjeF0gICAgICAgICA7IFZGaWx0ZXIKKworICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo4XQorICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmN4K3JkeCo4XQorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgIDsgc3JjX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIFtyYXhdCisKKyVpZiBBQklfSVNfMzJCSVQ9MAorICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDUpICAgIDsgZHN0X3BpdGNoCislZW5kaWYKKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFtyc2krMV0gICAgICAgICAgICAgOyAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAwMCAwMSAwMSAwMiAwMiAwMyAwMyAwNCAwNCAwNSAwNSAwNiAwNiAwNyAwNyAwOAorICAgICAgICBtb3ZxICAgICAgICB4bW00LCAgICAgICBbcnNpKzhdICAgICAgICAgICAgIDsgMDggMDkgMTAgMTEgMTIgMTMgMTQgMTUKKworICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICBbcnNpKzldICAgICAgICAgICAgIDsgMDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYKKworICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmR4XSAgICAgICAgIDsgbmV4dCBsaW5lCisKKyAgICAgICAgcG1hZGR1YnN3ICAgeG1tMywgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7IDAwIDAyIDA0IDA2IDA4IDEwIDEyIDE0CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7IDA4IDA5IDA5IDEwIDEwIDExIDExIDEyIDEyIDEzIDEzIDE0IDE0IDE1IDE1IDE2CisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTQsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgOyAwMSAwMyAwNSAwNyAwOSAxMSAxMyAxNQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgOyB4bW0zIC89IDEyOAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW00ICs9IHJvdW5kIHZhbHVlCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgOyB4bW00IC89IDEyOAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTMKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNywgICAgICAgeG1tNCAgICAgICAgICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDEwIDExIDEyIDEzIDE0IDE1CisKKy5uZXh0X3JvdzoKKyAgICAgICAgbW92cSAgICAgICAgeG1tNiwgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFtyc2krMV0gICAgICAgICAgICAgOyAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOAorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTUKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgW3JzaSs4XSAgICAgICAgICAgICA7IDA4IDA5IDEwIDExIDEyIDEzIDE0IDE1CisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgW3JzaSs5XSAgICAgICAgICAgICA7IDA5IDEwIDExIDEyIDEzIDE0IDE1IDE2CisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByZHhdICAgICAgICAgOyBuZXh0IGxpbmUKKworICAgICAgICBwbWFkZHVic3cgICB4bW02LCAgICAgICB4bW0xCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tNQorICAgICAgICBwbWFkZHVic3cgICB4bW00LCAgICAgICB4bW0xCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNiwgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTYgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNiwgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTYgLz0gMTI4CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTQgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTQgLz0gMTI4CisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNiwgICAgICAgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW03CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tNgorICAgICAgICBwbWFkZHVic3cgICB4bW01LCAgICAgICB4bW0yCisKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNywgICAgICAgeG1tNgorICAgICAgICBwbWFkZHVic3cgICB4bW03LCAgICAgICB4bW0yCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTUgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTUgLz0gMTI4CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTcgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTcgLz0gMTI4CisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNSwgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW02CisKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tNSAgICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDUpICAgIDsgZHN0X3BpdGNoCislZWxzZQorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAorJWVuZGlmCisKKyAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4CisgICAgICAgIGpuZSAgICAgICAgIC5uZXh0X3JvdworCisgICAgICAgIGptcCAgICAgICAgIC5kb25lCisKKy5iMTZ4MTZfc3Bfb25seToKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHlvZmZzZXQKKyAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNAorICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4ICsgcmN4XSAgICAgICAgIDsgVkZpbHRlcgorCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgICAgOyBkc3RfcHRyCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgOyBzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgOyBkc3RfcGl0Y2gKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsgVkZpbHRlcgorCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmR4KjhdCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfcGl4ZWxzX3Blcl9saW5lCisKKyAgICAgICAgOyBnZXQgdGhlIGZpcnN0IGhvcml6b250YWwgbGluZSBkb25lCisgICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyBsb2FkIHJvdyAwCisgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIFtyc2kgKyA4XSAgICAgICAgICAgOyBsb2FkIHJvdyAwCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICA7IG5leHQgbGluZQorLm5leHRfcm93X3NwOgorICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgbG9hZCByb3cgKyAxCisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFtyc2kgKyA4XSAgICAgICAgICAgOyBsb2FkIHJvdyArIDEKKworICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0zCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTUKKworICAgICAgICBwbWFkZHVic3cgICB4bW00LCAgICAgICB4bW0xCisgICAgICAgIG1vdnEgICAgICAgIHhtbTcsICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgOyBsb2FkIHJvdyArIDIKKworICAgICAgICBwbWFkZHVic3cgICB4bW0yLCAgICAgICB4bW0xCisgICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgIFtyc2kgKyByYXggKyA4XSAgICAgOyBsb2FkIHJvdyArIDIKKworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW03CisgICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTYKKworICAgICAgICBwbWFkZHVic3cgICB4bW0zLCAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQorCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTUsICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tMgorICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0KKworICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW00ICAgICAgICAgICAgICAgIDsgc3RvcmUgcm93IDAKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgeG1tNQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW03CisKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaSArIHJkeF0seG1tMyAgICAgICAgICAgICAgICA7IHN0b3JlIHJvdyAxCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyAyKnJheF0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW02CisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkgKyAyKnJkeF0KKworICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3gKKyAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93X3NwCisKKyAgICAgICAgam1wICAgICAgICAgLmRvbmUKKworLmIxNngxNl9mcF9vbmx5OgorICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo4XQorICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmN4K3JkeCo4XQorICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgIDsgc3JjX3BpeGVsc19wZXJfbGluZQorCisubmV4dF9yb3dfZnA6CisgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworICAgICAgICBtb3ZxICAgICAgICB4bW00LCAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDgKKworICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICB4bW00CisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIFtyc2krOF0gICAgICAgICAgICAgOyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQorCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgICAgIHhtbTEKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgW3JzaSs5XSAgICAgICAgICAgICA7IDA5IDEwIDExIDEyIDEzIDE0IDE1IDE2CisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICA7IG5leHQgbGluZQorICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW00CisKKyAgICAgICAgcG1hZGR1YnN3ICAgeG1tMywgICAgICAgeG1tMQorICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICBbcnNpXQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgIFtHTE9CQUwocmQpXQorICAgICAgICBtb3ZxICAgICAgICB4bW03LCAgICAgICBbcnNpKzFdCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNiwgICAgICAgW3JzaSs4XQorICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tNworICAgICAgICBtb3ZxICAgICAgICB4bW03LCAgICAgICBbcnNpKzldCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTUsICAgICAgIHhtbTEKKworICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUCisgICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTcKKworICAgICAgICBwYWNrdXN3YiAgICB4bW0yLCAgICAgICB4bW0zCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTYsICAgICAgIHhtbTEKKworICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW0yICAgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgIFtHTE9CQUwocmQpXQorCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkgKyByZHhdICAgICAgICAgOyBkc3RfcGl0Y2gKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTYsICAgICAgIFtHTE9CQUwocmQpXQorICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNSwgICAgICAgeG1tNgorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4XSAgICAgICAgIDsgbmV4dCBsaW5lCisKKyAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tNSAgICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgcmR4XSAgICAgICAgIDsgZHN0X3BpdGNoCisKKyAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4CisKKyAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93X2ZwCisKKy5kb25lOgorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NzZTMKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICBpbnQgIHhvZmZzZXQsCis7ICAgIGludCAgeW9mZnNldCwKKzsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKzsgICAgaW50IGRzdF9waXRjaAorOykKK2dsb2JhbCBzeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NzZTMpIFBSSVZBVEUKK3N5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9zc3NlMyk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgQUxJR05fU1RBQ0sgMTYsIHJheAorICAgIHN1YiAgICAgICAgIHJzcCwgMTQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcmVzZXJ2ZSAxNDQgYnl0ZXMKKworICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbR0xPQkFMKHZwOF9iaWxpbmVhcl9maWx0ZXJzX3Nzc2UzKV0KKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQorCisgICAgO1JlYWQgOS1saW5lIHVuYWxpZ25lZCBkYXRhIGluIGFuZCBwdXQgdGhlbSBvbiBzdGFjay4gVGhpcyBnaXZlcyBhIGJpZworICAgIDtwZXJmb3JtYW5jZSBib29zdC4KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgW3JzaV0KKyAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JkeCArIHJkeCoyXQorICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcnNpK3JkeF0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tMiwgICAgICAgW3JzaStyZHgqMl0KKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyc2krcmR4XQorICAgICAgICBtb3ZkcXUgICAgICB4bW01LCAgICAgICBbcnNpK3JkeCoyXQorICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKKyAgICAgICAgbW92ZHF1ICAgICAgeG1tNiwgICAgICAgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgeG1tNywgICAgICAgW3JzaStyZHhdCisKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcF0sICAgICAgICAgICAgeG1tMAorCisgICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFtyc2krcmR4KjJdCisKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCsxNl0sICAgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzMyXSwgICAgICAgICB4bW0yCisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArNDhdLCAgICAgICAgIHhtbTMKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCs2NF0sICAgICAgICAgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzgwXSwgICAgICAgICB4bW01CisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArOTZdLCAgICAgICAgIHhtbTYKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCsxMTJdLCAgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzEyOF0sICAgICAgICB4bW0wCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSAgICA7IHhvZmZzZXQKKyAgICAgICAgY21wICAgICAgICAgcmF4LCAgICAgICAgMCAgICAgICAgICAgICAgICAgICA7IHNraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCisgICAgICAgIGplICAgICAgICAgIC5iOHg4X3NwX29ubHkKKworICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA0CisgICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgOyBIRmlsdGVyCisKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpICAgICAgICAgICAgICA7IGRzdF9wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSAgICA7IGRzdF9waXRjaAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIFtyYXhdCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHlvZmZzZXQKKyAgICAgICAgY21wICAgICAgICAgcmF4LCAgICAgICAgMCAgICAgICAgICAgICAgICAgICA7IHNraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAorICAgICAgICBqZSAgICAgICAgICAuYjh4OF9mcF9vbmx5CisKKyAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNAorICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4ICsgcmN4XSAgICAgICAgIDsgVkZpbHRlcgorCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgW3JheF0KKworICAgICAgICA7IGdldCB0aGUgZmlyc3QgaG9yaXpvbnRhbCBsaW5lIGRvbmUKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgW3JzcF0gICAgICAgICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNSB4eAorCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDEKKyAgICAgICAgbGVhICAgICAgICAgcnNwLCAgICAgICAgW3JzcCArIDE2XSAgICAgICAgICA7IG5leHQgbGluZQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAwMCAwMSAwMSAwMiAwMiAwMyAwMyAwNCAwNCAwNSAwNSAwNiAwNiAwNyAwNyAwOAorICAgICAgICBwbWFkZHVic3cgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgMDAgMDIgMDQgMDYgMDggMTAgMTIgMTQKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQorICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tMyAvPSAxMjgKKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCisgICAgICAgIHBhY2t1c3diICAgIHhtbTcsICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQorCisubmV4dF9yb3c6CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFtyc3BdICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQorICAgICAgICBsZWEgICAgICAgICByc3AsICAgICAgICBbcnNwICsgMTZdICAgICAgICAgIDsgbmV4dCBsaW5lCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNgorCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDEKKworICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW01CisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTYsICAgICAgIHhtbTAKKworICAgICAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tNiArPSByb3VuZCB2YWx1ZQorICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tNiAvPSAxMjgKKworICAgICAgICBwYWNrdXN3YiAgICB4bW02LCAgICAgICB4bW02CisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgeG1tNgorICAgICAgICBwbWFkZHVic3cgICB4bW03LCAgICAgICB4bW0xCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTcgKz0gcm91bmQgdmFsdWUKKyAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTcgLz0gMTI4CisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tNywgICAgICAgeG1tNworCisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIHJkeF0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW02CisKKyAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4CisgICAgICAgIGpuZSAgICAgICAgIC5uZXh0X3JvdworCisgICAgICAgIGptcCAgICAgICAgIC5kb25lOHg4CisKKy5iOHg4X3NwX29ubHk6CisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgOyB5b2Zmc2V0CisgICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDQKKyAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCArIHJjeF0gICAgICAgICA7IFZGaWx0ZXIKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO2RzdF9wdHIKKyAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSAgICA7IGRzdF9waXRjaAorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIFtyYXhdICAgICAgICAgICAgICAgOyBWRmlsdGVyCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzcF0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3JzcCsxNl0KKworICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNwKzMyXQorICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0yCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JzcCs0OF0KKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgeG1tMworCisgICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArNjRdCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTQKKworICAgICAgICBtb3ZxICAgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUiBbcnNwKzgwXQorICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW01CisKKyAgICAgICAgbW92cSAgICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW3JzcCs5Nl0KKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tNgorCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTEsICAgICAgIHhtbTAKKyAgICAgICAgcG1hZGR1YnN3ICAgeG1tMiwgICAgICAgeG1tMAorCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTMsICAgICAgIHhtbTAKKyAgICAgICAgcG1hZGR1YnN3ICAgeG1tNCwgICAgICAgeG1tMAorCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTUsICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tNworCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTYsICAgICAgIHhtbTAKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgW0dMT0JBTChyZCldCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKworICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQorICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgW0dMT0JBTChyZCldCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKworICAgICAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTYsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMQorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTIsICAgICAgIHhtbTIKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tMQorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgIHhtbTMKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyZHhdLCAgeG1tMgorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTQsICAgICAgIHhtbTQKKyAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzcCsxMTJdCisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIDIqcmR4XQorICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcnNwKzEyOF0KKworICAgICAgICBwYWNrdXN3YiAgICB4bW01LCAgICAgICB4bW01CisgICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTMKKworICAgICAgICBwYWNrdXN3YiAgICB4bW02LCAgICAgICB4bW02CisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmR4XSwgIHhtbTQKKworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgMipyZHhdCisgICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgIHhtbTEKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICB4bW01CisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTcsICAgICAgIHhtbTAKKworICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JkeF0sICB4bW02CisgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTIKKworICAgICAgICBwbWFkZHVic3cgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgIFtHTE9CQUwocmQpXQorCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTcsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgW0dMT0JBTChyZCldCisKKyAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorICAgICAgICBwYWNrdXN3YiAgICB4bW03LCAgICAgICB4bW03CisKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgMipyZHhdCisKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tNworCisgICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmR4XSwgIHhtbTEKKyAgICAgICAgbGVhICAgICAgICAgcnNwLCAgICAgICAgW3JzcCArIDE0NF0KKworICAgICAgICBqbXAgICAgICAgICAuZG9uZTh4OAorCisuYjh4OF9mcF9vbmx5OgorICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo4XQorCisubmV4dF9yb3dfZnA6CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyc3BdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArMTZdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcnNwKzMyXQorCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTIsICAgICAgIDEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW3JzcCs0OF0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTQsICAgICAgIDEKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW01CisgICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgIDEKKworICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0yCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTEsICAgICAgIHhtbTAKKworICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW00CisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTMsICAgICAgIHhtbTAKKworICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW02CisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTUsICAgICAgIHhtbTAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW03CisgICAgICAgIHBzcmxkcSAgICAgIHhtbTIsICAgICAgIDEKKworICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICB4bW0yCisgICAgICAgIHBtYWRkdWJzdyAgIHhtbTcsICAgICAgIHhtbTAKKworICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXQorICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgW0dMT0JBTChyZCldCisgICAgICAgIHBzcmF3ICAgICAgIHhtbTUsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKKworICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICBbR0xPQkFMKHJkKV0KKyAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgVlA4X0ZJTFRFUl9TSElGVAorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTEKKyAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgeG1tMworCisgICAgICAgIHBhY2t1c3diICAgIHhtbTUsICAgICAgIHhtbTUKKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tMQorCisgICAgICAgIHBhY2t1c3diICAgIHhtbTcsICAgICAgIHhtbTcKKyAgICAgICAgbW92cSAgICAgICAgW3JkaStyZHhdLCAgeG1tMworCisgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkgKyAyKnJkeF0KKyAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tNQorCisgICAgICAgIGxlYSAgICAgICAgIHJzcCwgICAgICAgIFtyc3AgKyA0KjE2XQorICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JkeF0sICB4bW03CisKKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIDIqcmR4XQorICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3gKKworICAgICAgICBqbmUgICAgICAgICAubmV4dF9yb3dfZnAKKworICAgICAgICBsZWEgICAgICAgICByc3AsICAgICAgICBbcnNwICsgMTZdCisKKy5kb25lOHg4OgorICAgIDthZGQgcnNwLCAxNDQKKyAgICBwb3AgICAgICAgICByc3AKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCAgICAgICAgIHJkaQorICAgIHBvcCAgICAgICAgIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKK1NFQ1RJT05fUk9EQVRBCithbGlnbiAxNgorc2h1ZjFiOgorICAgIGRiIDAsIDUsIDEsIDYsIDIsIDcsIDMsIDgsIDQsIDksIDUsIDEwLCA2LCAxMSwgNywgMTIKK3NodWYyYjoKKyAgICBkYiAyLCA0LCAzLCA1LCA0LCA2LCA1LCA3LCA2LCA4LCA3LCA5LCA4LCAxMCwgOSwgMTEKK3NodWYzYjoKKyAgICBkYiAxLCAzLCAyLCA0LCAzLCA1LCA0LCA2LCA1LCA3LCA2LCA4LCA3LCA5LCA4LCAxMAorCithbGlnbiAxNgorc2h1ZjJiZnJvbTE6CisgICAgZGIgIDQsIDgsIDYsIDEsIDgsIDMsIDEsIDUsIDMsIDcsIDUsIDksIDcsMTEsIDksMTMKK2FsaWduIDE2CitzaHVmM2Jmcm9tMToKKyAgICBkYiAgMiwgNiwgNCwgOCwgNiwgMSwgOCwgMywgMSwgNSwgMywgNywgNSwgOSwgNywxMQorCithbGlnbiAxNgorcmQ6CisgICAgdGltZXMgOCBkdyAweDQwCisKK2FsaWduIDE2CitrMF9rNToKKyAgICB0aW1lcyA4IGRiIDAsIDAgICAgICAgICAgICAgO3BsYWNlaG9sZGVyCisgICAgdGltZXMgOCBkYiAwLCAwCisgICAgdGltZXMgOCBkYiAyLCAxCisgICAgdGltZXMgOCBkYiAwLCAwCisgICAgdGltZXMgOCBkYiAzLCAzCisgICAgdGltZXMgOCBkYiAwLCAwCisgICAgdGltZXMgOCBkYiAxLCAyCisgICAgdGltZXMgOCBkYiAwLCAwCitrMV9rMzoKKyAgICB0aW1lcyA4IGRiICAwLCAgICAwICAgICAgICAgO3BsYWNlaG9sZGVyCisgICAgdGltZXMgOCBkYiAgLTYsICAxMgorICAgIHRpbWVzIDggZGIgLTExLCAgMzYKKyAgICB0aW1lcyA4IGRiICAtOSwgIDUwCisgICAgdGltZXMgOCBkYiAtMTYsICA3NworICAgIHRpbWVzIDggZGIgIC02LCAgOTMKKyAgICB0aW1lcyA4IGRiICAtOCwgMTA4CisgICAgdGltZXMgOCBkYiAgLTEsIDEyMworazJfazQ6CisgICAgdGltZXMgOCBkYiAxMjgsICAgIDAgICAgICAgIDtwbGFjZWhvbGRlcgorICAgIHRpbWVzIDggZGIgMTIzLCAgIC0xCisgICAgdGltZXMgOCBkYiAxMDgsICAgLTgKKyAgICB0aW1lcyA4IGRiICA5MywgICAtNgorICAgIHRpbWVzIDggZGIgIDc3LCAgLTE2CisgICAgdGltZXMgOCBkYiAgNTAsICAgLTkKKyAgICB0aW1lcyA4IGRiICAzNiwgIC0xMQorICAgIHRpbWVzIDggZGIgIDEyLCAgIC02CithbGlnbiAxNgordnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NzZTM6CisgICAgdGltZXMgOCBkYiAxMjgsIDAKKyAgICB0aW1lcyA4IGRiIDExMiwgMTYKKyAgICB0aW1lcyA4IGRiIDk2LCAgMzIKKyAgICB0aW1lcyA4IGRiIDgwLCAgNDgKKyAgICB0aW1lcyA4IGRiIDY0LCAgNjQKKyAgICB0aW1lcyA4IGRiIDQ4LCAgODAKKyAgICB0aW1lcyA4IGRiIDMyLCAgOTYKKyAgICB0aW1lcyA4IGRiIDE2LCAgMTEyCisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9pbXBsX21teC5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdmFyaWFuY2VfaW1wbF9tbXguYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTIwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdmFyaWFuY2VfaW1wbF9tbXguYXNtCkBAIC0wLDAgKzEsODUxIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKzt1bnNpZ25lZCBpbnQgdnA4X2dldF9tYl9zc19tbXgoIHNob3J0ICpzcmNfcHRyICkKK2dsb2JhbCBzeW0odnA4X2dldF9tYl9zc19tbXgpIFBSSVZBVEUKK3N5bSh2cDhfZ2V0X21iX3NzX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIHN1YiAgICAgICAgIHJzcCwgOAorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJheCwgYXJnKDApIDtzcmNfcHRyCisgICAgICAgIG1vdiAgICAgICAgIHJjeCwgMTYKKyAgICAgICAgcHhvciAgICAgICAgbW00LCBtbTQKKworLk5FWFRST1c6CisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0KKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmF4KzhdCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgW3JheCsxNl0KKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBbcmF4KzI0XQorICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMAorICAgICAgICBwbWFkZHdkICAgICBtbTEsIG1tMQorICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMgorICAgICAgICBwbWFkZHdkICAgICBtbTMsIG1tMworCisgICAgICAgIHBhZGRkICAgICAgIG1tNCwgbW0wCisgICAgICAgIHBhZGRkICAgICAgIG1tNCwgbW0xCisgICAgICAgIHBhZGRkICAgICAgIG1tNCwgbW0yCisgICAgICAgIHBhZGRkICAgICAgIG1tNCwgbW0zCisKKyAgICAgICAgYWRkICAgICAgICAgcmF4LCAzMgorICAgICAgICBkZWMgICAgICAgICByY3gKKyAgICAgICAgamEgICAgICAgICAgLk5FWFRST1cKKyAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtyc3BdLCBtbTQKKworICAgICAgICA7cmV0dXJuIHN1bVswXStzdW1bMV07CisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIFtyc3BdCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIFtyc3ArNF0KKyAgICAgICAgYWRkICAgICAgICAgcmF4LCByY3gKKworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBhZGQgcnNwLCA4CisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dW5zaWduZWQgaW50IHZwOF9nZXQ4eDh2YXJfbW14Cis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCAgcmVjb25fc3RyaWRlLAorOyAgICB1bnNpZ25lZCBpbnQgKlNTRSwKKzsgICAgaW50ICpTdW0KKzspCitnbG9iYWwgc3ltKHZwOF9nZXQ4eDh2YXJfbW14KSBQUklWQVRFCitzeW0odnA4X2dldDh4OHZhcl9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICBwdXNoIHJieAorICAgIHN1YiAgICAgICAgIHJzcCwgMTYKKyAgICA7IGVuZCBwcm9sb2cKKworCisgICAgICAgIHB4b3IgICAgICAgIG1tNSwgbW01ICAgICAgICAgICAgICAgICAgICA7IEJsYW5rIG1teDYKKyAgICAgICAgcHhvciAgICAgICAgbW02LCBtbTYgICAgICAgICAgICAgICAgICAgIDsgQmxhbmsgbW14NworICAgICAgICBweG9yICAgICAgICBtbTcsIG1tNyAgICAgICAgICAgICAgICAgICAgOyBCbGFuayBtbXg3CisKKyAgICAgICAgbW92ICAgICAgICAgcmF4LCBhcmcoMCkgO1tzcmNfcHRyXSAgOyBMb2FkIGJhc2UgYWRkcmVzc2VzCisgICAgICAgIG1vdiAgICAgICAgIHJieCwgYXJnKDIpIDtbcmVmX3B0cl0KKyAgICAgICAgbW92c3hkICAgICAgcmN4LCBkd29yZCBwdHIgYXJnKDEpIDtbc291cmNlX3N0cmlkZV0KKyAgICAgICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpIDtbcmVjb25fc3RyaWRlXQorCisgICAgICAgIDsgUm93IDEKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgorICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2toYncgICBtbTMsIG1tNgorICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCisgICAgICAgIHBzdWJzdyAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICA7IEEtQiAoaGlnaCBvcmRlcikgdG8gTU0yCisKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKworICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0yLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKKyAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKKyAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKKyAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKKworCisgICAgICAgIDsgUm93IDIKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgorICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2toYncgICBtbTMsIG1tNgorICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCisgICAgICAgIHBzdWJzdyAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICA7IEEtQiAoaGlnaCBvcmRlcikgdG8gTU0yCisKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKworICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0yLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKKyAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKKyAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKKyAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKKworICAgICAgICA7IFJvdyAzCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0xICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKKyAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNraGJ3ICAgbW0zLCBtbTYKKyAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAorICAgICAgICBwc3Vic3cgICAgICBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGhpZ2ggb3JkZXIpIHRvIE1NMgorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01CisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01CisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0wLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgICAgICAgIHBtYWRkd2QgICAgIG1tMiwgbW0yICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCisgICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisKKyAgICAgICAgOyBSb3cgNAorICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAorICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcworICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcworCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02CisgICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCisgICAgICAgIHB1bnBja2hidyAgIG1tMywgbW02CisgICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKKyAgICAgICAgcHN1YnN3ICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQS1CIChoaWdoIG9yZGVyKSB0byBNTTIKKworICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQorICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQorICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQorICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIDsgUm93IDUKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgorICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2toYncgICBtbTMsIG1tNgorICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCisgICAgICAgIHBzdWJzdyAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICA7IEEtQiAoaGlnaCBvcmRlcikgdG8gTU0yCisKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKworICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0yLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKKyAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKKyAgICAgICAgOyAgICAgICAgICAgICAgbW92cSAgICAgICAgbW00LCBbcmJ4ICsgcmR4XQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIDsgUm93IDYKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKyAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKKworICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgorICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2toYncgICBtbTMsIG1tNgorICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCisgICAgICAgIHBzdWJzdyAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICA7IEEtQiAoaGlnaCBvcmRlcikgdG8gTU0yCisKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKworICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0yLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKKyAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKKyAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKKyAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKKworICAgICAgICA7IFJvdyA3CisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCisgICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0xICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCisKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKKyAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNraGJ3ICAgbW0zLCBtbTYKKyAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAorICAgICAgICBwc3Vic3cgICAgICBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGhpZ2ggb3JkZXIpIHRvIE1NMgorCisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01CisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01CisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0wLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgICAgICAgIHBtYWRkd2QgICAgIG1tMiwgbW0yICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCisgICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisKKyAgICAgICAgOyBSb3cgOAorICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAorICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcworICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcworCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02CisgICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCisgICAgICAgIHB1bnBja2hidyAgIG1tMywgbW02CisgICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKKyAgICAgICAgcHN1YnN3ICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQS1CIChoaWdoIG9yZGVyKSB0byBNTTIKKworICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQorICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQorICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIDsgTm93IGFjY3VtdWxhdGUgdGhlIGZpbmFsIHJlc3VsdHMuCisgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcnNwKzhdLCBtbTUgICAgICA7IGNvcHkgYmFjayBhY2N1bXVsYXRlZCByZXN1bHRzIGludG8gbm9ybWFsIG1lbW9yeQorICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JzcF0sIG1tNyAgICAgICAgOyBjb3B5IGJhY2sgYWNjdW11bGF0ZWQgcmVzdWx0cyBpbnRvIG5vcm1hbCBtZW1vcnkKKyAgICAgICAgbW92c3ggICAgICAgcmR4LCBXT1JEIFBUUiBbcnNwKzhdCisgICAgICAgIG1vdnN4ICAgICAgIHJjeCwgV09SRCBQVFIgW3JzcCsxMF0KKyAgICAgICAgbW92c3ggICAgICAgcmJ4LCBXT1JEIFBUUiBbcnNwKzEyXQorICAgICAgICBtb3ZzeCAgICAgICByYXgsIFdPUkQgUFRSIFtyc3ArMTRdCisgICAgICAgIGFkZCAgICAgICAgIHJkeCwgcmN4CisgICAgICAgIGFkZCAgICAgICAgIHJieCwgcmF4CisgICAgICAgIGFkZCAgICAgICAgIHJkeCwgcmJ4ICAgIDtYU3VtCisgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgRFdPUkQgUFRSIFtyc3BdCisgICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgRFdPUkQgUFRSIFtyc3ArNF0KKyAgICAgICAgYWRkICAgICAgICAgcmF4LCByY3ggICAgO1hYU3VtCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDQpIDtTU0UKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCBhcmcoNSkgO1N1bQorICAgICAgICBtb3YgICAgICAgICBkd29yZCBwdHIgW3JzaV0sIGVheAorICAgICAgICBtb3YgICAgICAgICBkd29yZCBwdHIgW3JkaV0sIGVkeAorICAgICAgICB4b3IgICAgICAgICByYXgsIHJheCAgICA7IHJldHVybiAwCisKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgYWRkIHJzcCwgMTYKKyAgICBwb3AgcmJ4CisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworCis7dW5zaWduZWQgaW50Cis7dnA4X2dldDR4NHZhcl9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCAgc291cmNlX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50ICByZWNvbl9zdHJpZGUsCis7ICAgIHVuc2lnbmVkIGludCAqU1NFLAorOyAgICBpbnQgKlN1bQorOykKK2dsb2JhbCBzeW0odnA4X2dldDR4NHZhcl9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfZ2V0NHg0dmFyX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIHB1c2ggcmJ4CisgICAgc3ViICAgICAgICAgcnNwLCAxNgorICAgIDsgZW5kIHByb2xvZworCisKKyAgICAgICAgcHhvciAgICAgICAgbW01LCBtbTUgICAgICAgICAgICAgICAgICAgIDsgQmxhbmsgbW14NgorICAgICAgICBweG9yICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgICAgICAgICAgOyBCbGFuayBtbXg3CisgICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICAgICAgICA7IEJsYW5rIG1teDcKKworICAgICAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSA7W3NyY19wdHJdICA7IExvYWQgYmFzZSBhZGRyZXNzZXMKKyAgICAgICAgbW92ICAgICAgICAgcmJ4LCBhcmcoMikgO1tyZWZfcHRyXQorICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoMSkgO1tzb3VyY2Vfc3RyaWRlXQorICAgICAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgO1tyZWNvbl9zdHJpZGVdCisKKyAgICAgICAgOyBSb3cgMQorICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAorICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQorICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgorICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCisgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01CisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCisgICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisKKworICAgICAgICA7IFJvdyAyCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02CisgICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKKyAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKKworICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQorICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQorICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIDsgUm93IDMKKyAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKKyAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAorICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCisgICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisKKyAgICAgICAgOyBSb3cgNAorICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAorCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02CisgICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKKworICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisKKyAgICAgICAgOyBOb3cgYWNjdW11bGF0ZSB0aGUgZmluYWwgcmVzdWx0cy4KKyAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtyc3ArOF0sIG1tNSAgICAgIDsgY29weSBiYWNrIGFjY3VtdWxhdGVkIHJlc3VsdHMgaW50byBub3JtYWwgbWVtb3J5CisgICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcnNwXSwgbW03ICAgICAgICA7IGNvcHkgYmFjayBhY2N1bXVsYXRlZCByZXN1bHRzIGludG8gbm9ybWFsIG1lbW9yeQorICAgICAgICBtb3ZzeCAgICAgICByZHgsIFdPUkQgUFRSIFtyc3ArOF0KKyAgICAgICAgbW92c3ggICAgICAgcmN4LCBXT1JEIFBUUiBbcnNwKzEwXQorICAgICAgICBtb3ZzeCAgICAgICByYngsIFdPUkQgUFRSIFtyc3ArMTJdCisgICAgICAgIG1vdnN4ICAgICAgIHJheCwgV09SRCBQVFIgW3JzcCsxNF0KKyAgICAgICAgYWRkICAgICAgICAgcmR4LCByY3gKKyAgICAgICAgYWRkICAgICAgICAgcmJ4LCByYXgKKyAgICAgICAgYWRkICAgICAgICAgcmR4LCByYnggICAgO1hTdW0KKyAgICAgICAgbW92c3hkICAgICAgcmF4LCBEV09SRCBQVFIgW3JzcF0KKyAgICAgICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgW3JzcCs0XQorICAgICAgICBhZGQgICAgICAgICByYXgsIHJjeCAgICA7WFhTdW0KKyAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoNCkgO1NTRQorICAgICAgICBtb3YgICAgICAgICByZGksIGFyZyg1KSA7U3VtCisgICAgICAgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbcnNpXSwgZWF4CisgICAgICAgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbcmRpXSwgZWR4CisgICAgICAgIHhvciAgICAgICAgIHJheCwgcmF4ICAgIDsgcmV0dXJuIDAKKworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBhZGQgcnNwLCAxNgorICAgIHBvcCByYngKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCisKKzt1bnNpZ25lZCBpbnQKKzt2cDhfZ2V0NHg0c3NlX2NzX21teAorOygKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgIHJlY29uX3N0cmlkZQorOykKK2dsb2JhbCBzeW0odnA4X2dldDR4NHNzZV9jc19tbXgpIFBSSVZBVEUKK3N5bSh2cDhfZ2V0NHg0c3NlX2NzX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIHB1c2ggcmJ4CisgICAgOyBlbmQgcHJvbG9nCisKKworICAgICAgICBweG9yICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgICAgICAgICAgOyBCbGFuayBtbXg3CisgICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICAgICAgICA7IEJsYW5rIG1teDcKKworICAgICAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSA7W3NyY19wdHJdICA7IExvYWQgYmFzZSBhZGRyZXNzZXMKKyAgICAgICAgbW92ICAgICAgICAgcmJ4LCBhcmcoMikgO1tyZWZfcHRyXQorICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoMSkgO1tzb3VyY2Vfc3RyaWRlXQorICAgICAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgO1tyZWNvbl9zdHJpZGVdCisgICAgICAgIDsgUm93IDEKKyAgICAgICAgbW92ZCAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgbW92ZCAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKKyAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAorICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQorICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQorICAgICAgICBtb3ZkICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIDsgUm93IDIKKyAgICAgICAgbW92ZCAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKKyAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAorICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQorICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQorICAgICAgICBtb3ZkICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIDsgUm93IDMKKyAgICAgICAgbW92ZCAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KKyAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCisgICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCisgICAgICAgIG1vdmQgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCisgICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03CisKKyAgICAgICAgOyBSb3cgNAorICAgICAgICBtb3ZkICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAorICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgorICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgorICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCisgICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNworCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgbW03ICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBzcmxxICAgICAgIG1tNywgICAgMzIKKworICAgICAgICBwYWRkZCAgICAgICBtbTAsICAgIG1tNworICAgICAgICBtb3ZxICAgICAgICByYXgsICAgIG1tMAorCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByYngKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworJWRlZmluZSBtbXhfZmlsdGVyX3NoaWZ0ICAgICAgICAgICAgNworCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsNHg0X3Zhcl9tbXgKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgc2hvcnQgKkhGaWx0ZXIsCis7ICAgIHVuc2lnbmVkIHNob3J0ICpWRmlsdGVyLAorOyAgICBpbnQgKnN1bSwKKzsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCis7KQorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsNHg0X3Zhcl9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsNHg0X3Zhcl9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgOAorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICBzdWIgICAgICAgICByc3AsIDE2CisgICAgOyBlbmQgcHJvbG9nCisKKworICAgICAgICBweG9yICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOworICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDQpIDtIRmlsdGVyICAgICAgICAgICAgIDsKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoNSkgO1ZGaWx0ZXIgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDtyZWZfcHRyICAgICAgICAgICAgICA7CisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krMV0gICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTEsICAgICAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMywgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMywgICAgICAgICAgICBbcmF4KzhdICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtHTE9CQUwobW14X2JpX3JkKV0gOworCisgICAgICAgIHBzcmF3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW14X2ZpbHRlcl9zaGlmdCAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgZHdvcmQgcHRyICBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUgICAgOworJWVsc2UKKyAgICAgICAgbW92c3hkICAgICAgICAgIHI4LCBkd29yZCBwdHIgIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7CisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksIHI4CislZW5kaWYKKworLmZpbHRlcl9ibG9jazJkX2JpbDR4NF92YXJfbW14X2xvb3A6CisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0xLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtyYXhdICAgICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTMsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbR0xPQkFMKG1teF9iaV9yZCldIDsKKworICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JkeF0gICAgICAgICAgICAgICA7CisKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcmR4KzhdICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKKworCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgW0dMT0JBTChtbXhfYmlfcmQpXSA7CisgICAgICAgIHBzcmF3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW14X2ZpbHRlcl9zaGlmdCAgICA7CisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgICAgICBbcmRpXSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMywgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3VidyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtYWRkd2QgICAgICAgICBtbTEsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lICAgIDsKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgIDsKKyVlbHNlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByOCwgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcjksICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICByOAorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIHI5CislZW5kaWYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgam56ICAgICAgICAgICAgIC5maWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teF9sb29wICAgICAgIDsKKworCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNraHdkICAgICAgIG1tMywgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTYsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNyYWQgICAgICAgICAgIG1tMiwgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JscSAgICAgICAgICAgbW00LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkZCAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDtzdW0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNykgO3N1bXNxdWFyZWQKKworICAgICAgICBtb3ZkICAgICAgICAgICAgZHdvcmQgcHRyIFtyZGldLCAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92ZCAgICAgICAgICAgIGR3b3JkIHB0ciBbcnNpXSwgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7CisKKworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBhZGQgcnNwLCAxNgorICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworCisKKzt2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teAorOygKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorOyAgICB1bnNpZ25lZCBzaG9ydCAqSEZpbHRlciwKKzsgICAgdW5zaWduZWQgc2hvcnQgKlZGaWx0ZXIsCis7ICAgIGludCAqc3VtLAorOyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKzspCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teCkgUFJJVkFURQorc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA5CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIHN1YiAgICAgICAgIHJzcCwgMTYKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBweG9yICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOworICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZyg1KSA7SEZpbHRlciAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoNikgO1ZGaWx0ZXIgICAgICAgICAgICAgOworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7cmVmX3B0ciAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7SGVpZ2h0ICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krMV0gICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKworICAgICAgICBwbXVsbHcgICAgICAgICAgbW0yLCAgICAgICAgICAgIFtyYXhdICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2hidyAgICAgICBtbTQsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7CisKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tNCwgICAgICAgICAgICBbcmF4KzhdICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtHTE9CQUwobW14X2JpX3JkKV0gOworCisgICAgICAgIHBzcmF3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW14X2ZpbHRlcl9zaGlmdCAgICA7CisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgW0dMT0JBTChtbXhfYmlfcmQpXSA7CisKKyAgICAgICAgcHNyYXcgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbXhfZmlsdGVyX3NoaWZ0ICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKKworICAgICAgICBwYWNrdXN3YiAgICAgICAgbW01LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyVlbHNlCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByOCwgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIHI4CislZW5kaWYKKworLmZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14X2xvb3A6CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgICAgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMiwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2toYncgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTQsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtHTE9CQUwobW14X2JpX3JkKV0gOworICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOworCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgW0dMT0JBTChtbXhfYmlfcmQpXSA7CisgICAgICAgIHBzcmF3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW14X2ZpbHRlcl9zaGlmdCAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2toYncgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhY2t1c3diICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMywgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tNCwgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICAgIDsKKworICAgICAgICBwbXVsbHcgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtyZHgrOF0gICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICAgICAgbW0yLCAgICAgICAgICAgIFtyZHgrOF0gICAgICAgICAgICAgOworCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbR0xPQkFMKG1teF9iaV9yZCldIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMiwgICAgICAgICAgICBbR0xPQkFMKG1teF9iaV9yZCldIDsKKworICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOworICAgICAgICBwc3JhdyAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMywgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3VidyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBwc3VidyAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtYWRkd2QgICAgICAgICBtbTEsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7CisgICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7CislZWxzZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUgICAgOworICAgICAgICBtb3ZzeGQgICAgICAgICAgcjksICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgOworICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIHI4CisgICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAgICAgcjkKKyVlbmRpZgorICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOworICAgICAgICBqbnogICAgICAgICAgICAgLmZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14X2xvb3AgICAgICAgOworCisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tod2QgICAgICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNybHEgICAgICAgICAgIG1tNiwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JhZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTQsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNykgO3N1bQorICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZyg4KSA7c3Vtc3F1YXJlZAorCisgICAgICAgIG1vdmQgICAgICAgICAgICBkd29yZCBwdHIgW3JkaV0sICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZkICAgICAgICAgICAgZHdvcmQgcHRyIFtyc2ldLCAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgYWRkIHJzcCwgMTYKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKK1NFQ1RJT05fUk9EQVRBCis7c2hvcnQgbW14X2JpX3JkWzRdID0geyA2NCwgNjQsIDY0LCA2NH07CithbGlnbiAxNgorbW14X2JpX3JkOgorICAgIHRpbWVzIDQgZHcgNjQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9pbXBsX3NzZTIuYXNtIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3ZhcmlhbmNlX2ltcGxfc3NlMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxNDMzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9pbXBsX3NzZTIuYXNtCkBAIC0wLDAgKzEsMTM1OSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCislZGVmaW5lIHhtbV9maWx0ZXJfc2hpZnQgICAgICAgICAgICA3CisKKzt1bnNpZ25lZCBpbnQgdnA4X2dldF9tYl9zc19zc2UyCis7KAorOyAgICBzaG9ydCAqc3JjX3B0cgorOykKK2dsb2JhbCBzeW0odnA4X2dldF9tYl9zc19zc2UyKSBQUklWQVRFCitzeW0odnA4X2dldF9tYl9zc19zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDEKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoIHJzaQorICAgIHB1c2ggcmRpCisgICAgc3ViICAgICAgICAgcnNwLCAxNgorICAgIDsgZW5kIHByb2xvZworCisKKyAgICAgICAgbW92ICAgICAgICAgcmF4LCBhcmcoMCkgO1tzcmNfcHRyXQorICAgICAgICBtb3YgICAgICAgICByY3gsIDgKKyAgICAgICAgcHhvciAgICAgICAgeG1tNCwgeG1tNAorCisuTkVYVFJPVzoKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgW3JheF0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgW3JheCsxNl0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgW3JheCszMl0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgW3JheCs0OF0KKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tMCwgeG1tMAorICAgICAgICBwbWFkZHdkICAgICB4bW0xLCB4bW0xCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTIsIHhtbTIKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tMywgeG1tMworCisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsIHhtbTEKKyAgICAgICAgcGFkZGQgICAgICAgeG1tMiwgeG1tMworICAgICAgICBwYWRkZCAgICAgICB4bW00LCB4bW0wCisgICAgICAgIHBhZGRkICAgICAgIHhtbTQsIHhtbTIKKworICAgICAgICBhZGQgICAgICAgICByYXgsIDB4NDAKKyAgICAgICAgZGVjICAgICAgICAgcmN4CisgICAgICAgIGphICAgICAgICAgIC5ORVhUUk9XCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMyx4bW00CisgICAgICAgIHBzcmxkcSAgICAgIHhtbTQsOAorICAgICAgICBwYWRkZCAgICAgICB4bW00LHhtbTMKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMyx4bW00CisgICAgICAgIHBzcmxkcSAgICAgIHhtbTQsNAorICAgICAgICBwYWRkZCAgICAgICB4bW00LHhtbTMKKyAgICAgICAgbW92cSAgICAgICAgcmF4LHhtbTQKKworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBhZGQgcnNwLCAxNgorICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3Vuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZ2YXJfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgICogIHNyY19wdHIsCis7ICAgIGludCAgICAgICAgICAgICBzb3VyY2Vfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICAgKiAgcmVmX3B0ciwKKzsgICAgaW50ICAgICAgICAgICAgIHJlY29uX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgaW50ICAgICogIFNTRSwKKzsgICAgaW50ICAgICAgICAgICAgICogIFN1bQorOykKK2dsb2JhbCBzeW0odnA4X2dldDE2eDE2dmFyX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZ2V0MTZ4MTZ2YXJfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2CisgICAgU0FWRV9YTU0gNworICAgIHB1c2ggcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO1tzcmNfcHRyXQorICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtbcmVmX3B0cl0KKworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgRFdPUkQgUFRSIGFyZygxKSA7W3NvdXJjZV9zdHJpZGVdCisgICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtbcmVjb25fc3RyaWRlXQorCisgICAgICAgIDsgUHJlZmV0Y2ggZGF0YQorICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICBbcmF4K3JheCoyXQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JzaV0KKyAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyc2krcmF4XQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JzaStyYXgqMl0KKyAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyc2krcmN4XQorICAgICAgICBsZWEgICAgICAgICAgICAgcmJ4LCAgICBbcnNpK3JheCo0XQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieF0KKyAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyYngrcmF4XQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieCtyYXgqMl0KKyAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyYngrcmN4XQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgIFtyZHgrcmR4KjJdCisgICAgICAgIHByZWZldGNodDAgICAgICBbcmRpXQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JkaStyZHhdCisgICAgICAgIHByZWZldGNodDAgICAgICBbcmRpK3JkeCoyXQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JkaStyY3hdCisgICAgICAgIGxlYSAgICAgICAgICAgICByYngsICAgIFtyZGkrcmR4KjRdCisgICAgICAgIHByZWZldGNodDAgICAgICBbcmJ4XQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieCtyZHhdCisgICAgICAgIHByZWZldGNodDAgICAgICBbcmJ4K3JkeCoyXQorICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieCtyY3hdCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTAgZm9yIHVucGFjaworICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tNyBmb3IgYWNjdW11bGF0aW5nIGRpZmZzCisKKyAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTYgZm9yIGFjY3VtdWxhdGluZyBzc2UKKyAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgICAgIDE2CisKKy52YXIxNmxvb3A6CisgICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQorICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaV0KKworICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JzaStyYXgqOF0KKyAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyZGkrcmR4KjhdCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTIKKworCisgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2hidyAgIHhtbTMsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNraGJ3ICAgeG1tNCwgICAgICAgICAgIHhtbTAKKworCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW00CisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tMSwgICAgICAgICAgIHhtbTEKKworICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMworICAgICAgICBwbWFkZHdkICAgICB4bW0zLCAgICAgICAgICAgeG1tMworCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW0zCisKKyAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgICAgIHJheAorICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAgICAgcmR4CisKKyAgICAgICAgc3ViICAgICAgICAgcmN4LCAgICAgICAgICAgIDEKKyAgICAgICAgam56ICAgICAgICAgLnZhcjE2bG9vcAorCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTYKKyAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTYKKworICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2tsd2QgICB4bW02LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTUsICAgICAgICAgICB4bW03CisgICAgICAgIHBzcmFkICAgICAgIHhtbTUsICAgICAgICAgICAxNgorCisgICAgICAgIHBzcmFkICAgICAgIHhtbTYsICAgICAgICAgICAxNgorICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tNQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKworICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorICAgICAgICBwdW5wY2tsZHEgICB4bW02LCAgICAgICAgICAgeG1tMAorCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICB4bW0wCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKworICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICAgICAgOAorICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICAgICAgOAorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgICAgICAgICB4bW02CisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZyg1KSA7W1N1bV0KKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg0KSA7W1NTRV0KKworICAgICAgICBtb3ZkIERXT1JEIFBUUiBbcmF4XSwgICAgICAgeG1tNworICAgICAgICBtb3ZkIERXT1JEIFBUUiBbcmRpXSwgICAgICAgeG1tMQorCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgcG9wIHJieAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKworCis7dW5zaWduZWQgaW50IHZwOF9nZXQ4eDh2YXJfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAgICogIHNyY19wdHIsCis7ICAgIGludCAgICAgICAgICAgICBzb3VyY2Vfc3RyaWRlLAorOyAgICB1bnNpZ25lZCBjaGFyICAgKiAgcmVmX3B0ciwKKzsgICAgaW50ICAgICAgICAgICAgIHJlY29uX3N0cmlkZSwKKzsgICAgdW5zaWduZWQgaW50ICAgICogIFNTRSwKKzsgICAgaW50ICAgICAgICAgICAgICogIFN1bQorOykKK2dsb2JhbCBzeW0odnA4X2dldDh4OHZhcl9zc2UyKSBQUklWQVRFCitzeW0odnA4X2dldDh4OHZhcl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIHN1YiAgICAgICAgIHJzcCwgMTYKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDtbc3JjX3B0cl0KKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7W3JlZl9wdHJdCisKKyAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgIERXT1JEIFBUUiBhcmcoMSkgO1tzb3VyY2Vfc3RyaWRlXQorICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W3JlY29uX3N0cmlkZV0KKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCisgICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW03IGZvciBhY2N1bXVsYXRpbmcgZGlmZnMKKworICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0KKworICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tMAorCisgICAgICAgIHBzdWJzdyAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tMSwgICAgICAgICAgIHhtbTEKKworICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheF0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHhdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKKworICAgICAgICBwc3Vic3cgICAgICB4bW0yLCAgICAgICAgICAgeG1tMworICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisKKworICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheCAqIDJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFJbcmRpICsgcmR4ICogMl0KKworICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tMAorICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tMAorCisgICAgICAgIHBzdWJzdyAgICAgIHhtbTIsICAgICAgICAgICB4bW0zCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKKyAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKKworCisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4ICogMl0KKyAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByZHggKiAyXQorICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheF0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHhdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKKworICAgICAgICBwc3Vic3cgICAgICB4bW0yLCAgICAgICAgICAgeG1tMworICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUltyc2kgKyByYXggKjJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFJbcmRpICsgcmR4ICoyXQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHN1YnN3ICAgICAgeG1tMiwgICAgICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTIKKworICAgICAgICBwbWFkZHdkICAgICB4bW0yLCAgICAgICAgICAgeG1tMgorICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXggKiAyXQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJkeCAqIDJdCisKKworICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheF0KKyAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHhdCisKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKKworICAgICAgICBwc3Vic3cgICAgICB4bW0yLCAgICAgICAgICAgeG1tMworICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUltyc2kgKyByYXggKjJdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFJbcmRpICsgcmR4ICoyXQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHN1YnN3ICAgICAgeG1tMiwgICAgICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTIKKworICAgICAgICBwbWFkZHdkICAgICB4bW0yLCAgICAgICAgICAgeG1tMgorICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorCisKKyAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXggKiAyXQorICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJkeCAqIDJdCisKKyAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUltyc2kgKyByYXhdCisgICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFJbcmRpICsgcmR4XQorCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHN1YnN3ICAgICAgeG1tMiwgICAgICAgICAgIHhtbTMKKyAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTIKKworICAgICAgICBwbWFkZHdkICAgICB4bW0yLCAgICAgICAgICAgeG1tMgorICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcHVucGNrbHdkICAgeG1tNiwgICAgICAgICAgIHhtbTAKKworICAgICAgICBwdW5wY2tod2QgICB4bW03LCAgICAgICAgICAgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTYsICAgICAgICAgICB4bW03CisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKworICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorICAgICAgICBwdW5wY2tsZHEgICB4bW02LCAgICAgICAgICAgeG1tMAorCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICB4bW0wCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTYsICAgICAgICAgICB4bW03CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKworICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICAgICAgOAorICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICAgICAgOAorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW02CisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZyg1KSA7W1N1bV0KKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg0KSA7W1NTRV0KKworICAgICAgICBtb3ZxICAgICAgICByZHgsICAgICAgICAgICAgeG1tNworICAgICAgICBtb3ZzeCAgICAgICByY3gsICAgICAgICAgICAgZHgKKworICAgICAgICBtb3YgIGR3b3JkIHB0ciBbcmF4XSwgICAgICAgZWN4CisgICAgICAgIG1vdmQgRFdPUkQgUFRSIFtyZGldLCAgICAgICB4bW0xCisKKyAgICA7IGJlZ2luIGVwaWxvZworICAgIGFkZCByc3AsIDE2CisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCis7ICAgIGludCAgeG9mZnNldCwKKzsgICAgaW50ICB5b2Zmc2V0LAorOyAgICBpbnQgKnN1bSwKKzsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkOzsKKzsKKzspCitnbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDkKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIHB1c2ggcmJ4CisgICAgOyBlbmQgcHJvbG9nCisKKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXSAgOyByb3VuZGluZworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICBbR0xPQkFMKHZwOF9iaWxpbmVhcl9maWx0ZXJzX3NzZTIpXQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgIDsgeG9mZnNldAorCisgICAgICAgIGNtcCAgICAgICAgICAgICByYXgsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgOyBza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAorICAgICAgICBqZSAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX3NwX29ubHkKKworICAgICAgICBzaGwgICAgICAgICAgICAgcmF4LCAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgIDsgcG9pbnQgdG8gZmlsdGVyIGNvZWZmIHdpdGggeG9mZnNldAorICAgICAgICBsZWEgICAgICAgICAgICAgcmF4LCAgICAgICAgICAgIFtyYXggKyByY3hdICAgICAgICAgIDsgSEZpbHRlcgorCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg2KSAgICAgOyB5b2Zmc2V0CisKKyAgICAgICAgY21wICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICA7IHNraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAorICAgICAgICBqZSAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX2ZwX29ubHkKKworICAgICAgICBzaGwgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDUKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICBbcmR4ICsgcmN4XSAgICAgICAgICA7IFZGaWx0ZXIKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgIDtyZWZfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpICAgICAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpICAgICA7SGVpZ2h0CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzFdICAgIDsKKworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIHhtbTEsICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMAorICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMywgICAgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdCAgICAgOworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmJ4XQorJWlmIEFCSV9JU18zMkJJVD0wCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByOSwgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZQorJWVuZGlmCisKK2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NlMl9sb29wOgorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JzaSsxXSAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBtdWxsdyAgICAgICAgICB4bW0xLCAgICAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMywgICAgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQgICAgOworCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMywgICAgICAgICAgIFtyZHhdICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMSwgICAgICAgICAgIFtyZHgrMTZdICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgOworICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQgICAgOworCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJieF0gICAgICAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQorJWVsc2UKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcjldCislZW5kaWYKKworICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOworICAgICAgICBqbnogICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX2xvb3AgICAgICAgOworCisgICAgICAgIGptcCAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKKworZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX3NwX29ubHk6CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg2KSAgICAgOyB5b2Zmc2V0CisKKyAgICAgICAgY21wICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICA7IHNraXAgYWxsIGlmIGJvdGggeG9mZnNldD0wIGFuZCB5b2Zmc2V0PTAKKyAgICAgICAgamUgICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NlMl9mdWxsX3BpeGVsCisKKyAgICAgICAgc2hsICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICA1CisgICAgICAgIGxlYSAgICAgICAgICAgICByZHgsICAgICAgICAgICAgW3JkeCArIHJjeF0gICAgICAgICAgOyBWRmlsdGVyCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCisKKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICAgOworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0KKworZmlsdGVyX2Jsb2NrMmRfYmlsX3NwX29ubHlfbG9vcDoKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zCisKKyAgICAgICAgcG11bGx3ICAgICAgICAgIHhtbTEsICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIHhtbTMsICAgICAgICAgICBbcmR4KzE2XSAgICAgICAgICAgICA7CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0ICAgIDsKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4XSAgICAgICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByYnhdICAgICAgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgam56ICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF9zcF9vbmx5X2xvb3AgICAgICAgOworCisgICAgICAgIGptcCAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKKworZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX2Z1bGxfcGl4ZWw6CisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICAgO3JlZl9wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgICAgICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgICAgIDtIZWlnaHQKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOworCitmaWx0ZXJfYmxvY2syZF9iaWxfZnVsbF9waXhlbF9sb29wOgorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0gICAgICAgICAgICAgICA7CisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4XSAgICAgICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByYnhdICAgICAgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgam56ICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF9mdWxsX3BpeGVsX2xvb3AgICAgICAgOworCisgICAgICAgIGptcCAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKKworZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX2ZwX29ubHk6CisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICAgO3JlZl9wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgICAgICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgICAgIDtIZWlnaHQKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisKK2ZpbHRlcl9ibG9jazJkX2JpbF9mcF9vbmx5X2xvb3A6CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JzaSsxXSAgICAgOworCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOworICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMSwgICAgICAgICAgIFtyYXhdICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcG11bGx3ICAgICAgICAgIHhtbTMsICAgICAgICAgICBbcmF4KzE2XSAgICAgICAgICAgICA7CisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNCAgOworICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQgICAgOworCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICA7CisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7CisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJkeF0KKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmJ4XSAgICAgICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7CisgICAgICAgIGpueiAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfZnBfb25seV9sb29wICAgICAgIDsKKworICAgICAgICBqbXAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3ZhcmlhbmNlCisKK2ZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZToKKyAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNiwgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNywgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgICAgIDgKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgICAgICA4CisKKyAgICAgICAgbW92ZHEycSAgICAgICAgIG1tMiwgICAgICAgICAgICB4bW02CisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTMsICAgICAgICAgICAgeG1tNworCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yCisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICAgICAgbW0zCisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOworICAgICAgICBwdW5wY2tod2QgICAgICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNybHEgICAgICAgICAgIG1tNiwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JhZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTQsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNykgOyBzdW0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoOCkgOyBzdW1zcXVhcmVkCisKKyAgICAgICAgbW92ZCAgICAgICAgICAgIFtyc2ldLCAgICAgICAgICBtbTIgICAgOyB4c3VtCisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgICAgICAgICAgbW00ICAgIDsgeHhzdW0KKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJieAorICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyCis7KAorOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCis7ICAgIGludCAqc3VtLAorOyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKzspCitnbG9iYWwgc3ltKHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2U4eF9oX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICBtb3ZzeGQgICAgICAgICAgcjgsIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyAgICBtb3ZzeGQgICAgICAgICAgcjksIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUKKyVlbmRpZgorCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7ICBlcnJvciBhY2N1bXVsYXRvcgorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAgc3NlIGVhY2N1bXVsYXRvcgorICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7cmVmX3B0ciAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7SGVpZ2h0ICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgIDsgIHhtbTUgPSBzMCxzMSxzMi4uczgKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JzaSsxXSAgIDsgIHhtbTMgPSBzMSxzMixzMy4uczkKKyAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgPSBhdmcoeG1tMSx4bW0zKSBob3Jpem9udGFsIGxpbmUgMQorCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7ICBuZXh0IHNvdXJjZQorJWVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgcjgKKyVlbmRpZgorCit2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF8xOgorCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICA7CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2krMV0gICA7CisgICAgICAgIHBhdmdiICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7ICB4bW0xID0gYXZnKHhtbTEseG1tMykgaG9yaXpvbnRhbCBsaW5lIGkrMQorCisgICAgICAgIHBhdmdiICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7ICB4bW0gPSB2ZXJ0aWNhbCBhdmVyYWdlIG9mIHRoZSBhYm92ZQorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tNSA9IHdvcmRzIG9mIGFib3ZlCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0gICAgIDsgIHhtbTMgPSBkMCxkMSxkMi4uZDgKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgIHhtbTMgPSB3b3JkcyBvZiBhYm92ZQorCisgICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICA7ICB4bW01IC09IHhtbTMKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTYgKz0gYWNjdW11bGF0ZWQgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW01ICo9IHhtbTUKKyAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTcgKz0gYWNjdW11bGF0ZWQgc3F1YXJlIGNvbHVtbiBkaWZmZXJlbmNlcworCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7ICBzYXZlIHhtbTEgZm9yIHVzZSBvbiB0aGUgbmV4dCByb3cKKworJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICAgICAgZXNpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUgICAgOyAgbmV4dCBzb3VyY2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIGVkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgIDsgIG5leHQgZGVzdGluYXRpb24KKyVlbHNlCisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksIHI4CisgICAgICAgIGFkZCAgICAgICAgICAgICByZGksIHI5CislZW5kaWYKKworICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOworICAgICAgICBqbnogICAgICAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTh4X2hfMSAgICAgOworCisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTYsICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTcsICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTYsICAgICAgICAgICA4CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICAgICAgOAorCisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTIsICAgICAgICAgICAgeG1tNgorICAgICAgICBtb3ZkcTJxICAgICAgICAgbW0zLCAgICAgICAgICAgIHhtbTcKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMgorICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMworCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNraHdkICAgICAgIG1tMywgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTYsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNyYWQgICAgICAgICAgIG1tMiwgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JscSAgICAgICAgICAgbW00LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkZCAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDUpIDsgc3VtCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDsgc3Vtc3F1YXJlZAorCisgICAgICAgIG1vdmQgICAgICAgICAgICBbcnNpXSwgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7CisKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorOyAgICBpbnQgKnN1bSwKKzsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCis7KQorZ2xvYmFsIHN5bSh2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMikgUFJJVkFURQorc3ltKHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7ICBlcnJvciBhY2N1bXVsYXRvcgorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAgc3NlIGVhY2N1bXVsYXRvcgorICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7cmVmX3B0ciAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7SGVpZ2h0ICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKKworICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW01LCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTMsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdCisgICAgICAgIHBhdmdiICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICA7ICB4bW01ID0gYXZnKHhtbTEseG1tMykgaG9yaXpvbnRhbCBsaW5lIDEKKworICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXhdCisKK3ZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF8xOgorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMSwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldICAgICA7CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0yLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaSsxXSAgIDsKKyAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yICAgICAgICAgICAgICAgIDsgIHhtbTEgPSBhdmcoeG1tMSx4bW0zKSBob3Jpem9udGFsIGxpbmUgaSsxCisKKyAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgIDsgIHhtbSA9IHZlcnRpY2FsIGF2ZXJhZ2Ugb2YgdGhlIGFib3ZlCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTQsICAgICAgICAgICB4bW01CisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW01ID0gd29yZHMgb2YgYWJvdmUKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIHhtbTQsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0gICAgIDsgIHhtbTMgPSBkMCxkMSxkMi4uZDcKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgIHhtbTMgPSB3b3JkcyBvZiBhYm92ZQorICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSAtPSB4bW0zCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JkaSs4XQorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTQsICAgICAgICAgICB4bW0zCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTYgKz0gYWNjdW11bGF0ZWQgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNAorICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNSAqPSB4bW01CisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW00LCAgICAgICAgICAgeG1tNAorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNyArPSBhY2N1bXVsYXRlZCBzcXVhcmUgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNAorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7ICBzYXZlIHhtbTEgZm9yIHVzZSBvbiB0aGUgbmV4dCByb3cKKworICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXhdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJkeF0KKworICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOworICAgICAgICBqbnogICAgICAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTE2eF9oXzEgICAgIDsKKworICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMQorICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNQorCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICB4bW02CisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTEsICAgICAgICAgICB4bW02CisgICAgICAgIHBzcmFkICAgICAgIHhtbTAsICAgICAgICAgICAxNgorICAgICAgICBwc3JhZCAgICAgICB4bW0xLCAgICAgICAgICAgMTYKKyAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsZHEgICB4bW02LCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgICAgICB4bW01CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW01CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICAgICAgOAorICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICAgICAgOAorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZyg1KSA7W1N1bV0KKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg2KSA7W1NTRV0KKworICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICAgeG1tMAorICAgICAgICBtb3ZkICAgICAgICBbcmRpXSwgICAgICAgeG1tNgorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorOyAgICBpbnQgKnN1bSwKKzsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCis7KQorZ2xvYmFsIHN5bSh2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKSBQUklWQVRFCitzeW0odnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworJWlmIEFCSV9JU18zMkJJVD0wCisgICAgbW92c3hkICAgICAgICAgIHI4LCBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCisgICAgbW92c3hkICAgICAgICAgIHI5LCBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCislZW5kaWYKKworICAgICAgICBweG9yICAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOyAgZXJyb3IgYWNjdW11bGF0b3IKKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsgIHNzZSBlYWNjdW11bGF0b3IKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO3JlZl9wdHIgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7c3JjX3B0ciAgICAgICAgICAgICAgOworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO0hlaWdodCAgICAgICAgICAgICAgOworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKKworICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOwordnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfMToKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgIDsgIHhtbTUgPSBzMCxzMSxzMi4uczgKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JzaStyYXhdIDsgIHhtbTMgPSBzMSxzMixzMy4uczkKKworICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSA9IGF2Zyh4bW0xLHhtbTMpCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW01ID0gd29yZHMgb2YgYWJvdmUKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgOyAgeG1tMyA9IGQwLGQxLGQyLi5kOAorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tMyA9IHdvcmRzIG9mIGFib3ZlCisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgLT0geG1tMworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNiArPSBhY2N1bXVsYXRlZCBjb2x1bW4gZGlmZmVyZW5jZXMKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTUgKj0geG1tNQorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNyArPSBhY2N1bXVsYXRlZCBzcXVhcmUgY29sdW1uIGRpZmZlcmVuY2VzCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIGVzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lICAgIDsgIG5leHQgc291cmNlCisgICAgICAgIGFkZCAgICAgICAgICAgICBlZGksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7ICBuZXh0IGRlc3RpbmF0aW9uCislZWxzZQorICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCByOAorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCByOQorJWVuZGlmCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgam56ICAgICAgICAgICAgIHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2U4eF9oXzEgICAgICAgICAgOworCisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTYsICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTcsICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTYsICAgICAgICAgICA4CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICAgICAgOAorCisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTIsICAgICAgICAgICAgeG1tNgorICAgICAgICBtb3ZkcTJxICAgICAgICAgbW0zLCAgICAgICAgICAgIHhtbTcKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMgorICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMworCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNraHdkICAgICAgIG1tMywgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTYsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNyYWQgICAgICAgICAgIG1tMiwgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JscSAgICAgICAgICAgbW00LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkZCAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDUpIDsgc3VtCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDsgc3Vtc3F1YXJlZAorCisgICAgICAgIG1vdmQgICAgICAgICAgICBbcnNpXSwgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7CisKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgorOygKKzsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKzsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorOyAgICBpbnQgKnN1bSwKKzsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCis7KQorZ2xvYmFsIHN5bSh2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMikgUFJJVkFURQorc3ltKHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7ICBlcnJvciBhY2N1bXVsYXRvcgorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAgc3NlIGVhY2N1bXVsYXRvcgorICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgO3JlZl9wdHIKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpICAgIDtIZWlnaHQKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7c3JjX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW01LCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4ICAgICAgICAgIF0KKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wCisKK3ZwOF9oYWxmX3ZlcnRfdmFyaWFuY2UxNnhfaF8xOgorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMywgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisKKyAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgPSBhdmcoeG1tMSx4bW0zKQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0wCisgICAgICAgIHB1bnBja2hidyAgICAgICB4bW00LCAgICAgICAgICAgeG1tMAorCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAorICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTIKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFIgW3JkaSs4XQorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTQsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTYgKz0gYWNjdW11bGF0ZWQgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNAorICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNSAqPSB4bW01CisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW00LCAgICAgICAgICAgeG1tNAorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNyArPSBhY2N1bXVsYXRlZCBzcXVhcmUgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNAorCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0KKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmR4XQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMQorICAgICAgICBqbnogICAgICAgICAgICAgdnA4X2hhbGZfdmVydF92YXJpYW5jZTE2eF9oXzEKKworICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMQorICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNQorCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICB4bW02CisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTEsICAgICAgICAgICB4bW02CisgICAgICAgIHBzcmFkICAgICAgIHhtbTAsICAgICAgICAgICAxNgorICAgICAgICBwc3JhZCAgICAgICB4bW0xLCAgICAgICAgICAgMTYKKyAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsZHEgICB4bW02LCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgICAgICB4bW01CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW01CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICAgICAgOAorICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICAgICAgOAorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZyg1KSA7W1N1bV0KKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg2KSA7W1NTRV0KKworICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICAgeG1tMAorICAgICAgICBtb3ZkICAgICAgICBbcmRpXSwgICAgICAgeG1tNgorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO3ZvaWQgdnA4X2hhbGZfaG9yaXpfdmFyaWFuY2U4eF9oX3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgaW50IEhlaWdodCwKKzsgICAgaW50ICpzdW0sCis7ICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorOykKK2dsb2JhbCBzeW0odnA4X2hhbGZfaG9yaXpfdmFyaWFuY2U4eF9oX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworJWlmIEFCSV9JU18zMkJJVD0wCisgICAgbW92c3hkICAgICAgICAgIHI4LCBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCisgICAgbW92c3hkICAgICAgICAgIHI5LCBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCislZW5kaWYKKworICAgICAgICBweG9yICAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOyAgZXJyb3IgYWNjdW11bGF0b3IKKyAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsgIHNzZSBlYWNjdW11bGF0b3IKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO3JlZl9wdHIgICAgICAgICAgICAgIDsKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7c3JjX3B0ciAgICAgICAgICAgICAgOworICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO0hlaWdodCAgICAgICAgICAgICAgOworCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7Cit2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfMToKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgIDsgIHhtbTUgPSBzMCxzMSxzMi4uczgKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JzaSsxXSAgIDsgIHhtbTMgPSBzMSxzMixzMy4uczkKKworICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSA9IGF2Zyh4bW0xLHhtbTMpCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW01ID0gd29yZHMgb2YgYWJvdmUKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgOyAgeG1tMyA9IGQwLGQxLGQyLi5kOAorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tMyA9IHdvcmRzIG9mIGFib3ZlCisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgLT0geG1tMworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNiArPSBhY2N1bXVsYXRlZCBjb2x1bW4gZGlmZmVyZW5jZXMKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTUgKj0geG1tNQorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNyArPSBhY2N1bXVsYXRlZCBzcXVhcmUgY29sdW1uIGRpZmZlcmVuY2VzCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIGVzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lICAgIDsgIG5leHQgc291cmNlCisgICAgICAgIGFkZCAgICAgICAgICAgICBlZGksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7ICBuZXh0IGRlc3RpbmF0aW9uCislZWxzZQorICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCByOAorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCByOQorJWVuZGlmCisgICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7CisgICAgICAgIGpueiAgICAgICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfMSAgICAgICAgOworCisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTYsICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTcsICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTYsICAgICAgICAgICA4CisgICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICAgICAgOAorCisgICAgICAgIG1vdmRxMnEgICAgICAgICBtbTIsICAgICAgICAgICAgeG1tNgorICAgICAgICBtb3ZkcTJxICAgICAgICAgbW0zLCAgICAgICAgICAgIHhtbTcKKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMgorICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMworCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7CisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgcHVucGNraHdkICAgICAgIG1tMywgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOworICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHBzcmxxICAgICAgICAgICBtbTYsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7CisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgcHNyYWQgICAgICAgICAgIG1tMiwgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKKworICAgICAgICBwc3JscSAgICAgICAgICAgbW00LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOworICAgICAgICBwYWRkZCAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDUpIDsgc3VtCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDsgc3Vtc3F1YXJlZAorCisgICAgICAgIG1vdmQgICAgICAgICAgICBbcnNpXSwgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7CisgICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7CisKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7dm9pZCB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgaW50IEhlaWdodCwKKzsgICAgaW50ICpzdW0sCis7ICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorOykKK2dsb2JhbCBzeW0odnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyKSBQUklWQVRFCitzeW0odnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7ICBlcnJvciBhY2N1bXVsYXRvcgorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAgc3NlIGVhY2N1bXVsYXRvcgorICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7cmVmX3B0ciAgICAgICAgICAgICAgOworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7SGVpZ2h0ICAgICAgICAgICAgICA7CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKKworICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOworCit2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oXzE6CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW01LCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0gICAgIDsgIHhtbTUgPSBzMCxzMSxzMi4uczE1CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0zLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaSsxXSAgIDsgIHhtbTMgPSBzMSxzMixzMy4uczE2CisKKyAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgPSBhdmcoeG1tMSx4bW0zKQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgIHhtbTUgPSB3b3JkcyBvZiBhYm92ZQorICAgICAgICBwdW5wY2toYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgOyAgeG1tMyA9IGQwLGQxLGQyLi5kNworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tMyA9IHdvcmRzIG9mIGFib3ZlCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGkrOF0KKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgLT0geG1tMworICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTYgKz0gYWNjdW11bGF0ZWQgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMQorICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNSAqPSB4bW01CisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMQorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNyArPSBhY2N1bXVsYXRlZCBzcXVhcmUgY29sdW1uIGRpZmZlcmVuY2VzCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMQorCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0KKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmR4XQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7CisgICAgICAgIGpueiAgICAgICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oXzEgICAgICAgIDsKKworICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMQorICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNQorCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICB4bW02CisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTEsICAgICAgICAgICB4bW02CisgICAgICAgIHBzcmFkICAgICAgIHhtbTAsICAgICAgICAgICAxNgorICAgICAgICBwc3JhZCAgICAgICB4bW0xLCAgICAgICAgICAgMTYKKyAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNworICAgICAgICBwdW5wY2tsZHEgICB4bW02LCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tNworCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgICAgICB4bW01CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW01CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKworICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICAgICAgOAorICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICAgICAgOAorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZyg1KSA7W1N1bV0KKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg2KSA7W1NTRV0KKworICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICAgeG1tMAorICAgICAgICBtb3ZkICAgICAgICBbcmRpXSwgICAgICAgeG1tNgorCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKK1NFQ1RJT05fUk9EQVRBCis7ICAgIHNob3J0IHhtbV9iaV9yZFs4XSA9IHsgNjQsIDY0LCA2NCwgNjQsNjQsIDY0LCA2NCwgNjR9OworYWxpZ24gMTYKK3htbV9iaV9yZDoKKyAgICB0aW1lcyA4IGR3IDY0CithbGlnbiAxNgordnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NlMjoKKyAgICBkdyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgZHcgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgIGR3IDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyCisgICAgZHcgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgKKyAgICBkdyA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NAorICAgIGR3IDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwCisgICAgZHcgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYKKyAgICBkdyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdmFyaWFuY2VfaW1wbF9zc3NlMy5hc20gYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdmFyaWFuY2VfaW1wbF9zc3NlMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2YjRhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9pbXBsX3Nzc2UzLmFzbQpAQCAtMCwwICsxLDM2NCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCislZGVmaW5lIHhtbV9maWx0ZXJfc2hpZnQgICAgICAgICAgICA3CisKKworO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTMKKzsoCis7ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCis7ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKzsgICAgdW5zaWduZWQgaW50IEhlaWdodCwKKzsgICAgaW50ICB4b2Zmc2V0LAorOyAgICBpbnQgIHlvZmZzZXQsCis7ICAgIGludCAqc3VtLAorOyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQ7OworOworOykKKztOb3RlOiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50IGF0IG9mZnNldD0wIGlzIDEyOC4gU2luY2UgdGhlIHNlY29uZCByZWdpc3RlcgorO2ZvciBQbWFkZHVic3cgaXMgc2lnbmVkIGJ5dGVzLCB3ZSBtdXN0IGNhbGN1bGF0ZSB6ZXJvIG9mZnNldCBzZXBlcmF0ZWx5LgorZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlMykgUFJJVkFURQorc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDkKKyAgICBTQVZFX1hNTSA3CisgICAgR0VUX0dPVCAgICAgcmJ4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNgorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcKKworICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIFtHTE9CQUwodnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NzZTMpXQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgIDsgeG9mZnNldAorCisgICAgICAgIGNtcCAgICAgICAgICAgICByYXgsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgOyBza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAorICAgICAgICBqZSAgICAgICAgICAgICAgLmZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTNfc3Bfb25seQorCisgICAgICAgIHNobCAgICAgICAgICAgICByYXgsICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgOyBwb2ludCB0byBmaWx0ZXIgY29lZmYgd2l0aCB4b2Zmc2V0CisgICAgICAgIGxlYSAgICAgICAgICAgICByYXgsICAgICAgICAgICAgW3JheCArIHJjeF0gICAgICAgICAgOyBIRmlsdGVyCisKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDYpICAgICA7IHlvZmZzZXQKKworICAgICAgICBjbXAgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIDsgc2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCisgICAgICAgIGplICAgICAgICAgICAgICAuZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19mcF9vbmx5CisKKyAgICAgICAgc2hsICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICA0CisgICAgICAgIGxlYSAgICAgICAgICAgICByZHgsICAgICAgICAgICAgW3JkeCArIHJjeF0gICAgICAgICAgOyBWRmlsdGVyCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgorICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCisgICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAorCisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0wLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAorCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQorICAgICAgICBwdW5wY2toYncgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKKyAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTAsICAgICAgICAgICBbcmF4XQorICAgICAgICBwbWFkZHVic3cgICAgICAgeG1tMiwgICAgICAgICAgIFtyYXhdCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQorICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQKKyAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0CisKKyAgICAgICAgcGFja3Vzd2IgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0yCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCislZWxzZQorICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgbW92c3hkICAgICAgICAgIHI5LCAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHI4XQorJWVuZGlmCisKKy5maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzX2xvb3A6CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTIsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorICAgICAgICBwdW5wY2toYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTIKKyAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTEsICAgICAgICAgICBbcmF4XQorICAgICAgICBwbWFkZHVic3cgICAgICAgeG1tMywgICAgICAgICAgIFtyYXhdCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0zLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQorICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQKKyAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0CisgICAgICAgIHBhY2t1c3diICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMworCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCisgICAgICAgIHB1bnBja2hidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMQorICAgICAgICBwbWFkZHVic3cgICAgICAgeG1tMiwgICAgICAgICAgIFtyZHhdCisgICAgICAgIHBtYWRkdWJzdyAgICAgICB4bW0zLCAgICAgICAgICAgW3JkeF0KKworICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMiwgICAgICAgICAgIFtHTE9CQUwoeG1tX2JpX3JkKV0KKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldCisgICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdAorICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQKKworICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXQorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTQKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW00CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW01LCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGkrOF0KKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW00CisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCisgICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTIKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0zCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMgorICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbTMKKyAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMworCislaWYgQUJJX0lTXzMyQklUCisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQorJWVsc2UKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcjhdCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHI5XQorJWVuZGlmCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxCisgICAgICAgIGpueiAgICAgICAgICAgICAuZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19sb29wCisKKyAgICAgICAgam1wICAgICAgICAgICAgIC5maWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKKworLmZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTNfc3Bfb25seToKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDYpICAgICA7IHlvZmZzZXQKKworICAgICAgICBjbXAgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIDsgQm90aCB4b2Zmc2V0ID0wIGFuZCB5b2Zmc2V0PTAKKyAgICAgICAgamUgICAgICAgICAgICAgIC5maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzX2Z1bGxfcGl4ZWwKKworICAgICAgICBzaGwgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDQKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICBbcmR4ICsgcmN4XSAgICAgICAgICA7IFZGaWx0ZXIKKworICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgIDtyZWZfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpICAgICAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpICAgICA7SGVpZ2h0CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKKworICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMSwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQorCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgbW92c3hkICAgICAgICAgIHI5LCAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCislZW5kaWYKKworICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXhdCisKKy5maWx0ZXJfYmxvY2syZF9iaWxfc3Bfb25seV9sb29wOgorICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMywgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTMKKworICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMKKyAgICAgICAgcHVucGNraGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0zCisgICAgICAgIHBtYWRkdWJzdyAgICAgICB4bW0xLCAgICAgICAgICAgW3JkeF0KKyAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTIsICAgICAgICAgICBbcmR4XQorCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMiwgICAgICAgICAgIFtHTE9CQUwoeG1tX2JpX3JkKV0KKyAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0CisgICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdAorCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW00LCAgICAgICAgICAgeG1tNAorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgICAgICBRV09SRCBQVFIgW3JkaSs4XQorICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTQKKworICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW01CisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTIKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMgorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEKKyAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0wCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKKworJWlmIEFCSV9JU18zMkJJVAorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCislZWxzZQorICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByOV0KKyVlbmRpZgorCisgICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMQorICAgICAgICBqbnogICAgICAgICAgICAgLmZpbHRlcl9ibG9jazJkX2JpbF9zcF9vbmx5X2xvb3AKKworICAgICAgICBqbXAgICAgICAgICAgICAgLmZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZQorCisuZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19mdWxsX3BpeGVsOgorICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgIDtyZWZfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpICAgICAgICAgICAgICAgO3NyY19wdHIKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpICAgICA7SGVpZ2h0CisgICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQorICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAKKworLmZpbHRlcl9ibG9jazJkX2JpbF9mdWxsX3BpeGVsX2xvb3A6CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzhdCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAorCisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMAorICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNCwgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW00LCAgICAgICAgICAgeG1tMAorCisgICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMworICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTQKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMgorICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMQorICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTIKKworICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCisgICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJkeF0gICAgICAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxCisgICAgICAgIGpueiAgICAgICAgICAgICAuZmlsdGVyX2Jsb2NrMmRfYmlsX2Z1bGxfcGl4ZWxfbG9vcAorCisgICAgICAgIGptcCAgICAgICAgICAgICAuZmlsdGVyX2Jsb2NrMmRfYmlsX3ZhcmlhbmNlCisKKy5maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzX2ZwX29ubHk6CisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICAgO3JlZl9wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgICAgICAgICAgICAgICA7c3JjX3B0cgorICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgICAgIDtIZWlnaHQKKyAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQorCisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMAorCislaWYgQUJJX0lTXzMyQklUPTAKKyAgICAgICAgbW92c3hkICAgICAgICAgIHI5LCAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCislZW5kaWYKKworLmZpbHRlcl9ibG9jazJkX2JpbF9mcF9vbmx5X2xvb3A6CisgICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KKyAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTIsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHB1bnBja2xidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgorICAgICAgICBwdW5wY2toYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTIKKyAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTEsICAgICAgICAgICBbcmF4XQorICAgICAgICBwbWFkZHVic3cgICAgICAgeG1tMywgICAgICAgICAgIFtyYXhdCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldCisgICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0zLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQorICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQKKyAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTIsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXQorICAgICAgICBweG9yICAgICAgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTQKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW00CisgICAgICAgIG1vdnEgICAgICAgICAgICB4bW01LCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGkrOF0KKyAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW00CisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisgICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTEKKyAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0zCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMQorICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbTMKKyAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMworCisgICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJkeF0KKyVpZiBBQklfSVNfMzJCSVQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQorJWVsc2UKKyAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcjldCislZW5kaWYKKworICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEKKyAgICAgICAgam56ICAgICAgICAgICAgIC5maWx0ZXJfYmxvY2syZF9iaWxfZnBfb25seV9sb29wCisKKyAgICAgICAgam1wICAgICAgICAgICAgIC5maWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKKworLmZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZToKKyAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEKKyAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUKKworICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICAgICAgeG1tNgorICAgICAgICBwdW5wY2tod2QgICB4bW0xLCAgICAgICAgICAgeG1tNgorICAgICAgICBwc3JhZCAgICAgICB4bW0wLCAgICAgICAgICAgMTYKKyAgICAgICAgcHNyYWQgICAgICAgeG1tMSwgICAgICAgICAgIDE2CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKKyAgICAgICAgcHVucGNrbGRxICAgeG1tNiwgICAgICAgICAgIHhtbTUKKyAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTUKKyAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKKworICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgeG1tNQorICAgICAgICBwdW5wY2toZHEgICB4bW0xLCAgICAgICAgICAgeG1tNQorICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW02CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHNybGRxICAgICAgeG1tNywgICAgICAgICAgIDgKKyAgICAgICAgcHNybGRxICAgICAgeG1tMSwgICAgICAgICAgIDgKKworICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tNworICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNykgO1tTdW1dCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoOCkgO1tTU0VdCisKKyAgICAgICAgbW92ZCAgICAgICAgW3JzaV0sICAgICAgIHhtbTAKKyAgICAgICAgbW92ZCAgICAgICAgW3JkaV0sICAgICAgIHhtbTYKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKK1NFQ1RJT05fUk9EQVRBCithbGlnbiAxNgoreG1tX2JpX3JkOgorICAgIHRpbWVzIDggZHcgNjQKK2FsaWduIDE2Cit2cDhfYmlsaW5lYXJfZmlsdGVyc19zc3NlMzoKKyAgICB0aW1lcyA4IGRiIDEyOCwgMAorICAgIHRpbWVzIDggZGIgMTEyLCAxNgorICAgIHRpbWVzIDggZGIgOTYsICAzMgorICAgIHRpbWVzIDggZGIgODAsICA0OAorICAgIHRpbWVzIDggZGIgNjQsICA2NAorICAgIHRpbWVzIDggZGIgNDgsICA4MAorICAgIHRpbWVzIDggZGIgMzIsICA5NgorICAgIHRpbWVzIDggZGIgMTYsICAxMTIKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9tbXguYyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRkZDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3ZhcmlhbmNlX21teC5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi92YXJpYW5jZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcHJhZ21hcy5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3g4Ni9maWx0ZXJfeDg2LmgiCisKK2V4dGVybiB2b2lkIGZpbHRlcl9ibG9jazFkX2g2X21teAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKKyAgICBzaG9ydCAqZmlsdGVyCispOworZXh0ZXJuIHZvaWQgZmlsdGVyX2Jsb2NrMWRfdjZfbW14CisoCisgICAgY29uc3Qgc2hvcnQgKnNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfd2lkdGgsCisgICAgc2hvcnQgKmZpbHRlcgorKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0X21iX3NzX21teChjb25zdCBzaG9ydCAqc3JjX3B0cik7CitleHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXQ4eDh2YXJfbW14CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKlNTRSwKKyAgICBpbnQgKlN1bQorKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDR4NHZhcl9tbXgKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc291cmNlX3N0cmlkZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCAgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqU1NFLAorICAgIGludCAqU3VtCispOworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbDR4NF92YXJfbW14CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLAorICAgIGNvbnN0IHNob3J0ICpWRmlsdGVyLAorICAgIGludCAqc3VtLAorICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorKTsKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLAorICAgIGNvbnN0IHNob3J0ICpWRmlsdGVyLAorICAgIGludCAqc3VtLAorICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorKTsKKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlNHg0X21teCgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc291cmNlX3N0cmlkZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCAgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqc3NlKQoreworICAgIHVuc2lnbmVkIGludCB2YXI7CisgICAgaW50IGF2ZzsKKworICAgIHZwOF9nZXQ0eDR2YXJfbW14KHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgJnZhciwgJmF2ZykgOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA0KSk7CisKK30KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4OF9tbXgoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFyOworICAgIGludCBhdmc7CisKKyAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZ2YXIsICZhdmcpIDsKKyAgICAqc3NlID0gdmFyOworCisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA2KSk7CisKK30KKwordW5zaWduZWQgaW50IHZwOF9tc2UxNngxNl9tbXgoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3NlMCwgc3NlMSwgc3NlMiwgc3NlMywgdmFyOworICAgIGludCBzdW0wLCBzdW0xLCBzdW0yLCBzdW0zOworCisKKyAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOworICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4LCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyICsgOCwgcmVjb25fc3RyaWRlLCAmc3NlMSwgJnN1bTEpOworICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUsIHJlY29uX3N0cmlkZSwgJnNzZTIsICZzdW0yKSA7CisgICAgdnA4X2dldDh4OHZhcl9tbXgoc3JjX3B0ciArIDggKiBzb3VyY2Vfc3RyaWRlICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUgKyA4LCByZWNvbl9zdHJpZGUsICZzc2UzLCAmc3VtMyk7CisKKyAgICB2YXIgPSBzc2UwICsgc3NlMSArIHNzZTIgKyBzc2UzOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuIHZhcjsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4MTZfbW14KAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgdW5zaWduZWQgaW50IHNzZTAsIHNzZTEsIHNzZTIsIHNzZTMsIHZhcjsKKyAgICBpbnQgc3VtMCwgc3VtMSwgc3VtMiwgc3VtMywgYXZnOworCisKKyAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOworICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4LCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyICsgOCwgcmVjb25fc3RyaWRlLCAmc3NlMSwgJnN1bTEpOworICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUsIHJlY29uX3N0cmlkZSwgJnNzZTIsICZzdW0yKSA7CisgICAgdnA4X2dldDh4OHZhcl9tbXgoc3JjX3B0ciArIDggKiBzb3VyY2Vfc3RyaWRlICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUgKyA4LCByZWNvbl9zdHJpZGUsICZzc2UzLCAmc3VtMyk7CisKKyAgICB2YXIgPSBzc2UwICsgc3NlMSArIHNzZTIgKyBzc2UzOworICAgIGF2ZyA9IHN1bTAgKyBzdW0xICsgc3VtMiArIHN1bTM7CisgICAgKnNzZSA9IHZhcjsKKyAgICByZXR1cm4gKHZhciAtICgodW5zaWduZWQgaW50KShhdmcgKiBhdmcpID4+IDgpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDhfbW14KAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgdW5zaWduZWQgaW50IHNzZTAsIHNzZTEsIHZhcjsKKyAgICBpbnQgc3VtMCwgc3VtMSwgYXZnOworCisgICAgdnA4X2dldDh4OHZhcl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmc3NlMCwgJnN1bTApIDsKKyAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDgsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKTsKKworICAgIHZhciA9IHNzZTAgKyBzc2UxOworICAgIGF2ZyA9IHN1bTAgKyBzdW0xOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA3KSk7CisKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHgxNl9tbXgoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3NlMCwgc3NlMSwgdmFyOworICAgIGludCBzdW0wLCBzdW0xLCBhdmc7CisKKyAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOworICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKSA7CisKKyAgICB2YXIgPSBzc2UwICsgc3NlMTsKKyAgICBhdmcgPSBzdW0wICsgc3VtMTsKKyAgICAqc3NlID0gdmFyOworCisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA3KSk7CisKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9tbXgKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlKQorCit7CisgICAgaW50IHhzdW07CisgICAgdW5zaWduZWQgaW50IHh4c3VtOworICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teCgKKyAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzRbeG9mZnNldF0sIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3lvZmZzZXRdLAorICAgICAgICAmeHN1bSwgJnh4c3VtCisgICAgKTsKKyAgICAqc3NlID0geHhzdW07CisgICAgcmV0dXJuICh4eHN1bSAtICgodW5zaWduZWQgaW50KSh4c3VtICogeHN1bSkgPj4gNCkpOworfQorCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X21teAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICpzc2UKKykKK3sKKworICAgIGludCB4c3VtOworICAgIHVuc2lnbmVkIGludCB4eHN1bTsKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCisgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3hvZmZzZXRdLCB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfNFt5b2Zmc2V0XSwKKyAgICAgICAgJnhzdW0sICZ4eHN1bQorICAgICk7CisgICAgKnNzZSA9IHh4c3VtOworICAgIHJldHVybiAoeHhzdW0gLSAoKHVuc2lnbmVkIGludCkoeHN1bSAqIHhzdW0pID4+IDYpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9tbXgKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisKKyAgICBpbnQgeHN1bTAsIHhzdW0xOworICAgIHVuc2lnbmVkIGludCB4eHN1bTAsIHh4c3VtMTsKKworCisgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14KAorICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKKyAgICAgICAgdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzRbeG9mZnNldF0sIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3lvZmZzZXRdLAorICAgICAgICAmeHN1bTAsICZ4eHN1bTAKKyAgICApOworCisKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCisgICAgICAgIHNyY19wdHIgKyA4LCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICBkc3RfcHRyICsgOCwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3hvZmZzZXRdLCB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfNFt5b2Zmc2V0XSwKKyAgICAgICAgJnhzdW0xLCAmeHhzdW0xCisgICAgKTsKKworICAgIHhzdW0wICs9IHhzdW0xOworICAgIHh4c3VtMCArPSB4eHN1bTE7CisKKyAgICAqc3NlID0geHhzdW0wOworICAgIHJldHVybiAoeHhzdW0wIC0gKCh1bnNpZ25lZCBpbnQpKHhzdW0wICogeHN1bTApID4+IDgpKTsKKworCit9CisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX21zZTE2eDE2X21teCgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X21teChzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCBzc2UpOworICAgIHJldHVybiAqc3NlOworfQorCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfbW14CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIGludCB4c3VtMCwgeHN1bTE7CisgICAgdW5zaWduZWQgaW50IHh4c3VtMCwgeHhzdW0xOworCisKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCisgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3hvZmZzZXRdLCB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfNFt5b2Zmc2V0XSwKKyAgICAgICAgJnhzdW0wLCAmeHhzdW0wCisgICAgKTsKKworCisgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14KAorICAgICAgICBzcmNfcHRyICsgOCwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgZHN0X3B0ciArIDgsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3hvZmZzZXRdLCB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfNFt5b2Zmc2V0XSwKKyAgICAgICAgJnhzdW0xLCAmeHhzdW0xCisgICAgKTsKKworICAgIHhzdW0wICs9IHhzdW0xOworICAgIHh4c3VtMCArPSB4eHN1bTE7CisKKyAgICAqc3NlID0geHhzdW0wOworICAgIHJldHVybiAoeHhzdW0wIC0gKCh1bnNpZ25lZCBpbnQpKHhzdW0wICogeHN1bTApID4+IDcpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X21teAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICpzc2UKKykKK3sKKyAgICBpbnQgeHN1bTsKKyAgICB1bnNpZ25lZCBpbnQgeHhzdW07CisgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14KAorICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKKyAgICAgICAgdnA4X2JpbGluZWFyX2ZpbHRlcnNfeDg2XzRbeG9mZnNldF0sIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3lvZmZzZXRdLAorICAgICAgICAmeHN1bSwgJnh4c3VtCisgICAgKTsKKyAgICAqc3NlID0geHhzdW07CisgICAgcmV0dXJuICh4eHN1bSAtICgodW5zaWduZWQgaW50KSh4c3VtICogeHN1bSkgPj4gNykpOworfQorCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbW14KAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgcmV0dXJuIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgNCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcHRyLCByZWNvbl9zdHJpZGUsIHNzZSk7Cit9CisKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9tbXgoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICByZXR1cm4gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCAwLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgc3NlKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9tbXgoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICByZXR1cm4gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCA0LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgc3NlKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9zc2UyLmMgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdmFyaWFuY2Vfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDY0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdmFyaWFuY2Vfc3NlMi5jCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi92YXJpYW5jZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcHJhZ21hcy5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3g4Ni9maWx0ZXJfeDg2LmgiCisKK2V4dGVybiB2b2lkIGZpbHRlcl9ibG9jazFkX2g2X21teChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLCB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwgc2hvcnQgKmZpbHRlcik7CitleHRlcm4gdm9pZCBmaWx0ZXJfYmxvY2sxZF92Nl9tbXgoY29uc3Qgc2hvcnQgKnNyY19wdHIsIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsIHVuc2lnbmVkIGludCBwaXhlbHNfcGVyX2xpbmUsIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLCB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwgc2hvcnQgKmZpbHRlcik7CitleHRlcm4gdm9pZCBmaWx0ZXJfYmxvY2sxZDhfaDZfc3NlMihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLCB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwgc2hvcnQgKmZpbHRlcik7CitleHRlcm4gdm9pZCBmaWx0ZXJfYmxvY2sxZDhfdjZfc3NlMihjb25zdCBzaG9ydCAqc3JjX3B0ciwgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LCB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLCBzaG9ydCAqZmlsdGVyKTsKKworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbDR4NF92YXJfbW14CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLAorICAgIGNvbnN0IHNob3J0ICpWRmlsdGVyLAorICAgIGludCAqc3VtLAorICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0NHg0dmFyX21teAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50ICByZWNvbl9zdHJpZGUsCisgICAgdW5zaWduZWQgaW50ICpTU0UsCisgICAgaW50ICpTdW0KKyk7CisKK3Vuc2lnbmVkIGludCB2cDhfZ2V0X21iX3NzX3NzZTIKKygKKyAgICBjb25zdCBzaG9ydCAqc3JjX3B0cgorKTsKK3Vuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZ2YXJfc3NlMgorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqU1NFLAorICAgIGludCAqU3VtCispOwordW5zaWduZWQgaW50IHZwOF9nZXQ4eDh2YXJfc3NlMgorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqU1NFLAorICAgIGludCAqU3VtCispOwordm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBpbnQgKnN1bSwKKyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKyk7Cit2b2lkIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2U4eF9oX3NzZTIKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IEhlaWdodCwKKyAgICBpbnQgKnN1bSwKKyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKyk7Cit2b2lkIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCisgICAgaW50ICpzdW0sCisgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCispOwordm9pZCB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMgorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorICAgIGludCAqc3VtLAorICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorKTsKK3ZvaWQgdnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCisgICAgaW50ICpzdW0sCisgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCispOwordm9pZCB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCisgICAgaW50ICpzdW0sCisgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCispOwordm9pZCB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorICAgIGludCAqc3VtLAorICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorKTsKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTR4NF93bXQoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFyOworICAgIGludCBhdmc7CisKKyAgICB2cDhfZ2V0NHg0dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZ2YXIsICZhdmcpIDsKKyAgICAqc3NlID0gdmFyOworICAgIHJldHVybiAodmFyIC0gKCh1bnNpZ25lZCBpbnQpKGF2ZyAqIGF2ZykgPj4gNCkpOworCit9CisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDhfd210CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFyOworICAgIGludCBhdmc7CisKKyAgICB2cDhfZ2V0OHg4dmFyX3NzZTIoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmdmFyLCAmYXZnKSA7CisgICAgKnNzZSA9IHZhcjsKKyAgICByZXR1cm4gKHZhciAtICgodW5zaWduZWQgaW50KShhdmcgKiBhdmcpID4+IDYpKTsKKworfQorCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNngxNl93bXQKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc291cmNlX3N0cmlkZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCAgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqc3NlKQoreworICAgIHVuc2lnbmVkIGludCBzc2UwOworICAgIGludCBzdW0wOworCisKKyAgICB2cDhfZ2V0MTZ4MTZ2YXJfc3NlMihzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOworICAgICpzc2UgPSBzc2UwOworICAgIHJldHVybiAoc3NlMCAtICgodW5zaWduZWQgaW50KShzdW0wICogc3VtMCkgPj4gOCkpOworfQordW5zaWduZWQgaW50IHZwOF9tc2UxNngxNl93bXQoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKworICAgIHVuc2lnbmVkIGludCBzc2UwOworICAgIGludCBzdW0wOworICAgIHZwOF9nZXQxNngxNnZhcl9zc2UyKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgJnNzZTAsICZzdW0wKSA7CisgICAgKnNzZSA9IHNzZTA7CisgICAgcmV0dXJuIHNzZTA7CisKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OF93bXQKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc291cmNlX3N0cmlkZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCAgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqc3NlKQoreworICAgIHVuc2lnbmVkIGludCBzc2UwLCBzc2UxLCB2YXI7CisgICAgaW50IHN1bTAsIHN1bTEsIGF2ZzsKKworICAgIHZwOF9nZXQ4eDh2YXJfc3NlMihzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOworICAgIHZwOF9nZXQ4eDh2YXJfc3NlMihzcmNfcHRyICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDgsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKTsKKworICAgIHZhciA9IHNzZTAgKyBzc2UxOworICAgIGF2ZyA9IHN1bTAgKyBzdW0xOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA3KSk7CisKK30KKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4MTZfd210CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3NlMCwgc3NlMSwgdmFyOworICAgIGludCBzdW0wLCBzdW0xLCBhdmc7CisKKyAgICB2cDhfZ2V0OHg4dmFyX3NzZTIoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmc3NlMCwgJnN1bTApIDsKKyAgICB2cDhfZ2V0OHg4dmFyX3NzZTIoc3JjX3B0ciArIDggKiBzb3VyY2Vfc3RyaWRlLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyICsgOCAqIHJlY29uX3N0cmlkZSwgcmVjb25fc3RyaWRlLCAmc3NlMSwgJnN1bTEpIDsKKworICAgIHZhciA9IHNzZTAgKyBzc2UxOworICAgIGF2ZyA9IHN1bTAgKyBzdW0xOworICAgICpzc2UgPSB2YXI7CisgICAgcmV0dXJuICh2YXIgLSAoKHVuc2lnbmVkIGludCkoYXZnICogYXZnKSA+PiA3KSk7CisKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfd210CisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIGludCB4c3VtOworICAgIHVuc2lnbmVkIGludCB4eHN1bTsKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsNHg0X3Zhcl9tbXgoCisgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgICAgIHZwOF9iaWxpbmVhcl9maWx0ZXJzX3g4Nl80W3hvZmZzZXRdLCB2cDhfYmlsaW5lYXJfZmlsdGVyc194ODZfNFt5b2Zmc2V0XSwKKyAgICAgICAgJnhzdW0sICZ4eHN1bQorICAgICk7CisgICAgKnNzZSA9IHh4c3VtOworICAgIHJldHVybiAoeHhzdW0gLSAoKHVuc2lnbmVkIGludCkoeHN1bSAqIHhzdW0pID4+IDQpKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF93bXQKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgaW50IHhzdW07CisgICAgdW5zaWduZWQgaW50IHh4c3VtOworCisgICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCisgICAgeworICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAorICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgICAgICAmeHN1bSwgJnh4c3VtKTsKKyAgICB9CisgICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2U4eF9oX3NzZTIoCisgICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKKyAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LAorICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7CisgICAgfQorCisgICAgKnNzZSA9IHh4c3VtOworICAgIHJldHVybiAoeHhzdW0gLSAoKHVuc2lnbmVkIGludCkoeHN1bSAqIHhzdW0pID4+IDYpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl93bXQKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgaW50IHhzdW0wLCB4c3VtMTsKKyAgICB1bnNpZ25lZCBpbnQgeHhzdW0wLCB4eHN1bTE7CisKKworICAgIC8qIG5vdGUgd2UgY291bGQgYXZvaWQgdGhlc2UgaWYgc3RhdGVtZW50cyBpZiB0aGUgY2FsbGluZyBmdW5jdGlvbgorICAgICAqIGp1c3QgY2FsbGVkIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbnMgaW5zaWRlLgorICAgICAqLworICAgIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSAwKQorICAgIHsKKyAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoeG9mZnNldCA9PSAwICYmIHlvZmZzZXQgPT0gNCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKKyAgICAgICAgICAgIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTAKKyAgICAgICAgKTsKKworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyICsgOCwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LAorICAgICAgICAgICAgJnhzdW0xLCAmeHhzdW0xCisgICAgICAgICk7CisgICAgICAgIHhzdW0wICs9IHhzdW0xOworICAgICAgICB4eHN1bTAgKz0geHhzdW0xOworICAgIH0KKworICAgICpzc2UgPSB4eHN1bTA7CisgICAgcmV0dXJuICh4eHN1bTAgLSAoKHVuc2lnbmVkIGludCkoeHN1bTAgKiB4c3VtMCkgPj4gOCkpOworfQorCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF9tc2UxNngxNl93bXQoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZQorKQoreworICAgIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl93bXQoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgeG9mZnNldCwgeW9mZnNldCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKKyAgICByZXR1cm4gKnNzZTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3dtdAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICpzc2UKKworKQoreworICAgIGludCB4c3VtMCwgeHN1bTE7CisgICAgdW5zaWduZWQgaW50IHh4c3VtMCwgeHhzdW0xOworCisgICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCisgICAgeworICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIoCisgICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAorICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LAorICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKKworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyICsgOCwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKKyAgICAgICAgICAgIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICAmeHN1bTEsICZ4eHN1bTEpOworICAgICAgICB4c3VtMCArPSB4c3VtMTsKKyAgICAgICAgeHhzdW0wICs9IHh4c3VtMTsKKyAgICB9CisKKyAgICAqc3NlID0geHhzdW0wOworICAgIHJldHVybiAoeHhzdW0wIC0gKCh1bnNpZ25lZCBpbnQpKHhzdW0wICogeHN1bTApID4+IDcpKTsKK30KKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X3dtdAorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICpzc2UKKykKK3sKKyAgICBpbnQgeHN1bTsKKyAgICB1bnNpZ25lZCBpbnQgeHhzdW07CisKKyAgICBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gMCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlOHhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTIoCisgICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LAorICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7CisgICAgfQorCisgICAgKnNzZSA9IHh4c3VtOworICAgIHJldHVybiAoeHhzdW0gLSAoKHVuc2lnbmVkIGludCkoeHN1bSAqIHhzdW0pID4+IDcpKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX3dtdCgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCAgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICBpbnQgeHN1bTA7CisgICAgdW5zaWduZWQgaW50IHh4c3VtMDsKKworICAgIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisKKyAgICAqc3NlID0geHhzdW0wOworICAgIHJldHVybiAoeHhzdW0wIC0gKCh1bnNpZ25lZCBpbnQpKHhzdW0wICogeHN1bTApID4+IDgpKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X3dtdCgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCAgZHN0X3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgKnNzZSkKK3sKKyAgICBpbnQgeHN1bTA7CisgICAgdW5zaWduZWQgaW50IHh4c3VtMDsKKyAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisKKyAgICAqc3NlID0geHhzdW0wOworICAgIHJldHVybiAoeHhzdW0wIC0gKCh1bnNpZ25lZCBpbnQpKHhzdW0wICogeHN1bTApID4+IDgpKTsKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl93bXQoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgIGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgaW50IHhzdW0wOworICAgIHVuc2lnbmVkIGludCB4eHN1bTA7CisKKyAgICB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCisgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisKKyAgICAqc3NlID0geHhzdW0wOworICAgIHJldHVybiAoeHhzdW0wIC0gKCh1bnNpZ25lZCBpbnQpKHhzdW0wICogeHN1bTApID4+IDgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9zc3NlMy5jIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3ZhcmlhbmNlX3Nzc2UzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyMDU1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvY29tbW9uL3g4Ni92YXJpYW5jZV9zc3NlMy5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi92YXJpYW5jZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcHJhZ21hcy5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZ2YXJfc3NlMgorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVjb25fc3RyaWRlLAorICAgIHVuc2lnbmVkIGludCAqU1NFLAorICAgIGludCAqU3VtCispOworZXh0ZXJuIHZvaWQgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTE2eF9oX3NzZTIKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IEhlaWdodCwKKyAgICBpbnQgKnN1bSwKKyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKyk7CitleHRlcm4gdm9pZCB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50IEhlaWdodCwKKyAgICBpbnQgKnN1bSwKKyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKyk7CitleHRlcm4gdm9pZCB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgorKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCisgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAorICAgIGludCAqc3VtLAorICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAorKTsKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBpbnQgKnN1bSwKKyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKKyk7CisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfc3NzZTMKKygKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAqc3NlCispCit7CisgICAgaW50IHhzdW0wOworICAgIHVuc2lnbmVkIGludCB4eHN1bTA7CisKKyAgICAvKiBub3RlIHdlIGNvdWxkIGF2b2lkIHRoZXNlIGlmIHN0YXRlbWVudHMgaWYgdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAgICAgKiBqdXN0IGNhbGxlZCB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25zIGluc2lkZS4KKyAgICAgKi8KKyAgICBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gMCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAorICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorCisgICAgKnNzZSA9IHh4c3VtMDsKKyAgICByZXR1cm4gKHh4c3VtMCAtICgodW5zaWduZWQgaW50KSh4c3VtMCAqIHhzdW0wKSA+PiA4KSk7Cit9CisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9zc3NlMworKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICpzc2UKKworKQoreworICAgIGludCB4c3VtMDsKKyAgICB1bnNpZ25lZCBpbnQgeHhzdW0wOworCisgICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCisgICAgeworICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIoCisgICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCisgICAgeworICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAorICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKKyAgICB7CisgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAorICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCisgICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlMygKKyAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAorICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwKKyAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7CisgICAgfQorCisgICAgKnNzZSA9IHh4c3VtMDsKKyAgICByZXR1cm4gKHh4c3VtMCAtICgodW5zaWduZWQgaW50KSh4c3VtMCAqIHhzdW0wKSA+PiA3KSk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2NvbW1vbi94ODYvdnA4X2FzbV9zdHVicy5jIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3ZwOF9hc21fc3R1YnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDM3YTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9jb21tb24veDg2L3ZwOF9hc21fc3R1YnMuYwpAQCAtMCwwICsxLDYyOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCisjaW5jbHVkZSAiZmlsdGVyX3g4Ni5oIgorCitleHRlcm4gY29uc3Qgc2hvcnQgdnA4X3NpeF90YXBfbW14WzhdWzYqOF07CisKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgKKygKKyAgICB1bnNpZ25lZCBjaGFyICAgKnNyY19wdHIsCisgICAgdW5zaWduZWQgc2hvcnQgICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAgICBwaXhlbF9zdGVwLAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgsCisgICAgY29uc3Qgc2hvcnQgICAgICAqdnA4X2ZpbHRlcgorKTsKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14CisoCisgICAgdW5zaWduZWQgc2hvcnQgKnNyY19wdHIsCisgICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCisgICAgaW50ICAgICAgICAgICAgIG91dHB1dF9waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAgICBwaXhlbF9zdGVwLAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgsCisgICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKKyk7CitleHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3NzZTIKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKKyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoLAorICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCispOworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NlMgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIHNob3J0ICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCAgICBwaXhlbF9zdGVwLAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgsCisgICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKKyk7CitleHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3NzZTIKKygKKyAgICB1bnNpZ25lZCBzaG9ydCAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorICAgIGludCBkc3RfcHRpY2gsCisgICAgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAorICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCispOworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NlMgorKAorICAgIHVuc2lnbmVkIHNob3J0ICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCisgICAgaW50IGRzdF9wdGljaCwKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBvdXRwdXRfd2lkdGgsCisgICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKKyk7CitleHRlcm4gdm9pZCB2cDhfdW5wYWNrX2Jsb2NrMWQxNl9oNl9zc2UyCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF93aWR0aAorKTsKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfb25seV9zc2UyCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCisgICAgaW50IGRzdF9wdGljaCwKKyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKKyAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgorKTsKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X29ubHlfc3NlMgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAorICAgIGludCBkc3RfcHRpY2gsCisgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCisgICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKKyk7CitleHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMgorKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgdW5zaWduZWQgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorICAgIGludCBkc3RfcHRpY2gsCisgICAgdW5zaWduZWQgaW50ICAgb3V0cHV0X2hlaWdodCwKKyAgICBjb25zdCBzaG9ydCAgICp2cDhfZmlsdGVyCispOworCisKKyNpZiBIQVZFX01NWAordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfbW14CisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXRjaAorKQoreworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMTYqMTYpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YTIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDksIDgsIEhGaWx0ZXIpOworICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgoRkRhdGEyICsgOCwgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCA0ICwgNCwgNCwgVkZpbHRlcik7CisKK30KKworCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X21teAorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl0Y2gKKykKK3sKKworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMjQqMjQpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKworICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLCAqVkZpbHRlcjsKKworCisgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKKworICAgIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksICAgIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAyMSwgMzIsIEhGaWx0ZXIpOworICAgIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSkgKyA0LCAgRkRhdGEyICsgNCwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMjEsIDMyLCBIRmlsdGVyKTsKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpICsgOCwgIEZEYXRhMiArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDIxLCAzMiwgSEZpbHRlcik7CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSArIDEyLCBGRGF0YTIgKyAxMiwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMjEsIDMyLCBIRmlsdGVyKTsKKworICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgoRkRhdGEyICsgMzIsIGRzdF9wdHIsICAgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgMTYsIFZGaWx0ZXIpOworICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDM2LCBkc3RfcHRyICsgNCwgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgMTYsIFZGaWx0ZXIpOworICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDQwLCBkc3RfcHRyICsgOCwgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgMTYsIFZGaWx0ZXIpOworICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDQ0LCBkc3RfcHRyICsgMTIsIGRzdF9waXRjaCwgMzIsIDE2ICwgMTYsIDE2LCBWRmlsdGVyKTsKKworfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X21teAorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl0Y2gKKykKK3sKKworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMjU2KTsgICAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKworICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLCAqVkZpbHRlcjsKKworICAgIEhGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeG9mZnNldF07CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgICAgRkRhdGEyLCAgIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDEzLCAxNiwgSEZpbHRlcik7CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSArIDQsICBGRGF0YTIgKyA0LCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAxMywgMTYsIEhGaWx0ZXIpOworCisgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMWRjX3Y2X21teChGRGF0YTIgKyAxNiwgZHN0X3B0ciwgICBkc3RfcGl0Y2gsIDE2LCA4ICwgOCwgOCwgVkZpbHRlcik7CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgoRkRhdGEyICsgMjAsIGRzdF9wdHIgKyA0LCBkc3RfcGl0Y2gsIDE2LCA4ICwgOCwgOCwgVkZpbHRlcik7CisKK30KKworCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9tbXgKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpdGNoCispCit7CisKKyAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIHNob3J0LCBGRGF0YTIsIDI1Nik7ICAgIC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCisKKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKyAgICBIRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3hvZmZzZXRdOworICAgIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksICAgIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA5LCAxNiwgSEZpbHRlcik7CisgICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSArIDQsICBGRGF0YTIgKyA0LCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA5LCAxNiwgSEZpbHRlcik7CisKKyAgICBWRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3lvZmZzZXRdOworICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDE2LCBkc3RfcHRyLCAgIGRzdF9waXRjaCwgMTYsIDggLCA0LCA4LCBWRmlsdGVyKTsKKyAgICB2cDhfZmlsdGVyX2Jsb2NrMWRjX3Y2X21teChGRGF0YTIgKyAyMCwgZHN0X3B0ciArIDQsIGRzdF9waXRjaCwgMTYsIDggLCA0LCA4LCBWRmlsdGVyKTsKKworfQorCisKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X21teAorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl0Y2gKKykKK3sKKyAgICB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgoc3JjX3B0ciwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCBkc3RfcHRyLCAgIGRzdF9waXRjaCk7CisgICAgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbW14KHNyY19wdHIgKyA4LCBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCBkc3RfcHRyICsgOCwgZHN0X3BpdGNoKTsKKyAgICB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgoc3JjX3B0ciArIDggKiBzcmNfcGl4ZWxzX3Blcl9saW5lLCAgIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIgKyBkc3RfcGl0Y2ggKiA4LCAgIGRzdF9waXRjaCk7CisgICAgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbW14KHNyY19wdHIgKyA4ICogc3JjX3BpeGVsc19wZXJfbGluZSArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIgKyBkc3RfcGl0Y2ggKiA4ICsgOCwgZHN0X3BpdGNoKTsKK30KKyNlbmRpZgorCisKKyNpZiBIQVZFX1NTRTIKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NlMgorKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgaW50ICB4b2Zmc2V0LAorICAgIGludCAgeW9mZnNldCwKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAorICAgIGludCBkc3RfcGl0Y2gKKworKQoreworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMjQqMjQpOyAgICAvKiBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLworCisgICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsICpWRmlsdGVyOworCisgICAgaWYgKHhvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoeW9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTIoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAyMSwgMzIsIEhGaWx0ZXIpOworICAgICAgICAgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3NzZTIoRkRhdGEyICsgMzIsIGRzdF9wdHIsICAgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0LXBhc3Mgb25seSAqLworICAgICAgICAgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X29ubHlfc3NlMihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCBIRmlsdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTZWNvbmQtcGFzcyBvbmx5ICovCisgICAgICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07CisgICAgICAgIHZwOF91bnBhY2tfYmxvY2sxZDE2X2g2X3NzZTIoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAyMSwgMzIpOworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyKEZEYXRhMiArIDMyLCBkc3RfcHRyLCAgIGRzdF9waXRjaCwgMzIsIDE2ICwgMTYsIGRzdF9waXRjaCwgVkZpbHRlcik7CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X3NzZTIKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpdGNoCispCit7CisgICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBzaG9ydCwgRkRhdGEyLCAyNTYpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKyAgICBpZiAoeG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICh5b2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBIRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3hvZmZzZXRdOworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YTIsICAgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMTMsIDE2LCBIRmlsdGVyKTsKKyAgICAgICAgICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3NzZTIoRkRhdGEyICsgMTYsIGRzdF9wdHIsICAgZHN0X3BpdGNoLCAxNiwgOCAsIDgsIGRzdF9waXRjaCwgVkZpbHRlcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdC1wYXNzIG9ubHkgKi8KKyAgICAgICAgICAgIEhGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeG9mZnNldF07CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIEhGaWx0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNlY29uZC1wYXNzIG9ubHkgKi8KKyAgICAgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKKyAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9vbmx5X3NzZTIoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCwgOCwgVkZpbHRlcik7CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X3NzZTIKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpdGNoCispCit7CisgICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBzaG9ydCwgRkRhdGEyLCAyNTYpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KKyAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7CisKKyAgICBpZiAoeG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICh5b2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBIRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3hvZmZzZXRdOworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YTIsICAgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgMTYsIEhGaWx0ZXIpOworICAgICAgICAgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NlMihGRGF0YTIgKyAxNiwgZHN0X3B0ciwgICBkc3RfcGl0Y2gsIDE2LCA4ICwgNCwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0LXBhc3Mgb25seSAqLworICAgICAgICAgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfb25seV9zc2UyKHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgSEZpbHRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2Vjb25kLXBhc3Mgb25seSAqLworICAgICAgICBWRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3lvZmZzZXRdOworICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMihzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCBWRmlsdGVyKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisjaWYgSEFWRV9TU1NFMworCitleHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgICAgdnA4X2ZpbHRlcl9pbmRleAorKTsKKworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKKyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3BpdGNoLAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICB2cDhfZmlsdGVyX2luZGV4CispOworCitleHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMworKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgdW5zaWduZWQgaW50ICAgc3JjX3BpdGNoLAorICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAorICAgIHVuc2lnbmVkIGludCAgIG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgdnA4X2ZpbHRlcl9pbmRleAorKTsKKworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMworKAorICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCisgICAgdW5zaWduZWQgaW50ICAgc3JjX3BpdGNoLAorICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCisgICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAorICAgIHVuc2lnbmVkIGludCAgIG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgdnA4X2ZpbHRlcl9pbmRleAorKTsKKworZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkNF9oNl9zc3NlMworKAorICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfcGl0Y2gsCisgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgIHZwOF9maWx0ZXJfaW5kZXgKKyk7CisKK2V4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDRfdjZfc3NzZTMKKygKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAorICAgIHVuc2lnbmVkIGludCAgIG91dF9waXRjaCwKKyAgICB1bnNpZ25lZCBpbnQgICBvdXRwdXRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgIHZwOF9maWx0ZXJfaW5kZXgKKyk7CisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NzZTMKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpdGNoCisKKykKK3sKKyAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIGNoYXIsIEZEYXRhMiwgMjQqMjQpOworCisgICAgaWYgKHhvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoeW9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCBGRGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMjEsIHhvZmZzZXQpOworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NzZTMoRkRhdGEyICwgMTYsIGRzdF9wdHIsIGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCB5b2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0LXBhc3Mgb25seSAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXRjaCwgMTYsIHhvZmZzZXQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh5b2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTZWNvbmQtcGFzcyBvbmx5ICovCisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCB5b2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNzc2UzIHNlY29uZC1wYXNzIG9ubHkgZnVuY3Rpb24gY291bGRuJ3QgaGFuZGxlICh4b2Zmc2V0PT0wICYmCisgICAgICAgICAgICAgKiB5b2Zmc2V0PT0wKSBjYXNlIGNvcnJlY3RseS4gQWRkIGNvcHkgZnVuY3Rpb24gaGVyZSB0byBndWFyYW50ZWUKKyAgICAgICAgICAgICAqIHNpeC10YXAgZnVuY3Rpb24gaGFuZGxlcyBhbGwgcG9zc2libGUgb2Zmc2V0cy4gKi8KKyAgICAgICAgICAgIHZwOF9jb3B5X21lbTE2eDE2KHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X3Nzc2UzCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXRjaAorKQoreworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgY2hhciwgRkRhdGEyLCAyNTYpOworCisgICAgaWYgKHhvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoeW9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwgRkRhdGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAxMywgeG9mZnNldCk7CisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3Nzc2UzKEZEYXRhMiwgOCwgZHN0X3B0ciwgZHN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCB5b2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfc3NzZTMoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCB4b2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoeW9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2Vjb25kLXBhc3Mgb25seSAqLworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCB5b2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNzc2UzIHNlY29uZC1wYXNzIG9ubHkgZnVuY3Rpb24gY291bGRuJ3QgaGFuZGxlICh4b2Zmc2V0PT0wICYmCisgICAgICAgICAgICAgKiB5b2Zmc2V0PT0wKSBjYXNlIGNvcnJlY3RseS4gQWRkIGNvcHkgZnVuY3Rpb24gaGVyZSB0byBndWFyYW50ZWUKKyAgICAgICAgICAgICAqIHNpeC10YXAgZnVuY3Rpb24gaGFuZGxlcyBhbGwgcG9zc2libGUgb2Zmc2V0cy4gKi8KKyAgICAgICAgICAgIHZwOF9jb3B5X21lbTh4OChzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gpOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X3Nzc2UzCisoCisgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCisgICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICBpbnQgIHhvZmZzZXQsCisgICAgaW50ICB5b2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgaW50IGRzdF9waXRjaAorKQoreworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgY2hhciwgRkRhdGEyLCAyNTYpOworCisgICAgaWYgKHhvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoeW9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwgRkRhdGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA5LCB4b2Zmc2V0KTsKKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTMoRkRhdGEyLCA4LCBkc3RfcHRyLCBkc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHlvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QtcGFzcyBvbmx5ICovCisgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzKHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeG9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHlvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNlY29uZC1wYXNzIG9ubHkgKi8KKyAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTMoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeW9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzc3NlMyBzZWNvbmQtcGFzcyBvbmx5IGZ1bmN0aW9uIGNvdWxkbid0IGhhbmRsZSAoeG9mZnNldD09MCAmJgorICAgICAgICAgICAgICogeW9mZnNldD09MCkgY2FzZSBjb3JyZWN0bHkuIEFkZCBjb3B5IGZ1bmN0aW9uIGhlcmUgdG8gZ3VhcmFudGVlCisgICAgICAgICAgICAgKiBzaXgtdGFwIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIHBvc3NpYmxlIG9mZnNldHMuICovCisgICAgICAgICAgICB2cDhfY29weV9tZW04eDQoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfc3NzZTMKKygKKyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKKyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAorICAgIGludCAgeG9mZnNldCwKKyAgICBpbnQgIHlvZmZzZXQsCisgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKKyAgICBpbnQgZHN0X3BpdGNoCispCit7CisgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgY2hhciwgRkRhdGEyLCA0KjkpOworCisgIGlmICh4b2Zmc2V0KQorICB7CisgICAgICBpZiAoeW9mZnNldCkKKyAgICAgIHsKKyAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ0X2g2X3Nzc2UzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEYXRhMiwgNCwgOSwgeG9mZnNldCk7CisgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkNF92Nl9zc3NlMyhGRGF0YTIsIDQsIGRzdF9wdHIsIGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHlvZmZzZXQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDRfaDZfc3NzZTMoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeG9mZnNldCk7CisgICAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgICBpZiAoeW9mZnNldCkKKyAgICAgIHsKKyAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y2X3Nzc2UzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeW9mZnNldCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIHNzc2UzIHNlY29uZC1wYXNzIG9ubHkgZnVuY3Rpb24gY291bGRuJ3QgaGFuZGxlICh4b2Zmc2V0PT0wICYmCisgICAgICAgICAgKiB5b2Zmc2V0PT0wKSBjYXNlIGNvcnJlY3RseS4gQWRkIGNvcHkgZnVuY3Rpb24gaGVyZSB0byBndWFyYW50ZWUKKyAgICAgICAgICAqIHNpeC10YXAgZnVuY3Rpb24gaGFuZGxlcyBhbGwgcG9zc2libGUgb2Zmc2V0cy4gKi8KKyAgICAgICAgICBpbnQgcjsKKworICAgICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgICAgICAgeworICAjaWYgIShDT05GSUdfRkFTVF9VTkFMSUdORUQpCisgICAgICAgICAgICBkc3RfcHRyWzBdICA9IHNyY19wdHJbMF07CisgICAgICAgICAgICBkc3RfcHRyWzFdICA9IHNyY19wdHJbMV07CisgICAgICAgICAgICBkc3RfcHRyWzJdICA9IHNyY19wdHJbMl07CisgICAgICAgICAgICBkc3RfcHRyWzNdICA9IHNyY19wdHJbM107CisgICNlbHNlCisgICAgICAgICAgICAgICoodWludDMyX3QgKilkc3RfcHRyID0gKih1aW50MzJfdCAqKXNyY19wdHIgOworICAjZW5kaWYKKyAgICAgICAgICAgICAgZHN0X3B0ciAgICAgKz0gZHN0X3BpdGNoOworICAgICAgICAgICAgICBzcmNfcHRyICAgICArPSBzcmNfcGl4ZWxzX3Blcl9saW5lOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYyBiL2xpYnZweC92cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDJhMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2FzbV9kZWNfb2Zmc2V0cy5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X3BvcnRzL2FzbV9vZmZzZXRzLmgiCisjaW5jbHVkZSAib255eGRfaW50LmgiCisKK0JFR0lOCisKK0RFRklORShib29sX2RlY29kZXJfdXNlcl9idWZmZXJfZW5kLCAgICAgICAgICAgIG9mZnNldG9mKEJPT0xfREVDT0RFUiwgdXNlcl9idWZmZXJfZW5kKSk7CitERUZJTkUoYm9vbF9kZWNvZGVyX3VzZXJfYnVmZmVyLCAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIHVzZXJfYnVmZmVyKSk7CitERUZJTkUoYm9vbF9kZWNvZGVyX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIHZhbHVlKSk7CitERUZJTkUoYm9vbF9kZWNvZGVyX2NvdW50LCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIGNvdW50KSk7CitERUZJTkUoYm9vbF9kZWNvZGVyX3JhbmdlLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIHJhbmdlKSk7CisKK0VORAorCisvKiBhZGQgYXNzZXJ0cyBmb3IgYW55IG9mZnNldCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXNzZW1ibHkgY29kZSAqLworLyogYWRkIGFzc2VydHMgZm9yIGFueSBzaXplIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBhc3NlbWJseSBjb2RlICovCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2RlY29kZXIvZGJvb2xodWZmLmMgYi9saWJ2cHgvdnA4L2RlY29kZXIvZGJvb2xodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3YjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZGVjb2Rlci9kYm9vbGh1ZmYuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgImRib29saHVmZi5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKworaW50IHZwOGR4X3N0YXJ0X2RlY29kZShCT09MX0RFQ09ERVIgKmJyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfc3opCit7CisgICAgYnItPnVzZXJfYnVmZmVyX2VuZCA9IHNvdXJjZStzb3VyY2Vfc3o7CisgICAgYnItPnVzZXJfYnVmZmVyICAgICA9IHNvdXJjZTsKKyAgICBici0+dmFsdWUgICAgPSAwOworICAgIGJyLT5jb3VudCAgICA9IC04OworICAgIGJyLT5yYW5nZSAgICA9IDI1NTsKKworICAgIGlmIChzb3VyY2Vfc3ogJiYgIXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBQb3B1bGF0ZSB0aGUgYnVmZmVyICovCisgICAgdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwoYnIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCB2cDhkeF9ib29sX2RlY29kZXJfZmlsbChCT09MX0RFQ09ERVIgKmJyKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZnB0cjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZlbmQ7CisgICAgVlA4X0JEX1ZBTFVFICAgICAgICAgdmFsdWU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgY291bnQ7CisgICAgYnVmZW5kID0gYnItPnVzZXJfYnVmZmVyX2VuZDsKKyAgICBidWZwdHIgPSBici0+dXNlcl9idWZmZXI7CisgICAgdmFsdWUgPSBici0+dmFsdWU7CisgICAgY291bnQgPSBici0+Y291bnQ7CisKKyAgICBWUDhEWF9CT09MX0RFQ09ERVJfRklMTChjb3VudCwgdmFsdWUsIGJ1ZnB0ciwgYnVmZW5kKTsKKworICAgIGJyLT51c2VyX2J1ZmZlciA9IGJ1ZnB0cjsKKyAgICBici0+dmFsdWUgPSB2YWx1ZTsKKyAgICBici0+Y291bnQgPSBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZGVjb2Rlci9kYm9vbGh1ZmYuaCBiL2xpYnZweC92cDgvZGVjb2Rlci9kYm9vbGh1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA4YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2Rib29saHVmZi5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBEQk9PTEhVRkZfSAorI2RlZmluZSBEQk9PTEhVRkZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbnRlZ2VyLmgiCisKK3R5cGVkZWYgc2l6ZV90IFZQOF9CRF9WQUxVRTsKKworIyBkZWZpbmUgVlA4X0JEX1ZBTFVFX1NJWkUgKChpbnQpc2l6ZW9mKFZQOF9CRF9WQUxVRSkqQ0hBUl9CSVQpCisvKlRoaXMgaXMgbWVhbnQgdG8gYmUgYSBsYXJnZSwgcG9zaXRpdmUgY29uc3RhbnQgdGhhdCBjYW4gc3RpbGwgYmUgZWZmaWNpZW50bHkKKyAgIGxvYWRlZCBhcyBhbiBpbW1lZGlhdGUgKG9uIHBsYXRmb3JtcyBsaWtlIEFSTSwgZm9yIGV4YW1wbGUpLgorICBFdmVuIHJlbGF0aXZlbHkgbW9kZXN0IHZhbHVlcyBsaWtlIDEwMCB3b3VsZCB3b3JrIGZpbmUuKi8KKyMgZGVmaW5lIFZQOF9MT1RTX09GX0JJVFMgKDB4NDAwMDAwMDApCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9idWZmZXJfZW5kOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJfYnVmZmVyOworICAgIFZQOF9CRF9WQUxVRSAgICAgICAgIHZhbHVlOworICAgIGludCAgICAgICAgICAgICAgICAgIGNvdW50OworICAgIHVuc2lnbmVkIGludCAgICAgICAgIHJhbmdlOworfSBCT09MX0RFQ09ERVI7CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIsIHZwOF9ub3JtWzI1Nl0pOworCitpbnQgdnA4ZHhfc3RhcnRfZGVjb2RlKEJPT0xfREVDT0RFUiAqYnIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9zeik7CisKK3ZvaWQgdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwoQk9PTF9ERUNPREVSICpicik7CisKKy8qVGhlIHJlZmlsbCBsb29wIGlzIHVzZWQgaW4gc2V2ZXJhbCBwbGFjZXMsIHNvIGRlZmluZSBpdCBpbiBhIG1hY3JvIHRvIG1ha2UKKyAgIHN1cmUgdGhleSdyZSBhbGwgY29uc2lzdGVudC4KKyAgQW4gaW5saW5lIGZ1bmN0aW9uIHdvdWxkIGJlIGNsZWFuZXIsIGJ1dCBoYXMgYSBzaWduaWZpY2FudCBwZW5hbHR5LCBiZWNhdXNlCisgICBtdWx0aXBsZSBCT09MX0RFQ09ERVIgZmllbGRzIG11c3QgYmUgbW9kaWZpZWQsIGFuZCB0aGUgY29tcGlsZXIgaXMgbm90IHNtYXJ0CisgICBlbm91Z2ggdG8gZWxpbWluYXRlIHRoZSBzdG9yZXMgdG8gdGhvc2UgZmllbGRzIGFuZCB0aGUgc3Vic2VxdWVudCByZWxvYWRzCisgICBmcm9tIHRoZW0gd2hlbiBpbmxpbmluZyB0aGUgZnVuY3Rpb24uKi8KKyNkZWZpbmUgVlA4RFhfQk9PTF9ERUNPREVSX0ZJTEwoX2NvdW50LF92YWx1ZSxfYnVmcHRyLF9idWZlbmQpIFwKKyAgICBkbyBcCisgICAgeyBcCisgICAgICAgIGludCBzaGlmdCA9IFZQOF9CRF9WQUxVRV9TSVpFIC0gOCAtICgoX2NvdW50KSArIDgpOyBcCisgICAgICAgIGludCBsb29wX2VuZCwgeDsgXAorICAgICAgICBzaXplX3QgYml0c19sZWZ0ID0gKChfYnVmZW5kKS0oX2J1ZnB0cikpKkNIQVJfQklUOyBcCisgICAgICAgIFwKKyAgICAgICAgeCA9IChpbnQpKHNoaWZ0ICsgQ0hBUl9CSVQgLSBiaXRzX2xlZnQpOyBcCisgICAgICAgIGxvb3BfZW5kID0gMDsgXAorICAgICAgICBpZih4ID49IDApIFwKKyAgICAgICAgeyBcCisgICAgICAgICAgICAoX2NvdW50KSArPSBWUDhfTE9UU19PRl9CSVRTOyBcCisgICAgICAgICAgICBsb29wX2VuZCA9IHg7IFwKKyAgICAgICAgICAgIGlmKCFiaXRzX2xlZnQpIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgICB3aGlsZShzaGlmdCA+PSBsb29wX2VuZCkgXAorICAgICAgICB7IFwKKyAgICAgICAgICAgIChfY291bnQpICs9IENIQVJfQklUOyBcCisgICAgICAgICAgICAoX3ZhbHVlKSB8PSAoVlA4X0JEX1ZBTFVFKSooX2J1ZnB0cikrKyA8PCBzaGlmdDsgXAorICAgICAgICAgICAgc2hpZnQgLT0gQ0hBUl9CSVQ7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgd2hpbGUoMCkgXAorCisKK3N0YXRpYyBpbnQgdnA4ZHhfZGVjb2RlX2Jvb2woQk9PTF9ERUNPREVSICpiciwgaW50IHByb2JhYmlsaXR5KSB7CisgICAgdW5zaWduZWQgaW50IGJpdCA9IDA7CisgICAgVlA4X0JEX1ZBTFVFIHZhbHVlOworICAgIHVuc2lnbmVkIGludCBzcGxpdDsKKyAgICBWUDhfQkRfVkFMVUUgYmlnc3BsaXQ7CisgICAgaW50IGNvdW50OworICAgIHVuc2lnbmVkIGludCByYW5nZTsKKworICAgIHNwbGl0ID0gMSArICgoKGJyLT5yYW5nZSAtIDEpICogcHJvYmFiaWxpdHkpID4+IDgpOworCisgICAgaWYoYnItPmNvdW50IDwgMCkKKyAgICAgICAgdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwoYnIpOworCisgICAgdmFsdWUgPSBici0+dmFsdWU7CisgICAgY291bnQgPSBici0+Y291bnQ7CisKKyAgICBiaWdzcGxpdCA9IChWUDhfQkRfVkFMVUUpc3BsaXQgPDwgKFZQOF9CRF9WQUxVRV9TSVpFIC0gOCk7CisKKyAgICByYW5nZSA9IHNwbGl0OworCisgICAgaWYgKHZhbHVlID49IGJpZ3NwbGl0KQorICAgIHsKKyAgICAgICAgcmFuZ2UgPSBici0+cmFuZ2UgLSBzcGxpdDsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZSAtIGJpZ3NwbGl0OworICAgICAgICBiaXQgPSAxOworICAgIH0KKworICAgIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHNoaWZ0ID0gdnA4X25vcm1bcmFuZ2VdOworICAgICAgICByYW5nZSA8PD0gc2hpZnQ7CisgICAgICAgIHZhbHVlIDw8PSBzaGlmdDsKKyAgICAgICAgY291bnQgLT0gc2hpZnQ7CisgICAgfQorICAgIGJyLT52YWx1ZSA9IHZhbHVlOworICAgIGJyLT5jb3VudCA9IGNvdW50OworICAgIGJyLT5yYW5nZSA9IHJhbmdlOworCisgICAgcmV0dXJuIGJpdDsKK30KKworc3RhdGljIGludCB2cDhfZGVjb2RlX3ZhbHVlKEJPT0xfREVDT0RFUiAqYnIsIGludCBiaXRzKQoreworICAgIGludCB6ID0gMDsKKyAgICBpbnQgYml0OworCisgICAgZm9yIChiaXQgPSBiaXRzIC0gMTsgYml0ID49IDA7IGJpdC0tKQorICAgIHsKKyAgICAgICAgeiB8PSAodnA4ZHhfZGVjb2RlX2Jvb2woYnIsIDB4ODApIDw8IGJpdCk7CisgICAgfQorCisgICAgcmV0dXJuIHo7Cit9CisKK3N0YXRpYyBpbnQgdnA4ZHhfYm9vbF9lcnJvcihCT09MX0RFQ09ERVIgKmJyKQoreworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBWYXJpYWJsZSAnY291bnQnIHN0b3JlcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlICd2YWx1ZScgYnVmZmVyLCBtaW51cworICAgICAqIDguIFRoZSB0b3AgYnl0ZSBpcyBwYXJ0IG9mIHRoZSBhbGdvcml0aG0sIGFuZCB0aGUgcmVtYWluZGVyIGlzIGJ1ZmZlcmVkCisgICAgICogdG8gYmUgc2hpZnRlZCBpbnRvIGl0LiBTbyBpZiBjb3VudCA9PSA4LCB0aGUgdG9wIDE2IGJpdHMgb2YgJ3ZhbHVlJyBhcmUKKyAgICAgKiBvY2N1cGllZCwgOCBmb3IgdGhlIGFsZ29yaXRobSBhbmQgOCBpbiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogV2hlbiByZWFkaW5nIGEgYnl0ZSBmcm9tIHRoZSB1c2VyJ3MgYnVmZmVyLCBjb3VudCBpcyBmaWxsZWQgd2l0aCA4IGFuZAorICAgICAqIG9uZSBieXRlIGlzIGZpbGxlZCBpbnRvIHRoZSB2YWx1ZSBidWZmZXIuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBkYXRhLCBjb3VudCBpcyBhZGRpdGlvbmFsbHkgZmlsbGVkIHdpdGggVlA4X0xPVFNfT0ZfQklUUy4gU28gd2hlbgorICAgICAqIGNvdW50ID09IFZQOF9MT1RTX09GX0JJVFMgLSAxLCB0aGUgdXNlcidzIGRhdGEgaGFzIGJlZW4gZXhoYXVzdGVkLgorICAgICAqLworICAgIGlmICgoYnItPmNvdW50ID4gVlA4X0JEX1ZBTFVFX1NJWkUpICYmIChici0+Y291bnQgPCBWUDhfTE9UU19PRl9CSVRTKSkKKyAgICB7CisgICAgICAgLyogV2UgaGF2ZSB0cmllZCB0byBkZWNvZGUgYml0cyBhZnRlciB0aGUgZW5kIG9mCisgICAgICAgICogc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogTm8gZXJyb3IuICovCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZGVjb2Rlci9kZWNvZGVtdi5jIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2RlY29kZW12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyN2EwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZGVjb2Rlci9kZWNvZGVtdi5jCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInRyZWVyZWFkZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltdi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW1vZGUuaCIKKyNpbmNsdWRlICJvbnl4ZF9pbnQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKKworI2lmIENPTkZJR19ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCitzdGF0aWMgQl9QUkVESUNUSU9OX01PREUgcmVhZF9ibW9kZSh2cDhfcmVhZGVyICpiYywgY29uc3QgdnA4X3Byb2IgKnApCit7CisgICAgY29uc3QgaW50IGkgPSB2cDhfdHJlZWRfcmVhZChiYywgdnA4X2Jtb2RlX3RyZWUsIHApOworCisgICAgcmV0dXJuIChCX1BSRURJQ1RJT05fTU9ERSlpOworfQorCitzdGF0aWMgTUJfUFJFRElDVElPTl9NT0RFIHJlYWRfeW1vZGUodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQoreworICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF95bW9kZV90cmVlLCBwKTsKKworICAgIHJldHVybiAoTUJfUFJFRElDVElPTl9NT0RFKWk7Cit9CisKK3N0YXRpYyBNQl9QUkVESUNUSU9OX01PREUgcmVhZF9rZl95bW9kZSh2cDhfcmVhZGVyICpiYywgY29uc3QgdnA4X3Byb2IgKnApCit7CisgICAgY29uc3QgaW50IGkgPSB2cDhfdHJlZWRfcmVhZChiYywgdnA4X2tmX3ltb2RlX3RyZWUsIHApOworCisgICAgcmV0dXJuIChNQl9QUkVESUNUSU9OX01PREUpaTsKK30KKworc3RhdGljIE1CX1BSRURJQ1RJT05fTU9ERSByZWFkX3V2X21vZGUodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQoreworICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF91dl9tb2RlX3RyZWUsIHApOworCisgICAgcmV0dXJuIChNQl9QUkVESUNUSU9OX01PREUpaTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9rZl9tb2RlcyhWUDhEX0NPTVAgKnBiaSwgTU9ERV9JTkZPICptaSkKK3sKKyAgICB2cDhfcmVhZGVyICpjb25zdCBiYyA9ICYgcGJpLT5tYmNbOF07CisgICAgY29uc3QgaW50IG1pcyA9IHBiaS0+Y29tbW9uLm1vZGVfaW5mb19zdHJpZGU7CisKKyAgICBtaS0+bWJtaS5yZWZfZnJhbWUgPSBJTlRSQV9GUkFNRTsKKyAgICBtaS0+bWJtaS5tb2RlID0gcmVhZF9rZl95bW9kZShiYywgdnA4X2tmX3ltb2RlX3Byb2IpOworCisgICAgaWYgKG1pLT5tYm1pLm1vZGUgPT0gQl9QUkVEKQorICAgIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBtaS0+bWJtaS5pc180eDQgPSAxOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEEgPSBhYm92ZV9ibG9ja19tb2RlKG1pLCBpLCBtaXMpOworICAgICAgICAgICAgY29uc3QgQl9QUkVESUNUSU9OX01PREUgTCA9IGxlZnRfYmxvY2tfbW9kZShtaSwgaSk7CisKKyAgICAgICAgICAgIG1pLT5ibWlbaV0uYXNfbW9kZSA9CisgICAgICAgICAgICAgICAgcmVhZF9ibW9kZShiYywgdnA4X2tmX2Jtb2RlX3Byb2IgW0FdIFtMXSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCsraSA8IDE2KTsKKyAgICB9CisKKyAgICBtaS0+bWJtaS51dl9tb2RlID0gcmVhZF91dl9tb2RlKGJjLCB2cDhfa2ZfdXZfbW9kZV9wcm9iKTsKK30KKworc3RhdGljIGludCByZWFkX212Y29tcG9uZW50KHZwOF9yZWFkZXIgKnIsIGNvbnN0IE1WX0NPTlRFWFQgKm12YykKK3sKKyAgICBjb25zdCB2cDhfcHJvYiAqY29uc3QgcCA9IChjb25zdCB2cDhfcHJvYiAqKSBtdmM7CisgICAgaW50IHggPSAwOworCisgICAgaWYgKHZwOF9yZWFkKHIsIHAgW212cGlzX3Nob3J0XSkpICAvKiBMYXJnZSAqLworICAgIHsKKyAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0gdnA4X3JlYWQociwgcCBbTVZQYml0cyArIGldKSA8PCBpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2kgPCAzKTsKKworICAgICAgICBpID0gbXZsb25nX3dpZHRoIC0gMTsgIC8qIFNraXAgYml0IDMsIHdoaWNoIGlzIHNvbWV0aW1lcyBpbXBsaWNpdCAqLworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0gdnA4X3JlYWQociwgcCBbTVZQYml0cyArIGldKSA8PCBpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWkgPiAzKTsKKworICAgICAgICBpZiAoISh4ICYgMHhGRkYwKSAgfHwgIHZwOF9yZWFkKHIsIHAgW01WUGJpdHMgKyAzXSkpCisgICAgICAgICAgICB4ICs9IDg7CisgICAgfQorICAgIGVsc2UgICAvKiBzbWFsbCAqLworICAgICAgICB4ID0gdnA4X3RyZWVkX3JlYWQociwgdnA4X3NtYWxsX212dHJlZSwgcCArIE1WUHNob3J0KTsKKworICAgIGlmICh4ICAmJiAgdnA4X3JlYWQociwgcCBbTVZQc2lnbl0pKQorICAgICAgICB4ID0gLXg7CisKKyAgICByZXR1cm4geDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9tdih2cDhfcmVhZGVyICpyLCBNViAqbXYsIGNvbnN0IE1WX0NPTlRFWFQgKm12YykKK3sKKyAgICBtdi0+cm93ID0gKHNob3J0KShyZWFkX212Y29tcG9uZW50KHIsICAgbXZjKSA8PCAxKTsKKyAgICBtdi0+Y29sID0gKHNob3J0KShyZWFkX212Y29tcG9uZW50KHIsICsrbXZjKSA8PCAxKTsKK30KKworCitzdGF0aWMgdm9pZCByZWFkX212Y29udGV4dHModnA4X3JlYWRlciAqYmMsIE1WX0NPTlRFWFQgKm12YykKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgY29uc3QgdnA4X3Byb2IgKnVwID0gdnA4X212X3VwZGF0ZV9wcm9ic1tpXS5wcm9iOworICAgICAgICB2cDhfcHJvYiAqcCA9ICh2cDhfcHJvYiAqKShtdmMgKyBpKTsKKyAgICAgICAgdnA4X3Byb2IgKmNvbnN0IHBzdG9wID0gcCArIE1WUGNvdW50OworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2cDhfcmVhZChiYywgKnVwKyspKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIHggPSAodnA4X3Byb2IpdnA4X3JlYWRfbGl0ZXJhbChiYywgNyk7CisKKyAgICAgICAgICAgICAgICAqcCA9IHggPyB4IDw8IDEgOiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK3AgPCBwc3RvcCk7CisgICAgfQorICAgIHdoaWxlICgrK2kgPCAyKTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWJzcGxpdF9maWxsX2NvdW50WzRdID0gezgsIDgsIDQsIDF9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWJzcGxpdF9maWxsX29mZnNldFs0XVsxNl0gPSB7CisgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNX0sCisgICAgeyAwLCAgMSwgIDQsICA1LCAgOCwgIDksIDEyLCAxMywgIDIsICAzLCAgIDYsICA3LCAxMCwgMTEsIDE0LCAxNX0sCisgICAgeyAwLCAgMSwgIDQsICA1LCAgMiwgIDMsICA2LCAgNywgIDgsICA5LCAgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX0sCisgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNX0KK307CisKKworc3RhdGljIHZvaWQgbWJfbW9kZV9tdl9pbml0KFZQOERfQ09NUCAqcGJpKQoreworICAgIHZwOF9yZWFkZXIgKmNvbnN0IGJjID0gJiBwYmktPm1iY1s4XTsKKyAgICBNVl9DT05URVhUICpjb25zdCBtdmMgPSBwYmktPmNvbW1vbi5mYy5tdmM7CisKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAvKiBEZWZhdWx0IGlzIHRoYXQgbm8gbWFjcm9ibG9jayBpcyBjb3JydXB0LCB0aGVyZWZvcmUgd2UgaW5pdGlhbGl6ZQorICAgICAqIG12c19jb3JydXB0X2Zyb21fbWIgdG8gc29tZXRoaW5nIHZlcnkgYmlnLCB3aGljaCB3ZSBjYW4gYmUgc3VyZSBpcworICAgICAqIG91dHNpZGUgdGhlIGZyYW1lLiAqLworICAgIHBiaS0+bXZzX2NvcnJ1cHRfZnJvbV9tYiA9IFVJTlRfTUFYOworI2VuZGlmCisgICAgLyogUmVhZCB0aGUgbWJfbm9fY29lZmZfc2tpcCBmbGFnICovCisgICAgcGJpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCA9IChpbnQpdnA4X3JlYWRfYml0KGJjKTsKKworICAgIHBiaS0+cHJvYl9za2lwX2ZhbHNlID0gMDsKKyAgICBpZiAocGJpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCkKKyAgICAgICAgcGJpLT5wcm9iX3NraXBfZmFsc2UgPSAodnA4X3Byb2IpdnA4X3JlYWRfbGl0ZXJhbChiYywgOCk7CisKKyAgICBpZihwYmktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIHBiaS0+cHJvYl9pbnRyYSA9ICh2cDhfcHJvYil2cDhfcmVhZF9saXRlcmFsKGJjLCA4KTsKKyAgICAgICAgcGJpLT5wcm9iX2xhc3QgID0gKHZwOF9wcm9iKXZwOF9yZWFkX2xpdGVyYWwoYmMsIDgpOworICAgICAgICBwYmktPnByb2JfZ2YgICAgPSAodnA4X3Byb2IpdnA4X3JlYWRfbGl0ZXJhbChiYywgOCk7CisKKyAgICAgICAgaWYgKHZwOF9yZWFkX2JpdChiYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYmktPmNvbW1vbi5mYy55bW9kZV9wcm9iW2ldID0KKyAgICAgICAgICAgICAgICAgICAgKHZwOF9wcm9iKSB2cDhfcmVhZF9saXRlcmFsKGJjLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2kgPCA0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGJpLT5jb21tb24uZmMudXZfbW9kZV9wcm9iW2ldID0KKyAgICAgICAgICAgICAgICAgICAgKHZwOF9wcm9iKSB2cDhfcmVhZF9saXRlcmFsKGJjLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2kgPCAzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRfbXZjb250ZXh0cyhiYywgbXZjKTsKKyAgICB9Cit9CisKK2NvbnN0IHZwOF9wcm9iIHZwOF9zdWJfbXZfcmVmX3Byb2IzIFs4XVtWUDhfU1VCTVZSRUZTLTFdID0KK3sKKyAgICB7IDE0NywgMTM2LCAxOCB9LCAgIC8qIFNVQk1WUkVGX05PUk1BTCAgICAgICAgICAqLworICAgIHsgMjIzLCAxICAsIDM0IH0sICAgLyogU1VCTVZSRUZfTEVGVF9BQk9WRV9TQU1FICovCisgICAgeyAxMDYsIDE0NSwgMSAgfSwgICAvKiBTVUJNVlJFRl9MRUZUX1pFRCAgICAgICAgKi8KKyAgICB7IDIwOCwgMSAgLCAxICB9LCAgIC8qIFNVQk1WUkVGX0xFRlRfQUJPVkVfWkVEICAqLworICAgIHsgMTc5LCAxMjEsIDEgIH0sICAgLyogU1VCTVZSRUZfQUJPVkVfWkVEICAgICAgICovCisgICAgeyAyMjMsIDEgICwgMzQgfSwgICAvKiBTVUJNVlJFRl9MRUZUX0FCT1ZFX1NBTUUgKi8KKyAgICB7IDE3OSwgMTIxLCAxICB9LCAgIC8qIFNVQk1WUkVGX0FCT1ZFX1pFRCAgICAgICAqLworICAgIHsgMjA4LCAxICAsIDEgIH0gICAgLyogU1VCTVZSRUZfTEVGVF9BQk9WRV9aRUQgICovCit9OworCitzdGF0aWMKK2NvbnN0IHZwOF9wcm9iICogZ2V0X3N1Yl9tdl9yZWZfcHJvYihjb25zdCBpbnQgbGVmdCwgY29uc3QgaW50IGFib3ZlKQoreworICAgIGludCBsZXogPSAobGVmdCA9PSAwKTsKKyAgICBpbnQgYWV6ID0gKGFib3ZlID09IDApOworICAgIGludCBsZWEgPSAobGVmdCA9PSBhYm92ZSk7CisgICAgY29uc3QgdnA4X3Byb2IgKiBwcm9iOworCisgICAgcHJvYiA9IHZwOF9zdWJfbXZfcmVmX3Byb2IzWyhhZXogPDwgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV6IDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlYSldOworCisgICAgcmV0dXJuIHByb2I7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9zcGxpdF9tdih2cDhfcmVhZGVyICpjb25zdCBiYywgTU9ERV9JTkZPICptaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1PREVfSU5GTyAqbGVmdF9tYiwgY29uc3QgTU9ERV9JTkZPICphYm92ZV9tYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CX01PREVfSU5GTyAqbWJtaSwgaW50X212IGJlc3RfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICBNVl9DT05URVhUICpjb25zdCBtdmMsIGludCBtYl90b19sZWZ0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdG9fcmlnaHRfZWRnZSwgaW50IG1iX3RvX3RvcF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3RvX2JvdHRvbV9lZGdlKQoreworICAgIGludCBzOyAgICAgIC8qIHNwbGl0IGNvbmZpZ3VyYXRpb24gKDE2eDgsIDh4MTYsIDh4OCwgNHg0KSAqLworICAgIGludCBudW1fcDsgIC8qIG51bWJlciBvZiBwYXJ0aXRpb25zIGluIHRoZSBzcGxpdCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAoc2VlIHZwOF9tYnNwbGl0X2NvdW50KSAqLworICAgIGludCBqID0gMDsKKworICAgIHMgPSAzOworICAgIG51bV9wID0gMTY7CisgICAgaWYoIHZwOF9yZWFkKGJjLCAxMTApICkKKyAgICB7CisgICAgICAgIHMgPSAyOworICAgICAgICBudW1fcCA9IDQ7CisgICAgICAgIGlmKCB2cDhfcmVhZChiYywgMTExKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgPSB2cDhfcmVhZChiYywgMTUwKTsKKyAgICAgICAgICAgIG51bV9wID0gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRvICAvKiBmb3IgZWFjaCBzdWJzZXQgaiAqLworICAgIHsKKyAgICAgICAgaW50X212IGxlZnRtdiwgYWJvdmVtdjsKKyAgICAgICAgaW50X212IGJsb2NrbXY7CisgICAgICAgIGludCBrOyAgLyogZmlyc3QgYmxvY2sgaW4gc3Vic2V0IGogKi8KKworICAgICAgICBjb25zdCB2cDhfcHJvYiAqcHJvYjsKKyAgICAgICAgayA9IHZwOF9tYnNwbGl0X29mZnNldFtzXVtqXTsKKworICAgICAgICBpZiAoIShrICYgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9uIEwgZWRnZSwgZ2V0IGZyb20gTUIgdG8gbGVmdCBvZiB1cyAqLworICAgICAgICAgICAgaWYobGVmdF9tYi0+bWJtaS5tb2RlICE9IFNQTElUTVYpCisgICAgICAgICAgICAgICAgbGVmdG12LmFzX2ludCA9ICBsZWZ0X21iLT5tYm1pLm12LmFzX2ludDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZWZ0bXYuYXNfaW50ID0gIChsZWZ0X21iLT5ibWkgKyBrICsgNCAtIDEpLT5tdi5hc19pbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVmdG12LmFzX2ludCA9ICAobWktPmJtaSArIGsgLSAxKS0+bXYuYXNfaW50OworCisgICAgICAgIGlmICghKGsgPj4gMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9uIHRvcCBlZGdlLCBnZXQgZnJvbSBNQiBhYm92ZSB1cyAqLworICAgICAgICAgICAgaWYoYWJvdmVfbWItPm1ibWkubW9kZSAhPSBTUExJVE1WKQorICAgICAgICAgICAgICAgIGFib3ZlbXYuYXNfaW50ID0gIGFib3ZlX21iLT5tYm1pLm12LmFzX2ludDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhYm92ZW12LmFzX2ludCA9ICAoYWJvdmVfbWItPmJtaSArIGsgKyAxNiAtIDQpLT5tdi5hc19pbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWJvdmVtdi5hc19pbnQgPSAobWktPmJtaSArIGsgLSA0KS0+bXYuYXNfaW50OworCisgICAgICAgIHByb2IgPSBnZXRfc3ViX212X3JlZl9wcm9iKGxlZnRtdi5hc19pbnQsIGFib3ZlbXYuYXNfaW50KTsKKworICAgICAgICBpZiggdnA4X3JlYWQoYmMsIHByb2JbMF0pICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHZwOF9yZWFkKGJjLCBwcm9iWzFdKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2ttdi5hc19pbnQgPSAwOworICAgICAgICAgICAgICAgIGlmKCB2cDhfcmVhZChiYywgcHJvYlsyXSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2ttdi5hc19tdi5yb3cgPSByZWFkX212Y29tcG9uZW50KGJjLCAmbXZjWzBdKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBibG9ja212LmFzX212LnJvdyArPSBiZXN0X212LmFzX212LnJvdzsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2ttdi5hc19tdi5jb2wgPSByZWFkX212Y29tcG9uZW50KGJjLCAmbXZjWzFdKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBibG9ja212LmFzX212LmNvbCArPSBiZXN0X212LmFzX212LmNvbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2ttdi5hc19pbnQgPSBhYm92ZW12LmFzX2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrbXYuYXNfaW50ID0gbGVmdG12LmFzX2ludDsKKyAgICAgICAgfQorCisgICAgICAgIG1ibWktPm5lZWRfdG9fY2xhbXBfbXZzIHw9IHZwOF9jaGVja19tdl9ib3VuZHMoJmJsb2NrbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3RvX2xlZnRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfdG9fcmlnaHRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfdG9fdG9wX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3RvX2JvdHRvbV9lZGdlKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvKiBGaWxsICh1bmlmb3JtKSBtb2RlcywgbXZzIG9mIGp0aCBzdWJzZXQuCisgICAgICAgICAgICAgTXVzdCBkbyBpdCBoZXJlIGJlY2F1c2UgZW5zdWluZyBzdWJzZXRzIGNhbgorICAgICAgICAgICAgIHJlZmVyIGJhY2sgdG8gdXMgdmlhICJsZWZ0IiBvciAiYWJvdmUiLiAqLworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZmlsbF9vZmZzZXQ7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmlsbF9jb3VudCA9IG1ic3BsaXRfZmlsbF9jb3VudFtzXTsKKworICAgICAgICAgICAgZmlsbF9vZmZzZXQgPSAmbWJzcGxpdF9maWxsX29mZnNldFtzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHVuc2lnbmVkIGNoYXIpaiAqIG1ic3BsaXRfZmlsbF9jb3VudFtzXV07CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtaS0+Ym1pWyAqZmlsbF9vZmZzZXRdLm12LmFzX2ludCA9IGJsb2NrbXYuYXNfaW50OworICAgICAgICAgICAgICAgIGZpbGxfb2Zmc2V0Kys7CisgICAgICAgICAgICB9d2hpbGUgKC0tZmlsbF9jb3VudCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICB3aGlsZSAoKytqIDwgbnVtX3ApOworCisgICAgbWJtaS0+cGFydGl0aW9uaW5nID0gczsKK30KKworc3RhdGljIHZvaWQgcmVhZF9tYl9tb2Rlc19tdihWUDhEX0NPTVAgKnBiaSwgTU9ERV9JTkZPICptaSwgTUJfTU9ERV9JTkZPICptYm1pKQoreworICAgIHZwOF9yZWFkZXIgKmNvbnN0IGJjID0gJiBwYmktPm1iY1s4XTsKKyAgICBtYm1pLT5yZWZfZnJhbWUgPSAoTVZfUkVGRVJFTkNFX0ZSQU1FKSB2cDhfcmVhZChiYywgcGJpLT5wcm9iX2ludHJhKTsKKyAgICBpZiAobWJtaS0+cmVmX2ZyYW1lKSAgICAvKiBpbnRlciBNQiAqLworICAgIHsKKyAgICAgICAgZW51bSB7Q05UX0lOVFJBLCBDTlRfTkVBUkVTVCwgQ05UX05FQVIsIENOVF9TUExJVE1WfTsKKyAgICAgICAgaW50IGNudFs0XTsKKyAgICAgICAgaW50ICpjbnR4ID0gY250OworICAgICAgICBpbnRfbXYgbmVhcl9tdnNbNF07CisgICAgICAgIGludF9tdiAqbm12ID0gbmVhcl9tdnM7CisgICAgICAgIGNvbnN0IGludCBtaXMgPSBwYmktPm1iLm1vZGVfaW5mb19zdHJpZGU7CisgICAgICAgIGNvbnN0IE1PREVfSU5GTyAqYWJvdmUgPSBtaSAtIG1pczsKKyAgICAgICAgY29uc3QgTU9ERV9JTkZPICpsZWZ0ID0gbWkgLSAxOworICAgICAgICBjb25zdCBNT0RFX0lORk8gKmFib3ZlbGVmdCA9IGFib3ZlIC0gMTsKKyAgICAgICAgaW50ICpyZWZfZnJhbWVfc2lnbl9iaWFzID0gcGJpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhczsKKworICAgICAgICBtYm1pLT5uZWVkX3RvX2NsYW1wX212cyA9IDA7CisKKyAgICAgICAgaWYgKHZwOF9yZWFkKGJjLCBwYmktPnByb2JfbGFzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1ibWktPnJlZl9mcmFtZSA9CisgICAgICAgICAgICAgICAgKE1WX1JFRkVSRU5DRV9GUkFNRSkoKGludCkoMiArIHZwOF9yZWFkKGJjLCBwYmktPnByb2JfZ2YpKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBaZXJvIGFjY3VtdWxhdG9ycyAqLworICAgICAgICBubXZbMF0uYXNfaW50ID0gbm12WzFdLmFzX2ludCA9IG5tdlsyXS5hc19pbnQgPSAwOworICAgICAgICBjbnRbMF0gPSBjbnRbMV0gPSBjbnRbMl0gPSBjbnRbM10gPSAwOworCisgICAgICAgIC8qIFByb2Nlc3MgYWJvdmUgKi8KKyAgICAgICAgaWYgKGFib3ZlLT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFib3ZlLT5tYm1pLm12LmFzX2ludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKytubXYpLT5hc19pbnQgPSBhYm92ZS0+bWJtaS5tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2Fib3ZlLT5tYm1pLnJlZl9mcmFtZV0sCisgICAgICAgICAgICAgICAgICAgICAgICBtYm1pLT5yZWZfZnJhbWUsIG5tdiwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisgICAgICAgICAgICAgICAgKytjbnR4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqY250eCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgLyogUHJvY2VzcyBsZWZ0ICovCisgICAgICAgIGlmIChsZWZ0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlZnQtPm1ibWkubXYuYXNfaW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludF9tdiB0aGlzX212OworCisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19pbnQgPSBsZWZ0LT5tYm1pLm12LmFzX2ludDsKKyAgICAgICAgICAgICAgICBtdl9iaWFzKHJlZl9mcmFtZV9zaWduX2JpYXNbbGVmdC0+bWJtaS5yZWZfZnJhbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgbWJtaS0+cmVmX2ZyYW1lLCAmdGhpc19tdiwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpc19tdi5hc19pbnQgIT0gbm12LT5hc19pbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKytubXYpLT5hc19pbnQgPSB0aGlzX212LmFzX2ludDsKKyAgICAgICAgICAgICAgICAgICAgKytjbnR4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpjbnR4ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY250W0NOVF9JTlRSQV0gKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFByb2Nlc3MgYWJvdmUgbGVmdCAqLworICAgICAgICBpZiAoYWJvdmVsZWZ0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFib3ZlbGVmdC0+bWJtaS5tdi5hc19pbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50X212IHRoaXNfbXY7CisKKyAgICAgICAgICAgICAgICB0aGlzX212LmFzX2ludCA9IGFib3ZlbGVmdC0+bWJtaS5tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2Fib3ZlbGVmdC0+bWJtaS5yZWZfZnJhbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgbWJtaS0+cmVmX2ZyYW1lLCAmdGhpc19tdiwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpc19tdi5hc19pbnQgIT0gbm12LT5hc19pbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKytubXYpLT5hc19pbnQgPSB0aGlzX212LmFzX2ludDsKKyAgICAgICAgICAgICAgICAgICAgKytjbnR4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpjbnR4ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY250W0NOVF9JTlRSQV0gKz0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2cDhfcmVhZChiYywgdnA4X21vZGVfY29udGV4dHMgW2NudFtDTlRfSU5UUkFdXSBbMF0pICkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHRocmVlIGRpc3RpbmN0IE1WJ3MgLi4uICovCisgICAgICAgICAgICAvKiBTZWUgaWYgYWJvdmUtbGVmdCBNViBjYW4gYmUgbWVyZ2VkIHdpdGggTkVBUkVTVCAqLworICAgICAgICAgICAgY250W0NOVF9ORUFSRVNUXSArPSAoIChjbnRbQ05UX1NQTElUTVZdID4gMCkgJgorICAgICAgICAgICAgICAgIChubXYtPmFzX2ludCA9PSBuZWFyX212c1tDTlRfTkVBUkVTVF0uYXNfaW50KSk7CisKKyAgICAgICAgICAgIC8qIFN3YXAgbmVhciBhbmQgbmVhcmVzdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIGlmIChjbnRbQ05UX05FQVJdID4gY250W0NOVF9ORUFSRVNUXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IGNudFtDTlRfTkVBUkVTVF07CisgICAgICAgICAgICAgICAgY250W0NOVF9ORUFSRVNUXSA9IGNudFtDTlRfTkVBUl07CisgICAgICAgICAgICAgICAgY250W0NOVF9ORUFSXSA9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZWFyX212c1tDTlRfTkVBUkVTVF0uYXNfaW50OworICAgICAgICAgICAgICAgIG5lYXJfbXZzW0NOVF9ORUFSRVNUXS5hc19pbnQgPSBuZWFyX212c1tDTlRfTkVBUl0uYXNfaW50OworICAgICAgICAgICAgICAgIG5lYXJfbXZzW0NOVF9ORUFSXS5hc19pbnQgPSB0bXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCB2cDhfcmVhZChiYywgdnA4X21vZGVfY29udGV4dHMgW2NudFtDTlRfTkVBUkVTVF1dIFsxXSkgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYoIHZwOF9yZWFkKGJjLCB2cDhfbW9kZV9jb250ZXh0cyBbY250W0NOVF9ORUFSXV0gWzJdKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdG9fdG9wX2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIGludCBtYl90b19ib3R0b21fZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1iX3RvX2xlZnRfZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1iX3RvX3JpZ2h0X2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIE1WX0NPTlRFWFQgKmNvbnN0IG12YyA9IHBiaS0+Y29tbW9uLmZjLm12YzsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5lYXJfaW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgbWJfdG9fdG9wX2VkZ2UgPSBwYmktPm1iLm1iX3RvX3RvcF9lZGdlOworICAgICAgICAgICAgICAgICAgICBtYl90b19ib3R0b21fZWRnZSA9IHBiaS0+bWIubWJfdG9fYm90dG9tX2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIG1iX3RvX3RvcF9lZGdlIC09IExFRlRfVE9QX01BUkdJTjsKKyAgICAgICAgICAgICAgICAgICAgbWJfdG9fYm90dG9tX2VkZ2UgKz0gUklHSFRfQk9UVE9NX01BUkdJTjsKKyAgICAgICAgICAgICAgICAgICAgbWJfdG9fcmlnaHRfZWRnZSA9IHBiaS0+bWIubWJfdG9fcmlnaHRfZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgbWJfdG9fcmlnaHRfZWRnZSArPSBSSUdIVF9CT1RUT01fTUFSR0lOOworICAgICAgICAgICAgICAgICAgICBtYl90b19sZWZ0X2VkZ2UgPSBwYmktPm1iLm1iX3RvX2xlZnRfZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgbWJfdG9fbGVmdF9lZGdlIC09IExFRlRfVE9QX01BUkdJTjsKKworICAgICAgICAgICAgICAgICAgICAvKiBVc2UgbmVhcl9tdnNbMF0gdG8gc3RvcmUgdGhlICJiZXN0IiBNViAqLworICAgICAgICAgICAgICAgICAgICBuZWFyX2luZGV4ID0gQ05UX0lOVFJBICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChjbnRbQ05UX05FQVJFU1RdID49IGNudFtDTlRfSU5UUkFdKTsKKworICAgICAgICAgICAgICAgICAgICB2cDhfY2xhbXBfbXYyKCZuZWFyX212c1tuZWFyX2luZGV4XSwgJnBiaS0+bWIpOworCisgICAgICAgICAgICAgICAgICAgIGNudFtDTlRfU1BMSVRNVl0gPSAoKGFib3ZlLT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChsZWZ0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikpICogMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYWJvdmVsZWZ0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHZwOF9yZWFkKGJjLCB2cDhfbW9kZV9jb250ZXh0cyBbY250W0NOVF9TUExJVE1WXV0gWzNdKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9zcGxpdF9tdihiYywgbWksIGxlZnQsIGFib3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVhcl9tdnNbbmVhcl9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZjLCBtYl90b19sZWZ0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfdG9fcmlnaHRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b190b3BfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b19ib3R0b21fZWRnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYm1pLT5tdi5hc19pbnQgPSBtaS0+Ym1pWzE1XS5tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYm1pLT5tb2RlID0gIFNQTElUTVY7CisgICAgICAgICAgICAgICAgICAgICAgICBtYm1pLT5pc180eDQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50X212ICpjb25zdCBtYm1pX212ID0gJiBtYm1pLT5tdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbXYoYmMsICZtYm1pX212LT5hc19tdiwgKGNvbnN0IE1WX0NPTlRFWFQgKikgbXZjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ibWlfbXYtPmFzX212LnJvdyArPSBuZWFyX212c1tuZWFyX2luZGV4XS5hc19tdi5yb3c7CisgICAgICAgICAgICAgICAgICAgICAgICBtYm1pX212LT5hc19tdi5jb2wgKz0gbmVhcl9tdnNbbmVhcl9pbmRleF0uYXNfbXYuY29sOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBuZWVkIHRvIGNoZWNrIHRoaXMgb24gTkVBUk1WIGFuZCBORUFSRVNUTVYKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGVzIHNpbmNlIHRob3NlIG1vZGVzIGNsYW1wIHRoZSBNVi4gVGhlIE5FV01WIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvZXMgbm90LCBzbyBzaWduYWwgdG8gdGhlIHByZWRpY3Rpb24gc3RhZ2Ugd2hldGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogc3BlY2lhbCBoYW5kbGluZyBtYXkgYmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ibWktPm5lZWRfdG9fY2xhbXBfbXZzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfY2hlY2tfbXZfYm91bmRzKG1ibWlfbXYsIG1iX3RvX2xlZnRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3RvX3JpZ2h0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b190b3BfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3RvX2JvdHRvbV9lZGdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ibWktPm1vZGUgPSAgTkVXTVY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWJtaS0+bW9kZSA9ICBORUFSTVY7CisgICAgICAgICAgICAgICAgICAgIHZwOF9jbGFtcF9tdjIoJm5lYXJfbXZzW0NOVF9ORUFSXSwgJnBiaS0+bWIpOworICAgICAgICAgICAgICAgICAgICBtYm1pLT5tdi5hc19pbnQgPSBuZWFyX212c1tDTlRfTkVBUl0uYXNfaW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYm1pLT5tb2RlID0gIE5FQVJFU1RNVjsKKyAgICAgICAgICAgICAgICB2cDhfY2xhbXBfbXYyKCZuZWFyX212c1tDTlRfTkVBUkVTVF0sICZwYmktPm1iKTsKKyAgICAgICAgICAgICAgICBtYm1pLT5tdi5hc19pbnQgPSBuZWFyX212c1tDTlRfTkVBUkVTVF0uYXNfaW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWJtaS0+bW9kZSA9ICBaRVJPTVY7CisgICAgICAgICAgICBtYm1pLT5tdi5hc19pbnQgPSAwOworICAgICAgICB9CisKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAgICAgaWYocGJpLT5lY19lbmFibGVkICYmIChtYm1pLT5tb2RlICE9IFNQTElUTVYpKQorICAgICAgICB7CisgICAgICAgICAgICBtaS0+Ym1pWyAwXS5tdi5hc19pbnQgPQorICAgICAgICAgICAgbWktPmJtaVsgMV0ubXYuYXNfaW50ID0KKyAgICAgICAgICAgIG1pLT5ibWlbIDJdLm12LmFzX2ludCA9CisgICAgICAgICAgICBtaS0+Ym1pWyAzXS5tdi5hc19pbnQgPQorICAgICAgICAgICAgbWktPmJtaVsgNF0ubXYuYXNfaW50ID0KKyAgICAgICAgICAgIG1pLT5ibWlbIDVdLm12LmFzX2ludCA9CisgICAgICAgICAgICBtaS0+Ym1pWyA2XS5tdi5hc19pbnQgPQorICAgICAgICAgICAgbWktPmJtaVsgN10ubXYuYXNfaW50ID0KKyAgICAgICAgICAgIG1pLT5ibWlbIDhdLm12LmFzX2ludCA9CisgICAgICAgICAgICBtaS0+Ym1pWyA5XS5tdi5hc19pbnQgPQorICAgICAgICAgICAgbWktPmJtaVsxMF0ubXYuYXNfaW50ID0KKyAgICAgICAgICAgIG1pLT5ibWlbMTFdLm12LmFzX2ludCA9CisgICAgICAgICAgICBtaS0+Ym1pWzEyXS5tdi5hc19pbnQgPQorICAgICAgICAgICAgbWktPmJtaVsxM10ubXYuYXNfaW50ID0KKyAgICAgICAgICAgIG1pLT5ibWlbMTRdLm12LmFzX2ludCA9CisgICAgICAgICAgICBtaS0+Ym1pWzE1XS5tdi5hc19pbnQgPSBtYm1pLT5tdi5hc19pbnQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiByZXF1aXJlZCBmb3IgbGVmdCBhbmQgYWJvdmUgYmxvY2sgbXYgKi8KKyAgICAgICAgbWJtaS0+bXYuYXNfaW50ID0gMDsKKworICAgICAgICAvKiBNQiBpcyBpbnRyYSBjb2RlZCAqLworICAgICAgICBpZiAoKG1ibWktPm1vZGUgPSByZWFkX3ltb2RlKGJjLCBwYmktPmNvbW1vbi5mYy55bW9kZV9wcm9iKSkgPT0gQl9QUkVEKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBtYm1pLT5pc180eDQgPSAxOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtaS0+Ym1pW2pdLmFzX21vZGUgPSByZWFkX2Jtb2RlKGJjLCBwYmktPmNvbW1vbi5mYy5ibW9kZV9wcm9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2ogPCAxNik7CisgICAgICAgIH0KKworICAgICAgICBtYm1pLT51dl9tb2RlID0gcmVhZF91dl9tb2RlKGJjLCBwYmktPmNvbW1vbi5mYy51dl9tb2RlX3Byb2IpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCByZWFkX21iX2ZlYXR1cmVzKHZwOF9yZWFkZXIgKnIsIE1CX01PREVfSU5GTyAqbWksIE1BQ1JPQkxPQ0tEICp4KQoreworICAgIC8qIElzIHNlZ21lbnRhdGlvbiBlbmFibGVkICovCisgICAgaWYgKHgtPnNlZ21lbnRhdGlvbl9lbmFibGVkICYmIHgtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKQorICAgIHsKKyAgICAgICAgLyogSWYgc28gdGhlbiByZWFkIHRoZSBzZWdtZW50IGlkLiAqLworICAgICAgICBpZiAodnA4X3JlYWQociwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdKSkKKyAgICAgICAgICAgIG1pLT5zZWdtZW50X2lkID0KKyAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoMiArIHZwOF9yZWFkKHIsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1syXSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtaS0+c2VnbWVudF9pZCA9CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKHZwOF9yZWFkKHIsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1sxXSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX21iX21vZGVfbXZzKFZQOERfQ09NUCAqcGJpLCBNT0RFX0lORk8gKm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX01PREVfSU5GTyAqbWJtaSkKK3sKKyAgICAvKiBSZWFkIHRoZSBNYWNyb2Jsb2NrIHNlZ21lbnRhdGlvbiBtYXAgaWYgaXQgaXMgYmVpbmcgdXBkYXRlZCBleHBsaWNpdGx5CisgICAgICogdGhpcyBmcmFtZSAocmVzZXQgdG8gMCBhYm92ZSBieSBkZWZhdWx0KQorICAgICAqIEJ5IGRlZmF1bHQgb24gYSBrZXkgZnJhbWUgcmVzZXQgYWxsIE1CcyB0byBzZWdtZW50IDAKKyAgICAgKi8KKyAgICBpZiAocGJpLT5tYi51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKKyAgICAgICAgcmVhZF9tYl9mZWF0dXJlcygmcGJpLT5tYmNbOF0sICZtaS0+bWJtaSwgJnBiaS0+bWIpOworICAgIGVsc2UgaWYocGJpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgIG1pLT5tYm1pLnNlZ21lbnRfaWQgPSAwOworCisgICAgLyogUmVhZCB0aGUgbWFjcm9ibG9jayBjb2VmZiBza2lwIGZsYWcgaWYgdGhpcyBmZWF0dXJlIGlzIGluIHVzZSwKKyAgICAgKiBlbHNlIGRlZmF1bHQgdG8gMCAqLworICAgIGlmIChwYmktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKQorICAgICAgICBtaS0+bWJtaS5tYl9za2lwX2NvZWZmID0gdnA4X3JlYWQoJnBiaS0+bWJjWzhdLCBwYmktPnByb2Jfc2tpcF9mYWxzZSk7CisgICAgZWxzZQorICAgICAgICBtaS0+bWJtaS5tYl9za2lwX2NvZWZmID0gMDsKKworICAgIG1pLT5tYm1pLmlzXzR4NCA9IDA7CisgICAgaWYocGJpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgIHJlYWRfa2ZfbW9kZXMocGJpLCBtaSk7CisgICAgZWxzZQorICAgICAgICByZWFkX21iX21vZGVzX212KHBiaSwgbWksICZtaS0+bWJtaSk7CisKK30KKwordm9pZCB2cDhfZGVjb2RlX21vZGVfbXZzKFZQOERfQ09NUCAqcGJpKQoreworICAgIE1PREVfSU5GTyAqbWkgPSBwYmktPmNvbW1vbi5taTsKKyAgICBpbnQgbWJfcm93ID0gLTE7CisgICAgaW50IG1iX3RvX3JpZ2h0X2VkZ2Vfc3RhcnQ7CisKKyAgICBtYl9tb2RlX212X2luaXQocGJpKTsKKworICAgIHBiaS0+bWIubWJfdG9fdG9wX2VkZ2UgPSAwOworICAgIHBiaS0+bWIubWJfdG9fYm90dG9tX2VkZ2UgPSAoKHBiaS0+Y29tbW9uLm1iX3Jvd3MgLSAxKSAqIDE2KSA8PCAzOworICAgIG1iX3RvX3JpZ2h0X2VkZ2Vfc3RhcnQgPSAoKHBiaS0+Y29tbW9uLm1iX2NvbHMgLSAxKSAqIDE2KSA8PCAzOworCisgICAgd2hpbGUgKCsrbWJfcm93IDwgcGJpLT5jb21tb24ubWJfcm93cykKKyAgICB7CisgICAgICAgIGludCBtYl9jb2wgPSAtMTsKKworICAgICAgICBwYmktPm1iLm1iX3RvX2xlZnRfZWRnZSA9ICAwOworICAgICAgICBwYmktPm1iLm1iX3RvX3JpZ2h0X2VkZ2UgPSBtYl90b19yaWdodF9lZGdlX3N0YXJ0OworCisgICAgICAgIHdoaWxlICgrK21iX2NvbCA8IHBiaS0+Y29tbW9uLm1iX2NvbHMpCisgICAgICAgIHsKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAgICAgICAgIGludCBtYl9udW0gPSBtYl9yb3cgKiBwYmktPmNvbW1vbi5tYl9jb2xzICsgbWJfY29sOworI2VuZGlmCisKKyAgICAgICAgICAgIGRlY29kZV9tYl9tb2RlX212cyhwYmksIG1pLCAmbWktPm1ibWkpOworCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisgICAgICAgICAgICAvKiBsb29rIGZvciBjb3JydXB0aW9uLiBzZXQgbXZzX2NvcnJ1cHRfZnJvbV9tYiB0byB0aGUgY3VycmVudAorICAgICAgICAgICAgICogbWJfbnVtIGlmIHRoZSBmcmFtZSBpcyBjb3JydXB0IGZyb20gdGhpcyBtYWNyb2Jsb2NrLiAqLworICAgICAgICAgICAgaWYgKHZwOGR4X2Jvb2xfZXJyb3IoJnBiaS0+bWJjWzhdKSAmJiBtYl9udW0gPAorICAgICAgICAgICAgICAgIChpbnQpcGJpLT5tdnNfY29ycnVwdF9mcm9tX21iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBiaS0+bXZzX2NvcnJ1cHRfZnJvbV9tYiA9IG1iX251bTsKKyAgICAgICAgICAgICAgICAvKiBubyBuZWVkIHRvIGNvbnRpbnVlIHNpbmNlIHRoZSBwYXJ0aXRpb24gaXMgY29ycnVwdCBmcm9tCisgICAgICAgICAgICAgICAgICogaGVyZSBvbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgcGJpLT5tYi5tYl90b19sZWZ0X2VkZ2UgLT0gKDE2IDw8IDMpOworICAgICAgICAgICAgcGJpLT5tYi5tYl90b19yaWdodF9lZGdlIC09ICgxNiA8PCAzKTsKKyAgICAgICAgICAgIG1pKys7ICAgICAgIC8qIG5leHQgbWFjcm9ibG9jayAqLworICAgICAgICB9CisgICAgICAgIHBiaS0+bWIubWJfdG9fdG9wX2VkZ2UgLT0gKDE2IDw8IDMpOworICAgICAgICBwYmktPm1iLm1iX3RvX2JvdHRvbV9lZGdlIC09ICgxNiA8PCAzKTsKKworICAgICAgICBtaSsrOyAgICAgICAgICAgLyogc2tpcCBsZWZ0IHByZWRpY3RvciBlYWNoIHJvdyAqLworICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2RlY29kZW12LmggYi9saWJ2cHgvdnA4L2RlY29kZXIvZGVjb2RlbXYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2RlY29kZXIvZGVjb2RlbXYuaApyZW5hbWUgdG8gbGlidnB4L3ZwOC9kZWNvZGVyL2RlY29kZW12LmgKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2RlY29kZXJ0aHJlYWRpbmcuaCBiL2xpYnZweC92cDgvZGVjb2Rlci9kZWNvZGVydGhyZWFkaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9kZWNvZGVyL2RlY29kZXJ0aHJlYWRpbmcuaApyZW5hbWUgdG8gbGlidnB4L3ZwOC9kZWNvZGVyL2RlY29kZXJ0aHJlYWRpbmcuaApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9kZWNvZGVyL2RlY29kZnJhbWUuYyBiL2xpYnZweC92cDgvZGVjb2Rlci9kZWNvZGZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhMDBmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZGVjb2Rlci9kZWNvZGZyYW1lLmMKQEAgLTAsMCArMSwxMzg1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgIm9ueXhkX2ludC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vaGVhZGVyLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludGVyLmgiCisjaW5jbHVkZSAiZGV0b2tlbml6ZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vaW52dHJhbnMuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2FsbG9jY29tbW9uLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcXVhbnRfY29tbW9uLmgiCisjaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaCIKKworI2luY2x1ZGUgImRlY29kZW12LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9leHRlbmQuaCIKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyNpbmNsdWRlICJlcnJvcl9jb25jZWFsbWVudC5oIgorI2VuZGlmCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKKyNpbmNsdWRlICJkZWNvZGVydGhyZWFkaW5nLmgiCisjaW5jbHVkZSAiZGJvb2xodWZmLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIHZwOGN4X2luaXRfZGVfcXVhbnRpemVyKFZQOERfQ09NUCAqcGJpKQoreworICAgIGludCBROworICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKKworICAgIGZvciAoUSA9IDA7IFEgPCBRSU5ERVhfUkFOR0U7IFErKykKKyAgICB7CisgICAgICAgIHBjLT5ZMWRlcXVhbnRbUV1bMF0gPSAoc2hvcnQpdnA4X2RjX3F1YW50KFEsIHBjLT55MWRjX2RlbHRhX3EpOworICAgICAgICBwYy0+WTJkZXF1YW50W1FdWzBdID0gKHNob3J0KXZwOF9kYzJxdWFudChRLCBwYy0+eTJkY19kZWx0YV9xKTsKKyAgICAgICAgcGMtPlVWZGVxdWFudFtRXVswXSA9IChzaG9ydCl2cDhfZGNfdXZfcXVhbnQoUSwgcGMtPnV2ZGNfZGVsdGFfcSk7CisKKyAgICAgICAgcGMtPlkxZGVxdWFudFtRXVsxXSA9IChzaG9ydCl2cDhfYWNfeXF1YW50KFEpOworICAgICAgICBwYy0+WTJkZXF1YW50W1FdWzFdID0gKHNob3J0KXZwOF9hYzJxdWFudChRLCBwYy0+eTJhY19kZWx0YV9xKTsKKyAgICAgICAgcGMtPlVWZGVxdWFudFtRXVsxXSA9IChzaG9ydCl2cDhfYWNfdXZfcXVhbnQoUSwgcGMtPnV2YWNfZGVsdGFfcSk7CisgICAgfQorfQorCit2b2lkIHZwOF9tYl9pbml0X2RlcXVhbnRpemVyKFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeGQpCit7CisgICAgaW50IGk7CisgICAgaW50IFFJbmRleDsKKyAgICBNQl9NT0RFX0lORk8gKm1ibWkgPSAmeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pOworICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKKworICAgIC8qIERlY2lkZSB3aGV0aGVyIHRvIHVzZSB0aGUgZGVmYXVsdCBvciBhbHRlcm5hdGUgYmFzZWxpbmUgUSB2YWx1ZS4gKi8KKyAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgIHsKKyAgICAgICAgLyogQWJzIFZhbHVlICovCisgICAgICAgIGlmICh4ZC0+bWJfc2VnZW1lbnRfYWJzX2RlbHRhID09IFNFR01FTlRfQUJTREFUQSkKKyAgICAgICAgICAgIFFJbmRleCA9IHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW21ibWktPnNlZ21lbnRfaWRdOworCisgICAgICAgIC8qIERlbHRhIFZhbHVlICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUUluZGV4ID0gcGMtPmJhc2VfcWluZGV4ICsgeGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bbWJtaS0+c2VnbWVudF9pZF07CisgICAgICAgICAgICBRSW5kZXggPSAoUUluZGV4ID49IDApID8gKChRSW5kZXggPD0gTUFYUSkgPyBRSW5kZXggOiBNQVhRKSA6IDA7ICAgIC8qIENsYW1wIHRvIHZhbGlkIHJhbmdlICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBRSW5kZXggPSBwYy0+YmFzZV9xaW5kZXg7CisKKyAgICAvKiBTZXQgdXAgdGhlIG1hY3JvYmxvY2sgZGVxdWFudCBjb25zdGFudHMgKi8KKyAgICB4ZC0+ZGVxdWFudF95MV9kY1swXSA9IDE7CisgICAgeGQtPmRlcXVhbnRfeTFbMF0gPSBwYy0+WTFkZXF1YW50W1FJbmRleF1bMF07CisgICAgeGQtPmRlcXVhbnRfeTJbMF0gPSBwYy0+WTJkZXF1YW50W1FJbmRleF1bMF07CisgICAgeGQtPmRlcXVhbnRfdXZbMF0gPSBwYy0+VVZkZXF1YW50W1FJbmRleF1bMF07CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHhkLT5kZXF1YW50X3kxX2RjW2ldID0KKyAgICAgICAgeGQtPmRlcXVhbnRfeTFbaV0gPSBwYy0+WTFkZXF1YW50W1FJbmRleF1bMV07CisgICAgICAgIHhkLT5kZXF1YW50X3kyW2ldID0gcGMtPlkyZGVxdWFudFtRSW5kZXhdWzFdOworICAgICAgICB4ZC0+ZGVxdWFudF91dltpXSA9IHBjLT5VVmRlcXVhbnRbUUluZGV4XVsxXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9tYWNyb2Jsb2NrKFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWJfaWR4KQoreworICAgIE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlOworICAgIGludCBpOworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIGludCBjb3JydXB0aW9uX2RldGVjdGVkID0gMDsKKyNlbmRpZgorCisgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKQorICAgIHsKKyAgICAgICAgdnA4X3Jlc2V0X21iX3Rva2Vuc19jb250ZXh0KHhkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXZwOGR4X2Jvb2xfZXJyb3IoeGQtPmN1cnJlbnRfYmMpKQorICAgIHsKKyAgICAgICAgaW50IGVvYnRvdGFsOworICAgICAgICBlb2J0b3RhbCA9IHZwOF9kZWNvZGVfbWJfdG9rZW5zKHBiaSwgeGQpOworCisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogIEZvcmNlIHRoZSBsb29wZmlsdGVyIHRvIHNraXAgd2hlbiBlb2J0b3RhbCBpcyB6ZXJvICovCisgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmID0gKGVvYnRvdGFsPT0wKTsKKyAgICB9CisKKyAgICBtb2RlID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGU7CisKKyAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgICAgICB2cDhfbWJfaW5pdF9kZXF1YW50aXplcihwYmksIHhkKTsKKworCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisKKyAgICBpZihwYmktPmVjX2FjdGl2ZSkKKyAgICB7CisgICAgICAgIGludCB0aHJvd19yZXNpZHVhbDsKKyAgICAgICAgLyogV2hlbiB3ZSBoYXZlIGluZGVwZW5kZW50IHBhcnRpdGlvbnMgd2UgY2FuIGFwcGx5IHJlc2lkdWFsIGV2ZW4KKyAgICAgICAgICogdGhvdWdoIG90aGVyIHBhcnRpdGlvbnMgd2l0aGluIHRoZSBmcmFtZSBhcmUgY29ycnVwdC4KKyAgICAgICAgICovCisgICAgICAgIHRocm93X3Jlc2lkdWFsID0gKCFwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGJpLT5mcmFtZV9jb3JydXB0X3Jlc2lkdWFsKTsKKyAgICAgICAgdGhyb3dfcmVzaWR1YWwgPSAodGhyb3dfcmVzaWR1YWwgfHwgdnA4ZHhfYm9vbF9lcnJvcih4ZC0+Y3VycmVudF9iYykpOworCisgICAgICAgIGlmICgobWJfaWR4ID49IHBiaS0+bXZzX2NvcnJ1cHRfZnJvbV9tYiB8fCB0aHJvd19yZXNpZHVhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1CIHdpdGggY29ycnVwdCByZXNpZHVhbHMgb3IgY29ycnVwdCBtb2RlL21vdGlvbiB2ZWN0b3JzLgorICAgICAgICAgICAgICogQmV0dGVyIHRvIHVzZSB0aGUgcHJlZGljdG9yIGFzIHJlY29uc3RydWN0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwYmktPmZyYW1lX2NvcnJ1cHRfcmVzaWR1YWwgPSAxOworICAgICAgICAgICAgdnB4X21lbXNldCh4ZC0+cWNvZWZmLCAwLCBzaXplb2YoeGQtPnFjb2VmZikpOworICAgICAgICAgICAgdnA4X2NvbmNlYWxfY29ycnVwdF9tYih4ZCk7CisKKworICAgICAgICAgICAgY29ycnVwdGlvbl9kZXRlY3RlZCA9IDE7CisKKyAgICAgICAgICAgIC8qIGZvcmNlIGlkY3QgdG8gYmUgc2tpcHBlZCBmb3IgQl9QUkVEIGFuZCB1c2UgdGhlCisgICAgICAgICAgICAgKiBwcmVkaWN0aW9uIG9ubHkgZm9yIHJlY29uc3RydWN0aW9uCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgdnB4X21lbXNldCh4ZC0+ZW9icywgMCwgMjUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBkbyBwcmVkaWN0aW9uICovCisgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCisgICAgeworICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MoeGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPnJlY29uX2xlZnRfc3RyaWRlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudXZfc3RyaWRlKTsKKworICAgICAgICBpZiAobW9kZSAhPSBCX1BSRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zKHhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdF9zdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0Lnlfc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0ICpEUUMgPSB4ZC0+ZGVxdWFudF95MTsKKyAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlID0geGQtPmRzdC55X3N0cmlkZTsKKworICAgICAgICAgICAgLyogY2xlYXIgb3V0IHJlc2lkdWFsIGVvYiBpbmZvICovCisgICAgICAgICAgICBpZih4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZikKKyAgICAgICAgICAgICAgICB2cHhfbWVtc2V0KHhkLT5lb2JzLCAwLCAyNSk7CisKKyAgICAgICAgICAgIGludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KHhkLCB4ZC0+cmVjb25fYWJvdmVbMF0gKyAxNik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJMT0NLRCAqYiA9ICZ4ZC0+YmxvY2tbaV07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0ID0geGQtPmRzdC55X2J1ZmZlciArIGItPm9mZnNldDsKKyAgICAgICAgICAgICAgICBCX1BSRURJQ1RJT05fTU9ERSBiX21vZGUgPQorICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVtpXS5hc19tb2RlOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKkFib3ZlID0gZHN0IC0gZHN0X3N0cmlkZTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp5bGVmdCA9IGRzdCAtIDE7CisgICAgICAgICAgICAgICAgaW50IGxlZnRfc3RyaWRlID0gZHN0X3N0cmlkZTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0ID0gQWJvdmVbLTFdOworCisgICAgICAgICAgICAgICAgdnA4X2ludHJhNHg0X3ByZWRpY3QoQWJvdmUsIHlsZWZ0LCBsZWZ0X3N0cmlkZSwgYl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgdG9wX2xlZnQpOworCisgICAgICAgICAgICAgICAgaWYgKHhkLT5lb2JzW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5lb2JzW2ldID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZChiLT5xY29lZmYsIERRQywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGItPnFjb2VmZlswXSAqIERRQ1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19tYih4ZCk7CisgICAgfQorCisKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICBpZiAoY29ycnVwdGlvbl9kZXRlY3RlZCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKCF4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZikKKyAgICB7CisgICAgICAgIC8qIGRlcXVhbnRpemF0aW9uIGFuZCBpZGN0ICovCisgICAgICAgIGlmIChtb2RlICE9IEJfUFJFRCkKKyAgICAgICAgeworICAgICAgICAgICAgc2hvcnQgKkRRQyA9IHhkLT5kZXF1YW50X3kxOworCisgICAgICAgICAgICBpZiAobW9kZSAhPSBTUExJVE1WKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJMT0NLRCAqYiA9ICZ4ZC0+YmxvY2tbMjRdOworCisgICAgICAgICAgICAgICAgLyogZG8gMm5kIG9yZGVyIHRyYW5zZm9ybSBvbiB0aGUgZGMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBpZiAoeGQtPmVvYnNbMjRdID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwOF9kZXF1YW50aXplX2IoYiwgeGQtPmRlcXVhbnRfeTIpOworCisgICAgICAgICAgICAgICAgICAgIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDQoJmItPmRxY29lZmZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cWNvZWZmKTsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzZdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzddID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYi0+ZHFjb2VmZlswXSA9IGItPnFjb2VmZlswXSAqIHhkLT5kZXF1YW50X3kyWzBdOworICAgICAgICAgICAgICAgICAgICB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzEoJmItPmRxY29lZmZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cWNvZWZmKTsKKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzBdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBvdmVycmlkZSB0aGUgZGMgZGVxdWFudCBjb25zdGFudCBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBkYyBjb21wb25lbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgRFFDID0geGQtPmRlcXVhbnRfeTFfZGM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPnFjb2VmZiwgRFFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0Lnlfc3RyaWRlLCB4ZC0+ZW9icyk7CisgICAgICAgIH0KKworICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgKHhkLT5xY29lZmYrMTYqMTYsIHhkLT5kZXF1YW50X3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51dl9zdHJpZGUsIHhkLT5lb2JzKzE2KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RlbHRhX3EodnA4X3JlYWRlciAqYmMsIGludCBwcmV2LCBpbnQgKnFfdXBkYXRlKQoreworICAgIGludCByZXRfdmFsID0gMDsKKworICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQorICAgIHsKKyAgICAgICAgcmV0X3ZhbCA9IHZwOF9yZWFkX2xpdGVyYWwoYmMsIDQpOworCisgICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQorICAgICAgICAgICAgcmV0X3ZhbCA9IC1yZXRfdmFsOworICAgIH0KKworICAgIC8qIFRyaWdnZXIgYSBxdWFudGl6ZXIgdXBkYXRlIGlmIHRoZSBkZWx0YS1xIHZhbHVlIGhhcyBjaGFuZ2VkICovCisgICAgaWYgKHJldF92YWwgIT0gcHJldikKKyAgICAgICAgKnFfdXBkYXRlID0gMTsKKworICAgIHJldHVybiByZXRfdmFsOworfQorCisjaWZkZWYgUEFDS0VUX1RFU1RJTkcKKyNpbmNsdWRlIDxzdGRpby5oPgorRklMRSAqdnB4bG9nID0gMDsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB5djEyX2V4dGVuZF9mcmFtZV90b3BfYyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZikKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyMTsKKyAgICB1bnNpZ25lZCBjaGFyICpkZXN0X3B0cjE7CisKKyAgICB1bnNpZ25lZCBpbnQgQm9yZGVyOworICAgIGludCBwbGFuZV9zdHJpZGU7CisKKyAgICAvKioqKioqKioqKiovCisgICAgLyogWSBQbGFuZSAqLworICAgIC8qKioqKioqKioqKi8KKyAgICBCb3JkZXIgPSB5YmYtPmJvcmRlcjsKKyAgICBwbGFuZV9zdHJpZGUgPSB5YmYtPnlfc3RyaWRlOworICAgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlciAtIEJvcmRlcjsKKyAgICBkZXN0X3B0cjEgPSBzcmNfcHRyMSAtIChCb3JkZXIgKiBwbGFuZV9zdHJpZGUpOworCisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpQm9yZGVyOyBpKyspCisgICAgeworICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIHBsYW5lX3N0cmlkZSk7CisgICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgfQorCisKKyAgICAvKioqKioqKioqKiovCisgICAgLyogVSBQbGFuZSAqLworICAgIC8qKioqKioqKioqKi8KKyAgICBwbGFuZV9zdHJpZGUgPSB5YmYtPnV2X3N0cmlkZTsKKyAgICBCb3JkZXIgLz0gMjsKKyAgICBzcmNfcHRyMSA9IHliZi0+dV9idWZmZXIgLSBCb3JkZXI7CisgICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShCb3JkZXIpOyBpKyspCisgICAgeworICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIHBsYW5lX3N0cmlkZSk7CisgICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgfQorCisgICAgLyoqKioqKioqKioqLworICAgIC8qIFYgUGxhbmUgKi8KKyAgICAvKioqKioqKioqKiovCisKKyAgICBzcmNfcHRyMSA9IHliZi0+dl9idWZmZXIgLSBCb3JkZXI7CisgICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShCb3JkZXIpOyBpKyspCisgICAgeworICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIHBsYW5lX3N0cmlkZSk7CisgICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB5djEyX2V4dGVuZF9mcmFtZV9ib3R0b21fYyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZikKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyMSwgKnNyY19wdHIyOworICAgIHVuc2lnbmVkIGNoYXIgKmRlc3RfcHRyMjsKKworICAgIHVuc2lnbmVkIGludCBCb3JkZXI7CisgICAgaW50IHBsYW5lX3N0cmlkZTsKKyAgICBpbnQgcGxhbmVfaGVpZ2h0OworCisgICAgLyoqKioqKioqKioqLworICAgIC8qIFkgUGxhbmUgKi8KKyAgICAvKioqKioqKioqKiovCisgICAgQm9yZGVyID0geWJmLT5ib3JkZXI7CisgICAgcGxhbmVfc3RyaWRlID0geWJmLT55X3N0cmlkZTsKKyAgICBwbGFuZV9oZWlnaHQgPSB5YmYtPnlfaGVpZ2h0OworCisgICAgc3JjX3B0cjEgPSB5YmYtPnlfYnVmZmVyIC0gQm9yZGVyOworICAgIHNyY19wdHIyID0gc3JjX3B0cjEgKyAocGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlKSAtIHBsYW5lX3N0cmlkZTsKKyAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KUJvcmRlcjsgaSsrKQorICAgIHsKKyAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBwbGFuZV9zdHJpZGUpOworICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOworICAgIH0KKworCisgICAgLyoqKioqKioqKioqLworICAgIC8qIFUgUGxhbmUgKi8KKyAgICAvKioqKioqKioqKiovCisgICAgcGxhbmVfc3RyaWRlID0geWJmLT51dl9zdHJpZGU7CisgICAgcGxhbmVfaGVpZ2h0ID0geWJmLT51dl9oZWlnaHQ7CisgICAgQm9yZGVyIC89IDI7CisKKyAgICBzcmNfcHRyMSA9IHliZi0+dV9idWZmZXIgLSBCb3JkZXI7CisgICAgc3JjX3B0cjIgPSBzcmNfcHRyMSArIChwbGFuZV9oZWlnaHQgKiBwbGFuZV9zdHJpZGUpIC0gcGxhbmVfc3RyaWRlOworICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgcGxhbmVfc3RyaWRlOworCisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKEJvcmRlcik7IGkrKykKKyAgICB7CisgICAgICAgIHZweF9tZW1jcHkoZGVzdF9wdHIyLCBzcmNfcHRyMiwgcGxhbmVfc3RyaWRlKTsKKyAgICAgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKiovCisgICAgLyogViBQbGFuZSAqLworICAgIC8qKioqKioqKioqKi8KKworICAgIHNyY19wdHIxID0geWJmLT52X2J1ZmZlciAtIEJvcmRlcjsKKyAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7CisgICAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyBwbGFuZV9zdHJpZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoQm9yZGVyKTsgaSsrKQorICAgIHsKKyAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBwbGFuZV9zdHJpZGUpOworICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeXYxMl9leHRlbmRfZnJhbWVfbGVmdF9yaWdodF9jKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnVfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZfc3JjKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIxLCAqc3JjX3B0cjI7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdF9wdHIxLCAqZGVzdF9wdHIyOworCisgICAgdW5zaWduZWQgaW50IEJvcmRlcjsKKyAgICBpbnQgcGxhbmVfc3RyaWRlOworICAgIGludCBwbGFuZV9oZWlnaHQ7CisgICAgaW50IHBsYW5lX3dpZHRoOworCisgICAgLyoqKioqKioqKioqLworICAgIC8qIFkgUGxhbmUgKi8KKyAgICAvKioqKioqKioqKiovCisgICAgQm9yZGVyID0geWJmLT5ib3JkZXI7CisgICAgcGxhbmVfc3RyaWRlID0geWJmLT55X3N0cmlkZTsKKyAgICBwbGFuZV9oZWlnaHQgPSAxNjsKKyAgICBwbGFuZV93aWR0aCA9IHliZi0+eV93aWR0aDsKKworICAgIC8qIGNvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vc3QgY29sdW1ucyBvdXQgKi8KKyAgICBzcmNfcHRyMSA9IHlfc3JjOworICAgIHNyY19wdHIyID0gc3JjX3B0cjEgKyBwbGFuZV93aWR0aCAtIDE7CisgICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXI7CisgICAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxOworCisgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjEsIHNyY19wdHIxWzBdLCBCb3JkZXIpOworICAgICAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMiwgc3JjX3B0cjJbMF0sIEJvcmRlcik7CisgICAgICAgIHNyY19wdHIxICArPSBwbGFuZV9zdHJpZGU7CisgICAgICAgIHNyY19wdHIyICArPSBwbGFuZV9zdHJpZGU7CisgICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7CisgICAgfQorCisgICAgLyoqKioqKioqKioqLworICAgIC8qIFUgUGxhbmUgKi8KKyAgICAvKioqKioqKioqKiovCisgICAgcGxhbmVfc3RyaWRlID0geWJmLT51dl9zdHJpZGU7CisgICAgcGxhbmVfaGVpZ2h0ID0gODsKKyAgICBwbGFuZV93aWR0aCA9IHliZi0+dXZfd2lkdGg7CisgICAgQm9yZGVyIC89IDI7CisKKyAgICAvKiBjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0ICovCisgICAgc3JjX3B0cjEgPSB1X3NyYzsKKyAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOworICAgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gQm9yZGVyOworICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgQm9yZGVyKTsKKyAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOworICAgICAgICBzcmNfcHRyMSAgKz0gcGxhbmVfc3RyaWRlOworICAgICAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOworICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOworICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOworICAgIH0KKworICAgIC8qKioqKioqKioqKi8KKyAgICAvKiBWIFBsYW5lICovCisgICAgLyoqKioqKioqKioqLworCisgICAgLyogY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dCAqLworICAgIHNyY19wdHIxID0gdl9zcmM7CisgICAgc3JjX3B0cjIgPSBzcmNfcHRyMSArIHBsYW5lX3dpZHRoIC0gMTsKKyAgICBkZXN0X3B0cjEgPSBzcmNfcHRyMSAtIEJvcmRlcjsKKyAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfaGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMSwgc3JjX3B0cjFbMF0sIEJvcmRlcik7CisgICAgICAgIHZweF9tZW1zZXQoZGVzdF9wdHIyLCBzcmNfcHRyMlswXSwgQm9yZGVyKTsKKyAgICAgICAgc3JjX3B0cjEgICs9IHBsYW5lX3N0cmlkZTsKKyAgICAgICAgc3JjX3B0cjIgICs9IHBsYW5lX3N0cmlkZTsKKyAgICAgICAgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZTsKKyAgICAgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9tYl9yb3dzKFZQOERfQ09NUCAqcGJpKQoreworICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgID0gJiBwYmktPm1iOworCisgICAgTU9ERV9JTkZPICpsZl9taWMgPSB4ZC0+bW9kZV9pbmZvX2NvbnRleHQ7CisKKyAgICBpbnQgaWJjID0gMDsKKyAgICBpbnQgbnVtX3BhcnQgPSAxIDw8IHBjLT5tdWx0aV90b2tlbl9wYXJ0aXRpb247CisKKyAgICBpbnQgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQ7CisgICAgaW50IG1iX3JvdywgbWJfY29sOworICAgIGludCBtYl9pZHggPSAwOworCisgICAgWVYxMl9CVUZGRVJfQ09ORklHICp5djEyX2ZiX25ldyA9IHBiaS0+ZGVjX2ZiX3JlZltJTlRSQV9GUkFNRV07CisKKyAgICBpbnQgcmVjb25feV9zdHJpZGUgPSB5djEyX2ZiX25ldy0+eV9zdHJpZGU7CisgICAgaW50IHJlY29uX3V2X3N0cmlkZSA9IHl2MTJfZmJfbmV3LT51dl9zdHJpZGU7CisKKyAgICB1bnNpZ25lZCBjaGFyICpyZWZfYnVmZmVyW01BWF9SRUZfRlJBTUVTXVszXTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfYnVmZmVyWzNdOworICAgIHVuc2lnbmVkIGNoYXIgKmxmX2RzdFszXTsKKyAgICB1bnNpZ25lZCBjaGFyICplYl9kc3RbM107CisgICAgaW50IGk7CisgICAgaW50IHJlZl9mYl9jb3JydXB0ZWRbTUFYX1JFRl9GUkFNRVNdOworCisgICAgcmVmX2ZiX2NvcnJ1cHRlZFtJTlRSQV9GUkFNRV0gPSAwOworCisgICAgZm9yKGkgPSAxOyBpIDwgTUFYX1JFRl9GUkFNRVM7IGkrKykKKyAgICB7CisgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqdGhpc19mYiA9IHBiaS0+ZGVjX2ZiX3JlZltpXTsKKworICAgICAgICByZWZfYnVmZmVyW2ldWzBdID0gdGhpc19mYi0+eV9idWZmZXI7CisgICAgICAgIHJlZl9idWZmZXJbaV1bMV0gPSB0aGlzX2ZiLT51X2J1ZmZlcjsKKyAgICAgICAgcmVmX2J1ZmZlcltpXVsyXSA9IHRoaXNfZmItPnZfYnVmZmVyOworCisgICAgICAgIHJlZl9mYl9jb3JydXB0ZWRbaV0gPSB0aGlzX2ZiLT5jb3JydXB0ZWQ7CisgICAgfQorCisgICAgLyogU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KKyAgICBlYl9kc3RbMF0gPSBsZl9kc3RbMF0gPSBkc3RfYnVmZmVyWzBdID0geXYxMl9mYl9uZXctPnlfYnVmZmVyOworICAgIGViX2RzdFsxXSA9IGxmX2RzdFsxXSA9IGRzdF9idWZmZXJbMV0gPSB5djEyX2ZiX25ldy0+dV9idWZmZXI7CisgICAgZWJfZHN0WzJdID0gbGZfZHN0WzJdID0gZHN0X2J1ZmZlclsyXSA9IHl2MTJfZmJfbmV3LT52X2J1ZmZlcjsKKworICAgIHhkLT51cF9hdmFpbGFibGUgPSAwOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9vcCBmaWx0ZXIgZm9yIHRoaXMgZnJhbWUuICovCisgICAgaWYocGMtPmZpbHRlcl9sZXZlbCkKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQocGMsIHhkLCBwYy0+ZmlsdGVyX2xldmVsKTsKKworICAgIHZwOF9zZXR1cF9pbnRyYV9yZWNvbl90b3BfbGluZSh5djEyX2ZiX25ldyk7CisKKyAgICAvKiBEZWNvZGUgdGhlIGluZGl2aWR1YWwgbWFjcm8gYmxvY2sgKi8KKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IHBjLT5tYl9yb3dzOyBtYl9yb3crKykKKyAgICB7CisgICAgICAgIGlmIChudW1fcGFydCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHhkLT5jdXJyZW50X2JjID0gJiBwYmktPm1iY1tpYmNdOworICAgICAgICAgICAgaWJjKys7CisKKyAgICAgICAgICAgIGlmIChpYmMgPT0gbnVtX3BhcnQpCisgICAgICAgICAgICAgICAgaWJjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJlY29uX3lvZmZzZXQgPSBtYl9yb3cgKiByZWNvbl95X3N0cmlkZSAqIDE2OworICAgICAgICByZWNvbl91dm9mZnNldCA9IG1iX3JvdyAqIHJlY29uX3V2X3N0cmlkZSAqIDg7CisKKyAgICAgICAgLyogcmVzZXQgY29udGV4dHMgKi8KKyAgICAgICAgeGQtPmFib3ZlX2NvbnRleHQgPSBwYy0+YWJvdmVfY29udGV4dDsKKyAgICAgICAgdnB4X21lbXNldCh4ZC0+bGVmdF9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworCisgICAgICAgIHhkLT5sZWZ0X2F2YWlsYWJsZSA9IDA7CisKKyAgICAgICAgeGQtPm1iX3RvX3RvcF9lZGdlID0gLSgobWJfcm93ICogMTYpKSA8PCAzOworICAgICAgICB4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgPSAoKHBjLT5tYl9yb3dzIC0gMSAtIG1iX3JvdykgKiAxNikgPDwgMzsKKworICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMF0gPSBkc3RfYnVmZmVyWzBdICsgcmVjb25feW9mZnNldDsKKyAgICAgICAgeGQtPnJlY29uX2Fib3ZlWzFdID0gZHN0X2J1ZmZlclsxXSArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMl0gPSBkc3RfYnVmZmVyWzJdICsgcmVjb25fdXZvZmZzZXQ7CisKKyAgICAgICAgeGQtPnJlY29uX2xlZnRbMF0gPSB4ZC0+cmVjb25fYWJvdmVbMF0gLSAxOworICAgICAgICB4ZC0+cmVjb25fbGVmdFsxXSA9IHhkLT5yZWNvbl9hYm92ZVsxXSAtIDE7CisgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzJdID0geGQtPnJlY29uX2Fib3ZlWzJdIC0gMTsKKworICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMF0gLT0geGQtPmRzdC55X3N0cmlkZTsKKyAgICAgICAgeGQtPnJlY29uX2Fib3ZlWzFdIC09IHhkLT5kc3QudXZfc3RyaWRlOworICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMl0gLT0geGQtPmRzdC51dl9zdHJpZGU7CisKKyAgICAgICAgLyogVE9ETzogbW92ZSB0byBvdXRzaWRlIHJvdyBsb29wICovCisgICAgICAgIHhkLT5yZWNvbl9sZWZ0X3N0cmlkZVswXSA9IHhkLT5kc3QueV9zdHJpZGU7CisgICAgICAgIHhkLT5yZWNvbl9sZWZ0X3N0cmlkZVsxXSA9IHhkLT5kc3QudXZfc3RyaWRlOworCisgICAgICAgIHNldHVwX2ludHJhX3JlY29uX2xlZnQoeGQtPnJlY29uX2xlZnRbMF0sIHhkLT5yZWNvbl9sZWZ0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzJdLCB4ZC0+ZHN0Lnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudXZfc3RyaWRlKTsKKworICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IHBjLT5tYl9jb2xzOyBtYl9jb2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogRGlzdGFuY2Ugb2YgTWIgdG8gdGhlIHZhcmlvdXMgaW1hZ2UgZWRnZXMuCisgICAgICAgICAgICAgKiBUaGVzZSBhcmUgc3BlY2lmaWVkIHRvIDh0aCBwZWwgYXMgdGhleSBhcmUgYWx3YXlzIGNvbXBhcmVkIHRvIHZhbHVlcworICAgICAgICAgICAgICogdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHhkLT5tYl90b19sZWZ0X2VkZ2UgPSAtKChtYl9jb2wgKiAxNikgPDwgMyk7CisgICAgICAgICAgICB4ZC0+bWJfdG9fcmlnaHRfZWRnZSA9ICgocGMtPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KSA8PCAzOworCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvcnJ1cHRfcmVzaWR1YWwgPSAoIXBiaS0+aW5kZXBlbmRlbnRfcGFydGl0aW9ucyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJpLT5mcmFtZV9jb3JydXB0X3Jlc2lkdWFsKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4ZHhfYm9vbF9lcnJvcih4ZC0+Y3VycmVudF9iYyk7CisgICAgICAgICAgICAgICAgaWYgKHBiaS0+ZWNfYWN0aXZlICYmCisgICAgICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUgJiYKKyAgICAgICAgICAgICAgICAgICAgY29ycnVwdF9yZXNpZHVhbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgYW4gaW50cmEgYmxvY2sgd2l0aCBjb3JydXB0IGNvZWZmaWNpZW50cywgYmV0dGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGNvbmNlYWwgd2l0aCBhbiBpbnRlciBibG9jay4gSW50ZXJwb2xhdGUgTVZzIGZyb20gbmVpZ2hib3JpbmcKKyAgICAgICAgICAgICAgICAgICAgICogTUJzLgorICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIHRoZSBmaXJzdCBtYiB3aXRoIGNvcnJ1cHQgcmVzaWR1YWwgaW4gYSBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICogd2UgbWlnaHQgbm90IGRpc2NvdmVyIHRoYXQgYmVmb3JlIGRlY29kaW5nIHRoZSByZXNpZHVhbC4gVGhhdAorICAgICAgICAgICAgICAgICAgICAgKiBoYXBwZW5zIGFmdGVyIHRoaXMgY2hlY2ssIGFuZCB0aGVyZWZvcmUgbm8gaW50ZXIgY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBkb25lLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdnA4X2ludGVycG9sYXRlX21vdGlvbih4ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl9yb3csIG1iX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYy0+bWJfcm93cywgcGMtPm1iX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPm1vZGVfaW5mb19zdHJpZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyID0gZHN0X2J1ZmZlclswXSArIHJlY29uX3lvZmZzZXQ7CisgICAgICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyID0gZHN0X2J1ZmZlclsxXSArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICAgICAgeGQtPmRzdC52X2J1ZmZlciA9IGRzdF9idWZmZXJbMl0gKyByZWNvbl91dm9mZnNldDsKKworICAgICAgICAgICAgeGQtPnByZS55X2J1ZmZlciA9IHJlZl9idWZmZXJbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV1bMF0gKyByZWNvbl95b2Zmc2V0OworICAgICAgICAgICAgeGQtPnByZS51X2J1ZmZlciA9IHJlZl9idWZmZXJbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV1bMV0gKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgICAgIHhkLT5wcmUudl9idWZmZXIgPSByZWZfYnVmZmVyW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdWzJdICsgcmVjb25fdXZvZmZzZXQ7CisKKyAgICAgICAgICAgIC8qIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSByZWZlcmVuY2UgZnJhbWVzICovCisgICAgICAgICAgICB4ZC0+Y29ycnVwdGVkIHw9IHJlZl9mYl9jb3JydXB0ZWRbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07CisKKyAgICAgICAgICAgIGRlY29kZV9tYWNyb2Jsb2NrKHBiaSwgeGQsIG1iX2lkeCk7CisKKyAgICAgICAgICAgIG1iX2lkeCsrOworICAgICAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gMTsKKworICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlIGJvb2xlYW4gZGVjb2RlciBoYXMgc3VmZmVyZWQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gdnA4ZHhfYm9vbF9lcnJvcih4ZC0+Y3VycmVudF9iYyk7CisKKyAgICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVswXSArPSAxNjsKKyAgICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVsxXSArPSA4OworICAgICAgICAgICAgeGQtPnJlY29uX2Fib3ZlWzJdICs9IDg7CisgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFswXSArPSAxNjsKKyAgICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzFdICs9IDg7CisgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFsyXSArPSA4OworCisgICAgICAgICAgICByZWNvbl95b2Zmc2V0ICs9IDE2OworICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQgKz0gODsKKworICAgICAgICAgICAgKyt4ZC0+bW9kZV9pbmZvX2NvbnRleHQ7ICAvKiBuZXh0IG1iICovCisKKyAgICAgICAgICAgIHhkLT5hYm92ZV9jb250ZXh0Kys7CisgICAgICAgIH0KKworICAgICAgICAvKiBhZGp1c3QgdG8gdGhlIG5leHQgcm93IG9mIG1icyAqLworICAgICAgICB2cDhfZXh0ZW5kX21iX3Jvdyh5djEyX2ZiX25ldywgeGQtPmRzdC55X2J1ZmZlciArIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyICsgOCwgeGQtPmRzdC52X2J1ZmZlciArIDgpOworCisgICAgICAgICsreGQtPm1vZGVfaW5mb19jb250ZXh0OyAgICAgIC8qIHNraXAgcHJlZGljdGlvbiBjb2x1bW4gKi8KKyAgICAgICAgeGQtPnVwX2F2YWlsYWJsZSA9IDE7CisKKyAgICAgICAgaWYocGMtPmZpbHRlcl9sZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYobWJfcm93ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGMtPmZpbHRlcl90eXBlID09IE5PUk1BTF9MT09QRklMVEVSKQorICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfcm93X25vcm1hbChwYywgbGZfbWljLCBtYl9yb3ctMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGZfZHN0WzBdLCBsZl9kc3RbMV0sIGxmX2RzdFsyXSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfcm93X3NpbXBsZShwYywgbGZfbWljLCBtYl9yb3ctMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGZfZHN0WzBdLCBsZl9kc3RbMV0sIGxmX2RzdFsyXSk7CisKKyAgICAgICAgICAgICAgICBpZihtYl9yb3cgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeXYxMl9leHRlbmRfZnJhbWVfbGVmdF9yaWdodF9jKHl2MTJfZmJfbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzJdKTsKKworICAgICAgICAgICAgICAgICAgICBlYl9kc3RbMF0gKz0gcmVjb25feV9zdHJpZGUgICogMTY7CisgICAgICAgICAgICAgICAgICAgIGViX2RzdFsxXSArPSByZWNvbl91dl9zdHJpZGUgKiAgODsKKyAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzJdICs9IHJlY29uX3V2X3N0cmlkZSAqICA4OworCisgICAgICAgICAgICAgICAgICAgIGlmKG1iX3JvdyA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgeXYxMl9leHRlbmRfZnJhbWVfdG9wX2MoeXYxMl9mYl9uZXcpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGZfZHN0WzBdICs9IHJlY29uX3lfc3RyaWRlICAqIDE2OworICAgICAgICAgICAgICAgIGxmX2RzdFsxXSArPSByZWNvbl91dl9zdHJpZGUgKiAgODsKKyAgICAgICAgICAgICAgICBsZl9kc3RbMl0gKz0gcmVjb25fdXZfc3RyaWRlICogIDg7CisgICAgICAgICAgICAgICAgbGZfbWljICs9IHBjLT5tYl9jb2xzOworICAgICAgICAgICAgICAgIGxmX21pYysrOyAgICAgICAgIC8qIFNraXAgYm9yZGVyIG1iICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihtYl9yb3cgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKi8KKyAgICAgICAgICAgICAgICB5djEyX2V4dGVuZF9mcmFtZV9sZWZ0X3JpZ2h0X2MoeXYxMl9mYl9uZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGViX2RzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYl9kc3RbMl0pOworCisgICAgICAgICAgICAgICAgZWJfZHN0WzBdICs9IHJlY29uX3lfc3RyaWRlICAqIDE2OworICAgICAgICAgICAgICAgIGViX2RzdFsxXSArPSByZWNvbl91dl9zdHJpZGUgKiAgODsKKyAgICAgICAgICAgICAgICBlYl9kc3RbMl0gKz0gcmVjb25fdXZfc3RyaWRlICogIDg7CisKKyAgICAgICAgICAgICAgICBpZihtYl9yb3cgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgeXYxMl9leHRlbmRfZnJhbWVfdG9wX2MoeXYxMl9mYl9uZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYocGMtPmZpbHRlcl9sZXZlbCkKKyAgICB7CisgICAgICAgIGlmIChwYy0+ZmlsdGVyX3R5cGUgPT0gTk9STUFMX0xPT1BGSUxURVIpCisgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfcm93X25vcm1hbChwYywgbGZfbWljLCBtYl9yb3ctMSwgcmVjb25feV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbl91dl9zdHJpZGUsIGxmX2RzdFswXSwgbGZfZHN0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGZfZHN0WzJdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3Jvd19zaW1wbGUocGMsIGxmX21pYywgbWJfcm93LTEsIHJlY29uX3lfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25fdXZfc3RyaWRlLCBsZl9kc3RbMF0sIGxmX2RzdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxmX2RzdFsyXSk7CisKKyAgICAgICAgeXYxMl9leHRlbmRfZnJhbWVfbGVmdF9yaWdodF9jKHl2MTJfZmJfbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzJdKTsKKyAgICAgICAgZWJfZHN0WzBdICs9IHJlY29uX3lfc3RyaWRlICAqIDE2OworICAgICAgICBlYl9kc3RbMV0gKz0gcmVjb25fdXZfc3RyaWRlICogIDg7CisgICAgICAgIGViX2RzdFsyXSArPSByZWNvbl91dl9zdHJpZGUgKiAgODsKKyAgICB9CisgICAgeXYxMl9leHRlbmRfZnJhbWVfbGVmdF9yaWdodF9jKHl2MTJfZmJfbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYl9kc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGViX2RzdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJfZHN0WzJdKTsKKworICAgIHl2MTJfZXh0ZW5kX2ZyYW1lX2JvdHRvbV9jKHl2MTJfZmJfbmV3KTsKKworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfcGFydGl0aW9uX3NpemUoY29uc3QgdW5zaWduZWQgY2hhciAqY3hfc2l6ZSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSA9CisgICAgICAgIGN4X3NpemVbMF0gKyAoY3hfc2l6ZVsxXSA8PCA4KSArIChjeF9zaXplWzJdIDw8IDE2KTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCByZWFkX2lzX3ZhbGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQpCit7CisgICAgcmV0dXJuIChzdGFydCArIGxlbiA+IHN0YXJ0ICYmIHN0YXJ0ICsgbGVuIDw9IGVuZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9hdmFpbGFibGVfcGFydGl0aW9uX3NpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEX0NPTVAgKnBiaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRva2VuX3BhcnRfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpmcmFnbWVudF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZpcnN0X2ZyYWdtZW50X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyYWdtZW50X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wYXJ0KQoreworICAgIFZQOF9DT01NT04qIHBjID0gJnBiaS0+Y29tbW9uOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhcnRpdGlvbl9zaXplX3B0ciA9IHRva2VuX3BhcnRfc2l6ZXMgKyBpICogMzsKKyAgICB1bnNpZ25lZCBpbnQgcGFydGl0aW9uX3NpemUgPSAwOworICAgIHB0cmRpZmZfdCBieXRlc19sZWZ0ID0gZnJhZ21lbnRfZW5kIC0gZnJhZ21lbnRfc3RhcnQ7CisgICAgLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhpcyBwYXJ0aXRpb24uIFRoZSBsYXN0IHBhcnRpdGlvbgorICAgICAqIHNpemUgaXMgaW1wbGljaXQuIElmIHRoZSBwYXJ0aXRpb24gc2l6ZSBjYW4ndCBiZSByZWFkLCB0aGVuCisgICAgICogZWl0aGVyIHVzZSB0aGUgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAoZm9yIEVDIG1vZGUpCisgICAgICogb3IgdGhyb3cgYW4gZXJyb3IuCisgICAgICovCisgICAgaWYgKGkgPCBudW1fcGFydCAtIDEpCisgICAgeworICAgICAgICBpZiAocmVhZF9pc192YWxpZChwYXJ0aXRpb25fc2l6ZV9wdHIsIDMsIGZpcnN0X2ZyYWdtZW50X2VuZCkpCisgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSA9IHJlYWRfcGFydGl0aW9uX3NpemUocGFydGl0aW9uX3NpemVfcHRyKTsKKyAgICAgICAgZWxzZSBpZiAocGJpLT5lY19hY3RpdmUpCisgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSA9ICh1bnNpZ25lZCBpbnQpYnl0ZXNfbGVmdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgcGFydGl0aW9uIHNpemUgZGF0YSIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBhcnRpdGlvbl9zaXplID0gKHVuc2lnbmVkIGludClieXRlc19sZWZ0OworCisgICAgLyogVmFsaWRhdGUgdGhlIGNhbGN1bGF0ZWQgcGFydGl0aW9uIGxlbmd0aC4gSWYgdGhlIGJ1ZmZlcgorICAgICAqIGRlc2NyaWJlZCBieSB0aGUgcGFydGl0aW9uIGNhbid0IGJlIGZ1bGx5IHJlYWQsIHRoZW4gcmVzdHJpY3QKKyAgICAgKiBpdCB0byB0aGUgcG9ydGlvbiB0aGF0IGNhbiBiZSAoZm9yIEVDIG1vZGUpIG9yIHRocm93IGFuIGVycm9yLgorICAgICAqLworICAgIGlmICghcmVhZF9pc192YWxpZChmcmFnbWVudF9zdGFydCwgcGFydGl0aW9uX3NpemUsIGZyYWdtZW50X2VuZCkpCisgICAgeworICAgICAgICBpZiAocGJpLT5lY19hY3RpdmUpCisgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSA9ICh1bnNpZ25lZCBpbnQpYnl0ZXNfbGVmdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgcGFja2V0IG9yIGNvcnJ1cHQgcGFydGl0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgbGVuZ3RoIiwgaSArIDEpOworICAgIH0KKyAgICByZXR1cm4gcGFydGl0aW9uX3NpemU7Cit9CisKKworc3RhdGljIHZvaWQgc2V0dXBfdG9rZW5fZGVjb2RlcihWUDhEX0NPTVAgKnBiaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogdG9rZW5fcGFydF9zaXplcykKK3sKKyAgICB2cDhfcmVhZGVyICpib29sX2RlY29kZXIgPSAmcGJpLT5tYmNbMF07CisgICAgdW5zaWduZWQgaW50IHBhcnRpdGlvbl9pZHg7CisgICAgdW5zaWduZWQgaW50IGZyYWdtZW50X2lkeDsKKyAgICB1bnNpZ25lZCBpbnQgbnVtX3Rva2VuX3BhcnRpdGlvbnM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZmlyc3RfZnJhZ21lbnRfZW5kID0gcGJpLT5mcmFnbWVudHNbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJpLT5mcmFnbWVudF9zaXplc1swXTsKKworICAgIFRPS0VOX1BBUlRJVElPTiBtdWx0aV90b2tlbl9wYXJ0aXRpb24gPQorICAgICAgICAgICAgKFRPS0VOX1BBUlRJVElPTil2cDhfcmVhZF9saXRlcmFsKCZwYmktPm1iY1s4XSwgMik7CisgICAgaWYgKCF2cDhkeF9ib29sX2Vycm9yKCZwYmktPm1iY1s4XSkpCisgICAgICAgIHBiaS0+Y29tbW9uLm11bHRpX3Rva2VuX3BhcnRpdGlvbiA9IG11bHRpX3Rva2VuX3BhcnRpdGlvbjsKKyAgICBudW1fdG9rZW5fcGFydGl0aW9ucyA9IDEgPDwgcGJpLT5jb21tb24ubXVsdGlfdG9rZW5fcGFydGl0aW9uOworCisgICAgLyogQ2hlY2sgZm9yIHBhcnRpdGlvbnMgd2l0aGluIHRoZSBmcmFnbWVudHMgYW5kIHVucGFjayB0aGUgZnJhZ21lbnRzCisgICAgICogc28gdGhhdCBlYWNoIGZyYWdtZW50IHBvaW50ZXIgcG9pbnRzIHRvIGl0cyBjb3JyZXNwb25kaW5nIHBhcnRpdGlvbi4gKi8KKyAgICBmb3IgKGZyYWdtZW50X2lkeCA9IDA7IGZyYWdtZW50X2lkeCA8IHBiaS0+bnVtX2ZyYWdtZW50czsgKytmcmFnbWVudF9pZHgpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgZnJhZ21lbnRfc2l6ZSA9IHBiaS0+ZnJhZ21lbnRfc2l6ZXNbZnJhZ21lbnRfaWR4XTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZnJhZ21lbnRfZW5kID0gcGJpLT5mcmFnbWVudHNbZnJhZ21lbnRfaWR4XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50X3NpemU7CisgICAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgaGFuZGxpbmcgdGhlIGZpcnN0IHBhcnRpdGlvbiBzaW5jZSB3ZSBoYXZlIGFscmVhZHkKKyAgICAgICAgICogcmVhZCBpdHMgc2l6ZS4gKi8KKyAgICAgICAgaWYgKGZyYWdtZW50X2lkeCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTaXplIG9mIGZpcnN0IHBhcnRpdGlvbiArIHRva2VuIHBhcnRpdGlvbiBzaXplcyBlbGVtZW50ICovCisgICAgICAgICAgICBwdHJkaWZmX3QgZXh0X2ZpcnN0X3BhcnRfc2l6ZSA9IHRva2VuX3BhcnRfc2l6ZXMgLQorICAgICAgICAgICAgICAgIHBiaS0+ZnJhZ21lbnRzWzBdICsgMyAqIChudW1fdG9rZW5fcGFydGl0aW9ucyAtIDEpOworICAgICAgICAgICAgZnJhZ21lbnRfc2l6ZSAtPSAodW5zaWduZWQgaW50KWV4dF9maXJzdF9wYXJ0X3NpemU7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnRfc2l6ZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGJpLT5mcmFnbWVudF9zaXplc1swXSA9ICh1bnNpZ25lZCBpbnQpZXh0X2ZpcnN0X3BhcnRfc2l6ZTsKKyAgICAgICAgICAgICAgICAvKiBUaGUgZnJhZ21lbnQgY29udGFpbnMgYW4gYWRkaXRpb25hbCBwYXJ0aXRpb24uIE1vdmUgdG8KKyAgICAgICAgICAgICAgICAgKiBuZXh0LiAqLworICAgICAgICAgICAgICAgIGZyYWdtZW50X2lkeCsrOworICAgICAgICAgICAgICAgIHBiaS0+ZnJhZ21lbnRzW2ZyYWdtZW50X2lkeF0gPSBwYmktPmZyYWdtZW50c1swXSArCisgICAgICAgICAgICAgICAgICBwYmktPmZyYWdtZW50X3NpemVzWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFNwbGl0IHRoZSBjaHVuayBpbnRvIHBhcnRpdGlvbnMgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gKi8KKyAgICAgICAgd2hpbGUgKGZyYWdtZW50X3NpemUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBwdHJkaWZmX3QgcGFydGl0aW9uX3NpemUgPSByZWFkX2F2YWlsYWJsZV9wYXJ0aXRpb25fc2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fcGFydF9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPmZyYWdtZW50c1tmcmFnbWVudF9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZyYWdtZW50X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRfaWR4IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdG9rZW5fcGFydGl0aW9ucyk7CisgICAgICAgICAgICBwYmktPmZyYWdtZW50X3NpemVzW2ZyYWdtZW50X2lkeF0gPSAodW5zaWduZWQgaW50KXBhcnRpdGlvbl9zaXplOworICAgICAgICAgICAgZnJhZ21lbnRfc2l6ZSAtPSAodW5zaWduZWQgaW50KXBhcnRpdGlvbl9zaXplOworICAgICAgICAgICAgYXNzZXJ0KGZyYWdtZW50X2lkeCA8PSBudW1fdG9rZW5fcGFydGl0aW9ucyk7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnRfc2l6ZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhlIGZyYWdtZW50IGNvbnRhaW5zIGFuIGFkZGl0aW9uYWwgcGFydGl0aW9uLgorICAgICAgICAgICAgICAgICAqIE1vdmUgdG8gbmV4dC4gKi8KKyAgICAgICAgICAgICAgICBmcmFnbWVudF9pZHgrKzsKKyAgICAgICAgICAgICAgICBwYmktPmZyYWdtZW50c1tmcmFnbWVudF9pZHhdID0KKyAgICAgICAgICAgICAgICAgICAgcGJpLT5mcmFnbWVudHNbZnJhZ21lbnRfaWR4IC0gMV0gKyBwYXJ0aXRpb25fc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBiaS0+bnVtX2ZyYWdtZW50cyA9IG51bV90b2tlbl9wYXJ0aXRpb25zICsgMTsKKworICAgIGZvciAocGFydGl0aW9uX2lkeCA9IDE7IHBhcnRpdGlvbl9pZHggPCBwYmktPm51bV9mcmFnbWVudHM7ICsrcGFydGl0aW9uX2lkeCkKKyAgICB7CisgICAgICAgIGlmICh2cDhkeF9zdGFydF9kZWNvZGUoYm9vbF9kZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+ZnJhZ21lbnRzW3BhcnRpdGlvbl9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+ZnJhZ21lbnRfc2l6ZXNbcGFydGl0aW9uX2lkeF0pKQorICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYmktPmNvbW1vbi5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGJvb2wgZGVjb2RlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX2lkeCk7CisKKyAgICAgICAgYm9vbF9kZWNvZGVyKys7CisgICAgfQorCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgLyogQ2xhbXAgbnVtYmVyIG9mIGRlY29kZXIgdGhyZWFkcyAqLworICAgIGlmIChwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCA+IG51bV90b2tlbl9wYXJ0aXRpb25zIC0gMSkKKyAgICAgICAgcGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQgPSBudW1fdG9rZW5fcGFydGl0aW9ucyAtIDE7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBpbml0X2ZyYW1lKFZQOERfQ09NUCAqcGJpKQoreworICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgID0gJiBwYmktPm1iOworCisgICAgaWYgKHBjLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIC8qIFZhcmlvdXMga2V5ZnJhbWUgaW5pdGlhbGl6YXRpb25zICovCisgICAgICAgIHZweF9tZW1jcHkocGMtPmZjLm12YywgdnA4X2RlZmF1bHRfbXZfY29udGV4dCwgc2l6ZW9mKHZwOF9kZWZhdWx0X212X2NvbnRleHQpKTsKKworICAgICAgICB2cDhfaW5pdF9tYm1vZGVfcHJvYnMocGMpOworCisgICAgICAgIHZwOF9kZWZhdWx0X2NvZWZfcHJvYnMocGMpOworCisgICAgICAgIC8qIHJlc2V0IHRoZSBzZWdtZW50IGZlYXR1cmUgZGF0YSB0byAwIHdpdGggZGVsdGEgY29kaW5nIChEZWZhdWx0IHN0YXRlKS4gKi8KKyAgICAgICAgdnB4X21lbXNldCh4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEsIDAsIHNpemVvZih4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEpKTsKKyAgICAgICAgeGQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9IFNFR01FTlRfREVMVEFEQVRBOworCisgICAgICAgIC8qIHJlc2V0IHRoZSBtb2RlIHJlZiBkZWx0YXNhIGZvciBsb29wIGZpbHRlciAqLworICAgICAgICB2cHhfbWVtc2V0KHhkLT5yZWZfbGZfZGVsdGFzLCAwLCBzaXplb2YoeGQtPnJlZl9sZl9kZWx0YXMpKTsKKyAgICAgICAgdnB4X21lbXNldCh4ZC0+bW9kZV9sZl9kZWx0YXMsIDAsIHNpemVvZih4ZC0+bW9kZV9sZl9kZWx0YXMpKTsKKworICAgICAgICAvKiBBbGwgYnVmZmVycyBhcmUgaW1wbGljaXRseSB1cGRhdGVkIG9uIGtleSBmcmFtZXMuICovCisgICAgICAgIHBjLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9IDE7CisgICAgICAgIHBjLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSAxOworICAgICAgICBwYy0+Y29weV9idWZmZXJfdG9fZ2YgPSAwOworICAgICAgICBwYy0+Y29weV9idWZmZXJfdG9fYXJmID0gMDsKKworICAgICAgICAvKiBOb3RlIHRoYXQgR29sZGVuIGFuZCBBbHRyZWYgbW9kZXMgY2Fubm90IGJlIHVzZWQgb24gYSBrZXkgZnJhbWUgc28KKyAgICAgICAgICogcmVmX2ZyYW1lX3NpZ25fYmlhc1tdIGlzIHVuZGVmaW5lZCBhbmQgbWVhbmluZ2xlc3MKKyAgICAgICAgICovCisgICAgICAgIHBjLT5yZWZfZnJhbWVfc2lnbl9iaWFzW0dPTERFTl9GUkFNRV0gPSAwOworICAgICAgICBwYy0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tBTFRSRUZfRlJBTUVdID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVG8gZW5hYmxlIGNob2ljZSBvZiBkaWZmZXJlbnQgaW50ZXJwbG9hdGlvbiBmaWx0ZXJzICovCisgICAgICAgIGlmICghcGMtPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0ICAgICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDR4NDsKKyAgICAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg0ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NDsKKyAgICAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4ODsKKyAgICAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTYgICA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDQ7CisgICAgICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4NCAgICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NDsKKyAgICAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4OworICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYmktPmRlY29kZWRfa2V5X2ZyYW1lICYmIHBiaS0+ZWNfZW5hYmxlZCAmJiAhcGJpLT5lY19hY3RpdmUpCisgICAgICAgICAgICBwYmktPmVjX2FjdGl2ZSA9IDE7CisgICAgfQorCisgICAgeGQtPmxlZnRfY29udGV4dCA9ICZwYy0+bGVmdF9jb250ZXh0OworICAgIHhkLT5tb2RlX2luZm9fY29udGV4dCA9IHBjLT5taTsKKyAgICB4ZC0+ZnJhbWVfdHlwZSA9IHBjLT5mcmFtZV90eXBlOworICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gRENfUFJFRDsKKyAgICB4ZC0+bW9kZV9pbmZvX3N0cmlkZSA9IHBjLT5tb2RlX2luZm9fc3RyaWRlOworICAgIHhkLT5jb3JydXB0ZWQgPSAwOyAvKiBpbml0IHdpdGhvdXQgY29ycnVwdGlvbiAqLworCisgICAgeGQtPmZ1bGxwaXhlbF9tYXNrID0gMHhmZmZmZmZmZjsKKyAgICBpZihwYy0+ZnVsbF9waXhlbCkKKyAgICAgICAgeGQtPmZ1bGxwaXhlbF9tYXNrID0gMHhmZmZmZmZmODsKKworfQorCitpbnQgdnA4X2RlY29kZV9mcmFtZShWUDhEX0NPTVAgKnBiaSkKK3sKKyAgICB2cDhfcmVhZGVyICpjb25zdCBiYyA9ICYgcGJpLT5tYmNbOF07CisgICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOworICAgIE1BQ1JPQkxPQ0tEICpjb25zdCB4ZCAgPSAmIHBiaS0+bWI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSA9IHBiaS0+ZnJhZ21lbnRzWzBdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFfZW5kID0gIGRhdGEgKyBwYmktPmZyYWdtZW50X3NpemVzWzBdOworICAgIHB0cmRpZmZfdCBmaXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzOworCisgICAgaW50IGksIGosIGssIGw7CisgICAgY29uc3QgaW50ICpjb25zdCBtYl9mZWF0dXJlX2RhdGFfYml0cyA9IHZwOF9tYl9mZWF0dXJlX2RhdGFfYml0czsKKyAgICBpbnQgY29ycnVwdF90b2tlbnMgPSAwOworICAgIGludCBwcmV2X2luZGVwZW5kZW50X3BhcnRpdGlvbnMgPSBwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnM7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnl2MTJfZmJfbmV3ID0gcGJpLT5kZWNfZmJfcmVmW0lOVFJBX0ZSQU1FXTsKKworICAgIC8qIHN0YXJ0IHdpdGggbm8gY29ycnVwdGlvbiBvZiBjdXJyZW50IGZyYW1lICovCisgICAgeGQtPmNvcnJ1cHRlZCA9IDA7CisgICAgeXYxMl9mYl9uZXctPmNvcnJ1cHRlZCA9IDA7CisKKyAgICBpZiAoZGF0YV9lbmQgLSBkYXRhIDwgMykKKyAgICB7CisgICAgICAgIGlmICghcGJpLT5lY19hY3RpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGMtPmVycm9yLCBWUFhfQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ1bmNhdGVkIHBhY2tldCIpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGVjbGFyZSB0aGUgbWlzc2luZyBmcmFtZSBhcyBhbiBpbnRlciBmcmFtZSBzaW5jZSBpdCB3aWxsCisgICAgICAgICAgIGJlIGhhbmRsZWQgYXMgYW4gaW50ZXIgZnJhbWUgd2hlbiB3ZSBoYXZlIGVzdGltYXRlZCBpdHMKKyAgICAgICAgICAgbW90aW9uIHZlY3RvcnMuICovCisgICAgICAgIHBjLT5mcmFtZV90eXBlID0gSU5URVJfRlJBTUU7CisgICAgICAgIHBjLT52ZXJzaW9uID0gMDsKKyAgICAgICAgcGMtPnNob3dfZnJhbWUgPSAxOworICAgICAgICBmaXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGMtPmZyYW1lX3R5cGUgPSAoRlJBTUVfVFlQRSkoZGF0YVswXSAmIDEpOworICAgICAgICBwYy0+dmVyc2lvbiA9IChkYXRhWzBdID4+IDEpICYgNzsKKyAgICAgICAgcGMtPnNob3dfZnJhbWUgPSAoZGF0YVswXSA+PiA0KSAmIDE7CisgICAgICAgIGZpcnN0X3BhcnRpdGlvbl9sZW5ndGhfaW5fYnl0ZXMgPQorICAgICAgICAgICAgKGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KSkgPj4gNTsKKworICAgICAgICBpZiAoIXBiaS0+ZWNfYWN0aXZlICYmIChkYXRhICsgZmlyc3RfcGFydGl0aW9uX2xlbmd0aF9pbl9ieXRlcyA+IGRhdGFfZW5kCisgICAgICAgICAgICB8fCBkYXRhICsgZmlyc3RfcGFydGl0aW9uX2xlbmd0aF9pbl9ieXRlcyA8IGRhdGEpKQorICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgcGFja2V0IG9yIGNvcnJ1cHQgcGFydGl0aW9uIDAgbGVuZ3RoIik7CisKKyAgICAgICAgZGF0YSArPSAzOworCisgICAgICAgIHZwOF9zZXR1cF92ZXJzaW9uKHBjKTsKKworCisgICAgICAgIGlmIChwYy0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHZldCB2aWEgc3luYyBjb2RlICovCisgICAgICAgICAgICAvKiBXaGVuIGVycm9yIGNvbmNlYWxtZW50IGlzIGVuYWJsZWQgd2Ugc2hvdWxkIG9ubHkgY2hlY2sgdGhlIHN5bmMKKyAgICAgICAgICAgICAqIGNvZGUgaWYgd2UgaGF2ZSBlbm91Z2ggYml0cyBhdmFpbGFibGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFwYmktPmVjX2FjdGl2ZSB8fCBkYXRhICsgMyA8IGRhdGFfZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkYXRhWzBdICE9IDB4OWQgfHwgZGF0YVsxXSAhPSAweDAxIHx8IGRhdGFbMl0gIT0gMHgyYSkKKyAgICAgICAgICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZyYW1lIHN5bmMgY29kZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBlcnJvciBjb25jZWFsbWVudCBpcyBlbmFibGVkIHdlIHNob3VsZCBvbmx5IHBhcnNlIHRoZSBuZXcgc2l6ZQorICAgICAgICAgICAgICogaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YS4gT3RoZXJ3aXNlIHdlIHdpbGwgZW5kIHVwIHdpdGggdGhlIHdyb25nCisgICAgICAgICAgICAgKiBzaXplLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIXBiaS0+ZWNfYWN0aXZlIHx8IGRhdGEgKyA2IDwgZGF0YV9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGMtPldpZHRoID0gKGRhdGFbM10gfCAoZGF0YVs0XSA8PCA4KSkgJiAweDNmZmY7CisgICAgICAgICAgICAgICAgcGMtPmhvcml6X3NjYWxlID0gZGF0YVs0XSA+PiA2OworICAgICAgICAgICAgICAgIHBjLT5IZWlnaHQgPSAoZGF0YVs1XSB8IChkYXRhWzZdIDw8IDgpKSAmIDB4M2ZmZjsKKyAgICAgICAgICAgICAgICBwYy0+dmVydF9zY2FsZSA9IGRhdGFbNl0gPj4gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgKz0gNzsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHZweF9tZW1jcHkoJnhkLT5wcmUsIHl2MTJfZmJfbmV3LCBzaXplb2YoWVYxMl9CVUZGRVJfQ09ORklHKSk7CisgICAgICAgICAgdnB4X21lbWNweSgmeGQtPmRzdCwgeXYxMl9mYl9uZXcsIHNpemVvZihZVjEyX0JVRkZFUl9DT05GSUcpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKCFwYmktPmRlY29kZWRfa2V5X2ZyYW1lICYmIHBjLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW5pdF9mcmFtZShwYmkpOworCisgICAgaWYgKHZwOGR4X3N0YXJ0X2RlY29kZShiYywgZGF0YSwgKHVuc2lnbmVkIGludCkoZGF0YV9lbmQgLSBkYXRhKSkpCisgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGMtPmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBib29sIGRlY29kZXIgMCIpOworICAgIGlmIChwYy0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKyAgICAgICAgcGMtPmNscl90eXBlICAgID0gKFlVVl9UWVBFKXZwOF9yZWFkX2JpdChiYyk7CisgICAgICAgIHBjLT5jbGFtcF90eXBlICA9IChDTEFNUF9UWVBFKXZwOF9yZWFkX2JpdChiYyk7CisgICAgfQorCisgICAgLyogSXMgc2VnbWVudGF0aW9uIGVuYWJsZWQgKi8KKyAgICB4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQgPSAodW5zaWduZWQgY2hhcil2cDhfcmVhZF9iaXQoYmMpOworCisgICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKKyAgICB7CisgICAgICAgIC8qIFNpZ25hbCB3aGV0aGVyIG9yIG5vdCB0aGUgc2VnbWVudGF0aW9uIG1hcCBpcyBiZWluZyBleHBsaWNpdGx5IHVwZGF0ZWQgdGhpcyBmcmFtZS4gKi8KKyAgICAgICAgeGQtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gKHVuc2lnbmVkIGNoYXIpdnA4X3JlYWRfYml0KGJjKTsKKyAgICAgICAgeGQtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSA9ICh1bnNpZ25lZCBjaGFyKXZwOF9yZWFkX2JpdChiYyk7CisKKyAgICAgICAgaWYgKHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHhkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgPSAodW5zaWduZWQgY2hhcil2cDhfcmVhZF9iaXQoYmMpOworCisgICAgICAgICAgICB2cHhfbWVtc2V0KHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSwgMCwgc2l6ZW9mKHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSkpOworCisgICAgICAgICAgICAvKiBGb3IgZWFjaCBzZWdtZW50YXRpb24gZmVhdHVyZSAoUXVhbnQgYW5kIGxvb3AgZmlsdGVyIGxldmVsKSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1CX0xWTF9NQVg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX01CX1NFR01FTlRTOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBsZXZlbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbaV1bal0gPSAoc2lnbmVkIGNoYXIpdnA4X3JlYWRfbGl0ZXJhbChiYywgbWJfZmVhdHVyZV9kYXRhX2JpdHNbaV0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbaV1bal0gPSAteGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW2ldW2pdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtpXVtqXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2hpY2ggbWFjcm8gYmxvY2sgbGV2ZWwgZmVhdHVyZXMgYXJlIGVuYWJsZWQgKi8KKyAgICAgICAgICAgIHZweF9tZW1zZXQoeGQtPm1iX3NlZ21lbnRfdHJlZV9wcm9icywgMjU1LCBzaXplb2YoeGQtPm1iX3NlZ21lbnRfdHJlZV9wcm9icykpOworCisgICAgICAgICAgICAvKiBSZWFkIHRoZSBwcm9icyB1c2VkIHRvIGRlY29kZSB0aGUgc2VnbWVudCBpZCBmb3IgZWFjaCBtYWNybyBibG9jay4gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQl9GRUFUVVJFX1RSRUVfUFJPQlM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBub3QgZXhwbGljaXRseSBzZXQgdmFsdWUgaXMgZGVmYXVsdGVkIHRvIDI1NSBieSBtZW1zZXQgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkKKyAgICAgICAgICAgICAgICAgICAgeGQtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1tpXSA9ICh2cDhfcHJvYil2cDhfcmVhZF9saXRlcmFsKGJjLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBObyBzZWdtZW50YXRpb24gdXBkYXRlcyBvbiB0aGlzIGZyYW1lICovCisgICAgICAgIHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9IDA7CisgICAgICAgIHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAwOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIGxvb3AgZmlsdGVyIGxldmVsIGFuZCB0eXBlICovCisgICAgcGMtPmZpbHRlcl90eXBlID0gKExPT1BGSUxURVJUWVBFKSB2cDhfcmVhZF9iaXQoYmMpOworICAgIHBjLT5maWx0ZXJfbGV2ZWwgPSB2cDhfcmVhZF9saXRlcmFsKGJjLCA2KTsKKyAgICBwYy0+c2hhcnBuZXNzX2xldmVsID0gdnA4X3JlYWRfbGl0ZXJhbChiYywgMyk7CisKKyAgICAvKiBSZWFkIGluIGxvb3AgZmlsdGVyIGRlbHRhcyBhcHBsaWVkIGF0IHRoZSBNQiBsZXZlbCBiYXNlZCBvbiBtb2RlIG9yIHJlZiBmcmFtZS4gKi8KKyAgICB4ZC0+bW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlID0gMDsKKyAgICB4ZC0+bW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZCA9ICh1bnNpZ25lZCBjaGFyKXZwOF9yZWFkX2JpdChiYyk7CisKKyAgICBpZiAoeGQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQpCisgICAgeworICAgICAgICAvKiBEbyB0aGUgZGVsdGFzIG5lZWQgdG8gYmUgdXBkYXRlZCAqLworICAgICAgICB4ZC0+bW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlID0gKHVuc2lnbmVkIGNoYXIpdnA4X3JlYWRfYml0KGJjKTsKKworICAgICAgICBpZiAoeGQtPm1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCB1cGRhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX0xGX0RFTFRBUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypzaWduID0gdnA4X3JlYWRfYml0KCBiYyApOyovCisgICAgICAgICAgICAgICAgICAgIHhkLT5yZWZfbGZfZGVsdGFzW2ldID0gKHNpZ25lZCBjaGFyKXZwOF9yZWFkX2xpdGVyYWwoYmMsIDYpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKSAgICAgICAgLyogQXBwbHkgc2lnbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgeGQtPnJlZl9sZl9kZWx0YXNbaV0gPSB4ZC0+cmVmX2xmX2RlbHRhc1tpXSAqIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VuZCB1cGRhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERV9MRl9ERUxUQVM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qc2lnbiA9IHZwOF9yZWFkX2JpdCggYmMgKTsqLworICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9sZl9kZWx0YXNbaV0gPSAoc2lnbmVkIGNoYXIpdnA4X3JlYWRfbGl0ZXJhbChiYywgNik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwOF9yZWFkX2JpdChiYykpICAgICAgICAvKiBBcHBseSBzaWduICovCisgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9sZl9kZWx0YXNbaV0gPSB4ZC0+bW9kZV9sZl9kZWx0YXNbaV0gKiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXR1cF90b2tlbl9kZWNvZGVyKHBiaSwgZGF0YSArIGZpcnN0X3BhcnRpdGlvbl9sZW5ndGhfaW5fYnl0ZXMpOworCisgICAgeGQtPmN1cnJlbnRfYmMgPSAmcGJpLT5tYmNbMF07CisKKyAgICAvKiBSZWFkIHRoZSBkZWZhdWx0IHF1YW50aXplcnMuICovCisgICAgeworICAgICAgICBpbnQgUSwgcV91cGRhdGU7CisKKyAgICAgICAgUSA9IHZwOF9yZWFkX2xpdGVyYWwoYmMsIDcpOyAgLyogQUMgMXN0IG9yZGVyIFEgPSBkZWZhdWx0ICovCisgICAgICAgIHBjLT5iYXNlX3FpbmRleCA9IFE7CisgICAgICAgIHFfdXBkYXRlID0gMDsKKyAgICAgICAgcGMtPnkxZGNfZGVsdGFfcSA9IGdldF9kZWx0YV9xKGJjLCBwYy0+eTFkY19kZWx0YV9xLCAmcV91cGRhdGUpOworICAgICAgICBwYy0+eTJkY19kZWx0YV9xID0gZ2V0X2RlbHRhX3EoYmMsIHBjLT55MmRjX2RlbHRhX3EsICZxX3VwZGF0ZSk7CisgICAgICAgIHBjLT55MmFjX2RlbHRhX3EgPSBnZXRfZGVsdGFfcShiYywgcGMtPnkyYWNfZGVsdGFfcSwgJnFfdXBkYXRlKTsKKyAgICAgICAgcGMtPnV2ZGNfZGVsdGFfcSA9IGdldF9kZWx0YV9xKGJjLCBwYy0+dXZkY19kZWx0YV9xLCAmcV91cGRhdGUpOworICAgICAgICBwYy0+dXZhY19kZWx0YV9xID0gZ2V0X2RlbHRhX3EoYmMsIHBjLT51dmFjX2RlbHRhX3EsICZxX3VwZGF0ZSk7CisKKyAgICAgICAgaWYgKHFfdXBkYXRlKQorICAgICAgICAgICAgdnA4Y3hfaW5pdF9kZV9xdWFudGl6ZXIocGJpKTsKKworICAgICAgICAvKiBNQiBsZXZlbCBkZXF1YW50aXplciBzZXR1cCAqLworICAgICAgICB2cDhfbWJfaW5pdF9kZXF1YW50aXplcihwYmksICZwYmktPm1iKTsKKyAgICB9CisKKyAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIGdvbGRlbiBmcmFtZSBvciBBUkYgYnVmZmVyIHNob3VsZCBiZSB1cGRhdGVkIGFuZCBob3cuCisgICAgICogRm9yIGFsbCBub24ga2V5IGZyYW1lcyB0aGUgR0YgYW5kIEFSRiByZWZyZXNoIGZsYWdzIGFuZCBzaWduIGJpYXMKKyAgICAgKiBmbGFncyBtdXN0IGJlIHNldCBleHBsaWNpdGx5LgorICAgICAqLworICAgIGlmIChwYy0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisgICAgeworICAgICAgICAvKiBTaG91bGQgdGhlIEdGIG9yIEFSRiBiZSB1cGRhdGVkIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgcGMtPnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gdnA4X3JlYWRfYml0KGJjKTsKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAgICAgLyogQXNzdW1lIHdlIHNob3VsZG4ndCByZWZyZXNoIGdvbGRlbiBpZiB0aGUgYml0IGlzIG1pc3NpbmcgKi8KKyAgICAgICAgeGQtPmNvcnJ1cHRlZCB8PSB2cDhkeF9ib29sX2Vycm9yKGJjKTsKKyAgICAgICAgaWYgKHBiaS0+ZWNfYWN0aXZlICYmIHhkLT5jb3JydXB0ZWQpCisgICAgICAgICAgICBwYy0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOworI2VuZGlmCisKKyAgICAgICAgcGMtPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSA9IHZwOF9yZWFkX2JpdChiYyk7CisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisgICAgICAgIC8qIEFzc3VtZSB3ZSBzaG91bGRuJ3QgcmVmcmVzaCBhbHRyZWYgaWYgdGhlIGJpdCBpcyBtaXNzaW5nICovCisgICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gdnA4ZHhfYm9vbF9lcnJvcihiYyk7CisgICAgICAgIGlmIChwYmktPmVjX2FjdGl2ZSAmJiB4ZC0+Y29ycnVwdGVkKQorICAgICAgICAgICAgcGMtPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSA9IDA7CisjZW5kaWYKKworICAgICAgICAvKiBCdWZmZXIgdG8gYnVmZmVyIGNvcHkgZmxhZ3MuICovCisgICAgICAgIHBjLT5jb3B5X2J1ZmZlcl90b19nZiA9IDA7CisKKyAgICAgICAgaWYgKCFwYy0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgICAgICBwYy0+Y29weV9idWZmZXJfdG9fZ2YgPSB2cDhfcmVhZF9saXRlcmFsKGJjLCAyKTsKKworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgICAgICAvKiBBc3N1bWUgd2Ugc2hvdWxkbid0IGNvcHkgdG8gdGhlIGdvbGRlbiBpZiB0aGUgYml0IGlzIG1pc3NpbmcgKi8KKyAgICAgICAgeGQtPmNvcnJ1cHRlZCB8PSB2cDhkeF9ib29sX2Vycm9yKGJjKTsKKyAgICAgICAgaWYgKHBiaS0+ZWNfYWN0aXZlICYmIHhkLT5jb3JydXB0ZWQpCisgICAgICAgICAgICBwYy0+Y29weV9idWZmZXJfdG9fZ2YgPSAwOworI2VuZGlmCisKKyAgICAgICAgcGMtPmNvcHlfYnVmZmVyX3RvX2FyZiA9IDA7CisKKyAgICAgICAgaWYgKCFwYy0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICAgICAgcGMtPmNvcHlfYnVmZmVyX3RvX2FyZiA9IHZwOF9yZWFkX2xpdGVyYWwoYmMsIDIpOworCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisgICAgICAgIC8qIEFzc3VtZSB3ZSBzaG91bGRuJ3QgY29weSB0byB0aGUgYWx0LXJlZiBpZiB0aGUgYml0IGlzIG1pc3NpbmcgKi8KKyAgICAgICAgeGQtPmNvcnJ1cHRlZCB8PSB2cDhkeF9ib29sX2Vycm9yKGJjKTsKKyAgICAgICAgaWYgKHBiaS0+ZWNfYWN0aXZlICYmIHhkLT5jb3JydXB0ZWQpCisgICAgICAgICAgICBwYy0+Y29weV9idWZmZXJfdG9fYXJmID0gMDsKKyNlbmRpZgorCisKKyAgICAgICAgcGMtPnJlZl9mcmFtZV9zaWduX2JpYXNbR09MREVOX0ZSQU1FXSA9IHZwOF9yZWFkX2JpdChiYyk7CisgICAgICAgIHBjLT5yZWZfZnJhbWVfc2lnbl9iaWFzW0FMVFJFRl9GUkFNRV0gPSB2cDhfcmVhZF9iaXQoYmMpOworICAgIH0KKworICAgIHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPSB2cDhfcmVhZF9iaXQoYmMpOworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIC8qIEFzc3VtZSB3ZSBzaG91bGRuJ3QgcmVmcmVzaCB0aGUgcHJvYmFiaWxpdGllcyBpZiB0aGUgYml0IGlzCisgICAgICogbWlzc2luZyAqLworICAgIHhkLT5jb3JydXB0ZWQgfD0gdnA4ZHhfYm9vbF9lcnJvcihiYyk7CisgICAgaWYgKHBiaS0+ZWNfYWN0aXZlICYmIHhkLT5jb3JydXB0ZWQpCisgICAgICAgIHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPSAwOworI2VuZGlmCisgICAgaWYgKHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPT0gMCkKKyAgICB7CisgICAgICAgIHZweF9tZW1jcHkoJnBjLT5sZmMsICZwYy0+ZmMsIHNpemVvZihwYy0+ZmMpKTsKKyAgICB9CisKKyAgICBwYy0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gcGMtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICB8fCAgdnA4X3JlYWRfYml0KGJjKTsKKworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIC8qIEFzc3VtZSB3ZSBzaG91bGQgcmVmcmVzaCB0aGUgbGFzdCBmcmFtZSBpZiB0aGUgYml0IGlzIG1pc3NpbmcgKi8KKyAgICB4ZC0+Y29ycnVwdGVkIHw9IHZwOGR4X2Jvb2xfZXJyb3IoYmMpOworICAgIGlmIChwYmktPmVjX2FjdGl2ZSAmJiB4ZC0+Y29ycnVwdGVkKQorICAgICAgICBwYy0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMTsKKyNlbmRpZgorCisgICAgaWYgKDApCisgICAgeworICAgICAgICBGSUxFICp6ID0gZm9wZW4oImRlY29kZXN0YXRzLnN0dCIsICJhIik7CisgICAgICAgIGZwcmludGYoeiwgIiU2ZCBGOiVkLEc6JWQsQTolZCxMOiVkLFE6JWRcbiIsCisgICAgICAgICAgICAgICAgcGMtPmN1cnJlbnRfdmlkZW9fZnJhbWUsCisgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3R5cGUsCisgICAgICAgICAgICAgICAgcGMtPnJlZnJlc2hfZ29sZGVuX2ZyYW1lLAorICAgICAgICAgICAgICAgIHBjLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgcGMtPnJlZnJlc2hfbGFzdF9mcmFtZSwKKyAgICAgICAgICAgICAgICBwYy0+YmFzZV9xaW5kZXgpOworICAgICAgICBmY2xvc2Uoeik7CisgICAgfQorCisgICAgeworICAgICAgICBwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnMgPSAxOworCisgICAgICAgIC8qIHJlYWQgY29lZiBwcm9iYWJpbGl0eSB0cmVlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19UWVBFUzsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENPRUZfQkFORFM7IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgUFJFVl9DT0VGX0NPTlRFWFRTOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBFTlRST1BZX05PREVTOyBsKyspCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3Byb2IgKmNvbnN0IHAgPSBwYy0+ZmMuY29lZl9wcm9icyBbaV1bal1ba10gKyBsOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWQoYmMsIHZwOF9jb2VmX3VwZGF0ZV9wcm9icyBbaV1bal1ba11bbF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gKHZwOF9wcm9iKXZwOF9yZWFkX2xpdGVyYWwoYmMsIDgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA+IDAgJiYgKnAgIT0gcGMtPmZjLmNvZWZfcHJvYnNbaV1bal1bay0xXVtsXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnMgPSAwOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjbGVhciBvdXQgdGhlIGNvZWZmIGJ1ZmZlciAqLworICAgIHZweF9tZW1zZXQoeGQtPnFjb2VmZiwgMCwgc2l6ZW9mKHhkLT5xY29lZmYpKTsKKworICAgIHZwOF9kZWNvZGVfbW9kZV9tdnMocGJpKTsKKworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIGlmIChwYmktPmVjX2FjdGl2ZSAmJgorICAgICAgICAgICAgcGJpLT5tdnNfY29ycnVwdF9mcm9tX21iIDwgKHVuc2lnbmVkIGludClwYy0+bWJfY29scyAqIHBjLT5tYl9yb3dzKQorICAgIHsKKyAgICAgICAgLyogTW90aW9uIHZlY3RvcnMgYXJlIG1pc3NpbmcgaW4gdGhpcyBmcmFtZS4gV2Ugd2lsbCB0cnkgdG8gZXN0aW1hdGUKKyAgICAgICAgICogdGhlbSBhbmQgdGhlbiBjb250aW51ZSBkZWNvZGluZyB0aGUgZnJhbWUgYXMgdXN1YWwgKi8KKyAgICAgICAgdnA4X2VzdGltYXRlX21pc3NpbmdfbXZzKHBiaSk7CisgICAgfQorI2VuZGlmCisKKyAgICB2cHhfbWVtc2V0KHBjLT5hYm92ZV9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykgKiBwYy0+bWJfY29scyk7CisgICAgcGJpLT5mcmFtZV9jb3JydXB0X3Jlc2lkdWFsID0gMDsKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgIGlmIChwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCAmJiBwYy0+bXVsdGlfdG9rZW5fcGFydGl0aW9uICE9IE9ORV9QQVJUSVRJT04pCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgdnA4bXRfZGVjb2RlX21iX3Jvd3MocGJpLCB4ZCk7CisgICAgICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzKHl2MTJfZmJfbmV3KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50OyArK2kpCisgICAgICAgICAgICBjb3JydXB0X3Rva2VucyB8PSBwYmktPm1iX3Jvd19kaVtpXS5tYmQuY29ycnVwdGVkOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGRlY29kZV9tYl9yb3dzKHBiaSk7CisgICAgICAgIGNvcnJ1cHRfdG9rZW5zIHw9IHhkLT5jb3JydXB0ZWQ7CisgICAgfQorCisgICAgLyogQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBkZWNvZGVyIGNvcnJ1cHRpb24uICovCisgICAgLyogMS4gQ2hlY2sgZmlyc3QgYm9vbGVhbiBkZWNvZGVyIGZvciBlcnJvcnMuICovCisgICAgeXYxMl9mYl9uZXctPmNvcnJ1cHRlZCA9IHZwOGR4X2Jvb2xfZXJyb3IoYmMpOworICAgIC8qIDIuIENoZWNrIHRoZSBtYWNyb2Jsb2NrIGluZm9ybWF0aW9uICovCisgICAgeXYxMl9mYl9uZXctPmNvcnJ1cHRlZCB8PSBjb3JydXB0X3Rva2VuczsKKworICAgIGlmICghcGJpLT5kZWNvZGVkX2tleV9mcmFtZSkKKyAgICB7CisgICAgICAgIGlmIChwYy0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgJiYKKyAgICAgICAgICAgICF5djEyX2ZiX25ldy0+Y29ycnVwdGVkKQorICAgICAgICAgICAgcGJpLT5kZWNvZGVkX2tleV9mcmFtZSA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGJpLT5jb21tb24uZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIHN0cmVhbSBtdXN0IHN0YXJ0IHdpdGggYSBjb21wbGV0ZSBrZXkgZnJhbWUiKTsKKyAgICB9CisKKyAgICAvKiB2cHhfbG9nKCJEZWNvZGVyOiBGcmFtZSBEZWNvZGVkLCBTaXplIFJvdWdobHk6JWQgYnl0ZXMgIFxuIixiYy0+cG9zK3BiaS0+YmMyLnBvcyk7ICovCisKKyAgICBpZiAocGMtPnJlZnJlc2hfZW50cm9weV9wcm9icyA9PSAwKQorICAgIHsKKyAgICAgICAgdnB4X21lbWNweSgmcGMtPmZjLCAmcGMtPmxmYywgc2l6ZW9mKHBjLT5mYykpOworICAgICAgICBwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnMgPSBwcmV2X2luZGVwZW5kZW50X3BhcnRpdGlvbnM7CisgICAgfQorCisjaWZkZWYgUEFDS0VUX1RFU1RJTkcKKyAgICB7CisgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiZGVjb21wcmVzc29yLlZQOCIsICJhYiIpOworICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IHBiaS0+YmMyLnBvcyArIHBiaS0+YmMucG9zICsgODsKKyAgICAgICAgZndyaXRlKCh2b2lkICopICZzaXplLCA0LCAxLCBmKTsKKyAgICAgICAgZndyaXRlKCh2b2lkICopIHBiaS0+U291cmNlLCBzaXplLCAxLCBmKTsKKyAgICAgICAgZmNsb3NlKGYpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2RlY29kZXIvZGV0b2tlbml6ZS5jIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJmZjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorI2luY2x1ZGUgIm9ueXhkX2ludC5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKKyNpbmNsdWRlICJkZXRva2VuaXplLmgiCisKK3ZvaWQgdnA4X3Jlc2V0X21iX3Rva2Vuc19jb250ZXh0KE1BQ1JPQkxPQ0tEICp4KQoreworICAgIEVOVFJPUFlfQ09OVEVYVCAqYV9jdHggPSAoKEVOVFJPUFlfQ09OVEVYVCAqKXgtPmFib3ZlX2NvbnRleHQpOworICAgIEVOVFJPUFlfQ09OVEVYVCAqbF9jdHggPSAoKEVOVFJPUFlfQ09OVEVYVCAqKXgtPmxlZnRfY29udGV4dCk7CisKKyAgICB2cHhfbWVtc2V0KGFfY3R4LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUyktMSk7CisgICAgdnB4X21lbXNldChsX2N0eCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpLTEpOworCisgICAgLyogQ2xlYXIgZW50cm9weSBjb250ZXh0cyBmb3IgWTIgYmxvY2tzICovCisgICAgaWYgKCF4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5pc180eDQpCisgICAgeworICAgICAgICBhX2N0eFs4XSA9IGxfY3R4WzhdID0gMDsKKyAgICB9Cit9CisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUmVzaWR1YWwgZGVjb2RpbmcgKFBhcmFncmFwaCAxMy4yIC8gMTMuMykKKyovCitzdGF0aWMgY29uc3QgdWludDhfdCBrQmFuZHNbMTYgKyAxXSA9IHsKKyAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKKyAgMCAgLyogZXh0cmEgZW50cnkgYXMgc2VudGluZWwgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQzW10gPSB7IDE3MywgMTQ4LCAxNDAsIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAsIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ2W10gPQorICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5LCAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCogY29uc3Qga0NhdDM0NTZbXSA9IHsga0NhdDMsIGtDYXQ0LCBrQ2F0NSwga0NhdDYgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0geworICAwLCAxLCA0LCA4LCAgNSwgMiwgMywgNiwgIDksIDEyLCAxMywgMTAsICA3LCAxMSwgMTQsIDE1Cit9OworCisjZGVmaW5lIFZQOEdldEJpdCB2cDhkeF9kZWNvZGVfYm9vbAorI2RlZmluZSBOVU1fUFJPQkFTICAxMQorI2RlZmluZSBOVU1fQ1RYICAzCisKKy8qIGZvciBjb25zdC1jYXN0aW5nICovCit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCpQcm9iYUFycmF5KVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKKworc3RhdGljIGludCBHZXRTaWduZWQoQk9PTF9ERUNPREVSICpiciwgaW50IHZhbHVlX3RvX3NpZ24pCit7CisgICAgaW50IHNwbGl0ID0gKGJyLT5yYW5nZSArIDEpID4+IDE7CisgICAgVlA4X0JEX1ZBTFVFIGJpZ3NwbGl0ID0gKFZQOF9CRF9WQUxVRSlzcGxpdCA8PCAoVlA4X0JEX1ZBTFVFX1NJWkUgLSA4KTsKKyAgICBpbnQgdjsKKworICAgIGlmKGJyLT5jb3VudCA8IDApCisgICAgICAgIHZwOGR4X2Jvb2xfZGVjb2Rlcl9maWxsKGJyKTsKKworICAgIGlmICggYnItPnZhbHVlIDwgYmlnc3BsaXQgKQorICAgIHsKKyAgICAgICAgYnItPnJhbmdlID0gc3BsaXQ7CisgICAgICAgIHY9IHZhbHVlX3RvX3NpZ247CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJyLT5yYW5nZSA9IGJyLT5yYW5nZS1zcGxpdDsKKyAgICAgICAgYnItPnZhbHVlID0gYnItPnZhbHVlLWJpZ3NwbGl0OworICAgICAgICB2ID0gLXZhbHVlX3RvX3NpZ247CisgICAgfQorICAgIGJyLT5yYW5nZSArPWJyLT5yYW5nZTsKKyAgICBici0+dmFsdWUgKz1ici0+dmFsdWU7CisgICAgYnItPmNvdW50LS07CisKKyAgICByZXR1cm4gdjsKK30KKy8qCisgICBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBub24temVybyBjb2VmZiBwbHVzIG9uZQorICAgKGFuZCAwIGlmIHRoZXJlJ3Mgbm8gY29lZmYgYXQgYWxsKQorKi8KK3N0YXRpYyBpbnQgR2V0Q29lZmZzKEJPT0xfREVDT0RFUiAqYnIsIFByb2JhQXJyYXkgcHJvYiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjdHgsIGludCBuLCBpbnQxNl90KiBvdXQpCit7CisgICAgY29uc3QgdWludDhfdCogcCA9IHByb2Jbbl1bY3R4XTsKKyAgICBpZiAoIVZQOEdldEJpdChiciwgcFswXSkpCisgICAgeyAgIC8qIGZpcnN0IEVPQiBpcyBtb3JlIGEgJ0NCUCcgYml0LiAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICArK247CisgICAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcCA9IHByb2Jba0JhbmRzW25dXVswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgIC8qIG5vbiB6ZXJvIGNvZWZmICovCisgICAgICAgICAgICBpbnQgdiwgajsKKyAgICAgICAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzJdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwID0gcHJvYltrQmFuZHNbbl1dWzFdOworICAgICAgICAgICAgICAgIHYgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzNdKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzRdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gMyArIFZQOEdldEJpdChiciwgcFs1XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbNl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZQOEdldEJpdChiciwgcFs3XSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IDUgKyBWUDhHZXRCaXQoYnIsIDE1OSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gNyArIDIgKiBWUDhHZXRCaXQoYnIsIDE2NSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSBWUDhHZXRCaXQoYnIsIDE0NSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0YWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYml0MSA9IFZQOEdldEJpdChiciwgcFs4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYml0MCA9IFZQOEdldEJpdChiciwgcFs5ICsgYml0MV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNhdCA9IDIgKiBiaXQxICsgYml0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0YWIgPSBrQ2F0MzQ1NltjYXRdOyAqdGFiOyArK3RhYikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IHYgKyBWUDhHZXRCaXQoYnIsICp0YWIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzICsgKDggPDwgY2F0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwID0gcHJvYltrQmFuZHNbbl1dWzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaiA9IGtaaWd6YWdbbiAtIDFdOworCisgICAgICAgICAgICBvdXRbal0gPSBHZXRTaWduZWQoYnIsIHYpOworCisgICAgICAgICAgICBpZiAobiA9PSAxNiB8fCAhVlA4R2V0Qml0KGJyLCBwWzBdKSkKKyAgICAgICAgICAgIHsgICAvKiBFT0IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobiA9PSAxNikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDE2OworICAgICAgICB9CisgICAgfQorfQorCitpbnQgdnA4X2RlY29kZV9tYl90b2tlbnMoVlA4RF9DT01QICpkeCwgTUFDUk9CTE9DS0QgKngpCit7CisgICAgQk9PTF9ERUNPREVSICpiYyA9IHgtPmN1cnJlbnRfYmM7CisgICAgY29uc3QgRlJBTUVfQ09OVEVYVCAqIGNvbnN0IGZjID0gJmR4LT5jb21tb24uZmM7CisgICAgY2hhciAqZW9icyA9IHgtPmVvYnM7CisKKyAgICBpbnQgaTsKKyAgICBpbnQgbm9uemVyb3M7CisgICAgaW50IGVvYnRvdGFsID0gMDsKKworICAgIHNob3J0ICpxY29lZmZfcHRyOworICAgIFByb2JhQXJyYXkgY29lZl9wcm9iczsKKyAgICBFTlRST1BZX0NPTlRFWFQgKmFfY3R4ID0gKChFTlRST1BZX0NPTlRFWFQgKil4LT5hYm92ZV9jb250ZXh0KTsKKyAgICBFTlRST1BZX0NPTlRFWFQgKmxfY3R4ID0gKChFTlRST1BZX0NPTlRFWFQgKil4LT5sZWZ0X2NvbnRleHQpOworICAgIEVOVFJPUFlfQ09OVEVYVCAqYTsKKyAgICBFTlRST1BZX0NPTlRFWFQgKmw7CisgICAgaW50IHNraXBfZGMgPSAwOworCisgICAgcWNvZWZmX3B0ciA9ICZ4LT5xY29lZmZbMF07CisKKyAgICBpZiAoIXgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmlzXzR4NCkKKyAgICB7CisgICAgICAgIGEgPSBhX2N0eCArIDg7CisgICAgICAgIGwgPSBsX2N0eCArIDg7CisKKyAgICAgICAgY29lZl9wcm9icyA9IGZjLT5jb2VmX3Byb2JzIFsxXTsKKworICAgICAgICBub256ZXJvcyA9IEdldENvZWZmcyhiYywgY29lZl9wcm9icywgKCphICsgKmwpLCAwLCBxY29lZmZfcHRyICsgMjQgKiAxNik7CisgICAgICAgICphID0gKmwgPSAobm9uemVyb3MgPiAwKTsKKworICAgICAgICBlb2JzWzI0XSA9IG5vbnplcm9zOworICAgICAgICBlb2J0b3RhbCArPSBub256ZXJvcyAtIDE2OworCisgICAgICAgIGNvZWZfcHJvYnMgPSBmYy0+Y29lZl9wcm9icyBbMF07CisgICAgICAgIHNraXBfZGMgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb2VmX3Byb2JzID0gZmMtPmNvZWZfcHJvYnMgWzNdOworICAgICAgICBza2lwX2RjID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKKyAgICB7CisgICAgICAgIGEgPSBhX2N0eCArIChpJjMpOworICAgICAgICBsID0gbF9jdHggKyAoKGkmMHhjKT4+Mik7CisKKyAgICAgICAgbm9uemVyb3MgPSBHZXRDb2VmZnMoYmMsIGNvZWZfcHJvYnMsICgqYSArICpsKSwgc2tpcF9kYywgcWNvZWZmX3B0cik7CisgICAgICAgICphID0gKmwgPSAobm9uemVyb3MgPiAwKTsKKworICAgICAgICBub256ZXJvcyArPSBza2lwX2RjOworICAgICAgICBlb2JzW2ldID0gbm9uemVyb3M7CisgICAgICAgIGVvYnRvdGFsICs9IG5vbnplcm9zOworICAgICAgICBxY29lZmZfcHRyICs9IDE2OworICAgIH0KKworICAgIGNvZWZfcHJvYnMgPSBmYy0+Y29lZl9wcm9icyBbMl07CisKKyAgICBhX2N0eCArPSA0OworICAgIGxfY3R4ICs9IDQ7CisgICAgZm9yIChpID0gMTY7IGkgPCAyNDsgKytpKQorICAgIHsKKyAgICAgICAgYSA9IGFfY3R4ICsgKChpID4gMTkpPDwxKSArIChpJjEpOworICAgICAgICBsID0gbF9jdHggKyAoKGkgPiAxOSk8PDEpICsgKChpJjMpPjEpOworCisgICAgICAgIG5vbnplcm9zID0gR2V0Q29lZmZzKGJjLCBjb2VmX3Byb2JzLCAoKmEgKyAqbCksIDAsIHFjb2VmZl9wdHIpOworICAgICAgICAqYSA9ICpsID0gKG5vbnplcm9zID4gMCk7CisKKyAgICAgICAgZW9ic1tpXSA9IG5vbnplcm9zOworICAgICAgICBlb2J0b3RhbCArPSBub256ZXJvczsKKyAgICAgICAgcWNvZWZmX3B0ciArPSAxNjsKKyAgICB9CisKKyAgICByZXR1cm4gZW9idG90YWw7Cit9CisKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuaCBiL2xpYnZweC92cDgvZGVjb2Rlci9kZXRva2VuaXplLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9kZWNvZGVyL2RldG9rZW5pemUuaApyZW5hbWUgdG8gbGlidnB4L3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuaApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9kZWNvZGVyL2VjX3R5cGVzLmggYi9saWJ2cHgvdnA4L2RlY29kZXIvZWNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2I1ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2VjX3R5cGVzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIFZQOF9ERUNfRUNfVFlQRVNfSAorI2RlZmluZSBWUDhfREVDX0VDX1RZUEVTX0gKKworI2RlZmluZSBNQVhfT1ZFUkxBUFMgMTYKKworCisKKy8qIFRoZSBhcmVhIChwaXhlbCBhcmVhIGluIFE2KSB0aGUgYmxvY2sgcG9pbnRlZCB0byBieSBibWkgb3ZlcmxhcHMKKyAqIGFub3RoZXIgYmxvY2sgd2l0aC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgb3ZlcmxhcDsKKyAgICB1bmlvbiBiX21vZGVfaW5mbyAqYm1pOworfSBPVkVSTEFQX05PREU7CisKKy8qIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIG92ZXJsYXBwaW5nIGJsb2NrcyBvbiBhIGJsb2NrIGxldmVsLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBUT0RPKGhvbG1lcik6IFRoaXMgYXJyYXkgc2hvdWxkIGJlIGV4Y2hhbmdlZCBmb3IgYSBsaW5rZWQgbGlzdCAqLworICAgIE9WRVJMQVBfTk9ERSBvdmVybGFwc1tNQVhfT1ZFUkxBUFNdOworfSBCX09WRVJMQVA7CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYWxsIHRoZSBvdmVybGFwcyBvZiBhIG1hY3JvYmxvY2suIFRoZSBvdmVybGFwcyBvZiBhCisgKiBtYWNyb2Jsb2NrIGlzIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIGJsb2NrIG92ZXJsYXBzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJfT1ZFUkxBUCBvdmVybGFwc1sxNl07Cit9IE1CX09WRVJMQVA7CisKKy8qIFN0cnVjdHVyZSBmb3Iga2VlcGluZyB0cmFjayBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgd2hpY2ggcmVmZXJlbmNlIGZyYW1lIHRoZXkKKyAqIHJlZmVyIHRvLiBVc2VkIGZvciBtb3Rpb24gdmVjdG9yIGludGVycG9sYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTVYgbXY7CisgICAgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZTsKK30gRUNfQkxPQ0s7CisKKyNlbmRpZiAvKiBWUDhfREVDX0VDX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZGVjb2Rlci9lcnJvcl9jb25jZWFsbWVudC5jIGIvbGlidnB4L3ZwOC9kZWNvZGVyL2Vycm9yX2NvbmNlYWxtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyZTMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZGVjb2Rlci9lcnJvcl9jb25jZWFsbWVudC5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJlcnJvcl9jb25jZWFsbWVudC5oIgorI2luY2x1ZGUgIm9ueXhkX2ludC5oIgorI2luY2x1ZGUgImRlY29kZW12LmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9maW5kbmVhcm12LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBNSU4oeCx5KSAoKCh4KTwoeSkpPyh4KTooeSkpCisjZGVmaW5lIE1BWCh4LHkpICgoKHgpPih5KSk/KHgpOih5KSkKKworI2RlZmluZSBGTE9PUih4LHEpICgoeCkgJiAtKDEgPDwgKHEpKSkKKworI2RlZmluZSBOVU1fTkVJR0hCT1JTIDIwCisKK3R5cGVkZWYgc3RydWN0IGVjX3Bvc2l0aW9uCit7CisgICAgaW50IHJvdzsKKyAgICBpbnQgY29sOworfSBFQ19QT1M7CisKKy8qCisgKiBSZWdlbmVyYXRlIHRoZSB0YWJsZSBpbiBNYXRsYWIgd2l0aDoKKyAqIHggPSBtZXNoZ3JpZCgoMTo0KSwgKDE6NCkpOworICogeSA9IG1lc2hncmlkKCgxOjQpLCAoMTo0KSknOworICogVyA9IHJvdW5kKCgxLi8oc3FydCh4Ll4yICsgeS5eMikpKjJeNykpOworICogVygxLDEpID0gMDsKKyAqLworc3RhdGljIGNvbnN0IGludCB3ZWlnaHRzX3E3WzVdWzVdID0geworICAgICAgIHsgIDAsICAgMTI4LCAgICA2NCwgICAgNDMsICAgIDMyIH0sCisgICAgICAgezEyOCwgICAgOTEsICAgIDU3LCAgICA0MCwgICAgMzEgfSwKKyAgICAgICB7IDY0LCAgICA1NywgICAgNDUsICAgIDM2LCAgICAyOSB9LAorICAgICAgIHsgNDMsICAgIDQwLCAgICAzNiwgICAgMzAsICAgIDI2IH0sCisgICAgICAgeyAzMiwgICAgMzEsICAgIDI5LCAgICAyNiwgICAgMjMgfQorfTsKKworaW50IHZwOF9hbGxvY19vdmVybGFwX2xpc3RzKFZQOERfQ09NUCAqcGJpKQoreworICAgIGlmIChwYmktPm92ZXJsYXBzICE9IE5VTEwpCisgICAgeworICAgICAgICB2cHhfZnJlZShwYmktPm92ZXJsYXBzKTsKKyAgICAgICAgcGJpLT5vdmVybGFwcyA9IE5VTEw7CisgICAgfQorCisgICAgcGJpLT5vdmVybGFwcyA9IHZweF9jYWxsb2MocGJpLT5jb21tb24ubWJfcm93cyAqIHBiaS0+Y29tbW9uLm1iX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE1CX09WRVJMQVApKTsKKworICAgIGlmIChwYmktPm92ZXJsYXBzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIHZwOF9kZV9hbGxvY19vdmVybGFwX2xpc3RzKFZQOERfQ09NUCAqcGJpKQoreworICAgIHZweF9mcmVlKHBiaS0+b3ZlcmxhcHMpOworICAgIHBiaS0+b3ZlcmxhcHMgPSBOVUxMOworfQorCisvKiBJbnNlcnRzIGEgbmV3IG92ZXJsYXAgYXJlYSB2YWx1ZSB0byB0aGUgbGlzdCBvZiBvdmVybGFwcyBvZiBhIGJsb2NrICovCitzdGF0aWMgdm9pZCBhc3NpZ25fb3ZlcmxhcChPVkVSTEFQX05PREUqIG92ZXJsYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gYl9tb2RlX2luZm8gKmJtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVybGFwKQoreworICAgIGludCBpOworICAgIGlmIChvdmVybGFwIDw9IDApCisgICAgICAgIHJldHVybjsKKyAgICAvKiBGaW5kIGFuZCBhc3NpZ24gdG8gdGhlIG5leHQgZW1wdHkgb3ZlcmxhcCBub2RlIGluIHRoZSBsaXN0IG9mIG92ZXJsYXBzLgorICAgICAqIEVtcHR5IGlzIGRlZmluZWQgYXMgYm1pID09IE5VTEwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX09WRVJMQVBTOyBpKyspCisgICAgeworICAgICAgICBpZiAob3ZlcmxhcHNbaV0uYm1pID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG92ZXJsYXBzW2ldLmJtaSA9IGJtaTsKKyAgICAgICAgICAgIG92ZXJsYXBzW2ldLm92ZXJsYXAgPSBvdmVybGFwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENhbGN1bGF0ZXMgdGhlIG92ZXJsYXAgYXJlYSBiZXR3ZWVuIHR3byA0eDQgc3F1YXJlcywgd2hlcmUgdGhlIGZpcnN0CisgKiBzcXVhcmUgaGFzIGl0cyB1cHBlci1sZWZ0IGNvcm5lciBhdCAoYjFfcm93LCBiMV9jb2wpIGFuZCB0aGUgc2Vjb25kCisgKiBzcXVhcmUgaGFzIGl0cyB1cHBlci1sZWZ0IGNvcm5lciBhdCAoYjJfcm93LCBiMl9jb2wpLiBEb2Vzbid0CisgKiBwcm9wZXJseSBoYW5kbGUgc3F1YXJlcyB3aGljaCBkbyBub3Qgb3ZlcmxhcC4KKyAqLworc3RhdGljIGludCBibG9ja19vdmVybGFwKGludCBiMV9yb3csIGludCBiMV9jb2wsIGludCBiMl9yb3csIGludCBiMl9jb2wpCit7CisgICAgY29uc3QgaW50IGludF90b3AgPSBNQVgoYjFfcm93LCBiMl9yb3cpOyAvLyB0b3AKKyAgICBjb25zdCBpbnQgaW50X2xlZnQgPSBNQVgoYjFfY29sLCBiMl9jb2wpOyAvLyBsZWZ0CisgICAgLyogU2luY2UgZWFjaCBibG9jayBpcyA0eDQgcGl4ZWxzLCBhZGRpbmcgNCAoUTMpIHRvIHRoZSBsZWZ0L3RvcCBlZGdlCisgICAgICogZ2l2ZXMgdXMgdGhlIHJpZ2h0L2JvdHRvbSBlZGdlLgorICAgICAqLworICAgIGNvbnN0IGludCBpbnRfcmlnaHQgPSBNSU4oYjFfY29sICsgKDQ8PDMpLCBiMl9jb2wgKyAoNDw8MykpOyAvLyByaWdodAorICAgIGNvbnN0IGludCBpbnRfYm90dG9tID0gTUlOKGIxX3JvdyArICg0PDwzKSwgYjJfcm93ICsgKDQ8PDMpKTsgLy8gYm90dG9tCisgICAgcmV0dXJuIChpbnRfYm90dG9tIC0gaW50X3RvcCkgKiAoaW50X3JpZ2h0IC0gaW50X2xlZnQpOworfQorCisvKiBDYWxjdWxhdGVzIHRoZSBvdmVybGFwIGFyZWEgZm9yIGFsbCBibG9ja3MgaW4gYSBtYWNyb2Jsb2NrIGF0IHBvc2l0aW9uCisgKiAobWJfcm93LCBtYl9jb2wpIGluIG1hY3JvYmxvY2tzLCB3aGljaCBhcmUgYmVpbmcgb3ZlcmxhcHBlZCBieSBhIGdpdmVuCisgKiBvdmVybGFwcGluZyBibG9jayBhdCBwb3NpdGlvbiAobmV3X3JvdywgbmV3X2NvbCkgKGluIHBpeGVscywgUTMpLiBUaGUKKyAqIGZpcnN0IGJsb2NrIGJlaW5nIG92ZXJsYXBwZWQgaW4gdGhlIG1hY3JvYmxvY2sgaGFzIHBvc2l0aW9uIChmaXJzdF9ibGtfcm93LAorICogZmlyc3RfYmxrX2NvbCkgaW4gYmxvY2tzIHJlbGF0aXZlIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vdmVybGFwc19tYihCX09WRVJMQVAgKmJfb3ZlcmxhcHMsIHVuaW9uIGJfbW9kZV9pbmZvICpibWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld19yb3csIGludCBuZXdfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3csIGludCBtYl9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X2Jsa19yb3csIGludCBmaXJzdF9ibGtfY29sKQoreworICAgIC8qIEZpbmQgdGhlIGJsb2NrcyB3aXRoaW4gdGhpcyBNQiAoZGVmaW5lZCBieSBtYl9yb3csIG1iX2NvbCkgd2hpY2ggYXJlCisgICAgICogb3ZlcmxhcHBlZCBieSBibWkgYW5kIGNhbGN1bGF0ZSBhbmQgYXNzaWduIG92ZXJsYXAgZm9yIGVhY2ggb2YgdGhvc2UKKyAgICAgKiBibG9ja3MuICovCisKKyAgICAvKiBCbG9jayBjb29yZGluYXRlcyByZWxhdGl2ZSB0aGUgdXBwZXItbGVmdCBibG9jayAqLworICAgIGNvbnN0IGludCByZWxfb2xfYmxrX3JvdyA9IGZpcnN0X2Jsa19yb3cgLSBtYl9yb3cgKiA0OworICAgIGNvbnN0IGludCByZWxfb2xfYmxrX2NvbCA9IGZpcnN0X2Jsa19jb2wgLSBtYl9jb2wgKiA0OworICAgIC8qIElmIHRoZSBibG9jayBwYXJ0bHkgb3ZlcmxhcHMgYW55IHByZXZpb3VzIE1CLCB0aGVzZSBjb29yZGluYXRlcworICAgICAqIGNhbiBiZSA8IDAuIFdlIGRvbid0IHdhbnQgdG8gYWNjZXNzIGJsb2NrcyBpbiBwcmV2aW91cyBNQnMuCisgICAgICovCisgICAgY29uc3QgaW50IGJsa19pZHggPSBNQVgocmVsX29sX2Jsa19yb3csMCkgKiA0ICsgTUFYKHJlbF9vbF9ibGtfY29sLDApOworICAgIC8qIFVwcGVyIGxlZnQgb3ZlcmxhcHBpbmcgYmxvY2sgKi8KKyAgICBCX09WRVJMQVAgKmJfb2xfdWwgPSAmKGJfb3ZlcmxhcHNbYmxrX2lkeF0pOworCisgICAgLyogQ2FsY3VsYXRlIGFuZCBhc3NpZ24gb3ZlcmxhcHMgZm9yIGFsbCBibG9ja3MgaW4gdGhpcyBNQgorICAgICAqIHdoaWNoIHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2sgb3ZlcmxhcHMKKyAgICAgKi8KKyAgICAvKiBBdm9pZCBjYWxjdWxhdGluZyBvdmVybGFwcyBmb3IgYmxvY2tzIGluIGxhdGVyIE1CcyAqLworICAgIGludCBlbmRfcm93ID0gTUlOKDQgKyBtYl9yb3cgKiA0IC0gZmlyc3RfYmxrX3JvdywgMik7CisgICAgaW50IGVuZF9jb2wgPSBNSU4oNCArIG1iX2NvbCAqIDQgLSBmaXJzdF9ibGtfY29sLCAyKTsKKyAgICBpbnQgcm93LCBjb2w7CisKKyAgICAvKiBDaGVjayBpZiBuZXdfcm93IGFuZCBuZXdfY29sIGFyZSBldmVubHkgZGl2aXNpYmxlIGJ5IDQgKFEzKSwKKyAgICAgKiBhbmQgaWYgc28gd2Ugc2hvdWxkbid0IGNoZWNrIG5laWdoYm9yaW5nIGJsb2NrcworICAgICAqLworICAgIGlmIChuZXdfcm93ID49IDAgJiYgKG5ld19yb3cgJiAweDFGKSA9PSAwKQorICAgICAgICBlbmRfcm93ID0gMTsKKyAgICBpZiAobmV3X2NvbCA+PSAwICYmIChuZXdfY29sICYgMHgxRikgPT0gMCkKKyAgICAgICAgZW5kX2NvbCA9IDE7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgb3ZlcmxhcHBpbmcgYmxvY2sgcGFydGx5IG92ZXJsYXBzIGEgcHJldmlvdXMgTUIKKyAgICAgKiBhbmQgaWYgc28sIHdlJ3JlIG92ZXJsYXBwaW5nIGZld2VyIGJsb2NrcyBpbiB0aGlzIE1CLgorICAgICAqLworICAgIGlmIChuZXdfcm93IDwgKG1iX3JvdyoxNik8PDMpCisgICAgICAgIGVuZF9yb3cgPSAxOworICAgIGlmIChuZXdfY29sIDwgKG1iX2NvbCoxNik8PDMpCisgICAgICAgIGVuZF9jb2wgPSAxOworCisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBlbmRfcm93OyArK3JvdykKKyAgICB7CisgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgZW5kX2NvbDsgKytjb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlucHV0IGluIFEzLCByZXN1bHQgaW4gUTYgKi8KKyAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwID0gYmxvY2tfb3ZlcmxhcChuZXdfcm93LCBuZXdfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChmaXJzdF9ibGtfcm93ICsgcm93KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSA8PCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZmlyc3RfYmxrX2NvbCArIGNvbCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkgPDwgMykpOworICAgICAgICAgICAgYXNzaWduX292ZXJsYXAoYl9vbF91bFtyb3cgKiA0ICsgY29sXS5vdmVybGFwcywgYm1pLCBvdmVybGFwKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2cDhfY2FsY3VsYXRlX292ZXJsYXBzKE1CX09WRVJMQVAgKm92ZXJsYXBfdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3Jvd3MsIGludCBtYl9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGJfbW9kZV9pbmZvICpibWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfcm93LCBpbnQgYl9jb2wpCit7CisgICAgTUJfT1ZFUkxBUCAqbWJfb3ZlcmxhcDsKKyAgICBpbnQgcm93LCBjb2wsIHJlbF9yb3csIHJlbF9jb2w7CisgICAgaW50IG5ld19yb3csIG5ld19jb2w7CisgICAgaW50IGVuZF9yb3csIGVuZF9jb2w7CisgICAgaW50IG92ZXJsYXBfYl9yb3csIG92ZXJsYXBfYl9jb2w7CisgICAgaW50IG92ZXJsYXBfbWJfcm93LCBvdmVybGFwX21iX2NvbDsKKworICAgIC8qIG1iIHN1YnBpeGVsIHBvc2l0aW9uICovCisgICAgcm93ID0gKDQgKiBiX3JvdykgPDwgMzsgLyogUTMgKi8KKyAgICBjb2wgPSAoNCAqIGJfY29sKSA8PCAzOyAvKiBRMyAqLworCisgICAgLyogcmV2ZXJzZSBjb21wZW5zYXRlIGZvciBtb3Rpb24gKi8KKyAgICBuZXdfcm93ID0gcm93IC0gYm1pLT5tdi5hc19tdi5yb3c7CisgICAgbmV3X2NvbCA9IGNvbCAtIGJtaS0+bXYuYXNfbXYuY29sOworCisgICAgaWYgKG5ld19yb3cgPj0gKCgxNiptYl9yb3dzKSA8PCAzKSB8fCBuZXdfY29sID49ICgoMTYqbWJfY29scykgPDwgMykpCisgICAgeworICAgICAgICAvKiB0aGUgbmV3IGJsb2NrIGVuZGVkIHVwIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobmV3X3JvdyA8PSAoLTQgPDwgMykgfHwgbmV3X2NvbCA8PSAoLTQgPDwgMykpCisgICAgeworICAgICAgICAvKiBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIG92ZXJsYXBwaW5nIGJsb2NrJ3MgcG9zaXRpb24gaW4gYmxvY2tzICovCisgICAgb3ZlcmxhcF9iX3JvdyA9IEZMT09SKG5ld19yb3cgLyA0LCAzKSA+PiAzOworICAgIG92ZXJsYXBfYl9jb2wgPSBGTE9PUihuZXdfY29sIC8gNCwgMykgPj4gMzsKKworICAgIC8qIG92ZXJsYXBwaW5nIGJsb2NrJ3MgTUIgcG9zaXRpb24gaW4gTUJzCisgICAgICogb3BlcmF0aW9ucyBhcmUgZG9uZSBpbiBRMworICAgICAqLworICAgIG92ZXJsYXBfbWJfcm93ID0gRkxPT1IoKG92ZXJsYXBfYl9yb3cgPDwgMykgLyA0LCAzKSA+PiAzOworICAgIG92ZXJsYXBfbWJfY29sID0gRkxPT1IoKG92ZXJsYXBfYl9jb2wgPDwgMykgLyA0LCAzKSA+PiAzOworCisgICAgZW5kX3JvdyA9IE1JTihtYl9yb3dzIC0gb3ZlcmxhcF9tYl9yb3csIDIpOworICAgIGVuZF9jb2wgPSBNSU4obWJfY29scyAtIG92ZXJsYXBfbWJfY29sLCAyKTsKKworICAgIC8qIERvbid0IGNhbGN1bGF0ZSBvdmVybGFwIGZvciBNQnMgd2UgZG9uJ3Qgb3ZlcmxhcCAqLworICAgIC8qIENoZWNrIGlmIHRoZSBuZXcgYmxvY2sgcm93IHN0YXJ0cyBhdCB0aGUgbGFzdCBibG9jayByb3cgb2YgdGhlIE1CICovCisgICAgaWYgKGFicyhuZXdfcm93IC0gKCgxNipvdmVybGFwX21iX3JvdykgPDwgMykpIDwgKCgzKjQpIDw8IDMpKQorICAgICAgICBlbmRfcm93ID0gMTsKKyAgICAvKiBDaGVjayBpZiB0aGUgbmV3IGJsb2NrIGNvbCBzdGFydHMgYXQgdGhlIGxhc3QgYmxvY2sgY29sIG9mIHRoZSBNQiAqLworICAgIGlmIChhYnMobmV3X2NvbCAtICgoMTYqb3ZlcmxhcF9tYl9jb2wpIDw8IDMpKSA8ICgoMyo0KSA8PCAzKSkKKyAgICAgICAgZW5kX2NvbCA9IDE7CisKKyAgICAvKiBmaW5kIHRoZSBNQihzKSB0aGlzIGJsb2NrIGlzIG92ZXJsYXBwaW5nICovCisgICAgZm9yIChyZWxfcm93ID0gMDsgcmVsX3JvdyA8IGVuZF9yb3c7ICsrcmVsX3JvdykKKyAgICB7CisgICAgICAgIGZvciAocmVsX2NvbCA9IDA7IHJlbF9jb2wgPCBlbmRfY29sOyArK3JlbF9jb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdmVybGFwX21iX3JvdyArIHJlbF9yb3cgPCAwIHx8CisgICAgICAgICAgICAgICAgb3ZlcmxhcF9tYl9jb2wgKyByZWxfY29sIDwgMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG1iX292ZXJsYXAgPSBvdmVybGFwX3VsICsgKG92ZXJsYXBfbWJfcm93ICsgcmVsX3JvdykgKiBtYl9jb2xzICsKKyAgICAgICAgICAgICAgICAgb3ZlcmxhcF9tYl9jb2wgKyByZWxfY29sOworCisgICAgICAgICAgICBjYWxjdWxhdGVfb3ZlcmxhcHNfbWIobWJfb3ZlcmxhcC0+b3ZlcmxhcHMsIGJtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcm93LCBuZXdfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXBfbWJfcm93ICsgcmVsX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwX21iX2NvbCArIHJlbF9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcF9iX3JvdyArIHJlbF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcF9iX2NvbCArIHJlbF9jb2wpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBFc3RpbWF0ZXMgYSBtb3Rpb24gdmVjdG9yIGdpdmVuIHRoZSBvdmVybGFwcGluZyBibG9ja3MnIG1vdGlvbiB2ZWN0b3JzLgorICogRmlsdGVycyBvdXQgYWxsIG92ZXJsYXBwaW5nIGJsb2NrcyB3aGljaCBkbyBub3QgcmVmZXIgdG8gdGhlIGNvcnJlY3QKKyAqIHJlZmVyZW5jZSBmcmFtZSB0eXBlLgorICovCitzdGF0aWMgdm9pZCBlc3RpbWF0ZV9tdihjb25zdCBPVkVSTEFQX05PREUgKm92ZXJsYXBzLCB1bmlvbiBiX21vZGVfaW5mbyAqYm1pKQoreworICAgIGludCBpOworICAgIGludCBvdmVybGFwX3N1bSA9IDA7CisgICAgaW50IHJvd19hY2MgPSAwOworICAgIGludCBjb2xfYWNjID0gMDsKKworICAgIGJtaS0+bXYuYXNfaW50ID0gMDsKKyAgICBmb3IgKGk9MDsgaSA8IE1BWF9PVkVSTEFQUzsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKG92ZXJsYXBzW2ldLmJtaSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNvbF9hY2MgKz0gb3ZlcmxhcHNbaV0ub3ZlcmxhcCAqIG92ZXJsYXBzW2ldLmJtaS0+bXYuYXNfbXYuY29sOworICAgICAgICByb3dfYWNjICs9IG92ZXJsYXBzW2ldLm92ZXJsYXAgKiBvdmVybGFwc1tpXS5ibWktPm12LmFzX212LnJvdzsKKyAgICAgICAgb3ZlcmxhcF9zdW0gKz0gb3ZlcmxhcHNbaV0ub3ZlcmxhcDsKKyAgICB9CisgICAgaWYgKG92ZXJsYXBfc3VtID4gMCkKKyAgICB7CisgICAgICAgIC8qIFE5IC8gUTYgPSBRMyAqLworICAgICAgICBibWktPm12LmFzX212LmNvbCA9IGNvbF9hY2MgLyBvdmVybGFwX3N1bTsKKyAgICAgICAgYm1pLT5tdi5hc19tdi5yb3cgPSByb3dfYWNjIC8gb3ZlcmxhcF9zdW07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJtaS0+bXYuYXNfbXYuY29sID0gMDsKKyAgICAgICAgYm1pLT5tdi5hc19tdi5yb3cgPSAwOworICAgIH0KK30KKworLyogRXN0aW1hdGVzIGFsbCBtb3Rpb24gdmVjdG9ycyBmb3IgYSBtYWNyb2Jsb2NrIGdpdmVuIHRoZSBsaXN0cyBvZgorICogb3ZlcmxhcHMgZm9yIGVhY2ggYmxvY2suIERlY2lkZXMgd2hldGhlciBvciBub3QgdGhlIE1WcyBtdXN0IGJlIGNsYW1wZWQuCisgKi8KK3N0YXRpYyB2b2lkIGVzdGltYXRlX21iX212cyhjb25zdCBCX09WRVJMQVAgKmJsb2NrX292ZXJsYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PREVfSU5GTyAqbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3RvX2xlZnRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdG9fcmlnaHRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdG9fdG9wX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3RvX2JvdHRvbV9lZGdlKQoreworICAgIGludCByb3csIGNvbDsKKyAgICBpbnQgbm9uX3plcm9fY291bnQgPSAwOworICAgIE1WICogY29uc3QgZmlsdGVyZWRfbXYgPSAmKG1pLT5tYm1pLm12LmFzX212KTsKKyAgICB1bmlvbiBiX21vZGVfaW5mbyAqIGNvbnN0IGJtaSA9IG1pLT5ibWk7CisgICAgZmlsdGVyZWRfbXYtPmNvbCA9IDA7CisgICAgZmlsdGVyZWRfbXYtPnJvdyA9IDA7CisgICAgbWktPm1ibWkubmVlZF90b19jbGFtcF9tdnMgPSAwOworICAgIGZvciAocm93ID0gMDsgcm93IDwgNDsgKytyb3cpCisgICAgeworICAgICAgICBpbnQgdGhpc19iX3RvX3RvcF9lZGdlID0gbWJfdG9fdG9wX2VkZ2UgKyAoKHJvdyo0KTw8Myk7CisgICAgICAgIGludCB0aGlzX2JfdG9fYm90dG9tX2VkZ2UgPSBtYl90b19ib3R0b21fZWRnZSAtICgocm93KjQpPDwzKTsKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCA0OyArK2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSByb3cgKiA0ICsgY29sOworICAgICAgICAgICAgaW50IHRoaXNfYl90b19sZWZ0X2VkZ2UgPSBtYl90b19sZWZ0X2VkZ2UgKyAoKGNvbCo0KTw8Myk7CisgICAgICAgICAgICBpbnQgdGhpc19iX3RvX3JpZ2h0X2VkZ2UgPSBtYl90b19yaWdodF9lZGdlIC0gKChjb2wqNCk8PDMpOworICAgICAgICAgICAgLyogRXN0aW1hdGUgdmVjdG9ycyBmb3IgYWxsIGJsb2NrcyB3aGljaCBhcmUgb3ZlcmxhcHBlZCBieSB0aGlzICovCisgICAgICAgICAgICAvKiB0eXBlLiBJbnRlcnBvbGF0ZS9leHRyYXBvbGF0ZSB0aGUgcmVzdCBvZiB0aGUgYmxvY2sncyBNVnMgKi8KKyAgICAgICAgICAgIGVzdGltYXRlX212KGJsb2NrX292ZXJsYXBzW2ldLm92ZXJsYXBzLCAmKGJtaVtpXSkpOworICAgICAgICAgICAgbWktPm1ibWkubmVlZF90b19jbGFtcF9tdnMgfD0gdnA4X2NoZWNrX212X2JvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibWlbaV0ubXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2JfdG9fbGVmdF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19iX3RvX3JpZ2h0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2JfdG9fdG9wX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2JfdG9fYm90dG9tX2VkZ2UpOworICAgICAgICAgICAgaWYgKGJtaVtpXS5tdi5hc19pbnQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK25vbl96ZXJvX2NvdW50OworICAgICAgICAgICAgICAgIGZpbHRlcmVkX212LT5jb2wgKz0gYm1pW2ldLm12LmFzX212LmNvbDsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZF9tdi0+cm93ICs9IGJtaVtpXS5tdi5hc19tdi5yb3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5vbl96ZXJvX2NvdW50ID4gMCkKKyAgICB7CisgICAgICAgIGZpbHRlcmVkX212LT5jb2wgLz0gbm9uX3plcm9fY291bnQ7CisgICAgICAgIGZpbHRlcmVkX212LT5yb3cgLz0gbm9uX3plcm9fY291bnQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjYWxjX3ByZXZfbWJfb3ZlcmxhcHMoTUJfT1ZFUkxBUCAqb3ZlcmxhcHMsIE1PREVfSU5GTyAqcHJldl9taSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3csIGludCBtYl9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93cywgaW50IG1iX2NvbHMpCit7CisgICAgaW50IHN1Yl9yb3c7CisgICAgaW50IHN1Yl9jb2w7CisgICAgZm9yIChzdWJfcm93ID0gMDsgc3ViX3JvdyA8IDQ7ICsrc3ViX3JvdykKKyAgICB7CisgICAgICAgIGZvciAoc3ViX2NvbCA9IDA7IHN1Yl9jb2wgPCA0OyArK3N1Yl9jb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9jYWxjdWxhdGVfb3ZlcmxhcHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXBzLCBtYl9yb3dzLCBtYl9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHByZXZfbWktPmJtaVtzdWJfcm93ICogNCArIHN1Yl9jb2xdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAqIG1iX3JvdyArIHN1Yl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBtYl9jb2wgKyBzdWJfY29sKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogRXN0aW1hdGUgYWxsIG1pc3NpbmcgbW90aW9uIHZlY3RvcnMuIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSBhcyB0aGUgb25lCisgKiBhYm92ZSwgYnV0IGhhcyBkaWZmZXJlbnQgaW5wdXQgYXJndW1lbnRzLiAqLworc3RhdGljIHZvaWQgZXN0aW1hdGVfbWlzc2luZ19tdnMoTUJfT1ZFUkxBUCAqb3ZlcmxhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lORk8gKm1pLCBNT0RFX0lORk8gKnByZXZfbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93cywgaW50IG1iX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmlyc3RfY29ycnVwdCkKK3sKKyAgICBpbnQgbWJfcm93LCBtYl9jb2w7CisgICAgdnB4X21lbXNldChvdmVybGFwcywgMCwgc2l6ZW9mKE1CX09WRVJMQVApICogbWJfcm93cyAqIG1iX2NvbHMpOworICAgIC8qIEZpcnN0IGNhbGN1bGF0ZSB0aGUgb3ZlcmxhcHMgZm9yIGFsbCBibG9ja3MgKi8KKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IG1iX3Jvd3M7ICsrbWJfcm93KQorICAgIHsKKyAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBtYl9jb2xzOyArK21iX2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UncmUgb25seSBhYmxlIHRvIHVzZSBibG9ja3MgcmVmZXJyaW5nIHRvIHRoZSBsYXN0IGZyYW1lCisgICAgICAgICAgICAgKiB3aGVuIGV4dHJhcG9sYXRpbmcgbmV3IHZlY3RvcnMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwcmV2X21pLT5tYm1pLnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGNfcHJldl9tYl9vdmVybGFwcyhvdmVybGFwcywgcHJldl9taSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfcm93LCBtYl9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3Jvd3MsIG1iX2NvbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytwcmV2X21pOworICAgICAgICB9CisgICAgICAgICsrcHJldl9taTsKKyAgICB9CisKKyAgICBtYl9yb3cgPSBmaXJzdF9jb3JydXB0IC8gbWJfY29sczsKKyAgICBtYl9jb2wgPSBmaXJzdF9jb3JydXB0IC0gbWJfcm93ICogbWJfY29sczsKKyAgICBtaSArPSBtYl9yb3cqKG1iX2NvbHMgKyAxKSArIG1iX2NvbDsKKyAgICAvKiBHbyB0aHJvdWdoIGFsbCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudCBpbWFnZSB3aXRoIG1pc3NpbmcgTVZzCisgICAgICogYW5kIGNhbGN1bGF0ZSBuZXcgTVZzIHVzaW5nIHRoZSBvdmVybGFwcy4KKyAgICAgKi8KKyAgICBmb3IgKDsgbWJfcm93IDwgbWJfcm93czsgKyttYl9yb3cpCisgICAgeworICAgICAgICBpbnQgbWJfdG9fdG9wX2VkZ2UgPSAtKChtYl9yb3cgKiAxNikpIDw8IDM7CisgICAgICAgIGludCBtYl90b19ib3R0b21fZWRnZSA9ICgobWJfcm93cyAtIDEgLSBtYl9yb3cpICogMTYpIDw8IDM7CisgICAgICAgIGZvciAoOyBtYl9jb2wgPCBtYl9jb2xzOyArK21iX2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1iX3RvX2xlZnRfZWRnZSA9IC0oKG1iX2NvbCAqIDE2KSA8PCAzKTsKKyAgICAgICAgICAgIGludCBtYl90b19yaWdodF9lZGdlID0gKChtYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKKyAgICAgICAgICAgIGNvbnN0IEJfT1ZFUkxBUCAqYmxvY2tfb3ZlcmxhcHMgPQorICAgICAgICAgICAgICAgICAgICBvdmVybGFwc1ttYl9yb3cqbWJfY29scyArIG1iX2NvbF0ub3ZlcmxhcHM7CisgICAgICAgICAgICBtaS0+bWJtaS5yZWZfZnJhbWUgPSBMQVNUX0ZSQU1FOworICAgICAgICAgICAgbWktPm1ibWkubW9kZSA9IFNQTElUTVY7CisgICAgICAgICAgICBtaS0+bWJtaS51dl9tb2RlID0gRENfUFJFRDsKKyAgICAgICAgICAgIG1pLT5tYm1pLnBhcnRpdGlvbmluZyA9IDM7CisgICAgICAgICAgICBtaS0+bWJtaS5zZWdtZW50X2lkID0gMDsKKyAgICAgICAgICAgIGVzdGltYXRlX21iX212cyhibG9ja19vdmVybGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b19sZWZ0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfdG9fcmlnaHRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b190b3BfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b19ib3R0b21fZWRnZSk7CisgICAgICAgICAgICArK21pOworICAgICAgICB9CisgICAgICAgIG1iX2NvbCA9IDA7CisgICAgICAgICsrbWk7CisgICAgfQorfQorCit2b2lkIHZwOF9lc3RpbWF0ZV9taXNzaW5nX212cyhWUDhEX0NPTVAgKnBiaSkKK3sKKyAgICBWUDhfQ09NTU9OICogY29uc3QgcGMgPSAmcGJpLT5jb21tb247CisgICAgZXN0aW1hdGVfbWlzc2luZ19tdnMocGJpLT5vdmVybGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYy0+bWksIHBjLT5wcmV2X21pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5tYl9yb3dzLCBwYy0+bWJfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm12c19jb3JydXB0X2Zyb21fbWIpOworfQorCitzdGF0aWMgdm9pZCBhc3NpZ25fbmVpZ2hib3IoRUNfQkxPQ0sgKm5laWdoYm9yLCBNT0RFX0lORk8gKm1pLCBpbnQgYmxvY2tfaWR4KQoreworICAgIGFzc2VydChtaS0+bWJtaS5yZWZfZnJhbWUgPCBNQVhfUkVGX0ZSQU1FUyk7CisgICAgbmVpZ2hib3ItPnJlZl9mcmFtZSA9IG1pLT5tYm1pLnJlZl9mcmFtZTsKKyAgICBuZWlnaGJvci0+bXYgPSBtaS0+Ym1pW2Jsb2NrX2lkeF0ubXYuYXNfbXY7Cit9CisKKy8qIEZpbmRzIHRoZSBuZWlnaGJvcmluZyBibG9ja3Mgb2YgYSBtYWNyb2Jsb2Nrcy4gSW4gdGhlIGdlbmVyYWwgY2FzZQorICogMjAgYmxvY2tzIGFyZSBmb3VuZC4gSWYgYSBmZXdlciBudW1iZXIgb2YgYmxvY2tzIGFyZSBmb3VuZCBkdWUgdG8KKyAqIGltYWdlIGJvdW5kYXJpZXMsIHRob3NlIHBvc2l0aW9ucyBpbiB0aGUgRUNfQkxPQ0sgYXJyYXkgYXJlIGxlZnQgImVtcHR5Ii4KKyAqIFRoZSBuZWlnaGJvcnMgYXJlIGVudW1lcmF0ZWQgd2l0aCB0aGUgdXBwZXItbGVmdCBuZWlnaGJvciBhcyB0aGUgZmlyc3QKKyAqIGVsZW1lbnQsIHRoZSBzZWNvbmQgZWxlbWVudCByZWZlcnMgdG8gdGhlIG5laWdoYm9yIHRvIHJpZ2h0IG9mIHRoZSBwcmV2aW91cworICogbmVpZ2hib3IsIGFuZCBzbyBvbi4gVGhlIGxhc3QgZWxlbWVudCByZWZlcnMgdG8gdGhlIG5laWdoYm9yIGJlbG93IHRoZSBmaXJzdAorICogbmVpZ2hib3IuCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfbmVpZ2hib3JpbmdfYmxvY2tzKE1PREVfSU5GTyAqbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19CTE9DSyAqbmVpZ2hib3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3JvdywgaW50IG1iX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3dzLCBpbnQgbWJfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaV9zdHJpZGUpCit7CisgICAgaW50IGkgPSAwOworICAgIGludCBqOworICAgIGlmIChtYl9yb3cgPiAwKQorICAgIHsKKyAgICAgICAgLyogdXBwZXIgbGVmdCAqLworICAgICAgICBpZiAobWJfY29sID4gMCkKKyAgICAgICAgICAgIGFzc2lnbl9uZWlnaGJvcigmbmVpZ2hib3JzW2ldLCBtaSAtIG1pX3N0cmlkZSAtIDEsIDE1KTsKKyAgICAgICAgKytpOworICAgICAgICAvKiBhYm92ZSAqLworICAgICAgICBmb3IgKGogPSAxMjsgaiA8IDE2OyArK2osICsraSkKKyAgICAgICAgICAgIGFzc2lnbl9uZWlnaGJvcigmbmVpZ2hib3JzW2ldLCBtaSAtIG1pX3N0cmlkZSwgaik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaSArPSA1OworICAgIGlmIChtYl9jb2wgPCBtYl9jb2xzIC0gMSkKKyAgICB7CisgICAgICAgIC8qIHVwcGVyIHJpZ2h0ICovCisgICAgICAgIGlmIChtYl9yb3cgPiAwKQorICAgICAgICAgICAgYXNzaWduX25laWdoYm9yKCZuZWlnaGJvcnNbaV0sIG1pIC0gbWlfc3RyaWRlICsgMSwgMTIpOworICAgICAgICArK2k7CisgICAgICAgIC8qIHJpZ2h0ICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gMTI7IGogKz0gNCwgKytpKQorICAgICAgICAgICAgYXNzaWduX25laWdoYm9yKCZuZWlnaGJvcnNbaV0sIG1pICsgMSwgaik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaSArPSA1OworICAgIGlmIChtYl9yb3cgPCBtYl9yb3dzIC0gMSkKKyAgICB7CisgICAgICAgIC8qIGxvd2VyIHJpZ2h0ICovCisgICAgICAgIGlmIChtYl9jb2wgPCBtYl9jb2xzIC0gMSkKKyAgICAgICAgICAgIGFzc2lnbl9uZWlnaGJvcigmbmVpZ2hib3JzW2ldLCBtaSArIG1pX3N0cmlkZSArIDEsIDApOworICAgICAgICArK2k7CisgICAgICAgIC8qIGJlbG93ICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2osICsraSkKKyAgICAgICAgICAgIGFzc2lnbl9uZWlnaGJvcigmbmVpZ2hib3JzW2ldLCBtaSArIG1pX3N0cmlkZSwgaik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaSArPSA1OworICAgIGlmIChtYl9jb2wgPiAwKQorICAgIHsKKyAgICAgICAgLyogbG93ZXIgbGVmdCAqLworICAgICAgICBpZiAobWJfcm93IDwgbWJfcm93cyAtIDEpCisgICAgICAgICAgICBhc3NpZ25fbmVpZ2hib3IoJm5laWdoYm9yc1tpXSwgbWkgKyBtaV9zdHJpZGUgLSAxLCA0KTsKKyAgICAgICAgKytpOworICAgICAgICAvKiBsZWZ0ICovCisgICAgICAgIGZvciAoaiA9IDM7IGogPCAxNjsgaiArPSA0LCArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2lnbl9uZWlnaGJvcigmbmVpZ2hib3JzW2ldLCBtaSAtIDEsIGopOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaSArPSA1OworICAgIGFzc2VydChpID09IDIwKTsKK30KKworLyogSW50ZXJwb2xhdGVzIGFsbCBtb3Rpb24gdmVjdG9ycyBmb3IgYSBtYWNyb2Jsb2NrIGZyb20gdGhlIG5laWdoYm9yaW5nIGJsb2NrcycKKyAqIG1vdGlvbiB2ZWN0b3JzLgorICovCitzdGF0aWMgdm9pZCBpbnRlcnBvbGF0ZV9tdnMoTUFDUk9CTE9DS0QgKm1iLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVDX0JMT0NLICpuZWlnaGJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTVZfUkVGRVJFTkNFX0ZSQU1FIGRvbV9yZWZfZnJhbWUpCit7CisgICAgaW50IHJvdywgY29sLCBpOworICAgIE1PREVfSU5GTyAqIGNvbnN0IG1pID0gbWItPm1vZGVfaW5mb19jb250ZXh0OworICAgIC8qIFRhYmxlIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBuZWlnaGJvcmluZyBibG9ja3MgcmVsYXRpdmUgdGhlIHBvc2l0aW9uCisgICAgICogb2YgdGhlIHVwcGVyIGxlZnQgYmxvY2sgb2YgdGhlIGN1cnJlbnQgTUIuIFN0YXJ0aW5nIHdpdGggdGhlIHVwcGVyIGxlZnQKKyAgICAgKiBuZWlnaGJvciBhbmQgZ29pbmcgdG8gdGhlIHJpZ2h0LgorICAgICAqLworICAgIGNvbnN0IEVDX1BPUyBuZWlnaF9wb3NbTlVNX05FSUdIQk9SU10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xLC0xfSwgey0xLDB9LCB7LTEsMX0sIHstMSwyfSwgey0xLDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMSw0fSwgezAsNH0sIHsxLDR9LCB7Miw0fSwgezMsNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQsNH0sIHs0LDN9LCB7NCwyfSwgezQsMX0sIHs0LDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LC0xfSwgezMsLTF9LCB7MiwtMX0sIHsxLC0xfSwgezAsLTF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgbWktPm1ibWkubmVlZF90b19jbGFtcF9tdnMgPSAwOworICAgIGZvciAocm93ID0gMDsgcm93IDwgNDsgKytyb3cpCisgICAgeworICAgICAgICBpbnQgbWJfdG9fdG9wX2VkZ2UgPSBtYi0+bWJfdG9fdG9wX2VkZ2UgKyAoKHJvdyo0KTw8Myk7CisgICAgICAgIGludCBtYl90b19ib3R0b21fZWRnZSA9IG1iLT5tYl90b19ib3R0b21fZWRnZSAtICgocm93KjQpPDwzKTsKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCA0OyArK2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1iX3RvX2xlZnRfZWRnZSA9IG1iLT5tYl90b19sZWZ0X2VkZ2UgKyAoKGNvbCo0KTw8Myk7CisgICAgICAgICAgICBpbnQgbWJfdG9fcmlnaHRfZWRnZSA9IG1iLT5tYl90b19yaWdodF9lZGdlIC0gKChjb2wqNCk8PDMpOworICAgICAgICAgICAgaW50IHdfc3VtID0gMDsKKyAgICAgICAgICAgIGludCBtdl9yb3dfc3VtID0gMDsKKyAgICAgICAgICAgIGludCBtdl9jb2xfc3VtID0gMDsKKyAgICAgICAgICAgIGludF9tdiAqIGNvbnN0IG12ID0gJihtaS0+Ym1pW3Jvdyo0ICsgY29sXS5tdik7CisgICAgICAgICAgICBtdi0+YXNfaW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTkVJR0hCT1JTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBzdW0gb2YgbmVpZ2hib3JpbmcgTVZzIHJlZmVycmluZworICAgICAgICAgICAgICAgICAqIHRvIHRoZSBkb21pbmFudCBmcmFtZSB0eXBlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNvbnN0IGludCB3ID0gd2VpZ2h0c19xN1thYnMocm93IC0gbmVpZ2hfcG9zW2ldLnJvdyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ficyhjb2wgLSBuZWlnaF9wb3NbaV0uY29sKV07CisgICAgICAgICAgICAgICAgaWYgKG5laWdoYm9yc1tpXS5yZWZfZnJhbWUgIT0gZG9tX3JlZl9mcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgd19zdW0gKz0gdzsKKyAgICAgICAgICAgICAgICAvKiBRNyAqIFEzID0gUTEwICovCisgICAgICAgICAgICAgICAgbXZfcm93X3N1bSArPSB3Km5laWdoYm9yc1tpXS5tdi5yb3c7CisgICAgICAgICAgICAgICAgbXZfY29sX3N1bSArPSB3Km5laWdoYm9yc1tpXS5tdi5jb2w7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod19zdW0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uCisgICAgICAgICAgICAgICAgICogTm9ybWFsaXplIHdpdGggdGhlIHN1bSBvZiB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICogUTMgPSBRMTAgLyBRNworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG12LT5hc19tdi5yb3cgPSBtdl9yb3dfc3VtIC8gd19zdW07CisgICAgICAgICAgICAgICAgbXYtPmFzX212LmNvbCA9IG12X2NvbF9zdW0gLyB3X3N1bTsKKyAgICAgICAgICAgICAgICBtaS0+bWJtaS5uZWVkX3RvX2NsYW1wX212cyB8PSB2cDhfY2hlY2tfbXZfYm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b19sZWZ0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b19yaWdodF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfdG9fdG9wX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90b19ib3R0b21fZWRnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdnA4X2ludGVycG9sYXRlX21vdGlvbihNQUNST0JMT0NLRCAqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LCBpbnQgbWJfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3Jvd3MsIGludCBtYl9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pX3N0cmlkZSkKK3sKKyAgICAvKiBGaW5kIHJlbGV2YW50IG5laWdoYm9yaW5nIGJsb2NrcyAqLworICAgIEVDX0JMT0NLIG5laWdoYm9yc1tOVU1fTkVJR0hCT1JTXTsKKyAgICBpbnQgaTsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBhcnJheS4gTUFYX1JFRl9GUkFNRVMgaXMgaW50ZXJwcmV0ZWQgYXMgImRvZXNuJ3QgZXhpc3QiICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ORUlHSEJPUlM7ICsraSkKKyAgICB7CisgICAgICAgIG5laWdoYm9yc1tpXS5yZWZfZnJhbWUgPSBNQVhfUkVGX0ZSQU1FUzsKKyAgICAgICAgbmVpZ2hib3JzW2ldLm12LnJvdyA9IG5laWdoYm9yc1tpXS5tdi5jb2wgPSAwOworICAgIH0KKyAgICBmaW5kX25laWdoYm9yaW5nX2Jsb2NrcyhtYi0+bW9kZV9pbmZvX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfcm93LCBtYl9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3Jvd3MsIG1iX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tb2RlX2luZm9fc3RyaWRlKTsKKyAgICAvKiBJbnRlcnBvbGF0ZSBNVnMgZm9yIHRoZSBtaXNzaW5nIGJsb2NrcyBmcm9tIHRoZSBzdXJyb3VuZGluZworICAgICAqIGJsb2NrcyB3aGljaCByZWZlciB0byB0aGUgbGFzdCBmcmFtZS4gKi8KKyAgICBpbnRlcnBvbGF0ZV9tdnMobWIsIG5laWdoYm9ycywgTEFTVF9GUkFNRSk7CisKKyAgICBtYi0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gTEFTVF9GUkFNRTsKKyAgICBtYi0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IFNQTElUTVY7CisgICAgbWItPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSBEQ19QUkVEOworICAgIG1iLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5wYXJ0aXRpb25pbmcgPSAzOworICAgIG1iLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkID0gMDsKK30KKwordm9pZCB2cDhfY29uY2VhbF9jb3JydXB0X21iKE1BQ1JPQkxPQ0tEICp4ZCkKK3sKKyAgICAvKiBUaGlzIG1hY3JvYmxvY2sgaGFzIGNvcnJ1cHQgcmVzaWR1YWwsIHVzZSB0aGUgbW90aW9uIGNvbXBlbnNhdGVkCisgICAgICAgaW1hZ2UgKHByZWRpY3RvcikgZm9yIGNvbmNlYWxtZW50ICovCisKKyAgICAvKiBUaGUgYnVpbGQgcHJlZGljdG9yIGZ1bmN0aW9ucyBub3cgb3V0cHV0IGRpcmVjdGx5IGludG8gdGhlIGRzdCBidWZmZXIsCisgICAgICogc28gdGhlIGNvcGllcyBhcmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeSAqLworCit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2RlY29kZXIvZXJyb3JfY29uY2VhbG1lbnQuaCBiL2xpYnZweC92cDgvZGVjb2Rlci9lcnJvcl9jb25jZWFsbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWU5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2RlY29kZXIvZXJyb3JfY29uY2VhbG1lbnQuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBFUlJPUl9DT05DRUFMTUVOVF9ICisjZGVmaW5lIEVSUk9SX0NPTkNFQUxNRU5UX0gKKworI2luY2x1ZGUgIm9ueXhkX2ludC5oIgorI2luY2x1ZGUgImVjX3R5cGVzLmgiCisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG92ZXJsYXAgbGlzdHMgKi8KK2ludCB2cDhfYWxsb2Nfb3ZlcmxhcF9saXN0cyhWUDhEX0NPTVAgKnBiaSk7CisKKy8qIERlYWxsb2NhdGUgdGhlIG92ZXJsYXAgbGlzdHMgKi8KK3ZvaWQgdnA4X2RlX2FsbG9jX292ZXJsYXBfbGlzdHMoVlA4RF9DT01QICpwYmkpOworCisvKiBFc3RpbWF0ZSBhbGwgbWlzc2luZyBtb3Rpb24gdmVjdG9ycy4gKi8KK3ZvaWQgdnA4X2VzdGltYXRlX21pc3NpbmdfbXZzKFZQOERfQ09NUCAqcGJpKTsKKworLyogRnVuY3Rpb25zIGZvciBzcGF0aWFsIE1WIGludGVycG9sYXRpb24gKi8KKworLyogSW50ZXJwb2xhdGVzIGFsbCBtb3Rpb24gdmVjdG9ycyBmb3IgYSBtYWNyb2Jsb2NrIG1iIGF0IHBvc2l0aW9uCisgKiAobWJfcm93LCBtYl9jb2wpLiAqLwordm9pZCB2cDhfaW50ZXJwb2xhdGVfbW90aW9uKE1BQ1JPQkxPQ0tEICptYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LCBpbnQgbWJfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3dzLCBpbnQgbWJfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWlfc3RyaWRlKTsKKworLyogQ29uY2VhbCBhIG1hY3JvYmxvY2sgd2l0aCBjb3JydXB0IHJlc2lkdWFsLgorICogQ29waWVzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCB0byB0aGUgcmVjb25zdHJ1Y3RlZCBpbWFnZS4KKyAqLwordm9pZCB2cDhfY29uY2VhbF9jb3JydXB0X21iKE1BQ1JPQkxPQ0tEICp4ZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9kZWNvZGVyL29ueXhkX2lmLmMgYi9saWJ2cHgvdnA4L2RlY29kZXIvb255eGRfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY4NzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL29ueXhkX2lmLmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKKyNpZiBDT05GSUdfUE9TVFBST0MKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3Bvc3Rwcm9jLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhkLmgiCisjaW5jbHVkZSAib255eGRfaW50LmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vbG9vcGZpbHRlci5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3RocmVhZGluZy5oIgorI2luY2x1ZGUgImRlY29kZXJ0aHJlYWRpbmcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidnA4L2NvbW1vbi9xdWFudF9jb21tb24uaCIKKyNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgorI2luY2x1ZGUgInZweF9wb3J0cy92cHhfdGltZXIuaCIKKyNpbmNsdWRlICJkZXRva2VuaXplLmgiCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisjaW5jbHVkZSAiZXJyb3JfY29uY2VhbG1lbnQuaCIKKyNlbmRpZgorI2lmIEFSQ0hfQVJNCisjaW5jbHVkZSAidnB4X3BvcnRzL2FybS5oIgorI2VuZGlmCisKK2V4dGVybiB2b2lkIHZwOF9pbml0X2xvb3BfZmlsdGVyKFZQOF9DT01NT04gKmNtKTsKK2V4dGVybiB2b2lkIHZwOGN4X2luaXRfZGVfcXVhbnRpemVyKFZQOERfQ09NUCAqcGJpKTsKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmIgKFZQOF9DT01NT04gKmNtKTsKK3N0YXRpYyB2b2lkIHJlZl9jbnRfZmIgKGludCAqYnVmLCBpbnQgKmlkeCwgaW50IG5ld19pZHgpOworCitzdHJ1Y3QgVlA4RF9DT01QICogdnA4ZHhfY3JlYXRlX2RlY29tcHJlc3NvcihWUDhEX0NPTkZJRyAqb3hjZikKK3sKKyAgICBWUDhEX0NPTVAgKnBiaSA9IHZweF9tZW1hbGlnbigzMiwgc2l6ZW9mKFZQOERfQ09NUCkpOworCisgICAgaWYgKCFwYmkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdnB4X21lbXNldChwYmksIDAsIHNpemVvZihWUDhEX0NPTVApKTsKKworICAgIGlmIChzZXRqbXAocGJpLT5jb21tb24uZXJyb3Iuam1wKSkKKyAgICB7CisgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7CisgICAgICAgIHZwOGR4X3JlbW92ZV9kZWNvbXByZXNzb3IocGJpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcGJpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMTsKKworICAgIHZwOF9jcmVhdGVfY29tbW9uKCZwYmktPmNvbW1vbik7CisKKyAgICBwYmktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lID0gMDsKKyAgICBwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSA9IDE7CisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICBwYmktPm1heF90aHJlYWRzID0gb3hjZi0+bWF4X3RocmVhZHM7CisgICAgdnA4X2RlY29kZXJfY3JlYXRlX3RocmVhZHMocGJpKTsKKyNlbmRpZgorCisgICAgLyogdnA4Y3hfaW5pdF9kZV9xdWFudGl6ZXIoKSBpcyBmaXJzdCBjYWxsZWQgaGVyZS4gQWRkIGNoZWNrIGluIGZyYW1lX2luaXRfZGVxdWFudGl6ZXIoKSB0byBhdm9pZAorICAgICAqICB1bm5lY2Vzc2FyeSBjYWxsaW5nIG9mIHZwOGN4X2luaXRfZGVfcXVhbnRpemVyKCkgZm9yIGV2ZXJ5IGZyYW1lLgorICAgICAqLworICAgIHZwOGN4X2luaXRfZGVfcXVhbnRpemVyKHBiaSk7CisKKyAgICB2cDhfbG9vcF9maWx0ZXJfaW5pdCgmcGJpLT5jb21tb24pOworCisgICAgcGJpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMDsKKworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIHBiaS0+ZWNfZW5hYmxlZCA9IG94Y2YtPmVycm9yX2NvbmNlYWxtZW50OworICAgIHBiaS0+b3ZlcmxhcHMgPSBOVUxMOworI2Vsc2UKKyAgICBwYmktPmVjX2VuYWJsZWQgPSAwOworI2VuZGlmCisgICAgLyogRXJyb3IgY29uY2VhbG1lbnQgaXMgYWN0aXZhdGVkIGFmdGVyIGEga2V5IGZyYW1lIGhhcyBiZWVuCisgICAgICogZGVjb2RlZCB3aXRob3V0IGVycm9ycyB3aGVuIGVycm9yIGNvbmNlYWxtZW50IGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcGJpLT5lY19hY3RpdmUgPSAwOworCisgICAgcGJpLT5kZWNvZGVkX2tleV9mcmFtZSA9IDA7CisKKyAgICBwYmktPmlucHV0X2ZyYWdtZW50cyA9IG94Y2YtPmlucHV0X2ZyYWdtZW50czsKKyAgICBwYmktPm51bV9mcmFnbWVudHMgPSAwOworCisgICAgLyogSW5kZXBlbmRlbnQgcGFydGl0aW9ucyBpcyBhY3RpdmF0ZWQgd2hlbiBhIGZyYW1lIHVwZGF0ZXMgdGhlCisgICAgICogdG9rZW4gcHJvYmFiaWxpdHkgdGFibGUgdG8gaGF2ZSBlcXVhbCBwcm9iYWJpbGl0aWVzIG92ZXIgdGhlCisgICAgICogUFJFVl9DT0VGIGNvbnRleHQuCisgICAgICovCisgICAgcGJpLT5pbmRlcGVuZGVudF9wYXJ0aXRpb25zID0gMDsKKworICAgIHZwOF9zZXR1cF9ibG9ja19kcHRycygmcGJpLT5tYik7CisKKyAgICByZXR1cm4gcGJpOworfQorCisKK3ZvaWQgdnA4ZHhfcmVtb3ZlX2RlY29tcHJlc3NvcihWUDhEX0NPTVAgKnBiaSkKK3sKKyAgICBpZiAoIXBiaSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkKQorICAgICAgICB2cDhtdF9kZV9hbGxvY190ZW1wX2J1ZmZlcnMocGJpLCBwYmktPmNvbW1vbi5tYl9yb3dzKTsKKyAgICB2cDhfZGVjb2Rlcl9yZW1vdmVfdGhyZWFkcyhwYmkpOworI2VuZGlmCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisgICAgdnA4X2RlX2FsbG9jX292ZXJsYXBfbGlzdHMocGJpKTsKKyNlbmRpZgorICAgIHZwOF9yZW1vdmVfY29tbW9uKCZwYmktPmNvbW1vbik7CisgICAgdnB4X2ZyZWUocGJpKTsKK30KKworCit2cHhfY29kZWNfZXJyX3QgdnA4ZHhfZ2V0X3JlZmVyZW5jZShWUDhEX0NPTVAgKnBiaSwgZW51bSB2cHhfcmVmX2ZyYW1lX3R5cGUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmcGJpLT5jb21tb247CisgICAgaW50IHJlZl9mYl9pZHg7CisKKyAgICBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0xBU1RfRlJBTUUpCisgICAgICAgIHJlZl9mYl9pZHggPSBjbS0+bHN0X2ZiX2lkeDsKKyAgICBlbHNlIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfR09MRF9GUkFNRSkKKyAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5nbGRfZmJfaWR4OworICAgIGVsc2UgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9BTFRSX0ZSQU1FKQorICAgICAgICByZWZfZmJfaWR4ID0gY20tPmFsdF9mYl9pZHg7CisgICAgZWxzZXsKKyAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYmktPmNvbW1vbi5lcnJvciwgVlBYX0NPREVDX0VSUk9SLAorICAgICAgICAgICAgIkludmFsaWQgcmVmZXJlbmNlIGZyYW1lIik7CisgICAgICAgIHJldHVybiBwYmktPmNvbW1vbi5lcnJvci5lcnJvcl9jb2RlOworICAgIH0KKworICAgIGlmKGNtLT55djEyX2ZiW3JlZl9mYl9pZHhdLnlfaGVpZ2h0ICE9IHNkLT55X2hlaWdodCB8fAorICAgICAgICBjbS0+eXYxMl9mYltyZWZfZmJfaWR4XS55X3dpZHRoICE9IHNkLT55X3dpZHRoIHx8CisgICAgICAgIGNtLT55djEyX2ZiW3JlZl9mYl9pZHhdLnV2X2hlaWdodCAhPSBzZC0+dXZfaGVpZ2h0IHx8CisgICAgICAgIGNtLT55djEyX2ZiW3JlZl9mYl9pZHhdLnV2X3dpZHRoICE9IHNkLT51dl93aWR0aCl7CisgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGJpLT5jb21tb24uZXJyb3IsIFZQWF9DT0RFQ19FUlJPUiwKKyAgICAgICAgICAgICJJbmNvcnJlY3QgYnVmZmVyIGRpbWVuc2lvbnMiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKCZjbS0+eXYxMl9mYltyZWZfZmJfaWR4XSwgc2QpOworCisgICAgcmV0dXJuIHBiaS0+Y29tbW9uLmVycm9yLmVycm9yX2NvZGU7Cit9CisKKwordnB4X2NvZGVjX2Vycl90IHZwOGR4X3NldF9yZWZlcmVuY2UoVlA4RF9DT01QICpwYmksIGVudW0gdnB4X3JlZl9mcmFtZV90eXBlIHJlZl9mcmFtZV9mbGFnLCBZVjEyX0JVRkZFUl9DT05GSUcgKnNkKQoreworICAgIFZQOF9DT01NT04gKmNtID0gJnBiaS0+Y29tbW9uOworICAgIGludCAqcmVmX2ZiX3B0ciA9IE5VTEw7CisgICAgaW50IGZyZWVfZmI7CisKKyAgICBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0xBU1RfRlJBTUUpCisgICAgICAgIHJlZl9mYl9wdHIgPSAmY20tPmxzdF9mYl9pZHg7CisgICAgZWxzZSBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0dPTERfRlJBTUUpCisgICAgICAgIHJlZl9mYl9wdHIgPSAmY20tPmdsZF9mYl9pZHg7CisgICAgZWxzZSBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0FMVFJfRlJBTUUpCisgICAgICAgIHJlZl9mYl9wdHIgPSAmY20tPmFsdF9mYl9pZHg7CisgICAgZWxzZXsKKyAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYmktPmNvbW1vbi5lcnJvciwgVlBYX0NPREVDX0VSUk9SLAorICAgICAgICAgICAgIkludmFsaWQgcmVmZXJlbmNlIGZyYW1lIik7CisgICAgICAgIHJldHVybiBwYmktPmNvbW1vbi5lcnJvci5lcnJvcl9jb2RlOworICAgIH0KKworICAgIGlmKGNtLT55djEyX2ZiWypyZWZfZmJfcHRyXS55X2hlaWdodCAhPSBzZC0+eV9oZWlnaHQgfHwKKyAgICAgICAgY20tPnl2MTJfZmJbKnJlZl9mYl9wdHJdLnlfd2lkdGggIT0gc2QtPnlfd2lkdGggfHwKKyAgICAgICAgY20tPnl2MTJfZmJbKnJlZl9mYl9wdHJdLnV2X2hlaWdodCAhPSBzZC0+dXZfaGVpZ2h0IHx8CisgICAgICAgIGNtLT55djEyX2ZiWypyZWZfZmJfcHRyXS51dl93aWR0aCAhPSBzZC0+dXZfd2lkdGgpeworICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBiaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfRVJST1IsCisgICAgICAgICAgICAiSW5jb3JyZWN0IGJ1ZmZlciBkaW1lbnNpb25zIik7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qIEZpbmQgYW4gZW1wdHkgZnJhbWUgYnVmZmVyLiAqLworICAgICAgICBmcmVlX2ZiID0gZ2V0X2ZyZWVfZmIoY20pOworICAgICAgICAvKiBEZWNyZWFzZSBmYl9pZHhfcmVmX2NudCBzaW5jZSBpdCB3aWxsIGJlIGluY3JlYXNlZCBhZ2FpbiBpbgorICAgICAgICAgKiByZWZfY250X2ZiKCkgYmVsb3cuICovCisgICAgICAgIGNtLT5mYl9pZHhfcmVmX2NudFtmcmVlX2ZiXS0tOworCisgICAgICAgIC8qIE1hbmFnZSB0aGUgcmVmZXJlbmNlIGNvdW50ZXJzIGFuZCBjb3B5IGltYWdlLiAqLworICAgICAgICByZWZfY250X2ZiIChjbS0+ZmJfaWR4X3JlZl9jbnQsIHJlZl9mYl9wdHIsIGZyZWVfZmIpOworICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKHNkLCAmY20tPnl2MTJfZmJbKnJlZl9mYl9wdHJdKTsKKyAgICB9CisKKyAgIHJldHVybiBwYmktPmNvbW1vbi5lcnJvci5lcnJvcl9jb2RlOworfQorCisvKkZvciBBUk0gTkVPTiwgZDgtZDE1IGFyZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgbmVlZCB0byBiZSBzYXZlZCBieSB1cy4qLworI2lmIEhBVkVfTkVPTgorZXh0ZXJuIHZvaWQgdnA4X3B1c2hfbmVvbihpbnQ2NF90ICpzdG9yZSk7CitleHRlcm4gdm9pZCB2cDhfcG9wX25lb24oaW50NjRfdCAqc3RvcmUpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmIgKFZQOF9DT01NT04gKmNtKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fWVYxMl9CVUZGRVJTOyBpKyspCisgICAgICAgIGlmIChjbS0+ZmJfaWR4X3JlZl9jbnRbaV0gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgYXNzZXJ0KGkgPCBOVU1fWVYxMl9CVUZGRVJTKTsKKyAgICBjbS0+ZmJfaWR4X3JlZl9jbnRbaV0gPSAxOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCByZWZfY250X2ZiIChpbnQgKmJ1ZiwgaW50ICppZHgsIGludCBuZXdfaWR4KQoreworICAgIGlmIChidWZbKmlkeF0gPiAwKQorICAgICAgICBidWZbKmlkeF0tLTsKKworICAgICppZHggPSBuZXdfaWR4OworCisgICAgYnVmW25ld19pZHhdKys7Cit9CisKKy8qIElmIGFueSBidWZmZXIgY29weSAvIHN3YXBwaW5nIGlzIHNpZ25hbGxlZCBpdCBzaG91bGQgYmUgZG9uZSBoZXJlLiAqLworc3RhdGljIGludCBzd2FwX2ZyYW1lX2J1ZmZlcnMgKFZQOF9DT01NT04gKmNtKQoreworICAgIGludCBlcnIgPSAwOworCisgICAgLyogVGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUgb3IgZ29sZGVuIGZyYW1lIGNhbiBiZSB1cGRhdGVkCisgICAgICogIHVzaW5nIHRoZSBuZXcsIGxhc3QsIG9yIGdvbGRlbi9hbHQgcmVmIGZyYW1lLiAgSWYgaXQKKyAgICAgKiAgaXMgdXBkYXRlZCB1c2luZyB0aGUgbmV3bHkgZGVjb2RlZCBmcmFtZSBpdCBpcyBhIHJlZnJlc2guCisgICAgICogIEFuIHVwZGF0ZSB1c2luZyB0aGUgbGFzdCBvciBnb2xkZW4vYWx0IHJlZiBmcmFtZSBpcyBhIGNvcHkuCisgICAgICovCisgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYpCisgICAgeworICAgICAgICBpbnQgbmV3X2ZiID0gMDsKKworICAgICAgICBpZiAoY20tPmNvcHlfYnVmZmVyX3RvX2FyZiA9PSAxKQorICAgICAgICAgICAgbmV3X2ZiID0gY20tPmxzdF9mYl9pZHg7CisgICAgICAgIGVsc2UgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgPT0gMikKKyAgICAgICAgICAgIG5ld19mYiA9IGNtLT5nbGRfZmJfaWR4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnIgPSAtMTsKKworICAgICAgICByZWZfY250X2ZiIChjbS0+ZmJfaWR4X3JlZl9jbnQsICZjbS0+YWx0X2ZiX2lkeCwgbmV3X2ZiKTsKKyAgICB9CisKKyAgICBpZiAoY20tPmNvcHlfYnVmZmVyX3RvX2dmKQorICAgIHsKKyAgICAgICAgaW50IG5ld19mYiA9IDA7CisKKyAgICAgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZiA9PSAxKQorICAgICAgICAgICAgbmV3X2ZiID0gY20tPmxzdF9mYl9pZHg7CisgICAgICAgIGVsc2UgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZiA9PSAyKQorICAgICAgICAgICAgbmV3X2ZiID0gY20tPmFsdF9mYl9pZHg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IC0xOworCisgICAgICAgIHJlZl9jbnRfZmIgKGNtLT5mYl9pZHhfcmVmX2NudCwgJmNtLT5nbGRfZmJfaWR4LCBuZXdfZmIpOworICAgIH0KKworICAgIGlmIChjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgIHJlZl9jbnRfZmIgKGNtLT5mYl9pZHhfcmVmX2NudCwgJmNtLT5nbGRfZmJfaWR4LCBjbS0+bmV3X2ZiX2lkeCk7CisKKyAgICBpZiAoY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgcmVmX2NudF9mYiAoY20tPmZiX2lkeF9yZWZfY250LCAmY20tPmFsdF9mYl9pZHgsIGNtLT5uZXdfZmJfaWR4KTsKKworICAgIGlmIChjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lKQorICAgIHsKKyAgICAgICAgcmVmX2NudF9mYiAoY20tPmZiX2lkeF9yZWZfY250LCAmY20tPmxzdF9mYl9pZHgsIGNtLT5uZXdfZmJfaWR4KTsKKworICAgICAgICBjbS0+ZnJhbWVfdG9fc2hvdyA9ICZjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY20tPmZyYW1lX3RvX3Nob3cgPSAmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdOworCisgICAgY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XS0tOworCisgICAgcmV0dXJuIGVycjsKK30KKworaW50IHZwOGR4X3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKFZQOERfQ09NUCAqcGJpLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lX3N0YW1wKQoreworI2lmIEhBVkVfTkVPTgorICAgIGludDY0X3QgZHhfc3RvcmVfcmVnWzhdOworI2VuZGlmCisgICAgVlA4X0NPTU1PTiAqY20gPSAmcGJpLT5jb21tb247CisgICAgaW50IHJldGNvZGUgPSAtMTsKKworICAgIHBiaS0+Y29tbW9uLmVycm9yLmVycm9yX2NvZGUgPSBWUFhfQ09ERUNfT0s7CisKKyAgICBpZiAocGJpLT5udW1fZnJhZ21lbnRzID09IDApCisgICAgeworICAgICAgICAvKiBOZXcgZnJhbWUsIHJlc2V0IGZyYWdtZW50IHBvaW50ZXJzIGFuZCBzaXplcyAqLworICAgICAgICB2cHhfbWVtc2V0KCh2b2lkKilwYmktPmZyYWdtZW50cywgMCwgc2l6ZW9mKHBiaS0+ZnJhZ21lbnRzKSk7CisgICAgICAgIHZweF9tZW1zZXQocGJpLT5mcmFnbWVudF9zaXplcywgMCwgc2l6ZW9mKHBiaS0+ZnJhZ21lbnRfc2l6ZXMpKTsKKyAgICB9CisgICAgaWYgKHBiaS0+aW5wdXRfZnJhZ21lbnRzICYmICEoc291cmNlID09IE5VTEwgJiYgc2l6ZSA9PSAwKSkKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIGEgcG9pbnRlciB0byB0aGlzIGZyYWdtZW50IGFuZCByZXR1cm4uIFdlIGhhdmVuJ3QKKyAgICAgICAgICogcmVjZWl2ZWQgdGhlIGNvbXBsZXRlIGZyYW1lIHlldCwgc28gd2Ugd2lsbCB3YWl0IHdpdGggZGVjb2RpbmcuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQocGJpLT5udW1fZnJhZ21lbnRzIDwgTUFYX1BBUlRJVElPTlMpOworICAgICAgICBwYmktPmZyYWdtZW50c1twYmktPm51bV9mcmFnbWVudHNdID0gc291cmNlOworICAgICAgICBwYmktPmZyYWdtZW50X3NpemVzW3BiaS0+bnVtX2ZyYWdtZW50c10gPSBzaXplOworICAgICAgICBwYmktPm51bV9mcmFnbWVudHMrKzsKKyAgICAgICAgaWYgKHBiaS0+bnVtX2ZyYWdtZW50cyA+ICgxIDw8IEVJR0hUX1BBUlRJVElPTikgKyAxKQorICAgICAgICB7CisgICAgICAgICAgICBwYmktPmNvbW1vbi5lcnJvci5lcnJvcl9jb2RlID0gVlBYX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7CisgICAgICAgICAgICBwYmktPm51bV9mcmFnbWVudHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghcGJpLT5pbnB1dF9mcmFnbWVudHMpCisgICAgeworICAgICAgICBwYmktPmZyYWdtZW50c1swXSA9IHNvdXJjZTsKKyAgICAgICAgcGJpLT5mcmFnbWVudF9zaXplc1swXSA9IHNpemU7CisgICAgICAgIHBiaS0+bnVtX2ZyYWdtZW50cyA9IDE7CisgICAgfQorICAgIGFzc2VydChwYmktPmNvbW1vbi5tdWx0aV90b2tlbl9wYXJ0aXRpb24gPD0gRUlHSFRfUEFSVElUSU9OKTsKKyAgICBpZiAocGJpLT5udW1fZnJhZ21lbnRzID09IDApCisgICAgeworICAgICAgICBwYmktPm51bV9mcmFnbWVudHMgPSAxOworICAgICAgICBwYmktPmZyYWdtZW50c1swXSA9IE5VTEw7CisgICAgICAgIHBiaS0+ZnJhZ21lbnRfc2l6ZXNbMF0gPSAwOworICAgIH0KKworICAgIGlmICghcGJpLT5lY19hY3RpdmUgJiYKKyAgICAgICAgcGJpLT5udW1fZnJhZ21lbnRzIDw9IDEgJiYgcGJpLT5mcmFnbWVudF9zaXplc1swXSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogSWYgZXJyb3IgY29uY2VhbG1lbnQgaXMgZGlzYWJsZWQgd2Ugd29uJ3Qgc2lnbmFsIG1pc3NpbmcgZnJhbWVzCisgICAgICAgICAqIHRvIHRoZSBkZWNvZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNtLT5mYl9pZHhfcmVmX2NudFtjbS0+bHN0X2ZiX2lkeF0gPiAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgbGFzdCByZWZlcmVuY2Ugc2hhcmVzIGJ1ZmZlciB3aXRoIGFub3RoZXIgcmVmZXJlbmNlCisgICAgICAgICAgICAgKiBidWZmZXIuIE1vdmUgaXQgdG8gaXRzIG93biBidWZmZXIgYmVmb3JlIHNldHRpbmcgaXQgYXMKKyAgICAgICAgICAgICAqIGNvcnJ1cHQsIG90aGVyd2lzZSB3ZSB3aWxsIG1ha2UgbXVsdGlwbGUgYnVmZmVycyBjb3JydXB0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb25zdCBpbnQgcHJldl9pZHggPSBjbS0+bHN0X2ZiX2lkeDsKKyAgICAgICAgICAgIGNtLT5mYl9pZHhfcmVmX2NudFtwcmV2X2lkeF0tLTsKKyAgICAgICAgICAgIGNtLT5sc3RfZmJfaWR4ID0gZ2V0X2ZyZWVfZmIoY20pOworICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZSgmY20tPnl2MTJfZmJbcHJldl9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XSk7CisgICAgICAgIH0KKyAgICAgICAgLyogVGhpcyBpcyB1c2VkIHRvIHNpZ25hbCB0aGF0IHdlIGFyZSBtaXNzaW5nIGZyYW1lcy4KKyAgICAgICAgICogV2UgZG8gbm90IGtub3cgaWYgdGhlIG1pc3NpbmcgZnJhbWUocykgd2FzIHN1cHBvc2VkIHRvIHVwZGF0ZQorICAgICAgICAgKiBhbnkgb2YgdGhlIHJlZmVyZW5jZSBidWZmZXJzLCBidXQgd2UgYWN0IGNvbnNlcnZhdGl2ZSBhbmQKKyAgICAgICAgICogbWFyayBvbmx5IHRoZSBsYXN0IGJ1ZmZlciBhcyBjb3JydXB0ZWQuCisgICAgICAgICAqLworICAgICAgICBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0uY29ycnVwdGVkID0gMTsKKworICAgICAgICAvKiBTaWduYWwgdGhhdCB3ZSBoYXZlIG5vIGZyYW1lIHRvIHNob3cuICovCisgICAgICAgIGNtLT5zaG93X2ZyYW1lID0gMDsKKworICAgICAgICBwYmktPm51bV9mcmFnbWVudHMgPSAwOworCisgICAgICAgIC8qIE5vdGhpbmcgbW9yZSB0byBkby4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgSEFWRV9ORU9OCisjaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAorICAgIGlmIChjbS0+Y3B1X2NhcHMgJiBIQVNfTkVPTikKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdnA4X3B1c2hfbmVvbihkeF9zdG9yZV9yZWcpOworICAgIH0KKyNlbmRpZgorCisgICAgY20tPm5ld19mYl9pZHggPSBnZXRfZnJlZV9mYiAoY20pOworCisgICAgLyogc2V0dXAgcmVmZXJlbmNlIGZyYW1lcyBmb3IgdnA4X2RlY29kZV9mcmFtZSAqLworICAgIHBiaS0+ZGVjX2ZiX3JlZltJTlRSQV9GUkFNRV0gID0gJmNtLT55djEyX2ZiW2NtLT5uZXdfZmJfaWR4XTsKKyAgICBwYmktPmRlY19mYl9yZWZbTEFTVF9GUkFNRV0gICA9ICZjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF07CisgICAgcGJpLT5kZWNfZmJfcmVmW0dPTERFTl9GUkFNRV0gPSAmY20tPnl2MTJfZmJbY20tPmdsZF9mYl9pZHhdOworICAgIHBiaS0+ZGVjX2ZiX3JlZltBTFRSRUZfRlJBTUVdID0gJmNtLT55djEyX2ZiW2NtLT5hbHRfZmJfaWR4XTsKKworICAgIGlmIChzZXRqbXAocGJpLT5jb21tb24uZXJyb3Iuam1wKSkKKyAgICB7CisgICAgICAgLyogV2UgZG8gbm90IGtub3cgaWYgdGhlIG1pc3NpbmcgZnJhbWUocykgd2FzIHN1cHBvc2VkIHRvIHVwZGF0ZQorICAgICAgICAqIGFueSBvZiB0aGUgcmVmZXJlbmNlIGJ1ZmZlcnMsIGJ1dCB3ZSBhY3QgY29uc2VydmF0aXZlIGFuZAorICAgICAgICAqIG1hcmsgb25seSB0aGUgbGFzdCBidWZmZXIgYXMgY29ycnVwdGVkLgorICAgICAgICAqLworICAgICAgICBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0uY29ycnVwdGVkID0gMTsKKworICAgICAgICBpZiAoY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XSA+IDApCisgICAgICAgICAgY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XS0tOworCisgICAgICAgIGdvdG8gZGVjb2RlX2V4aXQ7CisgICAgfQorCisgICAgcGJpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMTsKKworICAgIHJldGNvZGUgPSB2cDhfZGVjb2RlX2ZyYW1lKHBiaSk7CisKKyAgICBpZiAocmV0Y29kZSA8IDApCisgICAgeworICAgICAgICBpZiAoY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XSA+IDApCisgICAgICAgICAgY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XS0tOworCisgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLmVycm9yX2NvZGUgPSBWUFhfQ09ERUNfRVJST1I7CisgICAgICAgIGdvdG8gZGVjb2RlX2V4aXQ7CisgICAgfQorCisgICAgaWYgKHN3YXBfZnJhbWVfYnVmZmVycyAoY20pKQorICAgIHsKKyAgICAgICAgcGJpLT5jb21tb24uZXJyb3IuZXJyb3JfY29kZSA9IFZQWF9DT0RFQ19FUlJPUjsKKyAgICAgICAgZ290byBkZWNvZGVfZXhpdDsKKyAgICB9CisKKyAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAvKiBzd2FwIHRoZSBtb2RlIGluZm9zIHRvIHN0b3JhZ2UgZm9yIGZ1dHVyZSBlcnJvciBjb25jZWFsbWVudCAqLworICAgIGlmIChwYmktPmVjX2VuYWJsZWQgJiYgcGJpLT5jb21tb24ucHJldl9taSkKKyAgICB7CisgICAgICAgIE1PREVfSU5GTyogdG1wID0gcGJpLT5jb21tb24ucHJldl9taTsKKyAgICAgICAgaW50IHJvdywgY29sOworICAgICAgICBwYmktPmNvbW1vbi5wcmV2X21pID0gcGJpLT5jb21tb24ubWk7CisgICAgICAgIHBiaS0+Y29tbW9uLm1pID0gdG1wOworCisgICAgICAgIC8qIFByb3BhZ2F0ZSB0aGUgc2VnbWVudF9pZHMgdG8gdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBwYmktPmNvbW1vbi5tYl9yb3dzOyArK3JvdykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBwYmktPmNvbW1vbi5tYl9jb2xzOyArK2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IHJvdypwYmktPmNvbW1vbi5tb2RlX2luZm9fc3RyaWRlICsgY29sOworICAgICAgICAgICAgICAgIHBiaS0+Y29tbW9uLm1pW2ldLm1ibWkuc2VnbWVudF9pZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYmktPmNvbW1vbi5wcmV2X21pW2ldLm1ibWkuc2VnbWVudF9pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGNtLT5zaG93X2ZyYW1lKQorICAgICAgICBjbS0+Y3VycmVudF92aWRlb19mcmFtZSsrOworCisgICAgcGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPSAwOworICAgIHBiaS0+bGFzdF90aW1lX3N0YW1wID0gdGltZV9zdGFtcDsKKworZGVjb2RlX2V4aXQ6CisjaWYgSEFWRV9ORU9OCisjaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAorICAgIGlmIChjbS0+Y3B1X2NhcHMgJiBIQVNfTkVPTikKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdnA4X3BvcF9uZW9uKGR4X3N0b3JlX3JlZyk7CisgICAgfQorI2VuZGlmCisKKyAgICBwYmktPmNvbW1vbi5lcnJvci5zZXRqbXAgPSAwOworICAgIHBiaS0+bnVtX2ZyYWdtZW50cyA9IDA7CisgICAgcmV0dXJuIHJldGNvZGU7Cit9CitpbnQgdnA4ZHhfZ2V0X3Jhd19mcmFtZShWUDhEX0NPTVAgKnBiaSwgWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgaW50NjRfdCAqdGltZV9zdGFtcCwgaW50NjRfdCAqdGltZV9lbmRfc3RhbXAsIHZwOF9wcGZsYWdzX3QgKmZsYWdzKQoreworICAgIGludCByZXQgPSAtMTsKKworICAgIGlmIChwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSA9PSAxKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogaWUgbm8gcmF3IGZyYW1lIHRvIHNob3chISEgKi8KKyAgICBpZiAocGJpLT5jb21tb24uc2hvd19mcmFtZSA9PSAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPSAxOworICAgICp0aW1lX3N0YW1wID0gcGJpLT5sYXN0X3RpbWVfc3RhbXA7CisgICAgKnRpbWVfZW5kX3N0YW1wID0gMDsKKworICAgIHNkLT5jbHJ0eXBlID0gcGJpLT5jb21tb24uY2xyX3R5cGU7CisjaWYgQ09ORklHX1BPU1RQUk9DCisgICAgcmV0ID0gdnA4X3Bvc3RfcHJvY19mcmFtZSgmcGJpLT5jb21tb24sIHNkLCBmbGFncyk7CisjZWxzZQorCisgICAgaWYgKHBiaS0+Y29tbW9uLmZyYW1lX3RvX3Nob3cpCisgICAgeworICAgICAgICAqc2QgPSAqcGJpLT5jb21tb24uZnJhbWVfdG9fc2hvdzsKKyAgICAgICAgc2QtPnlfd2lkdGggPSBwYmktPmNvbW1vbi5XaWR0aDsKKyAgICAgICAgc2QtPnlfaGVpZ2h0ID0gcGJpLT5jb21tb24uSGVpZ2h0OworICAgICAgICBzZC0+dXZfaGVpZ2h0ID0gcGJpLT5jb21tb24uSGVpZ2h0IC8gMjsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorCisjZW5kaWYgLyohQ09ORklHX1BPU1RQUk9DKi8KKyAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGFzIHdyaXR0ZW4gaXNuJ3QgZGVjb2RlciBzcGVjaWZpYywgYnV0IHRoZSBlbmNvZGVyIGhhcworICogbXVjaCBmYXN0ZXIgd2F5cyBvZiBjb21wdXRpbmcgdGhpcywgc28gaXQncyBvayBmb3IgaXQgdG8gbGl2ZSBpbiBhCisgKiBkZWNvZGUgc3BlY2lmaWMgZmlsZS4KKyAqLworaW50IHZwOGR4X3JlZmVyZW5jZXNfYnVmZmVyKCBWUDhfQ09NTU9OICpvY2ksIGludCByZWZfZnJhbWUgKQoreworICAgIGNvbnN0IE1PREVfSU5GTyAqbWkgPSBvY2ktPm1pOworICAgIGludCBtYl9yb3csIG1iX2NvbDsKKworICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgb2NpLT5tYl9yb3dzOyBtYl9yb3crKykKKyAgICB7CisgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgb2NpLT5tYl9jb2xzOyBtYl9jb2wrKyxtaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbWktPm1ibWkucmVmX2ZyYW1lID09IHJlZl9mcmFtZSkKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgbWkrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZGVjb2Rlci9vbnl4ZF9pbnQuaCBiL2xpYnZweC92cDgvZGVjb2Rlci9vbnl4ZF9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDYzYmViCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL29ueXhkX2ludC5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19WUDhEX0lOVF9ICisjZGVmaW5lIF9fSU5DX1ZQOERfSU5UX0gKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4ZC5oIgorI2luY2x1ZGUgInRyZWVyZWFkZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhjX2ludC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vdGhyZWFkaW5nLmgiCisKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyNpbmNsdWRlICJlY190eXBlcy5oIgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGl0aHJlYWQ7CisgICAgdm9pZCAqcHRyMTsKKyAgICB2b2lkICpwdHIyOworfSBERUNPREVUSFJFQURfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBNQUNST0JMT0NLRCAgbWJkOworfSBNQl9ST1dfREVDOworCit0eXBlZGVmIHN0cnVjdCBWUDhEX0NPTVAKK3sKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIE1BQ1JPQkxPQ0tELCBtYik7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRlY19mYl9yZWZbTlVNX1lWMTJfQlVGRkVSU107CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIFZQOF9DT01NT04sIGNvbW1vbik7CisKKyAgICAvKiB0aGUgbGFzdCBwYXJ0aXRpb24gd2lsbCBiZSB1c2VkIGZvciB0aGUgbW9kZXMvbXZzICovCisgICAgdnA4X3JlYWRlciBtYmNbTUFYX1BBUlRJVElPTlNdOworCisgICAgVlA4RF9DT05GSUcgb3hjZjsKKworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZnJhZ21lbnRzW01BWF9QQVJUSVRJT05TXTsKKyAgICB1bnNpZ25lZCBpbnQgICBmcmFnbWVudF9zaXplc1tNQVhfUEFSVElUSU9OU107CisgICAgdW5zaWduZWQgaW50ICAgbnVtX2ZyYWdtZW50czsKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgIC8qIHZhcmlhYmxlIGZvciB0aHJlYWRpbmcgKi8KKworICAgIHZvbGF0aWxlIGludCBiX211bHRpdGhyZWFkZWRfcmQ7CisgICAgaW50IG1heF90aHJlYWRzOworICAgIGludCBjdXJyZW50X21iX2NvbF9tYWluOworICAgIHVuc2lnbmVkIGludCBkZWNvZGluZ190aHJlYWRfY291bnQ7CisgICAgaW50IGFsbG9jYXRlZF9kZWNvZGluZ190aHJlYWRfY291bnQ7CisKKyAgICBpbnQgbXRfYmFzZWxpbmVfZmlsdGVyX2xldmVsW01BWF9NQl9TRUdNRU5UU107CisgICAgaW50IHN5bmNfcmFuZ2U7CisgICAgaW50ICptdF9jdXJyZW50X21iX2NvbDsgICAgICAgICAgICAgICAgICAvKiBFYWNoIHJvdyByZW1lbWJlcnMgaXRzIGFscmVhZHkgZGVjb2RlZCBjb2x1bW4uICovCisKKyAgICB1bnNpZ25lZCBjaGFyICoqbXRfeWFib3ZlX3JvdzsgICAgICAgICAgIC8qIG1iX3Jvd3MgeCB3aWR0aCAqLworICAgIHVuc2lnbmVkIGNoYXIgKiptdF91YWJvdmVfcm93OworICAgIHVuc2lnbmVkIGNoYXIgKiptdF92YWJvdmVfcm93OworICAgIHVuc2lnbmVkIGNoYXIgKiptdF95bGVmdF9jb2w7ICAgICAgICAgICAgLyogbWJfcm93cyB4IDE2ICovCisgICAgdW5zaWduZWQgY2hhciAqKm10X3VsZWZ0X2NvbDsgICAgICAgICAgICAvKiBtYl9yb3dzIHggOCAqLworICAgIHVuc2lnbmVkIGNoYXIgKiptdF92bGVmdF9jb2w7ICAgICAgICAgICAgLyogbWJfcm93cyB4IDggKi8KKworICAgIE1CX1JPV19ERUMgICAgICAgICAgICptYl9yb3dfZGk7CisgICAgREVDT0RFVEhSRUFEX0RBVEEgICAgKmRlX3RocmVhZF9kYXRhOworCisgICAgcHRocmVhZF90ICAgICAgICAgICAqaF9kZWNvZGluZ190aHJlYWQ7CisgICAgc2VtX3QgICAgICAgICAgICAgICAqaF9ldmVudF9zdGFydF9kZWNvZGluZzsKKyAgICBzZW1fdCAgICAgICAgICAgICAgICBoX2V2ZW50X2VuZF9kZWNvZGluZzsKKyAgICAvKiBlbmQgb2YgdGhyZWFkaW5nIGRhdGEgKi8KKyNlbmRpZgorCisgICAgaW50NjRfdCBsYXN0X3RpbWVfc3RhbXA7CisgICAgaW50ICAgcmVhZHlfZm9yX25ld19kYXRhOworCisgICAgdnA4X3Byb2IgcHJvYl9pbnRyYTsKKyAgICB2cDhfcHJvYiBwcm9iX2xhc3Q7CisgICAgdnA4X3Byb2IgcHJvYl9nZjsKKyAgICB2cDhfcHJvYiBwcm9iX3NraXBfZmFsc2U7CisKKyNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICBNQl9PVkVSTEFQICpvdmVybGFwczsKKyAgICAvKiB0aGUgbWIgbnVtIGZyb20gd2hpY2ggbW9kZXMgYW5kIG12cyAoZmlyc3QgcGFydGl0aW9uKSBhcmUgY29ycnVwdCAqLworICAgIHVuc2lnbmVkIGludCBtdnNfY29ycnVwdF9mcm9tX21iOworI2VuZGlmCisgICAgaW50IGVjX2VuYWJsZWQ7CisgICAgaW50IGVjX2FjdGl2ZTsKKyAgICBpbnQgaW5wdXRfZnJhZ21lbnRzOworICAgIGludCBkZWNvZGVkX2tleV9mcmFtZTsKKyAgICBpbnQgaW5kZXBlbmRlbnRfcGFydGl0aW9uczsKKyAgICBpbnQgZnJhbWVfY29ycnVwdF9yZXNpZHVhbDsKKworfSBWUDhEX0NPTVA7CisKK2ludCB2cDhfZGVjb2RlX2ZyYW1lKFZQOERfQ09NUCAqY3BpKTsKKworI2lmIENPTkZJR19ERUJVRworI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAorICAgICAgICBsdmFsID0gKGV4cHIpOyBcCisgICAgICAgIGlmKCFsdmFsKSBcCisgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBiaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCIgYXQgJXM6JWQiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sX19MSU5FX18pO1wKKyAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAorICAgICAgICBsdmFsID0gKGV4cHIpOyBcCisgICAgICAgIGlmKCFsdmFsKSBcCisgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBiaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCk7XAorICAgIH0gd2hpbGUoMCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZGVjb2Rlci90aHJlYWRpbmcuYyBiL2xpYnZweC92cDgvZGVjb2Rlci90aHJlYWRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMwNmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9kZWNvZGVyL3RocmVhZGluZy5jCkBAIC0wLDAgKzEsOTE4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2lmICFkZWZpbmVkKFdJTjMyKSAmJiBDT05GSUdfT1NfU1VQUE9SVCA9PSAxCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSAib255eGRfaW50LmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKKworI2luY2x1ZGUgInZwOC9jb21tb24vbG9vcGZpbHRlci5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCisjaW5jbHVkZSAidnB4X3BvcnRzL3ZweF90aW1lci5oIgorI2luY2x1ZGUgImRldG9rZW5pemUuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50ZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oIgorI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorI2luY2x1ZGUgImVycm9yX2NvbmNlYWxtZW50LmgiCisjZW5kaWYKKworI2RlZmluZSBDQUxMT0NfQVJSQVkocCwgbikgQ0hFQ0tfTUVNX0VSUk9SKChwKSwgdnB4X2NhbGxvYyhzaXplb2YoKihwKSksIChuKSkpCisjZGVmaW5lIENBTExPQ19BUlJBWV9BTElHTkVEKHAsIG4sIGFsZ24pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgXAorICBDSEVDS19NRU1fRVJST1IoKHApLCB2cHhfbWVtYWxpZ24oKGFsZ24pLCBzaXplb2YoKihwKSkgKiAobikpKTsgIFwKKyAgbWVtc2V0KChwKSwgMCwgKG4pICogc2l6ZW9mKCoocCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisKK2V4dGVybiB2b2lkIHZwOF9tYl9pbml0X2RlcXVhbnRpemVyKFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeGQpOworCitzdGF0aWMgdm9pZCBzZXR1cF9kZWNvZGluZ190aHJlYWRfZGF0YShWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKnhkLCBNQl9ST1dfREVDICptYnJkLCBpbnQgY291bnQpCit7CisgICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICBNQUNST0JMT0NLRCAqbWJkID0gJm1icmRbaV0ubWJkOworICAgICAgICBtYmQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3Q7CisgICAgICAgIG1iZC0+c3VicGl4ZWxfcHJlZGljdDh4NCAgICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4NDsKKyAgICAgICAgbWJkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4OworICAgICAgICBtYmQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNjsKKworICAgICAgICBtYmQtPm1vZGVfaW5mb19jb250ZXh0ID0gcGMtPm1pICAgKyBwYy0+bW9kZV9pbmZvX3N0cmlkZSAqIChpICsgMSk7CisgICAgICAgIG1iZC0+bW9kZV9pbmZvX3N0cmlkZSAgPSBwYy0+bW9kZV9pbmZvX3N0cmlkZTsKKworICAgICAgICBtYmQtPmZyYW1lX3R5cGUgPSBwYy0+ZnJhbWVfdHlwZTsKKyAgICAgICAgbWJkLT5wcmUgPSB4ZC0+cHJlOworICAgICAgICBtYmQtPmRzdCA9IHhkLT5kc3Q7CisKKyAgICAgICAgbWJkLT5zZWdtZW50YXRpb25fZW5hYmxlZCAgICA9IHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZDsKKyAgICAgICAgbWJkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgICAgID0geGQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YTsKKyAgICAgICAgdnB4X21lbWNweShtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhLCB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEsIHNpemVvZih4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEpKTsKKworICAgICAgICAvKnNpZ25lZCBjaGFyIHJlZl9sZl9kZWx0YXNbTUFYX1JFRl9MRl9ERUxUQVNdOyovCisgICAgICAgIHZweF9tZW1jcHkobWJkLT5yZWZfbGZfZGVsdGFzLCB4ZC0+cmVmX2xmX2RlbHRhcywgc2l6ZW9mKHhkLT5yZWZfbGZfZGVsdGFzKSk7CisgICAgICAgIC8qc2lnbmVkIGNoYXIgbW9kZV9sZl9kZWx0YXNbTUFYX01PREVfTEZfREVMVEFTXTsqLworICAgICAgICB2cHhfbWVtY3B5KG1iZC0+bW9kZV9sZl9kZWx0YXMsIHhkLT5tb2RlX2xmX2RlbHRhcywgc2l6ZW9mKHhkLT5tb2RlX2xmX2RlbHRhcykpOworICAgICAgICAvKnVuc2lnbmVkIGNoYXIgbW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBtb2RlX3JlZl9sZl9kZWx0YV91cGRhdGU7Ki8KKyAgICAgICAgbWJkLT5tb2RlX3JlZl9sZl9kZWx0YV9lbmFibGVkICAgID0geGQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQ7CisgICAgICAgIG1iZC0+bW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlICAgID0geGQtPm1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZTsKKworICAgICAgICBtYmQtPmN1cnJlbnRfYmMgPSAmcGJpLT5tYmNbMF07CisKKyAgICAgICAgdnB4X21lbWNweShtYmQtPmRlcXVhbnRfeTFfZGMsIHhkLT5kZXF1YW50X3kxX2RjLCBzaXplb2YoeGQtPmRlcXVhbnRfeTFfZGMpKTsKKyAgICAgICAgdnB4X21lbWNweShtYmQtPmRlcXVhbnRfeTEsIHhkLT5kZXF1YW50X3kxLCBzaXplb2YoeGQtPmRlcXVhbnRfeTEpKTsKKyAgICAgICAgdnB4X21lbWNweShtYmQtPmRlcXVhbnRfeTIsIHhkLT5kZXF1YW50X3kyLCBzaXplb2YoeGQtPmRlcXVhbnRfeTIpKTsKKyAgICAgICAgdnB4X21lbWNweShtYmQtPmRlcXVhbnRfdXYsIHhkLT5kZXF1YW50X3V2LCBzaXplb2YoeGQtPmRlcXVhbnRfdXYpKTsKKworICAgICAgICBtYmQtPmZ1bGxwaXhlbF9tYXNrID0gMHhmZmZmZmZmZjsKKworICAgICAgICBpZiAocGMtPmZ1bGxfcGl4ZWwpCisgICAgICAgICAgICBtYmQtPmZ1bGxwaXhlbF9tYXNrID0gMHhmZmZmZmZmODsKKworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwYy0+bWJfcm93czsgaSsrKQorICAgICAgICBwYmktPm10X2N1cnJlbnRfbWJfY29sW2ldID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIG10X2RlY29kZV9tYWNyb2Jsb2NrKFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWJfaWR4KQoreworICAgIE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlOworICAgIGludCBpOworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIGludCBjb3JydXB0aW9uX2RldGVjdGVkID0gMDsKKyNlbmRpZgorCisgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKQorICAgIHsKKyAgICAgICAgdnA4X3Jlc2V0X21iX3Rva2Vuc19jb250ZXh0KHhkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXZwOGR4X2Jvb2xfZXJyb3IoeGQtPmN1cnJlbnRfYmMpKQorICAgIHsKKyAgICAgICAgaW50IGVvYnRvdGFsOworICAgICAgICBlb2J0b3RhbCA9IHZwOF9kZWNvZGVfbWJfdG9rZW5zKHBiaSwgeGQpOworCisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogIEZvcmNlIHRoZSBsb29wZmlsdGVyIHRvIHNraXAgd2hlbiBlb2J0b3RhbCBpcyB6ZXJvICovCisgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmID0gKGVvYnRvdGFsPT0wKTsKKyAgICB9CisKKyAgICBtb2RlID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGU7CisKKyAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgICAgICB2cDhfbWJfaW5pdF9kZXF1YW50aXplcihwYmksIHhkKTsKKworCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisKKyAgICBpZihwYmktPmVjX2FjdGl2ZSkKKyAgICB7CisgICAgICAgIGludCB0aHJvd19yZXNpZHVhbDsKKyAgICAgICAgLyogV2hlbiB3ZSBoYXZlIGluZGVwZW5kZW50IHBhcnRpdGlvbnMgd2UgY2FuIGFwcGx5IHJlc2lkdWFsIGV2ZW4KKyAgICAgICAgICogdGhvdWdoIG90aGVyIHBhcnRpdGlvbnMgd2l0aGluIHRoZSBmcmFtZSBhcmUgY29ycnVwdC4KKyAgICAgICAgICovCisgICAgICAgIHRocm93X3Jlc2lkdWFsID0gKCFwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGJpLT5mcmFtZV9jb3JydXB0X3Jlc2lkdWFsKTsKKyAgICAgICAgdGhyb3dfcmVzaWR1YWwgPSAodGhyb3dfcmVzaWR1YWwgfHwgdnA4ZHhfYm9vbF9lcnJvcih4ZC0+Y3VycmVudF9iYykpOworCisgICAgICAgIGlmICgobWJfaWR4ID49IHBiaS0+bXZzX2NvcnJ1cHRfZnJvbV9tYiB8fCB0aHJvd19yZXNpZHVhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1CIHdpdGggY29ycnVwdCByZXNpZHVhbHMgb3IgY29ycnVwdCBtb2RlL21vdGlvbiB2ZWN0b3JzLgorICAgICAgICAgICAgICogQmV0dGVyIHRvIHVzZSB0aGUgcHJlZGljdG9yIGFzIHJlY29uc3RydWN0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwYmktPmZyYW1lX2NvcnJ1cHRfcmVzaWR1YWwgPSAxOworICAgICAgICAgICAgdnB4X21lbXNldCh4ZC0+cWNvZWZmLCAwLCBzaXplb2YoeGQtPnFjb2VmZikpOworICAgICAgICAgICAgdnA4X2NvbmNlYWxfY29ycnVwdF9tYih4ZCk7CisKKworICAgICAgICAgICAgY29ycnVwdGlvbl9kZXRlY3RlZCA9IDE7CisKKyAgICAgICAgICAgIC8qIGZvcmNlIGlkY3QgdG8gYmUgc2tpcHBlZCBmb3IgQl9QUkVEIGFuZCB1c2UgdGhlCisgICAgICAgICAgICAgKiBwcmVkaWN0aW9uIG9ubHkgZm9yIHJlY29uc3RydWN0aW9uCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgdnB4X21lbXNldCh4ZC0+ZW9icywgMCwgMjUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBkbyBwcmVkaWN0aW9uICovCisgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCisgICAgeworICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MoeGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPnJlY29uX2xlZnRfc3RyaWRlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudXZfc3RyaWRlKTsKKworICAgICAgICBpZiAobW9kZSAhPSBCX1BSRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zKHhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdF9zdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0Lnlfc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0ICpEUUMgPSB4ZC0+ZGVxdWFudF95MTsKKyAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlID0geGQtPmRzdC55X3N0cmlkZTsKKworICAgICAgICAgICAgLyogY2xlYXIgb3V0IHJlc2lkdWFsIGVvYiBpbmZvICovCisgICAgICAgICAgICBpZih4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZikKKyAgICAgICAgICAgICAgICB2cHhfbWVtc2V0KHhkLT5lb2JzLCAwLCAyNSk7CisKKyAgICAgICAgICAgIGludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KHhkLCB4ZC0+cmVjb25fYWJvdmVbMF0gKyAxNik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJMT0NLRCAqYiA9ICZ4ZC0+YmxvY2tbaV07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0ID0geGQtPmRzdC55X2J1ZmZlciArIGItPm9mZnNldDsKKyAgICAgICAgICAgICAgICBCX1BSRURJQ1RJT05fTU9ERSBiX21vZGUgPQorICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVtpXS5hc19tb2RlOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKkFib3ZlOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnlsZWZ0OworICAgICAgICAgICAgICAgIGludCBsZWZ0X3N0cmlkZTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0OworCisgICAgICAgICAgICAgICAgLypDYXV0aW9uOiBGb3Igc29tZSBiX21vZGUsIGl0IG5lZWRzIDggcGl4ZWxzICg0IGFib3ZlICsgNCBhYm92ZS1yaWdodCkuKi8KKyAgICAgICAgICAgICAgICBpZiAoaSA8IDQgJiYgcGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQorICAgICAgICAgICAgICAgICAgICBBYm92ZSA9IHhkLT5yZWNvbl9hYm92ZVswXSArIGItPm9mZnNldDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEFib3ZlID0gZHN0IC0gZHN0X3N0cmlkZTsKKworICAgICAgICAgICAgICAgIGlmIChpJTQ9PTAgJiYgcGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeWxlZnQgPSB4ZC0+cmVjb25fbGVmdFswXSArIGk7CisgICAgICAgICAgICAgICAgICAgIGxlZnRfc3RyaWRlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeWxlZnQgPSBkc3QgLSAxOworICAgICAgICAgICAgICAgICAgICBsZWZ0X3N0cmlkZSA9IGRzdF9zdHJpZGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKChpPT00IHx8IGk9PTggfHwgaT09MTIpICYmIHBiaS0+Y29tbW9uLmZpbHRlcl9sZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgdG9wX2xlZnQgPSAqKHhkLT5yZWNvbl9sZWZ0WzBdICsgaSAtIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdG9wX2xlZnQgPSBBYm92ZVstMV07CisKKyAgICAgICAgICAgICAgICB2cDhfaW50cmE0eDRfcHJlZGljdChBYm92ZSwgeWxlZnQsIGxlZnRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfbW9kZSwgZHN0LCBkc3Rfc3RyaWRlLCB0b3BfbGVmdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoeGQtPmVvYnNbaV0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5lb2JzW2ldID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGQoYi0+cWNvZWZmLCBEUUMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZChiLT5xY29lZmZbMF0gKiBEUUNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iKHhkKTsKKyAgICB9CisKKworI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorICAgIGlmIChjb3JydXB0aW9uX2RldGVjdGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgaWYoIXhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKQorICAgIHsKKyAgICAgICAgLyogZGVxdWFudGl6YXRpb24gYW5kIGlkY3QgKi8KKyAgICAgICAgaWYgKG1vZGUgIT0gQl9QUkVEKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydCAqRFFDID0geGQtPmRlcXVhbnRfeTE7CisKKyAgICAgICAgICAgIGlmIChtb2RlICE9IFNQTElUTVYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkxPQ0tEICpiID0gJnhkLT5ibG9ja1syNF07CisKKyAgICAgICAgICAgICAgICAvKiBkbyAybmQgb3JkZXIgdHJhbnNmb3JtIG9uIHRoZSBkYyBibG9jayAqLworICAgICAgICAgICAgICAgIGlmICh4ZC0+ZW9ic1syNF0gPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdnA4X2RlcXVhbnRpemVfYihiLCB4ZC0+ZGVxdWFudF95Mik7CisKKyAgICAgICAgICAgICAgICAgICAgdnA4X3Nob3J0X2ludl93YWxzaDR4NCgmYi0+ZHFjb2VmZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5xY29lZmYpOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMl0gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbM10gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbNF0gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbNV0gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbN10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiLT5kcWNvZWZmWzBdID0gYi0+cWNvZWZmWzBdICogeGQtPmRlcXVhbnRfeTJbMF07CisgICAgICAgICAgICAgICAgICAgIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMSgmYi0+ZHFjb2VmZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5xY29lZmYpOworICAgICAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMF0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIG92ZXJyaWRlIHRoZSBkYyBkZXF1YW50IGNvbnN0YW50IGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZQorICAgICAgICAgICAgICAgICAqIGRjIGNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBEUUMgPSB4ZC0+ZGVxdWFudF95MV9kYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4ZC0+cWNvZWZmLCBEUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9zdHJpZGUsIHhkLT5lb2JzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPnFjb2VmZisxNioxNiwgeGQtPmRlcXVhbnRfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnV2X3N0cmlkZSwgeGQtPmVvYnMrMTYpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbXRfZGVjb2RlX21iX3Jvd3MoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4ZCwgaW50IHN0YXJ0X21iX3JvdykKK3sKKyAgICB2b2xhdGlsZSBjb25zdCBpbnQgKmxhc3Rfcm93X2N1cnJlbnRfbWJfY29sOworICAgIHZvbGF0aWxlIGludCAqY3VycmVudF9tYl9jb2w7CisgICAgaW50IG1iX3JvdzsKKyAgICBWUDhfQ09NTU9OICpwYyA9ICZwYmktPmNvbW1vbjsKKyAgICBjb25zdCBpbnQgbnN5bmMgPSBwYmktPnN5bmNfcmFuZ2U7CisgICAgY29uc3QgaW50IGZpcnN0X3Jvd19ub19zeW5jX2Fib3ZlID0gcGMtPm1iX2NvbHMgKyBuc3luYzsKKyAgICBpbnQgbnVtX3BhcnQgPSAxIDw8IHBiaS0+Y29tbW9uLm11bHRpX3Rva2VuX3BhcnRpdGlvbjsKKyAgICBpbnQgbGFzdF9tYl9yb3cgPSBzdGFydF9tYl9yb3c7CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnl2MTJfZmJfbmV3ID0gcGJpLT5kZWNfZmJfcmVmW0lOVFJBX0ZSQU1FXTsKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnl2MTJfZmJfbHN0ID0gcGJpLT5kZWNfZmJfcmVmW0xBU1RfRlJBTUVdOworCisgICAgaW50IHJlY29uX3lfc3RyaWRlID0geXYxMl9mYl9uZXctPnlfc3RyaWRlOworICAgIGludCByZWNvbl91dl9zdHJpZGUgPSB5djEyX2ZiX25ldy0+dXZfc3RyaWRlOworCisgICAgdW5zaWduZWQgY2hhciAqcmVmX2J1ZmZlcltNQVhfUkVGX0ZSQU1FU11bM107CisgICAgdW5zaWduZWQgY2hhciAqZHN0X2J1ZmZlclszXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmVmX2ZiX2NvcnJ1cHRlZFtNQVhfUkVGX0ZSQU1FU107CisKKyAgICByZWZfZmJfY29ycnVwdGVkW0lOVFJBX0ZSQU1FXSA9IDA7CisKKyAgICBmb3IoaSA9IDE7IGkgPCBNQVhfUkVGX0ZSQU1FUzsgaSsrKQorICAgIHsKKyAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICp0aGlzX2ZiID0gcGJpLT5kZWNfZmJfcmVmW2ldOworCisgICAgICAgIHJlZl9idWZmZXJbaV1bMF0gPSB0aGlzX2ZiLT55X2J1ZmZlcjsKKyAgICAgICAgcmVmX2J1ZmZlcltpXVsxXSA9IHRoaXNfZmItPnVfYnVmZmVyOworICAgICAgICByZWZfYnVmZmVyW2ldWzJdID0gdGhpc19mYi0+dl9idWZmZXI7CisKKyAgICAgICAgcmVmX2ZiX2NvcnJ1cHRlZFtpXSA9IHRoaXNfZmItPmNvcnJ1cHRlZDsKKyAgICB9CisKKyAgICBkc3RfYnVmZmVyWzBdID0geXYxMl9mYl9uZXctPnlfYnVmZmVyOworICAgIGRzdF9idWZmZXJbMV0gPSB5djEyX2ZiX25ldy0+dV9idWZmZXI7CisgICAgZHN0X2J1ZmZlclsyXSA9IHl2MTJfZmJfbmV3LT52X2J1ZmZlcjsKKworICAgIHhkLT51cF9hdmFpbGFibGUgPSAoc3RhcnRfbWJfcm93ICE9IDApOworCisgICAgZm9yIChtYl9yb3cgPSBzdGFydF9tYl9yb3c7IG1iX3JvdyA8IHBjLT5tYl9yb3dzOyBtYl9yb3cgKz0gKHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkpCisgICAgeworICAgICAgIGludCBpOworICAgICAgIGludCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldDsKKyAgICAgICBpbnQgbWJfY29sOworICAgICAgIGludCBmaWx0ZXJfbGV2ZWw7CisgICAgICAgbG9vcF9maWx0ZXJfaW5mb19uICpsZmlfbiA9ICZwYy0+bGZfaW5mbzsKKworICAgICAgIC8qIHNhdmUgbGFzdCByb3cgcHJvY2Vzc2VkIGJ5IHRoaXMgdGhyZWFkICovCisgICAgICAgbGFzdF9tYl9yb3cgPSBtYl9yb3c7CisgICAgICAgLyogc2VsZWN0IGJvb2wgY29kZXIgZm9yIGN1cnJlbnQgcGFydGl0aW9uICovCisgICAgICAgeGQtPmN1cnJlbnRfYmMgPSAgJnBiaS0+bWJjW21iX3JvdyVudW1fcGFydF07CisKKyAgICAgICBpZiAobWJfcm93ID4gMCkKKyAgICAgICAgICAgbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgPSAmcGJpLT5tdF9jdXJyZW50X21iX2NvbFttYl9yb3cgLTFdOworICAgICAgIGVsc2UKKyAgICAgICAgICAgbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgPSAmZmlyc3Rfcm93X25vX3N5bmNfYWJvdmU7CisKKyAgICAgICBjdXJyZW50X21iX2NvbCA9ICZwYmktPm10X2N1cnJlbnRfbWJfY29sW21iX3Jvd107CisKKyAgICAgICByZWNvbl95b2Zmc2V0ID0gbWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNjsKKyAgICAgICByZWNvbl91dm9mZnNldCA9IG1iX3JvdyAqIHJlY29uX3V2X3N0cmlkZSAqIDg7CisKKyAgICAgICAvKiByZXNldCBjb250ZXh0cyAqLworICAgICAgIHhkLT5hYm92ZV9jb250ZXh0ID0gcGMtPmFib3ZlX2NvbnRleHQ7CisgICAgICAgdnB4X21lbXNldCh4ZC0+bGVmdF9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworCisgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gMDsKKworICAgICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSkgPDwgMzsKKyAgICAgICB4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgPSAoKHBjLT5tYl9yb3dzIC0gMSAtIG1iX3JvdykgKiAxNikgPDwgMzsKKworICAgICAgIGlmIChwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCisgICAgICAgeworICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVswXSA9IHBiaS0+bXRfeWFib3ZlX3Jvd1ttYl9yb3ddICsgMCoxNiArMzI7CisgICAgICAgICAgeGQtPnJlY29uX2Fib3ZlWzFdID0gcGJpLT5tdF91YWJvdmVfcm93W21iX3Jvd10gKyAwKjggKzE2OworICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVsyXSA9IHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3ddICsgMCo4ICsxNjsKKworICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzBdID0gcGJpLT5tdF95bGVmdF9jb2xbbWJfcm93XTsKKyAgICAgICAgICB4ZC0+cmVjb25fbGVmdFsxXSA9IHBiaS0+bXRfdWxlZnRfY29sW21iX3Jvd107CisgICAgICAgICAgeGQtPnJlY29uX2xlZnRbMl0gPSBwYmktPm10X3ZsZWZ0X2NvbFttYl9yb3ddOworCisgICAgICAgICAgLyogVE9ETzogbW92ZSB0byBvdXRzaWRlIHJvdyBsb29wICovCisgICAgICAgICAgeGQtPnJlY29uX2xlZnRfc3RyaWRlWzBdID0gMTsKKyAgICAgICAgICB4ZC0+cmVjb25fbGVmdF9zdHJpZGVbMV0gPSAxOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVswXSA9IGRzdF9idWZmZXJbMF0gKyByZWNvbl95b2Zmc2V0OworICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVsxXSA9IGRzdF9idWZmZXJbMV0gKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMl0gPSBkc3RfYnVmZmVyWzJdICsgcmVjb25fdXZvZmZzZXQ7CisKKyAgICAgICAgICB4ZC0+cmVjb25fbGVmdFswXSA9IHhkLT5yZWNvbl9hYm92ZVswXSAtIDE7CisgICAgICAgICAgeGQtPnJlY29uX2xlZnRbMV0gPSB4ZC0+cmVjb25fYWJvdmVbMV0gLSAxOworICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzJdID0geGQtPnJlY29uX2Fib3ZlWzJdIC0gMTsKKworICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVswXSAtPSB4ZC0+ZHN0Lnlfc3RyaWRlOworICAgICAgICAgIHhkLT5yZWNvbl9hYm92ZVsxXSAtPSB4ZC0+ZHN0LnV2X3N0cmlkZTsKKyAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMl0gLT0geGQtPmRzdC51dl9zdHJpZGU7CisKKyAgICAgICAgICAvKiBUT0RPOiBtb3ZlIHRvIG91dHNpZGUgcm93IGxvb3AgKi8KKyAgICAgICAgICB4ZC0+cmVjb25fbGVmdF9zdHJpZGVbMF0gPSB4ZC0+ZHN0Lnlfc3RyaWRlOworICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0X3N0cmlkZVsxXSA9IHhkLT5kc3QudXZfc3RyaWRlOworCisgICAgICAgICAgc2V0dXBfaW50cmFfcmVjb25fbGVmdCh4ZC0+cmVjb25fbGVmdFswXSwgeGQtPnJlY29uX2xlZnRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cmVjb25fbGVmdFsyXSwgeGQtPmRzdC55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudXZfc3RyaWRlKTsKKyAgICAgICB9CisKKyAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IHBjLT5tYl9jb2xzOyBtYl9jb2wrKykKKyAgICAgICB7CisgICAgICAgICAgICpjdXJyZW50X21iX2NvbCA9IG1iX2NvbCAtIDE7CisKKyAgICAgICAgICAgaWYgKChtYl9jb2wgJiAobnN5bmMgLSAxKSkgPT0gMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgd2hpbGUgKG1iX2NvbCA+ICgqbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgLSBuc3luYykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgeDg2X3BhdXNlX2hpbnQoKTsKKyAgICAgICAgICAgICAgICAgICB0aHJlYWRfc2xlZXAoMCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgICAgICAvKiBEaXN0YW5jZSBvZiBNQiB0byB0aGUgdmFyaW91cyBpbWFnZSBlZGdlcy4KKyAgICAgICAgICAgICogVGhlc2UgYXJlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cworICAgICAgICAgICAgKiBjb21wYXJlZCB0byB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgeGQtPm1iX3RvX2xlZnRfZWRnZSA9IC0oKG1iX2NvbCAqIDE2KSA8PCAzKTsKKyAgICAgICAgICAgeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPSAoKHBjLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKKworICAgICNpZiBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IGNvcnJ1cHRfcmVzaWR1YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFwYmktPmluZGVwZW5kZW50X3BhcnRpdGlvbnMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+ZnJhbWVfY29ycnVwdF9yZXNpZHVhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOGR4X2Jvb2xfZXJyb3IoeGQtPmN1cnJlbnRfYmMpOworICAgICAgICAgICAgICAgaWYgKHBiaS0+ZWNfYWN0aXZlICYmCisgICAgICAgICAgICAgICAgICAgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRSQV9GUkFNRSkgJiYKKyAgICAgICAgICAgICAgICAgICBjb3JydXB0X3Jlc2lkdWFsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgYW4gaW50cmEgYmxvY2sgd2l0aCBjb3JydXB0CisgICAgICAgICAgICAgICAgICAgICogY29lZmZpY2llbnRzLCBiZXR0ZXIgdG8gY29uY2VhbCB3aXRoIGFuIGludGVyCisgICAgICAgICAgICAgICAgICAgICogYmxvY2suCisgICAgICAgICAgICAgICAgICAgICogSW50ZXJwb2xhdGUgTVZzIGZyb20gbmVpZ2hib3JpbmcgTUJzCisgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIHRoZSBmaXJzdCBtYiB3aXRoIGNvcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgKiByZXNpZHVhbCBpbiBhIGZyYW1lLCB3ZSBtaWdodCBub3QgZGlzY292ZXIKKyAgICAgICAgICAgICAgICAgICAgKiB0aGF0IGJlZm9yZSBkZWNvZGluZyB0aGUgcmVzaWR1YWwuIFRoYXQKKyAgICAgICAgICAgICAgICAgICAgKiBoYXBwZW5zIGFmdGVyIHRoaXMgY2hlY2ssIGFuZCB0aGVyZWZvcmUgbm8KKyAgICAgICAgICAgICAgICAgICAgKiBpbnRlciBjb25jZWFsbWVudCB3aWxsIGJlIGRvbmUuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgdnA4X2ludGVycG9sYXRlX21vdGlvbih4ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3JvdywgbWJfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPm1iX3Jvd3MsIHBjLT5tYl9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPm1vZGVfaW5mb19zdHJpZGUpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgI2VuZGlmCisKKworICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyID0gZHN0X2J1ZmZlclswXSArIHJlY29uX3lvZmZzZXQ7CisgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIgPSBkc3RfYnVmZmVyWzFdICsgcmVjb25fdXZvZmZzZXQ7CisgICAgICAgICAgIHhkLT5kc3Qudl9idWZmZXIgPSBkc3RfYnVmZmVyWzJdICsgcmVjb25fdXZvZmZzZXQ7CisKKyAgICAgICAgICAgeGQtPnByZS55X2J1ZmZlciA9IHJlZl9idWZmZXJbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV1bMF0gKyByZWNvbl95b2Zmc2V0OworICAgICAgICAgICB4ZC0+cHJlLnVfYnVmZmVyID0gcmVmX2J1ZmZlclt4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXVsxXSArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICAgICB4ZC0+cHJlLnZfYnVmZmVyID0gcmVmX2J1ZmZlclt4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXVsyXSArIHJlY29uX3V2b2Zmc2V0OworCisgICAgICAgICAgIC8qIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSByZWZlcmVuY2UgZnJhbWVzICovCisgICAgICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gcmVmX2ZiX2NvcnJ1cHRlZFt4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKKworICAgICAgICAgICBtdF9kZWNvZGVfbWFjcm9ibG9jayhwYmksIHhkLCAwKTsKKworICAgICAgICAgICB4ZC0+bGVmdF9hdmFpbGFibGUgPSAxOworCisgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBib29sZWFuIGRlY29kZXIgaGFzIHN1ZmZlcmVkIGFuIGVycm9yICovCisgICAgICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gdnA4ZHhfYm9vbF9lcnJvcih4ZC0+Y3VycmVudF9iYyk7CisKKyAgICAgICAgICAgeGQtPnJlY29uX2Fib3ZlWzBdICs9IDE2OworICAgICAgICAgICB4ZC0+cmVjb25fYWJvdmVbMV0gKz0gODsKKyAgICAgICAgICAgeGQtPnJlY29uX2Fib3ZlWzJdICs9IDg7CisKKyAgICAgICAgICAgaWYgKCFwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgeGQtPnJlY29uX2xlZnRbMF0gKz0gMTY7CisgICAgICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzFdICs9IDg7CisgICAgICAgICAgICAgIHhkLT5yZWNvbl9sZWZ0WzJdICs9IDg7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpZiAocGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgc2tpcF9sZiA9ICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYpOworCisgICAgICAgICAgICAgICBjb25zdCBpbnQgbW9kZV9pbmRleCA9IGxmaV9uLT5tb2RlX2xmX2x1dFt4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZV07CisgICAgICAgICAgICAgICBjb25zdCBpbnQgc2VnID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQ7CisgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVmX2ZyYW1lID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZTsKKworICAgICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gbGZpX24tPmx2bFtzZWddW3JlZl9mcmFtZV1bbW9kZV9pbmRleF07CisKKyAgICAgICAgICAgICAgIGlmKCBtYl9yb3cgIT0gcGMtPm1iX3Jvd3MtMSApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBkZWNvZGVkIE1CIGxhc3Qgcm93IGRhdGEgZm9yIG5leHQtcm93IGRlY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgdnB4X21lbWNweSgocGJpLT5tdF95YWJvdmVfcm93W21iX3JvdyArIDFdICsgMzIgKyBtYl9jb2wqMTYpLCAoeGQtPmRzdC55X2J1ZmZlciArIDE1ICogcmVjb25feV9zdHJpZGUpLCAxNik7CisgICAgICAgICAgICAgICAgICAgdnB4X21lbWNweSgocGJpLT5tdF91YWJvdmVfcm93W21iX3JvdyArIDFdICsgMTYgKyBtYl9jb2wqOCksICh4ZC0+ZHN0LnVfYnVmZmVyICsgNyAqIHJlY29uX3V2X3N0cmlkZSksIDgpOworICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoKHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3cgKyAxXSArIDE2ICsgbWJfY29sKjgpLCAoeGQtPmRzdC52X2J1ZmZlciArIDcgKiByZWNvbl91dl9zdHJpZGUpLCA4KTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogc2F2ZSBsZWZ0X2NvbCBmb3IgbmV4dCBNQiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgaWYobWJfY29sICE9IHBjLT5tYl9jb2xzLTEpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgTU9ERV9JTkZPICpuZXh0ID0geGQtPm1vZGVfaW5mb19jb250ZXh0ICsxOworCisgICAgICAgICAgICAgICAgICAgaWYgKG5leHQtPm1ibWkucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3lsZWZ0X2NvbFttYl9yb3ddW2ldID0geGQtPmRzdC55X2J1ZmZlciBbaSogcmVjb25feV9zdHJpZGUgKyAxNV07CisgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdWxlZnRfY29sW21iX3Jvd11baV0gPSB4ZC0+ZHN0LnVfYnVmZmVyIFtpKiByZWNvbl91dl9zdHJpZGUgKyA3XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdmxlZnRfY29sW21iX3Jvd11baV0gPSB4ZC0+ZHN0LnZfYnVmZmVyIFtpKiByZWNvbl91dl9zdHJpZGUgKyA3XTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogbG9vcGZpbHRlciBvbiB0aGlzIG1hY3JvYmxvY2suICovCisgICAgICAgICAgICAgICBpZiAoZmlsdGVyX2xldmVsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmKHBjLT5maWx0ZXJfdHlwZSA9PSBOT1JNQUxfTE9PUEZJTFRFUikKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2luZm8gbGZpOworICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGUgPSBwYy0+ZnJhbWVfdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhldl9pbmRleCA9IGxmaV9uLT5oZXZfdGhyX2x1dFtmcmFtZV90eXBlXVtmaWx0ZXJfbGV2ZWxdOworICAgICAgICAgICAgICAgICAgICAgICBsZmkubWJsaW0gPSBsZmlfbi0+bWJsaW1bZmlsdGVyX2xldmVsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgbGZpLmJsaW0gPSBsZmlfbi0+YmxpbVtmaWx0ZXJfbGV2ZWxdOworICAgICAgICAgICAgICAgICAgICAgICBsZmkubGltID0gbGZpX24tPmxpbVtmaWx0ZXJfbGV2ZWxdOworICAgICAgICAgICAgICAgICAgICAgICBsZmkuaGV2X3RociA9IGxmaV9uLT5oZXZfdGhyW2hldl9pbmRleF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX2NvbCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbWJ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwgJmxmaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2J2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwgJmxmaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgYXBwbHkgYWNyb3NzIHVtdiBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbWJoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwgJmxmaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwX2xmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2JoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgIHJlY29uX3lfc3RyaWRlLCByZWNvbl91dl9zdHJpZGUsICZsZmkpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPmRzdC55X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIGxmaV9uLT5tYmxpbVtmaWx0ZXJfbGV2ZWxdKTsKKworICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBfbGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2J2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPmRzdC55X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIGxmaV9uLT5ibGltW2ZpbHRlcl9sZXZlbF0pOworCisgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGFwcGx5IGFjcm9zcyB1bXYgYm9yZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYl9yb3cgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh4ZC0+ZHN0LnlfYnVmZmVyLCByZWNvbl95X3N0cmlkZSwgbGZpX24tPm1ibGltW2ZpbHRlcl9sZXZlbF0pOworCisgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcF9sZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh4ZC0+ZHN0LnlfYnVmZmVyLCByZWNvbl95X3N0cmlkZSwgbGZpX24tPmJsaW1bZmlsdGVyX2xldmVsXSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIH0KKworICAgICAgICAgICByZWNvbl95b2Zmc2V0ICs9IDE2OworICAgICAgICAgICByZWNvbl91dm9mZnNldCArPSA4OworCisgICAgICAgICAgICsreGQtPm1vZGVfaW5mb19jb250ZXh0OyAgLyogbmV4dCBtYiAqLworCisgICAgICAgICAgIHhkLT5hYm92ZV9jb250ZXh0Kys7CisgICAgICAgfQorCisgICAgICAgLyogYWRqdXN0IHRvIHRoZSBuZXh0IHJvdyBvZiBtYnMgKi8KKyAgICAgICBpZiAocGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQorICAgICAgIHsKKyAgICAgICAgICAgaWYobWJfcm93ICE9IHBjLT5tYl9yb3dzLTEpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBsYXN0eSA9IHl2MTJfZmJfbHN0LT55X3dpZHRoICsgVlA4Qk9SREVSSU5QSVhFTFM7CisgICAgICAgICAgICAgICBpbnQgbGFzdHV2ID0gKHl2MTJfZmJfbHN0LT55X3dpZHRoPj4xKSArIChWUDhCT1JERVJJTlBJWEVMUz4+MSk7CisKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcGJpLT5tdF95YWJvdmVfcm93W21iX3JvdyArMV1bbGFzdHkgKyBpXSA9IHBiaS0+bXRfeWFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R5IC0xXTsKKyAgICAgICAgICAgICAgICAgICBwYmktPm10X3VhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0dXYgKyBpXSA9IHBiaS0+bXRfdWFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R1diAtMV07CisgICAgICAgICAgICAgICAgICAgcGJpLT5tdF92YWJvdmVfcm93W21iX3JvdyArMV1bbGFzdHV2ICsgaV0gPSBwYmktPm10X3ZhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0dXYgLTFdOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgICAgdnA4X2V4dGVuZF9tYl9yb3coeXYxMl9mYl9uZXcsIHhkLT5kc3QueV9idWZmZXIgKyAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciArIDgsIHhkLT5kc3Qudl9idWZmZXIgKyA4KTsKKworICAgICAgIC8qIGxhc3QgTUIgb2Ygcm93IGlzIHJlYWR5IGp1c3QgYWZ0ZXIgZXh0ZW5zaW9uIGlzIGRvbmUgKi8KKyAgICAgICAqY3VycmVudF9tYl9jb2wgPSBtYl9jb2wgKyBuc3luYzsKKworICAgICAgICsreGQtPm1vZGVfaW5mb19jb250ZXh0OyAgICAgIC8qIHNraXAgcHJlZGljdGlvbiBjb2x1bW4gKi8KKyAgICAgICB4ZC0+dXBfYXZhaWxhYmxlID0gMTsKKworICAgICAgIC8qIHNpbmNlIHdlIGhhdmUgbXVsdGl0aHJlYWQgKi8KKyAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQgKz0geGQtPm1vZGVfaW5mb19zdHJpZGUgKiBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudDsKKyAgICB9CisKKyAgICAvKiBzaWduYWwgZW5kIG9mIGZyYW1lIGRlY29kaW5nIGlmIHRoaXMgdGhyZWFkIHByb2Nlc3NlZCB0aGUgbGFzdCBtYl9yb3cgKi8KKyAgICBpZiAobGFzdF9tYl9yb3cgPT0gKHBjLT5tYl9yb3dzIC0gMSkpCisgICAgICAgIHNlbV9wb3N0KCZwYmktPmhfZXZlbnRfZW5kX2RlY29kaW5nKTsKKworfQorCisKK3N0YXRpYyBUSFJFQURfRlVOQ1RJT04gdGhyZWFkX2RlY29kaW5nX3Byb2Modm9pZCAqcF9kYXRhKQoreworICAgIGludCBpdGhyZWFkID0gKChERUNPREVUSFJFQURfREFUQSAqKXBfZGF0YSktPml0aHJlYWQ7CisgICAgVlA4RF9DT01QICpwYmkgPSAoVlA4RF9DT01QICopKCgoREVDT0RFVEhSRUFEX0RBVEEgKilwX2RhdGEpLT5wdHIxKTsKKyAgICBNQl9ST1dfREVDICptYnJkID0gKE1CX1JPV19ERUMgKikoKChERUNPREVUSFJFQURfREFUQSAqKXBfZGF0YSktPnB0cjIpOworICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgbWJfcm93X2xlZnRfY29udGV4dDsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoc2VtX3dhaXQoJnBiaS0+aF9ldmVudF9zdGFydF9kZWNvZGluZ1tpdGhyZWFkXSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUFDUk9CTE9DS0QgKnhkID0gJm1icmQtPm1iZDsKKyAgICAgICAgICAgICAgICB4ZC0+bGVmdF9jb250ZXh0ID0gJm1iX3Jvd19sZWZ0X2NvbnRleHQ7CisKKyAgICAgICAgICAgICAgICBtdF9kZWNvZGVfbWJfcm93cyhwYmksIHhkLCBpdGhyZWFkKzEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDAgOworfQorCisKK3ZvaWQgdnA4X2RlY29kZXJfY3JlYXRlX3RocmVhZHMoVlA4RF9DT01QICpwYmkpCit7CisgICAgaW50IGNvcmVfY291bnQgPSAwOworICAgIHVuc2lnbmVkIGludCBpdGhyZWFkOworCisgICAgcGJpLT5iX211bHRpdGhyZWFkZWRfcmQgPSAwOworICAgIHBiaS0+YWxsb2NhdGVkX2RlY29kaW5nX3RocmVhZF9jb3VudCA9IDA7CisKKyAgICAvKiBsaW1pdCBkZWNvZGluZyB0aHJlYWRzIHRvIHRoZSBtYXggbnVtYmVyIG9mIHRva2VuIHBhcnRpdGlvbnMgKi8KKyAgICBjb3JlX2NvdW50ID0gKHBiaS0+bWF4X3RocmVhZHMgPiA4KSA/IDggOiBwYmktPm1heF90aHJlYWRzOworCisgICAgLyogbGltaXQgZGVjb2RpbmcgdGhyZWFkcyB0byB0aGUgYXZhaWxhYmxlIGNvcmVzICovCisgICAgaWYgKGNvcmVfY291bnQgPiBwYmktPmNvbW1vbi5wcm9jZXNzb3JfY29yZV9jb3VudCkKKyAgICAgICAgY29yZV9jb3VudCA9IHBiaS0+Y29tbW9uLnByb2Nlc3Nvcl9jb3JlX2NvdW50OworCisgICAgaWYgKGNvcmVfY291bnQgPiAxKQorICAgIHsKKyAgICAgICAgcGJpLT5iX211bHRpdGhyZWFkZWRfcmQgPSAxOworICAgICAgICBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCA9IGNvcmVfY291bnQgLSAxOworCisgICAgICAgIENBTExPQ19BUlJBWShwYmktPmhfZGVjb2RpbmdfdGhyZWFkLCBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCk7CisgICAgICAgIENBTExPQ19BUlJBWShwYmktPmhfZXZlbnRfc3RhcnRfZGVjb2RpbmcsIHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50KTsKKyAgICAgICAgQ0FMTE9DX0FSUkFZX0FMSUdORUQocGJpLT5tYl9yb3dfZGksIHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50LCAzMik7CisgICAgICAgIENBTExPQ19BUlJBWShwYmktPmRlX3RocmVhZF9kYXRhLCBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCk7CisKKyAgICAgICAgZm9yIChpdGhyZWFkID0gMDsgaXRocmVhZCA8IHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50OyBpdGhyZWFkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbV9pbml0KCZwYmktPmhfZXZlbnRfc3RhcnRfZGVjb2RpbmdbaXRocmVhZF0sIDAsIDApOworCisgICAgICAgICAgICB2cDhfc2V0dXBfYmxvY2tfZHB0cnMoJnBiaS0+bWJfcm93X2RpW2l0aHJlYWRdLm1iZCk7CisKKyAgICAgICAgICAgIHBiaS0+ZGVfdGhyZWFkX2RhdGFbaXRocmVhZF0uaXRocmVhZCAgPSBpdGhyZWFkOworICAgICAgICAgICAgcGJpLT5kZV90aHJlYWRfZGF0YVtpdGhyZWFkXS5wdHIxICAgICA9ICh2b2lkICopcGJpOworICAgICAgICAgICAgcGJpLT5kZV90aHJlYWRfZGF0YVtpdGhyZWFkXS5wdHIyICAgICA9ICh2b2lkICopICZwYmktPm1iX3Jvd19kaVtpdGhyZWFkXTsKKworICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnBiaS0+aF9kZWNvZGluZ190aHJlYWRbaXRocmVhZF0sIDAsIHRocmVhZF9kZWNvZGluZ19wcm9jLCAoJnBiaS0+ZGVfdGhyZWFkX2RhdGFbaXRocmVhZF0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbV9pbml0KCZwYmktPmhfZXZlbnRfZW5kX2RlY29kaW5nLCAwLCAwKTsKKworICAgICAgICBwYmktPmFsbG9jYXRlZF9kZWNvZGluZ190aHJlYWRfY291bnQgPSBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudDsKKyAgICB9Cit9CisKKwordm9pZCB2cDhtdF9kZV9hbGxvY190ZW1wX2J1ZmZlcnMoVlA4RF9DT01QICpwYmksIGludCBtYl9yb3dzKQoreworICAgIGludCBpOworCisgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkKQorICAgIHsKKyAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bXRfY3VycmVudF9tYl9jb2wpOworICAgICAgICAgICAgcGJpLT5tdF9jdXJyZW50X21iX2NvbCA9IE5VTEwgOworCisgICAgICAgIC8qIEZyZWUgYWJvdmVfcm93IGJ1ZmZlcnMuICovCisgICAgICAgIGlmIChwYmktPm10X3lhYm92ZV9yb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPCBtYl9yb3dzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bXRfeWFib3ZlX3Jvd1tpXSk7CisgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfeWFib3ZlX3Jvd1tpXSA9IE5VTEwgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5tdF95YWJvdmVfcm93KTsKKyAgICAgICAgICAgIHBiaS0+bXRfeWFib3ZlX3JvdyA9IE5VTEwgOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBiaS0+bXRfdWFib3ZlX3JvdykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8IG1iX3Jvd3M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5tdF91YWJvdmVfcm93W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgcGJpLT5tdF91YWJvdmVfcm93W2ldID0gTlVMTCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3VhYm92ZV9yb3cpOworICAgICAgICAgICAgcGJpLT5tdF91YWJvdmVfcm93ID0gTlVMTCA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGJpLT5tdF92YWJvdmVfcm93KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3ZhYm92ZV9yb3dbaV0pOworICAgICAgICAgICAgICAgICAgICBwYmktPm10X3ZhYm92ZV9yb3dbaV0gPSBOVUxMIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bXRfdmFib3ZlX3Jvdyk7CisgICAgICAgICAgICBwYmktPm10X3ZhYm92ZV9yb3cgPSBOVUxMIDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZyZWUgbGVmdF9jb2wgYnVmZmVycy4gKi8KKyAgICAgICAgaWYgKHBiaS0+bXRfeWxlZnRfY29sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3lsZWZ0X2NvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfeWxlZnRfY29sW2ldID0gTlVMTCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3lsZWZ0X2NvbCk7CisgICAgICAgICAgICBwYmktPm10X3lsZWZ0X2NvbCA9IE5VTEwgOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBiaS0+bXRfdWxlZnRfY29sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3VsZWZ0X2NvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdWxlZnRfY29sW2ldID0gTlVMTCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3VsZWZ0X2NvbCk7CisgICAgICAgICAgICBwYmktPm10X3VsZWZ0X2NvbCA9IE5VTEwgOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBiaS0+bXRfdmxlZnRfY29sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3ZsZWZ0X2NvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdmxlZnRfY29sW2ldID0gTlVMTCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3ZsZWZ0X2NvbCk7CisgICAgICAgICAgICBwYmktPm10X3ZsZWZ0X2NvbCA9IE5VTEwgOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgdnA4bXRfYWxsb2NfdGVtcF9idWZmZXJzKFZQOERfQ09NUCAqcGJpLCBpbnQgd2lkdGgsIGludCBwcmV2X21iX3Jvd3MpCit7CisgICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOworICAgIGludCBpOworICAgIGludCB1dl93aWR0aDsKKworICAgIGlmIChwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCkKKyAgICB7CisgICAgICAgIHZwOG10X2RlX2FsbG9jX3RlbXBfYnVmZmVycyhwYmksIHByZXZfbWJfcm93cyk7CisKKyAgICAgICAgLyogb3VyIGludGVybmFsIGJ1ZmZlcnMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgMTYgKi8KKyAgICAgICAgaWYgKCh3aWR0aCAmIDB4ZikgIT0gMCkKKyAgICAgICAgICAgIHdpZHRoICs9IDE2IC0gKHdpZHRoICYgMHhmKTsKKworICAgICAgICBpZiAod2lkdGggPCA2NDApIHBiaS0+c3luY19yYW5nZSA9IDE7CisgICAgICAgIGVsc2UgaWYgKHdpZHRoIDw9IDEyODApIHBiaS0+c3luY19yYW5nZSA9IDg7CisgICAgICAgIGVsc2UgaWYgKHdpZHRoIDw9IDI1NjApIHBiaS0+c3luY19yYW5nZSA9MTY7CisgICAgICAgIGVsc2UgcGJpLT5zeW5jX3JhbmdlID0gMzI7CisKKyAgICAgICAgdXZfd2lkdGggPSB3aWR0aCA+PjE7CisKKyAgICAgICAgLyogQWxsb2NhdGUgYW4gaW50IGZvciBlYWNoIG1iIHJvdy4gKi8KKyAgICAgICAgQ0FMTE9DX0FSUkFZKHBiaS0+bXRfY3VycmVudF9tYl9jb2wsIHBjLT5tYl9yb3dzKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFib3ZlX3JvdyBidWZmZXJzLiAqLworICAgICAgICBDQUxMT0NfQVJSQVkocGJpLT5tdF95YWJvdmVfcm93LCBwYy0+bWJfcm93cyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYy0+bWJfcm93czsgaSsrKQorICAgICAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKHBiaS0+bXRfeWFib3ZlX3Jvd1tpXSwgdnB4X21lbWFsaWduKDE2LHNpemVvZih1bnNpZ25lZCBjaGFyKSAqICh3aWR0aCArIChWUDhCT1JERVJJTlBJWEVMUzw8MSkpKSk7CisKKyAgICAgICAgQ0FMTE9DX0FSUkFZKHBiaS0+bXRfdWFib3ZlX3JvdywgcGMtPm1iX3Jvd3MpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGMtPm1iX3Jvd3M7IGkrKykKKyAgICAgICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3VhYm92ZV9yb3dbaV0sIHZweF9tZW1hbGlnbigxNixzaXplb2YodW5zaWduZWQgY2hhcikgKiAodXZfd2lkdGggKyBWUDhCT1JERVJJTlBJWEVMUykpKTsKKworICAgICAgICBDQUxMT0NfQVJSQVkocGJpLT5tdF92YWJvdmVfcm93LCBwYy0+bWJfcm93cyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYy0+bWJfcm93czsgaSsrKQorICAgICAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKHBiaS0+bXRfdmFib3ZlX3Jvd1tpXSwgdnB4X21lbWFsaWduKDE2LHNpemVvZih1bnNpZ25lZCBjaGFyKSAqICh1dl93aWR0aCArIFZQOEJPUkRFUklOUElYRUxTKSkpOworCisgICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgbGVmdF9jb2wgYnVmZmVycy4gKi8KKyAgICAgICAgQ0FMTE9DX0FSUkFZKHBiaS0+bXRfeWxlZnRfY29sLCBwYy0+bWJfcm93cyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYy0+bWJfcm93czsgaSsrKQorICAgICAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKHBiaS0+bXRfeWxlZnRfY29sW2ldLCB2cHhfY2FsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDE2LCAxKSk7CisKKyAgICAgICAgQ0FMTE9DX0FSUkFZKHBiaS0+bXRfdWxlZnRfY29sLCBwYy0+bWJfcm93cyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYy0+bWJfcm93czsgaSsrKQorICAgICAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKHBiaS0+bXRfdWxlZnRfY29sW2ldLCB2cHhfY2FsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDgsIDEpKTsKKworICAgICAgICBDQUxMT0NfQVJSQVkocGJpLT5tdF92bGVmdF9jb2wsIHBjLT5tYl9yb3dzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBjLT5tYl9yb3dzOyBpKyspCisgICAgICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5tdF92bGVmdF9jb2xbaV0sIHZweF9jYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogOCwgMSkpOworICAgIH0KK30KKworCit2b2lkIHZwOF9kZWNvZGVyX3JlbW92ZV90aHJlYWRzKFZQOERfQ09NUCAqcGJpKQoreworICAgIC8qIHNodXRkb3duIE1CIERlY29kaW5nIHRocmVhZDsgKi8KKyAgICBpZiAocGJpLT5iX211bHRpdGhyZWFkZWRfcmQpCisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCA9IDA7CisKKyAgICAgICAgLyogYWxsb3cgYWxsIHRocmVhZHMgdG8gZXhpdCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGJpLT5hbGxvY2F0ZWRfZGVjb2RpbmdfdGhyZWFkX2NvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbV9wb3N0KCZwYmktPmhfZXZlbnRfc3RhcnRfZGVjb2RpbmdbaV0pOworICAgICAgICAgICAgcHRocmVhZF9qb2luKHBiaS0+aF9kZWNvZGluZ190aHJlYWRbaV0sIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBiaS0+YWxsb2NhdGVkX2RlY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzZW1fZGVzdHJveSgmcGJpLT5oX2V2ZW50X3N0YXJ0X2RlY29kaW5nW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbV9kZXN0cm95KCZwYmktPmhfZXZlbnRfZW5kX2RlY29kaW5nKTsKKworICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5oX2RlY29kaW5nX3RocmVhZCk7CisgICAgICAgICAgICBwYmktPmhfZGVjb2RpbmdfdGhyZWFkID0gTlVMTDsKKworICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5oX2V2ZW50X3N0YXJ0X2RlY29kaW5nKTsKKyAgICAgICAgICAgIHBiaS0+aF9ldmVudF9zdGFydF9kZWNvZGluZyA9IE5VTEw7CisKKyAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bWJfcm93X2RpKTsKKyAgICAgICAgICAgIHBiaS0+bWJfcm93X2RpID0gTlVMTCA7CisKKyAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+ZGVfdGhyZWFkX2RhdGEpOworICAgICAgICAgICAgcGJpLT5kZV90aHJlYWRfZGF0YSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIHZwOG10X2RlY29kZV9tYl9yb3dzKCBWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKnhkKQoreworICAgIFZQOF9DT01NT04gKnBjID0gJnBiaS0+Y29tbW9uOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCBqOworCisgICAgaW50IGZpbHRlcl9sZXZlbCA9IHBjLT5maWx0ZXJfbGV2ZWw7CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICp5djEyX2ZiX25ldyA9IHBiaS0+ZGVjX2ZiX3JlZltJTlRSQV9GUkFNRV07CisKKyAgICBpZiAoZmlsdGVyX2xldmVsKQorICAgIHsKKyAgICAgICAgLyogU2V0IGFib3ZlX3JvdyBidWZmZXIgdG8gMTI3IGZvciBkZWNvZGluZyBmaXJzdCBNQiByb3cgKi8KKyAgICAgICAgdnB4X21lbXNldChwYmktPm10X3lhYm92ZV9yb3dbMF0gKyBWUDhCT1JERVJJTlBJWEVMUy0xLCAxMjcsIHl2MTJfZmJfbmV3LT55X3dpZHRoICsgNSk7CisgICAgICAgIHZweF9tZW1zZXQocGJpLT5tdF91YWJvdmVfcm93WzBdICsgKFZQOEJPUkRFUklOUElYRUxTPj4xKS0xLCAxMjcsICh5djEyX2ZiX25ldy0+eV93aWR0aD4+MSkgKzUpOworICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfdmFib3ZlX3Jvd1swXSArIChWUDhCT1JERVJJTlBJWEVMUz4+MSktMSwgMTI3LCAoeXYxMl9mYl9uZXctPnlfd2lkdGg+PjEpICs1KTsKKworICAgICAgICBmb3IgKGo9MTsgajxwYy0+bWJfcm93czsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfeWFib3ZlX3Jvd1tqXSArIFZQOEJPUkRFUklOUElYRUxTLTEsICh1bnNpZ25lZCBjaGFyKTEyOSwgMSk7CisgICAgICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfdWFib3ZlX3Jvd1tqXSArIChWUDhCT1JERVJJTlBJWEVMUz4+MSktMSwgKHVuc2lnbmVkIGNoYXIpMTI5LCAxKTsKKyAgICAgICAgICAgIHZweF9tZW1zZXQocGJpLT5tdF92YWJvdmVfcm93W2pdICsgKFZQOEJPUkRFUklOUElYRUxTPj4xKS0xLCAodW5zaWduZWQgY2hhcikxMjksIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IGxlZnRfY29sIHRvIDEyOSBpbml0aWFsbHkgKi8KKyAgICAgICAgZm9yIChqPTA7IGo8cGMtPm1iX3Jvd3M7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdnB4X21lbXNldChwYmktPm10X3lsZWZ0X2NvbFtqXSwgKHVuc2lnbmVkIGNoYXIpMTI5LCAxNik7CisgICAgICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfdWxlZnRfY29sW2pdLCAodW5zaWduZWQgY2hhcikxMjksIDgpOworICAgICAgICAgICAgdnB4X21lbXNldChwYmktPm10X3ZsZWZ0X2NvbFtqXSwgKHVuc2lnbmVkIGNoYXIpMTI5LCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvb3AgZmlsdGVyIGZvciB0aGlzIGZyYW1lLiAqLworICAgICAgICB2cDhfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdChwYywgJnBiaS0+bWIsIGZpbHRlcl9sZXZlbCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdnA4X3NldHVwX2ludHJhX3JlY29uX3RvcF9saW5lKHl2MTJfZmJfbmV3KTsKKworICAgIHNldHVwX2RlY29kaW5nX3RocmVhZF9kYXRhKHBiaSwgeGQsIHBiaS0+bWJfcm93X2RpLCBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQ7IGkrKykKKyAgICAgICAgc2VtX3Bvc3QoJnBiaS0+aF9ldmVudF9zdGFydF9kZWNvZGluZ1tpXSk7CisKKyAgICBtdF9kZWNvZGVfbWJfcm93cyhwYmksIHhkLCAwKTsKKworICAgIHNlbV93YWl0KCZwYmktPmhfZXZlbnRfZW5kX2RlY29kaW5nKTsgICAvKiBhZGQgYmFjayBmb3IgZWFjaCBmcmFtZSAqLworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9kZWNvZGVyL3RyZWVyZWFkZXIuaCBiL2xpYnZweC92cDgvZGVjb2Rlci90cmVlcmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZGVjb2Rlci90cmVlcmVhZGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgdHJlZV9yZWFkZXJfaAorI2RlZmluZSB0cmVlX3JlYWRlcl9oIDEKKworI2luY2x1ZGUgInZwOC9jb21tb24vdHJlZWNvZGVyLmgiCisKKyNpbmNsdWRlICJkYm9vbGh1ZmYuaCIKKwordHlwZWRlZiBCT09MX0RFQ09ERVIgdnA4X3JlYWRlcjsKKworI2RlZmluZSB2cDhfcmVhZCB2cDhkeF9kZWNvZGVfYm9vbAorI2RlZmluZSB2cDhfcmVhZF9saXRlcmFsIHZwOF9kZWNvZGVfdmFsdWUKKyNkZWZpbmUgdnA4X3JlYWRfYml0KCBSKSB2cDhfcmVhZCggUiwgdnA4X3Byb2JfaGFsZikKKworCisvKiBJbnRlbnQgb2YgdHJlZSBkYXRhIHN0cnVjdHVyZSBpcyB0byBtYWtlIGRlY29kaW5nIHRyaXZpYWwuICovCisKK3N0YXRpYyBpbnQgdnA4X3RyZWVkX3JlYWQoCisgICAgdnA4X3JlYWRlciAqY29uc3QgciwgICAgICAgIC8qICEhISBtdXN0IHJldHVybiBhIDAgb3IgMSAhISEgKi8KKyAgICB2cDhfdHJlZSB0LAorICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwCispCit7CisgICAgcmVnaXN0ZXIgdnA4X3RyZWVfaW5kZXggaSA9IDA7CisKKyAgICB3aGlsZSAoKGkgPSB0WyBpICsgdnA4X3JlYWQociwgcFtpPj4xXSldKSA+IDApIDsKKworICAgIHJldHVybiAtaTsKK30KKworI2VuZGlmIC8qIHRyZWVfcmVhZGVyX2ggKi8KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS9ib29saHVmZl9hcm12NXRlLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS9ib29saHVmZl9hcm12NXRlLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQ0YTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL2Jvb2xodWZmX2FybXY1dGUuYXNtCkBAIC0wLDAgKzEsMzEwIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUIHx2cDhfc3RhcnRfZW5jb2RlfAorICAgIEVYUE9SVCB8dnA4X2VuY29kZV9ib29sfAorICAgIEVYUE9SVCB8dnA4X3N0b3BfZW5jb2RlfAorICAgIEVYUE9SVCB8dnA4X2VuY29kZV92YWx1ZXwKKyAgICBJTVBPUlQgfHZwOF92YWxpZGF0ZV9idWZmZXJfYXJtfAorCisgICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWQorCisgICAgOyBtYWNybyBmb3IgdmFsaWRhdGluZyB3cml0ZSBidWZmZXIgcG9zaXRpb24KKyAgICA7IG5lZWRzIHZwOF93cml0ZXIgaW4gcjAKKyAgICA7IHN0YXJ0IHNoYWxsIG5vdCBiZSBpbiByMQorICAgIE1BQ1JPCisgICAgVkFMSURBVEVfUE9TICRzdGFydCwgJHBvcworICAgIHB1c2gge3IwLXIzLCByMTIsIGxyfSAgICAgICAgOyByZXN0IG9mIHJlZ3MgYXJlIHByZXNlcnZlZCBieSBzdWJyb3V0aW5lIGNhbGwKKyAgICBsZHIgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl9lbmRdCisgICAgbGRyICByMywgW3IwLCAjdnA4X3dyaXRlcl9lcnJvcl0KKyAgICBtb3YgIHIxLCAkcG9zCisgICAgbW92ICByMCwgJHN0YXJ0CisgICAgYmwgICB2cDhfdmFsaWRhdGVfYnVmZmVyX2FybQorICAgIHBvcCAge3IwLXIzLCByMTIsIGxyfQorICAgIE1FTkQKKworOyByMCBCT09MX0NPREVSICpicgorOyByMSB1bnNpZ25lZCBjaGFyICpzb3VyY2UKKzsgcjIgdW5zaWduZWQgY2hhciAqc291cmNlX2VuZAorfHZwOF9zdGFydF9lbmNvZGV8IFBST0MKKyAgICBzdHIgICAgIHIyLCAgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJfZW5kXQorICAgIG1vdiAgICAgcjEyLCAjMAorICAgIG1vdiAgICAgcjMsICAjMjU1CisgICAgbXZuICAgICByMiwgICMyMworICAgIHN0ciAgICAgcjEyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQorICAgIHN0ciAgICAgcjMsICBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQorICAgIHN0ciAgICAgcjIsICBbcjAsICN2cDhfd3JpdGVyX2NvdW50XQorICAgIHN0ciAgICAgcjEyLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBzdHIgICAgIHIxLCAgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgYnggICAgICBscgorICAgIEVORFAKKworOyByMCBCT09MX0NPREVSICpicgorOyByMSBpbnQgYml0Cis7IHIyIGludCBwcm9iYWJpbGl0eQorfHZwOF9lbmNvZGVfYm9vbHwgUFJPQworICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9CisKKyAgICBtb3YgICAgIHI0LCByMgorCisgICAgbGRyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KKyAgICBsZHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQorICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCisKKyAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKKworICAgIGNtcCAgICAgcjEsICMwCisgICAgbXVsICAgICByNiwgcjQsIHI3ICAgICAgICAgICAgICAgICAgOyAoKHJhbmdlLTEpICogcHJvYmFiaWxpdHkpCisKKyAgICBtb3YgICAgIHI3LCAjMQorICAgIGFkZCAgICAgcjQsIHI3LCByNiwgbHNyICM4ICAgICAgICAgIDsgMSArICgoKHJhbmdlLTEpICogcHJvYmFiaWxpdHkpID4+IDgpCisKKyAgICBhZGRuZSAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYml0KSBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1Ym5lICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiaXQpIHJhbmdlID0gcmFuZ2Utc3BsaXQKKworICAgIDsgQ291bnRpbmcgdGhlIGxlYWRpbmcgemVyb3MgaXMgdXNlZCB0byBub3JtYWxpemUgcmFuZ2UuCisgICAgY2x6ICAgICByNiwgcjQKKyAgICBzdWIgICAgIHI2LCByNiwgIzI0ICAgICAgICAgICAgICAgICA7IHNoaWZ0CisKKyAgICA7IEZsYWcgaXMgc2V0IG9uIHRoZSBzdW0gb2YgY291bnQuICBUaGlzIGZsYWcgaXMgdXNlZCBsYXRlcgorICAgIDsgdG8gZGV0ZXJtaW5lIGlmIGNvdW50ID49IDAKKyAgICBhZGRzICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IGNvdW50ICs9IHNoaWZ0CisgICAgbHNsICAgICByNSwgcjQsIHI2ICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gc2hpZnQKKyAgICBibWkgICAgIHRva2VuX2NvdW50X2x0X3plcm8gICAgICAgICA7IGlmKGNvdW50ID49IDApCisKKyAgICBzdWIgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IG9mZnNldCA9IHNoaWZ0IC0gY291bnQKKyAgICBzdWIgICAgIHI0LCByNiwgIzEgICAgICAgICAgICAgICAgICA7IG9mZnNldC0xCisgICAgbHNscyAgICByNCwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZigobG93dmFsdWU8PChvZmZzZXQtMSkpICYgMHg4MDAwMDAwMCApCisgICAgYnBsICAgICB0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0CisKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHgKKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHggPSB3LT5wb3MtMQorICAgIGIgICAgICAgdG9rZW5femVyb193aGlsZV9zdGFydAordG9rZW5femVyb193aGlsZV9sb29wCisgICAgbW92ICAgICByOSwgIzAKKyAgICBzdHJiICAgIHI5LCBbcjcsIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCit0b2tlbl96ZXJvX3doaWxlX3N0YXJ0CisgICAgY21wICAgICByNCwgIzAKKyAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxLCBbcjcsIHI0XQorICAgIGNtcGdlICAgcjEsICMweGZmCisgICAgYmVxICAgICB0b2tlbl96ZXJvX3doaWxlX2xvb3AKKworICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjksIFtyNywgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdCisgICAgYWRkICAgICByOSwgcjksICMxCisgICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCit0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0CisgICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKKyAgICBsZHIgICAgIHI5LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB3LT5wb3MKKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKKyAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKKyAgICBhZGQgICAgIHIxLCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAorCisgICAgVkFMSURBVEVfUE9TIHI5LCByMSAgICAgICAgICAgICAgICAgOyB2YWxpZGF0ZV9idWZmZXIgYXQgcG9zCisKKyAgICBzdHJiICAgIHI3LCBbcjksIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK10KKwordG9rZW5fY291bnRfbHRfemVybworICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IHNoaWZ0CisKKyAgICBzdHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQorICAgIHN0ciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCisgICAgc3RyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KKyAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQorICAgIEVORFAKKworOyByMCBCT09MX0NPREVSICpicgorfHZwOF9zdG9wX2VuY29kZXwgUFJPQworICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9CisKKyAgICBsZHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQorICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCisgICAgbGRyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KKworICAgIG1vdiAgICAgcjEwLCAjMzIKKworc3RvcF9lbmNvZGVfbG9vcAorICAgIHN1YiAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UtMQorCisgICAgbW92ICAgICByNCwgcjcsIGxzbCAjNyAgICAgICAgICAgICAgOyAoKHJhbmdlLTEpICogMTI4KQorCisgICAgbW92ICAgICByNywgIzEKKyAgICBhZGQgICAgIHI0LCByNywgcjQsIGxzciAjOCAgICAgICAgICA7IDEgKyAoKChyYW5nZS0xKSAqIDEyOCkgPj4gOCkKKworICAgIDsgQ291bnRpbmcgdGhlIGxlYWRpbmcgemVyb3MgaXMgdXNlZCB0byBub3JtYWxpemUgcmFuZ2UuCisgICAgY2x6ICAgICByNiwgcjQKKyAgICBzdWIgICAgIHI2LCByNiwgIzI0ICAgICAgICAgICAgICAgICA7IHNoaWZ0CisKKyAgICA7IEZsYWcgaXMgc2V0IG9uIHRoZSBzdW0gb2YgY291bnQuICBUaGlzIGZsYWcgaXMgdXNlZCBsYXRlcgorICAgIDsgdG8gZGV0ZXJtaW5lIGlmIGNvdW50ID49IDAKKyAgICBhZGRzICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IGNvdW50ICs9IHNoaWZ0CisgICAgbHNsICAgICByNSwgcjQsIHI2ICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gc2hpZnQKKyAgICBibWkgICAgIHRva2VuX2NvdW50X2x0X3plcm9fc2UgICAgICA7IGlmKGNvdW50ID49IDApCisKKyAgICBzdWIgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IG9mZnNldCA9IHNoaWZ0IC0gY291bnQKKyAgICBzdWIgICAgIHI0LCByNiwgIzEgICAgICAgICAgICAgICAgICA7IG9mZnNldC0xCisgICAgbHNscyAgICByNCwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZigobG93dmFsdWU8PChvZmZzZXQtMSkpICYgMHg4MDAwMDAwMCApCisgICAgYnBsICAgICB0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0X3NlCisKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHgKKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHggPSB3LT5wb3MtMQorICAgIGIgICAgICAgdG9rZW5femVyb193aGlsZV9zdGFydF9zZQordG9rZW5femVyb193aGlsZV9sb29wX3NlCisgICAgbW92ICAgICByOSwgIzAKKyAgICBzdHJiICAgIHI5LCBbcjcsIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCit0b2tlbl96ZXJvX3doaWxlX3N0YXJ0X3NlCisgICAgY21wICAgICByNCwgIzAKKyAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxLCBbcjcsIHI0XQorICAgIGNtcGdlICAgcjEsICMweGZmCisgICAgYmVxICAgICB0b2tlbl96ZXJvX3doaWxlX2xvb3Bfc2UKKworICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjksIFtyNywgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdCisgICAgYWRkICAgICByOSwgcjksICMxCisgICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCit0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0X3NlCisgICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKKyAgICBsZHIgICAgIHI5LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB3LT5wb3MKKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKKyAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKKyAgICBhZGQgICAgIHIxLCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAorCisgICAgVkFMSURBVEVfUE9TIHI5LCByMSAgICAgICAgICAgICAgICAgOyB2YWxpZGF0ZV9idWZmZXIgYXQgcG9zCisKKyAgICBzdHJiICAgIHI3LCBbcjksIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK10KKwordG9rZW5fY291bnRfbHRfemVyb19zZQorICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IHNoaWZ0CisKKyAgICBzdWJzICAgIHIxMCwgcjEwLCAjMQorICAgIGJuZSAgICAgc3RvcF9lbmNvZGVfbG9vcAorCisgICAgc3RyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KKyAgICBzdHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQorICAgIHN0ciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCisgICAgcG9wICAgICB7cjQtcjEwLCBwY30KKworICAgIEVORFAKKworOyByMCBCT09MX0NPREVSICpicgorOyByMSBpbnQgZGF0YQorOyByMiBpbnQgYml0cworfHZwOF9lbmNvZGVfdmFsdWV8IFBST0MKKyAgICBwdXNoICAgIHtyNC1yMTIsIGxyfQorCisgICAgbW92ICAgICByMTAsIHIyCisKKyAgICBsZHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQorICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCisgICAgbGRyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KKworICAgIHJzYiAgICAgcjQsIHIxMCwgIzMyICAgICAgICAgICAgICAgICA7IDMyLW4KKworICAgIDsgdiBpcyBrZXB0IGluIHIxIGR1cmluZyB0aGUgdG9rZW4gcGFjayBsb29wCisgICAgbHNsICAgICByMSwgcjEsIHI0ICAgICAgICAgICAgICAgICAgOyByMSA9IHYgPDwgMzIgLSBuCisKK2VuY29kZV92YWx1ZV9sb29wCisgICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCisKKyAgICA7IERlY2lzaW9ucyBhcmUgbWFkZSBiYXNlZCBvbiB0aGUgYml0IHZhbHVlIHNoaWZ0ZWQKKyAgICA7IG9mZiBvZiB2LCBzbyBzZXQgYSBmbGFnIGhlcmUgYmFzZWQgb24gdGhpcy4KKyAgICA7IFRoaXMgdmFsdWUgaXMgcmVmZXJlZCB0byBhcyAiYmIiCisgICAgbHNscyAgICByMSwgcjEsICMxICAgICAgICAgICAgICAgICAgOyBiaXQgPSB2ID4+IG4KKyAgICBtb3YgICAgIHI0LCByNywgbHNsICM3ICAgICAgICAgICAgICA7ICgocmFuZ2UtMSkgKiAxMjgpCisKKyAgICBtb3YgICAgIHI3LCAjMQorICAgIGFkZCAgICAgcjQsIHI3LCByNCwgbHNyICM4ICAgICAgICAgIDsgMSArICgoKHJhbmdlLTEpICogMTI4KSA+PiA4KQorCisgICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJpdCkgbG93dmFsdWUgKz0gc3BsaXQKKyAgICBzdWJjcyAgIHI0LCByNSwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYml0KSByYW5nZSA9IHJhbmdlLXNwbGl0CisKKyAgICA7IENvdW50aW5nIHRoZSBsZWFkaW5nIHplcm9zIGlzIHVzZWQgdG8gbm9ybWFsaXplIHJhbmdlLgorICAgIGNseiAgICAgcjYsIHI0CisgICAgc3ViICAgICByNiwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyBzaGlmdAorCisgICAgOyBGbGFnIGlzIHNldCBvbiB0aGUgc3VtIG9mIGNvdW50LiAgVGhpcyBmbGFnIGlzIHVzZWQgbGF0ZXIKKyAgICA7IHRvIGRldGVybWluZSBpZiBjb3VudCA+PSAwCisgICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAorICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0CisgICAgYm1pICAgICB0b2tlbl9jb3VudF9sdF96ZXJvX2V2ICAgICAgOyBpZihjb3VudCA+PSAwKQorCisgICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgPSBzaGlmdCAtIGNvdW50CisgICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQorICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQorICAgIGJwbCAgICAgdG9rZW5faGlnaF9iaXRfbm90X3NldF9ldgorCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4CisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zLTEKKyAgICBiICAgICAgIHRva2VuX3plcm9fd2hpbGVfc3RhcnRfZXYKK3Rva2VuX3plcm9fd2hpbGVfbG9vcF9ldgorICAgIG1vdiAgICAgcjksICMwCisgICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQordG9rZW5femVyb193aGlsZV9zdGFydF9ldgorICAgIGNtcCAgICAgcjQsICMwCisgICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbGRyYiAgICByMTEsIFtyNywgcjRdCisgICAgY21wZ2UgICByMTEsICMweGZmCisgICAgYmVxICAgICB0b2tlbl96ZXJvX3doaWxlX2xvb3BfZXYKKworICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjksIFtyNywgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdCisgICAgYWRkICAgICByOSwgcjksICMxCisgICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCit0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0X2V2CisgICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKKyAgICBsZHIgICAgIHI5LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB3LT5wb3MKKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKKyAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKKyAgICBhZGQgICAgIHIxMSwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjExLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBzdWIgICAgIHIzLCByMywgIzggICAgICAgICAgICAgICAgICA7IGNvdW50IC09IDgKKworICAgIFZBTElEQVRFX1BPUyByOSwgcjExICAgICAgICAgICAgICAgIDsgdmFsaWRhdGVfYnVmZmVyIGF0IHBvcworCisgICAgc3RyYiAgICByNywgW3I5LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdCisKK3Rva2VuX2NvdW50X2x0X3plcm9fZXYKKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBzaGlmdAorCisgICAgc3VicyAgICByMTAsIHIxMCwgIzEKKyAgICBibmUgICAgIGVuY29kZV92YWx1ZV9sb29wCisKKyAgICBzdHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQorICAgIHN0ciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCisgICAgc3RyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KKyAgICBwb3AgICAgIHtyNC1yMTIsIHBjfQorICAgIEVORFAKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX2FybXY1LmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19hcm12NS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjZDQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19hcm12NS5hc20KQEAgLTAsMCArMSwzMTcgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgfHZwOGN4X3BhY2tfdG9rZW5zX2FybXY1fAorICAgIElNUE9SVCB8dnA4X3ZhbGlkYXRlX2J1ZmZlcl9hcm18CisKKyAgICBJTkNMVURFIGFzbV9lbmNfb2Zmc2V0cy5hc20KKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCisKKworICAgIDsgbWFjcm8gZm9yIHZhbGlkYXRpbmcgd3JpdGUgYnVmZmVyIHBvc2l0aW9uCisgICAgOyBuZWVkcyB2cDhfd3JpdGVyIGluIHIwCisgICAgOyBzdGFydCBzaGFsbCBub3QgYmUgaW4gcjEKKyAgICBNQUNSTworICAgIFZBTElEQVRFX1BPUyAkc3RhcnQsICRwb3MKKyAgICBwdXNoIHtyMC1yMywgcjEyLCBscn0gICAgICAgIDsgcmVzdCBvZiByZWdzIGFyZSBwcmVzZXJ2ZWQgYnkgc3Vicm91dGluZSBjYWxsCisgICAgbGRyICByMiwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJfZW5kXQorICAgIGxkciAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfZXJyb3JdCisgICAgbW92ICByMSwgJHBvcworICAgIG1vdiAgcjAsICRzdGFydAorICAgIGJsICAgdnA4X3ZhbGlkYXRlX2J1ZmZlcl9hcm0KKyAgICBwb3AgIHtyMC1yMywgcjEyLCBscn0KKyAgICBNRU5ECisKKworOyByMCB2cDhfd3JpdGVyICp3Cis7IHIxIGNvbnN0IFRPS0VORVhUUkEgKnAKKzsgcjIgaW50IHhjb3VudAorOyByMyB2cDhfY29lZl9lbmNvZGluZ3MKKzsgczAgdnA4X2V4dHJhX2JpdHMKKzsgczEgdnA4X2NvZWZfdHJlZQorfHZwOGN4X3BhY2tfdG9rZW5zX2FybXY1fCBQUk9DCisgICAgcHVzaCAgICB7cjQtcjEyLCBscn0KKyAgICBzdWIgICAgIHNwLCBzcCwgIzE2CisKKyAgICA7IEFkZCBzaXplIG9mIHhjb3VudCAqIHNpemVvZiAoVE9LRU5FWFRSQSkgdG8gZ2V0IHN0b3AKKyAgICA7ICBzaXplb2YgKFRPS0VORVhUUkEpIGlzIDgKKyAgICBhZGQgICAgIHIyLCByMSwgcjIsIGxzbCAjMyAgICAgICAgICA7IHN0b3AgPSBwICsgeGNvdW50KnNpemVvZihUT0tFTkVYVFJBKQorICAgIHN0ciAgICAgcjIsIFtzcCwgIzBdCisgICAgc3RyICAgICByMywgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBzYXZlIHZwOF9jb2VmX2VuY29kaW5ncworICAgIGxkciAgICAgcjIsIFtyMCwgI3ZwOF93cml0ZXJfbG93dmFsdWVdCisgICAgbGRyICAgICByNSwgW3IwLCAjdnA4X3dyaXRlcl9yYW5nZV0KKyAgICBsZHIgICAgIHIzLCBbcjAsICN2cDhfd3JpdGVyX2NvdW50XQorICAgIGIgICAgICAgY2hlY2tfcF9sdF9zdG9wCisKK3doaWxlX3BfbHRfc3RvcAorICAgIGxkcmIgICAgcjYsIFtyMSwgI3Rva2VuZXh0cmFfdG9rZW5dIDsgdAorICAgIGxkciAgICAgcjQsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgdnA4X2NvZWZfZW5jb2RpbmdzCisgICAgbW92ICAgICBsciwgIzAKKyAgICBhZGQgICAgIHI0LCByNCwgcjYsIGxzbCAjMyAgICAgICAgICA7IGEgPSB2cDhfY29lZl9lbmNvZGluZ3MgKyB0CisgICAgbGRyICAgICByOSwgW3IxLCAjdG9rZW5leHRyYV9jb250ZXh0X3RyZWVdICAgOyBwcAorCisgICAgbGRyYiAgICByNywgW3IxLCAjdG9rZW5leHRyYV9za2lwX2VvYl9ub2RlXQorCisgICAgbGRyICAgICByNiwgW3I0LCAjdnA4X3Rva2VuX3ZhbHVlXSAgOyB2CisgICAgbGRyICAgICByOCwgW3I0LCAjdnA4X3Rva2VuX2xlbl0gICAgOyBuCisKKyAgICA7IHZwOCBzcGVjaWZpYyBza2lwX2VvYl9ub2RlCisgICAgY21wICAgICByNywgIzAKKyAgICBtb3ZuZSAgIGxyLCAjMiAgICAgICAgICAgICAgICAgICAgICA7IGkgPSAyCisgICAgc3VibmUgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KKworICAgIHJzYiAgICAgcjQsIHI4LCAjMzIgICAgICAgICAgICAgICAgIDsgMzItbgorICAgIGxkciAgICAgcjEwLCBbc3AsICM2MF0gICAgICAgICAgICAgIDsgdnA4X2NvZWZfdHJlZQorCisgICAgOyB2IGlzIGtlcHQgaW4gcjEyIGR1cmluZyB0aGUgdG9rZW4gcGFjayBsb29wCisgICAgbHNsICAgICByMTIsIHI2LCByNCAgICAgICAgICAgICAgICA7IHIxMiA9IHYgPDwgMzIgLSBuCisKKzsgbG9vcCBzdGFydAordG9rZW5fbG9vcAorICAgIGxkcmIgICAgcjQsIFtyOSwgbHIsIGFzciAjMV0gICAgICAgIDsgcHAgW2k+PjFdCisgICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCisKKyAgICA7IERlY2lzaW9ucyBhcmUgbWFkZSBiYXNlZCBvbiB0aGUgYml0IHZhbHVlIHNoaWZ0ZWQKKyAgICA7IG9mZiBvZiB2LCBzbyBzZXQgYSBmbGFnIGhlcmUgYmFzZWQgb24gdGhpcy4KKyAgICA7IFRoaXMgdmFsdWUgaXMgcmVmZXJlZCB0byBhcyAiYmIiCisgICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyBiYiA9IHYgPj4gbgorICAgIG11bCAgICAgcjYsIHI0LCByNyAgICAgICAgICAgICAgICAgIDsgKChyYW5nZS0xKSAqIHBwW2k+PjFdKSkKKworICAgIDsgYmIgY2FuIG9ubHkgYmUgMCBvciAxLiAgU28gb25seSBleGVjdXRlIHRoaXMgc3RhdGVtZW50CisgICAgOyBpZiBiYiA9PSAxLCBvdGhlcndpc2UgaXQgd2lsbCBhY3QgbGlrZSBpICsgMAorICAgIGFkZGNzICAgbHIsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgaSArIGJiCisKKyAgICBtb3YgICAgIHI3LCAjMQorICAgIGxkcnNiICAgbHIsIFtyMTAsIGxyXSAgICAgICAgICAgICAgIDsgaSA9IHZwOF9jb2VmX3RyZWVbaStiYl0KKyAgICBhZGQgICAgIHI0LCByNywgcjYsIGxzciAjOCAgICAgICAgICA7IDEgKyAoKChyYW5nZS0xKSAqIHBwW2k+PjFdKSA+PiA4KQorCisgICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1YmNzICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgcmFuZ2UgPSByYW5nZS1zcGxpdAorCisgICAgOyBDb3VudGluZyB0aGUgbGVhZGluZyB6ZXJvcyBpcyB1c2VkIHRvIG5vcm1hbGl6ZSByYW5nZS4KKyAgICBjbHogICAgIHI2LCByNAorICAgIHN1YiAgICAgcjYsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgc2hpZnQKKworICAgIDsgRmxhZyBpcyBzZXQgb24gdGhlIHN1bSBvZiBjb3VudC4gIFRoaXMgZmxhZyBpcyB1c2VkIGxhdGVyCisgICAgOyB0byBkZXRlcm1pbmUgaWYgY291bnQgPj0gMAorICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKKyAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAorICAgIGJtaSAgICAgdG9rZW5fY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKKworICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudAorICAgIHN1YiAgICAgcjQsIHI2LCAjMSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0LTEKKyAgICBsc2xzICAgIHI0LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmKChsb3d2YWx1ZTw8KG9mZnNldC0xKSkgJiAweDgwMDAwMDAwICkKKyAgICBicGwgICAgIHRva2VuX2hpZ2hfYml0X25vdF9zZXQKKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgeAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeCA9IHctPnBvcy0xCisgICAgYiAgICAgICB0b2tlbl96ZXJvX3doaWxlX3N0YXJ0Cit0b2tlbl96ZXJvX3doaWxlX2xvb3AKKyAgICBtb3YgICAgIHIxMCwgIzAKKyAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCit0b2tlbl96ZXJvX3doaWxlX3N0YXJ0CisgICAgY21wICAgICByNCwgIzAKKyAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMSwgW3I3LCByNF0KKyAgICBjbXBnZSAgIHIxMSwgIzB4ZmYKKyAgICBiZXEgICAgIHRva2VuX3plcm9fd2hpbGVfbG9vcAorCisgICAgbGRyICAgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbGRyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0KKyAgICBhZGQgICAgIHIxMCwgcjEwLCAjMQorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdICsgMQordG9rZW5faGlnaF9iaXRfbm90X3NldAorICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0CisgICAgbGRyICAgICByMTAsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxzciAgICAgcjcsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gKDI0LW9mZnNldCkKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHctPnBvcworICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAorICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAorICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKKyAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCisgICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAorCisgICAgVkFMSURBVEVfUE9TIHIxMCwgcjExICAgICAgICAgICAgICAgOyB2YWxpZGF0ZV9idWZmZXIgYXQgcG9zCisKKyAgICBzdHJiICAgIHI3LCBbcjEwLCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK10KKworICAgIDsgcjEwIGlzIHVzZWQgZWFybGllciBpbiB0aGUgbG9vcCwgYnV0IHIxMCBpcyB1c2VkIGFzCisgICAgOyB0ZW1wIHZhcmlhYmxlIGhlcmUuICBTbyBhZnRlciByMTAgaXMgdXNlZCwgcmVsb2FkCisgICAgOyB2cDhfY29lZl90cmVlX2RjZCBpbnRvIHIxMAorICAgIGxkciAgICAgcjEwLCBbc3AsICM2MF0gICAgICAgICAgICAgIDsgdnA4X2NvZWZfdHJlZQorCit0b2tlbl9jb3VudF9sdF96ZXJvCisgICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gc2hpZnQKKworICAgIHN1YnMgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgIDsgLS1uCisgICAgYm5lICAgICB0b2tlbl9sb29wCisKKyAgICBsZHJiICAgIHI2LCBbcjEsICN0b2tlbmV4dHJhX3Rva2VuXSA7IHQKKyAgICBsZHIgICAgIHI3LCBbc3AsICM1Nl0gICAgICAgICAgICAgICA7IHZwOF9leHRyYV9iaXRzCisgICAgOyBBZGQgdCAqIHNpemVvZiAodnA4X2V4dHJhX2JpdF9zdHJ1Y3QpIHRvIGdldCB0aGUgZGVzaXJlZAorICAgIDsgIGVsZW1lbnQuICBIZXJlIHZwOF9leHRyYV9iaXRfc3RydWN0ID09IDE2CisgICAgYWRkICAgICByMTIsIHI3LCByNiwgbHNsICM0ICAgICAgICAgOyBiID0gdnA4X2V4dHJhX2JpdHMgKyB0CisKKyAgICBsZHIgICAgIHI0LCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfYmFzZV92YWxdCisgICAgY21wICAgICByNCwgIzAKKyAgICBiZXEgICAgIHNraXBfZXh0cmFfYml0cworCis7ICAgaWYoIGItPmJhc2VfdmFsKQorICAgIGxkciAgICAgcjgsIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF9sZW5dIDsgTAorICAgIGxkcnNoICAgbHIsIFtyMSwgI3Rva2VuZXh0cmFfZXh0cmFdIDsgZSA9IHAtPkV4dHJhCisgICAgY21wICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgOyBpZiggTCkKKyAgICBiZXEgICAgIG5vX2V4dHJhX2JpdHMKKworICAgIGxkciAgICAgcjksIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF9wcm9iXQorICAgIGFzciAgICAgcjcsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgdj1lPj4xCisKKyAgICBsZHIgICAgIHIxMCwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X3RyZWVdCisgICAgc3RyICAgICByMTAsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBiLT50cmVlCisKKyAgICByc2IgICAgIHI0LCByOCwgIzMyCisgICAgbHNsICAgICByMTIsIHI3LCByNAorCisgICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgICAgICAgICAgOyBpID0gMAorCitleHRyYV9iaXRzX2xvb3AKKyAgICBsZHJiICAgIHI0LCBbcjksIGxyLCBhc3IgIzFdICAgICAgICAgICAgOyBwcFtpPj4xXQorICAgIHN1YiAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UtMQorICAgIGxzbHMgICAgcjEyLCByMTIsICMxICAgICAgICAgICAgICAgIDsgdiA+PiBuCisgICAgbXVsICAgICByNiwgcjQsIHI3ICAgICAgICAgICAgICAgICAgOyAocmFuZ2UtMSkgKiBwcFtpPj4xXQorICAgIGFkZGNzICAgbHIsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgaSArIGJiCisKKyAgICBtb3YgICAgIHI3LCAjMQorICAgIGxkcnNiICAgbHIsIFtyMTAsIGxyXSAgICAgICAgICAgICAgIDsgaSA9IGItPnRyZWVbaStiYl0KKyAgICBhZGQgICAgIHI0LCByNywgcjYsIGxzciAjOCAgICAgICAgICA7IHNwbGl0ID0gMSArICAoKChyYW5nZS0xKSAqIHBwW2k+PjFdKSA+PiA4KQorCisgICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1YmNzICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgcmFuZ2UgPSByYW5nZS1zcGxpdAorCisgICAgY2x6ICAgICByNiwgcjQKKyAgICBzdWIgICAgIHI2LCByNiwgIzI0CisKKyAgICBhZGRzICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IGNvdW50ICs9IHNoaWZ0CisgICAgbHNsICAgICByNSwgcjQsIHI2ICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gc2hpZnQKKyAgICBibWkgICAgIGV4dHJhX2NvdW50X2x0X3plcm8gICAgICAgICA7IGlmKGNvdW50ID49IDApCisKKyAgICBzdWIgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IG9mZnNldD0gc2hpZnQgLSBjb3VudAorICAgIHN1YiAgICAgcjQsIHI2LCAjMSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0LTEKKyAgICBsc2xzICAgIHI0LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmKChsb3d2YWx1ZTw8KG9mZnNldC0xKSkgJiAweDgwMDAwMDAwICkKKyAgICBicGwgICAgIGV4dHJhX2hpZ2hfYml0X25vdF9zZXQKKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgeAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeCA9IHctPnBvcyAtIDEKKyAgICBiICAgICAgIGV4dHJhX3plcm9fd2hpbGVfc3RhcnQKK2V4dHJhX3plcm9fd2hpbGVfbG9vcAorICAgIG1vdiAgICAgcjEwLCAjMAorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdID0odW5zaWduZWQgY2hhcikwCisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KK2V4dHJhX3plcm9fd2hpbGVfc3RhcnQKKyAgICBjbXAgICAgIHI0LCAjMAorICAgIGxkcmdlICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjExLCBbcjcsIHI0XQorICAgIGNtcGdlICAgcjExLCAjMHhmZgorICAgIGJlcSAgICAgZXh0cmFfemVyb193aGlsZV9sb29wCisKKyAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMCwgW3I3LCByNF0KKyAgICBhZGQgICAgIHIxMCwgcjEwLCAjMQorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XQorZXh0cmFfaGlnaF9iaXRfbm90X3NldAorICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0CisgICAgbGRyICAgICByMTAsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxzciAgICAgcjcsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gKDI0LW9mZnNldCkKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKKyAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKKyAgICBhZGQgICAgIHIxMSwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjExLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBzdWIgICAgIHIzLCByMywgIzggICAgICAgICAgICAgICAgICA7IGNvdW50IC09IDgKKworICAgIFZBTElEQVRFX1BPUyByMTAsIHIxMSAgICAgICAgICAgICAgIDsgdmFsaWRhdGVfYnVmZmVyIGF0IHBvcworCisgICAgc3RyYiAgICByNywgW3IxMCwgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdPShsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KSkKKyAgICBsZHIgICAgIHIxMCwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGItPnRyZWUKK2V4dHJhX2NvdW50X2x0X3plcm8KKyAgICBsc2wgICAgIHIyLCByMiwgcjYKKworICAgIHN1YnMgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgIDsgLS1uCisgICAgYm5lICAgICBleHRyYV9iaXRzX2xvb3AgICAgICAgICAgICAgOyB3aGlsZSAobikKKworbm9fZXh0cmFfYml0cworICAgIGxkciAgICAgbHIsIFtyMSwgIzRdICAgICAgICAgICAgICAgIDsgZSA9IHAtPkV4dHJhCisgICAgYWRkICAgICByNCwgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZSArIDEKKyAgICB0c3QgICAgIGxyLCAjMQorICAgIGxzciAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgc3BsaXQgPSAocmFuZ2UgKyAxKSA+PiAxCisgICAgYWRkbmUgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1Ym5lICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPSByYW5nZS1zcGxpdAorICAgIHRzdCAgICAgcjIsICMweDgwMDAwMDAwICAgICAgICAgICAgIDsgbG93dmFsdWUgJiAweDgwMDAwMDAwCisgICAgbHNsICAgICByNSwgcjQsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gMQorICAgIGJlcSAgICAgZW5kX2hpZ2hfYml0X25vdF9zZXQKKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIG1vdiAgICAgcjcsICMwCisgICAgc3ViICAgICByNCwgcjQsICMxCisgICAgYiAgICAgICBlbmRfemVyb193aGlsZV9zdGFydAorZW5kX3plcm9fd2hpbGVfbG9vcAorICAgIHN0cmIgICAgcjcsIFtyNiwgcjRdCisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KK2VuZF96ZXJvX3doaWxlX3N0YXJ0CisgICAgY21wICAgICByNCwgIzAKKyAgICBsZHJnZSAgIHI2LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMiwgW3I2LCByNF0KKyAgICBjbXBnZSAgIHIxMiwgIzB4ZmYKKyAgICBiZXEgICAgIGVuZF96ZXJvX3doaWxlX2xvb3AKKworICAgIGxkciAgICAgcjYsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjcsIFtyNiwgcjRdCisgICAgYWRkICAgICByNywgcjcsICMxCisgICAgc3RyYiAgICByNywgW3I2LCByNF0KK2VuZF9oaWdoX2JpdF9ub3Rfc2V0CisgICAgYWRkcyAgICByMywgcjMsICMxICAgICAgICAgICAgICAgICAgOyArK2NvdW50CisgICAgbHNsICAgICByMiwgcjIsICMxICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSAgPDw9IDEKKyAgICBibmUgICAgIGVuZF9jb3VudF96ZXJvCisKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBtdm4gICAgIHIzLCAjNworICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxzciAgICAgcjYsIHIyLCAjMjQgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gMjQKKyAgICBhZGQgICAgIHIxMiwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjEyLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKworICAgIFZBTElEQVRFX1BPUyByNywgcjEyICAgICAgICAgICAgICAgOyB2YWxpZGF0ZV9idWZmZXIgYXQgcG9zCisKKyAgICBzdHJiICAgIHI2LCBbcjcsIHI0XQorZW5kX2NvdW50X3plcm8KK3NraXBfZXh0cmFfYml0cworICAgIGFkZCAgICAgcjEsIHIxLCAjVE9LRU5FWFRSQV9TWiAgICAgIDsgKytwCitjaGVja19wX2x0X3N0b3AKKyAgICBsZHIgICAgIHI0LCBbc3AsICMwXSAgICAgICAgICAgICAgICA7IHN0b3AKKyAgICBjbXAgICAgIHIxLCByNCAgICAgICAgICAgICAgICAgICAgICA7IHdoaWxlKCBwIDwgc3RvcCkKKyAgICBiY2MgICAgIHdoaWxlX3BfbHRfc3RvcAorCisgICAgc3RyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KKyAgICBzdHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQorICAgIHN0ciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCisgICAgYWRkICAgICBzcCwgc3AsICMxNgorICAgIHBvcCAgICAge3I0LXIxMiwgcGN9CisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfbWJyb3dfYXJtdjUuYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX21icm93X2FybXY1LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE1ZTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX21icm93X2FybXY1LmFzbQpAQCAtMCwwICsxLDM1MiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCB8dnA4Y3hfcGFja19tYl9yb3dfdG9rZW5zX2FybXY1fAorICAgIElNUE9SVCB8dnA4X3ZhbGlkYXRlX2J1ZmZlcl9hcm18CisKKyAgICBJTkNMVURFIGFzbV9lbmNfb2Zmc2V0cy5hc20KKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCisKKworICAgIDsgbWFjcm8gZm9yIHZhbGlkYXRpbmcgd3JpdGUgYnVmZmVyIHBvc2l0aW9uCisgICAgOyBuZWVkcyB2cDhfd3JpdGVyIGluIHIwCisgICAgOyBzdGFydCBzaGFsbCBub3QgYmUgaW4gcjEKKyAgICBNQUNSTworICAgIFZBTElEQVRFX1BPUyAkc3RhcnQsICRwb3MKKyAgICBwdXNoIHtyMC1yMywgcjEyLCBscn0gICAgICAgIDsgcmVzdCBvZiByZWdzIGFyZSBwcmVzZXJ2ZWQgYnkgc3Vicm91dGluZSBjYWxsCisgICAgbGRyICByMiwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJfZW5kXQorICAgIGxkciAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfZXJyb3JdCisgICAgbW92ICByMSwgJHBvcworICAgIG1vdiAgcjAsICRzdGFydAorICAgIGJsICAgdnA4X3ZhbGlkYXRlX2J1ZmZlcl9hcm0KKyAgICBwb3AgIHtyMC1yMywgcjEyLCBscn0KKyAgICBNRU5ECisKKzsgcjAgVlA4X0NPTVAgKmNwaQorOyByMSB2cDhfd3JpdGVyICp3Cis7IHIyIHZwOF9jb2VmX2VuY29kaW5ncworOyByMyB2cDhfZXh0cmFfYml0cworOyBzMCB2cDhfY29lZl90cmVlCisKK3x2cDhjeF9wYWNrX21iX3Jvd190b2tlbnNfYXJtdjV8IFBST0MKKyAgICBwdXNoICAgIHtyNC1yMTIsIGxyfQorICAgIHN1YiAgICAgc3AsIHNwLCAjMjQKKworICAgIDsgQ29tcHV0ZSBhZGRyZXNzIG9mIGNwaS0+Y29tbW9uLm1iX3Jvd3MKKyAgICBsZHIgICAgIHI0LCBfVlA4X0NPTVBfY29tbW9uXworICAgIGxkciAgICAgcjYsIF9WUDhfQ09NTU9OX01Ccm93c18KKyAgICBhZGQgICAgIHI0LCByMCwgcjQKKworICAgIGxkciAgICAgcjUsIFtyNCwgcjZdICAgICAgICAgICAgICAgIDsgbG9hZCB1cCBtYl9yb3dzCisKKyAgICBzdHIgICAgIHIyLCBbc3AsICMyMF0gICAgICAgICAgICAgICA7IHNhdmUgdnA4X2NvZWZfZW5jb2RpbmdzCisgICAgc3RyICAgICByNSwgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBzYXZlIG1iX3Jvd3MKKyAgICBzdHIgICAgIHIzLCBbc3AsICM4XSAgICAgICAgICAgICAgICA7IHNhdmUgdnA4X2V4dHJhX2JpdHMKKworICAgIGxkciAgICAgcjQsIF9WUDhfQ09NUF90cGxpc3RfCisgICAgYWRkICAgICByNCwgcjAsIHI0CisgICAgbGRyICAgICByNywgW3I0LCAjMF0gICAgICAgICAgICAgICAgOyBkZXJlZmVyZW5jZSBjcGktPnRwX2xpc3QKKworICAgIG1vdiAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgICAgIDsga2VlcCBzYW1lIGFzIG90aGVyIGxvb3BzCisKKyAgICBsZHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQorICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCisgICAgbGRyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KKworbWJfcm93X2xvb3AKKworICAgIGxkciAgICAgcjEsIFtyNywgI3Rva2VubGlzdF9zdGFydF0KKyAgICBsZHIgICAgIHI5LCBbcjcsICN0b2tlbmxpc3Rfc3RvcF0KKyAgICBzdHIgICAgIHI5LCBbc3AsICMwXSAgICAgICAgICAgICAgICA7IHNhdmUgc3RvcCBmb3IgbGF0ZXIgY29tcGFyaXNvbgorICAgIHN0ciAgICAgcjcsIFtzcCwgIzE2XSAgICAgICAgICAgICAgIDsgdG9rZW5saXN0IGFkZHJlc3MgZm9yIG5leHQgdGltZQorCisgICAgYiAgICAgICBjaGVja19wX2x0X3N0b3AKKworICAgIDsgYWN0dWFsbCB3b3JrIGdldHMgZG9uZSBoZXJlIQorCit3aGlsZV9wX2x0X3N0b3AKKyAgICBsZHJiICAgIHI2LCBbcjEsICN0b2tlbmV4dHJhX3Rva2VuXSA7IHQKKyAgICBsZHIgICAgIHI0LCBbc3AsICMyMF0gICAgICAgICAgICAgICA7IHZwOF9jb2VmX2VuY29kaW5ncworICAgIG1vdiAgICAgbHIsICMwCisgICAgYWRkICAgICByNCwgcjQsIHI2LCBsc2wgIzMgICAgICAgICAgOyBhID0gdnA4X2NvZWZfZW5jb2RpbmdzICsgdAorICAgIGxkciAgICAgcjksIFtyMSwgI3Rva2VuZXh0cmFfY29udGV4dF90cmVlXSAgIDsgcHAKKworICAgIGxkcmIgICAgcjcsIFtyMSwgI3Rva2VuZXh0cmFfc2tpcF9lb2Jfbm9kZV0KKworICAgIGxkciAgICAgcjYsIFtyNCwgI3ZwOF90b2tlbl92YWx1ZV0gIDsgdgorICAgIGxkciAgICAgcjgsIFtyNCwgI3ZwOF90b2tlbl9sZW5dICAgIDsgbgorCisgICAgOyB2cDggc3BlY2lmaWMgc2tpcF9lb2Jfbm9kZQorICAgIGNtcCAgICAgcjcsICMwCisgICAgbW92bmUgICBsciwgIzIgICAgICAgICAgICAgICAgICAgICAgOyBpID0gMgorICAgIHN1Ym5lICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgIDsgLS1uCisKKyAgICByc2IgICAgIHI0LCByOCwgIzMyICAgICAgICAgICAgICAgICA7IDMyLW4KKyAgICBsZHIgICAgIHIxMCwgW3NwLCAjNjRdICAgICAgICAgICAgICA7IHZwOF9jb2VmX3RyZWUKKworICAgIDsgdiBpcyBrZXB0IGluIHIxMiBkdXJpbmcgdGhlIHRva2VuIHBhY2sgbG9vcAorICAgIGxzbCAgICAgcjEyLCByNiwgcjQgICAgICAgICAgICAgICAgIDsgcjEyID0gdiA8PCAzMiAtIG4KKworOyBsb29wIHN0YXJ0Cit0b2tlbl9sb29wCisgICAgbGRyYiAgICByNCwgW3I5LCBsciwgYXNyICMxXSAgICAgICAgOyBwcCBbaT4+MV0KKyAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKKworICAgIDsgRGVjaXNpb25zIGFyZSBtYWRlIGJhc2VkIG9uIHRoZSBiaXQgdmFsdWUgc2hpZnRlZAorICAgIDsgb2ZmIG9mIHYsIHNvIHNldCBhIGZsYWcgaGVyZSBiYXNlZCBvbiB0aGlzLgorICAgIDsgVGhpcyB2YWx1ZSBpcyByZWZlcmVkIHRvIGFzICJiYiIKKyAgICBsc2xzICAgIHIxMiwgcjEyLCAjMSAgICAgICAgICAgICAgICA7IGJiID0gdiA+PiBuCisgICAgbXVsICAgICByNiwgcjQsIHI3ICAgICAgICAgICAgICAgICAgOyAoKHJhbmdlLTEpICogcHBbaT4+MV0pKQorCisgICAgOyBiYiBjYW4gb25seSBiZSAwIG9yIDEuICBTbyBvbmx5IGV4ZWN1dGUgdGhpcyBzdGF0ZW1lbnQKKyAgICA7IGlmIGJiID09IDEsIG90aGVyd2lzZSBpdCB3aWxsIGFjdCBsaWtlIGkgKyAwCisgICAgYWRkY3MgICBsciwgbHIsICMxICAgICAgICAgICAgICAgICAgOyBpICsgYmIKKworICAgIG1vdiAgICAgcjcsICMxCisgICAgbGRyc2IgICBsciwgW3IxMCwgbHJdICAgICAgICAgICAgICAgOyBpID0gdnA4X2NvZWZfdHJlZVtpK2JiXQorICAgIGFkZCAgICAgcjQsIHI3LCByNiwgbHNyICM4ICAgICAgICAgIDsgMSArICgoKHJhbmdlLTEpICogcHBbaT4+MV0pID4+IDgpCisKKyAgICBhZGRjcyAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYmIpIGxvd3ZhbHVlICs9IHNwbGl0CisgICAgc3ViY3MgICByNCwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSByYW5nZSA9IHJhbmdlLXNwbGl0CisKKyAgICA7IENvdW50aW5nIHRoZSBsZWFkaW5nIHplcm9zIGlzIHVzZWQgdG8gbm9ybWFsaXplIHJhbmdlLgorICAgIGNseiAgICAgcjYsIHI0CisgICAgc3ViICAgICByNiwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyBzaGlmdAorCisgICAgOyBGbGFnIGlzIHNldCBvbiB0aGUgc3VtIG9mIGNvdW50LiAgVGhpcyBmbGFnIGlzIHVzZWQgbGF0ZXIKKyAgICA7IHRvIGRldGVybWluZSBpZiBjb3VudCA+PSAwCisgICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAorICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0CisgICAgYm1pICAgICB0b2tlbl9jb3VudF9sdF96ZXJvICAgICAgICAgOyBpZihjb3VudCA+PSAwKQorCisgICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgPSBzaGlmdCAtIGNvdW50CisgICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQorICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQorICAgIGJwbCAgICAgdG9rZW5faGlnaF9iaXRfbm90X3NldAorCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4CisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zLTEKKyAgICBiICAgICAgIHRva2VuX3plcm9fd2hpbGVfc3RhcnQKK3Rva2VuX3plcm9fd2hpbGVfbG9vcAorICAgIG1vdiAgICAgcjEwLCAjMAorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdID0odW5zaWduZWQgY2hhcikwCisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KK3Rva2VuX3plcm9fd2hpbGVfc3RhcnQKKyAgICBjbXAgICAgIHI0LCAjMAorICAgIGxkcmdlICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjExLCBbcjcsIHI0XQorICAgIGNtcGdlICAgcjExLCAjMHhmZgorICAgIGJlcSAgICAgdG9rZW5femVyb193aGlsZV9sb29wCisKKyAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XQorICAgIGFkZCAgICAgcjEwLCByMTAsICMxCisgICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCit0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0CisgICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKKyAgICBsZHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQorICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgdy0+cG9zCisgICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gb2Zmc2V0CisgICAgbW92ICAgICByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCA9IGNvdW50CisgICAgYWRkICAgICByMTEsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKworICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKKyAgICBzdHIgICAgIHIxMSwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCisgICAgc3ViICAgICByMywgcjMsICM4ICAgICAgICAgICAgICAgICAgOyBjb3VudCAtPSA4CisKKyAgICBWQUxJREFURV9QT1MgcjEwLCByMTEgICAgICAgICAgICAgICA7IHZhbGlkYXRlX2J1ZmZlciBhdCBwb3MKKworICAgIHN0cmIgICAgcjcsIFtyMTAsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3ctPnBvcysrXQorCisgICAgOyByMTAgaXMgdXNlZCBlYXJsaWVyIGluIHRoZSBsb29wLCBidXQgcjEwIGlzIHVzZWQgYXMKKyAgICA7IHRlbXAgdmFyaWFibGUgaGVyZS4gIFNvIGFmdGVyIHIxMCBpcyB1c2VkLCByZWxvYWQKKyAgICA7IHZwOF9jb2VmX3RyZWVfZGNkIGludG8gcjEwCisgICAgbGRyICAgICByMTAsIFtzcCwgIzY0XSAgICAgICAgICAgICAgOyB2cDhfY29lZl90cmVlCisKK3Rva2VuX2NvdW50X2x0X3plcm8KKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBzaGlmdAorCisgICAgc3VicyAgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KKyAgICBibmUgICAgIHRva2VuX2xvb3AKKworICAgIGxkcmIgICAgcjYsIFtyMSwgI3Rva2VuZXh0cmFfdG9rZW5dIDsgdAorICAgIGxkciAgICAgcjcsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgdnA4X2V4dHJhX2JpdHMKKyAgICA7IEFkZCB0ICogc2l6ZW9mICh2cDhfZXh0cmFfYml0X3N0cnVjdCkgdG8gZ2V0IHRoZSBkZXNpcmVkCisgICAgOyAgZWxlbWVudC4gIEhlcmUgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgPT0gMTYKKyAgICBhZGQgICAgIHIxMiwgcjcsIHI2LCBsc2wgIzQgICAgICAgICA7IGIgPSB2cDhfZXh0cmFfYml0cyArIHQKKworICAgIGxkciAgICAgcjQsIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF9iYXNlX3ZhbF0KKyAgICBjbXAgICAgIHI0LCAjMAorICAgIGJlcSAgICAgc2tpcF9leHRyYV9iaXRzCisKKzsgICBpZiggYi0+YmFzZV92YWwpCisgICAgbGRyICAgICByOCwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X2xlbl0gOyBMCisgICAgbGRyc2ggICBsciwgW3IxLCAjdG9rZW5leHRyYV9leHRyYV0gOyBlID0gcC0+RXh0cmEKKyAgICBjbXAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7IGlmKCBMKQorICAgIGJlcSAgICAgbm9fZXh0cmFfYml0cworCisgICAgbGRyICAgICByOSwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X3Byb2JdCisgICAgYXNyICAgICByNywgbHIsICMxICAgICAgICAgICAgICAgICAgOyB2PWU+PjEKKworICAgIGxkciAgICAgcjEwLCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfdHJlZV0KKyAgICBzdHIgICAgIHIxMCwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGItPnRyZWUKKworICAgIHJzYiAgICAgcjQsIHI4LCAjMzIKKyAgICBsc2wgICAgIHIxMiwgcjcsIHI0CisKKyAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgICAgICAgICA7IGkgPSAwCisKK2V4dHJhX2JpdHNfbG9vcAorICAgIGxkcmIgICAgcjQsIFtyOSwgbHIsIGFzciAjMV0gICAgICAgICAgICA7IHBwW2k+PjFdCisgICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCisgICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyB2ID4+IG4KKyAgICBtdWwgICAgIHI2LCByNCwgcjcgICAgICAgICAgICAgICAgICA7IChyYW5nZS0xKSAqIHBwW2k+PjFdCisgICAgYWRkY3MgICBsciwgbHIsICMxICAgICAgICAgICAgICAgICAgOyBpICsgYmIKKworICAgIG1vdiAgICAgcjcsICMxCisgICAgbGRyc2IgICBsciwgW3IxMCwgbHJdICAgICAgICAgICAgICAgOyBpID0gYi0+dHJlZVtpK2JiXQorICAgIGFkZCAgICAgcjQsIHI3LCByNiwgbHNyICM4ICAgICAgICAgIDsgc3BsaXQgPSAxICsgICgoKHJhbmdlLTEpICogcHBbaT4+MV0pID4+IDgpCisKKyAgICBhZGRjcyAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYmIpIGxvd3ZhbHVlICs9IHNwbGl0CisgICAgc3ViY3MgICByNCwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSByYW5nZSA9IHJhbmdlLXNwbGl0CisKKyAgICBjbHogICAgIHI2LCByNAorICAgIHN1YiAgICAgcjYsIHI2LCAjMjQKKworICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKKyAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAorICAgIGJtaSAgICAgZXh0cmFfY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKKworICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0PSBzaGlmdCAtIGNvdW50CisgICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQorICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQorICAgIGJwbCAgICAgZXh0cmFfaGlnaF9iaXRfbm90X3NldAorCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4CisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zIC0gMQorICAgIGIgICAgICAgZXh0cmFfemVyb193aGlsZV9zdGFydAorZXh0cmFfemVyb193aGlsZV9sb29wCisgICAgbW92ICAgICByMTAsICMwCisgICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQorZXh0cmFfemVyb193aGlsZV9zdGFydAorICAgIGNtcCAgICAgcjQsICMwCisgICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbGRyYiAgICByMTEsIFtyNywgcjRdCisgICAgY21wZ2UgICByMTEsICMweGZmCisgICAgYmVxICAgICBleHRyYV96ZXJvX3doaWxlX2xvb3AKKworICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjEwLCBbcjcsIHI0XQorICAgIGFkZCAgICAgcjEwLCByMTAsICMxCisgICAgc3RyYiAgICByMTAsIFtyNywgcjRdCitleHRyYV9oaWdoX2JpdF9ub3Rfc2V0CisgICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKKyAgICBsZHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQorICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAorICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAorICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKKyAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCisgICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAorCisgICAgVkFMSURBVEVfUE9TIHIxMCwgcjExICAgICAgICAgICAgICAgOyB2YWxpZGF0ZV9idWZmZXIgYXQgcG9zCisKKyAgICBzdHJiICAgIHI3LCBbcjEwLCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK109KGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpKQorICAgIGxkciAgICAgcjEwLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgYi0+dHJlZQorZXh0cmFfY291bnRfbHRfemVybworICAgIGxzbCAgICAgcjIsIHIyLCByNgorCisgICAgc3VicyAgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KKyAgICBibmUgICAgIGV4dHJhX2JpdHNfbG9vcCAgICAgICAgICAgICA7IHdoaWxlIChuKQorCitub19leHRyYV9iaXRzCisgICAgbGRyICAgICBsciwgW3IxLCAjNF0gICAgICAgICAgICAgICAgOyBlID0gcC0+RXh0cmEKKyAgICBhZGQgICAgIHI0LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlICsgMQorICAgIHRzdCAgICAgbHIsICMxCisgICAgbHNyICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyBzcGxpdCA9IChyYW5nZSArIDEpID4+IDEKKyAgICBhZGRuZSAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlICs9IHNwbGl0CisgICAgc3VibmUgICByNCwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyByYW5nZSA9IHJhbmdlLXNwbGl0CisgICAgdHN0ICAgICByMiwgIzB4ODAwMDAwMDAgICAgICAgICAgICAgOyBsb3d2YWx1ZSAmIDB4ODAwMDAwMDAKKyAgICBsc2wgICAgIHI1LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSAxCisgICAgYmVxICAgICBlbmRfaGlnaF9iaXRfbm90X3NldAorCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCisgICAgbW92ICAgICByNywgIzAKKyAgICBzdWIgICAgIHI0LCByNCwgIzEKKyAgICBiICAgICAgIGVuZF96ZXJvX3doaWxlX3N0YXJ0CitlbmRfemVyb193aGlsZV9sb29wCisgICAgc3RyYiAgICByNywgW3I2LCByNF0KKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQorZW5kX3plcm9fd2hpbGVfc3RhcnQKKyAgICBjbXAgICAgIHI0LCAjMAorICAgIGxkcmdlICAgcjYsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjEyLCBbcjYsIHI0XQorICAgIGNtcGdlICAgcjEyLCAjMHhmZgorICAgIGJlcSAgICAgZW5kX3plcm9fd2hpbGVfbG9vcAorCisgICAgbGRyICAgICByNiwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbGRyYiAgICByNywgW3I2LCByNF0KKyAgICBhZGQgICAgIHI3LCByNywgIzEKKyAgICBzdHJiICAgIHI3LCBbcjYsIHI0XQorZW5kX2hpZ2hfYml0X25vdF9zZXQKKyAgICBhZGRzICAgIHIzLCByMywgIzEgICAgICAgICAgICAgICAgICA7ICsrY291bnQKKyAgICBsc2wgICAgIHIyLCByMiwgIzEgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlICA8PD0gMQorICAgIGJuZSAgICAgZW5kX2NvdW50X3plcm8KKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIG12biAgICAgcjMsICM3CisgICAgbGRyICAgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbHNyICAgICByNiwgcjIsICMyNCAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAyNAorICAgIGFkZCAgICAgcjEyLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKKyAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCisgICAgc3RyICAgICByMTIsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorCisgICAgVkFMSURBVEVfUE9TIHI3LCByMTIgICAgICAgICAgICAgICA7IHZhbGlkYXRlX2J1ZmZlciBhdCBwb3MKKworICAgIHN0cmIgICAgcjYsIFtyNywgcjRdCitlbmRfY291bnRfemVybworc2tpcF9leHRyYV9iaXRzCisgICAgYWRkICAgICByMSwgcjEsICNUT0tFTkVYVFJBX1NaICAgICAgOyArK3AKK2NoZWNrX3BfbHRfc3RvcAorICAgIGxkciAgICAgcjQsIFtzcCwgIzBdICAgICAgICAgICAgICAgIDsgc3RvcAorICAgIGNtcCAgICAgcjEsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgd2hpbGUoIHAgPCBzdG9wKQorICAgIGJjYyAgICAgd2hpbGVfcF9sdF9zdG9wCisKKyAgICBsZHIgICAgIHI2LCBbc3AsICMxMl0gICAgICAgICAgICAgICA7IG1iX3Jvd3MKKyAgICBsZHIgICAgIHI3LCBbc3AsICMxNl0gICAgICAgICAgICAgICA7IHRva2VubGlzdCBhZGRyZXNzCisgICAgc3VicyAgICByNiwgcjYsICMxCisgICAgYWRkICAgICByNywgcjcsICNUT0tFTkxJU1RfU1ogICAgICAgOyBuZXh0IGVsZW1lbnQgaW4gdGhlIGFycmF5CisgICAgc3RyICAgICByNiwgW3NwLCAjMTJdCisgICAgYm5lICAgICBtYl9yb3dfbG9vcAorCisgICAgc3RyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KKyAgICBzdHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQorICAgIHN0ciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCisgICAgYWRkICAgICBzcCwgc3AsICMyNAorICAgIHBvcCAgICAge3I0LXIxMiwgcGN9CisgICAgRU5EUAorCitfVlA4X0NPTVBfY29tbW9uXworICAgIERDRCAgICAgdnA4X2NvbXBfY29tbW9uCitfVlA4X0NPTU1PTl9NQnJvd3NfCisgICAgRENEICAgICB2cDhfY29tbW9uX21iX3Jvd3MKK19WUDhfQ09NUF90cGxpc3RfCisgICAgRENEICAgICB2cDhfY29tcF90cGxpc3QKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX3BhcnRpdGlvbnNfYXJtdjUuYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX3BhcnRpdGlvbnNfYXJtdjUuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTk4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfcGFydGl0aW9uc19hcm12NS5hc20KQEAgLTAsMCArMSw0NzEgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgfHZwOGN4X3BhY2tfdG9rZW5zX2ludG9fcGFydGl0aW9uc19hcm12NXwKKyAgICBJTVBPUlQgfHZwOF92YWxpZGF0ZV9idWZmZXJfYXJtfAorCisgICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWQorCisgICAgOyBtYWNybyBmb3IgdmFsaWRhdGluZyB3cml0ZSBidWZmZXIgcG9zaXRpb24KKyAgICA7IG5lZWRzIHZwOF93cml0ZXIgaW4gcjAKKyAgICA7IHN0YXJ0IHNoYWxsIG5vdCBiZSBpbiByMQorICAgIE1BQ1JPCisgICAgVkFMSURBVEVfUE9TICRzdGFydCwgJHBvcworICAgIHB1c2gge3IwLXIzLCByMTIsIGxyfSAgICAgICAgOyByZXN0IG9mIHJlZ3MgYXJlIHByZXNlcnZlZCBieSBzdWJyb3V0aW5lIGNhbGwKKyAgICBsZHIgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl9lbmRdCisgICAgbGRyICByMywgW3IwLCAjdnA4X3dyaXRlcl9lcnJvcl0KKyAgICBtb3YgIHIxLCAkcG9zCisgICAgbW92ICByMCwgJHN0YXJ0CisgICAgYmwgICB2cDhfdmFsaWRhdGVfYnVmZmVyX2FybQorICAgIHBvcCAge3IwLXIzLCByMTIsIGxyfQorICAgIE1FTkQKKworOyByMCBWUDhfQ09NUCAqY3BpCis7IHIxIHVuc2lnbmVkIGNoYXIgKmN4X2RhdGEKKzsgcjIgY29uc3QgdW5zaWduZWQgY2hhciAqY3hfZGF0YV9lbmQKKzsgcjMgaW50IG51bV9wYXJ0Cis7IHMwIHZwOF9jb2VmX2VuY29kaW5ncworOyBzMSB2cDhfZXh0cmFfYml0cywKKzsgczIgY29uc3QgdnA4X3RyZWVfaW5kZXggKgorCit8dnA4Y3hfcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2FybXY1fCBQUk9DCisgICAgcHVzaCAgICB7cjQtcjEyLCBscn0KKyAgICBzdWIgICAgIHNwLCBzcCwgIzQwCisKKyAgICA7IENvbXB1dGUgYWRkcmVzcyBvZiBjcGktPmNvbW1vbi5tYl9yb3dzCisgICAgbGRyICAgICByNCwgX1ZQOF9DT01QX2NvbW1vbl8KKyAgICBsZHIgICAgIHI2LCBfVlA4X0NPTU1PTl9NQnJvd3NfCisgICAgYWRkICAgICByNCwgcjAsIHI0CisKKyAgICBsZHIgICAgIHI1LCBbcjQsIHI2XSAgICAgICAgICAgICAgICA7IGxvYWQgdXAgbWJfcm93cworCisgICAgc3RyICAgICByNSwgW3NwLCAjMzZdICAgICAgICAgICAgICAgOyBzYXZlIG1iX3Jvd3MKKyAgICBzdHIgICAgIHIxLCBbc3AsICMyNF0gICAgICAgICAgICAgICA7IHNhdmUgcHRyID0gY3hfZGF0YQorICAgIHN0ciAgICAgcjMsIFtzcCwgIzIwXSAgICAgICAgICAgICAgIDsgc2F2ZSBudW1fcGFydAorICAgIHN0ciAgICAgcjIsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgc2F2ZSBjeF9kYXRhX2VuZAorCisgICAgbGRyICAgICByNCwgX1ZQOF9DT01QX3RwbGlzdF8KKyAgICBhZGQgICAgIHI0LCByMCwgcjQKKyAgICBsZHIgICAgIHI3LCBbcjQsICMwXSAgICAgICAgICAgICAgICA7IGRlcmVmZXJlbmNlIGNwaS0+dHBfbGlzdAorICAgIHN0ciAgICAgcjcsIFtzcCwgIzMyXSAgICAgICAgICAgICAgIDsgc3RvcmUgc3RhcnQgb2YgY3BpLT50cF9saXN0CisKKyAgICBsZHIgICAgIHIxMSwgX1ZQOF9DT01QX2JjXyAgICAgICAgICA7IGxvYWQgdXAgdnA4X3dyaXRlciBvdXQgb2YgY3BpCisgICAgYWRkICAgICByMCwgcjAsIHIxMQorCisgICAgbW92ICAgICByMTEsICMwCisgICAgc3RyICAgICByMTEsIFtzcCwgIzI4XSAgICAgICAgICAgICAgOyBpCisKK251bXBhcnRzX2xvb3AKKyAgICBsZHIgICAgIHIyLCBfdnA4X3dyaXRlcl9zel8gICAgICAgICA7IGxvYWQgdXAgc2l6ZW9mKHZwOF93cml0ZXIpCisgICAgYWRkICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBiY1tpICsgMV0KKworICAgIGxkciAgICAgcjEwLCBbc3AsICMyNF0gICAgICAgICAgICAgIDsgcHRyCisgICAgbGRyICAgICByNSwgIFtzcCwgIzM2XSAgICAgICAgICAgICAgOyBtb3ZlIG1iX3Jvd3MgdG8gdGhlIGNvdW50aW5nIHNlY3Rpb24KKyAgICBzdWJzICAgIHI1LCByNSwgcjExICAgICAgICAgICAgICAgICA7IG1vdmUgc3RhcnQgcG9pbnQgd2l0aCBlYWNoIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbWJfcm93cyBzdGFydHMgYXQgaQorICAgIHN0ciAgICAgcjUsICBbc3AsICMxMl0KKworICAgIDsgUmVzZXQgYWxsIG9mIHRoZSBWUDggV3JpdGVyIGRhdGEgZm9yIGVhY2ggcGFydGl0aW9uIHRoYXQKKyAgICA7IGlzIHByb2Nlc3NlZC4KKyAgICA7IHN0YXJ0X2VuY29kZQorCisgICAgbGRyICAgICByMywgW3NwLCAjOF0KKyAgICBzdHIgICAgIHIzLCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl9lbmRdCisKKyAgICBtb3YgICAgIHIyLCAjMCAgICAgICAgICAgICAgICAgICAgICA7IHZwOF93cml0ZXJfbG93dmFsdWUKKyAgICBtb3YgICAgIHI1LCAjMjU1ICAgICAgICAgICAgICAgICAgICA7IHZwOF93cml0ZXJfcmFuZ2UKKyAgICBtdm4gICAgIHIzLCAjMjMgICAgICAgICAgICAgICAgICAgICA7IHZwOF93cml0ZXJfY291bnQKKworICAgIHN0ciAgICAgcjIsICBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBzdHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisKKyAgICBibGUgICAgIGVuZF9wYXJ0aXRpb24gICAgICAgICAgICAgICA7IGlmIChtYl9yb3dzIDw9IDApIGVuZCBwYXJ0aXRpb24KKworbWJfcm93X2xvb3AKKworICAgIGxkciAgICAgcjEsIFtyNywgI3Rva2VubGlzdF9zdGFydF0KKyAgICBsZHIgICAgIHI5LCBbcjcsICN0b2tlbmxpc3Rfc3RvcF0KKyAgICBzdHIgICAgIHI5LCBbc3AsICMwXSAgICAgICAgICAgICAgICA7IHNhdmUgc3RvcCBmb3IgbGF0ZXIgY29tcGFyaXNvbgorICAgIHN0ciAgICAgcjcsIFtzcCwgIzE2XSAgICAgICAgICAgICAgIDsgdG9rZW5saXN0IGFkZHJlc3MgZm9yIG5leHQgdGltZQorCisgICAgYiAgICAgICBjaGVja19wX2x0X3N0b3AKKworICAgIDsgYWN0dWFsIHdvcmsgZ2V0cyBkb25lIGhlcmUhCisKK3doaWxlX3BfbHRfc3RvcAorICAgIGxkcmIgICAgcjYsIFtyMSwgI3Rva2VuZXh0cmFfdG9rZW5dIDsgdAorICAgIGxkciAgICAgcjQsIFtzcCwgIzgwXSAgICAgICAgICAgICAgIDsgdnA4X2NvZWZfZW5jb2RpbmdzCisgICAgbW92ICAgICBsciwgIzAKKyAgICBhZGQgICAgIHI0LCByNCwgcjYsIGxzbCAjMyAgICAgICAgICA7IGEgPSB2cDhfY29lZl9lbmNvZGluZ3MgKyB0CisgICAgbGRyICAgICByOSwgW3IxLCAjdG9rZW5leHRyYV9jb250ZXh0X3RyZWVdICAgOyBwcAorCisgICAgbGRyYiAgICByNywgW3IxLCAjdG9rZW5leHRyYV9za2lwX2VvYl9ub2RlXQorCisgICAgbGRyICAgICByNiwgW3I0LCAjdnA4X3Rva2VuX3ZhbHVlXSAgOyB2CisgICAgbGRyICAgICByOCwgW3I0LCAjdnA4X3Rva2VuX2xlbl0gICAgOyBuCisKKyAgICA7IHZwOCBzcGVjaWZpYyBza2lwX2VvYl9ub2RlCisgICAgY21wICAgICByNywgIzAKKyAgICBtb3ZuZSAgIGxyLCAjMiAgICAgICAgICAgICAgICAgICAgICA7IGkgPSAyCisgICAgc3VibmUgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KKworICAgIHJzYiAgICAgcjQsIHI4LCAjMzIgICAgICAgICAgICAgICAgIDsgMzItbgorICAgIGxkciAgICAgcjEwLCBbc3AsICM4OF0gICAgICAgICAgICAgIDsgdnA4X2NvZWZfdHJlZQorCisgICAgOyB2IGlzIGtlcHQgaW4gcjEyIGR1cmluZyB0aGUgdG9rZW4gcGFjayBsb29wCisgICAgbHNsICAgICByMTIsIHI2LCByNCAgICAgICAgICAgICAgICA7IHIxMiA9IHYgPDwgMzIgLSBuCisKKzsgbG9vcCBzdGFydAordG9rZW5fbG9vcAorICAgIGxkcmIgICAgcjQsIFtyOSwgbHIsIGFzciAjMV0gICAgICAgIDsgcHAgW2k+PjFdCisgICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCisKKyAgICA7IERlY2lzaW9ucyBhcmUgbWFkZSBiYXNlZCBvbiB0aGUgYml0IHZhbHVlIHNoaWZ0ZWQKKyAgICA7IG9mZiBvZiB2LCBzbyBzZXQgYSBmbGFnIGhlcmUgYmFzZWQgb24gdGhpcy4KKyAgICA7IFRoaXMgdmFsdWUgaXMgcmVmZXJlZCB0byBhcyAiYmIiCisgICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyBiYiA9IHYgPj4gbgorICAgIG11bCAgICAgcjYsIHI0LCByNyAgICAgICAgICAgICAgICAgIDsgKChyYW5nZS0xKSAqIHBwW2k+PjFdKSkKKworICAgIDsgYmIgY2FuIG9ubHkgYmUgMCBvciAxLiAgU28gb25seSBleGVjdXRlIHRoaXMgc3RhdGVtZW50CisgICAgOyBpZiBiYiA9PSAxLCBvdGhlcndpc2UgaXQgd2lsbCBhY3QgbGlrZSBpICsgMAorICAgIGFkZGNzICAgbHIsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgaSArIGJiCisKKyAgICBtb3YgICAgIHI3LCAjMQorICAgIGxkcnNiICAgbHIsIFtyMTAsIGxyXSAgICAgICAgICAgICAgIDsgaSA9IHZwOF9jb2VmX3RyZWVbaStiYl0KKyAgICBhZGQgICAgIHI0LCByNywgcjYsIGxzciAjOCAgICAgICAgICA7IDEgKyAoKChyYW5nZS0xKSAqIHBwW2k+PjFdKSA+PiA4KQorCisgICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1YmNzICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgcmFuZ2UgPSByYW5nZS1zcGxpdAorCisgICAgOyBDb3VudGluZyB0aGUgbGVhZGluZyB6ZXJvcyBpcyB1c2VkIHRvIG5vcm1hbGl6ZSByYW5nZS4KKyAgICBjbHogICAgIHI2LCByNAorICAgIHN1YiAgICAgcjYsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgc2hpZnQKKworICAgIDsgRmxhZyBpcyBzZXQgb24gdGhlIHN1bSBvZiBjb3VudC4gIFRoaXMgZmxhZyBpcyB1c2VkIGxhdGVyCisgICAgOyB0byBkZXRlcm1pbmUgaWYgY291bnQgPj0gMAorICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKKyAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAorICAgIGJtaSAgICAgdG9rZW5fY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKKworICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudAorICAgIHN1YiAgICAgcjQsIHI2LCAjMSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0LTEKKyAgICBsc2xzICAgIHI0LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmKChsb3d2YWx1ZTw8KG9mZnNldC0xKSkgJiAweDgwMDAwMDAwICkKKyAgICBicGwgICAgIHRva2VuX2hpZ2hfYml0X25vdF9zZXQKKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgeAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeCA9IHctPnBvcy0xCisgICAgYiAgICAgICB0b2tlbl96ZXJvX3doaWxlX3N0YXJ0Cit0b2tlbl96ZXJvX3doaWxlX2xvb3AKKyAgICBtb3YgICAgIHIxMCwgIzAKKyAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCit0b2tlbl96ZXJvX3doaWxlX3N0YXJ0CisgICAgY21wICAgICByNCwgIzAKKyAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMSwgW3I3LCByNF0KKyAgICBjbXBnZSAgIHIxMSwgIzB4ZmYKKyAgICBiZXEgICAgIHRva2VuX3plcm9fd2hpbGVfbG9vcAorCisgICAgbGRyICAgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbGRyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0KKyAgICBhZGQgICAgIHIxMCwgcjEwLCAjMQorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdICsgMQordG9rZW5faGlnaF9iaXRfbm90X3NldAorICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0CisgICAgbGRyICAgICByMTAsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxzciAgICAgcjcsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gKDI0LW9mZnNldCkKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHctPnBvcworICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAorICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAorICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKKyAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCisgICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAorCisgICAgVkFMSURBVEVfUE9TIHIxMCwgcjExICAgICAgICAgICAgICAgOyB2YWxpZGF0ZV9idWZmZXIgYXQgcG9zCisKKyAgICBzdHJiICAgIHI3LCBbcjEwLCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK10KKworICAgIDsgcjEwIGlzIHVzZWQgZWFybGllciBpbiB0aGUgbG9vcCwgYnV0IHIxMCBpcyB1c2VkIGFzCisgICAgOyB0ZW1wIHZhcmlhYmxlIGhlcmUuICBTbyBhZnRlciByMTAgaXMgdXNlZCwgcmVsb2FkCisgICAgOyB2cDhfY29lZl90cmVlX2RjZCBpbnRvIHIxMAorICAgIGxkciAgICAgcjEwLCBbc3AsICM4OF0gICAgICAgICAgICAgIDsgdnA4X2NvZWZfdHJlZQorCit0b2tlbl9jb3VudF9sdF96ZXJvCisgICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gc2hpZnQKKworICAgIHN1YnMgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgIDsgLS1uCisgICAgYm5lICAgICB0b2tlbl9sb29wCisKKyAgICBsZHJiICAgIHI2LCBbcjEsICN0b2tlbmV4dHJhX3Rva2VuXSA7IHQKKyAgICBsZHIgICAgIHI3LCBbc3AsICM4NF0gICAgICAgICAgICAgICAgOyB2cDhfZXh0cmFfYml0cworICAgIDsgQWRkIHQgKiBzaXplb2YgKHZwOF9leHRyYV9iaXRfc3RydWN0KSB0byBnZXQgdGhlIGRlc2lyZWQKKyAgICA7ICBlbGVtZW50LiAgSGVyZSB2cDhfZXh0cmFfYml0X3N0cnVjdCA9PSAxNgorICAgIGFkZCAgICAgcjEyLCByNywgcjYsIGxzbCAjNCAgICAgICAgIDsgYiA9IHZwOF9leHRyYV9iaXRzICsgdAorCisgICAgbGRyICAgICByNCwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X2Jhc2VfdmFsXQorICAgIGNtcCAgICAgcjQsICMwCisgICAgYmVxICAgICBza2lwX2V4dHJhX2JpdHMKKworOyAgIGlmKCBiLT5iYXNlX3ZhbCkKKyAgICBsZHIgICAgIHI4LCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfbGVuXSA7IEwKKyAgICBsZHJzaCAgIGxyLCBbcjEsICN0b2tlbmV4dHJhX2V4dHJhXSA7IGUgPSBwLT5FeHRyYQorICAgIGNtcCAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgIDsgaWYoIEwpCisgICAgYmVxICAgICBub19leHRyYV9iaXRzCisKKyAgICBsZHIgICAgIHI5LCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfcHJvYl0KKyAgICBhc3IgICAgIHI3LCBsciwgIzEgICAgICAgICAgICAgICAgICA7IHY9ZT4+MQorCisgICAgbGRyICAgICByMTAsIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF90cmVlXQorICAgIHN0ciAgICAgcjEwLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgYi0+dHJlZQorCisgICAgcnNiICAgICByNCwgcjgsICMzMgorICAgIGxzbCAgICAgcjEyLCByNywgcjQKKworICAgIG1vdiAgICAgbHIsICMwICAgICAgICAgICAgICAgICAgICAgIDsgaSA9IDAKKworZXh0cmFfYml0c19sb29wCisgICAgbGRyYiAgICByNCwgW3I5LCBsciwgYXNyICMxXSAgICAgICAgOyBwcFtpPj4xXQorICAgIHN1YiAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UtMQorICAgIGxzbHMgICAgcjEyLCByMTIsICMxICAgICAgICAgICAgICAgIDsgdiA+PiBuCisgICAgbXVsICAgICByNiwgcjQsIHI3ICAgICAgICAgICAgICAgICAgOyAocmFuZ2UtMSkgKiBwcFtpPj4xXQorICAgIGFkZGNzICAgbHIsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgaSArIGJiCisKKyAgICBtb3YgICAgIHI3LCAjMQorICAgIGxkcnNiICAgbHIsIFtyMTAsIGxyXSAgICAgICAgICAgICAgIDsgaSA9IGItPnRyZWVbaStiYl0KKyAgICBhZGQgICAgIHI0LCByNywgcjYsIGxzciAjOCAgICAgICAgICA7IHNwbGl0ID0gMSArICAoKChyYW5nZS0xKSAqIHBwW2k+PjFdKSA+PiA4KQorCisgICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1YmNzICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgcmFuZ2UgPSByYW5nZS1zcGxpdAorCisgICAgY2x6ICAgICByNiwgcjQKKyAgICBzdWIgICAgIHI2LCByNiwgIzI0CisKKyAgICBhZGRzICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IGNvdW50ICs9IHNoaWZ0CisgICAgbHNsICAgICByNSwgcjQsIHI2ICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gc2hpZnQKKyAgICBibWkgICAgIGV4dHJhX2NvdW50X2x0X3plcm8gICAgICAgICA7IGlmKGNvdW50ID49IDApCisKKyAgICBzdWIgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IG9mZnNldD0gc2hpZnQgLSBjb3VudAorICAgIHN1YiAgICAgcjQsIHI2LCAjMSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0LTEKKyAgICBsc2xzICAgIHI0LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmKChsb3d2YWx1ZTw8KG9mZnNldC0xKSkgJiAweDgwMDAwMDAwICkKKyAgICBicGwgICAgIGV4dHJhX2hpZ2hfYml0X25vdF9zZXQKKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgeAorICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeCA9IHctPnBvcyAtIDEKKyAgICBiICAgICAgIGV4dHJhX3plcm9fd2hpbGVfc3RhcnQKK2V4dHJhX3plcm9fd2hpbGVfbG9vcAorICAgIG1vdiAgICAgcjEwLCAjMAorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdID0odW5zaWduZWQgY2hhcikwCisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KK2V4dHJhX3plcm9fd2hpbGVfc3RhcnQKKyAgICBjbXAgICAgIHI0LCAjMAorICAgIGxkcmdlICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjExLCBbcjcsIHI0XQorICAgIGNtcGdlICAgcjExLCAjMHhmZgorICAgIGJlcSAgICAgZXh0cmFfemVyb193aGlsZV9sb29wCisKKyAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMCwgW3I3LCByNF0KKyAgICBhZGQgICAgIHIxMCwgcjEwLCAjMQorICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XQorZXh0cmFfaGlnaF9iaXRfbm90X3NldAorICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0CisgICAgbGRyICAgICByMTAsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxzciAgICAgcjcsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gKDI0LW9mZnNldCkKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKKyAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKKyAgICBhZGQgICAgIHIxMSwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjExLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBzdWIgICAgIHIzLCByMywgIzggICAgICAgICAgICAgICAgICA7IGNvdW50IC09IDgKKworICAgIFZBTElEQVRFX1BPUyByMTAsIHIxMSAgICAgICAgICAgICAgIDsgdmFsaWRhdGVfYnVmZmVyIGF0IHBvcworCisgICAgc3RyYiAgICByNywgW3IxMCwgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdPShsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KSkKKyAgICBsZHIgICAgIHIxMCwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGItPnRyZWUKK2V4dHJhX2NvdW50X2x0X3plcm8KKyAgICBsc2wgICAgIHIyLCByMiwgcjYKKworICAgIHN1YnMgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgIDsgLS1uCisgICAgYm5lICAgICBleHRyYV9iaXRzX2xvb3AgICAgICAgICAgICAgOyB3aGlsZSAobikKKworbm9fZXh0cmFfYml0cworICAgIGxkciAgICAgbHIsIFtyMSwgIzRdICAgICAgICAgICAgICAgIDsgZSA9IHAtPkV4dHJhCisgICAgYWRkICAgICByNCwgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZSArIDEKKyAgICB0c3QgICAgIGxyLCAjMQorICAgIGxzciAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgc3BsaXQgPSAocmFuZ2UgKyAxKSA+PiAxCisgICAgYWRkbmUgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSArPSBzcGxpdAorICAgIHN1Ym5lICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPSByYW5nZS1zcGxpdAorICAgIHRzdCAgICAgcjIsICMweDgwMDAwMDAwICAgICAgICAgICAgIDsgbG93dmFsdWUgJiAweDgwMDAwMDAwCisgICAgbHNsICAgICByNSwgcjQsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gMQorICAgIGJlcSAgICAgZW5kX2hpZ2hfYml0X25vdF9zZXQKKworICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQorICAgIG1vdiAgICAgcjcsICMwCisgICAgc3ViICAgICByNCwgcjQsICMxCisgICAgYiAgICAgICBlbmRfemVyb193aGlsZV9zdGFydAorZW5kX3plcm9fd2hpbGVfbG9vcAorICAgIHN0cmIgICAgcjcsIFtyNiwgcjRdCisgICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KK2VuZF96ZXJvX3doaWxlX3N0YXJ0CisgICAgY21wICAgICByNCwgIzAKKyAgICBsZHJnZSAgIHI2LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsZHJiICAgIHIxMiwgW3I2LCByNF0KKyAgICBjbXBnZSAgIHIxMiwgIzB4ZmYKKyAgICBiZXEgICAgIGVuZF96ZXJvX3doaWxlX2xvb3AKKworICAgIGxkciAgICAgcjYsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjcsIFtyNiwgcjRdCisgICAgYWRkICAgICByNywgcjcsICMxCisgICAgc3RyYiAgICByNywgW3I2LCByNF0KK2VuZF9oaWdoX2JpdF9ub3Rfc2V0CisgICAgYWRkcyAgICByMywgcjMsICMxICAgICAgICAgICAgICAgICAgOyArK2NvdW50CisgICAgbHNsICAgICByMiwgcjIsICMxICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSAgPDw9IDEKKyAgICBibmUgICAgIGVuZF9jb3VudF96ZXJvCisKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBtdm4gICAgIHIzLCAjNyAgICAgICAgICAgICAgICAgICAgICA7IGNvdW50ID0gLTgKKyAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsc3IgICAgIHI2LCByMiwgIzI0ICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+IDI0CisgICAgYWRkICAgICByMTIsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKworICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKKyAgICBzdHIgICAgIHIxMiwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCisKKyAgICBWQUxJREFURV9QT1MgcjcsIHIxMiAgICAgICAgICAgICAgICA7IHZhbGlkYXRlX2J1ZmZlciBhdCBwb3MKKworICAgIHN0cmIgICAgcjYsIFtyNywgcjRdCitlbmRfY291bnRfemVybworc2tpcF9leHRyYV9iaXRzCisgICAgYWRkICAgICByMSwgcjEsICNUT0tFTkVYVFJBX1NaICAgICAgOyArK3AKK2NoZWNrX3BfbHRfc3RvcAorICAgIGxkciAgICAgcjQsIFtzcCwgIzBdICAgICAgICAgICAgICAgIDsgc3RvcAorICAgIGNtcCAgICAgcjEsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgd2hpbGUoIHAgPCBzdG9wKQorICAgIGJjYyAgICAgd2hpbGVfcF9sdF9zdG9wCisKKyAgICBsZHIgICAgIHIxMCwgW3NwLCAjMjBdICAgICAgICAgICAgICA7IG51bV9wYXJ0cworICAgIG1vdiAgICAgcjEsICNUT0tFTkxJU1RfU1oKKyAgICBtdWwgICAgIHIxLCByMTAsIHIxCisKKyAgICBsZHIgICAgIHI2LCBbc3AsICMxMl0gICAgICAgICAgICAgICA7IG1iX3Jvd3MKKyAgICBsZHIgICAgIHI3LCBbc3AsICMxNl0gICAgICAgICAgICAgICA7IHRva2VubGlzdCBhZGRyZXNzCisgICAgc3VicyAgICByNiwgcjYsIHIxMAorICAgIGFkZCAgICAgcjcsIHI3LCByMSAgICAgICAgICAgICAgICAgIDsgbmV4dCBlbGVtZW50IGluIHRoZSBhcnJheQorICAgIHN0ciAgICAgcjYsIFtzcCwgIzEyXQorICAgIGJndCAgICAgbWJfcm93X2xvb3AKKworZW5kX3BhcnRpdGlvbgorICAgIG1vdiAgICAgcjEyLCAjMzIKKworc3RvcF9lbmNvZGVfbG9vcAorICAgIHN1YiAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UtMQorCisgICAgbW92ICAgICByNCwgcjcsIGxzbCAjNyAgICAgICAgICAgICAgOyAoKHJhbmdlLTEpICogMTI4KQorCisgICAgbW92ICAgICByNywgIzEKKyAgICBhZGQgICAgIHI0LCByNywgcjQsIGxzciAjOCAgICAgICAgICA7IDEgKyAoKChyYW5nZS0xKSAqIDEyOCkgPj4gOCkKKworICAgIDsgQ291bnRpbmcgdGhlIGxlYWRpbmcgemVyb3MgaXMgdXNlZCB0byBub3JtYWxpemUgcmFuZ2UuCisgICAgY2x6ICAgICByNiwgcjQKKyAgICBzdWIgICAgIHI2LCByNiwgIzI0ICAgICAgICAgICAgICAgICA7IHNoaWZ0CisKKyAgICA7IEZsYWcgaXMgc2V0IG9uIHRoZSBzdW0gb2YgY291bnQuICBUaGlzIGZsYWcgaXMgdXNlZCBsYXRlcgorICAgIDsgdG8gZGV0ZXJtaW5lIGlmIGNvdW50ID49IDAKKyAgICBhZGRzICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IGNvdW50ICs9IHNoaWZ0CisgICAgbHNsICAgICByNSwgcjQsIHI2ICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gc2hpZnQKKyAgICBibWkgICAgIHRva2VuX2NvdW50X2x0X3plcm9fc2UgICAgICA7IGlmKGNvdW50ID49IDApCisKKyAgICBzdWIgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IG9mZnNldCA9IHNoaWZ0IC0gY291bnQKKyAgICBzdWIgICAgIHI0LCByNiwgIzEgICAgICAgICAgICAgICAgICA7IG9mZnNldC0xCisgICAgbHNscyAgICByNCwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZigobG93dmFsdWU8PChvZmZzZXQtMSkpICYgMHg4MDAwMDAwMCApCisgICAgYnBsICAgICB0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0X3NlCisKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHgKKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHggPSB3LT5wb3MtMQorICAgIGIgICAgICAgdG9rZW5femVyb193aGlsZV9zdGFydF9zZQordG9rZW5femVyb193aGlsZV9sb29wX3NlCisgICAgbW92ICAgICByMTAsICMwCisgICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKKyAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQordG9rZW5femVyb193aGlsZV9zdGFydF9zZQorICAgIGNtcCAgICAgcjQsICMwCisgICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCisgICAgbGRyYiAgICByMTEsIFtyNywgcjRdCisgICAgY21wZ2UgICByMTEsICMweGZmCisgICAgYmVxICAgICB0b2tlbl96ZXJvX3doaWxlX2xvb3Bfc2UKKworICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQorICAgIGxkcmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdCisgICAgYWRkICAgICByMTAsIHIxMCwgIzEKKyAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSArIDEKK3Rva2VuX2hpZ2hfYml0X25vdF9zZXRfc2UKKyAgICByc2IgICAgIHI0LCByNiwgIzI0ICAgICAgICAgICAgICAgICA7IDI0LW9mZnNldAorICAgIGxkciAgICAgcjEwLCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KKyAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB3LT5wb3MKKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKKyAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKKyAgICBhZGQgICAgIHIxMSwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCisgICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgorICAgIHN0ciAgICAgcjExLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KKyAgICBzdWIgICAgIHIzLCByMywgIzggICAgICAgICAgICAgICAgICA7IGNvdW50IC09IDgKKworICAgIFZBTElEQVRFX1BPUyByMTAsIHIxMSAgICAgICAgICAgICAgIDsgdmFsaWRhdGVfYnVmZmVyIGF0IHBvcworCisgICAgc3RyYiAgICByNywgW3IxMCwgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdCisKK3Rva2VuX2NvdW50X2x0X3plcm9fc2UKKyAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBzaGlmdAorCisgICAgc3VicyAgICByMTIsIHIxMiwgIzEKKyAgICBibmUgICAgIHN0b3BfZW5jb2RlX2xvb3AKKworICAgIGxkciAgICAgcjQsICBbcjAsICN2cDhfd3JpdGVyX3Bvc10gIDsgdy0+cG9zCisgICAgbGRyICAgICByMTIsIFtzcCwgIzI0XSAgICAgICAgICAgICAgOyBwdHIKKyAgICBhZGQgICAgIHIxMiwgcjEyLCByNCAgICAgICAgICAgICAgICA7IHB0ciArPSB3LT5wb3MKKyAgICBzdHIgICAgIHIxMiwgW3NwLCAjMjRdCisKKyAgICBsZHIgICAgIHIxMSwgW3NwLCAjMjhdICAgICAgICAgICAgICA7IGkKKyAgICBsZHIgICAgIHIxMCwgW3NwLCAjMjBdICAgICAgICAgICAgICA7IG51bV9wYXJ0cworCisgICAgYWRkICAgICByMTEsIHIxMSwgIzEgICAgICAgICAgICAgICAgOyBpKysKKyAgICBzdHIgICAgIHIxMSwgW3NwLCAjMjhdCisKKyAgICBsZHIgICAgIHI3LCBbc3AsICMzMl0gICAgICAgICAgICAgICA7IGNwaS0+dHBfbGlzdFtpXQorICAgIG1vdiAgICAgcjEsICNUT0tFTkxJU1RfU1oKKyAgICBhZGQgICAgIHI3LCByNywgcjEgICAgICAgICAgICAgICAgICA7IG5leHQgZWxlbWVudCBpbiBjcGktPnRwX2xpc3QKKyAgICBzdHIgICAgIHI3LCBbc3AsICMzMl0gICAgICAgICAgICAgICA7IGNwaS0+dHBfbGlzdFtpKzFdCisKKyAgICBjbXAgICAgIHIxMCwgcjExCisgICAgYmd0ICAgICBudW1wYXJ0c19sb29wCisKKyAgICBhZGQgICAgIHNwLCBzcCwgIzQwCisgICAgcG9wICAgICB7cjQtcjEyLCBwY30KKyAgICBFTkRQCisKK19WUDhfQ09NUF9jb21tb25fCisgICAgRENEICAgICB2cDhfY29tcF9jb21tb24KK19WUDhfQ09NTU9OX01Ccm93c18KKyAgICBEQ0QgICAgIHZwOF9jb21tb25fbWJfcm93cworX1ZQOF9DT01QX3RwbGlzdF8KKyAgICBEQ0QgICAgIHZwOF9jb21wX3RwbGlzdAorX1ZQOF9DT01QX2JjXworICAgIERDRCAgICAgdnA4X2NvbXBfYmMKK192cDhfd3JpdGVyX3N6XworICAgIERDRCAgICAgdnA4X3dyaXRlcl9zegorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9mYXN0X3F1YW50aXplX2JfYXJtdjYuYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfZmFzdF9xdWFudGl6ZV9iX2FybXY2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjFmNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfZmFzdF9xdWFudGl6ZV9iX2FybXY2LmFzbQpAQCAtMCwwICsxLDIyNSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9mYXN0X3F1YW50aXplX2JfYXJtdjZ8CisKKyAgICBJTkNMVURFIGFzbV9lbmNfb2Zmc2V0cy5hc20KKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICBCTE9DSyAqYgorOyByMSAgICBCTE9DS0QgKmQKK3x2cDhfZmFzdF9xdWFudGl6ZV9iX2FybXY2fCBQUk9DCisgICAgc3RtZmQgICBzcCEsIHtyMSwgcjQtcjExLCBscn0KKworICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF9ibG9ja19jb2VmZl0gICAgICA7IGNvZWZmCisgICAgbGRyICAgICByNCwgW3IwLCAjdnA4X2Jsb2NrX3F1YW50X2Zhc3RdIDsgcXVhbnRfZmFzdAorICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF9ibG9ja19yb3VuZF0gICAgICA7IHJvdW5kCisgICAgbGRyICAgICByNiwgW3IxLCAjdnA4X2Jsb2NrZF9xY29lZmZdICAgIDsgcWNvZWZmCisgICAgbGRyICAgICByNywgW3IxLCAjdnA4X2Jsb2NrZF9kcWNvZWZmXSAgIDsgZHFjb2VmZgorICAgIGxkciAgICAgcjgsIFtyMSwgI3ZwOF9ibG9ja2RfZGVxdWFudF0gICA7IGRlcXVhbnQKKworICAgIGxkciAgICAgcjIsIGxvb3BfY291bnQgICAgICAgICAgOyBsb29wX2NvdW50PTB4MTAwMDAwMC4gJ2xzbHMnIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBjb3VudGVyIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaXQgY2FuIGJlIHVzZWQgdG8gbWFyayBub256ZXJvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHF1YW50aXplZCBjb2VmZmljaWVudCBwYWlycy4KKworICAgIG1vdiAgICAgcjEsICMwICAgICAgICAgICAgICAgICAgOyBmbGFncyBmb3IgcXVhbnRpemVkIGNvZWZmcworCisgICAgOyBQQVJUIDE6IHF1YW50aXphdGlvbiBhbmQgZGVxdWFudGl6YXRpb24gbG9vcAorbG9vcAorICAgIGxkciAgICAgcjksIFtyM10sICM0ICAgICAgICAgICAgOyBbejEgfCB6MF0KKyAgICBsZHIgICAgIHIxMCwgW3I1XSwgIzQgICAgICAgICAgIDsgW3IxIHwgcjBdCisgICAgbGRyICAgICByMTEsIFtyNF0sICM0ICAgICAgICAgICA7IFtxMSB8IHEwXQorCisgICAgc3NhdDE2ICBsciwgIzEsIHI5ICAgICAgICAgICAgICA7IFtzejEgfCBzejBdCisgICAgZW9yICAgICByOSwgcjksIGxyICAgICAgICAgICAgICA7IFt6MSBeIHN6MSB8IHowIF4gc3owXQorICAgIHNzdWIxNiAgcjksIHI5LCBsciAgICAgICAgICAgICAgOyB4ID0gKHogXiBzeikgLSBzegorICAgIHNhZGQxNiAgcjksIHI5LCByMTAgICAgICAgICAgICAgOyBbeDErcjEgfCB4MCtyMF0KKworICAgIGxkciAgICAgcjEyLCBbcjNdLCAjNCAgICAgICAgICAgOyBbejMgfCB6Ml0KKworICAgIHNtdWxiYiAgcjAsIHI5LCByMTEgICAgICAgICAgICAgOyBbKHgwK3IwKSpxMF0KKyAgICBzbXVsdHQgIHI5LCByOSwgcjExICAgICAgICAgICAgIDsgWyh4MStyMSkqcTFdCisKKyAgICBsZHIgICAgIHIxMCwgW3I1XSwgIzQgICAgICAgICAgIDsgW3IzIHwgcjJdCisKKyAgICBzc2F0MTYgIHIxMSwgIzEsIHIxMiAgICAgICAgICAgIDsgW3N6MyB8IHN6Ml0KKyAgICBlb3IgICAgIHIxMiwgcjEyLCByMTEgICAgICAgICAgIDsgW3ozIF4gc3ozIHwgejIgXiBzejJdCisgICAgcGtodGIgICByMCwgcjksIHIwLCBhc3IgIzE2ICAgICA7IFt5MSB8IHkwXQorICAgIGxkciAgICAgcjksIFtyNF0sICM0ICAgICAgICAgICAgOyBbcTMgfCBxMl0KKyAgICBzc3ViMTYgIHIxMiwgcjEyLCByMTEgICAgICAgICAgIDsgeCA9ICh6IF4gc3opIC0gc3oKKworICAgIHNhZGQxNiAgcjEyLCByMTIsIHIxMCAgICAgICAgICAgOyBbeDMrcjMgfCB4MityMl0KKworICAgIGVvciAgICAgcjAsIHIwLCBsciAgICAgICAgICAgICAgOyBbKHkxIF4gc3oxKSB8ICh5MCBeIHN6MCldCisKKyAgICBzbXVsYmIgIHIxMCwgcjEyLCByOSAgICAgICAgICAgIDsgWyh4MityMikqcTJdCisgICAgc211bHR0ICByMTIsIHIxMiwgcjkgICAgICAgICAgICA7IFsoeDMrcjMpKnEzXQorCisgICAgc3N1YjE2ICByMCwgcjAsIGxyICAgICAgICAgICAgICA7IHggPSAoeSBeIHN6KSAtIHN6CisKKyAgICBjbXAgICAgIHIwLCAjMCAgICAgICAgICAgICAgICAgIDsgY2hlY2sgaWYgemVybworICAgIG9ycm5lICAgcjEsIHIxLCByMiwgbHNyICMyNCAgICAgOyBhZGQgZmxhZyBmb3Igbm9uemVybyBjb2VmZnMKKworICAgIHN0ciAgICAgcjAsIFtyNl0sICM0ICAgICAgICAgICAgOyAqcWNvZWZmKysgPSB4CisgICAgbGRyICAgICByOSwgW3I4XSwgIzQgICAgICAgICAgICA7IFtkcTEgfCBkcTBdCisKKyAgICBwa2h0YiAgIHIxMCwgcjEyLCByMTAsIGFzciAjMTYgIDsgW3kzIHwgeTJdCisgICAgZW9yICAgICByMTAsIHIxMCwgcjExICAgICAgICAgICA7IFsoeTMgXiBzejMpIHwgKHkyIF4gc3oyKV0KKyAgICBzc3ViMTYgIHIxMCwgcjEwLCByMTEgICAgICAgICAgIDsgeCA9ICh5IF4gc3opIC0gc3oKKworICAgIGNtcCAgICAgcjEwLCAjMCAgICAgICAgICAgICAgICAgOyBjaGVjayBpZiB6ZXJvCisgICAgb3JybmUgICByMSwgcjEsIHIyLCBsc3IgIzIzICAgICA7IGFkZCBmbGFnIGZvciBub256ZXJvIGNvZWZmcworCisgICAgc3RyICAgICByMTAsIFtyNl0sICM0ICAgICAgICAgICA7ICpxY29lZmYrKyA9IHgKKyAgICBsZHIgICAgIHIxMSwgW3I4XSwgIzQgICAgICAgICAgIDsgW2RxMyB8IGRxMl0KKworICAgIHNtdWxiYiAgcjEyLCByMCwgcjkgICAgICAgICAgICAgOyBbeDAqZHEwXQorICAgIHNtdWx0dCAgcjAsIHIwLCByOSAgICAgICAgICAgICAgOyBbeDEqZHExXQorCisgICAgc211bGJiICByOSwgcjEwLCByMTEgICAgICAgICAgICA7IFt4MipkcTJdCisgICAgc211bHR0ICByMTAsIHIxMCwgcjExICAgICAgICAgICA7IFt4MypkcTNdCisKKyAgICBsc2xzICAgIHIyLCByMiwgIzIgICAgICAgICAgICAgIDsgdXBkYXRlIGxvb3AgY291bnRlcgorICAgIHN0cmggICAgcjEyLCBbcjcsICMwXSAgICAgICAgICAgOyBkcWNvZWZmWzBdID0gW3gwKmRxMF0KKyAgICBzdHJoICAgIHIwLCBbcjcsICMyXSAgICAgICAgICAgIDsgZHFjb2VmZlsxXSA9IFt4MSpkcTFdCisgICAgc3RyaCAgICByOSwgW3I3LCAjNF0gICAgICAgICAgICA7IGRxY29lZmZbMl0gPSBbeDIqZHEyXQorICAgIHN0cmggICAgcjEwLCBbcjcsICM2XSAgICAgICAgICAgOyBkcWNvZWZmWzNdID0gW3gzKmRxM10KKyAgICBhZGQgICAgIHI3LCByNywgIzggICAgICAgICAgICAgIDsgZHFjb2VmZiArPSA4CisgICAgYm5lICAgICBsb29wCisKKyAgICA7IFBBUlQgMjogY2hlY2sgcG9zaXRpb24gZm9yIGVvYi4uLgorICAgIGxkciAgICAgcjExLCBbc3AsICMwXSAgICAgICAgICAgOyByZXN0b3JlIEJMT0NLRCBwb2ludGVyCisgICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgICAgICA7IGluaXQgZW9iCisgICAgY21wICAgICByMSwgIzAgICAgICAgICAgICAgICAgICA7IGNvZWZmcyBhZnRlciBxdWFudGl6YXRpb24/CisgICAgbGRyICAgICByMTIsIFtyMTEsICN2cDhfYmxvY2tkX2VvYl0KKyAgICBiZXEgICAgIGVuZCAgICAgICAgICAgICAgICAgICAgIDsgc2tpcCBlb2IgY2FsY3VsYXRpb25zIGlmIGFsbCB6ZXJvCisKKyAgICBsZHIgICAgIHIwLCBbcjExLCAjdnA4X2Jsb2NrZF9xY29lZmZdCisKKyAgICA7IGNoZWNrIHNob3J0Y3V0IGZvciBub256ZXJvIHFjb2VmZnMKKyAgICB0c3QgICAgcjEsICMweDgwCisgICAgYm5lICAgIHF1YW50X2NvZWZmXzE1XzE0CisgICAgdHN0ICAgIHIxLCAjMHgyMAorICAgIGJuZSAgICBxdWFudF9jb2VmZl8xM18xMQorICAgIHRzdCAgICByMSwgIzB4OAorICAgIGJuZSAgICBxdWFudF9jb2VmZl8xMl83CisgICAgdHN0ICAgIHIxLCAjMHg0MAorICAgIGJuZSAgICBxdWFudF9jb2VmZl8xMF85CisgICAgdHN0ICAgIHIxLCAjMHgxMAorICAgIGJuZSAgICBxdWFudF9jb2VmZl84XzMKKyAgICB0c3QgICAgcjEsICMweDIKKyAgICBibmUgICAgcXVhbnRfY29lZmZfNl81CisgICAgdHN0ICAgIHIxLCAjMHg0CisgICAgYm5lICAgIHF1YW50X2NvZWZmXzRfMgorICAgIGIgICAgICBxdWFudF9jb2VmZl8xXzAKKworcXVhbnRfY29lZmZfMTVfMTQKKyAgICBsZHJoICAgIHIyLCBbcjAsICMzMF0gICAgICAgOyByYz0xNSwgaT0xNQorICAgIG1vdiAgICAgbHIsICMxNgorICAgIGNtcCAgICAgcjIsICMwCisgICAgYm5lICAgICBlbmQKKworICAgIGxkcmggICAgcjMsIFtyMCwgIzI4XSAgICAgICA7IHJjPTE0LCBpPTE0CisgICAgbW92ICAgICBsciwgIzE1CisgICAgY21wICAgICByMywgIzAKKyAgICBibmUgICAgIGVuZAorCitxdWFudF9jb2VmZl8xM18xMQorICAgIGxkcmggICAgcjIsIFtyMCwgIzIyXSAgICAgICA7IHJjPTExLCBpPTEzCisgICAgbW92ICAgICBsciwgIzE0CisgICAgY21wICAgICByMiwgIzAKKyAgICBibmUgICAgIGVuZAorCitxdWFudF9jb2VmZl8xMl83CisgICAgbGRyaCAgICByMywgW3IwLCAjMTRdICAgICAgIDsgcmM9NywgIGk9MTIKKyAgICBtb3YgICAgIGxyLCAjMTMKKyAgICBjbXAgICAgIHIzLCAjMAorICAgIGJuZSAgICAgZW5kCisKKyAgICBsZHJoICAgIHIyLCBbcjAsICMyMF0gICAgICAgOyByYz0xMCwgaT0xMQorICAgIG1vdiAgICAgbHIsICMxMgorICAgIGNtcCAgICAgcjIsICMwCisgICAgYm5lICAgICBlbmQKKworcXVhbnRfY29lZmZfMTBfOQorICAgIGxkcmggICAgcjMsIFtyMCwgIzI2XSAgICAgICA7IHJjPTEzLCBpPTEwCisgICAgbW92ICAgICBsciwgIzExCisgICAgY21wICAgICByMywgIzAKKyAgICBibmUgICAgIGVuZAorCisgICAgbGRyaCAgICByMiwgW3IwLCAjMjRdICAgICAgIDsgcmM9MTIsIGk9OQorICAgIG1vdiAgICAgbHIsICMxMAorICAgIGNtcCAgICAgcjIsICMwCisgICAgYm5lICAgICBlbmQKKworcXVhbnRfY29lZmZfOF8zCisgICAgbGRyaCAgICByMywgW3IwLCAjMThdICAgICAgIDsgcmM9OSwgIGk9OAorICAgIG1vdiAgICAgbHIsICM5CisgICAgY21wICAgICByMywgIzAKKyAgICBibmUgICAgIGVuZAorCisgICAgbGRyaCAgICByMiwgW3IwLCAjMTJdICAgICAgIDsgcmM9NiwgIGk9NworICAgIG1vdiAgICAgbHIsICM4CisgICAgY21wICAgICByMiwgIzAKKyAgICBibmUgICAgIGVuZAorCitxdWFudF9jb2VmZl82XzUKKyAgICBsZHJoICAgIHIzLCBbcjAsICM2XSAgICAgICAgOyByYz0zLCAgaT02CisgICAgbW92ICAgICBsciwgIzcKKyAgICBjbXAgICAgIHIzLCAjMAorICAgIGJuZSAgICAgZW5kCisKKyAgICBsZHJoICAgIHIyLCBbcjAsICM0XSAgICAgICAgOyByYz0yLCAgaT01CisgICAgbW92ICAgICBsciwgIzYKKyAgICBjbXAgICAgIHIyLCAjMAorICAgIGJuZSAgICAgZW5kCisKK3F1YW50X2NvZWZmXzRfMgorICAgIGxkcmggICAgcjMsIFtyMCwgIzEwXSAgICAgICA7IHJjPTUsICBpPTQKKyAgICBtb3YgICAgIGxyLCAjNQorICAgIGNtcCAgICAgcjMsICMwCisgICAgYm5lICAgICBlbmQKKworICAgIGxkcmggICAgcjIsIFtyMCwgIzE2XSAgICAgICA7IHJjPTgsICBpPTMKKyAgICBtb3YgICAgIGxyLCAjNAorICAgIGNtcCAgICAgcjIsICMwCisgICAgYm5lICAgICBlbmQKKworICAgIGxkcmggICAgcjMsIFtyMCwgIzhdICAgICAgICA7IHJjPTQsICBpPTIKKyAgICBtb3YgICAgIGxyLCAjMworICAgIGNtcCAgICAgcjMsICMwCisgICAgYm5lICAgICBlbmQKKworcXVhbnRfY29lZmZfMV8wCisgICAgbGRyaCAgICByMiwgW3IwLCAjMl0gICAgICAgIDsgcmM9MSwgIGk9MQorICAgIG1vdiAgICAgbHIsICMyCisgICAgY21wICAgICByMiwgIzAKKyAgICBibmUgICAgIGVuZAorCisgICAgbW92ICAgICBsciwgIzEgICAgICAgICAgICAgIDsgcmM9MCwgIGk9MAorCitlbmQKKyAgICBzdHJiICAgIGxyLCBbcjEyXQorICAgIGxkbWZkICAgc3AhLCB7cjEsIHI0LXIxMSwgcGN9CisKKyAgICBFTkRQCisKK2xvb3BfY291bnQKKyAgICBEQ0QgICAgIDB4MTAwMDAwMAorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X21zZTE2eDE2X2FybXY2LmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X21zZTE2eDE2X2FybXY2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA4MDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfbXNlMTZ4MTZfYXJtdjYuYXNtCkBAIC0wLDAgKzEsMTM4IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X21zZTE2eDE2X2FybXY2fAorCisgICAgQVJNCisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKKzsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKKzsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKKzsKKztub3RlOiBCYXNlZCBvbiB2cDhfdmFyaWFuY2UxNngxNl9hcm12Ni4gSW4gdGhpcyBmdW5jdGlvbiwgc3VtIGlzIG5ldmVyIHVzZWQuCis7ICAgICAgU28sIHdlIGNhbiByZW1vdmUgdGhpcyBwYXJ0IG9mIGNhbGN1bGF0aW9uLgorCit8dnA4X21zZTE2eDE2X2FybXY2fCBQUk9DCisKKyAgICBwdXNoICAgIHtyNC1yOSwgbHJ9CisKKyAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMF0KKyAgICBwbGQgICAgIFtyMiwgcjMsIGxzbCAjMF0KKworICAgIG1vdiAgICAgcjEyLCAjMTYgICAgICAgICAgICA7IHNldCBsb29wIGNvdW50ZXIgdG8gMTYgKD1ibG9jayBoZWlnaHQpCisgICAgbW92ICAgICByNCwgIzAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzc2UgPSAwCisKK2xvb3AKKyAgICA7IDFzdCA0IHBpeGVscworICAgIGxkciAgICAgcjUsIFtyMCwgIzB4MF0gICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCisgICAgbGRyICAgICByNiwgW3IyLCAjMHgwXSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKworICAgIG1vdiAgICAgbHIsICMwICAgICAgICAgICAgICA7IGNvbnN0YW50IHplcm8KKworICAgIHVzdWI4ICAgcjgsIHI1LCByNiAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCisgICAgcGxkICAgICBbcjAsIHIxLCBsc2wgIzFdCisgICAgc2VsICAgICByNywgcjgsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQorICAgIHVzdWI4ICAgcjksIHI2LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKKyAgICBwbGQgICAgIFtyMiwgcjMsIGxzbCAjMV0KKyAgICBzZWwgICAgIHI4LCByOSwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBuZWdhdGl2ZSBkaWZmZXJlbmNlCisKKyAgICA7IGNhbGN1bGF0ZSBwYXJ0aWFsIHN1bXMKKyAgICB1c2FkOCAgIHI1LCByNywgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIHBvc2l0aXZlIGRpZmZlcmVuY2VzCisgICAgdXNhZDggICByNiwgcjgsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBuZWdhdGl2ZSBkaWZmZXJlbmNlcworICAgIG9yciAgICAgcjgsIHI4LCByNyAgICAgICAgICA7IGRpZmZlcmVuY2VzIG9mIGFsbCA0IHBpeGVscworCisgICAgbGRyICAgICByNSwgW3IwLCAjMHg0XSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjYsIHI4ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjcsIHI4LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHI0LCByNiwgcjYsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorCisgICAgOyAybmQgNCBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjIsICMweDRdICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworICAgIHNtbGFkICAgcjQsIHI3LCByNywgcjQgICAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICB1c3ViOCAgIHI4LCByNSwgcjYgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHNlbCAgICAgcjcsIHI4LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI5LCByNiwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgc2VsICAgICByOCwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNSwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjYsIHI4LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI4LCByOCwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKyAgICBsZHIgICAgIHI1LCBbcjAsICMweDhdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjYsIHI4ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjcsIHI4LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHI0LCByNiwgcjYsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorCisgICAgOyAzcmQgNCBwaXhlbHMKKyAgICBsZHIgICAgIHI2LCBbcjIsICMweDhdICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscworICAgIHNtbGFkICAgcjQsIHI3LCByNywgcjQgICAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICB1c3ViOCAgIHI4LCByNSwgcjYgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQorICAgIHNlbCAgICAgcjcsIHI4LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI5LCByNiwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgc2VsICAgICByOCwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQorCisgICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCisgICAgdXNhZDggICByNSwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcworICAgIHVzYWQ4ICAgcjYsIHI4LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKKyAgICBvcnIgICAgIHI4LCByOCwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKKworICAgIGxkciAgICAgcjUsIFtyMCwgIzB4Y10gICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCisKKyAgICA7IGNhbGN1bGF0ZSBzc2UKKyAgICB1eHRiMTYgIHI2LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKKyAgICB1eHRiMTYgIHI3LCByOCwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCisgICAgc21sYWQgICByNCwgcjYsIHI2LCByNCAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKKworICAgIDsgNHRoIDQgcGl4ZWxzCisgICAgbGRyICAgICByNiwgW3IyLCAjMHhjXSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKKyAgICBzbWxhZCAgIHI0LCByNywgcjcsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQorCisgICAgdXN1YjggICByOCwgcjUsIHI2ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKKyAgICBhZGQgICAgIHIwLCByMCwgcjEgICAgICAgICAgOyBzZXQgc3JjX3B0ciB0byBuZXh0IHJvdworICAgIHNlbCAgICAgcjcsIHI4LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKKyAgICB1c3ViOCAgIHI5LCByNiwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCisgICAgYWRkICAgICByMiwgcjIsIHIzICAgICAgICAgIDsgc2V0IGRzdF9wdHIgdG8gbmV4dCByb3cKKyAgICBzZWwgICAgIHI4LCByOSwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBuZWdhdGl2ZSBkaWZmZXJlbmNlCisKKyAgICA7IGNhbGN1bGF0ZSBwYXJ0aWFsIHN1bXMKKyAgICB1c2FkOCAgIHI1LCByNywgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIHBvc2l0aXZlIGRpZmZlcmVuY2VzCisgICAgdXNhZDggICByNiwgcjgsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBuZWdhdGl2ZSBkaWZmZXJlbmNlcworICAgIG9yciAgICAgcjgsIHI4LCByNyAgICAgICAgICA7IGRpZmZlcmVuY2VzIG9mIGFsbCA0IHBpeGVscworCisgICAgc3VicyAgICByMTIsIHIxMiwgIzEgICAgICAgIDsgbmV4dCByb3cKKworICAgIDsgY2FsY3VsYXRlIHNzZQorICAgIHV4dGIxNiAgcjYsIHI4ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcworICAgIHV4dGIxNiAgcjcsIHI4LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKKyAgICBzbWxhZCAgIHI0LCByNiwgcjYsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQorICAgIHNtbGFkICAgcjQsIHI3LCByNywgcjQgICAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCisKKyAgICBibmUgICAgIGxvb3AKKworICAgIDsgcmV0dXJuIHN0dWZmCisgICAgbGRyICAgICByMSwgW3NwLCAjMjhdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCisgICAgbW92ICAgICByMCwgcjQgICAgICAgICAgICAgIDsgcmV0dXJuIHNzZQorICAgIHN0ciAgICAgcjQsIFtyMV0gICAgICAgICAgICA7IHN0b3JlIHNzZQorCisgICAgcG9wICAgICB7cjQtcjksIHBjfQorCisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9zaG9ydF9mZGN0NHg0X2FybXY2LmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3Nob3J0X2ZkY3Q0eDRfYXJtdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzRjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9zaG9ydF9mZGN0NHg0X2FybXY2LmFzbQpAQCAtMCwwICsxLDI2MiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKyAgICBFWFBPUlQgfHZwOF9zaG9ydF9mZGN0NHg0X2FybXY2fAorCisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkKKzsgdm9pZCB2cDhfc2hvcnRfZmRjdDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQorfHZwOF9zaG9ydF9mZGN0NHg0X2FybXY2fCBQUk9DCisKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyNCAtIHIxMiwgbHJ9CisKKyAgICA7IFBBUlQgMQorCisgICAgOyBjb2VmZnMgMC0zCisgICAgbGRyZCAgICAgICAgcjQsIHI1LCBbcjBdICAgICAgICA7IFtpMSB8IGkwXSBbaTMgfCBpMl0KKworICAgIGxkciAgICAgICAgIHIxMCwgYzc1MDAKKyAgICBsZHIgICAgICAgICByMTEsIGMxNDUwMAorICAgIGxkciAgICAgICAgIHIxMiwgYzB4MjJhNDUzYTAgICAgOyBbMjIxNyo0IHwgNTM1Mio0XQorICAgIGxkciAgICAgICAgIGxyLCBjMHgwMDA4MDAwOAorICAgIHJvciAgICAgICAgIHI1LCByNSwgIzE2ICAgICAgICAgOyBbaTIgfCBpM10KKworICAgIHFhZGQxNiAgICAgIHI2LCByNCwgcjUgICAgICAgICAgOyBbaTEraTIgfCBpMCtpM10gPSBbYjEgfCBhMV0gd2l0aG91dCBzaGlmdAorICAgIHFzdWIxNiAgICAgIHI3LCByNCwgcjUgICAgICAgICAgOyBbaTEtaTIgfCBpMC1pM10gPSBbYzEgfCBkMV0gd2l0aG91dCBzaGlmdAorCisgICAgYWRkICAgICAgICAgcjAsIHIwLCByMiAgICAgICAgICA7IHVwZGF0ZSBpbnB1dCBwb2ludGVyCisKKyAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMipbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCisKKyAgICBzbXVhZCAgICAgICByNCwgcjYsIGxyICAgICAgICAgIDsgbzAgPSAoaTEraTIpKjggKyAoaTAraTMpKjgKKyAgICBzbXVzZCAgICAgICByNSwgcjYsIGxyICAgICAgICAgIDsgbzIgPSAoaTEraTIpKjggLSAoaTAraTMpKjgKKworICAgIHNtbGFkICAgICAgIHI2LCByNywgcjEyLCByMTEgICAgOyBvMSA9IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApCisgICAgc21sc2R4ICAgICAgcjcsIHI3LCByMTIsIHIxMCAgICA7IG8zID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKKworICAgIGxkcmQgICAgICAgIHI4LCByOSwgW3IwXSAgICAgICAgOyBbaTUgfCBpNF0gW2k3IHwgaTZdCisKKyAgICBwa2hidCAgICAgICByMywgcjQsIHI2LCBsc2wgIzQgIDsgW28xIHwgbzBdLCBrZWVwIGluIHJlZ2lzdGVyIGZvciBQQVJUIDIKKyAgICBwa2hidCAgICAgICByNiwgcjUsIHI3LCBsc2wgIzQgIDsgW28zIHwgbzJdCisKKyAgICBzdHIgICAgICAgICByNiwgW3IxLCAjNF0KKworICAgIDsgY29lZmZzIDQtNworICAgIHJvciAgICAgICAgIHI5LCByOSwgIzE2ICAgICAgICAgOyBbaTYgfCBpN10KKworICAgIHFhZGQxNiAgICAgIHI2LCByOCwgcjkgICAgICAgICAgOyBbaTUraTYgfCBpNCtpN10gPSBbYjEgfCBhMV0gd2l0aG91dCBzaGlmdAorICAgIHFzdWIxNiAgICAgIHI3LCByOCwgcjkgICAgICAgICAgOyBbaTUtaTYgfCBpNC1pN10gPSBbYzEgfCBkMV0gd2l0aG91dCBzaGlmdAorCisgICAgYWRkICAgICAgICAgcjAsIHIwLCByMiAgICAgICAgICA7IHVwZGF0ZSBpbnB1dCBwb2ludGVyCisKKyAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMnhbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCisKKyAgICBzbXVhZCAgICAgICByOSwgcjYsIGxyICAgICAgICAgIDsgbzQgPSAoaTUraTYpKjggKyAoaTQraTcpKjgKKyAgICBzbXVzZCAgICAgICByOCwgcjYsIGxyICAgICAgICAgIDsgbzYgPSAoaTUraTYpKjggLSAoaTQraTcpKjgKKworICAgIHNtbGFkICAgICAgIHI2LCByNywgcjEyLCByMTEgICAgOyBvNSA9IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApCisgICAgc21sc2R4ICAgICAgcjcsIHI3LCByMTIsIHIxMCAgICA7IG83ID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKKworICAgIGxkcmQgICAgICAgIHI0LCByNSwgW3IwXSAgICAgICAgOyBbaTkgfCBpOF0gW2kxMSB8IGkxMF0KKworICAgIHBraGJ0ICAgICAgIHI5LCByOSwgcjYsIGxzbCAjNCAgOyBbbzUgfCBvNF0sIGtlZXAgaW4gcmVnaXN0ZXIgZm9yIFBBUlQgMgorICAgIHBraGJ0ICAgICAgIHI2LCByOCwgcjcsIGxzbCAjNCAgOyBbbzcgfCBvNl0KKworICAgIHN0ciAgICAgICAgIHI2LCBbcjEsICMxMl0KKworICAgIDsgY29lZmZzIDgtMTEKKyAgICByb3IgICAgICAgICByNSwgcjUsICMxNiAgICAgICAgIDsgW2kxMCB8IGkxMV0KKworICAgIHFhZGQxNiAgICAgIHI2LCByNCwgcjUgICAgICAgICAgOyBbaTkraTEwIHwgaTgraTExXT1bYjEgfCBhMV0gd2l0aG91dCBzaGlmdAorICAgIHFzdWIxNiAgICAgIHI3LCByNCwgcjUgICAgICAgICAgOyBbaTktaTEwIHwgaTgtaTExXT1bYzEgfCBkMV0gd2l0aG91dCBzaGlmdAorCisgICAgYWRkICAgICAgICAgcjAsIHIwLCByMiAgICAgICAgICA7IHVwZGF0ZSBpbnB1dCBwb2ludGVyCisKKyAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMnhbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCisKKyAgICBzbXVhZCAgICAgICByMiwgcjYsIGxyICAgICAgICAgIDsgbzggPSAoaTkraTEwKSo4ICsgKGk4K2kxMSkqOAorICAgIHNtdXNkICAgICAgIHI4LCByNiwgbHIgICAgICAgICAgOyBvMTAgPSAoaTkraTEwKSo4IC0gKGk4K2kxMSkqOAorCisgICAgc21sYWQgICAgICAgcjYsIHI3LCByMTIsIHIxMSAgICA7IG85ID0gKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCkKKyAgICBzbWxzZHggICAgICByNywgcjcsIHIxMiwgcjEwICAgIDsgbzExID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKKworICAgIGxkcmQgICAgICAgIHI0LCByNSwgW3IwXSAgICAgICAgOyBbaTEzIHwgaTEyXSBbaTE1IHwgaTE0XQorCisgICAgcGtoYnQgICAgICAgcjIsIHIyLCByNiwgbHNsICM0ICA7IFtvOSB8IG84XSwga2VlcCBpbiByZWdpc3RlciBmb3IgUEFSVCAyCisgICAgcGtoYnQgICAgICAgcjYsIHI4LCByNywgbHNsICM0ICA7IFtvMTEgfCBvMTBdCisKKyAgICBzdHIgICAgICAgICByNiwgW3IxLCAjMjBdCisKKyAgICA7IGNvZWZmcyAxMi0xNQorICAgIHJvciAgICAgICAgIHI1LCByNSwgIzE2ICAgICAgICAgOyBbaTE0IHwgaTE1XQorCisgICAgcWFkZDE2ICAgICAgcjYsIHI0LCByNSAgICAgICAgICA7IFtpMTMraTE0IHwgaTEyK2kxNV09W2IxfGExXSB3aXRob3V0IHNoaWZ0CisgICAgcXN1YjE2ICAgICAgcjcsIHI0LCByNSAgICAgICAgICA7IFtpMTMtaTE0IHwgaTEyLWkxNV09W2MxfGQxXSB3aXRob3V0IHNoaWZ0CisKKyAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMnhbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCisKKyAgICBzbXVhZCAgICAgICByNCwgcjYsIGxyICAgICAgICAgIDsgbzEyID0gKGkxMytpMTQpKjggKyAoaTEyK2kxNSkqOAorICAgIHNtdXNkICAgICAgIHI1LCByNiwgbHIgICAgICAgICAgOyBvMTQgPSAoaTEzK2kxNCkqOCAtIChpMTIraTE1KSo4CisKKyAgICBzbWxhZCAgICAgICByNiwgcjcsIHIxMiwgcjExICAgIDsgbzEzID0gKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCkKKyAgICBzbWxzZHggICAgICByNywgcjcsIHIxMiwgcjEwICAgIDsgbzE1ID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKKworICAgIHBraGJ0ICAgICAgIHIwLCByNCwgcjYsIGxzbCAjNCAgOyBbbzEzIHwgbzEyXSwga2VlcCBpbiByZWdpc3RlciBmb3IgUEFSVCAyCisgICAgcGtoYnQgICAgICAgcjYsIHI1LCByNywgbHNsICM0ICA7IFtvMTUgfCBvMTRdCisKKyAgICBzdHIgICAgICAgICByNiwgW3IxLCAjMjhdCisKKworICAgIDsgUEFSVCAyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBsZHIgICAgICAgICByMTEsIGMxMjAwMAorICAgIGxkciAgICAgICAgIHIxMCwgYzUxMDAwCisgICAgbGRyICAgICAgICAgbHIsIGMweDAwMDcwMDA3CisKKyAgICBxYWRkMTYgICAgICByNCwgcjMsIHIwICAgICAgICAgIDsgYTEgPSBbaTEraTEzIHwgaTAraTEyXQorICAgIHFhZGQxNiAgICAgIHI1LCByOSwgcjIgICAgICAgICAgOyBiMSA9IFtpNStpOSAgfCAgaTQraThdCisgICAgcXN1YjE2ICAgICAgcjYsIHI5LCByMiAgICAgICAgICA7IGMxID0gW2k1LWk5ICB8ICBpNC1pOF0KKyAgICBxc3ViMTYgICAgICByNywgcjMsIHIwICAgICAgICAgIDsgZDEgPSBbaTEtaTEzIHwgaTAtaTEyXQorCisgICAgcWFkZDE2ICAgICAgcjQsIHI0LCBsciAgICAgICAgICA7IGExICsgNworCisgICAgYWRkICAgICAgICAgcjAsIHIxMSwgIzB4MTAwMDAgICA7IGFkZCAoZCE9MCkKKworICAgIHFhZGQxNiAgICAgIHIyLCByNCwgcjUgICAgICAgICAgOyBhMSArIGIxICsgNworICAgIHFzdWIxNiAgICAgIHIzLCByNCwgcjUgICAgICAgICAgOyBhMSAtIGIxICsgNworCisgICAgbGRyICAgICAgICAgcjEyLCBjMHgwOGE5MTRlOCAgICA7IFsyMjE3IHwgNTM1Ml0KKworICAgIGxzbCAgICAgICAgIHI4LCByMiwgIzE2ICAgICAgICAgOyBwcmVwYXJlIGJvdHRvbSBoYWxmd29yZCBmb3Igc2NhbGluZworICAgIGFzciAgICAgICAgIHIyLCByMiwgIzQgICAgICAgICAgOyBzY2FsZSB0b3AgaGFsZndvcmQKKyAgICBsc2wgICAgICAgICByOSwgcjMsICMxNiAgICAgICAgIDsgcHJlcGFyZSBib3R0b20gaGFsZndvcmQgZm9yIHNjYWxpbmcKKyAgICBhc3IgICAgICAgICByMywgcjMsICM0ICAgICAgICAgIDsgc2NhbGUgdG9wIGhhbGZ3b3JkCisgICAgcGtodGIgICAgICAgcjQsIHIyLCByOCwgYXNyICMyMCA7IHBhY2sgYW5kIHNjYWxlIGJvdHRvbSBoYWxmd29yZAorICAgIHBraHRiICAgICAgIHI1LCByMywgcjksIGFzciAjMjAgOyBwYWNrIGFuZCBzY2FsZSBib3R0b20gaGFsZndvcmQKKworICAgIHNtdWxidCAgICAgIHIyLCByNiwgcjEyICAgICAgICAgOyBbIC0tLS0tLSB8IGMxKjIyMTddCisgICAgc3RyICAgICAgICAgcjQsIFtyMSwgIzBdICAgICAgICA7IFsgICAgIG8xIHwgICAgICBvMF0KKyAgICBzbXVsdHQgICAgICByMywgcjYsIHIxMiAgICAgICAgIDsgW2MxKjIyMTcgfCAtLS0tLS0gXQorICAgIHN0ciAgICAgICAgIHI1LCBbcjEsICMxNl0gICAgICAgOyBbICAgICBvOSB8ICAgICAgbzhdCisKKyAgICBzbWxhYmIgICAgICByOCwgcjcsIHIxMiwgcjIgICAgIDsgWyAtLS0tLS0gfCBkMSo1MzUyXQorICAgIHNtbGF0YiAgICAgIHI5LCByNywgcjEyLCByMyAgICAgOyBbZDEqNTM1MiB8IC0tLS0tLSBdCisKKyAgICBzbXVsYmIgICAgICByMiwgcjYsIHIxMiAgICAgICAgIDsgWyAtLS0tLS0gfCBjMSo1MzUyXQorICAgIHNtdWx0YiAgICAgIHIzLCByNiwgcjEyICAgICAgICAgOyBbYzEqNTM1MiB8IC0tLS0tLSBdCisKKyAgICBsc2xzICAgICAgICByNiwgcjcsICMxNiAgICAgICAgIDsgZDEgIT0gMCA/CisgICAgYWRkZXEgICAgICAgcjgsIHI4LCByMTEgICAgICAgICA7IGMxX2IqMjIxNytkMV9iKjUzNTIrMTIwMDAgKyAoZD09MCkKKyAgICBhZGRuZSAgICAgICByOCwgcjgsIHIwICAgICAgICAgIDsgYzFfYioyMjE3K2QxX2IqNTM1MisxMjAwMCArIChkIT0wKQorICAgIGFzcnMgICAgICAgIHI2LCByNywgIzE2CisgICAgYWRkZXEgICAgICAgcjksIHI5LCByMTEgICAgICAgICA7IGMxX3QqMjIxNytkMV90KjUzNTIrMTIwMDAgKyAoZD09MCkKKyAgICBhZGRuZSAgICAgICByOSwgcjksIHIwICAgICAgICAgIDsgYzFfdCoyMjE3K2QxX3QqNTM1MisxMjAwMCArIChkIT0wKQorCisgICAgc21sYWJ0ICAgICAgcjQsIHI3LCByMTIsIHIxMCAgICA7IFsgLS0tLS0tIHwgZDEqMjIxN10gKyA1MTAwMAorICAgIHNtbGF0dCAgICAgIHI1LCByNywgcjEyLCByMTAgICAgOyBbZDEqMjIxNyB8IC0tLS0tLSBdICsgNTEwMDAKKworICAgIHBraHRiICAgICAgIHI5LCByOSwgcjgsIGFzciAjMTYKKworICAgIHN1YiAgICAgICAgIHI0LCByNCwgcjIKKyAgICBzdWIgICAgICAgICByNSwgcjUsIHIzCisKKyAgICBsZHIgICAgICAgICByMywgW3IxLCAjNF0gICAgICAgIDsgW2kzIHwgaTJdCisKKyAgICBwa2h0YiAgICAgICByNSwgcjUsIHI0LCBhc3IgIzE2IDsgW28xM3xvMTJdCisKKyAgICBzdHIgICAgICAgICByOSwgW3IxLCAjOF0gICAgICAgIDsgW281IHwgMDRdCisKKyAgICBsZHIgICAgICAgICByOSwgW3IxLCAjMTJdICAgICAgIDsgW2k3IHwgaTZdCisgICAgbGRyICAgICAgICAgcjgsIFtyMSwgIzI4XSAgICAgICA7IFtpMTV8aTE0XQorICAgIGxkciAgICAgICAgIHIyLCBbcjEsICMyMF0gICAgICAgOyBbaTExfGkxMF0KKyAgICBzdHIgICAgICAgICByNSwgW3IxLCAjMjRdICAgICAgIDsgW28xM3xvMTJdCisKKyAgICBxYWRkMTYgICAgICByNCwgcjMsIHI4ICAgICAgICAgIDsgYTEgPSBbaTMraTE1IHwgaTIraTE0XQorICAgIHFhZGQxNiAgICAgIHI1LCByOSwgcjIgICAgICAgICAgOyBiMSA9IFtpNytpMTEgfCBpNitpMTBdCisKKyAgICBxYWRkMTYgICAgICByNCwgcjQsIGxyICAgICAgICAgIDsgYTEgKyA3CisKKyAgICBxc3ViMTYgICAgICByNiwgcjksIHIyICAgICAgICAgIDsgYzEgPSBbaTctaTExIHwgaTYtaTEwXQorICAgIHFhZGQxNiAgICAgIHIyLCByNCwgcjUgICAgICAgICAgOyBhMSArIGIxICsgNworICAgIHFzdWIxNiAgICAgIHI3LCByMywgcjggICAgICAgICAgOyBkMSA9IFtpMy1pMTUgfCBpMi1pMTRdCisgICAgcXN1YjE2ICAgICAgcjMsIHI0LCByNSAgICAgICAgICA7IGExIC0gYjEgKyA3CisKKyAgICBsc2wgICAgICAgICByOCwgcjIsICMxNiAgICAgICAgIDsgcHJlcGFyZSBib3R0b20gaGFsZndvcmQgZm9yIHNjYWxpbmcKKyAgICBhc3IgICAgICAgICByMiwgcjIsICM0ICAgICAgICAgIDsgc2NhbGUgdG9wIGhhbGZ3b3JkCisgICAgbHNsICAgICAgICAgcjksIHIzLCAjMTYgICAgICAgICA7IHByZXBhcmUgYm90dG9tIGhhbGZ3b3JkIGZvciBzY2FsaW5nCisgICAgYXNyICAgICAgICAgcjMsIHIzLCAjNCAgICAgICAgICA7IHNjYWxlIHRvcCBoYWxmd29yZAorICAgIHBraHRiICAgICAgIHI0LCByMiwgcjgsIGFzciAjMjAgOyBwYWNrIGFuZCBzY2FsZSBib3R0b20gaGFsZndvcmQKKyAgICBwa2h0YiAgICAgICByNSwgcjMsIHI5LCBhc3IgIzIwIDsgcGFjayBhbmQgc2NhbGUgYm90dG9tIGhhbGZ3b3JkCisKKyAgICBzbXVsYnQgICAgICByMiwgcjYsIHIxMiAgICAgICAgIDsgWyAtLS0tLS0gfCBjMSoyMjE3XQorICAgIHN0ciAgICAgICAgIHI0LCBbcjEsICM0XSAgICAgICAgOyBbICAgICBvMyB8ICAgICAgbzJdCisgICAgc211bHR0ICAgICAgcjMsIHI2LCByMTIgICAgICAgICA7IFtjMSoyMjE3IHwgLS0tLS0tIF0KKyAgICBzdHIgICAgICAgICByNSwgW3IxLCAjMjBdICAgICAgIDsgWyAgICBvMTEgfCAgICAgbzEwXQorCisgICAgc21sYWJiICAgICAgcjgsIHI3LCByMTIsIHIyICAgICA7IFsgLS0tLS0tIHwgZDEqNTM1Ml0KKyAgICBzbWxhdGIgICAgICByOSwgcjcsIHIxMiwgcjMgICAgIDsgW2QxKjUzNTIgfCAtLS0tLS0gXQorCisgICAgc211bGJiICAgICAgcjIsIHI2LCByMTIgICAgICAgICA7IFsgLS0tLS0tIHwgYzEqNTM1Ml0KKyAgICBzbXVsdGIgICAgICByMywgcjYsIHIxMiAgICAgICAgIDsgW2MxKjUzNTIgfCAtLS0tLS0gXQorCisgICAgbHNscyAgICAgICAgcjYsIHI3LCAjMTYgICAgICAgICA7IGQxICE9IDAgPworICAgIGFkZGVxICAgICAgIHI4LCByOCwgcjExICAgICAgICAgOyBjMV9iKjIyMTcrZDFfYio1MzUyKzEyMDAwICsgKGQ9PTApCisgICAgYWRkbmUgICAgICAgcjgsIHI4LCByMCAgICAgICAgICA7IGMxX2IqMjIxNytkMV9iKjUzNTIrMTIwMDAgKyAoZCE9MCkKKworICAgIGFzcnMgICAgICAgIHI2LCByNywgIzE2CisgICAgYWRkZXEgICAgICAgcjksIHI5LCByMTEgICAgICAgICA7IGMxX3QqMjIxNytkMV90KjUzNTIrMTIwMDAgKyAoZD09MCkKKyAgICBhZGRuZSAgICAgICByOSwgcjksIHIwICAgICAgICAgIDsgYzFfdCoyMjE3K2QxX3QqNTM1MisxMjAwMCArIChkIT0wKQorCisgICAgc21sYWJ0ICAgICAgcjQsIHI3LCByMTIsIHIxMCAgICA7IFsgLS0tLS0tIHwgZDEqMjIxN10gKyA1MTAwMAorICAgIHNtbGF0dCAgICAgIHI1LCByNywgcjEyLCByMTAgICAgOyBbZDEqMjIxNyB8IC0tLS0tLSBdICsgNTEwMDAKKworICAgIHBraHRiICAgICAgIHI5LCByOSwgcjgsIGFzciAjMTYKKworICAgIHN1YiAgICAgICAgIHI0LCByNCwgcjIKKyAgICBzdWIgICAgICAgICByNSwgcjUsIHIzCisKKyAgICBzdHIgICAgICAgICByOSwgW3IxLCAjMTJdICAgICAgIDsgW283IHwgbzZdCisgICAgcGtodGIgICAgICAgcjUsIHI1LCByNCwgYXNyICMxNiA7IFtvMTV8bzE0XQorCisgICAgc3RyICAgICAgICAgcjUsIFtyMSwgIzI4XSAgICAgICA7IFtvMTV8bzE0XQorCisgICAgbGRtZmQgICAgICAgc3AhLCB7cjQgLSByMTIsIHBjfQorCisgICAgRU5EUAorCis7IFVzZWQgY29uc3RhbnRzCitjNzUwMAorICAgIERDRCAgICAgNzUwMAorYzE0NTAwCisgICAgRENEICAgICAxNDUwMAorYzB4MjJhNDUzYTAKKyAgICBEQ0QgICAgIDB4MjJhNDUzYTAKK2MweDAwMDgwMDA4CisgICAgRENEICAgICAweDAwMDgwMDA4CitjMTIwMDAKKyAgICBEQ0QgICAgIDEyMDAwCitjNTEwMDAKKyAgICBEQ0QgICAgIDUxMDAwCitjMHgwMDA3MDAwNworICAgIERDRCAgICAgMHgwMDA3MDAwNworYzB4MDhhOTE0ZTgKKyAgICBEQ0QgICAgIDB4MDhhOTE0ZTgKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfc3VidHJhY3RfYXJtdjYuYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfc3VidHJhY3RfYXJtdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjlmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9zdWJ0cmFjdF9hcm12Ni5hc20KQEAgLTAsMCArMSwyNzIgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfc3VidHJhY3RfbWJ5X2FybXY2fAorICAgIEVYUE9SVCAgfHZwOF9zdWJ0cmFjdF9tYnV2X2FybXY2fAorICAgIEVYUE9SVCAgfHZwOF9zdWJ0cmFjdF9iX2FybXY2fAorCisgICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCisKKzsgcjAgICAgQkxPQ0sgKmJlCis7IHIxICAgIEJMT0NLRCAqYmQKKzsgcjIgICAgaW50IHBpdGNoCit8dnA4X3N1YnRyYWN0X2JfYXJtdjZ8IFBST0MKKworICAgIHN0bWZkICAgc3AhLCB7cjQtcjl9CisKKyAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfYmxvY2tfYmFzZV9zcmNdCisgICAgbGRyICAgICByNSwgW3IwLCAjdnA4X2Jsb2NrX3NyY10KKyAgICBsZHIgICAgIHI2LCBbcjAsICN2cDhfYmxvY2tfc3JjX2RpZmZdCisKKyAgICBsZHIgICAgIHIzLCBbcjRdCisgICAgbGRyICAgICByNywgW3IwLCAjdnA4X2Jsb2NrX3NyY19zdHJpZGVdCisgICAgYWRkICAgICByMywgcjMsIHI1ICAgICAgICAgIDsgc3JjID0gKmJhc2Vfc3JjICsgc3JjCisgICAgbGRyICAgICByOCwgW3IxLCAjdnA4X2Jsb2NrZF9wcmVkaWN0b3JdCisKKyAgICBtb3YgICAgIHI5LCAjNCAgICAgICAgICAgICAgOyBsb29wIGNvdW50CisKK2xvb3BfYmxvY2sKKworICAgIGxkciAgICAgcjAsIFtyM10sIHI3ICAgICAgICA7IHNyYworICAgIGxkciAgICAgcjEsIFtyOF0sIHIyICAgICAgICA7IHByZWQKKworICAgIHV4dGIxNiAgcjQsIHIwICAgICAgICAgICAgICA7IFtzMiB8IHMwXQorICAgIHV4dGIxNiAgcjUsIHIxICAgICAgICAgICAgICA7IFtwMiB8IHAwXQorICAgIHV4dGIxNiAgcjAsIHIwLCByb3IgIzggICAgICA7IFtzMyB8IHMxXQorICAgIHV4dGIxNiAgcjEsIHIxLCByb3IgIzggICAgICA7IFtwMyB8IHAxXQorCisgICAgdXN1YjE2ICByNCwgcjQsIHI1ICAgICAgICAgIDsgW2QyIHwgZDBdCisgICAgdXN1YjE2ICByNSwgcjAsIHIxICAgICAgICAgIDsgW2QzIHwgZDFdCisKKyAgICBzdWJzICAgIHI5LCByOSwgIzEgICAgICAgICAgOyBkZWNyZW1lbnQgbG9vcCBjb3VudGVyCisKKyAgICBwa2hidCAgIHIwLCByNCwgcjUsIGxzbCAjMTYgOyBbZDEgfCBkMF0KKyAgICBwa2h0YiAgIHIxLCByNSwgcjQsIGFzciAjMTYgOyBbZDMgfCBkMl0KKworICAgIHN0ciAgICAgcjAsIFtyNiwgIzBdICAgICAgICA7IGRpZmYKKyAgICBzdHIgICAgIHIxLCBbcjYsICM0XSAgICAgICAgOyBkaWZmCisKKyAgICBhZGQgICAgIHI2LCByNiwgcjIsIGxzbCAjMSAgOyB1cGRhdGUgZGlmZiBwb2ludGVyCisgICAgYm5lICAgICBsb29wX2Jsb2NrCisKKyAgICBsZG1mZCAgIHNwISwge3I0LXI5fQorICAgIG1vdiAgICAgcGMsIGxyCisKKyAgICBFTkRQCisKKworOyByMCAgICBzaG9ydCAqZGlmZgorOyByMSAgICB1bnNpZ25lZCBjaGFyICp1c3JjCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgKnZzcmMKKzsgcjMgICAgaW50IHNyY19zdHJpZGUKKzsgc3AgICAgdW5zaWduZWQgY2hhciAqdXByZWQKKzsgc3AgICAgdW5zaWduZWQgY2hhciAqdnByZWQKKzsgc3AgICAgaW50IHByZWRfc3RyaWRlCit8dnA4X3N1YnRyYWN0X21idXZfYXJtdjZ8IFBST0MKKworICAgIHN0bWZkICAgc3AhLCB7cjQtcjExfQorCisgICAgYWRkICAgICByMCwgcjAsICM1MTIgICAgICAgIDsgc2V0ICpkaWZmIHBvaW50IHRvIENiCisgICAgbW92ICAgICByNCwgIzggICAgICAgICAgICAgIDsgbG9vcCBjb3VudAorICAgIGxkciAgICAgcjUsIFtzcCwgIzMyXSAgICAgICA7IHVwcmVkCisgICAgbGRyICAgICByMTIsIFtzcCwgIzQwXSAgICAgIDsgcHJlZF9zdHJpZGUKKworICAgIDsgU3VidHJhY3QgVSBibG9jaworbG9vcF91CisgICAgbGRyICAgICByNiwgW3IxXSAgICAgICAgICAgIDsgdXNyYyAgICAgIChBKQorICAgIGxkciAgICAgcjcsIFtyNV0gICAgICAgICAgICA7IHVwcmVkICAgICAoQSkKKworICAgIHV4dGIxNiAgcjgsIHI2ICAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoQSkKKyAgICB1eHRiMTYgIHI5LCByNyAgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEEpCisgICAgdXh0YjE2ICByMTAsIHI2LCByb3IgIzggICAgIDsgW3MzIHwgczFdIChBKQorICAgIHV4dGIxNiAgcjExLCByNywgcm9yICM4ICAgICA7IFtwMyB8IHAxXSAoQSkKKworICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoQSkKKyAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEEpCisKKyAgICBsZHIgICAgIHIxMCwgW3IxLCAjNF0gICAgICAgOyB1c3JjICAgICAgKEIpCisgICAgbGRyICAgICByMTEsIFtyNSwgIzRdICAgICAgIDsgdXByZWQgICAgIChCKQorCisgICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChBKQorICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQSkKKworICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQSkKKyAgICB1eHRiMTYgIHI4LCByMTAgICAgICAgICAgICAgOyBbczIgfCBzMF0gKEIpCisgICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChBKQorCisgICAgdXh0YjE2ICByOSwgcjExICAgICAgICAgICAgIDsgW3AyIHwgcDBdIChCKQorICAgIHV4dGIxNiAgcjEwLCByMTAsIHJvciAjOCAgICA7IFtzMyB8IHMxXSAoQikKKyAgICB1eHRiMTYgIHIxMSwgcjExLCByb3IgIzggICAgOyBbcDMgfCBwMV0gKEIpCisKKyAgICB1c3ViMTYgIHI2LCByOCwgcjkgICAgICAgICAgOyBbZDIgfCBkMF0gKEIpCisgICAgdXN1YjE2ICByNywgcjEwLCByMTEgICAgICAgIDsgW2QzIHwgZDFdIChCKQorCisgICAgYWRkICAgICByMSwgcjEsIHIzICAgICAgICAgIDsgdXBkYXRlIHVzcmMgcG9pbnRlcgorICAgIGFkZCAgICAgcjUsIHI1LCByMTIgICAgICAgICA7IHVwZGF0ZSB1cHJlZCBwb2ludGVyCisKKyAgICBwa2hidCAgIHI4LCByNiwgcjcsIGxzbCAjMTYgOyBbZDEgfCBkMF0gKEIpCisgICAgcGtodGIgICByOSwgcjcsIHI2LCBhc3IgIzE2IDsgW2QzIHwgZDJdIChCKQorCisgICAgc3RyICAgICByOCwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChCKQorICAgIHN1YnMgICAgcjQsIHI0LCAjMSAgICAgICAgICA7IHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICBzdHIgICAgIHI5LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEIpCisKKyAgICBibmUgICAgIGxvb3BfdQorCisgICAgbGRyICAgICByNSwgW3NwLCAjMzZdICAgICAgIDsgdnByZWQKKyAgICBtb3YgICAgIHI0LCAjOCAgICAgICAgICAgICAgOyBsb29wIGNvdW50CisKKyAgICA7IFN1YnRyYWN0IFYgYmxvY2sKK2xvb3BfdgorICAgIGxkciAgICAgcjYsIFtyMl0gICAgICAgICAgICA7IHZzcmMgICAgICAoQSkKKyAgICBsZHIgICAgIHI3LCBbcjVdICAgICAgICAgICAgOyB2cHJlZCAgICAgKEEpCisKKyAgICB1eHRiMTYgIHI4LCByNiAgICAgICAgICAgICAgOyBbczIgfCBzMF0gKEEpCisgICAgdXh0YjE2ICByOSwgcjcgICAgICAgICAgICAgIDsgW3AyIHwgcDBdIChBKQorICAgIHV4dGIxNiAgcjEwLCByNiwgcm9yICM4ICAgICA7IFtzMyB8IHMxXSAoQSkKKyAgICB1eHRiMTYgIHIxMSwgcjcsIHJvciAjOCAgICAgOyBbcDMgfCBwMV0gKEEpCisKKyAgICB1c3ViMTYgIHI2LCByOCwgcjkgICAgICAgICAgOyBbZDIgfCBkMF0gKEEpCisgICAgdXN1YjE2ICByNywgcjEwLCByMTEgICAgICAgIDsgW2QzIHwgZDFdIChBKQorCisgICAgbGRyICAgICByMTAsIFtyMiwgIzRdICAgICAgIDsgdnNyYyAgICAgIChCKQorICAgIGxkciAgICAgcjExLCBbcjUsICM0XSAgICAgICA7IHZwcmVkICAgICAoQikKKworICAgIHBraGJ0ICAgcjgsIHI2LCByNywgbHNsICMxNiA7IFtkMSB8IGQwXSAoQSkKKyAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgOyBbZDMgfCBkMl0gKEEpCisKKyAgICBzdHIgICAgIHI4LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEEpCisgICAgdXh0YjE2ICByOCwgcjEwICAgICAgICAgICAgIDsgW3MyIHwgczBdIChCKQorICAgIHN0ciAgICAgcjksIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQSkKKworICAgIHV4dGIxNiAgcjksIHIxMSAgICAgICAgICAgICA7IFtwMiB8IHAwXSAoQikKKyAgICB1eHRiMTYgIHIxMCwgcjEwLCByb3IgIzggICAgOyBbczMgfCBzMV0gKEIpCisgICAgdXh0YjE2ICByMTEsIHIxMSwgcm9yICM4ICAgIDsgW3AzIHwgcDFdIChCKQorCisgICAgdXN1YjE2ICByNiwgcjgsIHI5ICAgICAgICAgIDsgW2QyIHwgZDBdIChCKQorICAgIHVzdWIxNiAgcjcsIHIxMCwgcjExICAgICAgICA7IFtkMyB8IGQxXSAoQikKKworICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHVwZGF0ZSB2c3JjIHBvaW50ZXIKKyAgICBhZGQgICAgIHI1LCByNSwgcjEyICAgICAgICAgOyB1cGRhdGUgdnByZWQgcG9pbnRlcgorCisgICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChCKQorICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQikKKworICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQikKKyAgICBzdWJzICAgIHI0LCByNCwgIzEgICAgICAgICAgOyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChCKQorCisgICAgYm5lICAgICBsb29wX3YKKworICAgIGxkbWZkICAgc3AhLCB7cjQtcjExfQorICAgIGJ4ICAgICAgbHIKKworICAgIEVORFAKKworCis7IHIwICAgIHNob3J0ICpkaWZmCis7IHIxICAgIHVuc2lnbmVkIGNoYXIgKnNyYworOyByMiAgICBpbnQgc3JjX3N0cmlkZQorOyByMyAgICB1bnNpZ25lZCBjaGFyICpwcmVkCis7IHNwICAgIGludCBwcmVkX3N0cmlkZQorfHZwOF9zdWJ0cmFjdF9tYnlfYXJtdjZ8IFBST0MKKworICAgIHN0bWZkICAgc3AhLCB7cjQtcjExfQorICAgIGxkciAgICAgcjEyLCBbc3AsICMzMl0gICAgICA7IHByZWRfc3RyaWRlCisgICAgbW92ICAgICByNCwgIzE2Citsb29wCisgICAgbGRyICAgICByNiwgW3IxXSAgICAgICAgICAgIDsgc3JjICAgICAgIChBKQorICAgIGxkciAgICAgcjcsIFtyM10gICAgICAgICAgICA7IHByZWQgICAgICAoQSkKKworICAgIHV4dGIxNiAgcjgsIHI2ICAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoQSkKKyAgICB1eHRiMTYgIHI5LCByNyAgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEEpCisgICAgdXh0YjE2ICByMTAsIHI2LCByb3IgIzggICAgIDsgW3MzIHwgczFdIChBKQorICAgIHV4dGIxNiAgcjExLCByNywgcm9yICM4ICAgICA7IFtwMyB8IHAxXSAoQSkKKworICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoQSkKKyAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEEpCisKKyAgICBsZHIgICAgIHIxMCwgW3IxLCAjNF0gICAgICAgOyBzcmMgICAgICAgKEIpCisgICAgbGRyICAgICByMTEsIFtyMywgIzRdICAgICAgIDsgcHJlZCAgICAgIChCKQorCisgICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChBKQorICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQSkKKworICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQSkKKyAgICB1eHRiMTYgIHI4LCByMTAgICAgICAgICAgICAgOyBbczIgfCBzMF0gKEIpCisgICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChBKQorCisgICAgdXh0YjE2ICByOSwgcjExICAgICAgICAgICAgIDsgW3AyIHwgcDBdIChCKQorICAgIHV4dGIxNiAgcjEwLCByMTAsIHJvciAjOCAgICA7IFtzMyB8IHMxXSAoQikKKyAgICB1eHRiMTYgIHIxMSwgcjExLCByb3IgIzggICAgOyBbcDMgfCBwMV0gKEIpCisKKyAgICB1c3ViMTYgIHI2LCByOCwgcjkgICAgICAgICAgOyBbZDIgfCBkMF0gKEIpCisgICAgdXN1YjE2ICByNywgcjEwLCByMTEgICAgICAgIDsgW2QzIHwgZDFdIChCKQorCisgICAgbGRyICAgICByMTAsIFtyMSwgIzhdICAgICAgIDsgc3JjICAgICAgIChDKQorICAgIGxkciAgICAgcjExLCBbcjMsICM4XSAgICAgICA7IHByZWQgICAgICAoQykKKworICAgIHBraGJ0ICAgcjgsIHI2LCByNywgbHNsICMxNiA7IFtkMSB8IGQwXSAoQikKKyAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgOyBbZDMgfCBkMl0gKEIpCisKKyAgICBzdHIgICAgIHI4LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEIpCisgICAgdXh0YjE2ICByOCwgcjEwICAgICAgICAgICAgIDsgW3MyIHwgczBdIChDKQorICAgIHN0ciAgICAgcjksIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQikKKworICAgIHV4dGIxNiAgcjksIHIxMSAgICAgICAgICAgICA7IFtwMiB8IHAwXSAoQykKKyAgICB1eHRiMTYgIHIxMCwgcjEwLCByb3IgIzggICAgOyBbczMgfCBzMV0gKEMpCisgICAgdXh0YjE2ICByMTEsIHIxMSwgcm9yICM4ICAgIDsgW3AzIHwgcDFdIChDKQorCisgICAgdXN1YjE2ICByNiwgcjgsIHI5ICAgICAgICAgIDsgW2QyIHwgZDBdIChDKQorICAgIHVzdWIxNiAgcjcsIHIxMCwgcjExICAgICAgICA7IFtkMyB8IGQxXSAoQykKKworICAgIGxkciAgICAgcjEwLCBbcjEsICMxMl0gICAgICA7IHNyYyAgICAgICAoRCkKKyAgICBsZHIgICAgIHIxMSwgW3IzLCAjMTJdICAgICAgOyBwcmVkICAgICAgKEQpCisKKyAgICBwa2hidCAgIHI4LCByNiwgcjcsIGxzbCAjMTYgOyBbZDEgfCBkMF0gKEMpCisgICAgcGtodGIgICByOSwgcjcsIHI2LCBhc3IgIzE2IDsgW2QzIHwgZDJdIChDKQorCisgICAgc3RyICAgICByOCwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChDKQorICAgIHV4dGIxNiAgcjgsIHIxMCAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoRCkKKyAgICBzdHIgICAgIHI5LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEMpCisKKyAgICB1eHRiMTYgIHI5LCByMTEgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEQpCisgICAgdXh0YjE2ICByMTAsIHIxMCwgcm9yICM4ICAgIDsgW3MzIHwgczFdIChEKQorICAgIHV4dGIxNiAgcjExLCByMTEsIHJvciAjOCAgICA7IFtwMyB8IHAxXSAoRCkKKworICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoRCkKKyAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEQpCisKKyAgICBhZGQgICAgIHIxLCByMSwgcjIgICAgICAgICAgOyB1cGRhdGUgc3JjIHBvaW50ZXIKKyAgICBhZGQgICAgIHIzLCByMywgcjEyICAgICAgICAgOyB1cGRhdGUgcHJlZCBwb2ludGVyCisKKyAgICBwa2hidCAgIHI4LCByNiwgcjcsIGxzbCAjMTYgOyBbZDEgfCBkMF0gKEQpCisgICAgcGtodGIgICByOSwgcjcsIHI2LCBhc3IgIzE2IDsgW2QzIHwgZDJdIChEKQorCisgICAgc3RyICAgICByOCwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChEKQorICAgIHN1YnMgICAgcjQsIHI0LCAjMSAgICAgICAgICA7IHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICBzdHIgICAgIHI5LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEQpCisKKyAgICBibmUgICAgIGxvb3AKKworICAgIGxkbWZkICAgc3AhLCB7cjQtcjExfQorICAgIGJ4ICAgICAgbHIKKworICAgIEVORFAKKworICAgIEVORAorCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY2L3dhbHNoX3Y2LmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYXJtdjYvd2Fsc2hfdjYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYWYzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2FybXY2L3dhbHNoX3Y2LmFzbQpAQCAtMCwwICsxLDIxMiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKyAgICBFWFBPUlQgfHZwOF9zaG9ydF93YWxzaDR4NF9hcm12NnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCisKKztzaG9ydCB2cDhfc2hvcnRfd2Fsc2g0eDRfYXJtdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCis7IHIwICAgIHNob3J0ICppbnB1dCwKKzsgcjEgICAgc2hvcnQgKm91dHB1dCwKKzsgcjIgICAgaW50IHBpdGNoCit8dnA4X3Nob3J0X3dhbHNoNHg0X2FybXY2fCBQUk9DCisKKyAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CisKKyAgICBsZHJkICAgICAgICByNCwgcjUsIFtyMF0sIHIyCisgICAgbGRyICAgICAgICAgbHIsIGMwMDA0MDAwNAorICAgIGxkcmQgICAgICAgIHI2LCByNywgW3IwXSwgcjIKKworICAgIDsgMC0zCisgICAgcWFkZDE2ICAgICAgcjMsIHI0LCByNSAgICAgICAgICA7IFtkMXxhMV0gWzErMyAgIHwgICAwKzJdCisgICAgcXN1YjE2ICAgICAgcjQsIHI0LCByNSAgICAgICAgICA7IFtjMXxiMV0gWzEtMyAgIHwgICAwLTJdCisKKyAgICBsZHJkICAgICAgICByOCwgcjksIFtyMF0sIHIyCisgICAgOyA0LTcKKyAgICBxYWRkMTYgICAgICByNSwgcjYsIHI3ICAgICAgICAgIDsgW2QxfGExXSBbNSs3ICAgfCAgIDQrNl0KKyAgICBxc3ViMTYgICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgW2MxfGIxXSBbNS03ICAgfCAgIDQtNl0KKworICAgIGxkcmQgICAgICAgIHIxMCwgcjExLCBbcjBdCisgICAgOyA4LTExCisgICAgcWFkZDE2ICAgICAgcjcsIHI4LCByOSAgICAgICAgICA7IFtkMXxhMV0gWzkrMTEgIHwgIDgrMTBdCisgICAgcXN1YjE2ICAgICAgcjgsIHI4LCByOSAgICAgICAgICA7IFtjMXxiMV0gWzktMTEgIHwgIDgtMTBdCisKKyAgICA7IDEyLTE1CisgICAgcWFkZDE2ICAgICAgcjksIHIxMCwgcjExICAgICAgICA7IFtkMXxhMV0gWzEzKzE1IHwgMTIrMTRdCisgICAgcXN1YjE2ICAgICAgcjEwLCByMTAsIHIxMSAgICAgICA7IFtjMXxiMV0gWzEzLTE1IHwgMTItMTRdCisKKworICAgIGxzbHMgICAgICAgIHIyLCByMywgIzE2CisgICAgc211YWQgICAgICAgcjExLCByMywgbHIgICAgICAgICA7IEEwID0gYTE8PDIgKyBkMTw8MgorICAgIGFkZG5lICAgICAgIHIxMSwgcjExLCAjMSAgICAgICAgOyBBMCArPSAoYTEhPTApCisKKyAgICBsc2xzICAgICAgICByMiwgcjcsICMxNgorICAgIHNtdWFkICAgICAgIHIxMiwgcjcsIGxyICAgICAgICAgOyBDMCA9IGExPDwyICsgZDE8PDIKKyAgICBhZGRuZSAgICAgICByMTIsIHIxMiwgIzEgICAgICAgIDsgQzAgKz0gKGExIT0wKQorCisgICAgYWRkICAgICAgICAgcjAsIHIxMSwgcjEyICAgICAgICA7IGExXzAgPSBBMCArIEMwCisgICAgc3ViICAgICAgICAgcjExLCByMTEsIHIxMiAgICAgICA7IGIxXzAgPSBBMCAtIEMwCisKKyAgICBsc2xzICAgICAgICByMiwgcjUsICMxNgorICAgIHNtdWFkICAgICAgIHIxMiwgcjUsIGxyICAgICAgICAgOyBCMCA9IGExPDwyICsgZDE8PDIKKyAgICBhZGRuZSAgICAgICByMTIsIHIxMiwgIzEgICAgICAgIDsgQjAgKz0gKGExIT0wKQorCisgICAgbHNscyAgICAgICAgcjIsIHI5LCAjMTYKKyAgICBzbXVhZCAgICAgICByMiwgcjksIGxyICAgICAgICAgIDsgRDAgPSBhMTw8MiArIGQxPDwyCisgICAgYWRkbmUgICAgICAgcjIsIHIyLCAjMSAgICAgICAgICA7IEQwICs9IChhMSE9MCkKKworICAgIGFkZCAgICAgICAgIGxyLCByMTIsIHIyICAgICAgICAgOyBkMV8wID0gQjAgKyBEMAorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByMiAgICAgICAgOyBjMV8wID0gQjAgLSBEMAorCisgICAgOyBvcFswLDQsOCwxMl0KKyAgICBhZGRzICAgICAgICByMiwgcjAsIGxyICAgICAgICAgIDsgYTIgPSBhMV8wICsgZDFfMAorICAgIGFkZG1pICAgICAgIHIyLCByMiwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByMiwgcjIsICMzICAgICAgICAgIDsgKz0gMworICAgIHN1YnMgICAgICAgIHIwLCByMCwgbHIgICAgICAgICAgOyBkMiA9IGExXzAgLSBkMV8wCisgICAgbW92ICAgICAgICAgcjIsIHIyLCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByMiwgW3IxXSAgICAgICAgICAgIDsgb3BbMF0KKworICAgIGFkZG1pICAgICAgIHIwLCByMCwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByMCwgcjAsICMzICAgICAgICAgIDsgKz0gMworICAgIGxkciAgICAgICAgIGxyLCBjMDAwNDAwMDQKKyAgICBtb3YgICAgICAgICByMCwgcjAsIGFzciAjMyAgICAgIDsgPj4gMworICAgIHN0cmggICAgICAgIHIwLCBbcjEsICMyNF0gICAgICAgOyBvcFsxMl0KKworICAgIGFkZHMgICAgICAgIHIyLCByMTEsIHIxMiAgICAgICAgOyBiMiA9IGIxXzAgKyBjMV8wCisgICAgYWRkbWkgICAgICAgcjIsIHIyLCAjMSAgICAgICAgICA7ICs9IGEyIDwgMAorICAgIGFkZCAgICAgICAgIHIyLCByMiwgIzMgICAgICAgICAgOyArPSAzCisgICAgc3VicyAgICAgICAgcjAsIHIxMSwgcjEyICAgICAgICA7IGMyID0gYjFfMCAtIGMxXzAKKyAgICBtb3YgICAgICAgICByMiwgcjIsIGFzciAjMyAgICAgIDsgPj4gMworICAgIHN0cmggICAgICAgIHIyLCBbcjEsICM4XSAgICAgICAgOyBvcFs0XQorCisgICAgYWRkbWkgICAgICAgcjAsIHIwLCAjMSAgICAgICAgICA7ICs9IGEyIDwgMAorICAgIGFkZCAgICAgICAgIHIwLCByMCwgIzMgICAgICAgICAgOyArPSAzCisgICAgc211c2QgICAgICAgcjMsIHIzLCBsciAgICAgICAgICA7IEEzID0gYTE8PDIgLSBkMTw8MgorICAgIHNtdXNkICAgICAgIHI3LCByNywgbHIgICAgICAgICAgOyBDMyA9IGExPDwyIC0gZDE8PDIKKyAgICBtb3YgICAgICAgICByMCwgcjAsIGFzciAjMyAgICAgIDsgPj4gMworICAgIHN0cmggICAgICAgIHIwLCBbcjEsICMxNl0gICAgICAgOyBvcFs4XQorCisKKyAgICA7IG9wWzMsNywxMSwxNV0KKyAgICBhZGQgICAgICAgICByMCwgcjMsIHI3ICAgICAgICAgIDsgYTFfMyA9IEEzICsgQzMKKyAgICBzdWIgICAgICAgICByMywgcjMsIHI3ICAgICAgICAgIDsgYjFfMyA9IEEzIC0gQzMKKworICAgIHNtdXNkICAgICAgIHI1LCByNSwgbHIgICAgICAgICAgOyBCMyA9IGExPDwyIC0gZDE8PDIKKyAgICBzbXVzZCAgICAgICByOSwgcjksIGxyICAgICAgICAgIDsgRDMgPSBhMTw8MiAtIGQxPDwyCisgICAgYWRkICAgICAgICAgcjcsIHI1LCByOSAgICAgICAgICA7IGQxXzMgPSBCMyArIEQzCisgICAgc3ViICAgICAgICAgcjUsIHI1LCByOSAgICAgICAgICA7IGMxXzMgPSBCMyAtIEQzCisKKyAgICBhZGRzICAgICAgICByMiwgcjAsIHI3ICAgICAgICAgIDsgYTIgPSBhMV8zICsgZDFfMworICAgIGFkZG1pICAgICAgIHIyLCByMiwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByMiwgcjIsICMzICAgICAgICAgIDsgKz0gMworICAgIGFkZHMgICAgICAgIHI5LCByMywgcjUgICAgICAgICAgOyBiMiA9IGIxXzMgKyBjMV8zCisgICAgbW92ICAgICAgICAgcjIsIHIyLCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByMiwgW3IxLCAjNl0gICAgICAgIDsgb3BbM10KKworICAgIGFkZG1pICAgICAgIHI5LCByOSwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByOSwgcjksICMzICAgICAgICAgIDsgKz0gMworICAgIHN1YnMgICAgICAgIHIyLCByMywgcjUgICAgICAgICAgOyBjMiA9IGIxXzMgLSBjMV8zCisgICAgbW92ICAgICAgICAgcjksIHI5LCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByOSwgW3IxLCAjMTRdICAgICAgIDsgb3BbN10KKworICAgIGFkZG1pICAgICAgIHIyLCByMiwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByMiwgcjIsICMzICAgICAgICAgIDsgKz0gMworICAgIHN1YnMgICAgICAgIHI5LCByMCwgcjcgICAgICAgICAgOyBkMiA9IGExXzMgLSBkMV8zCisgICAgbW92ICAgICAgICAgcjIsIHIyLCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByMiwgW3IxLCAjMjJdICAgICAgIDsgb3BbMTFdCisKKyAgICBhZGRtaSAgICAgICByOSwgcjksICMxICAgICAgICAgIDsgKz0gYTIgPCAwCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjMyAgICAgICAgICA7ICs9IDMKKyAgICBzbXVhZCAgICAgICByMywgcjQsIGxyICAgICAgICAgIDsgQTEgPSBiMTw8MiArIGMxPDwyCisgICAgc211YWQgICAgICAgcjUsIHI4LCBsciAgICAgICAgICA7IEMxID0gYjE8PDIgKyBjMTw8MgorICAgIG1vdiAgICAgICAgIHI5LCByOSwgYXNyICMzICAgICAgOyA+PiAzCisgICAgc3RyaCAgICAgICAgcjksIFtyMSwgIzMwXSAgICAgICA7IG9wWzE1XQorCisgICAgOyBvcFsxLDUsOSwxM10KKyAgICBhZGQgICAgICAgICByMCwgcjMsIHI1ICAgICAgICAgIDsgYTFfMSA9IEExICsgQzEKKyAgICBzdWIgICAgICAgICByMywgcjMsIHI1ICAgICAgICAgIDsgYjFfMSA9IEExIC0gQzEKKworICAgIHNtdWFkICAgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBCMSA9IGIxPDwyICsgYzE8PDIKKyAgICBzbXVhZCAgICAgICByOSwgcjEwLCBsciAgICAgICAgIDsgRDEgPSBiMTw8MiArIGMxPDwyCisgICAgYWRkICAgICAgICAgcjUsIHI3LCByOSAgICAgICAgICA7IGQxXzEgPSBCMSArIEQxCisgICAgc3ViICAgICAgICAgcjcsIHI3LCByOSAgICAgICAgICA7IGMxXzEgPSBCMSAtIEQxCisKKyAgICBhZGRzICAgICAgICByMiwgcjAsIHI1ICAgICAgICAgIDsgYTIgPSBhMV8xICsgZDFfMQorICAgIGFkZG1pICAgICAgIHIyLCByMiwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByMiwgcjIsICMzICAgICAgICAgIDsgKz0gMworICAgIGFkZHMgICAgICAgIHI5LCByMywgcjcgICAgICAgICAgOyBiMiA9IGIxXzEgKyBjMV8xCisgICAgbW92ICAgICAgICAgcjIsIHIyLCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByMiwgW3IxLCAjMl0gICAgICAgIDsgb3BbMV0KKworICAgIGFkZG1pICAgICAgIHI5LCByOSwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByOSwgcjksICMzICAgICAgICAgIDsgKz0gMworICAgIHN1YnMgICAgICAgIHIyLCByMywgcjcgICAgICAgICAgOyBjMiA9IGIxXzEgLSBjMV8xCisgICAgbW92ICAgICAgICAgcjksIHI5LCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByOSwgW3IxLCAjMTBdICAgICAgIDsgb3BbNV0KKworICAgIGFkZG1pICAgICAgIHIyLCByMiwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByMiwgcjIsICMzICAgICAgICAgIDsgKz0gMworICAgIHN1YnMgICAgICAgIHI5LCByMCwgcjUgICAgICAgICAgOyBkMiA9IGExXzEgLSBkMV8xCisgICAgbW92ICAgICAgICAgcjIsIHIyLCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByMiwgW3IxLCAjMThdICAgICAgIDsgb3BbOV0KKworICAgIGFkZG1pICAgICAgIHI5LCByOSwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByOSwgcjksICMzICAgICAgICAgIDsgKz0gMworICAgIHNtdXNkICAgICAgIHI0LCByNCwgbHIgICAgICAgICAgOyBBMiA9IGIxPDwyIC0gYzE8PDIKKyAgICBzbXVzZCAgICAgICByOCwgcjgsIGxyICAgICAgICAgIDsgQzIgPSBiMTw8MiAtIGMxPDwyCisgICAgbW92ICAgICAgICAgcjksIHI5LCBhc3IgIzMgICAgICA7ID4+IDMKKyAgICBzdHJoICAgICAgICByOSwgW3IxLCAjMjZdICAgICAgIDsgb3BbMTNdCisKKworICAgIDsgb3BbMiw2LDEwLDE0XQorICAgIGFkZCAgICAgICAgIHIxMSwgcjQsIHI4ICAgICAgICAgOyBhMV8yID0gQTIgKyBDMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjQsIHI4ICAgICAgICAgOyBiMV8yID0gQTIgLSBDMgorCisgICAgc211c2QgICAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IEIyID0gYjE8PDIgLSBjMTw8MgorICAgIHNtdXNkICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgOyBEMiA9IGIxPDwyIC0gYzE8PDIKKyAgICBhZGQgICAgICAgICByNCwgcjYsIHIxMCAgICAgICAgIDsgZDFfMiA9IEIyICsgRDIKKyAgICBzdWIgICAgICAgICByOCwgcjYsIHIxMCAgICAgICAgIDsgYzFfMiA9IEIyIC0gRDIKKworICAgIGFkZHMgICAgICAgIHIyLCByMTEsIHI0ICAgICAgICAgOyBhMiA9IGExXzIgKyBkMV8yCisgICAgYWRkbWkgICAgICAgcjIsIHIyLCAjMSAgICAgICAgICA7ICs9IGEyIDwgMAorICAgIGFkZCAgICAgICAgIHIyLCByMiwgIzMgICAgICAgICAgOyArPSAzCisgICAgYWRkcyAgICAgICAgcjksIHIxMiwgcjggICAgICAgICA7IGIyID0gYjFfMiArIGMxXzIKKyAgICBtb3YgICAgICAgICByMiwgcjIsIGFzciAjMyAgICAgIDsgPj4gMworICAgIHN0cmggICAgICAgIHIyLCBbcjEsICM0XSAgICAgICAgOyBvcFsyXQorCisgICAgYWRkbWkgICAgICAgcjksIHI5LCAjMSAgICAgICAgICA7ICs9IGEyIDwgMAorICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzMgICAgICAgICAgOyArPSAzCisgICAgc3VicyAgICAgICAgcjIsIHIxMiwgcjggICAgICAgICA7IGMyID0gYjFfMiAtIGMxXzIKKyAgICBtb3YgICAgICAgICByOSwgcjksIGFzciAjMyAgICAgIDsgPj4gMworICAgIHN0cmggICAgICAgIHI5LCBbcjEsICMxMl0gICAgICAgOyBvcFs2XQorCisgICAgYWRkbWkgICAgICAgcjIsIHIyLCAjMSAgICAgICAgICA7ICs9IGEyIDwgMAorICAgIGFkZCAgICAgICAgIHIyLCByMiwgIzMgICAgICAgICAgOyArPSAzCisgICAgc3VicyAgICAgICAgcjksIHIxMSwgcjQgICAgICAgICA7IGQyID0gYTFfMiAtIGQxXzIKKyAgICBtb3YgICAgICAgICByMiwgcjIsIGFzciAjMyAgICAgIDsgPj4gMworICAgIHN0cmggICAgICAgIHIyLCBbcjEsICMyMF0gICAgICAgOyBvcFsxMF0KKworICAgIGFkZG1pICAgICAgIHI5LCByOSwgIzEgICAgICAgICAgOyArPSBhMiA8IDAKKyAgICBhZGQgICAgICAgICByOSwgcjksICMzICAgICAgICAgIDsgKz0gMworICAgIG1vdiAgICAgICAgIHI5LCByOSwgYXNyICMzICAgICAgOyA+PiAzCisgICAgc3RyaCAgICAgICAgcjksIFtyMSwgIzI4XSAgICAgICA7IG9wWzE0XQorCisKKyAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9CisgICAgRU5EUCAgICAgICAgOyB8dnA4X3Nob3J0X3dhbHNoNHg0X2FybXY2fAorCitjMDAwNDAwMDQKKyAgICBEQ0QgICAgICAgICAweDAwMDQwMDA0CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vYm9vbGh1ZmZfYXJtLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2Jvb2xodWZmX2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTk0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL2Jvb2xodWZmX2FybS5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnA4L2VuY29kZXIvYm9vbGh1ZmYuaCIKKyNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCisKK2NvbnN0IHVuc2lnbmVkIGludCB2cDhfcHJvYl9jb3N0WzI1Nl0gPQoreworICAgIDIwNDcsIDIwNDcsIDE3OTEsIDE2NDEsIDE1MzUsIDE0NTIsIDEzODUsIDEzMjgsIDEyNzksIDEyMzUsIDExOTYsIDExNjEsIDExMjksIDEwOTksIDEwNzIsIDEwNDYsCisgICAgMTAyMywgMTAwMCwgIDk3OSwgIDk1OSwgIDk0MCwgIDkyMiwgIDkwNSwgIDg4OSwgIDg3MywgIDg1OCwgIDg0MywgIDgyOSwgIDgxNiwgIDgwMywgIDc5MCwgIDc3OCwKKyAgICA3NjcsICA3NTUsICA3NDQsICA3MzMsICA3MjMsICA3MTMsICA3MDMsICA2OTMsICA2ODQsICA2NzUsICA2NjYsICA2NTcsICA2NDksICA2NDEsICA2MzMsICA2MjUsCisgICAgNjE3LCAgNjA5LCAgNjAyLCAgNTk0LCAgNTg3LCAgNTgwLCAgNTczLCAgNTY3LCAgNTYwLCAgNTUzLCAgNTQ3LCAgNTQxLCAgNTM0LCAgNTI4LCAgNTIyLCAgNTE2LAorICAgIDUxMSwgIDUwNSwgIDQ5OSwgIDQ5NCwgIDQ4OCwgIDQ4MywgIDQ3NywgIDQ3MiwgIDQ2NywgIDQ2MiwgIDQ1NywgIDQ1MiwgIDQ0NywgIDQ0MiwgIDQzNywgIDQzMywKKyAgICA0MjgsICA0MjQsICA0MTksICA0MTUsICA0MTAsICA0MDYsICA0MDEsICAzOTcsICAzOTMsICAzODksICAzODUsICAzODEsICAzNzcsICAzNzMsICAzNjksICAzNjUsCisgICAgMzYxLCAgMzU3LCAgMzUzLCAgMzQ5LCAgMzQ2LCAgMzQyLCAgMzM4LCAgMzM1LCAgMzMxLCAgMzI4LCAgMzI0LCAgMzIxLCAgMzE3LCAgMzE0LCAgMzExLCAgMzA3LAorICAgIDMwNCwgIDMwMSwgIDI5NywgIDI5NCwgIDI5MSwgIDI4OCwgIDI4NSwgIDI4MSwgIDI3OCwgIDI3NSwgIDI3MiwgIDI2OSwgIDI2NiwgIDI2MywgIDI2MCwgIDI1NywKKyAgICAyNTUsICAyNTIsICAyNDksICAyNDYsICAyNDMsICAyNDAsICAyMzgsICAyMzUsICAyMzIsICAyMjksICAyMjcsICAyMjQsICAyMjEsICAyMTksICAyMTYsICAyMTQsCisgICAgMjExLCAgMjA4LCAgMjA2LCAgMjAzLCAgMjAxLCAgMTk4LCAgMTk2LCAgMTk0LCAgMTkxLCAgMTg5LCAgMTg2LCAgMTg0LCAgMTgxLCAgMTc5LCAgMTc3LCAgMTc0LAorICAgIDE3MiwgIDE3MCwgIDE2OCwgIDE2NSwgIDE2MywgIDE2MSwgIDE1OSwgIDE1NiwgIDE1NCwgIDE1MiwgIDE1MCwgIDE0OCwgIDE0NSwgIDE0MywgIDE0MSwgIDEzOSwKKyAgICAxMzcsICAxMzUsICAxMzMsICAxMzEsICAxMjksICAxMjcsICAxMjUsICAxMjMsICAxMjEsICAxMTksICAxMTcsICAxMTUsICAxMTMsICAxMTEsICAxMDksICAxMDcsCisgICAgMTA1LCAgMTAzLCAgMTAxLCAgIDk5LCAgIDk3LCAgIDk1LCAgIDkzLCAgIDkyLCAgIDkwLCAgIDg4LCAgIDg2LCAgIDg0LCAgIDgyLCAgIDgxLCAgIDc5LCAgIDc3LAorICAgIDc1LCAgIDczLCAgIDcyLCAgIDcwLCAgIDY4LCAgIDY2LCAgIDY1LCAgIDYzLCAgIDYxLCAgIDYwLCAgIDU4LCAgIDU2LCAgIDU1LCAgIDUzLCAgIDUxLCAgIDUwLAorICAgIDQ4LCAgIDQ2LCAgIDQ1LCAgIDQzLCAgIDQxLCAgIDQwLCAgIDM4LCAgIDM3LCAgIDM1LCAgIDMzLCAgIDMyLCAgIDMwLCAgIDI5LCAgIDI3LCAgIDI1LCAgIDI0LAorICAgIDIyLCAgIDIxLCAgIDE5LCAgIDE4LCAgIDE2LCAgIDE1LCAgIDEzLCAgIDEyLCAgIDEwLCAgICA5LCAgICA3LCAgICA2LCAgICA0LCAgICAzLCAgICAxLCAgIDEKK307CisKK2ludCB2cDhfdmFsaWRhdGVfYnVmZmVyX2FybShjb25zdCB1bnNpZ25lZCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbyAqZXJyb3IpCit7CisgICAgcmV0dXJuIHZhbGlkYXRlX2J1ZmZlcihzdGFydCwgbGVuLCBlbmQsIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vZGN0X2FybS5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9kY3RfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwZmIyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vZGN0X2FybS5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorCisjaWYgSEFWRV9NRURJQQorCit2b2lkIHZwOF9zaG9ydF9mZGN0OHg0X2FybXY2KHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQoreworICAgIHZwOF9zaG9ydF9mZGN0NHg0X2FybXY2KGlucHV0LCAgIG91dHB1dCwgICAgcGl0Y2gpOworICAgIHZwOF9zaG9ydF9mZGN0NHg0X2FybXY2KGlucHV0ICsgNCwgb3V0cHV0ICsgMTYsIHBpdGNoKTsKK30KKworI2VuZGlmIC8qIEhBVkVfTUVESUEgKi8KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi9mYXN0cXVhbnRpemViX25lb24uYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9uZW9uL2Zhc3RxdWFudGl6ZWJfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzMDU4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi9mYXN0cXVhbnRpemViX25lb24uYXNtCkBAIC0wLDAgKzEsMjU4IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X2Zhc3RfcXVhbnRpemVfYl9uZW9ufAorICAgIEVYUE9SVCAgfHZwOF9mYXN0X3F1YW50aXplX2JfcGFpcl9uZW9ufAorCisgICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj00CisKKzt2cDhfZmFzdF9xdWFudGl6ZV9iX3BhaXJfbmVvbihCTE9DSyAqYjEsIEJMT0NLICpiMiwgQkxPQ0tEICpkMSwgQkxPQ0tEICpkMik7Cit8dnA4X2Zhc3RfcXVhbnRpemVfYl9wYWlyX25lb258IFBST0MKKworICAgIHN0bWZkICAgICAgICAgICBzcCEsIHtyNC1yOX0KKyAgICB2c3RtZGIgICAgICAgICAgc3AhLCB7cTQtcTd9CisKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtyMCwgI3ZwOF9ibG9ja19jb2VmZl0KKyAgICBsZHIgICAgICAgICAgICAgcjUsIFtyMCwgI3ZwOF9ibG9ja19xdWFudF9mYXN0XQorICAgIGxkciAgICAgICAgICAgICByNiwgW3IwLCAjdnA4X2Jsb2NrX3JvdW5kXQorCisgICAgdmxkMS4xNiAgICAgICAgIHtxMCwgcTF9LCBbcjRAMTI4XSAgOyBsb2FkIHoKKworICAgIGxkciAgICAgICAgICAgICByNywgW3IyLCAjdnA4X2Jsb2NrZF9xY29lZmZdCisKKyAgICB2YWJzLnMxNiAgICAgICAgcTQsIHEwICAgICAgICAgICAgICA7IGNhbGN1bGF0ZSB4ID0gYWJzKHopCisgICAgdmFicy5zMTYgICAgICAgIHE1LCBxMQorCisgICAgO3JpZ2h0IHNoaWZ0IDE1IHRvIGdldCBzaWduLCBhbGwgMCBpZiBpdCBpcyBwb3NpdGl2ZSwgYWxsIDEgaWYgaXQgaXMgbmVnYXRpdmUKKyAgICB2c2hyLnMxNiAgICAgICAgcTIsIHEwLCAjMTUgICAgICAgICA7IHN6CisgICAgdnNoci5zMTYgICAgICAgIHEzLCBxMSwgIzE1CisKKyAgICB2bGQxLnMxNiAgICAgICAge3E2LCBxN30sIFtyNkAxMjhdICA7IGxvYWQgcm91bmRfcHRyIFswLTE1XQorICAgIHZsZDEuczE2ICAgICAgICB7cTgsIHE5fSwgW3I1QDEyOF0gIDsgbG9hZCBxdWFudF9wdHIgWzAtMTVdCisKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtyMSwgI3ZwOF9ibG9ja19jb2VmZl0KKworICAgIHZhZGQuczE2ICAgICAgICBxNCwgcTYgICAgICAgICAgICAgIDsgeCArIFJvdW5kCisgICAgdmFkZC5zMTYgICAgICAgIHE1LCBxNworCisgICAgdmxkMS4xNiAgICAgICAgIHtxMCwgcTF9LCBbcjRAMTI4XSAgOyBsb2FkIHoyCisKKyAgICB2cWRtdWxoLnMxNiAgICAgcTQsIHE4ICAgICAgICAgICAgICA7IHkgPSAoKFJvdW5kK2Ficyh6KSkgKiBRdWFudCkgPj4gMTYKKyAgICB2cWRtdWxoLnMxNiAgICAgcTUsIHE5CisKKyAgICB2YWJzLnMxNiAgICAgICAgcTEwLCBxMCAgICAgICAgICAgICA7IGNhbGN1bGF0ZSB4MiA9IGFicyh6XzIpCisgICAgdmFicy5zMTYgICAgICAgIHExMSwgcTEKKyAgICB2c2hyLnMxNiAgICAgICAgcTEyLCBxMCwgIzE1ICAgICAgICA7IHN6MgorICAgIHZzaHIuczE2ICAgICAgICBxMTMsIHExLCAjMTUKKworICAgIDttb2RpZnkgZGF0YSB0byBoYXZlIGl0cyBvcmlnaW5hbCBzaWduCisgICAgdmVvci5zMTYgICAgICAgIHE0LCBxMiAgICAgICAgICAgICAgOyB5XnN6CisgICAgdmVvci5zMTYgICAgICAgIHE1LCBxMworCisgICAgdmFkZC5zMTYgICAgICAgIHExMCwgcTYgICAgICAgICAgICAgOyB4MiArIFJvdW5kCisgICAgdmFkZC5zMTYgICAgICAgIHExMSwgcTcKKworICAgIGxkciAgICAgICAgICAgICByOCwgW3IyLCAjdnA4X2Jsb2NrZF9kZXF1YW50XQorCisgICAgdnFkbXVsaC5zMTYgICAgIHExMCwgcTggICAgICAgICAgICAgOyB5MiA9ICgoUm91bmQrYWJzKHopKSAqIFF1YW50KSA+PiAxNgorICAgIHZxZG11bGguczE2ICAgICBxMTEsIHE5CisKKyAgICB2c2hyLnMxNiAgICAgICAgcTQsICMxICAgICAgICAgICAgICA7IHJpZ2h0IHNoaWZ0IDEgYWZ0ZXIgdnFkbXVsaAorICAgIHZzaHIuczE2ICAgICAgICBxNSwgIzEKKworICAgIHZsZDEuczE2ICAgICAgICB7cTYsIHE3fSwgW3I4QDEyOF0gIDtsb2FkIGRlcXVhbnRfcHRyW2ldCisKKyAgICB2c3ViLnMxNiAgICAgICAgcTQsIHEyICAgICAgICAgICAgICA7IHgxPSh5XnN6KS1zeiA9ICh5XnN6KS0oLTEpICgyJ3MgY29tcGxlbWVudCkKKyAgICB2c3ViLnMxNiAgICAgICAgcTUsIHEzCisKKyAgICB2c2hyLnMxNiAgICAgICAgcTEwLCAjMSAgICAgICAgICAgICA7IHJpZ2h0IHNoaWZ0IDEgYWZ0ZXIgdnFkbXVsaAorICAgIHZzaHIuczE2ICAgICAgICBxMTEsICMxCisKKyAgICBsZHIgICAgICAgICAgICAgcjksIFtyMiwgI3ZwOF9ibG9ja2RfZHFjb2VmZl0KKworICAgIHZlb3IuczE2ICAgICAgICBxMTAsIHExMiAgICAgICAgICAgIDsgeTJec3oyCisgICAgdmVvci5zMTYgICAgICAgIHExMSwgcTEzCisKKyAgICB2c3QxLnMxNiAgICAgICAge3E0LCBxNX0sIFtyN10gICAgICA7IHN0b3JlOiBxY29lZmYgPSB4MQorCisKKyAgICB2c3ViLnMxNiAgICAgICAgcTEwLCBxMTIgICAgICAgICAgICA7IHgyPSh5XnN6KS1zeiA9ICh5XnN6KS0oLTEpICgyJ3MgY29tcGxlbWVudCkKKyAgICB2c3ViLnMxNiAgICAgICAgcTExLCBxMTMKKworICAgIGxkciAgICAgICAgICAgICByNiwgW3IzLCAjdnA4X2Jsb2NrZF9xY29lZmZdCisKKyAgICB2bXVsLnMxNiAgICAgICAgcTIsIHE2LCBxNCAgICAgICAgICA7IHggKiBEZXF1YW50CisgICAgdm11bC5zMTYgICAgICAgIHEzLCBxNywgcTUKKworICAgIGFkciAgICAgICAgICAgICByMCwgaW52X3ppZ196YWcgICAgIDsgbG9hZCBwdHIgb2YgaW52ZXJzZSB6aWd6YWcgdGFibGUKKworICAgIHZjZXEuczE2ICAgICAgICBxOCwgcTggICAgICAgICAgICAgIDsgc2V0IHE4IHRvIGFsbCAxCisKKyAgICB2c3QxLnMxNiAgICAgICAge3ExMCwgcTExfSwgW3I2XSAgICA7IHN0b3JlOiBxY29lZmYgPSB4MgorCisgICAgdm11bC5zMTYgICAgICAgIHExMiwgcTYsIHExMCAgICAgICAgOyB4MiAqIERlcXVhbnQKKyAgICB2bXVsLnMxNiAgICAgICAgcTEzLCBxNywgcTExCisKKyAgICB2bGQxLjE2ICAgICAgICAge3E2LCBxN30sIFtyMEAxMjhdICA7IGxvYWQgaW52ZXJzZSBzY2FuIG9yZGVyCisKKyAgICB2dHN0LjE2ICAgICAgICAgcTE0LCBxNCwgcTggICAgICAgICA7IG5vdyBmaW5kIGVvYgorICAgIHZ0c3QuMTYgICAgICAgICBxMTUsIHE1LCBxOCAgICAgICAgIDsgbm9uLXplcm8gZWxlbWVudCBpcyBzZXQgdG8gYWxsIDEKKworICAgIHZzdDEuczE2ICAgICAgICB7cTIsIHEzfSwgW3I5XSAgICAgIDsgc3RvcmUgZHFjb2VmZiA9IHggKiBEZXF1YW50CisKKyAgICBsZHIgICAgICAgICAgICAgcjcsIFtyMywgI3ZwOF9ibG9ja2RfZHFjb2VmZl0KKworICAgIHZhbmQgICAgICAgICAgICBxMCwgcTYsIHExNCAgICAgICAgIDsgZ2V0IGFsbCB2YWxpZCBudW1iZXJzIGZyb20gc2NhbiBhcnJheQorICAgIHZhbmQgICAgICAgICAgICBxMSwgcTcsIHExNQorCisgICAgdnN0MS5zMTYgICAgICAgIHtxMTIsIHExM30sIFtyN10gICAgOyBzdG9yZSBkcWNvZWZmID0geCAqIERlcXVhbnQKKworICAgIHZ0c3QuMTYgICAgICAgICBxMiwgcTEwLCBxOCAgICAgICAgIDsgbm93IGZpbmQgZW9iCisgICAgdnRzdC4xNiAgICAgICAgIHEzLCBxMTEsIHE4ICAgICAgICAgOyBub24temVybyBlbGVtZW50IGlzIHNldCB0byBhbGwgMQorCisgICAgdm1heC51MTYgICAgICAgIHEwLCBxMCwgcTEgICAgICAgICAgOyBmaW5kIG1heGltdW0gdmFsdWUgaW4gcTAsIHExCisKKyAgICB2YW5kICAgICAgICAgICAgcTEwLCBxNiwgcTIgICAgICAgICA7IGdldCBhbGwgdmFsaWQgbnVtYmVycyBmcm9tIHNjYW4gYXJyYXkKKyAgICB2YW5kICAgICAgICAgICAgcTExLCBxNywgcTMKKyAgICB2bWF4LnUxNiAgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICA7IGZpbmQgbWF4aW11bSB2YWx1ZSBpbiBxMTAsIHExMQorCisgICAgdm1heC51MTYgICAgICAgIGQwLCBkMCwgZDEKKyAgICB2bWF4LnUxNiAgICAgICAgZDIwLCBkMjAsIGQyMQorICAgIHZtb3ZsLnUxNiAgICAgICBxMCwgZDAKKyAgICB2bW92bC51MTYgICAgICAgcTEwLCBkMjAKKworICAgIHZtYXgudTMyICAgICAgICBkMCwgZDAsIGQxCisgICAgdm1heC51MzIgICAgICAgIGQyMCwgZDIwLCBkMjEKKyAgICB2cG1heC51MzIgICAgICAgZDAsIGQwLCBkMAorICAgIHZwbWF4LnUzMiAgICAgICBkMjAsIGQyMCwgZDIwCisKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtyMiwgI3ZwOF9ibG9ja2RfZW9iXQorICAgIGxkciAgICAgICAgICAgICByNSwgW3IzLCAjdnA4X2Jsb2NrZF9lb2JdCisKKyAgICB2c3QxLjggICAgICAgICAge2QwWzBdfSwgW3I0XSAgICAgICA7IHN0b3JlIGVvYgorICAgIHZzdDEuOCAgICAgICAgICB7ZDIwWzBdfSwgW3I1XSAgICAgIDsgc3RvcmUgZW9iCisKKyAgICB2bGRtaWEgICAgICAgICAgc3AhLCB7cTQtcTd9CisgICAgbGRtZmQgICAgICAgICAgIHNwISwge3I0LXI5fQorICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCis7dm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX2MoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKK3x2cDhfZmFzdF9xdWFudGl6ZV9iX25lb258IFBST0MKKworICAgIHN0bWZkICAgICAgICAgICBzcCEsIHtyNC1yN30KKworICAgIGxkciAgICAgICAgICAgICByMywgW3IwLCAjdnA4X2Jsb2NrX2NvZWZmXQorICAgIGxkciAgICAgICAgICAgICByNCwgW3IwLCAjdnA4X2Jsb2NrX3F1YW50X2Zhc3RdCisgICAgbGRyICAgICAgICAgICAgIHI1LCBbcjAsICN2cDhfYmxvY2tfcm91bmRdCisKKyAgICB2bGQxLjE2ICAgICAgICAge3EwLCBxMX0sIFtyM0AxMjhdICA7IGxvYWQgegorICAgIHZvcnIuczE2ICAgICAgICBxMTQsIHEwLCBxMSAgICAgICAgIDsgY2hlY2sgaWYgYWxsIHplcm8gKHN0ZXAgMSkKKyAgICBsZHIgICAgICAgICAgICAgcjYsIFtyMSwgI3ZwOF9ibG9ja2RfcWNvZWZmXQorICAgIGxkciAgICAgICAgICAgICByNywgW3IxLCAjdnA4X2Jsb2NrZF9kcWNvZWZmXQorICAgIHZvcnIuczE2ICAgICAgICBkMjgsIGQyOCwgZDI5ICAgICAgIDsgY2hlY2sgaWYgYWxsIHplcm8gKHN0ZXAgMikKKworICAgIHZhYnMuczE2ICAgICAgICBxMTIsIHEwICAgICAgICAgICAgIDsgY2FsY3VsYXRlIHggPSBhYnMoeikKKyAgICB2YWJzLnMxNiAgICAgICAgcTEzLCBxMQorCisgICAgO3JpZ2h0IHNoaWZ0IDE1IHRvIGdldCBzaWduLCBhbGwgMCBpZiBpdCBpcyBwb3NpdGl2ZSwgYWxsIDEgaWYgaXQgaXMgbmVnYXRpdmUKKyAgICB2c2hyLnMxNiAgICAgICAgcTIsIHEwLCAjMTUgICAgICAgICA7IHN6CisgICAgdm1vdiAgICAgICAgICAgIHIyLCByMywgZDI4ICAgICAgICAgOyBjaGVjayBpZiBhbGwgemVybyAoc3RlcCAzKQorICAgIHZzaHIuczE2ICAgICAgICBxMywgcTEsICMxNQorCisgICAgdmxkMS5zMTYgICAgICAgIHtxMTQsIHExNX0sIFtyNUAxMjhdOyBsb2FkIHJvdW5kX3B0ciBbMC0xNV0KKyAgICB2bGQxLnMxNiAgICAgICAge3E4LCBxOX0sIFtyNEAxMjhdICA7IGxvYWQgcXVhbnRfcHRyIFswLTE1XQorCisgICAgdmFkZC5zMTYgICAgICAgIHExMiwgcTE0ICAgICAgICAgICAgOyB4ICsgUm91bmQKKyAgICB2YWRkLnMxNiAgICAgICAgcTEzLCBxMTUKKworICAgIGFkciAgICAgICAgICAgICByMCwgaW52X3ppZ196YWcgICAgIDsgbG9hZCBwdHIgb2YgaW52ZXJzZSB6aWd6YWcgdGFibGUKKworICAgIHZxZG11bGguczE2ICAgICBxMTIsIHE4ICAgICAgICAgICAgIDsgeSA9ICgoUm91bmQrYWJzKHopKSAqIFF1YW50KSA+PiAxNgorICAgIHZxZG11bGguczE2ICAgICBxMTMsIHE5CisKKyAgICB2bGQxLjE2ICAgICAgICAge3ExMCwgcTExfSwgW3IwQDEyOF07IGxvYWQgaW52ZXJzZSBzY2FuIG9yZGVyCisKKyAgICB2Y2VxLnMxNiAgICAgICAgcTgsIHE4ICAgICAgICAgICAgICA7IHNldCBxOCB0byBhbGwgMQorCisgICAgbGRyICAgICAgICAgICAgIHI0LCBbcjEsICN2cDhfYmxvY2tkX2RlcXVhbnRdCisKKyAgICB2c2hyLnMxNiAgICAgICAgcTEyLCAjMSAgICAgICAgICAgICA7IHJpZ2h0IHNoaWZ0IDEgYWZ0ZXIgdnFkbXVsaAorICAgIHZzaHIuczE2ICAgICAgICBxMTMsICMxCisKKyAgICBsZHIgICAgICAgICAgICAgcjUsIFtyMSwgI3ZwOF9ibG9ja2RfZW9iXQorCisgICAgb3JyICAgICAgICAgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBjaGVjayBpZiBhbGwgemVybyAoc3RlcCA0KQorICAgIGNtcCAgICAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgIDsgY2hlY2sgaWYgYWxsIHplcm8gKHN0ZXAgNSkKKyAgICBiZXEgICAgICAgICAgICAgemVyb19vdXRwdXQgICAgICAgICA7IGNoZWNrIGlmIGFsbCB6ZXJvIChzdGVwIDYpCisKKyAgICA7bW9kaWZ5IGRhdGEgdG8gaGF2ZSBpdHMgb3JpZ2luYWwgc2lnbgorICAgIHZlb3IuczE2ICAgICAgICBxMTIsIHEyICAgICAgICAgICAgIDsgeV5zegorICAgIHZlb3IuczE2ICAgICAgICBxMTMsIHEzCisKKyAgICB2c3ViLnMxNiAgICAgICAgcTEyLCBxMiAgICAgICAgICAgICA7IHgxPSh5XnN6KS1zeiA9ICh5XnN6KS0oLTEpICgyJ3MgY29tcGxlbWVudCkKKyAgICB2c3ViLnMxNiAgICAgICAgcTEzLCBxMworCisgICAgdmxkMS5zMTYgICAgICAgIHtxMiwgcTN9LCBbcjRAMTI4XSAgOyBsb2FkIGRlcXVhbnRfcHRyW2ldCisKKyAgICB2dHN0LjE2ICAgICAgICAgcTE0LCBxMTIsIHE4ICAgICAgICA7IG5vdyBmaW5kIGVvYgorICAgIHZ0c3QuMTYgICAgICAgICBxMTUsIHExMywgcTggICAgICAgIDsgbm9uLXplcm8gZWxlbWVudCBpcyBzZXQgdG8gYWxsIDEKKworICAgIHZzdDEuczE2ICAgICAgICB7cTEyLCBxMTN9LCBbcjZAMTI4XTsgc3RvcmU6IHFjb2VmZiA9IHgxCisKKyAgICB2YW5kICAgICAgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICA7IGdldCBhbGwgdmFsaWQgbnVtYmVycyBmcm9tIHNjYW4gYXJyYXkKKyAgICB2YW5kICAgICAgICAgICAgcTExLCBxMTEsIHExNQorCisKKyAgICB2bWF4LnUxNiAgICAgICAgcTAsIHExMCwgcTExICAgICAgICA7IGZpbmQgbWF4aW11bSB2YWx1ZSBpbiBxMCwgcTEKKyAgICB2bWF4LnUxNiAgICAgICAgZDAsIGQwLCBkMQorICAgIHZtb3ZsLnUxNiAgICAgICBxMCwgZDAKKworICAgIHZtdWwuczE2ICAgICAgICBxMiwgcTEyICAgICAgICAgICAgIDsgeCAqIERlcXVhbnQKKyAgICB2bXVsLnMxNiAgICAgICAgcTMsIHExMworCisgICAgdm1heC51MzIgICAgICAgIGQwLCBkMCwgZDEKKyAgICB2cG1heC51MzIgICAgICAgZDAsIGQwLCBkMAorCisgICAgdnN0MS5zMTYgICAgICAgIHtxMiwgcTN9LCBbcjdAMTI4XSAgOyBzdG9yZSBkcWNvZWZmID0geCAqIERlcXVhbnQKKworICAgIHZzdDEuOCAgICAgICAgICB7ZDBbMF19LCBbcjVdICAgICAgIDsgc3RvcmUgZW9iCisKKyAgICBsZG1mZCAgICAgICAgICAgc3AhLCB7cjQtcjd9CisgICAgYnggICAgICAgICAgICAgIGxyCisKK3plcm9fb3V0cHV0CisgICAgc3RyYiAgICAgICAgICAgIHIyLCBbcjVdICAgICAgICAgICAgOyBzdG9yZSBlb2IKKyAgICB2c3QxLnMxNiAgICAgICAge3EwLCBxMX0sIFtyNkAxMjhdICA7IHFjb2VmZiA9IDAKKyAgICB2c3QxLnMxNiAgICAgICAge3EwLCBxMX0sIFtyN0AxMjhdICA7IGRxY29lZmYgPSAwCisKKyAgICBsZG1mZCAgICAgICAgICAgc3AhLCB7cjQtcjd9CisgICAgYnggICAgICAgICAgICAgIGxyCisKKyAgICBFTkRQCisKKzsgZGVmYXVsdCBpbnZlcnNlIHppZ3phZyB0YWJsZSBpcyBkZWZpbmVkIGluIHZwOC9jb21tb24vZW50cm9weS5jCisgICAgQUxJR04gMTYgICAgOyBlbmFibGUgdXNlIG9mIEAxMjggYml0IGFsaWduZWQgbG9hZHMKK2ludl96aWdfemFnCisgICAgRENXIDB4MDAwMSwgMHgwMDAyLCAweDAwMDYsIDB4MDAwNworICAgIERDVyAweDAwMDMsIDB4MDAwNSwgMHgwMDA4LCAweDAwMGQKKyAgICBEQ1cgMHgwMDA0LCAweDAwMDksIDB4MDAwYywgMHgwMDBlCisgICAgRENXIDB4MDAwYSwgMHgwMDBiLCAweDAwMGYsIDB4MDAxMAorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi9waWNrbHBmX2FybS5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9uZW9uL3BpY2tscGZfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4MDcxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi9waWNrbHBmX2FybS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInZwOC9jb21tb24vbG9vcGZpbHRlci5oIgorI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCisKK2V4dGVybiB2b2lkIHZwOF9tZW1jcHlfcGFydGlhbF9uZW9uKHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN6KTsKKworCit2b2lkIHZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZV9uZW9uKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKQoreworICAgIHVuc2lnbmVkIGNoYXIgKnNyY195LCAqZHN0X3k7CisgICAgaW50IHloZWlnaHQ7CisgICAgaW50IHlzdHJpZGU7CisgICAgaW50IHlvZmZzZXQ7CisgICAgaW50IGxpbmVzdG9jb3B5OworCisgICAgeWhlaWdodCAgPSBzcmNfeWJjLT55X2hlaWdodDsKKyAgICB5c3RyaWRlICA9IHNyY195YmMtPnlfc3RyaWRlOworCisgICAgLyogbnVtYmVyIG9mIE1CIHJvd3MgdG8gdXNlIGluIHBhcnRpYWwgZmlsdGVyaW5nICovCisgICAgbGluZXN0b2NvcHkgPSAoeWhlaWdodCA+PiA0KSAvIFBBUlRJQUxfRlJBTUVfRlJBQ1RJT047CisgICAgbGluZXN0b2NvcHkgPSBsaW5lc3RvY29weSA/IGxpbmVzdG9jb3B5IDw8IDQgOiAxNjsgICAgIC8qIDE2IGxpbmVzIHBlciBNQiAqLworCisgICAgLyogQ29weSBleHRyYSA0IHNvIHRoYXQgZnVsbCBmaWx0ZXIgY29udGV4dCBpcyBhdmFpbGFibGUgaWYgZmlsdGVyaW5nIGRvbmUKKyAgICAgKiBvbiB0aGUgY29waWVkIHBhcnRpYWwgZnJhbWUgYW5kIG5vdCBvcmlnaW5hbC4gUGFydGlhbCBmaWx0ZXIgZG9lcyBtYgorICAgICAqIGZpbHRlcmluZyBmb3IgdG9wIHJvdyBhbHNvLCB3aGljaCBjYW4gbW9kaWZ5MyBwaXhlbHMgYWJvdmUuCisgICAgICovCisgICAgbGluZXN0b2NvcHkgKz0gNDsKKyAgICAvKiBwYXJ0aWFsIGltYWdlIHN0YXJ0cyBhdCB+bWlkZGxlIG9mIGZyYW1lIChtYWNyb2Jsb2NrIGJvcmRlcikgKi8KKyAgICB5b2Zmc2V0ICA9IHlzdHJpZGUgKiAoKCh5aGVpZ2h0ID4+IDUpICogMTYpIC0gNCk7CisgICAgc3JjX3kgPSBzcmNfeWJjLT55X2J1ZmZlciArIHlvZmZzZXQ7CisgICAgZHN0X3kgPSBkc3RfeWJjLT55X2J1ZmZlciArIHlvZmZzZXQ7CisKKyAgICB2cDhfbWVtY3B5X3BhcnRpYWxfbmVvbihkc3RfeSwgc3JjX3ksIHlzdHJpZGUgKiBsaW5lc3RvY29weSk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL25lb24vc2hvcnRmZGN0X25lb24uYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRkMDExCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uLmFzbQpAQCAtMCwwICsxLDIyMSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9zaG9ydF9mZGN0NHg0X25lb258CisgICAgRVhQT1JUICB8dnA4X3Nob3J0X2ZkY3Q4eDRfbmVvbnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTQKKworCisgICAgQUxJR04gMTYgICAgOyBlbmFibGUgdXNlIG9mIEAxMjggYml0IGFsaWduZWQgbG9hZHMKK2NvZWZmCisgICAgRENXICAgICAgNTM1MiwgIDUzNTIsICA1MzUyLCA1MzUyCisgICAgRENXICAgICAgMjIxNywgIDIyMTcsICAyMjE3LCAyMjE3CisgICAgRENEICAgICAxNDUwMCwgMTQ1MDAsIDE0NTAwLCAxNDUwMAorICAgIERDRCAgICAgIDc1MDAsICA3NTAwLCAgNzUwMCwgNzUwMAorICAgIERDRCAgICAgMTIwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAKKyAgICBEQ0QgICAgIDUxMDAwLCA1MTAwMCwgNTEwMDAsIDUxMDAwCisKKzt2b2lkIHZwOF9zaG9ydF9mZGN0NHg0X2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCit8dnA4X3Nob3J0X2ZkY3Q0eDRfbmVvbnwgUFJPQworCisgICAgOyBQYXJ0IG9uZQorICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjBANjRdLCByMgorICAgIGFkciAgICAgICAgICAgICByMTIsIGNvZWZmCisgICAgdmxkMS4xNiAgICAgICAgIHtkMX0sIFtyMEA2NF0sIHIyCisgICAgdmxkMS4xNiAgICAgICAgIHtxOH0sIFtyMTJAMTI4XSEgICAgICAgIDsgZDE2PTUzNTIsICBkMTc9MjIxNworICAgIHZsZDEuMTYgICAgICAgICB7ZDJ9LCBbcjBANjRdLCByMgorICAgIHZsZDEuMzIgICAgICAgICB7cTksIHExMH0sIFtyMTJAMTI4XSEgICA7ICBxOT0xNDUwMCwgcTEwPTc1MDAKKyAgICB2bGQxLjE2ICAgICAgICAge2QzfSwgW3IwQDY0XSwgcjIKKworICAgIDsgdHJhbnNwb3NlIGQwPWlwWzBdLCBkMT1pcFsxXSwgZDI9aXBbMl0sIGQzPWlwWzNdCisgICAgdnRybi4zMiAgICAgICAgIGQwLCBkMgorICAgIHZ0cm4uMzIgICAgICAgICBkMSwgZDMKKyAgICB2bGQxLjMyICAgICAgICAge3ExMSxxMTJ9LCBbcjEyQDEyOF0gICAgOyBxMTE9MTIwMDAsIHExMj01MTAwMAorICAgIHZ0cm4uMTYgICAgICAgICBkMCwgZDEKKyAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQzCisKKyAgICB2YWRkLnMxNiAgICAgICAgZDQsIGQwLCBkMyAgICAgIDsgYTEgPSBpcFswXSArIGlwWzNdCisgICAgdmFkZC5zMTYgICAgICAgIGQ1LCBkMSwgZDIgICAgICA7IGIxID0gaXBbMV0gKyBpcFsyXQorICAgIHZzdWIuczE2ICAgICAgICBkNiwgZDEsIGQyICAgICAgOyBjMSA9IGlwWzFdIC0gaXBbMl0KKyAgICB2c3ViLnMxNiAgICAgICAgZDcsIGQwLCBkMyAgICAgIDsgZDEgPSBpcFswXSAtIGlwWzNdCisKKyAgICB2c2hsLnMxNiAgICAgICAgcTIsIHEyLCAjMyAgICAgIDsgKGExLCBiMSkgPDwgMworICAgIHZzaGwuczE2ICAgICAgICBxMywgcTMsICMzICAgICAgOyAoYzEsIGQxKSA8PCAzCisKKyAgICB2YWRkLnMxNiAgICAgICAgZDAsIGQ0LCBkNSAgICAgIDsgb3BbMF0gPSBhMSArIGIxCisgICAgdnN1Yi5zMTYgICAgICAgIGQyLCBkNCwgZDUgICAgICA7IG9wWzJdID0gYTEgLSBiMQorCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNywgZDE2ICAgICA7IGQxKjUzNTIgKyAxNDUwMAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQ3LCBkMTcgICAgOyBkMSoyMjE3ICsgNzUwMAorICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDYsIGQxNyAgICAgOyBjMSoyMjE3ICsgZDEqNTM1MiArIDE0NTAwCisgICAgdm1sc2wuczE2ICAgICAgIHExMCwgZDYsIGQxNiAgICA7IGQxKjIyMTcgLSBjMSo1MzUyICsgNzUwMAorCisgICAgdnNocm4uczMyICAgICAgIGQxLCBxOSwgIzEyICAgICA7IG9wWzFdID0gKGMxKjIyMTcgKyBkMSo1MzUyICsgMTQ1MDApPj4xMgorICAgIHZzaHJuLnMzMiAgICAgICBkMywgcTEwLCAjMTIgICAgOyBvcFszXSA9IChkMSoyMjE3IC0gYzEqNTM1MiArICA3NTAwKT4+MTIKKworCisgICAgOyBQYXJ0IHR3bworCisgICAgOyB0cmFuc3Bvc2UgZDA9aXBbMF0sIGQxPWlwWzRdLCBkMj1pcFs4XSwgZDM9aXBbMTJdCisgICAgdnRybi4zMiAgICAgICAgIGQwLCBkMgorICAgIHZ0cm4uMzIgICAgICAgICBkMSwgZDMKKyAgICB2dHJuLjE2ICAgICAgICAgZDAsIGQxCisgICAgdnRybi4xNiAgICAgICAgIGQyLCBkMworCisgICAgdm1vdi5zMTYgICAgICAgIGQyNiwgIzcKKworICAgIHZhZGQuczE2ICAgICAgICBkNCwgZDAsIGQzICAgICAgOyBhMSA9IGlwWzBdICsgaXBbMTJdCisgICAgdmFkZC5zMTYgICAgICAgIGQ1LCBkMSwgZDIgICAgICA7IGIxID0gaXBbNF0gKyBpcFs4XQorICAgIHZzdWIuczE2ICAgICAgICBkNiwgZDEsIGQyICAgICAgOyBjMSA9IGlwWzRdIC0gaXBbOF0KKyAgICB2YWRkLnMxNiAgICAgICAgZDQsIGQ0LCBkMjYgICAgIDsgYTEgKyA3CisgICAgdnN1Yi5zMTYgICAgICAgIGQ3LCBkMCwgZDMgICAgICA7IGQxID0gaXBbMF0gLSBpcFsxMl0KKworICAgIHZhZGQuczE2ICAgICAgICBkMCwgZDQsIGQ1ICAgICAgOyBvcFswXSA9IGExICsgYjEgKyA3CisgICAgdnN1Yi5zMTYgICAgICAgIGQyLCBkNCwgZDUgICAgICA7IG9wWzhdID0gYTEgLSBiMSArIDcKKworICAgIHZtbGFsLnMxNiAgICAgICBxMTEsIGQ3LCBkMTYgICAgOyBkMSo1MzUyICsgMTIwMDAKKyAgICB2bWxhbC5zMTYgICAgICAgcTEyLCBkNywgZDE3ICAgIDsgZDEqMjIxNyArIDUxMDAwCisKKyAgICB2Y2VxLnMxNiAgICAgICAgZDQsIGQ3LCAjMAorCisgICAgdnNoci5zMTYgICAgICAgIGQwLCBkMCwgIzQKKyAgICB2c2hyLnMxNiAgICAgICAgZDIsIGQyLCAjNAorCisgICAgdm1sYWwuczE2ICAgICAgIHExMSwgZDYsIGQxNyAgICA7IGMxKjIyMTcgKyBkMSo1MzUyICsgMTIwMDAKKyAgICB2bWxzbC5zMTYgICAgICAgcTEyLCBkNiwgZDE2ICAgIDsgZDEqMjIxNyAtIGMxKjUzNTIgKyA1MTAwMAorCisgICAgdm12bi5zMTYgICAgICAgIGQ0LCBkNAorICAgIHZzaHJuLnMzMiAgICAgICBkMSwgcTExLCAjMTYgICAgOyBvcFs0XSA9IChjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwKT4+MTYKKyAgICB2c3ViLnMxNiAgICAgICAgZDEsIGQxLCBkNCAgICAgIDsgb3BbNF0gKz0gKGQxIT0wKQorICAgIHZzaHJuLnMzMiAgICAgICBkMywgcTEyLCAjMTYgICAgOyBvcFsxMl09IChkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwKT4+MTYKKworICAgIHZzdDEuMTYgICAgICAgICB7cTAsIHExfSwgW3IxQDEyOF0KKworICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCis7dm9pZCB2cDhfc2hvcnRfZmRjdDh4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQorfHZwOF9zaG9ydF9mZGN0OHg0X25lb258IFBST0MKKworICAgIDsgUGFydCBvbmUKKworICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCBbcjBAMTI4XSwgcjIKKyAgICBhZHIgICAgICAgICAgICAgcjEyLCBjb2VmZgorICAgIHZsZDEuMTYgICAgICAgICB7cTF9LCBbcjBAMTI4XSwgcjIKKyAgICB2bGQxLjE2ICAgICAgICAge3E4fSwgW3IxMkAxMjhdISAgICAgICAgOyBkMTY9NTM1MiwgIGQxNz0yMjE3CisgICAgdmxkMS4xNiAgICAgICAgIHtxMn0sIFtyMEAxMjhdLCByMgorICAgIHZsZDEuMzIgICAgICAgICB7cTksIHExMH0sIFtyMTJAMTI4XSEgICA7ICBxOT0xNDUwMCwgcTEwPTc1MDAKKyAgICB2bGQxLjE2ICAgICAgICAge3EzfSwgW3IwQDEyOF0sIHIyCisKKyAgICA7IHRyYW5zcG9zZSBxMD1pcFswXSwgcTE9aXBbMV0sIHEyPWlwWzJdLCBxMz1pcFszXQorICAgIHZ0cm4uMzIgICAgICAgICBxMCwgcTIgICAgICAgICAgOyBbQTB8QjBdCisgICAgdnRybi4zMiAgICAgICAgIHExLCBxMyAgICAgICAgICA7IFtBMXxCMV0KKyAgICB2dHJuLjE2ICAgICAgICAgcTAsIHExICAgICAgICAgIDsgW0EyfEIyXQorICAgIHZ0cm4uMTYgICAgICAgICBxMiwgcTMgICAgICAgICAgOyBbQTN8QjNdCisKKyAgICB2YWRkLnMxNiAgICAgICAgcTExLCBxMCwgcTMgICAgIDsgYTEgPSBpcFswXSArIGlwWzNdCisgICAgdmFkZC5zMTYgICAgICAgIHExMiwgcTEsIHEyICAgICA7IGIxID0gaXBbMV0gKyBpcFsyXQorICAgIHZzdWIuczE2ICAgICAgICBxMTMsIHExLCBxMiAgICAgOyBjMSA9IGlwWzFdIC0gaXBbMl0KKyAgICB2c3ViLnMxNiAgICAgICAgcTE0LCBxMCwgcTMgICAgIDsgZDEgPSBpcFswXSAtIGlwWzNdCisKKyAgICB2c2hsLnMxNiAgICAgICAgcTExLCBxMTEsICMzICAgIDsgYTEgPDwgMworICAgIHZzaGwuczE2ICAgICAgICBxMTIsIHExMiwgIzMgICAgOyBiMSA8PCAzCisgICAgdnNobC5zMTYgICAgICAgIHExMywgcTEzLCAjMyAgICA7IGMxIDw8IDMKKyAgICB2c2hsLnMxNiAgICAgICAgcTE0LCBxMTQsICMzICAgIDsgZDEgPDwgMworCisgICAgdmFkZC5zMTYgICAgICAgIHEwLCBxMTEsIHExMiAgICA7IFtBMCB8IEIwXSA9IGExICsgYjEKKyAgICB2c3ViLnMxNiAgICAgICAgcTIsIHExMSwgcTEyICAgIDsgW0EyIHwgQjJdID0gYTEgLSBiMQorCisgICAgdm1vdi5zMTYgICAgICAgIHExMSwgcTkgICAgICAgICA7IDE0NTAwCisgICAgdm1vdi5zMTYgICAgICAgIHExMiwgcTEwICAgICAgICA7IDc1MDAKKworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI4LCBkMTYgICAgOyBBWzFdID0gZDEqNTM1MiArIDE0NTAwCisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI4LCBkMTcgICA7IEFbM10gPSBkMSoyMjE3ICsgNzUwMAorICAgIHZtbGFsLnMxNiAgICAgICBxMTEsIGQyOSwgZDE2ICAgOyBCWzFdID0gZDEqNTM1MiArIDE0NTAwCisgICAgdm1sYWwuczE2ICAgICAgIHExMiwgZDI5LCBkMTcgICA7IEJbM10gPSBkMSoyMjE3ICsgNzUwMAorCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjYsIGQxNyAgICA7IEFbMV0gPSBjMSoyMjE3ICsgZDEqNTM1MiArIDE0NTAwCisgICAgdm1sc2wuczE2ICAgICAgIHExMCwgZDI2LCBkMTYgICA7IEFbM10gPSBkMSoyMjE3IC0gYzEqNTM1MiArIDc1MDAKKyAgICB2bWxhbC5zMTYgICAgICAgcTExLCBkMjcsIGQxNyAgIDsgQlsxXSA9IGMxKjIyMTcgKyBkMSo1MzUyICsgMTQ1MDAKKyAgICB2bWxzbC5zMTYgICAgICAgcTEyLCBkMjcsIGQxNiAgIDsgQlszXSA9IGQxKjIyMTcgLSBjMSo1MzUyICsgNzUwMAorCisgICAgdnNocm4uczMyICAgICAgIGQyLCBxOSwgIzEyICAgICA7IEFbMV0gPSAoYzEqMjIxNyArIGQxKjUzNTIgKyAxNDUwMCk+PjEyCisgICAgdnNocm4uczMyICAgICAgIGQ2LCBxMTAsICMxMiAgICA7IEFbM10gPSAoZDEqMjIxNyAtIGMxKjUzNTIgKyAgNzUwMCk+PjEyCisgICAgdnNocm4uczMyICAgICAgIGQzLCBxMTEsICMxMiAgICA7IEJbMV0gPSAoYzEqMjIxNyArIGQxKjUzNTIgKyAxNDUwMCk+PjEyCisgICAgdnNocm4uczMyICAgICAgIGQ3LCBxMTIsICMxMiAgICA7IEJbM10gPSAoZDEqMjIxNyAtIGMxKjUzNTIgKyAgNzUwMCk+PjEyCisKKworICAgIDsgUGFydCB0d28KKyAgICB2bGQxLjMyICAgICAgICAge3E5LHExMH0sIFtyMTJAMTI4XSAgICA7IHE5PTEyMDAwLCBxMTA9NTEwMDAKKworICAgIDsgdHJhbnNwb3NlIHEwPWlwWzBdLCBxMT1pcFs0XSwgcTI9aXBbOF0sIHEzPWlwWzEyXQorICAgIHZ0cm4uMzIgICAgICAgICBxMCwgcTIgICAgICAgICAgOyBxMD1bQTAgfCBCMF0KKyAgICB2dHJuLjMyICAgICAgICAgcTEsIHEzICAgICAgICAgIDsgcTE9W0E0IHwgQjRdCisgICAgdnRybi4xNiAgICAgICAgIHEwLCBxMSAgICAgICAgICA7IHEyPVtBOCB8IEI4XQorICAgIHZ0cm4uMTYgICAgICAgICBxMiwgcTMgICAgICAgICAgOyBxMz1bQTEyfEIxMl0KKworICAgIHZtb3YuczE2ICAgICAgICBxMTUsICM3CisKKyAgICB2YWRkLnMxNiAgICAgICAgcTExLCBxMCwgcTMgICAgIDsgYTEgPSBpcFswXSArIGlwWzEyXQorICAgIHZhZGQuczE2ICAgICAgICBxMTIsIHExLCBxMiAgICAgOyBiMSA9IGlwWzRdICsgaXBbOF0KKyAgICB2YWRkLnMxNiAgICAgICAgcTExLCBxMTEsIHExNSAgIDsgYTEgKyA3CisgICAgdnN1Yi5zMTYgICAgICAgIHExMywgcTEsIHEyICAgICA7IGMxID0gaXBbNF0gLSBpcFs4XQorICAgIHZzdWIuczE2ICAgICAgICBxMTQsIHEwLCBxMyAgICAgOyBkMSA9IGlwWzBdIC0gaXBbMTJdCisKKyAgICB2YWRkLnMxNiAgICAgICAgcTAsIHExMSwgcTEyICAgIDsgYTEgKyBiMSArIDcKKyAgICB2c3ViLnMxNiAgICAgICAgcTEsIHExMSwgcTEyICAgIDsgYTEgLSBiMSArIDcKKworICAgIHZtb3YuczE2ICAgICAgICBxMTEsIHE5ICAgICAgICAgOyAxMjAwMAorICAgIHZtb3YuczE2ICAgICAgICBxMTIsIHExMCAgICAgICAgOyA1MTAwMAorCisgICAgdnNoci5zMTYgICAgICAgIGQwLCBkMCwgIzQgICAgICA7IEFbMF0gPSAoYTEgKyBiMSArIDcpPj40CisgICAgdnNoci5zMTYgICAgICAgIGQ0LCBkMSwgIzQgICAgICA7IEJbMF0gPSAoYTEgKyBiMSArIDcpPj40CisgICAgdnNoci5zMTYgICAgICAgIGQyLCBkMiwgIzQgICAgICA7IEFbOF0gPSAoYTEgKyBiMSArIDcpPj40CisgICAgdnNoci5zMTYgICAgICAgIGQ2LCBkMywgIzQgICAgICA7IEJbOF0gPSAoYTEgKyBiMSArIDcpPj40CisKKworICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI4LCBkMTYgICAgOyBBWzRdICA9IGQxKjUzNTIgKyAxMjAwMAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyOCwgZDE3ICAgOyBBWzEyXSA9IGQxKjIyMTcgKyA1MTAwMAorICAgIHZtbGFsLnMxNiAgICAgICBxMTEsIGQyOSwgZDE2ICAgOyBCWzRdICA9IGQxKjUzNTIgKyAxMjAwMAorICAgIHZtbGFsLnMxNiAgICAgICBxMTIsIGQyOSwgZDE3ICAgOyBCWzEyXSA9IGQxKjIyMTcgKyA1MTAwMAorCisgICAgdmNlcS5zMTYgICAgICAgIHExNCwgcTE0LCAjMAorCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjYsIGQxNyAgICA7IEFbNF0gID0gYzEqMjIxNyArIGQxKjUzNTIgKyAxMjAwMAorICAgIHZtbHNsLnMxNiAgICAgICBxMTAsIGQyNiwgZDE2ICAgOyBBWzEyXSA9IGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDAKKyAgICB2bWxhbC5zMTYgICAgICAgcTExLCBkMjcsIGQxNyAgIDsgQls0XSAgPSBjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwCisgICAgdm1sc2wuczE2ICAgICAgIHExMiwgZDI3LCBkMTYgICA7IEJbMTJdID0gZDEqMjIxNyAtIGMxKjUzNTIgKyA1MTAwMAorCisgICAgdm12bi5zMTYgICAgICAgIHExNCwgcTE0CisKKyAgICB2c2hybi5zMzIgICAgICAgZDEsIHE5LCAjMTYgICAgIDsgQVs0XSA9IChjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwKT4+MTYKKyAgICB2c2hybi5zMzIgICAgICAgZDMsIHExMCwgIzE2ICAgIDsgQVsxMl09IChkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwKT4+MTYKKyAgICB2c3ViLnMxNiAgICAgICAgZDEsIGQxLCBkMjggICAgIDsgQVs0XSArPSAoZDEhPTApCisKKyAgICB2c2hybi5zMzIgICAgICAgZDUsIHExMSwgIzE2ICAgIDsgQls0XSA9IChjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwKT4+MTYKKyAgICB2c2hybi5zMzIgICAgICAgZDcsIHExMiwgIzE2ICAgIDsgQlsxMl09IChkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwKT4+MTYKKyAgICB2c3ViLnMxNiAgICAgICAgZDUsIGQ1LCBkMjkgICAgIDsgQls0XSArPSAoZDEhPTApCisKKyAgICB2c3QxLjE2ICAgICAgICAge3EwLCBxMX0sIFtyMUAxMjhdISA7IGJsb2NrIEEKKyAgICB2c3QxLjE2ICAgICAgICAge3EyLCBxM30sIFtyMUAxMjhdISA7IGJsb2NrIEIKKworICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi9zdWJ0cmFjdF9uZW9uLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi9zdWJ0cmFjdF9uZW9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEzMjhjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9uZW9uL3N1YnRyYWN0X25lb24uYXNtCkBAIC0wLDAgKzEsMTk5IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworICAgIEVYUE9SVCB8dnA4X3N1YnRyYWN0X2JfbmVvbnwKKyAgICBFWFBPUlQgfHZwOF9zdWJ0cmFjdF9tYnlfbmVvbnwKKyAgICBFWFBPUlQgfHZwOF9zdWJ0cmFjdF9tYnV2X25lb258CisKKyAgICBJTkNMVURFIGFzbV9lbmNfb2Zmc2V0cy5hc20KKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworO3ZvaWQgdnA4X3N1YnRyYWN0X2JfbmVvbihCTE9DSyAqYmUsIEJMT0NLRCAqYmQsIGludCBwaXRjaCkKK3x2cDhfc3VidHJhY3RfYl9uZW9ufCBQUk9DCisKKyAgICBzdG1mZCAgIHNwISwge3I0LXI3fQorCisgICAgbGRyICAgICByMywgW3IwLCAjdnA4X2Jsb2NrX2Jhc2Vfc3JjXQorICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF9ibG9ja19zcmNdCisgICAgbGRyICAgICByNSwgW3IwLCAjdnA4X2Jsb2NrX3NyY19kaWZmXQorICAgIGxkciAgICAgcjMsIFtyM10KKyAgICBsZHIgICAgIHI2LCBbcjAsICN2cDhfYmxvY2tfc3JjX3N0cmlkZV0KKyAgICBhZGQgICAgIHIzLCByMywgcjQgICAgICAgICAgICAgICAgICAgICAgOyBzcmMgPSAqYmFzZV9zcmMgKyBzcmMKKyAgICBsZHIgICAgIHI3LCBbcjEsICN2cDhfYmxvY2tkX3ByZWRpY3Rvcl0KKworICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjNdLCByNiAgICAgICAgICA7bG9hZCBzcmMKKyAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3I3XSwgcjIgICAgICAgICAgO2xvYWQgcHJlZAorICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjNdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCBbcjddLCByMgorICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCBbcjNdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCBbcjddLCByMgorICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCBbcjNdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCBbcjddLCByMgorCisgICAgdnN1YmwudTggICAgICAgIHExMCwgZDAsIGQxCisgICAgdnN1YmwudTggICAgICAgIHExMSwgZDIsIGQzCisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDQsIGQ1CisgICAgdnN1YmwudTggICAgICAgIHExMywgZDYsIGQ3CisKKyAgICBtb3YgICAgICAgICAgICAgcjIsIHIyLCBsc2wgIzEKKworICAgIHZzdDEuMTYgICAgICAgICB7ZDIwfSwgW3I1XSwgcjIgICAgICAgICA7c3RvcmUgZGlmZgorICAgIHZzdDEuMTYgICAgICAgICB7ZDIyfSwgW3I1XSwgcjIKKyAgICB2c3QxLjE2ICAgICAgICAge2QyNH0sIFtyNV0sIHIyCisgICAgdnN0MS4xNiAgICAgICAgIHtkMjZ9LCBbcjVdLCByMgorCisgICAgbGRtZmQgICBzcCEsIHtyNC1yN30KKyAgICBieCAgICAgICAgICAgICAgbHIKKworICAgIEVORFAKKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7dm9pZCB2cDhfc3VidHJhY3RfbWJ5X25lb24oc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zdHJpZGUKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcHJlZF9zdHJpZGUpCit8dnA4X3N1YnRyYWN0X21ieV9uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAgICAgIHtyNC1yN30KKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNAorICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjMTZdICAgICAgICAgICA7IHByZWRfc3RyaWRlCisgICAgbW92ICAgICAgICAgICAgIHI2LCAjMzIgICAgICAgICAgICAgICAgIDsgImRpZmYiIHN0cmlkZSB4MgorICAgIGFkZCAgICAgICAgICAgICByNSwgcjAsICMxNiAgICAgICAgICAgICA7IHNlY29uZCBkaWZmIHBvaW50ZXIKKworc3VidHJhY3RfbWJ5X2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IxXSwgcjIgICAgICAgICAgO2xvYWQgc3JjCisgICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyM10sIHI0ICAgICAgICAgIDtsb2FkIHByZWQKKyAgICB2bGQxLjggICAgICAgICAge3EyfSwgW3IxXSwgcjIKKyAgICB2bGQxLjggICAgICAgICAge3EzfSwgW3IzXSwgcjQKKyAgICB2bGQxLjggICAgICAgICAge3E0fSwgW3IxXSwgcjIKKyAgICB2bGQxLjggICAgICAgICAge3E1fSwgW3IzXSwgcjQKKyAgICB2bGQxLjggICAgICAgICAge3E2fSwgW3IxXSwgcjIKKyAgICB2bGQxLjggICAgICAgICAge3E3fSwgW3IzXSwgcjQKKworICAgIHZzdWJsLnU4ICAgICAgICBxOCwgZDAsIGQyCisgICAgdnN1YmwudTggICAgICAgIHE5LCBkMSwgZDMKKyAgICB2c3VibC51OCAgICAgICAgcTEwLCBkNCwgZDYKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkNSwgZDcKKyAgICB2c3VibC51OCAgICAgICAgcTEyLCBkOCwgZDEwCisgICAgdnN1YmwudTggICAgICAgIHExMywgZDksIGQxMQorICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQxMiwgZDE0CisgICAgdnN1YmwudTggICAgICAgIHExNSwgZDEzLCBkMTUKKworICAgIHZzdDEuMTYgICAgICAgICB7cTh9LCBbcjBdLCByNiAgICAgICAgICA7c3RvcmUgZGlmZgorICAgIHZzdDEuMTYgICAgICAgICB7cTl9LCBbcjVdLCByNgorICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IwXSwgcjYKKyAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyNV0sIHI2CisgICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjBdLCByNgorICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3I1XSwgcjYKKyAgICB2c3QxLjE2ICAgICAgICAge3ExNH0sIFtyMF0sIHI2CisgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCBbcjVdLCByNgorCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgIGJuZSAgICAgICAgICAgICBzdWJ0cmFjdF9tYnlfbG9vcAorCisgICAgcG9wICAgICAgICAgICAgIHtyNC1yN30KKyAgICBieCAgICAgICAgICAgICAgbHIKKyAgICBFTkRQCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzt2b2lkIHZwOF9zdWJ0cmFjdF9tYnV2X2Moc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnVzcmMsIHVuc2lnbmVkIGNoYXIgKnZzcmMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICp1cHJlZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdnByZWQsIGludCBwcmVkX3N0cmlkZSkKKworfHZwOF9zdWJ0cmFjdF9tYnV2X25lb258IFBST0MKKyAgICBwdXNoICAgICAgICAgICAge3I0LXI3fQorICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjMTZdICAgICAgIDsgdXByZWQKKyAgICBsZHIgICAgICAgICAgICAgcjUsIFtzcCwgIzIwXSAgICAgICA7IHZwcmVkCisgICAgbGRyICAgICAgICAgICAgIHI2LCBbc3AsICMyNF0gICAgICAgOyBwcmVkX3N0cmlkZQorICAgIGFkZCAgICAgICAgICAgICByMCwgcjAsICM1MTIgICAgICAgIDsgc2hvcnQgKnVkaWZmID0gZGlmZiArIDI1NjsKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMzIgICAgICAgICAgICA7ICJkaWZmIiBzdHJpZGUgeDIKKyAgICBhZGQgICAgICAgICAgICAgcjcsIHIwLCAjMTYgICAgICAgICA7IHNlY29uZCBkaWZmIHBvaW50ZXIKKworO3UKKyAgICB2bGQxLjggICAgICAgICAge2QwfSwgW3IxXSwgcjMgICAgICA7bG9hZCB1c3JjCisgICAgdmxkMS44ICAgICAgICAgIHtkMX0sIFtyNF0sIHI2ICAgICAgO2xvYWQgdXByZWQKKyAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IxXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3I0XSwgcjYKKyAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IxXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2Q1fSwgW3I0XSwgcjYKKyAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IxXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2Q3fSwgW3I0XSwgcjYKKyAgICB2bGQxLjggICAgICAgICAge2Q4fSwgW3IxXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2Q5fSwgW3I0XSwgcjYKKyAgICB2bGQxLjggICAgICAgICAge2QxMH0sIFtyMV0sIHIzCisgICAgdmxkMS44ICAgICAgICAgIHtkMTF9LCBbcjRdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDEyfSwgW3IxXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QxM30sIFtyNF0sIHI2CisgICAgdmxkMS44ICAgICAgICAgIHtkMTR9LCBbcjFdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7ZDE1fSwgW3I0XSwgcjYKKworICAgIHZzdWJsLnU4ICAgICAgICBxOCwgZDAsIGQxCisgICAgdnN1YmwudTggICAgICAgIHE5LCBkMiwgZDMKKyAgICB2c3VibC51OCAgICAgICAgcTEwLCBkNCwgZDUKKyAgICB2c3VibC51OCAgICAgICAgcTExLCBkNiwgZDcKKyAgICB2c3VibC51OCAgICAgICAgcTEyLCBkOCwgZDkKKyAgICB2c3VibC51OCAgICAgICAgcTEzLCBkMTAsIGQxMQorICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQxMiwgZDEzCisgICAgdnN1YmwudTggICAgICAgIHExNSwgZDE0LCBkMTUKKworICAgIHZzdDEuMTYgICAgICAgICB7cTh9LCBbcjBdLCByMTIgICAgIDtzdG9yZSBkaWZmCisgICAgdnN0MS4xNiAgICAgICAgIHtxOX0sIFtyN10sIHIxMgorICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IwXSwgcjEyCisgICAgdnN0MS4xNiAgICAgICAgIHtxMTF9LCBbcjddLCByMTIKKyAgICB2c3QxLjE2ICAgICAgICAge3ExMn0sIFtyMF0sIHIxMgorICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3I3XSwgcjEyCisgICAgdnN0MS4xNiAgICAgICAgIHtxMTR9LCBbcjBdLCByMTIKKyAgICB2c3QxLjE2ICAgICAgICAge3ExNX0sIFtyN10sIHIxMgorCis7dgorICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjJdLCByMyAgICAgIDtsb2FkIHZzcmMKKyAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3I1XSwgcjYgICAgICA7bG9hZCB2cHJlZAorICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjJdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCBbcjVdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCBbcjJdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCBbcjVdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCBbcjJdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCBbcjVdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDh9LCBbcjJdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7ZDl9LCBbcjVdLCByNgorICAgIHZsZDEuOCAgICAgICAgICB7ZDEwfSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QxMX0sIFtyNV0sIHI2CisgICAgdmxkMS44ICAgICAgICAgIHtkMTJ9LCBbcjJdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7ZDEzfSwgW3I1XSwgcjYKKyAgICB2bGQxLjggICAgICAgICAge2QxNH0sIFtyMl0sIHIzCisgICAgdmxkMS44ICAgICAgICAgIHtkMTV9LCBbcjVdLCByNgorCisgICAgdnN1YmwudTggICAgICAgIHE4LCBkMCwgZDEKKyAgICB2c3VibC51OCAgICAgICAgcTksIGQyLCBkMworICAgIHZzdWJsLnU4ICAgICAgICBxMTAsIGQ0LCBkNQorICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQ2LCBkNworICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQ4LCBkOQorICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQxMCwgZDExCisgICAgdnN1YmwudTggICAgICAgIHExNCwgZDEyLCBkMTMKKyAgICB2c3VibC51OCAgICAgICAgcTE1LCBkMTQsIGQxNQorCisgICAgdnN0MS4xNiAgICAgICAgIHtxOH0sIFtyMF0sIHIxMiAgICAgO3N0b3JlIGRpZmYKKyAgICB2c3QxLjE2ICAgICAgICAge3E5fSwgW3I3XSwgcjEyCisgICAgdnN0MS4xNiAgICAgICAgIHtxMTB9LCBbcjBdLCByMTIKKyAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyN10sIHIxMgorICAgIHZzdDEuMTYgICAgICAgICB7cTEyfSwgW3IwXSwgcjEyCisgICAgdnN0MS4xNiAgICAgICAgIHtxMTN9LCBbcjddLCByMTIKKyAgICB2c3QxLjE2ICAgICAgICAge3ExNH0sIFtyMF0sIHIxMgorICAgIHZzdDEuMTYgICAgICAgICB7cTE1fSwgW3I3XSwgcjEyCisKKyAgICBwb3AgICAgICAgICAgICAge3I0LXI3fQorICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X21lbWNweV9uZW9uLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfbWVtY3B5X25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X21lbWNweV9uZW9uLmFzbQpAQCAtMCwwICsxLDcwIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUIHx2cDhfbWVtY3B5X3BhcnRpYWxfbmVvbnwKKworICAgIEFSTQorICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorO3RoaXMgaXMgbm90IGEgZnVsbCBtZW1jcHkgZnVuY3Rpb24hISEKKzt2b2lkIHZwOF9tZW1jcHlfcGFydGlhbF9uZW9uKHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3opOworfHZwOF9tZW1jcHlfcGFydGlhbF9uZW9ufCBQUk9DCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjFdICAgICAgICAgICAgICAgICAgICAgICAgO3ByZWxvYWQgcHJlZCBkYXRhCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjEsICMxMjhdCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjEsICMyNTZdCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjEsICMzODRdCisKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCByMiwgbHNyICM4ICAgICAgICAgICAgICAgICA7Y29weSAyNTYgYnl0ZXMgZGF0YSBhdCBvbmUgdGltZQorCittZW1jcHlfbmVvbl9sb29wCisgICAgdmxkMS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjFdISAgICAgICAgICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3IwXSEgICAgICAgICAgICAgICAgIDtjb3B5IHRvIGRzdF9wdHIKKyAgICB2bGQxLjggICAgICAgICAge3E0LCBxNX0sIFtyMV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjBdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3IxXSEKKyAgICB2c3QxLjggICAgICAgICAge3E0LCBxNX0sIFtyMF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3IwXSEKKyAgICB2bGQxLjggICAgICAgICAge3ExMCwgcTExfSwgW3IxXSEKKyAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyMF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyMV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMF0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyMF0hCisKKyAgICA7cGxkICAgICAgICAgICAgICAgIFtyMV0gICAgICAgICAgICAgICAgICAgICAgICA7cHJlbG9hZCBwcmVkIGRhdGEgLS0gbmVlZCB0byBhZGp1c3QgZm9yIHJlYWwgZGV2aWNlCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjEsICMxMjhdCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjEsICMyNTZdCisgICAgO3BsZCAgICAgICAgICAgICAgICBbcjEsICMzODRdCisKKyAgICBibmUgICAgICAgICAgICAgbWVtY3B5X25lb25fbG9vcAorCisgICAgYW5kcyAgICAgICAgICAgIHIzLCByMiwgIzB4ZmYgICAgICAgICAgICAgICAgICAgO2V4dHJhIGNvcHkKKyAgICBiZXEgICAgICAgICAgICAgZG9uZV9jb3B5X25lb25fbG9vcAorCitleHRyYV9jb3B5X25lb25fbG9vcAorICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjFdISAgICAgICAgICAgICAgICAgO2xvYWQgc3JjIGRhdGEKKyAgICBzdWJzICAgICAgICAgICAgcjMsIHIzLCAjMTYKKyAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3IwXSEKKyAgICBibmUgICAgICAgICAgICAgZXh0cmFfY29weV9uZW9uX2xvb3AKKworZG9uZV9jb3B5X25lb25fbG9vcAorICAgIGJ4ICAgICAgICAgICAgICBscgorICAgIEVORFAKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9tc2UxNngxNl9uZW9uLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfbXNlMTZ4MTZfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZGJmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfbXNlMTZ4MTZfbmVvbi5hc20KQEAgLTAsMCArMSwxMTYgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyAgICBFWFBPUlQgIHx2cDhfbXNlMTZ4MTZfbmVvbnwKKyAgICBFWFBPUlQgIHx2cDhfZ2V0NHg0c3NlX2NzX25lb258CisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCis7IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCis7IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKKzsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKKzsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKKztub3RlOiBpbiB0aGlzIGZ1bmN0aW9uLCBzdW0gaXMgbmV2ZXIgdXNlZC4gU28sIHdlIGNhbiByZW1vdmUgdGhpcyBwYXJ0IG9mIGNhbGN1bGF0aW9uCis7ZnJvbSB2cDhfdmFyaWFuY2UoKS4KKworfHZwOF9tc2UxNngxNl9uZW9ufCBQUk9DCisgICAgdm1vdi5pOCAgICAgICAgIHE3LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTcsIHE4LCBxOSwgcTEwIC0gc3NlCisgICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMAorICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAKKyAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAorCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKKworbXNlMTZ4MTZfbmVvbl9sb29wCisgICAgdmxkMS44ICAgICAgICAgIHtxMH0sIFtyMF0sIHIxICAgICAgICAgICAgICA7TG9hZCB1cCBzb3VyY2UgYW5kIHJlZmVyZW5jZQorICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjJdLCByMworICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjBdLCByMQorICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCBbcjJdLCByMworCisgICAgdnN1YmwudTggICAgICAgIHExMSwgZDAsIGQ0CisgICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1CisgICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2CisgICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3CisKKyAgICB2bWxhbC5zMTYgICAgICAgcTcsIGQyMiwgZDIyCisgICAgdm1sYWwuczE2ICAgICAgIHE4LCBkMjMsIGQyMworCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorCisgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjQsIGQyNAorICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNSwgZDI1CisgICAgdm1sYWwuczE2ICAgICAgIHE3LCBkMjYsIGQyNgorICAgIHZtbGFsLnMxNiAgICAgICBxOCwgZDI3LCBkMjcKKyAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyOCwgZDI4CisgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI5LCBkMjkKKworICAgIGJuZSAgICAgICAgICAgICBtc2UxNngxNl9uZW9uX2xvb3AKKworICAgIHZhZGQudTMyICAgICAgICBxNywgcTcsIHE4CisgICAgdmFkZC51MzIgICAgICAgIHE5LCBxOSwgcTEwCisKKyAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCisKKyAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxNywgcTkKKyAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAorICAgIHZhZGQudTY0ICAgICAgICBkMCwgZDIsIGQzCisKKyAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgW3IxMl0KKyAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdCisKKyAgICBieCAgICAgICAgICAgICAgbHIKKworICAgIEVORFAKKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKzsgcjEgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAorOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAorOyByMyAgICBpbnQgIHJlY29uX3N0cmlkZQorfHZwOF9nZXQ0eDRzc2VfY3NfbmVvbnwgUFJPQworICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKKyAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q1fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IyXSwgcjMKKyAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3IwXSwgcjEKKyAgICB2bGQxLjggICAgICAgICAge2Q3fSwgW3IyXSwgcjMKKworICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkNAorICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQxLCBkNQorICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQyLCBkNgorICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQzLCBkNworCisgICAgdm11bGwuczE2ICAgICAgIHE3LCBkMjIsIGQyMgorICAgIHZtdWxsLnMxNiAgICAgICBxOCwgZDI0LCBkMjQKKyAgICB2bXVsbC5zMTYgICAgICAgcTksIGQyNiwgZDI2CisgICAgdm11bGwuczE2ICAgICAgIHExMCwgZDI4LCBkMjgKKworICAgIHZhZGQudTMyICAgICAgICBxNywgcTcsIHE4CisgICAgdmFkZC51MzIgICAgICAgIHE5LCBxOSwgcTEwCisgICAgdmFkZC51MzIgICAgICAgIHE5LCBxNywgcTkKKworICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTkKKyAgICB2YWRkLnU2NCAgICAgICAgZDAsIGQyLCBkMworCisgICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXQorICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3Nob3J0d2Fsc2g0eDRfbmVvbi5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3Nob3J0d2Fsc2g0eDRfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyNjYyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfc2hvcnR3YWxzaDR4NF9uZW9uLmFzbQpAQCAtMCwwICsxLDEwMyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworICAgIEVYUE9SVCAgfHZwOF9zaG9ydF93YWxzaDR4NF9uZW9ufAorCisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgorO3ZvaWQgdnA4X3Nob3J0X3dhbHNoNHg0X25lb24oc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCis7IHIwICAgc2hvcnQgKmlucHV0LAorOyByMSAgIHNob3J0ICpvdXRwdXQsCis7IHIyICAgaW50IHBpdGNoCit8dnA4X3Nob3J0X3dhbHNoNHg0X25lb258IFBST0MKKworICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjBANjRdLCByMiAgIDsgbG9hZCBpbnB1dAorICAgIHZsZDEuMTYgICAgICAgICB7ZDF9LCBbcjBANjRdLCByMgorICAgIHZsZDEuMTYgICAgICAgICB7ZDJ9LCBbcjBANjRdLCByMgorICAgIHZsZDEuMTYgICAgICAgICB7ZDN9LCBbcjBANjRdCisKKyAgICA7Rmlyc3QgZm9yLWxvb3AKKyAgICA7dHJhbnNwb3NlIGQwLCBkMSwgZDIsIGQzLiBUaGVuLCBkMD1pcFswXSwgZDE9aXBbMV0sIGQyPWlwWzJdLCBkMz1pcFszXQorICAgIHZ0cm4uMzIgICAgICAgICBkMCwgZDIKKyAgICB2dHJuLjMyICAgICAgICAgZDEsIGQzCisKKyAgICB2bW92LnMzMiAgICAgICAgcTE1LCAjMyAgICAgICAgICAgICA7IGFkZCAzIHRvIGFsbCB2YWx1ZXMKKworICAgIHZ0cm4uMTYgICAgICAgICBkMCwgZDEKKyAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQzCisKKyAgICB2YWRkLnMxNiAgICAgICAgZDQsIGQwLCBkMiAgICAgICAgICA7IGlwWzBdICsgaXBbMl0KKyAgICB2YWRkLnMxNiAgICAgICAgZDUsIGQxLCBkMyAgICAgICAgICA7IGlwWzFdICsgaXBbM10KKyAgICB2c3ViLnMxNiAgICAgICAgZDYsIGQxLCBkMyAgICAgICAgICA7IGlwWzFdIC0gaXBbM10KKyAgICB2c3ViLnMxNiAgICAgICAgZDcsIGQwLCBkMiAgICAgICAgICA7IGlwWzBdIC0gaXBbMl0KKworICAgIHZzaGwuczE2ICAgICAgICBkNCwgZDQsICMyICAgICAgICAgIDsgYTEgPSAoaXBbMF0gKyBpcFsyXSkgPDwgMgorICAgIHZzaGwuczE2ICAgICAgICBkNSwgZDUsICMyICAgICAgICAgIDsgZDEgPSAoaXBbMV0gKyBpcFszXSkgPDwgMgorICAgIHZzaGwuczE2ICAgICAgICBkNiwgZDYsICMyICAgICAgICAgIDsgYzEgPSAoaXBbMV0gLSBpcFszXSkgPDwgMgorICAgIHZjZXEuczE2ICAgICAgICBkMTYsIGQ0LCAjMCAgICAgICAgIDsgYTEgPT0gMAorICAgIHZzaGwuczE2ICAgICAgICBkNywgZDcsICMyICAgICAgICAgIDsgYjEgPSAoaXBbMF0gLSBpcFsyXSkgPDwgMgorCisgICAgdmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgOyBhMSArIGQxCisgICAgdm12biAgICAgICAgICAgIGQxNiwgZDE2ICAgICAgICAgICAgOyBhMSAhPSAwCisgICAgdnN1Yi5zMTYgICAgICAgIGQzLCBkNCwgZDUgICAgICAgICAgOyBvcFszXSA9IGExIC0gZDEKKyAgICB2YWRkLnMxNiAgICAgICAgZDEsIGQ3LCBkNiAgICAgICAgICA7IG9wWzFdID0gYjEgKyBjMQorICAgIHZzdWIuczE2ICAgICAgICBkMiwgZDcsIGQ2ICAgICAgICAgIDsgb3BbMl0gPSBiMSAtIGMxCisgICAgdnN1Yi5zMTYgICAgICAgIGQwLCBkMCwgZDE2ICAgICAgICAgOyBvcFswXSA9IGExICsgZDEgKyAoYTEgIT0gMCkKKworICAgIDtTZWNvbmQgZm9yLWxvb3AKKyAgICA7dHJhbnNwb3NlIGQwLCBkMSwgZDIsIGQzLCBUaGVuLCBkMD1pcFswXSwgZDE9aXBbNF0sIGQyPWlwWzhdLCBkMz1pcFsxMl0KKyAgICB2dHJuLjMyICAgICAgICAgZDEsIGQzCisgICAgdnRybi4zMiAgICAgICAgIGQwLCBkMgorICAgIHZ0cm4uMTYgICAgICAgICBkMiwgZDMKKyAgICB2dHJuLjE2ICAgICAgICAgZDAsIGQxCisKKyAgICB2YWRkbC5zMTYgICAgICAgcTgsIGQwLCBkMiAgICAgICAgICA7IGExID0gaXBbMF0raXBbOF0KKyAgICB2YWRkbC5zMTYgICAgICAgcTksIGQxLCBkMyAgICAgICAgICA7IGQxID0gaXBbNF0raXBbMTJdCisgICAgdnN1YmwuczE2ICAgICAgIHExMCwgZDEsIGQzICAgICAgICAgOyBjMSA9IGlwWzRdLWlwWzEyXQorICAgIHZzdWJsLnMxNiAgICAgICBxMTEsIGQwLCBkMiAgICAgICAgIDsgYjEgPSBpcFswXS1pcFs4XQorCisgICAgdmFkZC5zMzIgICAgICAgIHEwLCBxOCwgcTkgICAgICAgICAgOyBhMiA9IGExICsgZDEKKyAgICB2YWRkLnMzMiAgICAgICAgcTEsIHExMSwgcTEwICAgICAgICA7IGIyID0gYjEgKyBjMQorICAgIHZzdWIuczMyICAgICAgICBxMiwgcTExLCBxMTAgICAgICAgIDsgYzIgPSBiMSAtIGMxCisgICAgdnN1Yi5zMzIgICAgICAgIHEzLCBxOCwgcTkgICAgICAgICAgOyBkMiA9IGExIC0gZDEKKworICAgIHZjbHQuczMyICAgICAgICBxOCwgcTAsICMwCisgICAgdmNsdC5zMzIgICAgICAgIHE5LCBxMSwgIzAKKyAgICB2Y2x0LnMzMiAgICAgICAgcTEwLCBxMiwgIzAKKyAgICB2Y2x0LnMzMiAgICAgICAgcTExLCBxMywgIzAKKworICAgIDsgc3VidHJhY3QgLTEgKG9yIDApCisgICAgdnN1Yi5zMzIgICAgICAgIHEwLCBxMCwgcTggICAgICAgICAgOyBhMiArPSBhMiA8IDAKKyAgICB2c3ViLnMzMiAgICAgICAgcTEsIHExLCBxOSAgICAgICAgICA7IGIyICs9IGIyIDwgMAorICAgIHZzdWIuczMyICAgICAgICBxMiwgcTIsIHExMCAgICAgICAgIDsgYzIgKz0gYzIgPCAwCisgICAgdnN1Yi5zMzIgICAgICAgIHEzLCBxMywgcTExICAgICAgICAgOyBkMiArPSBkMiA8IDAKKworICAgIHZhZGQuczMyICAgICAgICBxOCwgcTAsIHExNSAgICAgICAgIDsgYTIgKyAzCisgICAgdmFkZC5zMzIgICAgICAgIHE5LCBxMSwgcTE1ICAgICAgICAgOyBiMiArIDMKKyAgICB2YWRkLnMzMiAgICAgICAgcTEwLCBxMiwgcTE1ICAgICAgICA7IGMyICsgMworICAgIHZhZGQuczMyICAgICAgICBxMTEsIHEzLCBxMTUgICAgICAgIDsgZDIgKyAzCisKKyAgICA7IHZyc2hybj8gd291bGQgYWRkIDEgPDwgMy0xID0gMgorICAgIHZzaHJuLnMzMiAgICAgICBkMCwgcTgsICMzCisgICAgdnNocm4uczMyICAgICAgIGQxLCBxOSwgIzMKKyAgICB2c2hybi5zMzIgICAgICAgZDIsIHExMCwgIzMKKyAgICB2c2hybi5zMzIgICAgICAgZDMsIHExMSwgIzMKKworICAgIHZzdDEuMTYgICAgICAgICB7cTAsIHExfSwgW3IxQDEyOF0KKworICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgRU5EUAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYXJtL3F1YW50aXplX2FybS5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9xdWFudGl6ZV9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk5ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FybS9xdWFudGl6ZV9hcm0uYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZwOC9lbmNvZGVyL2Jsb2NrLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZwOC9lbmNvZGVyL3F1YW50aXplLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9lbnRyb3B5LmgiCisKKworI2lmIEhBVkVfTkVPTgorCisvKiB2cDhfcXVhbnRpemVfbWJYIGZ1bmN0aW9ucyBoZXJlIGRpZmZlcnMgZnJvbSBjb3JyZXNwb25kaW5nIG9uZXMgaW4KKyAqIHF1YW50aXplLmMgb25seSBieSB1c2luZyBxdWFudGl6ZV9iX3BhaXIgZnVuY3Rpb24gcG9pbnRlciBpbnN0ZWFkIG9mCisgKiB0aGUgcmVndWxhciBxdWFudGl6ZV9iIGZ1bmN0aW9uIHBvaW50ZXIgKi8KK3ZvaWQgdnA4X3F1YW50aXplX21ieV9uZW9uKE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGk7CisgICAgaW50IGhhc18ybmRfb3JkZXIgPSAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQKKyAgICAgICAgJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSs9MikKKyAgICAgICAgeC0+cXVhbnRpemVfYl9wYWlyKCZ4LT5ibG9ja1tpXSwgJngtPmJsb2NrW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmeC0+ZV9tYmQuYmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpKzFdKTsKKworICAgIGlmKGhhc18ybmRfb3JkZXIpCisgICAgICAgIHgtPnF1YW50aXplX2IoJngtPmJsb2NrWzI0XSwgJngtPmVfbWJkLmJsb2NrWzI0XSk7Cit9CisKK3ZvaWQgdnA4X3F1YW50aXplX21iX25lb24oTUFDUk9CTE9DSyAqeCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgaGFzXzJuZF9vcmRlcj0oeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQKKyAgICAgICAgJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNDsgaSs9MikKKyAgICAgICAgeC0+cXVhbnRpemVfYl9wYWlyKCZ4LT5ibG9ja1tpXSwgJngtPmJsb2NrW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmeC0+ZV9tYmQuYmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpKzFdKTsKKworICAgIGlmIChoYXNfMm5kX29yZGVyKQorICAgICAgICB4LT5xdWFudGl6ZV9iKCZ4LT5ibG9ja1syNF0sICZ4LT5lX21iZC5ibG9ja1syNF0pOworfQorCisKK3ZvaWQgdnA4X3F1YW50aXplX21idXZfbmVvbihNQUNST0JMT0NLICp4KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSs9MikKKyAgICAgICAgeC0+cXVhbnRpemVfYl9wYWlyKCZ4LT5ibG9ja1tpXSwgJngtPmJsb2NrW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmeC0+ZV9tYmQuYmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpKzFdKTsKK30KKworI2VuZGlmIC8qIEhBVkVfTkVPTiAqLwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2FzbV9lbmNfb2Zmc2V0cy5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2FzbV9lbmNfb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTY5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfcG9ydHMvYXNtX29mZnNldHMuaCIKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAiYmxvY2suaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAidHJlZXdyaXRlci5oIgorI2luY2x1ZGUgInRva2VuaXplLmgiCisKK0JFR0lOCisKKy8qIHJlZ3VsYXIgcXVhbnRpemUgKi8KK0RFRklORSh2cDhfYmxvY2tfY29lZmYsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCBjb2VmZikpOworREVGSU5FKHZwOF9ibG9ja196YmluLCAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0ssIHpiaW4pKTsKK0RFRklORSh2cDhfYmxvY2tfcm91bmQsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCByb3VuZCkpOworREVGSU5FKHZwOF9ibG9ja19xdWFudCwgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0ssIHF1YW50KSk7CitERUZJTkUodnA4X2Jsb2NrX3F1YW50X2Zhc3QsICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgcXVhbnRfZmFzdCkpOworREVGSU5FKHZwOF9ibG9ja196YmluX2V4dHJhLCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0ssIHpiaW5fZXh0cmEpKTsKK0RFRklORSh2cDhfYmxvY2tfenJ1bl96YmluX2Jvb3N0LCAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCB6cnVuX3piaW5fYm9vc3QpKTsKK0RFRklORSh2cDhfYmxvY2tfcXVhbnRfc2hpZnQsICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCBxdWFudF9zaGlmdCkpOworCitERUZJTkUodnA4X2Jsb2NrZF9xY29lZmYsICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DS0QsIHFjb2VmZikpOworREVGSU5FKHZwOF9ibG9ja2RfZGVxdWFudCwgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0tELCBkZXF1YW50KSk7CitERUZJTkUodnA4X2Jsb2NrZF9kcWNvZWZmLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DS0QsIGRxY29lZmYpKTsKK0RFRklORSh2cDhfYmxvY2tkX2VvYiwgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLRCwgZW9iKSk7CisKKy8qIHN1YnRyYWN0ICovCitERUZJTkUodnA4X2Jsb2NrX2Jhc2Vfc3JjLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgYmFzZV9zcmMpKTsKK0RFRklORSh2cDhfYmxvY2tfc3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCBzcmMpKTsKK0RFRklORSh2cDhfYmxvY2tfc3JjX2RpZmYsICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCBzcmNfZGlmZikpOworREVGSU5FKHZwOF9ibG9ja19zcmNfc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0ssIHNyY19zdHJpZGUpKTsKKworREVGSU5FKHZwOF9ibG9ja2RfcHJlZGljdG9yLCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0tELCBwcmVkaWN0b3IpKTsKKworLyogcGFjayB0b2tlbnMgKi8KK0RFRklORSh2cDhfd3JpdGVyX2xvd3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF93cml0ZXIsIGxvd3ZhbHVlKSk7CitERUZJTkUodnA4X3dyaXRlcl9yYW5nZSwgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfd3JpdGVyLCByYW5nZSkpOworREVGSU5FKHZwOF93cml0ZXJfY291bnQsICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YodnA4X3dyaXRlciwgY291bnQpKTsKK0RFRklORSh2cDhfd3JpdGVyX3BvcywgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF93cml0ZXIsIHBvcykpOworREVGSU5FKHZwOF93cml0ZXJfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YodnA4X3dyaXRlciwgYnVmZmVyKSk7CitERUZJTkUodnA4X3dyaXRlcl9idWZmZXJfZW5kLCAgICAgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfd3JpdGVyLCBidWZmZXJfZW5kKSk7CitERUZJTkUodnA4X3dyaXRlcl9lcnJvciwgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfd3JpdGVyLCBlcnJvcikpOworCitERUZJTkUodG9rZW5leHRyYV90b2tlbiwgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihUT0tFTkVYVFJBLCBUb2tlbikpOworREVGSU5FKHRva2VuZXh0cmFfZXh0cmEsICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5FWFRSQSwgRXh0cmEpKTsKK0RFRklORSh0b2tlbmV4dHJhX2NvbnRleHRfdHJlZSwgICAgICAgICAgICAgICAgIG9mZnNldG9mKFRPS0VORVhUUkEsIGNvbnRleHRfdHJlZSkpOworREVGSU5FKHRva2VuZXh0cmFfc2tpcF9lb2Jfbm9kZSwgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5FWFRSQSwgc2tpcF9lb2Jfbm9kZSkpOworREVGSU5FKFRPS0VORVhUUkFfU1osICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRPS0VORVhUUkEpKTsKKworREVGSU5FKHZwOF9leHRyYV9iaXRfc3RydWN0X3N6LCAgICAgICAgICAgICAgICAgc2l6ZW9mKHZwOF9leHRyYV9iaXRfc3RydWN0KSk7CisKK0RFRklORSh2cDhfdG9rZW5fdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF90b2tlbiwgdmFsdWUpKTsKK0RFRklORSh2cDhfdG9rZW5fbGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF90b2tlbiwgTGVuKSk7CisKK0RFRklORSh2cDhfZXh0cmFfYml0X3N0cnVjdF90cmVlLCAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF9leHRyYV9iaXRfc3RydWN0LCB0cmVlKSk7CitERUZJTkUodnA4X2V4dHJhX2JpdF9zdHJ1Y3RfcHJvYiwgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfZXh0cmFfYml0X3N0cnVjdCwgcHJvYikpOworREVGSU5FKHZwOF9leHRyYV9iaXRfc3RydWN0X2xlbiwgICAgICAgICAgICAgICAgb2Zmc2V0b2YodnA4X2V4dHJhX2JpdF9zdHJ1Y3QsIExlbikpOworREVGSU5FKHZwOF9leHRyYV9iaXRfc3RydWN0X2Jhc2VfdmFsLCAgICAgICAgICAgb2Zmc2V0b2YodnA4X2V4dHJhX2JpdF9zdHJ1Y3QsIGJhc2VfdmFsKSk7CisKK0RFRklORSh2cDhfY29tcF90cGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01QLCB0cGxpc3QpKTsKK0RFRklORSh2cDhfY29tcF9jb21tb24sICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01QLCBjb21tb24pKTsKK0RFRklORSh2cDhfY29tcF9iYyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01QLCBiYykpOworREVGSU5FKHZwOF93cml0ZXJfc3ogLCAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZwOF93cml0ZXIpKTsKKworREVGSU5FKHRva2VubGlzdF9zdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5MSVNULCBzdGFydCkpOworREVGSU5FKHRva2VubGlzdF9zdG9wLCAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5MSVNULCBzdG9wKSk7CitERUZJTkUoVE9LRU5MSVNUX1NaLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVE9LRU5MSVNUKSk7CisKK0RFRklORSh2cDhfY29tbW9uX21iX3Jvd3MsICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01NT04sIG1iX3Jvd3MpKTsKKworRU5ECisKKy8qIGFkZCBhc3NlcnRzIGZvciBhbnkgb2Zmc2V0IHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBhc3NlbWJseSBjb2RlCisgKiBhZGQgYXNzZXJ0cyBmb3IgYW55IHNpemUgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFzc2VtYmx5IGNvZGUKKworICogVGhlc2UgYXJlIHVzZWQgaW4gdnA4Y3hfcGFja190b2tlbnMuICBUaGV5IGFyZSBoYXJkIGNvZGVkIHNvIGlmIHRoZWlyIHNpemVzCisgKiBjaGFuZ2UgdGhleSB3aWxsIGhhdmUgdG8gYmUgYWRqdXN0ZWQuCisgKi8KKworI2lmIEhBVkVfRURTUAorY3RfYXNzZXJ0KFRPS0VORVhUUkFfU1osIHNpemVvZihUT0tFTkVYVFJBKSA9PSA4KQorY3RfYXNzZXJ0KHZwOF9leHRyYV9iaXRfc3RydWN0X3N6LCBzaXplb2YodnA4X2V4dHJhX2JpdF9zdHJ1Y3QpID09IDE2KQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYml0c3RyZWFtLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvYml0c3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0YWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9iaXRzdHJlYW0uYwpAQCAtMCwwICsxLDE3MzIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnA4L2NvbW1vbi9oZWFkZXIuaCIKKyNpbmNsdWRlICJlbmNvZGVtdi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW1vZGUuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKKyNpbmNsdWRlICJtY29tcC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJ2cDgvY29tbW9uL3ByYWdtYXMuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKworI2luY2x1ZGUgImRlZmF1bHRjb2VmY291bnRzLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9jb21tb24uaCIKKworY29uc3QgaW50IHZwOGN4X2Jhc2Vfc2tpcF9mYWxzZV9wcm9iWzEyOF0gPQoreworICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1MSwgMjQ4LCAyNDQsIDI0MCwgMjM2LCAyMzIsIDIyOSwgMjI1LAorICAgIDIyMSwgMjE3LCAyMTMsIDIwOCwgMjA0LCAxOTksIDE5NCwgMTkwLAorICAgIDE4NywgMTgzLCAxNzksIDE3NSwgMTcyLCAxNjgsIDE2NCwgMTYwLAorICAgIDE1NywgMTUzLCAxNDksIDE0NSwgMTQyLCAxMzgsIDEzNCwgMTMwLAorICAgIDEyNywgMTI0LCAxMjAsIDExNywgMTE0LCAxMTAsIDEwNywgMTA0LAorICAgIDEwMSwgOTgsICA5NSwgIDkyLCAgODksICA4NiwgIDgzLCA4MCwKKyAgICA3NywgIDc0LCAgNzEsICA2OCwgIDY1LCAgNjIsICA1OSwgNTYsCisgICAgNTMsICA1MCwgIDQ3LCAgNDQsICA0MSwgIDM4LCAgMzUsIDMyLAorICAgIDMwLCAgMjgsICAyNiwgIDI0LCAgMjIsICAyMCwgIDE4LCAxNiwKK307CisKKyNpZiBkZWZpbmVkKFNFQ1RJT05CSVRTX09VVFBVVCkKK3Vuc2lnbmVkIF9faW50NjQgU2VjdGlvbmJpdHNbNTAwXTsKKyNlbmRpZgorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworaW50IGludHJhX21vZGVfc3RhdHNbMTBdWzEwXVsxMF07CitzdGF0aWMgdW5zaWduZWQgaW50IHRyZWVfdXBkYXRlX2hpc3QgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW0VOVFJPUFlfTk9ERVNdIFsyXTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYWN0aXZlX3NlY3Rpb247CisjZW5kaWYKKworI2lmZGVmIE1PREVfU1RBVFMKK2ludCBjb3VudF9tYl9zZWdbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9tb2RlKAorICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCisgICAgaW50IG4sCisgICAgdnA4X3Rva2VuIHRvayAgICAgICAgICAgICAgIFsvKiBuICovXSwKKyAgICB2cDhfdHJlZSB0cmVlLAorICAgIHZwOF9wcm9iIFBuZXcgICAgICAgICAgICAgICBbLyogbi0xICovXSwKKyAgICB2cDhfcHJvYiBQY3VyICAgICAgICAgICAgICAgWy8qIG4tMSAqL10sCisgICAgdW5zaWduZWQgaW50IGJjdCAgICAgICAgICAgIFsvKiBuLTEgKi9dIFsyXSwKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2V2ZW50c1svKiBuICovXQorKQoreworICAgIHVuc2lnbmVkIGludCBuZXdfYiA9IDAsIG9sZF9iID0gMDsKKyAgICBpbnQgaSA9IDA7CisKKyAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKKyAgICAgICAgbi0tLCB0b2ssIHRyZWUsCisgICAgICAgIFBuZXcsIGJjdCwgbnVtX2V2ZW50cywKKyAgICAgICAgMjU2LCAxCisgICAgKTsKKworICAgIGRvCisgICAgeworICAgICAgICBuZXdfYiArPSB2cDhfY29zdF9icmFuY2goYmN0W2ldLCBQbmV3W2ldKTsKKyAgICAgICAgb2xkX2IgKz0gdnA4X2Nvc3RfYnJhbmNoKGJjdFtpXSwgUGN1cltpXSk7CisgICAgfQorICAgIHdoaWxlICgrK2kgPCBuKTsKKworICAgIGlmIChuZXdfYiArIChuIDw8IDgpIDwgb2xkX2IpCisgICAgeworICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgdnA4X3dyaXRlX2JpdCh3LCAxKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBwID0gUG5ld1tpXTsKKworICAgICAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwodywgUGN1cltpXSA9IHAgPyBwIDogMSwgOCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCsraSA8IG4pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHZwOF93cml0ZV9iaXQodywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9tYmludHJhX21vZGVfcHJvYnMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjb25zdCB4ID0gJiBjcGktPmNvbW1vbjsKKworICAgIHZwOF93cml0ZXIgKmNvbnN0IHcgPSBjcGktPmJjOworCisgICAgeworICAgICAgICB2cDhfcHJvYiBQbmV3ICAgW1ZQOF9ZTU9ERVMtMV07CisgICAgICAgIHVuc2lnbmVkIGludCBiY3QgW1ZQOF9ZTU9ERVMtMV0gWzJdOworCisgICAgICAgIHVwZGF0ZV9tb2RlKAorICAgICAgICAgICAgdywgVlA4X1lNT0RFUywgdnA4X3ltb2RlX2VuY29kaW5ncywgdnA4X3ltb2RlX3RyZWUsCisgICAgICAgICAgICBQbmV3LCB4LT5mYy55bW9kZV9wcm9iLCBiY3QsICh1bnNpZ25lZCBpbnQgKiljcGktPm1iLnltb2RlX2NvdW50CisgICAgICAgICk7CisgICAgfQorICAgIHsKKyAgICAgICAgdnA4X3Byb2IgUG5ldyAgIFtWUDhfVVZfTU9ERVMtMV07CisgICAgICAgIHVuc2lnbmVkIGludCBiY3QgW1ZQOF9VVl9NT0RFUy0xXSBbMl07CisKKyAgICAgICAgdXBkYXRlX21vZGUoCisgICAgICAgICAgICB3LCBWUDhfVVZfTU9ERVMsIHZwOF91dl9tb2RlX2VuY29kaW5ncywgdnA4X3V2X21vZGVfdHJlZSwKKyAgICAgICAgICAgIFBuZXcsIHgtPmZjLnV2X21vZGVfcHJvYiwgYmN0LCAodW5zaWduZWQgaW50ICopY3BpLT5tYi51dl9tb2RlX2NvdW50CisgICAgICAgICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV95bW9kZSh2cDhfd3JpdGVyICpiYywgaW50IG0sIGNvbnN0IHZwOF9wcm9iICpwKQoreworICAgIHZwOF93cml0ZV90b2tlbihiYywgdnA4X3ltb2RlX3RyZWUsIHAsIHZwOF95bW9kZV9lbmNvZGluZ3MgKyBtKTsKK30KKworc3RhdGljIHZvaWQga2Z3cml0ZV95bW9kZSh2cDhfd3JpdGVyICpiYywgaW50IG0sIGNvbnN0IHZwOF9wcm9iICpwKQoreworICAgIHZwOF93cml0ZV90b2tlbihiYywgdnA4X2tmX3ltb2RlX3RyZWUsIHAsIHZwOF9rZl95bW9kZV9lbmNvZGluZ3MgKyBtKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdXZfbW9kZSh2cDhfd3JpdGVyICpiYywgaW50IG0sIGNvbnN0IHZwOF9wcm9iICpwKQoreworICAgIHZwOF93cml0ZV90b2tlbihiYywgdnA4X3V2X21vZGVfdHJlZSwgcCwgdnA4X3V2X21vZGVfZW5jb2RpbmdzICsgbSk7Cit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfYm1vZGUodnA4X3dyaXRlciAqYmMsIGludCBtLCBjb25zdCB2cDhfcHJvYiAqcCkKK3sKKyAgICB2cDhfd3JpdGVfdG9rZW4oYmMsIHZwOF9ibW9kZV90cmVlLCBwLCB2cDhfYm1vZGVfZW5jb2RpbmdzICsgbSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NwbGl0KHZwOF93cml0ZXIgKmJjLCBpbnQgeCkKK3sKKyAgICB2cDhfd3JpdGVfdG9rZW4oCisgICAgICAgIGJjLCB2cDhfbWJzcGxpdF90cmVlLCB2cDhfbWJzcGxpdF9wcm9icywgdnA4X21ic3BsaXRfZW5jb2RpbmdzICsgeAorICAgICk7Cit9CisKK3ZvaWQgdnA4X3BhY2tfdG9rZW5zX2ModnA4X3dyaXRlciAqdywgY29uc3QgVE9LRU5FWFRSQSAqcCwgaW50IHhjb3VudCkKK3sKKyAgICBjb25zdCBUT0tFTkVYVFJBICpzdG9wID0gcCArIHhjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgc3BsaXQ7CisgICAgdW5zaWduZWQgaW50IHNoaWZ0OworICAgIGludCBjb3VudCA9IHctPmNvdW50OworICAgIHVuc2lnbmVkIGludCByYW5nZSA9IHctPnJhbmdlOworICAgIHVuc2lnbmVkIGludCBsb3d2YWx1ZSA9IHctPmxvd3ZhbHVlOworCisgICAgd2hpbGUgKHAgPCBzdG9wKQorICAgIHsKKyAgICAgICAgY29uc3QgaW50IHQgPSBwLT5Ub2tlbjsKKyAgICAgICAgdnA4X3Rva2VuICphID0gdnA4X2NvZWZfZW5jb2RpbmdzICsgdDsKKyAgICAgICAgY29uc3QgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKmIgPSB2cDhfZXh0cmFfYml0cyArIHQ7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHAgPSBwLT5jb250ZXh0X3RyZWU7CisgICAgICAgIGludCB2ID0gYS0+dmFsdWU7CisgICAgICAgIGludCBuID0gYS0+TGVuOworCisgICAgICAgIGlmIChwLT5za2lwX2VvYl9ub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBuLS07CisgICAgICAgICAgICBpID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBiYiA9ICh2ID4+IC0tbikgJiAxOworICAgICAgICAgICAgc3BsaXQgPSAxICsgKCgocmFuZ2UgLSAxKSAqIHBwW2k+PjFdKSA+PiA4KTsKKyAgICAgICAgICAgIGkgPSB2cDhfY29lZl90cmVlW2krYmJdOworCisgICAgICAgICAgICBpZiAoYmIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7CisgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZSAtIHNwbGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmdlID0gc3BsaXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoaWZ0ID0gdnA4X25vcm1bcmFuZ2VdOworICAgICAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OworICAgICAgICAgICAgY291bnQgKz0gc2hpZnQ7CisKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaGlmdCAtIGNvdW50OworCisgICAgICAgICAgICAgICAgaWYgKChsb3d2YWx1ZSA8PCAob2Zmc2V0IC0gMSkpICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIHctPmJ1ZmZlclt4XSA9PSAweGZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOworICAgICAgICAgICAgICAgICAgICAgICAgeC0tOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFsaWRhdGVfYnVmZmVyKHctPmJ1ZmZlciArIHctPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+ZXJyb3IpOworCisgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKKyAgICAgICAgICAgICAgICBsb3d2YWx1ZSA8PD0gb2Zmc2V0OworICAgICAgICAgICAgICAgIHNoaWZ0ID0gY291bnQ7CisgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7CisgICAgICAgICAgICAgICAgY291bnQgLT0gOCA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobik7CisKKworICAgICAgICBpZiAoYi0+YmFzZV92YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBlID0gcC0+RXh0cmEsIEwgPSBiLT5MZW47CisKKyAgICAgICAgICAgIGlmIChMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBwID0gYi0+cHJvYjsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGUgPj4gMTsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IEw7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiB2LCBhc3N1bWVkIG5vbnplcm8gKi8KKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJiID0gKHYgPj4gLS1uKSAmIDE7CisgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gMSArICgoKHJhbmdlIC0gMSkgKiBwcFtpPj4xXSkgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBiLT50cmVlW2krYmJdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChiYikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHJhbmdlIC0gc3BsaXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHNwbGl0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSB2cDhfbm9ybVtyYW5nZV07CisgICAgICAgICAgICAgICAgICAgIHJhbmdlIDw8PSBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc2hpZnQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaGlmdCAtIGNvdW50OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxvd3ZhbHVlIDw8IChvZmZzZXQgLSAxKSkgJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh4ID49IDAgJiYgdy0+YnVmZmVyW3hdID09IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2J1ZmZlcih3LT5idWZmZXIgKyB3LT5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmVycm9yKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSA4IDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKG4pOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHNwbGl0ID0gKHJhbmdlICsgMSkgPj4gMTsKKworICAgICAgICAgICAgICAgIGlmIChlICYgMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlICs9IHNwbGl0OworICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHJhbmdlIC0gc3BsaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3BsaXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmFuZ2UgPDw9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoKGxvd3ZhbHVlICYgMHg4MDAwMDAwMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHctPnBvcyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHggPj0gMCAmJiB3LT5idWZmZXJbeF0gPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdID0gKHVuc2lnbmVkIGNoYXIpMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHctPmJ1ZmZlclt4XSArPSAxOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG93dmFsdWUgIDw8PSAxOworCisgICAgICAgICAgICAgICAgaWYgKCErK2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAtODsKKworICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9idWZmZXIody0+YnVmZmVyICsgdy0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmJ1ZmZlcl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5lcnJvcik7CisKKyAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAyNCk7CisgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlICY9IDB4ZmZmZmZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgKytwOworICAgIH0KKworICAgIHctPmNvdW50ID0gY291bnQ7CisgICAgdy0+bG93dmFsdWUgPSBsb3d2YWx1ZTsKKyAgICB3LT5yYW5nZSA9IHJhbmdlOworCit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3BhcnRpdGlvbl9zaXplKHVuc2lnbmVkIGNoYXIgKmN4X2RhdGEsIGludCBzaXplKQoreworICAgIHNpZ25lZCBjaGFyIGNzaXplOworCisgICAgY3NpemUgPSBzaXplICYgMHhmZjsKKyAgICAqY3hfZGF0YSA9IGNzaXplOworICAgIGNzaXplID0gKHNpemUgPj4gOCkgJiAweGZmOworICAgICooY3hfZGF0YSArIDEpID0gY3NpemU7CisgICAgY3NpemUgPSAoc2l6ZSA+PiAxNikgJiAweGZmOworICAgICooY3hfZGF0YSArIDIpID0gY3NpemU7CisKK30KKworc3RhdGljIHZvaWQgcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2MoVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgY2hhciAqY3hfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBjeF9kYXRhX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFydCkKK3sKKworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKnB0ciA9IGN4X2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqcHRyX2VuZCA9IGN4X2RhdGFfZW5kOworICAgIHZwOF93cml0ZXIgKiB3OworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJ0OyBpKyspCisgICAgeworICAgICAgICBpbnQgbWJfcm93OworCisgICAgICAgIHcgPSBjcGktPmJjICsgaSArIDE7CisKKyAgICAgICAgdnA4X3N0YXJ0X2VuY29kZSh3LCBwdHIsIHB0cl9lbmQpOworCisgICAgICAgIGZvciAobWJfcm93ID0gaTsgbWJfcm93IDwgY3BpLT5jb21tb24ubWJfcm93czsgbWJfcm93ICs9IG51bV9wYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBUT0tFTkVYVFJBICpwICAgID0gY3BpLT50cGxpc3RbbWJfcm93XS5zdGFydDsKKyAgICAgICAgICAgIGNvbnN0IFRPS0VORVhUUkEgKnN0b3AgPSBjcGktPnRwbGlzdFttYl9yb3ddLnN0b3A7CisgICAgICAgICAgICBpbnQgdG9rZW5zID0gKGludCkoc3RvcCAtIHApOworCisgICAgICAgICAgICB2cDhfcGFja190b2tlbnNfYyh3LCBwLCB0b2tlbnMpOworICAgICAgICB9CisKKyAgICAgICAgdnA4X3N0b3BfZW5jb2RlKHcpOworICAgICAgICBwdHIgKz0gdy0+cG9zOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBwYWNrX21iX3Jvd190b2tlbnNfYyhWUDhfQ09NUCAqY3BpLCB2cDhfd3JpdGVyICp3KQoreworICAgIGludCBtYl9yb3c7CisKKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNwaS0+Y29tbW9uLm1iX3Jvd3M7IG1iX3JvdysrKQorICAgIHsKKyAgICAgICAgY29uc3QgVE9LRU5FWFRSQSAqcCAgICA9IGNwaS0+dHBsaXN0W21iX3Jvd10uc3RhcnQ7CisgICAgICAgIGNvbnN0IFRPS0VORVhUUkEgKnN0b3AgPSBjcGktPnRwbGlzdFttYl9yb3ddLnN0b3A7CisgICAgICAgIGludCB0b2tlbnMgPSAoaW50KShzdG9wIC0gcCk7CisKKyAgICAgICAgdnA4X3BhY2tfdG9rZW5zX2ModywgcCwgdG9rZW5zKTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQgd3JpdGVfbXZfcmVmCisoCisgICAgdnA4X3dyaXRlciAqdywgTUJfUFJFRElDVElPTl9NT0RFIG0sIGNvbnN0IHZwOF9wcm9iICpwCispCit7CisjaWYgQ09ORklHX0RFQlVHCisgICAgYXNzZXJ0KE5FQVJFU1RNViA8PSBtICAmJiAgbSA8PSBTUExJVE1WKTsKKyNlbmRpZgorICAgIHZwOF93cml0ZV90b2tlbih3LCB2cDhfbXZfcmVmX3RyZWUsIHAsCisgICAgICAgICAgICAgICAgICAgIHZwOF9tdl9yZWZfZW5jb2RpbmdfYXJyYXkgLSBORUFSRVNUTVYgKyBtKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfc3ViX212X3JlZgorKAorICAgIHZwOF93cml0ZXIgKncsIEJfUFJFRElDVElPTl9NT0RFIG0sIGNvbnN0IHZwOF9wcm9iICpwCispCit7CisjaWYgQ09ORklHX0RFQlVHCisgICAgYXNzZXJ0KExFRlQ0WDQgPD0gbSAgJiYgIG0gPD0gTkVXNFg0KTsKKyNlbmRpZgorICAgIHZwOF93cml0ZV90b2tlbih3LCB2cDhfc3ViX212X3JlZl90cmVlLCBwLAorICAgICAgICAgICAgICAgICAgICB2cDhfc3ViX212X3JlZl9lbmNvZGluZ19hcnJheSAtIExFRlQ0WDQgKyBtKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfbXYKKygKKyAgICB2cDhfd3JpdGVyICp3LCBjb25zdCBNViAqbXYsIGNvbnN0IGludF9tdiAqcmVmLCBjb25zdCBNVl9DT05URVhUICptdmMKKykKK3sKKyAgICBNViBlOworICAgIGUucm93ID0gbXYtPnJvdyAtIHJlZi0+YXNfbXYucm93OworICAgIGUuY29sID0gbXYtPmNvbCAtIHJlZi0+YXNfbXYuY29sOworCisgICAgdnA4X2VuY29kZV9tb3Rpb25fdmVjdG9yKHcsICZlLCBtdmMpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9tYl9mZWF0dXJlcyh2cDhfd3JpdGVyICp3LCBjb25zdCBNQl9NT0RFX0lORk8gKm1pLCBjb25zdCBNQUNST0JMT0NLRCAqeCkKK3sKKyAgICAvKiBFbmNvZGUgdGhlIE1CIHNlZ21lbnQgaWQuICovCisgICAgaWYgKHgtPnNlZ21lbnRhdGlvbl9lbmFibGVkICYmIHgtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtaS0+c2VnbWVudF9pZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB2cDhfd3JpdGUodywgMCwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdKTsKKyAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMF0pOworICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDEsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDEsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1swXSk7CisgICAgICAgICAgICB2cDhfd3JpdGUodywgMCwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzJdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB2cDhfd3JpdGUodywgMSwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdKTsKKyAgICAgICAgICAgIHZwOF93cml0ZSh3LCAxLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMl0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFRSQVAuLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2cDhfd3JpdGUodywgMCwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdKTsKKyAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9Cit2b2lkIHZwOF9jb252ZXJ0X3JmY3RfdG9fcHJvYihWUDhfQ09NUCAqY29uc3QgY3BpKQoreworICAgIGNvbnN0IGludCAqY29uc3QgcmZjdCA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlOworICAgIGNvbnN0IGludCByZl9pbnRyYSA9IHJmY3RbSU5UUkFfRlJBTUVdOworICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHByb2JhYmlsaXRpZXMgdXNlZCB0byBjb2RlIHRoZSByZWYgZnJhbWUgYmFzZWQgb24gdXNhZ2UgKi8KKyAgICBpZiAoIShjcGktPnByb2JfaW50cmFfY29kZWQgPSByZl9pbnRyYSAqIDI1NSAvIChyZl9pbnRyYSArIHJmX2ludGVyKSkpCisgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDE7CisKKyAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IHJmX2ludGVyID8gKHJmY3RbTEFTVF9GUkFNRV0gKiAyNTUpIC8gcmZfaW50ZXIgOiAxMjg7CisKKyAgICBpZiAoIWNwaS0+cHJvYl9sYXN0X2NvZGVkKQorICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IDE7CisKKyAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAocmZjdFtHT0xERU5fRlJBTUVdICsgcmZjdFtBTFRSRUZfRlJBTUVdKQorICAgICAgICAgICAgICAgICAgPyAocmZjdFtHT0xERU5fRlJBTUVdICogMjU1KSAvIChyZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV0pIDogMTI4OworCisgICAgaWYgKCFjcGktPnByb2JfZ2ZfY29kZWQpCisgICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCA9IDE7CisKK30KKworc3RhdGljIHZvaWQgcGFja19pbnRlcl9tb2RlX212cyhWUDhfQ09NUCAqY29uc3QgY3BpKQoreworICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBjcGktPmNvbW1vbjsKKyAgICB2cDhfd3JpdGVyICpjb25zdCB3ID0gY3BpLT5iYzsKKyAgICBjb25zdCBNVl9DT05URVhUICptdmMgPSBwYy0+ZmMubXZjOworCisKKyAgICBNT0RFX0lORk8gKm0gPSBwYy0+bWk7CisgICAgY29uc3QgaW50IG1pcyA9IHBjLT5tb2RlX2luZm9fc3RyaWRlOworICAgIGludCBtYl9yb3cgPSAtMTsKKworICAgIGludCBwcm9iX3NraXBfZmFsc2UgPSAwOworCisgICAgY3BpLT5tYi5wYXJ0aXRpb25faW5mbyA9IGNwaS0+bWIucGk7CisKKyAgICB2cDhfY29udmVydF9yZmN0X3RvX3Byb2IoY3BpKTsKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKyAgICBhY3RpdmVfc2VjdGlvbiA9IDE7CisjZW5kaWYKKworICAgIGlmIChwYy0+bWJfbm9fY29lZmZfc2tpcCkKKyAgICB7CisgICAgICAgIGludCB0b3RhbF9tYnMgPSBwYy0+bWJfcm93cyAqIHBjLT5tYl9jb2xzOworCisgICAgICAgIHByb2Jfc2tpcF9mYWxzZSA9ICh0b3RhbF9tYnMgLSBjcGktPm1iLnNraXBfdHJ1ZV9jb3VudCApICogMjU2IC8gdG90YWxfbWJzOworCisgICAgICAgIGlmIChwcm9iX3NraXBfZmFsc2UgPD0gMSkKKyAgICAgICAgICAgIHByb2Jfc2tpcF9mYWxzZSA9IDE7CisKKyAgICAgICAgaWYgKHByb2Jfc2tpcF9mYWxzZSA+IDI1NSkKKyAgICAgICAgICAgIHByb2Jfc2tpcF9mYWxzZSA9IDI1NTsKKworICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IHByb2Jfc2tpcF9mYWxzZTsKKyAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwodywgcHJvYl9za2lwX2ZhbHNlLCA4KTsKKyAgICB9CisKKyAgICB2cDhfd3JpdGVfbGl0ZXJhbCh3LCBjcGktPnByb2JfaW50cmFfY29kZWQsIDgpOworICAgIHZwOF93cml0ZV9saXRlcmFsKHcsIGNwaS0+cHJvYl9sYXN0X2NvZGVkLCA4KTsKKyAgICB2cDhfd3JpdGVfbGl0ZXJhbCh3LCBjcGktPnByb2JfZ2ZfY29kZWQsIDgpOworCisgICAgdXBkYXRlX21iaW50cmFfbW9kZV9wcm9icyhjcGkpOworCisgICAgdnA4X3dyaXRlX212cHJvYnMoY3BpKTsKKworICAgIHdoaWxlICgrK21iX3JvdyA8IHBjLT5tYl9yb3dzKQorICAgIHsKKyAgICAgICAgaW50IG1iX2NvbCA9IC0xOworCisgICAgICAgIHdoaWxlICgrK21iX2NvbCA8IHBjLT5tYl9jb2xzKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBNQl9NT0RFX0lORk8gKmNvbnN0IG1pID0gJiBtLT5tYm1pOworICAgICAgICAgICAgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJmID0gbWktPnJlZl9mcmFtZTsKKyAgICAgICAgICAgIGNvbnN0IE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlID0gbWktPm1vZGU7CisKKyAgICAgICAgICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZjcGktPm1iLmVfbWJkOworCisgICAgICAgICAgICAvKiBEaXN0YW5jZSBvZiBNYiB0byB0aGUgdmFyaW91cyBpbWFnZSBlZGdlcy4KKyAgICAgICAgICAgICAqIFRoZXNlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZCB0byBNVgorICAgICAgICAgICAgICogdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICB4ZC0+bWJfdG9fbGVmdF9lZGdlID0gLSgobWJfY29sICogMTYpIDw8IDMpOworICAgICAgICAgICAgeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPSAoKHBjLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKKyAgICAgICAgICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSkgPDwgMzsKKyAgICAgICAgICAgIHhkLT5tYl90b19ib3R0b21fZWRnZSA9ICgocGMtPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOworCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICAgICAgYWN0aXZlX3NlY3Rpb24gPSA5OworI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKQorICAgICAgICAgICAgICAgIHdyaXRlX21iX2ZlYXR1cmVzKHcsIG1pLCAmY3BpLT5tYi5lX21iZCk7CisKKyAgICAgICAgICAgIGlmIChwYy0+bWJfbm9fY29lZmZfc2tpcCkKKyAgICAgICAgICAgICAgICB2cDhfZW5jb2RlX2Jvb2wodywgbS0+bWJtaS5tYl9za2lwX2NvZWZmLCBwcm9iX3NraXBfZmFsc2UpOworCisgICAgICAgICAgICBpZiAocmYgPT0gSU5UUkFfRlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDAsIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCk7CisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICAgICAgICAgIGFjdGl2ZV9zZWN0aW9uID0gNjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdyaXRlX3ltb2RlKHcsIG1vZGUsIHBjLT5mYy55bW9kZV9wcm9iKTsKKworICAgICAgICAgICAgICAgIGlmIChtb2RlID09IEJfUFJFRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gMDsKKworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYm1vZGUodywgbS0+Ym1pW2pdLmFzX21vZGUsIHBjLT5mYy5ibW9kZV9wcm9iKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsraiA8IDE2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3cml0ZV91dl9tb2RlKHcsIG1pLT51dl9tb2RlLCBwYy0+ZmMudXZfbW9kZV9wcm9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgLyogaW50ZXIgY29kZWQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRfbXYgYmVzdF9tdjsKKyAgICAgICAgICAgICAgICB2cDhfcHJvYiBtdl9yZWZfcCBbVlA4X01WUkVGUy0xXTsKKworICAgICAgICAgICAgICAgIHZwOF93cml0ZSh3LCAxLCBjcGktPnByb2JfaW50cmFfY29kZWQpOworCisgICAgICAgICAgICAgICAgaWYgKHJmID09IExBU1RfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCBjcGktPnByb2JfbGFzdF9jb2RlZCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDEsIGNwaS0+cHJvYl9sYXN0X2NvZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlKHcsIChyZiA9PSBHT0xERU5fRlJBTUUpID8gMCA6IDEsIGNwaS0+cHJvYl9nZl9jb2RlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnRfbXYgbjEsIG4yOworICAgICAgICAgICAgICAgICAgICBpbnQgY3RbNF07CisKKyAgICAgICAgICAgICAgICAgICAgdnA4X2ZpbmRfbmVhcl9tdnMoeGQsIG0sICZuMSwgJm4yLCAmYmVzdF9tdiwgY3QsIHJmLCBjcGktPmNvbW1vbi5yZWZfZnJhbWVfc2lnbl9iaWFzKTsKKyAgICAgICAgICAgICAgICAgICAgdnA4X2NsYW1wX212MigmYmVzdF9tdiwgeGQpOworCisgICAgICAgICAgICAgICAgICAgIHZwOF9tdl9yZWZfcHJvYnMobXZfcmVmX3AsIGN0KTsKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKyAgICAgICAgICAgICAgICAgICAgYWNjdW1fbXZfcmVmcyhtb2RlLCBjdCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKyAgICAgICAgICAgICAgICBhY3RpdmVfc2VjdGlvbiA9IDM7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIHdyaXRlX212X3JlZih3LCBtb2RlLCBtdl9yZWZfcCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpICAgLyogbmV3LCBzcGxpdCByZXF1aXJlIE1WcyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5FV01WOgorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICAgICAgICAgICAgICBhY3RpdmVfc2VjdGlvbiA9IDU7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICB3cml0ZV9tdih3LCAmbWktPm12LmFzX212LCAmYmVzdF9tdiwgbXZjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNQTElUTVY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IDA7CisKKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgICAgICAgICAgICAgICAgICsrY291bnRfbWJfc2VnIFttaS0+cGFydGl0aW9uaW5nXTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NwbGl0KHcsIG1pLT5wYXJ0aXRpb25pbmcpOworCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJfUFJFRElDVElPTl9NT0RFIGJsb2NrbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludF9tdiBibG9ja212OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpjb25zdCAgTCA9IHZwOF9tYnNwbGl0cyBbbWktPnBhcnRpdGlvbmluZ107CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgayA9IC0xOyAgLyogZmlyc3QgYmxvY2sgaW4gc3Vic2V0IGogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdl9jb250ejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludF9tdiBsZWZ0bXYsIGFib3ZlbXY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbW9kZSA9ICBjcGktPm1iLnBhcnRpdGlvbl9pbmZvLT5ibWlbal0ubW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbXYgPSAgY3BpLT5tYi5wYXJ0aXRpb25faW5mby0+Ym1pW2pdLm12OworI2lmIENPTkZJR19ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogIT0gTFsrK2tdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID49IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogIT0gTFsrK2tdKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdG12LmFzX2ludCA9IGxlZnRfYmxvY2tfbXYobSwgayk7CisgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZW12LmFzX2ludCA9IGFib3ZlX2Jsb2NrX212KG0sIGssIG1pcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdl9jb250eiA9IHZwOF9tdl9jb250KCZsZWZ0bXYsICZhYm92ZW12KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3ViX212X3JlZih3LCBibG9ja21vZGUsIHZwOF9zdWJfbXZfcmVmX3Byb2IyIFttdl9jb250el0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2ttb2RlID09IE5FVzRYNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBFTlRST1BZX1NUQVRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX3NlY3Rpb24gPSAxMTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX212KHcsICZibG9ja212LmFzX212LCAmYmVzdF9tdiwgKGNvbnN0IE1WX0NPTlRFWFQgKikgbXZjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytqIDwgY3BpLT5tYi5wYXJ0aXRpb25faW5mby0+Y291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbTsKKyAgICAgICAgICAgIGNwaS0+bWIucGFydGl0aW9uX2luZm8rKzsKKyAgICAgICAgfQorCisgICAgICAgICsrbTsgIC8qIHNraXAgTCBwcmVkaWN0aW9uIGJvcmRlciAqLworICAgICAgICBjcGktPm1iLnBhcnRpdGlvbl9pbmZvKys7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHdyaXRlX2tmbW9kZXMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICB2cDhfd3JpdGVyICpjb25zdCBiYyA9IGNwaS0+YmM7CisgICAgY29uc3QgVlA4X0NPTU1PTiAqY29uc3QgYyA9ICYgY3BpLT5jb21tb247CisgICAgLyogY29uc3QgKi8KKyAgICBNT0RFX0lORk8gKm0gPSBjLT5taTsKKworICAgIGludCBtYl9yb3cgPSAtMTsKKyAgICBpbnQgcHJvYl9za2lwX2ZhbHNlID0gMDsKKworICAgIGlmIChjLT5tYl9ub19jb2VmZl9za2lwKQorICAgIHsKKyAgICAgICAgaW50IHRvdGFsX21icyA9IGMtPm1iX3Jvd3MgKiBjLT5tYl9jb2xzOworCisgICAgICAgIHByb2Jfc2tpcF9mYWxzZSA9ICh0b3RhbF9tYnMgLSBjcGktPm1iLnNraXBfdHJ1ZV9jb3VudCApICogMjU2IC8gdG90YWxfbWJzOworCisgICAgICAgIGlmIChwcm9iX3NraXBfZmFsc2UgPD0gMSkKKyAgICAgICAgICAgIHByb2Jfc2tpcF9mYWxzZSA9IDE7CisKKyAgICAgICAgaWYgKHByb2Jfc2tpcF9mYWxzZSA+PSAyNTUpCisgICAgICAgICAgICBwcm9iX3NraXBfZmFsc2UgPSAyNTU7CisKKyAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBwcm9iX3NraXBfZmFsc2U7CisgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBwcm9iX3NraXBfZmFsc2UsIDgpOworICAgIH0KKworICAgIHdoaWxlICgrK21iX3JvdyA8IGMtPm1iX3Jvd3MpCisgICAgeworICAgICAgICBpbnQgbWJfY29sID0gLTE7CisKKyAgICAgICAgd2hpbGUgKCsrbWJfY29sIDwgYy0+bWJfY29scykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHltID0gbS0+bWJtaS5tb2RlOworCisgICAgICAgICAgICBpZiAoY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKKyAgICAgICAgICAgICAgICB3cml0ZV9tYl9mZWF0dXJlcyhiYywgJm0tPm1ibWksICZjcGktPm1iLmVfbWJkKTsKKworICAgICAgICAgICAgaWYgKGMtPm1iX25vX2NvZWZmX3NraXApCisgICAgICAgICAgICAgICAgdnA4X2VuY29kZV9ib29sKGJjLCBtLT5tYm1pLm1iX3NraXBfY29lZmYsIHByb2Jfc2tpcF9mYWxzZSk7CisKKyAgICAgICAgICAgIGtmd3JpdGVfeW1vZGUoYmMsIHltLCB2cDhfa2ZfeW1vZGVfcHJvYik7CisKKyAgICAgICAgICAgIGlmICh5bSA9PSBCX1BSRUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG1pcyA9IGMtPm1vZGVfaW5mb19zdHJpZGU7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEEgPSBhYm92ZV9ibG9ja19tb2RlKG0sIGksIG1pcyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEwgPSBsZWZ0X2Jsb2NrX21vZGUobSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBibSA9IG0tPmJtaVtpXS5hc19tb2RlOworCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICAgICAgICAgICAgICArK2ludHJhX21vZGVfc3RhdHMgW0FdIFtMXSBbYm1dOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfYm1vZGUoYmMsIGJtLCB2cDhfa2ZfYm1vZGVfcHJvYiBbQV0gW0xdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKCsraSA8IDE2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVfdXZfbW9kZShiYywgKG0rKyktPm1ibWkudXZfbW9kZSwgdnA4X2tmX3V2X21vZGVfcHJvYik7CisgICAgICAgIH0KKworICAgICAgICBtKys7ICAgIC8qIHNraXAgTCBwcmVkaWN0aW9uIGJvcmRlciAqLworICAgIH0KK30KKworI2lmIDAKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgZGVidWdnaW5nIHByb2JhYmlsaXR5IHRyZWVzLiAqLworc3RhdGljIHZvaWQgcHJpbnRfcHJvYl90cmVlKHZwOF9wcm9iCisgICAgIGNvZWZfcHJvYnNbQkxPQ0tfVFlQRVNdW0NPRUZfQkFORFNdW1BSRVZfQ09FRl9DT05URVhUU11bRU5UUk9QWV9OT0RFU10pCit7CisgICAgLyogcHJpbnQgY29lZiBwcm9iYWJpbGl0eSB0cmVlICovCisgICAgaW50IGksaixrLGw7CisgICAgRklMRSogZiA9IGZvcGVuKCJlbmNfdHJlZV9wcm9icy50eHQiLCAiYSIpOworICAgIGZwcmludGYoZiwgIntcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgICAgZnByaW50ZihmLCAiICB7XG4iKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IENPRUZfQkFORFM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIHtcbiIpOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IFBSRVZfQ09FRl9DT05URVhUUzsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICAgIHsiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgRU5UUk9QWV9OT0RFUzsgbCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTN1LCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGNvZWZfcHJvYnMgW2ldW2pdW2tdW2xdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiB9XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICB9XG4iKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGYsICIgIH1cbiIpOworICAgIH0KKyAgICBmcHJpbnRmKGYsICJ9XG4iKTsKKyAgICBmY2xvc2UoZik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc3VtX3Byb2JzX292ZXJfcHJldl9jb2VmX2NvbnRleHQoCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBwcm9ic1tQUkVWX0NPRUZfQ09OVEVYVFNdW01BWF9FTlRST1BZX1RPS0VOU10sCisgICAgICAgIHVuc2lnbmVkIGludCogb3V0KQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaT0wOyBpIDwgTUFYX0VOVFJPUFlfVE9LRU5TOyArK2kpCisgICAgeworICAgICAgICBmb3IgKGo9MDsgaiA8IFBSRVZfQ09FRl9DT05URVhUUzsgKytqKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdG1wID0gb3V0W2ldOworICAgICAgICAgICAgb3V0W2ldICs9IHByb2JzW2pdW2ldOworICAgICAgICAgICAgLyogY2hlY2sgZm9yIHdyYXAgKi8KKyAgICAgICAgICAgIGlmIChvdXRbaV0gPCB0bXApCisgICAgICAgICAgICAgICAgb3V0W2ldID0gVUlOVF9NQVg7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHJvYl91cGRhdGVfc2F2aW5ncyhjb25zdCB1bnNpZ25lZCBpbnQgKmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBvbGRwLCBjb25zdCB2cDhfcHJvYiBuZXdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiB1cGQpCit7CisgICAgY29uc3QgaW50IG9sZF9iID0gdnA4X2Nvc3RfYnJhbmNoKGN0LCBvbGRwKTsKKyAgICBjb25zdCBpbnQgbmV3X2IgPSB2cDhfY29zdF9icmFuY2goY3QsIG5ld3ApOworICAgIGNvbnN0IGludCB1cGRhdGVfYiA9IDggKworICAgICAgICAgICAgICAgICAgICAgICAgICgodnA4X2Nvc3Rfb25lKHVwZCkgLSB2cDhfY29zdF96ZXJvKHVwZCkpID4+IDgpOworCisgICAgcmV0dXJuIG9sZF9iIC0gbmV3X2IgLSB1cGRhdGVfYjsKK30KKworc3RhdGljIGludCBpbmRlcGVuZGVudF9jb2VmX2NvbnRleHRfc2F2aW5ncyhWUDhfQ09NUCAqY3BpKQoreworICAgIE1BQ1JPQkxPQ0sgKmNvbnN0IHggPSAmIGNwaS0+bWI7CisgICAgaW50IHNhdmluZ3MgPSAwOworICAgIGludCBpID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpbnQgayA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHJldl9jb2VmX2NvdW50X3N1bVtNQVhfRU5UUk9QWV9UT0tFTlNdID0gezB9OworICAgICAgICAgICAgaW50IHByZXZfY29lZl9zYXZpbmdzW01BWF9FTlRST1BZX1RPS0VOU10gPSB7MH07CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKCpwcm9icylbTUFYX0VOVFJPUFlfVE9LRU5TXTsKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBuZXcgcHJvYmFiaWxpdGllcyBnaXZlbiB0aGUgY29uc3RyYWludCB0aGF0CisgICAgICAgICAgICAgKiB0aGV5IG11c3QgYmUgZXF1YWwgb3ZlciB0aGUgcHJldiBjb2VmIGNvbnRleHRzCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgcHJvYnMgPSAoY29uc3QgdW5zaWduZWQgaW50ICgqKVtNQVhfRU5UUk9QWV9UT0tFTlNdKQorICAgICAgICAgICAgICAgIHgtPmNvZWZfY291bnRzW2ldW2pdOworCisgICAgICAgICAgICAvKiBSZXNldCB0byBkZWZhdWx0IHByb2JhYmlsaXRpZXMgYXQga2V5IGZyYW1lcyAqLworICAgICAgICAgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgICAgIHByb2JzID0gZGVmYXVsdF9jb2VmX2NvdW50c1tpXVtqXTsKKworICAgICAgICAgICAgc3VtX3Byb2JzX292ZXJfcHJldl9jb2VmX2NvbnRleHQocHJvYnMsIHByZXZfY29lZl9jb3VudF9zdW0pOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGF0IGV2ZXJ5IGNvbnRleHQgKi8KKworICAgICAgICAgICAgICAgIC8qIGNhbGMgcHJvYnMgYW5kIGJyYW5jaCBjdHMgZm9yIHRoaXMgZnJhbWUgb25seSAqLworICAgICAgICAgICAgICAgIGludCB0ID0gMDsgICAgICAvKiB0b2tlbi9wcm9iIGluZGV4ICovCisKKyAgICAgICAgICAgICAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgICAgICAgICAgTUFYX0VOVFJPUFlfVE9LRU5TLCB2cDhfY29lZl9lbmNvZGluZ3MsIHZwOF9jb2VmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVfY29lZl9wcm9ic1tpXVtqXVtrXSwKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZV9icmFuY2hfY3QgW2ldW2pdW2tdLAorICAgICAgICAgICAgICAgICAgICBwcmV2X2NvZWZfY291bnRfc3VtLAorICAgICAgICAgICAgICAgICAgICAyNTYsIDEpOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqY3QgID0gY3BpLT5mcmFtZV9icmFuY2hfY3QgW2ldW2pdW2tdW3RdOworICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBuZXdwID0gY3BpLT5mcmFtZV9jb2VmX3Byb2JzIFtpXVtqXVtrXVt0XTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3Byb2Igb2xkcCA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgW2ldW2pdW2tdW3RdOworICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiB1cGQgPSB2cDhfY29lZl91cGRhdGVfcHJvYnMgW2ldW2pdW2tdW3RdOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcyA9IHByb2JfdXBkYXRlX3NhdmluZ3MoY3QsIG9sZHAsIG5ld3AsIHVwZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgJiYgbmV3cCAhPSBvbGRwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfY29lZl9zYXZpbmdzW3RdICs9IHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgrK3QgPCBFTlRST1BZX05PREVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2sgPCBQUkVWX0NPRUZfQ09OVEVYVFMpOworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFdlIG9ubHkgdXBkYXRlIHByb2JhYmlsaXRpZXMgaWYgd2UgY2FuIHNhdmUgYml0cywgZXhjZXB0CisgICAgICAgICAgICAgICAgICogZm9yIGtleSBmcmFtZXMgd2hlcmUgd2UgaGF2ZSB0byB1cGRhdGUgYWxsIHByb2JhYmlsaXRpZXMKKyAgICAgICAgICAgICAgICAgKiB0byBnZXQgdGhlIGVxdWFsIHByb2JhYmlsaXRpZXMgYWNyb3NzIHRoZSBwcmV2IGNvZWYKKyAgICAgICAgICAgICAgICAgKiBjb250ZXh0cy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocHJldl9jb2VmX3NhdmluZ3Nba10gPiAwIHx8CisgICAgICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICBzYXZpbmdzICs9IHByZXZfY29lZl9zYXZpbmdzW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCsrayA8IEVOVFJPUFlfTk9ERVMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2ogPCBDT0VGX0JBTkRTKTsKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IEJMT0NLX1RZUEVTKTsKKyAgICByZXR1cm4gc2F2aW5nczsKK30KKworc3RhdGljIGludCBkZWZhdWx0X2NvZWZfY29udGV4dF9zYXZpbmdzKFZQOF9DT01QICpjcGkpCit7CisgICAgTUFDUk9CTE9DSyAqY29uc3QgeCA9ICYgY3BpLT5tYjsKKyAgICBpbnQgc2F2aW5ncyA9IDA7CisgICAgaW50IGkgPSAwOworICAgIGRvCisgICAgeworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXQgZXZlcnkgY29udGV4dCAqLworCisgICAgICAgICAgICAgICAgLyogY2FsYyBwcm9icyBhbmQgYnJhbmNoIGN0cyBmb3IgdGhpcyBmcmFtZSBvbmx5ICovCisgICAgICAgICAgICAgICAgaW50IHQgPSAwOyAgICAgIC8qIHRva2VuL3Byb2IgaW5kZXggKi8KKworICAgICAgICAgICAgICAgIHZwOF90cmVlX3Byb2JzX2Zyb21fZGlzdHJpYnV0aW9uKAorICAgICAgICAgICAgICAgICAgICBNQVhfRU5UUk9QWV9UT0tFTlMsIHZwOF9jb2VmX2VuY29kaW5ncywgdnA4X2NvZWZfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZV9jb2VmX3Byb2JzIFtpXVtqXVtrXSwKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZV9icmFuY2hfY3QgW2ldW2pdW2tdLAorICAgICAgICAgICAgICAgICAgICB4LT5jb2VmX2NvdW50cyBbaV1bal1ba10sCisgICAgICAgICAgICAgICAgICAgIDI1NiwgMQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpjdCAgPSBjcGktPmZyYW1lX2JyYW5jaF9jdCBbaV1bal1ba11bdF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIG5ld3AgPSBjcGktPmZyYW1lX2NvZWZfcHJvYnMgW2ldW2pdW2tdW3RdOworICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBvbGRwID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbaV1bal1ba11bdF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIHVwZCA9IHZwOF9jb2VmX3VwZGF0ZV9wcm9icyBbaV1bal1ba11bdF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzID0gcHJvYl91cGRhdGVfc2F2aW5ncyhjdCwgb2xkcCwgbmV3cCwgdXBkKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocyA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmluZ3MgKz0gczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKyt0IDwgRU5UUk9QWV9OT0RFUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKytrIDwgUFJFVl9DT0VGX0NPTlRFWFRTKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKytqIDwgQ09FRl9CQU5EUyk7CisgICAgfQorICAgIHdoaWxlICgrK2kgPCBCTE9DS19UWVBFUyk7CisgICAgcmV0dXJuIHNhdmluZ3M7Cit9CisKK3ZvaWQgdnA4X2NhbGNfcmVmX2ZyYW1lX2Nvc3RzKGludCAqcmVmX2ZyYW1lX2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvYl9pbnRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9iX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvYl9nYXJmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICByZWZfZnJhbWVfY29zdFtJTlRSQV9GUkFNRV0gICA9IHZwOF9jb3N0X3plcm8ocHJvYl9pbnRyYSk7CisgICAgcmVmX2ZyYW1lX2Nvc3RbTEFTVF9GUkFNRV0gICAgPSB2cDhfY29zdF9vbmUocHJvYl9pbnRyYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3RfemVybyhwcm9iX2xhc3QpOworICAgIHJlZl9mcmFtZV9jb3N0W0dPTERFTl9GUkFNRV0gID0gdnA4X2Nvc3Rfb25lKHByb2JfaW50cmEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZShwcm9iX2xhc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X3plcm8ocHJvYl9nYXJmKTsKKyAgICByZWZfZnJhbWVfY29zdFtBTFRSRUZfRlJBTUVdICA9IHZwOF9jb3N0X29uZShwcm9iX2ludHJhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUocHJvYl9sYXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUocHJvYl9nYXJmKTsKKworfQorCitpbnQgdnA4X2VzdGltYXRlX2VudHJvcHlfc2F2aW5ncyhWUDhfQ09NUCAqY3BpKQoreworICAgIGludCBzYXZpbmdzID0gMDsKKworICAgIGNvbnN0IGludCAqY29uc3QgcmZjdCA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlOworICAgIGNvbnN0IGludCByZl9pbnRyYSA9IHJmY3RbSU5UUkFfRlJBTUVdOworICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07CisgICAgaW50IG5ld19pbnRyYSwgbmV3X2xhc3QsIG5ld19nYXJmLCBvbGR0b3RhbCwgbmV3dG90YWw7CisgICAgaW50IHJlZl9mcmFtZV9jb3N0W01BWF9SRUZfRlJBTUVTXTsKKworICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIGlmICghKG5ld19pbnRyYSA9IHJmX2ludHJhICogMjU1IC8gKHJmX2ludHJhICsgcmZfaW50ZXIpKSkKKyAgICAgICAgICAgIG5ld19pbnRyYSA9IDE7CisKKyAgICAgICAgbmV3X2xhc3QgPSByZl9pbnRlciA/IChyZmN0W0xBU1RfRlJBTUVdICogMjU1KSAvIHJmX2ludGVyIDogMTI4OworCisgICAgICAgIG5ld19nYXJmID0gKHJmY3RbR09MREVOX0ZSQU1FXSArIHJmY3RbQUxUUkVGX0ZSQU1FXSkKKyAgICAgICAgICAgICAgICAgID8gKHJmY3RbR09MREVOX0ZSQU1FXSAqIDI1NSkgLyAocmZjdFtHT0xERU5fRlJBTUVdICsgcmZjdFtBTFRSRUZfRlJBTUVdKSA6IDEyODsKKworCisgICAgICAgIHZwOF9jYWxjX3JlZl9mcmFtZV9jb3N0cyhyZWZfZnJhbWVfY29zdCxuZXdfaW50cmEsbmV3X2xhc3QsbmV3X2dhcmYpOworCisgICAgICAgIG5ld3RvdGFsID0KKyAgICAgICAgICAgIHJmY3RbSU5UUkFfRlJBTUVdICogcmVmX2ZyYW1lX2Nvc3RbSU5UUkFfRlJBTUVdICsKKyAgICAgICAgICAgIHJmY3RbTEFTVF9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtMQVNUX0ZSQU1FXSArCisgICAgICAgICAgICByZmN0W0dPTERFTl9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtHT0xERU5fRlJBTUVdICsKKyAgICAgICAgICAgIHJmY3RbQUxUUkVGX0ZSQU1FXSAqIHJlZl9mcmFtZV9jb3N0W0FMVFJFRl9GUkFNRV07CisKKworICAgICAgICAvKiBvbGQgY29zdHMgKi8KKyAgICAgICAgdnA4X2NhbGNfcmVmX2ZyYW1lX2Nvc3RzKHJlZl9mcmFtZV9jb3N0LGNwaS0+cHJvYl9pbnRyYV9jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9sYXN0X2NvZGVkLGNwaS0+cHJvYl9nZl9jb2RlZCk7CisKKyAgICAgICAgb2xkdG90YWwgPQorICAgICAgICAgICAgcmZjdFtJTlRSQV9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtJTlRSQV9GUkFNRV0gKworICAgICAgICAgICAgcmZjdFtMQVNUX0ZSQU1FXSAqIHJlZl9mcmFtZV9jb3N0W0xBU1RfRlJBTUVdICsKKyAgICAgICAgICAgIHJmY3RbR09MREVOX0ZSQU1FXSAqIHJlZl9mcmFtZV9jb3N0W0dPTERFTl9GUkFNRV0gKworICAgICAgICAgICAgcmZjdFtBTFRSRUZfRlJBTUVdICogcmVmX2ZyYW1lX2Nvc3RbQUxUUkVGX0ZSQU1FXTsKKworICAgICAgICBzYXZpbmdzICs9IChvbGR0b3RhbCAtIG5ld3RvdGFsKSAvIDI1NjsKKyAgICB9CisKKworICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUgJiBWUFhfRVJST1JfUkVTSUxJRU5UX1BBUlRJVElPTlMpCisgICAgICAgIHNhdmluZ3MgKz0gaW5kZXBlbmRlbnRfY29lZl9jb250ZXh0X3NhdmluZ3MoY3BpKTsKKyAgICBlbHNlCisgICAgICAgIHNhdmluZ3MgKz0gZGVmYXVsdF9jb2VmX2NvbnRleHRfc2F2aW5ncyhjcGkpOworCisKKyAgICByZXR1cm4gc2F2aW5nczsKK30KKworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcKK2ludCB2cDhfdXBkYXRlX2NvZWZfY29udGV4dChWUDhfQ09NUCAqY3BpKQoreworICAgIGludCBzYXZpbmdzID0gMDsKKworCisgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgdG8gZGVmYXVsdCBjb3VudHMvcHJvYmFiaWxpdGllcyBhdCBrZXkgZnJhbWVzICovCisgICAgICAgIHZwOF9jb3B5KGNwaS0+Y29lZl9jb3VudHMsIGRlZmF1bHRfY29lZl9jb3VudHMpOworICAgIH0KKworICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUgJiBWUFhfRVJST1JfUkVTSUxJRU5UX1BBUlRJVElPTlMpCisgICAgICAgIHNhdmluZ3MgKz0gaW5kZXBlbmRlbnRfY29lZl9jb250ZXh0X3NhdmluZ3MoY3BpKTsKKyAgICBlbHNlCisgICAgICAgIHNhdmluZ3MgKz0gZGVmYXVsdF9jb2VmX2NvbnRleHRfc2F2aW5ncyhjcGkpOworCisgICAgcmV0dXJuIHNhdmluZ3M7Cit9CisjZW5kaWYKKwordm9pZCB2cDhfdXBkYXRlX2NvZWZfcHJvYnMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBpbnQgaSA9IDA7CisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HKQorICAgIHZwOF93cml0ZXIgKmNvbnN0IHcgPSBjcGktPmJjOworI2VuZGlmCisgICAgaW50IHNhdmluZ3MgPSAwOworCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGludCBqID0gMDsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpbnQgayA9IDA7CisgICAgICAgICAgICBpbnQgcHJldl9jb2VmX3NhdmluZ3NbRU5UUk9QWV9OT0RFU10gPSB7MH07CisgICAgICAgICAgICBpZiAoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlICYgVlBYX0VSUk9SX1JFU0lMSUVOVF9QQVJUSVRJT05TKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBQUkVWX0NPRUZfQ09OVEVYVFM7ICsraykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0OyAgICAgIC8qIHRva2VuL3Byb2IgaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IEVOVFJPUFlfTk9ERVM7ICsrdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpjdCA9IGNwaS0+ZnJhbWVfYnJhbmNoX2N0IFtpXVtqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrXVt0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIG5ld3AgPSBjcGktPmZyYW1lX2NvZWZfcHJvYnNbaV1bal1ba11bdF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBvbGRwID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9ic1tpXVtqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba11bdF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiB1cGQgPSB2cDhfY29lZl91cGRhdGVfcHJvYnNbaV1bal1ba11bdF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfY29lZl9zYXZpbmdzW3RdICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JfdXBkYXRlX3NhdmluZ3MoY3QsIG9sZHAsIG5ld3AsIHVwZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vdGU6IHVzZSByZXN1bHQgZnJvbSB2cDhfZXN0aW1hdGVfZW50cm9weV9zYXZpbmdzLCBzbyBubworICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gY2FsbCB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbiBoZXJlLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLyogYXQgZXZlcnkgY29udGV4dCAqLworCisgICAgICAgICAgICAgICAgLyogY2FsYyBwcm9icyBhbmQgYnJhbmNoIGN0cyBmb3IgdGhpcyBmcmFtZSBvbmx5ICovCisgICAgICAgICAgICAgICAgaW50IHQgPSAwOyAgICAgIC8qIHRva2VuL3Byb2IgaW5kZXggKi8KKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBuZXdwID0gY3BpLT5mcmFtZV9jb2VmX3Byb2JzIFtpXVtqXVtrXVt0XTsKKworICAgICAgICAgICAgICAgICAgICB2cDhfcHJvYiAqUG9sZCA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgW2ldW2pdW2tdICsgdDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3Byb2IgdXBkID0gdnA4X2NvZWZfdXBkYXRlX3Byb2JzIFtpXVtqXVtrXVt0XTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IHByZXZfY29lZl9zYXZpbmdzW3RdOworICAgICAgICAgICAgICAgICAgICBpbnQgdSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfRVJST1JfUkVTSUxJRU5UX1BBUlRJVElPTlMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gcHJvYl91cGRhdGVfc2F2aW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZV9icmFuY2hfY3QgW2ldW2pdW2tdW3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUG9sZCwgbmV3cCwgdXBkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgPSAxOworCisgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIHVwZGF0ZXMgb24ga2V5IGZyYW1lcyBpZiB0aGUgbmV3IGlzIGRpZmZlcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICogc28gdGhhdCB3ZSBjYW4gYmUgc3VyZSB3ZSBlbmQgdXAgd2l0aCBlcXVhbCBwcm9iYWJpbGl0aWVzCisgICAgICAgICAgICAgICAgICAgICAqIG92ZXIgdGhlIHByZXYgY29lZiBjb250ZXh0cy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfRVJST1JfUkVTSUxJRU5UX1BBUlRJVElPTlMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAmJiBuZXdwICE9ICpQb2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgdSA9IDE7CisKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgICAgICAgICAgICAgICAgIGNwaS0+dXBkYXRlX3Byb2JzW2ldW2pdW2tdW3RdID0gdTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZSh3LCB1LCB1cGQpOworI2VuZGlmCisKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKyAgICAgICAgICAgICAgICAgICAgKysgdHJlZV91cGRhdGVfaGlzdCBbaV1bal1ba11bdF0gW3VdOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQvdXNlIG5ldyBwcm9iYWJpbGl0eSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAqUG9sZCA9IG5ld3A7CisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwodywgbmV3cCwgOCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgc2F2aW5ncyArPSBzOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKyt0IDwgRU5UUk9QWV9OT0RFUyk7CisKKyAgICAgICAgICAgICAgICAvKiBBY2N1bSB0b2tlbiBjb3VudHMgZm9yIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBzdGF0aXN0aWNzICovCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICAgICAgICAgIHQgPSAwOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfY291bnRlcnMgW2ldW2pdW2tdW3RdICs9IGNwaS0+Y29lZl9jb3VudHMgW2ldW2pdW2tdW3RdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKyt0IDwgTUFYX0VOVFJPUFlfVE9LRU5TKTsKKworI2VuZGlmCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2sgPCBQUkVWX0NPRUZfQ09OVEVYVFMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2ogPCBDT0VGX0JBTkRTKTsKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IEJMT0NLX1RZUEVTKTsKKworfQorCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworc3RhdGljIHZvaWQgcGFja19jb2VmX3Byb2JzKFZQOF9DT01QICpjcGkpCit7CisgICAgaW50IGkgPSAwOworICAgIHZwOF93cml0ZXIgKmNvbnN0IHcgPSBjcGktPmJjOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGludCBqID0gMDsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpbnQgayA9IDA7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSAwOyAgICAgIC8qIHRva2VuL3Byb2IgaW5kZXggKi8KKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiBuZXdwID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbaV1bal1ba11bdF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIHVwZCA9IHZwOF9jb2VmX3VwZGF0ZV9wcm9icyBbaV1bal1ba11bdF07CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciB1ID0gY3BpLT51cGRhdGVfcHJvYnNbaV1bal1ba11bdF0gOworCisgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZSh3LCB1LCB1cGQpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh1KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW5kL3VzZSBuZXcgcHJvYmFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKHcsIG5ld3AsIDgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgrK3QgPCBFTlRST1BZX05PREVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2sgPCBQUkVWX0NPRUZfQ09OVEVYVFMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2ogPCBDT0VGX0JBTkRTKTsKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IEJMT0NLX1RZUEVTKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUEFDS0VUX1RFU1RJTkcKK0ZJTEUgKnZweGxvZ2MgPSAwOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHB1dF9kZWx0YV9xKHZwOF93cml0ZXIgKmJjLCBpbnQgZGVsdGFfcSkKK3sKKyAgICBpZiAoZGVsdGFfcSAhPSAwKQorICAgIHsKKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMSk7CisgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBhYnMoZGVsdGFfcSksIDQpOworCisgICAgICAgIGlmIChkZWx0YV9xIDwgMCkKKyAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsKK30KKwordm9pZCB2cDhfcGFja19iaXRzdHJlYW0oVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciAqIGRlc3RfZW5kLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworICAgIGludCBpLCBqOworICAgIFZQOF9IRUFERVIgb2g7CisgICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIGNwaS0+Y29tbW9uOworICAgIHZwOF93cml0ZXIgKmNvbnN0IGJjID0gY3BpLT5iYzsKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmIGNwaS0+bWIuZV9tYmQ7CisgICAgaW50IGV4dHJhX2J5dGVzX3BhY2tlZCA9IDA7CisKKyAgICB1bnNpZ25lZCBjaGFyICpjeF9kYXRhID0gZGVzdDsKKyAgICB1bnNpZ25lZCBjaGFyICpjeF9kYXRhX2VuZCA9IGRlc3RfZW5kOworICAgIGNvbnN0IGludCAqbWJfZmVhdHVyZV9kYXRhX2JpdHM7CisKKyAgICBvaC5zaG93X2ZyYW1lID0gKGludCkgcGMtPnNob3dfZnJhbWU7CisgICAgb2gudHlwZSA9IChpbnQpcGMtPmZyYW1lX3R5cGU7CisgICAgb2gudmVyc2lvbiA9IHBjLT52ZXJzaW9uOworICAgIG9oLmZpcnN0X3BhcnRpdGlvbl9sZW5ndGhfaW5fYnl0ZXMgPSAwOworCisgICAgbWJfZmVhdHVyZV9kYXRhX2JpdHMgPSB2cDhfbWJfZmVhdHVyZV9kYXRhX2JpdHM7CisKKyAgICBiY1swXS5lcnJvciA9ICZwYy0+ZXJyb3I7CisKKyAgICB2YWxpZGF0ZV9idWZmZXIoY3hfZGF0YSwgMywgY3hfZGF0YV9lbmQsICZjcGktPmNvbW1vbi5lcnJvcik7CisgICAgY3hfZGF0YSArPSAzOworCisjaWYgZGVmaW5lZChTRUNUSU9OQklUU19PVVRQVVQpCisgICAgU2VjdGlvbmJpdHNbYWN0aXZlX3NlY3Rpb24gPSAxXSArPSBzaXplb2YoVlA4X0hFQURFUikgKiA4ICogMjU2OworI2VuZGlmCisKKyAgICAvKiBldmVyeSBrZXlmcmFtZSBzZW5kIHN0YXJ0Y29kZSwgd2lkdGgsIGhlaWdodCwgc2NhbGUgZmFjdG9yLCBjbGFtcAorICAgICAqIGFuZCBjb2xvciB0eXBlCisgICAgICovCisgICAgaWYgKG9oLnR5cGUgPT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgaW50IHY7CisKKyAgICAgICAgdmFsaWRhdGVfYnVmZmVyKGN4X2RhdGEsIDcsIGN4X2RhdGFfZW5kLCAmY3BpLT5jb21tb24uZXJyb3IpOworCisgICAgICAgIC8qIFN0YXJ0IC8gc3luY2ggY29kZSAqLworICAgICAgICBjeF9kYXRhWzBdID0gMHg5RDsKKyAgICAgICAgY3hfZGF0YVsxXSA9IDB4MDE7CisgICAgICAgIGN4X2RhdGFbMl0gPSAweDJhOworCisgICAgICAgIHYgPSAocGMtPmhvcml6X3NjYWxlIDw8IDE0KSB8IHBjLT5XaWR0aDsKKyAgICAgICAgY3hfZGF0YVszXSA9IHY7CisgICAgICAgIGN4X2RhdGFbNF0gPSB2ID4+IDg7CisKKyAgICAgICAgdiA9IChwYy0+dmVydF9zY2FsZSA8PCAxNCkgfCBwYy0+SGVpZ2h0OworICAgICAgICBjeF9kYXRhWzVdID0gdjsKKyAgICAgICAgY3hfZGF0YVs2XSA9IHYgPj4gODsKKworCisgICAgICAgIGV4dHJhX2J5dGVzX3BhY2tlZCA9IDc7CisgICAgICAgIGN4X2RhdGEgKz0gZXh0cmFfYnl0ZXNfcGFja2VkIDsKKworICAgICAgICB2cDhfc3RhcnRfZW5jb2RlKGJjLCBjeF9kYXRhLCBjeF9kYXRhX2VuZCk7CisKKyAgICAgICAgLyogc2lnbmFsIGNsciB0eXBlICovCisgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5jbHJfdHlwZSk7CisgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5jbGFtcF90eXBlKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHZwOF9zdGFydF9lbmNvZGUoYmMsIGN4X2RhdGEsIGN4X2RhdGFfZW5kKTsKKworCisgICAgLyogU2lnbmFsIHdoZXRoZXIgb3Igbm90IFNlZ21lbnRhdGlvbiBpcyBlbmFibGVkICovCisgICAgdnA4X3dyaXRlX2JpdChiYywgeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKTsKKworICAgIC8qICBJbmRpY2F0ZSB3aGljaCBmZWF0dXJlcyBhcmUgZW5hYmxlZCAqLworICAgIGlmICh4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQpCisgICAgeworICAgICAgICAvKiBTaWduYWwgd2hldGhlciBvciBub3QgdGhlIHNlZ21lbnRhdGlvbiBtYXAgaXMgYmVpbmcgdXBkYXRlZC4gKi8KKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgeGQtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKTsKKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgeGQtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSk7CisKKyAgICAgICAgaWYgKHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpZ25lZCBjaGFyIERhdGE7CisKKyAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHhkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEpOworCisgICAgICAgICAgICAvKiBGb3IgZWFjaCBzZWdtZW50YXRpb24gZmVhdHVyZSAoUXVhbnQgYW5kIGxvb3AgZmlsdGVyIGxldmVsKSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1CX0xWTF9NQVg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBvZiB0aGUgc2VnbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX01CX1NFR01FTlRTOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEYXRhID0geGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW2ldW2pdOworCisgICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIGxldmVsIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKERhdGEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IC0gRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgRGF0YSwgbWJfZmVhdHVyZV9kYXRhX2JpdHNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBEYXRhLCBtYl9mZWF0dXJlX2RhdGFfYml0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV3JpdGUgdGhlIHByb2JzIHVzZWQgdG8gZGVjb2RlIHRoZSBzZWdtZW50IGlkIGZvciBlYWNoIG1iICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUJfRkVBVFVSRV9UUkVFX1BST0JTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IERhdGEgPSB4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzW2ldOworCisgICAgICAgICAgICAgICAgaWYgKERhdGEgIT0gMjU1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMSk7CisgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBEYXRhLCA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5maWx0ZXJfdHlwZSk7CisgICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIHBjLT5maWx0ZXJfbGV2ZWwsIDYpOworICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBwYy0+c2hhcnBuZXNzX2xldmVsLCAzKTsKKworICAgIC8qIFdyaXRlIG91dCBsb29wIGZpbHRlciBkZWx0YXMgYXBwbGllZCBhdCB0aGUgTUIgbGV2ZWwgYmFzZWQgb24gbW9kZQorICAgICAqIG9yIHJlZiBmcmFtZSAoaWYgdGhleSBhcmUgZW5hYmxlZCkuCisgICAgICovCisgICAgdnA4X3dyaXRlX2JpdChiYywgeGQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQpOworCisgICAgaWYgKHhkLT5tb2RlX3JlZl9sZl9kZWx0YV9lbmFibGVkKQorICAgIHsKKyAgICAgICAgLyogRG8gdGhlIGRlbHRhcyBuZWVkIHRvIGJlIHVwZGF0ZWQgKi8KKyAgICAgICAgaW50IHNlbmRfdXBkYXRlID0geGQtPm1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGU7CisKKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgc2VuZF91cGRhdGUpOworICAgICAgICBpZiAoc2VuZF91cGRhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBEYXRhOworCisgICAgICAgICAgICAvKiBTZW5kIHVwZGF0ZSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfTEZfREVMVEFTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGF0YSA9IHhkLT5yZWZfbGZfZGVsdGFzW2ldOworCisgICAgICAgICAgICAgICAgLyogRnJhbWUgbGV2ZWwgZGF0YSAqLworICAgICAgICAgICAgICAgIGlmICh4ZC0+cmVmX2xmX2RlbHRhc1tpXSAhPSB4ZC0+bGFzdF9yZWZfbGZfZGVsdGFzW2ldCisgICAgICAgICAgICAgICAgICAgIHx8IGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhkLT5sYXN0X3JlZl9sZl9kZWx0YXNbaV0gPSB4ZC0+cmVmX2xmX2RlbHRhc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKERhdGEgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgKERhdGEgJiAweDNGKSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsgICAgLyogc2lnbiAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IC1EYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIChEYXRhICYgMHgzRiksIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMSk7ICAgIC8qIHNpZ24gKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTZW5kIHVwZGF0ZSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NT0RFX0xGX0RFTFRBUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERhdGEgPSB4ZC0+bW9kZV9sZl9kZWx0YXNbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfbGZfZGVsdGFzW2ldICE9IHhkLT5sYXN0X21vZGVfbGZfZGVsdGFzW2ldCisgICAgICAgICAgICAgICAgICAgIHx8IGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhkLT5sYXN0X21vZGVfbGZfZGVsdGFzW2ldID0geGQtPm1vZGVfbGZfZGVsdGFzW2ldOworICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCAoRGF0YSAmIDB4M0YpLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDApOyAgICAvKiBzaWduICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gLURhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgKERhdGEgJiAweDNGKSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsgICAgLyogc2lnbiAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzaWduYWwgaGVyZSBpcyBtdWx0aSB0b2tlbiBwYXJ0aXRpb24gaXMgZW5hYmxlZCAqLworICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBwYy0+bXVsdGlfdG9rZW5fcGFydGl0aW9uLCAyKTsKKworICAgIC8qIEZyYW1lIFFiYXNlbGluZSBxdWFudGl6ZXIgaW5kZXggKi8KKyAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcGMtPmJhc2VfcWluZGV4LCA3KTsKKworICAgIC8qIFRyYW5zbWl0IERjLCBTZWNvbmQgb3JkZXIgYW5kIFV2IHF1YW50aXplciBkZWx0YSBpbmZvcm1hdGlvbiAqLworICAgIHB1dF9kZWx0YV9xKGJjLCBwYy0+eTFkY19kZWx0YV9xKTsKKyAgICBwdXRfZGVsdGFfcShiYywgcGMtPnkyZGNfZGVsdGFfcSk7CisgICAgcHV0X2RlbHRhX3EoYmMsIHBjLT55MmFjX2RlbHRhX3EpOworICAgIHB1dF9kZWx0YV9xKGJjLCBwYy0+dXZkY19kZWx0YV9xKTsKKyAgICBwdXRfZGVsdGFfcShiYywgcGMtPnV2YWNfZGVsdGFfcSk7CisKKyAgICAvKiBXaGVuIHRoZXJlIGlzIGEga2V5IGZyYW1lIGFsbCByZWZlcmVuY2UgYnVmZmVycyBhcmUgdXBkYXRlZCB1c2luZworICAgICAqIHRoZSBuZXcga2V5IGZyYW1lCisgICAgICovCisgICAgaWYgKHBjLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIC8qIFNob3VsZCB0aGUgR0Ygb3IgQVJGIGJlIHVwZGF0ZWQgdXNpbmcgdGhlIHRyYW5zbWl0dGVkIGZyYW1lCisgICAgICAgICAqIG9yIGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgcGMtPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKTsKKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgcGMtPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSk7CisKKyAgICAgICAgLyogSWYgbm90IGJlaW5nIHVwZGF0ZWQgZnJvbSBjdXJyZW50IGZyYW1lIHNob3VsZCBlaXRoZXIgR0Ygb3IgQVJGCisgICAgICAgICAqIGJlIHVwZGF0ZWQgZnJvbSBhbm90aGVyIGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFwYy0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcGMtPmNvcHlfYnVmZmVyX3RvX2dmLCAyKTsKKworICAgICAgICBpZiAoIXBjLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCisgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcGMtPmNvcHlfYnVmZmVyX3RvX2FyZiwgMik7CisKKyAgICAgICAgLyogSW5kaWNhdGUgcmVmZXJlbmNlIGZyYW1lIHNpZ24gYmlhcyBmb3IgR29sZGVuIGFuZCBBUkYgZnJhbWVzCisgICAgICAgICAqIChhbHdheXMgMCBmb3IgbGFzdCBmcmFtZSBidWZmZXIpCisgICAgICAgICAqLworICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCBwYy0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tHT0xERU5fRlJBTUVdKTsKKyAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgcGMtPnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSk7CisgICAgfQorCisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HKQorICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUgJiBWUFhfRVJST1JfUkVTSUxJRU5UX1BBUlRJVElPTlMpCisgICAgeworICAgICAgICBpZiAocGMtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgcGMtPnJlZnJlc2hfZW50cm9weV9wcm9icyA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPSAwOworICAgIH0KKyNlbmRpZgorCisgICAgdnA4X3dyaXRlX2JpdChiYywgcGMtPnJlZnJlc2hfZW50cm9weV9wcm9icyk7CisKKyAgICBpZiAocGMtPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCBwYy0+cmVmcmVzaF9sYXN0X2ZyYW1lKTsKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKworICAgIGlmIChwYy0+ZnJhbWVfdHlwZSA9PSBJTlRFUl9GUkFNRSkKKyAgICAgICAgYWN0aXZlX3NlY3Rpb24gPSAwOworICAgIGVsc2UKKyAgICAgICAgYWN0aXZlX3NlY3Rpb24gPSA3OworCisjZW5kaWYKKworICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcKKyAgICBwYWNrX2NvZWZfcHJvYnMoY3BpKTsKKyNlbHNlCisgICAgaWYgKHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIHNhdmUgYSBjb3B5IGZvciBsYXRlciByZWZyZXNoICovCisgICAgICAgIHZweF9tZW1jcHkoJmNwaS0+Y29tbW9uLmxmYywgJmNwaS0+Y29tbW9uLmZjLCBzaXplb2YoY3BpLT5jb21tb24uZmMpKTsKKyAgICB9CisKKyAgICB2cDhfdXBkYXRlX2NvZWZfcHJvYnMoY3BpKTsKKyNlbmRpZgorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgIGFjdGl2ZV9zZWN0aW9uID0gMjsKKyNlbmRpZgorCisgICAgLyogV3JpdGUgb3V0IHRoZSBtYl9ub19jb2VmZl9za2lwIGZsYWcgKi8KKyAgICB2cDhfd3JpdGVfYml0KGJjLCBwYy0+bWJfbm9fY29lZmZfc2tpcCk7CisKKyAgICBpZiAocGMtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgd3JpdGVfa2Ztb2RlcyhjcGkpOworCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICBhY3RpdmVfc2VjdGlvbiA9IDg7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFja19pbnRlcl9tb2RlX212cyhjcGkpOworCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICBhY3RpdmVfc2VjdGlvbiA9IDE7CisjZW5kaWYKKyAgICB9CisKKyAgICB2cDhfc3RvcF9lbmNvZGUoYmMpOworCisgICAgY3hfZGF0YSArPSBiYy0+cG9zOworCisgICAgb2guZmlyc3RfcGFydGl0aW9uX2xlbmd0aF9pbl9ieXRlcyA9IGNwaS0+YmMtPnBvczsKKworICAgIC8qIHVwZGF0ZSBmcmFtZSB0YWcgKi8KKyAgICB7CisgICAgICAgIGludCB2ID0gKG9oLmZpcnN0X3BhcnRpdGlvbl9sZW5ndGhfaW5fYnl0ZXMgPDwgNSkgfAorICAgICAgICAgICAgICAgIChvaC5zaG93X2ZyYW1lIDw8IDQpIHwKKyAgICAgICAgICAgICAgICAob2gudmVyc2lvbiA8PCAxKSB8CisgICAgICAgICAgICAgICAgb2gudHlwZTsKKworICAgICAgICBkZXN0WzBdID0gdjsKKyAgICAgICAgZGVzdFsxXSA9IHYgPj4gODsKKyAgICAgICAgZGVzdFsyXSA9IHYgPj4gMTY7CisgICAgfQorCisgICAgKnNpemUgPSBWUDhfSEVBREVSX1NJWkUgKyBleHRyYV9ieXRlc19wYWNrZWQgKyBjcGktPmJjLT5wb3M7CisKKyAgICBjcGktPnBhcnRpdGlvbl9zelswXSA9ICpzaXplOworCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworICAgIHsKKyAgICAgICAgY29uc3QgaW50IG51bV9wYXJ0ID0gKDEgPDwgcGMtPm11bHRpX3Rva2VuX3BhcnRpdGlvbik7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBkcCA9IGNwaS0+cGFydGl0aW9uX2RbMF0gKyBjcGktPnBhcnRpdGlvbl9zelswXTsKKworICAgICAgICBpZiAobnVtX3BhcnQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3cml0ZSB0b2tlbiBwYXJ0IHNpemVzIChhbGwgYnV0IGxhc3QpIGlmIG1vcmUgdGhhbiAxICovCisgICAgICAgICAgICB2YWxpZGF0ZV9idWZmZXIoZHAsIDMgKiAobnVtX3BhcnQgLSAxKSwgY3BpLT5wYXJ0aXRpb25fZF9lbmRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjLT5lcnJvcik7CisKKyAgICAgICAgICAgIGNwaS0+cGFydGl0aW9uX3N6WzBdICs9IDMqKG51bV9wYXJ0LTEpOworCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCBudW1fcGFydDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlX3BhcnRpdGlvbl9zaXplKGRwLCBjcGktPnBhcnRpdGlvbl9zeltpXSk7CisgICAgICAgICAgICAgICAgZHAgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY3BpLT5vdXRwdXRfcGFydGl0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjb25jYXRlbmF0ZSBwYXJ0aXRpb24gYnVmZmVycyAqLworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbnVtX3BhcnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cHhfbWVtbW92ZShkcCwgY3BpLT5wYXJ0aXRpb25fZFtpKzFdLCBjcGktPnBhcnRpdGlvbl9zeltpKzFdKTsKKyAgICAgICAgICAgICAgICBjcGktPnBhcnRpdGlvbl9kW2krMV0gPSBkcDsKKyAgICAgICAgICAgICAgICBkcCArPSBjcGktPnBhcnRpdGlvbl9zeltpKzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIHRvdGFsIHNpemUgKi8KKyAgICAgICAgKnNpemUgPSAwOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBudW1fcGFydCsxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpzaXplICs9IGNwaS0+cGFydGl0aW9uX3N6W2ldOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAocGMtPm11bHRpX3Rva2VuX3BhcnRpdGlvbiAhPSBPTkVfUEFSVElUSU9OKQorICAgIHsKKyAgICAgICAgaW50IG51bV9wYXJ0ID0gMSA8PCBwYy0+bXVsdGlfdG9rZW5fcGFydGl0aW9uOworCisgICAgICAgIC8qIHBhcnRpdGlvbiBzaXplIHRhYmxlIGF0IHRoZSBlbmQgb2YgZmlyc3QgcGFydGl0aW9uICovCisgICAgICAgIGNwaS0+cGFydGl0aW9uX3N6WzBdICs9IDMgKiAobnVtX3BhcnQgLSAxKTsKKyAgICAgICAgKnNpemUgKz0gMyAqIChudW1fcGFydCAtIDEpOworCisgICAgICAgIHZhbGlkYXRlX2J1ZmZlcihjeF9kYXRhLCAzICogKG51bV9wYXJ0IC0gMSksIGN4X2RhdGFfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBjLT5lcnJvcik7CisKKyAgICAgICAgZm9yKGkgPSAxOyBpIDwgbnVtX3BhcnQgKyAxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+YmNbaV0uZXJyb3IgPSAmcGMtPmVycm9yOworICAgICAgICB9CisKKyAgICAgICAgcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zKGNwaSwgY3hfZGF0YSArIDMgKiAobnVtX3BhcnQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4X2RhdGFfZW5kLCBudW1fcGFydCk7CisKKyAgICAgICAgZm9yKGkgPSAxOyBpIDwgbnVtX3BhcnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5wYXJ0aXRpb25fc3pbaV0gPSBjcGktPmJjW2ldLnBvczsKKyAgICAgICAgICAgIHdyaXRlX3BhcnRpdGlvbl9zaXplKGN4X2RhdGEsIGNwaS0+cGFydGl0aW9uX3N6W2ldKTsKKyAgICAgICAgICAgIGN4X2RhdGEgKz0gMzsKKyAgICAgICAgICAgICpzaXplICs9IGNwaS0+cGFydGl0aW9uX3N6W2ldOyAvKiBhZGQgdG8gdG90YWwgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIGFkZCBsYXN0IHBhcnRpdGlvbiB0byB0b3RhbCBzaXplICovCisgICAgICAgIGNwaS0+cGFydGl0aW9uX3N6W2ldID0gY3BpLT5iY1tpXS5wb3M7CisgICAgICAgICpzaXplICs9IGNwaS0+cGFydGl0aW9uX3N6W2ldOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY1sxXS5lcnJvciA9ICZwYy0+ZXJyb3I7CisKKyAgICAgICAgdnA4X3N0YXJ0X2VuY29kZSgmY3BpLT5iY1sxXSwgY3hfZGF0YSwgY3hfZGF0YV9lbmQpOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCisgICAgICAgICAgICBwYWNrX21iX3Jvd190b2tlbnMoY3BpLCAmY3BpLT5iY1sxXSk7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgcGFja190b2tlbnMoJmNwaS0+YmNbMV0sIGNwaS0+dG9rLCBjcGktPnRva19jb3VudCk7CisKKyAgICAgICAgdnA4X3N0b3BfZW5jb2RlKCZjcGktPmJjWzFdKTsKKworICAgICAgICAqc2l6ZSArPSBjcGktPmJjWzFdLnBvczsKKyAgICAgICAgY3BpLT5wYXJ0aXRpb25fc3pbMV0gPSBjcGktPmJjWzFdLnBvczsKKyAgICB9CisjZW5kaWYKK30KKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKK3ZvaWQgcHJpbnRfdHJlZV91cGRhdGVfcHJvYnMoKQoreworICAgIGludCBpLCBqLCBrLCBsOworICAgIEZJTEUgKmYgPSBmb3BlbigiY29udGV4dC5jIiwgImEiKTsKKyAgICBpbnQgU3VtOworICAgIGZwcmludGYoZiwgIlxuLyogVXBkYXRlIHByb2JhYmlsaXRpZXMgZm9yIHRva2VuIGVudHJvcHkgdHJlZS4gKi9cblxuIik7CisgICAgZnByaW50ZihmLCAiY29uc3QgdnA4X3Byb2IgdHJlZV91cGRhdGVfcHJvYnNbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbRU5UUk9QWV9OT0RFU10gPSB7XG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgICAgZnByaW50ZihmLCAiICB7IFxuIik7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IENPRUZfQkFORFM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIHtcbiIpOworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgUFJFVl9DT0VGX0NPTlRFWFRTOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICAgICAgeyIpOworCisgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IEVOVFJPUFlfTk9ERVM7IGwrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN1bSA9IHRyZWVfdXBkYXRlX2hpc3RbaV1bal1ba11bbF1bMF0gKyB0cmVlX3VwZGF0ZV9oaXN0W2ldW2pdW2tdW2xdWzFdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChTdW0gPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCh0cmVlX3VwZGF0ZV9oaXN0W2ldW2pdW2tdW2xdWzBdICogMjU1KSAvIFN1bSkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiUzbGQsICIsICh0cmVlX3VwZGF0ZV9oaXN0W2ldW2pdW2tdW2xdWzBdICogMjU1KSAvIFN1bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTNsZCwgIiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTNsZCwgIiwgMTI4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJ9LFxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICB9LFxuIik7CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKGYsICIgIH0sXG4iKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGYsICJ9O1xuIik7CisgICAgZmNsb3NlKGYpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYml0c3RyZWFtLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvYml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9iaXRzdHJlYW0uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19CSVRTVFJFQU1fSAorI2RlZmluZSBfX0lOQ19CSVRTVFJFQU1fSAorCisjaWYgSEFWRV9FRFNQCit2b2lkIHZwOGN4X3BhY2tfdG9rZW5zX2FybXY1KHZwOF93cml0ZXIgKncsIGNvbnN0IFRPS0VORVhUUkEgKnAsIGludCB4Y291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90b2tlbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfZXh0cmFfYml0X3N0cnVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfdHJlZV9pbmRleCAqKTsKK3ZvaWQgdnA4Y3hfcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2FybXY1KFZQOF9DT01QICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogY3hfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN4X2RhdGFfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90b2tlbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90cmVlX2luZGV4ICopOwordm9pZCB2cDhjeF9wYWNrX21iX3Jvd190b2tlbnNfYXJtdjUoVlA4X0NPTVAgKmNwaSwgdnA4X3dyaXRlciAqdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90b2tlbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90cmVlX2luZGV4ICopOworIyBkZWZpbmUgcGFja190b2tlbnMoYSxiLGMpICAgICAgICAgICAgICAgICAgXAorICAgIHZwOGN4X3BhY2tfdG9rZW5zX2FybXY1KGEsYixjLHZwOF9jb2VmX2VuY29kaW5ncyx2cDhfZXh0cmFfYml0cyx2cDhfY29lZl90cmVlKQorIyBkZWZpbmUgcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zKGEsYixjLGQpICBcCisgICAgdnA4Y3hfcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2FybXY1KGEsYixjLGQsdnA4X2NvZWZfZW5jb2RpbmdzLHZwOF9leHRyYV9iaXRzLHZwOF9jb2VmX3RyZWUpCisjIGRlZmluZSBwYWNrX21iX3Jvd190b2tlbnMoYSxiKSAgICAgICAgICAgICAgIFwKKyAgICB2cDhjeF9wYWNrX21iX3Jvd190b2tlbnNfYXJtdjUoYSxiLHZwOF9jb2VmX2VuY29kaW5ncyx2cDhfZXh0cmFfYml0cyx2cDhfY29lZl90cmVlKQorI2Vsc2UKKwordm9pZCB2cDhfcGFja190b2tlbnNfYyh2cDhfd3JpdGVyICp3LCBjb25zdCBUT0tFTkVYVFJBICpwLCBpbnQgeGNvdW50KTsKKworIyBkZWZpbmUgcGFja190b2tlbnMoYSxiLGMpICAgICAgICAgICAgICAgICAgICB2cDhfcGFja190b2tlbnNfYyhhLGIsYykKKyMgZGVmaW5lIHBhY2tfdG9rZW5zX2ludG9fcGFydGl0aW9ucyhhLGIsYyxkKSAgcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2MoYSxiLGMsZCkKKyMgZGVmaW5lIHBhY2tfbWJfcm93X3Rva2VucyhhLGIpICAgICAgICAgICAgICAgcGFja19tYl9yb3dfdG9rZW5zX2MoYSxiKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2Jsb2NrLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ2M2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2Jsb2NrLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX0JMT0NLX0gKKyNkZWZpbmUgX19JTkNfQkxPQ0tfSAorCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltdi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weS5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKKworLyogbW90aW9uIHNlYXJjaCBzaXRlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIE1WIG12OworICAgIGludCBvZmZzZXQ7Cit9IHNlYXJjaF9zaXRlOworCit0eXBlZGVmIHN0cnVjdCBibG9jaworeworICAgIC8qIDE2IFkgYmxvY2tzLCA0IFUgYmxvY2tzLCA0IFYgYmxvY2tzIGVhY2ggd2l0aCAxNiBlbnRyaWVzICovCisgICAgc2hvcnQgKnNyY19kaWZmOworICAgIHNob3J0ICpjb2VmZjsKKworICAgIC8qIDE2IFkgYmxvY2tzLCA0IFUgYmxvY2tzLCA0IFYgYmxvY2tzIGVhY2ggd2l0aCAxNiBlbnRyaWVzICovCisgICAgc2hvcnQgKnF1YW50OworICAgIHNob3J0ICpxdWFudF9mYXN0OworICAgIHVuc2lnbmVkIGNoYXIgKnF1YW50X3NoaWZ0OworICAgIHNob3J0ICp6YmluOworICAgIHNob3J0ICp6cnVuX3piaW5fYm9vc3Q7CisgICAgc2hvcnQgKnJvdW5kOworCisgICAgLyogWmJpbiBPdmVyIFF1YW50IHZhbHVlICovCisgICAgc2hvcnQgemJpbl9leHRyYTsKKworICAgIHVuc2lnbmVkIGNoYXIgKipiYXNlX3NyYzsKKyAgICBpbnQgc3JjOworICAgIGludCBzcmNfc3RyaWRlOworfSBCTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgY291bnQ7CisgICAgc3RydWN0CisgICAgeworICAgICAgICBCX1BSRURJQ1RJT05fTU9ERSBtb2RlOworICAgICAgICBpbnRfbXYgbXY7CisgICAgfSBibWlbMTZdOworfSBQQVJUSVRJT05fSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgbWFjcm9ibG9jaworeworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIHNyY19kaWZmWzQwMF0pOyAvKiAyNSBibG9ja3MgWSxVLFYsWTIgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBjb2VmZls0MDBdKTsgLyogMjUgYmxvY2tzIFksVSxWLFkyICovCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1bnNpZ25lZCBjaGFyLCB0aGlzbWJbMjU2XSk7CisKKyAgICB1bnNpZ25lZCBjaGFyICp0aGlzbWJfcHRyOworICAgIC8qIDE2IFksIDQgVSwgNCBWLCAxIERDIDJuZCBvcmRlciBibG9jayAqLworICAgIEJMT0NLIGJsb2NrWzI1XTsKKworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzcmM7CisKKyAgICBNQUNST0JMT0NLRCBlX21iZDsKKyAgICBQQVJUSVRJT05fSU5GTyAqcGFydGl0aW9uX2luZm87IC8qIHdvcmsgcG9pbnRlciAqLworICAgIFBBUlRJVElPTl9JTkZPICpwaTsgICAvKiBDb3JyZXNwb25kcyB0byB1cHBlciBsZWZ0IHZpc2libGUgbWFjcm9ibG9jayAqLworICAgIFBBUlRJVElPTl9JTkZPICpwaXA7ICAvKiBCYXNlIG9mIGFsbG9jYXRlZCBhcnJheSAqLworCisgICAgaW50IHJlZl9mcmFtZV9jb3N0W01BWF9SRUZfRlJBTUVTXTsKKworICAgIHNlYXJjaF9zaXRlICpzczsKKyAgICBpbnQgc3NfY291bnQ7CisgICAgaW50IHNlYXJjaGVzX3Blcl9zdGVwOworCisgICAgaW50IGVycm9ycGVyYml0OworICAgIGludCBzYWRwZXJiaXQxNjsKKyAgICBpbnQgc2FkcGVyYml0NDsKKyAgICBpbnQgcmRkaXY7CisgICAgaW50IHJkbXVsdDsKKyAgICB1bnNpZ25lZCBpbnQgKiBtYl9hY3Rpdml0eV9wdHI7CisgICAgaW50ICogbWJfbm9ybV9hY3Rpdml0eV9wdHI7CisgICAgc2lnbmVkIGludCBhY3RfemJpbl9hZGo7CisgICAgc2lnbmVkIGludCBsYXN0X2FjdF96YmluX2FkajsKKworICAgIGludCAqbXZjb3N0WzJdOworICAgIGludCAqbXZzYWRjb3N0WzJdOworICAgIGludCAoKm1ibW9kZV9jb3N0KVtNQl9NT0RFX0NPVU5UXTsKKyAgICBpbnQgKCppbnRyYV91dl9tb2RlX2Nvc3QpW01CX01PREVfQ09VTlRdOworICAgIGludCAoKmJtb2RlX2Nvc3RzKVsxMF1bMTBdOworICAgIGludCAqaW50ZXJfYm1vZGVfY29zdHM7CisgICAgaW50ICgqdG9rZW5fY29zdHMpW0NPRUZfQkFORFNdW1BSRVZfQ09FRl9DT05URVhUU10KKyAgICBbTUFYX0VOVFJPUFlfVE9LRU5TXTsKKworICAgIC8qIFRoZXNlIGRlZmluZSBsaW1pdHMgdG8gbW90aW9uIHZlY3RvciBjb21wb25lbnRzIHRvIHByZXZlbnQKKyAgICAgKiB0aGVtIGZyb20gZXh0ZW5kaW5nIG91dHNpZGUgdGhlIFVNViBib3JkZXJzLgorICAgICAqLworICAgIGludCBtdl9jb2xfbWluOworICAgIGludCBtdl9jb2xfbWF4OworICAgIGludCBtdl9yb3dfbWluOworICAgIGludCBtdl9yb3dfbWF4OworCisgICAgaW50IHNraXA7CisKKyAgICB1bnNpZ25lZCBpbnQgZW5jb2RlX2JyZWFrb3V0OworCisgICAgc2lnbmVkIGNoYXIgKmdmX2FjdGl2ZV9wdHI7CisKKyAgICB1bnNpZ25lZCBjaGFyICphY3RpdmVfcHRyOworICAgIE1WX0NPTlRFWFQgKm12YzsKKworICAgIGludCBvcHRpbWl6ZTsKKyAgICBpbnQgcV9pbmRleDsKKworI2lmIENPTkZJR19URU1QT1JBTF9ERU5PSVNJTkcKKyAgICBNQl9QUkVESUNUSU9OX01PREUgYmVzdF9zc2VfaW50ZXJfbW9kZTsKKyAgICBpbnRfbXYgYmVzdF9zc2VfbXY7CisgICAgTVZfUkVGRVJFTkNFX0ZSQU1FIGJlc3RfcmVmZXJlbmNlX2ZyYW1lOworICAgIE1WX1JFRkVSRU5DRV9GUkFNRSBiZXN0X3plcm9tdl9yZWZlcmVuY2VfZnJhbWU7CisgICAgdW5zaWduZWQgY2hhciBuZWVkX3RvX2NsYW1wX2Jlc3RfbXZzOworI2VuZGlmCisKKyAgICBpbnQgc2tpcF90cnVlX2NvdW50OworICAgIHVuc2lnbmVkIGludCBjb2VmX2NvdW50cyBbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbTUFYX0VOVFJPUFlfVE9LRU5TXTsKKyAgICB1bnNpZ25lZCBpbnQgTVZjb3VudCBbMl0gW01WdmFsc107ICAvKiAocm93LGNvbCkgTVYgY3RzIHRoaXMgZnJhbWUgKi8KKyAgICBpbnQgeW1vZGVfY291bnQgW1ZQOF9ZTU9ERVNdOyAgICAgICAgLyogaW50cmEgTUIgdHlwZSBjdHMgdGhpcyBmcmFtZSAqLworICAgIGludCB1dl9tb2RlX2NvdW50W1ZQOF9VVl9NT0RFU107ICAgICAvKiBpbnRyYSBNQiB0eXBlIGN0cyB0aGlzIGZyYW1lICovCisgICAgaW50NjRfdCBwcmVkaWN0aW9uX2Vycm9yOworICAgIGludDY0X3QgaW50cmFfZXJyb3I7CisKKworICAgIHZvaWQgKCpzaG9ydF9mZGN0NHg0KShzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7CisgICAgdm9pZCAoKnNob3J0X2ZkY3Q4eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKKyAgICB2b2lkICgqc2hvcnRfd2Fsc2g0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKKyAgICB2b2lkICgqcXVhbnRpemVfYikoQkxPQ0sgKmIsIEJMT0NLRCAqZCk7CisgICAgdm9pZCAoKnF1YW50aXplX2JfcGFpcikoQkxPQ0sgKmIxLCBCTE9DSyAqYjIsIEJMT0NLRCAqZDAsIEJMT0NLRCAqZDEpOworCit9IE1BQ1JPQkxPQ0s7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYm9vbGh1ZmYuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9ib29saHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzcwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYm9vbGh1ZmYuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgImJvb2xodWZmLmgiCisKKyNpZiBkZWZpbmVkKFNFQ1RJT05CSVRTX09VVFBVVCkKK3Vuc2lnbmVkIF9faW50NjQgU2VjdGlvbmJpdHNbNTAwXTsKKworI2VuZGlmCisKKyNpZmRlZiBFTlRST1BZX1NUQVRTCit1bnNpZ25lZCBpbnQgYWN0aXZlX3NlY3Rpb24gPSAwOworI2VuZGlmCisKK2NvbnN0IHVuc2lnbmVkIGludCB2cDhfcHJvYl9jb3N0WzI1Nl0gPQoreworICAgIDIwNDcsIDIwNDcsIDE3OTEsIDE2NDEsIDE1MzUsIDE0NTIsIDEzODUsIDEzMjgsIDEyNzksIDEyMzUsIDExOTYsIDExNjEsIDExMjksIDEwOTksIDEwNzIsIDEwNDYsCisgICAgMTAyMywgMTAwMCwgIDk3OSwgIDk1OSwgIDk0MCwgIDkyMiwgIDkwNSwgIDg4OSwgIDg3MywgIDg1OCwgIDg0MywgIDgyOSwgIDgxNiwgIDgwMywgIDc5MCwgIDc3OCwKKyAgICA3NjcsICA3NTUsICA3NDQsICA3MzMsICA3MjMsICA3MTMsICA3MDMsICA2OTMsICA2ODQsICA2NzUsICA2NjYsICA2NTcsICA2NDksICA2NDEsICA2MzMsICA2MjUsCisgICAgNjE3LCAgNjA5LCAgNjAyLCAgNTk0LCAgNTg3LCAgNTgwLCAgNTczLCAgNTY3LCAgNTYwLCAgNTUzLCAgNTQ3LCAgNTQxLCAgNTM0LCAgNTI4LCAgNTIyLCAgNTE2LAorICAgIDUxMSwgIDUwNSwgIDQ5OSwgIDQ5NCwgIDQ4OCwgIDQ4MywgIDQ3NywgIDQ3MiwgIDQ2NywgIDQ2MiwgIDQ1NywgIDQ1MiwgIDQ0NywgIDQ0MiwgIDQzNywgIDQzMywKKyAgICA0MjgsICA0MjQsICA0MTksICA0MTUsICA0MTAsICA0MDYsICA0MDEsICAzOTcsICAzOTMsICAzODksICAzODUsICAzODEsICAzNzcsICAzNzMsICAzNjksICAzNjUsCisgICAgMzYxLCAgMzU3LCAgMzUzLCAgMzQ5LCAgMzQ2LCAgMzQyLCAgMzM4LCAgMzM1LCAgMzMxLCAgMzI4LCAgMzI0LCAgMzIxLCAgMzE3LCAgMzE0LCAgMzExLCAgMzA3LAorICAgIDMwNCwgIDMwMSwgIDI5NywgIDI5NCwgIDI5MSwgIDI4OCwgIDI4NSwgIDI4MSwgIDI3OCwgIDI3NSwgIDI3MiwgIDI2OSwgIDI2NiwgIDI2MywgIDI2MCwgIDI1NywKKyAgICAyNTUsICAyNTIsICAyNDksICAyNDYsICAyNDMsICAyNDAsICAyMzgsICAyMzUsICAyMzIsICAyMjksICAyMjcsICAyMjQsICAyMjEsICAyMTksICAyMTYsICAyMTQsCisgICAgMjExLCAgMjA4LCAgMjA2LCAgMjAzLCAgMjAxLCAgMTk4LCAgMTk2LCAgMTk0LCAgMTkxLCAgMTg5LCAgMTg2LCAgMTg0LCAgMTgxLCAgMTc5LCAgMTc3LCAgMTc0LAorICAgIDE3MiwgIDE3MCwgIDE2OCwgIDE2NSwgIDE2MywgIDE2MSwgIDE1OSwgIDE1NiwgIDE1NCwgIDE1MiwgIDE1MCwgIDE0OCwgIDE0NSwgIDE0MywgIDE0MSwgIDEzOSwKKyAgICAxMzcsICAxMzUsICAxMzMsICAxMzEsICAxMjksICAxMjcsICAxMjUsICAxMjMsICAxMjEsICAxMTksICAxMTcsICAxMTUsICAxMTMsICAxMTEsICAxMDksICAxMDcsCisgICAgMTA1LCAgMTAzLCAgMTAxLCAgIDk5LCAgIDk3LCAgIDk1LCAgIDkzLCAgIDkyLCAgIDkwLCAgIDg4LCAgIDg2LCAgIDg0LCAgIDgyLCAgIDgxLCAgIDc5LCAgIDc3LAorICAgIDc1LCAgIDczLCAgIDcyLCAgIDcwLCAgIDY4LCAgIDY2LCAgIDY1LCAgIDYzLCAgIDYxLCAgIDYwLCAgIDU4LCAgIDU2LCAgIDU1LCAgIDUzLCAgIDUxLCAgIDUwLAorICAgIDQ4LCAgIDQ2LCAgIDQ1LCAgIDQzLCAgIDQxLCAgIDQwLCAgIDM4LCAgIDM3LCAgIDM1LCAgIDMzLCAgIDMyLCAgIDMwLCAgIDI5LCAgIDI3LCAgIDI1LCAgIDI0LAorICAgIDIyLCAgIDIxLCAgIDE5LCAgIDE4LCAgIDE2LCAgIDE1LCAgIDEzLCAgIDEyLCAgIDEwLCAgICA5LCAgICA3LCAgICA2LCAgICA0LCAgICAzLCAgICAxLCAgIDEKK307CisKK3ZvaWQgdnA4X3N0YXJ0X2VuY29kZShCT09MX0NPREVSICpiciwgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBjaGFyICpzb3VyY2VfZW5kKQoreworCisgICAgYnItPmxvd3ZhbHVlICAgPSAwOworICAgIGJyLT5yYW5nZSAgICAgID0gMjU1OworICAgIGJyLT5jb3VudCAgICAgID0gLTI0OworICAgIGJyLT5idWZmZXIgICAgID0gc291cmNlOworICAgIGJyLT5idWZmZXJfZW5kID0gc291cmNlX2VuZDsKKyAgICBici0+cG9zICAgICAgICA9IDA7Cit9CisKK3ZvaWQgdnA4X3N0b3BfZW5jb2RlKEJPT0xfQ09ERVIgKmJyKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgIHZwOF9lbmNvZGVfYm9vbChiciwgMCwgMTI4KTsKK30KKworCit2b2lkIHZwOF9lbmNvZGVfdmFsdWUoQk9PTF9DT0RFUiAqYnIsIGludCBkYXRhLCBpbnQgYml0cykKK3sKKyAgICBpbnQgYml0OworCisgICAgZm9yIChiaXQgPSBiaXRzIC0gMTsgYml0ID49IDA7IGJpdC0tKQorICAgICAgICB2cDhfZW5jb2RlX2Jvb2woYnIsICgxICYgKGRhdGEgPj4gYml0KSksIDB4ODApOworCit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvYm9vbGh1ZmYuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9ib29saHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDkwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvYm9vbGh1ZmYuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgTW9kdWxlIFRpdGxlIDogICAgIGJvb2xodWZmLmgKKyoKKyogICBEZXNjcmlwdGlvbiAgOiAgICAgQm9vbCBDb2RlciBoZWFkZXIgZmlsZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fSU5DX0JPT0xIVUZGX0gKKyNkZWZpbmUgX19JTkNfQk9PTEhVRkZfSAorCisjaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgorI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBpbnQgbG93dmFsdWU7CisgICAgdW5zaWduZWQgaW50IHJhbmdlOworICAgIGludCBjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgcG9zOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfZW5kOworICAgIHN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbyAqZXJyb3I7CisKKyAgICAvKiBWYXJpYWJsZXMgdXNlZCB0byB0cmFjayBiaXQgY29zdHMgd2l0aG91dCBvdXRwdXRpbmcgdG8gdGhlIGJpdHN0cmVhbSAqLworICAgIHVuc2lnbmVkIGludCAgbWVhc3VyZV9jb3N0OworICAgIHVuc2lnbmVkIGxvbmcgYml0X2NvdW50ZXI7Cit9IEJPT0xfQ09ERVI7CisKK2V4dGVybiB2b2lkIHZwOF9zdGFydF9lbmNvZGUoQk9PTF9DT0RFUiAqYmMsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgY2hhciAqYnVmZmVyX2VuZCk7CisKK2V4dGVybiB2b2lkIHZwOF9lbmNvZGVfdmFsdWUoQk9PTF9DT0RFUiAqYnIsIGludCBkYXRhLCBpbnQgYml0cyk7CitleHRlcm4gdm9pZCB2cDhfc3RvcF9lbmNvZGUoQk9PTF9DT0RFUiAqYmMpOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCB2cDhfcHJvYl9jb3N0WzI1Nl07CisKKworREVDTEFSRV9BTElHTkVEKDE2LCBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciwgdnA4X25vcm1bMjU2XSk7CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfYnVmZmVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZweF9pbnRlcm5hbF9lcnJvcl9pbmZvICplcnJvcikKK3sKKyAgICBpZiAoc3RhcnQgKyBsZW4gPiBzdGFydCAmJiBzdGFydCArIGxlbiA8IGVuZCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgIlRydW5jYXRlZCBwYWNrZXQgb3IgY29ycnVwdCBwYXJ0aXRpb24gIik7CisKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIHZwOF9lbmNvZGVfYm9vbChCT09MX0NPREVSICpiciwgaW50IGJpdCwgaW50IHByb2JhYmlsaXR5KQoreworICAgIHVuc2lnbmVkIGludCBzcGxpdDsKKyAgICBpbnQgY291bnQgPSBici0+Y291bnQ7CisgICAgdW5zaWduZWQgaW50IHJhbmdlID0gYnItPnJhbmdlOworICAgIHVuc2lnbmVkIGludCBsb3d2YWx1ZSA9IGJyLT5sb3d2YWx1ZTsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgc2hpZnQ7CisKKyNpZmRlZiBFTlRST1BZX1NUQVRTCisjaWYgZGVmaW5lZChTRUNUSU9OQklUU19PVVRQVVQpCisKKyAgICBpZiAoYml0KQorICAgICAgICBTZWN0aW9uYml0c1thY3RpdmVfc2VjdGlvbl0gKz0gdnA4X3Byb2JfY29zdFsyNTUtcHJvYmFiaWxpdHldOworICAgIGVsc2UKKyAgICAgICAgU2VjdGlvbmJpdHNbYWN0aXZlX3NlY3Rpb25dICs9IHZwOF9wcm9iX2Nvc3RbcHJvYmFiaWxpdHldOworCisjZW5kaWYKKyNlbmRpZgorCisgICAgc3BsaXQgPSAxICsgKCgocmFuZ2UgLSAxKSAqIHByb2JhYmlsaXR5KSA+PiA4KTsKKworICAgIHJhbmdlID0gc3BsaXQ7CisKKyAgICBpZiAoYml0KQorICAgIHsKKyAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7CisgICAgICAgIHJhbmdlID0gYnItPnJhbmdlIC0gc3BsaXQ7CisgICAgfQorCisgICAgc2hpZnQgPSB2cDhfbm9ybVtyYW5nZV07CisKKyAgICByYW5nZSA8PD0gc2hpZnQ7CisgICAgY291bnQgKz0gc2hpZnQ7CisKKyAgICBpZiAoY291bnQgPj0gMCkKKyAgICB7CisgICAgICAgIGludCBvZmZzZXQgPSBzaGlmdCAtIGNvdW50OworCisgICAgICAgIGlmICgobG93dmFsdWUgPDwgKG9mZnNldCAtIDEpKSAmIDB4ODAwMDAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB4ID0gYnItPnBvcyAtIDE7CisKKyAgICAgICAgICAgIHdoaWxlICh4ID49IDAgJiYgYnItPmJ1ZmZlclt4XSA9PSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyLT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOworICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnItPmJ1ZmZlclt4XSArPSAxOworICAgICAgICB9CisKKyAgICAgICAgdmFsaWRhdGVfYnVmZmVyKGJyLT5idWZmZXIgKyBici0+cG9zLCAxLCBici0+YnVmZmVyX2VuZCwgYnItPmVycm9yKTsKKyAgICAgICAgYnItPmJ1ZmZlcltici0+cG9zKytdID0gKGxvd3ZhbHVlID4+ICgyNCAtIG9mZnNldCkpOworCisgICAgICAgIGxvd3ZhbHVlIDw8PSBvZmZzZXQ7CisgICAgICAgIHNoaWZ0ID0gY291bnQ7CisgICAgICAgIGxvd3ZhbHVlICY9IDB4ZmZmZmZmOworICAgICAgICBjb3VudCAtPSA4IDsKKyAgICB9CisKKyAgICBsb3d2YWx1ZSA8PD0gc2hpZnQ7CisgICAgYnItPmNvdW50ID0gY291bnQ7CisgICAgYnItPmxvd3ZhbHVlID0gbG93dmFsdWU7CisgICAgYnItPnJhbmdlID0gcmFuZ2U7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvZGN0LmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvZGN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9lbmNvZGVyL2RjdC5jCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2VuY29kZXIvZGN0LmMKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9kY3RfdmFsdWVfY29zdC5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2RjdF92YWx1ZV9jb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5Mjc2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9kY3RfdmFsdWVfY29zdC5oCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEdlbmVyYXRlZCBmaWxlLCBpbmNsdWRlZCBieSB0b2tlbml6ZS5jICAqLworLyogVmFsdWVzIGdlbmVyYXRlZCBieSBmaWxsX3ZhbHVlX3Rva2VucygpICovCisKK3N0YXRpYyBjb25zdCBzaG9ydCBkY3RfdmFsdWVfY29zdFsyMDQ4KjJdID0KK3sKKyAgICA4Mjg1LCA4Mjc3LCA4MjY3LCA4MjU5LCA4MjUzLCA4MjQ1LCA4MjI2LCA4MjE4LCA4MjEyLCA4MjA0LCA4MTk0LCA4MTg2LAorICAgIDgxODAsIDgxNzIsIDgxNTAsIDgxNDIsIDgxMzYsIDgxMjgsIDgxMTgsIDgxMTAsIDgxMDQsIDgwOTYsIDgwNzcsIDgwNjksCisgICAgODA2MywgODA1NSwgODA0NSwgODAzNywgODAzMSwgODAyMywgNzk5NywgNzk4OSwgNzk4MywgNzk3NSwgNzk2NSwgNzk1NywKKyAgICA3OTUxLCA3OTQzLCA3OTI0LCA3OTE2LCA3OTEwLCA3OTAyLCA3ODkyLCA3ODg0LCA3ODc4LCA3ODcwLCA3ODQ4LCA3ODQwLAorICAgIDc4MzQsIDc4MjYsIDc4MTYsIDc4MDgsIDc4MDIsIDc3OTQsIDc3NzUsIDc3NjcsIDc3NjEsIDc3NTMsIDc3NDMsIDc3MzUsCisgICAgNzcyOSwgNzcyMSwgNzkyMywgNzkxNSwgNzkwOSwgNzkwMSwgNzg5MSwgNzg4MywgNzg3NywgNzg2OSwgNzg1MCwgNzg0MiwKKyAgICA3ODM2LCA3ODI4LCA3ODE4LCA3ODEwLCA3ODA0LCA3Nzk2LCA3Nzc0LCA3NzY2LCA3NzYwLCA3NzUyLCA3NzQyLCA3NzM0LAorICAgIDc3MjgsIDc3MjAsIDc3MDEsIDc2OTMsIDc2ODcsIDc2NzksIDc2NjksIDc2NjEsIDc2NTUsIDc2NDcsIDc2MjEsIDc2MTMsCisgICAgNzYwNywgNzU5OSwgNzU4OSwgNzU4MSwgNzU3NSwgNzU2NywgNzU0OCwgNzU0MCwgNzUzNCwgNzUyNiwgNzUxNiwgNzUwOCwKKyAgICA3NTAyLCA3NDk0LCA3NDcyLCA3NDY0LCA3NDU4LCA3NDUwLCA3NDQwLCA3NDMyLCA3NDI2LCA3NDE4LCA3Mzk5LCA3MzkxLAorICAgIDczODUsIDczNzcsIDczNjcsIDczNTksIDczNTMsIDczNDUsIDc0NzksIDc0NzEsIDc0NjUsIDc0NTcsIDc0NDcsIDc0MzksCisgICAgNzQzMywgNzQyNSwgNzQwNiwgNzM5OCwgNzM5MiwgNzM4NCwgNzM3NCwgNzM2NiwgNzM2MCwgNzM1MiwgNzMzMCwgNzMyMiwKKyAgICA3MzE2LCA3MzA4LCA3Mjk4LCA3MjkwLCA3Mjg0LCA3Mjc2LCA3MjU3LCA3MjQ5LCA3MjQzLCA3MjM1LCA3MjI1LCA3MjE3LAorICAgIDcyMTEsIDcyMDMsIDcxNzcsIDcxNjksIDcxNjMsIDcxNTUsIDcxNDUsIDcxMzcsIDcxMzEsIDcxMjMsIDcxMDQsIDcwOTYsCisgICAgNzA5MCwgNzA4MiwgNzA3MiwgNzA2NCwgNzA1OCwgNzA1MCwgNzAyOCwgNzAyMCwgNzAxNCwgNzAwNiwgNjk5NiwgNjk4OCwKKyAgICA2OTgyLCA2OTc0LCA2OTU1LCA2OTQ3LCA2OTQxLCA2OTMzLCA2OTIzLCA2OTE1LCA2OTA5LCA2OTAxLCA3NjMyLCA3NjI0LAorICAgIDc2MTgsIDc2MTAsIDc2MDAsIDc1OTIsIDc1ODYsIDc1NzgsIDc1NTksIDc1NTEsIDc1NDUsIDc1MzcsIDc1MjcsIDc1MTksCisgICAgNzUxMywgNzUwNSwgNzQ4MywgNzQ3NSwgNzQ2OSwgNzQ2MSwgNzQ1MSwgNzQ0MywgNzQzNywgNzQyOSwgNzQxMCwgNzQwMiwKKyAgICA3Mzk2LCA3Mzg4LCA3Mzc4LCA3MzcwLCA3MzY0LCA3MzU2LCA3MzMwLCA3MzIyLCA3MzE2LCA3MzA4LCA3Mjk4LCA3MjkwLAorICAgIDcyODQsIDcyNzYsIDcyNTcsIDcyNDksIDcyNDMsIDcyMzUsIDcyMjUsIDcyMTcsIDcyMTEsIDcyMDMsIDcxODEsIDcxNzMsCisgICAgNzE2NywgNzE1OSwgNzE0OSwgNzE0MSwgNzEzNSwgNzEyNywgNzEwOCwgNzEwMCwgNzA5NCwgNzA4NiwgNzA3NiwgNzA2OCwKKyAgICA3MDYyLCA3MDU0LCA3MTg4LCA3MTgwLCA3MTc0LCA3MTY2LCA3MTU2LCA3MTQ4LCA3MTQyLCA3MTM0LCA3MTE1LCA3MTA3LAorICAgIDcxMDEsIDcwOTMsIDcwODMsIDcwNzUsIDcwNjksIDcwNjEsIDcwMzksIDcwMzEsIDcwMjUsIDcwMTcsIDcwMDcsIDY5OTksCisgICAgNjk5MywgNjk4NSwgNjk2NiwgNjk1OCwgNjk1MiwgNjk0NCwgNjkzNCwgNjkyNiwgNjkyMCwgNjkxMiwgNjg4NiwgNjg3OCwKKyAgICA2ODcyLCA2ODY0LCA2ODU0LCA2ODQ2LCA2ODQwLCA2ODMyLCA2ODEzLCA2ODA1LCA2Nzk5LCA2NzkxLCA2NzgxLCA2NzczLAorICAgIDY3NjcsIDY3NTksIDY3MzcsIDY3MjksIDY3MjMsIDY3MTUsIDY3MDUsIDY2OTcsIDY2OTEsIDY2ODMsIDY2NjQsIDY2NTYsCisgICAgNjY1MCwgNjY0MiwgNjYzMiwgNjYyNCwgNjYxOCwgNjYxMCwgNjgxMiwgNjgwNCwgNjc5OCwgNjc5MCwgNjc4MCwgNjc3MiwKKyAgICA2NzY2LCA2NzU4LCA2NzM5LCA2NzMxLCA2NzI1LCA2NzE3LCA2NzA3LCA2Njk5LCA2NjkzLCA2Njg1LCA2NjYzLCA2NjU1LAorICAgIDY2NDksIDY2NDEsIDY2MzEsIDY2MjMsIDY2MTcsIDY2MDksIDY1OTAsIDY1ODIsIDY1NzYsIDY1NjgsIDY1NTgsIDY1NTAsCisgICAgNjU0NCwgNjUzNiwgNjUxMCwgNjUwMiwgNjQ5NiwgNjQ4OCwgNjQ3OCwgNjQ3MCwgNjQ2NCwgNjQ1NiwgNjQzNywgNjQyOSwKKyAgICA2NDIzLCA2NDE1LCA2NDA1LCA2Mzk3LCA2MzkxLCA2MzgzLCA2MzYxLCA2MzUzLCA2MzQ3LCA2MzM5LCA2MzI5LCA2MzIxLAorICAgIDYzMTUsIDYzMDcsIDYyODgsIDYyODAsIDYyNzQsIDYyNjYsIDYyNTYsIDYyNDgsIDYyNDIsIDYyMzQsIDYzNjgsIDYzNjAsCisgICAgNjM1NCwgNjM0NiwgNjMzNiwgNjMyOCwgNjMyMiwgNjMxNCwgNjI5NSwgNjI4NywgNjI4MSwgNjI3MywgNjI2MywgNjI1NSwKKyAgICA2MjQ5LCA2MjQxLCA2MjE5LCA2MjExLCA2MjA1LCA2MTk3LCA2MTg3LCA2MTc5LCA2MTczLCA2MTY1LCA2MTQ2LCA2MTM4LAorICAgIDYxMzIsIDYxMjQsIDYxMTQsIDYxMDYsIDYxMDAsIDYwOTIsIDYwNjYsIDYwNTgsIDYwNTIsIDYwNDQsIDYwMzQsIDYwMjYsCisgICAgNjAyMCwgNjAxMiwgNTk5MywgNTk4NSwgNTk3OSwgNTk3MSwgNTk2MSwgNTk1MywgNTk0NywgNTkzOSwgNTkxNywgNTkwOSwKKyAgICA1OTAzLCA1ODk1LCA1ODg1LCA1ODc3LCA1ODcxLCA1ODYzLCA1ODQ0LCA1ODM2LCA1ODMwLCA1ODIyLCA1ODEyLCA1ODA0LAorICAgIDU3OTgsIDU3OTAsIDY2OTcsIDY2ODksIDY2ODMsIDY2NzUsIDY2NjUsIDY2NTcsIDY2NTEsIDY2NDMsIDY2MjQsIDY2MTYsCisgICAgNjYxMCwgNjYwMiwgNjU5MiwgNjU4NCwgNjU3OCwgNjU3MCwgNjU0OCwgNjU0MCwgNjUzNCwgNjUyNiwgNjUxNiwgNjUwOCwKKyAgICA2NTAyLCA2NDk0LCA2NDc1LCA2NDY3LCA2NDYxLCA2NDUzLCA2NDQzLCA2NDM1LCA2NDI5LCA2NDIxLCA2Mzk1LCA2Mzg3LAorICAgIDYzODEsIDYzNzMsIDYzNjMsIDYzNTUsIDYzNDksIDYzNDEsIDYzMjIsIDYzMTQsIDYzMDgsIDYzMDAsIDYyOTAsIDYyODIsCisgICAgNjI3NiwgNjI2OCwgNjI0NiwgNjIzOCwgNjIzMiwgNjIyNCwgNjIxNCwgNjIwNiwgNjIwMCwgNjE5MiwgNjE3MywgNjE2NSwKKyAgICA2MTU5LCA2MTUxLCA2MTQxLCA2MTMzLCA2MTI3LCA2MTE5LCA2MjUzLCA2MjQ1LCA2MjM5LCA2MjMxLCA2MjIxLCA2MjEzLAorICAgIDYyMDcsIDYxOTksIDYxODAsIDYxNzIsIDYxNjYsIDYxNTgsIDYxNDgsIDYxNDAsIDYxMzQsIDYxMjYsIDYxMDQsIDYwOTYsCisgICAgNjA5MCwgNjA4MiwgNjA3MiwgNjA2NCwgNjA1OCwgNjA1MCwgNjAzMSwgNjAyMywgNjAxNywgNjAwOSwgNTk5OSwgNTk5MSwKKyAgICA1OTg1LCA1OTc3LCA1OTUxLCA1OTQzLCA1OTM3LCA1OTI5LCA1OTE5LCA1OTExLCA1OTA1LCA1ODk3LCA1ODc4LCA1ODcwLAorICAgIDU4NjQsIDU4NTYsIDU4NDYsIDU4MzgsIDU4MzIsIDU4MjQsIDU4MDIsIDU3OTQsIDU3ODgsIDU3ODAsIDU3NzAsIDU3NjIsCisgICAgNTc1NiwgNTc0OCwgNTcyOSwgNTcyMSwgNTcxNSwgNTcwNywgNTY5NywgNTY4OSwgNTY4MywgNTY3NSwgNTg3NywgNTg2OSwKKyAgICA1ODYzLCA1ODU1LCA1ODQ1LCA1ODM3LCA1ODMxLCA1ODIzLCA1ODA0LCA1Nzk2LCA1NzkwLCA1NzgyLCA1NzcyLCA1NzY0LAorICAgIDU3NTgsIDU3NTAsIDU3MjgsIDU3MjAsIDU3MTQsIDU3MDYsIDU2OTYsIDU2ODgsIDU2ODIsIDU2NzQsIDU2NTUsIDU2NDcsCisgICAgNTY0MSwgNTYzMywgNTYyMywgNTYxNSwgNTYwOSwgNTYwMSwgNTU3NSwgNTU2NywgNTU2MSwgNTU1MywgNTU0MywgNTUzNSwKKyAgICA1NTI5LCA1NTIxLCA1NTAyLCA1NDk0LCA1NDg4LCA1NDgwLCA1NDcwLCA1NDYyLCA1NDU2LCA1NDQ4LCA1NDI2LCA1NDE4LAorICAgIDU0MTIsIDU0MDQsIDUzOTQsIDUzODYsIDUzODAsIDUzNzIsIDUzNTMsIDUzNDUsIDUzMzksIDUzMzEsIDUzMjEsIDUzMTMsCisgICAgNTMwNywgNTI5OSwgNTQzMywgNTQyNSwgNTQxOSwgNTQxMSwgNTQwMSwgNTM5MywgNTM4NywgNTM3OSwgNTM2MCwgNTM1MiwKKyAgICA1MzQ2LCA1MzM4LCA1MzI4LCA1MzIwLCA1MzE0LCA1MzA2LCA1Mjg0LCA1Mjc2LCA1MjcwLCA1MjYyLCA1MjUyLCA1MjQ0LAorICAgIDUyMzgsIDUyMzAsIDUyMTEsIDUyMDMsIDUxOTcsIDUxODksIDUxNzksIDUxNzEsIDUxNjUsIDUxNTcsIDUxMzEsIDUxMjMsCisgICAgNTExNywgNTEwOSwgNTA5OSwgNTA5MSwgNTA4NSwgNTA3NywgNTA1OCwgNTA1MCwgNTA0NCwgNTAzNiwgNTAyNiwgNTAxOCwKKyAgICA1MDEyLCA1MDA0LCA0OTgyLCA0OTc0LCA0OTY4LCA0OTYwLCA0OTUwLCA0OTQyLCA0OTM2LCA0OTI4LCA0OTA5LCA0OTAxLAorICAgIDQ4OTUsIDQ4ODcsIDQ4NzcsIDQ4NjksIDQ4NjMsIDQ4NTUsIDU1ODYsIDU1NzgsIDU1NzIsIDU1NjQsIDU1NTQsIDU1NDYsCisgICAgNTU0MCwgNTUzMiwgNTUxMywgNTUwNSwgNTQ5OSwgNTQ5MSwgNTQ4MSwgNTQ3MywgNTQ2NywgNTQ1OSwgNTQzNywgNTQyOSwKKyAgICA1NDIzLCA1NDE1LCA1NDA1LCA1Mzk3LCA1MzkxLCA1MzgzLCA1MzY0LCA1MzU2LCA1MzUwLCA1MzQyLCA1MzMyLCA1MzI0LAorICAgIDUzMTgsIDUzMTAsIDUyODQsIDUyNzYsIDUyNzAsIDUyNjIsIDUyNTIsIDUyNDQsIDUyMzgsIDUyMzAsIDUyMTEsIDUyMDMsCisgICAgNTE5NywgNTE4OSwgNTE3OSwgNTE3MSwgNTE2NSwgNTE1NywgNTEzNSwgNTEyNywgNTEyMSwgNTExMywgNTEwMywgNTA5NSwKKyAgICA1MDg5LCA1MDgxLCA1MDYyLCA1MDU0LCA1MDQ4LCA1MDQwLCA1MDMwLCA1MDIyLCA1MDE2LCA1MDA4LCA1MTQyLCA1MTM0LAorICAgIDUxMjgsIDUxMjAsIDUxMTAsIDUxMDIsIDUwOTYsIDUwODgsIDUwNjksIDUwNjEsIDUwNTUsIDUwNDcsIDUwMzcsIDUwMjksCisgICAgNTAyMywgNTAxNSwgNDk5MywgNDk4NSwgNDk3OSwgNDk3MSwgNDk2MSwgNDk1MywgNDk0NywgNDkzOSwgNDkyMCwgNDkxMiwKKyAgICA0OTA2LCA0ODk4LCA0ODg4LCA0ODgwLCA0ODc0LCA0ODY2LCA0ODQwLCA0ODMyLCA0ODI2LCA0ODE4LCA0ODA4LCA0ODAwLAorICAgIDQ3OTQsIDQ3ODYsIDQ3NjcsIDQ3NTksIDQ3NTMsIDQ3NDUsIDQ3MzUsIDQ3MjcsIDQ3MjEsIDQ3MTMsIDQ2OTEsIDQ2ODMsCisgICAgNDY3NywgNDY2OSwgNDY1OSwgNDY1MSwgNDY0NSwgNDYzNywgNDYxOCwgNDYxMCwgNDYwNCwgNDU5NiwgNDU4NiwgNDU3OCwKKyAgICA0NTcyLCA0NTY0LCA0NzY2LCA0NzU4LCA0NzUyLCA0NzQ0LCA0NzM0LCA0NzI2LCA0NzIwLCA0NzEyLCA0NjkzLCA0Njg1LAorICAgIDQ2NzksIDQ2NzEsIDQ2NjEsIDQ2NTMsIDQ2NDcsIDQ2MzksIDQ2MTcsIDQ2MDksIDQ2MDMsIDQ1OTUsIDQ1ODUsIDQ1NzcsCisgICAgNDU3MSwgNDU2MywgNDU0NCwgNDUzNiwgNDUzMCwgNDUyMiwgNDUxMiwgNDUwNCwgNDQ5OCwgNDQ5MCwgNDQ2NCwgNDQ1NiwKKyAgICA0NDUwLCA0NDQyLCA0NDMyLCA0NDI0LCA0NDE4LCA0NDEwLCA0MzkxLCA0MzgzLCA0Mzc3LCA0MzY5LCA0MzU5LCA0MzUxLAorICAgIDQzNDUsIDQzMzcsIDQzMTUsIDQzMDcsIDQzMDEsIDQyOTMsIDQyODMsIDQyNzUsIDQyNjksIDQyNjEsIDQyNDIsIDQyMzQsCisgICAgNDIyOCwgNDIyMCwgNDIxMCwgNDIwMiwgNDE5NiwgNDE4OCwgNDMyMiwgNDMxNCwgNDMwOCwgNDMwMCwgNDI5MCwgNDI4MiwKKyAgICA0Mjc2LCA0MjY4LCA0MjQ5LCA0MjQxLCA0MjM1LCA0MjI3LCA0MjE3LCA0MjA5LCA0MjAzLCA0MTk1LCA0MTczLCA0MTY1LAorICAgIDQxNTksIDQxNTEsIDQxNDEsIDQxMzMsIDQxMjcsIDQxMTksIDQxMDAsIDQwOTIsIDQwODYsIDQwNzgsIDQwNjgsIDQwNjAsCisgICAgNDA1NCwgNDA0NiwgNDAyMCwgNDAxMiwgNDAwNiwgMzk5OCwgMzk4OCwgMzk4MCwgMzk3NCwgMzk2NiwgMzk0NywgMzkzOSwKKyAgICAzOTMzLCAzOTI1LCAzOTE1LCAzOTA3LCAzOTAxLCAzODkzLCAzODcxLCAzODYzLCAzODU3LCAzODQ5LCAzODM5LCAzODMxLAorICAgIDM4MjUsIDM4MTcsIDM3OTgsIDM3OTAsIDM3ODQsIDM3NzYsIDM3NjYsIDM3NTgsIDM3NTIsIDM3NDQsIDY2OTcsIDY2ODksCisgICAgNjY4MywgNjY3NSwgNjY2NSwgNjY1NywgNjY1MSwgNjY0MywgNjYyNCwgNjYxNiwgNjYxMCwgNjYwMiwgNjU5MiwgNjU4NCwKKyAgICA2NTc4LCA2NTcwLCA2NTQ4LCA2NTQwLCA2NTM0LCA2NTI2LCA2NTE2LCA2NTA4LCA2NTAyLCA2NDk0LCA2NDc1LCA2NDY3LAorICAgIDY0NjEsIDY0NTMsIDY0NDMsIDY0MzUsIDY0MjksIDY0MjEsIDYzOTUsIDYzODcsIDYzODEsIDYzNzMsIDYzNjMsIDYzNTUsCisgICAgNjM0OSwgNjM0MSwgNjMyMiwgNjMxNCwgNjMwOCwgNjMwMCwgNjI5MCwgNjI4MiwgNjI3NiwgNjI2OCwgNjI0NiwgNjIzOCwKKyAgICA2MjMyLCA2MjI0LCA2MjE0LCA2MjA2LCA2MjAwLCA2MTkyLCA2MTczLCA2MTY1LCA2MTU5LCA2MTUxLCA2MTQxLCA2MTMzLAorICAgIDYxMjcsIDYxMTksIDYyNTMsIDYyNDUsIDYyMzksIDYyMzEsIDYyMjEsIDYyMTMsIDYyMDcsIDYxOTksIDYxODAsIDYxNzIsCisgICAgNjE2NiwgNjE1OCwgNjE0OCwgNjE0MCwgNjEzNCwgNjEyNiwgNjEwNCwgNjA5NiwgNjA5MCwgNjA4MiwgNjA3MiwgNjA2NCwKKyAgICA2MDU4LCA2MDUwLCA2MDMxLCA2MDIzLCA2MDE3LCA2MDA5LCA1OTk5LCA1OTkxLCA1OTg1LCA1OTc3LCA1OTUxLCA1OTQzLAorICAgIDU5MzcsIDU5MjksIDU5MTksIDU5MTEsIDU5MDUsIDU4OTcsIDU4NzgsIDU4NzAsIDU4NjQsIDU4NTYsIDU4NDYsIDU4MzgsCisgICAgNTgzMiwgNTgyNCwgNTgwMiwgNTc5NCwgNTc4OCwgNTc4MCwgNTc3MCwgNTc2MiwgNTc1NiwgNTc0OCwgNTcyOSwgNTcyMSwKKyAgICA1NzE1LCA1NzA3LCA1Njk3LCA1Njg5LCA1NjgzLCA1Njc1LCA1ODc3LCA1ODY5LCA1ODYzLCA1ODU1LCA1ODQ1LCA1ODM3LAorICAgIDU4MzEsIDU4MjMsIDU4MDQsIDU3OTYsIDU3OTAsIDU3ODIsIDU3NzIsIDU3NjQsIDU3NTgsIDU3NTAsIDU3MjgsIDU3MjAsCisgICAgNTcxNCwgNTcwNiwgNTY5NiwgNTY4OCwgNTY4MiwgNTY3NCwgNTY1NSwgNTY0NywgNTY0MSwgNTYzMywgNTYyMywgNTYxNSwKKyAgICA1NjA5LCA1NjAxLCA1NTc1LCA1NTY3LCA1NTYxLCA1NTUzLCA1NTQzLCA1NTM1LCA1NTI5LCA1NTIxLCA1NTAyLCA1NDk0LAorICAgIDU0ODgsIDU0ODAsIDU0NzAsIDU0NjIsIDU0NTYsIDU0NDgsIDU0MjYsIDU0MTgsIDU0MTIsIDU0MDQsIDUzOTQsIDUzODYsCisgICAgNTM4MCwgNTM3MiwgNTM1MywgNTM0NSwgNTMzOSwgNTMzMSwgNTMyMSwgNTMxMywgNTMwNywgNTI5OSwgNTQzMywgNTQyNSwKKyAgICA1NDE5LCA1NDExLCA1NDAxLCA1MzkzLCA1Mzg3LCA1Mzc5LCA1MzYwLCA1MzUyLCA1MzQ2LCA1MzM4LCA1MzI4LCA1MzIwLAorICAgIDUzMTQsIDUzMDYsIDUyODQsIDUyNzYsIDUyNzAsIDUyNjIsIDUyNTIsIDUyNDQsIDUyMzgsIDUyMzAsIDUyMTEsIDUyMDMsCisgICAgNTE5NywgNTE4OSwgNTE3OSwgNTE3MSwgNTE2NSwgNTE1NywgNTEzMSwgNTEyMywgNTExNywgNTEwOSwgNTA5OSwgNTA5MSwKKyAgICA1MDg1LCA1MDc3LCA1MDU4LCA1MDUwLCA1MDQ0LCA1MDM2LCA1MDI2LCA1MDE4LCA1MDEyLCA1MDA0LCA0OTgyLCA0OTc0LAorICAgIDQ5NjgsIDQ5NjAsIDQ5NTAsIDQ5NDIsIDQ5MzYsIDQ5MjgsIDQ5MDksIDQ5MDEsIDQ4OTUsIDQ4ODcsIDQ4NzcsIDQ4NjksCisgICAgNDg2MywgNDg1NSwgNTU4NiwgNTU3OCwgNTU3MiwgNTU2NCwgNTU1NCwgNTU0NiwgNTU0MCwgNTUzMiwgNTUxMywgNTUwNSwKKyAgICA1NDk5LCA1NDkxLCA1NDgxLCA1NDczLCA1NDY3LCA1NDU5LCA1NDM3LCA1NDI5LCA1NDIzLCA1NDE1LCA1NDA1LCA1Mzk3LAorICAgIDUzOTEsIDUzODMsIDUzNjQsIDUzNTYsIDUzNTAsIDUzNDIsIDUzMzIsIDUzMjQsIDUzMTgsIDUzMTAsIDUyODQsIDUyNzYsCisgICAgNTI3MCwgNTI2MiwgNTI1MiwgNTI0NCwgNTIzOCwgNTIzMCwgNTIxMSwgNTIwMywgNTE5NywgNTE4OSwgNTE3OSwgNTE3MSwKKyAgICA1MTY1LCA1MTU3LCA1MTM1LCA1MTI3LCA1MTIxLCA1MTEzLCA1MTAzLCA1MDk1LCA1MDg5LCA1MDgxLCA1MDYyLCA1MDU0LAorICAgIDUwNDgsIDUwNDAsIDUwMzAsIDUwMjIsIDUwMTYsIDUwMDgsIDUxNDIsIDUxMzQsIDUxMjgsIDUxMjAsIDUxMTAsIDUxMDIsCisgICAgNTA5NiwgNTA4OCwgNTA2OSwgNTA2MSwgNTA1NSwgNTA0NywgNTAzNywgNTAyOSwgNTAyMywgNTAxNSwgNDk5MywgNDk4NSwKKyAgICA0OTc5LCA0OTcxLCA0OTYxLCA0OTUzLCA0OTQ3LCA0OTM5LCA0OTIwLCA0OTEyLCA0OTA2LCA0ODk4LCA0ODg4LCA0ODgwLAorICAgIDQ4NzQsIDQ4NjYsIDQ4NDAsIDQ4MzIsIDQ4MjYsIDQ4MTgsIDQ4MDgsIDQ4MDAsIDQ3OTQsIDQ3ODYsIDQ3NjcsIDQ3NTksCisgICAgNDc1MywgNDc0NSwgNDczNSwgNDcyNywgNDcyMSwgNDcxMywgNDY5MSwgNDY4MywgNDY3NywgNDY2OSwgNDY1OSwgNDY1MSwKKyAgICA0NjQ1LCA0NjM3LCA0NjE4LCA0NjEwLCA0NjA0LCA0NTk2LCA0NTg2LCA0NTc4LCA0NTcyLCA0NTY0LCA0NzY2LCA0NzU4LAorICAgIDQ3NTIsIDQ3NDQsIDQ3MzQsIDQ3MjYsIDQ3MjAsIDQ3MTIsIDQ2OTMsIDQ2ODUsIDQ2NzksIDQ2NzEsIDQ2NjEsIDQ2NTMsCisgICAgNDY0NywgNDYzOSwgNDYxNywgNDYwOSwgNDYwMywgNDU5NSwgNDU4NSwgNDU3NywgNDU3MSwgNDU2MywgNDU0NCwgNDUzNiwKKyAgICA0NTMwLCA0NTIyLCA0NTEyLCA0NTA0LCA0NDk4LCA0NDkwLCA0NDY0LCA0NDU2LCA0NDUwLCA0NDQyLCA0NDMyLCA0NDI0LAorICAgIDQ0MTgsIDQ0MTAsIDQzOTEsIDQzODMsIDQzNzcsIDQzNjksIDQzNTksIDQzNTEsIDQzNDUsIDQzMzcsIDQzMTUsIDQzMDcsCisgICAgNDMwMSwgNDI5MywgNDI4MywgNDI3NSwgNDI2OSwgNDI2MSwgNDI0MiwgNDIzNCwgNDIyOCwgNDIyMCwgNDIxMCwgNDIwMiwKKyAgICA0MTk2LCA0MTg4LCA0MzIyLCA0MzE0LCA0MzA4LCA0MzAwLCA0MjkwLCA0MjgyLCA0Mjc2LCA0MjY4LCA0MjQ5LCA0MjQxLAorICAgIDQyMzUsIDQyMjcsIDQyMTcsIDQyMDksIDQyMDMsIDQxOTUsIDQxNzMsIDQxNjUsIDQxNTksIDQxNTEsIDQxNDEsIDQxMzMsCisgICAgNDEyNywgNDExOSwgNDEwMCwgNDA5MiwgNDA4NiwgNDA3OCwgNDA2OCwgNDA2MCwgNDA1NCwgNDA0NiwgNDAyMCwgNDAxMiwKKyAgICA0MDA2LCAzOTk4LCAzOTg4LCAzOTgwLCAzOTc0LCAzOTY2LCAzOTQ3LCAzOTM5LCAzOTMzLCAzOTI1LCAzOTE1LCAzOTA3LAorICAgIDM5MDEsIDM4OTMsIDM4NzEsIDM4NjMsIDM4NTcsIDM4NDksIDM4MzksIDM4MzEsIDM4MjUsIDM4MTcsIDM3OTgsIDM3OTAsCisgICAgMzc4NCwgMzc3NiwgMzc2NiwgMzc1OCwgMzc1MiwgMzc0NCwgNDY1MSwgNDY0MywgNDYzNywgNDYyOSwgNDYxOSwgNDYxMSwKKyAgICA0NjA1LCA0NTk3LCA0NTc4LCA0NTcwLCA0NTY0LCA0NTU2LCA0NTQ2LCA0NTM4LCA0NTMyLCA0NTI0LCA0NTAyLCA0NDk0LAorICAgIDQ0ODgsIDQ0ODAsIDQ0NzAsIDQ0NjIsIDQ0NTYsIDQ0NDgsIDQ0MjksIDQ0MjEsIDQ0MTUsIDQ0MDcsIDQzOTcsIDQzODksCisgICAgNDM4MywgNDM3NSwgNDM0OSwgNDM0MSwgNDMzNSwgNDMyNywgNDMxNywgNDMwOSwgNDMwMywgNDI5NSwgNDI3NiwgNDI2OCwKKyAgICA0MjYyLCA0MjU0LCA0MjQ0LCA0MjM2LCA0MjMwLCA0MjIyLCA0MjAwLCA0MTkyLCA0MTg2LCA0MTc4LCA0MTY4LCA0MTYwLAorICAgIDQxNTQsIDQxNDYsIDQxMjcsIDQxMTksIDQxMTMsIDQxMDUsIDQwOTUsIDQwODcsIDQwODEsIDQwNzMsIDQyMDcsIDQxOTksCisgICAgNDE5MywgNDE4NSwgNDE3NSwgNDE2NywgNDE2MSwgNDE1MywgNDEzNCwgNDEyNiwgNDEyMCwgNDExMiwgNDEwMiwgNDA5NCwKKyAgICA0MDg4LCA0MDgwLCA0MDU4LCA0MDUwLCA0MDQ0LCA0MDM2LCA0MDI2LCA0MDE4LCA0MDEyLCA0MDA0LCAzOTg1LCAzOTc3LAorICAgIDM5NzEsIDM5NjMsIDM5NTMsIDM5NDUsIDM5MzksIDM5MzEsIDM5MDUsIDM4OTcsIDM4OTEsIDM4ODMsIDM4NzMsIDM4NjUsCisgICAgMzg1OSwgMzg1MSwgMzgzMiwgMzgyNCwgMzgxOCwgMzgxMCwgMzgwMCwgMzc5MiwgMzc4NiwgMzc3OCwgMzc1NiwgMzc0OCwKKyAgICAzNzQyLCAzNzM0LCAzNzI0LCAzNzE2LCAzNzEwLCAzNzAyLCAzNjgzLCAzNjc1LCAzNjY5LCAzNjYxLCAzNjUxLCAzNjQzLAorICAgIDM2MzcsIDM2MjksIDM4MzEsIDM4MjMsIDM4MTcsIDM4MDksIDM3OTksIDM3OTEsIDM3ODUsIDM3NzcsIDM3NTgsIDM3NTAsCisgICAgMzc0NCwgMzczNiwgMzcyNiwgMzcxOCwgMzcxMiwgMzcwNCwgMzY4MiwgMzY3NCwgMzY2OCwgMzY2MCwgMzY1MCwgMzY0MiwKKyAgICAzNjM2LCAzNjI4LCAzNjA5LCAzNjAxLCAzNTk1LCAzNTg3LCAzNTc3LCAzNTY5LCAzNTYzLCAzNTU1LCAzNTI5LCAzNTIxLAorICAgIDM1MTUsIDM1MDcsIDM0OTcsIDM0ODksIDM0ODMsIDM0NzUsIDM0NTYsIDM0NDgsIDM0NDIsIDM0MzQsIDM0MjQsIDM0MTYsCisgICAgMzQxMCwgMzQwMiwgMzM4MCwgMzM3MiwgMzM2NiwgMzM1OCwgMzM0OCwgMzM0MCwgMzMzNCwgMzMyNiwgMzMwNywgMzI5OSwKKyAgICAzMjkzLCAzMjg1LCAzMjc1LCAzMjY3LCAzMjYxLCAzMjUzLCAzMzg3LCAzMzc5LCAzMzczLCAzMzY1LCAzMzU1LCAzMzQ3LAorICAgIDMzNDEsIDMzMzMsIDMzMTQsIDMzMDYsIDMzMDAsIDMyOTIsIDMyODIsIDMyNzQsIDMyNjgsIDMyNjAsIDMyMzgsIDMyMzAsCisgICAgMzIyNCwgMzIxNiwgMzIwNiwgMzE5OCwgMzE5MiwgMzE4NCwgMzE2NSwgMzE1NywgMzE1MSwgMzE0MywgMzEzMywgMzEyNSwKKyAgICAzMTE5LCAzMTExLCAzMDg1LCAzMDc3LCAzMDcxLCAzMDYzLCAzMDUzLCAzMDQ1LCAzMDM5LCAzMDMxLCAzMDEyLCAzMDA0LAorICAgIDI5OTgsIDI5OTAsIDI5ODAsIDI5NzIsIDI5NjYsIDI5NTgsIDI5MzYsIDI5MjgsIDI5MjIsIDI5MTQsIDI5MDQsIDI4OTYsCisgICAgMjg5MCwgMjg4MiwgMjg2MywgMjg1NSwgMjg0OSwgMjg0MSwgMjgzMSwgMjgyMywgMjgxNywgMjgwOSwgMzU0MCwgMzUzMiwKKyAgICAzNTI2LCAzNTE4LCAzNTA4LCAzNTAwLCAzNDk0LCAzNDg2LCAzNDY3LCAzNDU5LCAzNDUzLCAzNDQ1LCAzNDM1LCAzNDI3LAorICAgIDM0MjEsIDM0MTMsIDMzOTEsIDMzODMsIDMzNzcsIDMzNjksIDMzNTksIDMzNTEsIDMzNDUsIDMzMzcsIDMzMTgsIDMzMTAsCisgICAgMzMwNCwgMzI5NiwgMzI4NiwgMzI3OCwgMzI3MiwgMzI2NCwgMzIzOCwgMzIzMCwgMzIyNCwgMzIxNiwgMzIwNiwgMzE5OCwKKyAgICAzMTkyLCAzMTg0LCAzMTY1LCAzMTU3LCAzMTUxLCAzMTQzLCAzMTMzLCAzMTI1LCAzMTE5LCAzMTExLCAzMDg5LCAzMDgxLAorICAgIDMwNzUsIDMwNjcsIDMwNTcsIDMwNDksIDMwNDMsIDMwMzUsIDMwMTYsIDMwMDgsIDMwMDIsIDI5OTQsIDI5ODQsIDI5NzYsCisgICAgMjk3MCwgMjk2MiwgMzA5NiwgMzA4OCwgMzA4MiwgMzA3NCwgMzA2NCwgMzA1NiwgMzA1MCwgMzA0MiwgMzAyMywgMzAxNSwKKyAgICAzMDA5LCAzMDAxLCAyOTkxLCAyOTgzLCAyOTc3LCAyOTY5LCAyOTQ3LCAyOTM5LCAyOTMzLCAyOTI1LCAyOTE1LCAyOTA3LAorICAgIDI5MDEsIDI4OTMsIDI4NzQsIDI4NjYsIDI4NjAsIDI4NTIsIDI4NDIsIDI4MzQsIDI4MjgsIDI4MjAsIDI3OTQsIDI3ODYsCisgICAgMjc4MCwgMjc3MiwgMjc2MiwgMjc1NCwgMjc0OCwgMjc0MCwgMjcyMSwgMjcxMywgMjcwNywgMjY5OSwgMjY4OSwgMjY4MSwKKyAgICAyNjc1LCAyNjY3LCAyNjQ1LCAyNjM3LCAyNjMxLCAyNjIzLCAyNjEzLCAyNjA1LCAyNTk5LCAyNTkxLCAyNTcyLCAyNTY0LAorICAgIDI1NTgsIDI1NTAsIDI1NDAsIDI1MzIsIDI1MjYsIDI1MTgsIDI3MjAsIDI3MTIsIDI3MDYsIDI2OTgsIDI2ODgsIDI2ODAsCisgICAgMjY3NCwgMjY2NiwgMjY0NywgMjYzOSwgMjYzMywgMjYyNSwgMjYxNSwgMjYwNywgMjYwMSwgMjU5MywgMjU3MSwgMjU2MywKKyAgICAyNTU3LCAyNTQ5LCAyNTM5LCAyNTMxLCAyNTI1LCAyNTE3LCAyNDk4LCAyNDkwLCAyNDg0LCAyNDc2LCAyNDY2LCAyNDU4LAorICAgIDI0NTIsIDI0NDQsIDI0MTgsIDI0MTAsIDI0MDQsIDIzOTYsIDIzODYsIDIzNzgsIDIzNzIsIDIzNjQsIDIzNDUsIDIzMzcsCisgICAgMjMzMSwgMjMyMywgMjMxMywgMjMwNSwgMjI5OSwgMjI5MSwgMjI2OSwgMjI2MSwgMjI1NSwgMjI0NywgMjIzNywgMjIyOSwKKyAgICAyMjIzLCAyMjE1LCAyMTk2LCAyMTg4LCAyMTgyLCAyMTc0LCAyMTY0LCAyMTU2LCAyMTUwLCAyMTQyLCAyMjc2LCAyMjY4LAorICAgIDIyNjIsIDIyNTQsIDIyNDQsIDIyMzYsIDIyMzAsIDIyMjIsIDIyMDMsIDIxOTUsIDIxODksIDIxODEsIDIxNzEsIDIxNjMsCisgICAgMjE1NywgMjE0OSwgMjEyNywgMjExOSwgMjExMywgMjEwNSwgMjA5NSwgMjA4NywgMjA4MSwgMjA3MywgMjA1NCwgMjA0NiwKKyAgICAyMDQwLCAyMDMyLCAyMDIyLCAyMDE0LCAyMDA4LCAyMDAwLCAxOTc0LCAxOTY2LCAxOTYwLCAxOTUyLCAxOTQyLCAxOTM0LAorICAgIDE5MjgsIDE5MjAsIDE5MDEsIDE4OTMsIDE4ODcsIDE4NzksIDE4NjksIDE4NjEsIDE4NTUsIDE4NDcsIDE4MjUsIDE4MTcsCisgICAgMTgxMSwgMTgwMywgMTc5MywgMTc4NSwgMTc3OSwgMTc3MSwgMTc1MiwgMTc0NCwgMTczOCwgMTczMCwgMTcyMCwgMTcxMiwKKyAgICAxNzA2LCAxNjk4LCAxODk3LCAxODgzLCAxODYwLCAxODQ2LCAxODE5LCAxODA1LCAxNzgyLCAxNzY4LCAxNzIzLCAxNzA5LAorICAgIDE2ODYsIDE2NzIsIDE2NDUsIDE2MzEsIDE2MDgsIDE1OTQsIDE1NzQsIDE1NjAsIDE1MzcsIDE1MjMsIDE0OTYsIDE0ODIsCisgICAgMTQ1OSwgMTQ0NSwgMTQwMCwgMTM4NiwgMTM2MywgMTM0OSwgMTMyMiwgMTMwOCwgMTI4NSwgMTI3MSwgMTYwOCwgMTU2NSwKKyAgICAxNTM1LCAxNDkyLCAxNDQ2LCAxNDAzLCAxMzczLCAxMzMwLCAxMzEyLCAxMjY5LCAxMjM5LCAxMTk2LCAxMTUwLCAxMTA3LAorICAgIDEwNzcsIDEwMzQsIDEyOTEsIDEyMTgsIDExNzEsIDEwOTgsIDEwMTUsIDk0MiwgODk1LCA4MjIsIDk1MywgODUwLAorICAgIDcyOSwgNjI2LCA2MTgsIDQzMSwgMjU3LCAyNTcsIDI1NywgMjU3LCAwLCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgNDI5LCA2MTYsIDYyNCwgNzI3LCA4NDgsIDk1MSwgODIwLCA4OTMsIDk0MCwgMTAxMywgMTA5NiwKKyAgICAxMTY5LCAxMjE2LCAxMjg5LCAxMDMyLCAxMDc1LCAxMTA1LCAxMTQ4LCAxMTk0LCAxMjM3LCAxMjY3LCAxMzEwLCAxMzI4LAorICAgIDEzNzEsIDE0MDEsIDE0NDQsIDE0OTAsIDE1MzMsIDE1NjMsIDE2MDYsIDEyNjksIDEyODMsIDEzMDYsIDEzMjAsIDEzNDcsCisgICAgMTM2MSwgMTM4NCwgMTM5OCwgMTQ0MywgMTQ1NywgMTQ4MCwgMTQ5NCwgMTUyMSwgMTUzNSwgMTU1OCwgMTU3MiwgMTU5MiwKKyAgICAxNjA2LCAxNjI5LCAxNjQzLCAxNjcwLCAxNjg0LCAxNzA3LCAxNzIxLCAxNzY2LCAxNzgwLCAxODAzLCAxODE3LCAxODQ0LAorICAgIDE4NTgsIDE4ODEsIDE4OTUsIDE2OTYsIDE3MDQsIDE3MTAsIDE3MTgsIDE3MjgsIDE3MzYsIDE3NDIsIDE3NTAsIDE3NjksCisgICAgMTc3NywgMTc4MywgMTc5MSwgMTgwMSwgMTgwOSwgMTgxNSwgMTgyMywgMTg0NSwgMTg1MywgMTg1OSwgMTg2NywgMTg3NywKKyAgICAxODg1LCAxODkxLCAxODk5LCAxOTE4LCAxOTI2LCAxOTMyLCAxOTQwLCAxOTUwLCAxOTU4LCAxOTY0LCAxOTcyLCAxOTk4LAorICAgIDIwMDYsIDIwMTIsIDIwMjAsIDIwMzAsIDIwMzgsIDIwNDQsIDIwNTIsIDIwNzEsIDIwNzksIDIwODUsIDIwOTMsIDIxMDMsCisgICAgMjExMSwgMjExNywgMjEyNSwgMjE0NywgMjE1NSwgMjE2MSwgMjE2OSwgMjE3OSwgMjE4NywgMjE5MywgMjIwMSwgMjIyMCwKKyAgICAyMjI4LCAyMjM0LCAyMjQyLCAyMjUyLCAyMjYwLCAyMjY2LCAyMjc0LCAyMTQwLCAyMTQ4LCAyMTU0LCAyMTYyLCAyMTcyLAorICAgIDIxODAsIDIxODYsIDIxOTQsIDIyMTMsIDIyMjEsIDIyMjcsIDIyMzUsIDIyNDUsIDIyNTMsIDIyNTksIDIyNjcsIDIyODksCisgICAgMjI5NywgMjMwMywgMjMxMSwgMjMyMSwgMjMyOSwgMjMzNSwgMjM0MywgMjM2MiwgMjM3MCwgMjM3NiwgMjM4NCwgMjM5NCwKKyAgICAyNDAyLCAyNDA4LCAyNDE2LCAyNDQyLCAyNDUwLCAyNDU2LCAyNDY0LCAyNDc0LCAyNDgyLCAyNDg4LCAyNDk2LCAyNTE1LAorICAgIDI1MjMsIDI1MjksIDI1MzcsIDI1NDcsIDI1NTUsIDI1NjEsIDI1NjksIDI1OTEsIDI1OTksIDI2MDUsIDI2MTMsIDI2MjMsCisgICAgMjYzMSwgMjYzNywgMjY0NSwgMjY2NCwgMjY3MiwgMjY3OCwgMjY4NiwgMjY5NiwgMjcwNCwgMjcxMCwgMjcxOCwgMjUxNiwKKyAgICAyNTI0LCAyNTMwLCAyNTM4LCAyNTQ4LCAyNTU2LCAyNTYyLCAyNTcwLCAyNTg5LCAyNTk3LCAyNjAzLCAyNjExLCAyNjIxLAorICAgIDI2MjksIDI2MzUsIDI2NDMsIDI2NjUsIDI2NzMsIDI2NzksIDI2ODcsIDI2OTcsIDI3MDUsIDI3MTEsIDI3MTksIDI3MzgsCisgICAgMjc0NiwgMjc1MiwgMjc2MCwgMjc3MCwgMjc3OCwgMjc4NCwgMjc5MiwgMjgxOCwgMjgyNiwgMjgzMiwgMjg0MCwgMjg1MCwKKyAgICAyODU4LCAyODY0LCAyODcyLCAyODkxLCAyODk5LCAyOTA1LCAyOTEzLCAyOTIzLCAyOTMxLCAyOTM3LCAyOTQ1LCAyOTY3LAorICAgIDI5NzUsIDI5ODEsIDI5ODksIDI5OTksIDMwMDcsIDMwMTMsIDMwMjEsIDMwNDAsIDMwNDgsIDMwNTQsIDMwNjIsIDMwNzIsCisgICAgMzA4MCwgMzA4NiwgMzA5NCwgMjk2MCwgMjk2OCwgMjk3NCwgMjk4MiwgMjk5MiwgMzAwMCwgMzAwNiwgMzAxNCwgMzAzMywKKyAgICAzMDQxLCAzMDQ3LCAzMDU1LCAzMDY1LCAzMDczLCAzMDc5LCAzMDg3LCAzMTA5LCAzMTE3LCAzMTIzLCAzMTMxLCAzMTQxLAorICAgIDMxNDksIDMxNTUsIDMxNjMsIDMxODIsIDMxOTAsIDMxOTYsIDMyMDQsIDMyMTQsIDMyMjIsIDMyMjgsIDMyMzYsIDMyNjIsCisgICAgMzI3MCwgMzI3NiwgMzI4NCwgMzI5NCwgMzMwMiwgMzMwOCwgMzMxNiwgMzMzNSwgMzM0MywgMzM0OSwgMzM1NywgMzM2NywKKyAgICAzMzc1LCAzMzgxLCAzMzg5LCAzNDExLCAzNDE5LCAzNDI1LCAzNDMzLCAzNDQzLCAzNDUxLCAzNDU3LCAzNDY1LCAzNDg0LAorICAgIDM0OTIsIDM0OTgsIDM1MDYsIDM1MTYsIDM1MjQsIDM1MzAsIDM1MzgsIDI4MDcsIDI4MTUsIDI4MjEsIDI4MjksIDI4MzksCisgICAgMjg0NywgMjg1MywgMjg2MSwgMjg4MCwgMjg4OCwgMjg5NCwgMjkwMiwgMjkxMiwgMjkyMCwgMjkyNiwgMjkzNCwgMjk1NiwKKyAgICAyOTY0LCAyOTcwLCAyOTc4LCAyOTg4LCAyOTk2LCAzMDAyLCAzMDEwLCAzMDI5LCAzMDM3LCAzMDQzLCAzMDUxLCAzMDYxLAorICAgIDMwNjksIDMwNzUsIDMwODMsIDMxMDksIDMxMTcsIDMxMjMsIDMxMzEsIDMxNDEsIDMxNDksIDMxNTUsIDMxNjMsIDMxODIsCisgICAgMzE5MCwgMzE5NiwgMzIwNCwgMzIxNCwgMzIyMiwgMzIyOCwgMzIzNiwgMzI1OCwgMzI2NiwgMzI3MiwgMzI4MCwgMzI5MCwKKyAgICAzMjk4LCAzMzA0LCAzMzEyLCAzMzMxLCAzMzM5LCAzMzQ1LCAzMzUzLCAzMzYzLCAzMzcxLCAzMzc3LCAzMzg1LCAzMjUxLAorICAgIDMyNTksIDMyNjUsIDMyNzMsIDMyODMsIDMyOTEsIDMyOTcsIDMzMDUsIDMzMjQsIDMzMzIsIDMzMzgsIDMzNDYsIDMzNTYsCisgICAgMzM2NCwgMzM3MCwgMzM3OCwgMzQwMCwgMzQwOCwgMzQxNCwgMzQyMiwgMzQzMiwgMzQ0MCwgMzQ0NiwgMzQ1NCwgMzQ3MywKKyAgICAzNDgxLCAzNDg3LCAzNDk1LCAzNTA1LCAzNTEzLCAzNTE5LCAzNTI3LCAzNTUzLCAzNTYxLCAzNTY3LCAzNTc1LCAzNTg1LAorICAgIDM1OTMsIDM1OTksIDM2MDcsIDM2MjYsIDM2MzQsIDM2NDAsIDM2NDgsIDM2NTgsIDM2NjYsIDM2NzIsIDM2ODAsIDM3MDIsCisgICAgMzcxMCwgMzcxNiwgMzcyNCwgMzczNCwgMzc0MiwgMzc0OCwgMzc1NiwgMzc3NSwgMzc4MywgMzc4OSwgMzc5NywgMzgwNywKKyAgICAzODE1LCAzODIxLCAzODI5LCAzNjI3LCAzNjM1LCAzNjQxLCAzNjQ5LCAzNjU5LCAzNjY3LCAzNjczLCAzNjgxLCAzNzAwLAorICAgIDM3MDgsIDM3MTQsIDM3MjIsIDM3MzIsIDM3NDAsIDM3NDYsIDM3NTQsIDM3NzYsIDM3ODQsIDM3OTAsIDM3OTgsIDM4MDgsCisgICAgMzgxNiwgMzgyMiwgMzgzMCwgMzg0OSwgMzg1NywgMzg2MywgMzg3MSwgMzg4MSwgMzg4OSwgMzg5NSwgMzkwMywgMzkyOSwKKyAgICAzOTM3LCAzOTQzLCAzOTUxLCAzOTYxLCAzOTY5LCAzOTc1LCAzOTgzLCA0MDAyLCA0MDEwLCA0MDE2LCA0MDI0LCA0MDM0LAorICAgIDQwNDIsIDQwNDgsIDQwNTYsIDQwNzgsIDQwODYsIDQwOTIsIDQxMDAsIDQxMTAsIDQxMTgsIDQxMjQsIDQxMzIsIDQxNTEsCisgICAgNDE1OSwgNDE2NSwgNDE3MywgNDE4MywgNDE5MSwgNDE5NywgNDIwNSwgNDA3MSwgNDA3OSwgNDA4NSwgNDA5MywgNDEwMywKKyAgICA0MTExLCA0MTE3LCA0MTI1LCA0MTQ0LCA0MTUyLCA0MTU4LCA0MTY2LCA0MTc2LCA0MTg0LCA0MTkwLCA0MTk4LCA0MjIwLAorICAgIDQyMjgsIDQyMzQsIDQyNDIsIDQyNTIsIDQyNjAsIDQyNjYsIDQyNzQsIDQyOTMsIDQzMDEsIDQzMDcsIDQzMTUsIDQzMjUsCisgICAgNDMzMywgNDMzOSwgNDM0NywgNDM3MywgNDM4MSwgNDM4NywgNDM5NSwgNDQwNSwgNDQxMywgNDQxOSwgNDQyNywgNDQ0NiwKKyAgICA0NDU0LCA0NDYwLCA0NDY4LCA0NDc4LCA0NDg2LCA0NDkyLCA0NTAwLCA0NTIyLCA0NTMwLCA0NTM2LCA0NTQ0LCA0NTU0LAorICAgIDQ1NjIsIDQ1NjgsIDQ1NzYsIDQ1OTUsIDQ2MDMsIDQ2MDksIDQ2MTcsIDQ2MjcsIDQ2MzUsIDQ2NDEsIDQ2NDksIDM3NDIsCisgICAgMzc1MCwgMzc1NiwgMzc2NCwgMzc3NCwgMzc4MiwgMzc4OCwgMzc5NiwgMzgxNSwgMzgyMywgMzgyOSwgMzgzNywgMzg0NywKKyAgICAzODU1LCAzODYxLCAzODY5LCAzODkxLCAzODk5LCAzOTA1LCAzOTEzLCAzOTIzLCAzOTMxLCAzOTM3LCAzOTQ1LCAzOTY0LAorICAgIDM5NzIsIDM5NzgsIDM5ODYsIDM5OTYsIDQwMDQsIDQwMTAsIDQwMTgsIDQwNDQsIDQwNTIsIDQwNTgsIDQwNjYsIDQwNzYsCisgICAgNDA4NCwgNDA5MCwgNDA5OCwgNDExNywgNDEyNSwgNDEzMSwgNDEzOSwgNDE0OSwgNDE1NywgNDE2MywgNDE3MSwgNDE5MywKKyAgICA0MjAxLCA0MjA3LCA0MjE1LCA0MjI1LCA0MjMzLCA0MjM5LCA0MjQ3LCA0MjY2LCA0Mjc0LCA0MjgwLCA0Mjg4LCA0Mjk4LAorICAgIDQzMDYsIDQzMTIsIDQzMjAsIDQxODYsIDQxOTQsIDQyMDAsIDQyMDgsIDQyMTgsIDQyMjYsIDQyMzIsIDQyNDAsIDQyNTksCisgICAgNDI2NywgNDI3MywgNDI4MSwgNDI5MSwgNDI5OSwgNDMwNSwgNDMxMywgNDMzNSwgNDM0MywgNDM0OSwgNDM1NywgNDM2NywKKyAgICA0Mzc1LCA0MzgxLCA0Mzg5LCA0NDA4LCA0NDE2LCA0NDIyLCA0NDMwLCA0NDQwLCA0NDQ4LCA0NDU0LCA0NDYyLCA0NDg4LAorICAgIDQ0OTYsIDQ1MDIsIDQ1MTAsIDQ1MjAsIDQ1MjgsIDQ1MzQsIDQ1NDIsIDQ1NjEsIDQ1NjksIDQ1NzUsIDQ1ODMsIDQ1OTMsCisgICAgNDYwMSwgNDYwNywgNDYxNSwgNDYzNywgNDY0NSwgNDY1MSwgNDY1OSwgNDY2OSwgNDY3NywgNDY4MywgNDY5MSwgNDcxMCwKKyAgICA0NzE4LCA0NzI0LCA0NzMyLCA0NzQyLCA0NzUwLCA0NzU2LCA0NzY0LCA0NTYyLCA0NTcwLCA0NTc2LCA0NTg0LCA0NTk0LAorICAgIDQ2MDIsIDQ2MDgsIDQ2MTYsIDQ2MzUsIDQ2NDMsIDQ2NDksIDQ2NTcsIDQ2NjcsIDQ2NzUsIDQ2ODEsIDQ2ODksIDQ3MTEsCisgICAgNDcxOSwgNDcyNSwgNDczMywgNDc0MywgNDc1MSwgNDc1NywgNDc2NSwgNDc4NCwgNDc5MiwgNDc5OCwgNDgwNiwgNDgxNiwKKyAgICA0ODI0LCA0ODMwLCA0ODM4LCA0ODY0LCA0ODcyLCA0ODc4LCA0ODg2LCA0ODk2LCA0OTA0LCA0OTEwLCA0OTE4LCA0OTM3LAorICAgIDQ5NDUsIDQ5NTEsIDQ5NTksIDQ5NjksIDQ5NzcsIDQ5ODMsIDQ5OTEsIDUwMTMsIDUwMjEsIDUwMjcsIDUwMzUsIDUwNDUsCisgICAgNTA1MywgNTA1OSwgNTA2NywgNTA4NiwgNTA5NCwgNTEwMCwgNTEwOCwgNTExOCwgNTEyNiwgNTEzMiwgNTE0MCwgNTAwNiwKKyAgICA1MDE0LCA1MDIwLCA1MDI4LCA1MDM4LCA1MDQ2LCA1MDUyLCA1MDYwLCA1MDc5LCA1MDg3LCA1MDkzLCA1MTAxLCA1MTExLAorICAgIDUxMTksIDUxMjUsIDUxMzMsIDUxNTUsIDUxNjMsIDUxNjksIDUxNzcsIDUxODcsIDUxOTUsIDUyMDEsIDUyMDksIDUyMjgsCisgICAgNTIzNiwgNTI0MiwgNTI1MCwgNTI2MCwgNTI2OCwgNTI3NCwgNTI4MiwgNTMwOCwgNTMxNiwgNTMyMiwgNTMzMCwgNTM0MCwKKyAgICA1MzQ4LCA1MzU0LCA1MzYyLCA1MzgxLCA1Mzg5LCA1Mzk1LCA1NDAzLCA1NDEzLCA1NDIxLCA1NDI3LCA1NDM1LCA1NDU3LAorICAgIDU0NjUsIDU0NzEsIDU0NzksIDU0ODksIDU0OTcsIDU1MDMsIDU1MTEsIDU1MzAsIDU1MzgsIDU1NDQsIDU1NTIsIDU1NjIsCisgICAgNTU3MCwgNTU3NiwgNTU4NCwgNDg1MywgNDg2MSwgNDg2NywgNDg3NSwgNDg4NSwgNDg5MywgNDg5OSwgNDkwNywgNDkyNiwKKyAgICA0OTM0LCA0OTQwLCA0OTQ4LCA0OTU4LCA0OTY2LCA0OTcyLCA0OTgwLCA1MDAyLCA1MDEwLCA1MDE2LCA1MDI0LCA1MDM0LAorICAgIDUwNDIsIDUwNDgsIDUwNTYsIDUwNzUsIDUwODMsIDUwODksIDUwOTcsIDUxMDcsIDUxMTUsIDUxMjEsIDUxMjksIDUxNTUsCisgICAgNTE2MywgNTE2OSwgNTE3NywgNTE4NywgNTE5NSwgNTIwMSwgNTIwOSwgNTIyOCwgNTIzNiwgNTI0MiwgNTI1MCwgNTI2MCwKKyAgICA1MjY4LCA1Mjc0LCA1MjgyLCA1MzA0LCA1MzEyLCA1MzE4LCA1MzI2LCA1MzM2LCA1MzQ0LCA1MzUwLCA1MzU4LCA1Mzc3LAorICAgIDUzODUsIDUzOTEsIDUzOTksIDU0MDksIDU0MTcsIDU0MjMsIDU0MzEsIDUyOTcsIDUzMDUsIDUzMTEsIDUzMTksIDUzMjksCisgICAgNTMzNywgNTM0MywgNTM1MSwgNTM3MCwgNTM3OCwgNTM4NCwgNTM5MiwgNTQwMiwgNTQxMCwgNTQxNiwgNTQyNCwgNTQ0NiwKKyAgICA1NDU0LCA1NDYwLCA1NDY4LCA1NDc4LCA1NDg2LCA1NDkyLCA1NTAwLCA1NTE5LCA1NTI3LCA1NTMzLCA1NTQxLCA1NTUxLAorICAgIDU1NTksIDU1NjUsIDU1NzMsIDU1OTksIDU2MDcsIDU2MTMsIDU2MjEsIDU2MzEsIDU2MzksIDU2NDUsIDU2NTMsIDU2NzIsCisgICAgNTY4MCwgNTY4NiwgNTY5NCwgNTcwNCwgNTcxMiwgNTcxOCwgNTcyNiwgNTc0OCwgNTc1NiwgNTc2MiwgNTc3MCwgNTc4MCwKKyAgICA1Nzg4LCA1Nzk0LCA1ODAyLCA1ODIxLCA1ODI5LCA1ODM1LCA1ODQzLCA1ODUzLCA1ODYxLCA1ODY3LCA1ODc1LCA1NjczLAorICAgIDU2ODEsIDU2ODcsIDU2OTUsIDU3MDUsIDU3MTMsIDU3MTksIDU3MjcsIDU3NDYsIDU3NTQsIDU3NjAsIDU3NjgsIDU3NzgsCisgICAgNTc4NiwgNTc5MiwgNTgwMCwgNTgyMiwgNTgzMCwgNTgzNiwgNTg0NCwgNTg1NCwgNTg2MiwgNTg2OCwgNTg3NiwgNTg5NSwKKyAgICA1OTAzLCA1OTA5LCA1OTE3LCA1OTI3LCA1OTM1LCA1OTQxLCA1OTQ5LCA1OTc1LCA1OTgzLCA1OTg5LCA1OTk3LCA2MDA3LAorICAgIDYwMTUsIDYwMjEsIDYwMjksIDYwNDgsIDYwNTYsIDYwNjIsIDYwNzAsIDYwODAsIDYwODgsIDYwOTQsIDYxMDIsIDYxMjQsCisgICAgNjEzMiwgNjEzOCwgNjE0NiwgNjE1NiwgNjE2NCwgNjE3MCwgNjE3OCwgNjE5NywgNjIwNSwgNjIxMSwgNjIxOSwgNjIyOSwKKyAgICA2MjM3LCA2MjQzLCA2MjUxLCA2MTE3LCA2MTI1LCA2MTMxLCA2MTM5LCA2MTQ5LCA2MTU3LCA2MTYzLCA2MTcxLCA2MTkwLAorICAgIDYxOTgsIDYyMDQsIDYyMTIsIDYyMjIsIDYyMzAsIDYyMzYsIDYyNDQsIDYyNjYsIDYyNzQsIDYyODAsIDYyODgsIDYyOTgsCisgICAgNjMwNiwgNjMxMiwgNjMyMCwgNjMzOSwgNjM0NywgNjM1MywgNjM2MSwgNjM3MSwgNjM3OSwgNjM4NSwgNjM5MywgNjQxOSwKKyAgICA2NDI3LCA2NDMzLCA2NDQxLCA2NDUxLCA2NDU5LCA2NDY1LCA2NDczLCA2NDkyLCA2NTAwLCA2NTA2LCA2NTE0LCA2NTI0LAorICAgIDY1MzIsIDY1MzgsIDY1NDYsIDY1NjgsIDY1NzYsIDY1ODIsIDY1OTAsIDY2MDAsIDY2MDgsIDY2MTQsIDY2MjIsIDY2NDEsCisgICAgNjY0OSwgNjY1NSwgNjY2MywgNjY3MywgNjY4MSwgNjY4NywgNjY5NSwgMzc0MiwgMzc1MCwgMzc1NiwgMzc2NCwgMzc3NCwKKyAgICAzNzgyLCAzNzg4LCAzNzk2LCAzODE1LCAzODIzLCAzODI5LCAzODM3LCAzODQ3LCAzODU1LCAzODYxLCAzODY5LCAzODkxLAorICAgIDM4OTksIDM5MDUsIDM5MTMsIDM5MjMsIDM5MzEsIDM5MzcsIDM5NDUsIDM5NjQsIDM5NzIsIDM5NzgsIDM5ODYsIDM5OTYsCisgICAgNDAwNCwgNDAxMCwgNDAxOCwgNDA0NCwgNDA1MiwgNDA1OCwgNDA2NiwgNDA3NiwgNDA4NCwgNDA5MCwgNDA5OCwgNDExNywKKyAgICA0MTI1LCA0MTMxLCA0MTM5LCA0MTQ5LCA0MTU3LCA0MTYzLCA0MTcxLCA0MTkzLCA0MjAxLCA0MjA3LCA0MjE1LCA0MjI1LAorICAgIDQyMzMsIDQyMzksIDQyNDcsIDQyNjYsIDQyNzQsIDQyODAsIDQyODgsIDQyOTgsIDQzMDYsIDQzMTIsIDQzMjAsIDQxODYsCisgICAgNDE5NCwgNDIwMCwgNDIwOCwgNDIxOCwgNDIyNiwgNDIzMiwgNDI0MCwgNDI1OSwgNDI2NywgNDI3MywgNDI4MSwgNDI5MSwKKyAgICA0Mjk5LCA0MzA1LCA0MzEzLCA0MzM1LCA0MzQzLCA0MzQ5LCA0MzU3LCA0MzY3LCA0Mzc1LCA0MzgxLCA0Mzg5LCA0NDA4LAorICAgIDQ0MTYsIDQ0MjIsIDQ0MzAsIDQ0NDAsIDQ0NDgsIDQ0NTQsIDQ0NjIsIDQ0ODgsIDQ0OTYsIDQ1MDIsIDQ1MTAsIDQ1MjAsCisgICAgNDUyOCwgNDUzNCwgNDU0MiwgNDU2MSwgNDU2OSwgNDU3NSwgNDU4MywgNDU5MywgNDYwMSwgNDYwNywgNDYxNSwgNDYzNywKKyAgICA0NjQ1LCA0NjUxLCA0NjU5LCA0NjY5LCA0Njc3LCA0NjgzLCA0NjkxLCA0NzEwLCA0NzE4LCA0NzI0LCA0NzMyLCA0NzQyLAorICAgIDQ3NTAsIDQ3NTYsIDQ3NjQsIDQ1NjIsIDQ1NzAsIDQ1NzYsIDQ1ODQsIDQ1OTQsIDQ2MDIsIDQ2MDgsIDQ2MTYsIDQ2MzUsCisgICAgNDY0MywgNDY0OSwgNDY1NywgNDY2NywgNDY3NSwgNDY4MSwgNDY4OSwgNDcxMSwgNDcxOSwgNDcyNSwgNDczMywgNDc0MywKKyAgICA0NzUxLCA0NzU3LCA0NzY1LCA0Nzg0LCA0NzkyLCA0Nzk4LCA0ODA2LCA0ODE2LCA0ODI0LCA0ODMwLCA0ODM4LCA0ODY0LAorICAgIDQ4NzIsIDQ4NzgsIDQ4ODYsIDQ4OTYsIDQ5MDQsIDQ5MTAsIDQ5MTgsIDQ5MzcsIDQ5NDUsIDQ5NTEsIDQ5NTksIDQ5NjksCisgICAgNDk3NywgNDk4MywgNDk5MSwgNTAxMywgNTAyMSwgNTAyNywgNTAzNSwgNTA0NSwgNTA1MywgNTA1OSwgNTA2NywgNTA4NiwKKyAgICA1MDk0LCA1MTAwLCA1MTA4LCA1MTE4LCA1MTI2LCA1MTMyLCA1MTQwLCA1MDA2LCA1MDE0LCA1MDIwLCA1MDI4LCA1MDM4LAorICAgIDUwNDYsIDUwNTIsIDUwNjAsIDUwNzksIDUwODcsIDUwOTMsIDUxMDEsIDUxMTEsIDUxMTksIDUxMjUsIDUxMzMsIDUxNTUsCisgICAgNTE2MywgNTE2OSwgNTE3NywgNTE4NywgNTE5NSwgNTIwMSwgNTIwOSwgNTIyOCwgNTIzNiwgNTI0MiwgNTI1MCwgNTI2MCwKKyAgICA1MjY4LCA1Mjc0LCA1MjgyLCA1MzA4LCA1MzE2LCA1MzIyLCA1MzMwLCA1MzQwLCA1MzQ4LCA1MzU0LCA1MzYyLCA1MzgxLAorICAgIDUzODksIDUzOTUsIDU0MDMsIDU0MTMsIDU0MjEsIDU0MjcsIDU0MzUsIDU0NTcsIDU0NjUsIDU0NzEsIDU0NzksIDU0ODksCisgICAgNTQ5NywgNTUwMywgNTUxMSwgNTUzMCwgNTUzOCwgNTU0NCwgNTU1MiwgNTU2MiwgNTU3MCwgNTU3NiwgNTU4NCwgNDg1MywKKyAgICA0ODYxLCA0ODY3LCA0ODc1LCA0ODg1LCA0ODkzLCA0ODk5LCA0OTA3LCA0OTI2LCA0OTM0LCA0OTQwLCA0OTQ4LCA0OTU4LAorICAgIDQ5NjYsIDQ5NzIsIDQ5ODAsIDUwMDIsIDUwMTAsIDUwMTYsIDUwMjQsIDUwMzQsIDUwNDIsIDUwNDgsIDUwNTYsIDUwNzUsCisgICAgNTA4MywgNTA4OSwgNTA5NywgNTEwNywgNTExNSwgNTEyMSwgNTEyOSwgNTE1NSwgNTE2MywgNTE2OSwgNTE3NywgNTE4NywKKyAgICA1MTk1LCA1MjAxLCA1MjA5LCA1MjI4LCA1MjM2LCA1MjQyLCA1MjUwLCA1MjYwLCA1MjY4LCA1Mjc0LCA1MjgyLCA1MzA0LAorICAgIDUzMTIsIDUzMTgsIDUzMjYsIDUzMzYsIDUzNDQsIDUzNTAsIDUzNTgsIDUzNzcsIDUzODUsIDUzOTEsIDUzOTksIDU0MDksCisgICAgNTQxNywgNTQyMywgNTQzMSwgNTI5NywgNTMwNSwgNTMxMSwgNTMxOSwgNTMyOSwgNTMzNywgNTM0MywgNTM1MSwgNTM3MCwKKyAgICA1Mzc4LCA1Mzg0LCA1MzkyLCA1NDAyLCA1NDEwLCA1NDE2LCA1NDI0LCA1NDQ2LCA1NDU0LCA1NDYwLCA1NDY4LCA1NDc4LAorICAgIDU0ODYsIDU0OTIsIDU1MDAsIDU1MTksIDU1MjcsIDU1MzMsIDU1NDEsIDU1NTEsIDU1NTksIDU1NjUsIDU1NzMsIDU1OTksCisgICAgNTYwNywgNTYxMywgNTYyMSwgNTYzMSwgNTYzOSwgNTY0NSwgNTY1MywgNTY3MiwgNTY4MCwgNTY4NiwgNTY5NCwgNTcwNCwKKyAgICA1NzEyLCA1NzE4LCA1NzI2LCA1NzQ4LCA1NzU2LCA1NzYyLCA1NzcwLCA1NzgwLCA1Nzg4LCA1Nzk0LCA1ODAyLCA1ODIxLAorICAgIDU4MjksIDU4MzUsIDU4NDMsIDU4NTMsIDU4NjEsIDU4NjcsIDU4NzUsIDU2NzMsIDU2ODEsIDU2ODcsIDU2OTUsIDU3MDUsCisgICAgNTcxMywgNTcxOSwgNTcyNywgNTc0NiwgNTc1NCwgNTc2MCwgNTc2OCwgNTc3OCwgNTc4NiwgNTc5MiwgNTgwMCwgNTgyMiwKKyAgICA1ODMwLCA1ODM2LCA1ODQ0LCA1ODU0LCA1ODYyLCA1ODY4LCA1ODc2LCA1ODk1LCA1OTAzLCA1OTA5LCA1OTE3LCA1OTI3LAorICAgIDU5MzUsIDU5NDEsIDU5NDksIDU5NzUsIDU5ODMsIDU5ODksIDU5OTcsIDYwMDcsIDYwMTUsIDYwMjEsIDYwMjksIDYwNDgsCisgICAgNjA1NiwgNjA2MiwgNjA3MCwgNjA4MCwgNjA4OCwgNjA5NCwgNjEwMiwgNjEyNCwgNjEzMiwgNjEzOCwgNjE0NiwgNjE1NiwKKyAgICA2MTY0LCA2MTcwLCA2MTc4LCA2MTk3LCA2MjA1LCA2MjExLCA2MjE5LCA2MjI5LCA2MjM3LCA2MjQzLCA2MjUxLCA2MTE3LAorICAgIDYxMjUsIDYxMzEsIDYxMzksIDYxNDksIDYxNTcsIDYxNjMsIDYxNzEsIDYxOTAsIDYxOTgsIDYyMDQsIDYyMTIsIDYyMjIsCisgICAgNjIzMCwgNjIzNiwgNjI0NCwgNjI2NiwgNjI3NCwgNjI4MCwgNjI4OCwgNjI5OCwgNjMwNiwgNjMxMiwgNjMyMCwgNjMzOSwKKyAgICA2MzQ3LCA2MzUzLCA2MzYxLCA2MzcxLCA2Mzc5LCA2Mzg1LCA2MzkzLCA2NDE5LCA2NDI3LCA2NDMzLCA2NDQxLCA2NDUxLAorICAgIDY0NTksIDY0NjUsIDY0NzMsIDY0OTIsIDY1MDAsIDY1MDYsIDY1MTQsIDY1MjQsIDY1MzIsIDY1MzgsIDY1NDYsIDY1NjgsCisgICAgNjU3NiwgNjU4MiwgNjU5MCwgNjYwMCwgNjYwOCwgNjYxNCwgNjYyMiwgNjY0MSwgNjY0OSwgNjY1NSwgNjY2MywgNjY3MywKKyAgICA2NjgxLCA2Njg3LCA2Njk1LCA1Nzg4LCA1Nzk2LCA1ODAyLCA1ODEwLCA1ODIwLCA1ODI4LCA1ODM0LCA1ODQyLCA1ODYxLAorICAgIDU4NjksIDU4NzUsIDU4ODMsIDU4OTMsIDU5MDEsIDU5MDcsIDU5MTUsIDU5MzcsIDU5NDUsIDU5NTEsIDU5NTksIDU5NjksCisgICAgNTk3NywgNTk4MywgNTk5MSwgNjAxMCwgNjAxOCwgNjAyNCwgNjAzMiwgNjA0MiwgNjA1MCwgNjA1NiwgNjA2NCwgNjA5MCwKKyAgICA2MDk4LCA2MTA0LCA2MTEyLCA2MTIyLCA2MTMwLCA2MTM2LCA2MTQ0LCA2MTYzLCA2MTcxLCA2MTc3LCA2MTg1LCA2MTk1LAorICAgIDYyMDMsIDYyMDksIDYyMTcsIDYyMzksIDYyNDcsIDYyNTMsIDYyNjEsIDYyNzEsIDYyNzksIDYyODUsIDYyOTMsIDYzMTIsCisgICAgNjMyMCwgNjMyNiwgNjMzNCwgNjM0NCwgNjM1MiwgNjM1OCwgNjM2NiwgNjIzMiwgNjI0MCwgNjI0NiwgNjI1NCwgNjI2NCwKKyAgICA2MjcyLCA2Mjc4LCA2Mjg2LCA2MzA1LCA2MzEzLCA2MzE5LCA2MzI3LCA2MzM3LCA2MzQ1LCA2MzUxLCA2MzU5LCA2MzgxLAorICAgIDYzODksIDYzOTUsIDY0MDMsIDY0MTMsIDY0MjEsIDY0MjcsIDY0MzUsIDY0NTQsIDY0NjIsIDY0NjgsIDY0NzYsIDY0ODYsCisgICAgNjQ5NCwgNjUwMCwgNjUwOCwgNjUzNCwgNjU0MiwgNjU0OCwgNjU1NiwgNjU2NiwgNjU3NCwgNjU4MCwgNjU4OCwgNjYwNywKKyAgICA2NjE1LCA2NjIxLCA2NjI5LCA2NjM5LCA2NjQ3LCA2NjUzLCA2NjYxLCA2NjgzLCA2NjkxLCA2Njk3LCA2NzA1LCA2NzE1LAorICAgIDY3MjMsIDY3MjksIDY3MzcsIDY3NTYsIDY3NjQsIDY3NzAsIDY3NzgsIDY3ODgsIDY3OTYsIDY4MDIsIDY4MTAsIDY2MDgsCisgICAgNjYxNiwgNjYyMiwgNjYzMCwgNjY0MCwgNjY0OCwgNjY1NCwgNjY2MiwgNjY4MSwgNjY4OSwgNjY5NSwgNjcwMywgNjcxMywKKyAgICA2NzIxLCA2NzI3LCA2NzM1LCA2NzU3LCA2NzY1LCA2NzcxLCA2Nzc5LCA2Nzg5LCA2Nzk3LCA2ODAzLCA2ODExLCA2ODMwLAorICAgIDY4MzgsIDY4NDQsIDY4NTIsIDY4NjIsIDY4NzAsIDY4NzYsIDY4ODQsIDY5MTAsIDY5MTgsIDY5MjQsIDY5MzIsIDY5NDIsCisgICAgNjk1MCwgNjk1NiwgNjk2NCwgNjk4MywgNjk5MSwgNjk5NywgNzAwNSwgNzAxNSwgNzAyMywgNzAyOSwgNzAzNywgNzA1OSwKKyAgICA3MDY3LCA3MDczLCA3MDgxLCA3MDkxLCA3MDk5LCA3MTA1LCA3MTEzLCA3MTMyLCA3MTQwLCA3MTQ2LCA3MTU0LCA3MTY0LAorICAgIDcxNzIsIDcxNzgsIDcxODYsIDcwNTIsIDcwNjAsIDcwNjYsIDcwNzQsIDcwODQsIDcwOTIsIDcwOTgsIDcxMDYsIDcxMjUsCisgICAgNzEzMywgNzEzOSwgNzE0NywgNzE1NywgNzE2NSwgNzE3MSwgNzE3OSwgNzIwMSwgNzIwOSwgNzIxNSwgNzIyMywgNzIzMywKKyAgICA3MjQxLCA3MjQ3LCA3MjU1LCA3Mjc0LCA3MjgyLCA3Mjg4LCA3Mjk2LCA3MzA2LCA3MzE0LCA3MzIwLCA3MzI4LCA3MzU0LAorICAgIDczNjIsIDczNjgsIDczNzYsIDczODYsIDczOTQsIDc0MDAsIDc0MDgsIDc0MjcsIDc0MzUsIDc0NDEsIDc0NDksIDc0NTksCisgICAgNzQ2NywgNzQ3MywgNzQ4MSwgNzUwMywgNzUxMSwgNzUxNywgNzUyNSwgNzUzNSwgNzU0MywgNzU0OSwgNzU1NywgNzU3NiwKKyAgICA3NTg0LCA3NTkwLCA3NTk4LCA3NjA4LCA3NjE2LCA3NjIyLCA3NjMwLCA2ODk5LCA2OTA3LCA2OTEzLCA2OTIxLCA2OTMxLAorICAgIDY5MzksIDY5NDUsIDY5NTMsIDY5NzIsIDY5ODAsIDY5ODYsIDY5OTQsIDcwMDQsIDcwMTIsIDcwMTgsIDcwMjYsIDcwNDgsCisgICAgNzA1NiwgNzA2MiwgNzA3MCwgNzA4MCwgNzA4OCwgNzA5NCwgNzEwMiwgNzEyMSwgNzEyOSwgNzEzNSwgNzE0MywgNzE1MywKKyAgICA3MTYxLCA3MTY3LCA3MTc1LCA3MjAxLCA3MjA5LCA3MjE1LCA3MjIzLCA3MjMzLCA3MjQxLCA3MjQ3LCA3MjU1LCA3Mjc0LAorICAgIDcyODIsIDcyODgsIDcyOTYsIDczMDYsIDczMTQsIDczMjAsIDczMjgsIDczNTAsIDczNTgsIDczNjQsIDczNzIsIDczODIsCisgICAgNzM5MCwgNzM5NiwgNzQwNCwgNzQyMywgNzQzMSwgNzQzNywgNzQ0NSwgNzQ1NSwgNzQ2MywgNzQ2OSwgNzQ3NywgNzM0MywKKyAgICA3MzUxLCA3MzU3LCA3MzY1LCA3Mzc1LCA3MzgzLCA3Mzg5LCA3Mzk3LCA3NDE2LCA3NDI0LCA3NDMwLCA3NDM4LCA3NDQ4LAorICAgIDc0NTYsIDc0NjIsIDc0NzAsIDc0OTIsIDc1MDAsIDc1MDYsIDc1MTQsIDc1MjQsIDc1MzIsIDc1MzgsIDc1NDYsIDc1NjUsCisgICAgNzU3MywgNzU3OSwgNzU4NywgNzU5NywgNzYwNSwgNzYxMSwgNzYxOSwgNzY0NSwgNzY1MywgNzY1OSwgNzY2NywgNzY3NywKKyAgICA3Njg1LCA3NjkxLCA3Njk5LCA3NzE4LCA3NzI2LCA3NzMyLCA3NzQwLCA3NzUwLCA3NzU4LCA3NzY0LCA3NzcyLCA3Nzk0LAorICAgIDc4MDIsIDc4MDgsIDc4MTYsIDc4MjYsIDc4MzQsIDc4NDAsIDc4NDgsIDc4NjcsIDc4NzUsIDc4ODEsIDc4ODksIDc4OTksCisgICAgNzkwNywgNzkxMywgNzkyMSwgNzcxOSwgNzcyNywgNzczMywgNzc0MSwgNzc1MSwgNzc1OSwgNzc2NSwgNzc3MywgNzc5MiwKKyAgICA3ODAwLCA3ODA2LCA3ODE0LCA3ODI0LCA3ODMyLCA3ODM4LCA3ODQ2LCA3ODY4LCA3ODc2LCA3ODgyLCA3ODkwLCA3OTAwLAorICAgIDc5MDgsIDc5MTQsIDc5MjIsIDc5NDEsIDc5NDksIDc5NTUsIDc5NjMsIDc5NzMsIDc5ODEsIDc5ODcsIDc5OTUsIDgwMjEsCisgICAgODAyOSwgODAzNSwgODA0MywgODA1MywgODA2MSwgODA2NywgODA3NSwgODA5NCwgODEwMiwgODEwOCwgODExNiwgODEyNiwKKyAgICA4MTM0LCA4MTQwLCA4MTQ4LCA4MTcwLCA4MTc4LCA4MTg0LCA4MTkyLCA4MjAyLCA4MjEwLCA4MjE2LCA4MjI0LCA4MjQzLAorICAgIDgyNTEsIDgyNTcsIDgyNjUsIDgyNzUKK307CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvZGN0X3ZhbHVlX3Rva2Vucy5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2RjdF92YWx1ZV90b2tlbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjA4ZWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2RjdF92YWx1ZV90b2tlbnMuaApAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBHZW5lcmF0ZWQgZmlsZSwgaW5jbHVkZWQgYnkgdG9rZW5pemUuYyAgKi8KKy8qIFZhbHVlcyBnZW5lcmF0ZWQgYnkgZmlsbF92YWx1ZV90b2tlbnMoKSAqLworCitzdGF0aWMgY29uc3QgVE9LRU5WQUxVRSBkY3RfdmFsdWVfdG9rZW5zWzIwNDgqMl0gPQoreworICAgIHsxMCwgMzk2M30sIHsxMCwgMzk2MX0sIHsxMCwgMzk1OX0sIHsxMCwgMzk1N30sIHsxMCwgMzk1NX0sIHsxMCwgMzk1M30sCisgICAgezEwLCAzOTUxfSwgezEwLCAzOTQ5fSwgezEwLCAzOTQ3fSwgezEwLCAzOTQ1fSwgezEwLCAzOTQzfSwgezEwLCAzOTQxfSwKKyAgICB7MTAsIDM5Mzl9LCB7MTAsIDM5Mzd9LCB7MTAsIDM5MzV9LCB7MTAsIDM5MzN9LCB7MTAsIDM5MzF9LCB7MTAsIDM5Mjl9LAorICAgIHsxMCwgMzkyN30sIHsxMCwgMzkyNX0sIHsxMCwgMzkyM30sIHsxMCwgMzkyMX0sIHsxMCwgMzkxOX0sIHsxMCwgMzkxN30sCisgICAgezEwLCAzOTE1fSwgezEwLCAzOTEzfSwgezEwLCAzOTExfSwgezEwLCAzOTA5fSwgezEwLCAzOTA3fSwgezEwLCAzOTA1fSwKKyAgICB7MTAsIDM5MDN9LCB7MTAsIDM5MDF9LCB7MTAsIDM4OTl9LCB7MTAsIDM4OTd9LCB7MTAsIDM4OTV9LCB7MTAsIDM4OTN9LAorICAgIHsxMCwgMzg5MX0sIHsxMCwgMzg4OX0sIHsxMCwgMzg4N30sIHsxMCwgMzg4NX0sIHsxMCwgMzg4M30sIHsxMCwgMzg4MX0sCisgICAgezEwLCAzODc5fSwgezEwLCAzODc3fSwgezEwLCAzODc1fSwgezEwLCAzODczfSwgezEwLCAzODcxfSwgezEwLCAzODY5fSwKKyAgICB7MTAsIDM4Njd9LCB7MTAsIDM4NjV9LCB7MTAsIDM4NjN9LCB7MTAsIDM4NjF9LCB7MTAsIDM4NTl9LCB7MTAsIDM4NTd9LAorICAgIHsxMCwgMzg1NX0sIHsxMCwgMzg1M30sIHsxMCwgMzg1MX0sIHsxMCwgMzg0OX0sIHsxMCwgMzg0N30sIHsxMCwgMzg0NX0sCisgICAgezEwLCAzODQzfSwgezEwLCAzODQxfSwgezEwLCAzODM5fSwgezEwLCAzODM3fSwgezEwLCAzODM1fSwgezEwLCAzODMzfSwKKyAgICB7MTAsIDM4MzF9LCB7MTAsIDM4Mjl9LCB7MTAsIDM4Mjd9LCB7MTAsIDM4MjV9LCB7MTAsIDM4MjN9LCB7MTAsIDM4MjF9LAorICAgIHsxMCwgMzgxOX0sIHsxMCwgMzgxN30sIHsxMCwgMzgxNX0sIHsxMCwgMzgxM30sIHsxMCwgMzgxMX0sIHsxMCwgMzgwOX0sCisgICAgezEwLCAzODA3fSwgezEwLCAzODA1fSwgezEwLCAzODAzfSwgezEwLCAzODAxfSwgezEwLCAzNzk5fSwgezEwLCAzNzk3fSwKKyAgICB7MTAsIDM3OTV9LCB7MTAsIDM3OTN9LCB7MTAsIDM3OTF9LCB7MTAsIDM3ODl9LCB7MTAsIDM3ODd9LCB7MTAsIDM3ODV9LAorICAgIHsxMCwgMzc4M30sIHsxMCwgMzc4MX0sIHsxMCwgMzc3OX0sIHsxMCwgMzc3N30sIHsxMCwgMzc3NX0sIHsxMCwgMzc3M30sCisgICAgezEwLCAzNzcxfSwgezEwLCAzNzY5fSwgezEwLCAzNzY3fSwgezEwLCAzNzY1fSwgezEwLCAzNzYzfSwgezEwLCAzNzYxfSwKKyAgICB7MTAsIDM3NTl9LCB7MTAsIDM3NTd9LCB7MTAsIDM3NTV9LCB7MTAsIDM3NTN9LCB7MTAsIDM3NTF9LCB7MTAsIDM3NDl9LAorICAgIHsxMCwgMzc0N30sIHsxMCwgMzc0NX0sIHsxMCwgMzc0M30sIHsxMCwgMzc0MX0sIHsxMCwgMzczOX0sIHsxMCwgMzczN30sCisgICAgezEwLCAzNzM1fSwgezEwLCAzNzMzfSwgezEwLCAzNzMxfSwgezEwLCAzNzI5fSwgezEwLCAzNzI3fSwgezEwLCAzNzI1fSwKKyAgICB7MTAsIDM3MjN9LCB7MTAsIDM3MjF9LCB7MTAsIDM3MTl9LCB7MTAsIDM3MTd9LCB7MTAsIDM3MTV9LCB7MTAsIDM3MTN9LAorICAgIHsxMCwgMzcxMX0sIHsxMCwgMzcwOX0sIHsxMCwgMzcwN30sIHsxMCwgMzcwNX0sIHsxMCwgMzcwM30sIHsxMCwgMzcwMX0sCisgICAgezEwLCAzNjk5fSwgezEwLCAzNjk3fSwgezEwLCAzNjk1fSwgezEwLCAzNjkzfSwgezEwLCAzNjkxfSwgezEwLCAzNjg5fSwKKyAgICB7MTAsIDM2ODd9LCB7MTAsIDM2ODV9LCB7MTAsIDM2ODN9LCB7MTAsIDM2ODF9LCB7MTAsIDM2Nzl9LCB7MTAsIDM2Nzd9LAorICAgIHsxMCwgMzY3NX0sIHsxMCwgMzY3M30sIHsxMCwgMzY3MX0sIHsxMCwgMzY2OX0sIHsxMCwgMzY2N30sIHsxMCwgMzY2NX0sCisgICAgezEwLCAzNjYzfSwgezEwLCAzNjYxfSwgezEwLCAzNjU5fSwgezEwLCAzNjU3fSwgezEwLCAzNjU1fSwgezEwLCAzNjUzfSwKKyAgICB7MTAsIDM2NTF9LCB7MTAsIDM2NDl9LCB7MTAsIDM2NDd9LCB7MTAsIDM2NDV9LCB7MTAsIDM2NDN9LCB7MTAsIDM2NDF9LAorICAgIHsxMCwgMzYzOX0sIHsxMCwgMzYzN30sIHsxMCwgMzYzNX0sIHsxMCwgMzYzM30sIHsxMCwgMzYzMX0sIHsxMCwgMzYyOX0sCisgICAgezEwLCAzNjI3fSwgezEwLCAzNjI1fSwgezEwLCAzNjIzfSwgezEwLCAzNjIxfSwgezEwLCAzNjE5fSwgezEwLCAzNjE3fSwKKyAgICB7MTAsIDM2MTV9LCB7MTAsIDM2MTN9LCB7MTAsIDM2MTF9LCB7MTAsIDM2MDl9LCB7MTAsIDM2MDd9LCB7MTAsIDM2MDV9LAorICAgIHsxMCwgMzYwM30sIHsxMCwgMzYwMX0sIHsxMCwgMzU5OX0sIHsxMCwgMzU5N30sIHsxMCwgMzU5NX0sIHsxMCwgMzU5M30sCisgICAgezEwLCAzNTkxfSwgezEwLCAzNTg5fSwgezEwLCAzNTg3fSwgezEwLCAzNTg1fSwgezEwLCAzNTgzfSwgezEwLCAzNTgxfSwKKyAgICB7MTAsIDM1Nzl9LCB7MTAsIDM1Nzd9LCB7MTAsIDM1NzV9LCB7MTAsIDM1NzN9LCB7MTAsIDM1NzF9LCB7MTAsIDM1Njl9LAorICAgIHsxMCwgMzU2N30sIHsxMCwgMzU2NX0sIHsxMCwgMzU2M30sIHsxMCwgMzU2MX0sIHsxMCwgMzU1OX0sIHsxMCwgMzU1N30sCisgICAgezEwLCAzNTU1fSwgezEwLCAzNTUzfSwgezEwLCAzNTUxfSwgezEwLCAzNTQ5fSwgezEwLCAzNTQ3fSwgezEwLCAzNTQ1fSwKKyAgICB7MTAsIDM1NDN9LCB7MTAsIDM1NDF9LCB7MTAsIDM1Mzl9LCB7MTAsIDM1Mzd9LCB7MTAsIDM1MzV9LCB7MTAsIDM1MzN9LAorICAgIHsxMCwgMzUzMX0sIHsxMCwgMzUyOX0sIHsxMCwgMzUyN30sIHsxMCwgMzUyNX0sIHsxMCwgMzUyM30sIHsxMCwgMzUyMX0sCisgICAgezEwLCAzNTE5fSwgezEwLCAzNTE3fSwgezEwLCAzNTE1fSwgezEwLCAzNTEzfSwgezEwLCAzNTExfSwgezEwLCAzNTA5fSwKKyAgICB7MTAsIDM1MDd9LCB7MTAsIDM1MDV9LCB7MTAsIDM1MDN9LCB7MTAsIDM1MDF9LCB7MTAsIDM0OTl9LCB7MTAsIDM0OTd9LAorICAgIHsxMCwgMzQ5NX0sIHsxMCwgMzQ5M30sIHsxMCwgMzQ5MX0sIHsxMCwgMzQ4OX0sIHsxMCwgMzQ4N30sIHsxMCwgMzQ4NX0sCisgICAgezEwLCAzNDgzfSwgezEwLCAzNDgxfSwgezEwLCAzNDc5fSwgezEwLCAzNDc3fSwgezEwLCAzNDc1fSwgezEwLCAzNDczfSwKKyAgICB7MTAsIDM0NzF9LCB7MTAsIDM0Njl9LCB7MTAsIDM0Njd9LCB7MTAsIDM0NjV9LCB7MTAsIDM0NjN9LCB7MTAsIDM0NjF9LAorICAgIHsxMCwgMzQ1OX0sIHsxMCwgMzQ1N30sIHsxMCwgMzQ1NX0sIHsxMCwgMzQ1M30sIHsxMCwgMzQ1MX0sIHsxMCwgMzQ0OX0sCisgICAgezEwLCAzNDQ3fSwgezEwLCAzNDQ1fSwgezEwLCAzNDQzfSwgezEwLCAzNDQxfSwgezEwLCAzNDM5fSwgezEwLCAzNDM3fSwKKyAgICB7MTAsIDM0MzV9LCB7MTAsIDM0MzN9LCB7MTAsIDM0MzF9LCB7MTAsIDM0Mjl9LCB7MTAsIDM0Mjd9LCB7MTAsIDM0MjV9LAorICAgIHsxMCwgMzQyM30sIHsxMCwgMzQyMX0sIHsxMCwgMzQxOX0sIHsxMCwgMzQxN30sIHsxMCwgMzQxNX0sIHsxMCwgMzQxM30sCisgICAgezEwLCAzNDExfSwgezEwLCAzNDA5fSwgezEwLCAzNDA3fSwgezEwLCAzNDA1fSwgezEwLCAzNDAzfSwgezEwLCAzNDAxfSwKKyAgICB7MTAsIDMzOTl9LCB7MTAsIDMzOTd9LCB7MTAsIDMzOTV9LCB7MTAsIDMzOTN9LCB7MTAsIDMzOTF9LCB7MTAsIDMzODl9LAorICAgIHsxMCwgMzM4N30sIHsxMCwgMzM4NX0sIHsxMCwgMzM4M30sIHsxMCwgMzM4MX0sIHsxMCwgMzM3OX0sIHsxMCwgMzM3N30sCisgICAgezEwLCAzMzc1fSwgezEwLCAzMzczfSwgezEwLCAzMzcxfSwgezEwLCAzMzY5fSwgezEwLCAzMzY3fSwgezEwLCAzMzY1fSwKKyAgICB7MTAsIDMzNjN9LCB7MTAsIDMzNjF9LCB7MTAsIDMzNTl9LCB7MTAsIDMzNTd9LCB7MTAsIDMzNTV9LCB7MTAsIDMzNTN9LAorICAgIHsxMCwgMzM1MX0sIHsxMCwgMzM0OX0sIHsxMCwgMzM0N30sIHsxMCwgMzM0NX0sIHsxMCwgMzM0M30sIHsxMCwgMzM0MX0sCisgICAgezEwLCAzMzM5fSwgezEwLCAzMzM3fSwgezEwLCAzMzM1fSwgezEwLCAzMzMzfSwgezEwLCAzMzMxfSwgezEwLCAzMzI5fSwKKyAgICB7MTAsIDMzMjd9LCB7MTAsIDMzMjV9LCB7MTAsIDMzMjN9LCB7MTAsIDMzMjF9LCB7MTAsIDMzMTl9LCB7MTAsIDMzMTd9LAorICAgIHsxMCwgMzMxNX0sIHsxMCwgMzMxM30sIHsxMCwgMzMxMX0sIHsxMCwgMzMwOX0sIHsxMCwgMzMwN30sIHsxMCwgMzMwNX0sCisgICAgezEwLCAzMzAzfSwgezEwLCAzMzAxfSwgezEwLCAzMjk5fSwgezEwLCAzMjk3fSwgezEwLCAzMjk1fSwgezEwLCAzMjkzfSwKKyAgICB7MTAsIDMyOTF9LCB7MTAsIDMyODl9LCB7MTAsIDMyODd9LCB7MTAsIDMyODV9LCB7MTAsIDMyODN9LCB7MTAsIDMyODF9LAorICAgIHsxMCwgMzI3OX0sIHsxMCwgMzI3N30sIHsxMCwgMzI3NX0sIHsxMCwgMzI3M30sIHsxMCwgMzI3MX0sIHsxMCwgMzI2OX0sCisgICAgezEwLCAzMjY3fSwgezEwLCAzMjY1fSwgezEwLCAzMjYzfSwgezEwLCAzMjYxfSwgezEwLCAzMjU5fSwgezEwLCAzMjU3fSwKKyAgICB7MTAsIDMyNTV9LCB7MTAsIDMyNTN9LCB7MTAsIDMyNTF9LCB7MTAsIDMyNDl9LCB7MTAsIDMyNDd9LCB7MTAsIDMyNDV9LAorICAgIHsxMCwgMzI0M30sIHsxMCwgMzI0MX0sIHsxMCwgMzIzOX0sIHsxMCwgMzIzN30sIHsxMCwgMzIzNX0sIHsxMCwgMzIzM30sCisgICAgezEwLCAzMjMxfSwgezEwLCAzMjI5fSwgezEwLCAzMjI3fSwgezEwLCAzMjI1fSwgezEwLCAzMjIzfSwgezEwLCAzMjIxfSwKKyAgICB7MTAsIDMyMTl9LCB7MTAsIDMyMTd9LCB7MTAsIDMyMTV9LCB7MTAsIDMyMTN9LCB7MTAsIDMyMTF9LCB7MTAsIDMyMDl9LAorICAgIHsxMCwgMzIwN30sIHsxMCwgMzIwNX0sIHsxMCwgMzIwM30sIHsxMCwgMzIwMX0sIHsxMCwgMzE5OX0sIHsxMCwgMzE5N30sCisgICAgezEwLCAzMTk1fSwgezEwLCAzMTkzfSwgezEwLCAzMTkxfSwgezEwLCAzMTg5fSwgezEwLCAzMTg3fSwgezEwLCAzMTg1fSwKKyAgICB7MTAsIDMxODN9LCB7MTAsIDMxODF9LCB7MTAsIDMxNzl9LCB7MTAsIDMxNzd9LCB7MTAsIDMxNzV9LCB7MTAsIDMxNzN9LAorICAgIHsxMCwgMzE3MX0sIHsxMCwgMzE2OX0sIHsxMCwgMzE2N30sIHsxMCwgMzE2NX0sIHsxMCwgMzE2M30sIHsxMCwgMzE2MX0sCisgICAgezEwLCAzMTU5fSwgezEwLCAzMTU3fSwgezEwLCAzMTU1fSwgezEwLCAzMTUzfSwgezEwLCAzMTUxfSwgezEwLCAzMTQ5fSwKKyAgICB7MTAsIDMxNDd9LCB7MTAsIDMxNDV9LCB7MTAsIDMxNDN9LCB7MTAsIDMxNDF9LCB7MTAsIDMxMzl9LCB7MTAsIDMxMzd9LAorICAgIHsxMCwgMzEzNX0sIHsxMCwgMzEzM30sIHsxMCwgMzEzMX0sIHsxMCwgMzEyOX0sIHsxMCwgMzEyN30sIHsxMCwgMzEyNX0sCisgICAgezEwLCAzMTIzfSwgezEwLCAzMTIxfSwgezEwLCAzMTE5fSwgezEwLCAzMTE3fSwgezEwLCAzMTE1fSwgezEwLCAzMTEzfSwKKyAgICB7MTAsIDMxMTF9LCB7MTAsIDMxMDl9LCB7MTAsIDMxMDd9LCB7MTAsIDMxMDV9LCB7MTAsIDMxMDN9LCB7MTAsIDMxMDF9LAorICAgIHsxMCwgMzA5OX0sIHsxMCwgMzA5N30sIHsxMCwgMzA5NX0sIHsxMCwgMzA5M30sIHsxMCwgMzA5MX0sIHsxMCwgMzA4OX0sCisgICAgezEwLCAzMDg3fSwgezEwLCAzMDg1fSwgezEwLCAzMDgzfSwgezEwLCAzMDgxfSwgezEwLCAzMDc5fSwgezEwLCAzMDc3fSwKKyAgICB7MTAsIDMwNzV9LCB7MTAsIDMwNzN9LCB7MTAsIDMwNzF9LCB7MTAsIDMwNjl9LCB7MTAsIDMwNjd9LCB7MTAsIDMwNjV9LAorICAgIHsxMCwgMzA2M30sIHsxMCwgMzA2MX0sIHsxMCwgMzA1OX0sIHsxMCwgMzA1N30sIHsxMCwgMzA1NX0sIHsxMCwgMzA1M30sCisgICAgezEwLCAzMDUxfSwgezEwLCAzMDQ5fSwgezEwLCAzMDQ3fSwgezEwLCAzMDQ1fSwgezEwLCAzMDQzfSwgezEwLCAzMDQxfSwKKyAgICB7MTAsIDMwMzl9LCB7MTAsIDMwMzd9LCB7MTAsIDMwMzV9LCB7MTAsIDMwMzN9LCB7MTAsIDMwMzF9LCB7MTAsIDMwMjl9LAorICAgIHsxMCwgMzAyN30sIHsxMCwgMzAyNX0sIHsxMCwgMzAyM30sIHsxMCwgMzAyMX0sIHsxMCwgMzAxOX0sIHsxMCwgMzAxN30sCisgICAgezEwLCAzMDE1fSwgezEwLCAzMDEzfSwgezEwLCAzMDExfSwgezEwLCAzMDA5fSwgezEwLCAzMDA3fSwgezEwLCAzMDA1fSwKKyAgICB7MTAsIDMwMDN9LCB7MTAsIDMwMDF9LCB7MTAsIDI5OTl9LCB7MTAsIDI5OTd9LCB7MTAsIDI5OTV9LCB7MTAsIDI5OTN9LAorICAgIHsxMCwgMjk5MX0sIHsxMCwgMjk4OX0sIHsxMCwgMjk4N30sIHsxMCwgMjk4NX0sIHsxMCwgMjk4M30sIHsxMCwgMjk4MX0sCisgICAgezEwLCAyOTc5fSwgezEwLCAyOTc3fSwgezEwLCAyOTc1fSwgezEwLCAyOTczfSwgezEwLCAyOTcxfSwgezEwLCAyOTY5fSwKKyAgICB7MTAsIDI5Njd9LCB7MTAsIDI5NjV9LCB7MTAsIDI5NjN9LCB7MTAsIDI5NjF9LCB7MTAsIDI5NTl9LCB7MTAsIDI5NTd9LAorICAgIHsxMCwgMjk1NX0sIHsxMCwgMjk1M30sIHsxMCwgMjk1MX0sIHsxMCwgMjk0OX0sIHsxMCwgMjk0N30sIHsxMCwgMjk0NX0sCisgICAgezEwLCAyOTQzfSwgezEwLCAyOTQxfSwgezEwLCAyOTM5fSwgezEwLCAyOTM3fSwgezEwLCAyOTM1fSwgezEwLCAyOTMzfSwKKyAgICB7MTAsIDI5MzF9LCB7MTAsIDI5Mjl9LCB7MTAsIDI5Mjd9LCB7MTAsIDI5MjV9LCB7MTAsIDI5MjN9LCB7MTAsIDI5MjF9LAorICAgIHsxMCwgMjkxOX0sIHsxMCwgMjkxN30sIHsxMCwgMjkxNX0sIHsxMCwgMjkxM30sIHsxMCwgMjkxMX0sIHsxMCwgMjkwOX0sCisgICAgezEwLCAyOTA3fSwgezEwLCAyOTA1fSwgezEwLCAyOTAzfSwgezEwLCAyOTAxfSwgezEwLCAyODk5fSwgezEwLCAyODk3fSwKKyAgICB7MTAsIDI4OTV9LCB7MTAsIDI4OTN9LCB7MTAsIDI4OTF9LCB7MTAsIDI4ODl9LCB7MTAsIDI4ODd9LCB7MTAsIDI4ODV9LAorICAgIHsxMCwgMjg4M30sIHsxMCwgMjg4MX0sIHsxMCwgMjg3OX0sIHsxMCwgMjg3N30sIHsxMCwgMjg3NX0sIHsxMCwgMjg3M30sCisgICAgezEwLCAyODcxfSwgezEwLCAyODY5fSwgezEwLCAyODY3fSwgezEwLCAyODY1fSwgezEwLCAyODYzfSwgezEwLCAyODYxfSwKKyAgICB7MTAsIDI4NTl9LCB7MTAsIDI4NTd9LCB7MTAsIDI4NTV9LCB7MTAsIDI4NTN9LCB7MTAsIDI4NTF9LCB7MTAsIDI4NDl9LAorICAgIHsxMCwgMjg0N30sIHsxMCwgMjg0NX0sIHsxMCwgMjg0M30sIHsxMCwgMjg0MX0sIHsxMCwgMjgzOX0sIHsxMCwgMjgzN30sCisgICAgezEwLCAyODM1fSwgezEwLCAyODMzfSwgezEwLCAyODMxfSwgezEwLCAyODI5fSwgezEwLCAyODI3fSwgezEwLCAyODI1fSwKKyAgICB7MTAsIDI4MjN9LCB7MTAsIDI4MjF9LCB7MTAsIDI4MTl9LCB7MTAsIDI4MTd9LCB7MTAsIDI4MTV9LCB7MTAsIDI4MTN9LAorICAgIHsxMCwgMjgxMX0sIHsxMCwgMjgwOX0sIHsxMCwgMjgwN30sIHsxMCwgMjgwNX0sIHsxMCwgMjgwM30sIHsxMCwgMjgwMX0sCisgICAgezEwLCAyNzk5fSwgezEwLCAyNzk3fSwgezEwLCAyNzk1fSwgezEwLCAyNzkzfSwgezEwLCAyNzkxfSwgezEwLCAyNzg5fSwKKyAgICB7MTAsIDI3ODd9LCB7MTAsIDI3ODV9LCB7MTAsIDI3ODN9LCB7MTAsIDI3ODF9LCB7MTAsIDI3Nzl9LCB7MTAsIDI3Nzd9LAorICAgIHsxMCwgMjc3NX0sIHsxMCwgMjc3M30sIHsxMCwgMjc3MX0sIHsxMCwgMjc2OX0sIHsxMCwgMjc2N30sIHsxMCwgMjc2NX0sCisgICAgezEwLCAyNzYzfSwgezEwLCAyNzYxfSwgezEwLCAyNzU5fSwgezEwLCAyNzU3fSwgezEwLCAyNzU1fSwgezEwLCAyNzUzfSwKKyAgICB7MTAsIDI3NTF9LCB7MTAsIDI3NDl9LCB7MTAsIDI3NDd9LCB7MTAsIDI3NDV9LCB7MTAsIDI3NDN9LCB7MTAsIDI3NDF9LAorICAgIHsxMCwgMjczOX0sIHsxMCwgMjczN30sIHsxMCwgMjczNX0sIHsxMCwgMjczM30sIHsxMCwgMjczMX0sIHsxMCwgMjcyOX0sCisgICAgezEwLCAyNzI3fSwgezEwLCAyNzI1fSwgezEwLCAyNzIzfSwgezEwLCAyNzIxfSwgezEwLCAyNzE5fSwgezEwLCAyNzE3fSwKKyAgICB7MTAsIDI3MTV9LCB7MTAsIDI3MTN9LCB7MTAsIDI3MTF9LCB7MTAsIDI3MDl9LCB7MTAsIDI3MDd9LCB7MTAsIDI3MDV9LAorICAgIHsxMCwgMjcwM30sIHsxMCwgMjcwMX0sIHsxMCwgMjY5OX0sIHsxMCwgMjY5N30sIHsxMCwgMjY5NX0sIHsxMCwgMjY5M30sCisgICAgezEwLCAyNjkxfSwgezEwLCAyNjg5fSwgezEwLCAyNjg3fSwgezEwLCAyNjg1fSwgezEwLCAyNjgzfSwgezEwLCAyNjgxfSwKKyAgICB7MTAsIDI2Nzl9LCB7MTAsIDI2Nzd9LCB7MTAsIDI2NzV9LCB7MTAsIDI2NzN9LCB7MTAsIDI2NzF9LCB7MTAsIDI2Njl9LAorICAgIHsxMCwgMjY2N30sIHsxMCwgMjY2NX0sIHsxMCwgMjY2M30sIHsxMCwgMjY2MX0sIHsxMCwgMjY1OX0sIHsxMCwgMjY1N30sCisgICAgezEwLCAyNjU1fSwgezEwLCAyNjUzfSwgezEwLCAyNjUxfSwgezEwLCAyNjQ5fSwgezEwLCAyNjQ3fSwgezEwLCAyNjQ1fSwKKyAgICB7MTAsIDI2NDN9LCB7MTAsIDI2NDF9LCB7MTAsIDI2Mzl9LCB7MTAsIDI2Mzd9LCB7MTAsIDI2MzV9LCB7MTAsIDI2MzN9LAorICAgIHsxMCwgMjYzMX0sIHsxMCwgMjYyOX0sIHsxMCwgMjYyN30sIHsxMCwgMjYyNX0sIHsxMCwgMjYyM30sIHsxMCwgMjYyMX0sCisgICAgezEwLCAyNjE5fSwgezEwLCAyNjE3fSwgezEwLCAyNjE1fSwgezEwLCAyNjEzfSwgezEwLCAyNjExfSwgezEwLCAyNjA5fSwKKyAgICB7MTAsIDI2MDd9LCB7MTAsIDI2MDV9LCB7MTAsIDI2MDN9LCB7MTAsIDI2MDF9LCB7MTAsIDI1OTl9LCB7MTAsIDI1OTd9LAorICAgIHsxMCwgMjU5NX0sIHsxMCwgMjU5M30sIHsxMCwgMjU5MX0sIHsxMCwgMjU4OX0sIHsxMCwgMjU4N30sIHsxMCwgMjU4NX0sCisgICAgezEwLCAyNTgzfSwgezEwLCAyNTgxfSwgezEwLCAyNTc5fSwgezEwLCAyNTc3fSwgezEwLCAyNTc1fSwgezEwLCAyNTczfSwKKyAgICB7MTAsIDI1NzF9LCB7MTAsIDI1Njl9LCB7MTAsIDI1Njd9LCB7MTAsIDI1NjV9LCB7MTAsIDI1NjN9LCB7MTAsIDI1NjF9LAorICAgIHsxMCwgMjU1OX0sIHsxMCwgMjU1N30sIHsxMCwgMjU1NX0sIHsxMCwgMjU1M30sIHsxMCwgMjU1MX0sIHsxMCwgMjU0OX0sCisgICAgezEwLCAyNTQ3fSwgezEwLCAyNTQ1fSwgezEwLCAyNTQzfSwgezEwLCAyNTQxfSwgezEwLCAyNTM5fSwgezEwLCAyNTM3fSwKKyAgICB7MTAsIDI1MzV9LCB7MTAsIDI1MzN9LCB7MTAsIDI1MzF9LCB7MTAsIDI1Mjl9LCB7MTAsIDI1Mjd9LCB7MTAsIDI1MjV9LAorICAgIHsxMCwgMjUyM30sIHsxMCwgMjUyMX0sIHsxMCwgMjUxOX0sIHsxMCwgMjUxN30sIHsxMCwgMjUxNX0sIHsxMCwgMjUxM30sCisgICAgezEwLCAyNTExfSwgezEwLCAyNTA5fSwgezEwLCAyNTA3fSwgezEwLCAyNTA1fSwgezEwLCAyNTAzfSwgezEwLCAyNTAxfSwKKyAgICB7MTAsIDI0OTl9LCB7MTAsIDI0OTd9LCB7MTAsIDI0OTV9LCB7MTAsIDI0OTN9LCB7MTAsIDI0OTF9LCB7MTAsIDI0ODl9LAorICAgIHsxMCwgMjQ4N30sIHsxMCwgMjQ4NX0sIHsxMCwgMjQ4M30sIHsxMCwgMjQ4MX0sIHsxMCwgMjQ3OX0sIHsxMCwgMjQ3N30sCisgICAgezEwLCAyNDc1fSwgezEwLCAyNDczfSwgezEwLCAyNDcxfSwgezEwLCAyNDY5fSwgezEwLCAyNDY3fSwgezEwLCAyNDY1fSwKKyAgICB7MTAsIDI0NjN9LCB7MTAsIDI0NjF9LCB7MTAsIDI0NTl9LCB7MTAsIDI0NTd9LCB7MTAsIDI0NTV9LCB7MTAsIDI0NTN9LAorICAgIHsxMCwgMjQ1MX0sIHsxMCwgMjQ0OX0sIHsxMCwgMjQ0N30sIHsxMCwgMjQ0NX0sIHsxMCwgMjQ0M30sIHsxMCwgMjQ0MX0sCisgICAgezEwLCAyNDM5fSwgezEwLCAyNDM3fSwgezEwLCAyNDM1fSwgezEwLCAyNDMzfSwgezEwLCAyNDMxfSwgezEwLCAyNDI5fSwKKyAgICB7MTAsIDI0Mjd9LCB7MTAsIDI0MjV9LCB7MTAsIDI0MjN9LCB7MTAsIDI0MjF9LCB7MTAsIDI0MTl9LCB7MTAsIDI0MTd9LAorICAgIHsxMCwgMjQxNX0sIHsxMCwgMjQxM30sIHsxMCwgMjQxMX0sIHsxMCwgMjQwOX0sIHsxMCwgMjQwN30sIHsxMCwgMjQwNX0sCisgICAgezEwLCAyNDAzfSwgezEwLCAyNDAxfSwgezEwLCAyMzk5fSwgezEwLCAyMzk3fSwgezEwLCAyMzk1fSwgezEwLCAyMzkzfSwKKyAgICB7MTAsIDIzOTF9LCB7MTAsIDIzODl9LCB7MTAsIDIzODd9LCB7MTAsIDIzODV9LCB7MTAsIDIzODN9LCB7MTAsIDIzODF9LAorICAgIHsxMCwgMjM3OX0sIHsxMCwgMjM3N30sIHsxMCwgMjM3NX0sIHsxMCwgMjM3M30sIHsxMCwgMjM3MX0sIHsxMCwgMjM2OX0sCisgICAgezEwLCAyMzY3fSwgezEwLCAyMzY1fSwgezEwLCAyMzYzfSwgezEwLCAyMzYxfSwgezEwLCAyMzU5fSwgezEwLCAyMzU3fSwKKyAgICB7MTAsIDIzNTV9LCB7MTAsIDIzNTN9LCB7MTAsIDIzNTF9LCB7MTAsIDIzNDl9LCB7MTAsIDIzNDd9LCB7MTAsIDIzNDV9LAorICAgIHsxMCwgMjM0M30sIHsxMCwgMjM0MX0sIHsxMCwgMjMzOX0sIHsxMCwgMjMzN30sIHsxMCwgMjMzNX0sIHsxMCwgMjMzM30sCisgICAgezEwLCAyMzMxfSwgezEwLCAyMzI5fSwgezEwLCAyMzI3fSwgezEwLCAyMzI1fSwgezEwLCAyMzIzfSwgezEwLCAyMzIxfSwKKyAgICB7MTAsIDIzMTl9LCB7MTAsIDIzMTd9LCB7MTAsIDIzMTV9LCB7MTAsIDIzMTN9LCB7MTAsIDIzMTF9LCB7MTAsIDIzMDl9LAorICAgIHsxMCwgMjMwN30sIHsxMCwgMjMwNX0sIHsxMCwgMjMwM30sIHsxMCwgMjMwMX0sIHsxMCwgMjI5OX0sIHsxMCwgMjI5N30sCisgICAgezEwLCAyMjk1fSwgezEwLCAyMjkzfSwgezEwLCAyMjkxfSwgezEwLCAyMjg5fSwgezEwLCAyMjg3fSwgezEwLCAyMjg1fSwKKyAgICB7MTAsIDIyODN9LCB7MTAsIDIyODF9LCB7MTAsIDIyNzl9LCB7MTAsIDIyNzd9LCB7MTAsIDIyNzV9LCB7MTAsIDIyNzN9LAorICAgIHsxMCwgMjI3MX0sIHsxMCwgMjI2OX0sIHsxMCwgMjI2N30sIHsxMCwgMjI2NX0sIHsxMCwgMjI2M30sIHsxMCwgMjI2MX0sCisgICAgezEwLCAyMjU5fSwgezEwLCAyMjU3fSwgezEwLCAyMjU1fSwgezEwLCAyMjUzfSwgezEwLCAyMjUxfSwgezEwLCAyMjQ5fSwKKyAgICB7MTAsIDIyNDd9LCB7MTAsIDIyNDV9LCB7MTAsIDIyNDN9LCB7MTAsIDIyNDF9LCB7MTAsIDIyMzl9LCB7MTAsIDIyMzd9LAorICAgIHsxMCwgMjIzNX0sIHsxMCwgMjIzM30sIHsxMCwgMjIzMX0sIHsxMCwgMjIyOX0sIHsxMCwgMjIyN30sIHsxMCwgMjIyNX0sCisgICAgezEwLCAyMjIzfSwgezEwLCAyMjIxfSwgezEwLCAyMjE5fSwgezEwLCAyMjE3fSwgezEwLCAyMjE1fSwgezEwLCAyMjEzfSwKKyAgICB7MTAsIDIyMTF9LCB7MTAsIDIyMDl9LCB7MTAsIDIyMDd9LCB7MTAsIDIyMDV9LCB7MTAsIDIyMDN9LCB7MTAsIDIyMDF9LAorICAgIHsxMCwgMjE5OX0sIHsxMCwgMjE5N30sIHsxMCwgMjE5NX0sIHsxMCwgMjE5M30sIHsxMCwgMjE5MX0sIHsxMCwgMjE4OX0sCisgICAgezEwLCAyMTg3fSwgezEwLCAyMTg1fSwgezEwLCAyMTgzfSwgezEwLCAyMTgxfSwgezEwLCAyMTc5fSwgezEwLCAyMTc3fSwKKyAgICB7MTAsIDIxNzV9LCB7MTAsIDIxNzN9LCB7MTAsIDIxNzF9LCB7MTAsIDIxNjl9LCB7MTAsIDIxNjd9LCB7MTAsIDIxNjV9LAorICAgIHsxMCwgMjE2M30sIHsxMCwgMjE2MX0sIHsxMCwgMjE1OX0sIHsxMCwgMjE1N30sIHsxMCwgMjE1NX0sIHsxMCwgMjE1M30sCisgICAgezEwLCAyMTUxfSwgezEwLCAyMTQ5fSwgezEwLCAyMTQ3fSwgezEwLCAyMTQ1fSwgezEwLCAyMTQzfSwgezEwLCAyMTQxfSwKKyAgICB7MTAsIDIxMzl9LCB7MTAsIDIxMzd9LCB7MTAsIDIxMzV9LCB7MTAsIDIxMzN9LCB7MTAsIDIxMzF9LCB7MTAsIDIxMjl9LAorICAgIHsxMCwgMjEyN30sIHsxMCwgMjEyNX0sIHsxMCwgMjEyM30sIHsxMCwgMjEyMX0sIHsxMCwgMjExOX0sIHsxMCwgMjExN30sCisgICAgezEwLCAyMTE1fSwgezEwLCAyMTEzfSwgezEwLCAyMTExfSwgezEwLCAyMTA5fSwgezEwLCAyMTA3fSwgezEwLCAyMTA1fSwKKyAgICB7MTAsIDIxMDN9LCB7MTAsIDIxMDF9LCB7MTAsIDIwOTl9LCB7MTAsIDIwOTd9LCB7MTAsIDIwOTV9LCB7MTAsIDIwOTN9LAorICAgIHsxMCwgMjA5MX0sIHsxMCwgMjA4OX0sIHsxMCwgMjA4N30sIHsxMCwgMjA4NX0sIHsxMCwgMjA4M30sIHsxMCwgMjA4MX0sCisgICAgezEwLCAyMDc5fSwgezEwLCAyMDc3fSwgezEwLCAyMDc1fSwgezEwLCAyMDczfSwgezEwLCAyMDcxfSwgezEwLCAyMDY5fSwKKyAgICB7MTAsIDIwNjd9LCB7MTAsIDIwNjV9LCB7MTAsIDIwNjN9LCB7MTAsIDIwNjF9LCB7MTAsIDIwNTl9LCB7MTAsIDIwNTd9LAorICAgIHsxMCwgMjA1NX0sIHsxMCwgMjA1M30sIHsxMCwgMjA1MX0sIHsxMCwgMjA0OX0sIHsxMCwgMjA0N30sIHsxMCwgMjA0NX0sCisgICAgezEwLCAyMDQzfSwgezEwLCAyMDQxfSwgezEwLCAyMDM5fSwgezEwLCAyMDM3fSwgezEwLCAyMDM1fSwgezEwLCAyMDMzfSwKKyAgICB7MTAsIDIwMzF9LCB7MTAsIDIwMjl9LCB7MTAsIDIwMjd9LCB7MTAsIDIwMjV9LCB7MTAsIDIwMjN9LCB7MTAsIDIwMjF9LAorICAgIHsxMCwgMjAxOX0sIHsxMCwgMjAxN30sIHsxMCwgMjAxNX0sIHsxMCwgMjAxM30sIHsxMCwgMjAxMX0sIHsxMCwgMjAwOX0sCisgICAgezEwLCAyMDA3fSwgezEwLCAyMDA1fSwgezEwLCAyMDAzfSwgezEwLCAyMDAxfSwgezEwLCAxOTk5fSwgezEwLCAxOTk3fSwKKyAgICB7MTAsIDE5OTV9LCB7MTAsIDE5OTN9LCB7MTAsIDE5OTF9LCB7MTAsIDE5ODl9LCB7MTAsIDE5ODd9LCB7MTAsIDE5ODV9LAorICAgIHsxMCwgMTk4M30sIHsxMCwgMTk4MX0sIHsxMCwgMTk3OX0sIHsxMCwgMTk3N30sIHsxMCwgMTk3NX0sIHsxMCwgMTk3M30sCisgICAgezEwLCAxOTcxfSwgezEwLCAxOTY5fSwgezEwLCAxOTY3fSwgezEwLCAxOTY1fSwgezEwLCAxOTYzfSwgezEwLCAxOTYxfSwKKyAgICB7MTAsIDE5NTl9LCB7MTAsIDE5NTd9LCB7MTAsIDE5NTV9LCB7MTAsIDE5NTN9LCB7MTAsIDE5NTF9LCB7MTAsIDE5NDl9LAorICAgIHsxMCwgMTk0N30sIHsxMCwgMTk0NX0sIHsxMCwgMTk0M30sIHsxMCwgMTk0MX0sIHsxMCwgMTkzOX0sIHsxMCwgMTkzN30sCisgICAgezEwLCAxOTM1fSwgezEwLCAxOTMzfSwgezEwLCAxOTMxfSwgezEwLCAxOTI5fSwgezEwLCAxOTI3fSwgezEwLCAxOTI1fSwKKyAgICB7MTAsIDE5MjN9LCB7MTAsIDE5MjF9LCB7MTAsIDE5MTl9LCB7MTAsIDE5MTd9LCB7MTAsIDE5MTV9LCB7MTAsIDE5MTN9LAorICAgIHsxMCwgMTkxMX0sIHsxMCwgMTkwOX0sIHsxMCwgMTkwN30sIHsxMCwgMTkwNX0sIHsxMCwgMTkwM30sIHsxMCwgMTkwMX0sCisgICAgezEwLCAxODk5fSwgezEwLCAxODk3fSwgezEwLCAxODk1fSwgezEwLCAxODkzfSwgezEwLCAxODkxfSwgezEwLCAxODg5fSwKKyAgICB7MTAsIDE4ODd9LCB7MTAsIDE4ODV9LCB7MTAsIDE4ODN9LCB7MTAsIDE4ODF9LCB7MTAsIDE4Nzl9LCB7MTAsIDE4Nzd9LAorICAgIHsxMCwgMTg3NX0sIHsxMCwgMTg3M30sIHsxMCwgMTg3MX0sIHsxMCwgMTg2OX0sIHsxMCwgMTg2N30sIHsxMCwgMTg2NX0sCisgICAgezEwLCAxODYzfSwgezEwLCAxODYxfSwgezEwLCAxODU5fSwgezEwLCAxODU3fSwgezEwLCAxODU1fSwgezEwLCAxODUzfSwKKyAgICB7MTAsIDE4NTF9LCB7MTAsIDE4NDl9LCB7MTAsIDE4NDd9LCB7MTAsIDE4NDV9LCB7MTAsIDE4NDN9LCB7MTAsIDE4NDF9LAorICAgIHsxMCwgMTgzOX0sIHsxMCwgMTgzN30sIHsxMCwgMTgzNX0sIHsxMCwgMTgzM30sIHsxMCwgMTgzMX0sIHsxMCwgMTgyOX0sCisgICAgezEwLCAxODI3fSwgezEwLCAxODI1fSwgezEwLCAxODIzfSwgezEwLCAxODIxfSwgezEwLCAxODE5fSwgezEwLCAxODE3fSwKKyAgICB7MTAsIDE4MTV9LCB7MTAsIDE4MTN9LCB7MTAsIDE4MTF9LCB7MTAsIDE4MDl9LCB7MTAsIDE4MDd9LCB7MTAsIDE4MDV9LAorICAgIHsxMCwgMTgwM30sIHsxMCwgMTgwMX0sIHsxMCwgMTc5OX0sIHsxMCwgMTc5N30sIHsxMCwgMTc5NX0sIHsxMCwgMTc5M30sCisgICAgezEwLCAxNzkxfSwgezEwLCAxNzg5fSwgezEwLCAxNzg3fSwgezEwLCAxNzg1fSwgezEwLCAxNzgzfSwgezEwLCAxNzgxfSwKKyAgICB7MTAsIDE3Nzl9LCB7MTAsIDE3Nzd9LCB7MTAsIDE3NzV9LCB7MTAsIDE3NzN9LCB7MTAsIDE3NzF9LCB7MTAsIDE3Njl9LAorICAgIHsxMCwgMTc2N30sIHsxMCwgMTc2NX0sIHsxMCwgMTc2M30sIHsxMCwgMTc2MX0sIHsxMCwgMTc1OX0sIHsxMCwgMTc1N30sCisgICAgezEwLCAxNzU1fSwgezEwLCAxNzUzfSwgezEwLCAxNzUxfSwgezEwLCAxNzQ5fSwgezEwLCAxNzQ3fSwgezEwLCAxNzQ1fSwKKyAgICB7MTAsIDE3NDN9LCB7MTAsIDE3NDF9LCB7MTAsIDE3Mzl9LCB7MTAsIDE3Mzd9LCB7MTAsIDE3MzV9LCB7MTAsIDE3MzN9LAorICAgIHsxMCwgMTczMX0sIHsxMCwgMTcyOX0sIHsxMCwgMTcyN30sIHsxMCwgMTcyNX0sIHsxMCwgMTcyM30sIHsxMCwgMTcyMX0sCisgICAgezEwLCAxNzE5fSwgezEwLCAxNzE3fSwgezEwLCAxNzE1fSwgezEwLCAxNzEzfSwgezEwLCAxNzExfSwgezEwLCAxNzA5fSwKKyAgICB7MTAsIDE3MDd9LCB7MTAsIDE3MDV9LCB7MTAsIDE3MDN9LCB7MTAsIDE3MDF9LCB7MTAsIDE2OTl9LCB7MTAsIDE2OTd9LAorICAgIHsxMCwgMTY5NX0sIHsxMCwgMTY5M30sIHsxMCwgMTY5MX0sIHsxMCwgMTY4OX0sIHsxMCwgMTY4N30sIHsxMCwgMTY4NX0sCisgICAgezEwLCAxNjgzfSwgezEwLCAxNjgxfSwgezEwLCAxNjc5fSwgezEwLCAxNjc3fSwgezEwLCAxNjc1fSwgezEwLCAxNjczfSwKKyAgICB7MTAsIDE2NzF9LCB7MTAsIDE2Njl9LCB7MTAsIDE2Njd9LCB7MTAsIDE2NjV9LCB7MTAsIDE2NjN9LCB7MTAsIDE2NjF9LAorICAgIHsxMCwgMTY1OX0sIHsxMCwgMTY1N30sIHsxMCwgMTY1NX0sIHsxMCwgMTY1M30sIHsxMCwgMTY1MX0sIHsxMCwgMTY0OX0sCisgICAgezEwLCAxNjQ3fSwgezEwLCAxNjQ1fSwgezEwLCAxNjQzfSwgezEwLCAxNjQxfSwgezEwLCAxNjM5fSwgezEwLCAxNjM3fSwKKyAgICB7MTAsIDE2MzV9LCB7MTAsIDE2MzN9LCB7MTAsIDE2MzF9LCB7MTAsIDE2Mjl9LCB7MTAsIDE2Mjd9LCB7MTAsIDE2MjV9LAorICAgIHsxMCwgMTYyM30sIHsxMCwgMTYyMX0sIHsxMCwgMTYxOX0sIHsxMCwgMTYxN30sIHsxMCwgMTYxNX0sIHsxMCwgMTYxM30sCisgICAgezEwLCAxNjExfSwgezEwLCAxNjA5fSwgezEwLCAxNjA3fSwgezEwLCAxNjA1fSwgezEwLCAxNjAzfSwgezEwLCAxNjAxfSwKKyAgICB7MTAsIDE1OTl9LCB7MTAsIDE1OTd9LCB7MTAsIDE1OTV9LCB7MTAsIDE1OTN9LCB7MTAsIDE1OTF9LCB7MTAsIDE1ODl9LAorICAgIHsxMCwgMTU4N30sIHsxMCwgMTU4NX0sIHsxMCwgMTU4M30sIHsxMCwgMTU4MX0sIHsxMCwgMTU3OX0sIHsxMCwgMTU3N30sCisgICAgezEwLCAxNTc1fSwgezEwLCAxNTczfSwgezEwLCAxNTcxfSwgezEwLCAxNTY5fSwgezEwLCAxNTY3fSwgezEwLCAxNTY1fSwKKyAgICB7MTAsIDE1NjN9LCB7MTAsIDE1NjF9LCB7MTAsIDE1NTl9LCB7MTAsIDE1NTd9LCB7MTAsIDE1NTV9LCB7MTAsIDE1NTN9LAorICAgIHsxMCwgMTU1MX0sIHsxMCwgMTU0OX0sIHsxMCwgMTU0N30sIHsxMCwgMTU0NX0sIHsxMCwgMTU0M30sIHsxMCwgMTU0MX0sCisgICAgezEwLCAxNTM5fSwgezEwLCAxNTM3fSwgezEwLCAxNTM1fSwgezEwLCAxNTMzfSwgezEwLCAxNTMxfSwgezEwLCAxNTI5fSwKKyAgICB7MTAsIDE1Mjd9LCB7MTAsIDE1MjV9LCB7MTAsIDE1MjN9LCB7MTAsIDE1MjF9LCB7MTAsIDE1MTl9LCB7MTAsIDE1MTd9LAorICAgIHsxMCwgMTUxNX0sIHsxMCwgMTUxM30sIHsxMCwgMTUxMX0sIHsxMCwgMTUwOX0sIHsxMCwgMTUwN30sIHsxMCwgMTUwNX0sCisgICAgezEwLCAxNTAzfSwgezEwLCAxNTAxfSwgezEwLCAxNDk5fSwgezEwLCAxNDk3fSwgezEwLCAxNDk1fSwgezEwLCAxNDkzfSwKKyAgICB7MTAsIDE0OTF9LCB7MTAsIDE0ODl9LCB7MTAsIDE0ODd9LCB7MTAsIDE0ODV9LCB7MTAsIDE0ODN9LCB7MTAsIDE0ODF9LAorICAgIHsxMCwgMTQ3OX0sIHsxMCwgMTQ3N30sIHsxMCwgMTQ3NX0sIHsxMCwgMTQ3M30sIHsxMCwgMTQ3MX0sIHsxMCwgMTQ2OX0sCisgICAgezEwLCAxNDY3fSwgezEwLCAxNDY1fSwgezEwLCAxNDYzfSwgezEwLCAxNDYxfSwgezEwLCAxNDU5fSwgezEwLCAxNDU3fSwKKyAgICB7MTAsIDE0NTV9LCB7MTAsIDE0NTN9LCB7MTAsIDE0NTF9LCB7MTAsIDE0NDl9LCB7MTAsIDE0NDd9LCB7MTAsIDE0NDV9LAorICAgIHsxMCwgMTQ0M30sIHsxMCwgMTQ0MX0sIHsxMCwgMTQzOX0sIHsxMCwgMTQzN30sIHsxMCwgMTQzNX0sIHsxMCwgMTQzM30sCisgICAgezEwLCAxNDMxfSwgezEwLCAxNDI5fSwgezEwLCAxNDI3fSwgezEwLCAxNDI1fSwgezEwLCAxNDIzfSwgezEwLCAxNDIxfSwKKyAgICB7MTAsIDE0MTl9LCB7MTAsIDE0MTd9LCB7MTAsIDE0MTV9LCB7MTAsIDE0MTN9LCB7MTAsIDE0MTF9LCB7MTAsIDE0MDl9LAorICAgIHsxMCwgMTQwN30sIHsxMCwgMTQwNX0sIHsxMCwgMTQwM30sIHsxMCwgMTQwMX0sIHsxMCwgMTM5OX0sIHsxMCwgMTM5N30sCisgICAgezEwLCAxMzk1fSwgezEwLCAxMzkzfSwgezEwLCAxMzkxfSwgezEwLCAxMzg5fSwgezEwLCAxMzg3fSwgezEwLCAxMzg1fSwKKyAgICB7MTAsIDEzODN9LCB7MTAsIDEzODF9LCB7MTAsIDEzNzl9LCB7MTAsIDEzNzd9LCB7MTAsIDEzNzV9LCB7MTAsIDEzNzN9LAorICAgIHsxMCwgMTM3MX0sIHsxMCwgMTM2OX0sIHsxMCwgMTM2N30sIHsxMCwgMTM2NX0sIHsxMCwgMTM2M30sIHsxMCwgMTM2MX0sCisgICAgezEwLCAxMzU5fSwgezEwLCAxMzU3fSwgezEwLCAxMzU1fSwgezEwLCAxMzUzfSwgezEwLCAxMzUxfSwgezEwLCAxMzQ5fSwKKyAgICB7MTAsIDEzNDd9LCB7MTAsIDEzNDV9LCB7MTAsIDEzNDN9LCB7MTAsIDEzNDF9LCB7MTAsIDEzMzl9LCB7MTAsIDEzMzd9LAorICAgIHsxMCwgMTMzNX0sIHsxMCwgMTMzM30sIHsxMCwgMTMzMX0sIHsxMCwgMTMyOX0sIHsxMCwgMTMyN30sIHsxMCwgMTMyNX0sCisgICAgezEwLCAxMzIzfSwgezEwLCAxMzIxfSwgezEwLCAxMzE5fSwgezEwLCAxMzE3fSwgezEwLCAxMzE1fSwgezEwLCAxMzEzfSwKKyAgICB7MTAsIDEzMTF9LCB7MTAsIDEzMDl9LCB7MTAsIDEzMDd9LCB7MTAsIDEzMDV9LCB7MTAsIDEzMDN9LCB7MTAsIDEzMDF9LAorICAgIHsxMCwgMTI5OX0sIHsxMCwgMTI5N30sIHsxMCwgMTI5NX0sIHsxMCwgMTI5M30sIHsxMCwgMTI5MX0sIHsxMCwgMTI4OX0sCisgICAgezEwLCAxMjg3fSwgezEwLCAxMjg1fSwgezEwLCAxMjgzfSwgezEwLCAxMjgxfSwgezEwLCAxMjc5fSwgezEwLCAxMjc3fSwKKyAgICB7MTAsIDEyNzV9LCB7MTAsIDEyNzN9LCB7MTAsIDEyNzF9LCB7MTAsIDEyNjl9LCB7MTAsIDEyNjd9LCB7MTAsIDEyNjV9LAorICAgIHsxMCwgMTI2M30sIHsxMCwgMTI2MX0sIHsxMCwgMTI1OX0sIHsxMCwgMTI1N30sIHsxMCwgMTI1NX0sIHsxMCwgMTI1M30sCisgICAgezEwLCAxMjUxfSwgezEwLCAxMjQ5fSwgezEwLCAxMjQ3fSwgezEwLCAxMjQ1fSwgezEwLCAxMjQzfSwgezEwLCAxMjQxfSwKKyAgICB7MTAsIDEyMzl9LCB7MTAsIDEyMzd9LCB7MTAsIDEyMzV9LCB7MTAsIDEyMzN9LCB7MTAsIDEyMzF9LCB7MTAsIDEyMjl9LAorICAgIHsxMCwgMTIyN30sIHsxMCwgMTIyNX0sIHsxMCwgMTIyM30sIHsxMCwgMTIyMX0sIHsxMCwgMTIxOX0sIHsxMCwgMTIxN30sCisgICAgezEwLCAxMjE1fSwgezEwLCAxMjEzfSwgezEwLCAxMjExfSwgezEwLCAxMjA5fSwgezEwLCAxMjA3fSwgezEwLCAxMjA1fSwKKyAgICB7MTAsIDEyMDN9LCB7MTAsIDEyMDF9LCB7MTAsIDExOTl9LCB7MTAsIDExOTd9LCB7MTAsIDExOTV9LCB7MTAsIDExOTN9LAorICAgIHsxMCwgMTE5MX0sIHsxMCwgMTE4OX0sIHsxMCwgMTE4N30sIHsxMCwgMTE4NX0sIHsxMCwgMTE4M30sIHsxMCwgMTE4MX0sCisgICAgezEwLCAxMTc5fSwgezEwLCAxMTc3fSwgezEwLCAxMTc1fSwgezEwLCAxMTczfSwgezEwLCAxMTcxfSwgezEwLCAxMTY5fSwKKyAgICB7MTAsIDExNjd9LCB7MTAsIDExNjV9LCB7MTAsIDExNjN9LCB7MTAsIDExNjF9LCB7MTAsIDExNTl9LCB7MTAsIDExNTd9LAorICAgIHsxMCwgMTE1NX0sIHsxMCwgMTE1M30sIHsxMCwgMTE1MX0sIHsxMCwgMTE0OX0sIHsxMCwgMTE0N30sIHsxMCwgMTE0NX0sCisgICAgezEwLCAxMTQzfSwgezEwLCAxMTQxfSwgezEwLCAxMTM5fSwgezEwLCAxMTM3fSwgezEwLCAxMTM1fSwgezEwLCAxMTMzfSwKKyAgICB7MTAsIDExMzF9LCB7MTAsIDExMjl9LCB7MTAsIDExMjd9LCB7MTAsIDExMjV9LCB7MTAsIDExMjN9LCB7MTAsIDExMjF9LAorICAgIHsxMCwgMTExOX0sIHsxMCwgMTExN30sIHsxMCwgMTExNX0sIHsxMCwgMTExM30sIHsxMCwgMTExMX0sIHsxMCwgMTEwOX0sCisgICAgezEwLCAxMTA3fSwgezEwLCAxMTA1fSwgezEwLCAxMTAzfSwgezEwLCAxMTAxfSwgezEwLCAxMDk5fSwgezEwLCAxMDk3fSwKKyAgICB7MTAsIDEwOTV9LCB7MTAsIDEwOTN9LCB7MTAsIDEwOTF9LCB7MTAsIDEwODl9LCB7MTAsIDEwODd9LCB7MTAsIDEwODV9LAorICAgIHsxMCwgMTA4M30sIHsxMCwgMTA4MX0sIHsxMCwgMTA3OX0sIHsxMCwgMTA3N30sIHsxMCwgMTA3NX0sIHsxMCwgMTA3M30sCisgICAgezEwLCAxMDcxfSwgezEwLCAxMDY5fSwgezEwLCAxMDY3fSwgezEwLCAxMDY1fSwgezEwLCAxMDYzfSwgezEwLCAxMDYxfSwKKyAgICB7MTAsIDEwNTl9LCB7MTAsIDEwNTd9LCB7MTAsIDEwNTV9LCB7MTAsIDEwNTN9LCB7MTAsIDEwNTF9LCB7MTAsIDEwNDl9LAorICAgIHsxMCwgMTA0N30sIHsxMCwgMTA0NX0sIHsxMCwgMTA0M30sIHsxMCwgMTA0MX0sIHsxMCwgMTAzOX0sIHsxMCwgMTAzN30sCisgICAgezEwLCAxMDM1fSwgezEwLCAxMDMzfSwgezEwLCAxMDMxfSwgezEwLCAxMDI5fSwgezEwLCAxMDI3fSwgezEwLCAxMDI1fSwKKyAgICB7MTAsIDEwMjN9LCB7MTAsIDEwMjF9LCB7MTAsIDEwMTl9LCB7MTAsIDEwMTd9LCB7MTAsIDEwMTV9LCB7MTAsIDEwMTN9LAorICAgIHsxMCwgMTAxMX0sIHsxMCwgMTAwOX0sIHsxMCwgMTAwN30sIHsxMCwgMTAwNX0sIHsxMCwgMTAwM30sIHsxMCwgMTAwMX0sCisgICAgezEwLCA5OTl9LCB7MTAsIDk5N30sIHsxMCwgOTk1fSwgezEwLCA5OTN9LCB7MTAsIDk5MX0sIHsxMCwgOTg5fSwKKyAgICB7MTAsIDk4N30sIHsxMCwgOTg1fSwgezEwLCA5ODN9LCB7MTAsIDk4MX0sIHsxMCwgOTc5fSwgezEwLCA5Nzd9LAorICAgIHsxMCwgOTc1fSwgezEwLCA5NzN9LCB7MTAsIDk3MX0sIHsxMCwgOTY5fSwgezEwLCA5Njd9LCB7MTAsIDk2NX0sCisgICAgezEwLCA5NjN9LCB7MTAsIDk2MX0sIHsxMCwgOTU5fSwgezEwLCA5NTd9LCB7MTAsIDk1NX0sIHsxMCwgOTUzfSwKKyAgICB7MTAsIDk1MX0sIHsxMCwgOTQ5fSwgezEwLCA5NDd9LCB7MTAsIDk0NX0sIHsxMCwgOTQzfSwgezEwLCA5NDF9LAorICAgIHsxMCwgOTM5fSwgezEwLCA5Mzd9LCB7MTAsIDkzNX0sIHsxMCwgOTMzfSwgezEwLCA5MzF9LCB7MTAsIDkyOX0sCisgICAgezEwLCA5Mjd9LCB7MTAsIDkyNX0sIHsxMCwgOTIzfSwgezEwLCA5MjF9LCB7MTAsIDkxOX0sIHsxMCwgOTE3fSwKKyAgICB7MTAsIDkxNX0sIHsxMCwgOTEzfSwgezEwLCA5MTF9LCB7MTAsIDkwOX0sIHsxMCwgOTA3fSwgezEwLCA5MDV9LAorICAgIHsxMCwgOTAzfSwgezEwLCA5MDF9LCB7MTAsIDg5OX0sIHsxMCwgODk3fSwgezEwLCA4OTV9LCB7MTAsIDg5M30sCisgICAgezEwLCA4OTF9LCB7MTAsIDg4OX0sIHsxMCwgODg3fSwgezEwLCA4ODV9LCB7MTAsIDg4M30sIHsxMCwgODgxfSwKKyAgICB7MTAsIDg3OX0sIHsxMCwgODc3fSwgezEwLCA4NzV9LCB7MTAsIDg3M30sIHsxMCwgODcxfSwgezEwLCA4Njl9LAorICAgIHsxMCwgODY3fSwgezEwLCA4NjV9LCB7MTAsIDg2M30sIHsxMCwgODYxfSwgezEwLCA4NTl9LCB7MTAsIDg1N30sCisgICAgezEwLCA4NTV9LCB7MTAsIDg1M30sIHsxMCwgODUxfSwgezEwLCA4NDl9LCB7MTAsIDg0N30sIHsxMCwgODQ1fSwKKyAgICB7MTAsIDg0M30sIHsxMCwgODQxfSwgezEwLCA4Mzl9LCB7MTAsIDgzN30sIHsxMCwgODM1fSwgezEwLCA4MzN9LAorICAgIHsxMCwgODMxfSwgezEwLCA4Mjl9LCB7MTAsIDgyN30sIHsxMCwgODI1fSwgezEwLCA4MjN9LCB7MTAsIDgyMX0sCisgICAgezEwLCA4MTl9LCB7MTAsIDgxN30sIHsxMCwgODE1fSwgezEwLCA4MTN9LCB7MTAsIDgxMX0sIHsxMCwgODA5fSwKKyAgICB7MTAsIDgwN30sIHsxMCwgODA1fSwgezEwLCA4MDN9LCB7MTAsIDgwMX0sIHsxMCwgNzk5fSwgezEwLCA3OTd9LAorICAgIHsxMCwgNzk1fSwgezEwLCA3OTN9LCB7MTAsIDc5MX0sIHsxMCwgNzg5fSwgezEwLCA3ODd9LCB7MTAsIDc4NX0sCisgICAgezEwLCA3ODN9LCB7MTAsIDc4MX0sIHsxMCwgNzc5fSwgezEwLCA3Nzd9LCB7MTAsIDc3NX0sIHsxMCwgNzczfSwKKyAgICB7MTAsIDc3MX0sIHsxMCwgNzY5fSwgezEwLCA3Njd9LCB7MTAsIDc2NX0sIHsxMCwgNzYzfSwgezEwLCA3NjF9LAorICAgIHsxMCwgNzU5fSwgezEwLCA3NTd9LCB7MTAsIDc1NX0sIHsxMCwgNzUzfSwgezEwLCA3NTF9LCB7MTAsIDc0OX0sCisgICAgezEwLCA3NDd9LCB7MTAsIDc0NX0sIHsxMCwgNzQzfSwgezEwLCA3NDF9LCB7MTAsIDczOX0sIHsxMCwgNzM3fSwKKyAgICB7MTAsIDczNX0sIHsxMCwgNzMzfSwgezEwLCA3MzF9LCB7MTAsIDcyOX0sIHsxMCwgNzI3fSwgezEwLCA3MjV9LAorICAgIHsxMCwgNzIzfSwgezEwLCA3MjF9LCB7MTAsIDcxOX0sIHsxMCwgNzE3fSwgezEwLCA3MTV9LCB7MTAsIDcxM30sCisgICAgezEwLCA3MTF9LCB7MTAsIDcwOX0sIHsxMCwgNzA3fSwgezEwLCA3MDV9LCB7MTAsIDcwM30sIHsxMCwgNzAxfSwKKyAgICB7MTAsIDY5OX0sIHsxMCwgNjk3fSwgezEwLCA2OTV9LCB7MTAsIDY5M30sIHsxMCwgNjkxfSwgezEwLCA2ODl9LAorICAgIHsxMCwgNjg3fSwgezEwLCA2ODV9LCB7MTAsIDY4M30sIHsxMCwgNjgxfSwgezEwLCA2Nzl9LCB7MTAsIDY3N30sCisgICAgezEwLCA2NzV9LCB7MTAsIDY3M30sIHsxMCwgNjcxfSwgezEwLCA2Njl9LCB7MTAsIDY2N30sIHsxMCwgNjY1fSwKKyAgICB7MTAsIDY2M30sIHsxMCwgNjYxfSwgezEwLCA2NTl9LCB7MTAsIDY1N30sIHsxMCwgNjU1fSwgezEwLCA2NTN9LAorICAgIHsxMCwgNjUxfSwgezEwLCA2NDl9LCB7MTAsIDY0N30sIHsxMCwgNjQ1fSwgezEwLCA2NDN9LCB7MTAsIDY0MX0sCisgICAgezEwLCA2Mzl9LCB7MTAsIDYzN30sIHsxMCwgNjM1fSwgezEwLCA2MzN9LCB7MTAsIDYzMX0sIHsxMCwgNjI5fSwKKyAgICB7MTAsIDYyN30sIHsxMCwgNjI1fSwgezEwLCA2MjN9LCB7MTAsIDYyMX0sIHsxMCwgNjE5fSwgezEwLCA2MTd9LAorICAgIHsxMCwgNjE1fSwgezEwLCA2MTN9LCB7MTAsIDYxMX0sIHsxMCwgNjA5fSwgezEwLCA2MDd9LCB7MTAsIDYwNX0sCisgICAgezEwLCA2MDN9LCB7MTAsIDYwMX0sIHsxMCwgNTk5fSwgezEwLCA1OTd9LCB7MTAsIDU5NX0sIHsxMCwgNTkzfSwKKyAgICB7MTAsIDU5MX0sIHsxMCwgNTg5fSwgezEwLCA1ODd9LCB7MTAsIDU4NX0sIHsxMCwgNTgzfSwgezEwLCA1ODF9LAorICAgIHsxMCwgNTc5fSwgezEwLCA1Nzd9LCB7MTAsIDU3NX0sIHsxMCwgNTczfSwgezEwLCA1NzF9LCB7MTAsIDU2OX0sCisgICAgezEwLCA1Njd9LCB7MTAsIDU2NX0sIHsxMCwgNTYzfSwgezEwLCA1NjF9LCB7MTAsIDU1OX0sIHsxMCwgNTU3fSwKKyAgICB7MTAsIDU1NX0sIHsxMCwgNTUzfSwgezEwLCA1NTF9LCB7MTAsIDU0OX0sIHsxMCwgNTQ3fSwgezEwLCA1NDV9LAorICAgIHsxMCwgNTQzfSwgezEwLCA1NDF9LCB7MTAsIDUzOX0sIHsxMCwgNTM3fSwgezEwLCA1MzV9LCB7MTAsIDUzM30sCisgICAgezEwLCA1MzF9LCB7MTAsIDUyOX0sIHsxMCwgNTI3fSwgezEwLCA1MjV9LCB7MTAsIDUyM30sIHsxMCwgNTIxfSwKKyAgICB7MTAsIDUxOX0sIHsxMCwgNTE3fSwgezEwLCA1MTV9LCB7MTAsIDUxM30sIHsxMCwgNTExfSwgezEwLCA1MDl9LAorICAgIHsxMCwgNTA3fSwgezEwLCA1MDV9LCB7MTAsIDUwM30sIHsxMCwgNTAxfSwgezEwLCA0OTl9LCB7MTAsIDQ5N30sCisgICAgezEwLCA0OTV9LCB7MTAsIDQ5M30sIHsxMCwgNDkxfSwgezEwLCA0ODl9LCB7MTAsIDQ4N30sIHsxMCwgNDg1fSwKKyAgICB7MTAsIDQ4M30sIHsxMCwgNDgxfSwgezEwLCA0Nzl9LCB7MTAsIDQ3N30sIHsxMCwgNDc1fSwgezEwLCA0NzN9LAorICAgIHsxMCwgNDcxfSwgezEwLCA0Njl9LCB7MTAsIDQ2N30sIHsxMCwgNDY1fSwgezEwLCA0NjN9LCB7MTAsIDQ2MX0sCisgICAgezEwLCA0NTl9LCB7MTAsIDQ1N30sIHsxMCwgNDU1fSwgezEwLCA0NTN9LCB7MTAsIDQ1MX0sIHsxMCwgNDQ5fSwKKyAgICB7MTAsIDQ0N30sIHsxMCwgNDQ1fSwgezEwLCA0NDN9LCB7MTAsIDQ0MX0sIHsxMCwgNDM5fSwgezEwLCA0Mzd9LAorICAgIHsxMCwgNDM1fSwgezEwLCA0MzN9LCB7MTAsIDQzMX0sIHsxMCwgNDI5fSwgezEwLCA0Mjd9LCB7MTAsIDQyNX0sCisgICAgezEwLCA0MjN9LCB7MTAsIDQyMX0sIHsxMCwgNDE5fSwgezEwLCA0MTd9LCB7MTAsIDQxNX0sIHsxMCwgNDEzfSwKKyAgICB7MTAsIDQxMX0sIHsxMCwgNDA5fSwgezEwLCA0MDd9LCB7MTAsIDQwNX0sIHsxMCwgNDAzfSwgezEwLCA0MDF9LAorICAgIHsxMCwgMzk5fSwgezEwLCAzOTd9LCB7MTAsIDM5NX0sIHsxMCwgMzkzfSwgezEwLCAzOTF9LCB7MTAsIDM4OX0sCisgICAgezEwLCAzODd9LCB7MTAsIDM4NX0sIHsxMCwgMzgzfSwgezEwLCAzODF9LCB7MTAsIDM3OX0sIHsxMCwgMzc3fSwKKyAgICB7MTAsIDM3NX0sIHsxMCwgMzczfSwgezEwLCAzNzF9LCB7MTAsIDM2OX0sIHsxMCwgMzY3fSwgezEwLCAzNjV9LAorICAgIHsxMCwgMzYzfSwgezEwLCAzNjF9LCB7MTAsIDM1OX0sIHsxMCwgMzU3fSwgezEwLCAzNTV9LCB7MTAsIDM1M30sCisgICAgezEwLCAzNTF9LCB7MTAsIDM0OX0sIHsxMCwgMzQ3fSwgezEwLCAzNDV9LCB7MTAsIDM0M30sIHsxMCwgMzQxfSwKKyAgICB7MTAsIDMzOX0sIHsxMCwgMzM3fSwgezEwLCAzMzV9LCB7MTAsIDMzM30sIHsxMCwgMzMxfSwgezEwLCAzMjl9LAorICAgIHsxMCwgMzI3fSwgezEwLCAzMjV9LCB7MTAsIDMyM30sIHsxMCwgMzIxfSwgezEwLCAzMTl9LCB7MTAsIDMxN30sCisgICAgezEwLCAzMTV9LCB7MTAsIDMxM30sIHsxMCwgMzExfSwgezEwLCAzMDl9LCB7MTAsIDMwN30sIHsxMCwgMzA1fSwKKyAgICB7MTAsIDMwM30sIHsxMCwgMzAxfSwgezEwLCAyOTl9LCB7MTAsIDI5N30sIHsxMCwgMjk1fSwgezEwLCAyOTN9LAorICAgIHsxMCwgMjkxfSwgezEwLCAyODl9LCB7MTAsIDI4N30sIHsxMCwgMjg1fSwgezEwLCAyODN9LCB7MTAsIDI4MX0sCisgICAgezEwLCAyNzl9LCB7MTAsIDI3N30sIHsxMCwgMjc1fSwgezEwLCAyNzN9LCB7MTAsIDI3MX0sIHsxMCwgMjY5fSwKKyAgICB7MTAsIDI2N30sIHsxMCwgMjY1fSwgezEwLCAyNjN9LCB7MTAsIDI2MX0sIHsxMCwgMjU5fSwgezEwLCAyNTd9LAorICAgIHsxMCwgMjU1fSwgezEwLCAyNTN9LCB7MTAsIDI1MX0sIHsxMCwgMjQ5fSwgezEwLCAyNDd9LCB7MTAsIDI0NX0sCisgICAgezEwLCAyNDN9LCB7MTAsIDI0MX0sIHsxMCwgMjM5fSwgezEwLCAyMzd9LCB7MTAsIDIzNX0sIHsxMCwgMjMzfSwKKyAgICB7MTAsIDIzMX0sIHsxMCwgMjI5fSwgezEwLCAyMjd9LCB7MTAsIDIyNX0sIHsxMCwgMjIzfSwgezEwLCAyMjF9LAorICAgIHsxMCwgMjE5fSwgezEwLCAyMTd9LCB7MTAsIDIxNX0sIHsxMCwgMjEzfSwgezEwLCAyMTF9LCB7MTAsIDIwOX0sCisgICAgezEwLCAyMDd9LCB7MTAsIDIwNX0sIHsxMCwgMjAzfSwgezEwLCAyMDF9LCB7MTAsIDE5OX0sIHsxMCwgMTk3fSwKKyAgICB7MTAsIDE5NX0sIHsxMCwgMTkzfSwgezEwLCAxOTF9LCB7MTAsIDE4OX0sIHsxMCwgMTg3fSwgezEwLCAxODV9LAorICAgIHsxMCwgMTgzfSwgezEwLCAxODF9LCB7MTAsIDE3OX0sIHsxMCwgMTc3fSwgezEwLCAxNzV9LCB7MTAsIDE3M30sCisgICAgezEwLCAxNzF9LCB7MTAsIDE2OX0sIHsxMCwgMTY3fSwgezEwLCAxNjV9LCB7MTAsIDE2M30sIHsxMCwgMTYxfSwKKyAgICB7MTAsIDE1OX0sIHsxMCwgMTU3fSwgezEwLCAxNTV9LCB7MTAsIDE1M30sIHsxMCwgMTUxfSwgezEwLCAxNDl9LAorICAgIHsxMCwgMTQ3fSwgezEwLCAxNDV9LCB7MTAsIDE0M30sIHsxMCwgMTQxfSwgezEwLCAxMzl9LCB7MTAsIDEzN30sCisgICAgezEwLCAxMzV9LCB7MTAsIDEzM30sIHsxMCwgMTMxfSwgezEwLCAxMjl9LCB7MTAsIDEyN30sIHsxMCwgMTI1fSwKKyAgICB7MTAsIDEyM30sIHsxMCwgMTIxfSwgezEwLCAxMTl9LCB7MTAsIDExN30sIHsxMCwgMTE1fSwgezEwLCAxMTN9LAorICAgIHsxMCwgMTExfSwgezEwLCAxMDl9LCB7MTAsIDEwN30sIHsxMCwgMTA1fSwgezEwLCAxMDN9LCB7MTAsIDEwMX0sCisgICAgezEwLCA5OX0sIHsxMCwgOTd9LCB7MTAsIDk1fSwgezEwLCA5M30sIHsxMCwgOTF9LCB7MTAsIDg5fSwKKyAgICB7MTAsIDg3fSwgezEwLCA4NX0sIHsxMCwgODN9LCB7MTAsIDgxfSwgezEwLCA3OX0sIHsxMCwgNzd9LAorICAgIHsxMCwgNzV9LCB7MTAsIDczfSwgezEwLCA3MX0sIHsxMCwgNjl9LCB7MTAsIDY3fSwgezEwLCA2NX0sCisgICAgezEwLCA2M30sIHsxMCwgNjF9LCB7MTAsIDU5fSwgezEwLCA1N30sIHsxMCwgNTV9LCB7MTAsIDUzfSwKKyAgICB7MTAsIDUxfSwgezEwLCA0OX0sIHsxMCwgNDd9LCB7MTAsIDQ1fSwgezEwLCA0M30sIHsxMCwgNDF9LAorICAgIHsxMCwgMzl9LCB7MTAsIDM3fSwgezEwLCAzNX0sIHsxMCwgMzN9LCB7MTAsIDMxfSwgezEwLCAyOX0sCisgICAgezEwLCAyN30sIHsxMCwgMjV9LCB7MTAsIDIzfSwgezEwLCAyMX0sIHsxMCwgMTl9LCB7MTAsIDE3fSwKKyAgICB7MTAsIDE1fSwgezEwLCAxM30sIHsxMCwgMTF9LCB7MTAsIDl9LCB7MTAsIDd9LCB7MTAsIDV9LAorICAgIHsxMCwgM30sIHsxMCwgMX0sIHs5LCA2M30sIHs5LCA2MX0sIHs5LCA1OX0sIHs5LCA1N30sCisgICAgezksIDU1fSwgezksIDUzfSwgezksIDUxfSwgezksIDQ5fSwgezksIDQ3fSwgezksIDQ1fSwKKyAgICB7OSwgNDN9LCB7OSwgNDF9LCB7OSwgMzl9LCB7OSwgMzd9LCB7OSwgMzV9LCB7OSwgMzN9LAorICAgIHs5LCAzMX0sIHs5LCAyOX0sIHs5LCAyN30sIHs5LCAyNX0sIHs5LCAyM30sIHs5LCAyMX0sCisgICAgezksIDE5fSwgezksIDE3fSwgezksIDE1fSwgezksIDEzfSwgezksIDExfSwgezksIDl9LAorICAgIHs5LCA3fSwgezksIDV9LCB7OSwgM30sIHs5LCAxfSwgezgsIDMxfSwgezgsIDI5fSwKKyAgICB7OCwgMjd9LCB7OCwgMjV9LCB7OCwgMjN9LCB7OCwgMjF9LCB7OCwgMTl9LCB7OCwgMTd9LAorICAgIHs4LCAxNX0sIHs4LCAxM30sIHs4LCAxMX0sIHs4LCA5fSwgezgsIDd9LCB7OCwgNX0sCisgICAgezgsIDN9LCB7OCwgMX0sIHs3LCAxNX0sIHs3LCAxM30sIHs3LCAxMX0sIHs3LCA5fSwKKyAgICB7NywgN30sIHs3LCA1fSwgezcsIDN9LCB7NywgMX0sIHs2LCA3fSwgezYsIDV9LAorICAgIHs2LCAzfSwgezYsIDF9LCB7NSwgM30sIHs1LCAxfSwgezQsIDF9LCB7MywgMX0sCisgICAgezIsIDF9LCB7MSwgMX0sIHswLCAwfSwgezEsIDB9LCB7MiwgMH0sIHszLCAwfSwKKyAgICB7NCwgMH0sIHs1LCAwfSwgezUsIDJ9LCB7NiwgMH0sIHs2LCAyfSwgezYsIDR9LAorICAgIHs2LCA2fSwgezcsIDB9LCB7NywgMn0sIHs3LCA0fSwgezcsIDZ9LCB7NywgOH0sCisgICAgezcsIDEwfSwgezcsIDEyfSwgezcsIDE0fSwgezgsIDB9LCB7OCwgMn0sIHs4LCA0fSwKKyAgICB7OCwgNn0sIHs4LCA4fSwgezgsIDEwfSwgezgsIDEyfSwgezgsIDE0fSwgezgsIDE2fSwKKyAgICB7OCwgMTh9LCB7OCwgMjB9LCB7OCwgMjJ9LCB7OCwgMjR9LCB7OCwgMjZ9LCB7OCwgMjh9LAorICAgIHs4LCAzMH0sIHs5LCAwfSwgezksIDJ9LCB7OSwgNH0sIHs5LCA2fSwgezksIDh9LAorICAgIHs5LCAxMH0sIHs5LCAxMn0sIHs5LCAxNH0sIHs5LCAxNn0sIHs5LCAxOH0sIHs5LCAyMH0sCisgICAgezksIDIyfSwgezksIDI0fSwgezksIDI2fSwgezksIDI4fSwgezksIDMwfSwgezksIDMyfSwKKyAgICB7OSwgMzR9LCB7OSwgMzZ9LCB7OSwgMzh9LCB7OSwgNDB9LCB7OSwgNDJ9LCB7OSwgNDR9LAorICAgIHs5LCA0Nn0sIHs5LCA0OH0sIHs5LCA1MH0sIHs5LCA1Mn0sIHs5LCA1NH0sIHs5LCA1Nn0sCisgICAgezksIDU4fSwgezksIDYwfSwgezksIDYyfSwgezEwLCAwfSwgezEwLCAyfSwgezEwLCA0fSwKKyAgICB7MTAsIDZ9LCB7MTAsIDh9LCB7MTAsIDEwfSwgezEwLCAxMn0sIHsxMCwgMTR9LCB7MTAsIDE2fSwKKyAgICB7MTAsIDE4fSwgezEwLCAyMH0sIHsxMCwgMjJ9LCB7MTAsIDI0fSwgezEwLCAyNn0sIHsxMCwgMjh9LAorICAgIHsxMCwgMzB9LCB7MTAsIDMyfSwgezEwLCAzNH0sIHsxMCwgMzZ9LCB7MTAsIDM4fSwgezEwLCA0MH0sCisgICAgezEwLCA0Mn0sIHsxMCwgNDR9LCB7MTAsIDQ2fSwgezEwLCA0OH0sIHsxMCwgNTB9LCB7MTAsIDUyfSwKKyAgICB7MTAsIDU0fSwgezEwLCA1Nn0sIHsxMCwgNTh9LCB7MTAsIDYwfSwgezEwLCA2Mn0sIHsxMCwgNjR9LAorICAgIHsxMCwgNjZ9LCB7MTAsIDY4fSwgezEwLCA3MH0sIHsxMCwgNzJ9LCB7MTAsIDc0fSwgezEwLCA3Nn0sCisgICAgezEwLCA3OH0sIHsxMCwgODB9LCB7MTAsIDgyfSwgezEwLCA4NH0sIHsxMCwgODZ9LCB7MTAsIDg4fSwKKyAgICB7MTAsIDkwfSwgezEwLCA5Mn0sIHsxMCwgOTR9LCB7MTAsIDk2fSwgezEwLCA5OH0sIHsxMCwgMTAwfSwKKyAgICB7MTAsIDEwMn0sIHsxMCwgMTA0fSwgezEwLCAxMDZ9LCB7MTAsIDEwOH0sIHsxMCwgMTEwfSwgezEwLCAxMTJ9LAorICAgIHsxMCwgMTE0fSwgezEwLCAxMTZ9LCB7MTAsIDExOH0sIHsxMCwgMTIwfSwgezEwLCAxMjJ9LCB7MTAsIDEyNH0sCisgICAgezEwLCAxMjZ9LCB7MTAsIDEyOH0sIHsxMCwgMTMwfSwgezEwLCAxMzJ9LCB7MTAsIDEzNH0sIHsxMCwgMTM2fSwKKyAgICB7MTAsIDEzOH0sIHsxMCwgMTQwfSwgezEwLCAxNDJ9LCB7MTAsIDE0NH0sIHsxMCwgMTQ2fSwgezEwLCAxNDh9LAorICAgIHsxMCwgMTUwfSwgezEwLCAxNTJ9LCB7MTAsIDE1NH0sIHsxMCwgMTU2fSwgezEwLCAxNTh9LCB7MTAsIDE2MH0sCisgICAgezEwLCAxNjJ9LCB7MTAsIDE2NH0sIHsxMCwgMTY2fSwgezEwLCAxNjh9LCB7MTAsIDE3MH0sIHsxMCwgMTcyfSwKKyAgICB7MTAsIDE3NH0sIHsxMCwgMTc2fSwgezEwLCAxNzh9LCB7MTAsIDE4MH0sIHsxMCwgMTgyfSwgezEwLCAxODR9LAorICAgIHsxMCwgMTg2fSwgezEwLCAxODh9LCB7MTAsIDE5MH0sIHsxMCwgMTkyfSwgezEwLCAxOTR9LCB7MTAsIDE5Nn0sCisgICAgezEwLCAxOTh9LCB7MTAsIDIwMH0sIHsxMCwgMjAyfSwgezEwLCAyMDR9LCB7MTAsIDIwNn0sIHsxMCwgMjA4fSwKKyAgICB7MTAsIDIxMH0sIHsxMCwgMjEyfSwgezEwLCAyMTR9LCB7MTAsIDIxNn0sIHsxMCwgMjE4fSwgezEwLCAyMjB9LAorICAgIHsxMCwgMjIyfSwgezEwLCAyMjR9LCB7MTAsIDIyNn0sIHsxMCwgMjI4fSwgezEwLCAyMzB9LCB7MTAsIDIzMn0sCisgICAgezEwLCAyMzR9LCB7MTAsIDIzNn0sIHsxMCwgMjM4fSwgezEwLCAyNDB9LCB7MTAsIDI0Mn0sIHsxMCwgMjQ0fSwKKyAgICB7MTAsIDI0Nn0sIHsxMCwgMjQ4fSwgezEwLCAyNTB9LCB7MTAsIDI1Mn0sIHsxMCwgMjU0fSwgezEwLCAyNTZ9LAorICAgIHsxMCwgMjU4fSwgezEwLCAyNjB9LCB7MTAsIDI2Mn0sIHsxMCwgMjY0fSwgezEwLCAyNjZ9LCB7MTAsIDI2OH0sCisgICAgezEwLCAyNzB9LCB7MTAsIDI3Mn0sIHsxMCwgMjc0fSwgezEwLCAyNzZ9LCB7MTAsIDI3OH0sIHsxMCwgMjgwfSwKKyAgICB7MTAsIDI4Mn0sIHsxMCwgMjg0fSwgezEwLCAyODZ9LCB7MTAsIDI4OH0sIHsxMCwgMjkwfSwgezEwLCAyOTJ9LAorICAgIHsxMCwgMjk0fSwgezEwLCAyOTZ9LCB7MTAsIDI5OH0sIHsxMCwgMzAwfSwgezEwLCAzMDJ9LCB7MTAsIDMwNH0sCisgICAgezEwLCAzMDZ9LCB7MTAsIDMwOH0sIHsxMCwgMzEwfSwgezEwLCAzMTJ9LCB7MTAsIDMxNH0sIHsxMCwgMzE2fSwKKyAgICB7MTAsIDMxOH0sIHsxMCwgMzIwfSwgezEwLCAzMjJ9LCB7MTAsIDMyNH0sIHsxMCwgMzI2fSwgezEwLCAzMjh9LAorICAgIHsxMCwgMzMwfSwgezEwLCAzMzJ9LCB7MTAsIDMzNH0sIHsxMCwgMzM2fSwgezEwLCAzMzh9LCB7MTAsIDM0MH0sCisgICAgezEwLCAzNDJ9LCB7MTAsIDM0NH0sIHsxMCwgMzQ2fSwgezEwLCAzNDh9LCB7MTAsIDM1MH0sIHsxMCwgMzUyfSwKKyAgICB7MTAsIDM1NH0sIHsxMCwgMzU2fSwgezEwLCAzNTh9LCB7MTAsIDM2MH0sIHsxMCwgMzYyfSwgezEwLCAzNjR9LAorICAgIHsxMCwgMzY2fSwgezEwLCAzNjh9LCB7MTAsIDM3MH0sIHsxMCwgMzcyfSwgezEwLCAzNzR9LCB7MTAsIDM3Nn0sCisgICAgezEwLCAzNzh9LCB7MTAsIDM4MH0sIHsxMCwgMzgyfSwgezEwLCAzODR9LCB7MTAsIDM4Nn0sIHsxMCwgMzg4fSwKKyAgICB7MTAsIDM5MH0sIHsxMCwgMzkyfSwgezEwLCAzOTR9LCB7MTAsIDM5Nn0sIHsxMCwgMzk4fSwgezEwLCA0MDB9LAorICAgIHsxMCwgNDAyfSwgezEwLCA0MDR9LCB7MTAsIDQwNn0sIHsxMCwgNDA4fSwgezEwLCA0MTB9LCB7MTAsIDQxMn0sCisgICAgezEwLCA0MTR9LCB7MTAsIDQxNn0sIHsxMCwgNDE4fSwgezEwLCA0MjB9LCB7MTAsIDQyMn0sIHsxMCwgNDI0fSwKKyAgICB7MTAsIDQyNn0sIHsxMCwgNDI4fSwgezEwLCA0MzB9LCB7MTAsIDQzMn0sIHsxMCwgNDM0fSwgezEwLCA0MzZ9LAorICAgIHsxMCwgNDM4fSwgezEwLCA0NDB9LCB7MTAsIDQ0Mn0sIHsxMCwgNDQ0fSwgezEwLCA0NDZ9LCB7MTAsIDQ0OH0sCisgICAgezEwLCA0NTB9LCB7MTAsIDQ1Mn0sIHsxMCwgNDU0fSwgezEwLCA0NTZ9LCB7MTAsIDQ1OH0sIHsxMCwgNDYwfSwKKyAgICB7MTAsIDQ2Mn0sIHsxMCwgNDY0fSwgezEwLCA0NjZ9LCB7MTAsIDQ2OH0sIHsxMCwgNDcwfSwgezEwLCA0NzJ9LAorICAgIHsxMCwgNDc0fSwgezEwLCA0NzZ9LCB7MTAsIDQ3OH0sIHsxMCwgNDgwfSwgezEwLCA0ODJ9LCB7MTAsIDQ4NH0sCisgICAgezEwLCA0ODZ9LCB7MTAsIDQ4OH0sIHsxMCwgNDkwfSwgezEwLCA0OTJ9LCB7MTAsIDQ5NH0sIHsxMCwgNDk2fSwKKyAgICB7MTAsIDQ5OH0sIHsxMCwgNTAwfSwgezEwLCA1MDJ9LCB7MTAsIDUwNH0sIHsxMCwgNTA2fSwgezEwLCA1MDh9LAorICAgIHsxMCwgNTEwfSwgezEwLCA1MTJ9LCB7MTAsIDUxNH0sIHsxMCwgNTE2fSwgezEwLCA1MTh9LCB7MTAsIDUyMH0sCisgICAgezEwLCA1MjJ9LCB7MTAsIDUyNH0sIHsxMCwgNTI2fSwgezEwLCA1Mjh9LCB7MTAsIDUzMH0sIHsxMCwgNTMyfSwKKyAgICB7MTAsIDUzNH0sIHsxMCwgNTM2fSwgezEwLCA1Mzh9LCB7MTAsIDU0MH0sIHsxMCwgNTQyfSwgezEwLCA1NDR9LAorICAgIHsxMCwgNTQ2fSwgezEwLCA1NDh9LCB7MTAsIDU1MH0sIHsxMCwgNTUyfSwgezEwLCA1NTR9LCB7MTAsIDU1Nn0sCisgICAgezEwLCA1NTh9LCB7MTAsIDU2MH0sIHsxMCwgNTYyfSwgezEwLCA1NjR9LCB7MTAsIDU2Nn0sIHsxMCwgNTY4fSwKKyAgICB7MTAsIDU3MH0sIHsxMCwgNTcyfSwgezEwLCA1NzR9LCB7MTAsIDU3Nn0sIHsxMCwgNTc4fSwgezEwLCA1ODB9LAorICAgIHsxMCwgNTgyfSwgezEwLCA1ODR9LCB7MTAsIDU4Nn0sIHsxMCwgNTg4fSwgezEwLCA1OTB9LCB7MTAsIDU5Mn0sCisgICAgezEwLCA1OTR9LCB7MTAsIDU5Nn0sIHsxMCwgNTk4fSwgezEwLCA2MDB9LCB7MTAsIDYwMn0sIHsxMCwgNjA0fSwKKyAgICB7MTAsIDYwNn0sIHsxMCwgNjA4fSwgezEwLCA2MTB9LCB7MTAsIDYxMn0sIHsxMCwgNjE0fSwgezEwLCA2MTZ9LAorICAgIHsxMCwgNjE4fSwgezEwLCA2MjB9LCB7MTAsIDYyMn0sIHsxMCwgNjI0fSwgezEwLCA2MjZ9LCB7MTAsIDYyOH0sCisgICAgezEwLCA2MzB9LCB7MTAsIDYzMn0sIHsxMCwgNjM0fSwgezEwLCA2MzZ9LCB7MTAsIDYzOH0sIHsxMCwgNjQwfSwKKyAgICB7MTAsIDY0Mn0sIHsxMCwgNjQ0fSwgezEwLCA2NDZ9LCB7MTAsIDY0OH0sIHsxMCwgNjUwfSwgezEwLCA2NTJ9LAorICAgIHsxMCwgNjU0fSwgezEwLCA2NTZ9LCB7MTAsIDY1OH0sIHsxMCwgNjYwfSwgezEwLCA2NjJ9LCB7MTAsIDY2NH0sCisgICAgezEwLCA2NjZ9LCB7MTAsIDY2OH0sIHsxMCwgNjcwfSwgezEwLCA2NzJ9LCB7MTAsIDY3NH0sIHsxMCwgNjc2fSwKKyAgICB7MTAsIDY3OH0sIHsxMCwgNjgwfSwgezEwLCA2ODJ9LCB7MTAsIDY4NH0sIHsxMCwgNjg2fSwgezEwLCA2ODh9LAorICAgIHsxMCwgNjkwfSwgezEwLCA2OTJ9LCB7MTAsIDY5NH0sIHsxMCwgNjk2fSwgezEwLCA2OTh9LCB7MTAsIDcwMH0sCisgICAgezEwLCA3MDJ9LCB7MTAsIDcwNH0sIHsxMCwgNzA2fSwgezEwLCA3MDh9LCB7MTAsIDcxMH0sIHsxMCwgNzEyfSwKKyAgICB7MTAsIDcxNH0sIHsxMCwgNzE2fSwgezEwLCA3MTh9LCB7MTAsIDcyMH0sIHsxMCwgNzIyfSwgezEwLCA3MjR9LAorICAgIHsxMCwgNzI2fSwgezEwLCA3Mjh9LCB7MTAsIDczMH0sIHsxMCwgNzMyfSwgezEwLCA3MzR9LCB7MTAsIDczNn0sCisgICAgezEwLCA3Mzh9LCB7MTAsIDc0MH0sIHsxMCwgNzQyfSwgezEwLCA3NDR9LCB7MTAsIDc0Nn0sIHsxMCwgNzQ4fSwKKyAgICB7MTAsIDc1MH0sIHsxMCwgNzUyfSwgezEwLCA3NTR9LCB7MTAsIDc1Nn0sIHsxMCwgNzU4fSwgezEwLCA3NjB9LAorICAgIHsxMCwgNzYyfSwgezEwLCA3NjR9LCB7MTAsIDc2Nn0sIHsxMCwgNzY4fSwgezEwLCA3NzB9LCB7MTAsIDc3Mn0sCisgICAgezEwLCA3NzR9LCB7MTAsIDc3Nn0sIHsxMCwgNzc4fSwgezEwLCA3ODB9LCB7MTAsIDc4Mn0sIHsxMCwgNzg0fSwKKyAgICB7MTAsIDc4Nn0sIHsxMCwgNzg4fSwgezEwLCA3OTB9LCB7MTAsIDc5Mn0sIHsxMCwgNzk0fSwgezEwLCA3OTZ9LAorICAgIHsxMCwgNzk4fSwgezEwLCA4MDB9LCB7MTAsIDgwMn0sIHsxMCwgODA0fSwgezEwLCA4MDZ9LCB7MTAsIDgwOH0sCisgICAgezEwLCA4MTB9LCB7MTAsIDgxMn0sIHsxMCwgODE0fSwgezEwLCA4MTZ9LCB7MTAsIDgxOH0sIHsxMCwgODIwfSwKKyAgICB7MTAsIDgyMn0sIHsxMCwgODI0fSwgezEwLCA4MjZ9LCB7MTAsIDgyOH0sIHsxMCwgODMwfSwgezEwLCA4MzJ9LAorICAgIHsxMCwgODM0fSwgezEwLCA4MzZ9LCB7MTAsIDgzOH0sIHsxMCwgODQwfSwgezEwLCA4NDJ9LCB7MTAsIDg0NH0sCisgICAgezEwLCA4NDZ9LCB7MTAsIDg0OH0sIHsxMCwgODUwfSwgezEwLCA4NTJ9LCB7MTAsIDg1NH0sIHsxMCwgODU2fSwKKyAgICB7MTAsIDg1OH0sIHsxMCwgODYwfSwgezEwLCA4NjJ9LCB7MTAsIDg2NH0sIHsxMCwgODY2fSwgezEwLCA4Njh9LAorICAgIHsxMCwgODcwfSwgezEwLCA4NzJ9LCB7MTAsIDg3NH0sIHsxMCwgODc2fSwgezEwLCA4Nzh9LCB7MTAsIDg4MH0sCisgICAgezEwLCA4ODJ9LCB7MTAsIDg4NH0sIHsxMCwgODg2fSwgezEwLCA4ODh9LCB7MTAsIDg5MH0sIHsxMCwgODkyfSwKKyAgICB7MTAsIDg5NH0sIHsxMCwgODk2fSwgezEwLCA4OTh9LCB7MTAsIDkwMH0sIHsxMCwgOTAyfSwgezEwLCA5MDR9LAorICAgIHsxMCwgOTA2fSwgezEwLCA5MDh9LCB7MTAsIDkxMH0sIHsxMCwgOTEyfSwgezEwLCA5MTR9LCB7MTAsIDkxNn0sCisgICAgezEwLCA5MTh9LCB7MTAsIDkyMH0sIHsxMCwgOTIyfSwgezEwLCA5MjR9LCB7MTAsIDkyNn0sIHsxMCwgOTI4fSwKKyAgICB7MTAsIDkzMH0sIHsxMCwgOTMyfSwgezEwLCA5MzR9LCB7MTAsIDkzNn0sIHsxMCwgOTM4fSwgezEwLCA5NDB9LAorICAgIHsxMCwgOTQyfSwgezEwLCA5NDR9LCB7MTAsIDk0Nn0sIHsxMCwgOTQ4fSwgezEwLCA5NTB9LCB7MTAsIDk1Mn0sCisgICAgezEwLCA5NTR9LCB7MTAsIDk1Nn0sIHsxMCwgOTU4fSwgezEwLCA5NjB9LCB7MTAsIDk2Mn0sIHsxMCwgOTY0fSwKKyAgICB7MTAsIDk2Nn0sIHsxMCwgOTY4fSwgezEwLCA5NzB9LCB7MTAsIDk3Mn0sIHsxMCwgOTc0fSwgezEwLCA5NzZ9LAorICAgIHsxMCwgOTc4fSwgezEwLCA5ODB9LCB7MTAsIDk4Mn0sIHsxMCwgOTg0fSwgezEwLCA5ODZ9LCB7MTAsIDk4OH0sCisgICAgezEwLCA5OTB9LCB7MTAsIDk5Mn0sIHsxMCwgOTk0fSwgezEwLCA5OTZ9LCB7MTAsIDk5OH0sIHsxMCwgMTAwMH0sCisgICAgezEwLCAxMDAyfSwgezEwLCAxMDA0fSwgezEwLCAxMDA2fSwgezEwLCAxMDA4fSwgezEwLCAxMDEwfSwgezEwLCAxMDEyfSwKKyAgICB7MTAsIDEwMTR9LCB7MTAsIDEwMTZ9LCB7MTAsIDEwMTh9LCB7MTAsIDEwMjB9LCB7MTAsIDEwMjJ9LCB7MTAsIDEwMjR9LAorICAgIHsxMCwgMTAyNn0sIHsxMCwgMTAyOH0sIHsxMCwgMTAzMH0sIHsxMCwgMTAzMn0sIHsxMCwgMTAzNH0sIHsxMCwgMTAzNn0sCisgICAgezEwLCAxMDM4fSwgezEwLCAxMDQwfSwgezEwLCAxMDQyfSwgezEwLCAxMDQ0fSwgezEwLCAxMDQ2fSwgezEwLCAxMDQ4fSwKKyAgICB7MTAsIDEwNTB9LCB7MTAsIDEwNTJ9LCB7MTAsIDEwNTR9LCB7MTAsIDEwNTZ9LCB7MTAsIDEwNTh9LCB7MTAsIDEwNjB9LAorICAgIHsxMCwgMTA2Mn0sIHsxMCwgMTA2NH0sIHsxMCwgMTA2Nn0sIHsxMCwgMTA2OH0sIHsxMCwgMTA3MH0sIHsxMCwgMTA3Mn0sCisgICAgezEwLCAxMDc0fSwgezEwLCAxMDc2fSwgezEwLCAxMDc4fSwgezEwLCAxMDgwfSwgezEwLCAxMDgyfSwgezEwLCAxMDg0fSwKKyAgICB7MTAsIDEwODZ9LCB7MTAsIDEwODh9LCB7MTAsIDEwOTB9LCB7MTAsIDEwOTJ9LCB7MTAsIDEwOTR9LCB7MTAsIDEwOTZ9LAorICAgIHsxMCwgMTA5OH0sIHsxMCwgMTEwMH0sIHsxMCwgMTEwMn0sIHsxMCwgMTEwNH0sIHsxMCwgMTEwNn0sIHsxMCwgMTEwOH0sCisgICAgezEwLCAxMTEwfSwgezEwLCAxMTEyfSwgezEwLCAxMTE0fSwgezEwLCAxMTE2fSwgezEwLCAxMTE4fSwgezEwLCAxMTIwfSwKKyAgICB7MTAsIDExMjJ9LCB7MTAsIDExMjR9LCB7MTAsIDExMjZ9LCB7MTAsIDExMjh9LCB7MTAsIDExMzB9LCB7MTAsIDExMzJ9LAorICAgIHsxMCwgMTEzNH0sIHsxMCwgMTEzNn0sIHsxMCwgMTEzOH0sIHsxMCwgMTE0MH0sIHsxMCwgMTE0Mn0sIHsxMCwgMTE0NH0sCisgICAgezEwLCAxMTQ2fSwgezEwLCAxMTQ4fSwgezEwLCAxMTUwfSwgezEwLCAxMTUyfSwgezEwLCAxMTU0fSwgezEwLCAxMTU2fSwKKyAgICB7MTAsIDExNTh9LCB7MTAsIDExNjB9LCB7MTAsIDExNjJ9LCB7MTAsIDExNjR9LCB7MTAsIDExNjZ9LCB7MTAsIDExNjh9LAorICAgIHsxMCwgMTE3MH0sIHsxMCwgMTE3Mn0sIHsxMCwgMTE3NH0sIHsxMCwgMTE3Nn0sIHsxMCwgMTE3OH0sIHsxMCwgMTE4MH0sCisgICAgezEwLCAxMTgyfSwgezEwLCAxMTg0fSwgezEwLCAxMTg2fSwgezEwLCAxMTg4fSwgezEwLCAxMTkwfSwgezEwLCAxMTkyfSwKKyAgICB7MTAsIDExOTR9LCB7MTAsIDExOTZ9LCB7MTAsIDExOTh9LCB7MTAsIDEyMDB9LCB7MTAsIDEyMDJ9LCB7MTAsIDEyMDR9LAorICAgIHsxMCwgMTIwNn0sIHsxMCwgMTIwOH0sIHsxMCwgMTIxMH0sIHsxMCwgMTIxMn0sIHsxMCwgMTIxNH0sIHsxMCwgMTIxNn0sCisgICAgezEwLCAxMjE4fSwgezEwLCAxMjIwfSwgezEwLCAxMjIyfSwgezEwLCAxMjI0fSwgezEwLCAxMjI2fSwgezEwLCAxMjI4fSwKKyAgICB7MTAsIDEyMzB9LCB7MTAsIDEyMzJ9LCB7MTAsIDEyMzR9LCB7MTAsIDEyMzZ9LCB7MTAsIDEyMzh9LCB7MTAsIDEyNDB9LAorICAgIHsxMCwgMTI0Mn0sIHsxMCwgMTI0NH0sIHsxMCwgMTI0Nn0sIHsxMCwgMTI0OH0sIHsxMCwgMTI1MH0sIHsxMCwgMTI1Mn0sCisgICAgezEwLCAxMjU0fSwgezEwLCAxMjU2fSwgezEwLCAxMjU4fSwgezEwLCAxMjYwfSwgezEwLCAxMjYyfSwgezEwLCAxMjY0fSwKKyAgICB7MTAsIDEyNjZ9LCB7MTAsIDEyNjh9LCB7MTAsIDEyNzB9LCB7MTAsIDEyNzJ9LCB7MTAsIDEyNzR9LCB7MTAsIDEyNzZ9LAorICAgIHsxMCwgMTI3OH0sIHsxMCwgMTI4MH0sIHsxMCwgMTI4Mn0sIHsxMCwgMTI4NH0sIHsxMCwgMTI4Nn0sIHsxMCwgMTI4OH0sCisgICAgezEwLCAxMjkwfSwgezEwLCAxMjkyfSwgezEwLCAxMjk0fSwgezEwLCAxMjk2fSwgezEwLCAxMjk4fSwgezEwLCAxMzAwfSwKKyAgICB7MTAsIDEzMDJ9LCB7MTAsIDEzMDR9LCB7MTAsIDEzMDZ9LCB7MTAsIDEzMDh9LCB7MTAsIDEzMTB9LCB7MTAsIDEzMTJ9LAorICAgIHsxMCwgMTMxNH0sIHsxMCwgMTMxNn0sIHsxMCwgMTMxOH0sIHsxMCwgMTMyMH0sIHsxMCwgMTMyMn0sIHsxMCwgMTMyNH0sCisgICAgezEwLCAxMzI2fSwgezEwLCAxMzI4fSwgezEwLCAxMzMwfSwgezEwLCAxMzMyfSwgezEwLCAxMzM0fSwgezEwLCAxMzM2fSwKKyAgICB7MTAsIDEzMzh9LCB7MTAsIDEzNDB9LCB7MTAsIDEzNDJ9LCB7MTAsIDEzNDR9LCB7MTAsIDEzNDZ9LCB7MTAsIDEzNDh9LAorICAgIHsxMCwgMTM1MH0sIHsxMCwgMTM1Mn0sIHsxMCwgMTM1NH0sIHsxMCwgMTM1Nn0sIHsxMCwgMTM1OH0sIHsxMCwgMTM2MH0sCisgICAgezEwLCAxMzYyfSwgezEwLCAxMzY0fSwgezEwLCAxMzY2fSwgezEwLCAxMzY4fSwgezEwLCAxMzcwfSwgezEwLCAxMzcyfSwKKyAgICB7MTAsIDEzNzR9LCB7MTAsIDEzNzZ9LCB7MTAsIDEzNzh9LCB7MTAsIDEzODB9LCB7MTAsIDEzODJ9LCB7MTAsIDEzODR9LAorICAgIHsxMCwgMTM4Nn0sIHsxMCwgMTM4OH0sIHsxMCwgMTM5MH0sIHsxMCwgMTM5Mn0sIHsxMCwgMTM5NH0sIHsxMCwgMTM5Nn0sCisgICAgezEwLCAxMzk4fSwgezEwLCAxNDAwfSwgezEwLCAxNDAyfSwgezEwLCAxNDA0fSwgezEwLCAxNDA2fSwgezEwLCAxNDA4fSwKKyAgICB7MTAsIDE0MTB9LCB7MTAsIDE0MTJ9LCB7MTAsIDE0MTR9LCB7MTAsIDE0MTZ9LCB7MTAsIDE0MTh9LCB7MTAsIDE0MjB9LAorICAgIHsxMCwgMTQyMn0sIHsxMCwgMTQyNH0sIHsxMCwgMTQyNn0sIHsxMCwgMTQyOH0sIHsxMCwgMTQzMH0sIHsxMCwgMTQzMn0sCisgICAgezEwLCAxNDM0fSwgezEwLCAxNDM2fSwgezEwLCAxNDM4fSwgezEwLCAxNDQwfSwgezEwLCAxNDQyfSwgezEwLCAxNDQ0fSwKKyAgICB7MTAsIDE0NDZ9LCB7MTAsIDE0NDh9LCB7MTAsIDE0NTB9LCB7MTAsIDE0NTJ9LCB7MTAsIDE0NTR9LCB7MTAsIDE0NTZ9LAorICAgIHsxMCwgMTQ1OH0sIHsxMCwgMTQ2MH0sIHsxMCwgMTQ2Mn0sIHsxMCwgMTQ2NH0sIHsxMCwgMTQ2Nn0sIHsxMCwgMTQ2OH0sCisgICAgezEwLCAxNDcwfSwgezEwLCAxNDcyfSwgezEwLCAxNDc0fSwgezEwLCAxNDc2fSwgezEwLCAxNDc4fSwgezEwLCAxNDgwfSwKKyAgICB7MTAsIDE0ODJ9LCB7MTAsIDE0ODR9LCB7MTAsIDE0ODZ9LCB7MTAsIDE0ODh9LCB7MTAsIDE0OTB9LCB7MTAsIDE0OTJ9LAorICAgIHsxMCwgMTQ5NH0sIHsxMCwgMTQ5Nn0sIHsxMCwgMTQ5OH0sIHsxMCwgMTUwMH0sIHsxMCwgMTUwMn0sIHsxMCwgMTUwNH0sCisgICAgezEwLCAxNTA2fSwgezEwLCAxNTA4fSwgezEwLCAxNTEwfSwgezEwLCAxNTEyfSwgezEwLCAxNTE0fSwgezEwLCAxNTE2fSwKKyAgICB7MTAsIDE1MTh9LCB7MTAsIDE1MjB9LCB7MTAsIDE1MjJ9LCB7MTAsIDE1MjR9LCB7MTAsIDE1MjZ9LCB7MTAsIDE1Mjh9LAorICAgIHsxMCwgMTUzMH0sIHsxMCwgMTUzMn0sIHsxMCwgMTUzNH0sIHsxMCwgMTUzNn0sIHsxMCwgMTUzOH0sIHsxMCwgMTU0MH0sCisgICAgezEwLCAxNTQyfSwgezEwLCAxNTQ0fSwgezEwLCAxNTQ2fSwgezEwLCAxNTQ4fSwgezEwLCAxNTUwfSwgezEwLCAxNTUyfSwKKyAgICB7MTAsIDE1NTR9LCB7MTAsIDE1NTZ9LCB7MTAsIDE1NTh9LCB7MTAsIDE1NjB9LCB7MTAsIDE1NjJ9LCB7MTAsIDE1NjR9LAorICAgIHsxMCwgMTU2Nn0sIHsxMCwgMTU2OH0sIHsxMCwgMTU3MH0sIHsxMCwgMTU3Mn0sIHsxMCwgMTU3NH0sIHsxMCwgMTU3Nn0sCisgICAgezEwLCAxNTc4fSwgezEwLCAxNTgwfSwgezEwLCAxNTgyfSwgezEwLCAxNTg0fSwgezEwLCAxNTg2fSwgezEwLCAxNTg4fSwKKyAgICB7MTAsIDE1OTB9LCB7MTAsIDE1OTJ9LCB7MTAsIDE1OTR9LCB7MTAsIDE1OTZ9LCB7MTAsIDE1OTh9LCB7MTAsIDE2MDB9LAorICAgIHsxMCwgMTYwMn0sIHsxMCwgMTYwNH0sIHsxMCwgMTYwNn0sIHsxMCwgMTYwOH0sIHsxMCwgMTYxMH0sIHsxMCwgMTYxMn0sCisgICAgezEwLCAxNjE0fSwgezEwLCAxNjE2fSwgezEwLCAxNjE4fSwgezEwLCAxNjIwfSwgezEwLCAxNjIyfSwgezEwLCAxNjI0fSwKKyAgICB7MTAsIDE2MjZ9LCB7MTAsIDE2Mjh9LCB7MTAsIDE2MzB9LCB7MTAsIDE2MzJ9LCB7MTAsIDE2MzR9LCB7MTAsIDE2MzZ9LAorICAgIHsxMCwgMTYzOH0sIHsxMCwgMTY0MH0sIHsxMCwgMTY0Mn0sIHsxMCwgMTY0NH0sIHsxMCwgMTY0Nn0sIHsxMCwgMTY0OH0sCisgICAgezEwLCAxNjUwfSwgezEwLCAxNjUyfSwgezEwLCAxNjU0fSwgezEwLCAxNjU2fSwgezEwLCAxNjU4fSwgezEwLCAxNjYwfSwKKyAgICB7MTAsIDE2NjJ9LCB7MTAsIDE2NjR9LCB7MTAsIDE2NjZ9LCB7MTAsIDE2Njh9LCB7MTAsIDE2NzB9LCB7MTAsIDE2NzJ9LAorICAgIHsxMCwgMTY3NH0sIHsxMCwgMTY3Nn0sIHsxMCwgMTY3OH0sIHsxMCwgMTY4MH0sIHsxMCwgMTY4Mn0sIHsxMCwgMTY4NH0sCisgICAgezEwLCAxNjg2fSwgezEwLCAxNjg4fSwgezEwLCAxNjkwfSwgezEwLCAxNjkyfSwgezEwLCAxNjk0fSwgezEwLCAxNjk2fSwKKyAgICB7MTAsIDE2OTh9LCB7MTAsIDE3MDB9LCB7MTAsIDE3MDJ9LCB7MTAsIDE3MDR9LCB7MTAsIDE3MDZ9LCB7MTAsIDE3MDh9LAorICAgIHsxMCwgMTcxMH0sIHsxMCwgMTcxMn0sIHsxMCwgMTcxNH0sIHsxMCwgMTcxNn0sIHsxMCwgMTcxOH0sIHsxMCwgMTcyMH0sCisgICAgezEwLCAxNzIyfSwgezEwLCAxNzI0fSwgezEwLCAxNzI2fSwgezEwLCAxNzI4fSwgezEwLCAxNzMwfSwgezEwLCAxNzMyfSwKKyAgICB7MTAsIDE3MzR9LCB7MTAsIDE3MzZ9LCB7MTAsIDE3Mzh9LCB7MTAsIDE3NDB9LCB7MTAsIDE3NDJ9LCB7MTAsIDE3NDR9LAorICAgIHsxMCwgMTc0Nn0sIHsxMCwgMTc0OH0sIHsxMCwgMTc1MH0sIHsxMCwgMTc1Mn0sIHsxMCwgMTc1NH0sIHsxMCwgMTc1Nn0sCisgICAgezEwLCAxNzU4fSwgezEwLCAxNzYwfSwgezEwLCAxNzYyfSwgezEwLCAxNzY0fSwgezEwLCAxNzY2fSwgezEwLCAxNzY4fSwKKyAgICB7MTAsIDE3NzB9LCB7MTAsIDE3NzJ9LCB7MTAsIDE3NzR9LCB7MTAsIDE3NzZ9LCB7MTAsIDE3Nzh9LCB7MTAsIDE3ODB9LAorICAgIHsxMCwgMTc4Mn0sIHsxMCwgMTc4NH0sIHsxMCwgMTc4Nn0sIHsxMCwgMTc4OH0sIHsxMCwgMTc5MH0sIHsxMCwgMTc5Mn0sCisgICAgezEwLCAxNzk0fSwgezEwLCAxNzk2fSwgezEwLCAxNzk4fSwgezEwLCAxODAwfSwgezEwLCAxODAyfSwgezEwLCAxODA0fSwKKyAgICB7MTAsIDE4MDZ9LCB7MTAsIDE4MDh9LCB7MTAsIDE4MTB9LCB7MTAsIDE4MTJ9LCB7MTAsIDE4MTR9LCB7MTAsIDE4MTZ9LAorICAgIHsxMCwgMTgxOH0sIHsxMCwgMTgyMH0sIHsxMCwgMTgyMn0sIHsxMCwgMTgyNH0sIHsxMCwgMTgyNn0sIHsxMCwgMTgyOH0sCisgICAgezEwLCAxODMwfSwgezEwLCAxODMyfSwgezEwLCAxODM0fSwgezEwLCAxODM2fSwgezEwLCAxODM4fSwgezEwLCAxODQwfSwKKyAgICB7MTAsIDE4NDJ9LCB7MTAsIDE4NDR9LCB7MTAsIDE4NDZ9LCB7MTAsIDE4NDh9LCB7MTAsIDE4NTB9LCB7MTAsIDE4NTJ9LAorICAgIHsxMCwgMTg1NH0sIHsxMCwgMTg1Nn0sIHsxMCwgMTg1OH0sIHsxMCwgMTg2MH0sIHsxMCwgMTg2Mn0sIHsxMCwgMTg2NH0sCisgICAgezEwLCAxODY2fSwgezEwLCAxODY4fSwgezEwLCAxODcwfSwgezEwLCAxODcyfSwgezEwLCAxODc0fSwgezEwLCAxODc2fSwKKyAgICB7MTAsIDE4Nzh9LCB7MTAsIDE4ODB9LCB7MTAsIDE4ODJ9LCB7MTAsIDE4ODR9LCB7MTAsIDE4ODZ9LCB7MTAsIDE4ODh9LAorICAgIHsxMCwgMTg5MH0sIHsxMCwgMTg5Mn0sIHsxMCwgMTg5NH0sIHsxMCwgMTg5Nn0sIHsxMCwgMTg5OH0sIHsxMCwgMTkwMH0sCisgICAgezEwLCAxOTAyfSwgezEwLCAxOTA0fSwgezEwLCAxOTA2fSwgezEwLCAxOTA4fSwgezEwLCAxOTEwfSwgezEwLCAxOTEyfSwKKyAgICB7MTAsIDE5MTR9LCB7MTAsIDE5MTZ9LCB7MTAsIDE5MTh9LCB7MTAsIDE5MjB9LCB7MTAsIDE5MjJ9LCB7MTAsIDE5MjR9LAorICAgIHsxMCwgMTkyNn0sIHsxMCwgMTkyOH0sIHsxMCwgMTkzMH0sIHsxMCwgMTkzMn0sIHsxMCwgMTkzNH0sIHsxMCwgMTkzNn0sCisgICAgezEwLCAxOTM4fSwgezEwLCAxOTQwfSwgezEwLCAxOTQyfSwgezEwLCAxOTQ0fSwgezEwLCAxOTQ2fSwgezEwLCAxOTQ4fSwKKyAgICB7MTAsIDE5NTB9LCB7MTAsIDE5NTJ9LCB7MTAsIDE5NTR9LCB7MTAsIDE5NTZ9LCB7MTAsIDE5NTh9LCB7MTAsIDE5NjB9LAorICAgIHsxMCwgMTk2Mn0sIHsxMCwgMTk2NH0sIHsxMCwgMTk2Nn0sIHsxMCwgMTk2OH0sIHsxMCwgMTk3MH0sIHsxMCwgMTk3Mn0sCisgICAgezEwLCAxOTc0fSwgezEwLCAxOTc2fSwgezEwLCAxOTc4fSwgezEwLCAxOTgwfSwgezEwLCAxOTgyfSwgezEwLCAxOTg0fSwKKyAgICB7MTAsIDE5ODZ9LCB7MTAsIDE5ODh9LCB7MTAsIDE5OTB9LCB7MTAsIDE5OTJ9LCB7MTAsIDE5OTR9LCB7MTAsIDE5OTZ9LAorICAgIHsxMCwgMTk5OH0sIHsxMCwgMjAwMH0sIHsxMCwgMjAwMn0sIHsxMCwgMjAwNH0sIHsxMCwgMjAwNn0sIHsxMCwgMjAwOH0sCisgICAgezEwLCAyMDEwfSwgezEwLCAyMDEyfSwgezEwLCAyMDE0fSwgezEwLCAyMDE2fSwgezEwLCAyMDE4fSwgezEwLCAyMDIwfSwKKyAgICB7MTAsIDIwMjJ9LCB7MTAsIDIwMjR9LCB7MTAsIDIwMjZ9LCB7MTAsIDIwMjh9LCB7MTAsIDIwMzB9LCB7MTAsIDIwMzJ9LAorICAgIHsxMCwgMjAzNH0sIHsxMCwgMjAzNn0sIHsxMCwgMjAzOH0sIHsxMCwgMjA0MH0sIHsxMCwgMjA0Mn0sIHsxMCwgMjA0NH0sCisgICAgezEwLCAyMDQ2fSwgezEwLCAyMDQ4fSwgezEwLCAyMDUwfSwgezEwLCAyMDUyfSwgezEwLCAyMDU0fSwgezEwLCAyMDU2fSwKKyAgICB7MTAsIDIwNTh9LCB7MTAsIDIwNjB9LCB7MTAsIDIwNjJ9LCB7MTAsIDIwNjR9LCB7MTAsIDIwNjZ9LCB7MTAsIDIwNjh9LAorICAgIHsxMCwgMjA3MH0sIHsxMCwgMjA3Mn0sIHsxMCwgMjA3NH0sIHsxMCwgMjA3Nn0sIHsxMCwgMjA3OH0sIHsxMCwgMjA4MH0sCisgICAgezEwLCAyMDgyfSwgezEwLCAyMDg0fSwgezEwLCAyMDg2fSwgezEwLCAyMDg4fSwgezEwLCAyMDkwfSwgezEwLCAyMDkyfSwKKyAgICB7MTAsIDIwOTR9LCB7MTAsIDIwOTZ9LCB7MTAsIDIwOTh9LCB7MTAsIDIxMDB9LCB7MTAsIDIxMDJ9LCB7MTAsIDIxMDR9LAorICAgIHsxMCwgMjEwNn0sIHsxMCwgMjEwOH0sIHsxMCwgMjExMH0sIHsxMCwgMjExMn0sIHsxMCwgMjExNH0sIHsxMCwgMjExNn0sCisgICAgezEwLCAyMTE4fSwgezEwLCAyMTIwfSwgezEwLCAyMTIyfSwgezEwLCAyMTI0fSwgezEwLCAyMTI2fSwgezEwLCAyMTI4fSwKKyAgICB7MTAsIDIxMzB9LCB7MTAsIDIxMzJ9LCB7MTAsIDIxMzR9LCB7MTAsIDIxMzZ9LCB7MTAsIDIxMzh9LCB7MTAsIDIxNDB9LAorICAgIHsxMCwgMjE0Mn0sIHsxMCwgMjE0NH0sIHsxMCwgMjE0Nn0sIHsxMCwgMjE0OH0sIHsxMCwgMjE1MH0sIHsxMCwgMjE1Mn0sCisgICAgezEwLCAyMTU0fSwgezEwLCAyMTU2fSwgezEwLCAyMTU4fSwgezEwLCAyMTYwfSwgezEwLCAyMTYyfSwgezEwLCAyMTY0fSwKKyAgICB7MTAsIDIxNjZ9LCB7MTAsIDIxNjh9LCB7MTAsIDIxNzB9LCB7MTAsIDIxNzJ9LCB7MTAsIDIxNzR9LCB7MTAsIDIxNzZ9LAorICAgIHsxMCwgMjE3OH0sIHsxMCwgMjE4MH0sIHsxMCwgMjE4Mn0sIHsxMCwgMjE4NH0sIHsxMCwgMjE4Nn0sIHsxMCwgMjE4OH0sCisgICAgezEwLCAyMTkwfSwgezEwLCAyMTkyfSwgezEwLCAyMTk0fSwgezEwLCAyMTk2fSwgezEwLCAyMTk4fSwgezEwLCAyMjAwfSwKKyAgICB7MTAsIDIyMDJ9LCB7MTAsIDIyMDR9LCB7MTAsIDIyMDZ9LCB7MTAsIDIyMDh9LCB7MTAsIDIyMTB9LCB7MTAsIDIyMTJ9LAorICAgIHsxMCwgMjIxNH0sIHsxMCwgMjIxNn0sIHsxMCwgMjIxOH0sIHsxMCwgMjIyMH0sIHsxMCwgMjIyMn0sIHsxMCwgMjIyNH0sCisgICAgezEwLCAyMjI2fSwgezEwLCAyMjI4fSwgezEwLCAyMjMwfSwgezEwLCAyMjMyfSwgezEwLCAyMjM0fSwgezEwLCAyMjM2fSwKKyAgICB7MTAsIDIyMzh9LCB7MTAsIDIyNDB9LCB7MTAsIDIyNDJ9LCB7MTAsIDIyNDR9LCB7MTAsIDIyNDZ9LCB7MTAsIDIyNDh9LAorICAgIHsxMCwgMjI1MH0sIHsxMCwgMjI1Mn0sIHsxMCwgMjI1NH0sIHsxMCwgMjI1Nn0sIHsxMCwgMjI1OH0sIHsxMCwgMjI2MH0sCisgICAgezEwLCAyMjYyfSwgezEwLCAyMjY0fSwgezEwLCAyMjY2fSwgezEwLCAyMjY4fSwgezEwLCAyMjcwfSwgezEwLCAyMjcyfSwKKyAgICB7MTAsIDIyNzR9LCB7MTAsIDIyNzZ9LCB7MTAsIDIyNzh9LCB7MTAsIDIyODB9LCB7MTAsIDIyODJ9LCB7MTAsIDIyODR9LAorICAgIHsxMCwgMjI4Nn0sIHsxMCwgMjI4OH0sIHsxMCwgMjI5MH0sIHsxMCwgMjI5Mn0sIHsxMCwgMjI5NH0sIHsxMCwgMjI5Nn0sCisgICAgezEwLCAyMjk4fSwgezEwLCAyMzAwfSwgezEwLCAyMzAyfSwgezEwLCAyMzA0fSwgezEwLCAyMzA2fSwgezEwLCAyMzA4fSwKKyAgICB7MTAsIDIzMTB9LCB7MTAsIDIzMTJ9LCB7MTAsIDIzMTR9LCB7MTAsIDIzMTZ9LCB7MTAsIDIzMTh9LCB7MTAsIDIzMjB9LAorICAgIHsxMCwgMjMyMn0sIHsxMCwgMjMyNH0sIHsxMCwgMjMyNn0sIHsxMCwgMjMyOH0sIHsxMCwgMjMzMH0sIHsxMCwgMjMzMn0sCisgICAgezEwLCAyMzM0fSwgezEwLCAyMzM2fSwgezEwLCAyMzM4fSwgezEwLCAyMzQwfSwgezEwLCAyMzQyfSwgezEwLCAyMzQ0fSwKKyAgICB7MTAsIDIzNDZ9LCB7MTAsIDIzNDh9LCB7MTAsIDIzNTB9LCB7MTAsIDIzNTJ9LCB7MTAsIDIzNTR9LCB7MTAsIDIzNTZ9LAorICAgIHsxMCwgMjM1OH0sIHsxMCwgMjM2MH0sIHsxMCwgMjM2Mn0sIHsxMCwgMjM2NH0sIHsxMCwgMjM2Nn0sIHsxMCwgMjM2OH0sCisgICAgezEwLCAyMzcwfSwgezEwLCAyMzcyfSwgezEwLCAyMzc0fSwgezEwLCAyMzc2fSwgezEwLCAyMzc4fSwgezEwLCAyMzgwfSwKKyAgICB7MTAsIDIzODJ9LCB7MTAsIDIzODR9LCB7MTAsIDIzODZ9LCB7MTAsIDIzODh9LCB7MTAsIDIzOTB9LCB7MTAsIDIzOTJ9LAorICAgIHsxMCwgMjM5NH0sIHsxMCwgMjM5Nn0sIHsxMCwgMjM5OH0sIHsxMCwgMjQwMH0sIHsxMCwgMjQwMn0sIHsxMCwgMjQwNH0sCisgICAgezEwLCAyNDA2fSwgezEwLCAyNDA4fSwgezEwLCAyNDEwfSwgezEwLCAyNDEyfSwgezEwLCAyNDE0fSwgezEwLCAyNDE2fSwKKyAgICB7MTAsIDI0MTh9LCB7MTAsIDI0MjB9LCB7MTAsIDI0MjJ9LCB7MTAsIDI0MjR9LCB7MTAsIDI0MjZ9LCB7MTAsIDI0Mjh9LAorICAgIHsxMCwgMjQzMH0sIHsxMCwgMjQzMn0sIHsxMCwgMjQzNH0sIHsxMCwgMjQzNn0sIHsxMCwgMjQzOH0sIHsxMCwgMjQ0MH0sCisgICAgezEwLCAyNDQyfSwgezEwLCAyNDQ0fSwgezEwLCAyNDQ2fSwgezEwLCAyNDQ4fSwgezEwLCAyNDUwfSwgezEwLCAyNDUyfSwKKyAgICB7MTAsIDI0NTR9LCB7MTAsIDI0NTZ9LCB7MTAsIDI0NTh9LCB7MTAsIDI0NjB9LCB7MTAsIDI0NjJ9LCB7MTAsIDI0NjR9LAorICAgIHsxMCwgMjQ2Nn0sIHsxMCwgMjQ2OH0sIHsxMCwgMjQ3MH0sIHsxMCwgMjQ3Mn0sIHsxMCwgMjQ3NH0sIHsxMCwgMjQ3Nn0sCisgICAgezEwLCAyNDc4fSwgezEwLCAyNDgwfSwgezEwLCAyNDgyfSwgezEwLCAyNDg0fSwgezEwLCAyNDg2fSwgezEwLCAyNDg4fSwKKyAgICB7MTAsIDI0OTB9LCB7MTAsIDI0OTJ9LCB7MTAsIDI0OTR9LCB7MTAsIDI0OTZ9LCB7MTAsIDI0OTh9LCB7MTAsIDI1MDB9LAorICAgIHsxMCwgMjUwMn0sIHsxMCwgMjUwNH0sIHsxMCwgMjUwNn0sIHsxMCwgMjUwOH0sIHsxMCwgMjUxMH0sIHsxMCwgMjUxMn0sCisgICAgezEwLCAyNTE0fSwgezEwLCAyNTE2fSwgezEwLCAyNTE4fSwgezEwLCAyNTIwfSwgezEwLCAyNTIyfSwgezEwLCAyNTI0fSwKKyAgICB7MTAsIDI1MjZ9LCB7MTAsIDI1Mjh9LCB7MTAsIDI1MzB9LCB7MTAsIDI1MzJ9LCB7MTAsIDI1MzR9LCB7MTAsIDI1MzZ9LAorICAgIHsxMCwgMjUzOH0sIHsxMCwgMjU0MH0sIHsxMCwgMjU0Mn0sIHsxMCwgMjU0NH0sIHsxMCwgMjU0Nn0sIHsxMCwgMjU0OH0sCisgICAgezEwLCAyNTUwfSwgezEwLCAyNTUyfSwgezEwLCAyNTU0fSwgezEwLCAyNTU2fSwgezEwLCAyNTU4fSwgezEwLCAyNTYwfSwKKyAgICB7MTAsIDI1NjJ9LCB7MTAsIDI1NjR9LCB7MTAsIDI1NjZ9LCB7MTAsIDI1Njh9LCB7MTAsIDI1NzB9LCB7MTAsIDI1NzJ9LAorICAgIHsxMCwgMjU3NH0sIHsxMCwgMjU3Nn0sIHsxMCwgMjU3OH0sIHsxMCwgMjU4MH0sIHsxMCwgMjU4Mn0sIHsxMCwgMjU4NH0sCisgICAgezEwLCAyNTg2fSwgezEwLCAyNTg4fSwgezEwLCAyNTkwfSwgezEwLCAyNTkyfSwgezEwLCAyNTk0fSwgezEwLCAyNTk2fSwKKyAgICB7MTAsIDI1OTh9LCB7MTAsIDI2MDB9LCB7MTAsIDI2MDJ9LCB7MTAsIDI2MDR9LCB7MTAsIDI2MDZ9LCB7MTAsIDI2MDh9LAorICAgIHsxMCwgMjYxMH0sIHsxMCwgMjYxMn0sIHsxMCwgMjYxNH0sIHsxMCwgMjYxNn0sIHsxMCwgMjYxOH0sIHsxMCwgMjYyMH0sCisgICAgezEwLCAyNjIyfSwgezEwLCAyNjI0fSwgezEwLCAyNjI2fSwgezEwLCAyNjI4fSwgezEwLCAyNjMwfSwgezEwLCAyNjMyfSwKKyAgICB7MTAsIDI2MzR9LCB7MTAsIDI2MzZ9LCB7MTAsIDI2Mzh9LCB7MTAsIDI2NDB9LCB7MTAsIDI2NDJ9LCB7MTAsIDI2NDR9LAorICAgIHsxMCwgMjY0Nn0sIHsxMCwgMjY0OH0sIHsxMCwgMjY1MH0sIHsxMCwgMjY1Mn0sIHsxMCwgMjY1NH0sIHsxMCwgMjY1Nn0sCisgICAgezEwLCAyNjU4fSwgezEwLCAyNjYwfSwgezEwLCAyNjYyfSwgezEwLCAyNjY0fSwgezEwLCAyNjY2fSwgezEwLCAyNjY4fSwKKyAgICB7MTAsIDI2NzB9LCB7MTAsIDI2NzJ9LCB7MTAsIDI2NzR9LCB7MTAsIDI2NzZ9LCB7MTAsIDI2Nzh9LCB7MTAsIDI2ODB9LAorICAgIHsxMCwgMjY4Mn0sIHsxMCwgMjY4NH0sIHsxMCwgMjY4Nn0sIHsxMCwgMjY4OH0sIHsxMCwgMjY5MH0sIHsxMCwgMjY5Mn0sCisgICAgezEwLCAyNjk0fSwgezEwLCAyNjk2fSwgezEwLCAyNjk4fSwgezEwLCAyNzAwfSwgezEwLCAyNzAyfSwgezEwLCAyNzA0fSwKKyAgICB7MTAsIDI3MDZ9LCB7MTAsIDI3MDh9LCB7MTAsIDI3MTB9LCB7MTAsIDI3MTJ9LCB7MTAsIDI3MTR9LCB7MTAsIDI3MTZ9LAorICAgIHsxMCwgMjcxOH0sIHsxMCwgMjcyMH0sIHsxMCwgMjcyMn0sIHsxMCwgMjcyNH0sIHsxMCwgMjcyNn0sIHsxMCwgMjcyOH0sCisgICAgezEwLCAyNzMwfSwgezEwLCAyNzMyfSwgezEwLCAyNzM0fSwgezEwLCAyNzM2fSwgezEwLCAyNzM4fSwgezEwLCAyNzQwfSwKKyAgICB7MTAsIDI3NDJ9LCB7MTAsIDI3NDR9LCB7MTAsIDI3NDZ9LCB7MTAsIDI3NDh9LCB7MTAsIDI3NTB9LCB7MTAsIDI3NTJ9LAorICAgIHsxMCwgMjc1NH0sIHsxMCwgMjc1Nn0sIHsxMCwgMjc1OH0sIHsxMCwgMjc2MH0sIHsxMCwgMjc2Mn0sIHsxMCwgMjc2NH0sCisgICAgezEwLCAyNzY2fSwgezEwLCAyNzY4fSwgezEwLCAyNzcwfSwgezEwLCAyNzcyfSwgezEwLCAyNzc0fSwgezEwLCAyNzc2fSwKKyAgICB7MTAsIDI3Nzh9LCB7MTAsIDI3ODB9LCB7MTAsIDI3ODJ9LCB7MTAsIDI3ODR9LCB7MTAsIDI3ODZ9LCB7MTAsIDI3ODh9LAorICAgIHsxMCwgMjc5MH0sIHsxMCwgMjc5Mn0sIHsxMCwgMjc5NH0sIHsxMCwgMjc5Nn0sIHsxMCwgMjc5OH0sIHsxMCwgMjgwMH0sCisgICAgezEwLCAyODAyfSwgezEwLCAyODA0fSwgezEwLCAyODA2fSwgezEwLCAyODA4fSwgezEwLCAyODEwfSwgezEwLCAyODEyfSwKKyAgICB7MTAsIDI4MTR9LCB7MTAsIDI4MTZ9LCB7MTAsIDI4MTh9LCB7MTAsIDI4MjB9LCB7MTAsIDI4MjJ9LCB7MTAsIDI4MjR9LAorICAgIHsxMCwgMjgyNn0sIHsxMCwgMjgyOH0sIHsxMCwgMjgzMH0sIHsxMCwgMjgzMn0sIHsxMCwgMjgzNH0sIHsxMCwgMjgzNn0sCisgICAgezEwLCAyODM4fSwgezEwLCAyODQwfSwgezEwLCAyODQyfSwgezEwLCAyODQ0fSwgezEwLCAyODQ2fSwgezEwLCAyODQ4fSwKKyAgICB7MTAsIDI4NTB9LCB7MTAsIDI4NTJ9LCB7MTAsIDI4NTR9LCB7MTAsIDI4NTZ9LCB7MTAsIDI4NTh9LCB7MTAsIDI4NjB9LAorICAgIHsxMCwgMjg2Mn0sIHsxMCwgMjg2NH0sIHsxMCwgMjg2Nn0sIHsxMCwgMjg2OH0sIHsxMCwgMjg3MH0sIHsxMCwgMjg3Mn0sCisgICAgezEwLCAyODc0fSwgezEwLCAyODc2fSwgezEwLCAyODc4fSwgezEwLCAyODgwfSwgezEwLCAyODgyfSwgezEwLCAyODg0fSwKKyAgICB7MTAsIDI4ODZ9LCB7MTAsIDI4ODh9LCB7MTAsIDI4OTB9LCB7MTAsIDI4OTJ9LCB7MTAsIDI4OTR9LCB7MTAsIDI4OTZ9LAorICAgIHsxMCwgMjg5OH0sIHsxMCwgMjkwMH0sIHsxMCwgMjkwMn0sIHsxMCwgMjkwNH0sIHsxMCwgMjkwNn0sIHsxMCwgMjkwOH0sCisgICAgezEwLCAyOTEwfSwgezEwLCAyOTEyfSwgezEwLCAyOTE0fSwgezEwLCAyOTE2fSwgezEwLCAyOTE4fSwgezEwLCAyOTIwfSwKKyAgICB7MTAsIDI5MjJ9LCB7MTAsIDI5MjR9LCB7MTAsIDI5MjZ9LCB7MTAsIDI5Mjh9LCB7MTAsIDI5MzB9LCB7MTAsIDI5MzJ9LAorICAgIHsxMCwgMjkzNH0sIHsxMCwgMjkzNn0sIHsxMCwgMjkzOH0sIHsxMCwgMjk0MH0sIHsxMCwgMjk0Mn0sIHsxMCwgMjk0NH0sCisgICAgezEwLCAyOTQ2fSwgezEwLCAyOTQ4fSwgezEwLCAyOTUwfSwgezEwLCAyOTUyfSwgezEwLCAyOTU0fSwgezEwLCAyOTU2fSwKKyAgICB7MTAsIDI5NTh9LCB7MTAsIDI5NjB9LCB7MTAsIDI5NjJ9LCB7MTAsIDI5NjR9LCB7MTAsIDI5NjZ9LCB7MTAsIDI5Njh9LAorICAgIHsxMCwgMjk3MH0sIHsxMCwgMjk3Mn0sIHsxMCwgMjk3NH0sIHsxMCwgMjk3Nn0sIHsxMCwgMjk3OH0sIHsxMCwgMjk4MH0sCisgICAgezEwLCAyOTgyfSwgezEwLCAyOTg0fSwgezEwLCAyOTg2fSwgezEwLCAyOTg4fSwgezEwLCAyOTkwfSwgezEwLCAyOTkyfSwKKyAgICB7MTAsIDI5OTR9LCB7MTAsIDI5OTZ9LCB7MTAsIDI5OTh9LCB7MTAsIDMwMDB9LCB7MTAsIDMwMDJ9LCB7MTAsIDMwMDR9LAorICAgIHsxMCwgMzAwNn0sIHsxMCwgMzAwOH0sIHsxMCwgMzAxMH0sIHsxMCwgMzAxMn0sIHsxMCwgMzAxNH0sIHsxMCwgMzAxNn0sCisgICAgezEwLCAzMDE4fSwgezEwLCAzMDIwfSwgezEwLCAzMDIyfSwgezEwLCAzMDI0fSwgezEwLCAzMDI2fSwgezEwLCAzMDI4fSwKKyAgICB7MTAsIDMwMzB9LCB7MTAsIDMwMzJ9LCB7MTAsIDMwMzR9LCB7MTAsIDMwMzZ9LCB7MTAsIDMwMzh9LCB7MTAsIDMwNDB9LAorICAgIHsxMCwgMzA0Mn0sIHsxMCwgMzA0NH0sIHsxMCwgMzA0Nn0sIHsxMCwgMzA0OH0sIHsxMCwgMzA1MH0sIHsxMCwgMzA1Mn0sCisgICAgezEwLCAzMDU0fSwgezEwLCAzMDU2fSwgezEwLCAzMDU4fSwgezEwLCAzMDYwfSwgezEwLCAzMDYyfSwgezEwLCAzMDY0fSwKKyAgICB7MTAsIDMwNjZ9LCB7MTAsIDMwNjh9LCB7MTAsIDMwNzB9LCB7MTAsIDMwNzJ9LCB7MTAsIDMwNzR9LCB7MTAsIDMwNzZ9LAorICAgIHsxMCwgMzA3OH0sIHsxMCwgMzA4MH0sIHsxMCwgMzA4Mn0sIHsxMCwgMzA4NH0sIHsxMCwgMzA4Nn0sIHsxMCwgMzA4OH0sCisgICAgezEwLCAzMDkwfSwgezEwLCAzMDkyfSwgezEwLCAzMDk0fSwgezEwLCAzMDk2fSwgezEwLCAzMDk4fSwgezEwLCAzMTAwfSwKKyAgICB7MTAsIDMxMDJ9LCB7MTAsIDMxMDR9LCB7MTAsIDMxMDZ9LCB7MTAsIDMxMDh9LCB7MTAsIDMxMTB9LCB7MTAsIDMxMTJ9LAorICAgIHsxMCwgMzExNH0sIHsxMCwgMzExNn0sIHsxMCwgMzExOH0sIHsxMCwgMzEyMH0sIHsxMCwgMzEyMn0sIHsxMCwgMzEyNH0sCisgICAgezEwLCAzMTI2fSwgezEwLCAzMTI4fSwgezEwLCAzMTMwfSwgezEwLCAzMTMyfSwgezEwLCAzMTM0fSwgezEwLCAzMTM2fSwKKyAgICB7MTAsIDMxMzh9LCB7MTAsIDMxNDB9LCB7MTAsIDMxNDJ9LCB7MTAsIDMxNDR9LCB7MTAsIDMxNDZ9LCB7MTAsIDMxNDh9LAorICAgIHsxMCwgMzE1MH0sIHsxMCwgMzE1Mn0sIHsxMCwgMzE1NH0sIHsxMCwgMzE1Nn0sIHsxMCwgMzE1OH0sIHsxMCwgMzE2MH0sCisgICAgezEwLCAzMTYyfSwgezEwLCAzMTY0fSwgezEwLCAzMTY2fSwgezEwLCAzMTY4fSwgezEwLCAzMTcwfSwgezEwLCAzMTcyfSwKKyAgICB7MTAsIDMxNzR9LCB7MTAsIDMxNzZ9LCB7MTAsIDMxNzh9LCB7MTAsIDMxODB9LCB7MTAsIDMxODJ9LCB7MTAsIDMxODR9LAorICAgIHsxMCwgMzE4Nn0sIHsxMCwgMzE4OH0sIHsxMCwgMzE5MH0sIHsxMCwgMzE5Mn0sIHsxMCwgMzE5NH0sIHsxMCwgMzE5Nn0sCisgICAgezEwLCAzMTk4fSwgezEwLCAzMjAwfSwgezEwLCAzMjAyfSwgezEwLCAzMjA0fSwgezEwLCAzMjA2fSwgezEwLCAzMjA4fSwKKyAgICB7MTAsIDMyMTB9LCB7MTAsIDMyMTJ9LCB7MTAsIDMyMTR9LCB7MTAsIDMyMTZ9LCB7MTAsIDMyMTh9LCB7MTAsIDMyMjB9LAorICAgIHsxMCwgMzIyMn0sIHsxMCwgMzIyNH0sIHsxMCwgMzIyNn0sIHsxMCwgMzIyOH0sIHsxMCwgMzIzMH0sIHsxMCwgMzIzMn0sCisgICAgezEwLCAzMjM0fSwgezEwLCAzMjM2fSwgezEwLCAzMjM4fSwgezEwLCAzMjQwfSwgezEwLCAzMjQyfSwgezEwLCAzMjQ0fSwKKyAgICB7MTAsIDMyNDZ9LCB7MTAsIDMyNDh9LCB7MTAsIDMyNTB9LCB7MTAsIDMyNTJ9LCB7MTAsIDMyNTR9LCB7MTAsIDMyNTZ9LAorICAgIHsxMCwgMzI1OH0sIHsxMCwgMzI2MH0sIHsxMCwgMzI2Mn0sIHsxMCwgMzI2NH0sIHsxMCwgMzI2Nn0sIHsxMCwgMzI2OH0sCisgICAgezEwLCAzMjcwfSwgezEwLCAzMjcyfSwgezEwLCAzMjc0fSwgezEwLCAzMjc2fSwgezEwLCAzMjc4fSwgezEwLCAzMjgwfSwKKyAgICB7MTAsIDMyODJ9LCB7MTAsIDMyODR9LCB7MTAsIDMyODZ9LCB7MTAsIDMyODh9LCB7MTAsIDMyOTB9LCB7MTAsIDMyOTJ9LAorICAgIHsxMCwgMzI5NH0sIHsxMCwgMzI5Nn0sIHsxMCwgMzI5OH0sIHsxMCwgMzMwMH0sIHsxMCwgMzMwMn0sIHsxMCwgMzMwNH0sCisgICAgezEwLCAzMzA2fSwgezEwLCAzMzA4fSwgezEwLCAzMzEwfSwgezEwLCAzMzEyfSwgezEwLCAzMzE0fSwgezEwLCAzMzE2fSwKKyAgICB7MTAsIDMzMTh9LCB7MTAsIDMzMjB9LCB7MTAsIDMzMjJ9LCB7MTAsIDMzMjR9LCB7MTAsIDMzMjZ9LCB7MTAsIDMzMjh9LAorICAgIHsxMCwgMzMzMH0sIHsxMCwgMzMzMn0sIHsxMCwgMzMzNH0sIHsxMCwgMzMzNn0sIHsxMCwgMzMzOH0sIHsxMCwgMzM0MH0sCisgICAgezEwLCAzMzQyfSwgezEwLCAzMzQ0fSwgezEwLCAzMzQ2fSwgezEwLCAzMzQ4fSwgezEwLCAzMzUwfSwgezEwLCAzMzUyfSwKKyAgICB7MTAsIDMzNTR9LCB7MTAsIDMzNTZ9LCB7MTAsIDMzNTh9LCB7MTAsIDMzNjB9LCB7MTAsIDMzNjJ9LCB7MTAsIDMzNjR9LAorICAgIHsxMCwgMzM2Nn0sIHsxMCwgMzM2OH0sIHsxMCwgMzM3MH0sIHsxMCwgMzM3Mn0sIHsxMCwgMzM3NH0sIHsxMCwgMzM3Nn0sCisgICAgezEwLCAzMzc4fSwgezEwLCAzMzgwfSwgezEwLCAzMzgyfSwgezEwLCAzMzg0fSwgezEwLCAzMzg2fSwgezEwLCAzMzg4fSwKKyAgICB7MTAsIDMzOTB9LCB7MTAsIDMzOTJ9LCB7MTAsIDMzOTR9LCB7MTAsIDMzOTZ9LCB7MTAsIDMzOTh9LCB7MTAsIDM0MDB9LAorICAgIHsxMCwgMzQwMn0sIHsxMCwgMzQwNH0sIHsxMCwgMzQwNn0sIHsxMCwgMzQwOH0sIHsxMCwgMzQxMH0sIHsxMCwgMzQxMn0sCisgICAgezEwLCAzNDE0fSwgezEwLCAzNDE2fSwgezEwLCAzNDE4fSwgezEwLCAzNDIwfSwgezEwLCAzNDIyfSwgezEwLCAzNDI0fSwKKyAgICB7MTAsIDM0MjZ9LCB7MTAsIDM0Mjh9LCB7MTAsIDM0MzB9LCB7MTAsIDM0MzJ9LCB7MTAsIDM0MzR9LCB7MTAsIDM0MzZ9LAorICAgIHsxMCwgMzQzOH0sIHsxMCwgMzQ0MH0sIHsxMCwgMzQ0Mn0sIHsxMCwgMzQ0NH0sIHsxMCwgMzQ0Nn0sIHsxMCwgMzQ0OH0sCisgICAgezEwLCAzNDUwfSwgezEwLCAzNDUyfSwgezEwLCAzNDU0fSwgezEwLCAzNDU2fSwgezEwLCAzNDU4fSwgezEwLCAzNDYwfSwKKyAgICB7MTAsIDM0NjJ9LCB7MTAsIDM0NjR9LCB7MTAsIDM0NjZ9LCB7MTAsIDM0Njh9LCB7MTAsIDM0NzB9LCB7MTAsIDM0NzJ9LAorICAgIHsxMCwgMzQ3NH0sIHsxMCwgMzQ3Nn0sIHsxMCwgMzQ3OH0sIHsxMCwgMzQ4MH0sIHsxMCwgMzQ4Mn0sIHsxMCwgMzQ4NH0sCisgICAgezEwLCAzNDg2fSwgezEwLCAzNDg4fSwgezEwLCAzNDkwfSwgezEwLCAzNDkyfSwgezEwLCAzNDk0fSwgezEwLCAzNDk2fSwKKyAgICB7MTAsIDM0OTh9LCB7MTAsIDM1MDB9LCB7MTAsIDM1MDJ9LCB7MTAsIDM1MDR9LCB7MTAsIDM1MDZ9LCB7MTAsIDM1MDh9LAorICAgIHsxMCwgMzUxMH0sIHsxMCwgMzUxMn0sIHsxMCwgMzUxNH0sIHsxMCwgMzUxNn0sIHsxMCwgMzUxOH0sIHsxMCwgMzUyMH0sCisgICAgezEwLCAzNTIyfSwgezEwLCAzNTI0fSwgezEwLCAzNTI2fSwgezEwLCAzNTI4fSwgezEwLCAzNTMwfSwgezEwLCAzNTMyfSwKKyAgICB7MTAsIDM1MzR9LCB7MTAsIDM1MzZ9LCB7MTAsIDM1Mzh9LCB7MTAsIDM1NDB9LCB7MTAsIDM1NDJ9LCB7MTAsIDM1NDR9LAorICAgIHsxMCwgMzU0Nn0sIHsxMCwgMzU0OH0sIHsxMCwgMzU1MH0sIHsxMCwgMzU1Mn0sIHsxMCwgMzU1NH0sIHsxMCwgMzU1Nn0sCisgICAgezEwLCAzNTU4fSwgezEwLCAzNTYwfSwgezEwLCAzNTYyfSwgezEwLCAzNTY0fSwgezEwLCAzNTY2fSwgezEwLCAzNTY4fSwKKyAgICB7MTAsIDM1NzB9LCB7MTAsIDM1NzJ9LCB7MTAsIDM1NzR9LCB7MTAsIDM1NzZ9LCB7MTAsIDM1Nzh9LCB7MTAsIDM1ODB9LAorICAgIHsxMCwgMzU4Mn0sIHsxMCwgMzU4NH0sIHsxMCwgMzU4Nn0sIHsxMCwgMzU4OH0sIHsxMCwgMzU5MH0sIHsxMCwgMzU5Mn0sCisgICAgezEwLCAzNTk0fSwgezEwLCAzNTk2fSwgezEwLCAzNTk4fSwgezEwLCAzNjAwfSwgezEwLCAzNjAyfSwgezEwLCAzNjA0fSwKKyAgICB7MTAsIDM2MDZ9LCB7MTAsIDM2MDh9LCB7MTAsIDM2MTB9LCB7MTAsIDM2MTJ9LCB7MTAsIDM2MTR9LCB7MTAsIDM2MTZ9LAorICAgIHsxMCwgMzYxOH0sIHsxMCwgMzYyMH0sIHsxMCwgMzYyMn0sIHsxMCwgMzYyNH0sIHsxMCwgMzYyNn0sIHsxMCwgMzYyOH0sCisgICAgezEwLCAzNjMwfSwgezEwLCAzNjMyfSwgezEwLCAzNjM0fSwgezEwLCAzNjM2fSwgezEwLCAzNjM4fSwgezEwLCAzNjQwfSwKKyAgICB7MTAsIDM2NDJ9LCB7MTAsIDM2NDR9LCB7MTAsIDM2NDZ9LCB7MTAsIDM2NDh9LCB7MTAsIDM2NTB9LCB7MTAsIDM2NTJ9LAorICAgIHsxMCwgMzY1NH0sIHsxMCwgMzY1Nn0sIHsxMCwgMzY1OH0sIHsxMCwgMzY2MH0sIHsxMCwgMzY2Mn0sIHsxMCwgMzY2NH0sCisgICAgezEwLCAzNjY2fSwgezEwLCAzNjY4fSwgezEwLCAzNjcwfSwgezEwLCAzNjcyfSwgezEwLCAzNjc0fSwgezEwLCAzNjc2fSwKKyAgICB7MTAsIDM2Nzh9LCB7MTAsIDM2ODB9LCB7MTAsIDM2ODJ9LCB7MTAsIDM2ODR9LCB7MTAsIDM2ODZ9LCB7MTAsIDM2ODh9LAorICAgIHsxMCwgMzY5MH0sIHsxMCwgMzY5Mn0sIHsxMCwgMzY5NH0sIHsxMCwgMzY5Nn0sIHsxMCwgMzY5OH0sIHsxMCwgMzcwMH0sCisgICAgezEwLCAzNzAyfSwgezEwLCAzNzA0fSwgezEwLCAzNzA2fSwgezEwLCAzNzA4fSwgezEwLCAzNzEwfSwgezEwLCAzNzEyfSwKKyAgICB7MTAsIDM3MTR9LCB7MTAsIDM3MTZ9LCB7MTAsIDM3MTh9LCB7MTAsIDM3MjB9LCB7MTAsIDM3MjJ9LCB7MTAsIDM3MjR9LAorICAgIHsxMCwgMzcyNn0sIHsxMCwgMzcyOH0sIHsxMCwgMzczMH0sIHsxMCwgMzczMn0sIHsxMCwgMzczNH0sIHsxMCwgMzczNn0sCisgICAgezEwLCAzNzM4fSwgezEwLCAzNzQwfSwgezEwLCAzNzQyfSwgezEwLCAzNzQ0fSwgezEwLCAzNzQ2fSwgezEwLCAzNzQ4fSwKKyAgICB7MTAsIDM3NTB9LCB7MTAsIDM3NTJ9LCB7MTAsIDM3NTR9LCB7MTAsIDM3NTZ9LCB7MTAsIDM3NTh9LCB7MTAsIDM3NjB9LAorICAgIHsxMCwgMzc2Mn0sIHsxMCwgMzc2NH0sIHsxMCwgMzc2Nn0sIHsxMCwgMzc2OH0sIHsxMCwgMzc3MH0sIHsxMCwgMzc3Mn0sCisgICAgezEwLCAzNzc0fSwgezEwLCAzNzc2fSwgezEwLCAzNzc4fSwgezEwLCAzNzgwfSwgezEwLCAzNzgyfSwgezEwLCAzNzg0fSwKKyAgICB7MTAsIDM3ODZ9LCB7MTAsIDM3ODh9LCB7MTAsIDM3OTB9LCB7MTAsIDM3OTJ9LCB7MTAsIDM3OTR9LCB7MTAsIDM3OTZ9LAorICAgIHsxMCwgMzc5OH0sIHsxMCwgMzgwMH0sIHsxMCwgMzgwMn0sIHsxMCwgMzgwNH0sIHsxMCwgMzgwNn0sIHsxMCwgMzgwOH0sCisgICAgezEwLCAzODEwfSwgezEwLCAzODEyfSwgezEwLCAzODE0fSwgezEwLCAzODE2fSwgezEwLCAzODE4fSwgezEwLCAzODIwfSwKKyAgICB7MTAsIDM4MjJ9LCB7MTAsIDM4MjR9LCB7MTAsIDM4MjZ9LCB7MTAsIDM4Mjh9LCB7MTAsIDM4MzB9LCB7MTAsIDM4MzJ9LAorICAgIHsxMCwgMzgzNH0sIHsxMCwgMzgzNn0sIHsxMCwgMzgzOH0sIHsxMCwgMzg0MH0sIHsxMCwgMzg0Mn0sIHsxMCwgMzg0NH0sCisgICAgezEwLCAzODQ2fSwgezEwLCAzODQ4fSwgezEwLCAzODUwfSwgezEwLCAzODUyfSwgezEwLCAzODU0fSwgezEwLCAzODU2fSwKKyAgICB7MTAsIDM4NTh9LCB7MTAsIDM4NjB9LCB7MTAsIDM4NjJ9LCB7MTAsIDM4NjR9LCB7MTAsIDM4NjZ9LCB7MTAsIDM4Njh9LAorICAgIHsxMCwgMzg3MH0sIHsxMCwgMzg3Mn0sIHsxMCwgMzg3NH0sIHsxMCwgMzg3Nn0sIHsxMCwgMzg3OH0sIHsxMCwgMzg4MH0sCisgICAgezEwLCAzODgyfSwgezEwLCAzODg0fSwgezEwLCAzODg2fSwgezEwLCAzODg4fSwgezEwLCAzODkwfSwgezEwLCAzODkyfSwKKyAgICB7MTAsIDM4OTR9LCB7MTAsIDM4OTZ9LCB7MTAsIDM4OTh9LCB7MTAsIDM5MDB9LCB7MTAsIDM5MDJ9LCB7MTAsIDM5MDR9LAorICAgIHsxMCwgMzkwNn0sIHsxMCwgMzkwOH0sIHsxMCwgMzkxMH0sIHsxMCwgMzkxMn0sIHsxMCwgMzkxNH0sIHsxMCwgMzkxNn0sCisgICAgezEwLCAzOTE4fSwgezEwLCAzOTIwfSwgezEwLCAzOTIyfSwgezEwLCAzOTI0fSwgezEwLCAzOTI2fSwgezEwLCAzOTI4fSwKKyAgICB7MTAsIDM5MzB9LCB7MTAsIDM5MzJ9LCB7MTAsIDM5MzR9LCB7MTAsIDM5MzZ9LCB7MTAsIDM5Mzh9LCB7MTAsIDM5NDB9LAorICAgIHsxMCwgMzk0Mn0sIHsxMCwgMzk0NH0sIHsxMCwgMzk0Nn0sIHsxMCwgMzk0OH0sIHsxMCwgMzk1MH0sIHsxMCwgMzk1Mn0sCisgICAgezEwLCAzOTU0fSwgezEwLCAzOTU2fSwgezEwLCAzOTU4fSwgezEwLCAzOTYwfQorfTsKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9kZWZhdWx0Y29lZmNvdW50cy5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2RlZmF1bHRjb2VmY291bnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwZjNkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9kZWZhdWx0Y29lZmNvdW50cy5oCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEdlbmVyYXRlZCBmaWxlLCBpbmNsdWRlZCBieSBlbnRyb3B5LmMgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0X2NvZWZfY291bnRzW0JMT0NLX1RZUEVTXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NPRUZfQkFORFNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFVl9DT0VGX0NPTlRFWFRTXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW01BWF9FTlRST1BZX1RPS0VOU10gPQoreworCisgICAgeworICAgICAgICAvKiBCbG9jayBUeXBlICggMCApICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAwICkgKi8KKyAgICAgICAgICAgIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgeyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDEgKSAqLworICAgICAgICAgICAgezMwMTkwLCAyNjU0NCwgMjI1LCAgMjQsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNDE3MTU5Myx9LAorICAgICAgICAgICAgezI2ODQ2LCAyNTE1NywgMTI0MSwgMTMwLCAgMjYsICAgNiwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsIDE0OTk4Nyx9LAorICAgICAgICAgICAgezEwNDg0LCA5NTM4LCAxMDA2LCAxNjAsICAzNiwgIDE4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTUxMDQsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDIgKSAqLworICAgICAgICAgICAgezI1ODQyLCA0MDQ1NiwgMTEyNiwgIDgzLCAgMTEsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgezkzMzgsIDgwMTAsIDUxMiwgIDczLCAgIDcsICAgMywgICAyLCAgIDAsICAgMCwgICAwLCAgIDAsIDQzMjk0LH0sCisgICAgICAgICAgICB7MTA0NywgNzUxLCAxNDksICAzMSwgIDEzLCAgIDYsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCA4NzksfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDMgKSAqLworICAgICAgICAgICAgezI2MTM2LCA5ODI2LCAyNTIsICAxMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHs4MTM0LCA1NTc0LCAxOTEsICAxNCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAzNTMwMix9LAorICAgICAgICAgICAgeyA2MDUsIDY3NywgMTE2LCAgIDksICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNjExLH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA0ICkgKi8KKyAgICAgICAgICAgIHsxMDI2MywgMTU0NjMsIDI4MywgIDE3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgezI3NzMsIDIxOTEsIDEyOCwgICA5LCAgIDIsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDEwMDczLH0sCisgICAgICAgICAgICB7IDEzNCwgMTI1LCAgMzIsICAgNCwgICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgNTAsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDUgKSAqLworICAgICAgICAgICAgezEwNDgzLCAyNjYzLCAgMjMsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHsyMTM3LCAxMjUxLCAgMjcsICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAxNDM2Mix9LAorICAgICAgICAgICAgeyAxMTYsIDE1NiwgIDE0LCAgIDIsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTkwLH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA2ICkgKi8KKyAgICAgICAgICAgIHs0MDk3NywgMjc2MTQsIDQxMiwgIDI4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgezYxMTMsIDUyMTMsIDI2MSwgIDIyLCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDI2MTY0LH0sCisgICAgICAgICAgICB7IDM4MiwgMzEyLCAgNTAsICAxNCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAzNDUsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDcgKSAqLworICAgICAgICAgICAgeyAgIDAsICAyNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7ICAgMCwgIDEzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAzMTksfSwKKyAgICAgICAgICAgIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgOCx9LAorICAgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBCbG9jayBUeXBlICggMSApICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAwICkgKi8KKyAgICAgICAgICAgIHszMjY4LCAxOTM4MiwgMTA0MywgMjUwLCAgOTMsICA4MiwgIDQ5LCAgMjYsICAxNywgICA4LCAgMjUsIDgyMjg5LH0sCisgICAgICAgICAgICB7ODc1OCwgMzIxMTAsIDU0MzYsIDE4MzIsIDgyNywgNjY4LCA0MjAsIDE1MywgIDI0LCAgIDAsICAgMywgNTI5MTQsfSwKKyAgICAgICAgICAgIHs5MzM3LCAyMzcyNSwgODQ4NywgMzk1NCwgMjEwNywgMTgzNiwgMTA2OSwgMzk5LCAgNTksICAgMCwgICAwLCAxODYyMCx9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMSApICovCisgICAgICAgICAgICB7MTI0MTksIDg0MjAsIDQ1MiwgIDYyLCAgIDksICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgezExNzE1LCA4NzA1LCA2OTMsICA5MiwgIDE1LCAgIDcsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCA1Mzk4OCx9LAorICAgICAgICAgICAgezc2MDMsIDg1ODUsIDIzMDYsIDc3OCwgMjcwLCAxNDUsICAzOSwgICA1LCAgIDAsICAgMCwgICAwLCA5MTM2LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAyICkgKi8KKyAgICAgICAgICAgIHsxNTkzOCwgMTQzMzUsIDEyMDcsIDE4NCwgIDU1LCAgMTMsICAgNCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHs3NDE1LCA2ODI5LCAxMTM4LCAyNDQsICA3MSwgIDI2LCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgOTk4MCx9LAorICAgICAgICAgICAgezE1ODAsIDE4MjQsIDY1NSwgMjQxLCAgODksICA0NiwgIDEwLCAgIDIsICAgMCwgICAwLCAgIDAsIDQyOSx9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMyApICovCisgICAgICAgICAgICB7MTk0NTMsIDUyNjAsIDIwMSwgIDE5LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgezkxNzMsIDM3NTgsIDIxMywgIDIyLCAgIDEsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDk4MjAsfSwKKyAgICAgICAgICAgIHsxNjg5LCAxMjc3LCAyNzYsICA1MSwgIDE3LCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA2NzksfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDQgKSAqLworICAgICAgICAgICAgezEyMDc2LCAxMDY2NywgNjIwLCAgODUsICAxOSwgICA5LCAgIDUsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7NDY2NSwgMzYyNSwgNDIzLCAgNTUsICAxOSwgICA5LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNTEyNyx9LAorICAgICAgICAgICAgeyA0MTUsIDQ0MCwgMTQzLCAgMzQsICAyMCwgICA3LCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgMTAxLH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA1ICkgKi8KKyAgICAgICAgICAgIHsxMjE4MywgNDg0NiwgMTE1LCAgMTEsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7NDIyNiwgMzE0OSwgMTc3LCAgMjEsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNzE1Nyx9LAorICAgICAgICAgICAgeyAzNzUsIDYyMSwgMTg5LCAgNTEsICAxMSwgICA0LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgMTk4LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA2ICkgKi8KKyAgICAgICAgICAgIHs2MTY1OCwgMzc3NDMsIDEyMDMsICA5NCwgIDEwLCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHsxNTUxNCwgMTE1NjMsIDkwMywgMTExLCAgMTQsICAgNSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDI1MTk1LH0sCisgICAgICAgICAgICB7IDkyOSwgMTA3NywgMjkxLCAgNzgsICAxNCwgICA3LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgNTA3LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA3ICkgKi8KKyAgICAgICAgICAgIHsgICAwLCA5OTAsICAxNSwgICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgeyAgIDAsIDQxMiwgIDEzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTY0MSx9LAorICAgICAgICAgICAgeyAgIDAsICAxOCwgICA3LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgIDMwLH0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIEJsb2NrIFR5cGUgKCAyICkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDAgKSAqLworICAgICAgICAgICAgeyA5NTMsIDI0NTE5LCA2MjgsIDEyMCwgIDI4LCAgMTIsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAyMjQ4Nzk4LH0sCisgICAgICAgICAgICB7MTUyNSwgMjU2NTQsIDI2NDcsIDYxNywgMjM5LCAxNDMsICA0MiwgICA1LCAgIDAsICAgMCwgICAwLCA2NjgzNyx9LAorICAgICAgICAgICAgezExODAsIDExMDExLCAzMDAxLCAxMjM3LCA1MzIsIDQ0OCwgMjM5LCAgNTQsICAgNSwgICAwLCAgIDAsIDcxMjIsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDEgKSAqLworICAgICAgICAgICAgezEzNTYsIDIyMjAsICA2NywgIDEwLCAgIDQsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgezE0NTAsIDI1NDQsIDEwMiwgIDE4LCAgIDQsICAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDU3MDYzLH0sCisgICAgICAgICAgICB7MTE4MiwgMjExMCwgNDcwLCAxMzAsICA0MSwgIDIxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNjA0Nyx9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMiApICovCisgICAgICAgICAgICB7IDM3MCwgMzM3OCwgMjAwLCAgMzAsICAgNSwgICA0LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7IDI5MywgMTAwNiwgMTMxLCAgMjksICAxMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNTQwNCx9LAorICAgICAgICAgICAgeyAxMTQsIDM4NywgIDk4LCAgMjMsICAgNCwgICA4LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgMjM2LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAzICkgKi8KKyAgICAgICAgICAgIHsgNTc5LCAxOTQsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgeyAzOTUsIDIxMywgICA1LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNDE1Nyx9LAorICAgICAgICAgICAgeyAxMTksIDEyMiwgICA0LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMzAwLH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA0ICkgKi8KKyAgICAgICAgICAgIHsgIDM4LCA1NTcsICAxOSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgeyAgMjEsIDExNCwgIDEyLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNDI3LH0sCisgICAgICAgICAgICB7ICAgMCwgICA1LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDcsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDUgKSAqLworICAgICAgICAgICAgeyAgNTIsICAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7ICAxOCwgICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA2NTIsfSwKKyAgICAgICAgICAgIHsgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAzMCx9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNiApICovCisgICAgICAgICAgICB7IDY0MCwgNTY5LCAgMTAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHsgIDI1LCAgNzcsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDUxNyx9LAorICAgICAgICAgICAgeyAgIDQsICAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAzLH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA3ICkgKi8KKyAgICAgICAgICAgIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgeyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogQmxvY2sgVHlwZSAoIDMgKSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMCApICovCisgICAgICAgICAgICB7MjUwNiwgMjAxNjEsIDI3MDcsIDc2NywgMjYxLCAxNzgsIDEwNywgIDMwLCAgMTQsICAgMywgICAwLCAxMDA2OTQsfSwKKyAgICAgICAgICAgIHs4ODA2LCAzNjQ3OCwgODgxNywgMzI2OCwgMTI4MCwgODUwLCA0MDEsIDExNCwgIDQyLCAgIDAsICAgMCwgNTg1NzIsfSwKKyAgICAgICAgICAgIHsxMTAwMywgMjcyMTQsIDExNzk4LCA1NzE2LCAyNDgyLCAyMDcyLCAxMDQ4LCAxNzUsICAzMiwgICAwLCAgIDAsIDE5Mjg0LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAxICkgKi8KKyAgICAgICAgICAgIHs5NzM4LCAxMTMxMywgOTU5LCAyMDUsICA3MCwgIDE4LCAgMTEsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLH0sCisgICAgICAgICAgICB7MTI2MjgsIDE1MDg1LCAxNTA3LCAyNzMsICA1MiwgIDE5LCAgIDksICAgMCwgICAwLCAgIDAsICAgMCwgNTQyODAsfSwKKyAgICAgICAgICAgIHsxMDcwMSwgMTU4NDYsIDU1NjEsIDE5MjYsIDgxMywgNTcwLCAyNDksICAzNiwgICAwLCAgIDAsICAgMCwgNjQ2MCx9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMiApICovCisgICAgICAgICAgICB7Njc4MSwgMjI1MzksIDI3ODQsIDYzNCwgMTgyLCAxMjMsICAyMCwgICA0LCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHs2MjYzLCAxMTU0NCwgMjY0OSwgNzkwLCAyNTksIDE2OCwgIDI3LCAgIDUsICAgMCwgICAwLCAgIDAsIDIwNTM5LH0sCisgICAgICAgICAgICB7MzEwOSwgNDA3NSwgMjAzMSwgODk2LCA0NTcsIDM4NiwgMTU4LCAgMjksICAgMCwgICAwLCAgIDAsIDExMzgsfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDMgKSAqLworICAgICAgICAgICAgezExNTE1LCA0MDc5LCA0NjUsICA3MywgICA1LCAgMTQsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHs5MzYxLCA1ODM0LCA2NTAsICA5NiwgIDI0LCAgIDgsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAyMjE4MSx9LAorICAgICAgICAgICAgezQzNDMsIDM5NzQsIDEzNjAsIDQxNSwgMTMyLCAgOTYsICAxNCwgICAxLCAgIDAsICAgMCwgICAwLCAxMjY3LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA0ICkgKi8KKyAgICAgICAgICAgIHs0Nzg3LCA5Mjk3LCA4MjMsIDE2OCwgIDQ0LCAgMTIsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHszNjE5LCA0NDcyLCA3MTksIDE5OCwgIDYwLCAgMzEsICAgMywgICAwLCAgIDAsICAgMCwgICAwLCA4NDAxLH0sCisgICAgICAgICAgICB7MTE1NywgMTE3NSwgNDgzLCAxODIsICA4OCwgIDMxLCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgMjY4LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA1ICkgKi8KKyAgICAgICAgICAgIHs4Mjk5LCAxMjI2LCAgMzIsICAgNSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHszNTAyLCAxNTY4LCAgNTcsICAgNCwgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA5ODExLH0sCisgICAgICAgICAgICB7MTA1NSwgMTA3MCwgMTY2LCAgMjksICAgNiwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNTI3LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA2ICkgKi8KKyAgICAgICAgICAgIHsyNzQxNCwgMjc5MjcsIDE5ODksIDM0NywgIDY5LCAgMjYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKKyAgICAgICAgICAgIHs1ODc2LCAxMDA3NCwgMTU3NCwgMzQxLCAgOTEsICAyNCwgICA0LCAgIDAsICAgMCwgICAwLCAgIDAsIDIxOTU0LH0sCisgICAgICAgICAgICB7MTU3MSwgMjE3MSwgNzc4LCAzMjQsIDEyNCwgIDY1LCAgMTYsICAgMCwgICAwLCAgIDAsICAgMCwgOTc5LH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA3ICkgKi8KKyAgICAgICAgICAgIHsgICAwLCAgMjksICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAorICAgICAgICAgICAgeyAgIDAsICAyMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNDU5LH0sCisgICAgICAgICAgICB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgMTMsfSwKKyAgICAgICAgfSwKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9kZW5vaXNpbmcuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9kZW5vaXNpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRkN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2Rlbm9pc2luZy5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJkZW5vaXNpbmcuaCIKKworI2luY2x1ZGUgInZwOC9jb21tb24vcmVjb25pbnRlci5oIgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTk9JU0VfTU9USU9OX1RIUkVTSE9MRCA9IDI1ICogMjU7CisvKiBTU0VfRElGRl9USFJFU0hPTEQgaXMgc2VsZWN0ZWQgYXMgfjk1JSBjb25maWRlbmNlIGFzc3VtaW5nCisgKiB2YXIobm9pc2UpIH49IDEwMC4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBTU0VfRElGRl9USFJFU0hPTEQgPSAxNiAqIDE2ICogMjA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFNTRV9USFJFU0hPTEQgPSAxNiAqIDE2ICogNDA7CisKKy8qCisgKiBUaGUgZmlsdGVyIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eS4KKyAqIFN0ZXAgMToKKyAqIEluc3RlYWQgb2YgYXBwbHlpbmcgdGFwIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBwaXhlbCwgd2UgY2FsY3VsYXRlZCB0aGUKKyAqIHBpeGVsIGFkanVzdG1lbnRzIHZzLiBwaXhlbCBkaWZmIHZhbHVlIGFoZWFkIG9mIHRpbWUuCisgKiAgICAgYWRqdXN0bWVudCA9IGZpbHRlcmVkX3ZhbHVlIC0gY3VycmVudF9yYXcKKyAqICAgICAgICAgICAgICAgID0gKGZpbHRlcl9jb2VmZmljaWVudCAqIGRpZmYgKyAxMjgpID4+IDgKKyAqIHdoZXJlCisgKiAgICAgZmlsdGVyX2NvZWZmaWNpZW50ID0gKDI1NSA8PCA4KSAvICgyNTYgKyAoKGFic2RpZmYgKiAzMzApID4+IDMpKTsKKyAqICAgICBmaWx0ZXJfY29lZmZpY2llbnQgKz0gZmlsdGVyX2NvZWZmaWNpZW50IC8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKyBtb3Rpb25fbWFnbml0dWRlX2FkanVzdG1lbnQpOworICogICAgIGZpbHRlcl9jb2VmZmljaWVudCBpcyBjbGFtcGVkIHRvIDAgfiAyNTUuCisgKgorICogU3RlcCAyOgorICogVGhlIGFkanVzdG1lbnQgdnMuIGRpZmYgY3VydmUgYmVjb21lcyBmbGF0IHZlcnkgcXVpY2sgd2hlbiBkaWZmIGluY3JlYXNlcy4KKyAqIFRoaXMgYWxsb3dlZCB1cyB0byB1c2Ugb25seSBzZXZlcmFsIGxldmVscyB0byBhcHByb3hpbWF0ZSB0aGUgY3VydmUgd2l0aG91dAorICogY2hhbmdpbmcgdGhlIGZpbHRlcmluZyBhbGdvcml0aG0gdG9vIG11Y2guCisgKiBUaGUgYWRqdXN0bWVudHMgd2VyZSBmdXJ0aGVyIGNvcnJlY3RlZCBieSBjaGVja2luZyB0aGUgbW90aW9uIG1hZ25pdHVkZS4KKyAqIFRoZSBsZXZlbHMgdXNlZCBhcmU6CisgKiBkaWZmICAgICAgIGFkanVzdG1lbnQgdy9vIG1vdGlvbiBjb3JyZWN0aW9uICAgYWRqdXN0bWVudCB3LyBtb3Rpb24gY29ycmVjdGlvbgorICogWy0yNTUsIC0xNl0gICAgICAgICAgIC02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNworICogWy0xNSwgLThdICAgICAgICAgICAgIC00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNQorICogWy03LCAtNF0gICAgICAgICAgICAgIC0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNAorICogWy0zLCAzXSAgICAgICAgICAgICAgIGRpZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmCisgKiBbNCwgN10gICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisgKiBbOCwgMTVdICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisgKiBbMTYsIDI1NV0gICAgICAgICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKi8KKworaW50IHZwOF9kZW5vaXNlcl9maWx0ZXJfYyhZVjEyX0JVRkZFUl9DT05GSUcgKm1jX3J1bm5pbmdfYXZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnJ1bm5pbmdfYXZnLCBNQUNST0JMT0NLICpzaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb3Rpb25fbWFnbml0dWRlLCBpbnQgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dl9vZmZzZXQpCit7CisgICAgdW5zaWduZWQgY2hhciAqc2lnID0gc2lnbmFsLT50aGlzbWI7CisgICAgaW50IHNpZ19zdHJpZGUgPSAxNjsKKyAgICB1bnNpZ25lZCBjaGFyICptY19ydW5uaW5nX2F2Z195ID0gbWNfcnVubmluZ19hdmctPnlfYnVmZmVyICsgeV9vZmZzZXQ7CisgICAgaW50IG1jX2F2Z195X3N0cmlkZSA9IG1jX3J1bm5pbmdfYXZnLT55X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpydW5uaW5nX2F2Z195ID0gcnVubmluZ19hdmctPnlfYnVmZmVyICsgeV9vZmZzZXQ7CisgICAgaW50IGF2Z195X3N0cmlkZSA9IHJ1bm5pbmdfYXZnLT55X3N0cmlkZTsKKyAgICBpbnQgciwgYywgaTsKKyAgICBpbnQgc3VtX2RpZmYgPSAwOworICAgIGludCBhZGpfdmFsWzNdID0gezMsIDQsIDZ9OworCisgICAgLyogSWYgbW90aW9uX21hZ25pdHVkZSBpcyBzbWFsbCwgbWFraW5nIHRoZSBkZW5vaXNlciBtb3JlIGFnZ3Jlc3NpdmUgYnkKKyAgICAgKiBpbmNyZWFzaW5nIHRoZSBhZGp1c3RtZW50IGZvciBlYWNoIGxldmVsLiAqLworICAgIGlmIChtb3Rpb25fbWFnbml0dWRlIDw9IE1PVElPTl9NQUdOSVRVREVfVEhSRVNIT0xEKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGFkal92YWxbaV0gKz0gMTsKKyAgICB9CisKKyAgICBmb3IgKHIgPSAwOyByIDwgMTY7ICsrcikKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAxNjsgKytjKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZGlmZiA9IDA7CisgICAgICAgICAgICBpbnQgYWRqdXN0bWVudCA9IDA7CisgICAgICAgICAgICBpbnQgYWJzZGlmZiA9IDA7CisKKyAgICAgICAgICAgIGRpZmYgPSBtY19ydW5uaW5nX2F2Z195W2NdIC0gc2lnW2NdOworICAgICAgICAgICAgYWJzZGlmZiA9IGFicyhkaWZmKTsKKworICAgICAgICAgICAgLyogV2hlbiB8ZGlmZnwgPCA0LCB1c2UgcGl4ZWwgdmFsdWUgZnJvbSBsYXN0IGRlbm9pc2VkIHJhdy4gKi8KKyAgICAgICAgICAgIGlmIChhYnNkaWZmIDw9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVubmluZ19hdmdfeVtjXSA9IG1jX3J1bm5pbmdfYXZnX3lbY107CisgICAgICAgICAgICAgICAgc3VtX2RpZmYgKz0gZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWJzZGlmZiA+PSA0ICYmIGFic2RpZmYgPD0gNykKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0bWVudCA9IGFkal92YWxbMF07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWJzZGlmZiA+PSA4ICYmIGFic2RpZmYgPD0gMTUpCisgICAgICAgICAgICAgICAgICAgIGFkanVzdG1lbnQgPSBhZGpfdmFsWzFdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0bWVudCA9IGFkal92YWxbMl07CisKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ1tjXSArIGFkanVzdG1lbnQpID4gMjU1KQorICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19hdmdfeVtjXSA9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19hdmdfeVtjXSA9IHNpZ1tjXSArIGFkanVzdG1lbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgc3VtX2RpZmYgKz0gYWRqdXN0bWVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzaWdbY10gLSBhZGp1c3RtZW50KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nX2F2Z195W2NdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19hdmdfeVtjXSA9IHNpZ1tjXSAtIGFkanVzdG1lbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgc3VtX2RpZmYgLT0gYWRqdXN0bWVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgcG9pbnRlcnMgZm9yIG5leHQgaXRlcmF0aW9uLiAqLworICAgICAgICBzaWcgKz0gc2lnX3N0cmlkZTsKKyAgICAgICAgbWNfcnVubmluZ19hdmdfeSArPSBtY19hdmdfeV9zdHJpZGU7CisgICAgICAgIHJ1bm5pbmdfYXZnX3kgKz0gYXZnX3lfc3RyaWRlOworICAgIH0KKworICAgIGlmIChhYnMoc3VtX2RpZmYpID4gU1VNX0RJRkZfVEhSRVNIT0xEKQorICAgICAgICByZXR1cm4gQ09QWV9CTE9DSzsKKworICAgIHZwOF9jb3B5X21lbTE2eDE2KHJ1bm5pbmdfYXZnLT55X2J1ZmZlciArIHlfb2Zmc2V0LCBhdmdfeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLT50aGlzbWIsIHNpZ19zdHJpZGUpOworICAgIHJldHVybiBGSUxURVJfQkxPQ0s7Cit9CisKK2ludCB2cDhfZGVub2lzZXJfYWxsb2NhdGUoVlA4X0RFTk9JU0VSICpkZW5vaXNlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpOworICAgIGFzc2VydChkZW5vaXNlcik7CisKKyAgICAvKiBkb24ndCBuZWVkIG9uZSBmb3IgaW50cmEgc3RhcnQgYXQgMSAqLworICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfUkVGX0ZSQU1FUzsgaSsrKQorICAgIHsKKyAgICAgICAgZGVub2lzZXItPnl2MTJfcnVubmluZ19hdmdbaV0uZmxhZ3MgPSAwOworCisgICAgICAgIGlmICh2cDhfeXYxMl9hbGxvY19mcmFtZV9idWZmZXIoJihkZW5vaXNlci0+eXYxMl9ydW5uaW5nX2F2Z1tpXSksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpCisgICAgICAgICAgICA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9kZW5vaXNlcl9mcmVlKGRlbm9pc2VyKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHZweF9tZW1zZXQoZGVub2lzZXItPnl2MTJfcnVubmluZ19hdmdbaV0uYnVmZmVyX2FsbG9jLCAwLAorICAgICAgICAgICAgICAgICAgIGRlbm9pc2VyLT55djEyX3J1bm5pbmdfYXZnW2ldLmZyYW1lX3NpemUpOworCisgICAgfQorICAgIGRlbm9pc2VyLT55djEyX21jX3J1bm5pbmdfYXZnLmZsYWdzID0gMDsKKworICAgIGlmICh2cDhfeXYxMl9hbGxvY19mcmFtZV9idWZmZXIoJihkZW5vaXNlci0+eXYxMl9tY19ydW5uaW5nX2F2ZyksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIFZQOEJPUkRFUklOUElYRUxTKSA8IDApCisgICAgeworICAgICAgICB2cDhfZGVub2lzZXJfZnJlZShkZW5vaXNlcik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHZweF9tZW1zZXQoZGVub2lzZXItPnl2MTJfbWNfcnVubmluZ19hdmcuYnVmZmVyX2FsbG9jLCAwLAorICAgICAgICAgICAgICAgZGVub2lzZXItPnl2MTJfbWNfcnVubmluZ19hdmcuZnJhbWVfc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgdnA4X2Rlbm9pc2VyX2ZyZWUoVlA4X0RFTk9JU0VSICpkZW5vaXNlcikKK3sKKyAgICBpbnQgaTsKKyAgICBhc3NlcnQoZGVub2lzZXIpOworCisgICAgLyogd2UgZG9uJ3QgaGF2ZSBvbmUgZm9yIGludHJhIHJlZiBmcmFtZSAqLworICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfUkVGX0ZSQU1FUyA7IGkrKykKKyAgICB7CisgICAgICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmZGVub2lzZXItPnl2MTJfcnVubmluZ19hdmdbaV0pOworICAgIH0KKyAgICB2cDhfeXYxMl9kZV9hbGxvY19mcmFtZV9idWZmZXIoJmRlbm9pc2VyLT55djEyX21jX3J1bm5pbmdfYXZnKTsKK30KKworCit2b2lkIHZwOF9kZW5vaXNlcl9kZW5vaXNlX21iKFZQOF9ERU5PSVNFUiAqZGVub2lzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0sgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiZXN0X3NzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHplcm9fbXZfc3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb25feW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY29uX3V2b2Zmc2V0KQoreworICAgIGludCBtdl9yb3c7CisgICAgaW50IG12X2NvbDsKKyAgICB1bnNpZ25lZCBpbnQgbW90aW9uX21hZ25pdHVkZTI7CisKKyAgICBNVl9SRUZFUkVOQ0VfRlJBTUUgZnJhbWUgPSB4LT5iZXN0X3JlZmVyZW5jZV9mcmFtZTsKKyAgICBNVl9SRUZFUkVOQ0VfRlJBTUUgemVyb19mcmFtZSA9IHgtPmJlc3RfemVyb212X3JlZmVyZW5jZV9mcmFtZTsKKworICAgIGVudW0gdnA4X2Rlbm9pc2VyX2RlY2lzaW9uIGRlY2lzaW9uID0gRklMVEVSX0JMT0NLOworCisgICAgaWYgKHplcm9fZnJhbWUpCisgICAgeworICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnNyYyA9ICZkZW5vaXNlci0+eXYxMl9ydW5uaW5nX2F2Z1tmcmFtZV07CisgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0ID0gJmRlbm9pc2VyLT55djEyX21jX3J1bm5pbmdfYXZnOworICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgc2F2ZWRfcHJlLHNhdmVkX2RzdDsKKyAgICAgICAgTUJfTU9ERV9JTkZPIHNhdmVkX21ibWk7CisgICAgICAgIE1BQ1JPQkxPQ0tEICpmaWx0ZXJfeGQgPSAmeC0+ZV9tYmQ7CisgICAgICAgIE1CX01PREVfSU5GTyAqbWJtaSA9ICZmaWx0ZXJfeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pOworICAgICAgICBpbnQgbXZfY29sOworICAgICAgICBpbnQgbXZfcm93OworICAgICAgICBpbnQgc3NlX2RpZmYgPSB6ZXJvX212X3NzZSAtIGJlc3Rfc3NlOworCisgICAgICAgIHNhdmVkX21ibWkgPSAqbWJtaTsKKworICAgICAgICAvKiBVc2UgdGhlIGJlc3QgTVYgZm9yIHRoZSBjb21wZW5zYXRpb24uICovCisgICAgICAgIG1ibWktPnJlZl9mcmFtZSA9IHgtPmJlc3RfcmVmZXJlbmNlX2ZyYW1lOworICAgICAgICBtYm1pLT5tb2RlID0geC0+YmVzdF9zc2VfaW50ZXJfbW9kZTsKKyAgICAgICAgbWJtaS0+bXYgPSB4LT5iZXN0X3NzZV9tdjsKKyAgICAgICAgbWJtaS0+bmVlZF90b19jbGFtcF9tdnMgPSB4LT5uZWVkX3RvX2NsYW1wX2Jlc3RfbXZzOworICAgICAgICBtdl9jb2wgPSB4LT5iZXN0X3NzZV9tdi5hc19tdi5jb2w7CisgICAgICAgIG12X3JvdyA9IHgtPmJlc3Rfc3NlX212LmFzX212LnJvdzsKKworICAgICAgICBpZiAoZnJhbWUgPT0gSU5UUkFfRlJBTUUgfHwKKyAgICAgICAgICAgICgodW5zaWduZWQgaW50KShtdl9yb3cgKm12X3JvdyArIG12X2NvbCAqbXZfY29sKQorICAgICAgICAgICAgICA8PSBOT0lTRV9NT1RJT05fVEhSRVNIT0xEICYmCisgICAgICAgICAgICAgc3NlX2RpZmYgPCAoaW50KVNTRV9ESUZGX1RIUkVTSE9MRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBIYW5kbGUgaW50cmEgYmxvY2tzIGFzIHJlZmVycmluZyB0byBsYXN0IGZyYW1lIHdpdGggemVybyBtb3Rpb24KKyAgICAgICAgICAgICAqIGFuZCBsZXQgdGhlIGFic29sdXRlIHBpeGVsIGRpZmZlcmVuY2UgYWZmZWN0IHRoZSBmaWx0ZXIgZmFjdG9yLgorICAgICAgICAgICAgICogQWxzbyBjb25zaWRlciBzbWFsbCBhbW91bnQgb2YgbW90aW9uIGFzIGJlaW5nIHJhbmRvbSB3YWxrIGR1ZQorICAgICAgICAgICAgICogdG8gbm9pc2UsIGlmIGl0IGRvZXNuJ3QgbWVhbiB0aGF0IHdlIGdldCBhIG11Y2ggYmlnZ2VyIGVycm9yLgorICAgICAgICAgICAgICogTm90ZSB0aGF0IGFueSBjaGFuZ2VzIHRvIHRoZSBtb2RlIGluZm8gb25seSBhZmZlY3RzIHRoZQorICAgICAgICAgICAgICogZGVub2lzaW5nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtYm1pLT5yZWZfZnJhbWUgPQorICAgICAgICAgICAgICAgICAgICB4LT5iZXN0X3plcm9tdl9yZWZlcmVuY2VfZnJhbWU7CisKKyAgICAgICAgICAgIHNyYyA9ICZkZW5vaXNlci0+eXYxMl9ydW5uaW5nX2F2Z1t6ZXJvX2ZyYW1lXTsKKworICAgICAgICAgICAgbWJtaS0+bW9kZSA9IFpFUk9NVjsKKyAgICAgICAgICAgIG1ibWktPm12LmFzX2ludCA9IDA7CisgICAgICAgICAgICB4LT5iZXN0X3NzZV9pbnRlcl9tb2RlID0gWkVST01WOworICAgICAgICAgICAgeC0+YmVzdF9zc2VfbXYuYXNfaW50ID0gMDsKKyAgICAgICAgICAgIGJlc3Rfc3NlID0gemVyb19tdl9zc2U7CisgICAgICAgIH0KKworICAgICAgICBzYXZlZF9wcmUgPSBmaWx0ZXJfeGQtPnByZTsKKyAgICAgICAgc2F2ZWRfZHN0ID0gZmlsdGVyX3hkLT5kc3Q7CisKKyAgICAgICAgLyogQ29tcGVuc2F0ZSB0aGUgcnVubmluZyBhdmVyYWdlLiAqLworICAgICAgICBmaWx0ZXJfeGQtPnByZS55X2J1ZmZlciA9IHNyYy0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OworICAgICAgICBmaWx0ZXJfeGQtPnByZS51X2J1ZmZlciA9IHNyYy0+dV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgZmlsdGVyX3hkLT5wcmUudl9idWZmZXIgPSBzcmMtPnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7CisgICAgICAgIC8qIFdyaXRlIHRoZSBjb21wZW5zYXRlZCBydW5uaW5nIGF2ZXJhZ2UgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KKyAgICAgICAgZmlsdGVyX3hkLT5kc3QueV9idWZmZXIgPSBkc3QtPnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKKyAgICAgICAgZmlsdGVyX3hkLT5kc3QudV9idWZmZXIgPSBkc3QtPnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7CisgICAgICAgIGZpbHRlcl94ZC0+ZHN0LnZfYnVmZmVyID0gZHN0LT52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OworCisgICAgICAgIGlmICgheC0+c2tpcCkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWIoZmlsdGVyX3hkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcjE2eDE2X3ByZWRpY3RvcnNfbWIoZmlsdGVyX3hkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeGQtPmRzdC55X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3hkLT5kc3QudV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94ZC0+ZHN0LnZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeGQtPmRzdC55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3hkLT5kc3QudXZfc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICBmaWx0ZXJfeGQtPnByZSA9IHNhdmVkX3ByZTsKKyAgICAgICAgZmlsdGVyX3hkLT5kc3QgPSBzYXZlZF9kc3Q7CisgICAgICAgICptYm1pID0gc2F2ZWRfbWJtaTsKKworICAgIH0KKworICAgIG12X3JvdyA9IHgtPmJlc3Rfc3NlX212LmFzX212LnJvdzsKKyAgICBtdl9jb2wgPSB4LT5iZXN0X3NzZV9tdi5hc19tdi5jb2w7CisgICAgbW90aW9uX21hZ25pdHVkZTIgPSBtdl9yb3cgKiBtdl9yb3cgKyBtdl9jb2wgKiBtdl9jb2w7CisgICAgaWYgKGJlc3Rfc3NlID4gU1NFX1RIUkVTSE9MRCB8fCBtb3Rpb25fbWFnbml0dWRlMgorICAgICAgICAgICA+IDggKiBOT0lTRV9NT1RJT05fVEhSRVNIT0xEKQorICAgIHsKKyAgICAgICAgZGVjaXNpb24gPSBDT1BZX0JMT0NLOworICAgIH0KKworICAgIGlmIChkZWNpc2lvbiA9PSBGSUxURVJfQkxPQ0spCisgICAgeworICAgICAgICAvKiBGaWx0ZXIuICovCisgICAgICAgIGRlY2lzaW9uID0gdnA4X2Rlbm9pc2VyX2ZpbHRlcigmZGVub2lzZXItPnl2MTJfbWNfcnVubmluZ19hdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVub2lzZXItPnl2MTJfcnVubmluZ19hdmdbTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX21hZ25pdHVkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCk7CisgICAgfQorICAgIGlmIChkZWNpc2lvbiA9PSBDT1BZX0JMT0NLKQorICAgIHsKKyAgICAgICAgLyogTm8gZmlsdGVyaW5nIG9mIHRoaXMgYmxvY2s7IGl0IGRpZmZlcnMgdG9vIG11Y2ggZnJvbSB0aGUgcHJlZGljdG9yLAorICAgICAgICAgKiBvciB0aGUgbW90aW9uIHZlY3RvciBtYWduaXR1ZGUgaXMgY29uc2lkZXJlZCB0b28gYmlnLgorICAgICAgICAgKi8KKyAgICAgICAgdnA4X2NvcHlfbWVtMTZ4MTYoCisgICAgICAgICAgICAgICAgeC0+dGhpc21iLCAxNiwKKyAgICAgICAgICAgICAgICBkZW5vaXNlci0+eXYxMl9ydW5uaW5nX2F2Z1tMQVNUX0ZSQU1FXS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQsCisgICAgICAgICAgICAgICAgZGVub2lzZXItPnl2MTJfcnVubmluZ19hdmdbTEFTVF9GUkFNRV0ueV9zdHJpZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9kZW5vaXNpbmcuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9kZW5vaXNpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI1ZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2Rlbm9pc2luZy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBWUDhfRU5DT0RFUl9ERU5PSVNJTkdfSF8KKyNkZWZpbmUgVlA4X0VOQ09ERVJfREVOT0lTSU5HX0hfCisKKyNpbmNsdWRlICJibG9jay5oIgorCisjZGVmaW5lIFNVTV9ESUZGX1RIUkVTSE9MRCAoMTYgKiAxNiAqIDIpCisjZGVmaW5lIE1PVElPTl9NQUdOSVRVREVfVEhSRVNIT0xEICg4KjMpCisKK2VudW0gdnA4X2Rlbm9pc2VyX2RlY2lzaW9uCit7CisgIENPUFlfQkxPQ0ssCisgIEZJTFRFUl9CTE9DSworfTsKKwordHlwZWRlZiBzdHJ1Y3QgdnA4X2Rlbm9pc2VyCit7CisgICAgWVYxMl9CVUZGRVJfQ09ORklHIHl2MTJfcnVubmluZ19hdmdbTUFYX1JFRl9GUkFNRVNdOworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyB5djEyX21jX3J1bm5pbmdfYXZnOworfSBWUDhfREVOT0lTRVI7CisKK2ludCB2cDhfZGVub2lzZXJfYWxsb2NhdGUoVlA4X0RFTk9JU0VSICpkZW5vaXNlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKwordm9pZCB2cDhfZGVub2lzZXJfZnJlZShWUDhfREVOT0lTRVIgKmRlbm9pc2VyKTsKKwordm9pZCB2cDhfZGVub2lzZXJfZGVub2lzZV9tYihWUDhfREVOT0lTRVIgKmRlbm9pc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNST0JMT0NLICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmVzdF9zc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB6ZXJvX212X3NzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY29uX3lvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNvbl91dm9mZnNldCk7CisKKyNlbmRpZiAgLyogVlA4X0VOQ09ERVJfREVOT0lTSU5HX0hfICovCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlZnJhbWUuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVmcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjhkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlZnJhbWUuYwpAQCAtMCwwICsxLDEzOTMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgImVuY29kZW1iLmgiCisjaW5jbHVkZSAiZW5jb2RlbXYuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2NvbW1vbi5oIgorI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9leHRlbmQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9xdWFudF9jb21tb24uaCIKKyNpbmNsdWRlICJzZWdtZW50YXRpb24uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oIgorI2luY2x1ZGUgImVuY29kZWludHJhLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludGVyLmgiCisjaW5jbHVkZSAicmRvcHQuaCIKKyNpbmNsdWRlICJwaWNraW50ZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgInZwOC9jb21tb24vaW52dHJhbnMuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvdnB4X3RpbWVyLmgiCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworI2luY2x1ZGUgImJpdHN0cmVhbS5oIgorI2VuZGlmCisjaW5jbHVkZSAiZW5jb2RlZnJhbWUuaCIKKworZXh0ZXJuIHZvaWQgdnA4X3N0dWZmX21iKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIFRPS0VORVhUUkEgKip0KSA7CitleHRlcm4gdm9pZCB2cDhfY2FsY19yZWZfZnJhbWVfY29zdHMoaW50ICpyZWZfZnJhbWVfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvYl9pbnRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvYl9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9iX2dhcmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitleHRlcm4gdm9pZCB2cDhfY29udmVydF9yZmN0X3RvX3Byb2IoVlA4X0NPTVAgKmNvbnN0IGNwaSk7CitleHRlcm4gdm9pZCB2cDhjeF9pbml0aWFsaXplX21lX2NvbnN0cyhWUDhfQ09NUCAqY3BpLCBpbnQgUUluZGV4KTsKK2V4dGVybiB2b2lkIHZwOF9hdXRvX3NlbGVjdF9zcGVlZChWUDhfQ09NUCAqY3BpKTsKK2V4dGVybiB2b2lkIHZwOGN4X2luaXRfbWJydGhyZWFkX2RhdGEoVlA4X0NPTVAgKmNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDUk9CTE9DSyAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfUk9XX0NPTVAgKm1icl9laSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGFkanVzdF9hY3RfemJpbiggVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCApOworCisjaWZkZWYgTU9ERV9TVEFUUwordW5zaWduZWQgaW50IGludGVyX3lfbW9kZXNbMTBdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwordW5zaWduZWQgaW50IGludGVyX3V2X21vZGVzWzRdID0gezAsIDAsIDAsIDB9OwordW5zaWduZWQgaW50IGludGVyX2JfbW9kZXNbMTVdICA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKK3Vuc2lnbmVkIGludCB5X21vZGVzWzVdICAgPSB7MCwgMCwgMCwgMCwgMH07Cit1bnNpZ25lZCBpbnQgdXZfbW9kZXNbNF0gID0gezAsIDAsIDAsIDB9OwordW5zaWduZWQgaW50IGJfbW9kZXNbMTRdICA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKyNlbmRpZgorCisKKy8qIGFjdGl2aXR5X2F2ZyBtdXN0IGJlIHBvc2l0aXZlLCBvciBmbGF0IHJlZ2lvbnMgY291bGQgZ2V0IGEgemVybyB3ZWlnaHQKKyAqICAoaW5maW5pdGUgbGFtYmRhKSwgd2hpY2ggY29uZm91bmRzIGFuYWx5c2lzLgorICogVGhpcyBhbHNvIGF2b2lkcyB0aGUgbmVlZCBmb3IgZGl2aWRlIGJ5IHplcm8gY2hlY2tzIGluCisgKiAgdnA4X2FjdGl2aXR5X21hc2tpbmcoKS4KKyAqLworI2RlZmluZSBWUDhfQUNUSVZJVFlfQVZHX01JTiAoNjQpCisKKy8qIFRoaXMgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZSB3aGVuIGNvbXB1dGluZyB0aGUgc291cmNlIHZhcmlhbmNlIGZvciB0aGUKKyAqICBwdXJwb3NlcyBvZiBhY3Rpdml0eSBtYXNraW5nLgorICogRXZlbnR1YWxseSB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCBieSBjdXN0b20gbm8tcmVmZXJlbmNlIHJvdXRpbmVzLAorICogIHdoaWNoIHdpbGwgYmUgZmFzdGVyLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBWUDhfVkFSX09GRlNbMTZdPQoreworICAgIDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOAorfTsKKworCisvKiBPcmlnaW5hbCBhY3Rpdml0eSBtZWFzdXJlIGZyb20gVGltIFQncyBjb2RlLiAqLworc3RhdGljIHVuc2lnbmVkIGludCB0dF9hY3Rpdml0eV9tZWFzdXJlKCBWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4ICkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYWN0OworICAgIHVuc2lnbmVkIGludCBzc2U7CisgICAgLyogVE9ETzogVGhpcyBjb3VsZCBhbHNvIGJlIGRvbmUgb3ZlciBzbWFsbGVyIGFyZWFzICg4eDgpLCBidXQgdGhhdCB3b3VsZAorICAgICAqICByZXF1aXJlIGV4dGVuc2l2ZSBjaGFuZ2VzIGVsc2V3aGVyZSwgYXMgbGFtYmRhIGlzIGFzc3VtZWQgdG8gYmUgZml4ZWQKKyAgICAgKiAgb3ZlciBhbiBlbnRpcmUgTUIgaW4gbW9zdCBvZiB0aGUgY29kZS4KKyAgICAgKiBBbm90aGVyIG9wdGlvbiBpcyB0byBjb21wdXRlIGZvdXIgOHg4IHZhcmlhbmNlcywgYW5kIHBpY2sgYSBzaW5nbGUKKyAgICAgKiAgbGFtYmRhIHVzaW5nIGEgbm9uLWxpbmVhciBjb21iaW5hdGlvbiAoZS5nLiwgdGhlIHNtYWxsZXN0LCBvciBzZWNvbmQKKyAgICAgKiAgc21hbGxlc3QsIGV0Yy4pLgorICAgICAqLworICAgIGFjdCA9ICB2cDhfdmFyaWFuY2UxNngxNih4LT5zcmMueV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHgtPnNyYy55X3N0cmlkZSwgVlA4X1ZBUl9PRkZTLCAwLCAmc3NlKTsKKyAgICBhY3QgPSBhY3Q8PDQ7CisKKyAgICAvKiBJZiB0aGUgcmVnaW9uIGlzIGZsYXQsIGxvd2VyIHRoZSBhY3Rpdml0eSBzb21lIG1vcmUuICovCisgICAgaWYgKGFjdCA8IDg8PDEyKQorICAgICAgICBhY3QgPSBhY3QgPCA1PDwxMiA/IGFjdCA6IDU8PDEyOworCisgICAgcmV0dXJuIGFjdDsKK30KKworLyogU3R1YiBmb3IgYWx0ZXJuYXRpdmUgZXhwZXJpbWVudGFsIGFjdGl2aXR5IG1lYXN1cmVzLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbHRfYWN0aXZpdHlfbWVhc3VyZSggVlA4X0NPTVAgKmNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0sgKngsIGludCB1c2VfZGNfcHJlZCApCit7CisgICAgcmV0dXJuIHZwOF9lbmNvZGVfaW50cmEoY3BpLHgsIHVzZV9kY19wcmVkKTsKK30KKworCisvKiBNZWFzdXJlIHRoZSBhY3Rpdml0eSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBXaGF0IHdlIG1lYXN1cmUgaGVyZSBpcyBUQkQgc28gYWJzdHJhY3RlZCB0byB0aGlzIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgQUxUX0FDVF9NRUFTVVJFIDEKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWJfYWN0aXZpdHlfbWVhc3VyZSggVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LCBpbnQgbWJfY29sKQoreworICAgIHVuc2lnbmVkIGludCBtYl9hY3Rpdml0eTsKKworICAgIGlmICAoIEFMVF9BQ1RfTUVBU1VSRSApCisgICAgeworICAgICAgICBpbnQgdXNlX2RjX3ByZWQgPSAobWJfY29sIHx8IG1iX3JvdykgJiYgKCFtYl9jb2wgfHwgIW1iX3Jvdyk7CisKKyAgICAgICAgLyogT3IgdXNlIGFuZCBhbHRlcm5hdGl2ZS4gKi8KKyAgICAgICAgbWJfYWN0aXZpdHkgPSBhbHRfYWN0aXZpdHlfbWVhc3VyZSggY3BpLCB4LCB1c2VfZGNfcHJlZCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBPcmlnaW5hbCBhY3Rpdml0eSBtZWFzdXJlIGZyb20gVGltIFQncyBjb2RlLiAqLworICAgICAgICBtYl9hY3Rpdml0eSA9IHR0X2FjdGl2aXR5X21lYXN1cmUoIGNwaSwgeCApOworICAgIH0KKworICAgIGlmICggbWJfYWN0aXZpdHkgPCBWUDhfQUNUSVZJVFlfQVZHX01JTiApCisgICAgICAgIG1iX2FjdGl2aXR5ID0gVlA4X0FDVElWSVRZX0FWR19NSU47CisKKyAgICByZXR1cm4gbWJfYWN0aXZpdHk7Cit9CisKKy8qIENhbGN1bGF0ZSBhbiAiYXZlcmFnZSIgbWIgYWN0aXZpdHkgdmFsdWUgZm9yIHRoZSBmcmFtZSAqLworI2RlZmluZSBBQ1RfTUVESUFOIDAKK3N0YXRpYyB2b2lkIGNhbGNfYXZfYWN0aXZpdHkoIFZQOF9DT01QICpjcGksIGludDY0X3QgYWN0aXZpdHlfc3VtICkKK3sKKyNpZiBBQ1RfTUVESUFOCisgICAgLyogRmluZCBtZWRpYW46IFNpbXBsZSBuXjIgYWxnb3JpdGhtIGZvciBleHBlcmltZW50YXRpb24gKi8KKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBtZWRpYW47CisgICAgICAgIHVuc2lnbmVkIGludCBpLGo7CisgICAgICAgIHVuc2lnbmVkIGludCAqIHNvcnRsaXN0OworICAgICAgICB1bnNpZ25lZCBpbnQgdG1wOworCisgICAgICAgIC8qIENyZWF0ZSBhIGxpc3QgdG8gc29ydCB0byAqLworICAgICAgICBDSEVDS19NRU1fRVJST1Ioc29ydGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY2FsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jb21tb24uTUJzKSk7CisKKyAgICAgICAgLyogQ29weSBtYXAgdG8gc29ydCBsaXN0ICovCisgICAgICAgIHZweF9tZW1jcHkoIHNvcnRsaXN0LCBjcGktPm1iX2FjdGl2aXR5X21hcCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBjcGktPmNvbW1vbi5NQnMgKTsKKworCisgICAgICAgIC8qIFJpcHBsZSBlYWNoIHZhbHVlIGRvd24gdG8gaXRzIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgICAgZm9yICggaSA9IDE7IGkgPCBjcGktPmNvbW1vbi5NQnM7IGkgKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBqID0gaTsgaiA+IDA7IGogLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc29ydGxpc3Rbal0gPCBzb3J0bGlzdFtqLTFdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFN3YXAgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHNvcnRsaXN0W2otMV07CisgICAgICAgICAgICAgICAgICAgIHNvcnRsaXN0W2otMV0gPSBzb3J0bGlzdFtqXTsKKyAgICAgICAgICAgICAgICAgICAgc29ydGxpc3Rbal0gPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFdmVuIG51bWJlciBNQnMgc28gZXN0aW1hdGUgbWVkaWFuIGFzIG1lYW4gb2YgdHdvIGVpdGhlciBzaWRlLiAqLworICAgICAgICBtZWRpYW4gPSAoIDEgKyBzb3J0bGlzdFtjcGktPmNvbW1vbi5NQnMgPj4gMV0gKworICAgICAgICAgICAgICAgICAgIHNvcnRsaXN0WyhjcGktPmNvbW1vbi5NQnMgPj4gMSkgKyAxXSApID4+IDE7CisKKyAgICAgICAgY3BpLT5hY3Rpdml0eV9hdmcgPSBtZWRpYW47CisKKyAgICAgICAgdnB4X2ZyZWUoc29ydGxpc3QpOworICAgIH0KKyNlbHNlCisgICAgLyogU2ltcGxlIG1lYW4gZm9yIG5vdyAqLworICAgIGNwaS0+YWN0aXZpdHlfYXZnID0gKHVuc2lnbmVkIGludCkoYWN0aXZpdHlfc3VtL2NwaS0+Y29tbW9uLk1Ccyk7CisjZW5kaWYKKworICAgIGlmIChjcGktPmFjdGl2aXR5X2F2ZyA8IFZQOF9BQ1RJVklUWV9BVkdfTUlOKQorICAgICAgICBjcGktPmFjdGl2aXR5X2F2ZyA9IFZQOF9BQ1RJVklUWV9BVkdfTUlOOworCisgICAgLyogRXhwZXJpbWVudGFsIGNvZGU6IHJldHVybiBmaXhlZCB2YWx1ZSBub3JtYWxpemVkIGZvciBzZXZlcmFsIGNsaXBzICovCisgICAgaWYgICggQUxUX0FDVF9NRUFTVVJFICkKKyAgICAgICAgY3BpLT5hY3Rpdml0eV9hdmcgPSAxMDAwMDA7Cit9CisKKyNkZWZpbmUgVVNFX0FDVF9JTkRFWCAgIDAKKyNkZWZpbmUgT1VUUFVUX05PUk1fQUNUX1NUQVRTICAgMAorCisjaWYgVVNFX0FDVF9JTkRFWAorLyogQ2FsY3VsYXRlIGFuZCBhY3Rpdml0eSBpbmRleCBmb3IgZWFjaCBtYiAqLworc3RhdGljIHZvaWQgY2FsY19hY3Rpdml0eV9pbmRleCggVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCApCit7CisgICAgVlA4X0NPTU1PTiAqY29uc3QgY20gPSAmIGNwaS0+Y29tbW9uOworICAgIGludCBtYl9yb3csIG1iX2NvbDsKKworICAgIGludDY0X3QgYWN0OworICAgIGludDY0X3QgYTsKKyAgICBpbnQ2NF90IGI7CisKKyNpZiBPVVRQVVRfTk9STV9BQ1RfU1RBVFMKKyAgICBGSUxFICpmID0gZm9wZW4oIm5vcm1fYWN0LnN0dCIsICJhIik7CisgICAgZnByaW50ZihmLCAiXG4lMTJkXG4iLCBjcGktPmFjdGl2aXR5X2F2ZyApOworI2VuZGlmCisKKyAgICAvKiBSZXNldCBwb2ludGVycyB0byBzdGFydCBvZiBhY3Rpdml0eSBtYXAgKi8KKyAgICB4LT5tYl9hY3Rpdml0eV9wdHIgPSBjcGktPm1iX2FjdGl2aXR5X21hcDsKKworICAgIC8qIENhbGN1bGF0ZSBub3JtYWxpemVkIG1iIGFjdGl2aXR5IG51bWJlci4gKi8KKyAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3crKykKKyAgICB7CisgICAgICAgIC8qIGZvciBlYWNoIG1hY3JvYmxvY2sgY29sIGluIGltYWdlICovCisgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWFkIGFjdGl2aXR5IGZyb20gdGhlIG1hcCAqLworICAgICAgICAgICAgYWN0ID0gKih4LT5tYl9hY3Rpdml0eV9wdHIpOworCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYSBub3JtYWxpemVkIGFjdGl2aXR5IG51bWJlciAqLworICAgICAgICAgICAgYSA9IGFjdCArIDQqY3BpLT5hY3Rpdml0eV9hdmc7CisgICAgICAgICAgICBiID0gNCphY3QgKyBjcGktPmFjdGl2aXR5X2F2ZzsKKworICAgICAgICAgICAgaWYgKCBiID49IGEgKQorICAgICAgICAgICAgICAgICooeC0+YWN0aXZpdHlfcHRyKSA9IChpbnQpKChiICsgKGE+PjEpKS9hKSAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKih4LT5hY3Rpdml0eV9wdHIpID0gMSAtIChpbnQpKChhICsgKGI+PjEpKS9iKTsKKworI2lmIE9VVFBVVF9OT1JNX0FDVF9TVEFUUworICAgICAgICAgICAgZnByaW50ZihmLCAiICU2ZCIsICooeC0+bWJfYWN0aXZpdHlfcHRyKSk7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIEluY3JlbWVudCBhY3Rpdml0eSBtYXAgcG9pbnRlcnMgKi8KKyAgICAgICAgICAgIHgtPm1iX2FjdGl2aXR5X3B0cisrOworICAgICAgICB9CisKKyNpZiBPVVRQVVRfTk9STV9BQ1RfU1RBVFMKKyAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKKyNlbmRpZgorCisgICAgfQorCisjaWYgT1VUUFVUX05PUk1fQUNUX1NUQVRTCisgICAgZmNsb3NlKGYpOworI2VuZGlmCisKK30KKyNlbmRpZgorCisvKiBMb29wIHRocm91Z2ggYWxsIE1Ccy4gTm90ZSBhY3Rpdml0eSBvZiBlYWNoLCBhdmVyYWdlIGFjdGl2aXR5IGFuZAorICogY2FsY3VsYXRlIGEgbm9ybWFsaXplZCBhY3Rpdml0eSBmb3IgZWFjaAorICovCitzdGF0aWMgdm9pZCBidWlsZF9hY3Rpdml0eV9tYXAoIFZQOF9DT01QICpjcGkgKQoreworICAgIE1BQ1JPQkxPQ0sgKmNvbnN0IHggPSAmIGNwaS0+bWI7CisgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOworICAgIFZQOF9DT01NT04gKmNvbnN0IGNtID0gJiBjcGktPmNvbW1vbjsKKworI2lmIEFMVF9BQ1RfTUVBU1VSRQorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqbmV3X3l2MTIgPSAmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdOworICAgIGludCByZWNvbl95b2Zmc2V0OworICAgIGludCByZWNvbl95X3N0cmlkZSA9IG5ld195djEyLT55X3N0cmlkZTsKKyNlbmRpZgorCisgICAgaW50IG1iX3JvdywgbWJfY29sOworICAgIHVuc2lnbmVkIGludCBtYl9hY3Rpdml0eTsKKyAgICBpbnQ2NF90IGFjdGl2aXR5X3N1bSA9IDA7CisKKyAgICAvKiBmb3IgZWFjaCBtYWNyb2Jsb2NrIHJvdyBpbiBpbWFnZSAqLworICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdysrKQorICAgIHsKKyNpZiBBTFRfQUNUX01FQVNVUkUKKyAgICAgICAgLyogcmVzZXQgYWJvdmUgYmxvY2sgY29lZmZzICovCisgICAgICAgIHhkLT51cF9hdmFpbGFibGUgPSAobWJfcm93ICE9IDApOworICAgICAgICByZWNvbl95b2Zmc2V0ID0gKG1iX3JvdyAqIHJlY29uX3lfc3RyaWRlICogMTYpOworI2VuZGlmCisgICAgICAgIC8qIGZvciBlYWNoIG1hY3JvYmxvY2sgY29sIGluIGltYWdlICovCisgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQorICAgICAgICB7CisjaWYgQUxUX0FDVF9NRUFTVVJFCisgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyID0gbmV3X3l2MTItPnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKKyAgICAgICAgICAgIHhkLT5sZWZ0X2F2YWlsYWJsZSA9IChtYl9jb2wgIT0gMCk7CisgICAgICAgICAgICByZWNvbl95b2Zmc2V0ICs9IDE2OworI2VuZGlmCisgICAgICAgICAgICAvKiBDb3B5IGN1cnJlbnQgbWIgdG8gYSBidWZmZXIgKi8KKyAgICAgICAgICAgIHZwOF9jb3B5X21lbTE2eDE2KHgtPnNyYy55X2J1ZmZlciwgeC0+c3JjLnlfc3RyaWRlLCB4LT50aGlzbWIsIDE2KTsKKworICAgICAgICAgICAgLyogbWVhc3VyZSBhY3Rpdml0eSAqLworICAgICAgICAgICAgbWJfYWN0aXZpdHkgPSBtYl9hY3Rpdml0eV9tZWFzdXJlKCBjcGksIHgsIG1iX3JvdywgbWJfY29sICk7CisKKyAgICAgICAgICAgIC8qIEtlZXAgZnJhbWUgc3VtICovCisgICAgICAgICAgICBhY3Rpdml0eV9zdW0gKz0gbWJfYWN0aXZpdHk7CisKKyAgICAgICAgICAgIC8qIFN0b3JlIE1CIGxldmVsIGFjdGl2aXR5IGRldGFpbHMuICovCisgICAgICAgICAgICAqeC0+bWJfYWN0aXZpdHlfcHRyID0gbWJfYWN0aXZpdHk7CisKKyAgICAgICAgICAgIC8qIEluY3JlbWVudCBhY3Rpdml0eSBtYXAgcG9pbnRlciAqLworICAgICAgICAgICAgeC0+bWJfYWN0aXZpdHlfcHRyKys7CisKKyAgICAgICAgICAgIC8qIGFkanVzdCB0byB0aGUgbmV4dCBjb2x1bW4gb2Ygc291cmNlIG1hY3JvYmxvY2tzICovCisgICAgICAgICAgICB4LT5zcmMueV9idWZmZXIgKz0gMTY7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIGFkanVzdCB0byB0aGUgbmV4dCByb3cgb2YgbWJzICovCisgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAtIDE2ICogY20tPm1iX2NvbHM7CisKKyNpZiBBTFRfQUNUX01FQVNVUkUKKyAgICAgICAgLyogZXh0ZW5kIHRoZSByZWNvbiBmb3IgaW50cmEgcHJlZGljdGlvbiAqLworICAgICAgICB2cDhfZXh0ZW5kX21iX3JvdyhuZXdfeXYxMiwgeGQtPmRzdC55X2J1ZmZlciArIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyICsgOCwgeGQtPmRzdC52X2J1ZmZlciArIDgpOworI2VuZGlmCisKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgYW4gImF2ZXJhZ2UiIE1CIGFjdGl2aXR5ICovCisgICAgY2FsY19hdl9hY3Rpdml0eShjcGksIGFjdGl2aXR5X3N1bSk7CisKKyNpZiBVU0VfQUNUX0lOREVYCisgICAgLyogQ2FsY3VsYXRlIGFuIGFjdGl2aXR5IGluZGV4IG51bWJlciBvZiBlYWNoIG1iICovCisgICAgY2FsY19hY3Rpdml0eV9pbmRleCggY3BpLCB4ICk7CisjZW5kaWYKKworfQorCisvKiBNYWNyb2Jsb2NrIGFjdGl2aXR5IG1hc2tpbmcgKi8KK3ZvaWQgdnA4X2FjdGl2aXR5X21hc2tpbmcoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCkKK3sKKyNpZiBVU0VfQUNUX0lOREVYCisgICAgeC0+cmRtdWx0ICs9ICooeC0+bWJfYWN0aXZpdHlfcHRyKSAqICh4LT5yZG11bHQgPj4gMik7CisgICAgeC0+ZXJyb3JwZXJiaXQgPSB4LT5yZG11bHQgKiAxMDAgLygxMTAgKiB4LT5yZGRpdik7CisgICAgeC0+ZXJyb3JwZXJiaXQgKz0gKHgtPmVycm9ycGVyYml0PT0wKTsKKyNlbHNlCisgICAgaW50NjRfdCBhOworICAgIGludDY0X3QgYjsKKyAgICBpbnQ2NF90IGFjdCA9ICooeC0+bWJfYWN0aXZpdHlfcHRyKTsKKworICAgIC8qIEFwcGx5IHRoZSBtYXNraW5nIHRvIHRoZSBSRCBtdWx0aXBsaWVyLiAqLworICAgIGEgPSBhY3QgKyAoMipjcGktPmFjdGl2aXR5X2F2Zyk7CisgICAgYiA9ICgyKmFjdCkgKyBjcGktPmFjdGl2aXR5X2F2ZzsKKworICAgIHgtPnJkbXVsdCA9ICh1bnNpZ25lZCBpbnQpKCgoaW50NjRfdCl4LT5yZG11bHQqYiArIChhPj4xKSkvYSk7CisgICAgeC0+ZXJyb3JwZXJiaXQgPSB4LT5yZG11bHQgKiAxMDAgLygxMTAgKiB4LT5yZGRpdik7CisgICAgeC0+ZXJyb3JwZXJiaXQgKz0gKHgtPmVycm9ycGVyYml0PT0wKTsKKyNlbmRpZgorCisgICAgLyogQWN0aXZpdHkgYmFzZWQgWmJpbiBhZGp1c3RtZW50ICovCisgICAgYWRqdXN0X2FjdF96YmluKGNwaSwgeCk7Cit9CisKK3N0YXRpYwordm9pZCBlbmNvZGVfbWJfcm93KFZQOF9DT01QICpjcGksCisgICAgICAgICAgICAgICAgICAgVlA4X0NPTU1PTiAqY20sCisgICAgICAgICAgICAgICAgICAgaW50IG1iX3JvdywKKyAgICAgICAgICAgICAgICAgICBNQUNST0JMT0NLICAqeCwKKyAgICAgICAgICAgICAgICAgICBNQUNST0JMT0NLRCAqeGQsCisgICAgICAgICAgICAgICAgICAgVE9LRU5FWFRSQSAqKnRwLAorICAgICAgICAgICAgICAgICAgIGludCAqc2VnbWVudF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgaW50ICp0b3RhbHJhdGUpCit7CisgICAgaW50IHJlY29uX3lvZmZzZXQsIHJlY29uX3V2b2Zmc2V0OworICAgIGludCBtYl9jb2w7CisgICAgaW50IHJlZl9mYl9pZHggPSBjbS0+bHN0X2ZiX2lkeDsKKyAgICBpbnQgZHN0X2ZiX2lkeCA9IGNtLT5uZXdfZmJfaWR4OworICAgIGludCByZWNvbl95X3N0cmlkZSA9IGNtLT55djEyX2ZiW3JlZl9mYl9pZHhdLnlfc3RyaWRlOworICAgIGludCByZWNvbl91dl9zdHJpZGUgPSBjbS0+eXYxMl9mYltyZWZfZmJfaWR4XS51dl9zdHJpZGU7CisgICAgaW50IG1hcF9pbmRleCA9IChtYl9yb3cgKiBjcGktPmNvbW1vbi5tYl9jb2xzKTsKKworI2lmIChDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HKQorICAgIGNvbnN0IGludCBudW1fcGFydCA9ICgxIDw8IGNtLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24pOworICAgIFRPS0VORVhUUkEgKiB0cF9zdGFydCA9IGNwaS0+dG9rOworICAgIHZwOF93cml0ZXIgKnc7CisjZW5kaWYKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgIGNvbnN0IGludCBuc3luYyA9IGNwaS0+bXRfc3luY19yYW5nZTsKKyAgICBjb25zdCBpbnQgcmlnaHRtb3N0X2NvbCA9IGNtLT5tYl9jb2xzICsgbnN5bmM7CisgICAgdm9sYXRpbGUgY29uc3QgaW50ICpsYXN0X3Jvd19jdXJyZW50X21iX2NvbDsKKyAgICB2b2xhdGlsZSBpbnQgKmN1cnJlbnRfbWJfY29sID0gJmNwaS0+bXRfY3VycmVudF9tYl9jb2xbbWJfcm93XTsKKworICAgIGlmICgoY3BpLT5iX211bHRpX3RocmVhZGVkICE9IDApICYmIChtYl9yb3cgIT0gMCkpCisgICAgICAgIGxhc3Rfcm93X2N1cnJlbnRfbWJfY29sID0gJmNwaS0+bXRfY3VycmVudF9tYl9jb2xbbWJfcm93IC0gMV07CisgICAgZWxzZQorICAgICAgICBsYXN0X3Jvd19jdXJyZW50X21iX2NvbCA9ICZyaWdodG1vc3RfY29sOworI2VuZGlmCisKKyNpZiAoQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORykKKyAgICBpZihudW1fcGFydCA+IDEpCisgICAgICAgIHc9ICZjcGktPmJjWzEgKyAobWJfcm93ICUgbnVtX3BhcnQpXTsKKyAgICBlbHNlCisgICAgICAgIHcgPSAmY3BpLT5iY1sxXTsKKyNlbmRpZgorCisgICAgLyogcmVzZXQgYWJvdmUgYmxvY2sgY29lZmZzICovCisgICAgeGQtPmFib3ZlX2NvbnRleHQgPSBjbS0+YWJvdmVfY29udGV4dDsKKworICAgIHhkLT51cF9hdmFpbGFibGUgPSAobWJfcm93ICE9IDApOworICAgIHJlY29uX3lvZmZzZXQgPSAobWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNik7CisgICAgcmVjb25fdXZvZmZzZXQgPSAobWJfcm93ICogcmVjb25fdXZfc3RyaWRlICogOCk7CisKKyAgICBjcGktPnRwbGlzdFttYl9yb3ddLnN0YXJ0ID0gKnRwOworICAgIC8qIHByaW50ZigiTWFpbiBtYl9yb3cgPSAlZFxuIiwgbWJfcm93KTsgKi8KKworICAgIC8qIERpc3RhbmNlIG9mIE1iIHRvIHRoZSB0b3AgJiBib3R0b20gZWRnZXMsIHNwZWNpZmllZCBpbiAxLzh0aCBwZWwKKyAgICAgKiB1bml0cyBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbAorICAgICAqLworICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSA8PCAzKTsKKyAgICB4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgPSAoKGNtLT5tYl9yb3dzIC0gMSAtIG1iX3JvdykgKiAxNikgPDwgMzsKKworICAgIC8qIFNldCB1cCBsaW1pdCB2YWx1ZXMgZm9yIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50cworICAgICAqIHRvIHByZXZlbnQgdGhlbSBleHRlbmRpbmcgYmV5b25kIHRoZSBVTVYgYm9yZGVycworICAgICAqLworICAgIHgtPm12X3Jvd19taW4gPSAtKChtYl9yb3cgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNikpOworICAgIHgtPm12X3Jvd19tYXggPSAoKGNtLT5tYl9yb3dzIC0gMSAtIG1iX3JvdykgKiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpOworCisgICAgLyogU2V0IHRoZSBtYiBhY3Rpdml0eSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgcm93LiAqLworICAgIHgtPm1iX2FjdGl2aXR5X3B0ciA9ICZjcGktPm1iX2FjdGl2aXR5X21hcFttYXBfaW5kZXhdOworCisgICAgLyogZm9yIGVhY2ggbWFjcm9ibG9jayBjb2wgaW4gaW1hZ2UgKi8KKyAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNtLT5tYl9jb2xzOyBtYl9jb2wrKykKKyAgICB7CisKKyNpZiAgKENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcpCisgICAgICAgICp0cCA9IGNwaS0+dG9rOworI2VuZGlmCisgICAgICAgIC8qIERpc3RhbmNlIG9mIE1iIHRvIHRoZSBsZWZ0ICYgcmlnaHQgZWRnZXMsIHNwZWNpZmllZCBpbgorICAgICAgICAgKiAxLzh0aCBwZWwgdW5pdHMgYXMgdGhleSBhcmUgYWx3YXlzIGNvbXBhcmVkIHRvIHZhbHVlcworICAgICAgICAgKiB0aGF0IGFyZSBpbiAxLzh0aCBwZWwgdW5pdHMKKyAgICAgICAgICovCisgICAgICAgIHhkLT5tYl90b19sZWZ0X2VkZ2UgPSAtKChtYl9jb2wgKiAxNikgPDwgMyk7CisgICAgICAgIHhkLT5tYl90b19yaWdodF9lZGdlID0gKChjbS0+bWJfY29scyAtIDEgLSBtYl9jb2wpICogMTYpIDw8IDM7CisKKyAgICAgICAgLyogU2V0IHVwIGxpbWl0IHZhbHVlcyBmb3IgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudHMKKyAgICAgICAgICogdG8gcHJldmVudCB0aGVtIGV4dGVuZGluZyBiZXlvbmQgdGhlIFVNViBib3JkZXJzCisgICAgICAgICAqLworICAgICAgICB4LT5tdl9jb2xfbWluID0gLSgobWJfY29sICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpKTsKKyAgICAgICAgeC0+bXZfY29sX21heCA9ICgoY20tPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpOworCisgICAgICAgIHhkLT5kc3QueV9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7CisgICAgICAgIHhkLT5kc3QudV9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICB4ZC0+ZHN0LnZfYnVmZmVyID0gY20tPnl2MTJfZmJbZHN0X2ZiX2lkeF0udl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gKG1iX2NvbCAhPSAwKTsKKworICAgICAgICB4LT5yZGRpdiA9IGNwaS0+UkRESVY7CisgICAgICAgIHgtPnJkbXVsdCA9IGNwaS0+UkRNVUxUOworCisgICAgICAgIC8qIENvcHkgY3VycmVudCBtYiB0byBhIGJ1ZmZlciAqLworICAgICAgICB2cDhfY29weV9tZW0xNngxNih4LT5zcmMueV9idWZmZXIsIHgtPnNyYy55X3N0cmlkZSwgeC0+dGhpc21iLCAxNik7CisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICAgICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAqY3VycmVudF9tYl9jb2wgPSBtYl9jb2wgLSAxOyAvKiBzZXQgcHJldmlvdXMgTUIgZG9uZSAqLworCisgICAgICAgICAgICBpZiAoKG1iX2NvbCAmIChuc3luYyAtIDEpKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChtYl9jb2wgPiAoKmxhc3Rfcm93X2N1cnJlbnRfbWJfY29sIC0gbnN5bmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeDg2X3BhdXNlX2hpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3NsZWVwKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYoY3BpLT5veGNmLnR1bmluZyA9PSBWUDhfVFVORV9TU0lNKQorICAgICAgICAgICAgdnA4X2FjdGl2aXR5X21hc2tpbmcoY3BpLCB4KTsKKworICAgICAgICAvKiBJcyBzZWdtZW50YXRpb24gZW5hYmxlZCAqLworICAgICAgICAvKiBNQiBsZXZlbCBhZGp1c3RtZW50IHRvIHF1YW50aXplciAqLworICAgICAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb2RlIHRvIHNldCBzZWdtZW50IGlkIGluIHhkLT5tYm1pLnNlZ21lbnRfaWQgZm9yIGN1cnJlbnQgTUIKKyAgICAgICAgICAgICAqICh3aXRoIHJhbmdlIGNoZWNraW5nKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY3BpLT5zZWdtZW50YXRpb25fbWFwW21hcF9pbmRleCttYl9jb2xdIDw9IDMpCisgICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPSBjcGktPnNlZ21lbnRhdGlvbl9tYXBbbWFwX2luZGV4K21iX2NvbF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPSAwOworCisgICAgICAgICAgICB2cDhjeF9tYl9pbml0X3F1YW50aXplcihjcGksIHgsIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIFNldCB0byBTZWdtZW50IDAgYnkgZGVmYXVsdCAqLworICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPSAwOworCisgICAgICAgIHgtPmFjdGl2ZV9wdHIgPSBjcGktPmFjdGl2ZV9tYXAgKyBtYXBfaW5kZXggKyBtYl9jb2w7CisKKyAgICAgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgKnRvdGFscmF0ZSArPSB2cDhjeF9lbmNvZGVfaW50cmFfbWFjcm9ibG9jayhjcGksIHgsIHRwKTsKKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgICAgICAgICB5X21vZGVzW3hkLT5tYm1pLm1vZGVdICsrOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqdG90YWxyYXRlICs9IHZwOGN4X2VuY29kZV9pbnRlcl9tYWNyb2Jsb2NrKGNwaSwgeCwgdHAsIHJlY29uX3lvZmZzZXQsIHJlY29uX3V2b2Zmc2V0LCBtYl9yb3csIG1iX2NvbCk7CisKKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgICAgICAgICBpbnRlcl95X21vZGVzW3hkLT5tYm1pLm1vZGVdICsrOworCisgICAgICAgICAgICBpZiAoeGQtPm1ibWkubW9kZSA9PSBTUExJVE1WKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBiOworCisgICAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IHhkLT5tYm1pLnBhcnRpdGlvbl9jb3VudDsgYisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJfYl9tb2Rlc1t4LT5wYXJ0aXRpb24tPmJtaVtiXS5tb2RlXSArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgY29kZSBmb3IgY3ljbGljIHJlZnJlc2gKKyAgICAgICAgICAgICAqIElmIGN5Y2xpYyB1cGRhdGUgZW5hYmxlZCB0aGVuIGNvcHkgeGQtPm1ibWkuc2VnbWVudF9pZDsgKHdoaWNoCisgICAgICAgICAgICAgKiBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQgYmFzZWQgb24gbW9kZSBkdXJpbmcKKyAgICAgICAgICAgICAqIHZwOGN4X2VuY29kZV9pbnRlcl9tYWNyb2Jsb2NrKCkpIGJhY2sgaW50byB0aGUgZ2xvYmFsCisgICAgICAgICAgICAgKiBzZWdtZW50YXRpb24gbWFwCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoY3BpLT5jdXJyZW50X2xheWVyID09IDApICYmCisgICAgICAgICAgICAgICAgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkICYmIHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BpLT5zZWdtZW50YXRpb25fbWFwW21hcF9pbmRleCttYl9jb2xdID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQ7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgYmxvY2sgaGFzIGJlZW4gcmVmcmVzaGVkIG1hcmsgaXQgYXMgY2xlYW4gKHRoZQorICAgICAgICAgICAgICAgICAqIG1hZ25pdHVkZSBvZiB0aGUgLXZlIGluZmx1ZW5jZXMgaG93IGxvbmcgaXQgd2lsbCBiZSBiZWZvcmUKKyAgICAgICAgICAgICAgICAgKiB3ZSBjb25zaWRlciBhbm90aGVyIHJlZnJlc2gpOgorICAgICAgICAgICAgICAgICAqIEVsc2UgaWYgaXQgd2FzIGNvZGVkIChsYXN0IGZyYW1lIDAsMCkgYW5kIGhhcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAqIGJlZW4gcmVmcmVzaGVkIHRoZW4gbWFyayBpdCBhcyBhIGNhbmRpZGF0ZSBmb3IgY2xlYW51cAorICAgICAgICAgICAgICAgICAqIG5leHQgdGltZSAobWFya2VkIDApIGVsc2UgbWFyayBpdCBhcyBkaXJ0eSAoMSkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkKQorICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFttYXBfaW5kZXgrbWJfY29sXSA9IC0xOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBaRVJPTVYpICYmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IExBU1RfRlJBTUUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwW21hcF9pbmRleCttYl9jb2xdID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFttYXBfaW5kZXgrbWJfY29sXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbbWFwX2luZGV4K21iX2NvbF0gPSAxOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjcGktPnRwbGlzdFttYl9yb3ddLnN0b3AgPSAqdHA7CisKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgICAgIC8qIHBhY2sgdG9rZW5zIGZvciB0aGlzIE1CICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0b2tfY291bnQgPSAqdHAgLSB0cF9zdGFydDsKKyAgICAgICAgICAgIHBhY2tfdG9rZW5zKHcsIHRwX3N0YXJ0LCB0b2tfY291bnQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXIgaW50byBnZiB1c2FnZSBmbGFncyBzdHJ1Y3R1cmUuICovCisgICAgICAgIHgtPmdmX2FjdGl2ZV9wdHIrKzsKKworICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGFjdGl2aXR5IG1hc2sgcG9pbnRlcnMuICovCisgICAgICAgIHgtPm1iX2FjdGl2aXR5X3B0cisrOworCisgICAgICAgIC8qIGFkanVzdCB0byB0aGUgbmV4dCBjb2x1bW4gb2YgbWFjcm9ibG9ja3MgKi8KKyAgICAgICAgeC0+c3JjLnlfYnVmZmVyICs9IDE2OworICAgICAgICB4LT5zcmMudV9idWZmZXIgKz0gODsKKyAgICAgICAgeC0+c3JjLnZfYnVmZmVyICs9IDg7CisKKyAgICAgICAgcmVjb25feW9mZnNldCArPSAxNjsKKyAgICAgICAgcmVjb25fdXZvZmZzZXQgKz0gODsKKworICAgICAgICAvKiBLZWVwIHRyYWNrIG9mIHNlZ21lbnQgdXNhZ2UgKi8KKyAgICAgICAgc2VnbWVudF9jb3VudHNbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWRdICsrOworCisgICAgICAgIC8qIHNraXAgdG8gbmV4dCBtYiAqLworICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQrKzsKKyAgICAgICAgeC0+cGFydGl0aW9uX2luZm8rKzsKKyAgICAgICAgeGQtPmFib3ZlX2NvbnRleHQrKzsKKyAgICB9CisKKyAgICAvKiBleHRlbmQgdGhlIHJlY29uIGZvciBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgdnA4X2V4dGVuZF9tYl9yb3coICZjbS0+eXYxMl9mYltkc3RfZmJfaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgKyAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC52X2J1ZmZlciArIDgpOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCAhPSAwKQorICAgICAgICAqY3VycmVudF9tYl9jb2wgPSByaWdodG1vc3RfY29sOworI2VuZGlmCisKKyAgICAvKiB0aGlzIGlzIHRvIGFjY291bnQgZm9yIHRoZSBib3JkZXIgKi8KKyAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQrKzsKKyAgICB4LT5wYXJ0aXRpb25faW5mbysrOworfQorCitzdGF0aWMgdm9pZCBpbml0X2VuY29kZV9mcmFtZV9tYl9jb250ZXh0KFZQOF9DT01QICpjcGkpCit7CisgICAgTUFDUk9CTE9DSyAqY29uc3QgeCA9ICYgY3BpLT5tYjsKKyAgICBWUDhfQ09NTU9OICpjb25zdCBjbSA9ICYgY3BpLT5jb21tb247CisgICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJiB4LT5lX21iZDsKKworICAgIC8qIEdGIGFjdGl2ZSBmbGFncyBkYXRhIHN0cnVjdHVyZSAqLworICAgIHgtPmdmX2FjdGl2ZV9wdHIgPSAoc2lnbmVkIGNoYXIgKiljcGktPmdmX2FjdGl2ZV9mbGFnczsKKworICAgIC8qIEFjdGl2aXR5IG1hcCBwb2ludGVyICovCisgICAgeC0+bWJfYWN0aXZpdHlfcHRyID0gY3BpLT5tYl9hY3Rpdml0eV9tYXA7CisKKyAgICB4LT5hY3RfemJpbl9hZGogPSAwOworCisgICAgeC0+cGFydGl0aW9uX2luZm8gPSB4LT5waTsKKworICAgIHhkLT5tb2RlX2luZm9fY29udGV4dCA9IGNtLT5taTsKKyAgICB4ZC0+bW9kZV9pbmZvX3N0cmlkZSA9IGNtLT5tb2RlX2luZm9fc3RyaWRlOworCisgICAgeGQtPmZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKKworICAgIC8qIHJlc2V0IGludHJhIG1vZGUgY29udGV4dHMgKi8KKyAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICB2cDhfaW5pdF9tYm1vZGVfcHJvYnMoY20pOworCisgICAgLyogQ29weSBkYXRhIG92ZXIgaW50byBtYWNybyBibG9jayBkYXRhIHN0cnVjdHVyZXMuICovCisgICAgeC0+c3JjID0gKiBjcGktPlNvdXJjZTsKKyAgICB4ZC0+cHJlID0gY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdOworICAgIHhkLT5kc3QgPSBjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF07CisKKyAgICAvKiBzZXQgdXAgZnJhbWUgZm9yIGludHJhIGNvZGVkIGJsb2NrcyAqLworICAgIHZwOF9zZXR1cF9pbnRyYV9yZWNvbigmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdKTsKKworICAgIHZwOF9idWlsZF9ibG9ja19vZmZzZXRzKHgpOworCisgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBEQ19QUkVEOworICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gRENfUFJFRDsKKworICAgIHhkLT5sZWZ0X2NvbnRleHQgPSAmY20tPmxlZnRfY29udGV4dDsKKworICAgIHZwOF96ZXJvKGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlKQorCisgICAgeC0+bXZjID0gY20tPmZjLm12YzsKKworICAgIHZweF9tZW1zZXQoY20tPmFib3ZlX2NvbnRleHQsIDAsCisgICAgICAgICAgICAgICBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykgKiBjbS0+bWJfY29scyk7CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgdHJlYXRtZW50IHdoZW4gR0YgYW5kIEFSRiBhcmUgbm90IHNlbnNpYmxlIG9wdGlvbnMKKyAgICAgKiBmb3IgcmVmZXJlbmNlCisgICAgICovCisgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzID09IFZQOF9MQVNUX0ZSQU1FKQorICAgICAgICB2cDhfY2FsY19yZWZfZnJhbWVfY29zdHMoeC0+cmVmX2ZyYW1lX2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2JfaW50cmFfY29kZWQsMjU1LDEyOCk7CisgICAgZWxzZSBpZiAoKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkgJiYKKyAgICAgICAgICAgICAgIChjcGktPnJlZl9mcmFtZV9mbGFncyA9PSBWUDhfR09MRF9GUkFNRSkpCisgICAgICAgIHZwOF9jYWxjX3JlZl9mcmFtZV9jb3N0cyh4LT5yZWZfZnJhbWVfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCwxLDI1NSk7CisgICAgZWxzZSBpZiAoKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkgJiYKKyAgICAgICAgICAgICAgICAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgPT0gVlA4X0FMVFJfRlJBTUUpKQorICAgICAgICB2cDhfY2FsY19yZWZfZnJhbWVfY29zdHMoeC0+cmVmX2ZyYW1lX2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2JfaW50cmFfY29kZWQsMSwxKTsKKyAgICBlbHNlCisgICAgICAgIHZwOF9jYWxjX3JlZl9mcmFtZV9jb3N0cyh4LT5yZWZfZnJhbWVfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9sYXN0X2NvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkKTsKKworICAgIHhkLT5mdWxscGl4ZWxfbWFzayA9IDB4ZmZmZmZmZmY7CisgICAgaWYoY20tPmZ1bGxfcGl4ZWwpCisgICAgICAgIHhkLT5mdWxscGl4ZWxfbWFzayA9IDB4ZmZmZmZmZjg7CisKKyAgICB2cDhfemVybyh4LT5jb2VmX2NvdW50cyk7CisgICAgdnA4X3plcm8oeC0+eW1vZGVfY291bnQpOworICAgIHZwOF96ZXJvKHgtPnV2X21vZGVfY291bnQpCisgICAgeC0+cHJlZGljdGlvbl9lcnJvciA9IDA7CisgICAgeC0+aW50cmFfZXJyb3IgPSAwOworfQorCitzdGF0aWMgdm9pZCBzdW1fY29lZl9jb3VudHMoTUFDUk9CTE9DSyAqeCwgTUFDUk9CTE9DSyAqeF90aHJlYWQpCit7CisgICAgaW50IGkgPSAwOworICAgIGRvCisgICAgeworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXQgZXZlcnkgY29udGV4dCAqLworCisgICAgICAgICAgICAgICAgLyogY2FsYyBwcm9icyBhbmQgYnJhbmNoIGN0cyBmb3IgdGhpcyBmcmFtZSBvbmx5ICovCisgICAgICAgICAgICAgICAgaW50IHQgPSAwOyAgICAgIC8qIHRva2VuL3Byb2IgaW5kZXggKi8KKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4LT5jb2VmX2NvdW50cyBbaV1bal1ba11bdF0gKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIHhfdGhyZWFkLT5jb2VmX2NvdW50cyBbaV1bal1ba11bdF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgrK3QgPCBFTlRST1BZX05PREVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2sgPCBQUkVWX0NPRUZfQ09OVEVYVFMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2ogPCBDT0VGX0JBTkRTKTsKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IEJMT0NLX1RZUEVTKTsKK30KKwordm9pZCB2cDhfZW5jb2RlX2ZyYW1lKFZQOF9DT01QICpjcGkpCit7CisgICAgaW50IG1iX3JvdzsKKyAgICBNQUNST0JMT0NLICpjb25zdCB4ID0gJiBjcGktPm1iOworICAgIFZQOF9DT01NT04gKmNvbnN0IGNtID0gJiBjcGktPmNvbW1vbjsKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmIHgtPmVfbWJkOworICAgIFRPS0VORVhUUkEgKnRwID0gY3BpLT50b2s7CisgICAgaW50IHNlZ21lbnRfY291bnRzW01BWF9NQl9TRUdNRU5UU107CisgICAgaW50IHRvdGFscmF0ZTsKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgQk9PTF9DT0RFUiAqIGJjID0gJmNwaS0+YmNbMV07IC8qIGJjWzBdIGlzIGZvciBjb250cm9sIHBhcnRpdGlvbiAqLworICAgIGNvbnN0IGludCBudW1fcGFydCA9ICgxIDw8IGNtLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24pOworI2VuZGlmCisKKyAgICB2cHhfbWVtc2V0KHNlZ21lbnRfY291bnRzLCAwLCBzaXplb2Yoc2VnbWVudF9jb3VudHMpKTsKKyAgICB0b3RhbHJhdGUgPSAwOworCisgICAgaWYgKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAyKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8IDApCisgICAgICAgICAgICBjcGktPlNwZWVkID0gLShjcGktPm94Y2YuY3B1X3VzZWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2cDhfYXV0b19zZWxlY3Rfc3BlZWQoY3BpKTsKKyAgICB9CisKKyAgICAvKiBGdW5jdGlvbnMgc2V0dXAgZm9yIGFsbCBmcmFtZSB0eXBlcyBzbyB3ZSBjYW4gdXNlIE1DIGluIEFsdFJlZiAqLworICAgIGlmKCFjbS0+dXNlX2JpbGluZWFyX21jX2ZpbHRlcikKKyAgICB7CisgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0ICAgICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDR4NDsKKyAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQgICAgID0gdnA4X3NpeHRhcF9wcmVkaWN0OHg0OworICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4OCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDg7CisgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTYgICA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdCAgICAgICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NDsKKyAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQgICAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDQ7CisgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4OworICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2OworICAgIH0KKworICAgIGNwaS0+bWIuc2tpcF90cnVlX2NvdW50ID0gMDsKKyAgICBjcGktPnRva19jb3VudCA9IDA7CisKKyNpZiAwCisgICAgLyogRXhwZXJpbWVudGFsIGNvZGUgKi8KKyAgICBjcGktPmZyYW1lX2Rpc3RvcnRpb24gPSAwOworICAgIGNwaS0+bGFzdF9tYl9kaXN0b3J0aW9uID0gMDsKKyNlbmRpZgorCisgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pOworCisgICAgdnA4X3plcm8oY3BpLT5tYi5NVmNvdW50KTsKKworICAgIHZwOGN4X2ZyYW1lX2luaXRfcXVhbnRpemVyKGNwaSk7CisKKyAgICB2cDhfaW5pdGlhbGl6ZV9yZF9jb25zdHMoY3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfZGNfcXVhbnQoY20tPmJhc2VfcWluZGV4LCBjbS0+eTFkY19kZWx0YV9xKSk7CisKKyAgICB2cDhjeF9pbml0aWFsaXplX21lX2NvbnN0cyhjcGksIGNtLT5iYXNlX3FpbmRleCk7CisKKyAgICBpZihjcGktPm94Y2YudHVuaW5nID09IFZQOF9UVU5FX1NTSU0pCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIGVuY29kZSBmcmFtZSBjb250ZXh0LiAqLworICAgICAgICBpbml0X2VuY29kZV9mcmFtZV9tYl9jb250ZXh0KGNwaSk7CisKKyAgICAgICAgLyogQnVpbGQgYSBmcmFtZSBsZXZlbCBhY3Rpdml0eSBtYXAgKi8KKyAgICAgICAgYnVpbGRfYWN0aXZpdHlfbWFwKGNwaSk7CisgICAgfQorCisgICAgLyogcmUtaW5pdCBlbmNvZGUgZnJhbWUgY29udGV4dC4gKi8KKyAgICBpbml0X2VuY29kZV9mcmFtZV9tYl9jb250ZXh0KGNwaSk7CisKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgbnVtX3BhcnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X3N0YXJ0X2VuY29kZSgmYmNbaV0sIGNwaS0+cGFydGl0aW9uX2RbaSArIDFdLAorICAgICAgICAgICAgICAgICAgICBjcGktPnBhcnRpdGlvbl9kX2VuZFtpICsgMV0pOworICAgICAgICAgICAgYmNbaV0uZXJyb3IgPSAmY20tPmVycm9yOworICAgICAgICB9CisgICAgfQorCisjZW5kaWYKKworICAgIHsKKyAgICAgICAgc3RydWN0IHZweF91c2VjX3RpbWVyICBlbXJfdGltZXI7CisgICAgICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZlbXJfdGltZXIpOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICB2cDhjeF9pbml0X21icnRocmVhZF9kYXRhKGNwaSwgeCwgY3BpLT5tYl9yb3dfZWksIDEsICBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bWJfcm93czsgaSsrKQorICAgICAgICAgICAgICAgIGNwaS0+bXRfY3VycmVudF9tYl9jb2xbaV0gPSAtMTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VtX3Bvc3QoJmNwaS0+aF9ldmVudF9zdGFydF9lbmNvZGluZ1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdyArPSAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cDhfemVybyhjbS0+bGVmdF9jb250ZXh0KQorCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworICAgICAgICAgICAgICAgIHRwID0gY3BpLT50b2s7CisjZWxzZQorICAgICAgICAgICAgICAgIHRwID0gY3BpLT50b2sgKyBtYl9yb3cgKiAoY20tPm1iX2NvbHMgKiAxNiAqIDI0KTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgZW5jb2RlX21iX3JvdyhjcGksIGNtLCBtYl9yb3csIHgsIHhkLCAmdHAsIHNlZ21lbnRfY291bnRzLCAmdG90YWxyYXRlKTsKKworICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0byB0aGUgbmV4dCByb3cgb2YgbWJzICovCisgICAgICAgICAgICAgICAgeC0+c3JjLnlfYnVmZmVyICs9IDE2ICogeC0+c3JjLnlfc3RyaWRlICogKGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkgLSAxNiAqIGNtLT5tYl9jb2xzOworICAgICAgICAgICAgICAgIHgtPnNyYy51X2J1ZmZlciArPSAgOCAqIHgtPnNyYy51dl9zdHJpZGUgKiAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSAtIDggKiBjbS0+bWJfY29sczsKKyAgICAgICAgICAgICAgICB4LT5zcmMudl9idWZmZXIgKz0gIDggKiB4LT5zcmMudXZfc3RyaWRlICogKGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkgLSA4ICogY20tPm1iX2NvbHM7CisKKyAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQgKz0geGQtPm1vZGVfaW5mb19zdHJpZGUgKiBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgICAgICB4LT5wYXJ0aXRpb25faW5mbyAgKz0geGQtPm1vZGVfaW5mb19zdHJpZGUgKiBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgICAgICB4LT5nZl9hY3RpdmVfcHRyICAgKz0gY20tPm1iX2NvbHMgKiBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsKKworICAgICAgICAgICAgICAgIGlmKG1iX3JvdyA9PSBjbS0+bWJfcm93cyAtIDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X2VuZF9lbmNvZGluZyk7IC8qIHNpZ25hbCBmcmFtZSBlbmNvZGluZyBlbmQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbV93YWl0KCZjcGktPmhfZXZlbnRfZW5kX2VuY29kaW5nKTsgLyogd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBmaW5pc2ggKi8KKworICAgICAgICAgICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCBjbS0+bWJfcm93czsgbWJfcm93ICsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwaS0+dG9rX2NvdW50ICs9ICh1bnNpZ25lZCBpbnQpCisgICAgICAgICAgICAgICAgICAoY3BpLT50cGxpc3RbbWJfcm93XS5zdG9wIC0gY3BpLT50cGxpc3RbbWJfcm93XS5zdGFydCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGksIGo7CisKKyAgICAgICAgICAgICAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50X2NvdW50c1tqXSArPSBjcGktPm1iX3Jvd19laVtpXS5zZWdtZW50X2NvdW50c1tqXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG1vZGVfY291bnQ7CisgICAgICAgICAgICAgICAgaW50IG12X3ZhbHM7CisgICAgICAgICAgICAgICAgdG90YWxyYXRlICs9IGNwaS0+bWJfcm93X2VpW2ldLnRvdGFscmF0ZTsKKworICAgICAgICAgICAgICAgIGNwaS0+bWIuc2tpcF90cnVlX2NvdW50ICs9IGNwaS0+bWJfcm93X2VpW2ldLm1iLnNraXBfdHJ1ZV9jb3VudDsKKworICAgICAgICAgICAgICAgIGZvcihtb2RlX2NvdW50ID0gMDsgbW9kZV9jb3VudCA8IFZQOF9ZTU9ERVM7IG1vZGVfY291bnQrKykKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5tYi55bW9kZV9jb3VudFttb2RlX2NvdW50XSArPQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5tYl9yb3dfZWlbaV0ubWIueW1vZGVfY291bnRbbW9kZV9jb3VudF07CisKKyAgICAgICAgICAgICAgICBmb3IobW9kZV9jb3VudCA9IDA7IG1vZGVfY291bnQgPCBWUDhfVVZfTU9ERVM7IG1vZGVfY291bnQrKykKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5tYi51dl9tb2RlX2NvdW50W21vZGVfY291bnRdICs9CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPm1iX3Jvd19laVtpXS5tYi51dl9tb2RlX2NvdW50W21vZGVfY291bnRdOworCisgICAgICAgICAgICAgICAgZm9yKG12X3ZhbHMgPSAwOyBtdl92YWxzIDwgTVZ2YWxzOyBtdl92YWxzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjcGktPm1iLk1WY291bnRbMF1bbXZfdmFsc10gKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+bWJfcm93X2VpW2ldLm1iLk1WY291bnRbMF1bbXZfdmFsc107CisgICAgICAgICAgICAgICAgICAgIGNwaS0+bWIuTVZjb3VudFsxXVttdl92YWxzXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5tYl9yb3dfZWlbaV0ubWIuTVZjb3VudFsxXVttdl92YWxzXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjcGktPm1iLnByZWRpY3Rpb25fZXJyb3IgKz0KKyAgICAgICAgICAgICAgICAgICAgY3BpLT5tYl9yb3dfZWlbaV0ubWIucHJlZGljdGlvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICBjcGktPm1iLmludHJhX2Vycm9yICs9IGNwaS0+bWJfcm93X2VpW2ldLm1iLmludHJhX2Vycm9yOworCisgICAgICAgICAgICAgICAgLyogYWRkIHVwIGNvdW50cyBmb3IgZWFjaCB0aHJlYWQgKi8KKyAgICAgICAgICAgICAgICBzdW1fY29lZl9jb3VudHMoeCwgJmNwaS0+bWJfcm93X2VpW2ldLm1iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qIGZvciBlYWNoIG1hY3JvYmxvY2sgcm93IGluIGltYWdlICovCisgICAgICAgICAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cDhfemVybyhjbS0+bGVmdF9jb250ZXh0KQorCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworICAgICAgICAgICAgICAgIHRwID0gY3BpLT50b2s7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGVuY29kZV9tYl9yb3coY3BpLCBjbSwgbWJfcm93LCB4LCB4ZCwgJnRwLCBzZWdtZW50X2NvdW50cywgJnRvdGFscmF0ZSk7CisKKyAgICAgICAgICAgICAgICAvKiBhZGp1c3QgdG8gdGhlIG5leHQgcm93IG9mIG1icyAqLworICAgICAgICAgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAtIDE2ICogY20tPm1iX2NvbHM7CisgICAgICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyICs9IDggKiB4LT5zcmMudXZfc3RyaWRlIC0gOCAqIGNtLT5tYl9jb2xzOworICAgICAgICAgICAgICAgIHgtPnNyYy52X2J1ZmZlciArPSA4ICogeC0+c3JjLnV2X3N0cmlkZSAtIDggKiBjbS0+bWJfY29sczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3BpLT50b2tfY291bnQgPSAodW5zaWduZWQgaW50KSh0cCAtIGNwaS0+dG9rKTsKKyAgICAgICAgfQorCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG51bV9wYXJ0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X3N0b3BfZW5jb2RlKCZiY1tpXSk7CisgICAgICAgICAgICAgICAgY3BpLT5wYXJ0aXRpb25fc3pbaSsxXSA9IGJjW2ldLnBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmZW1yX3RpbWVyKTsKKyAgICAgICAgY3BpLT50aW1lX2VuY29kZV9tYl9yb3cgKz0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmZW1yX3RpbWVyKTsKKyAgICB9CisKKworICAgIC8vIFdvcmsgb3V0IHRoZSBzZWdtZW50IHByb2JhYmlsaXRpZXMgaWYgc2VnbWVudGF0aW9uIGlzIGVuYWJsZWQKKyAgICAvLyBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZAorICAgIGlmICh4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQgJiYgeGQtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKQorICAgIHsKKyAgICAgICAgaW50IHRvdF9jb3VudDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgLyogU2V0IHRvIGRlZmF1bHRzICovCisgICAgICAgIHZweF9tZW1zZXQoeGQtPm1iX3NlZ21lbnRfdHJlZV9wcm9icywgMjU1ICwgc2l6ZW9mKHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnMpKTsKKworICAgICAgICB0b3RfY291bnQgPSBzZWdtZW50X2NvdW50c1swXSArIHNlZ21lbnRfY291bnRzWzFdICsgc2VnbWVudF9jb3VudHNbMl0gKyBzZWdtZW50X2NvdW50c1szXTsKKworICAgICAgICBpZiAodG90X2NvdW50KQorICAgICAgICB7CisgICAgICAgICAgICB4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdID0gKChzZWdtZW50X2NvdW50c1swXSArIHNlZ21lbnRfY291bnRzWzFdKSAqIDI1NSkgLyB0b3RfY291bnQ7CisKKyAgICAgICAgICAgIHRvdF9jb3VudCA9IHNlZ21lbnRfY291bnRzWzBdICsgc2VnbWVudF9jb3VudHNbMV07CisKKyAgICAgICAgICAgIGlmICh0b3RfY291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMV0gPSAoc2VnbWVudF9jb3VudHNbMF0gKiAyNTUpIC8gdG90X2NvdW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b3RfY291bnQgPSBzZWdtZW50X2NvdW50c1syXSArIHNlZ21lbnRfY291bnRzWzNdOworCisgICAgICAgICAgICBpZiAodG90X2NvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzJdID0gKHNlZ21lbnRfY291bnRzWzJdICogMjU1KSAvIHRvdF9jb3VudDsKKworICAgICAgICAgICAgLyogWmVybyBwcm9iYWJpbGl0aWVzIG5vdCBhbGxvd2VkICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUJfRkVBVFVSRV9UUkVFX1BST0JTOyBpICsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzW2ldID09IDApCisgICAgICAgICAgICAgICAgICAgIHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbaV0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcHJvamVjdGVkX2ZyYW1lX3NpemUgaW4gdW5pdHMgb2YgQllURVMgKi8KKyAgICBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplID0gdG90YWxyYXRlID4+IDg7CisKKyAgICAvKiBNYWtlIGEgbm90ZSBvZiB0aGUgcGVyY2VudGFnZSBNQnMgY29kZWQgSW50cmEuICovCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID0gMTAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgdG90X21vZGVzOworCisgICAgICAgIHRvdF9tb2RlcyA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0lOVFJBX0ZSQU1FXQorICAgICAgICAgICAgICAgICAgICArIGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdCisgICAgICAgICAgICAgICAgICAgICsgY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbR09MREVOX0ZSQU1FXQorICAgICAgICAgICAgICAgICAgICArIGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV07CisKKyAgICAgICAgaWYgKHRvdF9tb2RlcykKKyAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID0gY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbSU5UUkFfRlJBTUVdICogMTAwIC8gdG90X21vZGVzOworCisgICAgfQorCisjaWYgISBDT05GSUdfUkVBTFRJTUVfT05MWQorICAgIC8qIEFkanVzdCB0aGUgcHJvamVjdGVkIHJlZmVyZW5jZSBmcmFtZSB1c2FnZSBwcm9iYWJpbGl0eSBudW1iZXJzIHRvCisgICAgICogcmVmbGVjdCB3aGF0IHdlIGhhdmUganVzdCBzZWVuLiBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiB3ZSBtYWtlCisgICAgICogbXVsdGlwbGUgaXRlcmF0aW9ucyBvZiB0aGUgcmVjb2RlIGxvb3AgcmF0aGVyIHRoYW4gY29udGludWluZyB0byB1c2UKKyAgICAgKiB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUuCisgICAgICovCisgICAgaWYgKChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpICYmICgoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKSB8fAorICAgICAgICAoIWNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgJiYgIWNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkpKQorICAgIHsKKyAgICAgIHZwOF9jb252ZXJ0X3JmY3RfdG9fcHJvYihjcGkpOworICAgIH0KKyNlbmRpZgorfQordm9pZCB2cDhfc2V0dXBfYmxvY2tfcHRycyhNQUNST0JMT0NLICp4KQoreworICAgIGludCByLCBjOworICAgIGludCBpOworCisgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmJsb2NrW3IqNCtjXS5zcmNfZGlmZiA9IHgtPnNyY19kaWZmICsgciAqIDQgKiAxNiArIGMgKiA0OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChyID0gMDsgciA8IDI7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmJsb2NrWzE2ICsgcioyK2NdLnNyY19kaWZmID0geC0+c3JjX2RpZmYgKyAyNTYgKyByICogNCAqIDggKyBjICogNDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgZm9yIChyID0gMDsgciA8IDI7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmJsb2NrWzIwICsgcioyK2NdLnNyY19kaWZmID0geC0+c3JjX2RpZmYgKyAzMjAgKyByICogNCAqIDggKyBjICogNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHgtPmJsb2NrWzI0XS5zcmNfZGlmZiA9IHgtPnNyY19kaWZmICsgMzg0OworCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKKyAgICB7CisgICAgICAgIHgtPmJsb2NrW2ldLmNvZWZmID0geC0+Y29lZmYgKyBpICogMTY7CisgICAgfQorfQorCit2b2lkIHZwOF9idWlsZF9ibG9ja19vZmZzZXRzKE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGJsb2NrID0gMDsKKyAgICBpbnQgYnIsIGJjOworCisgICAgdnA4X2J1aWxkX2Jsb2NrX2RvZmZzZXRzKCZ4LT5lX21iZCk7CisKKyAgICAvKiB5IGJsb2NrcyAqLworICAgIHgtPnRoaXNtYl9wdHIgPSAmeC0+dGhpc21iWzBdOworICAgIGZvciAoYnIgPSAwOyBiciA8IDQ7IGJyKyspCisgICAgeworICAgICAgICBmb3IgKGJjID0gMDsgYmMgPCA0OyBiYysrKQorICAgICAgICB7CisgICAgICAgICAgICBCTE9DSyAqdGhpc19ibG9jayA9ICZ4LT5ibG9ja1tibG9ja107CisgICAgICAgICAgICB0aGlzX2Jsb2NrLT5iYXNlX3NyYyA9ICZ4LT50aGlzbWJfcHRyOworICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjX3N0cmlkZSA9IDE2OworICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjID0gNCAqIGJyICogMTYgKyA0ICogYmM7CisgICAgICAgICAgICArK2Jsb2NrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogdSBibG9ja3MgKi8KKyAgICBmb3IgKGJyID0gMDsgYnIgPCAyOyBicisrKQorICAgIHsKKyAgICAgICAgZm9yIChiYyA9IDA7IGJjIDwgMjsgYmMrKykKKyAgICAgICAgeworICAgICAgICAgICAgQkxPQ0sgKnRoaXNfYmxvY2sgPSAmeC0+YmxvY2tbYmxvY2tdOworICAgICAgICAgICAgdGhpc19ibG9jay0+YmFzZV9zcmMgPSAmeC0+c3JjLnVfYnVmZmVyOworICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjX3N0cmlkZSA9IHgtPnNyYy51dl9zdHJpZGU7CisgICAgICAgICAgICB0aGlzX2Jsb2NrLT5zcmMgPSA0ICogYnIgKiB0aGlzX2Jsb2NrLT5zcmNfc3RyaWRlICsgNCAqIGJjOworICAgICAgICAgICAgKytibG9jazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHYgYmxvY2tzICovCisgICAgZm9yIChiciA9IDA7IGJyIDwgMjsgYnIrKykKKyAgICB7CisgICAgICAgIGZvciAoYmMgPSAwOyBiYyA8IDI7IGJjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEJMT0NLICp0aGlzX2Jsb2NrID0gJngtPmJsb2NrW2Jsb2NrXTsKKyAgICAgICAgICAgIHRoaXNfYmxvY2stPmJhc2Vfc3JjID0gJngtPnNyYy52X2J1ZmZlcjsKKyAgICAgICAgICAgIHRoaXNfYmxvY2stPnNyY19zdHJpZGUgPSB4LT5zcmMudXZfc3RyaWRlOworICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjID0gNCAqIGJyICogdGhpc19ibG9jay0+c3JjX3N0cmlkZSArIDQgKiBiYzsKKyAgICAgICAgICAgICsrYmxvY2s7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN1bV9pbnRyYV9zdGF0cyhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KQoreworICAgIGNvbnN0IE1BQ1JPQkxPQ0tEICp4ZCA9ICYgeC0+ZV9tYmQ7CisgICAgY29uc3QgTUJfUFJFRElDVElPTl9NT0RFIG0gPSB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZTsKKyAgICBjb25zdCBNQl9QUkVESUNUSU9OX01PREUgdXZtID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGU7CisKKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgY29uc3QgaW50IGlzX2tleSA9IGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FOworCisgICAgKysgKGlzX2tleSA/IHV2X21vZGVzIDogaW50ZXJfdXZfbW9kZXMpW3V2bV07CisKKyAgICBpZiAobSA9PSBCX1BSRUQpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgKmNvbnN0IGJjdCA9IGlzX2tleSA/IGJfbW9kZXMgOiBpbnRlcl9iX21vZGVzOworCisgICAgICAgIGludCBiID0gMDsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICArKyBiY3RbeGQtPmJsb2NrW2JdLmJtaS5tb2RlXTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKytiIDwgMTYpOworICAgIH0KKworI2VuZGlmCisKKyAgICArK3gtPnltb2RlX2NvdW50W21dOworICAgICsreC0+dXZfbW9kZV9jb3VudFt1dm1dOworCit9CisKKy8qIEV4cGVyaW1lbnRhbCBzdHViIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHBlciBNQiB6YmluIGFkanVzdG1lbnQgYmFzZWQgb24KKyAqIHNvbWUgcHJldmlvdXNseSBjYWxjdWxhdGVkIG1lYXN1cmUgb2YgTUIgYWN0aXZpdHkuCisgKi8KK3N0YXRpYyB2b2lkIGFkanVzdF9hY3RfemJpbiggVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCApCit7CisjaWYgVVNFX0FDVF9JTkRFWAorICAgIHgtPmFjdF96YmluX2FkaiA9ICooeC0+bWJfYWN0aXZpdHlfcHRyKTsKKyNlbHNlCisgICAgaW50NjRfdCBhOworICAgIGludDY0X3QgYjsKKyAgICBpbnQ2NF90IGFjdCA9ICooeC0+bWJfYWN0aXZpdHlfcHRyKTsKKworICAgIC8qIEFwcGx5IHRoZSBtYXNraW5nIHRvIHRoZSBSRCBtdWx0aXBsaWVyLiAqLworICAgIGEgPSBhY3QgKyA0KmNwaS0+YWN0aXZpdHlfYXZnOworICAgIGIgPSA0KmFjdCArIGNwaS0+YWN0aXZpdHlfYXZnOworCisgICAgaWYgKCBhY3QgPiBjcGktPmFjdGl2aXR5X2F2ZyApCisgICAgICAgIHgtPmFjdF96YmluX2FkaiA9IChpbnQpKCgoaW50NjRfdCliICsgKGE+PjEpKS9hKSAtIDE7CisgICAgZWxzZQorICAgICAgICB4LT5hY3RfemJpbl9hZGogPSAxIC0gKGludCkoKChpbnQ2NF90KWEgKyAoYj4+MSkpL2IpOworI2VuZGlmCit9CisKK2ludCB2cDhjeF9lbmNvZGVfaW50cmFfbWFjcm9ibG9jayhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPS0VORVhUUkEgKip0KQoreworICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKKyAgICBpbnQgcmF0ZTsKKworICAgIGlmIChjcGktPnNmLlJEICYmIGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCAhPSAyKQorICAgICAgICB2cDhfcmRfcGlja19pbnRyYV9tb2RlKHgsICZyYXRlKTsKKyAgICBlbHNlCisgICAgICAgIHZwOF9waWNrX2ludHJhX21vZGUoeCwgJnJhdGUpOworCisgICAgaWYoY3BpLT5veGNmLnR1bmluZyA9PSBWUDhfVFVORV9TU0lNKQorICAgIHsKKyAgICAgICAgYWRqdXN0X2FjdF96YmluKCBjcGksIHggKTsKKyAgICAgICAgdnA4X3VwZGF0ZV96YmluX2V4dHJhKGNwaSwgeCk7CisgICAgfQorCisgICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gQl9QUkVEKQorICAgICAgICB2cDhfZW5jb2RlX2ludHJhNHg0bWJ5KHgpOworICAgIGVsc2UKKyAgICAgICAgdnA4X2VuY29kZV9pbnRyYTE2eDE2bWJ5KHgpOworCisgICAgdnA4X2VuY29kZV9pbnRyYTE2eDE2bWJ1dih4KTsKKworICAgIHN1bV9pbnRyYV9zdGF0cyhjcGksIHgpOworCisgICAgdnA4X3Rva2VuaXplX21iKGNwaSwgeCwgdCk7CisKKyAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVEKQorICAgICAgICB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fbWJ5KHhkKTsKKworICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICh4ZC0+cWNvZWZmKzE2KjE2LCB4ZC0+ZGVxdWFudF91diwKKyAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnV2X3N0cmlkZSwgeGQtPmVvYnMrMTYpOworICAgIHJldHVybiByYXRlOworfQorI2lmZGVmIFNQRUVEU1RBVFMKK2V4dGVybiBpbnQgY250X3BtOworI2VuZGlmCisKK2V4dGVybiB2b2lkIHZwOF9maXhfY29udGV4dHMoTUFDUk9CTE9DS0QgKngpOworCitpbnQgdnA4Y3hfZW5jb2RlX2ludGVyX21hY3JvYmxvY2sKKygKKyAgICBWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LCBUT0tFTkVYVFJBICoqdCwKKyAgICBpbnQgcmVjb25feW9mZnNldCwgaW50IHJlY29uX3V2b2Zmc2V0LAorICAgIGludCBtYl9yb3csIGludCBtYl9jb2wKKykKK3sKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmeC0+ZV9tYmQ7CisgICAgaW50IGludHJhX2Vycm9yID0gMDsKKyAgICBpbnQgcmF0ZTsKKyAgICBpbnQgZGlzdG9ydGlvbjsKKworICAgIHgtPnNraXAgPSAwOworCisgICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKKyAgICAgICAgeC0+ZW5jb2RlX2JyZWFrb3V0ID0gY3BpLT5zZWdtZW50X2VuY29kZV9icmVha291dFt4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZF07CisgICAgZWxzZQorICAgICAgICB4LT5lbmNvZGVfYnJlYWtvdXQgPSBjcGktPm94Y2YuZW5jb2RlX2JyZWFrb3V0OworCisjaWYgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORworICAgIC8qIFJlc2V0IHRoZSBiZXN0IHNzZSBtb2RlL212IGZvciBlYWNoIG1hY3JvYmxvY2suICovCisgICAgeC0+YmVzdF9yZWZlcmVuY2VfZnJhbWUgPSBJTlRSQV9GUkFNRTsKKyAgICB4LT5iZXN0X3plcm9tdl9yZWZlcmVuY2VfZnJhbWUgPSBJTlRSQV9GUkFNRTsKKyAgICB4LT5iZXN0X3NzZV9pbnRlcl9tb2RlID0gMDsKKyAgICB4LT5iZXN0X3NzZV9tdi5hc19pbnQgPSAwOworICAgIHgtPm5lZWRfdG9fY2xhbXBfYmVzdF9tdnMgPSAwOworI2VuZGlmCisKKyAgICBpZiAoY3BpLT5zZi5SRCkKKyAgICB7CisgICAgICAgIGludCB6YmluX21vZGVfYm9vc3RfZW5hYmxlZCA9IGNwaS0+emJpbl9tb2RlX2Jvb3N0X2VuYWJsZWQ7CisKKyAgICAgICAgLyogQXJlIHdlIHVzaW5nIHRoZSBmYXN0IHF1YW50aXplciBmb3IgdGhlIG1vZGUgc2VsZWN0aW9uPyAqLworICAgICAgICBpZihjcGktPnNmLnVzZV9mYXN0cXVhbnRfZm9yX3BpY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+bWIucXVhbnRpemVfYiAgICAgID0gdnA4X2Zhc3RfcXVhbnRpemVfYjsKKyAgICAgICAgICAgIGNwaS0+bWIucXVhbnRpemVfYl9wYWlyID0gdnA4X2Zhc3RfcXVhbnRpemVfYl9wYWlyOworCisgICAgICAgICAgICAvKiB0aGUgZmFzdCBxdWFudGl6ZXIgZG9lcyBub3QgdXNlIHpiaW5fZXh0cmEsIHNvCisgICAgICAgICAgICAgKiBkbyBub3QgcmVjYWxjdWxhdGUgKi8KKyAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0X2VuYWJsZWQgPSAwOworICAgICAgICB9CisgICAgICAgIHZwOF9yZF9waWNrX2ludGVyX21vZGUoY3BpLCB4LCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCwgJnJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3RvcnRpb24sICZpbnRyYV9lcnJvcik7CisKKyAgICAgICAgLyogc3dpdGNoIGJhY2sgdG8gdGhlIHJlZ3VsYXIgcXVhbnRpemVyIGZvciB0aGUgZW5jb2RlICovCisgICAgICAgIGlmIChjcGktPnNmLmltcHJvdmVkX3F1YW50KQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPm1iLnF1YW50aXplX2IgICAgICA9IHZwOF9yZWd1bGFyX3F1YW50aXplX2I7CisgICAgICAgICAgICBjcGktPm1iLnF1YW50aXplX2JfcGFpciA9IHZwOF9yZWd1bGFyX3F1YW50aXplX2JfcGFpcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlc3RvcmUgY3BpLT56YmluX21vZGVfYm9vc3RfZW5hYmxlZCAqLworICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdF9lbmFibGVkID0gemJpbl9tb2RlX2Jvb3N0X2VuYWJsZWQ7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdnA4X3BpY2tfaW50ZXJfbW9kZShjcGksIHgsIHJlY29uX3lvZmZzZXQsIHJlY29uX3V2b2Zmc2V0LCAmcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzdG9ydGlvbiwgJmludHJhX2Vycm9yLCBtYl9yb3csIG1iX2NvbCk7CisgICAgfQorCisgICAgeC0+cHJlZGljdGlvbl9lcnJvciArPSBkaXN0b3J0aW9uOworICAgIHgtPmludHJhX2Vycm9yICs9IGludHJhX2Vycm9yOworCisgICAgaWYoY3BpLT5veGNmLnR1bmluZyA9PSBWUDhfVFVORV9TU0lNKQorICAgIHsKKyAgICAgICAgLyogQWRqdXN0IHRoZSB6YmluIGJhc2VkIG9uIHRoaXMgTUIgcmF0ZS4gKi8KKyAgICAgICAgYWRqdXN0X2FjdF96YmluKCBjcGksIHggKTsKKyAgICB9CisKKyNpZiAwCisgICAgLyogRXhwZXJpbWVudGFsIFJEIGNvZGUgKi8KKyAgICBjcGktPmZyYW1lX2Rpc3RvcnRpb24gKz0gZGlzdG9ydGlvbjsKKyAgICBjcGktPmxhc3RfbWJfZGlzdG9ydGlvbiA9IGRpc3RvcnRpb247CisjZW5kaWYKKworICAgIC8qIE1CIGxldmVsIGFkanV0bWVudCB0byBxdWFudGl6ZXIgc2V0dXAgKi8KKyAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgIHsKKyAgICAgICAgLyogSWYgY3ljbGljIHVwZGF0ZSBlbmFibGVkICovCisgICAgICAgIGlmIChjcGktPmN1cnJlbnRfbGF5ZXIgPT0gMCAmJiBjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2xlYXIgc2VnbWVudF9pZCBiYWNrIHRvIDAgaWYgbm90IGNvZGVkIChsYXN0IGZyYW1lIDAsMCkgKi8KKyAgICAgICAgICAgIGlmICgoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAoKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgIT0gTEFTVF9GUkFNRSkgfHwgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFpFUk9NVikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkID0gMDsKKworICAgICAgICAgICAgICAgIC8qIHNlZ21lbnRfaWQgY2hhbmdlZCwgc28gdXBkYXRlICovCisgICAgICAgICAgICAgICAgdnA4Y3hfbWJfaW5pdF9xdWFudGl6ZXIoY3BpLCB4LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgLyogRXhwZXJpbWVudGFsIGNvZGUuIFNwZWNpYWwgY2FzZSBmb3IgZ2YgYW5kIGFyZiB6ZXJvbXYgbW9kZXMuCisgICAgICAgICAqIEluY3JlYXNlIHpiaW4gc2l6ZSB0byBzdXByZXNzIG5vaXNlCisgICAgICAgICAqLworICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7CisgICAgICAgIGlmIChjcGktPnpiaW5fbW9kZV9ib29zdF9lbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBaRVJPTVYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSAhPSBMQVNUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgPSBHRl9aRVJPTVZfWkJJTl9CT09TVDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgPSBMRl9aRVJPTVZfWkJJTl9CT09TVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKKyAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgPSBNVl9aQklOX0JPT1NUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIGZhc3QgcXVhbnRpemVyIGRvZXNuJ3QgdXNlIHpiaW5fZXh0cmEsIG9ubHkgZG8gc28gd2l0aAorICAgICAgICAgKiB0aGUgcmVndWxhciBxdWFudGl6ZXIuICovCisgICAgICAgIGlmIChjcGktPnNmLmltcHJvdmVkX3F1YW50KQorICAgICAgICAgICAgdnA4X3VwZGF0ZV96YmluX2V4dHJhKGNwaSwgeCk7CisgICAgfQorCisgICAgY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV0gKys7CisKKyAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBJTlRSQV9GUkFNRSkKKyAgICB7CisgICAgICAgIHZwOF9lbmNvZGVfaW50cmExNngxNm1idXYoeCk7CisKKyAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IEJfUFJFRCkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2VuY29kZV9pbnRyYTR4NG1ieSh4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9lbmNvZGVfaW50cmExNngxNm1ieSh4KTsKKyAgICAgICAgfQorCisgICAgICAgIHN1bV9pbnRyYV9zdGF0cyhjcGksIHgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgcmVmX2ZiX2lkeDsKKworICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKQorICAgICAgICAgICAgcmVmX2ZiX2lkeCA9IGNwaS0+Y29tbW9uLmxzdF9mYl9pZHg7CisgICAgICAgIGVsc2UgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gR09MREVOX0ZSQU1FKQorICAgICAgICAgICAgcmVmX2ZiX2lkeCA9IGNwaS0+Y29tbW9uLmdsZF9mYl9pZHg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlZl9mYl9pZHggPSBjcGktPmNvbW1vbi5hbHRfZmJfaWR4OworCisgICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBjcGktPmNvbW1vbi55djEyX2ZiW3JlZl9mYl9pZHhdLnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKKyAgICAgICAgeGQtPnByZS51X2J1ZmZlciA9IGNwaS0+Y29tbW9uLnl2MTJfZmJbcmVmX2ZiX2lkeF0udV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgeGQtPnByZS52X2J1ZmZlciA9IGNwaS0+Y29tbW9uLnl2MTJfZmJbcmVmX2ZiX2lkeF0udl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKKworICAgICAgICBpZiAoIXgtPnNraXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9lbmNvZGVfaW50ZXIxNngxNih4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21iKHhkLCB4ZC0+ZHN0LnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwgeGQtPmRzdC51dl9zdHJpZGUpOworCisgICAgfQorCisgICAgaWYgKCF4LT5za2lwKQorICAgIHsKKyAgICAgICAgdnA4X3Rva2VuaXplX21iKGNwaSwgeCwgdCk7CisKKyAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCkKKyAgICAgICAgICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYnkoeGQpOworCisgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAoeGQtPnFjb2VmZisxNioxNiwgeGQtPmRlcXVhbnRfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnV2X3N0cmlkZSwgeGQtPmVvYnMrMTYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBhbHdheXMgc2V0IG1iX3NraXBfY29lZmYgYXMgaXQgaXMgbmVlZGVkIGJ5IHRoZSBsb29wZmlsdGVyICovCisgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmID0gMTsKKworICAgICAgICBpZiAoY3BpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCkKKyAgICAgICAgeworICAgICAgICAgICAgeC0+c2tpcF90cnVlX2NvdW50ICsrOworICAgICAgICAgICAgdnA4X2ZpeF9jb250ZXh0cyh4ZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfc3R1ZmZfbWIoY3BpLCB4LCB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYXRlOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZWZyYW1lLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ2YmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZWZyYW1lLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBFTkNPREVGUkFNRV9ICisjZGVmaW5lIEVOQ09ERUZSQU1FX0gKK2V4dGVybiB2b2lkIHZwOF9hY3Rpdml0eV9tYXNraW5nKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngpOworCitleHRlcm4gdm9pZCB2cDhfYnVpbGRfYmxvY2tfb2Zmc2V0cyhNQUNST0JMT0NLICp4KTsKKworZXh0ZXJuIHZvaWQgdnA4X3NldHVwX2Jsb2NrX3B0cnMoTUFDUk9CTE9DSyAqeCk7CisKK2V4dGVybiB2b2lkIHZwOF9lbmNvZGVfZnJhbWUoVlA4X0NPTVAgKmNwaSk7CisKK2V4dGVybiBpbnQgdnA4Y3hfZW5jb2RlX2ludGVyX21hY3JvYmxvY2soVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwKKyAgICAgICAgVE9LRU5FWFRSQSAqKnQsCisgICAgICAgIGludCByZWNvbl95b2Zmc2V0LCBpbnQgcmVjb25fdXZvZmZzZXQsCisgICAgICAgIGludCBtYl9yb3csIGludCBtYl9jb2wpOworCitleHRlcm4gaW50IHZwOGN4X2VuY29kZV9pbnRyYV9tYWNyb2Jsb2NrKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsCisgICAgICAgIFRPS0VORVhUUkEgKip0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZWludHJhLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBkZDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZWludHJhLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaCIKKyNpbmNsdWRlICJlbmNvZGVtYi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vaW52dHJhbnMuaCIKKyNpbmNsdWRlICJlbmNvZGVpbnRyYS5oIgorCisKK2ludCB2cDhfZW5jb2RlX2ludHJhKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCB1c2VfZGNfcHJlZCkKK3sKKworICAgIGludCBpOworICAgIGludCBpbnRyYV9wcmVkX3ZhciA9IDA7CisgICAgKHZvaWQpIGNwaTsKKworICAgIGlmICh1c2VfZGNfcHJlZCkKKyAgICB7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBEQ19QUkVEOworICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gRENfUFJFRDsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7CisKKyAgICAgICAgdnA4X2VuY29kZV9pbnRyYTE2eDE2bWJ5KHgpOworCisgICAgICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYnkoJngtPmVfbWJkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmVfbWJkLmJsb2NrW2ldLmJtaS5hc19tb2RlID0gQl9EQ19QUkVEOworICAgICAgICAgICAgdnA4X2VuY29kZV9pbnRyYTR4NGJsb2NrKHgsIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50cmFfcHJlZF92YXIgPSB2cDhfZ2V0X21iX3NzKHgtPnNyY19kaWZmKTsKKworICAgIHJldHVybiBpbnRyYV9wcmVkX3ZhcjsKK30KKwordm9pZCB2cDhfZW5jb2RlX2ludHJhNHg0YmxvY2soTUFDUk9CTE9DSyAqeCwgaW50IGliKQoreworICAgIEJMT0NLRCAqYiA9ICZ4LT5lX21iZC5ibG9ja1tpYl07CisgICAgQkxPQ0sgKmJlID0gJngtPmJsb2NrW2liXTsKKyAgICBpbnQgZHN0X3N0cmlkZSA9IHgtPmVfbWJkLmRzdC55X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3QgPSB4LT5lX21iZC5kc3QueV9idWZmZXIgKyBiLT5vZmZzZXQ7CisgICAgdW5zaWduZWQgY2hhciAqQWJvdmUgPSBkc3QgLSBkc3Rfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKnlsZWZ0ID0gZHN0IC0gMTsKKyAgICB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0ID0gQWJvdmVbLTFdOworCisgICAgdnA4X2ludHJhNHg0X3ByZWRpY3QoQWJvdmUsIHlsZWZ0LCBkc3Rfc3RyaWRlLCBiLT5ibWkuYXNfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiLT5wcmVkaWN0b3IsIDE2LCB0b3BfbGVmdCk7CisKKyAgICB2cDhfc3VidHJhY3RfYihiZSwgYiwgMTYpOworCisgICAgeC0+c2hvcnRfZmRjdDR4NChiZS0+c3JjX2RpZmYsIGJlLT5jb2VmZiwgMzIpOworCisgICAgeC0+cXVhbnRpemVfYihiZSwgYik7CisKKyAgICBpZiAoKmItPmVvYiA+IDEpCisgICAgeworICAgICAgdnA4X3Nob3J0X2lkY3Q0eDRsbG0oYi0+ZHFjb2VmZiwgYi0+cHJlZGljdG9yLCAxNiwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkKGItPmRxY29lZmZbMF0sIGItPnByZWRpY3RvciwgMTYsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgfQorfQorCit2b2lkIHZwOF9lbmNvZGVfaW50cmE0eDRtYnkoTUFDUk9CTE9DSyAqbWIpCit7CisgICAgaW50IGk7CisKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmbWItPmVfbWJkOworICAgIGludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KHhkLCB4ZC0+ZHN0LnlfYnVmZmVyIC0geGQtPmRzdC55X3N0cmlkZSArIDE2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB2cDhfZW5jb2RlX2ludHJhNHg0YmxvY2sobWIsIGkpOworICAgIHJldHVybjsKK30KKwordm9pZCB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnkoTUFDUk9CTE9DSyAqeCkKK3sKKyAgICBCTE9DSyAqYiA9ICZ4LT5ibG9ja1swXTsKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisKKyAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyh4ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciAtIHhkLT5kc3QueV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0Lnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0Lnlfc3RyaWRlKTsKKworICAgIHZwOF9zdWJ0cmFjdF9tYnkoeC0+c3JjX2RpZmYsICooYi0+YmFzZV9zcmMpLAorICAgICAgICBiLT5zcmNfc3RyaWRlLCB4ZC0+ZHN0LnlfYnVmZmVyLCB4ZC0+ZHN0Lnlfc3RyaWRlKTsKKworICAgIHZwOF90cmFuc2Zvcm1faW50cmFfbWJ5KHgpOworCisgICAgdnA4X3F1YW50aXplX21ieSh4KTsKKworICAgIGlmICh4LT5vcHRpbWl6ZSkKKyAgICAgICAgdnA4X29wdGltaXplX21ieSh4KTsKK30KKwordm9pZCB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnV2KE1BQ1JPQkxPQ0sgKngpCit7CisgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOworCisgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zKHhkLCB4ZC0+ZHN0LnVfYnVmZmVyIC0geGQtPmRzdC51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3Qudl9idWZmZXIgLSB4ZC0+ZHN0LnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3Qudl9idWZmZXIgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51dl9zdHJpZGUpOworCisgICAgdnA4X3N1YnRyYWN0X21idXYoeC0+c3JjX2RpZmYsIHgtPnNyYy51X2J1ZmZlciwKKyAgICAgICAgeC0+c3JjLnZfYnVmZmVyLCB4LT5zcmMudXZfc3RyaWRlLCB4ZC0+ZHN0LnVfYnVmZmVyLAorICAgICAgICB4ZC0+ZHN0LnZfYnVmZmVyLCB4ZC0+ZHN0LnV2X3N0cmlkZSk7CisKKyAgICB2cDhfdHJhbnNmb3JtX21idXYoeCk7CisKKyAgICB2cDhfcXVhbnRpemVfbWJ1dih4KTsKKworICAgIGlmICh4LT5vcHRpbWl6ZSkKKyAgICAgICAgdnA4X29wdGltaXplX21idXYoeCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlaW50cmEuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVpbnRyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjE0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlaW50cmEuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfRU5DT0RFSU5UUkFfSF8KKyNkZWZpbmUgX0VOQ09ERUlOVFJBX0hfCisjaW5jbHVkZSAib255eF9pbnQuaCIKKworaW50IHZwOF9lbmNvZGVfaW50cmEoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50IHVzZV9kY19wcmVkKTsKK3ZvaWQgdnA4X2VuY29kZV9pbnRyYTE2eDE2bWJ5KE1BQ1JPQkxPQ0sgKngpOwordm9pZCB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnV2KE1BQ1JPQkxPQ0sgKngpOwordm9pZCB2cDhfZW5jb2RlX2ludHJhNHg0bWJ5KE1BQ1JPQkxPQ0sgKm1iKTsKK3ZvaWQgdnA4X2VuY29kZV9pbnRyYTR4NGJsb2NrKE1BQ1JPQkxPQ0sgKngsIGludCBpYik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtYi5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZW1iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0OTRmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtYi5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgImVuY29kZW1iLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludGVyLmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpbmNsdWRlICJ0b2tlbml6ZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vaW52dHJhbnMuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJyZG9wdC5oIgorCit2b2lkIHZwOF9zdWJ0cmFjdF9iX2MoQkxPQ0sgKmJlLCBCTE9DS0QgKmJkLCBpbnQgcGl0Y2gpCit7CisgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciA9ICgqKGJlLT5iYXNlX3NyYykgKyBiZS0+c3JjKTsKKyAgICBzaG9ydCAqZGlmZl9wdHIgPSBiZS0+c3JjX2RpZmY7CisgICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSBiZC0+cHJlZGljdG9yOworICAgIGludCBzcmNfc3RyaWRlID0gYmUtPnNyY19zdHJpZGU7CisKKyAgICBpbnQgciwgYzsKKworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmX3B0cltjXSA9IHNyY19wdHJbY10gLSBwcmVkX3B0cltjXTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZmZfcHRyICs9IHBpdGNoOworICAgICAgICBwcmVkX3B0ciArPSBwaXRjaDsKKyAgICAgICAgc3JjX3B0ciAgKz0gc3JjX3N0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X3N1YnRyYWN0X21idXZfYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqdXNyYywgdW5zaWduZWQgY2hhciAqdnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqdXByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdnByZWQsIGludCBwcmVkX3N0cmlkZSkKK3sKKyAgICBzaG9ydCAqdWRpZmYgPSBkaWZmICsgMjU2OworICAgIHNob3J0ICp2ZGlmZiA9IGRpZmYgKyAzMjA7CisKKyAgICBpbnQgciwgYzsKKworICAgIGZvciAociA9IDA7IHIgPCA4OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgODsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICB1ZGlmZltjXSA9IHVzcmNbY10gLSB1cHJlZFtjXTsKKyAgICAgICAgfQorCisgICAgICAgIHVkaWZmICs9IDg7CisgICAgICAgIHVwcmVkICs9IHByZWRfc3RyaWRlOworICAgICAgICB1c3JjICArPSBzcmNfc3RyaWRlOworICAgIH0KKworICAgIGZvciAociA9IDA7IHIgPCA4OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgODsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICB2ZGlmZltjXSA9IHZzcmNbY10gLSB2cHJlZFtjXTsKKyAgICAgICAgfQorCisgICAgICAgIHZkaWZmICs9IDg7CisgICAgICAgIHZwcmVkICs9IHByZWRfc3RyaWRlOworICAgICAgICB2c3JjICArPSBzcmNfc3RyaWRlOworICAgIH0KK30KKwordm9pZCB2cDhfc3VidHJhY3RfbWJ5X2Moc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcHJlZF9zdHJpZGUpCit7CisgICAgaW50IHIsIGM7CisKKyAgICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKKyAgICB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAxNjsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmW2NdID0gc3JjW2NdIC0gcHJlZFtjXTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZmYgKz0gMTY7CisgICAgICAgIHByZWQgKz0gcHJlZF9zdHJpZGU7CisgICAgICAgIHNyYyAgKz0gc3JjX3N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9zdWJ0cmFjdF9tYihNQUNST0JMT0NLICp4KQoreworICAgIEJMT0NLICpiID0gJngtPmJsb2NrWzBdOworCisgICAgdnA4X3N1YnRyYWN0X21ieSh4LT5zcmNfZGlmZiwgKihiLT5iYXNlX3NyYyksCisgICAgICAgIGItPnNyY19zdHJpZGUsIHgtPmVfbWJkLmRzdC55X2J1ZmZlciwgeC0+ZV9tYmQuZHN0Lnlfc3RyaWRlKTsKKyAgICB2cDhfc3VidHJhY3RfbWJ1dih4LT5zcmNfZGlmZiwgeC0+c3JjLnVfYnVmZmVyLAorICAgICAgICB4LT5zcmMudl9idWZmZXIsIHgtPnNyYy51dl9zdHJpZGUsIHgtPmVfbWJkLmRzdC51X2J1ZmZlciwKKyAgICAgICAgeC0+ZV9tYmQuZHN0LnZfYnVmZmVyLCB4LT5lX21iZC5kc3QudXZfc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfZGNibG9jayhNQUNST0JMT0NLICp4KQoreworICAgIHNob3J0ICpzcmNfZGlmZl9wdHIgPSAmeC0+c3JjX2RpZmZbMzg0XTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgc3JjX2RpZmZfcHRyW2ldID0geC0+Y29lZmZbaSAqIDE2XTsKKyAgICB9Cit9CisKK3ZvaWQgdnA4X3RyYW5zZm9ybV9tYnV2KE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpICs9IDIpCisgICAgeworICAgICAgICB4LT5zaG9ydF9mZGN0OHg0KCZ4LT5ibG9ja1tpXS5zcmNfZGlmZlswXSwKKyAgICAgICAgICAgICZ4LT5ibG9ja1tpXS5jb2VmZlswXSwgMTYpOworICAgIH0KK30KKworCit2b2lkIHZwOF90cmFuc2Zvcm1faW50cmFfbWJ5KE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMikKKyAgICB7CisgICAgICAgIHgtPnNob3J0X2ZkY3Q4eDQoJngtPmJsb2NrW2ldLnNyY19kaWZmWzBdLAorICAgICAgICAgICAgJngtPmJsb2NrW2ldLmNvZWZmWzBdLCAzMik7CisgICAgfQorCisgICAgLyogYnVpbGQgZGMgYmxvY2sgZnJvbSAxNiB5IGRjIHZhbHVlcyAqLworICAgIGJ1aWxkX2RjYmxvY2soeCk7CisKKyAgICAvKiBkbyAybmQgb3JkZXIgdHJhbnNmb3JtIG9uIHRoZSBkYyBibG9jayAqLworICAgIHgtPnNob3J0X3dhbHNoNHg0KCZ4LT5ibG9ja1syNF0uc3JjX2RpZmZbMF0sCisgICAgICAgICZ4LT5ibG9ja1syNF0uY29lZmZbMF0sIDgpOworCit9CisKKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX21iKE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMikKKyAgICB7CisgICAgICAgIHgtPnNob3J0X2ZkY3Q4eDQoJngtPmJsb2NrW2ldLnNyY19kaWZmWzBdLAorICAgICAgICAgICAgJngtPmJsb2NrW2ldLmNvZWZmWzBdLCAzMik7CisgICAgfQorCisgICAgLyogYnVpbGQgZGMgYmxvY2sgZnJvbSAxNiB5IGRjIHZhbHVlcyAqLworICAgIGlmICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCisgICAgICAgIGJ1aWxkX2RjYmxvY2soeCk7CisKKyAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpICs9IDIpCisgICAgeworICAgICAgICB4LT5zaG9ydF9mZGN0OHg0KCZ4LT5ibG9ja1tpXS5zcmNfZGlmZlswXSwKKyAgICAgICAgICAgICZ4LT5ibG9ja1tpXS5jb2VmZlswXSwgMTYpOworICAgIH0KKworICAgIC8qIGRvIDJuZCBvcmRlciB0cmFuc2Zvcm0gb24gdGhlIGRjIGJsb2NrICovCisgICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKKyAgICAgICAgeC0+c2hvcnRfd2Fsc2g0eDQoJngtPmJsb2NrWzI0XS5zcmNfZGlmZlswXSwKKyAgICAgICAgJngtPmJsb2NrWzI0XS5jb2VmZlswXSwgOCk7CisKK30KKworCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fbWJ5KE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMikKKyAgICB7CisgICAgICAgIHgtPnNob3J0X2ZkY3Q4eDQoJngtPmJsb2NrW2ldLnNyY19kaWZmWzBdLAorICAgICAgICAgICAgJngtPmJsb2NrW2ldLmNvZWZmWzBdLCAzMik7CisgICAgfQorCisgICAgLyogYnVpbGQgZGMgYmxvY2sgZnJvbSAxNiB5IGRjIHZhbHVlcyAqLworICAgIGlmICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCisgICAgeworICAgICAgICBidWlsZF9kY2Jsb2NrKHgpOworICAgICAgICB4LT5zaG9ydF93YWxzaDR4NCgmeC0+YmxvY2tbMjRdLnNyY19kaWZmWzBdLAorICAgICAgICAgICAgJngtPmJsb2NrWzI0XS5jb2VmZlswXSwgOCk7CisgICAgfQorfQorCisKKworI2RlZmluZSBSRFRSVU5DKFJNLERNLFIsRCkgKCAoMTI4KyhSKSooUk0pKSAmIDB4RkYgKQorCit0eXBlZGVmIHN0cnVjdCB2cDhfdG9rZW5fc3RhdGUgdnA4X3Rva2VuX3N0YXRlOworCitzdHJ1Y3QgdnA4X3Rva2VuX3N0YXRleworICBpbnQgICAgICAgICAgIHJhdGU7CisgIGludCAgICAgICAgICAgZXJyb3I7CisgIHNpZ25lZCBjaGFyICAgbmV4dDsKKyAgc2lnbmVkIGNoYXIgICB0b2tlbjsKKyAgc2hvcnQgICAgICAgICBxYzsKK307CisKKy8qIFRPRE86IGV4cGVyaW1lbnRzIHRvIGZpbmQgb3B0aW1hbCBtdWx0aXBsZSBudW1iZXJzICovCisjZGVmaW5lIFkxX1JEX01VTFQgNAorI2RlZmluZSBVVl9SRF9NVUxUIDIKKyNkZWZpbmUgWTJfUkRfTVVMVCAxNgorCitzdGF0aWMgY29uc3QgaW50IHBsYW5lX3JkX211bHRbNF09Cit7CisgICAgWTFfUkRfTVVMVCwKKyAgICBZMl9SRF9NVUxULAorICAgIFVWX1JEX01VTFQsCisgICAgWTFfUkRfTVVMVAorfTsKKworc3RhdGljIHZvaWQgb3B0aW1pemVfYihNQUNST0JMT0NLICptYiwgaW50IGliLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUICphLCBFTlRST1BZX0NPTlRFWFQgKmwpCit7CisgICAgQkxPQ0sgKmI7CisgICAgQkxPQ0tEICpkOworICAgIHZwOF90b2tlbl9zdGF0ZSB0b2tlbnNbMTddWzJdOworICAgIHVuc2lnbmVkIGJlc3RfbWFza1syXTsKKyAgICBjb25zdCBzaG9ydCAqZGVxdWFudF9wdHI7CisgICAgY29uc3Qgc2hvcnQgKmNvZWZmX3B0cjsKKyAgICBzaG9ydCAqcWNvZWZmX3B0cjsKKyAgICBzaG9ydCAqZHFjb2VmZl9wdHI7CisgICAgaW50IGVvYjsKKyAgICBpbnQgaTA7CisgICAgaW50IHJjOworICAgIGludCB4OworICAgIGludCBzeiA9IDA7CisgICAgaW50IG5leHQ7CisgICAgaW50IHJkbXVsdDsKKyAgICBpbnQgcmRkaXY7CisgICAgaW50IGZpbmFsX2VvYjsKKyAgICBpbnQgcmRfY29zdDA7CisgICAgaW50IHJkX2Nvc3QxOworICAgIGludCByYXRlMDsKKyAgICBpbnQgcmF0ZTE7CisgICAgaW50IGVycm9yMDsKKyAgICBpbnQgZXJyb3IxOworICAgIGludCB0MDsKKyAgICBpbnQgdDE7CisgICAgaW50IGJlc3Q7CisgICAgaW50IGJhbmQ7CisgICAgaW50IHB0OworICAgIGludCBpOworICAgIGludCBlcnJfbXVsdCA9IHBsYW5lX3JkX211bHRbdHlwZV07CisKKyAgICBiID0gJm1iLT5ibG9ja1tpYl07CisgICAgZCA9ICZtYi0+ZV9tYmQuYmxvY2tbaWJdOworCisgICAgLyogRW5hYmxlIHRoaXMgdG8gdGVzdCB0aGUgZWZmZWN0IG9mIFJETyBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgZHluYW1pYworICAgICAqICB6ZXJvIGJpbiBpbnN0ZWFkIG9mIGFuIGF1Z21lbnRhdGlvbiBvZiBpdC4KKyAgICAgKi8KKyNpZiAwCisgICAgdnA4X3N0cmljdF9xdWFudGl6ZV9iKGIsIGQpOworI2VuZGlmCisKKyAgICBkZXF1YW50X3B0ciA9IGQtPmRlcXVhbnQ7CisgICAgY29lZmZfcHRyID0gYi0+Y29lZmY7CisgICAgcWNvZWZmX3B0ciA9IGQtPnFjb2VmZjsKKyAgICBkcWNvZWZmX3B0ciA9IGQtPmRxY29lZmY7CisgICAgaTAgPSAhdHlwZTsKKyAgICBlb2IgPSAqZC0+ZW9iOworCisgICAgLyogTm93IHNldCB1cCBhIFZpdGVyYmkgdHJlbGxpcyB0byBldmFsdWF0ZSBhbHRlcm5hdGl2ZSByb3VuZGluZ3MuICovCisgICAgcmRtdWx0ID0gbWItPnJkbXVsdCAqIGVycl9tdWx0OworICAgIGlmKG1iLT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWU9PUlOVFJBX0ZSQU1FKQorICAgICAgICByZG11bHQgPSAocmRtdWx0ICogOSk+PjQ7CisKKyAgICByZGRpdiA9IG1iLT5yZGRpdjsKKyAgICBiZXN0X21hc2tbMF0gPSBiZXN0X21hc2tbMV0gPSAwOworICAgIC8qIEluaXRpYWxpemUgdGhlIHNlbnRpbmVsIG5vZGUgb2YgdGhlIHRyZWxsaXMuICovCisgICAgdG9rZW5zW2VvYl1bMF0ucmF0ZSA9IDA7CisgICAgdG9rZW5zW2VvYl1bMF0uZXJyb3IgPSAwOworICAgIHRva2Vuc1tlb2JdWzBdLm5leHQgPSAxNjsKKyAgICB0b2tlbnNbZW9iXVswXS50b2tlbiA9IERDVF9FT0JfVE9LRU47CisgICAgdG9rZW5zW2VvYl1bMF0ucWMgPSAwOworICAgICoodG9rZW5zW2VvYl0gKyAxKSA9ICoodG9rZW5zW2VvYl0gKyAwKTsKKyAgICBuZXh0ID0gZW9iOworICAgIGZvciAoaSA9IGVvYjsgaS0tID4gaTA7KQorICAgIHsKKyAgICAgICAgaW50IGJhc2VfYml0czsKKyAgICAgICAgaW50IGQyOworICAgICAgICBpbnQgZHg7CisKKyAgICAgICAgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisgICAgICAgIHggPSBxY29lZmZfcHRyW3JjXTsKKyAgICAgICAgLyogT25seSBhZGQgYSB0cmVsbGlzIHN0YXRlIGZvciBub24temVybyBjb2VmZmljaWVudHMuICovCisgICAgICAgIGlmICh4KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2hvcnRjdXQ9MDsKKyAgICAgICAgICAgIGVycm9yMCA9IHRva2Vuc1tuZXh0XVswXS5lcnJvcjsKKyAgICAgICAgICAgIGVycm9yMSA9IHRva2Vuc1tuZXh0XVsxXS5lcnJvcjsKKyAgICAgICAgICAgIC8qIEV2YWx1YXRlIHRoZSBmaXJzdCBwb3NzaWJpbGl0eSBmb3IgdGhpcyBzdGF0ZS4gKi8KKyAgICAgICAgICAgIHJhdGUwID0gdG9rZW5zW25leHRdWzBdLnJhdGU7CisgICAgICAgICAgICByYXRlMSA9IHRva2Vuc1tuZXh0XVsxXS5yYXRlOworICAgICAgICAgICAgdDAgPSAodnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyICsgeCktPlRva2VuOworICAgICAgICAgICAgLyogQ29uc2lkZXIgYm90aCBwb3NzaWJsZSBzdWNjZXNzb3Igc3RhdGVzLiAqLworICAgICAgICAgICAgaWYgKG5leHQgPCAxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYW5kID0gdnA4X2NvZWZfYmFuZHNbaSArIDFdOworICAgICAgICAgICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdDBdOworICAgICAgICAgICAgICAgIHJhdGUwICs9CisgICAgICAgICAgICAgICAgICAgIG1iLT50b2tlbl9jb3N0c1t0eXBlXVtiYW5kXVtwdF1bdG9rZW5zW25leHRdWzBdLnRva2VuXTsKKyAgICAgICAgICAgICAgICByYXRlMSArPQorICAgICAgICAgICAgICAgICAgICBtYi0+dG9rZW5fY29zdHNbdHlwZV1bYmFuZF1bcHRdW3Rva2Vuc1tuZXh0XVsxXS50b2tlbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZF9jb3N0MCA9IFJEQ09TVChyZG11bHQsIHJkZGl2LCByYXRlMCwgZXJyb3IwKTsKKyAgICAgICAgICAgIHJkX2Nvc3QxID0gUkRDT1NUKHJkbXVsdCwgcmRkaXYsIHJhdGUxLCBlcnJvcjEpOworICAgICAgICAgICAgaWYgKHJkX2Nvc3QwID09IHJkX2Nvc3QxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJkX2Nvc3QwID0gUkRUUlVOQyhyZG11bHQsIHJkZGl2LCByYXRlMCwgZXJyb3IwKTsKKyAgICAgICAgICAgICAgICByZF9jb3N0MSA9IFJEVFJVTkMocmRtdWx0LCByZGRpdiwgcmF0ZTEsIGVycm9yMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBBbmQgcGljayB0aGUgYmVzdC4gKi8KKyAgICAgICAgICAgIGJlc3QgPSByZF9jb3N0MSA8IHJkX2Nvc3QwOworICAgICAgICAgICAgYmFzZV9iaXRzID0gKih2cDhfZGN0X3ZhbHVlX2Nvc3RfcHRyICsgeCk7CisgICAgICAgICAgICBkeCA9IGRxY29lZmZfcHRyW3JjXSAtIGNvZWZmX3B0cltyY107CisgICAgICAgICAgICBkMiA9IGR4KmR4OworICAgICAgICAgICAgdG9rZW5zW2ldWzBdLnJhdGUgPSBiYXNlX2JpdHMgKyAoYmVzdCA/IHJhdGUxIDogcmF0ZTApOworICAgICAgICAgICAgdG9rZW5zW2ldWzBdLmVycm9yID0gZDIgKyAoYmVzdCA/IGVycm9yMSA6IGVycm9yMCk7CisgICAgICAgICAgICB0b2tlbnNbaV1bMF0ubmV4dCA9IG5leHQ7CisgICAgICAgICAgICB0b2tlbnNbaV1bMF0udG9rZW4gPSB0MDsKKyAgICAgICAgICAgIHRva2Vuc1tpXVswXS5xYyA9IHg7CisgICAgICAgICAgICBiZXN0X21hc2tbMF0gfD0gYmVzdCA8PCBpOworICAgICAgICAgICAgLyogRXZhbHVhdGUgdGhlIHNlY29uZCBwb3NzaWJpbGl0eSBmb3IgdGhpcyBzdGF0ZS4gKi8KKyAgICAgICAgICAgIHJhdGUwID0gdG9rZW5zW25leHRdWzBdLnJhdGU7CisgICAgICAgICAgICByYXRlMSA9IHRva2Vuc1tuZXh0XVsxXS5yYXRlOworCisgICAgICAgICAgICBpZigoYWJzKHgpKmRlcXVhbnRfcHRyW3JjXT5hYnMoY29lZmZfcHRyW3JjXSkpICYmCisgICAgICAgICAgICAgICAoYWJzKHgpKmRlcXVhbnRfcHRyW3JjXTxhYnMoY29lZmZfcHRyW3JjXSkrZGVxdWFudF9wdHJbcmNdKSkKKyAgICAgICAgICAgICAgICBzaG9ydGN1dCA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2hvcnRjdXQgPSAwOworCisgICAgICAgICAgICBpZihzaG9ydGN1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeiA9IC0oeCA8IDApOworICAgICAgICAgICAgICAgIHggLT0gMipzeiArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENvbnNpZGVyIGJvdGggcG9zc2libGUgc3VjY2Vzc29yIHN0YXRlcy4gKi8KKyAgICAgICAgICAgIGlmICgheCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSByZWR1Y2VkIHRoaXMgY29lZmZpY2llbnQgdG8gemVybywgY2hlY2sgdG8gc2VlIGlmCisgICAgICAgICAgICAgICAgICogIHdlIG5lZWQgdG8gbW92ZSB0aGUgRU9CIGJhY2sgaGVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0MCA9IHRva2Vuc1tuZXh0XVswXS50b2tlbiA9PSBEQ1RfRU9CX1RPS0VOID8KKyAgICAgICAgICAgICAgICAgICAgRENUX0VPQl9UT0tFTiA6IFpFUk9fVE9LRU47CisgICAgICAgICAgICAgICAgdDEgPSB0b2tlbnNbbmV4dF1bMV0udG9rZW4gPT0gRENUX0VPQl9UT0tFTiA/CisgICAgICAgICAgICAgICAgICAgIERDVF9FT0JfVE9LRU4gOiBaRVJPX1RPS0VOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQwPXQxID0gKHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0ciArIHgpLT5Ub2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXh0IDwgMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFuZCA9IHZwOF9jb2VmX2JhbmRzW2kgKyAxXTsKKyAgICAgICAgICAgICAgICBpZih0MCE9RENUX0VPQl9UT0tFTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdDBdOworICAgICAgICAgICAgICAgICAgICByYXRlMCArPSBtYi0+dG9rZW5fY29zdHNbdHlwZV1bYmFuZF1bcHRdWworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zW25leHRdWzBdLnRva2VuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYodDEhPURDVF9FT0JfVE9LRU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdCA9IHZwOF9wcmV2X3Rva2VuX2NsYXNzW3QxXTsKKyAgICAgICAgICAgICAgICAgICAgcmF0ZTEgKz0gbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdW3B0XVsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vuc1tuZXh0XVsxXS50b2tlbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZF9jb3N0MCA9IFJEQ09TVChyZG11bHQsIHJkZGl2LCByYXRlMCwgZXJyb3IwKTsKKyAgICAgICAgICAgIHJkX2Nvc3QxID0gUkRDT1NUKHJkbXVsdCwgcmRkaXYsIHJhdGUxLCBlcnJvcjEpOworICAgICAgICAgICAgaWYgKHJkX2Nvc3QwID09IHJkX2Nvc3QxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJkX2Nvc3QwID0gUkRUUlVOQyhyZG11bHQsIHJkZGl2LCByYXRlMCwgZXJyb3IwKTsKKyAgICAgICAgICAgICAgICByZF9jb3N0MSA9IFJEVFJVTkMocmRtdWx0LCByZGRpdiwgcmF0ZTEsIGVycm9yMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBBbmQgcGljayB0aGUgYmVzdC4gKi8KKyAgICAgICAgICAgIGJlc3QgPSByZF9jb3N0MSA8IHJkX2Nvc3QwOworICAgICAgICAgICAgYmFzZV9iaXRzID0gKih2cDhfZGN0X3ZhbHVlX2Nvc3RfcHRyICsgeCk7CisKKyAgICAgICAgICAgIGlmKHNob3J0Y3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGR4IC09IChkZXF1YW50X3B0cltyY10gKyBzeikgXiBzejsKKyAgICAgICAgICAgICAgICBkMiA9IGR4KmR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW5zW2ldWzFdLnJhdGUgPSBiYXNlX2JpdHMgKyAoYmVzdCA/IHJhdGUxIDogcmF0ZTApOworICAgICAgICAgICAgdG9rZW5zW2ldWzFdLmVycm9yID0gZDIgKyAoYmVzdCA/IGVycm9yMSA6IGVycm9yMCk7CisgICAgICAgICAgICB0b2tlbnNbaV1bMV0ubmV4dCA9IG5leHQ7CisgICAgICAgICAgICB0b2tlbnNbaV1bMV0udG9rZW4gPWJlc3Q/dDE6dDA7CisgICAgICAgICAgICB0b2tlbnNbaV1bMV0ucWMgPSB4OworICAgICAgICAgICAgYmVzdF9tYXNrWzFdIHw9IGJlc3QgPDwgaTsKKyAgICAgICAgICAgIC8qIEZpbmFsbHksIG1ha2UgdGhpcyB0aGUgbmV3IGhlYWQgb2YgdGhlIHRyZWxsaXMuICovCisgICAgICAgICAgICBuZXh0ID0gaTsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGVyZSdzIG5vIGNob2ljZSB0byBtYWtlIGZvciBhIHplcm8gY29lZmZpY2llbnQsIHNvIHdlIGRvbid0CisgICAgICAgICAqICBhZGQgYSBuZXcgdHJlbGxpcyBub2RlLCBidXQgd2UgZG8gbmVlZCB0byB1cGRhdGUgdGhlIGNvc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiYW5kID0gdnA4X2NvZWZfYmFuZHNbaSArIDFdOworICAgICAgICAgICAgdDAgPSB0b2tlbnNbbmV4dF1bMF0udG9rZW47CisgICAgICAgICAgICB0MSA9IHRva2Vuc1tuZXh0XVsxXS50b2tlbjsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgY29zdCBvZiBlYWNoIHBhdGggaWYgd2UncmUgcGFzdCB0aGUgRU9CIHRva2VuLiAqLworICAgICAgICAgICAgaWYgKHQwICE9IERDVF9FT0JfVE9LRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW5zW25leHRdWzBdLnJhdGUgKz0gbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdWzBdW3QwXTsKKyAgICAgICAgICAgICAgICB0b2tlbnNbbmV4dF1bMF0udG9rZW4gPSBaRVJPX1RPS0VOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQxICE9IERDVF9FT0JfVE9LRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW5zW25leHRdWzFdLnJhdGUgKz0gbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdWzBdW3QxXTsKKyAgICAgICAgICAgICAgICB0b2tlbnNbbmV4dF1bMV0udG9rZW4gPSBaRVJPX1RPS0VOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRG9uJ3QgdXBkYXRlIG5leHQsIGJlY2F1c2Ugd2UgZGlkbid0IGFkZCBhIG5ldyBub2RlLiAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm93IHBpY2sgdGhlIGJlc3QgcGF0aCB0aHJvdWdoIHRoZSB3aG9sZSB0cmVsbGlzLiAqLworICAgIGJhbmQgPSB2cDhfY29lZl9iYW5kc1tpICsgMV07CisgICAgVlA4X0NPTUJJTkVFTlRST1BZQ09OVEVYVFMocHQsICphLCAqbCk7CisgICAgcmF0ZTAgPSB0b2tlbnNbbmV4dF1bMF0ucmF0ZTsKKyAgICByYXRlMSA9IHRva2Vuc1tuZXh0XVsxXS5yYXRlOworICAgIGVycm9yMCA9IHRva2Vuc1tuZXh0XVswXS5lcnJvcjsKKyAgICBlcnJvcjEgPSB0b2tlbnNbbmV4dF1bMV0uZXJyb3I7CisgICAgdDAgPSB0b2tlbnNbbmV4dF1bMF0udG9rZW47CisgICAgdDEgPSB0b2tlbnNbbmV4dF1bMV0udG9rZW47CisgICAgcmF0ZTAgKz0gbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdW3B0XVt0MF07CisgICAgcmF0ZTEgKz0gbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdW3B0XVt0MV07CisgICAgcmRfY29zdDAgPSBSRENPU1QocmRtdWx0LCByZGRpdiwgcmF0ZTAsIGVycm9yMCk7CisgICAgcmRfY29zdDEgPSBSRENPU1QocmRtdWx0LCByZGRpdiwgcmF0ZTEsIGVycm9yMSk7CisgICAgaWYgKHJkX2Nvc3QwID09IHJkX2Nvc3QxKQorICAgIHsKKyAgICAgICAgcmRfY29zdDAgPSBSRFRSVU5DKHJkbXVsdCwgcmRkaXYsIHJhdGUwLCBlcnJvcjApOworICAgICAgICByZF9jb3N0MSA9IFJEVFJVTkMocmRtdWx0LCByZGRpdiwgcmF0ZTEsIGVycm9yMSk7CisgICAgfQorICAgIGJlc3QgPSByZF9jb3N0MSA8IHJkX2Nvc3QwOworICAgIGZpbmFsX2VvYiA9IGkwIC0gMTsKKyAgICBmb3IgKGkgPSBuZXh0OyBpIDwgZW9iOyBpID0gbmV4dCkKKyAgICB7CisgICAgICAgIHggPSB0b2tlbnNbaV1bYmVzdF0ucWM7CisgICAgICAgIGlmICh4KQorICAgICAgICAgICAgZmluYWxfZW9iID0gaTsKKyAgICAgICAgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisgICAgICAgIHFjb2VmZl9wdHJbcmNdID0geDsKKyAgICAgICAgZHFjb2VmZl9wdHJbcmNdID0geCAqIGRlcXVhbnRfcHRyW3JjXTsKKyAgICAgICAgbmV4dCA9IHRva2Vuc1tpXVtiZXN0XS5uZXh0OworICAgICAgICBiZXN0ID0gKGJlc3RfbWFza1tiZXN0XSA+PiBpKSAmIDE7CisgICAgfQorICAgIGZpbmFsX2VvYisrOworCisgICAgKmEgPSAqbCA9IChmaW5hbF9lb2IgIT0gIXR5cGUpOworICAgICpkLT5lb2IgPSAoY2hhcilmaW5hbF9lb2I7Cit9CitzdGF0aWMgdm9pZCBjaGVja19yZXNldF8ybmRfY29lZmZzKE1BQ1JPQkxPQ0tEICp4LCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUICphLCBFTlRST1BZX0NPTlRFWFQgKmwpCit7CisgICAgaW50IHN1bT0wOworICAgIGludCBpOworICAgIEJMT0NLRCAqYmQgPSAmeC0+YmxvY2tbMjRdOworCisgICAgaWYoYmQtPmRlcXVhbnRbMF0+PTM1ICYmIGJkLT5kZXF1YW50WzFdPj0zNSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yKGk9MDtpPCgqYmQtPmVvYik7aSsrKQorICAgIHsKKyAgICAgICAgaW50IGNvZWYgPSBiZC0+ZHFjb2VmZlt2cDhfZGVmYXVsdF96aWdfemFnMWRbaV1dOworICAgICAgICBzdW0rPSAoY29lZj49MCk/Y29lZjotY29lZjsKKyAgICAgICAgaWYoc3VtPj0zNSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgb3VyIGludmVyc2UgaGFkYW1hcmQgdHJhbnNmb3JtIGVmZmVjdGl2ZWx5IGlzIHdlaWdodGVkIHN1bSBvZiBhbGwgMTYgaW5wdXRzCisgICAgd2l0aCB3ZWlnaHQgZWl0aGVyIDEgb3IgLTEuIEl0IGhhcyBhIGxhc3Qgc3RhZ2Ugc2NhbGluZyBvZiAoc3VtKzMpPj4zLiBBbmQKKyAgICBkYyBvbmx5IGlkY3QgaXMgKGRjKzQpPj4zLiBTbyBpZiBhbGwgdGhlIHN1bXMgYXJlIGJldHdlZW4gLTM1IGFuZCAyOSwgdGhlCisgICAgb3V0cHV0IGFmdGVyIGludmVyc2Ugd2h0IGFuZCBpZGN0IHdpbGwgYmUgYWxsIHplcm8uIEEgc3VtIG9mIGFic29sdXRlIHZhbHVlCisgICAgc21hbGxlciB0aGFuIDM1IGd1YXJhbnRlZXMgYWxsIDE2IGRpZmZlcmVudCAoKzEvLTEpIHdlaWdodGVkIHN1bXMgaW4gd2h0CisgICAgZmFsbCBiZXR3ZWVuIC0zNSBhbmQgKzM1LgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKHN1bSA8IDM1KQorICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPCgqYmQtPmVvYik7aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisgICAgICAgICAgICBiZC0+cWNvZWZmW3JjXT0wOworICAgICAgICAgICAgYmQtPmRxY29lZmZbcmNdPTA7CisgICAgICAgIH0KKyAgICAgICAgKmJkLT5lb2IgPSAwOworICAgICAgICAqYSA9ICpsID0gKCpiZC0+ZW9iICE9ICF0eXBlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wdGltaXplX21iKE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGI7CisgICAgaW50IHR5cGU7CisgICAgaW50IGhhc18ybmRfb3JkZXI7CisKKyAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmUsIHRfbGVmdDsKKyAgICBFTlRST1BZX0NPTlRFWFQgKnRhOworICAgIEVOVFJPUFlfQ09OVEVYVCAqdGw7CisKKyAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlLCB4LT5lX21iZC5hYm92ZV9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgIHZweF9tZW1jcHkoJnRfbGVmdCwgeC0+ZV9tYmQubGVmdF9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworCisgICAgdGEgPSAoRU5UUk9QWV9DT05URVhUICopJnRfYWJvdmU7CisgICAgdGwgPSAoRU5UUk9QWV9DT05URVhUICopJnRfbGVmdDsKKworICAgIGhhc18ybmRfb3JkZXIgPSAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQKKyAgICAgICAgJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKTsKKyAgICB0eXBlID0gaGFzXzJuZF9vcmRlciA/IFBMQU5FX1RZUEVfWV9OT19EQyA6IFBMQU5FX1RZUEVfWV9XSVRIX0RDOworCisgICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCisgICAgeworICAgICAgICBvcHRpbWl6ZV9iKHgsIGIsIHR5cGUsCisgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtiXSwgdGwgKyB2cDhfYmxvY2sybGVmdFtiXSk7CisgICAgfQorCisgICAgZm9yIChiID0gMTY7IGIgPCAyNDsgYisrKQorICAgIHsKKyAgICAgICAgb3B0aW1pemVfYih4LCBiLCBQTEFORV9UWVBFX1VWLAorICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0pOworICAgIH0KKworICAgIGlmIChoYXNfMm5kX29yZGVyKQorICAgIHsKKyAgICAgICAgYj0yNDsKKyAgICAgICAgb3B0aW1pemVfYih4LCBiLCBQTEFORV9UWVBFX1kyLAorICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0pOworICAgICAgICBjaGVja19yZXNldF8ybmRfY29lZmZzKCZ4LT5lX21iZCwgUExBTkVfVFlQRV9ZMiwKKyAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdKTsKKyAgICB9Cit9CisKKwordm9pZCB2cDhfb3B0aW1pemVfbWJ5KE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGI7CisgICAgaW50IHR5cGU7CisgICAgaW50IGhhc18ybmRfb3JkZXI7CisKKyAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmUsIHRfbGVmdDsKKyAgICBFTlRST1BZX0NPTlRFWFQgKnRhOworICAgIEVOVFJPUFlfQ09OVEVYVCAqdGw7CisKKyAgICBpZiAoIXgtPmVfbWJkLmFib3ZlX2NvbnRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICgheC0+ZV9tYmQubGVmdF9jb250ZXh0KQorICAgICAgICByZXR1cm47CisKKyAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlLCB4LT5lX21iZC5hYm92ZV9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgIHZweF9tZW1jcHkoJnRfbGVmdCwgeC0+ZV9tYmQubGVmdF9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworCisgICAgdGEgPSAoRU5UUk9QWV9DT05URVhUICopJnRfYWJvdmU7CisgICAgdGwgPSAoRU5UUk9QWV9DT05URVhUICopJnRfbGVmdDsKKworICAgIGhhc18ybmRfb3JkZXIgPSAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQKKyAgICAgICAgJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKTsKKyAgICB0eXBlID0gaGFzXzJuZF9vcmRlciA/IFBMQU5FX1RZUEVfWV9OT19EQyA6IFBMQU5FX1RZUEVfWV9XSVRIX0RDOworCisgICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCisgICAgeworICAgICAgICBvcHRpbWl6ZV9iKHgsIGIsIHR5cGUsCisgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtiXSwgdGwgKyB2cDhfYmxvY2sybGVmdFtiXSk7CisgICAgfQorCisKKyAgICBpZiAoaGFzXzJuZF9vcmRlcikKKyAgICB7CisgICAgICAgIGI9MjQ7CisgICAgICAgIG9wdGltaXplX2IoeCwgYiwgUExBTkVfVFlQRV9ZMiwKKyAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdKTsKKyAgICAgICAgY2hlY2tfcmVzZXRfMm5kX2NvZWZmcygmeC0+ZV9tYmQsIFBMQU5FX1RZUEVfWTIsCisgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtiXSwgdGwgKyB2cDhfYmxvY2sybGVmdFtiXSk7CisgICAgfQorfQorCit2b2lkIHZwOF9vcHRpbWl6ZV9tYnV2KE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGI7CisgICAgRU5UUk9QWV9DT05URVhUX1BMQU5FUyB0X2Fib3ZlLCB0X2xlZnQ7CisgICAgRU5UUk9QWV9DT05URVhUICp0YTsKKyAgICBFTlRST1BZX0NPTlRFWFQgKnRsOworCisgICAgaWYgKCF4LT5lX21iZC5hYm92ZV9jb250ZXh0KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXgtPmVfbWJkLmxlZnRfY29udGV4dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdnB4X21lbWNweSgmdF9hYm92ZSwgeC0+ZV9tYmQuYWJvdmVfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKyAgICB2cHhfbWVtY3B5KCZ0X2xlZnQsIHgtPmVfbWJkLmxlZnRfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKworICAgIHRhID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2Fib3ZlOworICAgIHRsID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnQ7CisKKyAgICBmb3IgKGIgPSAxNjsgYiA8IDI0OyBiKyspCisgICAgeworICAgICAgICBvcHRpbWl6ZV9iKHgsIGIsIFBMQU5FX1RZUEVfVVYsCisgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtiXSwgdGwgKyB2cDhfYmxvY2sybGVmdFtiXSk7CisgICAgfQorfQorCit2b2lkIHZwOF9lbmNvZGVfaW50ZXIxNngxNihNQUNST0JMT0NLICp4KQoreworICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iKCZ4LT5lX21iZCk7CisKKyAgICB2cDhfc3VidHJhY3RfbWIoeCk7CisKKyAgICB0cmFuc2Zvcm1fbWIoeCk7CisKKyAgICB2cDhfcXVhbnRpemVfbWIoeCk7CisKKyAgICBpZiAoeC0+b3B0aW1pemUpCisgICAgICAgIG9wdGltaXplX21iKHgpOworfQorCisvKiB0aGlzIGZ1bmNpdG9uIGlzIHVzZWQgYnkgZmlyc3QgcGFzcyBvbmx5ICovCit2b2lkIHZwOF9lbmNvZGVfaW50ZXIxNngxNnkoTUFDUk9CTE9DSyAqeCkKK3sKKyAgICBCTE9DSyAqYiA9ICZ4LT5ibG9ja1swXTsKKworICAgIHZwOF9idWlsZF9pbnRlcjE2eDE2X3ByZWRpY3RvcnNfbWJ5KCZ4LT5lX21iZCwgeC0+ZV9tYmQuZHN0LnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmVfbWJkLmRzdC55X3N0cmlkZSk7CisKKyAgICB2cDhfc3VidHJhY3RfbWJ5KHgtPnNyY19kaWZmLCAqKGItPmJhc2Vfc3JjKSwKKyAgICAgICAgYi0+c3JjX3N0cmlkZSwgeC0+ZV9tYmQuZHN0LnlfYnVmZmVyLCB4LT5lX21iZC5kc3QueV9zdHJpZGUpOworCisgICAgdHJhbnNmb3JtX21ieSh4KTsKKworICAgIHZwOF9xdWFudGl6ZV9tYnkoeCk7CisKKyAgICB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fbWJ5KCZ4LT5lX21iZCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlbWIuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWRmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvZW5jb2RlbWIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19FTkNPREVNQl9ICisjZGVmaW5lIF9fSU5DX0VOQ09ERU1CX0gKKworI2luY2x1ZGUgIm9ueXhfaW50LmgiCit2b2lkIHZwOF9lbmNvZGVfaW50ZXIxNngxNihNQUNST0JMT0NLICp4KTsKKwordm9pZCB2cDhfYnVpbGRfZGNibG9jayhNQUNST0JMT0NLICpiKTsKK3ZvaWQgdnA4X3RyYW5zZm9ybV9tYihNQUNST0JMT0NLICptYik7Cit2b2lkIHZwOF90cmFuc2Zvcm1fbWJ1dihNQUNST0JMT0NLICp4KTsKK3ZvaWQgdnA4X3RyYW5zZm9ybV9pbnRyYV9tYnkoTUFDUk9CTE9DSyAqeCk7CisKK3ZvaWQgdnA4X29wdGltaXplX21ieShNQUNST0JMT0NLICp4KTsKK3ZvaWQgdnA4X29wdGltaXplX21idXYoTUFDUk9CTE9DSyAqeCk7Cit2b2lkIHZwOF9lbmNvZGVfaW50ZXIxNngxNnkoTUFDUk9CTE9DSyAqeCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtdi5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZW12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0M2QwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtdi5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZwOC9jb21tb24vY29tbW9uLmgiCisjaW5jbHVkZSAiZW5jb2RlbXYuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKK2V4dGVybiB1bnNpZ25lZCBpbnQgYWN0aXZlX3NlY3Rpb247CisjZW5kaWYKKworc3RhdGljIHZvaWQgZW5jb2RlX212Y29tcG9uZW50KAorICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCisgICAgY29uc3QgaW50IHYsCisgICAgY29uc3Qgc3RydWN0IG12X2NvbnRleHQgKm12YworKQoreworICAgIGNvbnN0IHZwOF9wcm9iICpwID0gbXZjLT5wcm9iOworICAgIGNvbnN0IGludCB4ID0gdiA8IDAgPyAtdiA6IHY7CisKKyAgICBpZiAoeCA8IG12bnVtX3Nob3J0KSAgICAgLyogU21hbGwgKi8KKyAgICB7CisgICAgICAgIHZwOF93cml0ZSh3LCAwLCBwIFttdnBpc19zaG9ydF0pOworICAgICAgICB2cDhfdHJlZWRfd3JpdGUodywgdnA4X3NtYWxsX212dHJlZSwgcCArIE1WUHNob3J0LCB4LCAzKTsKKworICAgICAgICBpZiAoIXgpCisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgLyogbm8gc2lnbiBiaXQgKi8KKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogTGFyZ2UgKi8KKyAgICB7CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICB2cDhfd3JpdGUodywgMSwgcCBbbXZwaXNfc2hvcnRdKTsKKworICAgICAgICBkbworICAgICAgICAgICAgdnA4X3dyaXRlKHcsICh4ID4+IGkpICYgMSwgcCBbTVZQYml0cyArIGldKTsKKworICAgICAgICB3aGlsZSAoKytpIDwgMyk7CisKKyAgICAgICAgaSA9IG12bG9uZ193aWR0aCAtIDE7ICAvKiBTa2lwIGJpdCAzLCB3aGljaCBpcyBzb21ldGltZXMgaW1wbGljaXQgKi8KKworICAgICAgICBkbworICAgICAgICAgICAgdnA4X3dyaXRlKHcsICh4ID4+IGkpICYgMSwgcCBbTVZQYml0cyArIGldKTsKKworICAgICAgICB3aGlsZSAoLS1pID4gMyk7CisKKyAgICAgICAgaWYgKHggJiAweEZGRjApCisgICAgICAgICAgICB2cDhfd3JpdGUodywgKHggPj4gMykgJiAxLCBwIFtNVlBiaXRzICsgM10pOworICAgIH0KKworICAgIHZwOF93cml0ZSh3LCB2IDwgMCwgcCBbTVZQc2lnbl0pOworfQorI2lmIDAKK3N0YXRpYyBpbnQgbWF4X212X3IgPSAwOworc3RhdGljIGludCBtYXhfbXZfYyA9IDA7CisjZW5kaWYKK3ZvaWQgdnA4X2VuY29kZV9tb3Rpb25fdmVjdG9yKHZwOF93cml0ZXIgKncsIGNvbnN0IE1WICptdiwgY29uc3QgTVZfQ09OVEVYVCAqbXZjKQoreworCisjaWYgMAorICAgIHsKKyAgICAgICAgaWYgKGFicyhtdi0+cm93ID4+IDEpID4gbWF4X212X3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigibWF4bXYuc3R0IiwgImEiKTsKKyAgICAgICAgICAgIG1heF9tdl9yID0gYWJzKG12LT5yb3cgPj4gMSk7CisgICAgICAgICAgICBmcHJpbnRmKGYsICJOZXcgTXYgUm93IE1heCAlNmRcbiIsIChtdi0+cm93ID4+IDEpKTsKKworICAgICAgICAgICAgaWYgKChhYnMobXYtPnJvdykgLyAyKSAhPSBtYXhfbXZfcikKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJNViBSb3cgY29udmVyc2lvbiBlcnJvciAlNmRcbiIsIGFicyhtdi0+cm93KSAvIDIpOworCisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWJzKG12LT5jb2wgPj4gMSkgPiBtYXhfbXZfYykKKyAgICAgICAgeworICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJtYXhtdi5zdHQiLCAiYSIpOworICAgICAgICAgICAgZnByaW50ZihmLCAiTmV3IE12IENvbCBNYXggJTZkXG4iLCAobXYtPmNvbCA+PiAxKSk7CisgICAgICAgICAgICBtYXhfbXZfYyA9IGFicyhtdi0+Y29sID4+IDEpOworICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBlbmNvZGVfbXZjb21wb25lbnQodywgbXYtPnJvdyA+PiAxLCAmbXZjWzBdKTsKKyAgICBlbmNvZGVfbXZjb21wb25lbnQodywgbXYtPmNvbCA+PiAxLCAmbXZjWzFdKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNvc3RfbXZjb21wb25lbnQoY29uc3QgaW50IHYsIGNvbnN0IHN0cnVjdCBtdl9jb250ZXh0ICptdmMpCit7CisgICAgY29uc3QgdnA4X3Byb2IgKnAgPSBtdmMtPnByb2I7CisgICAgY29uc3QgaW50IHggPSB2OworICAgIHVuc2lnbmVkIGludCBjb3N0OworCisgICAgaWYgKHggPCBtdm51bV9zaG9ydCkKKyAgICB7CisgICAgICAgIGNvc3QgPSB2cDhfY29zdF96ZXJvKHAgW212cGlzX3Nob3J0XSkKKyAgICAgICAgICAgICAgICsgdnA4X3RyZWVkX2Nvc3QodnA4X3NtYWxsX212dHJlZSwgcCArIE1WUHNob3J0LCB4LCAzKTsKKworICAgICAgICBpZiAoIXgpCisgICAgICAgICAgICByZXR1cm4gY29zdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBjb3N0ID0gdnA4X2Nvc3Rfb25lKHAgW212cGlzX3Nob3J0XSk7CisKKyAgICAgICAgZG8KKyAgICAgICAgICAgIGNvc3QgKz0gdnA4X2Nvc3RfYml0KHAgW01WUGJpdHMgKyBpXSwgKHggPj4gaSkgJiAxKTsKKworICAgICAgICB3aGlsZSAoKytpIDwgMyk7CisKKyAgICAgICAgaSA9IG12bG9uZ193aWR0aCAtIDE7ICAvKiBTa2lwIGJpdCAzLCB3aGljaCBpcyBzb21ldGltZXMgaW1wbGljaXQgKi8KKworICAgICAgICBkbworICAgICAgICAgICAgY29zdCArPSB2cDhfY29zdF9iaXQocCBbTVZQYml0cyArIGldLCAoeCA+PiBpKSAmIDEpOworCisgICAgICAgIHdoaWxlICgtLWkgPiAzKTsKKworICAgICAgICBpZiAoeCAmIDB4RkZGMCkKKyAgICAgICAgICAgIGNvc3QgKz0gdnA4X2Nvc3RfYml0KHAgW01WUGJpdHMgKyAzXSwgKHggPj4gMykgJiAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29zdDsgICAvKiArIHZwOF9jb3N0X2JpdCggcCBbTVZQc2lnbl0sIHYgPCAwKTsgKi8KK30KKwordm9pZCB2cDhfYnVpbGRfY29tcG9uZW50X2Nvc3RfdGFibGUoaW50ICptdmNvc3RbMl0sIGNvbnN0IE1WX0NPTlRFWFQgKm12YywgaW50IG12Y19mbGFnWzJdKQoreworICAgIGludCBpID0gMTsKKyAgICB1bnNpZ25lZCBpbnQgY29zdDAgPSAwOworICAgIHVuc2lnbmVkIGludCBjb3N0MSA9IDA7CisKKyAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKyAgICBpID0gMTsKKworICAgIGlmIChtdmNfZmxhZ1swXSkKKyAgICB7CisgICAgICAgIG12Y29zdCBbMF0gWzBdID0gY29zdF9tdmNvbXBvbmVudCgwLCAmbXZjWzBdKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjb3N0MCA9IGNvc3RfbXZjb21wb25lbnQoaSwgJm12Y1swXSk7CisKKyAgICAgICAgICAgIG12Y29zdCBbMF0gW2ldID0gY29zdDAgKyB2cDhfY29zdF96ZXJvKG12Y1swXS5wcm9iW01WUHNpZ25dKTsKKyAgICAgICAgICAgIG12Y29zdCBbMF0gWy1pXSA9IGNvc3QwICsgdnA4X2Nvc3Rfb25lKG12Y1swXS5wcm9iW01WUHNpZ25dKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKytpIDw9IG12X21heCk7CisgICAgfQorCisgICAgaSA9IDE7CisKKyAgICBpZiAobXZjX2ZsYWdbMV0pCisgICAgeworICAgICAgICBtdmNvc3QgWzFdIFswXSA9IGNvc3RfbXZjb21wb25lbnQoMCwgJm12Y1sxXSk7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY29zdDEgPSBjb3N0X212Y29tcG9uZW50KGksICZtdmNbMV0pOworCisgICAgICAgICAgICBtdmNvc3QgWzFdIFtpXSA9IGNvc3QxICsgdnA4X2Nvc3RfemVybyhtdmNbMV0ucHJvYltNVlBzaWduXSk7CisgICAgICAgICAgICBtdmNvc3QgWzFdIFstaV0gPSBjb3N0MSArIHZwOF9jb3N0X29uZShtdmNbMV0ucHJvYltNVlBzaWduXSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCsraSA8PSBtdl9tYXgpOworICAgIH0KK30KKworCisvKiBNb3Rpb24gdmVjdG9yIHByb2JhYmlsaXR5IHRhYmxlIHVwZGF0ZSBkZXBlbmRzIG9uIGJlbmVmaXQuCisgKiBTbWFsbCBjb3JyZWN0aW9uIGFsbG93cyBmb3IgdGhlIGZhY3QgdGhhdCBhbiB1cGRhdGUgdG8gYW4gTVYgcHJvYmFiaWxpdHkKKyAqIG1heSBoYXZlIGJlbmVmaXQgaW4gc3Vic2VxdWVudCBmcmFtZXMgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBvbmUuCisgKi8KKyNkZWZpbmUgTVZfUFJPQl9VUERBVEVfQ09SUkVDVElPTiAgIC0xCisKKworc3RhdGljIHZvaWQgY2FsY19wcm9iKHZwOF9wcm9iICpwLCBjb25zdCB1bnNpZ25lZCBpbnQgY3RbMl0pCit7CisgICAgY29uc3QgdW5zaWduZWQgaW50IHRvdCA9IGN0WzBdICsgY3RbMV07CisKKyAgICBpZiAodG90KQorICAgIHsKKyAgICAgICAgY29uc3QgdnA4X3Byb2IgeCA9ICgoY3RbMF0gKiAyNTUpIC8gdG90KSAmIC0yOworICAgICAgICAqcCA9IHggPyB4IDogMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZSgKKyAgICB2cDhfd3JpdGVyICpjb25zdCB3LAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjdFsyXSwKKyAgICB2cDhfcHJvYiAqY29uc3QgY3VyX3AsCisgICAgY29uc3QgdnA4X3Byb2IgbmV3X3AsCisgICAgY29uc3QgdnA4X3Byb2IgdXBkYXRlX3AsCisgICAgaW50ICp1cGRhdGVkCispCit7CisgICAgY29uc3QgaW50IGN1cl9iID0gdnA4X2Nvc3RfYnJhbmNoKGN0LCAqY3VyX3ApOworICAgIGNvbnN0IGludCBuZXdfYiA9IHZwOF9jb3N0X2JyYW5jaChjdCwgbmV3X3ApOworICAgIGNvbnN0IGludCBjb3N0ID0gNyArIE1WX1BST0JfVVBEQVRFX0NPUlJFQ1RJT04gKyAoKHZwOF9jb3N0X29uZSh1cGRhdGVfcCkgLSB2cDhfY29zdF96ZXJvKHVwZGF0ZV9wKSArIDEyOCkgPj4gOCk7CisKKyAgICBpZiAoY3VyX2IgLSBuZXdfYiA+IGNvc3QpCisgICAgeworICAgICAgICAqY3VyX3AgPSBuZXdfcDsKKyAgICAgICAgdnA4X3dyaXRlKHcsIDEsIHVwZGF0ZV9wKTsKKyAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwodywgbmV3X3AgPj4gMSwgNyk7CisgICAgICAgICp1cGRhdGVkID0gMTsKKworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHZwOF93cml0ZSh3LCAwLCB1cGRhdGVfcCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2NvbXBvbmVudF9wcm9icygKKyAgICB2cDhfd3JpdGVyICpjb25zdCB3LAorICAgIHN0cnVjdCBtdl9jb250ZXh0ICpjdXJfbXZjLAorICAgIGNvbnN0IHN0cnVjdCBtdl9jb250ZXh0ICpkZWZhdWx0X212Y18sCisgICAgY29uc3Qgc3RydWN0IG12X2NvbnRleHQgKnVwZGF0ZV9tdmMsCisgICAgY29uc3QgdW5zaWduZWQgaW50IGV2ZW50cyBbTVZ2YWxzXSwKKyAgICB1bnNpZ25lZCBpbnQgcmMsCisgICAgaW50ICp1cGRhdGVkCispCit7CisgICAgdnA4X3Byb2IgKlBjdXIgPSBjdXJfbXZjLT5wcm9iOworICAgIGNvbnN0IHZwOF9wcm9iICpkZWZhdWx0X212YyA9IGRlZmF1bHRfbXZjXy0+cHJvYjsKKyAgICBjb25zdCB2cDhfcHJvYiAqUHVwZGF0ZSA9IHVwZGF0ZV9tdmMtPnByb2I7CisgICAgdW5zaWduZWQgaW50IGlzX3Nob3J0X2N0WzJdLCBzaWduX2N0WzJdOworCisgICAgdW5zaWduZWQgaW50IGJpdF9jdCBbbXZsb25nX3dpZHRoXSBbMl07CisKKyAgICB1bnNpZ25lZCBpbnQgc2hvcnRfY3QgIFttdm51bV9zaG9ydF07CisgICAgdW5zaWduZWQgaW50IHNob3J0X2JjdCBbbXZudW1fc2hvcnQtMV0gWzJdOworCisgICAgdnA4X3Byb2IgUG5ldyBbTVZQY291bnRdOworCisgICAgKHZvaWQpIHJjOworICAgIHZwOF9jb3B5X2FycmF5KFBuZXcsIGRlZmF1bHRfbXZjLCBNVlBjb3VudCk7CisKKyAgICB2cDhfemVybyhpc19zaG9ydF9jdCkKKyAgICB2cDhfemVybyhzaWduX2N0KQorICAgIHZwOF96ZXJvKGJpdF9jdCkKKyAgICB2cDhfemVybyhzaG9ydF9jdCkKKyAgICB2cDhfemVybyhzaG9ydF9iY3QpCisKKworICAgIC8qIGo9MCAqLworICAgIHsKKyAgICAgICAgY29uc3QgaW50IGMgPSBldmVudHMgW212X21heF07CisKKyAgICAgICAgaXNfc2hvcnRfY3QgWzBdICs9IGM7ICAgICAvKiBTaG9ydCB2ZWN0b3IgKi8KKyAgICAgICAgc2hvcnRfY3QgWzBdICs9IGM7ICAgICAgIC8qIE1hZ25pdHVkZSBkaXN0cmlidXRpb24gKi8KKyAgICB9CisKKyAgICAvKiBqOiAxIH4gbXZfbWF4ICgxMDIzKSAqLworICAgIHsKKyAgICAgICAgaW50IGogPSAxOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGV2ZW50cyBbbXZfbWF4ICsgal07ICAvKiBwb3NpdGl2ZSAqLworICAgICAgICAgICAgY29uc3QgaW50IGMyID0gZXZlbnRzIFttdl9tYXggLSBqXTsgIC8qIG5lZ2F0aXZlICovCisgICAgICAgICAgICBjb25zdCBpbnQgYyAgPSBjMSArIGMyOworICAgICAgICAgICAgaW50IGEgPSBqOworCisgICAgICAgICAgICBzaWduX2N0IFswXSArPSBjMTsKKyAgICAgICAgICAgIHNpZ25fY3QgWzFdICs9IGMyOworCisgICAgICAgICAgICBpZiAoYSA8IG12bnVtX3Nob3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzX3Nob3J0X2N0IFswXSArPSBjOyAgICAgLyogU2hvcnQgdmVjdG9yICovCisgICAgICAgICAgICAgICAgc2hvcnRfY3QgW2FdICs9IGM7ICAgICAgIC8qIE1hZ25pdHVkZSBkaXN0cmlidXRpb24gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgayA9IG12bG9uZ193aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgaXNfc2hvcnRfY3QgWzFdICs9IGM7ICAgICAvKiBMb25nIHZlY3RvciAqLworCisgICAgICAgICAgICAgICAgLyogIGJpdCAzIG5vdCBhbHdheXMgZW5jb2RlZC4gKi8KKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICBiaXRfY3QgW2tdIFsoYSA+PiBrKSAmIDFdICs9IGM7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1rID49IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2ogPD0gbXZfbWF4KTsKKyAgICB9CisKKyAgICBjYWxjX3Byb2IoUG5ldyArIG12cGlzX3Nob3J0LCBpc19zaG9ydF9jdCk7CisKKyAgICBjYWxjX3Byb2IoUG5ldyArIE1WUHNpZ24sIHNpZ25fY3QpOworCisgICAgeworICAgICAgICB2cDhfcHJvYiBwIFttdm51bV9zaG9ydCAtIDFdOyAgICAvKiBhY3R1YWxseSBvbmx5IG5lZWQgYnJhbmNoIGN0ICovCisgICAgICAgIGludCBqID0gMDsKKworICAgICAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgIDgsIHZwOF9zbWFsbF9tdmVuY29kaW5ncywgdnA4X3NtYWxsX212dHJlZSwKKyAgICAgICAgICAgIHAsIHNob3J0X2JjdCwgc2hvcnRfY3QsCisgICAgICAgICAgICAyNTYsIDEKKyAgICAgICAgKTsKKworICAgICAgICBkbworICAgICAgICAgICAgY2FsY19wcm9iKFBuZXcgKyBNVlBzaG9ydCArIGosIHNob3J0X2JjdFtqXSk7CisKKyAgICAgICAgd2hpbGUgKCsraiA8IG12bnVtX3Nob3J0IC0gMSk7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgaiA9IDA7CisKKyAgICAgICAgZG8KKyAgICAgICAgICAgIGNhbGNfcHJvYihQbmV3ICsgTVZQYml0cyArIGosIGJpdF9jdFtqXSk7CisKKyAgICAgICAgd2hpbGUgKCsraiA8IG12bG9uZ193aWR0aCk7CisgICAgfQorCisgICAgdXBkYXRlKHcsIGlzX3Nob3J0X2N0LCBQY3VyICsgbXZwaXNfc2hvcnQsIFBuZXdbbXZwaXNfc2hvcnRdLCAqUHVwZGF0ZSsrLCB1cGRhdGVkKTsKKworICAgIHVwZGF0ZSh3LCBzaWduX2N0LCBQY3VyICsgTVZQc2lnbiwgUG5ld1tNVlBzaWduXSwgKlB1cGRhdGUrKywgdXBkYXRlZCk7CisKKyAgICB7CisgICAgICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBuZXdfcCA9IFBuZXcgKyBNVlBzaG9ydDsKKyAgICAgICAgdnA4X3Byb2IgKmNvbnN0IGN1cl9wID0gUGN1ciArIE1WUHNob3J0OworCisgICAgICAgIGludCBqID0gMDsKKworICAgICAgICBkbworCisgICAgICAgICAgICB1cGRhdGUodywgc2hvcnRfYmN0W2pdLCBjdXJfcCArIGosIG5ld19wW2pdLCAqUHVwZGF0ZSsrLCB1cGRhdGVkKTsKKworICAgICAgICB3aGlsZSAoKytqIDwgbXZudW1fc2hvcnQgLSAxKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBuZXdfcCA9IFBuZXcgKyBNVlBiaXRzOworICAgICAgICB2cDhfcHJvYiAqY29uc3QgY3VyX3AgPSBQY3VyICsgTVZQYml0czsKKworICAgICAgICBpbnQgaiA9IDA7CisKKyAgICAgICAgZG8KKworICAgICAgICAgICAgdXBkYXRlKHcsIGJpdF9jdFtqXSwgY3VyX3AgKyBqLCBuZXdfcFtqXSwgKlB1cGRhdGUrKywgdXBkYXRlZCk7CisKKyAgICAgICAgd2hpbGUgKCsraiA8IG12bG9uZ193aWR0aCk7CisgICAgfQorfQorCit2b2lkIHZwOF93cml0ZV9tdnByb2JzKFZQOF9DT01QICpjcGkpCit7CisgICAgdnA4X3dyaXRlciAqY29uc3QgdyAgPSBjcGktPmJjOworICAgIE1WX0NPTlRFWFQgKm12YyA9IGNwaS0+Y29tbW9uLmZjLm12YzsKKyAgICBpbnQgZmxhZ3NbMl0gPSB7MCwgMH07CisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgIGFjdGl2ZV9zZWN0aW9uID0gNDsKKyNlbmRpZgorICAgIHdyaXRlX2NvbXBvbmVudF9wcm9icygKKyAgICAgICAgdywgJm12Y1swXSwgJnZwOF9kZWZhdWx0X212X2NvbnRleHRbMF0sICZ2cDhfbXZfdXBkYXRlX3Byb2JzWzBdLAorICAgICAgICBjcGktPm1iLk1WY291bnRbMF0sIDAsICZmbGFnc1swXQorICAgICk7CisgICAgd3JpdGVfY29tcG9uZW50X3Byb2JzKAorICAgICAgICB3LCAmbXZjWzFdLCAmdnA4X2RlZmF1bHRfbXZfY29udGV4dFsxXSwgJnZwOF9tdl91cGRhdGVfcHJvYnNbMV0sCisgICAgICAgIGNwaS0+bWIuTVZjb3VudFsxXSwgMSwgJmZsYWdzWzFdCisgICAgKTsKKworICAgIGlmIChmbGFnc1swXSB8fCBmbGFnc1sxXSkKKyAgICAgICAgdnA4X2J1aWxkX2NvbXBvbmVudF9jb3N0X3RhYmxlKGNwaS0+bWIubXZjb3N0LCAoY29uc3QgTVZfQ09OVEVYVCAqKSBjcGktPmNvbW1vbi5mYy5tdmMsIGZsYWdzKTsKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKyAgICBhY3RpdmVfc2VjdGlvbiA9IDU7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtdi5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2VuY29kZW12LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxMTZjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9lbmNvZGVtdi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fSU5DX0VOQ09ERU1WX0gKKyNkZWZpbmUgX19JTkNfRU5DT0RFTVZfSAorCisjaW5jbHVkZSAib255eF9pbnQuaCIKKwordm9pZCB2cDhfd3JpdGVfbXZwcm9icyhWUDhfQ09NUCAqKTsKK3ZvaWQgdnA4X2VuY29kZV9tb3Rpb25fdmVjdG9yKHZwOF93cml0ZXIgKiwgY29uc3QgTVYgKiwgY29uc3QgTVZfQ09OVEVYVCAqKTsKK3ZvaWQgdnA4X2J1aWxkX2NvbXBvbmVudF9jb3N0X3RhYmxlKGludCAqbXZjb3N0WzJdLCBjb25zdCBNVl9DT05URVhUICptdmMsIGludCBtdmNfZmxhZ1syXSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2V0aHJlYWRpbmcuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9ldGhyZWFkaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzNDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9ldGhyZWFkaW5nLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2NvbW1vbi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiZW5jb2RlZnJhbWUuaCIKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorCitleHRlcm4gdm9pZCB2cDhjeF9tYl9pbml0X3F1YW50aXplcihWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LCBpbnQgb2tfdG9fc2tpcCk7CisKK2V4dGVybiB2b2lkIHZwOF9sb29wZmlsdGVyX2ZyYW1lKFZQOF9DT01QICpjcGksIFZQOF9DT01NT04gKmNtKTsKKworc3RhdGljIFRIUkVBRF9GVU5DVElPTiB0aHJlYWRfbG9vcGZpbHRlcih2b2lkICpwX2RhdGEpCit7CisgICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKSgoKExQRlRIUkVBRF9EQVRBICopcF9kYXRhKS0+cHRyMSk7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2xwZikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCA9PSAwKSAvKiB3ZSdyZSBzaHV0dGluZyBkb3duICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHZwOF9sb29wZmlsdGVyX2ZyYW1lKGNwaSwgY20pOworCisgICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYworVEhSRUFEX0ZVTkNUSU9OIHRocmVhZF9lbmNvZGluZ19wcm9jKHZvaWQgKnBfZGF0YSkKK3sKKyAgICBpbnQgaXRocmVhZCA9ICgoRU5DT0RFVEhSRUFEX0RBVEEgKilwX2RhdGEpLT5pdGhyZWFkOworICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikoKChFTkNPREVUSFJFQURfREFUQSAqKXBfZGF0YSktPnB0cjEpOworICAgIE1CX1JPV19DT01QICptYnJpID0gKE1CX1JPV19DT01QICopKCgoRU5DT0RFVEhSRUFEX0RBVEEgKilwX2RhdGEpLT5wdHIyKTsKKyAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIG1iX3Jvd19sZWZ0X2NvbnRleHQ7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2l0aHJlYWRdKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgbnN5bmMgPSBjcGktPm10X3N5bmNfcmFuZ2U7CisgICAgICAgICAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKyAgICAgICAgICAgIGludCBtYl9yb3c7CisgICAgICAgICAgICBNQUNST0JMT0NLICp4ID0gJm1icmktPm1iOworICAgICAgICAgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOworICAgICAgICAgICAgVE9LRU5FWFRSQSAqdHAgOworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcKKyAgICAgICAgICAgIFRPS0VORVhUUkEgKnRwX3N0YXJ0ID0gY3BpLT50b2sgKyAoMSArIGl0aHJlYWQpICogKDE2ICogMjQpOworICAgICAgICAgICAgY29uc3QgaW50IG51bV9wYXJ0ID0gKDEgPDwgY20tPm11bHRpX3Rva2VuX3BhcnRpdGlvbik7CisjZW5kaWYKKworICAgICAgICAgICAgaW50ICpzZWdtZW50X2NvdW50cyA9IG1icmktPnNlZ21lbnRfY291bnRzOworICAgICAgICAgICAgaW50ICp0b3RhbHJhdGUgPSAmbWJyaS0+dG90YWxyYXRlOworCisgICAgICAgICAgICBpZiAoY3BpLT5iX211bHRpX3RocmVhZGVkID09IDApIC8qIHdlJ3JlIHNodXR0aW5nIGRvd24gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZm9yIChtYl9yb3cgPSBpdGhyZWFkICsgMTsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdyArPSAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGludCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldDsKKyAgICAgICAgICAgICAgICBpbnQgbWJfY29sOworICAgICAgICAgICAgICAgIGludCByZWZfZmJfaWR4ID0gY20tPmxzdF9mYl9pZHg7CisgICAgICAgICAgICAgICAgaW50IGRzdF9mYl9pZHggPSBjbS0+bmV3X2ZiX2lkeDsKKyAgICAgICAgICAgICAgICBpbnQgcmVjb25feV9zdHJpZGUgPSBjbS0+eXYxMl9mYltyZWZfZmJfaWR4XS55X3N0cmlkZTsKKyAgICAgICAgICAgICAgICBpbnQgcmVjb25fdXZfc3RyaWRlID0gY20tPnl2MTJfZmJbcmVmX2ZiX2lkeF0udXZfc3RyaWRlOworICAgICAgICAgICAgICAgIGludCBtYXBfaW5kZXggPSAobWJfcm93ICogY20tPm1iX2NvbHMpOworICAgICAgICAgICAgICAgIHZvbGF0aWxlIGNvbnN0IGludCAqbGFzdF9yb3dfY3VycmVudF9tYl9jb2w7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50ICpjdXJyZW50X21iX2NvbCA9ICZjcGktPm10X2N1cnJlbnRfbWJfY29sW21iX3Jvd107CisKKyNpZiAgKENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcpCisgICAgICAgICAgICAgICAgdnA4X3dyaXRlciAqdyA9ICZjcGktPmJjWzEgKyAobWJfcm93ICUgbnVtX3BhcnQpXTsKKyNlbHNlCisgICAgICAgICAgICAgICAgdHAgPSBjcGktPnRvayArIChtYl9yb3cgKiAoY20tPm1iX2NvbHMgKiAxNiAqIDI0KSk7CisgICAgICAgICAgICAgICAgY3BpLT50cGxpc3RbbWJfcm93XS5zdGFydCA9IHRwOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBsYXN0X3Jvd19jdXJyZW50X21iX2NvbCA9ICZjcGktPm10X2N1cnJlbnRfbWJfY29sW21iX3JvdyAtIDFdOworCisgICAgICAgICAgICAgICAgLyogcmVzZXQgYWJvdmUgYmxvY2sgY29lZmZzICovCisgICAgICAgICAgICAgICAgeGQtPmFib3ZlX2NvbnRleHQgPSBjbS0+YWJvdmVfY29udGV4dDsKKyAgICAgICAgICAgICAgICB4ZC0+bGVmdF9jb250ZXh0ID0gJm1iX3Jvd19sZWZ0X2NvbnRleHQ7CisKKyAgICAgICAgICAgICAgICB2cDhfemVybyhtYl9yb3dfbGVmdF9jb250ZXh0KTsKKworICAgICAgICAgICAgICAgIHhkLT51cF9hdmFpbGFibGUgPSAobWJfcm93ICE9IDApOworICAgICAgICAgICAgICAgIHJlY29uX3lvZmZzZXQgPSAobWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNik7CisgICAgICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQgPSAobWJfcm93ICogcmVjb25fdXZfc3RyaWRlICogOCk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG1iIGFjdGl2aXR5IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSByb3cuICovCisgICAgICAgICAgICAgICAgeC0+bWJfYWN0aXZpdHlfcHRyID0gJmNwaS0+bWJfYWN0aXZpdHlfbWFwW21hcF9pbmRleF07CisKKyAgICAgICAgICAgICAgICAvKiBmb3IgZWFjaCBtYWNyb2Jsb2NrIGNvbCBpbiBpbWFnZSAqLworICAgICAgICAgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnRfbWJfY29sID0gbWJfY29sIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKG1iX2NvbCAmIChuc3luYyAtIDEpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWJfY29sID4gKCpsYXN0X3Jvd19jdXJyZW50X21iX2NvbCAtIG5zeW5jKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcGF1c2VfaGludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9zbGVlcCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworICAgICAgICAgICAgICAgICAgICB0cCA9IHRwX3N0YXJ0OworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogRGlzdGFuY2Ugb2YgTWIgdG8gdGhlIHZhcmlvdXMgaW1hZ2UgZWRnZXMuCisgICAgICAgICAgICAgICAgICAgICAqIFRoZXNlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZAorICAgICAgICAgICAgICAgICAgICAgKiB0byB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fbGVmdF9lZGdlID0gLSgobWJfY29sICogMTYpIDw8IDMpOworICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fcmlnaHRfZWRnZSA9ICgoY20tPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KSA8PCAzOworICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fdG9wX2VkZ2UgPSAtKChtYl9yb3cgKiAxNikgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgIHhkLT5tYl90b19ib3R0b21fZWRnZSA9ICgoY20tPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOworCisgICAgICAgICAgICAgICAgICAgIC8qIFNldCB1cCBsaW1pdCB2YWx1ZXMgZm9yIG1vdGlvbiB2ZWN0b3JzIHVzZWQgdG8gcHJldmVudAorICAgICAgICAgICAgICAgICAgICAgKiB0aGVtIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBVTVYgYm9yZGVycworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgeC0+bXZfY29sX21pbiA9IC0oKG1iX2NvbCAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE2KSk7CisgICAgICAgICAgICAgICAgICAgIHgtPm12X2NvbF9tYXggPSAoKGNtLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNik7CisgICAgICAgICAgICAgICAgICAgIHgtPm12X3Jvd19taW4gPSAtKChtYl9yb3cgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNikpOworICAgICAgICAgICAgICAgICAgICB4LT5tdl9yb3dfbWF4ID0gKChjbS0+bWJfcm93cyAtIDEgLSBtYl9yb3cpICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpOworCisgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnZfYnVmZmVyID0gY20tPnl2MTJfZmJbZHN0X2ZiX2lkeF0udl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gKG1iX2NvbCAhPSAwKTsKKworICAgICAgICAgICAgICAgICAgICB4LT5yZGRpdiA9IGNwaS0+UkRESVY7CisgICAgICAgICAgICAgICAgICAgIHgtPnJkbXVsdCA9IGNwaS0+UkRNVUxUOworCisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgY3VycmVudCBtYiB0byBhIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB2cDhfY29weV9tZW0xNngxNih4LT5zcmMueV9idWZmZXIsIHgtPnNyYy55X3N0cmlkZSwgeC0+dGhpc21iLCAxNik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi50dW5pbmcgPT0gVlA4X1RVTkVfU1NJTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9hY3Rpdml0eV9tYXNraW5nKGNwaSwgeCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSXMgc2VnbWVudGF0aW9uIGVuYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogTUIgbGV2ZWwgYWRqdXN0bWVudCB0byBxdWFudGl6ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSB0byBzZXQgc2VnbWVudCBpZCBpbiB4ZC0+bWJtaS5zZWdtZW50X2lkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogY3VycmVudCBNQiAod2l0aCByYW5nZSBjaGVja2luZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+c2VnbWVudGF0aW9uX21hcFttYXBfaW5kZXggKyBtYl9jb2xdIDw9IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPSBjcGktPnNlZ21lbnRhdGlvbl9tYXBbbWFwX2luZGV4ICsgbWJfY29sXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOGN4X21iX2luaXRfcXVhbnRpemVyKGNwaSwgeCwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIFNlZ21lbnQgMCBieSBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgeC0+YWN0aXZlX3B0ciA9IGNwaS0+YWN0aXZlX21hcCArIG1hcF9pbmRleCArIG1iX2NvbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdG90YWxyYXRlICs9IHZwOGN4X2VuY29kZV9pbnRyYV9tYWNyb2Jsb2NrKGNwaSwgeCwgJnRwKTsKKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVzW3hkLT5tYm1pLm1vZGVdICsrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdG90YWxyYXRlICs9IHZwOGN4X2VuY29kZV9pbnRlcl9tYWNyb2Jsb2NrKGNwaSwgeCwgJnRwLCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCwgbWJfcm93LCBtYl9jb2wpOworCisjaWZkZWYgTU9ERV9TVEFUUworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfeV9tb2Rlc1t4ZC0+bWJtaS5tb2RlXSArKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCB4ZC0+bWJtaS5wYXJ0aXRpb25fY291bnQ7IGIrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX2JfbW9kZXNbeC0+cGFydGl0aW9uLT5ibWlbYl0ubW9kZV0gKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlIGNvZGUgZm9yIGN5Y2xpYyByZWZyZXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBjeWNsaWMgdXBkYXRlIGVuYWJsZWQgdGhlbiBjb3B5CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB4ZC0+bWJtaS5zZWdtZW50X2lkOyAod2hpY2ggbWF5IGhhdmUgYmVlbiB1cGRhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBiYXNlZCBvbiBtb2RlIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICogdnA4Y3hfZW5jb2RlX2ludGVyX21hY3JvYmxvY2soKSkgYmFjayBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICogZ2xvYmFsIHNlZ21lbnRhdGlvbiBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkICYmIHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQl9NT0RFX0lORk8gKiBtYm1pID0gJnhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnNlZ21lbnRhdGlvbl9tYXBbbWFwX2luZGV4ICsgbWJfY29sXSA9IG1ibWktPnNlZ21lbnRfaWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgYmxvY2sgaGFzIGJlZW4gcmVmcmVzaGVkIG1hcmsgaXQgYXMgY2xlYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAodGhlIG1hZ25pdHVkZSBvZiB0aGUgLXZlIGluZmx1ZW5jZXMgaG93IGxvbmcgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGJlZm9yZSB3ZSBjb25zaWRlciBhbm90aGVyIHJlZnJlc2gpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVsc2UgaWYgaXQgd2FzIGNvZGVkIChsYXN0IGZyYW1lIDAsMCkgYW5kIGhhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vdCBhbHJlYWR5IGJlZW4gcmVmcmVzaGVkIHRoZW4gbWFyayBpdCBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FuZGlkYXRlIGZvciBjbGVhbnVwIG5leHQgdGltZSAobWFya2VkIDApIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXJrIGl0IGFzIGRpcnR5ICgxKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJtaS0+c2VnbWVudF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbbWFwX2luZGV4ICsgbWJfY29sXSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtYm1pLT5tb2RlID09IFpFUk9NVikgJiYgKG1ibWktPnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21hcFttYXBfaW5kZXggKyBtYl9jb2xdID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFttYXBfaW5kZXggKyBtYl9jb2xdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFttYXBfaW5kZXggKyBtYl9jb2xdID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgICAgICAgICAgICAgICAgIC8qIHBhY2sgdG9rZW5zIGZvciB0aGlzIE1CICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b2tfY291bnQgPSB0cCAtIHRwX3N0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgcGFja190b2tlbnModywgdHBfc3RhcnQsIHRva19jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGNwaS0+dHBsaXN0W21iX3Jvd10uc3RvcCA9IHRwOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVyIGludG8gZ2YgdXNhZ2UgZmxhZ3Mgc3RydWN0dXJlLiAqLworICAgICAgICAgICAgICAgICAgICB4LT5nZl9hY3RpdmVfcHRyKys7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHRoZSBhY3Rpdml0eSBtYXNrIHBvaW50ZXJzLiAqLworICAgICAgICAgICAgICAgICAgICB4LT5tYl9hY3Rpdml0eV9wdHIrKzsKKworICAgICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgdG8gdGhlIG5leHQgY29sdW1uIG9mIG1hY3JvYmxvY2tzICovCisgICAgICAgICAgICAgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyICs9IDg7CisgICAgICAgICAgICAgICAgICAgIHgtPnNyYy52X2J1ZmZlciArPSA4OworCisgICAgICAgICAgICAgICAgICAgIHJlY29uX3lvZmZzZXQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIHJlY29uX3V2b2Zmc2V0ICs9IDg7CisKKyAgICAgICAgICAgICAgICAgICAgLyogS2VlcCB0cmFjayBvZiBzZWdtZW50IHVzYWdlICovCisgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRfY291bnRzW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkXSsrOworCisgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdG8gbmV4dCBtYiAqLworICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQrKzsKKyAgICAgICAgICAgICAgICAgICAgeC0+cGFydGl0aW9uX2luZm8rKzsKKyAgICAgICAgICAgICAgICAgICAgeGQtPmFib3ZlX2NvbnRleHQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2cDhfZXh0ZW5kX21iX3JvdyggJmNtLT55djEyX2ZiW2RzdF9mYl9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciArIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnZfYnVmZmVyICsgOCk7CisKKyAgICAgICAgICAgICAgICAqY3VycmVudF9tYl9jb2wgPSBtYl9jb2wgKyBuc3luYzsKKworICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgdG8gYWNjb3VudCBmb3IgdGhlIGJvcmRlciAqLworICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dCsrOworICAgICAgICAgICAgICAgIHgtPnBhcnRpdGlvbl9pbmZvKys7CisKKyAgICAgICAgICAgICAgICB4LT5zcmMueV9idWZmZXIgKz0gMTYgKiB4LT5zcmMueV9zdHJpZGUgKiAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSAtIDE2ICogY20tPm1iX2NvbHM7CisgICAgICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyICs9IDggKiB4LT5zcmMudXZfc3RyaWRlICogKGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkgLSA4ICogY20tPm1iX2NvbHM7CisgICAgICAgICAgICAgICAgeC0+c3JjLnZfYnVmZmVyICs9IDggKiB4LT5zcmMudXZfc3RyaWRlICogKGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkgLSA4ICogY20tPm1iX2NvbHM7CisKKyAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQgKz0geGQtPm1vZGVfaW5mb19zdHJpZGUgKiBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgICAgICB4LT5wYXJ0aXRpb25faW5mbyArPSB4ZC0+bW9kZV9pbmZvX3N0cmlkZSAqIGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50OworICAgICAgICAgICAgICAgIHgtPmdmX2FjdGl2ZV9wdHIgICArPSBjbS0+bWJfY29scyAqIGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50OworCisgICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA9PSBjbS0+bWJfcm93cyAtIDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X2VuZF9lbmNvZGluZyk7IC8qIHNpZ25hbCBmcmFtZSBlbmNvZGluZyBlbmQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwcmludGYoImV4aXQgdGhyZWFkICVkXG4iLCBpdGhyZWFkKTsgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfbWJieV9jb3B5KE1BQ1JPQkxPQ0sgKm1iZHN0LCBNQUNST0JMT0NLICptYnNyYykKK3sKKworICAgIE1BQ1JPQkxPQ0sgKnggPSBtYnNyYzsKKyAgICBNQUNST0JMT0NLICp6ID0gbWJkc3Q7CisgICAgaW50IGk7CisKKyAgICB6LT5zcyAgICAgICAgICAgICAgID0geC0+c3M7CisgICAgei0+c3NfY291bnQgICAgICAgICAgPSB4LT5zc19jb3VudDsKKyAgICB6LT5zZWFyY2hlc19wZXJfc3RlcCAgPSB4LT5zZWFyY2hlc19wZXJfc3RlcDsKKyAgICB6LT5lcnJvcnBlcmJpdCAgICAgID0geC0+ZXJyb3JwZXJiaXQ7CisKKyAgICB6LT5zYWRwZXJiaXQxNiAgICAgID0geC0+c2FkcGVyYml0MTY7CisgICAgei0+c2FkcGVyYml0NCAgICAgICA9IHgtPnNhZHBlcmJpdDQ7CisKKyAgICAvKgorICAgIHotPm12X2NvbF9taW4gICAgPSB4LT5tdl9jb2xfbWluOworICAgIHotPm12X2NvbF9tYXggICAgPSB4LT5tdl9jb2xfbWF4OworICAgIHotPm12X3Jvd19taW4gICAgPSB4LT5tdl9yb3dfbWluOworICAgIHotPm12X3Jvd19tYXggICAgPSB4LT5tdl9yb3dfbWF4OworICAgICovCisKKyAgICB6LT5zaG9ydF9mZGN0NHg0ICAgICA9IHgtPnNob3J0X2ZkY3Q0eDQ7CisgICAgei0+c2hvcnRfZmRjdDh4NCAgICAgPSB4LT5zaG9ydF9mZGN0OHg0OworICAgIHotPnNob3J0X3dhbHNoNHg0ICAgID0geC0+c2hvcnRfd2Fsc2g0eDQ7CisgICAgei0+cXVhbnRpemVfYiAgICAgICAgPSB4LT5xdWFudGl6ZV9iOworICAgIHotPnF1YW50aXplX2JfcGFpciAgID0geC0+cXVhbnRpemVfYl9wYWlyOworICAgIHotPm9wdGltaXplICAgICAgICAgID0geC0+b3B0aW1pemU7CisKKyAgICAvKgorICAgIHotPm12YyAgICAgICAgICAgICAgPSB4LT5tdmM7CisgICAgei0+c3JjLnlfYnVmZmVyICAgICAgPSB4LT5zcmMueV9idWZmZXI7CisgICAgei0+c3JjLnVfYnVmZmVyICAgICAgPSB4LT5zcmMudV9idWZmZXI7CisgICAgei0+c3JjLnZfYnVmZmVyICAgICAgPSB4LT5zcmMudl9idWZmZXI7CisgICAgKi8KKworICAgIHotPm12Y29zdFswXSA9ICB4LT5tdmNvc3RbMF07CisgICAgei0+bXZjb3N0WzFdID0gIHgtPm12Y29zdFsxXTsKKyAgICB6LT5tdnNhZGNvc3RbMF0gPSAgeC0+bXZzYWRjb3N0WzBdOworICAgIHotPm12c2FkY29zdFsxXSA9ICB4LT5tdnNhZGNvc3RbMV07CisKKyAgICB6LT50b2tlbl9jb3N0cyA9IHgtPnRva2VuX2Nvc3RzOworICAgIHotPmludGVyX2Jtb2RlX2Nvc3RzID0geC0+aW50ZXJfYm1vZGVfY29zdHM7CisgICAgei0+bWJtb2RlX2Nvc3QgPSB4LT5tYm1vZGVfY29zdDsKKyAgICB6LT5pbnRyYV91dl9tb2RlX2Nvc3QgPSB4LT5pbnRyYV91dl9tb2RlX2Nvc3Q7CisgICAgei0+Ym1vZGVfY29zdHMgPSB4LT5ibW9kZV9jb3N0czsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQorICAgIHsKKyAgICAgICAgei0+YmxvY2tbaV0ucXVhbnQgICAgICAgICAgID0geC0+YmxvY2tbaV0ucXVhbnQ7CisgICAgICAgIHotPmJsb2NrW2ldLnF1YW50X2Zhc3QgICAgICA9IHgtPmJsb2NrW2ldLnF1YW50X2Zhc3Q7CisgICAgICAgIHotPmJsb2NrW2ldLnF1YW50X3NoaWZ0ICAgICA9IHgtPmJsb2NrW2ldLnF1YW50X3NoaWZ0OworICAgICAgICB6LT5ibG9ja1tpXS56YmluICAgICAgICAgICAgPSB4LT5ibG9ja1tpXS56YmluOworICAgICAgICB6LT5ibG9ja1tpXS56cnVuX3piaW5fYm9vc3QgPSB4LT5ibG9ja1tpXS56cnVuX3piaW5fYm9vc3Q7CisgICAgICAgIHotPmJsb2NrW2ldLnJvdW5kICAgICAgICAgICA9IHgtPmJsb2NrW2ldLnJvdW5kOworICAgICAgICB6LT5ibG9ja1tpXS5zcmNfc3RyaWRlICAgICAgPSB4LT5ibG9ja1tpXS5zcmNfc3RyaWRlOworICAgIH0KKworICAgIHotPnFfaW5kZXggICAgICAgICAgID0geC0+cV9pbmRleDsKKyAgICB6LT5hY3RfemJpbl9hZGogICAgICA9IHgtPmFjdF96YmluX2FkajsKKyAgICB6LT5sYXN0X2FjdF96YmluX2FkaiA9IHgtPmxhc3RfYWN0X3piaW5fYWRqOworCisgICAgeworICAgICAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgICAgIE1BQ1JPQkxPQ0tEICp6ZCA9ICZ6LT5lX21iZDsKKworICAgICAgICAvKgorICAgICAgICB6ZC0+bW9kZV9pbmZvX2NvbnRleHQgPSB4ZC0+bW9kZV9pbmZvX2NvbnRleHQ7CisgICAgICAgIHpkLT5tb2RlX2luZm8gICAgICAgID0geGQtPm1vZGVfaW5mbzsKKworICAgICAgICB6ZC0+bW9kZV9pbmZvX3N0cmlkZSAgPSB4ZC0+bW9kZV9pbmZvX3N0cmlkZTsKKyAgICAgICAgemQtPmZyYW1lX3R5cGUgICAgICAgPSB4ZC0+ZnJhbWVfdHlwZTsKKyAgICAgICAgemQtPnVwX2F2YWlsYWJsZSAgICAgPSB4ZC0+dXBfYXZhaWxhYmxlICAgOworICAgICAgICB6ZC0+bGVmdF9hdmFpbGFibGUgICA9IHhkLT5sZWZ0X2F2YWlsYWJsZTsKKyAgICAgICAgemQtPmxlZnRfY29udGV4dCAgICAgPSB4ZC0+bGVmdF9jb250ZXh0OworICAgICAgICB6ZC0+bGFzdF9mcmFtZV9kYyAgICAgPSB4ZC0+bGFzdF9mcmFtZV9kYzsKKyAgICAgICAgemQtPmxhc3RfZnJhbWVfZGNjb25zID0geGQtPmxhc3RfZnJhbWVfZGNjb25zOworICAgICAgICB6ZC0+Z29sZF9mcmFtZV9kYyAgICAgPSB4ZC0+Z29sZF9mcmFtZV9kYzsKKyAgICAgICAgemQtPmdvbGRfZnJhbWVfZGNjb25zID0geGQtPmdvbGRfZnJhbWVfZGNjb25zOworICAgICAgICB6ZC0+bWJfdG9fbGVmdF9lZGdlICAgID0geGQtPm1iX3RvX2xlZnRfZWRnZTsKKyAgICAgICAgemQtPm1iX3RvX3JpZ2h0X2VkZ2UgICA9IHhkLT5tYl90b19yaWdodF9lZGdlOworICAgICAgICB6ZC0+bWJfdG9fdG9wX2VkZ2UgICAgID0geGQtPm1iX3RvX3RvcF9lZGdlICAgOworICAgICAgICB6ZC0+bWJfdG9fYm90dG9tX2VkZ2UgID0geGQtPm1iX3RvX2JvdHRvbV9lZGdlOworICAgICAgICB6ZC0+Z2ZfYWN0aXZlX3B0ciAgICAgPSB4ZC0+Z2ZfYWN0aXZlX3B0cjsKKyAgICAgICAgemQtPmZyYW1lc19zaW5jZV9nb2xkZW4gICAgICAgPSB4ZC0+ZnJhbWVzX3NpbmNlX2dvbGRlbjsKKyAgICAgICAgemQtPmZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWUgICA9IHhkLT5mcmFtZXNfdGlsbF9hbHRfcmVmX2ZyYW1lOworICAgICAgICAqLworICAgICAgICB6ZC0+c3VicGl4ZWxfcHJlZGljdCAgICAgICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3Q7CisgICAgICAgIHpkLT5zdWJwaXhlbF9wcmVkaWN0OHg0ICAgICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4NDsKKyAgICAgICAgemQtPnN1YnBpeGVsX3ByZWRpY3Q4eDggICAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4OworICAgICAgICB6ZC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2ICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNjsKKyAgICAgICAgemQtPnNlZ21lbnRhdGlvbl9lbmFibGVkICAgICA9IHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZDsKKyAgICAgICAgemQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSAgICAgID0geGQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YTsKKyAgICAgICAgdnB4X21lbWNweSh6ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEsIHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoeGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhKSk7CisKKyAgICAgICAgdnB4X21lbWNweSh6ZC0+ZGVxdWFudF95MV9kYywgeGQtPmRlcXVhbnRfeTFfZGMsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhkLT5kZXF1YW50X3kxX2RjKSk7CisgICAgICAgIHZweF9tZW1jcHkoemQtPmRlcXVhbnRfeTEsIHhkLT5kZXF1YW50X3kxLCBzaXplb2YoeGQtPmRlcXVhbnRfeTEpKTsKKyAgICAgICAgdnB4X21lbWNweSh6ZC0+ZGVxdWFudF95MiwgeGQtPmRlcXVhbnRfeTIsIHNpemVvZih4ZC0+ZGVxdWFudF95MikpOworICAgICAgICB2cHhfbWVtY3B5KHpkLT5kZXF1YW50X3V2LCB4ZC0+ZGVxdWFudF91diwgc2l6ZW9mKHhkLT5kZXF1YW50X3V2KSk7CisKKyNpZiAxCisgICAgICAgIC8qVE9ETzogIFJlbW92ZSBkZXF1YW50IGZyb20gQkxPQ0tELiAgVGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB1bnRpbAorICAgICAgICAgKiB0aGUgcXVhbnRpemVyIGNvZGUgdXNlcyBhIHBhc3NlZCBpbiBwb2ludGVyIHRvIHRoZSBkZXF1YW50IGNvbnN0YW50cy4KKyAgICAgICAgICogVGhpcyB3aWxsIGFsc28gcmVxdWlyZSBtb2RpZmljYXRpb25zIHRvIHRoZSB4ODYgYW5kIG5lb24gYXNzZW1ibHkuCisgICAgICAgICAqICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgemQtPmJsb2NrW2ldLmRlcXVhbnQgPSB6ZC0+ZGVxdWFudF95MTsKKyAgICAgICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSsrKQorICAgICAgICAgICAgemQtPmJsb2NrW2ldLmRlcXVhbnQgPSB6ZC0+ZGVxdWFudF91djsKKyAgICAgICAgemQtPmJsb2NrWzI0XS5kZXF1YW50ID0gemQtPmRlcXVhbnRfeTI7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgdnA4Y3hfaW5pdF9tYnJ0aHJlYWRfZGF0YShWUDhfQ09NUCAqY3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0sgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfUk9XX0NPTVAgKm1icl9laSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCisgICAgVlA4X0NPTU1PTiAqY29uc3QgY20gPSAmIGNwaS0+Y29tbW9uOworICAgIE1BQ1JPQkxPQ0tEICpjb25zdCB4ZCA9ICYgeC0+ZV9tYmQ7CisgICAgaW50IGk7CisgICAgKHZvaWQpIG1iX3JvdzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgTUFDUk9CTE9DSyAqbWIgPSAmIG1icl9laVtpXS5tYjsKKyAgICAgICAgTUFDUk9CTE9DS0QgKm1iZCA9ICZtYi0+ZV9tYmQ7CisKKyAgICAgICAgbWJkLT5zdWJwaXhlbF9wcmVkaWN0ICAgICAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0OworICAgICAgICBtYmQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQgICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQ7CisgICAgICAgIG1iZC0+c3VicGl4ZWxfcHJlZGljdDh4OCAgICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4ODsKKyAgICAgICAgbWJkLT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTYgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTY7CisgICAgICAgIG1iLT5nZl9hY3RpdmVfcHRyICAgICAgICAgICAgPSB4LT5nZl9hY3RpdmVfcHRyOworCisgICAgICAgIHZweF9tZW1zZXQobWJyX2VpW2ldLnNlZ21lbnRfY291bnRzLCAwLCBzaXplb2YobWJyX2VpW2ldLnNlZ21lbnRfY291bnRzKSk7CisgICAgICAgIG1icl9laVtpXS50b3RhbHJhdGUgPSAwOworCisgICAgICAgIG1iLT5wYXJ0aXRpb25faW5mbyA9IHgtPnBpICsgeC0+ZV9tYmQubW9kZV9pbmZvX3N0cmlkZSAqIChpICsgMSk7CisKKyAgICAgICAgbWJkLT5tb2RlX2luZm9fY29udGV4dCA9IGNtLT5taSAgICsgeC0+ZV9tYmQubW9kZV9pbmZvX3N0cmlkZSAqIChpICsgMSk7CisgICAgICAgIG1iZC0+bW9kZV9pbmZvX3N0cmlkZSAgPSBjbS0+bW9kZV9pbmZvX3N0cmlkZTsKKworICAgICAgICBtYmQtPmZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKKworICAgICAgICBtYi0+c3JjID0gKiBjcGktPlNvdXJjZTsKKyAgICAgICAgbWJkLT5wcmUgPSBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF07CisgICAgICAgIG1iZC0+ZHN0ID0gY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdOworCisgICAgICAgIG1iLT5zcmMueV9idWZmZXIgKz0gMTYgKiB4LT5zcmMueV9zdHJpZGUgKiAoaSArIDEpOworICAgICAgICBtYi0+c3JjLnVfYnVmZmVyICs9ICA4ICogeC0+c3JjLnV2X3N0cmlkZSAqIChpICsgMSk7CisgICAgICAgIG1iLT5zcmMudl9idWZmZXIgKz0gIDggKiB4LT5zcmMudXZfc3RyaWRlICogKGkgKyAxKTsKKworICAgICAgICB2cDhfYnVpbGRfYmxvY2tfb2Zmc2V0cyhtYik7CisKKyAgICAgICAgbWJkLT5sZWZ0X2NvbnRleHQgPSAmY20tPmxlZnRfY29udGV4dDsKKyAgICAgICAgbWItPm12YyA9IGNtLT5mYy5tdmM7CisKKyAgICAgICAgc2V0dXBfbWJieV9jb3B5KCZtYnJfZWlbaV0ubWIsIHgpOworCisgICAgICAgIG1iZC0+ZnVsbHBpeGVsX21hc2sgPSAweGZmZmZmZmZmOworICAgICAgICBpZihjbS0+ZnVsbF9waXhlbCkKKyAgICAgICAgICAgIG1iZC0+ZnVsbHBpeGVsX21hc2sgPSAweGZmZmZmZmY4OworCisgICAgICAgIHZwOF96ZXJvKG1iLT5jb2VmX2NvdW50cyk7CisgICAgICAgIHZwOF96ZXJvKHgtPnltb2RlX2NvdW50KTsKKyAgICAgICAgbWItPnNraXBfdHJ1ZV9jb3VudCA9IDA7CisgICAgICAgIHZwOF96ZXJvKG1iLT5NVmNvdW50KTsKKyAgICAgICAgbWItPnByZWRpY3Rpb25fZXJyb3IgPSAwOworICAgICAgICBtYi0+aW50cmFfZXJyb3IgPSAwOworICAgIH0KK30KKworaW50IHZwOGN4X2NyZWF0ZV9lbmNvZGVyX3RocmVhZHMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBjb25zdCBWUDhfQ09NTU9OICogY20gPSAmY3BpLT5jb21tb247CisKKyAgICBjcGktPmJfbXVsdGlfdGhyZWFkZWQgPSAwOworICAgIGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ID0gMDsKKyAgICBjcGktPmJfbHBmX3J1bm5pbmcgPSAwOworCisgICAgaWYgKGNtLT5wcm9jZXNzb3JfY29yZV9jb3VudCA+IDEgJiYgY3BpLT5veGNmLm11bHRpX3RocmVhZGVkID4gMSkKKyAgICB7CisgICAgICAgIGludCBpdGhyZWFkOworICAgICAgICBpbnQgdGhfY291bnQgPSBjcGktPm94Y2YubXVsdGlfdGhyZWFkZWQgLSAxOworICAgICAgICBpbnQgcmMgPSAwOworCisgICAgICAgIC8qIGRvbid0IGFsbG9jYXRlIG1vcmUgdGhyZWFkcyB0aGFuIGNvcmVzIGF2YWlsYWJsZSAqLworICAgICAgICBpZiAoY3BpLT5veGNmLm11bHRpX3RocmVhZGVkID4gY20tPnByb2Nlc3Nvcl9jb3JlX2NvdW50KQorICAgICAgICAgICAgdGhfY291bnQgPSBjbS0+cHJvY2Vzc29yX2NvcmVfY291bnQgLSAxOworCisgICAgICAgIC8qIHdlIGhhdmUgdGhfY291bnQgKyAxIChtYWluKSB0aHJlYWRzIHByb2Nlc3Npbmcgb25lIHJvdyBlYWNoICovCisgICAgICAgIC8qIG5vIHBvaW50IHRvIGhhdmUgbW9yZSB0aHJlYWRzIHRoYW4gdGhlIHN5bmMgcmFuZ2UgYWxsb3dzICovCisgICAgICAgIGlmKHRoX2NvdW50ID4gKChjbS0+bWJfY29scyAvIGNwaS0+bXRfc3luY19yYW5nZSkgLSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhfY291bnQgPSAoY20tPm1iX2NvbHMgLyBjcGktPm10X3N5bmNfcmFuZ2UpIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHRoX2NvdW50ID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5oX2VuY29kaW5nX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tYWxsb2Moc2l6ZW9mKHB0aHJlYWRfdCkgKiB0aF9jb3VudCkpOworICAgICAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgdnB4X21hbGxvYyhzaXplb2Yoc2VtX3QpICogdGhfY291bnQpKTsKKyAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+bWJfcm93X2VpLAorICAgICAgICAgICAgICAgICAgICAgICAgdnB4X21lbWFsaWduKDMyLCBzaXplb2YoTUJfUk9XX0NPTVApICogdGhfY291bnQpKTsKKyAgICAgICAgdnB4X21lbXNldChjcGktPm1iX3Jvd19laSwgMCwgc2l6ZW9mKE1CX1JPV19DT01QKSAqIHRoX2NvdW50KTsKKyAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+ZW5fdGhyZWFkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWFsbG9jKHNpemVvZihFTkNPREVUSFJFQURfREFUQSkgKiB0aF9jb3VudCkpOworCisgICAgICAgIHNlbV9pbml0KCZjcGktPmhfZXZlbnRfZW5kX2VuY29kaW5nLCAwLCAwKTsKKworICAgICAgICBjcGktPmJfbXVsdGlfdGhyZWFkZWQgPSAxOworICAgICAgICBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudCA9IHRoX2NvdW50OworCisgICAgICAgIC8qCisgICAgICAgIHByaW50ZigiW1ZQODpdIG11bHRpX3RocmVhZGVkIGVuY29kaW5nIGlzIGVuYWJsZWQgd2l0aCAlZCB0aHJlYWRzXG5cbiIsCisgICAgICAgICAgICAgICAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKzEpKTsKKyAgICAgICAgKi8KKworICAgICAgICBmb3IgKGl0aHJlYWQgPSAwOyBpdGhyZWFkIDwgdGhfY291bnQ7IGl0aHJlYWQrKykKKyAgICAgICAgeworICAgICAgICAgICAgRU5DT0RFVEhSRUFEX0RBVEEgKmV0aGQgPSAmY3BpLT5lbl90aHJlYWRfZGF0YVtpdGhyZWFkXTsKKworICAgICAgICAgICAgLyogU2V0dXAgYmxvY2sgcHRycyBhbmQgb2Zmc2V0cyAqLworICAgICAgICAgICAgdnA4X3NldHVwX2Jsb2NrX3B0cnMoJmNwaS0+bWJfcm93X2VpW2l0aHJlYWRdLm1iKTsKKyAgICAgICAgICAgIHZwOF9zZXR1cF9ibG9ja19kcHRycygmY3BpLT5tYl9yb3dfZWlbaXRocmVhZF0ubWIuZV9tYmQpOworCisgICAgICAgICAgICBzZW1faW5pdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2l0aHJlYWRdLCAwLCAwKTsKKworICAgICAgICAgICAgZXRoZC0+aXRocmVhZCA9IGl0aHJlYWQ7CisgICAgICAgICAgICBldGhkLT5wdHIxID0gKHZvaWQgKiljcGk7CisgICAgICAgICAgICBldGhkLT5wdHIyID0gKHZvaWQgKikmY3BpLT5tYl9yb3dfZWlbaXRocmVhZF07CisKKyAgICAgICAgICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJmNwaS0+aF9lbmNvZGluZ190aHJlYWRbaXRocmVhZF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9lbmNvZGluZ19wcm9jLCBldGhkKTsKKyAgICAgICAgICAgIGlmKHJjKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNodXRkb3duIG90aGVyIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGNwaS0+Yl9tdWx0aV90aHJlYWRlZCA9IDA7CisgICAgICAgICAgICBmb3IoLS1pdGhyZWFkOyBpdGhyZWFkID49IDA7IGl0aHJlYWQtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4oY3BpLT5oX2VuY29kaW5nX3RocmVhZFtpdGhyZWFkXSwgMCk7CisgICAgICAgICAgICAgICAgc2VtX2Rlc3Ryb3koJmNwaS0+aF9ldmVudF9zdGFydF9lbmNvZGluZ1tpdGhyZWFkXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW1fZGVzdHJveSgmY3BpLT5oX2V2ZW50X2VuZF9lbmNvZGluZyk7CisKKyAgICAgICAgICAgIC8qIGZyZWUgdGhyZWFkIHJlbGF0ZWQgcmVzb3VyY2VzICovCisgICAgICAgICAgICB2cHhfZnJlZShjcGktPmhfZXZlbnRfc3RhcnRfZW5jb2RpbmcpOworICAgICAgICAgICAgdnB4X2ZyZWUoY3BpLT5oX2VuY29kaW5nX3RocmVhZCk7CisgICAgICAgICAgICB2cHhfZnJlZShjcGktPm1iX3Jvd19laSk7CisgICAgICAgICAgICB2cHhfZnJlZShjcGktPmVuX3RocmVhZF9kYXRhKTsKKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKworICAgICAgICB7CisgICAgICAgICAgICBMUEZUSFJFQURfREFUQSAqIGxwZnRoZCA9ICZjcGktPmxwZl90aHJlYWRfZGF0YTsKKworICAgICAgICAgICAgc2VtX2luaXQoJmNwaS0+aF9ldmVudF9zdGFydF9scGYsIDAsIDApOworICAgICAgICAgICAgc2VtX2luaXQoJmNwaS0+aF9ldmVudF9lbmRfbHBmLCAwLCAwKTsKKworICAgICAgICAgICAgbHBmdGhkLT5wdHIxID0gKHZvaWQgKiljcGk7CisgICAgICAgICAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZjcGktPmhfZmlsdGVyX3RocmVhZCwgMCwgdGhyZWFkX2xvb3BmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwZnRoZCk7CisKKyAgICAgICAgICAgIGlmKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNodXRkb3duIG90aGVyIHRocmVhZHMgKi8KKyAgICAgICAgICAgICAgICBjcGktPmJfbXVsdGlfdGhyZWFkZWQgPSAwOworICAgICAgICAgICAgICAgIGZvcigtLWl0aHJlYWQ7IGl0aHJlYWQgPj0gMDsgaXRocmVhZC0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VtX3Bvc3QoJmNwaS0+aF9ldmVudF9zdGFydF9lbmNvZGluZ1tpdGhyZWFkXSk7CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfam9pbihjcGktPmhfZW5jb2RpbmdfdGhyZWFkW2l0aHJlYWRdLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgc2VtX2Rlc3Ryb3koJmNwaS0+aF9ldmVudF9zdGFydF9lbmNvZGluZ1tpdGhyZWFkXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbV9kZXN0cm95KCZjcGktPmhfZXZlbnRfZW5kX2VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBzZW1fZGVzdHJveSgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOworICAgICAgICAgICAgICAgIHNlbV9kZXN0cm95KCZjcGktPmhfZXZlbnRfc3RhcnRfbHBmKTsKKworICAgICAgICAgICAgICAgIC8qIGZyZWUgdGhyZWFkIHJlbGF0ZWQgcmVzb3VyY2VzICovCisgICAgICAgICAgICAgICAgdnB4X2ZyZWUoY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICB2cHhfZnJlZShjcGktPmhfZW5jb2RpbmdfdGhyZWFkKTsKKyAgICAgICAgICAgICAgICB2cHhfZnJlZShjcGktPm1iX3Jvd19laSk7CisgICAgICAgICAgICAgICAgdnB4X2ZyZWUoY3BpLT5lbl90aHJlYWRfZGF0YSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgdnA4Y3hfcmVtb3ZlX2VuY29kZXJfdGhyZWFkcyhWUDhfQ09NUCAqY3BpKQoreworICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCisgICAgeworICAgICAgICAvKiBzaHV0ZG93biBvdGhlciB0aHJlYWRzICovCisgICAgICAgIGNwaS0+Yl9tdWx0aV90aHJlYWRlZCA9IDA7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2ldKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4oY3BpLT5oX2VuY29kaW5nX3RocmVhZFtpXSwgMCk7CisKKyAgICAgICAgICAgICAgICBzZW1fZGVzdHJveSgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VtX3Bvc3QoJmNwaS0+aF9ldmVudF9zdGFydF9scGYpOworICAgICAgICAgICAgcHRocmVhZF9qb2luKGNwaS0+aF9maWx0ZXJfdGhyZWFkLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbV9kZXN0cm95KCZjcGktPmhfZXZlbnRfZW5kX2VuY29kaW5nKTsKKyAgICAgICAgc2VtX2Rlc3Ryb3koJmNwaS0+aF9ldmVudF9lbmRfbHBmKTsKKyAgICAgICAgc2VtX2Rlc3Ryb3koJmNwaS0+aF9ldmVudF9zdGFydF9scGYpOworCisgICAgICAgIC8qIGZyZWUgdGhyZWFkIHJlbGF0ZWQgcmVzb3VyY2VzICovCisgICAgICAgIHZweF9mcmVlKGNwaS0+aF9ldmVudF9zdGFydF9lbmNvZGluZyk7CisgICAgICAgIHZweF9mcmVlKGNwaS0+aF9lbmNvZGluZ190aHJlYWQpOworICAgICAgICB2cHhfZnJlZShjcGktPm1iX3Jvd19laSk7CisgICAgICAgIHZweF9mcmVlKGNwaS0+ZW5fdGhyZWFkX2RhdGEpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2ZpcnN0cGFzcy5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2ZpcnN0cGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjhjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvZmlyc3RwYXNzLmMKQEAgLTAsMCArMSwzMzYwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImJsb2NrLmgiCisjaW5jbHVkZSAib255eF9pbnQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3ZhcmlhbmNlLmgiCisjaW5jbHVkZSAiZW5jb2RlaW50cmEuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgiCisjaW5jbHVkZSAibWNvbXAuaCIKKyNpbmNsdWRlICJmaXJzdHBhc3MuaCIKKyNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKKyNpbmNsdWRlICJlbmNvZGVtYi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oIgorI2luY2x1ZGUgInJkb3B0LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9xdWFudF9jb21tb24uaCIKKyNpbmNsdWRlICJlbmNvZGVtdi5oIgorI2luY2x1ZGUgImVuY29kZWZyYW1lLmgiCisKKy8qICNkZWZpbmUgT1VUUFVUX0ZQRiAxICovCisKK2V4dGVybiB2b2lkIHZwOGN4X2ZyYW1lX2luaXRfcXVhbnRpemVyKFZQOF9DT01QICpjcGkpOworZXh0ZXJuIHZvaWQgdnA4X3NldF9tYm1vZGVfYW5kX212cyhNQUNST0JMT0NLICp4LCBNQl9QUkVESUNUSU9OX01PREUgbWIsIGludF9tdiAqbXYpOworZXh0ZXJuIHZvaWQgdnA4X2FsbG9jX2NvbXByZXNzb3JfZGF0YShWUDhfQ09NUCAqY3BpKTsKKworI2RlZmluZSBHRlFfQURKVVNUTUVOVCB2cDhfZ2ZfYm9vc3RfcWFkanVzdG1lbnRbUV0KK2V4dGVybiBpbnQgdnA4X2tmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV07CisKK2V4dGVybiBjb25zdCBpbnQgdnA4X2dmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV07CisKKyNkZWZpbmUgSUlGQUNUT1IgICAxLjUKKyNkZWZpbmUgSUlLRkFDVE9SMSAxLjQwCisjZGVmaW5lIElJS0ZBQ1RPUjIgMS41CisjZGVmaW5lIFJNQVggICAgICAgMTQuMAorI2RlZmluZSBHRl9STUFYICAgIDQ4LjAKKworI2RlZmluZSBLRl9NQl9JTlRSQV9NSU4gMzAwCisjZGVmaW5lIEdGX01CX0lOVFJBX01JTiAyMDAKKworI2RlZmluZSBET1VCTEVfRElWSURFX0NIRUNLKFgpICgoWCk8MD8oWCktLjAwMDAwMTooWCkrLjAwMDAwMSkKKworI2RlZmluZSBQT1cxIChkb3VibGUpY3BpLT5veGNmLnR3b19wYXNzX3ZicmJpYXMvMTAwLjAKKyNkZWZpbmUgUE9XMiAoZG91YmxlKWNwaS0+b3hjZi50d29fcGFzc192YnJiaWFzLzEwMC4wCisKKyNkZWZpbmUgTkVXX0JPT1NUIDEKKworc3RhdGljIGludCB2c2NhbGVfbG9va3VwWzddID0gezAsIDEsIDEsIDIsIDIsIDMsIDN9Oworc3RhdGljIGludCBoc2NhbGVfbG9va3VwWzddID0gezAsIDAsIDEsIDEsIDIsIDIsIDN9OworCisKK3N0YXRpYyBjb25zdCBpbnQgY3FfbGV2ZWxbUUlOREVYX1JBTkdFXSA9Cit7CisgICAgMCwwLDEsMSwyLDMsMyw0LDQsNSw2LDYsNyw4LDgsOSwKKyAgICA5LDEwLDExLDExLDEyLDEzLDEzLDE0LDE1LDE1LDE2LDE3LDE3LDE4LDE5LDIwLAorICAgIDIwLDIxLDIyLDIyLDIzLDI0LDI0LDI1LDI2LDI3LDI3LDI4LDI5LDMwLDMwLDMxLAorICAgIDMyLDMzLDMzLDM0LDM1LDM2LDM2LDM3LDM4LDM5LDM5LDQwLDQxLDQyLDQyLDQzLAorICAgIDQ0LDQ1LDQ2LDQ2LDQ3LDQ4LDQ5LDUwLDUwLDUxLDUyLDUzLDU0LDU1LDU1LDU2LAorICAgIDU3LDU4LDU5LDYwLDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY3LDY4LDY5LDcwLAorICAgIDcxLDcyLDczLDc0LDc1LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LAorICAgIDg2LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMAorfTsKKworc3RhdGljIHZvaWQgZmluZF9uZXh0X2tleV9mcmFtZShWUDhfQ09NUCAqY3BpLCBGSVJTVFBBU1NfU1RBVFMgKnRoaXNfZnJhbWUpOworCisvKiBSZXNldHMgdGhlIGZpcnN0IHBhc3MgZmlsZSB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gdXNpbmcgYSByZWxhdGl2ZSBzZWVrCisgKiBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2ZwZl9wb3NpdGlvbihWUDhfQ09NUCAqY3BpLCBGSVJTVFBBU1NfU1RBVFMgKlBvc2l0aW9uKQoreworICAgIGNwaS0+dHdvcGFzcy5zdGF0c19pbiA9IFBvc2l0aW9uOworfQorCitzdGF0aWMgaW50IGxvb2t1cF9uZXh0X2ZyYW1lX3N0YXRzKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqbmV4dF9mcmFtZSkKK3sKKyAgICBpZiAoY3BpLT50d29wYXNzLnN0YXRzX2luID49IGNwaS0+dHdvcGFzcy5zdGF0c19pbl9lbmQpCisgICAgICAgIHJldHVybiBFT0Y7CisKKyAgICAqbmV4dF9mcmFtZSA9ICpjcGktPnR3b3Bhc3Muc3RhdHNfaW47CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIFJlYWQgZnJhbWUgc3RhdHMgYXQgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgcmVhZF9mcmFtZV9zdGF0cyggVlA4X0NPTVAgKmNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklSU1RQQVNTX1NUQVRTICpmcmFtZV9zdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCApCit7CisgICAgRklSU1RQQVNTX1NUQVRTICogZnBzX3B0ciA9IGNwaS0+dHdvcGFzcy5zdGF0c19pbjsKKworICAgIC8qIENoZWNrIGxlZ2FsaXR5IG9mIG9mZnNldCAqLworICAgIGlmICggb2Zmc2V0ID49IDAgKQorICAgIHsKKyAgICAgICAgaWYgKCAmZnBzX3B0cltvZmZzZXRdID49IGNwaS0+dHdvcGFzcy5zdGF0c19pbl9lbmQgKQorICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgfQorICAgIGVsc2UgaWYgKCBvZmZzZXQgPCAwICkKKyAgICB7CisgICAgICAgIGlmICggJmZwc19wdHJbb2Zmc2V0XSA8IGNwaS0+dHdvcGFzcy5zdGF0c19pbl9zdGFydCApCisgICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisKKyAgICAqZnJhbWVfc3RhdHMgPSBmcHNfcHRyW29mZnNldF07CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfc3RhdHMoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICpmcHMpCit7CisgICAgaWYgKGNwaS0+dHdvcGFzcy5zdGF0c19pbiA+PSBjcGktPnR3b3Bhc3Muc3RhdHNfaW5fZW5kKQorICAgICAgICByZXR1cm4gRU9GOworCisgICAgKmZwcyA9ICpjcGktPnR3b3Bhc3Muc3RhdHNfaW47CisgICAgY3BpLT50d29wYXNzLnN0YXRzX2luID0KKyAgICAgICAgICh2b2lkKikoKGNoYXIgKiljcGktPnR3b3Bhc3Muc3RhdHNfaW4gKyBzaXplb2YoRklSU1RQQVNTX1NUQVRTKSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9zdGF0cyhjb25zdCBWUDhfQ09NUCAgICAgICAgICAgICpjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAqcGt0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVJTVFBBU1NfU1RBVFMgICAgICAgICAgICAqc3RhdHMpCit7CisgICAgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgcGt0OworICAgIHBrdC5raW5kID0gVlBYX0NPREVDX1NUQVRTX1BLVDsKKyAgICBwa3QuZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiA9IHN0YXRzOworICAgIHBrdC5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3ogPSBzaXplb2YoRklSU1RQQVNTX1NUQVRTKTsKKyAgICB2cHhfY29kZWNfcGt0X2xpc3RfYWRkKHBrdGxpc3QsICZwa3QpOworCisvKiBURU1QIGRlYnVnIGNvZGUgKi8KKyNpZiBPVVRQVVRfRlBGCisKKyAgICB7CisgICAgICAgIEZJTEUgKmZwZmlsZTsKKyAgICAgICAgZnBmaWxlID0gZm9wZW4oImZpcnN0cGFzcy5zdHQiLCAiYSIpOworCisgICAgICAgIGZwcmludGYoZnBmaWxlLCAiJTEyLjBmICUxMi4wZiAlMTIuMGYgJTEyLjRmICUxMi40ZiAlMTIuNGYgJTEyLjRmIgorICAgICAgICAgICAgICAgICIgJTEyLjRmICUxMi40ZiAlMTIuNGYgJTEyLjRmICUxMi40ZiAlMTIuNGYgJTEyLjRmICUxMi40ZiIKKyAgICAgICAgICAgICAgICAiICUxMi4wZiAlMTIuMGYgJTEyLjRmXG4iLAorICAgICAgICAgICAgICAgIHN0YXRzLT5mcmFtZSwKKyAgICAgICAgICAgICAgICBzdGF0cy0+aW50cmFfZXJyb3IsCisgICAgICAgICAgICAgICAgc3RhdHMtPmNvZGVkX2Vycm9yLAorICAgICAgICAgICAgICAgIHN0YXRzLT5zc2ltX3dlaWdodGVkX3ByZWRfZXJyLAorICAgICAgICAgICAgICAgIHN0YXRzLT5wY250X2ludGVyLAorICAgICAgICAgICAgICAgIHN0YXRzLT5wY250X21vdGlvbiwKKyAgICAgICAgICAgICAgICBzdGF0cy0+cGNudF9zZWNvbmRfcmVmLAorICAgICAgICAgICAgICAgIHN0YXRzLT5wY250X25ldXRyYWwsCisgICAgICAgICAgICAgICAgc3RhdHMtPk1WciwKKyAgICAgICAgICAgICAgICBzdGF0cy0+bXZyX2FicywKKyAgICAgICAgICAgICAgICBzdGF0cy0+TVZjLAorICAgICAgICAgICAgICAgIHN0YXRzLT5tdmNfYWJzLAorICAgICAgICAgICAgICAgIHN0YXRzLT5NVnJ2LAorICAgICAgICAgICAgICAgIHN0YXRzLT5NVmN2LAorICAgICAgICAgICAgICAgIHN0YXRzLT5tdl9pbl9vdXRfY291bnQsCisgICAgICAgICAgICAgICAgc3RhdHMtPm5ld19tdl9jb3VudCwKKyAgICAgICAgICAgICAgICBzdGF0cy0+Y291bnQsCisgICAgICAgICAgICAgICAgc3RhdHMtPmR1cmF0aW9uKTsKKyAgICAgICAgZmNsb3NlKGZwZmlsZSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHplcm9fc3RhdHMoRklSU1RQQVNTX1NUQVRTICpzZWN0aW9uKQoreworICAgIHNlY3Rpb24tPmZyYW1lICAgICAgPSAwLjA7CisgICAgc2VjdGlvbi0+aW50cmFfZXJyb3IgPSAwLjA7CisgICAgc2VjdGlvbi0+Y29kZWRfZXJyb3IgPSAwLjA7CisgICAgc2VjdGlvbi0+c3NpbV93ZWlnaHRlZF9wcmVkX2VyciA9IDAuMDsKKyAgICBzZWN0aW9uLT5wY250X2ludGVyICA9IDAuMDsKKyAgICBzZWN0aW9uLT5wY250X21vdGlvbiAgPSAwLjA7CisgICAgc2VjdGlvbi0+cGNudF9zZWNvbmRfcmVmID0gMC4wOworICAgIHNlY3Rpb24tPnBjbnRfbmV1dHJhbCA9IDAuMDsKKyAgICBzZWN0aW9uLT5NVnIgICAgICAgID0gMC4wOworICAgIHNlY3Rpb24tPm12cl9hYnMgICAgID0gMC4wOworICAgIHNlY3Rpb24tPk1WYyAgICAgICAgPSAwLjA7CisgICAgc2VjdGlvbi0+bXZjX2FicyAgICAgPSAwLjA7CisgICAgc2VjdGlvbi0+TVZydiAgICAgICA9IDAuMDsKKyAgICBzZWN0aW9uLT5NVmN2ICAgICAgID0gMC4wOworICAgIHNlY3Rpb24tPm12X2luX291dF9jb3VudCAgPSAwLjA7CisgICAgc2VjdGlvbi0+bmV3X212X2NvdW50ID0gMC4wOworICAgIHNlY3Rpb24tPmNvdW50ICAgICAgPSAwLjA7CisgICAgc2VjdGlvbi0+ZHVyYXRpb24gICA9IDEuMDsKK30KKworc3RhdGljIHZvaWQgYWNjdW11bGF0ZV9zdGF0cyhGSVJTVFBBU1NfU1RBVFMgKnNlY3Rpb24sIEZJUlNUUEFTU19TVEFUUyAqZnJhbWUpCit7CisgICAgc2VjdGlvbi0+ZnJhbWUgKz0gZnJhbWUtPmZyYW1lOworICAgIHNlY3Rpb24tPmludHJhX2Vycm9yICs9IGZyYW1lLT5pbnRyYV9lcnJvcjsKKyAgICBzZWN0aW9uLT5jb2RlZF9lcnJvciArPSBmcmFtZS0+Y29kZWRfZXJyb3I7CisgICAgc2VjdGlvbi0+c3NpbV93ZWlnaHRlZF9wcmVkX2VyciArPSBmcmFtZS0+c3NpbV93ZWlnaHRlZF9wcmVkX2VycjsKKyAgICBzZWN0aW9uLT5wY250X2ludGVyICArPSBmcmFtZS0+cGNudF9pbnRlcjsKKyAgICBzZWN0aW9uLT5wY250X21vdGlvbiArPSBmcmFtZS0+cGNudF9tb3Rpb247CisgICAgc2VjdGlvbi0+cGNudF9zZWNvbmRfcmVmICs9IGZyYW1lLT5wY250X3NlY29uZF9yZWY7CisgICAgc2VjdGlvbi0+cGNudF9uZXV0cmFsICs9IGZyYW1lLT5wY250X25ldXRyYWw7CisgICAgc2VjdGlvbi0+TVZyICAgICAgICArPSBmcmFtZS0+TVZyOworICAgIHNlY3Rpb24tPm12cl9hYnMgICAgICs9IGZyYW1lLT5tdnJfYWJzOworICAgIHNlY3Rpb24tPk1WYyAgICAgICAgKz0gZnJhbWUtPk1WYzsKKyAgICBzZWN0aW9uLT5tdmNfYWJzICAgICArPSBmcmFtZS0+bXZjX2FiczsKKyAgICBzZWN0aW9uLT5NVnJ2ICAgICAgICs9IGZyYW1lLT5NVnJ2OworICAgIHNlY3Rpb24tPk1WY3YgICAgICAgKz0gZnJhbWUtPk1WY3Y7CisgICAgc2VjdGlvbi0+bXZfaW5fb3V0X2NvdW50ICArPSBmcmFtZS0+bXZfaW5fb3V0X2NvdW50OworICAgIHNlY3Rpb24tPm5ld19tdl9jb3VudCArPSBmcmFtZS0+bmV3X212X2NvdW50OworICAgIHNlY3Rpb24tPmNvdW50ICAgICAgKz0gZnJhbWUtPmNvdW50OworICAgIHNlY3Rpb24tPmR1cmF0aW9uICAgKz0gZnJhbWUtPmR1cmF0aW9uOworfQorCitzdGF0aWMgdm9pZCBzdWJ0cmFjdF9zdGF0cyhGSVJTVFBBU1NfU1RBVFMgKnNlY3Rpb24sIEZJUlNUUEFTU19TVEFUUyAqZnJhbWUpCit7CisgICAgc2VjdGlvbi0+ZnJhbWUgLT0gZnJhbWUtPmZyYW1lOworICAgIHNlY3Rpb24tPmludHJhX2Vycm9yIC09IGZyYW1lLT5pbnRyYV9lcnJvcjsKKyAgICBzZWN0aW9uLT5jb2RlZF9lcnJvciAtPSBmcmFtZS0+Y29kZWRfZXJyb3I7CisgICAgc2VjdGlvbi0+c3NpbV93ZWlnaHRlZF9wcmVkX2VyciAtPSBmcmFtZS0+c3NpbV93ZWlnaHRlZF9wcmVkX2VycjsKKyAgICBzZWN0aW9uLT5wY250X2ludGVyICAtPSBmcmFtZS0+cGNudF9pbnRlcjsKKyAgICBzZWN0aW9uLT5wY250X21vdGlvbiAtPSBmcmFtZS0+cGNudF9tb3Rpb247CisgICAgc2VjdGlvbi0+cGNudF9zZWNvbmRfcmVmIC09IGZyYW1lLT5wY250X3NlY29uZF9yZWY7CisgICAgc2VjdGlvbi0+cGNudF9uZXV0cmFsIC09IGZyYW1lLT5wY250X25ldXRyYWw7CisgICAgc2VjdGlvbi0+TVZyICAgICAgICAtPSBmcmFtZS0+TVZyOworICAgIHNlY3Rpb24tPm12cl9hYnMgICAgIC09IGZyYW1lLT5tdnJfYWJzOworICAgIHNlY3Rpb24tPk1WYyAgICAgICAgLT0gZnJhbWUtPk1WYzsKKyAgICBzZWN0aW9uLT5tdmNfYWJzICAgICAtPSBmcmFtZS0+bXZjX2FiczsKKyAgICBzZWN0aW9uLT5NVnJ2ICAgICAgIC09IGZyYW1lLT5NVnJ2OworICAgIHNlY3Rpb24tPk1WY3YgICAgICAgLT0gZnJhbWUtPk1WY3Y7CisgICAgc2VjdGlvbi0+bXZfaW5fb3V0X2NvdW50ICAtPSBmcmFtZS0+bXZfaW5fb3V0X2NvdW50OworICAgIHNlY3Rpb24tPm5ld19tdl9jb3VudCAtPSBmcmFtZS0+bmV3X212X2NvdW50OworICAgIHNlY3Rpb24tPmNvdW50ICAgICAgLT0gZnJhbWUtPmNvdW50OworICAgIHNlY3Rpb24tPmR1cmF0aW9uICAgLT0gZnJhbWUtPmR1cmF0aW9uOworfQorCitzdGF0aWMgdm9pZCBhdmdfc3RhdHMoRklSU1RQQVNTX1NUQVRTICpzZWN0aW9uKQoreworICAgIGlmIChzZWN0aW9uLT5jb3VudCA8IDEuMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2VjdGlvbi0+aW50cmFfZXJyb3IgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+Y29kZWRfZXJyb3IgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+c3NpbV93ZWlnaHRlZF9wcmVkX2VyciAvPSBzZWN0aW9uLT5jb3VudDsKKyAgICBzZWN0aW9uLT5wY250X2ludGVyICAvPSBzZWN0aW9uLT5jb3VudDsKKyAgICBzZWN0aW9uLT5wY250X3NlY29uZF9yZWYgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+cGNudF9uZXV0cmFsIC89IHNlY3Rpb24tPmNvdW50OworICAgIHNlY3Rpb24tPnBjbnRfbW90aW9uIC89IHNlY3Rpb24tPmNvdW50OworICAgIHNlY3Rpb24tPk1WciAgICAgICAgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+bXZyX2FicyAgICAgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+TVZjICAgICAgICAvPSBzZWN0aW9uLT5jb3VudDsKKyAgICBzZWN0aW9uLT5tdmNfYWJzICAgICAvPSBzZWN0aW9uLT5jb3VudDsKKyAgICBzZWN0aW9uLT5NVnJ2ICAgICAgIC89IHNlY3Rpb24tPmNvdW50OworICAgIHNlY3Rpb24tPk1WY3YgICAgICAgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+bXZfaW5fb3V0X2NvdW50ICAgLz0gc2VjdGlvbi0+Y291bnQ7CisgICAgc2VjdGlvbi0+ZHVyYXRpb24gICAvPSBzZWN0aW9uLT5jb3VudDsKK30KKworLyogQ2FsY3VsYXRlIGEgbW9kaWZpZWQgRXJyb3IgdXNlZCBpbiBkaXN0cmlidXRpbmcgYml0cyBiZXR3ZWVuIGVhc2llcgorICogYW5kIGhhcmRlciBmcmFtZXMKKyAqLworc3RhdGljIGRvdWJsZSBjYWxjdWxhdGVfbW9kaWZpZWRfZXJyKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqdGhpc19mcmFtZSkKK3sKKyAgICBkb3VibGUgYXZfZXJyID0gKCBjcGktPnR3b3Bhc3MudG90YWxfc3RhdHMuc3NpbV93ZWlnaHRlZF9wcmVkX2VyciAvCisgICAgICAgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmNvdW50ICk7CisgICAgZG91YmxlIHRoaXNfZXJyID0gdGhpc19mcmFtZS0+c3NpbV93ZWlnaHRlZF9wcmVkX2VycjsKKyAgICBkb3VibGUgbW9kaWZpZWRfZXJyOworCisgICAgaWYgKHRoaXNfZXJyID4gYXZfZXJyKQorICAgICAgICBtb2RpZmllZF9lcnIgPSBhdl9lcnIgKiBwb3coKHRoaXNfZXJyIC8gRE9VQkxFX0RJVklERV9DSEVDSyhhdl9lcnIpKSwgUE9XMSk7CisgICAgZWxzZQorICAgICAgICBtb2RpZmllZF9lcnIgPSBhdl9lcnIgKiBwb3coKHRoaXNfZXJyIC8gRE9VQkxFX0RJVklERV9DSEVDSyhhdl9lcnIpKSwgUE9XMik7CisKKyAgICByZXR1cm4gbW9kaWZpZWRfZXJyOworfQorCitzdGF0aWMgY29uc3QgZG91YmxlIHdlaWdodF90YWJsZVsyNTZdID0geworMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLAorMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLAorMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLAorMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLAorMC4wMjAwMDAsIDAuMDMxMjUwLCAwLjA2MjUwMCwgMC4wOTM3NTAsIDAuMTI1MDAwLCAwLjE1NjI1MCwgMC4xODc1MDAsIDAuMjE4NzUwLAorMC4yNTAwMDAsIDAuMjgxMjUwLCAwLjMxMjUwMCwgMC4zNDM3NTAsIDAuMzc1MDAwLCAwLjQwNjI1MCwgMC40Mzc1MDAsIDAuNDY4NzUwLAorMC41MDAwMDAsIDAuNTMxMjUwLCAwLjU2MjUwMCwgMC41OTM3NTAsIDAuNjI1MDAwLCAwLjY1NjI1MCwgMC42ODc1MDAsIDAuNzE4NzUwLAorMC43NTAwMDAsIDAuNzgxMjUwLCAwLjgxMjUwMCwgMC44NDM3NTAsIDAuODc1MDAwLCAwLjkwNjI1MCwgMC45Mzc1MDAsIDAuOTY4NzUwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLAorMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwCit9OworCitzdGF0aWMgZG91YmxlIHNpbXBsZV93ZWlnaHQoWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UpCit7CisgICAgaW50IGksIGo7CisKKyAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2UtPnlfYnVmZmVyOworICAgIGRvdWJsZSBzdW1fd2VpZ2h0cyA9IDAuMDsKKworICAgIC8qIExvb3AgdGhyb3VnaHQgdGhlIFkgcGxhbmUgcmF3IGV4YW1pbmluZyBsZXZlbHMgYW5kIGNyZWF0aW5nIGEgd2VpZ2h0CisgICAgICogZm9yIHRoZSBpbWFnZQorICAgICAqLworICAgIGkgPSBzb3VyY2UtPnlfaGVpZ2h0OworICAgIGRvCisgICAgeworICAgICAgICBqID0gc291cmNlLT55X3dpZHRoOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBzdW1fd2VpZ2h0cyArPSB3ZWlnaHRfdGFibGVbICpzcmNdOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH13aGlsZSgtLWopOworICAgICAgICBzcmMgLT0gc291cmNlLT55X3dpZHRoOworICAgICAgICBzcmMgKz0gc291cmNlLT55X3N0cmlkZTsKKyAgICB9d2hpbGUoLS1pKTsKKworICAgIHN1bV93ZWlnaHRzIC89IChzb3VyY2UtPnlfaGVpZ2h0ICogc291cmNlLT55X3dpZHRoKTsKKworICAgIHJldHVybiBzdW1fd2VpZ2h0czsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgcGVyIGZyYW1lIG1heGltdW0gYml0cmF0ZSB0YXJnZXQgKi8KK3N0YXRpYyBpbnQgZnJhbWVfbWF4X2JpdHMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvKiBNYXggYWxsb2NhdGlvbiBmb3IgYSBzaW5nbGUgZnJhbWUgYmFzZWQgb24gdGhlIG1heCBzZWN0aW9uIGd1aWRlbGluZXMKKyAgICAgKiBwYXNzZWQgaW4gYW5kIGhvdyBtYW55IGJpdHMgYXJlIGxlZnQKKyAgICAgKi8KKyAgICBpbnQgbWF4X2JpdHM7CisKKyAgICAvKiBGb3IgQ0JSIHdlIG5lZWQgdG8gYWxzbyBjb25zaWRlciBidWZmZXIgZnVsbG5lc3MuCisgICAgICogSWYgd2UgYXJlIHJ1bm5pbmcgYmVsb3cgdGhlIG9wdGltYWwgbGV2ZWwgdGhlbiB3ZSBuZWVkIHRvIGdyYWR1YWxseQorICAgICAqIHRpZ2h0ZW4gdXAgb24gbWF4X2JpdHMuCisgICAgICovCisgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQorICAgIHsKKyAgICAgICAgZG91YmxlIGJ1ZmZlcl9mdWxsbmVzc19yYXRpbyA9IChkb3VibGUpY3BpLT5idWZmZXJfbGV2ZWwgLyBET1VCTEVfRElWSURFX0NIRUNLKChkb3VibGUpY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKTsKKworICAgICAgICAvKiBGb3IgQ0JSIGJhc2UgdGhpcyBvbiB0aGUgdGFyZ2V0IGF2ZXJhZ2UgYml0cyBwZXIgZnJhbWUgcGx1cyB0aGUKKyAgICAgICAgICogbWF4aW11bSBzZWRjdGlvbiByYXRlIHBhc3NlZCBpbiBieSB0aGUgdXNlcgorICAgICAgICAgKi8KKyAgICAgICAgbWF4X2JpdHMgPSAoaW50KShjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggKiAoKGRvdWJsZSljcGktPm94Y2YudHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24gLyAxMDAuMCkpOworCisgICAgICAgIC8qIElmIG91ciBidWZmZXIgaXMgYmVsb3cgdGhlIG9wdGltdW0gbGV2ZWwgKi8KKyAgICAgICAgaWYgKGJ1ZmZlcl9mdWxsbmVzc19yYXRpbyA8IDEuMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIGxvd2VyIG9mIG1heF9iaXRzIC8gNCBvciBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggLyA0LiAqLworICAgICAgICAgICAgaW50IG1pbl9tYXhfYml0cyA9ICgoY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoID4+IDIpIDwgKG1heF9iaXRzID4+IDIpKSA/IGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCA+PiAyIDogbWF4X2JpdHMgPj4gMjsKKworICAgICAgICAgICAgbWF4X2JpdHMgPSAoaW50KShtYXhfYml0cyAqIGJ1ZmZlcl9mdWxsbmVzc19yYXRpbyk7CisKKyAgICAgICAgICAgIC8qIExvd2VzdCB2YWx1ZSB3ZSB3aWxsIHNldCAuLi4gd2hpY2ggc2hvdWxkIGFsbG93IHRoZSBidWZmZXIgdG8KKyAgICAgICAgICAgICAqIHJlZmlsbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1heF9iaXRzIDwgbWluX21heF9iaXRzKQorICAgICAgICAgICAgICAgIG1heF9iaXRzID0gbWluX21heF9iaXRzOworICAgICAgICB9CisgICAgfQorICAgIC8qIFZCUiAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEZvciBWQlIgYmFzZSB0aGlzIG9uIHRoZSBiaXRzIGFuZCBmcmFtZXMgbGVmdCBwbHVzIHRoZQorICAgICAgICAgKiB0d29fcGFzc192YnJtYXhfc2VjdGlvbiByYXRlIHBhc3NlZCBpbiBieSB0aGUgdXNlcgorICAgICAgICAgKi8KKyAgICAgICAgbWF4X2JpdHMgPSAoaW50KSgoKGRvdWJsZSljcGktPnR3b3Bhc3MuYml0c19sZWZ0IC8gKGNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cy5jb3VudCAtIChkb3VibGUpY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSkpICogKChkb3VibGUpY3BpLT5veGNmLnR3b19wYXNzX3Zicm1heF9zZWN0aW9uIC8gMTAwLjApKTsKKyAgICB9CisKKyAgICAvKiBUcmFwIGNhc2Ugd2hlcmUgd2UgYXJlIG91dCBvZiBiaXRzICovCisgICAgaWYgKG1heF9iaXRzIDwgMCkKKyAgICAgICAgbWF4X2JpdHMgPSAwOworCisgICAgcmV0dXJuIG1heF9iaXRzOworfQorCit2b2lkIHZwOF9pbml0X2ZpcnN0X3Bhc3MoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICB6ZXJvX3N0YXRzKCZjcGktPnR3b3Bhc3MudG90YWxfc3RhdHMpOworfQorCit2b2lkIHZwOF9lbmRfZmlyc3RfcGFzcyhWUDhfQ09NUCAqY3BpKQoreworICAgIG91dHB1dF9zdGF0cyhjcGksIGNwaS0+b3V0cHV0X3BrdF9saXN0LCAmY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzKTsKK30KKworc3RhdGljIHZvaWQgenpfbW90aW9uX3NlYXJjaCggVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKiByYXdfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICogcmF3X21vdGlvbl9lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKiByZWNvbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKiBiZXN0X21vdGlvbl9lcnIsIGludCByZWNvbl95b2Zmc2V0KQoreworICAgIE1BQ1JPQkxPQ0tEICogY29uc3QgeGQgPSAmIHgtPmVfbWJkOworICAgIEJMT0NLICpiID0gJngtPmJsb2NrWzBdOworICAgIEJMT0NLRCAqZCA9ICZ4LT5lX21iZC5ibG9ja1swXTsKKworICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOworICAgIGludCBzcmNfc3RyaWRlID0gYi0+c3JjX3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpyYXdfcHRyOworICAgIGludCByYXdfc3RyaWRlID0gcmF3X2J1ZmZlci0+eV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cjsKKyAgICBpbnQgcmVmX3N0cmlkZSA9IHgtPmVfbWJkLnByZS55X3N0cmlkZTsKKworICAgIC8qIFNldCB1cCBwb2ludGVycyBmb3IgdGhpcyBtYWNybyBibG9jayByYXcgYnVmZmVyICovCisgICAgcmF3X3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKHJhd19idWZmZXItPnlfYnVmZmVyICsgcmVjb25feW9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGQtPm9mZnNldCk7CisgICAgdnA4X21zZTE2eDE2ICggc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmF3X3B0ciwgcmF3X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50ICopKHJhd19tb3Rpb25fZXJyKSk7CisKKyAgICAvKiBTZXQgdXAgcG9pbnRlcnMgZm9yIHRoaXMgbWFjcm8gYmxvY2sgcmVjb24gYnVmZmVyICovCisgICAgeGQtPnByZS55X2J1ZmZlciA9IHJlY29uX2J1ZmZlci0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OworICAgIHJlZl9wdHIgPSAodW5zaWduZWQgY2hhciAqKSh4ZC0+cHJlLnlfYnVmZmVyICsgZC0+b2Zmc2V0ICk7CisgICAgdnA4X21zZTE2eDE2ICggc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciwgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50ICopKGJlc3RfbW90aW9uX2VycikpOworfQorCitzdGF0aWMgdm9pZCBmaXJzdF9wYXNzX21vdGlvbl9zZWFyY2goVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfbXYgKnJlZl9tdiwgTVYgKmJlc3RfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpyZWNvbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiZXN0X21vdGlvbl9lcnIsIGludCByZWNvbl95b2Zmc2V0ICkKK3sKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmIHgtPmVfbWJkOworICAgIEJMT0NLICpiID0gJngtPmJsb2NrWzBdOworICAgIEJMT0NLRCAqZCA9ICZ4LT5lX21iZC5ibG9ja1swXTsKKyAgICBpbnQgbnVtMDA7CisKKyAgICBpbnRfbXYgdG1wX212OworICAgIGludF9tdiByZWZfbXZfZnVsbDsKKworICAgIGludCB0bXBfZXJyOworICAgIGludCBzdGVwX3BhcmFtID0gMzsgLyogRG9udCBzZWFyY2ggb3ZlciBmdWxsIHJhbmdlIGZvciBmaXJzdCBwYXNzICovCisgICAgaW50IGZ1cnRoZXJfc3RlcHMgPSAoTUFYX01WU0VBUkNIX1NURVBTIC0gMSkgLSBzdGVwX3BhcmFtOworICAgIGludCBuOworICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCB2X2ZuX3B0ciA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XTsKKyAgICBpbnQgbmV3X212X21vZGVfcGVuYWx0eSA9IDI1NjsKKworICAgIC8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhcmlhbmNlIGZ1bmN0aW9uIHRvIHVzZSBNU0UgKi8KKyAgICB2X2ZuX3B0ci52ZiAgICA9IHZwOF9tc2UxNngxNjsKKworICAgIC8qIFNldCB1cCBwb2ludGVycyBmb3IgdGhpcyBtYWNybyBibG9jayByZWNvbiBidWZmZXIgKi8KKyAgICB4ZC0+cHJlLnlfYnVmZmVyID0gcmVjb25fYnVmZmVyLT55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7CisKKyAgICAvKiBJbml0aWFsIHN0ZXAvZGlhbW9uZCBzZWFyY2ggY2VudHJlZCBvbiBiZXN0IG12ICovCisgICAgdG1wX212LmFzX2ludCA9IDA7CisgICAgcmVmX212X2Z1bGwuYXNfbXYuY29sID0gcmVmX212LT5hc19tdi5jb2w+PjM7CisgICAgcmVmX212X2Z1bGwuYXNfbXYucm93ID0gcmVmX212LT5hc19tdi5yb3c+PjM7CisgICAgdG1wX2VyciA9IGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkKHgsIGIsIGQsICZyZWZfbXZfZnVsbCwgJnRtcF9tdiwgc3RlcF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+c2FkcGVyYml0MTYsICZudW0wMCwgJnZfZm5fcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5tdmNvc3QsIHJlZl9tdik7CisgICAgaWYgKCB0bXBfZXJyIDwgSU5UX01BWC1uZXdfbXZfbW9kZV9wZW5hbHR5ICkKKyAgICAgICAgdG1wX2VyciArPSBuZXdfbXZfbW9kZV9wZW5hbHR5OworCisgICAgaWYgKHRtcF9lcnIgPCAqYmVzdF9tb3Rpb25fZXJyKQorICAgIHsKKyAgICAgICAgKmJlc3RfbW90aW9uX2VyciA9IHRtcF9lcnI7CisgICAgICAgIGJlc3RfbXYtPnJvdyA9IHRtcF9tdi5hc19tdi5yb3c7CisgICAgICAgIGJlc3RfbXYtPmNvbCA9IHRtcF9tdi5hc19tdi5jb2w7CisgICAgfQorCisgICAgLyogRnVydGhlciBzdGVwL2RpYW1vbmQgc2VhcmNoZXMgYXMgbmVjZXNzYXJ5ICovCisgICAgbiA9IG51bTAwOworICAgIG51bTAwID0gMDsKKworICAgIHdoaWxlIChuIDwgZnVydGhlcl9zdGVwcykKKyAgICB7CisgICAgICAgIG4rKzsKKworICAgICAgICBpZiAobnVtMDApCisgICAgICAgICAgICBudW0wMC0tOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcF9lcnIgPSBjcGktPmRpYW1vbmRfc2VhcmNoX3NhZCh4LCBiLCBkLCAmcmVmX212X2Z1bGwsICZ0bXBfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcF9wYXJhbSArIG4sIHgtPnNhZHBlcmJpdDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW0wMCwgJnZfZm5fcHRyLCB4LT5tdmNvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX212KTsKKyAgICAgICAgICAgIGlmICggdG1wX2VyciA8IElOVF9NQVgtbmV3X212X21vZGVfcGVuYWx0eSApCisgICAgICAgICAgICAgICAgdG1wX2VyciArPSBuZXdfbXZfbW9kZV9wZW5hbHR5OworCisgICAgICAgICAgICBpZiAodG1wX2VyciA8ICpiZXN0X21vdGlvbl9lcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmJlc3RfbW90aW9uX2VyciA9IHRtcF9lcnI7CisgICAgICAgICAgICAgICAgYmVzdF9tdi0+cm93ID0gdG1wX212LmFzX212LnJvdzsKKyAgICAgICAgICAgICAgICBiZXN0X212LT5jb2wgPSB0bXBfbXYuYXNfbXYuY29sOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZwOF9maXJzdF9wYXNzKFZQOF9DT01QICpjcGkpCit7CisgICAgaW50IG1iX3JvdywgbWJfY29sOworICAgIE1BQ1JPQkxPQ0sgKmNvbnN0IHggPSAmIGNwaS0+bWI7CisgICAgVlA4X0NPTU1PTiAqY29uc3QgY20gPSAmIGNwaS0+Y29tbW9uOworICAgIE1BQ1JPQkxPQ0tEICpjb25zdCB4ZCA9ICYgeC0+ZV9tYmQ7CisKKyAgICBpbnQgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQ7CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICpsc3RfeXYxMiA9ICZjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF07CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICpuZXdfeXYxMiA9ICZjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF07CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICpnbGRfeXYxMiA9ICZjbS0+eXYxMl9mYltjbS0+Z2xkX2ZiX2lkeF07CisgICAgaW50IHJlY29uX3lfc3RyaWRlID0gbHN0X3l2MTItPnlfc3RyaWRlOworICAgIGludCByZWNvbl91dl9zdHJpZGUgPSBsc3RfeXYxMi0+dXZfc3RyaWRlOworICAgIGludDY0X3QgaW50cmFfZXJyb3IgPSAwOworICAgIGludDY0X3QgY29kZWRfZXJyb3IgPSAwOworCisgICAgaW50IHN1bV9tdnIgPSAwLCBzdW1fbXZjID0gMDsKKyAgICBpbnQgc3VtX212cl9hYnMgPSAwLCBzdW1fbXZjX2FicyA9IDA7CisgICAgaW50IHN1bV9tdnJzID0gMCwgc3VtX212Y3MgPSAwOworICAgIGludCBtdmNvdW50ID0gMDsKKyAgICBpbnQgaW50ZXJjb3VudCA9IDA7CisgICAgaW50IHNlY29uZF9yZWZfY291bnQgPSAwOworICAgIGludCBpbnRyYXBlbmFsdHkgPSAyNTY7CisgICAgaW50IG5ldXRyYWxfY291bnQgPSAwOworICAgIGludCBuZXdfbXZfY291bnQgPSAwOworICAgIGludCBzdW1faW5fdmVjdG9ycyA9IDA7CisgICAgdWludDMyX3QgbGFzdG12X2FzX2ludCA9IDA7CisKKyAgICBpbnRfbXYgemVyb19yZWZfbXY7CisKKyAgICB6ZXJvX3JlZl9tdi5hc19pbnQgPSAwOworCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgeC0+c3JjID0gKiBjcGktPlNvdXJjZTsKKyAgICB4ZC0+cHJlID0gKmxzdF95djEyOworICAgIHhkLT5kc3QgPSAqbmV3X3l2MTI7CisKKyAgICB4LT5wYXJ0aXRpb25faW5mbyA9IHgtPnBpOworCisgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pOworCisgICAgaWYoIWNtLT51c2VfYmlsaW5lYXJfbWNfZmlsdGVyKQorICAgIHsKKyAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0ICAgICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDR4NDsKKyAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg0ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NDsKKyAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4ODsKKyAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTYgICA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2OworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDQ7CisgICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4NCAgICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NDsKKyAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4OworICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNjsKKyAgICAgfQorCisgICAgdnA4X2J1aWxkX2Jsb2NrX29mZnNldHMoeCk7CisKKyAgICAvKiBzZXQgdXAgZnJhbWUgbmV3IGZyYW1lIGZvciBpbnRyYSBjb2RlZCBibG9ja3MgKi8KKyAgICB2cDhfc2V0dXBfaW50cmFfcmVjb24obmV3X3l2MTIpOworICAgIHZwOGN4X2ZyYW1lX2luaXRfcXVhbnRpemVyKGNwaSk7CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBNViBjb3N0IHRhYmxlIHRvIHRoZSBkZWZhdWx0cyAqLworICAgIHsKKyAgICAgICAgaW50IGZsYWdbMl0gPSB7MSwgMX07CisgICAgICAgIHZwOF9pbml0aWFsaXplX3JkX2NvbnN0cyhjcGksIHZwOF9kY19xdWFudChjbS0+YmFzZV9xaW5kZXgsIGNtLT55MWRjX2RlbHRhX3EpKTsKKyAgICAgICAgdnB4X21lbWNweShjbS0+ZmMubXZjLCB2cDhfZGVmYXVsdF9tdl9jb250ZXh0LCBzaXplb2YodnA4X2RlZmF1bHRfbXZfY29udGV4dCkpOworICAgICAgICB2cDhfYnVpbGRfY29tcG9uZW50X2Nvc3RfdGFibGUoY3BpLT5tYi5tdmNvc3QsIChjb25zdCBNVl9DT05URVhUICopIGNtLT5mYy5tdmMsIGZsYWcpOworICAgIH0KKworICAgIC8qIGZvciBlYWNoIG1hY3JvYmxvY2sgcm93IGluIGltYWdlICovCisgICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCBjbS0+bWJfcm93czsgbWJfcm93KyspCisgICAgeworICAgICAgICBpbnRfbXYgYmVzdF9yZWZfbXY7CisKKyAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gMDsKKworICAgICAgICAvKiByZXNldCBhYm92ZSBibG9jayBjb2VmZnMgKi8KKyAgICAgICAgeGQtPnVwX2F2YWlsYWJsZSA9IChtYl9yb3cgIT0gMCk7CisgICAgICAgIHJlY29uX3lvZmZzZXQgPSAobWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNik7CisgICAgICAgIHJlY29uX3V2b2Zmc2V0ID0gKG1iX3JvdyAqIHJlY29uX3V2X3N0cmlkZSAqIDgpOworCisgICAgICAgIC8qIFNldCB1cCBsaW1pdCB2YWx1ZXMgZm9yIG1vdGlvbiB2ZWN0b3JzIHRvIHByZXZlbnQgdGhlbSBleHRlbmRpbmcKKyAgICAgICAgICogb3V0c2lkZSB0aGUgVU1WIGJvcmRlcnMKKyAgICAgICAgICovCisgICAgICAgIHgtPm12X3Jvd19taW4gPSAtKChtYl9yb3cgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNikpOworICAgICAgICB4LT5tdl9yb3dfbWF4ID0gKChjbS0+bWJfcm93cyAtIDEgLSBtYl9yb3cpICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpOworCisKKyAgICAgICAgLyogZm9yIGVhY2ggbWFjcm9ibG9jayBjb2wgaW4gaW1hZ2UgKi8KKyAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0aGlzX2Vycm9yOworICAgICAgICAgICAgaW50IGdmX21vdGlvbl9lcnJvciA9IElOVF9NQVg7CisgICAgICAgICAgICBpbnQgdXNlX2RjX3ByZWQgPSAobWJfY29sIHx8IG1iX3JvdykgJiYgKCFtYl9jb2wgfHwgIW1iX3Jvdyk7CisKKyAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgPSBuZXdfeXYxMi0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OworICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciA9IG5ld195djEyLT51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICAgICAgeGQtPmRzdC52X2J1ZmZlciA9IG5ld195djEyLT52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OworICAgICAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gKG1iX2NvbCAhPSAwKTsKKworICAgICAgICAgICAgLyogQ29weSBjdXJyZW50IG1iIHRvIGEgYnVmZmVyICovCisgICAgICAgICAgICB2cDhfY29weV9tZW0xNngxNih4LT5zcmMueV9idWZmZXIsIHgtPnNyYy55X3N0cmlkZSwgeC0+dGhpc21iLCAxNik7CisKKyAgICAgICAgICAgIC8qIGRvIGludHJhIDE2eDE2IHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIHRoaXNfZXJyb3IgPSB2cDhfZW5jb2RlX2ludHJhKGNwaSwgeCwgdXNlX2RjX3ByZWQpOworCisgICAgICAgICAgICAvKiAiaW50cmFwZW5hbHR5IiBiZWxvdyBkZWFscyB3aXRoIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGludHJhCisgICAgICAgICAgICAgKiBhbmQgaW50ZXIgZXJyb3Igc2NvcmVzIGFyZSB2ZXJ5IGxvdyAoZWcgYSBwbGFpbiBibGFjayBmcmFtZSkKKyAgICAgICAgICAgICAqIFdlIGRvIG5vdCBoYXZlIHNwZWNpYWwgY2FzZXMgaW4gZmlyc3QgcGFzcyBmb3IgMCwwIGFuZAorICAgICAgICAgICAgICogbmVhcmVzdCBldGMgc28gYWxsIGludGVyIG1vZGVzIGNhcnJ5IGFuIG92ZXJoZWFkIGNvc3QKKyAgICAgICAgICAgICAqIGVzdGltYXRlIGZvdCB0aGUgbXYuIFdoZW4gdGhlIGVycm9yIHNjb3JlIGlzIHZlcnkgbG93IHRoaXMKKyAgICAgICAgICAgICAqIGNhdXNlcyB1cyB0byBwaWNrIGFsbCBvciBsb3RzIG9mIElOVFJBIG1vZGVzIGFuZCB0aHJvdyBsb3RzCisgICAgICAgICAgICAgKiBvZiBrZXkgZnJhbWVzLiBUaGlzIHBlbmFsdHkgYWRkcyBhIGNvc3QgbWF0Y2hpbmcgdGhhdCBvZiBhCisgICAgICAgICAgICAgKiAwLDAgbXYgdG8gdGhlIGludHJhIGNhc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRoaXNfZXJyb3IgKz0gaW50cmFwZW5hbHR5OworCisgICAgICAgICAgICAvKiBDdW11bGF0aXZlIGludHJhIGVycm9yIHRvdGFsICovCisgICAgICAgICAgICBpbnRyYV9lcnJvciArPSAoaW50NjRfdCl0aGlzX2Vycm9yOworCisgICAgICAgICAgICAvKiBTZXQgdXAgbGltaXQgdmFsdWVzIGZvciBtb3Rpb24gdmVjdG9ycyB0byBwcmV2ZW50IHRoZW0KKyAgICAgICAgICAgICAqIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBVTVYgYm9yZGVycworICAgICAgICAgICAgICovCisgICAgICAgICAgICB4LT5tdl9jb2xfbWluID0gLSgobWJfY29sICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpKTsKKyAgICAgICAgICAgIHgtPm12X2NvbF9tYXggPSAoKGNtLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNik7CisKKyAgICAgICAgICAgIC8qIE90aGVyIHRoYW4gZm9yIHRoZSBmaXJzdCBmcmFtZSBkbyBhIG1vdGlvbiBzZWFyY2ggKi8KKyAgICAgICAgICAgIGlmIChjbS0+Y3VycmVudF92aWRlb19mcmFtZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkxPQ0tEICpkID0gJngtPmVfbWJkLmJsb2NrWzBdOworICAgICAgICAgICAgICAgIE1WIHRtcF9tdiA9IHswLCAwfTsKKyAgICAgICAgICAgICAgICBpbnQgdG1wX2VycjsKKyAgICAgICAgICAgICAgICBpbnQgbW90aW9uX2Vycm9yID0gSU5UX01BWDsKKyAgICAgICAgICAgICAgICBpbnQgcmF3X21vdGlvbl9lcnJvciA9IElOVF9NQVg7CisKKyAgICAgICAgICAgICAgICAvKiBTaW1wbGUgMCwwIG1vdGlvbiB3aXRoIG5vIG12IG92ZXJoZWFkICovCisgICAgICAgICAgICAgICAgenpfbW90aW9uX3NlYXJjaCggY3BpLCB4LCBjcGktPmxhc3RfZnJhbWVfdW5zY2FsZWRfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXdfbW90aW9uX2Vycm9yLCBsc3RfeXYxMiwgJm1vdGlvbl9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbl95b2Zmc2V0ICk7CisgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA9IDA7CisgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LmNvbCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocmF3X21vdGlvbl9lcnJvciA8IGNwaS0+b3hjZi5lbmNvZGVfYnJlYWtvdXQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9tb3Rpb25fc2VhcmNoOworCisgICAgICAgICAgICAgICAgLyogVGVzdCBsYXN0IHJlZmVyZW5jZSBmcmFtZSB1c2luZyB0aGUgcHJldmlvdXMgYmVzdCBtdiBhcyB0aGUKKyAgICAgICAgICAgICAgICAgKiBzdGFydGluZyBwb2ludCAoYmVzdCByZWZlcmVuY2UpIGZvciB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZmlyc3RfcGFzc19tb3Rpb25fc2VhcmNoKGNwaSwgeCwgJmJlc3RfcmVmX212LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5ibWkubXYuYXNfbXYsIGxzdF95djEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb25fZXJyb3IsIHJlY29uX3lvZmZzZXQpOworCisgICAgICAgICAgICAgICAgLyogSWYgdGhlIGN1cnJlbnQgYmVzdCByZWZlcmVuY2UgbXYgaXMgbm90IGNlbnRyZWQgb24gMCwwCisgICAgICAgICAgICAgICAgICogdGhlbiBkbyBhIDAsMCBiYXNlZCBzZWFyY2ggYXMgd2VsbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChiZXN0X3JlZl9tdi5hc19pbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHRtcF9lcnIgPSBJTlRfTUFYOworICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfbW90aW9uX3NlYXJjaChjcGksIHgsICZ6ZXJvX3JlZl9tdiwgJnRtcF9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RfeXYxMiwgJnRtcF9lcnIsIHJlY29uX3lvZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgaWYgKCB0bXBfZXJyIDwgbW90aW9uX2Vycm9yICkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fZXJyb3IgPSB0bXBfZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA9IHRtcF9tdi5yb3c7CisgICAgICAgICAgICAgICAgICAgICAgICBkLT5ibWkubXYuYXNfbXYuY29sID0gdG1wX212LmNvbDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRXhwZXJpbWVudGFsIHNlYXJjaCBpbiBhIHNlY29uZCByZWZlcmVuY2UgZnJhbWUgKCgwLDApCisgICAgICAgICAgICAgICAgICogYmFzZWQgb25seSkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfcGFzc19tb3Rpb25fc2VhcmNoKGNwaSwgeCwgJnplcm9fcmVmX212LCAmdG1wX212LCBnbGRfeXYxMiwgJmdmX21vdGlvbl9lcnJvciwgcmVjb25feW9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChnZl9tb3Rpb25fZXJyb3IgPCBtb3Rpb25fZXJyb3IpICYmIChnZl9tb3Rpb25fZXJyb3IgPCB0aGlzX2Vycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3JlZl9jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdG8gbGFzdCBmcmFtZSBhcyByZWZlcmVuY2UgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBsc3RfeXYxMi0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlLnVfYnVmZmVyID0gbHN0X3l2MTItPnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHhkLT5wcmUudl9idWZmZXIgPSBsc3RfeXYxMi0+dl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKK3NraXBfbW90aW9uX3NlYXJjaDoKKyAgICAgICAgICAgICAgICAvKiBJbnRyYSBhc3N1bWVkIGJlc3QgKi8KKyAgICAgICAgICAgICAgICBiZXN0X3JlZl9tdi5hc19pbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKG1vdGlvbl9lcnJvciA8PSB0aGlzX2Vycm9yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogS2VlcCBhIGNvdW50IG9mIGNhc2VzIHdoZXJlIHRoZSBpbnRlciBhbmQgaW50cmEgd2VyZQorICAgICAgICAgICAgICAgICAgICAgKiB2ZXJ5IGNsb3NlIGFuZCB2ZXJ5IGxvdy4gVGhpcyBoZWxwcyB3aXRoIHNjZW5lIGN1dAorICAgICAgICAgICAgICAgICAgICAgKiBkZXRlY3Rpb24gZm9yIGV4YW1wbGUgaW4gY3JvcHBlZCBjbGlwcyB3aXRoIGJsYWNrIGJhcnMKKyAgICAgICAgICAgICAgICAgICAgICogYXQgdGhlIHNpZGVzIG9yIHRvcCBhbmQgYm90dG9tLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoICgoKHRoaXNfZXJyb3ItaW50cmFwZW5hbHR5KSAqIDkpIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdGlvbl9lcnJvcioxMCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAodGhpc19lcnJvciA8ICgyKmludHJhcGVuYWx0eSkpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV1dHJhbF9jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA8PD0gMzsKKyAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LmNvbCA8PD0gMzsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19lcnJvciA9IG1vdGlvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgdnA4X3NldF9tYm1vZGVfYW5kX212cyh4LCBORVdNViwgJmQtPmJtaS5tdik7CisgICAgICAgICAgICAgICAgICAgIHZwOF9lbmNvZGVfaW50ZXIxNngxNnkoeCk7CisgICAgICAgICAgICAgICAgICAgIHN1bV9tdnIgKz0gZC0+Ym1pLm12LmFzX212LnJvdzsKKyAgICAgICAgICAgICAgICAgICAgc3VtX212cl9hYnMgKz0gYWJzKGQtPmJtaS5tdi5hc19tdi5yb3cpOworICAgICAgICAgICAgICAgICAgICBzdW1fbXZjICs9IGQtPmJtaS5tdi5hc19tdi5jb2w7CisgICAgICAgICAgICAgICAgICAgIHN1bV9tdmNfYWJzICs9IGFicyhkLT5ibWkubXYuYXNfbXYuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgc3VtX212cnMgKz0gZC0+Ym1pLm12LmFzX212LnJvdyAqIGQtPmJtaS5tdi5hc19tdi5yb3c7CisgICAgICAgICAgICAgICAgICAgIHN1bV9tdmNzICs9IGQtPmJtaS5tdi5hc19tdi5jb2wgKiBkLT5ibWkubXYuYXNfbXYuY29sOworICAgICAgICAgICAgICAgICAgICBpbnRlcmNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gZC0+Ym1pLm12LmFzX2ludDsKKworICAgICAgICAgICAgICAgICAgICAvKiBXYXMgdGhlIHZlY3RvciBub24temVybyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZC0+Ym1pLm12LmFzX2ludCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbXZjb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXMgaXQgZGlmZmVyZW50IGZyb20gdGhlIGxhc3Qgbm9uIHplcm8gdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGQtPmJtaS5tdi5hc19pbnQgIT0gbGFzdG12X2FzX2ludCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X212X2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0bXZfYXNfaW50ID0gZC0+Ym1pLm12LmFzX2ludDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyB0aGUgUm93IHZlY3RvciBwb2ludCBpbndhcmRzIG9yIG91dHdhcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfcm93IDwgY20tPm1iX3Jvd3MgLyAyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5ibWkubXYuYXNfbXYucm93ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2luX3ZlY3RvcnMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkLT5ibWkubXYuYXNfbXYucm93IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2luX3ZlY3RvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1iX3JvdyA+IGNtLT5tYl9yb3dzIC8gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC0+Ym1pLm12LmFzX212LnJvdyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9pbl92ZWN0b3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZC0+Ym1pLm12LmFzX212LnJvdyA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9pbl92ZWN0b3JzLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgdGhlIFJvdyB2ZWN0b3IgcG9pbnQgaW53YXJkcyBvciBvdXR3YXJkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX2NvbCA8IGNtLT5tYl9jb2xzIC8gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC0+Ym1pLm12LmFzX212LmNvbCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9pbl92ZWN0b3JzLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZC0+Ym1pLm12LmFzX212LmNvbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9pbl92ZWN0b3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYl9jb2wgPiBjbS0+bWJfY29scyAvIDIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQtPmJtaS5tdi5hc19tdi5jb2wgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1faW5fdmVjdG9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQtPmJtaS5tdi5hc19tdi5jb2wgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1faW5fdmVjdG9ycy0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb2RlZF9lcnJvciArPSAoaW50NjRfdCl0aGlzX2Vycm9yOworCisgICAgICAgICAgICAvKiBhZGp1c3QgdG8gdGhlIG5leHQgY29sdW1uIG9mIG1hY3JvYmxvY2tzICovCisgICAgICAgICAgICB4LT5zcmMueV9idWZmZXIgKz0gMTY7CisgICAgICAgICAgICB4LT5zcmMudV9idWZmZXIgKz0gODsKKyAgICAgICAgICAgIHgtPnNyYy52X2J1ZmZlciArPSA4OworCisgICAgICAgICAgICByZWNvbl95b2Zmc2V0ICs9IDE2OworICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQgKz0gODsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFkanVzdCB0byB0aGUgbmV4dCByb3cgb2YgbWJzICovCisgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAtIDE2ICogY20tPm1iX2NvbHM7CisgICAgICAgIHgtPnNyYy51X2J1ZmZlciArPSA4ICogeC0+c3JjLnV2X3N0cmlkZSAtIDggKiBjbS0+bWJfY29sczsKKyAgICAgICAgeC0+c3JjLnZfYnVmZmVyICs9IDggKiB4LT5zcmMudXZfc3RyaWRlIC0gOCAqIGNtLT5tYl9jb2xzOworCisgICAgICAgIC8qIGV4dGVuZCB0aGUgcmVjb24gZm9yIGludHJhIHByZWRpY3Rpb24gKi8KKyAgICAgICAgdnA4X2V4dGVuZF9tYl9yb3cobmV3X3l2MTIsIHhkLT5kc3QueV9idWZmZXIgKyAxNiwgeGQtPmRzdC51X2J1ZmZlciArIDgsIHhkLT5kc3Qudl9idWZmZXIgKyA4KTsKKyAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworICAgIH0KKworICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKyAgICB7CisgICAgICAgIGRvdWJsZSB3ZWlnaHQgPSAwLjA7CisKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTIGZwczsKKworICAgICAgICBmcHMuZnJhbWUgICAgICA9IGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lIDsKKyAgICAgICAgZnBzLmludHJhX2Vycm9yID0gKGRvdWJsZSkoaW50cmFfZXJyb3IgPj4gOCk7CisgICAgICAgIGZwcy5jb2RlZF9lcnJvciA9IChkb3VibGUpKGNvZGVkX2Vycm9yID4+IDgpOworICAgICAgICB3ZWlnaHQgPSBzaW1wbGVfd2VpZ2h0KGNwaS0+U291cmNlKTsKKworCisgICAgICAgIGlmICh3ZWlnaHQgPCAwLjEpCisgICAgICAgICAgICB3ZWlnaHQgPSAwLjE7CisKKyAgICAgICAgZnBzLnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnIgPSBmcHMuY29kZWRfZXJyb3IgKiB3ZWlnaHQ7CisKKyAgICAgICAgZnBzLnBjbnRfaW50ZXIgID0gMC4wOworICAgICAgICBmcHMucGNudF9tb3Rpb24gPSAwLjA7CisgICAgICAgIGZwcy5NVnIgICAgICAgID0gMC4wOworICAgICAgICBmcHMubXZyX2FicyAgICAgPSAwLjA7CisgICAgICAgIGZwcy5NVmMgICAgICAgID0gMC4wOworICAgICAgICBmcHMubXZjX2FicyAgICAgPSAwLjA7CisgICAgICAgIGZwcy5NVnJ2ICAgICAgID0gMC4wOworICAgICAgICBmcHMuTVZjdiAgICAgICA9IDAuMDsKKyAgICAgICAgZnBzLm12X2luX291dF9jb3VudCAgPSAwLjA7CisgICAgICAgIGZwcy5uZXdfbXZfY291bnQgPSAwLjA7CisgICAgICAgIGZwcy5jb3VudCAgICAgID0gMS4wOworCisgICAgICAgIGZwcy5wY250X2ludGVyICAgPSAxLjAgKiAoZG91YmxlKWludGVyY291bnQgLyBjbS0+TUJzOworICAgICAgICBmcHMucGNudF9zZWNvbmRfcmVmID0gMS4wICogKGRvdWJsZSlzZWNvbmRfcmVmX2NvdW50IC8gY20tPk1CczsKKyAgICAgICAgZnBzLnBjbnRfbmV1dHJhbCA9IDEuMCAqIChkb3VibGUpbmV1dHJhbF9jb3VudCAvIGNtLT5NQnM7CisKKyAgICAgICAgaWYgKG12Y291bnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmcHMuTVZyID0gKGRvdWJsZSlzdW1fbXZyIC8gKGRvdWJsZSltdmNvdW50OworICAgICAgICAgICAgZnBzLm12cl9hYnMgPSAoZG91YmxlKXN1bV9tdnJfYWJzIC8gKGRvdWJsZSltdmNvdW50OworICAgICAgICAgICAgZnBzLk1WYyA9IChkb3VibGUpc3VtX212YyAvIChkb3VibGUpbXZjb3VudDsKKyAgICAgICAgICAgIGZwcy5tdmNfYWJzID0gKGRvdWJsZSlzdW1fbXZjX2FicyAvIChkb3VibGUpbXZjb3VudDsKKyAgICAgICAgICAgIGZwcy5NVnJ2ID0gKChkb3VibGUpc3VtX212cnMgLSAoZnBzLk1WciAqIGZwcy5NVnIgLyAoZG91YmxlKW12Y291bnQpKSAvIChkb3VibGUpbXZjb3VudDsKKyAgICAgICAgICAgIGZwcy5NVmN2ID0gKChkb3VibGUpc3VtX212Y3MgLSAoZnBzLk1WYyAqIGZwcy5NVmMgLyAoZG91YmxlKW12Y291bnQpKSAvIChkb3VibGUpbXZjb3VudDsKKyAgICAgICAgICAgIGZwcy5tdl9pbl9vdXRfY291bnQgPSAoZG91YmxlKXN1bV9pbl92ZWN0b3JzIC8gKGRvdWJsZSkobXZjb3VudCAqIDIpOworICAgICAgICAgICAgZnBzLm5ld19tdl9jb3VudCA9IG5ld19tdl9jb3VudDsKKworICAgICAgICAgICAgZnBzLnBjbnRfbW90aW9uID0gMS4wICogKGRvdWJsZSltdmNvdW50IC8gY3BpLT5jb21tb24uTUJzOworICAgICAgICB9CisKKyAgICAgICAgLyogVE9ETzogIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGR1cmF0aW9uIGlzIHNldCB0byAwLCBvciBzb21ldGhpbmcgbGVzcworICAgICAgICAgKiB0aGFuIHRoZSBmdWxsIHRpbWUgYmV0d2VlbiBzdWJzZXF1ZW50IGNwaS0+c291cmNlX3RpbWVfc3RhbXBzCisgICAgICAgICAqLworICAgICAgICBmcHMuZHVyYXRpb24gPSAoZG91YmxlKShjcGktPnNvdXJjZS0+dHNfZW5kCisgICAgICAgICAgICAgICAgICAgICAgIC0gY3BpLT5zb3VyY2UtPnRzX3N0YXJ0KTsKKworICAgICAgICAvKiBkb24ndCB3YW50IHRvIGRvIG91dHB1dCBzdGF0cyB3aXRoIGEgc3RhY2sgdmFyaWFibGUhICovCisgICAgICAgIG1lbWNweSgmY3BpLT50d29wYXNzLnRoaXNfZnJhbWVfc3RhdHMsCisgICAgICAgICAgICAgICAmZnBzLAorICAgICAgICAgICAgICAgc2l6ZW9mKEZJUlNUUEFTU19TVEFUUykpOworICAgICAgICBvdXRwdXRfc3RhdHMoY3BpLCBjcGktPm91dHB1dF9wa3RfbGlzdCwgJmNwaS0+dHdvcGFzcy50aGlzX2ZyYW1lX3N0YXRzKTsKKyAgICAgICAgYWNjdW11bGF0ZV9zdGF0cygmY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLCAmZnBzKTsKKyAgICB9CisKKyAgICAvKiBDb3B5IHRoZSBwcmV2aW91cyBMYXN0IEZyYW1lIGludG8gdGhlIEdGIGJ1ZmZlciBpZiBzcGVjaWZpYworICAgICAqIGNvbmRpdGlvbnMgZm9yIGRvaW5nIHNvIGFyZSBtZXQKKyAgICAgKi8KKyAgICBpZiAoKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID4gMCkgJiYKKyAgICAgICAgKGNwaS0+dHdvcGFzcy50aGlzX2ZyYW1lX3N0YXRzLnBjbnRfaW50ZXIgPiAwLjIwKSAmJgorICAgICAgICAoKGNwaS0+dHdvcGFzcy50aGlzX2ZyYW1lX3N0YXRzLmludHJhX2Vycm9yIC8gY3BpLT50d29wYXNzLnRoaXNfZnJhbWVfc3RhdHMuY29kZWRfZXJyb3IpID4gMi4wKSkKKyAgICB7CisgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWUobHN0X3l2MTIsIGdsZF95djEyKTsKKyAgICB9CisKKyAgICAvKiBzd2FwIGZyYW1lIHBvaW50ZXJzIHNvIGxhc3QgZnJhbWUgcmVmZXJzIHRvIHRoZSBmcmFtZSB3ZSBqdXN0CisgICAgICogY29tcHJlc3NlZAorICAgICAqLworICAgIHZwOF9zd2FwX3l2MTJfYnVmZmVyKGxzdF95djEyLCBuZXdfeXYxMik7CisgICAgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMobHN0X3l2MTIpOworCisgICAgLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgZmlyc3QgZnJhbWUuIENvcHkgaW50byB0aGUgR0YgYnVmZmVyIGFzIGEKKyAgICAgKiBzZWNvbmQgcmVmZXJlbmNlLgorICAgICAqLworICAgIGlmIChjbS0+Y3VycmVudF92aWRlb19mcmFtZSA9PSAwKQorICAgIHsKKyAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZShsc3RfeXYxMiwgZ2xkX3l2MTIpOworICAgIH0KKworCisgICAgLyogdXNlIHRoaXMgdG8gc2VlIHdoYXQgdGhlIGZpcnN0IHBhc3MgcmVjb25zdHJ1Y3Rpb24gbG9va3MgbGlrZSAqLworICAgIGlmICgwKQorICAgIHsKKyAgICAgICAgY2hhciBmaWxlbmFtZVs1MTJdOworICAgICAgICBGSUxFICpyZWNvbl9maWxlOworICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCAiZW5jJTA0ZC55dXYiLCAoaW50KSBjbS0+Y3VycmVudF92aWRlb19mcmFtZSk7CisKKyAgICAgICAgaWYgKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID09IDApCisgICAgICAgICAgICByZWNvbl9maWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWNvbl9maWxlID0gZm9wZW4oZmlsZW5hbWUsICJhYiIpOworCisgICAgICAgICh2b2lkKSBmd3JpdGUobHN0X3l2MTItPmJ1ZmZlcl9hbGxvYywgbHN0X3l2MTItPmZyYW1lX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgcmVjb25fZmlsZSk7CisgICAgICAgIGZjbG9zZShyZWNvbl9maWxlKTsKKyAgICB9CisKKyAgICBjbS0+Y3VycmVudF92aWRlb19mcmFtZSsrOworCit9CitleHRlcm4gY29uc3QgaW50IHZwOF9iaXRzX3Blcl9tYlsyXVtRSU5ERVhfUkFOR0VdOworCisvKiBFc3RpbWF0ZSBhIGNvc3QgcGVyIG1iIGF0dHJpYnV0YWJsZSB0byBvdmVyaGVhZHMgc3VjaCBhcyB0aGUgY29kaW5nIG9mCisgKiBtb2RlcyBhbmQgbW90aW9uIHZlY3RvcnMuCisgKiBDdXJyZW50bHkgc2ltcGxpc3RpYyBpbiBpdHMgYXNzdW1wdGlvbnMgZm9yIHRlc3RpbmcuCisgKi8KKworc3RhdGljIGRvdWJsZSBiaXRjb3N0KCBkb3VibGUgcHJvYiApCit7CisgICAgcmV0dXJuIC0obG9nKCBwcm9iICkgLyBsb2coIDIuMCApKTsKK30KK3N0YXRpYyBpbnQ2NF90IGVzdGltYXRlX21vZGVtdmNvc3QoVlA4X0NPTVAgKmNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVJTVFBBU1NfU1RBVFMgKiBmcHN0YXRzKQoreworICAgIGludCBtdl9jb3N0OworICAgIGludCBtb2RlX2Nvc3Q7CisKKyAgICBkb3VibGUgYXZfcGN0X2ludGVyID0gZnBzdGF0cy0+cGNudF9pbnRlciAvIGZwc3RhdHMtPmNvdW50OworICAgIGRvdWJsZSBhdl9wY3RfbW90aW9uID0gZnBzdGF0cy0+cGNudF9tb3Rpb24gLyBmcHN0YXRzLT5jb3VudDsKKyAgICBkb3VibGUgYXZfaW50cmEgPSAoMS4wIC0gYXZfcGN0X2ludGVyKTsKKworICAgIGRvdWJsZSB6el9jb3N0OworICAgIGRvdWJsZSBtb3Rpb25fY29zdDsKKyAgICBkb3VibGUgaW50cmFfY29zdDsKKworICAgIHp6X2Nvc3QgPSBiaXRjb3N0KGF2X3BjdF9pbnRlciAtIGF2X3BjdF9tb3Rpb24pOworICAgIG1vdGlvbl9jb3N0ID0gYml0Y29zdChhdl9wY3RfbW90aW9uKTsKKyAgICBpbnRyYV9jb3N0ID0gYml0Y29zdChhdl9pbnRyYSk7CisKKyAgICAvKiBFc3RpbWF0ZSBvZiBleHRyYSBiaXRzIHBlciBtdiBvdmVyaGVhZCBmb3IgbWJzCisgICAgICogPDwgOSBpcyB0aGUgbm9ybWFsaXphdGlvbiB0byB0aGUgKGJpdHMgKiA1MTIpIHVzZWQgaW4gdnA4X2JpdHNfcGVyX21iCisgICAgICovCisgICAgbXZfY29zdCA9ICgoaW50KShmcHN0YXRzLT5uZXdfbXZfY291bnQgLyBmcHN0YXRzLT5jb3VudCkgKiA4KSA8PCA5OworCisgICAgLyogQ3J1ZGUgZXN0aW1hdGUgb2Ygb3ZlcmhlYWQgY29zdCBmcm9tIG1vZGVzCisgICAgICogPDwgOSBpcyB0aGUgbm9ybWFsaXphdGlvbiB0byAoYml0cyAqIDUxMikgdXNlZCBpbiB2cDhfYml0c19wZXJfbWIKKyAgICAgKi8KKyAgICBtb2RlX2Nvc3QgPQorICAgICAgICAoaW50KSggKCAoKGF2X3BjdF9pbnRlciAtIGF2X3BjdF9tb3Rpb24pICogenpfY29zdCkgKworICAgICAgICAgICAgICAgICAoYXZfcGN0X21vdGlvbiAqIG1vdGlvbl9jb3N0KSArCisgICAgICAgICAgICAgICAgIChhdl9pbnRyYSAqIGludHJhX2Nvc3QpICkgKiBjcGktPmNvbW1vbi5NQnMgKSA8PCA5OworCisgICAgcmV0dXJuIG12X2Nvc3QgKyBtb2RlX2Nvc3Q7Cit9CisKK3N0YXRpYyBkb3VibGUgY2FsY19jb3JyZWN0aW9uX2ZhY3RvciggZG91YmxlIGVycl9wZXJfbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlcnJfZGV2aXNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB0X2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB0X2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBRICkKK3sKKyAgICBkb3VibGUgcG93ZXJfdGVybTsKKyAgICBkb3VibGUgZXJyb3JfdGVybSA9IGVycl9wZXJfbWIgLyBlcnJfZGV2aXNvcjsKKyAgICBkb3VibGUgY29ycmVjdGlvbl9mYWN0b3I7CisKKyAgICAvKiBBZGp1c3RtZW50IGJhc2VkIG9uIFEgdG8gcG93ZXIgdGVybS4gKi8KKyAgICBwb3dlcl90ZXJtID0gcHRfbG93ICsgKFEgKiAwLjAxKTsKKyAgICBwb3dlcl90ZXJtID0gKHBvd2VyX3Rlcm0gPiBwdF9oaWdoKSA/IHB0X2hpZ2ggOiBwb3dlcl90ZXJtOworCisgICAgLyogQWRqdXN0bWVudHMgdG8gZXJyb3IgdGVybSAqLworICAgIC8qIFRCRCAqLworCisgICAgLyogQ2FsY3VsYXRlIGNvcnJlY3Rpb24gZmFjdG9yICovCisgICAgY29ycmVjdGlvbl9mYWN0b3IgPSBwb3coZXJyb3JfdGVybSwgcG93ZXJfdGVybSk7CisKKyAgICAvKiBDbGlwIHJhbmdlICovCisgICAgY29ycmVjdGlvbl9mYWN0b3IgPQorICAgICAgICAoY29ycmVjdGlvbl9mYWN0b3IgPCAwLjA1KQorICAgICAgICAgICAgPyAwLjA1IDogKGNvcnJlY3Rpb25fZmFjdG9yID4gNS4wKSA/IDUuMCA6IGNvcnJlY3Rpb25fZmFjdG9yOworCisgICAgcmV0dXJuIGNvcnJlY3Rpb25fZmFjdG9yOworfQorCitzdGF0aWMgaW50IGVzdGltYXRlX21heF9xKFZQOF9DT01QICpjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJUlNUUEFTU19TVEFUUyAqIGZwc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVyaGVhZF9iaXRzICkKK3sKKyAgICBpbnQgUTsKKyAgICBpbnQgbnVtX21icyA9IGNwaS0+Y29tbW9uLk1CczsKKyAgICBpbnQgdGFyZ2V0X25vcm1fYml0c19wZXJfbWI7CisKKyAgICBkb3VibGUgc2VjdGlvbl9lcnIgPSAoZnBzdGF0cy0+Y29kZWRfZXJyb3IgLyBmcHN0YXRzLT5jb3VudCk7CisgICAgZG91YmxlIGVycl9wZXJfbWIgPSBzZWN0aW9uX2VyciAvIG51bV9tYnM7CisgICAgZG91YmxlIGVycl9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICBkb3VibGUgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDsKKyAgICBpbnQgb3ZlcmhlYWRfYml0c19wZXJfbWI7CisKKyAgICBpZiAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIDw9IDApCisgICAgICAgIHJldHVybiBjcGktPnR3b3Bhc3MubWF4cV9tYXhfbGltaXQ7ICAgICAgIC8qIEhpZ2hlc3QgdmFsdWUgYWxsb3dlZCAqLworCisgICAgdGFyZ2V0X25vcm1fYml0c19wZXJfbWIgPQorICAgICAgICAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIDwgKDEgPDwgMjApKQorICAgICAgICAgICAgPyAoNTEyICogc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoKSAvIG51bV9tYnMKKyAgICAgICAgICAgIDogNTEyICogKHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCAvIG51bV9tYnMpOworCisgICAgLyogQ2FsY3VsYXRlIGEgY29ycmVjdGl2ZSBmYWN0b3IgYmFzZWQgb24gYSByb2xsaW5nIHJhdGlvIG9mIGJpdHMgc3BlbnQKKyAgICAgKiB2cyB0YXJnZXQgYml0cworICAgICAqLworICAgIGlmICgoY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzID4gMCkgJiYKKyAgICAgICAgKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPCBjcGktPndvcnN0X3F1YWxpdHkpKQorICAgIHsKKyAgICAgICAgZG91YmxlIHJvbGxpbmdfcmF0aW87CisKKyAgICAgICAgcm9sbGluZ19yYXRpbyA9IChkb3VibGUpY3BpLT5yb2xsaW5nX2FjdHVhbF9iaXRzIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzOworCisgICAgICAgIGlmIChyb2xsaW5nX3JhdGlvIDwgMC45NSkKKyAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciAtPSAwLjAwNTsKKyAgICAgICAgZWxzZSBpZiAocm9sbGluZ19yYXRpbyA+IDEuMDUpCisgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgKz0gMC4wMDU7CisKKyAgICAgICAgY3BpLT50d29wYXNzLmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yID0KKyAgICAgICAgICAgIChjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgPCAwLjEpCisgICAgICAgICAgICAgICAgPyAwLjEKKyAgICAgICAgICAgICAgICA6IChjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgPiAxMC4wKQorICAgICAgICAgICAgICAgICAgICA/IDEwLjAgOiBjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3I7CisgICAgfQorCisgICAgLyogQ29ycmVjdGlvbnMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBzcGVlZCBzZXR0aW5ncworICAgICAqIChyZWR1Y2VkIGNvbXByZXNzaW9uIGV4cGVjdGVkKQorICAgICAqLworICAgIGlmICgoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDMpIHx8IChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMSkpCisgICAgeworICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkIDw9IDUpCisgICAgICAgICAgICBzcGVlZF9jb3JyZWN0aW9uID0gMS4wNCArIChjcGktPm94Y2YuY3B1X3VzZWQgKiAwLjA0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3BlZWRfY29ycmVjdGlvbiA9IDEuMjU7CisgICAgfQorCisgICAgLyogRXN0aW1hdGUgb2Ygb3ZlcmhlYWQgYml0cyBwZXIgbWIgKi8KKyAgICAvKiBDb3JyZWN0aW9uIHRvIG92ZXJoZWFkIGJpdHMgZm9yIG1pbiBhbGxvd2VkIFEuICovCisgICAgb3ZlcmhlYWRfYml0c19wZXJfbWIgPSBvdmVyaGVhZF9iaXRzIC8gbnVtX21iczsKKyAgICBvdmVyaGVhZF9iaXRzX3Blcl9tYiA9IChpbnQpKG92ZXJoZWFkX2JpdHNfcGVyX21iICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3coIDAuOTgsIChkb3VibGUpY3BpLT50d29wYXNzLm1heHFfbWluX2xpbWl0ICkpOworCisgICAgLyogVHJ5IGFuZCBwaWNrIGEgbWF4IFEgdGhhdCB3aWxsIGJlIGhpZ2ggZW5vdWdoIHRvIGVuY29kZSB0aGUKKyAgICAgKiBjb250ZW50IGF0IHRoZSBnaXZlbiByYXRlLgorICAgICAqLworICAgIGZvciAoUSA9IGNwaS0+dHdvcGFzcy5tYXhxX21pbl9saW1pdDsgUSA8IGNwaS0+dHdvcGFzcy5tYXhxX21heF9saW1pdDsgUSsrKQorICAgIHsKKyAgICAgICAgaW50IGJpdHNfcGVyX21iX2F0X3RoaXNfcTsKKworICAgICAgICAvKiBFcnJvciBwZXIgTUIgYmFzZWQgY29ycmVjdGlvbiBmYWN0b3IgKi8KKyAgICAgICAgZXJyX2NvcnJlY3Rpb25fZmFjdG9yID0KKyAgICAgICAgICAgIGNhbGNfY29ycmVjdGlvbl9mYWN0b3IoZXJyX3Blcl9tYiwgMTUwLjAsIDAuNDAsIDAuOTAsIFEpOworCisgICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9CisgICAgICAgICAgICB2cDhfYml0c19wZXJfbWJbSU5URVJfRlJBTUVdW1FdICsgb3ZlcmhlYWRfYml0c19wZXJfbWI7CisKKyAgICAgICAgYml0c19wZXJfbWJfYXRfdGhpc19xID0gKGludCkoLjUgKyBlcnJfY29ycmVjdGlvbl9mYWN0b3IKKyAgICAgICAgICAgICogc3BlZWRfY29ycmVjdGlvbiAqIGNwaS0+dHdvcGFzcy5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvcgorICAgICAgICAgICAgKiBjcGktPnR3b3Bhc3Muc2VjdGlvbl9tYXhfcWZhY3RvcgorICAgICAgICAgICAgKiAoZG91YmxlKWJpdHNfcGVyX21iX2F0X3RoaXNfcSk7CisKKyAgICAgICAgLyogTW9kZSBhbmQgbW90aW9uIG92ZXJoZWFkICovCisgICAgICAgIC8qIEFzIFEgcmlzZXMgaW4gcmVhbCBlbmNvZGUgbG9vcCByZCBjb2RlIHdpbGwgZm9yY2Ugb3ZlcmhlYWQgZG93bgorICAgICAgICAgKiBXZSBtYWtlIGEgY3J1ZGUgYWRqdXN0bWVudCBmb3IgdGhpcyBoZXJlIGFzICouOTggcGVyIFEgc3RlcC4KKyAgICAgICAgICovCisgICAgICAgIG92ZXJoZWFkX2JpdHNfcGVyX21iID0gKGludCkoKGRvdWJsZSlvdmVyaGVhZF9iaXRzX3Blcl9tYiAqIDAuOTgpOworCisgICAgICAgIGlmIChiaXRzX3Blcl9tYl9hdF90aGlzX3EgPD0gdGFyZ2V0X25vcm1fYml0c19wZXJfbWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBSZXN0cmljdGlvbiBvbiBhY3RpdmUgbWF4IHEgZm9yIGNvbnN0cmFpbmVkIHF1YWxpdHkgbW9kZS4gKi8KKyAgICBpZiAoIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpICYmCisgICAgICAgICAoUSA8IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkpICkKKyAgICB7CisgICAgICAgIFEgPSBjcGktPmNxX3RhcmdldF9xdWFsaXR5OworICAgIH0KKworICAgIC8qIEFkanVzdCBtYXhxX21pbl9saW1pdCBhbmQgbWF4cV9tYXhfbGltaXQgbGltaXRzIGJhc2VkIG9uCisgICAgICogYXZlcmFnZSBxIG9ic2VydmVkIGluIGNsaXAgZm9yIG5vbiBrZi9nZi5hcmYgZnJhbWVzCisgICAgICogR2l2ZSBhdmVyYWdlIGEgY2hhbmNlIHRvIHNldHRsZSB0aG91Z2guCisgICAgICovCisgICAgaWYgKCAoY3BpLT5uaV9mcmFtZXMgPgorICAgICAgICAgICAgICAgICAgKChpbnQpY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmNvdW50ID4+IDgpKSAmJgorICAgICAgICAgKGNwaS0+bmlfZnJhbWVzID4gMTUwKSApCisgICAgeworICAgICAgICBjcGktPnR3b3Bhc3MubWF4cV9tYXhfbGltaXQgPSAoKGNwaS0+bmlfYXZfcWkgKyAzMikgPCBjcGktPndvcnN0X3F1YWxpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoY3BpLT5uaV9hdl9xaSArIDMyKSA6IGNwaS0+d29yc3RfcXVhbGl0eTsKKyAgICAgICAgY3BpLT50d29wYXNzLm1heHFfbWluX2xpbWl0ID0gKChjcGktPm5pX2F2X3FpIC0gMzIpID4gY3BpLT5iZXN0X3F1YWxpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoY3BpLT5uaV9hdl9xaSAtIDMyKSA6IGNwaS0+YmVzdF9xdWFsaXR5OworICAgIH0KKworICAgIHJldHVybiBROworfQorCisvKiBGb3IgY3EgbW9kZSBlc3RpbWF0ZSBhIGNxIGxldmVsIHRoYXQgbWF0Y2hlcyB0aGUgb2JzZXJ2ZWQKKyAqIGNvbXBsZXhpdHkgYW5kIGRhdGEgcmF0ZS4KKyAqLworc3RhdGljIGludCBlc3RpbWF0ZV9jcSggVlA4X0NPTVAgKmNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJUlNUUEFTU19TVEFUUyAqIGZwc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJoZWFkX2JpdHMgKQoreworICAgIGludCBROworICAgIGludCBudW1fbWJzID0gY3BpLT5jb21tb24uTUJzOworICAgIGludCB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYjsKKworICAgIGRvdWJsZSBzZWN0aW9uX2VyciA9IChmcHN0YXRzLT5jb2RlZF9lcnJvciAvIGZwc3RhdHMtPmNvdW50KTsKKyAgICBkb3VibGUgZXJyX3Blcl9tYiA9IHNlY3Rpb25fZXJyIC8gbnVtX21iczsKKyAgICBkb3VibGUgZXJyX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGRvdWJsZSBzcGVlZF9jb3JyZWN0aW9uID0gMS4wOworICAgIGRvdWJsZSBjbGlwX2lpcmF0aW87CisgICAgZG91YmxlIGNsaXBfaWlmYWN0b3I7CisgICAgaW50IG92ZXJoZWFkX2JpdHNfcGVyX21iOworCisgICAgaWYgKDApCisgICAgeworICAgICAgICBGSUxFICpmID0gZm9wZW4oImVwbXAuc3R0IiwgImEiKTsKKyAgICAgICAgZnByaW50ZihmLCAiJTEwLjJmXG4iLCBlcnJfcGVyX21iICk7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICB9CisKKyAgICB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYiA9IChzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGggPCAoMSA8PCAyMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICg1MTIgKiBzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGgpIC8gbnVtX21icworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1MTIgKiAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIC8gbnVtX21icyk7CisKKyAgICAvKiBFc3RpbWF0ZSBvZiBvdmVyaGVhZCBiaXRzIHBlciBtYiAqLworICAgIG92ZXJoZWFkX2JpdHNfcGVyX21iID0gb3ZlcmhlYWRfYml0cyAvIG51bV9tYnM7CisKKyAgICAvKiBDb3JyZWN0aW9ucyBmb3IgaGlnaGVyIGNvbXByZXNzaW9uIHNwZWVkIHNldHRpbmdzCisgICAgICogKHJlZHVjZWQgY29tcHJlc3Npb24gZXhwZWN0ZWQpCisgICAgICovCisgICAgaWYgKChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMykgfHwgKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAxKSkKKyAgICB7CisgICAgICAgIGlmIChjcGktPm94Y2YuY3B1X3VzZWQgPD0gNSkKKyAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjA0ICsgKGNwaS0+b3hjZi5jcHVfdXNlZCAqIDAuMDQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcGVlZF9jb3JyZWN0aW9uID0gMS4yNTsKKyAgICB9CisKKyAgICAvKiBJSSByYXRpbyBjb3JyZWN0aW9uIGZhY3RvciBmb3IgY2xpcCBhcyBhIHdob2xlICovCisgICAgY2xpcF9paXJhdGlvID0gY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmludHJhX2Vycm9yIC8KKyAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKGNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cy5jb2RlZF9lcnJvcik7CisgICAgY2xpcF9paWZhY3RvciA9IDEuMCAtICgoY2xpcF9paXJhdGlvIC0gMTAuMCkgKiAwLjAyNSk7CisgICAgaWYgKGNsaXBfaWlmYWN0b3IgPCAwLjgwKQorICAgICAgICBjbGlwX2lpZmFjdG9yID0gMC44MDsKKworICAgIC8qIFRyeSBhbmQgcGljayBhIFEgdGhhdCBjYW4gZW5jb2RlIHRoZSBjb250ZW50IGF0IHRoZSBnaXZlbiByYXRlLiAqLworICAgIGZvciAoUSA9IDA7IFEgPCBNQVhROyBRKyspCisgICAgeworICAgICAgICBpbnQgYml0c19wZXJfbWJfYXRfdGhpc19xOworCisgICAgICAgIC8qIEVycm9yIHBlciBNQiBiYXNlZCBjb3JyZWN0aW9uIGZhY3RvciAqLworICAgICAgICBlcnJfY29ycmVjdGlvbl9mYWN0b3IgPQorICAgICAgICAgICAgY2FsY19jb3JyZWN0aW9uX2ZhY3RvcihlcnJfcGVyX21iLCAxMDAuMCwgMC40MCwgMC45MCwgUSk7CisKKyAgICAgICAgYml0c19wZXJfbWJfYXRfdGhpc19xID0KKyAgICAgICAgICAgIHZwOF9iaXRzX3Blcl9tYltJTlRFUl9GUkFNRV1bUV0gKyBvdmVyaGVhZF9iaXRzX3Blcl9tYjsKKworICAgICAgICBiaXRzX3Blcl9tYl9hdF90aGlzX3EgPQorICAgICAgICAgICAgKGludCkoIC41ICsgZXJyX2NvcnJlY3Rpb25fZmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gKgorICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9paWZhY3RvciAqCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWJpdHNfcGVyX21iX2F0X3RoaXNfcSk7CisKKyAgICAgICAgLyogTW9kZSBhbmQgbW90aW9uIG92ZXJoZWFkICovCisgICAgICAgIC8qIEFzIFEgcmlzZXMgaW4gcmVhbCBlbmNvZGUgbG9vcCByZCBjb2RlIHdpbGwgZm9yY2Ugb3ZlcmhlYWQgZG93bgorICAgICAgICAgKiBXZSBtYWtlIGEgY3J1ZGUgYWRqdXN0bWVudCBmb3IgdGhpcyBoZXJlIGFzICouOTggcGVyIFEgc3RlcC4KKyAgICAgICAgICovCisgICAgICAgIG92ZXJoZWFkX2JpdHNfcGVyX21iID0gKGludCkoKGRvdWJsZSlvdmVyaGVhZF9iaXRzX3Blcl9tYiAqIDAuOTgpOworCisgICAgICAgIGlmIChiaXRzX3Blcl9tYl9hdF90aGlzX3EgPD0gdGFyZ2V0X25vcm1fYml0c19wZXJfbWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBDbGlwIHZhbHVlIHRvIHJhbmdlICJiZXN0IGFsbG93ZWQgdG8gKHdvcnN0IGFsbG93ZWQgLSAxKSIgKi8KKyAgICBRID0gY3FfbGV2ZWxbUV07CisgICAgaWYgKCBRID49IGNwaS0+d29yc3RfcXVhbGl0eSApCisgICAgICAgIFEgPSBjcGktPndvcnN0X3F1YWxpdHkgLSAxOworICAgIGlmICggUSA8IGNwaS0+YmVzdF9xdWFsaXR5ICkKKyAgICAgICAgUSA9IGNwaS0+YmVzdF9xdWFsaXR5OworCisgICAgcmV0dXJuIFE7Cit9CisKK3N0YXRpYyBpbnQgZXN0aW1hdGVfcShWUDhfQ09NUCAqY3BpLCBkb3VibGUgc2VjdGlvbl9lcnIsIGludCBzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGgpCit7CisgICAgaW50IFE7CisgICAgaW50IG51bV9tYnMgPSBjcGktPmNvbW1vbi5NQnM7CisgICAgaW50IHRhcmdldF9ub3JtX2JpdHNfcGVyX21iOworCisgICAgZG91YmxlIGVycl9wZXJfbWIgPSBzZWN0aW9uX2VyciAvIG51bV9tYnM7CisgICAgZG91YmxlIGVycl9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICBkb3VibGUgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDsKKworICAgIHRhcmdldF9ub3JtX2JpdHNfcGVyX21iID0gKHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCA8ICgxIDw8IDIwKSkgPyAoNTEyICogc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoKSAvIG51bV9tYnMgOiA1MTIgKiAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIC8gbnVtX21icyk7CisKKyAgICAvKiBDb3JyZWN0aW9ucyBmb3IgaGlnaGVyIGNvbXByZXNzaW9uIHNwZWVkIHNldHRpbmdzCisgICAgICogKHJlZHVjZWQgY29tcHJlc3Npb24gZXhwZWN0ZWQpCisgICAgICovCisgICAgaWYgKChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMykgfHwgKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAxKSkKKyAgICB7CisgICAgICAgIGlmIChjcGktPm94Y2YuY3B1X3VzZWQgPD0gNSkKKyAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjA0ICsgKGNwaS0+b3hjZi5jcHVfdXNlZCAqIDAuMDQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcGVlZF9jb3JyZWN0aW9uID0gMS4yNTsKKyAgICB9CisKKyAgICAvKiBUcnkgYW5kIHBpY2sgYSBRIHRoYXQgY2FuIGVuY29kZSB0aGUgY29udGVudCBhdCB0aGUgZ2l2ZW4gcmF0ZS4gKi8KKyAgICBmb3IgKFEgPSAwOyBRIDwgTUFYUTsgUSsrKQorICAgIHsKKyAgICAgICAgaW50IGJpdHNfcGVyX21iX2F0X3RoaXNfcTsKKworICAgICAgICAvKiBFcnJvciBwZXIgTUIgYmFzZWQgY29ycmVjdGlvbiBmYWN0b3IgKi8KKyAgICAgICAgZXJyX2NvcnJlY3Rpb25fZmFjdG9yID0KKyAgICAgICAgICAgIGNhbGNfY29ycmVjdGlvbl9mYWN0b3IoZXJyX3Blcl9tYiwgMTUwLjAsIDAuNDAsIDAuOTAsIFEpOworCisgICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9CisgICAgICAgICAgICAoaW50KSggLjUgKyAoIGVycl9jb3JyZWN0aW9uX2ZhY3RvciAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gKgorICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXZwOF9iaXRzX3Blcl9tYltJTlRFUl9GUkFNRV1bUV0gLyAxLjAgKSApOworCisgICAgICAgIGlmIChiaXRzX3Blcl9tYl9hdF90aGlzX3EgPD0gdGFyZ2V0X25vcm1fYml0c19wZXJfbWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gUTsKK30KKworLyogRXN0aW1hdGUgYSB3b3JzdCBjYXNlIFEgZm9yIGEgS0YgZ3JvdXAgKi8KK3N0YXRpYyBpbnQgZXN0aW1hdGVfa2ZfZ3JvdXBfcShWUDhfQ09NUCAqY3BpLCBkb3VibGUgc2VjdGlvbl9lcnIsIGludCBzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGgsIGRvdWJsZSBncm91cF9paXJhdGlvKQoreworICAgIGludCBROworICAgIGludCBudW1fbWJzID0gY3BpLT5jb21tb24uTUJzOworICAgIGludCB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYiA9ICg1MTIgKiBzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGgpIC8gbnVtX21iczsKKyAgICBpbnQgYml0c19wZXJfbWJfYXRfdGhpc19xOworCisgICAgZG91YmxlIGVycl9wZXJfbWIgPSBzZWN0aW9uX2VyciAvIG51bV9tYnM7CisgICAgZG91YmxlIGVycl9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICBkb3VibGUgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDsKKyAgICBkb3VibGUgY3VycmVudF9zcGVuZF9yYXRpbyA9IDEuMDsKKworICAgIGRvdWJsZSBwb3dfaGlnaHEgPSAoUE9XMSA8IDAuNikgPyBQT1cxICsgMC4zIDogMC45MDsKKyAgICBkb3VibGUgcG93X2xvd3EgPSAoUE9XMSA8IDAuNykgPyBQT1cxICsgMC4xIDogMC44MDsKKworICAgIGRvdWJsZSBpaXJhdGlvX2NvcnJlY3Rpb25fZmFjdG9yID0gMS4wOworCisgICAgZG91YmxlIGNvbWJpbmVkX2NvcnJlY3Rpb25fZmFjdG9yOworCisgICAgLyogVHJhcCBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIHRhcmdldCBpcyA8PSAwICovCisgICAgaWYgKHRhcmdldF9ub3JtX2JpdHNfcGVyX21iIDw9IDApCisgICAgICAgIHJldHVybiBNQVhRICogMjsKKworICAgIC8qIENhbGN1bGF0ZSBhIGNvcnJlY3RpdmUgZmFjdG9yIGJhc2VkIG9uIGEgcm9sbGluZyByYXRpbyBvZiBiaXRzIHNwZW50CisgICAgICogIHZzIHRhcmdldCBiaXRzCisgICAgICogVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByYW5nZSAwLjEgdG8gMTAuMAorICAgICAqLworICAgIGlmIChjcGktPmxvbmdfcm9sbGluZ190YXJnZXRfYml0cyA8PSAwKQorICAgICAgICBjdXJyZW50X3NwZW5kX3JhdGlvID0gMTAuMDsKKyAgICBlbHNlCisgICAgeworICAgICAgICBjdXJyZW50X3NwZW5kX3JhdGlvID0gKGRvdWJsZSljcGktPmxvbmdfcm9sbGluZ19hY3R1YWxfYml0cyAvIChkb3VibGUpY3BpLT5sb25nX3JvbGxpbmdfdGFyZ2V0X2JpdHM7CisgICAgICAgIGN1cnJlbnRfc3BlbmRfcmF0aW8gPSAoY3VycmVudF9zcGVuZF9yYXRpbyA+IDEwLjApID8gMTAuMCA6IChjdXJyZW50X3NwZW5kX3JhdGlvIDwgMC4xKSA/IDAuMSA6IGN1cnJlbnRfc3BlbmRfcmF0aW87CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGEgY29ycmVjdGlvbiBmYWN0b3IgYmFzZWQgb24gdGhlIHF1YWxpdHkgb2YgcHJlZGljdGlvbiBpbgorICAgICAqIHRoZSBzZXF1ZW5jZSBhcyBpbmRpY2F0ZWQgYnkgaW50cmFfaW50ZXIgZXJyb3Igc2NvcmUgcmF0aW8gKElJUmF0aW8pCisgICAgICogVGhlIGlkZWEgaGVyZSBpcyB0byBmYXZvdXIgc3Vic2FtcGxpbmcgaW4gdGhlIGhhcmRlc3Qgc2VjdGlvbnMgdnMKKyAgICAgKiB0aGUgZWFzeWVzdC4KKyAgICAgKi8KKyAgICBpaXJhdGlvX2NvcnJlY3Rpb25fZmFjdG9yID0gMS4wIC0gKChncm91cF9paXJhdGlvIC0gNi4wKSAqIDAuMSk7CisKKyAgICBpZiAoaWlyYXRpb19jb3JyZWN0aW9uX2ZhY3RvciA8IDAuNSkKKyAgICAgICAgaWlyYXRpb19jb3JyZWN0aW9uX2ZhY3RvciA9IDAuNTsKKworICAgIC8qIENvcnJlY3Rpb25zIGZvciBoaWdoZXIgY29tcHJlc3Npb24gc3BlZWQgc2V0dGluZ3MKKyAgICAgKiAocmVkdWNlZCBjb21wcmVzc2lvbiBleHBlY3RlZCkKKyAgICAgKi8KKyAgICBpZiAoKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAzKSB8fCAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDEpKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8PSA1KQorICAgICAgICAgICAgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDQgKyAoY3BpLT5veGNmLmNwdV91c2VkICogMC4wNCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjI1OworICAgIH0KKworICAgIC8qIENvbWJpbmUgdGhlIHZhcmlvdXMgZmFjdG9ycyBjYWxjdWxhdGVkIGFib3ZlICovCisgICAgY29tYmluZWRfY29ycmVjdGlvbl9mYWN0b3IgPSBzcGVlZF9jb3JyZWN0aW9uICogaWlyYXRpb19jb3JyZWN0aW9uX2ZhY3RvciAqIGN1cnJlbnRfc3BlbmRfcmF0aW87CisKKyAgICAvKiBUcnkgYW5kIHBpY2sgYSBRIHRoYXQgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHRvIGVuY29kZSB0aGUgY29udGVudCBhdAorICAgICAqIHRoZSBnaXZlbiByYXRlLgorICAgICAqLworICAgIGZvciAoUSA9IDA7IFEgPCBNQVhROyBRKyspCisgICAgeworICAgICAgICAvKiBFcnJvciBwZXIgTUIgYmFzZWQgY29ycmVjdGlvbiBmYWN0b3IgKi8KKyAgICAgICAgZXJyX2NvcnJlY3Rpb25fZmFjdG9yID0KKyAgICAgICAgICAgIGNhbGNfY29ycmVjdGlvbl9mYWN0b3IoZXJyX3Blcl9tYiwgMTUwLjAsIHBvd19sb3dxLCBwb3dfaGlnaHEsIFEpOworCisgICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9CisgICAgICAgICAgICAoaW50KSguNSArICggZXJyX2NvcnJlY3Rpb25fZmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZF9jb3JyZWN0aW9uX2ZhY3RvciAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSl2cDhfYml0c19wZXJfbWJbSU5URVJfRlJBTUVdW1FdKSApOworCisgICAgICAgIGlmIChiaXRzX3Blcl9tYl9hdF90aGlzX3EgPD0gdGFyZ2V0X25vcm1fYml0c19wZXJfbWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSBjb3VsZCBub3QgaGl0IHRoZSB0YXJnZXQgZXZlbiBhdCBNYXggUSB0aGVuIGVzdGltYXRlIHdoYXQgUQorICAgICAqIHdvdWxkIGhhdmUgYmVlbiByZXF1aXJlZAorICAgICAqLworICAgIHdoaWxlICgoYml0c19wZXJfbWJfYXRfdGhpc19xID4gdGFyZ2V0X25vcm1fYml0c19wZXJfbWIpICAmJiAoUSA8IChNQVhRICogMikpKQorICAgIHsKKworICAgICAgICBiaXRzX3Blcl9tYl9hdF90aGlzX3EgPSAoaW50KSgwLjk2ICogYml0c19wZXJfbWJfYXRfdGhpc19xKTsKKyAgICAgICAgUSsrOworICAgIH0KKworICAgIGlmICgwKQorICAgIHsKKyAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJlc3RrZl9xLnN0dCIsICJhIik7CisgICAgICAgIGZwcmludGYoZiwgIiU4ZCAlOGQgJThkICU4LjJmICU4LjNmICU4LjJmICU4LjNmICU4LjNmICU4LjNmICU4ZFxuIiwgY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSwgYml0c19wZXJfbWJfYXRfdGhpc19xLAorICAgICAgICAgICAgICAgIHRhcmdldF9ub3JtX2JpdHNfcGVyX21iLCBlcnJfcGVyX21iLCBlcnJfY29ycmVjdGlvbl9mYWN0b3IsCisgICAgICAgICAgICAgICAgY3VycmVudF9zcGVuZF9yYXRpbywgZ3JvdXBfaWlyYXRpbywgaWlyYXRpb19jb3JyZWN0aW9uX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAoZG91YmxlKWNwaS0+YnVmZmVyX2xldmVsIC8gKGRvdWJsZSljcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwsIFEpOworICAgICAgICBmY2xvc2UoZik7CisgICAgfQorCisgICAgcmV0dXJuIFE7Cit9CisKK2V4dGVybiB2b2lkIHZwOF9uZXdfZnJhbWVfcmF0ZShWUDhfQ09NUCAqY3BpLCBkb3VibGUgZnJhbWVyYXRlKTsKKwordm9pZCB2cDhfaW5pdF9zZWNvbmRfcGFzcyhWUDhfQ09NUCAqY3BpKQoreworICAgIEZJUlNUUEFTU19TVEFUUyB0aGlzX2ZyYW1lOworICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhcnRfcG9zOworCisgICAgZG91YmxlIHR3b19wYXNzX21pbl9yYXRlID0gKGRvdWJsZSkoY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggKiBjcGktPm94Y2YudHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gLyAxMDApOworCisgICAgemVyb19zdGF0cygmY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzKTsKKyAgICB6ZXJvX3N0YXRzKCZjcGktPnR3b3Bhc3MudG90YWxfbGVmdF9zdGF0cyk7CisKKyAgICBpZiAoIWNwaS0+dHdvcGFzcy5zdGF0c19pbl9lbmQpCisgICAgICAgIHJldHVybjsKKworICAgIGNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cyA9ICpjcGktPnR3b3Bhc3Muc3RhdHNfaW5fZW5kOworICAgIGNwaS0+dHdvcGFzcy50b3RhbF9sZWZ0X3N0YXRzID0gY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzOworCisgICAgLyogZWFjaCBmcmFtZSBjYW4gaGF2ZSBhIGRpZmZlcmVudCBkdXJhdGlvbiwgYXMgdGhlIGZyYW1lIHJhdGUgaW4gdGhlCisgICAgICogc291cmNlIGlzbid0IGd1YXJhbnRlZWQgdG8gYmUgY29uc3RhbnQuICAgVGhlIGZyYW1lIHJhdGUgcHJpb3IgdG8KKyAgICAgKiB0aGUgZmlyc3QgZnJhbWUgZW5jb2RlZCBpbiB0aGUgc2Vjb25kIHBhc3MgaXMgYSBndWVzcy4gIEhvd2V2ZXIgdGhlCisgICAgICogc3VtIGR1cmF0aW9uIGlzIG5vdC4gSXRzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGFjdHVhbCBkdXJhdGlvbnMgb2YKKyAgICAgKiBhbGwgZnJhbWVzIGZyb20gdGhlIGZpcnN0IHBhc3MuCisgICAgICovCisgICAgdnA4X25ld19mcmFtZV9yYXRlKGNwaSwgMTAwMDAwMDAuMCAqIGNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cy5jb3VudCAvIGNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cy5kdXJhdGlvbik7CisKKyAgICBjcGktPm91dHB1dF9mcmFtZV9yYXRlID0gY3BpLT5mcmFtZV9yYXRlOworICAgIGNwaS0+dHdvcGFzcy5iaXRzX2xlZnQgPSAoaW50NjRfdCkoY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmR1cmF0aW9uICogY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggLyAxMDAwMDAwMC4wKSA7CisgICAgY3BpLT50d29wYXNzLmJpdHNfbGVmdCAtPSAoaW50NjRfdCkoY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmR1cmF0aW9uICogdHdvX3Bhc3NfbWluX3JhdGUgLyAxMDAwMDAwMC4wKTsKKworICAgIC8qIENhbGN1bGF0ZSBhIG1pbmltdW0gaW50cmEgdmFsdWUgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgSUlyYXRpbworICAgICAqIHNjb3JlcyB1c2VkIGluIHRoZSBzZWNvbmQgcGFzcy4gV2UgaGF2ZSB0aGlzIG1pbmltdW0gdG8gbWFrZSBzdXJlCisgICAgICogdGhhdCBjbGlwcyB0aGF0IGFyZSBzdGF0aWMgYnV0ICJsb3cgY29tcGxleGl0eSIgaW4gdGhlIGludHJhIGRvbWFpbgorICAgICAqIGFyZSBzdGlsbCBib29zdGVkIGFwcHJvcHJpYXRlbHkgZm9yIEtGL0dGL0FSRgorICAgICAqLworICAgIGNwaS0+dHdvcGFzcy5rZl9pbnRyYV9lcnJfbWluID0gS0ZfTUJfSU5UUkFfTUlOICogY3BpLT5jb21tb24uTUJzOworICAgIGNwaS0+dHdvcGFzcy5nZl9pbnRyYV9lcnJfbWluID0gR0ZfTUJfSU5UUkFfTUlOICogY3BpLT5jb21tb24uTUJzOworCisgICAgLyogU2NhbiB0aGUgZmlyc3QgcGFzcyBmaWxlIGFuZCBjYWxjdWxhdGUgYW4gYXZlcmFnZSBJbnRyYSAvIEludGVyIGVycm9yCisgICAgICogc2NvcmUgcmF0aW8gZm9yIHRoZSBzZXF1ZW5jZQorICAgICAqLworICAgIHsKKyAgICAgICAgZG91YmxlIHN1bV9paXJhdGlvID0gMC4wOworICAgICAgICBkb3VibGUgSUlSYXRpbzsKKworICAgICAgICBzdGFydF9wb3MgPSBjcGktPnR3b3Bhc3Muc3RhdHNfaW47IC8qIE5vdGUgc3RhcnRpbmcgImZpbGUiIHBvc2l0aW9uICovCisKKyAgICAgICAgd2hpbGUgKGlucHV0X3N0YXRzKGNwaSwgJnRoaXNfZnJhbWUpICE9IEVPRikKKyAgICAgICAgeworICAgICAgICAgICAgSUlSYXRpbyA9IHRoaXNfZnJhbWUuaW50cmFfZXJyb3IgLyBET1VCTEVfRElWSURFX0NIRUNLKHRoaXNfZnJhbWUuY29kZWRfZXJyb3IpOworICAgICAgICAgICAgSUlSYXRpbyA9IChJSVJhdGlvIDwgMS4wKSA/IDEuMCA6IChJSVJhdGlvID4gMjAuMCkgPyAyMC4wIDogSUlSYXRpbzsKKyAgICAgICAgICAgIHN1bV9paXJhdGlvICs9IElJUmF0aW87CisgICAgICAgIH0KKworICAgICAgICBjcGktPnR3b3Bhc3MuYXZnX2lpcmF0aW8gPSBzdW1faWlyYXRpbyAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPnR3b3Bhc3MudG90YWxfc3RhdHMuY291bnQpOworCisgICAgICAgIC8qIFJlc2V0IGZpbGUgcG9zaXRpb24gKi8KKyAgICAgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zKTsKKyAgICB9CisKKyAgICAvKiBTY2FuIHRoZSBmaXJzdCBwYXNzIGZpbGUgYW5kIGNhbGN1bGF0ZSBhIG1vZGlmaWVkIHRvdGFsIGVycm9yIGJhc2VkCisgICAgICogdXBvbiB0aGUgYmlhcy9wb3dlciBmdW5jdGlvbiB1c2VkIHRvIGFsbG9jYXRlIGJpdHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIHN0YXJ0X3BvcyA9IGNwaS0+dHdvcGFzcy5zdGF0c19pbjsgIC8qIE5vdGUgc3RhcnRpbmcgImZpbGUiIHBvc2l0aW9uICovCisKKyAgICAgICAgY3BpLT50d29wYXNzLm1vZGlmaWVkX2Vycm9yX3RvdGFsID0gMC4wOworICAgICAgICBjcGktPnR3b3Bhc3MubW9kaWZpZWRfZXJyb3JfdXNlZCA9IDAuMDsKKworICAgICAgICB3aGlsZSAoaW5wdXRfc3RhdHMoY3BpLCAmdGhpc19mcmFtZSkgIT0gRU9GKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPnR3b3Bhc3MubW9kaWZpZWRfZXJyb3JfdG90YWwgKz0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksICZ0aGlzX2ZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjcGktPnR3b3Bhc3MubW9kaWZpZWRfZXJyb3JfbGVmdCA9IGNwaS0+dHdvcGFzcy5tb2RpZmllZF9lcnJvcl90b3RhbDsKKworICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBzdGFydF9wb3MpOyAgLyogUmVzZXQgZmlsZSBwb3NpdGlvbiAqLworCisgICAgfQorfQorCit2b2lkIHZwOF9lbmRfc2Vjb25kX3Bhc3MoVlA4X0NPTVAgKmNwaSkKK3sKK30KKworLyogVGhpcyBmdW5jdGlvbiBnaXZlcyBhbmQgZXN0aW1hdGUgb2YgaG93IGJhZGx5IHdlIGJlbGlldmUgdGhlIHByZWRpY3Rpb24KKyAqIHF1YWxpdHkgaXMgZGVjYXlpbmcgZnJvbSBmcmFtZSB0byBmcmFtZS4KKyAqLworc3RhdGljIGRvdWJsZSBnZXRfcHJlZGljdGlvbl9kZWNheV9yYXRlKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqbmV4dF9mcmFtZSkKK3sKKyAgICBkb3VibGUgcHJlZGljdGlvbl9kZWNheV9yYXRlOworICAgIGRvdWJsZSBtb3Rpb25fZGVjYXk7CisgICAgZG91YmxlIG1vdGlvbl9wY3QgPSBuZXh0X2ZyYW1lLT5wY250X21vdGlvbjsKKworICAgIC8qIEluaXRpYWwgYmFzaXMgaXMgdGhlICUgbWJzIGludGVyIGNvZGVkICovCisgICAgcHJlZGljdGlvbl9kZWNheV9yYXRlID0gbmV4dF9mcmFtZS0+cGNudF9pbnRlcjsKKworICAgIC8qIEhpZ2ggJSBtb3Rpb24gLT4gc29tZXdoYXQgaGlnaGVyIGRlY2F5IHJhdGUgKi8KKyAgICBtb3Rpb25fZGVjYXkgPSAoMS4wIC0gKG1vdGlvbl9wY3QgLyAyMC4wKSk7CisgICAgaWYgKG1vdGlvbl9kZWNheSA8IHByZWRpY3Rpb25fZGVjYXlfcmF0ZSkKKyAgICAgICAgcHJlZGljdGlvbl9kZWNheV9yYXRlID0gbW90aW9uX2RlY2F5OworCisgICAgLyogQWRqdXN0bWVudCB0byBkZWNheSByYXRlIGJhc2VkIG9uIHNwZWVkIG9mIG1vdGlvbiAqLworICAgIHsKKyAgICAgICAgZG91YmxlIHRoaXNfbXZfcmFiczsKKyAgICAgICAgZG91YmxlIHRoaXNfbXZfY2FiczsKKyAgICAgICAgZG91YmxlIGRpc3RhbmNlX2ZhY3RvcjsKKworICAgICAgICB0aGlzX212X3JhYnMgPSBmYWJzKG5leHRfZnJhbWUtPm12cl9hYnMgKiBtb3Rpb25fcGN0KTsKKyAgICAgICAgdGhpc19tdl9jYWJzID0gZmFicyhuZXh0X2ZyYW1lLT5tdmNfYWJzICogbW90aW9uX3BjdCk7CisKKyAgICAgICAgZGlzdGFuY2VfZmFjdG9yID0gc3FydCgodGhpc19tdl9yYWJzICogdGhpc19tdl9yYWJzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXNfbXZfY2FicyAqIHRoaXNfbXZfY2FicykpIC8gMjUwLjA7CisgICAgICAgIGRpc3RhbmNlX2ZhY3RvciA9ICgoZGlzdGFuY2VfZmFjdG9yID4gMS4wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAuMCA6ICgxLjAgLSBkaXN0YW5jZV9mYWN0b3IpKTsKKyAgICAgICAgaWYgKGRpc3RhbmNlX2ZhY3RvciA8IHByZWRpY3Rpb25fZGVjYXlfcmF0ZSkKKyAgICAgICAgICAgIHByZWRpY3Rpb25fZGVjYXlfcmF0ZSA9IGRpc3RhbmNlX2ZhY3RvcjsKKyAgICB9CisKKyAgICByZXR1cm4gcHJlZGljdGlvbl9kZWNheV9yYXRlOworfQorCisvKiBGdW5jdGlvbiB0byB0ZXN0IGZvciBhIGNvbmRpdGlvbiB3aGVyZSBhIGNvbXBsZXggdHJhbnNpdGlvbiBpcyBmb2xsb3dlZAorICogYnkgYSBzdGF0aWMgc2VjdGlvbi4gRm9yIGV4YW1wbGUgaW4gc2xpZGUgc2hvd3Mgd2hlcmUgdGhlcmUgaXMgYSBmYWRlCisgKiBiZXR3ZWVuIHNsaWRlcy4gVGhpcyBpcyB0byBoZWxwIHdpdGggbW9yZSBvcHRpbWFsIGtmIGFuZCBnZiBwb3NpdGlvbmluZy4KKyAqLworc3RhdGljIGludCBkZXRlY3RfdHJhbnNpdGlvbl90b19zdGlsbCgKKyAgICBWUDhfQ09NUCAqY3BpLAorICAgIGludCBmcmFtZV9pbnRlcnZhbCwKKyAgICBpbnQgc3RpbGxfaW50ZXJ2YWwsCisgICAgZG91YmxlIGxvb3BfZGVjYXlfcmF0ZSwKKyAgICBkb3VibGUgZGVjYXlfYWNjdW11bGF0b3IgKQoreworICAgIGludCB0cmFuc190b19zdGlsbCA9IDA7CisKKyAgICAvKiBCcmVhayBjbGF1c2UgdG8gZGV0ZWN0IHZlcnkgc3RpbGwgc2VjdGlvbnMgYWZ0ZXIgbW90aW9uCisgICAgICogRm9yIGV4YW1wbGUgYSBzdGF0aWMgaW1hZ2UgYWZ0ZXIgYSBmYWRlIG9yIG90aGVyIHRyYW5zaXRpb24KKyAgICAgKiBpbnN0ZWFkIG9mIGEgY2xlYW4gc2NlbmUgY3V0LgorICAgICAqLworICAgIGlmICggKGZyYW1lX2ludGVydmFsID4gTUlOX0dGX0lOVEVSVkFMKSAmJgorICAgICAgICAgKGxvb3BfZGVjYXlfcmF0ZSA+PSAwLjk5OSkgJiYKKyAgICAgICAgIChkZWNheV9hY2N1bXVsYXRvciA8IDAuOSkgKQorICAgIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIEZJUlNUUEFTU19TVEFUUyAqIHBvc2l0aW9uID0gY3BpLT50d29wYXNzLnN0YXRzX2luOworICAgICAgICBGSVJTVFBBU1NfU1RBVFMgdG1wX25leHRfZnJhbWU7CisgICAgICAgIGRvdWJsZSBkZWNheV9yYXRlOworCisgICAgICAgIC8qIExvb2sgYWhlYWQgYSBmZXcgZnJhbWVzIHRvIHNlZSBpZiBzdGF0aWMgY29uZGl0aW9uIHBlcnNpc3RzLi4uICovCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgc3RpbGxfaW50ZXJ2YWw7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCAmdG1wX25leHRfZnJhbWUpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWNheV9yYXRlID0gZ2V0X3ByZWRpY3Rpb25fZGVjYXlfcmF0ZShjcGksICZ0bXBfbmV4dF9mcmFtZSk7CisgICAgICAgICAgICBpZiAoIGRlY2F5X3JhdGUgPCAwLjk5OSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogUmVzZXQgZmlsZSBwb3NpdGlvbiAqLworICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBwb3NpdGlvbik7CisKKyAgICAgICAgLyogT25seSBpZiBpdCBkb2VzIGRvIHdlIHNpZ25hbCBhIHRyYW5zaXRpb24gdG8gc3RpbGwgKi8KKyAgICAgICAgaWYgKCBqID09IHN0aWxsX2ludGVydmFsICkKKyAgICAgICAgICAgIHRyYW5zX3RvX3N0aWxsID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNfdG9fc3RpbGw7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyBhIGZsYXNoIHRocm91Z2ggdGhlIGhpZ2ggcmVsYXRpdmUgcGNudF9zZWNvbmRfcmVmCisgKiBzY29yZSBpbiB0aGUgZnJhbWUgZm9sbG93aW5nIGEgZmxhc2ggZnJhbWUuIFRoZSBvZmZzZXQgcGFzc2VkIGluIHNob3VsZAorICogcmVmbGVjdCB0aGlzCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X2ZsYXNoKCBWUDhfQ09NUCAqY3BpLCBpbnQgb2Zmc2V0ICkKK3sKKyAgICBGSVJTVFBBU1NfU1RBVFMgbmV4dF9mcmFtZTsKKworICAgIGludCBmbGFzaF9kZXRlY3RlZCA9IDA7CisKKyAgICAvKiBSZWFkIHRoZSBmcmFtZSBkYXRhLiAqLworICAgIC8qIFRoZSByZXR1cm4gaXMgMCAobm8gZmxhc2ggZGV0ZWN0ZWQpIGlmIG5vdCBhIHZhbGlkIGZyYW1lICovCisgICAgaWYgKCByZWFkX2ZyYW1lX3N0YXRzKGNwaSwgJm5leHRfZnJhbWUsIG9mZnNldCkgIT0gRU9GICkKKyAgICB7CisgICAgICAgIC8qIFdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIGhlcmUgaXMgYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgYQorICAgICAgICAgKiBicmllZiBicmVhayBpbiBwcmVkaWN0aW9uIChzdWNoIGFzIGEgZmxhc2gpIGJ1dCBzdWJzZXF1ZW50IGZyYW1lcworICAgICAgICAgKiBhcmUgcmVhc29uYWJseSB3ZWxsIHByZWRpY3RlZCBieSBhbiBlYXJsaWVyIChwcmUgZmxhc2gpIGZyYW1lLgorICAgICAgICAgKiBUaGUgcmVjb3ZlcnkgYWZ0ZXIgYSBmbGFzaCBpcyBpbmRpY2F0ZWQgYnkgYSBoaWdoIHBjbnRfc2Vjb25kX3JlZgorICAgICAgICAgKiBjb21hcHJlZCB0byBwY250X2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAobmV4dF9mcmFtZS5wY250X3NlY29uZF9yZWYgPiBuZXh0X2ZyYW1lLnBjbnRfaW50ZXIpICYmCisgICAgICAgICAgICAgKG5leHRfZnJhbWUucGNudF9zZWNvbmRfcmVmID49IDAuNSApICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxhc2hfZGV0ZWN0ZWQgPSAxOworCisgICAgICAgICAgICAvKmlmICgxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiZmxhc2guc3R0IiwgImEiKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlOC4wZiAlNi4yZiAlNi4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9mcmFtZS5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9mcmFtZS5wY250X2ludGVyLAorICAgICAgICAgICAgICAgICAgICBuZXh0X2ZyYW1lLnBjbnRfc2Vjb25kX3JlZik7CisgICAgICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgfSovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmxhc2hfZGV0ZWN0ZWQ7Cit9CisKKy8qIFVwZGF0ZSB0aGUgbW90aW9uIHJlbGF0ZWQgZWxlbWVudHMgdG8gdGhlIEdGIGFyZiBib29zdCBjYWxjdWxhdGlvbiAqLworc3RhdGljIHZvaWQgYWNjdW11bGF0ZV9mcmFtZV9tb3Rpb25fc3RhdHMoCisgICAgVlA4X0NPTVAgKmNwaSwKKyAgICBGSVJTVFBBU1NfU1RBVFMgKiB0aGlzX2ZyYW1lLAorICAgIGRvdWJsZSAqIHRoaXNfZnJhbWVfbXZfaW5fb3V0LAorICAgIGRvdWJsZSAqIG12X2luX291dF9hY2N1bXVsYXRvciwKKyAgICBkb3VibGUgKiBhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yLAorICAgIGRvdWJsZSAqIG12X3JhdGlvX2FjY3VtdWxhdG9yICkKK3sKKyAgICBkb3VibGUgdGhpc19mcmFtZV9tdnJfcmF0aW87CisgICAgZG91YmxlIHRoaXNfZnJhbWVfbXZjX3JhdGlvOworICAgIGRvdWJsZSBtb3Rpb25fcGN0OworCisgICAgLyogQWNjdW11bGF0ZSBtb3Rpb24gc3RhdHMuICovCisgICAgbW90aW9uX3BjdCA9IHRoaXNfZnJhbWUtPnBjbnRfbW90aW9uOworCisgICAgLyogQWNjdW11bGF0ZSBNb3Rpb24gSW4vT3V0IG9mIGZyYW1lIHN0YXRzICovCisgICAgKnRoaXNfZnJhbWVfbXZfaW5fb3V0ID0gdGhpc19mcmFtZS0+bXZfaW5fb3V0X2NvdW50ICogbW90aW9uX3BjdDsKKyAgICAqbXZfaW5fb3V0X2FjY3VtdWxhdG9yICs9IHRoaXNfZnJhbWUtPm12X2luX291dF9jb3VudCAqIG1vdGlvbl9wY3Q7CisgICAgKmFic19tdl9pbl9vdXRfYWNjdW11bGF0b3IgKz0KKyAgICAgICAgZmFicyh0aGlzX2ZyYW1lLT5tdl9pbl9vdXRfY291bnQgKiBtb3Rpb25fcGN0KTsKKworICAgIC8qIEFjY3VtdWxhdGUgYSBtZWFzdXJlIG9mIGhvdyB1bmlmb3JtIChvciBjb252ZXJzZWx5IGhvdyByYW5kb20pCisgICAgICogdGhlIG1vdGlvbiBmaWVsZCBpcy4gKEEgcmF0aW8gb2YgYWJzbXYgLyBtdikKKyAgICAgKi8KKyAgICBpZiAobW90aW9uX3BjdCA+IDAuMDUpCisgICAgeworICAgICAgICB0aGlzX2ZyYW1lX212cl9yYXRpbyA9IGZhYnModGhpc19mcmFtZS0+bXZyX2FicykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soZmFicyh0aGlzX2ZyYW1lLT5NVnIpKTsKKworICAgICAgICB0aGlzX2ZyYW1lX212Y19yYXRpbyA9IGZhYnModGhpc19mcmFtZS0+bXZjX2FicykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soZmFicyh0aGlzX2ZyYW1lLT5NVmMpKTsKKworICAgICAgICAgKm12X3JhdGlvX2FjY3VtdWxhdG9yICs9CisgICAgICAgICAgICAodGhpc19mcmFtZV9tdnJfcmF0aW8gPCB0aGlzX2ZyYW1lLT5tdnJfYWJzKQorICAgICAgICAgICAgICAgID8gKHRoaXNfZnJhbWVfbXZyX3JhdGlvICogbW90aW9uX3BjdCkKKyAgICAgICAgICAgICAgICA6IHRoaXNfZnJhbWUtPm12cl9hYnMgKiBtb3Rpb25fcGN0OworCisgICAgICAgICptdl9yYXRpb19hY2N1bXVsYXRvciArPQorICAgICAgICAgICAgKHRoaXNfZnJhbWVfbXZjX3JhdGlvIDwgdGhpc19mcmFtZS0+bXZjX2FicykKKyAgICAgICAgICAgICAgICA/ICh0aGlzX2ZyYW1lX212Y19yYXRpbyAqIG1vdGlvbl9wY3QpCisgICAgICAgICAgICAgICAgOiB0aGlzX2ZyYW1lLT5tdmNfYWJzICogbW90aW9uX3BjdDsKKworICAgIH0KK30KKworLyogQ2FsY3VsYXRlIGEgYmFzZWxpbmUgYm9vc3QgbnVtYmVyIGZvciB0aGUgY3VycmVudCBmcmFtZS4gKi8KK3N0YXRpYyBkb3VibGUgY2FsY19mcmFtZV9ib29zdCgKKyAgICBWUDhfQ09NUCAqY3BpLAorICAgIEZJUlNUUEFTU19TVEFUUyAqIHRoaXNfZnJhbWUsCisgICAgZG91YmxlIHRoaXNfZnJhbWVfbXZfaW5fb3V0ICkKK3sKKyAgICBkb3VibGUgZnJhbWVfYm9vc3Q7CisKKyAgICAvKiBVbmRlcmx5aW5nIGJvb3N0IGZhY3RvciBpcyBiYXNlZCBvbiBpbnRlciBpbnRyYSBlcnJvciByYXRpbyAqLworICAgIGlmICh0aGlzX2ZyYW1lLT5pbnRyYV9lcnJvciA+IGNwaS0+dHdvcGFzcy5nZl9pbnRyYV9lcnJfbWluKQorICAgICAgICBmcmFtZV9ib29zdCA9IChJSUZBQ1RPUiAqIHRoaXNfZnJhbWUtPmludHJhX2Vycm9yIC8KKyAgICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKHRoaXNfZnJhbWUtPmNvZGVkX2Vycm9yKSk7CisgICAgZWxzZQorICAgICAgICBmcmFtZV9ib29zdCA9IChJSUZBQ1RPUiAqIGNwaS0+dHdvcGFzcy5nZl9pbnRyYV9lcnJfbWluIC8KKyAgICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKHRoaXNfZnJhbWUtPmNvZGVkX2Vycm9yKSk7CisKKyAgICAvKiBJbmNyZWFzZSBib29zdCBmb3IgZnJhbWVzIHdoZXJlIG5ldyBkYXRhIGNvbWluZyBpbnRvIGZyYW1lCisgICAgICogKGVnIHpvb20gb3V0KS4gU2xpZ2h0bHkgcmVkdWNlIGJvb3N0IGlmIHRoZXJlIGlzIGEgbmV0IGJhbGFuY2UKKyAgICAgKiBvZiBtb3Rpb24gb3V0IG9mIHRoZSBmcmFtZSAoem9vbSBpbikuCisgICAgICogVGhlIHJhbmdlIGZvciB0aGlzX2ZyYW1lX212X2luX291dCBpcyAtMS4wIHRvICsxLjAKKyAgICAgKi8KKyAgICBpZiAodGhpc19mcmFtZV9tdl9pbl9vdXQgPiAwLjApCisgICAgICAgIGZyYW1lX2Jvb3N0ICs9IGZyYW1lX2Jvb3N0ICogKHRoaXNfZnJhbWVfbXZfaW5fb3V0ICogMi4wKTsKKyAgICAvKiBJbiBleHRyZW1lIGNhc2UgYm9vc3QgaXMgaGFsdmVkICovCisgICAgZWxzZQorICAgICAgICBmcmFtZV9ib29zdCArPSBmcmFtZV9ib29zdCAqICh0aGlzX2ZyYW1lX212X2luX291dCAvIDIuMCk7CisKKyAgICAvKiBDbGlwIHRvIG1heGltdW0gKi8KKyAgICBpZiAoZnJhbWVfYm9vc3QgPiBHRl9STUFYKQorICAgICAgICBmcmFtZV9ib29zdCA9IEdGX1JNQVg7CisKKyAgICByZXR1cm4gZnJhbWVfYm9vc3Q7Cit9CisKKyNpZiBORVdfQk9PU1QKK3N0YXRpYyBpbnQgY2FsY19hcmZfYm9vc3QoCisgICAgVlA4X0NPTVAgKmNwaSwKKyAgICBpbnQgb2Zmc2V0LAorICAgIGludCBmX2ZyYW1lcywKKyAgICBpbnQgYl9mcmFtZXMsCisgICAgaW50ICpmX2Jvb3N0LAorICAgIGludCAqYl9ib29zdCApCit7CisgICAgRklSU1RQQVNTX1NUQVRTIHRoaXNfZnJhbWU7CisKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgYm9vc3Rfc2NvcmUgPSAwLjA7CisgICAgZG91YmxlIG12X3JhdGlvX2FjY3VtdWxhdG9yID0gMC4wOworICAgIGRvdWJsZSBkZWNheV9hY2N1bXVsYXRvciA9IDEuMDsKKyAgICBkb3VibGUgdGhpc19mcmFtZV9tdl9pbl9vdXQgPSAwLjA7CisgICAgZG91YmxlIG12X2luX291dF9hY2N1bXVsYXRvciA9IDAuMDsKKyAgICBkb3VibGUgYWJzX212X2luX291dF9hY2N1bXVsYXRvciA9IDAuMDsKKyAgICBkb3VibGUgcjsKKyAgICBpbnQgZmxhc2hfZGV0ZWN0ZWQgPSAwOworCisgICAgLyogU2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcHJvcG9zZWQgYXJmL25leHQgZ2YgcG9zaXRpb24gKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGZfZnJhbWVzOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCByZWFkX2ZyYW1lX3N0YXRzKGNwaSwgJnRoaXNfZnJhbWUsIChpK29mZnNldCkpID09IEVPRiApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIG1vdGlvbiByZWxhdGVkIGVsZW1lbnRzIHRvIHRoZSBib29zdCBjYWxjdWxhdGlvbiAqLworICAgICAgICBhY2N1bXVsYXRlX2ZyYW1lX21vdGlvbl9zdGF0cyggY3BpLCAmdGhpc19mcmFtZSwKKyAgICAgICAgICAgICZ0aGlzX2ZyYW1lX212X2luX291dCwgJm12X2luX291dF9hY2N1bXVsYXRvciwKKyAgICAgICAgICAgICZhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yLCAmbXZfcmF0aW9fYWNjdW11bGF0b3IgKTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGJhc2VsaW5lIGJvb3N0IG51bWJlciBmb3IgdGhpcyBmcmFtZSAqLworICAgICAgICByID0gY2FsY19mcmFtZV9ib29zdCggY3BpLCAmdGhpc19mcmFtZSwgdGhpc19mcmFtZV9tdl9pbl9vdXQgKTsKKworICAgICAgICAvKiBXZSB3YW50IHRvIGRpc2NvdW50IHRoZSB0aGUgZmxhc2ggZnJhbWUgaXRzZWxmIGFuZCB0aGUgcmVjb3ZlcnkKKyAgICAgICAgICogZnJhbWUgdGhhdCBmb2xsb3dzIGFzIGJvdGggd2lsbCBoYXZlIHBvb3Igc2NvcmVzLgorICAgICAgICAgKi8KKyAgICAgICAgZmxhc2hfZGV0ZWN0ZWQgPSBkZXRlY3RfZmxhc2goY3BpLCAoaStvZmZzZXQpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdF9mbGFzaChjcGksIChpK29mZnNldCsxKSk7CisKKyAgICAgICAgLyogQ3VtdWxhdGl2ZSBlZmZlY3Qgb2YgcHJlZGljdGlvbiBxdWFsaXR5IGRlY2F5ICovCisgICAgICAgIGlmICggIWZsYXNoX2RldGVjdGVkICkKKyAgICAgICAgeworICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPQorICAgICAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yICoKKyAgICAgICAgICAgICAgICBnZXRfcHJlZGljdGlvbl9kZWNheV9yYXRlKGNwaSwgJnRoaXNfZnJhbWUpOworICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPQorICAgICAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yIDwgMC4xID8gMC4xIDogZGVjYXlfYWNjdW11bGF0b3I7CisgICAgICAgIH0KKyAgICAgICAgYm9vc3Rfc2NvcmUgKz0gKGRlY2F5X2FjY3VtdWxhdG9yICogcik7CisKKyAgICAgICAgLyogQnJlYWsgb3V0IGNvbmRpdGlvbnMuICovCisgICAgICAgIGlmICAoICghZmxhc2hfZGV0ZWN0ZWQpICYmCisgICAgICAgICAgICAgICgobXZfcmF0aW9fYWNjdW11bGF0b3IgPiAxMDAuMCkgfHwKKyAgICAgICAgICAgICAgIChhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yID4gMy4wKSB8fAorICAgICAgICAgICAgICAgKG12X2luX291dF9hY2N1bXVsYXRvciA8IC0yLjApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpmX2Jvb3N0ID0gKGludCkoYm9vc3Rfc2NvcmUgKiAxMDAuMCkgPj4gNDsKKworICAgIC8qIFJlc2V0IGZvciBiYWNrd2FyZCBsb29raW5nIGxvb3AgKi8KKyAgICBib29zdF9zY29yZSA9IDAuMDsKKyAgICBtdl9yYXRpb19hY2N1bXVsYXRvciA9IDAuMDsKKyAgICBkZWNheV9hY2N1bXVsYXRvciA9IDEuMDsKKyAgICB0aGlzX2ZyYW1lX212X2luX291dCA9IDAuMDsKKyAgICBtdl9pbl9vdXRfYWNjdW11bGF0b3IgPSAwLjA7CisgICAgYWJzX212X2luX291dF9hY2N1bXVsYXRvciA9IDAuMDsKKworICAgIC8qIFNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHByb3Bvc2VkIGFyZi9uZXh0IGdmIHBvc2l0aW9uICovCisgICAgZm9yICggaSA9IC0xOyBpID49IC1iX2ZyYW1lczsgaS0tICkKKyAgICB7CisgICAgICAgIGlmICggcmVhZF9mcmFtZV9zdGF0cyhjcGksICZ0aGlzX2ZyYW1lLCAoaStvZmZzZXQpKSA9PSBFT0YgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogVXBkYXRlIHRoZSBtb3Rpb24gcmVsYXRlZCBlbGVtZW50cyB0byB0aGUgYm9vc3QgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgYWNjdW11bGF0ZV9mcmFtZV9tb3Rpb25fc3RhdHMoIGNwaSwgJnRoaXNfZnJhbWUsCisgICAgICAgICAgICAmdGhpc19mcmFtZV9tdl9pbl9vdXQsICZtdl9pbl9vdXRfYWNjdW11bGF0b3IsCisgICAgICAgICAgICAmYWJzX212X2luX291dF9hY2N1bXVsYXRvciwgJm12X3JhdGlvX2FjY3VtdWxhdG9yICk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBiYXNlbGluZSBib29zdCBudW1iZXIgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICAgICAgciA9IGNhbGNfZnJhbWVfYm9vc3QoIGNwaSwgJnRoaXNfZnJhbWUsIHRoaXNfZnJhbWVfbXZfaW5fb3V0ICk7CisKKyAgICAgICAgLyogV2Ugd2FudCB0byBkaXNjb3VudCB0aGUgdGhlIGZsYXNoIGZyYW1lIGl0c2VsZiBhbmQgdGhlIHJlY292ZXJ5CisgICAgICAgICAqIGZyYW1lIHRoYXQgZm9sbG93cyBhcyBib3RoIHdpbGwgaGF2ZSBwb29yIHNjb3Jlcy4KKyAgICAgICAgICovCisgICAgICAgIGZsYXNoX2RldGVjdGVkID0gZGV0ZWN0X2ZsYXNoKGNwaSwgKGkrb2Zmc2V0KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RfZmxhc2goY3BpLCAoaStvZmZzZXQrMSkpOworCisgICAgICAgIC8qIEN1bXVsYXRpdmUgZWZmZWN0IG9mIHByZWRpY3Rpb24gcXVhbGl0eSBkZWNheSAqLworICAgICAgICBpZiAoICFmbGFzaF9kZXRlY3RlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yID0KKyAgICAgICAgICAgICAgICBkZWNheV9hY2N1bXVsYXRvciAqCisgICAgICAgICAgICAgICAgZ2V0X3ByZWRpY3Rpb25fZGVjYXlfcmF0ZShjcGksICZ0aGlzX2ZyYW1lKTsKKyAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yID0KKyAgICAgICAgICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA8IDAuMSA/IDAuMSA6IGRlY2F5X2FjY3VtdWxhdG9yOworICAgICAgICB9CisKKyAgICAgICAgYm9vc3Rfc2NvcmUgKz0gKGRlY2F5X2FjY3VtdWxhdG9yICogcik7CisKKyAgICAgICAgLyogQnJlYWsgb3V0IGNvbmRpdGlvbnMuICovCisgICAgICAgIGlmICAoICghZmxhc2hfZGV0ZWN0ZWQpICYmCisgICAgICAgICAgICAgICgobXZfcmF0aW9fYWNjdW11bGF0b3IgPiAxMDAuMCkgfHwKKyAgICAgICAgICAgICAgIChhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yID4gMy4wKSB8fAorICAgICAgICAgICAgICAgKG12X2luX291dF9hY2N1bXVsYXRvciA8IC0yLjApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAqYl9ib29zdCA9IChpbnQpKGJvb3N0X3Njb3JlICogMTAwLjApID4+IDQ7CisKKyAgICByZXR1cm4gKCpmX2Jvb3N0ICsgKmJfYm9vc3QpOworfQorI2VuZGlmCisKKy8qIEFuYWx5c2UgYW5kIGRlZmluZSBhIGdmL2FyZiBncm91cCAuICovCitzdGF0aWMgdm9pZCBkZWZpbmVfZ2ZfZ3JvdXAoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICp0aGlzX2ZyYW1lKQoreworICAgIEZJUlNUUEFTU19TVEFUUyBuZXh0X2ZyYW1lOworICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhcnRfcG9zOworICAgIGludCBpOworICAgIGRvdWJsZSByOworICAgIGRvdWJsZSBib29zdF9zY29yZSA9IDAuMDsKKyAgICBkb3VibGUgb2xkX2Jvb3N0X3Njb3JlID0gMC4wOworICAgIGRvdWJsZSBnZl9ncm91cF9lcnIgPSAwLjA7CisgICAgZG91YmxlIGdmX2ZpcnN0X2ZyYW1lX2VyciA9IDAuMDsKKyAgICBkb3VibGUgbW9kX2ZyYW1lX2VyciA9IDAuMDsKKworICAgIGRvdWJsZSBtdl9yYXRpb19hY2N1bXVsYXRvciA9IDAuMDsKKyAgICBkb3VibGUgZGVjYXlfYWNjdW11bGF0b3IgPSAxLjA7CisKKyAgICBkb3VibGUgbG9vcF9kZWNheV9yYXRlID0gMS4wMDsgICAgICAgICAgLyogU3RhcnRpbmcgZGVjYXkgcmF0ZSAqLworCisgICAgZG91YmxlIHRoaXNfZnJhbWVfbXZfaW5fb3V0ID0gMC4wOworICAgIGRvdWJsZSBtdl9pbl9vdXRfYWNjdW11bGF0b3IgPSAwLjA7CisgICAgZG91YmxlIGFic19tdl9pbl9vdXRfYWNjdW11bGF0b3IgPSAwLjA7CisgICAgZG91YmxlIG1vZF9lcnJfcGVyX21iX2FjY3VtdWxhdG9yID0gMC4wOworCisgICAgaW50IG1heF9iaXRzID0gZnJhbWVfbWF4X2JpdHMoY3BpKTsgICAgIC8qIE1heCBmb3IgYSBzaW5nbGUgZnJhbWUgKi8KKworICAgIHVuc2lnbmVkIGludCBhbGxvd19hbHRfcmVmID0KKyAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLnBsYXlfYWx0ZXJuYXRlICYmIGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzOworCisgICAgaW50IGFsdF9ib29zdCA9IDA7CisgICAgaW50IGZfYm9vc3QgPSAwOworICAgIGludCBiX2Jvb3N0ID0gMDsKKyAgICBpbnQgZmxhc2hfZGV0ZWN0ZWQ7CisKKyAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyA9IDA7CisgICAgY3BpLT50d29wYXNzLmdmX2RlY2F5X3JhdGUgPSAwOworCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgc3RhcnRfcG9zID0gY3BpLT50d29wYXNzLnN0YXRzX2luOworCisgICAgdnB4X21lbXNldCgmbmV4dF9mcmFtZSwgMCwgc2l6ZW9mKG5leHRfZnJhbWUpKTsgLyogYXNzdXJlIGNsZWFuICovCisKKyAgICAvKiBMb2FkIHN0YXRzIGZvciB0aGUgY3VycmVudCBmcmFtZS4gKi8KKyAgICBtb2RfZnJhbWVfZXJyID0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksIHRoaXNfZnJhbWUpOworCisgICAgLyogTm90ZSB0aGUgZXJyb3Igb2YgdGhlIGZyYW1lIGF0IHRoZSBzdGFydCBvZiB0aGUgZ3JvdXAgKHRoaXMgd2lsbCBiZQorICAgICAqIHRoZSBHRiBmcmFtZSBlcnJvciBpZiB3ZSBjb2RlIGEgbm9ybWFsIGdmCisgICAgICovCisgICAgZ2ZfZmlyc3RfZnJhbWVfZXJyID0gbW9kX2ZyYW1lX2VycjsKKworICAgIC8qIFNwZWNpYWwgdHJlYXRtZW50IGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGEga2V5IGZyYW1lICh3aGljaCBpcyBhbHNvCisgICAgICogYSBnZikuIElmIGl0IGlzIHRoZW4gaXRzIGVycm9yIHNjb3JlIChhbmQgaGVuY2UgYml0IGFsbG9jYXRpb24pIG5lZWQKKyAgICAgKiB0byBiZSBzdWJ0cmFjdGVkIG91dCBmcm9tIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIEdGIGdyb3VwCisgICAgICovCisgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICBnZl9ncm91cF9lcnIgLT0gZ2ZfZmlyc3RfZnJhbWVfZXJyOworCisgICAgLyogU2NhbiBmb3J3YXJkIHRvIHRyeSBhbmQgd29yayBvdXQgaG93IG1hbnkgZnJhbWVzIHRoZSBuZXh0IGdmIGdyb3VwCisgICAgICogc2hvdWxkIGNvbnRhaW4gYW5kIHdoYXQgbGV2ZWwgb2YgYm9vc3QgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBHRgorICAgICAqIG9yIEFSRiB0aGF0IHdpbGwgYmUgY29kZWQgd2l0aCB0aGUgZ3JvdXAKKyAgICAgKi8KKyAgICBpID0gMDsKKworICAgIHdoaWxlICgoKGkgPCBjcGktPnR3b3Bhc3Muc3RhdGljX3NjZW5lX21heF9nZl9pbnRlcnZhbCkgfHwKKyAgICAgICAgICAgICgoY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkgLSBpKSA8IE1JTl9HRl9JTlRFUlZBTCkpICYmCisgICAgICAgICAgIChpIDwgY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkpKQorICAgIHsKKyAgICAgICAgaSsrOworCisgICAgICAgIC8qIEFjY3VtdWxhdGUgZXJyb3Igc2NvcmUgb2YgZnJhbWVzIGluIHRoaXMgZ2YgZ3JvdXAgKi8KKyAgICAgICAgbW9kX2ZyYW1lX2VyciA9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKKworICAgICAgICBnZl9ncm91cF9lcnIgKz0gbW9kX2ZyYW1lX2VycjsKKworICAgICAgICBtb2RfZXJyX3Blcl9tYl9hY2N1bXVsYXRvciArPQorICAgICAgICAgICAgbW9kX2ZyYW1lX2VyciAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmNvbW1vbi5NQnMpOworCisgICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCAmbmV4dF9mcmFtZSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBUZXN0IGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIGJyaWVmIGZsYXNoIGJ1dCB0aGUgcHJlZGljdGlvbgorICAgICAgICAgKiBxdWFsaXR5IGJhY2sgdG8gYW4gZWFybGllciBmcmFtZSBpcyB0aGVuIHJlc3RvcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgZmxhc2hfZGV0ZWN0ZWQgPSBkZXRlY3RfZmxhc2goY3BpLCAwKTsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIG1vdGlvbiByZWxhdGVkIGVsZW1lbnRzIHRvIHRoZSBib29zdCBjYWxjdWxhdGlvbiAqLworICAgICAgICBhY2N1bXVsYXRlX2ZyYW1lX21vdGlvbl9zdGF0cyggY3BpLCAmbmV4dF9mcmFtZSwKKyAgICAgICAgICAgICZ0aGlzX2ZyYW1lX212X2luX291dCwgJm12X2luX291dF9hY2N1bXVsYXRvciwKKyAgICAgICAgICAgICZhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yLCAmbXZfcmF0aW9fYWNjdW11bGF0b3IgKTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgYSBiYXNlbGluZSBib29zdCBudW1iZXIgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICAgICAgciA9IGNhbGNfZnJhbWVfYm9vc3QoIGNwaSwgJm5leHRfZnJhbWUsIHRoaXNfZnJhbWVfbXZfaW5fb3V0ICk7CisKKyAgICAgICAgLyogQ3VtdWxhdGl2ZSBlZmZlY3Qgb2YgcHJlZGljdGlvbiBxdWFsaXR5IGRlY2F5ICovCisgICAgICAgIGlmICggIWZsYXNoX2RldGVjdGVkICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9vcF9kZWNheV9yYXRlID0gZ2V0X3ByZWRpY3Rpb25fZGVjYXlfcmF0ZShjcGksICZuZXh0X2ZyYW1lKTsKKyAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yID0gZGVjYXlfYWNjdW11bGF0b3IgKiBsb29wX2RlY2F5X3JhdGU7CisgICAgICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9CisgICAgICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPCAwLjEgPyAwLjEgOiBkZWNheV9hY2N1bXVsYXRvcjsKKyAgICAgICAgfQorICAgICAgICBib29zdF9zY29yZSArPSAoZGVjYXlfYWNjdW11bGF0b3IgKiByKTsKKworICAgICAgICAvKiBCcmVhayBjbGF1c2UgdG8gZGV0ZWN0IHZlcnkgc3RpbGwgc2VjdGlvbnMgYWZ0ZXIgbW90aW9uCisgICAgICAgICAqIEZvciBleGFtcGxlIGEgc3RhaWMgaW1hZ2UgYWZ0ZXIgYSBmYWRlIG9yIG90aGVyIHRyYW5zaXRpb24uCisgICAgICAgICAqLworICAgICAgICBpZiAoIGRldGVjdF90cmFuc2l0aW9uX3RvX3N0aWxsKCBjcGksIGksIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZGVjYXlfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbG93X2FsdF9yZWYgPSAwOworICAgICAgICAgICAgYm9vc3Rfc2NvcmUgPSBvbGRfYm9vc3Rfc2NvcmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEJyZWFrIG91dCBjb25kaXRpb25zLiAqLworICAgICAgICBpZiAgKAorICAgICAgICAgICAgLyogQnJlYWsgYXQgY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgdW5sZXNzIGFsbW9zdCB0b3RhbGx5IHN0YXRpYyAqLworICAgICAgICAgICAgKGkgPj0gY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgJiYgKGRlY2F5X2FjY3VtdWxhdG9yIDwgMC45OTUpKSB8fAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIC8qIERvbnQgYnJlYWsgb3V0IHdpdGggYSB2ZXJ5IHNob3J0IGludGVydmFsICovCisgICAgICAgICAgICAgICAgKGkgPiBNSU5fR0ZfSU5URVJWQUwpICYmCisgICAgICAgICAgICAgICAgLyogRG9udCBicmVhayBvdXQgdmVyeSBjbG9zZSB0byBhIGtleSBmcmFtZSAqLworICAgICAgICAgICAgICAgICgoY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkgLSBpKSA+PSBNSU5fR0ZfSU5URVJWQUwpICYmCisgICAgICAgICAgICAgICAgKChib29zdF9zY29yZSA+IDIwLjApIHx8IChuZXh0X2ZyYW1lLnBjbnRfaW50ZXIgPCAwLjc1KSkgJiYKKyAgICAgICAgICAgICAgICAoIWZsYXNoX2RldGVjdGVkKSAmJgorICAgICAgICAgICAgICAgICgobXZfcmF0aW9fYWNjdW11bGF0b3IgPiAxMDAuMCkgfHwKKyAgICAgICAgICAgICAgICAgKGFic19tdl9pbl9vdXRfYWNjdW11bGF0b3IgPiAzLjApIHx8CisgICAgICAgICAgICAgICAgIChtdl9pbl9vdXRfYWNjdW11bGF0b3IgPCAtMi4wKSB8fAorICAgICAgICAgICAgICAgICAoKGJvb3N0X3Njb3JlIC0gb2xkX2Jvb3N0X3Njb3JlKSA8IDIuMCkpCisgICAgICAgICAgICApICkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vc3Rfc2NvcmUgPSBvbGRfYm9vc3Rfc2NvcmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZweF9tZW1jcHkodGhpc19mcmFtZSwgJm5leHRfZnJhbWUsIHNpemVvZigqdGhpc19mcmFtZSkpOworCisgICAgICAgIG9sZF9ib29zdF9zY29yZSA9IGJvb3N0X3Njb3JlOworICAgIH0KKworICAgIGNwaS0+dHdvcGFzcy5nZl9kZWNheV9yYXRlID0KKyAgICAgICAgKGkgPiAwKSA/IChpbnQpKDEwMC4wICogKDEuMCAtIGRlY2F5X2FjY3VtdWxhdG9yKSkgLyBpIDogMDsKKworICAgIC8qIFdoZW4gdXNpbmcgQ0JSIGFwcGx5IGFkZGl0aW9uYWwgYnVmZmVyIHJlbGF0ZWQgdXBwZXIgbGltaXRzICovCisgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQorICAgIHsKKyAgICAgICAgZG91YmxlIG1heF9ib29zdDsKKworICAgICAgICAvKiBGb3IgY2JyIGFwcGx5IGJ1ZmZlciByZWxhdGVkIGxpbWl0cyAqLworICAgICAgICBpZiAoY3BpLT5kcm9wX2ZyYW1lc19hbGxvd2VkKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IGRmX2J1ZmZlcl9sZXZlbCA9IGNwaS0+b3hjZi5kcm9wX2ZyYW1lc193YXRlcl9tYXJrICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKTsKKworICAgICAgICAgICAgaWYgKGNwaS0+YnVmZmVyX2xldmVsID4gZGZfYnVmZmVyX2xldmVsKQorICAgICAgICAgICAgICAgIG1heF9ib29zdCA9ICgoZG91YmxlKSgoY3BpLT5idWZmZXJfbGV2ZWwgLSBkZl9idWZmZXJfbGV2ZWwpICogMiAvIDMpICogMTYuMCkgLyBET1VCTEVfRElWSURFX0NIRUNLKChkb3VibGUpY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXhfYm9vc3QgPSAwLjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtYXhfYm9vc3QgPSAoKGRvdWJsZSkoY3BpLT5idWZmZXJfbGV2ZWwgKiAyIC8gMykgKiAxNi4wKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWF4X2Jvb3N0ID0gMC4wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJvb3N0X3Njb3JlID4gbWF4X2Jvb3N0KQorICAgICAgICAgICAgYm9vc3Rfc2NvcmUgPSBtYXhfYm9vc3Q7CisgICAgfQorCisgICAgLyogRG9udCBhbGxvdyBjb252ZW50aW9uYWwgZ2YgdG9vIG5lYXIgdGhlIG5leHQga2YgKi8KKyAgICBpZiAoKGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5IC0gaSkgPCBNSU5fR0ZfSU5URVJWQUwpCisgICAgeworICAgICAgICB3aGlsZSAoaSA8IGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5KQorICAgICAgICB7CisgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCB0aGlzX2ZyYW1lKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKGkgPCBjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtb2RfZnJhbWVfZXJyID0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksIHRoaXNfZnJhbWUpOworICAgICAgICAgICAgICAgIGdmX2dyb3VwX2VyciArPSBtb2RfZnJhbWVfZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3BpLT5nZnVfYm9vc3QgPSAoaW50KShib29zdF9zY29yZSAqIDEwMC4wKSA+PiA0OworCisjaWYgTkVXX0JPT1NUCisgICAgLyogQWx0ZXJybmF0aXZlIGJvb3N0IGNhbGN1bGF0aW9uIGZvciBhbHQgcmVmICovCisgICAgYWx0X2Jvb3N0ID0gY2FsY19hcmZfYm9vc3QoIGNwaSwgMCwgKGktMSksIChpLTEpLCAmZl9ib29zdCwgJmJfYm9vc3QgKTsKKyNlbmRpZgorCisgICAgLyogU2hvdWxkIHdlIHVzZSB0aGUgYWx0ZXJuYXRlIHJlZmVybmNlIGZyYW1lICovCisgICAgaWYgKGFsbG93X2FsdF9yZWYgJiYKKyAgICAgICAgKGkgPj0gTUlOX0dGX0lOVEVSVkFMKSAmJgorICAgICAgICAvKiBkb250IHVzZSBBUkYgdmVyeSBuZWFyIG5leHQga2YgKi8KKyAgICAgICAgKGkgPD0gKGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5IC0gTUlOX0dGX0lOVEVSVkFMKSkgJiYKKyNpZiBORVdfQk9PU1QKKyAgICAgICAgKChuZXh0X2ZyYW1lLnBjbnRfaW50ZXIgPiAwLjc1KSB8fAorICAgICAgICAgKG5leHRfZnJhbWUucGNudF9zZWNvbmRfcmVmID4gMC41KSkgJiYKKyAgICAgICAgKChtdl9pbl9vdXRfYWNjdW11bGF0b3IgLyAoZG91YmxlKWkgPiAtMC4yKSB8fAorICAgICAgICAgKG12X2luX291dF9hY2N1bXVsYXRvciA+IC0yLjApKSAmJgorICAgICAgICAoYl9ib29zdCA+IDEwMCkgJiYKKyAgICAgICAgKGZfYm9vc3QgPiAxMDApICkKKyNlbHNlCisgICAgICAgIChuZXh0X2ZyYW1lLnBjbnRfaW50ZXIgPiAwLjc1KSAmJgorICAgICAgICAoKG12X2luX291dF9hY2N1bXVsYXRvciAvIChkb3VibGUpaSA+IC0wLjIpIHx8CisgICAgICAgICAobXZfaW5fb3V0X2FjY3VtdWxhdG9yID4gLTIuMCkpICYmCisgICAgICAgIChjcGktPmdmdV9ib29zdCA+IDEwMCkgJiYKKyAgICAgICAgKGNwaS0+dHdvcGFzcy5nZl9kZWNheV9yYXRlIDw9CisgICAgICAgICAgICAoQVJGX0RFQ0FZX1RIUkVTSCArIChjcGktPmdmdV9ib29zdCAvIDIwMCkpKSApCisjZW5kaWYKKyAgICB7CisgICAgICAgIGludCBCb29zdDsKKyAgICAgICAgaW50IGFsbG9jYXRpb25fY2h1bmtzOworICAgICAgICBpbnQgUSA9IChjcGktPm94Y2YuZml4ZWRfcSA8IDApCisgICAgICAgICAgICAgICAgPyBjcGktPmxhc3RfcVtJTlRFUl9GUkFNRV0gOiBjcGktPm94Y2YuZml4ZWRfcTsKKyAgICAgICAgaW50IHRtcF9xOworICAgICAgICBpbnQgYXJmX2ZyYW1lX2JpdHMgPSAwOworICAgICAgICBpbnQgZ3JvdXBfYml0czsKKworI2lmIE5FV19CT09TVAorICAgICAgICBjcGktPmdmdV9ib29zdCA9IGFsdF9ib29zdDsKKyNlbmRpZgorCisgICAgICAgIC8qIEVzdGltYXRlIHRoZSBiaXRzIHRvIGJlIGFsbG9jYXRlZCB0byB0aGUgZ3JvdXAgYXMgYSB3aG9sZSAqLworICAgICAgICBpZiAoKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzID4gMCkgJiYKKyAgICAgICAgICAgIChjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfZXJyb3JfbGVmdCA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBncm91cF9iaXRzID0gKGludCkoKGRvdWJsZSljcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyAqCisgICAgICAgICAgICAgICAgKGdmX2dyb3VwX2VyciAvIChkb3VibGUpY3BpLT50d29wYXNzLmtmX2dyb3VwX2Vycm9yX2xlZnQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBncm91cF9iaXRzID0gMDsKKworICAgICAgICAvKiBCb29zdCBmb3IgYXJmIGZyYW1lICovCisjaWYgTkVXX0JPT1NUCisgICAgICAgIEJvb3N0ID0gKGFsdF9ib29zdCAqIEdGUV9BREpVU1RNRU5UKSAvIDEwMDsKKyNlbHNlCisgICAgICAgIEJvb3N0ID0gKGNwaS0+Z2Z1X2Jvb3N0ICogMyAqIEdGUV9BREpVU1RNRU5UKSAvICgyICogMTAwKTsKKyNlbmRpZgorICAgICAgICBCb29zdCArPSAoaSAqIDUwKTsKKworICAgICAgICAvKiBTZXQgbWF4IGFuZCBtaW5pbXVtIGJvb3N0IGFuZCBoZW5jZSBtaW5pbXVtIGFsbG9jYXRpb24gKi8KKyAgICAgICAgaWYgKEJvb3N0ID4gKChjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsICsgMSkgKiAyMDApKQorICAgICAgICAgICAgQm9vc3QgPSAoKGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgKyAxKSAqIDIwMCk7CisgICAgICAgIGVsc2UgaWYgKEJvb3N0IDwgMTI1KQorICAgICAgICAgICAgQm9vc3QgPSAxMjU7CisKKyAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPSAoaSAqIDEwMCkgKyBCb29zdDsKKworICAgICAgICAvKiBOb3JtYWxpemUgQWx0Ym9vc3QgYW5kIGFsbG9jYXRpb25zIGNodW5jayBkb3duIHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgd2hpbGUgKEJvb3N0ID4gMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgQm9vc3QgLz0gMjsKKyAgICAgICAgICAgIGFsbG9jYXRpb25fY2h1bmtzIC89IDI7CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHNwZW50IG9uIHRoZSBhcmYgYmFzZWQgb24gdGhlCisgICAgICAgICAqIGJvb3N0IG51bWJlcgorICAgICAgICAgKi8KKyAgICAgICAgYXJmX2ZyYW1lX2JpdHMgPSAoaW50KSgoZG91YmxlKUJvb3N0ICogKGdyb3VwX2JpdHMgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpYWxsb2NhdGlvbl9jaHVua3MpKTsKKworICAgICAgICAvKiBFc3RpbWF0ZSBpZiB0aGVyZSBhcmUgZW5vdWdoIGJpdHMgYXZhaWxhYmxlIHRvIG1ha2Ugd29ydGh3aGlsZSB1c2UKKyAgICAgICAgICogb2YgYW4gYXJmLgorICAgICAgICAgKi8KKyAgICAgICAgdG1wX3EgPSBlc3RpbWF0ZV9xKGNwaSwgbW9kX2ZyYW1lX2VyciwgKGludClhcmZfZnJhbWVfYml0cyk7CisKKyAgICAgICAgLyogT25seSB1c2UgYW4gYXJmIGlmIGl0IGlzIGxpa2VseSB3ZSB3aWxsIGJlIGFibGUgdG8gY29kZQorICAgICAgICAgKiBpdCBhdCBhIGxvd2VyIFEgdGhhbiB0aGUgc3Vycm91bmRpbmcgZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHRtcF9xIDwgY3BpLT53b3JzdF9xdWFsaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaGFsZl9nZl9pbnQ7CisgICAgICAgICAgICBpbnQgZnJhbWVzX2FmdGVyX2FyZjsKKyAgICAgICAgICAgIGludCBmcmFtZXNfYndkID0gY3BpLT5veGNmLmFybnJfbWF4X2ZyYW1lcyAtIDE7CisgICAgICAgICAgICBpbnQgZnJhbWVzX2Z3ZCA9IGNwaS0+b3hjZi5hcm5yX21heF9mcmFtZXMgLSAxOworCisgICAgICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgPSAxOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRm9yIGFsdCByZWYgZnJhbWVzIHRoZSBlcnJvciBzY29yZSBmb3IgdGhlIGVuZCBmcmFtZSBvZiB0aGUKKyAgICAgICAgICAgICAqIGdyb3VwICh0aGUgYWx0IHJlZiBmcmFtZSkgc2hvdWxkIG5vdCBjb250cmlidXRlIHRvIHRoZSBncm91cAorICAgICAgICAgICAgICogdG90YWwgYW5kIGhlbmNlIHRoZSBudW1iZXIgb2YgYml0IGFsbG9jYXRlZCB0byB0aGUgZ3JvdXAuCisgICAgICAgICAgICAgKiBSYXRoZXIgaXQgZm9ybXMgcGFydCBvZiB0aGUgbmV4dCBncm91cCAoaXQgaXMgdGhlIEdGIGF0IHRoZQorICAgICAgICAgICAgICogc3RhcnQgb2YgdGhlIG5leHQgZ3JvdXApCisgICAgICAgICAgICAgKiBnZl9ncm91cF9lcnIgLT0gbW9kX2ZyYW1lX2VycjsKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGb3IgYWx0IHJlZiBmcmFtZXMgYWx0IHJlZiBmcmFtZSBpcyB0ZWNobmljYWxseSBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgICogR0YgZnJhbWUgZm9yIHRoZSBuZXh0IGdyb3VwIGJ1dCB3ZSBhbHdheXMgYmFzZSB0aGUgZXJyb3IKKyAgICAgICAgICAgICAqIGNhbGN1bGF0aW9uIGFuZCBiaXQgYWxsb2NhdGlvbiBvbiB0aGUgY3VycmVudCBncm91cCBvZiBmcmFtZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogU2V0IHRoZSBpbnRlcnZhbCB0aWxsIHRoZSBuZXh0IGdmIG9yIGFyZi4KKyAgICAgICAgICAgICAqIEZvciBBUkZzIHRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgY29kZWQgYmVmb3JlIHRoZQorICAgICAgICAgICAgICogZnV0dXJlIGZyYW1lIHRoYXQgaXMgY29kZWQgYXMgYW4gQVJGLgorICAgICAgICAgICAgICogVGhlIGZ1dHVyZSBmcmFtZSBpdHNlbGYgaXMgcGFydCBvZiB0aGUgbmV4dCBncm91cAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0gaTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERlZmluZSB0aGUgYXJuciBmaWx0ZXIgd2lkdGggZm9yIHRoaXMgZ3JvdXAgb2YgZnJhbWVzOgorICAgICAgICAgICAgICogV2Ugb25seSBmaWx0ZXIgZnJhbWVzIHRoYXQgbGllIHdpdGhpbiBhIGRpc3RhbmNlIG9mIGhhbGYKKyAgICAgICAgICAgICAqIHRoZSBHRiBpbnRlcnZhbCBmcm9tIHRoZSBBUkYgZnJhbWUuIFdlIGFsc28gaGF2ZSB0byB0cmFwCisgICAgICAgICAgICAgKiBjYXNlcyB3aGVyZSB0aGUgZmlsdGVyIGV4dGVuZHMgYmV5b25kIHRoZSBlbmQgb2YgY2xpcC4KKyAgICAgICAgICAgICAqIE5vdGU6IHRoaXNfZnJhbWUtPmZyYW1lIGhhcyBiZWVuIHVwZGF0ZWQgaW4gdGhlIGxvb3AKKyAgICAgICAgICAgICAqIHNvIGl0IG5vdyBwb2ludHMgYXQgdGhlIEFSRiBmcmFtZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaGFsZl9nZl9pbnQgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID4+IDE7CisgICAgICAgICAgICBmcmFtZXNfYWZ0ZXJfYXJmID0gKGludCkoY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmNvdW50IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ZyYW1lLT5mcmFtZSAtIDEpOworCisgICAgICAgICAgICBzd2l0Y2ggKGNwaS0+b3hjZi5hcm5yX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6IC8qIEJhY2t3YXJkIGZpbHRlciAqLworICAgICAgICAgICAgICAgIGZyYW1lc19md2QgPSAwOworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNfYndkID4gaGFsZl9nZl9pbnQpCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc19id2QgPSBoYWxmX2dmX2ludDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvKiBGb3J3YXJkIGZpbHRlciAqLworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNfZndkID4gaGFsZl9nZl9pbnQpCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc19md2QgPSBoYWxmX2dmX2ludDsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzX2Z3ZCA+IGZyYW1lc19hZnRlcl9hcmYpCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc19md2QgPSBmcmFtZXNfYWZ0ZXJfYXJmOworICAgICAgICAgICAgICAgIGZyYW1lc19id2QgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDM6IC8qIENlbnRlcmVkIGZpbHRlciAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmcmFtZXNfZndkID4+PSAxOworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNfZndkID4gZnJhbWVzX2FmdGVyX2FyZikKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2Z3ZCA9IGZyYW1lc19hZnRlcl9hcmY7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc19md2QgPiBoYWxmX2dmX2ludCkKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2Z3ZCA9IGhhbGZfZ2ZfaW50OworCisgICAgICAgICAgICAgICAgZnJhbWVzX2J3ZCA9IGZyYW1lc19md2Q7CisKKyAgICAgICAgICAgICAgICAvKiBGb3IgZXZlbiBsZW5ndGggZmlsdGVyIHRoZXJlIGlzIG9uZSBtb3JlIGZyYW1lIGJhY2t3YXJkCisgICAgICAgICAgICAgICAgICogdGhhbiBmb3J3YXJkOiBlLmcuIGxlbj02ID09PiBiYmJBZmYsIGxlbj03ID09PiBiYmJBZmZmLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNfYndkIDwgaGFsZl9nZl9pbnQpCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc19id2QgKz0gKGNwaS0+b3hjZi5hcm5yX21heF9mcmFtZXMrMSkgJiAweDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNwaS0+YWN0aXZlX2FybnJfZnJhbWVzID0gZnJhbWVzX2J3ZCArIDEgKyBmcmFtZXNfZndkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gMDsKKyAgICAgICAgICAgIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IDA7CisgICAgICAgIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPSBpOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IGRlY2lkZSBob3cgbWFueSBiaXRzIHNob3VsZCBiZSBhbGxvY2F0ZWQgdG8gdGhlIEdGIGdyb3VwIGFzICBhCisgICAgICogcHJvcG9ydGlvbiBvZiB0aG9zZSByZW1haW5pbmcgaW4gdGhlIGtmIGdyb3VwLgorICAgICAqIFRoZSBmaW5hbCBrZXkgZnJhbWUgZ3JvdXAgaW4gdGhlIGNsaXAgaXMgdHJlYXRlZCBhcyBhIHNwZWNpYWwgY2FzZQorICAgICAqIHdoZXJlIGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzIGlzIHRpZWQgdG8gY3BpLT50d29wYXNzLmJpdHNfbGVmdC4KKyAgICAgKiBUaGlzIGlzIGFsc28gaW1wb3J0YW50IGZvciBzaG9ydCBjbGlwcyB3aGVyZSB0aGVyZSBtYXkgb25seSBiZSBvbmUKKyAgICAgKiBrZXkgZnJhbWUuCisgICAgICovCisgICAgaWYgKGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5ID49IChpbnQpKGNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cy5jb3VudCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUpKQorICAgIHsKKyAgICAgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPQorICAgICAgICAgICAgKGNwaS0+dHdvcGFzcy5iaXRzX2xlZnQgPiAwKSA/IGNwaS0+dHdvcGFzcy5iaXRzX2xlZnQgOiAwOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSB0aGUgYml0cyB0byBiZSBhbGxvY2F0ZWQgdG8gdGhlIGdyb3VwIGFzIGEgd2hvbGUgKi8KKyAgICBpZiAoKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzID4gMCkgJiYKKyAgICAgICAgKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9lcnJvcl9sZWZ0ID4gMCkpCisgICAgeworICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyA9CisgICAgICAgICAgICAoaW50KSgoZG91YmxlKWNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzICoKKyAgICAgICAgICAgICAgICAgIChnZl9ncm91cF9lcnIgLyAoZG91YmxlKWNwaS0+dHdvcGFzcy5rZl9ncm91cF9lcnJvcl9sZWZ0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPSAwOworCisgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPSAoaW50KSgKKyAgICAgICAgKGNwaS0+dHdvcGFzcy5nZl9ncm91cF9iaXRzIDwgMCkKKyAgICAgICAgICAgID8gMAorICAgICAgICAgICAgOiAoY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPiBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cykKKyAgICAgICAgICAgICAgICA/IGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzIDogY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMpOworCisgICAgLyogQ2xpcCBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyBiYXNlZCBvbiB1c2VyIHN1cHBsaWVkIGRhdGEgcmF0ZQorICAgICAqIHZhcmlhYmlsaXR5IGxpbWl0IChjcGktPm94Y2YudHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24pCisgICAgICovCisgICAgaWYgKGNwaS0+dHdvcGFzcy5nZl9ncm91cF9iaXRzID4gbWF4X2JpdHMgKiBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsKQorICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyA9IG1heF9iaXRzICogY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbDsKKworICAgIC8qIFJlc2V0IHRoZSBmaWxlIHBvc2l0aW9uICovCisgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zKTsKKworICAgIC8qIFVwZGF0ZSB0aGUgcmVjb3JkIG9mIGVycm9yIHVzZWQgc28gZmFyIChvbmx5IGRvbmUgb25jZSBwZXIgZ2YgZ3JvdXApICovCisgICAgY3BpLT50d29wYXNzLm1vZGlmaWVkX2Vycm9yX3VzZWQgKz0gZ2ZfZ3JvdXBfZXJyOworCisgICAgLyogQXNzaWduICBiaXRzIHRvIHRoZSBhcmYgb3IgZ2YuICovCisgICAgZm9yIChpID0gMDsgaSA8PSAoY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nICYmIGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKTsgaSsrKSB7CisgICAgICAgIGludCBCb29zdDsKKyAgICAgICAgaW50IGFsbG9jYXRpb25fY2h1bmtzOworICAgICAgICBpbnQgUSA9IChjcGktPm94Y2YuZml4ZWRfcSA8IDApID8gY3BpLT5sYXN0X3FbSU5URVJfRlJBTUVdIDogY3BpLT5veGNmLmZpeGVkX3E7CisgICAgICAgIGludCBnZl9iaXRzOworCisgICAgICAgIC8qIEZvciBBUkYgZnJhbWVzICovCisgICAgICAgIGlmIChjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgJiYgaSA9PSAwKQorICAgICAgICB7CisjaWYgTkVXX0JPT1NUCisgICAgICAgICAgICBCb29zdCA9IChhbHRfYm9vc3QgKiBHRlFfQURKVVNUTUVOVCkgLyAxMDA7CisjZWxzZQorICAgICAgICAgICAgQm9vc3QgPSAoY3BpLT5nZnVfYm9vc3QgKiAzICogR0ZRX0FESlVTVE1FTlQpIC8gKDIgKiAxMDApOworI2VuZGlmCisgICAgICAgICAgICBCb29zdCArPSAoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCAqIDUwKTsKKworICAgICAgICAgICAgLyogU2V0IG1heCBhbmQgbWluaW11bSBib29zdCBhbmQgaGVuY2UgbWluaW11bSBhbGxvY2F0aW9uICovCisgICAgICAgICAgICBpZiAoQm9vc3QgPiAoKGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgKyAxKSAqIDIwMCkpCisgICAgICAgICAgICAgICAgQm9vc3QgPSAoKGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgKyAxKSAqIDIwMCk7CisgICAgICAgICAgICBlbHNlIGlmIChCb29zdCA8IDEyNSkKKyAgICAgICAgICAgICAgICBCb29zdCA9IDEyNTsKKworICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPQorICAgICAgICAgICAgICAgICgoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCArIDEpICogMTAwKSArIEJvb3N0OworICAgICAgICB9CisgICAgICAgIC8qIEVsc2UgZm9yIHN0YW5kYXJkIGdvbGRlbiBmcmFtZXMgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBib29zdCBiYXNlZCBvbiBpbnRlciAvIGludHJhIHJhdGlvIG9mIHN1YnNlcXVlbnQgZnJhbWVzICovCisgICAgICAgICAgICBCb29zdCA9IChjcGktPmdmdV9ib29zdCAqIEdGUV9BREpVU1RNRU5UKSAvIDEwMDsKKworICAgICAgICAgICAgLyogU2V0IG1heCBhbmQgbWluaW11bSBib29zdCBhbmQgaGVuY2UgbWluaW11bSBhbGxvY2F0aW9uICovCisgICAgICAgICAgICBpZiAoQm9vc3QgPiAoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCAqIDE1MCkpCisgICAgICAgICAgICAgICAgQm9vc3QgPSAoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCAqIDE1MCk7CisgICAgICAgICAgICBlbHNlIGlmIChCb29zdCA8IDEyNSkKKyAgICAgICAgICAgICAgICBCb29zdCA9IDEyNTsKKworICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPQorICAgICAgICAgICAgICAgIChjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsICogMTAwKSArIChCb29zdCAtIDEwMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3JtYWxpemUgQWx0Ym9vc3QgYW5kIGFsbG9jYXRpb25zIGNodW5jayBkb3duIHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgd2hpbGUgKEJvb3N0ID4gMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgQm9vc3QgLz0gMjsKKyAgICAgICAgICAgIGFsbG9jYXRpb25fY2h1bmtzIC89IDI7CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHNwZW50IG9uIHRoZSBnZiBvciBhcmYgYmFzZWQgb24KKyAgICAgICAgICogdGhlIGJvb3N0IG51bWJlcgorICAgICAgICAgKi8KKyAgICAgICAgZ2ZfYml0cyA9IChpbnQpKChkb3VibGUpQm9vc3QgKgorICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+dHdvcGFzcy5nZl9ncm91cF9iaXRzIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWFsbG9jYXRpb25fY2h1bmtzKSk7CisKKyAgICAgICAgLyogSWYgdGhlIGZyYW1lIHRoYXQgaXMgdG8gYmUgYm9vc3RlZCBpcyBzaW1wbGVyIHRoYW4gdGhlIGF2ZXJhZ2UgZm9yCisgICAgICAgICAqIHRoZSBnZi9hcmYgZ3JvdXAgdGhlbiB1c2UgYW4gYWx0ZXJuYXRpdmUgY2FsY3VsYXRpb24KKyAgICAgICAgICogYmFzZWQgb24gdGhlIGVycm9yIHNjb3JlIG9mIHRoZSBmcmFtZSBpdHNlbGYKKyAgICAgICAgICovCisgICAgICAgIGlmIChtb2RfZnJhbWVfZXJyIDwgZ2ZfZ3JvdXBfZXJyIC8gKGRvdWJsZSljcGktPmJhc2VsaW5lX2dmX2ludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgIGFsdF9nZl9ncnBfYml0czsKKyAgICAgICAgICAgIGludCAgICAgYWx0X2dmX2JpdHM7CisKKyAgICAgICAgICAgIGFsdF9nZl9ncnBfYml0cyA9CisgICAgICAgICAgICAgICAgKGRvdWJsZSljcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyAgKgorICAgICAgICAgICAgICAgIChtb2RfZnJhbWVfZXJyICogKGRvdWJsZSljcGktPmJhc2VsaW5lX2dmX2ludGVydmFsKSAvCisgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+dHdvcGFzcy5rZl9ncm91cF9lcnJvcl9sZWZ0KTsKKworICAgICAgICAgICAgYWx0X2dmX2JpdHMgPSAoaW50KSgoZG91YmxlKUJvb3N0ICogKGFsdF9nZl9ncnBfYml0cyAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlhbGxvY2F0aW9uX2NodW5rcykpOworCisgICAgICAgICAgICBpZiAoZ2ZfYml0cyA+IGFsdF9nZl9iaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdmX2JpdHMgPSBhbHRfZ2ZfYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBFbHNlIGlmIGl0IGlzIGhhcmRlciB0aGFuIG90aGVyIGZyYW1lcyBpbiB0aGUgZ3JvdXAgbWFrZSBzdXJlIGl0IGF0CisgICAgICAgICAqIGxlYXN0IHJlY2VpdmVzIGFuIGFsbG9jYXRpb24gaW4ga2VlcGluZyB3aXRoIGl0cyByZWxhdGl2ZSBlcnJvcgorICAgICAgICAgKiBzY29yZSwgb3RoZXJ3aXNlIGl0IG1heSBiZSB3b3JzZSBvZmYgdGhhbiBhbiAidW4tYm9vc3RlZCIgZnJhbWUKKyAgICAgICAgICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdF9nZl9iaXRzID0KKyAgICAgICAgICAgICAgICAoaW50KSgoZG91YmxlKWNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzICoKKyAgICAgICAgICAgICAgICAgICAgICBtb2RfZnJhbWVfZXJyIC8KKyAgICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKChkb3VibGUpY3BpLT50d29wYXNzLmtmX2dyb3VwX2Vycm9yX2xlZnQpKTsKKworICAgICAgICAgICAgaWYgKGFsdF9nZl9iaXRzID4gZ2ZfYml0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZl9iaXRzID0gYWx0X2dmX2JpdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBcHBseSBhbiBhZGRpdGlvbmFsIGxpbWl0IGZvciBDQlIgKi8KKyAgICAgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3BpLT50d29wYXNzLmdmX2JpdHMgPiAoaW50KShjcGktPmJ1ZmZlcl9sZXZlbCA+PiAxKSkKKyAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfYml0cyA9IChpbnQpKGNwaS0+YnVmZmVyX2xldmVsID4+IDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRG9udCBhbGxvdyBhIG5lZ2F0aXZlIHZhbHVlIGZvciBnZl9iaXRzICovCisgICAgICAgIGlmIChnZl9iaXRzIDwgMCkKKyAgICAgICAgICAgIGdmX2JpdHMgPSAwOworCisgICAgICAgIC8qIEFkZCBpbiBtaW5pbXVtIGZvciBhIGZyYW1lICovCisgICAgICAgIGdmX2JpdHMgKz0gY3BpLT5taW5fZnJhbWVfYmFuZHdpZHRoOworCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5nZl9iaXRzID0gZ2ZfYml0czsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAxIHx8ICghY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nICYmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBQZXIgZnJhbWUgYml0IHRhcmdldCBmb3IgdGhpcyBmcmFtZSAqLworICAgICAgICAgICAgY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoID0gZ2ZfYml0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgLyogQWRqdXN0IEtGIGdyb3VwIGJpdHMgYW5kIGVycm9yIHJlbWFpbmluICovCisgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9ncm91cF9lcnJvcl9sZWZ0IC09IChpbnQ2NF90KWdmX2dyb3VwX2VycjsKKyAgICAgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgLT0gY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHM7CisKKyAgICAgICAgaWYgKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzIDwgMCkKKyAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzID0gMDsKKworICAgICAgICAvKiBOb3RlIHRoZSBlcnJvciBzY29yZSBsZWZ0IGluIHRoZSByZW1haW5pbmcgZnJhbWVzIG9mIHRoZSBncm91cC4KKyAgICAgICAgICogRm9yIG5vcm1hbCBHRnMgd2Ugd2FudCB0byByZW1vdmUgdGhlIGVycm9yIHNjb3JlIGZvciB0aGUgZmlyc3QKKyAgICAgICAgICogZnJhbWUgb2YgdGhlIGdyb3VwIChleGNlcHQgaW4gS2V5IGZyYW1lIGNhc2Ugd2hlcmUgdGhpcyBoYXMKKyAgICAgICAgICogYWxyZWFkeSBoYXBwZW5lZCkKKyAgICAgICAgICovCisgICAgICAgIGlmICghY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nICYmIGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2Vycm9yX2xlZnQgPSAoaW50KShnZl9ncm91cF9lcnIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZl9maXJzdF9mcmFtZV9lcnIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfZXJyb3JfbGVmdCA9IChpbnQpIGdmX2dyb3VwX2VycjsKKworICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyAtPSBjcGktPnR3b3Bhc3MuZ2ZfYml0cyAtIGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aDsKKworICAgICAgICBpZiAoY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPCAwKQorICAgICAgICAgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPSAwOworCisgICAgICAgIC8qIFRoaXMgY29uZGl0aW9uIGNvdWxkIGZhaWwgaWYgdGhlcmUgYXJlIHR3byBrZnMgdmVyeSBjbG9zZSB0b2dldGhlcgorICAgICAgICAgKiBkZXNwaXRlIChNSU5fR0ZfSU5URVJWQUwpIGFuZCB3b3VsZCBjYXVzZSBhIGRldmlkZSBieSAwIGluIHRoZQorICAgICAgICAgKiBjYWxjdWxhdGlvbiBvZiBjcGktPnR3b3Bhc3MuYWx0X2V4dHJhX2JpdHMuCisgICAgICAgICAqLworICAgICAgICBpZiAoIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPj0gMyApCisgICAgICAgIHsKKyNpZiBORVdfQk9PU1QKKyAgICAgICAgICAgIGludCBib29zdCA9IChjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJfYm9vc3QgOiBjcGktPmdmdV9ib29zdDsKKyNlbHNlCisgICAgICAgICAgICBpbnQgYm9vc3QgPSBjcGktPmdmdV9ib29zdDsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCBib29zdCA+PSAxNTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwY3RfZXh0cmE7CisKKyAgICAgICAgICAgICAgICBwY3RfZXh0cmEgPSAoYm9vc3QgLSAxMDApIC8gNTA7CisgICAgICAgICAgICAgICAgcGN0X2V4dHJhID0gKHBjdF9leHRyYSA+IDIwKSA/IDIwIDogcGN0X2V4dHJhOworCisgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLmFsdF9leHRyYV9iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgKGNwaS0+dHdvcGFzcy5nZl9ncm91cF9iaXRzICogcGN0X2V4dHJhKSAvIDEwMDsKKyAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyAtPSBjcGktPnR3b3Bhc3MuYWx0X2V4dHJhX2JpdHM7CisgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLmFsdF9leHRyYV9iaXRzIC89CisgICAgICAgICAgICAgICAgICAgICgoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbC0xKT4+MSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLmFsdF9leHRyYV9iaXRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjcGktPnR3b3Bhc3MuYWx0X2V4dHJhX2JpdHMgPSAwOworICAgIH0KKworICAgIC8qIEFkanVzdG1lbnRzIGJhc2VkIG9uIGEgbWVhc3VyZSBvZiBjb21wbGV4aXR5IG9mIHRoZSBzZWN0aW9uICovCisgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTIHNlY3Rpb25zdGF0czsKKyAgICAgICAgZG91YmxlIFJhdGlvOworCisgICAgICAgIHplcm9fc3RhdHMoJnNlY3Rpb25zdGF0cyk7CisgICAgICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIHN0YXJ0X3Bvcyk7CisKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnB1dF9zdGF0cyhjcGksICZuZXh0X2ZyYW1lKTsKKyAgICAgICAgICAgIGFjY3VtdWxhdGVfc3RhdHMoJnNlY3Rpb25zdGF0cywgJm5leHRfZnJhbWUpOworICAgICAgICB9CisKKyAgICAgICAgYXZnX3N0YXRzKCZzZWN0aW9uc3RhdHMpOworCisgICAgICAgIGNwaS0+dHdvcGFzcy5zZWN0aW9uX2ludHJhX3JhdGluZyA9ICh1bnNpZ25lZCBpbnQpCisgICAgICAgICAgICAoc2VjdGlvbnN0YXRzLmludHJhX2Vycm9yIC8KKyAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soc2VjdGlvbnN0YXRzLmNvZGVkX2Vycm9yKSk7CisKKyAgICAgICAgUmF0aW8gPSBzZWN0aW9uc3RhdHMuaW50cmFfZXJyb3IgLyBET1VCTEVfRElWSURFX0NIRUNLKHNlY3Rpb25zdGF0cy5jb2RlZF9lcnJvcik7CisgICAgICAgIGNwaS0+dHdvcGFzcy5zZWN0aW9uX21heF9xZmFjdG9yID0gMS4wIC0gKChSYXRpbyAtIDEwLjApICogMC4wMjUpOworCisgICAgICAgIGlmIChjcGktPnR3b3Bhc3Muc2VjdGlvbl9tYXhfcWZhY3RvciA8IDAuODApCisgICAgICAgICAgICBjcGktPnR3b3Bhc3Muc2VjdGlvbl9tYXhfcWZhY3RvciA9IDAuODA7CisKKyAgICAgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zKTsKKyAgICB9Cit9CisKKy8qIEFsbG9jYXRlIGJpdHMgdG8gYSBub3JtYWwgZnJhbWUgdGhhdCBpcyBuZWl0aGVyIGEgZ2YgYW4gYXJmIG9yIGEga2V5IGZyYW1lLiAqLworc3RhdGljIHZvaWQgYXNzaWduX3N0ZF9mcmFtZV9iaXRzKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqdGhpc19mcmFtZSkKK3sKKyAgICBpbnQgICAgdGFyZ2V0X2ZyYW1lX3NpemU7CisKKyAgICBkb3VibGUgbW9kaWZpZWRfZXJyOworICAgIGRvdWJsZSBlcnJfZnJhY3Rpb247CisKKyAgICBpbnQgbWF4X2JpdHMgPSBmcmFtZV9tYXhfYml0cyhjcGkpOyAgLyogTWF4IGZvciBhIHNpbmdsZSBmcmFtZSAqLworCisgICAgLyogQ2FsY3VsYXRlIG1vZGlmaWVkIHByZWRpY3Rpb24gZXJyb3IgdXNlZCBpbiBiaXQgYWxsb2NhdGlvbiAqLworICAgIG1vZGlmaWVkX2VyciA9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKKworICAgIC8qIFdoYXQgcG9ydGlvbiBvZiB0aGUgcmVtYWluaW5nIEdGIGdyb3VwIGVycm9yIGlzIHVzZWQgYnkgdGhpcyBmcmFtZSAqLworICAgIGlmIChjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfZXJyb3JfbGVmdCA+IDApCisgICAgICAgIGVycl9mcmFjdGlvbiA9IG1vZGlmaWVkX2VyciAvIGNwaS0+dHdvcGFzcy5nZl9ncm91cF9lcnJvcl9sZWZ0OworICAgIGVsc2UKKyAgICAgICAgZXJyX2ZyYWN0aW9uID0gMC4wOworCisgICAgLyogSG93IG1hbnkgb2YgdGhvc2UgYml0cyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gc2hvdWxkIHdlIGdpdmUgaXQ/ICovCisgICAgdGFyZ2V0X2ZyYW1lX3NpemUgPSAoaW50KSgoZG91YmxlKWNwaS0+dHdvcGFzcy5nZl9ncm91cF9iaXRzICogZXJyX2ZyYWN0aW9uKTsKKworICAgIC8qIENsaXAgdG8gdGFyZ2V0IHNpemUgdG8gMCAtIG1heF9iaXRzIChvciBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cykKKyAgICAgKiBhdCB0aGUgdG9wIGVuZC4KKyAgICAgKi8KKyAgICBpZiAodGFyZ2V0X2ZyYW1lX3NpemUgPCAwKQorICAgICAgICB0YXJnZXRfZnJhbWVfc2l6ZSA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHRhcmdldF9mcmFtZV9zaXplID4gbWF4X2JpdHMpCisgICAgICAgICAgICB0YXJnZXRfZnJhbWVfc2l6ZSA9IG1heF9iaXRzOworCisgICAgICAgIGlmICh0YXJnZXRfZnJhbWVfc2l6ZSA+IGNwaS0+dHdvcGFzcy5nZl9ncm91cF9iaXRzKQorICAgICAgICAgICAgdGFyZ2V0X2ZyYW1lX3NpemUgPSBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0czsKKyAgICB9CisKKyAgICAvKiBBZGp1c3QgZXJyb3IgYW5kIGJpdHMgcmVtYWluaW5nICovCisgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2Vycm9yX2xlZnQgLT0gKGludCltb2RpZmllZF9lcnI7CisgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgLT0gdGFyZ2V0X2ZyYW1lX3NpemU7CisKKyAgICBpZiAoY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPCAwKQorICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyA9IDA7CisKKyAgICAvKiBBZGQgaW4gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBpcyBzZXQgYXNpZGUgZm9yIGV2ZXJ5IGZyYW1lLiAqLworICAgIHRhcmdldF9mcmFtZV9zaXplICs9IGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aDsKKworICAgIC8qIEV2ZXJ5IG90aGVyIGZyYW1lIGdldHMgYSBmZXcgZXh0cmEgYml0cyAqLworICAgIGlmICggKGNwaS0+Y29tbW9uLmZyYW1lc19zaW5jZV9nb2xkZW4gJiAweDAxKSAmJgorICAgICAgICAgKGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA+IDApICkKKyAgICB7CisgICAgICAgIHRhcmdldF9mcmFtZV9zaXplICs9IGNwaS0+dHdvcGFzcy5hbHRfZXh0cmFfYml0czsKKyAgICB9CisKKyAgICAvKiBQZXIgZnJhbWUgYml0IHRhcmdldCBmb3IgdGhpcyBmcmFtZSAqLworICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IHRhcmdldF9mcmFtZV9zaXplOworfQorCit2b2lkIHZwOF9zZWNvbmRfcGFzcyhWUDhfQ09NUCAqY3BpKQoreworICAgIGludCB0bXBfcTsKKyAgICBpbnQgZnJhbWVzX2xlZnQgPSAoaW50KShjcGktPnR3b3Bhc3MudG90YWxfc3RhdHMuY291bnQgLSBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lKTsKKworICAgIEZJUlNUUEFTU19TVEFUUyB0aGlzX2ZyYW1lID0gezB9OworICAgIEZJUlNUUEFTU19TVEFUUyB0aGlzX2ZyYW1lX2NvcHk7CisKKyAgICBkb3VibGUgdGhpc19mcmFtZV9pbnRyYV9lcnJvcjsKKyAgICBkb3VibGUgdGhpc19mcmFtZV9jb2RlZF9lcnJvcjsKKworICAgIGludCBvdmVyaGVhZF9iaXRzOworCisgICAgaWYgKCFjcGktPnR3b3Bhc3Muc3RhdHNfaW4pCisgICAgeworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCAmdGhpc19mcmFtZSkpCisgICAgICAgIHJldHVybjsKKworICAgIHRoaXNfZnJhbWVfaW50cmFfZXJyb3IgPSB0aGlzX2ZyYW1lLmludHJhX2Vycm9yOworICAgIHRoaXNfZnJhbWVfY29kZWRfZXJyb3IgPSB0aGlzX2ZyYW1lLmNvZGVkX2Vycm9yOworCisgICAgLyoga2V5ZnJhbWUgYW5kIHNlY3Rpb24gcHJvY2Vzc2luZyAhICovCisgICAgaWYgKGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5ID09IDApCisgICAgeworICAgICAgICAvKiBEZWZpbmUgbmV4dCBLRiBncm91cCBhbmQgYXNzaWduIGJpdHMgdG8gaXQgKi8KKyAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKKyAgICAgICAgZmluZF9uZXh0X2tleV9mcmFtZShjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOworCisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogRXJyb3IgZXJyb3JfcmVzaWxpZW50X21vZGUgbW9kZSBkb2VzIG5vdCBtYWtlIG11Y2gKKyAgICAgICAgICogc2Vuc2UgZm9yIHR3byBwYXNzIGJ1dCB3aXRoIGl0cyBjdXJyZW50IG1lYW5pbmcgYnV0IHRoaXMgY29kZSBpcworICAgICAgICAgKiBkZXNpZ25lZCB0byBzdG9wIG91dGxhbmRpc2ggYmVoYXZpb3VyIGlmIHNvbWVvbmUgZG9lcyBzZXQgaXQgd2hlbgorICAgICAgICAgKiB1c2luZyB0d28gcGFzcy4gSXQgZWZmZWN0aXZlbHkgZGlzYWJsZXMgR0YgZ3JvdXBzLiBUaGlzIGlzCisgICAgICAgICAqIHRlbXBvcmFyeSBjb2RlIHRpbGwgd2UgZGVjaWRlIHdoYXQgc2hvdWxkIHJlYWxseSBoYXBwZW4gaW4gdGhpcworICAgICAgICAgKiBjYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPSAoaW50KWNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzOworICAgICAgICAgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2Vycm9yX2xlZnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpY3BpLT50d29wYXNzLmtmX2dyb3VwX2Vycm9yX2xlZnQ7CisgICAgICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0gY3BpLT50d29wYXNzLmZyYW1lc190b19rZXk7CisgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOworICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogSXMgdGhpcyBhIEdGIC8gQVJGIChOb3RlIHRoYXQgYSBLRiBpcyBhbHdheXMgYWxzbyBhIEdGKSAqLworICAgIGlmIChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIERlZmluZSBuZXh0IGdmIGdyb3VwIGFuZCBhc3NpZ24gYml0cyB0byBpdCAqLworICAgICAgICB2cHhfbWVtY3B5KCZ0aGlzX2ZyYW1lX2NvcHksICZ0aGlzX2ZyYW1lLCBzaXplb2YodGhpc19mcmFtZSkpOworICAgICAgICBkZWZpbmVfZ2ZfZ3JvdXAoY3BpLCAmdGhpc19mcmFtZV9jb3B5KTsKKworICAgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gY29kZSBhbiBhbHRyZWYgZnJhbWUgYXQgdGhlIGVuZCBvZiB0aGUgZ3JvdXAKKyAgICAgICAgICogYW5kIHRoZSBjdXJyZW50IGZyYW1lIGlzIG5vdCBhIGtleSBmcmFtZS4uLi4gSWYgdGhlIHByZXZpb3VzCisgICAgICAgICAqIGdyb3VwIHVzZWQgYW4gYXJmIHRoaXMgZnJhbWUgaGFzIGFscmVhZHkgYmVuZWZpdGVkIGZyb20gdGhhdCBhcmYKKyAgICAgICAgICogYm9vc3QgYW5kIGl0IHNob3VsZCBub3QgYmUgZ2l2ZW4gZXh0cmEgYml0cyBJZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICogZ3JvdXAgd2FzIE5PVCBjb2RlZCB1c2luZyBhcmYgd2UgbWF5IHdhbnQgdG8gYXBwbHkgc29tZSBib29zdCB0bworICAgICAgICAgKiB0aGlzIEdGIGFzIHdlbGwKKyAgICAgICAgICovCisgICAgICAgIGlmIChjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgJiYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQXNzaWduIGEgc3RhbmRhcmQgZnJhbWVzIHdvcnRoIG9mIGJpdHMgZnJvbSB0aG9zZSBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAqIHRvIHRoZSBHRiBncm91cAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgYmFrID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoOworICAgICAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKKyAgICAgICAgICAgIGFzc2lnbl9zdGRfZnJhbWVfYml0cyhjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOworICAgICAgICAgICAgY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoID0gYmFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogT3RoZXJ3aXNlIHRoaXMgaXMgYW4gb3JkaW5hcnkgZnJhbWUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IEVycm9yIGVycm9yX3Jlc2lsaWVudF9tb2RlIG1vZGUgZG9lcyBub3QgbWFrZSBtdWNoCisgICAgICAgICAqIHNlbnNlIGZvciB0d28gcGFzcyBidXQgd2l0aCBpdHMgY3VycmVudCBtZWFuaW5nIGJ1dCB0aGlzIGNvZGUgaXMKKyAgICAgICAgICogZGVzaWduZWQgdG8gc3RvcCBvdXRsYW5kaXNoIGJlaGF2aW91ciBpZiBzb21lb25lIGRvZXMgc2V0IGl0CisgICAgICAgICAqIHdoZW4gdXNpbmcgdHdvIHBhc3MuIEl0IGVmZmVjdGl2ZWx5IGRpc2FibGVzIEdGIGdyb3Vwcy4gVGhpcyBpcworICAgICAgICAgKiB0ZW1wb3JhcnkgY29kZSB0aWxsIHdlIGRlY2lkZSB3aGF0IHNob3VsZCByZWFsbHkgaGFwcGVuIGluIHRoaXMKKyAgICAgICAgICogY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9IGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5OworCisgICAgICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQXNzaWduIGJpdHMgZnJvbSB0aG9zZSBhbGxvY2F0ZWQgdG8gdGhlIEdGIGdyb3VwICovCisgICAgICAgICAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKKyAgICAgICAgICAgICAgICBhc3NpZ25fc3RkX2ZyYW1lX2JpdHMoY3BpLCAmdGhpc19mcmFtZV9jb3B5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFzc2lnbiBiaXRzIGZyb20gdGhvc2UgYWxsb2NhdGVkIHRvIHRoZSBHRiBncm91cCAqLworICAgICAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKKyAgICAgICAgICAgIGFzc2lnbl9zdGRfZnJhbWVfYml0cyhjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogS2VlcCBhIGdsb2JhbGx5IGF2YWlsYWJsZSBjb3B5IG9mIHRoaXMgYW5kIHRoZSBuZXh0IGZyYW1lJ3MgaWlyYXRpby4gKi8KKyAgICBjcGktPnR3b3Bhc3MudGhpc19paXJhdGlvID0gKHVuc2lnbmVkIGludCkodGhpc19mcmFtZV9pbnRyYV9lcnJvciAvCisgICAgICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKHRoaXNfZnJhbWVfY29kZWRfZXJyb3IpKTsKKyAgICB7CisgICAgICAgIEZJUlNUUEFTU19TVEFUUyBuZXh0X2ZyYW1lOworICAgICAgICBpZiAoIGxvb2t1cF9uZXh0X2ZyYW1lX3N0YXRzKGNwaSwgJm5leHRfZnJhbWUpICE9IEVPRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5uZXh0X2lpcmF0aW8gPSAodW5zaWduZWQgaW50KShuZXh0X2ZyYW1lLmludHJhX2Vycm9yIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSyhuZXh0X2ZyYW1lLmNvZGVkX2Vycm9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgbm9taW5hbCBwZXIgc2Vjb25kIGJhbmR3aWR0aCBmb3IgdGhpcyBmcmFtZSAqLworICAgIGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA9IChpbnQpCisgICAgKGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAqIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUpOworICAgIGlmIChjcGktPnRhcmdldF9iYW5kd2lkdGggPCAwKQorICAgICAgICBjcGktPnRhcmdldF9iYW5kd2lkdGggPSAwOworCisKKyAgICAvKiBBY2NvdW50IGZvciBtdiwgbW9kZSBhbmQgb3RoZXIgb3ZlcmhlYWRzLiAqLworICAgIG92ZXJoZWFkX2JpdHMgPSAoaW50KWVzdGltYXRlX21vZGVtdmNvc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBjcGksICZjcGktPnR3b3Bhc3MudG90YWxfbGVmdF9zdGF0cyApOworCisgICAgLyogU3BlY2lhbCBjYXNlIGNvZGUgZm9yIGZpcnN0IGZyYW1lLiAqLworICAgIGlmIChjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lID09IDApCisgICAgeworICAgICAgICBjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgPSAxLjA7CisKKyAgICAgICAgLyogU2V0IGEgY3FfbGV2ZWwgaW4gY29uc3RyYWluZWQgcXVhbGl0eSBtb2RlLiAqLworICAgICAgICBpZiAoIGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfQ09OU1RSQUlORURfUVVBTElUWSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBlc3RfY3E7CisKKyAgICAgICAgICAgIGVzdF9jcSA9CisgICAgICAgICAgICAgICAgZXN0aW1hdGVfY3EoIGNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+dHdvcGFzcy50b3RhbF9sZWZ0X3N0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShjcGktPnR3b3Bhc3MuYml0c19sZWZ0IC8gZnJhbWVzX2xlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhZF9iaXRzICk7CisKKyAgICAgICAgICAgIGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkgPSBjcGktPm94Y2YuY3FfbGV2ZWw7CisgICAgICAgICAgICBpZiAoIGVzdF9jcSA+IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkgKQorICAgICAgICAgICAgICAgIGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkgPSBlc3RfY3E7CisgICAgICAgIH0KKworICAgICAgICAvKiBndWVzcyBhdCBtYXhxIG5lZWRlZCBpbiAybmQgcGFzcyAqLworICAgICAgICBjcGktPnR3b3Bhc3MubWF4cV9tYXhfbGltaXQgPSBjcGktPndvcnN0X3F1YWxpdHk7CisgICAgICAgIGNwaS0+dHdvcGFzcy5tYXhxX21pbl9saW1pdCA9IGNwaS0+YmVzdF9xdWFsaXR5OworCisgICAgICAgIHRtcF9xID0gZXN0aW1hdGVfbWF4X3EoCisgICAgICAgICAgICAgICAgICAgIGNwaSwKKyAgICAgICAgICAgICAgICAgICAgJmNwaS0+dHdvcGFzcy50b3RhbF9sZWZ0X3N0YXRzLAorICAgICAgICAgICAgICAgICAgICAoaW50KShjcGktPnR3b3Bhc3MuYml0c19sZWZ0IC8gZnJhbWVzX2xlZnQpLAorICAgICAgICAgICAgICAgICAgICBvdmVyaGVhZF9iaXRzICk7CisKKyAgICAgICAgLyogTGltaXQgdGhlIG1heHEgdmFsdWUgcmV0dXJuZWQgc3Vic2VxdWVudGx5LgorICAgICAgICAgKiBUaGlzIGluY3JlYXNlcyB0aGUgcmlzayBvZiBvdmVyc3BlbmQgb3IgdW5kZXJzcGVuZCBpZiB0aGUgaW5pdGlhbAorICAgICAgICAgKiBlc3RpbWF0ZSBmb3IgdGhlIGNsaXAgaXMgYmFkLCBidXQgaGVscHMgcHJldmVudCBleGNlc3NpdmUKKyAgICAgICAgICogdmFyaWF0aW9uIGluIFEsIGVzcGVjaWFsbHkgbmVhciB0aGUgZW5kIG9mIGEgY2xpcAorICAgICAgICAgKiB3aGVyZSBmb3IgZXhhbXBsZSBhIHNtYWxsIG92ZXJzcGVuZCBtYXkgY2F1c2UgUSB0byBjcmFzaAorICAgICAgICAgKi8KKyAgICAgICAgY3BpLT50d29wYXNzLm1heHFfbWF4X2xpbWl0ID0gKCh0bXBfcSArIDMyKSA8IGNwaS0+d29yc3RfcXVhbGl0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0bXBfcSArIDMyKSA6IGNwaS0+d29yc3RfcXVhbGl0eTsKKyAgICAgICAgY3BpLT50d29wYXNzLm1heHFfbWluX2xpbWl0ID0gKCh0bXBfcSAtIDMyKSA+IGNwaS0+YmVzdF9xdWFsaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHRtcF9xIC0gMzIpIDogY3BpLT5iZXN0X3F1YWxpdHk7CisKKyAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSAgICAgICAgID0gdG1wX3E7CisgICAgICAgIGNwaS0+bmlfYXZfcWkgICAgICAgICAgICAgICAgICAgICA9IHRtcF9xOworICAgIH0KKworICAgIC8qIFRoZSBsYXN0IGZldyBmcmFtZXMgb2YgYSBjbGlwIGFsbW9zdCBhbHdheXMgaGF2ZSB0byBmZXcgb3IgdG9vIG1hbnkKKyAgICAgKiBiaXRzIGFuZCBmb3IgdGhlIHNha2Ugb2Ygb3ZlciBleGFjdCByYXRlIGNvbnRyb2wgd2UgZG9udCB3YW50IHRvIG1ha2UKKyAgICAgKiByYWRpY2FsIGFkanVzdG1lbnRzIHRvIHRoZSBhbGxvd2VkIHF1YW50aXplciByYW5nZSBqdXN0IHRvIHVzZSB1cCBhCisgICAgICogZmV3IHN1cnBsdXMgYml0cyBvciBnZXQgYmVuZWF0aCB0aGUgdGFyZ2V0IHJhdGUuCisgICAgICovCisgICAgZWxzZSBpZiAoIChjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lIDwKKyAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KWNwaS0+dHdvcGFzcy50b3RhbF9zdGF0cy5jb3VudCAqIDI1NSk+PjgpKSAmJgorICAgICAgICAgICAgICAoKGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUgKyBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsKSA8CisgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY3BpLT50d29wYXNzLnRvdGFsX3N0YXRzLmNvdW50KSApCisgICAgeworICAgICAgICBpZiAoZnJhbWVzX2xlZnQgPCAxKQorICAgICAgICAgICAgZnJhbWVzX2xlZnQgPSAxOworCisgICAgICAgIHRtcF9xID0gZXN0aW1hdGVfbWF4X3EoCisgICAgICAgICAgICAgICAgICAgIGNwaSwKKyAgICAgICAgICAgICAgICAgICAgJmNwaS0+dHdvcGFzcy50b3RhbF9sZWZ0X3N0YXRzLAorICAgICAgICAgICAgICAgICAgICAoaW50KShjcGktPnR3b3Bhc3MuYml0c19sZWZ0IC8gZnJhbWVzX2xlZnQpLAorICAgICAgICAgICAgICAgICAgICBvdmVyaGVhZF9iaXRzICk7CisKKyAgICAgICAgLyogTW92ZSBhY3RpdmVfd29yc3RfcXVhbGl0eSBidXQgaW4gYSBkYW1wZWQgd2F5ICovCisgICAgICAgIGlmICh0bXBfcSA+IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkpCisgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ICsrOworICAgICAgICBlbHNlIGlmICh0bXBfcSA8IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkpCisgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IC0tOworCisgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPQorICAgICAgICAgICAgKChjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ICogMykgKyB0bXBfcSArIDIpIC8gNDsKKyAgICB9CisKKyAgICBjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSAtLTsKKworICAgIC8qIFVwZGF0ZSB0aGUgdG90YWwgc3RhdHMgcmVtYWluaW5nIHN0dXJjdHVyZSAqLworICAgIHN1YnRyYWN0X3N0YXRzKCZjcGktPnR3b3Bhc3MudG90YWxfbGVmdF9zdGF0cywgJnRoaXNfZnJhbWUgKTsKK30KKworCitzdGF0aWMgaW50IHRlc3RfY2FuZGlkYXRlX2tmKFZQOF9DT01QICpjcGksICBGSVJTVFBBU1NfU1RBVFMgKmxhc3RfZnJhbWUsIEZJUlNUUEFTU19TVEFUUyAqdGhpc19mcmFtZSwgRklSU1RQQVNTX1NUQVRTICpuZXh0X2ZyYW1lKQoreworICAgIGludCBpc192aWFibGVfa2YgPSAwOworCisgICAgLyogRG9lcyB0aGUgZnJhbWUgc2F0aXNmeSB0aGUgcHJpbWFyeSBjcml0ZXJpYSBvZiBhIGtleSBmcmFtZQorICAgICAqICAgICAgSWYgc28sIHRoZW4gZXhhbWluZSBob3cgd2VsbCBpdCBwcmVkaWN0cyBzdWJzZXF1ZW50IGZyYW1lcworICAgICAqLworICAgIGlmICgodGhpc19mcmFtZS0+cGNudF9zZWNvbmRfcmVmIDwgMC4xMCkgJiYKKyAgICAgICAgKG5leHRfZnJhbWUtPnBjbnRfc2Vjb25kX3JlZiA8IDAuMTApICYmCisgICAgICAgICgodGhpc19mcmFtZS0+cGNudF9pbnRlciA8IDAuMDUpIHx8CisgICAgICAgICAoCisgICAgICAgICAgICAgKCh0aGlzX2ZyYW1lLT5wY250X2ludGVyIC0gdGhpc19mcmFtZS0+cGNudF9uZXV0cmFsKSA8IC4yNSkgJiYKKyAgICAgICAgICAgICAoKHRoaXNfZnJhbWUtPmludHJhX2Vycm9yIC8gRE9VQkxFX0RJVklERV9DSEVDSyh0aGlzX2ZyYW1lLT5jb2RlZF9lcnJvcikpIDwgMi41KSAmJgorICAgICAgICAgICAgICgoZmFicyhsYXN0X2ZyYW1lLT5jb2RlZF9lcnJvciAtIHRoaXNfZnJhbWUtPmNvZGVkX2Vycm9yKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0sodGhpc19mcmFtZS0+Y29kZWRfZXJyb3IpID4gLjQwKSB8fAorICAgICAgICAgICAgICAoZmFicyhsYXN0X2ZyYW1lLT5pbnRyYV9lcnJvciAtIHRoaXNfZnJhbWUtPmludHJhX2Vycm9yKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0sodGhpc19mcmFtZS0+aW50cmFfZXJyb3IpID4gLjQwKSB8fAorICAgICAgICAgICAgICAoKG5leHRfZnJhbWUtPmludHJhX2Vycm9yIC8gRE9VQkxFX0RJVklERV9DSEVDSyhuZXh0X2ZyYW1lLT5jb2RlZF9lcnJvcikpID4gMy41KQorICAgICAgICAgICAgICkKKyAgICAgICAgICkKKyAgICAgICAgKQorICAgICAgICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBGSVJTVFBBU1NfU1RBVFMgKnN0YXJ0X3BvczsKKworICAgICAgICBGSVJTVFBBU1NfU1RBVFMgbG9jYWxfbmV4dF9mcmFtZTsKKworICAgICAgICBkb3VibGUgYm9vc3Rfc2NvcmUgPSAwLjA7CisgICAgICAgIGRvdWJsZSBvbGRfYm9vc3Rfc2NvcmUgPSAwLjA7CisgICAgICAgIGRvdWJsZSBkZWNheV9hY2N1bXVsYXRvciA9IDEuMDsKKyAgICAgICAgZG91YmxlIG5leHRfaWlyYXRpbzsKKworICAgICAgICB2cHhfbWVtY3B5KCZsb2NhbF9uZXh0X2ZyYW1lLCBuZXh0X2ZyYW1lLCBzaXplb2YoKm5leHRfZnJhbWUpKTsKKworICAgICAgICAvKiBOb3RlIHRoZSBzdGFydGluZyBmaWxlIHBvc2l0aW9uIHNvIHdlIGNhbiByZXNldCB0byBpdCAqLworICAgICAgICBzdGFydF9wb3MgPSBjcGktPnR3b3Bhc3Muc3RhdHNfaW47CisKKyAgICAgICAgLyogRXhhbWluZSBob3cgd2VsbCB0aGUga2V5IGZyYW1lIHByZWRpY3RzIHN1YnNlcXVlbnQgZnJhbWVzICovCisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dF9paXJhdGlvID0gKElJS0ZBQ1RPUjEgKiBsb2NhbF9uZXh0X2ZyYW1lLmludHJhX2Vycm9yIC8gRE9VQkxFX0RJVklERV9DSEVDSyhsb2NhbF9uZXh0X2ZyYW1lLmNvZGVkX2Vycm9yKSkgOworCisgICAgICAgICAgICBpZiAobmV4dF9paXJhdGlvID4gUk1BWCkKKyAgICAgICAgICAgICAgICBuZXh0X2lpcmF0aW8gPSBSTUFYOworCisgICAgICAgICAgICAvKiBDdW11bGF0aXZlIGVmZmVjdCBvZiBkZWNheSBpbiBwcmVkaWN0aW9uIHF1YWxpdHkgKi8KKyAgICAgICAgICAgIGlmIChsb2NhbF9uZXh0X2ZyYW1lLnBjbnRfaW50ZXIgPiAwLjg1KQorICAgICAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yID0gZGVjYXlfYWNjdW11bGF0b3IgKiBsb2NhbF9uZXh0X2ZyYW1lLnBjbnRfaW50ZXI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPSBkZWNheV9hY2N1bXVsYXRvciAqICgoMC44NSArIGxvY2FsX25leHRfZnJhbWUucGNudF9pbnRlcikgLyAyLjApOworCisgICAgICAgICAgICAvKiBLZWVwIGEgcnVubmluZyB0b3RhbCAqLworICAgICAgICAgICAgYm9vc3Rfc2NvcmUgKz0gKGRlY2F5X2FjY3VtdWxhdG9yICogbmV4dF9paXJhdGlvKTsKKworICAgICAgICAgICAgLyogVGVzdCB2YXJpb3VzIGJyZWFrb3V0IGNsYXVzZXMgKi8KKyAgICAgICAgICAgIGlmICgobG9jYWxfbmV4dF9mcmFtZS5wY250X2ludGVyIDwgMC4wNSkgfHwKKyAgICAgICAgICAgICAgICAobmV4dF9paXJhdGlvIDwgMS41KSB8fAorICAgICAgICAgICAgICAgICgoKGxvY2FsX25leHRfZnJhbWUucGNudF9pbnRlciAtCisgICAgICAgICAgICAgICAgICAgbG9jYWxfbmV4dF9mcmFtZS5wY250X25ldXRyYWwpIDwgMC4yMCkgJiYKKyAgICAgICAgICAgICAgICAgKG5leHRfaWlyYXRpbyA8IDMuMCkpIHx8CisgICAgICAgICAgICAgICAgKChib29zdF9zY29yZSAtIG9sZF9ib29zdF9zY29yZSkgPCAwLjUpIHx8CisgICAgICAgICAgICAgICAgKGxvY2FsX25leHRfZnJhbWUuaW50cmFfZXJyb3IgPCAyMDApCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9sZF9ib29zdF9zY29yZSA9IGJvb3N0X3Njb3JlOworCisgICAgICAgICAgICAvKiBHZXQgdGhlIG5leHQgZnJhbWUgZGV0YWlscyAqLworICAgICAgICAgICAgaWYgKEVPRiA9PSBpbnB1dF9zdGF0cyhjcGksICZsb2NhbF9uZXh0X2ZyYW1lKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZXJlIGlzIHRvbGVyYWJsZSBwcmVkaWN0aW9uIGZvciBhdCBsZWFzdCB0aGUgbmV4dCAzIGZyYW1lcworICAgICAgICAgKiB0aGVuIGJyZWFrIG91dCBlbHNlIGRpc2NhcmQgdGhpcyBwb3R0ZW50aWFsIGtleSBmcmFtZSBhbmQgbW92ZSBvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGJvb3N0X3Njb3JlID4gNS4wICYmIChpID4gMykpCisgICAgICAgICAgICBpc192aWFibGVfa2YgPSAxOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBmaWxlIHBvc2l0aW9uICovCisgICAgICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBzdGFydF9wb3MpOworCisgICAgICAgICAgICBpc192aWFibGVfa2YgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlzX3ZpYWJsZV9rZjsKK30KK3N0YXRpYyB2b2lkIGZpbmRfbmV4dF9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICp0aGlzX2ZyYW1lKQoreworICAgIGludCBpLGo7CisgICAgRklSU1RQQVNTX1NUQVRTIGxhc3RfZnJhbWU7CisgICAgRklSU1RQQVNTX1NUQVRTIGZpcnN0X2ZyYW1lOworICAgIEZJUlNUUEFTU19TVEFUUyBuZXh0X2ZyYW1lOworICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhcnRfcG9zaXRpb247CisKKyAgICBkb3VibGUgZGVjYXlfYWNjdW11bGF0b3IgPSAxLjA7CisgICAgZG91YmxlIGJvb3N0X3Njb3JlID0gMDsKKyAgICBkb3VibGUgb2xkX2Jvb3N0X3Njb3JlID0gMC4wOworICAgIGRvdWJsZSBsb29wX2RlY2F5X3JhdGU7CisKKyAgICBkb3VibGUga2ZfbW9kX2VyciA9IDAuMDsKKyAgICBkb3VibGUga2ZfZ3JvdXBfZXJyID0gMC4wOworICAgIGRvdWJsZSBrZl9ncm91cF9pbnRyYV9lcnIgPSAwLjA7CisgICAgZG91YmxlIGtmX2dyb3VwX2NvZGVkX2VyciA9IDAuMDsKKyAgICBkb3VibGUgcmVjZW50X2xvb3BfZGVjYXlbOF0gPSB7MS4wLDEuMCwxLjAsMS4wLDEuMCwxLjAsMS4wLDEuMH07CisKKyAgICB2cHhfbWVtc2V0KCZuZXh0X2ZyYW1lLCAwLCBzaXplb2YobmV4dF9mcmFtZSkpOworCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworICAgIHN0YXJ0X3Bvc2l0aW9uID0gY3BpLT50d29wYXNzLnN0YXRzX2luOworCisgICAgY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9IEtFWV9GUkFNRTsKKworICAgIC8qIGlzIHRoaXMgYSBmb3JjZWQga2V5IGZyYW1lIGJ5IGludGVydmFsICovCisgICAgY3BpLT50aGlzX2tleV9mcmFtZV9mb3JjZWQgPSBjcGktPm5leHRfa2V5X2ZyYW1lX2ZvcmNlZDsKKworICAgIC8qIENsZWFyIHRoZSBhbHQgcmVmIGFjdGl2ZSBmbGFnIGFzIHRoaXMgY2FuIG5ldmVyIGJlIGFjdGl2ZSBvbiBhIGtleQorICAgICAqIGZyYW1lCisgICAgICovCisgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUgPSAwOworCisgICAgLyogS2YgaXMgYWx3YXlzIGEgZ2Ygc28gY2xlYXIgZnJhbWVzIHRpbGwgbmV4dCBnZiBjb3VudGVyICovCisgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gMDsKKworICAgIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5ID0gMTsKKworICAgIC8qIFRha2UgYSBjb3B5IG9mIHRoZSBpbml0aWFsIGZyYW1lIGRldGFpbHMgKi8KKyAgICB2cHhfbWVtY3B5KCZmaXJzdF9mcmFtZSwgdGhpc19mcmFtZSwgc2l6ZW9mKCp0aGlzX2ZyYW1lKSk7CisKKyAgICBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyA9IDA7CisgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2Vycm9yX2xlZnQgPSAwOworCisgICAga2ZfbW9kX2VyciA9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKKworICAgIC8qIGZpbmQgdGhlIG5leHQga2V5ZnJhbWUgKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAoY3BpLT50d29wYXNzLnN0YXRzX2luIDwgY3BpLT50d29wYXNzLnN0YXRzX2luX2VuZCkKKyAgICB7CisgICAgICAgIC8qIEFjY3VtdWxhdGUga2YgZ3JvdXAgZXJyb3IgKi8KKyAgICAgICAga2ZfZ3JvdXBfZXJyICs9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKKworICAgICAgICAvKiBUaGVzZSBmaWd1cmVzIGtlZXAgaW50cmEgYW5kIGNvZGVkIGVycm9yIGNvdW50cyBmb3IgYWxsIGZyYW1lcworICAgICAgICAgKiBpbmNsdWRpbmcga2V5IGZyYW1lcyBpbiB0aGUgZ3JvdXAuIFRoZSBlZmZlY3Qgb2YgdGhlIGtleSBmcmFtZQorICAgICAgICAgKiBpdHNlbGYgY2FuIGJlIHN1YnRyYWN0ZWQgb3V0IHVzaW5nIHRoZSBmaXJzdF9mcmFtZSBkYXRhCisgICAgICAgICAqIGNvbGxlY3RlZCBhYm92ZQorICAgICAgICAgKi8KKyAgICAgICAga2ZfZ3JvdXBfaW50cmFfZXJyICs9IHRoaXNfZnJhbWUtPmludHJhX2Vycm9yOworICAgICAgICBrZl9ncm91cF9jb2RlZF9lcnIgKz0gdGhpc19mcmFtZS0+Y29kZWRfZXJyb3I7CisKKyAgICAgICAgLyogbG9hZCBhIHRoZSBuZXh0IGZyYW1lJ3Mgc3RhdHMgKi8KKyAgICAgICAgdnB4X21lbWNweSgmbGFzdF9mcmFtZSwgdGhpc19mcmFtZSwgc2l6ZW9mKCp0aGlzX2ZyYW1lKSk7CisgICAgICAgIGlucHV0X3N0YXRzKGNwaSwgdGhpc19mcmFtZSk7CisKKyAgICAgICAgLyogUHJvdmlkZWQgdGhhdCB3ZSBhcmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuLi4gKi8KKyAgICAgICAgaWYgKGNwaS0+b3hjZi5hdXRvX2tleQorICAgICAgICAgICAgJiYgbG9va3VwX25leHRfZnJhbWVfc3RhdHMoY3BpLCAmbmV4dF9mcmFtZSkgIT0gRU9GKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3JtYWwgc2NlbmUgY3V0IGNoZWNrICovCisgICAgICAgICAgICBpZiAoICggaSA+PSBNSU5fR0ZfSU5URVJWQUwgKSAmJgorICAgICAgICAgICAgICAgICB0ZXN0X2NhbmRpZGF0ZV9rZihjcGksICZsYXN0X2ZyYW1lLCB0aGlzX2ZyYW1lLCAmbmV4dF9mcmFtZSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBIb3cgZmFzdCBpcyBwcmVkaWN0aW9uIHF1YWxpdHkgZGVjYXlpbmcgKi8KKyAgICAgICAgICAgIGxvb3BfZGVjYXlfcmF0ZSA9IGdldF9wcmVkaWN0aW9uX2RlY2F5X3JhdGUoY3BpLCAmbmV4dF9mcmFtZSk7CisKKyAgICAgICAgICAgIC8qIFdlIHdhbnQgdG8ga25vdyBzb21ldGhpbmcgYWJvdXQgdGhlIHJlY2VudCBwYXN0Li4uIHJhdGhlciB0aGFuCisgICAgICAgICAgICAgKiBhcyB1c2VkIGVsc2V3aGVyZSB3aGVyZSB3ZSBhcmUgY29uY2VuZWQgd2l0aCBkZWNheSBpbiBwcmVkaWN0aW9uCisgICAgICAgICAgICAgKiBxdWFsaXR5IHNpbmNlIHRoZSBsYXN0IEdGIG9yIEtGLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZWNlbnRfbG9vcF9kZWNheVtpJThdID0gbG9vcF9kZWNheV9yYXRlOworICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPSAxLjA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yID0gZGVjYXlfYWNjdW11bGF0b3IgKiByZWNlbnRfbG9vcF9kZWNheVtqXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU3BlY2lhbCBjaGVjayBmb3IgdHJhbnNpdGlvbiBvciBoaWdoIG1vdGlvbiBmb2xsb3dlZCBieSBhCisgICAgICAgICAgICAgKiBzdGF0aWMgc2NlbmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggZGV0ZWN0X3RyYW5zaXRpb25fdG9fc3RpbGwoIGNwaSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPmtleV9mcmFtZV9mcmVxdWVuY3ktaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wX2RlY2F5X3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNheV9hY2N1bXVsYXRvciApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKiBTdGVwIG9uIHRvIHRoZSBuZXh0IGZyYW1lICovCisgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSArKzsKKworICAgICAgICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHJlYWwga2V5IGZyYW1lIHdpdGhpbiB0aGUgbmV4dCB0d28KKyAgICAgICAgICAgICAqIGZvcmNla2V5ZnJhbWVldmVyeSBpbnRlcnZhbHMgdGhlbiBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSA+PSAyICooaW50KWNwaS0+a2V5X2ZyYW1lX2ZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSArKzsKKworICAgICAgICBpKys7CisgICAgfQorCisgICAgLyogSWYgdGhlcmUgaXMgYSBtYXgga2YgaW50ZXJ2YWwgc2V0IGJ5IHRoZSB1c2VyIHdlIG11c3Qgb2JleSBpdC4KKyAgICAgKiBXZSBhbHJlYWR5IGJyZWFrb3V0IG9mIHRoZSBsb29wIGFib3ZlIGF0IDJ4IG1heC4KKyAgICAgKiBUaGlzIGNvZGUgY2VudGVycyB0aGUgZXh0cmEga2YgaWYgdGhlIGFjdHVhbCBuYXR1cmFsCisgICAgICogaW50ZXJ2YWwgaXMgYmV0d2VlbiAxeCBhbmQgMngKKyAgICAgKi8KKyAgICBpZiAoY3BpLT5veGNmLmF1dG9fa2V5CisgICAgICAgICYmIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5ID4gKGludCljcGktPmtleV9mcmFtZV9mcmVxdWVuY3kgKQorICAgIHsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTICpjdXJyZW50X3BvcyA9IGNwaS0+dHdvcGFzcy5zdGF0c19pbjsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTIHRtcF9mcmFtZTsKKworICAgICAgICBjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSAvPSAyOworCisgICAgICAgIC8qIENvcHkgZmlyc3QgZnJhbWUgZGV0YWlscyAqLworICAgICAgICB2cHhfbWVtY3B5KCZ0bXBfZnJhbWUsICZmaXJzdF9mcmFtZSwgc2l6ZW9mKGZpcnN0X2ZyYW1lKSk7CisKKyAgICAgICAgLyogUmVzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBncm91cCAqLworICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBzdGFydF9wb3NpdGlvbik7CisKKyAgICAgICAga2ZfZ3JvdXBfZXJyID0gMDsKKyAgICAgICAga2ZfZ3JvdXBfaW50cmFfZXJyID0gMDsKKyAgICAgICAga2ZfZ3JvdXBfY29kZWRfZXJyID0gMDsKKworICAgICAgICAvKiBSZXNjYW4gdG8gZ2V0IHRoZSBjb3JyZWN0IGVycm9yIGRhdGEgZm9yIHRoZSBmb3JjZWQga2YgZ3JvdXAgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBY2N1bXVsYXRlIGtmIGdyb3VwIGVycm9ycyAqLworICAgICAgICAgICAga2ZfZ3JvdXBfZXJyICs9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCAmdG1wX2ZyYW1lKTsKKyAgICAgICAgICAgIGtmX2dyb3VwX2ludHJhX2VyciArPSB0bXBfZnJhbWUuaW50cmFfZXJyb3I7CisgICAgICAgICAgICBrZl9ncm91cF9jb2RlZF9lcnIgKz0gdG1wX2ZyYW1lLmNvZGVkX2Vycm9yOworCisgICAgICAgICAgICAvKiBMb2FkIGEgdGhlIG5leHQgZnJhbWUncyBzdGF0cyAqLworICAgICAgICAgICAgaW5wdXRfc3RhdHMoY3BpLCAmdG1wX2ZyYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZ3JvdXAgKi8KKyAgICAgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgY3VycmVudF9wb3MpOworCisgICAgICAgIGNwaS0+bmV4dF9rZXlfZnJhbWVfZm9yY2VkID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjcGktPm5leHRfa2V5X2ZyYW1lX2ZvcmNlZCA9IDA7CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBsYXN0IGZyYW1lIG9mIHRoZSBmaWxlICovCisgICAgaWYgKGNwaS0+dHdvcGFzcy5zdGF0c19pbiA+PSBjcGktPnR3b3Bhc3Muc3RhdHNfaW5fZW5kKQorICAgIHsKKyAgICAgICAgLyogQWNjdW11bGF0ZSBrZiBncm91cCBlcnJvciAqLworICAgICAgICBrZl9ncm91cF9lcnIgKz0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksIHRoaXNfZnJhbWUpOworCisgICAgICAgIC8qIFRoZXNlIGZpZ3VyZXMga2VlcCBpbnRyYSBhbmQgY29kZWQgZXJyb3IgY291bnRzIGZvciBhbGwgZnJhbWVzCisgICAgICAgICAqIGluY2x1ZGluZyBrZXkgZnJhbWVzIGluIHRoZSBncm91cC4gVGhlIGVmZmVjdCBvZiB0aGUga2V5IGZyYW1lCisgICAgICAgICAqIGl0c2VsZiBjYW4gYmUgc3VidHJhY3RlZCBvdXQgdXNpbmcgdGhlIGZpcnN0X2ZyYW1lIGRhdGEKKyAgICAgICAgICogY29sbGVjdGVkIGFib3ZlCisgICAgICAgICAqLworICAgICAgICBrZl9ncm91cF9pbnRyYV9lcnIgKz0gdGhpc19mcmFtZS0+aW50cmFfZXJyb3I7CisgICAgICAgIGtmX2dyb3VwX2NvZGVkX2VyciArPSB0aGlzX2ZyYW1lLT5jb2RlZF9lcnJvcjsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBrZiBncm91cC4gKi8KKyAgICBpZiAoKGNwaS0+dHdvcGFzcy5iaXRzX2xlZnQgPiAwKSAmJiAoY3BpLT50d29wYXNzLm1vZGlmaWVkX2Vycm9yX2xlZnQgPiAwLjApKQorICAgIHsKKyAgICAgICAgLyogTWF4IGZvciBhIHNpbmdsZSBub3JtYWwgZnJhbWUgKG5vdCBrZXkgZnJhbWUpICovCisgICAgICAgIGludCBtYXhfYml0cyA9IGZyYW1lX21heF9iaXRzKGNwaSk7CisKKyAgICAgICAgLyogTWF4aW11bSBiaXRzIGZvciB0aGUga2YgZ3JvdXAgKi8KKyAgICAgICAgaW50NjRfdCBtYXhfZ3JwX2JpdHM7CisKKyAgICAgICAgLyogRGVmYXVsdCBhbGxvY2F0aW9uIGJhc2VkIG9uIGJpdHMgbGVmdCBhbmQgcmVsYXRpdmUKKyAgICAgICAgICogY29tcGxleGl0eSBvZiB0aGUgc2VjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPSAoaW50NjRfdCkoIGNwaS0+dHdvcGFzcy5iaXRzX2xlZnQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBrZl9ncm91cF9lcnIgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MubW9kaWZpZWRfZXJyb3JfbGVmdCApKTsKKworICAgICAgICAvKiBDbGlwIGJhc2VkIG9uIG1heGltdW0gcGVyIGZyYW1lIHJhdGUgZGVmaW5lZCBieSB0aGUgdXNlci4gKi8KKyAgICAgICAgbWF4X2dycF9iaXRzID0gKGludDY0X3QpbWF4X2JpdHMgKiAoaW50NjRfdCljcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleTsKKyAgICAgICAgaWYgKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzID4gbWF4X2dycF9iaXRzKQorICAgICAgICAgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPSBtYXhfZ3JwX2JpdHM7CisKKyAgICAgICAgLyogQWRkaXRpb25hbCBzcGVjaWFsIGNhc2UgZm9yIENCUiBpZiBidWZmZXIgaXMgZ2V0dGluZyBmdWxsLiAqLworICAgICAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDY0X3Qgb3B0X2J1ZmZlcl9sdmwgPSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWw7CisgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlcl9sdmwgPSBjcGktPmJ1ZmZlcl9sZXZlbDsKKworICAgICAgICAgICAgLyogSWYgdGhlIGJ1ZmZlciBpcyBuZWFyIG9yIGFib3ZlIHRoZSBvcHRpbWFsIGFuZCB0aGlzIGtmIGdyb3VwIGlzCisgICAgICAgICAgICAgKiBub3QgYmVpbmcgYWxsb2NhdGVkIG11Y2ggdGhlbiBpbmNyZWFzZSB0aGUgYWxsb2NhdGlvbiBhIGJpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9sdmwgPj0gb3B0X2J1ZmZlcl9sdmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBoaWdoX3dhdGVyX21hcmsgPSAob3B0X2J1ZmZlcl9sdmwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpID4+IDE7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGF2X2dyb3VwX2JpdHM7CisKKyAgICAgICAgICAgICAgICAvKiBBdiBiaXRzIHBlciBmcmFtZSAqIG51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICBhdl9ncm91cF9iaXRzID0gKGludDY0X3QpY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpY3BpLT50d29wYXNzLmZyYW1lc190b19rZXk7CisKKyAgICAgICAgICAgICAgICAvKiBXZSBhcmUgYXQgb3IgYWJvdmUgdGhlIG1heGltdW0uICovCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+YnVmZmVyX2xldmVsID49IGhpZ2hfd2F0ZXJfbWFyaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX2dyb3VwX2JpdHM7CisKKyAgICAgICAgICAgICAgICAgICAgbWluX2dyb3VwX2JpdHMgPSBhdl9ncm91cF9iaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkoYnVmZmVyX2x2bCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF93YXRlcl9tYXJrKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPCBtaW5fZ3JvdXBfYml0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzID0gbWluX2dyb3VwX2JpdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGFyZSBhYm92ZSBvcHRpbWFsIGJ1dCBiZWxvdyB0aGUgbWF4aW11bSAqLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzIDwgYXZfZ3JvdXBfYml0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYml0c19iZWxvd19hdiA9IGF2X2dyb3VwX2JpdHMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzOworCisgICAgICAgICAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzICs9CisgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSgoZG91YmxlKWJpdHNfYmVsb3dfYXYgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKShidWZmZXJfbHZsIC0gb3B0X2J1ZmZlcl9sdmwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkoaGlnaF93YXRlcl9tYXJrIC0gb3B0X2J1ZmZlcl9sdmwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyA9IDA7CisKKyAgICAvKiBSZXNldCB0aGUgZmlyc3QgcGFzcyBmaWxlIHBvc2l0aW9uICovCisgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zaXRpb24pOworCisgICAgLyogZGV0ZXJtaW5lIGhvdyBiaWcgdG8gbWFrZSB0aGlzIGtleWZyYW1lIGJhc2VkIG9uIGhvdyB3ZWxsIHRoZQorICAgICAqIHN1YnNlcXVlbnQgZnJhbWVzIHVzZSBpbnRlciBibG9ja3MKKyAgICAgKi8KKyAgICBkZWNheV9hY2N1bXVsYXRvciA9IDEuMDsKKyAgICBib29zdF9zY29yZSA9IDAuMDsKKyAgICBsb29wX2RlY2F5X3JhdGUgPSAxLjAwOyAgICAgICAvKiBTdGFydGluZyBkZWNheSByYXRlICovCisKKyAgICBmb3IgKGkgPSAwIDsgaSA8IGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5IDsgaSsrKQorICAgIHsKKyAgICAgICAgZG91YmxlIHI7CisKKyAgICAgICAgaWYgKEVPRiA9PSBpbnB1dF9zdGF0cyhjcGksICZuZXh0X2ZyYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChuZXh0X2ZyYW1lLmludHJhX2Vycm9yID4gY3BpLT50d29wYXNzLmtmX2ludHJhX2Vycl9taW4pCisgICAgICAgICAgICByID0gKElJS0ZBQ1RPUjIgKiBuZXh0X2ZyYW1lLmludHJhX2Vycm9yIC8KKyAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0sobmV4dF9mcmFtZS5jb2RlZF9lcnJvcikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByID0gKElJS0ZBQ1RPUjIgKiBjcGktPnR3b3Bhc3Mua2ZfaW50cmFfZXJyX21pbiAvCisgICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKG5leHRfZnJhbWUuY29kZWRfZXJyb3IpKTsKKworICAgICAgICBpZiAociA+IFJNQVgpCisgICAgICAgICAgICByID0gUk1BWDsKKworICAgICAgICAvKiBIb3cgZmFzdCBpcyBwcmVkaWN0aW9uIHF1YWxpdHkgZGVjYXlpbmcgKi8KKyAgICAgICAgbG9vcF9kZWNheV9yYXRlID0gZ2V0X3ByZWRpY3Rpb25fZGVjYXlfcmF0ZShjcGksICZuZXh0X2ZyYW1lKTsKKworICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9IGRlY2F5X2FjY3VtdWxhdG9yICogbG9vcF9kZWNheV9yYXRlOworICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9IGRlY2F5X2FjY3VtdWxhdG9yIDwgMC4xID8gMC4xIDogZGVjYXlfYWNjdW11bGF0b3I7CisKKyAgICAgICAgYm9vc3Rfc2NvcmUgKz0gKGRlY2F5X2FjY3VtdWxhdG9yICogcik7CisKKyAgICAgICAgaWYgKChpID4gTUlOX0dGX0lOVEVSVkFMKSAmJgorICAgICAgICAgICAgKChib29zdF9zY29yZSAtIG9sZF9ib29zdF9zY29yZSkgPCAxLjApKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG9sZF9ib29zdF9zY29yZSA9IGJvb3N0X3Njb3JlOworICAgIH0KKworICAgIGlmICgxKQorICAgIHsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTIHNlY3Rpb25zdGF0czsKKyAgICAgICAgZG91YmxlIFJhdGlvOworCisgICAgICAgIHplcm9fc3RhdHMoJnNlY3Rpb25zdGF0cyk7CisgICAgICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIHN0YXJ0X3Bvc2l0aW9uKTsKKworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5IDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnB1dF9zdGF0cyhjcGksICZuZXh0X2ZyYW1lKTsKKyAgICAgICAgICAgIGFjY3VtdWxhdGVfc3RhdHMoJnNlY3Rpb25zdGF0cywgJm5leHRfZnJhbWUpOworICAgICAgICB9CisKKyAgICAgICAgYXZnX3N0YXRzKCZzZWN0aW9uc3RhdHMpOworCisgICAgICAgIGNwaS0+dHdvcGFzcy5zZWN0aW9uX2ludHJhX3JhdGluZyA9ICh1bnNpZ25lZCBpbnQpCisgICAgICAgICAgICAoc2VjdGlvbnN0YXRzLmludHJhX2Vycm9yCisgICAgICAgICAgICAvIERPVUJMRV9ESVZJREVfQ0hFQ0soc2VjdGlvbnN0YXRzLmNvZGVkX2Vycm9yKSk7CisKKyAgICAgICAgUmF0aW8gPSBzZWN0aW9uc3RhdHMuaW50cmFfZXJyb3IgLyBET1VCTEVfRElWSURFX0NIRUNLKHNlY3Rpb25zdGF0cy5jb2RlZF9lcnJvcik7CisgICAgICAgIGNwaS0+dHdvcGFzcy5zZWN0aW9uX21heF9xZmFjdG9yID0gMS4wIC0gKChSYXRpbyAtIDEwLjApICogMC4wMjUpOworCisgICAgICAgIGlmIChjcGktPnR3b3Bhc3Muc2VjdGlvbl9tYXhfcWZhY3RvciA8IDAuODApCisgICAgICAgICAgICBjcGktPnR3b3Bhc3Muc2VjdGlvbl9tYXhfcWZhY3RvciA9IDAuODA7CisgICAgfQorCisgICAgLyogV2hlbiB1c2luZyBDQlIgYXBwbHkgYWRkaXRpb25hbCBidWZmZXIgZnVsbG5lc3MgcmVsYXRlZCB1cHBlciBsaW1pdHMgKi8KKyAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCisgICAgeworICAgICAgICBkb3VibGUgbWF4X2Jvb3N0OworCisgICAgICAgIGlmIChjcGktPmRyb3BfZnJhbWVzX2FsbG93ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkZl9idWZmZXJfbGV2ZWwgPSAoaW50KShjcGktPm94Y2YuZHJvcF9mcmFtZXNfd2F0ZXJfbWFyaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMCkpOworCisgICAgICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPiBkZl9idWZmZXJfbGV2ZWwpCisgICAgICAgICAgICAgICAgbWF4X2Jvb3N0ID0gKChkb3VibGUpKChjcGktPmJ1ZmZlcl9sZXZlbCAtIGRmX2J1ZmZlcl9sZXZlbCkgKiAyIC8gMykgKiAxNi4wKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1heF9ib29zdCA9IDAuMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heF9ib29zdCA9ICgoZG91YmxlKShjcGktPmJ1ZmZlcl9sZXZlbCAqIDIgLyAzKSAqIDE2LjApIC8gRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtYXhfYm9vc3QgPSAwLjA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYm9vc3Rfc2NvcmUgPiBtYXhfYm9vc3QpCisgICAgICAgICAgICBib29zdF9zY29yZSA9IG1heF9ib29zdDsKKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgZmlyc3QgcGFzcyBmaWxlIHBvc2l0aW9uICovCisgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zaXRpb24pOworCisgICAgLyogV29yayBvdXQgaG93IG1hbnkgYml0cyB0byBhbGxvY2F0ZSBmb3IgdGhlIGtleSBmcmFtZSBpdHNlbGYgKi8KKyAgICBpZiAoMSkKKyAgICB7CisgICAgICAgIGludCBrZl9ib29zdCA9IChpbnQpYm9vc3Rfc2NvcmU7CisgICAgICAgIGludCBhbGxvY2F0aW9uX2NodW5rczsKKyAgICAgICAgaW50IENvdW50ZXIgPSBjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleTsKKyAgICAgICAgaW50IGFsdF9rZl9iaXRzOworICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmxzdF95djEyID0gJmNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24ubHN0X2ZiX2lkeF07CisgICAgICAgIC8qIE1pbiBib29zdCBiYXNlZCBvbiBrZiBpbnRlcnZhbCAqLworI2lmIDAKKworICAgICAgICB3aGlsZSAoKGtmX2Jvb3N0IDwgNDgpICYmIChDb3VudGVyID4gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvdW50ZXIgLT0gMjsKKyAgICAgICAgICAgIGtmX2Jvb3N0ICsrOworICAgICAgICB9CisKKyNlbmRpZgorCisgICAgICAgIGlmIChrZl9ib29zdCA8IDQ4KQorICAgICAgICB7CisgICAgICAgICAgICBrZl9ib29zdCArPSAoKENvdW50ZXIgKyAxKSA+PiAxKTsKKworICAgICAgICAgICAgaWYgKGtmX2Jvb3N0ID4gNDgpIGtmX2Jvb3N0ID0gNDg7CisgICAgICAgIH0KKworICAgICAgICAvKiBiaWdnZXIgZnJhbWUgc2l6ZXMgbmVlZCBsYXJnZXIga2YgYm9vc3RzLCBzbWFsbGVyIGZyYW1lcyBzbWFsbGVyCisgICAgICAgICAqIGJvb3N0cy4uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChsc3RfeXYxMi0+eV93aWR0aCAqIGxzdF95djEyLT55X2hlaWdodCkgPiAoMzIwICogMjQwKSkKKyAgICAgICAgICAgIGtmX2Jvb3N0ICs9IDIgKiAobHN0X3l2MTItPnlfd2lkdGggKiBsc3RfeXYxMi0+eV9oZWlnaHQpIC8gKDMyMCAqIDI0MCk7CisgICAgICAgIGVsc2UgaWYgKChsc3RfeXYxMi0+eV93aWR0aCAqIGxzdF95djEyLT55X2hlaWdodCkgPCAoMzIwICogMjQwKSkKKyAgICAgICAgICAgIGtmX2Jvb3N0IC09IDQgKiAoMzIwICogMjQwKSAvIChsc3RfeXYxMi0+eV93aWR0aCAqIGxzdF95djEyLT55X2hlaWdodCk7CisKKyAgICAgICAgLyogTWluIEtGIGJvb3N0ICovCisgICAgICAgIGtmX2Jvb3N0ID0gKGludCkoKGRvdWJsZSlrZl9ib29zdCAqIDEwMC4wKSA+PiA0OyAvKiBTY2FsZSAxNiB0byAxMDAgKi8KKyAgICAgICAgaWYgKGtmX2Jvb3N0IDwgMjUwKQorICAgICAgICAgICAga2ZfYm9vc3QgPSAyNTA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgZG8gdGhyZWUgY2FsY3VsYXRpb25zIGZvciBrZiBzaXplLgorICAgICAgICAgKiBUaGUgZmlyc3QgaXMgYmFzZWQgb24gdGhlIGVycm9yIHNjb3JlIGZvciB0aGUgd2hvbGUga2YgZ3JvdXAuCisgICAgICAgICAqIFRoZSBzZWNvbmQgKG9wdGlvbmFseSkgb24gdGhlIGtleSBmcmFtZXMgb3duIGVycm9yIGlmIHRoaXMgaXMKKyAgICAgICAgICogc21hbGxlciB0aGFuIHRoZSBhdmVyYWdlIGZvciB0aGUgZ3JvdXAuCisgICAgICAgICAqIFRoZSBmaW5hbCBvbmUgaW5zdXJlcyB0aGF0IHRoZSBmcmFtZSByZWNlaXZlcyBhdCBsZWFzdCB0aGUKKyAgICAgICAgICogYWxsb2NhdGlvbiBpdCB3b3VsZCBoYXZlIHJlY2VpdmVkIGJhc2VkIG9uIGl0cyBvd24gZXJyb3Igc2NvcmUgdnMKKyAgICAgICAgICogdGhlIGVycm9yIHNjb3JlIHJlbWFpbmluZworICAgICAgICAgKiBTcGVjaWFsIGNhc2UgaWYgdGhlIHNlcXVlbmNlIGFwcGVhcnMgYWxtb3N0IHRvdGFseSBzdGF0aWMKKyAgICAgICAgICogYXMgbWVhc3VyZWQgYnkgdGhlIGRlY2F5IGFjY3VtdWxhdG9yLiBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0bworICAgICAgICAgKiBzcGVuZCBhbG1vc3QgYWxsIG9mIHRoZSBiaXRzIG9uIHRoZSBrZXkgZnJhbWUuCisgICAgICAgICAqIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5LTEgYmVjYXVzZSBrZXkgZnJhbWUgaXRzZWxmIGlzIHRha2VuCisgICAgICAgICAqIGNhcmUgb2YgYnkga2ZfYm9vc3QuCisgICAgICAgICAqLworICAgICAgICBpZiAoIGRlY2F5X2FjY3VtdWxhdG9yID49IDAuOTkgKQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvY2F0aW9uX2NodW5rcyA9CisgICAgICAgICAgICAgICAgKChjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSAtIDEpICogMTApICsga2ZfYm9vc3Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvY2F0aW9uX2NodW5rcyA9CisgICAgICAgICAgICAgICAgKChjcGktPnR3b3Bhc3MuZnJhbWVzX3RvX2tleSAtIDEpICogMTAwKSArIGtmX2Jvb3N0OworICAgICAgICB9CisKKyAgICAgICAgLyogTm9ybWFsaXplIEFsdGJvb3N0IGFuZCBhbGxvY2F0aW9ucyBjaHVuY2sgZG93biB0byBwcmV2ZW50IG92ZXJmbG93ICovCisgICAgICAgIHdoaWxlIChrZl9ib29zdCA+IDEwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGtmX2Jvb3N0IC89IDI7CisgICAgICAgICAgICBhbGxvY2F0aW9uX2NodW5rcyAvPSAyOworICAgICAgICB9CisKKyAgICAgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPSAoY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPCAwKSA/IDAgOiBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0czsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHNwZW50IG9uIHRoZSBrZXkgZnJhbWUgKi8KKyAgICAgICAgY3BpLT50d29wYXNzLmtmX2JpdHMgID0gKGludCkoKGRvdWJsZSlrZl9ib29zdCAqICgoZG91YmxlKWNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzIC8gKGRvdWJsZSlhbGxvY2F0aW9uX2NodW5rcykpOworCisgICAgICAgIC8qIEFwcGx5IGFuIGFkZGl0aW9uYWwgbGltaXQgZm9yIENCUiAqLworICAgICAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjcGktPnR3b3Bhc3Mua2ZfYml0cyA+IChpbnQpKCgzICogY3BpLT5idWZmZXJfbGV2ZWwpID4+IDIpKQorICAgICAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9iaXRzID0gKGludCkoKDMgKiBjcGktPmJ1ZmZlcl9sZXZlbCkgPj4gMik7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGUga2V5IGZyYW1lIGlzIGFjdHVhbGx5IGVhc2llciB0aGFuIHRoZSBhdmVyYWdlIGZvciB0aGUKKyAgICAgICAgICoga2YgZ3JvdXAgKHdoaWNoIGRvZXMgc29tZXRpbWVzIGhhcHBlbi4uLiBlZyBhIGJsYW5rIGludHJvIGZyYW1lKQorICAgICAgICAgKiBUaGVuIHVzZSBhbiBhbHRlcm5hdGUgY2FsY3VsYXRpb24gYmFzZWQgb24gdGhlIGtmIGVycm9yIHNjb3JlCisgICAgICAgICAqIHdoaWNoIHNob3VsZCBnaXZlIGEgc21hbGxlciBrZXkgZnJhbWUuCisgICAgICAgICAqLworICAgICAgICBpZiAoa2ZfbW9kX2VyciA8IGtmX2dyb3VwX2VyciAvIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5KQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgIGFsdF9rZl9ncnBfYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSljcGktPnR3b3Bhc3MuYml0c19sZWZ0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoa2ZfbW9kX2VyciAqIChkb3VibGUpY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKGNwaS0+dHdvcGFzcy5tb2RpZmllZF9lcnJvcl9sZWZ0KSk7CisKKyAgICAgICAgICAgIGFsdF9rZl9iaXRzID0gKGludCkoKGRvdWJsZSlrZl9ib29zdCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHRfa2ZfZ3JwX2JpdHMgLyAoZG91YmxlKWFsbG9jYXRpb25fY2h1bmtzKSk7CisKKyAgICAgICAgICAgIGlmIChjcGktPnR3b3Bhc3Mua2ZfYml0cyA+IGFsdF9rZl9iaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9iaXRzID0gYWx0X2tmX2JpdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogRWxzZSBpZiBpdCBpcyBtdWNoIGhhcmRlciB0aGFuIG90aGVyIGZyYW1lcyBpbiB0aGUgZ3JvdXAgbWFrZSBzdXJlCisgICAgICAgICAqIGl0IGF0IGxlYXN0IHJlY2VpdmVzIGFuIGFsbG9jYXRpb24gaW4ga2VlcGluZyB3aXRoIGl0cyByZWxhdGl2ZQorICAgICAgICAgKiBlcnJvciBzY29yZQorICAgICAgICAgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhbHRfa2ZfYml0cyA9CisgICAgICAgICAgICAgICAgKGludCkoKGRvdWJsZSljcGktPnR3b3Bhc3MuYml0c19sZWZ0ICoKKyAgICAgICAgICAgICAgICAgICAgICAoa2ZfbW9kX2VyciAvCisgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soY3BpLT50d29wYXNzLm1vZGlmaWVkX2Vycm9yX2xlZnQpKSk7CisKKyAgICAgICAgICAgIGlmIChhbHRfa2ZfYml0cyA+IGNwaS0+dHdvcGFzcy5rZl9iaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5rZl9iaXRzID0gYWx0X2tmX2JpdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyAtPSBjcGktPnR3b3Bhc3Mua2ZfYml0czsKKyAgICAgICAgLyogQWRkIGluIHRoZSBtaW5pbXVtIGZyYW1lIGFsbG93YW5jZSAqLworICAgICAgICBjcGktPnR3b3Bhc3Mua2ZfYml0cyArPSBjcGktPm1pbl9mcmFtZV9iYW5kd2lkdGg7CisKKyAgICAgICAgLyogUGVlciBmcmFtZSBiaXQgdGFyZ2V0IGZvciB0aGlzIGZyYW1lICovCisgICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IGNwaS0+dHdvcGFzcy5rZl9iaXRzOworCisgICAgICAgIC8qIENvbnZlcnQgdG8gYSBwZXIgc2Vjb25kIGJpdHJhdGUgKi8KKyAgICAgICAgY3BpLT50YXJnZXRfYmFuZHdpZHRoID0gKGludCkoY3BpLT50d29wYXNzLmtmX2JpdHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPm91dHB1dF9mcmFtZV9yYXRlKTsKKyAgICB9CisKKyAgICAvKiBOb3RlIHRoZSB0b3RhbCBlcnJvciBzY29yZSBvZiB0aGUga2YgZ3JvdXAgbWludXMgdGhlIGtleSBmcmFtZSBpdHNlbGYgKi8KKyAgICBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfZXJyb3JfbGVmdCA9IChpbnQpKGtmX2dyb3VwX2VyciAtIGtmX21vZF9lcnIpOworCisgICAgLyogQWRqdXN0IHRoZSBjb3VudCBvZiB0b3RhbCBtb2RpZmllZCBlcnJvciBsZWZ0LiBUaGUgY291bnQgb2YgYml0cyBsZWZ0CisgICAgICogaXMgYWRqdXN0ZWQgZWxzZXdoZXJlIGJhc2VkIG9uIHJlYWwgY29kZWQgZnJhbWUgc2l6ZXMKKyAgICAgKi8KKyAgICBjcGktPnR3b3Bhc3MubW9kaWZpZWRfZXJyb3JfbGVmdCAtPSBrZl9ncm91cF9lcnI7CisKKyAgICBpZiAoY3BpLT5veGNmLmFsbG93X3NwYXRpYWxfcmVzYW1wbGluZykKKyAgICB7CisgICAgICAgIGludCByZXNhbXBsZV90cmlnZ2VyID0gMDsKKyAgICAgICAgaW50IGxhc3Rfa2ZfcmVzYW1wbGVkID0gMDsKKyAgICAgICAgaW50IGtmX3E7CisgICAgICAgIGludCBzY2FsZV92YWwgPSAwOworICAgICAgICBpbnQgaHIsIGhzLCB2ciwgdnM7CisgICAgICAgIGludCBuZXdfd2lkdGggPSBjcGktPm94Y2YuV2lkdGg7CisgICAgICAgIGludCBuZXdfaGVpZ2h0ID0gY3BpLT5veGNmLkhlaWdodDsKKworICAgICAgICBpbnQgcHJvamVjdGVkX2J1ZmZlcl9sZXZlbCA9IChpbnQpY3BpLT5idWZmZXJfbGV2ZWw7CisgICAgICAgIGludCB0bXBfcTsKKworICAgICAgICBkb3VibGUgcHJvamVjdGVkX2JpdHNfcGVyZnJhbWU7CisgICAgICAgIGRvdWJsZSBncm91cF9paXJhdGlvID0gKGtmX2dyb3VwX2ludHJhX2VyciAtIGZpcnN0X2ZyYW1lLmludHJhX2Vycm9yKSAvIChrZl9ncm91cF9jb2RlZF9lcnIgLSBmaXJzdF9mcmFtZS5jb2RlZF9lcnJvcik7CisgICAgICAgIGRvdWJsZSBlcnJfcGVyX2ZyYW1lID0ga2ZfZ3JvdXBfZXJyIC8gY3BpLT50d29wYXNzLmZyYW1lc190b19rZXk7CisgICAgICAgIGRvdWJsZSBiaXRzX3Blcl9mcmFtZTsKKyAgICAgICAgZG91YmxlIGF2X2JpdHNfcGVyX2ZyYW1lOworICAgICAgICBkb3VibGUgZWZmZWN0aXZlX3NpemVfcmF0aW87CisKKyAgICAgICAgaWYgKChjcGktPmNvbW1vbi5XaWR0aCAhPSBjcGktPm94Y2YuV2lkdGgpIHx8IChjcGktPmNvbW1vbi5IZWlnaHQgIT0gY3BpLT5veGNmLkhlaWdodCkpCisgICAgICAgICAgICBsYXN0X2tmX3Jlc2FtcGxlZCA9IDE7CisKKyAgICAgICAgLyogU2V0IGJhY2sgdG8gdW5zY2FsZWQgYnkgZGVmYXVsdHMgKi8KKyAgICAgICAgY3BpLT5jb21tb24uaG9yaXpfc2NhbGUgPSBOT1JNQUw7CisgICAgICAgIGNwaS0+Y29tbW9uLnZlcnRfc2NhbGUgPSBOT1JNQUw7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIEF2ZXJhZ2UgYml0cyBwZXIgZnJhbWUuICovCisgICAgICAgIGF2X2JpdHNfcGVyX2ZyYW1lID0gY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggLyBET1VCTEVfRElWSURFX0NIRUNLKChkb3VibGUpY3BpLT5mcmFtZV9yYXRlKTsKKworICAgICAgICAvKiBDQlIuLi4gVXNlIHRoZSBjbGlwIGF2ZXJhZ2UgYXMgdGhlIHRhcmdldCBmb3IgZGVjaWRpbmcgcmVzYW1wbGUgKi8KKyAgICAgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQorICAgICAgICB7CisgICAgICAgICAgICBiaXRzX3Blcl9mcmFtZSA9IGF2X2JpdHNfcGVyX2ZyYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyogSW4gVkJSIHdlIHdhbnQgdG8gYXZvaWQgZG93bnNhbXBsaW5nIGluIGVhc3kgc2VjdGlvbiB1bmxlc3Mgd2UKKyAgICAgICAgICogYXJlIHVuZGVyIGV4dHJlbWUgcHJlc3N1cmUgU28gdXNlIHRoZSBsYXJnZXIgb2YgdGFyZ2V0IGJpdHJhdGUKKyAgICAgICAgICogZm9yIHRoaXMgc2VjdGlvbiBvciBhdmVyYWdlIGJpdHJhdGUgZm9yIHNlcXVlbmNlCisgICAgICAgICAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgYWNjb3VudHMgZm9yIGhvdyBoYXJkIHRoZSBzZWN0aW9uIGlzLi4uICovCisgICAgICAgICAgICBiaXRzX3Blcl9mcmFtZSA9IChkb3VibGUpCisgICAgICAgICAgICAgICAgKGNwaS0+dHdvcGFzcy5rZl9ncm91cF9iaXRzIC8gY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkpOworCisgICAgICAgICAgICAvKiBEb250IHR1cm4gdG8gcmVzYW1wbGluZyBpbiBlYXN5IHNlY3Rpb25zIGp1c3QgYmVjYXVzZSB0aGV5CisgICAgICAgICAgICAgKiBoYXZlIGJlZW4gYXNzaWduZWQgYSBzbWFsbCBudW1iZXIgb2YgYml0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoYml0c19wZXJfZnJhbWUgPCBhdl9iaXRzX3Blcl9mcmFtZSkKKyAgICAgICAgICAgICAgICBiaXRzX3Blcl9mcmFtZSA9IGF2X2JpdHNfcGVyX2ZyYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyogYml0c19wZXJfZnJhbWUgc2hvdWxkIGNvbXBseSB3aXRoIG91ciBtaW5pbXVtICovCisgICAgICAgIGlmIChiaXRzX3Blcl9mcmFtZSA8IChjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAqIGNwaS0+b3hjZi50d29fcGFzc192YnJtaW5fc2VjdGlvbiAvIDEwMCkpCisgICAgICAgICAgICBiaXRzX3Blcl9mcmFtZSA9IChjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAqIGNwaS0+b3hjZi50d29fcGFzc192YnJtaW5fc2VjdGlvbiAvIDEwMCk7CisKKyAgICAgICAgLyogV29yayBvdXQgaWYgc3BhdGlhbCByZXNhbXBsaW5nIGlzIG5lY2Vzc2FyeSAqLworICAgICAgICBrZl9xID0gZXN0aW1hdGVfa2ZfZ3JvdXBfcShjcGksIGVycl9wZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCliaXRzX3Blcl9mcmFtZSwgZ3JvdXBfaWlyYXRpbyk7CisKKyAgICAgICAgLyogSWYgd2UgcHJvamVjdCBhIHJlcXVpcmVkIFEgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCBRIHRoZW4KKyAgICAgICAgICogbWFrZSBhIGd1ZXNzIGF0IHRoZSBhY3R1YWwgc2l6ZSBvZiBmcmFtZXMgaW4gdGhpcyBzZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBwcm9qZWN0ZWRfYml0c19wZXJmcmFtZSA9IGJpdHNfcGVyX2ZyYW1lOworICAgICAgICB0bXBfcSA9IGtmX3E7CisKKyAgICAgICAgd2hpbGUgKHRtcF9xID4gY3BpLT53b3JzdF9xdWFsaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBwcm9qZWN0ZWRfYml0c19wZXJmcmFtZSAqPSAxLjA0OworICAgICAgICAgICAgdG1wX3EtLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEd1ZXNzIGF0IGJ1ZmZlciBsZXZlbCBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uICovCisgICAgICAgIHByb2plY3RlZF9idWZmZXJfbGV2ZWwgPSAoaW50KQorICAgICAgICAgICAgICAgICAgICAoY3BpLT5idWZmZXJfbGV2ZWwgLSAoaW50KQorICAgICAgICAgICAgICAgICAgICAoKHByb2plY3RlZF9iaXRzX3BlcmZyYW1lIC0gYXZfYml0c19wZXJfZnJhbWUpICoKKyAgICAgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkpKTsKKworICAgICAgICBpZiAoMCkKKyAgICAgICAgeworICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJTdWJzYW1sZS5zdHQiLCAiYSIpOworICAgICAgICAgICAgZnByaW50ZihmLCAiICU4ZCAlOGQgJThkICU4ZCAlMTIuMGYgJThkICU4ZCAlOGRcbiIsICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBrZl9xLCBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwgY3BpLT5jb21tb24udmVydF9zY2FsZSwgIGtmX2dyb3VwX2VyciAvIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5LCAoaW50KShjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyAvIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5KSwgbmV3X2hlaWdodCwgbmV3X3dpZHRoKTsKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSB0cmlnZ2VyIGZvciBzcGF0aWFsIHJlc2FtcGxpbmcgZGVwZW5kcyBvbiB0aGUgdmFyaW91cworICAgICAgICAgKiBwYXJhbWV0ZXJzIHN1Y2ggYXMgd2hldGhlciB3ZSBhcmUgc3RyZWFtaW5nIChDQlIpIG9yIFZCUi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikKKyAgICAgICAgeworICAgICAgICAgICAgLyogVHJpZ2dlciByZXNhbXBsZSBpZiB3ZSBhcmUgcHJvamVjdGVkIHRvIGZhbGwgYmVsb3cgZG93bgorICAgICAgICAgICAgICogc2FtcGxlIGxldmVsIG9yIHJlc2FtcGxlZCBsYXN0IHRpbWUgYW5kIGFyZSBwcm9qZWN0ZWQgdG8KKyAgICAgICAgICAgICAqIHJlbWFpbiBiZWxvdyB0aGUgdXAgc2FtcGxlIGxldmVsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocHJvamVjdGVkX2J1ZmZlcl9sZXZlbCA8IChjcGktPm94Y2YucmVzYW1wbGVfZG93bl93YXRlcl9tYXJrICogY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKSkgfHwKKyAgICAgICAgICAgICAgICAobGFzdF9rZl9yZXNhbXBsZWQgJiYgKHByb2plY3RlZF9idWZmZXJfbGV2ZWwgPCAoY3BpLT5veGNmLnJlc2FtcGxlX3VwX3dhdGVyX21hcmsgKiBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgLyAxMDApKSkpCisgICAgICAgICAgICAgICAgcmVzYW1wbGVfdHJpZ2dlciA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzYW1wbGVfdHJpZ2dlciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IGNsaXBfYml0cyA9IChpbnQ2NF90KShjcGktPnR3b3Bhc3MudG90YWxfc3RhdHMuY291bnQgKiBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmZyYW1lX3JhdGUpKTsKKyAgICAgICAgICAgIGludDY0X3Qgb3Zlcl9zcGVuZCA9IGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwgLSBjcGktPmJ1ZmZlcl9sZXZlbDsKKworICAgICAgICAgICAgLyogSWYgdHJpZ2dlcmVkIGxhc3QgdGltZSB0aGUgdGhyZXNob2xkIGZvciB0cmlnZ2VyaW5nIGFnYWluIGlzCisgICAgICAgICAgICAgKiByZWR1Y2VkOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFByb2plY3RlZCBRIGhpZ2hlciB0aGFuIGFsbG93ZWQgYW5kIE92ZXJzcGVuZCA+IDUlIG9mIHRvdGFsCisgICAgICAgICAgICAgKiBiaXRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgobGFzdF9rZl9yZXNhbXBsZWQgJiYgKGtmX3EgPiBjcGktPndvcnN0X3F1YWxpdHkpKSB8fAorICAgICAgICAgICAgICAgICgoa2ZfcSA+IGNwaS0+d29yc3RfcXVhbGl0eSkgJiYKKyAgICAgICAgICAgICAgICAgKG92ZXJfc3BlbmQgPiBjbGlwX2JpdHMgLyAyMCkpKQorICAgICAgICAgICAgICAgIHJlc2FtcGxlX3RyaWdnZXIgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc2FtcGxlX3RyaWdnZXIgPSAwOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzYW1wbGVfdHJpZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKChrZl9xID49IGNwaS0+d29yc3RfcXVhbGl0eSkgJiYgKHNjYWxlX3ZhbCA8IDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYWxlX3ZhbCArKzsKKworICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLnZlcnRfc2NhbGUgICA9IHZzY2FsZV9sb29rdXBbc2NhbGVfdmFsXTsKKyAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSAgPSBoc2NhbGVfbG9va3VwW3NjYWxlX3ZhbF07CisKKyAgICAgICAgICAgICAgICBTY2FsZTJSYXRpbyhjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwgJmhyLCAmaHMpOworICAgICAgICAgICAgICAgIFNjYWxlMlJhdGlvKGNwaS0+Y29tbW9uLnZlcnRfc2NhbGUsICZ2ciwgJnZzKTsKKworICAgICAgICAgICAgICAgIG5ld193aWR0aCA9ICgoaHMgLSAxKSArIChjcGktPm94Y2YuV2lkdGggKiBocikpIC8gaHM7CisgICAgICAgICAgICAgICAgbmV3X2hlaWdodCA9ICgodnMgLSAxKSArIChjcGktPm94Y2YuSGVpZ2h0ICogdnIpKSAvIHZzOworCisgICAgICAgICAgICAgICAgLyogUmVkdWNpbmcgdGhlIGFyZWEgdG8gMS80IGRvZXMgbm90IHJlZHVjZSB0aGUgY29tcGxleGl0eQorICAgICAgICAgICAgICAgICAqIChlcnJfcGVyX2ZyYW1lKSB0byAxLzQuLi4gZWZmZWN0aXZlX3NpemVyYXRpbyBhdHRlbXB0cworICAgICAgICAgICAgICAgICAqIHRvIHByb3ZpZGUgYSBjcnVkZSBjb3JyZWN0aW9uIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZWZmZWN0aXZlX3NpemVfcmF0aW8gPSAoZG91YmxlKShuZXdfd2lkdGggKiBuZXdfaGVpZ2h0KSAvIChkb3VibGUpKGNwaS0+b3hjZi5XaWR0aCAqIGNwaS0+b3hjZi5IZWlnaHQpOworICAgICAgICAgICAgICAgIGVmZmVjdGl2ZV9zaXplX3JhdGlvID0gKDEuMCArICgzLjAgKiBlZmZlY3RpdmVfc2l6ZV9yYXRpbykpIC8gNC4wOworCisgICAgICAgICAgICAgICAgLyogTm93IHRyeSBhZ2FpbiBhbmQgc2VlIHdoYXQgUSB3ZSBnZXQgd2l0aCB0aGUgc21hbGxlcgorICAgICAgICAgICAgICAgICAqIGltYWdlIHNpemUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBrZl9xID0gZXN0aW1hdGVfa2ZfZ3JvdXBfcShjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcGVyX2ZyYW1lICogZWZmZWN0aXZlX3NpemVfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWJpdHNfcGVyX2ZyYW1lLCBncm91cF9paXJhdGlvKTsKKworICAgICAgICAgICAgICAgIGlmICgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJTdWJzYW1sZS5zdHQiLCAiYSIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIqKioqKioqKiAlOGQgJThkICU4ZCAlMTIuMGYgJThkICU4ZCAlOGRcbiIsICBrZl9xLCBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwgY3BpLT5jb21tb24udmVydF9zY2FsZSwgIGtmX2dyb3VwX2VyciAvIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5LCAoaW50KShjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyAvIGNwaS0+dHdvcGFzcy5mcmFtZXNfdG9fa2V5KSwgbmV3X2hlaWdodCwgbmV3X3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY3BpLT5jb21tb24uV2lkdGggIT0gbmV3X3dpZHRoKSB8fCAoY3BpLT5jb21tb24uSGVpZ2h0ICE9IG5ld19oZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPmNvbW1vbi5XaWR0aCA9IG5ld193aWR0aDsKKyAgICAgICAgICAgIGNwaS0+Y29tbW9uLkhlaWdodCA9IG5ld19oZWlnaHQ7CisgICAgICAgICAgICB2cDhfYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9maXJzdHBhc3MuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9maXJzdHBhc3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2VuY29kZXIvZmlyc3RwYXNzLmgKcmVuYW1lIHRvIGxpYnZweC92cDgvZW5jb2Rlci9maXJzdHBhc3MuaApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL2xvb2thaGVhZC5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL2xvb2thaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmNlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvbG9va2FoZWFkLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAibG9va2FoZWFkLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9leHRlbmQuaCIKKworI2RlZmluZSBNQVhfTEFHX0JVRkZFUlMgKENPTkZJR19SRUFMVElNRV9PTkxZPyAxIDogMjUpCisKK3N0cnVjdCBsb29rYWhlYWRfY3R4Cit7CisgICAgdW5zaWduZWQgaW50IG1heF9zejsgICAgICAgICAvKiBBYnNvbHV0ZSBzaXplIG9mIHRoZSBxdWV1ZSAqLworICAgIHVuc2lnbmVkIGludCBzejsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGluIHRoZSBxdWV1ZSAqLworICAgIHVuc2lnbmVkIGludCByZWFkX2lkeDsgICAgICAgLyogUmVhZCBpbmRleCAqLworICAgIHVuc2lnbmVkIGludCB3cml0ZV9pZHg7ICAgICAgLyogV3JpdGUgaW5kZXggKi8KKyAgICBzdHJ1Y3QgbG9va2FoZWFkX2VudHJ5ICpidWY7IC8qIEJ1ZmZlciBsaXN0ICovCit9OworCisKKy8qIFJldHVybiB0aGUgYnVmZmVyIGF0IHRoZSBnaXZlbiBhYnNvbHV0ZSBpbmRleCBhbmQgaW5jcmVtZW50IHRoZSBpbmRleCAqLworc3RhdGljIHN0cnVjdCBsb29rYWhlYWRfZW50cnkgKgorcG9wKHN0cnVjdCBsb29rYWhlYWRfY3R4ICpjdHgsCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgKmlkeCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBpbmRleCA9ICppZHg7CisgICAgc3RydWN0IGxvb2thaGVhZF9lbnRyeSAqYnVmID0gY3R4LT5idWYgKyBpbmRleDsKKworICAgIGFzc2VydChpbmRleCA8IGN0eC0+bWF4X3N6KTsKKyAgICBpZigrK2luZGV4ID49IGN0eC0+bWF4X3N6KQorICAgICAgICBpbmRleCAtPSBjdHgtPm1heF9zejsKKyAgICAqaWR4ID0gaW5kZXg7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCit2b2lkCit2cDhfbG9va2FoZWFkX2Rlc3Ryb3koc3RydWN0IGxvb2thaGVhZF9jdHggKmN0eCkKK3sKKyAgICBpZihjdHgpCisgICAgeworICAgICAgICBpZihjdHgtPmJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGN0eC0+bWF4X3N6OyBpKyspCisgICAgICAgICAgICAgICAgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKCZjdHgtPmJ1ZltpXS5pbWcpOworICAgICAgICAgICAgZnJlZShjdHgtPmJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShjdHgpOworICAgIH0KK30KKworCitzdHJ1Y3QgbG9va2FoZWFkX2N0eCoKK3ZwOF9sb29rYWhlYWRfaW5pdCh1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisgICAgc3RydWN0IGxvb2thaGVhZF9jdHggKmN0eCA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAvKiBDbGFtcCB0aGUgbG9va2FoZWFkIHF1ZXVlIGRlcHRoICovCisgICAgaWYoZGVwdGggPCAxKQorICAgICAgICBkZXB0aCA9IDE7CisgICAgZWxzZSBpZihkZXB0aCA+IE1BWF9MQUdfQlVGRkVSUykKKyAgICAgICAgZGVwdGggPSBNQVhfTEFHX0JVRkZFUlM7CisKKyAgICAvKiBLZWVwIGxhc3QgZnJhbWUgaW4gbG9va2FoZWFkIGJ1ZmZlciBieSBpbmNyZWFzaW5nIGRlcHRoIGJ5IDEuKi8KKyAgICBkZXB0aCArPSAxOworCisgICAgLyogQWxpZ24gdGhlIGJ1ZmZlciBkaW1lbnNpb25zICovCisgICAgd2lkdGggPSAod2lkdGggKyAxNSkgJiB+MTU7CisgICAgaGVpZ2h0ID0gKGhlaWdodCArIDE1KSAmIH4xNTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBsb29rYWhlYWQgc3RydWN0dXJlcyAqLworICAgIGN0eCA9IGNhbGxvYygxLCBzaXplb2YoKmN0eCkpOworICAgIGlmKGN0eCkKKyAgICB7CisgICAgICAgIGN0eC0+bWF4X3N6ID0gZGVwdGg7CisgICAgICAgIGN0eC0+YnVmID0gY2FsbG9jKGRlcHRoLCBzaXplb2YoKmN0eC0+YnVmKSk7CisgICAgICAgIGlmKCFjdHgtPmJ1ZikKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgZm9yKGk9MDsgaTxkZXB0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3R4LT5idWZbaV0uaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBWUDhCT1JERVJJTlBJWEVMUykpCisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICByZXR1cm4gY3R4OworYmFpbDoKKyAgICB2cDhfbG9va2FoZWFkX2Rlc3Ryb3koY3R4KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQKK3ZwOF9sb29rYWhlYWRfcHVzaChzdHJ1Y3QgbG9va2FoZWFkX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgIHRzX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICB0c19lbmQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICphY3RpdmVfbWFwKQoreworICAgIHN0cnVjdCBsb29rYWhlYWRfZW50cnkqIGJ1ZjsKKyAgICBpbnQgcm93LCBjb2wsIGFjdGl2ZV9lbmQ7CisgICAgaW50IG1iX3Jvd3MgPSAoc3JjLT55X2hlaWdodCArIDE1KSA+PiA0OworICAgIGludCBtYl9jb2xzID0gKHNyYy0+eV93aWR0aCArIDE1KSA+PiA0OworCisgICAgaWYoY3R4LT5zeiArIDIgPiBjdHgtPm1heF9zeikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY3R4LT5zeisrOworICAgIGJ1ZiA9IHBvcChjdHgsICZjdHgtPndyaXRlX2lkeCk7CisKKyAgICAvKiBPbmx5IGRvIHRoaXMgcGFydGlhbCBjb3B5IGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWxsIG1ldDoKKyAgICAgKiAxLiBMb29rYWhlYWQgcXVldWUgaGFzIGhhcyBzaXplIG9mIDEuCisgICAgICogMi4gQWN0aXZlIG1hcCBpcyBwcm92aWRlZC4KKyAgICAgKiAzLiBUaGlzIGlzIG5vdCBhIGtleSBmcmFtZSwgZ29sZGVuIG5vciBhbHRyZWYgZnJhbWUuCisgICAgICovCisgICAgaWYgKGN0eC0+bWF4X3N6ID09IDEgJiYgYWN0aXZlX21hcCAmJiAhZmxhZ3MpCisgICAgeworICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG1iX3Jvd3M7ICsrcm93KQorICAgICAgICB7CisgICAgICAgICAgICBjb2wgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBhY3RpdmUgbWFjcm9ibG9jayBpbiB0aGlzIHJvdy4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKDsgY29sIDwgbWJfY29sczsgKytjb2wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX21hcFtjb2xdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTm8gbW9yZSBhY3RpdmUgbWFjcm9ibG9jayBpbiB0aGlzIHJvdy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY29sID09IG1iX2NvbHMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogRmluZCB0aGUgZW5kIG9mIGFjdGl2ZSByZWdpb24gaW4gdGhpcyByb3cuICovCisgICAgICAgICAgICAgICAgYWN0aXZlX2VuZCA9IGNvbDsKKworICAgICAgICAgICAgICAgIGZvciAoOyBhY3RpdmVfZW5kIDwgbWJfY29sczsgKythY3RpdmVfZW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVfbWFwW2FjdGl2ZV9lbmRdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogT25seSBjb3B5IHRoaXMgYWN0aXZlIHJlZ2lvbi4gKi8KKyAgICAgICAgICAgICAgICB2cDhfY29weV9hbmRfZXh0ZW5kX2ZyYW1lX3dpdGhfcmVjdChzcmMsICZidWYtPmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPDwgNCwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGl2ZV9lbmQgLSBjb2wpIDw8IDQpOworCisgICAgICAgICAgICAgICAgLyogU3RhcnQgYWdhaW4gZnJvbSB0aGUgZW5kIG9mIHRoaXMgYWN0aXZlIHJlZ2lvbi4gKi8KKyAgICAgICAgICAgICAgICBjb2wgPSBhY3RpdmVfZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhY3RpdmVfbWFwICs9IG1iX2NvbHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdnA4X2NvcHlfYW5kX2V4dGVuZF9mcmFtZShzcmMsICZidWYtPmltZyk7CisgICAgfQorICAgIGJ1Zi0+dHNfc3RhcnQgPSB0c19zdGFydDsKKyAgICBidWYtPnRzX2VuZCA9IHRzX2VuZDsKKyAgICBidWYtPmZsYWdzID0gZmxhZ3M7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGxvb2thaGVhZF9lbnRyeSoKK3ZwOF9sb29rYWhlYWRfcG9wKHN0cnVjdCBsb29rYWhlYWRfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgZHJhaW4pCit7CisgICAgc3RydWN0IGxvb2thaGVhZF9lbnRyeSogYnVmID0gTlVMTDsKKworICAgIGlmKGN0eC0+c3ogJiYgKGRyYWluIHx8IGN0eC0+c3ogPT0gY3R4LT5tYXhfc3ogLSAxKSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHBvcChjdHgsICZjdHgtPnJlYWRfaWR4KTsKKyAgICAgICAgY3R4LT5zei0tOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCisKK3N0cnVjdCBsb29rYWhlYWRfZW50cnkqCit2cDhfbG9va2FoZWFkX3BlZWsoc3RydWN0IGxvb2thaGVhZF9jdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbikKK3sKKyAgICBzdHJ1Y3QgbG9va2FoZWFkX2VudHJ5KiBidWYgPSBOVUxMOworCisgICAgaWYgKGRpcmVjdGlvbiA9PSBQRUVLX0ZPUldBUkQpCisgICAgeworICAgICAgICBhc3NlcnQoaW5kZXggPCBjdHgtPm1heF9zeiAtIDEpOworICAgICAgICBpZihpbmRleCA8IGN0eC0+c3opCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ICs9IGN0eC0+cmVhZF9pZHg7CisgICAgICAgICAgICBpZihpbmRleCA+PSBjdHgtPm1heF9zeikKKyAgICAgICAgICAgICAgICBpbmRleCAtPSBjdHgtPm1heF9zejsKKyAgICAgICAgICAgIGJ1ZiA9IGN0eC0+YnVmICsgaW5kZXg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBFRUtfQkFDS1dBUkQpCisgICAgeworICAgICAgICBhc3NlcnQoaW5kZXggPT0gMSk7CisKKyAgICAgICAgaWYoY3R4LT5yZWFkX2lkeCA9PSAwKQorICAgICAgICAgICAgaW5kZXggPSBjdHgtPm1heF9zeiAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluZGV4ID0gY3R4LT5yZWFkX2lkeCAtIGluZGV4OworICAgICAgICBidWYgPSBjdHgtPmJ1ZiArIGluZGV4OworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKwordW5zaWduZWQgaW50Cit2cDhfbG9va2FoZWFkX2RlcHRoKHN0cnVjdCBsb29rYWhlYWRfY3R4ICpjdHgpCit7CisgICAgcmV0dXJuIGN0eC0+c3o7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvbG9va2FoZWFkLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvbG9va2FoZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NmI3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9sb29rYWhlYWQuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBMT09LQUhFQURfSAorI2RlZmluZSBMT09LQUhFQURfSAorI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbnRlZ2VyLmgiCisKK3N0cnVjdCBsb29rYWhlYWRfZW50cnkKK3sKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgIGltZzsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgIHRzX3N0YXJ0OworICAgIGludDY0X3QgICAgICAgICAgICAgdHNfZW5kOworICAgIHVuc2lnbmVkIGludCAgICAgICAgZmxhZ3M7Cit9OworCisKK3N0cnVjdCBsb29rYWhlYWRfY3R4OworCisvKipcYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIGxvb2thaGVhZCBzdGFnZQorICoKKyAqIFRoZSBsb29rYWhlYWQgc3RhZ2UgaXMgYSBxdWV1ZSBvZiBmcmFtZSBidWZmZXJzIG9uIHdoaWNoIHNvbWUgYW5hbHlzaXMKKyAqIG1heSBiZSBkb25lIHdoZW4gYnVmZmVycyBhcmUgZW5xdWV1ZWQuCisgKgorICoKKyAqLworc3RydWN0IGxvb2thaGVhZF9jdHgqIHZwOF9sb29rYWhlYWRfaW5pdCh1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXB0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisKKy8qKlxicmllZiBEZXN0cm95cyB0aGUgbG9va2FoZWFkIHN0YWdlCisgKgorICovCit2b2lkIHZwOF9sb29rYWhlYWRfZGVzdHJveShzdHJ1Y3QgbG9va2FoZWFkX2N0eCAqY3R4KTsKKworCisvKipcYnJpZWYgRW5xdWV1ZSBhIHNvdXJjZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29weSB0aGUgc291cmNlIGltYWdlIGludG8gYSBuZXcgZnJhbWVidWZmZXIgd2l0aAorICogdGhlIGV4cGVjdGVkIHN0cmlkZS9ib3JkZXIuCisgKgorICogSWYgYWN0aXZlX21hcCBpcyBub24tTlVMTCBhbmQgdGhlcmUgaXMgb25seSBvbmUgZnJhbWUgaW4gdGhlIHF1ZXVlLCB0aGVuIGNvcHkKKyAqIG9ubHkgYWN0aXZlIG1hY3JvYmxvY2tzLgorICoKKyAqIFxwYXJhbVtpbl0gY3R4ICAgICAgICAgUG9pbnRlciB0byB0aGUgbG9va2FoZWFkIGNvbnRleHQKKyAqIFxwYXJhbVtpbl0gc3JjICAgICAgICAgUG9pbnRlciB0byB0aGUgaW1hZ2UgdG8gZW5xdWV1ZQorICogXHBhcmFtW2luXSB0c19zdGFydCAgICBUaW1lc3RhbXAgZm9yIHRoZSBzdGFydCBvZiB0aGlzIGZyYW1lCisgKiBccGFyYW1baW5dIHRzX2VuZCAgICAgIFRpbWVzdGFtcCBmb3IgdGhlIGVuZCBvZiB0aGlzIGZyYW1lCisgKiBccGFyYW1baW5dIGZsYWdzICAgICAgIEZsYWdzIHNldCBvbiB0aGlzIGZyYW1lCisgKiBccGFyYW1baW5dIGFjdGl2ZV9tYXAgIE1hcCB0aGF0IHNwZWNpZmllcyB3aGljaCBtYWNyb2Jsb2NrIGlzIGFjdGl2ZQorICovCitpbnQKK3ZwOF9sb29rYWhlYWRfcHVzaChzdHJ1Y3QgbG9va2FoZWFkX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgIHRzX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICB0c19lbmQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICphY3RpdmVfbWFwKTsKKworCisvKipcYnJpZWYgR2V0IHRoZSBuZXh0IHNvdXJjZSBidWZmZXIgdG8gZW5jb2RlCisgKgorICoKKyAqIFxwYXJhbVtpbl0gY3R4ICAgICAgIFBvaW50ZXIgdG8gdGhlIGxvb2thaGVhZCBjb250ZXh0CisgKiBccGFyYW1baW5dIGRyYWluICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGJ1ZmZlciBzaG91bGQgYmUgZHJhaW5lZAorICogICAgICAgICAgICAgICAgICAgICAgKHJldHVybiBhIGJ1ZmZlciByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IHF1ZXVlIGRlcHRoKQorICoKKyAqIFxyZXR2YWwgTlVMTCwgaWYgZHJhaW4gc2V0IGFuZCBxdWV1ZSBpcyBlbXB0eQorICogXHJldHZhbCBOVUxMLCBpZiBkcmFpbiBub3Qgc2V0IGFuZCBxdWV1ZSBub3Qgb2YgdGhlIGNvbmZpZ3VyZWQgZGVwdGgKKyAqCisgKi8KK3N0cnVjdCBsb29rYWhlYWRfZW50cnkqCit2cDhfbG9va2FoZWFkX3BvcChzdHJ1Y3QgbG9va2FoZWFkX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGRyYWluKTsKKworCisjZGVmaW5lIFBFRUtfRk9SV0FSRCAgIDEKKyNkZWZpbmUgUEVFS19CQUNLV0FSRCAtMQorLyoqXGJyaWVmIEdldCBhIGZ1dHVyZSBzb3VyY2UgYnVmZmVyIHRvIGVuY29kZQorICoKKyAqIFxwYXJhbVtpbl0gY3R4ICAgICAgIFBvaW50ZXIgdG8gdGhlIGxvb2thaGVhZCBjb250ZXh0CisgKiBccGFyYW1baW5dIGluZGV4ICAgICBJbmRleCBvZiB0aGUgZnJhbWUgdG8gYmUgcmV0dXJuZWQsIDAgPT0gbmV4dCBmcmFtZQorICoKKyAqIFxyZXR2YWwgTlVMTCwgaWYgbm8gYnVmZmVyIGV4aXN0cyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4CisgKgorICovCitzdHJ1Y3QgbG9va2FoZWFkX2VudHJ5KgordnA4X2xvb2thaGVhZF9wZWVrKHN0cnVjdCBsb29rYWhlYWRfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24pOworCisKKy8qKlxicmllZiBHZXQgdGhlIG51bWJlciBvZiBmcmFtZXMgY3VycmVudGx5IGluIHRoZSBsb29rYWhlYWQgcXVldWUKKyAqCisgKiBccGFyYW1baW5dIGN0eCAgICAgICBQb2ludGVyIHRvIHRoZSBsb29rYWhlYWQgY29udGV4dAorICovCit1bnNpZ25lZCBpbnQKK3ZwOF9sb29rYWhlYWRfZGVwdGgoc3RydWN0IGxvb2thaGVhZF9jdHggKmN0eCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvbWNvbXAuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9tY29tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGM3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvbWNvbXAuYwpAQCAtMCwwICsxLDIwMjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAib255eF9pbnQuaCIKKyNpbmNsdWRlICJtY29tcC5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKK3N0YXRpYyBpbnQgbXZfcmVmX2N0IFszMV0gWzRdIFsyXTsKK3N0YXRpYyBpbnQgbXZfbW9kZV9jdHMgWzRdIFsyXTsKKyNlbmRpZgorCitpbnQgdnA4X212X2JpdF9jb3N0KGludF9tdiAqbXYsIGludF9tdiAqcmVmLCBpbnQgKm12Y29zdFsyXSwgaW50IFdlaWdodCkKK3sKKyAgICAvKiBNViBjb3N0aW5nIGlzIGJhc2VkIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgdmVjdG9ycyBpbiB0aGUgcHJldmlvdXMKKyAgICAgKiBmcmFtZSBhbmQgYXMgc3VjaCB3aWxsIHRlbmQgdG8gb3ZlciBzdGF0ZSB0aGUgY29zdCBvZiB2ZWN0b3JzLiBJbgorICAgICAqIGFkZGl0aW9uIGNvZGluZyBhIG5ldyB2ZWN0b3IgY2FuIGhhdmUgYSBrbm9jayBvbiBlZmZlY3Qgb24gdGhlIGNvc3QKKyAgICAgKiBvZiBzdWJzZXF1ZW50IHZlY3RvcnMgYW5kIHRoZSBxdWFsaXR5IG9mIHByZWRpY3Rpb24gZnJvbSBORUFSIGFuZAorICAgICAqIE5FQVJFU1QgZm9yIHN1YnNlcXVlbnQgYmxvY2tzLiBUaGUgIldlaWdodCIgcGFyYW1ldGVyIGFsbG93cywgdG8gYQorICAgICAqIGxpbWl0ZWQgZXh0ZW50LCBmb3Igc29tZSBhY2NvdW50IHRvIGJlIHRha2VuIG9mIHRoZXNlIGZhY3RvcnMuCisgICAgICovCisgICAgcmV0dXJuICgobXZjb3N0WzBdWyhtdi0+YXNfbXYucm93IC0gcmVmLT5hc19tdi5yb3cpID4+IDFdICsgbXZjb3N0WzFdWyhtdi0+YXNfbXYuY29sIC0gcmVmLT5hc19tdi5jb2wpID4+IDFdKSAqIFdlaWdodCkgPj4gNzsKK30KKworc3RhdGljIGludCBtdl9lcnJfY29zdChpbnRfbXYgKm12LCBpbnRfbXYgKnJlZiwgaW50ICptdmNvc3RbMl0sIGludCBlcnJvcl9wZXJfYml0KQoreworICAgIC8qIElnbm9yZSBtdiBjb3N0aW5nIGlmIG12Y29zdCBpcyBOVUxMICovCisgICAgaWYgKG12Y29zdCkKKyAgICAgICAgcmV0dXJuICgobXZjb3N0WzBdWyhtdi0+YXNfbXYucm93IC0gcmVmLT5hc19tdi5yb3cpID4+IDFdICsKKyAgICAgICAgICAgICAgICAgbXZjb3N0WzFdWyhtdi0+YXNfbXYuY29sIC0gcmVmLT5hc19tdi5jb2wpID4+IDFdKQorICAgICAgICAgICAgICAgICAqIGVycm9yX3Blcl9iaXQgKyAxMjgpID4+IDg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZzYWRfZXJyX2Nvc3QoaW50X212ICptdiwgaW50X212ICpyZWYsIGludCAqbXZzYWRjb3N0WzJdLCBpbnQgZXJyb3JfcGVyX2JpdCkKK3sKKyAgICAvKiBDYWxjdWxhdGUgc2FkIGVycm9yIGNvc3Qgb24gZnVsbCBwaXhlbCBiYXNpcy4gKi8KKyAgICAvKiBJZ25vcmUgbXYgY29zdGluZyBpZiBtdnNhZGNvc3QgaXMgTlVMTCAqLworICAgIGlmIChtdnNhZGNvc3QpCisgICAgICAgIHJldHVybiAoKG12c2FkY29zdFswXVsobXYtPmFzX212LnJvdyAtIHJlZi0+YXNfbXYucm93KV0gKworICAgICAgICAgICAgICAgICBtdnNhZGNvc3RbMV1bKG12LT5hc19tdi5jb2wgLSByZWYtPmFzX212LmNvbCldKQorICAgICAgICAgICAgICAgICogZXJyb3JfcGVyX2JpdCArIDEyOCkgPj4gODsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB2cDhfaW5pdF9kc21vdGlvbl9jb21wZW5zYXRpb24oTUFDUk9CTE9DSyAqeCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgTGVuOworICAgIGludCBzZWFyY2hfc2l0ZV9jb3VudCA9IDA7CisKKworICAgIC8qIEdlbmVyYXRlIG9mZnNldHMgZm9yIDQgc2VhcmNoIHNpdGVzIHBlciBzdGVwLiAqLworICAgIExlbiA9IE1BWF9GSVJTVF9TVEVQOworICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSAwOworICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSAwOworICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSAwOworICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7CisKKyAgICB3aGlsZSAoTGVuID4gMCkKKyAgICB7CisKKyAgICAgICAgLyogQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuICovCisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSAwOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gLUxlbjsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IC1MZW4gKiBzdHJpZGU7CisgICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuICovCisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSAwOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gTGVuOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gTGVuICogc3RyaWRlOworICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOworCisgICAgICAgIC8qIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLiAqLworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gLUxlbjsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IDA7CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSAtTGVuOworICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOworCisgICAgICAgIC8qIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLiAqLworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gTGVuOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gMDsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IExlbjsKKyAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKKworICAgICAgICAvKiBDb250cmFjdC4gKi8KKyAgICAgICAgTGVuIC89IDI7CisgICAgfQorCisgICAgeC0+c3NfY291bnQgPSBzZWFyY2hfc2l0ZV9jb3VudDsKKyAgICB4LT5zZWFyY2hlc19wZXJfc3RlcCA9IDQ7Cit9CisKK3ZvaWQgdnA4X2luaXQzc21vdGlvbl9jb21wZW5zYXRpb24oTUFDUk9CTE9DSyAqeCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgTGVuOworICAgIGludCBzZWFyY2hfc2l0ZV9jb3VudCA9IDA7CisKKyAgICAvKiBHZW5lcmF0ZSBvZmZzZXRzIGZvciA4IHNlYXJjaCBzaXRlcyBwZXIgc3RlcC4gKi8KKyAgICBMZW4gPSBNQVhfRklSU1RfU1RFUDsKKyAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gMDsKKyAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gMDsKKyAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gMDsKKyAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOworCisgICAgd2hpbGUgKExlbiA+IDApCisgICAgeworCisgICAgICAgIC8qIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLiAqLworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gMDsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IC1MZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSAtTGVuICogc3RyaWRlOworICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOworCisgICAgICAgIC8qIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLiAqLworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gMDsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IExlbjsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IExlbiAqIHN0cmlkZTsKKyAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKKworICAgICAgICAvKiBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4gKi8KKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IC1MZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSAwOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gLUxlbjsKKyAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKKworICAgICAgICAvKiBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4gKi8KKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IExlbjsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IDA7CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSBMZW47CisgICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuICovCisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSAtTGVuOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gLUxlbjsKKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IC1MZW4gKiBzdHJpZGUgLSBMZW47CisgICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuICovCisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSBMZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSAtTGVuOworICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gLUxlbiAqIHN0cmlkZSArIExlbjsKKyAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKKworICAgICAgICAvKiBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4gKi8KKyAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IC1MZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSBMZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSBMZW4gKiBzdHJpZGUgLSBMZW47CisgICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuICovCisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSBMZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSBMZW47CisgICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSBMZW4gKiBzdHJpZGUgKyBMZW47CisgICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7CisKKworICAgICAgICAvKiBDb250cmFjdC4gKi8KKyAgICAgICAgTGVuIC89IDI7CisgICAgfQorCisgICAgeC0+c3NfY291bnQgPSBzZWFyY2hfc2l0ZV9jb3VudDsKKyAgICB4LT5zZWFyY2hlc19wZXJfc3RlcCA9IDg7Cit9CisKKy8qCisgKiBUbyBhdm9pZCB0aGUgcGVuYWx0eSBmb3IgY3Jvc3NpbmcgY2FjaGUtbGluZSByZWFkLCBwcmVsb2FkIHRoZSByZWZlcmVuY2UKKyAqIGFyZWEgaW4gYSBzbWFsbCBidWZmZXIsIHdoaWNoIGlzIGFsaWduZWQgdG8gbWFrZSBzdXJlIHRoZXJlIHdvbid0IGJlIGNyb3NzaW5nCisgKiBjYWNoZS1saW5lIHJlYWQgd2hpbGUgcmVhZGluZyBmcm9tIHRoaXMgYnVmZmVyLiBUaGlzIHJlZHVjZWQgdGhlIGNwdQorICogY3ljbGVzIHNwZW50IG9uIHJlYWRpbmcgcmVmIGRhdGEgaW4gc3ViLXBpeGVsIGZpbHRlciBmdW5jdGlvbnMuCisgKiBUT0RPOiBDdXJyZW50bHksIHNpbmNlIHN1Yi1waXhlbCBzZWFyY2ggcmFuZ2UgaGVyZSBpcyAtMyB+IDMsIGNvcHkgMjIgcm93cyB4CisgKiAzMiBjb2xzIGFyZWEgdGhhdCBpcyBlbm91Z2ggZm9yIDE2eDE2IG1hY3JvYmxvY2suIExhdGVyLCBmb3IgU1BMSVRNViwgd2UKKyAqIGNvdWxkIHJlZHVjZSB0aGUgYXJlYS4KKyAqLworCisvKiBlc3RpbWF0ZWQgY29zdCBvZiBhIG1vdGlvbiB2ZWN0b3IgKHIsYykgKi8KKyNkZWZpbmUgTVZDKHIsYykgKG12Y29zdCA/ICgobXZjb3N0WzBdWyhyKS1ycl0gKyBtdmNvc3RbMV1bKGMpIC0gcmNdKSAqIGVycm9yX3Blcl9iaXQgKyAxMjggKT4+OCA6IDApCisvKiBwb2ludGVyIHRvIHByZWRpY3RvciBiYXNlIG9mIGEgbW90aW9udmVjdG9yICovCisjZGVmaW5lIFBSRShyLGMpICh5ICsgKCgocik+PjIpICogeV9zdHJpZGUgKyAoKGMpPj4yKSAtKG9mZnNldCkpKQorLyogY29udmVydCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCB0byBvZmZzZXQgZm9yIHN2ZiBjYWxjICovCisjZGVmaW5lIFNQKHgpICgoKHgpJjMpPDwxKQorLyogcmV0dXJucyBzdWJwaXhlbCB2YXJpYW5jZSBlcnJvciBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgRElTVChyLGMpIHZmcC0+c3ZmKCBQUkUocixjKSwgeV9zdHJpZGUsIFNQKGMpLFNQKHIpLCB6LGItPnNyY19zdHJpZGUsJnNzZSkKKyNkZWZpbmUgSUZNVkNWKHIsYyxzLGUpIGlmICggYyA+PSBtaW5jICYmIGMgPD0gbWF4YyAmJiByID49IG1pbnIgJiYgciA8PSBtYXhyKSBzIGVsc2UgZTsKKy8qIHJldHVybnMgZGlzdG9ydGlvbiArIG1vdGlvbiB2ZWN0b3IgY29zdCAqLworI2RlZmluZSBFUlIocixjKSAoTVZDKHIsYykrRElTVChyLGMpKQorLyogY2hlY2tzIGlmIChyLGMpIGhhcyBiZXR0ZXIgc2NvcmUgdGhhbiBwcmV2aW91cyBiZXN0ICovCisjZGVmaW5lIENIRUNLX0JFVFRFUih2LHIsYykgSUZNVkNWKHIsYyx7dGhpc21zZSA9IERJU1QocixjKTsgaWYoKHYgPSAoTVZDKHIsYykrdGhpc21zZSkpIDwgYmVzdGVycikgeyBiZXN0ZXJyID0gdjsgYnI9cjsgYmM9YzsgKmRpc3RvcnRpb24gPSB0aGlzbXNlOyAqc3NlMSA9IHNzZTsgfX0sIHY9VUlOVF9NQVg7KQorCitpbnQgdnA4X2ZpbmRfYmVzdF9zdWJfcGl4ZWxfc3RlcF9pdGVyYXRpdmVseShNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X212ICpiZXN0bXYsIGludF9tdiAqcmVmX212LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3Blcl9iaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXZjb3N0WzJdLCBpbnQgKmRpc3RvcnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNzZTEpCit7CisgICAgdW5zaWduZWQgY2hhciAqeiA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7CisKKyAgICBpbnQgcnIgPSByZWZfbXYtPmFzX212LnJvdyA+PiAxLCByYyA9IHJlZl9tdi0+YXNfbXYuY29sID4+IDE7CisgICAgaW50IGJyID0gYmVzdG12LT5hc19tdi5yb3cgPDwgMiwgYmMgPSBiZXN0bXYtPmFzX212LmNvbCA8PCAyOworICAgIGludCB0ciA9IGJyLCB0YyA9IGJjOworICAgIHVuc2lnbmVkIGludCBiZXN0ZXJyOworICAgIHVuc2lnbmVkIGludCBsZWZ0LCByaWdodCwgdXAsIGRvd24sIGRpYWc7CisgICAgdW5zaWduZWQgaW50IHNzZTsKKyAgICB1bnNpZ25lZCBpbnQgd2hpY2hkaXI7CisgICAgdW5zaWduZWQgaW50IGhhbGZpdGVycyA9IDQ7CisgICAgdW5zaWduZWQgaW50IHF1YXJ0ZXJpdGVycyA9IDQ7CisgICAgaW50IHRoaXNtc2U7CisKKyAgICBpbnQgbWluYyA9IE1BWCh4LT5tdl9jb2xfbWluIDw8IDIsIChyZWZfbXYtPmFzX212LmNvbCA+PiAxKSAtICgoMSA8PCBtdmxvbmdfd2lkdGgpIC0gMSkpOworICAgIGludCBtYXhjID0gTUlOKHgtPm12X2NvbF9tYXggPDwgMiwgKHJlZl9tdi0+YXNfbXYuY29sID4+IDEpICsgKCgxIDw8IG12bG9uZ193aWR0aCkgLSAxKSk7CisgICAgaW50IG1pbnIgPSBNQVgoeC0+bXZfcm93X21pbiA8PCAyLCAocmVmX212LT5hc19tdi5yb3cgPj4gMSkgLSAoKDEgPDwgbXZsb25nX3dpZHRoKSAtIDEpKTsKKyAgICBpbnQgbWF4ciA9IE1JTih4LT5tdl9yb3dfbWF4IDw8IDIsIChyZWZfbXYtPmFzX212LnJvdyA+PiAxKSArICgoMSA8PCBtdmxvbmdfd2lkdGgpIC0gMSkpOworCisgICAgaW50IHlfc3RyaWRlOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisKKworI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0CisgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOworICAgIHVuc2lnbmVkIGNoYXIgKnkwID0gYmFzZV9wcmUgKyBkLT5vZmZzZXQgKyAoYmVzdG12LT5hc19tdi5yb3cpICogcHJlX3N0cmlkZSArIGJlc3Rtdi0+YXNfbXYuY29sOworICAgIHVuc2lnbmVkIGNoYXIgKnk7CisgICAgaW50IGJ1Zl9yMSwgYnVmX3IyLCBidWZfYzEsIGJ1Zl9jMjsKKworICAgIC8qIENsYW1waW5nIHRvIGF2b2lkIG91dC1vZi1yYW5nZSBkYXRhIGFjY2VzcyAqLworICAgIGJ1Zl9yMSA9ICgoYmVzdG12LT5hc19tdi5yb3cgLSAzKSA8IHgtPm12X3Jvd19taW4pPyhiZXN0bXYtPmFzX212LnJvdyAtIHgtPm12X3Jvd19taW4pOjM7CisgICAgYnVmX3IyID0gKChiZXN0bXYtPmFzX212LnJvdyArIDMpID4geC0+bXZfcm93X21heCk/KHgtPm12X3Jvd19tYXggLSBiZXN0bXYtPmFzX212LnJvdyk6MzsKKyAgICBidWZfYzEgPSAoKGJlc3Rtdi0+YXNfbXYuY29sIC0gMykgPCB4LT5tdl9jb2xfbWluKT8oYmVzdG12LT5hc19tdi5jb2wgLSB4LT5tdl9jb2xfbWluKTozOworICAgIGJ1Zl9jMiA9ICgoYmVzdG12LT5hc19tdi5jb2wgKyAzKSA+IHgtPm12X2NvbF9tYXgpPyh4LT5tdl9jb2xfbWF4IC0gYmVzdG12LT5hc19tdi5jb2wpOjM7CisgICAgeV9zdHJpZGUgPSAzMjsKKworICAgIC8qIENvcHkgdG8gaW50ZXJtZWRpYXRlIGJ1ZmZlciBiZWZvcmUgc2VhcmNoaW5nLiAqLworICAgIHZmcC0+Y29weW1lbSh5MCAtIGJ1Zl9jMSAtIHByZV9zdHJpZGUqYnVmX3IxLCBwcmVfc3RyaWRlLCB4ZC0+eV9idWYsIHlfc3RyaWRlLCAxNitidWZfcjErYnVmX3IyKTsKKyAgICB5ID0geGQtPnlfYnVmICsgeV9zdHJpZGUqYnVmX3IxICtidWZfYzE7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIgKnkgPSBiYXNlX3ByZSArIGQtPm9mZnNldCArIChiZXN0bXYtPmFzX212LnJvdykgKiBwcmVfc3RyaWRlICsgYmVzdG12LT5hc19tdi5jb2w7CisgICAgeV9zdHJpZGUgPSBwcmVfc3RyaWRlOworI2VuZGlmCisKKyAgICBvZmZzZXQgPSAoYmVzdG12LT5hc19tdi5yb3cpICogeV9zdHJpZGUgKyBiZXN0bXYtPmFzX212LmNvbDsKKworICAgIC8qIGNlbnRyYWwgbXYgKi8KKyAgICBiZXN0bXYtPmFzX212LnJvdyA8PD0gMzsKKyAgICBiZXN0bXYtPmFzX212LmNvbCA8PD0gMzsKKworICAgIC8qIGNhbGN1bGF0ZSBjZW50cmFsIHBvaW50IGVycm9yICovCisgICAgYmVzdGVyciA9IHZmcC0+dmYoeSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsIHNzZTEpOworICAgICpkaXN0b3J0aW9uID0gYmVzdGVycjsKKyAgICBiZXN0ZXJyICs9IG12X2Vycl9jb3N0KGJlc3RtdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgLyogVE9ETzogRWFjaCBzdWJzZXF1ZW50IGl0ZXJhdGlvbiBjaGVja3MgYXQgbGVhc3Qgb25lIHBvaW50IGluIGNvbW1vbgorICAgICAqIHdpdGggdGhlIGxhc3QgaXRlcmF0aW9uIGNvdWxkIGJlIDIgKCBpZiBkaWFnIHNlbGVjdGVkKQorICAgICAqLworICAgIHdoaWxlICgtLWhhbGZpdGVycykKKyAgICB7CisgICAgICAgIC8qIDEvMiBwZWwgKi8KKyAgICAgICAgQ0hFQ0tfQkVUVEVSKGxlZnQsIHRyLCB0YyAtIDIpOworICAgICAgICBDSEVDS19CRVRURVIocmlnaHQsIHRyLCB0YyArIDIpOworICAgICAgICBDSEVDS19CRVRURVIodXAsIHRyIC0gMiwgdGMpOworICAgICAgICBDSEVDS19CRVRURVIoZG93biwgdHIgKyAyLCB0Yyk7CisKKyAgICAgICAgd2hpY2hkaXIgPSAobGVmdCA8IHJpZ2h0ID8gMCA6IDEpICsgKHVwIDwgZG93biA/IDAgOiAyKTsKKworICAgICAgICBzd2l0Y2ggKHdoaWNoZGlyKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIENIRUNLX0JFVFRFUihkaWFnLCB0ciAtIDIsIHRjIC0gMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSKGRpYWcsIHRyIC0gMiwgdGMgKyAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBDSEVDS19CRVRURVIoZGlhZywgdHIgKyAyLCB0YyAtIDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIENIRUNLX0JFVFRFUihkaWFnLCB0ciArIDIsIHRjICsgMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vIHJlYXNvbiB0byBjaGVjayB0aGUgc2FtZSBvbmUgYWdhaW4uICovCisgICAgICAgIGlmICh0ciA9PSBiciAmJiB0YyA9PSBiYykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHRyID0gYnI7CisgICAgICAgIHRjID0gYmM7CisgICAgfQorCisgICAgLyogVE9ETzogRWFjaCBzdWJzZXF1ZW50IGl0ZXJhdGlvbiBjaGVja3MgYXQgbGVhc3Qgb25lIHBvaW50IGluIGNvbW1vbgorICAgICAqIHdpdGggdGhlIGxhc3QgaXRlcmF0aW9uIGNvdWxkIGJlIDIgKCBpZiBkaWFnIHNlbGVjdGVkKQorICAgICAqLworCisgICAgLyogMS80IHBlbCAqLworICAgIHdoaWxlICgtLXF1YXJ0ZXJpdGVycykKKyAgICB7CisgICAgICAgIENIRUNLX0JFVFRFUihsZWZ0LCB0ciwgdGMgLSAxKTsKKyAgICAgICAgQ0hFQ0tfQkVUVEVSKHJpZ2h0LCB0ciwgdGMgKyAxKTsKKyAgICAgICAgQ0hFQ0tfQkVUVEVSKHVwLCB0ciAtIDEsIHRjKTsKKyAgICAgICAgQ0hFQ0tfQkVUVEVSKGRvd24sIHRyICsgMSwgdGMpOworCisgICAgICAgIHdoaWNoZGlyID0gKGxlZnQgPCByaWdodCA/IDAgOiAxKSArICh1cCA8IGRvd24gPyAwIDogMik7CisKKyAgICAgICAgc3dpdGNoICh3aGljaGRpcikKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBDSEVDS19CRVRURVIoZGlhZywgdHIgLSAxLCB0YyAtIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIENIRUNLX0JFVFRFUihkaWFnLCB0ciAtIDEsIHRjICsgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSKGRpYWcsIHRyICsgMSwgdGMgLSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBDSEVDS19CRVRURVIoZGlhZywgdHIgKyAxLCB0YyArIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBubyByZWFzb24gdG8gY2hlY2sgdGhlIHNhbWUgb25lIGFnYWluLiAqLworICAgICAgICBpZiAodHIgPT0gYnIgJiYgdGMgPT0gYmMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB0ciA9IGJyOworICAgICAgICB0YyA9IGJjOworICAgIH0KKworICAgIGJlc3Rtdi0+YXNfbXYucm93ID0gYnIgPDwgMTsKKyAgICBiZXN0bXYtPmFzX212LmNvbCA9IGJjIDw8IDE7CisKKyAgICBpZiAoKGFicyhiZXN0bXYtPmFzX212LmNvbCAtIHJlZl9tdi0+YXNfbXYuY29sKSA+IChNQVhfRlVMTF9QRUxfVkFMPDwzKSkgfHwKKyAgICAgICAgKGFicyhiZXN0bXYtPmFzX212LnJvdyAtIHJlZl9tdi0+YXNfbXYucm93KSA+IChNQVhfRlVMTF9QRUxfVkFMPDwzKSkpCisgICAgICAgIHJldHVybiBJTlRfTUFYOworCisgICAgcmV0dXJuIGJlc3RlcnI7Cit9CisjdW5kZWYgTVZDCisjdW5kZWYgUFJFCisjdW5kZWYgU1AKKyN1bmRlZiBESVNUCisjdW5kZWYgSUZNVkNWCisjdW5kZWYgRVJSCisjdW5kZWYgQ0hFQ0tfQkVUVEVSCisKK2ludCB2cDhfZmluZF9iZXN0X3N1Yl9waXhlbF9zdGVwKE1BQ1JPQkxPQ0sgKngsIEJMT0NLICpiLCBCTE9DS0QgKmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfbXYgKmJlc3RtdiwgaW50X212ICpyZWZfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcGVyX2JpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqdmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptdmNvc3RbMl0sIGludCAqZGlzdG9ydGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc3NlMSkKK3sKKyAgICBpbnQgYmVzdG1zZSA9IElOVF9NQVg7CisgICAgaW50X212IHN0YXJ0bXY7CisgICAgaW50X212IHRoaXNfbXY7CisgICAgdW5zaWduZWQgY2hhciAqeiA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7CisgICAgaW50IGxlZnQsIHJpZ2h0LCB1cCwgZG93biwgZGlhZzsKKyAgICB1bnNpZ25lZCBpbnQgc3NlOworICAgIGludCB3aGljaGRpciA7CisgICAgaW50IHRoaXNtc2U7CisgICAgaW50IHlfc3RyaWRlOworICAgIGludCBwcmVfc3RyaWRlID0geC0+ZV9tYmQucHJlLnlfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmJhc2VfcHJlID0geC0+ZV9tYmQucHJlLnlfYnVmZmVyOworCisjaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgdW5zaWduZWQgY2hhciAqeTAgPSBiYXNlX3ByZSArIGQtPm9mZnNldCArIChiZXN0bXYtPmFzX212LnJvdykgKiBwcmVfc3RyaWRlICsgYmVzdG12LT5hc19tdi5jb2w7CisgICAgdW5zaWduZWQgY2hhciAqeTsKKworICAgIHlfc3RyaWRlID0gMzI7CisgICAgLyogQ29weSAxOCByb3dzIHggMzIgY29scyBhcmVhIHRvIGludGVybWVkaWF0ZSBidWZmZXIgYmVmb3JlIHNlYXJjaGluZy4gKi8KKyAgICAgdmZwLT5jb3B5bWVtKHkwIC0gMSAtIHByZV9zdHJpZGUsIHByZV9zdHJpZGUsIHhkLT55X2J1ZiwgeV9zdHJpZGUsIDE4KTsKKyAgICAgeSA9IHhkLT55X2J1ZiArIHlfc3RyaWRlICsgMTsKKyNlbHNlCisgICAgIHVuc2lnbmVkIGNoYXIgKnkgPSBiYXNlX3ByZSArIGQtPm9mZnNldCArIChiZXN0bXYtPmFzX212LnJvdykgKiBwcmVfc3RyaWRlICsgYmVzdG12LT5hc19tdi5jb2w7CisgICAgIHlfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyNlbmRpZgorCisgICAgLyogY2VudHJhbCBtdiAqLworICAgIGJlc3Rtdi0+YXNfbXYucm93IDw8PSAzOworICAgIGJlc3Rtdi0+YXNfbXYuY29sIDw8PSAzOworICAgIHN0YXJ0bXYgPSAqYmVzdG12OworCisgICAgLyogY2FsY3VsYXRlIGNlbnRyYWwgcG9pbnQgZXJyb3IgKi8KKyAgICBiZXN0bXNlID0gdmZwLT52Zih5LCB5X3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgc3NlMSk7CisgICAgKmRpc3RvcnRpb24gPSBiZXN0bXNlOworICAgIGJlc3Rtc2UgKz0gbXZfZXJyX2Nvc3QoYmVzdG12LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICAvKiBnbyBsZWZ0IHRoZW4gcmlnaHQgYW5kIGNoZWNrIGVycm9yICovCisgICAgdGhpc19tdi5hc19tdi5yb3cgPSBzdGFydG12LmFzX212LnJvdzsKKyAgICB0aGlzX212LmFzX212LmNvbCA9ICgoc3RhcnRtdi5hc19tdi5jb2wgLSA4KSB8IDQpOworICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zl9oYWxmcGl4X2goeSAtIDEsIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICBsZWZ0ID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAobGVmdCA8IGJlc3Rtc2UpCisgICAgeworICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKKyAgICAgICAgYmVzdG1zZSA9IGxlZnQ7CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisgICAgdGhpc19tdi5hc19tdi5jb2wgKz0gODsKKyAgICB0aGlzbXNlID0gdmZwLT5zdmZfaGFsZnBpeF9oKHksIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICByaWdodCA9IHRoaXNtc2UgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgaWYgKHJpZ2h0IDwgYmVzdG1zZSkKKyAgICB7CisgICAgICAgICpiZXN0bXYgPSB0aGlzX212OworICAgICAgICBiZXN0bXNlID0gcmlnaHQ7CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisgICAgLyogZ28gdXAgdGhlbiBkb3duIGFuZCBjaGVjayBlcnJvciAqLworICAgIHRoaXNfbXYuYXNfbXYuY29sID0gc3RhcnRtdi5hc19tdi5jb2w7CisgICAgdGhpc19tdi5hc19tdi5yb3cgPSAoKHN0YXJ0bXYuYXNfbXYucm93IC0gOCkgfCA0KTsKKyAgICB0aGlzbXNlID0gIHZmcC0+c3ZmX2hhbGZwaXhfdih5IC0geV9zdHJpZGUsIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICB1cCA9IHRoaXNtc2UgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgaWYgKHVwIDwgYmVzdG1zZSkKKyAgICB7CisgICAgICAgICpiZXN0bXYgPSB0aGlzX212OworICAgICAgICBiZXN0bXNlID0gdXA7CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisgICAgdGhpc19tdi5hc19tdi5yb3cgKz0gODsKKyAgICB0aGlzbXNlID0gdmZwLT5zdmZfaGFsZnBpeF92KHksIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICBkb3duID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAoZG93biA8IGJlc3Rtc2UpCisgICAgeworICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKKyAgICAgICAgYmVzdG1zZSA9IGRvd247CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisKKyAgICAvKiBub3cgY2hlY2sgMSBtb3JlIGRpYWdvbmFsICovCisgICAgd2hpY2hkaXIgPSAobGVmdCA8IHJpZ2h0ID8gMCA6IDEpICsgKHVwIDwgZG93biA/IDAgOiAyKTsKKyAgICB0aGlzX212ID0gc3RhcnRtdjsKKworICAgIHN3aXRjaCAod2hpY2hkaXIpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSAodGhpc19tdi5hc19tdi5jb2wgLSA4KSB8IDQ7CisgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gKHRoaXNfbXYuYXNfbXYucm93IC0gOCkgfCA0OworICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmZfaGFsZnBpeF9odih5IC0gMSAtIHlfc3RyaWRlLCB5X3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgKz0gNDsKKyAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSAodGhpc19tdi5hc19tdi5yb3cgLSA4KSB8IDQ7CisgICAgICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zl9oYWxmcGl4X2h2KHkgLSB5X3N0cmlkZSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gKHRoaXNfbXYuYXNfbXYuY29sIC0gOCkgfCA0OworICAgICAgICB0aGlzX212LmFzX212LnJvdyArPSA0OworICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmZfaGFsZnBpeF9odih5IC0gMSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgKz0gNDsKKyAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgKz0gNDsKKyAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmX2hhbGZwaXhfaHYoeSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkaWFnID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAoZGlhZyA8IGJlc3Rtc2UpCisgICAgeworICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKKyAgICAgICAgYmVzdG1zZSA9IGRpYWc7CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisKKyAgICAvKiB0aW1lIHRvIGNoZWNrIHF1YXJ0ZXIgcGVscy4gKi8KKyAgICBpZiAoYmVzdG12LT5hc19tdi5yb3cgPCBzdGFydG12LmFzX212LnJvdykKKyAgICAgICAgeSAtPSB5X3N0cmlkZTsKKworICAgIGlmIChiZXN0bXYtPmFzX212LmNvbCA8IHN0YXJ0bXYuYXNfbXYuY29sKQorICAgICAgICB5LS07CisKKyAgICBzdGFydG12ID0gKmJlc3RtdjsKKworCisKKyAgICAvKiBnbyBsZWZ0IHRoZW4gcmlnaHQgYW5kIGNoZWNrIGVycm9yICovCisgICAgdGhpc19tdi5hc19tdi5yb3cgPSBzdGFydG12LmFzX212LnJvdzsKKworICAgIGlmIChzdGFydG12LmFzX212LmNvbCAmIDcpCisgICAgeworICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IHN0YXJ0bXYuYXNfbXYuY29sIC0gMjsKKyAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHksIHlfc3RyaWRlLCB0aGlzX212LmFzX212LmNvbCAmIDcsIHRoaXNfbXYuYXNfbXYucm93ICYgNywgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gKHN0YXJ0bXYuYXNfbXYuY29sIC0gOCkgfCA2OworICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmYoeSAtIDEsIHlfc3RyaWRlLCA2LCB0aGlzX212LmFzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgIH0KKworICAgIGxlZnQgPSB0aGlzbXNlICsgbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKKworICAgIGlmIChsZWZ0IDwgYmVzdG1zZSkKKyAgICB7CisgICAgICAgICpiZXN0bXYgPSB0aGlzX212OworICAgICAgICBiZXN0bXNlID0gbGVmdDsKKyAgICAgICAgKmRpc3RvcnRpb24gPSB0aGlzbXNlOworICAgICAgICAqc3NlMSA9IHNzZTsKKyAgICB9CisKKyAgICB0aGlzX212LmFzX212LmNvbCArPSA0OworICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zih5LCB5X3N0cmlkZSwgdGhpc19tdi5hc19tdi5jb2wgJiA3LCB0aGlzX212LmFzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgIHJpZ2h0ID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAocmlnaHQgPCBiZXN0bXNlKQorICAgIHsKKyAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7CisgICAgICAgIGJlc3Rtc2UgPSByaWdodDsKKyAgICAgICAgKmRpc3RvcnRpb24gPSB0aGlzbXNlOworICAgICAgICAqc3NlMSA9IHNzZTsKKyAgICB9CisKKyAgICAvKiBnbyB1cCB0aGVuIGRvd24gYW5kIGNoZWNrIGVycm9yICovCisgICAgdGhpc19tdi5hc19tdi5jb2wgPSBzdGFydG12LmFzX212LmNvbDsKKworICAgIGlmIChzdGFydG12LmFzX212LnJvdyAmIDcpCisgICAgeworICAgICAgICB0aGlzX212LmFzX212LnJvdyA9IHN0YXJ0bXYuYXNfbXYucm93IC0gMjsKKyAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHksIHlfc3RyaWRlLCB0aGlzX212LmFzX212LmNvbCAmIDcsIHRoaXNfbXYuYXNfbXYucm93ICYgNywgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gKHN0YXJ0bXYuYXNfbXYucm93IC0gOCkgfCA2OworICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmYoeSAtIHlfc3RyaWRlLCB5X3N0cmlkZSwgdGhpc19tdi5hc19tdi5jb2wgJiA3LCA2LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICB9CisKKyAgICB1cCA9IHRoaXNtc2UgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgaWYgKHVwIDwgYmVzdG1zZSkKKyAgICB7CisgICAgICAgICpiZXN0bXYgPSB0aGlzX212OworICAgICAgICBiZXN0bXNlID0gdXA7CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisgICAgdGhpc19tdi5hc19tdi5yb3cgKz0gNDsKKyAgICB0aGlzbXNlID0gdmZwLT5zdmYoeSwgeV9zdHJpZGUsIHRoaXNfbXYuYXNfbXYuY29sICYgNywgdGhpc19tdi5hc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICBkb3duID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAoZG93biA8IGJlc3Rtc2UpCisgICAgeworICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKKyAgICAgICAgYmVzdG1zZSA9IGRvd247CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisKKyAgICAvKiBub3cgY2hlY2sgMSBtb3JlIGRpYWdvbmFsICovCisgICAgd2hpY2hkaXIgPSAobGVmdCA8IHJpZ2h0ID8gMCA6IDEpICsgKHVwIDwgZG93biA/IDAgOiAyKTsKKworICAgIHRoaXNfbXYgPSBzdGFydG12OworCisgICAgc3dpdGNoICh3aGljaGRpcikKKyAgICB7CisgICAgY2FzZSAwOgorCisgICAgICAgIGlmIChzdGFydG12LmFzX212LnJvdyAmIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYucm93IC09IDI7CisKKyAgICAgICAgICAgIGlmIChzdGFydG12LmFzX212LmNvbCAmIDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgLT0gMjsKKyAgICAgICAgICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmYoeSwgeV9zdHJpZGUsIHRoaXNfbXYuYXNfbXYuY29sICYgNywgdGhpc19tdi5hc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IChzdGFydG12LmFzX212LmNvbCAtIDgpIHwgNjsKKyAgICAgICAgICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmYoeSAtIDEsIHlfc3RyaWRlLCA2LCB0aGlzX212LmFzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gKHN0YXJ0bXYuYXNfbXYucm93IC0gOCkgfCA2OworCisgICAgICAgICAgICBpZiAoc3RhcnRtdi5hc19tdi5jb2wgJiA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sIC09IDI7CisgICAgICAgICAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHkgLSB5X3N0cmlkZSwgeV9zdHJpZGUsIHRoaXNfbXYuYXNfbXYuY29sICYgNywgNiwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSAoc3RhcnRtdi5hc19tdi5jb2wgLSA4KSB8IDY7CisgICAgICAgICAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHkgLSB5X3N0cmlkZSAtIDEsIHlfc3RyaWRlLCA2LCA2LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgKz0gMjsKKworICAgICAgICBpZiAoc3RhcnRtdi5hc19tdi5yb3cgJiA3KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzX212LmFzX212LnJvdyAtPSAyOworICAgICAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHksIHlfc3RyaWRlLCB0aGlzX212LmFzX212LmNvbCAmIDcsIHRoaXNfbXYuYXNfbXYucm93ICYgNywgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzX212LmFzX212LnJvdyA9IChzdGFydG12LmFzX212LnJvdyAtIDgpIHwgNjsKKyAgICAgICAgICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zih5IC0geV9zdHJpZGUsIHlfc3RyaWRlLCB0aGlzX212LmFzX212LmNvbCAmIDcsIDYsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB0aGlzX212LmFzX212LnJvdyArPSAyOworCisgICAgICAgIGlmIChzdGFydG12LmFzX212LmNvbCAmIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sIC09IDI7CisgICAgICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmYoeSwgeV9zdHJpZGUsIHRoaXNfbXYuYXNfbXYuY29sICYgNywgdGhpc19tdi5hc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gKHN0YXJ0bXYuYXNfbXYuY29sIC0gOCkgfCA2OworICAgICAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHkgLSAxLCB5X3N0cmlkZSwgNiwgdGhpc19tdi5hc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgKz0gMjsKKyAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgKz0gMjsKKyAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmKHksIHlfc3RyaWRlLCAgdGhpc19tdi5hc19tdi5jb2wgJiA3LCB0aGlzX212LmFzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkaWFnID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAoZGlhZyA8IGJlc3Rtc2UpCisgICAgeworICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKKyAgICAgICAgYmVzdG1zZSA9IGRpYWc7CisgICAgICAgICpkaXN0b3J0aW9uID0gdGhpc21zZTsKKyAgICAgICAgKnNzZTEgPSBzc2U7CisgICAgfQorCisgICAgcmV0dXJuIGJlc3Rtc2U7Cit9CisKK2ludCB2cDhfZmluZF9iZXN0X2hhbGZfcGl4ZWxfc3RlcChNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9tdiAqYmVzdG12LCBpbnRfbXYgKnJlZl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcGVyX2JpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm12Y29zdFsyXSwgaW50ICpkaXN0b3J0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc3NlMSkKK3sKKyAgICBpbnQgYmVzdG1zZSA9IElOVF9NQVg7CisgICAgaW50X212IHN0YXJ0bXY7CisgICAgaW50X212IHRoaXNfbXY7CisgICAgdW5zaWduZWQgY2hhciAqeiA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7CisgICAgaW50IGxlZnQsIHJpZ2h0LCB1cCwgZG93biwgZGlhZzsKKyAgICB1bnNpZ25lZCBpbnQgc3NlOworICAgIGludCB3aGljaGRpciA7CisgICAgaW50IHRoaXNtc2U7CisgICAgaW50IHlfc3RyaWRlOworICAgIGludCBwcmVfc3RyaWRlID0geC0+ZV9tYmQucHJlLnlfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmJhc2VfcHJlID0geC0+ZV9tYmQucHJlLnlfYnVmZmVyOworCisjaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgdW5zaWduZWQgY2hhciAqeTAgPSBiYXNlX3ByZSArIGQtPm9mZnNldCArIChiZXN0bXYtPmFzX212LnJvdykgKiBwcmVfc3RyaWRlICsgYmVzdG12LT5hc19tdi5jb2w7CisgICAgdW5zaWduZWQgY2hhciAqeTsKKworICAgIHlfc3RyaWRlID0gMzI7CisgICAgLyogQ29weSAxOCByb3dzIHggMzIgY29scyBhcmVhIHRvIGludGVybWVkaWF0ZSBidWZmZXIgYmVmb3JlIHNlYXJjaGluZy4gKi8KKyAgICB2ZnAtPmNvcHltZW0oeTAgLSAxIC0gcHJlX3N0cmlkZSwgcHJlX3N0cmlkZSwgeGQtPnlfYnVmLCB5X3N0cmlkZSwgMTgpOworICAgIHkgPSB4ZC0+eV9idWYgKyB5X3N0cmlkZSArIDE7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIgKnkgPSBiYXNlX3ByZSArIGQtPm9mZnNldCArIChiZXN0bXYtPmFzX212LnJvdykgKiBwcmVfc3RyaWRlICsgYmVzdG12LT5hc19tdi5jb2w7CisgICAgeV9zdHJpZGUgPSBwcmVfc3RyaWRlOworI2VuZGlmCisKKyAgICAvKiBjZW50cmFsIG12ICovCisgICAgYmVzdG12LT5hc19tdi5yb3cgPDw9IDM7CisgICAgYmVzdG12LT5hc19tdi5jb2wgPDw9IDM7CisgICAgc3RhcnRtdiA9ICpiZXN0bXY7CisKKyAgICAvKiBjYWxjdWxhdGUgY2VudHJhbCBwb2ludCBlcnJvciAqLworICAgIGJlc3Rtc2UgPSB2ZnAtPnZmKHksIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCBzc2UxKTsKKyAgICAqZGlzdG9ydGlvbiA9IGJlc3Rtc2U7CisgICAgYmVzdG1zZSArPSBtdl9lcnJfY29zdChiZXN0bXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKKworICAgIC8qIGdvIGxlZnQgdGhlbiByaWdodCBhbmQgY2hlY2sgZXJyb3IgKi8KKyAgICB0aGlzX212LmFzX212LnJvdyA9IHN0YXJ0bXYuYXNfbXYucm93OworICAgIHRoaXNfbXYuYXNfbXYuY29sID0gKChzdGFydG12LmFzX212LmNvbCAtIDgpIHwgNCk7CisgICAgdGhpc21zZSA9IHZmcC0+c3ZmX2hhbGZwaXhfaCh5IC0gMSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgIGxlZnQgPSB0aGlzbXNlICsgbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKKworICAgIGlmIChsZWZ0IDwgYmVzdG1zZSkKKyAgICB7CisgICAgICAgICpiZXN0bXYgPSB0aGlzX212OworICAgICAgICBiZXN0bXNlID0gbGVmdDsKKyAgICAgICAgKmRpc3RvcnRpb24gPSB0aGlzbXNlOworICAgICAgICAqc3NlMSA9IHNzZTsKKyAgICB9CisKKyAgICB0aGlzX212LmFzX212LmNvbCArPSA4OworICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zl9oYWxmcGl4X2goeSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgIHJpZ2h0ID0gdGhpc21zZSArIG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBpZiAocmlnaHQgPCBiZXN0bXNlKQorICAgIHsKKyAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7CisgICAgICAgIGJlc3Rtc2UgPSByaWdodDsKKyAgICAgICAgKmRpc3RvcnRpb24gPSB0aGlzbXNlOworICAgICAgICAqc3NlMSA9IHNzZTsKKyAgICB9CisKKyAgICAvKiBnbyB1cCB0aGVuIGRvd24gYW5kIGNoZWNrIGVycm9yICovCisgICAgdGhpc19tdi5hc19tdi5jb2wgPSBzdGFydG12LmFzX212LmNvbDsKKyAgICB0aGlzX212LmFzX212LnJvdyA9ICgoc3RhcnRtdi5hc19tdi5yb3cgLSA4KSB8IDQpOworICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zl9oYWxmcGl4X3YoeSAtIHlfc3RyaWRlLCB5X3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgdXAgPSB0aGlzbXNlICsgbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKKworICAgIGlmICh1cCA8IGJlc3Rtc2UpCisgICAgeworICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKKyAgICAgICAgYmVzdG1zZSA9IHVwOworICAgICAgICAqZGlzdG9ydGlvbiA9IHRoaXNtc2U7CisgICAgICAgICpzc2UxID0gc3NlOworICAgIH0KKworICAgIHRoaXNfbXYuYXNfbXYucm93ICs9IDg7CisgICAgdGhpc21zZSA9IHZmcC0+c3ZmX2hhbGZwaXhfdih5LCB5X3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7CisgICAgZG93biA9IHRoaXNtc2UgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgaWYgKGRvd24gPCBiZXN0bXNlKQorICAgIHsKKyAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7CisgICAgICAgIGJlc3Rtc2UgPSBkb3duOworICAgICAgICAqZGlzdG9ydGlvbiA9IHRoaXNtc2U7CisgICAgICAgICpzc2UxID0gc3NlOworICAgIH0KKworICAgIC8qIG5vdyBjaGVjayAxIG1vcmUgZGlhZ29uYWwgLSAqLworICAgIHdoaWNoZGlyID0gKGxlZnQgPCByaWdodCA/IDAgOiAxKSArICh1cCA8IGRvd24gPyAwIDogMik7CisgICAgdGhpc19tdiA9IHN0YXJ0bXY7CisKKyAgICBzd2l0Y2ggKHdoaWNoZGlyKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gKHRoaXNfbXYuYXNfbXYuY29sIC0gOCkgfCA0OworICAgICAgICB0aGlzX212LmFzX212LnJvdyA9ICh0aGlzX212LmFzX212LnJvdyAtIDgpIHwgNDsKKyAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmX2hhbGZwaXhfaHYoeSAtIDEgLSB5X3N0cmlkZSwgeV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sICs9IDQ7CisgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gKHRoaXNfbXYuYXNfbXYucm93IC0gOCkgfCA0OworICAgICAgICB0aGlzbXNlID0gdmZwLT5zdmZfaGFsZnBpeF9odih5IC0geV9zdHJpZGUsIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB0aGlzX212LmFzX212LmNvbCA9ICh0aGlzX212LmFzX212LmNvbCAtIDgpIHwgNDsKKyAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgKz0gNDsKKyAgICAgICAgdGhpc21zZSA9IHZmcC0+c3ZmX2hhbGZwaXhfaHYoeSAtIDEsIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sICs9IDQ7CisgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ICs9IDQ7CisgICAgICAgIHRoaXNtc2UgPSB2ZnAtPnN2Zl9oYWxmcGl4X2h2KHksIHlfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGlhZyA9IHRoaXNtc2UgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgaWYgKGRpYWcgPCBiZXN0bXNlKQorICAgIHsKKyAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7CisgICAgICAgIGJlc3Rtc2UgPSBkaWFnOworICAgICAgICAqZGlzdG9ydGlvbiA9IHRoaXNtc2U7CisgICAgICAgICpzc2UxID0gc3NlOworICAgIH0KKworICAgIHJldHVybiBiZXN0bXNlOworfQorCisjZGVmaW5lIENIRUNLX0JPVU5EUyhyYW5nZSkgXAore1wKKyAgICBhbGxfaW4gPSAxO1wKKyAgICBhbGxfaW4gJj0gKChici1yYW5nZSkgPj0geC0+bXZfcm93X21pbik7XAorICAgIGFsbF9pbiAmPSAoKGJyK3JhbmdlKSA8PSB4LT5tdl9yb3dfbWF4KTtcCisgICAgYWxsX2luICY9ICgoYmMtcmFuZ2UpID49IHgtPm12X2NvbF9taW4pO1wKKyAgICBhbGxfaW4gJj0gKChiYytyYW5nZSkgPD0geC0+bXZfY29sX21heCk7XAorfQorCisjZGVmaW5lIENIRUNLX1BPSU5UIFwKK3tcCisgICAgaWYgKHRoaXNfbXYuYXNfbXYuY29sIDwgeC0+bXZfY29sX21pbikgY29udGludWU7XAorICAgIGlmICh0aGlzX212LmFzX212LmNvbCA+IHgtPm12X2NvbF9tYXgpIGNvbnRpbnVlO1wKKyAgICBpZiAodGhpc19tdi5hc19tdi5yb3cgPCB4LT5tdl9yb3dfbWluKSBjb250aW51ZTtcCisgICAgaWYgKHRoaXNfbXYuYXNfbXYucm93ID4geC0+bXZfcm93X21heCkgY29udGludWU7XAorfQorCisjZGVmaW5lIENIRUNLX0JFVFRFUiBcCit7XAorICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZClcCisgICAge1wKKyAgICAgICAgdGhpc3NhZCArPSBtdnNhZF9lcnJfY29zdCgmdGhpc19tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpO1wKKyAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKVwKKyAgICAgICAge1wKKyAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkO1wKKyAgICAgICAgICAgIGJlc3Rfc2l0ZSA9IGk7XAorICAgICAgICB9XAorICAgIH1cCit9CisKK3N0YXRpYyBjb25zdCBNViBuZXh0X2Noa3B0c1s2XVszXSA9Cit7CisgICAge3sgLTIsIDB9LCB7IC0xLCAtMn0sIHsxLCAtMn19LAorICAgIHt7IC0xLCAtMn0sIHsxLCAtMn0sIHsyLCAwfX0sCisgICAge3sxLCAtMn0sIHsyLCAwfSwgezEsIDJ9fSwKKyAgICB7ezIsIDB9LCB7MSwgMn0sIHsgLTEsIDJ9fSwKKyAgICB7ezEsIDJ9LCB7IC0xLCAyfSwgeyAtMiwgMH19LAorICAgIHt7IC0xLCAyfSwgeyAtMiwgMH0sIHsgLTEsIC0yfX0KK307CisKK2ludCB2cDhfaGV4X3NlYXJjaAorKAorICAgIE1BQ1JPQkxPQ0sgKngsCisgICAgQkxPQ0sgKmIsCisgICAgQkxPQ0tEICpkLAorICAgIGludF9tdiAqcmVmX212LAorICAgIGludF9tdiAqYmVzdF9tdiwKKyAgICBpbnQgc2VhcmNoX3BhcmFtLAorICAgIGludCBzYWRfcGVyX2JpdCwKKyAgICBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmcCwKKyAgICBpbnQgKm12c2FkY29zdFsyXSwKKyAgICBpbnQgKm12Y29zdFsyXSwKKyAgICBpbnRfbXYgKmNlbnRlcl9tdgorKQoreworICAgIE1WIGhleFs2XSA9IHsgeyAtMSwgLTJ9LCB7MSwgLTJ9LCB7MiwgMH0sIHsxLCAyfSwgeyAtMSwgMn0sIHsgLTIsIDB9IH0gOworICAgIE1WIG5laWdoYm9yc1s0XSA9IHt7MCwgLTF9LCB7IC0xLCAwfSwgezEsIDB9LCB7MCwgMX19IDsKKyAgICBpbnQgaSwgajsKKworICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOworICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisKKyAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBwcmVfc3RyaWRlOworICAgIGludCBiciwgYmM7CisgICAgaW50X212IHRoaXNfbXY7CisgICAgdW5zaWduZWQgaW50IGJlc3RzYWQ7CisgICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9vZmZzZXQ7CisgICAgdW5zaWduZWQgY2hhciAqdGhpc19vZmZzZXQ7CisgICAgaW50IGsgPSAtMTsKKyAgICBpbnQgYWxsX2luOworICAgIGludCBiZXN0X3NpdGUgPSAtMTsKKyAgICBpbnQgaGV4X3JhbmdlID0gMTI3OworICAgIGludCBkaWFfcmFuZ2UgPSA4OworCisgICAgaW50X212IGZjZW50ZXJfbXY7CisgICAgZmNlbnRlcl9tdi5hc19tdi5yb3cgPSBjZW50ZXJfbXYtPmFzX212LnJvdyA+PiAzOworICAgIGZjZW50ZXJfbXYuYXNfbXYuY29sID0gY2VudGVyX212LT5hc19tdi5jb2wgPj4gMzsKKworICAgIC8qIGFkanVzdCByZWZfbXYgdG8gbWFrZSBzdXJlIGl0IGlzIHdpdGhpbiBNViByYW5nZSAqLworICAgIHZwOF9jbGFtcF9tdihyZWZfbXYsIHgtPm12X2NvbF9taW4sIHgtPm12X2NvbF9tYXgsIHgtPm12X3Jvd19taW4sIHgtPm12X3Jvd19tYXgpOworICAgIGJyID0gcmVmX212LT5hc19tdi5yb3c7CisgICAgYmMgPSByZWZfbXYtPmFzX212LmNvbDsKKworICAgIC8qIFdvcmsgb3V0IHRoZSBzdGFydCBwb2ludCBmb3IgdGhlIHNlYXJjaCAqLworICAgIGJhc2Vfb2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIgKikoYmFzZV9wcmUgKyBkLT5vZmZzZXQpOworICAgIHRoaXNfb2Zmc2V0ID0gYmFzZV9vZmZzZXQgKyAoYnIgKiAocHJlX3N0cmlkZSkpICsgYmM7CisgICAgdGhpc19tdi5hc19tdi5yb3cgPSBicjsKKyAgICB0aGlzX212LmFzX212LmNvbCA9IGJjOworICAgIGJlc3RzYWQgPSB2ZnAtPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgdGhpc19vZmZzZXQsIGluX3doYXRfc3RyaWRlLCBVSU5UX01BWCkKKyAgICAgICAgICAgICsgbXZzYWRfZXJyX2Nvc3QoJnRoaXNfbXYsICZmY2VudGVyX212LCBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAvKiBMb3dlciBzZWFyY2ggcmFuZ2UgYmFzZWQgb24gcHJlZGljdGlvbiBpbmZvICovCisgICAgaWYgKHNlYXJjaF9wYXJhbSA+PSA2KSBnb3RvIGNhbF9uZWlnaGJvcnM7CisgICAgZWxzZSBpZiAoc2VhcmNoX3BhcmFtID49IDUpIGhleF9yYW5nZSA9IDQ7CisgICAgZWxzZSBpZiAoc2VhcmNoX3BhcmFtID49IDQpIGhleF9yYW5nZSA9IDY7CisgICAgZWxzZSBpZiAoc2VhcmNoX3BhcmFtID49IDMpIGhleF9yYW5nZSA9IDE1OworICAgIGVsc2UgaWYgKHNlYXJjaF9wYXJhbSA+PSAyKSBoZXhfcmFuZ2UgPSAzMTsKKyAgICBlbHNlIGlmIChzZWFyY2hfcGFyYW0gPj0gMSkgaGV4X3JhbmdlID0gNjM7CisKKyAgICBkaWFfcmFuZ2UgPSA4OworI2VuZGlmCisKKyAgICAvKiBoZXggc2VhcmNoICovCisgICAgQ0hFQ0tfQk9VTkRTKDIpCisKKyAgICBpZihhbGxfaW4pCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzX212LmFzX212LnJvdyA9IGJyICsgaGV4W2ldLnJvdzsKKyAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gYmMgKyBoZXhbaV0uY29sOworICAgICAgICAgICAgdGhpc19vZmZzZXQgPSBiYXNlX29mZnNldCArICh0aGlzX212LmFzX212LnJvdyAqIGluX3doYXRfc3RyaWRlKSArIHRoaXNfbXYuYXNfbXYuY29sOworICAgICAgICAgICAgdGhpc3NhZCA9IHZmcC0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCB0aGlzX29mZnNldCwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSCisgICAgICAgIH0KKyAgICB9ZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSBiciArIGhleFtpXS5yb3c7CisgICAgICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IGJjICsgaGV4W2ldLmNvbDsKKyAgICAgICAgICAgIENIRUNLX1BPSU5UCisgICAgICAgICAgICB0aGlzX29mZnNldCA9IGJhc2Vfb2Zmc2V0ICsgKHRoaXNfbXYuYXNfbXYucm93ICogaW5fd2hhdF9zdHJpZGUpICsgdGhpc19tdi5hc19tdi5jb2w7CisgICAgICAgICAgICB0aGlzc2FkID0gdmZwLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIHRoaXNfb2Zmc2V0LCBpbl93aGF0X3N0cmlkZSwgYmVzdHNhZCk7CisgICAgICAgICAgICBDSEVDS19CRVRURVIKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiZXN0X3NpdGUgPT0gLTEpCisgICAgICAgIGdvdG8gY2FsX25laWdoYm9yczsKKyAgICBlbHNlCisgICAgeworICAgICAgICBiciArPSBoZXhbYmVzdF9zaXRlXS5yb3c7CisgICAgICAgIGJjICs9IGhleFtiZXN0X3NpdGVdLmNvbDsKKyAgICAgICAgayA9IGJlc3Rfc2l0ZTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAxOyBqIDwgaGV4X3JhbmdlOyBqKyspCisgICAgeworICAgICAgICBiZXN0X3NpdGUgPSAtMTsKKyAgICAgICAgQ0hFQ0tfQk9VTkRTKDIpCisKKyAgICAgICAgaWYoYWxsX2luKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gYnIgKyBuZXh0X2Noa3B0c1trXVtpXS5yb3c7CisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSBiYyArIG5leHRfY2hrcHRzW2tdW2ldLmNvbDsKKyAgICAgICAgICAgICAgICB0aGlzX29mZnNldCA9IGJhc2Vfb2Zmc2V0ICsgKHRoaXNfbXYuYXNfbXYucm93ICogKGluX3doYXRfc3RyaWRlKSkgKyB0aGlzX212LmFzX212LmNvbDsKKyAgICAgICAgICAgICAgICB0aGlzc2FkID0gdmZwLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIHRoaXNfb2Zmc2V0LCBpbl93aGF0X3N0cmlkZSwgYmVzdHNhZCk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSCisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSBiciArIG5leHRfY2hrcHRzW2tdW2ldLnJvdzsKKyAgICAgICAgICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IGJjICsgbmV4dF9jaGtwdHNba11baV0uY29sOworICAgICAgICAgICAgICAgIENIRUNLX1BPSU5UCisgICAgICAgICAgICAgICAgdGhpc19vZmZzZXQgPSBiYXNlX29mZnNldCArICh0aGlzX212LmFzX212LnJvdyAqIChpbl93aGF0X3N0cmlkZSkpICsgdGhpc19tdi5hc19tdi5jb2w7CisgICAgICAgICAgICAgICAgdGhpc3NhZCA9IHZmcC0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCB0aGlzX29mZnNldCwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworICAgICAgICAgICAgICAgIENIRUNLX0JFVFRFUgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlc3Rfc2l0ZSA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyICs9IG5leHRfY2hrcHRzW2tdW2Jlc3Rfc2l0ZV0ucm93OworICAgICAgICAgICAgYmMgKz0gbmV4dF9jaGtwdHNba11bYmVzdF9zaXRlXS5jb2w7CisgICAgICAgICAgICBrICs9IDUgKyBiZXN0X3NpdGU7CisgICAgICAgICAgICBpZiAoayA+PSAxMikgayAtPSAxMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gNikgayAtPSA2OworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgNCAxLWF3YXkgbmVpZ2hib3JzICovCitjYWxfbmVpZ2hib3JzOgorICAgIGZvciAoaiA9IDA7IGogPCBkaWFfcmFuZ2U7IGorKykKKyAgICB7CisgICAgICAgIGJlc3Rfc2l0ZSA9IC0xOworICAgICAgICBDSEVDS19CT1VORFMoMSkKKworICAgICAgICBpZihhbGxfaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSBiciArIG5laWdoYm9yc1tpXS5yb3c7CisgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSBiYyArIG5laWdoYm9yc1tpXS5jb2w7CisgICAgICAgICAgICAgICAgdGhpc19vZmZzZXQgPSBiYXNlX29mZnNldCArICh0aGlzX212LmFzX212LnJvdyAqIChpbl93aGF0X3N0cmlkZSkpICsgdGhpc19tdi5hc19tdi5jb2w7CisgICAgICAgICAgICAgICAgdGhpc3NhZCA9IHZmcC0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCB0aGlzX29mZnNldCwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworICAgICAgICAgICAgICAgIENIRUNLX0JFVFRFUgorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gYnIgKyBuZWlnaGJvcnNbaV0ucm93OworICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gYmMgKyBuZWlnaGJvcnNbaV0uY29sOworICAgICAgICAgICAgICAgIENIRUNLX1BPSU5UCisgICAgICAgICAgICAgICAgdGhpc19vZmZzZXQgPSBiYXNlX29mZnNldCArICh0aGlzX212LmFzX212LnJvdyAqIChpbl93aGF0X3N0cmlkZSkpICsgdGhpc19tdi5hc19tdi5jb2w7CisgICAgICAgICAgICAgICAgdGhpc3NhZCA9IHZmcC0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCB0aGlzX29mZnNldCwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworICAgICAgICAgICAgICAgIENIRUNLX0JFVFRFUgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlc3Rfc2l0ZSA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyICs9IG5laWdoYm9yc1tiZXN0X3NpdGVdLnJvdzsKKyAgICAgICAgICAgIGJjICs9IG5laWdoYm9yc1tiZXN0X3NpdGVdLmNvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJlc3RfbXYtPmFzX212LnJvdyA9IGJyOworICAgIGJlc3RfbXYtPmFzX212LmNvbCA9IGJjOworCisgICAgcmV0dXJuIGJlc3RzYWQ7Cit9CisjdW5kZWYgQ0hFQ0tfQk9VTkRTCisjdW5kZWYgQ0hFQ0tfUE9JTlQKKyN1bmRlZiBDSEVDS19CRVRURVIKKworaW50IHZwOF9kaWFtb25kX3NlYXJjaF9zYWRfYworKAorICAgIE1BQ1JPQkxPQ0sgKngsCisgICAgQkxPQ0sgKmIsCisgICAgQkxPQ0tEICpkLAorICAgIGludF9tdiAqcmVmX212LAorICAgIGludF9tdiAqYmVzdF9tdiwKKyAgICBpbnQgc2VhcmNoX3BhcmFtLAorICAgIGludCBzYWRfcGVyX2JpdCwKKyAgICBpbnQgKm51bTAwLAorICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqZm5fcHRyLAorICAgIGludCAqbXZjb3N0WzJdLAorICAgIGludF9tdiAqY2VudGVyX212CispCit7CisgICAgaW50IGksIGosIHN0ZXA7CisKKyAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKKyAgICBpbnQgd2hhdF9zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmluX3doYXQ7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisgICAgaW50IGluX3doYXRfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpiZXN0X2FkZHJlc3M7CisKKyAgICBpbnQgdG90X3N0ZXBzOworICAgIGludF9tdiB0aGlzX212OworCisgICAgdW5zaWduZWQgaW50IGJlc3RzYWQ7CisgICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7CisgICAgaW50IGJlc3Rfc2l0ZSA9IDA7CisgICAgaW50IGxhc3Rfc2l0ZSA9IDA7CisKKyAgICBpbnQgcmVmX3JvdzsKKyAgICBpbnQgcmVmX2NvbDsKKyAgICBpbnQgdGhpc19yb3dfb2Zmc2V0OworICAgIGludCB0aGlzX2NvbF9vZmZzZXQ7CisgICAgc2VhcmNoX3NpdGUgKnNzOworCisgICAgdW5zaWduZWQgY2hhciAqY2hlY2tfaGVyZTsKKworICAgIGludCAqbXZzYWRjb3N0WzJdOworICAgIGludF9tdiBmY2VudGVyX212OworCisgICAgbXZzYWRjb3N0WzBdID0geC0+bXZzYWRjb3N0WzBdOworICAgIG12c2FkY29zdFsxXSA9IHgtPm12c2FkY29zdFsxXTsKKyAgICBmY2VudGVyX212LmFzX212LnJvdyA9IGNlbnRlcl9tdi0+YXNfbXYucm93ID4+IDM7CisgICAgZmNlbnRlcl9tdi5hc19tdi5jb2wgPSBjZW50ZXJfbXYtPmFzX212LmNvbCA+PiAzOworCisgICAgdnA4X2NsYW1wX212KHJlZl9tdiwgeC0+bXZfY29sX21pbiwgeC0+bXZfY29sX21heCwgeC0+bXZfcm93X21pbiwgeC0+bXZfcm93X21heCk7CisgICAgcmVmX3JvdyA9IHJlZl9tdi0+YXNfbXYucm93OworICAgIHJlZl9jb2wgPSByZWZfbXYtPmFzX212LmNvbDsKKyAgICAqbnVtMDAgPSAwOworICAgIGJlc3RfbXYtPmFzX212LnJvdyA9IHJlZl9yb3c7CisgICAgYmVzdF9tdi0+YXNfbXYuY29sID0gcmVmX2NvbDsKKworICAgIC8qIFdvcmsgb3V0IHRoZSBzdGFydCBwb2ludCBmb3IgdGhlIHNlYXJjaCAqLworICAgIGluX3doYXQgPSAodW5zaWduZWQgY2hhciAqKShiYXNlX3ByZSArIGQtPm9mZnNldCArIChyZWZfcm93ICogcHJlX3N0cmlkZSkgKyByZWZfY29sKTsKKyAgICBiZXN0X2FkZHJlc3MgPSBpbl93aGF0OworCisgICAgLyogQ2hlY2sgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uICovCisgICAgYmVzdHNhZCA9IGZuX3B0ci0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCBpbl93aGF0LCBpbl93aGF0X3N0cmlkZSwgVUlOVF9NQVgpCisgICAgICAgICAgICArIG12c2FkX2Vycl9jb3N0KGJlc3RfbXYsICZmY2VudGVyX212LCBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworICAgIC8qIHNlYXJjaF9wYXJhbSBkZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc3RlcCBhbmQgaGVuY2UKKyAgICAgKiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgMCA9IGluaXRpYWwgc3RlcCAoTUFYX0ZJUlNUX1NURVApIHBlbCA6CisgICAgICogMSA9IChNQVhfRklSU1RfU1RFUC8yKSBwZWwsIDIgPSAoTUFYX0ZJUlNUX1NURVAvNCkgcGVsLi4uIGV0Yy4KKyAgICAgKi8KKyAgICBzcyA9ICZ4LT5zc1tzZWFyY2hfcGFyYW0gKiB4LT5zZWFyY2hlc19wZXJfc3RlcF07CisgICAgdG90X3N0ZXBzID0gKHgtPnNzX2NvdW50IC8geC0+c2VhcmNoZXNfcGVyX3N0ZXApIC0gc2VhcmNoX3BhcmFtOworCisgICAgaSA9IDE7CisKKyAgICBmb3IgKHN0ZXAgPSAwOyBzdGVwIDwgdG90X3N0ZXBzIDsgc3RlcCsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCB4LT5zZWFyY2hlc19wZXJfc3RlcCA7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVHJhcCBpbGxlZ2FsIHZlY3RvcnMgKi8KKyAgICAgICAgICAgIHRoaXNfcm93X29mZnNldCA9IGJlc3RfbXYtPmFzX212LnJvdyArIHNzW2ldLm12LnJvdzsKKyAgICAgICAgICAgIHRoaXNfY29sX29mZnNldCA9IGJlc3RfbXYtPmFzX212LmNvbCArIHNzW2ldLm12LmNvbDsKKworICAgICAgICAgICAgaWYgKCh0aGlzX2NvbF9vZmZzZXQgPiB4LT5tdl9jb2xfbWluKSAmJiAodGhpc19jb2xfb2Zmc2V0IDwgeC0+bXZfY29sX21heCkgJiYKKyAgICAgICAgICAgICh0aGlzX3Jvd19vZmZzZXQgPiB4LT5tdl9yb3dfbWluKSAmJiAodGhpc19yb3dfb2Zmc2V0IDwgeC0+bXZfcm93X21heCkpCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGVja19oZXJlID0gc3NbaV0ub2Zmc2V0ICsgYmVzdF9hZGRyZXNzOworICAgICAgICAgICAgICAgIHRoaXNzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgY2hlY2tfaGVyZSwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSB0aGlzX3Jvd19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gdGhpc19jb2xfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB0aGlzc2FkICs9IG12c2FkX2Vycl9jb3N0KCZ0aGlzX212LCAmZmNlbnRlcl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zaXRlID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlc3Rfc2l0ZSAhPSBsYXN0X3NpdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LnJvdyArPSBzc1tiZXN0X3NpdGVdLm12LnJvdzsKKyAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LmNvbCArPSBzc1tiZXN0X3NpdGVdLm12LmNvbDsKKyAgICAgICAgICAgIGJlc3RfYWRkcmVzcyArPSBzc1tiZXN0X3NpdGVdLm9mZnNldDsKKyAgICAgICAgICAgIGxhc3Rfc2l0ZSA9IGJlc3Rfc2l0ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiZXN0X2FkZHJlc3MgPT0gaW5fd2hhdCkKKyAgICAgICAgICAgICgqbnVtMDApKys7CisgICAgfQorCisgICAgdGhpc19tdi5hc19tdi5yb3cgPSBiZXN0X212LT5hc19tdi5yb3cgPDwgMzsKKyAgICB0aGlzX212LmFzX212LmNvbCA9IGJlc3RfbXYtPmFzX212LmNvbCA8PCAzOworCisgICAgcmV0dXJuIGZuX3B0ci0+dmYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RfYWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICZ0aGlzc2FkKQorICAgICAgICAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgeC0+ZXJyb3JwZXJiaXQpOworfQorCitpbnQgdnA4X2RpYW1vbmRfc2VhcmNoX3NhZHg0CisoCisgICAgTUFDUk9CTE9DSyAqeCwKKyAgICBCTE9DSyAqYiwKKyAgICBCTE9DS0QgKmQsCisgICAgaW50X212ICpyZWZfbXYsCisgICAgaW50X212ICpiZXN0X212LAorICAgIGludCBzZWFyY2hfcGFyYW0sCisgICAgaW50IHNhZF9wZXJfYml0LAorICAgIGludCAqbnVtMDAsCisgICAgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICpmbl9wdHIsCisgICAgaW50ICptdmNvc3RbMl0sCisgICAgaW50X212ICpjZW50ZXJfbXYKKykKK3sKKyAgICBpbnQgaSwgaiwgc3RlcDsKKworICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOworICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqaW5fd2hhdDsKKyAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmVfbWJkLnByZS55X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpiYXNlX3ByZSA9IHgtPmVfbWJkLnByZS55X2J1ZmZlcjsKKyAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBwcmVfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmJlc3RfYWRkcmVzczsKKworICAgIGludCB0b3Rfc3RlcHM7CisgICAgaW50X212IHRoaXNfbXY7CisKKyAgICB1bnNpZ25lZCBpbnQgYmVzdHNhZDsKKyAgICB1bnNpZ25lZCBpbnQgdGhpc3NhZDsKKyAgICBpbnQgYmVzdF9zaXRlID0gMDsKKyAgICBpbnQgbGFzdF9zaXRlID0gMDsKKworICAgIGludCByZWZfcm93OworICAgIGludCByZWZfY29sOworICAgIGludCB0aGlzX3Jvd19vZmZzZXQ7CisgICAgaW50IHRoaXNfY29sX29mZnNldDsKKyAgICBzZWFyY2hfc2l0ZSAqc3M7CisKKyAgICB1bnNpZ25lZCBjaGFyICpjaGVja19oZXJlOworCisgICAgaW50ICptdnNhZGNvc3RbMl07CisgICAgaW50X212IGZjZW50ZXJfbXY7CisKKyAgICBtdnNhZGNvc3RbMF0gPSB4LT5tdnNhZGNvc3RbMF07CisgICAgbXZzYWRjb3N0WzFdID0geC0+bXZzYWRjb3N0WzFdOworICAgIGZjZW50ZXJfbXYuYXNfbXYucm93ID0gY2VudGVyX212LT5hc19tdi5yb3cgPj4gMzsKKyAgICBmY2VudGVyX212LmFzX212LmNvbCA9IGNlbnRlcl9tdi0+YXNfbXYuY29sID4+IDM7CisKKyAgICB2cDhfY2xhbXBfbXYocmVmX212LCB4LT5tdl9jb2xfbWluLCB4LT5tdl9jb2xfbWF4LCB4LT5tdl9yb3dfbWluLCB4LT5tdl9yb3dfbWF4KTsKKyAgICByZWZfcm93ID0gcmVmX212LT5hc19tdi5yb3c7CisgICAgcmVmX2NvbCA9IHJlZl9tdi0+YXNfbXYuY29sOworICAgICpudW0wMCA9IDA7CisgICAgYmVzdF9tdi0+YXNfbXYucm93ID0gcmVmX3JvdzsKKyAgICBiZXN0X212LT5hc19tdi5jb2wgPSByZWZfY29sOworCisgICAgLyogV29yayBvdXQgdGhlIHN0YXJ0IHBvaW50IGZvciB0aGUgc2VhcmNoICovCisgICAgaW5fd2hhdCA9ICh1bnNpZ25lZCBjaGFyICopKGJhc2VfcHJlICsgZC0+b2Zmc2V0ICsgKHJlZl9yb3cgKiBwcmVfc3RyaWRlKSArIHJlZl9jb2wpOworICAgIGJlc3RfYWRkcmVzcyA9IGluX3doYXQ7CisKKyAgICAvKiBDaGVjayB0aGUgc3RhcnRpbmcgcG9zaXRpb24gKi8KKyAgICBiZXN0c2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGluX3doYXQsIGluX3doYXRfc3RyaWRlLCBVSU5UX01BWCkKKyAgICAgICAgICAgICsgbXZzYWRfZXJyX2Nvc3QoYmVzdF9tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpOworCisgICAgLyogc2VhcmNoX3BhcmFtIGRldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzdGVwIGFuZCBoZW5jZSB0aGUKKyAgICAgKiBudW1iZXIgb2YgaXRlcmF0aW9ucyAwID0gaW5pdGlhbCBzdGVwIChNQVhfRklSU1RfU1RFUCkgcGVsIDogMSA9CisgICAgICogKE1BWF9GSVJTVF9TVEVQLzIpIHBlbCwgMiA9IChNQVhfRklSU1RfU1RFUC80KSBwZWwuLi4gZXRjLgorICAgICAqLworICAgIHNzID0gJngtPnNzW3NlYXJjaF9wYXJhbSAqIHgtPnNlYXJjaGVzX3Blcl9zdGVwXTsKKyAgICB0b3Rfc3RlcHMgPSAoeC0+c3NfY291bnQgLyB4LT5zZWFyY2hlc19wZXJfc3RlcCkgLSBzZWFyY2hfcGFyYW07CisKKyAgICBpID0gMTsKKworICAgIGZvciAoc3RlcCA9IDA7IHN0ZXAgPCB0b3Rfc3RlcHMgOyBzdGVwKyspCisgICAgeworICAgICAgICBpbnQgYWxsX2luID0gMSwgdDsKKworICAgICAgICAvKiBUbyBrbm93IGlmIGFsbCBuZWlnaGJvciBwb2ludHMgYXJlIHdpdGhpbiB0aGUgYm91bmRzLCA0IGJvdW5kcworICAgICAgICAgKiBjaGVja2luZyBhcmUgZW5vdWdoIGluc3RlYWQgb2YgY2hlY2tpbmcgNCBib3VuZHMgZm9yIGVhY2gKKyAgICAgICAgICogcG9pbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgYWxsX2luICY9ICgoYmVzdF9tdi0+YXNfbXYucm93ICsgc3NbaV0ubXYucm93KT4geC0+bXZfcm93X21pbik7CisgICAgICAgIGFsbF9pbiAmPSAoKGJlc3RfbXYtPmFzX212LnJvdyArIHNzW2krMV0ubXYucm93KSA8IHgtPm12X3Jvd19tYXgpOworICAgICAgICBhbGxfaW4gJj0gKChiZXN0X212LT5hc19tdi5jb2wgKyBzc1tpKzJdLm12LmNvbCkgPiB4LT5tdl9jb2xfbWluKTsKKyAgICAgICAgYWxsX2luICY9ICgoYmVzdF9tdi0+YXNfbXYuY29sICsgc3NbaSszXS5tdi5jb2wpIDwgeC0+bXZfY29sX21heCk7CisKKyAgICAgICAgaWYgKGFsbF9pbikKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhZF9hcnJheVs0XTsKKworICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCB4LT5zZWFyY2hlc19wZXJfc3RlcCA7IGogKz0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9ja19vZmZzZXRbNF07CisKKyAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgNDsgdCsrKQorICAgICAgICAgICAgICAgICAgICBibG9ja19vZmZzZXRbdF0gPSBzc1tpK3RdLm9mZnNldCArIGJlc3RfYWRkcmVzczsKKworICAgICAgICAgICAgICAgIGZuX3B0ci0+c2R4NGRmKHdoYXQsIHdoYXRfc3RyaWRlLCBibG9ja19vZmZzZXQsIGluX3doYXRfc3RyaWRlLCBzYWRfYXJyYXkpOworCisgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IDQ7IHQrKywgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZF9hcnJheVt0XSA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gYmVzdF9tdi0+YXNfbXYucm93ICsgc3NbaV0ubXYucm93OworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSBiZXN0X212LT5hc19tdi5jb2wgKyBzc1tpXS5tdi5jb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBzYWRfYXJyYXlbdF0gKz0gbXZzYWRfZXJyX2Nvc3QoJnRoaXNfbXYsICZmY2VudGVyX212LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2FkX2FycmF5W3RdIDwgYmVzdHNhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c2FkID0gc2FkX2FycmF5W3RdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2l0ZSA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IHgtPnNlYXJjaGVzX3Blcl9zdGVwIDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRyYXAgaWxsZWdhbCB2ZWN0b3JzICovCisgICAgICAgICAgICAgICAgdGhpc19yb3dfb2Zmc2V0ID0gYmVzdF9tdi0+YXNfbXYucm93ICsgc3NbaV0ubXYucm93OworICAgICAgICAgICAgICAgIHRoaXNfY29sX29mZnNldCA9IGJlc3RfbXYtPmFzX212LmNvbCArIHNzW2ldLm12LmNvbDsKKworICAgICAgICAgICAgICAgIGlmICgodGhpc19jb2xfb2Zmc2V0ID4geC0+bXZfY29sX21pbikgJiYgKHRoaXNfY29sX29mZnNldCA8IHgtPm12X2NvbF9tYXgpICYmCisgICAgICAgICAgICAgICAgKHRoaXNfcm93X29mZnNldCA+IHgtPm12X3Jvd19taW4pICYmICh0aGlzX3Jvd19vZmZzZXQgPCB4LT5tdl9yb3dfbWF4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlcmUgPSBzc1tpXS5vZmZzZXQgKyBiZXN0X2FkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgIHRoaXNzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgY2hlY2tfaGVyZSwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSB0aGlzX3Jvd19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IHRoaXNfY29sX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNzYWQgKz0gbXZzYWRfZXJyX2Nvc3QoJnRoaXNfbXYsICZmY2VudGVyX212LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2l0ZSA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlc3Rfc2l0ZSAhPSBsYXN0X3NpdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LnJvdyArPSBzc1tiZXN0X3NpdGVdLm12LnJvdzsKKyAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LmNvbCArPSBzc1tiZXN0X3NpdGVdLm12LmNvbDsKKyAgICAgICAgICAgIGJlc3RfYWRkcmVzcyArPSBzc1tiZXN0X3NpdGVdLm9mZnNldDsKKyAgICAgICAgICAgIGxhc3Rfc2l0ZSA9IGJlc3Rfc2l0ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiZXN0X2FkZHJlc3MgPT0gaW5fd2hhdCkKKyAgICAgICAgICAgICgqbnVtMDApKys7CisgICAgfQorCisgICAgdGhpc19tdi5hc19tdi5yb3cgPSBiZXN0X212LT5hc19tdi5yb3cgPDwgMzsKKyAgICB0aGlzX212LmFzX212LmNvbCA9IGJlc3RfbXYtPmFzX212LmNvbCA8PCAzOworCisgICAgcmV0dXJuIGZuX3B0ci0+dmYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RfYWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICZ0aGlzc2FkKQorICAgICAgICAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgeC0+ZXJyb3JwZXJiaXQpOworfQorCitpbnQgdnA4X2Z1bGxfc2VhcmNoX3NhZF9jKE1BQ1JPQkxPQ0sgKngsIEJMT0NLICpiLCBCTE9DS0QgKmQsIGludF9tdiAqcmVmX212LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhZF9wZXJfYml0LCBpbnQgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgaW50ICptdmNvc3RbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRfbXYgKmNlbnRlcl9tdikKK3sKKyAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKKyAgICBpbnQgd2hhdF9zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmluX3doYXQ7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisgICAgaW50IGluX3doYXRfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyAgICBpbnQgbXZfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpiZXN0YWRkcmVzczsKKyAgICBpbnRfbXYgKmJlc3RfbXYgPSAmZC0+Ym1pLm12OworICAgIGludF9tdiB0aGlzX212OworICAgIHVuc2lnbmVkIGludCBiZXN0c2FkOworICAgIHVuc2lnbmVkIGludCB0aGlzc2FkOworICAgIGludCByLCBjOworCisgICAgdW5zaWduZWQgY2hhciAqY2hlY2tfaGVyZTsKKworICAgIGludCByZWZfcm93ID0gcmVmX212LT5hc19tdi5yb3c7CisgICAgaW50IHJlZl9jb2wgPSByZWZfbXYtPmFzX212LmNvbDsKKworICAgIGludCByb3dfbWluID0gcmVmX3JvdyAtIGRpc3RhbmNlOworICAgIGludCByb3dfbWF4ID0gcmVmX3JvdyArIGRpc3RhbmNlOworICAgIGludCBjb2xfbWluID0gcmVmX2NvbCAtIGRpc3RhbmNlOworICAgIGludCBjb2xfbWF4ID0gcmVmX2NvbCArIGRpc3RhbmNlOworCisgICAgaW50ICptdnNhZGNvc3RbMl07CisgICAgaW50X212IGZjZW50ZXJfbXY7CisKKyAgICBtdnNhZGNvc3RbMF0gPSB4LT5tdnNhZGNvc3RbMF07CisgICAgbXZzYWRjb3N0WzFdID0geC0+bXZzYWRjb3N0WzFdOworICAgIGZjZW50ZXJfbXYuYXNfbXYucm93ID0gY2VudGVyX212LT5hc19tdi5yb3cgPj4gMzsKKyAgICBmY2VudGVyX212LmFzX212LmNvbCA9IGNlbnRlcl9tdi0+YXNfbXYuY29sID4+IDM7CisKKyAgICAvKiBXb3JrIG91dCB0aGUgbWlkIHBvaW50IGZvciB0aGUgc2VhcmNoICovCisgICAgaW5fd2hhdCA9IGJhc2VfcHJlICsgZC0+b2Zmc2V0OworICAgIGJlc3RhZGRyZXNzID0gaW5fd2hhdCArIChyZWZfcm93ICogcHJlX3N0cmlkZSkgKyByZWZfY29sOworCisgICAgYmVzdF9tdi0+YXNfbXYucm93ID0gcmVmX3JvdzsKKyAgICBiZXN0X212LT5hc19tdi5jb2wgPSByZWZfY29sOworCisgICAgLyogQmFzZWxpbmUgdmFsdWUgYXQgdGhlIGNlbnRyZSAqLworICAgIGJlc3RzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3doYXRfc3RyaWRlLCBVSU5UX01BWCkKKyAgICAgICAgICAgICsgbXZzYWRfZXJyX2Nvc3QoYmVzdF9tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpOworCisgICAgLyogQXBwbHkgZnVydGhlciBsaW1pdHMgdG8gcHJldmVudCB1cyBsb29raW5nIHVzaW5nIHZlY3RvcnMgdGhhdAorICAgICAqIHN0cmV0Y2ggYmV5aW9uZCB0aGUgVU1WIGJvcmRlcgorICAgICAqLworICAgIGlmIChjb2xfbWluIDwgeC0+bXZfY29sX21pbikKKyAgICAgICAgY29sX21pbiA9IHgtPm12X2NvbF9taW47CisKKyAgICBpZiAoY29sX21heCA+IHgtPm12X2NvbF9tYXgpCisgICAgICAgIGNvbF9tYXggPSB4LT5tdl9jb2xfbWF4OworCisgICAgaWYgKHJvd19taW4gPCB4LT5tdl9yb3dfbWluKQorICAgICAgICByb3dfbWluID0geC0+bXZfcm93X21pbjsKKworICAgIGlmIChyb3dfbWF4ID4geC0+bXZfcm93X21heCkKKyAgICAgICAgcm93X21heCA9IHgtPm12X3Jvd19tYXg7CisKKyAgICBmb3IgKHIgPSByb3dfbWluOyByIDwgcm93X21heCA7IHIrKykKKyAgICB7CisgICAgICAgIHRoaXNfbXYuYXNfbXYucm93ID0gcjsKKyAgICAgICAgY2hlY2tfaGVyZSA9IHIgKiBtdl9zdHJpZGUgKyBpbl93aGF0ICsgY29sX21pbjsKKworICAgICAgICBmb3IgKGMgPSBjb2xfbWluOyBjIDwgY29sX21heDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzc2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUsIGluX3doYXRfc3RyaWRlLCBiZXN0c2FkKTsKKworICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSBjOworICAgICAgICAgICAgdGhpc3NhZCArPSBtdnNhZF9lcnJfY29zdCgmdGhpc19tdiwgJmZjZW50ZXJfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpOworCisgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmVzdHNhZCA9IHRoaXNzYWQ7CisgICAgICAgICAgICAgICAgYmVzdF9tdi0+YXNfbXYucm93ID0gcjsKKyAgICAgICAgICAgICAgICBiZXN0X212LT5hc19tdi5jb2wgPSBjOworICAgICAgICAgICAgICAgIGJlc3RhZGRyZXNzID0gY2hlY2tfaGVyZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hlY2tfaGVyZSsrOworICAgICAgICB9CisgICAgfQorCisgICAgdGhpc19tdi5hc19tdi5yb3cgPSBiZXN0X212LT5hc19tdi5yb3cgPDwgMzsKKyAgICB0aGlzX212LmFzX212LmNvbCA9IGJlc3RfbXYtPmFzX212LmNvbCA8PCAzOworCisgICAgcmV0dXJuIGZuX3B0ci0+dmYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RhZGRyZXNzLCBpbl93aGF0X3N0cmlkZSwgJnRoaXNzYWQpCisgICAgICAgICAgICsgbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIGNlbnRlcl9tdiwgbXZjb3N0LCB4LT5lcnJvcnBlcmJpdCk7Cit9CisKK2ludCB2cDhfZnVsbF9zZWFyY2hfc2FkeDMoTUFDUk9CTE9DSyAqeCwgQkxPQ0sgKmIsIEJMT0NLRCAqZCwgaW50X212ICpyZWZfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYWRfcGVyX2JpdCwgaW50IGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgaW50ICptdmNvc3RbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9tdiAqY2VudGVyX212KQoreworICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOworICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqaW5fd2hhdDsKKyAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmVfbWJkLnByZS55X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpiYXNlX3ByZSA9IHgtPmVfbWJkLnByZS55X2J1ZmZlcjsKKyAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBwcmVfc3RyaWRlOworICAgIGludCBtdl9zdHJpZGUgPSBwcmVfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmJlc3RhZGRyZXNzOworICAgIGludF9tdiAqYmVzdF9tdiA9ICZkLT5ibWkubXY7CisgICAgaW50X212IHRoaXNfbXY7CisgICAgdW5zaWduZWQgaW50IGJlc3RzYWQ7CisgICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7CisgICAgaW50IHIsIGM7CisKKyAgICB1bnNpZ25lZCBjaGFyICpjaGVja19oZXJlOworCisgICAgaW50IHJlZl9yb3cgPSByZWZfbXYtPmFzX212LnJvdzsKKyAgICBpbnQgcmVmX2NvbCA9IHJlZl9tdi0+YXNfbXYuY29sOworCisgICAgaW50IHJvd19taW4gPSByZWZfcm93IC0gZGlzdGFuY2U7CisgICAgaW50IHJvd19tYXggPSByZWZfcm93ICsgZGlzdGFuY2U7CisgICAgaW50IGNvbF9taW4gPSByZWZfY29sIC0gZGlzdGFuY2U7CisgICAgaW50IGNvbF9tYXggPSByZWZfY29sICsgZGlzdGFuY2U7CisKKyAgICB1bnNpZ25lZCBpbnQgc2FkX2FycmF5WzNdOworCisgICAgaW50ICptdnNhZGNvc3RbMl07CisgICAgaW50X212IGZjZW50ZXJfbXY7CisKKyAgICBtdnNhZGNvc3RbMF0gPSB4LT5tdnNhZGNvc3RbMF07CisgICAgbXZzYWRjb3N0WzFdID0geC0+bXZzYWRjb3N0WzFdOworICAgIGZjZW50ZXJfbXYuYXNfbXYucm93ID0gY2VudGVyX212LT5hc19tdi5yb3cgPj4gMzsKKyAgICBmY2VudGVyX212LmFzX212LmNvbCA9IGNlbnRlcl9tdi0+YXNfbXYuY29sID4+IDM7CisKKyAgICAvKiBXb3JrIG91dCB0aGUgbWlkIHBvaW50IGZvciB0aGUgc2VhcmNoICovCisgICAgaW5fd2hhdCA9IGJhc2VfcHJlICsgZC0+b2Zmc2V0OworICAgIGJlc3RhZGRyZXNzID0gaW5fd2hhdCArIChyZWZfcm93ICogcHJlX3N0cmlkZSkgKyByZWZfY29sOworCisgICAgYmVzdF9tdi0+YXNfbXYucm93ID0gcmVmX3JvdzsKKyAgICBiZXN0X212LT5hc19tdi5jb2wgPSByZWZfY29sOworCisgICAgLyogQmFzZWxpbmUgdmFsdWUgYXQgdGhlIGNlbnRyZSAqLworICAgIGJlc3RzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3doYXRfc3RyaWRlLCBVSU5UX01BWCkKKyAgICAgICAgICAgICsgbXZzYWRfZXJyX2Nvc3QoYmVzdF9tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpOworCisgICAgLyogQXBwbHkgZnVydGhlciBsaW1pdHMgdG8gcHJldmVudCB1cyBsb29raW5nIHVzaW5nIHZlY3RvcnMgdGhhdCBzdHJldGNoCisgICAgICogYmV5b25kIHRoZSBVTVYgYm9yZGVyCisgICAgICovCisgICAgaWYgKGNvbF9taW4gPCB4LT5tdl9jb2xfbWluKQorICAgICAgICBjb2xfbWluID0geC0+bXZfY29sX21pbjsKKworICAgIGlmIChjb2xfbWF4ID4geC0+bXZfY29sX21heCkKKyAgICAgICAgY29sX21heCA9IHgtPm12X2NvbF9tYXg7CisKKyAgICBpZiAocm93X21pbiA8IHgtPm12X3Jvd19taW4pCisgICAgICAgIHJvd19taW4gPSB4LT5tdl9yb3dfbWluOworCisgICAgaWYgKHJvd19tYXggPiB4LT5tdl9yb3dfbWF4KQorICAgICAgICByb3dfbWF4ID0geC0+bXZfcm93X21heDsKKworICAgIGZvciAociA9IHJvd19taW47IHIgPCByb3dfbWF4IDsgcisrKQorICAgIHsKKyAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSByOworICAgICAgICBjaGVja19oZXJlID0gciAqIG12X3N0cmlkZSArIGluX3doYXQgKyBjb2xfbWluOworICAgICAgICBjID0gY29sX21pbjsKKworICAgICAgICB3aGlsZSAoKGMgKyAyKSA8IGNvbF9tYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmbl9wdHItPnNkeDNmKHdoYXQsIHdoYXRfc3RyaWRlLCBjaGVja19oZXJlLCBpbl93aGF0X3N0cmlkZSwgc2FkX2FycmF5KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzc2FkID0gc2FkX2FycmF5W2ldOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSBjOworICAgICAgICAgICAgICAgICAgICB0aGlzc2FkICs9IG12c2FkX2Vycl9jb3N0KCZ0aGlzX212LCAmZmNlbnRlcl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9tdi0+YXNfbXYucm93ID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LmNvbCA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcyA9IGNoZWNrX2hlcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGVja19oZXJlKys7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGMgPCBjb2xfbWF4KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzc2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUsIGluX3doYXRfc3RyaWRlLCBiZXN0c2FkKTsKKworICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gYzsKKyAgICAgICAgICAgICAgICB0aGlzc2FkICs9IG12c2FkX2Vycl9jb3N0KCZ0aGlzX212LCAmZmNlbnRlcl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12c2FkY29zdCwgc2FkX3Blcl9iaXQpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdHNhZCA9IHRoaXNzYWQ7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LnJvdyA9IHI7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LmNvbCA9IGM7CisgICAgICAgICAgICAgICAgICAgIGJlc3RhZGRyZXNzID0gY2hlY2tfaGVyZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoZWNrX2hlcmUgKys7CisgICAgICAgICAgICBjICsrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICB0aGlzX212LmFzX212LnJvdyA9IGJlc3RfbXYtPmFzX212LnJvdyA8PCAzOworICAgIHRoaXNfbXYuYXNfbXYuY29sID0gYmVzdF9tdi0+YXNfbXYuY29sIDw8IDM7CisKKyAgICByZXR1cm4gZm5fcHRyLT52Zih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdGFkZHJlc3MsIGluX3doYXRfc3RyaWRlLCAmdGhpc3NhZCkKKyAgICAgICAgICAgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgY2VudGVyX212LCBtdmNvc3QsIHgtPmVycm9ycGVyYml0KTsKK30KKworaW50IHZwOF9mdWxsX3NlYXJjaF9zYWR4OChNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBpbnRfbXYgKnJlZl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhZF9wZXJfYml0LCBpbnQgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqZm5fcHRyLCBpbnQgKm12Y29zdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X212ICpjZW50ZXJfbXYpCit7CisgICAgdW5zaWduZWQgY2hhciAqd2hhdCA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7CisgICAgaW50IHdoYXRfc3RyaWRlID0gYi0+c3JjX3N0cmlkZTsKKyAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmVfbWJkLnByZS55X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICpiYXNlX3ByZSA9IHgtPmVfbWJkLnByZS55X2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBjaGFyICppbl93aGF0OworICAgIGludCBpbl93aGF0X3N0cmlkZSA9IHByZV9zdHJpZGU7CisgICAgaW50IG12X3N0cmlkZSA9IHByZV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmVzdGFkZHJlc3M7CisgICAgaW50X212ICpiZXN0X212ID0gJmQtPmJtaS5tdjsKKyAgICBpbnRfbXYgdGhpc19tdjsKKyAgICB1bnNpZ25lZCBpbnQgYmVzdHNhZDsKKyAgICB1bnNpZ25lZCBpbnQgdGhpc3NhZDsKKyAgICBpbnQgciwgYzsKKworICAgIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2hlcmU7CisKKyAgICBpbnQgcmVmX3JvdyA9IHJlZl9tdi0+YXNfbXYucm93OworICAgIGludCByZWZfY29sID0gcmVmX212LT5hc19tdi5jb2w7CisKKyAgICBpbnQgcm93X21pbiA9IHJlZl9yb3cgLSBkaXN0YW5jZTsKKyAgICBpbnQgcm93X21heCA9IHJlZl9yb3cgKyBkaXN0YW5jZTsKKyAgICBpbnQgY29sX21pbiA9IHJlZl9jb2wgLSBkaXN0YW5jZTsKKyAgICBpbnQgY29sX21heCA9IHJlZl9jb2wgKyBkaXN0YW5jZTsKKworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIHNhZF9hcnJheTgsIDgpOworICAgIHVuc2lnbmVkIGludCBzYWRfYXJyYXlbM107CisKKyAgICBpbnQgKm12c2FkY29zdFsyXTsKKyAgICBpbnRfbXYgZmNlbnRlcl9tdjsKKworICAgIG12c2FkY29zdFswXSA9IHgtPm12c2FkY29zdFswXTsKKyAgICBtdnNhZGNvc3RbMV0gPSB4LT5tdnNhZGNvc3RbMV07CisgICAgZmNlbnRlcl9tdi5hc19tdi5yb3cgPSBjZW50ZXJfbXYtPmFzX212LnJvdyA+PiAzOworICAgIGZjZW50ZXJfbXYuYXNfbXYuY29sID0gY2VudGVyX212LT5hc19tdi5jb2wgPj4gMzsKKworICAgIC8qIFdvcmsgb3V0IHRoZSBtaWQgcG9pbnQgZm9yIHRoZSBzZWFyY2ggKi8KKyAgICBpbl93aGF0ID0gYmFzZV9wcmUgKyBkLT5vZmZzZXQ7CisgICAgYmVzdGFkZHJlc3MgPSBpbl93aGF0ICsgKHJlZl9yb3cgKiBwcmVfc3RyaWRlKSArIHJlZl9jb2w7CisKKyAgICBiZXN0X212LT5hc19tdi5yb3cgPSByZWZfcm93OworICAgIGJlc3RfbXYtPmFzX212LmNvbCA9IHJlZl9jb2w7CisKKyAgICAvKiBCYXNlbGluZSB2YWx1ZSBhdCB0aGUgY2VudHJlICovCisgICAgYmVzdHNhZCA9IGZuX3B0ci0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsIFVJTlRfTUFYKQorICAgICAgICAgICAgKyBtdnNhZF9lcnJfY29zdChiZXN0X212LCAmZmNlbnRlcl9tdiwgbXZzYWRjb3N0LCBzYWRfcGVyX2JpdCk7CisKKyAgICAvKiBBcHBseSBmdXJ0aGVyIGxpbWl0cyB0byBwcmV2ZW50IHVzIGxvb2tpbmcgdXNpbmcgdmVjdG9ycyB0aGF0IHN0cmV0Y2gKKyAgICAgKiBiZXlvbmQgdGhlIFVNViBib3JkZXIKKyAgICAgKi8KKyAgICBpZiAoY29sX21pbiA8IHgtPm12X2NvbF9taW4pCisgICAgICAgIGNvbF9taW4gPSB4LT5tdl9jb2xfbWluOworCisgICAgaWYgKGNvbF9tYXggPiB4LT5tdl9jb2xfbWF4KQorICAgICAgICBjb2xfbWF4ID0geC0+bXZfY29sX21heDsKKworICAgIGlmIChyb3dfbWluIDwgeC0+bXZfcm93X21pbikKKyAgICAgICAgcm93X21pbiA9IHgtPm12X3Jvd19taW47CisKKyAgICBpZiAocm93X21heCA+IHgtPm12X3Jvd19tYXgpCisgICAgICAgIHJvd19tYXggPSB4LT5tdl9yb3dfbWF4OworCisgICAgZm9yIChyID0gcm93X21pbjsgciA8IHJvd19tYXggOyByKyspCisgICAgeworICAgICAgICB0aGlzX212LmFzX212LnJvdyA9IHI7CisgICAgICAgIGNoZWNrX2hlcmUgPSByICogbXZfc3RyaWRlICsgaW5fd2hhdCArIGNvbF9taW47CisgICAgICAgIGMgPSBjb2xfbWluOworCisgICAgICAgIHdoaWxlICgoYyArIDcpIDwgY29sX21heCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZuX3B0ci0+c2R4OGYod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUsIGluX3doYXRfc3RyaWRlLCBzYWRfYXJyYXk4KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzc2FkID0gc2FkX2FycmF5OFtpXTsKKworICAgICAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gYzsKKyAgICAgICAgICAgICAgICAgICAgdGhpc3NhZCArPSBtdnNhZF9lcnJfY29zdCgmdGhpc19tdiwgJmZjZW50ZXJfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZzYWRjb3N0LCBzYWRfcGVyX2JpdCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c2FkID0gdGhpc3NhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LnJvdyA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X212LT5hc19tdi5jb2wgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdGFkZHJlc3MgPSBjaGVja19oZXJlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hlY2tfaGVyZSsrOworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgoYyArIDIpIDwgY29sX21heCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZuX3B0ci0+c2R4M2Yod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUgLCBpbl93aGF0X3N0cmlkZSwgc2FkX2FycmF5KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzc2FkID0gc2FkX2FycmF5W2ldOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSBjOworICAgICAgICAgICAgICAgICAgICB0aGlzc2FkICArPSBtdnNhZF9lcnJfY29zdCgmdGhpc19tdiwgJmZjZW50ZXJfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9tdi0+YXNfbXYucm93ID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmFzX212LmNvbCA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcyA9IGNoZWNrX2hlcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGVja19oZXJlKys7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGMgPCBjb2xfbWF4KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzc2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUgLCBpbl93aGF0X3N0cmlkZSwgYmVzdHNhZCk7CisKKyAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IGM7CisgICAgICAgICAgICAgICAgdGhpc3NhZCAgKz0gbXZzYWRfZXJyX2Nvc3QoJnRoaXNfbXYsICZmY2VudGVyX212LAorICAgICAgICAgICAgICAgICAgICBtdnNhZGNvc3QsIHNhZF9wZXJfYml0KTsKKworICAgICAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOworICAgICAgICAgICAgICAgICAgICBiZXN0X212LT5hc19tdi5yb3cgPSByOworICAgICAgICAgICAgICAgICAgICBiZXN0X212LT5hc19tdi5jb2wgPSBjOworICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcyA9IGNoZWNrX2hlcmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVja19oZXJlICsrOworICAgICAgICAgICAgYyArKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRoaXNfbXYuYXNfbXYucm93ID0gYmVzdF9tdi0+YXNfbXYucm93IDw8IDM7CisgICAgdGhpc19tdi5hc19tdi5jb2wgPSBiZXN0X212LT5hc19tdi5jb2wgPDwgMzsKKworICAgIHJldHVybiBmbl9wdHItPnZmKHdoYXQsIHdoYXRfc3RyaWRlLCBiZXN0YWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICZ0aGlzc2FkKQorICAgICAgICAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgeC0+ZXJyb3JwZXJiaXQpOworfQorCitpbnQgdnA4X3JlZmluaW5nX3NlYXJjaF9zYWRfYyhNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBpbnRfbXYgKnJlZl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcGVyX2JpdCwgaW50IHNlYXJjaF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgaW50ICptdmNvc3RbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X212ICpjZW50ZXJfbXYpCit7CisgICAgTVYgbmVpZ2hib3JzWzRdID0ge3stMSwgMH0sIHswLCAtMX0sIHswLCAxfSwgezEsIDB9fTsKKyAgICBpbnQgaSwgajsKKyAgICBzaG9ydCB0aGlzX3Jvd19vZmZzZXQsIHRoaXNfY29sX29mZnNldDsKKworICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisgICAgaW50IGluX3doYXRfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKKyAgICB1bnNpZ25lZCBjaGFyICpiZXN0X2FkZHJlc3MgPSAodW5zaWduZWQgY2hhciAqKShiYXNlX3ByZSArIGQtPm9mZnNldCArCisgICAgICAgIChyZWZfbXYtPmFzX212LnJvdyAqIHByZV9zdHJpZGUpICsgcmVmX212LT5hc19tdi5jb2wpOworICAgIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2hlcmU7CisgICAgaW50X212IHRoaXNfbXY7CisgICAgdW5zaWduZWQgaW50IGJlc3RzYWQ7CisgICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7CisKKyAgICBpbnQgKm12c2FkY29zdFsyXTsKKyAgICBpbnRfbXYgZmNlbnRlcl9tdjsKKworICAgIG12c2FkY29zdFswXSA9IHgtPm12c2FkY29zdFswXTsKKyAgICBtdnNhZGNvc3RbMV0gPSB4LT5tdnNhZGNvc3RbMV07CisgICAgZmNlbnRlcl9tdi5hc19tdi5yb3cgPSBjZW50ZXJfbXYtPmFzX212LnJvdyA+PiAzOworICAgIGZjZW50ZXJfbXYuYXNfbXYuY29sID0gY2VudGVyX212LT5hc19tdi5jb2wgPj4gMzsKKworICAgIGJlc3RzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdF9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl93aGF0X3N0cmlkZSwgVUlOVF9NQVgpCisgICAgICAgICAgICArIG12c2FkX2Vycl9jb3N0KHJlZl9tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBmb3IgKGk9MDsgaTxzZWFyY2hfcmFuZ2U7IGkrKykKKyAgICB7CisgICAgICAgIGludCBiZXN0X3NpdGUgPSAtMTsKKworICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDQgOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfcm93X29mZnNldCA9IHJlZl9tdi0+YXNfbXYucm93ICsgbmVpZ2hib3JzW2pdLnJvdzsKKyAgICAgICAgICAgIHRoaXNfY29sX29mZnNldCA9IHJlZl9tdi0+YXNfbXYuY29sICsgbmVpZ2hib3JzW2pdLmNvbDsKKworICAgICAgICAgICAgaWYgKCh0aGlzX2NvbF9vZmZzZXQgPiB4LT5tdl9jb2xfbWluKSAmJiAodGhpc19jb2xfb2Zmc2V0IDwgeC0+bXZfY29sX21heCkgJiYKKyAgICAgICAgICAgICh0aGlzX3Jvd19vZmZzZXQgPiB4LT5tdl9yb3dfbWluKSAmJiAodGhpc19yb3dfb2Zmc2V0IDwgeC0+bXZfcm93X21heCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hlY2tfaGVyZSA9IChuZWlnaGJvcnNbal0ucm93KSppbl93aGF0X3N0cmlkZSArIG5laWdoYm9yc1tqXS5jb2wgKyBiZXN0X2FkZHJlc3M7CisgICAgICAgICAgICAgICAgdGhpc3NhZCA9IGZuX3B0ci0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCBjaGVja19oZXJlICwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSB0aGlzX3Jvd19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYuYXNfbXYuY29sID0gdGhpc19jb2xfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB0aGlzc2FkICs9IG12c2FkX2Vycl9jb3N0KCZ0aGlzX212LCAmZmNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zaXRlID0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiZXN0X3NpdGUgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWZfbXYtPmFzX212LnJvdyArPSBuZWlnaGJvcnNbYmVzdF9zaXRlXS5yb3c7CisgICAgICAgICAgICByZWZfbXYtPmFzX212LmNvbCArPSBuZWlnaGJvcnNbYmVzdF9zaXRlXS5jb2w7CisgICAgICAgICAgICBiZXN0X2FkZHJlc3MgKz0gKG5laWdoYm9yc1tiZXN0X3NpdGVdLnJvdykqaW5fd2hhdF9zdHJpZGUgKyBuZWlnaGJvcnNbYmVzdF9zaXRlXS5jb2w7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzX212LmFzX212LnJvdyA9IHJlZl9tdi0+YXNfbXYucm93IDw8IDM7CisgICAgdGhpc19tdi5hc19tdi5jb2wgPSByZWZfbXYtPmFzX212LmNvbCA8PCAzOworCisgICAgcmV0dXJuIGZuX3B0ci0+dmYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RfYWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICZ0aGlzc2FkKQorICAgICAgICAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgeC0+ZXJyb3JwZXJiaXQpOworfQorCitpbnQgdnA4X3JlZmluaW5nX3NlYXJjaF9zYWR4NChNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X212ICpyZWZfbXYsIGludCBlcnJvcl9wZXJfYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlYXJjaF9yYW5nZSwgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICpmbl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm12Y29zdFsyXSwgaW50X212ICpjZW50ZXJfbXYpCit7CisgICAgTVYgbmVpZ2hib3JzWzRdID0ge3stMSwgMH0sIHswLCAtMX0sIHswLCAxfSwgezEsIDB9fTsKKyAgICBpbnQgaSwgajsKKyAgICBzaG9ydCB0aGlzX3Jvd19vZmZzZXQsIHRoaXNfY29sX29mZnNldDsKKworICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisgICAgaW50IGluX3doYXRfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKKyAgICB1bnNpZ25lZCBjaGFyICpiZXN0X2FkZHJlc3MgPSAodW5zaWduZWQgY2hhciAqKShiYXNlX3ByZSArIGQtPm9mZnNldCArCisgICAgICAgIChyZWZfbXYtPmFzX212LnJvdyAqIHByZV9zdHJpZGUpICsgcmVmX212LT5hc19tdi5jb2wpOworICAgIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2hlcmU7CisgICAgaW50X212IHRoaXNfbXY7CisgICAgdW5zaWduZWQgaW50IGJlc3RzYWQ7CisgICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7CisKKyAgICBpbnQgKm12c2FkY29zdFsyXTsKKyAgICBpbnRfbXYgZmNlbnRlcl9tdjsKKworICAgIG12c2FkY29zdFswXSA9IHgtPm12c2FkY29zdFswXTsKKyAgICBtdnNhZGNvc3RbMV0gPSB4LT5tdnNhZGNvc3RbMV07CisgICAgZmNlbnRlcl9tdi5hc19tdi5yb3cgPSBjZW50ZXJfbXYtPmFzX212LnJvdyA+PiAzOworICAgIGZjZW50ZXJfbXYuYXNfbXYuY29sID0gY2VudGVyX212LT5hc19tdi5jb2wgPj4gMzsKKworICAgIGJlc3RzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdF9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl93aGF0X3N0cmlkZSwgVUlOVF9NQVgpCisgICAgICAgICAgICArIG12c2FkX2Vycl9jb3N0KHJlZl9tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICBmb3IgKGk9MDsgaTxzZWFyY2hfcmFuZ2U7IGkrKykKKyAgICB7CisgICAgICAgIGludCBiZXN0X3NpdGUgPSAtMTsKKyAgICAgICAgaW50IGFsbF9pbiA9IDE7CisKKyAgICAgICAgYWxsX2luICY9ICgocmVmX212LT5hc19tdi5yb3cgLSAxKSA+IHgtPm12X3Jvd19taW4pOworICAgICAgICBhbGxfaW4gJj0gKChyZWZfbXYtPmFzX212LnJvdyArIDEpIDwgeC0+bXZfcm93X21heCk7CisgICAgICAgIGFsbF9pbiAmPSAoKHJlZl9tdi0+YXNfbXYuY29sIC0gMSkgPiB4LT5tdl9jb2xfbWluKTsKKyAgICAgICAgYWxsX2luICY9ICgocmVmX212LT5hc19tdi5jb2wgKyAxKSA8IHgtPm12X2NvbF9tYXgpOworCisgICAgICAgIGlmKGFsbF9pbikKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhZF9hcnJheVs0XTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2NrX29mZnNldFs0XTsKKyAgICAgICAgICAgIGJsb2NrX29mZnNldFswXSA9IGJlc3RfYWRkcmVzcyAtIGluX3doYXRfc3RyaWRlOworICAgICAgICAgICAgYmxvY2tfb2Zmc2V0WzFdID0gYmVzdF9hZGRyZXNzIC0gMTsKKyAgICAgICAgICAgIGJsb2NrX29mZnNldFsyXSA9IGJlc3RfYWRkcmVzcyArIDE7CisgICAgICAgICAgICBibG9ja19vZmZzZXRbM10gPSBiZXN0X2FkZHJlc3MgKyBpbl93aGF0X3N0cmlkZTsKKworICAgICAgICAgICAgZm5fcHRyLT5zZHg0ZGYod2hhdCwgd2hhdF9zdHJpZGUsIGJsb2NrX29mZnNldCwgaW5fd2hhdF9zdHJpZGUsIHNhZF9hcnJheSk7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNhZF9hcnJheVtqXSA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzX212LmFzX212LnJvdyA9IHJlZl9tdi0+YXNfbXYucm93ICsgbmVpZ2hib3JzW2pdLnJvdzsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5jb2wgPSByZWZfbXYtPmFzX212LmNvbCArIG5laWdoYm9yc1tqXS5jb2w7CisgICAgICAgICAgICAgICAgICAgIHNhZF9hcnJheVtqXSArPSBtdnNhZF9lcnJfY29zdCgmdGhpc19tdiwgJmZjZW50ZXJfbXYsIG12c2FkY29zdCwgZXJyb3JfcGVyX2JpdCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZF9hcnJheVtqXSA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSBzYWRfYXJyYXlbal07CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3NpdGUgPSBqOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCA0IDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfcm93X29mZnNldCA9IHJlZl9tdi0+YXNfbXYucm93ICsgbmVpZ2hib3JzW2pdLnJvdzsKKyAgICAgICAgICAgICAgICB0aGlzX2NvbF9vZmZzZXQgPSByZWZfbXYtPmFzX212LmNvbCArIG5laWdoYm9yc1tqXS5jb2w7CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXNfY29sX29mZnNldCA+IHgtPm12X2NvbF9taW4pICYmICh0aGlzX2NvbF9vZmZzZXQgPCB4LT5tdl9jb2xfbWF4KSAmJgorICAgICAgICAgICAgICAgICh0aGlzX3Jvd19vZmZzZXQgPiB4LT5tdl9yb3dfbWluKSAmJiAodGhpc19yb3dfb2Zmc2V0IDwgeC0+bXZfcm93X21heCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja19oZXJlID0gKG5laWdoYm9yc1tqXS5yb3cpKmluX3doYXRfc3RyaWRlICsgbmVpZ2hib3JzW2pdLmNvbCArIGJlc3RfYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgdGhpc3NhZCA9IGZuX3B0ci0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCBjaGVja19oZXJlICwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdi5yb3cgPSB0aGlzX3Jvd19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX212LmFzX212LmNvbCA9IHRoaXNfY29sX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNzYWQgKz0gbXZzYWRfZXJyX2Nvc3QoJnRoaXNfbXYsICZmY2VudGVyX212LCBtdnNhZGNvc3QsIGVycm9yX3Blcl9iaXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNhZCA9IHRoaXNzYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zaXRlID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiZXN0X3NpdGUgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWZfbXYtPmFzX212LnJvdyArPSBuZWlnaGJvcnNbYmVzdF9zaXRlXS5yb3c7CisgICAgICAgICAgICByZWZfbXYtPmFzX212LmNvbCArPSBuZWlnaGJvcnNbYmVzdF9zaXRlXS5jb2w7CisgICAgICAgICAgICBiZXN0X2FkZHJlc3MgKz0gKG5laWdoYm9yc1tiZXN0X3NpdGVdLnJvdykqaW5fd2hhdF9zdHJpZGUgKyBuZWlnaGJvcnNbYmVzdF9zaXRlXS5jb2w7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzX212LmFzX212LnJvdyA9IHJlZl9tdi0+YXNfbXYucm93IDw8IDM7CisgICAgdGhpc19tdi5hc19tdi5jb2wgPSByZWZfbXYtPmFzX212LmNvbCA8PCAzOworCisgICAgcmV0dXJuIGZuX3B0ci0+dmYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RfYWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICZ0aGlzc2FkKQorICAgICAgICAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgeC0+ZXJyb3JwZXJiaXQpOworfQorCisjaWZkZWYgRU5UUk9QWV9TVEFUUwordm9pZCBwcmludF9tb2RlX2NvbnRleHQodm9pZCkKK3sKKyAgICBGSUxFICpmID0gZm9wZW4oIm1vZGVjb250LmMiLCAidyIpOworICAgIGludCBpLCBqOworCisgICAgZnByaW50ZihmLCAiI2luY2x1ZGUgXCJlbnRyb3B5LmhcIlxuIik7CisgICAgZnByaW50ZihmLCAiY29uc3QgaW50IHZwOF9tb2RlX2NvbnRleHRzWzZdWzRdID1cbiIpOworICAgIGZwcmludGYoZiwgIntcbiIpOworCisgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykKKyAgICB7CisgICAgICAgIGZwcmludGYoZiwgIiAgeyAvKiAlZCAqL1xuIiwgaik7CisgICAgICAgIGZwcmludGYoZiwgIiAgICAiKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3ZlcmFsX3Byb2I7CisgICAgICAgICAgICBpbnQgdGhpc19wcm9iOworICAgICAgICAgICAgaW50IGNvdW50OworCisgICAgICAgICAgICAvKiBPdmVyYWxsIHByb2JzICovCisgICAgICAgICAgICBjb3VudCA9IG12X21vZGVfY3RzW2ldWzBdICsgbXZfbW9kZV9jdHNbaV1bMV07CisKKyAgICAgICAgICAgIGlmIChjb3VudCkKKyAgICAgICAgICAgICAgICBvdmVyYWxfcHJvYiA9IDI1NiAqIG12X21vZGVfY3RzW2ldWzBdIC8gY291bnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3ZlcmFsX3Byb2IgPSAxMjg7CisKKyAgICAgICAgICAgIGlmIChvdmVyYWxfcHJvYiA9PSAwKQorICAgICAgICAgICAgICAgIG92ZXJhbF9wcm9iID0gMTsKKworICAgICAgICAgICAgLyogY29udGV4dCBwcm9icyAqLworICAgICAgICAgICAgY291bnQgPSBtdl9yZWZfY3Rbal1baV1bMF0gKyBtdl9yZWZfY3Rbal1baV1bMV07CisKKyAgICAgICAgICAgIGlmIChjb3VudCkKKyAgICAgICAgICAgICAgICB0aGlzX3Byb2IgPSAyNTYgKiBtdl9yZWZfY3Rbal1baV1bMF0gLyBjb3VudDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aGlzX3Byb2IgPSAxMjg7CisKKyAgICAgICAgICAgIGlmICh0aGlzX3Byb2IgPT0gMCkKKyAgICAgICAgICAgICAgICB0aGlzX3Byb2IgPSAxOworCisgICAgICAgICAgICBmcHJpbnRmKGYsICIlNWQsICIsIHRoaXNfcHJvYik7CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKGYsICIgIH0sXG4iKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGYsICJ9O1xuIik7CisgICAgZmNsb3NlKGYpOworfQorCisvKiBNViByZWYgY291bnQgRU5UUk9QWV9TVEFUUyBzdGF0cyBjb2RlICovCisjaWZkZWYgRU5UUk9QWV9TVEFUUwordm9pZCBpbml0X212X3JlZl9jb3VudHMoKQoreworICAgIHZweF9tZW1zZXQobXZfcmVmX2N0LCAwLCBzaXplb2YobXZfcmVmX2N0KSk7CisgICAgdnB4X21lbXNldChtdl9tb2RlX2N0cywgMCwgc2l6ZW9mKG12X21vZGVfY3RzKSk7Cit9CisKK3ZvaWQgYWNjdW1fbXZfcmVmcyhNQl9QUkVESUNUSU9OX01PREUgbSwgY29uc3QgaW50IGN0WzRdKQoreworICAgIGlmIChtID09IFpFUk9NVikKKyAgICB7CisgICAgICAgICsrbXZfcmVmX2N0IFtjdFswXV0gWzBdIFswXTsKKyAgICAgICAgKyttdl9tb2RlX2N0c1swXVswXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKyttdl9yZWZfY3QgW2N0WzBdXSBbMF0gWzFdOworICAgICAgICArK212X21vZGVfY3RzWzBdWzFdOworCisgICAgICAgIGlmIChtID09IE5FQVJFU1RNVikKKyAgICAgICAgeworICAgICAgICAgICAgKyttdl9yZWZfY3QgW2N0WzFdXSBbMV0gWzBdOworICAgICAgICAgICAgKyttdl9tb2RlX2N0c1sxXVswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICsrbXZfcmVmX2N0IFtjdFsxXV0gWzFdIFsxXTsKKyAgICAgICAgICAgICsrbXZfbW9kZV9jdHNbMV1bMV07CisKKyAgICAgICAgICAgIGlmIChtID09IE5FQVJNVikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK212X3JlZl9jdCBbY3RbMl1dIFsyXSBbMF07CisgICAgICAgICAgICAgICAgKyttdl9tb2RlX2N0c1syXVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK212X3JlZl9jdCBbY3RbMl1dIFsyXSBbMV07CisgICAgICAgICAgICAgICAgKyttdl9tb2RlX2N0c1syXVsxXTsKKworICAgICAgICAgICAgICAgIGlmIChtID09IE5FV01WKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKyttdl9yZWZfY3QgW2N0WzNdXSBbM10gWzBdOworICAgICAgICAgICAgICAgICAgICArK212X21vZGVfY3RzWzNdWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK212X3JlZl9jdCBbY3RbM11dIFszXSBbMV07CisgICAgICAgICAgICAgICAgICAgICsrbXZfbW9kZV9jdHNbM11bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYvKiBFTkQgTVYgcmVmIGNvdW50IEVOVFJPUFlfU1RBVFMgc3RhdHMgY29kZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9tY29tcC5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL21jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwMTEzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9tY29tcC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19NQ09NUF9ICisjZGVmaW5lIF9fSU5DX01DT01QX0gKKworI2luY2x1ZGUgImJsb2NrLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi92YXJpYW5jZS5oIgorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworZXh0ZXJuIHZvaWQgaW5pdF9tdl9yZWZfY291bnRzKCk7CitleHRlcm4gdm9pZCBhY2N1bV9tdl9yZWZzKE1CX1BSRURJQ1RJT05fTU9ERSwgY29uc3QgaW50IG5lYXJfbXZfcmVmX2N0c1s0XSk7CisjZW5kaWYKKworCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgaW4gYSBzdGVwIHNlYXJjaCBnaXZlbiB0aGUgbGFyZ2VzdCBhbGxvd2VkCisgKiBpbml0aWFsIHN0ZXAKKyAqLworI2RlZmluZSBNQVhfTVZTRUFSQ0hfU1RFUFMgOAorCisvKiBNYXggZnVsbCBwZWwgbXYgc3BlY2lmaWVkIGluIDEgcGVsIHVuaXRzICovCisjZGVmaW5lIE1BWF9GVUxMX1BFTF9WQUwgKCgxIDw8IChNQVhfTVZTRUFSQ0hfU1RFUFMpKSAtIDEpCisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZmlyc3Qgc3RlcCBpbiBmdWxsIHBlbCB1bml0cyAqLworI2RlZmluZSBNQVhfRklSU1RfU1RFUCAoMSA8PCAoTUFYX01WU0VBUkNIX1NURVBTLTEpKQorCitleHRlcm4gdm9pZCBwcmludF9tb2RlX2NvbnRleHQodm9pZCk7CitleHRlcm4gaW50IHZwOF9tdl9iaXRfY29zdChpbnRfbXYgKm12LCBpbnRfbXYgKnJlZiwgaW50ICptdmNvc3RbMl0sIGludCBXZWlnaHQpOworZXh0ZXJuIHZvaWQgdnA4X2luaXRfZHNtb3Rpb25fY29tcGVuc2F0aW9uKE1BQ1JPQkxPQ0sgKngsIGludCBzdHJpZGUpOworZXh0ZXJuIHZvaWQgdnA4X2luaXQzc21vdGlvbl9jb21wZW5zYXRpb24oTUFDUk9CTE9DSyAqeCwgIGludCBzdHJpZGUpOworCisKK2V4dGVybiBpbnQgdnA4X2hleF9zZWFyY2gKKygKKyAgICBNQUNST0JMT0NLICp4LAorICAgIEJMT0NLICpiLAorICAgIEJMT0NLRCAqZCwKKyAgICBpbnRfbXYgKnJlZl9tdiwKKyAgICBpbnRfbXYgKmJlc3RfbXYsCisgICAgaW50IHNlYXJjaF9wYXJhbSwKKyAgICBpbnQgZXJyb3JfcGVyX2JpdCwKKyAgICBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmLAorICAgIGludCAqbXZzYWRjb3N0WzJdLAorICAgIGludCAqbXZjb3N0WzJdLAorICAgIGludF9tdiAqY2VudGVyX212CispOworCit0eXBlZGVmIGludCAoZnJhY3Rpb25hbF9tdl9zdGVwX2ZwKQorICAgIChNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBpbnRfbXYgKmJlc3RtdiwgaW50X212ICpyZWZfbXYsCisgICAgIGludCBlcnJvcl9wZXJfYml0LCBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmcCwgaW50ICptdmNvc3RbMl0sCisgICAgIGludCAqZGlzdG9ydGlvbiwgdW5zaWduZWQgaW50ICpzc2UpOworCitleHRlcm4gZnJhY3Rpb25hbF9tdl9zdGVwX2ZwIHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXBfaXRlcmF0aXZlbHk7CitleHRlcm4gZnJhY3Rpb25hbF9tdl9zdGVwX2ZwIHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXA7CitleHRlcm4gZnJhY3Rpb25hbF9tdl9zdGVwX2ZwIHZwOF9maW5kX2Jlc3RfaGFsZl9waXhlbF9zdGVwOworZXh0ZXJuIGZyYWN0aW9uYWxfbXZfc3RlcF9mcCB2cDhfc2tpcF9mcmFjdGlvbmFsX212X3N0ZXA7CisKK3R5cGVkZWYgaW50ICgqdnA4X2Z1bGxfc2VhcmNoX2ZuX3QpCisgICAgKAorICAgICBNQUNST0JMT0NLICp4LAorICAgICBCTE9DSyAqYiwKKyAgICAgQkxPQ0tEICpkLAorICAgICBpbnRfbXYgKnJlZl9tdiwKKyAgICAgaW50IHNhZF9wZXJfYml0LAorICAgICBpbnQgZGlzdGFuY2UsCisgICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqZm5fcHRyLAorICAgICBpbnQgKm12Y29zdFsyXSwKKyAgICAgaW50X212ICpjZW50ZXJfbXYKKyAgICApOworCit0eXBlZGVmIGludCAoKnZwOF9yZWZpbmluZ19zZWFyY2hfZm5fdCkKKyAgICAoCisgICAgIE1BQ1JPQkxPQ0sgKngsCisgICAgIEJMT0NLICpiLAorICAgICBCTE9DS0QgKmQsCisgICAgIGludF9tdiAqcmVmX212LAorICAgICBpbnQgc2FkX3Blcl9iaXQsCisgICAgIGludCBkaXN0YW5jZSwKKyAgICAgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICpmbl9wdHIsCisgICAgIGludCAqbXZjb3N0WzJdLAorICAgICBpbnRfbXYgKmNlbnRlcl9tdgorICAgICk7CisKK3R5cGVkZWYgaW50ICgqdnA4X2RpYW1vbmRfc2VhcmNoX2ZuX3QpCisgICAgKAorICAgICBNQUNST0JMT0NLICp4LAorICAgICBCTE9DSyAqYiwKKyAgICAgQkxPQ0tEICpkLAorICAgICBpbnRfbXYgKnJlZl9tdiwKKyAgICAgaW50X212ICpiZXN0X212LAorICAgICBpbnQgc2VhcmNoX3BhcmFtLAorICAgICBpbnQgc2FkX3Blcl9iaXQsCisgICAgIGludCAqbnVtMDAsCisgICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqZm5fcHRyLAorICAgICBpbnQgKm12Y29zdFsyXSwKKyAgICAgaW50X212ICpjZW50ZXJfbXYKKyAgICApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9tb2RlY29zdHMuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9tb2RlY29zdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE1NjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL21vZGVjb3N0cy5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKKyNpbmNsdWRlICJvbnl4X2ludC5oIgorI2luY2x1ZGUgInRyZWV3cml0ZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCisKKwordm9pZCB2cDhfaW5pdF9tb2RlX2Nvc3RzKFZQOF9DT01QICpjKQoreworICAgIFZQOF9DT01NT04gKnggPSAmYy0+Y29tbW9uOworICAgIHN0cnVjdCByZF9jb3N0c19zdHJ1Y3QgKnJkX2Nvc3RzID0gJmMtPnJkX2Nvc3RzOworCisgICAgeworICAgICAgICBjb25zdCB2cDhfdHJlZV9wIFQgPSB2cDhfYm1vZGVfdHJlZTsKKworICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGogPSAwOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZwOF9jb3N0X3Rva2VucyhyZF9jb3N0cy0+Ym1vZGVfY29zdHNbaV1bal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9rZl9ibW9kZV9wcm9iW2ldW2pdLCBUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK2ogPCBWUDhfQklOVFJBTU9ERVMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2kgPCBWUDhfQklOVFJBTU9ERVMpOworCisgICAgICAgIHZwOF9jb3N0X3Rva2VucyhyZF9jb3N0cy0+aW50ZXJfYm1vZGVfY29zdHMsIHgtPmZjLmJtb2RlX3Byb2IsIFQpOworICAgIH0KKyAgICB2cDhfY29zdF90b2tlbnMocmRfY29zdHMtPmludGVyX2Jtb2RlX2Nvc3RzLCB4LT5mYy5zdWJfbXZfcmVmX3Byb2IsCisgICAgICAgICAgICAgICAgICAgIHZwOF9zdWJfbXZfcmVmX3RyZWUpOworCisgICAgdnA4X2Nvc3RfdG9rZW5zKHJkX2Nvc3RzLT5tYm1vZGVfY29zdFsxXSwgeC0+ZmMueW1vZGVfcHJvYiwgdnA4X3ltb2RlX3RyZWUpOworICAgIHZwOF9jb3N0X3Rva2VucyhyZF9jb3N0cy0+bWJtb2RlX2Nvc3RbMF0sIHZwOF9rZl95bW9kZV9wcm9iLAorICAgICAgICAgICAgICAgICAgICB2cDhfa2ZfeW1vZGVfdHJlZSk7CisKKyAgICB2cDhfY29zdF90b2tlbnMocmRfY29zdHMtPmludHJhX3V2X21vZGVfY29zdFsxXSwgeC0+ZmMudXZfbW9kZV9wcm9iLAorICAgICAgICAgICAgICAgICAgICB2cDhfdXZfbW9kZV90cmVlKTsKKyAgICB2cDhfY29zdF90b2tlbnMocmRfY29zdHMtPmludHJhX3V2X21vZGVfY29zdFswXSwgdnA4X2tmX3V2X21vZGVfcHJvYiwKKyAgICAgICAgICAgICAgICAgICAgdnA4X3V2X21vZGVfdHJlZSk7Cit9CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9tb2RlY29zdHMuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9tb2RlY29zdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2VuY29kZXIvbW9kZWNvc3RzLmgKcmVuYW1lIHRvIGxpYnZweC92cDgvZW5jb2Rlci9tb2RlY29zdHMuaApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL21yX2Rpc3NpbS5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL21yX2Rpc3NpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjE4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvbXJfZGlzc2ltLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAibXJfZGlzc2ltLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAicmRvcHQuaCIKKwordm9pZCB2cDhfY2FsX2xvd19yZXNfbWJfY29scyhWUDhfQ09NUCAqY3BpKQoreworICAgIGludCBsb3dfcmVzX3c7CisKKyAgICAvKiBTdXBwb3J0IGFyYml0cmFyeSBkb3duLXNhbXBsaW5nIGZhY3RvciAqLworICAgIHVuc2lnbmVkIGludCBpdyA9IGNwaS0+b3hjZi5XaWR0aCpjcGktPm94Y2YubXJfZG93bl9zYW1wbGluZ19mYWN0b3IuZGVuCisgICAgICAgICAgICAgICAgICAgICAgKyBjcGktPm94Y2YubXJfZG93bl9zYW1wbGluZ19mYWN0b3IubnVtIC0gMTsKKworICAgIGxvd19yZXNfdyA9IGl3L2NwaS0+b3hjZi5tcl9kb3duX3NhbXBsaW5nX2ZhY3Rvci5udW07CisgICAgY3BpLT5tcl9sb3dfcmVzX21iX2NvbHMgPSAoKGxvd19yZXNfdyArIDE1KSA+PiA0KTsKK30KKworI2RlZmluZSBHRVRfTVYoeCkgICAgXAoraWYoeC0+bWJtaS5yZWZfZnJhbWUgIT1JTlRSQV9GUkFNRSkgICBcCit7ICAgXAorICAgIG12eFtjbnRdID0geC0+bWJtaS5tdi5hc19tdi5yb3c7ICBcCisgICAgbXZ5W2NudF0gPSB4LT5tYm1pLm12LmFzX212LmNvbDsgIFwKKyAgICBjbnQrKzsgICAgXAorfQorCisjZGVmaW5lIEdFVF9NVl9TSUdOKHgpICAgIFwKK2lmKHgtPm1ibWkucmVmX2ZyYW1lICE9SU5UUkFfRlJBTUUpICAgXAoreyAgIFwKKyAgICBtdnhbY250XSA9IHgtPm1ibWkubXYuYXNfbXYucm93OyAgXAorICAgIG12eVtjbnRdID0geC0+bWJtaS5tdi5hc19tdi5jb2w7ICBcCisgICAgaWYgKGNtLT5yZWZfZnJhbWVfc2lnbl9iaWFzW3gtPm1ibWkucmVmX2ZyYW1lXSAgXAorICAgICAgICAhPSBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1t0bXAtPm1ibWkucmVmX2ZyYW1lXSkgIFwKKyAgICB7ICBcCisgICAgICAgIG12eFtjbnRdICo9IC0xOyAgIFwKKyAgICAgICAgbXZ5W2NudF0gKj0gLTE7ICAgXAorICAgIH0gIFwKKyAgICBjbnQrKzsgIFwKK30KKwordm9pZCB2cDhfY2FsX2Rpc3NpbWlsYXJpdHkoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKyAgICBpbnQgaTsKKworICAgIC8qIE5vdGU6IFRoZSBmaXJzdCByb3cgJiBmaXJzdCBjb2x1bW4gaW4gbWlwIGFyZSBvdXRzaWRlIHRoZSBmcmFtZSwgd2hpY2gKKyAgICAgKiB3ZXJlIGluaXRpYWxpemVkIHRvIGFsbCAwLihyZWZfZnJhbWUsIG1vZGUsIG12Li4uKQorICAgICAqIFRoZWlyIHJlZl9mcmFtZSA9IDAgbWVhbnMgdGhleSB3b24ndCBiZSBjb3VudGVkIGluIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBjYWxjdWxhdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoY3BpLT5veGNmLm1yX3RvdGFsX3Jlc29sdXRpb25zID4xCisgICAgICAgICYmIGNwaS0+b3hjZi5tcl9lbmNvZGVyX2lkIDwgKGNwaS0+b3hjZi5tcl90b3RhbF9yZXNvbHV0aW9ucyAtIDEpKQorICAgIHsKKyAgICAgICAgLyogU3RvcmUgaW5mbyBmb3Igc2hvdy9uby1zaG93IGZyYW1lcyBmb3Igc3VwcG9ydGluZyBhbHRfcmVmLgorICAgICAgICAgKiBJZiBwYXJlbnQgZnJhbWUgaXMgYWx0X3JlZiwgY2hpbGQgaGFzIG9uZSB0b28uCisgICAgICAgICAqLworICAgICAgICBMT1dFUl9SRVNfRlJBTUVfSU5GTyogc3RvcmVfaW5mbworICAgICAgICAgICAgICAgICAgICAgID0gKExPV0VSX1JFU19GUkFNRV9JTkZPKiljcGktPm94Y2YubXJfbG93X3Jlc19tb2RlX2luZm87CisKKyAgICAgICAgc3RvcmVfaW5mby0+ZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOworCisgICAgICAgIGlmKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmVfaW5mby0+aXNfZnJhbWVfZHJvcHBlZCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX1JFRl9GUkFNRVM7IGkrKykKKyAgICAgICAgICAgICAgICBzdG9yZV9pbmZvLT5sb3dfcmVzX3JlZl9mcmFtZXNbaV0gPSBjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1iX3JvdzsKKyAgICAgICAgICAgIGludCBtYl9jb2w7CisgICAgICAgICAgICAvKiBQb2ludCB0byBiZWdpbm5pbmcgb2YgYWxsb2NhdGVkIE1PREVfSU5GTyBhcnJheXMuICovCisgICAgICAgICAgICBNT0RFX0lORk8gKnRtcCA9IGNtLT5taXAgKyBjbS0+bW9kZV9pbmZvX3N0cmlkZTsKKyAgICAgICAgICAgIExPV0VSX1JFU19NQl9JTkZPKiBzdG9yZV9tb2RlX2luZm8gPSBzdG9yZV9pbmZvLT5tYl9pbmZvOworCisgICAgICAgICAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3cgKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sICsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpc3NpbSA9IElOVF9NQVg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYodG1wLT5tYm1pLnJlZl9mcmFtZSAhPUlOVFJBX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG12eFs4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbXZ5WzhdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBtbXZ4OworICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBtbXZ5OworICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBjbnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1PREVfSU5GTyAqaGVyZSA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1PREVfSU5GTyAqYWJvdmUgPSBoZXJlIC0gY20tPm1vZGVfaW5mb19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNT0RFX0lORk8gKmxlZnQgPSBoZXJlIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1PREVfSU5GTyAqYWJvdmVsZWZ0ID0gYWJvdmUgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTU9ERV9JTkZPICphYm92ZXJpZ2h0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1PREVfSU5GTyAqcmlnaHQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTU9ERV9JTkZPICpiZWxvd2xlZnQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTU9ERV9JTkZPICpiZWxvdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNT0RFX0lORk8gKmJlbG93cmlnaHQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIGlzIHVzZWQsIHdlIGhhdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoZWNrIHNpZ24gb2YgTVYuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZihjcGktPm94Y2YucGxheV9hbHRlcm5hdGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2F0aGVyIG12IG9mIG5laWdoYm9yaW5nIE1CcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NVl9TSUdOKGFib3ZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NVl9TSUdOKGxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WX1NJR04oYWJvdmVsZWZ0KQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWJfY29sIDwgKGNtLT5tYl9jb2xzLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBoZXJlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmVyaWdodCA9IGFib3ZlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WX1NJR04ocmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NVl9TSUdOKGFib3ZlcmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWJfcm93IDwgKGNtLT5tYl9yb3dzLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgPSBoZXJlICsgY20tPm1vZGVfaW5mb19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93bGVmdCA9IGJlbG93IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WX1NJR04oYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NVl9TSUdOKGJlbG93bGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtYl9jb2wgPCAoY20tPm1iX2NvbHMtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWJfcm93IDwgKGNtLT5tYl9yb3dzLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3dyaWdodCA9IGJlbG93ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WX1NJR04oYmVsb3dyaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGFsdF9yZWYgYW5kIGdhdGhlciBtdiBvZiBuZWlnaGJvcmluZyBNQnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTVYoYWJvdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WKGxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WKGFib3ZlbGVmdCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1iX2NvbCA8IChjbS0+bWJfY29scy0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gaGVyZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlcmlnaHQgPSBhYm92ZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NVihyaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WKGFib3ZlcmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWJfcm93IDwgKGNtLT5tYl9yb3dzLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgPSBoZXJlICsgY20tPm1vZGVfaW5mb19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93bGVmdCA9IGJlbG93IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01WKGJlbG93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTVYoYmVsb3dsZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1iX2NvbCA8IChjbS0+bWJfY29scy0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYl9yb3cgPCAoY20tPm1iX3Jvd3MtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvd3JpZ2h0ID0gYmVsb3cgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTVYoYmVsb3dyaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbXZ4ID0gbXZ4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fbXZ4ID0gbXZ4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbXZ5ID0gbXZ5WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fbXZ5ID0gbXZ5WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNudCA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTwgY250OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdnhbaV0gPiBtYXhfbXZ4KSBtYXhfbXZ4ID0gbXZ4W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobXZ4W2ldIDwgbWluX212eCkgbWluX212eCA9IG12eFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdnlbaV0gPiBtYXhfbXZ5KSBtYXhfbXZ5ID0gbXZ5W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobXZ5W2ldIDwgbWluX212eSkgbWluX212eSA9IG12eVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tdnggPSBNQVgoYWJzKG1pbl9tdnggLSBoZXJlLT5tYm1pLm12LmFzX212LnJvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobWF4X212eCAtIGhlcmUtPm1ibWkubXYuYXNfbXYucm93KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW12eSA9IE1BWChhYnMobWluX212eSAtIGhlcmUtPm1ibWkubXYuYXNfbXYuY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhtYXhfbXZ5IC0gaGVyZS0+bWJtaS5tdi5hc19tdi5jb2wpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNzaW0gPSBNQVgobW12eCwgbW12eSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSBtb2RlIGluZm8gZm9yIG5leHQgcmVzb2x1dGlvbiBlbmNvZGluZyAqLworICAgICAgICAgICAgICAgICAgICBzdG9yZV9tb2RlX2luZm8tPm1vZGUgPSB0bXAtPm1ibWkubW9kZTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfbW9kZV9pbmZvLT5yZWZfZnJhbWUgPSB0bXAtPm1ibWkucmVmX2ZyYW1lOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9tb2RlX2luZm8tPm12LmFzX2ludCA9IHRtcC0+bWJtaS5tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX21vZGVfaW5mby0+ZGlzc2ltID0gZGlzc2ltOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfbW9kZV9pbmZvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhpcyBmcmFtZSBpcyBkcm9wcGVkIGF0IGN1cnJlbnQKKyAgIHJlc29sdXRpb24gbGV2ZWwuICovCit2b2lkIHZwOF9zdG9yZV9kcm9wX2ZyYW1lX2luZm8oVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvKiBJZiB0aGUgZnJhbWUgaXMgZHJvcHBlZCBpbiBsb3dlci1yZXNvbHV0aW9uIGVuY29kaW5nLCB0aGlzIGluZm9ybWF0aW9uCisgICAgICAgaXMgcGFzc2VkIHRvIGhpZ2hlciByZXNvbHV0aW9uIGxldmVsIHNvIHRoYXQgdGhlIGVuY29kZXIga25vd3MgdGhlcmUKKyAgICAgICBpcyBubyBtb2RlICYgbW90aW9uIGluZm8gYXZhaWxhYmxlLgorICAgICAqLworICAgIGlmIChjcGktPm94Y2YubXJfdG90YWxfcmVzb2x1dGlvbnMgPjEKKyAgICAgICAgJiYgY3BpLT5veGNmLm1yX2VuY29kZXJfaWQgPCAoY3BpLT5veGNmLm1yX3RvdGFsX3Jlc29sdXRpb25zIC0gMSkpCisgICAgeworICAgICAgICAvKiBTdG9yZSBpbmZvIGZvciBzaG93L25vLXNob3cgZnJhbWVzIGZvciBzdXBwb3J0aW5nIGFsdF9yZWYuCisgICAgICAgICAqIElmIHBhcmVudCBmcmFtZSBpcyBhbHRfcmVmLCBjaGlsZCBoYXMgb25lIHRvby4KKyAgICAgICAgICovCisgICAgICAgIExPV0VSX1JFU19GUkFNRV9JTkZPKiBzdG9yZV9pbmZvCisgICAgICAgICAgICAgICAgICAgICAgPSAoTE9XRVJfUkVTX0ZSQU1FX0lORk8qKWNwaS0+b3hjZi5tcl9sb3dfcmVzX21vZGVfaW5mbzsKKworICAgICAgICAvKiBTZXQgZnJhbWVfdHlwZSB0byBiZSBJTlRFUl9GUkFNRSBzaW5jZSB3ZSB3b24ndCBkcm9wIGtleSBmcmFtZS4gKi8KKyAgICAgICAgc3RvcmVfaW5mby0+ZnJhbWVfdHlwZSA9IElOVEVSX0ZSQU1FOworICAgICAgICBzdG9yZV9pbmZvLT5pc19mcmFtZV9kcm9wcGVkID0gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvbXJfZGlzc2ltLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvbXJfZGlzc2ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjYjEzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9tcl9kaXNzaW0uaApAQCAtMCwwICsxLDIwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19NUl9ESVNTSU1fSAorI2RlZmluZSBfX0lOQ19NUl9ESVNTSU1fSAorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKworZXh0ZXJuIHZvaWQgdnA4X2NhbF9sb3dfcmVzX21iX2NvbHMoVlA4X0NPTVAgKmNwaSk7CitleHRlcm4gdm9pZCB2cDhfY2FsX2Rpc3NpbWlsYXJpdHkoVlA4X0NPTVAgKmNwaSk7CitleHRlcm4gdm9pZCB2cDhfc3RvcmVfZHJvcF9mcmFtZV9pbmZvKFZQOF9DT01QICpjcGkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9vbnl4X2lmLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvb255eF9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDgxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvb255eF9pZi5jCkBAIC0wLDAgKzEsNTU2OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vYWxsb2Njb21tb24uaCIKKyNpbmNsdWRlICJtY29tcC5oIgorI2luY2x1ZGUgImZpcnN0cGFzcy5oIgorI2luY2x1ZGUgInBzbnIuaCIKKyNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2V4dGVuZC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9xdWFudF9jb21tb24uaCIKKyNpbmNsdWRlICJzZWdtZW50YXRpb24uaCIKKyNpZiBDT05GSUdfUE9TVFBST0MKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3Bvc3Rwcm9jLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvdnB4X3RpbWVyLmgiCisjaWYgQVJDSF9BUk0KKyNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCisjZW5kaWYKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisjaW5jbHVkZSAibXJfZGlzc2ltLmgiCisjZW5kaWYKKyNpbmNsdWRlICJlbmNvZGVmcmFtZS5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCitleHRlcm4gaW50IHZwOF91cGRhdGVfY29lZl9jb250ZXh0KFZQOF9DT01QICpjcGkpOworZXh0ZXJuIHZvaWQgdnA4X3VwZGF0ZV9jb2VmX3Byb2JzKFZQOF9DT01QICpjcGkpOworI2VuZGlmCisKK2V4dGVybiB2b2lkIHZwOGN4X3BpY2tfZmlsdGVyX2xldmVsX2Zhc3QoWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgVlA4X0NPTVAgKmNwaSk7CitleHRlcm4gdm9pZCB2cDhjeF9zZXRfYWx0X2xmX2xldmVsKFZQOF9DT01QICpjcGksIGludCBmaWx0X3ZhbCk7CitleHRlcm4gdm9pZCB2cDhjeF9waWNrX2ZpbHRlcl9sZXZlbChZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBWUDhfQ09NUCAqY3BpKTsKKworZXh0ZXJuIHZvaWQgdnA4X2RlYmxvY2tfZnJhbWUoWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsIFlWMTJfQlVGRkVSX0NPTkZJRyAqcG9zdCwgaW50IGZpbHRfbHZsLCBpbnQgbG93X3Zhcl90aHJlc2gsIGludCBmbGFnKTsKK2V4dGVybiB2b2lkIHByaW50X3Bhcm1zKFZQOF9DT05GSUcgKm9jZiwgY2hhciAqZmlsZW5hbSk7CitleHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXRfcHJvY2Vzc29yX2ZyZXEoKTsKK2V4dGVybiB2b2lkIHByaW50X3RyZWVfdXBkYXRlX3Byb2JzKCk7CitleHRlcm4gaW50IHZwOGN4X2NyZWF0ZV9lbmNvZGVyX3RocmVhZHMoVlA4X0NPTVAgKmNwaSk7CitleHRlcm4gdm9pZCB2cDhjeF9yZW1vdmVfZW5jb2Rlcl90aHJlYWRzKFZQOF9DT01QICpjcGkpOworCitpbnQgdnA4X2VzdGltYXRlX2VudHJvcHlfc2F2aW5ncyhWUDhfQ09NUCAqY3BpKTsKKworaW50IHZwOF9jYWxjX3NzX2VycihZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0KTsKKworZXh0ZXJuIHZvaWQgdnA4X3RlbXBvcmFsX2ZpbHRlcl9wcmVwYXJlX2MoVlA4X0NPTVAgKmNwaSwgaW50IGRpc3RhbmNlKTsKKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfbGZfZGVsdGFzKFZQOF9DT01QICpjcGkpOworCitleHRlcm4gY29uc3QgaW50IHZwOF9nZl9pbnRlcnZhbF90YWJsZVsxMDFdOworCisjaWYgQ09ORklHX0lOVEVSTkFMX1NUQVRTCisjaW5jbHVkZSAibWF0aC5oIgorCitleHRlcm4gZG91YmxlIHZwOF9jYWxjX3NzaW0KKygKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsCisgICAgaW50IGx1bWFtYXNrLAorICAgIGRvdWJsZSAqd2VpZ2h0CispOworCisKK2V4dGVybiBkb3VibGUgdnA4X2NhbGNfc3NpbWcKKygKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsCisgICAgZG91YmxlICpzc2ltX3ksCisgICAgZG91YmxlICpzc2ltX3UsCisgICAgZG91YmxlICpzc2ltX3YKKyk7CisKKworI2VuZGlmCisKKworI2lmZGVmIE9VVFBVVF9ZVVZfU1JDCitGSUxFICp5dXZfZmlsZTsKKyNlbmRpZgorCisjaWYgMAorRklMRSAqZnJhbWVwc25yOworRklMRSAqa2ZfbGlzdDsKK0ZJTEUgKmtleWZpbGU7CisjZW5kaWYKKworI2lmIDAKK2V4dGVybiBpbnQgc2tpcF90cnVlX2NvdW50OworZXh0ZXJuIGludCBza2lwX2ZhbHNlX2NvdW50OworI2VuZGlmCisKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKK2V4dGVybiBpbnQgaW50cmFfbW9kZV9zdGF0c1sxMF1bMTBdWzEwXTsKKyNlbmRpZgorCisjaWZkZWYgU1BFRURTVEFUUwordW5zaWduZWQgaW50IGZyYW1lc19hdF9zcGVlZFsxNl0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Cit1bnNpZ25lZCBpbnQgdG90X3BtID0gMDsKK3Vuc2lnbmVkIGludCBjbnRfcG0gPSAwOwordW5zaWduZWQgaW50IHRvdF9lZiA9IDA7Cit1bnNpZ25lZCBpbnQgY250X2VmID0gMDsKKyNlbmRpZgorCisjaWZkZWYgTU9ERV9TVEFUUworZXh0ZXJuIHVuc2lnbmVkIF9faW50NjQgU2VjdGlvbmJpdHNbNTBdOworZXh0ZXJuIGludCB5X21vZGVzWzVdICA7CitleHRlcm4gaW50IHV2X21vZGVzWzRdIDsKK2V4dGVybiBpbnQgYl9tb2Rlc1sxMF0gIDsKKworZXh0ZXJuIGludCBpbnRlcl95X21vZGVzWzEwXSA7CitleHRlcm4gaW50IGludGVyX3V2X21vZGVzWzRdIDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaW50ZXJfYl9tb2Rlc1sxNV07CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IGludCB2cDhfYml0c19wZXJfbWJbMl1bUUlOREVYX1JBTkdFXTsKKworZXh0ZXJuIGNvbnN0IGludCBxcm91bmRpbmdfZmFjdG9yc1sxMjldOworZXh0ZXJuIGNvbnN0IGludCBxemJpbl9mYWN0b3JzWzEyOV07CitleHRlcm4gdm9pZCB2cDhjeF9pbml0X3F1YW50aXplcihWUDhfQ09NUCAqY3BpKTsKK2V4dGVybiBjb25zdCBpbnQgdnA4Y3hfYmFzZV9za2lwX2ZhbHNlX3Byb2JbMTI4XTsKKworLyogVGFibGVzIHJlbGF0aW5nIGFjdGl2ZSBtYXggUSB0byBhY3RpdmUgbWluIFEgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtmX2xvd19tb3Rpb25fbWlucVtRSU5ERVhfUkFOR0VdID0KK3sKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwyLDIsMiwyLAorICAgIDMsMywzLDMsMywzLDQsNCw0LDUsNSw1LDUsNSw2LDYsCisgICAgNiw2LDcsNyw4LDgsOCw4LDksOSwxMCwxMCwxMCwxMCwxMSwxMSwKKyAgICAxMSwxMSwxMiwxMiwxMywxMywxMywxMywxNCwxNCwxNSwxNSwxNSwxNSwxNiwxNiwKKyAgICAxNiwxNiwxNywxNywxOCwxOCwxOCwxOCwxOSwyMCwyMCwyMSwyMSwyMiwyMywyMworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtmX2hpZ2hfbW90aW9uX21pbnFbUUlOREVYX1JBTkdFXSA9Cit7CisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDEsMSwxLDEsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsCisgICAgMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsNSw1LDYsNiwKKyAgICA2LDYsNyw3LDgsOCw4LDgsOSw5LDEwLDEwLDEwLDEwLDExLDExLAorICAgIDExLDExLDEyLDEyLDEzLDEzLDEzLDEzLDE0LDE0LDE1LDE1LDE1LDE1LDE2LDE2LAorICAgIDE2LDE2LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLAorICAgIDIxLDIxLDIyLDIyLDIzLDIzLDI0LDI1LDI1LDI2LDI2LDI3LDI4LDI4LDI5LDMwCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ2ZfbG93X21vdGlvbl9taW5xW1FJTkRFWF9SQU5HRV0gPQoreworICAgIDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDIsMiwyLDIsCisgICAgMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsNiw2LDYsNiwKKyAgICA3LDcsNyw3LDgsOCw4LDgsOSw5LDksOSwxMCwxMCwxMCwxMCwKKyAgICAxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOCwKKyAgICAxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwKKyAgICAyNywyNywyOCwyOCwyOSwyOSwzMCwzMCwzMSwzMSwzMiwzMiwzMywzMywzNCwzNCwKKyAgICAzNSwzNSwzNiwzNiwzNywzNywzOCwzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0MiwKKyAgICA0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGdmX21pZF9tb3Rpb25fbWlucVtRSU5ERVhfUkFOR0VdID0KK3sKKyAgICAwLDAsMCwwLDEsMSwxLDEsMSwxLDIsMiwzLDMsMyw0LAorICAgIDQsNCw1LDUsNSw2LDYsNiw3LDcsNyw4LDgsOCw5LDksCisgICAgOSwxMCwxMCwxMCwxMCwxMSwxMSwxMSwxMiwxMiwxMiwxMiwxMywxMywxMywxNCwKKyAgICAxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwKKyAgICAyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSwKKyAgICAzMCwzMCwzMSwzMSwzMiwzMiwzMywzMywzNCwzNCwzNSwzNSwzNiwzNiwzNywzNywKKyAgICAzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0Miw0Myw0Myw0NCw0NSw0Niw0Nyw0OCwKKyAgICA0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGdmX2hpZ2hfbW90aW9uX21pbnFbUUlOREVYX1JBTkdFXSA9Cit7CisgICAgMCwwLDAsMCwxLDEsMSwxLDEsMiwyLDIsMywzLDMsNCwKKyAgICA0LDQsNSw1LDUsNiw2LDYsNyw3LDcsOCw4LDgsOSw5LAorICAgIDksMTAsMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsCisgICAgMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsCisgICAgMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksMzAsMzAsMzEsMzEsMzIsMzIsCisgICAgMzMsMzMsMzQsMzQsMzUsMzUsMzYsMzYsMzcsMzcsMzgsMzgsMzksMzksNDAsNDAsCisgICAgNDEsNDEsNDIsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsCisgICAgNTUsNTYsNTcsNTgsNTksNjAsNjIsNjQsNjYsNjgsNzAsNzIsNzQsNzYsNzgsODAKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnRlcl9taW5xW1FJTkRFWF9SQU5HRV0gPQoreworICAgIDAsMCwxLDEsMiwzLDMsNCw0LDUsNiw2LDcsOCw4LDksCisgICAgOSwxMCwxMSwxMSwxMiwxMywxMywxNCwxNSwxNSwxNiwxNywxNywxOCwxOSwyMCwKKyAgICAyMCwyMSwyMiwyMiwyMywyNCwyNCwyNSwyNiwyNywyNywyOCwyOSwzMCwzMCwzMSwKKyAgICAzMiwzMywzMywzNCwzNSwzNiwzNiwzNywzOCwzOSwzOSw0MCw0MSw0Miw0Miw0MywKKyAgICA0NCw0NSw0Niw0Niw0Nyw0OCw0OSw1MCw1MCw1MSw1Miw1Myw1NCw1NSw1NSw1NiwKKyAgICA1Nyw1OCw1OSw2MCw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2Nyw2OCw2OSw3MCwKKyAgICA3MSw3Miw3Myw3NCw3NSw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSwKKyAgICA4Niw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAKK307CisKKyNpZmRlZiBQQUNLRVRfVEVTVElORworZXh0ZXJuIEZJTEUgKnZweGxvZ2M7CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2F2ZV9sYXllcl9jb250ZXh0KFZQOF9DT01QICpjcGkpCit7CisgICAgTEFZRVJfQ09OVEVYVCAqbGMgPSAmY3BpLT5sYXllcl9jb250ZXh0W2NwaS0+Y3VycmVudF9sYXllcl07CisKKyAgICAvKiBTYXZlIGxheWVyIGRlcGVuZGVudCBjb2Rpbmcgc3RhdGUgKi8KKyAgICBsYy0+dGFyZ2V0X2JhbmR3aWR0aCAgICAgICAgICAgICAgICAgPSBjcGktPnRhcmdldF9iYW5kd2lkdGg7CisgICAgbGMtPnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbCAgICAgICAgICAgID0gY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbDsKKyAgICBsYy0+b3B0aW1hbF9idWZmZXJfbGV2ZWwgICAgICAgICAgICAgPSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWw7CisgICAgbGMtPm1heGltdW1fYnVmZmVyX3NpemUgICAgICAgICAgICAgID0gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemU7CisgICAgbGMtPnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbF9pbl9tcyAgICAgID0gY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbF9pbl9tczsKKyAgICBsYy0+b3B0aW1hbF9idWZmZXJfbGV2ZWxfaW5fbXMgICAgICAgPSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWxfaW5fbXM7CisgICAgbGMtPm1heGltdW1fYnVmZmVyX3NpemVfaW5fbXMgICAgICAgID0gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemVfaW5fbXM7CisgICAgbGMtPmJ1ZmZlcl9sZXZlbCAgICAgICAgICAgICAgICAgICAgID0gY3BpLT5idWZmZXJfbGV2ZWw7CisgICAgbGMtPmJpdHNfb2ZmX3RhcmdldCAgICAgICAgICAgICAgICAgID0gY3BpLT5iaXRzX29mZl90YXJnZXQ7CisgICAgbGMtPnRvdGFsX2FjdHVhbF9iaXRzICAgICAgICAgICAgICAgID0gY3BpLT50b3RhbF9hY3R1YWxfYml0czsKKyAgICBsYy0+d29yc3RfcXVhbGl0eSAgICAgICAgICAgICAgICAgICAgPSBjcGktPndvcnN0X3F1YWxpdHk7CisgICAgbGMtPmFjdGl2ZV93b3JzdF9xdWFsaXR5ICAgICAgICAgICAgID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKKyAgICBsYy0+YmVzdF9xdWFsaXR5ICAgICAgICAgICAgICAgICAgICAgPSBjcGktPmJlc3RfcXVhbGl0eTsKKyAgICBsYy0+YWN0aXZlX2Jlc3RfcXVhbGl0eSAgICAgICAgICAgICAgPSBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHk7CisgICAgbGMtPm5pX2F2X3FpICAgICAgICAgICAgICAgICAgICAgICAgID0gY3BpLT5uaV9hdl9xaTsKKyAgICBsYy0+bmlfdG90X3FpICAgICAgICAgICAgICAgICAgICAgICAgPSBjcGktPm5pX3RvdF9xaTsKKyAgICBsYy0+bmlfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgPSBjcGktPm5pX2ZyYW1lczsKKyAgICBsYy0+YXZnX2ZyYW1lX3FpbmRleCAgICAgICAgICAgICAgICAgPSBjcGktPmF2Z19mcmFtZV9xaW5kZXg7CisgICAgbGMtPnJhdGVfY29ycmVjdGlvbl9mYWN0b3IgICAgICAgICAgID0gY3BpLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGxjLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IGNwaS0+a2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7CisgICAgbGMtPmdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3IgICAgICAgID0gY3BpLT5nZl9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGxjLT56YmluX292ZXJfcXVhbnQgICAgICAgICAgICAgICAgICA9IGNwaS0+emJpbl9vdmVyX3F1YW50OworICAgIGxjLT5pbnRlcl9mcmFtZV90YXJnZXQgICAgICAgICAgICAgICA9IGNwaS0+aW50ZXJfZnJhbWVfdGFyZ2V0OworICAgIGxjLT50b3RhbF9ieXRlX2NvdW50ICAgICAgICAgICAgICAgICA9IGNwaS0+dG90YWxfYnl0ZV9jb3VudDsKKyAgICBsYy0+ZmlsdGVyX2xldmVsICAgICAgICAgICAgICAgICAgICAgPSBjcGktPmNvbW1vbi5maWx0ZXJfbGV2ZWw7CisKKyAgICBsYy0+bGFzdF9mcmFtZV9wZXJjZW50X2ludHJhICAgICAgICAgPSBjcGktPmxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYTsKKworICAgIG1lbWNweSAobGMtPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZSwKKyAgICAgICAgICAgIGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlLAorICAgICAgICAgICAgc2l6ZW9mKGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfbGF5ZXJfY29udGV4dChWUDhfQ09NUCAqY3BpLCBjb25zdCBpbnQgbGF5ZXIpCit7CisgICAgTEFZRVJfQ09OVEVYVCAqbGMgPSAmY3BpLT5sYXllcl9jb250ZXh0W2xheWVyXTsKKworICAgIC8qIFJlc3RvcmUgbGF5ZXIgZGVwZW5kZW50IGNvZGluZyBzdGF0ZSAqLworICAgIGNwaS0+Y3VycmVudF9sYXllciAgICAgICAgICAgICAgICAgICAgPSBsYXllcjsKKyAgICBjcGktPnRhcmdldF9iYW5kd2lkdGggICAgICAgICAgICAgICAgID0gbGMtPnRhcmdldF9iYW5kd2lkdGg7CisgICAgY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggICAgICAgICAgICA9IGxjLT50YXJnZXRfYmFuZHdpZHRoOworICAgIGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwgICAgICAgPSBsYy0+c3RhcnRpbmdfYnVmZmVyX2xldmVsOworICAgIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAgICAgICAgPSBsYy0+b3B0aW1hbF9idWZmZXJfbGV2ZWw7CisgICAgY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUgICAgICAgICA9IGxjLT5tYXhpbXVtX2J1ZmZlcl9zaXplOworICAgIGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWxfaW5fbXMgPSBsYy0+c3RhcnRpbmdfYnVmZmVyX2xldmVsX2luX21zOworICAgIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbF9pbl9tcyAgPSBsYy0+b3B0aW1hbF9idWZmZXJfbGV2ZWxfaW5fbXM7CisgICAgY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemVfaW5fbXMgICA9IGxjLT5tYXhpbXVtX2J1ZmZlcl9zaXplX2luX21zOworICAgIGNwaS0+YnVmZmVyX2xldmVsICAgICAgICAgICAgICAgICAgICAgPSBsYy0+YnVmZmVyX2xldmVsOworICAgIGNwaS0+Yml0c19vZmZfdGFyZ2V0ICAgICAgICAgICAgICAgICAgPSBsYy0+Yml0c19vZmZfdGFyZ2V0OworICAgIGNwaS0+dG90YWxfYWN0dWFsX2JpdHMgICAgICAgICAgICAgICAgPSBsYy0+dG90YWxfYWN0dWFsX2JpdHM7CisgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSAgICAgICAgICAgICA9IGxjLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKKyAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgICAgICAgICAgICAgID0gbGMtPmFjdGl2ZV9iZXN0X3F1YWxpdHk7CisgICAgY3BpLT5uaV9hdl9xaSAgICAgICAgICAgICAgICAgICAgICAgICA9IGxjLT5uaV9hdl9xaTsKKyAgICBjcGktPm5pX3RvdF9xaSAgICAgICAgICAgICAgICAgICAgICAgID0gbGMtPm5pX3RvdF9xaTsKKyAgICBjcGktPm5pX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgID0gbGMtPm5pX2ZyYW1lczsKKyAgICBjcGktPmF2Z19mcmFtZV9xaW5kZXggICAgICAgICAgICAgICAgID0gbGMtPmF2Z19mcmFtZV9xaW5kZXg7CisgICAgY3BpLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yICAgICAgICAgICA9IGxjLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGNwaS0+a2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSBsYy0+a2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7CisgICAgY3BpLT5nZl9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yICAgICAgICA9IGxjLT5nZl9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ICAgICAgICAgICAgICAgICAgPSBsYy0+emJpbl9vdmVyX3F1YW50OworICAgIGNwaS0+aW50ZXJfZnJhbWVfdGFyZ2V0ICAgICAgICAgICAgICAgPSBsYy0+aW50ZXJfZnJhbWVfdGFyZ2V0OworICAgIGNwaS0+dG90YWxfYnl0ZV9jb3VudCAgICAgICAgICAgICAgICAgPSBsYy0+dG90YWxfYnl0ZV9jb3VudDsKKyAgICBjcGktPmNvbW1vbi5maWx0ZXJfbGV2ZWwgICAgICAgICAgICAgID0gbGMtPmZpbHRlcl9sZXZlbDsKKworICAgIGNwaS0+bGFzdF9mcmFtZV9wZXJjZW50X2ludHJhICAgICAgICAgPSBsYy0+bGFzdF9mcmFtZV9wZXJjZW50X2ludHJhOworCisgICAgbWVtY3B5IChjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZSwKKyAgICAgICAgICAgIGxjLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2UsCisgICAgICAgICAgICBzaXplb2YoY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2UpKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZmVhdHVyZXMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvLyBJZiBzZWdtZW50YXRpb24gZW5hYmxlZCBzZXQgdGhlIHVwZGF0ZSBmbGFncworICAgIGlmICggY3BpLT5tYi5lX21iZC5zZWdtZW50YXRpb25fZW5hYmxlZCApCisgICAgeworICAgICAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMTsKKyAgICAgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMDsKKyAgICAgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAwOworICAgIH0KKworICAgIGNwaS0+bWIuZV9tYmQubW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZCA9IDA7CisgICAgY3BpLT5tYi5lX21iZC5tb2RlX3JlZl9sZl9kZWx0YV91cGRhdGUgPSAwOworICAgIHZweF9tZW1zZXQoY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzLCAwLCBzaXplb2YoY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzKSk7CisgICAgdnB4X21lbXNldChjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzLCAwLCBzaXplb2YoY3BpLT5tYi5lX21iZC5tb2RlX2xmX2RlbHRhcykpOworICAgIHZweF9tZW1zZXQoY3BpLT5tYi5lX21iZC5sYXN0X3JlZl9sZl9kZWx0YXMsIDAsIHNpemVvZihjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXMpKTsKKyAgICB2cHhfbWVtc2V0KGNwaS0+bWIuZV9tYmQubGFzdF9tb2RlX2xmX2RlbHRhcywgMCwgc2l6ZW9mKGNwaS0+bWIuZV9tYmQubW9kZV9sZl9kZWx0YXMpKTsKKworICAgIHNldF9kZWZhdWx0X2xmX2RlbHRhcyhjcGkpOworCit9CisKKworc3RhdGljIHZvaWQgZGVhbGxvY19yYXdfZnJhbWVfYnVmZmVycyhWUDhfQ09NUCAqY3BpKTsKKworCitzdGF0aWMgdm9pZCBkZWFsbG9jX2NvbXByZXNzb3JfZGF0YShWUDhfQ09NUCAqY3BpKQoreworICAgIHZweF9mcmVlKGNwaS0+dHBsaXN0KTsKKyAgICBjcGktPnRwbGlzdCA9IE5VTEw7CisKKyAgICAvKiBEZWxldGUgbGFzdCBmcmFtZSBNViBzdG9yYWdlIGJ1ZmZlcnMgKi8KKyAgICB2cHhfZnJlZShjcGktPmxmbXYpOworICAgIGNwaS0+bGZtdiA9IDA7CisKKyAgICB2cHhfZnJlZShjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXMpOworICAgIGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhcyA9IDA7CisKKyAgICB2cHhfZnJlZShjcGktPmxmX3JlZl9mcmFtZSk7CisgICAgY3BpLT5sZl9yZWZfZnJhbWUgPSAwOworCisgICAgLyogRGVsZXRlIHNlbWVudGF0aW9uIG1hcCAqLworICAgIHZweF9mcmVlKGNwaS0+c2VnbWVudGF0aW9uX21hcCk7CisgICAgY3BpLT5zZWdtZW50YXRpb25fbWFwID0gMDsKKworICAgIHZweF9mcmVlKGNwaS0+YWN0aXZlX21hcCk7CisgICAgY3BpLT5hY3RpdmVfbWFwID0gMDsKKworICAgIHZwOF9kZV9hbGxvY19mcmFtZV9idWZmZXJzKCZjcGktPmNvbW1vbik7CisKKyAgICB2cDhfeXYxMl9kZV9hbGxvY19mcmFtZV9idWZmZXIoJmNwaS0+cGlja19sZl9sdmxfZnJhbWUpOworICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5zY2FsZWRfc291cmNlKTsKKyAgICBkZWFsbG9jX3Jhd19mcmFtZV9idWZmZXJzKGNwaSk7CisKKyAgICB2cHhfZnJlZShjcGktPnRvayk7CisgICAgY3BpLT50b2sgPSAwOworCisgICAgLyogU3RydWN0dXJlIHVzZWQgdG8gbW9uaXRvciBHRiB1c2FnZSAqLworICAgIHZweF9mcmVlKGNwaS0+Z2ZfYWN0aXZlX2ZsYWdzKTsKKyAgICBjcGktPmdmX2FjdGl2ZV9mbGFncyA9IDA7CisKKyAgICAvKiBBY3Rpdml0eSBtYXNrIGJhc2VkIHBlciBtYiB6YmluIGFkanVzdG1lbnRzICovCisgICAgdnB4X2ZyZWUoY3BpLT5tYl9hY3Rpdml0eV9tYXApOworICAgIGNwaS0+bWJfYWN0aXZpdHlfbWFwID0gMDsKKworICAgIHZweF9mcmVlKGNwaS0+bWIucGlwKTsKKyAgICBjcGktPm1iLnBpcCA9IDA7CisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICB2cHhfZnJlZShjcGktPm10X2N1cnJlbnRfbWJfY29sKTsKKyAgICBjcGktPm10X2N1cnJlbnRfbWJfY29sID0gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBlbmFibGVfc2VnbWVudGF0aW9uKFZQOF9DT01QICpjcGkpCit7CisgICAgLyogU2V0IHRoZSBhcHByb3ByaWF0ZSBmZWF0dXJlIGJpdCAqLworICAgIGNwaS0+bWIuZV9tYmQuc2VnbWVudGF0aW9uX2VuYWJsZWQgPSAxOworICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXAgPSAxOworICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9kYXRhID0gMTsKK30KK3N0YXRpYyB2b2lkIGRpc2FibGVfc2VnbWVudGF0aW9uKFZQOF9DT01QICpjcGkpCit7CisgICAgLyogQ2xlYXIgdGhlIGFwcHJvcHJpYXRlIGZlYXR1cmUgYml0ICovCisgICAgY3BpLT5tYi5lX21iZC5zZWdtZW50YXRpb25fZW5hYmxlZCA9IDA7Cit9CisKKy8qIFZhbGlkIHZhbHVlcyBmb3IgYSBzZWdtZW50IGFyZSAwIHRvIDMKKyAqIFNlZ21lbnRhdGlvbiBtYXAgaXMgYXJyYW5nZSBhcyBbUm93c11bQ29sdW1uc10KKyAqLworc3RhdGljIHZvaWQgc2V0X3NlZ21lbnRhdGlvbl9tYXAoVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgY2hhciAqc2VnbWVudGF0aW9uX21hcCkKK3sKKyAgICAvKiBDb3B5IGluIHRoZSBuZXcgc2VnbWVudGF0aW9uIG1hcCAqLworICAgIHZweF9tZW1jcHkoY3BpLT5zZWdtZW50YXRpb25fbWFwLCBzZWdtZW50YXRpb25fbWFwLCAoY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMpKTsKKworICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBtYXAgc2hvdWxkIGJlIHVwZGF0ZWQuICovCisgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9IDE7CisgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAxOworfQorCisvKiBUaGUgdmFsdWVzIGdpdmVuIGZvciBlYWNoIHNlZ21lbnQgY2FuIGJlIGVpdGhlciBkZWx0YXMgKGZyb20gdGhlIGRlZmF1bHQKKyAqIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZyYW1lKSBvciBhYnNvbHV0ZSB2YWx1ZXMuCisgKgorICogVmFsaWQgcmFuZ2UgZm9yIGFicyB2YWx1ZXMgaXM6CisgKiAgICAoMC0xMjcgZm9yIE1CX0xWTF9BTFRfUSksICgwLTYzIGZvciBTRUdNRU5UX0FMVF9MRikKKyAqIFZhbGlkIHJhbmdlIGZvciBkZWx0YSB2YWx1ZXMgYXJlOgorICogICAgKCsvLTEyNyBmb3IgTUJfTFZMX0FMVF9RKSwgKCsvLTYzIGZvciBTRUdNRU5UX0FMVF9MRikKKyAqCisgKiBhYnNfZGVsdGEgPSBTRUdNRU5UX0RFTFRBREFUQSAoZGVsdGFzKQorICogYWJzX2RlbHRhID0gU0VHTUVOVF9BQlNEQVRBICh1c2UgdGhlIGFic29sdXRlIHZhbHVlcyBnaXZlbikuCisgKgorICovCitzdGF0aWMgdm9pZCBzZXRfc2VnbWVudF9kYXRhKFZQOF9DT01QICpjcGksIHNpZ25lZCBjaGFyICpmZWF0dXJlX2RhdGEsIHVuc2lnbmVkIGNoYXIgYWJzX2RlbHRhKQoreworICAgIGNwaS0+bWIuZV9tYmQubWJfc2VnZW1lbnRfYWJzX2RlbHRhID0gYWJzX2RlbHRhOworICAgIHZweF9tZW1jcHkoY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSwgZmVhdHVyZV9kYXRhLCBzaXplb2YoY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSkpOworfQorCisKK3N0YXRpYyB2b2lkIHNlZ21lbnRhdGlvbl90ZXN0X2Z1bmN0aW9uKFZQOF9DT01QICpjcGkpCit7CisgICAgdW5zaWduZWQgY2hhciAqc2VnX21hcDsKKyAgICBzaWduZWQgY2hhciBmZWF0dXJlX2RhdGFbTUJfTFZMX01BWF1bTUFYX01CX1NFR01FTlRTXTsKKworICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBtYXAgZm9yIHNlZ21lbnRhdGlvbiBkYXRhLgorICAgIENIRUNLX01FTV9FUlJPUihzZWdfbWFwLCB2cHhfY2FsbG9jKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzLCAxKSk7CisKKyAgICAvLyBTZXQgdGhlIHNlZ21lbnRhdGlvbiBNYXAKKyAgICBzZXRfc2VnbWVudGF0aW9uX21hcChjcGksIHNlZ19tYXApOworCisgICAgLy8gQWN0aXZhdGUgc2VnbWVudGF0aW9uLgorICAgIGVuYWJsZV9zZWdtZW50YXRpb24oY3BpKTsKKworICAgIC8vIFNldCB1cCB0aGUgcXVhbnQgc2VnbWVudCBkYXRhCisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMF0gPSAwOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzFdID0gNDsKKyAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVsyXSA9IDA7CisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bM10gPSAwOworICAgIC8vIFNldCB1cCB0aGUgbG9vcCBzZWdtZW50IGRhdGEKKyAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMF0gPSAwOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsxXSA9IDA7CisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzJdID0gMDsKKyAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bM10gPSAwOworCisgICAgLy8gSW5pdGlhbGlzZSB0aGUgZmVhdHVyZSBkYXRhIHN0cnVjdHVyZQorICAgIC8vIFNFR01FTlRfREVMVEFEQVRBICAgIDAsIFNFR01FTlRfQUJTREFUQSAgICAgIDEKKyAgICBzZXRfc2VnbWVudF9kYXRhKGNwaSwgJmZlYXR1cmVfZGF0YVswXVswXSwgU0VHTUVOVF9ERUxUQURBVEEpOworCisgICAgLy8gRGVsZXRlIHNlbWVudGF0aW9uIG1hcAorICAgIHZweF9mcmVlKHNlZ19tYXApOworCisgICAgc2VnX21hcCA9IDA7Cit9CisKKy8qIEEgc2ltcGxlIGZ1bmN0aW9uIHRvIGN5Y2xpY2FsbHkgcmVmcmVzaCB0aGUgYmFja2dyb3VuZCBhdCBhIGxvd2VyIFEgKi8KK3N0YXRpYyB2b2lkIGN5Y2xpY19iYWNrZ3JvdW5kX3JlZnJlc2goVlA4X0NPTVAgKmNwaSwgaW50IFEsIGludCBsZl9hZGp1c3RtZW50KQoreworICAgIHVuc2lnbmVkIGNoYXIgKnNlZ19tYXAgPSBjcGktPnNlZ21lbnRhdGlvbl9tYXA7CisgICAgc2lnbmVkIGNoYXIgZmVhdHVyZV9kYXRhW01CX0xWTF9NQVhdW01BWF9NQl9TRUdNRU5UU107CisgICAgaW50IGk7CisgICAgaW50IGJsb2NrX2NvdW50ID0gY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX21heF9tYnNfcGVyZnJhbWU7CisgICAgaW50IG1ic19pbl9mcmFtZSA9IGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzOworCisgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9xID0gUSAvIDI7CisKKyAgICAvLyBTZXQgZXZlcnkgbWFjcm9ibG9jayB0byBiZSBlbGlnaWJsZSBmb3IgdXBkYXRlLgorICAgIC8vIEZvciBrZXkgZnJhbWUgdGhpcyB3aWxsIHJlc2V0IHNlZyBtYXAgdG8gMC4KKyAgICB2cHhfbWVtc2V0KGNwaS0+c2VnbWVudGF0aW9uX21hcCwgMCwgbWJzX2luX2ZyYW1lKTsKKworICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIC8qIEN5Y2xlIHRocm91Z2ggdGhlIG1hY3JvX2Jsb2NrIHJvd3MgKi8KKyAgICAgICAgLyogTUIgbG9vcCB0byBzZXQgbG9jYWwgc2VnbWVudGF0aW9uIG1hcCAqLworICAgICAgICBpID0gY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2luZGV4OworICAgICAgICBhc3NlcnQoaSA8IG1ic19pbl9mcmFtZSk7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGUgTUIgaXMgYXMgYSBjYW5kaWRhdGUgZm9yIGNsZWFuIHVwIHRoZW4gbWFyayBpdCBmb3IKKyAgICAgICAgICAgKiBwb3NzaWJsZSBib29zdC9yZWZyZXNoIChzZWdtZW50IDEpIFRoZSBzZWdtZW50IGlkIG1heSBnZXQKKyAgICAgICAgICAgKiByZXNldCB0byAwIGxhdGVyIGlmIHRoZSBNQiBnZXRzIGNvZGVkIGFueXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICAgICAgKiBsYXN0IGZyYW1lIDAsMCBhcyBvbmx5IChsYXN0IGZyYW1lIDAsMCkgTUJzIGFyZSBlbGlnYWJsZSBmb3IKKyAgICAgICAgICAgKiByZWZyZXNoIDogdGhhdCBpcyB0byBzYXkgTWJzIGxpa2VseSB0byBiZSBiYWNrZ3JvdW5kIGJsb2Nrcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbaV0gPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHNlZ19tYXBbaV0gPSAxOworICAgICAgICAgICAgICBibG9ja19jb3VudCAtLTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbaV0gPCAwKQorICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFtpXSsrOworCisgICAgICAgICAgaSsrOworICAgICAgICAgIGlmIChpID09IG1ic19pbl9mcmFtZSkKKyAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgfQorICAgICAgICB3aGlsZShibG9ja19jb3VudCAmJiBpICE9IGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9pbmRleCk7CisKKyAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2luZGV4ID0gaTsKKyAgICB9CisKKyAgICAvKiBBY3RpdmF0ZSBzZWdtZW50YXRpb24uICovCisgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9IDE7CisgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAxOworICAgIGVuYWJsZV9zZWdtZW50YXRpb24oY3BpKTsKKworICAgIC8qIFNldCB1cCB0aGUgcXVhbnQgc2VnbWVudCBkYXRhICovCisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMF0gPSAwOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzFdID0gKGNwaS0+Y3ljbGljX3JlZnJlc2hfcSAtIFEpOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdID0gMDsKKyAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXSA9IDA7CisKKyAgICAvKiBTZXQgdXAgdGhlIGxvb3Agc2VnbWVudCBkYXRhICovCisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzBdID0gMDsKKyAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMV0gPSBsZl9hZGp1c3RtZW50OworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsyXSA9IDA7CisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzNdID0gMDsKKworICAgIC8qIEluaXRpYWxpc2UgdGhlIGZlYXR1cmUgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBzZXRfc2VnbWVudF9kYXRhKGNwaSwgJmZlYXR1cmVfZGF0YVswXVswXSwgU0VHTUVOVF9ERUxUQURBVEEpOworCit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2xmX2RlbHRhcyhWUDhfQ09NUCAqY3BpKQoreworICAgIGNwaS0+bWIuZV9tYmQubW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZCA9IDE7CisgICAgY3BpLT5tYi5lX21iZC5tb2RlX3JlZl9sZl9kZWx0YV91cGRhdGUgPSAxOworCisgICAgdnB4X21lbXNldChjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXMsIDAsIHNpemVvZihjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXMpKTsKKyAgICB2cHhfbWVtc2V0KGNwaS0+bWIuZV9tYmQubW9kZV9sZl9kZWx0YXMsIDAsIHNpemVvZihjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzKSk7CisKKyAgICAvKiBUZXN0IG9mIHJlZiBmcmFtZSBkZWx0YXMgKi8KKyAgICBjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXNbSU5UUkFfRlJBTUVdID0gMjsKKyAgICBjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXNbTEFTVF9GUkFNRV0gPSAwOworICAgIGNwaS0+bWIuZV9tYmQucmVmX2xmX2RlbHRhc1tHT0xERU5fRlJBTUVdID0gLTI7CisgICAgY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzW0FMVFJFRl9GUkFNRV0gPSAtMjsKKworICAgIGNwaS0+bWIuZV9tYmQubW9kZV9sZl9kZWx0YXNbMF0gPSA0OyAgICAgICAgICAgICAgIC8qIEJQUkVEICovCisKKyAgICBpZihjcGktPm94Y2YuTW9kZSA9PSBNT0RFX1JFQUxUSU1FKQorICAgICAgY3BpLT5tYi5lX21iZC5tb2RlX2xmX2RlbHRhc1sxXSA9IC0xMjsgICAgICAgICAgICAgIC8qIFplcm8gKi8KKyAgICBlbHNlCisgICAgICBjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzWzFdID0gLTI7ICAgICAgICAgICAgICAvKiBaZXJvICovCisKKyAgICBjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzWzJdID0gMjsgICAgICAgICAgICAgICAvKiBOZXcgbXYgKi8KKyAgICBjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzWzNdID0gNDsgICAgICAgICAgICAgICAvKiBTcGxpdCBtdiAqLworfQorCisvKiBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIG1hcHBpbmcgc3BlZWQgYW5kIG1vZGUgaW50byBhIGNvbnRpbnVvdXMKKyAqIHJhbmdlCisgKi8KKyNkZWZpbmUgR09PRCh4KSAoeCsxKQorI2RlZmluZSBSVCh4KSAoeCs3KQorCitzdGF0aWMgaW50IHNwZWVkX21hcChpbnQgc3BlZWQsIGNvbnN0IGludCAqbWFwKQoreworICAgIGludCByZXM7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgcmVzID0gKm1hcCsrOworICAgIH0gd2hpbGUoc3BlZWQgPj0gKm1hcCsrKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3QgaW50IHRocmVzaF9tdWx0X21hcF96bm5bXSA9IHsKKyAgICAvKiBtYXAgY29tbW9uIHRvIHplcm8sIG5lYXJlc3QsIGFuZCBuZWFyICovCisgICAgMCwgR09PRCgyKSwgMTUwMCwgR09PRCgzKSwgMjAwMCwgUlQoMCksIDEwMDAsIFJUKDIpLCAyMDAwLCBJTlRfTUFYCit9OworCitzdGF0aWMgY29uc3QgaW50IHRocmVzaF9tdWx0X21hcF92aHByZWRbXSA9IHsKKyAgICAxMDAwLCBHT09EKDIpLCAxNTAwLCBHT09EKDMpLCAyMDAwLCBSVCgwKSwgMTAwMCwgUlQoMSksIDIwMDAsCisgICAgUlQoNyksIElOVF9NQVgsIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdGhyZXNoX211bHRfbWFwX2JwcmVkW10gPSB7CisgICAgMjAwMCwgR09PRCgwKSwgMjUwMCwgR09PRCgyKSwgNTAwMCwgR09PRCgzKSwgNzUwMCwgUlQoMCksIDI1MDAsIFJUKDEpLCA1MDAwLAorICAgIFJUKDYpLCBJTlRfTUFYLCBJTlRfTUFYCit9OworCitzdGF0aWMgY29uc3QgaW50IHRocmVzaF9tdWx0X21hcF90bVtdID0geworICAgIDEwMDAsIEdPT0QoMiksIDE1MDAsIEdPT0QoMyksIDIwMDAsIFJUKDApLCAwLCBSVCgxKSwgMTAwMCwgUlQoMiksIDIwMDAsCisgICAgUlQoNyksIElOVF9NQVgsIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdGhyZXNoX211bHRfbWFwX25ldzFbXSA9IHsKKyAgICAxMDAwLCBHT09EKDIpLCAyMDAwLCBSVCgwKSwgMjAwMCwgSU5UX01BWAorfTsKKworc3RhdGljIGNvbnN0IGludCB0aHJlc2hfbXVsdF9tYXBfbmV3MltdID0geworICAgIDEwMDAsIEdPT0QoMiksIDIwMDAsIEdPT0QoMyksIDI1MDAsIEdPT0QoNSksIDQwMDAsIFJUKDApLCAyMDAwLCBSVCgyKSwgMjUwMCwKKyAgICBSVCg1KSwgNDAwMCwgSU5UX01BWAorfTsKKworc3RhdGljIGNvbnN0IGludCB0aHJlc2hfbXVsdF9tYXBfc3BsaXQxW10gPSB7CisgICAgMjUwMCwgR09PRCgwKSwgMTcwMCwgR09PRCgyKSwgMTAwMDAsIEdPT0QoMyksIDI1MDAwLCBHT09EKDQpLCBJTlRfTUFYLAorICAgIFJUKDApLCA1MDAwLCBSVCgxKSwgMTAwMDAsIFJUKDIpLCAyNTAwMCwgUlQoMyksIElOVF9NQVgsIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdGhyZXNoX211bHRfbWFwX3NwbGl0MltdID0geworICAgIDUwMDAsIEdPT0QoMCksIDQ1MDAsIEdPT0QoMiksIDIwMDAwLCBHT09EKDMpLCA1MDAwMCwgR09PRCg0KSwgSU5UX01BWCwKKyAgICBSVCgwKSwgMTAwMDAsIFJUKDEpLCAyMDAwMCwgUlQoMiksIDUwMDAwLCBSVCgzKSwgSU5UX01BWCwgSU5UX01BWAorfTsKKworc3RhdGljIGNvbnN0IGludCBtb2RlX2NoZWNrX2ZyZXFfbWFwX3puMltdID0geworICAgIC8qIHt6ZXJvLG5lYXJlc3R9ezIsM30gKi8KKyAgICAwLCBSVCgxMCksIDE8PDEsIFJUKDExKSwgMTw8MiwgUlQoMTIpLCAxPDwzLCBJTlRfTUFYCit9OworCitzdGF0aWMgY29uc3QgaW50IG1vZGVfY2hlY2tfZnJlcV9tYXBfdmhicHJlZFtdID0geworICAgIDAsIEdPT0QoNSksIDIsIFJUKDApLCAwLCBSVCgzKSwgMiwgUlQoNSksIDQsIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbW9kZV9jaGVja19mcmVxX21hcF9uZWFyMltdID0geworICAgIDAsIEdPT0QoNSksIDIsIFJUKDApLCAwLCBSVCgzKSwgMiwgUlQoMTApLCAxPDwyLCBSVCgxMSksIDE8PDMsIFJUKDEyKSwgMTw8NCwKKyAgICBJTlRfTUFYCit9OworCitzdGF0aWMgY29uc3QgaW50IG1vZGVfY2hlY2tfZnJlcV9tYXBfbmV3MVtdID0geworICAgIDAsIFJUKDEwKSwgMTw8MSwgUlQoMTEpLCAxPDwyLCBSVCgxMiksIDE8PDMsIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbW9kZV9jaGVja19mcmVxX21hcF9uZXcyW10gPSB7CisgICAgMCwgR09PRCg1KSwgNCwgUlQoMCksIDAsIFJUKDMpLCA0LCBSVCgxMCksIDE8PDMsIFJUKDExKSwgMTw8NCwgUlQoMTIpLCAxPDw1LAorICAgIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbW9kZV9jaGVja19mcmVxX21hcF9zcGxpdDFbXSA9IHsKKyAgICAwLCBHT09EKDIpLCAyLCBHT09EKDMpLCA3LCBSVCgxKSwgMiwgUlQoMiksIDcsIElOVF9NQVgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbW9kZV9jaGVja19mcmVxX21hcF9zcGxpdDJbXSA9IHsKKyAgICAwLCBHT09EKDEpLCAyLCBHT09EKDIpLCA0LCBHT09EKDMpLCAxNSwgUlQoMSksIDQsIFJUKDIpLCAxNSwgSU5UX01BWAorfTsKKwordm9pZCB2cDhfc2V0X3NwZWVkX2ZlYXR1cmVzKFZQOF9DT01QICpjcGkpCit7CisgICAgU1BFRURfRkVBVFVSRVMgKnNmID0gJmNwaS0+c2Y7CisgICAgaW50IE1vZGUgPSBjcGktPmNvbXByZXNzb3Jfc3BlZWQ7CisgICAgaW50IFNwZWVkID0gY3BpLT5TcGVlZDsKKyAgICBpbnQgaTsKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKyAgICBpbnQgbGFzdF9pbXByb3ZlZF9xdWFudCA9IHNmLT5pbXByb3ZlZF9xdWFudDsKKyAgICBpbnQgcmVmX2ZyYW1lczsKKworICAgIC8qIEluaXRpYWxpc2UgZGVmYXVsdCBtb2RlIGZyZXF1ZW5jeSBzYW1wbGluZyB2YXJpYWJsZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVTOyBpICsrKQorICAgIHsKKyAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbaV0gPSAwOworICAgICAgICBjcGktPm1vZGVfdGVzdF9oaXRfY291bnRzW2ldID0gMDsKKyAgICAgICAgY3BpLT5tb2RlX2Nob3Nlbl9jb3VudHNbaV0gPSAwOworICAgIH0KKworICAgIGNwaS0+bWJzX3Rlc3RlZF9zb19mYXIgPSAwOworCisgICAgLyogYmVzdCBxdWFsaXR5IGRlZmF1bHRzICovCisgICAgc2YtPlJEID0gMTsKKyAgICBzZi0+c2VhcmNoX21ldGhvZCA9IE5TVEVQOworICAgIHNmLT5pbXByb3ZlZF9xdWFudCA9IDE7CisgICAgc2YtPmltcHJvdmVkX2RjdCA9IDE7CisgICAgc2YtPmF1dG9fZmlsdGVyID0gMTsKKyAgICBzZi0+cmVjb2RlX2xvb3AgPSAxOworICAgIHNmLT5xdWFydGVyX3BpeGVsX3NlYXJjaCA9IDE7CisgICAgc2YtPmhhbGZfcGl4ZWxfc2VhcmNoID0gMTsKKyAgICBzZi0+aXRlcmF0aXZlX3N1Yl9waXhlbCA9IDE7CisgICAgc2YtPm9wdGltaXplX2NvZWZmaWNpZW50cyA9IDE7CisgICAgc2YtPnVzZV9mYXN0cXVhbnRfZm9yX3BpY2sgPSAwOworICAgIHNmLT5ub19za2lwX2Jsb2NrNHg0X3NlYXJjaCA9IDE7CisKKyAgICBzZi0+Zmlyc3Rfc3RlcCA9IDA7CisgICAgc2YtPm1heF9zdGVwX3NlYXJjaF9zdGVwcyA9IE1BWF9NVlNFQVJDSF9TVEVQUzsKKyAgICBzZi0+aW1wcm92ZWRfbXZfcHJlZCA9IDE7CisKKyAgICAvKiBkZWZhdWx0IHRocmVzaG9sZHMgdG8gMCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkrKykKKyAgICAgICAgc2YtPnRocmVzaF9tdWx0W2ldID0gMDsKKworICAgIC8qIENvdW50IGVuYWJsZWQgcmVmZXJlbmNlcyAqLworICAgIHJlZl9mcmFtZXMgPSAxOworICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZSQU1FKQorICAgICAgICByZWZfZnJhbWVzKys7CisgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0dPTERfRlJBTUUpCisgICAgICAgIHJlZl9mcmFtZXMrKzsKKyAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUUl9GUkFNRSkKKyAgICAgICAgcmVmX2ZyYW1lcysrOworCisgICAgLyogQ29udmVydCBzcGVlZCB0byBjb250aW51b3VzIHJhbmdlLCB3aXRoIGNsYW1waW5nICovCisgICAgaWYgKE1vZGUgPT0gMCkKKyAgICAgICAgU3BlZWQgPSAwOworICAgIGVsc2UgaWYgKE1vZGUgPT0gMikKKyAgICAgICAgU3BlZWQgPSBSVChTcGVlZCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKFNwZWVkID4gNSkKKyAgICAgICAgICAgIFNwZWVkID0gNTsKKyAgICAgICAgU3BlZWQgPSBHT09EKFNwZWVkKTsKKyAgICB9CisKKyAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk8xXSA9CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUMV0gPQorICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUjFdID0KKyAgICBzZi0+dGhyZXNoX211bHRbVEhSX0RDXSA9IDA7IC8qIGFsd2F5cyAqLworCisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPMl0gPQorICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfWkVSTzNdID0KKyAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1QyXSA9CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUM10gPQorICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUjJdICA9CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSM10gID0gc3BlZWRfbWFwKFNwZWVkLCB0aHJlc2hfbXVsdF9tYXBfem5uKTsKKworICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfVl9QUkVEXSA9CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9IX1BSRURdID0gc3BlZWRfbWFwKFNwZWVkLCB0aHJlc2hfbXVsdF9tYXBfdmhwcmVkKTsKKyAgICBzZi0+dGhyZXNoX211bHRbVEhSX0JfUFJFRF0gPSBzcGVlZF9tYXAoU3BlZWQsIHRocmVzaF9tdWx0X21hcF9icHJlZCk7CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9UTV0gICAgID0gc3BlZWRfbWFwKFNwZWVkLCB0aHJlc2hfbXVsdF9tYXBfdG0pOworICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXMV0gICA9IHNwZWVkX21hcChTcGVlZCwgdGhyZXNoX211bHRfbWFwX25ldzEpOworICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXMl0gICA9CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVczXSAgID0gc3BlZWRfbWFwKFNwZWVkLCB0aHJlc2hfbXVsdF9tYXBfbmV3Mik7CisgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVDFdID0gc3BlZWRfbWFwKFNwZWVkLCB0aHJlc2hfbXVsdF9tYXBfc3BsaXQxKTsKKyAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElUMl0gPQorICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVQzXSA9IHNwZWVkX21hcChTcGVlZCwgdGhyZXNoX211bHRfbWFwX3NwbGl0Mik7CisKKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfWkVSTzFdID0KKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVBUkVTVDFdID0KKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVBUjFdID0KKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfVE1dICAgICA9CisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX0RDXSA9IDA7IC8qIGFsd2F5cyAqLworCisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1pFUk8yXSA9CisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1pFUk8zXSA9CisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FQVJFU1QyXSA9CisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FQVJFU1QzXSA9IHNwZWVkX21hcChTcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfY2hlY2tfZnJlcV9tYXBfem4yKTsKKworICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORUFSMl0gID0KKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVBUjNdICA9IHNwZWVkX21hcChTcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2NoZWNrX2ZyZXFfbWFwX25lYXIyKTsKKworICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9WX1BSRURdID0KKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfSF9QUkVEXSA9CisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX0JfUFJFRF0gPSBzcGVlZF9tYXAoU3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9jaGVja19mcmVxX21hcF92aGJwcmVkKTsKKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVXMV0gICA9IHNwZWVkX21hcChTcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2NoZWNrX2ZyZXFfbWFwX25ldzEpOworICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORVcyXSAgID0KKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVXM10gICA9IHNwZWVkX21hcChTcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2NoZWNrX2ZyZXFfbWFwX25ldzIpOworICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9TUExJVDFdID0gc3BlZWRfbWFwKFNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfY2hlY2tfZnJlcV9tYXBfc3BsaXQxKTsKKyAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVQyXSA9CisgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1NQTElUM10gPSBzcGVlZF9tYXAoU3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9jaGVja19mcmVxX21hcF9zcGxpdDIpOworICAgIFNwZWVkID0gY3BpLT5TcGVlZDsKKyAgICBzd2l0Y2ggKE1vZGUpCisgICAgeworI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCisgICAgY2FzZSAwOiAvKiBiZXN0IHF1YWxpdHkgbW9kZSAqLworICAgICAgICBzZi0+Zmlyc3Rfc3RlcCA9IDA7CisgICAgICAgIHNmLT5tYXhfc3RlcF9zZWFyY2hfc3RlcHMgPSBNQVhfTVZTRUFSQ0hfU1RFUFM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChTcGVlZCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgY29lZmZpY2llbnQgb3B0aW1pemF0aW9uIGFib3ZlIHNwZWVkIDAgKi8KKyAgICAgICAgICAgIHNmLT5vcHRpbWl6ZV9jb2VmZmljaWVudHMgPSAwOworICAgICAgICAgICAgc2YtPnVzZV9mYXN0cXVhbnRfZm9yX3BpY2sgPSAxOworICAgICAgICAgICAgc2YtPm5vX3NraXBfYmxvY2s0eDRfc2VhcmNoID0gMDsKKworICAgICAgICAgICAgc2YtPmZpcnN0X3N0ZXAgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFNwZWVkID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgc2YtPmltcHJvdmVkX3F1YW50ID0gMDsKKyAgICAgICAgICAgIHNmLT5pbXByb3ZlZF9kY3QgPSAwOworCisgICAgICAgICAgICAvKiBPbmx5IGRvIHJlY29kZSBsb29wIG9uIGtleSBmcmFtZXMsIGdvbGRlbiBmcmFtZXMgYW5kCisgICAgICAgICAgICAgKiBhbHQgcmVmIGZyYW1lcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZi0+cmVjb2RlX2xvb3AgPSAyOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoU3BlZWQgPiAzKQorICAgICAgICB7CisgICAgICAgICAgICBzZi0+YXV0b19maWx0ZXIgPSAxOworICAgICAgICAgICAgc2YtPnJlY29kZV9sb29wID0gMDsgLyogcmVjb2RlIGxvb3Agb2ZmICovCisgICAgICAgICAgICBzZi0+UkQgPSAwOyAgICAgICAgIC8qIFR1cm4gcmQgb2ZmICovCisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTcGVlZCA+IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNmLT5hdXRvX2ZpbHRlciA9IDA7ICAvKiBGYXN0ZXIgc2VsZWN0aW9uIG9mIGxvb3AgZmlsdGVyICovCisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgMjoKKyAgICAgICAgc2YtPm9wdGltaXplX2NvZWZmaWNpZW50cyA9IDA7CisgICAgICAgIHNmLT5yZWNvZGVfbG9vcCA9IDA7CisgICAgICAgIHNmLT5hdXRvX2ZpbHRlciA9IDE7CisgICAgICAgIHNmLT5pdGVyYXRpdmVfc3ViX3BpeGVsID0gMTsKKyAgICAgICAgc2YtPnNlYXJjaF9tZXRob2QgPSBOU1RFUDsKKworICAgICAgICBpZiAoU3BlZWQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZi0+aW1wcm92ZWRfcXVhbnQgPSAwOworICAgICAgICAgICAgc2YtPmltcHJvdmVkX2RjdCA9IDA7CisKKyAgICAgICAgICAgIHNmLT51c2VfZmFzdHF1YW50X2Zvcl9waWNrID0gMTsKKyAgICAgICAgICAgIHNmLT5ub19za2lwX2Jsb2NrNHg0X3NlYXJjaCA9IDA7CisgICAgICAgICAgICBzZi0+Zmlyc3Rfc3RlcCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3BlZWQgPiAyKQorICAgICAgICAgICAgc2YtPmF1dG9fZmlsdGVyID0gMDsgIC8qIEZhc3RlciBzZWxlY3Rpb24gb2YgbG9vcCBmaWx0ZXIgKi8KKworICAgICAgICBpZiAoU3BlZWQgPiAzKQorICAgICAgICB7CisgICAgICAgICAgICBzZi0+UkQgPSAwOworICAgICAgICAgICAgc2YtPmF1dG9fZmlsdGVyID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTcGVlZCA+IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNmLT5hdXRvX2ZpbHRlciA9IDA7ICAvKiBGYXN0ZXIgc2VsZWN0aW9uIG9mIGxvb3AgZmlsdGVyICovCisgICAgICAgICAgICBzZi0+c2VhcmNoX21ldGhvZCA9IEhFWDsKKyAgICAgICAgICAgIHNmLT5pdGVyYXRpdmVfc3ViX3BpeGVsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTcGVlZCA+IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdW0gPSAwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHRvdGFsX21icyA9IGNtLT5NQnM7CisgICAgICAgICAgICBpbnQgaSwgdGhyZXNoOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHRvdGFsX3NraXA7CisKKyAgICAgICAgICAgIGludCBtaW4gPSAyMDAwOworCisgICAgICAgICAgICBpZiAoY3BpLT5veGNmLmVuY29kZV9icmVha291dCA+IDIwMDApCisgICAgICAgICAgICAgICAgbWluID0gY3BpLT5veGNmLmVuY29kZV9icmVha291dDsKKworICAgICAgICAgICAgbWluID4+PSA3OworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VtICs9IGNwaS0+ZXJyb3JfYmluc1tpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG90YWxfc2tpcCA9IHN1bTsKKyAgICAgICAgICAgIHN1bSA9IDA7CisKKyAgICAgICAgICAgIC8qIGkgc3RhcnRzIGZyb20gMiB0byBtYWtlIHN1cmUgdGhyZXNoIHN0YXJ0ZWQgZnJvbSAyMDQ4ICovCisgICAgICAgICAgICBmb3IgKDsgaSA8IDEwMjQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gY3BpLT5lcnJvcl9iaW5zW2ldOworCisgICAgICAgICAgICAgICAgaWYgKDEwICogc3VtID49ICh1bnNpZ25lZCBpbnQpKGNwaS0+U3BlZWQgLSA2KSoodG90YWxfbWJzIC0gdG90YWxfc2tpcCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB0aHJlc2ggPSAoaSA8PCA3KTsKKworICAgICAgICAgICAgaWYgKHRocmVzaCA8IDIwMDApCisgICAgICAgICAgICAgICAgdGhyZXNoID0gMjAwMDsKKworICAgICAgICAgICAgaWYgKHJlZl9mcmFtZXMgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXMSBdID0gdGhyZXNoOworICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVDEgIF0gPSB0aHJlc2ggPj4gMTsKKyAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVIxICAgICBdID0gdGhyZXNoID4+IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZWZfZnJhbWVzID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FVzJdID0gdGhyZXNoIDw8IDE7CisgICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUMiBdID0gdGhyZXNoOworICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUjIgICAgXSA9IHRocmVzaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlZl9mcmFtZXMgPiAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXM10gPSB0aHJlc2ggPDwgMTsKKyAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1QzIF0gPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSMyAgICBdID0gdGhyZXNoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZi0+aW1wcm92ZWRfbXZfcHJlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3BlZWQgPiA4KQorICAgICAgICAgICAgc2YtPnF1YXJ0ZXJfcGl4ZWxfc2VhcmNoID0gMDsKKworICAgICAgICBpZihjbS0+dmVyc2lvbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjbS0+ZmlsdGVyX3R5cGUgPSBOT1JNQUxfTE9PUEZJTFRFUjsKKworICAgICAgICAgICAgaWYgKFNwZWVkID49IDE0KQorICAgICAgICAgICAgICAgIGNtLT5maWx0ZXJfdHlwZSA9IFNJTVBMRV9MT09QRklMVEVSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY20tPmZpbHRlcl90eXBlID0gU0lNUExFX0xPT1BGSUxURVI7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGlzIGhhcyBhIGJpZyBoaXQgb24gcXVhbGl0eS4gTGFzdCByZXNvcnQgKi8KKyAgICAgICAgaWYgKFNwZWVkID49IDE1KQorICAgICAgICAgICAgc2YtPmhhbGZfcGl4ZWxfc2VhcmNoID0gMDsKKworICAgICAgICB2cHhfbWVtc2V0KGNwaS0+ZXJyb3JfYmlucywgMCwgc2l6ZW9mKGNwaS0+ZXJyb3JfYmlucykpOworCisgICAgfTsgLyogc3dpdGNoICovCisKKyAgICAvKiBTbG93IHF1YW50LCBkY3QgYW5kIHRyZWxsaXMgbm90IHdvcnRod2hpbGUgZm9yIGZpcnN0IHBhc3MKKyAgICAgKiBzbyBtYWtlIHN1cmUgdGhleSBhcmUgYWx3YXlzIHR1cm5lZCBvZmYuCisgICAgICovCisgICAgaWYgKCBjcGktPnBhc3MgPT0gMSApCisgICAgeworICAgICAgICBzZi0+aW1wcm92ZWRfcXVhbnQgPSAwOworICAgICAgICBzZi0+b3B0aW1pemVfY29lZmZpY2llbnRzID0gMDsKKyAgICAgICAgc2YtPmltcHJvdmVkX2RjdCA9IDA7CisgICAgfQorCisgICAgaWYgKGNwaS0+c2Yuc2VhcmNoX21ldGhvZCA9PSBOU1RFUCkKKyAgICB7CisgICAgICAgIHZwOF9pbml0M3Ntb3Rpb25fY29tcGVuc2F0aW9uKCZjcGktPm1iLCBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0ueV9zdHJpZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChjcGktPnNmLnNlYXJjaF9tZXRob2QgPT0gRElBTU9ORCkKKyAgICB7CisgICAgICAgIHZwOF9pbml0X2RzbW90aW9uX2NvbXBlbnNhdGlvbigmY3BpLT5tYiwgY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLnlfc3RyaWRlKTsKKyAgICB9CisKKyAgICBpZiAoY3BpLT5zZi5pbXByb3ZlZF9kY3QpCisgICAgeworICAgICAgICBjcGktPm1iLnNob3J0X2ZkY3Q4eDQgPSB2cDhfc2hvcnRfZmRjdDh4NDsKKyAgICAgICAgY3BpLT5tYi5zaG9ydF9mZGN0NHg0ID0gdnA4X3Nob3J0X2ZkY3Q0eDQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIE5vIGZhc3QgRkRDVCBkZWZpbmVkIGZvciBhbnkgcGxhdGZvcm0gYXQgdGhpcyB0aW1lLiAqLworICAgICAgICBjcGktPm1iLnNob3J0X2ZkY3Q4eDQgPSB2cDhfc2hvcnRfZmRjdDh4NDsKKyAgICAgICAgY3BpLT5tYi5zaG9ydF9mZGN0NHg0ID0gdnA4X3Nob3J0X2ZkY3Q0eDQ7CisgICAgfQorCisgICAgY3BpLT5tYi5zaG9ydF93YWxzaDR4NCA9IHZwOF9zaG9ydF93YWxzaDR4NDsKKworICAgIGlmIChjcGktPnNmLmltcHJvdmVkX3F1YW50KQorICAgIHsKKyAgICAgICAgY3BpLT5tYi5xdWFudGl6ZV9iICAgICAgPSB2cDhfcmVndWxhcl9xdWFudGl6ZV9iOworICAgICAgICBjcGktPm1iLnF1YW50aXplX2JfcGFpciA9IHZwOF9yZWd1bGFyX3F1YW50aXplX2JfcGFpcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3BpLT5tYi5xdWFudGl6ZV9iICAgICAgPSB2cDhfZmFzdF9xdWFudGl6ZV9iOworICAgICAgICBjcGktPm1iLnF1YW50aXplX2JfcGFpciA9IHZwOF9mYXN0X3F1YW50aXplX2JfcGFpcjsKKyAgICB9CisgICAgaWYgKGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQgIT0gbGFzdF9pbXByb3ZlZF9xdWFudCkKKyAgICAgICAgdnA4Y3hfaW5pdF9xdWFudGl6ZXIoY3BpKTsKKworICAgIGlmIChjcGktPnNmLml0ZXJhdGl2ZV9zdWJfcGl4ZWwgPT0gMSkKKyAgICB7CisgICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAgPSB2cDhfZmluZF9iZXN0X3N1Yl9waXhlbF9zdGVwX2l0ZXJhdGl2ZWx5OworICAgIH0KKyAgICBlbHNlIGlmIChjcGktPnNmLnF1YXJ0ZXJfcGl4ZWxfc2VhcmNoKQorICAgIHsKKyAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCA9IHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXA7CisgICAgfQorICAgIGVsc2UgaWYgKGNwaS0+c2YuaGFsZl9waXhlbF9zZWFyY2gpCisgICAgeworICAgICAgICBjcGktPmZpbmRfZnJhY3Rpb25hbF9tdl9zdGVwID0gdnA4X2ZpbmRfYmVzdF9oYWxmX3BpeGVsX3N0ZXA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAgPSB2cDhfc2tpcF9mcmFjdGlvbmFsX212X3N0ZXA7CisgICAgfQorCisgICAgaWYgKGNwaS0+c2Yub3B0aW1pemVfY29lZmZpY2llbnRzID09IDEgJiYgY3BpLT5wYXNzIT0xKQorICAgICAgICBjcGktPm1iLm9wdGltaXplID0gMTsKKyAgICBlbHNlCisgICAgICAgIGNwaS0+bWIub3B0aW1pemUgPSAwOworCisgICAgaWYgKGNwaS0+Y29tbW9uLmZ1bGxfcGl4ZWwpCisgICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAgPSB2cDhfc2tpcF9mcmFjdGlvbmFsX212X3N0ZXA7CisKKyNpZmRlZiBTUEVFRFNUQVRTCisgICAgZnJhbWVzX2F0X3NwZWVkW2NwaS0+U3BlZWRdKys7CisjZW5kaWYKK30KKyN1bmRlZiBHT09ECisjdW5kZWYgUlQKKworc3RhdGljIHZvaWQgYWxsb2NfcmF3X2ZyYW1lX2J1ZmZlcnMoVlA4X0NPTVAgKmNwaSkKK3sKKyNpZiBWUDhfVEVNUE9SQUxfQUxUX1JFRgorICAgIGludCB3aWR0aCA9IChjcGktPm94Y2YuV2lkdGggKyAxNSkgJiB+MTU7CisgICAgaW50IGhlaWdodCA9IChjcGktPm94Y2YuSGVpZ2h0ICsgMTUpICYgfjE1OworI2VuZGlmCisKKyAgICBjcGktPmxvb2thaGVhZCA9IHZwOF9sb29rYWhlYWRfaW5pdChjcGktPm94Y2YuV2lkdGgsIGNwaS0+b3hjZi5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMpOworICAgIGlmKCFjcGktPmxvb2thaGVhZCkKKyAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZjcGktPmNvbW1vbi5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbGFnIGJ1ZmZlcnMiKTsKKworI2lmIFZQOF9URU1QT1JBTF9BTFRfUkVGCisKKyAgICBpZiAodnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKCZjcGktPmFsdF9yZWZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpKQorICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBhbHRyZWYgYnVmZmVyIik7CisKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGRlYWxsb2NfcmF3X2ZyYW1lX2J1ZmZlcnMoVlA4X0NPTVAgKmNwaSkKK3sKKyNpZiBWUDhfVEVNUE9SQUxfQUxUX1JFRgorICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5hbHRfcmVmX2J1ZmZlcik7CisjZW5kaWYKKyAgICB2cDhfbG9va2FoZWFkX2Rlc3Ryb3koY3BpLT5sb29rYWhlYWQpOworfQorCisKK3N0YXRpYyBpbnQgdnA4X2FsbG9jX3BhcnRpdGlvbl9kYXRhKFZQOF9DT01QICpjcGkpCit7CisgICAgICAgIHZweF9mcmVlKGNwaS0+bWIucGlwKTsKKworICAgIGNwaS0+bWIucGlwID0gdnB4X2NhbGxvYygoY3BpLT5jb21tb24ubWJfY29scyArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBBUlRJVElPTl9JTkZPKSk7CisgICAgaWYoIWNwaS0+bWIucGlwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGNwaS0+bWIucGkgPSBjcGktPm1iLnBpcCArIGNwaS0+Y29tbW9uLm1vZGVfaW5mb19zdHJpZGUgKyAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgdnA4X2FsbG9jX2NvbXByZXNzb3JfZGF0YShWUDhfQ09NUCAqY3BpKQoreworICAgIFZQOF9DT01NT04gKmNtID0gJiBjcGktPmNvbW1vbjsKKworICAgIGludCB3aWR0aCA9IGNtLT5XaWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gY20tPkhlaWdodDsKKworICAgIGlmICh2cDhfYWxsb2NfZnJhbWVfYnVmZmVycyhjbSwgd2lkdGgsIGhlaWdodCkpCisgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmY3BpLT5jb21tb24uZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlcnMiKTsKKworICAgIGlmICh2cDhfYWxsb2NfcGFydGl0aW9uX2RhdGEoY3BpKSkKKyAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZjcGktPmNvbW1vbi5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgcGFydGl0aW9uIGRhdGEiKTsKKworCisgICAgaWYgKCh3aWR0aCAmIDB4ZikgIT0gMCkKKyAgICAgICAgd2lkdGggKz0gMTYgLSAod2lkdGggJiAweGYpOworCisgICAgaWYgKChoZWlnaHQgJiAweGYpICE9IDApCisgICAgICAgIGhlaWdodCArPSAxNiAtIChoZWlnaHQgJiAweGYpOworCisKKyAgICBpZiAodnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKCZjcGktPnBpY2tfbGZfbHZsX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpKQorICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBsYXN0IGZyYW1lIGJ1ZmZlciIpOworCisgICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5zY2FsZWRfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpKQorICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBzY2FsZWQgc291cmNlIGJ1ZmZlciIpOworCisgICAgdnB4X2ZyZWUoY3BpLT50b2spOworCisgICAgeworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcKKyAgICAgICAgdW5zaWduZWQgaW50IHRva2VucyA9IDggKiAyNCAqIDE2OyAvKiBvbmUgTUIgZm9yIGVhY2ggdGhyZWFkICovCisjZWxzZQorICAgICAgICB1bnNpZ25lZCBpbnQgdG9rZW5zID0gY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scyAqIDI0ICogMTY7CisjZW5kaWYKKyAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+dG9rLCB2cHhfY2FsbG9jKHRva2Vucywgc2l6ZW9mKCpjcGktPnRvaykpKTsKKyAgICB9CisKKyAgICAvKiBEYXRhIHVzZWQgZm9yIHJlYWwgdGltZSB2YyBtb2RlIHRvIHNlZSBpZiBnZiBuZWVkcyByZWZyZXNoaW5nICovCisgICAgY3BpLT5pbnRlcl96el9jb3VudCA9IDA7CisgICAgY3BpLT56ZXJvbXZfY291bnQgPSAwOworICAgIGNwaS0+Z2ZfYmFkX2NvdW50ID0gMDsKKyAgICBjcGktPmdmX3VwZGF0ZV9yZWNvbW1lbmRlZCA9IDA7CisKKworICAgIC8qIFN0cnVjdHVyZXMgdXNlZCB0byBtb25pdG9yIEdGIHVzYWdlICovCisgICAgdnB4X2ZyZWUoY3BpLT5nZl9hY3RpdmVfZmxhZ3MpOworICAgIENIRUNLX01FTV9FUlJPUihjcGktPmdmX2FjdGl2ZV9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgdnB4X2NhbGxvYyhzaXplb2YoKmNwaS0+Z2ZfYWN0aXZlX2ZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scykpOworICAgIGNwaS0+Z2ZfYWN0aXZlX2NvdW50ID0gY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29sczsKKworICAgIHZweF9mcmVlKGNwaS0+bWJfYWN0aXZpdHlfbWFwKTsKKyAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5tYl9hY3Rpdml0eV9tYXAsCisgICAgICAgICAgICAgICAgICAgIHZweF9jYWxsb2Moc2l6ZW9mKCpjcGktPm1iX2FjdGl2aXR5X21hcCksCisgICAgICAgICAgICAgICAgICAgIGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpKTsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RvcmluZyBsYXN0IGZyYW1lJ3MgTVZzIGZvciBNViBwcmVkaWN0aW9uLiAqLworICAgIHZweF9mcmVlKGNwaS0+bGZtdik7CisgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+bGZtdiwgdnB4X2NhbGxvYygoY20tPm1iX3Jvd3MrMikgKiAoY20tPm1iX2NvbHMrMiksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY3BpLT5sZm12KSkpOworICAgIHZweF9mcmVlKGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhcywKKyAgICAgICAgICAgICAgICAgICAgdnB4X2NhbGxvYygoY20tPm1iX3Jvd3MrMikgKiAoY20tPm1iX2NvbHMrMiksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY3BpLT5sZl9yZWZfZnJhbWVfc2lnbl9iaWFzKSkpOworICAgIHZweF9mcmVlKGNwaS0+bGZfcmVmX2ZyYW1lKTsKKyAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5sZl9yZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIHZweF9jYWxsb2MoKGNtLT5tYl9yb3dzKzIpICogKGNtLT5tYl9jb2xzKzIpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmNwaS0+bGZfcmVmX2ZyYW1lKSkpOworCisgICAgLyogQ3JlYXRlIHRoZSBlbmNvZGVyIHNlZ21lbnRhdGlvbiBtYXAgYW5kIHNldCBhbGwgZW50cmllcyB0byAwICovCisgICAgdnB4X2ZyZWUoY3BpLT5zZWdtZW50YXRpb25fbWFwKTsKKyAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5zZWdtZW50YXRpb25fbWFwLAorICAgICAgICAgICAgICAgICAgICB2cHhfY2FsbG9jKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY3BpLT5zZWdtZW50YXRpb25fbWFwKSkpOworICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9pbmRleCA9IDA7CisgICAgdnB4X2ZyZWUoY3BpLT5hY3RpdmVfbWFwKTsKKyAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5hY3RpdmVfbWFwLAorICAgICAgICAgICAgICAgICAgICB2cHhfY2FsbG9jKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY3BpLT5hY3RpdmVfbWFwKSkpOworICAgIHZweF9tZW1zZXQoY3BpLT5hY3RpdmVfbWFwICwgMSwgKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpKTsKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgIGlmICh3aWR0aCA8IDY0MCkKKyAgICAgICAgY3BpLT5tdF9zeW5jX3JhbmdlID0gMTsKKyAgICBlbHNlIGlmICh3aWR0aCA8PSAxMjgwKQorICAgICAgICBjcGktPm10X3N5bmNfcmFuZ2UgPSA0OworICAgIGVsc2UgaWYgKHdpZHRoIDw9IDI1NjApCisgICAgICAgIGNwaS0+bXRfc3luY19yYW5nZSA9IDg7CisgICAgZWxzZQorICAgICAgICBjcGktPm10X3N5bmNfcmFuZ2UgPSAxNjsKKworICAgIGlmIChjcGktPm94Y2YubXVsdGlfdGhyZWFkZWQgPiAxKQorICAgIHsKKyAgICAgICAgdnB4X2ZyZWUoY3BpLT5tdF9jdXJyZW50X21iX2NvbCk7CisgICAgICAgIENIRUNLX01FTV9FUlJPUihjcGktPm10X2N1cnJlbnRfbWJfY29sLAorICAgICAgICAgICAgICAgICAgICB2cHhfbWFsbG9jKHNpemVvZigqY3BpLT5tdF9jdXJyZW50X21iX2NvbCkgKiBjbS0+bWJfcm93cykpOworICAgIH0KKworI2VuZGlmCisKKyAgICB2cHhfZnJlZShjcGktPnRwbGlzdCk7CisgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+dHBsaXN0LCB2cHhfbWFsbG9jKHNpemVvZihUT0tFTkxJU1QpICogY20tPm1iX3Jvd3MpKTsKK30KKworCisvKiBRdWFudCBNT0QgKi8KK3N0YXRpYyBjb25zdCBpbnQgcV90cmFuc1tdID0KK3sKKyAgICAwLCAgIDEsICAyLCAgMywgIDQsICA1LCAgNywgIDgsCisgICAgOSwgIDEwLCAxMiwgMTMsIDE1LCAxNywgMTgsIDE5LAorICAgIDIwLCAgMjEsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCisgICAgMjksICAzMCwgMzEsIDMzLCAzNSwgMzcsIDM5LCA0MSwKKyAgICA0MywgIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsIDU3LAorICAgIDU5LCAgNjEsIDY0LCA2NywgNzAsIDczLCA3NiwgNzksCisgICAgODIsICA4NSwgODgsIDkxLCA5NCwgOTcsIDEwMCwgMTAzLAorICAgIDEwNiwgMTA5LCAxMTIsIDExNSwgMTE4LCAxMjEsIDEyNCwgMTI3LAorfTsKKworaW50IHZwOF9yZXZlcnNlX3RyYW5zKGludCB4KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGlmIChxX3RyYW5zW2ldID49IHgpCisgICAgICAgICAgICByZXR1cm4gaTsKKworICAgIHJldHVybiA2MzsKK30KK3ZvaWQgdnA4X25ld19mcmFtZV9yYXRlKFZQOF9DT01QICpjcGksIGRvdWJsZSBmcmFtZXJhdGUpCit7CisgICAgaWYoZnJhbWVyYXRlIDwgLjEpCisgICAgICAgIGZyYW1lcmF0ZSA9IDMwOworCisgICAgY3BpLT5mcmFtZV9yYXRlICAgICAgICAgICAgID0gZnJhbWVyYXRlOworICAgIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUgICAgICA9IGZyYW1lcmF0ZTsKKyAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggICAgPSAoaW50KShjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSk7CisgICAgY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoOworICAgIGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aCAgICA9IChpbnQpKGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLnR3b19wYXNzX3Zicm1pbl9zZWN0aW9uIC8gMTAwKTsKKworICAgIC8qIFNldCBNYXhpbXVtIGdmL2FyZiBpbnRlcnZhbCAqLworICAgIGNwaS0+bWF4X2dmX2ludGVydmFsID0gKChpbnQpKGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUgLyAyLjApICsgMik7CisKKyAgICBpZihjcGktPm1heF9nZl9pbnRlcnZhbCA8IDEyKQorICAgICAgICBjcGktPm1heF9nZl9pbnRlcnZhbCA9IDEyOworCisgICAgLyogRXh0ZW5kZWQgaW50ZXJ2YWwgZm9yIGdlbnVpbmVseSBzdGF0aWMgc2NlbmVzICovCisgICAgY3BpLT50d29wYXNzLnN0YXRpY19zY2VuZV9tYXhfZ2ZfaW50ZXJ2YWwgPSBjcGktPmtleV9mcmFtZV9mcmVxdWVuY3kgPj4gMTsKKworICAgICAvKiBTcGVjaWFsIGNvbmRpdGlvbnMgd2hlbiBhbHRyIHJlZiBmcmFtZSBlbmFibGVkIGluIGxhZ2dlZCBjb21wcmVzcyBtb2RlICovCisgICAgaWYgKGNwaS0+b3hjZi5wbGF5X2FsdGVybmF0ZSAmJiBjcGktPm94Y2YubGFnX2luX2ZyYW1lcykKKyAgICB7CisgICAgICAgIGlmIChjcGktPm1heF9nZl9pbnRlcnZhbCA+IGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzIC0gMSkKKyAgICAgICAgICAgIGNwaS0+bWF4X2dmX2ludGVydmFsID0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgLSAxOworCisgICAgICAgIGlmIChjcGktPnR3b3Bhc3Muc3RhdGljX3NjZW5lX21heF9nZl9pbnRlcnZhbCA+IGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzIC0gMSkKKyAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5zdGF0aWNfc2NlbmVfbWF4X2dmX2ludGVydmFsID0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgLSAxOworICAgIH0KKworICAgIGlmICggY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgPiBjcGktPnR3b3Bhc3Muc3RhdGljX3NjZW5lX21heF9nZl9pbnRlcnZhbCApCisgICAgICAgIGNwaS0+bWF4X2dmX2ludGVydmFsID0gY3BpLT50d29wYXNzLnN0YXRpY19zY2VuZV9tYXhfZ2ZfaW50ZXJ2YWw7Cit9CisKKworc3RhdGljIGludAorcmVzY2FsZShpbnQgdmFsLCBpbnQgbnVtLCBpbnQgZGVub20pCit7CisgICAgaW50NjRfdCBsbG51bSA9IG51bTsKKyAgICBpbnQ2NF90IGxsZGVuID0gZGVub207CisgICAgaW50NjRfdCBsbHZhbCA9IHZhbDsKKworICAgIHJldHVybiAoaW50KShsbHZhbCAqIGxsbnVtIC8gbGxkZW4pOworfQorCisKK3N0YXRpYyB2b2lkIGluaXRfY29uZmlnKFZQOF9DT01QICpjcGksIFZQOF9DT05GSUcgKm94Y2YpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisKKyAgICBjcGktPm94Y2YgPSAqb3hjZjsKKworICAgIGNwaS0+YXV0b19nb2xkID0gMTsKKyAgICBjcGktPmF1dG9fYWRqdXN0X2dvbGRfcXVhbnRpemVyID0gMTsKKworICAgIGNtLT52ZXJzaW9uID0gb3hjZi0+VmVyc2lvbjsKKyAgICB2cDhfc2V0dXBfdmVyc2lvbihjbSk7CisKKyAgICAvKiBmcmFtZSByYXRlIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGZpcnN0IGZyYW1lLCBhcyBpdCdzIGRlcml2ZWQgZnJvbQorICAgICAqIHRoZSBvYnNlcnZlZCB0aW1lc3RhbXBzLiBUaGUgYWN0dWFsIHZhbHVlIHVzZWQgaGVyZSBkb2Vzbid0IG1hdHRlcgorICAgICAqIHRvbyBtdWNoLCBhcyBpdCB3aWxsIGFkYXB0IHF1aWNrbHkuIElmIHRoZSByZWNpcHJvY2FsIG9mIHRoZSB0aW1lYmFzZQorICAgICAqIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIGZyYW1lcmF0ZSwgdGhlbiB1c2UgdGhhdCBhcyBhIGd1ZXNzLCBvdGhlcndpc2UKKyAgICAgKiB1c2UgMzAuCisgICAgICovCisgICAgY3BpLT5mcmFtZV9yYXRlID0gKGRvdWJsZSkob3hjZi0+dGltZWJhc2UuZGVuKSAvCisgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkob3hjZi0+dGltZWJhc2UubnVtKTsKKworICAgIGlmIChjcGktPmZyYW1lX3JhdGUgPiAxODApCisgICAgICAgIGNwaS0+ZnJhbWVfcmF0ZSA9IDMwOworCisgICAgY3BpLT5yZWZfZnJhbWVfcmF0ZSA9IGNwaS0+ZnJhbWVfcmF0ZTsKKworICAgIC8qIGNoYW5nZSBpbmNsdWRlcyBhbGwgam9pbnQgZnVuY3Rpb25hbGl0eSAqLworICAgIHZwOF9jaGFuZ2VfY29uZmlnKGNwaSwgb3hjZik7CisKKyAgICAvKiBJbml0aWFsaXplIGFjdGl2ZSBiZXN0IGFuZCB3b3JzdCBxIGFuZCBhdmVyYWdlIHEgdmFsdWVzLiAqLworICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgICAgICAgICA9IGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3E7CisgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ICAgICAgICAgID0gY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xOworICAgIGNwaS0+YXZnX2ZyYW1lX3FpbmRleCAgICAgICAgICAgICA9IGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3E7CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBzdGFydGluZyBidWZmZXIgbGV2ZWxzICovCisgICAgY3BpLT5idWZmZXJfbGV2ZWwgICAgICAgICAgICAgICAgID0gY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbDsKKyAgICBjcGktPmJpdHNfb2ZmX3RhcmdldCAgICAgICAgICAgICAgPSBjcGktPm94Y2Yuc3RhcnRpbmdfYnVmZmVyX2xldmVsOworCisgICAgY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzICAgICAgICAgID0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOworICAgIGNwaS0+cm9sbGluZ19hY3R1YWxfYml0cyAgICAgICAgICA9IGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aDsKKyAgICBjcGktPmxvbmdfcm9sbGluZ190YXJnZXRfYml0cyAgICAgPSBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgY3BpLT5sb25nX3JvbGxpbmdfYWN0dWFsX2JpdHMgICAgID0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOworCisgICAgY3BpLT50b3RhbF9hY3R1YWxfYml0cyAgICAgICAgICAgID0gMDsKKyAgICBjcGktPnRvdGFsX3RhcmdldF92c19hY3R1YWwgICAgICAgPSAwOworCisgICAgLyogVGVtcG9yYWwgc2NhbGFiaWx0eSAqLworICAgIGlmIChjcGktPm94Y2YubnVtYmVyX29mX2xheWVycyA+IDEpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZG91YmxlIHByZXZfbGF5ZXJfZnJhbWVfcmF0ZT0wOworCisgICAgICAgIGZvciAoaT0wOyBpPGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIExBWUVSX0NPTlRFWFQgKmxjID0gJmNwaS0+bGF5ZXJfY29udGV4dFtpXTsKKworICAgICAgICAgICAgLyogTGF5ZXIgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgbGMtPmZyYW1lX3JhdGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSAvIGNwaS0+b3hjZi5yYXRlX2RlY2ltYXRvcltpXTsKKyAgICAgICAgICAgIGxjLT50YXJnZXRfYmFuZHdpZHRoID0gY3BpLT5veGNmLnRhcmdldF9iaXRyYXRlW2ldICogMTAwMDsKKworICAgICAgICAgICAgbGMtPnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbF9pbl9tcyA9IG94Y2YtPnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbDsKKyAgICAgICAgICAgIGxjLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbF9pbl9tcyAgPSBveGNmLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbDsKKyAgICAgICAgICAgIGxjLT5tYXhpbXVtX2J1ZmZlcl9zaXplX2luX21zICAgPSBveGNmLT5tYXhpbXVtX2J1ZmZlcl9zaXplOworCisgICAgICAgICAgICBsYy0+c3RhcnRpbmdfYnVmZmVyX2xldmVsID0KKyAgICAgICAgICAgICAgcmVzY2FsZSgoaW50KShveGNmLT5zdGFydGluZ19idWZmZXJfbGV2ZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYy0+dGFyZ2V0X2JhbmR3aWR0aCwgMTAwMCk7CisKKyAgICAgICAgICAgIGlmIChveGNmLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIGxjLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA9IGxjLT50YXJnZXRfYmFuZHdpZHRoIC8gODsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYy0+b3B0aW1hbF9idWZmZXJfbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgcmVzY2FsZSgoaW50KShveGNmLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT50YXJnZXRfYmFuZHdpZHRoLCAxMDAwKTsKKworICAgICAgICAgICAgaWYgKG94Y2YtPm1heGltdW1fYnVmZmVyX3NpemUgPT0gMCkKKyAgICAgICAgICAgICAgICBsYy0+bWF4aW11bV9idWZmZXJfc2l6ZSA9IGxjLT50YXJnZXRfYmFuZHdpZHRoIC8gODsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYy0+bWF4aW11bV9idWZmZXJfc2l6ZSA9CisgICAgICAgICAgICAgICAgICByZXNjYWxlKChpbnQpb3hjZi0+bWF4aW11bV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnRhcmdldF9iYW5kd2lkdGgsIDEwMDApOworCisgICAgICAgICAgICAvKiBXb3JrIG91dCB0aGUgYXZlcmFnZSBzaXplIG9mIGEgZnJhbWUgd2l0aGluIHRoaXMgbGF5ZXIgKi8KKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBsYy0+YXZnX2ZyYW1lX3NpemVfZm9yX2xheWVyID0KKyAgICAgICAgICAgICAgICAgIChpbnQpKChjcGktPm94Y2YudGFyZ2V0X2JpdHJhdGVbaV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+b3hjZi50YXJnZXRfYml0cmF0ZVtpLTFdKSAqIDEwMDAgLworICAgICAgICAgICAgICAgICAgICAgICAgKGxjLT5mcmFtZV9yYXRlIC0gcHJldl9sYXllcl9mcmFtZV9yYXRlKSk7CisKKyAgICAgICAgICAgIGxjLT5hY3RpdmVfd29yc3RfcXVhbGl0eSAgICAgICAgID0gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcTsKKyAgICAgICAgICAgIGxjLT5hY3RpdmVfYmVzdF9xdWFsaXR5ICAgICAgICAgID0gY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xOworICAgICAgICAgICAgbGMtPmF2Z19mcmFtZV9xaW5kZXggICAgICAgICAgICAgPSBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xOworCisgICAgICAgICAgICBsYy0+YnVmZmVyX2xldmVsICAgICAgICAgICAgICAgICA9IGxjLT5zdGFydGluZ19idWZmZXJfbGV2ZWw7CisgICAgICAgICAgICBsYy0+Yml0c19vZmZfdGFyZ2V0ICAgICAgICAgICAgICA9IGxjLT5zdGFydGluZ19idWZmZXJfbGV2ZWw7CisKKyAgICAgICAgICAgIGxjLT50b3RhbF9hY3R1YWxfYml0cyAgICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgbGMtPm5pX2F2X3FpICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICBsYy0+bmlfdG90X3FpICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIGxjLT5uaV9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgbGMtPnJhdGVfY29ycmVjdGlvbl9mYWN0b3IgICAgICAgICAgICA9IDEuMDsKKyAgICAgICAgICAgIGxjLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciAgPSAxLjA7CisgICAgICAgICAgICBsYy0+Z2ZfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciAgICAgICAgID0gMS4wOworICAgICAgICAgICAgbGMtPmludGVyX2ZyYW1lX3RhcmdldCAgICAgICAgICAgICAgICA9IDA7CisKKyAgICAgICAgICAgIHByZXZfbGF5ZXJfZnJhbWVfcmF0ZSA9IGxjLT5mcmFtZV9yYXRlOworICAgICAgICB9CisgICAgfQorCisjaWYgVlA4X1RFTVBPUkFMX0FMVF9SRUYKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGNwaS0+Zml4ZWRfZGl2aWRlWzBdID0gMDsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTEyOyBpKyspCisgICAgICAgICAgICBjcGktPmZpeGVkX2RpdmlkZVtpXSA9IDB4ODAwMDAgLyBpOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfbGF5ZXJfY29udGV4dHMgKFZQOF9DT01QICpjcGkpCit7CisgICAgVlA4X0NPTkZJRyAqb3hjZiA9ICZjcGktPm94Y2Y7CisKKyAgICAvKiBVcGRhdGUgc25hcHNob3RzIG9mIHRoZSBsYXllciBjb250ZXh0cyB0byByZWZsZWN0IG5ldyBwYXJhbWV0ZXJzICovCisgICAgaWYgKG94Y2YtPm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGRvdWJsZSBwcmV2X2xheWVyX2ZyYW1lX3JhdGU9MDsKKworICAgICAgICBmb3IgKGk9MDsgaTxveGNmLT5udW1iZXJfb2ZfbGF5ZXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIExBWUVSX0NPTlRFWFQgKmxjID0gJmNwaS0+bGF5ZXJfY29udGV4dFtpXTsKKworICAgICAgICAgICAgbGMtPmZyYW1lX3JhdGUgPQorICAgICAgICAgICAgICAgIGNwaS0+cmVmX2ZyYW1lX3JhdGUgLyBveGNmLT5yYXRlX2RlY2ltYXRvcltpXTsKKyAgICAgICAgICAgIGxjLT50YXJnZXRfYmFuZHdpZHRoID0gb3hjZi0+dGFyZ2V0X2JpdHJhdGVbaV0gKiAxMDAwOworCisgICAgICAgICAgICBsYy0+c3RhcnRpbmdfYnVmZmVyX2xldmVsID0gcmVzY2FsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClveGNmLT5zdGFydGluZ19idWZmZXJfbGV2ZWxfaW5fbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT50YXJnZXRfYmFuZHdpZHRoLCAxMDAwKTsKKworICAgICAgICAgICAgaWYgKG94Y2YtPm9wdGltYWxfYnVmZmVyX2xldmVsID09IDApCisgICAgICAgICAgICAgICAgbGMtPm9wdGltYWxfYnVmZmVyX2xldmVsID0gbGMtPnRhcmdldF9iYW5kd2lkdGggLyA4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxjLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA9IHJlc2NhbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpb3hjZi0+b3B0aW1hbF9idWZmZXJfbGV2ZWxfaW5fbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT50YXJnZXRfYmFuZHdpZHRoLCAxMDAwKTsKKworICAgICAgICAgICAgaWYgKG94Y2YtPm1heGltdW1fYnVmZmVyX3NpemUgPT0gMCkKKyAgICAgICAgICAgICAgICBsYy0+bWF4aW11bV9idWZmZXJfc2l6ZSA9IGxjLT50YXJnZXRfYmFuZHdpZHRoIC8gODsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYy0+bWF4aW11bV9idWZmZXJfc2l6ZSA9IHJlc2NhbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpb3hjZi0+bWF4aW11bV9idWZmZXJfc2l6ZV9pbl9tcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnRhcmdldF9iYW5kd2lkdGgsIDEwMDApOworCisgICAgICAgICAgICAvKiBXb3JrIG91dCB0aGUgYXZlcmFnZSBzaXplIG9mIGEgZnJhbWUgd2l0aGluIHRoaXMgbGF5ZXIgKi8KKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBsYy0+YXZnX2ZyYW1lX3NpemVfZm9yX2xheWVyID0KKyAgICAgICAgICAgICAgICAgICAoaW50KSgob3hjZi0+dGFyZ2V0X2JpdHJhdGVbaV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICBveGNmLT50YXJnZXRfYml0cmF0ZVtpLTFdKSAqIDEwMDAgLworICAgICAgICAgICAgICAgICAgICAgICAgICAobGMtPmZyYW1lX3JhdGUgLSBwcmV2X2xheWVyX2ZyYW1lX3JhdGUpKTsKKworICAgICAgICAgICAgcHJldl9sYXllcl9mcmFtZV9yYXRlID0gbGMtPmZyYW1lX3JhdGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdnA4X2NoYW5nZV9jb25maWcoVlA4X0NPTVAgKmNwaSwgVlA4X0NPTkZJRyAqb3hjZikKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKyAgICBpbnQgbGFzdF93LCBsYXN0X2g7CisKKyAgICBpZiAoIWNwaSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFveGNmKQorICAgICAgICByZXR1cm47CisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICAvKiAgd2FpdCBmb3IgdGhlIGxhc3QgcGljdHVyZSBsb29wZmlsdGVyIHRocmVhZCBkb25lICovCisgICAgaWYgKGNwaS0+Yl9scGZfcnVubmluZykKKyAgICB7CisgICAgICAgIHNlbV93YWl0KCZjcGktPmhfZXZlbnRfZW5kX2xwZik7CisgICAgICAgIGNwaS0+Yl9scGZfcnVubmluZyA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoY20tPnZlcnNpb24gIT0gb3hjZi0+VmVyc2lvbikKKyAgICB7CisgICAgICAgIGNtLT52ZXJzaW9uID0gb3hjZi0+VmVyc2lvbjsKKyAgICAgICAgdnA4X3NldHVwX3ZlcnNpb24oY20pOworICAgIH0KKworICAgIGxhc3RfdyA9IGNwaS0+b3hjZi5XaWR0aDsKKyAgICBsYXN0X2ggPSBjcGktPm94Y2YuSGVpZ2h0OworCisgICAgY3BpLT5veGNmID0gKm94Y2Y7CisKKyAgICBzd2l0Y2ggKGNwaS0+b3hjZi5Nb2RlKQorICAgIHsKKworICAgIGNhc2UgTU9ERV9SRUFMVElNRToKKyAgICAgICAgY3BpLT5wYXNzID0gMDsKKyAgICAgICAgY3BpLT5jb21wcmVzc29yX3NwZWVkID0gMjsKKworICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkIDwgLTE2KQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPm94Y2YuY3B1X3VzZWQgPSAtMTY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkID4gMTYpCisgICAgICAgICAgICBjcGktPm94Y2YuY3B1X3VzZWQgPSAxNjsKKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV9HT09EUVVBTElUWToKKyAgICAgICAgY3BpLT5wYXNzID0gMDsKKyAgICAgICAgY3BpLT5jb21wcmVzc29yX3NwZWVkID0gMTsKKworICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkIDwgLTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+b3hjZi5jcHVfdXNlZCA9IC01OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA+IDUpCisgICAgICAgICAgICBjcGktPm94Y2YuY3B1X3VzZWQgPSA1OworCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNT0RFX0JFU1RRVUFMSVRZOgorICAgICAgICBjcGktPnBhc3MgPSAwOworICAgICAgICBjcGktPmNvbXByZXNzb3Jfc3BlZWQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV9GSVJTVFBBU1M6CisgICAgICAgIGNwaS0+cGFzcyA9IDE7CisgICAgICAgIGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9TRUNPTkRQQVNTOgorICAgICAgICBjcGktPnBhc3MgPSAyOworICAgICAgICBjcGktPmNvbXByZXNzb3Jfc3BlZWQgPSAxOworCisgICAgICAgIGlmIChjcGktPm94Y2YuY3B1X3VzZWQgPCAtNSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5veGNmLmNwdV91c2VkID0gLTU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkID4gNSkKKyAgICAgICAgICAgIGNwaS0+b3hjZi5jcHVfdXNlZCA9IDU7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1NFQ09ORFBBU1NfQkVTVDoKKyAgICAgICAgY3BpLT5wYXNzID0gMjsKKyAgICAgICAgY3BpLT5jb21wcmVzc29yX3NwZWVkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNwaS0+cGFzcyA9PSAwKQorICAgICAgICBjcGktPmF1dG9fd29yc3RfcSA9IDE7CisKKyAgICBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xID0gcV90cmFuc1tveGNmLT53b3JzdF9hbGxvd2VkX3FdOworICAgIGNwaS0+b3hjZi5iZXN0X2FsbG93ZWRfcSA9IHFfdHJhbnNbb3hjZi0+YmVzdF9hbGxvd2VkX3FdOworICAgIGNwaS0+b3hjZi5jcV9sZXZlbCA9IHFfdHJhbnNbY3BpLT5veGNmLmNxX2xldmVsXTsKKworICAgIGlmIChveGNmLT5maXhlZF9xID49IDApCisgICAgeworICAgICAgICBpZiAob3hjZi0+d29yc3RfYWxsb3dlZF9xIDwgMCkKKyAgICAgICAgICAgIGNwaS0+b3hjZi5maXhlZF9xID0gcV90cmFuc1swXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3BpLT5veGNmLmZpeGVkX3EgPSBxX3RyYW5zW294Y2YtPndvcnN0X2FsbG93ZWRfcV07CisKKyAgICAgICAgaWYgKG94Y2YtPmFsdF9xIDwgMCkKKyAgICAgICAgICAgIGNwaS0+b3hjZi5hbHRfcSA9IHFfdHJhbnNbMF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwaS0+b3hjZi5hbHRfcSA9IHFfdHJhbnNbb3hjZi0+YWx0X3FdOworCisgICAgICAgIGlmIChveGNmLT5rZXlfcSA8IDApCisgICAgICAgICAgICBjcGktPm94Y2Yua2V5X3EgPSBxX3RyYW5zWzBdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcGktPm94Y2Yua2V5X3EgPSBxX3RyYW5zW294Y2YtPmtleV9xXTsKKworICAgICAgICBpZiAob3hjZi0+Z29sZF9xIDwgMCkKKyAgICAgICAgICAgIGNwaS0+b3hjZi5nb2xkX3EgPSBxX3RyYW5zWzBdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcGktPm94Y2YuZ29sZF9xID0gcV90cmFuc1tveGNmLT5nb2xkX3FdOworCisgICAgfQorCisgICAgY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCA9CisgICAgICAgIGNwaS0+b3hjZi5hbHRfZnJlcSA/IGNwaS0+b3hjZi5hbHRfZnJlcSA6IERFRkFVTFRfR0ZfSU5URVJWQUw7CisKKyAgICBjcGktPnJlZl9mcmFtZV9mbGFncyA9IFZQOF9BTFRSX0ZSQU1FIHwgVlA4X0dPTERfRlJBTUUgfCBWUDhfTEFTVF9GUkFNRTsKKworICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9IDA7CisgICAgY20tPnJlZnJlc2hfbGFzdF9mcmFtZSA9IDE7CisgICAgY20tPnJlZnJlc2hfZW50cm9weV9wcm9icyA9IDE7CisKKyNpZiAoQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORykKKyAgICBjcGktPm94Y2YudG9rZW5fcGFydGl0aW9ucyA9IDM7CisjZW5kaWYKKworICAgIGlmIChjcGktPm94Y2YudG9rZW5fcGFydGl0aW9ucyA+PSAwICYmIGNwaS0+b3hjZi50b2tlbl9wYXJ0aXRpb25zIDw9IDMpCisgICAgICAgIGNtLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24gPQorICAgICAgICAgICAgKFRPS0VOX1BBUlRJVElPTikgY3BpLT5veGNmLnRva2VuX3BhcnRpdGlvbnM7CisKKyAgICBzZXR1cF9mZWF0dXJlcyhjcGkpOworCisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01CX1NFR01FTlRTOyBpKyspCisgICAgICAgICAgICBjcGktPnNlZ21lbnRfZW5jb2RlX2JyZWFrb3V0W2ldID0gY3BpLT5veGNmLmVuY29kZV9icmVha291dDsKKyAgICB9CisKKyAgICAvKiBBdCB0aGUgbW9tZW50IHRoZSBmaXJzdCBvcmRlciB2YWx1ZXMgbWF5IG5vdCBiZSA+IE1BWFEgKi8KKyAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPiBNQVhRKQorICAgICAgICBjcGktPm94Y2YuZml4ZWRfcSA9IE1BWFE7CisKKyAgICAvKiBsb2NhbCBmaWxlIHBsYXliYWNrIG1vZGUgPT0gcmVhbGx5IGJpZyBidWZmZXIgKi8KKyAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9MT0NBTF9GSUxFX1BMQVlCQUNLKQorICAgIHsKKyAgICAgICAgY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbCAgICAgICA9IDYwMDAwOworICAgICAgICBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgICAgICAgID0gNjAwMDA7CisgICAgICAgIGNwaS0+b3hjZi5tYXhpbXVtX2J1ZmZlcl9zaXplICAgICAgICAgPSAyNDAwMDA7CisgICAgICAgIGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWxfaW5fbXMgPSA2MDAwMDsKKyAgICAgICAgY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsX2luX21zICA9IDYwMDAwOworICAgICAgICBjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZV9pbl9tcyAgID0gMjQwMDAwOworICAgIH0KKworICAgIC8qIENvbnZlcnQgdGFyZ2V0IGJhbmR3aWR0aCBmcm9tIEtiaXQvcyB0byBCaXQvcyAqLworICAgIGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoICAgICAgICo9IDEwMDA7CisKKyAgICBjcGktPm94Y2Yuc3RhcnRpbmdfYnVmZmVyX2xldmVsID0KKyAgICAgICAgcmVzY2FsZSgoaW50KWNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwsCisgICAgICAgICAgICAgICAgY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGgsIDEwMDApOworCisgICAgLyogU2V0IG9yIHJlc2V0IG9wdGltYWwgYW5kIG1heGltdW0gYnVmZmVyIGxldmVscy4gKi8KKyAgICBpZiAoY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsID09IDApCisgICAgICAgIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA9IGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gODsKKyAgICBlbHNlCisgICAgICAgIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA9CisgICAgICAgICAgICByZXNjYWxlKChpbnQpY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsLAorICAgICAgICAgICAgICAgICAgICBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCwgMTAwMCk7CisKKyAgICBpZiAoY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUgPT0gMCkKKyAgICAgICAgY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUgPSBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAvIDg7CisgICAgZWxzZQorICAgICAgICBjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSA9CisgICAgICAgICAgICByZXNjYWxlKChpbnQpY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoLCAxMDAwKTsKKworICAgIC8qIFNldCB1cCBmcmFtZSByYXRlIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMgcmF0ZSBjb250cm9sIHZhbHVlcy4gKi8KKyAgICB2cDhfbmV3X2ZyYW1lX3JhdGUoY3BpLCBjcGktPmZyYW1lX3JhdGUpOworCisgICAgLyogU2V0IGFic29sdXRlIHVwcGVyIGFuZCBsb3dlciBxdWFsaXR5IGxpbWl0cyAqLworICAgIGNwaS0+d29yc3RfcXVhbGl0eSAgICAgICAgICAgICAgID0gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcTsKKyAgICBjcGktPmJlc3RfcXVhbGl0eSAgICAgICAgICAgICAgICA9IGNwaS0+b3hjZi5iZXN0X2FsbG93ZWRfcTsKKworICAgIC8qIGFjdGl2ZSB2YWx1ZXMgc2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgaWYgb3V0IG9mIG5ldyByYW5nZSAqLworICAgIGlmIChjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID4gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcSkKKyAgICB7CisgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcTsKKyAgICB9CisgICAgLyogbGVzcyBsaWtlbHkgKi8KKyAgICBlbHNlIGlmIChjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IDwgY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xKQorICAgIHsKKyAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPm94Y2YuYmVzdF9hbGxvd2VkX3E7CisgICAgfQorICAgIGlmIChjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPCBjcGktPm94Y2YuYmVzdF9hbGxvd2VkX3EpCisgICAgeworICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xOworICAgIH0KKyAgICAvKiBsZXNzIGxpa2VseSAqLworICAgIGVsc2UgaWYgKGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA+IGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3EpCisgICAgeworICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcTsKKyAgICB9CisKKyAgICBjcGktPmJ1ZmZlcmVkX21vZGUgPSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgPiAwOworCisgICAgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSA9IGNwaS0+b3hjZi5jcV9sZXZlbDsKKworICAgIC8qIE9ubHkgYWxsb3cgZHJvcHBlZCBmcmFtZXMgaW4gYnVmZmVyZWQgbW9kZSAqLworICAgIGNwaS0+ZHJvcF9mcmFtZXNfYWxsb3dlZCA9IGNwaS0+b3hjZi5hbGxvd19kZiAmJiBjcGktPmJ1ZmZlcmVkX21vZGU7CisKKyAgICBjcGktPnRhcmdldF9iYW5kd2lkdGggPSBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aDsKKworCisgICAgY20tPldpZHRoICAgICAgID0gY3BpLT5veGNmLldpZHRoOworICAgIGNtLT5IZWlnaHQgICAgICA9IGNwaS0+b3hjZi5IZWlnaHQ7CisKKyAgICAvKiBUT0RPKGprb2xlc3phcik6IGlmIGFuIGludGVybmFsIHNwYXRpYWwgcmVzYW1wbGluZyBpcyBhY3RpdmUsCisgICAgICogYW5kIHdlIGRvd25zaXplIHRoZSBpbnB1dCBpbWFnZSwgbWF5YmUgd2Ugc2hvdWxkIGNsZWFyIHRoZQorICAgICAqIGludGVybmFsIHNjYWxlIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGl0IHRvCisgICAgICogY29ycmVjdC4KKyAgICAgKi8KKworICAgIC8qIFZQOCBzaGFycG5lc3MgbGV2ZWwgbWFwcGluZyAwLTcgKHZzIDAtMTAgaW4gZ2VuZXJhbCBWUHggZGlhbG9ncykgKi8KKyAgICBpZiAoY3BpLT5veGNmLlNoYXJwbmVzcyA+IDcpCisgICAgICAgIGNwaS0+b3hjZi5TaGFycG5lc3MgPSA3OworCisgICAgY20tPnNoYXJwbmVzc19sZXZlbCA9IGNwaS0+b3hjZi5TaGFycG5lc3M7CisKKyAgICBpZiAoY20tPmhvcml6X3NjYWxlICE9IE5PUk1BTCB8fCBjbS0+dmVydF9zY2FsZSAhPSBOT1JNQUwpCisgICAgeworICAgICAgICBpbnQgVU5JTklUSUFMSVpFRF9JU19TQUZFKGhyKSwgVU5JTklUSUFMSVpFRF9JU19TQUZFKGhzKTsKKyAgICAgICAgaW50IFVOSU5JVElBTElaRURfSVNfU0FGRSh2ciksIFVOSU5JVElBTElaRURfSVNfU0FGRSh2cyk7CisKKyAgICAgICAgU2NhbGUyUmF0aW8oY20tPmhvcml6X3NjYWxlLCAmaHIsICZocyk7CisgICAgICAgIFNjYWxlMlJhdGlvKGNtLT52ZXJ0X3NjYWxlLCAmdnIsICZ2cyk7CisKKyAgICAgICAgLyogYWx3YXlzIGdvIHRvIHRoZSBuZXh0IHdob2xlIG51bWJlciAqLworICAgICAgICBjbS0+V2lkdGggPSAoaHMgLSAxICsgY3BpLT5veGNmLldpZHRoICogaHIpIC8gaHM7CisgICAgICAgIGNtLT5IZWlnaHQgPSAodnMgLSAxICsgY3BpLT5veGNmLkhlaWdodCAqIHZyKSAvIHZzOworICAgIH0KKworICAgIGlmIChsYXN0X3cgIT0gY3BpLT5veGNmLldpZHRoIHx8IGxhc3RfaCAhPSBjcGktPm94Y2YuSGVpZ2h0KQorICAgICAgICBjcGktPmZvcmNlX25leHRfZnJhbWVfaW50cmEgPSAxOworCisgICAgaWYgKCgoY20tPldpZHRoICsgMTUpICYgMHhmZmZmZmZmMCkgIT0KKyAgICAgICAgICBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0ueV93aWR0aCB8fAorICAgICAgICAoKGNtLT5IZWlnaHQgKyAxNSkgJiAweGZmZmZmZmYwKSAhPQorICAgICAgICAgIGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS55X2hlaWdodCB8fAorICAgICAgICBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0ueV93aWR0aCA9PSAwKQorICAgIHsKKyAgICAgICAgZGVhbGxvY19yYXdfZnJhbWVfYnVmZmVycyhjcGkpOworICAgICAgICBhbGxvY19yYXdfZnJhbWVfYnVmZmVycyhjcGkpOworICAgICAgICB2cDhfYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7CisgICAgfQorCisgICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDApCisgICAgeworICAgICAgICBjcGktPmxhc3RfcVswXSA9IGNwaS0+b3hjZi5maXhlZF9xOworICAgICAgICBjcGktPmxhc3RfcVsxXSA9IGNwaS0+b3hjZi5maXhlZF9xOworICAgIH0KKworICAgIGNwaS0+U3BlZWQgPSBjcGktPm94Y2YuY3B1X3VzZWQ7CisKKyAgICAvKiBmb3JjZSB0byBhbGxvd2xhZyB0byAwIGlmIGxhZ19pbl9mcmFtZXMgaXMgMDsgKi8KKyAgICBpZiAoY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgPT0gMCkKKyAgICB7CisgICAgICAgIGNwaS0+b3hjZi5hbGxvd19sYWcgPSAwOworICAgIH0KKyAgICAvKiBMaW1pdCBvbiBsYWcgYnVmZmVycyBhcyB0aGVzZSBhcmUgbm90IGN1cnJlbnRseSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KKyAgICBlbHNlIGlmIChjcGktPm94Y2YubGFnX2luX2ZyYW1lcyA+IE1BWF9MQUdfQlVGRkVSUykKKyAgICAgICAgY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgPSBNQVhfTEFHX0JVRkZFUlM7CisKKyAgICAvKiBZWCBUZW1wICovCisgICAgY3BpLT5hbHRfcmVmX3NvdXJjZSA9IE5VTEw7CisgICAgY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiA9IDA7CisKKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisgICAgaWYgKGNwaS0+b3hjZi5ub2lzZV9zZW5zaXRpdml0eSkKKyAgICB7CisgICAgICBpZiAoIWNwaS0+ZGVub2lzZXIueXYxMl9tY19ydW5uaW5nX2F2Zy5idWZmZXJfYWxsb2MpCisgICAgICB7CisgICAgICAgIGludCB3aWR0aCA9IChjcGktPm94Y2YuV2lkdGggKyAxNSkgJiB+MTU7CisgICAgICAgIGludCBoZWlnaHQgPSAoY3BpLT5veGNmLkhlaWdodCArIDE1KSAmIH4xNTsKKyAgICAgICAgdnA4X2Rlbm9pc2VyX2FsbG9jYXRlKCZjcGktPmRlbm9pc2VyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIDAKKyAgICAvKiBFeHBlcmltZW50YWwgUkQgQ29kZSAqLworICAgIGNwaS0+ZnJhbWVfZGlzdG9ydGlvbiA9IDA7CisgICAgY3BpLT5sYXN0X2ZyYW1lX2Rpc3RvcnRpb24gPSAwOworI2VuZGlmCisKK30KKworI2RlZmluZSBNX0xPRzJfRSAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNworI2RlZmluZSBsb2cyZih4KSAobG9nICh4KSAvIChmbG9hdCkgTV9MT0cyX0UpCitzdGF0aWMgdm9pZCBjYWxfbXZzYWRjb3N0cyhpbnQgKm12c2FkY29zdFsyXSkKK3sKKyAgICBpbnQgaSA9IDE7CisKKyAgICBtdnNhZGNvc3QgWzBdIFswXSA9IDMwMDsKKyAgICBtdnNhZGNvc3QgWzFdIFswXSA9IDMwMDsKKworICAgIGRvCisgICAgeworICAgICAgICBkb3VibGUgeiA9IDI1NiAqICgyICogKGxvZzJmKDggKiBpKSArIC42KSk7CisgICAgICAgIG12c2FkY29zdCBbMF1baV0gPSAoaW50KSB6OworICAgICAgICBtdnNhZGNvc3QgWzFdW2ldID0gKGludCkgejsKKyAgICAgICAgbXZzYWRjb3N0IFswXVstaV0gPSAoaW50KSB6OworICAgICAgICBtdnNhZGNvc3QgWzFdWy1pXSA9IChpbnQpIHo7CisgICAgfQorICAgIHdoaWxlICgrK2kgPD0gbXZmcF9tYXgpOworfQorCitzdHJ1Y3QgVlA4X0NPTVAqIHZwOF9jcmVhdGVfY29tcHJlc3NvcihWUDhfQ09ORklHICpveGNmKQoreworICAgIGludCBpOworCisgICAgVlA4X0NPTVAgKmNwaTsKKyAgICBWUDhfQ09NTU9OICpjbTsKKworICAgIGNwaSA9IHZweF9tZW1hbGlnbigzMiwgc2l6ZW9mKFZQOF9DT01QKSk7CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgQ1BJIGluc3RhbmNlIGlzIHZhbGlkICovCisgICAgaWYgKCFjcGkpCisgICAgICAgIHJldHVybiAwOworCisgICAgY20gPSAmY3BpLT5jb21tb247CisKKyAgICB2cHhfbWVtc2V0KGNwaSwgMCwgc2l6ZW9mKFZQOF9DT01QKSk7CisKKyAgICBpZiAoc2V0am1wKGNtLT5lcnJvci5qbXApKQorICAgIHsKKyAgICAgICAgY3BpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMDsKKyAgICAgICAgdnA4X3JlbW92ZV9jb21wcmVzc29yKCZjcGkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjcGktPmNvbW1vbi5lcnJvci5zZXRqbXAgPSAxOworCisgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+bWIuc3MsIHZweF9jYWxsb2Moc2l6ZW9mKHNlYXJjaF9zaXRlKSwgKE1BWF9NVlNFQVJDSF9TVEVQUyAqIDgpICsgMSkpOworCisgICAgdnA4X2NyZWF0ZV9jb21tb24oJmNwaS0+Y29tbW9uKTsKKworICAgIGluaXRfY29uZmlnKGNwaSwgb3hjZik7CisKKyAgICBtZW1jcHkoY3BpLT5iYXNlX3NraXBfZmFsc2VfcHJvYiwgdnA4Y3hfYmFzZV9za2lwX2ZhbHNlX3Byb2IsIHNpemVvZih2cDhjeF9iYXNlX3NraXBfZmFsc2VfcHJvYikpOworICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUgICA9IDA7CisgICAgY3BpLT5rZl9vdmVyc3BlbmRfYml0cyAgICAgICAgICAgID0gMDsKKyAgICBjcGktPmtmX2JpdHJhdGVfYWRqdXN0bWVudCAgICAgICAgPSAwOworICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSAgICAgID0gMDsKKyAgICBjcGktPmdmX292ZXJzcGVuZF9iaXRzICAgICAgICAgICAgPSAwOworICAgIGNwaS0+bm9uX2dmX2JpdHJhdGVfYWRqdXN0bWVudCAgICAgPSAwOworICAgIGNwaS0+cHJvYl9sYXN0X2NvZGVkICAgICAgICAgICAgICA9IDEyODsKKyAgICBjcGktPnByb2JfZ2ZfY29kZWQgICAgICAgICAgICAgICAgPSAxMjg7CisgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkICAgICAgICAgICAgID0gNjM7CisKKyAgICAvKiBQcmltZSB0aGUgcmVjZW50IHJlZmVyZW5jZSBmcmFtZSB1c2FnZSBjb3VudGVycy4KKyAgICAgKiBIZXJlYWZ0ZXIgdGhleSB3aWxsIGJlIG1haW50YWluZWQgYXMgYSBzb3J0IG9mIG1vdmluZyBhdmVyYWdlCisgICAgICovCisgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0lOVFJBX0ZSQU1FXSAgPSAxOworICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtMQVNUX0ZSQU1FXSAgID0gMTsKKyAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbR09MREVOX0ZSQU1FXSA9IDE7CisgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV0gPSAxOworCisgICAgLyogU2V0IHJlZmVyZW5jZSBmcmFtZSBzaWduIGJpYXMgZm9yIEFMVFJFRiBmcmFtZSB0byAxIChmb3Igbm93KSAqLworICAgIGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSA9IDE7CisKKyAgICBjcGktPnR3b3Bhc3MuZ2ZfZGVjYXlfcmF0ZSA9IDA7CisgICAgY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCA9IERFRkFVTFRfR0ZfSU5URVJWQUw7CisKKyAgICBjcGktPmdvbGRfaXNfbGFzdCA9IDAgOworICAgIGNwaS0+YWx0X2lzX2xhc3QgID0gMCA7CisgICAgY3BpLT5nb2xkX2lzX2FsdCAgPSAwIDsKKworICAgIGNwaS0+YWN0aXZlX21hcF9lbmFibGVkID0gMDsKKworI2lmIDAKKyAgICAvKiBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGFuZCBvbmUgcGFzcyAqLworICAgIC8qIEluaXRpYWxpc2Ugb25lX3Bhc3MgR0YgZnJhbWVzIHN0YXRzICovCisgICAgLyogVXBkYXRlIHN0YXRzIHVzZWQgZm9yIEdGIHNlbGVjdGlvbiAqLworICAgIGlmIChjcGktPnBhc3MgPT0gMCkKKyAgICB7CisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTEFHX0JVRkZFUlM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZXNfc29fZmFyID0gMDsKKyAgICAgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbaV0uZnJhbWVfaW50cmFfZXJyb3IgPSAwLjA7CisgICAgICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2ldLmZyYW1lX2NvZGVkX2Vycm9yID0gMC4wOworICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9wY250X2ludGVyID0gMC4wOworICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9wY250X21vdGlvbiA9IDAuMDsKKyAgICAgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbaV0uZnJhbWVfbXZyID0gMC4wOworICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9tdnJfYWJzID0gMC4wOworICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9tdmMgPSAwLjA7CisgICAgICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2ldLmZyYW1lX212Y19hYnMgPSAwLjA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNob3VsZCB3ZSB1c2UgdGhlIGN5Y2xpYyByZWZyZXNoIG1ldGhvZC4KKyAgICAgKiBDdXJyZW50bHkgdGhpcyBpcyB0aWVkIHRvIGVycm9yIHJlc2lsbGlhbnQgbW9kZQorICAgICAqLworICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkID0gY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlOworICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9tYXhfbWJzX3BlcmZyYW1lID0gKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzKSAvIDU7CisgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2luZGV4ID0gMDsKKyAgICBjcGktPmN5Y2xpY19yZWZyZXNoX3EgPSAzMjsKKworICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCkKKyAgICB7CisgICAgICAgIENIRUNLX01FTV9FUlJPUihjcGktPmN5Y2xpY19yZWZyZXNoX21hcCwgdnB4X2NhbGxvYygoY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMpLCAxKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXAgPSAoc2lnbmVkIGNoYXIgKikgTlVMTDsKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKKyAgICBpbml0X2NvbnRleHRfY291bnRlcnMoKTsKKyNlbmRpZgorCisgICAgLypJbml0aWFsaXplIHRoZSBmZWVkLWZvcndhcmQgYWN0aXZpdHkgbWFza2luZy4qLworICAgIGNwaS0+YWN0aXZpdHlfYXZnID0gOTA8PDEyOworCisgICAgLyogR2l2ZSBhIHNlbnNpYmxlIGRlZmF1bHQgZm9yIHRoZSBmaXJzdCBmcmFtZS4gKi8KKyAgICBjcGktPmZyYW1lc19zaW5jZV9rZXkgPSA4OworICAgIGNwaS0+a2V5X2ZyYW1lX2ZyZXF1ZW5jeSA9IGNwaS0+b3hjZi5rZXlfZnJlcTsKKyAgICBjcGktPnRoaXNfa2V5X2ZyYW1lX2ZvcmNlZCA9IDA7CisgICAgY3BpLT5uZXh0X2tleV9mcmFtZV9mb3JjZWQgPSAwOworCisgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gMDsKKyAgICBjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSA9IDA7CisgICAgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lID0gMDsKKworICAgIGNwaS0+Yl9jYWxjdWxhdGVfcHNuciA9IENPTkZJR19JTlRFUk5BTF9TVEFUUzsKKyNpZiBDT05GSUdfSU5URVJOQUxfU1RBVFMKKyAgICBjcGktPmJfY2FsY3VsYXRlX3NzaW1nID0gMDsKKworICAgIGNwaS0+Y291bnQgPSAwOworICAgIGNwaS0+Ynl0ZXMgPSAwOworCisgICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfcHNucikKKyAgICB7CisgICAgICAgIGNwaS0+dG90YWxfc3FfZXJyb3IgPSAwLjA7CisgICAgICAgIGNwaS0+dG90YWxfc3FfZXJyb3IyID0gMC4wOworICAgICAgICBjcGktPnRvdGFsX3kgPSAwLjA7CisgICAgICAgIGNwaS0+dG90YWxfdSA9IDAuMDsKKyAgICAgICAgY3BpLT50b3RhbF92ID0gMC4wOworICAgICAgICBjcGktPnRvdGFsID0gMC4wOworICAgICAgICBjcGktPnRvdGFscF95ID0gMC4wOworICAgICAgICBjcGktPnRvdGFscF91ID0gMC4wOworICAgICAgICBjcGktPnRvdGFscF92ID0gMC4wOworICAgICAgICBjcGktPnRvdGFscCA9IDAuMDsKKyAgICAgICAgY3BpLT50b3RfcmVjb2RlX2hpdHMgPSAwOworICAgICAgICBjcGktPnN1bW1lZF9xdWFsaXR5ID0gMDsKKyAgICAgICAgY3BpLT5zdW1tZWRfd2VpZ2h0cyA9IDA7CisgICAgfQorCisgICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfc3NpbWcpCisgICAgeworICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3kgPSAwOworICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3UgPSAwOworICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3YgPSAwOworICAgICAgICBjcGktPnRvdGFsX3NzaW1nX2FsbCA9IDA7CisgICAgfQorCisjZW5kaWYKKworICAgIGNwaS0+Zmlyc3RfdGltZV9zdGFtcF9ldmVyID0gMHg3RkZGRkZGRjsKKworICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSAgICAgID0gMDsKKyAgICBjcGktPmtleV9mcmFtZV9jb3VudCAgICAgICAgICAgICAgPSAxOworCisgICAgY3BpLT5uaV9hdl9xaSAgICAgICAgICAgICAgICAgICAgID0gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcTsKKyAgICBjcGktPm5pX3RvdF9xaSAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGNwaS0+bmlfZnJhbWVzICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBjcGktPnRvdGFsX2J5dGVfY291bnQgICAgICAgICAgICAgPSAwOworCisgICAgY3BpLT5kcm9wX2ZyYW1lICAgICAgICAgICAgICAgICAgPSAwOworCisgICAgY3BpLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yICAgICAgICAgPSAxLjA7CisgICAgY3BpLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IDEuMDsKKyAgICBjcGktPmdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3IgID0gMS4wOworICAgIGNwaS0+dHdvcGFzcy5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciAgPSAxLjA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgS0VZX0ZSQU1FX0NPTlRFWFQ7IGkrKykKKyAgICB7CisgICAgICAgIGNwaS0+cHJpb3Jfa2V5X2ZyYW1lX2Rpc3RhbmNlW2ldID0gKGludCljcGktPm91dHB1dF9mcmFtZV9yYXRlOworICAgIH0KKworI2lmZGVmIE9VVFBVVF9ZVVZfU1JDCisgICAgeXV2X2ZpbGUgPSBmb3BlbigiYmQueXV2IiwgImFiIik7CisjZW5kaWYKKworI2lmIDAKKyAgICBmcmFtZXBzbnIgPSBmb3BlbigiZnJhbWVwc25yLnN0dCIsICJhIik7CisgICAga2ZfbGlzdCA9IGZvcGVuKCJrZl9saXN0LnN0dCIsICJ3Iik7CisjZW5kaWYKKworICAgIGNwaS0+b3V0cHV0X3BrdF9saXN0ID0gb3hjZi0+b3V0cHV0X3BrdF9saXN0OworCisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKKworICAgIGlmIChjcGktPnBhc3MgPT0gMSkKKyAgICB7CisgICAgICAgIHZwOF9pbml0X2ZpcnN0X3Bhc3MoY3BpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY3BpLT5wYXNzID09IDIpCisgICAgeworICAgICAgICBzaXplX3QgcGFja2V0X3N6ID0gc2l6ZW9mKEZJUlNUUEFTU19TVEFUUyk7CisgICAgICAgIGludCBwYWNrZXRzID0gKGludCkob3hjZi0+dHdvX3Bhc3Nfc3RhdHNfaW4uc3ogLyBwYWNrZXRfc3opOworCisgICAgICAgIGNwaS0+dHdvcGFzcy5zdGF0c19pbl9zdGFydCA9IG94Y2YtPnR3b19wYXNzX3N0YXRzX2luLmJ1ZjsKKyAgICAgICAgY3BpLT50d29wYXNzLnN0YXRzX2luID0gY3BpLT50d29wYXNzLnN0YXRzX2luX3N0YXJ0OworICAgICAgICBjcGktPnR3b3Bhc3Muc3RhdHNfaW5fZW5kID0gKHZvaWQqKSgoY2hhciAqKWNwaS0+dHdvcGFzcy5zdGF0c19pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHBhY2tldHMgLSAxKSAqIHBhY2tldF9zeik7CisgICAgICAgIHZwOF9pbml0X3NlY29uZF9wYXNzKGNwaSk7CisgICAgfQorCisjZW5kaWYKKworICAgIGlmIChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMikKKyAgICB7CisgICAgICAgIGNwaS0+YXZnX2VuY29kZV90aW1lICAgICAgPSAwOworICAgICAgICBjcGktPmF2Z19waWNrX21vZGVfdGltZSAgICA9IDA7CisgICAgfQorCisgICAgdnA4X3NldF9zcGVlZF9mZWF0dXJlcyhjcGkpOworCisgICAgLyogU2V0IHN0YXJ0aW5nIHZhbHVlcyBvZiBSRCB0aHJlc2hvbGQgbXVsdGlwbGllcnMgKDEyOCA9ICoxKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkrKykKKyAgICB7CisgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbaV0gPSAxMjg7CisgICAgfQorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgIGluaXRfbXZfcmVmX2NvdW50cygpOworI2VuZGlmCisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICBpZih2cDhjeF9jcmVhdGVfZW5jb2Rlcl90aHJlYWRzKGNwaSkpCisgICAgeworICAgICAgICB2cDhfcmVtb3ZlX2NvbXByZXNzb3IoJmNwaSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorCisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZiAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS52ZiAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTE2eDE2OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zdmYgICAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNjsKKyAgICBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc3ZmX2hhbGZwaXhfaCAgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2g7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnN2Zl9oYWxmcGl4X3YgID0gdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zdmZfaGFsZnBpeF9odiA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHY7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkeDNmICAgICAgICAgID0gdnA4X3NhZDE2eDE2eDM7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkeDhmICAgICAgICAgID0gdnA4X3NhZDE2eDE2eDg7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkeDRkZiAgICAgICAgID0gdnA4X3NhZDE2eDE2eDRkOworCisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc2RmICAgICAgICAgICAgPSB2cDhfc2FkMTZ4ODsKKyAgICBjcGktPmZuX3B0cltCTE9DS18xNlg4XS52ZiAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTE2eDg7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc3ZmICAgICAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4ODsKKyAgICBjcGktPmZuX3B0cltCTE9DS18xNlg4XS5zdmZfaGFsZnBpeF9oICA9IE5VTEw7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc3ZmX2hhbGZwaXhfdiAgPSBOVUxMOworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDhdLnN2Zl9oYWxmcGl4X2h2ID0gTlVMTDsKKyAgICBjcGktPmZuX3B0cltCTE9DS18xNlg4XS5zZHgzZiAgICAgICAgICA9IHZwOF9zYWQxNng4eDM7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc2R4OGYgICAgICAgICAgPSB2cDhfc2FkMTZ4OHg4OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDhdLnNkeDRkZiAgICAgICAgID0gdnA4X3NhZDE2eDh4NGQ7CisKKyAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5zZGYgICAgICAgICAgICA9IHZwOF9zYWQ4eDE2OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYMTZdLnZmICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHgxNjsKKyAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5zdmYgICAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYMTZdLnN2Zl9oYWxmcGl4X2ggID0gTlVMTDsKKyAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5zdmZfaGFsZnBpeF92ICA9IE5VTEw7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0uc3ZmX2hhbGZwaXhfaHYgPSBOVUxMOworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYMTZdLnNkeDNmICAgICAgICAgID0gdnA4X3NhZDh4MTZ4MzsKKyAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5zZHg4ZiAgICAgICAgICA9IHZwOF9zYWQ4eDE2eDg7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0uc2R4NGRmICAgICAgICAgPSB2cDhfc2FkOHgxNng0ZDsKKworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYOF0uc2RmICAgICAgICAgICAgPSB2cDhfc2FkOHg4OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYOF0udmYgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U4eDg7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmYgICAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDg7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmZfaGFsZnBpeF9oICA9IE5VTEw7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmZfaGFsZnBpeF92ICA9IE5VTEw7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmZfaGFsZnBpeF9odiA9IE5VTEw7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zZHgzZiAgICAgICAgICA9IHZwOF9zYWQ4eDh4MzsKKyAgICBjcGktPmZuX3B0cltCTE9DS184WDhdLnNkeDhmICAgICAgICAgID0gdnA4X3NhZDh4OHg4OworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYOF0uc2R4NGRmICAgICAgICAgPSB2cDhfc2FkOHg4eDRkOworCisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zZGYgICAgICAgICAgICA9IHZwOF9zYWQ0eDQ7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS52ZiAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTR4NDsKKyAgICBjcGktPmZuX3B0cltCTE9DS180WDRdLnN2ZiAgICAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NDsKKyAgICBjcGktPmZuX3B0cltCTE9DS180WDRdLnN2Zl9oYWxmcGl4X2ggID0gTlVMTDsKKyAgICBjcGktPmZuX3B0cltCTE9DS180WDRdLnN2Zl9oYWxmcGl4X3YgID0gTlVMTDsKKyAgICBjcGktPmZuX3B0cltCTE9DS180WDRdLnN2Zl9oYWxmcGl4X2h2ID0gTlVMTDsKKyAgICBjcGktPmZuX3B0cltCTE9DS180WDRdLnNkeDNmICAgICAgICAgID0gdnA4X3NhZDR4NHgzOworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzRYNF0uc2R4OGYgICAgICAgICAgPSB2cDhfc2FkNHg0eDg7CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zZHg0ZGYgICAgICAgICA9IHZwOF9zYWQ0eDR4NGQ7CisKKyNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAorICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5jb3B5bWVtICAgICAgPSB2cDhfY29weTMyeG47CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uY29weW1lbSAgICAgICA9IHZwOF9jb3B5MzJ4bjsKKyAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5jb3B5bWVtICAgICAgID0gdnA4X2NvcHkzMnhuOworICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYOF0uY29weW1lbSAgICAgICAgPSB2cDhfY29weTMyeG47CisgICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5jb3B5bWVtICAgICAgICA9IHZwOF9jb3B5MzJ4bjsKKyNlbmRpZgorCisgICAgY3BpLT5mdWxsX3NlYXJjaF9zYWQgPSB2cDhfZnVsbF9zZWFyY2hfc2FkOworICAgIGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkID0gdnA4X2RpYW1vbmRfc2VhcmNoX3NhZDsKKyAgICBjcGktPnJlZmluaW5nX3NlYXJjaF9zYWQgPSB2cDhfcmVmaW5pbmdfc2VhcmNoX3NhZDsKKworICAgIC8qIG1ha2Ugc3VyZSBmcmFtZSAxIGlzIG9rYXkgKi8KKyAgICBjcGktPmVycm9yX2JpbnNbMF0gPSBjcGktPmNvbW1vbi5NQnM7CisKKyAgICAvKiB2cDhjeF9pbml0X3F1YW50aXplcigpIGlzIGZpcnN0IGNhbGxlZCBoZXJlLiBBZGQgY2hlY2sgaW4KKyAgICAgKiB2cDhjeF9mcmFtZV9pbml0X3F1YW50aXplcigpIHNvIHRoYXQgdnA4Y3hfaW5pdF9xdWFudGl6ZXIgaXMgb25seQorICAgICAqIGNhbGxlZCBsYXRlciB3aGVuIG5lZWRlZC4gVGhpcyB3aWxsIGF2b2lkIHVubmVjZXNzYXJ5IGNhbGxzIG9mCisgICAgICogdnA4Y3hfaW5pdF9xdWFudGl6ZXIoKSBmb3IgZXZlcnkgZnJhbWUuCisgICAgICovCisgICAgdnA4Y3hfaW5pdF9xdWFudGl6ZXIoY3BpKTsKKworICAgIHZwOF9sb29wX2ZpbHRlcl9pbml0KGNtKTsKKworICAgIGNwaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisKKyAgICAvKiBDYWxjdWxhdGUgIyBvZiBNQnMgaW4gYSByb3cgaW4gbG93ZXItcmVzb2x1dGlvbiBsZXZlbCBpbWFnZS4gKi8KKyAgICBpZiAoY3BpLT5veGNmLm1yX2VuY29kZXJfaWQgPiAwKQorICAgICAgICB2cDhfY2FsX2xvd19yZXNfbWJfY29scyhjcGkpOworCisjZW5kaWYKKworICAgIC8qIHNldHVwIFJEIGNvc3RzIHRvIE1BQ1JPQkxPQ0sgc3RydWN0ICovCisKKyAgICBjcGktPm1iLm12Y29zdFswXSA9ICZjcGktPnJkX2Nvc3RzLm12Y29zdHNbMF1bbXZfbWF4KzFdOworICAgIGNwaS0+bWIubXZjb3N0WzFdID0gJmNwaS0+cmRfY29zdHMubXZjb3N0c1sxXVttdl9tYXgrMV07CisgICAgY3BpLT5tYi5tdnNhZGNvc3RbMF0gPSAmY3BpLT5yZF9jb3N0cy5tdnNhZGNvc3RzWzBdW212ZnBfbWF4KzFdOworICAgIGNwaS0+bWIubXZzYWRjb3N0WzFdID0gJmNwaS0+cmRfY29zdHMubXZzYWRjb3N0c1sxXVttdmZwX21heCsxXTsKKworICAgIGNhbF9tdnNhZGNvc3RzKGNwaS0+bWIubXZzYWRjb3N0KTsKKworICAgIGNwaS0+bWIubWJtb2RlX2Nvc3QgPSBjcGktPnJkX2Nvc3RzLm1ibW9kZV9jb3N0OworICAgIGNwaS0+bWIuaW50cmFfdXZfbW9kZV9jb3N0ID0gY3BpLT5yZF9jb3N0cy5pbnRyYV91dl9tb2RlX2Nvc3Q7CisgICAgY3BpLT5tYi5ibW9kZV9jb3N0cyA9IGNwaS0+cmRfY29zdHMuYm1vZGVfY29zdHM7CisgICAgY3BpLT5tYi5pbnRlcl9ibW9kZV9jb3N0cyA9IGNwaS0+cmRfY29zdHMuaW50ZXJfYm1vZGVfY29zdHM7CisgICAgY3BpLT5tYi50b2tlbl9jb3N0cyA9IGNwaS0+cmRfY29zdHMudG9rZW5fY29zdHM7CisKKyAgICAvKiBzZXR1cCBibG9jayBwdHJzICYgb2Zmc2V0cyAqLworICAgIHZwOF9zZXR1cF9ibG9ja19wdHJzKCZjcGktPm1iKTsKKyAgICB2cDhfc2V0dXBfYmxvY2tfZHB0cnMoJmNwaS0+bWIuZV9tYmQpOworCisgICAgcmV0dXJuICBjcGk7Cit9CisKKwordm9pZCB2cDhfcmVtb3ZlX2NvbXByZXNzb3IoVlA4X0NPTVAgKipwdHIpCit7CisgICAgVlA4X0NPTVAgKmNwaSA9ICpwdHI7CisKKyAgICBpZiAoIWNwaSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNwaSAmJiAoY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSA+IDApKQorICAgIHsKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorCisgICAgICAgIGlmIChjcGktPnBhc3MgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2VuZF9zZWNvbmRfcGFzcyhjcGkpOworICAgICAgICB9CisKKyNlbmRpZgorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICBwcmludF9jb250ZXh0X2NvdW50ZXJzKCk7CisgICAgICAgIHByaW50X3RyZWVfdXBkYXRlX3Byb2JzKCk7CisgICAgICAgIHByaW50X21vZGVfY29udGV4dCgpOworI2VuZGlmCisKKyNpZiBDT05GSUdfSU5URVJOQUxfU1RBVFMKKworICAgICAgICBpZiAoY3BpLT5wYXNzICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3Blbigib3BzbnIuc3R0IiwgImEiKTsKKyAgICAgICAgICAgIGRvdWJsZSB0aW1lX2VuY29kZWQgPSAoY3BpLT5sYXN0X2VuZF90aW1lX3N0YW1wX3NlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjcGktPmZpcnN0X3RpbWVfc3RhbXBfZXZlcikgLyAxMDAwMDAwMC4wMDA7CisgICAgICAgICAgICBkb3VibGUgdG90YWxfZW5jb2RlX3RpbWUgPSAoY3BpLT50aW1lX3JlY2VpdmVfZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dGltZV9jb21wcmVzc19kYXRhKSAvIDEwMDAuMDAwOworICAgICAgICAgICAgZG91YmxlIGRyID0gKGRvdWJsZSljcGktPmJ5dGVzICogOC4wIC8gMTAwMC4wIC8gdGltZV9lbmNvZGVkOworCisgICAgICAgICAgICBpZiAoY3BpLT5iX2NhbGN1bGF0ZV9wc25yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqbHN0X3l2MTIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24ubHN0X2ZiX2lkeF07CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTGF5ZXJcdEJpdHJhdGVcdEFWR1BzbnJcdEdMQlBzbnJcdEFWUHNuclBcdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xQc25yUFx0VlBYU1NJTVx0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KGludCljcGktPm94Y2YubnVtYmVyX29mX2xheWVyczsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHIgPSAoZG91YmxlKWNwaS0+Ynl0ZXNfaW5fbGF5ZXJbaV0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguMCAvIDEwMDAuMCAgLyB0aW1lX2VuY29kZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlcyA9IDMuMCAvIDIgKiBjcGktPmZyYW1lc19pbl9sYXllcltpXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdF95djEyLT55X3dpZHRoICogbHN0X3l2MTItPnlfaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvdGFsX3BzbnIgPSB2cDhfbXNlMnBzbnIoc2FtcGxlcywgMjU1LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfZXJyb3IyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3RhbF9wc25yMiA9IHZwOF9tc2UycHNucihzYW1wbGVzLCAyNTUuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9lcnJvcjJfcFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG90YWxfc3NpbSA9IDEwMCAqIHBvdyhjcGktPnN1bV9zc2ltW2ldIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtX3dlaWdodHNbaV0sIDguMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiU1ZFx0JTcuM2ZcdCU3LjNmXHQlNy4zZlx0JTcuM2ZcdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU3LjNmXHQlNy4zZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtX3BzbnJbaV0gLyBjcGktPmZyYW1lc19pbl9sYXllcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfcHNuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5zdW1fcHNucl9wW2ldIC8gY3BpLT5mcmFtZXNfaW5fbGF5ZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3BzbnIyLCB0b3RhbF9zc2ltKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlcyA9IDMuMCAvIDIgKiBjcGktPmNvdW50ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RfeXYxMi0+eV93aWR0aCAqIGxzdF95djEyLT55X2hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvdGFsX3BzbnIgPSB2cDhfbXNlMnBzbnIoc2FtcGxlcywgMjU1LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NxX2Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvdGFsX3BzbnIyID0gdnA4X21zZTJwc25yKHNhbXBsZXMsIDI1NS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9zcV9lcnJvcjIpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG90YWxfc3NpbSA9IDEwMCAqIHBvdyhjcGktPnN1bW1lZF9xdWFsaXR5IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtbWVkX3dlaWdodHMsIDguMCk7CisKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQml0cmF0ZVx0QVZHUHNuclx0R0xCUHNuclx0QVZQc25yUFx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHTFBzbnJQXHRWUFhTU0lNXHQgIFRpbWUodXMpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTcuM2ZcdCU3LjNmXHQlNy4zZlx0JTcuM2ZcdCU3LjNmXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU3LjNmXHQlOC4wZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciwgY3BpLT50b3RhbCAvIGNwaS0+Y291bnQsIHRvdGFsX3BzbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbHAgLyBjcGktPmNvdW50LCB0b3RhbF9wc25yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9zc2ltLCB0b3RhbF9lbmNvZGVfdGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3BpLT5iX2NhbGN1bGF0ZV9zc2ltZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTGF5ZXJcdEJpdFJhdGVcdFNTSU1fWVx0U1NJTV9VXHRTU0lNX1ZcdFNTSU1fQVx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lKHVzKVxuIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPChpbnQpY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRyID0gKGRvdWJsZSljcGktPmJ5dGVzX2luX2xheWVyW2ldICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguMCAvIDEwMDAuMCAgLyB0aW1lX2VuY29kZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlNWRcdCU3LjNmXHQlNi40Zlx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTYuNGZcdCU2LjRmXHQlNi40Zlx0JTguMGZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3lfaW5fbGF5ZXJbaV0gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX2luX2xheWVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3VfaW5fbGF5ZXJbaV0gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX2luX2xheWVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3ZfaW5fbGF5ZXJbaV0gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX2luX2xheWVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX2FsbF9pbl9sYXllcltpXSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNfaW5fbGF5ZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2VuY29kZV90aW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJCaXRSYXRlXHRTU0lNX1lcdFNTSU1fVVx0U1NJTV9WXHRTU0lNX0FcdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZSh1cylcbiIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlNy4zZlx0JTYuNGZcdCU2LjRmXHQlNi40Zlx0JTYuNGZcdCU4LjBmXG4iLCBkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3kgLyBjcGktPmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfc3NpbWdfdSAvIGNwaS0+Y291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9zc2ltZ192IC8gY3BpLT5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX2FsbCAvIGNwaS0+Y291bnQsIHRvdGFsX2VuY29kZV90aW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyNpZiAwCisgICAgICAgICAgICBmID0gZm9wZW4oInFza2lwLnN0dCIsICJhIik7CisgICAgICAgICAgICBmcHJpbnRmKGYsICJtaW5xOiVkIC1tYXhxOiVkIHNraXB0cnVlOnNraXBmYWxzZSA9ICVkOiVkXG4iLCBjcGktPm94Y2YuYmVzdF9hbGxvd2VkX3EsIGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3EsIHNraXB0cnVlY291bnQsIHNraXBmYWxzZWNvdW50KTsKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyNlbmRpZgorCisgICAgICAgIH0KKworI2VuZGlmCisKKworI2lmZGVmIFNQRUVEU1RBVFMKKworICAgICAgICBpZiAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJjeHNwZWVkLnN0dCIsICJhIik7CisgICAgICAgICAgICBjbnRfcG0gLz0gY3BpLT5jb21tb24uTUJzOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlNWQiLCBmcmFtZXNfYXRfc3BlZWRbaV0pOworCisgICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOworICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICB9CisKKyNlbmRpZgorCisKKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgY291bnRfbWJfc2VnWzRdOworICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJtb2Rlcy5zdHQiLCAiYSIpOworICAgICAgICAgICAgZG91YmxlIGRyID0gKGRvdWJsZSljcGktPmZyYW1lX3JhdGUgKiAoZG91YmxlKWJ5dGVzICogKGRvdWJsZSk4IC8gKGRvdWJsZSljb3VudCAvIChkb3VibGUpMTAwMCA7CisgICAgICAgICAgICBmcHJpbnRmKGYsICJpbnRyYV9tb2RlIGluIEludHJhIEZyYW1lczpcbiIpOworICAgICAgICAgICAgZnByaW50ZihmLCAiWTogJThkLCAlOGQsICU4ZCwgJThkLCAlOGRcbiIsIHlfbW9kZXNbMF0sIHlfbW9kZXNbMV0sIHlfbW9kZXNbMl0sIHlfbW9kZXNbM10sIHlfbW9kZXNbNF0pOworICAgICAgICAgICAgZnByaW50ZihmLCAiVVY6JThkLCAlOGQsICU4ZCwgJThkXG4iLCB1dl9tb2Rlc1swXSwgdXZfbW9kZXNbMV0sIHV2X21vZGVzWzJdLCB1dl9tb2Rlc1szXSk7CisgICAgICAgICAgICBmcHJpbnRmKGYsICJCOiAiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlOGQsICIsIGJfbW9kZXNbaV0pOworCisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcHJpbnRmKGYsICJNb2RlcyBpbiBJbnRlciBGcmFtZXM6XG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoZiwgIlk6ICU4ZCwgJThkLCAlOGQsICU4ZCwgJThkLCAlOGQsICU4ZCwgJThkLCAlOGQsICU4ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJfeV9tb2Rlc1swXSwgaW50ZXJfeV9tb2Rlc1sxXSwgaW50ZXJfeV9tb2Rlc1syXSwgaW50ZXJfeV9tb2Rlc1szXSwgaW50ZXJfeV9tb2Rlc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJfeV9tb2Rlc1s1XSwgaW50ZXJfeV9tb2Rlc1s2XSwgaW50ZXJfeV9tb2Rlc1s3XSwgaW50ZXJfeV9tb2Rlc1s4XSwgaW50ZXJfeV9tb2Rlc1s5XSk7CisgICAgICAgICAgICBmcHJpbnRmKGYsICJVVjolOGQsICU4ZCwgJThkLCAlOGRcbiIsIGludGVyX3V2X21vZGVzWzBdLCBpbnRlcl91dl9tb2Rlc1sxXSwgaW50ZXJfdXZfbW9kZXNbMl0sIGludGVyX3V2X21vZGVzWzNdKTsKKyAgICAgICAgICAgIGZwcmludGYoZiwgIkI6ICIpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiU4ZCwgIiwgaW50ZXJfYl9tb2Rlc1tpXSk7CisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKGYsICJQOiU4ZCwgJThkLCAlOGQsICU4ZFxuIiwgY291bnRfbWJfc2VnWzBdLCBjb3VudF9tYl9zZWdbMV0sIGNvdW50X21iX3NlZ1syXSwgY291bnRfbWJfc2VnWzNdKTsKKyAgICAgICAgICAgIGZwcmludGYoZiwgIlBCOiU4ZCwgJThkLCAlOGQsICU4ZFxuIiwgaW50ZXJfYl9tb2Rlc1tMRUZUNFg0XSwgaW50ZXJfYl9tb2Rlc1tBQk9WRTRYNF0sIGludGVyX2JfbW9kZXNbWkVSTzRYNF0sIGludGVyX2JfbW9kZXNbTkVXNFg0XSk7CisKKworCisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRU5UUk9QWV9TVEFUUworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSwgaiwgazsKKyAgICAgICAgICAgIEZJTEUgKmZtb2RlID0gZm9wZW4oIm1vZGVjb250ZXh0LmMiLCAidyIpOworCisgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAiXG4jaW5jbHVkZSBcImVudHJvcHltb2RlLmhcIlxuXG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICJjb25zdCB1bnNpZ25lZCBpbnQgdnA4X2tmX2RlZmF1bHRfYm1vZGVfY291bnRzICIpOworICAgICAgICAgICAgZnByaW50ZihmbW9kZSwgIltWUDhfQklOVFJBTU9ERVNdIFtWUDhfQklOVFJBTU9ERVNdIFtWUDhfQklOVFJBTU9ERVNdID1cbntcbiIpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICIgICAgeyAvKiBBYm92ZSBNb2RlIDogICVkICovXG4iLCBpKTsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAiICAgICAgICB7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDEwOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW50cmFfbW9kZV9zdGF0c1tpXVtqXVtrXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAiICU1ZCwgIiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmbW9kZSwgIiAlNWQsICIsIGludHJhX21vZGVfc3RhdHNbaV1bal1ba10pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmbW9kZSwgIn0sIC8qIGxlZnRfbW9kZSAlZCAqL1xuIiwgaik7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAiICAgIH0sXG4iKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAifTtcbiIpOworICAgICAgICAgICAgZmNsb3NlKGZtb2RlKTsKKyAgICAgICAgfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoU0VDVElPTkJJVFNfT1VUUFVUKQorCisgICAgICAgIGlmICgwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigidG9rZW5iaXRzLnN0dCIsICJhIik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyODsgaSsrKQorICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiU4ZCIsIChpbnQpKFNlY3Rpb25iaXRzW2ldIC8gMjU2KSk7CisKKyAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0KKworI2VuZGlmCisKKyNpZiAwCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiXG5fcGlja19sb29wX2ZpbHRlcl9sZXZlbDolZFxuIiwgY3BpLT50aW1lX3BpY2tfbHBmIC8gMTAwMCk7CisgICAgICAgICAgICBwcmludGYoIlxuX2ZyYW1lcyByZWNpdmVfZGF0YSBlbmNvZF9tYl9yb3cgY29tcHJlc3NfZnJhbWUgIFRvdGFsXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiJTZkICUxMGxkICUxMGxkICUxMGxkICUxMGxkXG4iLCBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBjcGktPnRpbWVfcmVjZWl2ZV9kYXRhIC8gMTAwMCwgY3BpLT50aW1lX2VuY29kZV9tYl9yb3cgLyAxMDAwLCBjcGktPnRpbWVfY29tcHJlc3NfZGF0YSAvIDEwMDAsIChjcGktPnRpbWVfcmVjZWl2ZV9kYXRhICsgY3BpLT50aW1lX2NvbXByZXNzX2RhdGEpIC8gMTAwMCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgfQorCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgdnA4Y3hfcmVtb3ZlX2VuY29kZXJfdGhyZWFkcyhjcGkpOworI2VuZGlmCisKKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisgICAgdnA4X2Rlbm9pc2VyX2ZyZWUoJmNwaS0+ZGVub2lzZXIpOworI2VuZGlmCisgICAgZGVhbGxvY19jb21wcmVzc29yX2RhdGEoY3BpKTsKKyAgICB2cHhfZnJlZShjcGktPm1iLnNzKTsKKyAgICB2cHhfZnJlZShjcGktPnRvayk7CisgICAgdnB4X2ZyZWUoY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXApOworCisgICAgdnA4X3JlbW92ZV9jb21tb24oJmNwaS0+Y29tbW9uKTsKKyAgICB2cHhfZnJlZShjcGkpOworICAgICpwdHIgPSAwOworCisjaWZkZWYgT1VUUFVUX1lVVl9TUkMKKyAgICBmY2xvc2UoeXV2X2ZpbGUpOworI2VuZGlmCisKKyNpZiAwCisKKyAgICBpZiAoa2V5ZmlsZSkKKyAgICAgICAgZmNsb3NlKGtleWZpbGUpOworCisgICAgaWYgKGZyYW1lcHNucikKKyAgICAgICAgZmNsb3NlKGZyYW1lcHNucik7CisKKyAgICBpZiAoa2ZfbGlzdCkKKyAgICAgICAgZmNsb3NlKGtmX2xpc3QpOworCisjZW5kaWYKKworfQorCisKK3N0YXRpYyB1aW50NjRfdCBjYWxjX3BsYW5lX2Vycm9yKHVuc2lnbmVkIGNoYXIgKm9yaWcsIGludCBvcmlnX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnJlY29uLCBpbnQgcmVjb25fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbHMsIHVuc2lnbmVkIGludCByb3dzKQoreworICAgIHVuc2lnbmVkIGludCByb3csIGNvbDsKKyAgICB1aW50NjRfdCB0b3RhbF9zc2UgPSAwOworICAgIGludCBkaWZmOworCisgICAgZm9yIChyb3cgPSAwOyByb3cgKyAxNiA8PSByb3dzOyByb3cgKz0gMTYpCisgICAgeworICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCArIDE2IDw9IGNvbHM7IGNvbCArPSAxNikKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNzZTsKKworICAgICAgICAgICAgdnA4X21zZTE2eDE2KG9yaWcgKyBjb2wsIG9yaWdfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbiArIGNvbCwgcmVjb25fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3NlKTsKKyAgICAgICAgICAgIHRvdGFsX3NzZSArPSBzc2U7CisgICAgICAgIH0KKworICAgICAgICAvKiBIYW5kbGUgb2RkLXNpemVkIHdpZHRoICovCisgICAgICAgIGlmIChjb2wgPCBjb2xzKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBib3JkZXJfcm93LCBib3JkZXJfY29sOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYm9yZGVyX29yaWcgPSBvcmlnOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYm9yZGVyX3JlY29uID0gcmVjb247CisKKyAgICAgICAgICAgIGZvciAoYm9yZGVyX3JvdyA9IDA7IGJvcmRlcl9yb3cgPCAxNjsgYm9yZGVyX3JvdysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoYm9yZGVyX2NvbCA9IGNvbDsgYm9yZGVyX2NvbCA8IGNvbHM7IGJvcmRlcl9jb2wrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBib3JkZXJfb3JpZ1tib3JkZXJfY29sXSAtIGJvcmRlcl9yZWNvbltib3JkZXJfY29sXTsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfc3NlICs9IGRpZmYgKiBkaWZmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvcmRlcl9vcmlnICs9IG9yaWdfc3RyaWRlOworICAgICAgICAgICAgICAgIGJvcmRlcl9yZWNvbiArPSByZWNvbl9zdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvcmlnICs9IG9yaWdfc3RyaWRlICogMTY7CisgICAgICAgIHJlY29uICs9IHJlY29uX3N0cmlkZSAqIDE2OworICAgIH0KKworICAgIC8qIEhhbmRsZSBvZGQtc2l6ZWQgaGVpZ2h0ICovCisgICAgZm9yICg7IHJvdyA8IHJvd3M7IHJvdysrKQorICAgIHsKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZiA9IG9yaWdbY29sXSAtIHJlY29uW2NvbF07CisgICAgICAgICAgICB0b3RhbF9zc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBvcmlnICs9IG9yaWdfc3RyaWRlOworICAgICAgICByZWNvbiArPSByZWNvbl9zdHJpZGU7CisgICAgfQorCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworICAgIHJldHVybiB0b3RhbF9zc2U7Cit9CisKKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfcHNucl9wYWNrZXQoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAqb3JpZyA9IGNwaS0+U291cmNlOworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICpyZWNvbiA9IGNwaS0+Y29tbW9uLmZyYW1lX3RvX3Nob3c7CisgICAgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgIHBrdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgc3NlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB3aWR0aCA9IGNwaS0+Y29tbW9uLldpZHRoOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBoZWlnaHQgPSBjcGktPmNvbW1vbi5IZWlnaHQ7CisKKyAgICBwa3Qua2luZCA9IFZQWF9DT0RFQ19QU05SX1BLVDsKKyAgICBzc2UgPSBjYWxjX3BsYW5lX2Vycm9yKG9yaWctPnlfYnVmZmVyLCBvcmlnLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uLT55X2J1ZmZlciwgcmVjb24tPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgcGt0LmRhdGEucHNuci5zc2VbMF0gPSBzc2U7CisgICAgcGt0LmRhdGEucHNuci5zc2VbMV0gPSBzc2U7CisgICAgcGt0LmRhdGEucHNuci5zYW1wbGVzWzBdID0gd2lkdGggKiBoZWlnaHQ7CisgICAgcGt0LmRhdGEucHNuci5zYW1wbGVzWzFdID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICB3aWR0aCA9ICh3aWR0aCArIDEpIC8gMjsKKyAgICBoZWlnaHQgPSAoaGVpZ2h0ICsgMSkgLyAyOworCisgICAgc3NlID0gY2FsY19wbGFuZV9lcnJvcihvcmlnLT51X2J1ZmZlciwgb3JpZy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb24tPnVfYnVmZmVyLCByZWNvbi0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgcGt0LmRhdGEucHNuci5zc2VbMF0gKz0gc3NlOworICAgIHBrdC5kYXRhLnBzbnIuc3NlWzJdID0gc3NlOworICAgIHBrdC5kYXRhLnBzbnIuc2FtcGxlc1swXSArPSB3aWR0aCAqIGhlaWdodDsKKyAgICBwa3QuZGF0YS5wc25yLnNhbXBsZXNbMl0gPSB3aWR0aCAqIGhlaWdodDsKKworICAgIHNzZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+dl9idWZmZXIsIG9yaWctPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uLT52X2J1ZmZlciwgcmVjb24tPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgIHBrdC5kYXRhLnBzbnIuc3NlWzBdICs9IHNzZTsKKyAgICBwa3QuZGF0YS5wc25yLnNzZVszXSA9IHNzZTsKKyAgICBwa3QuZGF0YS5wc25yLnNhbXBsZXNbMF0gKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgcGt0LmRhdGEucHNuci5zYW1wbGVzWzNdID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBwa3QuZGF0YS5wc25yLnBzbnJbaV0gPSB2cDhfbXNlMnBzbnIocGt0LmRhdGEucHNuci5zYW1wbGVzW2ldLCAyNTUuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpKHBrdC5kYXRhLnBzbnIuc3NlW2ldKSk7CisKKyAgICB2cHhfY29kZWNfcGt0X2xpc3RfYWRkKGNwaS0+b3V0cHV0X3BrdF9saXN0LCAmcGt0KTsKK30KKworCitpbnQgdnA4X3VzZV9hc19yZWZlcmVuY2UoVlA4X0NPTVAgKmNwaSwgaW50IHJlZl9mcmFtZV9mbGFncykKK3sKKyAgICBpZiAocmVmX2ZyYW1lX2ZsYWdzID4gNykKKyAgICAgICAgcmV0dXJuIC0xIDsKKworICAgIGNwaS0+cmVmX2ZyYW1lX2ZsYWdzID0gcmVmX2ZyYW1lX2ZsYWdzOworICAgIHJldHVybiAwOworfQoraW50IHZwOF91cGRhdGVfcmVmZXJlbmNlKFZQOF9DT01QICpjcGksIGludCByZWZfZnJhbWVfZmxhZ3MpCit7CisgICAgaWYgKHJlZl9mcmFtZV9mbGFncyA+IDcpCisgICAgICAgIHJldHVybiAtMSA7CisKKyAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9IDA7CisgICAgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lID0gMDsKKyAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2xhc3RfZnJhbWUgICA9IDA7CisKKyAgICBpZiAocmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0xBU1RfRlJBTUUpCisgICAgICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfbGFzdF9mcmFtZSA9IDE7CisKKyAgICBpZiAocmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0dPTERfRlJBTUUpCisgICAgICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gMTsKKworICAgIGlmIChyZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUUl9GUkFNRSkKKyAgICAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lID0gMTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdnA4X2dldF9yZWZlcmVuY2UoVlA4X0NPTVAgKmNwaSwgZW51bSB2cHhfcmVmX2ZyYW1lX3R5cGUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisgICAgaW50IHJlZl9mYl9pZHg7CisKKyAgICBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0xBU1RfRlJBTUUpCisgICAgICAgIHJlZl9mYl9pZHggPSBjbS0+bHN0X2ZiX2lkeDsKKyAgICBlbHNlIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfR09MRF9GUkFNRSkKKyAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5nbGRfZmJfaWR4OworICAgIGVsc2UgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9BTFRSX0ZSQU1FKQorICAgICAgICByZWZfZmJfaWR4ID0gY20tPmFsdF9mYl9pZHg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKCZjbS0+eXYxMl9mYltyZWZfZmJfaWR4XSwgc2QpOworCisgICAgcmV0dXJuIDA7Cit9CitpbnQgdnA4X3NldF9yZWZlcmVuY2UoVlA4X0NPTVAgKmNwaSwgZW51bSB2cHhfcmVmX2ZyYW1lX3R5cGUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisKKyAgICBpbnQgcmVmX2ZiX2lkeDsKKworICAgIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfTEFTVF9GUkFNRSkKKyAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5sc3RfZmJfaWR4OworICAgIGVsc2UgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9HT0xEX0ZSQU1FKQorICAgICAgICByZWZfZmJfaWR4ID0gY20tPmdsZF9mYl9pZHg7CisgICAgZWxzZSBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0FMVFJfRlJBTUUpCisgICAgICAgIHJlZl9mYl9pZHggPSBjbS0+YWx0X2ZiX2lkeDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHZwOF95djEyX2NvcHlfZnJhbWUoc2QsICZjbS0+eXYxMl9mYltyZWZfZmJfaWR4XSk7CisKKyAgICByZXR1cm4gMDsKK30KK2ludCB2cDhfdXBkYXRlX2VudHJvcHkoVlA4X0NPTVAgKmNwaSwgaW50IHVwZGF0ZSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKyAgICBjbS0+cmVmcmVzaF9lbnRyb3B5X3Byb2JzID0gdXBkYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKKworI2lmIE9VVFBVVF9ZVVZfU1JDCit2b2lkIHZwOF93cml0ZV95dXZfZnJhbWUoY29uc3QgY2hhciAqbmFtZSwgWVYxMl9CVUZGRVJfQ09ORklHICpzKQoreworICAgIEZJTEUgKnl1dl9maWxlID0gZm9wZW4obmFtZSwgImFiIik7CisgICAgdW5zaWduZWQgY2hhciAqc3JjID0gcy0+eV9idWZmZXI7CisgICAgaW50IGggPSBzLT55X2hlaWdodDsKKworICAgIGRvCisgICAgeworICAgICAgICBmd3JpdGUoc3JjLCBzLT55X3dpZHRoLCAxLCAgeXV2X2ZpbGUpOworICAgICAgICBzcmMgKz0gcy0+eV9zdHJpZGU7CisgICAgfQorICAgIHdoaWxlICgtLWgpOworCisgICAgc3JjID0gcy0+dV9idWZmZXI7CisgICAgaCA9IHMtPnV2X2hlaWdodDsKKworICAgIGRvCisgICAgeworICAgICAgICBmd3JpdGUoc3JjLCBzLT51dl93aWR0aCwgMSwgIHl1dl9maWxlKTsKKyAgICAgICAgc3JjICs9IHMtPnV2X3N0cmlkZTsKKyAgICB9CisgICAgd2hpbGUgKC0taCk7CisKKyAgICBzcmMgPSBzLT52X2J1ZmZlcjsKKyAgICBoID0gcy0+dXZfaGVpZ2h0OworCisgICAgZG8KKyAgICB7CisgICAgICAgIGZ3cml0ZShzcmMsIHMtPnV2X3dpZHRoLCAxLCB5dXZfZmlsZSk7CisgICAgICAgIHNyYyArPSBzLT51dl9zdHJpZGU7CisgICAgfQorICAgIHdoaWxlICgtLWgpOworCisgICAgZmNsb3NlKHl1dl9maWxlKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHNjYWxlX2FuZF9leHRlbmRfc291cmNlKFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QsIFZQOF9DT01QICpjcGkpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisKKyAgICAvKiBhcmUgd2UgcmVzaXppbmcgdGhlIGltYWdlICovCisgICAgaWYgKGNtLT5ob3Jpel9zY2FsZSAhPSAwIHx8IGNtLT52ZXJ0X3NjYWxlICE9IDApCisgICAgeworI2lmIENPTkZJR19TUEFUSUFMX1JFU0FNUExJTkcKKyAgICAgICAgaW50IFVOSU5JVElBTElaRURfSVNfU0FGRShociksIFVOSU5JVElBTElaRURfSVNfU0FGRShocyk7CisgICAgICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUodnIpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUodnMpOworICAgICAgICBpbnQgdG1wX2hlaWdodDsKKworICAgICAgICBpZiAoY20tPnZlcnRfc2NhbGUgPT0gMykKKyAgICAgICAgICAgIHRtcF9oZWlnaHQgPSA5OworICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXBfaGVpZ2h0ID0gMTE7CisKKyAgICAgICAgU2NhbGUyUmF0aW8oY20tPmhvcml6X3NjYWxlLCAmaHIsICZocyk7CisgICAgICAgIFNjYWxlMlJhdGlvKGNtLT52ZXJ0X3NjYWxlLCAmdnIsICZ2cyk7CisKKyAgICAgICAgdnA4X3NjYWxlX2ZyYW1lKHNkLCAmY3BpLT5zY2FsZWRfc291cmNlLCBjbS0+dGVtcF9zY2FsZV9mcmFtZS55X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9oZWlnaHQsIGhzLCBociwgdnMsIHZyLCAwKTsKKworICAgICAgICB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycygmY3BpLT5zY2FsZWRfc291cmNlKTsKKyAgICAgICAgY3BpLT5Tb3VyY2UgPSAmY3BpLT5zY2FsZWRfc291cmNlOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3BpLT5Tb3VyY2UgPSBzZDsKK30KKworCitzdGF0aWMgaW50IHJlc2l6ZV9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSkKK3sKKyNpZiBDT05GSUdfU1BBVElBTF9SRVNBTVBMSU5HCisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisKKyAgICAvKiBEbyB3ZSBuZWVkIHRvIGFwcGx5IHJlc2FtcGxpbmcgZm9yIG9uZSBwYXNzIGNici4KKyAgICAgKiBJbiBvbmUgcGFzcyB0aGlzIGlzIG1vcmUgbGltaXRlZCB0aGFuIGluIHR3byBwYXNzIGNicgorICAgICAqIFRoZSB0ZXN0IGFuZCBhbnkgY2hhbmdlIGlzIG9ubHkgbWFkZSBvbmUgcGVyIGtleSBmcmFtZSBzZXF1ZW5jZQorICAgICAqLworICAgIGlmIChjcGktPm94Y2YuYWxsb3dfc3BhdGlhbF9yZXNhbXBsaW5nICYmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikpCisgICAgeworICAgICAgICBpbnQgVU5JTklUSUFMSVpFRF9JU19TQUZFKGhyKSwgVU5JTklUSUFMSVpFRF9JU19TQUZFKGhzKTsKKyAgICAgICAgaW50IFVOSU5JVElBTElaRURfSVNfU0FGRSh2ciksIFVOSU5JVElBTElaRURfSVNfU0FGRSh2cyk7CisgICAgICAgIGludCBuZXdfd2lkdGgsIG5ld19oZWlnaHQ7CisKKyAgICAgICAgLyogSWYgd2UgYXJlIGJlbG93IHRoZSByZXNhbXBsZSBET1dOIHdhdGVybWFyayB0aGVuIHNjYWxlIGRvd24gYQorICAgICAgICAgKiBub3RjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA8IChjcGktPm94Y2YucmVzYW1wbGVfZG93bl93YXRlcl9tYXJrICogY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgY20tPmhvcml6X3NjYWxlID0gKGNtLT5ob3Jpel9zY2FsZSA8IE9ORVRXTykgPyBjbS0+aG9yaXpfc2NhbGUgKyAxIDogT05FVFdPOworICAgICAgICAgICAgY20tPnZlcnRfc2NhbGUgPSAoY20tPnZlcnRfc2NhbGUgPCBPTkVUV08pID8gY20tPnZlcnRfc2NhbGUgKyAxIDogT05FVFdPOworICAgICAgICB9CisgICAgICAgIC8qIFNob3VsZCB3ZSBub3cgc3RhcnQgc2NhbGluZyBiYWNrIHVwICovCisgICAgICAgIGVsc2UgaWYgKGNwaS0+YnVmZmVyX2xldmVsID4gKGNwaS0+b3hjZi5yZXNhbXBsZV91cF93YXRlcl9tYXJrICogY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgY20tPmhvcml6X3NjYWxlID0gKGNtLT5ob3Jpel9zY2FsZSA+IE5PUk1BTCkgPyBjbS0+aG9yaXpfc2NhbGUgLSAxIDogTk9STUFMOworICAgICAgICAgICAgY20tPnZlcnRfc2NhbGUgPSAoY20tPnZlcnRfc2NhbGUgPiBOT1JNQUwpID8gY20tPnZlcnRfc2NhbGUgLSAxIDogTk9STUFMOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IHRoZSBuZXcgaGllZ2h0IGFuZCB3aWR0aCAqLworICAgICAgICBTY2FsZTJSYXRpbyhjbS0+aG9yaXpfc2NhbGUsICZociwgJmhzKTsKKyAgICAgICAgU2NhbGUyUmF0aW8oY20tPnZlcnRfc2NhbGUsICZ2ciwgJnZzKTsKKyAgICAgICAgbmV3X3dpZHRoID0gKChocyAtIDEpICsgKGNwaS0+b3hjZi5XaWR0aCAqIGhyKSkgLyBoczsKKyAgICAgICAgbmV3X2hlaWdodCA9ICgodnMgLSAxKSArIChjcGktPm94Y2YuSGVpZ2h0ICogdnIpKSAvIHZzOworCisgICAgICAgIC8qIElmIHRoZSBpbWFnZSBzaXplIGhhcyBjaGFuZ2VkIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVycworICAgICAgICAgKiBhbmQgcmVzYW1wbGUgdGhlIHNvdXJjZSBpbWFnZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjbS0+V2lkdGggIT0gbmV3X3dpZHRoKSB8fCAoY20tPkhlaWdodCAhPSBuZXdfaGVpZ2h0KSkKKyAgICAgICAgeworICAgICAgICAgICAgY20tPldpZHRoID0gbmV3X3dpZHRoOworICAgICAgICAgICAgY20tPkhlaWdodCA9IG5ld19oZWlnaHQ7CisgICAgICAgICAgICB2cDhfYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7CisgICAgICAgICAgICBzY2FsZV9hbmRfZXh0ZW5kX3NvdXJjZShjcGktPnVuX3NjYWxlZF9zb3VyY2UsIGNwaSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdXBkYXRlX2FsdF9yZWZfZnJhbWVfc3RhdHMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKworICAgIC8qIFNlbGVjdCBhbiBpbnRlcnZhbCBiZWZvcmUgbmV4dCBHRiBvciBhbHRyZWYgKi8KKyAgICBpZiAoIWNwaS0+YXV0b19nb2xkKQorICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBERUZBVUxUX0dGX0lOVEVSVkFMOworCisgICAgaWYgKChjcGktPnBhc3MgIT0gMikgJiYgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlKQorICAgIHsKKyAgICAgICAgY3BpLT5jdXJyZW50X2dmX2ludGVydmFsID0gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOworCisgICAgICAgIC8qIFNldCB0aGUgYml0cyBwZXIgZnJhbWUgdGhhdCB3ZSBzaG91bGQgdHJ5IGFuZCByZWNvdmVyIGluCisgICAgICAgICAqIHN1YnNlcXVlbnQgaW50ZXIgZnJhbWVzIHRvIGFjY291bnQgZm9yIHRoZSBleHRyYSBHRiBzcGVuZC4uLgorICAgICAgICAgKiBub3RlIHRoYXQgaGlzIGRvZXMgbm90IGFwcGx5IGZvciBHRiB1cGRhdGVzIHRoYXQgb2NjdXIKKyAgICAgICAgICogY29pbmNpZGVudCB3aXRoIGEga2V5IGZyYW1lIGFzIHRoZSBleHRyYSBjb3N0IG9mIGtleSBmcmFtZXMgaXMKKyAgICAgICAgICogZGVhbHQgd2l0aCBlbHNld2hlcmUuCisgICAgICAgICAqLworICAgICAgICBjcGktPmdmX292ZXJzcGVuZF9iaXRzICs9IGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemU7CisgICAgICAgIGNwaS0+bm9uX2dmX2JpdHJhdGVfYWRqdXN0bWVudCA9IGNwaS0+Z2Zfb3ZlcnNwZW5kX2JpdHMgLyBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7CisgICAgfQorCisgICAgLyogVXBkYXRlIGRhdGEgc3RydWN0dXJlIHRoYXQgbW9uaXRvcnMgbGV2ZWwgb2YgcmVmZXJlbmNlIHRvIGxhc3QgR0YgKi8KKyAgICB2cHhfbWVtc2V0KGNwaS0+Z2ZfYWN0aXZlX2ZsYWdzLCAxLCAoY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scykpOworICAgIGNwaS0+Z2ZfYWN0aXZlX2NvdW50ID0gY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29sczsKKworICAgIC8qIHRoaXMgZnJhbWUgcmVmcmVzaGVzIG1lYW5zIG5leHQgZnJhbWVzIGRvbid0IHVubGVzcyBzcGVjaWZpZWQgYnkgdXNlciAqLworICAgIGNwaS0+Y29tbW9uLmZyYW1lc19zaW5jZV9nb2xkZW4gPSAwOworCisgICAgLyogQ2xlYXIgdGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgdXBkYXRlIHBlbmRpbmcgZmxhZy4gKi8KKyAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgPSAwOworCisgICAgLyogU2V0IHRoZSBhbHRlcm5hdGUgcmVmZXJuY2UgZnJhbWUgYWN0aXZlIGZsYWcgKi8KKyAgICBjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSA9IDE7CisKKworfQorc3RhdGljIHZvaWQgdXBkYXRlX2dvbGRlbl9mcmFtZV9zdGF0cyhWUDhfQ09NUCAqY3BpKQoreworICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOworCisgICAgLyogVXBkYXRlIHRoZSBHb2xkZW4gZnJhbWUgdXNhZ2UgY291bnRzLiAqLworICAgIGlmIChjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgeworICAgICAgICAvKiBTZWxlY3QgYW4gaW50ZXJ2YWwgYmVmb3JlIG5leHQgR0YgKi8KKyAgICAgICAgaWYgKCFjcGktPmF1dG9fZ29sZCkKKyAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9IERFRkFVTFRfR0ZfSU5URVJWQUw7CisKKyAgICAgICAgaWYgKChjcGktPnBhc3MgIT0gMikgJiYgKGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPmN1cnJlbnRfZ2ZfaW50ZXJ2YWwgPSBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgYml0cyBwZXIgZnJhbWUgdGhhdCB3ZSBzaG91bGQgdHJ5IGFuZCByZWNvdmVyIGluCisgICAgICAgICAgICAgKiBzdWJzZXF1ZW50IGludGVyIGZyYW1lcyB0byBhY2NvdW50IGZvciB0aGUgZXh0cmEgR0Ygc3BlbmQuLi4KKyAgICAgICAgICAgICAqIG5vdGUgdGhhdCBoaXMgZG9lcyBub3QgYXBwbHkgZm9yIEdGIHVwZGF0ZXMgdGhhdCBvY2N1cgorICAgICAgICAgICAgICogY29pbmNpZGVudCB3aXRoIGEga2V5IGZyYW1lIGFzIHRoZSBleHRyYSBjb3N0IG9mIGtleSBmcmFtZXMKKyAgICAgICAgICAgICAqIGlzIGRlYWx0IHdpdGggZWxzZXdoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYgIWNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENhbGNsdWF0ZSBHRiBiaXRzIHRvIGJlIHJlY292ZXJlZAorICAgICAgICAgICAgICAgICAqIFByb2plY3RlZCBzaXplIC0gYXYgZnJhbWUgYml0cyBhdmFpbGFibGUgZm9yIGludGVyCisgICAgICAgICAgICAgICAgICogZnJhbWVzIGZvciBjbGlwIGFzIGEgd2hvbGUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjcGktPmdmX292ZXJzcGVuZF9iaXRzICs9IChjcGktPnByb2plY3RlZF9mcmFtZV9zaXplIC0gY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjcGktPm5vbl9nZl9iaXRyYXRlX2FkanVzdG1lbnQgPSBjcGktPmdmX292ZXJzcGVuZF9iaXRzIC8gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOworCisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtb25pdG9ycyBsZXZlbCBvZiByZWZlcmVuY2UgdG8gbGFzdCBHRiAqLworICAgICAgICB2cHhfbWVtc2V0KGNwaS0+Z2ZfYWN0aXZlX2ZsYWdzLCAxLCAoY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scykpOworICAgICAgICBjcGktPmdmX2FjdGl2ZV9jb3VudCA9IGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHM7CisKKyAgICAgICAgLyogdGhpcyBmcmFtZSByZWZyZXNoZXMgbWVhbnMgbmV4dCBmcmFtZXMgZG9uJ3QgdW5sZXNzIHNwZWNpZmllZCBieQorICAgICAgICAgKiB1c2VyCisgICAgICAgICAqLworICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOworICAgICAgICBjcGktPmNvbW1vbi5mcmFtZXNfc2luY2VfZ29sZGVuID0gMDsKKworICAgICAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbSU5UUkFfRlJBTUVdID0gMTsKKyAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdID0gMTsKKyAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gPSAxOworICAgICAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbQUxUUkVGX0ZSQU1FXSA9IDE7CisKKyAgICAgICAgLyogKioqKioqKiogRml4ZWQgUSB0ZXN0IGNvZGUgb25seSAqKioqKioqKioqKiogKi8KKyAgICAgICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgQUxUIHJlZmVyZW5jZSBmb3IgdGhlIG5leHQgZ3JvdXAgb2YKKyAgICAgICAgICogZnJhbWVzIHNldCBhIGZsYWcgdG8gc2F5IHNvLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDAgJiYKKyAgICAgICAgICAgIGNwaS0+b3hjZi5wbGF5X2FsdGVybmF0ZSAmJiAhY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nKQorICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUgPSAwOworCisgICAgICAgIC8qIERlY3JlbWVudCBjb3VudCBkb3duIHRpbGwgbmV4dCBnZiAqLworICAgICAgICBpZiAoY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID4gMCkKKyAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZS0tOworCisgICAgfQorICAgIGVsc2UgaWYgKCFjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCisgICAgeworICAgICAgICAvKiBEZWNyZW1lbnQgY291bnQgZG93biB0aWxsIG5leHQgZ2YgKi8KKyAgICAgICAgaWYgKGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA+IDApCisgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUtLTsKKworICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgICAgIGNwaS0+Y29tbW9uLmZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWUgLS07CisKKyAgICAgICAgY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiArKzsKKworICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtJTlRSQV9GUkFNRV0gKz0gY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbSU5UUkFfRlJBTUVdOworICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdICs9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdOworICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKz0gY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbR09MREVOX0ZSQU1FXTsKKyAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtBTFRSRUZfRlJBTUVdICs9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgcmVmZXJlbmNlIGZyYW1lIHByb2JhYmlsaXR5IGVzdGltYXRlcyB0aGF0CisgKiB3aWxsIGJlIHVzZWQgZHVyaW5nIG1vZGUgc2VsZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9yZF9yZWZfZnJhbWVfcHJvYnMoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKworICAgIGNvbnN0IGludCAqY29uc3QgcmZjdCA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlOworICAgIGNvbnN0IGludCByZl9pbnRyYSA9IHJmY3RbSU5UUkFfRlJBTUVdOworICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07CisKKyAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkID0gMjU1OworICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCAgPSAxMjg7CisgICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCAgPSAxMjg7CisgICAgfQorICAgIGVsc2UgaWYgKCEocmZfaW50cmEgKyByZl9pbnRlcikpCisgICAgeworICAgICAgICBjcGktPnByb2JfaW50cmFfY29kZWQgPSA2MzsKKyAgICAgICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgID0gMTI4OworICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgICAgPSAxMjg7CisgICAgfQorCisgICAgLyogdXBkYXRlIHJlZmVyZW5jZSBmcmFtZSBjb3N0cyBzaW5jZSB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gd2hhdCB3ZSBnb3QKKyAgICAgKiBsYXN0IGZyYW1lLgorICAgICAqLworICAgIGlmIChjcGktPm94Y2YubnVtYmVyX29mX2xheWVycyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkICs9IDQwOworICAgICAgICAgICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgPSAyMDA7CisgICAgICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNwaS0+Y29tbW9uLmZyYW1lc19zaW5jZV9nb2xkZW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgPSAyMTQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IDE5MjsKKyAgICAgICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCA9IDIyMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkIC09IDIwOworCisgICAgICAgICAgICBpZiAoY3BpLT5wcm9iX2dmX2NvZGVkIDwgMTApCisgICAgICAgICAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkID0gMTA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkKKyAgICAgICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCA9IDI1NTsKKyAgICB9Cit9CisKKworLyogMSA9IGtleSwgMCA9IGludGVyICovCitzdGF0aWMgaW50IGRlY2lkZV9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKworICAgIGludCBjb2RlX2tleV9mcmFtZSA9IDA7CisKKyAgICBjcGktPmtmX2Jvb3N0ID0gMDsKKworICAgIGlmIChjcGktPlNwZWVkID4gMTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogQ2xlYXIgZG93biBtbXggcmVnaXN0ZXJzICovCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgaWYgKChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMikgJiYgKGNwaS0+U3BlZWQgPj0gNSkgJiYgKGNwaS0+c2YuUkQgPT0gMCkpCisgICAgeworICAgICAgICBkb3VibGUgY2hhbmdlID0gMS4wICogYWJzKChpbnQpKGNwaS0+bWIuaW50cmFfZXJyb3IgLQorICAgICAgICAgICAgY3BpLT5sYXN0X2ludHJhX2Vycm9yKSkgLyAoMSArIGNwaS0+bGFzdF9pbnRyYV9lcnJvcik7CisgICAgICAgIGRvdWJsZSBjaGFuZ2UyID0gMS4wICogYWJzKChpbnQpKGNwaS0+bWIucHJlZGljdGlvbl9lcnJvciAtCisgICAgICAgICAgICBjcGktPmxhc3RfcHJlZGljdGlvbl9lcnJvcikpIC8gKDEgKyBjcGktPmxhc3RfcHJlZGljdGlvbl9lcnJvcik7CisgICAgICAgIGRvdWJsZSBtaW5lcnJvciA9IGNtLT5NQnMgKiAyNTY7CisKKyAgICAgICAgY3BpLT5sYXN0X2ludHJhX2Vycm9yID0gY3BpLT5tYi5pbnRyYV9lcnJvcjsKKyAgICAgICAgY3BpLT5sYXN0X3ByZWRpY3Rpb25fZXJyb3IgPSBjcGktPm1iLnByZWRpY3Rpb25fZXJyb3I7CisKKyAgICAgICAgaWYgKDEwICogY3BpLT5tYi5pbnRyYV9lcnJvciAvICgxICsgY3BpLT5tYi5wcmVkaWN0aW9uX2Vycm9yKSA8IDE1CisgICAgICAgICAgICAmJiBjcGktPm1iLnByZWRpY3Rpb25fZXJyb3IgPiBtaW5lcnJvcgorICAgICAgICAgICAgJiYgKGNoYW5nZSA+IC4yNSB8fCBjaGFuZ2UyID4gLjI1KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyooY2hhbmdlID4gMS40IHx8IGNoYW5nZSA8IC43NSkmJiBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+IGNwaS0+bGFzdF9mcmFtZV9wZXJjZW50X2ludHJhICsgMyovCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworCisgICAgfQorCisgICAgLyogSWYgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZSB3ZSBtaWdodCBhcyB3ZWxsIGNvZGUgYSBrZXkgZnJhbWUgKi8KKyAgICBpZiAoKChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA9PSAxMDApICYmCisgICAgICAgICAoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiAoY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgKyAyKSkpIHx8CisgICAgICAgICgoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiA5NSkgJiYKKyAgICAgICAgIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+PSAoY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgKyA1KSkpKQorICAgIHsKKyAgICAgICAgY29kZV9rZXlfZnJhbWUgPSAxOworICAgIH0KKyAgICAvKiBpbiBhZGRpdGlvbiBpZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlIGFuZCB0aGlzIGlzIG5vdCBhIGdvbGRlbiBmcmFtZQorICAgICAqIHRoZW4gY29kZSBhIGtleSBmcmFtZSBOb3RlIHRoYXQgb24gZ29sZGVuIGZyYW1lcyB0aGVyZSBvZnRlbiBzZWVtcworICAgICAqIHRvIGJlIGEgcG9wIGluIGludHJhIHVzZWFnZSBhbnl3YXkgaGVuY2UgdGhpcyByZXN0cmljdGlvbiBpcworICAgICAqIGRlc2lnbmVkIHRvIHByZXZlbnQgc3B1cmlvdXMga2V5IGZyYW1lcy4gVGhlIEludHJhIHBvcCBuZWVkcyB0byBiZQorICAgICAqIGludmVzdGlnYXRlZC4KKyAgICAgKi8KKyAgICBlbHNlIGlmICgoKGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID4gNjApICYmCisgICAgICAgICAgICAgIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+IChjcGktPmxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYSAqIDIpKSkgfHwKKyAgICAgICAgICAgICAoKGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID4gNzUpICYmCisgICAgICAgICAgICAgIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+IChjcGktPmxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYSAqIDMgLyAyKSkpIHx8CisgICAgICAgICAgICAgKChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+IDkwKSAmJgorICAgICAgICAgICAgICAoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiAoY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgKyAxMCkpKSkKKyAgICB7CisgICAgICAgIGlmICghY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQorICAgICAgICAgICAgY29kZV9rZXlfZnJhbWUgPSAxOworICAgIH0KKworICAgIHJldHVybiBjb2RlX2tleV9mcmFtZTsKKworfQorCisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKK3N0YXRpYyB2b2lkIFBhc3MxRW5jb2RlKFZQOF9DT01QICpjcGksIHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCAqZnJhbWVfZmxhZ3MpCit7CisgICAgKHZvaWQpIHNpemU7CisgICAgKHZvaWQpIGRlc3Q7CisgICAgKHZvaWQpIGZyYW1lX2ZsYWdzOworICAgIHZwOF9zZXRfcXVhbnRpemVyKGNwaSwgMjYpOworCisgICAgdnA4X2ZpcnN0X3Bhc3MoY3BpKTsKK30KKyNlbmRpZgorCisjaWYgMAordm9pZCB3cml0ZV9jeF9mcmFtZV90b19maWxlKFlWMTJfQlVGRkVSX0NPTkZJRyAqZnJhbWUsIGludCB0aGlzX2ZyYW1lKQoreworCisgICAgLyogd3JpdGUgdGhlIGZyYW1lICovCisgICAgRklMRSAqeWZyYW1lOworICAgIGludCBpOworICAgIGNoYXIgZmlsZW5hbWVbMjU1XTsKKworICAgIHNwcmludGYoZmlsZW5hbWUsICJjeFxceSUwNGQucmF3IiwgdGhpc19mcmFtZSk7CisgICAgeWZyYW1lID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT55X2hlaWdodDsgaSsrKQorICAgICAgICBmd3JpdGUoZnJhbWUtPnlfYnVmZmVyICsgaSAqIGZyYW1lLT55X3N0cmlkZSwgZnJhbWUtPnlfd2lkdGgsIDEsIHlmcmFtZSk7CisKKyAgICBmY2xvc2UoeWZyYW1lKTsKKyAgICBzcHJpbnRmKGZpbGVuYW1lLCAiY3hcXHUlMDRkLnJhdyIsIHRoaXNfZnJhbWUpOworICAgIHlmcmFtZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+dXZfaGVpZ2h0OyBpKyspCisgICAgICAgIGZ3cml0ZShmcmFtZS0+dV9idWZmZXIgKyBpICogZnJhbWUtPnV2X3N0cmlkZSwgZnJhbWUtPnV2X3dpZHRoLCAxLCB5ZnJhbWUpOworCisgICAgZmNsb3NlKHlmcmFtZSk7CisgICAgc3ByaW50ZihmaWxlbmFtZSwgImN4XFx2JTA0ZC5yYXciLCB0aGlzX2ZyYW1lKTsKKyAgICB5ZnJhbWUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPnV2X2hlaWdodDsgaSsrKQorICAgICAgICBmd3JpdGUoZnJhbWUtPnZfYnVmZmVyICsgaSAqIGZyYW1lLT51dl9zdHJpZGUsIGZyYW1lLT51dl93aWR0aCwgMSwgeWZyYW1lKTsKKworICAgIGZjbG9zZSh5ZnJhbWUpOworfQorI2VuZGlmCisvKiByZXR1cm4gb2YgMCBtZWFucyBkcm9wIGZyYW1lICovCisKKy8qIEZ1bmN0aW9uIHRvIHRlc3QgZm9yIGNvbmRpdGlvbnMgdGhhdCBpbmRlaWNhdGUgd2Ugc2hvdWxkIGxvb3AKKyAqIGJhY2sgYW5kIHJlY29kZSBhIGZyYW1lLgorICovCitzdGF0aWMgaW50IHJlY29kZV9sb29wX3Rlc3QoIFZQOF9DT01QICpjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaF9saW1pdCwgaW50IGxvd19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxLCBpbnQgbWF4cSwgaW50IG1pbnEgKQoreworICAgIGludCBmb3JjZV9yZWNvZGUgPSAwOworICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOworCisgICAgLyogSXMgZnJhbWUgcmVjb2RlIGFsbG93ZWQgYXQgYWxsCisgICAgICogWWVzIGlmIGVpdGhlciByZWNvZGUgbW9kZSAxIGlzIHNlbGVjdGVkIG9yIG1vZGUgdHdvIGlzIHNlbGN0ZWQKKyAgICAgKiBhbmQgdGhlIGZyYW1lIGlzIGEga2V5IGZyYW1lLiBnb2xkZW4gZnJhbWUgb3IgYWx0X3JlZl9mcmFtZQorICAgICAqLworICAgIGlmICggKGNwaS0+c2YucmVjb2RlX2xvb3AgPT0gMSkgfHwKKyAgICAgICAgICggKGNwaS0+c2YucmVjb2RlX2xvb3AgPT0gMikgJiYKKyAgICAgICAgICAgKCAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB8fAorICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSB8fAorICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgKSApICkKKyAgICB7CisgICAgICAgIC8qIEdlbmVyYWwgb3ZlciBhbmQgdW5kZXIgc2hvb3QgdGVzdHMgKi8KKyAgICAgICAgaWYgKCAoKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPiBoaWdoX2xpbWl0KSAmJiAocSA8IG1heHEpKSB8fAorICAgICAgICAgICAgICgoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA8IGxvd19saW1pdCkgJiYgKHEgPiBtaW5xKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JjZV9yZWNvZGUgPSAxOworICAgICAgICB9CisgICAgICAgIC8qIFNwZWNpYWwgQ29uc3RyYWluZWQgcXVhbGl0eSB0ZXN0cyAqLworICAgICAgICBlbHNlIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVuZGVyc2hvb3QgYW5kIGJlbG93IGF1dG8gY3EgbGV2ZWwgKi8KKyAgICAgICAgICAgIGlmICggKHEgPiBjcGktPmNxX3RhcmdldF9xdWFsaXR5KSAmJgorICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA8CisgICAgICAgICAgICAgICAgICAgICAoKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiA3KSA+PiAzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yY2VfcmVjb2RlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNldmVyZSB1bmRlcnNob290IGFuZCBiZXR3ZWVuIGF1dG8gYW5kIHVzZXIgY3EgbGV2ZWwgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKCAocSA+IGNwaS0+b3hjZi5jcV9sZXZlbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA8IGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID4gY3BpLT5veGNmLmNxX2xldmVsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JjZV9yZWNvZGUgPSAxOworICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+b3hjZi5jcV9sZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmb3JjZV9yZWNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yZWZlcmVuY2VfZnJhbWVzKFZQOF9DT01QICpjcGkpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICp5djEyX2ZiID0gY20tPnl2MTJfZmI7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHRoZSBuZXcgZnJhbWUgaGFzIGJlZW4gZW5jb2RlZC4KKyAgICAgKiBJZiBhbnkgYnVmZmVyIGNvcHkgLyBzd2FwcGluZyBpcyBzaWduYWxlZCBpdCBzaG91bGQgYmUgZG9uZSBoZXJlLgorICAgICAqLworCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIHl2MTJfZmJbY20tPm5ld19mYl9pZHhdLmZsYWdzIHw9IFZQOF9HT0xEX0ZSQU1FIHwgVlA4X0FMVFJfRlJBTUUgOworCisgICAgICAgIHl2MTJfZmJbY20tPmdsZF9mYl9pZHhdLmZsYWdzICY9IH5WUDhfR09MRF9GUkFNRTsKKyAgICAgICAgeXYxMl9mYltjbS0+YWx0X2ZiX2lkeF0uZmxhZ3MgJj0gflZQOF9BTFRSX0ZSQU1FOworCisgICAgICAgIGNtLT5hbHRfZmJfaWR4ID0gY20tPmdsZF9mYl9pZHggPSBjbS0+bmV3X2ZiX2lkeDsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgY3BpLT5jdXJyZW50X3JlZl9mcmFtZXNbR09MREVOX0ZSQU1FXSA9IGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lOworICAgICAgICBjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tBTFRSRUZfRlJBTUVdID0gY20tPmN1cnJlbnRfdmlkZW9fZnJhbWU7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSAgICAvKiBGb3Igbm9uIGtleSBmcmFtZXMgKi8KKyAgICB7CisgICAgICAgIGlmIChjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoIWNtLT5jb3B5X2J1ZmZlcl90b19hcmYpOworCisgICAgICAgICAgICBjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF0uZmxhZ3MgfD0gVlA4X0FMVFJfRlJBTUU7CisgICAgICAgICAgICBjbS0+eXYxMl9mYltjbS0+YWx0X2ZiX2lkeF0uZmxhZ3MgJj0gflZQOF9BTFRSX0ZSQU1FOworICAgICAgICAgICAgY20tPmFsdF9mYl9pZHggPSBjbS0+bmV3X2ZiX2lkeDsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgIGNwaS0+Y3VycmVudF9yZWZfZnJhbWVzW0FMVFJFRl9GUkFNRV0gPSBjbS0+Y3VycmVudF92aWRlb19mcmFtZTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCghKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgJiB+MHgzKSk7CisKKyAgICAgICAgICAgIGlmIChjbS0+Y29weV9idWZmZXJfdG9fYXJmID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY20tPmFsdF9mYl9pZHggIT0gY20tPmxzdF9mYl9pZHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS5mbGFncyB8PSBWUDhfQUxUUl9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgeXYxMl9mYltjbS0+YWx0X2ZiX2lkeF0uZmxhZ3MgJj0gflZQOF9BTFRSX0ZSQU1FOworICAgICAgICAgICAgICAgICAgICBjbS0+YWx0X2ZiX2lkeCA9IGNtLT5sc3RfZmJfaWR4OworCisjaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgICAgICAgICAgICAgICAgICBjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tBTFRSRUZfRlJBTUVdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+Y3VycmVudF9yZWZfZnJhbWVzW0xBU1RfRlJBTUVdOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBpZiAoY20tPmNvcHlfYnVmZmVyX3RvX2FyZiA9PSAyKSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNtLT5hbHRfZmJfaWR4ICE9IGNtLT5nbGRfZmJfaWR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeXYxMl9mYltjbS0+Z2xkX2ZiX2lkeF0uZmxhZ3MgfD0gVlA4X0FMVFJfRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIHl2MTJfZmJbY20tPmFsdF9mYl9pZHhdLmZsYWdzICY9IH5WUDhfQUxUUl9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgY20tPmFsdF9mYl9pZHggPSBjbS0+Z2xkX2ZiX2lkeDsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5jdXJyZW50X3JlZl9mcmFtZXNbQUxUUkVGX0ZSQU1FXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tHT0xERU5fRlJBTUVdOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCFjbS0+Y29weV9idWZmZXJfdG9fZ2YpOworCisgICAgICAgICAgICBjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF0uZmxhZ3MgfD0gVlA4X0dPTERfRlJBTUU7CisgICAgICAgICAgICBjbS0+eXYxMl9mYltjbS0+Z2xkX2ZiX2lkeF0uZmxhZ3MgJj0gflZQOF9HT0xEX0ZSQU1FOworICAgICAgICAgICAgY20tPmdsZF9mYl9pZHggPSBjbS0+bmV3X2ZiX2lkeDsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgIGNwaS0+Y3VycmVudF9yZWZfZnJhbWVzW0dPTERFTl9GUkFNRV0gPSBjbS0+Y3VycmVudF92aWRlb19mcmFtZTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZikKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCEoY20tPmNvcHlfYnVmZmVyX3RvX2FyZiAmIH4weDMpKTsKKworICAgICAgICAgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZiA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNtLT5nbGRfZmJfaWR4ICE9IGNtLT5sc3RfZmJfaWR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0uZmxhZ3MgfD0gVlA4X0dPTERfRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIHl2MTJfZmJbY20tPmdsZF9mYl9pZHhdLmZsYWdzICY9IH5WUDhfR09MRF9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgY20tPmdsZF9mYl9pZHggPSBjbS0+bHN0X2ZiX2lkeDsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5jdXJyZW50X3JlZl9mcmFtZXNbR09MREVOX0ZSQU1FXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tMQVNUX0ZSQU1FXTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZiA9PSAyKSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNtLT5hbHRfZmJfaWR4ICE9IGNtLT5nbGRfZmJfaWR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeXYxMl9mYltjbS0+YWx0X2ZiX2lkeF0uZmxhZ3MgfD0gVlA4X0dPTERfRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIHl2MTJfZmJbY20tPmdsZF9mYl9pZHhdLmZsYWdzICY9IH5WUDhfR09MRF9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgY20tPmdsZF9mYl9pZHggPSBjbS0+YWx0X2ZiX2lkeDsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5jdXJyZW50X3JlZl9mcmFtZXNbR09MREVOX0ZSQU1FXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tBTFRSRUZfRlJBTUVdOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNtLT5yZWZyZXNoX2xhc3RfZnJhbWUpCisgICAgeworICAgICAgICBjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF0uZmxhZ3MgfD0gVlA4X0xBU1RfRlJBTUU7CisgICAgICAgIGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS5mbGFncyAmPSB+VlA4X0xBU1RfRlJBTUU7CisgICAgICAgIGNtLT5sc3RfZmJfaWR4ID0gY20tPm5ld19mYl9pZHg7CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgICAgIGNwaS0+Y3VycmVudF9yZWZfZnJhbWVzW0xBU1RfRlJBTUVdID0gY20tPmN1cnJlbnRfdmlkZW9fZnJhbWU7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgdnA4X2xvb3BmaWx0ZXJfZnJhbWUoVlA4X0NPTVAgKmNwaSwgVlA4X0NPTU1PTiAqY20pCit7CisgICAgY29uc3QgRlJBTUVfVFlQRSBmcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7CisKKyAgICBpZiAoY20tPm5vX2xwZikKKyAgICB7CisgICAgICAgIGNtLT5maWx0ZXJfbGV2ZWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgdGltZXI7CisKKyAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0aW1lcik7CisgICAgICAgIGlmIChjcGktPnNmLmF1dG9fZmlsdGVyID09IDApCisgICAgICAgICAgICB2cDhjeF9waWNrX2ZpbHRlcl9sZXZlbF9mYXN0KGNwaS0+U291cmNlLCBjcGkpOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZwOGN4X3BpY2tfZmlsdGVyX2xldmVsKGNwaS0+U291cmNlLCBjcGkpOworCisgICAgICAgIGlmIChjbS0+ZmlsdGVyX2xldmVsID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4Y3hfc2V0X2FsdF9sZl9sZXZlbChjcGksIGNtLT5maWx0ZXJfbGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdGltZXIpOworICAgICAgICBjcGktPnRpbWVfcGlja19scGYgKz0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmdGltZXIpOworICAgIH0KKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCisgICAgICAgIHNlbV9wb3N0KCZjcGktPmhfZXZlbnRfZW5kX2xwZik7IC8qIHNpZ25hbCB0aGF0IHdlIGhhdmUgc2V0IGZpbHRlcl9sZXZlbCAqLworI2VuZGlmCisKKyAgICBpZiAoY20tPmZpbHRlcl9sZXZlbCA+IDApCisgICAgeworICAgICAgICB2cDhfbG9vcF9maWx0ZXJfZnJhbWUoY20sICZjcGktPm1iLmVfbWJkLCBmcmFtZV90eXBlKTsKKyAgICB9CisKKyAgICB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyhjbS0+ZnJhbWVfdG9fc2hvdyk7CisjaWYgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORworICAgIGlmIChjcGktPm94Y2Yubm9pc2Vfc2Vuc2l0aXZpdHkpCisgICAgeworCisKKyAgICAgICAgLyogd2Ugc2hvdWxkbid0IGhhdmUgdG8ga2VlcCBtdWx0aXBsZSBjb3BpZXMgYXMgd2Uga25vdyBpbiBhZHZhbmNlIHdoaWNoCisgICAgICAgICAqIGJ1ZmZlciB3ZSBzaG91bGQgc3RhcnQgLSBmb3Igbm93IHRvIGdldCBzb21ldGhpbmcgdXAgYW5kIHJ1bm5pbmcKKyAgICAgICAgICogSSd2ZSBjaG9zZW4gdG8gY29weSB0aGUgYnVmZmVycworICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICBjcGktPlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgJmNwaS0+ZGVub2lzZXIueXYxMl9ydW5uaW5nX2F2Z1tMQVNUX0ZSQU1FXSk7CisKKyAgICAgICAgICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzKAorICAgICAgICAgICAgICAgICAgICAmY3BpLT5kZW5vaXNlci55djEyX3J1bm5pbmdfYXZnW0xBU1RfRlJBTUVdKTsKKworICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8IE1BWF9SRUZfRlJBTUVTIC0gMTsgaSsrKQorICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmRlbm9pc2VyLnl2MTJfcnVubmluZ19hdmdbaV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogRm9yIG5vbiBrZXkgZnJhbWVzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzKAorICAgICAgICAgICAgICAgICAgICAmY3BpLT5kZW5vaXNlci55djEyX3J1bm5pbmdfYXZnW0xBU1RfRlJBTUVdKTsKKworICAgICAgICAgICAgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgfHwgY20tPmNvcHlfYnVmZmVyX3RvX2FyZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+ZGVub2lzZXIueXYxMl9ydW5uaW5nX2F2Z1tMQVNUX0ZSQU1FXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmRlbm9pc2VyLnl2MTJfcnVubmluZ19hdmdbQUxUUkVGX0ZSQU1FXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lIHx8IGNtLT5jb3B5X2J1ZmZlcl90b19nZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+ZGVub2lzZXIueXYxMl9ydW5uaW5nX2F2Z1tMQVNUX0ZSQU1FXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmRlbm9pc2VyLnl2MTJfcnVubmluZ19hdmdbR09MREVOX0ZSQU1FXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgorCit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9mcmFtZV90b19kYXRhX3JhdGUKKygKKyAgICBWUDhfQ09NUCAqY3BpLAorICAgIHVuc2lnbmVkIGxvbmcgKnNpemUsCisgICAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X2VuZCwKKyAgICB1bnNpZ25lZCBpbnQgKmZyYW1lX2ZsYWdzCispCit7CisgICAgaW50IFE7CisgICAgaW50IGZyYW1lX292ZXJfc2hvb3RfbGltaXQ7CisgICAgaW50IGZyYW1lX3VuZGVyX3Nob290X2xpbWl0OworCisgICAgaW50IExvb3AgPSAwOworICAgIGludCBsb29wX2NvdW50OworCisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisgICAgaW50IGFjdGl2ZV93b3JzdF9xY2hhbmdlZCA9IDA7CisKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorICAgIGludCBxX2xvdzsKKyAgICBpbnQgcV9oaWdoOworICAgIGludCB6YmluX29xX2hpZ2g7CisgICAgaW50IHpiaW5fb3FfbG93ID0gMDsKKyAgICBpbnQgdG9wX2luZGV4OworICAgIGludCBib3R0b21faW5kZXg7CisgICAgaW50IG92ZXJzaG9vdF9zZWVuID0gMDsKKyAgICBpbnQgdW5kZXJzaG9vdF9zZWVuID0gMDsKKyNlbmRpZgorCisgICAgaW50IGRyb3BfbWFyayA9IChpbnQpKGNwaS0+b3hjZi5kcm9wX2ZyYW1lc193YXRlcl9tYXJrICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKTsKKyAgICBpbnQgZHJvcF9tYXJrNzUgPSBkcm9wX21hcmsgKiAyIC8gMzsKKyAgICBpbnQgZHJvcF9tYXJrNTAgPSBkcm9wX21hcmsgLyA0OworICAgIGludCBkcm9wX21hcmsyNSA9IGRyb3BfbWFyayAvIDg7CisKKworICAgIC8qIENsZWFyIGRvd24gbW14IHJlZ2lzdGVycyB0byBhbGxvdyBmbG9hdGluZyBwb2ludCBpbiB3aGF0IGZvbGxvd3MgKi8KKyAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICAvKiAgd2FpdCBmb3IgdGhlIGxhc3QgcGljdHVyZSBsb29wZmlsdGVyIHRocmVhZCBkb25lICovCisgICAgaWYgKGNwaS0+Yl9scGZfcnVubmluZykKKyAgICB7CisgICAgICAgIHNlbV93YWl0KCZjcGktPmhfZXZlbnRfZW5kX2xwZik7CisgICAgICAgIGNwaS0+Yl9scGZfcnVubmluZyA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBpZihjcGktPmZvcmNlX25leHRfZnJhbWVfaW50cmEpCisgICAgeworICAgICAgICBjbS0+ZnJhbWVfdHlwZSA9IEtFWV9GUkFNRTsgIC8qIGRlbGF5ZWQgaW50cmEgZnJhbWUgKi8KKyAgICAgICAgY3BpLT5mb3JjZV9uZXh0X2ZyYW1lX2ludHJhID0gMDsKKyAgICB9CisKKyAgICAvKiBGb3IgYW4gYWx0IHJlZiBmcmFtZSBpbiAyIHBhc3Mgd2Ugc2tpcCB0aGUgY2FsbCB0byB0aGUgc2Vjb25kIHBhc3MKKyAgICAgKiBmdW5jdGlvbiB0aGF0IHNldHMgdGhlIHRhcmdldCBiYW5kd2lkdGgKKyAgICAgKi8KKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorCisgICAgaWYgKGNwaS0+cGFzcyA9PSAyKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUGVyIGZyYW1lIGJpdCB0YXJnZXQgZm9yIHRoZSBhbHQgcmVmIGZyYW1lICovCisgICAgICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggPSBjcGktPnR3b3Bhc3MuZ2ZfYml0czsKKyAgICAgICAgICAgIC8qIHBlciBzZWNvbmQgdGFyZ2V0IGJpdHJhdGUgKi8KKyAgICAgICAgICAgIGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA9IChpbnQpKGNwaS0+dHdvcGFzcy5nZl9iaXRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggID0gKGludCkoY3BpLT50YXJnZXRfYmFuZHdpZHRoIC8gY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSk7CisKKyAgICAvKiBEZWZhdWx0IHR1cm4gb2ZmIGJ1ZmZlciB0byBidWZmZXIgY29weWluZyAqLworICAgIGNtLT5jb3B5X2J1ZmZlcl90b19nZiA9IDA7CisgICAgY20tPmNvcHlfYnVmZmVyX3RvX2FyZiA9IDA7CisKKyAgICAvKiBDbGVhciB6YmluIG92ZXItcXVhbnQgdmFsdWUgYW5kIG1vZGUgYm9vc3QgdmFsdWVzLiAqLworICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gMDsKKyAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7CisKKyAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBtb2RlIGJhc2VkIHR3ZWFraW5nIG9mIHRoZSB6YmluCisgICAgICogRm9yIDIgUGFzcyBPbmx5IHVzZWQgd2hlcmUgR0YvQVJGIHByZWRpY3Rpb24gcXVhbGl0eQorICAgICAqIGlzIGFib3ZlIGEgdGhyZXNob2xkCisgICAgICovCisgICAgY3BpLT56YmluX21vZGVfYm9vc3RfZW5hYmxlZCA9IDE7CisgICAgaWYgKGNwaS0+cGFzcyA9PSAyKQorICAgIHsKKyAgICAgICAgaWYgKCBjcGktPmdmdV9ib29zdCA8PSA0MDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdF9lbmFibGVkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEN1cnJlbnQgZGVmYXVsdCBlbmNvZGVyIGJlaGF2aW91ciBmb3IgdGhlIGFsdHJlZiBzaWduIGJpYXMgKi8KKyAgICBpZiAoY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUpCisgICAgICAgIGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSA9IDE7CisgICAgZWxzZQorICAgICAgICBjcGktPmNvbW1vbi5yZWZfZnJhbWVfc2lnbl9iaWFzW0FMVFJFRl9GUkFNRV0gPSAwOworCisgICAgLyogQ2hlY2sgdG8gc2VlIGlmIGEga2V5IGZyYW1lIGlzIHNpZ25hbGxlZAorICAgICAqIEZvciB0d28gcGFzcyB3aXRoIGF1dG8ga2V5IGZyYW1lIGVuYWJsZWQgY20tPmZyYW1lX3R5cGUgbWF5IGFscmVhZHkKKyAgICAgKiBiZSBzZXQsIGJ1dCBub3QgZm9yIG9uZSBwYXNzLgorICAgICAqLworICAgIGlmICgoY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgPT0gMCkgfHwKKyAgICAgICAgKGNtLT5mcmFtZV9mbGFncyAmIEZSQU1FRkxBR1NfS0VZKSB8fAorICAgICAgICAoY3BpLT5veGNmLmF1dG9fa2V5ICYmIChjcGktPmZyYW1lc19zaW5jZV9rZXkgJSBjcGktPmtleV9mcmFtZV9mcmVxdWVuY3kgPT0gMCkpKQorICAgIHsKKyAgICAgICAgLyogS2V5IGZyYW1lIGZyb20gVkZXL2F1dG8ta2V5ZnJhbWUvZmlyc3QgZnJhbWUgKi8KKyAgICAgICAgY20tPmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7CisgICAgfQorCisjaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgIC8qIEluIG11bHRpLXJlc29sdXRpb24gZW5jb2RpbmcsIGZyYW1lX3R5cGUgaXMgZGVjaWRlZCBieSBsb3dlc3QtcmVzb2x1dGlvbgorICAgICAqIGVuY29kZXIuIFNhbWUgZnJhbWVfdHlwZSBpcyBhZG9wdGVkIHdoaWxlIGVuY29kaW5nIGF0IG90aGVyIHJlc29sdXRpb24uCisgICAgICovCisgICAgaWYgKGNwaS0+b3hjZi5tcl9lbmNvZGVyX2lkKQorICAgIHsKKyAgICAgICAgTE9XRVJfUkVTX0ZSQU1FX0lORk8qIGxvd19yZXNfZnJhbWVfaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgPSAoTE9XRVJfUkVTX0ZSQU1FX0lORk8qKWNwaS0+b3hjZi5tcl9sb3dfcmVzX21vZGVfaW5mbzsKKworICAgICAgICBjbS0+ZnJhbWVfdHlwZSA9IGxvd19yZXNfZnJhbWVfaW5mby0+ZnJhbWVfdHlwZTsKKworICAgICAgICBpZihjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+bXJfbG93X3Jlc19tdl9hdmFpbCA9IDE7CisgICAgICAgICAgICBjcGktPm1yX2xvd19yZXNfbXZfYXZhaWwgJj0gIShsb3dfcmVzX2ZyYW1lX2luZm8tPmlzX2ZyYW1lX2Ryb3BwZWQpOworCisgICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfTEFTVF9GUkFNRSkKKyAgICAgICAgICAgICAgICBjcGktPm1yX2xvd19yZXNfbXZfYXZhaWwgJj0gKGNwaS0+Y3VycmVudF9yZWZfZnJhbWVzW0xBU1RfRlJBTUVdCisgICAgICAgICAgICAgICAgICAgICAgICAgPT0gbG93X3Jlc19mcmFtZV9pbmZvLT5sb3dfcmVzX3JlZl9mcmFtZXNbTEFTVF9GUkFNRV0pOworCisgICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfR09MRF9GUkFNRSkKKyAgICAgICAgICAgICAgICBjcGktPm1yX2xvd19yZXNfbXZfYXZhaWwgJj0gKGNwaS0+Y3VycmVudF9yZWZfZnJhbWVzW0dPTERFTl9GUkFNRV0KKyAgICAgICAgICAgICAgICAgICAgICAgICA9PSBsb3dfcmVzX2ZyYW1lX2luZm8tPmxvd19yZXNfcmVmX2ZyYW1lc1tHT0xERU5fRlJBTUVdKTsKKworICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVFJfRlJBTUUpCisgICAgICAgICAgICAgICAgY3BpLT5tcl9sb3dfcmVzX212X2F2YWlsICY9IChjcGktPmN1cnJlbnRfcmVmX2ZyYW1lc1tBTFRSRUZfRlJBTUVdCisgICAgICAgICAgICAgICAgICAgICAgICAgPT0gbG93X3Jlc19mcmFtZV9pbmZvLT5sb3dfcmVzX3JlZl9mcmFtZXNbQUxUUkVGX0ZSQU1FXSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNldCB2YXJpb3VzIGZsYWdzIGV0YyB0byBzcGVjaWFsIHN0YXRlIGlmIGl0IGlzIGEga2V5IGZyYW1lICovCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIC8vIFNldCB0aGUgbG9vcCBmaWx0ZXIgZGVsdGFzIGFuZCBzZWdtZW50YXRpb24gbWFwIHVwZGF0ZQorICAgICAgICBzZXR1cF9mZWF0dXJlcyhjcGkpOworCisgICAgICAgIC8qIFRoZSBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIGNhbm5vdCBiZSBhY3RpdmUgZm9yIGEga2V5IGZyYW1lICovCisgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlID0gMDsKKworICAgICAgICAvKiBSZXNldCB0aGUgUkQgdGhyZXNob2xkIG11bHRpcGxpZXJzIHRvIGRlZmF1bHQgb2YgKiAxICgxMjgpICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtpXSA9IDEyODsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDAKKyAgICAvKiBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGNvbXByZXNzIGFuZCBvbmUgcGFzcworICAgICAqIEluaXRpYWxpc2Ugb25lX3Bhc3MgR0YgZnJhbWVzIHN0YXRzCisgICAgICogVXBkYXRlIHN0YXRzIHVzZWQgZm9yIEdGIHNlbGVjdGlvbgorICAgICAqLworICAgIHsKKyAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCA9IGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lICUgTUFYX0xBR19CVUZGRVJTOworCisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lc19zb19mYXIgPSAwOworICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2NwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggXS5mcmFtZV9pbnRyYV9lcnJvciA9IDAuMDsKKyAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVfY29kZWRfZXJyb3IgPSAwLjA7CisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lX3BjbnRfaW50ZXIgPSAwLjA7CisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lX3BjbnRfbW90aW9uID0gMC4wOworICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2NwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggXS5mcmFtZV9tdnIgPSAwLjA7CisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lX212cl9hYnMgPSAwLjA7CisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lX212YyA9IDAuMDsKKyAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVfbXZjX2FicyA9IDAuMDsKKyAgICB9CisjZW5kaWYKKworICAgIHVwZGF0ZV9yZF9yZWZfZnJhbWVfcHJvYnMoY3BpKTsKKworICAgIGlmIChjcGktPmRyb3BfZnJhbWVzX2FsbG93ZWQpCisgICAgeworICAgICAgICAvKiBUaGUgcmVzZXQgdG8gZGVjaW1hdGlvbiAwIGlzIG9ubHkgZG9uZSBoZXJlIGZvciBvbmUgcGFzcy4KKyAgICAgICAgICogT25jZSBpdCBpcyBzZXQgdHdvIHBhc3MgbGVhdmVzIGRlY2ltYXRpb24gb24gdGlsbCB0aGUgbmV4dCBrZi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY3BpLT5idWZmZXJfbGV2ZWwgPiBkcm9wX21hcmspICYmIChjcGktPmRlY2ltYXRpb25fZmFjdG9yID4gMCkpCisgICAgICAgICAgICBjcGktPmRlY2ltYXRpb25fZmFjdG9yIC0tOworCisgICAgICAgIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA+IGRyb3BfbWFyazc1ICYmIGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPiAwKQorICAgICAgICAgICAgY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9IDE7CisKKyAgICAgICAgZWxzZSBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPCBkcm9wX21hcmsyNSAmJiAoY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9PSAyIHx8IGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPT0gMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNwaS0+YnVmZmVyX2xldmVsIDwgZHJvcF9tYXJrNTAgJiYgKGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPT0gMSB8fCBjcGktPmRlY2ltYXRpb25fZmFjdG9yID09IDIpKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPmRlY2ltYXRpb25fZmFjdG9yID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGRyb3BfbWFyazc1ICYmIChjcGktPmRlY2ltYXRpb25fZmFjdG9yID09IDAgfHwgY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9PSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGRlY2ltYXRlcyB0aGUgZnJhbWUgcmF0ZSBhY2NvcmRpbmcgdG8gYSByZWd1bGFyCisgICAgICogcGF0dGVybiAoaS5lLiB0byAxLzIgb3IgMi8zIGZyYW1lIHJhdGUpIFRoaXMgY2FuIGJlIHVzZWQgdG8gaGVscAorICAgICAqIHByZXZlbnQgYnVmZmVyIHVuZGVyLXJ1biBpbiBDQlIgbW9kZS4gQWx0ZXJuYXRpdmVseSBpdCBtaWdodCBiZQorICAgICAqIGRlc2lyYWJsZSBpbiBzb21lIHNpdHVhdGlvbnMgdG8gZHJvcCBmcmFtZSByYXRlIGJ1dCB0aHJvdyBtb3JlIGJpdHMKKyAgICAgKiBhdCBlYWNoIGZyYW1lLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGRyb3BwaW5nIGEga2V5IGZyYW1lIGNhbiBiZSBwcm9ibGVtYXRpYyBpZiBzcGF0aWFsCisgICAgICogcmVzYW1wbGluZyBpcyBhbHNvIGFjdGl2ZQorICAgICAqLworICAgIGlmIChjcGktPmRlY2ltYXRpb25fZmFjdG9yID4gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY3BpLT5kZWNpbWF0aW9uX2ZhY3RvcikKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoICogMyAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoICA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAqIDUgLyA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggKiA1IC8gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogTm90ZSB0aGF0IHdlIHNob3VsZCBub3QgdGhyb3cgb3V0IGEga2V5IGZyYW1lIChlc3BlY2lhbGx5IHdoZW4KKyAgICAgICAgICogc3BhdGlhbCByZXNhbXBsaW5nIGlzIGVuYWJsZWQpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPmRlY2ltYXRpb25fY291bnQgPSBjcGktPmRlY2ltYXRpb25fZmFjdG9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNwaS0+ZGVjaW1hdGlvbl9jb3VudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9jb3VudCAtLTsKKworICAgICAgICAgICAgY3BpLT5iaXRzX29mZl90YXJnZXQgKz0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOworICAgICAgICAgICAgaWYgKGNwaS0+Yml0c19vZmZfdGFyZ2V0ID4gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpCisgICAgICAgICAgICAgICAgY3BpLT5iaXRzX29mZl90YXJnZXQgPSBjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZTsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgIHZwOF9zdG9yZV9kcm9wX2ZyYW1lX2luZm8oY3BpKTsKKyNlbmRpZgorCisgICAgICAgICAgICBjbS0+Y3VycmVudF92aWRlb19mcmFtZSsrOworICAgICAgICAgICAgY3BpLT5mcmFtZXNfc2luY2Vfa2V5Kys7CisKKyNpZiBDT05GSUdfSU5URVJOQUxfU1RBVFMKKyAgICAgICAgICAgIGNwaS0+Y291bnQgKys7CisjZW5kaWYKKworICAgICAgICAgICAgY3BpLT5idWZmZXJfbGV2ZWwgPSBjcGktPmJpdHNfb2ZmX3RhcmdldDsKKworICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgICAgICAgIC8qIFByb3BhZ2F0ZSBiaXRzIHNhdmVkIGJ5IGRyb3BwaW5nIHRoZSBmcmFtZSB0byBoaWdoZXIKKyAgICAgICAgICAgICAgICAgKiBsYXllcnMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGk9Y3BpLT5jdXJyZW50X2xheWVyKzE7IGk8Y3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExBWUVSX0NPTlRFWFQgKmxjID0gJmNwaS0+bGF5ZXJfY29udGV4dFtpXTsKKyAgICAgICAgICAgICAgICAgICAgbGMtPmJpdHNfb2ZmX3RhcmdldCArPSBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYy0+Yml0c19vZmZfdGFyZ2V0ID4gbGMtPm1heGltdW1fYnVmZmVyX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBsYy0+Yml0c19vZmZfdGFyZ2V0ID0gbGMtPm1heGltdW1fYnVmZmVyX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGxjLT5idWZmZXJfbGV2ZWwgPSBsYy0+Yml0c19vZmZfdGFyZ2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9jb3VudCA9IGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3I7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3BpLT5kZWNpbWF0aW9uX2NvdW50ID0gMDsKKworICAgIC8qIERlY2lkZSBob3cgYmlnIHRvIG1ha2UgdGhlIGZyYW1lICovCisgICAgaWYgKCF2cDhfcGlja19mcmFtZV9zaXplKGNwaSkpCisgICAgeworICAgICAgICAvKlRPRE86IDIgZHJvcF9mcmFtZSBhbmQgcmV0dXJuIGNvZGUgY291bGQgYmUgcHV0IHRvZ2V0aGVyLiAqLworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgdnA4X3N0b3JlX2Ryb3BfZnJhbWVfaW5mbyhjcGkpOworI2VuZGlmCisgICAgICAgIGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lKys7CisgICAgICAgIGNwaS0+ZnJhbWVzX3NpbmNlX2tleSsrOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogUmVkdWNlIGFjdGl2ZV93b3JzdF9hbGxvd2VkX3EgZm9yIENCUiBpZiBvdXIgYnVmZmVyIGlzIGdldHRpbmcgdG9vIGZ1bGwuCisgICAgICogVGhpcyBoYXMgYSBrbm9jayBvbiBlZmZlY3Qgb24gYWN0aXZlIGJlc3QgcXVhbGl0eSBhcyB3ZWxsLgorICAgICAqIEZvciBDQlIgaWYgdGhlIGJ1ZmZlciByZWFjaGVzIGl0cyBtYXhpbXVtIGxldmVsIHRoZW4gd2UgY2FuIG5vIGxvbmdlcgorICAgICAqIHNhdmUgdXAgYml0cyBmb3IgbGF0ZXIgZnJhbWVzIHNvIHdlIG1pZ2h0IGFzIHdlbGwgdXNlIHRoZW0gdXAKKyAgICAgKiBvbiB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAgKi8KKyAgICBpZiAoKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKSAmJgorICAgICAgICAoY3BpLT5idWZmZXJfbGV2ZWwgPj0gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKSAmJiBjcGktPmJ1ZmZlcmVkX21vZGUpCisgICAgeworICAgICAgICAvKiBNYXggYWRqdXN0bWVudCBpcyAxLzQgKi8KKyAgICAgICAgaW50IEFkanVzdG1lbnQgPSBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IC8gNDsKKworICAgICAgICBpZiAoQWRqdXN0bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ1ZmZfbHZsX3N0ZXA7CisKKyAgICAgICAgICAgIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+b3hjZi5tYXhpbXVtX2J1ZmZlcl9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZfbHZsX3N0ZXAgPSAoaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNwaS0+b3hjZi5tYXhpbXVtX2J1ZmZlcl9zaXplIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGp1c3RtZW50KTsKKworICAgICAgICAgICAgICAgIGlmIChidWZmX2x2bF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gKGludCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY3BpLT5idWZmZXJfbGV2ZWwgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmX2x2bF9zdGVwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IC09IEFkanVzdG1lbnQ7CisKKyAgICAgICAgICAgIGlmKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPCBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkpCisgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCBhbiBhY3RpdmUgYmVzdCBxdWFsaXR5IGFuZCBpZiBuZWNlc3NhcnkgYWN0aXZlIHdvcnN0IHF1YWxpdHkKKyAgICAgKiBUaGVyZSBpcyBzb21lIG9kZCBiZWhhdmlvciBmb3Igb25lIHBhc3MgaGVyZSB0aGF0IG5lZWRzIGF0dGVudGlvbi4KKyAgICAgKi8KKyAgICBpZiAoIChjcGktPnBhc3MgPT0gMikgfHwgKGNwaS0+bmlfZnJhbWVzID4gMTUwKSkKKyAgICB7CisgICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgICAgICBRID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKKworICAgICAgICBpZiAoIGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY3BpLT5wYXNzID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjcGktPmdmdV9ib29zdCA+IDYwMCkKKyAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBrZl9sb3dfbW90aW9uX21pbnFbUV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGtmX2hpZ2hfbW90aW9uX21pbnFbUV07CisKKyAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGtleSBmcmFtZXMgZm9yY2VkIGJlY2F1c2Ugd2UgaGF2ZSByZWFjaGVkCisgICAgICAgICAgICAgICAgICogdGhlIG1heGltdW0ga2V5IGZyYW1lIGludGVydmFsLiBIZXJlIGZvcmNlIHRoZSBRIHRvIGEgcmFuZ2UKKyAgICAgICAgICAgICAgICAgKiBiYXNlZCBvbiB0aGUgYW1iaWVudCBRIHRvIHJlZHVjZSB0aGUgcmlzayBvZiBwb3BwaW5nCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCBjcGktPnRoaXNfa2V5X2ZyYW1lX2ZvcmNlZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA+IGNwaS0+YXZnX2ZyYW1lX3FpbmRleCAqIDcvOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+YXZnX2ZyYW1lX3FpbmRleCAqIDcvODsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA8IGNwaS0+YXZnX2ZyYW1lX3FpbmRleCA+PiAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+YXZnX2ZyYW1lX3FpbmRleCA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE9uZSBwYXNzIG1vcmUgY29uc2VydmF0aXZlICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBrZl9oaWdoX21vdGlvbl9taW5xW1FdOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnM9PTEgJiYKKyAgICAgICAgICAgICAgICAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lIHx8IGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVzZSB0aGUgbG93ZXIgb2YgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSBhbmQgcmVjZW50CisgICAgICAgICAgICAgKiBhdmVyYWdlIFEgYXMgYmFzaXMgZm9yIEdGL0FSRiBRIGxpbWl0IHVubGVzcyBsYXN0IGZyYW1lIHdhcworICAgICAgICAgICAgICogYSBrZXkgZnJhbWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggKGNwaS0+ZnJhbWVzX3NpbmNlX2tleSA+IDEpICYmCisgICAgICAgICAgICAgICAoY3BpLT5hdmdfZnJhbWVfcWluZGV4IDwgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFEgPSBjcGktPmF2Z19mcmFtZV9xaW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEZvciBjb25zdHJhaW5lZCBxdWFsaXR5IGRvbnQgYWxsb3cgUSBsZXNzIHRoYW4gdGhlIGNxIGxldmVsICovCisgICAgICAgICAgICBpZiAoIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpICYmCisgICAgICAgICAgICAgICAgIChRIDwgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFEgPSBjcGktPmNxX3RhcmdldF9xdWFsaXR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGNwaS0+cGFzcyA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGNwaS0+Z2Z1X2Jvb3N0ID4gMTAwMCApCisgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGdmX2xvd19tb3Rpb25fbWlucVtRXTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggY3BpLT5nZnVfYm9vc3QgPCA0MDAgKQorICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBnZl9oaWdoX21vdGlvbl9taW5xW1FdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gZ2ZfbWlkX21vdGlvbl9taW5xW1FdOworCisgICAgICAgICAgICAgICAgLyogQ29uc3RyYWluZWQgcXVhbGl0eSB1c2Ugc2xpZ2h0bHkgbG93ZXIgYWN0aXZlIGJlc3QuICovCisgICAgICAgICAgICAgICAgaWYgKCBjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSAqIDE1LzE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE9uZSBwYXNzIG1vcmUgY29uc2VydmF0aXZlICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gZ2ZfaGlnaF9tb3Rpb25fbWlucVtRXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGludGVyX21pbnFbUV07CisKKyAgICAgICAgICAgIC8qIEZvciB0aGUgY29uc3RhbnQvY29uc3RyYWluZWQgcXVhbGl0eSBtb2RlIHdlIGRvbnQgd2FudAorICAgICAgICAgICAgICogcSB0byBmYWxsIGJlbG93IHRoZSBjcSBsZXZlbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpICYmCisgICAgICAgICAgICAgICAgKGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA8IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgc3Ryb25nbHkgdW5kZXJzaG9vdGluZyB0aGUgdGFyZ2V0IHJhdGUgaW4gdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgKiBmcmFtZXMgdGhlbiB1c2UgdGhlIHVzZXIgcGFzc2VkIGluIGNxIHZhbHVlIG5vdCB0aGUgYXV0bworICAgICAgICAgICAgICAgICAqIGNxIHZhbHVlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICggY3BpLT5yb2xsaW5nX2FjdHVhbF9iaXRzIDwgY3BpLT5taW5fZnJhbWVfYmFuZHdpZHRoICkKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5veGNmLmNxX2xldmVsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5jcV90YXJnZXRfcXVhbGl0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIENCUiBhbmQgdGhlIGJ1ZmZlciBpcyBhcyBmdWxsIHRoZW4gaXQgaXMgcmVhc29uYWJsZSB0byBhbGxvdworICAgICAgICAgKiBoaWdoZXIgcXVhbGl0eSBvbiB0aGUgZnJhbWVzIHRvIHByZXZlbnQgYml0cyBqdXN0IGdvaW5nIHRvIHdhc3RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3RlIHRoYXQgdGhlIHVzZSBvZiA+PSBoZXJlIGVsbGltaW5hdGVzIHRoZSByaXNrIG9mIGEgZGV2aWRlCisgICAgICAgICAgICAgKiBieSAwIGVycm9yIGluIHRoZSBlbHNlIGlmIGNsYXVzZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPj0gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpCisgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5iZXN0X3F1YWxpdHk7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKGNwaS0+YnVmZmVyX2xldmVsID4gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBGcmFjdGlvbiA9IChpbnQpCisgICAgICAgICAgICAgICAgICAoKChjcGktPmJ1ZmZlcl9sZXZlbCAtIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCkgKiAxMjgpCisgICAgICAgICAgICAgICAgICAvIChjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSAtCisgICAgICAgICAgICAgICAgICBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpKTsKKyAgICAgICAgICAgICAgICBpbnQgbWluX3FhZGp1c3RtZW50ID0gKChjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YmVzdF9xdWFsaXR5KSAqIEZyYWN0aW9uKSAvIDEyODsKKworICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSAtPSBtaW5fcWFkanVzdG1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogTWFrZSBzdXJlIGNvbnN0cmFpbmVkIHF1YWxpdHkgbW9kZSBsaW1pdHMgYXJlIGFkaGVyZWQgdG8gZm9yIHRoZSBmaXJzdAorICAgICAqIGZldyBmcmFtZXMgb2Ygb25lIHBhc3MgZW5jb2RlcworICAgICAqLworICAgIGVsc2UgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfQ09OU1RSQUlORURfUVVBTElUWSkKKyAgICB7CisgICAgICAgIGlmICggKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkgfHwKKyAgICAgICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgfHwgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+YmVzdF9xdWFsaXR5OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA8IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGlwIHRoZSBhY3RpdmUgYmVzdCBhbmQgd29yc3QgcXVhbGl0eSB2YWx1ZXMgdG8gbGltaXRzICovCisgICAgaWYgKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPiBjcGktPndvcnN0X3F1YWxpdHkpCisgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPndvcnN0X3F1YWxpdHk7CisKKyAgICBpZiAoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5IDwgY3BpLT5iZXN0X3F1YWxpdHkpCisgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+YmVzdF9xdWFsaXR5OworCisgICAgaWYgKCBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IDwgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ICkKKyAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eTsKKworICAgIC8qIERldGVybWluZSBpbml0aWFsIFEgdG8gdHJ5ICovCisgICAgUSA9IHZwOF9yZWd1bGF0ZV9xKGNwaSwgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCk7CisKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorCisgICAgLyogU2V0IGhpZ2hlc3QgYWxsb3dlZCB2YWx1ZSBmb3IgWmJpbiBvdmVyIHF1YW50ICovCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgemJpbl9vcV9oaWdoID0gMDsKKyAgICBlbHNlIGlmICgoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPT0gMSkgJiYgKChjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lIHx8CisgICAgICAgICAgICAgIChjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgJiYgIWNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlKSkpKQorICAgIHsKKyAgICAgICAgICB6YmluX29xX2hpZ2ggPSAxNjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB6YmluX29xX2hpZ2ggPSBaQklOX09RX01BWDsKKyNlbmRpZgorCisgICAgLyogU2V0dXAgYmFja2dyb3VuZCBRIGFkanVzdG1lbnQgZm9yIGVycm9yIHJlc2lsaWVudCBtb2RlLgorICAgICAqIEZvciBtdWx0aS1sYXllciBlbmNvZGVzIG9ubHkgZW5hYmxlIHRoaXMgZm9yIHRoZSBiYXNlIGxheWVyLgorICAgICAqLworICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCkKKyAgICB7CisgICAgICBpZiAoY3BpLT5jdXJyZW50X2xheWVyPT0wKQorICAgICAgICBjeWNsaWNfYmFja2dyb3VuZF9yZWZyZXNoKGNwaSwgUSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIGRpc2FibGVfc2VnbWVudGF0aW9uKGNwaSk7CisgICAgfQorCisgICAgdnA4X2NvbXB1dGVfZnJhbWVfc2l6ZV9ib3VuZHMoY3BpLCAmZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQsICZmcmFtZV9vdmVyX3Nob290X2xpbWl0KTsKKworI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCisgICAgLyogTGltaXQgUSByYW5nZSBmb3IgdGhlIGFkYXB0aXZlIGxvb3AuICovCisgICAgYm90dG9tX2luZGV4ID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OworICAgIHRvcF9pbmRleCAgICA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7CisgICAgcV9sb3cgID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OworICAgIHFfaGlnaCA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7CisjZW5kaWYKKworICAgIHZwOF9zYXZlX2NvZGluZ19jb250ZXh0KGNwaSk7CisKKyAgICBsb29wX2NvdW50ID0gMDsKKworICAgIHNjYWxlX2FuZF9leHRlbmRfc291cmNlKGNwaS0+dW5fc2NhbGVkX3NvdXJjZSwgY3BpKTsKKworI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpICYmIENPTkZJR19QT1NUUFJPQyAmJiAhKENPTkZJR19URU1QT1JBTF9ERU5PSVNJTkcpCisKKyAgICBpZiAoY3BpLT5veGNmLm5vaXNlX3NlbnNpdGl2aXR5ID4gMCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNyYzsKKyAgICAgICAgaW50IGwgPSAwOworCisgICAgICAgIHN3aXRjaCAoY3BpLT5veGNmLm5vaXNlX3NlbnNpdGl2aXR5KQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGwgPSAyMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBsID0gNDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbCA9IDYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGwgPSA4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBsID0gMTAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGwgPSAxNTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2RlX25vaXNlKGNtLCBjcGktPlNvdXJjZSwgY3BpLT5Tb3VyY2UsIGwgLCAxLCAgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfZGVfbm9pc2UoY20sIGNwaS0+U291cmNlLCBjcGktPlNvdXJjZSwgbCAsIDEsICAwKTsKKworICAgICAgICAgICAgc3JjID0gY3BpLT5Tb3VyY2UtPnlfYnVmZmVyOworCisgICAgICAgICAgICBpZiAoY3BpLT5Tb3VyY2UtPnlfc3RyaWRlIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcmMgKz0gY3BpLT5Tb3VyY2UtPnlfc3RyaWRlICogKGNwaS0+U291cmNlLT55X2hlaWdodCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjZW5kaWYKKworI2lmZGVmIE9VVFBVVF9ZVVZfU1JDCisgICAgdnA4X3dyaXRlX3l1dl9mcmFtZShjcGktPlNvdXJjZSk7CisjZW5kaWYKKworICAgIGRvCisgICAgeworICAgICAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKyAgICAgICAgdnA4X3NldF9xdWFudGl6ZXIoY3BpLCBRKTsKKworICAgICAgICAvKiBzZXR1cCBza2lwIHByb2IgZm9yIGNvc3RpbmcgaW4gbW9kZS9tdiBkZWNpc2lvbiAqLworICAgICAgICBpZiAoY3BpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBjcGktPmJhc2Vfc2tpcF9mYWxzZV9wcm9iW1FdOworCisgICAgICAgICAgICBpZiAoY20tPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMl0gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMl07CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1syXSE9MCAmJiBhYnMoUS0gY3BpLT5sYXN0X3NraXBfcHJvYnNfcVsyXSk8PTE2ICkKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1syXSE9MCkKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMl0gICsgY3BpLT5wcm9iX3NraXBfZmFsc2UgKSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzFdICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzFdOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMV0hPTAgJiYgYWJzKFEtIGNwaS0+bGFzdF9za2lwX3Byb2JzX3FbMV0pPD0xNiApCisgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMV0hPTApCisgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gKGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzFdICArIGNwaS0+cHJvYl9za2lwX2ZhbHNlICkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF0gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF07CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgaWYoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF0hPTAgJiYgYWJzKFEtIGNwaS0+bGFzdF9za2lwX3Byb2JzX3FbMF0pPD0xNiApCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzBdOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzBdIT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF0gICsgY3BpLT5wcm9iX3NraXBfZmFsc2UgKSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGFzIHRoaXMgaXMgZm9yIGNvc3QgZXN0aW1hdGUsIGxldCdzIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAqIGdvIGV4dHJlbWUgZWl0ZWhyIHdheQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChjcGktPnByb2Jfc2tpcF9mYWxzZSA8IDUpCisgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gNTsKKworICAgICAgICAgICAgICAgIGlmIChjcGktPnByb2Jfc2tpcF9mYWxzZSA+IDI1MCkKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSAyNTA7CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPT0gMSAmJiBjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmKQorICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IDE7CisgICAgICAgICAgICB9CisKKyNpZiAwCisKKyAgICAgICAgICAgIGlmIChjcGktPnBhc3MgIT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGSUxFICpmID0gZm9wZW4oInNraXAuc3R0IiwgImEiKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlZCwgJWQsICU0ZCAiLCBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSwgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lLCBjcGktPnByb2Jfc2tpcF9mYWxzZSk7CisgICAgICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgfQorCisjZW5kaWYKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocmVzaXplX2tleV9mcmFtZShjcGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBJZiB0aGUgZnJhbWUgc2l6ZSBoYXMgY2hhbmdlZCwgbmVlZCB0byByZXNldCBRLCBxdWFudGl6ZXIsCisgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHJlZnJlc2guCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBRID0gdnA4X3JlZ3VsYXRlX3EoY3BpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KTsKKyAgICAgICAgICAgICAgaWYgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNwaS0+Y3VycmVudF9sYXllcj09MCkKKyAgICAgICAgICAgICAgICAgIGN5Y2xpY19iYWNrZ3JvdW5kX3JlZnJlc2goY3BpLCBRLCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBkaXNhYmxlX3NlZ21lbnRhdGlvbihjcGkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHZwOF9zZXRfcXVhbnRpemVyKGNwaSwgUSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZwOF9zZXR1cF9rZXlfZnJhbWUoY3BpKTsKKyAgICAgICAgfQorCisKKworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZICYgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlKQorICAgICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPSAwOworCisgICAgICAgICAgICBpZiAoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlICYgVlBYX0VSUk9SX1JFU0lMSUVOVF9QQVJUSVRJT05TKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY20tPnJlZnJlc2hfZW50cm9weV9wcm9icyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNhdmUgYSBjb3B5IGZvciBsYXRlciByZWZyZXNoICovCisgICAgICAgICAgICAgICAgdnB4X21lbWNweSgmY20tPmxmYywgJmNtLT5mYywgc2l6ZW9mKGNtLT5mYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2cDhfdXBkYXRlX2NvZWZfY29udGV4dChjcGkpOworCisgICAgICAgICAgICB2cDhfdXBkYXRlX2NvZWZfcHJvYnMoY3BpKTsKKworICAgICAgICAgICAgLyogdHJhbnNmb3JtIC8gbW90aW9uIGNvbXBlbnNhdGlvbiBidWlsZCByZWNvbnN0cnVjdGlvbiBmcmFtZQorICAgICAgICAgICAgICogK3BhY2sgY29lZiBwYXJ0aXRpb25zCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHZwOF9lbmNvZGVfZnJhbWUoY3BpKTsKKworICAgICAgICAgICAgLyogY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSBpcyBub3QgbmVlZGVkIGZvciBSVCBtb2RlICovCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8qIHRyYW5zZm9ybSAvIG1vdGlvbiBjb21wZW5zYXRpb24gYnVpbGQgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgKi8KKyAgICAgICAgdnA4X2VuY29kZV9mcmFtZShjcGkpOworCisgICAgICAgIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgLT0gdnA4X2VzdGltYXRlX2VudHJvcHlfc2F2aW5ncyhjcGkpOworICAgICAgICBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplID0gKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPiAwKSA/IGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgOiAwOworI2VuZGlmCisgICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgICAgICAvKiBUZXN0IHRvIHNlZSBpZiB0aGUgc3RhdHMgZ2VuZXJhdGVkIGZvciB0aGlzIGZyYW1lIGluZGljYXRlIHRoYXQKKyAgICAgICAgICogd2Ugc2hvdWxkIGhhdmUgY29kZWQgYSBrZXkgZnJhbWUgKGFzc3VtaW5nIHRoYXQgd2UgZGlkbid0KSEKKyAgICAgICAgICovCisKKyAgICAgICAgaWYgKGNwaS0+cGFzcyAhPSAyICYmIGNwaS0+b3hjZi5hdXRvX2tleSAmJiBjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUKKyAgICAgICAgICAgICYmIGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCAhPSAyKQorICAgICAgICB7CisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKKyAgICAgICAgICAgIGlmIChkZWNpZGVfa2V5X2ZyYW1lKGNwaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogUmVzZXQgYWxsIG91ciBzaXppbmcgbnVtYmVycyBhbmQgcmVjb2RlICovCisgICAgICAgICAgICAgICAgY20tPmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7CisKKyAgICAgICAgICAgICAgICB2cDhfcGlja19mcmFtZV9zaXplKGNwaSk7CisKKyAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgQWx0IHJlZmVyZW5jZSBmcmFtZSBhY3RpdmUgZmxhZyB3aGVuIHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgKiBhIGtleSBmcmFtZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlID0gMDsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbG9vcCBmaWx0ZXIgZGVsdGFzIGFuZCBzZWdtZW50YXRpb24gbWFwIHVwZGF0ZQorICAgICAgICAgICAgICAgIHNldHVwX2ZlYXR1cmVzKGNwaSk7CisKKyAgICAgICAgICAgICAgICB2cDhfcmVzdG9yZV9jb2RpbmdfY29udGV4dChjcGkpOworCisgICAgICAgICAgICAgICAgUSA9IHZwOF9yZWd1bGF0ZV9xKGNwaSwgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCk7CisKKyAgICAgICAgICAgICAgICB2cDhfY29tcHV0ZV9mcmFtZV9zaXplX2JvdW5kcyhjcGksICZmcmFtZV91bmRlcl9zaG9vdF9saW1pdCwgJmZyYW1lX292ZXJfc2hvb3RfbGltaXQpOworCisgICAgICAgICAgICAgICAgLyogTGltaXQgUSByYW5nZSBmb3IgdGhlIGFkYXB0aXZlIGxvb3AuICovCisgICAgICAgICAgICAgICAgYm90dG9tX2luZGV4ID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OworICAgICAgICAgICAgICAgIHRvcF9pbmRleCAgICA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7CisgICAgICAgICAgICAgICAgcV9sb3cgID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OworICAgICAgICAgICAgICAgIHFfaGlnaCA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7CisKKyAgICAgICAgICAgICAgICBsb29wX2NvdW50Kys7CisgICAgICAgICAgICAgICAgTG9vcCA9IDE7CisKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgICAgIGlmIChmcmFtZV9vdmVyX3Nob290X2xpbWl0ID09IDApCisgICAgICAgICAgICBmcmFtZV9vdmVyX3Nob290X2xpbWl0ID0gMTsKKworICAgICAgICAvKiBBcmUgd2UgYXJlIG92ZXJzaG9vdGluZyBhbmQgdXAgYWdhaW5zdCB0aGUgbGltaXQgb2YgYWN0aXZlIG1heCBRLiAqLworICAgICAgICBpZiAoKChjcGktPnBhc3MgIT0gMikgfHwgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKSkgJiYKKyAgICAgICAgICAgIChRID09IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkpICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgIChjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IDwgY3BpLT53b3JzdF9xdWFsaXR5KSAgICAgICYmCisgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA+IGZyYW1lX292ZXJfc2hvb3RfbGltaXQpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3Zlcl9zaXplX3BlcmNlbnQgPSAoKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgLSBmcmFtZV9vdmVyX3Nob290X2xpbWl0KSAqIDEwMCkgLyBmcmFtZV9vdmVyX3Nob290X2xpbWl0OworCisgICAgICAgICAgICAvKiBJZiBzbyBpcyB0aGVyZSBhbnkgc2NvcGUgZm9yIHJlbGF4aW5nIGl0ICovCisgICAgICAgICAgICB3aGlsZSAoKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPCBjcGktPndvcnN0X3F1YWxpdHkpICYmIChvdmVyX3NpemVfcGVyY2VudCA+IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkrKzsKKyAgICAgICAgICAgICAgICAvKiBBc3N1bWUgMSBxc3RlcCA9IGFib3V0IDQlIG9uIGZyYW1lIHNpemUuICovCisgICAgICAgICAgICAgICAgb3Zlcl9zaXplX3BlcmNlbnQgPSAoaW50KShvdmVyX3NpemVfcGVyY2VudCAqIDAuOTYpOworICAgICAgICAgICAgfQorI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCisgICAgICAgICAgICB0b3BfaW5kZXggPSBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5OworI2VuZGlmCisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHVwZGF0ZWQgdGhlIGFjdGl2ZSBtYXggUSBkbyBub3QgY2FsbAorICAgICAgICAgICAgICogdnA4X3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycygpIHRoaXMgbG9vcC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYWN0aXZlX3dvcnN0X3FjaGFuZ2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBhY3RpdmVfd29yc3RfcWNoYW5nZWQgPSAwOworCisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBmb3JjZWQga2V5IGZyYW1lcyAqLworICAgICAgICBpZiAoIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpICYmIGNwaS0+dGhpc19rZXlfZnJhbWVfZm9yY2VkICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxhc3RfcSA9IFE7CisgICAgICAgICAgICBpbnQga2ZfZXJyID0gdnA4X2NhbGNfc3NfZXJyKGNwaS0+U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdKTsKKworICAgICAgICAgICAgLyogVGhlIGtleSBmcmFtZSBpcyBub3QgZ29vZCBlbm91Z2ggKi8KKyAgICAgICAgICAgIGlmICgga2ZfZXJyID4gKChjcGktPmFtYmllbnRfZXJyICogNykgPj4gMykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExvd2VyIHFfaGlnaCAqLworICAgICAgICAgICAgICAgIHFfaGlnaCA9IChRID4gcV9sb3cpID8gKFEgLSAxKSA6IHFfbG93OworCisgICAgICAgICAgICAgICAgLyogQWRqdXN0IFEgKi8KKyAgICAgICAgICAgICAgICBRID0gKHFfaGlnaCArIHFfbG93KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogVGhlIGtleSBmcmFtZSBpcyBtdWNoIGJldHRlciB0aGFuIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgZWxzZSBpZiAoIGtmX2VyciA8IChjcGktPmFtYmllbnRfZXJyID4+IDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSYWlzZSBxX2xvdyAqLworICAgICAgICAgICAgICAgIHFfbG93ID0gKFEgPCBxX2hpZ2gpID8gKFEgKyAxKSA6IHFfaGlnaDsKKworICAgICAgICAgICAgICAgIC8qIEFkanVzdCBRICovCisgICAgICAgICAgICAgICAgUSA9IChxX2hpZ2ggKyBxX2xvdyArIDEpID4+IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENsYW1wIFEgdG8gdXBwZXIgYW5kIGxvd2VyIGxpbWl0czogKi8KKyAgICAgICAgICAgIGlmIChRID4gcV9oaWdoKQorICAgICAgICAgICAgICAgIFEgPSBxX2hpZ2g7CisgICAgICAgICAgICBlbHNlIGlmIChRIDwgcV9sb3cpCisgICAgICAgICAgICAgICAgUSA9IHFfbG93OworCisgICAgICAgICAgICBMb29wID0gUSAhPSBsYXN0X3E7CisgICAgICAgIH0KKworICAgICAgICAvKiBJcyB0aGUgcHJvamVjdGVkIGZyYW1lIHNpemUgb3V0IG9mIHJhbmdlIGFuZCBhcmUgd2UgYWxsb3dlZAorICAgICAgICAgKiB0byBhdHRlbXB0IHRvIHJlY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKCByZWNvZGVfbG9vcF90ZXN0KCBjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCwgZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUSwgdG9wX2luZGV4LCBib3R0b21faW5kZXggKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsYXN0X3EgPSBROworICAgICAgICAgICAgaW50IFJldHJpZXMgPSAwOworCisgICAgICAgICAgICAvKiBGcmFtZSBzaXplIG91dCBvZiBwZXJtaXR0ZWQgcmFuZ2UuIFVwZGF0ZSBjb3JyZWN0aW9uIGZhY3RvcgorICAgICAgICAgICAgICogJiBjb21wdXRlIG5ldyBRIHRvIHRyeS4uLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIEZyYW1lIGlzIHRvbyBsYXJnZSAqLworICAgICAgICAgICAgaWYgKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPiBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJhaXNlIFFsb3cgYXMgdG8gYXQgbGVhc3QgdGhlIGN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBxX2xvdyA9IChRIDwgcV9oaWdoKSA/IChRICsgMSkgOiBxX2hpZ2g7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgdXNpbmcgb3ZlciBxdWFudCBkbyB0aGUgc2FtZSBmb3IgemJpbl9vcV9sb3cgKi8KKyAgICAgICAgICAgICAgICBpZiAoY3BpLT56YmluX292ZXJfcXVhbnQgPiAwKQorICAgICAgICAgICAgICAgICAgICB6YmluX29xX2xvdyA9IChjcGktPnpiaW5fb3Zlcl9xdWFudCA8IHpiaW5fb3FfaGlnaCkgPyAoY3BpLT56YmluX292ZXJfcXVhbnQgKyAxKSA6IHpiaW5fb3FfaGlnaDsKKworICAgICAgICAgICAgICAgIGlmICh1bmRlcnNob290X3NlZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciB1bmxlc3MKKyAgICAgICAgICAgICAgICAgICAgICogY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghYWN0aXZlX3dvcnN0X3FjaGFuZ2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycyhjcGksIDEpOworCisgICAgICAgICAgICAgICAgICAgIFEgPSAocV9oaWdoICsgcV9sb3cgKyAxKSAvIDI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQWRqdXN0IGNwaS0+emJpbl9vdmVyX3F1YW50IChvbmx5IGFsbG93ZWQgd2hlbiBRCisgICAgICAgICAgICAgICAgICAgICAqIGlzIG1heCkKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChRIDwgTUFYUSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6YmluX29xX2xvdyA9IChjcGktPnpiaW5fb3Zlcl9xdWFudCA8IHpiaW5fb3FfaGlnaCkgPyAoY3BpLT56YmluX292ZXJfcXVhbnQgKyAxKSA6IHpiaW5fb3FfaGlnaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gKHpiaW5fb3FfaGlnaCArIHpiaW5fb3FfbG93KSAvIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgdW5sZXNzCisgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgaGFzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZV93b3JzdF9xY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoY3BpLCAwKTsKKworICAgICAgICAgICAgICAgICAgICBRID0gdnA4X3JlZ3VsYXRlX3EoY3BpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKChRIDwgcV9sb3cpIHx8IChjcGktPnpiaW5fb3Zlcl9xdWFudCA8IHpiaW5fb3FfbG93KSkgJiYgKFJldHJpZXMgPCAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoY3BpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFEgPSB2cDhfcmVndWxhdGVfcShjcGksIGNwaS0+dGhpc19mcmFtZV90YXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0cmllcyArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG92ZXJzaG9vdF9zZWVuID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZyYW1lIGlzIHRvbyBzbWFsbCAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjcGktPnpiaW5fb3Zlcl9xdWFudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAvKiBMb3dlciBxX2hpZ2ggaWYgbm90IHVzaW5nIG92ZXIgcXVhbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgcV9oaWdoID0gKFEgPiBxX2xvdykgPyAoUSAtIDEpIDogcV9sb3c7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBlbHNlIGxvd2VyIHpiaW5fb3FfaGlnaCAqLworICAgICAgICAgICAgICAgICAgICB6YmluX29xX2hpZ2ggPSAoY3BpLT56YmluX292ZXJfcXVhbnQgPiB6YmluX29xX2xvdykgPyAoY3BpLT56YmluX292ZXJfcXVhbnQgLSAxKSA6IHpiaW5fb3FfbG93OworCisgICAgICAgICAgICAgICAgaWYgKG92ZXJzaG9vdF9zZWVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgdW5sZXNzCisgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgaGFzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZV93b3JzdF9xY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoY3BpLCAxKTsKKworICAgICAgICAgICAgICAgICAgICBRID0gKHFfaGlnaCArIHFfbG93KSAvIDI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQWRqdXN0IGNwaS0+emJpbl9vdmVyX3F1YW50IChvbmx5IGFsbG93ZWQgd2hlbiBRCisgICAgICAgICAgICAgICAgICAgICAqIGlzIG1heCkKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChRIDwgTUFYUSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX292ZXJfcXVhbnQgPSAoemJpbl9vcV9oaWdoICsgemJpbl9vcV9sb3cpIC8gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgdW5sZXNzCisgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgaGFzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZV93b3JzdF9xY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoY3BpLCAwKTsKKworICAgICAgICAgICAgICAgICAgICBRID0gdnA4X3JlZ3VsYXRlX3EoY3BpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgcmVzZXQgZm9yIHFsb3cgZm9yIGNvbnN0cmFpbmVkIHF1YWxpdHkuCisgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgdHJpZ2dlciB3aGVyZSB0aGVyZSBpcyB2ZXJ5IHN1YnN0YW50aWFsCisgICAgICAgICAgICAgICAgICAgICAqIHVuZGVyc2hvb3Qgb24gYSBmcmFtZSBhbmQgdGhlIGF1dG8gY3EgbGV2ZWwgaXMgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIHVzZXIgcGFzc3NlZCBpbiB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICggKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfQ09OU1RSQUlORURfUVVBTElUWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoUSA8IHFfbG93KSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFfbG93ID0gUTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKFEgPiBxX2hpZ2gpIHx8IChjcGktPnpiaW5fb3Zlcl9xdWFudCA+IHpiaW5fb3FfaGlnaCkpICYmIChSZXRyaWVzIDwgMTApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfdXBkYXRlX3JhdGVfY29ycmVjdGlvbl9mYWN0b3JzKGNwaSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBRID0gdnA4X3JlZ3VsYXRlX3EoY3BpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHJpZXMgKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1bmRlcnNob290X3NlZW4gPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDbGFtcCBRIHRvIHVwcGVyIGFuZCBsb3dlciBsaW1pdHM6ICovCisgICAgICAgICAgICBpZiAoUSA+IHFfaGlnaCkKKyAgICAgICAgICAgICAgICBRID0gcV9oaWdoOworICAgICAgICAgICAgZWxzZSBpZiAoUSA8IHFfbG93KQorICAgICAgICAgICAgICAgIFEgPSBxX2xvdzsKKworICAgICAgICAgICAgLyogQ2xhbXAgY3BpLT56YmluX292ZXJfcXVhbnQgKi8KKyAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gKGNwaS0+emJpbl9vdmVyX3F1YW50IDwgemJpbl9vcV9sb3cpID8gemJpbl9vcV9sb3cgOiAoY3BpLT56YmluX292ZXJfcXVhbnQgPiB6YmluX29xX2hpZ2gpID8gemJpbl9vcV9oaWdoIDogY3BpLT56YmluX292ZXJfcXVhbnQ7CisKKyAgICAgICAgICAgIExvb3AgPSBRICE9IGxhc3RfcTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIExvb3AgPSAwOworCisgICAgICAgIGlmIChjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmKQorICAgICAgICAgICAgTG9vcCA9IDA7CisKKyAgICAgICAgaWYgKExvb3AgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X3Jlc3RvcmVfY29kaW5nX2NvbnRleHQoY3BpKTsKKyAgICAgICAgICAgIGxvb3BfY291bnQrKzsKKyNpZiBDT05GSUdfSU5URVJOQUxfU1RBVFMKKyAgICAgICAgICAgIGNwaS0+dG90X3JlY29kZV9oaXRzKys7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoTG9vcCA9PSAxKTsKKworI2lmIDAKKyAgICAvKiBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGFuZCBvbmUgcGFzcworICAgICAqIFVwZGF0ZSBzdGF0cyB1c2VkIGZvciBvbmUgcGFzcyBHRiBzZWxlY3Rpb24KKyAgICAgKi8KKyAgICB7CisgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleF0uZnJhbWVfY29kZWRfZXJyb3IgPSAoZG91YmxlKWNwaS0+cHJlZGljdGlvbl9lcnJvcjsKKyAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4XS5mcmFtZV9pbnRyYV9lcnJvciA9IChkb3VibGUpY3BpLT5pbnRyYV9lcnJvcjsKKyAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4XS5mcmFtZV9wY250X2ludGVyID0gKGRvdWJsZSkoMTAwIC0gY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEpIC8gMTAwLjA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBTcGVjaWFsIGNhc2UgY29kZSB0byByZWR1Y2UgcHVsc2luZyB3aGVuIGtleSBmcmFtZXMgYXJlIGZvcmNlZCBhdCBhCisgICAgICogZml4ZWQgaW50ZXJ2YWwuIE5vdGUgdGhlIHJlY29uc3RydWN0aW9uIGVycm9yIGlmIGl0IGlzIHRoZSBmcmFtZSBiZWZvcmUKKyAgICAgKiB0aGUgZm9yY2Uga2V5IGZyYW1lCisgICAgICovCisgICAgaWYgKCBjcGktPm5leHRfa2V5X2ZyYW1lX2ZvcmNlZCAmJiAoY3BpLT50d29wYXNzLmZyYW1lc190b19rZXkgPT0gMCkgKQorICAgIHsKKyAgICAgICAgY3BpLT5hbWJpZW50X2VyciA9IHZwOF9jYWxjX3NzX2VycihjcGktPlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIGZyYW1lJ3MgTVZzIGFyZSBzYXZlZCBhbmQgd2lsbCBiZSB1c2VkIGluIG5leHQgZnJhbWUncyBNViBwcmVkaWN0b3IuCisgICAgICogTGFzdCBmcmFtZSBoYXMgb25lIG1vcmUgbGluZShhZGQgdG8gYm90dG9tKSBhbmQgb25lIG1vcmUgY29sdW1uKGFkZCB0bworICAgICAqIHJpZ2h0KSB0aGFuIGNtLT5taXAuIFRoZSBlZGdlIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byAwLgorICAgICAqLworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICBpZighY3BpLT5veGNmLm1yX2VuY29kZXJfaWQgJiYgY20tPnNob3dfZnJhbWUpCisjZWxzZQorICAgIGlmKGNtLT5zaG93X2ZyYW1lKSAgIC8qIGRvIG5vdCBzYXZlIGZvciBhbHRyZWYgZnJhbWUgKi8KKyNlbmRpZgorICAgIHsKKyAgICAgICAgaW50IG1iX3JvdzsKKyAgICAgICAgaW50IG1iX2NvbDsKKyAgICAgICAgLyogUG9pbnQgdG8gYmVnaW5uaW5nIG9mIGFsbG9jYXRlZCBNT0RFX0lORk8gYXJyYXlzLiAqLworICAgICAgICBNT0RFX0lORk8gKnRtcCA9IGNtLT5taXA7CisKKyAgICAgICAgaWYoY20tPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzKzE7IG1iX3JvdyArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNtLT5tYl9jb2xzKzE7IG1iX2NvbCArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHRtcC0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmxmbXZbbWJfY29sICsgbWJfcm93KihjbS0+bW9kZV9pbmZvX3N0cmlkZSsxKV0uYXNfaW50ID0gdG1wLT5tYm1pLm12LmFzX2ludDsKKworICAgICAgICAgICAgICAgICAgICBjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXNbbWJfY29sICsgbWJfcm93KihjbS0+bW9kZV9pbmZvX3N0cmlkZSsxKV0gPSBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1t0bXAtPm1ibWkucmVmX2ZyYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5sZl9yZWZfZnJhbWVbbWJfY29sICsgbWJfcm93KihjbS0+bW9kZV9pbmZvX3N0cmlkZSsxKV0gPSB0bXAtPm1ibWkucmVmX2ZyYW1lOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb3VudCBsYXN0IHJlZiBmcmFtZSAwLDAgdXNhZ2Ugb24gY3VycmVudCBlbmNvZGVkIGZyYW1lLiAqLworICAgIHsKKyAgICAgICAgaW50IG1iX3JvdzsKKyAgICAgICAgaW50IG1iX2NvbDsKKyAgICAgICAgLyogUG9pbnQgdG8gYmVnaW5uaW5nIG9mIE1PREVfSU5GTyBhcnJheXMuICovCisgICAgICAgIE1PREVfSU5GTyAqdG1wID0gY20tPm1pOworCisgICAgICAgIGNwaS0+aW50ZXJfenpfY291bnQgPSAwOworICAgICAgICBjcGktPnplcm9tdl9jb3VudCA9IDA7CisKKyAgICAgICAgaWYoY20tPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3cgKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sICsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYodG1wLT5tYm1pLm1vZGUgPT0gWkVST01WICYmIHRtcC0+bWJtaS5yZWZfZnJhbWUgPT0gTEFTVF9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+aW50ZXJfenpfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYodG1wLT5tYm1pLm1vZGUgPT0gWkVST01WKQorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56ZXJvbXZfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgIHZwOF9jYWxfZGlzc2ltaWxhcml0eShjcGkpOworI2VuZGlmCisKKyAgICAvKiBVcGRhdGUgdGhlIEdGIHVzZWFnZSBtYXBzLgorICAgICAqIFRoaXMgaXMgZG9uZSBhZnRlciBjb21wbGV0aW5nIHRoZSBjb21wcmVzc2lvbiBvZiBhIGZyYW1lIHdoZW4gYWxsCisgICAgICogbW9kZXMgZXRjLiBhcmUgZmluYWxpemVkIGJ1dCBiZWZvcmUgbG9vcCBmaWx0ZXIKKyAgICAgKi8KKyAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPT0gMSkKKyAgICAgICAgdnA4X3VwZGF0ZV9nZl91c2VhZ2VfbWFwcyhjcGksIGNtLCAmY3BpLT5tYik7CisKKyAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMTsKKworI2lmIDAKKyAgICB7CisgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiZ2ZhY3RpdmUuc3R0IiwgImEiKTsKKyAgICAgICAgZnByaW50ZihmLCAiJThkICU4ZCAlOGQgJThkICU4ZFxuIiwgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUsICgxMDAgKiBjcGktPmdmX2FjdGl2ZV9jb3VudCkgLyAoY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMpLCBjcGktPnRoaXNfaWlyYXRpbywgY3BpLT5uZXh0X2lpcmF0aW8sIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSk7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZvciBpbnRlciBmcmFtZXMgdGhlIGN1cnJlbnQgZGVmYXVsdCBiZWhhdmlvciBpcyB0aGF0IHdoZW4KKyAgICAgKiBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgaXMgc2V0IHdlIGNvcHkgdGhlIG9sZCBHRiBvdmVyIHRvIHRoZSBBUkYgYnVmZmVyCisgICAgICogVGhpcyBpcyBwdXJlbHkgYW4gZW5jb2RlciBkZWNpc2lvbiBhdCBwcmVzZW50LgorICAgICAqLworICAgIGlmICghY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlICYmIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgY20tPmNvcHlfYnVmZmVyX3RvX2FyZiAgPSAyOworICAgIGVsc2UKKyAgICAgICAgY20tPmNvcHlfYnVmZmVyX3RvX2FyZiAgPSAwOworCisgICAgY20tPmZyYW1lX3RvX3Nob3cgPSAmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCkKKyAgICB7CisgICAgICAgIC8qIHN0YXJ0IGxvb3BmaWx0ZXIgaW4gc2VwYXJhdGUgdGhyZWFkICovCisgICAgICAgIHNlbV9wb3N0KCZjcGktPmhfZXZlbnRfc3RhcnRfbHBmKTsKKyAgICAgICAgY3BpLT5iX2xwZl9ydW5uaW5nID0gMTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICB2cDhfbG9vcGZpbHRlcl9mcmFtZShjcGksIGNtKTsKKyAgICB9CisKKyAgICB1cGRhdGVfcmVmZXJlbmNlX2ZyYW1lcyhjcGkpOworCisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HKQorICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUpCisgICAgeworICAgICAgICBjbS0+cmVmcmVzaF9lbnRyb3B5X3Byb2JzID0gMDsKKyAgICB9CisjZW5kaWYKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgIC8qIHdhaXQgdGhhdCBmaWx0ZXJfbGV2ZWwgaXMgcGlja2VkIHNvIHRoYXQgd2UgY2FuIGNvbnRpbnVlIHdpdGggc3RyZWFtIHBhY2tpbmcgKi8KKyAgICBpZiAoY3BpLT5iX211bHRpX3RocmVhZGVkKQorICAgICAgICBzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOworI2VuZGlmCisKKyAgICAvKiBidWlsZCB0aGUgYml0c3RyZWFtICovCisgICAgdnA4X3BhY2tfYml0c3RyZWFtKGNwaSwgZGVzdCwgZGVzdF9lbmQsIHNpemUpOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgLyogaWYgUFNOUiBwYWNrZXRzIGFyZSBnZW5lcmF0ZWQgd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgbHBmICovCisgICAgaWYgKGNwaS0+Yl9scGZfcnVubmluZyAmJiBjcGktPmJfY2FsY3VsYXRlX3BzbnIpCisgICAgeworICAgICAgICBzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOworICAgICAgICBjcGktPmJfbHBmX3J1bm5pbmcgPSAwOworICAgIH0KKyNlbmRpZgorCisgICAgLyogTW92ZSBzdG9yaW5nIGZyYW1lX3R5cGUgb3V0IG9mIHRoZSBhYm92ZSBsb29wIHNpbmNlIGl0IGlzIGFsc28KKyAgICAgKiBuZWVkZWQgaW4gbW90aW9uIHNlYXJjaCBiZXNpZGVzIGxvb3BmaWx0ZXIgKi8KKyAgICBjbS0+bGFzdF9mcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7CisKKyAgICAvKiBVcGRhdGUgcmF0ZSBjb250cm9sIGhldXJpc3RpY3MgKi8KKyAgICBjcGktPnRvdGFsX2J5dGVfY291bnQgKz0gKCpzaXplKTsKKyAgICBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplID0gKCpzaXplKSA8PCAzOworCisgICAgaWYgKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBmb3IgKGk9Y3BpLT5jdXJyZW50X2xheWVyKzE7IGk8Y3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnM7IGkrKykKKyAgICAgICAgICBjcGktPmxheWVyX2NvbnRleHRbaV0udG90YWxfYnl0ZV9jb3VudCArPSAoKnNpemUpOworICAgIH0KKworICAgIGlmICghYWN0aXZlX3dvcnN0X3FjaGFuZ2VkKQorICAgICAgICB2cDhfdXBkYXRlX3JhdGVfY29ycmVjdGlvbl9mYWN0b3JzKGNwaSwgMik7CisKKyAgICBjcGktPmxhc3RfcVtjbS0+ZnJhbWVfdHlwZV0gPSBjbS0+YmFzZV9xaW5kZXg7CisKKyAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgdnA4X2FkanVzdF9rZXlfZnJhbWVfY29udGV4dChjcGkpOworICAgIH0KKworICAgIC8qIEtlZXAgYSByZWNvcmQgb2YgYW1iaWVudCBhdmVyYWdlIFEuICovCisgICAgaWYgKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICAgICAgY3BpLT5hdmdfZnJhbWVfcWluZGV4ID0gKDIgKyAzICogY3BpLT5hdmdfZnJhbWVfcWluZGV4ICsgY20tPmJhc2VfcWluZGV4KSA+PiAyOworCisgICAgLyogS2VlcCBhIHJlY29yZCBmcm9tIHdoaWNoIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgUSBleGNsdWRpbmcKKyAgICAgKiBHRiB1cGRhdGVzIGFuZCBrZXkgZnJhbWVzCisgICAgICovCisgICAgaWYgKChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpICYmICgoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKSB8fAorICAgICAgICAoIWNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSAmJiAhY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkpKQorICAgIHsKKyAgICAgICAgY3BpLT5uaV9mcmFtZXMrKzsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgUSBmb3Igbm9ybWFsIGludGVyIGZyYW1lcyAobm90IGtleSBvciBHRlUKKyAgICAgICAgICogZnJhbWVzKS4KKyAgICAgICAgICovCisgICAgICAgIGlmICggY3BpLT5wYXNzID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPm5pX3RvdF9xaSArPSBROworICAgICAgICAgICAgY3BpLT5uaV9hdl9xaSA9IChjcGktPm5pX3RvdF9xaSAvIGNwaS0+bmlfZnJhbWVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERhbXAgdmFsdWUgZm9yIGZpcnN0IGZldyBmcmFtZXMgKi8KKyAgICAgICAgICAgIGlmIChjcGktPm5pX2ZyYW1lcyA+IDE1MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BpLT5uaV90b3RfcWkgKz0gUTsKKyAgICAgICAgICAgICAgICBjcGktPm5pX2F2X3FpID0gKGNwaS0+bmlfdG90X3FpIC8gY3BpLT5uaV9mcmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRm9yIG9uZSBwYXNzLCBlYXJseSBpbiB0aGUgY2xpcCAuLi4gYXZlcmFnZSB0aGUgY3VycmVudCBmcmFtZSBRCisgICAgICAgICAgICAgKiB2YWx1ZSB3aXRoIHRoZSB3b3JzdHEgZW50ZXJlZCBieSB0aGUgdXNlciBhcyBhIGRhbXBlbmluZyBtZWFzdXJlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcGktPm5pX3RvdF9xaSArPSBROworICAgICAgICAgICAgICAgIGNwaS0+bmlfYXZfcWkgPSAoKGNwaS0+bmlfdG90X3FpIC8gY3BpLT5uaV9mcmFtZXMpICsgY3BpLT53b3JzdF9xdWFsaXR5ICsgMSkgLyAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB0aGUgYXZlcmFnZSBRIGlzIGhpZ2hlciB0aGFuIHdoYXQgd2FzIHVzZWQgaW4gdGhlIGxhc3QKKyAgICAgICAgICAgICAqIGZyYW1lIChhZnRlciBnb2luZyB0aHJvdWdoIHRoZSByZWNvZGUgbG9vcCB0byBrZWVwIHRoZSBmcmFtZQorICAgICAgICAgICAgICogc2l6ZSB3aXRoaW4gcmFuZ2UpIHRoZW4gdXNlIHRoZSBsYXN0IGZyYW1lIHZhbHVlIC0gMS4gVGhlIC0xCisgICAgICAgICAgICAgKiBpcyBkZXNpZ25lZCB0byBzdG9wIFEgYW5kIGhlbmNlIHRoZSBkYXRhIHJhdGUsIGZyb20KKyAgICAgICAgICAgICAqIHByb2dyZXNzaXZlbHkgZmFsbGluZyBhd2F5IGR1cmluZyBkaWZmaWN1bHQgc2VjdGlvbnMsIGJ1dCBhdAorICAgICAgICAgICAgICogdGhlIHNhbWUgdGltZSByZWR1Y2UgdGhlIG51bWJlciBvZiBpdHRlcmF0aW9ucyBhcm91bmQgdGhlCisgICAgICAgICAgICAgKiByZWNvZGUgbG9vcC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKFEgPiBjcGktPm5pX2F2X3FpKQorICAgICAgICAgICAgICAgIGNwaS0+bmlfYXZfcWkgPSBRIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGxldmVsIHZhcmlhYmxlLiAqLworICAgIC8qIE5vbi12aWV3YWJsZSBmcmFtZXMgYXJlIGEgc3BlY2lhbCBjYXNlIGFuZCBhcmUgdHJlYXRlZCBhcyBwdXJlIG92ZXJoZWFkLiAqLworICAgIGlmICggIWNtLT5zaG93X2ZyYW1lICkKKyAgICAgICAgY3BpLT5iaXRzX29mZl90YXJnZXQgLT0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKKyAgICBlbHNlCisgICAgICAgIGNwaS0+Yml0c19vZmZfdGFyZ2V0ICs9IGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCAtIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemU7CisKKyAgICAvKiBDbGlwIHRoZSBidWZmZXIgbGV2ZWwgdG8gdGhlIG1heGltdW0gc3BlY2lmaWVkIGJ1ZmZlciBzaXplICovCisgICAgaWYgKGNwaS0+Yml0c19vZmZfdGFyZ2V0ID4gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpCisgICAgICAgIGNwaS0+Yml0c19vZmZfdGFyZ2V0ID0gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemU7CisKKyAgICAvKiBSb2xsaW5nIG1vbml0b3JzIG9mIHdoZXRoZXIgd2UgYXJlIG92ZXIgb3IgdW5kZXJzcGVuZGluZyB1c2VkIHRvCisgICAgICogaGVscCByZWd1bGF0ZSBtaW4gYW5kIE1heCBRIGluIHR3byBwYXNzLgorICAgICAqLworICAgIGNwaS0+cm9sbGluZ190YXJnZXRfYml0cyA9ICgoY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzICogMykgKyBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICsgMikgLyA0OworICAgIGNwaS0+cm9sbGluZ19hY3R1YWxfYml0cyA9ICgoY3BpLT5yb2xsaW5nX2FjdHVhbF9iaXRzICogMykgKyBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplICsgMikgLyA0OworICAgIGNwaS0+bG9uZ19yb2xsaW5nX3RhcmdldF9iaXRzID0gKChjcGktPmxvbmdfcm9sbGluZ190YXJnZXRfYml0cyAqIDMxKSArIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKyAxNikgLyAzMjsKKyAgICBjcGktPmxvbmdfcm9sbGluZ19hY3R1YWxfYml0cyA9ICgoY3BpLT5sb25nX3JvbGxpbmdfYWN0dWFsX2JpdHMgKiAzMSkgKyBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplICsgMTYpIC8gMzI7CisKKyAgICAvKiBBY3R1YWwgYml0cyBzcGVudCAqLworICAgIGNwaS0+dG90YWxfYWN0dWFsX2JpdHMgKz0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKKworICAgIC8qIERlYnVnIHN0YXRzICovCisgICAgY3BpLT50b3RhbF90YXJnZXRfdnNfYWN0dWFsICs9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSk7CisKKyAgICBjcGktPmJ1ZmZlcl9sZXZlbCA9IGNwaS0+Yml0c19vZmZfdGFyZ2V0OworCisgICAgLyogUHJvcGFnYXRlIHZhbHVlcyB0byBoaWdoZXIgdGVtcG9yYWwgbGF5ZXJzICovCisgICAgaWYgKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgIGZvciAoaT1jcGktPmN1cnJlbnRfbGF5ZXIrMTsgaTxjcGktPm94Y2YubnVtYmVyX29mX2xheWVyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBMQVlFUl9DT05URVhUICpsYyA9ICZjcGktPmxheWVyX2NvbnRleHRbaV07CisgICAgICAgICAgICBpbnQgYml0c19vZmZfZm9yX3RoaXNfbGF5ZXIgPQorICAgICAgICAgICAgICAgKGludCkobGMtPnRhcmdldF9iYW5kd2lkdGggLyBsYy0+ZnJhbWVfcmF0ZSAtCisgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplKTsKKworICAgICAgICAgICAgbGMtPmJpdHNfb2ZmX3RhcmdldCArPSBiaXRzX29mZl9mb3JfdGhpc19sYXllcjsKKworICAgICAgICAgICAgLyogQ2xpcCBidWZmZXIgbGV2ZWwgdG8gbWF4aW11bSBidWZmZXIgc2l6ZSBmb3IgdGhlIGxheWVyICovCisgICAgICAgICAgICBpZiAobGMtPmJpdHNfb2ZmX3RhcmdldCA+IGxjLT5tYXhpbXVtX2J1ZmZlcl9zaXplKQorICAgICAgICAgICAgICAgIGxjLT5iaXRzX29mZl90YXJnZXQgPSBsYy0+bWF4aW11bV9idWZmZXJfc2l6ZTsKKworICAgICAgICAgICAgbGMtPnRvdGFsX2FjdHVhbF9iaXRzICs9IGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemU7CisgICAgICAgICAgICBsYy0+dG90YWxfdGFyZ2V0X3ZzX2FjdHVhbCArPSBiaXRzX29mZl9mb3JfdGhpc19sYXllcjsKKyAgICAgICAgICAgIGxjLT5idWZmZXJfbGV2ZWwgPSBsYy0+Yml0c19vZmZfdGFyZ2V0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIGJpdHMgbGVmdCB0byB0aGUga2YgYW5kIGdmIGdyb3VwcyB0byBhY2NvdW50IGZvciBvdmVyc2hvb3QKKyAgICAgKiBvciB1bmRlcnNob290IG9uIHRoZXNlIGZyYW1lcworICAgICAqLworICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgeworICAgICAgICBjcGktPnR3b3Bhc3Mua2ZfZ3JvdXBfYml0cyArPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKKworICAgICAgICBpZiAoY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPCAwKQorICAgICAgICAgICAgY3BpLT50d29wYXNzLmtmX2dyb3VwX2JpdHMgPSAwIDsKKyAgICB9CisgICAgZWxzZSBpZiAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lIHx8IGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCisgICAgeworICAgICAgICBjcGktPnR3b3Bhc3MuZ2ZfZ3JvdXBfYml0cyArPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKKworICAgICAgICBpZiAoY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPCAwKQorICAgICAgICAgICAgY3BpLT50d29wYXNzLmdmX2dyb3VwX2JpdHMgPSAwIDsKKyAgICB9CisKKyAgICBpZiAoY20tPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMl0gPSBjcGktPnByb2Jfc2tpcF9mYWxzZTsKKyAgICAgICAgICAgIGNwaS0+bGFzdF9za2lwX3Byb2JzX3FbMl0gPSBjbS0+YmFzZV9xaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzFdID0gY3BpLT5wcm9iX3NraXBfZmFsc2U7CisgICAgICAgICAgICBjcGktPmxhc3Rfc2tpcF9wcm9ic19xWzFdID0gY20tPmJhc2VfcWluZGV4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF0gPSBjcGktPnByb2Jfc2tpcF9mYWxzZTsKKyAgICAgICAgICAgIGNwaS0+bGFzdF9za2lwX3Byb2JzX3FbMF0gPSBjbS0+YmFzZV9xaW5kZXg7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgYmFzZWxpbmUgKi8KKyAgICAgICAgICAgIGNwaS0+YmFzZV9za2lwX2ZhbHNlX3Byb2JbY20tPmJhc2VfcWluZGV4XSA9IGNwaS0+cHJvYl9za2lwX2ZhbHNlOworCisgICAgICAgIH0KKyAgICB9CisKKyNpZiAwICYmIENPTkZJR19JTlRFUk5BTF9TVEFUUworICAgIHsKKyAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJ0bXAuc3R0IiwgImEiKTsKKworICAgICAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKyAgICAgICAgaWYgKGNwaS0+dHdvcGFzcy50b3RhbF9sZWZ0X3N0YXRzLmNvZGVkX2Vycm9yICE9IDAuMCkKKyAgICAgICAgICAgIGZwcmludGYoZiwgIiUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBkICU2ZCAlNmQiCisgICAgICAgICAgICAgICAgICAgICAgICIlNmQgJTZkICU2ZCAlNWQgJTVkICU1ZCAlOGQgJTguMmYgJTEwZCAlMTAuM2YiCisgICAgICAgICAgICAgICAgICAgICAgICIlMTAuM2YgJThkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSAtIGNwaS0+dGhpc19mcmFtZV90YXJnZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KWNwaS0+dG90YWxfdGFyZ2V0X3ZzX2FjdHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5idWZmZXJfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIChjcGktPm94Y2Yuc3RhcnRpbmdfYnVmZmVyX2xldmVsLWNwaS0+Yml0c19vZmZfdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCljcGktPnRvdGFsX2FjdHVhbF9iaXRzLCBjbS0+YmFzZV9xaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSwgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5uaV9hdl9xaSwgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX292ZXJfcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSwgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY20tPmZyYW1lX3R5cGUsIGNwaS0+Z2Z1X2Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpY3BpLT50d29wYXNzLmJpdHNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLnRvdGFsX2xlZnRfc3RhdHMuY29kZWRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpY3BpLT50d29wYXNzLmJpdHNfbGVmdCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MudG90YWxfbGVmdF9zdGF0cy5jb2RlZF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RfcmVjb2RlX2hpdHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKGYsICIlMTBkICUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlNmQgJTZkIgorICAgICAgICAgICAgICAgICAgICAgICAiJTZkICU2ZCAlNmQgJTVkICU1ZCAlNWQgJThkICU4LjJmICUxMGQgJTEwLjNmIgorICAgICAgICAgICAgICAgICAgICAgICAiJThkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0LCBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSAtIGNwaS0+dGhpc19mcmFtZV90YXJnZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KWNwaS0+dG90YWxfdGFyZ2V0X3ZzX2FjdHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5idWZmZXJfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIChjcGktPm94Y2Yuc3RhcnRpbmdfYnVmZmVyX2xldmVsLWNwaS0+Yml0c19vZmZfdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCljcGktPnRvdGFsX2FjdHVhbF9iaXRzLCBjbS0+YmFzZV9xaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSwgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5uaV9hdl9xaSwgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX292ZXJfcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSwgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY20tPmZyYW1lX3R5cGUsIGNwaS0+Z2Z1X2Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICBjcGktPnR3b3Bhc3MuZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpY3BpLT50d29wYXNzLmJpdHNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50d29wYXNzLnRvdGFsX2xlZnRfc3RhdHMuY29kZWRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90X3JlY29kZV9oaXRzKTsKKworICAgICAgICBmY2xvc2UoZik7CisKKyAgICAgICAgeworICAgICAgICAgICAgRklMRSAqZm1vZGVzID0gZm9wZW4oIk1vZGVzLnN0dCIsICJhIik7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgZnByaW50ZihmbW9kZXMsICIlNmQ6JTFkOiUxZDolMWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZnJhbWVfdHlwZSwgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkrKykKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZtb2RlcywgIiU1ZCAiLCBjcGktPm1vZGVfY2hvc2VuX2NvdW50c1tpXSk7CisKKyAgICAgICAgICAgIGZwcmludGYoZm1vZGVzLCAiXG4iKTsKKworICAgICAgICAgICAgZmNsb3NlKGZtb2Rlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorCisgICAgaWYgKGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9PSAxKQorICAgICAgICBjbS0+ZnJhbWVfZmxhZ3MgPSBjbS0+ZnJhbWVfZmxhZ3MgfCBGUkFNRUZMQUdTX0dPTERFTjsKKyAgICBlbHNlCisgICAgICAgIGNtLT5mcmFtZV9mbGFncyA9IGNtLT5mcmFtZV9mbGFncyZ+RlJBTUVGTEFHU19HT0xERU47CisKKyAgICBpZiAoY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSA9PSAxKQorICAgICAgICBjbS0+ZnJhbWVfZmxhZ3MgPSBjbS0+ZnJhbWVfZmxhZ3MgfCBGUkFNRUZMQUdTX0FMVFJFRjsKKyAgICBlbHNlCisgICAgICAgIGNtLT5mcmFtZV9mbGFncyA9IGNtLT5mcmFtZV9mbGFncyZ+RlJBTUVGTEFHU19BTFRSRUY7CisKKworICAgIGlmIChjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lICYgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQorICAgICAgICAvKiBib3RoIHJlZnJlc2hlZCAqLworICAgICAgICBjcGktPmdvbGRfaXNfbGFzdCA9IDE7CisgICAgZWxzZSBpZiAoY20tPnJlZnJlc2hfbGFzdF9mcmFtZSBeIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgLyogMSByZWZyZXNoZWQgYnV0IG5vdCB0aGUgb3RoZXIgKi8KKyAgICAgICAgY3BpLT5nb2xkX2lzX2xhc3QgPSAwOworCisgICAgaWYgKGNtLT5yZWZyZXNoX2xhc3RfZnJhbWUgJiBjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICAvKiBib3RoIHJlZnJlc2hlZCAqLworICAgICAgICBjcGktPmFsdF9pc19sYXN0ID0gMTsKKyAgICBlbHNlIGlmIChjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lIF4gY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgLyogMSByZWZyZXNoZWQgYnV0IG5vdCB0aGUgb3RoZXIgKi8KKyAgICAgICAgY3BpLT5hbHRfaXNfbGFzdCA9IDA7CisKKyAgICBpZiAoY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSAmIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgLyogYm90aCByZWZyZXNoZWQgKi8KKyAgICAgICAgY3BpLT5nb2xkX2lzX2FsdCA9IDE7CisgICAgZWxzZSBpZiAoY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSBeIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgLyogMSByZWZyZXNoZWQgYnV0IG5vdCB0aGUgb3RoZXIgKi8KKyAgICAgICAgY3BpLT5nb2xkX2lzX2FsdCA9IDA7CisKKyAgICBjcGktPnJlZl9mcmFtZV9mbGFncyA9IFZQOF9BTFRSX0ZSQU1FIHwgVlA4X0dPTERfRlJBTUUgfCBWUDhfTEFTVF9GUkFNRTsKKworICAgIGlmIChjcGktPmdvbGRfaXNfbGFzdCkKKyAgICAgICAgY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJj0gflZQOF9HT0xEX0ZSQU1FOworCisgICAgaWYgKGNwaS0+YWx0X2lzX2xhc3QpCisgICAgICAgIGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICY9IH5WUDhfQUxUUl9GUkFNRTsKKworICAgIGlmIChjcGktPmdvbGRfaXNfYWx0KQorICAgICAgICBjcGktPnJlZl9mcmFtZV9mbGFncyAmPSB+VlA4X0FMVFJfRlJBTUU7CisKKworICAgIGlmICghY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+b3hjZi5wbGF5X2FsdGVybmF0ZSAmJiBjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lICYmIChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpKQorICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIHN0YXRzIGFzIGFwcHJvcHJpYXRlLiAqLworICAgICAgICAgICAgdXBkYXRlX2FsdF9yZWZfZnJhbWVfc3RhdHMoY3BpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBHb2xkZW4gZnJhbWUgc3RhdHMgYXMgYXBwcm9wcmlhdGUuICovCisgICAgICAgICAgICB1cGRhdGVfZ29sZGVuX2ZyYW1lX3N0YXRzKGNwaSk7CisgICAgfQorCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIC8qIFRlbGwgdGhlIGNhbGxlciB0aGF0IHRoZSBmcmFtZSB3YXMgY29kZWQgYXMgYSBrZXkgZnJhbWUgKi8KKyAgICAgICAgKmZyYW1lX2ZsYWdzID0gY20tPmZyYW1lX2ZsYWdzIHwgRlJBTUVGTEFHU19LRVk7CisKKyAgICAgICAgLyogQXMgdGhpcyBmcmFtZSBpcyBhIGtleSBmcmFtZSAgdGhlIG5leHQgZGVmYXVsdHMgdG8gYW4gaW50ZXIgZnJhbWUuICovCisgICAgICAgIGNtLT5mcmFtZV90eXBlID0gSU5URVJfRlJBTUU7CisKKyAgICAgICAgY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgPSAxMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpmcmFtZV9mbGFncyA9IGNtLT5mcmFtZV9mbGFncyZ+RlJBTUVGTEFHU19LRVk7CisKKyAgICAgICAgY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgPSBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYTsKKyAgICB9CisKKyAgICAvKiBDbGVhciB0aGUgb25lIHNob3QgdXBkYXRlIGZsYWdzIGZvciBzZWdtZW50YXRpb24gbWFwIGFuZCBtb2RlL3JlZgorICAgICAqIGxvb3AgZmlsdGVyIGRlbHRhcy4KKyAgICAgKi8KKyAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMDsKKyAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSA9IDA7CisgICAgY3BpLT5tYi5lX21iZC5tb2RlX3JlZl9sZl9kZWx0YV91cGRhdGUgPSAwOworCisKKyAgICAvKiBEb250IGluY3JlbWVudCBmcmFtZSBjb3VudGVycyBpZiB0aGlzIHdhcyBhbiBhbHRyZWYgYnVmZmVyIHVwZGF0ZQorICAgICAqIG5vdCBhIHJlYWwgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoY20tPnNob3dfZnJhbWUpCisgICAgeworICAgICAgICBjbS0+Y3VycmVudF92aWRlb19mcmFtZSsrOworICAgICAgICBjcGktPmZyYW1lc19zaW5jZV9rZXkrKzsKKyAgICB9CisKKyAgICAvKiByZXNldCB0byBub3JtYWwgc3RhdGUgbm93IHRoYXQgd2UgYXJlIGRvbmUuICovCisKKworCisjaWYgMAorICAgIHsKKyAgICAgICAgY2hhciBmaWxlbmFtZVs1MTJdOworICAgICAgICBGSUxFICpyZWNvbl9maWxlOworICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCAiZW5jJTA0ZC55dXYiLCAoaW50KSBjbS0+Y3VycmVudF92aWRlb19mcmFtZSk7CisgICAgICAgIHJlY29uX2ZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgICAgIGZ3cml0ZShjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0uYnVmZmVyX2FsbG9jLAorICAgICAgICAgICAgICAgY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLmZyYW1lX3NpemUsIDEsIHJlY29uX2ZpbGUpOworICAgICAgICBmY2xvc2UocmVjb25fZmlsZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBERUJVRyAqLworICAgIC8qIHZwOF93cml0ZV95dXZfZnJhbWUoImVuY29kZXJfcmVjb24ueXV2IiwgY20tPmZyYW1lX3RvX3Nob3cpOyAqLworCisKK30KKworCitzdGF0aWMgdm9pZCBjaGVja19nZl9xdWFsaXR5KFZQOF9DT01QICpjcGkpCit7CisgICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisgICAgaW50IGdmX2FjdGl2ZV9wY3QgPSAoMTAwICogY3BpLT5nZl9hY3RpdmVfY291bnQpIC8gKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpOworICAgIGludCBnZl9yZWZfdXNhZ2VfcGN0ID0gKGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKiAxMDApIC8gKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpOworICAgIGludCBsYXN0X3JlZl96el91c2VhZ2UgPSAoY3BpLT5pbnRlcl96el9jb3VudCAqIDEwMCkgLyAoY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scyk7CisKKyAgICAvKiBHZiByZWZyZXNoIGlzIG5vdCBjdXJyZW50bHkgYmVpbmcgc2lnbmFsbGVkICovCisgICAgaWYgKGNwaS0+Z2ZfdXBkYXRlX3JlY29tbWVuZGVkID09IDApCisgICAgeworICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA+IDcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIExvdyB1c2Ugb2YgZ2YgKi8KKyAgICAgICAgICAgIGlmICgoZ2ZfYWN0aXZlX3BjdCA8IDEwKSB8fCAoKGdmX2FjdGl2ZV9wY3QgKyBnZl9yZWZfdXNhZ2VfcGN0KSA8IDE1KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAuLi5idXQgbGFzdCBmcmFtZSB6ZXJvIHplcm8gdXNhZ2UgaXMgcmVhc29uYmFibGUgc28gYQorICAgICAgICAgICAgICAgICAqIG5ldyBnZiBtaWdodCBiZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChsYXN0X3JlZl96el91c2VhZ2UgPj0gMjUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjcGktPmdmX2JhZF9jb3VudCArKzsKKworICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBjb25kaXRpb24gaXMgc3RhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjcGktPmdmX2JhZF9jb3VudCA+PSA4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmdmX3VwZGF0ZV9yZWNvbW1lbmRlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmdmX2JhZF9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IGNvdW50IGFzIHRoZSBiYWNrZ3JvdW5kIGlzIG5vdCBzdGFibGUgZW5vdWdoICovCisgICAgICAgICAgICAgICAgICAgIGNwaS0+Z2ZfYmFkX2NvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBHZiB1c2VhZ2UgaGFzIHBpY2tlZCB1cCBzbyByZXNldCBjb3VudCAqLworICAgICAgICAgICAgICAgIGNwaS0+Z2ZfYmFkX2NvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB0aGUgc2lnbmFsIGlzIHNldCBidXQgaGFzIG5vdCBiZWVuIHJlYWQgc2hvdWxkIHdlIGNhbmNlbCBpdC4gKi8KKyAgICBlbHNlIGlmIChsYXN0X3JlZl96el91c2VhZ2UgPCAxNSkKKyAgICB7CisgICAgICAgIGNwaS0+Z2ZfdXBkYXRlX3JlY29tbWVuZGVkID0gMDsKKyAgICAgICAgY3BpLT5nZl9iYWRfY291bnQgPSAwOworICAgIH0KKworI2lmIDAKKyAgICB7CisgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiZ2ZuZWVkZWQuc3R0IiwgImEiKTsKKyAgICAgICAgZnByaW50ZihmLCAiJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBsZCBcbiIsCisgICAgICAgICAgICAgICAgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUsCisgICAgICAgICAgICAgICAgY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiwKKyAgICAgICAgICAgICAgICBnZl9hY3RpdmVfcGN0LCBnZl9yZWZfdXNhZ2VfcGN0LAorICAgICAgICAgICAgICAgIGNwaS0+Z2ZfdXBkYXRlX3JlY29tbWVuZGVkKTsKKyAgICAgICAgZmNsb3NlKGYpOworICAgIH0KKworI2VuZGlmCit9CisKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorc3RhdGljIHZvaWQgUGFzczJFbmNvZGUoVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciAqIGRlc3RfZW5kLCB1bnNpZ25lZCBpbnQgKmZyYW1lX2ZsYWdzKQoreworCisgICAgaWYgKCFjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCisgICAgICAgIHZwOF9zZWNvbmRfcGFzcyhjcGkpOworCisgICAgZW5jb2RlX2ZyYW1lX3RvX2RhdGFfcmF0ZShjcGksIHNpemUsIGRlc3QsIGRlc3RfZW5kLCBmcmFtZV9mbGFncyk7CisgICAgY3BpLT50d29wYXNzLmJpdHNfbGVmdCAtPSA4ICogKnNpemU7CisKKyAgICBpZiAoIWNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0d29fcGFzc19taW5fcmF0ZSA9IChkb3VibGUpKGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoCisgICAgICAgICAgICAqY3BpLT5veGNmLnR3b19wYXNzX3Zicm1pbl9zZWN0aW9uIC8gMTAwKTsKKyAgICAgICAgY3BpLT50d29wYXNzLmJpdHNfbGVmdCArPSAoaW50NjRfdCkodHdvX3Bhc3NfbWluX3JhdGUgLyBjcGktPmZyYW1lX3JhdGUpOworICAgIH0KK30KKyNlbmRpZgorCisvKiBGb3IgQVJNIE5FT04sIGQ4LWQxNSBhcmUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycywgYW5kIG5lZWQgdG8gYmUgc2F2ZWQuICovCisjaWYgSEFWRV9ORU9OCitleHRlcm4gdm9pZCB2cDhfcHVzaF9uZW9uKGludDY0X3QgKnN0b3JlKTsKK2V4dGVybiB2b2lkIHZwOF9wb3BfbmVvbihpbnQ2NF90ICpzdG9yZSk7CisjZW5kaWYKKworCitpbnQgdnA4X3JlY2VpdmVfcmF3X2ZyYW1lKFZQOF9DT01QICpjcGksIHVuc2lnbmVkIGludCBmcmFtZV9mbGFncywgWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgaW50NjRfdCB0aW1lX3N0YW1wLCBpbnQ2NF90IGVuZF90aW1lKQoreworI2lmIEhBVkVfTkVPTgorICAgIGludDY0X3Qgc3RvcmVfcmVnWzhdOworI2VuZGlmCisgICAgVlA4X0NPTU1PTiAgICAgICAgICAgICpjbSA9ICZjcGktPmNvbW1vbjsKKyAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgIHRpbWVyOworICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKworI2lmIEhBVkVfTkVPTgorI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKKyAgICBpZiAoY20tPmNwdV9jYXBzICYgSEFTX05FT04pCisjZW5kaWYKKyAgICB7CisgICAgICAgIHZwOF9wdXNoX25lb24oc3RvcmVfcmVnKTsKKyAgICB9CisjZW5kaWYKKworICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0aW1lcik7CisKKyAgICAvKiBSZWluaXQgdGhlIGxvb2thaGVhZCBidWZmZXIgaWYgdGhlIGZyYW1lIHNpemUgY2hhbmdlcyAqLworICAgIGlmIChzZC0+eV93aWR0aCAhPSBjcGktPm94Y2YuV2lkdGggfHwgc2QtPnlfaGVpZ2h0ICE9IGNwaS0+b3hjZi5IZWlnaHQpCisgICAgeworICAgICAgICBhc3NlcnQoY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgPCAyKTsKKyAgICAgICAgZGVhbGxvY19yYXdfZnJhbWVfYnVmZmVycyhjcGkpOworICAgICAgICBhbGxvY19yYXdfZnJhbWVfYnVmZmVycyhjcGkpOworICAgIH0KKworICAgIGlmKHZwOF9sb29rYWhlYWRfcHVzaChjcGktPmxvb2thaGVhZCwgc2QsIHRpbWVfc3RhbXAsIGVuZF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9mbGFncywgY3BpLT5hY3RpdmVfbWFwX2VuYWJsZWQgPyBjcGktPmFjdGl2ZV9tYXAgOiBOVUxMKSkKKyAgICAgICAgcmVzID0gLTE7CisgICAgY20tPmNscl90eXBlID0gc2QtPmNscnR5cGU7CisgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdGltZXIpOworICAgIGNwaS0+dGltZV9yZWNlaXZlX2RhdGEgKz0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmdGltZXIpOworCisjaWYgSEFWRV9ORU9OCisjaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAorICAgIGlmIChjbS0+Y3B1X2NhcHMgJiBIQVNfTkVPTikKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdnA4X3BvcF9uZW9uKHN0b3JlX3JlZyk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgZnJhbWVfaXNfcmVmZXJlbmNlKGNvbnN0IFZQOF9DT01QICpjcGkpCit7CisgICAgY29uc3QgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247CisgICAgY29uc3QgTUFDUk9CTE9DS0QgKnhkID0gJmNwaS0+bWIuZV9tYmQ7CisKKyAgICByZXR1cm4gY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FIHx8IGNtLT5yZWZyZXNoX2xhc3RfZnJhbWUKKyAgICAgICAgICAgfHwgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lIHx8IGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUKKyAgICAgICAgICAgfHwgY20tPmNvcHlfYnVmZmVyX3RvX2dmIHx8IGNtLT5jb3B5X2J1ZmZlcl90b19hcmYKKyAgICAgICAgICAgfHwgY20tPnJlZnJlc2hfZW50cm9weV9wcm9icworICAgICAgICAgICB8fCB4ZC0+bW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlCisgICAgICAgICAgIHx8IHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCB8fCB4ZC0+dXBkYXRlX21iX3NlZ21lbnRhdGlvbl9kYXRhOworfQorCisKK2ludCB2cDhfZ2V0X2NvbXByZXNzZWRfZGF0YShWUDhfQ09NUCAqY3BpLCB1bnNpZ25lZCBpbnQgKmZyYW1lX2ZsYWdzLCB1bnNpZ25lZCBsb25nICpzaXplLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBjaGFyICpkZXN0X2VuZCwgaW50NjRfdCAqdGltZV9zdGFtcCwgaW50NjRfdCAqdGltZV9lbmQsIGludCBmbHVzaCkKK3sKKyNpZiBIQVZFX05FT04KKyAgICBpbnQ2NF90IHN0b3JlX3JlZ1s4XTsKKyNlbmRpZgorICAgIFZQOF9DT01NT04gKmNtOworICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciAgdHNjdGltZXI7CisgICAgc3RydWN0IHZweF91c2VjX3RpbWVyICB0aWNrdGltZXI7CisgICAgc3RydWN0IHZweF91c2VjX3RpbWVyICBjbXB0aW1lcjsKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgKmZvcmNlX3NyY19idWZmZXIgPSBOVUxMOworCisgICAgaWYgKCFjcGkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGNtID0gJmNwaS0+Y29tbW9uOworCisgICAgaWYgKHNldGptcChjcGktPmNvbW1vbi5lcnJvci5qbXApKQorICAgIHsKKyAgICAgICAgY3BpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMDsKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FOworICAgIH0KKworICAgIGNwaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDE7CisKKyNpZiBIQVZFX05FT04KKyNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCisgICAgaWYgKGNtLT5jcHVfY2FwcyAmIEhBU19ORU9OKQorI2VuZGlmCisgICAgeworICAgICAgICB2cDhfcHVzaF9uZW9uKHN0b3JlX3JlZyk7CisgICAgfQorI2VuZGlmCisKKyAgICB2cHhfdXNlY190aW1lcl9zdGFydCgmY21wdGltZXIpOworCisgICAgY3BpLT5zb3VyY2UgPSBOVUxMOworCisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKKyAgICAvKiBTaG91bGQgd2UgY29kZSBhbiBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lICovCisgICAgaWYgKGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSA9PSAwICYmCisgICAgICAgIGNwaS0+b3hjZi5wbGF5X2FsdGVybmF0ZSAmJgorICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcpCisgICAgeworICAgICAgICBpZiAoKGNwaS0+c291cmNlID0gdnA4X2xvb2thaGVhZF9wZWVrKGNwaS0+bG9va2FoZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUVLX0ZPUldBUkQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5hbHRfcmVmX3NvdXJjZSA9IGNwaS0+c291cmNlOworICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5hcm5yX21heF9mcmFtZXMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZwOF90ZW1wb3JhbF9maWx0ZXJfcHJlcGFyZV9jKGNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUpOworICAgICAgICAgICAgICAgIGZvcmNlX3NyY19idWZmZXIgPSAmY3BpLT5hbHRfcmVmX2J1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtLT5mcmFtZXNfdGlsbF9hbHRfcmVmX2ZyYW1lID0gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOworICAgICAgICAgICAgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSA9IDE7CisgICAgICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOworICAgICAgICAgICAgY20tPnJlZnJlc2hfbGFzdF9mcmFtZSA9IDA7CisgICAgICAgICAgICBjbS0+c2hvd19mcmFtZSA9IDA7CisgICAgICAgICAgICAvKiBDbGVhciBQZW5kaW5nIGFsdCBSZWYgZmxhZy4gKi8KKyAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IDA7CisgICAgICAgICAgICBjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFjcGktPnNvdXJjZSkKKyAgICB7CisgICAgICAgIC8qIFJlYWQgbGFzdCBmcmFtZSBzb3VyY2UgaWYgd2UgYXJlIGVuY29kaW5nIGZpcnN0IHBhc3MuICovCisgICAgICAgIGlmIChjcGktPnBhc3MgPT0gMSAmJiBjbS0+Y3VycmVudF92aWRlb19mcmFtZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChjcGktPmxhc3Rfc291cmNlID0gdnA4X2xvb2thaGVhZF9wZWVrKGNwaS0+bG9va2FoZWFkLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVFS19CQUNLV0FSRCkpID09IE5VTEwpCisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKChjcGktPnNvdXJjZSA9IHZwOF9sb29rYWhlYWRfcG9wKGNwaS0+bG9va2FoZWFkLCBmbHVzaCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbS0+c2hvd19mcmFtZSA9IDE7CisKKyAgICAgICAgICAgIGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgPSBjcGktPmFsdF9yZWZfc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNwaS0+c291cmNlID09IGNwaS0+YWx0X3JlZl9zb3VyY2UpOworCisgICAgICAgICAgICBpZihjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmKQorICAgICAgICAgICAgICAgIGNwaS0+YWx0X3JlZl9zb3VyY2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNwaS0+c291cmNlKQorICAgIHsKKyAgICAgICAgY3BpLT5Tb3VyY2UgPSBmb3JjZV9zcmNfYnVmZmVyID8gZm9yY2Vfc3JjX2J1ZmZlciA6ICZjcGktPnNvdXJjZS0+aW1nOworICAgICAgICBjcGktPnVuX3NjYWxlZF9zb3VyY2UgPSBjcGktPlNvdXJjZTsKKyAgICAgICAgKnRpbWVfc3RhbXAgPSBjcGktPnNvdXJjZS0+dHNfc3RhcnQ7CisgICAgICAgICp0aW1lX2VuZCA9IGNwaS0+c291cmNlLT50c19lbmQ7CisgICAgICAgICpmcmFtZV9mbGFncyA9IGNwaS0+c291cmNlLT5mbGFnczsKKworICAgICAgICBpZiAoY3BpLT5wYXNzID09IDEgJiYgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPmxhc3RfZnJhbWVfdW5zY2FsZWRfc291cmNlID0gJmNwaS0+bGFzdF9zb3VyY2UtPmltZzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqc2l6ZSA9IDA7CisjaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKKworICAgICAgICBpZiAoZmx1c2ggJiYgY3BpLT5wYXNzID09IDEgJiYgIWNwaS0+dHdvcGFzcy5maXJzdF9wYXNzX2RvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9lbmRfZmlyc3RfcGFzcyhjcGkpOyAgICAvKiBnZXQgbGFzdCBzdGF0cyBwYWNrZXQgKi8KKyAgICAgICAgICAgIGNwaS0+dHdvcGFzcy5maXJzdF9wYXNzX2RvbmUgPSAxOworICAgICAgICB9CisKKyNlbmRpZgorCisjaWYgSEFWRV9ORU9OCisjaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAorICAgICAgICBpZiAoY20tPmNwdV9jYXBzICYgSEFTX05FT04pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X3BvcF9uZW9uKHN0b3JlX3JlZyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGNwaS0+c291cmNlLT50c19zdGFydCA8IGNwaS0+Zmlyc3RfdGltZV9zdGFtcF9ldmVyKQorICAgIHsKKyAgICAgICAgY3BpLT5maXJzdF90aW1lX3N0YW1wX2V2ZXIgPSBjcGktPnNvdXJjZS0+dHNfc3RhcnQ7CisgICAgICAgIGNwaS0+bGFzdF9lbmRfdGltZV9zdGFtcF9zZWVuID0gY3BpLT5zb3VyY2UtPnRzX3N0YXJ0OworICAgIH0KKworICAgIC8qIGFkanVzdCBmcmFtZSByYXRlcyBiYXNlZCBvbiB0aW1lc3RhbXBzIGdpdmVuICovCisgICAgaWYgKGNtLT5zaG93X2ZyYW1lKQorICAgIHsKKyAgICAgICAgaW50NjRfdCB0aGlzX2R1cmF0aW9uOworICAgICAgICBpbnQgc3RlcCA9IDA7CisKKyAgICAgICAgaWYgKGNwaS0+c291cmNlLT50c19zdGFydCA9PSBjcGktPmZpcnN0X3RpbWVfc3RhbXBfZXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpc19kdXJhdGlvbiA9IGNwaS0+c291cmNlLT50c19lbmQgLSBjcGktPnNvdXJjZS0+dHNfc3RhcnQ7CisgICAgICAgICAgICBzdGVwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdF9kdXJhdGlvbjsKKworICAgICAgICAgICAgdGhpc19kdXJhdGlvbiA9IGNwaS0+c291cmNlLT50c19lbmQgLSBjcGktPmxhc3RfZW5kX3RpbWVfc3RhbXBfc2VlbjsKKyAgICAgICAgICAgIGxhc3RfZHVyYXRpb24gPSBjcGktPmxhc3RfZW5kX3RpbWVfc3RhbXBfc2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY3BpLT5sYXN0X3RpbWVfc3RhbXBfc2VlbjsKKyAgICAgICAgICAgIC8qIGRvIGEgc3RlcCB1cGRhdGUgaWYgdGhlIGR1cmF0aW9uIGNoYW5nZXMgYnkgMTAlICovCisgICAgICAgICAgICBpZiAobGFzdF9kdXJhdGlvbikKKyAgICAgICAgICAgICAgICBzdGVwID0gKGludCkoKCh0aGlzX2R1cmF0aW9uIC0gbGFzdF9kdXJhdGlvbikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIC8gbGFzdF9kdXJhdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXNfZHVyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdGVwKQorICAgICAgICAgICAgICAgIGNwaS0+cmVmX2ZyYW1lX3JhdGUgPSAxMDAwMDAwMC4wIC8gdGhpc19kdXJhdGlvbjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgYXZnX2R1cmF0aW9uLCBpbnRlcnZhbDsKKworICAgICAgICAgICAgICAgIC8qIEF2ZXJhZ2UgdGhpcyBmcmFtZSdzIHJhdGUgaW50byB0aGUgbGFzdCBzZWNvbmQncyBhdmVyYWdlCisgICAgICAgICAgICAgICAgICogZnJhbWUgcmF0ZS4gSWYgd2UgaGF2ZW4ndCBzZWVuIDEgc2Vjb25kIHlldCwgdGhlbiBhdmVyYWdlCisgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgd2hvbGUgaW50ZXJ2YWwgc2Vlbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IChkb3VibGUpKGNwaS0+c291cmNlLT50c19lbmQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5maXJzdF90aW1lX3N0YW1wX2V2ZXIpOworICAgICAgICAgICAgICAgIGlmKGludGVydmFsID4gMTAwMDAwMDAuMCkKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAxMDAwMDAwMDsKKworICAgICAgICAgICAgICAgIGF2Z19kdXJhdGlvbiA9IDEwMDAwMDAwLjAgLyBjcGktPnJlZl9mcmFtZV9yYXRlOworICAgICAgICAgICAgICAgIGF2Z19kdXJhdGlvbiAqPSAoaW50ZXJ2YWwgLSBhdmdfZHVyYXRpb24gKyB0aGlzX2R1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBhdmdfZHVyYXRpb24gLz0gaW50ZXJ2YWw7CisKKyAgICAgICAgICAgICAgICBjcGktPnJlZl9mcmFtZV9yYXRlID0gMTAwMDAwMDAuMCAvIGF2Z19kdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBmcmFtZSByYXRlcyBmb3IgZWFjaCBsYXllciAqLworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMQVlFUl9DT05URVhUICpsYyA9ICZjcGktPmxheWVyX2NvbnRleHRbaV07CisgICAgICAgICAgICAgICAgICAgIGxjLT5mcmFtZV9yYXRlID0gY3BpLT5yZWZfZnJhbWVfcmF0ZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLnJhdGVfZGVjaW1hdG9yW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2cDhfbmV3X2ZyYW1lX3JhdGUoY3BpLCBjcGktPnJlZl9mcmFtZV9yYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNwaS0+bGFzdF90aW1lX3N0YW1wX3NlZW4gPSBjcGktPnNvdXJjZS0+dHNfc3RhcnQ7CisgICAgICAgIGNwaS0+bGFzdF9lbmRfdGltZV9zdGFtcF9zZWVuID0gY3BpLT5zb3VyY2UtPnRzX2VuZDsKKyAgICB9CisKKyAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgaW50IGxheWVyOworCisgICAgICAgIHVwZGF0ZV9sYXllcl9jb250ZXh0cyAoY3BpKTsKKworICAgICAgICAvKiBSZXN0b3JlIGxheWVyIHNwZWNpZmljIGNvbnRleHQgJiBzZXQgZnJhbWUgcmF0ZSAqLworICAgICAgICBsYXllciA9IGNwaS0+b3hjZi5sYXllcl9pZFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+Y3VycmVudF92aWRlb19mcmFtZSAlIGNwaS0+b3hjZi5wZXJpb2RpY2l0eV07CisgICAgICAgIHJlc3RvcmVfbGF5ZXJfY29udGV4dCAoY3BpLCBsYXllcik7CisgICAgICAgIHZwOF9uZXdfZnJhbWVfcmF0ZSAoY3BpLCBjcGktPmxheWVyX2NvbnRleHRbbGF5ZXJdLmZyYW1lX3JhdGUpOworICAgIH0KKworICAgIGlmIChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMikKKyAgICB7CisgICAgICAgIGlmIChjcGktPm94Y2YubnVtYmVyX29mX2xheWVycyA9PSAxKQorICAgICAgICAgICAgY2hlY2tfZ2ZfcXVhbGl0eShjcGkpOworICAgICAgICB2cHhfdXNlY190aW1lcl9zdGFydCgmdHNjdGltZXIpOworICAgICAgICB2cHhfdXNlY190aW1lcl9zdGFydCgmdGlja3RpbWVyKTsKKyAgICB9CisKKyAgICBjcGktPmxmX3plcm9tdl9wY3QgPSAoY3BpLT56ZXJvbXZfY291bnQgKiAxMDApL2NtLT5NQnM7CisKKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY29uc3QgaW50IG51bV9wYXJ0ID0gKDEgPDwgY20tPm11bHRpX3Rva2VuX3BhcnRpdGlvbik7CisgICAgICAgIC8qIHRoZSBhdmFpbGFibGUgYnl0ZXMgaW4gZGVzdCAqLworICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGRlc3Rfc2l6ZSA9IGRlc3RfZW5kIC0gZGVzdDsKKyAgICAgICAgY29uc3QgaW50IHRva19wYXJ0X2J1ZmZfc2l6ZSA9IChkZXN0X3NpemUgKiA5KSAvICgxMCAqIG51bV9wYXJ0KTsKKworICAgICAgICB1bnNpZ25lZCBjaGFyICpkcCA9IGRlc3Q7CisKKyAgICAgICAgY3BpLT5wYXJ0aXRpb25fZFswXSA9IGRwOworICAgICAgICBkcCArPSBkZXN0X3NpemUvMTA7ICAgICAgICAgLyogcmVzZXJ2ZSAxLzEwIGZvciBjb250cm9sIHBhcnRpdGlvbiAqLworICAgICAgICBjcGktPnBhcnRpdGlvbl9kX2VuZFswXSA9IGRwOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IG51bV9wYXJ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+cGFydGl0aW9uX2RbaSArIDFdID0gZHA7CisgICAgICAgICAgICBkcCArPSB0b2tfcGFydF9idWZmX3NpemU7CisgICAgICAgICAgICBjcGktPnBhcnRpdGlvbl9kX2VuZFtpICsgMV0gPSBkcDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogc3RhcnQgd2l0aCBhIDAgc2l6ZSBmcmFtZSAqLworICAgICpzaXplID0gMDsKKworICAgIC8qIENsZWFyIGRvd24gbW14IHJlZ2lzdGVycyAqLworICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgIGNtLT5mcmFtZV90eXBlID0gSU5URVJfRlJBTUU7CisgICAgY20tPmZyYW1lX2ZsYWdzID0gKmZyYW1lX2ZsYWdzOworCisjaWYgMAorCisgICAgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCisgICAgeworICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOworICAgICAgICBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gMDsKKyAgICAgICAgY20tPnJlZnJlc2hfbGFzdF9mcmFtZSA9IDE7CisgICAgfQorCisjZW5kaWYKKyAgICAvKiBmaW5kIGEgZnJlZSBidWZmZXIgZm9yIHRoZSBuZXcgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yKDsgaSA8IE5VTV9ZVjEyX0JVRkZFUlM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIWNtLT55djEyX2ZiW2ldLmZsYWdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNtLT5uZXdfZmJfaWR4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydChpIDwgTlVNX1lWMTJfQlVGRkVSUyApOworICAgIH0KKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorCisgICAgaWYgKGNwaS0+cGFzcyA9PSAxKQorICAgIHsKKyAgICAgICAgUGFzczFFbmNvZGUoY3BpLCBzaXplLCBkZXN0LCBmcmFtZV9mbGFncyk7CisgICAgfQorICAgIGVsc2UgaWYgKGNwaS0+cGFzcyA9PSAyKQorICAgIHsKKyAgICAgICAgUGFzczJFbmNvZGUoY3BpLCBzaXplLCBkZXN0LCBkZXN0X2VuZCwgZnJhbWVfZmxhZ3MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgZW5jb2RlX2ZyYW1lX3RvX2RhdGFfcmF0ZShjcGksIHNpemUsIGRlc3QsIGRlc3RfZW5kLCBmcmFtZV9mbGFncyk7CisKKyAgICBpZiAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDIpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgZHVyYXRpb24sIGR1cmF0aW9uMjsKKyAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdHNjdGltZXIpOworICAgICAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZ0aWNrdGltZXIpOworCisgICAgICAgIGR1cmF0aW9uID0gKGludCkodnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmdGlja3RpbWVyKSk7CisgICAgICAgIGR1cmF0aW9uMiA9ICh1bnNpZ25lZCBpbnQpKChkb3VibGUpZHVyYXRpb24gLyAyKTsKKworICAgICAgICBpZiAoY20tPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3BpLT5hdmdfZW5jb2RlX3RpbWUgPT0gMCkKKyAgICAgICAgICAgICAgICBjcGktPmF2Z19lbmNvZGVfdGltZSA9IGR1cmF0aW9uOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNwaS0+YXZnX2VuY29kZV90aW1lID0gKDcgKiBjcGktPmF2Z19lbmNvZGVfdGltZSArIGR1cmF0aW9uKSA+PiAzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1cmF0aW9uMikKKyAgICAgICAgeworICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lID09IDApCisgICAgICAgICAgICAgICAgICAgIGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lID0gZHVyYXRpb24yOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5hdmdfcGlja19tb2RlX3RpbWUgPSAoNyAqIGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lICsgZHVyYXRpb24yKSA+PiAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAoY20tPnJlZnJlc2hfZW50cm9weV9wcm9icyA9PSAwKQorICAgIHsKKyAgICAgICAgdnB4X21lbWNweSgmY20tPmZjLCAmY20tPmxmYywgc2l6ZW9mKGNtLT5mYykpOworICAgIH0KKworICAgIC8qIFNhdmUgdGhlIGNvbnRleHRzIHNlcGFyYXRlbHkgZm9yIGFsdCByZWYsIGdvbGQgYW5kIGxhc3QuICovCisgICAgLyogKFRPRE8gamJiIC0+IE9wdGltaXplIHRoaXMgd2l0aCBwb2ludGVycyB0byBhdm9pZCBleHRyYSBjb3BpZXMuICkgKi8KKyAgICBpZihjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICB2cHhfbWVtY3B5KCZjcGktPmxmY19hLCAmY20tPmZjLCBzaXplb2YoY20tPmZjKSk7CisKKyAgICBpZihjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgIHZweF9tZW1jcHkoJmNwaS0+bGZjX2csICZjbS0+ZmMsIHNpemVvZihjbS0+ZmMpKTsKKworICAgIGlmKGNtLT5yZWZyZXNoX2xhc3RfZnJhbWUpCisgICAgICAgIHZweF9tZW1jcHkoJmNwaS0+bGZjX24sICZjbS0+ZmMsIHNpemVvZihjbS0+ZmMpKTsKKworICAgIC8qIGlmIGl0cyBhIGRyb3BwZWQgZnJhbWUgaG9ub3IgdGhlIHJlcXVlc3RzIG9uIHN1YnNlcXVlbnQgZnJhbWVzICovCisgICAgaWYgKCpzaXplID4gMCkKKyAgICB7CisgICAgICAgIGNwaS0+ZHJvcHBhYmxlID0gIWZyYW1lX2lzX3JlZmVyZW5jZShjcGkpOworCisgICAgICAgIC8qIHJldHVybiB0byBub3JtYWwgc3RhdGUgKi8KKyAgICAgICAgY20tPnJlZnJlc2hfZW50cm9weV9wcm9icyA9IDE7CisgICAgICAgIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSAwOworICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOworICAgICAgICBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMTsKKyAgICAgICAgY20tPmZyYW1lX3R5cGUgPSBJTlRFUl9GUkFNRTsKKworICAgIH0KKworICAgIC8qIFNhdmUgbGF5ZXIgc3BlY2lmaWMgc3RhdGUgKi8KKyAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgICAgICBzYXZlX2xheWVyX2NvbnRleHQgKGNwaSk7CisKKyAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZjbXB0aW1lcik7CisgICAgY3BpLT50aW1lX2NvbXByZXNzX2RhdGEgKz0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmY21wdGltZXIpOworCisgICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfcHNuciAmJiBjcGktPnBhc3MgIT0gMSAmJiBjbS0+c2hvd19mcmFtZSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3BzbnJfcGFja2V0KGNwaSk7CisgICAgfQorCisjaWYgQ09ORklHX0lOVEVSTkFMX1NUQVRTCisKKyAgICBpZiAoY3BpLT5wYXNzICE9IDEpCisgICAgeworICAgICAgICBjcGktPmJ5dGVzICs9ICpzaXplOworCisgICAgICAgIGlmIChjbS0+c2hvd19mcmFtZSkKKyAgICAgICAgeworCisgICAgICAgICAgICBjcGktPmNvdW50ICsrOworCisgICAgICAgICAgICBpZiAoY3BpLT5iX2NhbGN1bGF0ZV9wc25yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHllLHVlLHZlOworICAgICAgICAgICAgICAgIGRvdWJsZSBmcmFtZV9wc25yOworICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICpvcmlnID0gY3BpLT5Tb3VyY2U7CisgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAgICAgKnJlY29uID0gY3BpLT5jb21tb24uZnJhbWVfdG9fc2hvdzsKKyAgICAgICAgICAgICAgICBpbnQgeV9zYW1wbGVzID0gb3JpZy0+eV9oZWlnaHQgKiBvcmlnLT55X3dpZHRoIDsKKyAgICAgICAgICAgICAgICBpbnQgdXZfc2FtcGxlcyA9IG9yaWctPnV2X2hlaWdodCAqIG9yaWctPnV2X3dpZHRoIDsKKyAgICAgICAgICAgICAgICBpbnQgdF9zYW1wbGVzID0geV9zYW1wbGVzICsgMiAqIHV2X3NhbXBsZXM7CisgICAgICAgICAgICAgICAgZG91YmxlIHNxX2Vycm9yLCBzcV9lcnJvcjI7CisKKyAgICAgICAgICAgICAgICB5ZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+eV9idWZmZXIsIG9yaWctPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgcmVjb24tPnlfYnVmZmVyLCByZWNvbi0+eV9zdHJpZGUsIG9yaWctPnlfd2lkdGgsIG9yaWctPnlfaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHVlID0gY2FsY19wbGFuZV9lcnJvcihvcmlnLT51X2J1ZmZlciwgb3JpZy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgcmVjb24tPnVfYnVmZmVyLCByZWNvbi0+dXZfc3RyaWRlLCBvcmlnLT51dl93aWR0aCwgb3JpZy0+dXZfaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHZlID0gY2FsY19wbGFuZV9lcnJvcihvcmlnLT52X2J1ZmZlciwgb3JpZy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgcmVjb24tPnZfYnVmZmVyLCByZWNvbi0+dXZfc3RyaWRlLCBvcmlnLT51dl93aWR0aCwgb3JpZy0+dXZfaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHNxX2Vycm9yID0gKGRvdWJsZSkoeWUgKyB1ZSArIHZlKTsKKworICAgICAgICAgICAgICAgIGZyYW1lX3BzbnIgPSB2cDhfbXNlMnBzbnIodF9zYW1wbGVzLCAyNTUuMCwgc3FfZXJyb3IpOworCisgICAgICAgICAgICAgICAgY3BpLT50b3RhbF95ICs9IHZwOF9tc2UycHNucih5X3NhbXBsZXMsIDI1NS4wLCAoZG91YmxlKXllKTsKKyAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3UgKz0gdnA4X21zZTJwc25yKHV2X3NhbXBsZXMsIDI1NS4wLCAoZG91YmxlKXVlKTsKKyAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3YgKz0gdnA4X21zZTJwc25yKHV2X3NhbXBsZXMsIDI1NS4wLCAoZG91YmxlKXZlKTsKKyAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NxX2Vycm9yICs9IHNxX2Vycm9yOworICAgICAgICAgICAgICAgIGNwaS0+dG90YWwgICs9IGZyYW1lX3BzbnI7CisjaWYgQ09ORklHX1BPU1RQUk9DCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAqcHAgPSAmY20tPnBvc3RfcHJvY19idWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmcmFtZV9wc25yMiwgZnJhbWVfc3NpbTIgPSAwOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2VpZ2h0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICB2cDhfZGVibG9jayhjbSwgY20tPmZyYW1lX3RvX3Nob3csICZjbS0+cG9zdF9wcm9jX2J1ZmZlciwgY20tPmZpbHRlcl9sZXZlbCAqIDEwIC8gNiwgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKworICAgICAgICAgICAgICAgICAgICB5ZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+eV9idWZmZXIsIG9yaWctPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHBwLT55X2J1ZmZlciwgcHAtPnlfc3RyaWRlLCBvcmlnLT55X3dpZHRoLCBvcmlnLT55X2hlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgdWUgPSBjYWxjX3BsYW5lX2Vycm9yKG9yaWctPnVfYnVmZmVyLCBvcmlnLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgcHAtPnVfYnVmZmVyLCBwcC0+dXZfc3RyaWRlLCBvcmlnLT51dl93aWR0aCwgb3JpZy0+dXZfaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICB2ZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+dl9idWZmZXIsIG9yaWctPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcC0+dl9idWZmZXIsIHBwLT51dl9zdHJpZGUsIG9yaWctPnV2X3dpZHRoLCBvcmlnLT51dl9oZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIHNxX2Vycm9yMiA9IChkb3VibGUpKHllICsgdWUgKyB2ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfcHNucjIgPSB2cDhfbXNlMnBzbnIodF9zYW1wbGVzLCAyNTUuMCwgc3FfZXJyb3IyKTsKKworICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFscF95ICs9IHZwOF9tc2UycHNucih5X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NS4wLCAoZG91YmxlKXllKTsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbHBfdSArPSB2cDhfbXNlMnBzbnIodXZfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LjAsIChkb3VibGUpdWUpOworICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFscF92ICs9IHZwOF9tc2UycHNucih1dl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUuMCwgKGRvdWJsZSl2ZSk7CisgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfc3FfZXJyb3IyICs9IHNxX2Vycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbHAgICs9IGZyYW1lX3BzbnIyOworCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NzaW0yID0gdnA4X2NhbGNfc3NpbShjcGktPlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAmY20tPnBvc3RfcHJvY19idWZmZXIsIDEsICZ3ZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtbWVkX3F1YWxpdHkgKz0gZnJhbWVfc3NpbTIgKiB3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtbWVkX3dlaWdodHMgKz0gd2VpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChjcGktPm94Y2YubnVtYmVyX29mX2xheWVycyA+IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT1jcGktPmN1cnJlbnRfbGF5ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmZyYW1lc19pbl9sYXllcltpXSsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+Ynl0ZXNfaW5fbGF5ZXJbaV0gKz0gKnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtX3BzbnJbaV0gICAgICAgKz0gZnJhbWVfcHNucjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5zdW1fcHNucl9wW2ldICAgICArPSBmcmFtZV9wc25yMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9lcnJvcjJbaV0gICArPSBzcV9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9lcnJvcjJfcFtpXSArPSBzcV9lcnJvcjI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtX3NzaW1baV0gICAgICAgKz0gZnJhbWVfc3NpbTIgKiB3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c3VtX3dlaWdodHNbaV0gICAgKz0gd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3BpLT5iX2NhbGN1bGF0ZV9zc2ltZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgeSwgdSwgdiwgZnJhbWVfYWxsOworICAgICAgICAgICAgICAgIGZyYW1lX2FsbCA9ICB2cDhfY2FsY19zc2ltZyhjcGktPlNvdXJjZSwgY20tPmZyYW1lX3RvX3Nob3csCisgICAgICAgICAgICAgICAgICAgICZ5LCAmdSwgJnYpOworCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT1jcGktPmN1cnJlbnRfbGF5ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgaTxjcGktPm94Y2YubnVtYmVyX29mX2xheWVyczsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNwaS0+Yl9jYWxjdWxhdGVfcHNucikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmZyYW1lc19pbl9sYXllcltpXSsrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3lfaW5fbGF5ZXJbaV0gKz0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfc3NpbWdfdV9pbl9sYXllcltpXSArPSB1OworICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9zc2ltZ192X2luX2xheWVyW2ldICs9IHY7CisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX2FsbF9pbl9sYXllcltpXSArPSBmcmFtZV9hbGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9zc2ltZ195ICs9IHk7CisgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfc3NpbWdfdSArPSB1OworICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3YgKz0gdjsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9zc2ltZ19hbGwgKz0gZnJhbWVfYWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisjaWYgMAorCisgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gMCAmJiBjcGktPmNvbW1vbi5iYXNlX3FpbmRleCA9PSBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xKQorICAgIHsKKyAgICAgICAgc2tpcHRydWVjb3VudCArPSBjcGktPnNraXBfdHJ1ZV9jb3VudDsKKyAgICAgICAgc2tpcGZhbHNlY291bnQgKz0gY3BpLT5za2lwX2ZhbHNlX2NvdW50OworICAgIH0KKworI2VuZGlmCisjaWYgMAorCisgICAgaWYgKGNwaS0+cGFzcyAhPSAxKQorICAgIHsKKyAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJza2lwLnN0dCIsICJhIik7CisgICAgICAgIGZwcmludGYoZiwgImZyYW1lOiU0ZCBmbGFnczolNHggUTolNGQgUDolNGQgU2l6ZTolNWRcbiIsIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsICpmcmFtZV9mbGFncywgY3BpLT5jb21tb24uYmFzZV9xaW5kZXgsIGNwaS0+cHJvYl9za2lwX2ZhbHNlLCAqc2l6ZSk7CisKKyAgICAgICAgaWYgKGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgPT0gMSkKKyAgICAgICAgICAgIGZwcmludGYoZiwgInNraXBjb3VudDogJTRkIGZyYW1lc2l6ZTogJWRcbiIsIGNwaS0+c2tpcF90cnVlX2NvdW50ICwgKnNpemUpOworCisgICAgICAgIGZjbG9zZShmKTsKKyAgICB9CisKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX05FT04KKyNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCisgICAgaWYgKGNtLT5jcHVfY2FwcyAmIEhBU19ORU9OKQorI2VuZGlmCisgICAgeworICAgICAgICB2cDhfcG9wX25lb24oc3RvcmVfcmVnKTsKKyAgICB9CisjZW5kaWYKKworICAgIGNwaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHZwOF9nZXRfcHJldmlld19yYXdfZnJhbWUoVlA4X0NPTVAgKmNwaSwgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LCB2cDhfcHBmbGFnc190ICpmbGFncykKK3sKKyAgICBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHJldDsKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICAgICAgICBpZihjcGktPmJfbHBmX3J1bm5pbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbV93YWl0KCZjcGktPmhfZXZlbnRfZW5kX2xwZik7CisgICAgICAgICAgICBjcGktPmJfbHBmX3J1bm5pbmcgPSAwOworICAgICAgICB9CisjZW5kaWYKKworI2lmIENPTkZJR19QT1NUUFJPQworICAgICAgICByZXQgPSB2cDhfcG9zdF9wcm9jX2ZyYW1lKCZjcGktPmNvbW1vbiwgZGVzdCwgZmxhZ3MpOworI2Vsc2UKKworICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdG9fc2hvdykKKyAgICAgICAgeworICAgICAgICAgICAgKmRlc3QgPSAqY3BpLT5jb21tb24uZnJhbWVfdG9fc2hvdzsKKyAgICAgICAgICAgIGRlc3QtPnlfd2lkdGggPSBjcGktPmNvbW1vbi5XaWR0aDsKKyAgICAgICAgICAgIGRlc3QtPnlfaGVpZ2h0ID0gY3BpLT5jb21tb24uSGVpZ2h0OworICAgICAgICAgICAgZGVzdC0+dXZfaGVpZ2h0ID0gY3BpLT5jb21tb24uSGVpZ2h0IC8gMjsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorCisjZW5kaWYKKyAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworaW50IHZwOF9zZXRfcm9pbWFwKFZQOF9DT01QICpjcGksIHVuc2lnbmVkIGNoYXIgKm1hcCwgdW5zaWduZWQgaW50IHJvd3MsIHVuc2lnbmVkIGludCBjb2xzLCBpbnQgZGVsdGFfcVs0XSwgaW50IGRlbHRhX2xmWzRdLCB1bnNpZ25lZCBpbnQgdGhyZXNob2xkWzRdKQoreworICAgIHNpZ25lZCBjaGFyIGZlYXR1cmVfZGF0YVtNQl9MVkxfTUFYXVtNQVhfTUJfU0VHTUVOVFNdOworICAgIGludCBpbnRlcm5hbF9kZWx0YV9xW01BWF9NQl9TRUdNRU5UU107CisgICAgY29uc3QgaW50IHJhbmdlID0gNjM7CisgICAgaW50IGk7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN5Y2xpYyByZWZyZXNoIG1ldGhvZAorICAgIGlmICggY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2VuYWJsZWQgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBDaGVjayBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBtYXRjaAorICAgIGlmIChjcGktPmNvbW1vbi5tYl9yb3dzICE9IHJvd3MgfHwgY3BpLT5jb21tb24ubWJfY29scyAhPSBjb2xzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBSYW5nZSBjaGVjayB0aGUgZGVsdGEgUSB2YWx1ZXMgYW5kIGNvbnZlcnQgdGhlIGV4dGVybmFsIFEgcmFuZ2UgdmFsdWVzCisgICAgLy8gdG8gaW50ZXJuYWwgb25lcy4KKyAgICBpZiAoIChhYnMoZGVsdGFfcVswXSkgPiByYW5nZSkgfHwgKGFicyhkZWx0YV9xWzFdKSA+IHJhbmdlKSB8fAorICAgICAgICAgKGFicyhkZWx0YV9xWzJdKSA+IHJhbmdlKSB8fCAoYWJzKGRlbHRhX3FbM10pID4gcmFuZ2UpICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gUmFuZ2UgY2hlY2sgdGhlIGRlbHRhIGxmIHZhbHVlcworICAgIGlmICggKGFicyhkZWx0YV9sZlswXSkgPiByYW5nZSkgfHwgKGFicyhkZWx0YV9sZlsxXSkgPiByYW5nZSkgfHwKKyAgICAgICAgIChhYnMoZGVsdGFfbGZbMl0pID4gcmFuZ2UpIHx8IChhYnMoZGVsdGFfbGZbM10pID4gcmFuZ2UpICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCFtYXApCisgICAgeworICAgICAgICBkaXNhYmxlX3NlZ21lbnRhdGlvbihjcGkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBUcmFuc2xhdGUgdGhlIGV4dGVybmFsIGRlbHRhIHEgdmFsdWVzIHRvIGludGVybmFsIHZhbHVlcy4KKyAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgaSsrICkKKyAgICAgICAgaW50ZXJuYWxfZGVsdGFfcVtpXSA9CisgICAgICAgICAgICAoIGRlbHRhX3FbaV0gPj0gMCApID8gcV90cmFuc1tkZWx0YV9xW2ldXSA6IC1xX3RyYW5zWy1kZWx0YV9xW2ldXTsKKworICAgIC8qIFNldCB0aGUgc2VnbWVudGF0aW9uIE1hcCAqLworICAgIHNldF9zZWdtZW50YXRpb25fbWFwKGNwaSwgbWFwKTsKKworICAgIC8qIEFjdGl2YXRlIHNlZ21lbnRhdGlvbi4gKi8KKyAgICBlbmFibGVfc2VnbWVudGF0aW9uKGNwaSk7CisKKyAgICAvKiBTZXQgdXAgdGhlIHF1YW50IHNlZ21lbnQgZGF0YSAqLworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzBdID0gaW50ZXJuYWxfZGVsdGFfcVswXTsKKyAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVsxXSA9IGludGVybmFsX2RlbHRhX3FbMV07CisgICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMl0gPSBpbnRlcm5hbF9kZWx0YV9xWzJdOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzNdID0gaW50ZXJuYWxfZGVsdGFfcVszXTsKKworICAgIC8qIFNldCB1cCB0aGUgbG9vcCBzZWdtZW50IGRhdGEgcyAqLworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVswXSA9IGRlbHRhX2xmWzBdOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsxXSA9IGRlbHRhX2xmWzFdOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsyXSA9IGRlbHRhX2xmWzJdOworICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVszXSA9IGRlbHRhX2xmWzNdOworCisgICAgY3BpLT5zZWdtZW50X2VuY29kZV9icmVha291dFswXSA9IHRocmVzaG9sZFswXTsKKyAgICBjcGktPnNlZ21lbnRfZW5jb2RlX2JyZWFrb3V0WzFdID0gdGhyZXNob2xkWzFdOworICAgIGNwaS0+c2VnbWVudF9lbmNvZGVfYnJlYWtvdXRbMl0gPSB0aHJlc2hvbGRbMl07CisgICAgY3BpLT5zZWdtZW50X2VuY29kZV9icmVha291dFszXSA9IHRocmVzaG9sZFszXTsKKworICAgIC8qIEluaXRpYWxpc2UgdGhlIGZlYXR1cmUgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBzZXRfc2VnbWVudF9kYXRhKGNwaSwgJmZlYXR1cmVfZGF0YVswXVswXSwgU0VHTUVOVF9ERUxUQURBVEEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB2cDhfc2V0X2FjdGl2ZV9tYXAoVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgY2hhciAqbWFwLCB1bnNpZ25lZCBpbnQgcm93cywgdW5zaWduZWQgaW50IGNvbHMpCit7CisgICAgaWYgKHJvd3MgPT0gY3BpLT5jb21tb24ubWJfcm93cyAmJiBjb2xzID09IGNwaS0+Y29tbW9uLm1iX2NvbHMpCisgICAgeworICAgICAgICBpZiAobWFwKQorICAgICAgICB7CisgICAgICAgICAgICB2cHhfbWVtY3B5KGNwaS0+YWN0aXZlX21hcCwgbWFwLCByb3dzICogY29scyk7CisgICAgICAgICAgICBjcGktPmFjdGl2ZV9tYXBfZW5hYmxlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3BpLT5hY3RpdmVfbWFwX2VuYWJsZWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gLTEgOworICAgIH0KK30KKworaW50IHZwOF9zZXRfaW50ZXJuYWxfc2l6ZShWUDhfQ09NUCAqY3BpLCBWUFhfU0NBTElORyBob3Jpel9tb2RlLCBWUFhfU0NBTElORyB2ZXJ0X21vZGUpCit7CisgICAgaWYgKGhvcml6X21vZGUgPD0gT05FVFdPKQorICAgICAgICBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSA9IGhvcml6X21vZGU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAodmVydF9tb2RlIDw9IE9ORVRXTykKKyAgICAgICAgY3BpLT5jb21tb24udmVydF9zY2FsZSAgPSB2ZXJ0X21vZGU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworCisKK2ludCB2cDhfY2FsY19zc19lcnIoWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgVG90YWwgPSAwOworCisgICAgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlLT55X2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3QgPSBkZXN0LT55X2J1ZmZlcjsKKworICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgWSBwbGFuZSByYXcgYW5kIHJlY29uc3RydWN0aW9uIGRhdGEgc3VtbWluZworICAgICAqIChzcXVhcmUgZGlmZmVyZW5jZXMpCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZS0+eV9oZWlnaHQ7IGkgKz0gMTYpCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc291cmNlLT55X3dpZHRoOyBqICs9IDE2KQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3NlOworICAgICAgICAgICAgVG90YWwgKz0gdnA4X21zZTE2eDE2KHNyYyArIGosIHNvdXJjZS0+eV9zdHJpZGUsIGRzdCArIGosIGRlc3QtPnlfc3RyaWRlLCAmc3NlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyYyArPSAxNiAqIHNvdXJjZS0+eV9zdHJpZGU7CisgICAgICAgIGRzdCArPSAxNiAqIGRlc3QtPnlfc3RyaWRlOworICAgIH0KKworICAgIHJldHVybiBUb3RhbDsKK30KKworCitpbnQgdnA4X2dldF9xdWFudGl6ZXIoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICByZXR1cm4gY3BpLT5jb21tb24uYmFzZV9xaW5kZXg7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvb255eF9pbnQuaCBiL2xpYnZweC92cDgvZW5jb2Rlci9vbnl4X2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWM3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvb255eF9pbnQuaApAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgX19JTkNfVlA4X0lOVF9ICisjZGVmaW5lIF9fSU5DX1ZQOF9JTlRfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4LmgiCisjaW5jbHVkZSAidHJlZXdyaXRlci5oIgorI2luY2x1ZGUgInRva2VuaXplLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3ZhcmlhbmNlLmgiCisjaW5jbHVkZSAiZW5jb2RlbWIuaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vdGhyZWFkaW5nLmgiCisjaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgorI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2cHgvdnA4LmgiCisjaW5jbHVkZSAibWNvbXAuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKKyNpbmNsdWRlICJsb29rYWhlYWQuaCIKKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisjaW5jbHVkZSAidnA4L2VuY29kZXIvZGVub2lzaW5nLmgiCisjZW5kaWYKKworI2RlZmluZSBNSU5fR0ZfSU5URVJWQUwgICAgICAgICAgICAgNAorI2RlZmluZSBERUZBVUxUX0dGX0lOVEVSVkFMICAgICAgICAgNworCisjZGVmaW5lIEtFWV9GUkFNRV9DT05URVhUIDUKKworI2RlZmluZSBNQVhfTEFHX0JVRkZFUlMgKENPTkZJR19SRUFMVElNRV9PTkxZPyAxIDogMjUpCisKKyNkZWZpbmUgQUZfVEhSRVNIICAgMjUKKyNkZWZpbmUgQUZfVEhSRVNIMiAgMTAwCisjZGVmaW5lIEFSRl9ERUNBWV9USFJFU0ggMTIKKyNkZWZpbmUgTUFYX01PREVTIDIwCisKKyNkZWZpbmUgTUlOX1RIUkVTSE1VTFQgIDMyCisjZGVmaW5lIE1BWF9USFJFU0hNVUxUICA1MTIKKworI2RlZmluZSBHRl9aRVJPTVZfWkJJTl9CT09TVCAxMgorI2RlZmluZSBMRl9aRVJPTVZfWkJJTl9CT09TVCA2CisjZGVmaW5lIE1WX1pCSU5fQk9PU1QgICAgICAgIDQKKyNkZWZpbmUgWkJJTl9PUV9NQVggMTkyCisKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorI2RlZmluZSBWUDhfVEVNUE9SQUxfQUxUX1JFRiAxCisjZW5kaWYKKworI2RlZmluZSBNQVgoeCx5KSAoKCh4KT4oeSkpPyh4KTooeSkpCisjZGVmaW5lIE1JTih4LHkpICgoKHgpPCh5KSk/KHgpOih5KSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQga2ZfaW5kaWNhdGVkOworICAgIHVuc2lnbmVkIGludCBmcmFtZXNfc2luY2Vfa2V5OworICAgIHVuc2lnbmVkIGludCBmcmFtZXNfc2luY2VfZ29sZGVuOworICAgIGludCBmaWx0ZXJfbGV2ZWw7CisgICAgaW50IGZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7CisgICAgaW50IHJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbTUFYX1JFRl9GUkFNRVNdOworCisgICAgTVZfQ09OVEVYVCBtdmNbMl07CisgICAgaW50IG12Y29zdHNbMl1bTVZ2YWxzKzFdOworCisjaWZkZWYgTU9ERV9TVEFUUworICAgIGludCB5X21vZGVzWzVdOworICAgIGludCB1dl9tb2Rlc1s0XTsKKyAgICBpbnQgYl9tb2Rlc1sxMF07CisgICAgaW50IGludGVyX3lfbW9kZXNbMTBdOworICAgIGludCBpbnRlcl91dl9tb2Rlc1s0XTsKKyAgICBpbnQgaW50ZXJfYl9tb2Rlc1sxMF07CisjZW5kaWYKKworICAgIHZwOF9wcm9iIHltb2RlX3Byb2JbNF0sIHV2X21vZGVfcHJvYlszXTsgICAvKiBpbnRlcmZyYW1lIGludHJhIG1vZGUgcHJvYnMgKi8KKyAgICB2cDhfcHJvYiBrZl95bW9kZV9wcm9iWzRdLCBrZl91dl9tb2RlX3Byb2JbM107ICAgLyoga2V5ZnJhbWUgIiIgKi8KKworICAgIGludCB5bW9kZV9jb3VudFs1XSwgdXZfbW9kZV9jb3VudFs0XTsgIC8qIGludHJhIE1CIHR5cGUgY3RzIHRoaXMgZnJhbWUgKi8KKworICAgIGludCBjb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbTUFYX1JFRl9GUkFNRVNdOworCisgICAgaW50IHRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYTsKKyAgICBpbnQgbGFzdF9mcmFtZV9wZXJjZW50X2ludHJhOworCisKK30gQ09ESU5HX0NPTlRFWFQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZG91YmxlIGZyYW1lOworICAgIGRvdWJsZSBpbnRyYV9lcnJvcjsKKyAgICBkb3VibGUgY29kZWRfZXJyb3I7CisgICAgZG91YmxlIHNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnI7CisgICAgZG91YmxlIHBjbnRfaW50ZXI7CisgICAgZG91YmxlIHBjbnRfbW90aW9uOworICAgIGRvdWJsZSBwY250X3NlY29uZF9yZWY7CisgICAgZG91YmxlIHBjbnRfbmV1dHJhbDsKKyAgICBkb3VibGUgTVZyOworICAgIGRvdWJsZSBtdnJfYWJzOworICAgIGRvdWJsZSBNVmM7CisgICAgZG91YmxlIG12Y19hYnM7CisgICAgZG91YmxlIE1WcnY7CisgICAgZG91YmxlIE1WY3Y7CisgICAgZG91YmxlIG12X2luX291dF9jb3VudDsKKyAgICBkb3VibGUgbmV3X212X2NvdW50OworICAgIGRvdWJsZSBkdXJhdGlvbjsKKyAgICBkb3VibGUgY291bnQ7Cit9CitGSVJTVFBBU1NfU1RBVFM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGZyYW1lc19zb19mYXI7CisgICAgZG91YmxlIGZyYW1lX2ludHJhX2Vycm9yOworICAgIGRvdWJsZSBmcmFtZV9jb2RlZF9lcnJvcjsKKyAgICBkb3VibGUgZnJhbWVfcGNudF9pbnRlcjsKKyAgICBkb3VibGUgZnJhbWVfcGNudF9tb3Rpb247CisgICAgZG91YmxlIGZyYW1lX212cjsKKyAgICBkb3VibGUgZnJhbWVfbXZyX2FiczsKKyAgICBkb3VibGUgZnJhbWVfbXZjOworICAgIGRvdWJsZSBmcmFtZV9tdmNfYWJzOworCit9IE9ORVBBU1NfRlJBTUVTVEFUUzsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBUSFJfWkVSTzEgICAgICAgICAgPSAwLAorICAgIFRIUl9EQyAgICAgICAgICAgICA9IDEsCisKKyAgICBUSFJfTkVBUkVTVDEgICAgICAgPSAyLAorICAgIFRIUl9ORUFSMSAgICAgICAgICA9IDMsCisKKyAgICBUSFJfWkVSTzIgICAgICAgICAgPSA0LAorICAgIFRIUl9ORUFSRVNUMiAgICAgICA9IDUsCisKKyAgICBUSFJfWkVSTzMgICAgICAgICAgPSA2LAorICAgIFRIUl9ORUFSRVNUMyAgICAgICA9IDcsCisKKyAgICBUSFJfTkVBUjIgICAgICAgICAgPSA4LAorICAgIFRIUl9ORUFSMyAgICAgICAgICA9IDksCisKKyAgICBUSFJfVl9QUkVEICAgICAgICAgPSAxMCwKKyAgICBUSFJfSF9QUkVEICAgICAgICAgPSAxMSwKKyAgICBUSFJfVE0gICAgICAgICAgICAgPSAxMiwKKworICAgIFRIUl9ORVcxICAgICAgICAgICA9IDEzLAorICAgIFRIUl9ORVcyICAgICAgICAgICA9IDE0LAorICAgIFRIUl9ORVczICAgICAgICAgICA9IDE1LAorCisgICAgVEhSX1NQTElUMSAgICAgICAgID0gMTYsCisgICAgVEhSX1NQTElUMiAgICAgICAgID0gMTcsCisgICAgVEhSX1NQTElUMyAgICAgICAgID0gMTgsCisKKyAgICBUSFJfQl9QUkVEICAgICAgICAgPSAxOQorfQorVEhSX01PREVTOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBESUFNT05EID0gMCwKKyAgICBOU1RFUCA9IDEsCisgICAgSEVYID0gMgorfSBTRUFSQ0hfTUVUSE9EUzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgUkQ7CisgICAgU0VBUkNIX01FVEhPRFMgc2VhcmNoX21ldGhvZDsKKyAgICBpbnQgaW1wcm92ZWRfcXVhbnQ7CisgICAgaW50IGltcHJvdmVkX2RjdDsKKyAgICBpbnQgYXV0b19maWx0ZXI7CisgICAgaW50IHJlY29kZV9sb29wOworICAgIGludCBpdGVyYXRpdmVfc3ViX3BpeGVsOworICAgIGludCBoYWxmX3BpeGVsX3NlYXJjaDsKKyAgICBpbnQgcXVhcnRlcl9waXhlbF9zZWFyY2g7CisgICAgaW50IHRocmVzaF9tdWx0W01BWF9NT0RFU107CisgICAgaW50IG1heF9zdGVwX3NlYXJjaF9zdGVwczsKKyAgICBpbnQgZmlyc3Rfc3RlcDsKKyAgICBpbnQgb3B0aW1pemVfY29lZmZpY2llbnRzOworCisgICAgaW50IHVzZV9mYXN0cXVhbnRfZm9yX3BpY2s7CisgICAgaW50IG5vX3NraXBfYmxvY2s0eDRfc2VhcmNoOworICAgIGludCBpbXByb3ZlZF9tdl9wcmVkOworCit9IFNQRUVEX0ZFQVRVUkVTOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIE1BQ1JPQkxPQ0sgIG1iOworICAgIGludCBzZWdtZW50X2NvdW50c1tNQVhfTUJfU0VHTUVOVFNdOworICAgIGludCB0b3RhbHJhdGU7Cit9IE1CX1JPV19DT01QOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFRPS0VORVhUUkEgKnN0YXJ0OworICAgIFRPS0VORVhUUkEgKnN0b3A7Cit9IFRPS0VOTElTVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgaXRocmVhZDsKKyAgICB2b2lkICpwdHIxOworICAgIHZvaWQgKnB0cjI7Cit9IEVOQ09ERVRIUkVBRF9EQVRBOwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgaXRocmVhZDsKKyAgICB2b2lkICpwdHIxOworfSBMUEZUSFJFQURfREFUQTsKKworZW51bQoreworICAgIEJMT0NLXzE2WDgsCisgICAgQkxPQ0tfOFgxNiwKKyAgICBCTE9DS184WDgsCisgICAgQkxPQ0tfNFg0LAorICAgIEJMT0NLXzE2WDE2LAorICAgIEJMT0NLX01BWF9TRUdNRU5UUworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBMYXllciBjb25maWd1cmF0aW9uICovCisgICAgZG91YmxlIGZyYW1lX3JhdGU7CisgICAgaW50IHRhcmdldF9iYW5kd2lkdGg7CisKKyAgICAvKiBMYXllciBzcGVjaWZpYyBjb2RpbmcgcGFyYW1ldGVycyAqLworICAgIGludDY0X3Qgc3RhcnRpbmdfYnVmZmVyX2xldmVsOworICAgIGludDY0X3Qgb3B0aW1hbF9idWZmZXJfbGV2ZWw7CisgICAgaW50NjRfdCBtYXhpbXVtX2J1ZmZlcl9zaXplOworICAgIGludDY0X3Qgc3RhcnRpbmdfYnVmZmVyX2xldmVsX2luX21zOworICAgIGludDY0X3Qgb3B0aW1hbF9idWZmZXJfbGV2ZWxfaW5fbXM7CisgICAgaW50NjRfdCBtYXhpbXVtX2J1ZmZlcl9zaXplX2luX21zOworCisgICAgaW50IGF2Z19mcmFtZV9zaXplX2Zvcl9sYXllcjsKKworICAgIGludDY0X3QgYnVmZmVyX2xldmVsOworICAgIGludDY0X3QgYml0c19vZmZfdGFyZ2V0OworCisgICAgaW50NjRfdCB0b3RhbF9hY3R1YWxfYml0czsKKyAgICBpbnQgdG90YWxfdGFyZ2V0X3ZzX2FjdHVhbDsKKworICAgIGludCB3b3JzdF9xdWFsaXR5OworICAgIGludCBhY3RpdmVfd29yc3RfcXVhbGl0eTsKKyAgICBpbnQgYmVzdF9xdWFsaXR5OworICAgIGludCBhY3RpdmVfYmVzdF9xdWFsaXR5OworCisgICAgaW50IG5pX2F2X3FpOworICAgIGludCBuaV90b3RfcWk7CisgICAgaW50IG5pX2ZyYW1lczsKKyAgICBpbnQgYXZnX2ZyYW1lX3FpbmRleDsKKworICAgIGRvdWJsZSByYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGRvdWJsZSBrZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICBkb3VibGUgZ2ZfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKKworICAgIGludCB6YmluX292ZXJfcXVhbnQ7CisKKyAgICBpbnQgaW50ZXJfZnJhbWVfdGFyZ2V0OworICAgIGludDY0X3QgdG90YWxfYnl0ZV9jb3VudDsKKworICAgIGludCBmaWx0ZXJfbGV2ZWw7CisKKyAgICBpbnQgbGFzdF9mcmFtZV9wZXJjZW50X2ludHJhOworCisgICAgaW50IGNvdW50X21iX3JlZl9mcmFtZV91c2FnZVtNQVhfUkVGX0ZSQU1FU107CisKK30gTEFZRVJfQ09OVEVYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVlA4X0NPTVAKK3sKKworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkxcXVhbnRbUUlOREVYX1JBTkdFXVsxNl0pOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdW5zaWduZWQgY2hhciwgWTFxdWFudF9zaGlmdFtRSU5ERVhfUkFOR0VdWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgWTF6YmluW1FJTkRFWF9SQU5HRV1bMTZdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMXJvdW5kW1FJTkRFWF9SQU5HRV1bMTZdKTsKKworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkycXVhbnRbUUlOREVYX1JBTkdFXVsxNl0pOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdW5zaWduZWQgY2hhciwgWTJxdWFudF9zaGlmdFtRSU5ERVhfUkFOR0VdWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgWTJ6YmluW1FJTkRFWF9SQU5HRV1bMTZdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMnJvdW5kW1FJTkRFWF9SQU5HRV1bMTZdKTsKKworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFVWcXVhbnRbUUlOREVYX1JBTkdFXVsxNl0pOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdW5zaWduZWQgY2hhciwgVVZxdWFudF9zaGlmdFtRSU5ERVhfUkFOR0VdWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgVVZ6YmluW1FJTkRFWF9SQU5HRV1bMTZdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBVVnJvdW5kW1FJTkRFWF9SQU5HRV1bMTZdKTsKKworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIHpydW5femJpbl9ib29zdF95MVtRSU5ERVhfUkFOR0VdWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgenJ1bl96YmluX2Jvb3N0X3kyW1FJTkRFWF9SQU5HRV1bMTZdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCB6cnVuX3piaW5fYm9vc3RfdXZbUUlOREVYX1JBTkdFXVsxNl0pOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkxcXVhbnRfZmFzdFtRSU5ERVhfUkFOR0VdWzE2XSk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgWTJxdWFudF9mYXN0W1FJTkRFWF9SQU5HRV1bMTZdKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBVVnF1YW50X2Zhc3RbUUlOREVYX1JBTkdFXVsxNl0pOworCisKKyAgICBNQUNST0JMT0NLIG1iOworICAgIFZQOF9DT01NT04gY29tbW9uOworICAgIHZwOF93cml0ZXIgYmNbOV07IC8qIG9uZSBib29sY29kZXIgZm9yIGVhY2ggcGFydGl0aW9uICovCisKKyAgICBWUDhfQ09ORklHIG94Y2Y7CisKKyAgICBzdHJ1Y3QgbG9va2FoZWFkX2N0eCAgICAqbG9va2FoZWFkOworICAgIHN0cnVjdCBsb29rYWhlYWRfZW50cnkgICpzb3VyY2U7CisgICAgc3RydWN0IGxvb2thaGVhZF9lbnRyeSAgKmFsdF9yZWZfc291cmNlOworICAgIHN0cnVjdCBsb29rYWhlYWRfZW50cnkgICpsYXN0X3NvdXJjZTsKKworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqU291cmNlOworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqdW5fc2NhbGVkX3NvdXJjZTsKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgc2NhbGVkX3NvdXJjZTsKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmxhc3RfZnJhbWVfdW5zY2FsZWRfc291cmNlOworCisgICAgLyogZnJhbWUgaW4gc3JjX2J1ZmZlcnMgaGFzIGJlZW4gaWRlbnRpZmllZCB0byBiZSBlbmNvZGVkIGFzIGFuIGFsdCByZWYgKi8KKyAgICBpbnQgc291cmNlX2FsdF9yZWZfcGVuZGluZzsKKyAgICAvKiBhbiBhbHQgcmVmIGZyYW1lIGhhcyBiZWVuIGVuY29kZWQgYW5kIGlzIHVzYWJsZSAqLworICAgIGludCBzb3VyY2VfYWx0X3JlZl9hY3RpdmU7CisgICAgLyogc291cmNlIG9mIGZyYW1lIHRvIGVuY29kZSBpcyBhbiBleGFjdCBjb3B5IG9mIGFuIGFsdCByZWYgZnJhbWUgKi8KKyAgICBpbnQgaXNfc3JjX2ZyYW1lX2FsdF9yZWY7CisKKyAgICAvKiBnb2xkZW4gZnJhbWUgc2FtZSBhcyBsYXN0IGZyYW1lICggc2hvcnQgY2lyY3VpdCBnb2xkIHNlYXJjaGVzKSAqLworICAgIGludCBnb2xkX2lzX2xhc3Q7CisgICAgLyogQWx0IHJlZmVyZW5jZSBmcmFtZSBzYW1lIGFzIGxhc3QgKCBzaG9ydCBjaXJjdWl0IGFsdHJlZiBzZWFyY2gpICovCisgICAgaW50IGFsdF9pc19sYXN0OworICAgIC8qIGRvbid0IGRvIGJvdGggYWx0IGFuZCBnb2xkIHNlYXJjaCAoIGp1c3QgZG8gZ29sZCkuICovCisgICAgaW50IGdvbGRfaXNfYWx0OworCisgICAgWVYxMl9CVUZGRVJfQ09ORklHIHBpY2tfbGZfbHZsX2ZyYW1lOworCisgICAgVE9LRU5FWFRSQSAqdG9rOworICAgIHVuc2lnbmVkIGludCB0b2tfY291bnQ7CisKKworICAgIHVuc2lnbmVkIGludCBmcmFtZXNfc2luY2Vfa2V5OworICAgIHVuc2lnbmVkIGludCBrZXlfZnJhbWVfZnJlcXVlbmN5OworICAgIHVuc2lnbmVkIGludCB0aGlzX2tleV9mcmFtZV9mb3JjZWQ7CisgICAgdW5zaWduZWQgaW50IG5leHRfa2V5X2ZyYW1lX2ZvcmNlZDsKKworICAgIC8qIEFtYmllbnQgcmVjb25zdHJ1Y3Rpb24gZXJyIHRhcmdldCBmb3IgZm9yY2Uga2V5IGZyYW1lcyAqLworICAgIGludCBhbWJpZW50X2VycjsKKworICAgIHVuc2lnbmVkIGludCBtb2RlX2NoZWNrX2ZyZXFbTUFYX01PREVTXTsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZV90ZXN0X2hpdF9jb3VudHNbTUFYX01PREVTXTsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZV9jaG9zZW5fY291bnRzW01BWF9NT0RFU107CisgICAgdW5zaWduZWQgaW50IG1ic190ZXN0ZWRfc29fZmFyOworCisgICAgaW50IHJkX3RocmVzaF9tdWx0W01BWF9NT0RFU107CisgICAgaW50IHJkX2Jhc2VsaW5lX3RocmVzaFtNQVhfTU9ERVNdOworICAgIGludCByZF90aHJlc2hlc1tNQVhfTU9ERVNdOworCisgICAgaW50IFJETVVMVDsKKyAgICBpbnQgUkRESVYgOworCisgICAgQ09ESU5HX0NPTlRFWFQgY29kaW5nX2NvbnRleHQ7CisKKyAgICAvKiBSYXRlIHRhcmdldHRpbmcgdmFyaWFibGVzICovCisgICAgaW50NjRfdCBsYXN0X3ByZWRpY3Rpb25fZXJyb3I7CisgICAgaW50NjRfdCBsYXN0X2ludHJhX2Vycm9yOworCisgICAgaW50IHRoaXNfZnJhbWVfdGFyZ2V0OworICAgIGludCBwcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKKyAgICBpbnQgbGFzdF9xWzJdOyAgICAgICAgICAgICAgICAgICAvKiBTZXBhcmF0ZSB2YWx1ZXMgZm9yIEludHJhL0ludGVyICovCisKKyAgICBkb3VibGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICBkb3VibGUga2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7CisgICAgZG91YmxlIGdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7CisKKyAgICAvKiBDb3VudCBkb3duIHRpbGwgbmV4dCBHRiAqLworICAgIGludCBmcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOworCisgICAgLyogR0YgaW50ZXJ2YWwgY2hvc2VuIHdoZW4gd2UgY29kZWQgdGhlIGxhc3QgR0YgKi8KKyAgICBpbnQgY3VycmVudF9nZl9pbnRlcnZhbDsKKworICAgIC8qIFRvdGFsIGJpdHMgb3ZlcnNwZW50IGJlY2FzdWUgb2YgR0YgYm9vc3QgKGN1bXVsYXRpdmUpICovCisgICAgaW50IGdmX292ZXJzcGVuZF9iaXRzOworCisgICAgLyogVXNlZCBpbiB0aGUgZmV3IGZyYW1lcyBmb2xsb3dpbmcgYSBHRiB0byByZWNvdmVyIHRoZSBleHRyYSBiaXRzCisgICAgICogc3BlbnQgaW4gdGhhdCBHRgorICAgICAqLworICAgIGludCBub25fZ2ZfYml0cmF0ZV9hZGp1c3RtZW50OworCisgICAgLyogRXh0cmEgYml0cyBzcGVudCBvbiBrZXkgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSByZWNvdmVyZWQgKi8KKyAgICBpbnQga2Zfb3ZlcnNwZW5kX2JpdHM7CisKKyAgICAvKiBDdXJyZW50IG51bWJlciBvZiBiaXQgcyB0byB0cnkgYW5kIHJlY292ZXIgb24gZWFjaCBpbnRlciBmcmFtZS4gKi8KKyAgICBpbnQga2ZfYml0cmF0ZV9hZGp1c3RtZW50OworICAgIGludCBtYXhfZ2ZfaW50ZXJ2YWw7CisgICAgaW50IGJhc2VsaW5lX2dmX2ludGVydmFsOworICAgIGludCBhY3RpdmVfYXJucl9mcmFtZXM7CisKKyAgICBpbnQ2NF90IGtleV9mcmFtZV9jb3VudDsKKyAgICBpbnQgcHJpb3Jfa2V5X2ZyYW1lX2Rpc3RhbmNlW0tFWV9GUkFNRV9DT05URVhUXTsKKyAgICAvKiBDdXJyZW50IHNlY3Rpb24gcGVyIGZyYW1lIGJhbmR3aWR0aCB0YXJnZXQgKi8KKyAgICBpbnQgcGVyX2ZyYW1lX2JhbmR3aWR0aDsKKyAgICAvKiBBdmVyYWdlIGZyYW1lIHNpemUgdGFyZ2V0IGZvciBjbGlwICovCisgICAgaW50IGF2X3Blcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgLyogTWluaW11bSBhbGxvY2F0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFueSBmcmFtZSAqLworICAgIGludCBtaW5fZnJhbWVfYmFuZHdpZHRoOworICAgIGludCBpbnRlcl9mcmFtZV90YXJnZXQ7CisgICAgZG91YmxlIG91dHB1dF9mcmFtZV9yYXRlOworICAgIGludDY0X3QgbGFzdF90aW1lX3N0YW1wX3NlZW47CisgICAgaW50NjRfdCBsYXN0X2VuZF90aW1lX3N0YW1wX3NlZW47CisgICAgaW50NjRfdCBmaXJzdF90aW1lX3N0YW1wX2V2ZXI7CisKKyAgICBpbnQgbmlfYXZfcWk7CisgICAgaW50IG5pX3RvdF9xaTsKKyAgICBpbnQgbmlfZnJhbWVzOworICAgIGludCBhdmdfZnJhbWVfcWluZGV4OworCisgICAgaW50IHpiaW5fb3Zlcl9xdWFudDsKKyAgICBpbnQgemJpbl9tb2RlX2Jvb3N0OworICAgIGludCB6YmluX21vZGVfYm9vc3RfZW5hYmxlZDsKKyAgICBpbnQgbGFzdF96YmluX292ZXJfcXVhbnQ7CisgICAgaW50IGxhc3RfemJpbl9tb2RlX2Jvb3N0OworCisgICAgaW50NjRfdCB0b3RhbF9ieXRlX2NvdW50OworCisgICAgaW50IGJ1ZmZlcmVkX21vZGU7CisKKyAgICBkb3VibGUgZnJhbWVfcmF0ZTsKKyAgICBkb3VibGUgcmVmX2ZyYW1lX3JhdGU7CisgICAgaW50NjRfdCBidWZmZXJfbGV2ZWw7CisgICAgaW50NjRfdCBiaXRzX29mZl90YXJnZXQ7CisKKyAgICBpbnQgcm9sbGluZ190YXJnZXRfYml0czsKKyAgICBpbnQgcm9sbGluZ19hY3R1YWxfYml0czsKKworICAgIGludCBsb25nX3JvbGxpbmdfdGFyZ2V0X2JpdHM7CisgICAgaW50IGxvbmdfcm9sbGluZ19hY3R1YWxfYml0czsKKworICAgIGludDY0X3QgdG90YWxfYWN0dWFsX2JpdHM7CisgICAgaW50IHRvdGFsX3RhcmdldF92c19hY3R1YWw7IC8qIGRlYnVnIHN0YXRzICovCisKKyAgICBpbnQgd29yc3RfcXVhbGl0eTsKKyAgICBpbnQgYWN0aXZlX3dvcnN0X3F1YWxpdHk7CisgICAgaW50IGJlc3RfcXVhbGl0eTsKKyAgICBpbnQgYWN0aXZlX2Jlc3RfcXVhbGl0eTsKKworICAgIGludCBjcV90YXJnZXRfcXVhbGl0eTsKKworICAgIGludCBkcm9wX2ZyYW1lc19hbGxvd2VkOyAvKiBBcmUgd2UgcGVybWl0dGVkIHRvIGRyb3AgZnJhbWVzPyAqLworICAgIGludCBkcm9wX2ZyYW1lOyAgICAgICAgICAvKiBEcm9wIHRoaXMgZnJhbWU/ICovCisKKyAgICB2cDhfcHJvYiBmcmFtZV9jb2VmX3Byb2JzIFtCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFtFTlRST1BZX05PREVTXTsKKyAgICBjaGFyIHVwZGF0ZV9wcm9icyBbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbRU5UUk9QWV9OT0RFU107CisKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfYnJhbmNoX2N0IFtCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFtFTlRST1BZX05PREVTXVsyXTsKKworICAgIGludCBnZnVfYm9vc3Q7CisgICAgaW50IGtmX2Jvb3N0OworICAgIGludCBsYXN0X2Jvb3N0OworCisgICAgaW50IHRhcmdldF9iYW5kd2lkdGg7CisgICAgc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAgKm91dHB1dF9wa3RfbGlzdDsKKworI2lmIDAKKyAgICAvKiBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGFuZCBvbmUgcGFzcyAqLworICAgIE9ORVBBU1NfRlJBTUVTVEFUUyBvbmVfcGFzc19mcmFtZV9zdGF0c1tNQVhfTEFHX0JVRkZFUlNdOworICAgIGludCBvbmVfcGFzc19mcmFtZV9pbmRleDsKKyNlbmRpZgorCisgICAgaW50IGRlY2ltYXRpb25fZmFjdG9yOworICAgIGludCBkZWNpbWF0aW9uX2NvdW50OworCisgICAgLyogZm9yIHJlYWwgdGltZSBlbmNvZGluZyAqLworICAgIGludCBhdmdfZW5jb2RlX3RpbWU7ICAgICAvKiBtaWNyb3NlY29uZCAqLworICAgIGludCBhdmdfcGlja19tb2RlX3RpbWU7ICAvKiBtaWNyb3NlY29uZCAqLworICAgIGludCBTcGVlZDsKKyAgICBpbnQgY29tcHJlc3Nvcl9zcGVlZDsKKworICAgIGludCBpbnRlcnF1YW50aXplcjsKKyAgICBpbnQgYXV0b19nb2xkOworICAgIGludCBhdXRvX2FkanVzdF9nb2xkX3F1YW50aXplcjsKKyAgICBpbnQgYXV0b193b3JzdF9xOworICAgIGludCBjcHVfdXNlZDsKKyAgICBpbnQgcGFzczsKKworCisgICAgaW50IHByb2JfaW50cmFfY29kZWQ7CisgICAgaW50IHByb2JfbGFzdF9jb2RlZDsKKyAgICBpbnQgcHJvYl9nZl9jb2RlZDsKKyAgICBpbnQgcHJvYl9za2lwX2ZhbHNlOworICAgIGludCBsYXN0X3NraXBfZmFsc2VfcHJvYnNbM107CisgICAgaW50IGxhc3Rfc2tpcF9wcm9ic19xWzNdOworICAgIGludCByZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW01BWF9SRUZfRlJBTUVTXTsKKworICAgIGludCBjb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbTUFYX1JFRl9GUkFNRVNdOworICAgIGludCB0aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmE7CisgICAgaW50IGxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYTsKKworICAgIGludCByZWZfZnJhbWVfZmxhZ3M7CisKKyAgICBTUEVFRF9GRUFUVVJFUyBzZjsKKyAgICBpbnQgZXJyb3JfYmluc1sxMDI0XTsKKworICAgIC8qIERhdGEgdXNlZCBmb3IgcmVhbCB0aW1lIGNvbmZlcmVuY2luZyBtb2RlIHRvIGhlbHAgZGV0ZXJtaW5lIGlmIGl0CisgICAgICogd291bGQgYmUgZ29vZCB0byB1cGRhdGUgdGhlIGdmCisgICAgICovCisgICAgaW50IGludGVyX3p6X2NvdW50OworICAgIC8qIENvdW50IFpFUk9NViBvbiBhbGwgcmVmZXJlbmNlIGZyYW1lcy4gKi8KKyAgICBpbnQgemVyb212X2NvdW50OworICAgIGludCBsZl96ZXJvbXZfcGN0OworICAgIGludCBnZl9iYWRfY291bnQ7CisgICAgaW50IGdmX3VwZGF0ZV9yZWNvbW1lbmRlZDsKKworICAgIHVuc2lnbmVkIGNoYXIgKnNlZ21lbnRhdGlvbl9tYXA7CisgICAgc2lnbmVkIGNoYXIgc2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX01BWF1bTUFYX01CX1NFR01FTlRTXTsKKyAgICBpbnQgIHNlZ21lbnRfZW5jb2RlX2JyZWFrb3V0W01BWF9NQl9TRUdNRU5UU107CisKKyAgICB1bnNpZ25lZCBjaGFyICphY3RpdmVfbWFwOworICAgIHVuc2lnbmVkIGludCBhY3RpdmVfbWFwX2VuYWJsZWQ7CisKKyAgICAvKiBWaWRlbyBjb25mZXJlbmNpbmcgY3ljbGljIHJlZnJlc2ggbW9kZSBmbGFncy4gVGhpcyBpcyBhIG1vZGUKKyAgICAgKiBkZXNpZ25lZCB0byBjbGVhbiB1cCB0aGUgYmFja2dyb3VuZCBvdmVyIHRpbWUgaW4gbGl2ZSBlbmNvZGluZworICAgICAqIHNjZW5hcmlvdXMuIEl0IHVzZXMgc2VnbWVudGF0aW9uLgorICAgICAqLworICAgIGludCBjeWNsaWNfcmVmcmVzaF9tb2RlX2VuYWJsZWQ7CisgICAgaW50IGN5Y2xpY19yZWZyZXNoX21vZGVfbWF4X21ic19wZXJmcmFtZTsKKyAgICBpbnQgY3ljbGljX3JlZnJlc2hfbW9kZV9pbmRleDsKKyAgICBpbnQgY3ljbGljX3JlZnJlc2hfcTsKKyAgICBzaWduZWQgY2hhciAqY3ljbGljX3JlZnJlc2hfbWFwOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgLyogbXVsdGl0aHJlYWQgZGF0YSAqLworICAgIGludCAqIG10X2N1cnJlbnRfbWJfY29sOworICAgIGludCBtdF9zeW5jX3JhbmdlOworICAgIGludCBiX211bHRpX3RocmVhZGVkOworICAgIGludCBlbmNvZGluZ190aHJlYWRfY291bnQ7CisgICAgaW50IGJfbHBmX3J1bm5pbmc7CisKKyAgICBwdGhyZWFkX3QgKmhfZW5jb2RpbmdfdGhyZWFkOworICAgIHB0aHJlYWRfdCBoX2ZpbHRlcl90aHJlYWQ7CisKKyAgICBNQl9ST1dfQ09NUCAqbWJfcm93X2VpOworICAgIEVOQ09ERVRIUkVBRF9EQVRBICplbl90aHJlYWRfZGF0YTsKKyAgICBMUEZUSFJFQURfREFUQSBscGZfdGhyZWFkX2RhdGE7CisKKyAgICAvKiBldmVudHMgKi8KKyAgICBzZW1fdCAqaF9ldmVudF9zdGFydF9lbmNvZGluZzsKKyAgICBzZW1fdCBoX2V2ZW50X2VuZF9lbmNvZGluZzsKKyAgICBzZW1fdCBoX2V2ZW50X3N0YXJ0X2xwZjsKKyAgICBzZW1fdCBoX2V2ZW50X2VuZF9scGY7CisjZW5kaWYKKworICAgIFRPS0VOTElTVCAqdHBsaXN0OworICAgIHVuc2lnbmVkIGludCBwYXJ0aXRpb25fc3pbTUFYX1BBUlRJVElPTlNdOworICAgIHVuc2lnbmVkIGNoYXIgKnBhcnRpdGlvbl9kW01BWF9QQVJUSVRJT05TXTsKKyAgICB1bnNpZ25lZCBjaGFyICpwYXJ0aXRpb25fZF9lbmRbTUFYX1BBUlRJVElPTlNdOworCisKKyAgICBmcmFjdGlvbmFsX212X3N0ZXBfZnAgKmZpbmRfZnJhY3Rpb25hbF9tdl9zdGVwOworICAgIHZwOF9mdWxsX3NlYXJjaF9mbl90IGZ1bGxfc2VhcmNoX3NhZDsKKyAgICB2cDhfcmVmaW5pbmdfc2VhcmNoX2ZuX3QgcmVmaW5pbmdfc2VhcmNoX3NhZDsKKyAgICB2cDhfZGlhbW9uZF9zZWFyY2hfZm5fdCBkaWFtb25kX3NlYXJjaF9zYWQ7CisgICAgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90IGZuX3B0cltCTE9DS19NQVhfU0VHTUVOVFNdOworICAgIHVpbnQ2NF90IHRpbWVfcmVjZWl2ZV9kYXRhOworICAgIHVpbnQ2NF90IHRpbWVfY29tcHJlc3NfZGF0YTsKKyAgICB1aW50NjRfdCB0aW1lX3BpY2tfbHBmOworICAgIHVpbnQ2NF90IHRpbWVfZW5jb2RlX21iX3JvdzsKKworICAgIGludCBiYXNlX3NraXBfZmFsc2VfcHJvYlsxMjhdOworCisgICAgRlJBTUVfQ09OVEVYVCBsZmNfbjsgLyogbGFzdCBmcmFtZSBlbnRyb3B5ICovCisgICAgRlJBTUVfQ09OVEVYVCBsZmNfYTsgLyogbGFzdCBhbHQgcmVmIGVudHJvcHkgKi8KKyAgICBGUkFNRV9DT05URVhUIGxmY19nOyAvKiBsYXN0IGdvbGQgcmVmIGVudHJvcHkgKi8KKworCisgICAgc3RydWN0IHR3b3Bhc3NfcmMKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2ludHJhX3JhdGluZzsKKyAgICAgICAgZG91YmxlIHNlY3Rpb25fbWF4X3FmYWN0b3I7CisgICAgICAgIHVuc2lnbmVkIGludCBuZXh0X2lpcmF0aW87CisgICAgICAgIHVuc2lnbmVkIGludCB0aGlzX2lpcmF0aW87CisgICAgICAgIEZJUlNUUEFTU19TVEFUUyB0b3RhbF9zdGF0czsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTIHRoaXNfZnJhbWVfc3RhdHM7CisgICAgICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhdHNfaW4sICpzdGF0c19pbl9lbmQsICpzdGF0c19pbl9zdGFydDsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTIHRvdGFsX2xlZnRfc3RhdHM7CisgICAgICAgIGludCBmaXJzdF9wYXNzX2RvbmU7CisgICAgICAgIGludDY0X3QgYml0c19sZWZ0OworICAgICAgICBpbnQ2NF90IGNsaXBfYml0c190b3RhbDsKKyAgICAgICAgZG91YmxlIGF2Z19paXJhdGlvOworICAgICAgICBkb3VibGUgbW9kaWZpZWRfZXJyb3JfdG90YWw7CisgICAgICAgIGRvdWJsZSBtb2RpZmllZF9lcnJvcl91c2VkOworICAgICAgICBkb3VibGUgbW9kaWZpZWRfZXJyb3JfbGVmdDsKKyAgICAgICAgZG91YmxlIGtmX2ludHJhX2Vycl9taW47CisgICAgICAgIGRvdWJsZSBnZl9pbnRyYV9lcnJfbWluOworICAgICAgICBpbnQgZnJhbWVzX3RvX2tleTsKKyAgICAgICAgaW50IG1heHFfbWF4X2xpbWl0OworICAgICAgICBpbnQgbWF4cV9taW5fbGltaXQ7CisgICAgICAgIGludCBnZl9kZWNheV9yYXRlOworICAgICAgICBpbnQgc3RhdGljX3NjZW5lX21heF9nZl9pbnRlcnZhbDsKKyAgICAgICAgaW50IGtmX2JpdHM7CisgICAgICAgIC8qIFJlbWFpbmluZyBlcnJvciBmcm9tIHVuY29kZWQgZnJhbWVzIGluIGEgZ2YgZ3JvdXAuICovCisgICAgICAgIGludCBnZl9ncm91cF9lcnJvcl9sZWZ0OworICAgICAgICAvKiBQcm9qZWN0ZWQgdG90YWwgYml0cyBhdmFpbGFibGUgZm9yIGEga2V5IGZyYW1lIGdyb3VwIG9mIGZyYW1lcyAqLworICAgICAgICBpbnQ2NF90IGtmX2dyb3VwX2JpdHM7CisgICAgICAgIC8qIEVycm9yIHNjb3JlIG9mIGZyYW1lcyBzdGlsbCB0byBiZSBjb2RlZCBpbiBrZiBncm91cCAqLworICAgICAgICBpbnQ2NF90IGtmX2dyb3VwX2Vycm9yX2xlZnQ7CisgICAgICAgIC8qIFByb2plY3RlZCBCaXRzIGF2YWlsYWJsZSBmb3IgYSBncm91cCBpbmNsdWRpbmcgMSBHRiBvciBBUkYgKi8KKyAgICAgICAgaW50IGdmX2dyb3VwX2JpdHM7CisgICAgICAgIC8qIEJpdHMgZm9yIHRoZSBnb2xkZW4gZnJhbWUgb3IgQVJGICovCisgICAgICAgIGludCBnZl9iaXRzOworICAgICAgICBpbnQgYWx0X2V4dHJhX2JpdHM7CisgICAgICAgIGRvdWJsZSBlc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICB9IHR3b3Bhc3M7CisKKyNpZiBWUDhfVEVNUE9SQUxfQUxUX1JFRgorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBhbHRfcmVmX2J1ZmZlcjsKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmZyYW1lc1tNQVhfTEFHX0JVRkZFUlNdOworICAgIGludCBmaXhlZF9kaXZpZGVbNTEyXTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0lOVEVSTkFMX1NUQVRTCisgICAgaW50ICAgIGNvdW50OworICAgIGRvdWJsZSB0b3RhbF95OworICAgIGRvdWJsZSB0b3RhbF91OworICAgIGRvdWJsZSB0b3RhbF92OworICAgIGRvdWJsZSB0b3RhbCA7CisgICAgZG91YmxlIHRvdGFsX3NxX2Vycm9yOworICAgIGRvdWJsZSB0b3RhbHBfeTsKKyAgICBkb3VibGUgdG90YWxwX3U7CisgICAgZG91YmxlIHRvdGFscF92OworICAgIGRvdWJsZSB0b3RhbHA7CisgICAgZG91YmxlIHRvdGFsX3NxX2Vycm9yMjsKKyAgICBpbnQgICAgYnl0ZXM7CisgICAgZG91YmxlIHN1bW1lZF9xdWFsaXR5OworICAgIGRvdWJsZSBzdW1tZWRfd2VpZ2h0czsKKyAgICB1bnNpZ25lZCBpbnQgdG90X3JlY29kZV9oaXRzOworCisKKyAgICBkb3VibGUgdG90YWxfc3NpbWdfeTsKKyAgICBkb3VibGUgdG90YWxfc3NpbWdfdTsKKyAgICBkb3VibGUgdG90YWxfc3NpbWdfdjsKKyAgICBkb3VibGUgdG90YWxfc3NpbWdfYWxsOworCisgICAgaW50IGJfY2FsY3VsYXRlX3NzaW1nOworI2VuZGlmCisgICAgaW50IGJfY2FsY3VsYXRlX3BzbnI7CisKKyAgICAvKiBQZXIgTUIgYWN0aXZpdHkgbWVhc3VyZW1lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWN0aXZpdHlfYXZnOworICAgIHVuc2lnbmVkIGludCAqIG1iX2FjdGl2aXR5X21hcDsKKworICAgIC8qIFJlY29yZCBvZiB3aGljaCBNQnMgc3RpbGwgcmVmZXIgdG8gbGFzdCBnb2xkZW4gZnJhbWUgZWl0aGVyCisgICAgICogZGlyZWN0bHkgb3IgdGhyb3VnaCAwLDAKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpnZl9hY3RpdmVfZmxhZ3M7CisgICAgaW50IGdmX2FjdGl2ZV9jb3VudDsKKworICAgIGludCBvdXRwdXRfcGFydGl0aW9uOworCisgICAgLyogU3RvcmUgbGFzdCBmcmFtZSdzIE1WIGluZm8gZm9yIG5leHQgZnJhbWUgTVYgcHJlZGljdGlvbiAqLworICAgIGludF9tdiAqbGZtdjsKKyAgICBpbnQgKmxmX3JlZl9mcmFtZV9zaWduX2JpYXM7CisgICAgaW50ICpsZl9yZWZfZnJhbWU7CisKKyAgICAvKiBmb3JjZSBuZXh0IGZyYW1lIHRvIGludHJhIHdoZW4ga2ZfYXV0byBzYXlzIHNvICovCisgICAgaW50IGZvcmNlX25leHRfZnJhbWVfaW50cmE7CisKKyAgICBpbnQgZHJvcHBhYmxlOworCisjaWYgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORworICAgIFZQOF9ERU5PSVNFUiBkZW5vaXNlcjsKKyNlbmRpZgorCisgICAgLyogQ29kaW5nIGxheWVyIHN0YXRlIHZhcmlhYmxlcyAqLworICAgIHVuc2lnbmVkIGludCBjdXJyZW50X2xheWVyOworICAgIExBWUVSX0NPTlRFWFQgbGF5ZXJfY29udGV4dFtWUFhfVFNfTUFYX0xBWUVSU107CisKKyAgICBpbnQ2NF90IGZyYW1lc19pbl9sYXllcltWUFhfVFNfTUFYX0xBWUVSU107CisgICAgaW50NjRfdCBieXRlc19pbl9sYXllcltWUFhfVFNfTUFYX0xBWUVSU107CisgICAgZG91YmxlIHN1bV9wc25yW1ZQWF9UU19NQVhfTEFZRVJTXTsKKyAgICBkb3VibGUgc3VtX3BzbnJfcFtWUFhfVFNfTUFYX0xBWUVSU107CisgICAgZG91YmxlIHRvdGFsX2Vycm9yMltWUFhfVFNfTUFYX0xBWUVSU107CisgICAgZG91YmxlIHRvdGFsX2Vycm9yMl9wW1ZQWF9UU19NQVhfTEFZRVJTXTsKKyAgICBkb3VibGUgc3VtX3NzaW1bVlBYX1RTX01BWF9MQVlFUlNdOworICAgIGRvdWJsZSBzdW1fd2VpZ2h0c1tWUFhfVFNfTUFYX0xBWUVSU107CisKKyAgICBkb3VibGUgdG90YWxfc3NpbWdfeV9pbl9sYXllcltWUFhfVFNfTUFYX0xBWUVSU107CisgICAgZG91YmxlIHRvdGFsX3NzaW1nX3VfaW5fbGF5ZXJbVlBYX1RTX01BWF9MQVlFUlNdOworICAgIGRvdWJsZSB0b3RhbF9zc2ltZ192X2luX2xheWVyW1ZQWF9UU19NQVhfTEFZRVJTXTsKKyAgICBkb3VibGUgdG90YWxfc3NpbWdfYWxsX2luX2xheWVyW1ZQWF9UU19NQVhfTEFZRVJTXTsKKworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAvKiBOdW1iZXIgb2YgTUJzIHBlciByb3cgYXQgbG93ZXItcmVzb2x1dGlvbiBsZXZlbCAqLworICAgIGludCAgICBtcl9sb3dfcmVzX21iX2NvbHM7CisgICAgLyogSW5kaWNhdGUgaWYgbG93ZXItcmVzIG12IGluZm8gaXMgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgY2hhciAgbXJfbG93X3Jlc19tdl9hdmFpbDsKKyAgICAvKiBUaGUgZnJhbWUgbnVtYmVyIG9mIGVhY2ggcmVmZXJlbmNlIGZyYW1lcyAqLworICAgIHVuc2lnbmVkIGludCBjdXJyZW50X3JlZl9mcmFtZXNbTUFYX1JFRl9GUkFNRVNdOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgcmRfY29zdHNfc3RydWN0CisgICAgeworICAgICAgICBpbnQgbXZjb3N0c1syXVtNVnZhbHMrMV07CisgICAgICAgIGludCBtdnNhZGNvc3RzWzJdW01WZnB2YWxzKzFdOworICAgICAgICBpbnQgbWJtb2RlX2Nvc3RbMl1bTUJfTU9ERV9DT1VOVF07CisgICAgICAgIGludCBpbnRyYV91dl9tb2RlX2Nvc3RbMl1bTUJfTU9ERV9DT1VOVF07CisgICAgICAgIGludCBibW9kZV9jb3N0c1sxMF1bMTBdWzEwXTsKKyAgICAgICAgaW50IGludGVyX2Jtb2RlX2Nvc3RzW0JfTU9ERV9DT1VOVF07CisgICAgICAgIGludCB0b2tlbl9jb3N0c1tCTE9DS19UWVBFU11bQ09FRl9CQU5EU10KKyAgICAgICAgW1BSRVZfQ09FRl9DT05URVhUU11bTUFYX0VOVFJPUFlfVE9LRU5TXTsKKyAgICB9IHJkX2Nvc3RzOworfSBWUDhfQ09NUDsKKwordm9pZCBjb250cm9sX2RhdGFfcmF0ZShWUDhfQ09NUCAqY3BpKTsKKwordm9pZCB2cDhfcGFja19iaXRzdHJlYW0oVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciAqZGVzdF9lbmQsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCitpbnQgcmRfY29zdF9pbnRyYV9tYihNQUNST0JMT0NLRCAqeCk7CisKK3ZvaWQgdnA4X3Rva2VuaXplX21iKFZQOF9DT01QICosIE1BQ1JPQkxPQ0sgKiwgVE9LRU5FWFRSQSAqKik7CisKK3ZvaWQgdnA4X3NldF9zcGVlZF9mZWF0dXJlcyhWUDhfQ09NUCAqY3BpKTsKKworI2lmIENPTkZJR19ERUJVRworI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAorICAgICAgICBsdmFsID0gKGV4cHIpOyBcCisgICAgICAgIGlmKCFsdmFsKSBcCisgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCIgYXQgJXM6JWQiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sX19MSU5FX18pO1wKKyAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAorICAgICAgICBsdmFsID0gKGV4cHIpOyBcCisgICAgICAgIGlmKCFsdmFsKSBcCisgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCk7XAorICAgIH0gd2hpbGUoMCkKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvcGlja2ludGVyLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvcGlja2ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwOWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9waWNraW50ZXIuYwpAQCAtMCwwICsxLDEyOTUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAibW9kZWNvc3RzLmgiCisjaW5jbHVkZSAiZW5jb2RlaW50cmEuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCisjaW5jbHVkZSAicGlja2ludGVyLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9maW5kbmVhcm12LmgiCisjaW5jbHVkZSAiZW5jb2RlbWIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50ZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3ZhcmlhbmNlLmgiCisjaW5jbHVkZSAibWNvbXAuaCIKKyNpbmNsdWRlICJyZG9wdC5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2lmIENPTkZJR19URU1QT1JBTF9ERU5PSVNJTkcKKyNpbmNsdWRlICJkZW5vaXNpbmcuaCIKKyNlbmRpZgorCitleHRlcm4gaW50IFZQOF9VVlNTRShNQUNST0JMT0NLICp4KTsKKworI2lmZGVmIFNQRUVEU1RBVFMKK2V4dGVybiB1bnNpZ25lZCBpbnQgY250X3BtOworI2VuZGlmCisKK2V4dGVybiBjb25zdCBpbnQgdnA4X3JlZl9mcmFtZV9vcmRlcltNQVhfTU9ERVNdOworZXh0ZXJuIGNvbnN0IE1CX1BSRURJQ1RJT05fTU9ERSB2cDhfbW9kZV9vcmRlcltNQVhfTU9ERVNdOworCitleHRlcm4gaW50IHZwOF9jb3N0X212X3JlZihNQl9QUkVESUNUSU9OX01PREUgbSwgY29uc3QgaW50IG5lYXJfbXZfcmVmX2N0WzRdKTsKKworCitpbnQgdnA4X3NraXBfZnJhY3Rpb25hbF9tdl9zdGVwKE1BQ1JPQkxPQ0sgKm1iLCBCTE9DSyAqYiwgQkxPQ0tEICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfbXYgKmJlc3RtdiwgaW50X212ICpyZWZfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9wZXJfYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptdmNvc3RbMl0sIGludCAqZGlzdG9ydGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzc2UpCit7CisgICAgKHZvaWQpIGI7CisgICAgKHZvaWQpIGQ7CisgICAgKHZvaWQpIHJlZl9tdjsKKyAgICAodm9pZCkgZXJyb3JfcGVyX2JpdDsKKyAgICAodm9pZCkgdmZwOworICAgICh2b2lkKSBtdmNvc3Q7CisgICAgKHZvaWQpIGRpc3RvcnRpb247CisgICAgKHZvaWQpIHNzZTsKKyAgICBiZXN0bXYtPmFzX212LnJvdyA8PD0gMzsKKyAgICBiZXN0bXYtPmFzX212LmNvbCA8PD0gMzsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgdnA4X2dldF9pbnRlcl9tYnByZWRfZXJyb3IoTUFDUk9CTE9DSyAqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICp2ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X212IHRoaXNfbXYpCit7CisKKyAgICBCTE9DSyAqYiA9ICZtYi0+YmxvY2tbMF07CisgICAgQkxPQ0tEICpkID0gJm1iLT5lX21iZC5ibG9ja1swXTsKKyAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKKyAgICBpbnQgd2hhdF9zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOworICAgIGludCBwcmVfc3RyaWRlID0gbWItPmVfbWJkLnByZS55X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICppbl93aGF0ID0gbWItPmVfbWJkLnByZS55X2J1ZmZlciArIGQtPm9mZnNldCA7CisgICAgaW50IGluX3doYXRfc3RyaWRlID0gcHJlX3N0cmlkZTsKKyAgICBpbnQgeG9mZnNldCA9IHRoaXNfbXYuYXNfbXYuY29sICYgNzsKKyAgICBpbnQgeW9mZnNldCA9IHRoaXNfbXYuYXNfbXYucm93ICYgNzsKKworICAgIGluX3doYXQgKz0gKHRoaXNfbXYuYXNfbXYucm93ID4+IDMpICogcHJlX3N0cmlkZSArICh0aGlzX212LmFzX212LmNvbCA+PiAzKTsKKworICAgIGlmICh4b2Zmc2V0IHwgeW9mZnNldCkKKyAgICB7CisgICAgICAgIHJldHVybiB2ZnAtPnN2Zihpbl93aGF0LCBpbl93aGF0X3N0cmlkZSwgeG9mZnNldCwgeW9mZnNldCwgd2hhdCwgd2hhdF9zdHJpZGUsIHNzZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiB2ZnAtPnZmKHdoYXQsIHdoYXRfc3RyaWRlLCBpbl93aGF0LCBpbl93aGF0X3N0cmlkZSwgc3NlKTsKKyAgICB9CisKK30KKworCit1bnNpZ25lZCBpbnQgdnA4X2dldDR4NHNzZV9jc19jCisoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKKyAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKKyAgICBpbnQgIHJlY29uX3N0cmlkZQorKQoreworICAgIGludCBkaXN0b3J0aW9uID0gMDsKKyAgICBpbnQgciwgYzsKKworICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCisgICAgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZGlmZiA9IHNyY19wdHJbY10gLSByZWZfcHRyW2NdOworICAgICAgICAgICAgZGlzdG9ydGlvbiArPSBkaWZmICogZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIHNyY19wdHIgKz0gc291cmNlX3N0cmlkZTsKKyAgICAgICAgcmVmX3B0ciArPSByZWNvbl9zdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIGRpc3RvcnRpb247Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ByZWRpY3Rpb25fZXJyb3IoQkxPQ0sgKmJlLCBCTE9DS0QgKmIpCit7CisgICAgdW5zaWduZWQgY2hhciAqc3B0cjsKKyAgICB1bnNpZ25lZCBjaGFyICpkcHRyOworICAgIHNwdHIgPSAoKihiZS0+YmFzZV9zcmMpICsgYmUtPnNyYyk7CisgICAgZHB0ciA9IGItPnByZWRpY3RvcjsKKworICAgIHJldHVybiB2cDhfZ2V0NHg0c3NlX2NzKHNwdHIsIGJlLT5zcmNfc3RyaWRlLCBkcHRyLCAxNik7CisKK30KKworc3RhdGljIGludCBwaWNrX2ludHJhNHg0YmxvY2soCisgICAgTUFDUk9CTE9DSyAqeCwKKyAgICBpbnQgaWIsCisgICAgQl9QUkVESUNUSU9OX01PREUgKmJlc3RfbW9kZSwKKyAgICBjb25zdCBpbnQgKm1vZGVfY29zdHMsCisKKyAgICBpbnQgKmJlc3RyYXRlLAorICAgIGludCAqYmVzdGRpc3RvcnRpb24pCit7CisKKyAgICBCTE9DS0QgKmIgPSAmeC0+ZV9tYmQuYmxvY2tbaWJdOworICAgIEJMT0NLICpiZSA9ICZ4LT5ibG9ja1tpYl07CisgICAgaW50IGRzdF9zdHJpZGUgPSB4LT5lX21iZC5kc3QueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqZHN0ID0geC0+ZV9tYmQuZHN0LnlfYnVmZmVyICsgYi0+b2Zmc2V0OworICAgIEJfUFJFRElDVElPTl9NT0RFIG1vZGU7CisgICAgaW50IGJlc3RfcmQgPSBJTlRfTUFYOworICAgIGludCByYXRlOworICAgIGludCBkaXN0b3J0aW9uOworCisgICAgdW5zaWduZWQgY2hhciAqQWJvdmUgPSBkc3QgLSBkc3Rfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKnlsZWZ0ID0gZHN0IC0gMTsKKyAgICB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0ID0gQWJvdmVbLTFdOworCisgICAgZm9yIChtb2RlID0gQl9EQ19QUkVEOyBtb2RlIDw9IEJfSEVfUFJFRDsgbW9kZSsrKQorICAgIHsKKyAgICAgICAgaW50IHRoaXNfcmQ7CisKKyAgICAgICAgcmF0ZSA9IG1vZGVfY29zdHNbbW9kZV07CisKKyAgICAgICAgdnA4X2ludHJhNHg0X3ByZWRpY3QoQWJvdmUsIHlsZWZ0LCBkc3Rfc3RyaWRlLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT5wcmVkaWN0b3IsIDE2LCB0b3BfbGVmdCk7CisgICAgICAgIGRpc3RvcnRpb24gPSBnZXRfcHJlZGljdGlvbl9lcnJvcihiZSwgYik7CisgICAgICAgIHRoaXNfcmQgPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZSwgZGlzdG9ydGlvbik7CisKKyAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X3JkKQorICAgICAgICB7CisgICAgICAgICAgICAqYmVzdHJhdGUgPSByYXRlOworICAgICAgICAgICAgKmJlc3RkaXN0b3J0aW9uID0gZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIGJlc3RfcmQgPSB0aGlzX3JkOworICAgICAgICAgICAgKmJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiLT5ibWkuYXNfbW9kZSA9ICpiZXN0X21vZGU7CisgICAgdnA4X2VuY29kZV9pbnRyYTR4NGJsb2NrKHgsIGliKTsKKyAgICByZXR1cm4gYmVzdF9yZDsKK30KKworCitzdGF0aWMgaW50IHBpY2tfaW50cmE0eDRtYnlfbW9kZXMKKygKKyAgICBNQUNST0JMT0NLICptYiwKKyAgICBpbnQgKlJhdGUsCisgICAgaW50ICpiZXN0X2Rpc3QKKykKK3sKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmbWItPmVfbWJkOworICAgIGludCBpOworICAgIGludCBjb3N0ID0gbWItPm1ibW9kZV9jb3N0IFt4ZC0+ZnJhbWVfdHlwZV0gW0JfUFJFRF07CisgICAgaW50IGVycm9yOworICAgIGludCBkaXN0b3J0aW9uID0gMDsKKyAgICBjb25zdCBpbnQgKmJtb2RlX2Nvc3RzOworCisgICAgaW50cmFfcHJlZGljdGlvbl9kb3duX2NvcHkoeGQsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICsgMTYpOworCisgICAgYm1vZGVfY29zdHMgPSBtYi0+aW50ZXJfYm1vZGVfY29zdHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIE1PREVfSU5GTyAqY29uc3QgbWljID0geGQtPm1vZGVfaW5mb19jb250ZXh0OworICAgICAgICBjb25zdCBpbnQgbWlzID0geGQtPm1vZGVfaW5mb19zdHJpZGU7CisKKyAgICAgICAgQl9QUkVESUNUSU9OX01PREUgVU5JTklUSUFMSVpFRF9JU19TQUZFKGJlc3RfbW9kZSk7CisgICAgICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUociksIFVOSU5JVElBTElaRURfSVNfU0FGRShkKTsKKworICAgICAgICBpZiAobWItPmVfbWJkLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBCX1BSRURJQ1RJT05fTU9ERSBBID0gYWJvdmVfYmxvY2tfbW9kZShtaWMsIGksIG1pcyk7CisgICAgICAgICAgICBjb25zdCBCX1BSRURJQ1RJT05fTU9ERSBMID0gbGVmdF9ibG9ja19tb2RlKG1pYywgaSk7CisKKyAgICAgICAgICAgIGJtb2RlX2Nvc3RzICA9IG1iLT5ibW9kZV9jb3N0c1tBXVtMXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcGlja19pbnRyYTR4NGJsb2NrKG1iLCBpLCAmYmVzdF9tb2RlLCBibW9kZV9jb3N0cywgJnIsICZkKTsKKworICAgICAgICBjb3N0ICs9IHI7CisgICAgICAgIGRpc3RvcnRpb24gKz0gZDsKKyAgICAgICAgbWljLT5ibWlbaV0uYXNfbW9kZSA9IGJlc3RfbW9kZTsKKworICAgICAgICAvKiBCcmVhayBvdXQgY2FzZSB3aGVyZSB3ZSBoYXZlIGFscmVhZHkgZXhjZWVkZWQgYmVzdCBzbyBmYXIgdmFsdWUKKyAgICAgICAgICogdGhhdCB3YXMgcGFzc2VkIGluCisgICAgICAgICAqLworICAgICAgICBpZiAoZGlzdG9ydGlvbiA+ICpiZXN0X2Rpc3QpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAqUmF0ZSA9IGNvc3Q7CisKKyAgICBpZiAoaSA9PSAxNikKKyAgICB7CisgICAgICAgICpiZXN0X2Rpc3QgPSBkaXN0b3J0aW9uOworICAgICAgICBlcnJvciA9IFJEQ09TVChtYi0+cmRtdWx0LCBtYi0+cmRkaXYsIGNvc3QsIGRpc3RvcnRpb24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqYmVzdF9kaXN0ID0gSU5UX01BWDsKKyAgICAgICAgZXJyb3IgPSBJTlRfTUFYOworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgcGlja19pbnRyYV9tYnV2X21vZGUoTUFDUk9CTE9DSyAqbWIpCit7CisKKyAgICBNQUNST0JMT0NLRCAqeCA9ICZtYi0+ZV9tYmQ7CisgICAgdW5zaWduZWQgY2hhciAqdWFib3ZlX3JvdyA9IHgtPmRzdC51X2J1ZmZlciAtIHgtPmRzdC51dl9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqdmFib3ZlX3JvdyA9IHgtPmRzdC52X2J1ZmZlciAtIHgtPmRzdC51dl9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqdXNyY19wdHIgPSAobWItPmJsb2NrWzE2XS5zcmMgKyAqbWItPmJsb2NrWzE2XS5iYXNlX3NyYyk7CisgICAgdW5zaWduZWQgY2hhciAqdnNyY19wdHIgPSAobWItPmJsb2NrWzIwXS5zcmMgKyAqbWItPmJsb2NrWzIwXS5iYXNlX3NyYyk7CisgICAgaW50IHV2c3JjX3N0cmlkZSA9IG1iLT5ibG9ja1sxNl0uc3JjX3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyIHVsZWZ0X2NvbFs4XTsKKyAgICB1bnNpZ25lZCBjaGFyIHZsZWZ0X2NvbFs4XTsKKyAgICB1bnNpZ25lZCBjaGFyIHV0b3BfbGVmdCA9IHVhYm92ZV9yb3dbLTFdOworICAgIHVuc2lnbmVkIGNoYXIgdnRvcF9sZWZ0ID0gdmFib3ZlX3Jvd1stMV07CisgICAgaW50IGksIGo7CisgICAgaW50IGV4cGVjdGVkX3VkYzsKKyAgICBpbnQgZXhwZWN0ZWRfdmRjOworICAgIGludCBzaGlmdDsKKyAgICBpbnQgVWF2ZXJhZ2UgPSAwOworICAgIGludCBWYXZlcmFnZSA9IDA7CisgICAgaW50IGRpZmY7CisgICAgaW50IHByZWRfZXJyb3JbNF0gPSB7MCwgMCwgMCwgMH0sIGJlc3RfZXJyb3IgPSBJTlRfTUFYOworICAgIE1CX1BSRURJQ1RJT05fTU9ERSBVTklOSVRJQUxJWkVEX0lTX1NBRkUoYmVzdF9tb2RlKTsKKworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICB7CisgICAgICAgIHVsZWZ0X2NvbFtpXSA9IHgtPmRzdC51X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07CisgICAgICAgIHZsZWZ0X2NvbFtpXSA9IHgtPmRzdC52X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07CisgICAgfQorCisgICAgaWYgKCF4LT51cF9hdmFpbGFibGUgJiYgIXgtPmxlZnRfYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgZXhwZWN0ZWRfdWRjID0gMTI4OworICAgICAgICBleHBlY3RlZF92ZGMgPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNoaWZ0ID0gMjsKKworICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVWF2ZXJhZ2UgKz0gdWFib3ZlX3Jvd1tpXTsKKyAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2YWJvdmVfcm93W2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaGlmdCArKzsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVhdmVyYWdlICs9IHVsZWZ0X2NvbFtpXTsKKyAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2bGVmdF9jb2xbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoaWZ0ICsrOworCisgICAgICAgIH0KKworICAgICAgICBleHBlY3RlZF91ZGMgPSAoVWF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OworICAgICAgICBleHBlY3RlZF92ZGMgPSAoVmF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OworICAgIH0KKworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgaW50IHByZWR1ID0gdWxlZnRfY29sW2ldICsgdWFib3ZlX3Jvd1tqXSAtIHV0b3BfbGVmdDsKKyAgICAgICAgICAgIGludCBwcmVkdiA9IHZsZWZ0X2NvbFtpXSArIHZhYm92ZV9yb3dbal0gLSB2dG9wX2xlZnQ7CisgICAgICAgICAgICBpbnQgdV9wLCB2X3A7CisKKyAgICAgICAgICAgIHVfcCA9IHVzcmNfcHRyW2pdOworICAgICAgICAgICAgdl9wID0gdnNyY19wdHJbal07CisKKyAgICAgICAgICAgIGlmIChwcmVkdSA8IDApCisgICAgICAgICAgICAgICAgcHJlZHUgPSAwOworCisgICAgICAgICAgICBpZiAocHJlZHUgPiAyNTUpCisgICAgICAgICAgICAgICAgcHJlZHUgPSAyNTU7CisKKyAgICAgICAgICAgIGlmIChwcmVkdiA8IDApCisgICAgICAgICAgICAgICAgcHJlZHYgPSAwOworCisgICAgICAgICAgICBpZiAocHJlZHYgPiAyNTUpCisgICAgICAgICAgICAgICAgcHJlZHYgPSAyNTU7CisKKworICAgICAgICAgICAgZGlmZiA9IHVfcCAtIGV4cGVjdGVkX3VkYzsKKyAgICAgICAgICAgIHByZWRfZXJyb3JbRENfUFJFRF0gKz0gZGlmZiAqIGRpZmY7CisgICAgICAgICAgICBkaWZmID0gdl9wIC0gZXhwZWN0ZWRfdmRjOworICAgICAgICAgICAgcHJlZF9lcnJvcltEQ19QUkVEXSArPSBkaWZmICogZGlmZjsKKworCisgICAgICAgICAgICBkaWZmID0gdV9wIC0gdWFib3ZlX3Jvd1tqXTsKKyAgICAgICAgICAgIHByZWRfZXJyb3JbVl9QUkVEXSArPSBkaWZmICogZGlmZjsKKyAgICAgICAgICAgIGRpZmYgPSB2X3AgLSB2YWJvdmVfcm93W2pdOworICAgICAgICAgICAgcHJlZF9lcnJvcltWX1BSRURdICs9IGRpZmYgKiBkaWZmOworCisKKyAgICAgICAgICAgIGRpZmYgPSB1X3AgLSB1bGVmdF9jb2xbaV07CisgICAgICAgICAgICBwcmVkX2Vycm9yW0hfUFJFRF0gKz0gZGlmZiAqIGRpZmY7CisgICAgICAgICAgICBkaWZmID0gdl9wIC0gdmxlZnRfY29sW2ldOworICAgICAgICAgICAgcHJlZF9lcnJvcltIX1BSRURdICs9IGRpZmYgKiBkaWZmOworCisKKyAgICAgICAgICAgIGRpZmYgPSB1X3AgLSBwcmVkdTsKKyAgICAgICAgICAgIHByZWRfZXJyb3JbVE1fUFJFRF0gKz0gZGlmZiAqIGRpZmY7CisgICAgICAgICAgICBkaWZmID0gdl9wIC0gcHJlZHY7CisgICAgICAgICAgICBwcmVkX2Vycm9yW1RNX1BSRURdICs9IGRpZmYgKiBkaWZmOworCisKKyAgICAgICAgfQorCisgICAgICAgIHVzcmNfcHRyICs9IHV2c3JjX3N0cmlkZTsKKyAgICAgICAgdnNyY19wdHIgKz0gdXZzcmNfc3RyaWRlOworCisgICAgICAgIGlmIChpID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzcmNfcHRyID0gKG1iLT5ibG9ja1sxOF0uc3JjICsgKm1iLT5ibG9ja1sxOF0uYmFzZV9zcmMpOworICAgICAgICAgICAgdnNyY19wdHIgPSAobWItPmJsb2NrWzIyXS5zcmMgKyAqbWItPmJsb2NrWzIyXS5iYXNlX3NyYyk7CisgICAgICAgIH0KKworCisKKyAgICB9CisKKworICAgIGZvciAoaSA9IERDX1BSRUQ7IGkgPD0gVE1fUFJFRDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJlc3RfZXJyb3IgPiBwcmVkX2Vycm9yW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0X2Vycm9yID0gcHJlZF9lcnJvcltpXTsKKyAgICAgICAgICAgIGJlc3RfbW9kZSA9IChNQl9QUkVESUNUSU9OX01PREUpaTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgbWItPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSBiZXN0X21vZGU7CisKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX212Y291bnQoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50X212ICpiZXN0X3JlZl9tdikKK3sKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgLyogU3BsaXQgTVYgbW9kZXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgd2hlbiBSRCBpcyBub3B0IGVuYWJsZWQsCisgICAgICogdGhlcmVmb3JlLCBvbmx5IG5lZWQgdG8gbW9kaWZ5IE1WY291bnQgaW4gTkVXTVYgbW9kZS4gKi8KKyAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gTkVXTVYpCisgICAgeworICAgICAgICB4LT5NVmNvdW50WzBdW212X21heCsoKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5yb3cgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3JlZl9tdi0+YXNfbXYucm93KSA+PiAxKV0rKzsKKyAgICAgICAgeC0+TVZjb3VudFsxXVttdl9tYXgrKCh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYuY29sIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9yZWZfbXYtPmFzX212LmNvbCkgPj4gMSldKys7CisgICAgfQorfQorCisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCitzdGF0aWMKK3ZvaWQgZ2V0X2xvd2VyX3Jlc19tb3Rpb25faW5mbyhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLRCAqeGQsIGludCAqZGlzc2ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGFyZW50X3JlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9QUkVESUNUSU9OX01PREUgKnBhcmVudF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9tdiAqcGFyZW50X3JlZl9tdiwgaW50IG1iX3JvdywgaW50IG1iX2NvbCkKK3sKKyAgICBMT1dFUl9SRVNfTUJfSU5GTyogc3RvcmVfbW9kZV9pbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgID0gKChMT1dFUl9SRVNfRlJBTUVfSU5GTyopY3BpLT5veGNmLm1yX2xvd19yZXNfbW9kZV9pbmZvKS0+bWJfaW5mbzsKKyAgICB1bnNpZ25lZCBpbnQgcGFyZW50X21iX2luZGV4OworCisgICAgLyogQ29uc2lkZXIgZGlmZmVyZW50IGRvd25fc2FtcGxpbmdfZmFjdG9yLiAgKi8KKyAgICB7CisgICAgICAgIC8qIFRPRE86IFJlbW92ZWQgdGhlIGxvb3AgdGhhdCBzdXBwb3J0cyBzcGVjaWFsIGRvd25fc2FtcGxpbmdfZmFjdG9yCisgICAgICAgICAqIHN1Y2ggYXMgMiwgNCwgOC4gV2lsbCByZXZpc2l0IGl0IGlmIG5lZWRlZC4KKyAgICAgICAgICogU2hvdWxkIGFsc28gdHJ5IHVzaW5nIGEgbG9vay11cCB0YWJsZSB0byBzZWUgaWYgaXQgaGVscHMKKyAgICAgICAgICogcGVyZm9ybWFuY2UuICovCisgICAgICAgIGludCBwYXJlbnRfbWJfcm93LCBwYXJlbnRfbWJfY29sOworCisgICAgICAgIHBhcmVudF9tYl9yb3cgPSBtYl9yb3cqY3BpLT5veGNmLm1yX2Rvd25fc2FtcGxpbmdfZmFjdG9yLmRlbgorICAgICAgICAgICAgICAgICAgICAvY3BpLT5veGNmLm1yX2Rvd25fc2FtcGxpbmdfZmFjdG9yLm51bTsKKyAgICAgICAgcGFyZW50X21iX2NvbCA9IG1iX2NvbCpjcGktPm94Y2YubXJfZG93bl9zYW1wbGluZ19mYWN0b3IuZGVuCisgICAgICAgICAgICAgICAgICAgIC9jcGktPm94Y2YubXJfZG93bl9zYW1wbGluZ19mYWN0b3IubnVtOworICAgICAgICBwYXJlbnRfbWJfaW5kZXggPSBwYXJlbnRfbWJfcm93KmNwaS0+bXJfbG93X3Jlc19tYl9jb2xzICsgcGFyZW50X21iX2NvbDsKKyAgICB9CisKKyAgICAvKiBSZWFkIGxvd2VyLXJlc29sdXRpb24gbW9kZSAmIG1vdGlvbiByZXN1bHQgZnJvbSBtZW1vcnkuKi8KKyAgICAqcGFyZW50X3JlZl9mcmFtZSA9IHN0b3JlX21vZGVfaW5mb1twYXJlbnRfbWJfaW5kZXhdLnJlZl9mcmFtZTsKKyAgICAqcGFyZW50X21vZGUgPSAgc3RvcmVfbW9kZV9pbmZvW3BhcmVudF9tYl9pbmRleF0ubW9kZTsKKyAgICAqZGlzc2ltID0gc3RvcmVfbW9kZV9pbmZvW3BhcmVudF9tYl9pbmRleF0uZGlzc2ltOworCisgICAgLyogRm9yIGhpZ2hlc3QtcmVzb2x1dGlvbiBlbmNvZGVyLCBhZGp1c3QgZGlzc2ltIHZhbHVlLiBMb3dlciBpdHMgcXVhbGl0eQorICAgICAqIGZvciBnb29kIHBlcmZvcm1hbmNlLiAqLworICAgIGlmIChjcGktPm94Y2YubXJfZW5jb2Rlcl9pZCA9PSAoY3BpLT5veGNmLm1yX3RvdGFsX3Jlc29sdXRpb25zIC0gMSkpCisgICAgICAgICpkaXNzaW0+Pj0xOworCisgICAgaWYoKnBhcmVudF9yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgeworICAgICAgICAvKiBDb25zaWRlciBkaWZmZXJlbnQgZG93bl9zYW1wbGluZ19mYWN0b3IuCisgICAgICAgICAqIFRoZSByZXN1bHQgY2FuIGJlIHJvdW5kZWQgdG8gYmUgbW9yZSBwcmVjaXNlLCBidXQgaXQgdGFrZXMgbW9yZSB0aW1lLgorICAgICAgICAgKi8KKyAgICAgICAgKCpwYXJlbnRfcmVmX212KS5hc19tdi5yb3cgPSBzdG9yZV9tb2RlX2luZm9bcGFyZW50X21iX2luZGV4XS5tdi5hc19tdi5yb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY3BpLT5veGNmLm1yX2Rvd25fc2FtcGxpbmdfZmFjdG9yLm51bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9jcGktPm94Y2YubXJfZG93bl9zYW1wbGluZ19mYWN0b3IuZGVuOworICAgICAgICAoKnBhcmVudF9yZWZfbXYpLmFzX212LmNvbCA9IHN0b3JlX21vZGVfaW5mb1twYXJlbnRfbWJfaW5kZXhdLm12LmFzX212LmNvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjcGktPm94Y2YubXJfZG93bl9zYW1wbGluZ19mYWN0b3IubnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL2NwaS0+b3hjZi5tcl9kb3duX3NhbXBsaW5nX2ZhY3Rvci5kZW47CisKKyAgICAgICAgdnA4X2NsYW1wX212MihwYXJlbnRfcmVmX212LCB4ZCk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9lbmNvZGVfYnJlYWtvdXQodW5zaWduZWQgaW50IHNzZSwgTUFDUk9CTE9DSyogeCkKK3sKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkID0gKHhkLT5ibG9ja1swXS5kZXF1YW50WzFdCisgICAgICAgICogeGQtPmJsb2NrWzBdLmRlcXVhbnRbMV0gPj40KTsKKworICAgIGlmKHRocmVzaG9sZCA8IHgtPmVuY29kZV9icmVha291dCkKKyAgICAgICAgdGhyZXNob2xkID0geC0+ZW5jb2RlX2JyZWFrb3V0OworCisgICAgaWYgKHNzZSA8IHRocmVzaG9sZCApCisgICAgeworICAgICAgICAvKiBDaGVjayB1IGFuZCB2IHRvIG1ha2Ugc3VyZSBza2lwIGlzIG9rICovCisgICAgICAgIHVuc2lnbmVkIGludCBzc2UyID0gMDsKKworICAgICAgICBzc2UyID0gVlA4X1VWU1NFKHgpOworCisgICAgICAgIGlmIChzc2UyICogMiA8IHgtPmVuY29kZV9icmVha291dCkKKyAgICAgICAgICAgIHgtPnNraXAgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4LT5za2lwID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZXZhbHVhdGVfaW50ZXJfbW9kZSh1bnNpZ25lZCBpbnQqIHNzZSwgaW50IHJhdGUyLCBpbnQqIGRpc3RvcnRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCByZF9hZGopCit7CisgICAgTUJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZSA9IHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGU7CisgICAgaW50X212IG12ID0geC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXY7CisgICAgaW50IHRoaXNfcmQ7CisgICAgLyogRXhpdCBlYXJseSBhbmQgZG9uJ3QgY29tcHV0ZSB0aGUgZGlzdG9ydGlvbiBpZiB0aGlzIG1hY3JvYmxvY2sKKyAgICAgKiBpcyBtYXJrZWQgaW5hY3RpdmUuICovCisgICAgaWYgKGNwaS0+YWN0aXZlX21hcF9lbmFibGVkICYmIHgtPmFjdGl2ZV9wdHJbMF0gPT0gMCkKKyAgICB7CisgICAgICAgICpzc2UgPSAwOworICAgICAgICAqZGlzdG9ydGlvbjIgPSAwOworICAgICAgICB4LT5za2lwID0gMTsKKyAgICAgICAgcmV0dXJuIElOVF9NQVg7CisgICAgfQorCisgICAgaWYoKHRoaXNfbW9kZSAhPSBORVdNVikgfHwKKyAgICAgICAgIShjcGktPnNmLmhhbGZfcGl4ZWxfc2VhcmNoKSB8fCBjcGktPmNvbW1vbi5mdWxsX3BpeGVsPT0xKQorICAgICAgICAqZGlzdG9ydGlvbjIgPSB2cDhfZ2V0X2ludGVyX21icHJlZF9lcnJvcih4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NlLCBtdik7CisKKyAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUyLCAqZGlzdG9ydGlvbjIpOworCisgICAgLyogQWRqdXN0IHJkIHRvIGJpYXMgdG8gWkVST01WICovCisgICAgaWYodGhpc19tb2RlID09IFpFUk9NVikKKyAgICB7CisgICAgICAgIC8qIEJpYXMgdG8gWkVST01WIG9uIExBU1RfRlJBTUUgcmVmZXJlbmNlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiAqLworICAgICAgICBpZiAoKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0xBU1RfRlJBTUUgJgorICAgICAgICAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9sYXN0X2ZyYW1lKQorICAgICAgICAgICAgJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lICE9IExBU1RfRlJBTUUpCisgICAgICAgICAgICByZF9hZGogPSAxMDA7CisKKyAgICAgICAgLy8gcmRfYWRqIDw9IDEwMAorICAgICAgICB0aGlzX3JkID0gKChpbnQ2NF90KXRoaXNfcmQpICogcmRfYWRqIC8gMTAwOworICAgIH0KKworICAgIGNoZWNrX2Zvcl9lbmNvZGVfYnJlYWtvdXQoKnNzZSwgeCk7CisgICAgcmV0dXJuIHRoaXNfcmQ7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV96ZXJvbXZfcmRfYWRqdXN0bWVudChWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZF9hZGp1c3RtZW50KQoreworICAgIE1PREVfSU5GTyAqbWljID0geC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQ7CisgICAgaW50X212IG12X2wsIG12X2EsIG12X2FsOworICAgIGludCBsb2NhbF9tb3Rpb25fY2hlY2sgPSAwOworCisgICAgaWYgKGNwaS0+bGZfemVyb212X3BjdCA+IDQwKQorICAgIHsKKyAgICAgICAgLyogbGVmdCBtYiAqLworICAgICAgICBtaWMgLT0gMTsKKyAgICAgICAgbXZfbCA9IG1pYy0+bWJtaS5tdjsKKworICAgICAgICBpZiAobWljLT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgICAgIGlmKCBhYnMobXZfbC5hc19tdi5yb3cpIDwgOCAmJiBhYnMobXZfbC5hc19tdi5jb2wpIDwgOCkKKyAgICAgICAgICAgICAgICBsb2NhbF9tb3Rpb25fY2hlY2srKzsKKworICAgICAgICAvKiBhYm92ZS1sZWZ0IG1iICovCisgICAgICAgIG1pYyAtPSB4LT5lX21iZC5tb2RlX2luZm9fc3RyaWRlOworICAgICAgICBtdl9hbCA9IG1pYy0+bWJtaS5tdjsKKworICAgICAgICBpZiAobWljLT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgICAgIGlmKCBhYnMobXZfYWwuYXNfbXYucm93KSA8IDggJiYgYWJzKG12X2FsLmFzX212LmNvbCkgPCA4KQorICAgICAgICAgICAgICAgIGxvY2FsX21vdGlvbl9jaGVjaysrOworCisgICAgICAgIC8qIGFib3ZlIG1iICovCisgICAgICAgIG1pYyArPSAxOworICAgICAgICBtdl9hID0gbWljLT5tYm1pLm12OworCisgICAgICAgIGlmIChtaWMtPm1ibWkucmVmX2ZyYW1lICE9IElOVFJBX0ZSQU1FKQorICAgICAgICAgICAgaWYoIGFicyhtdl9hLmFzX212LnJvdykgPCA4ICYmIGFicyhtdl9hLmFzX212LmNvbCkgPCA4KQorICAgICAgICAgICAgICAgIGxvY2FsX21vdGlvbl9jaGVjaysrOworCisgICAgICAgIGlmICgoKCF4LT5lX21iZC5tYl90b190b3BfZWRnZSB8fCAheC0+ZV9tYmQubWJfdG9fbGVmdF9lZGdlKQorICAgICAgICAgICAgJiYgbG9jYWxfbW90aW9uX2NoZWNrID4wKSB8fCAgbG9jYWxfbW90aW9uX2NoZWNrID4yICkKKyAgICAgICAgICAgICpyZF9hZGp1c3RtZW50ID0gODA7CisgICAgICAgIGVsc2UgaWYgKGxvY2FsX21vdGlvbl9jaGVjayA+IDApCisgICAgICAgICAgICAqcmRfYWRqdXN0bWVudCA9IDkwOworICAgIH0KK30KKwordm9pZCB2cDhfcGlja19pbnRlcl9tb2RlKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCByZWNvbl95b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNvbl91dm9mZnNldCwgaW50ICpyZXR1cm5yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmV0dXJuZGlzdG9ydGlvbiwgaW50ICpyZXR1cm5pbnRyYSwgaW50IG1iX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfY29sKQoreworICAgIEJMT0NLICpiID0gJngtPmJsb2NrWzBdOworICAgIEJMT0NLRCAqZCA9ICZ4LT5lX21iZC5ibG9ja1swXTsKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgTUJfTU9ERV9JTkZPIGJlc3RfbWJtb2RlOworCisgICAgaW50X212IGJlc3RfcmVmX212X3NiWzJdOworICAgIGludF9tdiBtb2RlX212X3NiWzJdW01CX01PREVfQ09VTlRdOworICAgIGludF9tdiBiZXN0X3JlZl9tdjsKKyAgICBpbnRfbXYgKm1vZGVfbXY7CisgICAgTUJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZTsKKyAgICBpbnQgbnVtMDA7CisgICAgaW50IG1kY291bnRzWzRdOworICAgIGludCBiZXN0X3JkID0gSU5UX01BWDsKKyAgICBpbnQgcmRfYWRqdXN0bWVudCA9IDEwMDsKKyAgICBpbnQgYmVzdF9pbnRyYV9yZCA9IElOVF9NQVg7CisgICAgaW50IG1vZGVfaW5kZXg7CisgICAgaW50IHJhdGU7CisgICAgaW50IHJhdGUyOworICAgIGludCBkaXN0b3J0aW9uMjsKKyAgICBpbnQgYmVzdHNtZSA9IElOVF9NQVg7CisgICAgaW50IGJlc3RfbW9kZV9pbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IHNzZSA9IElOVF9NQVgsIGJlc3RfcmRfc3NlID0gSU5UX01BWDsKKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisgICAgdW5zaWduZWQgaW50IHplcm9fbXZfc3NlID0gSU5UX01BWCwgYmVzdF9zc2UgPSBJTlRfTUFYOworI2VuZGlmCisKKyAgICBpbnRfbXYgbXZwOworCisgICAgaW50IG5lYXJfc2FkaWR4WzhdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OworICAgIGludCBzYWRkb25lPTA7CisgICAgLyogc2VhcmNoIHJhbmdlIGdvdCBmcm9tIG12X3ByZWQoKS4gSXQgdXNlcyBzdGVwX3BhcmFtIGxldmVscy4gKDAtNykgKi8KKyAgICBpbnQgc3I9MDsKKworICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5lWzRdWzNdOworICAgIGludCByZWZfZnJhbWVfbWFwWzRdOworICAgIGludCBzaWduX2JpYXMgPSAwOworCisjaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgIGludCBkaXNzaW0gPSBJTlRfTUFYOworICAgIGludCBwYXJlbnRfcmVmX2ZyYW1lID0gMDsKKyAgICBpbnQgcGFyZW50X3JlZl92YWxpZCA9IGNwaS0+b3hjZi5tcl9lbmNvZGVyX2lkICYmIGNwaS0+bXJfbG93X3Jlc19tdl9hdmFpbDsKKyAgICBpbnRfbXYgcGFyZW50X3JlZl9tdjsKKyAgICBNQl9QUkVESUNUSU9OX01PREUgcGFyZW50X21vZGUgPSAwOworCisgICAgaWYgKHBhcmVudF9yZWZfdmFsaWQpCisgICAgeworICAgICAgICBpbnQgcGFyZW50X3JlZl9mbGFnOworCisgICAgICAgIGdldF9sb3dlcl9yZXNfbW90aW9uX2luZm8oY3BpLCB4ZCwgJmRpc3NpbSwgJnBhcmVudF9yZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudF9tb2RlLCAmcGFyZW50X3JlZl9tdiwgbWJfcm93LCBtYl9jb2wpOworCisgICAgICAgIC8qIFRPRE8oamtvbGVzemFyKTogVGhlIHJlZmVyZW5jZXMgYXZhaWxhYmxlIChyZWZfZnJhbWVfZmxhZ3MpIHRvIHRoZQorICAgICAgICAgKiBsb3dlciByZXMgZW5jb2RlciBzaG91bGQgbWF0Y2ggdGhvc2UgYXZhaWxhYmxlIHRvIHRoaXMgZW5jb2RlciwgYnV0CisgICAgICAgICAqIHRoZXJlIHNlZW1zIHRvIGJlIGEgc2l0dWF0aW9uIHdoZXJlIHRoaXMgbWlzbWF0Y2ggY2FuIGhhcHBlbiBpbiB0aGUKKyAgICAgICAgICogY2FzZSBvZiBmcmFtZSBkcm9wcGluZyBhbmQgdGVtcG9yYWwgbGF5ZXJzLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgICogR09MRCBiZWluZyBkaXNhbGxvd2VkIGluIHJlZl9mcmFtZV9mbGFncywgYnV0IGJlaW5nIHJldHVybmVkIGFzCisgICAgICAgICAqIHBhcmVudF9yZWZfZnJhbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEluIHRoaXMgZXZlbnQsIHRha2UgdGhlIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCBvZiBkaXNhYmxpbmcgdGhlCisgICAgICAgICAqIGxvd2VyIHJlcyBpbmZvIGZvciB0aGlzIE1CLgorICAgICAgICAgKi8KKyAgICAgICAgcGFyZW50X3JlZl9mbGFnID0gMDsKKyAgICAgICAgaWYgKHBhcmVudF9yZWZfZnJhbWUgPT0gTEFTVF9GUkFNRSkKKyAgICAgICAgICAgIHBhcmVudF9yZWZfZmxhZyA9IChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZSQU1FKTsKKyAgICAgICAgZWxzZSBpZiAocGFyZW50X3JlZl9mcmFtZSA9PSBHT0xERU5fRlJBTUUpCisgICAgICAgICAgICBwYXJlbnRfcmVmX2ZsYWcgPSAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfR09MRF9GUkFNRSk7CisgICAgICAgIGVsc2UgaWYgKHBhcmVudF9yZWZfZnJhbWUgPT0gQUxUUkVGX0ZSQU1FKQorICAgICAgICAgICAgcGFyZW50X3JlZl9mbGFnID0gKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVFJfRlJBTUUpOworCisgICAgICAgIC8vYXNzZXJ0KCFwYXJlbnRfcmVmX2ZyYW1lIHx8IHBhcmVudF9yZWZfZmxhZyk7CisgICAgICAgIGlmIChwYXJlbnRfcmVmX2ZyYW1lICYmICFwYXJlbnRfcmVmX2ZsYWcpCisgICAgICAgICAgICBwYXJlbnRfcmVmX3ZhbGlkID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIG1vZGVfbXYgPSBtb2RlX212X3NiW3NpZ25fYmlhc107CisgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gMDsKKyAgICB2cHhfbWVtc2V0KG1vZGVfbXZfc2IsIDAsIHNpemVvZihtb2RlX212X3NiKSk7CisgICAgdnB4X21lbXNldCgmYmVzdF9tYm1vZGUsIDAsIHNpemVvZihiZXN0X21ibW9kZSkpOworCisgICAgLyogU2V0dXAgc2VhcmNoIHByaW9yaXRpZXMgKi8KKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgaWYgKHBhcmVudF9yZWZfdmFsaWQgJiYgcGFyZW50X3JlZl9mcmFtZSAmJiBkaXNzaW0gPCA4KQorICAgIHsKKyAgICAgICAgcmVmX2ZyYW1lX21hcFswXSA9IC0xOworICAgICAgICByZWZfZnJhbWVfbWFwWzFdID0gcGFyZW50X3JlZl9mcmFtZTsKKyAgICAgICAgcmVmX2ZyYW1lX21hcFsyXSA9IC0xOworICAgICAgICByZWZfZnJhbWVfbWFwWzNdID0gLTE7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBnZXRfcmVmZXJlbmNlX3NlYXJjaF9vcmRlcihjcGksIHJlZl9mcmFtZV9tYXApOworCisgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgdmFsaWQgcmVmZXJlbmNlIGZyYW1lIHRoYXQgd2UgbmVlZAorICAgICAqIHRvIGNhbGN1bGF0ZSBuZWFyX212cy4KKyAgICAgKi8KKyAgICBpZiAocmVmX2ZyYW1lX21hcFsxXSA+IDApCisgICAgeworICAgICAgICBzaWduX2JpYXMgPSB2cDhfZmluZF9uZWFyX212c19iaWFzKCZ4LT5lX21iZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212X3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVmX212X3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9mcmFtZV9tYXBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisKKyAgICAgICAgbW9kZV9tdiA9IG1vZGVfbXZfc2Jbc2lnbl9iaWFzXTsKKyAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gYmVzdF9yZWZfbXZfc2Jbc2lnbl9iaWFzXS5hc19pbnQ7CisgICAgfQorCisgICAgZ2V0X3ByZWRpY3Rvcl9wb2ludGVycyhjcGksIHBsYW5lLCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCk7CisKKyAgICAvKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIE1CcyB0ZXN0ZWQgc28gZmFyIHRoaXMgZnJhbWUgKi8KKyAgICBjcGktPm1ic190ZXN0ZWRfc29fZmFyKys7CisKKyAgICAqcmV0dXJuaW50cmEgPSBJTlRfTUFYOworICAgIHgtPnNraXAgPSAwOworCisgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7CisKKyAgICAvKiBJZiB0aGUgZnJhbWUgaGFzIGJpZyBzdGF0aWMgYmFja2dyb3VuZCBhbmQgY3VycmVudCBNQiBpcyBpbiBsb3cKKyAgICAgKiBtb3Rpb24gYXJlYSwgaXRzIG1vZGUgZGVjaXNpb24gaXMgYmlhc2VkIHRvIFpFUk9NViBtb2RlLgorICAgICAqLworICAgIGNhbGN1bGF0ZV96ZXJvbXZfcmRfYWRqdXN0bWVudChjcGksIHgsICZyZF9hZGp1c3RtZW50KTsKKworICAgIC8qIGlmIHdlIGVuY29kZSBhIG5ldyBtdiB0aGlzIGlzIGltcG9ydGFudAorICAgICAqIGZpbmQgdGhlIGJlc3QgbmV3IG1vdGlvbiB2ZWN0b3IKKyAgICAgKi8KKyAgICBmb3IgKG1vZGVfaW5kZXggPSAwOyBtb2RlX2luZGV4IDwgTUFYX01PREVTOyBtb2RlX2luZGV4KyspCisgICAgeworICAgICAgICBpbnQgZnJhbWVfY29zdDsKKyAgICAgICAgaW50IHRoaXNfcmQgPSBJTlRfTUFYOworICAgICAgICBpbnQgdGhpc19yZWZfZnJhbWUgPSByZWZfZnJhbWVfbWFwW3ZwOF9yZWZfZnJhbWVfb3JkZXJbbW9kZV9pbmRleF1dOworCisgICAgICAgIGlmIChiZXN0X3JkIDw9IGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAodGhpc19yZWZfZnJhbWUgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gdGhpc19yZWZfZnJhbWU7CisKKyAgICAgICAgLyogZXZlcnl0aGluZyBidXQgaW50cmEgKi8KKyAgICAgICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnlfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzBdOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnVfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzFdOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnZfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzJdOworCisgICAgICAgICAgICBpZiAoc2lnbl9iaWFzICE9IGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbdGhpc19yZWZfZnJhbWVdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpZ25fYmlhcyA9IGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbdGhpc19yZWZfZnJhbWVdOworICAgICAgICAgICAgICAgIG1vZGVfbXYgPSBtb2RlX212X3NiW3NpZ25fYmlhc107CisgICAgICAgICAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gYmVzdF9yZWZfbXZfc2Jbc2lnbl9iaWFzXS5hc19pbnQ7CisgICAgICAgICAgICB9CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgICAgICAgICBpZiAocGFyZW50X3JlZl92YWxpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodnA4X21vZGVfb3JkZXJbbW9kZV9pbmRleF0gPT0gTkVBUkVTVE1WICYmCisgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVBUkVTVE1WXS5hc19pbnQgPT0wKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAodnA4X21vZGVfb3JkZXJbbW9kZV9pbmRleF0gPT0gTkVBUk1WICYmCisgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVBUk1WXS5hc19pbnQgPT0wKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmICh2cDhfbW9kZV9vcmRlclttb2RlX2luZGV4XSA9PSBORVdNViAmJiBwYXJlbnRfbW9kZSA9PSBaRVJPTVYKKyAgICAgICAgICAgICAgICAgICAgJiYgYmVzdF9yZWZfbXYuYXNfaW50PT0wKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKHZwOF9tb2RlX29yZGVyW21vZGVfaW5kZXhdID09IE5FV01WICYmIGRpc3NpbT09MAorICAgICAgICAgICAgICAgICAgICAmJiBiZXN0X3JlZl9tdi5hc19pbnQ9PXBhcmVudF9yZWZfbXYuYXNfaW50KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXN0aW5nIGZyZXF1ZW5jeSBmb3IgdGhpcyBtb2RlIGlzIGF0IGl0cyBtYXgKKyAgICAgICAgICogSWYgc28gdGhlbiBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdGVzdGVkIGFuZCBpbmNyZWFzZSB0aGUgdGhyZXNob2xkCisgICAgICAgICAqIGZvciBpdHMgdGVzdGluZyAqLworICAgICAgICBpZiAoY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5tb2RlX2NoZWNrX2ZyZXFbbW9kZV9pbmRleF0gPiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNwaS0+bWJzX3Rlc3RlZF9zb19mYXIgPD0gKGNwaS0+bW9kZV9jaGVja19mcmVxW21vZGVfaW5kZXhdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSW5jcmVhc2UgdGhlIHRocmVzaG9sZCBmb3IgY29kaW5nIHRoaXMgbW9kZSB0byBtYWtlIGl0IGxlc3MKKyAgICAgICAgICAgICAgICAgKiBsaWtlbHkgdG8gYmUgY2hvc2VuICovCisgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSArPSA0OworCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPiBNQVhfVEhSRVNITVVMVCkKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA9IE1BWF9USFJFU0hNVUxUOworCisgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hlc1ttb2RlX2luZGV4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFdlIGhhdmUgbm93IHJlYWNoZWQgdGhlIHBvaW50IHdoZXJlIHdlIGFyZSBnb2luZyB0byB0ZXN0IHRoZSBjdXJyZW50CisgICAgICAgICAqIG1vZGUgc28gaW5jcmVtZW50IHRoZSBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IGhhcyBiZWVuCisgICAgICAgICAqIHRlc3RlZCAqLworICAgICAgICBjcGktPm1vZGVfdGVzdF9oaXRfY291bnRzW21vZGVfaW5kZXhdICsrOworCisgICAgICAgIHJhdGUyID0gMDsKKyAgICAgICAgZGlzdG9ydGlvbjIgPSAwOworCisgICAgICAgIHRoaXNfbW9kZSA9IHZwOF9tb2RlX29yZGVyW21vZGVfaW5kZXhdOworCisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSB0aGlzX21vZGU7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSBEQ19QUkVEOworCisgICAgICAgIC8qIFdvcmsgb3V0IHRoZSBjb3N0IGFzc29zY2lhdGVkIHdpdGggc2VsZWN0aW5nIHRoZSByZWZlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgZnJhbWVfY29zdCA9CisgICAgICAgICAgICB4LT5yZWZfZnJhbWVfY29zdFt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOworICAgICAgICByYXRlMiArPSBmcmFtZV9jb3N0OworCisgICAgICAgIC8qIE9ubHkgY29uc2lkZXIgWkVST01WL0FMVFJFRl9GUkFNRSBmb3IgYWx0IHJlZiBmcmFtZSwKKyAgICAgICAgICogdW5sZXNzIEFSTlIgZmlsdGVyaW5nIGlzIGVuYWJsZWQgaW4gd2hpY2ggY2FzZSB3ZSB3YW50CisgICAgICAgICAqIGFuIHVuZmlsdGVyZWQgYWx0ZXJuYXRpdmUgKi8KKyAgICAgICAgaWYgKGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgJiYgKGNwaS0+b3hjZi5hcm5yX21heF9mcmFtZXMgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzX21vZGUgIT0gWkVST01WIHx8CisgICAgICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lICE9IEFMVFJFRl9GUkFNRSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAodGhpc19tb2RlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQl9QUkVEOgorICAgICAgICAgICAgLyogUGFzcyBiZXN0IHNvIGZhciB0byBwaWNrX2ludHJhNHg0bWJ5X21vZGVzIHRvIHVzZSBhcyBicmVha291dCAqLworICAgICAgICAgICAgZGlzdG9ydGlvbjIgPSBiZXN0X3JkX3NzZTsKKyAgICAgICAgICAgIHBpY2tfaW50cmE0eDRtYnlfbW9kZXMoeCwgJnJhdGUsICZkaXN0b3J0aW9uMik7CisKKyAgICAgICAgICAgIGlmIChkaXN0b3J0aW9uMiA9PSBJTlRfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfcmQgPSBJTlRfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhdGUyICs9IHJhdGU7CisgICAgICAgICAgICAgICAgZGlzdG9ydGlvbjIgPSB2cDhfdmFyaWFuY2UxNngxNigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooYi0+YmFzZV9zcmMpLCBiLT5zcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+ZV9tYmQucHJlZGljdG9yLCAxNiwgJnNzZSk7CisgICAgICAgICAgICAgICAgdGhpc19yZCA9IFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCByYXRlMiwgZGlzdG9ydGlvbjIpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X2ludHJhX3JkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9pbnRyYV9yZCA9IHRoaXNfcmQ7CisgICAgICAgICAgICAgICAgICAgICpyZXR1cm5pbnRyYSA9IGRpc3RvcnRpb24yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTUExJVE1WOgorCisgICAgICAgICAgICAvKiBTcGxpdCBNViBtb2RlcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCB3aGVuIFJEIGlzIG5vdCBlbmFibGVkLiAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQ19QUkVEOgorICAgICAgICBjYXNlIFZfUFJFRDoKKyAgICAgICAgY2FzZSBIX1BSRUQ6CisgICAgICAgIGNhc2UgVE1fUFJFRDoKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zKHhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciAtIHhkLT5kc3QueV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICAgICAgZGlzdG9ydGlvbjIgPSB2cDhfdmFyaWFuY2UxNngxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooYi0+YmFzZV9zcmMpLCBiLT5zcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+ZV9tYmQucHJlZGljdG9yLCAxNiwgJnNzZSk7CisgICAgICAgICAgICByYXRlMiArPSB4LT5tYm1vZGVfY29zdFt4LT5lX21iZC5mcmFtZV90eXBlXVt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlXTsKKyAgICAgICAgICAgIHRoaXNfcmQgPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZTIsIGRpc3RvcnRpb24yKTsKKworICAgICAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X2ludHJhX3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlc3RfaW50cmFfcmQgPSB0aGlzX3JkOworICAgICAgICAgICAgICAgICpyZXR1cm5pbnRyYSA9IGRpc3RvcnRpb24yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBORVdNVjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRoaXNzbWU7CisgICAgICAgICAgICBpbnQgc3RlcF9wYXJhbTsKKyAgICAgICAgICAgIGludCBmdXJ0aGVyX3N0ZXBzOworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgaW50IHNhZHBiID0geC0+c2FkcGVyYml0MTY7CisgICAgICAgICAgICBpbnRfbXYgbXZwX2Z1bGw7CisKKyAgICAgICAgICAgIGludCBjb2xfbWluID0gKChiZXN0X3JlZl9tdi5hc19tdi5jb2wrNyk+PjMpIC0gTUFYX0ZVTExfUEVMX1ZBTDsKKyAgICAgICAgICAgIGludCByb3dfbWluID0gKChiZXN0X3JlZl9tdi5hc19tdi5yb3crNyk+PjMpIC0gTUFYX0ZVTExfUEVMX1ZBTDsKKyAgICAgICAgICAgIGludCBjb2xfbWF4ID0gKGJlc3RfcmVmX212LmFzX212LmNvbD4+MykKKyAgICAgICAgICAgICAgICAgICAgICAgICArIE1BWF9GVUxMX1BFTF9WQUw7CisgICAgICAgICAgICBpbnQgcm93X21heCA9IChiZXN0X3JlZl9tdi5hc19tdi5yb3c+PjMpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBNQVhfRlVMTF9QRUxfVkFMOworCisgICAgICAgICAgICBpbnQgdG1wX2NvbF9taW4gPSB4LT5tdl9jb2xfbWluOworICAgICAgICAgICAgaW50IHRtcF9jb2xfbWF4ID0geC0+bXZfY29sX21heDsKKyAgICAgICAgICAgIGludCB0bXBfcm93X21pbiA9IHgtPm12X3Jvd19taW47CisgICAgICAgICAgICBpbnQgdG1wX3Jvd19tYXggPSB4LT5tdl9yb3dfbWF4OworCisgICAgICAgICAgICBpbnQgc3BlZWRfYWRqdXN0ID0gKGNwaS0+U3BlZWQgPiA1KSA/ICgoY3BpLT5TcGVlZCA+PSA4KT8gMyA6IDIpIDogMTsKKworICAgICAgICAgICAgLyogRnVydGhlciBzdGVwL2RpYW1vbmQgc2VhcmNoZXMgYXMgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBzdGVwX3BhcmFtID0gY3BpLT5zZi5maXJzdF9zdGVwICsgc3BlZWRfYWRqdXN0OworCisjaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgICAgICAgICAgLyogSWYgbG93ZXItcmVzIGRyb3BzIHRoaXMgZnJhbWUsIHRoZW4gaGlnaGVyLXJlcyBlbmNvZGVyIGRvZXMKKyAgICAgICAgICAgICAgIG1vdGlvbiBzZWFyY2ggd2l0aG91dCBhbnkgcHJldmlvdXMga25vd2xlZGdlLiBBbHNvLCBzaW5jZQorICAgICAgICAgICAgICAgbGFzdCBmcmFtZSBtb3Rpb24gaW5mbyBpcyBub3Qgc3RvcmVkLCB0aGVuIHdlIGNhbiBub3QKKyAgICAgICAgICAgICAgIHVzZSBpbXByb3ZlZF9tdl9wcmVkLiAqLworICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5tcl9lbmNvZGVyX2lkICYmICFwYXJlbnRfcmVmX3ZhbGlkKQorICAgICAgICAgICAgICAgIGNwaS0+c2YuaW1wcm92ZWRfbXZfcHJlZCA9IDA7CisKKyAgICAgICAgICAgIGlmIChwYXJlbnRfcmVmX3ZhbGlkICYmIHBhcmVudF9yZWZfZnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVXNlIHBhcmVudCBNViBhcyBwcmVkaWN0b3IuIEFkanVzdCBzZWFyY2ggcmFuZ2UKKyAgICAgICAgICAgICAgICAgKiBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtdnAuYXNfaW50ID0gcGFyZW50X3JlZl9tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgbXZwX2Z1bGwuYXNfbXYuY29sID0gcGFyZW50X3JlZl9tdi5hc19tdi5jb2w+PjM7CisgICAgICAgICAgICAgICAgbXZwX2Z1bGwuYXNfbXYucm93ID0gcGFyZW50X3JlZl9tdi5hc19tdi5yb3c+PjM7CisKKyAgICAgICAgICAgICAgICBpZihkaXNzaW0gPD0zMikgc3RlcF9wYXJhbSArPSAzOworICAgICAgICAgICAgICAgIGVsc2UgaWYoZGlzc2ltIDw9MTI4KSBzdGVwX3BhcmFtICs9IDI7CisgICAgICAgICAgICAgICAgZWxzZSBzdGVwX3BhcmFtICs9IDE7CisgICAgICAgICAgICB9ZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY3BpLT5zZi5pbXByb3ZlZF9tdl9wcmVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIXNhZGRvbmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9jYWxfc2FkKGNwaSx4ZCx4LCByZWNvbl95b2Zmc2V0ICwmbmVhcl9zYWRpZHhbMF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZGRvbmUgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdnA4X212X3ByZWQoY3BpLCAmeC0+ZV9tYmQsIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXZwLHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcywgJnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVhcl9zYWRpZHhbMF0pOworCisgICAgICAgICAgICAgICAgICAgIHNyICs9IHNwZWVkX2FkanVzdDsKKyAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IHNlYXJjaCByYW5nZSBhY2NvcmRpbmcgdG8gc3IgZnJvbSBtdiBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmKHNyID4gc3RlcF9wYXJhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0gPSBzcjsKKworICAgICAgICAgICAgICAgICAgICBtdnBfZnVsbC5hc19tdi5jb2wgPSBtdnAuYXNfbXYuY29sPj4zOworICAgICAgICAgICAgICAgICAgICBtdnBfZnVsbC5hc19tdi5yb3cgPSBtdnAuYXNfbXYucm93Pj4zOworICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtdnAuYXNfaW50ID0gYmVzdF9yZWZfbXYuYXNfaW50OworICAgICAgICAgICAgICAgICAgICBtdnBfZnVsbC5hc19tdi5jb2wgPSBiZXN0X3JlZl9tdi5hc19tdi5jb2w+PjM7CisgICAgICAgICAgICAgICAgICAgIG12cF9mdWxsLmFzX212LnJvdyA9IGJlc3RfcmVmX212LmFzX212LnJvdz4+MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgICAgICAgICBpZiAocGFyZW50X3JlZl92YWxpZCAmJiBwYXJlbnRfcmVmX2ZyYW1lICYmIGRpc3NpbSA8PSAyICYmCisgICAgICAgICAgICAgICAgTUFYKGFicyhiZXN0X3JlZl9tdi5hc19tdi5yb3cgLSBwYXJlbnRfcmVmX212LmFzX212LnJvdyksCisgICAgICAgICAgICAgICAgICAgIGFicyhiZXN0X3JlZl9tdi5hc19tdi5jb2wgLSBwYXJlbnRfcmVmX212LmFzX212LmNvbCkpIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX2ludCA9IG12cF9mdWxsLmFzX2ludDsKKyAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5hc19pbnQgPSBtdnBfZnVsbC5hc19pbnQ7CisKKyAgICAgICAgICAgICAgICBjcGktPmZpbmRfZnJhY3Rpb25hbF9tdl9zdGVwKHgsIGIsIGQsICZkLT5ibWkubXYsICZiZXN0X3JlZl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmVycm9ycGVyYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+bWIubXZjb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3RvcnRpb24yLCZzc2UpOworICAgICAgICAgICAgfWVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEdldCBpbnRlcnNlY3Rpb24gb2YgVU1WIHdpbmRvdyBhbmQgdmFsaWQgTVYgd2luZG93IHRvCisgICAgICAgICAgICAgICAgICogcmVkdWNlICMgb2YgY2hlY2tzIGluIGRpYW1vbmQgc2VhcmNoLiAqLworICAgICAgICAgICAgICAgIGlmICh4LT5tdl9jb2xfbWluIDwgY29sX21pbiApCisgICAgICAgICAgICAgICAgICAgIHgtPm12X2NvbF9taW4gPSBjb2xfbWluOworICAgICAgICAgICAgICAgIGlmICh4LT5tdl9jb2xfbWF4ID4gY29sX21heCApCisgICAgICAgICAgICAgICAgICAgIHgtPm12X2NvbF9tYXggPSBjb2xfbWF4OworICAgICAgICAgICAgICAgIGlmICh4LT5tdl9yb3dfbWluIDwgcm93X21pbiApCisgICAgICAgICAgICAgICAgICAgIHgtPm12X3Jvd19taW4gPSByb3dfbWluOworICAgICAgICAgICAgICAgIGlmICh4LT5tdl9yb3dfbWF4ID4gcm93X21heCApCisgICAgICAgICAgICAgICAgICAgIHgtPm12X3Jvd19tYXggPSByb3dfbWF4OworCisgICAgICAgICAgICAgICAgZnVydGhlcl9zdGVwcyA9IChjcGktPlNwZWVkID49IDgpPworICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogKGNwaS0+c2YubWF4X3N0ZXBfc2VhcmNoX3N0ZXBzIC0gMSAtIHN0ZXBfcGFyYW0pOworCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+c2Yuc2VhcmNoX21ldGhvZCA9PSBIRVgpCisgICAgICAgICAgICAgICAgeworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBJbiBoaWdoZXItcmVzIHBpY2tfaW50ZXJfbW9kZSwgc3RlcF9wYXJhbSBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgICogbW9kaWZ5IGhleCBzZWFyY2ggcmFuZ2UuIEhlcmUsIHNldCBzdGVwX3BhcmFtIHRvIDAgbm90IHRvCisgICAgICAgICAgICAgICAgICogY2hhbmdlIHRoZSBiZWhhdmlvciBpbiBsb3dlc3QtcmVzb2x1dGlvbiBlbmNvZGVyLgorICAgICAgICAgICAgICAgICAqIFdpbGwgaW1wcm92ZSBpdCBsYXRlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgLyogU2V0IHN0ZXBfcGFyYW0gdG8gMCB0byBlbnN1cmUgbGFyZ2UtcmFuZ2UgbW90aW9uIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICB3aGVuIGVuY29kZXIgZHJvcHMgdGhpcyBmcmFtZSBhdCBsb3dlci1yZXNvbHV0aW9uLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBhcmVudF9yZWZfdmFsaWQpCisgICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0gPSAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJlc3RzbWUgPSB2cDhfaGV4X3NlYXJjaCh4LCBiLCBkLCAmbXZwX2Z1bGwsICZkLT5ibWkubXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwX3BhcmFtLCBzYWRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5tdnNhZGNvc3QsIHgtPm12Y29zdCwgJmJlc3RfcmVmX212KTsKKyAgICAgICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0uYXNfaW50ID0gZC0+Ym1pLm12LmFzX2ludDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkKHgsIGIsIGQsICZtdnBfZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5ibWkubXYsIHN0ZXBfcGFyYW0sIHNhZHBiLCAmbnVtMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+bXZjb3N0LCAmYmVzdF9yZWZfbXYpOworICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5hc19pbnQgPSBkLT5ibWkubXYuYXNfaW50OworCisgICAgICAgICAgICAgICAgICAgIC8qIEZ1cnRoZXIgc3RlcC9kaWFtb25kIHNlYXJjaGVzIGFzIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgICAgICBuID0gbnVtMDA7CisgICAgICAgICAgICAgICAgICAgIG51bTAwID0gMDsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobiA8IGZ1cnRoZXJfc3RlcHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bTAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTAwLS07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc3NtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYiwgZCwgJm12cF9mdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5ibWkubXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcF9wYXJhbSArIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FkcGIsICZudW0wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPm12Y29zdCwgJmJlc3RfcmVmX212KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NtZSA8IGJlc3RzbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdGhpc3NtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0uYXNfaW50ID0gZC0+Ym1pLm12LmFzX2ludDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX2ludCA9IG1vZGVfbXZbTkVXTVZdLmFzX2ludDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWluID0gdG1wX2NvbF9taW47CisgICAgICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IHRtcF9jb2xfbWF4OworICAgICAgICAgICAgICAgIHgtPm12X3Jvd19taW4gPSB0bXBfcm93X21pbjsKKyAgICAgICAgICAgICAgICB4LT5tdl9yb3dfbWF4ID0gdG1wX3Jvd19tYXg7CisKKyAgICAgICAgICAgICAgICBpZiAoYmVzdHNtZSA8IElOVF9NQVgpCisgICAgICAgICAgICAgICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAoeCwgYiwgZCwgJmQtPmJtaS5tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiZXN0X3JlZl9tdiwgeC0+ZXJyb3JwZXJiaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5tYi5tdmNvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzdG9ydGlvbjIsJnNzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGVfbXZbTkVXTVZdLmFzX2ludCA9IGQtPmJtaS5tdi5hc19pbnQ7CisKKyAgICAgICAgICAgIC8qIG12IGNvc3Q7ICovCisgICAgICAgICAgICByYXRlMiArPSB2cDhfbXZfYml0X2Nvc3QoJm1vZGVfbXZbTkVXTVZdLCAmYmVzdF9yZWZfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5tYi5tdmNvc3QsIDEyOCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE5FQVJFU1RNVjoKKyAgICAgICAgY2FzZSBORUFSTVY6CisKKyAgICAgICAgICAgIGlmIChtb2RlX212W3RoaXNfbW9kZV0uYXNfaW50ID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY2FzZSBaRVJPTVY6CisKKyAgICAgICAgICAgIC8qIFRyYXAgdmVjdG9ycyB0aGF0IHJlYWNoIGJleW9uZCB0aGUgVU1WIGJvcmRlcnMKKyAgICAgICAgICAgICAqIE5vdGUgdGhhdCBBTEwgTmV3IE1WLCBOZWFyZXN0IE1WIE5lYXIgTVYgYW5kIFplcm8gTVYgY29kZSBkcm9wcworICAgICAgICAgICAgICogdGhyb3VnaCB0byB0aGlzIHBvaW50IGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgYnJlYWsgc3RhdGVtZW50cworICAgICAgICAgICAgICogaW4gdGhlIHByZXZpb3VzIHR3byBjYXNlcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCgobW9kZV9tdlt0aGlzX21vZGVdLmFzX212LnJvdyA+PiAzKSA8IHgtPm12X3Jvd19taW4pIHx8CisgICAgICAgICAgICAgICAgKChtb2RlX212W3RoaXNfbW9kZV0uYXNfbXYucm93ID4+IDMpID4geC0+bXZfcm93X21heCkgfHwKKyAgICAgICAgICAgICAgICAoKG1vZGVfbXZbdGhpc19tb2RlXS5hc19tdi5jb2wgPj4gMykgPCB4LT5tdl9jb2xfbWluKSB8fAorICAgICAgICAgICAgICAgICgobW9kZV9tdlt0aGlzX21vZGVdLmFzX212LmNvbCA+PiAzKSA+IHgtPm12X2NvbF9tYXgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICByYXRlMiArPSB2cDhfY29zdF9tdl9yZWYodGhpc19tb2RlLCBtZGNvdW50cyk7CisgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19pbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbdGhpc19tb2RlXS5hc19pbnQ7CisgICAgICAgICAgICB0aGlzX3JkID0gZXZhbHVhdGVfaW50ZXJfbW9kZSgmc3NlLCByYXRlMiwgJmRpc3RvcnRpb24yLCBjcGksIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF9hZGp1c3RtZW50KTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWYgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORworICAgICAgICBpZiAoY3BpLT5veGNmLm5vaXNlX3NlbnNpdGl2aXR5KQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qIFN0b3JlIGZvciBsYXRlciB1c2UgYnkgZGVub2lzZXIuICovCisgICAgICAgICAgICBpZiAodGhpc19tb2RlID09IFpFUk9NViAmJiBzc2UgPCB6ZXJvX212X3NzZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemVyb19tdl9zc2UgPSBzc2U7CisgICAgICAgICAgICAgICAgeC0+YmVzdF96ZXJvbXZfcmVmZXJlbmNlX2ZyYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU3RvcmUgdGhlIGJlc3QgTkVXTVYgaW4geCBmb3IgbGF0ZXIgdXNlIGluIHRoZSBkZW5vaXNlci4gKi8KKyAgICAgICAgICAgIGlmICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IE5FV01WICYmCisgICAgICAgICAgICAgICAgICAgIHNzZSA8IGJlc3Rfc3NlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlc3Rfc3NlID0gc3NlOworICAgICAgICAgICAgICAgIHgtPmJlc3Rfc3NlX2ludGVyX21vZGUgPSBORVdNVjsKKyAgICAgICAgICAgICAgICB4LT5iZXN0X3NzZV9tdiA9IHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12OworICAgICAgICAgICAgICAgIHgtPm5lZWRfdG9fY2xhbXBfYmVzdF9tdnMgPQorICAgICAgICAgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5uZWVkX3RvX2NsYW1wX212czsKKyAgICAgICAgICAgICAgICB4LT5iZXN0X3JlZmVyZW5jZV9mcmFtZSA9CisgICAgICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X3JkIHx8IHgtPnNraXApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vdGUgaW5kZXggb2YgYmVzdCBtb2RlICovCisgICAgICAgICAgICBiZXN0X21vZGVfaW5kZXggPSBtb2RlX2luZGV4OworCisgICAgICAgICAgICAqcmV0dXJucmF0ZSA9IHJhdGUyOworICAgICAgICAgICAgKnJldHVybmRpc3RvcnRpb24gPSBkaXN0b3J0aW9uMjsKKyAgICAgICAgICAgIGJlc3RfcmRfc3NlID0gc3NlOworICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7CisgICAgICAgICAgICB2cHhfbWVtY3B5KCZiZXN0X21ibW9kZSwgJngtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTUJfTU9ERV9JTkZPKSk7CisKKyAgICAgICAgICAgIC8qIFRlc3RpbmcgdGhpcyBtb2RlIGdhdmUgcmlzZSB0byBhbiBpbXByb3ZlbWVudCBpbiBiZXN0IGVycm9yCisgICAgICAgICAgICAgKiBzY29yZS4gTG93ZXIgdGhyZXNob2xkIGEgYml0IGZvciBuZXh0IHRpbWUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA9CisgICAgICAgICAgICAgICAgICAgICAoY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA+PSAoTUlOX1RIUkVTSE1VTFQgKyAyKSkgPworICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSAtIDIgOiBNSU5fVEhSRVNITVVMVDsKKyAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIG1vZGUgZGlkIG5vdCBoZWxwIGltcHJvdmUgdGhlIGJlc3QgZXJyb3IgY2FzZSB0aGVuIHJhaXNlIHRoZQorICAgICAgICAgKiB0aHJlc2hvbGQgZm9yIHRlc3RpbmcgdGhhdCBtb2RlIG5leHQgdGltZSBhcm91bmQuCisgICAgICAgICAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gKz0gNDsKKworICAgICAgICAgICAgaWYgKGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPiBNQVhfVEhSRVNITVVMVCkKKyAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gTUFYX1RIUkVTSE1VTFQ7CisKKyAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFttb2RlX2luZGV4XSA+PiA3KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4LT5za2lwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogUmVkdWNlIHRoZSBhY3RpdmF0aW9uIFJEIHRocmVzaG9sZHMgZm9yIHRoZSBiZXN0IGNob2ljZSBtb2RlICovCisgICAgaWYgKChjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFtiZXN0X21vZGVfaW5kZXhdID4gMCkgJiYgKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW2Jlc3RfbW9kZV9pbmRleF0gPCAoSU5UX01BWCA+PiAyKSkpCisgICAgeworICAgICAgICBpbnQgYmVzdF9hZGp1c3RtZW50ID0gKGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XSA+PiAzKTsKKworICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W2Jlc3RfbW9kZV9pbmRleF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgPj0gKE1JTl9USFJFU0hNVUxUICsgYmVzdF9hZGp1c3RtZW50KSkgPworICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtiZXN0X21vZGVfaW5kZXhdIC0gYmVzdF9hZGp1c3RtZW50IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JTl9USFJFU0hNVUxUOworICAgICAgICBjcGktPnJkX3RocmVzaGVzW2Jlc3RfbW9kZV9pbmRleF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW2Jlc3RfbW9kZV9pbmRleF0gPj4gNykgKgorICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtiZXN0X21vZGVfaW5kZXhdOworICAgIH0KKworCisgICAgeworICAgICAgICBpbnQgdGhpc19yZGJpbiA9ICgqcmV0dXJuZGlzdG9ydGlvbiA+PiA3KTsKKworICAgICAgICBpZiAodGhpc19yZGJpbiA+PSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzX3JkYmluID0gMTAyMzsKKyAgICAgICAgfQorCisgICAgICAgIGNwaS0+ZXJyb3JfYmluc1t0aGlzX3JkYmluXSArKzsKKyAgICB9CisKKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisgICAgaWYgKGNwaS0+b3hjZi5ub2lzZV9zZW5zaXRpdml0eSkKKyAgICB7CisgICAgICAgIGlmICh4LT5iZXN0X3NzZV9pbnRlcl9tb2RlID09IERDX1BSRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vIGJlc3QgTVYgZm91bmQuICovCisgICAgICAgICAgICB4LT5iZXN0X3NzZV9pbnRlcl9tb2RlID0gYmVzdF9tYm1vZGUubW9kZTsKKyAgICAgICAgICAgIHgtPmJlc3Rfc3NlX212ID0gYmVzdF9tYm1vZGUubXY7CisgICAgICAgICAgICB4LT5uZWVkX3RvX2NsYW1wX2Jlc3RfbXZzID0gYmVzdF9tYm1vZGUubmVlZF90b19jbGFtcF9tdnM7CisgICAgICAgICAgICB4LT5iZXN0X3JlZmVyZW5jZV9mcmFtZSA9IGJlc3RfbWJtb2RlLnJlZl9mcmFtZTsKKyAgICAgICAgICAgIGJlc3Rfc3NlID0gYmVzdF9yZF9zc2U7CisgICAgICAgIH0KKyAgICAgICAgdnA4X2Rlbm9pc2VyX2Rlbm9pc2VfbWIoJmNwaS0+ZGVub2lzZXIsIHgsIGJlc3Rfc3NlLCB6ZXJvX212X3NzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQpOworCisKKyAgICAgICAgLyogUmVldmFsdWF0ZSBaRVJPTVYgYWZ0ZXIgZGVub2lzaW5nLiAqLworICAgICAgICBpZiAoYmVzdF9tYm1vZGUucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FICYmCisgICAgICAgICAgICB4LT5iZXN0X3plcm9tdl9yZWZlcmVuY2VfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0aGlzX3JkID0gMDsKKyAgICAgICAgICAgIGludCB0aGlzX3JlZl9mcmFtZSA9IHgtPmJlc3RfemVyb212X3JlZmVyZW5jZV9mcmFtZTsKKyAgICAgICAgICAgIHJhdGUyID0geC0+cmVmX2ZyYW1lX2Nvc3RbdGhpc19yZWZfZnJhbWVdICsKKyAgICAgICAgICAgICAgICAgICAgdnA4X2Nvc3RfbXZfcmVmKFpFUk9NViwgbWRjb3VudHMpOworICAgICAgICAgICAgZGlzdG9ydGlvbjIgPSAwOworCisgICAgICAgICAgICAvKiBzZXQgdXAgdGhlIHByb3BlciBwcmVkaWN0aW9uIGJ1ZmZlcnMgZm9yIHRoZSBmcmFtZSAqLworICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gdGhpc19yZWZfZnJhbWU7CisgICAgICAgICAgICB4LT5lX21iZC5wcmUueV9idWZmZXIgPSBwbGFuZVt0aGlzX3JlZl9mcmFtZV1bMF07CisgICAgICAgICAgICB4LT5lX21iZC5wcmUudV9idWZmZXIgPSBwbGFuZVt0aGlzX3JlZl9mcmFtZV1bMV07CisgICAgICAgICAgICB4LT5lX21iZC5wcmUudl9idWZmZXIgPSBwbGFuZVt0aGlzX3JlZl9mcmFtZV1bMl07CisKKyAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBaRVJPTVY7CisgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gRENfUFJFRDsKKyAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX2ludCA9IDA7CisgICAgICAgICAgICB0aGlzX3JkID0gZXZhbHVhdGVfaW50ZXJfbW9kZSgmc3NlLCByYXRlMiwgJmRpc3RvcnRpb24yLCBjcGksIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF9hZGp1c3RtZW50KTsKKworICAgICAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoJmJlc3RfbWJtb2RlLCAmeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTUJfTU9ERV9JTkZPKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgJiYKKyAgICAgICAgKGJlc3RfbWJtb2RlLm1vZGUgIT0gWkVST01WIHx8IGJlc3RfbWJtb2RlLnJlZl9mcmFtZSAhPSBBTFRSRUZfRlJBTUUpKQorICAgIHsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IFpFUk9NVjsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gQUxUUkVGX0ZSQU1FOworICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19pbnQgPSAwOworICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gRENfUFJFRDsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApOworICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5wYXJ0aXRpb25pbmcgPSAwOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBzZXQgdG8gdGhlIGJlc3QgbWIgbW9kZSwgdGhpcyBjb3B5IGNhbiBiZSBza2lwIGlmIHgtPnNraXAgc2luY2UgaXQKKyAgICAgKiBhbHJlYWR5IGhhcyB0aGUgcmlnaHQgY29udGVudCAqLworICAgIGlmICgheC0+c2tpcCkKKyAgICAgICAgdnB4X21lbWNweSgmeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWksICZiZXN0X21ibW9kZSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoTUJfTU9ERV9JTkZPKSk7CisKKyAgICBpZiAoYmVzdF9tYm1vZGUubW9kZSA8PSBCX1BSRUQpCisgICAgeworICAgICAgICAvKiBzZXQgbW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSAqLworICAgICAgICBwaWNrX2ludHJhX21idXZfbW9kZSh4KTsKKyAgICB9CisKKyAgICBpZiAoc2lnbl9iaWFzCisgICAgICAhPSBjcGktPmNvbW1vbi5yZWZfZnJhbWVfc2lnbl9iaWFzW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdKQorICAgICAgICBiZXN0X3JlZl9tdi5hc19pbnQgPSBiZXN0X3JlZl9tdl9zYlshc2lnbl9iaWFzXS5hc19pbnQ7CisKKyAgICB1cGRhdGVfbXZjb3VudChjcGksIHgsICZiZXN0X3JlZl9tdik7Cit9CisKKwordm9pZCB2cDhfcGlja19pbnRyYV9tb2RlKE1BQ1JPQkxPQ0sgKngsIGludCAqcmF0ZV8pCit7CisgICAgaW50IGVycm9yNHg0LCBlcnJvcjE2eDE2ID0gSU5UX01BWDsKKyAgICBpbnQgcmF0ZSwgYmVzdF9yYXRlID0gMCwgZGlzdG9ydGlvbiwgYmVzdF9zc2U7CisgICAgTUJfUFJFRElDVElPTl9NT0RFIG1vZGUsIGJlc3RfbW9kZSA9IERDX1BSRUQ7CisgICAgaW50IHRoaXNfcmQ7CisgICAgdW5zaWduZWQgaW50IHNzZTsKKyAgICBCTE9DSyAqYiA9ICZ4LT5ibG9ja1swXTsKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisKKyAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7CisKKyAgICBwaWNrX2ludHJhX21idXZfbW9kZSh4KTsKKworICAgIGZvciAobW9kZSA9IERDX1BSRUQ7IG1vZGUgPD0gVE1fUFJFRDsgbW9kZSArKykKKyAgICB7CisgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gbW9kZTsKKyAgICAgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MoeGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPnByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICBkaXN0b3J0aW9uID0gdnA4X3ZhcmlhbmNlMTZ4MTYKKyAgICAgICAgICAgICgqKGItPmJhc2Vfc3JjKSwgYi0+c3JjX3N0cmlkZSwgeGQtPnByZWRpY3RvciwgMTYsICZzc2UpOworICAgICAgICByYXRlID0geC0+bWJtb2RlX2Nvc3RbeGQtPmZyYW1lX3R5cGVdW21vZGVdOworICAgICAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUsIGRpc3RvcnRpb24pOworCisgICAgICAgIGlmIChlcnJvcjE2eDE2ID4gdGhpc19yZCkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3IxNngxNiA9IHRoaXNfcmQ7CisgICAgICAgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgICAgICAgICAgYmVzdF9zc2UgPSBzc2U7CisgICAgICAgICAgICBiZXN0X3JhdGUgPSByYXRlOworICAgICAgICB9CisgICAgfQorICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gYmVzdF9tb2RlOworCisgICAgZXJyb3I0eDQgPSBwaWNrX2ludHJhNHg0bWJ5X21vZGVzKHgsICZyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVzdF9zc2UpOworICAgIGlmIChlcnJvcjR4NCA8IGVycm9yMTZ4MTYpCisgICAgeworICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IEJfUFJFRDsKKyAgICAgICAgYmVzdF9yYXRlID0gcmF0ZTsKKyAgICB9CisKKyAgICAqcmF0ZV8gPSBiZXN0X3JhdGU7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvcGlja2ludGVyLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvcGlja2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwMTFjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9waWNraW50ZXIuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19QSUNLSU5URVJfSAorI2RlZmluZSBfX0lOQ19QSUNLSU5URVJfSAorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhjX2ludC5oIgorCitleHRlcm4gdm9pZCB2cDhfcGlja19pbnRlcl9tb2RlKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCByZWNvbl95b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb25fdXZvZmZzZXQsIGludCAqcmV0dXJucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZXR1cm5kaXN0b3J0aW9uLCBpbnQgKnJldHVybmludHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LCBpbnQgbWJfY29sKTsKK2V4dGVybiB2b2lkIHZwOF9waWNrX2ludHJhX21vZGUoTUFDUk9CTE9DSyAqeCwgaW50ICpyYXRlKTsKKworZXh0ZXJuIGludCB2cDhfZ2V0X2ludGVyX21icHJlZF9lcnJvcihNQUNST0JMT0NLICptYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICp2ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfbXYgdGhpc19tdik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9waWNrbHBmLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvcGlja2xwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjEzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvcGlja2xwZi5jCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCisjaW5jbHVkZSAib255eF9pbnQuaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vYWxsb2Njb21tb24uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaCIKKyNpZiBBUkNIX0FSTQorI2luY2x1ZGUgInZweF9wb3J0cy9hcm0uaCIKKyNlbmRpZgorCitleHRlcm4gaW50IHZwOF9jYWxjX3NzX2VycihZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0KTsKKwordm9pZCB2cDhfeXYxMl9jb3B5X3BhcnRpYWxfZnJhbWVfYyhZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYykKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpzcmNfeSwgKmRzdF95OworICAgIGludCB5aGVpZ2h0OworICAgIGludCB5c3RyaWRlOworICAgIGludCB5b2Zmc2V0OworICAgIGludCBsaW5lc3RvY29weTsKKworICAgIHloZWlnaHQgID0gc3JjX3liYy0+eV9oZWlnaHQ7CisgICAgeXN0cmlkZSAgPSBzcmNfeWJjLT55X3N0cmlkZTsKKworICAgIC8qIG51bWJlciBvZiBNQiByb3dzIHRvIHVzZSBpbiBwYXJ0aWFsIGZpbHRlcmluZyAqLworICAgIGxpbmVzdG9jb3B5ID0gKHloZWlnaHQgPj4gNCkgLyBQQVJUSUFMX0ZSQU1FX0ZSQUNUSU9OOworICAgIGxpbmVzdG9jb3B5ID0gbGluZXN0b2NvcHkgPyBsaW5lc3RvY29weSA8PCA0IDogMTY7ICAgICAvKiAxNiBsaW5lcyBwZXIgTUIgKi8KKworICAgIC8qIENvcHkgZXh0cmEgNCBzbyB0aGF0IGZ1bGwgZmlsdGVyIGNvbnRleHQgaXMgYXZhaWxhYmxlIGlmIGZpbHRlcmluZyBkb25lCisgICAgICogb24gdGhlIGNvcGllZCBwYXJ0aWFsIGZyYW1lIGFuZCBub3Qgb3JpZ2luYWwuIFBhcnRpYWwgZmlsdGVyIGRvZXMgbWIKKyAgICAgKiBmaWx0ZXJpbmcgZm9yIHRvcCByb3cgYWxzbywgd2hpY2ggY2FuIG1vZGlmeTMgcGl4ZWxzIGFib3ZlLgorICAgICAqLworICAgIGxpbmVzdG9jb3B5ICs9IDQ7CisgICAgLyogcGFydGlhbCBpbWFnZSBzdGFydHMgYXQgfm1pZGRsZSBvZiBmcmFtZSAobWFjcm9ibG9jayBib3JkZXIpKi8KKyAgICB5b2Zmc2V0ICA9IHlzdHJpZGUgKiAoKCh5aGVpZ2h0ID4+IDUpICogMTYpIC0gNCk7CisgICAgc3JjX3kgPSBzcmNfeWJjLT55X2J1ZmZlciArIHlvZmZzZXQ7CisgICAgZHN0X3kgPSBkc3RfeWJjLT55X2J1ZmZlciArIHlvZmZzZXQ7CisKKyAgICB2cHhfbWVtY3B5KGRzdF95LCBzcmNfeSwgeXN0cmlkZSAqIGxpbmVzdG9jb3B5KTsKK30KKworc3RhdGljIGludCBjYWxjX3BhcnRpYWxfc3NsX2VycihZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0KQoreworICAgIGludCBpLCBqOworICAgIGludCBUb3RhbCA9IDA7CisgICAgaW50IHNyY29mZnNldCwgZHN0b2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZS0+eV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciAqZHN0ID0gZGVzdC0+eV9idWZmZXI7CisKKyAgICBpbnQgbGluZXN0b2NvcHk7CisKKyAgICAvKiBudW1iZXIgb2YgTUIgcm93cyB0byB1c2UgaW4gcGFydGlhbCBmaWx0ZXJpbmcgKi8KKyAgICBsaW5lc3RvY29weSA9IChzb3VyY2UtPnlfaGVpZ2h0ID4+IDQpIC8gUEFSVElBTF9GUkFNRV9GUkFDVElPTjsKKyAgICBsaW5lc3RvY29weSA9IGxpbmVzdG9jb3B5ID8gbGluZXN0b2NvcHkgPDwgNCA6IDE2OyAgICAgLyogMTYgbGluZXMgcGVyIE1CICovCisKKworICAgIC8qIHBhcnRpYWwgaW1hZ2Ugc3RhcnRzIGF0IH5taWRkbGUgb2YgZnJhbWUgKG1hY3JvYmxvY2sgYm9yZGVyKSovCisgICAgc3Jjb2Zmc2V0ID0gc291cmNlLT55X3N0cmlkZSAqICgoZGVzdC0+eV9oZWlnaHQgPj4gNSkgKiAxNik7CisgICAgZHN0b2Zmc2V0ID0gZGVzdC0+eV9zdHJpZGUgICAqICgoZGVzdC0+eV9oZWlnaHQgPj4gNSkgKiAxNik7CisKKyAgICBzcmMgKz0gc3Jjb2Zmc2V0OworICAgIGRzdCArPSBkc3RvZmZzZXQ7CisKKyAgICAvKiBMb29wIHRocm91Z2ggdGhlIFkgcGxhbmUgcmF3IGFuZCByZWNvbnN0cnVjdGlvbiBkYXRhIHN1bW1pbmcKKyAgICAgKiAoc3F1YXJlIGRpZmZlcmVuY2VzKQorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc3RvY29weTsgaSArPSAxNikKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzb3VyY2UtPnlfd2lkdGg7IGogKz0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzc2U7CisgICAgICAgICAgICBUb3RhbCArPSB2cDhfbXNlMTZ4MTYoc3JjICsgaiwgc291cmNlLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgaiwgZGVzdC0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzc2UpOworICAgICAgICB9CisKKyAgICAgICAgc3JjICs9IDE2ICogc291cmNlLT55X3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IDE2ICogZGVzdC0+eV9zdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIFRvdGFsOworfQorCisvKiBFbmZvcmNlIGEgbWluaW11bSBmaWx0ZXIgbGV2ZWwgYmFzZWQgdXBvbiBiYXNlbGluZSBRICovCitzdGF0aWMgaW50IGdldF9taW5fZmlsdGVyX2xldmVsKFZQOF9DT01QICpjcGksIGludCBiYXNlX3FpbmRleCkKK3sKKyAgICBpbnQgbWluX2ZpbHRlcl9sZXZlbDsKKworICAgIGlmIChjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSAmJiBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSAmJgorICAgICAgICAhY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICBtaW5fZmlsdGVyX2xldmVsID0gMDsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoYmFzZV9xaW5kZXggPD0gNikKKyAgICAgICAgICAgIG1pbl9maWx0ZXJfbGV2ZWwgPSAwOworICAgICAgICBlbHNlIGlmIChiYXNlX3FpbmRleCA8PSAxNikKKyAgICAgICAgICAgIG1pbl9maWx0ZXJfbGV2ZWwgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtaW5fZmlsdGVyX2xldmVsID0gKGJhc2VfcWluZGV4IC8gOCk7CisgICAgfQorCisgICAgcmV0dXJuIG1pbl9maWx0ZXJfbGV2ZWw7Cit9CisKKy8qIEVuZm9yY2UgYSBtYXhpbXVtIGZpbHRlciBsZXZlbCBiYXNlZCB1cG9uIGJhc2VsaW5lIFEgKi8KK3N0YXRpYyBpbnQgZ2V0X21heF9maWx0ZXJfbGV2ZWwoVlA4X0NPTVAgKmNwaSwgaW50IGJhc2VfcWluZGV4KQoreworICAgIC8qIFBHVyBBdWd1c3QgMjAwNjogSGlnaGVzdCBmaWx0ZXIgdmFsdWVzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYSAqLworCisgICAgLyogamJiIGNoZzogMjAxMDAxMTggLSBub3Qgc28gYW55IG1vcmUgd2l0aCB0aGlzIG92ZXJxdWFudCBzdHVmZiBhbGxvdworICAgICAqIGhpZ2ggdmFsdWVzIHdpdGggbG90cyBvZiBpbnRyYSBjb21pbmcgaW4uCisgICAgICovCisgICAgaW50IG1heF9maWx0ZXJfbGV2ZWwgPSBNQVhfTE9PUF9GSUxURVI7CisgICAgKHZvaWQpYmFzZV9xaW5kZXg7CisKKyAgICBpZiAoY3BpLT50d29wYXNzLnNlY3Rpb25faW50cmFfcmF0aW5nID4gOCkKKyAgICAgICAgbWF4X2ZpbHRlcl9sZXZlbCA9IE1BWF9MT09QX0ZJTFRFUiAqIDMgLyA0OworCisgICAgcmV0dXJuIG1heF9maWx0ZXJfbGV2ZWw7Cit9CisKK3ZvaWQgdnA4Y3hfcGlja19maWx0ZXJfbGV2ZWxfZmFzdChZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBWUDhfQ09NUCAqY3BpKQoreworICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOworCisgICAgaW50IGJlc3RfZXJyID0gMDsKKyAgICBpbnQgZmlsdF9lcnIgPSAwOworICAgIGludCBtaW5fZmlsdGVyX2xldmVsID0gZ2V0X21pbl9maWx0ZXJfbGV2ZWwoY3BpLCBjbS0+YmFzZV9xaW5kZXgpOworICAgIGludCBtYXhfZmlsdGVyX2xldmVsID0gZ2V0X21heF9maWx0ZXJfbGV2ZWwoY3BpLCBjbS0+YmFzZV9xaW5kZXgpOworICAgIGludCBmaWx0X3ZhbDsKKyAgICBpbnQgYmVzdF9maWx0X3ZhbCA9IGNtLT5maWx0ZXJfbGV2ZWw7CisgICAgWVYxMl9CVUZGRVJfQ09ORklHICogc2F2ZWRfZnJhbWUgPSBjbS0+ZnJhbWVfdG9fc2hvdzsKKworICAgIC8qIFJlcGxhY2UgdW5maWx0ZXJlZCBmcmFtZSBidWZmZXIgd2l0aCBhIG5ldyBvbmUgKi8KKyAgICBjbS0+ZnJhbWVfdG9fc2hvdyA9ICZjcGktPnBpY2tfbGZfbHZsX2ZyYW1lOworCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgY20tPnNoYXJwbmVzc19sZXZlbCA9IDA7CisgICAgZWxzZQorICAgICAgICBjbS0+c2hhcnBuZXNzX2xldmVsID0gY3BpLT5veGNmLlNoYXJwbmVzczsKKworICAgIGlmIChjbS0+c2hhcnBuZXNzX2xldmVsICE9IGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCkKKyAgICB7CisgICAgICAgIHZwOF9sb29wX2ZpbHRlcl91cGRhdGVfc2hhcnBuZXNzKCZjbS0+bGZfaW5mbywgY20tPnNoYXJwbmVzc19sZXZlbCk7CisgICAgICAgIGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGNtLT5zaGFycG5lc3NfbGV2ZWw7CisgICAgfQorCisgICAgLyogU3RhcnQgdGhlIHNlYXJjaCBhdCB0aGUgcHJldmlvdXMgZnJhbWUgZmlsdGVyIGxldmVsIHVubGVzcyBpdCBpcworICAgICAqIG5vdyBvdXQgb2YgcmFuZ2UuCisgICAgICovCisgICAgaWYgKGNtLT5maWx0ZXJfbGV2ZWwgPCBtaW5fZmlsdGVyX2xldmVsKQorICAgICAgICBjbS0+ZmlsdGVyX2xldmVsID0gbWluX2ZpbHRlcl9sZXZlbDsKKyAgICBlbHNlIGlmIChjbS0+ZmlsdGVyX2xldmVsID4gbWF4X2ZpbHRlcl9sZXZlbCkKKyAgICAgICAgY20tPmZpbHRlcl9sZXZlbCA9IG1heF9maWx0ZXJfbGV2ZWw7CisKKyAgICBmaWx0X3ZhbCA9IGNtLT5maWx0ZXJfbGV2ZWw7CisgICAgYmVzdF9maWx0X3ZhbCA9IGZpbHRfdmFsOworCisgICAgLyogR2V0IHRoZSBlcnIgdXNpbmcgdGhlIHByZXZpb3VzIGZyYW1lJ3MgZmlsdGVyIHZhbHVlLiAqLworCisgICAgLyogQ29weSB0aGUgdW5maWx0ZXJlZCAvIHByb2Nlc3NlZCByZWNvbiBidWZmZXIgdG8gdGhlIG5ldyBidWZmZXIgKi8KKyAgICB2cDhfeXYxMl9jb3B5X3BhcnRpYWxfZnJhbWUoc2F2ZWRfZnJhbWUsIGNtLT5mcmFtZV90b19zaG93KTsKKyAgICB2cDhfbG9vcF9maWx0ZXJfcGFydGlhbF9mcmFtZShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfdmFsKTsKKworICAgIGJlc3RfZXJyID0gY2FsY19wYXJ0aWFsX3NzbF9lcnIoc2QsIGNtLT5mcmFtZV90b19zaG93KTsKKworICAgIGZpbHRfdmFsIC09IDEgKyAoZmlsdF92YWwgPiAxMCk7CisKKyAgICAvKiBTZWFyY2ggbG93ZXIgZmlsdGVyIGxldmVscyAqLworICAgIHdoaWxlIChmaWx0X3ZhbCA+PSBtaW5fZmlsdGVyX2xldmVsKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgdGhlIGxvb3AgZmlsdGVyICovCisgICAgICAgIHZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZShzYXZlZF9mcmFtZSwgY20tPmZyYW1lX3RvX3Nob3cpOworICAgICAgICB2cDhfbG9vcF9maWx0ZXJfcGFydGlhbF9mcmFtZShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfdmFsKTsKKworICAgICAgICAvKiBHZXQgdGhlIGVyciBmb3IgZmlsdGVyZWQgZnJhbWUgKi8KKyAgICAgICAgZmlsdF9lcnIgPSBjYWxjX3BhcnRpYWxfc3NsX2VycihzZCwgY20tPmZyYW1lX3RvX3Nob3cpOworCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmVzdCBjYXNlIHJlY29yZCBvciBleGl0IGxvb3AuICovCisgICAgICAgIGlmIChmaWx0X2VyciA8IGJlc3RfZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0X2VyciA9IGZpbHRfZXJyOworICAgICAgICAgICAgYmVzdF9maWx0X3ZhbCA9IGZpbHRfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIEFkanVzdCBmaWx0ZXIgbGV2ZWwgKi8KKyAgICAgICAgZmlsdF92YWwgLT0gMSArIChmaWx0X3ZhbCA+IDEwKTsKKyAgICB9CisKKyAgICAvKiBTZWFyY2ggdXAgKG5vdGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZG9uZSBmaWx0X3ZhbCA9IGNtLT5maWx0ZXJfbGV2ZWwpICovCisgICAgZmlsdF92YWwgPSBjbS0+ZmlsdGVyX2xldmVsICsgMSArIChmaWx0X3ZhbCA+IDEwKTsKKworICAgIGlmIChiZXN0X2ZpbHRfdmFsID09IGNtLT5maWx0ZXJfbGV2ZWwpCisgICAgeworICAgICAgICAvKiBSZXNpc3QgcmFpc2luZyBmaWx0ZXIgbGV2ZWwgZm9yIHZlcnkgc21hbGwgZ2FpbnMgKi8KKyAgICAgICAgYmVzdF9lcnIgLT0gKGJlc3RfZXJyID4+IDEwKTsKKworICAgICAgICB3aGlsZSAoZmlsdF92YWwgPCBtYXhfZmlsdGVyX2xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBcHBseSB0aGUgbG9vcCBmaWx0ZXIgKi8KKyAgICAgICAgICAgIHZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZShzYXZlZF9mcmFtZSwgY20tPmZyYW1lX3RvX3Nob3cpOworCisgICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfcGFydGlhbF9mcmFtZShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfdmFsKTsKKworICAgICAgICAgICAgLyogR2V0IHRoZSBlcnIgZm9yIGZpbHRlcmVkIGZyYW1lICovCisgICAgICAgICAgICBmaWx0X2VyciA9IGNhbGNfcGFydGlhbF9zc2xfZXJyKHNkLCBjbS0+ZnJhbWVfdG9fc2hvdyk7CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmVzdCBjYXNlIHJlY29yZCBvciBleGl0IGxvb3AuICovCisgICAgICAgICAgICBpZiAoZmlsdF9lcnIgPCBiZXN0X2VycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBEbyBub3QgcmFpc2UgZmlsdGVyIGxldmVsIGlmIGltcHJvdmVtZW50IGlzIDwgMSBwYXJ0CisgICAgICAgICAgICAgICAgICogaW4gNDA5NgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJlc3RfZXJyID0gZmlsdF9lcnIgLSAoZmlsdF9lcnIgPj4gMTApOworCisgICAgICAgICAgICAgICAgYmVzdF9maWx0X3ZhbCA9IGZpbHRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBBZGp1c3QgZmlsdGVyIGxldmVsICovCisgICAgICAgICAgICBmaWx0X3ZhbCArPSAxICsgKGZpbHRfdmFsID4gMTApOworICAgICAgICB9CisgICAgfQorCisgICAgY20tPmZpbHRlcl9sZXZlbCA9IGJlc3RfZmlsdF92YWw7CisKKyAgICBpZiAoY20tPmZpbHRlcl9sZXZlbCA8IG1pbl9maWx0ZXJfbGV2ZWwpCisgICAgICAgIGNtLT5maWx0ZXJfbGV2ZWwgPSBtaW5fZmlsdGVyX2xldmVsOworCisgICAgaWYgKGNtLT5maWx0ZXJfbGV2ZWwgPiBtYXhfZmlsdGVyX2xldmVsKQorICAgICAgICBjbS0+ZmlsdGVyX2xldmVsID0gbWF4X2ZpbHRlcl9sZXZlbDsKKworICAgIC8qIHJlc3RvcmUgdW5maWx0ZXJlZCBmcmFtZSBwb2ludGVyICovCisgICAgY20tPmZyYW1lX3RvX3Nob3cgPSBzYXZlZF9mcmFtZTsKK30KKworLyogU3R1YiBmdW5jdGlvbiBmb3Igbm93IEFsdCBMRiBub3QgdXNlZCAqLwordm9pZCB2cDhjeF9zZXRfYWx0X2xmX2xldmVsKFZQOF9DT01QICpjcGksIGludCBmaWx0X3ZhbCkKK3sKKyAgICBNQUNST0JMT0NLRCAqbWJkID0gJmNwaS0+bWIuZV9tYmQ7CisgICAgKHZvaWQpIGZpbHRfdmFsOworCisgICAgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVswXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMF07CisgICAgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsxXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMV07CisgICAgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsyXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMl07CisgICAgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVszXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bM107Cit9CisKK3ZvaWQgdnA4Y3hfcGlja19maWx0ZXJfbGV2ZWwoWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKworICAgIGludCBiZXN0X2VyciA9IDA7CisgICAgaW50IGZpbHRfZXJyID0gMDsKKyAgICBpbnQgbWluX2ZpbHRlcl9sZXZlbCA9IGdldF9taW5fZmlsdGVyX2xldmVsKGNwaSwgY20tPmJhc2VfcWluZGV4KTsKKyAgICBpbnQgbWF4X2ZpbHRlcl9sZXZlbCA9IGdldF9tYXhfZmlsdGVyX2xldmVsKGNwaSwgY20tPmJhc2VfcWluZGV4KTsKKworICAgIGludCBmaWx0ZXJfc3RlcDsKKyAgICBpbnQgZmlsdF9oaWdoID0gMDsKKyAgICAvKiBTdGFydCBzZWFyY2ggYXQgcHJldmlvdXMgZnJhbWUgZmlsdGVyIGxldmVsICovCisgICAgaW50IGZpbHRfbWlkID0gY20tPmZpbHRlcl9sZXZlbDsKKyAgICBpbnQgZmlsdF9sb3cgPSAwOworICAgIGludCBmaWx0X2Jlc3Q7CisgICAgaW50IGZpbHRfZGlyZWN0aW9uID0gMDsKKworICAgIC8qIEJpYXMgYWdhaW5zdCByYWlzaW5nIGxvb3AgZmlsdGVyIGFuZCBpbiBmYXZvciBvZiBsb3dlcmluZyBpdCAqLworICAgIGludCBCaWFzID0gMDsKKworICAgIGludCBzc19lcnJbTUFYX0xPT1BfRklMVEVSICsgMV07CisKKyAgICBZVjEyX0JVRkZFUl9DT05GSUcgKiBzYXZlZF9mcmFtZSA9IGNtLT5mcmFtZV90b19zaG93OworCisgICAgdnB4X21lbXNldChzc19lcnIsIDAsIHNpemVvZihzc19lcnIpKTsKKworICAgIC8qIFJlcGxhY2UgdW5maWx0ZXJlZCBmcmFtZSBidWZmZXIgd2l0aCBhIG5ldyBvbmUgKi8KKyAgICBjbS0+ZnJhbWVfdG9fc2hvdyA9ICZjcGktPnBpY2tfbGZfbHZsX2ZyYW1lOworCisgICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgY20tPnNoYXJwbmVzc19sZXZlbCA9IDA7CisgICAgZWxzZQorICAgICAgICBjbS0+c2hhcnBuZXNzX2xldmVsID0gY3BpLT5veGNmLlNoYXJwbmVzczsKKworICAgIC8qIFN0YXJ0IHRoZSBzZWFyY2ggYXQgdGhlIHByZXZpb3VzIGZyYW1lIGZpbHRlciBsZXZlbCB1bmxlc3MgaXQgaXMKKyAgICAgKiBub3cgb3V0IG9mIHJhbmdlLgorICAgICAqLworICAgIGZpbHRfbWlkID0gY20tPmZpbHRlcl9sZXZlbDsKKworICAgIGlmIChmaWx0X21pZCA8IG1pbl9maWx0ZXJfbGV2ZWwpCisgICAgICAgIGZpbHRfbWlkID0gbWluX2ZpbHRlcl9sZXZlbDsKKyAgICBlbHNlIGlmIChmaWx0X21pZCA+IG1heF9maWx0ZXJfbGV2ZWwpCisgICAgICAgIGZpbHRfbWlkID0gbWF4X2ZpbHRlcl9sZXZlbDsKKworICAgIC8qIERlZmluZSB0aGUgaW5pdGlhbCBzdGVwIHNpemUgKi8KKyAgICBmaWx0ZXJfc3RlcCA9IChmaWx0X21pZCA8IDE2KSA/IDQgOiBmaWx0X21pZCAvIDQ7CisKKyAgICAvKiBHZXQgYmFzZWxpbmUgZXJyb3Igc2NvcmUgKi8KKworICAgIC8qIENvcHkgdGhlIHVuZmlsdGVyZWQgLyBwcm9jZXNzZWQgcmVjb24gYnVmZmVyIHRvIHRoZSBuZXcgYnVmZmVyICovCisgICAgdnA4X3l2MTJfY29weV95KHNhdmVkX2ZyYW1lLCBjbS0+ZnJhbWVfdG9fc2hvdyk7CisKKyAgICB2cDhjeF9zZXRfYWx0X2xmX2xldmVsKGNwaSwgZmlsdF9taWQpOworICAgIHZwOF9sb29wX2ZpbHRlcl9mcmFtZV95b25seShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfbWlkKTsKKworICAgIGJlc3RfZXJyID0gdnA4X2NhbGNfc3NfZXJyKHNkLCBjbS0+ZnJhbWVfdG9fc2hvdyk7CisKKyAgICBzc19lcnJbZmlsdF9taWRdID0gYmVzdF9lcnI7CisKKyAgICBmaWx0X2Jlc3QgPSBmaWx0X21pZDsKKworICAgIHdoaWxlIChmaWx0ZXJfc3RlcCA+IDApCisgICAgeworICAgICAgICBCaWFzID0gKGJlc3RfZXJyID4+ICgxNSAtIChmaWx0X21pZCAvIDgpKSkgKiBmaWx0ZXJfc3RlcDsKKworICAgICAgICBpZiAoY3BpLT50d29wYXNzLnNlY3Rpb25faW50cmFfcmF0aW5nIDwgMjApCisgICAgICAgICAgICBCaWFzID0gQmlhcyAqIGNwaS0+dHdvcGFzcy5zZWN0aW9uX2ludHJhX3JhdGluZyAvIDIwOworCisgICAgICAgIGZpbHRfaGlnaCA9ICgoZmlsdF9taWQgKyBmaWx0ZXJfc3RlcCkgPiBtYXhfZmlsdGVyX2xldmVsKSA/IG1heF9maWx0ZXJfbGV2ZWwgOiAoZmlsdF9taWQgKyBmaWx0ZXJfc3RlcCk7CisgICAgICAgIGZpbHRfbG93ID0gKChmaWx0X21pZCAtIGZpbHRlcl9zdGVwKSA8IG1pbl9maWx0ZXJfbGV2ZWwpID8gbWluX2ZpbHRlcl9sZXZlbCA6IChmaWx0X21pZCAtIGZpbHRlcl9zdGVwKTsKKworICAgICAgICBpZiAoKGZpbHRfZGlyZWN0aW9uIDw9IDApICYmIChmaWx0X2xvdyAhPSBmaWx0X21pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNzX2VycltmaWx0X2xvd10gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgTG93IGZpbHRlciBlcnJvciBzY29yZSAqLworICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfeShzYXZlZF9mcmFtZSwgY20tPmZyYW1lX3RvX3Nob3cpOworICAgICAgICAgICAgICAgIHZwOGN4X3NldF9hbHRfbGZfbGV2ZWwoY3BpLCBmaWx0X2xvdyk7CisgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX3lvbmx5KGNtLCAmY3BpLT5tYi5lX21iZCwgZmlsdF9sb3cpOworCisgICAgICAgICAgICAgICAgZmlsdF9lcnIgPSB2cDhfY2FsY19zc19lcnIoc2QsIGNtLT5mcmFtZV90b19zaG93KTsKKyAgICAgICAgICAgICAgICBzc19lcnJbZmlsdF9sb3ddID0gZmlsdF9lcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsdF9lcnIgPSBzc19lcnJbZmlsdF9sb3ddOworCisgICAgICAgICAgICAvKiBJZiB2YWx1ZSBpcyBjbG9zZSB0byB0aGUgYmVzdCBzbyBmYXIgdGhlbiBiaWFzIHRvd2FyZHMgYQorICAgICAgICAgICAgICogbG93ZXIgbG9vcCBmaWx0ZXIgdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoZmlsdF9lcnIgLSBCaWFzKSA8IGJlc3RfZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFdhcyBpdCBhY3R1YWxseSBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgYmVzdD8gKi8KKyAgICAgICAgICAgICAgICBpZiAoZmlsdF9lcnIgPCBiZXN0X2VycikKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9lcnIgPSBmaWx0X2VycjsKKworICAgICAgICAgICAgICAgIGZpbHRfYmVzdCA9IGZpbHRfbG93OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTm93IGxvb2sgYXQgZmlsdF9oaWdoICovCisgICAgICAgIGlmICgoZmlsdF9kaXJlY3Rpb24gPj0gMCkgJiYgKGZpbHRfaGlnaCAhPSBmaWx0X21pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNzX2VycltmaWx0X2hpZ2hdID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X3l2MTJfY29weV95KHNhdmVkX2ZyYW1lLCBjbS0+ZnJhbWVfdG9fc2hvdyk7CisgICAgICAgICAgICAgICAgdnA4Y3hfc2V0X2FsdF9sZl9sZXZlbChjcGksIGZpbHRfaGlnaCk7CisgICAgICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX3lvbmx5KGNtLCAmY3BpLT5tYi5lX21iZCwgZmlsdF9oaWdoKTsKKworICAgICAgICAgICAgICAgIGZpbHRfZXJyID0gdnA4X2NhbGNfc3NfZXJyKHNkLCBjbS0+ZnJhbWVfdG9fc2hvdyk7CisgICAgICAgICAgICAgICAgc3NfZXJyW2ZpbHRfaGlnaF0gPSBmaWx0X2VycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWx0X2VyciA9IHNzX2VycltmaWx0X2hpZ2hdOworCisgICAgICAgICAgICAvKiBXYXMgaXQgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIGJlc3Q/ICovCisgICAgICAgICAgICBpZiAoZmlsdF9lcnIgPCAoYmVzdF9lcnIgLSBCaWFzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0X2VyciA9IGZpbHRfZXJyOworICAgICAgICAgICAgICAgIGZpbHRfYmVzdCA9IGZpbHRfaGlnaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEhhbGYgdGhlIHN0ZXAgZGlzdGFuY2UgaWYgdGhlIGJlc3QgZmlsdGVyIHZhbHVlIHdhcyB0aGUgc2FtZQorICAgICAgICAgKiBhcyBsYXN0IHRpbWUKKyAgICAgICAgICovCisgICAgICAgIGlmIChmaWx0X2Jlc3QgPT0gZmlsdF9taWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlcl9zdGVwID0gZmlsdGVyX3N0ZXAgLyAyOworICAgICAgICAgICAgZmlsdF9kaXJlY3Rpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmlsdF9kaXJlY3Rpb24gPSAoZmlsdF9iZXN0IDwgZmlsdF9taWQpID8gLTEgOiAxOworICAgICAgICAgICAgZmlsdF9taWQgPSBmaWx0X2Jlc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbS0+ZmlsdGVyX2xldmVsID0gZmlsdF9iZXN0OworCisgICAgLyogcmVzdG9yZSB1bmZpbHRlcmVkIGZyYW1lIHBvaW50ZXIgKi8KKyAgICBjbS0+ZnJhbWVfdG9fc2hvdyA9IHNhdmVkX2ZyYW1lOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3BwYy9jc3lzdGVtZGVwZW5kZW50LmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvcHBjL2NzeXN0ZW1kZXBlbmRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2YyMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3BwYy9jc3lzdGVtZGVwZW5kZW50LmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnA4L2VuY29kZXIvdmFyaWFuY2UuaCIKKyNpbmNsdWRlICJ2cDgvZW5jb2Rlci9vbnl4X2ludC5oIgorCitTQURGdW5jdGlvbiAqdnA4X3NhZDE2eDE2OworU0FERnVuY3Rpb24gKnZwOF9zYWQxNng4OworU0FERnVuY3Rpb24gKnZwOF9zYWQ4eDE2OworU0FERnVuY3Rpb24gKnZwOF9zYWQ4eDg7CitTQURGdW5jdGlvbiAqdnA4X3NhZDR4NDsKKwordmFyaWFuY2VfZnVuY3Rpb24gKnZwOF92YXJpYW5jZTR4NDsKK3ZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfdmFyaWFuY2U4eDg7Cit2YXJpYW5jZV9mdW5jdGlvbiAqdnA4X3ZhcmlhbmNlOHgxNjsKK3ZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfdmFyaWFuY2UxNng4OwordmFyaWFuY2VfZnVuY3Rpb24gKnZwOF92YXJpYW5jZTE2eDE2OworCit2YXJpYW5jZV9mdW5jdGlvbiAqdnA4X21zZTE2eDE2OworCitzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gKnZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDQ7CitzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gKnZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDg7CitzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gKnZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2Oworc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4ODsKK3N1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiAqdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2OworCitpbnQgKCp2cDhfYmxvY2tfZXJyb3IpKHNob3J0ICpjb2VmZiwgc2hvcnQgKmRxY29lZmYpOworaW50ICgqdnA4X21iYmxvY2tfZXJyb3IpKE1BQ1JPQkxPQ0sgKm1iLCBpbnQgZGMpOworCitpbnQgKCp2cDhfbWJ1dmVycm9yKShNQUNST0JMT0NLICptYik7Cit1bnNpZ25lZCBpbnQgKCp2cDhfZ2V0X21iX3NzKShzaG9ydCAqKTsKK3ZvaWQgKCp2cDhfc2hvcnRfZmRjdDR4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwordm9pZCAoKnZwOF9zaG9ydF9mZGN0OHg0KShzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Cit2b2lkICgqdnA4X2Zhc3RfZmRjdDR4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwordm9pZCAoKnZwOF9mYXN0X2ZkY3Q4eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKK3ZvaWQgKCpzaG9ydF93YWxzaDR4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOworCit2b2lkICgqdnA4X3N1YnRyYWN0X2IpKEJMT0NLICpiZSwgQkxPQ0tEICpiZCwgaW50IHBpdGNoKTsKK3ZvaWQgKCp2cDhfc3VidHJhY3RfbWJ5KShzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKTsKK3ZvaWQgKCp2cDhfc3VidHJhY3RfbWJ1dikoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnVzcmMsIHVuc2lnbmVkIGNoYXIgKnZzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpOwordm9pZCAoKnZwOF9mYXN0X3F1YW50aXplX2IpKEJMT0NLICpiLCBCTE9DS0QgKmQpOworCit1bnNpZ25lZCBpbnQgKCp2cDhfZ2V0NHg0c3NlX2NzKSh1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVjb25fc3RyaWRlKTsKKworLy8gYyBpbXBvcnRzCitleHRlcm4gaW50IGJsb2NrX2Vycm9yX2Moc2hvcnQgKmNvZWZmLCBzaG9ydCAqZHFjb2VmZik7CitleHRlcm4gaW50IHZwOF9tYmJsb2NrX2Vycm9yX2MoTUFDUk9CTE9DSyAqbWIsIGludCBkYyk7CisKK2V4dGVybiBpbnQgdnA4X21idXZlcnJvcl9jKE1BQ1JPQkxPQ0sgKm1iKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDh4OHZhcl9jKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUsIHVuc2lnbmVkIGludCAqU1NFLCBpbnQgKlN1bSk7CitleHRlcm4gdm9pZCBzaG9ydF9mZGN0NHg0X2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOworZXh0ZXJuIHZvaWQgc2hvcnRfZmRjdDh4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKK2V4dGVybiB2b2lkIHZwOF9zaG9ydF93YWxzaDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKKworZXh0ZXJuIHZvaWQgdnA4X3N1YnRyYWN0X2JfYyhCTE9DSyAqYmUsIEJMT0NLRCAqYmQsIGludCBwaXRjaCk7CitleHRlcm4gdm9pZCBzdWJ0cmFjdF9tYnlfYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKTsKK2V4dGVybiB2b2lkIHN1YnRyYWN0X21idXZfYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqdXNyYywgdW5zaWduZWQgY2hhciAqdnNyYywgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHN0cmlkZSk7CitleHRlcm4gdm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX2MoQkxPQ0sgKmIsIEJMT0NLRCAqZCk7CisKK2V4dGVybiBTQURGdW5jdGlvbiBzYWQxNngxNl9jOworZXh0ZXJuIFNBREZ1bmN0aW9uIHNhZDE2eDhfYzsKK2V4dGVybiBTQURGdW5jdGlvbiBzYWQ4eDE2X2M7CitleHRlcm4gU0FERnVuY3Rpb24gc2FkOHg4X2M7CitleHRlcm4gU0FERnVuY3Rpb24gc2FkNHg0X2M7CisKK2V4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2YXJpYW5jZTE2eDE2X2M7CitleHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdmFyaWFuY2U4eDE2X2M7CitleHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdmFyaWFuY2UxNng4X2M7CitleHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdmFyaWFuY2U4eDhfYzsKK2V4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2YXJpYW5jZTR4NF9jOworZXh0ZXJuIHZhcmlhbmNlX2Z1bmN0aW9uIG1zZTE2eDE2X2M7CisKK2V4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X2M7CitleHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHN1Yl9waXhlbF92YXJpYW5jZTh4OF9jOworZXh0ZXJuIHN1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiBzdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2M7CitleHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHN1Yl9waXhlbF92YXJpYW5jZTE2eDhfYzsKK2V4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYzsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0X21iX3NzX2Moc2hvcnQgKik7CitleHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXQ0eDRzc2VfY3NfYyh1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVjb25fc3RyaWRlKTsKKworLy8gcHBjCitleHRlcm4gaW50IHZwOF9ibG9ja19lcnJvcl9wcGMoc2hvcnQgKmNvZWZmLCBzaG9ydCAqZHFjb2VmZik7CisKK2V4dGVybiB2b2lkIHZwOF9zaG9ydF9mZGN0NHg0X3BwYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7CitleHRlcm4gdm9pZCB2cDhfc2hvcnRfZmRjdDh4NF9wcGMoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOworCitleHRlcm4gdm9pZCB2cDhfc3VidHJhY3RfbWJ5X3BwYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKTsKK2V4dGVybiB2b2lkIHZwOF9zdWJ0cmFjdF9tYnV2X3BwYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqdXNyYywgdW5zaWduZWQgY2hhciAqdnNyYywgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHN0cmlkZSk7CisKK2V4dGVybiBTQURGdW5jdGlvbiB2cDhfc2FkMTZ4MTZfcHBjOworZXh0ZXJuIFNBREZ1bmN0aW9uIHZwOF9zYWQxNng4X3BwYzsKK2V4dGVybiBTQURGdW5jdGlvbiB2cDhfc2FkOHgxNl9wcGM7CitleHRlcm4gU0FERnVuY3Rpb24gdnA4X3NhZDh4OF9wcGM7CitleHRlcm4gU0FERnVuY3Rpb24gdnA4X3NhZDR4NF9wcGM7CisKK2V4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2cDhfdmFyaWFuY2UxNngxNl9wcGM7CitleHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3ZhcmlhbmNlOHgxNl9wcGM7CitleHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3ZhcmlhbmNlMTZ4OF9wcGM7CitleHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3ZhcmlhbmNlOHg4X3BwYzsKK2V4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2cDhfdmFyaWFuY2U0eDRfcHBjOworZXh0ZXJuIHZhcmlhbmNlX2Z1bmN0aW9uIHZwOF9tc2UxNngxNl9wcGM7CisKK2V4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9wcGM7CitleHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfcHBjOworZXh0ZXJuIHN1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9wcGM7CitleHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3BwYzsKK2V4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3BwYzsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0OHg4dmFyX3BwYyh1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVjb25fc3RyaWRlLCB1bnNpZ25lZCBpbnQgKlNTRSwgaW50ICpTdW0pOworZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZ2YXJfcHBjKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUsIHVuc2lnbmVkIGludCAqU1NFLCBpbnQgKlN1bSk7CisKK3ZvaWQgdnA4X2NtYWNoaW5lX3NwZWNpZmljX2NvbmZpZyh2b2lkKQoreworICAgIC8vIFB1cmUgQzoKKyAgICB2cDhfbWJ1dmVycm9yICAgICAgICAgICAgICAgPSB2cDhfbWJ1dmVycm9yX2M7CisgICAgdnA4X2Zhc3RfcXVhbnRpemVfYiAgICAgICAgICAgPSB2cDhfZmFzdF9xdWFudGl6ZV9iX2M7CisgICAgdnA4X3Nob3J0X2ZkY3Q0eDQgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0NHg0X3BwYzsKKyAgICB2cDhfc2hvcnRfZmRjdDh4NCAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q4eDRfcHBjOworICAgIHZwOF9mYXN0X2ZkY3Q0eDQgICAgICAgICAgICAgPSB2cDhfc2hvcnRfZmRjdDR4NF9wcGM7CisgICAgdnA4X2Zhc3RfZmRjdDh4NCAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0OHg0X3BwYzsKKyAgICBzaG9ydF93YWxzaDR4NCAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X3dhbHNoNHg0X2M7CisKKyAgICB2cDhfdmFyaWFuY2U0eDQgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U0eDRfcHBjOworICAgIHZwOF92YXJpYW5jZTh4OCAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTh4OF9wcGM7CisgICAgdnA4X3ZhcmlhbmNlOHgxNiAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHgxNl9wcGM7CisgICAgdnA4X3ZhcmlhbmNlMTZ4OCAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlMTZ4OF9wcGM7CisgICAgdnA4X3ZhcmlhbmNlMTZ4MTYgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlMTZ4MTZfcHBjOworICAgIHZwOF9tc2UxNngxNiAgICAgICAgICAgICAgICA9IHZwOF9tc2UxNngxNl9wcGM7CisKKyAgICB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0ICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfcHBjOworICAgIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDggICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9wcGM7CisgICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTYgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9wcGM7CisgICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDggICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9wcGM7CisgICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2ICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfcHBjOworCisgICAgdnA4X2dldF9tYl9zcyAgICAgICAgICAgICAgICAgPSB2cDhfZ2V0X21iX3NzX2M7CisgICAgdnA4X2dldDR4NHNzZV9jcyAgICAgICAgICAgID0gdnA4X2dldDR4NHNzZV9jc19jOworCisgICAgdnA4X3NhZDE2eDE2ICAgICAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2X3BwYzsKKyAgICB2cDhfc2FkMTZ4OCAgICAgICAgICAgICAgICAgPSB2cDhfc2FkMTZ4OF9wcGM7CisgICAgdnA4X3NhZDh4MTYgICAgICAgICAgICAgICAgID0gdnA4X3NhZDh4MTZfcHBjOworICAgIHZwOF9zYWQ4eDggICAgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDhfcHBjOworICAgIHZwOF9zYWQ0eDQgICAgICAgICAgICAgICAgICA9IHZwOF9zYWQ0eDRfcHBjOworCisgICAgdnA4X2Jsb2NrX2Vycm9yICAgICAgICAgICAgICA9IHZwOF9ibG9ja19lcnJvcl9wcGM7CisgICAgdnA4X21iYmxvY2tfZXJyb3IgICAgICAgICAgICA9IHZwOF9tYmJsb2NrX2Vycm9yX2M7CisKKyAgICB2cDhfc3VidHJhY3RfYiAgICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X2JfYzsKKyAgICB2cDhfc3VidHJhY3RfbWJ5ICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X21ieV9wcGM7CisgICAgdnA4X3N1YnRyYWN0X21idXYgICAgICAgICAgICA9IHZwOF9zdWJ0cmFjdF9tYnV2X3BwYzsKK30KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3BwYy9lbmNvZGVtYl9hbHRpdmVjLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9wcGMvZW5jb2RlbWJfYWx0aXZlYy5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9lbmNvZGVyL3BwYy9lbmNvZGVtYl9hbHRpdmVjLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9lbmNvZGVyL3BwYy9lbmNvZGVtYl9hbHRpdmVjLmFzbQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcHBjL2ZkY3RfYWx0aXZlYy5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIvcHBjL2ZkY3RfYWx0aXZlYy5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9lbmNvZGVyL3BwYy9mZGN0X2FsdGl2ZWMuYXNtCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2VuY29kZXIvcHBjL2ZkY3RfYWx0aXZlYy5hc20KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3BwYy9yZG9wdF9hbHRpdmVjLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci9wcGMvcmRvcHRfYWx0aXZlYy5hc20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9lbmNvZGVyL3BwYy9yZG9wdF9hbHRpdmVjLmFzbQpyZW5hbWUgdG8gbGlidnB4L3ZwOC9lbmNvZGVyL3BwYy9yZG9wdF9hbHRpdmVjLmFzbQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3BzbnIuYyBiL2xpYnZweC92cDgvZW5jb2Rlci9wc25yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiNDlhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9wc25yLmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIiAvKiBmb3IgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpICovCisKKyNkZWZpbmUgTUFYX1BTTlIgNjAKKworZG91YmxlIHZwOF9tc2UycHNucihkb3VibGUgU2FtcGxlcywgZG91YmxlIFBlYWssIGRvdWJsZSBNc2UpCit7CisgICAgZG91YmxlIHBzbnI7CisKKyAgICBpZiAoKGRvdWJsZSlNc2UgPiAwLjApCisgICAgICAgIHBzbnIgPSAxMC4wICogbG9nMTAoUGVhayAqIFBlYWsgKiBTYW1wbGVzIC8gTXNlKTsKKyAgICBlbHNlCisgICAgICAgIHBzbnIgPSBNQVhfUFNOUjsgICAgICAvKiBMaW1pdCB0byBwcmV2ZW50IC8gMCAqLworCisgICAgaWYgKHBzbnIgPiBNQVhfUFNOUikKKyAgICAgICAgcHNuciA9IE1BWF9QU05SOworCisgICAgcmV0dXJuIHBzbnI7Cit9CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9wc25yLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvcHNuci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cDgvZW5jb2Rlci9wc25yLmgKcmVuYW1lIHRvIGxpYnZweC92cDgvZW5jb2Rlci9wc25yLmgKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9xdWFudGl6ZS5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3F1YW50aXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmZWExMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9xdWFudGl6ZS5jCkBAIC0wLDAgKzEsODExIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKworI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oIgorCisjZGVmaW5lIEVYQUNUX1FVQU5UCisKKyNpZmRlZiBFWEFDVF9GQVNUUVVBTlQKK3ZvaWQgdnA4X2Zhc3RfcXVhbnRpemVfYl9jKEJMT0NLICpiLCBCTE9DS0QgKmQpCit7CisgICAgaW50IGksIHJjLCBlb2I7CisgICAgaW50IHpiaW47CisgICAgaW50IHgsIHksIHosIHN6OworICAgIHNob3J0ICpjb2VmZl9wdHIgICAgICAgPSBiLT5jb2VmZjsKKyAgICBzaG9ydCAqemJpbl9wdHIgICAgICAgID0gYi0+emJpbjsKKyAgICBzaG9ydCAqcm91bmRfcHRyICAgICAgID0gYi0+cm91bmQ7CisgICAgc2hvcnQgKnF1YW50X3B0ciAgICAgICA9IGItPnF1YW50X2Zhc3Q7CisgICAgdW5zaWduZWQgY2hhciAqcXVhbnRfc2hpZnRfcHRyID0gYi0+cXVhbnRfc2hpZnQ7CisgICAgc2hvcnQgKnFjb2VmZl9wdHIgICAgICA9IGQtPnFjb2VmZjsKKyAgICBzaG9ydCAqZHFjb2VmZl9wdHIgICAgID0gZC0+ZHFjb2VmZjsKKyAgICBzaG9ydCAqZGVxdWFudF9wdHIgICAgID0gZC0+ZGVxdWFudDsKKworICAgIHZweF9tZW1zZXQocWNvZWZmX3B0ciwgMCwgMzIpOworICAgIHZweF9tZW1zZXQoZHFjb2VmZl9wdHIsIDAsIDMyKTsKKworICAgIGVvYiA9IC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICByYyAgID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOworICAgICAgICB6ICAgID0gY29lZmZfcHRyW3JjXTsKKyAgICAgICAgemJpbiA9IHpiaW5fcHRyW3JjXSA7CisKKyAgICAgICAgc3ogPSAoeiA+PiAzMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2lnbiBvZiB6ICovCisgICAgICAgIHggID0gKHogXiBzeikgLSBzejsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHggPSBhYnMoeikgKi8KKworICAgICAgICBpZiAoeCA+PSB6YmluKQorICAgICAgICB7CisgICAgICAgICAgICB4ICs9IHJvdW5kX3B0cltyY107CisgICAgICAgICAgICB5ICA9ICgoKHggKiBxdWFudF9wdHJbcmNdKSA+PiAxNikgKyB4KQorICAgICAgICAgICAgICAgICA+PiBxdWFudF9zaGlmdF9wdHJbcmNdOyAgICAgICAgICAgICAvKiBxdWFudGl6ZSAoeCkgKi8KKyAgICAgICAgICAgIHggID0gKHkgXiBzeikgLSBzejsgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBzaWduIGJhY2sgKi8KKyAgICAgICAgICAgIHFjb2VmZl9wdHJbcmNdID0geDsgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgdG8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgIGRxY29lZmZfcHRyW3JjXSA9IHggKiBkZXF1YW50X3B0cltyY107ICAgLyogZGVxdWFudGl6ZWQgdmFsdWUgKi8KKworICAgICAgICAgICAgaWYgKHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW9iID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3Qgbm9uemVybyBjb2VmZnMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqZC0+ZW9iID0gKGNoYXIpKGVvYiArIDEpOworfQorCisjZWxzZQorCit2b2lkIHZwOF9mYXN0X3F1YW50aXplX2JfYyhCTE9DSyAqYiwgQkxPQ0tEICpkKQoreworICAgIGludCBpLCByYywgZW9iOworICAgIGludCB4LCB5LCB6LCBzejsKKyAgICBzaG9ydCAqY29lZmZfcHRyICAgPSBiLT5jb2VmZjsKKyAgICBzaG9ydCAqcm91bmRfcHRyICAgPSBiLT5yb3VuZDsKKyAgICBzaG9ydCAqcXVhbnRfcHRyICAgPSBiLT5xdWFudF9mYXN0OworICAgIHNob3J0ICpxY29lZmZfcHRyICA9IGQtPnFjb2VmZjsKKyAgICBzaG9ydCAqZHFjb2VmZl9wdHIgPSBkLT5kcWNvZWZmOworICAgIHNob3J0ICpkZXF1YW50X3B0ciA9IGQtPmRlcXVhbnQ7CisKKyAgICBlb2IgPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHJjICAgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisgICAgICAgIHogICAgPSBjb2VmZl9wdHJbcmNdOworCisgICAgICAgIHN6ID0gKHogPj4gMzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpZ24gb2YgeiAqLworICAgICAgICB4ICA9ICh6IF4gc3opIC0gc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4ID0gYWJzKHopICovCisKKyAgICAgICAgeSAgPSAoKHggKyByb3VuZF9wdHJbcmNdKSAqIHF1YW50X3B0cltyY10pID4+IDE2OyAvKiBxdWFudGl6ZSAoeCkgKi8KKyAgICAgICAgeCAgPSAoeSBeIHN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBzaWduIGJhY2sgKi8KKyAgICAgICAgcWNvZWZmX3B0cltyY10gPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgdG8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgZHFjb2VmZl9wdHJbcmNdID0geCAqIGRlcXVhbnRfcHRyW3JjXTsgICAgICAgLyogZGVxdWFudGl6ZWQgdmFsdWUgKi8KKworICAgICAgICBpZiAoeSkKKyAgICAgICAgeworICAgICAgICAgICAgZW9iID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IG5vbnplcm8gY29lZmZzICovCisgICAgICAgIH0KKyAgICB9CisgICAgKmQtPmVvYiA9IChjaGFyKShlb2IgKyAxKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBFWEFDVF9RVUFOVAordm9pZCB2cDhfcmVndWxhcl9xdWFudGl6ZV9iX2MoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKK3sKKyAgICBpbnQgaSwgcmMsIGVvYjsKKyAgICBpbnQgemJpbjsKKyAgICBpbnQgeCwgeSwgeiwgc3o7CisgICAgc2hvcnQgKnpiaW5fYm9vc3RfcHRyICA9IGItPnpydW5femJpbl9ib29zdDsKKyAgICBzaG9ydCAqY29lZmZfcHRyICAgICAgID0gYi0+Y29lZmY7CisgICAgc2hvcnQgKnpiaW5fcHRyICAgICAgICA9IGItPnpiaW47CisgICAgc2hvcnQgKnJvdW5kX3B0ciAgICAgICA9IGItPnJvdW5kOworICAgIHNob3J0ICpxdWFudF9wdHIgICAgICAgPSBiLT5xdWFudDsKKyAgICB1bnNpZ25lZCBjaGFyICpxdWFudF9zaGlmdF9wdHIgPSBiLT5xdWFudF9zaGlmdDsKKyAgICBzaG9ydCAqcWNvZWZmX3B0ciAgICAgID0gZC0+cWNvZWZmOworICAgIHNob3J0ICpkcWNvZWZmX3B0ciAgICAgPSBkLT5kcWNvZWZmOworICAgIHNob3J0ICpkZXF1YW50X3B0ciAgICAgPSBkLT5kZXF1YW50OworICAgIHNob3J0IHpiaW5fb3FfdmFsdWUgICAgPSBiLT56YmluX2V4dHJhOworCisgICAgdnB4X21lbXNldChxY29lZmZfcHRyLCAwLCAzMik7CisgICAgdnB4X21lbXNldChkcWNvZWZmX3B0ciwgMCwgMzIpOworCisgICAgZW9iID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHJjICAgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisgICAgICAgIHogICAgPSBjb2VmZl9wdHJbcmNdOworCisgICAgICAgIHpiaW4gPSB6YmluX3B0cltyY10gKyAqemJpbl9ib29zdF9wdHIgKyB6YmluX29xX3ZhbHVlOworCisgICAgICAgIHpiaW5fYm9vc3RfcHRyICsrOworICAgICAgICBzeiA9ICh6ID4+IDMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaWduIG9mIHogKi8KKyAgICAgICAgeCAgPSAoeiBeIHN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeCA9IGFicyh6KSAqLworCisgICAgICAgIGlmICh4ID49IHpiaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0gcm91bmRfcHRyW3JjXTsKKyAgICAgICAgICAgIHkgID0gKCgoeCAqIHF1YW50X3B0cltyY10pID4+IDE2KSArIHgpCisgICAgICAgICAgICAgICAgID4+IHF1YW50X3NoaWZ0X3B0cltyY107ICAgICAgICAgICAgIC8qIHF1YW50aXplICh4KSAqLworICAgICAgICAgICAgeCAgPSAoeSBeIHN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIHNpZ24gYmFjayAqLworICAgICAgICAgICAgcWNvZWZmX3B0cltyY10gID0geDsgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSB0byBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgZHFjb2VmZl9wdHJbcmNdID0geCAqIGRlcXVhbnRfcHRyW3JjXTsgICAvKiBkZXF1YW50aXplZCB2YWx1ZSAqLworCisgICAgICAgICAgICBpZiAoeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlb2IgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBub256ZXJvIGNvZWZmcyAqLworICAgICAgICAgICAgICAgIHpiaW5fYm9vc3RfcHRyID0gYi0+enJ1bl96YmluX2Jvb3N0OyAvKiByZXNldCB6ZXJvIHJ1bmxlbmd0aCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKmQtPmVvYiA9IChjaGFyKShlb2IgKyAxKTsKK30KKworLyogUGVyZm9ybSByZWd1bGFyIHF1YW50aXphdGlvbiwgd2l0aCB1bmJpYXNlZCByb3VuZGluZyBhbmQgbm8gemVybyBiaW4uICovCit2b2lkIHZwOF9zdHJpY3RfcXVhbnRpemVfYl9jKEJMT0NLICpiLCBCTE9DS0QgKmQpCit7CisgICAgaW50IGk7CisgICAgaW50IHJjOworICAgIGludCBlb2I7CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgaW50IHo7CisgICAgaW50IHN6OworICAgIHNob3J0ICpjb2VmZl9wdHI7CisgICAgc2hvcnQgKnF1YW50X3B0cjsKKyAgICB1bnNpZ25lZCBjaGFyICpxdWFudF9zaGlmdF9wdHI7CisgICAgc2hvcnQgKnFjb2VmZl9wdHI7CisgICAgc2hvcnQgKmRxY29lZmZfcHRyOworICAgIHNob3J0ICpkZXF1YW50X3B0cjsKKworICAgIGNvZWZmX3B0ciAgICAgICA9IGItPmNvZWZmOworICAgIHF1YW50X3B0ciAgICAgICA9IGItPnF1YW50OworICAgIHF1YW50X3NoaWZ0X3B0ciA9IGItPnF1YW50X3NoaWZ0OworICAgIHFjb2VmZl9wdHIgICAgICA9IGQtPnFjb2VmZjsKKyAgICBkcWNvZWZmX3B0ciAgICAgPSBkLT5kcWNvZWZmOworICAgIGRlcXVhbnRfcHRyICAgICA9IGQtPmRlcXVhbnQ7CisgICAgZW9iID0gLSAxOworICAgIHZweF9tZW1zZXQocWNvZWZmX3B0ciwgMCwgMzIpOworICAgIHZweF9tZW1zZXQoZHFjb2VmZl9wdHIsIDAsIDMyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGludCBkcTsKKyAgICAgICAgaW50IHJvdW5kOworCisgICAgICAgIC8qVE9ETzogVGhlc2UgYXJyYXlzIHNob3VsZCBiZSBzdG9yZWQgaW4gemlnLXphZyBvcmRlci4qLworICAgICAgICByYyA9IHZwOF9kZWZhdWx0X3ppZ196YWcxZFtpXTsKKyAgICAgICAgeiA9IGNvZWZmX3B0cltyY107CisgICAgICAgIGRxID0gZGVxdWFudF9wdHJbcmNdOworICAgICAgICByb3VuZCA9IGRxID4+IDE7CisgICAgICAgIC8qIFNpZ24gb2Ygei4gKi8KKyAgICAgICAgc3ogPSAtKHogPCAwKTsKKyAgICAgICAgeCA9ICh6ICsgc3opIF4gc3o7CisgICAgICAgIHggKz0gcm91bmQ7CisgICAgICAgIGlmICh4ID49IGRxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBRdWFudGl6ZSB4LiAqLworICAgICAgICAgICAgeSAgPSAoKCh4ICogcXVhbnRfcHRyW3JjXSkgPj4gMTYpICsgeCkgPj4gcXVhbnRfc2hpZnRfcHRyW3JjXTsKKyAgICAgICAgICAgIC8qIFB1dCB0aGUgc2lnbiBiYWNrLiAqLworICAgICAgICAgICAgeCA9ICh5ICsgc3opIF4gc3o7CisgICAgICAgICAgICAvKiBTYXZlIHRoZSBjb2VmZmljaWVudCBhbmQgaXRzIGRlcXVhbnRpemVkIHZhbHVlLiAqLworICAgICAgICAgICAgcWNvZWZmX3B0cltyY10gPSB4OworICAgICAgICAgICAgZHFjb2VmZl9wdHJbcmNdID0geCAqIGRxOworICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhlIGxhc3Qgbm9uLXplcm8gY29lZmZpY2llbnQuICovCisgICAgICAgICAgICBpZiAoeSkKKyAgICAgICAgICAgICAgICBlb2IgPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgKmQtPmVvYiA9IChjaGFyKShlb2IgKyAxKTsKK30KKworI2Vsc2UKKwordm9pZCB2cDhfcmVndWxhcl9xdWFudGl6ZV9iX2MoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKK3sKKyAgICBpbnQgaSwgcmMsIGVvYjsKKyAgICBpbnQgemJpbjsKKyAgICBpbnQgeCwgeSwgeiwgc3o7CisgICAgc2hvcnQgKnpiaW5fYm9vc3RfcHRyID0gYi0+enJ1bl96YmluX2Jvb3N0OworICAgIHNob3J0ICpjb2VmZl9wdHIgICAgICA9IGItPmNvZWZmOworICAgIHNob3J0ICp6YmluX3B0ciAgICAgICA9IGItPnpiaW47CisgICAgc2hvcnQgKnJvdW5kX3B0ciAgICAgID0gYi0+cm91bmQ7CisgICAgc2hvcnQgKnF1YW50X3B0ciAgICAgID0gYi0+cXVhbnQ7CisgICAgc2hvcnQgKnFjb2VmZl9wdHIgICAgID0gZC0+cWNvZWZmOworICAgIHNob3J0ICpkcWNvZWZmX3B0ciAgICA9IGQtPmRxY29lZmY7CisgICAgc2hvcnQgKmRlcXVhbnRfcHRyICAgID0gZC0+ZGVxdWFudDsKKyAgICBzaG9ydCB6YmluX29xX3ZhbHVlICAgPSBiLT56YmluX2V4dHJhOworCisgICAgdnB4X21lbXNldChxY29lZmZfcHRyLCAwLCAzMik7CisgICAgdnB4X21lbXNldChkcWNvZWZmX3B0ciwgMCwgMzIpOworCisgICAgZW9iID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHJjICAgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisgICAgICAgIHogICAgPSBjb2VmZl9wdHJbcmNdOworCisgICAgICAgIHpiaW4gPSB6YmluX3B0cltyY10gKyAqemJpbl9ib29zdF9wdHIgKyB6YmluX29xX3ZhbHVlOworCisgICAgICAgIHpiaW5fYm9vc3RfcHRyICsrOworICAgICAgICBzeiA9ICh6ID4+IDMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaWduIG9mIHogKi8KKyAgICAgICAgeCAgPSAoeiBeIHN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeCA9IGFicyh6KSAqLworCisgICAgICAgIGlmICh4ID49IHpiaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHkgID0gKCh4ICsgcm91bmRfcHRyW3JjXSkgKiBxdWFudF9wdHJbcmNdKSA+PiAxNjsgLyogcXVhbnRpemUgKHgpICovCisgICAgICAgICAgICB4ICA9ICh5IF4gc3opIC0gc3o7ICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgc2lnbiBiYWNrICovCisgICAgICAgICAgICBxY29lZmZfcHRyW3JjXSAgPSB4OyAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHRvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICBkcWNvZWZmX3B0cltyY10gPSB4ICogZGVxdWFudF9wdHJbcmNdOyAgIC8qIGRlcXVhbnRpemVkIHZhbHVlICovCisKKyAgICAgICAgICAgIGlmICh5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVvYiA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IG5vbnplcm8gY29lZmZzICovCisgICAgICAgICAgICAgICAgemJpbl9ib29zdF9wdHIgPSAmYi0+enJ1bl96YmluX2Jvb3N0WzBdOyAvKiByZXNldCB6cmwgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpkLT5lb2IgPSAoY2hhcikoZW9iICsgMSk7Cit9CisKKyNlbmRpZgorCit2b2lkIHZwOF9xdWFudGl6ZV9tYnlfYyhNQUNST0JMT0NLICp4KQoreworICAgIGludCBpOworICAgIGludCBoYXNfMm5kX29yZGVyID0gKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVECisgICAgICAgICYmIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeC0+cXVhbnRpemVfYigmeC0+YmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpXSk7CisKKyAgICBpZihoYXNfMm5kX29yZGVyKQorICAgICAgICB4LT5xdWFudGl6ZV9iKCZ4LT5ibG9ja1syNF0sICZ4LT5lX21iZC5ibG9ja1syNF0pOworfQorCit2b2lkIHZwOF9xdWFudGl6ZV9tYl9jKE1BQ1JPQkxPQ0sgKngpCit7CisgICAgaW50IGk7CisgICAgaW50IGhhc18ybmRfb3JkZXI9KHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVECisgICAgICAgICYmIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjQraGFzXzJuZF9vcmRlcjsgaSsrKQorICAgICAgICB4LT5xdWFudGl6ZV9iKCZ4LT5ibG9ja1tpXSwgJngtPmVfbWJkLmJsb2NrW2ldKTsKK30KKworCit2b2lkIHZwOF9xdWFudGl6ZV9tYnV2X2MoTUFDUk9CTE9DSyAqeCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkrKykKKyAgICAgICAgeC0+cXVhbnRpemVfYigmeC0+YmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpXSk7Cit9CisKKy8qIHF1YW50aXplX2JfcGFpciBmdW5jdGlvbiBwb2ludGVyIGluIE1BQ1JPQkxPQ0sgc3RydWN0dXJlIGlzIHNldCB0byBvbmUgb2YKKyAqIHRoZXNlIHR3byBDIGZ1bmN0aW9ucyBpZiBjb3JyZXNwb25kaW5nIG9wdGltaXplZCByb3V0aW5lIGlzIG5vdCBhdmFpbGFibGUuCisgKiBORU9OIG9wdGltaXplZCB2ZXJzaW9uIGltcGxlbWVudHMgY3VycmVudGx5IHRoZSBmYXN0IHF1YW50aXphdGlvbiBmb3IgcGFpcgorICogb2YgYmxvY2tzLiAqLwordm9pZCB2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3BhaXIoQkxPQ0sgKmIxLCBCTE9DSyAqYjIsIEJMT0NLRCAqZDEsIEJMT0NLRCAqZDIpCit7CisgICAgdnA4X3JlZ3VsYXJfcXVhbnRpemVfYihiMSwgZDEpOworICAgIHZwOF9yZWd1bGFyX3F1YW50aXplX2IoYjIsIGQyKTsKK30KKwordm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX3BhaXJfYyhCTE9DSyAqYjEsIEJMT0NLICpiMiwgQkxPQ0tEICpkMSwgQkxPQ0tEICpkMikKK3sKKyAgICB2cDhfZmFzdF9xdWFudGl6ZV9iX2MoYjEsIGQxKTsKKyAgICB2cDhfZmFzdF9xdWFudGl6ZV9iX2MoYjIsIGQyKTsKK30KKworCitzdGF0aWMgY29uc3QgaW50IHFyb3VuZGluZ19mYWN0b3JzWzEyOV0gPQoreworICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OAorfTsKKworCitzdGF0aWMgY29uc3QgaW50IHF6YmluX2ZhY3RvcnNbMTI5XSA9Cit7CisgICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAorICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKKyAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCisgICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAorICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKKyAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQgcXJvdW5kaW5nX2ZhY3RvcnNfeTJbMTI5XSA9Cit7CisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ4Cit9OworCisKK3N0YXRpYyBjb25zdCBpbnQgcXpiaW5fZmFjdG9yc195MlsxMjldID0KK3sKKyAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCisgICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAorICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKKyAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCisgICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAorICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAorICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCisgICAgODAKK307CisKKworI2RlZmluZSBFWEFDVF9RVUFOVAorI2lmZGVmIEVYQUNUX1FVQU5UCitzdGF0aWMgdm9pZCBpbnZlcnRfcXVhbnQoaW50IGltcHJvdmVkX3F1YW50LCBzaG9ydCAqcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hpZnQsIHNob3J0IGQpCit7CisgICAgaWYoaW1wcm92ZWRfcXVhbnQpCisgICAgeworICAgICAgICB1bnNpZ25lZCB0OworICAgICAgICBpbnQgbDsKKyAgICAgICAgdCA9IGQ7CisgICAgICAgIGZvcihsID0gMDsgdCA+IDE7IGwrKykKKyAgICAgICAgICAgIHQ+Pj0xOworICAgICAgICB0ID0gMSArICgxPDwoMTYrbCkpL2Q7CisgICAgICAgICpxdWFudCA9IChzaG9ydCkodCAtICgxPDwxNikpOworICAgICAgICAqc2hpZnQgPSBsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcXVhbnQgPSAoMSA8PCAxNikgLyBkOworICAgICAgICAqc2hpZnQgPSAwOworICAgIH0KK30KKworCit2b2lkIHZwOGN4X2luaXRfcXVhbnRpemVyKFZQOF9DT01QICpjcGkpCit7CisgICAgaW50IGk7CisgICAgaW50IHF1YW50X3ZhbDsKKyAgICBpbnQgUTsKKworICAgIGludCB6YmluX2Jvb3N0WzE2XSA9IHswLCAwLCA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzIsIDM2LCA0MCwgNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LCA0NH07CisKKyAgICBmb3IgKFEgPSAwOyBRIDwgUUlOREVYX1JBTkdFOyBRKyspCisgICAgeworICAgICAgICAvKiBkYyB2YWx1ZXMgKi8KKyAgICAgICAgcXVhbnRfdmFsID0gdnA4X2RjX3F1YW50KFEsIGNwaS0+Y29tbW9uLnkxZGNfZGVsdGFfcSk7CisgICAgICAgIGNwaS0+WTFxdWFudF9mYXN0W1FdWzBdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOworICAgICAgICBpbnZlcnRfcXVhbnQoY3BpLT5zZi5pbXByb3ZlZF9xdWFudCwgY3BpLT5ZMXF1YW50W1FdICsgMCwKKyAgICAgICAgICAgICAgICAgICAgIGNwaS0+WTFxdWFudF9zaGlmdFtRXSArIDAsIHF1YW50X3ZhbCk7CisgICAgICAgIGNwaS0+WTF6YmluW1FdWzBdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OworICAgICAgICBjcGktPlkxcm91bmRbUV1bMF0gPSAocXJvdW5kaW5nX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpID4+IDc7CisgICAgICAgIGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRXVswXSA9IHF1YW50X3ZhbDsKKyAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfeTFbUV1bMF0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFswXSkgPj4gNzsKKworICAgICAgICBxdWFudF92YWwgPSB2cDhfZGMycXVhbnQoUSwgY3BpLT5jb21tb24ueTJkY19kZWx0YV9xKTsKKyAgICAgICAgY3BpLT5ZMnF1YW50X2Zhc3RbUV1bMF0gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7CisgICAgICAgIGludmVydF9xdWFudChjcGktPnNmLmltcHJvdmVkX3F1YW50LCBjcGktPlkycXVhbnRbUV0gKyAwLAorICAgICAgICAgICAgICAgICAgICAgY3BpLT5ZMnF1YW50X3NoaWZ0W1FdICsgMCwgcXVhbnRfdmFsKTsKKyAgICAgICAgY3BpLT5ZMnpiaW5bUV1bMF0gPSAoKHF6YmluX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7CisgICAgICAgIGNwaS0+WTJyb3VuZFtRXVswXSA9IChxcm91bmRpbmdfZmFjdG9yc195MltRXSAqIHF1YW50X3ZhbCkgPj4gNzsKKyAgICAgICAgY3BpLT5jb21tb24uWTJkZXF1YW50W1FdWzBdID0gcXVhbnRfdmFsOworICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF95MltRXVswXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0WzBdKSA+PiA3OworCisgICAgICAgIHF1YW50X3ZhbCA9IHZwOF9kY191dl9xdWFudChRLCBjcGktPmNvbW1vbi51dmRjX2RlbHRhX3EpOworICAgICAgICBjcGktPlVWcXVhbnRfZmFzdFtRXVswXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKKyAgICAgICAgaW52ZXJ0X3F1YW50KGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQsIGNwaS0+VVZxdWFudFtRXSArIDAsCisgICAgICAgICAgICAgICAgICAgICBjcGktPlVWcXVhbnRfc2hpZnRbUV0gKyAwLCBxdWFudF92YWwpOworICAgICAgICBjcGktPlVWemJpbltRXVswXSA9ICgocXpiaW5fZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzs7CisgICAgICAgIGNwaS0+VVZyb3VuZFtRXVswXSA9IChxcm91bmRpbmdfZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgPj4gNzsKKyAgICAgICAgY3BpLT5jb21tb24uVVZkZXF1YW50W1FdWzBdID0gcXVhbnRfdmFsOworICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF91dltRXVswXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0WzBdKSA+PiA3OworCisgICAgICAgIC8qIGFsbCB0aGUgYWMgdmFsdWVzID0gOyAqLworICAgICAgICBxdWFudF92YWwgPSB2cDhfYWNfeXF1YW50KFEpOworICAgICAgICBjcGktPlkxcXVhbnRfZmFzdFtRXVsxXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKKyAgICAgICAgaW52ZXJ0X3F1YW50KGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQsIGNwaS0+WTFxdWFudFtRXSArIDEsCisgICAgICAgICAgICAgICAgICAgICBjcGktPlkxcXVhbnRfc2hpZnRbUV0gKyAxLCBxdWFudF92YWwpOworICAgICAgICBjcGktPlkxemJpbltRXVsxXSA9ICgocXpiaW5fZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzsKKyAgICAgICAgY3BpLT5ZMXJvdW5kW1FdWzFdID0gKHFyb3VuZGluZ19mYWN0b3JzW1FdICogcXVhbnRfdmFsKSA+PiA3OworICAgICAgICBjcGktPmNvbW1vbi5ZMWRlcXVhbnRbUV1bMV0gPSBxdWFudF92YWw7CisgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kxW1FdWzFdID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbMV0pID4+IDc7CisKKyAgICAgICAgcXVhbnRfdmFsID0gdnA4X2FjMnF1YW50KFEsIGNwaS0+Y29tbW9uLnkyYWNfZGVsdGFfcSk7CisgICAgICAgIGNwaS0+WTJxdWFudF9mYXN0W1FdWzFdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOworICAgICAgICBpbnZlcnRfcXVhbnQoY3BpLT5zZi5pbXByb3ZlZF9xdWFudCwgY3BpLT5ZMnF1YW50W1FdICsgMSwKKyAgICAgICAgICAgICAgICAgICAgIGNwaS0+WTJxdWFudF9zaGlmdFtRXSArIDEsIHF1YW50X3ZhbCk7CisgICAgICAgIGNwaS0+WTJ6YmluW1FdWzFdID0gKChxemJpbl9mYWN0b3JzX3kyW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OworICAgICAgICBjcGktPlkycm91bmRbUV1bMV0gPSAocXJvdW5kaW5nX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpID4+IDc7CisgICAgICAgIGNwaS0+Y29tbW9uLlkyZGVxdWFudFtRXVsxXSA9IHF1YW50X3ZhbDsKKyAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfeTJbUV1bMV0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFsxXSkgPj4gNzsKKworICAgICAgICBxdWFudF92YWwgPSB2cDhfYWNfdXZfcXVhbnQoUSwgY3BpLT5jb21tb24udXZhY19kZWx0YV9xKTsKKyAgICAgICAgY3BpLT5VVnF1YW50X2Zhc3RbUV1bMV0gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7CisgICAgICAgIGludmVydF9xdWFudChjcGktPnNmLmltcHJvdmVkX3F1YW50LCBjcGktPlVWcXVhbnRbUV0gKyAxLAorICAgICAgICAgICAgICAgICAgICAgY3BpLT5VVnF1YW50X3NoaWZ0W1FdICsgMSwgcXVhbnRfdmFsKTsKKyAgICAgICAgY3BpLT5VVnpiaW5bUV1bMV0gPSAoKHF6YmluX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7CisgICAgICAgIGNwaS0+VVZyb3VuZFtRXVsxXSA9IChxcm91bmRpbmdfZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgPj4gNzsKKyAgICAgICAgY3BpLT5jb21tb24uVVZkZXF1YW50W1FdWzFdID0gcXVhbnRfdmFsOworICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF91dltRXVsxXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0WzFdKSA+PiA3OworCisgICAgICAgIGZvciAoaSA9IDI7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjcGktPlkxcXVhbnRfZmFzdFtRXVtpXSA9IGNwaS0+WTFxdWFudF9mYXN0W1FdWzFdOworICAgICAgICAgICAgY3BpLT5ZMXF1YW50W1FdW2ldID0gY3BpLT5ZMXF1YW50W1FdWzFdOworICAgICAgICAgICAgY3BpLT5ZMXF1YW50X3NoaWZ0W1FdW2ldID0gY3BpLT5ZMXF1YW50X3NoaWZ0W1FdWzFdOworICAgICAgICAgICAgY3BpLT5ZMXpiaW5bUV1baV0gPSBjcGktPlkxemJpbltRXVsxXTsKKyAgICAgICAgICAgIGNwaS0+WTFyb3VuZFtRXVtpXSA9IGNwaS0+WTFyb3VuZFtRXVsxXTsKKyAgICAgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kxW1FdW2ldID0gKGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRXVsxXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YmluX2Jvb3N0W2ldKSA+PiA3OworCisgICAgICAgICAgICBjcGktPlkycXVhbnRfZmFzdFtRXVtpXSA9IGNwaS0+WTJxdWFudF9mYXN0W1FdWzFdOworICAgICAgICAgICAgY3BpLT5ZMnF1YW50W1FdW2ldID0gY3BpLT5ZMnF1YW50W1FdWzFdOworICAgICAgICAgICAgY3BpLT5ZMnF1YW50X3NoaWZ0W1FdW2ldID0gY3BpLT5ZMnF1YW50X3NoaWZ0W1FdWzFdOworICAgICAgICAgICAgY3BpLT5ZMnpiaW5bUV1baV0gPSBjcGktPlkyemJpbltRXVsxXTsKKyAgICAgICAgICAgIGNwaS0+WTJyb3VuZFtRXVtpXSA9IGNwaS0+WTJyb3VuZFtRXVsxXTsKKyAgICAgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kyW1FdW2ldID0gKGNwaS0+Y29tbW9uLlkyZGVxdWFudFtRXVsxXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YmluX2Jvb3N0W2ldKSA+PiA3OworCisgICAgICAgICAgICBjcGktPlVWcXVhbnRfZmFzdFtRXVtpXSA9IGNwaS0+VVZxdWFudF9mYXN0W1FdWzFdOworICAgICAgICAgICAgY3BpLT5VVnF1YW50W1FdW2ldID0gY3BpLT5VVnF1YW50W1FdWzFdOworICAgICAgICAgICAgY3BpLT5VVnF1YW50X3NoaWZ0W1FdW2ldID0gY3BpLT5VVnF1YW50X3NoaWZ0W1FdWzFdOworICAgICAgICAgICAgY3BpLT5VVnpiaW5bUV1baV0gPSBjcGktPlVWemJpbltRXVsxXTsKKyAgICAgICAgICAgIGNwaS0+VVZyb3VuZFtRXVtpXSA9IGNwaS0+VVZyb3VuZFtRXVsxXTsKKyAgICAgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3V2W1FdW2ldID0gKGNwaS0+Y29tbW9uLlVWZGVxdWFudFtRXVsxXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YmluX2Jvb3N0W2ldKSA+PiA3OworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgdnA4Y3hfaW5pdF9xdWFudGl6ZXIoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcXVhbnRfdmFsOworICAgIGludCBROworCisgICAgaW50IHpiaW5fYm9vc3RbMTZdID0gezAsIDAsIDgsIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjQsIDI4LCAzMiwgMzYsIDQwLCA0NCwgNDQsIDQ0fTsKKworICAgIGZvciAoUSA9IDA7IFEgPCBRSU5ERVhfUkFOR0U7IFErKykKKyAgICB7CisgICAgICAgIC8qIGRjIHZhbHVlcyAqLworICAgICAgICBxdWFudF92YWwgPSB2cDhfZGNfcXVhbnQoUSwgY3BpLT5jb21tb24ueTFkY19kZWx0YV9xKTsKKyAgICAgICAgY3BpLT5ZMXF1YW50W1FdWzBdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOworICAgICAgICBjcGktPlkxemJpbltRXVswXSA9ICgocXpiaW5fZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzsKKyAgICAgICAgY3BpLT5ZMXJvdW5kW1FdWzBdID0gKHFyb3VuZGluZ19mYWN0b3JzW1FdICogcXVhbnRfdmFsKSA+PiA3OworICAgICAgICBjcGktPmNvbW1vbi5ZMWRlcXVhbnRbUV1bMF0gPSBxdWFudF92YWw7CisgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kxW1FdWzBdID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbMF0pID4+IDc7CisKKyAgICAgICAgcXVhbnRfdmFsID0gdnA4X2RjMnF1YW50KFEsIGNwaS0+Y29tbW9uLnkyZGNfZGVsdGFfcSk7CisgICAgICAgIGNwaS0+WTJxdWFudFtRXVswXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKKyAgICAgICAgY3BpLT5ZMnpiaW5bUV1bMF0gPSAoKHF6YmluX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7CisgICAgICAgIGNwaS0+WTJyb3VuZFtRXVswXSA9IChxcm91bmRpbmdfZmFjdG9yc195MltRXSAqIHF1YW50X3ZhbCkgPj4gNzsKKyAgICAgICAgY3BpLT5jb21tb24uWTJkZXF1YW50W1FdWzBdID0gcXVhbnRfdmFsOworICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF95MltRXVswXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0WzBdKSA+PiA3OworCisgICAgICAgIHF1YW50X3ZhbCA9IHZwOF9kY191dl9xdWFudChRLCBjcGktPmNvbW1vbi51dmRjX2RlbHRhX3EpOworICAgICAgICBjcGktPlVWcXVhbnRbUV1bMF0gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7CisgICAgICAgIGNwaS0+VVZ6YmluW1FdWzBdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OzsKKyAgICAgICAgY3BpLT5VVnJvdW5kW1FdWzBdID0gKHFyb3VuZGluZ19mYWN0b3JzW1FdICogcXVhbnRfdmFsKSA+PiA3OworICAgICAgICBjcGktPmNvbW1vbi5VVmRlcXVhbnRbUV1bMF0gPSBxdWFudF92YWw7CisgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3V2W1FdWzBdID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbMF0pID4+IDc7CisKKyAgICAgICAgLyogYWxsIHRoZSBhYyB2YWx1ZXMgPSA7ICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07CisKKyAgICAgICAgICAgIHF1YW50X3ZhbCA9IHZwOF9hY195cXVhbnQoUSk7CisgICAgICAgICAgICBjcGktPlkxcXVhbnRbUV1bcmNdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOworICAgICAgICAgICAgY3BpLT5ZMXpiaW5bUV1bcmNdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OworICAgICAgICAgICAgY3BpLT5ZMXJvdW5kW1FdW3JjXSA9IChxcm91bmRpbmdfZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgPj4gNzsKKyAgICAgICAgICAgIGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRXVtyY10gPSBxdWFudF92YWw7CisgICAgICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF95MVtRXVtpXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0W2ldKSA+PiA3OworCisgICAgICAgICAgICBxdWFudF92YWwgPSB2cDhfYWMycXVhbnQoUSwgY3BpLT5jb21tb24ueTJhY19kZWx0YV9xKTsKKyAgICAgICAgICAgIGNwaS0+WTJxdWFudFtRXVtyY10gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7CisgICAgICAgICAgICBjcGktPlkyemJpbltRXVtyY10gPSAoKHF6YmluX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7CisgICAgICAgICAgICBjcGktPlkycm91bmRbUV1bcmNdID0gKHFyb3VuZGluZ19mYWN0b3JzX3kyW1FdICogcXVhbnRfdmFsKSA+PiA3OworICAgICAgICAgICAgY3BpLT5jb21tb24uWTJkZXF1YW50W1FdW3JjXSA9IHF1YW50X3ZhbDsKKyAgICAgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kyW1FdW2ldID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbaV0pID4+IDc7CisKKyAgICAgICAgICAgIHF1YW50X3ZhbCA9IHZwOF9hY191dl9xdWFudChRLCBjcGktPmNvbW1vbi51dmFjX2RlbHRhX3EpOworICAgICAgICAgICAgY3BpLT5VVnF1YW50W1FdW3JjXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKKyAgICAgICAgICAgIGNwaS0+VVZ6YmluW1FdW3JjXSA9ICgocXpiaW5fZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzsKKyAgICAgICAgICAgIGNwaS0+VVZyb3VuZFtRXVtyY10gPSAocXJvdW5kaW5nX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpID4+IDc7CisgICAgICAgICAgICBjcGktPmNvbW1vbi5VVmRlcXVhbnRbUV1bcmNdID0gcXVhbnRfdmFsOworICAgICAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfdXZbUV1baV0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFtpXSkgPj4gNzsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisjZGVmaW5lIFpCSU5fRVhUUkFfWSBcCisgICAgKCggY3BpLT5jb21tb24uWTFkZXF1YW50W1FJbmRleF1bMV0gKiAgXAorICAgICggY3BpLT56YmluX292ZXJfcXVhbnQgKyAgXAorICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgKyAgXAorICAgICAgeC0+YWN0X3piaW5fYWRqICkgKSA+PiA3KQorCisjZGVmaW5lIFpCSU5fRVhUUkFfVVYgXAorICAgICgoIGNwaS0+Y29tbW9uLlVWZGVxdWFudFtRSW5kZXhdWzFdICogIFwKKyAgICAoIGNwaS0+emJpbl9vdmVyX3F1YW50ICsgIFwKKyAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ICsgIFwKKyAgICAgIHgtPmFjdF96YmluX2FkaiApICkgPj4gNykKKworI2RlZmluZSBaQklOX0VYVFJBX1kyIFwKKyAgICAoKCBjcGktPmNvbW1vbi5ZMmRlcXVhbnRbUUluZGV4XVsxXSAqICBcCisgICAgKCAoY3BpLT56YmluX292ZXJfcXVhbnQgLyAyKSArICBcCisgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgKyAgXAorICAgICAgIHgtPmFjdF96YmluX2FkaiApICkgPj4gNykKKwordm9pZCB2cDhjeF9tYl9pbml0X3F1YW50aXplcihWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LCBpbnQgb2tfdG9fc2tpcCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgUUluZGV4OworICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKKyAgICBpbnQgemJpbl9leHRyYTsKKworICAgIC8qIFNlbGVjdCB0aGUgYmFzZWxpbmUgTUIgUSBpbmRleC4gKi8KKyAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQorICAgIHsKKyAgICAgICAgLyogQWJzIFZhbHVlICovCisgICAgICAgIGlmICh4ZC0+bWJfc2VnZW1lbnRfYWJzX2RlbHRhID09IFNFR01FTlRfQUJTREFUQSkKKyAgICAgICAgICAgIFFJbmRleCA9IHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkXTsKKyAgICAgICAgLyogRGVsdGEgVmFsdWUgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRSW5kZXggPSBjcGktPmNvbW1vbi5iYXNlX3FpbmRleCArIHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkXTsKKyAgICAgICAgICAgIC8qIENsYW1wIHRvIHZhbGlkIHJhbmdlICovCisgICAgICAgICAgICBRSW5kZXggPSAoUUluZGV4ID49IDApID8gKChRSW5kZXggPD0gTUFYUSkgPyBRSW5kZXggOiBNQVhRKSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBRSW5kZXggPSBjcGktPmNvbW1vbi5iYXNlX3FpbmRleDsKKworICAgIC8qIFRoaXMgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlLiBVc2Ugb2tfdG9fc2tpcCB0bworICAgICAqIGRlY2lkZSBpZiBpdCBpcyBvayB0byBza2lwLgorICAgICAqIEJlZm9yZSBlbmNvZGluZyBhIGZyYW1lLCB0aGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBva190b19za2lwCisgICAgICogPTAsIHdoaWNoIG1lYW5zIG5vIHNraXBpbmcgb2YgY2FsY3VsYXRpb25zLiBUaGUgImxhc3QiIHZhbHVlcyBhcmUKKyAgICAgKiBpbml0aWFsaXplZCBhdCB0aGF0IHRpbWUuCisgICAgICovCisgICAgaWYgKCFva190b19za2lwIHx8IFFJbmRleCAhPSB4LT5xX2luZGV4KQorICAgIHsKKworICAgICAgICB4ZC0+ZGVxdWFudF95MV9kY1swXSA9IDE7CisgICAgICAgIHhkLT5kZXF1YW50X3kxWzBdID0gY3BpLT5jb21tb24uWTFkZXF1YW50W1FJbmRleF1bMF07CisgICAgICAgIHhkLT5kZXF1YW50X3kyWzBdID0gY3BpLT5jb21tb24uWTJkZXF1YW50W1FJbmRleF1bMF07CisgICAgICAgIHhkLT5kZXF1YW50X3V2WzBdID0gY3BpLT5jb21tb24uVVZkZXF1YW50W1FJbmRleF1bMF07CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHhkLT5kZXF1YW50X3kxX2RjW2ldID0KKyAgICAgICAgICAgIHhkLT5kZXF1YW50X3kxW2ldID0gY3BpLT5jb21tb24uWTFkZXF1YW50W1FJbmRleF1bMV07CisgICAgICAgICAgICB4ZC0+ZGVxdWFudF95MltpXSA9IGNwaS0+Y29tbW9uLlkyZGVxdWFudFtRSW5kZXhdWzFdOworICAgICAgICAgICAgeGQtPmRlcXVhbnRfdXZbaV0gPSBjcGktPmNvbW1vbi5VVmRlcXVhbnRbUUluZGV4XVsxXTsKKyAgICAgICAgfQorI2lmIDEKKyAgICAgICAgLypUT0RPOiAgUmVtb3ZlIGRlcXVhbnQgZnJvbSBCTE9DS0QuICBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsCisgICAgICAgICAqIHRoZSBxdWFudGl6ZXIgY29kZSB1c2VzIGEgcGFzc2VkIGluIHBvaW50ZXIgdG8gdGhlIGRlcXVhbnQgY29uc3RhbnRzLgorICAgICAgICAgKiBUaGlzIHdpbGwgYWxzbyByZXF1aXJlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHg4NiBhbmQgbmVvbiBhc3NlbWJseS4KKyAgICAgICAgICogKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB4LT5lX21iZC5ibG9ja1tpXS5kZXF1YW50ID0geGQtPmRlcXVhbnRfeTE7CisgICAgICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkrKykKKyAgICAgICAgICAgIHgtPmVfbWJkLmJsb2NrW2ldLmRlcXVhbnQgPSB4ZC0+ZGVxdWFudF91djsKKyAgICAgICAgeC0+ZV9tYmQuYmxvY2tbMjRdLmRlcXVhbnQgPSB4ZC0+ZGVxdWFudF95MjsKKyNlbmRpZgorCisgICAgICAgIC8qIFkgKi8KKyAgICAgICAgemJpbl9leHRyYSA9IFpCSU5fRVhUUkFfWTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgeC0+YmxvY2tbaV0ucXVhbnQgPSBjcGktPlkxcXVhbnRbUUluZGV4XTsKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnF1YW50X2Zhc3QgPSBjcGktPlkxcXVhbnRfZmFzdFtRSW5kZXhdOworICAgICAgICAgICAgeC0+YmxvY2tbaV0ucXVhbnRfc2hpZnQgPSBjcGktPlkxcXVhbnRfc2hpZnRbUUluZGV4XTsKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnpiaW4gPSBjcGktPlkxemJpbltRSW5kZXhdOworICAgICAgICAgICAgeC0+YmxvY2tbaV0ucm91bmQgPSBjcGktPlkxcm91bmRbUUluZGV4XTsKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnpydW5femJpbl9ib29zdCA9IGNwaS0+enJ1bl96YmluX2Jvb3N0X3kxW1FJbmRleF07CisgICAgICAgICAgICB4LT5ibG9ja1tpXS56YmluX2V4dHJhID0gKHNob3J0KXpiaW5fZXh0cmE7CisgICAgICAgIH0KKworICAgICAgICAvKiBVViAqLworICAgICAgICB6YmluX2V4dHJhID0gWkJJTl9FWFRSQV9VVjsKKworICAgICAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnF1YW50ID0gY3BpLT5VVnF1YW50W1FJbmRleF07CisgICAgICAgICAgICB4LT5ibG9ja1tpXS5xdWFudF9mYXN0ID0gY3BpLT5VVnF1YW50X2Zhc3RbUUluZGV4XTsKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnF1YW50X3NoaWZ0ID0gY3BpLT5VVnF1YW50X3NoaWZ0W1FJbmRleF07CisgICAgICAgICAgICB4LT5ibG9ja1tpXS56YmluID0gY3BpLT5VVnpiaW5bUUluZGV4XTsKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnJvdW5kID0gY3BpLT5VVnJvdW5kW1FJbmRleF07CisgICAgICAgICAgICB4LT5ibG9ja1tpXS56cnVuX3piaW5fYm9vc3QgPSBjcGktPnpydW5femJpbl9ib29zdF91dltRSW5kZXhdOworICAgICAgICAgICAgeC0+YmxvY2tbaV0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOworICAgICAgICB9CisKKyAgICAgICAgLyogWTIgKi8KKyAgICAgICAgemJpbl9leHRyYSA9IFpCSU5fRVhUUkFfWTI7CisKKyAgICAgICAgeC0+YmxvY2tbMjRdLnF1YW50X2Zhc3QgPSBjcGktPlkycXVhbnRfZmFzdFtRSW5kZXhdOworICAgICAgICB4LT5ibG9ja1syNF0ucXVhbnQgPSBjcGktPlkycXVhbnRbUUluZGV4XTsKKyAgICAgICAgeC0+YmxvY2tbMjRdLnF1YW50X3NoaWZ0ID0gY3BpLT5ZMnF1YW50X3NoaWZ0W1FJbmRleF07CisgICAgICAgIHgtPmJsb2NrWzI0XS56YmluID0gY3BpLT5ZMnpiaW5bUUluZGV4XTsKKyAgICAgICAgeC0+YmxvY2tbMjRdLnJvdW5kID0gY3BpLT5ZMnJvdW5kW1FJbmRleF07CisgICAgICAgIHgtPmJsb2NrWzI0XS56cnVuX3piaW5fYm9vc3QgPSBjcGktPnpydW5femJpbl9ib29zdF95MltRSW5kZXhdOworICAgICAgICB4LT5ibG9ja1syNF0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOworCisgICAgICAgIC8qIHNhdmUgdGhpcyBtYWNyb2Jsb2NrIFFJbmRleCBmb3IgdnA4X3VwZGF0ZV96YmluX2V4dHJhKCkgKi8KKyAgICAgICAgeC0+cV9pbmRleCA9IFFJbmRleDsKKworICAgICAgICBjcGktPmxhc3RfemJpbl9vdmVyX3F1YW50ID0gY3BpLT56YmluX292ZXJfcXVhbnQ7CisgICAgICAgIGNwaS0+bGFzdF96YmluX21vZGVfYm9vc3QgPSBjcGktPnpiaW5fbW9kZV9ib29zdDsKKyAgICAgICAgeC0+bGFzdF9hY3RfemJpbl9hZGogPSB4LT5hY3RfemJpbl9hZGo7CisKKworCisgICAgfQorICAgIGVsc2UgaWYoY3BpLT5sYXN0X3piaW5fb3Zlcl9xdWFudCAhPSBjcGktPnpiaW5fb3Zlcl9xdWFudAorICAgICAgICAgICAgfHwgY3BpLT5sYXN0X3piaW5fbW9kZV9ib29zdCAhPSBjcGktPnpiaW5fbW9kZV9ib29zdAorICAgICAgICAgICAgfHwgeC0+bGFzdF9hY3RfemJpbl9hZGogIT0geC0+YWN0X3piaW5fYWRqKQorICAgIHsKKyAgICAgICAgLyogWSAqLworICAgICAgICB6YmluX2V4dHJhID0gWkJJTl9FWFRSQV9ZOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgeC0+YmxvY2tbaV0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOworCisgICAgICAgIC8qIFVWICovCisgICAgICAgIHpiaW5fZXh0cmEgPSBaQklOX0VYVFJBX1VWOworCisgICAgICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkrKykKKyAgICAgICAgICAgIHgtPmJsb2NrW2ldLnpiaW5fZXh0cmEgPSAoc2hvcnQpemJpbl9leHRyYTsKKworICAgICAgICAvKiBZMiAqLworICAgICAgICB6YmluX2V4dHJhID0gWkJJTl9FWFRSQV9ZMjsKKyAgICAgICAgeC0+YmxvY2tbMjRdLnpiaW5fZXh0cmEgPSAoc2hvcnQpemJpbl9leHRyYTsKKworICAgICAgICBjcGktPmxhc3RfemJpbl9vdmVyX3F1YW50ID0gY3BpLT56YmluX292ZXJfcXVhbnQ7CisgICAgICAgIGNwaS0+bGFzdF96YmluX21vZGVfYm9vc3QgPSBjcGktPnpiaW5fbW9kZV9ib29zdDsKKyAgICAgICAgeC0+bGFzdF9hY3RfemJpbl9hZGogPSB4LT5hY3RfemJpbl9hZGo7CisgICAgfQorfQorCit2b2lkIHZwOF91cGRhdGVfemJpbl9leHRyYShWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KQoreworICAgIGludCBpOworICAgIGludCBRSW5kZXggPSB4LT5xX2luZGV4OworICAgIGludCB6YmluX2V4dHJhOworCisgICAgLyogWSAqLworICAgIHpiaW5fZXh0cmEgPSBaQklOX0VYVFJBX1k7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeC0+YmxvY2tbaV0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOworCisgICAgLyogVVYgKi8KKyAgICB6YmluX2V4dHJhID0gWkJJTl9FWFRSQV9VVjsKKworICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkrKykKKyAgICAgICAgeC0+YmxvY2tbaV0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOworCisgICAgLyogWTIgKi8KKyAgICB6YmluX2V4dHJhID0gWkJJTl9FWFRSQV9ZMjsKKyAgICB4LT5ibG9ja1syNF0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOworfQorI3VuZGVmIFpCSU5fRVhUUkFfWQorI3VuZGVmIFpCSU5fRVhUUkFfVVYKKyN1bmRlZiBaQklOX0VYVFJBX1kyCisKK3ZvaWQgdnA4Y3hfZnJhbWVfaW5pdF9xdWFudGl6ZXIoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvKiBDbGVhciBaYmluIG1vZGUgYm9vc3QgZm9yIGRlZmF1bHQgY2FzZSAqLworICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gMDsKKworICAgIC8qIE1CIGxldmVsIHF1YW50aXplciBzZXR1cCAqLworICAgIHZwOGN4X21iX2luaXRfcXVhbnRpemVyKGNwaSwgJmNwaS0+bWIsIDApOworfQorCisKK3ZvaWQgdnA4X3NldF9xdWFudGl6ZXIoc3RydWN0IFZQOF9DT01QICpjcGksIGludCBRKQoreworICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOworICAgIE1BQ1JPQkxPQ0tEICptYmQgPSAmY3BpLT5tYi5lX21iZDsKKyAgICBpbnQgdXBkYXRlID0gMDsKKyAgICBpbnQgbmV3X2RlbHRhX3E7CisgICAgY20tPmJhc2VfcWluZGV4ID0gUTsKKworICAgIC8qIGlmIGFueSBvZiB0aGUgZGVsdGFfcSB2YWx1ZXMgYXJlIGNoYW5naW5nIHVwZGF0ZSBmbGFnIGhhcyB0byBiZSBzZXQgKi8KKyAgICAvKiBjdXJyZW50bHkgb25seSB5MmRjX2RlbHRhX3EgbWF5IGNoYW5nZSAqLworCisgICAgY20tPnkxZGNfZGVsdGFfcSA9IDA7CisgICAgY20tPnkyYWNfZGVsdGFfcSA9IDA7CisgICAgY20tPnV2ZGNfZGVsdGFfcSA9IDA7CisgICAgY20tPnV2YWNfZGVsdGFfcSA9IDA7CisKKyAgICBpZiAoUSA8IDQpCisgICAgeworICAgICAgICBuZXdfZGVsdGFfcSA9IDQtUTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBuZXdfZGVsdGFfcSA9IDA7CisKKyAgICB1cGRhdGUgfD0gY20tPnkyZGNfZGVsdGFfcSAhPSBuZXdfZGVsdGFfcTsKKyAgICBjbS0+eTJkY19kZWx0YV9xID0gbmV3X2RlbHRhX3E7CisKKworICAgIC8qIFNldCBTZWdtZW50IHNwZWNpZmljIHF1YXRpemVycyAqLworICAgIG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVswXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVswXTsKKyAgICBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMV0gPSBjcGktPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMV07CisgICAgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdID0gY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdOworICAgIG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXTsKKworICAgIC8qIHF1YW50aXplciBoYXMgdG8gYmUgcmVpbml0aWFsaXplZCBmb3IgYW55IGRlbHRhX3EgY2hhbmdlcyAqLworICAgIGlmKHVwZGF0ZSkKKyAgICAgICAgdnA4Y3hfaW5pdF9xdWFudGl6ZXIoY3BpKTsKKworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3F1YW50aXplLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvcXVhbnRpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU0OTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3F1YW50aXplLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgX19JTkNfUVVBTlRJWkVfSAorI2RlZmluZSBfX0lOQ19RVUFOVElaRV9ICisKK3N0cnVjdCBWUDhfQ09NUDsKK3N0cnVjdCBtYWNyb2Jsb2NrOworZXh0ZXJuIHZvaWQgdnA4X3NldF9xdWFudGl6ZXIoc3RydWN0IFZQOF9DT01QICpjcGksIGludCBRKTsKK2V4dGVybiB2b2lkIHZwOGN4X2ZyYW1lX2luaXRfcXVhbnRpemVyKHN0cnVjdCBWUDhfQ09NUCAqY3BpKTsKK2V4dGVybiB2b2lkIHZwOF91cGRhdGVfemJpbl9leHRyYShzdHJ1Y3QgVlA4X0NPTVAgKmNwaSwgc3RydWN0IG1hY3JvYmxvY2sgKngpOworZXh0ZXJuIHZvaWQgdnA4Y3hfbWJfaW5pdF9xdWFudGl6ZXIoc3RydWN0IFZQOF9DT01QICpjcGksIHN0cnVjdCBtYWNyb2Jsb2NrICp4LCBpbnQgb2tfdG9fc2tpcCk7CitleHRlcm4gdm9pZCB2cDhjeF9pbml0X3F1YW50aXplcihzdHJ1Y3QgVlA4X0NPTVAgKmNwaSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3JhdGVjdHJsLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvcmF0ZWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2MxYzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3JhdGVjdHJsLmMKQEAgLTAsMCArMSwxNTM0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9jb21tb24uaCIKKyNpbmNsdWRlICJyYXRlY3RybC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW1vZGUuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgorI2luY2x1ZGUgImVuY29kZW12LmgiCisKKworI2RlZmluZSBNSU5fQlBCX0ZBQ1RPUiAgICAgICAgICAwLjAxCisjZGVmaW5lIE1BWF9CUEJfRkFDVE9SICAgICAgICAgIDUwCisKK2V4dGVybiBjb25zdCBNQl9QUkVESUNUSU9OX01PREUgdnA4X21vZGVfb3JkZXJbTUFYX01PREVTXTsKKworCisKKyNpZmRlZiBNT0RFX1NUQVRTCitleHRlcm4gaW50IHlfbW9kZXNbNV07CitleHRlcm4gaW50IHV2X21vZGVzWzRdOworZXh0ZXJuIGludCBiX21vZGVzWzEwXTsKKworZXh0ZXJuIGludCBpbnRlcl95X21vZGVzWzEwXTsKK2V4dGVybiBpbnQgaW50ZXJfdXZfbW9kZXNbNF07CitleHRlcm4gaW50IGludGVyX2JfbW9kZXNbMTBdOworI2VuZGlmCisKKy8qIEJpdHMgUGVyIE1CIGF0IGRpZmZlcmVudCBRIChNdWx0aXBsaWVkIGJ5IDUxMikgKi8KKyNkZWZpbmUgQlBFUl9NQl9OT1JNQklUUyAgICA5CisKKy8qIFdvcmsgaW4gcHJvZ3Jlc3MgcmVjYWxpYnJhdGlvbiBvZiBiYXNlbGluZSByYXRlIHRhYmxlcyBiYXNlZCBvbgorICogdGhlIGFzc3VtcHRpb24gdGhhdCBiaXRzIHBlciBtYiBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZQorICogcXVhbnRpemVyIHZhbHVlLgorICovCitjb25zdCBpbnQgdnA4X2JpdHNfcGVyX21iWzJdW1FJTkRFWF9SQU5HRV0gPQoreworICAgIC8qIEludHJhIGNhc2UgNDUwMDAwL1FpbnRyYSAqLworICAgIHsKKyAgICAgICAgMTEyNTAwMCw5MDAwMDAsIDc1MDAwMCwgNjQyODU3LCA1NjI1MDAsIDUwMDAwMCwgNDUwMDAwLCA0NTAwMDAsCisgICAgICAgIDQwOTA5MCwgMzc1MDAwLCAzNDYxNTMsIDMyMTQyOCwgMzAwMDAwLCAyODEyNTAsIDI2NDcwNSwgMjY0NzA1LAorICAgICAgICAyNTAwMDAsIDIzNjg0MiwgMjI1MDAwLCAyMjUwMDAsIDIxNDI4NSwgMjE0Mjg1LCAyMDQ1NDUsIDIwNDU0NSwKKyAgICAgICAgMTk1NjUyLCAxOTU2NTIsIDE4NzUwMCwgMTgwMDAwLCAxODAwMDAsIDE3MzA3NiwgMTY2NjY2LCAxNjA3MTQsCisgICAgICAgIDE1NTE3MiwgMTUwMDAwLCAxNDUxNjEsIDE0MDYyNSwgMTM2MzYzLCAxMzIzNTIsIDEyODU3MSwgMTI1MDAwLAorICAgICAgICAxMjE2MjEsIDEyMTYyMSwgMTE4NDIxLCAxMTUzODQsIDExMjUwMCwgMTA5NzU2LCAxMDcxNDIsIDEwNDY1MSwKKyAgICAgICAgMTAyMjcyLCAxMDAwMDAsIDk3ODI2LCAgOTc4MjYsICA5NTc0NCwgIDkzNzUwLCAgOTE4MzYsICA5MDAwMCwKKyAgICAgICAgODgyMzUsICA4NjUzOCwgIDg0OTA1LCAgODMzMzMsICA4MTgxOCwgIDgwMzU3LCAgNzg5NDcsICA3NzU4NiwKKyAgICAgICAgNzYyNzEsICA3NTAwMCwgIDczNzcwLCAgNzI1ODAsICA3MTQyOCwgIDcwMzEyLCAgNjkyMzAsICA2ODE4MSwKKyAgICAgICAgNjcxNjQsICA2NjE3NiwgIDY1MjE3LCAgNjQyODUsICA2MzM4MCwgIDYyNTAwLCAgNjE2NDMsICA2MDgxMCwKKyAgICAgICAgNjAwMDAsICA1OTIxMCwgIDU5MjEwLCAgNTg0NDEsICA1NzY5MiwgIDU2OTYyLCAgNTYyNTAsICA1NTU1NSwKKyAgICAgICAgNTQ4NzgsICA1NDIxNiwgIDUzNTcxLCAgNTI5NDEsICA1MjMyNSwgIDUxNzI0LCAgNTExMzYsICA1MDU2MSwKKyAgICAgICAgNDk0NTAsICA0ODM4NywgIDQ3MzY4LCAgNDY4NzUsICA0NTkxOCwgIDQ1MDAwLCAgNDQ1NTQsICA0NDExNywKKyAgICAgICAgNDMyNjksICA0MjQ1MiwgIDQxNjY2LCAgNDA5MDksICA0MDE3OCwgIDM5NDczLCAgMzg3OTMsICAzODEzNSwKKyAgICAgICAgMzY4ODUsICAzNjI5MCwgIDM1NzE0LCAgMzUxNTYsICAzNDYxNSwgIDM0MDkwLCAgMzM1ODIsICAzMzA4OCwKKyAgICAgICAgMzI2MDgsICAzMjE0MiwgIDMxNDY4LCAgMzEwMzQsICAzMDQwNSwgIDI5ODAxLCAgMjkyMjAsICAyODY2MiwKKyAgICB9LAorICAgIC8qIEludGVyIGNhc2UgMjg1MDAwL1FpbnRlciAqLworICAgIHsKKyAgICAgICAgNzEyNTAwLCA1NzAwMDAsIDQ3NTAwMCwgNDA3MTQyLCAzNTYyNTAsIDMxNjY2NiwgMjg1MDAwLCAyNTkwOTAsCisgICAgICAgIDIzNzUwMCwgMjE5MjMwLCAyMDM1NzEsIDE5MDAwMCwgMTc4MTI1LCAxNjc2NDcsIDE1ODMzMywgMTUwMDAwLAorICAgICAgICAxNDI1MDAsIDEzNTcxNCwgMTI5NTQ1LCAxMjM5MTMsIDExODc1MCwgMTE0MDAwLCAxMDk2MTUsIDEwNTU1NSwKKyAgICAgICAgMTAxNzg1LCA5ODI3NSwgIDk1MDAwLCAgOTE5MzUsICA4OTA2MiwgIDg2MzYzLCAgODM4MjMsICA4MTQyOCwKKyAgICAgICAgNzkxNjYsICA3NzAyNywgIDc1MDAwLCAgNzMwNzYsICA3MTI1MCwgIDY5NTEyLCAgNjc4NTcsICA2NjI3OSwKKyAgICAgICAgNjQ3NzIsICA2MzMzMywgIDYxOTU2LCAgNjA2MzgsICA1OTM3NSwgIDU4MTYzLCAgNTcwMDAsICA1NTg4MiwKKyAgICAgICAgNTQ4MDcsICA1Mzc3MywgIDUyNzc3LCAgNTE4MTgsICA1MDg5MiwgIDUwMDAwLCAgNDkxMzcsICA0NzUwMCwKKyAgICAgICAgNDU5NjcsICA0NDUzMSwgIDQzMTgxLCAgNDE5MTEsICA0MDcxNCwgIDM5NTgzLCAgMzg1MTMsICAzNzUwMCwKKyAgICAgICAgMzY1MzgsICAzNTYyNSwgIDM0NzU2LCAgMzM5MjgsICAzMzEzOSwgIDMyMzg2LCAgMzE2NjYsICAzMDk3OCwKKyAgICAgICAgMzAzMTksICAyOTY4NywgIDI5MDgxLCAgMjg1MDAsICAyNzk0MSwgIDI3NDAzLCAgMjY4ODYsICAyNjM4OCwKKyAgICAgICAgMjU5MDksICAyNTQ0NiwgIDI1MDAwLCAgMjQ1NjgsICAyMzk0OSwgIDIzMzYwLCAgMjI4MDAsICAyMjI2NSwKKyAgICAgICAgMjE3NTUsICAyMTI2OCwgIDIwODAyLCAgMjAzNTcsICAxOTkzMCwgIDE5NTIwLCAgMTkxMjcsICAxODc1MCwKKyAgICAgICAgMTgzODcsICAxODAzNywgIDE3NzAxLCAgMTczNzgsICAxNzA2NSwgIDE2NzY0LCAgMTY0NzMsICAxNjEwMSwKKyAgICAgICAgMTU3NDUsICAxNTQwNSwgIDE1MDc5LCAgMTQ3NjYsICAxNDQ2NywgIDE0MTc5LCAgMTM5MDIsICAxMzYzNiwKKyAgICAgICAgMTMzODAsICAxMzEzMywgIDEyODk1LCAgMTI2NjYsICAxMjQ0NSwgIDEyMTc5LCAgMTE5MjQsICAxMTYzMiwKKyAgICAgICAgMTE0NDUsICAxMTIyMCwgIDExMDAzLCAgMTA3OTUsICAxMDU5NCwgIDEwNDAxLCAgMTAyMTUsICAxMDAzNSwKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IGtmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV0gPQoreworICAgIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LAorICAgIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorICAgIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLAorICAgIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorICAgIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAorICAgIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LAorICAgIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLAorICAgIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAorICAgIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LAorICAgIDIwMCwgMjAwLCAyMDEsIDIwMSwgMjAyLCAyMDMsIDIwMywgMjAzLAorICAgIDIwNCwgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDYsIDIwNywgMjA3LAorICAgIDIwOCwgMjA4LCAyMDksIDIwOSwgMjEwLCAyMTAsIDIxMSwgMjExLAorICAgIDIxMiwgMjEyLCAyMTMsIDIxMywgMjE0LCAyMTQsIDIxNSwgMjE1LAorICAgIDIxNiwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTgsIDIxOSwgMjE5LAorICAgIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLAorICAgIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLAorfTsKKworLyogI2RlZmluZSBHRlFfQURKVVNUTUVOVCAoUSsxMDApICovCisjZGVmaW5lIEdGUV9BREpVU1RNRU5UIHZwOF9nZl9ib29zdF9xYWRqdXN0bWVudFtRXQorY29uc3QgaW50IHZwOF9nZl9ib29zdF9xYWRqdXN0bWVudFtRSU5ERVhfUkFOR0VdID0KK3sKKyAgICA4MCwgODIsIDg0LCA4NiwgODgsIDkwLCA5MiwgOTQsCisgICAgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywKKyAgICAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgICAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwKKyAgICAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKyAgICAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwKKyAgICAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKyAgICAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwKKyAgICAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKyAgICAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywKKyAgICAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwKKyAgICAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywKKyAgICAxODQsIDE4NCwgMTg1LCAxODUsIDE4NiwgMTg2LCAxODcsIDE4NywKKyAgICAxODgsIDE4OCwgMTg5LCAxODksIDE5MCwgMTkwLCAxOTEsIDE5MSwKKyAgICAxOTIsIDE5MiwgMTkzLCAxOTMsIDE5NCwgMTk0LCAxOTQsIDE5NCwKKyAgICAxOTUsIDE5NSwgMTk2LCAxOTYsIDE5NywgMTk3LCAxOTgsIDE5OAorfTsKKworLyoKK2NvbnN0IGludCB2cDhfZ2ZfYm9vc3RfcWFkanVzdG1lbnRbUUlOREVYX1JBTkdFXSA9Cit7CisgICAgMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA1LDEwNiwKKyAgICAxMDYsMTA3LDEwNywxMDgsMTA5LDEwOSwxMTAsMTExLAorICAgIDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksCisgICAgMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKKyAgICAxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LAorICAgIDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsCisgICAgMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwKKyAgICAxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LAorICAgIDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsCisgICAgMTY4LDE2OSwxNzAsMTcwLDE3MSwxNzEsMTcyLDE3MiwKKyAgICAxNzMsMTczLDE3MywxNzQsMTc0LDE3NCwxNzUsMTc1LAorICAgIDE3NSwxNzYsMTc2LDE3NiwxNzcsMTc3LDE3NywxNzcsCisgICAgMTc4LDE3OCwxNzksMTc5LDE4MCwxODAsMTgxLDE4MSwKKyAgICAxODIsMTgyLDE4MywxODMsMTg0LDE4NCwxODUsMTg1LAorICAgIDE4NiwxODYsMTg3LDE4NywxODgsMTg4LDE4OSwxODksCisgICAgMTkwLDE5MCwxOTEsMTkxLDE5MiwxOTIsMTkzLDE5MywKK307CisqLworCitzdGF0aWMgY29uc3QgaW50IGtmX2dmX2Jvb3N0X3FsaW1pdHNbUUlOREVYX1JBTkdFXSA9Cit7CisgICAgMTUwLCAxNTUsIDE2MCwgMTY1LCAxNzAsIDE3NSwgMTgwLCAxODUsCisgICAgMTkwLCAxOTUsIDIwMCwgMjA1LCAyMTAsIDIxNSwgMjIwLCAyMjUsCisgICAgMjMwLCAyMzUsIDI0MCwgMjQ1LCAyNTAsIDI1NSwgMjYwLCAyNjUsCisgICAgMjcwLCAyNzUsIDI4MCwgMjg1LCAyOTAsIDI5NSwgMzAwLCAzMDUsCisgICAgMzEwLCAzMjAsIDMzMCwgMzQwLCAzNTAsIDM2MCwgMzcwLCAzODAsCisgICAgMzkwLCA0MDAsIDQxMCwgNDIwLCA0MzAsIDQ0MCwgNDUwLCA0NjAsCisgICAgNDcwLCA0ODAsIDQ5MCwgNTAwLCA1MTAsIDUyMCwgNTMwLCA1NDAsCisgICAgNTUwLCA1NjAsIDU3MCwgNTgwLCA1OTAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCisgICAgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsCit9OworCisvKiAlIGFkanVzdG1lbnQgdG8gdGFyZ2V0IGtmIHNpemUgYmFzZWQgb24gc2VwZXJhdGlvbiBmcm9tIHByZXZpb3VzIGZyYW1lICovCitzdGF0aWMgY29uc3QgaW50IGtmX2Jvb3N0X3NlcGVyYXRpb25fYWRqdXN0bWVudFsxNl0gPQoreworICAgIDMwLCAgIDQwLCAgIDUwLCAgIDU1LCAgIDYwLCAgIDY1LCAgIDcwLCAgIDc1LAorICAgIDgwLCAgIDg1LCAgIDkwLCAgIDk1LCAgMTAwLCAgMTAwLCAgMTAwLCAgMTAwLAorfTsKKworCitzdGF0aWMgY29uc3QgaW50IGdmX2FkanVzdF90YWJsZVsxMDFdID0KK3sKKyAgICAxMDAsCisgICAgMTE1LCAxMzAsIDE0NSwgMTYwLCAxNzUsIDE5MCwgMjAwLCAyMTAsIDIyMCwgMjMwLAorICAgIDI0MCwgMjYwLCAyNzAsIDI4MCwgMjkwLCAzMDAsIDMxMCwgMzIwLCAzMzAsIDM0MCwKKyAgICAzNTAsIDM2MCwgMzcwLCAzODAsIDM5MCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsCisgICAgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLAorICAgIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwKKyAgICA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsCisgICAgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLAorICAgIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwKKyAgICA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsCisgICAgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBnZl9pbnRyYV91c2FnZV9hZGp1c3RtZW50WzIwXSA9Cit7CisgICAgMTI1LCAxMjAsIDExNSwgMTEwLCAxMDUsIDEwMCwgIDk1LCAgODUsICA4MCwgIDc1LAorICAgIDcwLCAgNjUsICA2MCwgIDU1LCAgNTAsICA1MCwgIDUwLCAgNTAsICA1MCwgIDUwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBnZl9pbnRlcnZhbF90YWJsZVsxMDFdID0KK3sKKyAgICA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHByaW9yX2tleV9mcmFtZV93ZWlnaHRbS0VZX0ZSQU1FX0NPTlRFWFRdID0geyAxLCAyLCAzLCA0LCA1IH07CisKKwordm9pZCB2cDhfc2F2ZV9jb2RpbmdfY29udGV4dChWUDhfQ09NUCAqY3BpKQoreworICAgIENPRElOR19DT05URVhUICpjb25zdCBjYyA9ICYgY3BpLT5jb2RpbmdfY29udGV4dDsKKworICAgIC8qIFN0b3JlcyBhIHNuYXBzaG90IG9mIGtleSBzdGF0ZSB2YXJpYWJsZXMgd2hpY2ggY2FuIHN1YnNlcXVlbnRseSBiZQorICAgICAqIHJlc3RvcmVkIHdpdGggYSBjYWxsIHRvIHZwOF9yZXN0b3JlX2NvZGluZ19jb250ZXh0LiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgICAgICogaW50ZW5kZWQgZm9yIHVzZSBpbiBhIHJlLWNvZGUgbG9vcCBpbiB2cDhfY29tcHJlc3NfZnJhbWUgd2hlcmUgdGhlCisgICAgICogcXVhbnRpemVyIHZhbHVlIGlzIGFkanVzdGVkIGJldHdlZW4gbG9vcCBpdGVyYXRpb25zLgorICAgICAqLworCisgICAgY2MtPmZyYW1lc19zaW5jZV9rZXkgICAgICAgICAgPSBjcGktPmZyYW1lc19zaW5jZV9rZXk7CisgICAgY2MtPmZpbHRlcl9sZXZlbCAgICAgICAgICAgICA9IGNwaS0+Y29tbW9uLmZpbHRlcl9sZXZlbDsKKyAgICBjYy0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSAgID0gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOworICAgIGNjLT5mcmFtZXNfc2luY2VfZ29sZGVuICAgICAgID0gY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbjsKKworICAgIHZwOF9jb3B5KGNjLT5tdmMsICAgICAgY3BpLT5jb21tb24uZmMubXZjKTsKKyAgICB2cDhfY29weShjYy0+bXZjb3N0cywgIGNwaS0+cmRfY29zdHMubXZjb3N0cyk7CisKKyAgICB2cDhfY29weShjYy0+eW1vZGVfcHJvYiwgICBjcGktPmNvbW1vbi5mYy55bW9kZV9wcm9iKTsKKyAgICB2cDhfY29weShjYy0+dXZfbW9kZV9wcm9iLCAgY3BpLT5jb21tb24uZmMudXZfbW9kZV9wcm9iKTsKKworICAgIHZwOF9jb3B5KGNjLT55bW9kZV9jb3VudCwgY3BpLT5tYi55bW9kZV9jb3VudCk7CisgICAgdnA4X2NvcHkoY2MtPnV2X21vZGVfY291bnQsIGNwaS0+bWIudXZfbW9kZV9jb3VudCk7CisKKworICAgIC8qIFN0YXRzICovCisjaWZkZWYgTU9ERV9TVEFUUworICAgIHZwOF9jb3B5KGNjLT55X21vZGVzLCAgICAgICB5X21vZGVzKTsKKyAgICB2cDhfY29weShjYy0+dXZfbW9kZXMsICAgICAgdXZfbW9kZXMpOworICAgIHZwOF9jb3B5KGNjLT5iX21vZGVzLCAgICAgICBiX21vZGVzKTsKKyAgICB2cDhfY29weShjYy0+aW50ZXJfeV9tb2RlcywgIGludGVyX3lfbW9kZXMpOworICAgIHZwOF9jb3B5KGNjLT5pbnRlcl91dl9tb2RlcywgaW50ZXJfdXZfbW9kZXMpOworICAgIHZwOF9jb3B5KGNjLT5pbnRlcl9iX21vZGVzLCAgaW50ZXJfYl9tb2Rlcyk7CisjZW5kaWYKKworICAgIGNjLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPSBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYTsKK30KKworCit2b2lkIHZwOF9yZXN0b3JlX2NvZGluZ19jb250ZXh0KFZQOF9DT01QICpjcGkpCit7CisgICAgQ09ESU5HX0NPTlRFWFQgKmNvbnN0IGNjID0gJiBjcGktPmNvZGluZ19jb250ZXh0OworCisgICAgLyogUmVzdG9yZSBrZXkgc3RhdGUgdmFyaWFibGVzIHRvIHRoZSBzbmFwc2hvdCBzdGF0ZSBzdG9yZWQgaW4gdGhlCisgICAgICogcHJldmlvdXMgY2FsbCB0byB2cDhfc2F2ZV9jb2RpbmdfY29udGV4dC4KKyAgICAgKi8KKworICAgIGNwaS0+ZnJhbWVzX3NpbmNlX2tleSAgICAgICAgID0gICBjYy0+ZnJhbWVzX3NpbmNlX2tleTsKKyAgICBjcGktPmNvbW1vbi5maWx0ZXJfbGV2ZWwgICAgID0gICBjYy0+ZmlsdGVyX2xldmVsOworICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSAgPSAgIGNjLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOworICAgIGNwaS0+Y29tbW9uLmZyYW1lc19zaW5jZV9nb2xkZW4gICAgICAgPSAgIGNjLT5mcmFtZXNfc2luY2VfZ29sZGVuOworCisgICAgdnA4X2NvcHkoY3BpLT5jb21tb24uZmMubXZjLCBjYy0+bXZjKTsKKworICAgIHZwOF9jb3B5KGNwaS0+cmRfY29zdHMubXZjb3N0cywgY2MtPm12Y29zdHMpOworCisgICAgdnA4X2NvcHkoY3BpLT5jb21tb24uZmMueW1vZGVfcHJvYiwgICBjYy0+eW1vZGVfcHJvYik7CisgICAgdnA4X2NvcHkoY3BpLT5jb21tb24uZmMudXZfbW9kZV9wcm9iLCAgY2MtPnV2X21vZGVfcHJvYik7CisKKyAgICB2cDhfY29weShjcGktPm1iLnltb2RlX2NvdW50LCBjYy0+eW1vZGVfY291bnQpOworICAgIHZwOF9jb3B5KGNwaS0+bWIudXZfbW9kZV9jb3VudCwgY2MtPnV2X21vZGVfY291bnQpOworCisgICAgLyogU3RhdHMgKi8KKyNpZmRlZiBNT0RFX1NUQVRTCisgICAgdnA4X2NvcHkoeV9tb2RlcywgY2MtPnlfbW9kZXMpOworICAgIHZwOF9jb3B5KHV2X21vZGVzLCBjYy0+dXZfbW9kZXMpOworICAgIHZwOF9jb3B5KGJfbW9kZXMsIGNjLT5iX21vZGVzKTsKKyAgICB2cDhfY29weShpbnRlcl95X21vZGVzLCBjYy0+aW50ZXJfeV9tb2Rlcyk7CisgICAgdnA4X2NvcHkoaW50ZXJfdXZfbW9kZXMsIGNjLT5pbnRlcl91dl9tb2Rlcyk7CisgICAgdnA4X2NvcHkoaW50ZXJfYl9tb2RlcywgY2MtPmludGVyX2JfbW9kZXMpOworI2VuZGlmCisKKworICAgIGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID0gY2MtPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYTsKK30KKworCit2b2lkIHZwOF9zZXR1cF9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvKiBTZXR1cCBmb3IgS2V5IGZyYW1lOiAqLworCisgICAgdnA4X2RlZmF1bHRfY29lZl9wcm9icygmIGNwaS0+Y29tbW9uKTsKKworICAgIHZweF9tZW1jcHkoY3BpLT5jb21tb24uZmMubXZjLCB2cDhfZGVmYXVsdF9tdl9jb250ZXh0LCBzaXplb2YodnA4X2RlZmF1bHRfbXZfY29udGV4dCkpOworICAgIHsKKyAgICAgICAgaW50IGZsYWdbMl0gPSB7MSwgMX07CisgICAgICAgIHZwOF9idWlsZF9jb21wb25lbnRfY29zdF90YWJsZShjcGktPm1iLm12Y29zdCwgKGNvbnN0IE1WX0NPTlRFWFQgKikgY3BpLT5jb21tb24uZmMubXZjLCBmbGFnKTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSBzZXBhcmF0ZSBjb250ZXh0cyBmb3IgYWx0cmVmLGdvbGQsIGFuZCBub3JtYWwuCisgICAgICogVE9ETyBzaG91bGRuJ3QgbmVlZCAzIGRpZmZlcmVudCBjb3BpZXMgb2Ygc3RydWN0dXJlIHRvIGRvIHRoaXMhCisgICAgICovCisgICAgdnB4X21lbWNweSgmY3BpLT5sZmNfYSwgJmNwaS0+Y29tbW9uLmZjLCBzaXplb2YoY3BpLT5jb21tb24uZmMpKTsKKyAgICB2cHhfbWVtY3B5KCZjcGktPmxmY19nLCAmY3BpLT5jb21tb24uZmMsIHNpemVvZihjcGktPmNvbW1vbi5mYykpOworICAgIHZweF9tZW1jcHkoJmNwaS0+bGZjX24sICZjcGktPmNvbW1vbi5mYywgc2l6ZW9mKGNwaS0+Y29tbW9uLmZjKSk7CisKKyAgICBjcGktPmNvbW1vbi5maWx0ZXJfbGV2ZWwgPSBjcGktPmNvbW1vbi5iYXNlX3FpbmRleCAqIDMgLyA4IDsKKworICAgIC8qIFByb3Zpc2lvbmFsIGludGVydmFsIGJlZm9yZSBuZXh0IEdGICovCisgICAgaWYgKGNwaS0+YXV0b19nb2xkKQorICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOworICAgIGVsc2UKKyAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gREVGQVVMVF9HRl9JTlRFUlZBTDsKKworICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gMTsKKyAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSAxOworfQorCisKK3N0YXRpYyBpbnQgZXN0aW1hdGVfYml0c19hdF9xKGludCBmcmFtZV9raW5kLCBpbnQgUSwgaW50IE1CcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3JyZWN0aW9uX2ZhY3RvcikKK3sKKyAgICBpbnQgQnBtID0gKGludCkoLjUgKyBjb3JyZWN0aW9uX2ZhY3RvciAqIHZwOF9iaXRzX3Blcl9tYltmcmFtZV9raW5kXVtRXSk7CisKKyAgICAvKiBBdHRlbXB0IHRvIHJldGFpbiByZWFzb25hYmxlIGFjY3VyYWN5IHdpdGhvdXQgb3ZlcmZsb3cuIFRoZSBjdXRvZmYgaXMKKyAgICAgKiBjaG9zZW4gc3VjaCB0aGF0IHRoZSBtYXhpbXVtIHByb2R1Y3Qgb2YgQnBtIGFuZCBNQnMgZml0cyAzMSBiaXRzLiBUaGUKKyAgICAgKiBsYXJnZXN0IEJwbSB0YWtlcyAyMCBiaXRzLgorICAgICAqLworICAgIGlmIChNQnMgPiAoMSA8PCAxMSkpCisgICAgICAgIHJldHVybiAoQnBtID4+IEJQRVJfTUJfTk9STUJJVFMpICogTUJzOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChCcG0gKiBNQnMpID4+IEJQRVJfTUJfTk9STUJJVFM7Cit9CisKKworc3RhdGljIHZvaWQgY2FsY19pZnJhbWVfdGFyZ2V0X3NpemUoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvKiBib29zdCBkZWZhdWx0cyB0byBoYWxmIHNlY29uZCAqLworICAgIGludCBrZl9ib29zdDsKKyAgICB1aW50NjRfdCB0YXJnZXQ7CisKKyAgICAvKiBDbGVhciBkb3duIG1teCByZWdpc3RlcnMgdG8gYWxsb3cgZmxvYXRpbmcgcG9pbnQgaW4gd2hhdCBmb2xsb3dzICovCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDApCisgICAgeworICAgICAgICBpbnQgUSA9IGNwaS0+b3hjZi5rZXlfcTsKKworICAgICAgICB0YXJnZXQgPSBlc3RpbWF0ZV9iaXRzX2F0X3EoSU5UUkFfRlJBTUUsIFEsIGNwaS0+Y29tbW9uLk1CcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+a2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3IpOworICAgIH0KKyAgICBlbHNlIGlmIChjcGktPnBhc3MgPT0gMikKKyAgICB7CisgICAgICAgIC8qIE5ldyBUd28gcGFzcyBSQyAqLworICAgICAgICB0YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgfQorICAgIC8qIEZpcnN0IEZyYW1lIGlzIGEgc3BlY2lhbCBjYXNlICovCisgICAgZWxzZSBpZiAoY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogMSBQYXNzIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIG9uIHdoaWNoIHRvIGJhc2Ugc2l6ZSBzbyB1c2UKKyAgICAgICAgICogYmFuZHdpZHRoIHBlciBzZWNvbmQgKiBmcmFjdGlvbiBvZiB0aGUgaW5pdGlhbCBidWZmZXIKKyAgICAgICAgICogbGV2ZWwKKyAgICAgICAgICovCisgICAgICAgIHRhcmdldCA9IGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwgLyAyOworCisgICAgICAgIGlmKHRhcmdldCA+IGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoICogMyAvIDIpCisgICAgICAgICAgICB0YXJnZXQgPSBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAqIDMgLyAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBpZiB0aGlzIGtleWZyYW1lIHdhcyBmb3JjZWQsIHVzZSBhIG1vcmUgcmVjZW50IFEgZXN0aW1hdGUgKi8KKyAgICAgICAgaW50IFEgPSAoY3BpLT5jb21tb24uZnJhbWVfZmxhZ3MgJiBGUkFNRUZMQUdTX0tFWSkKKyAgICAgICAgICAgICAgICA/IGNwaS0+YXZnX2ZyYW1lX3FpbmRleCA6IGNwaS0+bmlfYXZfcWk7CisKKyAgICAgICAgaW50IGluaXRpYWxfYm9vc3QgPSAzMjsgLyogfDMuMCAqIHBlcl9mcmFtZV9iYW5kd2lkdGh8ICovCisgICAgICAgIC8qIEJvb3N0IGRlcGVuZHMgc29tZXdoYXQgb24gZnJhbWUgcmF0ZTogb25seSB1c2VkIGZvciAxIGxheWVyIGNhc2UuICovCisgICAgICAgIGlmIChjcGktPm94Y2YubnVtYmVyX29mX2xheWVycyA9PSAxKSB7CisgICAgICAgICAga2ZfYm9vc3QgPSBNQVgoaW5pdGlhbF9ib29zdCwgKGludCkoMiAqIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUgLSAxNikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIEluaXRpYWwgZmFjdG9yOiBzZXQgdGFyZ2V0IHNpemUgdG86IHwzLjAgKiBwZXJfZnJhbWVfYmFuZHdpZHRofC4gKi8KKyAgICAgICAgICBrZl9ib29zdCA9IGluaXRpYWxfYm9vc3Q7CisgICAgICAgIH0KKworICAgICAgICAvKiBhZGp1c3RtZW50IHVwIGJhc2VkIG9uIHE6IHRoaXMgZmFjdG9yIHJhbmdlcyBmcm9tIH4xLjIgdG8gMi4yLiAqLworICAgICAgICBrZl9ib29zdCA9IGtmX2Jvb3N0ICoga2ZfYm9vc3RfcWFkanVzdG1lbnRbUV0gLyAxMDA7CisKKyAgICAgICAgLyogZnJhbWUgc2VwYXJhdGlvbiBhZGp1c3RtZW50ICggZG93bikgKi8KKyAgICAgICAgaWYgKGNwaS0+ZnJhbWVzX3NpbmNlX2tleSAgPCBjcGktPm91dHB1dF9mcmFtZV9yYXRlIC8gMikKKyAgICAgICAgICAgIGtmX2Jvb3N0ID0gKGludCkoa2ZfYm9vc3QKKyAgICAgICAgICAgICAgICAgICAgICAgKiBjcGktPmZyYW1lc19zaW5jZV9rZXkgLyAoY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSAvIDIpKTsKKworICAgICAgICAvKiBNaW5pbWFsIHRhcmdldCBzaXplIGlzIHwyKiBwZXJfZnJhbWVfYmFuZHdpZHRofC4gKi8KKyAgICAgICAgaWYgKGtmX2Jvb3N0IDwgMTYpCisgICAgICAgICAgICBrZl9ib29zdCA9IDE2OworCisgICAgICAgIHRhcmdldCA9ICgoMTYgKyBrZl9ib29zdCkgKiBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGgpID4+IDQ7CisgICAgfQorCisKKyAgICBpZiAoY3BpLT5veGNmLnJjX21heF9pbnRyYV9iaXRyYXRlX3BjdCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBtYXhfcmF0ZSA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+b3hjZi5yY19tYXhfaW50cmFfYml0cmF0ZV9wY3QgLyAxMDA7CisKKyAgICAgICAgaWYgKHRhcmdldCA+IG1heF9yYXRlKQorICAgICAgICAgICAgdGFyZ2V0ID0gbWF4X3JhdGU7CisgICAgfQorCisgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IChpbnQpdGFyZ2V0OworCisgICAgLyogVE9ETzogaWYgd2Ugc2VwYXJhdGUgcmF0ZSB0YXJnZXRpbmcgZnJvbSBRIHRhcmdldHRpbmcsIG1vdmUgdGhpcy4KKyAgICAgKiBSZXNldCB0aGUgYWN0aXZlIHdvcnN0IHF1YWxpdHkgdG8gdGhlIGJhc2VsaW5lIHZhbHVlIGZvciBrZXkgZnJhbWVzLgorICAgICAqLworICAgIGlmIChjcGktPnBhc3MgIT0gMikKKyAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+d29yc3RfcXVhbGl0eTsKKworI2lmIDAKKyAgICB7CisgICAgICAgIEZJTEUgKmY7CisKKyAgICAgICAgZiA9IGZvcGVuKCJrZl9ib29zdC5zdHQiLCAiYSIpOworICAgICAgICBmcHJpbnRmKGYsICIgJTh1ICUxMGQgJTEwZCAlMTBkXG4iLAorICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsICBjcGktPmdmdV9ib29zdCwgY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCwgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nKTsKKworICAgICAgICBmY2xvc2UoZik7CisgICAgfQorI2VuZGlmCit9CisKKworLyogRG8gdGhlIGJlc3Qgd2UgY2FuIHRvIGRlZmluZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIG5leHQgR0YgYmFzZWQgb24gd2hhdAorICogaW5mb3JtYXRpb24gd2UgaGF2ZSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIGNhbGNfZ2ZfcGFyYW1zKFZQOF9DT01QICpjcGkpCit7CisgICAgaW50IFEgPSAoY3BpLT5veGNmLmZpeGVkX3EgPCAwKSA/IGNwaS0+bGFzdF9xW0lOVEVSX0ZSQU1FXSA6IGNwaS0+b3hjZi5maXhlZF9xOworICAgIGludCBCb29zdCA9IDA7CisKKyAgICBpbnQgZ2ZfZnJhbWVfdXNlYWdlID0gMDsgICAgICAvKiBHb2xkZW4gZnJhbWUgdXNlYWdlIHNpbmNlIGxhc3QgR0YgKi8KKyAgICBpbnQgdG90X21icyA9IGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtJTlRSQV9GUkFNRV0gICsKKyAgICAgICAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtMQVNUX0ZSQU1FXSAgICsKKyAgICAgICAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtHT0xERU5fRlJBTUVdICsKKyAgICAgICAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtBTFRSRUZfRlJBTUVdOworCisgICAgaW50IHBjdF9nZl9hY3RpdmUgPSAoMTAwICogY3BpLT5nZl9hY3RpdmVfY291bnQpIC8gKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzKTsKKworICAgIGlmICh0b3RfbWJzKQorICAgICAgICBnZl9mcmFtZV91c2VhZ2UgPSAoY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKyBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbQUxUUkVGX0ZSQU1FXSkgKiAxMDAgLyB0b3RfbWJzOworCisgICAgaWYgKHBjdF9nZl9hY3RpdmUgPiBnZl9mcmFtZV91c2VhZ2UpCisgICAgICAgIGdmX2ZyYW1lX3VzZWFnZSA9IHBjdF9nZl9hY3RpdmU7CisKKyAgICAvKiBOb3QgdHdvIHBhc3MgKi8KKyAgICBpZiAoY3BpLT5wYXNzICE9IDIpCisgICAgeworICAgICAgICAvKiBTaW5nbGUgUGFzcyBsYWdnZWQgbW9kZTogVEJEICovCisgICAgICAgIGlmICgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiBTaW5nbGUgUGFzcyBjb21wcmVzc2lvbjogSGFzIHRvIHVzZSBjdXJyZW50IGFuZCBoaXN0b3JpY2FsIGRhdGEgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgLyogRXhwZXJpbWVudGFsIGNvZGUgKi8KKyAgICAgICAgICAgIGludCBpbmRleCA9IGNwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXg7CisgICAgICAgICAgICBpbnQgZnJhbWVzX3RvX3NjYW4gPSAoY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgPD0gTUFYX0xBR19CVUZGRVJTKSA/IGNwaS0+bWF4X2dmX2ludGVydmFsIDogTUFYX0xBR19CVUZGRVJTOworCisgICAgICAgICAgICAvKiAqKioqKioqKioqKioqKiBFeHBlcmltZW50YWwgY29kZSAtIGluY29tcGxldGUgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBkb3VibGUgZGVjYXlfdmFsID0gMS4wOworICAgICAgICAgICAgZG91YmxlIElJQWNjdW11bGF0b3IgPSAwLjA7CisgICAgICAgICAgICBkb3VibGUgbGFzdF9paWFjY3VtdWxhdG9yID0gMC4wOworICAgICAgICAgICAgZG91YmxlIElJUmF0aW87CisKKyAgICAgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggPSBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lJU1BWF9MQUdfQlVGRkVSUzsKKworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCAoZnJhbWVzX3RvX3NjYW4gLSAxKTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gTUFYX0xBR19CVUZGRVJTOworICAgICAgICAgICAgICAgIGluZGV4IC0tOworCisgICAgICAgICAgICAgICAgaWYgKCBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2luZGV4XS5mcmFtZV9jb2RlZF9lcnJvciA+IDAuMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJSVJhdGlvID0gY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpbmRleF0uZnJhbWVfaW50cmFfZXJyb3IgLyBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2luZGV4XS5mcmFtZV9jb2RlZF9lcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIElJUmF0aW8gPiAzMC4wICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElJUmF0aW8gPSAzMC4wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIElJUmF0aW8gPSAzMC4wOworCisgICAgICAgICAgICAgICAgSUlBY2N1bXVsYXRvciArPSBJSVJhdGlvICogZGVjYXlfdmFsOworCisgICAgICAgICAgICAgICAgZGVjYXlfdmFsID0gZGVjYXlfdmFsICogY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpbmRleF0uZnJhbWVfcGNudF9pbnRlcjsKKworICAgICAgICAgICAgICAgIGlmICggICAgKGkgPiBNSU5fR0ZfSU5URVJWQUwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKElJQWNjdW11bGF0b3IgLSBsYXN0X2lpYWNjdW11bGF0b3IpIDwgMi4wKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF9paWFjY3VtdWxhdG9yID0gSUlBY2N1bXVsYXRvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQm9vc3QgPSBJSUFjY3VtdWxhdG9yKjEwMC4wLzE2LjA7CisgICAgICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0gaTsKKworICAgICAgICAgICAgKi8KKyNlbHNlCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogT0xEIGNvZGUgKi8KKworICAgICAgICAgICAgLyogQWRqdXN0IGJvb3N0IGJhc2VkIHVwb24gYW1iaWVudCBRICovCisgICAgICAgICAgICBCb29zdCA9IEdGUV9BREpVU1RNRU5UOworCisgICAgICAgICAgICAvKiBBZGp1c3QgYmFzZWQgdXBvbiBtb3N0IHJlY2VudGx5IG1lYXN1cmUgaW50cmEgdXNlYWdlICovCisgICAgICAgICAgICBCb29zdCA9IEJvb3N0ICogZ2ZfaW50cmFfdXNhZ2VfYWRqdXN0bWVudFsoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPCAxNSkgPyBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA6IDE0XSAvIDEwMDsKKworICAgICAgICAgICAgLyogQWRqdXN0IGdmIGJvb3N0IGJhc2VkIHVwb24gR0YgdXNhZ2Ugc2luY2UgbGFzdCBHRiAqLworICAgICAgICAgICAgQm9vc3QgPSBCb29zdCAqIGdmX2FkanVzdF90YWJsZVtnZl9mcmFtZV91c2VhZ2VdIC8gMTAwOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvKiBnb2xkZW4gZnJhbWUgYm9vc3Qgd2l0aG91dCByZWNvZGUgbG9vcCBvZnRlbiBnb2VzIGF3cnkuICBiZQorICAgICAgICAgKiBzYWZlIGJ5IGtlZXBpbmcgbnVtYmVycyBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFjcGktPnNmLnJlY29kZV9sb29wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDIpCisgICAgICAgICAgICAgICAgQm9vc3QgPSBCb29zdCAvIDI7CisgICAgICAgIH0KKworICAgICAgICAvKiBBcHBseSBhbiB1cHBlciBsaW1pdCBiYXNlZCBvbiBRIGZvciAxIHBhc3MgZW5jb2RlcyAqLworICAgICAgICBpZiAoQm9vc3QgPiBrZl9nZl9ib29zdF9xbGltaXRzW1FdICYmIChjcGktPnBhc3MgPT0gMCkpCisgICAgICAgICAgICBCb29zdCA9IGtmX2dmX2Jvb3N0X3FsaW1pdHNbUV07CisKKyAgICAgICAgLyogQXBwbHkgbG93ZXIgbGltaXRzIHRvIGJvb3N0LiAqLworICAgICAgICBlbHNlIGlmIChCb29zdCA8IDExMCkKKyAgICAgICAgICAgIEJvb3N0ID0gMTEwOworCisgICAgICAgIC8qIE5vdGUgdGhlIGJvb3N0IHVzZWQgKi8KKyAgICAgICAgY3BpLT5sYXN0X2Jvb3N0ID0gQm9vc3Q7CisKKyAgICB9CisKKyAgICAvKiBFc3RpbWF0ZSBuZXh0IGludGVydmFsCisgICAgICogVGhpcyBpcyB1cGRhdGVkIG9uY2UgdGhlIHJlYWwgZnJhbWUgc2l6ZS9ib29zdCBpcyBrbm93bi4KKyAgICAgKi8KKyAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPT0gLTEpCisgICAgeworICAgICAgICBpZiAoY3BpLT5wYXNzID09IDIpICAgICAgICAgLyogMiBQYXNzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9IGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIFBhc3MgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbDsKKworICAgICAgICAgICAgaWYgKGNwaS0+bGFzdF9ib29zdCA+IDc1MCkKKyAgICAgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUrKzsKKworICAgICAgICAgICAgaWYgKGNwaS0+bGFzdF9ib29zdCA+IDEwMDApCisgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlKys7CisKKyAgICAgICAgICAgIGlmIChjcGktPmxhc3RfYm9vc3QgPiAxMjUwKQorICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSsrOworCisgICAgICAgICAgICBpZiAoY3BpLT5sYXN0X2Jvb3N0ID49IDE1MDApCisgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlICsrOworCisgICAgICAgICAgICBpZiAoZ2ZfaW50ZXJ2YWxfdGFibGVbZ2ZfZnJhbWVfdXNlYWdlXSA+IGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSkKKyAgICAgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBnZl9pbnRlcnZhbF90YWJsZVtnZl9mcmFtZV91c2VhZ2VdOworCisgICAgICAgICAgICBpZiAoY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID4gY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5tYXhfZ2ZfaW50ZXJ2YWw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOworCisgICAgLyogQVJGIG9uIG9yIG9mZiAqLworICAgIGlmIChjcGktPnBhc3MgIT0gMikKKyAgICB7CisgICAgICAgIC8qIEZvciBub3cgQWx0IHJlZiBpcyBub3QgYWxsb3dlZCBleGNlcHQgaW4gMiBwYXNzIG1vZGVzLiAqLworICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgPSAwOworCisgICAgICAgIC8qaWYgKCBjcGktPm94Y2YuZml4ZWRfcSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBjcGktPm94Y2YucGxheV9hbHRlcm5hdGUgJiYgKGNwaS0+bGFzdF9ib29zdCA+ICgxMDAgKyAoQUZfVEhSRVNIKmNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSkpICkgKQorICAgICAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gMDsKKyAgICAgICAgfSovCisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNhbGNfcGZyYW1lX3RhcmdldF9zaXplKFZQOF9DT01QICpjcGkpCit7CisgICAgaW50IG1pbl9mcmFtZV90YXJnZXQ7CisgICAgaW50IEFkanVzdG1lbnQ7CisgICAgaW50IG9sZF9wZXJfZnJhbWVfYmFuZHdpZHRoID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoOworCisgICAgaWYgKCBjcGktPmN1cnJlbnRfbGF5ZXIgPiAwKQorICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggPQorICAgICAgICAgICAgY3BpLT5sYXllcl9jb250ZXh0W2NwaS0+Y3VycmVudF9sYXllcl0uYXZnX2ZyYW1lX3NpemVfZm9yX2xheWVyOworCisgICAgbWluX2ZyYW1lX3RhcmdldCA9IDA7CisKKyAgICBpZiAoY3BpLT5wYXNzID09IDIpCisgICAgeworICAgICAgICBtaW5fZnJhbWVfdGFyZ2V0ID0gY3BpLT5taW5fZnJhbWVfYmFuZHdpZHRoOworCisgICAgICAgIGlmIChtaW5fZnJhbWVfdGFyZ2V0IDwgKGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCA+PiA1KSkKKyAgICAgICAgICAgIG1pbl9mcmFtZV90YXJnZXQgPSBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggPj4gNTsKKyAgICB9CisgICAgZWxzZSBpZiAobWluX2ZyYW1lX3RhcmdldCA8IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAvIDQpCisgICAgICAgIG1pbl9mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggLyA0OworCisKKyAgICAvKiBTcGVjaWFsIGFsdCByZWZlcmVuY2UgZnJhbWUgY2FzZSAqLworICAgIGlmKChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpICYmIChjcGktPm94Y2YubnVtYmVyX29mX2xheWVycyA9PSAxKSkKKyAgICB7CisgICAgICAgIGlmIChjcGktPnBhc3MgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgLyogUGVyIGZyYW1lIGJpdCB0YXJnZXQgZm9yIHRoZSBhbHQgcmVmIGZyYW1lICovCisgICAgICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggPSBjcGktPnR3b3Bhc3MuZ2ZfYml0czsKKyAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICAvKiBPbmUgUGFzcyA/Pz8gVEJEICovCisgICAgfQorCisgICAgLyogTm9ybWFsIGZyYW1lcyAoZ2YsYW5kIGludGVyKSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDIgcGFzcyAqLworICAgICAgICBpZiAoY3BpLT5wYXNzID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgLyogMSBwYXNzICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWFrZSByYXRlIGFkanVzdG1lbnQgdG8gcmVjb3ZlciBiaXRzIHNwZW50IGluIGtleSBmcmFtZQorICAgICAgICAgICAgICogVGVzdCB0byBzZWUgaWYgdGhlIGtleSBmcmFtZSBpbnRlciBkYXRhIHJhdGUgY29ycmVjdGlvbgorICAgICAgICAgICAgICogc2hvdWxkIHN0aWxsIGJlIGluIGZvcmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjcGktPmtmX292ZXJzcGVuZF9iaXRzID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gKGNwaS0+a2ZfYml0cmF0ZV9hZGp1c3RtZW50IDw9IGNwaS0+a2Zfb3ZlcnNwZW5kX2JpdHMpID8gY3BpLT5rZl9iaXRyYXRlX2FkanVzdG1lbnQgOiBjcGktPmtmX292ZXJzcGVuZF9iaXRzOworCisgICAgICAgICAgICAgICAgaWYgKEFkanVzdG1lbnQgPiAoY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoIC0gbWluX2ZyYW1lX3RhcmdldCkpCisgICAgICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAoY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoIC0gbWluX2ZyYW1lX3RhcmdldCk7CisKKyAgICAgICAgICAgICAgICBjcGktPmtmX292ZXJzcGVuZF9iaXRzIC09IEFkanVzdG1lbnQ7CisKKyAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYW4gaW50ZXIgZnJhbWUgYmFuZHdpZHRoIHRhcmdldCBmb3IgdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgKiBmZXcgZnJhbWVzIGRlc2lnbmVkIHRvIHJlY292ZXIgYW55IGV4dHJhIGJpdHMgc3BlbnQgb24KKyAgICAgICAgICAgICAgICAgKiB0aGUga2V5IGZyYW1lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggLSBBZGp1c3RtZW50OworCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPCBtaW5fZnJhbWVfdGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gbWluX2ZyYW1lX3RhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoOworCisgICAgICAgICAgICAvKiBJZiBhcHByb3ByaWF0ZSBtYWtlIGFuIGFkanVzdG1lbnQgdG8gcmVjb3ZlciBiaXRzIHNwZW50IG9uIGEKKyAgICAgICAgICAgICAqIHJlY2VudCBHRgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGNwaS0+Z2Zfb3ZlcnNwZW5kX2JpdHMgPiAwKSAmJiAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA+IG1pbl9mcmFtZV90YXJnZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBBZGp1c3RtZW50ID0gKGNwaS0+bm9uX2dmX2JpdHJhdGVfYWRqdXN0bWVudCA8PSBjcGktPmdmX292ZXJzcGVuZF9iaXRzKSA/IGNwaS0+bm9uX2dmX2JpdHJhdGVfYWRqdXN0bWVudCA6IGNwaS0+Z2Zfb3ZlcnNwZW5kX2JpdHM7CisKKyAgICAgICAgICAgICAgICBpZiAoQWRqdXN0bWVudCA+IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gbWluX2ZyYW1lX3RhcmdldCkpCisgICAgICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAtIG1pbl9mcmFtZV90YXJnZXQpOworCisgICAgICAgICAgICAgICAgY3BpLT5nZl9vdmVyc3BlbmRfYml0cyAtPSBBZGp1c3RtZW50OworICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLT0gQWRqdXN0bWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQXBwbHkgc21hbGwgKyBhbmQgLSBib29zdHMgZm9yIG5vbiBnZiBmcmFtZXMgKi8KKyAgICAgICAgICAgIGlmICgoY3BpLT5sYXN0X2Jvb3N0ID4gMTUwKSAmJiAoY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoY3BpLT5jdXJyZW50X2dmX2ludGVydmFsID49IChNSU5fR0ZfSU5URVJWQUwgPDwgMSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qICUgQWRqdXN0bWVudCBsaW1pdGVkIHRvIHRoZSByYW5nZSAxJSB0byAxMCUgKi8KKyAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gKGNwaS0+bGFzdF9ib29zdCAtIDEwMCkgPj4gNTsKKworICAgICAgICAgICAgICAgIGlmIChBZGp1c3RtZW50IDwgMSkKKyAgICAgICAgICAgICAgICAgICAgQWRqdXN0bWVudCA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWRqdXN0bWVudCA+IDEwKQorICAgICAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gMTA7CisKKyAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiBBZGp1c3RtZW50KSAvIDEwMDsKKworICAgICAgICAgICAgICAgIGlmIChBZGp1c3RtZW50ID4gKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLSBtaW5fZnJhbWVfdGFyZ2V0KSkKKyAgICAgICAgICAgICAgICAgICAgQWRqdXN0bWVudCA9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gbWluX2ZyYW1lX3RhcmdldCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA9PSAoY3BpLT5jdXJyZW50X2dmX2ludGVydmFsID4+IDEpKQorICAgICAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICs9ICgoY3BpLT5jdXJyZW50X2dmX2ludGVydmFsIC0gMSkgKiBBZGp1c3RtZW50KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLT0gQWRqdXN0bWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNhbml0eSBjaGVjayB0aGF0IHRoZSB0b3RhbCBzdW0gb2YgYWRqdXN0bWVudHMgaXMgbm90IGFib3ZlIHRoZQorICAgICAqIG1heGltdW0gYWxsb3dlZCBUaGF0IGlzIHRoYXQgaGF2aW5nIGFsbG93ZWQgZm9yIEtGIGFuZCBHRiBwZW5hbHRpZXMKKyAgICAgKiB3ZSBoYXZlIG5vdCBwdXNoZWQgdGhlIGN1cnJlbnQgaW50ZXJmcmFtZSB0YXJnZXQgdG8gbG93LiBJZiB0aGUKKyAgICAgKiBhZGp1c3RtZW50IHdlIGFwcGx5IGhlcmUgaXMgbm90IGNhcGFibGUgb2YgcmVjb3ZlcmluZyBhbGwgdGhlIGV4dHJhCisgICAgICogYml0cyB3ZSBoYXZlIHNwZW50IGluIHRoZSBLRiBvciBHRiB0aGVuIHRoZSByZW1haW5kZXIgd2lsbCBoYXZlIHRvCisgICAgICogYmUgcmVjb3ZlcmVkIG92ZXIgYSBsb25nZXIgdGltZSBzcGFuIHZpYSBvdGhlciBidWZmZXIgLyByYXRlIGNvbnRyb2wKKyAgICAgKiBtZWNoYW5pc21zLgorICAgICAqLworICAgIGlmIChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IDwgbWluX2ZyYW1lX3RhcmdldCkKKyAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IG1pbl9mcmFtZV90YXJnZXQ7CisKKyAgICBpZiAoIWNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgLyogTm90ZSB0aGUgYmFzZWxpbmUgdGFyZ2V0IGRhdGEgcmF0ZSBmb3IgdGhpcyBpbnRlciBmcmFtZS4gKi8KKyAgICAgICAgY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0OworCisgICAgLyogT25lIFBhc3Mgc3BlY2lmaWMgY29kZSAqLworICAgIGlmIChjcGktPnBhc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIEFkYXB0IHRhcmdldCBmcmFtZSBzaXplIHdpdGggcmVzcGVjdCB0byBhbnkgYnVmZmVyaW5nIGNvbnN0cmFpbnRzOiAqLworICAgICAgICBpZiAoY3BpLT5idWZmZXJlZF9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb25lX3BlcmNlbnRfYml0cyA9IChpbnQpCisgICAgICAgICAgICAgICAgKDEgKyBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgLyAxMDApOworCisgICAgICAgICAgICBpZiAoKGNwaS0+YnVmZmVyX2xldmVsIDwgY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKSB8fAorICAgICAgICAgICAgICAgIChjcGktPmJpdHNfb2ZmX3RhcmdldCA8IGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRfbG93ID0gMDsKKworICAgICAgICAgICAgICAgIC8qIERlY2lkZSB3aGV0aGVyIG9yIG5vdCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgZnJhbWUgZGF0YQorICAgICAgICAgICAgICAgICAqIHJhdGUgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogSWYgd2UgYXJlIGFyZSBiZWxvdyB0aGUgb3B0aW1hbCBidWZmZXIgZnVsbG5lc3MgbGV2ZWwKKyAgICAgICAgICAgICAgICAgKiBhbmQgYWRoZXJlbmNlIHRvIGJ1ZmZlcmluZyBjb25zdHJhaW50cyBpcyBpbXBvcnRhbnQgdG8KKyAgICAgICAgICAgICAgICAgKiB0aGUgZW5kIHVzYWdlIHRoZW4gYWRqdXN0IHRoZSBwZXIgZnJhbWUgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICgoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpICYmCisgICAgICAgICAgICAgICAgICAgIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwZXJjZW50X2xvdyA9IChpbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAoKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAtIGNwaS0+YnVmZmVyX2xldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICBvbmVfcGVyY2VudF9iaXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQXJlIHdlIG92ZXJzaG9vdGluZyB0aGUgbG9uZyB0ZXJtIGNsaXAgZGF0YSByYXRlLi4uICovCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5iaXRzX29mZl90YXJnZXQgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQWRqdXN0IHBlciBmcmFtZSBkYXRhIHRhcmdldCBkb3dud2FyZHMgdG8gY29tcGVuc2F0ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9sb3cgPSAoaW50KSgxMDAgKiAtY3BpLT5iaXRzX29mZl90YXJnZXQgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+dG90YWxfYnl0ZV9jb3VudCAqIDgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGVyY2VudF9sb3cgPiBjcGktPm94Y2YudW5kZXJfc2hvb3RfcGN0KQorICAgICAgICAgICAgICAgICAgICBwZXJjZW50X2xvdyA9IGNwaS0+b3hjZi51bmRlcl9zaG9vdF9wY3Q7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGVyY2VudF9sb3cgPCAwKQorICAgICAgICAgICAgICAgICAgICBwZXJjZW50X2xvdyA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBsb3dlciB0aGUgdGFyZ2V0IGJhbmR3aWR0aCBmb3IgdGhpcyBmcmFtZS4gKi8KKyAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC09CisgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIHBlcmNlbnRfbG93KSAvIDIwMDsKKworICAgICAgICAgICAgICAgIC8qIEFyZSB3ZSB1c2luZyBhbGxvd2luZyBjb250cm9sIG9mIGFjdGl2ZV93b3JzdF9hbGxvd2VkX3EKKyAgICAgICAgICAgICAgICAgKiBhY2NvcmRpbmcgdG8gYnVmZmVyIGxldmVsLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChjcGktPmF1dG9fd29yc3RfcSAmJiBjcGktPm5pX2ZyYW1lcyA+IDE1MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3JpdGljYWxfYnVmZmVyX2xldmVsOworCisgICAgICAgICAgICAgICAgICAgIC8qIEZvciBzdHJlYW1pbmcgYXBwbGljYXRpb25zIHRoZSBtb3N0IGltcG9ydGFudCBmYWN0b3IgaXMKKyAgICAgICAgICAgICAgICAgICAgICogY3BpLT5idWZmZXJfbGV2ZWwgYXMgdGhpcyB0YWtlcyBpbnRvIGFjY291bnQgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIHNwZWNpZmllZCBzaG9ydCB0ZXJtIGJ1ZmZlcmluZyBjb25zdHJhaW50cy4gSG93ZXZlciwKKyAgICAgICAgICAgICAgICAgICAgICogaGl0dGluZyB0aGUgbG9uZyB0ZXJtIGNsaXAgZGF0YSByYXRlIHRhcmdldCBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAqIGltcG9ydGFudC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFrZSB0aGUgc21hbGxlciBvZiBjcGktPmJ1ZmZlcl9sZXZlbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+Yml0c19vZmZfdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRpY2FsX2J1ZmZlcl9sZXZlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+YnVmZmVyX2xldmVsIDwgY3BpLT5iaXRzX29mZl90YXJnZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjcGktPmJ1ZmZlcl9sZXZlbCA6IGNwaS0+Yml0c19vZmZfdGFyZ2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIEZvciBsb2NhbCBmaWxlIHBsYXliYWNrIHNob3J0IHRlcm0gYnVmZmVyaW5nIGNvbnN0cmFpbnRzCisgICAgICAgICAgICAgICAgICAgICAqIGFyZSBsZXNzIG9mIGFuIGlzc3VlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnNpZGVyIG9ubHkgaG93IHdlIGFyZSBkb2luZyBmb3IgdGhlIGNsaXAgYXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICogd2hvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGljYWxfYnVmZmVyX2xldmVsID0gY3BpLT5iaXRzX29mZl90YXJnZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFjdGl2ZSB3b3JzdCBxdWFsaXR5IGJhc2VkIHVwb24gdGhlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlciBmdWxsbmVzcyBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGljYWxfYnVmZmVyX2xldmVsIDwgY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNyaXRpY2FsX2J1ZmZlcl9sZXZlbCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgPj4gMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcWFkanVzdG1lbnRfcmFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPndvcnN0X3F1YWxpdHkgLSBjcGktPm5pX2F2X3FpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYWJvdmVfYmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcml0aWNhbF9idWZmZXJfbGV2ZWwgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA+PiAyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVwIGFjdGl2ZSB3b3JzdCBxdWFsaXR5IGRvd24gZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+bmlfYXZfcWkgd2hlbiAoY3JpdGljYWxfYnVmZmVyX2xldmVsID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3BpLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjcGktPndvcnN0X3F1YWxpdHkgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChjcml0aWNhbF9idWZmZXJfbGV2ZWwgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgY3BpLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA+PiAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPndvcnN0X3F1YWxpdHkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgocWFkanVzdG1lbnRfcmFuZ2UgKiBhYm92ZV9iYXNlKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKjM+PjIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gY3BpLT53b3JzdF9xdWFsaXR5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+bmlfYXZfcWk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+d29yc3RfcXVhbGl0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRfaGlnaCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQorICAgICAgICAgICAgICAgICAgICAgJiYgKGNwaS0+YnVmZmVyX2xldmVsID4gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfaGlnaCA9IChpbnQpKChjcGktPmJ1ZmZlcl9sZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gb25lX3BlcmNlbnRfYml0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNwaS0+Yml0c19vZmZfdGFyZ2V0ID4gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9oaWdoID0gKGludCkoKDEwMCAqIGNwaS0+Yml0c19vZmZfdGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjcGktPnRvdGFsX2J5dGVfY291bnQgKiA4KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRfaGlnaCA+IGNwaS0+b3hjZi5vdmVyX3Nob290X3BjdCkKKyAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9oaWdoID0gY3BpLT5veGNmLm92ZXJfc2hvb3RfcGN0OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBlcmNlbnRfaGlnaCA8IDApCisgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfaGlnaCA9IDA7CisKKyAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICs9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfaGlnaCkgLyAyMDA7CisKKyAgICAgICAgICAgICAgICAvKiBBcmUgd2UgYWxsb3dpbmcgY29udHJvbCBvZiBhY3RpdmVfd29yc3RfYWxsb3dlZF9xIGFjY29yZGluZworICAgICAgICAgICAgICAgICAqIHRvIGJ1ZmZlciBsZXZlbC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5hdXRvX3dvcnN0X3EgJiYgY3BpLT5uaV9mcmFtZXMgPiAxNTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBXaGVuIHVzaW5nIHRoZSByZWxheGVkIGJ1ZmZlciBtb2RlbCBzdGljayB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogdXNlciBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPm5pX2F2X3FpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gY3BpLT53b3JzdF9xdWFsaXR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2V0IGFjdGl2ZV9iZXN0X3F1YWxpdHkgdG8gcHJldmVudCBxdWFsaXR5IHJpc2luZyB0b28gaGlnaCAqLworICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5iZXN0X3F1YWxpdHk7CisKKyAgICAgICAgICAgIC8qIFdvcnN0IHF1YWxpdHkgb2J2aW91c2x5IG11c3Qgbm90IGJlIGJldHRlciB0aGFuIGJlc3QgcXVhbGl0eSAqLworICAgICAgICAgICAgaWYgKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPD0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5KQorICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgKyAxOworCisgICAgICAgICAgICBpZihjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID4gMTI3KQorICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSAxMjc7CisgICAgICAgIH0KKyAgICAgICAgLyogVW5idWZmZXJlZCBtb2RlIChlZy4gdmlkZW8gY29uZmVyZW5jaW5nKSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgYWN0aXZlIHdvcnN0IHF1YWxpdHkgKi8KKyAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPndvcnN0X3F1YWxpdHk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTcGVjaWFsIHRyYXAgZm9yIGNvbnN0cmFpbmVkIHF1YWxpdHkgbW9kZQorICAgICAgICAgKiAiYWN0aXZlX3dvcnN0X3F1YWxpdHkiIG1heSBuZXZlciBkcm9wIGJlbG93IGNxIGxldmVsCisgICAgICAgICAqIGZvciBhbnkgZnJhbWUgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICggY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9DT05TVFJBSU5FRF9RVUFMSVRZICYmCisgICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA8IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPmNxX3RhcmdldF9xdWFsaXR5OworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGVzdCB0byBzZWUgaWYgd2UgaGF2ZSB0byBkcm9wIGEgZnJhbWUKKyAgICAgKiBUaGUgYXV0by1kcm9wIGZyYW1lIGNvZGUgaXMgb25seSB1c2VkIGluIGJ1ZmZlcmVkIG1vZGUuCisgICAgICogSW4gdW5idWZmZXJkIG1vZGUgKGVnIHZpZGUgY29uZmVyZW5jaW5nKSB0aGUgZGVzY2lzaW9uIHRvCisgICAgICogY29kZSBvciBkcm9wIGEgZnJhbWUgaXMgbWFkZSBvdXRzaWRlIHRoZSBjb2RlYyBpbiByZXNwb25zZSB0byByZWFsCisgICAgICogd29ybGQgY29tbXMgb3IgYnVmZmVyIGNvbnNpZGVyYXRpb25zLgorICAgICAqLworICAgIGlmIChjcGktPmRyb3BfZnJhbWVzX2FsbG93ZWQgJiYKKyAgICAgICAgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKSAmJgorICAgICAgICAoKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKSkpCisgICAgeworICAgICAgICAvKiBDaGVjayBmb3IgYSBidWZmZXIgdW5kZXJ1bi1jcmlzaXMgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGRyb3AKKyAgICAgICAgICogYSBmcmFtZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjcGktPmJ1ZmZlcl9sZXZlbCA8IDApKQorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJkZWMuc3R0IiwgImEiKTsKKyAgICAgICAgICAgIGZwcmludGYoZiwgIiUxMGQgJTEwZCAlMTBkICUxMGQgKioqKiogQlVGRkVSIEVNUFRZXG4iLAorICAgICAgICAgICAgICAgICAgICAoaW50KSBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICBjcGktPmRlY2ltYXRpb25fZmFjdG9yLCBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgKGNwaS0+YnVmZmVyX2xldmVsICogMTAwKSAvIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCk7CisgICAgICAgICAgICBmY2xvc2UoZik7CisjZW5kaWYKKyAgICAgICAgICAgIGNwaS0+ZHJvcF9mcmFtZSA9IDE7CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGxldmVsIHZhcmlhYmxlLiAqLworICAgICAgICAgICAgY3BpLT5iaXRzX29mZl90YXJnZXQgKz0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOworICAgICAgICAgICAgaWYgKGNwaS0+Yml0c19vZmZfdGFyZ2V0ID4gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpCisgICAgICAgICAgICAgIGNwaS0+Yml0c19vZmZfdGFyZ2V0ID0gKGludCljcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZTsKKyAgICAgICAgICAgIGNwaS0+YnVmZmVyX2xldmVsID0gY3BpLT5iaXRzX29mZl90YXJnZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBZGp1c3QgdGFyZ2V0IGZyYW1lIHNpemUgZm9yIEdvbGRlbiBGcmFtZXM6ICovCisgICAgaWYgKGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSA9PSAwICYmCisgICAgICAgIChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPT0gMCkgJiYgIWNwaS0+ZHJvcF9mcmFtZSkKKyAgICB7CisgICAgICAgIGludCBRID0gKGNwaS0+b3hjZi5maXhlZF9xIDwgMCkgPyBjcGktPmxhc3RfcVtJTlRFUl9GUkFNRV0gOiBjcGktPm94Y2YuZml4ZWRfcTsKKworICAgICAgICBpbnQgZ2ZfZnJhbWVfdXNlYWdlID0gMDsgICAgICAvKiBHb2xkZW4gZnJhbWUgdXNlYWdlIHNpbmNlIGxhc3QgR0YgKi8KKyAgICAgICAgaW50IHRvdF9tYnMgPSBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbSU5UUkFfRlJBTUVdICArCisgICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdICAgKworICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtHT0xERU5fRlJBTUVdICsKKyAgICAgICAgICAgICAgICAgICAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbQUxUUkVGX0ZSQU1FXTsKKworICAgICAgICBpbnQgcGN0X2dmX2FjdGl2ZSA9ICgxMDAgKiBjcGktPmdmX2FjdGl2ZV9jb3VudCkgLyAoY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMpOworCisgICAgICAgIGlmICh0b3RfbWJzKQorICAgICAgICAgICAgZ2ZfZnJhbWVfdXNlYWdlID0gKGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtHT0xERU5fRlJBTUVdICsgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV0pICogMTAwIC8gdG90X21iczsKKworICAgICAgICBpZiAocGN0X2dmX2FjdGl2ZSA+IGdmX2ZyYW1lX3VzZWFnZSkKKyAgICAgICAgICAgIGdmX2ZyYW1lX3VzZWFnZSA9IHBjdF9nZl9hY3RpdmU7CisKKyAgICAgICAgLyogSXMgYSBmaXhlZCBtYW51YWwgR0YgZnJlcXVlbmN5IGJlaW5nIHVzZWQgKi8KKyAgICAgICAgaWYgKGNwaS0+YXV0b19nb2xkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3Igb25lIHBhc3MgdGhyb3cgYSBHRiBpZiByZWNlbnQgZnJhbWUgaW50cmEgdXNlYWdlIGlzCisgICAgICAgICAgICAgKiBsb3cgb3IgdGhlIEdGIHVzZWFnZSBpcyBoaWdoCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoY3BpLT5wYXNzID09IDApICYmIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA8IDE1IHx8IGdmX2ZyYW1lX3VzZWFnZSA+PSA1KSkKKyAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9IDE7CisKKyAgICAgICAgICAgIC8qIFR3byBwYXNzIEdGIGRlc2Npc2lvbiAqLworICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5wYXNzID09IDIpCisgICAgICAgICAgICAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAxOworICAgICAgICB9CisKKyNpZiAwCisKKyAgICAgICAgLyogRGVidWcgc3RhdHMgKi8KKyAgICAgICAgaWYgKDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTEUgKmY7CisKKyAgICAgICAgICAgIGYgPSBmb3BlbigiZ2ZfdXNlYWdldC5zdHQiLCAiYSIpOworICAgICAgICAgICAgZnByaW50ZihmLCAiICU4bGQgJTEwbGQgJTEwbGQgJTEwbGQgJTEwbGRcbiIsCisgICAgICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsICBjcGktPmdmdV9ib29zdCwgR0ZRX0FESlVTVE1FTlQsIGNwaS0+Z2Z1X2Jvb3N0LCBnZl9mcmFtZV91c2VhZ2UpOworICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICB9CisKKyNlbmRpZgorCisgICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9PSAxKQorICAgICAgICB7CisjaWYgMAorCisgICAgICAgICAgICBpZiAoMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGSUxFICpmOworCisgICAgICAgICAgICAgICAgZiA9IGZvcGVuKCJHRmV4aXQuc3R0IiwgImEiKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlOGxkIEdGIGNvZGVkXG4iLCBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICB9CisKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoY3BpLT5hdXRvX2FkanVzdF9nb2xkX3F1YW50aXplcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxjX2dmX3BhcmFtcyhjcGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgdXNpbmcgYWx0ZXJuYXRlIHJlZiBpbnN0ZWFkIG9mIGdmIHRoZW4gZG8gbm90IGFwcGx5IHRoZQorICAgICAgICAgICAgICogYm9vc3QgSXQgd2lsbCBpbnN0ZWFkIGJlIGFwcGxpZWQgdG8gdGhlIGFsdHJlZiB1cGRhdGUgSmltcworICAgICAgICAgICAgICogbW9kaWZpZWQgYm9vc3QKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+cGFzcyA9PSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc3BlbmQgb24gdGhlIEdGIGlzIGRlZmluZWQgaW4gdGhlIHR3byBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb2RlIGZvciB0d28gcGFzcyBlbmNvZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQm9vc3QgPSBjcGktPmxhc3RfYm9vc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX2luX3NlY3Rpb24gPSBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG9jYXRpb25fY2h1bmtzID0gKGZyYW1lc19pbl9zZWN0aW9uICogMTAwKSArIChCb29zdCAtIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19pbl9zZWN0aW9uID0gY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQgKiBmcmFtZXNfaW5fc2VjdGlvbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsaXplIEFsdGJvb3N0IGFuZCBhbGxvY2F0aW9ucyBjaHVuY2sgZG93biB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogcHJldmVudCBvdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQm9vc3QgPiAxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3N0IC89IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZvaWQgbG9zcyBvZiBwcmVjaXNpb24gYnV0IGF2b2lkIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdHNfaW5fc2VjdGlvbiA+PiA3KSA+IGFsbG9jYXRpb25fY2h1bmtzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBCb29zdCAqIChiaXRzX2luX3NlY3Rpb24gLyBhbGxvY2F0aW9uX2NodW5rcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IChCb29zdCAqIGJpdHNfaW5fc2VjdGlvbikgLyBhbGxvY2F0aW9uX2NodW5rczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGVzdGltYXRlX2JpdHNfYXRfcSgxLCBRLCBjcGktPmNvbW1vbi5NQnMsIDEuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNwaS0+bGFzdF9ib29zdCkgLyAxMDA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBBUkYgYXQgdGhpcyBsb2NhdGlvbiB1c2UgdGhlIG1pbmltdW0KKyAgICAgICAgICAgICAqIGJpdHMgb24gdGhpcyBmcmFtZSBldmVuIGlmIGl0IGlzIGEgY29udHJ1Y3RlZCBhcmYuCisgICAgICAgICAgICAgKiBUaGUgYWN0aXZlIG1heGltdW0gcXVhbnRpemVyIGluc3VyZXMgdGhhdCBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICogbnVtYmVyIG9mIGJpdHMgd2lsbCBiZSBzcGVudCBpZiBuZWVkZWQgZm9yIGNvbnRzdHJ1Y3RlZCBBUkZzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNwaS0+Y3VycmVudF9nZl9pbnRlcnZhbCA9IGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZTsKKworICAgICAgICB9CisgICAgfQorCisgICAgY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoID0gb2xkX3Blcl9mcmFtZV9iYW5kd2lkdGg7Cit9CisKKwordm9pZCB2cDhfdXBkYXRlX3JhdGVfY29ycmVjdGlvbl9mYWN0b3JzKFZQOF9DT01QICpjcGksIGludCBkYW1wX3ZhcikKK3sKKyAgICBpbnQgICAgUSA9IGNwaS0+Y29tbW9uLmJhc2VfcWluZGV4OworICAgIGludCAgICBjb3JyZWN0aW9uX2ZhY3RvciA9IDEwMDsKKyAgICBkb3VibGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICBkb3VibGUgYWRqdXN0bWVudF9saW1pdDsKKworICAgIGludCAgICBwcm9qZWN0ZWRfc2l6ZV9iYXNlZF9vbl9xID0gMDsKKworICAgIC8qIENsZWFyIGRvd24gbW14IHJlZ2lzdGVycyB0byBhbGxvdyBmbG9hdGluZyBwb2ludCBpbiB3aGF0IGZvbGxvd3MgKi8KKyAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7CisKKyAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgeworICAgICAgICByYXRlX2NvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSB8fCBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgICAgIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPmdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPnJhdGVfY29ycmVjdGlvbl9mYWN0b3I7CisgICAgfQorCisgICAgLyogV29yayBvdXQgaG93IGJpZyB3ZSB3b3VsZCBoYXZlIGV4cGVjdGVkIHRoZSBmcmFtZSB0byBiZSBhdCB0aGlzIFEKKyAgICAgKiBnaXZlbiB0aGUgY3VycmVudCBjb3JyZWN0aW9uIGZhY3Rvci4gU3RheSBpbiBkb3VibGUgdG8gYXZvaWQgaW50CisgICAgICogb3ZlcmZsb3cgd2hlbiB2YWx1ZXMgYXJlIGxhcmdlCisgICAgICovCisgICAgcHJvamVjdGVkX3NpemVfYmFzZWRfb25fcSA9IChpbnQpKCgoLjUgKyByYXRlX2NvcnJlY3Rpb25fZmFjdG9yICogdnA4X2JpdHNfcGVyX21iW2NwaS0+Y29tbW9uLmZyYW1lX3R5cGVdW1FdKSAqIGNwaS0+Y29tbW9uLk1CcykgLyAoMSA8PCBCUEVSX01CX05PUk1CSVRTKSk7CisKKyAgICAvKiBNYWtlIHNvbWUgYWxsb3dhbmNlIGZvciBjcGktPnpiaW5fb3Zlcl9xdWFudCAqLworICAgIGlmIChjcGktPnpiaW5fb3Zlcl9xdWFudCA+IDApCisgICAgeworICAgICAgICBpbnQgWiA9IGNwaS0+emJpbl9vdmVyX3F1YW50OworICAgICAgICBkb3VibGUgRmFjdG9yID0gMC45OTsKKyAgICAgICAgZG91YmxlIGZhY3Rvcl9hZGp1c3RtZW50ID0gMC4wMSAvIDI1Ni4wOworCisgICAgICAgIHdoaWxlIChaID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgWiAtLTsKKyAgICAgICAgICAgIHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3EgPQorICAgICAgICAgICAgICAgIChpbnQpKEZhY3RvciAqIHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3EpOworICAgICAgICAgICAgRmFjdG9yICs9IGZhY3Rvcl9hZGp1c3RtZW50OworCisgICAgICAgICAgICBpZiAoRmFjdG9yICA+PSAwLjk5OSkKKyAgICAgICAgICAgICAgICBGYWN0b3IgPSAwLjk5OTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdvcmsgb3V0IGEgc2l6ZSBjb3JyZWN0aW9uIGZhY3Rvci4gKi8KKyAgICBpZiAocHJvamVjdGVkX3NpemVfYmFzZWRfb25fcSA+IDApCisgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gKDEwMCAqIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUpIC8gcHJvamVjdGVkX3NpemVfYmFzZWRfb25fcTsKKworICAgIC8qIE1vcmUgaGVhdmlseSBkYW1wZWQgYWRqdXN0bWVudCB1c2VkIGlmIHdlIGhhdmUgYmVlbiBvc2NpbGxhdGluZworICAgICAqIGVpdGhlciBzaWRlIG9mIHRhcmdldAorICAgICAqLworICAgIHN3aXRjaCAoZGFtcF92YXIpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgYWRqdXN0bWVudF9saW1pdCA9IDAuNzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgYWRqdXN0bWVudF9saW1pdCA9IDAuMzc1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYWRqdXN0bWVudF9saW1pdCA9IDAuMjU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChjb3JyZWN0aW9uX2ZhY3RvciA+IDEwMikKKyAgICB7CisgICAgICAgIC8qIFdlIGFyZSBub3QgYWxyZWFkeSBhdCB0aGUgd29yc3QgYWxsb3dhYmxlIHF1YWxpdHkgKi8KKyAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSAoaW50KSgxMDAuNSArICgoY29ycmVjdGlvbl9mYWN0b3IgLSAxMDApICogYWRqdXN0bWVudF9saW1pdCkpOworICAgICAgICByYXRlX2NvcnJlY3Rpb25fZmFjdG9yID0gKChyYXRlX2NvcnJlY3Rpb25fZmFjdG9yICogY29ycmVjdGlvbl9mYWN0b3IpIC8gMTAwKTsKKworICAgICAgICAvKiBLZWVwIHJhdGVfY29ycmVjdGlvbl9mYWN0b3Igd2l0aGluIGxpbWl0cyAqLworICAgICAgICBpZiAocmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA+IE1BWF9CUEJfRkFDVE9SKQorICAgICAgICAgICAgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IE1BWF9CUEJfRkFDVE9SOworICAgIH0KKyAgICBlbHNlIGlmIChjb3JyZWN0aW9uX2ZhY3RvciA8IDk5KQorICAgIHsKKyAgICAgICAgLyogV2UgYXJlIG5vdCBhbHJlYWR5IGF0IHRoZSBiZXN0IGFsbG93YWJsZSBxdWFsaXR5ICovCisgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gKGludCkoMTAwLjUgLSAoKDEwMCAtIGNvcnJlY3Rpb25fZmFjdG9yKSAqIGFkanVzdG1lbnRfbGltaXQpKTsKKyAgICAgICAgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9ICgocmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciAqIGNvcnJlY3Rpb25fZmFjdG9yKSAvIDEwMCk7CisKKyAgICAgICAgLyogS2VlcCByYXRlX2NvcnJlY3Rpb25fZmFjdG9yIHdpdGhpbiBsaW1pdHMgKi8KKyAgICAgICAgaWYgKHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPCBNSU5fQlBCX0ZBQ1RPUikKKyAgICAgICAgICAgIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSBNSU5fQlBCX0ZBQ1RPUjsKKyAgICB9CisKKyAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgIGNwaS0+a2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSByYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgfHwgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgICAgICBjcGktPmdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSByYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcGktPnJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSByYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgIH0KK30KKworCitpbnQgdnA4X3JlZ3VsYXRlX3EoVlA4X0NPTVAgKmNwaSwgaW50IHRhcmdldF9iaXRzX3Blcl9mcmFtZSkKK3sKKyAgICBpbnQgUSA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7CisKKyAgICAvKiBSZXNldCBaYmluIE9RIHZhbHVlICovCisgICAgY3BpLT56YmluX292ZXJfcXVhbnQgPSAwOworCisgICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDApCisgICAgeworICAgICAgICBRID0gY3BpLT5veGNmLmZpeGVkX3E7CisKKyAgICAgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBRID0gY3BpLT5veGNmLmtleV9xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgUSA9IGNwaS0+b3hjZi5hbHRfcTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgUSA9IGNwaS0+b3hjZi5nb2xkX3E7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGxhc3RfZXJyb3IgPSBJTlRfTUFYOworICAgICAgICBpbnQgdGFyZ2V0X2JpdHNfcGVyX21iOworICAgICAgICBpbnQgYml0c19wZXJfbWJfYXRfdGhpc19xOworICAgICAgICBkb3VibGUgY29ycmVjdGlvbl9mYWN0b3I7CisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb3JyZWN0aW9uIGZhY3RvciBiYXNlZCB1cG9uIHR5cGUgb2YgZnJhbWUuICovCisgICAgICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lIHx8IGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQorICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5nZl9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIHJlcXVpcmVkIHNjYWxpbmcgZmFjdG9yIGJhc2VkIG9uIHRhcmdldCBmcmFtZSBzaXplIGFuZAorICAgICAgICAgKiBzaXplIG9mIGZyYW1lIHByb2R1Y2VkIHVzaW5nIHByZXZpb3VzIFEKKyAgICAgICAgICovCisgICAgICAgIGlmICh0YXJnZXRfYml0c19wZXJfZnJhbWUgPj0gKElOVF9NQVggPj4gQlBFUl9NQl9OT1JNQklUUykpCisgICAgICAgICAgICAvKiBDYXNlIHdoZXJlIHdlIHdvdWxkIG92ZXJmbG93IGludCAqLworICAgICAgICAgICAgdGFyZ2V0X2JpdHNfcGVyX21iID0gKHRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIGNwaS0+Y29tbW9uLk1CcykgPDwgQlBFUl9NQl9OT1JNQklUUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGFyZ2V0X2JpdHNfcGVyX21iID0gKHRhcmdldF9iaXRzX3Blcl9mcmFtZSA8PCBCUEVSX01CX05PUk1CSVRTKSAvIGNwaS0+Y29tbW9uLk1CczsKKworICAgICAgICBpID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9IChpbnQpKC41ICsgY29ycmVjdGlvbl9mYWN0b3IgKiB2cDhfYml0c19wZXJfbWJbY3BpLT5jb21tb24uZnJhbWVfdHlwZV1baV0pOworCisgICAgICAgICAgICBpZiAoYml0c19wZXJfbWJfYXRfdGhpc19xIDw9IHRhcmdldF9iaXRzX3Blcl9tYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRhcmdldF9iaXRzX3Blcl9tYiAtIGJpdHNfcGVyX21iX2F0X3RoaXNfcSkgPD0gbGFzdF9lcnJvcikKKyAgICAgICAgICAgICAgICAgICAgUSA9IGk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBRID0gaSAtIDE7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYXN0X2Vycm9yID0gYml0c19wZXJfbWJfYXRfdGhpc19xIC0gdGFyZ2V0X2JpdHNfcGVyX21iOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgrK2kgPD0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSk7CisKKworICAgICAgICAvKiBJZiB3ZSBhcmUgYXQgTUFYUSB0aGVuIGVuYWJsZSBRIG92ZXItcnVuIHdoaWNoIHNlZWtzIHRvIGNsYXcKKyAgICAgICAgICogYmFjayBhZGRpdGlvbmFsIGJpdHMgdGhyb3VnaCB0aGluZ3MgbGlrZSB0aGUgUkQgbXVsdGlwbGllcgorICAgICAgICAgKiBhbmQgemVybyBiaW4gc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChRID49IE1BWFEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB6YmluX29xbWF4OworCisgICAgICAgICAgICBkb3VibGUgRmFjdG9yID0gMC45OTsKKyAgICAgICAgICAgIGRvdWJsZSBmYWN0b3JfYWRqdXN0bWVudCA9IDAuMDEgLyAyNTYuMDsKKworICAgICAgICAgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQorICAgICAgICAgICAgICAgIHpiaW5fb3FtYXggPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lIHx8IChjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSAmJiAhY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUpKQorICAgICAgICAgICAgICAgIHpiaW5fb3FtYXggPSAxNjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6YmluX29xbWF4ID0gWkJJTl9PUV9NQVg7CisKKyAgICAgICAgICAgIC8qeworICAgICAgICAgICAgICAgIGRvdWJsZSBGYWN0b3IgPSAoZG91YmxlKXRhcmdldF9iaXRzX3Blcl9tYi8oZG91YmxlKWJpdHNfcGVyX21iX2F0X3RoaXNfcTsKKyAgICAgICAgICAgICAgICBkb3VibGUgT3E7CisKKyAgICAgICAgICAgICAgICBGYWN0b3IgPSBGYWN0b3IvMS4yNjgzOworCisgICAgICAgICAgICAgICAgT3EgPSBwb3coIEZhY3RvciwgKDEuMC8tMC4xNjUpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIE9xID4gemJpbl9vcW1heCApCisgICAgICAgICAgICAgICAgICAgIE9xID0gemJpbl9vcW1heDsKKworICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gKGludClPcTsKKyAgICAgICAgICAgIH0qLworCisgICAgICAgICAgICAvKiBFYWNoIGluY3JtZW50IGluIHRoZSB6YmluIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIGZpeGVkIGVmZmVjdAorICAgICAgICAgICAgICogb24gYml0cmF0ZS4gVGhpcyBpcyBub3Qgb2YgY291cnNlIHRydWUuIFRoZSBlZmZlY3Qgd2lsbCBiZQorICAgICAgICAgICAgICogaGlnaGx5IGNsaXAgZGVwZW5kZW50IGFuZCBtYXkgd2VsbCBoYXZlIHN1ZGRlbiBzdGVwcy4gVGhlCisgICAgICAgICAgICAgKiBpZGVhIGhlcmUgaXMgdG8gYWNoZWl2ZSBoaWdoZXIgZWZmZWN0aXZlIHF1YW50aXplcnMgdGhhbiB0aGUKKyAgICAgICAgICAgICAqIG5vcm1hbCBtYXhpbXVtIGJ5IGV4cGFuZGluZyB0aGUgemVybyBiaW4gYW5kIGhlbmNlCisgICAgICAgICAgICAgKiBkZWNyZWFzaW5nIHRoZSBudW1iZXIgb2YgbG93IG1hZ25pdHVkZSBub24gemVybyBjb2VmZmljaWVudHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlIChjcGktPnpiaW5fb3Zlcl9xdWFudCA8IHpiaW5fb3FtYXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BpLT56YmluX292ZXJfcXVhbnQgKys7CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT56YmluX292ZXJfcXVhbnQgPiB6YmluX29xbWF4KQorICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fb3Zlcl9xdWFudCA9IHpiaW5fb3FtYXg7CisKKyAgICAgICAgICAgICAgICAvKiBBZGp1c3QgYml0c19wZXJfbWJfYXRfdGhpc19xIGVzdGltYXRlICovCisgICAgICAgICAgICAgICAgYml0c19wZXJfbWJfYXRfdGhpc19xID0gKGludCkoRmFjdG9yICogYml0c19wZXJfbWJfYXRfdGhpc19xKTsKKyAgICAgICAgICAgICAgICBGYWN0b3IgKz0gZmFjdG9yX2FkanVzdG1lbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAoRmFjdG9yICA+PSAwLjk5OSkKKyAgICAgICAgICAgICAgICAgICAgRmFjdG9yID0gMC45OTk7CisKKyAgICAgICAgICAgICAgICAvKiBCcmVhayBvdXQgaWYgd2UgZ2V0IGRvd24gdG8gdGhlIHRhcmdldCByYXRlICovCisgICAgICAgICAgICAgICAgaWYgKGJpdHNfcGVyX21iX2F0X3RoaXNfcSA8PSB0YXJnZXRfYml0c19wZXJfbWIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUTsKK30KKworCitzdGF0aWMgaW50IGVzdGltYXRlX2tleWZyYW1lX2ZyZXF1ZW5jeShWUDhfQ09NUCAqY3BpKQoreworICAgIGludCBpOworCisgICAgLyogQXZlcmFnZSBrZXkgZnJhbWUgZnJlcXVlbmN5ICovCisgICAgaW50IGF2X2tleV9mcmFtZV9mcmVxdWVuY3kgPSAwOworCisgICAgLyogRmlyc3Qga2V5IGZyYW1lIGF0IHN0YXJ0IG9mIHNlcXVlbmNlIGlzIGEgc3BlY2lhbCBjYXNlLiBXZSBoYXZlIG5vCisgICAgICogZnJlcXVlbmN5IGRhdGEuCisgICAgICovCisgICAgaWYgKGNwaS0+a2V5X2ZyYW1lX2NvdW50ID09IDEpCisgICAgeworICAgICAgICAvKiBBc3N1bWUgYSBkZWZhdWx0IG9mIDEga2YgZXZlcnkgMiBzZWNvbmRzLCBvciB0aGUgbWF4IGtmIGludGVydmFsLAorICAgICAgICAgKiB3aGljaGV2ZXIgaXMgc21hbGxlci4KKyAgICAgICAgICovCisgICAgICAgIGludCBrZXlfZnJlcSA9IGNwaS0+b3hjZi5rZXlfZnJlcT4wID8gY3BpLT5veGNmLmtleV9mcmVxIDogMTsKKyAgICAgICAgYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeSA9IChpbnQpY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSAqIDI7CisKKyAgICAgICAgaWYgKGNwaS0+b3hjZi5hdXRvX2tleSAmJiBhdl9rZXlfZnJhbWVfZnJlcXVlbmN5ID4ga2V5X2ZyZXEpCisgICAgICAgICAgICBhdl9rZXlfZnJhbWVfZnJlcXVlbmN5ID0gY3BpLT5veGNmLmtleV9mcmVxOworCisgICAgICAgIGNwaS0+cHJpb3Jfa2V5X2ZyYW1lX2Rpc3RhbmNlW0tFWV9GUkFNRV9DT05URVhUIC0gMV0KKyAgICAgICAgICAgID0gYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHRvdGFsX3dlaWdodCA9IDA7CisgICAgICAgIGludCBsYXN0X2tmX2ludGVydmFsID0KKyAgICAgICAgICAgICAgICAoY3BpLT5mcmFtZXNfc2luY2Vfa2V5ID4gMCkgPyBjcGktPmZyYW1lc19zaW5jZV9rZXkgOiAxOworCisgICAgICAgIC8qIHJlc2V0IGtleWZyYW1lIGNvbnRleHQgYW5kIGNhbGN1bGF0ZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGxhc3QKKyAgICAgICAgICogS0VZX0ZSQU1FX0NPTlRFWFQga2V5ZnJhbWVzCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgS0VZX0ZSQU1FX0NPTlRFWFQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCBLRVlfRlJBTUVfQ09OVEVYVCAtIDEpCisgICAgICAgICAgICAgICAgY3BpLT5wcmlvcl9rZXlfZnJhbWVfZGlzdGFuY2VbaV0KKyAgICAgICAgICAgICAgICAgICAgPSBjcGktPnByaW9yX2tleV9mcmFtZV9kaXN0YW5jZVtpKzFdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNwaS0+cHJpb3Jfa2V5X2ZyYW1lX2Rpc3RhbmNlW2ldID0gbGFzdF9rZl9pbnRlcnZhbDsKKworICAgICAgICAgICAgYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeSArPSBwcmlvcl9rZXlfZnJhbWVfd2VpZ2h0W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3BpLT5wcmlvcl9rZXlfZnJhbWVfZGlzdGFuY2VbaV07CisgICAgICAgICAgICB0b3RhbF93ZWlnaHQgKz0gcHJpb3Jfa2V5X2ZyYW1lX3dlaWdodFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2tleV9mcmFtZV9mcmVxdWVuY3kgIC89IHRvdGFsX3dlaWdodDsKKworICAgIH0KKyAgICByZXR1cm4gYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeTsKK30KKworCit2b2lkIHZwOF9hZGp1c3Rfa2V5X2ZyYW1lX2NvbnRleHQoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICAvKiBDbGVhciBkb3duIG1teCByZWdpc3RlcnMgdG8gYWxsb3cgZmxvYXRpbmcgcG9pbnQgaW4gd2hhdCBmb2xsb3dzICovCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgLyogRG8gd2UgaGF2ZSBhbnkga2V5IGZyYW1lIG92ZXJzcGVuZCB0byByZWNvdmVyPyAqLworICAgIC8qIFR3by1wYXNzIG92ZXJzcGVuZCBoYW5kbGVkIGVsc2V3aGVyZS4gKi8KKyAgICBpZiAoKGNwaS0+cGFzcyAhPSAyKQorICAgICAgICAgJiYgKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPiBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGgpKQorICAgIHsKKyAgICAgICAgaW50IG92ZXJzcGVuZDsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIGNvdW50IG9mIGtleSBmcmFtZSBvdmVyc3BlbmQgdG8gYmUgcmVjb3ZlcmVkIGluCisgICAgICAgICAqIHN1YnNlcXVlbnQgZnJhbWVzLiBBIHBvcnRpb24gb2YgdGhlIEtGIG92ZXJzcGVuZCBpcyB0cmVhdGVkIGFzIGdmCisgICAgICAgICAqIG92ZXJzcGVuZCAoYW5kIGhlbmNlIHJlY292ZXJlZCBtb3JlIHF1aWNrbHkpIGFzIHRoZSBrZiBpcyBhbHNvIGEKKyAgICAgICAgICogZ2YuIE90aGVyd2lzZSB0aGUgZmV3IGZyYW1lcyBmb2xsb3dpbmcgZWFjaCBrZiB0ZW5kIHRvIGdldCBtb3JlCisgICAgICAgICAqIGJpdHMgYWxsb2NhdGVkIHRoYW4gdGhvc2UgZm9sbG93aW5nIG90aGVyIGdmcy4KKyAgICAgICAgICovCisgICAgICAgIG92ZXJzcGVuZCA9IChjcGktPnByb2plY3RlZF9mcmFtZV9zaXplIC0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoKTsKKworICAgICAgICBpZiAoY3BpLT5veGNmLm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgICAgICAgICAgY3BpLT5rZl9vdmVyc3BlbmRfYml0cyArPSBvdmVyc3BlbmQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3BpLT5rZl9vdmVyc3BlbmRfYml0cyArPSBvdmVyc3BlbmQgKiA3IC8gODsKKyAgICAgICAgICAgIGNwaS0+Z2Zfb3ZlcnNwZW5kX2JpdHMgKz0gb3ZlcnNwZW5kICogMSAvIDg7CisgICAgICAgIH0KKworICAgICAgICAvKiBXb3JrIG91dCBob3cgbXVjaCB0byB0cnkgYW5kIHJlY292ZXIgcGVyIGZyYW1lLiAqLworICAgICAgICBjcGktPmtmX2JpdHJhdGVfYWRqdXN0bWVudCA9IGNwaS0+a2Zfb3ZlcnNwZW5kX2JpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGVzdGltYXRlX2tleWZyYW1lX2ZyZXF1ZW5jeShjcGkpOworICAgIH0KKworICAgIGNwaS0+ZnJhbWVzX3NpbmNlX2tleSA9IDA7CisgICAgY3BpLT5rZXlfZnJhbWVfY291bnQrKzsKK30KKworCit2b2lkIHZwOF9jb21wdXRlX2ZyYW1lX3NpemVfYm91bmRzKFZQOF9DT01QICpjcGksIGludCAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQsIGludCAqZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCkKK3sKKyAgICAvKiBTZXQtdXAgYm91bmRzIG9uIGFjY2VwdGFibGUgZnJhbWUgc2l6ZTogKi8KKyAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPj0gMCkKKyAgICB7CisgICAgICAgIC8qIEZpeGVkIFEgc2NlbmFyaW86IGZyYW1lIHNpemUgbmV2ZXIgb3V0cmFuZ2VzIHRhcmdldAorICAgICAgICAgKiAodGhlcmUgaXMgbm8gdGFyZ2V0ISkKKyAgICAgICAgICovCisgICAgICAgICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCA9IDA7CisgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IElOVF9NQVg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZyYW1lX292ZXJfc2hvb3RfbGltaXQgID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDkgLyA4OworICAgICAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0ID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDcgLyA4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5udW1iZXJfb2ZfbGF5ZXJzID4gMSB8fAorICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSB8fAorICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiA5IC8gODsKKyAgICAgICAgICAgICAgICAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogNyAvIDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRm9yIENCUiB0YWtlIGJ1ZmZlciBmdWxsbmVzcyBpbnRvIGFjY291bnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPj0gKChjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgKyBjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSkgPj4gMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBpcyB0b28gZnVsbCBzbyByZWxheCBvdmVyc2hvb3QgYW5kIHRpZ2h0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHVuZGVyc2hvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lX292ZXJfc2hvb3RfbGltaXQgID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDEyIC8gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiA2IC8gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA8PSAoY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsID4+IDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgaXMgdG9vIGxvdyBzbyByZWxheCB1bmRlcnNob290IGFuZCB0aWdodGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvdmVyc2hvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lX292ZXJfc2hvb3RfbGltaXQgID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDEwIC8gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiA0IC8gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiAxMSAvIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogNSAvIDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogVkJSIGFuZCBDUSBtb2RlICovCisgICAgICAgICAgICAgICAgLyogTm90ZSB0aGF0IHRpZ2h0ZXIgcmVzdHJpY3Rpb25zIGhlcmUgY2FuIGhlbHAgcXVhbGl0eQorICAgICAgICAgICAgICAgICAqIGJ1dCBodXJ0IGVuY29kZSBzcGVlZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFN0cm9uIG92ZXJzaG9vdCBsaW1pdCBmb3IgY29uc3RyYWluZWQgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9DT05TVFJBSU5FRF9RVUFMSVRZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCAgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogMTEgLyA4OworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0ID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDIgLyA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lX292ZXJfc2hvb3RfbGltaXQgID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDExIC8gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiA1IC8gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZvciB2ZXJ5IHNtYWxsIHJhdGUgdGFyZ2V0cyB3aGVyZSB0aGUgZnJhY3Rpb25hbCBhZGp1c3RtZW50CisgICAgICAgICAqIChlZyAqIDcvOCkgbWF5IGJlIHRpbnkgbWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IGEgbWluaW11bQorICAgICAgICAgKiByYW5nZS4KKyAgICAgICAgICovCisgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICs9IDIwMDsKKyAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0IC09IDIwMDsKKyAgICAgICAgaWYgKCAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQgPCAwICkKKyAgICAgICAgICAgICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCA9IDA7CisKKyAgICB9Cit9CisKKworLyogcmV0dXJuIG9mIDAgbWVhbnMgZHJvcCBmcmFtZSAqLworaW50IHZwOF9waWNrX2ZyYW1lX3NpemUoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKKworICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCisgICAgICAgIGNhbGNfaWZyYW1lX3RhcmdldF9zaXplKGNwaSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2FsY19wZnJhbWVfdGFyZ2V0X3NpemUoY3BpKTsKKworICAgICAgICAvKiBDaGVjayBpZiB3ZSdyZSBkcm9wcGluZyB0aGUgZnJhbWU6ICovCisgICAgICAgIGlmIChjcGktPmRyb3BfZnJhbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+ZHJvcF9mcmFtZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9yYXRlY3RybC5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3JhdGVjdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzZjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9yYXRlY3RybC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWYgIWRlZmluZWQgX19JTkNfUkFURUNUUkxfSAorCisjaW5jbHVkZSAib255eF9pbnQuaCIKKworZXh0ZXJuIHZvaWQgdnA4X3NhdmVfY29kaW5nX2NvbnRleHQoVlA4X0NPTVAgKmNwaSk7CitleHRlcm4gdm9pZCB2cDhfcmVzdG9yZV9jb2RpbmdfY29udGV4dChWUDhfQ09NUCAqY3BpKTsKKworZXh0ZXJuIHZvaWQgdnA4X3NldHVwX2tleV9mcmFtZShWUDhfQ09NUCAqY3BpKTsKK2V4dGVybiB2b2lkIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoVlA4X0NPTVAgKmNwaSwgaW50IGRhbXBfdmFyKTsKK2V4dGVybiBpbnQgdnA4X3JlZ3VsYXRlX3EoVlA4X0NPTVAgKmNwaSwgaW50IHRhcmdldF9iaXRzX3Blcl9mcmFtZSk7CitleHRlcm4gdm9pZCB2cDhfYWRqdXN0X2tleV9mcmFtZV9jb250ZXh0KFZQOF9DT01QICpjcGkpOworZXh0ZXJuIHZvaWQgdnA4X2NvbXB1dGVfZnJhbWVfc2l6ZV9ib3VuZHMoVlA4X0NPTVAgKmNwaSwgaW50ICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCwgaW50ICpmcmFtZV9vdmVyX3Nob290X2xpbWl0KTsKKworLyogcmV0dXJuIG9mIDAgbWVhbnMgZHJvcCBmcmFtZSAqLworZXh0ZXJuIGludCB2cDhfcGlja19mcmFtZV9zaXplKFZQOF9DT01QICpjcGkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9yZG9wdC5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3Jkb3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MDYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9yZG9wdC5jCkBAIC0wLDAgKzEsMjYyOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3ByYWdtYXMuaCIKKyNpbmNsdWRlICJ0b2tlbml6ZS5oIgorI2luY2x1ZGUgInRyZWV3cml0ZXIuaCIKKyNpbmNsdWRlICJvbnl4X2ludC5oIgorI2luY2x1ZGUgIm1vZGVjb3N0cy5oIgorI2luY2x1ZGUgImVuY29kZWludHJhLmgiCisjaW5jbHVkZSAicGlja2ludGVyLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcmVjb25pbnRlci5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZmluZG5lYXJtdi5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcXVhbnRfY29tbW9uLmgiCisjaW5jbHVkZSAiZW5jb2RlbWIuaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vdmFyaWFuY2UuaCIKKyNpbmNsdWRlICJtY29tcC5oIgorI2luY2x1ZGUgInJkb3B0LmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCIKKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisjaW5jbHVkZSAiZGVub2lzaW5nLmgiCisjZW5kaWYKK2V4dGVybiB2b2lkIHZwOF91cGRhdGVfemJpbl9leHRyYShWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KTsKKworI2RlZmluZSBNQVhGKGEsYikgICAgICAgICAgICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisKK3R5cGVkZWYgc3RydWN0IHJhdGVfZGlzdG9ydGlvbl9zdHJ1Y3QKK3sKKyAgICBpbnQgcmF0ZTI7CisgICAgaW50IHJhdGVfeTsKKyAgICBpbnQgcmF0ZV91djsKKyAgICBpbnQgZGlzdG9ydGlvbjI7CisgICAgaW50IGRpc3RvcnRpb25fdXY7Cit9IFJBVEVfRElTVE9SVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgYmVzdF9tb2RlX3N0cnVjdAoreworICBpbnQgeXJkOworICBpbnQgcmQ7CisgIGludCBpbnRyYV9yZDsKKyAgTUJfTU9ERV9JTkZPIG1ibW9kZTsKKyAgdW5pb24gYl9tb2RlX2luZm8gYm1vZGVzWzE2XTsKKyAgUEFSVElUSU9OX0lORk8gcGFydGl0aW9uOworfSBCRVNUX01PREU7CisKK3N0YXRpYyBjb25zdCBpbnQgYXV0b19zcGVlZF90aHJlc2hbMTddID0KK3sKKyAgICAxMDAwLAorICAgIDIwMCwKKyAgICAxNTAsCisgICAgMTMwLAorICAgIDE1MCwKKyAgICAxMjUsCisgICAgMTIwLAorICAgIDExNSwKKyAgICAxMTUsCisgICAgMTE1LAorICAgIDExNSwKKyAgICAxMTUsCisgICAgMTE1LAorICAgIDExNSwKKyAgICAxMTUsCisgICAgMTE1LAorICAgIDEwNQorfTsKKworY29uc3QgTUJfUFJFRElDVElPTl9NT0RFIHZwOF9tb2RlX29yZGVyW01BWF9NT0RFU10gPQoreworICAgIFpFUk9NViwKKyAgICBEQ19QUkVELAorCisgICAgTkVBUkVTVE1WLAorICAgIE5FQVJNViwKKworICAgIFpFUk9NViwKKyAgICBORUFSRVNUTVYsCisKKyAgICBaRVJPTVYsCisgICAgTkVBUkVTVE1WLAorCisgICAgTkVBUk1WLAorICAgIE5FQVJNViwKKworICAgIFZfUFJFRCwKKyAgICBIX1BSRUQsCisgICAgVE1fUFJFRCwKKworICAgIE5FV01WLAorICAgIE5FV01WLAorICAgIE5FV01WLAorCisgICAgU1BMSVRNViwKKyAgICBTUExJVE1WLAorICAgIFNQTElUTVYsCisKKyAgICBCX1BSRUQsCit9OworCisvKiBUaGlzIHRhYmxlIGRldGVybWluZXMgdGhlIHNlYXJjaCBvcmRlciBpbiByZWZlcmVuY2UgZnJhbWUgcHJpb3JpdHkgb3JkZXIsCisgKiB3aGljaCBtYXkgbm90IG5lY2Vzc2FyaWx5IG1hdGNoIElOVFJBLExBU1QsR09MREVOLEFSRgorICovCitjb25zdCBpbnQgdnA4X3JlZl9mcmFtZV9vcmRlcltNQVhfTU9ERVNdID0KK3sKKyAgICAxLAorICAgIDAsCisKKyAgICAxLAorICAgIDEsCisKKyAgICAyLAorICAgIDIsCisKKyAgICAzLAorICAgIDMsCisKKyAgICAyLAorICAgIDMsCisKKyAgICAwLAorICAgIDAsCisgICAgMCwKKworICAgIDEsCisgICAgMiwKKyAgICAzLAorCisgICAgMSwKKyAgICAyLAorICAgIDMsCisKKyAgICAwLAorfTsKKworc3RhdGljIHZvaWQgZmlsbF90b2tlbl9jb3N0cygKKyAgICBpbnQgY1tCTE9DS19UWVBFU11bQ09FRl9CQU5EU11bUFJFVl9DT0VGX0NPTlRFWFRTXVtNQVhfRU5UUk9QWV9UT0tFTlNdLAorICAgIGNvbnN0IHZwOF9wcm9iIHBbQkxPQ0tfVFlQRVNdW0NPRUZfQkFORFNdW1BSRVZfQ09FRl9DT05URVhUU11bRU5UUk9QWV9OT0RFU10KKykKK3sKKyAgICBpbnQgaSwgaiwgazsKKworCisgICAgZm9yIChpID0gMDsgaSA8IEJMT0NLX1RZUEVTOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBDT0VGX0JBTkRTOyBqKyspCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgUFJFVl9DT0VGX0NPTlRFWFRTOyBrKyspCisKKyAgICAgICAgICAgICAgICAvKiBjaGVjayBmb3IgcHQ9MCBhbmQgYmFuZCA+IDEgaWYgYmxvY2sgdHlwZSAwCisgICAgICAgICAgICAgICAgICogYW5kIDAgaWYgYmxvY2t0eXBlIDEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoayA9PSAwICYmIGogPiAoaSA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgdnA4X2Nvc3RfdG9rZW5zMihjW2ldW2pdW2tdLCBwIFtpXVtqXVtrXSwgdnA4X2NvZWZfdHJlZSwgMik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2cDhfY29zdF90b2tlbnMoY1tpXVtqXVtrXSwgcCBbaV1bal1ba10sIHZwOF9jb2VmX3RyZWUpOworfQorCitzdGF0aWMgY29uc3QgaW50IHJkX2lpZmFjdG9yWzMyXSA9Cit7CisgICAgNCwgNCwgMywgMiwgMSwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworLyogdmFsdWVzIGFyZSBub3cgY29ycmVsYXRlZCB0byBxdWFudGl6ZXIgKi8KK3N0YXRpYyBjb25zdCBpbnQgc2FkX3Blcl9iaXQxNmx1dFtRSU5ERVhfUkFOR0VdID0KK3sKKyAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCwKKyAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwKKyAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwKKyAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwKKyAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQKK307CitzdGF0aWMgY29uc3QgaW50IHNhZF9wZXJfYml0NGx1dFtRSU5ERVhfUkFOR0VdID0KK3sKKyAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywKKyAgICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAzLCAgMywgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwKKyAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwKKyAgICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwKKyAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwKKyAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxOCwKKyAgICAxOCwgMTgsIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsCit9OworCit2b2lkIHZwOGN4X2luaXRpYWxpemVfbWVfY29uc3RzKFZQOF9DT01QICpjcGksIGludCBRSW5kZXgpCit7CisgICAgY3BpLT5tYi5zYWRwZXJiaXQxNiA9ICBzYWRfcGVyX2JpdDE2bHV0W1FJbmRleF07CisgICAgY3BpLT5tYi5zYWRwZXJiaXQ0ICA9ICBzYWRfcGVyX2JpdDRsdXRbUUluZGV4XTsKK30KKwordm9pZCB2cDhfaW5pdGlhbGl6ZV9yZF9jb25zdHMoVlA4X0NPTVAgKmNwaSwgaW50IFF2YWx1ZSkKK3sKKyAgICBpbnQgcTsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgY2FwcGVkX3EgPSAoUXZhbHVlIDwgMTYwKSA/IChkb3VibGUpUXZhbHVlIDogMTYwLjA7CisgICAgZG91YmxlIHJkY29uc3QgPSAyLjgwOworCisgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOworCisgICAgLyogRnVydGhlciB0ZXN0cyByZXF1aXJlZCB0byBzZWUgaWYgb3B0aW11bSBpcyBkaWZmZXJlbnQKKyAgICAgKiBmb3Iga2V5IGZyYW1lcywgZ29sZGVuIGZyYW1lcyBhbmQgYXJmIGZyYW1lcy4KKyAgICAgKi8KKyAgICBjcGktPlJETVVMVCA9IChpbnQpKHJkY29uc3QgKiAoY2FwcGVkX3EgKiBjYXBwZWRfcSkpOworCisgICAgLyogRXh0ZW5kIHJhdGUgbXVsdGlwbGllciBhbG9uZyBzaWRlIHF1YW50aXplciB6YmluIGluY3JlYXNlcyAqLworICAgIGlmIChjcGktPnpiaW5fb3Zlcl9xdWFudCAgPiAwKQorICAgIHsKKyAgICAgICAgZG91YmxlIG9xX2ZhY3RvcjsKKyAgICAgICAgZG91YmxlIG1vZHE7CisKKyAgICAgICAgLyogRXhwZXJpbWVudGFsIGNvZGUgdXNpbmcgdGhlIHNhbWUgYmFzaWMgZXF1YXRpb24gYXMgdXNlZCBmb3IgUSBhYm92ZQorICAgICAgICAgKiBUaGUgdW5pdHMgb2YgY3BpLT56YmluX292ZXJfcXVhbnQgYXJlIDEvMTI4IG9mIFEgYmluIHNpemUKKyAgICAgICAgICovCisgICAgICAgIG9xX2ZhY3RvciA9IDEuMCArICgoZG91YmxlKTAuMDAxNTYyNSAqIGNwaS0+emJpbl9vdmVyX3F1YW50KTsKKyAgICAgICAgbW9kcSA9IChpbnQpKChkb3VibGUpY2FwcGVkX3EgKiBvcV9mYWN0b3IpOworICAgICAgICBjcGktPlJETVVMVCA9IChpbnQpKHJkY29uc3QgKiAobW9kcSAqIG1vZHEpKTsKKyAgICB9CisKKyAgICBpZiAoY3BpLT5wYXNzID09IDIgJiYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKSkKKyAgICB7CisgICAgICAgIGlmIChjcGktPnR3b3Bhc3MubmV4dF9paXJhdGlvID4gMzEpCisgICAgICAgICAgICBjcGktPlJETVVMVCArPSAoY3BpLT5SRE1VTFQgKiByZF9paWZhY3RvclszMV0pID4+IDQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwaS0+UkRNVUxUICs9CisgICAgICAgICAgICAgICAgKGNwaS0+UkRNVUxUICogcmRfaWlmYWN0b3JbY3BpLT50d29wYXNzLm5leHRfaWlyYXRpb10pID4+IDQ7CisgICAgfQorCisgICAgY3BpLT5tYi5lcnJvcnBlcmJpdCA9IChjcGktPlJETVVMVCAvIDExMCk7CisgICAgY3BpLT5tYi5lcnJvcnBlcmJpdCArPSAoY3BpLT5tYi5lcnJvcnBlcmJpdD09MCk7CisKKyAgICB2cDhfc2V0X3NwZWVkX2ZlYXR1cmVzKGNwaSk7CisKKyAgICBxID0gKGludClwb3coUXZhbHVlLCAxLjI1KTsKKworICAgIGlmIChxIDwgOCkKKyAgICAgICAgcSA9IDg7CisKKyAgICBpZiAoY3BpLT5SRE1VTFQgPiAxMDAwKQorICAgIHsKKyAgICAgICAgY3BpLT5SRERJViA9IDE7CisgICAgICAgIGNwaS0+UkRNVUxUIC89IDEwMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjcGktPnNmLnRocmVzaF9tdWx0W2ldIDwgSU5UX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW2ldID0gY3BpLT5zZi50aHJlc2hfbXVsdFtpXSAqIHEgLyAxMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hlc1tpXSA9IElOVF9NQVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW2ldID0gY3BpLT5yZF90aHJlc2hlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjcGktPlJERElWID0gMTAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNwaS0+c2YudGhyZXNoX211bHRbaV0gPCAoSU5UX01BWCAvIHEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbaV0gPSBjcGktPnNmLnRocmVzaF9tdWx0W2ldICogcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW2ldID0gSU5UX01BWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbaV0gPSBjcGktPnJkX3RocmVzaGVzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgLyogYnVpbGQgdG9rZW4gY29zdCBhcnJheSBmb3IgdGhlIHR5cGUgb2YgZnJhbWUgd2UgaGF2ZSBub3cgKi8KKyAgICAgIEZSQU1FX0NPTlRFWFQgKmwgPSAmY3BpLT5sZmNfbjsKKworICAgICAgaWYoY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQorICAgICAgICAgIGwgPSAmY3BpLT5sZmNfYTsKKyAgICAgIGVsc2UgaWYoY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUpCisgICAgICAgICAgbCA9ICZjcGktPmxmY19nOworCisgICAgICBmaWxsX3Rva2VuX2Nvc3RzKAorICAgICAgICAgIGNwaS0+bWIudG9rZW5fY29zdHMsCisgICAgICAgICAgKGNvbnN0IHZwOF9wcm9iKCAqKVs4XVszXVsxMV0pIGwtPmNvZWZfcHJvYnMKKyAgICAgICk7CisgICAgICAvKgorICAgICAgZmlsbF90b2tlbl9jb3N0cygKKyAgICAgICAgICBjcGktPm1iLnRva2VuX2Nvc3RzLAorICAgICAgICAgIChjb25zdCB2cDhfcHJvYiggKilbOF1bM11bMTFdKSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzKTsKKyAgICAgICovCisKKworICAgICAgLyogVE9ETyBtYWtlIHRoZXNlIG1vZGUgY29zdHMgZGVwZW5kIG9uIGxhc3QsYWx0IG9yIGdvbGQgdG9vLiAgKGpiYikgKi8KKyAgICAgIHZwOF9pbml0X21vZGVfY29zdHMoY3BpKTsKKyAgICB9CisKK30KKwordm9pZCB2cDhfYXV0b19zZWxlY3Rfc3BlZWQoVlA4X0NPTVAgKmNwaSkKK3sKKyAgICBpbnQgbWlsbGlzZWNvbmRzX2Zvcl9jb21wcmVzcyA9IChpbnQpKDEwMDAwMDAgLyBjcGktPmZyYW1lX3JhdGUpOworCisgICAgbWlsbGlzZWNvbmRzX2Zvcl9jb21wcmVzcyA9IG1pbGxpc2Vjb25kc19mb3JfY29tcHJlc3MgKiAoMTYgLSBjcGktPm94Y2YuY3B1X3VzZWQpIC8gMTY7CisKKyNpZiAwCisKKyAgICBpZiAoMCkKKyAgICB7CisgICAgICAgIEZJTEUgKmY7CisKKyAgICAgICAgZiA9IGZvcGVuKCJzcGVlZC5zdHQiLCAiYSIpOworICAgICAgICBmcHJpbnRmKGYsICIgJThsZCAlMTBsZCAlMTBsZCAlMTBsZFxuIiwKKyAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBjcGktPlNwZWVkLCBtaWxsaXNlY29uZHNfZm9yX2NvbXByZXNzLCBjcGktPmF2Z19waWNrX21vZGVfdGltZSk7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICB9CisKKyNlbmRpZgorCisgICAgaWYgKGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lIDwgbWlsbGlzZWNvbmRzX2Zvcl9jb21wcmVzcyAmJiAoY3BpLT5hdmdfZW5jb2RlX3RpbWUgLSBjcGktPmF2Z19waWNrX21vZGVfdGltZSkgPCBtaWxsaXNlY29uZHNfZm9yX2NvbXByZXNzKQorICAgIHsKKyAgICAgICAgaWYgKGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+U3BlZWQgPSA0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kc19mb3JfY29tcHJlc3MgKiAxMDAgPCBjcGktPmF2Z19lbmNvZGVfdGltZSAqIDk1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwaS0+U3BlZWQgICAgICAgICAgKz0gMjsKKyAgICAgICAgICAgICAgICBjcGktPmF2Z19waWNrX21vZGVfdGltZSA9IDA7CisgICAgICAgICAgICAgICAgY3BpLT5hdmdfZW5jb2RlX3RpbWUgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+U3BlZWQgPiAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNwaS0+U3BlZWQgPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtaWxsaXNlY29uZHNfZm9yX2NvbXByZXNzICogMTAwID4gY3BpLT5hdmdfZW5jb2RlX3RpbWUgKiBhdXRvX3NwZWVkX3RocmVzaFtjcGktPlNwZWVkXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcGktPlNwZWVkICAgICAgICAgIC09IDE7CisgICAgICAgICAgICAgICAgY3BpLT5hdmdfcGlja19tb2RlX3RpbWUgPSAwOworICAgICAgICAgICAgICAgIGNwaS0+YXZnX2VuY29kZV90aW1lID0gMDsKKworICAgICAgICAgICAgICAgIC8qIEluIHJlYWwtdGltZSBtb2RlLCBjcGktPnNwZWVkIGlzIGluIFs0LCAxNl0uICovCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+U3BlZWQgPCA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5TcGVlZCA9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNwaS0+U3BlZWQgKz0gNDsKKworICAgICAgICBpZiAoY3BpLT5TcGVlZCA+IDE2KQorICAgICAgICAgICAgY3BpLT5TcGVlZCA9IDE2OworCisKKyAgICAgICAgY3BpLT5hdmdfcGlja19tb2RlX3RpbWUgPSAwOworICAgICAgICBjcGktPmF2Z19lbmNvZGVfdGltZSA9IDA7CisgICAgfQorfQorCitpbnQgdnA4X2Jsb2NrX2Vycm9yX2Moc2hvcnQgKmNvZWZmLCBzaG9ydCAqZHFjb2VmZikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyb3IgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBpbnQgdGhpc19kaWZmID0gY29lZmZbaV0gLSBkcWNvZWZmW2ldOworICAgICAgICBlcnJvciArPSB0aGlzX2RpZmYgKiB0aGlzX2RpZmY7CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQgdnA4X21iYmxvY2tfZXJyb3JfYyhNQUNST0JMT0NLICptYiwgaW50IGRjKQoreworICAgIEJMT0NLICAqYmU7CisgICAgQkxPQ0tEICpiZDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYmVycm9yLCBlcnJvciA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGJlID0gJm1iLT5ibG9ja1tpXTsKKyAgICAgICAgYmQgPSAmbWItPmVfbWJkLmJsb2NrW2ldOworCisgICAgICAgIGJlcnJvciA9IDA7CisKKyAgICAgICAgZm9yIChqID0gZGM7IGogPCAxNjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGhpc19kaWZmID0gYmUtPmNvZWZmW2pdIC0gYmQtPmRxY29lZmZbal07CisgICAgICAgICAgICBiZXJyb3IgKz0gdGhpc19kaWZmICogdGhpc19kaWZmOworICAgICAgICB9CisKKyAgICAgICAgZXJyb3IgKz0gYmVycm9yOworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKK30KKworaW50IHZwOF9tYnV2ZXJyb3JfYyhNQUNST0JMT0NLICptYikKK3sKKworICAgIEJMT0NLICAqYmU7CisgICAgQkxPQ0tEICpiZDsKKworCisgICAgaW50IGk7CisgICAgaW50IGVycm9yID0gMDsKKworICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkrKykKKyAgICB7CisgICAgICAgIGJlID0gJm1iLT5ibG9ja1tpXTsKKyAgICAgICAgYmQgPSAmbWItPmVfbWJkLmJsb2NrW2ldOworCisgICAgICAgIGVycm9yICs9IHZwOF9ibG9ja19lcnJvcl9jKGJlLT5jb2VmZiwgYmQtPmRxY29lZmYpOworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKK30KKworaW50IFZQOF9VVlNTRShNQUNST0JMT0NLICp4KQoreworICAgIHVuc2lnbmVkIGNoYXIgKnVwdHIsICp2cHRyOworICAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkX3B0ciA9ICgqKHgtPmJsb2NrWzE2XS5iYXNlX3NyYykgKyB4LT5ibG9ja1sxNl0uc3JjKTsKKyAgICB1bnNpZ25lZCBjaGFyICp2cHJlZF9wdHIgPSAoKih4LT5ibG9ja1syMF0uYmFzZV9zcmMpICsgeC0+YmxvY2tbMjBdLnNyYyk7CisgICAgaW50IHV2X3N0cmlkZSA9IHgtPmJsb2NrWzE2XS5zcmNfc3RyaWRlOworCisgICAgdW5zaWduZWQgaW50IHNzZTEgPSAwOworICAgIHVuc2lnbmVkIGludCBzc2UyID0gMDsKKyAgICBpbnQgbXZfcm93ID0geC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYucm93OworICAgIGludCBtdl9jb2wgPSB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5jb2w7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmVfbWJkLnByZS51dl9zdHJpZGU7CisKKyAgICBpZiAobXZfcm93IDwgMCkKKyAgICAgICAgbXZfcm93IC09IDE7CisgICAgZWxzZQorICAgICAgICBtdl9yb3cgKz0gMTsKKworICAgIGlmIChtdl9jb2wgPCAwKQorICAgICAgICBtdl9jb2wgLT0gMTsKKyAgICBlbHNlCisgICAgICAgIG12X2NvbCArPSAxOworCisgICAgbXZfcm93IC89IDI7CisgICAgbXZfY29sIC89IDI7CisKKyAgICBvZmZzZXQgPSAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7CisgICAgdXB0ciA9IHgtPmVfbWJkLnByZS51X2J1ZmZlciArIG9mZnNldDsKKyAgICB2cHRyID0geC0+ZV9tYmQucHJlLnZfYnVmZmVyICsgb2Zmc2V0OworCisgICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKKyAgICB7CisgICAgICAgIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDgodXB0ciwgcHJlX3N0cmlkZSwKKyAgICAgICAgICAgIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsIHVwcmVkX3B0ciwgdXZfc3RyaWRlLCAmc3NlMik7CisgICAgICAgIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDgodnB0ciwgcHJlX3N0cmlkZSwKKyAgICAgICAgICAgIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsIHZwcmVkX3B0ciwgdXZfc3RyaWRlLCAmc3NlMSk7CisgICAgICAgIHNzZTIgKz0gc3NlMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdnA4X3ZhcmlhbmNlOHg4KHVwdHIsIHByZV9zdHJpZGUsCisgICAgICAgICAgICB1cHJlZF9wdHIsIHV2X3N0cmlkZSwgJnNzZTIpOworICAgICAgICB2cDhfdmFyaWFuY2U4eDgodnB0ciwgcHJlX3N0cmlkZSwKKyAgICAgICAgICAgIHZwcmVkX3B0ciwgdXZfc3RyaWRlLCAmc3NlMSk7CisgICAgICAgIHNzZTIgKz0gc3NlMTsKKyAgICB9CisgICAgcmV0dXJuIHNzZTI7CisKK30KKworc3RhdGljIGludCBjb3N0X2NvZWZmcyhNQUNST0JMT0NLICptYiwgQkxPQ0tEICpiLCBpbnQgdHlwZSwgRU5UUk9QWV9DT05URVhUICphLCBFTlRST1BZX0NPTlRFWFQgKmwpCit7CisgICAgaW50IGMgPSAhdHlwZTsgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IGNvZWYgMCwgdW5sZXNzIFkgd2l0aCBZMiAqLworICAgIGludCBlb2IgPSAoaW50KSgqYi0+ZW9iKTsKKyAgICBpbnQgcHQgOyAgICAvKiBzdXJyb3VuZGluZyBibG9jay9wcmV2IGNvZWYgcHJlZGljdG9yICovCisgICAgaW50IGNvc3QgPSAwOworICAgIHNob3J0ICpxY29lZmZfcHRyID0gYi0+cWNvZWZmOworCisgICAgVlA4X0NPTUJJTkVFTlRST1BZQ09OVEVYVFMocHQsICphLCAqbCk7CisKKyMgZGVmaW5lIFFDKCBJKSAgKCBxY29lZmZfcHRyIFt2cDhfZGVmYXVsdF96aWdfemFnMWRbSV1dICkKKworICAgIGZvciAoOyBjIDwgZW9iOyBjKyspCisgICAgeworICAgICAgICBpbnQgdiA9IFFDKGMpOworICAgICAgICBpbnQgdCA9IHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0clt2XS5Ub2tlbjsKKyAgICAgICAgY29zdCArPSBtYi0+dG9rZW5fY29zdHMgW3R5cGVdIFt2cDhfY29lZl9iYW5kc1tjXV0gW3B0XSBbdF07CisgICAgICAgIGNvc3QgKz0gdnA4X2RjdF92YWx1ZV9jb3N0X3B0clt2XTsKKyAgICAgICAgcHQgPSB2cDhfcHJldl90b2tlbl9jbGFzc1t0XTsKKyAgICB9CisKKyMgdW5kZWYgUUMKKworICAgIGlmIChjIDwgMTYpCisgICAgICAgIGNvc3QgKz0gbWItPnRva2VuX2Nvc3RzIFt0eXBlXSBbdnA4X2NvZWZfYmFuZHNbY11dIFtwdF0gW0RDVF9FT0JfVE9LRU5dOworCisgICAgcHQgPSAoYyAhPSAhdHlwZSk7IC8qIGlzIGVvYiBmaXJzdCBjb2VmZmljaWVudDsgKi8KKyAgICAqYSA9ICpsID0gcHQ7CisKKyAgICByZXR1cm4gY29zdDsKK30KKworc3RhdGljIGludCB2cDhfcmRjb3N0X21ieShNQUNST0JMT0NLICptYikKK3sKKyAgICBpbnQgY29zdCA9IDA7CisgICAgaW50IGI7CisgICAgTUFDUk9CTE9DS0QgKnggPSAmbWItPmVfbWJkOworICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgdF9hYm92ZSwgdF9sZWZ0OworICAgIEVOVFJPUFlfQ09OVEVYVCAqdGE7CisgICAgRU5UUk9QWV9DT05URVhUICp0bDsKKworICAgIHZweF9tZW1jcHkoJnRfYWJvdmUsIG1iLT5lX21iZC5hYm92ZV9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgIHZweF9tZW1jcHkoJnRfbGVmdCwgbWItPmVfbWJkLmxlZnRfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKworICAgIHRhID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2Fib3ZlOworICAgIHRsID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnQ7CisKKyAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKKyAgICAgICAgY29zdCArPSBjb3N0X2NvZWZmcyhtYiwgeC0+YmxvY2sgKyBiLCBQTEFORV9UWVBFX1lfTk9fREMsCisgICAgICAgICAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdKTsKKworICAgIGNvc3QgKz0gY29zdF9jb2VmZnMobWIsIHgtPmJsb2NrICsgMjQsIFBMQU5FX1RZUEVfWTIsCisgICAgICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbMjRdLCB0bCArIHZwOF9ibG9jazJsZWZ0WzI0XSk7CisKKyAgICByZXR1cm4gY29zdDsKK30KKworc3RhdGljIHZvaWQgbWFjcm9fYmxvY2tfeXJkKCBNQUNST0JMT0NLICptYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKkRpc3RvcnRpb24pCit7CisgICAgaW50IGI7CisgICAgTUFDUk9CTE9DS0QgKmNvbnN0IHggPSAmbWItPmVfbWJkOworICAgIEJMT0NLICAgKmNvbnN0IG1iX3kyID0gbWItPmJsb2NrICsgMjQ7CisgICAgQkxPQ0tEICpjb25zdCB4X3kyICA9IHgtPmJsb2NrICsgMjQ7CisgICAgc2hvcnQgKlkyRENQdHIgPSBtYl95Mi0+c3JjX2RpZmY7CisgICAgQkxPQ0sgKmJlcHRyOworICAgIGludCBkOworCisgICAgdnA4X3N1YnRyYWN0X21ieSggbWItPnNyY19kaWZmLCAqKG1iLT5ibG9ja1swXS5iYXNlX3NyYyksCisgICAgICAgIG1iLT5ibG9ja1swXS5zcmNfc3RyaWRlLCAgbWItPmVfbWJkLnByZWRpY3RvciwgMTYpOworCisgICAgLyogRmRjdCBhbmQgYnVpbGRpbmcgdGhlIDJuZCBvcmRlciBibG9jayAqLworICAgIGZvciAoYmVwdHIgPSBtYi0+YmxvY2s7IGJlcHRyIDwgbWItPmJsb2NrICsgMTY7IGJlcHRyICs9IDIpCisgICAgeworICAgICAgICBtYi0+c2hvcnRfZmRjdDh4NChiZXB0ci0+c3JjX2RpZmYsIGJlcHRyLT5jb2VmZiwgMzIpOworICAgICAgICAqWTJEQ1B0cisrID0gYmVwdHItPmNvZWZmWzBdOworICAgICAgICAqWTJEQ1B0cisrID0gYmVwdHItPmNvZWZmWzE2XTsKKyAgICB9CisKKyAgICAvKiAybmQgb3JkZXIgZmRjdCAqLworICAgIG1iLT5zaG9ydF93YWxzaDR4NChtYl95Mi0+c3JjX2RpZmYsIG1iX3kyLT5jb2VmZiwgOCk7CisKKyAgICAvKiBRdWFudGl6YXRpb24gKi8KKyAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKKyAgICB7CisgICAgICAgIG1iLT5xdWFudGl6ZV9iKCZtYi0+YmxvY2tbYl0sICZtYi0+ZV9tYmQuYmxvY2tbYl0pOworICAgIH0KKworICAgIC8qIERDIHByZWRpY2F0aW9uIGFuZCBRdWFudGl6YXRpb24gb2YgMm5kIE9yZGVyIGJsb2NrICovCisgICAgbWItPnF1YW50aXplX2IobWJfeTIsIHhfeTIpOworCisgICAgLyogRGlzdG9ydGlvbiAqLworICAgIGQgPSB2cDhfbWJibG9ja19lcnJvcihtYiwgMSkgPDwgMjsKKyAgICBkICs9IHZwOF9ibG9ja19lcnJvcihtYl95Mi0+Y29lZmYsIHhfeTItPmRxY29lZmYpOworCisgICAgKkRpc3RvcnRpb24gPSAoZCA+PiA0KTsKKworICAgIC8qIHJhdGUgKi8KKyAgICAqUmF0ZSA9IHZwOF9yZGNvc3RfbWJ5KG1iKTsKK30KKworc3RhdGljIHZvaWQgY29weV9wcmVkaWN0b3IodW5zaWduZWQgY2hhciAqZHN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcmVkaWN0b3IpCit7CisgICAgY29uc3QgdW5zaWduZWQgaW50ICpwID0gKGNvbnN0IHVuc2lnbmVkIGludCAqKXByZWRpY3RvcjsKKyAgICB1bnNpZ25lZCBpbnQgKmQgPSAodW5zaWduZWQgaW50ICopZHN0OworICAgIGRbMF0gPSBwWzBdOworICAgIGRbNF0gPSBwWzRdOworICAgIGRbOF0gPSBwWzhdOworICAgIGRbMTJdID0gcFsxMl07Cit9CitzdGF0aWMgaW50IHJkX3BpY2tfaW50cmE0eDRibG9jaygKKyAgICBNQUNST0JMT0NLICp4LAorICAgIEJMT0NLICpiZSwKKyAgICBCTE9DS0QgKmIsCisgICAgQl9QUkVESUNUSU9OX01PREUgKmJlc3RfbW9kZSwKKyAgICBjb25zdCBpbnQgKmJtb2RlX2Nvc3RzLAorICAgIEVOVFJPUFlfQ09OVEVYVCAqYSwKKyAgICBFTlRST1BZX0NPTlRFWFQgKmwsCisKKyAgICBpbnQgKmJlc3RyYXRlLAorICAgIGludCAqYmVzdHJhdGV5LAorICAgIGludCAqYmVzdGRpc3RvcnRpb24pCit7CisgICAgQl9QUkVESUNUSU9OX01PREUgbW9kZTsKKyAgICBpbnQgYmVzdF9yZCA9IElOVF9NQVg7CisgICAgaW50IHJhdGUgPSAwOworICAgIGludCBkaXN0b3J0aW9uOworCisgICAgRU5UUk9QWV9DT05URVhUIHRhID0gKmEsIHRlbXBhID0gKmE7CisgICAgRU5UUk9QWV9DT05URVhUIHRsID0gKmwsIHRlbXBsID0gKmw7CisgICAgLyoKKyAgICAgKiBUaGUgcHJlZGljdG9yIGJ1ZmZlciBpcyBhIDJkIGJ1ZmZlciB3aXRoIGEgc3RyaWRlIG9mIDE2LiAgQ3JlYXRlCisgICAgICogYSB0ZW1wIGJ1ZmZlciB0aGF0IG1lZXRzIHRoZSBzdHJpZGUgcmVxdWlyZW1lbnRzLCBidXQgd2UgYXJlIG9ubHkKKyAgICAgKiBpbnRlcmVzdGVkIGluIHRoZSBsZWZ0IDR4NCBibG9jaworICAgICAqICovCisgICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBjaGFyLCAgYmVzdF9wcmVkaWN0b3IsIDE2KjQpOworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgc2hvcnQsIGJlc3RfZHFjb2VmZiwgMTYpOworICAgIGludCBkc3Rfc3RyaWRlID0geC0+ZV9tYmQuZHN0Lnlfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKmRzdCA9IHgtPmVfbWJkLmRzdC55X2J1ZmZlciArIGItPm9mZnNldDsKKworICAgIHVuc2lnbmVkIGNoYXIgKkFib3ZlID0gZHN0IC0gZHN0X3N0cmlkZTsKKyAgICB1bnNpZ25lZCBjaGFyICp5bGVmdCA9IGRzdCAtIDE7CisgICAgdW5zaWduZWQgY2hhciB0b3BfbGVmdCA9IEFib3ZlWy0xXTsKKworICAgIGZvciAobW9kZSA9IEJfRENfUFJFRDsgbW9kZSA8PSBCX0hVX1BSRUQ7IG1vZGUrKykKKyAgICB7CisgICAgICAgIGludCB0aGlzX3JkOworICAgICAgICBpbnQgcmF0ZXk7CisKKyAgICAgICAgcmF0ZSA9IGJtb2RlX2Nvc3RzW21vZGVdOworCisgICAgICAgIHZwOF9pbnRyYTR4NF9wcmVkaWN0KEFib3ZlLCB5bGVmdCwgZHN0X3N0cmlkZSwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+cHJlZGljdG9yLCAxNiwgdG9wX2xlZnQpOworICAgICAgICB2cDhfc3VidHJhY3RfYihiZSwgYiwgMTYpOworICAgICAgICB4LT5zaG9ydF9mZGN0NHg0KGJlLT5zcmNfZGlmZiwgYmUtPmNvZWZmLCAzMik7CisgICAgICAgIHgtPnF1YW50aXplX2IoYmUsIGIpOworCisgICAgICAgIHRlbXBhID0gdGE7CisgICAgICAgIHRlbXBsID0gdGw7CisKKyAgICAgICAgcmF0ZXkgPSBjb3N0X2NvZWZmcyh4LCBiLCBQTEFORV9UWVBFX1lfV0lUSF9EQywgJnRlbXBhLCAmdGVtcGwpOworICAgICAgICByYXRlICs9IHJhdGV5OworICAgICAgICBkaXN0b3J0aW9uID0gdnA4X2Jsb2NrX2Vycm9yKGJlLT5jb2VmZiwgYi0+ZHFjb2VmZikgPj4gMjsKKworICAgICAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUsIGRpc3RvcnRpb24pOworCisgICAgICAgIGlmICh0aGlzX3JkIDwgYmVzdF9yZCkKKyAgICAgICAgeworICAgICAgICAgICAgKmJlc3RyYXRlID0gcmF0ZTsKKyAgICAgICAgICAgICpiZXN0cmF0ZXkgPSByYXRleTsKKyAgICAgICAgICAgICpiZXN0ZGlzdG9ydGlvbiA9IGRpc3RvcnRpb247CisgICAgICAgICAgICBiZXN0X3JkID0gdGhpc19yZDsKKyAgICAgICAgICAgICpiZXN0X21vZGUgPSBtb2RlOworICAgICAgICAgICAgKmEgPSB0ZW1wYTsKKyAgICAgICAgICAgICpsID0gdGVtcGw7CisgICAgICAgICAgICBjb3B5X3ByZWRpY3RvcihiZXN0X3ByZWRpY3RvciwgYi0+cHJlZGljdG9yKTsKKyAgICAgICAgICAgIHZweF9tZW1jcHkoYmVzdF9kcWNvZWZmLCBiLT5kcWNvZWZmLCAzMik7CisgICAgICAgIH0KKyAgICB9CisgICAgYi0+Ym1pLmFzX21vZGUgPSAqYmVzdF9tb2RlOworCisgICAgdnA4X3Nob3J0X2lkY3Q0eDRsbG0oYmVzdF9kcWNvZWZmLCBiZXN0X3ByZWRpY3RvciwgMTYsIGRzdCwgZHN0X3N0cmlkZSk7CisKKyAgICByZXR1cm4gYmVzdF9yZDsKK30KKworc3RhdGljIGludCByZF9waWNrX2ludHJhNHg0bWJ5X21vZGVzKE1BQ1JPQkxPQ0sgKm1iLCBpbnQgKlJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyYXRlX3ksIGludCAqRGlzdG9ydGlvbiwgaW50IGJlc3RfcmQpCit7CisgICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJm1iLT5lX21iZDsKKyAgICBpbnQgaTsKKyAgICBpbnQgY29zdCA9IG1iLT5tYm1vZGVfY29zdCBbeGQtPmZyYW1lX3R5cGVdIFtCX1BSRURdOworICAgIGludCBkaXN0b3J0aW9uID0gMDsKKyAgICBpbnQgdG90X3JhdGVfeSA9IDA7CisgICAgaW50NjRfdCB0b3RhbF9yZCA9IDA7CisgICAgRU5UUk9QWV9DT05URVhUX1BMQU5FUyB0X2Fib3ZlLCB0X2xlZnQ7CisgICAgRU5UUk9QWV9DT05URVhUICp0YTsKKyAgICBFTlRST1BZX0NPTlRFWFQgKnRsOworICAgIGNvbnN0IGludCAqYm1vZGVfY29zdHM7CisKKyAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlLCBtYi0+ZV9tYmQuYWJvdmVfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKyAgICB2cHhfbWVtY3B5KCZ0X2xlZnQsIG1iLT5lX21iZC5sZWZ0X2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7CisKKyAgICB0YSA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZTsKKyAgICB0bCA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9sZWZ0OworCisgICAgaW50cmFfcHJlZGljdGlvbl9kb3duX2NvcHkoeGQsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICsgMTYpOworCisgICAgYm1vZGVfY29zdHMgPSBtYi0+aW50ZXJfYm1vZGVfY29zdHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIE1PREVfSU5GTyAqY29uc3QgbWljID0geGQtPm1vZGVfaW5mb19jb250ZXh0OworICAgICAgICBjb25zdCBpbnQgbWlzID0geGQtPm1vZGVfaW5mb19zdHJpZGU7CisgICAgICAgIEJfUFJFRElDVElPTl9NT0RFIFVOSU5JVElBTElaRURfSVNfU0FGRShiZXN0X21vZGUpOworICAgICAgICBpbnQgVU5JTklUSUFMSVpFRF9JU19TQUZFKHIpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUocnkpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUoZCk7CisKKyAgICAgICAgaWYgKG1iLT5lX21iZC5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgQl9QUkVESUNUSU9OX01PREUgQSA9IGFib3ZlX2Jsb2NrX21vZGUobWljLCBpLCBtaXMpOworICAgICAgICAgICAgY29uc3QgQl9QUkVESUNUSU9OX01PREUgTCA9IGxlZnRfYmxvY2tfbW9kZShtaWMsIGkpOworCisgICAgICAgICAgICBibW9kZV9jb3N0cyAgPSBtYi0+Ym1vZGVfY29zdHNbQV1bTF07CisgICAgICAgIH0KKworICAgICAgICB0b3RhbF9yZCArPSByZF9waWNrX2ludHJhNHg0YmxvY2soCisgICAgICAgICAgICBtYiwgbWItPmJsb2NrICsgaSwgeGQtPmJsb2NrICsgaSwgJmJlc3RfbW9kZSwgYm1vZGVfY29zdHMsCisgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtpXSwKKyAgICAgICAgICAgIHRsICsgdnA4X2Jsb2NrMmxlZnRbaV0sICZyLCAmcnksICZkKTsKKworICAgICAgICBjb3N0ICs9IHI7CisgICAgICAgIGRpc3RvcnRpb24gKz0gZDsKKyAgICAgICAgdG90X3JhdGVfeSArPSByeTsKKworICAgICAgICBtaWMtPmJtaVtpXS5hc19tb2RlID0gYmVzdF9tb2RlOworCisgICAgICAgIGlmKHRvdGFsX3JkID49IChpbnQ2NF90KWJlc3RfcmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZih0b3RhbF9yZCA+PSAoaW50NjRfdCliZXN0X3JkKQorICAgICAgICByZXR1cm4gSU5UX01BWDsKKworICAgICpSYXRlID0gY29zdDsKKyAgICAqcmF0ZV95ID0gdG90X3JhdGVfeTsKKyAgICAqRGlzdG9ydGlvbiA9IGRpc3RvcnRpb247CisKKyAgICByZXR1cm4gUkRDT1NUKG1iLT5yZG11bHQsIG1iLT5yZGRpdiwgY29zdCwgZGlzdG9ydGlvbik7Cit9CisKKworc3RhdGljIGludCByZF9waWNrX2ludHJhMTZ4MTZtYnlfbW9kZShNQUNST0JMT0NLICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmF0ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKkRpc3RvcnRpb24pCit7CisgICAgTUJfUFJFRElDVElPTl9NT0RFIG1vZGU7CisgICAgTUJfUFJFRElDVElPTl9NT0RFIFVOSU5JVElBTElaRURfSVNfU0FGRShtb2RlX3NlbGVjdGVkKTsKKyAgICBpbnQgcmF0ZSwgcmF0ZXk7CisgICAgaW50IGRpc3RvcnRpb247CisgICAgaW50IGJlc3RfcmQgPSBJTlRfTUFYOworICAgIGludCB0aGlzX3JkOworICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKKworICAgIC8qIFkgU2VhcmNoIGZvciAxNngxNiBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBmb3IgKG1vZGUgPSBEQ19QUkVEOyBtb2RlIDw9IFRNX1BSRUQ7IG1vZGUrKykKKyAgICB7CisgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gbW9kZTsKKworICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyh4ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciAtIHhkLT5kc3QueV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0Lnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7CisKKyAgICAgICAgbWFjcm9fYmxvY2tfeXJkKHgsICZyYXRleSwgJmRpc3RvcnRpb24pOworICAgICAgICByYXRlID0gcmF0ZXkgKyB4LT5tYm1vZGVfY29zdFt4ZC0+ZnJhbWVfdHlwZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGVdOworCisgICAgICAgIHRoaXNfcmQgPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZSwgZGlzdG9ydGlvbik7CisKKyAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X3JkKQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlX3NlbGVjdGVkID0gbW9kZTsKKyAgICAgICAgICAgIGJlc3RfcmQgPSB0aGlzX3JkOworICAgICAgICAgICAgKlJhdGUgPSByYXRlOworICAgICAgICAgICAgKnJhdGVfeSA9IHJhdGV5OworICAgICAgICAgICAgKkRpc3RvcnRpb24gPSBkaXN0b3J0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBtb2RlX3NlbGVjdGVkOworICAgIHJldHVybiBiZXN0X3JkOworfQorCitzdGF0aWMgaW50IHJkX2Nvc3RfbWJ1dihNQUNST0JMT0NLICptYikKK3sKKyAgICBpbnQgYjsKKyAgICBpbnQgY29zdCA9IDA7CisgICAgTUFDUk9CTE9DS0QgKnggPSAmbWItPmVfbWJkOworICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgdF9hYm92ZSwgdF9sZWZ0OworICAgIEVOVFJPUFlfQ09OVEVYVCAqdGE7CisgICAgRU5UUk9QWV9DT05URVhUICp0bDsKKworICAgIHZweF9tZW1jcHkoJnRfYWJvdmUsIG1iLT5lX21iZC5hYm92ZV9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgIHZweF9tZW1jcHkoJnRfbGVmdCwgbWItPmVfbWJkLmxlZnRfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKworICAgIHRhID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2Fib3ZlOworICAgIHRsID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnQ7CisKKyAgICBmb3IgKGIgPSAxNjsgYiA8IDI0OyBiKyspCisgICAgICAgIGNvc3QgKz0gY29zdF9jb2VmZnMobWIsIHgtPmJsb2NrICsgYiwgUExBTkVfVFlQRV9VViwKKyAgICAgICAgICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0pOworCisgICAgcmV0dXJuIGNvc3Q7Cit9CisKKworc3RhdGljIGludCByZF9pbnRlcjE2eDE2X3V2KFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCAqcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpc3RvcnRpb24sIGludCBmdWxscGl4ZWwpCit7CisgICAgdnA4X2J1aWxkX2ludGVyMTZ4MTZfcHJlZGljdG9yc19tYnV2KCZ4LT5lX21iZCk7CisgICAgdnA4X3N1YnRyYWN0X21idXYoeC0+c3JjX2RpZmYsCisgICAgICAgIHgtPnNyYy51X2J1ZmZlciwgeC0+c3JjLnZfYnVmZmVyLCB4LT5zcmMudXZfc3RyaWRlLAorICAgICAgICAmeC0+ZV9tYmQucHJlZGljdG9yWzI1Nl0sICZ4LT5lX21iZC5wcmVkaWN0b3JbMzIwXSwgOCk7CisKKyAgICB2cDhfdHJhbnNmb3JtX21idXYoeCk7CisgICAgdnA4X3F1YW50aXplX21idXYoeCk7CisKKyAgICAqcmF0ZSAgICAgICA9IHJkX2Nvc3RfbWJ1dih4KTsKKyAgICAqZGlzdG9ydGlvbiA9IHZwOF9tYnV2ZXJyb3IoeCkgLyA0OworCisgICAgcmV0dXJuIFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCAqcmF0ZSwgKmRpc3RvcnRpb24pOworfQorCitzdGF0aWMgaW50IHJkX2ludGVyNHg0X3V2KFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCAqcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXN0b3J0aW9uLCBpbnQgZnVsbHBpeGVsKQoreworICAgIHZwOF9idWlsZF9pbnRlcjR4NF9wcmVkaWN0b3JzX21idXYoJngtPmVfbWJkKTsKKyAgICB2cDhfc3VidHJhY3RfbWJ1dih4LT5zcmNfZGlmZiwKKyAgICAgICAgeC0+c3JjLnVfYnVmZmVyLCB4LT5zcmMudl9idWZmZXIsIHgtPnNyYy51dl9zdHJpZGUsCisgICAgICAgICZ4LT5lX21iZC5wcmVkaWN0b3JbMjU2XSwgJngtPmVfbWJkLnByZWRpY3RvclszMjBdLCA4KTsKKworICAgIHZwOF90cmFuc2Zvcm1fbWJ1dih4KTsKKyAgICB2cDhfcXVhbnRpemVfbWJ1dih4KTsKKworICAgICpyYXRlICAgICAgID0gcmRfY29zdF9tYnV2KHgpOworICAgICpkaXN0b3J0aW9uID0gdnA4X21idXZlcnJvcih4KSAvIDQ7CisKKyAgICByZXR1cm4gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsICpyYXRlLCAqZGlzdG9ydGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHJkX3BpY2tfaW50cmFfbWJ1dl9tb2RlKE1BQ1JPQkxPQ0sgKngsIGludCAqcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmF0ZV90b2tlbm9ubHksIGludCAqZGlzdG9ydGlvbikKK3sKKyAgICBNQl9QUkVESUNUSU9OX01PREUgbW9kZTsKKyAgICBNQl9QUkVESUNUSU9OX01PREUgVU5JTklUSUFMSVpFRF9JU19TQUZFKG1vZGVfc2VsZWN0ZWQpOworICAgIGludCBiZXN0X3JkID0gSU5UX01BWDsKKyAgICBpbnQgVU5JTklUSUFMSVpFRF9JU19TQUZFKGQpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUocik7CisgICAgaW50IHJhdGVfdG87CisgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOworCisgICAgZm9yIChtb2RlID0gRENfUFJFRDsgbW9kZSA8PSBUTV9QUkVEOyBtb2RlKyspCisgICAgeworICAgICAgICBpbnQgcmF0ZTsKKyAgICAgICAgaW50IGRpc3RvcnRpb247CisgICAgICAgIGludCB0aGlzX3JkOworCisgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gbW9kZTsKKworICAgICAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MoeGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyIC0geGQtPmRzdC51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnZfYnVmZmVyIC0geGQtPmRzdC51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3Qudl9idWZmZXIgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGQtPnByZWRpY3RvclsyNTZdLCAmeGQtPnByZWRpY3RvclszMjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisKKworICAgICAgICB2cDhfc3VidHJhY3RfbWJ1dih4LT5zcmNfZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICB4LT5zcmMudV9idWZmZXIsIHgtPnNyYy52X2J1ZmZlciwgeC0+c3JjLnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAmeGQtPnByZWRpY3RvclsyNTZdLCAmeGQtPnByZWRpY3RvclszMjBdLCA4KTsKKyAgICAgICAgdnA4X3RyYW5zZm9ybV9tYnV2KHgpOworICAgICAgICB2cDhfcXVhbnRpemVfbWJ1dih4KTsKKworICAgICAgICByYXRlX3RvID0gcmRfY29zdF9tYnV2KHgpOworICAgICAgICByYXRlID0gcmF0ZV90byArIHgtPmludHJhX3V2X21vZGVfY29zdFt4ZC0+ZnJhbWVfdHlwZV1beGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGVdOworCisgICAgICAgIGRpc3RvcnRpb24gPSB2cDhfbWJ1dmVycm9yKHgpIC8gNDsKKworICAgICAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUsIGRpc3RvcnRpb24pOworCisgICAgICAgIGlmICh0aGlzX3JkIDwgYmVzdF9yZCkKKyAgICAgICAgeworICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7CisgICAgICAgICAgICBkID0gZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIHIgPSByYXRlOworICAgICAgICAgICAgKnJhdGVfdG9rZW5vbmx5ID0gcmF0ZV90bzsKKyAgICAgICAgICAgIG1vZGVfc2VsZWN0ZWQgPSBtb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgKnJhdGUgPSByOworICAgICpkaXN0b3J0aW9uID0gZDsKKworICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gbW9kZV9zZWxlY3RlZDsKK30KKworaW50IHZwOF9jb3N0X212X3JlZihNQl9QUkVESUNUSU9OX01PREUgbSwgY29uc3QgaW50IG5lYXJfbXZfcmVmX2N0WzRdKQoreworICAgIHZwOF9wcm9iIHAgW1ZQOF9NVlJFRlMtMV07CisgICAgYXNzZXJ0KE5FQVJFU1RNViA8PSBtICAmJiAgbSA8PSBTUExJVE1WKTsKKyAgICB2cDhfbXZfcmVmX3Byb2JzKHAsIG5lYXJfbXZfcmVmX2N0KTsKKyAgICByZXR1cm4gdnA4X2Nvc3RfdG9rZW4odnA4X212X3JlZl90cmVlLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfbXZfcmVmX2VuY29kaW5nX2FycmF5IC0gTkVBUkVTVE1WICsgbSk7Cit9CisKK3ZvaWQgdnA4X3NldF9tYm1vZGVfYW5kX212cyhNQUNST0JMT0NLICp4LCBNQl9QUkVESUNUSU9OX01PREUgbWIsIGludF9tdiAqbXYpCit7CisgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IG1iOworICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX2ludCA9IG12LT5hc19pbnQ7Cit9CisKK3N0YXRpYyBpbnQgbGFiZWxzMm1vZGUoCisgICAgTUFDUk9CTE9DSyAqeCwKKyAgICBpbnQgY29uc3QgKmxhYmVsaW5ncywgaW50IHdoaWNoX2xhYmVsLAorICAgIEJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZSwKKyAgICBpbnRfbXYgKnRoaXNfbXYsIGludF9tdiAqYmVzdF9yZWZfbXYsCisgICAgaW50ICptdmNvc3RbMl0KKykKK3sKKyAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmIHgtPmVfbWJkOworICAgIE1PREVfSU5GTyAqY29uc3QgbWljID0geGQtPm1vZGVfaW5mb19jb250ZXh0OworICAgIGNvbnN0IGludCBtaXMgPSB4ZC0+bW9kZV9pbmZvX3N0cmlkZTsKKworICAgIGludCBjb3N0ID0gMDsKKyAgICBpbnQgdGhpc212Y29zdCA9IDA7CisKKyAgICAvKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgcmV0cmlldmluZyBwcmV2aW91c2x5LWVuY29kZWQgbW90aW9uIHZlY3RvcnMuCisgICAgICAgT25lcyBmcm9tIHRoaXMgbWFjcm9ibG9jayBoYXZlIHRvIGJlIHB1bGxlZCBmcm9tIHRoZSBCTE9DS0QgYXJyYXkKKyAgICAgICBhcyB0aGV5IGhhdmUgbm90IHlldCBtYWRlIGl0IHRvIHRoZSBibWkgYXJyYXkgaW4gb3VyIE1CX01PREVfSU5GTy4gKi8KKworICAgIGludCBpID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBCTE9DS0QgKmNvbnN0IGQgPSB4ZC0+YmxvY2sgKyBpOworICAgICAgICBjb25zdCBpbnQgcm93ID0gaSA+PiAyLCAgY29sID0gaSAmIDM7CisKKyAgICAgICAgQl9QUkVESUNUSU9OX01PREUgbTsKKworICAgICAgICBpZiAobGFiZWxpbmdzW2ldICE9IHdoaWNoX2xhYmVsKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGNvbCAgJiYgIGxhYmVsaW5nc1tpXSA9PSBsYWJlbGluZ3NbaS0xXSkKKyAgICAgICAgICAgIG0gPSBMRUZUNFg0OworICAgICAgICBlbHNlIGlmIChyb3cgICYmICBsYWJlbGluZ3NbaV0gPT0gbGFiZWxpbmdzW2ktNF0pCisgICAgICAgICAgICBtID0gQUJPVkU0WDQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogdGhlIG9ubHkgdGltZSB3ZSBzaG91bGQgZG8gY29zdGluZyBmb3IgbmV3IG1vdGlvbiB2ZWN0b3IKKyAgICAgICAgICAgICAqIG9yIG1vZGUgaXMgd2hlbiB3ZSBhcmUgb24gYSBuZXcgbGFiZWwgIChqYmIgTWF5IDA4LCAyMDA3KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzd2l0Y2ggKG0gPSB0aGlzX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE5FVzRYNCA6CisgICAgICAgICAgICAgICAgdGhpc212Y29zdCAgPSB2cDhfbXZfYml0X2Nvc3QodGhpc19tdiwgYmVzdF9yZWZfbXYsIG12Y29zdCwgMTAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEVGVDRYNDoKKyAgICAgICAgICAgICAgICB0aGlzX212LT5hc19pbnQgPSBjb2wgPyBkWy0xXS5ibWkubXYuYXNfaW50IDogbGVmdF9ibG9ja19tdihtaWMsIGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQk9WRTRYNDoKKyAgICAgICAgICAgICAgICB0aGlzX212LT5hc19pbnQgPSByb3cgPyBkWy00XS5ibWkubXYuYXNfaW50IDogYWJvdmVfYmxvY2tfbXYobWljLCBpLCBtaXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBaRVJPNFg0OgorICAgICAgICAgICAgICAgIHRoaXNfbXYtPmFzX2ludCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobSA9PSBBQk9WRTRYNCkgIC8qIHJlcGxhY2UgYWJvdmUgd2l0aCBsZWZ0IGlmIHNhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRfbXYgbGVmdF9tdjsKKworICAgICAgICAgICAgICAgIGxlZnRfbXYuYXNfaW50ID0gY29sID8gZFstMV0uYm1pLm12LmFzX2ludCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9ibG9ja19tdihtaWMsIGkpOworCisgICAgICAgICAgICAgICAgaWYgKGxlZnRfbXYuYXNfaW50ID09IHRoaXNfbXYtPmFzX2ludCkKKyAgICAgICAgICAgICAgICAgICAgbSA9IExFRlQ0WDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvc3QgPSB4LT5pbnRlcl9ibW9kZV9jb3N0c1sgbV07CisgICAgICAgIH0KKworICAgICAgICBkLT5ibWkubXYuYXNfaW50ID0gdGhpc19tdi0+YXNfaW50OworCisgICAgICAgIHgtPnBhcnRpdGlvbl9pbmZvLT5ibWlbaV0ubW9kZSA9IG07CisgICAgICAgIHgtPnBhcnRpdGlvbl9pbmZvLT5ibWlbaV0ubXYuYXNfaW50ID0gdGhpc19tdi0+YXNfaW50OworCisgICAgfQorICAgIHdoaWxlICgrK2kgPCAxNik7CisKKyAgICBjb3N0ICs9IHRoaXNtdmNvc3QgOworICAgIHJldHVybiBjb3N0OworfQorCitzdGF0aWMgaW50IHJkY29zdF9tYnNlZ21lbnRfeShNQUNST0JMT0NLICptYiwgY29uc3QgaW50ICpsYWJlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2hfbGFiZWwsIEVOVFJPUFlfQ09OVEVYVCAqdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlRST1BZX0NPTlRFWFQgKnRsKQoreworICAgIGludCBjb3N0ID0gMDsKKyAgICBpbnQgYjsKKyAgICBNQUNST0JMT0NLRCAqeCA9ICZtYi0+ZV9tYmQ7CisKKyAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKKyAgICAgICAgaWYgKGxhYmVsc1sgYl0gPT0gd2hpY2hfbGFiZWwpCisgICAgICAgICAgICBjb3N0ICs9IGNvc3RfY29lZmZzKG1iLCB4LT5ibG9jayArIGIsIFBMQU5FX1RZUEVfWV9XSVRIX0RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGwgKyB2cDhfYmxvY2sybGVmdFtiXSk7CisKKyAgICByZXR1cm4gY29zdDsKKworfQorc3RhdGljIHVuc2lnbmVkIGludCB2cDhfZW5jb2RlX2ludGVyX21iX3NlZ21lbnQoTUFDUk9CTE9DSyAqeCwgaW50IGNvbnN0ICpsYWJlbHMsIGludCB3aGljaF9sYWJlbCkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgZGlzdG9ydGlvbiA9IDA7CisgICAgaW50IHByZV9zdHJpZGUgPSB4LT5lX21iZC5wcmUueV9zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGxhYmVsc1tpXSA9PSB3aGljaF9sYWJlbCkKKyAgICAgICAgeworICAgICAgICAgICAgQkxPQ0tEICpiZCA9ICZ4LT5lX21iZC5ibG9ja1tpXTsKKyAgICAgICAgICAgIEJMT0NLICpiZSA9ICZ4LT5ibG9ja1tpXTsKKworICAgICAgICAgICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfYihiZCwgMTYsIGJhc2VfcHJlLCBwcmVfc3RyaWRlLCB4LT5lX21iZC5zdWJwaXhlbF9wcmVkaWN0KTsKKyAgICAgICAgICAgIHZwOF9zdWJ0cmFjdF9iKGJlLCBiZCwgMTYpOworICAgICAgICAgICAgeC0+c2hvcnRfZmRjdDR4NChiZS0+c3JjX2RpZmYsIGJlLT5jb2VmZiwgMzIpOworICAgICAgICAgICAgeC0+cXVhbnRpemVfYihiZSwgYmQpOworCisgICAgICAgICAgICBkaXN0b3J0aW9uICs9IHZwOF9ibG9ja19lcnJvcihiZS0+Y29lZmYsIGJkLT5kcWNvZWZmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkaXN0b3J0aW9uOworfQorCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2VnbWVudGF0aW9uX3RvX3NzZXNoaWZ0WzRdID0gezMsIDMsIDIsIDB9OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludF9tdiAqcmVmX212OworICBpbnRfbXYgbXZwOworCisgIGludCBzZWdtZW50X3JkOworICBpbnQgc2VnbWVudF9udW07CisgIGludCByOworICBpbnQgZDsKKyAgaW50IHNlZ21lbnRfeXJhdGU7CisgIEJfUFJFRElDVElPTl9NT0RFIG1vZGVzWzE2XTsKKyAgaW50X212IG12c1sxNl07CisgIHVuc2lnbmVkIGNoYXIgZW9ic1sxNl07CisKKyAgaW50IG12dGhyZXNoOworICBpbnQgKm1kY291bnRzOworCisgIGludF9tdiBzdl9tdnBbNF07IC8qIHNhdmUgNCBtdnAgZnJvbSA4eDggKi8KKyAgaW50IHN2X2lzdGVwWzJdOyAgLyogc2F2ZSAyIGluaXRpYWwgc3RlcF9wYXJhbSBmb3IgMTZ4OC84eDE2ICovCisKK30gQkVTVF9TRUdfSU5GTzsKKworCitzdGF0aWMgdm9pZCByZF9jaGVja19zZWdtZW50KFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFU1RfU0VHX0lORk8gKmJzaSwgdW5zaWduZWQgaW50IHNlZ21lbnRhdGlvbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY29uc3QgKmxhYmVsczsKKyAgICBpbnQgYnIgPSAwOworICAgIGludCBiZCA9IDA7CisgICAgQl9QUkVESUNUSU9OX01PREUgdGhpc19tb2RlOworCisKKyAgICBpbnQgbGFiZWxfY291bnQ7CisgICAgaW50IHRoaXNfc2VnbWVudF9yZCA9IDA7CisgICAgaW50IGxhYmVsX212X3RocmVzaDsKKyAgICBpbnQgcmF0ZSA9IDA7CisgICAgaW50IHNiciA9IDA7CisgICAgaW50IHNiZCA9IDA7CisgICAgaW50IHNlZ21lbnR5cmF0ZSA9IDA7CisKKyAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZfZm5fcHRyOworCisgICAgRU5UUk9QWV9DT05URVhUX1BMQU5FUyB0X2Fib3ZlLCB0X2xlZnQ7CisgICAgRU5UUk9QWV9DT05URVhUICp0YTsKKyAgICBFTlRST1BZX0NPTlRFWFQgKnRsOworICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgdF9hYm92ZV9iLCB0X2xlZnRfYjsKKyAgICBFTlRST1BZX0NPTlRFWFQgKnRhX2I7CisgICAgRU5UUk9QWV9DT05URVhUICp0bF9iOworCisgICAgdnB4X21lbWNweSgmdF9hYm92ZSwgeC0+ZV9tYmQuYWJvdmVfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKyAgICB2cHhfbWVtY3B5KCZ0X2xlZnQsIHgtPmVfbWJkLmxlZnRfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKworICAgIHRhID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2Fib3ZlOworICAgIHRsID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnQ7CisgICAgdGFfYiA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZV9iOworICAgIHRsX2IgPSAoRU5UUk9QWV9DT05URVhUICopJnRfbGVmdF9iOworCisgICAgYnIgPSAwOworICAgIGJkID0gMDsKKworICAgIHZfZm5fcHRyID0gJmNwaS0+Zm5fcHRyW3NlZ21lbnRhdGlvbl07CisgICAgbGFiZWxzID0gdnA4X21ic3BsaXRzW3NlZ21lbnRhdGlvbl07CisgICAgbGFiZWxfY291bnQgPSB2cDhfbWJzcGxpdF9jb3VudFtzZWdtZW50YXRpb25dOworCisgICAgLyogNjQgbWFrZXMgdGhpcyB0aHJlc2hvbGQgcmVhbGx5IGJpZyBlZmZlY3RpdmVseSBtYWtpbmcgaXQgc28gdGhhdCB3ZQorICAgICAqIHZlcnkgcmFyZWx5IGNoZWNrIG12cyBvbiBzZWdtZW50cy4gICBzZXR0aW5nIHRoaXMgdG8gMSB3b3VsZCBtYWtlIG12CisgICAgICogdGhyZXNoIHJvdWdobHkgZXF1YWwgdG8gd2hhdCBpdCBpcyBmb3IgbWFjcm9ibG9ja3MKKyAgICAgKi8KKyAgICBsYWJlbF9tdl90aHJlc2ggPSAxICogYnNpLT5tdnRocmVzaCAvIGxhYmVsX2NvdW50IDsKKworICAgIC8qIFNlZ21lbnRhdGlvbiBtZXRob2Qgb3ZlcmhlYWRzICovCisgICAgcmF0ZSA9IHZwOF9jb3N0X3Rva2VuKHZwOF9tYnNwbGl0X3RyZWUsIHZwOF9tYnNwbGl0X3Byb2JzLCB2cDhfbWJzcGxpdF9lbmNvZGluZ3MgKyBzZWdtZW50YXRpb24pOworICAgIHJhdGUgKz0gdnA4X2Nvc3RfbXZfcmVmKFNQTElUTVYsIGJzaS0+bWRjb3VudHMpOworICAgIHRoaXNfc2VnbWVudF9yZCArPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZSwgMCk7CisgICAgYnIgKz0gcmF0ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsYWJlbF9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50X212IG1vZGVfbXZbQl9NT0RFX0NPVU5UXTsKKyAgICAgICAgaW50IGJlc3RfbGFiZWxfcmQgPSBJTlRfTUFYOworICAgICAgICBCX1BSRURJQ1RJT05fTU9ERSBtb2RlX3NlbGVjdGVkID0gWkVSTzRYNDsKKyAgICAgICAgaW50IGJlc3RsYWJlbHlyYXRlID0gMDsKKworICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3Igb24gdGhpcyBzZWdtZW50ICovCisgICAgICAgIGZvciAodGhpc19tb2RlID0gTEVGVDRYNDsgdGhpc19tb2RlIDw9IE5FVzRYNCA7IHRoaXNfbW9kZSArKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRoaXNfcmQ7CisgICAgICAgICAgICBpbnQgZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIGludCBsYWJlbHlyYXRlOworICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUX1BMQU5FUyB0X2Fib3ZlX3MsIHRfbGVmdF9zOworICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUICp0YV9zOworICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUICp0bF9zOworCisgICAgICAgICAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlX3MsICZ0X2Fib3ZlLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgICAgICAgICAgdnB4X21lbWNweSgmdF9sZWZ0X3MsICZ0X2xlZnQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7CisKKyAgICAgICAgICAgIHRhX3MgPSAoRU5UUk9QWV9DT05URVhUICopJnRfYWJvdmVfczsKKyAgICAgICAgICAgIHRsX3MgPSAoRU5UUk9QWV9DT05URVhUICopJnRfbGVmdF9zOworCisgICAgICAgICAgICBpZiAodGhpc19tb2RlID09IE5FVzRYNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3Nlc2hpZnQ7CisgICAgICAgICAgICAgICAgaW50IG51bTAwOworICAgICAgICAgICAgICAgIGludCBzdGVwX3BhcmFtID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZnVydGhlcl9zdGVwczsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBpbnQgdGhpc3NtZTsKKyAgICAgICAgICAgICAgICBpbnQgYmVzdHNtZSA9IElOVF9NQVg7CisgICAgICAgICAgICAgICAgaW50X212ICB0ZW1wX212OworICAgICAgICAgICAgICAgIEJMT0NLICpjOworICAgICAgICAgICAgICAgIEJMT0NLRCAqZTsKKworICAgICAgICAgICAgICAgIC8qIElzIHRoZSBiZXN0IHNvIGZhciBzdWZmaWNpZW50bHkgZ29vZCB0aGF0IHdlIGNhbnQganVzdGlmeQorICAgICAgICAgICAgICAgICAqIGRvaW5nIGEgbmV3IG1vdGlvbiBzZWFyY2guCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGJlc3RfbGFiZWxfcmQgPCBsYWJlbF9tdl90aHJlc2gpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYoY3BpLT5jb21wcmVzc29yX3NwZWVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvbiA9PSBCTE9DS184WDE2IHx8IHNlZ21lbnRhdGlvbiA9PSBCTE9DS18xNlg4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBic2ktPm12cC5hc19pbnQgPSBic2ktPnN2X212cFtpXS5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09MSAmJiBzZWdtZW50YXRpb24gPT0gQkxPQ0tfMTZYOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnNpLT5tdnAuYXNfaW50ID0gYnNpLT5zdl9tdnBbMl0uYXNfaW50OworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGVwX3BhcmFtID0gYnNpLT5zdl9pc3RlcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBwcmV2aW91cyBibG9jaydzIHJlc3VsdCBhcyBuZXh0IGJsb2NrJ3MgTVYKKyAgICAgICAgICAgICAgICAgICAgICogcHJlZGljdG9yLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvbiA9PSBCTE9DS180WDQgJiYgaT4wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBic2ktPm12cC5hc19pbnQgPSB4LT5lX21iZC5ibG9ja1tpLTFdLmJtaS5tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09NCB8fCBpPT04IHx8IGk9PTEyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzaS0+bXZwLmFzX2ludCA9IHgtPmVfbWJkLmJsb2NrW2ktNF0uYm1pLm12LmFzX2ludDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0gPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnVydGhlcl9zdGVwcyA9IChNQVhfTVZTRUFSQ0hfU1RFUFMgLSAxKSAtIHN0ZXBfcGFyYW07CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzYWRwYiA9IHgtPnNhZHBlcmJpdDQ7CisgICAgICAgICAgICAgICAgICAgIGludF9tdiBtdnBfZnVsbDsKKworICAgICAgICAgICAgICAgICAgICBtdnBfZnVsbC5hc19tdi5yb3cgPSBic2ktPm12cC5hc19tdi5yb3cgPj4zOworICAgICAgICAgICAgICAgICAgICBtdnBfZnVsbC5hc19tdi5jb2wgPSBic2ktPm12cC5hc19tdi5jb2wgPj4zOworCisgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgZmlyc3QgbGFiZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgbiA9IHZwOF9tYnNwbGl0X29mZnNldFtzZWdtZW50YXRpb25dW2ldOworCisgICAgICAgICAgICAgICAgICAgIGMgPSAmeC0+YmxvY2tbbl07CisgICAgICAgICAgICAgICAgICAgIGUgPSAmeC0+ZV9tYmQuYmxvY2tbbl07CisKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkKHgsIGMsIGUsICZtdnBfZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlX212W05FVzRYNF0sIHN0ZXBfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWRwYiwgJm51bTAwLCB2X2ZuX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPm12Y29zdCwgYnNpLT5yZWZfbXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBuID0gbnVtMDA7CisgICAgICAgICAgICAgICAgICAgICAgICBudW0wMCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgZnVydGhlcl9zdGVwcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTAwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc3NtZSA9IGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkKHgsIGMsIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm12cF9mdWxsLCAmdGVtcF9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwX3BhcmFtICsgbiwgc2FkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bTAwLCB2X2ZuX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5tdmNvc3QsIGJzaS0+cmVmX212KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NtZSA8IGJlc3RzbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzbWUgPSB0aGlzc21lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdltORVc0WDRdLmFzX2ludCA9IHRlbXBfbXYuYXNfaW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3Nlc2hpZnQgPSBzZWdtZW50YXRpb25fdG9fc3Nlc2hpZnRbc2VnbWVudGF0aW9uXTsKKworICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgd2UgZG8gYSBmdWxsIHNlYXJjaCAoYmVzdCBxdWFsaXR5IG9ubHkpICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDApICYmIChiZXN0c21lID4+IHNzZXNoaWZ0KSA+IDQwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIG12cF9mdWxsIGlzIHdpdGhpbiB0aGUgcmFuZ2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfY2xhbXBfbXYoJm12cF9mdWxsLCB4LT5tdl9jb2xfbWluLCB4LT5tdl9jb2xfbWF4LCB4LT5tdl9yb3dfbWluLCB4LT5tdl9yb3dfbWF4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc3NtZSA9IGNwaS0+ZnVsbF9zZWFyY2hfc2FkKHgsIGMsIGUsICZtdnBfZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWRwYiwgMTYsIHZfZm5fcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPm12Y29zdCwgYnNpLT5yZWZfbXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NtZSA8IGJlc3RzbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IHRoaXNzbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdltORVc0WDRdLmFzX2ludCA9IGUtPmJtaS5tdi5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZ1bGwgc2VhcmNoIHJlc3VsdCBpcyBhY3R1YWxseSB3b3JzZSBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlLWluc3RhdGUgdGhlIHByZXZpb3VzIGJlc3QgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+Ym1pLm12LmFzX2ludCA9IG1vZGVfbXZbTkVXNFg0XS5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYmVzdHNtZSA8IElOVF9NQVgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdG9ydGlvbjsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNzZTsKKyAgICAgICAgICAgICAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCh4LCBjLCBlLCAmbW9kZV9tdltORVc0WDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgYnNpLT5yZWZfbXYsIHgtPmVycm9ycGVyYml0LCB2X2ZuX3B0ciwgeC0+bXZjb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3RvcnRpb24sICZzc2UpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBORVc0WDQgKi8KKworICAgICAgICAgICAgcmF0ZSA9IGxhYmVsczJtb2RlKHgsIGxhYmVscywgaSwgdGhpc19tb2RlLCAmbW9kZV9tdlt0aGlzX21vZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzaS0+cmVmX212LCB4LT5tdmNvc3QpOworCisgICAgICAgICAgICAvKiBUcmFwIHZlY3RvcnMgdGhhdCByZWFjaCBiZXlvbmQgdGhlIFVNViBib3JkZXJzICovCisgICAgICAgICAgICBpZiAoKChtb2RlX212W3RoaXNfbW9kZV0uYXNfbXYucm93ID4+IDMpIDwgeC0+bXZfcm93X21pbikgfHwgKChtb2RlX212W3RoaXNfbW9kZV0uYXNfbXYucm93ID4+IDMpID4geC0+bXZfcm93X21heCkgfHwKKyAgICAgICAgICAgICAgICAoKG1vZGVfbXZbdGhpc19tb2RlXS5hc19tdi5jb2wgPj4gMykgPCB4LT5tdl9jb2xfbWluKSB8fCAoKG1vZGVfbXZbdGhpc19tb2RlXS5hc19tdi5jb2wgPj4gMykgPiB4LT5tdl9jb2xfbWF4KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlzdG9ydGlvbiA9IHZwOF9lbmNvZGVfaW50ZXJfbWJfc2VnbWVudCh4LCBsYWJlbHMsIGkpIC8gNDsKKworICAgICAgICAgICAgbGFiZWx5cmF0ZSA9IHJkY29zdF9tYnNlZ21lbnRfeSh4LCBsYWJlbHMsIGksIHRhX3MsIHRsX3MpOworICAgICAgICAgICAgcmF0ZSArPSBsYWJlbHlyYXRlOworCisgICAgICAgICAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUsIGRpc3RvcnRpb24pOworCisgICAgICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfbGFiZWxfcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2JyID0gcmF0ZTsKKyAgICAgICAgICAgICAgICBzYmQgPSBkaXN0b3J0aW9uOworICAgICAgICAgICAgICAgIGJlc3RsYWJlbHlyYXRlID0gbGFiZWx5cmF0ZTsKKyAgICAgICAgICAgICAgICBtb2RlX3NlbGVjdGVkID0gdGhpc19tb2RlOworICAgICAgICAgICAgICAgIGJlc3RfbGFiZWxfcmQgPSB0aGlzX3JkOworCisgICAgICAgICAgICAgICAgdnB4X21lbWNweSh0YV9iLCB0YV9zLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgICAgICAgICAgICAgIHZweF9tZW1jcHkodGxfYiwgdGxfcywgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9IC8qZm9yIGVhY2ggNHg0IG1vZGUqLworCisgICAgICAgIHZweF9tZW1jcHkodGEsIHRhX2IsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7CisgICAgICAgIHZweF9tZW1jcHkodGwsIHRsX2IsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7CisKKyAgICAgICAgbGFiZWxzMm1vZGUoeCwgbGFiZWxzLCBpLCBtb2RlX3NlbGVjdGVkLCAmbW9kZV9tdlttb2RlX3NlbGVjdGVkXSwKKyAgICAgICAgICAgICAgICAgICAgYnNpLT5yZWZfbXYsIHgtPm12Y29zdCk7CisKKyAgICAgICAgYnIgKz0gc2JyOworICAgICAgICBiZCArPSBzYmQ7CisgICAgICAgIHNlZ21lbnR5cmF0ZSArPSBiZXN0bGFiZWx5cmF0ZTsKKyAgICAgICAgdGhpc19zZWdtZW50X3JkICs9IGJlc3RfbGFiZWxfcmQ7CisKKyAgICAgICAgaWYgKHRoaXNfc2VnbWVudF9yZCA+PSBic2ktPnNlZ21lbnRfcmQpCisgICAgICAgICAgICBicmVhazsKKworICAgIH0gLyogZm9yIGVhY2ggbGFiZWwgKi8KKworICAgIGlmICh0aGlzX3NlZ21lbnRfcmQgPCBic2ktPnNlZ21lbnRfcmQpCisgICAgeworICAgICAgICBic2ktPnIgPSBicjsKKyAgICAgICAgYnNpLT5kID0gYmQ7CisgICAgICAgIGJzaS0+c2VnbWVudF95cmF0ZSA9IHNlZ21lbnR5cmF0ZTsKKyAgICAgICAgYnNpLT5zZWdtZW50X3JkID0gdGhpc19zZWdtZW50X3JkOworICAgICAgICBic2ktPnNlZ21lbnRfbnVtID0gc2VnbWVudGF0aW9uOworCisgICAgICAgIC8qIHN0b3JlIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGNvbWUgYmFjayB0byB0aGlzISEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJzaS0+bXZzW2ldLmFzX212ID0geC0+cGFydGl0aW9uX2luZm8tPmJtaVtpXS5tdi5hc19tdjsKKyAgICAgICAgICAgIGJzaS0+bW9kZXNbaV0gPSB4LT5wYXJ0aXRpb25faW5mby0+Ym1pW2ldLm1vZGU7CisgICAgICAgICAgICBic2ktPmVvYnNbaV0gPSB4LT5lX21iZC5lb2JzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMKK3ZvaWQgdnA4X2NhbF9zdGVwX3BhcmFtKGludCBzciwgaW50ICpzcCkKK3sKKyAgICBpbnQgc3RlcCA9IDA7CisKKyAgICBpZiAoc3IgPiBNQVhfRklSU1RfU1RFUCkgc3IgPSBNQVhfRklSU1RfU1RFUDsKKyAgICBlbHNlIGlmIChzciA8IDEpIHNyID0gMTsKKworICAgIHdoaWxlIChzcj4+PTEpCisgICAgICAgIHN0ZXArKzsKKworICAgICpzcCA9IE1BWF9NVlNFQVJDSF9TVEVQUyAtIDEgLSBzdGVwOworfQorCitzdGF0aWMgaW50IHZwOF9yZF9waWNrX2Jlc3RfbWJzZWdtZW50YXRpb24oVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfbXYgKmJlc3RfcmVmX212LCBpbnQgYmVzdF9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1kY291bnRzLCBpbnQgKnJldHVybnRvdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZXR1cm55cmF0ZSwgaW50ICpyZXR1cm5kaXN0b3J0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdnRocmVzaCkKK3sKKyAgICBpbnQgaTsKKyAgICBCRVNUX1NFR19JTkZPIGJzaTsKKworICAgIHZweF9tZW1zZXQoJmJzaSwgMCwgc2l6ZW9mKGJzaSkpOworCisgICAgYnNpLnNlZ21lbnRfcmQgPSBiZXN0X3JkOworICAgIGJzaS5yZWZfbXYgPSBiZXN0X3JlZl9tdjsKKyAgICBic2kubXZwLmFzX2ludCA9IGJlc3RfcmVmX212LT5hc19pbnQ7CisgICAgYnNpLm12dGhyZXNoID0gbXZ0aHJlc2g7CisgICAgYnNpLm1kY291bnRzID0gbWRjb3VudHM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgYnNpLm1vZGVzW2ldID0gWkVSTzRYNDsKKyAgICB9CisKKyAgICBpZihjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIGZvciBub3csIHdlIHdpbGwga2VlcCB0aGUgb3JpZ2luYWwgc2VnbWVudGF0aW9uIG9yZGVyCisgICAgICAgICAgIHdoZW4gaW4gYmVzdCBxdWFsaXR5IG1vZGUgKi8KKyAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzE2WDgpOworICAgICAgICByZF9jaGVja19zZWdtZW50KGNwaSwgeCwgJmJzaSwgQkxPQ0tfOFgxNik7CisgICAgICAgIHJkX2NoZWNrX3NlZ21lbnQoY3BpLCB4LCAmYnNpLCBCTE9DS184WDgpOworICAgICAgICByZF9jaGVja19zZWdtZW50KGNwaSwgeCwgJmJzaSwgQkxPQ0tfNFg0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHNyOworCisgICAgICAgIHJkX2NoZWNrX3NlZ21lbnQoY3BpLCB4LCAmYnNpLCBCTE9DS184WDgpOworCisgICAgICAgIGlmIChic2kuc2VnbWVudF9yZCA8IGJlc3RfcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2xfbWluID0gKChiZXN0X3JlZl9tdi0+YXNfbXYuY29sKzcpPj4zKSAtIE1BWF9GVUxMX1BFTF9WQUw7CisgICAgICAgICAgICBpbnQgcm93X21pbiA9ICgoYmVzdF9yZWZfbXYtPmFzX212LnJvdys3KT4+MykgLSBNQVhfRlVMTF9QRUxfVkFMOworICAgICAgICAgICAgaW50IGNvbF9tYXggPSAoYmVzdF9yZWZfbXYtPmFzX212LmNvbD4+MykgKyBNQVhfRlVMTF9QRUxfVkFMOworICAgICAgICAgICAgaW50IHJvd19tYXggPSAoYmVzdF9yZWZfbXYtPmFzX212LnJvdz4+MykgKyBNQVhfRlVMTF9QRUxfVkFMOworCisgICAgICAgICAgICBpbnQgdG1wX2NvbF9taW4gPSB4LT5tdl9jb2xfbWluOworICAgICAgICAgICAgaW50IHRtcF9jb2xfbWF4ID0geC0+bXZfY29sX21heDsKKyAgICAgICAgICAgIGludCB0bXBfcm93X21pbiA9IHgtPm12X3Jvd19taW47CisgICAgICAgICAgICBpbnQgdG1wX3Jvd19tYXggPSB4LT5tdl9yb3dfbWF4OworCisgICAgICAgICAgICAvKiBHZXQgaW50ZXJzZWN0aW9uIG9mIFVNViB3aW5kb3cgYW5kIHZhbGlkIE1WIHdpbmRvdyB0byByZWR1Y2UgIyBvZiBjaGVja3MgaW4gZGlhbW9uZCBzZWFyY2guICovCisgICAgICAgICAgICBpZiAoeC0+bXZfY29sX21pbiA8IGNvbF9taW4gKQorICAgICAgICAgICAgICAgIHgtPm12X2NvbF9taW4gPSBjb2xfbWluOworICAgICAgICAgICAgaWYgKHgtPm12X2NvbF9tYXggPiBjb2xfbWF4ICkKKyAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWF4ID0gY29sX21heDsKKyAgICAgICAgICAgIGlmICh4LT5tdl9yb3dfbWluIDwgcm93X21pbiApCisgICAgICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHJvd19taW47CisgICAgICAgICAgICBpZiAoeC0+bXZfcm93X21heCA+IHJvd19tYXggKQorICAgICAgICAgICAgICAgIHgtPm12X3Jvd19tYXggPSByb3dfbWF4OworCisgICAgICAgICAgICAvKiBHZXQgOHg4IHJlc3VsdCAqLworICAgICAgICAgICAgYnNpLnN2X212cFswXS5hc19pbnQgPSBic2kubXZzWzBdLmFzX2ludDsKKyAgICAgICAgICAgIGJzaS5zdl9tdnBbMV0uYXNfaW50ID0gYnNpLm12c1syXS5hc19pbnQ7CisgICAgICAgICAgICBic2kuc3ZfbXZwWzJdLmFzX2ludCA9IGJzaS5tdnNbOF0uYXNfaW50OworICAgICAgICAgICAgYnNpLnN2X212cFszXS5hc19pbnQgPSBic2kubXZzWzEwXS5hc19pbnQ7CisKKyAgICAgICAgICAgIC8qIFVzZSA4eDggcmVzdWx0IGFzIDE2eDgvOHgxNidzIHByZWRpY3RvciBNVi4gQWRqdXN0IHNlYXJjaCByYW5nZSBhY2NvcmRpbmcgdG8gdGhlIGNsb3NlbmVzcyBvZiAyIE1WLiAqLworICAgICAgICAgICAgLyogYmxvY2sgOFgxNiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNyID0gTUFYRigoYWJzKGJzaS5zdl9tdnBbMF0uYXNfbXYucm93IC0gYnNpLnN2X212cFsyXS5hc19tdi5yb3cpKT4+MywgKGFicyhic2kuc3ZfbXZwWzBdLmFzX212LmNvbCAtIGJzaS5zdl9tdnBbMl0uYXNfbXYuY29sKSk+PjMpOworICAgICAgICAgICAgICAgIHZwOF9jYWxfc3RlcF9wYXJhbShzciwgJmJzaS5zdl9pc3RlcFswXSk7CisKKyAgICAgICAgICAgICAgICBzciA9IE1BWEYoKGFicyhic2kuc3ZfbXZwWzFdLmFzX212LnJvdyAtIGJzaS5zdl9tdnBbM10uYXNfbXYucm93KSk+PjMsIChhYnMoYnNpLnN2X212cFsxXS5hc19tdi5jb2wgLSBic2kuc3ZfbXZwWzNdLmFzX212LmNvbCkpPj4zKTsKKyAgICAgICAgICAgICAgICB2cDhfY2FsX3N0ZXBfcGFyYW0oc3IsICZic2kuc3ZfaXN0ZXBbMV0pOworCisgICAgICAgICAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzhYMTYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBibG9jayAxNlg4ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3IgPSBNQVhGKChhYnMoYnNpLnN2X212cFswXS5hc19tdi5yb3cgLSBic2kuc3ZfbXZwWzFdLmFzX212LnJvdykpPj4zLCAoYWJzKGJzaS5zdl9tdnBbMF0uYXNfbXYuY29sIC0gYnNpLnN2X212cFsxXS5hc19tdi5jb2wpKT4+Myk7CisgICAgICAgICAgICAgICAgdnA4X2NhbF9zdGVwX3BhcmFtKHNyLCAmYnNpLnN2X2lzdGVwWzBdKTsKKworICAgICAgICAgICAgICAgIHNyID0gTUFYRigoYWJzKGJzaS5zdl9tdnBbMl0uYXNfbXYucm93IC0gYnNpLnN2X212cFszXS5hc19tdi5yb3cpKT4+MywgKGFicyhic2kuc3ZfbXZwWzJdLmFzX212LmNvbCAtIGJzaS5zdl9tdnBbM10uYXNfbXYuY29sKSk+PjMpOworICAgICAgICAgICAgICAgIHZwOF9jYWxfc3RlcF9wYXJhbShzciwgJmJzaS5zdl9pc3RlcFsxXSk7CisKKyAgICAgICAgICAgICAgICByZF9jaGVja19zZWdtZW50KGNwaSwgeCwgJmJzaSwgQkxPQ0tfMTZYOCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIDh4OCBpcyBiZXR0ZXIgdGhhbiAxNng4Lzh4MTYsIHRoZW4gZG8gNHg0IHNlYXJjaCAqLworICAgICAgICAgICAgLyogTm90IHNraXAgNHg0IGlmIHNwZWVkPTAgKGdvb2QgcXVhbGl0eSkgKi8KKyAgICAgICAgICAgIGlmIChjcGktPnNmLm5vX3NraXBfYmxvY2s0eDRfc2VhcmNoIHx8IGJzaS5zZWdtZW50X251bSA9PSBCTE9DS184WDgpICAvKiB8fCAoc3Zfc2VnbWVudF9yZDh4OC1ic2kuc2VnbWVudF9yZCkgPCBzdl9zZWdtZW50X3JkOHg4Pj41KSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzaS5tdnAuYXNfaW50ID0gYnNpLnN2X212cFswXS5hc19pbnQ7CisgICAgICAgICAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzRYNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJlc3RvcmUgVU1WIHdpbmRvdyAqLworICAgICAgICAgICAgeC0+bXZfY29sX21pbiA9IHRtcF9jb2xfbWluOworICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IHRtcF9jb2xfbWF4OworICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHRtcF9yb3dfbWluOworICAgICAgICAgICAgeC0+bXZfcm93X21heCA9IHRtcF9yb3dfbWF4OworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IGl0IHRvIHRoZSBiZXN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBCTE9DS0QgKmJkID0gJngtPmVfbWJkLmJsb2NrW2ldOworCisgICAgICAgIGJkLT5ibWkubXYuYXNfaW50ID0gYnNpLm12c1tpXS5hc19pbnQ7CisgICAgICAgICpiZC0+ZW9iID0gYnNpLmVvYnNbaV07CisgICAgfQorCisgICAgKnJldHVybnRvdHJhdGUgPSBic2kucjsKKyAgICAqcmV0dXJuZGlzdG9ydGlvbiA9IGJzaS5kOworICAgICpyZXR1cm55cmF0ZSA9IGJzaS5zZWdtZW50X3lyYXRlOworCisgICAgLyogc2F2ZSBwYXJ0aXRpb25zICovCisgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucGFydGl0aW9uaW5nID0gYnNpLnNlZ21lbnRfbnVtOworICAgIHgtPnBhcnRpdGlvbl9pbmZvLT5jb3VudCA9IHZwOF9tYnNwbGl0X2NvdW50W2JzaS5zZWdtZW50X251bV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgeC0+cGFydGl0aW9uX2luZm8tPmNvdW50OyBpKyspCisgICAgeworICAgICAgICBpbnQgajsKKworICAgICAgICBqID0gdnA4X21ic3BsaXRfb2Zmc2V0W2JzaS5zZWdtZW50X251bV1baV07CisKKyAgICAgICAgeC0+cGFydGl0aW9uX2luZm8tPmJtaVtpXS5tb2RlID0gYnNpLm1vZGVzW2pdOworICAgICAgICB4LT5wYXJ0aXRpb25faW5mby0+Ym1pW2ldLm12LmFzX212ID0gYnNpLm12c1tqXS5hc19tdjsKKyAgICB9CisgICAgLyoKKyAgICAgKiB1c2VkIHRvIHNldCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19pbnQKKyAgICAgKi8KKyAgICB4LT5wYXJ0aXRpb25faW5mby0+Ym1pWzE1XS5tdi5hc19pbnQgPSBic2kubXZzWzE1XS5hc19pbnQ7CisKKyAgICByZXR1cm4gYnNpLnNlZ21lbnRfcmQ7Cit9CisKKy8qIFRoZSBpbXByb3ZlZCBNViBwcmVkaWN0aW9uICovCit2b2lkIHZwOF9tdl9wcmVkCisoCisgICAgVlA4X0NPTVAgKmNwaSwKKyAgICBNQUNST0JMT0NLRCAqeGQsCisgICAgY29uc3QgTU9ERV9JTkZPICpoZXJlLAorICAgIGludF9tdiAqbXZwLAorICAgIGludCByZWZmcmFtZSwKKyAgICBpbnQgKnJlZl9mcmFtZV9zaWduX2JpYXMsCisgICAgaW50ICpzciwKKyAgICBpbnQgbmVhcl9zYWRpZHhbXQorKQoreworICAgIGNvbnN0IE1PREVfSU5GTyAqYWJvdmUgPSBoZXJlIC0geGQtPm1vZGVfaW5mb19zdHJpZGU7CisgICAgY29uc3QgTU9ERV9JTkZPICpsZWZ0ID0gaGVyZSAtIDE7CisgICAgY29uc3QgTU9ERV9JTkZPICphYm92ZWxlZnQgPSBhYm92ZSAtIDE7CisgICAgaW50X212ICAgICAgICAgICBuZWFyX212c1s4XTsKKyAgICBpbnQgICAgICAgICAgICAgIG5lYXJfcmVmWzhdOworICAgIGludF9tdiAgICAgICAgICAgbXY7CisgICAgaW50ICAgICAgICAgICAgICB2Y250PTA7CisgICAgaW50ICAgICAgICAgICAgICBmaW5kPTA7CisgICAgaW50ICAgICAgICAgICAgICBtYl9vZmZzZXQ7CisKKyAgICBpbnQgICAgICAgICAgICAgIG12eFs4XTsKKyAgICBpbnQgICAgICAgICAgICAgIG12eVs4XTsKKyAgICBpbnQgICAgICAgICAgICAgIGk7CisKKyAgICBtdi5hc19pbnQgPSAwOworCisgICAgaWYoaGVyZS0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgeworICAgICAgICBuZWFyX212c1swXS5hc19pbnQgPSBuZWFyX212c1sxXS5hc19pbnQgPSBuZWFyX212c1syXS5hc19pbnQgPSBuZWFyX212c1szXS5hc19pbnQgPSBuZWFyX212c1s0XS5hc19pbnQgPSBuZWFyX212c1s1XS5hc19pbnQgPSBuZWFyX212c1s2XS5hc19pbnQgPSBuZWFyX212c1s3XS5hc19pbnQgPSAwOworICAgICAgICBuZWFyX3JlZlswXSA9IG5lYXJfcmVmWzFdID0gbmVhcl9yZWZbMl0gPSBuZWFyX3JlZlszXSA9IG5lYXJfcmVmWzRdID0gbmVhcl9yZWZbNV0gPSBuZWFyX3JlZls2XSA9IG5lYXJfcmVmWzddID0gMDsKKworICAgICAgICAvKiByZWFkIGluIDMgbmVhcmJ5IGJsb2NrJ3MgTVZzIGZyb20gY3VycmVudCBmcmFtZSBhcyBwcmVkaWN0aW9uCisgICAgICAgICAqIGNhbmRpZGF0ZXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoYWJvdmUtPm1ibWkucmVmX2ZyYW1lICE9IElOVFJBX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBuZWFyX212c1t2Y250XS5hc19pbnQgPSBhYm92ZS0+bWJtaS5tdi5hc19pbnQ7CisgICAgICAgICAgICBtdl9iaWFzKHJlZl9mcmFtZV9zaWduX2JpYXNbYWJvdmUtPm1ibWkucmVmX2ZyYW1lXSwgcmVmZnJhbWUsICZuZWFyX212c1t2Y250XSwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisgICAgICAgICAgICBuZWFyX3JlZlt2Y250XSA9ICBhYm92ZS0+bWJtaS5yZWZfZnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgdmNudCsrOworICAgICAgICBpZiAobGVmdC0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lYXJfbXZzW3ZjbnRdLmFzX2ludCA9IGxlZnQtPm1ibWkubXYuYXNfaW50OworICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2xlZnQtPm1ibWkucmVmX2ZyYW1lXSwgcmVmZnJhbWUsICZuZWFyX212c1t2Y250XSwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisgICAgICAgICAgICBuZWFyX3JlZlt2Y250XSA9ICBsZWZ0LT5tYm1pLnJlZl9mcmFtZTsKKyAgICAgICAgfQorICAgICAgICB2Y250Kys7CisgICAgICAgIGlmIChhYm92ZWxlZnQtPm1ibWkucmVmX2ZyYW1lICE9IElOVFJBX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBuZWFyX212c1t2Y250XS5hc19pbnQgPSBhYm92ZWxlZnQtPm1ibWkubXYuYXNfaW50OworICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2Fib3ZlbGVmdC0+bWJtaS5yZWZfZnJhbWVdLCByZWZmcmFtZSwgJm5lYXJfbXZzW3ZjbnRdLCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKKyAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGFib3ZlbGVmdC0+bWJtaS5yZWZfZnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgdmNudCsrOworCisgICAgICAgIC8qIHJlYWQgaW4gNSBuZWFyYnkgYmxvY2sncyBNVnMgZnJvbSBsYXN0IGZyYW1lLiAqLworICAgICAgICBpZihjcGktPmNvbW1vbi5sYXN0X2ZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBtYl9vZmZzZXQgPSAoLXhkLT5tYl90b190b3BfZWRnZS8xMjggKyAxKSAqICh4ZC0+bW9kZV9pbmZvX3N0cmlkZSArMSkgKyAoLXhkLT5tYl90b19sZWZ0X2VkZ2UvMTI4ICsxKSA7CisKKyAgICAgICAgICAgIC8qIGN1cnJlbnQgaW4gbGFzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldF0gIT0gSU5UUkFfRlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmVhcl9tdnNbdmNudF0uYXNfaW50ID0gY3BpLT5sZm12W21iX29mZnNldF0uYXNfaW50OworICAgICAgICAgICAgICAgIG12X2JpYXMoY3BpLT5sZl9yZWZfZnJhbWVfc2lnbl9iaWFzW21iX29mZnNldF0sIHJlZmZyYW1lLCAmbmVhcl9tdnNbdmNudF0sIHJlZl9mcmFtZV9zaWduX2JpYXMpOworICAgICAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2Y250Kys7CisKKyAgICAgICAgICAgIC8qIGFib3ZlIGluIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChjcGktPmxmX3JlZl9mcmFtZVttYl9vZmZzZXQgLSB4ZC0+bW9kZV9pbmZvX3N0cmlkZS0xXSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZWFyX212c1t2Y250XS5hc19pbnQgPSBjcGktPmxmbXZbbWJfb2Zmc2V0IC0geGQtPm1vZGVfaW5mb19zdHJpZGUtMV0uYXNfaW50OworICAgICAgICAgICAgICAgIG12X2JpYXMoY3BpLT5sZl9yZWZfZnJhbWVfc2lnbl9iaWFzW21iX29mZnNldCAtIHhkLT5tb2RlX2luZm9fc3RyaWRlLTFdLCByZWZmcmFtZSwgJm5lYXJfbXZzW3ZjbnRdLCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKKyAgICAgICAgICAgICAgICBuZWFyX3JlZlt2Y250XSA9ICBjcGktPmxmX3JlZl9mcmFtZVttYl9vZmZzZXQgLSB4ZC0+bW9kZV9pbmZvX3N0cmlkZS0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZjbnQrKzsKKworICAgICAgICAgICAgLyogbGVmdCBpbiBsYXN0IGZyYW1lICovCisgICAgICAgICAgICBpZiAoY3BpLT5sZl9yZWZfZnJhbWVbbWJfb2Zmc2V0LTFdICE9IElOVFJBX0ZSQU1FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5lYXJfbXZzW3ZjbnRdLmFzX2ludCA9IGNwaS0+bGZtdlttYl9vZmZzZXQgLTFdLmFzX2ludDsKKyAgICAgICAgICAgICAgICBtdl9iaWFzKGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhc1ttYl9vZmZzZXQgLTFdLCByZWZmcmFtZSwgJm5lYXJfbXZzW3ZjbnRdLCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKKyAgICAgICAgICAgICAgICBuZWFyX3JlZlt2Y250XSA9ICBjcGktPmxmX3JlZl9mcmFtZVttYl9vZmZzZXQgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZjbnQrKzsKKworICAgICAgICAgICAgLyogcmlnaHQgaW4gbGFzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCArMV0gIT0gSU5UUkFfRlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmVhcl9tdnNbdmNudF0uYXNfaW50ID0gY3BpLT5sZm12W21iX29mZnNldCArMV0uYXNfaW50OworICAgICAgICAgICAgICAgIG12X2JpYXMoY3BpLT5sZl9yZWZfZnJhbWVfc2lnbl9iaWFzW21iX29mZnNldCArMV0sIHJlZmZyYW1lLCAmbmVhcl9tdnNbdmNudF0sIHJlZl9mcmFtZV9zaWduX2JpYXMpOworICAgICAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCArMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2Y250Kys7CisKKyAgICAgICAgICAgIC8qIGJlbG93IGluIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChjcGktPmxmX3JlZl9mcmFtZVttYl9vZmZzZXQgKyB4ZC0+bW9kZV9pbmZvX3N0cmlkZSArMV0gIT0gSU5UUkFfRlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmVhcl9tdnNbdmNudF0uYXNfaW50ID0gY3BpLT5sZm12W21iX29mZnNldCArIHhkLT5tb2RlX2luZm9fc3RyaWRlICsxXS5hc19pbnQ7CisgICAgICAgICAgICAgICAgbXZfYmlhcyhjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXNbbWJfb2Zmc2V0ICsgeGQtPm1vZGVfaW5mb19zdHJpZGUgKzFdLCByZWZmcmFtZSwgJm5lYXJfbXZzW3ZjbnRdLCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKKyAgICAgICAgICAgICAgICBuZWFyX3JlZlt2Y250XSA9ICBjcGktPmxmX3JlZl9mcmFtZVttYl9vZmZzZXQgKyB4ZC0+bW9kZV9pbmZvX3N0cmlkZSArMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2Y250Kys7CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBpPCB2Y250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG5lYXJfcmVmW25lYXJfc2FkaWR4W2ldXSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihoZXJlLT5tYm1pLnJlZl9mcmFtZSA9PSBuZWFyX3JlZltuZWFyX3NhZGlkeFtpXV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtdi5hc19pbnQgPSBuZWFyX212c1tuZWFyX3NhZGlkeFtpXV0uYXNfaW50OworICAgICAgICAgICAgICAgICAgICBmaW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgKnNyID0gMzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnNyID0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIWZpbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8dmNudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG12eFtpXSA9IG5lYXJfbXZzW2ldLmFzX212LnJvdzsKKyAgICAgICAgICAgICAgICBtdnlbaV0gPSBuZWFyX212c1tpXS5hc19tdi5jb2w7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluc2VydHNvcnRtdihtdngsIHZjbnQpOworICAgICAgICAgICAgaW5zZXJ0c29ydG12KG12eSwgdmNudCk7CisgICAgICAgICAgICBtdi5hc19tdi5yb3cgPSBtdnhbdmNudC8yXTsKKyAgICAgICAgICAgIG12LmFzX212LmNvbCA9IG12eVt2Y250LzJdOworCisgICAgICAgICAgICBmaW5kID0gMTsKKyAgICAgICAgICAgIC8qIHNyIGlzIHNldCB0byAwIHRvIGFsbG93IGNhbGxpbmcgZnVuY3Rpb24gdG8gZGVjaWRlIHRoZSBzZWFyY2gKKyAgICAgICAgICAgICAqIHJhbmdlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqc3IgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIHJldHVybiB2YWx1ZXMgKi8KKyAgICBtdnAtPmFzX2ludCA9IG12LmFzX2ludDsKKyAgICB2cDhfY2xhbXBfbXYyKG12cCwgeGQpOworfQorCit2b2lkIHZwOF9jYWxfc2FkKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0tEICp4ZCwgTUFDUk9CTE9DSyAqeCwgaW50IHJlY29uX3lvZmZzZXQsIGludCBuZWFyX3NhZGlkeFtdKQoreworICAgIC8qIG5lYXJfc2FkIGluZGV4ZXM6CisgICAgICogICAwLWNmIGFib3ZlLCAxLWNmIGxlZnQsIDItY2YgYWJvdmVsZWZ0LAorICAgICAqICAgMy1sZiBjdXJyZW50LCA0LWxmIGFib3ZlLCA1LWxmIGxlZnQsIDYtbGYgcmlnaHQsIDctbGYgYmVsb3cKKyAgICAgKi8KKyAgICBpbnQgbmVhcl9zYWRbOF0gPSB7MH07CisgICAgQkxPQ0sgKmIgPSAmeC0+YmxvY2tbMF07CisgICAgdW5zaWduZWQgY2hhciAqc3JjX3lfcHRyID0gKihiLT5iYXNlX3NyYyk7CisKKyAgICAvKiBjYWxjdWxhdGUgc2FkIGZvciBjdXJyZW50IGZyYW1lIDMgbmVhcmJ5IE1Ccy4gKi8KKyAgICBpZiggeGQtPm1iX3RvX3RvcF9lZGdlPT0wICYmIHhkLT5tYl90b19sZWZ0X2VkZ2UgPT0wKQorICAgIHsKKyAgICAgICAgbmVhcl9zYWRbMF0gPSBuZWFyX3NhZFsxXSA9IG5lYXJfc2FkWzJdID0gSU5UX01BWDsKKyAgICB9ZWxzZSBpZih4ZC0+bWJfdG9fdG9wX2VkZ2U9PTApCisgICAgeyAgIC8qIG9ubHkgaGFzIGxlZnQgTUIgZm9yIHNhZCBjYWxjdWxhdGlvbi4gKi8KKyAgICAgICAgbmVhcl9zYWRbMF0gPSBuZWFyX3NhZFsyXSA9IElOVF9NQVg7CisgICAgICAgIG5lYXJfc2FkWzFdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZihzcmNfeV9wdHIsIGItPnNyY19zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSAxNix4ZC0+ZHN0Lnlfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgfWVsc2UgaWYoeGQtPm1iX3RvX2xlZnRfZWRnZSA9PTApCisgICAgeyAgIC8qIG9ubHkgaGFzIGxlZnQgTUIgZm9yIHNhZCBjYWxjdWxhdGlvbi4gKi8KKyAgICAgICAgbmVhcl9zYWRbMV0gPSBuZWFyX3NhZFsyXSA9IElOVF9NQVg7CisgICAgICAgIG5lYXJfc2FkWzBdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZihzcmNfeV9wdHIsIGItPnNyY19zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICoxNix4ZC0+ZHN0Lnlfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgfWVsc2UKKyAgICB7CisgICAgICAgIG5lYXJfc2FkWzBdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZihzcmNfeV9wdHIsIGItPnNyY19zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICoxNix4ZC0+ZHN0Lnlfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgICAgIG5lYXJfc2FkWzFdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZihzcmNfeV9wdHIsIGItPnNyY19zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSAxNix4ZC0+ZHN0Lnlfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgICAgIG5lYXJfc2FkWzJdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZihzcmNfeV9wdHIsIGItPnNyY19zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICoxNiAtMTYseGQtPmRzdC55X3N0cmlkZSwgVUlOVF9NQVgpOworICAgIH0KKworICAgIGlmKGNwaS0+Y29tbW9uLmxhc3RfZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisgICAgeworICAgICAgICAvKiBjYWxjdWxhdGUgc2FkIGZvciBsYXN0IGZyYW1lIDUgbmVhcmJ5IE1Ccy4gKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAqcHJlX3lfYnVmZmVyID0gY3BpLT5jb21tb24ueXYxMl9mYltjcGktPmNvbW1vbi5sc3RfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7CisgICAgICAgIGludCBwcmVfeV9zdHJpZGUgPSBjcGktPmNvbW1vbi55djEyX2ZiW2NwaS0+Y29tbW9uLmxzdF9mYl9pZHhdLnlfc3RyaWRlOworCisgICAgICAgIGlmKHhkLT5tYl90b190b3BfZWRnZT09MCkgbmVhcl9zYWRbNF0gPSBJTlRfTUFYOworICAgICAgICBpZih4ZC0+bWJfdG9fbGVmdF9lZGdlID09MCkgbmVhcl9zYWRbNV0gPSBJTlRfTUFYOworICAgICAgICBpZih4ZC0+bWJfdG9fcmlnaHRfZWRnZSA9PTApIG5lYXJfc2FkWzZdID0gSU5UX01BWDsKKyAgICAgICAgaWYoeGQtPm1iX3RvX2JvdHRvbV9lZGdlPT0wKSBuZWFyX3NhZFs3XSA9IElOVF9NQVg7CisKKyAgICAgICAgaWYobmVhcl9zYWRbNF0gIT0gSU5UX01BWCkKKyAgICAgICAgICAgIG5lYXJfc2FkWzRdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZihzcmNfeV9wdHIsIGItPnNyY19zdHJpZGUsIHByZV95X2J1ZmZlciAtIHByZV95X3N0cmlkZSAqMTYsIHByZV95X3N0cmlkZSwgVUlOVF9NQVgpOworICAgICAgICBpZihuZWFyX3NhZFs1XSAhPSBJTlRfTUFYKQorICAgICAgICAgICAgbmVhcl9zYWRbNV0gPSBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc2RmKHNyY195X3B0ciwgYi0+c3JjX3N0cmlkZSwgcHJlX3lfYnVmZmVyIC0gMTYsIHByZV95X3N0cmlkZSwgVUlOVF9NQVgpOworICAgICAgICBuZWFyX3NhZFszXSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoc3JjX3lfcHRyLCBiLT5zcmNfc3RyaWRlLCBwcmVfeV9idWZmZXIsIHByZV95X3N0cmlkZSwgVUlOVF9NQVgpOworICAgICAgICBpZihuZWFyX3NhZFs2XSAhPSBJTlRfTUFYKQorICAgICAgICAgICAgbmVhcl9zYWRbNl0gPSBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc2RmKHNyY195X3B0ciwgYi0+c3JjX3N0cmlkZSwgcHJlX3lfYnVmZmVyICsgMTYsIHByZV95X3N0cmlkZSwgVUlOVF9NQVgpOworICAgICAgICBpZihuZWFyX3NhZFs3XSAhPSBJTlRfTUFYKQorICAgICAgICAgICAgbmVhcl9zYWRbN10gPSBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc2RmKHNyY195X3B0ciwgYi0+c3JjX3N0cmlkZSwgcHJlX3lfYnVmZmVyICsgcHJlX3lfc3RyaWRlICoxNiwgcHJlX3lfc3RyaWRlLCBVSU5UX01BWCk7CisgICAgfQorCisgICAgaWYoY3BpLT5jb21tb24ubGFzdF9mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKyAgICB7CisgICAgICAgIGluc2VydHNvcnRzYWQobmVhcl9zYWQsIG5lYXJfc2FkaWR4LCA4KTsKKyAgICB9ZWxzZQorICAgIHsKKyAgICAgICAgaW5zZXJ0c29ydHNhZChuZWFyX3NhZCwgbmVhcl9zYWRpZHgsIDMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmRfdXBkYXRlX212Y291bnQoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50X212ICpiZXN0X3JlZl9tdikKK3sKKyAgICBpZiAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBTUExJVE1WKQorICAgIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHgtPnBhcnRpdGlvbl9pbmZvLT5jb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeC0+cGFydGl0aW9uX2luZm8tPmJtaVtpXS5tb2RlID09IE5FVzRYNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4LT5NVmNvdW50WzBdW212X21heCsoKHgtPnBhcnRpdGlvbl9pbmZvLT5ibWlbaV0ubXYuYXNfbXYucm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJlc3RfcmVmX212LT5hc19tdi5yb3cpID4+IDEpXSsrOworICAgICAgICAgICAgICAgIHgtPk1WY291bnRbMV1bbXZfbWF4KygoeC0+cGFydGl0aW9uX2luZm8tPmJtaVtpXS5tdi5hc19tdi5jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYmVzdF9yZWZfbXYtPmFzX212LmNvbCkgPj4gMSldKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBORVdNVikKKyAgICB7CisgICAgICAgIHgtPk1WY291bnRbMF1bbXZfbWF4KygoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYucm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJlc3RfcmVmX212LT5hc19tdi5yb3cpID4+IDEpXSsrOworICAgICAgICB4LT5NVmNvdW50WzFdW212X21heCsoKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LmNvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiZXN0X3JlZl9tdi0+YXNfbXYuY29sKSA+PiAxKV0rKzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZXZhbHVhdGVfaW50ZXJfbW9kZV9yZChpbnQgbWRjb3VudHNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFURV9ESVNUT1JUSU9OKiByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRpc2FibGVfc2tpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KQoreworICAgIE1CX1BSRURJQ1RJT05fTU9ERSB0aGlzX21vZGUgPSB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlOworICAgIEJMT0NLICpiID0gJngtPmJsb2NrWzBdOworICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKKyAgICBpbnQgZGlzdG9ydGlvbjsKKyAgICB2cDhfYnVpbGRfaW50ZXIxNngxNl9wcmVkaWN0b3JzX21ieSgmeC0+ZV9tYmQsIHgtPmVfbWJkLnByZWRpY3RvciwgMTYpOworCisgICAgaWYgKGNwaS0+YWN0aXZlX21hcF9lbmFibGVkICYmIHgtPmFjdGl2ZV9wdHJbMF0gPT0gMCkgeworICAgICAgICB4LT5za2lwID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoeC0+ZW5jb2RlX2JyZWFrb3V0KQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHNzZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHZhcjsKKyAgICAgICAgdW5zaWduZWQgaW50IHRocmVzaG9sZCA9ICh4ZC0+YmxvY2tbMF0uZGVxdWFudFsxXQorICAgICAgICAgICAgICAgICAgICAqIHhkLT5ibG9ja1swXS5kZXF1YW50WzFdID4+NCk7CisKKyAgICAgICAgaWYodGhyZXNob2xkIDwgeC0+ZW5jb2RlX2JyZWFrb3V0KQorICAgICAgICAgICAgdGhyZXNob2xkID0geC0+ZW5jb2RlX2JyZWFrb3V0OworCisgICAgICAgIHZhciA9IHZwOF92YXJpYW5jZTE2eDE2CisgICAgICAgICAgICAgICAgKCooYi0+YmFzZV9zcmMpLCBiLT5zcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgIHgtPmVfbWJkLnByZWRpY3RvciwgMTYsICZzc2UpOworCisgICAgICAgIGlmIChzc2UgPCB0aHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcTJkYyA9IHhkLT5ibG9ja1syNF0uZGVxdWFudFswXTsKKyAgICAgICAgICAgIC8qIElmIHRoZXJlcyBpcyBubyBjb2RlYWJsZSAybmQgb3JkZXIgZGMKKyAgICAgICAgICAgICAgIG9yIGEgdmVyeSBzbWFsbCB1bmlmb3JtIHBpeGVsIGNoYW5nZSBjaGFuZ2UgKi8KKyAgICAgICAgICAgIGlmICgoc3NlIC0gdmFyIDwgcTJkYyAqIHEyZGMgPj40KSB8fAorICAgICAgICAgICAgICAgIChzc2UgLzIgPiB2YXIgJiYgc3NlLXZhciA8IDY0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDaGVjayB1IGFuZCB2IHRvIG1ha2Ugc3VyZSBza2lwIGlzIG9rICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNzZTIgPSBWUDhfVVZTU0UoeCk7CisgICAgICAgICAgICAgICAgaWYgKHNzZTIgKiAyIDwgdGhyZXNob2xkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeC0+c2tpcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJkLT5kaXN0b3J0aW9uMiA9IHNzZSArIHNzZTI7CisgICAgICAgICAgICAgICAgICAgIHJkLT5yYXRlMiA9IDUwMDsKKworICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYmVzdF95cmQgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcmQtPnJhdGVfdXYgPSAwOworICAgICAgICAgICAgICAgICAgICByZC0+ZGlzdG9ydGlvbl91diA9IHNzZTI7CisKKyAgICAgICAgICAgICAgICAgICAgKmRpc2FibGVfc2tpcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmQtPnJhdGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkLT5kaXN0b3J0aW9uMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBBZGQgaW4gdGhlIE12L21vZGUgY29zdCAqLworICAgIHJkLT5yYXRlMiArPSB2cDhfY29zdF9tdl9yZWYodGhpc19tb2RlLCBtZGNvdW50cyk7CisKKyAgICAvKiBZIGNvc3QgYW5kIGRpc3RvcnRpb24gKi8KKyAgICBtYWNyb19ibG9ja195cmQoeCwgJnJkLT5yYXRlX3ksICZkaXN0b3J0aW9uKTsKKyAgICByZC0+cmF0ZTIgKz0gcmQtPnJhdGVfeTsKKyAgICByZC0+ZGlzdG9ydGlvbjIgKz0gZGlzdG9ydGlvbjsKKworICAgIC8qIFVWIGNvc3QgYW5kIGRpc3RvcnRpb24gKi8KKyAgICByZF9pbnRlcjE2eDE2X3V2KGNwaSwgeCwgJnJkLT5yYXRlX3V2LCAmcmQtPmRpc3RvcnRpb25fdXYsCisgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5mdWxsX3BpeGVsKTsKKyAgICByZC0+cmF0ZTIgKz0gcmQtPnJhdGVfdXY7CisgICAgcmQtPmRpc3RvcnRpb24yICs9IHJkLT5kaXN0b3J0aW9uX3V2OworICAgIHJldHVybiBJTlRfTUFYOworfQorCitzdGF0aWMgaW50IGNhbGN1bGF0ZV9maW5hbF9yZF9jb3N0cyhpbnQgdGhpc19yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVEVfRElTVE9SVElPTiogcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG90aGVyX2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzYWJsZV9za2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2X2ludHJhX3R0ZW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludHJhX3JkX3BlbmFsdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KQoreworICAgIE1CX1BSRURJQ1RJT05fTU9ERSB0aGlzX21vZGUgPSB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlOworCisgICAgLyogV2hlcmUgc2tpcCBpcyBhbGxvd2FibGUgYWRkIGluIHRoZSBkZWZhdWx0IHBlciBtYiBjb3N0IGZvciB0aGUgbm8KKyAgICAgKiBza2lwIGNhc2UuIHdoZXJlIHdlIHRoZW4gZGVjaWRlIHRvIHNraXAgd2UgaGF2ZSB0byBkZWxldGUgdGhpcyBhbmQKKyAgICAgKiByZXBsYWNlIGl0IHdpdGggdGhlIGNvc3Qgb2Ygc2lnbmFsbGluZyBhIHNraXAKKyAgICAgKi8KKyAgICBpZiAoY3BpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCkKKyAgICB7CisgICAgICAgICpvdGhlcl9jb3N0ICs9IHZwOF9jb3N0X2JpdChjcGktPnByb2Jfc2tpcF9mYWxzZSwgMCk7CisgICAgICAgIHJkLT5yYXRlMiArPSAqb3RoZXJfY29zdDsKKyAgICB9CisKKyAgICAvKiBFc3RpbWF0ZSB0aGUgcmVmZXJlbmNlIGZyYW1lIHNpZ25hbGluZyBjb3N0IGFuZCBhZGQgaXQKKyAgICAgKiB0byB0aGUgcm9sbGluZyBjb3N0IHZhcmlhYmxlLgorICAgICAqLworICAgIHJkLT5yYXRlMiArPQorICAgICAgICB4LT5yZWZfZnJhbWVfY29zdFt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOworCisgICAgaWYgKCFkaXNhYmxlX3NraXApCisgICAgeworICAgICAgICAvKiBUZXN0IGZvciB0aGUgY29uZGl0aW9uIHdoZXJlIHNraXAgYmxvY2sgd2lsbCBiZSBhY3RpdmF0ZWQKKyAgICAgICAgICogYmVjYXVzZSB0aGVyZSBhcmUgbm8gbm9uIHplcm8gY29lZmZpY2llbnRzIGFuZCBtYWtlIGFueQorICAgICAgICAgKiBuZWNlc3NhcnkgYWRqdXN0bWVudCBmb3IgcmF0ZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IHR0ZW9iOworICAgICAgICAgICAgaW50IGhhc195Ml9ibG9jayA9ICh0aGlzX21vZGUhPVNQTElUTVYgJiYgdGhpc19tb2RlIT1CX1BSRUQpOworCisgICAgICAgICAgICB0dGVvYiA9IDA7CisgICAgICAgICAgICBpZihoYXNfeTJfYmxvY2spCisgICAgICAgICAgICAgICAgdHRlb2IgKz0geC0+ZV9tYmQuZW9ic1syNF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgICAgIHR0ZW9iICs9ICh4LT5lX21iZC5lb2JzW2ldID4gaGFzX3kyX2Jsb2NrKTsKKworICAgICAgICAgICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHR0ZW9iICs9IHgtPmVfbWJkLmVvYnNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHRlb2IgKz0gdXZfaW50cmFfdHRlb2I7CisKKyAgICAgICAgICAgIGlmICh0dGVvYiA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJkLT5yYXRlMiAtPSAocmQtPnJhdGVfeSArIHJkLT5yYXRlX3V2KTsKKyAgICAgICAgICAgICAgICAvKiBmb3IgYmVzdF95cmQgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgICByZC0+cmF0ZV91diA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBCYWNrIG91dCBubyBza2lwIGZsYWcgY29zdGluZyBhbmQgYWRkIGluIHNraXAgZmxhZyBjb3N0aW5nICovCisgICAgICAgICAgICAgICAgaWYgKGNwaS0+cHJvYl9za2lwX2ZhbHNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByb2Jfc2tpcF9jb3N0OworCisgICAgICAgICAgICAgICAgICAgIHByb2Jfc2tpcF9jb3N0ID0gdnA4X2Nvc3RfYml0KGNwaS0+cHJvYl9za2lwX2ZhbHNlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvYl9za2lwX2Nvc3QgLT0gdnA4X2Nvc3RfYml0KGNwaS0+cHJvYl9za2lwX2ZhbHNlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmQtPnJhdGUyICs9IHByb2Jfc2tpcF9jb3N0OworICAgICAgICAgICAgICAgICAgICAqb3RoZXJfY29zdCArPSBwcm9iX3NraXBfY29zdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBSRCBlc3RpbWF0ZSBmb3IgdGhpcyBtb2RlICovCisgICAgICAgIHRoaXNfcmQgPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmQtPnJhdGUyLCByZC0+ZGlzdG9ydGlvbjIpOworICAgICAgICBpZiAodGhpc19yZCA8IElOVF9NQVggJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBJTlRSQV9GUkFNRSkKKyAgICAgICAgICAgIHRoaXNfcmQgKz0gaW50cmFfcmRfcGVuYWx0eTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXNfcmQ7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9iZXN0X21vZGUoQkVTVF9NT0RFKiBiZXN0X21vZGUsIGludCB0aGlzX3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVRFX0RJU1RPUlRJT04qIHJkLCBpbnQgb3RoZXJfY29zdCwgTUFDUk9CTE9DSyAqeCkKK3sKKyAgICBNQl9QUkVESUNUSU9OX01PREUgdGhpc19tb2RlID0geC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZTsKKworICAgIG90aGVyX2Nvc3QgKz0KKyAgICB4LT5yZWZfZnJhbWVfY29zdFt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCB5IFJEIGVzdGltYXRlIGZvciB0aGlzIG1vZGUgKi8KKyAgICBiZXN0X21vZGUtPnlyZCA9IFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCAocmQtPnJhdGUyLXJkLT5yYXRlX3V2LW90aGVyX2Nvc3QpLAorICAgICAgICAgICAgICAgICAgICAgIChyZC0+ZGlzdG9ydGlvbjItcmQtPmRpc3RvcnRpb25fdXYpKTsKKworICAgIGJlc3RfbW9kZS0+cmQgPSB0aGlzX3JkOworICAgIHZweF9tZW1jcHkoJmJlc3RfbW9kZS0+bWJtb2RlLCAmeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWksIHNpemVvZihNQl9NT0RFX0lORk8pKTsKKyAgICB2cHhfbWVtY3B5KCZiZXN0X21vZGUtPnBhcnRpdGlvbiwgeC0+cGFydGl0aW9uX2luZm8sIHNpemVvZihQQVJUSVRJT05fSU5GTykpOworCisgICAgaWYgKCh0aGlzX21vZGUgPT0gQl9QUkVEKSB8fCAodGhpc19tb2RlID09IFNQTElUTVYpKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0X21vZGUtPmJtb2Rlc1tpXSA9IHgtPmVfbWJkLmJsb2NrW2ldLmJtaTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2cDhfcmRfcGlja19pbnRlcl9tb2RlKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCByZWNvbl95b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNvbl91dm9mZnNldCwgaW50ICpyZXR1cm5yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmV0dXJuZGlzdG9ydGlvbiwgaW50ICpyZXR1cm5pbnRyYSkKK3sKKyAgICBCTE9DSyAqYiA9ICZ4LT5ibG9ja1swXTsKKyAgICBCTE9DS0QgKmQgPSAmeC0+ZV9tYmQuYmxvY2tbMF07CisgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOworICAgIGludF9tdiBiZXN0X3JlZl9tdl9zYlsyXTsKKyAgICBpbnRfbXYgbW9kZV9tdl9zYlsyXVtNQl9NT0RFX0NPVU5UXTsKKyAgICBpbnRfbXYgYmVzdF9yZWZfbXY7CisgICAgaW50X212ICptb2RlX212OworICAgIE1CX1BSRURJQ1RJT05fTU9ERSB0aGlzX21vZGU7CisgICAgaW50IG51bTAwOworICAgIGludCBiZXN0X21vZGVfaW5kZXggPSAwOworICAgIEJFU1RfTU9ERSBiZXN0X21vZGU7CisKKyAgICBpbnQgaTsKKyAgICBpbnQgbW9kZV9pbmRleDsKKyAgICBpbnQgbWRjb3VudHNbNF07CisgICAgaW50IHJhdGU7CisgICAgUkFURV9ESVNUT1JUSU9OIHJkOworICAgIGludCB1dl9pbnRyYV9yYXRlLCB1dl9pbnRyYV9kaXN0b3J0aW9uLCB1dl9pbnRyYV9yYXRlX3Rva2Vub25seTsKKyAgICBpbnQgdXZfaW50cmFfdHRlb2IgPSAwOworICAgIGludCB1dl9pbnRyYV9kb25lID0gMDsKKworICAgIE1CX1BSRURJQ1RJT05fTU9ERSB1dl9pbnRyYV9tb2RlID0gMDsKKyAgICBpbnRfbXYgbXZwOworICAgIGludCBuZWFyX3NhZGlkeFs4XSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKKyAgICBpbnQgc2FkZG9uZT0wOworICAgIC8qIHNlYXJjaCByYW5nZSBnb3QgZnJvbSBtdl9wcmVkKCkuIEl0IHVzZXMgc3RlcF9wYXJhbSBsZXZlbHMuICgwLTcpICovCisgICAgaW50IHNyPTA7CisKKyAgICB1bnNpZ25lZCBjaGFyICpwbGFuZVs0XVszXTsKKyAgICBpbnQgcmVmX2ZyYW1lX21hcFs0XTsKKyAgICBpbnQgc2lnbl9iaWFzID0gMDsKKworICAgIGludCBpbnRyYV9yZF9wZW5hbHR5ID0gIDEwKiB2cDhfZGNfcXVhbnQoY3BpLT5jb21tb24uYmFzZV9xaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi55MWRjX2RlbHRhX3EpOworCisjaWYgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORworICAgIHVuc2lnbmVkIGludCB6ZXJvX212X3NzZSA9IElOVF9NQVgsIGJlc3Rfc3NlID0gSU5UX01BWCwKKyAgICAgICAgICAgIGJlc3RfcmRfc3NlID0gSU5UX01BWDsKKyNlbmRpZgorCisgICAgbW9kZV9tdiA9IG1vZGVfbXZfc2Jbc2lnbl9iaWFzXTsKKyAgICBiZXN0X3JlZl9tdi5hc19pbnQgPSAwOworICAgIGJlc3RfbW9kZS5yZCA9IElOVF9NQVg7CisgICAgYmVzdF9tb2RlLnlyZCA9IElOVF9NQVg7CisgICAgYmVzdF9tb2RlLmludHJhX3JkID0gSU5UX01BWDsKKyAgICB2cHhfbWVtc2V0KG1vZGVfbXZfc2IsIDAsIHNpemVvZihtb2RlX212X3NiKSk7CisgICAgdnB4X21lbXNldCgmYmVzdF9tb2RlLm1ibW9kZSwgMCwgc2l6ZW9mKGJlc3RfbW9kZS5tYm1vZGUpKTsKKyAgICB2cHhfbWVtc2V0KCZiZXN0X21vZGUuYm1vZGVzLCAwLCBzaXplb2YoYmVzdF9tb2RlLmJtb2RlcykpOworCisgICAgLyogU2V0dXAgc2VhcmNoIHByaW9yaXRpZXMgKi8KKyAgICBnZXRfcmVmZXJlbmNlX3NlYXJjaF9vcmRlcihjcGksIHJlZl9mcmFtZV9tYXApOworCisgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgdmFsaWQgcmVmZXJlbmNlIGZyYW1lIHRoYXQgd2UgbmVlZAorICAgICAqIHRvIGNhbGN1bGF0ZSBuZWFyX212cy4KKyAgICAgKi8KKyAgICBpZiAocmVmX2ZyYW1lX21hcFsxXSA+IDApCisgICAgeworICAgICAgICBzaWduX2JpYXMgPSB2cDhfZmluZF9uZWFyX212c19iaWFzKCZ4LT5lX21iZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212X3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVmX212X3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9mcmFtZV9tYXBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7CisKKyAgICAgICAgbW9kZV9tdiA9IG1vZGVfbXZfc2Jbc2lnbl9iaWFzXTsKKyAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gYmVzdF9yZWZfbXZfc2Jbc2lnbl9iaWFzXS5hc19pbnQ7CisgICAgfQorCisgICAgZ2V0X3ByZWRpY3Rvcl9wb2ludGVycyhjcGksIHBsYW5lLCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCk7CisKKyAgICAqcmV0dXJuaW50cmEgPSBJTlRfTUFYOworICAgIC8qIENvdW50IG9mIHRoZSBudW1iZXIgb2YgTUJzIHRlc3RlZCBzbyBmYXIgdGhpcyBmcmFtZSAqLworICAgIGNwaS0+bWJzX3Rlc3RlZF9zb19mYXIrKzsKKworICAgIHgtPnNraXAgPSAwOworCisgICAgZm9yIChtb2RlX2luZGV4ID0gMDsgbW9kZV9pbmRleCA8IE1BWF9NT0RFUzsgbW9kZV9pbmRleCsrKQorICAgIHsKKyAgICAgICAgaW50IHRoaXNfcmQgPSBJTlRfTUFYOworICAgICAgICBpbnQgZGlzYWJsZV9za2lwID0gMDsKKyAgICAgICAgaW50IG90aGVyX2Nvc3QgPSAwOworICAgICAgICBpbnQgdGhpc19yZWZfZnJhbWUgPSByZWZfZnJhbWVfbWFwW3ZwOF9yZWZfZnJhbWVfb3JkZXJbbW9kZV9pbmRleF1dOworCisgICAgICAgIC8qIFRlc3QgYmVzdCByZCBzbyBmYXIgYWdhaW5zdCB0aHJlc2hvbGQgZm9yIHRyeWluZyB0aGlzIG1vZGUuICovCisgICAgICAgIGlmIChiZXN0X21vZGUucmQgPD0gY3BpLT5yZF90aHJlc2hlc1ttb2RlX2luZGV4XSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICh0aGlzX3JlZl9mcmFtZSA8IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBUaGVzZSB2YXJpYWJsZXMgaG9sZCBhcmUgcm9sbGluZyB0b3RhbCBjb3N0IGFuZCBkaXN0b3J0aW9uIGZvcgorICAgICAgICAgKiB0aGlzIG1vZGUKKyAgICAgICAgICovCisgICAgICAgIHJkLnJhdGUyID0gMDsKKyAgICAgICAgcmQuZGlzdG9ydGlvbjIgPSAwOworCisgICAgICAgIHRoaXNfbW9kZSA9IHZwOF9tb2RlX29yZGVyW21vZGVfaW5kZXhdOworCisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSB0aGlzX21vZGU7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IHRoaXNfcmVmX2ZyYW1lOworCisgICAgICAgIC8qIE9ubHkgY29uc2lkZXIgWkVST01WL0FMVFJFRl9GUkFNRSBmb3IgYWx0IHJlZiBmcmFtZSwKKyAgICAgICAgICogdW5sZXNzIEFSTlIgZmlsdGVyaW5nIGlzIGVuYWJsZWQgaW4gd2hpY2ggY2FzZSB3ZSB3YW50CisgICAgICAgICAqIGFuIHVuZmlsdGVyZWQgYWx0ZXJuYXRpdmUKKyAgICAgICAgICovCisgICAgICAgIGlmIChjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmICYmIChjcGktPm94Y2YuYXJucl9tYXhfZnJhbWVzID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpc19tb2RlICE9IFpFUk9NViB8fCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgIT0gQUxUUkVGX0ZSQU1FKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogZXZlcnl0aGluZyBidXQgaW50cmEgKi8KKyAgICAgICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnlfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzBdOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnVfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzFdOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnZfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzJdOworCisgICAgICAgICAgICBpZiAoc2lnbl9iaWFzICE9IGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbdGhpc19yZWZfZnJhbWVdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpZ25fYmlhcyA9IGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbdGhpc19yZWZfZnJhbWVdOworICAgICAgICAgICAgICAgIG1vZGVfbXYgPSBtb2RlX212X3NiW3NpZ25fYmlhc107CisgICAgICAgICAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gYmVzdF9yZWZfbXZfc2Jbc2lnbl9iaWFzXS5hc19pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRlc3RpbmcgZnJlcXVlbmN5IGZvciB0aGlzIG1vZGUgaXMgYXQgaXRzCisgICAgICAgICAqIG1heCBJZiBzbyB0aGVuIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0ZXN0ZWQgYW5kIGluY3JlYXNlIHRoZQorICAgICAgICAgKiB0aHJlc2hvbGQgZm9yIGl0cyB0ZXN0aW5nCisgICAgICAgICAqLworICAgICAgICBpZiAoY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSAmJiAoY3BpLT5tb2RlX2NoZWNrX2ZyZXFbbW9kZV9pbmRleF0gPiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNwaS0+bWJzX3Rlc3RlZF9zb19mYXIgIDw9IGNwaS0+bW9kZV9jaGVja19mcmVxW21vZGVfaW5kZXhdICogY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJbmNyZWFzZSB0aGUgdGhyZXNob2xkIGZvciBjb2RpbmcgdGhpcyBtb2RlIHRvIG1ha2UgaXQKKyAgICAgICAgICAgICAgICAgKiBsZXNzIGxpa2VseSB0byBiZSBjaG9zZW4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdICs9IDQ7CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA+IE1BWF9USFJFU0hNVUxUKQorICAgICAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gTUFYX1RIUkVTSE1VTFQ7CisKKyAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW21vZGVfaW5kZXhdID0gKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW21vZGVfaW5kZXhdID4+IDcpICogY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XTsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogV2UgaGF2ZSBub3cgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgd2UgYXJlIGdvaW5nIHRvIHRlc3QgdGhlCisgICAgICAgICAqIGN1cnJlbnQgbW9kZSBzbyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMKKyAgICAgICAgICogaXQgaGFzIGJlZW4gdGVzdGVkCisgICAgICAgICAqLworICAgICAgICBjcGktPm1vZGVfdGVzdF9oaXRfY291bnRzW21vZGVfaW5kZXhdICsrOworCisgICAgICAgIC8qIEV4cGVyaW1lbnRhbCBjb2RlLiBTcGVjaWFsIGNhc2UgZm9yIGdmIGFuZCBhcmYgemVyb212IG1vZGVzLgorICAgICAgICAgKiBJbmNyZWFzZSB6YmluIHNpemUgdG8gc3VwcmVzcyBub2lzZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNwaS0+emJpbl9tb2RlX2Jvb3N0X2VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdGhpc19yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUgKQorICAgICAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodnA4X21vZGVfb3JkZXJbbW9kZV9pbmRleF0gPT0gWkVST01WKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfcmVmX2ZyYW1lICE9IExBU1RfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IEdGX1pFUk9NVl9aQklOX0JPT1NUOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IExGX1pFUk9NVl9aQklOX0JPT1NUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh2cDhfbW9kZV9vcmRlclttb2RlX2luZGV4XSA9PSBTUExJVE1WKQorICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IE1WX1pCSU5fQk9PU1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZwOF91cGRhdGVfemJpbl9leHRyYShjcGksIHgpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIXV2X2ludHJhX2RvbmUgJiYgdGhpc19yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJkX3BpY2tfaW50cmFfbWJ1dl9tb2RlKHgsICZ1dl9pbnRyYV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV2X2ludHJhX3JhdGVfdG9rZW5vbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV2X2ludHJhX2Rpc3RvcnRpb24pOworICAgICAgICAgICAgdXZfaW50cmFfbW9kZSA9IHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGU7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUb3RhbCBvZiB0aGUgZW9icyBpcyB1c2VkIGxhdGVyIHRvIGZ1cnRoZXIgYWRqdXN0IHJhdGUyLiBTaW5jZSB1dgorICAgICAgICAgICAgICogYmxvY2sncyBpbnRyYSBlb2JzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB3ZSBjaGVjayBpbnRlciBtb2RlcywKKyAgICAgICAgICAgICAqIHdlIG5lZWQgdG8gc2F2ZSB1dl9pbnRyYV90dGVvYiBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpKyspCisgICAgICAgICAgICAgICAgdXZfaW50cmFfdHRlb2IgKz0geC0+ZV9tYmQuZW9ic1tpXTsKKworICAgICAgICAgICAgdXZfaW50cmFfZG9uZSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHRoaXNfbW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJfUFJFRDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRtcF9yZDsKKworICAgICAgICAgICAgLyogTm90ZSB0aGUgcmF0ZSB2YWx1ZSByZXR1cm5lZCBoZXJlIGluY2x1ZGVzIHRoZSBjb3N0IG9mCisgICAgICAgICAgICAgKiBjb2RpbmcgdGhlIEJQUkVEIG1vZGU6IHgtPm1ibW9kZV9jb3N0W3gtPmVfbWJkLmZyYW1lX3R5cGVdW0JQUkVEXQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIHRtcF9yZCA9IHJkX3BpY2tfaW50cmE0eDRtYnlfbW9kZXMoeCwgJnJhdGUsICZyZC5yYXRlX3ksICZkaXN0b3J0aW9uLCBiZXN0X21vZGUueXJkKTsKKyAgICAgICAgICAgIHJkLnJhdGUyICs9IHJhdGU7CisgICAgICAgICAgICByZC5kaXN0b3J0aW9uMiArPSBkaXN0b3J0aW9uOworCisgICAgICAgICAgICBpZih0bXBfcmQgPCBiZXN0X21vZGUueXJkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJkLnJhdGUyICs9IHV2X2ludHJhX3JhdGU7CisgICAgICAgICAgICAgICAgcmQucmF0ZV91diA9IHV2X2ludHJhX3JhdGVfdG9rZW5vbmx5OworICAgICAgICAgICAgICAgIHJkLmRpc3RvcnRpb24yICs9IHV2X2ludHJhX2Rpc3RvcnRpb247CisgICAgICAgICAgICAgICAgcmQuZGlzdG9ydGlvbl91diA9IHV2X2ludHJhX2Rpc3RvcnRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpc19yZCA9IElOVF9NQVg7CisgICAgICAgICAgICAgICAgZGlzYWJsZV9za2lwID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNQTElUTVY6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0bXBfcmQ7CisgICAgICAgICAgICBpbnQgdGhpc19yZF90aHJlc2g7CisgICAgICAgICAgICBpbnQgZGlzdG9ydGlvbjsKKworICAgICAgICAgICAgdGhpc19yZF90aHJlc2ggPSAodnA4X3JlZl9mcmFtZV9vcmRlclttb2RlX2luZGV4XSA9PSAxKSA/IGNwaS0+cmRfdGhyZXNoZXNbVEhSX05FVzFdIDogY3BpLT5yZF90aHJlc2hlc1tUSFJfTkVXM107CisgICAgICAgICAgICB0aGlzX3JkX3RocmVzaCA9ICh2cDhfcmVmX2ZyYW1lX29yZGVyW21vZGVfaW5kZXhdID09IDIpID8gY3BpLT5yZF90aHJlc2hlc1tUSFJfTkVXMl0gOiB0aGlzX3JkX3RocmVzaDsKKworICAgICAgICAgICAgdG1wX3JkID0gdnA4X3JkX3BpY2tfYmVzdF9tYnNlZ21lbnRhdGlvbihjcGksIHgsICZiZXN0X3JlZl9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9tb2RlLnlyZCwgbWRjb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXRlLCAmcmQucmF0ZV95LCAmZGlzdG9ydGlvbiwgdGhpc19yZF90aHJlc2gpIDsKKworICAgICAgICAgICAgcmQucmF0ZTIgKz0gcmF0ZTsKKyAgICAgICAgICAgIHJkLmRpc3RvcnRpb24yICs9IGRpc3RvcnRpb247CisKKyAgICAgICAgICAgIC8qIElmIGV2ZW4gdGhlICdZJyByZCB2YWx1ZSBvZiBzcGxpdCBpcyBoaWdoZXIgdGhhbiBiZXN0IHNvIGZhcgorICAgICAgICAgICAgICogdGhlbiBkb250IGJvdGhlciBsb29raW5nIGF0IFVWCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0bXBfcmQgPCBiZXN0X21vZGUueXJkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5vdyB3b3JrIG91dCBVViBjb3N0IGFuZCBhZGQgaXQgaW4gKi8KKyAgICAgICAgICAgICAgICByZF9pbnRlcjR4NF91dihjcGksIHgsICZyZC5yYXRlX3V2LCAmcmQuZGlzdG9ydGlvbl91diwgY3BpLT5jb21tb24uZnVsbF9waXhlbCk7CisgICAgICAgICAgICAgICAgcmQucmF0ZTIgKz0gcmQucmF0ZV91djsKKyAgICAgICAgICAgICAgICByZC5kaXN0b3J0aW9uMiArPSByZC5kaXN0b3J0aW9uX3V2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXNfcmQgPSBJTlRfTUFYOworICAgICAgICAgICAgICAgIGRpc2FibGVfc2tpcCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRENfUFJFRDoKKyAgICAgICAgY2FzZSBWX1BSRUQ6CisgICAgICAgIGNhc2UgSF9QUkVEOgorICAgICAgICBjYXNlIFRNX1BSRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkaXN0b3J0aW9uOworICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7CisKKyAgICAgICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zKHhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciAtIHhkLT5kc3QueV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICAgICAgbWFjcm9fYmxvY2tfeXJkKHgsICZyZC5yYXRlX3ksICZkaXN0b3J0aW9uKSA7CisgICAgICAgICAgICByZC5yYXRlMiArPSByZC5yYXRlX3k7CisgICAgICAgICAgICByZC5kaXN0b3J0aW9uMiArPSBkaXN0b3J0aW9uOworICAgICAgICAgICAgcmQucmF0ZTIgKz0geC0+bWJtb2RlX2Nvc3RbeC0+ZV9tYmQuZnJhbWVfdHlwZV1beC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZV07CisgICAgICAgICAgICByZC5yYXRlMiArPSB1dl9pbnRyYV9yYXRlOworICAgICAgICAgICAgcmQucmF0ZV91diA9IHV2X2ludHJhX3JhdGVfdG9rZW5vbmx5OworICAgICAgICAgICAgcmQuZGlzdG9ydGlvbjIgKz0gdXZfaW50cmFfZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIHJkLmRpc3RvcnRpb25fdXYgPSB1dl9pbnRyYV9kaXN0b3J0aW9uOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTkVXTVY6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0aGlzc21lOworICAgICAgICAgICAgaW50IGJlc3RzbWUgPSBJTlRfTUFYOworICAgICAgICAgICAgaW50IHN0ZXBfcGFyYW0gPSBjcGktPnNmLmZpcnN0X3N0ZXA7CisgICAgICAgICAgICBpbnQgZnVydGhlcl9zdGVwczsKKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgaW50IGRvX3JlZmluZT0xOyAgIC8qIElmIGxhc3Qgc3RlcCAoMS1hd2F5KSBvZiBuLXN0ZXAgc2VhcmNoIGRvZXNuJ3QgcGljayB0aGUgY2VudGVyIHBvaW50IGFzIHRoZSBiZXN0IG1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIHdpbGwgZG8gYSBmaW5hbCAxLWF3YXkgZGlhbW9uZCByZWZpbmluZyBzZWFyY2ggICovCisKKyAgICAgICAgICAgIGludCBzYWRwYiA9IHgtPnNhZHBlcmJpdDE2OworICAgICAgICAgICAgaW50X212IG12cF9mdWxsOworCisgICAgICAgICAgICBpbnQgY29sX21pbiA9ICgoYmVzdF9yZWZfbXYuYXNfbXYuY29sKzcpPj4zKSAtIE1BWF9GVUxMX1BFTF9WQUw7CisgICAgICAgICAgICBpbnQgcm93X21pbiA9ICgoYmVzdF9yZWZfbXYuYXNfbXYucm93KzcpPj4zKSAtIE1BWF9GVUxMX1BFTF9WQUw7CisgICAgICAgICAgICBpbnQgY29sX21heCA9IChiZXN0X3JlZl9tdi5hc19tdi5jb2w+PjMpICsgTUFYX0ZVTExfUEVMX1ZBTDsKKyAgICAgICAgICAgIGludCByb3dfbWF4ID0gKGJlc3RfcmVmX212LmFzX212LnJvdz4+MykgKyBNQVhfRlVMTF9QRUxfVkFMOworCisgICAgICAgICAgICBpbnQgdG1wX2NvbF9taW4gPSB4LT5tdl9jb2xfbWluOworICAgICAgICAgICAgaW50IHRtcF9jb2xfbWF4ID0geC0+bXZfY29sX21heDsKKyAgICAgICAgICAgIGludCB0bXBfcm93X21pbiA9IHgtPm12X3Jvd19taW47CisgICAgICAgICAgICBpbnQgdG1wX3Jvd19tYXggPSB4LT5tdl9yb3dfbWF4OworCisgICAgICAgICAgICBpZighc2FkZG9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cDhfY2FsX3NhZChjcGkseGQseCwgcmVjb25feW9mZnNldCAsJm5lYXJfc2FkaWR4WzBdICk7CisgICAgICAgICAgICAgICAgc2FkZG9uZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZwOF9tdl9wcmVkKGNwaSwgJngtPmVfbWJkLCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwgJm12cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSwgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcywgJnNyLCAmbmVhcl9zYWRpZHhbMF0pOworCisgICAgICAgICAgICBtdnBfZnVsbC5hc19tdi5jb2wgPSBtdnAuYXNfbXYuY29sPj4zOworICAgICAgICAgICAgbXZwX2Z1bGwuYXNfbXYucm93ID0gbXZwLmFzX212LnJvdz4+MzsKKworICAgICAgICAgICAgLyogR2V0IGludGVyc2VjdGlvbiBvZiBVTVYgd2luZG93IGFuZCB2YWxpZCBNViB3aW5kb3cgdG8KKyAgICAgICAgICAgICAqIHJlZHVjZSAjIG9mIGNoZWNrcyBpbiBkaWFtb25kIHNlYXJjaC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHgtPm12X2NvbF9taW4gPCBjb2xfbWluICkKKyAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWluID0gY29sX21pbjsKKyAgICAgICAgICAgIGlmICh4LT5tdl9jb2xfbWF4ID4gY29sX21heCApCisgICAgICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IGNvbF9tYXg7CisgICAgICAgICAgICBpZiAoeC0+bXZfcm93X21pbiA8IHJvd19taW4gKQorICAgICAgICAgICAgICAgIHgtPm12X3Jvd19taW4gPSByb3dfbWluOworICAgICAgICAgICAgaWYgKHgtPm12X3Jvd19tYXggPiByb3dfbWF4ICkKKyAgICAgICAgICAgICAgICB4LT5tdl9yb3dfbWF4ID0gcm93X21heDsKKworICAgICAgICAgICAgLyogYWRqdXN0IHNlYXJjaCByYW5nZSBhY2NvcmRpbmcgdG8gc3IgZnJvbSBtdiBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBpZihzciA+IHN0ZXBfcGFyYW0pCisgICAgICAgICAgICAgICAgc3RlcF9wYXJhbSA9IHNyOworCisgICAgICAgICAgICAvKiBJbml0aWFsIHN0ZXAvZGlhbW9uZCBzZWFyY2ggKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0c21lID0gY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYiwgZCwgJm12cF9mdWxsLCAmZC0+Ym1pLm12LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0sIHNhZHBiLCAmbnVtMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5tdmNvc3QsICZiZXN0X3JlZl9tdik7CisgICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0uYXNfaW50ID0gZC0+Ym1pLm12LmFzX2ludDsKKworICAgICAgICAgICAgICAgIC8qIEZ1cnRoZXIgc3RlcC9kaWFtb25kIHNlYXJjaGVzIGFzIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIGZ1cnRoZXJfc3RlcHMgPSAoY3BpLT5zZi5tYXhfc3RlcF9zZWFyY2hfc3RlcHMgLSAxKSAtIHN0ZXBfcGFyYW07CisKKyAgICAgICAgICAgICAgICBuID0gbnVtMDA7CisgICAgICAgICAgICAgICAgbnVtMDAgPSAwOworCisgICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgd29uJ3QgYmUgbW9yZSBuLXN0ZXAgc2VhcmNoLCBjaGVjayB0byBzZWUgaWYgcmVmaW5pbmcgc2VhcmNoIGlzIG5lZWRlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobiA+IGZ1cnRoZXJfc3RlcHMpCisgICAgICAgICAgICAgICAgICAgIGRvX3JlZmluZSA9IDA7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAobiA8IGZ1cnRoZXJfc3RlcHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuKys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bTAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtMDAtLTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzc21lID0gY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYiwgZCwgJm12cF9mdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQtPmJtaS5tdiwgc3RlcF9wYXJhbSArIG4sIHNhZHBiLCAmbnVtMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLCB4LT5tdmNvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVzdF9yZWZfbXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0byBzZWUgaWYgcmVmaW5pbmcgc2VhcmNoIGlzIG5lZWRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW0wMCA+IChmdXJ0aGVyX3N0ZXBzLW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX3JlZmluZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzc21lIDwgYmVzdHNtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdGhpc3NtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5hc19pbnQgPSBkLT5ibWkubXYuYXNfaW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmJtaS5tdi5hc19pbnQgPSBtb2RlX212W05FV01WXS5hc19pbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZpbmFsIDEtYXdheSBkaWFtb25kIHJlZmluaW5nIHNlYXJjaCAqLworICAgICAgICAgICAgaWYgKGRvX3JlZmluZSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzZWFyY2hfcmFuZ2U7CisKKyAgICAgICAgICAgICAgICBzZWFyY2hfcmFuZ2UgPSA4OworCisgICAgICAgICAgICAgICAgdGhpc3NtZSA9IGNwaS0+cmVmaW5pbmdfc2VhcmNoX3NhZCh4LCBiLCBkLCAmZC0+Ym1pLm12LCBzYWRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9yYW5nZSwgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPm12Y29zdCwgJmJlc3RfcmVmX212KTsKKworICAgICAgICAgICAgICAgIGlmICh0aGlzc21lIDwgYmVzdHNtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RzbWUgPSB0aGlzc21lOworICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5hc19pbnQgPSBkLT5ibWkubXYuYXNfaW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkLT5ibWkubXYuYXNfaW50ID0gbW9kZV9tdltORVdNVl0uYXNfaW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeC0+bXZfY29sX21pbiA9IHRtcF9jb2xfbWluOworICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IHRtcF9jb2xfbWF4OworICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHRtcF9yb3dfbWluOworICAgICAgICAgICAgeC0+bXZfcm93X21heCA9IHRtcF9yb3dfbWF4OworCisgICAgICAgICAgICBpZiAoYmVzdHNtZSA8IElOVF9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGRpczsgLyogVE9ETzogdXNlIGRpcyBpbiBkaXN0b3J0aW9uIGNhbGN1bGF0aW9uIGxhdGVyLiAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzc2U7CisgICAgICAgICAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCh4LCBiLCBkLCAmZC0+Ym1pLm12LCAmYmVzdF9yZWZfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5lcnJvcnBlcmJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5tdmNvc3QsICZkaXMsICZzc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtb2RlX212W05FV01WXS5hc19pbnQgPSBkLT5ibWkubXYuYXNfaW50OworCisgICAgICAgICAgICAvKiBBZGQgdGhlIG5ldyBtb3Rpb24gdmVjdG9yIGNvc3QgdG8gb3VyIHJvbGxpbmcgY29zdCB2YXJpYWJsZSAqLworICAgICAgICAgICAgcmQucmF0ZTIgKz0gdnA4X212X2JpdF9jb3N0KCZtb2RlX212W05FV01WXSwgJmJlc3RfcmVmX212LCB4LT5tdmNvc3QsIDk2KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTkVBUkVTVE1WOgorICAgICAgICBjYXNlIE5FQVJNVjoKKyAgICAgICAgICAgIC8qIENsaXAgIm5leHRfbmVhcmVzdCIgc28gdGhhdCBpdCBkb2VzIG5vdCBleHRlbmQgdG8gZmFyIG91dAorICAgICAgICAgICAgICogb2YgaW1hZ2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdnA4X2NsYW1wX212MigmbW9kZV9tdlt0aGlzX21vZGVdLCB4ZCk7CisKKyAgICAgICAgICAgIC8qIERvIG5vdCBib3RoZXIgcHJvY2VlZGluZyBpZiB0aGUgdmVjdG9yIChmcm9tIG5ld212LCBuZWFyZXN0CisgICAgICAgICAgICAgKiBvciBuZWFyKSBpcyAwLDAgYXMgdGhpcyBzaG91bGQgdGhlbiBiZSBjb2RlZCB1c2luZyB0aGUgemVyb212CisgICAgICAgICAgICAgKiBtb2RlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKCh0aGlzX21vZGUgPT0gTkVBUk1WKSB8fCAodGhpc19tb2RlID09IE5FQVJFU1RNVikpICYmIChtb2RlX212W3RoaXNfbW9kZV0uYXNfaW50ID09IDApKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGNhc2UgWkVST01WOgorCisgICAgICAgICAgICAvKiBUcmFwIHZlY3RvcnMgdGhhdCByZWFjaCBiZXlvbmQgdGhlIFVNViBib3JkZXJzCisgICAgICAgICAgICAgKiBOb3RlIHRoYXQgQUxMIE5ldyBNViwgTmVhcmVzdCBNViBOZWFyIE1WIGFuZCBaZXJvIE1WIGNvZGUKKyAgICAgICAgICAgICAqIGRyb3BzIHRocm91Z2ggdG8gdGhpcyBwb2ludCBiZWNhdXNlIG9mIHRoZSBsYWNrIG9mIGJyZWFrCisgICAgICAgICAgICAgKiBzdGF0ZW1lbnRzIGluIHRoZSBwcmV2aW91cyB0d28gY2FzZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoKG1vZGVfbXZbdGhpc19tb2RlXS5hc19tdi5yb3cgPj4gMykgPCB4LT5tdl9yb3dfbWluKSB8fCAoKG1vZGVfbXZbdGhpc19tb2RlXS5hc19tdi5yb3cgPj4gMykgPiB4LT5tdl9yb3dfbWF4KSB8fAorICAgICAgICAgICAgICAgICgobW9kZV9tdlt0aGlzX21vZGVdLmFzX212LmNvbCA+PiAzKSA8IHgtPm12X2NvbF9taW4pIHx8ICgobW9kZV9tdlt0aGlzX21vZGVdLmFzX212LmNvbCA+PiAzKSA+IHgtPm12X2NvbF9tYXgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB2cDhfc2V0X21ibW9kZV9hbmRfbXZzKHgsIHRoaXNfbW9kZSwgJm1vZGVfbXZbdGhpc19tb2RlXSk7CisgICAgICAgICAgICB0aGlzX3JkID0gZXZhbHVhdGVfaW50ZXJfbW9kZV9yZChtZGNvdW50cywgJnJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc2FibGVfc2tpcCwgY3BpLCB4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXNfcmQgPSBjYWxjdWxhdGVfZmluYWxfcmRfY29zdHModGhpc19yZCwgJnJkLCAmb3RoZXJfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX3NraXAsIHV2X2ludHJhX3R0ZW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhX3JkX3BlbmFsdHksIGNwaSwgeCk7CisKKyAgICAgICAgLyogS2VlcCByZWNvcmQgb2YgYmVzdCBpbnRyYSBkaXN0b3J0aW9uICovCisgICAgICAgIGlmICgoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKSAmJgorICAgICAgICAgICAgKHRoaXNfcmQgPCBiZXN0X21vZGUuaW50cmFfcmQpICkKKyAgICAgICAgeworICAgICAgICAgIGJlc3RfbW9kZS5pbnRyYV9yZCA9IHRoaXNfcmQ7CisgICAgICAgICAgICAqcmV0dXJuaW50cmEgPSByZC5kaXN0b3J0aW9uMiA7CisgICAgICAgIH0KKyNpZiBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisgICAgICAgIGlmIChjcGktPm94Y2Yubm9pc2Vfc2Vuc2l0aXZpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzc2U7CisgICAgICAgICAgICB2cDhfZ2V0X2ludGVyX21icHJlZF9lcnJvcih4LCZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sJnNzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdlt0aGlzX21vZGVdKTsKKworICAgICAgICAgICAgaWYgKHNzZSA8IGJlc3RfcmRfc3NlKQorICAgICAgICAgICAgICAgIGJlc3RfcmRfc3NlID0gc3NlOworCisgICAgICAgICAgICAvKiBTdG9yZSBmb3IgbGF0ZXIgdXNlIGJ5IGRlbm9pc2VyLiAqLworICAgICAgICAgICAgaWYgKHRoaXNfbW9kZSA9PSBaRVJPTVYgJiYgc3NlIDwgemVyb19tdl9zc2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHplcm9fbXZfc3NlID0gc3NlOworICAgICAgICAgICAgICAgIHgtPmJlc3RfemVyb212X3JlZmVyZW5jZV9mcmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBiZXN0IE5FV01WIGluIHggZm9yIGxhdGVyIHVzZSBpbiB0aGUgZGVub2lzZXIuICovCisgICAgICAgICAgICBpZiAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBORVdNViAmJgorICAgICAgICAgICAgICAgICAgICBzc2UgPCBiZXN0X3NzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0X3NzZSA9IHNzZTsKKyAgICAgICAgICAgICAgICB2cDhfZ2V0X2ludGVyX21icHJlZF9lcnJvcih4LCZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sJmJlc3Rfc3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdlt0aGlzX21vZGVdKTsKKyAgICAgICAgICAgICAgICB4LT5iZXN0X3NzZV9pbnRlcl9tb2RlID0gTkVXTVY7CisgICAgICAgICAgICAgICAgeC0+YmVzdF9zc2VfbXYgPSB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdjsKKyAgICAgICAgICAgICAgICB4LT5uZWVkX3RvX2NsYW1wX2Jlc3RfbXZzID0KKyAgICAgICAgICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubmVlZF90b19jbGFtcF9tdnM7CisgICAgICAgICAgICAgICAgeC0+YmVzdF9yZWZlcmVuY2VfZnJhbWUgPQorICAgICAgICAgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIERpZCB0aGlzIG1vZGUgaGVscC4uIGkuaSBpcyBpdCB0aGUgbmV3IGJlc3QgbW9kZSAqLworICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfbW9kZS5yZCB8fCB4LT5za2lwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3RlIGluZGV4IG9mIGJlc3QgbW9kZSBzbyBmYXIgKi8KKyAgICAgICAgICAgIGJlc3RfbW9kZV9pbmRleCA9IG1vZGVfaW5kZXg7CisgICAgICAgICAgICAqcmV0dXJucmF0ZSA9IHJkLnJhdGUyOworICAgICAgICAgICAgKnJldHVybmRpc3RvcnRpb24gPSByZC5kaXN0b3J0aW9uMjsKKyAgICAgICAgICAgIGlmICh0aGlzX21vZGUgPD0gQl9QUkVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSB1dl9pbnRyYV9tb2RlOworICAgICAgICAgICAgICAgIC8qIHJlcXVpcmVkIGZvciBsZWZ0IGFuZCBhYm92ZSBibG9jayBtdiAqLworICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX2ludCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVfYmVzdF9tb2RlKCZiZXN0X21vZGUsIHRoaXNfcmQsICZyZCwgb3RoZXJfY29zdCwgeCk7CisKKworICAgICAgICAgICAgLyogVGVzdGluZyB0aGlzIG1vZGUgZ2F2ZSByaXNlIHRvIGFuIGltcHJvdmVtZW50IGluIGJlc3QgZXJyb3IKKyAgICAgICAgICAgICAqIHNjb3JlLiBMb3dlciB0aHJlc2hvbGQgYSBiaXQgZm9yIG5leHQgdGltZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gKGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPj0gKE1JTl9USFJFU0hNVUxUICsgMikpID8gY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSAtIDIgOiBNSU5fVEhSRVNITVVMVDsKKyAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIG1vZGUgZGlkIG5vdCBoZWxwIGltcHJvdmUgdGhlIGJlc3QgZXJyb3IgY2FzZSB0aGVuIHJhaXNlCisgICAgICAgICAqIHRoZSB0aHJlc2hvbGQgZm9yIHRlc3RpbmcgdGhhdCBtb2RlIG5leHQgdGltZSBhcm91bmQuCisgICAgICAgICAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gKz0gNDsKKworICAgICAgICAgICAgaWYgKGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPiBNQVhfVEhSRVNITVVMVCkKKyAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gTUFYX1RIUkVTSE1VTFQ7CisKKyAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHgtPnNraXApCisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIC8qIFJlZHVjZSB0aGUgYWN0aXZhdGlvbiBSRCB0aHJlc2hvbGRzIGZvciB0aGUgYmVzdCBjaG9pY2UgbW9kZSAqLworICAgIGlmICgoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbYmVzdF9tb2RlX2luZGV4XSA+IDApICYmIChjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFtiZXN0X21vZGVfaW5kZXhdIDwgKElOVF9NQVggPj4gMikpKQorICAgIHsKKyAgICAgICAgaW50IGJlc3RfYWRqdXN0bWVudCA9IChjcGktPnJkX3RocmVzaF9tdWx0W2Jlc3RfbW9kZV9pbmRleF0gPj4gMik7CisKKyAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtiZXN0X21vZGVfaW5kZXhdID0gKGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XSA+PSAoTUlOX1RIUkVTSE1VTFQgKyBiZXN0X2FkanVzdG1lbnQpKSA/IGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XSAtIGJlc3RfYWRqdXN0bWVudCA6IE1JTl9USFJFU0hNVUxUOworICAgICAgICBjcGktPnJkX3RocmVzaGVzW2Jlc3RfbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbYmVzdF9tb2RlX2luZGV4XSA+PiA3KSAqIGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XTsKKyAgICB9CisKKyAgICAvKiBOb3RlIGhvdyBvZnRlbiBlYWNoIG1vZGUgY2hvc2VuIGFzIGJlc3QgKi8KKyAgICBjcGktPm1vZGVfY2hvc2VuX2NvdW50c1tiZXN0X21vZGVfaW5kZXhdICsrOworCisjaWYgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORworICAgIGlmIChjcGktPm94Y2Yubm9pc2Vfc2Vuc2l0aXZpdHkpCisgICAgeworICAgICAgICBpZiAoeC0+YmVzdF9zc2VfaW50ZXJfbW9kZSA9PSBEQ19QUkVEKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBObyBiZXN0IE1WIGZvdW5kLiAqLworICAgICAgICAgICAgeC0+YmVzdF9zc2VfaW50ZXJfbW9kZSA9IGJlc3RfbW9kZS5tYm1vZGUubW9kZTsKKyAgICAgICAgICAgIHgtPmJlc3Rfc3NlX212ID0gYmVzdF9tb2RlLm1ibW9kZS5tdjsKKyAgICAgICAgICAgIHgtPm5lZWRfdG9fY2xhbXBfYmVzdF9tdnMgPSBiZXN0X21vZGUubWJtb2RlLm5lZWRfdG9fY2xhbXBfbXZzOworICAgICAgICAgICAgeC0+YmVzdF9yZWZlcmVuY2VfZnJhbWUgPSBiZXN0X21vZGUubWJtb2RlLnJlZl9mcmFtZTsKKyAgICAgICAgICAgIGJlc3Rfc3NlID0gYmVzdF9yZF9zc2U7CisgICAgICAgIH0KKyAgICAgICAgdnA4X2Rlbm9pc2VyX2Rlbm9pc2VfbWIoJmNwaS0+ZGVub2lzZXIsIHgsIGJlc3Rfc3NlLCB6ZXJvX212X3NzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQpOworCisKKyAgICAgICAgLyogUmVldmFsdWF0ZSBaRVJPTVYgYWZ0ZXIgZGVub2lzaW5nLiAqLworICAgICAgICBpZiAoYmVzdF9tb2RlLm1ibW9kZS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUgJiYKKyAgICAgICAgICAgIHgtPmJlc3RfemVyb212X3JlZmVyZW5jZV9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRoaXNfcmQgPSBJTlRfTUFYOworICAgICAgICAgICAgaW50IGRpc2FibGVfc2tpcCA9IDA7CisgICAgICAgICAgICBpbnQgb3RoZXJfY29zdCA9IDA7CisgICAgICAgICAgICBpbnQgdGhpc19yZWZfZnJhbWUgPSB4LT5iZXN0X3plcm9tdl9yZWZlcmVuY2VfZnJhbWU7CisgICAgICAgICAgICByZC5yYXRlMiA9IHgtPnJlZl9mcmFtZV9jb3N0W3RoaXNfcmVmX2ZyYW1lXSArCisgICAgICAgICAgICAgICAgICAgIHZwOF9jb3N0X212X3JlZihaRVJPTVYsIG1kY291bnRzKTsKKyAgICAgICAgICAgIHJkLmRpc3RvcnRpb24yID0gMDsKKworICAgICAgICAgICAgLyogc2V0IHVwIHRoZSBwcm9wZXIgcHJlZGljdGlvbiBidWZmZXJzIGZvciB0aGUgZnJhbWUgKi8KKyAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IHRoaXNfcmVmX2ZyYW1lOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnlfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzBdOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnVfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzFdOworICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnZfYnVmZmVyID0gcGxhbmVbdGhpc19yZWZfZnJhbWVdWzJdOworCisgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gWkVST01WOworICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSA9IERDX1BSRUQ7CisgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19pbnQgPSAwOworCisgICAgICAgICAgICB0aGlzX3JkID0gZXZhbHVhdGVfaW50ZXJfbW9kZV9yZChtZGNvdW50cywgJnJkLCAmZGlzYWJsZV9za2lwLCBjcGksIHgpOworICAgICAgICAgICAgdGhpc19yZCA9IGNhbGN1bGF0ZV9maW5hbF9yZF9jb3N0cyh0aGlzX3JkLCAmcmQsICZvdGhlcl9jb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX3NraXAsIHV2X2ludHJhX3R0ZW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYV9yZF9wZW5hbHR5LCBjcGksIHgpOworICAgICAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X21vZGUucmQgfHwgeC0+c2tpcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBOb3RlIGluZGV4IG9mIGJlc3QgbW9kZSBzbyBmYXIgKi8KKyAgICAgICAgICAgICAgICBiZXN0X21vZGVfaW5kZXggPSBtb2RlX2luZGV4OworICAgICAgICAgICAgICAgICpyZXR1cm5yYXRlID0gcmQucmF0ZTI7CisgICAgICAgICAgICAgICAgKnJldHVybmRpc3RvcnRpb24gPSByZC5kaXN0b3J0aW9uMjsKKyAgICAgICAgICAgICAgICB1cGRhdGVfYmVzdF9tb2RlKCZiZXN0X21vZGUsIHRoaXNfcmQsICZyZCwgb3RoZXJfY29zdCwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgJiYKKyAgICAgICAgKGJlc3RfbW9kZS5tYm1vZGUubW9kZSAhPSBaRVJPTVYgfHwgYmVzdF9tb2RlLm1ibW9kZS5yZWZfZnJhbWUgIT0gQUxUUkVGX0ZSQU1FKSkKKyAgICB7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBaRVJPTVY7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IEFMVFJFRl9GUkFNRTsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfaW50ID0gMDsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSA9IERDX1BSRUQ7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKTsKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucGFydGl0aW9uaW5nID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLyogbWFjcm9ibG9jayBtb2RlcyAqLworICAgIHZweF9tZW1jcHkoJngtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLCAmYmVzdF9tb2RlLm1ibW9kZSwgc2l6ZW9mKE1CX01PREVfSU5GTykpOworCisgICAgaWYgKGJlc3RfbW9kZS5tYm1vZGUubW9kZSA9PSBCX1BSRUQpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW2ldLmFzX21vZGUgPSBiZXN0X21vZGUuYm1vZGVzW2ldLmFzX21vZGU7CisgICAgfQorCisgICAgaWYgKGJlc3RfbW9kZS5tYm1vZGUubW9kZSA9PSBTUExJVE1WKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVtpXS5tdi5hc19pbnQgPSBiZXN0X21vZGUuYm1vZGVzW2ldLm12LmFzX2ludDsKKworICAgICAgICB2cHhfbWVtY3B5KHgtPnBhcnRpdGlvbl9pbmZvLCAmYmVzdF9tb2RlLnBhcnRpdGlvbiwgc2l6ZW9mKFBBUlRJVElPTl9JTkZPKSk7CisKKyAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfaW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+cGFydGl0aW9uX2luZm8tPmJtaVsxNV0ubXYuYXNfaW50OworICAgIH0KKworICAgIGlmIChzaWduX2JpYXMKKyAgICAgICAgIT0gY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhc1t4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXSkKKyAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gYmVzdF9yZWZfbXZfc2JbIXNpZ25fYmlhc10uYXNfaW50OworCisgICAgcmRfdXBkYXRlX212Y291bnQoY3BpLCB4LCAmYmVzdF9yZWZfbXYpOworfQorCit2b2lkIHZwOF9yZF9waWNrX2ludHJhX21vZGUoTUFDUk9CTE9DSyAqeCwgaW50ICpyYXRlXykKK3sKKyAgICBpbnQgZXJyb3I0eDQsIGVycm9yMTZ4MTY7CisgICAgaW50IHJhdGU0eDQsIHJhdGUxNngxNiA9IDAsIHJhdGV1djsKKyAgICBpbnQgZGlzdDR4NCwgZGlzdDE2eDE2LCBkaXN0dXY7CisgICAgaW50IHJhdGU7CisgICAgaW50IHJhdGU0eDRfdG9rZW5vbmx5ID0gMDsKKyAgICBpbnQgcmF0ZTE2eDE2X3Rva2Vub25seSA9IDA7CisgICAgaW50IHJhdGV1dl90b2tlbm9ubHkgPSAwOworCisgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7CisKKyAgICByZF9waWNrX2ludHJhX21idXZfbW9kZSh4LCAmcmF0ZXV2LCAmcmF0ZXV2X3Rva2Vub25seSwgJmRpc3R1dik7CisgICAgcmF0ZSA9IHJhdGV1djsKKworICAgIGVycm9yMTZ4MTYgPSByZF9waWNrX2ludHJhMTZ4MTZtYnlfbW9kZSh4LCAmcmF0ZTE2eDE2LCAmcmF0ZTE2eDE2X3Rva2Vub25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3QxNngxNik7CisKKyAgICBlcnJvcjR4NCA9IHJkX3BpY2tfaW50cmE0eDRtYnlfbW9kZXMoeCwgJnJhdGU0eDQsICZyYXRlNHg0X3Rva2Vub25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3Q0eDQsIGVycm9yMTZ4MTYpOworCisgICAgaWYgKGVycm9yNHg0IDwgZXJyb3IxNngxNikKKyAgICB7CisgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBCX1BSRUQ7CisgICAgICAgIHJhdGUgKz0gcmF0ZTR4NDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmF0ZSArPSByYXRlMTZ4MTY7CisgICAgfQorCisgICAgKnJhdGVfID0gcmF0ZTsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9yZG9wdC5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3Jkb3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiMDQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci9yZG9wdC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBfX0lOQ19SRE9QVF9ICisjZGVmaW5lIF9fSU5DX1JET1BUX0gKKworI2RlZmluZSBSRENPU1QoUk0sRE0sUixEKSAoICgoMTI4KyhSKSooUk0pKSA+PiA4KSArIChETSkqKEQpICkKKworc3RhdGljIHZvaWQgaW5zZXJ0c29ydG12KGludCBhcnJbXSwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoIGkgPSAxIDsgaSA8PSBsZW4tMSA7IGkrKyApCisgICAgeworICAgICAgICBmb3IgKCBqID0gMCA7IGogPCBpIDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhcnJbal0gPiBhcnJbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ZW1wOworCisgICAgICAgICAgICAgICAgdGVtcCA9IGFycltpXTsKKworICAgICAgICAgICAgICAgIGZvciAoIGsgPSBpOyBrID5qOyBrLS0pCisgICAgICAgICAgICAgICAgICAgIGFycltrXSA9IGFycltrIC0gMV0gOworCisgICAgICAgICAgICAgICAgYXJyW2pdID0gdGVtcCA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydHNvcnRzYWQoaW50IGFycltdLGludCBpZHhbXSwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoIGkgPSAxIDsgaSA8PSBsZW4tMSA7IGkrKyApCisgICAgeworICAgICAgICBmb3IgKCBqID0gMCA7IGogPCBpIDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhcnJbal0gPiBhcnJbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ZW1wLCB0ZW1waTsKKworICAgICAgICAgICAgICAgIHRlbXAgPSBhcnJbaV07CisgICAgICAgICAgICAgICAgdGVtcGkgPSBpZHhbaV07CisKKyAgICAgICAgICAgICAgICBmb3IgKCBrID0gaTsgayA+ajsgay0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyW2tdID0gYXJyW2sgLSAxXSA7CisgICAgICAgICAgICAgICAgICAgIGlkeFtrXSA9IGlkeFtrIC0gMV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXJyW2pdID0gdGVtcCA7CisgICAgICAgICAgICAgICAgaWR4W2pdID0gdGVtcGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2V4dGVybiB2b2lkIHZwOF9pbml0aWFsaXplX3JkX2NvbnN0cyhWUDhfQ09NUCAqY3BpLCBpbnQgUXZhbHVlKTsKK2V4dGVybiB2b2lkIHZwOF9yZF9waWNrX2ludGVyX21vZGUoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50IHJlY29uX3lvZmZzZXQsIGludCByZWNvbl91dm9mZnNldCwgaW50ICpyZXR1cm5yYXRlLCBpbnQgKnJldHVybmRpc3RvcnRpb24sIGludCAqcmV0dXJuaW50cmEpOworZXh0ZXJuIHZvaWQgdnA4X3JkX3BpY2tfaW50cmFfbW9kZShNQUNST0JMT0NLICp4LCBpbnQgKnJhdGUpOworCisKK3N0YXRpYyB2b2lkIGdldF9wbGFuZV9wb2ludGVycyhjb25zdCBZVjEyX0JVRkZFUl9DT05GSUcgKmZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAqcGxhbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICByZWNvbl95b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQpCit7CisgICAgcGxhbmVbMF0gPSBmYi0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OworICAgIHBsYW5lWzFdID0gZmItPnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7CisgICAgcGxhbmVbMl0gPSBmYi0+dl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKK30KKworCitzdGF0aWMgdm9pZCBnZXRfcHJlZGljdG9yX3BvaW50ZXJzKGNvbnN0IFZQOF9DT01QICpjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqcGxhbmVbNF1bM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgcmVjb25feW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICByZWNvbl91dm9mZnNldCkKK3sKKyAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfTEFTVF9GUkFNRSkKKyAgICAgICAgZ2V0X3BsYW5lX3BvaW50ZXJzKCZjcGktPmNvbW1vbi55djEyX2ZiW2NwaS0+Y29tbW9uLmxzdF9mYl9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVbTEFTVF9GUkFNRV0sIHJlY29uX3lvZmZzZXQsIHJlY29uX3V2b2Zmc2V0KTsKKworICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZSQU1FKQorICAgICAgICBnZXRfcGxhbmVfcG9pbnRlcnMoJmNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24uZ2xkX2ZiX2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZVtHT0xERU5fRlJBTUVdLCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCk7CisKKyAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUUl9GUkFNRSkKKyAgICAgICAgZ2V0X3BsYW5lX3BvaW50ZXJzKCZjcGktPmNvbW1vbi55djEyX2ZiW2NwaS0+Y29tbW9uLmFsdF9mYl9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVbQUxUUkVGX0ZSQU1FXSwgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQpOworfQorCisKK3N0YXRpYyB2b2lkIGdldF9yZWZlcmVuY2Vfc2VhcmNoX29yZGVyKGNvbnN0IFZQOF9DT01QICpjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHJlZl9mcmFtZV9tYXBbNF0pCit7CisgICAgaW50IGk9MDsKKworICAgIHJlZl9mcmFtZV9tYXBbaSsrXSA9IElOVFJBX0ZSQU1FOworICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZSQU1FKQorICAgICAgICByZWZfZnJhbWVfbWFwW2krK10gPSBMQVNUX0ZSQU1FOworICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZSQU1FKQorICAgICAgICByZWZfZnJhbWVfbWFwW2krK10gPSBHT0xERU5fRlJBTUU7CisgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVFJfRlJBTUUpCisgICAgICAgIHJlZl9mcmFtZV9tYXBbaSsrXSA9IEFMVFJFRl9GUkFNRTsKKyAgICBmb3IoOyBpPDQ7IGkrKykKKyAgICAgICAgcmVmX2ZyYW1lX21hcFtpXSA9IC0xOworfQorCisKK2V4dGVybiB2b2lkIHZwOF9tdl9wcmVkCisoCisgICAgVlA4X0NPTVAgKmNwaSwKKyAgICBNQUNST0JMT0NLRCAqeGQsCisgICAgY29uc3QgTU9ERV9JTkZPICpoZXJlLAorICAgIGludF9tdiAqbXZwLAorICAgIGludCByZWZmcmFtZSwKKyAgICBpbnQgKnJlZl9mcmFtZV9zaWduX2JpYXMsCisgICAgaW50ICpzciwKKyAgICBpbnQgbmVhcl9zYWRpZHhbXQorKTsKK3ZvaWQgdnA4X2NhbF9zYWQoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DS0QgKnhkLCBNQUNST0JMT0NLICp4LCBpbnQgcmVjb25feW9mZnNldCwgaW50IG5lYXJfc2FkaWR4W10pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9zZWdtZW50YXRpb24uYyBiL2xpYnZweC92cDgvZW5jb2Rlci9zZWdtZW50YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk3MmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3NlZ21lbnRhdGlvbi5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAic2VnbWVudGF0aW9uLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisKK3ZvaWQgdnA4X3VwZGF0ZV9nZl91c2VhZ2VfbWFwcyhWUDhfQ09NUCAqY3BpLCBWUDhfQ09NTU9OICpjbSwgTUFDUk9CTE9DSyAqeCkKK3sKKyAgICBpbnQgbWJfcm93LCBtYl9jb2w7CisKKyAgICBNT0RFX0lORk8gKnRoaXNfbWJfbW9kZV9pbmZvID0gY20tPm1pOworCisgICAgeC0+Z2ZfYWN0aXZlX3B0ciA9IChzaWduZWQgY2hhciAqKWNwaS0+Z2ZfYWN0aXZlX2ZsYWdzOworCisgICAgaWYgKChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHx8IChjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpKQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgR2YgdXNlYWdlIG1vbml0b3JzICovCisgICAgICAgIHZweF9tZW1zZXQoY3BpLT5nZl9hY3RpdmVfZmxhZ3MsIDEsIChjbS0+bWJfcm93cyAqIGNtLT5tYl9jb2xzKSk7CisgICAgICAgIGNwaS0+Z2ZfYWN0aXZlX2NvdW50ID0gY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29sczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogZm9yIGVhY2ggbWFjcm9ibG9jayByb3cgaW4gaW1hZ2UgKi8KKyAgICAgICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCBjbS0+bWJfcm93czsgbWJfcm93KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvciBlYWNoIG1hY3JvYmxvY2sgY29sIGluIGltYWdlICovCisgICAgICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNtLT5tYl9jb2xzOyBtYl9jb2wrKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIC8qIElmIHVzaW5nIGdvbGRlbiB0aGVuIHNldCBHRiBhY3RpdmUgZmxhZyBpZiBub3QgYWxyZWFkeSBzZXQuCisgICAgICAgICAgICAgICAgICogSWYgdXNpbmcgbGFzdCBmcmFtZSAwLDAgbW9kZSB0aGVuIGxlYXZlIGZsYWcgYXMgaXQgaXMKKyAgICAgICAgICAgICAgICAgKiBlbHNlIGlmIHVzaW5nIG5vbiAwLDAgbW90aW9uIG9yIGludHJhIG1vZGVzIHRoZW4gY2xlYXIKKyAgICAgICAgICAgICAgICAgKiBmbGFnIGlmIGl0IGlzIGN1cnJlbnRseSBzZXQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHRoaXNfbWJfbW9kZV9pbmZvLT5tYm1pLnJlZl9mcmFtZSA9PSBHT0xERU5fRlJBTUUpIHx8ICh0aGlzX21iX21vZGVfaW5mby0+bWJtaS5yZWZfZnJhbWUgPT0gQUxUUkVGX0ZSQU1FKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqKHgtPmdmX2FjdGl2ZV9wdHIpID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICooeC0+Z2ZfYWN0aXZlX3B0cikgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5nZl9hY3RpdmVfY291bnQgKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHRoaXNfbWJfbW9kZV9pbmZvLT5tYm1pLm1vZGUgIT0gWkVST01WKSAmJiAqKHgtPmdmX2FjdGl2ZV9wdHIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKih4LT5nZl9hY3RpdmVfcHRyKSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNwaS0+Z2ZfYWN0aXZlX2NvdW50LS07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeC0+Z2ZfYWN0aXZlX3B0cisrOyAgICAgICAgICAvKiBTdGVwIG9udG8gbmV4dCBlbnRyeSAqLworICAgICAgICAgICAgICAgIHRoaXNfbWJfbW9kZV9pbmZvKys7ICAgICAgICAgLyogc2tpcCB0byBuZXh0IG1iICovCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdGhpcyBpcyB0byBhY2NvdW50IGZvciB0aGUgYm9yZGVyICovCisgICAgICAgICAgICB0aGlzX21iX21vZGVfaW5mbysrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvc2VnbWVudGF0aW9uLmggYi9saWJ2cHgvdnA4L2VuY29kZXIvc2VnbWVudGF0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9lbmNvZGVyL3NlZ21lbnRhdGlvbi5oCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2VuY29kZXIvc2VnbWVudGF0aW9uLmgKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci9zc2ltLmMgYi9saWJ2cHgvdnA4L2VuY29kZXIvc3NpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTE2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvc3NpbS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgIm9ueXhfaW50LmgiCisKK3ZvaWQgdnA4X3NzaW1fcGFybXNfMTZ4MTZfYworKAorICAgIHVuc2lnbmVkIGNoYXIgKnMsCisgICAgaW50IHNwLAorICAgIHVuc2lnbmVkIGNoYXIgKnIsCisgICAgaW50IHJwLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9yLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9zLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9yLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zeHIKKykKK3sKKyAgICBpbnQgaSxqOworICAgIGZvcihpPTA7aTwxNjtpKysscys9c3Ascis9cnApCisgICAgIHsKKyAgICAgICAgIGZvcihqPTA7ajwxNjtqKyspCisgICAgICAgICB7CisgICAgICAgICAgICAgKnN1bV9zICs9IHNbal07CisgICAgICAgICAgICAgKnN1bV9yICs9IHJbal07CisgICAgICAgICAgICAgKnN1bV9zcV9zICs9IHNbal0gKiBzW2pdOworICAgICAgICAgICAgICpzdW1fc3FfciArPSByW2pdICogcltqXTsKKyAgICAgICAgICAgICAqc3VtX3N4ciArPSBzW2pdICogcltqXTsKKyAgICAgICAgIH0KKyAgICAgfQorfQordm9pZCB2cDhfc3NpbV9wYXJtc184eDhfYworKAorICAgIHVuc2lnbmVkIGNoYXIgKnMsCisgICAgaW50IHNwLAorICAgIHVuc2lnbmVkIGNoYXIgKnIsCisgICAgaW50IHJwLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9yLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9zLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9yLAorICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zeHIKKykKK3sKKyAgICBpbnQgaSxqOworICAgIGZvcihpPTA7aTw4O2krKyxzKz1zcCxyKz1ycCkKKyAgICAgeworICAgICAgICAgZm9yKGo9MDtqPDg7aisrKQorICAgICAgICAgeworICAgICAgICAgICAgICpzdW1fcyArPSBzW2pdOworICAgICAgICAgICAgICpzdW1fciArPSByW2pdOworICAgICAgICAgICAgICpzdW1fc3FfcyArPSBzW2pdICogc1tqXTsKKyAgICAgICAgICAgICAqc3VtX3NxX3IgKz0gcltqXSAqIHJbal07CisgICAgICAgICAgICAgKnN1bV9zeHIgKz0gc1tqXSAqIHJbal07CisgICAgICAgICB9CisgICAgIH0KK30KKworY29uc3Qgc3RhdGljIGludDY0X3QgY2MxID0gIDI2NjM0OyAvLyAoNjReMiooLjAxKjI1NSleMgorY29uc3Qgc3RhdGljIGludDY0X3QgY2MyID0gMjM5NzA4OyAvLyAoNjReMiooLjAzKjI1NSleMgorCitzdGF0aWMgZG91YmxlIHNpbWlsYXJpdHkKKygKKyAgICB1bnNpZ25lZCBsb25nIHN1bV9zLAorICAgIHVuc2lnbmVkIGxvbmcgc3VtX3IsCisgICAgdW5zaWduZWQgbG9uZyBzdW1fc3FfcywKKyAgICB1bnNpZ25lZCBsb25nIHN1bV9zcV9yLAorICAgIHVuc2lnbmVkIGxvbmcgc3VtX3N4ciwKKyAgICBpbnQgY291bnQKKykKK3sKKyAgICBpbnQ2NF90IHNzaW1fbiwgc3NpbV9kOworICAgIGludDY0X3QgYzEsIGMyOworCisgICAgLy9zY2FsZSB0aGUgY29uc3RhbnRzIGJ5IG51bWJlciBvZiBwaXhlbHMKKyAgICBjMSA9IChjYzEqY291bnQqY291bnQpPj4xMjsKKyAgICBjMiA9IChjYzIqY291bnQqY291bnQpPj4xMjsKKworICAgIHNzaW1fbiA9ICgyKnN1bV9zKnN1bV9yKyBjMSkqKChpbnQ2NF90KSAyKmNvdW50KnN1bV9zeHItCisgICAgICAgICAgKGludDY0X3QpIDIqc3VtX3Mqc3VtX3IrYzIpOworCisgICAgc3NpbV9kID0gKHN1bV9zKnN1bV9zICtzdW1fcipzdW1fcitjMSkqCisgICAgICAgICgoaW50NjRfdCljb3VudCpzdW1fc3Ffcy0oaW50NjRfdClzdW1fcypzdW1fcyArCisgICAgICAgIChpbnQ2NF90KWNvdW50KnN1bV9zcV9yLShpbnQ2NF90KSBzdW1fcipzdW1fciArYzIpIDsKKworICAgIHJldHVybiBzc2ltX24gKiAxLjAgLyBzc2ltX2Q7Cit9CisKK3N0YXRpYyBkb3VibGUgc3NpbV8xNngxNih1bnNpZ25lZCBjaGFyICpzLGludCBzcCwgdW5zaWduZWQgY2hhciAqcixpbnQgcnApCit7CisgICAgdW5zaWduZWQgbG9uZyBzdW1fcz0wLHN1bV9yPTAsc3VtX3NxX3M9MCxzdW1fc3Ffcj0wLHN1bV9zeHI9MDsKKyAgICB2cDhfc3NpbV9wYXJtc18xNngxNihzLCBzcCwgciwgcnAsICZzdW1fcywgJnN1bV9yLCAmc3VtX3NxX3MsICZzdW1fc3FfciwgJnN1bV9zeHIpOworICAgIHJldHVybiBzaW1pbGFyaXR5KHN1bV9zLCBzdW1fciwgc3VtX3NxX3MsIHN1bV9zcV9yLCBzdW1fc3hyLCAyNTYpOworfQorc3RhdGljIGRvdWJsZSBzc2ltXzh4OCh1bnNpZ25lZCBjaGFyICpzLGludCBzcCwgdW5zaWduZWQgY2hhciAqcixpbnQgcnApCit7CisgICAgdW5zaWduZWQgbG9uZyBzdW1fcz0wLHN1bV9yPTAsc3VtX3NxX3M9MCxzdW1fc3Ffcj0wLHN1bV9zeHI9MDsKKyAgICB2cDhfc3NpbV9wYXJtc184eDgocywgc3AsIHIsIHJwLCAmc3VtX3MsICZzdW1fciwgJnN1bV9zcV9zLCAmc3VtX3NxX3IsICZzdW1fc3hyKTsKKyAgICByZXR1cm4gc2ltaWxhcml0eShzdW1fcywgc3VtX3IsIHN1bV9zcV9zLCBzdW1fc3Ffciwgc3VtX3N4ciwgNjQpOworfQorCisvLyBUT0RPOiAoamJiKSB0cmllZCB0byBzY2FsZSB0aGlzIGZ1bmN0aW9uIHN1Y2ggdGhhdCB3ZSBtYXkgYmUgYWJsZSB0byB1c2UgaXQKKy8vIGZvciBkaXN0b3J0aW9uIG1ldHJpYyBpbiBtb2RlIHNlbGVjdGlvbiBjb2RlICggcHJvdmlkZWQgd2UgZG8gYSByZWNvbnN0cnVjdGlvbikKK2xvbmcgZHNzaW0odW5zaWduZWQgY2hhciAqcyxpbnQgc3AsIHVuc2lnbmVkIGNoYXIgKnIsaW50IHJwKQoreworICAgIHVuc2lnbmVkIGxvbmcgc3VtX3M9MCxzdW1fcj0wLHN1bV9zcV9zPTAsc3VtX3NxX3I9MCxzdW1fc3hyPTA7CisgICAgaW50NjRfdCBzc2ltMzsKKyAgICBpbnQ2NF90IHNzaW1fbjEsc3NpbV9uMjsKKyAgICBpbnQ2NF90IHNzaW1fZDEsc3NpbV9kMjsKKyAgICBpbnQ2NF90IHNzaW1fdDEsc3NpbV90MjsKKyAgICBpbnQ2NF90IGMxLCBjMjsKKworICAgIC8vIG5vcm1hbGl6ZSBieSAyNTYvNjQKKyAgICBjMSA9IGNjMSoxNjsKKyAgICBjMiA9IGNjMioxNjsKKworICAgIHZwOF9zc2ltX3Bhcm1zXzE2eDE2KHMsIHNwLCByLCBycCwgJnN1bV9zLCAmc3VtX3IsICZzdW1fc3FfcywgJnN1bV9zcV9yLCAmc3VtX3N4cik7CisgICAgc3NpbV9uMSA9ICgyKnN1bV9zKnN1bV9yKyBjMSk7CisKKyAgICBzc2ltX24yID0oKGludDY0X3QpIDIqMjU2KnN1bV9zeHItKGludDY0X3QpIDIqc3VtX3Mqc3VtX3IrYzIpOworCisgICAgc3NpbV9kMSA9KChpbnQ2NF90KXN1bV9zKnN1bV9zICsoaW50NjRfdClzdW1fcipzdW1fcitjMSk7CisKKyAgICBzc2ltX2QyID0gKDI1NiAqIChpbnQ2NF90KSBzdW1fc3Ffcy0oaW50NjRfdCkgc3VtX3Mqc3VtX3MgKworICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkgMjU2KnN1bV9zcV9yLShpbnQ2NF90KSBzdW1fcipzdW1fciArYzIpIDsKKworICAgIHNzaW1fdDEgPSAyNTYgLSAyNTYgKiBzc2ltX24xIC8gc3NpbV9kMTsKKyAgICBzc2ltX3QyID0gMjU2IC0gMjU2ICogc3NpbV9uMiAvIHNzaW1fZDI7CisKKyAgICBzc2ltMyA9IDI1NiAqc3NpbV90MSAqIHNzaW1fdDI7CisgICAgaWYoc3NpbTMgPDAgKQorICAgICAgICBzc2ltMz0wOworICAgIHJldHVybiAobG9uZykoIHNzaW0zICApOworfQorCisvLyBXZSBhcmUgdXNpbmcgYSA4eDggbW92aW5nIHdpbmRvdyB3aXRoIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIGVhY2ggOHg4IHdpbmRvdworLy8gb24gdGhlIDR4NCBwaXhlbCBncmlkLiBTdWNoIGFycmFuZ2VtZW50IGFsbG93cyB0aGUgd2luZG93cyB0byBvdmVybGFwCisvLyBibG9jayBib3VuZGFyaWVzIHRvIHBlbmFsaXplIGJsb2NraW5nIGFydGlmYWN0cy4KK2RvdWJsZSB2cDhfc3NpbTIKKygKKyAgICB1bnNpZ25lZCBjaGFyICppbWcxLAorICAgIHVuc2lnbmVkIGNoYXIgKmltZzIsCisgICAgaW50IHN0cmlkZV9pbWcxLAorICAgIGludCBzdHJpZGVfaW1nMiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodAorKQoreworICAgIGludCBpLGo7CisgICAgaW50IHNhbXBsZXMgPTA7CisgICAgZG91YmxlIHNzaW1fdG90YWw9MDsKKworICAgIC8vIHNhbXBsZSBwb2ludCBzdGFydCB3aXRoIGVhY2ggNHg0IGxvY2F0aW9uCisgICAgZm9yKGk9MDsgaSA8IGhlaWdodC04OyBpKz00LCBpbWcxICs9IHN0cmlkZV9pbWcxKjQsIGltZzIgKz0gc3RyaWRlX2ltZzIqNCkKKyAgICB7CisgICAgICAgIGZvcihqPTA7IGogPCB3aWR0aC04OyBqKz00ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHYgPSBzc2ltXzh4OChpbWcxK2osIHN0cmlkZV9pbWcxLCBpbWcyK2osIHN0cmlkZV9pbWcyKTsKKyAgICAgICAgICAgIHNzaW1fdG90YWwgKz0gdjsKKyAgICAgICAgICAgIHNhbXBsZXMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBzc2ltX3RvdGFsIC89IHNhbXBsZXM7CisgICAgcmV0dXJuIHNzaW1fdG90YWw7Cit9Citkb3VibGUgdnA4X2NhbGNfc3NpbQorKAorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqc291cmNlLAorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwKKyAgICBpbnQgbHVtYW1hc2ssCisgICAgZG91YmxlICp3ZWlnaHQKKykKK3sKKyAgICBkb3VibGUgYSwgYiwgYzsKKyAgICBkb3VibGUgc3NpbXY7CisKKyAgICBhID0gdnA4X3NzaW0yKHNvdXJjZS0+eV9idWZmZXIsIGRlc3QtPnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICBzb3VyY2UtPnlfc3RyaWRlLCBkZXN0LT55X3N0cmlkZSwgc291cmNlLT55X3dpZHRoLAorICAgICAgICAgICAgICAgICBzb3VyY2UtPnlfaGVpZ2h0KTsKKworICAgIGIgPSB2cDhfc3NpbTIoc291cmNlLT51X2J1ZmZlciwgZGVzdC0+dV9idWZmZXIsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfc3RyaWRlLCBkZXN0LT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfd2lkdGgsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfaGVpZ2h0KTsKKworICAgIGMgPSB2cDhfc3NpbTIoc291cmNlLT52X2J1ZmZlciwgZGVzdC0+dl9idWZmZXIsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfc3RyaWRlLCBkZXN0LT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfd2lkdGgsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfaGVpZ2h0KTsKKworICAgIHNzaW12ID0gYSAqIC44ICsgLjEgKiAoYiArIGMpOworCisgICAgKndlaWdodCA9IDE7CisKKyAgICByZXR1cm4gc3NpbXY7Cit9CisKK2RvdWJsZSB2cDhfY2FsY19zc2ltZworKAorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqc291cmNlLAorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwKKyAgICBkb3VibGUgKnNzaW1feSwKKyAgICBkb3VibGUgKnNzaW1fdSwKKyAgICBkb3VibGUgKnNzaW1fdgorKQoreworICAgIGRvdWJsZSBzc2ltX2FsbCA9IDA7CisgICAgZG91YmxlIGEsIGIsIGM7CisKKyAgICBhID0gdnA4X3NzaW0yKHNvdXJjZS0+eV9idWZmZXIsIGRlc3QtPnlfYnVmZmVyLAorICAgICAgICAgICAgICAgICBzb3VyY2UtPnlfc3RyaWRlLCBkZXN0LT55X3N0cmlkZSwgc291cmNlLT55X3dpZHRoLAorICAgICAgICAgICAgICAgICBzb3VyY2UtPnlfaGVpZ2h0KTsKKworICAgIGIgPSB2cDhfc3NpbTIoc291cmNlLT51X2J1ZmZlciwgZGVzdC0+dV9idWZmZXIsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfc3RyaWRlLCBkZXN0LT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfd2lkdGgsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfaGVpZ2h0KTsKKworICAgIGMgPSB2cDhfc3NpbTIoc291cmNlLT52X2J1ZmZlciwgZGVzdC0+dl9idWZmZXIsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfc3RyaWRlLCBkZXN0LT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfd2lkdGgsCisgICAgICAgICAgICAgICAgIHNvdXJjZS0+dXZfaGVpZ2h0KTsKKyAgICAqc3NpbV95ID0gYTsKKyAgICAqc3NpbV91ID0gYjsKKyAgICAqc3NpbV92ID0gYzsKKyAgICBzc2ltX2FsbCA9IChhICogNCArIGIgKyBjKSAvNjsKKworICAgIHJldHVybiBzc2ltX2FsbDsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuYyBiL2xpYnZweC92cDgvZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNhZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3RlbXBvcmFsX2ZpbHRlci5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCisjaW5jbHVkZSAib255eF9pbnQuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgorI2luY2x1ZGUgInF1YW50aXplLmgiCisjaW5jbHVkZSAidnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIgorI2luY2x1ZGUgIm1jb21wLmgiCisjaW5jbHVkZSAiZmlyc3RwYXNzLmgiCisjaW5jbHVkZSAicHNuci5oIgorI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCisjaW5jbHVkZSAicmF0ZWN0cmwuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oIgorI2luY2x1ZGUgInNlZ21lbnRhdGlvbi5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL3RocmVhZGluZy5oIgorI2luY2x1ZGUgInZweF9wb3J0cy92cHhfdGltZXIuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2RlZmluZSBBTFRfUkVGX01DX0VOQUJMRUQgMSAgICAvKiBkaXMvZW5hYmxlIE1DIGluIEFsdFJlZiBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgQUxUX1JFRl9TVUJQRUxfRU5BQkxFRCAxIC8qIGRpcy9lbmFibGUgc3VicGVsIGluIE1DIEFsdFJlZiBmaWx0ZXJpbmcgKi8KKworI2lmIFZQOF9URU1QT1JBTF9BTFRfUkVGCisKK3N0YXRpYyB2b2lkIHZwOF90ZW1wb3JhbF9maWx0ZXJfcHJlZGljdG9yc19tYl9jCisoCisgICAgTUFDUk9CTE9DS0QgKngsCisgICAgdW5zaWduZWQgY2hhciAqeV9tYl9wdHIsCisgICAgdW5zaWduZWQgY2hhciAqdV9tYl9wdHIsCisgICAgdW5zaWduZWQgY2hhciAqdl9tYl9wdHIsCisgICAgaW50IHN0cmlkZSwKKyAgICBpbnQgbXZfcm93LAorICAgIGludCBtdl9jb2wsCisgICAgdW5zaWduZWQgY2hhciAqcHJlZAorKQoreworICAgIGludCBvZmZzZXQ7CisgICAgdW5zaWduZWQgY2hhciAqeXB0ciwgKnVwdHIsICp2cHRyOworCisgICAgLyogWSAqLworICAgIHlwdHIgPSB5X21iX3B0ciArIChtdl9yb3cgPj4gMykgKiBzdHJpZGUgKyAobXZfY29sID4+IDMpOworCisgICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKKyAgICB7CisgICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3QxNngxNih5cHRyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCAmcHJlZFswXSwgMTYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfY29weV9tZW0xNngxNih5cHRyLCBzdHJpZGUsICZwcmVkWzBdLCAxNik7CisgICAgfQorCisgICAgLyogVSAmIFYgKi8KKyAgICBtdl9yb3cgPj49IDE7CisgICAgbXZfY29sID4+PSAxOworICAgIHN0cmlkZSA9IChzdHJpZGUgKyAxKSA+PiAxOworICAgIG9mZnNldCA9IChtdl9yb3cgPj4gMykgKiBzdHJpZGUgKyAobXZfY29sID4+IDMpOworICAgIHVwdHIgPSB1X21iX3B0ciArIG9mZnNldDsKKyAgICB2cHRyID0gdl9tYl9wdHIgKyBvZmZzZXQ7CisKKyAgICBpZiAoKG12X3JvdyB8IG12X2NvbCkgJiA3KQorICAgIHsKKyAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OCh1cHRyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfY29sICYgNywgbXZfcm93ICYgNywgJnByZWRbMjU2XSwgOCk7CisgICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3Q4eDgodnB0ciwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsICZwcmVkWzMyMF0sIDgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2cDhfY29weV9tZW04eDgodXB0ciwgc3RyaWRlLCAmcHJlZFsyNTZdLCA4KTsKKyAgICAgICAgdnA4X2NvcHlfbWVtOHg4KHZwdHIsIHN0cmlkZSwgJnByZWRbMzIwXSwgOCk7CisgICAgfQorfQordm9pZCB2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5X2MKKygKKyAgICB1bnNpZ25lZCBjaGFyICpmcmFtZTEsCisgICAgdW5zaWduZWQgaW50IHN0cmlkZSwKKyAgICB1bnNpZ25lZCBjaGFyICpmcmFtZTIsCisgICAgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsCisgICAgaW50IHN0cmVuZ3RoLAorICAgIGludCBmaWx0ZXJfd2VpZ2h0LAorICAgIHVuc2lnbmVkIGludCAqYWNjdW11bGF0b3IsCisgICAgdW5zaWduZWQgc2hvcnQgKmNvdW50CispCit7CisgICAgdW5zaWduZWQgaW50IGksIGosIGs7CisgICAgaW50IG1vZGlmaWVyOworICAgIGludCBieXRlID0gMDsKKworICAgIGZvciAoaSA9IDAsayA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2tfc2l6ZTsgaisrLCBrKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgaW50IHNyY19ieXRlID0gZnJhbWUxW2J5dGVdOworICAgICAgICAgICAgaW50IHBpeGVsX3ZhbHVlID0gKmZyYW1lMisrOworCisgICAgICAgICAgICBtb2RpZmllciAgID0gc3JjX2J5dGUgLSBwaXhlbF92YWx1ZTsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uIG9mOgorICAgICAgICAgICAgICogZmxvYXQgY29lZmYgPSAoMy4wICogbW9kaWZlciAqIG1vZGlmaWVyKSAvIHBvdygyLCBzdHJlbmd0aCk7CisgICAgICAgICAgICAgKiBtb2RpZmllciA9ICAoaW50KXJvdW5kZihjb2VmZiA+IDE2ID8gMCA6IDE2LWNvZWZmKTsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbW9kaWZpZXIgICo9IG1vZGlmaWVyOworICAgICAgICAgICAgbW9kaWZpZXIgICo9IDM7CisgICAgICAgICAgICBtb2RpZmllciAgKz0gMSA8PCAoc3RyZW5ndGggLSAxKTsKKyAgICAgICAgICAgIG1vZGlmaWVyID4+PSBzdHJlbmd0aDsKKworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID4gMTYpCisgICAgICAgICAgICAgICAgbW9kaWZpZXIgPSAxNjsKKworICAgICAgICAgICAgbW9kaWZpZXIgPSAxNiAtIG1vZGlmaWVyOworICAgICAgICAgICAgbW9kaWZpZXIgKj0gZmlsdGVyX3dlaWdodDsKKworICAgICAgICAgICAgY291bnRba10gKz0gbW9kaWZpZXI7CisgICAgICAgICAgICBhY2N1bXVsYXRvcltrXSArPSBtb2RpZmllciAqIHBpeGVsX3ZhbHVlOworCisgICAgICAgICAgICBieXRlKys7CisgICAgICAgIH0KKworICAgICAgICBieXRlICs9IHN0cmlkZSAtIGJsb2NrX3NpemU7CisgICAgfQorfQorCisjaWYgQUxUX1JFRl9NQ19FTkFCTEVECisKK3N0YXRpYyBpbnQgdnA4X3RlbXBvcmFsX2ZpbHRlcl9maW5kX21hdGNoaW5nX21iX2MKKygKKyAgICBWUDhfQ09NUCAqY3BpLAorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqYXJmX2ZyYW1lLAorICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZnJhbWVfcHRyLAorICAgIGludCBtYl9vZmZzZXQsCisgICAgaW50IGVycm9yX3RocmVzaAorKQoreworICAgIE1BQ1JPQkxPQ0sgKnggPSAmY3BpLT5tYjsKKyAgICBpbnQgc3RlcF9wYXJhbTsKKyAgICBpbnQgc2FkcGIgPSB4LT5zYWRwZXJiaXQxNjsKKyAgICBpbnQgYmVzdHNtZSA9IElOVF9NQVg7CisKKyAgICBCTE9DSyAqYiA9ICZ4LT5ibG9ja1swXTsKKyAgICBCTE9DS0QgKmQgPSAmeC0+ZV9tYmQuYmxvY2tbMF07CisgICAgaW50X212IGJlc3RfcmVmX212MTsKKyAgICBpbnRfbXYgYmVzdF9yZWZfbXYxX2Z1bGw7IC8qIGZ1bGwtcGl4ZWwgdmFsdWUgb2YgYmVzdF9yZWZfbXYxICovCisKKyAgICAvKiBTYXZlIGlucHV0IHN0YXRlICovCisgICAgdW5zaWduZWQgY2hhciAqKmJhc2Vfc3JjID0gYi0+YmFzZV9zcmM7CisgICAgaW50IHNyYyA9IGItPnNyYzsKKyAgICBpbnQgc3JjX3N0cmlkZSA9IGItPnNyY19zdHJpZGU7CisgICAgdW5zaWduZWQgY2hhciAqYmFzZV9wcmUgPSB4LT5lX21iZC5wcmUueV9idWZmZXI7CisgICAgaW50IHByZSA9IGQtPm9mZnNldDsKKyAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmVfbWJkLnByZS55X3N0cmlkZTsKKworICAgIGJlc3RfcmVmX212MS5hc19pbnQgPSAwOworICAgIGJlc3RfcmVmX212MV9mdWxsLmFzX212LmNvbCA9IGJlc3RfcmVmX212MS5hc19tdi5jb2wgPj4zOworICAgIGJlc3RfcmVmX212MV9mdWxsLmFzX212LnJvdyA9IGJlc3RfcmVmX212MS5hc19tdi5yb3cgPj4zOworCisgICAgLyogU2V0dXAgZnJhbWUgcG9pbnRlcnMgKi8KKyAgICBiLT5iYXNlX3NyYyA9ICZhcmZfZnJhbWUtPnlfYnVmZmVyOworICAgIGItPnNyY19zdHJpZGUgPSBhcmZfZnJhbWUtPnlfc3RyaWRlOworICAgIGItPnNyYyA9IG1iX29mZnNldDsKKworICAgIHgtPmVfbWJkLnByZS55X2J1ZmZlciA9IGZyYW1lX3B0ci0+eV9idWZmZXI7CisgICAgeC0+ZV9tYmQucHJlLnlfc3RyaWRlID0gZnJhbWVfcHRyLT55X3N0cmlkZTsKKyAgICBkLT5vZmZzZXQgPSBtYl9vZmZzZXQ7CisKKyAgICAvKiBGdXJ0aGVyIHN0ZXAvZGlhbW9uZCBzZWFyY2hlcyBhcyBuZWNlc3NhcnkgKi8KKyAgICBpZiAoY3BpLT5TcGVlZCA8IDgpCisgICAgeworICAgICAgICBzdGVwX3BhcmFtID0gY3BpLT5zZi5maXJzdF9zdGVwICsgKGNwaS0+U3BlZWQgPiA1KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RlcF9wYXJhbSA9IGNwaS0+c2YuZmlyc3Rfc3RlcCArIDI7CisgICAgfQorCisgICAgLyogVE9ETyBDaGVjayB0aGF0IHRoZSAxNngxNiB2ZiAmIHNkZiBhcmUgc2VsZWN0ZWQgaGVyZSAqLworICAgIC8qIElnbm9yZSBtdiBjb3N0aW5nIGJ5IHNlbmRpbmcgTlVMTCBjb3N0IGFycmF5cyAqLworICAgIGJlc3RzbWUgPSB2cDhfaGV4X3NlYXJjaCh4LCBiLCBkLCAmYmVzdF9yZWZfbXYxX2Z1bGwsICZkLT5ibWkubXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0sIHNhZHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmYmVzdF9yZWZfbXYxKTsKKworI2lmIEFMVF9SRUZfU1VCUEVMX0VOQUJMRUQKKyAgICAvKiBUcnkgc3ViLXBpeGVsIE1DPyAqLworICAgIHsKKyAgICAgICAgaW50IGRpc3RvcnRpb247CisgICAgICAgIHVuc2lnbmVkIGludCBzc2U7CisgICAgICAgIC8qIElnbm9yZSBtdiBjb3N0aW5nIGJ5IHNlbmRpbmcgTlVMTCBjb3N0IGFycmF5ICovCisgICAgICAgIGJlc3RzbWUgPSBjcGktPmZpbmRfZnJhY3Rpb25hbF9tdl9zdGVwKHgsIGIsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5ibWkubXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiZXN0X3JlZl9tdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmVycm9ycGVyYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmZGlzdG9ydGlvbiwgJnNzZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBTYXZlIGlucHV0IHN0YXRlICovCisgICAgYi0+YmFzZV9zcmMgPSBiYXNlX3NyYzsKKyAgICBiLT5zcmMgPSBzcmM7CisgICAgYi0+c3JjX3N0cmlkZSA9IHNyY19zdHJpZGU7CisgICAgeC0+ZV9tYmQucHJlLnlfYnVmZmVyID0gYmFzZV9wcmU7CisgICAgZC0+b2Zmc2V0ID0gcHJlOworICAgIHgtPmVfbWJkLnByZS55X3N0cmlkZSA9IHByZV9zdHJpZGU7CisKKyAgICByZXR1cm4gYmVzdHNtZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2cDhfdGVtcG9yYWxfZmlsdGVyX2l0ZXJhdGVfYworKAorICAgIFZQOF9DT01QICpjcGksCisgICAgaW50IGZyYW1lX2NvdW50LAorICAgIGludCBhbHRfcmVmX2luZGV4LAorICAgIGludCBzdHJlbmd0aAorKQoreworICAgIGludCBieXRlOworICAgIGludCBmcmFtZTsKKyAgICBpbnQgbWJfY29sLCBtYl9yb3c7CisgICAgdW5zaWduZWQgaW50IGZpbHRlcl93ZWlnaHQ7CisgICAgaW50IG1iX2NvbHMgPSBjcGktPmNvbW1vbi5tYl9jb2xzOworICAgIGludCBtYl9yb3dzID0gY3BpLT5jb21tb24ubWJfcm93czsKKyAgICBpbnQgbWJfeV9vZmZzZXQgPSAwOworICAgIGludCBtYl91dl9vZmZzZXQgPSAwOworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgaW50LCBhY2N1bXVsYXRvciwgMTYqMTYgKyA4KjggKyA4KjgpOworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIGNvdW50LCAxNioxNiArIDgqOCArIDgqOCk7CisgICAgTUFDUk9CTE9DS0QgKm1iZCA9ICZjcGktPm1iLmVfbWJkOworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZiA9IGNwaS0+ZnJhbWVzW2FsdF9yZWZfaW5kZXhdOworICAgIHVuc2lnbmVkIGNoYXIgKmRzdDEsICpkc3QyOworICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgY2hhciwgIHByZWRpY3RvciwgMTYqMTYgKyA4KjggKyA4KjgpOworCisgICAgLyogU2F2ZSBpbnB1dCBzdGF0ZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKnlfYnVmZmVyID0gbWJkLT5wcmUueV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciAqdV9idWZmZXIgPSBtYmQtPnByZS51X2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBjaGFyICp2X2J1ZmZlciA9IG1iZC0+cHJlLnZfYnVmZmVyOworCisgICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCBtYl9yb3dzOyBtYl9yb3crKykKKyAgICB7CisjaWYgQUxUX1JFRl9NQ19FTkFCTEVECisgICAgICAgIC8qIFNvdXJjZSBmcmFtZXMgYXJlIGV4dGVuZGVkIHRvIDE2IHBpeGVscy4gIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4KKyAgICAgICAgICogIEwvQS9HIHJlZmVyZW5jZSBmcmFtZXMgdGhhdCBoYXZlIGEgYm9yZGVyIG9mIDMyIChWUDhCT1JERVJJTlBJWEVMUykKKyAgICAgICAgICogQSA2IHRhcCBmaWx0ZXIgaXMgdXNlZCBmb3IgbW90aW9uIHNlYXJjaC4gIFRoaXMgcmVxdWlyZXMgMiBwaXhlbHMKKyAgICAgICAgICogIGJlZm9yZSBhbmQgMyBwaXhlbHMgYWZ0ZXIuICBTbyB0aGUgbGFyZ2VzdCBZIG12IG9uIGEgYm9yZGVyIHdvdWxkCisgICAgICAgICAqICB0aGVuIGJlIDE2IC0gMy4gIFRoZSBVViBibG9ja3MgYXJlIGhhbGYgdGhlIHNpemUgb2YgdGhlIFkgYW5kCisgICAgICAgICAqICB0aGVyZWZvcmUgb25seSBleHRlbmRlZCBieSA4LiAgVGhlIGxhcmdlc3QgbXYgdGhhdCBhIFVWIGJsb2NrCisgICAgICAgICAqICBjYW4gc3VwcG9ydCBpcyA4IC0gMy4gIEEgVVYgbXYgaXMgaGFsZiBvZiBhIFkgbXYuCisgICAgICAgICAqICAoMTYgLSAzKSA+PiAxID09IDYgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDggLSAzLgorICAgICAgICAgKiBUbyBrZWVwIHRoZSBtdiBpbiBwbGF5IGZvciBib3RoIFkgYW5kIFVWIHBsYW5lcyB0aGUgbWF4IHRoYXQgaXQKKyAgICAgICAgICogIGNhbiBiZSBvbiBhIGJvcmRlciBpcyB0aGVyZWZvcmUgMTYgLSA1LgorICAgICAgICAgKi8KKyAgICAgICAgY3BpLT5tYi5tdl9yb3dfbWluID0gLSgobWJfcm93ICogMTYpICsgKDE2IC0gNSkpOworICAgICAgICBjcGktPm1iLm12X3Jvd19tYXggPSAoKGNwaS0+Y29tbW9uLm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgxNiAtIDUpOworI2VuZGlmCisKKyAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBtYl9jb2xzOyBtYl9jb2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGksIGosIGs7CisgICAgICAgICAgICBpbnQgc3RyaWRlOworCisgICAgICAgICAgICB2cHhfbWVtc2V0KGFjY3VtdWxhdG9yLCAwLCAzODQqc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgICAgICAgICAgdnB4X21lbXNldChjb3VudCwgMCwgMzg0KnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCisjaWYgQUxUX1JFRl9NQ19FTkFCTEVECisgICAgICAgICAgICBjcGktPm1iLm12X2NvbF9taW4gPSAtKChtYl9jb2wgKiAxNikgKyAoMTYgLSA1KSk7CisgICAgICAgICAgICBjcGktPm1iLm12X2NvbF9tYXggPSAoKGNwaS0+Y29tbW9uLm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMTYgLSA1KTsKKyNlbmRpZgorCisgICAgICAgICAgICBmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBmcmFtZV9jb3VudDsgZnJhbWUrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5mcmFtZXNbZnJhbWVdID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgbWJkLT5ibG9ja1swXS5ibWkubXYuYXNfbXYucm93ID0gMDsKKyAgICAgICAgICAgICAgICBtYmQtPmJsb2NrWzBdLmJtaS5tdi5hc19tdi5jb2wgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lID09IGFsdF9yZWZfaW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfd2VpZ2h0ID0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IDA7CisjaWYgQUxUX1JFRl9NQ19FTkFCTEVECisjZGVmaW5lIFRIUkVTSF9MT1cgICAxMDAwMAorI2RlZmluZSBUSFJFU0hfSElHSCAgMjAwMDAKKyAgICAgICAgICAgICAgICAgICAgLyogRmluZCBiZXN0IG1hdGNoIGluIHRoaXMgZnJhbWUgYnkgTUMgKi8KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdnA4X3RlbXBvcmFsX2ZpbHRlcl9maW5kX21hdGNoaW5nX21iX2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNbYWx0X3JlZl9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNbZnJhbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3lfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVTSF9MT1cpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIEFzc2lnbiBoaWdoZXIgd2VpZ2h0IHRvIG1hdGNoaW5nIE1CIGlmIGl0J3MgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICogc2NvcmUgaXMgbG93ZXIuIElmIG5vdCBhcHBseWluZyBNQyBkZWZhdWx0IGJlaGF2aW9yCisgICAgICAgICAgICAgICAgICAgICAqIGlzIHRvIHdlaWdodCBhbGwgTUJzIGVxdWFsLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3dlaWdodCA9IGVycjxUSFJFU0hfTE9XCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBlcnI8VEhSRVNIX0hJR0ggPyAxIDogMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyX3dlaWdodCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29uc3RydWN0IHRoZSBwcmVkaWN0b3JzICovCisgICAgICAgICAgICAgICAgICAgIHZwOF90ZW1wb3JhbF9maWx0ZXJfcHJlZGljdG9yc19tYl9jCisgICAgICAgICAgICAgICAgICAgICAgICAobWJkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzW2ZyYW1lXS0+eV9idWZmZXIgKyBtYl95X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmZyYW1lc1tmcmFtZV0tPnVfYnVmZmVyICsgbWJfdXZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzW2ZyYW1lXS0+dl9idWZmZXIgKyBtYl91dl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNbZnJhbWVdLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYmQtPmJsb2NrWzBdLmJtaS5tdi5hc19tdi5yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgbWJkLT5ibG9ja1swXS5ibWkubXYuYXNfbXYuY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rvcik7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQXBwbHkgdGhlIGZpbHRlciAoWVVWKSAqLworICAgICAgICAgICAgICAgICAgICB2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAoZi0+eV9idWZmZXIgKyBtYl95X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisKKyAgICAgICAgICAgICAgICAgICAgdnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseQorICAgICAgICAgICAgICAgICAgICAgICAgKGYtPnVfYnVmZmVyICsgbWJfdXZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGYtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3IgKyAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yICsgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICsgMjU2KTsKKworICAgICAgICAgICAgICAgICAgICB2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAoZi0+dl9idWZmZXIgKyBtYl91dl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZi0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciArIDMyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl93ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKyAzMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKyAzMjApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTm9ybWFsaXplIGZpbHRlciBvdXRwdXQgdG8gcHJvZHVjZSBBbHRSZWYgZnJhbWUgKi8KKyAgICAgICAgICAgIGRzdDEgPSBjcGktPmFsdF9yZWZfYnVmZmVyLnlfYnVmZmVyOworICAgICAgICAgICAgc3RyaWRlID0gY3BpLT5hbHRfcmVmX2J1ZmZlci55X3N0cmlkZTsKKyAgICAgICAgICAgIGJ5dGUgPSBtYl95X29mZnNldDsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsayA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrLCBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHZhbCA9IGFjY3VtdWxhdG9yW2tdICsgKGNvdW50W2tdID4+IDEpOworICAgICAgICAgICAgICAgICAgICBwdmFsICo9IGNwaS0+Zml4ZWRfZGl2aWRlW2NvdW50W2tdXTsKKyAgICAgICAgICAgICAgICAgICAgcHZhbCA+Pj0gMTk7CisKKyAgICAgICAgICAgICAgICAgICAgZHN0MVtieXRlXSA9ICh1bnNpZ25lZCBjaGFyKXB2YWw7CisKKyAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0byBuZXh0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIGJ5dGUrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlICs9IHN0cmlkZSAtIDE2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3QxID0gY3BpLT5hbHRfcmVmX2J1ZmZlci51X2J1ZmZlcjsKKyAgICAgICAgICAgIGRzdDIgPSBjcGktPmFsdF9yZWZfYnVmZmVyLnZfYnVmZmVyOworICAgICAgICAgICAgc3RyaWRlID0gY3BpLT5hbHRfcmVmX2J1ZmZlci51dl9zdHJpZGU7CisgICAgICAgICAgICBieXRlID0gbWJfdXZfb2Zmc2V0OworICAgICAgICAgICAgZm9yIChpID0gMCxrID0gMjU2OyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyssIGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtPWsrNjQ7CisKKyAgICAgICAgICAgICAgICAgICAgLyogVSAqLworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHZhbCA9IGFjY3VtdWxhdG9yW2tdICsgKGNvdW50W2tdID4+IDEpOworICAgICAgICAgICAgICAgICAgICBwdmFsICo9IGNwaS0+Zml4ZWRfZGl2aWRlW2NvdW50W2tdXTsKKyAgICAgICAgICAgICAgICAgICAgcHZhbCA+Pj0gMTk7CisgICAgICAgICAgICAgICAgICAgIGRzdDFbYnl0ZV0gPSAodW5zaWduZWQgY2hhcilwdmFsOworCisgICAgICAgICAgICAgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgICAgICAgICAgcHZhbCA9IGFjY3VtdWxhdG9yW21dICsgKGNvdW50W21dID4+IDEpOworICAgICAgICAgICAgICAgICAgICBwdmFsICo9IGNwaS0+Zml4ZWRfZGl2aWRlW2NvdW50W21dXTsKKyAgICAgICAgICAgICAgICAgICAgcHZhbCA+Pj0gMTk7CisgICAgICAgICAgICAgICAgICAgIGRzdDJbYnl0ZV0gPSAodW5zaWduZWQgY2hhcilwdmFsOworCisgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgdG8gbmV4dCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICBieXRlKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZSArPSBzdHJpZGUgLSA4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYl95X29mZnNldCArPSAxNjsKKyAgICAgICAgICAgIG1iX3V2X29mZnNldCArPSA4OworICAgICAgICB9CisKKyAgICAgICAgbWJfeV9vZmZzZXQgKz0gMTYqKGYtPnlfc3RyaWRlLW1iX2NvbHMpOworICAgICAgICBtYl91dl9vZmZzZXQgKz0gOCooZi0+dXZfc3RyaWRlLW1iX2NvbHMpOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgaW5wdXQgc3RhdGUgKi8KKyAgICBtYmQtPnByZS55X2J1ZmZlciA9IHlfYnVmZmVyOworICAgIG1iZC0+cHJlLnVfYnVmZmVyID0gdV9idWZmZXI7CisgICAgbWJkLT5wcmUudl9idWZmZXIgPSB2X2J1ZmZlcjsKK30KKwordm9pZCB2cDhfdGVtcG9yYWxfZmlsdGVyX3ByZXBhcmVfYworKAorICAgIFZQOF9DT01QICpjcGksCisgICAgaW50IGRpc3RhbmNlCispCit7CisgICAgaW50IGZyYW1lID0gMDsKKworICAgIGludCBudW1fZnJhbWVzX2JhY2t3YXJkID0gMDsKKyAgICBpbnQgbnVtX2ZyYW1lc19mb3J3YXJkID0gMDsKKyAgICBpbnQgZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgPSAwOworICAgIGludCBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID0gMDsKKyAgICBpbnQgZnJhbWVzX3RvX2JsdXIgPSAwOworICAgIGludCBzdGFydF9mcmFtZSA9IDA7CisKKyAgICBpbnQgc3RyZW5ndGggPSBjcGktPm94Y2YuYXJucl9zdHJlbmd0aDsKKworICAgIGludCBibHVyX3R5cGUgPSBjcGktPm94Y2YuYXJucl90eXBlOworCisgICAgaW50IG1heF9mcmFtZXMgPSBjcGktPmFjdGl2ZV9hcm5yX2ZyYW1lczsKKworICAgIG51bV9mcmFtZXNfYmFja3dhcmQgPSBkaXN0YW5jZTsKKyAgICBudW1fZnJhbWVzX2ZvcndhcmQgPSB2cDhfbG9va2FoZWFkX2RlcHRoKGNwaS0+bG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKG51bV9mcmFtZXNfYmFja3dhcmQgKyAxKTsKKworICAgIHN3aXRjaCAoYmx1cl90eXBlKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICAgIC8qIEJhY2t3YXJkIEJsdXIgKi8KKworICAgICAgICBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA9IG51bV9mcmFtZXNfYmFja3dhcmQ7CisKKyAgICAgICAgaWYgKGZyYW1lc190b19ibHVyX2JhY2t3YXJkID49IG1heF9mcmFtZXMpCisgICAgICAgICAgICBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA9IG1heF9mcmFtZXMgLSAxOworCisgICAgICAgIGZyYW1lc190b19ibHVyID0gZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgKyAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgICAgLyogRm9yd2FyZCBCbHVyICovCisKKyAgICAgICAgZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCA9IG51bV9mcmFtZXNfZm9yd2FyZDsKKworICAgICAgICBpZiAoZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCA+PSBtYXhfZnJhbWVzKQorICAgICAgICAgICAgZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCA9IG1heF9mcmFtZXMgLSAxOworCisgICAgICAgIGZyYW1lc190b19ibHVyID0gZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCArIDE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIENlbnRlciBCbHVyICovCisgICAgICAgIGZyYW1lc190b19ibHVyX2ZvcndhcmQgPSBudW1fZnJhbWVzX2ZvcndhcmQ7CisgICAgICAgIGZyYW1lc190b19ibHVyX2JhY2t3YXJkID0gbnVtX2ZyYW1lc19iYWNrd2FyZDsKKworICAgICAgICBpZiAoZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCA+IGZyYW1lc190b19ibHVyX2JhY2t3YXJkKQorICAgICAgICAgICAgZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCA9IGZyYW1lc190b19ibHVyX2JhY2t3YXJkOworCisgICAgICAgIGlmIChmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA+IGZyYW1lc190b19ibHVyX2ZvcndhcmQpCisgICAgICAgICAgICBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA9IGZyYW1lc190b19ibHVyX2ZvcndhcmQ7CisKKyAgICAgICAgLyogV2hlbiBtYXhfZnJhbWVzIGlzIGV2ZW4gd2UgaGF2ZSAxIG1vcmUgZnJhbWUgYmFja3dhcmQgdGhhbiBmb3J3YXJkICovCisgICAgICAgIGlmIChmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID4gKG1heF9mcmFtZXMgLSAxKSAvIDIpCisgICAgICAgICAgICBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID0gKChtYXhfZnJhbWVzIC0gMSkgLyAyKTsKKworICAgICAgICBpZiAoZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgPiAobWF4X2ZyYW1lcyAvIDIpKQorICAgICAgICAgICAgZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgPSAobWF4X2ZyYW1lcyAvIDIpOworCisgICAgICAgIGZyYW1lc190b19ibHVyID0gZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgKyBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkICsgMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RhcnRfZnJhbWUgPSBkaXN0YW5jZSArIGZyYW1lc190b19ibHVyX2ZvcndhcmQ7CisKKyAgICAvKiBTZXR1cCBmcmFtZSBwb2ludGVycywgTlVMTCBpbmRpY2F0ZXMgZnJhbWUgbm90IGluY2x1ZGVkIGluIGZpbHRlciAqLworICAgIHZweF9tZW1zZXQoY3BpLT5mcmFtZXMsIDAsIG1heF9mcmFtZXMqc2l6ZW9mKFlWMTJfQlVGRkVSX0NPTkZJRyAqKSk7CisgICAgZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgZnJhbWVzX3RvX2JsdXI7IGZyYW1lKyspCisgICAgeworICAgICAgICBpbnQgd2hpY2hfYnVmZmVyID0gIHN0YXJ0X2ZyYW1lIC0gZnJhbWU7CisgICAgICAgIHN0cnVjdCBsb29rYWhlYWRfZW50cnkqIGJ1ZiA9IHZwOF9sb29rYWhlYWRfcGVlayhjcGktPmxvb2thaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFRUtfRk9SV0FSRCk7CisgICAgICAgIGNwaS0+ZnJhbWVzW2ZyYW1lc190b19ibHVyLTEtZnJhbWVdID0gJmJ1Zi0+aW1nOworICAgIH0KKworICAgIHZwOF90ZW1wb3JhbF9maWx0ZXJfaXRlcmF0ZV9jICgKKyAgICAgICAgY3BpLAorICAgICAgICBmcmFtZXNfdG9fYmx1ciwKKyAgICAgICAgZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQsCisgICAgICAgIHN0cmVuZ3RoICk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci90b2tlbml6ZS5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3Rva2VuaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MjY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci90b2tlbml6ZS5jCkBAIC0wLDAgKzEsNjA0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgIm9ueXhfaW50LmgiCisjaW5jbHVkZSAidG9rZW5pemUuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKworLyogR2xvYmFsIGV2ZW50IGNvdW50ZXJzIHVzZWQgZm9yIGFjY3VtdWxhdGluZyBzdGF0aXN0aWNzIGFjcm9zcyBzZXZlcmFsCisgICBjb21wcmVzc2lvbnMsIHRoZW4gZ2VuZXJhdGluZyBjb250ZXh0LmMgPSBpbml0aWFsIHN0YXRzLiAqLworCisjaWZkZWYgRU5UUk9QWV9TVEFUUworX2ludDY0IGNvbnRleHRfY291bnRlcnNbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbTUFYX0VOVFJPUFlfVE9LRU5TXTsKKyNlbmRpZgordm9pZCB2cDhfc3R1ZmZfbWIoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgVE9LRU5FWFRSQSAqKnQpIDsKK3ZvaWQgdnA4X2ZpeF9jb250ZXh0cyhNQUNST0JMT0NLRCAqeCk7CisKKyNpbmNsdWRlICJkY3RfdmFsdWVfdG9rZW5zLmgiCisjaW5jbHVkZSAiZGN0X3ZhbHVlX2Nvc3QuaCIKKworY29uc3QgVE9LRU5WQUxVRSAqY29uc3QgdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyID0gZGN0X3ZhbHVlX3Rva2VucyArCisgICAgICAgIERDVF9NQVhfVkFMVUU7Citjb25zdCBzaG9ydCAqY29uc3QgdnA4X2RjdF92YWx1ZV9jb3N0X3B0ciA9IGRjdF92YWx1ZV9jb3N0ICsgRENUX01BWF9WQUxVRTsKKworI2lmIDAKK2ludCBza2lwX3RydWVfY291bnQgPSAwOworaW50IHNraXBfZmFsc2VfY291bnQgPSAwOworI2VuZGlmCisKKy8qIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgZGN0X3ZhbHVlX3Rva2VucyBhbmQgZGN0X3ZhbHVlX2Nvc3QgdGFibGVzICovCisvKgorc3RhdGljIHZvaWQgZmlsbF92YWx1ZV90b2tlbnMoKQoreworCisgICAgVE9LRU5WQUxVRSAqdCA9IGRjdF92YWx1ZV90b2tlbnMgKyBEQ1RfTUFYX1ZBTFVFOworICAgIGNvbnN0IHZwOF9leHRyYV9iaXRfc3RydWN0ICplID0gdnA4X2V4dHJhX2JpdHM7CisKKyAgICBpbnQgaSA9IC1EQ1RfTUFYX1ZBTFVFOworICAgIGludCBzaWduID0gMTsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAoIWkpCisgICAgICAgICAgICBzaWduID0gMDsKKworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgYSA9IHNpZ24gPyAtaSA6IGk7CisgICAgICAgICAgICBpbnQgZWIgPSBzaWduOworCisgICAgICAgICAgICBpZiAoYSA+IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGogPSA0OworCisgICAgICAgICAgICAgICAgd2hpbGUgKCsraiA8IDExICAmJiAgZVtqXS5iYXNlX3ZhbCA8PSBhKSB7fQorCisgICAgICAgICAgICAgICAgdFtpXS5Ub2tlbiA9IC0tajsKKyAgICAgICAgICAgICAgICBlYiB8PSAoYSAtIGVbal0uYmFzZV92YWwpIDw8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdFtpXS5Ub2tlbiA9IGE7CisKKyAgICAgICAgICAgIHRbaV0uRXh0cmEgPSBlYjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNvc3QgZm9yIGV4dHJhIGJpdHMgZm9yIGFsbCBwb3NzaWJsZSBjb2VmZmljaWVudCB2YWx1ZS4KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvc3QgPSAwOworICAgICAgICAgICAgY29uc3QgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKnAgPSB2cDhfZXh0cmFfYml0cyArIHRbaV0uVG9rZW47CisKKyAgICAgICAgICAgIGlmIChwLT5iYXNlX3ZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZXh0cmEgPSB0W2ldLkV4dHJhOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBMZW5ndGggPSBwLT5MZW47CisKKyAgICAgICAgICAgICAgICBpZiAoTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBjb3N0ICs9IHZwOF90cmVlZF9jb3N0KHAtPnRyZWUsIHAtPnByb2IsIGV4dHJhID4+IDEsIExlbmd0aCk7CisKKyAgICAgICAgICAgICAgICBjb3N0ICs9IHZwOF9jb3N0X2JpdCh2cDhfcHJvYl9oYWxmLCBleHRyYSAmIDEpOyAvLyBzaWduCisgICAgICAgICAgICAgICAgZGN0X3ZhbHVlX2Nvc3RbaSArIERDVF9NQVhfVkFMVUVdID0gY29zdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisgICAgd2hpbGUgKCsraSA8IERDVF9NQVhfVkFMVUUpOworCisgICAgdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyID0gZGN0X3ZhbHVlX3Rva2VucyArIERDVF9NQVhfVkFMVUU7CisgICAgdnA4X2RjdF92YWx1ZV9jb3N0X3B0ciAgID0gZGN0X3ZhbHVlX2Nvc3QgKyBEQ1RfTUFYX1ZBTFVFOworfQorKi8KKworc3RhdGljIHZvaWQgdG9rZW5pemUybmRfb3JkZXJfYgorKAorICAgIE1BQ1JPQkxPQ0sgKngsCisgICAgVE9LRU5FWFRSQSAqKnRwLAorICAgIFZQOF9DT01QICpjcGkKKykKK3sKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgaW50IHB0OyAgICAgICAgICAgICAvKiBuZWFyIGJsb2NrL3ByZXYgdG9rZW4gY29udGV4dCBpbmRleCAqLworICAgIGludCBjOyAgICAgICAgICAgICAgLyogc3RhcnQgYXQgREMgKi8KKyAgICBUT0tFTkVYVFJBICp0ID0gKnRwOy8qIHN0b3JlIHRva2VucyBzdGFydGluZyBoZXJlICovCisgICAgY29uc3QgQkxPQ0tEICpiOworICAgIGNvbnN0IHNob3J0ICpxY29lZmZfcHRyOworICAgIEVOVFJPUFlfQ09OVEVYVCAqIGE7CisgICAgRU5UUk9QWV9DT05URVhUICogbDsKKyAgICBpbnQgYmFuZCwgcmMsIHYsIHRva2VuOworICAgIGludCBlb2I7CisKKyAgICBiID0geGQtPmJsb2NrICsgMjQ7CisgICAgcWNvZWZmX3B0ciA9IGItPnFjb2VmZjsKKyAgICBhID0gKEVOVFJPUFlfQ09OVEVYVCAqKXhkLT5hYm92ZV9jb250ZXh0ICsgODsKKyAgICBsID0gKEVOVFJPUFlfQ09OVEVYVCAqKXhkLT5sZWZ0X2NvbnRleHQgKyA4OworICAgIGVvYiA9IHhkLT5lb2JzWzI0XTsKKyAgICBWUDhfQ09NQklORUVOVFJPUFlDT05URVhUUyhwdCwgKmEsICpsKTsKKworICAgIGlmKCFlb2IpCisgICAgeworICAgICAgICAvKiBjID0gYmFuZCBmb3IgdGhpcyBjYXNlICovCisgICAgICAgIHQtPlRva2VuID0gRENUX0VPQl9UT0tFTjsKKyAgICAgICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbMV0gWzBdIFtwdF07CisgICAgICAgIHQtPnNraXBfZW9iX25vZGUgPSAwOworCisgICAgICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgWzFdIFswXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKKyAgICAgICAgdCsrOworICAgICAgICAqdHAgPSB0OworICAgICAgICAqYSA9ICpsID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHYgPSBxY29lZmZfcHRyWzBdOworICAgIHQtPkV4dHJhID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLkV4dHJhOworICAgIHRva2VuICAgID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLlRva2VuOworICAgIHQtPlRva2VuID0gdG9rZW47CisKKyAgICB0LT5jb250ZXh0X3RyZWUgPSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzIFsxXSBbMF0gW3B0XTsKKyAgICB0LT5za2lwX2VvYl9ub2RlID0gMDsKKyAgICArK3gtPmNvZWZfY291bnRzICAgICAgIFsxXSBbMF0gW3B0XSBbdG9rZW5dOworICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdG9rZW5dOworICAgIHQrKzsKKyAgICBjID0gMTsKKworICAgIGZvciAoOyBjIDwgZW9iOyBjKyspCisgICAgeworICAgICAgICByYyA9IHZwOF9kZWZhdWx0X3ppZ196YWcxZFtjXTsKKyAgICAgICAgYmFuZCA9IHZwOF9jb2VmX2JhbmRzW2NdOworICAgICAgICB2ID0gcWNvZWZmX3B0cltyY107CisKKyAgICAgICAgdC0+RXh0cmEgPSB2cDhfZGN0X3ZhbHVlX3Rva2Vuc19wdHJbdl0uRXh0cmE7CisgICAgICAgIHRva2VuICAgID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLlRva2VuOworCisgICAgICAgIHQtPlRva2VuID0gdG9rZW47CisgICAgICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgWzFdIFtiYW5kXSBbcHRdOworCisgICAgICAgIHQtPnNraXBfZW9iX25vZGUgPSAoKHB0ID09IDApKTsKKworICAgICAgICArK3gtPmNvZWZfY291bnRzICAgICAgIFsxXSBbYmFuZF0gW3B0XSBbdG9rZW5dOworCisgICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdG9rZW5dOworICAgICAgICB0Kys7CisgICAgfQorICAgIGlmIChjIDwgMTYpCisgICAgeworICAgICAgICBiYW5kID0gdnA4X2NvZWZfYmFuZHNbY107CisgICAgICAgIHQtPlRva2VuID0gRENUX0VPQl9UT0tFTjsKKyAgICAgICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbMV0gW2JhbmRdIFtwdF07CisKKyAgICAgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IDA7CisKKyAgICAgICAgKyt4LT5jb2VmX2NvdW50cyAgICAgICBbMV0gW2JhbmRdIFtwdF0gW0RDVF9FT0JfVE9LRU5dOworCisgICAgICAgIHQrKzsKKyAgICB9CisKKyAgICAqdHAgPSB0OworICAgICphID0gKmwgPSAxOworCit9CisKK3N0YXRpYyB2b2lkIHRva2VuaXplMXN0X29yZGVyX2IKKygKKyAgICBNQUNST0JMT0NLICp4LAorICAgIFRPS0VORVhUUkEgKip0cCwKKyAgICBpbnQgdHlwZSwgICAgICAgICAgIC8qIHdoaWNoIHBsYW5lOiAwPVkgbm8gREMsIDE9WTIsIDI9VVYsIDM9WSB3aXRoIERDICovCisgICAgVlA4X0NPTVAgKmNwaQorKQoreworICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKKyAgICB1bnNpZ25lZCBpbnQgYmxvY2s7CisgICAgY29uc3QgQkxPQ0tEICpiOworICAgIGludCBwdDsgICAgICAgICAgICAgLyogbmVhciBibG9jay9wcmV2IHRva2VuIGNvbnRleHQgaW5kZXggKi8KKyAgICBpbnQgYzsKKyAgICBpbnQgdG9rZW47CisgICAgVE9LRU5FWFRSQSAqdCA9ICp0cDsvKiBzdG9yZSB0b2tlbnMgc3RhcnRpbmcgaGVyZSAqLworICAgIGNvbnN0IHNob3J0ICpxY29lZmZfcHRyOworICAgIEVOVFJPUFlfQ09OVEVYVCAqIGE7CisgICAgRU5UUk9QWV9DT05URVhUICogbDsKKyAgICBpbnQgYmFuZCwgcmMsIHY7CisgICAgaW50IHRtcDEsIHRtcDI7CisKKyAgICBiID0geGQtPmJsb2NrOworICAgIC8qIEx1bWEgKi8KKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKywgYisrKQorICAgIHsKKyAgICAgICAgdG1wMSA9IHZwOF9ibG9jazJhYm92ZVtibG9ja107CisgICAgICAgIHRtcDIgPSB2cDhfYmxvY2sybGVmdFtibG9ja107CisgICAgICAgIHFjb2VmZl9wdHIgPSBiLT5xY29lZmY7CisgICAgICAgIGEgPSAoRU5UUk9QWV9DT05URVhUICopeGQtPmFib3ZlX2NvbnRleHQgKyB0bXAxOworICAgICAgICBsID0gKEVOVFJPUFlfQ09OVEVYVCAqKXhkLT5sZWZ0X2NvbnRleHQgKyB0bXAyOworCisgICAgICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOworCisgICAgICAgIGMgPSB0eXBlID8gMCA6IDE7CisKKyAgICAgICAgaWYoYyA+PSAqYi0+ZW9iKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjID0gYmFuZCBmb3IgdGhpcyBjYXNlICovCisgICAgICAgICAgICB0LT5Ub2tlbiA9IERDVF9FT0JfVE9LRU47CisgICAgICAgICAgICB0LT5jb250ZXh0X3RyZWUgPSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzIFt0eXBlXSBbY10gW3B0XTsKKyAgICAgICAgICAgIHQtPnNraXBfZW9iX25vZGUgPSAwOworCisgICAgICAgICAgICArK3gtPmNvZWZfY291bnRzICAgICAgIFt0eXBlXSBbY10gW3B0XSBbRENUX0VPQl9UT0tFTl07CisgICAgICAgICAgICB0Kys7CisgICAgICAgICAgICAqdHAgPSB0OworICAgICAgICAgICAgKmEgPSAqbCA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHYgPSBxY29lZmZfcHRyW2NdOworCisgICAgICAgIHQtPkV4dHJhID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLkV4dHJhOworICAgICAgICB0b2tlbiAgICA9IHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0clt2XS5Ub2tlbjsKKyAgICAgICAgdC0+VG9rZW4gPSB0b2tlbjsKKworICAgICAgICB0LT5jb250ZXh0X3RyZWUgPSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzIFt0eXBlXSBbY10gW3B0XTsKKyAgICAgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IDA7CisgICAgICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgW3R5cGVdIFtjXSBbcHRdIFt0b2tlbl07CisgICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdG9rZW5dOworICAgICAgICB0Kys7CisgICAgICAgIGMrKzsKKworICAgICAgICBmb3IgKDsgYyA8ICpiLT5lb2I7IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbY107CisgICAgICAgICAgICBiYW5kID0gdnA4X2NvZWZfYmFuZHNbY107CisgICAgICAgICAgICB2ID0gcWNvZWZmX3B0cltyY107CisKKyAgICAgICAgICAgIHQtPkV4dHJhID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLkV4dHJhOworICAgICAgICAgICAgdG9rZW4gICAgPSB2cDhfZGN0X3ZhbHVlX3Rva2Vuc19wdHJbdl0uVG9rZW47CisKKyAgICAgICAgICAgIHQtPlRva2VuID0gdG9rZW47CisgICAgICAgICAgICB0LT5jb250ZXh0X3RyZWUgPSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzIFt0eXBlXSBbYmFuZF0gW3B0XTsKKworICAgICAgICAgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IChwdCA9PSAwKTsKKyAgICAgICAgICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgW3R5cGVdIFtiYW5kXSBbcHRdIFt0b2tlbl07CisKKyAgICAgICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdG9rZW5dOworICAgICAgICAgICAgdCsrOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhbmQgPSB2cDhfY29lZl9iYW5kc1tjXTsKKyAgICAgICAgICAgIHQtPlRva2VuID0gRENUX0VPQl9UT0tFTjsKKyAgICAgICAgICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgW3R5cGVdIFtiYW5kXSBbcHRdOworCisgICAgICAgICAgICB0LT5za2lwX2VvYl9ub2RlID0gMDsKKyAgICAgICAgICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgW3R5cGVdIFtiYW5kXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKKworICAgICAgICAgICAgdCsrOworICAgICAgICB9CisgICAgICAgICp0cCA9IHQ7CisgICAgICAgICphID0gKmwgPSAxOworICAgIH0KKworICAgIC8qIENocm9tYSAqLworICAgIGZvciAoYmxvY2sgPSAxNjsgYmxvY2sgPCAyNDsgYmxvY2srKywgYisrKQorICAgIHsKKyAgICAgICAgdG1wMSA9IHZwOF9ibG9jazJhYm92ZVtibG9ja107CisgICAgICAgIHRtcDIgPSB2cDhfYmxvY2sybGVmdFtibG9ja107CisgICAgICAgIHFjb2VmZl9wdHIgPSBiLT5xY29lZmY7CisgICAgICAgIGEgPSAoRU5UUk9QWV9DT05URVhUICopeGQtPmFib3ZlX2NvbnRleHQgKyB0bXAxOworICAgICAgICBsID0gKEVOVFJPUFlfQ09OVEVYVCAqKXhkLT5sZWZ0X2NvbnRleHQgKyB0bXAyOworCisgICAgICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOworCisgICAgICAgIGlmKCEoKmItPmVvYikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGMgPSBiYW5kIGZvciB0aGlzIGNhc2UgKi8KKyAgICAgICAgICAgIHQtPlRva2VuID0gRENUX0VPQl9UT0tFTjsKKyAgICAgICAgICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgWzJdIFswXSBbcHRdOworICAgICAgICAgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IDA7CisKKyAgICAgICAgICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgWzJdIFswXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKKyAgICAgICAgICAgIHQrKzsKKyAgICAgICAgICAgICp0cCA9IHQ7CisgICAgICAgICAgICAqYSA9ICpsID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdiA9IHFjb2VmZl9wdHJbMF07CisKKyAgICAgICAgdC0+RXh0cmEgPSB2cDhfZGN0X3ZhbHVlX3Rva2Vuc19wdHJbdl0uRXh0cmE7CisgICAgICAgIHRva2VuICAgID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLlRva2VuOworICAgICAgICB0LT5Ub2tlbiA9IHRva2VuOworCisgICAgICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgWzJdIFswXSBbcHRdOworICAgICAgICB0LT5za2lwX2VvYl9ub2RlID0gMDsKKyAgICAgICAgKyt4LT5jb2VmX2NvdW50cyAgICAgICBbMl0gWzBdIFtwdF0gW3Rva2VuXTsKKyAgICAgICAgcHQgPSB2cDhfcHJldl90b2tlbl9jbGFzc1t0b2tlbl07CisgICAgICAgIHQrKzsKKyAgICAgICAgYyA9IDE7CisKKyAgICAgICAgZm9yICg7IGMgPCAqYi0+ZW9iOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2NdOworICAgICAgICAgICAgYmFuZCA9IHZwOF9jb2VmX2JhbmRzW2NdOworICAgICAgICAgICAgdiA9IHFjb2VmZl9wdHJbcmNdOworCisgICAgICAgICAgICB0LT5FeHRyYSA9IHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0clt2XS5FeHRyYTsKKyAgICAgICAgICAgIHRva2VuICAgID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLlRva2VuOworCisgICAgICAgICAgICB0LT5Ub2tlbiA9IHRva2VuOworICAgICAgICAgICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbMl0gW2JhbmRdIFtwdF07CisKKyAgICAgICAgICAgIHQtPnNraXBfZW9iX25vZGUgPSAocHQgPT0gMCk7CisKKyAgICAgICAgICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgWzJdIFtiYW5kXSBbcHRdIFt0b2tlbl07CisKKyAgICAgICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdG9rZW5dOworICAgICAgICAgICAgdCsrOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhbmQgPSB2cDhfY29lZl9iYW5kc1tjXTsKKyAgICAgICAgICAgIHQtPlRva2VuID0gRENUX0VPQl9UT0tFTjsKKyAgICAgICAgICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgWzJdIFtiYW5kXSBbcHRdOworCisgICAgICAgICAgICB0LT5za2lwX2VvYl9ub2RlID0gMDsKKworICAgICAgICAgICAgKyt4LT5jb2VmX2NvdW50cyAgICAgICBbMl0gW2JhbmRdIFtwdF0gW0RDVF9FT0JfVE9LRU5dOworCisgICAgICAgICAgICB0Kys7CisgICAgICAgIH0KKyAgICAgICAgKnRwID0gdDsKKyAgICAgICAgKmEgPSAqbCA9IDE7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgbWJfaXNfc2tpcHBhYmxlKE1BQ1JPQkxPQ0tEICp4LCBpbnQgaGFzX3kyX2Jsb2NrKQoreworICAgIGludCBza2lwID0gMTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiAoaGFzX3kyX2Jsb2NrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBza2lwICY9ICh4LT5lb2JzW2ldIDwgMik7CisgICAgfQorCisgICAgZm9yICg7IGkgPCAyNCArIGhhc195Ml9ibG9jazsgaSsrKQorICAgICAgICBza2lwICY9ICgheC0+ZW9ic1tpXSk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworCit2b2lkIHZwOF90b2tlbml6ZV9tYihWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LCBUT0tFTkVYVFJBICoqdCkKK3sKKyAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7CisgICAgaW50IHBsYW5lX3R5cGU7CisgICAgaW50IGhhc195Ml9ibG9jazsKKworICAgIGhhc195Ml9ibG9jayA9ICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQKKyAgICAgICAgICAgICAgICAgICAgJiYgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVik7CisKKyAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZiA9CisgICAgICAgIG1iX2lzX3NraXBwYWJsZSh4ZCwgaGFzX3kyX2Jsb2NrKTsKKyAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYpCisgICAgeworICAgICAgICBpZiAoIWNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwOF9zdHVmZl9tYihjcGksIHgsIHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdnA4X2ZpeF9jb250ZXh0cyh4ZCk7CisgICAgICAgICAgICB4LT5za2lwX3RydWVfY291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwbGFuZV90eXBlID0gMzsKKyAgICBpZihoYXNfeTJfYmxvY2spCisgICAgeworICAgICAgICB0b2tlbml6ZTJuZF9vcmRlcl9iKHgsIHQsIGNwaSk7CisgICAgICAgIHBsYW5lX3R5cGUgPSAwOworICAgIH0KKworICAgIHRva2VuaXplMXN0X29yZGVyX2IoeCwgdCwgcGxhbmVfdHlwZSwgY3BpKTsKK30KKworCisjaWZkZWYgRU5UUk9QWV9TVEFUUworCit2b2lkIGluaXRfY29udGV4dF9jb3VudGVycyh2b2lkKQoreworICAgIHZweF9tZW1zZXQoY29udGV4dF9jb3VudGVycywgMCwgc2l6ZW9mKGNvbnRleHRfY291bnRlcnMpKTsKK30KKwordm9pZCBwcmludF9jb250ZXh0X2NvdW50ZXJzKCkKK3sKKworICAgIGludCB0eXBlLCBiYW5kLCBwdCwgdDsKKworICAgIEZJTEUgKmNvbnN0IGYgPSBmb3BlbigiY29udGV4dC5jIiwgInciKTsKKworICAgIGZwcmludGYoZiwgIiNpbmNsdWRlIFwiZW50cm9weS5oXCJcbiIpOworCisgICAgZnByaW50ZihmLCAiXG4vKiAqKiogR0VORVJBVEVEIEZJTEU6IERPIE5PVCBFRElUICoqKiAqL1xuXG4iKTsKKworICAgIGZwcmludGYoZiwgImludCBDb250ZXh0c1tCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFtNQVhfRU5UUk9QWV9UT0tFTlNdO1xuXG4iKTsKKworICAgIGZwcmludGYoZiwgImNvbnN0IGludCBkZWZhdWx0X2NvbnRleHRzW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW01BWF9FTlRST1BZX1RPS0VOU10gPSB7Iik7CisKKyMgZGVmaW5lIENvbW1hKCBYKSAoWD8gIiwiOiIiKQorCisgICAgdHlwZSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgZnByaW50ZihmLCAiJXNcbiAgeyAvKiBibG9jayBUeXBlICVkICovIiwgQ29tbWEodHlwZSksIHR5cGUpOworCisgICAgICAgIGJhbmQgPSAwOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4gICAgeyAvKiBDb2VmZiBCYW5kICVkICovIiwgQ29tbWEoYmFuZCksIGJhbmQpOworCisgICAgICAgICAgICBwdCA9IDA7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiAgICAgIHsiLCBDb21tYShwdCkpOworCisgICAgICAgICAgICAgICAgdCA9IDA7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX2ludDY0IHggPSBjb250ZXh0X2NvdW50ZXJzIFt0eXBlXSBbYmFuZF0gW3B0XSBbdF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB5ID0gKGludCkgeDsKKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoeCA9PSAoX2ludDY0KSB5KTsgIC8qIG5vIG92ZXJmbG93IGhhbmRsaW5nIHlldCAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAlZCIsIENvbW1hKHQpLCB5KTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKyt0IDwgTUFYX0VOVFJPUFlfVE9LRU5TKTsKKworICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgrK3B0IDwgUFJFVl9DT0VGX0NPTlRFWFRTKTsKKworICAgICAgICAgICAgZnByaW50ZihmLCAiXG4gICAgfSIpOworCisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCsrYmFuZCA8IENPRUZfQkFORFMpOworCisgICAgICAgIGZwcmludGYoZiwgIlxuICB9Iik7CisgICAgfQorICAgIHdoaWxlICgrK3R5cGUgPCBCTE9DS19UWVBFUyk7CisKKyAgICBmcHJpbnRmKGYsICJcbn07XG4iKTsKKyAgICBmY2xvc2UoZik7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBzdHVmZjJuZF9vcmRlcl9iCisoCisgICAgVE9LRU5FWFRSQSAqKnRwLAorICAgIEVOVFJPUFlfQ09OVEVYVCAqYSwKKyAgICBFTlRST1BZX0NPTlRFWFQgKmwsCisgICAgVlA4X0NPTVAgKmNwaSwKKyAgICBNQUNST0JMT0NLICp4CispCit7CisgICAgaW50IHB0OyAvKiBuZWFyIGJsb2NrL3ByZXYgdG9rZW4gY29udGV4dCBpbmRleCAqLworICAgIFRPS0VORVhUUkEgKnQgPSAqdHA7ICAgICAgICAvKiBzdG9yZSB0b2tlbnMgc3RhcnRpbmcgaGVyZSAqLworICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOworCisgICAgdC0+VG9rZW4gPSBEQ1RfRU9CX1RPS0VOOworICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgWzFdIFswXSBbcHRdOworICAgIHQtPnNraXBfZW9iX25vZGUgPSAwOworICAgICsreC0+Y29lZl9jb3VudHMgICAgICAgWzFdIFswXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKKyAgICArK3Q7CisKKyAgICAqdHAgPSB0OworICAgIHB0ID0gMDsKKyAgICAqYSA9ICpsID0gcHQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0dWZmMXN0X29yZGVyX2IKKygKKyAgICBUT0tFTkVYVFJBICoqdHAsCisgICAgRU5UUk9QWV9DT05URVhUICphLAorICAgIEVOVFJPUFlfQ09OVEVYVCAqbCwKKyAgICBpbnQgdHlwZSwKKyAgICBWUDhfQ09NUCAqY3BpLAorICAgIE1BQ1JPQkxPQ0sgKngKKykKK3sKKyAgICBpbnQgcHQ7IC8qIG5lYXIgYmxvY2svcHJldiB0b2tlbiBjb250ZXh0IGluZGV4ICovCisgICAgaW50IGJhbmQ7CisgICAgVE9LRU5FWFRSQSAqdCA9ICp0cDsgICAgICAgIC8qIHN0b3JlIHRva2VucyBzdGFydGluZyBoZXJlICovCisgICAgVlA4X0NPTUJJTkVFTlRST1BZQ09OVEVYVFMocHQsICphLCAqbCk7CisgICAgYmFuZCA9IHR5cGUgPyAwIDogMTsKKyAgICB0LT5Ub2tlbiA9IERDVF9FT0JfVE9LRU47CisgICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbdHlwZV0gW2JhbmRdIFtwdF07CisgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IDA7CisgICAgKyt4LT5jb2VmX2NvdW50cyAgICAgICBbdHlwZV0gW2JhbmRdIFtwdF0gW0RDVF9FT0JfVE9LRU5dOworICAgICsrdDsKKyAgICAqdHAgPSB0OworICAgIHB0ID0gMDsgLyogMCA8LT4gYWxsIGNvZWZmIGRhdGEgaXMgemVybyAqLworICAgICphID0gKmwgPSBwdDsKK30KKworc3RhdGljCit2b2lkIHN0dWZmMXN0X29yZGVyX2J1dgorKAorICAgIFRPS0VORVhUUkEgKip0cCwKKyAgICBFTlRST1BZX0NPTlRFWFQgKmEsCisgICAgRU5UUk9QWV9DT05URVhUICpsLAorICAgIFZQOF9DT01QICpjcGksCisgICAgTUFDUk9CTE9DSyAqeAorKQoreworICAgIGludCBwdDsgLyogbmVhciBibG9jay9wcmV2IHRva2VuIGNvbnRleHQgaW5kZXggKi8KKyAgICBUT0tFTkVYVFJBICp0ID0gKnRwOyAgICAgICAgLyogc3RvcmUgdG9rZW5zIHN0YXJ0aW5nIGhlcmUgKi8KKyAgICBWUDhfQ09NQklORUVOVFJPUFlDT05URVhUUyhwdCwgKmEsICpsKTsKKworICAgIHQtPlRva2VuID0gRENUX0VPQl9UT0tFTjsKKyAgICB0LT5jb250ZXh0X3RyZWUgPSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzIFsyXSBbMF0gW3B0XTsKKyAgICB0LT5za2lwX2VvYl9ub2RlID0gMDsKKyAgICArK3gtPmNvZWZfY291bnRzWzJdIFswXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKKyAgICArK3Q7CisgICAgKnRwID0gdDsKKyAgICBwdCA9IDA7IC8qIDAgPC0+IGFsbCBjb2VmZiBkYXRhIGlzIHplcm8gKi8KKyAgICAqYSA9ICpsID0gcHQ7Cit9CisKK3ZvaWQgdnA4X3N0dWZmX21iKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIFRPS0VORVhUUkEgKip0KQoreworICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKKyAgICBFTlRST1BZX0NPTlRFWFQgKiBBID0gKEVOVFJPUFlfQ09OVEVYVCAqKXhkLT5hYm92ZV9jb250ZXh0OworICAgIEVOVFJPUFlfQ09OVEVYVCAqIEwgPSAoRU5UUk9QWV9DT05URVhUICopeGQtPmxlZnRfY29udGV4dDsKKyAgICBpbnQgcGxhbmVfdHlwZTsKKyAgICBpbnQgYjsKKyAgICBwbGFuZV90eXBlID0gMzsKKyAgICBpZigoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVECisgICAgICAgICAgICAgICAgICAgICAgICAmJiB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKSkKKyAgICB7CisgICAgICAgIHN0dWZmMm5kX29yZGVyX2IodCwKKyAgICAgICAgICAgICAgICAgICAgIEEgKyB2cDhfYmxvY2syYWJvdmVbMjRdLCBMICsgdnA4X2Jsb2NrMmxlZnRbMjRdLCBjcGksIHgpOworICAgICAgICBwbGFuZV90eXBlID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKKyAgICAgICAgc3R1ZmYxc3Rfb3JkZXJfYih0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEEgKyB2cDhfYmxvY2syYWJvdmVbYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTCArIHZwOF9ibG9jazJsZWZ0W2JdLCBwbGFuZV90eXBlLCBjcGksIHgpOworCisgICAgZm9yIChiID0gMTY7IGIgPCAyNDsgYisrKQorICAgICAgICBzdHVmZjFzdF9vcmRlcl9idXYodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgKyB2cDhfYmxvY2syYWJvdmVbYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMICsgdnA4X2Jsb2NrMmxlZnRbYl0sIGNwaSwgeCk7CisKK30KK3ZvaWQgdnA4X2ZpeF9jb250ZXh0cyhNQUNST0JMT0NLRCAqeCkKK3sKKyAgICAvKiBDbGVhciBlbnRyb3B5IGNvbnRleHRzIGZvciBZMiBibG9ja3MgKi8KKyAgICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYgeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKQorICAgIHsKKyAgICAgICAgdnB4X21lbXNldCh4LT5hYm92ZV9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOworICAgICAgICB2cHhfbWVtc2V0KHgtPmxlZnRfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdnB4X21lbXNldCh4LT5hYm92ZV9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUyktMSk7CisgICAgICAgIHZweF9tZW1zZXQoeC0+bGVmdF9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUyktMSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvdG9rZW5pemUuaCBiL2xpYnZweC92cDgvZW5jb2Rlci90b2tlbml6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDE0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIvdG9rZW5pemUuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiB0b2tlbml6ZV9oCisjZGVmaW5lIHRva2VuaXplX2gKKworI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weS5oIgorI2luY2x1ZGUgImJsb2NrLmgiCisKK3ZvaWQgdnA4X3Rva2VuaXplX2luaXRpYWxpemUoKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzaG9ydCBUb2tlbjsKKyAgICBzaG9ydCBFeHRyYTsKK30gVE9LRU5WQUxVRTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCB2cDhfcHJvYiAqY29udGV4dF90cmVlOworICAgIHNob3J0ICAgICAgICAgICBFeHRyYTsKKyAgICB1bnNpZ25lZCBjaGFyICAgVG9rZW47CisgICAgdW5zaWduZWQgY2hhciAgIHNraXBfZW9iX25vZGU7Cit9IFRPS0VORVhUUkE7CisKK2ludCByZF9jb3N0X21ieShNQUNST0JMT0NLRCAqKTsKKworI2lmZGVmIEVOVFJPUFlfU1RBVFMKK3ZvaWQgaW5pdF9jb250ZXh0X2NvdW50ZXJzKCk7Cit2b2lkIHByaW50X2NvbnRleHRfY291bnRlcnMoKTsKKworZXh0ZXJuIF9pbnQ2NCBjb250ZXh0X2NvdW50ZXJzW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW01BWF9FTlRST1BZX1RPS0VOU107CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IHNob3J0ICpjb25zdCB2cDhfZGN0X3ZhbHVlX2Nvc3RfcHRyOworLyogVE9ETzogVGhlIFRva2VuIGZpZWxkIHNob3VsZCBiZSBicm9rZW4gb3V0IGludG8gYSBzZXBhcmF0ZSBjaGFyIGFycmF5IHRvCisgKiAgaW1wcm92ZSBjYWNoZSBsb2NhbGl0eSwgc2luY2UgaXQncyBuZWVkZWQgZm9yIGNvc3Rpbmcgd2hlbiB0aGUgcmVzdCBvZiB0aGUKKyAqICBmaWVsZHMgYXJlIG5vdC4KKyAqLworZXh0ZXJuIGNvbnN0IFRPS0VOVkFMVUUgKmNvbnN0IHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0cjsKKworI2VuZGlmICAvKiB0b2tlbml6ZV9oICovCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvdHJlZXdyaXRlci5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3RyZWV3cml0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI1ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3RyZWV3cml0ZXIuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInRyZWV3cml0ZXIuaCIKKworc3RhdGljIHZvaWQgY29zdCgKKyAgICBpbnQgKmNvbnN0IEMsCisgICAgdnA4X3RyZWUgVCwKKyAgICBjb25zdCB2cDhfcHJvYiAqY29uc3QgUCwKKyAgICBpbnQgaSwKKyAgICBpbnQgYworKQoreworICAgIGNvbnN0IHZwOF9wcm9iIHAgPSBQIFtpPj4xXTsKKworICAgIGRvCisgICAgeworICAgICAgICBjb25zdCB2cDhfdHJlZV9pbmRleCBqID0gVFtpXTsKKyAgICAgICAgY29uc3QgaW50IGQgPSBjICsgdnA4X2Nvc3RfYml0KHAsIGkgJiAxKTsKKworICAgICAgICBpZiAoaiA8PSAwKQorICAgICAgICAgICAgQ1stal0gPSBkOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3N0KEMsIFQsIFAsIGosIGQpOworICAgIH0KKyAgICB3aGlsZSAoKytpICYgMSk7Cit9Cit2b2lkIHZwOF9jb3N0X3Rva2VucyhpbnQgKmMsIGNvbnN0IHZwOF9wcm9iICpwLCB2cDhfdHJlZSB0KQoreworICAgIGNvc3QoYywgdCwgcCwgMCwgMCk7Cit9Cit2b2lkIHZwOF9jb3N0X3Rva2VuczIoaW50ICpjLCBjb25zdCB2cDhfcHJvYiAqcCwgdnA4X3RyZWUgdCxpbnQgc3RhcnQpCit7CisgICAgY29zdChjLCB0LCBwLCBzdGFydCwgMCk7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIvdHJlZXdyaXRlci5oIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3RyZWV3cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU3NGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3RyZWV3cml0ZXIuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgX19JTkNfVFJFRVdSSVRFUl9ICisjZGVmaW5lIF9fSU5DX1RSRUVXUklURVJfSAorCisvKiBUcmVlcyBtYXAgYWxwaGFiZXRzIGludG8gaHVmZm1hbi1saWtlIGNvZGVzIHN1aXRhYmxlIGZvciBhbiBhcml0aG1ldGljCisgICBiaXQgY29kZXIuICBUaW1vdGh5IFMgTXVycGh5ICAxMSBPY3RvYmVyIDIwMDQgKi8KKworI2luY2x1ZGUgInZwOC9jb21tb24vdHJlZWNvZGVyLmgiCisKKyNpbmNsdWRlICJib29saHVmZi5oIiAgICAgICAvKiBmb3Igbm93ICovCisKK3R5cGVkZWYgQk9PTF9DT0RFUiB2cDhfd3JpdGVyOworCisjZGVmaW5lIHZwOF93cml0ZSB2cDhfZW5jb2RlX2Jvb2wKKyNkZWZpbmUgdnA4X3dyaXRlX2xpdGVyYWwgdnA4X2VuY29kZV92YWx1ZQorI2RlZmluZSB2cDhfd3JpdGVfYml0KCBXLCBWKSB2cDhfd3JpdGUoIFcsIFYsIHZwOF9wcm9iX2hhbGYpCisKKyNkZWZpbmUgdnA4YmNfd3JpdGUgdnA4YmNfd3JpdGVfYm9vbAorI2RlZmluZSB2cDhiY193cml0ZV9saXRlcmFsIHZwOGJjX3dyaXRlX2JpdHMKKyNkZWZpbmUgdnA4YmNfd3JpdGVfYml0KCBXLCBWKSB2cDhiY193cml0ZV9iaXRzKCBXLCBWLCAxKQorCisKKy8qIEFwcHJveGltYXRlIGxlbmd0aCBvZiBhbiBlbmNvZGVkIGJvb2wgaW4gMjU2dGhzIG9mIGEgYml0IGF0IGdpdmVuIHByb2IgKi8KKworI2RlZmluZSB2cDhfY29zdF96ZXJvKCB4KSAoIHZwOF9wcm9iX2Nvc3RbeF0pCisjZGVmaW5lIHZwOF9jb3N0X29uZSggeCkgIHZwOF9jb3N0X3plcm8oIHZwOF9jb21wbGVtZW50KHgpKQorCisjZGVmaW5lIHZwOF9jb3N0X2JpdCggeCwgYikgdnA4X2Nvc3RfemVybyggKGIpPyAgdnA4X2NvbXBsZW1lbnQoeCkgOiAoeCkgKQorCisvKiBWUDhCQyB2ZXJzaW9uIGlzIHNjYWxlZCBieSAyXjIwIHJhdGhlciB0aGFuIDJeODsgc2VlIGJvb2xfY29kZXIuaCAqLworCisKKy8qIEJvdGggb2YgdGhlc2UgcmV0dXJuIGJpdHMsIG5vdCBzY2FsZWQgYml0cy4gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCB2cDhfY29zdF9icmFuY2goY29uc3QgdW5zaWduZWQgaW50IGN0WzJdLCB2cDhfcHJvYiBwKQoreworICAgIC8qIEltaXRhdGUgZXhpc3RpbmcgY2FsY3VsYXRpb24gKi8KKworICAgIHJldHVybiAoKGN0WzBdICogdnA4X2Nvc3RfemVybyhwKSkKKyAgICAgICAgICAgICsgKGN0WzFdICogdnA4X2Nvc3Rfb25lKHApKSkgPj4gODsKK30KKworLyogU21hbGwgZnVuY3Rpb25zIHRvIHdyaXRlIGV4cGxpY2l0IHZhbHVlcyBhbmQgdG9rZW5zLCBhcyB3ZWxsIGFzCisgICBlc3RpbWF0ZSB0aGVpciBsZW5ndGhzLiAqLworCitzdGF0aWMgdm9pZCB2cDhfdHJlZWRfd3JpdGUKKygKKyAgICB2cDhfd3JpdGVyICpjb25zdCB3LAorICAgIHZwOF90cmVlIHQsCisgICAgY29uc3QgdnA4X3Byb2IgKmNvbnN0IHAsCisgICAgaW50IHYsCisgICAgaW50IG4gICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiB2LCBhc3N1bWVkIG5vbnplcm8gKi8KKykKK3sKKyAgICB2cDhfdHJlZV9pbmRleCBpID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBjb25zdCBpbnQgYiA9ICh2ID4+IC0tbikgJiAxOworICAgICAgICB2cDhfd3JpdGUodywgYiwgcFtpPj4xXSk7CisgICAgICAgIGkgPSB0W2krYl07CisgICAgfQorICAgIHdoaWxlIChuKTsKK30KK3N0YXRpYyB2b2lkIHZwOF93cml0ZV90b2tlbgorKAorICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCisgICAgdnA4X3RyZWUgdCwKKyAgICBjb25zdCB2cDhfcHJvYiAqY29uc3QgcCwKKyAgICB2cDhfdG9rZW4gKmNvbnN0IHgKKykKK3sKKyAgICB2cDhfdHJlZWRfd3JpdGUodywgdCwgcCwgeC0+dmFsdWUsIHgtPkxlbik7Cit9CisKK3N0YXRpYyBpbnQgdnA4X3RyZWVkX2Nvc3QoCisgICAgdnA4X3RyZWUgdCwKKyAgICBjb25zdCB2cDhfcHJvYiAqY29uc3QgcCwKKyAgICBpbnQgdiwKKyAgICBpbnQgbiAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHYsIGFzc3VtZWQgbm9uemVybyAqLworKQoreworICAgIGludCBjID0gMDsKKyAgICB2cDhfdHJlZV9pbmRleCBpID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBjb25zdCBpbnQgYiA9ICh2ID4+IC0tbikgJiAxOworICAgICAgICBjICs9IHZwOF9jb3N0X2JpdChwW2k+PjFdLCBiKTsKKyAgICAgICAgaSA9IHRbaStiXTsKKyAgICB9CisgICAgd2hpbGUgKG4pOworCisgICAgcmV0dXJuIGM7Cit9CitzdGF0aWMgaW50IHZwOF9jb3N0X3Rva2VuCisoCisgICAgdnA4X3RyZWUgdCwKKyAgICBjb25zdCB2cDhfcHJvYiAqY29uc3QgcCwKKyAgICB2cDhfdG9rZW4gKmNvbnN0IHgKKykKK3sKKyAgICByZXR1cm4gdnA4X3RyZWVkX2Nvc3QodCwgcCwgeC0+dmFsdWUsIHgtPkxlbik7Cit9CisKKy8qIEZpbGwgYXJyYXkgb2YgY29zdHMgZm9yIGFsbCBwb3NzaWJsZSB0b2tlbiB2YWx1ZXMuICovCisKK3ZvaWQgdnA4X2Nvc3RfdG9rZW5zKAorICAgIGludCAqQ29zdHMsIGNvbnN0IHZwOF9wcm9iICosIHZwOF90cmVlCispOworCit2b2lkIHZwOF9jb3N0X3Rva2VuczIoCisgICAgaW50ICpDb3N0cywgY29uc3QgdnA4X3Byb2IgKiwgdnA4X3RyZWUsIGludAorKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIveDg2L2RjdF9tbXguYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9kY3RfbW14LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE4OGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9kY3RfbW14LmFzbQpAQCAtMCwwICsxLDI0MSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7dm9pZCB2cDhfc2hvcnRfZmRjdDR4NF9tbXgoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCitnbG9iYWwgc3ltKHZwOF9zaG9ydF9mZGN0NHg0X21teCkgUFJJVkFURQorc3ltKHZwOF9zaG9ydF9mZGN0NHg0X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCAgICAgICAgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgIDsgaW5wdXQKKyAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpICAgICAgOyBvdXRwdXQKKworICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtwaXRjaAorCisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyc2kgKyByYXgqMl0KKyAgICAgICAgOyByZWFkIHRoZSBpbnB1dCBkYXRhCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIFtyc2ldCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIFtyc2kgKyByYXhdCisKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JjeF0KKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JjeCArIHJheF0KKworICAgICAgICA7IHRyYW5zcG9zZSBmb3IgdGhlIGZpcnN0IHN0YWdlCisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tMCAgICAgICAgIDsgMDAgMDEgMDIgMDMKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgOyAyMCAyMSAyMiAyMworCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgIDsgMDAgMTAgMDEgMTEKKyAgICAgICAgcHVucGNraHdkICAgbW0zLCAgICAgICAgbW0xICAgICAgICAgOyAwMiAxMiAwMyAxMworCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tNCAgICAgICAgIDsgMjAgMzAgMjEgMzEKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW00ICAgICAgICAgOyAyMiAzMiAyMyAzMworCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMCAgICAgICAgIDsgMDAgMTAgMDEgMTEKKyAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgOyAwMCAxMCAyMCAzMAorCisgICAgICAgIHB1bnBja2hkcSAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgIDsgMDEgMTEgMjEgMzEKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTMgICAgICAgICA7IDAyIDEyIDAzIDEzCisgICAgICAgIHB1bnBja2xkcSAgIG1tMiwgICAgICAgIG1tNSAgICAgICAgIDsgMDIgMTIgMjIgMzIKKworICAgICAgICBwdW5wY2toZHEgICBtbTMsICAgICAgICBtbTUgICAgICAgICA7IDAzIDEzIDIzIDMzCisKKyAgICAgICAgOyBtbTAgMAorICAgICAgICA7IG1tMSAxCisgICAgICAgIDsgbW0yIDIKKyAgICAgICAgOyBtbTMgMworCisgICAgICAgIDsgZmlyc3Qgc3RhZ2UKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0wCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tMQorCisgICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgIG1tMyAgICAgICAgIDsgYTEgPSAwICsgMworICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTIgICAgICAgICA7IGIxID0gMSArIDIKKworICAgICAgICBwc3VidyAgICAgICBtbTQsICAgICAgICBtbTIgICAgICAgICA7IGMxID0gMSAtIDIKKyAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW0zICAgICAgICAgOyBkMSA9IDAgLSAzCisKKyAgICAgICAgcHNsbHcgICAgICAgbW01LCAgICAgICAgMworICAgICAgICBwc2xsdyAgICAgICBtbTQsICAgICAgICAzCisKKyAgICAgICAgcHNsbHcgICAgICAgbW0wLCAgICAgICAgMworICAgICAgICBwc2xsdyAgICAgICBtbTEsICAgICAgICAzCisKKyAgICAgICAgOyBvdXRwdXQgMCBhbmQgMgorICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICA7IGExCisKKyAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgOyBvcFswXSA9IGExICsgYjEKKyAgICAgICAgcHN1YncgICAgICAgbW0yLCAgICAgICAgbW0xICAgICAgICAgOyBvcFsyXSA9IGExIC0gYjEKKworICAgICAgICA7IG91dHB1dCAxIGFuZCAzCisgICAgICAgIDsgaW50ZXJsZWF2ZSBjMSwgZDEKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW01ICAgICAgICAgOyBkMQorICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTQgICAgICAgICA7IGMxIGQxCisgICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tNCAgICAgICAgIDsgYzEgZDEKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTEKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW01CisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0xLCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwgKF81MzUyXzIyMTcpXSAgICA7IGMxKjIyMTcgKyBkMSo1MzUyCisgICAgICAgIHBtYWRkd2QgICAgIG1tNCwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMIChfNTM1Ml8yMjE3KV0gICAgOyBjMSoyMjE3ICsgZDEqNTM1MgorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMywgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgorICAgICAgICBwbWFkZHdkICAgICBtbTUsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfMjIxN19uZWc1MzUyKV0gIDsgZDEqMjIxNyAtIGMxKjUzNTIKKworICAgICAgICBwYWRkZCAgICAgICBtbTEsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfMTQ1MDApXQorICAgICAgICBwYWRkZCAgICAgICBtbTQsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfMTQ1MDApXQorICAgICAgICBwYWRkZCAgICAgICBtbTMsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfNzUwMCldCisgICAgICAgIHBhZGRkICAgICAgIG1tNSwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF83NTAwKV0KKworICAgICAgICBwc3JhZCAgICAgICBtbTEsICAgICAgICAxMiAgICAgICAgICA7IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApPj4xMgorICAgICAgICBwc3JhZCAgICAgICBtbTQsICAgICAgICAxMiAgICAgICAgICA7IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApPj4xMgorICAgICAgICBwc3JhZCAgICAgICBtbTMsICAgICAgICAxMiAgICAgICAgICA7IChkMSAqIDIyMTcgLSBjMSAqIDUzNTIgKyAgIDc1MDApPj4xMgorICAgICAgICBwc3JhZCAgICAgICBtbTUsICAgICAgICAxMiAgICAgICAgICA7IChkMSAqIDIyMTcgLSBjMSAqIDUzNTIgKyAgIDc1MDApPj4xMgorCisgICAgICAgIHBhY2tzc2R3ICAgIG1tMSwgICAgICAgIG1tNCAgICAgICAgIDsgb3BbMV0KKyAgICAgICAgcGFja3NzZHcgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgOyBvcFszXQorCisgICAgICAgIDsgZG9uZSB3aXRoIHZlcnRpY2FsCisgICAgICAgIDsgdHJhbnNwb3NlIGZvciB0aGUgc2Vjb25kIHN0YWdlCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgIDsgMDAgMTAgMjAgMzAKKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgOyAwMiAxMiAyMiAzMgorCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgIDsgMDAgMDEgMTAgMTEKKyAgICAgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgbW0xICAgICAgICAgOyAyMCAyMSAzMCAzMQorCisgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tMyAgICAgICAgIDsgMDIgMDMgMTIgMTMKKyAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW0zICAgICAgICAgOyAyMiAyMyAzMiAzMworCisgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMCAgICAgICAgIDsgMDAgMDEgMTAgMTEKKyAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgOyAwMCAwMSAwMiAwMworCisgICAgICAgIHB1bnBja2hkcSAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgIDsgMDEgMjIgMTIgMTMKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTQgICAgICAgICA7IDIwIDMxIDMwIDMxCisgICAgICAgIHB1bnBja2xkcSAgIG1tMiwgICAgICAgIG1tNSAgICAgICAgIDsgMjAgMjEgMjIgMjMKKworICAgICAgICBwdW5wY2toZHEgICBtbTQsICAgICAgICBtbTUgICAgICAgICA7IDMwIDMxIDMyIDMzCisKKyAgICAgICAgOyBtbTAgMAorICAgICAgICA7IG1tMSAxCisgICAgICAgIDsgbW0yIDIKKyAgICAgICAgOyBtbTMgNAorCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMAorICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTEKKworICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgICAgICBtbTQgICAgICAgICA7IGExID0gMCArIDMKKyAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgOyBiMSA9IDEgKyAyCisKKyAgICAgICAgcHN1YncgICAgICAgbW0zLCAgICAgICAgbW0yICAgICAgICAgOyBjMSA9IDEgLSAyCisgICAgICAgIHBzdWJ3ICAgICAgIG1tNSwgICAgICAgIG1tNCAgICAgICAgIDsgZDEgPSAwIC0gMworCisgICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgIG1tNiAgICAgICAgIDsgemVybyBvdXQgZm9yIGNvbXBhcmUKKworICAgICAgICBwY21wZXF3ICAgICBtbTYsICAgICAgICBtbTUgICAgICAgICA7IGQxICE9IDAKKworICAgICAgICBwYW5kbiAgICAgICBtbTYsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfY21wX21hc2spXSAgIDsgY2xlYXIgdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhbmQga2VlcCBiaXQgMCBvZiBsb3dlcgorCisgICAgICAgIDsgb3V0cHV0IDAgYW5kIDIKKyAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0wICAgICAgICAgOyBhMQorCisgICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgIDsgYTEgKyBiMQorICAgICAgICBwc3VidyAgICAgICBtbTIsICAgICAgICBtbTEgICAgICAgICA7IGExIC0gYjEKKworICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfN3cpXQorICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfN3cpXQorCisgICAgICAgIHBzcmF3ICAgICAgIG1tMCwgICAgICAgIDQgICAgICAgICAgIDsgb3BbMF0gPSAoYTEgKyBiMSArIDcpPj40CisgICAgICAgIHBzcmF3ICAgICAgIG1tMiwgICAgICAgIDQgICAgICAgICAgIDsgb3BbOF0gPSAoYTEgLSBiMSArIDcpPj40CisKKyAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUltyZGkgKyAwIF0sICBtbTAKKyAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUltyZGkgKyAxNl0sICBtbTIKKworICAgICAgICA7IG91dHB1dCAxIGFuZCAzCisgICAgICAgIDsgaW50ZXJsZWF2ZSBjMSwgZDEKKyAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW01ICAgICAgICAgOyBkMQorICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTMgICAgICAgICA7IGMxIGQxCisgICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tMyAgICAgICAgIDsgYzEgZDEKKworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTEKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW01CisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0xLCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwgKF81MzUyXzIyMTcpXSAgICA7IGMxKjIyMTcgKyBkMSo1MzUyCisgICAgICAgIHBtYWRkd2QgICAgIG1tNCwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMIChfNTM1Ml8yMjE3KV0gICAgOyBjMSoyMjE3ICsgZDEqNTM1MgorCisgICAgICAgIHBtYWRkd2QgICAgIG1tMywgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgorICAgICAgICBwbWFkZHdkICAgICBtbTUsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfMjIxN19uZWc1MzUyKV0gIDsgZDEqMjIxNyAtIGMxKjUzNTIKKworICAgICAgICBwYWRkZCAgICAgICBtbTEsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfMTIwMDApXQorICAgICAgICBwYWRkZCAgICAgICBtbTQsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfMTIwMDApXQorICAgICAgICBwYWRkZCAgICAgICBtbTMsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfNTEwMDApXQorICAgICAgICBwYWRkZCAgICAgICBtbTUsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTChfNTEwMDApXQorCisgICAgICAgIHBzcmFkICAgICAgIG1tMSwgICAgICAgIDE2ICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjE2CisgICAgICAgIHBzcmFkICAgICAgIG1tNCwgICAgICAgIDE2ICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjE2CisgICAgICAgIHBzcmFkICAgICAgIG1tMywgICAgICAgIDE2ICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjE2CisgICAgICAgIHBzcmFkICAgICAgIG1tNSwgICAgICAgIDE2ICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjE2CisKKyAgICAgICAgcGFja3NzZHcgICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgOyBvcFs0XQorICAgICAgICBwYWNrc3NkdyAgICBtbTMsICAgICAgICBtbTUgICAgICAgICA7IG9wWzEyXQorCisgICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIG1tNiAgICAgICAgIDsgb3BbNF0gKz0gKGQxIT0wKQorCisgICAgICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFJbcmRpICsgOCBdLCAgbW0xCisgICAgICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFJbcmRpICsgMjRdLCAgbW0zCisKKyAgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDgKK181MzUyXzIyMTc6CisgICAgZHcgNTM1MgorICAgIGR3IDIyMTcKKyAgICBkdyA1MzUyCisgICAgZHcgMjIxNworYWxpZ24gOAorXzIyMTdfbmVnNTM1MjoKKyAgICBkdyAyMjE3CisgICAgZHcgLTUzNTIKKyAgICBkdyAyMjE3CisgICAgZHcgLTUzNTIKK2FsaWduIDgKK19jbXBfbWFzazoKKyAgICB0aW1lcyA0IGR3IDEKK2FsaWduIDgKK183dzoKKyAgICB0aW1lcyA0IGR3IDcKK2FsaWduIDgKK18xNDUwMDoKKyAgICB0aW1lcyAyIGRkIDE0NTAwCithbGlnbiA4CitfNzUwMDoKKyAgICB0aW1lcyAyIGRkIDc1MDAKK2FsaWduIDgKK18xMjAwMDoKKyAgICB0aW1lcyAyIGRkIDEyMDAwCithbGlnbiA4CitfNTEwMDA6CisgICAgdGltZXMgMiBkZCA1MTAwMApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9kY3Rfc3NlMi5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L2RjdF9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgwY2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9kY3Rfc3NlMi5hc20KQEAgLTAsMCArMSw0MzIgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworJW1hY3JvIFNUQUNLX0ZSQU1FX0NSRUFURSAwCislaWYgQUJJX0lTXzMyQklUCisgICVkZWZpbmUgICAgICAgaW5wdXQgICAgICAgcnNpCisgICVkZWZpbmUgICAgICAgb3V0cHV0ICAgICAgcmRpCisgICVkZWZpbmUgICAgICAgcGl0Y2ggICAgICAgcmF4CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApCisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMSkKKworICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIGFyZygyKQorICAgIGxlYSAgICAgICAgIHJjeCwgW3JzaSArIHJheCoyXQorJWVsc2UKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorICAgICVkZWZpbmUgICAgIGlucHV0ICAgICAgIHJjeAorICAgICVkZWZpbmUgICAgIG91dHB1dCAgICAgIHJkeAorICAgICVkZWZpbmUgICAgIHBpdGNoICAgICAgIHI4CisgICAgU0FWRV9YTU0gNywgdQorICAlZWxzZQorICAgICVkZWZpbmUgICAgIGlucHV0ICAgICAgIHJkaQorICAgICVkZWZpbmUgICAgIG91dHB1dCAgICAgIHJzaQorICAgICVkZWZpbmUgICAgIHBpdGNoICAgICAgIHJkeAorICAlZW5kaWYKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTVEFDS19GUkFNRV9ERVNUUk9ZIDAKKyAgJWRlZmluZSAgICAgaW5wdXQKKyAgJWRlZmluZSAgICAgb3V0cHV0CisgICVkZWZpbmUgICAgIHBpdGNoCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBwb3AgICAgICAgICByZGkKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIHBvcCAgICAgICAgIHJicAorJWVsc2UKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorICAgIFJFU1RPUkVfWE1NCisgICVlbmRpZgorJWVuZGlmCisgICAgcmV0CislZW5kbWFjcm8KKworO3ZvaWQgdnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMihzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKK2dsb2JhbCBzeW0odnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMikgUFJJVkFURQorc3ltKHZwOF9zaG9ydF9mZGN0NHg0X3NzZTIpOgorCisgICAgU1RBQ0tfRlJBTUVfQ1JFQVRFCisKKyAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSW2lucHV0ICAgICAgICBdIDswMyAwMiAwMSAwMAorICAgIG1vdnEgICAgICAgIHhtbTIsIE1NV09SRCBQVFJbaW5wdXQrICBwaXRjaF0gOzEzIDEyIDExIDEwCisgICAgbGVhICAgICAgICAgaW5wdXQsICAgICAgICAgIFtpbnB1dCsyKnBpdGNoXQorICAgIG1vdnEgICAgICAgIHhtbTEsIE1NV09SRCBQVFJbaW5wdXQgICAgICAgIF0gOzIzIDIyIDIxIDIwCisgICAgbW92cSAgICAgICAgeG1tMywgTU1XT1JEIFBUUltpbnB1dCsgIHBpdGNoXSA7MzMgMzIgMzEgMzAKKworICAgIHB1bnBja2xxZHEgIHhtbTAsIHhtbTIgICAgICAgICAgICAgICAgICAgICAgOzEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisgICAgcHVucGNrbHFkcSAgeG1tMSwgeG1tMyAgICAgICAgICAgICAgICAgICAgICA7MzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAKKworICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTAKKyAgICBwdW5wY2tsZHEgICB4bW0wLCB4bW0xICAgICAgICAgICAgICAgICAgICAgIDsyMyAyMiAwMyAwMiAyMSAyMCAwMSAwMAorICAgIHB1bnBja2hkcSAgIHhtbTIsIHhtbTEgICAgICAgICAgICAgICAgICAgICAgOzMzIDMyIDEzIDEyIDMxIDMwIDExIDEwCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAorICAgIHB1bnBja2xkcSAgIHhtbTAsIHhtbTIgICAgICAgICAgICAgICAgICAgICAgOzMxIDIxIDMwIDIwIDExIDEwIDAxIDAwCisgICAgcHNodWZodyAgICAgeG1tMSwgeG1tMSwgMGIxaCAgICAgICAgICAgICAgICA7MjIgMjMgMDIgMDMgeHggeHggeHggeHgKKyAgICBwc2h1Zmh3ICAgICB4bW0yLCB4bW0yLCAwYjFoICAgICAgICAgICAgICAgIDszMiAzMyAxMiAxMyB4eCB4eCB4eCB4eAorCisgICAgcHVucGNraGRxICAgeG1tMSwgeG1tMiAgICAgICAgICAgICAgICAgICAgICA7MzIgMzMgMjIgMjMgMTIgMTMgMDIgMDMKKyAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0wCisgICAgcGFkZHcgICAgICAgeG1tMCwgeG1tMSAgICAgICAgICAgICAgICAgICAgICA7YjEgYTEgYjEgYTEgYjEgYTEgYjEgYTEKKyAgICBwc3VidyAgICAgICB4bW0zLCB4bW0xICAgICAgICAgICAgICAgICAgICAgIDtjMSBkMSBjMSBkMSBjMSBkMSBjMSBkMQorICAgIHBzbGx3ICAgICAgIHhtbTAsIDMgICAgICAgICAgICAgICAgICAgICAgICAgO2IxIDw8PSAzIGExIDw8PSAzCisgICAgcHNsbHcgICAgICAgeG1tMywgMyAgICAgICAgICAgICAgICAgICAgICAgICA7YzEgPDw9IDMgZDEgPDw9IDMKKworICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKKyAgICBwbWFkZHdkICAgICB4bW0wLCBYTU1XT1JEIFBUUltHTE9CQUwoX211bHRfYWRkKV0gICAgO2ExICsgYjEKKyAgICBwbWFkZHdkICAgICB4bW0xLCBYTU1XT1JEIFBUUltHTE9CQUwoX211bHRfc3ViKV0gICAgO2ExIC0gYjEKKyAgICBtb3ZkcWEgICAgICB4bW00LCB4bW0zCisgICAgcG1hZGR3ZCAgICAgeG1tMywgWE1NV09SRCBQVFJbR0xPQkFMKF81MzUyXzIyMTcpXSAgIDtjMSoyMjE3ICsgZDEqNTM1MgorICAgIHBtYWRkd2QgICAgIHhtbTQsIFhNTVdPUkQgUFRSW0dMT0JBTChfMjIxN19uZWc1MzUyKV07ZDEqMjIxNyAtIGMxKjUzNTIKKworICAgIHBhZGRkICAgICAgIHhtbTMsIFhNTVdPUkQgUFRSW0dMT0JBTChfMTQ1MDApXQorICAgIHBhZGRkICAgICAgIHhtbTQsIFhNTVdPUkQgUFRSW0dMT0JBTChfNzUwMCldCisgICAgcHNyYWQgICAgICAgeG1tMywgMTIgICAgICAgICAgICA7KGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjEyCisgICAgcHNyYWQgICAgICAgeG1tNCwgMTIgICAgICAgICAgICA7KGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjEyCisKKyAgICBwYWNrc3NkdyAgICB4bW0wLCB4bW0xICAgICAgICAgICAgICAgICAgICAgIDtvcFsyXSBvcFswXQorICAgIHBhY2tzc2R3ICAgIHhtbTMsIHhtbTQgICAgICAgICAgICAgICAgICAgICAgO29wWzNdIG9wWzFdCisgICAgOyAyMyAyMiAyMSAyMCAwMyAwMiAwMSAwMAorICAgIDsKKyAgICA7IDMzIDMyIDMxIDMwIDEzIDEyIDExIDEwCisgICAgOworICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTAKKyAgICBwdW5wY2tscWRxICB4bW0wLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDsxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAorICAgIHB1bnBja2hxZHEgIHhtbTIsIHhtbTMgICAgICAgICAgICAgICAgICAgICAgOzIzIDIyIDIxIDIwIDMzIDMyIDMxIDMwCisKKyAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0wCisgICAgcHVucGNrbHdkICAgeG1tMCwgeG1tMiAgICAgICAgICAgICAgICAgICAgICA7MzIgMzAgMjIgMjAgMTIgMTAgMDIgMDAKKyAgICBwdW5wY2tod2QgICB4bW0zLCB4bW0yICAgICAgICAgICAgICAgICAgICAgIDszMyAzMSAyMyAyMSAxMyAxMSAwMyAwMQorICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTAKKyAgICBwdW5wY2tsd2QgICB4bW0wLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDsxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAorICAgIHB1bnBja2h3ZCAgIHhtbTIsIHhtbTMgICAgICAgICAgICAgICAgICAgICAgOzMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwCisKKyAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUltHTE9CQUwoXzcpXQorICAgIHBzaHVmZCAgICAgIHhtbTIsIHhtbTIsIDA0ZWgKKyAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0wCisgICAgcGFkZHcgICAgICAgeG1tMCwgeG1tMiAgICAgICAgICAgICAgICAgICAgICA7YjEgYjEgYjEgYjEgYTEgYTEgYTEgYTEKKyAgICBwc3VidyAgICAgICB4bW0zLCB4bW0yICAgICAgICAgICAgICAgICAgICAgIDtjMSBjMSBjMSBjMSBkMSBkMSBkMSBkMQorCisgICAgcHNodWZkICAgICAgeG1tMCwgeG1tMCwgMGQ4aCAgICAgICAgICAgICAgICA7YjEgYjEgYTEgYTEgYjEgYjEgYTEgYTEKKyAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDtzYXZlIGQxIGZvciBjb21wYXJlCisgICAgcHNodWZkICAgICAgeG1tMywgeG1tMywgMGQ4aCAgICAgICAgICAgICAgICA7YzEgYzEgZDEgZDEgYzEgYzEgZDEgZDEKKyAgICBwc2h1Zmx3ICAgICB4bW0wLCB4bW0wLCAwZDhoICAgICAgICAgICAgICAgIDtiMSBiMSBhMSBhMSBiMSBhMSBiMSBhMQorICAgIHBzaHVmbHcgICAgIHhtbTMsIHhtbTMsIDBkOGggICAgICAgICAgICAgICAgO2MxIGMxIGQxIGQxIGMxIGQxIGMxIGQxCisgICAgcHNodWZodyAgICAgeG1tMCwgeG1tMCwgMGQ4aCAgICAgICAgICAgICAgICA7YjEgYTEgYjEgYTEgYjEgYTEgYjEgYTEKKyAgICBwc2h1Zmh3ICAgICB4bW0zLCB4bW0zLCAwZDhoICAgICAgICAgICAgICAgIDtjMSBkMSBjMSBkMSBjMSBkMSBjMSBkMQorICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKKyAgICBwbWFkZHdkICAgICB4bW0wLCBYTU1XT1JEIFBUUltHTE9CQUwoX211bHRfYWRkKV0gO2ExICsgYjEKKyAgICBwbWFkZHdkICAgICB4bW0xLCBYTU1XT1JEIFBUUltHTE9CQUwoX211bHRfc3ViKV0gO2ExIC0gYjEKKworICAgIHB4b3IgICAgICAgIHhtbTQsIHhtbTQgICAgICAgICAgICAgICAgICAgICAgO3plcm8gb3V0IGZvciBjb21wYXJlCisgICAgcGFkZGQgICAgICAgeG1tMCwgeG1tNQorICAgIHBhZGRkICAgICAgIHhtbTEsIHhtbTUKKyAgICBwY21wZXF3ICAgICB4bW0yLCB4bW00CisgICAgcHNyYWQgICAgICAgeG1tMCwgNCAgICAgICAgICAgICAgICAgICAgICAgICA7KGExICsgYjEgKyA3KT4+NAorICAgIHBzcmFkICAgICAgIHhtbTEsIDQgICAgICAgICAgICAgICAgICAgICAgICAgOyhhMSAtIGIxICsgNyk+PjQKKyAgICBwYW5kbiAgICAgICB4bW0yLCBYTU1XT1JEIFBUUltHTE9CQUwoX2NtcF9tYXNrKV0gO2NsZWFyIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7YW5kIGtlZXAgYml0IDAgb2YgbG93ZXIKKworICAgIG1vdmRxYSAgICAgIHhtbTQsIHhtbTMKKyAgICBwbWFkZHdkICAgICB4bW0zLCBYTU1XT1JEIFBUUltHTE9CQUwoXzUzNTJfMjIxNyldICAgIDtjMSoyMjE3ICsgZDEqNTM1MgorICAgIHBtYWRkd2QgICAgIHhtbTQsIFhNTVdPUkQgUFRSW0dMT0JBTChfMjIxN19uZWc1MzUyKV0gO2QxKjIyMTcgLSBjMSo1MzUyCisgICAgcGFkZGQgICAgICAgeG1tMywgWE1NV09SRCBQVFJbR0xPQkFMKF8xMjAwMCldCisgICAgcGFkZGQgICAgICAgeG1tNCwgWE1NV09SRCBQVFJbR0xPQkFMKF81MTAwMCldCisgICAgcGFja3NzZHcgICAgeG1tMCwgeG1tMSAgICAgICAgICAgICAgICAgICAgICA7b3BbOF0gb3BbMF0KKyAgICBwc3JhZCAgICAgICB4bW0zLCAxNiAgICAgICAgICAgICAgICA7KGMxICogMjIxNyArIGQxICogNTM1MiArICAxMjAwMCk+PjE2CisgICAgcHNyYWQgICAgICAgeG1tNCwgMTYgICAgICAgICAgICAgICAgOyhkMSAqIDIyMTcgLSBjMSAqIDUzNTIgKyAgNTEwMDApPj4xNgorCisgICAgcGFja3NzZHcgICAgeG1tMywgeG1tNCAgICAgICAgICAgICAgICAgICAgICA7b3BbMTJdIG9wWzRdCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAorICAgIHBhZGR3ICAgICAgIHhtbTMsIHhtbTIgICAgICAgICAgICAgICAgICAgICAgO29wWzRdICs9IChkMSE9MCkKKyAgICBwdW5wY2tscWRxICB4bW0wLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDtvcFs0XSBvcFswXQorICAgIHB1bnBja2hxZHEgIHhtbTEsIHhtbTMgICAgICAgICAgICAgICAgICAgICAgO29wWzEyXSBvcFs4XQorCisgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbb3V0cHV0ICsgIDBdLCB4bW0wCisgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbb3V0cHV0ICsgMTZdLCB4bW0xCisKKyAgICBTVEFDS19GUkFNRV9ERVNUUk9ZCisKKzt2b2lkIHZwOF9zaG9ydF9mZGN0OHg0X3NzZTIoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCitnbG9iYWwgc3ltKHZwOF9zaG9ydF9mZGN0OHg0X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfc2hvcnRfZmRjdDh4NF9zc2UyKToKKworICAgIFNUQUNLX0ZSQU1FX0NSRUFURQorCisgICAgICAgIDsgcmVhZCB0aGUgaW5wdXQgZGF0YQorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICBbaW5wdXQgICAgICAgIF0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgW2lucHV0KyAgcGl0Y2hdCisgICAgICAgIGxlYSAgICAgICAgIGlucHV0LCAgICAgIFtpbnB1dCsyKnBpdGNoXQorICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICBbaW5wdXQgICAgICAgIF0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgW2lucHV0KyAgcGl0Y2hdCisKKyAgICAgICAgOyB0cmFuc3Bvc2UgZm9yIHRoZSBmaXJzdCBzdGFnZQorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0wICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTQgICAgICAgIDsgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcKKworICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICB4bW0yICAgICAgICA7IDAwIDEwIDAxIDExIDAyIDEyIDAzIDEzCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTEsICAgICAgIHhtbTIgICAgICAgIDsgMDQgMTQgMDUgMTUgMDYgMTYgMDcgMTcKKworICAgICAgICBwdW5wY2tsd2QgICB4bW00LCAgICAgICB4bW0zICAgICAgICA7IDIwIDMwIDIxIDMxIDIyIDMyIDIzIDMzCisgICAgICAgIHB1bnBja2h3ZCAgIHhtbTUsICAgICAgIHhtbTMgICAgICAgIDsgMjQgMzQgMjUgMzUgMjYgMzYgMjcgMzcKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0wICAgICAgICA7IDAwIDEwIDAxIDExIDAyIDEyIDAzIDEzCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgIHhtbTQgICAgICAgIDsgMDAgMTAgMjAgMzAgMDEgMTEgMjEgMzEKKworICAgICAgICBwdW5wY2toZHEgICB4bW0yLCAgICAgICB4bW00ICAgICAgICA7IDAyIDEyIDIyIDMyIDAzIDEzIDIzIDMzCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMSAgICAgICAgOyAwNCAxNCAwNSAxNSAwNiAxNiAwNyAxNworICAgICAgICBwdW5wY2tsZHEgICB4bW00LCAgICAgICB4bW01ICAgICAgICA7IDA0IDE0IDI0IDM0IDA1IDE1IDI1IDM1CisKKyAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgeG1tNSAgICAgICAgOyAwNiAxNiAyNiAzNiAwNyAxNyAyNyAzNworICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICB4bW0yICAgICAgICA7IDAyIDEyIDIyIDMyIDAzIDEzIDIzIDMzCisKKyAgICAgICAgcHVucGNraHFkcSAgeG1tMywgICAgICAgeG1tMSAgICAgICAgOyAwMyAxMyAyMyAzMyAwNyAxNyAyNyAzNworICAgICAgICBwdW5wY2tscWRxICB4bW0yLCAgICAgICB4bW0xICAgICAgICA7IDAyIDEyIDIyIDMyIDA2IDE2IDI2IDM2CisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgOyAwMCAxMCAyMCAzMCAwMSAxMSAyMSAzMQorICAgICAgICBwdW5wY2tscWRxICB4bW0wLCAgICAgICB4bW00ICAgICAgICA7IDAwIDEwIDIwIDMwIDA0IDE0IDI0IDM0CisKKyAgICAgICAgcHVucGNraHFkcSAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgOyAwMSAxMSAyMSAzMiAwNSAxNSAyNSAzNQorCisgICAgICAgIDsgeG1tMCAwCisgICAgICAgIDsgeG1tMSAxCisgICAgICAgIDsgeG1tMiAyCisgICAgICAgIDsgeG1tMyAzCisKKyAgICAgICAgOyBmaXJzdCBzdGFnZQorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTEKKworICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICB4bW0zICAgICAgICA7IGExID0gMCArIDMKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgeG1tMiAgICAgICAgOyBiMSA9IDEgKyAyCisKKyAgICAgICAgcHN1YncgICAgICAgeG1tNCwgICAgICAgeG1tMiAgICAgICAgOyBjMSA9IDEgLSAyCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTUsICAgICAgIHhtbTMgICAgICAgIDsgZDEgPSAwIC0gMworCisgICAgICAgIHBzbGx3ICAgICAgIHhtbTUsICAgICAgICAzCisgICAgICAgIHBzbGx3ICAgICAgIHhtbTQsICAgICAgICAzCisKKyAgICAgICAgcHNsbHcgICAgICAgeG1tMCwgICAgICAgIDMKKyAgICAgICAgcHNsbHcgICAgICAgeG1tMSwgICAgICAgIDMKKworICAgICAgICA7IG91dHB1dCAwIGFuZCAyCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgIDsgYTEKKworICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICB4bW0xICAgICAgICA7IG9wWzBdID0gYTEgKyBiMQorICAgICAgICBwc3VidyAgICAgICB4bW0yLCAgICAgICB4bW0xICAgICAgICA7IG9wWzJdID0gYTEgLSBiMQorCisgICAgICAgIDsgb3V0cHV0IDEgYW5kIDMKKyAgICAgICAgOyBpbnRlcmxlYXZlIGMxLCBkMQorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW01ICAgICAgICA7IGQxCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgICAgIHhtbTQgICAgICAgIDsgYzEgZDEKKyAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgOyBjMSBkMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tNQorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTCAoXzUzNTJfMjIxNyldICAgIDsgYzEqMjIxNyArIGQxKjUzNTIKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMIChfNTM1Ml8yMjE3KV0gICAgOyBjMSoyMjE3ICsgZDEqNTM1MgorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfMjIxN19uZWc1MzUyKV0gIDsgZDEqMjIxNyAtIGMxKjUzNTIKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfMTQ1MDApXQorICAgICAgICBwYWRkZCAgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzE0NTAwKV0KKyAgICAgICAgcGFkZGQgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF83NTAwKV0KKyAgICAgICAgcGFkZGQgICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF83NTAwKV0KKworICAgICAgICBwc3JhZCAgICAgICB4bW0xLCAgICAgICAxMiAgICAgICAgICA7IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApPj4xMgorICAgICAgICBwc3JhZCAgICAgICB4bW00LCAgICAgICAxMiAgICAgICAgICA7IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApPj4xMgorICAgICAgICBwc3JhZCAgICAgICB4bW0zLCAgICAgICAxMiAgICAgICAgICA7IChkMSAqIDIyMTcgLSBjMSAqIDUzNTIgKyAgIDc1MDApPj4xMgorICAgICAgICBwc3JhZCAgICAgICB4bW01LCAgICAgICAxMiAgICAgICAgICA7IChkMSAqIDIyMTcgLSBjMSAqIDUzNTIgKyAgIDc1MDApPj4xMgorCisgICAgICAgIHBhY2tzc2R3ICAgIHhtbTEsICAgICAgIHhtbTQgICAgICAgIDsgb3BbMV0KKyAgICAgICAgcGFja3NzZHcgICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgOyBvcFszXQorCisgICAgICAgIDsgZG9uZSB3aXRoIHZlcnRpY2FsCisgICAgICAgIDsgdHJhbnNwb3NlIGZvciB0aGUgc2Vjb25kIHN0YWdlCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICA7IDAwIDEwIDIwIDMwIDA0IDE0IDI0IDM0CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTIgICAgICAgICA7IDAyIDEyIDIyIDMyIDA2IDE2IDI2IDM2CisKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgeG1tMSAgICAgICAgIDsgMDAgMDEgMTAgMTEgMjAgMjEgMzAgMzEKKyAgICAgICAgcHVucGNraHdkICAgeG1tNCwgICAgICAgeG1tMSAgICAgICAgIDsgMDQgMDUgMTQgMTUgMjQgMjUgMzQgMzUKKworICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICB4bW0zICAgICAgICAgOyAwMiAwMyAxMiAxMyAyMiAyMyAzMiAzMworICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICB4bW0zICAgICAgICAgOyAwNiAwNyAxNiAxNyAyNiAyNyAzNiAzNworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICA7IDAwIDAxIDEwIDExIDIwIDIxIDMwIDMxCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgIHhtbTIgICAgICAgICA7IDAwIDAxIDAyIDAzIDEwIDExIDEyIDEzCisKKyAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgeG1tMiAgICAgICAgIDsgMjAgMjEgMjIgMjMgMzAgMzEgMzIgMzMKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW00ICAgICAgICAgOyAwNCAwNSAxNCAxNSAyNCAyNSAzNCAzNQorICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICB4bW01ICAgICAgICAgOyAwNCAwNSAwNiAwNyAxNCAxNSAxNiAxNworCisgICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgIHhtbTUgICAgICAgICA7IDI0IDI1IDI2IDI3IDM0IDM1IDM2IDM3CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTEgICAgICAgICA7IDIwIDIxIDIyIDIzIDMwIDMxIDMyIDMzCisKKyAgICAgICAgcHVucGNraHFkcSAgeG1tMywgICAgICAgeG1tNCAgICAgICAgIDsgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcKKyAgICAgICAgcHVucGNrbHFkcSAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgIDsgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcKKworICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgOyAwMCAwMSAwMiAwMyAxMCAxMSAxMiAxMworICAgICAgICBwdW5wY2tscWRxICB4bW0wLCAgICAgICB4bW0yICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworCisgICAgICAgIHB1bnBja2hxZHEgIHhtbTQsICAgICAgIHhtbTIgICAgICAgICA7IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3CisKKyAgICAgICAgOyB4bW0wIDAKKyAgICAgICAgOyB4bW0xIDQKKyAgICAgICAgOyB4bW0yIDEKKyAgICAgICAgOyB4bW0zIDMKKworICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTEKKworICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICB4bW0zICAgICAgICA7IGExID0gMCArIDMKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgOyBiMSA9IDEgKyAyCisKKyAgICAgICAgcHN1YncgICAgICAgeG1tNCwgICAgICAgeG1tMiAgICAgICAgOyBjMSA9IDEgLSAyCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTUsICAgICAgIHhtbTMgICAgICAgIDsgZDEgPSAwIC0gMworCisgICAgICAgIHB4b3IgICAgICAgIHhtbTYsICAgICAgIHhtbTYgICAgICAgIDsgemVybyBvdXQgZm9yIGNvbXBhcmUKKworICAgICAgICBwY21wZXF3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICA7IGQxICE9IDAKKworICAgICAgICBwYW5kbiAgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoX2NtcF9tYXNrOHg0KV0gICA7IGNsZWFyIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFuZCBrZWVwIGJpdCAwIG9mIGxvd2VyCisKKyAgICAgICAgOyBvdXRwdXQgMCBhbmQgMgorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0wICAgICAgICA7IGExCisKKyAgICAgICAgcGFkZHcgICAgICAgeG1tMCwgICAgICAgeG1tMSAgICAgICAgOyBhMSArIGIxCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTIsICAgICAgIHhtbTEgICAgICAgIDsgYTEgLSBiMQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfN3cpXQorICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzd3KV0KKworICAgICAgICBwc3JhdyAgICAgICB4bW0wLCAgICAgICA0ICAgICAgICAgICA7IG9wWzBdID0gKGExICsgYjEgKyA3KT4+NAorICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICA0ICAgICAgICAgICA7IG9wWzhdID0gKGExIC0gYjEgKyA3KT4+NAorCisgICAgICAgIDsgb3V0cHV0IDEgYW5kIDMKKyAgICAgICAgOyBpbnRlcmxlYXZlIGMxLCBkMQorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW01ICAgICAgICA7IGQxCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgICAgIHhtbTQgICAgICAgIDsgYzEgZDEKKyAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgOyBjMSBkMQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tNQorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTCAoXzUzNTJfMjIxNyldICAgIDsgYzEqMjIxNyArIGQxKjUzNTIKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMIChfNTM1Ml8yMjE3KV0gICAgOyBjMSoyMjE3ICsgZDEqNTM1MgorCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfMjIxN19uZWc1MzUyKV0gIDsgZDEqMjIxNyAtIGMxKjUzNTIKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfMTIwMDApXQorICAgICAgICBwYWRkZCAgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzEyMDAwKV0KKyAgICAgICAgcGFkZGQgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF81MTAwMCldCisgICAgICAgIHBhZGRkICAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfNTEwMDApXQorCisgICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgICAgIDE2ICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjE2CisgICAgICAgIHBzcmFkICAgICAgIHhtbTQsICAgICAgIDE2ICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjE2CisgICAgICAgIHBzcmFkICAgICAgIHhtbTMsICAgICAgIDE2ICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjE2CisgICAgICAgIHBzcmFkICAgICAgIHhtbTUsICAgICAgIDE2ICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjE2CisKKyAgICAgICAgcGFja3NzZHcgICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgOyBvcFs0XQorICAgICAgICBwYWNrc3NkdyAgICB4bW0zLCAgICAgICB4bW01ICAgICAgICA7IG9wWzEyXQorCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIHhtbTYgICAgICAgIDsgb3BbNF0gKz0gKGQxIT0wKQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMgorCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTAsICAgICAgIHhtbTEKKyAgICAgICAgcHVucGNraHFkcSAgeG1tNCwgICAgICAgeG1tMQorCisgICAgICAgIHB1bnBja2xxZHEgIHhtbTIsICAgICAgIHhtbTMKKyAgICAgICAgcHVucGNraHFkcSAgeG1tNSwgICAgICAgeG1tMworCisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSW291dHB1dCArIDAgXSwgIHhtbTAKKyAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbb3V0cHV0ICsgMTZdLCAgeG1tMgorICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUltvdXRwdXQgKyAzMl0sICB4bW00CisgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSW291dHB1dCArIDQ4XSwgIHhtbTUKKworICAgIFNUQUNLX0ZSQU1FX0RFU1RST1kKKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDE2CitfNTM1Ml8yMjE3OgorICAgIGR3IDUzNTIKKyAgICBkdyAyMjE3CisgICAgZHcgNTM1MgorICAgIGR3IDIyMTcKKyAgICBkdyA1MzUyCisgICAgZHcgMjIxNworICAgIGR3IDUzNTIKKyAgICBkdyAyMjE3CithbGlnbiAxNgorXzIyMTdfbmVnNTM1MjoKKyAgICBkdyAyMjE3CisgICAgZHcgLTUzNTIKKyAgICBkdyAyMjE3CisgICAgZHcgLTUzNTIKKyAgICBkdyAyMjE3CisgICAgZHcgLTUzNTIKKyAgICBkdyAyMjE3CisgICAgZHcgLTUzNTIKK2FsaWduIDE2CitfbXVsdF9hZGQ6CisgICAgdGltZXMgOCBkdyAxCithbGlnbiAxNgorX2NtcF9tYXNrOgorICAgIHRpbWVzIDQgZHcgMQorICAgIHRpbWVzIDQgZHcgMAorYWxpZ24gMTYKK19jbXBfbWFzazh4NDoKKyAgICB0aW1lcyA4IGR3IDEKK2FsaWduIDE2CitfbXVsdF9zdWI6CisgICAgZHcgMQorICAgIGR3IC0xCisgICAgZHcgMQorICAgIGR3IC0xCisgICAgZHcgMQorICAgIGR3IC0xCisgICAgZHcgMQorICAgIGR3IC0xCithbGlnbiAxNgorXzc6CisgICAgdGltZXMgNCBkZCA3CithbGlnbiAxNgorXzd3OgorICAgIHRpbWVzIDggZHcgNworYWxpZ24gMTYKK18xNDUwMDoKKyAgICB0aW1lcyA0IGRkIDE0NTAwCithbGlnbiAxNgorXzc1MDA6CisgICAgdGltZXMgNCBkZCA3NTAwCithbGlnbiAxNgorXzEyMDAwOgorICAgIHRpbWVzIDQgZGQgMTIwMDAKK2FsaWduIDE2CitfNTEwMDA6CisgICAgdGltZXMgNCBkZCA1MTAwMApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9kZW5vaXNpbmdfc3NlMi5jIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9kZW5vaXNpbmdfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWM2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L2Rlbm9pc2luZ19zc2UyLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgInZwOC9lbmNvZGVyL2Rlbm9pc2luZy5oIgorI2luY2x1ZGUgInZwOC9jb21tb24vcmVjb25pbnRlci5oIgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZweF9ydGNkLmgiCisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKwordW5pb24gc3VtX3VuaW9uIHsKKyAgICBfX20xMjhpIHY7CisgICAgc2lnbmVkIGNoYXIgZVsxNl07Cit9OworCitpbnQgdnA4X2Rlbm9pc2VyX2ZpbHRlcl9zc2UyKFlWMTJfQlVGRkVSX0NPTkZJRyAqbWNfcnVubmluZ19hdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqcnVubmluZ19hdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0sgKnNpZ25hbCwgdW5zaWduZWQgaW50IG1vdGlvbl9tYWduaXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X29mZnNldCwgaW50IHV2X29mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpzaWcgPSBzaWduYWwtPnRoaXNtYjsKKyAgICBpbnQgc2lnX3N0cmlkZSA9IDE2OworICAgIHVuc2lnbmVkIGNoYXIgKm1jX3J1bm5pbmdfYXZnX3kgPSBtY19ydW5uaW5nX2F2Zy0+eV9idWZmZXIgKyB5X29mZnNldDsKKyAgICBpbnQgbWNfYXZnX3lfc3RyaWRlID0gbWNfcnVubmluZ19hdmctPnlfc3RyaWRlOworICAgIHVuc2lnbmVkIGNoYXIgKnJ1bm5pbmdfYXZnX3kgPSBydW5uaW5nX2F2Zy0+eV9idWZmZXIgKyB5X29mZnNldDsKKyAgICBpbnQgYXZnX3lfc3RyaWRlID0gcnVubmluZ19hdmctPnlfc3RyaWRlOworICAgIGludCByOworICAgIF9fbTEyOGkgYWNjX2RpZmYgPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGNvbnN0IF9fbTEyOGkga18wID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBjb25zdCBfX20xMjhpIGtfNCA9IF9tbV9zZXQxX2VwaTgoNCk7CisgICAgY29uc3QgX19tMTI4aSBrXzggPSBfbW1fc2V0MV9lcGk4KDgpOworICAgIGNvbnN0IF9fbTEyOGkga18xNiA9IF9tbV9zZXQxX2VwaTgoMTYpOworICAgIC8qIE1vZGlmeSBlYWNoIGxldmVsJ3MgYWRqdXN0bWVudCBhY2NvcmRpbmcgdG8gbW90aW9uX21hZ25pdHVkZS4gKi8KKyAgICBjb25zdCBfX20xMjhpIGwzID0gX21tX3NldDFfZXBpOCgKKyAgICAgICAgICAgICAgICAgICAgICAobW90aW9uX21hZ25pdHVkZSA8PSBNT1RJT05fTUFHTklUVURFX1RIUkVTSE9MRCkgPyA3IDogNik7CisgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIGxldmVsIDMgYW5kIGxldmVsIDIgaXMgMi4gKi8KKyAgICBjb25zdCBfX20xMjhpIGwzMiA9IF9tbV9zZXQxX2VwaTgoMik7CisgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIGxldmVsIDIgYW5kIGxldmVsIDEgaXMgMS4gKi8KKyAgICBjb25zdCBfX20xMjhpIGwyMSA9IF9tbV9zZXQxX2VwaTgoMSk7CisKKyAgICBmb3IgKHIgPSAwOyByIDwgMTY7ICsrcikKKyAgICB7CisgICAgICAgIC8qIENhbGN1bGF0ZSBkaWZmZXJlbmNlcyAqLworICAgICAgICBjb25zdCBfX20xMjhpIHZfc2lnID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpICopKCZzaWdbMF0pKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSB2X21jX3J1bm5pbmdfYXZnX3kgPSBfbW1fbG9hZHVfc2kxMjgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbTEyOGkgKikoJm1jX3J1bm5pbmdfYXZnX3lbMF0pKTsKKyAgICAgICAgX19tMTI4aSB2X3J1bm5pbmdfYXZnX3k7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgcGRpZmYgPSBfbW1fc3Vic19lcHU4KHZfbWNfcnVubmluZ19hdmdfeSwgdl9zaWcpOworICAgICAgICBjb25zdCBfX20xMjhpIG5kaWZmID0gX21tX3N1YnNfZXB1OCh2X3NpZywgdl9tY19ydW5uaW5nX2F2Z195KTsKKyAgICAgICAgLyogT2J0YWluIHRoZSBzaWduLiBGRiBpZiBkaWZmIGlzIG5lZ2F0aXZlLiAqLworICAgICAgICBjb25zdCBfX20xMjhpIGRpZmZfc2lnbiA9IF9tbV9jbXBlcV9lcGk4KHBkaWZmLCBrXzApOworICAgICAgICAvKiBDbGFtcCBhYnNvbHV0ZSBkaWZmZXJlbmNlIHRvIDE2IHRvIGJlIHVzZWQgdG8gZ2V0IG1hc2suIERvaW5nIHRoaXMKKyAgICAgICAgICogYWxsb3dzIHVzIHRvIHVzZSBfbW1fY21wZ3RfZXBpOCwgd2hpY2ggb3BlcmF0ZXMgb24gc2lnbmVkIGJ5dGUuICovCisgICAgICAgIGNvbnN0IF9fbTEyOGkgY2xhbXBlZF9hYnNkaWZmID0gX21tX21pbl9lcHU4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9vcl9zaTEyOChwZGlmZiwgbmRpZmYpLCBrXzE2KTsKKyAgICAgICAgLyogR2V0IG1hc2tzIGZvciBsMiBsMSBhbmQgbDAgYWRqdXN0bWVudHMgKi8KKyAgICAgICAgY29uc3QgX19tMTI4aSBtYXNrMiA9IF9tbV9jbXBndF9lcGk4KGtfMTYsIGNsYW1wZWRfYWJzZGlmZik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgbWFzazEgPSBfbW1fY21wZ3RfZXBpOChrXzgsIGNsYW1wZWRfYWJzZGlmZik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgbWFzazAgPSBfbW1fY21wZ3RfZXBpOChrXzQsIGNsYW1wZWRfYWJzZGlmZik7CisgICAgICAgIC8qIEdldCBhZGp1c3RtZW50cyBmb3IgbDIsIGwxLCBhbmQgbDAgKi8KKyAgICAgICAgX19tMTI4aSBhZGoyID0gX21tX2FuZF9zaTEyOChtYXNrMiwgbDMyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBhZGoxID0gX21tX2FuZF9zaTEyOChtYXNrMSwgbDIxKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBhZGowID0gX21tX2FuZF9zaTEyOChtYXNrMCwgY2xhbXBlZF9hYnNkaWZmKTsKKyAgICAgICAgX19tMTI4aSBhZGosICBwYWRqLCBuYWRqOworCisgICAgICAgIC8qIENvbWJpbmUgdGhlIGFkanVzdG1lbnRzIGFuZCBnZXQgYWJzb2x1dGUgYWRqdXN0bWVudHMuICovCisgICAgICAgIGFkajIgPSBfbW1fYWRkX2VwaTgoYWRqMiwgYWRqMSk7CisgICAgICAgIGFkaiA9IF9tbV9zdWJfZXBpOChsMywgYWRqMik7CisgICAgICAgIGFkaiA9IF9tbV9hbmRub3Rfc2kxMjgobWFzazAsIGFkaik7CisgICAgICAgIGFkaiA9IF9tbV9vcl9zaTEyOChhZGosIGFkajApOworCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIHNpZ24gYW5kIGdldCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgYWRqdXN0bWVudHMuICovCisgICAgICAgIHBhZGogPSBfbW1fYW5kbm90X3NpMTI4KGRpZmZfc2lnbiwgYWRqKTsKKyAgICAgICAgbmFkaiA9IF9tbV9hbmRfc2kxMjgoZGlmZl9zaWduLCBhZGopOworCisgICAgICAgIC8qIENhbGN1bGF0ZSBmaWx0ZXJlZCB2YWx1ZS4gKi8KKyAgICAgICAgdl9ydW5uaW5nX2F2Z195ID0gX21tX2FkZHNfZXB1OCh2X3NpZywgcGFkaik7CisgICAgICAgIHZfcnVubmluZ19hdmdfeSA9IF9tbV9zdWJzX2VwdTgodl9ydW5uaW5nX2F2Z195LCBuYWRqKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSAqKXJ1bm5pbmdfYXZnX3ksIHZfcnVubmluZ19hdmdfeSk7CisKKyAgICAgICAgLyogQWRqdXN0bWVudHMgPD03LCBhbmQgZWFjaCBlbGVtZW50IGluIGFjY19kaWZmIGNhbiBmaXQgaW4gc2lnbmVkCisgICAgICAgICAqIGNoYXIuCisgICAgICAgICAqLworICAgICAgICBhY2NfZGlmZiA9IF9tbV9hZGRzX2VwaTgoYWNjX2RpZmYsIHBhZGopOworICAgICAgICBhY2NfZGlmZiA9IF9tbV9zdWJzX2VwaTgoYWNjX2RpZmYsIG5hZGopOworCisgICAgICAgIC8qIFVwZGF0ZSBwb2ludGVycyBmb3IgbmV4dCBpdGVyYXRpb24uICovCisgICAgICAgIHNpZyArPSBzaWdfc3RyaWRlOworICAgICAgICBtY19ydW5uaW5nX2F2Z195ICs9IG1jX2F2Z195X3N0cmlkZTsKKyAgICAgICAgcnVubmluZ19hdmdfeSArPSBhdmdfeV9zdHJpZGU7CisgICAgfQorCisgICAgeworICAgICAgICAvKiBDb21wdXRlIHRoZSBzdW0gb2YgYWxsIHBpeGVsIGRpZmZlcmVuY2VzIG9mIHRoaXMgTUIuICovCisgICAgICAgIHVuaW9uIHN1bV91bmlvbiBzOworICAgICAgICBpbnQgc3VtX2RpZmYgPSAwOworICAgICAgICBzLnYgPSBhY2NfZGlmZjsKKyAgICAgICAgc3VtX2RpZmYgPSBzLmVbMF0gKyBzLmVbMV0gKyBzLmVbMl0gKyBzLmVbM10gKyBzLmVbNF0gKyBzLmVbNV0KKyAgICAgICAgICAgICAgICAgKyBzLmVbNl0gKyBzLmVbN10gKyBzLmVbOF0gKyBzLmVbOV0gKyBzLmVbMTBdICsgcy5lWzExXQorICAgICAgICAgICAgICAgICArIHMuZVsxMl0gKyBzLmVbMTNdICsgcy5lWzE0XSArIHMuZVsxNV07CisKKyAgICAgICAgaWYgKGFicyhzdW1fZGlmZikgPiBTVU1fRElGRl9USFJFU0hPTEQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDT1BZX0JMT0NLOworICAgICAgICB9CisgICAgfQorCisgICAgdnA4X2NvcHlfbWVtMTZ4MTYocnVubmluZ19hdmctPnlfYnVmZmVyICsgeV9vZmZzZXQsIGF2Z195X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaWduYWwtPnRoaXNtYiwgc2lnX3N0cmlkZSk7CisgICAgcmV0dXJuIEZJTFRFUl9CTE9DSzsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci94ODYvZW5jb2Rlb3B0LmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvZW5jb2Rlb3B0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI2YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9lbmNvZGVvcHQuYXNtCkBAIC0wLDAgKzEsMzg2IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCislaW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCisKKztpbnQgdnA4X2Jsb2NrX2Vycm9yX3htbShzaG9ydCAqY29lZmZfcHRyLCAgc2hvcnQgKmRjb2VmX3B0cikKK2dsb2JhbCBzeW0odnA4X2Jsb2NrX2Vycm9yX3htbSkgUFJJVkFURQorc3ltKHZwOF9ibG9ja19lcnJvcl94bW0pOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMgorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2d1ZQorCisgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7Y29lZmZfcHRyCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZGNvZWZfcHRyCisKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgW3JzaV0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgW3JkaV0KKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBbcnNpKzE2XQorICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBbcmRpKzE2XQorCisgICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgIHhtbTEKKyAgICAgICAgcHN1YncgICAgICAgeG1tMiwgICAgICAgeG1tMworCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTAsICAgICAgIHhtbTAKKyAgICAgICAgcG1hZGR3ZCAgICAgeG1tMiwgICAgICAgeG1tMgorCisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgIHhtbTIKKworICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICB4bW01CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIHhtbTAKKworICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICB4bW01CisgICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgIHhtbTUKKworICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICB4bW0xCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIHhtbTAKKworICAgICAgICBwc3JsZHEgICAgICB4bW0wLCAgICAgICA4CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgIHhtbTEKKworICAgICAgICBtb3ZxICAgICAgICByYXgsICAgICAgICB4bW0wCisKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7aW50IHZwOF9ibG9ja19lcnJvcl9tbXgoc2hvcnQgKmNvZWZmX3B0ciwgIHNob3J0ICpkY29lZl9wdHIpCitnbG9iYWwgc3ltKHZwOF9ibG9ja19lcnJvcl9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfYmxvY2tfZXJyb3JfbW14KToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDIKKyAgICBwdXNoIHJzaQorICAgIHB1c2ggcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO2NvZWZmX3B0cgorICAgICAgICBweG9yICAgICAgICBtbTcsICAgICAgICBtbTcKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO2Rjb2VmX3B0cgorICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBbcnNpXQorCisgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyZGldCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIFtyc2krOF0KKworICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcmRpKzhdCisgICAgICAgIHB4b3IgICAgICAgIG1tMSwgICAgICAgIG1tMSA7IGZyb20gbW92ZCBtbTEsIGRjIDsgZGMgPTAKKworICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTcKKyAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW02CisKKyAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICAgICAgbW0yCisgICAgICAgIHBtYWRkd2QgICAgIG1tNSwgICAgICAgIG1tNQorCisgICAgICAgIHBjbXBlcXcgICAgIG1tMSwgICAgICAgIG1tNworICAgICAgICBwc3VidyAgICAgICBtbTMsICAgICAgICBtbTQKKworICAgICAgICBwYW5kICAgICAgICBtbTEsICAgICAgICBtbTMKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0xLCAgICAgICAgbW0xCisKKyAgICAgICAgcGFkZGQgICAgICAgbW0xLCAgICAgICAgbW01CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2krMTZdCisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JkaSsxNl0KKyAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgW3JzaSsyNF0KKworICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcmRpKzI0XQorICAgICAgICBwc3VidyAgICAgICBtbTUsICAgICAgICBtbTYKKworICAgICAgICBwbWFkZHdkICAgICBtbTUsICAgICAgICBtbTUKKyAgICAgICAgcHN1YncgICAgICAgbW0zLCAgICAgICAgbW00CisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0zLCAgICAgICAgbW0zCisgICAgICAgIHBhZGRkICAgICAgIG1tMywgICAgICAgIG1tNQorCisgICAgICAgIHBhZGRkICAgICAgIG1tMSwgICAgICAgIG1tMworICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBtbTEKKworICAgICAgICBwc3JscSAgICAgICBtbTEsICAgICAgICAzMgorICAgICAgICBwYWRkZCAgICAgICBtbTAsICAgICAgICBtbTEKKworICAgICAgICBtb3ZxICAgICAgICByYXgsICAgICAgICBtbTAKKworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO2ludCB2cDhfbWJibG9ja19lcnJvcl9tbXhfaW1wbChzaG9ydCAqY29lZmZfcHRyLCBzaG9ydCAqZGNvZWZfcHRyLCBpbnQgZGMpOworZ2xvYmFsIHN5bSh2cDhfbWJibG9ja19lcnJvcl9tbXhfaW1wbCkgUFJJVkFURQorc3ltKHZwOF9tYmJsb2NrX2Vycm9yX21teF9pbXBsKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDMKKyAgICBwdXNoIHJzaQorICAgIHB1c2ggcmRpCisgICAgOyBlbmQgcHJvbG9nCisKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO2NvZWZmX3B0cgorICAgICAgICBweG9yICAgICAgICBtbTcsICAgICAgICBtbTcKKworICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO2Rjb2VmX3B0cgorICAgICAgICBweG9yICAgICAgICBtbTIsICAgICAgICBtbTIKKworICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtkYworICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTIKKworICAgICAgICBwY21wZXF3ICAgICBtbTEsICAgICAgICBtbTcKKyAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgMTYKKworLm1iZXJyb3JfbG9vcF9tbXg6CisgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgW3JzaV0KKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICBbcmRpXQorCisgICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgW3JzaSs4XQorICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgIFtyZGkrOF0KKworCisgICAgICAgIHBzdWJ3ICAgICAgIG1tNSwgICAgICAgIG1tNgorICAgICAgICBwbWFkZHdkICAgICBtbTUsICAgICAgICBtbTUKKworICAgICAgICBwc3VidyAgICAgICBtbTMsICAgICAgICBtbTQKKyAgICAgICAgcGFuZCAgICAgICAgbW0zLCAgICAgICAgbW0xCisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0zLCAgICAgICAgbW0zCisgICAgICAgIHBhZGRkICAgICAgIG1tMiwgICAgICAgIG1tNQorCisgICAgICAgIHBhZGRkICAgICAgIG1tMiwgICAgICAgIG1tMworICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgIFtyc2krMTZdCisKKyAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICBbcmRpKzE2XQorICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgIFtyc2krMjRdCisKKyAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICBbcmRpKzI0XQorICAgICAgICBwc3VidyAgICAgICBtbTUsICAgICAgICBtbTYKKworICAgICAgICBwbWFkZHdkICAgICBtbTUsICAgICAgICBtbTUKKyAgICAgICAgcHN1YncgICAgICAgbW0zLCAgICAgICAgbW00CisKKyAgICAgICAgcG1hZGR3ZCAgICAgbW0zLCAgICAgICAgbW0zCisgICAgICAgIHBhZGRkICAgICAgIG1tMiwgICAgICAgIG1tNQorCisgICAgICAgIHBhZGRkICAgICAgIG1tMiwgICAgICAgIG1tMworICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAzMgorCisgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIDMyCisgICAgICAgIHN1YiAgICAgICAgIHJjeCwgICAgICAgIDEKKworICAgICAgICBqbnogICAgICAgICAubWJlcnJvcl9sb29wX21teAorCisgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIG1tMgorICAgICAgICBwc3JscSAgICAgICBtbTIsICAgICAgICAzMgorCisgICAgICAgIHBhZGRkICAgICAgIG1tMCwgICAgICAgIG1tMgorICAgICAgICBtb3ZxICAgICAgICByYXgsICAgICAgICBtbTAKKworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO2ludCB2cDhfbWJibG9ja19lcnJvcl94bW1faW1wbChzaG9ydCAqY29lZmZfcHRyLCBzaG9ydCAqZGNvZWZfcHRyLCBpbnQgZGMpOworZ2xvYmFsIHN5bSh2cDhfbWJibG9ja19lcnJvcl94bW1faW1wbCkgUFJJVkFURQorc3ltKHZwOF9tYmJsb2NrX2Vycm9yX3htbV9pbXBsKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDMKKyAgICBTQVZFX1hNTSA2CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisKKyAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtjb2VmZl9wdHIKKyAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgeG1tNgorCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZGNvZWZfcHRyCisgICAgICAgIHB4b3IgICAgICAgIHhtbTQsICAgICAgIHhtbTQKKworICAgICAgICBtb3ZkICAgICAgICB4bW01LCAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtkYworICAgICAgICBwb3IgICAgICAgICB4bW01LCAgICAgICB4bW00CisKKyAgICAgICAgcGNtcGVxdyAgICAgeG1tNSwgICAgICAgeG1tNgorICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAxNgorCisubWJlcnJvcl9sb29wOgorICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICBbcnNpXQorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmRpXQorCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIFtyc2krMTZdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIFtyZGkrMTZdCisKKworICAgICAgICBwc3VidyAgICAgICB4bW0yLCAgICAgICB4bW0zCisgICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgIHhtbTIKKworICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICB4bW0xCisgICAgICAgIHBhbmQgICAgICAgIHhtbTAsICAgICAgIHhtbTUKKworICAgICAgICBwbWFkZHdkICAgICB4bW0wLCAgICAgICB4bW0wCisgICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIDMyCisKKyAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgMzIKKworICAgICAgICBzdWIgICAgICAgICByY3gsICAgICAgICAxCisgICAgICAgIHBhZGRkICAgICAgIHhtbTQsICAgICAgIHhtbTIKKworICAgICAgICBwYWRkZCAgICAgICB4bW00LCAgICAgICB4bW0wCisgICAgICAgIGpueiAgICAgICAgIC5tYmVycm9yX2xvb3AKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICB4bW00CisgICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgIHhtbTYKKworICAgICAgICBwdW5wY2toZHEgICB4bW00LCAgICAgICB4bW02CisgICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgIHhtbTQKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0wCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTAsICAgICAgIDgKKworICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICB4bW0xCisgICAgICAgIG1vdnEgICAgICAgIHJheCwgICAgICAgIHhtbTAKKworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7aW50IHZwOF9tYnV2ZXJyb3JfbW14X2ltcGwoc2hvcnQgKnNfcHRyLCBzaG9ydCAqZF9wdHIpOworZ2xvYmFsIHN5bSh2cDhfbWJ1dmVycm9yX21teF9pbXBsKSBQUklWQVRFCitzeW0odnA4X21idXZlcnJvcl9tbXhfaW1wbCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyAyCisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c19wdHIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZF9wdHIKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgMTYKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNworCisubWJ1dmVycm9yX2xvb3BfbW14OgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgW3JkaV0KKworICAgICAgICBwc3VidyAgICAgICAgICAgbW0xLCAgICAgICAgbW0yCisgICAgICAgIHBtYWRkd2QgICAgICAgICBtbTEsICAgICAgICBtbTEKKworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBbcnNpKzhdCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICBbcmRpKzhdCisKKyAgICAgICAgcHN1YncgICAgICAgICAgIG1tMywgICAgICAgIG1tNAorICAgICAgICBwbWFkZHdkICAgICAgICAgbW0zLCAgICAgICAgbW0zCisKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgbW0xCisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICBtbTMKKworCisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAxNgorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgMTYKKworICAgICAgICBkZWMgICAgICAgICAgICAgcmN4CisgICAgICAgIGpueiAgICAgICAgICAgICAubWJ1dmVycm9yX2xvb3BfbW14CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNworICAgICAgICBwc3JscSAgICAgICAgICAgbW03LCAgICAgICAgMzIKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW0wLCAgICAgICAgbW03CisgICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTAKKworICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKworO2ludCB2cDhfbWJ1dmVycm9yX3htbV9pbXBsKHNob3J0ICpzX3B0ciwgc2hvcnQgKmRfcHRyKTsKK2dsb2JhbCBzeW0odnA4X21idXZlcnJvcl94bW1faW1wbCkgUFJJVkFURQorc3ltKHZwOF9tYnV2ZXJyb3JfeG1tX2ltcGwpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMgorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworCisgICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NfcHRyCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO2RfcHRyCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIDE2CisgICAgICAgIHB4b3IgICAgICAgICAgICB4bW0zLCAgICAgICB4bW0zCisKKy5tYnV2ZXJyb3JfbG9vcDoKKworICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMSwgICAgICAgW3JzaV0KKyAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIFtyZGldCisKKyAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTIKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsICAgICAgIHhtbTEKKworICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tMywgICAgICAgeG1tMQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAxNgorICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgMTYKKworICAgICAgICBkZWMgICAgICAgICAgICAgcmN4CisgICAgICAgIGpueiAgICAgICAgICAgICAubWJ1dmVycm9yX2xvb3AKKworICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMAorICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMworCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCisgICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW0wCisKKyAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKKworICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQorCisgICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4CisgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgICAgICB4bW0xCisKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9md2Fsc2hfc3NlMi5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L2Z3YWxzaF9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk4OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9md2Fsc2hfc3NlMi5hc20KQEAgLTAsMCArMSwxNjQgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworO3ZvaWQgdnA4X3Nob3J0X3dhbHNoNHg0X3NzZTIoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCitnbG9iYWwgc3ltKHZwOF9zaG9ydF93YWxzaDR4NF9zc2UyKSBQUklWQVRFCitzeW0odnA4X3Nob3J0X3dhbHNoNHg0X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMworICAgIFNBVkVfWE1NIDcKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByc2kKKyAgICBwdXNoICAgICAgICByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdiAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgIDsgaW5wdXQKKyAgICBtb3YgICAgIHJkaSwgYXJnKDEpICAgICAgICAgICA7IG91dHB1dAorICAgIG1vdnN4ZCAgcmR4LCBkd29yZCBwdHIgYXJnKDIpIDsgcGl0Y2gKKworICAgIDsgZmlyc3QgZm9yIGxvb3AKKyAgICBtb3ZxICAgIHhtbTAsIE1NV09SRCBQVFIgW3JzaV0gICAgICAgICAgIDsgbG9hZCBpbnB1dAorICAgIG1vdnEgICAgeG1tMSwgTU1XT1JEIFBUUiBbcnNpICsgcmR4XQorICAgIGxlYSAgICAgcnNpLCAgW3JzaSArIHJkeCoyXQorICAgIG1vdnEgICAgeG1tMiwgTU1XT1JEIFBUUiBbcnNpXQorICAgIG1vdnEgICAgeG1tMywgTU1XT1JEIFBUUiBbcnNpICsgcmR4XQorCisgICAgcHVucGNrbHdkIHhtbTAsICB4bW0xCisgICAgcHVucGNrbHdkIHhtbTIsICB4bW0zCisKKyAgICBtb3ZkcWEgICAgeG1tMSwgeG1tMAorICAgIHB1bnBja2xkcSB4bW0wLCB4bW0yICAgICAgICAgICA7IGlwWzFdIGlwWzBdCisgICAgcHVucGNraGRxIHhtbTEsIHhtbTIgICAgICAgICAgIDsgaXBbM10gaXBbMl0KKworICAgIG1vdmRxYSAgICB4bW0yLCB4bW0wCisgICAgcGFkZHcgICAgIHhtbTAsIHhtbTEKKyAgICBwc3VidyAgICAgeG1tMiwgeG1tMQorCisgICAgcHNsbHcgICAgIHhtbTAsIDIgICAgICAgICAgICAgIDsgZDEgIGExCisgICAgcHNsbHcgICAgIHhtbTIsIDIgICAgICAgICAgICAgIDsgYzEgIGIxCisKKyAgICBtb3ZkcWEgICAgeG1tMSwgeG1tMAorICAgIHB1bnBja2xxZHEgeG1tMCwgeG1tMiAgICAgICAgICA7IGIxICBhMQorICAgIHB1bnBja2hxZHEgeG1tMSwgeG1tMiAgICAgICAgICA7IGMxICBkMQorCisgICAgcHhvciAgICAgIHhtbTYsIHhtbTYKKyAgICBtb3ZxICAgICAgeG1tNiwgeG1tMAorICAgIHB4b3IgICAgICB4bW03LCB4bW03CisgICAgcGNtcGVxdyAgIHhtbTcsIHhtbTYKKyAgICBwYWRkdyAgICAgeG1tNywgW0dMT0JBTChjMSldCisKKyAgICBtb3ZkcWEgICAgeG1tMiwgeG1tMAorICAgIHBhZGR3ICAgICB4bW0wLCB4bW0xICAgICAgICAgICA7IGIxK2MxICBhMStkMQorICAgIHBzdWJ3ICAgICB4bW0yLCB4bW0xICAgICAgICAgICA7IGIxLWMxICBhMS1kMQorICAgIHBhZGR3ICAgICB4bW0wLCB4bW03ICAgICAgICAgICA7IGIxK2MxICBhMStkMSsoYTEhPTApCisKKyAgICA7IHNlY29uZCBmb3IgbG9vcAorICAgIDsgaW5wdXQ6IDEzICA5ICA1ICAxIDEyICA4ICA0ICAwICh4bW0wKQorICAgIDsgICAgICAgIDE0IDEwICA2ICAyIDE1IDExICA3ICAzICh4bW0yKQorICAgIDsgYWZ0ZXIgc2h1ZmZsZToKKyAgICA7ICAgICAgICAxMyAgNSAgOSAgMSAxMiAgNCAgOCAgMCAoeG1tMCkKKyAgICA7ICAgICAgICAxNCAgNiAxMCAgMiAxNSAgNyAxMSAgMyAoeG1tMSkKKyAgICBwc2h1Zmx3ICAgeG1tMywgeG1tMCwgMHhkOAorICAgIHBzaHVmaHcgICB4bW0wLCB4bW0zLCAweGQ4CisgICAgcHNodWZsdyAgIHhtbTMsIHhtbTIsIDB4ZDgKKyAgICBwc2h1Zmh3ICAgeG1tMSwgeG1tMywgMHhkOAorCisgICAgbW92ZHFhICAgIHhtbTIsIHhtbTAKKyAgICBwbWFkZHdkICAgeG1tMCwgW0dMT0JBTChjMSldICAgIDsgZDExIGExMSBkMTAgYTEwCisgICAgcG1hZGR3ZCAgIHhtbTIsIFtHTE9CQUwoY24xKV0gICA7IGMxMSBiMTEgYzEwIGIxMAorICAgIG1vdmRxYSAgICB4bW0zLCB4bW0xCisgICAgcG1hZGR3ZCAgIHhtbTEsIFtHTE9CQUwoYzEpXSAgICA7IGQxMiBhMTIgZDEzIGExMworICAgIHBtYWRkd2QgICB4bW0zLCBbR0xPQkFMKGNuMSldICAgOyBjMTIgYjEyIGMxMyBiMTMKKworICAgIHBzaHVmZCAgICB4bW00LCB4bW0wLCAweGQ4ICAgICAgOyBkMTEgZDEwIGExMSBhMTAKKyAgICBwc2h1ZmQgICAgeG1tNSwgeG1tMiwgMHhkOCAgICAgIDsgYzExIGMxMCBiMTEgYjEwCisgICAgcHNodWZkICAgIHhtbTYsIHhtbTEsIDB4NzIgICAgICA7IGQxMyBkMTIgYTEzIGExMgorICAgIHBzaHVmZCAgICB4bW03LCB4bW0zLCAweDcyICAgICAgOyBjMTMgYzEyIGIxMyBiMTIKKworICAgIG1vdmRxYSAgICB4bW0wLCB4bW00CisgICAgcHVucGNrbHFkcSB4bW0wLCB4bW01ICAgICAgICAgICA7IGIxMSBiMTAgYTExIGExMAorICAgIHB1bnBja2hxZHEgeG1tNCwgeG1tNSAgICAgICAgICAgOyBjMTEgYzEwIGQxMSBkMTAKKyAgICBtb3ZkcWEgICAgeG1tMSwgeG1tNgorICAgIHB1bnBja2xxZHEgeG1tMSwgeG1tNyAgICAgICAgICAgOyBiMTMgYjEyIGExMyBhMTIKKyAgICBwdW5wY2tocWRxIHhtbTYsIHhtbTcgICAgICAgICAgIDsgYzEzIGMxMiBkMTMgZDEyCisKKyAgICBtb3ZkcWEgICAgeG1tMiwgeG1tMAorICAgIHBhZGRkICAgICB4bW0wLCB4bW00ICAgICAgICAgICAgOyBiMjEgYjIwIGEyMSBhMjAKKyAgICBwc3ViZCAgICAgeG1tMiwgeG1tNCAgICAgICAgICAgIDsgYzIxIGMyMCBkMjEgZDIwCisgICAgbW92ZHFhICAgIHhtbTMsIHhtbTEKKyAgICBwYWRkZCAgICAgeG1tMSwgeG1tNiAgICAgICAgICAgIDsgYjIzIGIyMiBhMjMgYTIyCisgICAgcHN1YmQgICAgIHhtbTMsIHhtbTYgICAgICAgICAgICA7IGMyMyBjMjIgZDIzIGQyMgorCisgICAgcHhvciAgICAgIHhtbTQsIHhtbTQKKyAgICBtb3ZkcWEgICAgeG1tNSwgeG1tNAorICAgIHBjbXBndGQgICB4bW00LCB4bW0wCisgICAgcGNtcGd0ZCAgIHhtbTUsIHhtbTIKKyAgICBwYW5kICAgICAgeG1tNCwgW0dMT0JBTChjZDEpXQorICAgIHBhbmQgICAgICB4bW01LCBbR0xPQkFMKGNkMSldCisKKyAgICBweG9yICAgICAgeG1tNiwgeG1tNgorICAgIG1vdmRxYSAgICB4bW03LCB4bW02CisgICAgcGNtcGd0ZCAgIHhtbTYsIHhtbTEKKyAgICBwY21wZ3RkICAgeG1tNywgeG1tMworICAgIHBhbmQgICAgICB4bW02LCBbR0xPQkFMKGNkMSldCisgICAgcGFuZCAgICAgIHhtbTcsIFtHTE9CQUwoY2QxKV0KKworICAgIHBhZGRkICAgICB4bW0wLCB4bW00CisgICAgcGFkZGQgICAgIHhtbTIsIHhtbTUKKyAgICBwYWRkZCAgICAgeG1tMCwgW0dMT0JBTChjZDMpXQorICAgIHBhZGRkICAgICB4bW0yLCBbR0xPQkFMKGNkMyldCisgICAgcGFkZGQgICAgIHhtbTEsIHhtbTYKKyAgICBwYWRkZCAgICAgeG1tMywgeG1tNworICAgIHBhZGRkICAgICB4bW0xLCBbR0xPQkFMKGNkMyldCisgICAgcGFkZGQgICAgIHhtbTMsIFtHTE9CQUwoY2QzKV0KKworICAgIHBzcmFkICAgICB4bW0wLCAzCisgICAgcHNyYWQgICAgIHhtbTEsIDMKKyAgICBwc3JhZCAgICAgeG1tMiwgMworICAgIHBzcmFkICAgICB4bW0zLCAzCisgICAgbW92ZHFhICAgIHhtbTQsIHhtbTAKKyAgICBwdW5wY2tscWRxIHhtbTAsIHhtbTEgICAgICAgICAgIDsgYTIzIGEyMiBhMjEgYTIwCisgICAgcHVucGNraHFkcSB4bW00LCB4bW0xICAgICAgICAgICA7IGIyMyBiMjIgYjIxIGIyMAorICAgIG1vdmRxYSAgICB4bW01LCB4bW0yCisgICAgcHVucGNraHFkcSB4bW0yLCB4bW0zICAgICAgICAgICA7IGMyMyBjMjIgYzIxIGMyMAorICAgIHB1bnBja2xxZHEgeG1tNSwgeG1tMyAgICAgICAgICAgOyBkMjMgZDIyIGQyMSBkMjAKKworICAgIHBhY2tzc2R3ICB4bW0wLCB4bW00ICAgICAgICAgICAgOyBiMjMgYjIyIGIyMSBiMjAgYTIzIGEyMiBhMjEgYTIwCisgICAgcGFja3NzZHcgIHhtbTIsIHhtbTUgICAgICAgICAgICA7IGQyMyBkMjIgZDIxIGQyMCBjMjMgYzIyIGMyMSBjMjAKKworICAgIG1vdmRxYSAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTAKKyAgICBtb3ZkcWEgIFhNTVdPUkQgUFRSIFtyZGkgKyAxNl0sIHhtbTIKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFJFU1RPUkVfWE1NCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK2MxOgorICAgIGR3IDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxCithbGlnbiAxNgorY24xOgorICAgIGR3IDB4MDAwMSwgMHhmZmZmLCAweDAwMDEsIDB4ZmZmZiwgMHgwMDAxLCAweGZmZmYsIDB4MDAwMSwgMHhmZmZmCithbGlnbiAxNgorY2QxOgorICAgIGRkIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEKK2FsaWduIDE2CitjZDM6CisgICAgZGQgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9xdWFudGl6ZV9tbXguYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9xdWFudGl6ZV9tbXguYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjRjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX21teC5hc20KQEAgLTAsMCArMSwyODYgQEAKKzsKKzsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Cis7ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCis7ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKzsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKzsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorOworCisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworO2ludCB2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfbW14KHNob3J0ICpjb2VmZl9wdHIsIHNob3J0ICp6YmluX3B0ciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcWNvZWZmX3B0cixzaG9ydCAqZGVxdWFudF9wdHIsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnNjYW5fbWFzaywgc2hvcnQgKnJvdW5kX3B0ciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcXVhbnRfcHRyLCBzaG9ydCAqZHFjb2VmZl9wdHIpOworZ2xvYmFsIHN5bSh2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfbW14KSBQUklWQVRFCitzeW0odnA4X2Zhc3RfcXVhbnRpemVfYl9pbXBsX21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA4CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7Y29lZmZfcHRyCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBbcnNpXQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMSkgO3piaW5fcHRyCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBbcmF4XQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBtbTAKKyAgICAgICAgcHNyYXcgICAgICAgICAgIG1tMCwgICAgICAgIDE1CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgIG1tMAorICAgICAgICBwc3VidyAgICAgICAgICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgOyBhYnMKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgbW0zCisgICAgICAgIHBjbXBndHcgICAgICAgICBtbTEsICAgICAgICBtbTIKKworICAgICAgICBwYW5kbiAgICAgICAgICAgbW0xLCAgICAgICAgbW0yCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBtbTEKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmR4LCAgICAgICAgYXJnKDYpIDtxdWFudF9wdHIKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFtyZHhdCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIGFyZyg1KSA7cm91bmRfcHRyCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBbcmN4XQorCisgICAgICAgIHBhZGR3ICAgICAgICAgICBtbTMsICAgICAgICBtbTIKKyAgICAgICAgcG11bGh1dyAgICAgICAgIG1tMywgICAgICAgIG1tMQorCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICBtbTAKKyAgICAgICAgcHN1YncgICAgICAgICAgIG1tMywgICAgICAgIG1tMCAgICAgO2dhaW4gdGhlIHNpZ24gYmFjaworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3Fjb2VmZl9wdHIKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIG1tMworCisgICAgICAgIG1vdnEgICAgICAgICAgICBbcmRpXSwgICAgICBtbTMKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDMpIDtkZXF1YW50X3B0cgorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgW3JheF0KKworICAgICAgICBwbXVsbHcgICAgICAgICAgbW0zLCAgICAgICAgbW0yCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoNykgO2RxY29lZmZfcHRyCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIFtyYXhdLCAgICAgIG1tMworCisgICAgICAgIDsgbmV4dCA4CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICBbcnNpKzhdCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygxKSA7emJpbl9wdHIKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFtyYXgrOF0KKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgbW00CisgICAgICAgIHBzcmF3ICAgICAgICAgICBtbTQsICAgICAgICAxNQorCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTQKKyAgICAgICAgcHN1YncgICAgICAgICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgIDsgYWJzCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIG1tNworICAgICAgICBwY21wZ3R3ICAgICAgICAgbW01LCAgICAgICAgbW02CisKKyAgICAgICAgcGFuZG4gICAgICAgICAgIG1tNSwgICAgICAgIG1tNgorICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgbW01CisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFtyZHgrOF0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIFtyY3grOF0KKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW02CisgICAgICAgIHBtdWxodXcgICAgICAgICBtbTcsICAgICAgICBtbTUKKworICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW00CisgICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTcsICAgICAgICBtbTQ7Z2FpbiB0aGUgc2lnbiBiYWNrCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cWNvZWZmX3B0cgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBtbTcKKyAgICAgICAgbW92cSAgICAgICAgICAgIFtyZGkrOF0sICAgIG1tNworCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMykgO2RlcXVhbnRfcHRyCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBbcmF4KzhdCisKKyAgICAgICAgcG11bGx3ICAgICAgICAgIG1tNywgICAgICAgIG1tNgorICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDcpIDtkcWNvZWZmX3B0cgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBbcmF4KzhdLCAgICBtbTcKKworCisgICAgICAgICAgICAgICAgOyBuZXh0IDgKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIFtyc2krMTZdCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygxKSA7emJpbl9wdHIKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFtyYXgrMTZdCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tNAorICAgICAgICBwc3JhdyAgICAgICAgICAgbW00LCAgICAgICAgMTUKKworICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW00CisgICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTcsICAgICAgICBtbTQgICAgICAgICA7IGFicworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBtbTcKKyAgICAgICAgcGNtcGd0dyAgICAgICAgIG1tNSwgICAgICAgIG1tNgorCisgICAgICAgIHBhbmRuICAgICAgICAgICBtbTUsICAgICAgICBtbTYKKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tNQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICBbcmR4KzE2XQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgW3JjeCsxNl0KKworICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW02CisgICAgICAgIHBtdWxodXcgICAgICAgICBtbTcsICAgICAgICBtbTUKKworICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW00CisgICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTcsICAgICAgICBtbTQ7Z2FpbiB0aGUgc2lnbiBiYWNrCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cWNvZWZmX3B0cgorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBtbTcKKyAgICAgICAgbW92cSAgICAgICAgICAgIFtyZGkrMTZdLCAgIG1tNworCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMykgO2RlcXVhbnRfcHRyCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBbcmF4KzE2XQorCisgICAgICAgIHBtdWxsdyAgICAgICAgICBtbTcsICAgICAgICBtbTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7ZHFjb2VmZl9wdHIKKworICAgICAgICBtb3ZxICAgICAgICAgICAgW3JheCsxNl0sICAgbW03CisKKworICAgICAgICAgICAgICAgIDsgbmV4dCA4CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICBbcnNpKzI0XQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMSkgO3piaW5fcHRyCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICBbcmF4KzI0XQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTQKKyAgICAgICAgcHNyYXcgICAgICAgICAgIG1tNCwgICAgICAgIDE1CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNAorICAgICAgICBwc3VidyAgICAgICAgICAgbW03LCAgICAgICAgbW00ICAgICAgICAgOyBhYnMKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgbW03CisgICAgICAgIHBjbXBndHcgICAgICAgICBtbTUsICAgICAgICBtbTYKKworICAgICAgICBwYW5kbiAgICAgICAgICAgbW01LCAgICAgICAgbW02CisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTUKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgW3JkeCsyNF0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIFtyY3grMjRdCisKKyAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tNgorICAgICAgICBwbXVsaHV3ICAgICAgICAgbW03LCAgICAgICAgbW01CisKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNAorICAgICAgICBwc3VidyAgICAgICAgICAgbW03LCAgICAgICAgbW00O2dhaW4gdGhlIHNpZ24gYmFjaworCisgICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3Fjb2VmZl9wdHIKKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgbW03CisgICAgICAgIG1vdnEgICAgICAgICAgICBbcmRpKzI0XSwgICBtbTcKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDMpIDtkZXF1YW50X3B0cgorICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgW3JheCsyNF0KKworICAgICAgICBwbXVsbHcgICAgICAgICAgbW03LCAgICAgICAgbW02CisgICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoNykgO2RxY29lZmZfcHRyCisKKyAgICAgICAgbW92cSAgICAgICAgICAgIFtyYXgrMjRdLCAgIG1tNworCisKKworICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpIDtzY2FuX21hc2sKKyAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygyKSA7cWNvZWZmX3B0cgorCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTUsICAgICAgICBtbTUKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNworCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBbcnNpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgW3JzaSs4XQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBbcmRpXQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgW3JkaSs4XTsKKworICAgICAgICBwY21wZXF3ICAgICAgICAgbW0wLCAgICAgICAgbW03CisgICAgICAgIHBjbXBlcXcgICAgICAgICBtbTEsICAgICAgICBtbTcKKworICAgICAgICBwY21wZXF3ICAgICAgICAgbW02LCAgICAgICAgbW02CisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTAsICAgICAgICBtbTYKKworICAgICAgICBweG9yICAgICAgICAgICAgbW0xLCAgICAgICAgbW02CisgICAgICAgIHBzcmx3ICAgICAgICAgICBtbTAsICAgICAgICAxNQorCisgICAgICAgIHBzcmx3ICAgICAgICAgICBtbTEsICAgICAgICAxNQorICAgICAgICBwbWFkZHdkICAgICAgICAgbW0wLCAgICAgICAgbW0yCisKKyAgICAgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgICAgICAgIG1tMworICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgbW0wCisKKyAgICAgICAgcGFkZGQgICAgICAgICAgIG1tNSwgICAgICAgIG1tMQorCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBbcnNpKzE2XQorICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgW3JzaSsyNF0KKworICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgW3JkaSsxNl0KKyAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFtyZGkrMjRdOworCisgICAgICAgIHBjbXBlcXcgICAgICAgICBtbTAsICAgICAgICBtbTcKKyAgICAgICAgcGNtcGVxdyAgICAgICAgIG1tMSwgICAgICAgIG1tNworCisgICAgICAgIHBjbXBlcXcgICAgICAgICBtbTYsICAgICAgICBtbTYKKyAgICAgICAgcHhvciAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNgorCisgICAgICAgIHB4b3IgICAgICAgICAgICBtbTEsICAgICAgICBtbTYKKyAgICAgICAgcHNybHcgICAgICAgICAgIG1tMCwgICAgICAgIDE1CisKKyAgICAgICAgcHNybHcgICAgICAgICAgIG1tMSwgICAgICAgIDE1CisgICAgICAgIHBtYWRkd2QgICAgICAgICBtbTAsICAgICAgICBtbTIKKworICAgICAgICBwbWFkZHdkICAgICAgICAgbW0xLCAgICAgICAgbW0zCisgICAgICAgIHBhZGRkICAgICAgICAgICBtbTUsICAgICAgICBtbTAKKworICAgICAgICBwYWRkZCAgICAgICAgICAgbW01LCAgICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBtbTUKKworICAgICAgICBwc3JscSAgICAgICAgICAgbW01LCAgICAgICAgMzIKKyAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMCwgICAgICAgIG1tNQorCisgICAgICAgIDsgZW9iIGFkanVzdG1lbnQgYmVnaW5zIGhlcmUKKyAgICAgICAgbW92cSAgICAgICAgICAgIHJjeCwgICAgICAgIG1tMAorICAgICAgICBhbmQgICAgICAgICAgICAgcmN4LCAgICAgICAgMHhmZmZmCisKKyAgICAgICAgeG9yICAgICAgICAgICAgIHJkeCwgICAgICAgIHJkeAorICAgICAgICBzdWIgICAgICAgICAgICAgcmR4LCAgICAgICAgcmN4IDsgcmR4PS1yY3gKKworICAgICAgICBic3IgICAgICAgICAgICAgcmF4LCAgICAgICAgcmN4CisgICAgICAgIGluYyAgICAgICAgICAgICByYXgKKworICAgICAgICBzYXIgICAgICAgICAgICAgcmR4LCAgICAgICAgMzEKKyAgICAgICAgYW5kICAgICAgICAgICAgIHJheCwgICAgICAgIHJkeAorICAgICAgICA7IFN1YnN0aXR1dGUgdGhlIHNzZSBhc3NlbWJseSBmb3IgdGhlIG9sZCBtbXggbWl4ZWQgYXNzZW1ibHkvQy4gVGhlCisgICAgICAgIDsgZm9sbG93aW5nIGlzIGtlcHQgYXMgcmVmZXJlbmNlCisgICAgICAgIDsgICAgbW92cSAgICAgICAgICAgIHJjeCwgICAgICAgIG1tMAorICAgICAgICA7ICAgIGJzciAgICAgICAgICAgICByYXgsICAgICAgICByY3gKKyAgICAgICAgOworICAgICAgICA7ICAgIG1vdiAgICAgICAgICAgICBlb2IsICAgICAgICByYXgKKyAgICAgICAgOyAgICBtb3YgICAgICAgICAgICAgZWVlLCAgICAgICAgcmN4CisgICAgICAgIDsKKyAgICAgICAgO2lmKGVlZT09MCkKKyAgICAgICAgO3sKKyAgICAgICAgOyAgICBlb2I9LTE7CisgICAgICAgIDt9CisgICAgICAgIDtlbHNlIGlmKGVlZTwwKQorICAgICAgICA7eworICAgICAgICA7ICAgIGVvYj0xNTsKKyAgICAgICAgO30KKyAgICAgICAgO2QtPmVvYiA9IGVvYisxOworCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfc3NlMi5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3NzZTIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGU1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3NzZTIuYXNtCkBAIC0wLDAgKzEsMzg2IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Cis7ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUworOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorJWluY2x1ZGUgImFzbV9lbmNfb2Zmc2V0cy5hc20iCisKKworOyB2b2lkIHZwOF9yZWd1bGFyX3F1YW50aXplX2Jfc3NlMiB8IGFyZworOyAgKEJMT0NLICAqYiwgICAgICAgICAgICAgICAgICAgICB8ICAwCis7ICAgQkxPQ0tEICpkKSAgICAgICAgICAgICAgICAgICAgIHwgIDEKKworZ2xvYmFsIHN5bSh2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorCislaWYgQUJJX0lTXzMyQklUCisgICAgcHVzaCAgICAgICAgcmRpCisgICAgcHVzaCAgICAgICAgcnNpCislZWxzZQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgcHVzaCAgICAgICAgcmRpCisgICAgcHVzaCAgICAgICAgcnNpCisgICVlbmRpZgorJWVuZGlmCisKKyAgICBBTElHTl9TVEFDSyAxNiwgcmF4CisgICAgJWRlZmluZSB6cnVuX3piaW5fYm9vc3QgICAwICA7ICA4CisgICAgJWRlZmluZSBhYnNfbWludXNfemJpbiAgICA4ICA7IDMyCisgICAgJWRlZmluZSB0ZW1wX3Fjb2VmZiAgICAgICA0MCA7IDMyCisgICAgJWRlZmluZSBxY29lZmYgICAgICAgICAgICA3MiA7IDMyCisgICAgJWRlZmluZSBzdGFja19zaXplICAgICAgICAxMDQKKyAgICBzdWIgICAgICAgICByc3AsIHN0YWNrX3NpemUKKyAgICA7IGVuZCBwcm9sb2cKKworJWlmIEFCSV9JU18zMkJJVAorICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDApICAgICAgICAgICAgICAgICA7IEJMT0NLICpiCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMSkgICAgICAgICAgICAgICAgIDsgQkxPQ0tEICpkCislZWxzZQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgbW92ICAgICAgICAgcmRpLCByY3ggICAgICAgICAgICAgICAgICAgIDsgQkxPQ0sgKmIKKyAgICBtb3YgICAgICAgICByc2ksIHJkeCAgICAgICAgICAgICAgICAgICAgOyBCTE9DS0QgKmQKKyAgJWVsc2UKKyAgICA7bW92ICAgICAgICAgcmRpLCByZGkgICAgICAgICAgICAgICAgICAgIDsgQkxPQ0sgKmIKKyAgICA7bW92ICAgICAgICAgcnNpLCByc2kgICAgICAgICAgICAgICAgICAgIDsgQkxPQ0tEICpkCisgICVlbmRpZgorJWVuZGlmCisKKyAgICBtb3YgICAgICAgICByZHgsIFtyZGkgKyB2cDhfYmxvY2tfY29lZmZdIDsgY29lZmZfcHRyCisgICAgbW92ICAgICAgICAgcmN4LCBbcmRpICsgdnA4X2Jsb2NrX3piaW5dIDsgemJpbl9wdHIKKyAgICBtb3ZkICAgICAgICB4bW03LCBbcmRpICsgdnA4X2Jsb2NrX3piaW5fZXh0cmFdIDsgemJpbl9vcV92YWx1ZQorCisgICAgOyB6CisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JkeF0KKyAgICBtb3ZkcWEgICAgICB4bW00LCBbcmR4ICsgMTZdCisgICAgbW92ICAgICAgICAgcmR4LCBbcmRpICsgdnA4X2Jsb2NrX3JvdW5kXSA7IHJvdW5kX3B0cgorCisgICAgcHNodWZsdyAgICAgeG1tNywgeG1tNywgMAorICAgIHB1bnBja2x3ZCAgIHhtbTcsIHhtbTcgICAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZWQgemJpbl9vcV92YWx1ZQorCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAorICAgIG1vdmRxYSAgICAgIHhtbTUsIHhtbTQKKworICAgIDsgc3oKKyAgICBwc3JhdyAgICAgICB4bW0wLCAxNQorICAgIHBzcmF3ICAgICAgIHhtbTQsIDE1CisKKyAgICA7ICh6IF4gc3opCisgICAgcHhvciAgICAgICAgeG1tMSwgeG1tMAorICAgIHB4b3IgICAgICAgIHhtbTUsIHhtbTQKKworICAgIDsgeCA9IGFicyh6KQorICAgIHBzdWJ3ICAgICAgIHhtbTEsIHhtbTAKKyAgICBwc3VidyAgICAgICB4bW01LCB4bW00CisKKyAgICBtb3ZkcWEgICAgICB4bW0yLCBbcmN4XQorICAgIG1vdmRxYSAgICAgIHhtbTMsIFtyY3ggKyAxNl0KKyAgICBtb3YgICAgICAgICByY3gsIFtyZGkgKyB2cDhfYmxvY2tfcXVhbnRdIDsgcXVhbnRfcHRyCisKKyAgICA7ICp6YmluX3B0ciArIHpiaW5fb3FfdmFsdWUKKyAgICBwYWRkdyAgICAgICB4bW0yLCB4bW03CisgICAgcGFkZHcgICAgICAgeG1tMywgeG1tNworCisgICAgOyB4IC0gKCp6YmluX3B0ciArIHpiaW5fb3FfdmFsdWUpCisgICAgcHN1YncgICAgICAgeG1tMSwgeG1tMgorICAgIHBzdWJ3ICAgICAgIHhtbTUsIHhtbTMKKyAgICBtb3ZkcWEgICAgICBbcnNwICsgYWJzX21pbnVzX3piaW5dLCB4bW0xCisgICAgbW92ZHFhICAgICAgW3JzcCArIGFic19taW51c196YmluICsgMTZdLCB4bW01CisKKyAgICA7IGFkZCAoemJpbl9wdHIgKyB6YmluX29xX3ZhbHVlKSBiYWNrCisgICAgcGFkZHcgICAgICAgeG1tMSwgeG1tMgorICAgIHBhZGR3ICAgICAgIHhtbTUsIHhtbTMKKworICAgIG1vdmRxYSAgICAgIHhtbTIsIFtyZHhdCisgICAgbW92ZHFhICAgICAgeG1tNiwgW3JkeCArIDE2XQorCisgICAgbW92ZHFhICAgICAgeG1tMywgW3JjeF0KKyAgICBtb3ZkcWEgICAgICB4bW03LCBbcmN4ICsgMTZdCisKKyAgICA7IHggKyByb3VuZAorICAgIHBhZGR3ICAgICAgIHhtbTEsIHhtbTIKKyAgICBwYWRkdyAgICAgICB4bW01LCB4bW02CisKKyAgICA7IHkgPSB4ICogcXVhbnRfcHRyID4+IDE2CisgICAgcG11bGh3ICAgICAgeG1tMywgeG1tMQorICAgIHBtdWxodyAgICAgIHhtbTcsIHhtbTUKKworICAgIDsgeSArPSB4CisgICAgcGFkZHcgICAgICAgeG1tMSwgeG1tMworICAgIHBhZGR3ICAgICAgIHhtbTUsIHhtbTcKKworICAgIG1vdmRxYSAgICAgIFtyc3AgKyB0ZW1wX3Fjb2VmZl0sIHhtbTEKKyAgICBtb3ZkcWEgICAgICBbcnNwICsgdGVtcF9xY29lZmYgKyAxNl0sIHhtbTUKKworICAgIHB4b3IgICAgICAgIHhtbTYsIHhtbTYKKyAgICA7IHplcm8gcWNvZWZmCisgICAgbW92ZHFhICAgICAgW3JzcCArIHFjb2VmZl0sIHhtbTYKKyAgICBtb3ZkcWEgICAgICBbcnNwICsgcWNvZWZmICsgMTZdLCB4bW02CisKKyAgICBtb3YgICAgICAgICByZHgsIFtyZGkgKyB2cDhfYmxvY2tfenJ1bl96YmluX2Jvb3N0XSA7IHpiaW5fYm9vc3RfcHRyCisgICAgbW92ICAgICAgICAgcmF4LCBbcmRpICsgdnA4X2Jsb2NrX3F1YW50X3NoaWZ0XSA7IHF1YW50X3NoaWZ0X3B0cgorICAgIG1vdiAgICAgICAgIFtyc3AgKyB6cnVuX3piaW5fYm9vc3RdLCByZHgKKworJW1hY3JvIFpJR1pBR19MT09QIDEKKyAgICA7IHgKKyAgICBtb3ZzeCAgICAgICBlY3gsIFdPUkQgUFRSW3JzcCArIGFic19taW51c196YmluICsgJTEgKiAyXQorCisgICAgOyBpZiAoeCA+PSB6YmluKQorICAgIHN1YiAgICAgICAgIGN4LCBXT1JEIFBUUltyZHhdICAgICAgICAgICA7IHggLSB6YmluCisgICAgbGVhICAgICAgICAgcmR4LCBbcmR4ICsgMl0gICAgICAgICAgICAgIDsgemJpbl9ib29zdF9wdHIrKworICAgIGpsICAgICAgICAgIC5ycV96aWd6YWdfbG9vcF8lMSAgICAgICAgICAgOyB4IDwgemJpbgorCisgICAgbW92c3ggICAgICAgZWRpLCBXT1JEIFBUUltyc3AgKyB0ZW1wX3Fjb2VmZiArICUxICogMl0KKworICAgIDsgZG93bnNoaWZ0IGJ5IHF1YW50X3NoaWZ0W3JjXQorICAgIG1vdnN4ICAgICAgIGN4LCBCWVRFIFBUUltyYXggKyAlMV0gICAgICA7IHF1YW50X3NoaWZ0X3B0cltyY10KKyAgICBzYXIgICAgICAgICBlZGksIGNsICAgICAgICAgICAgICAgICAgICAgOyBhbHNvIHNldHMgWiBiaXQKKyAgICBqZSAgICAgICAgICAucnFfemlnemFnX2xvb3BfJTEgICAgICAgICAgIDsgIXkKKyAgICBtb3YgICAgICAgICBXT1JEIFBUUltyc3AgKyBxY29lZmYgKyAlMSAqIDJdLCBkaSA7cWNvZWZmX3B0cltyY10gPSB0ZW1wX3Fjb2VmZltyY10KKyAgICBtb3YgICAgICAgICByZHgsIFtyc3AgKyB6cnVuX3piaW5fYm9vc3RdIDsgcmVzZXQgdG8gYi0+enJ1bl96YmluX2Jvb3N0CisucnFfemlnemFnX2xvb3BfJTE6CislZW5kbWFjcm8KKzsgaW4gdnA4X2RlZmF1bHRfemlnX3phZzFkIG9yZGVyOiBzZWUgdnA4L2NvbW1vbi9lbnRyb3B5LmMKK1pJR1pBR19MT09QICAwCitaSUdaQUdfTE9PUCAgMQorWklHWkFHX0xPT1AgIDQKK1pJR1pBR19MT09QICA4CitaSUdaQUdfTE9PUCAgNQorWklHWkFHX0xPT1AgIDIKK1pJR1pBR19MT09QICAzCitaSUdaQUdfTE9PUCAgNgorWklHWkFHX0xPT1AgIDkKK1pJR1pBR19MT09QIDEyCitaSUdaQUdfTE9PUCAxMworWklHWkFHX0xPT1AgMTAKK1pJR1pBR19MT09QICA3CitaSUdaQUdfTE9PUCAxMQorWklHWkFHX0xPT1AgMTQKK1pJR1pBR19MT09QIDE1CisKKyAgICBtb3ZkcWEgICAgICB4bW0yLCBbcnNwICsgcWNvZWZmXQorICAgIG1vdmRxYSAgICAgIHhtbTMsIFtyc3AgKyBxY29lZmYgKyAxNl0KKworICAgIG1vdiAgICAgICAgIHJjeCwgW3JzaSArIHZwOF9ibG9ja2RfZGVxdWFudF0gOyBkZXF1YW50X3B0cgorICAgIG1vdiAgICAgICAgIHJkaSwgW3JzaSArIHZwOF9ibG9ja2RfZHFjb2VmZl0gOyBkcWNvZWZmX3B0cgorCisgICAgOyB5IF4gc3oKKyAgICBweG9yICAgICAgICB4bW0yLCB4bW0wCisgICAgcHhvciAgICAgICAgeG1tMywgeG1tNAorICAgIDsgeCA9ICh5IF4gc3opIC0gc3oKKyAgICBwc3VidyAgICAgICB4bW0yLCB4bW0wCisgICAgcHN1YncgICAgICAgeG1tMywgeG1tNAorCisgICAgOyBkZXF1YW50CisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JjeF0KKyAgICBtb3ZkcWEgICAgICB4bW0xLCBbcmN4ICsgMTZdCisKKyAgICBtb3YgICAgICAgICByY3gsIFtyc2kgKyB2cDhfYmxvY2tkX3Fjb2VmZl0gOyBxY29lZmZfcHRyCisKKyAgICBwbXVsbHcgICAgICB4bW0wLCB4bW0yCisgICAgcG11bGx3ICAgICAgeG1tMSwgeG1tMworCisgICAgbW92ZHFhICAgICAgW3JjeF0sIHhtbTIgICAgICAgIDsgc3RvcmUgcWNvZWZmCisgICAgbW92ZHFhICAgICAgW3JjeCArIDE2XSwgeG1tMworICAgIG1vdmRxYSAgICAgIFtyZGldLCB4bW0wICAgICAgICA7IHN0b3JlIGRxY29lZmYKKyAgICBtb3ZkcWEgICAgICBbcmRpICsgMTZdLCB4bW0xCisKKyAgICBtb3YgICAgICAgICByY3gsIFtyc2kgKyB2cDhfYmxvY2tkX2VvYl0KKworICAgIDsgc2VsZWN0IHRoZSBsYXN0IHZhbHVlIChpbiB6aWdfemFnIG9yZGVyKSBmb3IgRU9CCisgICAgcGNtcGVxdyAgICAgeG1tMiwgeG1tNgorICAgIHBjbXBlcXcgICAgIHhtbTMsIHhtbTYKKyAgICA7ICEKKyAgICBwY21wZXF3ICAgICB4bW02LCB4bW02CisgICAgcHhvciAgICAgICAgeG1tMiwgeG1tNgorICAgIHB4b3IgICAgICAgIHhtbTMsIHhtbTYKKyAgICA7IG1hc2sgaW52X3ppZ196YWcKKyAgICBwYW5kICAgICAgICB4bW0yLCBbR0xPQkFMKGludl96aWdfemFnKV0KKyAgICBwYW5kICAgICAgICB4bW0zLCBbR0xPQkFMKGludl96aWdfemFnICsgMTYpXQorICAgIDsgc2VsZWN0IHRoZSBtYXggdmFsdWUKKyAgICBwbWF4c3cgICAgICB4bW0yLCB4bW0zCisgICAgcHNodWZkICAgICAgeG1tMywgeG1tMiwgMDAwMDExMTBiCisgICAgcG1heHN3ICAgICAgeG1tMiwgeG1tMworICAgIHBzaHVmbHcgICAgIHhtbTMsIHhtbTIsIDAwMDAxMTEwYgorICAgIHBtYXhzdyAgICAgIHhtbTIsIHhtbTMKKyAgICBwc2h1Zmx3ICAgICB4bW0zLCB4bW0yLCAwMDAwMDAwMWIKKyAgICBwbWF4c3cgICAgICB4bW0yLCB4bW0zCisgICAgbW92ZCAgICAgICAgZWF4LCB4bW0yCisgICAgYW5kICAgICAgICAgZWF4LCAweGZmCisKKyAgICBtb3YgICAgICAgICBCWVRFIFBUUiBbcmN4XSwgYWwgICAgICAgICAgOyBzdG9yZSBlb2IKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgYWRkICAgICAgICAgcnNwLCBzdGFja19zaXplCisgICAgcG9wICAgICAgICAgcnNwCislaWYgQUJJX0lTXzMyQklUCisgICAgcG9wICAgICAgICAgcnNpCisgICAgcG9wICAgICAgICAgcmRpCislZWxzZQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgcG9wICAgICAgICAgcnNpCisgICAgcG9wICAgICAgICAgcmRpCisgICVlbmRpZgorJWVuZGlmCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCis7IHZvaWQgdnA4X2Zhc3RfcXVhbnRpemVfYl9zc2UyIHwgYXJnCis7ICAoQkxPQ0sgICpiLCAgICAgICAgICAgICAgICAgIHwgIDAKKzsgICBCTE9DS0QgKmQpICAgICAgICAgICAgICAgICAgfCAgMQorCitnbG9iYWwgc3ltKHZwOF9mYXN0X3F1YW50aXplX2Jfc3NlMikgUFJJVkFURQorc3ltKHZwOF9mYXN0X3F1YW50aXplX2Jfc3NlMik6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBHRVRfR09UICAgICByYngKKworJWlmIEFCSV9JU18zMkJJVAorICAgIHB1c2ggICAgICAgIHJkaQorICAgIHB1c2ggICAgICAgIHJzaQorJWVsc2UKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorICAgIHB1c2ggICAgICAgIHJkaQorICAgIHB1c2ggICAgICAgIHJzaQorICAlZWxzZQorICAgIDsgdGhlc2UgcmVnaXN0ZXJzIGFyZSB1c2VkIGZvciBwYXNzaW5nIGFyZ3VtZW50cworICAlZW5kaWYKKyVlbmRpZgorCisgICAgOyBlbmQgcHJvbG9nCisKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBtb3YgICAgICAgICByZGksIGFyZygwKSAgICAgICAgICAgICAgICAgOyBCTE9DSyAqYgorICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDEpICAgICAgICAgICAgICAgICA7IEJMT0NLRCAqZAorJWVsc2UKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorICAgIG1vdiAgICAgICAgIHJkaSwgcmN4ICAgICAgICAgICAgICAgICAgICA7IEJMT0NLICpiCisgICAgbW92ICAgICAgICAgcnNpLCByZHggICAgICAgICAgICAgICAgICAgIDsgQkxPQ0tEICpkCisgICVlbHNlCisgICAgO21vdiAgICAgICAgIHJkaSwgcmRpICAgICAgICAgICAgICAgICAgICA7IEJMT0NLICpiCisgICAgO21vdiAgICAgICAgIHJzaSwgcnNpICAgICAgICAgICAgICAgICAgICA7IEJMT0NLRCAqZAorICAlZW5kaWYKKyVlbmRpZgorCisgICAgbW92ICAgICAgICAgcmF4LCBbcmRpICsgdnA4X2Jsb2NrX2NvZWZmXQorICAgIG1vdiAgICAgICAgIHJjeCwgW3JkaSArIHZwOF9ibG9ja19yb3VuZF0KKyAgICBtb3YgICAgICAgICByZHgsIFtyZGkgKyB2cDhfYmxvY2tfcXVhbnRfZmFzdF0KKworICAgIDsgeiA9IGNvZWZmCisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JheF0KKyAgICBtb3ZkcWEgICAgICB4bW00LCBbcmF4ICsgMTZdCisKKyAgICA7IGR1cCB6IHNvIHdlIGNhbiBzYXZlIHN6CisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAorICAgIG1vdmRxYSAgICAgIHhtbTUsIHhtbTQKKworICAgIDsgc3ogPSB6ID4+IDE1CisgICAgcHNyYXcgICAgICAgeG1tMCwgMTUKKyAgICBwc3JhdyAgICAgICB4bW00LCAxNQorCisgICAgOyB4ID0gYWJzKHopID0gKHogXiBzeikgLSBzegorICAgIHB4b3IgICAgICAgIHhtbTEsIHhtbTAKKyAgICBweG9yICAgICAgICB4bW01LCB4bW00CisgICAgcHN1YncgICAgICAgeG1tMSwgeG1tMAorICAgIHBzdWJ3ICAgICAgIHhtbTUsIHhtbTQKKworICAgIDsgeCArPSByb3VuZAorICAgIHBhZGR3ICAgICAgIHhtbTEsIFtyY3hdCisgICAgcGFkZHcgICAgICAgeG1tNSwgW3JjeCArIDE2XQorCisgICAgbW92ICAgICAgICAgcmF4LCBbcnNpICsgdnA4X2Jsb2NrZF9xY29lZmZdCisgICAgbW92ICAgICAgICAgcmN4LCBbcnNpICsgdnA4X2Jsb2NrZF9kZXF1YW50XQorICAgIG1vdiAgICAgICAgIHJkaSwgW3JzaSArIHZwOF9ibG9ja2RfZHFjb2VmZl0KKworICAgIDsgeSA9IHggKiBxdWFudCA+PiAxNgorICAgIHBtdWxodyAgICAgIHhtbTEsIFtyZHhdCisgICAgcG11bGh3ICAgICAgeG1tNSwgW3JkeCArIDE2XQorCisgICAgOyB4ID0gKHkgXiBzeikgLSBzegorICAgIHB4b3IgICAgICAgIHhtbTEsIHhtbTAKKyAgICBweG9yICAgICAgICB4bW01LCB4bW00CisgICAgcHN1YncgICAgICAgeG1tMSwgeG1tMAorICAgIHBzdWJ3ICAgICAgIHhtbTUsIHhtbTQKKworICAgIDsgcWNvZWZmID0geAorICAgIG1vdmRxYSAgICAgIFtyYXhdLCB4bW0xCisgICAgbW92ZHFhICAgICAgW3JheCArIDE2XSwgeG1tNQorCisgICAgOyB4ICogZGVxdWFudAorICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKKyAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW01CisgICAgcG11bGx3ICAgICAgeG1tMiwgW3JjeF0KKyAgICBwbXVsbHcgICAgICB4bW0zLCBbcmN4ICsgMTZdCisKKyAgICA7IGRxY29lZmYgPSB4ICogZGVxdWFudAorICAgIG1vdmRxYSAgICAgIFtyZGldLCB4bW0yCisgICAgbW92ZHFhICAgICAgW3JkaSArIDE2XSwgeG1tMworCisgICAgcHhvciAgICAgICAgeG1tNCwgeG1tNCAgICAgICAgICAgICAgICAgIDtjbGVhciBhbGwgYml0cworICAgIHBjbXBlcXcgICAgIHhtbTEsIHhtbTQKKyAgICBwY21wZXF3ICAgICB4bW01LCB4bW00CisKKyAgICBwY21wZXF3ICAgICB4bW00LCB4bW00ICAgICAgICAgICAgICAgICAgO3NldCBhbGwgYml0cworICAgIHB4b3IgICAgICAgIHhtbTEsIHhtbTQKKyAgICBweG9yICAgICAgICB4bW01LCB4bW00CisKKyAgICBwYW5kICAgICAgICB4bW0xLCBbR0xPQkFMKGludl96aWdfemFnKV0KKyAgICBwYW5kICAgICAgICB4bW01LCBbR0xPQkFMKGludl96aWdfemFnICsgMTYpXQorCisgICAgcG1heHN3ICAgICAgeG1tMSwgeG1tNQorCisgICAgbW92ICAgICAgICAgcmN4LCBbcnNpICsgdnA4X2Jsb2NrZF9lb2JdCisKKyAgICA7IG5vdyBkb3duIHRvIDgKKyAgICBwc2h1ZmQgICAgICB4bW01LCB4bW0xLCAwMDAwMTExMGIKKworICAgIHBtYXhzdyAgICAgIHhtbTEsIHhtbTUKKworICAgIDsgb25seSA0IGxlZnQKKyAgICBwc2h1Zmx3ICAgICB4bW01LCB4bW0xLCAwMDAwMTExMGIKKworICAgIHBtYXhzdyAgICAgIHhtbTEsIHhtbTUKKworICAgIDsgb2theSwganVzdCAyIQorICAgIHBzaHVmbHcgICAgIHhtbTUsIHhtbTEsIDAwMDAwMDAxYgorCisgICAgcG1heHN3ICAgICAgeG1tMSwgeG1tNQorCisgICAgbW92ZCAgICAgICAgZWF4LCB4bW0xCisgICAgYW5kICAgICAgICAgZWF4LCAweGZmCisKKyAgICBtb3YgICAgICAgICBCWVRFIFBUUiBbcmN4XSwgYWwgICAgICAgICAgOyBzdG9yZSBlb2IKKworICAgIDsgYmVnaW4gZXBpbG9nCislaWYgQUJJX0lTXzMyQklUCisgICAgcG9wICAgICAgICAgcnNpCisgICAgcG9wICAgICAgICAgcmRpCislZWxzZQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgcG9wICAgICAgICAgcnNpCisgICAgcG9wICAgICAgICAgcmRpCisgICVlbmRpZgorJWVuZGlmCisKKyAgICBSRVNUT1JFX0dPVAorICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK2ludl96aWdfemFnOgorICBkdyAweDAwMDEsIDB4MDAwMiwgMHgwMDA2LCAweDAwMDcKKyAgZHcgMHgwMDAzLCAweDAwMDUsIDB4MDAwOCwgMHgwMDBkCisgIGR3IDB4MDAwNCwgMHgwMDA5LCAweDAwMGMsIDB4MDAwZQorICBkdyAweDAwMGEsIDB4MDAwYiwgMHgwMDBmLCAweDAwMTAKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfc3NlNC5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3NzZTQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTVkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3NzZTQuYXNtCkBAIC0wLDAgKzEsMjU2IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Cis7ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUworOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorJWluY2x1ZGUgImFzbV9lbmNfb2Zmc2V0cy5hc20iCisKKworOyB2b2lkIHZwOF9yZWd1bGFyX3F1YW50aXplX2Jfc3NlNCB8IGFyZworOyAgKEJMT0NLICAqYiwgICAgICAgICAgICAgICAgICAgICB8ICAwCis7ICAgQkxPQ0tEICpkKSAgICAgICAgICAgICAgICAgICAgIHwgIDEKKworZ2xvYmFsIHN5bSh2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTQpIFBSSVZBVEUKK3N5bSh2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTQpOgorCislaWYgQUJJX0lTXzMyQklUCisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBHRVRfR09UICAgICByYngKKyAgICBwdXNoICAgICAgICByZGkKKyAgICBwdXNoICAgICAgICByc2kKKworICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICAlZGVmaW5lIHFjb2VmZiAgICAgIDAgOyAzMgorICAgICVkZWZpbmUgc3RhY2tfc2l6ZSAzMgorICAgIHN1YiAgICAgICAgIHJzcCwgc3RhY2tfc2l6ZQorJWVsc2UKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorICAgIFNBVkVfWE1NIDgsIHUKKyAgICBwdXNoICAgICAgICByZGkKKyAgICBwdXNoICAgICAgICByc2kKKyAgJWVuZGlmCislZW5kaWYKKyAgICA7IGVuZCBwcm9sb2cKKworJWlmIEFCSV9JU18zMkJJVAorICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDApICAgICAgICAgICAgICAgICA7IEJMT0NLICpiCisgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMSkgICAgICAgICAgICAgICAgIDsgQkxPQ0tEICpkCislZWxzZQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgbW92ICAgICAgICAgcmRpLCByY3ggICAgICAgICAgICAgICAgICAgIDsgQkxPQ0sgKmIKKyAgICBtb3YgICAgICAgICByc2ksIHJkeCAgICAgICAgICAgICAgICAgICAgOyBCTE9DS0QgKmQKKyAgJWVsc2UKKyAgICA7bW92ICAgICAgICAgcmRpLCByZGkgICAgICAgICAgICAgICAgICAgIDsgQkxPQ0sgKmIKKyAgICA7bW92ICAgICAgICAgcnNpLCByc2kgICAgICAgICAgICAgICAgICAgIDsgQkxPQ0tEICpkCisgICVlbmRpZgorJWVuZGlmCisKKyAgICBtb3YgICAgICAgICByYXgsIFtyZGkgKyB2cDhfYmxvY2tfY29lZmZdCisgICAgbW92ICAgICAgICAgcmN4LCBbcmRpICsgdnA4X2Jsb2NrX3piaW5dCisgICAgbW92ICAgICAgICAgcmR4LCBbcmRpICsgdnA4X2Jsb2NrX3JvdW5kXQorICAgIG1vdmQgICAgICAgIHhtbTcsIFtyZGkgKyB2cDhfYmxvY2tfemJpbl9leHRyYV0KKworICAgIDsgegorICAgIG1vdmRxYSAgICAgIHhtbTAsIFtyYXhdCisgICAgbW92ZHFhICAgICAgeG1tMSwgW3JheCArIDE2XQorCisgICAgOyBkdXBsaWNhdGUgemJpbl9vcV92YWx1ZQorICAgIHBzaHVmbHcgICAgIHhtbTcsIHhtbTcsIDAKKyAgICBwdW5wY2tsd2QgICB4bW03LCB4bW03CisKKyAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0wCisgICAgbW92ZHFhICAgICAgeG1tMywgeG1tMQorCisgICAgOyBzegorICAgIHBzcmF3ICAgICAgIHhtbTAsIDE1CisgICAgcHNyYXcgICAgICAgeG1tMSwgMTUKKworICAgIDsgKHogXiBzeikKKyAgICBweG9yICAgICAgICB4bW0yLCB4bW0wCisgICAgcHhvciAgICAgICAgeG1tMywgeG1tMQorCisgICAgOyB4ID0gYWJzKHopCisgICAgcHN1YncgICAgICAgeG1tMiwgeG1tMAorICAgIHBzdWJ3ICAgICAgIHhtbTMsIHhtbTEKKworICAgIDsgemJpbgorICAgIG1vdmRxYSAgICAgIHhtbTQsIFtyY3hdCisgICAgbW92ZHFhICAgICAgeG1tNSwgW3JjeCArIDE2XQorCisgICAgOyAqemJpbl9wdHIgKyB6YmluX29xX3ZhbHVlCisgICAgcGFkZHcgICAgICAgeG1tNCwgeG1tNworICAgIHBhZGR3ICAgICAgIHhtbTUsIHhtbTcKKworICAgIG1vdmRxYSAgICAgIHhtbTYsIHhtbTIKKyAgICBtb3ZkcWEgICAgICB4bW03LCB4bW0zCisKKyAgICA7IHggLSAoKnpiaW5fcHRyICsgemJpbl9vcV92YWx1ZSkKKyAgICBwc3VidyAgICAgICB4bW02LCB4bW00CisgICAgcHN1YncgICAgICAgeG1tNywgeG1tNQorCisgICAgOyByb3VuZAorICAgIG1vdmRxYSAgICAgIHhtbTQsIFtyZHhdCisgICAgbW92ZHFhICAgICAgeG1tNSwgW3JkeCArIDE2XQorCisgICAgbW92ICAgICAgICAgcmF4LCBbcmRpICsgdnA4X2Jsb2NrX3F1YW50X3NoaWZ0XQorICAgIG1vdiAgICAgICAgIHJjeCwgW3JkaSArIHZwOF9ibG9ja19xdWFudF0KKyAgICBtb3YgICAgICAgICByZHgsIFtyZGkgKyB2cDhfYmxvY2tfenJ1bl96YmluX2Jvb3N0XQorCisgICAgOyB4ICsgcm91bmQKKyAgICBwYWRkdyAgICAgICB4bW0yLCB4bW00CisgICAgcGFkZHcgICAgICAgeG1tMywgeG1tNQorCisgICAgOyBxdWFudAorICAgIG1vdmRxYSAgICAgIHhtbTQsIFtyY3hdCisgICAgbW92ZHFhICAgICAgeG1tNSwgW3JjeCArIDE2XQorCisgICAgOyB5ID0geCAqIHF1YW50X3B0ciA+PiAxNgorICAgIHBtdWxodyAgICAgIHhtbTQsIHhtbTIKKyAgICBwbXVsaHcgICAgICB4bW01LCB4bW0zCisKKyAgICA7IHkgKz0geAorICAgIHBhZGR3ICAgICAgIHhtbTIsIHhtbTQKKyAgICBwYWRkdyAgICAgICB4bW0zLCB4bW01CisKKyAgICBweG9yICAgICAgICB4bW00LCB4bW00CislaWYgQUJJX0lTXzMyQklUCisgICAgbW92ZHFhICAgICAgW3JzcCArIHFjb2VmZl0sIHhtbTQKKyAgICBtb3ZkcWEgICAgICBbcnNwICsgcWNvZWZmICsgMTZdLCB4bW00CislZWxzZQorICAgIHB4b3IgICAgICAgIHhtbTgsIHhtbTgKKyVlbmRpZgorCisgICAgOyBxdWFudF9zaGlmdAorICAgIG1vdmRxYSAgICAgIHhtbTUsIFtyYXhdCisKKyAgICA7IHpydW5femJpbl9ib29zdAorICAgIG1vdiAgICAgICAgIHJheCwgcmR4CisKKyVtYWNybyBaSUdaQUdfTE9PUCA1CisgICAgOyB4CisgICAgcGV4dHJ3ICAgICAgZWN4LCAlNCwgJTIKKworICAgIDsgaWYgKHggPj0gemJpbikKKyAgICBzdWIgICAgICAgICBjeCwgV09SRCBQVFJbcmR4XSAgICAgICAgICAgOyB4IC0gemJpbgorICAgIGxlYSAgICAgICAgIHJkeCwgW3JkeCArIDJdICAgICAgICAgICAgICA7IHpiaW5fYm9vc3RfcHRyKysKKyAgICBqbCAgICAgICAgICAucnFfemlnemFnX2xvb3BfJTEgICAgICAgICAgOyB4IDwgemJpbgorCisgICAgcGV4dHJ3ICAgICAgZWRpLCAlMywgJTIgICAgICAgICAgICAgICAgIDsgeQorCisgICAgOyBkb3duc2hpZnQgYnkgcXVhbnRfc2hpZnRbcmNdCisgICAgcGV4dHJiICAgICAgZWN4LCB4bW01LCAlMSAgICAgICAgICAgICAgIDsgcXVhbnRfc2hpZnRbcmNdCisgICAgc2FyICAgICAgICAgZWRpLCBjbCAgICAgICAgICAgICAgICAgICAgIDsgYWxzbyBzZXRzIFogYml0CisgICAgamUgICAgICAgICAgLnJxX3ppZ3phZ19sb29wXyUxICAgICAgICAgIDsgIXkKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBtb3YgICAgICAgICBXT1JEIFBUUltyc3AgKyBxY29lZmYgKyAlMSAqMl0sIGRpCislZWxzZQorICAgIHBpbnNydyAgICAgICU1LCBlZGksICUyICAgICAgICAgICAgICAgICA7IHFjb2VmZltyY10KKyVlbmRpZgorICAgIG1vdiAgICAgICAgIHJkeCwgcmF4ICAgICAgICAgICAgICAgICAgICA7IHJlc2V0IHRvIGItPnpydW5femJpbl9ib29zdAorLnJxX3ppZ3phZ19sb29wXyUxOgorJWVuZG1hY3JvCis7IGluIHZwOF9kZWZhdWx0X3ppZ196YWcxZCBvcmRlcjogc2VlIHZwOC9jb21tb24vZW50cm9weS5jCitaSUdaQUdfTE9PUCAgMCwgMCwgeG1tMiwgeG1tNiwgeG1tNAorWklHWkFHX0xPT1AgIDEsIDEsIHhtbTIsIHhtbTYsIHhtbTQKK1pJR1pBR19MT09QICA0LCA0LCB4bW0yLCB4bW02LCB4bW00CitaSUdaQUdfTE9PUCAgOCwgMCwgeG1tMywgeG1tNywgeG1tOAorWklHWkFHX0xPT1AgIDUsIDUsIHhtbTIsIHhtbTYsIHhtbTQKK1pJR1pBR19MT09QICAyLCAyLCB4bW0yLCB4bW02LCB4bW00CitaSUdaQUdfTE9PUCAgMywgMywgeG1tMiwgeG1tNiwgeG1tNAorWklHWkFHX0xPT1AgIDYsIDYsIHhtbTIsIHhtbTYsIHhtbTQKK1pJR1pBR19MT09QICA5LCAxLCB4bW0zLCB4bW03LCB4bW04CitaSUdaQUdfTE9PUCAxMiwgNCwgeG1tMywgeG1tNywgeG1tOAorWklHWkFHX0xPT1AgMTMsIDUsIHhtbTMsIHhtbTcsIHhtbTgKK1pJR1pBR19MT09QIDEwLCAyLCB4bW0zLCB4bW03LCB4bW04CitaSUdaQUdfTE9PUCAgNywgNywgeG1tMiwgeG1tNiwgeG1tNAorWklHWkFHX0xPT1AgMTEsIDMsIHhtbTMsIHhtbTcsIHhtbTgKK1pJR1pBR19MT09QIDE0LCA2LCB4bW0zLCB4bW03LCB4bW04CitaSUdaQUdfTE9PUCAxNSwgNywgeG1tMywgeG1tNywgeG1tOAorCisgICAgbW92ICAgICAgICAgcmN4LCBbcnNpICsgdnA4X2Jsb2NrZF9kZXF1YW50XQorICAgIG1vdiAgICAgICAgIHJkaSwgW3JzaSArIHZwOF9ibG9ja2RfZHFjb2VmZl0KKworJWlmIEFCSV9JU18zMkJJVAorICAgIG1vdmRxYSAgICAgIHhtbTQsIFtyc3AgKyBxY29lZmZdCisgICAgbW92ZHFhICAgICAgeG1tNSwgW3JzcCArIHFjb2VmZiArIDE2XQorJWVsc2UKKyAgICAlZGVmaW5lICAgICB4bW01IHhtbTgKKyVlbmRpZgorCisgICAgOyB5IF4gc3oKKyAgICBweG9yICAgICAgICB4bW00LCB4bW0wCisgICAgcHhvciAgICAgICAgeG1tNSwgeG1tMQorICAgIDsgeCA9ICh5IF4gc3opIC0gc3oKKyAgICBwc3VidyAgICAgICB4bW00LCB4bW0wCisgICAgcHN1YncgICAgICAgeG1tNSwgeG1tMQorCisgICAgOyBkZXF1YW50CisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JjeF0KKyAgICBtb3ZkcWEgICAgICB4bW0xLCBbcmN4ICsgMTZdCisKKyAgICBtb3YgICAgICAgICByY3gsIFtyc2kgKyB2cDhfYmxvY2tkX3Fjb2VmZl0KKworICAgIHBtdWxsdyAgICAgIHhtbTAsIHhtbTQKKyAgICBwbXVsbHcgICAgICB4bW0xLCB4bW01CisKKyAgICA7IHN0b3JlIHFjb2VmZgorICAgIG1vdmRxYSAgICAgIFtyY3hdLCB4bW00CisgICAgbW92ZHFhICAgICAgW3JjeCArIDE2XSwgeG1tNQorCisgICAgOyBzdG9yZSBkcWNvZWZmCisgICAgbW92ZHFhICAgICAgW3JkaV0sIHhtbTAKKyAgICBtb3ZkcWEgICAgICBbcmRpICsgMTZdLCB4bW0xCisKKyAgICBtb3YgICAgICAgICByY3gsIFtyc2kgKyB2cDhfYmxvY2tkX2VvYl0KKworICAgIDsgc2VsZWN0IHRoZSBsYXN0IHZhbHVlIChpbiB6aWdfemFnIG9yZGVyKSBmb3IgRU9CCisgICAgcHhvciAgICAgICAgeG1tNiwgeG1tNgorICAgIHBjbXBlcXcgICAgIHhtbTQsIHhtbTYKKyAgICBwY21wZXF3ICAgICB4bW01LCB4bW02CisKKyAgICBwYWNrc3N3YiAgICB4bW00LCB4bW01CisgICAgcHNodWZiICAgICAgeG1tNCwgW0dMT0JBTCh6aWdfemFnMWQpXQorICAgIHBtb3Ztc2tiICAgIGVkeCwgeG1tNAorICAgIHhvciAgICAgICAgIHJkaSwgcmRpCisgICAgbW92ICAgICAgICAgZWF4LCAtMQorICAgIHhvciAgICAgICAgIGR4LCBheAorICAgIGJzciAgICAgICAgIGVheCwgZWR4CisgICAgc3ViICAgICAgICAgZWRpLCBlZHgKKyAgICBzYXIgICAgICAgICBlZGksIDMxCisgICAgYWRkICAgICAgICAgZWF4LCAxCisgICAgYW5kICAgICAgICAgZWF4LCBlZGkKKworICAgIG1vdiAgICAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbCAgICAgICAgICA7IHN0b3JlIGVvYgorCisgICAgOyBiZWdpbiBlcGlsb2cKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBhZGQgICAgICAgICByc3AsIHN0YWNrX3NpemUKKyAgICBwb3AgICAgICAgICByc3AKKworICAgIHBvcCAgICAgICAgIHJzaQorICAgIHBvcCAgICAgICAgIHJkaQorICAgIFJFU1RPUkVfR09UCisgICAgcG9wICAgICAgICAgcmJwCislZWxzZQorICAldW5kZWYgeG1tNQorICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgcG9wICAgICAgICAgcnNpCisgICAgcG9wICAgICAgICAgcmRpCisgICAgUkVTVE9SRV9YTU0KKyAgJWVuZGlmCislZW5kaWYKKworICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKKzsgdnA4L2NvbW1vbi9lbnRyb3B5LmM6IHZwOF9kZWZhdWx0X3ppZ196YWcxZAoremlnX3phZzFkOgorICAgIGRiIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfc3NzZTMuYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9xdWFudGl6ZV9zc3NlMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1MjZmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfc3NzZTMuYXNtCkBAIC0wLDAgKzEsMTM4IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Cis7ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKzsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUworOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorJWluY2x1ZGUgImFzbV9lbmNfb2Zmc2V0cy5hc20iCisKKworOyB2b2lkIHZwOF9mYXN0X3F1YW50aXplX2Jfc3NzZTMgfCBhcmcKKzsgIChCTE9DSyAgKmIsICAgICAgICAgICAgICAgICAgIHwgIDAKKzsgICBCTE9DS0QgKmQpICAgICAgICAgICAgICAgICAgIHwgIDEKKzsKKworZ2xvYmFsIHN5bSh2cDhfZmFzdF9xdWFudGl6ZV9iX3Nzc2UzKSBQUklWQVRFCitzeW0odnA4X2Zhc3RfcXVhbnRpemVfYl9zc3NlMyk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBHRVRfR09UICAgICByYngKKworJWlmIEFCSV9JU18zMkJJVAorICAgIHB1c2ggICAgICAgIHJkaQorICAgIHB1c2ggICAgICAgIHJzaQorJWVsc2UKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorICAgIHB1c2ggICAgICAgIHJkaQorICAgIHB1c2ggICAgICAgIHJzaQorICAlZW5kaWYKKyVlbmRpZgorICAgIDsgZW5kIHByb2xvZworCislaWYgQUJJX0lTXzMyQklUCisgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMCkgICAgICAgICAgICAgICAgIDsgQkxPQ0sgKmIKKyAgICBtb3YgICAgICAgICByc2ksIGFyZygxKSAgICAgICAgICAgICAgICAgOyBCTE9DS0QgKmQKKyVlbHNlCisgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBtb3YgICAgICAgICByZGksIHJjeCAgICAgICAgICAgICAgICAgICAgOyBCTE9DSyAqYgorICAgIG1vdiAgICAgICAgIHJzaSwgcmR4ICAgICAgICAgICAgICAgICAgICA7IEJMT0NLRCAqZAorICAlZWxzZQorICAgIDttb3YgICAgICAgICByZGksIHJkaSAgICAgICAgICAgICAgICAgICAgOyBCTE9DSyAqYgorICAgIDttb3YgICAgICAgICByc2ksIHJzaSAgICAgICAgICAgICAgICAgICAgOyBCTE9DS0QgKmQKKyAgJWVuZGlmCislZW5kaWYKKworICAgIG1vdiAgICAgICAgIHJheCwgW3JkaSArIHZwOF9ibG9ja19jb2VmZl0KKyAgICBtb3YgICAgICAgICByY3gsIFtyZGkgKyB2cDhfYmxvY2tfcm91bmRdCisgICAgbW92ICAgICAgICAgcmR4LCBbcmRpICsgdnA4X2Jsb2NrX3F1YW50X2Zhc3RdCisKKyAgICA7IGNvZWZmCisgICAgbW92ZHFhICAgICAgeG1tMCwgW3JheF0KKyAgICBtb3ZkcWEgICAgICB4bW00LCBbcmF4ICsgMTZdCisKKyAgICA7IHJvdW5kCisgICAgbW92ZHFhICAgICAgeG1tMiwgW3JjeF0KKyAgICBtb3ZkcWEgICAgICB4bW0zLCBbcmN4ICsgMTZdCisKKyAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCisgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tNAorCisgICAgOyBzeiA9IHogPj4gMTUKKyAgICBwc3JhdyAgICAgICB4bW0wLCAxNQorICAgIHBzcmF3ICAgICAgIHhtbTQsIDE1CisKKyAgICBwYWJzdyAgICAgICB4bW0xLCB4bW0xCisgICAgcGFic3cgICAgICAgeG1tNSwgeG1tNQorCisgICAgcGFkZHcgICAgICAgeG1tMSwgeG1tMgorICAgIHBhZGR3ICAgICAgIHhtbTUsIHhtbTMKKworICAgIDsgcXVhbnRfZmFzdAorICAgIHBtdWxodyAgICAgIHhtbTEsIFtyZHhdCisgICAgcG11bGh3ICAgICAgeG1tNSwgW3JkeCArIDE2XQorCisgICAgbW92ICAgICAgICAgcmF4LCBbcnNpICsgdnA4X2Jsb2NrZF9xY29lZmZdCisgICAgbW92ICAgICAgICAgcmRpLCBbcnNpICsgdnA4X2Jsb2NrZF9kZXF1YW50XQorICAgIG1vdiAgICAgICAgIHJjeCwgW3JzaSArIHZwOF9ibG9ja2RfZHFjb2VmZl0KKworICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEgICAgICAgICAgICAgICAgICA7c3RvcmUgeSBmb3IgZ2V0dGluZyBlb2IKKyAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW01CisKKyAgICBweG9yICAgICAgICB4bW0xLCB4bW0wCisgICAgcHhvciAgICAgICAgeG1tNSwgeG1tNAorICAgIHBzdWJ3ICAgICAgIHhtbTEsIHhtbTAKKyAgICBwc3VidyAgICAgICB4bW01LCB4bW00CisKKyAgICBtb3ZkcWEgICAgICBbcmF4XSwgeG1tMQorICAgIG1vdmRxYSAgICAgIFtyYXggKyAxNl0sIHhtbTUKKworICAgIG1vdmRxYSAgICAgIHhtbTAsIFtyZGldCisgICAgbW92ZHFhICAgICAgeG1tNCwgW3JkaSArIDE2XQorCisgICAgcG11bGx3ICAgICAgeG1tMCwgeG1tMQorICAgIHBtdWxsdyAgICAgIHhtbTQsIHhtbTUKKyAgICBweG9yICAgICAgICB4bW0xLCB4bW0xCisKKyAgICBwY21wZ3R3ICAgICB4bW0yLCB4bW0xICAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBlb2IKKyAgICBwY21wZ3R3ICAgICB4bW0zLCB4bW0xCisgICAgcGFja3Nzd2IgICAgeG1tMiwgeG1tMworICAgIHBzaHVmYiAgICAgIHhtbTIsIFtHTE9CQUwoenpfc2h1ZildCisKKyAgICBwbW92bXNrYiAgICBlZHgsIHhtbTIKKworICAgIG1vdmRxYSAgICAgIFtyY3hdLCB4bW0wICAgICAgICAgICAgICAgICA7c3RvcmUgZHFjb2VmZgorICAgIG1vdmRxYSAgICAgIFtyY3ggKyAxNl0sIHhtbTQgICAgICAgICAgICA7c3RvcmUgZHFjb2VmZgorICAgIG1vdiAgICAgICAgIHJjeCwgW3JzaSArIHZwOF9ibG9ja2RfZW9iXQorCisgICAgYnNyICAgICAgICAgZWF4LCBlZHggICAgICAgICAgICAgICAgICAgIDtjb3VudCAwCisgICAgYWRkICAgICAgICAgZWF4LCAxCisKKyAgICBjbXAgICAgICAgICBlZHgsIDAgICAgICAgICAgICAgICAgICAgICAgO2lmIGFsbCAwLCBlb2I9MAorICAgIGNtb3ZlICAgICAgIGVheCwgZWR4CisKKyAgICBtb3YgICAgICAgICBCWVRFIFBUUiBbcmN4XSwgYWwgICAgICAgICAgO3N0b3JlIGVvYgorCisgICAgOyBiZWdpbiBlcGlsb2cKKyVpZiBBQklfSVNfMzJCSVQKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBwb3AgICAgICAgICByZGkKKyVlbHNlCisgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICBwb3AgICAgICAgICByc2kKKyAgICBwb3AgICAgICAgICByZGkKKyAgJWVuZGlmCislZW5kaWYKKworICAgIFJFU1RPUkVfR09UCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKK1NFQ1RJT05fUk9EQVRBCithbGlnbiAxNgorenpfc2h1ZjoKKyAgICBkYiAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3NzaW1fb3B0LmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvc3NpbV9vcHQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjRhODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3NzaW1fb3B0LmFzbQpAQCAtMCwwICsxLDIxNiBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKyVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKKworOyB0YWJ1bGF0ZV9zc2ltIC0gc3VtcyBzdW1fcyxzdW1fcixzdW1fc3FfcyxzdW1fc3Ffciwgc3VtX3N4cgorJW1hY3JvIFRBQlVMQVRFX1NTSU0gMAorICAgICAgICBwYWRkdXN3ICAgICAgICAgeG1tMTUsIHhtbTMgIDsgc3VtX3MKKyAgICAgICAgcGFkZHVzdyAgICAgICAgIHhtbTE0LCB4bW00ICA7IHN1bV9yCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0xLCB4bW0zCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCB4bW0xCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW0xMywgeG1tMSA7IHN1bV9zcV9zCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCB4bW00CisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0yLCB4bW0yCisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW0xMiwgeG1tMiA7IHN1bV9zcV9yCisgICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0zLCB4bW00CisgICAgICAgIHBhZGRkICAgICAgICAgICB4bW0xMSwgeG1tMyAgOyBzdW1fc3hyCislZW5kbWFjcm8KKworOyBTdW0gYWNyb3NzIHRoZSByZWdpc3RlciAlMSBzdGFydGluZyB3aXRoIHEgd29yZHMKKyVtYWNybyBTVU1fQUNST1NTX1EgMQorICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwlMQorICAgICAgICBwdW5wY2tsZHEgICAgICAgJTEseG1tMAorICAgICAgICBwdW5wY2toZHEgICAgICAgeG1tMix4bW0wCisgICAgICAgIHBhZGRxICAgICAgICAgICAlMSx4bW0yCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCUxCisgICAgICAgIHB1bnBja2xxZHEgICAgICAlMSx4bW0wCisgICAgICAgIHB1bnBja2hxZHEgICAgICB4bW0yLHhtbTAKKyAgICAgICAgcGFkZHEgICAgICAgICAgICUxLHhtbTIKKyVlbmRtYWNybworCis7IFN1bSBhY3Jvc3MgdGhlIHJlZ2lzdGVyICUxIHN0YXJ0aW5nIHdpdGggcSB3b3JkcworJW1hY3JvIFNVTV9BQ1JPU1NfVyAxCisgICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0xLCAlMQorICAgICAgICBwdW5wY2tsd2QgICAgICAgJTEseG1tMAorICAgICAgICBwdW5wY2tod2QgICAgICAgeG1tMSx4bW0wCisgICAgICAgIHBhZGRkICAgICAgICAgICAlMSwgeG1tMQorICAgICAgICBTVU1fQUNST1NTX1EgICAgJTEKKyVlbmRtYWNybworO3ZvaWQgc3NpbV9wYXJtc19zc2UyKAorOyAgICB1bnNpZ25lZCBjaGFyICpzLAorOyAgICBpbnQgc3AsCis7ICAgIHVuc2lnbmVkIGNoYXIgKnIsCis7ICAgIGludCBycAorOyAgICB1bnNpZ25lZCBsb25nICpzdW1fcywKKzsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3IsCis7ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9zLAorOyAgICB1bnNpZ25lZCBsb25nICpzdW1fc3FfciwKKzsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3N4cik7Cis7Cis7IFRPRE86IFVzZSBwYXJtIHBhc3NpbmcgdGhyb3VnaCBzdHJ1Y3R1cmUsIHByb2JhYmx5IGRvbid0IG5lZWQgdGhlIHB4b3JzCis7ICggY2FsbGluZyBhcHAgd2lsbCBpbml0aWFsaXplIHRvIDAgKSBjb3VsZCBlYXNpbHkgZml0IGV2ZXJ5dGhpbmcgaW4gc3NlMgorOyB3aXRob3V0IHRvbyBtdWNoIGhhc3RsZSwgYW5kIGNhbiBwcm9iYWJseSBkbyBiZXR0ZXIgZXN0aW1hdGVzIHdpdGggcHNhZHcKKzsgb3IgcGF2Z2IgQXQgdGhpcyBwb2ludCB0aGlzIGlzIGp1c3QgbWVhbnQgdG8gYmUgZmlyc3QgcGFzcyBmb3IgY2FsY3VsYXRpbmcKKzsgYWxsIHRoZSBwYXJtcyBuZWVkZWQgZm9yIDE2eDE2IHNzaW0gc28gd2UgY2FuIHBsYXkgd2l0aCBkc3NpbSBhcyBkaXN0b3J0aW9uCis7IGluIG1vZGUgc2VsZWN0aW9uIGNvZGUuCitnbG9iYWwgc3ltKHZwOF9zc2ltX3Bhcm1zXzE2eDE2X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfc3NpbV9wYXJtc18xNngxNl9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDkKKyAgICBTQVZFX1hNTSAxNQorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7cworICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICBhcmcoMSkgO3NwCisgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cgorICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMykgO3JwCisKKyAgICBweG9yICAgICAgICAgICAgeG1tMCwgeG1tMAorICAgIHB4b3IgICAgICAgICAgICB4bW0xNSx4bW0xNSAgO3N1bV9zCisgICAgcHhvciAgICAgICAgICAgIHhtbTE0LHhtbTE0ICA7c3VtX3IKKyAgICBweG9yICAgICAgICAgICAgeG1tMTMseG1tMTMgIDtzdW1fc3FfcworICAgIHB4b3IgICAgICAgICAgICB4bW0xMix4bW0xMiAgO3N1bV9zcV9yCisgICAgcHhvciAgICAgICAgICAgIHhtbTExLHhtbTExICA7c3VtX3N4cgorCisgICAgbW92ICAgICAgICAgICAgIHJkeCwgMTYgICAgICA7cm93IGNvdW50ZXIKKy5OZXh0Um93OgorCisgICAgO2dyYWIgc291cmNlIGFuZCByZWZlcmVuY2UgcGl4ZWxzCisgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsIFtyc2ldCisgICAgbW92ZHF1ICAgICAgICAgIHhtbTYsIFtyZGldCisgICAgbW92ZHFhICAgICAgICAgIHhtbTMsIHhtbTUKKyAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgeG1tNgorICAgIHB1bnBja2hidyAgICAgICB4bW0zLCB4bW0wIDsgaGlnaF9zCisgICAgcHVucGNraGJ3ICAgICAgIHhtbTQsIHhtbTAgOyBoaWdoX3IKKworICAgIFRBQlVMQVRFX1NTSU0KKworICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCB4bW01CisgICAgbW92ZHFhICAgICAgICAgIHhtbTQsIHhtbTYKKyAgICBwdW5wY2tsYncgICAgICAgeG1tMywgeG1tMCA7IGxvd19zCisgICAgcHVucGNrbGJ3ICAgICAgIHhtbTQsIHhtbTAgOyBsb3dfcgorCisgICAgVEFCVUxBVEVfU1NJTQorCisgICAgYWRkICAgICAgICAgICAgIHJzaSwgcmN4ICAgOyBuZXh0IHMgcm93CisgICAgYWRkICAgICAgICAgICAgIHJkaSwgcmF4ICAgOyBuZXh0IHIgcm93CisKKyAgICBkZWMgICAgICAgICAgICAgcmR4ICAgICAgICA7IGNvdW50ZXIKKyAgICBqbnogLk5leHRSb3cKKworICAgIFNVTV9BQ1JPU1NfVyAgICB4bW0xNQorICAgIFNVTV9BQ1JPU1NfVyAgICB4bW0xNAorICAgIFNVTV9BQ1JPU1NfUSAgICB4bW0xMworICAgIFNVTV9BQ1JPU1NfUSAgICB4bW0xMgorICAgIFNVTV9BQ1JPU1NfUSAgICB4bW0xMQorCisgICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoNCkKKyAgICBtb3ZkICAgICAgICAgICAgW3JkaV0sIHhtbTE1OworICAgIG1vdiAgICAgICAgICAgICByZGksYXJnKDUpCisgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCB4bW0xNDsKKyAgICBtb3YgICAgICAgICAgICAgcmRpLGFyZyg2KQorICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgeG1tMTM7CisgICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoNykKKyAgICBtb3ZkICAgICAgICAgICAgW3JkaV0sIHhtbTEyOworICAgIG1vdiAgICAgICAgICAgICByZGksYXJnKDgpCisgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCB4bW0xMTsKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIHNzaW1fcGFybXNfc3NlMigKKzsgICAgdW5zaWduZWQgY2hhciAqcywKKzsgICAgaW50IHNwLAorOyAgICB1bnNpZ25lZCBjaGFyICpyLAorOyAgICBpbnQgcnAKKzsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3MsCis7ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9yLAorOyAgICB1bnNpZ25lZCBsb25nICpzdW1fc3FfcywKKzsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3IsCis7ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zeHIpOworOworOyBUT0RPOiBVc2UgcGFybSBwYXNzaW5nIHRocm91Z2ggc3RydWN0dXJlLCBwcm9iYWJseSBkb24ndCBuZWVkIHRoZSBweG9ycworOyAoIGNhbGxpbmcgYXBwIHdpbGwgaW5pdGlhbGl6ZSB0byAwICkgY291bGQgZWFzaWx5IGZpdCBldmVyeXRoaW5nIGluIHNzZTIKKzsgd2l0aG91dCB0b28gbXVjaCBoYXN0bGUsIGFuZCBjYW4gcHJvYmFibHkgZG8gYmV0dGVyIGVzdGltYXRlcyB3aXRoIHBzYWR3Cis7IG9yIHBhdmdiIEF0IHRoaXMgcG9pbnQgdGhpcyBpcyBqdXN0IG1lYW50IHRvIGJlIGZpcnN0IHBhc3MgZm9yIGNhbGN1bGF0aW5nCis7IGFsbCB0aGUgcGFybXMgbmVlZGVkIGZvciAxNngxNiBzc2ltIHNvIHdlIGNhbiBwbGF5IHdpdGggZHNzaW0gYXMgZGlzdG9ydGlvbgorOyBpbiBtb2RlIHNlbGVjdGlvbiBjb2RlLgorZ2xvYmFsIHN5bSh2cDhfc3NpbV9wYXJtc184eDhfc3NlMikgUFJJVkFURQorc3ltKHZwOF9zc2ltX3Bhcm1zXzh4OF9zc2UyKToKKyAgICBwdXNoICAgICAgICByYnAKKyAgICBtb3YgICAgICAgICByYnAsIHJzcAorICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDkKKyAgICBTQVZFX1hNTSAxNQorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7cworICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICBhcmcoMSkgO3NwCisgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cgorICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMykgO3JwCisKKyAgICBweG9yICAgICAgICAgICAgeG1tMCwgeG1tMAorICAgIHB4b3IgICAgICAgICAgICB4bW0xNSx4bW0xNSAgO3N1bV9zCisgICAgcHhvciAgICAgICAgICAgIHhtbTE0LHhtbTE0ICA7c3VtX3IKKyAgICBweG9yICAgICAgICAgICAgeG1tMTMseG1tMTMgIDtzdW1fc3FfcworICAgIHB4b3IgICAgICAgICAgICB4bW0xMix4bW0xMiAgO3N1bV9zcV9yCisgICAgcHhvciAgICAgICAgICAgIHhtbTExLHhtbTExICA7c3VtX3N4cgorCisgICAgbW92ICAgICAgICAgICAgIHJkeCwgOCAgICAgIDtyb3cgY291bnRlcgorLk5leHRSb3c6CisKKyAgICA7Z3JhYiBzb3VyY2UgYW5kIHJlZmVyZW5jZSBwaXhlbHMKKyAgICBtb3ZxICAgICAgICAgICAgeG1tMywgW3JzaV0KKyAgICBtb3ZxICAgICAgICAgICAgeG1tNCwgW3JkaV0KKyAgICBwdW5wY2tsYncgICAgICAgeG1tMywgeG1tMCA7IGxvd19zCisgICAgcHVucGNrbGJ3ICAgICAgIHhtbTQsIHhtbTAgOyBsb3dfcgorCisgICAgVEFCVUxBVEVfU1NJTQorCisgICAgYWRkICAgICAgICAgICAgIHJzaSwgcmN4ICAgOyBuZXh0IHMgcm93CisgICAgYWRkICAgICAgICAgICAgIHJkaSwgcmF4ICAgOyBuZXh0IHIgcm93CisKKyAgICBkZWMgICAgICAgICAgICAgcmR4ICAgICAgICA7IGNvdW50ZXIKKyAgICBqbnogLk5leHRSb3cKKworICAgIFNVTV9BQ1JPU1NfVyAgICB4bW0xNQorICAgIFNVTV9BQ1JPU1NfVyAgICB4bW0xNAorICAgIFNVTV9BQ1JPU1NfUSAgICB4bW0xMworICAgIFNVTV9BQ1JPU1NfUSAgICB4bW0xMgorICAgIFNVTV9BQ1JPU1NfUSAgICB4bW0xMQorCisgICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoNCkKKyAgICBtb3ZkICAgICAgICAgICAgW3JkaV0sIHhtbTE1OworICAgIG1vdiAgICAgICAgICAgICByZGksYXJnKDUpCisgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCB4bW0xNDsKKyAgICBtb3YgICAgICAgICAgICAgcmRpLGFyZyg2KQorICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgeG1tMTM7CisgICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoNykKKyAgICBtb3ZkICAgICAgICAgICAgW3JkaV0sIHhtbTEyOworICAgIG1vdiAgICAgICAgICAgICByZGksYXJnKDgpCisgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCB4bW0xMTsKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9YTU0KKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3N1YnRyYWN0X21teC5hc20gYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3N1YnRyYWN0X21teC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0ZGQyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvc3VidHJhY3RfbW14LmFzbQpAQCAtMCwwICsxLDIyMyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7dm9pZCB2cDhfc3VidHJhY3RfYl9tbXhfaW1wbCh1bnNpZ25lZCBjaGFyICp6LCAgaW50IHNyY19zdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpQcmVkaWN0b3IsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCk7CitnbG9iYWwgc3ltKHZwOF9zdWJ0cmFjdF9iX21teF9pbXBsKSBQUklWQVRFCitzeW0odnA4X3N1YnRyYWN0X2JfbW14X2ltcGwpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworCisgICAgICAgIG1vdiAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtkaWZmCisgICAgICAgIG1vdiAgICAgcmF4LCAgICAgICAgYXJnKDMpIDtQcmVkaWN0b3IKKyAgICAgICAgbW92ICAgICByc2ksICAgICAgICBhcmcoMCkgO3oKKyAgICAgICAgbW92c3hkICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpO3NyY19zdHJpZGU7CisgICAgICAgIG1vdnN4ZCAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KTtwaXRjaAorICAgICAgICBweG9yICAgIG1tNywgICAgICAgIG1tNworCisgICAgICAgIG1vdmQgICAgbW0wLCAgICAgICAgW3JzaV0KKyAgICAgICAgbW92ZCAgICBtbTEsICAgICAgICBbcmF4XQorICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNworICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNworICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQorICAgICAgICBtb3ZxICAgIFtyZGldLCAgICAgIG1tMAorCisKKyAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpK3JkeF0KKyAgICAgICAgbW92ZCAgICBtbTEsICAgICAgICBbcmF4K3JjeF0KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKKyAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKKyAgICAgICAgbW92cSAgICBbcmRpK3JjeCoyXSxtbTAKKworCisgICAgICAgIG1vdmQgICAgbW0wLCAgICAgICAgW3JzaStyZHgqMl0KKyAgICAgICAgbW92ZCAgICBtbTEsICAgICAgICBbcmF4K3JjeCoyXQorICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNworICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNworICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQorICAgICAgICBtb3ZxICAgIFtyZGkrcmN4KjRdLCAgICAgICAgbW0wCisKKyAgICAgICAgbGVhICAgICByc2ksICAgICAgICBbcnNpK3JkeCoyXQorICAgICAgICBsZWEgICAgIHJjeCwgICAgICAgIFtyY3grcmN4KjJdCisKKworCisgICAgICAgIG1vdmQgICAgbW0wLCAgICAgICAgW3JzaStyZHhdCisgICAgICAgIG1vdmQgICAgbW0xLCAgICAgICAgW3JheCtyY3hdCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03CisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03CisgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgW3JkaStyY3gqMl0sICAgICAgICBtbTAKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CisKKzt2b2lkIHZwOF9zdWJ0cmFjdF9tYnlfbW14KHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfc3RyaWRlLAorO3Vuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwcmVkX3N0cmlkZSkKK2dsb2JhbCBzeW0odnA4X3N1YnRyYWN0X21ieV9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfc3VidHJhY3RfbWJ5X21teCk6CisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1CisgICAgcHVzaCByc2kKKyAgICBwdXNoIHJkaQorICAgIDsgZW5kIHByb2xvZworCisgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDApICAgICAgICAgIDtkaWZmCisgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDEpICAgICAgICAgIDtzcmMKKyAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpO3NyY19zdHJpZGUKKyAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoMykgICAgICAgICAgO3ByZWQKKyAgICBwdXNoICAgICAgICByYngKKyAgICBtb3ZzeGQgICAgICByYngsICAgICAgICBkd29yZCBwdHIgYXJnKDQpO3ByZWRfc3RyaWRlCisKKyAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAKKyAgICBtb3YgICAgICAgICByY3gsICAgICAgICAxNgorCisKKy5zdWJtYnlfbG9vcDoKKyAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcnNpXQorICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyYXhdCisKKyAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTEKKyAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMKKworICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tMAorICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgIG1tMAorCisgICAgcHVucGNraGJ3ICAgbW0yLCAgICAgICAgbW0wCisgICAgcHVucGNraGJ3ICAgbW00LCAgICAgICAgbW0wCisKKyAgICBwc3VidyAgICAgICBtbTEsICAgICAgICBtbTMKKyAgICBwc3VidyAgICAgICBtbTIsICAgICAgICBtbTQKKworICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMQorICAgIG1vdnEgICAgICAgIFtyZGkrOF0sICAgIG1tMgorCisgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JzaSs4XQorICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyYXgrOF0KKworICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMQorICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tMworCisgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgbW0wCisgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wCisKKyAgICBwdW5wY2toYncgICBtbTIsICAgICAgICBtbTAKKyAgICBwdW5wY2toYncgICBtbTQsICAgICAgICBtbTAKKworICAgIHBzdWJ3ICAgICAgIG1tMSwgICAgICAgIG1tMworICAgIHBzdWJ3ICAgICAgIG1tMiwgICAgICAgIG1tNAorCisgICAgbW92cSAgICAgICAgW3JkaSsxNl0sICAgbW0xCisgICAgbW92cSAgICAgICAgW3JkaSsyNF0sICAgbW0yCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgMzIKKyAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4K3JieF0KKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JkeF0KKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAuc3VibWJ5X2xvb3AKKworICAgIHBvcCByYngKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCisKKzt2cDhfc3VidHJhY3RfbWJ1dl9tbXgoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnVzcmMsIHVuc2lnbmVkIGNoYXIgKnZzcmMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICp1cHJlZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdnByZWQsIGludCBwcmVkX3N0cmlkZSkKKworZ2xvYmFsIHN5bSh2cDhfc3VidHJhY3RfbWJ1dl9tbXgpIFBSSVZBVEUKK3N5bSh2cDhfc3VidHJhY3RfbWJ1dl9tbXgpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNworICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygwKSAgICAgICAgICA7ZGlmZgorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygxKSAgICAgICAgICA7dXNyYworICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMyk7c3JjX3N0cmlkZTsKKyAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoNCkgICAgICAgICAgO3VwcmVkCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgMjU2KjIgICAgICAgICAgIDtkaWZmID0gZGlmZiArIDI1NiAoc2hvcnRzKQorICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIDgKKyAgICBwdXNoICAgICAgICByYngKKyAgICBtb3ZzeGQgICAgICByYngsICAgICAgICBkd29yZCBwdHIgYXJnKDYpO3ByZWRfc3RyaWRlCisKKyAgICBweG9yICAgICAgICBtbTcsICAgICAgICBtbTcKKworLnN1Ym1idV9sb29wOgorICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIFtyc2ldCisgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JheF0KKyAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBtbTAKKyAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTEKKyAgICBwdW5wY2tsYncgICBtbTAsICAgICAgICBtbTcKKyAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTcKKyAgICBwdW5wY2toYncgICBtbTMsICAgICAgICBtbTcKKyAgICBwdW5wY2toYncgICBtbTQsICAgICAgICBtbTcKKyAgICBwc3VidyAgICAgICBtbTAsICAgICAgICBtbTEKKyAgICBwc3VidyAgICAgICBtbTMsICAgICAgICBtbTQKKyAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICBtbTAKKyAgICBtb3ZxICAgICAgICBbcmRpKzhdLCAgICBtbTMKKyAgICBhZGQgICAgICAgICByZGksIDE2CisgICAgYWRkICAgICAgICAgcnNpLCByZHgKKyAgICBhZGQgICAgICAgICByYXgsIHJieAorCisgICAgZGVjICAgICAgICAgcmN4CisgICAgam56ICAgICAgICAgLnN1Ym1idV9sb29wCisKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMikgICAgICAgICAgO3ZzcmMKKyAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoNSkgICAgICAgICAgO3ZwcmVkCisgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgOAorCisuc3VibWJ2X2xvb3A6CisgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzaV0KKyAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmF4XQorICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tMAorICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tMQorICAgIHB1bnBja2xidyAgIG1tMCwgICAgICAgIG1tNworICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tNworICAgIHB1bnBja2hidyAgIG1tMywgICAgICAgIG1tNworICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tNworICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgIG1tMQorICAgIHBzdWJ3ICAgICAgIG1tMywgICAgICAgIG1tNAorICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMAorICAgIG1vdnEgICAgICAgIFtyZGkrOF0sICAgIG1tMworICAgIGFkZCAgICAgICAgIHJkaSwgMTYKKyAgICBhZGQgICAgICAgICByc2ksIHJkeAorICAgIGFkZCAgICAgICAgIHJheCwgcmJ4CisKKyAgICBkZWMgICAgICAgICByY3gKKyAgICBqbnogICAgICAgICAuc3VibWJ2X2xvb3AKKworICAgIHBvcCAgICAgICAgIHJieAorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBVTlNIQURPV19BUkdTCisgICAgcG9wICAgICAgICAgcmJwCisgICAgcmV0CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3N1YnRyYWN0X3NzZTIuYXNtIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9zdWJ0cmFjdF9zc2UyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQxN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni9zdWJ0cmFjdF9zc2UyLmFzbQpAQCAtMCwwICsxLDI0NSBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7dm9pZCB2cDhfc3VidHJhY3RfYl9zc2UyX2ltcGwodW5zaWduZWQgY2hhciAqeiwgIGludCBzcmNfc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqUHJlZGljdG9yLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpOworZ2xvYmFsIHN5bSh2cDhfc3VidHJhY3RfYl9zc2UyX2ltcGwpIFBSSVZBVEUKK3N5bSh2cDhfc3VidHJhY3RfYl9zc2UyX2ltcGwpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgICAgICBtb3YgICAgIHJkaSwgICAgICAgIGFyZygyKSA7ZGlmZgorICAgICAgICBtb3YgICAgIHJheCwgICAgICAgIGFyZygzKSA7UHJlZGljdG9yCisgICAgICAgIG1vdiAgICAgcnNpLCAgICAgICAgYXJnKDApIDt6CisgICAgICAgIG1vdnN4ZCAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKTtzcmNfc3RyaWRlOworICAgICAgICBtb3ZzeGQgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNCk7cGl0Y2gKKyAgICAgICAgcHhvciAgICBtbTcsICAgICAgICBtbTcKKworICAgICAgICBtb3ZkICAgIG1tMCwgICAgICAgIFtyc2ldCisgICAgICAgIG1vdmQgICAgbW0xLCAgICAgICAgW3JheF0KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKKyAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKKyAgICAgICAgbW92cSAgICBNTVdPUkQgUFRSIFtyZGldLCAgICAgIG1tMAorCisgICAgICAgIG1vdmQgICAgbW0wLCAgICAgICAgW3JzaStyZHhdCisgICAgICAgIG1vdmQgICAgbW0xLCAgICAgICAgW3JheCtyY3hdCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03CisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03CisgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgTU1XT1JEIFBUUiBbcmRpK3JjeCoyXSwgbW0wCisKKyAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpK3JkeCoyXQorICAgICAgICBtb3ZkICAgIG1tMSwgICAgICAgIFtyYXgrcmN4KjJdCisgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03CisgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03CisgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCisgICAgICAgIG1vdnEgICAgTU1XT1JEIFBUUiBbcmRpK3JjeCo0XSwgbW0wCisKKyAgICAgICAgbGVhICAgICByc2ksICAgICAgICBbcnNpK3JkeCoyXQorICAgICAgICBsZWEgICAgIHJjeCwgICAgICAgIFtyY3grcmN4KjJdCisKKyAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpK3JkeF0KKyAgICAgICAgbW92ZCAgICBtbTEsICAgICAgICBbcmF4K3JjeF0KKyAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKKyAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKKyAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKKyAgICAgICAgbW92cSAgICBNTVdPUkQgUFRSIFtyZGkrcmN4KjJdLCBtbTAKKworICAgIDsgYmVnaW4gZXBpbG9nCisgICAgcG9wIHJkaQorICAgIHBvcCByc2kKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworCis7dm9pZCB2cDhfc3VidHJhY3RfbWJ5X3NzZTIoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zdHJpZGUsCis7dW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHByZWRfc3RyaWRlKQorZ2xvYmFsIHN5bSh2cDhfc3VidHJhY3RfbWJ5X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfc3VidHJhY3RfbWJ5X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQorICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygwKSAgICAgICAgICA7ZGlmZgorICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygxKSAgICAgICAgICA7c3JjCisgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKTtzcmNfc3RyaWRlCisgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgYXJnKDMpICAgICAgICAgIDtwcmVkCisgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgW0dMT0JBTCh0ODApXQorICAgIHB1c2ggICAgICAgIHJieAorICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIDggICAgICAgICAgICAgICA7IGRvIHR3byBsaW5lcyBhdCBvbmUgdGltZQorICAgIG1vdnN4ZCAgICAgIHJieCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNCk7cHJlZF9zdHJpZGUKKworLnN1Ym1ieV9sb29wOgorICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIFtyc2ldICAgICAgICAgICA7IHNyYworICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyYXhdICAgICAgICAgICA7IHByZWQKKworICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICBwc3ViYiAgICAgICB4bW0wLCAgICAgICB4bW0xCisKKyAgICBweG9yICAgICAgICB4bW0xLCAgICAgICB4bW00ICAgICAgICAgICAgO2NvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgIHhtbTQKKyAgICBwY21wZ3RiICAgICB4bW0xLCAgICAgICB4bW0yICAgICAgICAgICAgOyBvYnRhaW4gc2lnbiBpbmZvcm1hdGlvbgorCisgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMAorICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgIHhtbTEgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KKyAgICBwdW5wY2toYncgICB4bW0yLCAgICAgICB4bW0xICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCisKKyAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBbcnNpICsgcmR4XQorICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIFtyYXggKyByYnhdCisKKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JkeCoyXQorICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyYXgrcmJ4KjJdCisKKyAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW0wCisgICAgbW92ZHFhICAgICAgW3JkaSArMTZdLCAgeG1tMgorCisgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMworICAgIHBzdWJiICAgICAgIHhtbTMsICAgICAgIHhtbTUKKworICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgIHhtbTQgICAgICAgICAgICA7Y29udmVydCB0byBzaWduZWQgdmFsdWVzCisgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgeG1tNAorICAgIHBjbXBndGIgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICA7IG9idGFpbiBzaWduIGluZm9ybWF0aW9uCisKKyAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0zCisgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgorICAgIHB1bnBja2hidyAgIHhtbTEsICAgICAgIHhtbTUgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KKworICAgIG1vdmRxYSAgICAgIFtyZGkgKzMyXSwgIHhtbTMKKyAgICBtb3ZkcWEgICAgICBbcmRpICs0OF0sICB4bW0xCisKKyAgICBhZGQgICAgICAgICByZGksICAgICAgICA2NAorICAgIGRlYyAgICAgICAgIHJjeAorICAgIGpueiAgICAgICAgIC5zdWJtYnlfbG9vcAorCisgICAgcG9wIHJieAorICAgIHBvcCByZGkKKyAgICBwb3AgcnNpCisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBSRVNUT1JFX0dPVAorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworO3ZwOF9zdWJ0cmFjdF9tYnV2X3NzZTIoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnVzcmMsIHVuc2lnbmVkIGNoYXIgKnZzcmMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICp1cHJlZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdnByZWQsIGludCBwcmVkX3N0cmlkZSkKK2dsb2JhbCBzeW0odnA4X3N1YnRyYWN0X21idXZfc3NlMikgUFJJVkFURQorc3ltKHZwOF9zdWJ0cmFjdF9tYnV2X3NzZTIpOgorICAgIHB1c2ggICAgICAgIHJicAorICAgIG1vdiAgICAgICAgIHJicCwgcnNwCisgICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggcnNpCisgICAgcHVzaCByZGkKKyAgICA7IGVuZCBwcm9sb2cKKworICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwodDgwKV0KKyAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMCkgICAgICAgICAgO2RpZmYKKyAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMSkgICAgICAgICAgO3VzcmMKKyAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpO3NyY19zdHJpZGU7CisgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgYXJnKDQpICAgICAgICAgIDt1cHJlZAorICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIDI1NioyICAgICAgICAgICA7ZGlmZiA9IGRpZmYgKyAyNTYgKHNob3J0cykKKyAgICBtb3YgICAgICAgICByY3gsICAgICAgICA0CisgICAgcHVzaCAgICAgICAgcmJ4CisgICAgbW92c3hkICAgICAgcmJ4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg2KTtwcmVkX3N0cmlkZQorCisgICAgO3UKKy5zdWJtYnVfbG9vcDoKKyAgICBtb3ZxICAgICAgICB4bW0wLCAgICAgICBbcnNpXSAgICAgICAgICAgOyBzcmMKKyAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICBbcnNpK3JkeF0gICAgICAgOyBzcmMgLS0gbmV4dCBsaW5lCisgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgW3JheF0gICAgICAgICAgIDsgcHJlZAorICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIFtyYXgrcmJ4XSAgICAgICA7IHByZWQgLS0gbmV4dCBsaW5lCisgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJkeCoyXQorICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyYXggKyByYngqMl0KKworICAgIHB1bnBja2xxZHEgIHhtbTAsICAgICAgIHhtbTIKKyAgICBwdW5wY2tscWRxICB4bW0xLCAgICAgICB4bW0zCisKKyAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0wCisgICAgcHN1YmIgICAgICAgeG1tMCwgICAgICAgeG1tMSAgICAgICAgICAgIDsgc3VidHJhY3Rpb24gd2l0aCBzaWduIG1pc3NlZAorCisgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgICAgIDtjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgICBweG9yICAgICAgICB4bW0yLCAgICAgICB4bW00CisgICAgcGNtcGd0YiAgICAgeG1tMSwgICAgICAgeG1tMiAgICAgICAgICAgIDsgb2J0YWluIHNpZ24gaW5mb3JtYXRpb24KKworICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICB4bW0xCisgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgeG1tMSAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgorICAgIHB1bnBja2hidyAgIHhtbTIsICAgICAgIHhtbTMgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KKworICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgIHhtbTAgICAgICAgICAgICA7IHN0b3JlIGRpZmZlcmVuY2UKKyAgICBtb3ZkcWEgICAgICBbcmRpICsxNl0sICB4bW0yICAgICAgICAgICAgOyBzdG9yZSBkaWZmZXJlbmNlCisgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgMzIKKyAgICBzdWIgICAgICAgICByY3gsIDEKKyAgICBqbnogICAgICAgICAuc3VibWJ1X2xvb3AKKworICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygyKSAgICAgICAgICA7dnNyYworICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZyg1KSAgICAgICAgICA7dnByZWQKKyAgICBtb3YgICAgICAgICByY3gsICAgICAgICA0CisKKyAgICA7dgorLnN1Ym1idl9sb29wOgorICAgIG1vdnEgICAgICAgIHhtbTAsICAgICAgIFtyc2ldICAgICAgICAgICA7IHNyYworICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIFtyc2krcmR4XSAgICAgICA7IHNyYyAtLSBuZXh0IGxpbmUKKyAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBbcmF4XSAgICAgICAgICAgOyBwcmVkCisgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgW3JheCtyYnhdICAgICAgIDsgcHJlZCAtLSBuZXh0IGxpbmUKKyAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmR4KjJdCisgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JheCArIHJieCoyXQorCisgICAgcHVucGNrbHFkcSAgeG1tMCwgICAgICAgeG1tMgorICAgIHB1bnBja2xxZHEgIHhtbTEsICAgICAgIHhtbTMKKworICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAKKyAgICBwc3ViYiAgICAgICB4bW0wLCAgICAgICB4bW0xICAgICAgICAgICAgOyBzdWJ0cmFjdGlvbiB3aXRoIHNpZ24gbWlzc2VkCisKKyAgICBweG9yICAgICAgICB4bW0xLCAgICAgICB4bW00ICAgICAgICAgICAgO2NvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgIHhtbTQKKyAgICBwY21wZ3RiICAgICB4bW0xLCAgICAgICB4bW0yICAgICAgICAgICAgOyBvYnRhaW4gc2lnbiBpbmZvcm1hdGlvbgorCisgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMAorICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTEKKyAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICB4bW0xICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCisgICAgcHVucGNraGJ3ICAgeG1tMiwgICAgICAgeG1tMyAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgorCisgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMCAgICAgICAgICAgIDsgc3RvcmUgZGlmZmVyZW5jZQorICAgIG1vdmRxYSAgICAgIFtyZGkgKzE2XSwgIHhtbTIgICAgICAgICAgICA7IHN0b3JlIGRpZmZlcmVuY2UKKyAgICBhZGQgICAgICAgICByZGksICAgICAgICAzMgorICAgIHN1YiAgICAgICAgIHJjeCwgMQorICAgIGpueiAgICAgICAgIC5zdWJtYnZfbG9vcAorCisgICAgcG9wICAgICAgICAgcmJ4CisgICAgOyBiZWdpbiBlcGlsb2cKKyAgICBwb3AgcmRpCisgICAgcG9wIHJzaQorICAgIFJFU1RPUkVfR09UCisgICAgVU5TSEFET1dfQVJHUworICAgIHBvcCAgICAgICAgIHJicAorICAgIHJldAorCitTRUNUSU9OX1JPREFUQQorYWxpZ24gMTYKK3Q4MDoKKyAgICB0aW1lcyAxNiBkYiAweDgwCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyLmFzbSBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvdGVtcG9yYWxfZmlsdGVyX2FwcGx5X3NzZTIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWQ5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyLmFzbQpAQCAtMCwwICsxLDIwNyBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCis7IHZvaWQgdnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyIHwgYXJnCis7ICAodW5zaWduZWQgY2hhciAgKmZyYW1lMSwgICAgICAgICAgIHwgIDAKKzsgICB1bnNpZ25lZCBpbnQgICAgc3RyaWRlLCAgICAgICAgICAgfCAgMQorOyAgIHVuc2lnbmVkIGNoYXIgICpmcmFtZTIsICAgICAgICAgICB8ICAyCis7ICAgdW5zaWduZWQgaW50ICAgIGJsb2NrX3NpemUsICAgICAgIHwgIDMKKzsgICBpbnQgICAgICAgICAgICAgc3RyZW5ndGgsICAgICAgICAgfCAgNAorOyAgIGludCAgICAgICAgICAgICBmaWx0ZXJfd2VpZ2h0LCAgICB8ICA1Cis7ICAgdW5zaWduZWQgaW50ICAgKmFjY3VtdWxhdG9yLCAgICAgIHwgIDYKKzsgICB1bnNpZ25lZCBzaG9ydCAqY291bnQpICAgICAgICAgICAgfCAgNworZ2xvYmFsIHN5bSh2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5X3NzZTIpIFBSSVZBVEUKK3N5bSh2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5X3NzZTIpOgorCisgICAgcHVzaCAgICAgICAgcmJwCisgICAgbW92ICAgICAgICAgcmJwLCByc3AKKyAgICBTSEFET1dfQVJHU19UT19TVEFDSyA4CisgICAgU0FWRV9YTU0gNworICAgIEdFVF9HT1QgICAgIHJieAorICAgIHB1c2ggICAgICAgIHJzaQorICAgIHB1c2ggICAgICAgIHJkaQorICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKKyAgICAlZGVmaW5lIGJsb2NrX3NpemUgICAgMAorICAgICVkZWZpbmUgc3RyZW5ndGggICAgICAxNgorICAgICVkZWZpbmUgZmlsdGVyX3dlaWdodCAzMgorICAgICVkZWZpbmUgcm91bmRpbmdfYml0ICA0OAorICAgICVkZWZpbmUgcmJwX2JhY2t1cCAgICA2NAorICAgICVkZWZpbmUgc3RhY2tfc2l6ZSAgICA4MAorICAgIHN1YiAgICAgICAgIHJzcCwgICAgICAgICAgIHN0YWNrX3NpemUKKyAgICBtb3YgICAgICAgICBbcnNwICsgcmJwX2JhY2t1cF0sIHJicAorICAgIDsgZW5kIHByb2xvZworCisgICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoMykKKyAgICAgICAgbW92ICAgICAgICAgW3JzcCArIGJsb2NrX3NpemVdLCByZHgKKyAgICAgICAgbW92ZCAgICAgICAgeG1tNiwgICAgICAgICAgICBhcmcoNCkKKyAgICAgICAgbW92ZHFhICAgICAgW3JzcCArIHN0cmVuZ3RoXSwgeG1tNiA7IHdoZXJlIHN0cmVuZ3RoIGlzIHVzZWQsIGFsbCAxNiBieXRlcyBhcmUgcmVhZAorCisgICAgICAgIDsgY2FsY3VsYXRlIHRoZSByb3VuZGluZyBiaXQgb3V0c2lkZSB0aGUgbG9vcAorICAgICAgICA7IDB4ODAwMCA+PiAoMTYgLSBzdHJlbmd0aCkKKyAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgIDE2CisgICAgICAgIHN1YiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoNCkgOyAxNiAtIHN0cmVuZ3RoCisgICAgICAgIG1vdmQgICAgICAgIHhtbTQsICAgICAgICAgICByZHggICAgOyBjYW4ndCB1c2UgcmR4IHcvIHNoaWZ0CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKF9jb25zdF90b3BfYml0KV0KKyAgICAgICAgcHNybHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgW3JzcCArIHJvdW5kaW5nX2JpdF0sIHhtbTUKKworICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDsgc3JjL2ZyYW1lMQorICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDIpIDsgcHJlZGljdG9yIGZyYW1lCisgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNikgOyBhY2N1bXVsYXRvcgorICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDcpIDsgY291bnQKKworICAgICAgICA7IGR1cCB0aGUgZmlsdGVyIHdlaWdodCBhbmQgc3RvcmUgZm9yIGxhdGVyCisgICAgICAgIG1vdmQgICAgICAgIHhtbTAsICAgICAgICAgICBhcmcoNSkgOyBmaWx0ZXJfd2VpZ2h0CisgICAgICAgIHBzaHVmbHcgICAgIHhtbTAsICAgICAgICAgICB4bW0wLCAwCisgICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICB4bW0wCisgICAgICAgIG1vdmRxYSAgICAgIFtyc3AgKyBmaWx0ZXJfd2VpZ2h0XSwgeG1tMAorCisgICAgICAgIG1vdiAgICAgICAgIHJicCwgICAgICAgICAgICBhcmcoMSkgOyBzdHJpZGUKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICA7IHplcm8gZm9yIGV4dHJhY3Rpb24KKworICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICAgICAgW3JkeCArIDE2KjE2KjFdCisgICAgICAgIGNtcCAgICAgICAgIGR3b3JkIHB0ciBbcnNwICsgYmxvY2tfc2l6ZV0sIDgKKyAgICAgICAgam5lICAgICAgICAgLnRlbXBvcmFsX2ZpbHRlcl9hcHBseV9sb2FkXzE2CisgICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgICAgICBbcmR4ICsgOCo4KjFdCisKKy50ZW1wb3JhbF9maWx0ZXJfYXBwbHlfbG9hZF84OgorICAgICAgICBtb3ZxICAgICAgICB4bW0wLCAgICAgICAgICAgW3JzaV0gIDsgZmlyc3Qgcm93CisgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmJwXSA7ICs9IHN0cmlkZQorICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgeG1tNyAgIDsgc3JjWyAwLSA3XQorICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgW3JzaV0gIDsgc2Vjb25kIHJvdworICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJicF0gOyArPSBzdHJpZGUKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgICAgIHhtbTcgICA7IHNyY1sgOC0xNV0KKyAgICAgICAgam1wICAgICAgICAgLnRlbXBvcmFsX2ZpbHRlcl9hcHBseV9sb2FkX2ZpbmlzaGVkCisKKy50ZW1wb3JhbF9maWx0ZXJfYXBwbHlfbG9hZF8xNjoKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgIFtyc2ldICA7IHNyYyAoZnJhbWUxKQorICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJicF0gOyArPSBzdHJpZGUKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgIHhtbTcgICA7IHNyY1sgMC0gN10KKyAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgICAgICAgICAgIHhtbTcgICA7IHNyY1sgOC0xNV0KKworLnRlbXBvcmFsX2ZpbHRlcl9hcHBseV9sb2FkX2ZpbmlzaGVkOgorICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgW3JkeF0gIDsgcHJlZGljdG9yIChmcmFtZTIpCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICB4bW0yCisgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICB4bW03ICAgOyBwcmVkWyAwLSA3XQorICAgICAgICBwdW5wY2toYncgICB4bW0zLCAgICAgICAgICAgeG1tNyAgIDsgcHJlZFsgOC0xNV0KKworICAgICAgICA7IG1vZGlmaWVyID0gc3JjX2J5dGUgLSBwaXhlbF92YWx1ZQorICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMiAgIDsgc3JjIC0gcHJlZFsgMC0gN10KKyAgICAgICAgcHN1YncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICA7IHNyYyAtIHByZWRbIDgtMTVdCisKKyAgICAgICAgOyBtb2RpZmllciAqPSBtb2RpZmllcgorICAgICAgICBwbXVsbHcgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgIDsgbW9kaWZlclsgMC0gN11eMgorICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICAgICAgeG1tMSAgIDsgbW9kaWZlclsgOC0xNV1eMgorCisgICAgICAgIDsgbW9kaWZpZXIgKj0gMworICAgICAgICBwbXVsbHcgICAgICB4bW0wLCAgICAgICAgICAgW0dMT0JBTChfY29uc3RfM3cpXQorICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICAgICAgW0dMT0JBTChfY29uc3RfM3cpXQorCisgICAgICAgIDsgbW9kaWZlciArPSAweDgwMDAgPj4gKDE2IC0gc3RyZW5ndGgpCisgICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICBbcnNwICsgcm91bmRpbmdfYml0XQorICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICAgICAgW3JzcCArIHJvdW5kaW5nX2JpdF0KKworICAgICAgICA7IG1vZGlmaWVyID4+PSBzdHJlbmd0aAorICAgICAgICBwc3JsdyAgICAgICB4bW0wLCAgICAgICAgICAgW3JzcCArIHN0cmVuZ3RoXQorICAgICAgICBwc3JsdyAgICAgICB4bW0xLCAgICAgICAgICAgW3JzcCArIHN0cmVuZ3RoXQorCisgICAgICAgIDsgbW9kaWZpZXIgPSAxNiAtIG1vZGlmaWVyCisgICAgICAgIDsgc2F0dXJhdGlvbiB0YWtlcyBjYXJlIG9mIG1vZGlmaWVyID4gMTYKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgIFtHTE9CQUwoX2NvbnN0XzE2dyldCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICBbR0xPQkFMKF9jb25zdF8xNncpXQorICAgICAgICBwc3VidXN3ICAgICB4bW0zLCAgICAgICAgICAgeG1tMQorICAgICAgICBwc3VidXN3ICAgICB4bW0yLCAgICAgICAgICAgeG1tMAorCisgICAgICAgIDsgbW9kaWZpZXIgKj0gZmlsdGVyX3dlaWdodAorICAgICAgICBwbXVsbHcgICAgICB4bW0yLCAgICAgICAgICAgW3JzcCArIGZpbHRlcl93ZWlnaHRdCisgICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgICAgICBbcnNwICsgZmlsdGVyX3dlaWdodF0KKworICAgICAgICA7IGNvdW50CisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICBbcmF4XQorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgW3JheCsxNl0KKyAgICAgICAgOyArPSBtb2RpZmllcgorICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgeG1tMgorICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMworICAgICAgICA7IHdyaXRlIGJhY2sKKyAgICAgICAgbW92ZHFhICAgICAgW3JheF0sICAgICAgICAgIHhtbTQKKyAgICAgICAgbW92ZHFhICAgICAgW3JheCsxNl0sICAgICAgIHhtbTUKKyAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgICAgIFtyYXggKyAxNioyXSA7IGNvdW50ICs9IDE2KihzaXplb2Yoc2hvcnQpKQorCisgICAgICAgIDsgbG9hZCBhbmQgZXh0cmFjdCB0aGUgcHJlZGljdG9yIHVwIHRvIHNob3J0cworICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNworICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgW3JkeF0KKyAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgICAgIFtyZHggKyAxNioxXSA7IHByZWQgKz0gMTYqKHNpemVvZihjaGFyKSkKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgIHhtbTcgICA7IHByZWRbIDAtIDddCisgICAgICAgIHB1bnBja2hidyAgIHhtbTEsICAgICAgICAgICB4bW03ICAgOyBwcmVkWyA4LTE1XQorCisgICAgICAgIDsgbW9kaWZpZXIgKj0gcGl4ZWxfdmFsdWUKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIKKyAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMKKworICAgICAgICA7IGV4cGFuZCB0byBkb3VibGUgd29yZHMKKyAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIHhtbTAKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgICAgIHhtbTcgICA7IFsgMC0gM10KKyAgICAgICAgcHVucGNraHdkICAgeG1tMiwgICAgICAgICAgIHhtbTcgICA7IFsgNC0gN10KKyAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgIHhtbTEKKyAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgICAgIHhtbTcgICA7IFsgOC0xMV0KKyAgICAgICAgcHVucGNraHdkICAgeG1tMywgICAgICAgICAgIHhtbTcgICA7IFsxMi0xNV0KKworICAgICAgICA7IGFjY3VtdWxhdG9yCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICBbcmRpXQorICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgW3JkaSsxNl0KKyAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgIFtyZGkrMzJdCisgICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICBbcmRpKzQ4XQorICAgICAgICA7ICs9IG1vZGlmaWVyCisgICAgICAgIHBhZGRkICAgICAgIHhtbTQsICAgICAgICAgICB4bW0wCisgICAgICAgIHBhZGRkICAgICAgIHhtbTUsICAgICAgICAgICB4bW0yCisgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xCisgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgICAgICAgICB4bW0zCisgICAgICAgIDsgd3JpdGUgYmFjaworICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICAgICAgeG1tNAorICAgICAgICBtb3ZkcWEgICAgICBbcmRpKzE2XSwgICAgICAgeG1tNQorICAgICAgICBtb3ZkcWEgICAgICBbcmRpKzMyXSwgICAgICAgeG1tNgorICAgICAgICBtb3ZkcWEgICAgICBbcmRpKzQ4XSwgICAgICAgeG1tNworICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIDE2KjRdIDsgYWNjdW11bGF0b3IgKz0gMTYqKHNpemVvZihpbnQpKQorCisgICAgICAgIGNtcCAgICAgICAgIHJkeCwgICAgICAgICAgICByY3gKKyAgICAgICAgamUgICAgICAgICAgLnRlbXBvcmFsX2ZpbHRlcl9hcHBseV9lcGlsb2cKKyAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICA7IHplcm8gZm9yIGV4dHJhY3Rpb24KKyAgICAgICAgY21wICAgICAgICAgZHdvcmQgcHRyIFtyc3AgKyBibG9ja19zaXplXSwgMTYKKyAgICAgICAgamUgICAgICAgICAgLnRlbXBvcmFsX2ZpbHRlcl9hcHBseV9sb2FkXzE2CisgICAgICAgIGptcCAgICAgICAgIC50ZW1wb3JhbF9maWx0ZXJfYXBwbHlfbG9hZF84CisKKy50ZW1wb3JhbF9maWx0ZXJfYXBwbHlfZXBpbG9nOgorICAgIDsgYmVnaW4gZXBpbG9nCisgICAgbW92ICAgICAgICAgcmJwLCAgICAgICAgICAgIFtyc3AgKyByYnBfYmFja3VwXQorICAgIGFkZCAgICAgICAgIHJzcCwgICAgICAgICAgICBzdGFja19zaXplCisgICAgcG9wICAgICAgICAgcnNwCisgICAgcG9wICAgICAgICAgcmRpCisgICAgcG9wICAgICAgICAgcnNpCisgICAgUkVTVE9SRV9HT1QKKyAgICBSRVNUT1JFX1hNTQorICAgIFVOU0hBRE9XX0FSR1MKKyAgICBwb3AgICAgICAgICByYnAKKyAgICByZXQKKworU0VDVElPTl9ST0RBVEEKK2FsaWduIDE2CitfY29uc3RfM3c6CisgICAgdGltZXMgOCBkdyAzCithbGlnbiAxNgorX2NvbnN0X3RvcF9iaXQ6CisgICAgdGltZXMgOCBkdyAxPDwxNQorYWxpZ24gMTYKK19jb25zdF8xNncKKyAgICB0aW1lcyA4IGR3IDE2CmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3ZwOF9lbmNfc3R1YnNfbW14LmMgYi9saWJ2cHgvdnA4L2VuY29kZXIveDg2L3ZwOF9lbmNfc3R1YnNfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyNWY1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvdnA4X2VuY19zdHVic19tbXguYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfcnRjZC5oIgorI2luY2x1ZGUgInZweF9wb3J0cy94ODYuaCIKKyNpbmNsdWRlICJ2cDgvZW5jb2Rlci9ibG9jay5oIgorCit2b2lkIHZwOF9zaG9ydF9mZGN0NHg0X21teChzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Cit2b2lkIHZwOF9zaG9ydF9mZGN0OHg0X21teChzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKK3sKKyAgICB2cDhfc2hvcnRfZmRjdDR4NF9tbXgoaW5wdXQsICAgb3V0cHV0LCAgICBwaXRjaCk7CisgICAgdnA4X3Nob3J0X2ZkY3Q0eDRfbW14KGlucHV0ICsgNCwgb3V0cHV0ICsgMTYsIHBpdGNoKTsKK30KKworaW50IHZwOF9mYXN0X3F1YW50aXplX2JfaW1wbF9tbXgoc2hvcnQgKmNvZWZmX3B0ciwgc2hvcnQgKnpiaW5fcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnFjb2VmZl9wdHIsIHNob3J0ICpkZXF1YW50X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpzY2FuX21hc2ssIHNob3J0ICpyb3VuZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcXVhbnRfcHRyLCBzaG9ydCAqZHFjb2VmZl9wdHIpOwordm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX21teChCTE9DSyAqYiwgQkxPQ0tEICpkKQoreworICAgIGNvbnN0IHNob3J0ICpzY2FuX21hc2sgICA9IHZwOF9kZWZhdWx0X3ppZ196YWdfbWFzazsKKyAgICBzaG9ydCAqY29lZmZfcHRyICAgPSBiLT5jb2VmZjsKKyAgICBzaG9ydCAqemJpbl9wdHIgICAgPSBiLT56YmluOworICAgIHNob3J0ICpyb3VuZF9wdHIgICA9IGItPnJvdW5kOworICAgIHNob3J0ICpxdWFudF9wdHIgICA9IGItPnF1YW50X2Zhc3Q7CisgICAgc2hvcnQgKnFjb2VmZl9wdHIgID0gZC0+cWNvZWZmOworICAgIHNob3J0ICpkcWNvZWZmX3B0ciA9IGQtPmRxY29lZmY7CisgICAgc2hvcnQgKmRlcXVhbnRfcHRyID0gZC0+ZGVxdWFudDsKKworICAgICpkLT5lb2IgPSAoY2hhcil2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfbW14KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YmluX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY29lZmZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVhbnRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fbWFzaywKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHFjb2VmZl9wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworfQorCitpbnQgdnA4X21iYmxvY2tfZXJyb3JfbW14X2ltcGwoc2hvcnQgKmNvZWZmX3B0ciwgc2hvcnQgKmRjb2VmX3B0ciwgaW50IGRjKTsKK2ludCB2cDhfbWJibG9ja19lcnJvcl9tbXgoTUFDUk9CTE9DSyAqbWIsIGludCBkYykKK3sKKyAgICBzaG9ydCAqY29lZmZfcHRyID0gIG1iLT5ibG9ja1swXS5jb2VmZjsKKyAgICBzaG9ydCAqZGNvZWZfcHRyID0gIG1iLT5lX21iZC5ibG9ja1swXS5kcWNvZWZmOworICAgIHJldHVybiB2cDhfbWJibG9ja19lcnJvcl9tbXhfaW1wbChjb2VmZl9wdHIsIGRjb2VmX3B0ciwgZGMpOworfQorCitpbnQgdnA4X21idXZlcnJvcl9tbXhfaW1wbChzaG9ydCAqc19wdHIsIHNob3J0ICpkX3B0cik7CitpbnQgdnA4X21idXZlcnJvcl9tbXgoTUFDUk9CTE9DSyAqbWIpCit7CisgICAgc2hvcnQgKnNfcHRyID0gJm1iLT5jb2VmZlsyNTZdOworICAgIHNob3J0ICpkX3B0ciA9ICZtYi0+ZV9tYmQuZHFjb2VmZlsyNTZdOworICAgIHJldHVybiB2cDhfbWJ1dmVycm9yX21teF9pbXBsKHNfcHRyLCBkX3B0cik7Cit9CisKK3ZvaWQgdnA4X3N1YnRyYWN0X2JfbW14X2ltcGwodW5zaWduZWQgY2hhciAqeiwgIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpOwordm9pZCB2cDhfc3VidHJhY3RfYl9tbXgoQkxPQ0sgKmJlLCBCTE9DS0QgKmJkLCBpbnQgcGl0Y2gpCit7CisgICAgdW5zaWduZWQgY2hhciAqeiA9ICooYmUtPmJhc2Vfc3JjKSArIGJlLT5zcmM7CisgICAgdW5zaWduZWQgaW50ICBzcmNfc3RyaWRlID0gYmUtPnNyY19zdHJpZGU7CisgICAgc2hvcnQgKmRpZmYgPSAmYmUtPnNyY19kaWZmWzBdOworICAgIHVuc2lnbmVkIGNoYXIgKnByZWRpY3RvciA9ICZiZC0+cHJlZGljdG9yWzBdOworICAgIHZwOF9zdWJ0cmFjdF9iX21teF9pbXBsKHosIHNyY19zdHJpZGUsIGRpZmYsIHByZWRpY3RvciwgcGl0Y2gpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC9lbmNvZGVyL3g4Ni92cDhfZW5jX3N0dWJzX3NzZTIuYyBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvdnA4X2VuY19zdHVic19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkYjgxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvZW5jb2Rlci94ODYvdnA4X2VuY19zdHVic19zc2UyLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMveDg2LmgiCisjaW5jbHVkZSAidnA4L2VuY29kZXIvYmxvY2suaCIKKworaW50IHZwOF9tYmJsb2NrX2Vycm9yX3htbV9pbXBsKHNob3J0ICpjb2VmZl9wdHIsIHNob3J0ICpkY29lZl9wdHIsIGludCBkYyk7CitpbnQgdnA4X21iYmxvY2tfZXJyb3JfeG1tKE1BQ1JPQkxPQ0sgKm1iLCBpbnQgZGMpCit7CisgICAgc2hvcnQgKmNvZWZmX3B0ciA9ICBtYi0+YmxvY2tbMF0uY29lZmY7CisgICAgc2hvcnQgKmRjb2VmX3B0ciA9ICBtYi0+ZV9tYmQuYmxvY2tbMF0uZHFjb2VmZjsKKyAgICByZXR1cm4gdnA4X21iYmxvY2tfZXJyb3JfeG1tX2ltcGwoY29lZmZfcHRyLCBkY29lZl9wdHIsIGRjKTsKK30KKworaW50IHZwOF9tYnV2ZXJyb3JfeG1tX2ltcGwoc2hvcnQgKnNfcHRyLCBzaG9ydCAqZF9wdHIpOworaW50IHZwOF9tYnV2ZXJyb3JfeG1tKE1BQ1JPQkxPQ0sgKm1iKQoreworICAgIHNob3J0ICpzX3B0ciA9ICZtYi0+Y29lZmZbMjU2XTsKKyAgICBzaG9ydCAqZF9wdHIgPSAmbWItPmVfbWJkLmRxY29lZmZbMjU2XTsKKyAgICByZXR1cm4gdnA4X21idXZlcnJvcl94bW1faW1wbChzX3B0ciwgZF9wdHIpOworfQorCit2b2lkIHZwOF9zdWJ0cmFjdF9iX3NzZTJfaW1wbCh1bnNpZ25lZCBjaGFyICp6LCAgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCk7Cit2b2lkIHZwOF9zdWJ0cmFjdF9iX3NzZTIoQkxPQ0sgKmJlLCBCTE9DS0QgKmJkLCBpbnQgcGl0Y2gpCit7CisgICAgdW5zaWduZWQgY2hhciAqeiA9ICooYmUtPmJhc2Vfc3JjKSArIGJlLT5zcmM7CisgICAgdW5zaWduZWQgaW50ICBzcmNfc3RyaWRlID0gYmUtPnNyY19zdHJpZGU7CisgICAgc2hvcnQgKmRpZmYgPSAmYmUtPnNyY19kaWZmWzBdOworICAgIHVuc2lnbmVkIGNoYXIgKnByZWRpY3RvciA9ICZiZC0+cHJlZGljdG9yWzBdOworICAgIHZwOF9zdWJ0cmFjdF9iX3NzZTJfaW1wbCh6LCBzcmNfc3RyaWRlLCBkaWZmLCBwcmVkaWN0b3IsIHBpdGNoKTsKK30KZGlmZiAtLWdpdCBhL3ZwOC9leHBvcnRzX2RlYyBiL2xpYnZweC92cDgvZXhwb3J0c19kZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZwOC9leHBvcnRzX2RlYwpyZW5hbWUgdG8gbGlidnB4L3ZwOC9leHBvcnRzX2RlYwpkaWZmIC0tZ2l0IGEvdnA4L2V4cG9ydHNfZW5jIGIvbGlidnB4L3ZwOC9leHBvcnRzX2VuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnA4L2V4cG9ydHNfZW5jCnJlbmFtZSB0byBsaWJ2cHgvdnA4L2V4cG9ydHNfZW5jCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L3ZwOF9jb21tb24ubWsgYi9saWJ2cHgvdnA4L3ZwOF9jb21tb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyOGY0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvdnA4X2NvbW1vbi5tawpAQCAtMCwwICsxLDE5MyBAQAorIyMKKyMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMKKyMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisjIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisjIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMjCisKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gdnA4X2NvbW1vbi5taworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcHJhZ21hcy5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9wcGZsYWdzLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL29ueXguaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vb255eGQuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vYWxsb2Njb21tb24uYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vYXNtX2NvbV9vZmZzZXRzLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2Jsb2NrZC5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9jb2VmdXBkYXRlcHJvYnMuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZGVidWdtb2Rlcy5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9kZWZhdWx0X2NvZWZfcHJvYnMuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZGVxdWFudGl6ZS5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9lbnRyb3B5LmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2VudHJvcHltb2RlLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2VudHJvcHltdi5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9leHRlbmQuYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZmlsdGVyLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2ZpbHRlci5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9maW5kbmVhcm12LmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2dlbmVyaWMvc3lzdGVtZGVwZW5kZW50LmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2lkY3RfYmxrLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2lkY3RsbG0uYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vYWxsb2Njb21tb24uaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vYmxvY2tkLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2NvbW1vbi5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9lbnRyb3B5LmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2VudHJvcHltb2RlLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2VudHJvcHltdi5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9leHRlbmQuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZmluZG5lYXJtdi5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9oZWFkZXIuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vaW52dHJhbnMuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbG9vcGZpbHRlci5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9tb2RlY29udC5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9tdi5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9vbnl4Y19pbnQuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcXVhbnRfY29tbW9uLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3JlY29uaW50ZXIuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcmVjb25pbnRyYTR4NC5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9ydGNkLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3J0Y2RfZGVmcy5zaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vc2V0dXBpbnRyYXJlY29uLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3N3YXB5djEyYnVmZmVyLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi90aHJlYWRpbmcuaAorVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vdHJlZWNvZGVyLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2xvb3BmaWx0ZXIuYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbG9vcGZpbHRlcl9maWx0ZXJzLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL21icGl0Y2guYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbW9kZWNvbnQuYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcXVhbnRfY29tbW9uLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3JlY29uaW50ZXIuYworVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcmVjb25pbnRyYS5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9yZWNvbmludHJhNHg0LmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3NhZF9jLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3NldHVwaW50cmFyZWNvbi5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9zd2FweXYxMmJ1ZmZlci5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi92YXJpYW5jZV9jLmMKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3ZhcmlhbmNlLmgKK1ZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3ZwOF9lbnRyb3B5bW9kZWRhdGEuaAorCisKKworVlA4X0NPTU1PTl9TUkNTLSQoQ09ORklHX1BPU1RQUk9DX1ZJU1VBTElaRVIpICs9IGNvbW1vbi90ZXh0YmxpdC5jCitWUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi90cmVlY29kZXIuYworCitWUDhfQ09NTU9OX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBjb21tb24veDg2L2ZpbHRlcl94ODYuYworVlA4X0NPTU1PTl9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gY29tbW9uL3g4Ni9maWx0ZXJfeDg2LmgKK1ZQOF9DT01NT05fU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGNvbW1vbi94ODYvdnA4X2FzbV9zdHVicy5jCitWUDhfQ09NTU9OX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBjb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmMKK1ZQOF9DT01NT05fU1JDUy0kKENPTkZJR19QT1NUUFJPQykgKz0gY29tbW9uL21mcWUuYworVlA4X0NPTU1PTl9TUkNTLSQoQ09ORklHX1BPU1RQUk9DKSArPSBjb21tb24vcG9zdHByb2MuaAorVlA4X0NPTU1PTl9TUkNTLSQoQ09ORklHX1BPU1RQUk9DKSArPSBjb21tb24vcG9zdHByb2MuYworVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NTVgpICs9IGNvbW1vbi94ODYvZGVxdWFudGl6ZV9tbXguYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9pZGN0X2Jsa19tbXguYworVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NTVgpICs9IGNvbW1vbi94ODYvaWRjdGxsbV9tbXguYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9pd2Fsc2hfbW14LmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NTVgpICs9IGNvbW1vbi94ODYvbG9vcGZpbHRlcl9tbXguYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9yZWNvbl9tbXguYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9zYWRfbW14LmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NTVgpICs9IGNvbW1vbi94ODYvc3VicGl4ZWxfbW14LmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NTVgpICs9IGNvbW1vbi94ODYvdmFyaWFuY2VfbW14LmMKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTU1YKSArPSBjb21tb24veDg2L3ZhcmlhbmNlX2ltcGxfbW14LmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU0UyKSArPSBjb21tb24veDg2L2lkY3RfYmxrX3NzZTIuYworVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU0UyKSArPSBjb21tb24veDg2L2lkY3RsbG1fc3NlMi5hc20KK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9yZWNvbl9zc2UyLmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU0UyKSArPSBjb21tb24veDg2L3JlY29uX3dyYXBwZXJfc3NlMi5jCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvc2FkX3NzZTIuYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvc3VicGl4ZWxfc3NlMi5hc20KK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9sb29wZmlsdGVyX3NzZTIuYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvaXdhbHNoX3NzZTIuYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvdmFyaWFuY2Vfc3NlMi5jCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvdmFyaWFuY2VfaW1wbF9zc2UyLmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU0UzKSArPSBjb21tb24veDg2L3NhZF9zc2UzLmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU1NFMykgKz0gY29tbW9uL3g4Ni9zYWRfc3NzZTMuYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTU0UzKSArPSBjb21tb24veDg2L3N1YnBpeGVsX3Nzc2UzLmFzbQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU1NFMykgKz0gY29tbW9uL3g4Ni92YXJpYW5jZV9zc3NlMy5jCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTU0UzKSArPSBjb21tb24veDg2L3ZhcmlhbmNlX2ltcGxfc3NzZTMuYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTRfMSkgKz0gY29tbW9uL3g4Ni9zYWRfc3NlNC5hc20KKworaWZlcSAoJChDT05GSUdfUE9TVFBST0MpLHllcykKK1ZQOF9DT01NT05fU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGNvbW1vbi94ODYvcG9zdHByb2NfeDg2LmMKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTU1YKSArPSBjb21tb24veDg2L3Bvc3Rwcm9jX21teC5hc20KK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9tZnFlX3NzZTIuYXNtCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvcG9zdHByb2Nfc3NlMi5hc20KK2VuZGlmCisKK2lmZXEgKCQoQVJDSF9YODZfNjQpLHllcykKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9sb29wZmlsdGVyX2Jsb2NrX3NzZTIuYXNtCitlbmRpZgorCisjIGNvbW1vbiAoYykKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfRFNQUjIpICArPSBjb21tb24vbWlwcy9kc3ByMi9pZGN0bGxtX2RzcHIyLmMKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfRFNQUjIpICArPSBjb21tb24vbWlwcy9kc3ByMi9maWx0ZXJfZHNwcjIuYworVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9EU1BSMikgICs9IGNvbW1vbi9taXBzL2RzcHIyL2xvb3BmaWx0ZXJfZmlsdGVyc19kc3ByMi5jCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0RTUFIyKSAgKz0gY29tbW9uL21pcHMvZHNwcjIvcmVjb25pbnRlcl9kc3ByMi5jCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0RTUFIyKSAgKz0gY29tbW9uL21pcHMvZHNwcjIvaWRjdF9ibGtfZHNwcjIuYworVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9EU1BSMikgICs9IGNvbW1vbi9taXBzL2RzcHIyL2RlcXVhbnRpemVfZHNwcjIuYworCisjIGNvbW1vbiAoYykKK1ZQOF9DT01NT05fU1JDUy0kKEFSQ0hfQVJNKSAgKz0gY29tbW9uL2FybS9maWx0ZXJfYXJtLmMKK1ZQOF9DT01NT05fU1JDUy0kKEFSQ0hfQVJNKSAgKz0gY29tbW9uL2FybS9sb29wZmlsdGVyX2FybS5jCitWUDhfQ09NTU9OX1NSQ1MtJChBUkNIX0FSTSkgICs9IGNvbW1vbi9hcm0vcmVjb25pbnRyYV9hcm0uYworVlA4X0NPTU1PTl9TUkNTLSQoQVJDSF9BUk0pICArPSBjb21tb24vYXJtL2RlcXVhbnRpemVfYXJtLmMKK1ZQOF9DT01NT05fU1JDUy0kKEFSQ0hfQVJNKSAgKz0gY29tbW9uL2FybS92YXJpYW5jZV9hcm0uYworCisjIGNvbW1vbiAobWVkaWEpCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uYworVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGNvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmgKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L2JpbGluZWFyZmlsdGVyX3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg0X3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg4X3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtMTZ4MTZfdjYkKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L2RjX29ubHlfaWRjdF9hZGRfdjYkKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L2l3YWxzaF92NiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGNvbW1vbi9hcm0vYXJtdjYvZmlsdGVyX3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9pZGN0X3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9sb29wZmlsdGVyX3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9zaW1wbGVsb29wZmlsdGVyX3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9zaXh0YXBwcmVkaWN0OHg0X3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9pbnRyYTR4NF9wcmVkaWN0X3Y2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni9kZXF1YW50X2lkY3RfdjYkKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L2RlcXVhbnRpemVfdjYkKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L2lkY3RfYmxrX3Y2LmMKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L3ZwOF9zYWQxNngxNl9hcm12NiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGNvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlOHg4X2FybXY2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2UxNngxNl9hcm12NiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGNvbW1vbi9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2JChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gY29tbW9uL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYkKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTUVESUEpICArPSBjb21tb24vYXJtL2FybXY2L3ZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjYkKEFTTSkKKworIyBjb21tb24gKG5lb24pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0NHg0X25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9iaWxpbmVhcnByZWRpY3Q4eDRfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2JpbGluZWFycHJlZGljdDh4OF9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0MTZ4MTZfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDRfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2NvcHltZW04eDhfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2NvcHltZW0xNngxNl9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vZGNfb25seV9pZGN0X2FkZF9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vaXdhbHNoX25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyX25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyc2ltcGxlaG9yaXpvbnRhbGVkZ2VfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGV2ZXJ0aWNhbGVkZ2VfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL21ibG9vcGZpbHRlcl9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9zYWQ4X25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9zYWQxNl9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDR4NF9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4NF9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4OF9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDE2eDE2X25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9idWlsZGludHJhcHJlZGljdG9yc21ieV9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vc2F2ZV9yZWdfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2RlcXVhbnRfaWRjdF9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL2lkY3RfZGVxdWFudF8wXzJ4X25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi9kZXF1YW50aXplYl9uZW9uJChBU00pCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vaWRjdF9ibGtfbmVvbi5jCitWUDhfQ09NTU9OX1NSQ1MtJChIQVZFX05FT04pICArPSBjb21tb24vYXJtL25lb24vdmFyaWFuY2VfbmVvbiQoQVNNKQorVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gY29tbW9uL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlOHg4X25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2X25lb24kKEFTTSkKK1ZQOF9DT01NT05fU1JDUy0kKEhBVkVfTkVPTikgICs9IGNvbW1vbi9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2c19uZW9uJChBU00pCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4L3ZwOF9jeF9pZmFjZS5jIGIvbGlidnB4L3ZwOC92cDhfY3hfaWZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFjM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOC92cDhfY3hfaWZhY2UuYwpAQCAtMCwwICsxLDEzMTcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCisjaW5jbHVkZSAidnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInZweF92ZXJzaW9uLmgiCisjaW5jbHVkZSAidnA4L2VuY29kZXIvb255eF9pbnQuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKyNpbmNsdWRlICJ2cDgvZW5jb2Rlci9maXJzdHBhc3MuaCIKKyNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXguaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RydWN0IHZwOF9leHRyYWNmZworeworICAgIHN0cnVjdCB2cHhfY29kZWNfcGt0X2xpc3QgKnBrdF9saXN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfdXNlZDsgICAgICAgICAgICAgICAgICAgIC8qKiBhdmFpbGFibGUgY3B1IHBlcmNlbnRhZ2UgaW4gMS8xNiovCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGVuYWJsZV9hdXRvX2FsdF9yZWY7ICAgICAgICAgICAvKiogaWYgZW5jb2RlciBkZWNpZGVzIHRvIHVzZXMgYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZSAqLworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBub2lzZV9zZW5zaXRpdml0eTsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgU2hhcnBuZXNzOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBzdGF0aWNfdGhyZXNoOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICB0b2tlbl9wYXJ0aXRpb25zOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBhcm5yX21heF9mcmFtZXM7ICAgIC8qIGFsdF9yZWYgTm9pc2UgUmVkdWN0aW9uIE1heCBGcmFtZSBDb3VudCAqLworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBhcm5yX3N0cmVuZ3RoOyAgICAvKiBhbHRfcmVmIE5vaXNlIFJlZHVjdGlvbiBTdHJlbmd0aCAqLworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBhcm5yX3R5cGU7ICAgICAgICAvKiBhbHRfcmVmIGZpbHRlciB0eXBlICovCisgICAgdnA4ZV90dW5pbmcgICAgICAgICAgICAgICAgIHR1bmluZzsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgY3FfbGV2ZWw7ICAgICAgICAgLyogY29uc3RyYWluZWQgcXVhbGl0eSBsZXZlbCAqLworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfYml0cmF0ZV9wY3Q7CisKK307CisKK3N0cnVjdCBleHRyYWNvbmZpZ19tYXAKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzYWdlOworICAgIHN0cnVjdCB2cDhfZXh0cmFjZmcgY2ZnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBleHRyYWNvbmZpZ19tYXAgZXh0cmFjZmdfbWFwW10gPQoreworICAgIHsKKyAgICAgICAgMCwKKyAgICAgICAgeworICAgICAgICAgICAgTlVMTCwKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNwdV91c2VkICAgICAgKi8KKyNlbHNlCisgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3B1X3VzZWQgICAgICAqLworI2VuZGlmCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlX2F1dG9fYWx0X3JlZiAqLworICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vaXNlX3NlbnNpdGl2aXR5ICovCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hhcnBuZXNzICovCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGljX3RocmVzaCAqLworI2lmIChDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HKQorICAgICAgICAgICAgVlA4X0VJR0hUX1RPS0VOUEFSVElUSU9OLAorI2Vsc2UKKyAgICAgICAgICAgIFZQOF9PTkVfVE9LRU5QQVJUSVRJT04sICAgICAvKiB0b2tlbl9wYXJ0aXRpb25zICovCisjZW5kaWYKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcm5yX21heF9mcmFtZXMgKi8KKyAgICAgICAgICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcm5yX3N0cmVuZ3RoICovCisgICAgICAgICAgICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJucl90eXBlKi8KKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0dW5pbmcqLworICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNxX2xldmVsICovCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmNfbWF4X2ludHJhX2JpdHJhdGVfcGN0ICovCisgICAgICAgIH0KKyAgICB9Cit9OworCitzdHJ1Y3QgdnB4X2NvZGVjX2FsZ19wcml2Cit7CisgICAgdnB4X2NvZGVjX3ByaXZfdCAgICAgICAgYmFzZTsKKyAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAgICBjZmc7CisgICAgc3RydWN0IHZwOF9leHRyYWNmZyAgICAgdnA4X2NmZzsKKyAgICBWUDhfQ09ORklHICAgICAgICAgICAgICBveGNmOworICAgIHN0cnVjdCBWUDhfQ09NUCAgICAgICAgKmNwaTsKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICpjeF9kYXRhOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGN4X2RhdGFfc3o7CisgICAgdnB4X2ltYWdlX3QgICAgICAgICAgICAgcHJldmlld19pbWc7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgbmV4dF9mcmFtZV9mbGFnOworICAgIHZwOF9wb3N0cHJvY19jZmdfdCAgICAgIHByZXZpZXdfcHBjZmc7CisgICAgLyogcGt0X2xpc3Qgc2l6ZSBkZXBlbmRzIG9uIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsYWdnZWQgZnJhbWVzIGFsbG93ZWQuICovCisgICAgdnB4X2NvZGVjX3BrdF9saXN0X2RlY2woNjQpIHBrdF9saXN0OworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBmaXhlZF9rZl9jbnRyOworfTsKKworCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90Cit1cGRhdGVfZXJyb3Jfc3RhdGUodnB4X2NvZGVjX2FsZ19wcml2X3QgICAgICAgICAgICAgICAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZweF9pbnRlcm5hbF9lcnJvcl9pbmZvICplcnJvcikKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgcmVzOworCisgICAgaWYgKChyZXMgPSBlcnJvci0+ZXJyb3JfY29kZSkpCisgICAgICAgIGN0eC0+YmFzZS5lcnJfZGV0YWlsID0gZXJyb3ItPmhhc19kZXRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVycm9yLT5kZXRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisKKyAgICByZXR1cm4gcmVzOworfQorCisKKyN1bmRlZiBFUlJPUgorI2RlZmluZSBFUlJPUihzdHIpIGRvIHtcCisgICAgICAgIGN0eC0+YmFzZS5lcnJfZGV0YWlsID0gc3RyO1wKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNO1wKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgUkFOR0VfQ0hFQ0socCxtZW1iLGxvLGhpKSBkbyB7XAorICAgICAgICBpZighKCgocCktPm1lbWIgPT0gbG8gfHwgKHApLT5tZW1iID4gKGxvKSkgJiYgKHApLT5tZW1iIDw9IGhpKSkgXAorICAgICAgICAgICAgRVJST1IoI21lbWIgIiBvdXQgb2YgcmFuZ2UgWyIjbG8iLi4iI2hpIl0iKTtcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIFJBTkdFX0NIRUNLX0hJKHAsbWVtYixoaSkgZG8ge1wKKyAgICAgICAgaWYoISgocCktPm1lbWIgPD0gKGhpKSkpIFwKKyAgICAgICAgICAgIEVSUk9SKCNtZW1iICIgb3V0IG9mIHJhbmdlIFsuLiIjaGkiXSIpO1wKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgUkFOR0VfQ0hFQ0tfTE8ocCxtZW1iLGxvKSBkbyB7XAorICAgICAgICBpZighKChwKS0+bWVtYiA+PSAobG8pKSkgXAorICAgICAgICAgICAgRVJST1IoI21lbWIgIiBvdXQgb2YgcmFuZ2UgWyIjbG8iLi5dIik7XAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBSQU5HRV9DSEVDS19CT09MKHAsbWVtYikgZG8ge1wKKyAgICAgICAgaWYoISEoKHApLT5tZW1iKSAhPSAocCktPm1lbWIpIEVSUk9SKCNtZW1iICIgZXhwZWN0ZWQgYm9vbGVhbiIpO1wKKyAgICB9IHdoaWxlKDApCisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdmFsaWRhdGVfY29uZmlnKHZweF9jb2RlY19hbGdfcHJpdl90ICAgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2cDhfZXh0cmFjZmcgKnZwOF9jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSkKK3sKKyAgICBSQU5HRV9DSEVDSyhjZmcsIGdfdywgICAgICAgICAgICAgICAgICAgMSwgMTYzODMpOyAvKiAxNCBiaXRzIGF2YWlsYWJsZSAqLworICAgIFJBTkdFX0NIRUNLKGNmZywgZ19oLCAgICAgICAgICAgICAgICAgICAxLCAxNjM4Myk7IC8qIDE0IGJpdHMgYXZhaWxhYmxlICovCisgICAgUkFOR0VfQ0hFQ0soY2ZnLCBnX3RpbWViYXNlLmRlbiwgICAgICAgIDEsIDEwMDAwMDAwMDApOworICAgIFJBTkdFX0NIRUNLKGNmZywgZ190aW1lYmFzZS5udW0sICAgICAgICAxLCBjZmctPmdfdGltZWJhc2UuZGVuKTsKKyAgICBSQU5HRV9DSEVDS19ISShjZmcsIGdfcHJvZmlsZSwgICAgICAgICAgMyk7CisgICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCByY19tYXhfcXVhbnRpemVyLCAgIDYzKTsKKyAgICBSQU5HRV9DSEVDS19ISShjZmcsIHJjX21pbl9xdWFudGl6ZXIsICAgY2ZnLT5yY19tYXhfcXVhbnRpemVyKTsKKyAgICBSQU5HRV9DSEVDS19ISShjZmcsIGdfdGhyZWFkcywgICAgICAgICAgNjQpOworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZCisgICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCBnX2xhZ19pbl9mcmFtZXMsICAgIDApOworI2VsaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgIGlmIChjdHgtPmJhc2UuZW5jLnRvdGFsX2VuY29kZXJzID4gMSkKKyAgICAgICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCBnX2xhZ19pbl9mcmFtZXMsICAgIDApOworI2Vsc2UKKyAgICBSQU5HRV9DSEVDS19ISShjZmcsIGdfbGFnX2luX2ZyYW1lcywgICAgMjUpOworI2VuZGlmCisgICAgUkFOR0VfQ0hFQ0soY2ZnLCByY19lbmRfdXNhZ2UsICAgICAgICAgIFZQWF9WQlIsIFZQWF9DUSk7CisgICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCByY191bmRlcnNob290X3BjdCwgIDEwMDApOworICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfb3ZlcnNob290X3BjdCwgICAxMDAwKTsKKyAgICBSQU5HRV9DSEVDS19ISShjZmcsIHJjXzJwYXNzX3Zicl9iaWFzX3BjdCwgMTAwKTsKKyAgICBSQU5HRV9DSEVDSyhjZmcsIGtmX21vZGUsICAgICAgICAgICAgICAgVlBYX0tGX0RJU0FCTEVELCBWUFhfS0ZfQVVUTyk7CisKKy8qIFRPRE86IGFkZCBzcGF0aWFsIHJlLXNhbXBsaW5nIHN1cHBvcnQgYW5kIGZyYW1lIGRyb3BwaW5nIGluCisgKiBtdWx0aS1yZXMtZW5jb2Rlci4qLworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICBpZiAoY3R4LT5iYXNlLmVuYy50b3RhbF9lbmNvZGVycyA+IDEpCisgICAgICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfcmVzaXplX2FsbG93ZWQsICAgICAwKTsKKyNlbHNlCisgICAgUkFOR0VfQ0hFQ0tfQk9PTChjZmcsIHJjX3Jlc2l6ZV9hbGxvd2VkKTsKKyNlbmRpZgorICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfZHJvcGZyYW1lX3RocmVzaCwgICAxMDApOworICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfcmVzaXplX3VwX3RocmVzaCwgICAxMDApOworICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfcmVzaXplX2Rvd25fdGhyZXNoLCAxMDApOworCisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkKKyAgICBSQU5HRV9DSEVDSyhjZmcsICAgICAgICBnX3Bhc3MsICAgICAgICAgVlBYX1JDX09ORV9QQVNTLCBWUFhfUkNfT05FX1BBU1MpOworI2VsaWYgQ09ORklHX01VTFRJX1JFU19FTkNPRElORworICAgIGlmIChjdHgtPmJhc2UuZW5jLnRvdGFsX2VuY29kZXJzID4gMSkKKyAgICAgICAgUkFOR0VfQ0hFQ0soY2ZnLCAgICBnX3Bhc3MsICAgICAgICAgVlBYX1JDX09ORV9QQVNTLCBWUFhfUkNfT05FX1BBU1MpOworI2Vsc2UKKyAgICBSQU5HRV9DSEVDSyhjZmcsICAgICAgICBnX3Bhc3MsICAgICAgICAgVlBYX1JDX09ORV9QQVNTLCBWUFhfUkNfTEFTVF9QQVNTKTsKKyNlbmRpZgorCisgICAgLyogVlA4IGRvZXMgbm90IHN1cHBvcnQgYSBsb3dlciBib3VuZCBvbiB0aGUga2V5ZnJhbWUgaW50ZXJ2YWwgaW4KKyAgICAgKiBhdXRvbWF0aWMga2V5ZnJhbWUgcGxhY2VtZW50IG1vZGUuCisgICAgICovCisgICAgaWYgKGNmZy0+a2ZfbW9kZSAhPSBWUFhfS0ZfRElTQUJMRUQgJiYgY2ZnLT5rZl9taW5fZGlzdCAhPSBjZmctPmtmX21heF9kaXN0CisgICAgICAgICYmIGNmZy0+a2ZfbWluX2Rpc3QgPiAwKQorICAgICAgICBFUlJPUigia2ZfbWluX2Rpc3Qgbm90IHN1cHBvcnRlZCBpbiBhdXRvIG1vZGUsIHVzZSAwICIKKyAgICAgICAgICAgICAgIm9yIGtmX21heF9kaXN0IGluc3RlYWQuIik7CisKKyAgICBSQU5HRV9DSEVDS19CT09MKHZwOF9jZmcsICAgICAgICAgICAgICAgZW5hYmxlX2F1dG9fYWx0X3JlZik7CisgICAgUkFOR0VfQ0hFQ0sodnA4X2NmZywgY3B1X3VzZWQsICAgICAgICAgICAtMTYsIDE2KTsKKworI2lmIENPTkZJR19SRUFMVElNRV9PTkxZICYmICFDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HCisgICAgUkFOR0VfQ0hFQ0sodnA4X2NmZywgbm9pc2Vfc2Vuc2l0aXZpdHksICAwLCAwKTsKKyNlbHNlCisgICAgUkFOR0VfQ0hFQ0tfSEkodnA4X2NmZywgbm9pc2Vfc2Vuc2l0aXZpdHksICA2KTsKKyNlbmRpZgorCisgICAgUkFOR0VfQ0hFQ0sodnA4X2NmZywgdG9rZW5fcGFydGl0aW9ucywgICBWUDhfT05FX1RPS0VOUEFSVElUSU9OLAorICAgICAgICAgICAgICAgIFZQOF9FSUdIVF9UT0tFTlBBUlRJVElPTik7CisgICAgUkFOR0VfQ0hFQ0tfSEkodnA4X2NmZywgU2hhcnBuZXNzLCAgICAgICA3KTsKKyAgICBSQU5HRV9DSEVDSyh2cDhfY2ZnLCBhcm5yX21heF9mcmFtZXMsIDAsIDE1KTsKKyAgICBSQU5HRV9DSEVDS19ISSh2cDhfY2ZnLCBhcm5yX3N0cmVuZ3RoLCAgIDYpOworICAgIFJBTkdFX0NIRUNLKHZwOF9jZmcsIGFybnJfdHlwZSwgICAgICAgMSwgMyk7CisgICAgUkFOR0VfQ0hFQ0sodnA4X2NmZywgY3FfbGV2ZWwsIDAsIDYzKTsKKyAgICBpZihmaW5hbGl6ZSAmJiBjZmctPnJjX2VuZF91c2FnZSA9PSBWUFhfQ1EpCisgICAgICAgIFJBTkdFX0NIRUNLKHZwOF9jZmcsIGNxX2xldmVsLAorICAgICAgICAgICAgICAgICAgICBjZmctPnJjX21pbl9xdWFudGl6ZXIsIGNmZy0+cmNfbWF4X3F1YW50aXplcik7CisKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorICAgIGlmIChjZmctPmdfcGFzcyA9PSBWUFhfUkNfTEFTVF9QQVNTKQorICAgIHsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICBwYWNrZXRfc3ogPSBzaXplb2YoRklSU1RQQVNTX1NUQVRTKTsKKyAgICAgICAgaW50ICAgICAgICAgICAgICBuX3BhY2tldHMgPSAoaW50KShjZmctPnJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3ogLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3N6KTsKKyAgICAgICAgRklSU1RQQVNTX1NUQVRTICpzdGF0czsKKworICAgICAgICBpZiAoIWNmZy0+cmNfdHdvcGFzc19zdGF0c19pbi5idWYpCisgICAgICAgICAgICBFUlJPUigicmNfdHdvcGFzc19zdGF0c19pbi5idWYgbm90IHNldC4iKTsKKworICAgICAgICBpZiAoY2ZnLT5yY190d29wYXNzX3N0YXRzX2luLnN6ICUgcGFja2V0X3N6KQorICAgICAgICAgICAgRVJST1IoInJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3ogaW5kaWNhdGVzIHRydW5jYXRlZCBwYWNrZXQuIik7CisKKyAgICAgICAgaWYgKGNmZy0+cmNfdHdvcGFzc19zdGF0c19pbi5zeiA8IDIgKiBwYWNrZXRfc3opCisgICAgICAgICAgICBFUlJPUigicmNfdHdvcGFzc19zdGF0c19pbiByZXF1aXJlcyBhdCBsZWFzdCB0d28gcGFja2V0cy4iKTsKKworICAgICAgICBzdGF0cyA9ICh2b2lkKikoKGNoYXIgKiljZmctPnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmCisgICAgICAgICAgICAgICAgKyAobl9wYWNrZXRzIC0gMSkgKiBwYWNrZXRfc3opOworCisgICAgICAgIGlmICgoaW50KShzdGF0cy0+Y291bnQgKyAwLjUpICE9IG5fcGFja2V0cyAtIDEpCisgICAgICAgICAgICBFUlJPUigicmNfdHdvcGFzc19zdGF0c19pbiBtaXNzaW5nIEVPUyBzdGF0cyBwYWNrZXQiKTsKKyAgICB9CisjZW5kaWYKKworICAgIFJBTkdFX0NIRUNLKGNmZywgdHNfbnVtYmVyX2xheWVycywgMSwgNSk7CisKKyAgICBpZiAoY2ZnLT50c19udW1iZXJfbGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBSQU5HRV9DSEVDS19ISShjZmcsIHRzX3BlcmlvZGljaXR5LCAxNik7CisKKyAgICAgICAgZm9yIChpPTE7IGk8Y2ZnLT50c19udW1iZXJfbGF5ZXJzOyBpKyspCisgICAgICAgICAgICBpZiAoY2ZnLT50c190YXJnZXRfYml0cmF0ZVtpXSA8PSBjZmctPnRzX3RhcmdldF9iaXRyYXRlW2ktMV0pCisgICAgICAgICAgICAgICAgRVJST1IoInRzX3RhcmdldF9iaXRyYXRlIGVudHJpZXMgYXJlIG5vdCBzdHJpY3RseSBpbmNyZWFzaW5nIik7CisKKyAgICAgICAgUkFOR0VfQ0hFQ0soY2ZnLCB0c19yYXRlX2RlY2ltYXRvcltjZmctPnRzX251bWJlcl9sYXllcnMtMV0sIDEsIDEpOworICAgICAgICBmb3IgKGk9Y2ZnLT50c19udW1iZXJfbGF5ZXJzLTI7IGk+MDsgaS0tKQorICAgICAgICAgICAgaWYgKGNmZy0+dHNfcmF0ZV9kZWNpbWF0b3JbaS0xXSAhPSAyKmNmZy0+dHNfcmF0ZV9kZWNpbWF0b3JbaV0pCisgICAgICAgICAgICAgICAgRVJST1IoInRzX3JhdGVfZGVjaW1hdG9yIGZhY3RvcnMgYXJlIG5vdCBwb3dlcnMgb2YgMiIpOworCisgICAgICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgdHNfbGF5ZXJfaWRbaV0sIGNmZy0+dHNfbnVtYmVyX2xheWVycy0xKTsKKyAgICB9CisKKyNpZiAoQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORykKKyAgICBpZihjZmctPmdfdGhyZWFkcyA+ICgxIDw8IHZwOF9jZmctPnRva2VuX3BhcnRpdGlvbnMpKQorICAgICAgICBFUlJPUigiZ190aHJlYWRzIGNhbm5vdCBiZSBiaWdnZXIgdGhhbiBudW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucyIpOworI2VuZGlmCisKKyAgICByZXR1cm4gVlBYX0NPREVDX09LOworfQorCisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdmFsaWRhdGVfaW1nKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCAgICAqaW1nKQoreworICAgIHN3aXRjaCAoaW1nLT5mbXQpCisgICAgeworICAgIGNhc2UgVlBYX0lNR19GTVRfWVYxMjoKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjA6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9WUFhJNDIwOgorICAgIGNhc2UgVlBYX0lNR19GTVRfVlBYWVYxMjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgRVJST1IoIkludmFsaWQgaW1hZ2UgZm9ybWF0LiBPbmx5IFlWMTIgYW5kIEk0MjAgaW1hZ2VzIGFyZSBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoKGltZy0+ZF93ICE9IGN0eC0+Y2ZnLmdfdykgfHwgKGltZy0+ZF9oICE9IGN0eC0+Y2ZnLmdfaCkpCisgICAgICAgIEVSUk9SKCJJbWFnZSBzaXplIG11c3QgbWF0Y2ggZW5jb2RlciBpbml0IGNvbmZpZ3VyYXRpb24gc2l6ZSIpOworCisgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKK30KKworCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHNldF92cDhlX2NvbmZpZyhWUDhfQ09ORklHICpveGNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCBjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdnA4X2V4dHJhY2ZnIHZwOF9jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfcHJpdl9lbmNfbXJfY2ZnX3QgKm1yX2NmZykKK3sKKyAgICBveGNmLT5tdWx0aV90aHJlYWRlZCAgICAgICAgID0gY2ZnLmdfdGhyZWFkczsKKyAgICBveGNmLT5WZXJzaW9uICAgICAgICAgICAgICAgPSBjZmcuZ19wcm9maWxlOworCisgICAgb3hjZi0+V2lkdGggICAgICAgICAgICAgICAgID0gY2ZnLmdfdzsKKyAgICBveGNmLT5IZWlnaHQgICAgICAgICAgICAgICAgPSBjZmcuZ19oOworICAgIG94Y2YtPnRpbWViYXNlICAgICAgICAgICAgICA9IGNmZy5nX3RpbWViYXNlOworCisgICAgb3hjZi0+ZXJyb3JfcmVzaWxpZW50X21vZGUgPSBjZmcuZ19lcnJvcl9yZXNpbGllbnQ7CisKKyAgICBzd2l0Y2ggKGNmZy5nX3Bhc3MpCisgICAgeworICAgIGNhc2UgVlBYX1JDX09ORV9QQVNTOgorICAgICAgICBveGNmLT5Nb2RlID0gTU9ERV9CRVNUUVVBTElUWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWUFhfUkNfRklSU1RfUEFTUzoKKyAgICAgICAgb3hjZi0+TW9kZSA9IE1PREVfRklSU1RQQVNTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZQWF9SQ19MQVNUX1BBU1M6CisgICAgICAgIG94Y2YtPk1vZGUgPSBNT0RFX1NFQ09ORFBBU1NfQkVTVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNmZy5nX3Bhc3MgPT0gVlBYX1JDX0ZJUlNUX1BBU1MgfHwgY2ZnLmdfcGFzcyA9PSBWUFhfUkNfT05FX1BBU1MpCisgICAgeworICAgICAgICBveGNmLT5hbGxvd19sYWcgICAgID0gMDsKKyAgICAgICAgb3hjZi0+bGFnX2luX2ZyYW1lcyA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG94Y2YtPmFsbG93X2xhZyAgICAgPSAoY2ZnLmdfbGFnX2luX2ZyYW1lcykgPiAwOworICAgICAgICBveGNmLT5sYWdfaW5fZnJhbWVzID0gY2ZnLmdfbGFnX2luX2ZyYW1lczsKKyAgICB9CisKKyAgICBveGNmLT5hbGxvd19kZiAgICAgICAgICAgICAgID0gKGNmZy5yY19kcm9wZnJhbWVfdGhyZXNoID4gMCk7CisgICAgb3hjZi0+ZHJvcF9mcmFtZXNfd2F0ZXJfbWFyayAgID0gY2ZnLnJjX2Ryb3BmcmFtZV90aHJlc2g7CisKKyAgICBveGNmLT5hbGxvd19zcGF0aWFsX3Jlc2FtcGxpbmcgPSBjZmcucmNfcmVzaXplX2FsbG93ZWQ7CisgICAgb3hjZi0+cmVzYW1wbGVfdXBfd2F0ZXJfbWFyayAgID0gY2ZnLnJjX3Jlc2l6ZV91cF90aHJlc2g7CisgICAgb3hjZi0+cmVzYW1wbGVfZG93bl93YXRlcl9tYXJrID0gY2ZnLnJjX3Jlc2l6ZV9kb3duX3RocmVzaDsKKworICAgIGlmIChjZmcucmNfZW5kX3VzYWdlID09IFZQWF9WQlIpCisgICAgeworICAgICAgICBveGNmLT5lbmRfdXNhZ2UgPSBVU0FHRV9MT0NBTF9GSUxFX1BMQVlCQUNLOworICAgIH0KKyAgICBlbHNlIGlmIChjZmcucmNfZW5kX3VzYWdlID09IFZQWF9DQlIpCisgICAgeworICAgICAgICBveGNmLT5lbmRfdXNhZ2UgPSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVI7CisgICAgfQorICAgIGVsc2UgaWYgKGNmZy5yY19lbmRfdXNhZ2UgPT0gVlBYX0NRKQorICAgIHsKKyAgICAgICAgb3hjZi0+ZW5kX3VzYWdlID0gVVNBR0VfQ09OU1RSQUlORURfUVVBTElUWTsKKyAgICB9CisKKyAgICBveGNmLT50YXJnZXRfYmFuZHdpZHRoICAgICAgICAgPSBjZmcucmNfdGFyZ2V0X2JpdHJhdGU7CisgICAgb3hjZi0+cmNfbWF4X2ludHJhX2JpdHJhdGVfcGN0ID0gdnA4X2NmZy5yY19tYXhfaW50cmFfYml0cmF0ZV9wY3Q7CisKKyAgICBveGNmLT5iZXN0X2FsbG93ZWRfcSAgICAgICAgICAgPSBjZmcucmNfbWluX3F1YW50aXplcjsKKyAgICBveGNmLT53b3JzdF9hbGxvd2VkX3EgICAgICAgICAgPSBjZmcucmNfbWF4X3F1YW50aXplcjsKKyAgICBveGNmLT5jcV9sZXZlbCAgICAgICAgICAgICAgICAgPSB2cDhfY2ZnLmNxX2xldmVsOworICAgIG94Y2YtPmZpeGVkX3EgPSAtMTsKKworICAgIG94Y2YtPnVuZGVyX3Nob290X3BjdCAgICAgICAgICA9IGNmZy5yY191bmRlcnNob290X3BjdDsKKyAgICBveGNmLT5vdmVyX3Nob290X3BjdCAgICAgICAgICAgPSBjZmcucmNfb3ZlcnNob290X3BjdDsKKworICAgIG94Y2YtPm1heGltdW1fYnVmZmVyX3NpemVfaW5fbXMgICA9IGNmZy5yY19idWZfc3o7CisgICAgb3hjZi0+c3RhcnRpbmdfYnVmZmVyX2xldmVsX2luX21zID0gY2ZnLnJjX2J1Zl9pbml0aWFsX3N6OworICAgIG94Y2YtPm9wdGltYWxfYnVmZmVyX2xldmVsX2luX21zICA9IGNmZy5yY19idWZfb3B0aW1hbF9zejsKKworICAgIG94Y2YtPm1heGltdW1fYnVmZmVyX3NpemUgICAgICA9IGNmZy5yY19idWZfc3o7CisgICAgb3hjZi0+c3RhcnRpbmdfYnVmZmVyX2xldmVsICAgID0gY2ZnLnJjX2J1Zl9pbml0aWFsX3N6OworICAgIG94Y2YtPm9wdGltYWxfYnVmZmVyX2xldmVsICAgICA9IGNmZy5yY19idWZfb3B0aW1hbF9zejsKKworICAgIG94Y2YtPnR3b19wYXNzX3ZicmJpYXMgICAgICAgICA9IGNmZy5yY18ycGFzc192YnJfYmlhc19wY3Q7CisgICAgb3hjZi0+dHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gID0gY2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdDsKKyAgICBveGNmLT50d29fcGFzc192YnJtYXhfc2VjdGlvbiAgPSBjZmcucmNfMnBhc3NfdmJyX21heHNlY3Rpb25fcGN0OworCisgICAgb3hjZi0+YXV0b19rZXkgICAgICAgICAgICAgICAgID0gY2ZnLmtmX21vZGUgPT0gVlBYX0tGX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNmZy5rZl9taW5fZGlzdCAhPSBjZmcua2ZfbWF4X2Rpc3Q7CisgICAgb3hjZi0+a2V5X2ZyZXEgICAgICAgICAgICAgICAgID0gY2ZnLmtmX21heF9kaXN0OworCisgICAgb3hjZi0+bnVtYmVyX29mX2xheWVycyAgICAgICAgID0gY2ZnLnRzX251bWJlcl9sYXllcnM7CisgICAgb3hjZi0+cGVyaW9kaWNpdHkgICAgICAgICAgICAgID0gY2ZnLnRzX3BlcmlvZGljaXR5OworCisgICAgaWYgKG94Y2YtPm51bWJlcl9vZl9sYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgbWVtY3B5IChveGNmLT50YXJnZXRfYml0cmF0ZSwgY2ZnLnRzX3RhcmdldF9iaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2ZnLnRzX3RhcmdldF9iaXRyYXRlKSk7CisgICAgICAgIG1lbWNweSAob3hjZi0+cmF0ZV9kZWNpbWF0b3IsIGNmZy50c19yYXRlX2RlY2ltYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNmZy50c19yYXRlX2RlY2ltYXRvcikpOworICAgICAgICBtZW1jcHkgKG94Y2YtPmxheWVyX2lkLCBjZmcudHNfbGF5ZXJfaWQsIHNpemVvZihjZmcudHNfbGF5ZXJfaWQpKTsKKyAgICB9CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgLyogV2hlbiBtcl9jZmcgaXMgTlVMTCwgb3hjZi0+bXJfdG90YWxfcmVzb2x1dGlvbnMgYW5kIG94Y2YtPm1yX2VuY29kZXJfaWQKKyAgICAgKiBhcmUgYm90aCBtZW1zZXQgdG8gMCwgd2hpY2ggZW5zdXJlcyB0aGUgY29ycmVjdCBsb2dpYyB1bmRlciB0aGlzCisgICAgICogc2l0dWF0aW9uLgorICAgICAqLworICAgIGlmKG1yX2NmZykKKyAgICB7CisgICAgICAgIG94Y2YtPm1yX3RvdGFsX3Jlc29sdXRpb25zICAgICAgICA9IG1yX2NmZy0+bXJfdG90YWxfcmVzb2x1dGlvbnM7CisgICAgICAgIG94Y2YtPm1yX2VuY29kZXJfaWQgICAgICAgICAgICAgICA9IG1yX2NmZy0+bXJfZW5jb2Rlcl9pZDsKKyAgICAgICAgb3hjZi0+bXJfZG93bl9zYW1wbGluZ19mYWN0b3IubnVtID0gbXJfY2ZnLT5tcl9kb3duX3NhbXBsaW5nX2ZhY3Rvci5udW07CisgICAgICAgIG94Y2YtPm1yX2Rvd25fc2FtcGxpbmdfZmFjdG9yLmRlbiA9IG1yX2NmZy0+bXJfZG93bl9zYW1wbGluZ19mYWN0b3IuZGVuOworICAgICAgICBveGNmLT5tcl9sb3dfcmVzX21vZGVfaW5mbyAgICAgICAgPSBtcl9jZmctPm1yX2xvd19yZXNfbW9kZV9pbmZvOworICAgIH0KKyNlbmRpZgorCisgICAgb3hjZi0+Y3B1X3VzZWQgICAgICAgICAgICAgICA9IHZwOF9jZmcuY3B1X3VzZWQ7CisgICAgb3hjZi0+ZW5jb2RlX2JyZWFrb3V0ICAgICAgICA9IHZwOF9jZmcuc3RhdGljX3RocmVzaDsKKyAgICBveGNmLT5wbGF5X2FsdGVybmF0ZSAgICAgICAgID0gdnA4X2NmZy5lbmFibGVfYXV0b19hbHRfcmVmOworICAgIG94Y2YtPm5vaXNlX3NlbnNpdGl2aXR5ICAgICAgPSB2cDhfY2ZnLm5vaXNlX3NlbnNpdGl2aXR5OworICAgIG94Y2YtPlNoYXJwbmVzcyAgICAgICAgICAgICAgPSB2cDhfY2ZnLlNoYXJwbmVzczsKKyAgICBveGNmLT50b2tlbl9wYXJ0aXRpb25zICAgICAgID0gdnA4X2NmZy50b2tlbl9wYXJ0aXRpb25zOworCisgICAgb3hjZi0+dHdvX3Bhc3Nfc3RhdHNfaW4gICAgICA9IGNmZy5yY190d29wYXNzX3N0YXRzX2luOworICAgIG94Y2YtPm91dHB1dF9wa3RfbGlzdCAgICAgICAgPSB2cDhfY2ZnLnBrdF9saXN0OworCisgICAgb3hjZi0+YXJucl9tYXhfZnJhbWVzICAgICAgICA9IHZwOF9jZmcuYXJucl9tYXhfZnJhbWVzOworICAgIG94Y2YtPmFybnJfc3RyZW5ndGggICAgICAgICAgPSB2cDhfY2ZnLmFybnJfc3RyZW5ndGg7CisgICAgb3hjZi0+YXJucl90eXBlICAgICAgICAgICAgICA9IHZwOF9jZmcuYXJucl90eXBlOworCisgICAgb3hjZi0+dHVuaW5nICAgICAgICAgICAgICAgICA9IHZwOF9jZmcudHVuaW5nOworCisgICAgLyoKKyAgICAgICAgcHJpbnRmKCJDdXJyZW50IFZQOCBTZXR0aW5nczogXG4iKTsKKyAgICAgICAgcHJpbnRmKCJ0YXJnZXRfYmFuZHdpZHRoOiAlZFxuIiwgb3hjZi0+dGFyZ2V0X2JhbmR3aWR0aCk7CisgICAgICAgIHByaW50Zigibm9pc2Vfc2Vuc2l0aXZpdHk6ICVkXG4iLCBveGNmLT5ub2lzZV9zZW5zaXRpdml0eSk7CisgICAgICAgIHByaW50ZigiU2hhcnBuZXNzOiAlZFxuIiwgICAgb3hjZi0+U2hhcnBuZXNzKTsKKyAgICAgICAgcHJpbnRmKCJjcHVfdXNlZDogJWRcbiIsICBveGNmLT5jcHVfdXNlZCk7CisgICAgICAgIHByaW50ZigiTW9kZTogJWRcbiIsICAgICBveGNmLT5Nb2RlKTsKKyAgICAgICAgcHJpbnRmKCJkZWxldGVfZmlyc3RfcGFzc19maWxlOiAlZFxuIiwgIG94Y2YtPmRlbGV0ZV9maXJzdF9wYXNzX2ZpbGUpOworICAgICAgICBwcmludGYoImF1dG9fa2V5OiAlZFxuIiwgIG94Y2YtPmF1dG9fa2V5KTsKKyAgICAgICAgcHJpbnRmKCJrZXlfZnJlcTogJWRcbiIsIG94Y2YtPmtleV9mcmVxKTsKKyAgICAgICAgcHJpbnRmKCJlbmRfdXNhZ2U6ICVkXG4iLCBveGNmLT5lbmRfdXNhZ2UpOworICAgICAgICBwcmludGYoInVuZGVyX3Nob290X3BjdDogJWRcbiIsIG94Y2YtPnVuZGVyX3Nob290X3BjdCk7CisgICAgICAgIHByaW50Zigib3Zlcl9zaG9vdF9wY3Q6ICVkXG4iLCBveGNmLT5vdmVyX3Nob290X3BjdCk7CisgICAgICAgIHByaW50Zigic3RhcnRpbmdfYnVmZmVyX2xldmVsOiAlZFxuIiwgb3hjZi0+c3RhcnRpbmdfYnVmZmVyX2xldmVsKTsKKyAgICAgICAgcHJpbnRmKCJvcHRpbWFsX2J1ZmZlcl9sZXZlbDogJWRcbiIsICBveGNmLT5vcHRpbWFsX2J1ZmZlcl9sZXZlbCk7CisgICAgICAgIHByaW50ZigibWF4aW11bV9idWZmZXJfc2l6ZTogJWRcbiIsIG94Y2YtPm1heGltdW1fYnVmZmVyX3NpemUpOworICAgICAgICBwcmludGYoImZpeGVkX3E6ICVkXG4iLCAgb3hjZi0+Zml4ZWRfcSk7CisgICAgICAgIHByaW50Zigid29yc3RfYWxsb3dlZF9xOiAlZFxuIiwgb3hjZi0+d29yc3RfYWxsb3dlZF9xKTsKKyAgICAgICAgcHJpbnRmKCJiZXN0X2FsbG93ZWRfcTogJWRcbiIsIG94Y2YtPmJlc3RfYWxsb3dlZF9xKTsKKyAgICAgICAgcHJpbnRmKCJhbGxvd19zcGF0aWFsX3Jlc2FtcGxpbmc6ICVkXG4iLCAgb3hjZi0+YWxsb3dfc3BhdGlhbF9yZXNhbXBsaW5nKTsKKyAgICAgICAgcHJpbnRmKCJyZXNhbXBsZV9kb3duX3dhdGVyX21hcms6ICVkXG4iLCBveGNmLT5yZXNhbXBsZV9kb3duX3dhdGVyX21hcmspOworICAgICAgICBwcmludGYoInJlc2FtcGxlX3VwX3dhdGVyX21hcms6ICVkXG4iLCBveGNmLT5yZXNhbXBsZV91cF93YXRlcl9tYXJrKTsKKyAgICAgICAgcHJpbnRmKCJhbGxvd19kZjogJWRcbiIsIG94Y2YtPmFsbG93X2RmKTsKKyAgICAgICAgcHJpbnRmKCJkcm9wX2ZyYW1lc193YXRlcl9tYXJrOiAlZFxuIiwgb3hjZi0+ZHJvcF9mcmFtZXNfd2F0ZXJfbWFyayk7CisgICAgICAgIHByaW50ZigidHdvX3Bhc3NfdmJyYmlhczogJWRcbiIsICBveGNmLT50d29fcGFzc192YnJiaWFzKTsKKyAgICAgICAgcHJpbnRmKCJ0d29fcGFzc192YnJtaW5fc2VjdGlvbjogJWRcbiIsIG94Y2YtPnR3b19wYXNzX3Zicm1pbl9zZWN0aW9uKTsKKyAgICAgICAgcHJpbnRmKCJ0d29fcGFzc192YnJtYXhfc2VjdGlvbjogJWRcbiIsIG94Y2YtPnR3b19wYXNzX3Zicm1heF9zZWN0aW9uKTsKKyAgICAgICAgcHJpbnRmKCJhbGxvd19sYWc6ICVkXG4iLCBveGNmLT5hbGxvd19sYWcpOworICAgICAgICBwcmludGYoImxhZ19pbl9mcmFtZXM6ICVkXG4iLCBveGNmLT5sYWdfaW5fZnJhbWVzKTsKKyAgICAgICAgcHJpbnRmKCJwbGF5X2FsdGVybmF0ZTogJWRcbiIsIG94Y2YtPnBsYXlfYWx0ZXJuYXRlKTsKKyAgICAgICAgcHJpbnRmKCJWZXJzaW9uOiAlZFxuIiwgb3hjZi0+VmVyc2lvbik7CisgICAgICAgIHByaW50ZigibXVsdGlfdGhyZWFkZWQ6ICVkXG4iLCAgIG94Y2YtPm11bHRpX3RocmVhZGVkKTsKKyAgICAgICAgcHJpbnRmKCJlbmNvZGVfYnJlYWtvdXQ6ICVkXG4iLCBveGNmLT5lbmNvZGVfYnJlYWtvdXQpOworICAgICovCisgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3NldF9jb25maWcodnB4X2NvZGVjX2FsZ19wcml2X3QgICAgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgICpjZmcpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlczsKKworICAgIGlmICgoKGNmZy0+Z193ICE9IGN0eC0+Y2ZnLmdfdykgfHwgKGNmZy0+Z19oICE9IGN0eC0+Y2ZnLmdfaCkpCisgICAgICAgICYmIChjZmctPmdfbGFnX2luX2ZyYW1lcyA+IDEgfHwgY2ZnLT5nX3Bhc3MgIT0gVlBYX1JDX09ORV9QQVNTKSkKKyAgICAgICAgRVJST1IoIkNhbm5vdCBjaGFuZ2Ugd2lkdGggb3IgaGVpZ2h0IGFmdGVyIGluaXRpYWxpemF0aW9uIik7CisKKyAgICAvKiBQcmV2ZW50IGluY3JlYXNpbmcgbGFnX2luX2ZyYW1lcy4gVGhpcyBjaGVjayBpcyBzdHJpY3RlciB0aGFuIGl0IG5lZWRzCisgICAgICogdG8gYmUgLS0gdGhlIGxpbWl0IGlzIG5vdCBpbmNyZWFzaW5nIHBhc3QgdGhlIGZpcnN0IGxhZ19pbl9mcmFtZXMKKyAgICAgKiB2YWx1ZSwgYnV0IHdlIGRvbid0IHRyYWNrIHRoZSBpbml0aWFsIGNvbmZpZywgb25seSB0aGUgbGFzdCBzdWNjZXNzZnVsCisgICAgICogY29uZmlnLgorICAgICAqLworICAgIGlmICgoY2ZnLT5nX2xhZ19pbl9mcmFtZXMgPiBjdHgtPmNmZy5nX2xhZ19pbl9mcmFtZXMpKQorICAgICAgICBFUlJPUigiQ2Fubm90IGluY3JlYXNlIGxhZ19pbl9mcmFtZXMiKTsKKworICAgIHJlcyA9IHZhbGlkYXRlX2NvbmZpZyhjdHgsIGNmZywgJmN0eC0+dnA4X2NmZywgMCk7CisKKyAgICBpZiAoIXJlcykKKyAgICB7CisgICAgICAgIGN0eC0+Y2ZnID0gKmNmZzsKKyAgICAgICAgc2V0X3ZwOGVfY29uZmlnKCZjdHgtPm94Y2YsIGN0eC0+Y2ZnLCBjdHgtPnZwOF9jZmcsIE5VTEwpOworICAgICAgICB2cDhfY2hhbmdlX2NvbmZpZyhjdHgtPmNwaSwgJmN0eC0+b3hjZik7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworCitpbnQgdnA4X3JldmVyc2VfdHJhbnMoaW50KTsKKworCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IGdldF9wYXJhbSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGN0cmxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgICAgYXJncykKK3sKKyAgICB2b2lkICphcmcgPSB2YV9hcmcoYXJncywgdm9pZCAqKTsKKworI2RlZmluZSBNQVAoaWQsIHZhcikgY2FzZSBpZDogKihSRUNBU1QoaWQsIGFyZykpID0gdmFyOyBicmVhaworCisgICAgaWYgKCFhcmcpCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworICAgIHN3aXRjaCAoY3RybF9pZCkKKyAgICB7CisgICAgICAgIE1BUChWUDhFX0dFVF9MQVNUX1FVQU5USVpFUiwgdnA4X2dldF9xdWFudGl6ZXIoY3R4LT5jcGkpKTsKKyAgICAgICAgTUFQKFZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSXzY0LCB2cDhfcmV2ZXJzZV90cmFucyh2cDhfZ2V0X3F1YW50aXplcihjdHgtPmNwaSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gVlBYX0NPREVDX09LOworI3VuZGVmIE1BUAorfQorCisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3Qgc2V0X3BhcmFtKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgY3RybF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgICAgICBhcmdzKQoreworICAgIHZweF9jb2RlY19lcnJfdCAgICAgcmVzICA9IFZQWF9DT0RFQ19PSzsKKyAgICBzdHJ1Y3QgdnA4X2V4dHJhY2ZnIHhjZmcgPSBjdHgtPnZwOF9jZmc7CisKKyNkZWZpbmUgTUFQKGlkLCB2YXIpIGNhc2UgaWQ6IHZhciA9IENBU1QoaWQsIGFyZ3MpOyBicmVhazsKKworICAgIHN3aXRjaCAoY3RybF9pZCkKKyAgICB7CisgICAgICAgIE1BUChWUDhFX1NFVF9DUFVVU0VELCAgICAgICAgICAgICAgIHhjZmcuY3B1X3VzZWQpOworICAgICAgICBNQVAoVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwgICAgICB4Y2ZnLmVuYWJsZV9hdXRvX2FsdF9yZWYpOworICAgICAgICBNQVAoVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksICAgICB4Y2ZnLm5vaXNlX3NlbnNpdGl2aXR5KTsKKyAgICAgICAgTUFQKFZQOEVfU0VUX1NIQVJQTkVTUywgICAgICAgICAgICAgeGNmZy5TaGFycG5lc3MpOworICAgICAgICBNQVAoVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwgICAgICB4Y2ZnLnN0YXRpY190aHJlc2gpOworICAgICAgICBNQVAoVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywgICAgICB4Y2ZnLnRva2VuX3BhcnRpdGlvbnMpOworCisgICAgICAgIE1BUChWUDhFX1NFVF9BUk5SX01BWEZSQU1FUywgICAgICAgIHhjZmcuYXJucl9tYXhfZnJhbWVzKTsKKyAgICAgICAgTUFQKFZQOEVfU0VUX0FSTlJfU1RSRU5HVEggLCAgICAgICAgeGNmZy5hcm5yX3N0cmVuZ3RoKTsKKyAgICAgICAgTUFQKFZQOEVfU0VUX0FSTlJfVFlQRSAgICAgLCAgICAgICAgeGNmZy5hcm5yX3R5cGUpOworICAgICAgICBNQVAoVlA4RV9TRVRfVFVOSU5HLCAgICAgICAgICAgICAgICB4Y2ZnLnR1bmluZyk7CisgICAgICAgIE1BUChWUDhFX1NFVF9DUV9MRVZFTCwgICAgICAgICAgICAgIHhjZmcuY3FfbGV2ZWwpOworICAgICAgICBNQVAoVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENULCB4Y2ZnLnJjX21heF9pbnRyYV9iaXRyYXRlX3BjdCk7CisKKyAgICB9CisKKyAgICByZXMgPSB2YWxpZGF0ZV9jb25maWcoY3R4LCAmY3R4LT5jZmcsICZ4Y2ZnLCAwKTsKKworICAgIGlmICghcmVzKQorICAgIHsKKyAgICAgICAgY3R4LT52cDhfY2ZnID0geGNmZzsKKyAgICAgICAgc2V0X3ZwOGVfY29uZmlnKCZjdHgtPm94Y2YsIGN0eC0+Y2ZnLCBjdHgtPnZwOF9jZmcsIE5VTEwpOworICAgICAgICB2cDhfY2hhbmdlX2NvbmZpZyhjdHgtPmNwaSwgJmN0eC0+b3hjZik7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKKyN1bmRlZiBNQVAKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX21yX2FsbG9jX21lbShjb25zdCB2cHhfY29kZWNfZW5jX2NmZ190ICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm1lbV9sb2MpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IDA7CisKKyNpZiBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HCisgICAgTE9XRVJfUkVTX0ZSQU1FX0lORk8gKnNoYXJlZF9tZW1fbG9jOworICAgIGludCBtYl9yb3dzID0gKChjZmctPmdfdyArIDE1KSA+PjQpOworICAgIGludCBtYl9jb2xzID0gKChjZmctPmdfaCArIDE1KSA+PjQpOworCisgICAgc2hhcmVkX21lbV9sb2MgPSBjYWxsb2MoMSwgc2l6ZW9mKExPV0VSX1JFU19GUkFNRV9JTkZPKSk7CisgICAgaWYoIXNoYXJlZF9tZW1fbG9jKQorICAgIHsKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX01FTV9FUlJPUjsKKyAgICB9CisKKyAgICBzaGFyZWRfbWVtX2xvYy0+bWJfaW5mbyA9IGNhbGxvYyhtYl9yb3dzKm1iX2NvbHMsIHNpemVvZihMT1dFUl9SRVNfTUJfSU5GTykpOworICAgIGlmKCEoc2hhcmVkX21lbV9sb2MtPm1iX2luZm8pKQorICAgIHsKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX01FTV9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm1lbV9sb2MgPSAodm9pZCAqKXNoYXJlZF9tZW1fbG9jOworICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX2luaXQodnB4X2NvZGVjX2N0eF90ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfcHJpdl9lbmNfbXJfY2ZnX3QgKm1yX2NmZykKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKKyAgICBzdHJ1Y3QgdnB4X2NvZGVjX2FsZ19wcml2ICpwcml2OworICAgIHZweF9jb2RlY19lbmNfY2ZnX3QgICAgICAgKmNmZzsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBpOworCisgICAgc3RydWN0IFZQOF9DT01QICpvcHRyOworCisgICAgdnB4X3J0Y2QoKTsKKworICAgIGlmICghY3R4LT5wcml2KQorICAgIHsKKyAgICAgICAgcHJpdiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHZweF9jb2RlY19hbGdfcHJpdikpOworCisgICAgICAgIGlmICghcHJpdikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19NRU1fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnByaXYgPSAmcHJpdi0+YmFzZTsKKyAgICAgICAgY3R4LT5wcml2LT5zeiA9IHNpemVvZigqY3R4LT5wcml2KTsKKyAgICAgICAgY3R4LT5wcml2LT5pZmFjZSA9IGN0eC0+aWZhY2U7CisgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYgPSBwcml2OworICAgICAgICBjdHgtPnByaXYtPmluaXRfZmxhZ3MgPSBjdHgtPmluaXRfZmxhZ3M7CisKKyAgICAgICAgaWYgKGN0eC0+Y29uZmlnLmVuYykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVXBkYXRlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgdG8gYW4KKyAgICAgICAgICAgICAqIGludGVybmFsIGNvcHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPmNmZyA9ICpjdHgtPmNvbmZpZy5lbmM7CisgICAgICAgICAgICBjdHgtPmNvbmZpZy5lbmMgPSAmY3R4LT5wcml2LT5hbGdfcHJpdi0+Y2ZnOworICAgICAgICB9CisKKyAgICAgICAgY2ZnID0gICZjdHgtPnByaXYtPmFsZ19wcml2LT5jZmc7CisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBleHRyYSB2cDggY29uZmlndXJhdGlvbiB0YWJsZSBiYXNlZCBvbiB0aGUgY3VycmVudAorICAgICAgICAgKiB1c2FnZSB2YWx1ZS4gSWYgdGhlIGN1cnJlbnQgdXNhZ2UgdmFsdWUgaXNuJ3QgZm91bmQsIHVzZSB0aGUKKyAgICAgICAgICogdmFsdWVzIGZvciB1c2FnZSBjYXNlIDAuCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOworICAgICAgICAgICAgIGV4dHJhY2ZnX21hcFtpXS51c2FnZSAmJiBleHRyYWNmZ19tYXBbaV0udXNhZ2UgIT0gY2ZnLT5nX3VzYWdlOworICAgICAgICAgICAgIGkrKyk7CisKKyAgICAgICAgcHJpdi0+dnA4X2NmZyA9IGV4dHJhY2ZnX21hcFtpXS5jZmc7CisgICAgICAgIHByaXYtPnZwOF9jZmcucGt0X2xpc3QgPSAmcHJpdi0+cGt0X2xpc3QuaGVhZDsKKworICAgICAgICBwcml2LT5jeF9kYXRhX3N6ID0gcHJpdi0+Y2ZnLmdfdyAqIHByaXYtPmNmZy5nX2ggKiAzIC8gMiAqIDI7CisKKyAgICAgICAgaWYgKHByaXYtPmN4X2RhdGFfc3ogPCAzMjc2OCkgcHJpdi0+Y3hfZGF0YV9zeiA9IDMyNzY4OworCisgICAgICAgIHByaXYtPmN4X2RhdGEgPSBtYWxsb2MocHJpdi0+Y3hfZGF0YV9zeik7CisKKyAgICAgICAgaWYgKCFwcml2LT5jeF9kYXRhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVlBYX0NPREVDX01FTV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG1yX2NmZykKKyAgICAgICAgICAgIGN0eC0+cHJpdi0+ZW5jLnRvdGFsX2VuY29kZXJzICAgPSBtcl9jZmctPm1yX3RvdGFsX3Jlc29sdXRpb25zOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdHgtPnByaXYtPmVuYy50b3RhbF9lbmNvZGVycyAgID0gMTsKKworICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb25maWcocHJpdiwgJnByaXYtPmNmZywgJnByaXYtPnZwOF9jZmcsIDApOworCisgICAgICAgIGlmICghcmVzKQorICAgICAgICB7CisgICAgICAgICAgICBzZXRfdnA4ZV9jb25maWcoJmN0eC0+cHJpdi0+YWxnX3ByaXYtPm94Y2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcml2LT5hbGdfcHJpdi0+dnA4X2NmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJfY2ZnKTsKKworICAgICAgICAgICAgb3B0ciA9IHZwOF9jcmVhdGVfY29tcHJlc3NvcigmY3R4LT5wcml2LT5hbGdfcHJpdi0+b3hjZik7CisKKyAgICAgICAgICAgIGlmICghb3B0cikKKyAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfTUVNX0VSUk9SOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPmNwaSA9IG9wdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfZGVzdHJveSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4KQoreworI2lmIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcKKyAgICAvKiBGcmVlIG11bHRpLWVuY29kZXIgc2hhcmVkIG1lbW9yeSAqLworICAgIGlmIChjdHgtPm94Y2YubXJfdG90YWxfcmVzb2x1dGlvbnMgPiAwICYmIChjdHgtPm94Y2YubXJfZW5jb2Rlcl9pZCA9PSBjdHgtPm94Y2YubXJfdG90YWxfcmVzb2x1dGlvbnMtMSkpCisgICAgeworICAgICAgICBMT1dFUl9SRVNfRlJBTUVfSU5GTyAqc2hhcmVkX21lbV9sb2MgPSAoTE9XRVJfUkVTX0ZSQU1FX0lORk8gKiljdHgtPm94Y2YubXJfbG93X3Jlc19tb2RlX2luZm87CisgICAgICAgIGZyZWUoc2hhcmVkX21lbV9sb2MtPm1iX2luZm8pOworICAgICAgICBmcmVlKGN0eC0+b3hjZi5tcl9sb3dfcmVzX21vZGVfaW5mbyk7CisgICAgfQorI2VuZGlmCisKKyAgICBmcmVlKGN0eC0+Y3hfZGF0YSk7CisgICAgdnA4X3JlbW92ZV9jb21wcmVzc29yKCZjdHgtPmNwaSk7CisgICAgZnJlZShjdHgpOworICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgaW1hZ2UyeXV2Y29uZmlnKGNvbnN0IHZweF9pbWFnZV90ICAgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgKnl2MTIpCit7CisgICAgdnB4X2NvZGVjX2Vycl90ICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7CisgICAgeXYxMi0+eV9idWZmZXIgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgeXYxMi0+dV9idWZmZXIgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgeXYxMi0+dl9idWZmZXIgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKKyAgICB5djEyLT55X3dpZHRoICA9IGltZy0+ZF93OworICAgIHl2MTItPnlfaGVpZ2h0ID0gaW1nLT5kX2g7CisgICAgeXYxMi0+dXZfd2lkdGggPSAoMSArIHl2MTItPnlfd2lkdGgpIC8gMjsKKyAgICB5djEyLT51dl9oZWlnaHQgPSAoMSArIHl2MTItPnlfaGVpZ2h0KSAvIDI7CisKKyAgICB5djEyLT55X3N0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKyAgICB5djEyLT51dl9zdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisKKyAgICB5djEyLT5ib3JkZXIgID0gKGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXSAtIGltZy0+dykgLyAyOworICAgIHl2MTItPmNscnR5cGUgPSAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfVlBYSTQyMCB8fCBpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9WUFhZVjEyKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBwaWNrX3F1aWNrY29tcHJlc3NfbW9kZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGRlYWRsaW5lKQoreworICAgIHVuc2lnbmVkIGludCBuZXdfcWM7CisKKyNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQorICAgIC8qIFVzZSBiZXN0IHF1YWxpdHkgbW9kZSBpZiBubyBkZWFkbGluZSBpcyBnaXZlbi4gKi8KKyAgICBuZXdfcWMgPSBNT0RFX0JFU1RRVUFMSVRZOworCisgICAgaWYgKGRlYWRsaW5lKQorICAgIHsKKyAgICAgICAgdWludDY0X3QgICAgIGR1cmF0aW9uX3VzOworCisgICAgICAgIC8qIENvbnZlcnQgZHVyYXRpb24gcGFyYW1ldGVyIGZyb20gc3RyZWFtIHRpbWViYXNlIHRvIG1pY3Jvc2Vjb25kcyAqLworICAgICAgICBkdXJhdGlvbl91cyA9ICh1aW50NjRfdClkdXJhdGlvbiAqIDEwMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAqICh1aW50NjRfdCljdHgtPmNmZy5nX3RpbWViYXNlLm51bQorICAgICAgICAgICAgICAgICAgICAgIC8gKHVpbnQ2NF90KWN0eC0+Y2ZnLmdfdGltZWJhc2UuZGVuOworCisgICAgICAgIC8qIElmIHRoZSBkZWFkbGluZSBpcyBtb3JlIHRoYXQgdGhlIGR1cmF0aW9uIHRoaXMgZnJhbWUgaXMgdG8gYmUgc2hvd24sCisgICAgICAgICAqIHVzZSBnb29kIHF1YWxpdHkgbW9kZS4gT3RoZXJ3aXNlIHVzZSByZWFsdGltZSBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgbmV3X3FjID0gKGRlYWRsaW5lID4gZHVyYXRpb25fdXMpID8gTU9ERV9HT09EUVVBTElUWSA6IE1PREVfUkVBTFRJTUU7CisgICAgfQorCisjZWxzZQorICAgIG5ld19xYyA9IE1PREVfUkVBTFRJTUU7CisjZW5kaWYKKworICAgIGlmIChjdHgtPmNmZy5nX3Bhc3MgPT0gVlBYX1JDX0ZJUlNUX1BBU1MpCisgICAgICAgIG5ld19xYyA9IE1PREVfRklSU1RQQVNTOworICAgIGVsc2UgaWYgKGN0eC0+Y2ZnLmdfcGFzcyA9PSBWUFhfUkNfTEFTVF9QQVNTKQorICAgICAgICBuZXdfcWMgPSAobmV3X3FjID09IE1PREVfQkVTVFFVQUxJVFkpCisgICAgICAgICAgICAgICAgID8gTU9ERV9TRUNPTkRQQVNTX0JFU1QKKyAgICAgICAgICAgICAgICAgOiBNT0RFX1NFQ09ORFBBU1M7CisKKyAgICBpZiAoY3R4LT5veGNmLk1vZGUgIT0gbmV3X3FjKQorICAgIHsKKyAgICAgICAgY3R4LT5veGNmLk1vZGUgPSBuZXdfcWM7CisgICAgICAgIHZwOF9jaGFuZ2VfY29uZmlnKGN0eC0+Y3BpLCAmY3R4LT5veGNmKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX2VuY29kZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgICAgICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19wdHNfdCAgICAgICAgcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGRlYWRsaW5lKQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfT0s7CisKKyAgICBpZiAoIWN0eC0+Y2ZnLnJjX3RhcmdldF9iaXRyYXRlKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgaWYgKCFjdHgtPmNmZy5yY190YXJnZXRfYml0cmF0ZSkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGlmIChpbWcpCisgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ltZyhjdHgsIGltZyk7CisKKyAgICBpZiAoIXJlcykKKyAgICAgICAgcmVzID0gdmFsaWRhdGVfY29uZmlnKGN0eCwgJmN0eC0+Y2ZnLCAmY3R4LT52cDhfY2ZnLCAxKTsKKworICAgIHBpY2tfcXVpY2tjb21wcmVzc19tb2RlKGN0eCwgZHVyYXRpb24sIGRlYWRsaW5lKTsKKyAgICB2cHhfY29kZWNfcGt0X2xpc3RfaW5pdCgmY3R4LT5wa3RfbGlzdCk7CisKKyAgICAvKiBIYW5kbGUgRmxhZ3MgKi8KKyAgICBpZiAoKChmbGFncyAmIFZQOF9FRkxBR19OT19VUERfR0YpICYmIChmbGFncyAmIFZQOF9FRkxBR19GT1JDRV9HRikpCisgICAgICAgIHx8ICgoZmxhZ3MgJiBWUDhfRUZMQUdfTk9fVVBEX0FSRikgJiYgKGZsYWdzICYgVlA4X0VGTEFHX0ZPUkNFX0FSRikpKQorICAgIHsKKyAgICAgICAgY3R4LT5iYXNlLmVycl9kZXRhaWwgPSAiQ29uZmxpY3RpbmcgZmxhZ3MuIjsKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIGlmIChmbGFncyAmIChWUDhfRUZMQUdfTk9fUkVGX0xBU1QgfCBWUDhfRUZMQUdfTk9fUkVGX0dGCisgICAgICAgICAgICAgICAgIHwgVlA4X0VGTEFHX05PX1JFRl9BUkYpKQorICAgIHsKKyAgICAgICAgaW50IHJlZiA9IDc7CisKKyAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1JFRl9MQVNUKQorICAgICAgICAgICAgcmVmIF49IFZQOF9MQVNUX0ZSQU1FOworCisgICAgICAgIGlmIChmbGFncyAmIFZQOF9FRkxBR19OT19SRUZfR0YpCisgICAgICAgICAgICByZWYgXj0gVlA4X0dPTERfRlJBTUU7CisKKyAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1JFRl9BUkYpCisgICAgICAgICAgICByZWYgXj0gVlA4X0FMVFJfRlJBTUU7CisKKyAgICAgICAgdnA4X3VzZV9hc19yZWZlcmVuY2UoY3R4LT5jcGksIHJlZik7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgKFZQOF9FRkxBR19OT19VUERfTEFTVCB8IFZQOF9FRkxBR19OT19VUERfR0YKKyAgICAgICAgICAgICAgICAgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8IFZQOF9FRkxBR19GT1JDRV9HRgorICAgICAgICAgICAgICAgICB8IFZQOF9FRkxBR19GT1JDRV9BUkYpKQorICAgIHsKKyAgICAgICAgaW50IHVwZCA9IDc7CisKKyAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1VQRF9MQVNUKQorICAgICAgICAgICAgdXBkIF49IFZQOF9MQVNUX0ZSQU1FOworCisgICAgICAgIGlmIChmbGFncyAmIFZQOF9FRkxBR19OT19VUERfR0YpCisgICAgICAgICAgICB1cGQgXj0gVlA4X0dPTERfRlJBTUU7CisKKyAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1VQRF9BUkYpCisgICAgICAgICAgICB1cGQgXj0gVlA4X0FMVFJfRlJBTUU7CisKKyAgICAgICAgdnA4X3VwZGF0ZV9yZWZlcmVuY2UoY3R4LT5jcGksIHVwZCk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZKQorICAgIHsKKyAgICAgICAgdnA4X3VwZGF0ZV9lbnRyb3B5KGN0eC0+Y3BpLCAwKTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgZml4ZWQga2V5ZnJhbWUgaW50ZXJ2YWxzICovCisgICAgaWYgKGN0eC0+Y2ZnLmtmX21vZGUgPT0gVlBYX0tGX0FVVE8KKyAgICAgICAgJiYgY3R4LT5jZmcua2ZfbWluX2Rpc3QgPT0gY3R4LT5jZmcua2ZfbWF4X2Rpc3QpCisgICAgeworICAgICAgICBpZiAoKytjdHgtPmZpeGVkX2tmX2NudHIgPiBjdHgtPmNmZy5rZl9taW5fZGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxhZ3MgfD0gVlBYX0VGTEFHX0ZPUkNFX0tGOworICAgICAgICAgICAgY3R4LT5maXhlZF9rZl9jbnRyID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGVuY29kZXIgaW5zdGFuY2Ugb24gdGhlIGZpcnN0IGZyYW1lKi8KKyAgICBpZiAoIXJlcyAmJiBjdHgtPmNwaSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBsaWJfZmxhZ3M7CisgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKKyAgICAgICAgaW50NjRfdCBkc3RfdGltZV9zdGFtcCwgZHN0X2VuZF90aW1lX3N0YW1wOworICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGN4X2RhdGFfc3o7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN4X2RhdGE7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN4X2RhdGFfZW5kOworICAgICAgICBpbnQgY29tcF9kYXRhX3N0YXRlID0gMDsKKworICAgICAgICAvKiBTZXQgdXAgaW50ZXJuYWwgZmxhZ3MgKi8KKyAgICAgICAgaWYgKGN0eC0+YmFzZS5pbml0X2ZsYWdzICYgVlBYX0NPREVDX1VTRV9QU05SKQorICAgICAgICAgICAgKChWUDhfQ09NUCAqKWN0eC0+Y3BpKS0+Yl9jYWxjdWxhdGVfcHNuciA9IDE7CisKKyAgICAgICAgaWYgKGN0eC0+YmFzZS5pbml0X2ZsYWdzICYgVlBYX0NPREVDX1VTRV9PVVRQVVRfUEFSVElUSU9OKQorICAgICAgICAgICAgKChWUDhfQ09NUCAqKWN0eC0+Y3BpKS0+b3V0cHV0X3BhcnRpdGlvbiA9IDE7CisKKyAgICAgICAgLyogQ29udmVydCBBUEkgZmxhZ3MgdG8gaW50ZXJuYWwgY29kZWMgbGliIGZsYWdzICovCisgICAgICAgIGxpYl9mbGFncyA9IChmbGFncyAmIFZQWF9FRkxBR19GT1JDRV9LRikgPyBGUkFNRUZMQUdTX0tFWSA6IDA7CisKKyAgICAgICAgLyogdnA4IHVzZSAxMCwwMDAsMDAwIHRpY2tzL3NlY29uZCBhcyB0aW1lIHN0YW1wICovCisgICAgICAgIGRzdF90aW1lX3N0YW1wICAgID0gcHRzICogMTAwMDAwMDAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UuZGVuOworICAgICAgICBkc3RfZW5kX3RpbWVfc3RhbXAgPSAocHRzICsgZHVyYXRpb24pICogMTAwMDAwMDAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UuZGVuOworCisgICAgICAgIGlmIChpbWcgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzID0gaW1hZ2UyeXV2Y29uZmlnKGltZywgJnNkKTsKKworICAgICAgICAgICAgaWYgKHZwOF9yZWNlaXZlX3Jhd19mcmFtZShjdHgtPmNwaSwgY3R4LT5uZXh0X2ZyYW1lX2ZsYWcgfCBsaWJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZCwgZHN0X3RpbWVfc3RhbXAsIGRzdF9lbmRfdGltZV9zdGFtcCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKWN0eC0+Y3BpOworICAgICAgICAgICAgICAgIHJlcyA9IHVwZGF0ZV9lcnJvcl9zdGF0ZShjdHgsICZjcGktPmNvbW1vbi5lcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJlc2V0IGZvciBuZXh0IGZyYW1lICovCisgICAgICAgICAgICBjdHgtPm5leHRfZnJhbWVfZmxhZyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjeF9kYXRhID0gY3R4LT5jeF9kYXRhOworICAgICAgICBjeF9kYXRhX3N6ID0gY3R4LT5jeF9kYXRhX3N6OworICAgICAgICBjeF9kYXRhX2VuZCA9IGN0eC0+Y3hfZGF0YSArIGN4X2RhdGFfc3o7CisgICAgICAgIGxpYl9mbGFncyA9IDA7CisKKyAgICAgICAgd2hpbGUgKGN4X2RhdGFfc3ogPj0gY3R4LT5jeF9kYXRhX3N6IC8gMikKKyAgICAgICAgeworICAgICAgICAgICAgY29tcF9kYXRhX3N0YXRlID0gdnA4X2dldF9jb21wcmVzc2VkX2RhdGEoY3R4LT5jcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaWJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeF9kYXRhX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdF90aW1lX3N0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0X2VuZF90aW1lX3N0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW1nKTsKKworICAgICAgICAgICAgaWYoY29tcF9kYXRhX3N0YXRlID09IFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FKQorICAgICAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfQ09SUlVQVF9GUkFNRTsKKyAgICAgICAgICAgIGVsc2UgaWYoY29tcF9kYXRhX3N0YXRlID09IC0xKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2cHhfY29kZWNfcHRzX3QgICAgcm91bmQsIGRlbHRhOworICAgICAgICAgICAgICAgIHZweF9jb2RlY19jeF9wa3RfdCBwa3Q7CisgICAgICAgICAgICAgICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKWN0eC0+Y3BpOworCisgICAgICAgICAgICAgICAgLyogQWRkIHRoZSBmcmFtZSBwYWNrZXQgdG8gdGhlIGxpc3Qgb2YgcmV0dXJuZWQgcGFja2V0cy4gKi8KKyAgICAgICAgICAgICAgICByb3VuZCA9ICh2cHhfY29kZWNfcHRzX3QpMTAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIDIgLSAxOworICAgICAgICAgICAgICAgIGRlbHRhID0gKGRzdF9lbmRfdGltZV9zdGFtcCAtIGRzdF90aW1lX3N0YW1wKTsKKyAgICAgICAgICAgICAgICBwa3Qua2luZCA9IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1Q7CisgICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUucHRzID0KKyAgICAgICAgICAgICAgICAgICAgKGRzdF90aW1lX3N0YW1wICogY3R4LT5jZmcuZ190aW1lYmFzZS5kZW4gKyByb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgLyBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIDEwMDAwMDAwOworICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLmR1cmF0aW9uID0gKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICgoZGVsdGEgKiBjdHgtPmNmZy5nX3RpbWViYXNlLmRlbiArIHJvdW5kKQorICAgICAgICAgICAgICAgICAgICAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UubnVtIC8gMTAwMDAwMDApOworICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLmZsYWdzID0gbGliX2ZsYWdzIDw8IDE2OworCisgICAgICAgICAgICAgICAgaWYgKGxpYl9mbGFncyAmIEZSQU1FRkxBR1NfS0VZKQorICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5mbGFncyB8PSBWUFhfRlJBTUVfSVNfS0VZOworCisgICAgICAgICAgICAgICAgaWYgKCFjcGktPmNvbW1vbi5zaG93X2ZyYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuZmxhZ3MgfD0gVlBYX0ZSQU1FX0lTX0lOVklTSUJMRTsKKworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHRpbWVzdGFtcCBzaG91bGQgYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAqIHByaW9yIFBUUyBzbyB0aGF0IGlmIGEgZGVjb2RlciB1c2VzIHB0cyB0byBzY2hlZHVsZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAqIHRvIGRvIHRoaXMsIHdlIHN0YXJ0IHJpZ2h0IGFmdGVyIGxhc3QgZnJhbWUgd2FzIGRlY29kZWQuCisgICAgICAgICAgICAgICAgICAgICAqIEludmlzaWJsZSBmcmFtZXMgaGF2ZSBubyBkdXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLnB0cyA9ICgoY3BpLT5sYXN0X3RpbWVfc3RhbXBfc2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLmRlbiArIHJvdW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIDEwMDAwMDAwKSArIDE7CisgICAgICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLmR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5kcm9wcGFibGUpCisgICAgICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLmZsYWdzIHw9IFZQWF9GUkFNRV9JU19EUk9QUEFCTEU7CisKKyAgICAgICAgICAgICAgICBpZiAoY3BpLT5vdXRwdXRfcGFydGl0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1fcGFydGl0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgY3BpLT5jb21tb24ubXVsdGlfdG9rZW5fcGFydGl0aW9uKSArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuZmxhZ3MgfD0gVlBYX0ZSQU1FX0lTX0ZSQUdNRU5UOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFydGl0aW9uczsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisjaWYgQ09ORklHX1JFQUxUSU1FX09OTFkgJiBDT05GSUdfT05USEVGTFlfQklUUEFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuYnVmID0gY3BpLT5wYXJ0aXRpb25fZFtpXTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5idWYgPSBjeF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY3hfZGF0YSArPSBjcGktPnBhcnRpdGlvbl9zeltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN4X2RhdGFfc3ogLT0gY3BpLT5wYXJ0aXRpb25fc3pbaV07CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLnN6ID0gY3BpLT5wYXJ0aXRpb25fc3pbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5wYXJ0aXRpb25faWQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3Qgc2V0IHRoZSBmcmFnbWVudCBiaXQgZm9yIHRoZSBsYXN0IHBhcnRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gKG51bV9wYXJ0aXRpb25zIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuZmxhZ3MgJj0gflZQWF9GUkFNRV9JU19GUkFHTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19wa3RfbGlzdF9hZGQoJmN0eC0+cGt0X2xpc3QuaGVhZCwgJnBrdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZiBDT05GSUdfUkVBTFRJTUVfT05MWSAmIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HCisgICAgICAgICAgICAgICAgICAgIC8qIEluIGxhZ2dlZCBtb2RlIHRoZSBlbmNvZGVyIGNhbiBidWZmZXIgbXVsdGlwbGUgZnJhbWVzLgorICAgICAgICAgICAgICAgICAgICAgKiBXZSBkb24ndCB3YW50IHRoaXMgaW4gcGFydGl0aW9uZWQgb3V0cHV0IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICogcGFydGl0aW9ucyBhcmUgc3ByZWFkIGFsbCBvdmVyIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgKiBTbywgZm9yY2UgYW4gZXhpdCEKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGN4X2RhdGFfc3ogLT0gY3R4LT5jeF9kYXRhX3N6IC8gMjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5idWYgPSBjeF9kYXRhOworICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5zeiAgPSBzaXplOworICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5wYXJ0aXRpb25faWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3BrdF9saXN0X2FkZCgmY3R4LT5wa3RfbGlzdC5oZWFkLCAmcGt0KTsKKyAgICAgICAgICAgICAgICAgICAgY3hfZGF0YSArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBjeF9kYXRhX3N6IC09IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICp2cDhlX2dldF9jeGRhdGEodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCisgICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICAqaXRlcikKK3sKKyAgICByZXR1cm4gdnB4X2NvZGVjX3BrdF9saXN0X2dldCgmY3R4LT5wa3RfbGlzdC5oZWFkLCBpdGVyKTsKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3NldF9yZWZlcmVuY2UodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgaW50IGN0cl9pZCwKKyAgICAgICAgdmFfbGlzdCBhcmdzKQoreworICAgIHZweF9yZWZfZnJhbWVfdCAqZGF0YSA9IHZhX2FyZyhhcmdzLCB2cHhfcmVmX2ZyYW1lX3QgKik7CisKKyAgICBpZiAoZGF0YSkKKyAgICB7CisgICAgICAgIHZweF9yZWZfZnJhbWVfdCAqZnJhbWUgPSAodnB4X3JlZl9mcmFtZV90ICopZGF0YTsKKyAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHIHNkOworCisgICAgICAgIGltYWdlMnl1dmNvbmZpZygmZnJhbWUtPmltZywgJnNkKTsKKyAgICAgICAgdnA4X3NldF9yZWZlcmVuY2UoY3R4LT5jcGksIGZyYW1lLT5mcmFtZV90eXBlLCAmc2QpOworICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfZ2V0X3JlZmVyZW5jZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAorICAgICAgICBpbnQgY3RyX2lkLAorICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisKKyAgICB2cHhfcmVmX2ZyYW1lX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnB4X3JlZl9mcmFtZV90ICopOworCisgICAgaWYgKGRhdGEpCisgICAgeworICAgICAgICB2cHhfcmVmX2ZyYW1lX3QgKmZyYW1lID0gKHZweF9yZWZfZnJhbWVfdCAqKWRhdGE7CisgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKKworICAgICAgICBpbWFnZTJ5dXZjb25maWcoJmZyYW1lLT5pbWcsICZzZCk7CisgICAgICAgIHZwOF9nZXRfcmVmZXJlbmNlKGN0eC0+Y3BpLCBmcmFtZS0+ZnJhbWVfdHlwZSwgJnNkKTsKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfcHJldmlld3BwKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgIGludCBjdHJfaWQsCisgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyNpZiBDT05GSUdfUE9TVFBST0MKKyAgICB2cDhfcG9zdHByb2NfY2ZnX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnA4X3Bvc3Rwcm9jX2NmZ190ICopOworICAgICh2b2lkKWN0cl9pZDsKKworICAgIGlmIChkYXRhKQorICAgIHsKKyAgICAgICAgY3R4LT5wcmV2aWV3X3BwY2ZnID0gKigodnA4X3Bvc3Rwcm9jX2NmZ190ICopZGF0YSk7CisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworI2Vsc2UKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpY3RyX2lkOworICAgICh2b2lkKWFyZ3M7CisgICAgcmV0dXJuIFZQWF9DT0RFQ19JTkNBUEFCTEU7CisjZW5kaWYKK30KKworCitzdGF0aWMgdnB4X2ltYWdlX3QgKnZwOGVfZ2V0X3ByZXZpZXcodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCkKK3sKKworICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKKyAgICB2cDhfcHBmbGFnc190IGZsYWdzID0gezB9OworCisgICAgaWYgKGN0eC0+cHJldmlld19wcGNmZy5wb3N0X3Byb2NfZmxhZykKKyAgICB7CisgICAgICAgIGZsYWdzLnBvc3RfcHJvY19mbGFnICAgICAgICA9IGN0eC0+cHJldmlld19wcGNmZy5wb3N0X3Byb2NfZmxhZzsKKyAgICAgICAgZmxhZ3MuZGVibG9ja2luZ19sZXZlbCAgICAgID0gY3R4LT5wcmV2aWV3X3BwY2ZnLmRlYmxvY2tpbmdfbGV2ZWw7CisgICAgICAgIGZsYWdzLm5vaXNlX2xldmVsICAgICAgICAgICA9IGN0eC0+cHJldmlld19wcGNmZy5ub2lzZV9sZXZlbDsKKyAgICB9CisKKyAgICBpZiAoMCA9PSB2cDhfZ2V0X3ByZXZpZXdfcmF3X2ZyYW1lKGN0eC0+Y3BpLCAmc2QsICZmbGFncykpCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgIHZweF9pbWdfd3JhcCgmY3R4LT5wcmV2aWV3X2ltZywgVlBYX0lNR19GTVRfWVYxMiwKKyAgICAgICAgICAgIHNkLnlfd2lkdGggKyAyKlZQOEJPUkRFUklOUElYRUxTLAorICAgICAgICAgICAgc2QueV9oZWlnaHQgKyAyKlZQOEJPUkRFUklOUElYRUxTLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHNkLmJ1ZmZlcl9hbGxvYyk7CisgICAgICAgIHZweF9pbWdfc2V0X3JlY3QoJmN0eC0+cHJldmlld19pbWcsCisgICAgICAgICAgICBWUDhCT1JERVJJTlBJWEVMUywgVlA4Qk9SREVSSU5QSVhFTFMsCisgICAgICAgICAgICBzZC55X3dpZHRoLCBzZC55X2hlaWdodCk7CisgICAgICAgICAgICAqLworCisgICAgICAgIGN0eC0+cHJldmlld19pbWcuYnBzID0gMTI7CisgICAgICAgIGN0eC0+cHJldmlld19pbWcucGxhbmVzW1ZQWF9QTEFORV9ZXSA9IHNkLnlfYnVmZmVyOworICAgICAgICBjdHgtPnByZXZpZXdfaW1nLnBsYW5lc1tWUFhfUExBTkVfVV0gPSBzZC51X2J1ZmZlcjsKKyAgICAgICAgY3R4LT5wcmV2aWV3X2ltZy5wbGFuZXNbVlBYX1BMQU5FX1ZdID0gc2Qudl9idWZmZXI7CisKKyAgICAgICAgaWYgKHNkLmNscnR5cGUgPT0gUkVHX1lVVikKKyAgICAgICAgICAgIGN0eC0+cHJldmlld19pbWcuZm10ID0gVlBYX0lNR19GTVRfSTQyMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3R4LT5wcmV2aWV3X2ltZy5mbXQgPSBWUFhfSU1HX0ZNVF9WUFhJNDIwOworCisgICAgICAgIGN0eC0+cHJldmlld19pbWcueF9jaHJvbWFfc2hpZnQgPSAxOworICAgICAgICBjdHgtPnByZXZpZXdfaW1nLnlfY2hyb21hX3NoaWZ0ID0gMTsKKworICAgICAgICBjdHgtPnByZXZpZXdfaW1nLmRfdyA9IHNkLnlfd2lkdGg7CisgICAgICAgIGN0eC0+cHJldmlld19pbWcuZF9oID0gc2QueV9oZWlnaHQ7CisgICAgICAgIGN0eC0+cHJldmlld19pbWcuc3RyaWRlW1ZQWF9QTEFORV9ZXSA9IHNkLnlfc3RyaWRlOworICAgICAgICBjdHgtPnByZXZpZXdfaW1nLnN0cmlkZVtWUFhfUExBTkVfVV0gPSBzZC51dl9zdHJpZGU7CisgICAgICAgIGN0eC0+cHJldmlld19pbWcuc3RyaWRlW1ZQWF9QTEFORV9WXSA9IHNkLnV2X3N0cmlkZTsKKyAgICAgICAgY3R4LT5wcmV2aWV3X2ltZy53ICAgPSBzZC55X3dpZHRoOworICAgICAgICBjdHgtPnByZXZpZXdfaW1nLmggICA9IHNkLnlfaGVpZ2h0OworCisgICAgICAgIHJldHVybiAmY3R4LT5wcmV2aWV3X2ltZzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3VwZGF0ZV9lbnRyb3B5KHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgIGludCBjdHJfaWQsCisgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyAgICBpbnQgdXBkYXRlID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAgdnA4X3VwZGF0ZV9lbnRyb3B5KGN0eC0+Y3BpLCB1cGRhdGUpOworICAgIHJldHVybiBWUFhfQ09ERUNfT0s7CisKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3VwZGF0ZV9yZWZlcmVuY2UodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgaW50IGN0cl9pZCwKKyAgICAgICAgdmFfbGlzdCBhcmdzKQoreworICAgIGludCB1cGRhdGUgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICB2cDhfdXBkYXRlX3JlZmVyZW5jZShjdHgtPmNwaSwgdXBkYXRlKTsKKyAgICByZXR1cm4gVlBYX0NPREVDX09LOworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfdXNlX3JlZmVyZW5jZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAorICAgICAgICBpbnQgY3RyX2lkLAorICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisgICAgaW50IHJlZmVyZW5jZV9mbGFnID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAgdnA4X3VzZV9hc19yZWZlcmVuY2UoY3R4LT5jcGksIHJlZmVyZW5jZV9mbGFnKTsKKyAgICByZXR1cm4gVlBYX0NPREVDX09LOworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfc2V0X3JvaV9tYXAodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyAgICB2cHhfcm9pX21hcF90ICpkYXRhID0gdmFfYXJnKGFyZ3MsIHZweF9yb2lfbWFwX3QgKik7CisKKyAgICBpZiAoZGF0YSkKKyAgICB7CisgICAgICAgIHZweF9yb2lfbWFwX3QgKnJvaSA9ICh2cHhfcm9pX21hcF90ICopZGF0YTsKKworICAgICAgICBpZiAoIXZwOF9zZXRfcm9pbWFwKGN0eC0+Y3BpLCByb2ktPnJvaV9tYXAsIHJvaS0+cm93cywgcm9pLT5jb2xzLCByb2ktPmRlbHRhX3EsIHJvaS0+ZGVsdGFfbGYsIHJvaS0+c3RhdGljX3RocmVzaG9sZCkpCisgICAgICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworfQorCisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfYWN0aXZlbWFwKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgIGludCBjdHJfaWQsCisgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyAgICB2cHhfYWN0aXZlX21hcF90ICpkYXRhID0gdmFfYXJnKGFyZ3MsIHZweF9hY3RpdmVfbWFwX3QgKik7CisKKyAgICBpZiAoZGF0YSkKKyAgICB7CisKKyAgICAgICAgdnB4X2FjdGl2ZV9tYXBfdCAqbWFwID0gKHZweF9hY3RpdmVfbWFwX3QgKilkYXRhOworCisgICAgICAgIGlmICghdnA4X3NldF9hY3RpdmVfbWFwKGN0eC0+Y3BpLCBtYXAtPmFjdGl2ZV9tYXAsIG1hcC0+cm93cywgbWFwLT5jb2xzKSkKKyAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfc2NhbGVtb2RlKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgIGludCBjdHJfaWQsCisgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKworICAgIHZweF9zY2FsaW5nX21vZGVfdCAqZGF0YSA9ICB2YV9hcmcoYXJncywgdnB4X3NjYWxpbmdfbW9kZV90ICopOworCisgICAgaWYgKGRhdGEpCisgICAgeworICAgICAgICBpbnQgcmVzOworICAgICAgICB2cHhfc2NhbGluZ19tb2RlX3Qgc2NhbGVtb2RlID0gKih2cHhfc2NhbGluZ19tb2RlX3QgKilkYXRhIDsKKyAgICAgICAgcmVzID0gdnA4X3NldF9pbnRlcm5hbF9zaXplKGN0eC0+Y3BpLCBzY2FsZW1vZGUuaF9zY2FsaW5nX21vZGUsIHNjYWxlbW9kZS52X3NjYWxpbmdfbW9kZSk7CisKKyAgICAgICAgaWYgKCFyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qZm9yY2UgbmV4dCBmcmFtZSBhIGtleSBmcmFtZSB0byBlZmZlY3Qgc2NhbGluZyBtb2RlICovCisgICAgICAgICAgICBjdHgtPm5leHRfZnJhbWVfZmxhZyB8PSBGUkFNRUZMQUdTX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKK30KKworCitzdGF0aWMgdnB4X2NvZGVjX2N0cmxfZm5fbWFwX3QgdnA4ZV9jdGZfbWFwc1tdID0KK3sKKyAgICB7VlA4X1NFVF9SRUZFUkVOQ0UsICAgICAgICAgICAgICAgICB2cDhlX3NldF9yZWZlcmVuY2V9LAorICAgIHtWUDhfQ09QWV9SRUZFUkVOQ0UsICAgICAgICAgICAgICAgIHZwOGVfZ2V0X3JlZmVyZW5jZX0sCisgICAge1ZQOF9TRVRfUE9TVFBST0MsICAgICAgICAgICAgICAgICAgdnA4ZV9zZXRfcHJldmlld3BwfSwKKyAgICB7VlA4RV9VUERfRU5UUk9QWSwgICAgICAgICAgICAgICAgICB2cDhlX3VwZGF0ZV9lbnRyb3B5fSwKKyAgICB7VlA4RV9VUERfUkVGRVJFTkNFLCAgICAgICAgICAgICAgICB2cDhlX3VwZGF0ZV9yZWZlcmVuY2V9LAorICAgIHtWUDhFX1VTRV9SRUZFUkVOQ0UsICAgICAgICAgICAgICAgIHZwOGVfdXNlX3JlZmVyZW5jZX0sCisgICAge1ZQOEVfU0VUX1JPSV9NQVAsICAgICAgICAgICAgICAgICAgdnA4ZV9zZXRfcm9pX21hcH0sCisgICAge1ZQOEVfU0VUX0FDVElWRU1BUCwgICAgICAgICAgICAgICAgdnA4ZV9zZXRfYWN0aXZlbWFwfSwKKyAgICB7VlA4RV9TRVRfU0NBTEVNT0RFLCAgICAgICAgICAgICAgICB2cDhlX3NldF9zY2FsZW1vZGV9LAorICAgIHtWUDhFX1NFVF9DUFVVU0VELCAgICAgICAgICAgICAgICAgIHNldF9wYXJhbX0sCisgICAge1ZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZLCAgICAgICAgc2V0X3BhcmFtfSwKKyAgICB7VlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwgICAgICAgICBzZXRfcGFyYW19LAorICAgIHtWUDhFX1NFVF9TSEFSUE5FU1MsICAgICAgICAgICAgICAgIHNldF9wYXJhbX0sCisgICAge1ZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsICAgICAgICAgc2V0X3BhcmFtfSwKKyAgICB7VlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywgICAgICAgICBzZXRfcGFyYW19LAorICAgIHtWUDhFX0dFVF9MQVNUX1FVQU5USVpFUiwgICAgICAgICAgIGdldF9wYXJhbX0sCisgICAge1ZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSXzY0LCAgICAgICAgZ2V0X3BhcmFtfSwKKyAgICB7VlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsICAgICAgICAgICBzZXRfcGFyYW19LAorICAgIHtWUDhFX1NFVF9BUk5SX1NUUkVOR1RIICwgICAgICAgICAgIHNldF9wYXJhbX0sCisgICAge1ZQOEVfU0VUX0FSTlJfVFlQRSAgICAgLCAgICAgICAgICAgc2V0X3BhcmFtfSwKKyAgICB7VlA4RV9TRVRfVFVOSU5HLCAgICAgICAgICAgICAgICAgICBzZXRfcGFyYW19LAorICAgIHtWUDhFX1NFVF9DUV9MRVZFTCwgICAgICAgICAgICAgICAgIHNldF9wYXJhbX0sCisgICAge1ZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwgICAgc2V0X3BhcmFtfSwKKyAgICB7IC0xLCBOVUxMfSwKK307CisKK3N0YXRpYyB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCB2cDhlX3VzYWdlX2NmZ19tYXBbXSA9Cit7CisgICAgeworICAgIDAsCisgICAgeworICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIGdfdXNhZ2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiBnX3RocmVhZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiBnX3Byb2ZpbGUgKi8KKworICAgICAgICAzMjAsICAgICAgICAgICAgICAgIC8qIGdfd2lkdGggKi8KKyAgICAgICAgMjQwLCAgICAgICAgICAgICAgICAvKiBnX2hlaWdodCAqLworICAgICAgICB7MSwgMzB9LCAgICAgICAgICAgIC8qIGdfdGltZWJhc2UgKi8KKworICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIGdfZXJyb3JfcmVzaWxpZW50ICovCisKKyAgICAgICAgVlBYX1JDX09ORV9QQVNTLCAgICAvKiBnX3Bhc3MgKi8KKworICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIGdfbGFnX2luX2ZyYW1lcyAqLworCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogcmNfZHJvcGZyYW1lX3RocmVzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHJjX3Jlc2l6ZV9hbGxvd2VkICovCisgICAgICAgIDYwLCAgICAgICAgICAgICAgICAgLyogcmNfcmVzaXplX2Rvd25fdGhyZXNvbGQgKi8KKyAgICAgICAgMzAsICAgICAgICAgICAgICAgICAvKiByY19yZXNpemVfdXBfdGhyZXNvbGQgKi8KKworICAgICAgICBWUFhfVkJSLCAgICAgICAgICAgIC8qIHJjX2VuZF91c2FnZSAqLworI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID4gKDEgKyBWUFhfQ09ERUNfQUJJX1ZFUlNJT04pCisgICAgICAgIHswfSwgICAgICAgICAgICAgICAgLyogcmNfdHdvcGFzc19zdGF0c19pbiAqLworI2VuZGlmCisgICAgICAgIDI1NiwgICAgICAgICAgICAgICAgLyogcmNfdGFyZ2V0X2JhbmR3aWR0aCAqLworICAgICAgICA0LCAgICAgICAgICAgICAgICAgIC8qIHJjX21pbl9xdWFudGl6ZXIgKi8KKyAgICAgICAgNjMsICAgICAgICAgICAgICAgICAvKiByY19tYXhfcXVhbnRpemVyICovCisgICAgICAgIDEwMCwgICAgICAgICAgICAgICAgLyogcmNfdW5kZXJzaG9vdF9wY3QgKi8KKyAgICAgICAgMTAwLCAgICAgICAgICAgICAgICAvKiByY19vdmVyc2hvb3RfcGN0ICovCisKKyAgICAgICAgNjAwMCwgICAgICAgICAgICAgICAvKiByY19tYXhfYnVmZmVyX3NpemUgKi8KKyAgICAgICAgNDAwMCwgICAgICAgICAgICAgICAvKiByY19idWZmZXJfaW5pdGlhbF9zaXplOyAqLworICAgICAgICA1MDAwLCAgICAgICAgICAgICAgIC8qIHJjX2J1ZmZlcl9vcHRpbWFsX3NpemU7ICovCisKKyAgICAgICAgNTAsICAgICAgICAgICAgICAgICAvKiByY190d29fcGFzc192YnJiaWFzICAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHJjX3R3b19wYXNzX3Zicm1pbl9zZWN0aW9uICovCisgICAgICAgIDQwMCwgICAgICAgICAgICAgICAgLyogcmNfdHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24gKi8KKworICAgICAgICAvKiBrZXlmcmFtaW5nIHNldHRpbmdzIChrZikgKi8KKyAgICAgICAgVlBYX0tGX0FVVE8sICAgICAgICAvKiBnX2tmbW9kZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyoga2ZfbWluX2Rpc3QgKi8KKyAgICAgICAgMTI4LCAgICAgICAgICAgICAgICAvKiBrZl9tYXhfZGlzdCAqLworCisjaWYgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04gPT0gKDEgKyBWUFhfQ09ERUNfQUJJX1ZFUlNJT04pCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgLyogZ19kZWxldGVfZmlyc3RfcGFzc19maWxlICovCisgICAgICAgICJ2cDguZnBmIiAgICAgICAgICAgLyogZmlyc3QgcGFzcyBmaWxlbmFtZSAqLworI2VuZGlmCisKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAvKiB0c19udW1iZXJfbGF5ZXJzICovCisgICAgICAgIHswfSwgICAgICAgICAgICAgICAgLyogdHNfdGFyZ2V0X2JpdHJhdGUgKi8KKyAgICAgICAgezB9LCAgICAgICAgICAgICAgICAvKiB0c19yYXRlX2RlY2ltYXRvciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRzX3BlcmlvZGljaXR5ICovCisgICAgICAgIHswfSwgICAgICAgICAgICAgICAgLyogdHNfbGF5ZXJfaWQgKi8KKyAgICB9fSwKKyAgICB7IC0xLCB7Tk9UX0lNUExFTUVOVEVEfX0KK307CisKKworI2lmbmRlZiBWRVJTSU9OX1NUUklORworI2RlZmluZSBWRVJTSU9OX1NUUklORworI2VuZGlmCitDT0RFQ19JTlRFUkZBQ0UodnB4X2NvZGVjX3ZwOF9jeCkgPQoreworICAgICJXZWJNIFByb2plY3QgVlA4IEVuY29kZXIiIFZFUlNJT05fU1RSSU5HLAorICAgIFZQWF9DT0RFQ19JTlRFUk5BTF9BQklfVkVSU0lPTiwKKyAgICBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIgfCBWUFhfQ09ERUNfQ0FQX1BTTlIgfAorICAgIFZQWF9DT0RFQ19DQVBfT1VUUFVUX1BBUlRJVElPTiwKKyAgICAvKiB2cHhfY29kZWNfY2Fwc190ICAgICAgICAgIGNhcHM7ICovCisgICAgdnA4ZV9pbml0LCAgICAgICAgICAvKiB2cHhfY29kZWNfaW5pdF9mbl90ICAgICAgIGluaXQ7ICovCisgICAgdnA4ZV9kZXN0cm95LCAgICAgICAvKiB2cHhfY29kZWNfZGVzdHJveV9mbl90ICAgIGRlc3Ryb3k7ICovCisgICAgdnA4ZV9jdGZfbWFwcywgICAgICAvKiB2cHhfY29kZWNfY3RybF9mbl9tYXBfdCAgKmN0cmxfbWFwczsgKi8KKyAgICBOT1RfSU1QTEVNRU5URUQsICAgIC8qIHZweF9jb2RlY19nZXRfbW1hcF9mbl90ICAgZ2V0X21tYXA7ICovCisgICAgTk9UX0lNUExFTUVOVEVELCAgICAvKiB2cHhfY29kZWNfc2V0X21tYXBfZm5fdCAgIHNldF9tbWFwOyAqLworICAgIHsKKyAgICAgICAgTk9UX0lNUExFTUVOVEVELCAgICAvKiB2cHhfY29kZWNfcGVla19zaV9mbl90ICAgIHBlZWtfc2k7ICovCisgICAgICAgIE5PVF9JTVBMRU1FTlRFRCwgICAgLyogdnB4X2NvZGVjX2dldF9zaV9mbl90ICAgICBnZXRfc2k7ICovCisgICAgICAgIE5PVF9JTVBMRU1FTlRFRCwgICAgLyogdnB4X2NvZGVjX2RlY29kZV9mbl90ICAgICBkZWNvZGU7ICovCisgICAgICAgIE5PVF9JTVBMRU1FTlRFRCwgICAgLyogdnB4X2NvZGVjX2ZyYW1lX2dldF9mbl90ICBmcmFtZV9nZXQ7ICovCisgICAgfSwKKyAgICB7CisgICAgICAgIHZwOGVfdXNhZ2VfY2ZnX21hcCwgLyogdnB4X2NvZGVjX2VuY19jZmdfbWFwX3QgICAgcGVla19zaTsgKi8KKyAgICAgICAgdnA4ZV9lbmNvZGUsICAgICAgICAvKiB2cHhfY29kZWNfZW5jb2RlX2ZuX3QgICAgICBlbmNvZGU7ICovCisgICAgICAgIHZwOGVfZ2V0X2N4ZGF0YSwgICAgLyogdnB4X2NvZGVjX2dldF9jeF9kYXRhX2ZuX3QgICBmcmFtZV9nZXQ7ICovCisgICAgICAgIHZwOGVfc2V0X2NvbmZpZywKKyAgICAgICAgTk9UX0lNUExFTUVOVEVELAorICAgICAgICB2cDhlX2dldF9wcmV2aWV3LAorICAgICAgICB2cDhlX21yX2FsbG9jX21lbSwKKyAgICB9IC8qIGVuY29kZXIgZnVuY3Rpb25zICovCit9OwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC92cDhfZHhfaWZhY2UuYyBiL2xpYnZweC92cDgvdnA4X2R4X2lmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZDY5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvdnA4X2R4X2lmYWNlLmMKQEAgLTAsMCArMSw5MDIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidnB4X3J0Y2QuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKyNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCisjaW5jbHVkZSAidnB4X3ZlcnNpb24uaCIKKyNpbmNsdWRlICJjb21tb24vb255eGQuaCIKKyNpbmNsdWRlICJkZWNvZGVyL29ueXhkX2ludC5oIgorI2luY2x1ZGUgImNvbW1vbi9hbGxvY2NvbW1vbi5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2lmIENPTkZJR19FUlJPUl9DT05DRUFMTUVOVAorI2luY2x1ZGUgImRlY29kZXIvZXJyb3JfY29uY2VhbG1lbnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgImRlY29kZXIvZGVjb2RlcnRocmVhZGluZy5oIgorCisjZGVmaW5lIFZQOF9DQVBfUE9TVFBST0MgKENPTkZJR19QT1NUUFJPQyA/IFZQWF9DT0RFQ19DQVBfUE9TVFBST0MgOiAwKQorI2RlZmluZSBWUDhfQ0FQX0VSUk9SX0NPTkNFQUxNRU5UIChDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfQ09ERUNfQ0FQX0VSUk9SX0NPTkNFQUxNRU5UIDogMCkKKwordHlwZWRlZiB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAgdnA4X3N0cmVhbV9pbmZvX3Q7CisKKy8qIFN0cnVjdHVyZXMgZm9yIGhhbmRsaW5nIG1lbW9yeSBhbGxvY2F0aW9ucyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVlA4X1NFR19BTEdfUFJJViAgICAgPSAyNTYsCisgICAgVlA4X1NFR19NQVgKK30gbWVtX3NlZ19pZF90OworI2RlZmluZSBORUxFTUVOVFMoeCkgKChpbnQpKHNpemVvZih4KS9zaXplb2YoeFswXSkpKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2cDhfcHJpdl9zeihjb25zdCB2cHhfY29kZWNfZGVjX2NmZ190ICpzaSwgdnB4X2NvZGVjX2ZsYWdzX3QpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGludCAgIGlkOworICAgIHVuc2lnbmVkIGxvbmcgIHN6OworICAgIHVuc2lnbmVkIGludCAgIGFsaWduOworICAgIHVuc2lnbmVkIGludCAgIGZsYWdzOworICAgIHVuc2lnbmVkIGxvbmcoKmNhbGNfc3opKGNvbnN0IHZweF9jb2RlY19kZWNfY2ZnX3QgKiwgdnB4X2NvZGVjX2ZsYWdzX3QpOworfSBtZW1fcmVxX3Q7CisKK3N0YXRpYyBjb25zdCBtZW1fcmVxX3QgdnA4X21lbV9yZXFfc2Vnc1tdID0KK3sKKyAgICB7VlA4X1NFR19BTEdfUFJJViwgICAgMCwgOCwgVlBYX0NPREVDX01FTV9aRVJPLCB2cDhfcHJpdl9zen0sCisgICAge1ZQOF9TRUdfTUFYLCAwLCAwLCAwLCBOVUxMfQorfTsKKworc3RydWN0IHZweF9jb2RlY19hbGdfcHJpdgoreworICAgIHZweF9jb2RlY19wcml2X3QgICAgICAgIGJhc2U7CisgICAgdnB4X2NvZGVjX21tYXBfdCAgICAgICAgbW1hcHNbTkVMRU1FTlRTKHZwOF9tZW1fcmVxX3NlZ3MpLTFdOworICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgICAgIGNmZzsKKyAgICB2cDhfc3RyZWFtX2luZm9fdCAgICAgICBzaTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkZWZlcl9hbGxvYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX2luaXQ7CisgICAgc3RydWN0IFZQOERfQ09NUCAgICAgICAqcGJpOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jX2NmZ19zZXQ7CisgICAgdnA4X3Bvc3Rwcm9jX2NmZ190ICAgICAgcG9zdHByb2NfY2ZnOworI2lmIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgZGJnX3Bvc3Rwcm9jX2ZsYWc7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZGJnX2NvbG9yX3JlZl9mcmFtZV9mbGFnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGRiZ19jb2xvcl9tYl9tb2Rlc19mbGFnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGRiZ19jb2xvcl9iX21vZGVzX2ZsYWc7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZGJnX2Rpc3BsYXlfbXZfZmxhZzsKKyNlbmRpZgorICAgIHZweF9pbWFnZV90ICAgICAgICAgICAgIGltZzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpbWdfc2V0dXA7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdjsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZwOF9wcml2X3N6KGNvbnN0IHZweF9jb2RlY19kZWNfY2ZnX3QgKnNpLCB2cHhfY29kZWNfZmxhZ3NfdCBmbGFncykKK3sKKyAgICAvKiBBbHRob3VnaCB0aGlzIGRlY2xhcmF0aW9uIGlzIGNvbnN0YW50LCB3ZSBjYW4ndCB1c2UgaXQgaW4gdGhlIHJlcXVlc3RlZAorICAgICAqIHNlZ21lbnRzIGxpc3QgYmVjYXVzZSB3ZSB3YW50IHRvIGRlZmluZSB0aGUgcmVxdWVzdGVkIHNlZ21lbnRzIGxpc3QKKyAgICAgKiBiZWZvcmUgZGVmaW5pbmcgdGhlIHByaXZhdGUgdHlwZSAoc28gdGhhdCB0aGUgbnVtYmVyIG9mIG1lbW9yeSBtYXBzIGlzCisgICAgICoga25vd24pCisgICAgICovCisgICAgKHZvaWQpc2k7CisgICAgcmV0dXJuIHNpemVvZih2cHhfY29kZWNfYWxnX3ByaXZfdCk7Cit9CisKKworc3RhdGljIHZvaWQgdnA4X21tYXBfZHRvcih2cHhfY29kZWNfbW1hcF90ICptbWFwKQoreworICAgIGZyZWUobW1hcC0+cHJpdik7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X21tYXBfYWxsb2ModnB4X2NvZGVjX21tYXBfdCAqbW1hcCkKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgIHJlczsKKyAgICB1bnNpZ25lZCBpbnQgICBhbGlnbjsKKworICAgIGFsaWduID0gbW1hcC0+YWxpZ24gPyBtbWFwLT5hbGlnbiAtIDEgOiAwOworCisgICAgaWYgKG1tYXAtPmZsYWdzICYgVlBYX0NPREVDX01FTV9aRVJPKQorICAgICAgICBtbWFwLT5wcml2ID0gY2FsbG9jKDEsIG1tYXAtPnN6ICsgYWxpZ24pOworICAgIGVsc2UKKyAgICAgICAgbW1hcC0+cHJpdiA9IG1hbGxvYyhtbWFwLT5zeiArIGFsaWduKTsKKworICAgIHJlcyA9IChtbWFwLT5wcml2KSA/IFZQWF9DT0RFQ19PSyA6IFZQWF9DT0RFQ19NRU1fRVJST1I7CisgICAgbW1hcC0+YmFzZSA9ICh2b2lkICopKCgoKHVpbnRwdHJfdCltbWFwLT5wcml2KSArIGFsaWduKSAmIH4odWludHB0cl90KWFsaWduKTsKKyAgICBtbWFwLT5kdG9yID0gdnA4X21tYXBfZHRvcjsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF92YWxpZGF0ZV9tbWFwcyhjb25zdCB2cDhfc3RyZWFtX2luZm9fdCAqc2ksCisgICAgICAgIGNvbnN0IHZweF9jb2RlY19tbWFwX3QgICAgICAgICptbWFwcywKKyAgICAgICAgdnB4X2NvZGVjX2ZsYWdzX3QgICAgICAgICAgICAgIGluaXRfZmxhZ3MpCit7CisgICAgaW50IGk7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IFZQWF9DT0RFQ19PSzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBORUxFTUVOVFModnA4X21lbV9yZXFfc2VncykgLSAxOyBpKyspCisgICAgeworICAgICAgICAvKiBFbnN1cmUgdGhlIHNlZ21lbnQgaGFzIGJlZW4gYWxsb2NhdGVkICovCisgICAgICAgIGlmICghbW1hcHNbaV0uYmFzZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX01FTV9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogVmVyaWZ5IHZhcmlhYmxlIHNpemUgc2VnbWVudCBpcyBiaWcgZW5vdWdoIGZvciB0aGUgY3VycmVudCBzaS4gKi8KKyAgICAgICAgaWYgKHZwOF9tZW1fcmVxX3NlZ3NbaV0uY2FsY19zeikKKyAgICAgICAgeworICAgICAgICAgICAgdnB4X2NvZGVjX2RlY19jZmdfdCBjZmc7CisKKyAgICAgICAgICAgIGNmZy53ID0gc2ktPnc7CisgICAgICAgICAgICBjZmcuaCA9IHNpLT5oOworCisgICAgICAgICAgICBpZiAobW1hcHNbaV0uc3ogPCB2cDhfbWVtX3JlcV9zZWdzW2ldLmNhbGNfc3ooJmNmZywgaW5pdF9mbGFncykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX01FTV9FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9pbml0X2N0eCh2cHhfY29kZWNfY3R4X3QgKmN0eCwgY29uc3QgdnB4X2NvZGVjX21tYXBfdCAqbW1hcCkKK3sKKyAgICBpbnQgaTsKKworICAgIGN0eC0+cHJpdiA9IG1tYXAtPmJhc2U7CisgICAgY3R4LT5wcml2LT5zeiA9IHNpemVvZigqY3R4LT5wcml2KTsKKyAgICBjdHgtPnByaXYtPmlmYWNlID0gY3R4LT5pZmFjZTsKKyAgICBjdHgtPnByaXYtPmFsZ19wcml2ID0gbW1hcC0+YmFzZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBORUxFTUVOVFMoY3R4LT5wcml2LT5hbGdfcHJpdi0+bW1hcHMpOyBpKyspCisgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzW2ldLmlkID0gdnA4X21lbV9yZXFfc2Vnc1tpXS5pZDsKKworICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzWzBdID0gKm1tYXA7CisgICAgY3R4LT5wcml2LT5hbGdfcHJpdi0+c2kuc3ogPSBzaXplb2YoY3R4LT5wcml2LT5hbGdfcHJpdi0+c2kpOworICAgIGN0eC0+cHJpdi0+aW5pdF9mbGFncyA9IGN0eC0+aW5pdF9mbGFnczsKKworICAgIGlmIChjdHgtPmNvbmZpZy5kZWMpCisgICAgeworICAgICAgICAvKiBVcGRhdGUgdGhlIHJlZmVyZW5jZSB0byB0aGUgY29uZmlnIHN0cnVjdHVyZSB0byBhbiBpbnRlcm5hbCBjb3B5LiAqLworICAgICAgICBjdHgtPnByaXYtPmFsZ19wcml2LT5jZmcgPSAqY3R4LT5jb25maWcuZGVjOworICAgICAgICBjdHgtPmNvbmZpZy5kZWMgPSAmY3R4LT5wcml2LT5hbGdfcHJpdi0+Y2ZnOworICAgIH0KK30KKworc3RhdGljIHZvaWQgKm1tYXBfbGt1cCh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LCB1bnNpZ25lZCBpbnQgaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkVMRU1FTlRTKGN0eC0+bW1hcHMpOyBpKyspCisgICAgICAgIGlmIChjdHgtPm1tYXBzW2ldLmlkID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIGN0eC0+bW1hcHNbaV0uYmFzZTsKKworICAgIHJldHVybiBOVUxMOworfQorc3RhdGljIHZvaWQgdnA4X2ZpbmFsaXplX21tYXBzKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgpCit7CisgICAgLyogbm90aGluZyB0byBjbGVhbiB1cCAqLworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9pbml0KHZweF9jb2RlY19jdHhfdCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfcHJpdl9lbmNfbXJfY2ZnX3QgKmRhdGEpCit7CisgICAgdnB4X2NvZGVjX2Vycl90ICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7CisgICAgKHZvaWQpIGRhdGE7CisKKyAgICB2cHhfcnRjZCgpOworCisgICAgLyogVGhpcyBmdW5jdGlvbiBvbmx5IGFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIHZweF9jb2RlY19hbGdfcHJpdl90CisgICAgICogc3RydWN0dXJlLiBNb3JlIG1lbW9yeSBtYXkgYmUgcmVxdWlyZWQgYXQgdGhlIHRpbWUgdGhlIHN0cmVhbQorICAgICAqIGluZm9ybWF0aW9uIGJlY29tZXMga25vd24uCisgICAgICovCisgICAgaWYgKCFjdHgtPnByaXYpCisgICAgeworICAgICAgICB2cHhfY29kZWNfbW1hcF90IG1tYXA7CisKKyAgICAgICAgbW1hcC5pZCA9IHZwOF9tZW1fcmVxX3NlZ3NbMF0uaWQ7CisgICAgICAgIG1tYXAuc3ogPSBzaXplb2YodnB4X2NvZGVjX2FsZ19wcml2X3QpOworICAgICAgICBtbWFwLmFsaWduID0gdnA4X21lbV9yZXFfc2Vnc1swXS5hbGlnbjsKKyAgICAgICAgbW1hcC5mbGFncyA9IHZwOF9tZW1fcmVxX3NlZ3NbMF0uZmxhZ3M7CisKKyAgICAgICAgcmVzID0gdnA4X21tYXBfYWxsb2MoJm1tYXApOworCisgICAgICAgIGlmICghcmVzKQorICAgICAgICB7CisgICAgICAgICAgICB2cDhfaW5pdF9jdHgoY3R4LCAmbW1hcCk7CisKKyAgICAgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPmRlZmVyX2FsbG9jID0gMTsKKyAgICAgICAgICAgIC8qcG9zdCBwcm9jZXNzaW5nIGxldmVsIGluaXRpYWxpemVkIHRvIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X2Rlc3Ryb3kodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCkKK3sKKyAgICBpbnQgaTsKKworICAgIHZwOGR4X3JlbW92ZV9kZWNvbXByZXNzb3IoY3R4LT5wYmkpOworCisgICAgZm9yIChpID0gTkVMRU1FTlRTKGN0eC0+bW1hcHMpIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgICBpZiAoY3R4LT5tbWFwc1tpXS5kdG9yKQorICAgICAgICAgICAgY3R4LT5tbWFwc1tpXS5kdG9yKCZjdHgtPm1tYXBzW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gVlBYX0NPREVDX09LOworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9wZWVrX3NpKGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBkYXRhX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IFZQWF9DT0RFQ19PSzsKKworICAgIGlmKGRhdGEgKyBkYXRhX3N6IDw9IGRhdGEpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFBhcnNlIHVuY29tcHJlc3NzZWQgcGFydCBvZiBrZXkgZnJhbWUgaGVhZGVyLgorICAgICAgICAgKiAzIGJ5dGVzOi0gaW5jbHVkaW5nIHZlcnNpb24sIGZyYW1lIHR5cGUgYW5kIGFuIG9mZnNldAorICAgICAgICAgKiAzIGJ5dGVzOi0gc3luYyBjb2RlICgweDlkLCAweDAxLCAweDJhKQorICAgICAgICAgKiA0IGJ5dGVzOi0gaW5jbHVkaW5nIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgaW4gdGhlIGxvd2VzdCAxNCBiaXRzCisgICAgICAgICAqICAgICAgICAgICBvZiBlYWNoIDItYnl0ZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHNpLT5pc19rZiA9IDA7CisKKyAgICAgICAgaWYgKGRhdGFfc3ogPj0gMTAgJiYgIShkYXRhWzBdICYgMHgwMSkpICAvKiBJLUZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMgPSBkYXRhICsgMzsKKyAgICAgICAgICAgIHNpLT5pc19rZiA9IDE7CisKKyAgICAgICAgICAgIC8qIHZldCB2aWEgc3luYyBjb2RlICovCisgICAgICAgICAgICBpZiAoY1swXSAhPSAweDlkIHx8IGNbMV0gIT0gMHgwMSB8fCBjWzJdICE9IDB4MmEpCisgICAgICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKworICAgICAgICAgICAgc2ktPncgPSAoY1szXSB8IChjWzRdIDw8IDgpKSAmIDB4M2ZmZjsKKyAgICAgICAgICAgIHNpLT5oID0gKGNbNV0gfCAoY1s2XSA8PCA4KSkgJiAweDNmZmY7CisKKyAgICAgICAgICAgIC8qcHJpbnRmKCJ3PSVkLCBoPSVkXG4iLCBzaS0+dywgc2ktPmgpOyovCisgICAgICAgICAgICBpZiAoIShzaS0+aCB8IHNpLT53KSkKKyAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfVU5TVVBfQklUU1RSRUFNOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19VTlNVUF9CSVRTVFJFQU07CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKKworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9nZXRfc2kodnB4X2NvZGVjX2FsZ19wcml2X3QgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpCit7CisKKyAgICB1bnNpZ25lZCBpbnQgc3o7CisKKyAgICBpZiAoc2ktPnN6ID49IHNpemVvZih2cDhfc3RyZWFtX2luZm9fdCkpCisgICAgICAgIHN6ID0gc2l6ZW9mKHZwOF9zdHJlYW1faW5mb190KTsKKyAgICBlbHNlCisgICAgICAgIHN6ID0gc2l6ZW9mKHZweF9jb2RlY19zdHJlYW1faW5mb190KTsKKworICAgIG1lbWNweShzaSwgJmN0eC0+c2ksIHN6KTsKKyAgICBzaS0+c3ogPSBzejsKKworICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Cit9CisKKworc3RhdGljIHZweF9jb2RlY19lcnJfdAordXBkYXRlX2Vycm9yX3N0YXRlKHZweF9jb2RlY19hbGdfcHJpdl90ICAgICAgICAgICAgICAgICAqY3R4LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbyAqZXJyb3IpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlczsKKworICAgIGlmICgocmVzID0gZXJyb3ItPmVycm9yX2NvZGUpKQorICAgICAgICBjdHgtPmJhc2UuZXJyX2RldGFpbCA9IGVycm9yLT5oYXNfZGV0YWlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnJvci0+ZGV0YWlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgeXV2Y29uZmlnMmltYWdlKHZweF9pbWFnZV90ICAgICAgICAgICAgICAgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBZVjEyX0JVRkZFUl9DT05GSUcgICp5djEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdikKK3sKKyAgICAvKiogdnB4X2ltZ193cmFwKCkgZG9lc24ndCBhbGxvdyBzcGVjaWZ5aW5nIGluZGVwZW5kZW50IHN0cmlkZXMgZm9yCisgICAgICAqIHRoZSBZLCBVLCBhbmQgViBwbGFuZXMsIG5vciBvdGhlciBhbGlnbm1lbnQgYWRqdXN0bWVudHMgdGhhdAorICAgICAgKiBtaWdodCBiZSByZXByZXNlbnRhYmxlIGJ5IGEgWVYxMl9CVUZGRVJfQ09ORklHLCBzbyB3ZSBqdXN0CisgICAgICAqIGluaXRpYWxpemUgYWxsIHRoZSBmaWVsZHMuKi8KKyAgICBpbWctPmZtdCA9IHl2MTItPmNscnR5cGUgPT0gUkVHX1lVViA/CisgICAgICAgIFZQWF9JTUdfRk1UX0k0MjAgOiBWUFhfSU1HX0ZNVF9WUFhJNDIwOworICAgIGltZy0+dyA9IHl2MTItPnlfc3RyaWRlOworICAgIGltZy0+aCA9ICh5djEyLT55X2hlaWdodCArIDIgKiBWUDhCT1JERVJJTlBJWEVMUyArIDE1KSAmIH4xNTsKKyAgICBpbWctPmRfdyA9IHl2MTItPnlfd2lkdGg7CisgICAgaW1nLT5kX2ggPSB5djEyLT55X2hlaWdodDsKKyAgICBpbWctPnhfY2hyb21hX3NoaWZ0ID0gMTsKKyAgICBpbWctPnlfY2hyb21hX3NoaWZ0ID0gMTsKKyAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV0gPSB5djEyLT55X2J1ZmZlcjsKKyAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVV0gPSB5djEyLT51X2J1ZmZlcjsKKyAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVl0gPSB5djEyLT52X2J1ZmZlcjsKKyAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfQUxQSEFdID0gTlVMTDsKKyAgICBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV0gPSB5djEyLT55X3N0cmlkZTsKKyAgICBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV0gPSB5djEyLT51dl9zdHJpZGU7CisgICAgaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdID0geXYxMi0+dXZfc3RyaWRlOworICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9BTFBIQV0gPSB5djEyLT55X3N0cmlkZTsKKyAgICBpbWctPmJwcyA9IDEyOworICAgIGltZy0+dXNlcl9wcml2ID0gdXNlcl9wcml2OworICAgIGltZy0+aW1nX2RhdGEgPSB5djEyLT5idWZmZXJfYWxsb2M7CisgICAgaW1nLT5pbWdfZGF0YV9vd25lciA9IDA7CisgICAgaW1nLT5zZWxmX2FsbG9jZCA9IDA7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X2RlY29kZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgZGF0YV9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdXNlcl9wcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lKQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfT0s7CisgICAgdW5zaWduZWQgaW50IHJlc29sdXRpb25fY2hhbmdlID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdywgaDsKKworICAgIC8qIERldGVybWluZSB0aGUgc3RyZWFtIHBhcmFtZXRlcnMuIE5vdGUgdGhhdCB3ZSByZWx5IG9uIHBlZWtfc2kgdG8KKyAgICAgKiB2YWxpZGF0ZSB0aGF0IHdlIGhhdmUgYSBidWZmZXIgdGhhdCBkb2VzIG5vdCB3cmFwIGFyb3VuZCB0aGUgdG9wCisgICAgICogb2YgdGhlIGhlYXAuCisgICAgICovCisgICAgdyA9IGN0eC0+c2kudzsKKyAgICBoID0gY3R4LT5zaS5oOworCisgICAgcmVzID0gY3R4LT5iYXNlLmlmYWNlLT5kZWMucGVla19zaShkYXRhLCBkYXRhX3N6LCAmY3R4LT5zaSk7CisKKyAgICBpZigocmVzID09IFZQWF9DT0RFQ19VTlNVUF9CSVRTVFJFQU0pICYmICFjdHgtPnNpLmlzX2tmKQorICAgIHsKKyAgICAgICAgLyogdGhlIHBlZWsgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBmb3Igbm9uIGtleWZyYW1lcywgaG93ZXZlciBmb3IKKyAgICAgICAgICogdGhpcyBjYXNlLCBpdCBpcyBub3QgYW4gZXJyb3IgKi8KKyAgICAgICAgcmVzID0gVlBYX0NPREVDX09LOworICAgIH0KKworICAgIGlmKCFjdHgtPmRlY29kZXJfaW5pdCAmJiAhY3R4LT5zaS5pc19rZikKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKworICAgIGlmICgoY3R4LT5zaS5oICE9IGgpIHx8IChjdHgtPnNpLncgIT0gdykpCisgICAgICAgIHJlc29sdXRpb25fY2hhbmdlID0gMTsKKworICAgIC8qIFBlcmZvcm0gZGVmZXJyZWQgYWxsb2NhdGlvbnMsIGlmIHJlcXVpcmVkICovCisgICAgaWYgKCFyZXMgJiYgY3R4LT5kZWZlcl9hbGxvYykKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDE7ICFyZXMgJiYgaSA8IE5FTEVNRU5UUyhjdHgtPm1tYXBzKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKworICAgICAgICAgICAgY2ZnLncgPSBjdHgtPnNpLnc7CisgICAgICAgICAgICBjZmcuaCA9IGN0eC0+c2kuaDsKKyAgICAgICAgICAgIGN0eC0+bW1hcHNbaV0uaWQgPSB2cDhfbWVtX3JlcV9zZWdzW2ldLmlkOworICAgICAgICAgICAgY3R4LT5tbWFwc1tpXS5zeiA9IHZwOF9tZW1fcmVxX3NlZ3NbaV0uc3o7CisgICAgICAgICAgICBjdHgtPm1tYXBzW2ldLmFsaWduID0gdnA4X21lbV9yZXFfc2Vnc1tpXS5hbGlnbjsKKyAgICAgICAgICAgIGN0eC0+bW1hcHNbaV0uZmxhZ3MgPSB2cDhfbWVtX3JlcV9zZWdzW2ldLmZsYWdzOworCisgICAgICAgICAgICBpZiAoIWN0eC0+bW1hcHNbaV0uc3opCisgICAgICAgICAgICAgICAgY3R4LT5tbWFwc1tpXS5zeiA9IHZwOF9tZW1fcmVxX3NlZ3NbaV0uY2FsY19zeigmY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJhc2UuaW5pdF9mbGFncyk7CisKKyAgICAgICAgICAgIHJlcyA9IHZwOF9tbWFwX2FsbG9jKCZjdHgtPm1tYXBzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVzKQorICAgICAgICAgICAgdnA4X2ZpbmFsaXplX21tYXBzKGN0eCk7CisKKyAgICAgICAgY3R4LT5kZWZlcl9hbGxvYyA9IDA7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjb2RlciBpbnN0YW5jZSBvbiB0aGUgZmlyc3QgZnJhbWUqLworICAgIGlmICghcmVzICYmICFjdHgtPmRlY29kZXJfaW5pdCkKKyAgICB7CisgICAgICAgIHJlcyA9IHZwOF92YWxpZGF0ZV9tbWFwcygmY3R4LT5zaSwgY3R4LT5tbWFwcywgY3R4LT5iYXNlLmluaXRfZmxhZ3MpOworCisgICAgICAgIGlmICghcmVzKQorICAgICAgICB7CisgICAgICAgICAgICBWUDhEX0NPTkZJRyBveGNmOworICAgICAgICAgICAgc3RydWN0IFZQOERfQ09NUCogb3B0cjsKKworICAgICAgICAgICAgb3hjZi5XaWR0aCA9IGN0eC0+c2kudzsKKyAgICAgICAgICAgIG94Y2YuSGVpZ2h0ID0gY3R4LT5zaS5oOworICAgICAgICAgICAgb3hjZi5WZXJzaW9uID0gOTsKKyAgICAgICAgICAgIG94Y2YucG9zdHByb2Nlc3MgPSAwOworICAgICAgICAgICAgb3hjZi5tYXhfdGhyZWFkcyA9IGN0eC0+Y2ZnLnRocmVhZHM7CisgICAgICAgICAgICBveGNmLmVycm9yX2NvbmNlYWxtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgKGN0eC0+YmFzZS5pbml0X2ZsYWdzICYgVlBYX0NPREVDX1VTRV9FUlJPUl9DT05DRUFMTUVOVCk7CisgICAgICAgICAgICBveGNmLmlucHV0X2ZyYWdtZW50cyA9CisgICAgICAgICAgICAgICAgICAgIChjdHgtPmJhc2UuaW5pdF9mbGFncyAmIFZQWF9DT0RFQ19VU0VfSU5QVVRfRlJBR01FTlRTKTsKKworICAgICAgICAgICAgb3B0ciA9IHZwOGR4X2NyZWF0ZV9kZWNvbXByZXNzb3IoJm94Y2YpOworCisgICAgICAgICAgICAvKiBJZiBwb3N0cHJvY2Vzc2luZyB3YXMgZW5hYmxlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kIGEKKyAgICAgICAgICAgICAqIGNvbmZpZ3VyYXRpb24gaGFzIG5vdCBiZWVuIHByb3ZpZGVkLCBkZWZhdWx0IGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIWN0eC0+cG9zdHByb2NfY2ZnX3NldAorICAgICAgICAgICAgICAgICYmIChjdHgtPmJhc2UuaW5pdF9mbGFncyAmIFZQWF9DT0RFQ19VU0VfUE9TVFBST0MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0eC0+cG9zdHByb2NfY2ZnLnBvc3RfcHJvY19mbGFnID0KKyAgICAgICAgICAgICAgICAgICAgVlA4X0RFQkxPQ0sgfCBWUDhfREVNQUNST0JMT0NLIHwgVlA4X01GUUU7CisgICAgICAgICAgICAgICAgY3R4LT5wb3N0cHJvY19jZmcuZGVibG9ja2luZ19sZXZlbCA9IDQ7CisgICAgICAgICAgICAgICAgY3R4LT5wb3N0cHJvY19jZmcubm9pc2VfbGV2ZWwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW9wdHIpCisgICAgICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX0VSUk9SOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN0eC0+cGJpID0gb3B0cjsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+ZGVjb2Rlcl9pbml0ID0gMTsKKyAgICB9CisKKyAgICBpZiAoIXJlcyAmJiBjdHgtPnBiaSkKKyAgICB7CisgICAgICAgIGlmKHJlc29sdXRpb25fY2hhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBWUDhEX0NPTVAgKnBiaSA9IGN0eC0+cGJpOworICAgICAgICAgICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOworICAgICAgICAgICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkICA9ICYgcGJpLT5tYjsKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgICAgICAgICAgIGludCBpOworI2VuZGlmCisgICAgICAgICAgICBwYy0+V2lkdGggPSBjdHgtPnNpLnc7CisgICAgICAgICAgICBwYy0+SGVpZ2h0ID0gY3R4LT5zaS5oOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwcmV2X21iX3Jvd3MgPSBwYy0+bWJfcm93czsKKworICAgICAgICAgICAgICAgIGlmIChzZXRqbXAocGJpLT5jb21tb24uZXJyb3Iuam1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8qIHNhbWUgcmV0dXJuIHZhbHVlIGFzIHVzZWQgaW4gdnA4ZHhfcmVjZWl2ZV9jb21wcmVzc2VkX2RhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAocGMtPldpZHRoIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYy0+V2lkdGggPSB3OworICAgICAgICAgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBjLT5lcnJvciwgVlBYX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSB3aWR0aCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYy0+SGVpZ2h0IDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYy0+SGVpZ2h0ID0gaDsKKyAgICAgICAgICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnJhbWUgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZwOF9hbGxvY19mcmFtZV9idWZmZXJzKHBjLCBwYy0+V2lkdGgsIHBjLT5IZWlnaHQpKQorICAgICAgICAgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBjLT5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVycyIpOworCisgICAgICAgICAgICAgICAgeGQtPnByZSA9IHBjLT55djEyX2ZiW3BjLT5sc3RfZmJfaWR4XTsKKyAgICAgICAgICAgICAgICB4ZC0+ZHN0ID0gcGMtPnl2MTJfZmJbcGMtPm5ld19mYl9pZHhdOworCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBiaS0+YWxsb2NhdGVkX2RlY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGJpLT5tYl9yb3dfZGlbaV0ubWJkLmRzdCA9IHBjLT55djEyX2ZiW3BjLT5uZXdfZmJfaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgdnA4X2J1aWxkX2Jsb2NrX2RvZmZzZXRzKCZwYmktPm1iX3Jvd19kaVtpXS5tYmQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHZwOF9idWlsZF9ibG9ja19kb2Zmc2V0cygmcGJpLT5tYik7CisKKyAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxhc3QgZnJhbWUgTU9ERV9JTkZPIGFycmF5ICovCisjaWYgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UCisKKyAgICAgICAgICAgICAgICBpZiAocGJpLT5lY19lbmFibGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb2xkIHByZXZfbWlwIHdhcyByZWxlYXNlZCBieSB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycygpCisgICAgICAgICAgICAgICAgICAgICAqIGNhbGxlZCBpbiB2cDhfYWxsb2NfZnJhbWVfYnVmZmVycygpICovCisgICAgICAgICAgICAgICAgICAgIHBjLT5wcmV2X21pcCA9IHZweF9jYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGMtPm1iX2NvbHMgKyAxKSAqIChwYy0+bWJfcm93cyArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE1PREVfSU5GTykpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghcGMtPnByZXZfbWlwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycyhwYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBjLT5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXN0IGZyYW1lIE1PREVfSU5GTyBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGMtPnByZXZfbWkgPSBwYy0+cHJldl9taXAgKyBwYy0+bW9kZV9pbmZvX3N0cmlkZSArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwOF9hbGxvY19vdmVybGFwX2xpc3RzKHBiaSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBjLT5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG92ZXJsYXAgbGlzdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgZXJyb3IgY29uY2VhbG1lbnQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyNlbmRpZgorCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgICAgICAgICAgICAgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkKQorICAgICAgICAgICAgICAgICAgICB2cDhtdF9hbGxvY190ZW1wX2J1ZmZlcnMocGJpLCBwYy0+V2lkdGgsIHByZXZfbWJfcm93cyk7CisjZWxzZQorICAgICAgICAgICAgICAgICh2b2lkKXByZXZfbWJfcm93czsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYmktPmNvbW1vbi5lcnJvci5zZXRqbXAgPSAwOworCisgICAgICAgICAgICAvKiByZXF1aXJlZCB0byBnZXQgcGFzdCB0aGUgZmlyc3QgZ2V0X2ZyZWVfZmIoKSBjYWxsICovCisgICAgICAgICAgICBjdHgtPnBiaS0+Y29tbW9uLmZiX2lkeF9yZWZfY250WzBdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+dXNlcl9wcml2ID0gdXNlcl9wcml2OworICAgICAgICBpZiAodnA4ZHhfcmVjZWl2ZV9jb21wcmVzc2VkX2RhdGEoY3R4LT5wYmksIGRhdGFfc3osIGRhdGEsIGRlYWRsaW5lKSkKKyAgICAgICAgeworICAgICAgICAgICAgVlA4RF9DT01QICpwYmkgPSAoVlA4RF9DT01QICopY3R4LT5wYmk7CisgICAgICAgICAgICByZXMgPSB1cGRhdGVfZXJyb3Jfc3RhdGUoY3R4LCAmcGJpLT5jb21tb24uZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZweF9pbWFnZV90ICp2cDhfZ2V0X2ZyYW1lKHZweF9jb2RlY19hbGdfcHJpdl90ICAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICAqaXRlcikKK3sKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gTlVMTDsKKworICAgIC8qIGl0ZXIgYWN0cyBhcyBhIGZsaXAgZmxvcCwgc28gYW4gaW1hZ2UgaXMgb25seSByZXR1cm5lZCBvbiB0aGUgZmlyc3QKKyAgICAgKiBjYWxsIHRvIGdldF9mcmFtZS4KKyAgICAgKi8KKyAgICBpZiAoISgqaXRlcikpCisgICAgeworICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgc2Q7CisgICAgICAgIGludDY0X3QgdGltZV9zdGFtcCA9IDAsIHRpbWVfZW5kX3N0YW1wID0gMDsKKyAgICAgICAgdnA4X3BwZmxhZ3NfdCBmbGFncyA9IHswfTsKKworICAgICAgICBpZiAoY3R4LT5iYXNlLmluaXRfZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1BPU1RQUk9DKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFncy5wb3N0X3Byb2NfZmxhZz0gY3R4LT5wb3N0cHJvY19jZmcucG9zdF9wcm9jX2ZsYWcKKyNpZiBDT05GSUdfUE9TVFBST0NfVklTVUFMSVpFUgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChjdHgtPmRiZ19jb2xvcl9yZWZfZnJhbWVfZmxhZyAhPSAwKSA/IFZQOERfREVCVUdfQ0xSX0ZSTV9SRUZfQkxLUyA6IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChjdHgtPmRiZ19jb2xvcl9tYl9tb2Rlc19mbGFnICE9IDApID8gVlA4RF9ERUJVR19DTFJfQkxLX01PREVTIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGN0eC0+ZGJnX2NvbG9yX2JfbW9kZXNfZmxhZyAhPSAwKSA/IFZQOERfREVCVUdfQ0xSX0JMS19NT0RFUyA6IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChjdHgtPmRiZ19kaXNwbGF5X212X2ZsYWcgIT0gMCkgPyBWUDhEX0RFQlVHX0RSQVdfTVYgOiAwKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGZsYWdzLmRlYmxvY2tpbmdfbGV2ZWwgICAgICA9IGN0eC0+cG9zdHByb2NfY2ZnLmRlYmxvY2tpbmdfbGV2ZWw7CisgICAgICAgICAgICBmbGFncy5ub2lzZV9sZXZlbCAgICAgICAgICAgPSBjdHgtPnBvc3Rwcm9jX2NmZy5ub2lzZV9sZXZlbDsKKyNpZiBDT05GSUdfUE9TVFBST0NfVklTVUFMSVpFUgorICAgICAgICAgICAgZmxhZ3MuZGlzcGxheV9yZWZfZnJhbWVfZmxhZz0gY3R4LT5kYmdfY29sb3JfcmVmX2ZyYW1lX2ZsYWc7CisgICAgICAgICAgICBmbGFncy5kaXNwbGF5X21iX21vZGVzX2ZsYWcgPSBjdHgtPmRiZ19jb2xvcl9tYl9tb2Rlc19mbGFnOworICAgICAgICAgICAgZmxhZ3MuZGlzcGxheV9iX21vZGVzX2ZsYWcgID0gY3R4LT5kYmdfY29sb3JfYl9tb2Rlc19mbGFnOworICAgICAgICAgICAgZmxhZ3MuZGlzcGxheV9tdl9mbGFnICAgICAgID0gY3R4LT5kYmdfZGlzcGxheV9tdl9mbGFnOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAoMCA9PSB2cDhkeF9nZXRfcmF3X2ZyYW1lKGN0eC0+cGJpLCAmc2QsICZ0aW1lX3N0YW1wLCAmdGltZV9lbmRfc3RhbXAsICZmbGFncykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHl1dmNvbmZpZzJpbWFnZSgmY3R4LT5pbWcsICZzZCwgY3R4LT51c2VyX3ByaXYpOworCisgICAgICAgICAgICBpbWcgPSAmY3R4LT5pbWc7CisgICAgICAgICAgICAqaXRlciA9IGltZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbWc7Cit9CisKKworc3RhdGljCit2cHhfY29kZWNfZXJyX3QgdnA4X3htYV9nZXRfbW1hcChjb25zdCB2cHhfY29kZWNfY3R4X3QgICAgICAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX21tYXBfdCAgICAgICAgICAgKm1tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAgICAgICAgICAqaXRlcikKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgICAgIHJlczsKKyAgICBjb25zdCBtZW1fcmVxX3QgICpzZWdfaXRlciA9ICppdGVyOworCisgICAgLyogR2V0IGFkZHJlc3Mgb2YgbmV4dCBzZWdtZW50IHJlcXVlc3QgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKCFzZWdfaXRlcikKKyAgICAgICAgICAgIHNlZ19pdGVyID0gdnA4X21lbV9yZXFfc2VnczsKKyAgICAgICAgZWxzZSBpZiAoc2VnX2l0ZXItPmlkICE9IFZQOF9TRUdfTUFYKQorICAgICAgICAgICAgc2VnX2l0ZXIrKzsKKworICAgICAgICAqaXRlciA9ICh2cHhfY29kZWNfaXRlcl90KXNlZ19pdGVyOworCisgICAgICAgIGlmIChzZWdfaXRlci0+aWQgIT0gVlA4X1NFR19NQVgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1tYXAtPmlkID0gc2VnX2l0ZXItPmlkOworICAgICAgICAgICAgbW1hcC0+c3ogPSBzZWdfaXRlci0+c3o7CisgICAgICAgICAgICBtbWFwLT5hbGlnbiA9IHNlZ19pdGVyLT5hbGlnbjsKKyAgICAgICAgICAgIG1tYXAtPmZsYWdzID0gc2VnX2l0ZXItPmZsYWdzOworCisgICAgICAgICAgICBpZiAoIXNlZ19pdGVyLT5zeikKKyAgICAgICAgICAgICAgICBtbWFwLT5zeiA9IHNlZ19pdGVyLT5jYWxjX3N6KGN0eC0+Y29uZmlnLmRlYywgY3R4LT5pbml0X2ZsYWdzKTsKKworICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX09LOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19MSVNUX0VORDsKKyAgICB9CisgICAgd2hpbGUgKCFtbWFwLT5zeiAmJiByZXMgIT0gVlBYX0NPREVDX0xJU1RfRU5EKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X3htYV9zZXRfbW1hcCh2cHhfY29kZWNfY3R4X3QgICAgICAgICAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19tbWFwX3QgICptbWFwKQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfTUVNX0VSUk9SOworICAgIGludCBpLCBkb25lOworCisgICAgaWYgKCFjdHgtPnByaXYpCisgICAgeworICAgICAgICBpZiAobW1hcC0+aWQgPT0gVlA4X1NFR19BTEdfUFJJVikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjdHgtPnByaXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnA4X2luaXRfY3R4KGN0eCwgbW1hcCk7CisgICAgICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZG9uZSA9IDE7CisKKyAgICBpZiAoIXJlcyAmJiBjdHgtPnByaXYtPmFsZ19wcml2KQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5FTEVNRU5UUyhjdHgtPnByaXYtPmFsZ19wcml2LT5tbWFwcyk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzW2ldLmlkID09IG1tYXAtPmlkKQorICAgICAgICAgICAgICAgIGlmICghY3R4LT5wcml2LT5hbGdfcHJpdi0+bW1hcHNbaV0uYmFzZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzW2ldID0gKm1tYXA7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvbmUgJj0gKGN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzW2ldLmJhc2UgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZG9uZSAmJiAhcmVzKQorICAgIHsKKyAgICAgICAgdnA4X2ZpbmFsaXplX21tYXBzKGN0eC0+cHJpdi0+YWxnX3ByaXYpOworICAgICAgICByZXMgPSBjdHgtPmlmYWNlLT5pbml0KGN0eCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCBpbWFnZTJ5dXZjb25maWcoY29uc3QgdnB4X2ltYWdlX3QgICAqaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAqeXYxMikKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKKyAgICB5djEyLT55X2J1ZmZlciA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICB5djEyLT51X2J1ZmZlciA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICB5djEyLT52X2J1ZmZlciA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKworICAgIHl2MTItPnlfd2lkdGggID0gaW1nLT5kX3c7CisgICAgeXYxMi0+eV9oZWlnaHQgPSBpbWctPmRfaDsKKyAgICB5djEyLT51dl93aWR0aCA9IHl2MTItPnlfd2lkdGggLyAyOworICAgIHl2MTItPnV2X2hlaWdodCA9IHl2MTItPnlfaGVpZ2h0IC8gMjsKKworICAgIHl2MTItPnlfc3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgIHl2MTItPnV2X3N0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKworICAgIHl2MTItPmJvcmRlciAgPSAoaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldIC0gaW1nLT5kX3cpIC8gMjsKKyAgICB5djEyLT5jbHJ0eXBlID0gKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX1ZQWEk0MjAgfHwgaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfVlBYWVYxMik7CisKKyAgICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X3NldF9yZWZlcmVuY2UodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgaW50IGN0cl9pZCwKKyAgICAgICAgdmFfbGlzdCBhcmdzKQoreworCisgICAgdnB4X3JlZl9mcmFtZV90ICpkYXRhID0gdmFfYXJnKGFyZ3MsIHZweF9yZWZfZnJhbWVfdCAqKTsKKworICAgIGlmIChkYXRhKQorICAgIHsKKyAgICAgICAgdnB4X3JlZl9mcmFtZV90ICpmcmFtZSA9ICh2cHhfcmVmX2ZyYW1lX3QgKilkYXRhOworICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgc2Q7CisKKyAgICAgICAgaW1hZ2UyeXV2Y29uZmlnKCZmcmFtZS0+aW1nLCAmc2QpOworCisgICAgICAgIHJldHVybiB2cDhkeF9zZXRfcmVmZXJlbmNlKGN0eC0+cGJpLCBmcmFtZS0+ZnJhbWVfdHlwZSwgJnNkKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisKK30KKworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfZ2V0X3JlZmVyZW5jZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAorICAgICAgICBpbnQgY3RyX2lkLAorICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisKKyAgICB2cHhfcmVmX2ZyYW1lX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnB4X3JlZl9mcmFtZV90ICopOworCisgICAgaWYgKGRhdGEpCisgICAgeworICAgICAgICB2cHhfcmVmX2ZyYW1lX3QgKmZyYW1lID0gKHZweF9yZWZfZnJhbWVfdCAqKWRhdGE7CisgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKKworICAgICAgICBpbWFnZTJ5dXZjb25maWcoJmZyYW1lLT5pbWcsICZzZCk7CisKKyAgICAgICAgcmV0dXJuIHZwOGR4X2dldF9yZWZlcmVuY2UoY3R4LT5wYmksIGZyYW1lLT5mcmFtZV90eXBlLCAmc2QpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9zZXRfcG9zdHByb2ModnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyNpZiBDT05GSUdfUE9TVFBST0MKKyAgICB2cDhfcG9zdHByb2NfY2ZnX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnA4X3Bvc3Rwcm9jX2NmZ190ICopOworCisgICAgaWYgKGRhdGEpCisgICAgeworICAgICAgICBjdHgtPnBvc3Rwcm9jX2NmZ19zZXQgPSAxOworICAgICAgICBjdHgtPnBvc3Rwcm9jX2NmZyA9ICooKHZwOF9wb3N0cHJvY19jZmdfdCAqKWRhdGEpOworICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworI2Vsc2UKKyAgICByZXR1cm4gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyNlbmRpZgorfQorCitzdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9zZXRfZGJnX29wdGlvbnModnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RybF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisjaWYgQ09ORklHX1BPU1RQUk9DX1ZJU1VBTElaRVIgJiYgQ09ORklHX1BPU1RQUk9DCisgICAgaW50IGRhdGEgPSB2YV9hcmcoYXJncywgaW50KTsKKworI2RlZmluZSBNQVAoaWQsIHZhcikgY2FzZSBpZDogdmFyID0gZGF0YTsgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGN0cmxfaWQpCisgICAgeworICAgICAgICBNQVAgKFZQOF9TRVRfREJHX0NPTE9SX1JFRl9GUkFNRSwgICBjdHgtPmRiZ19jb2xvcl9yZWZfZnJhbWVfZmxhZyk7CisgICAgICAgIE1BUCAoVlA4X1NFVF9EQkdfQ09MT1JfTUJfTU9ERVMsICAgIGN0eC0+ZGJnX2NvbG9yX21iX21vZGVzX2ZsYWcpOworICAgICAgICBNQVAgKFZQOF9TRVRfREJHX0NPTE9SX0JfTU9ERVMsICAgICBjdHgtPmRiZ19jb2xvcl9iX21vZGVzX2ZsYWcpOworICAgICAgICBNQVAgKFZQOF9TRVRfREJHX0RJU1BMQVlfTVYsICAgICAgICBjdHgtPmRiZ19kaXNwbGF5X212X2ZsYWcpOworICAgIH0KKworICAgIHJldHVybiBWUFhfQ09ERUNfT0s7CisjZWxzZQorICAgIHJldHVybiBWUFhfQ09ERUNfSU5DQVBBQkxFOworI2VuZGlmCit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X2dldF9sYXN0X3JlZl91cGRhdGVzKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RybF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyAgICBpbnQgKnVwZGF0ZV9pbmZvID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKyAgICBWUDhEX0NPTVAgKnBiaSA9IChWUDhEX0NPTVAgKiljdHgtPnBiaTsKKworICAgIGlmICh1cGRhdGVfaW5mbykKKyAgICB7CisgICAgICAgICp1cGRhdGVfaW5mbyA9IHBiaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSAqIChpbnQpIFZQOF9BTFRSX0ZSQU1FCisgICAgICAgICAgICArIHBiaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lICogKGludCkgVlA4X0dPTERfRlJBTUUKKyAgICAgICAgICAgICsgcGJpLT5jb21tb24ucmVmcmVzaF9sYXN0X2ZyYW1lICogKGludCkgVlA4X0xBU1RfRlJBTUU7CisKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Cit9CisKK2V4dGVybiBpbnQgdnA4ZHhfcmVmZXJlbmNlc19idWZmZXIoIFZQOF9DT01NT04gKm9jaSwgaW50IHJlZl9mcmFtZSApOworc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfZ2V0X2xhc3RfcmVmX2ZyYW1lKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0cmxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKQoreworICAgIGludCAqcmVmX2luZm8gPSB2YV9hcmcoYXJncywgaW50ICopOworICAgIFZQOERfQ09NUCAqcGJpID0gKFZQOERfQ09NUCAqKWN0eC0+cGJpOworICAgIFZQOF9DT01NT04gKm9jaSA9ICZwYmktPmNvbW1vbjsKKworICAgIGlmIChyZWZfaW5mbykKKyAgICB7CisgICAgICAgICpyZWZfaW5mbyA9CisgICAgICAgICAgICAodnA4ZHhfcmVmZXJlbmNlc19idWZmZXIoIG9jaSwgQUxUUkVGX0ZSQU1FICk/VlA4X0FMVFJfRlJBTUU6MCkgfAorICAgICAgICAgICAgKHZwOGR4X3JlZmVyZW5jZXNfYnVmZmVyKCBvY2ksIEdPTERFTl9GUkFNRSApP1ZQOF9HT0xEX0ZSQU1FOjApIHwKKyAgICAgICAgICAgICh2cDhkeF9yZWZlcmVuY2VzX2J1ZmZlciggb2NpLCBMQVNUX0ZSQU1FICk/VlA4X0xBU1RfRlJBTUU6MCk7CisKKyAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X2dldF9mcmFtZV9jb3JydXB0ZWQodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0cmxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKworICAgIGludCAqY29ycnVwdGVkID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKworICAgIGlmIChjb3JydXB0ZWQpCisgICAgeworICAgICAgICBWUDhEX0NPTVAgKnBiaSA9IChWUDhEX0NPTVAgKiljdHgtPnBiaTsKKyAgICAgICAgKmNvcnJ1cHRlZCA9IHBiaS0+Y29tbW9uLmZyYW1lX3RvX3Nob3ctPmNvcnJ1cHRlZDsKKworICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworfQorCit2cHhfY29kZWNfY3RybF9mbl9tYXBfdCB2cDhfY3RmX21hcHNbXSA9Cit7CisgICAge1ZQOF9TRVRfUkVGRVJFTkNFLCAgICAgICAgICAgICB2cDhfc2V0X3JlZmVyZW5jZX0sCisgICAge1ZQOF9DT1BZX1JFRkVSRU5DRSwgICAgICAgICAgICB2cDhfZ2V0X3JlZmVyZW5jZX0sCisgICAge1ZQOF9TRVRfUE9TVFBST0MsICAgICAgICAgICAgICB2cDhfc2V0X3Bvc3Rwcm9jfSwKKyAgICB7VlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FLCAgIHZwOF9zZXRfZGJnX29wdGlvbnN9LAorICAgIHtWUDhfU0VUX0RCR19DT0xPUl9NQl9NT0RFUywgICAgdnA4X3NldF9kYmdfb3B0aW9uc30sCisgICAge1ZQOF9TRVRfREJHX0NPTE9SX0JfTU9ERVMsICAgICB2cDhfc2V0X2RiZ19vcHRpb25zfSwKKyAgICB7VlA4X1NFVF9EQkdfRElTUExBWV9NViwgICAgICAgIHZwOF9zZXRfZGJnX29wdGlvbnN9LAorICAgIHtWUDhEX0dFVF9MQVNUX1JFRl9VUERBVEVTLCAgICAgdnA4X2dldF9sYXN0X3JlZl91cGRhdGVzfSwKKyAgICB7VlA4RF9HRVRfRlJBTUVfQ09SUlVQVEVELCAgICAgIHZwOF9nZXRfZnJhbWVfY29ycnVwdGVkfSwKKyAgICB7VlA4RF9HRVRfTEFTVF9SRUZfVVNFRCwgICAgICAgIHZwOF9nZXRfbGFzdF9yZWZfZnJhbWV9LAorICAgIHsgLTEsIE5VTEx9LAorfTsKKworCisjaWZuZGVmIFZFUlNJT05fU1RSSU5HCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HCisjZW5kaWYKK0NPREVDX0lOVEVSRkFDRSh2cHhfY29kZWNfdnA4X2R4KSA9Cit7CisgICAgIldlYk0gUHJvamVjdCBWUDggRGVjb2RlciIgVkVSU0lPTl9TVFJJTkcsCisgICAgVlBYX0NPREVDX0lOVEVSTkFMX0FCSV9WRVJTSU9OLAorICAgIFZQWF9DT0RFQ19DQVBfREVDT0RFUiB8IFZQOF9DQVBfUE9TVFBST0MgfCBWUDhfQ0FQX0VSUk9SX0NPTkNFQUxNRU5UIHwKKyAgICBWUFhfQ09ERUNfQ0FQX0lOUFVUX0ZSQUdNRU5UUywKKyAgICAvKiB2cHhfY29kZWNfY2Fwc190ICAgICAgICAgIGNhcHM7ICovCisgICAgdnA4X2luaXQsICAgICAgICAgLyogdnB4X2NvZGVjX2luaXRfZm5fdCAgICAgICBpbml0OyAqLworICAgIHZwOF9kZXN0cm95LCAgICAgIC8qIHZweF9jb2RlY19kZXN0cm95X2ZuX3QgICAgZGVzdHJveTsgKi8KKyAgICB2cDhfY3RmX21hcHMsICAgICAvKiB2cHhfY29kZWNfY3RybF9mbl9tYXBfdCAgKmN0cmxfbWFwczsgKi8KKyAgICB2cDhfeG1hX2dldF9tbWFwLCAvKiB2cHhfY29kZWNfZ2V0X21tYXBfZm5fdCAgIGdldF9tbWFwOyAqLworICAgIHZwOF94bWFfc2V0X21tYXAsIC8qIHZweF9jb2RlY19zZXRfbW1hcF9mbl90ICAgc2V0X21tYXA7ICovCisgICAgeworICAgICAgICB2cDhfcGVla19zaSwgICAgICAvKiB2cHhfY29kZWNfcGVla19zaV9mbl90ICAgIHBlZWtfc2k7ICovCisgICAgICAgIHZwOF9nZXRfc2ksICAgICAgIC8qIHZweF9jb2RlY19nZXRfc2lfZm5fdCAgICAgZ2V0X3NpOyAqLworICAgICAgICB2cDhfZGVjb2RlLCAgICAgICAvKiB2cHhfY29kZWNfZGVjb2RlX2ZuX3QgICAgIGRlY29kZTsgKi8KKyAgICAgICAgdnA4X2dldF9mcmFtZSwgICAgLyogdnB4X2NvZGVjX2ZyYW1lX2dldF9mbl90ICBmcmFtZV9nZXQ7ICovCisgICAgfSwKKyAgICB7IC8qIGVuY29kZXIgZnVuY3Rpb25zICovCisgICAgICAgIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgTk9UX0lNUExFTUVOVEVELAorICAgICAgICBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgTk9UX0lNUExFTUVOVEVELAorICAgICAgICBOT1RfSU1QTEVNRU5URUQKKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC92cDhjeC5tayBiL2xpYnZweC92cDgvdnA4Y3gubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMmYxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvdnA4Y3gubWsKQEAgLTAsMCArMSwxMTcgQEAKKyMjCisjIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjCisjIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisjIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisjIworCisKK2luY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS8kKFZQOF9QUkVGSVgpdnA4X2NvbW1vbi5taworCitWUDhfQ1hfRVhQT1JUUyArPSBleHBvcnRzX2VuYworCitWUDhfQ1hfU1JDUy15ZXMgKz0gJChWUDhfQ09NTU9OX1NSQ1MteWVzKQorVlA4X0NYX1NSQ1Mtbm8gICs9ICQoVlA4X0NPTU1PTl9TUkNTLW5vKQorVlA4X0NYX1NSQ1NfUkVNT1ZFLXllcyArPSAkKFZQOF9DT01NT05fU1JDU19SRU1PVkUteWVzKQorVlA4X0NYX1NSQ1NfUkVNT1ZFLW5vICArPSAkKFZQOF9DT01NT05fU1JDU19SRU1PVkUtbm8pCisKK2lmZXEgKCQoQVJDSF9BUk0pLHllcykKKyAgaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCl2cDhjeF9hcm0ubWsKK2VuZGlmCisKK1ZQOF9DWF9TUkNTLXllcyArPSB2cDhjeC5taworCitWUDhfQ1hfU1JDUy15ZXMgKz0gdnA4X2N4X2lmYWNlLmMKKworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2RlZmF1bHRjb2VmY291bnRzLmgKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2JpdHN0cmVhbS5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9ib29saHVmZi5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9kY3QuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvZW5jb2RlZnJhbWUuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvZW5jb2RlZnJhbWUuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvZW5jb2RlaW50cmEuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvZW5jb2RlbWIuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvZW5jb2RlbXYuYworVlA4X0NYX1NSQ1MtJChDT05GSUdfTVVMVElUSFJFQUQpICs9IGVuY29kZXIvZXRocmVhZGluZy5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9maXJzdHBhc3MuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYmxvY2suaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYm9vbGh1ZmYuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYml0c3RyZWFtLmgKK1ZQOF9DWF9TUkNTLSQoQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORykgKz0gZW5jb2Rlci9kZW5vaXNpbmcuaAorVlA4X0NYX1NSQ1MtJChDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HKSArPSBlbmNvZGVyL2Rlbm9pc2luZy5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVpbnRyYS5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVtYi5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVtdi5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9maXJzdHBhc3MuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvbG9va2FoZWFkLmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2xvb2thaGVhZC5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9tY29tcC5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9tb2RlY29zdHMuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvb255eF9pbnQuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcGlja2ludGVyLmgKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3BzbnIuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcXVhbnRpemUuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcmF0ZWN0cmwuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcmRvcHQuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvdG9rZW5pemUuaAorVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvdHJlZXdyaXRlci5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9tY29tcC5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9tb2RlY29zdHMuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvb255eF9pZi5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9waWNraW50ZXIuYworVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcGlja2xwZi5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9wc25yLmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3F1YW50aXplLmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3JhdGVjdHJsLmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3Jkb3B0LmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3NlZ21lbnRhdGlvbi5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9zZWdtZW50YXRpb24uaAorVlA4X0NYX1NSQ1MtJChDT05GSUdfSU5URVJOQUxfU1RBVFMpICs9IGVuY29kZXIvc3NpbS5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci90b2tlbml6ZS5jCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9kY3RfdmFsdWVfY29zdC5oCitWUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9kY3RfdmFsdWVfdG9rZW5zLmgKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3RyZWV3cml0ZXIuYworVlA4X0NYX1NSQ1MtJChDT05GSUdfSU5URVJOQUxfU1RBVFMpICs9IGNvbW1vbi9wb3N0cHJvYy5oCitWUDhfQ1hfU1JDUy0kKENPTkZJR19JTlRFUk5BTF9TVEFUUykgKz0gY29tbW9uL3Bvc3Rwcm9jLmMKK1ZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3RlbXBvcmFsX2ZpbHRlci5jCitWUDhfQ1hfU1JDUy0kKENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcpICs9IGVuY29kZXIvbXJfZGlzc2ltLmMKK1ZQOF9DWF9TUkNTLSQoQ09ORklHX01VTFRJX1JFU19FTkNPRElORykgKz0gZW5jb2Rlci9tcl9kaXNzaW0uaAorCitpZmVxICgkKENPTkZJR19SRUFMVElNRV9PTkxZKSx5ZXMpCitWUDhfQ1hfU1JDU19SRU1PVkUteWVzICs9IGVuY29kZXIvZmlyc3RwYXNzLmMKK1ZQOF9DWF9TUkNTX1JFTU9WRS15ZXMgKz0gZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuYworZW5kaWYKKworVlA4X0NYX1NSQ1MtJChIQVZFX01NWCkgKz0gZW5jb2Rlci94ODYvZGN0X21teC5hc20KK1ZQOF9DWF9TUkNTLSQoSEFWRV9NTVgpICs9IGVuY29kZXIveDg2L3N1YnRyYWN0X21teC5hc20KK1ZQOF9DWF9TUkNTLSQoSEFWRV9NTVgpICs9IGVuY29kZXIveDg2L3ZwOF9lbmNfc3R1YnNfbW14LmMKK1ZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9kY3Rfc3NlMi5hc20KK1ZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9md2Fsc2hfc3NlMi5hc20KK1ZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9xdWFudGl6ZV9zc2UyLmFzbQorCitpZmVxICgkKENPTkZJR19URU1QT1JBTF9ERU5PSVNJTkcpLHllcykKK1ZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9kZW5vaXNpbmdfc3NlMi5jCitpZmVxICgkKEhBVkVfU1NFMikseWVzKQordnA4L2VuY29kZXIveDg2L2Rlbm9pc2luZ19zc2UyLmMubzogQ0ZMQUdTICs9IC1tc3NlMgorZW5kaWYKK2VuZGlmCisKK1ZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9zdWJ0cmFjdF9zc2UyLmFzbQorVlA4X0NYX1NSQ1MtJChIQVZFX1NTRTIpICs9IGVuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyLmFzbQorVlA4X0NYX1NSQ1MtJChIQVZFX1NTRTIpICs9IGVuY29kZXIveDg2L3ZwOF9lbmNfc3R1YnNfc3NlMi5jCitWUDhfQ1hfU1JDUy0kKEhBVkVfU1NTRTMpICs9IGVuY29kZXIveDg2L3F1YW50aXplX3Nzc2UzLmFzbQorVlA4X0NYX1NSQ1MtJChIQVZFX1NTRTRfMSkgKz0gZW5jb2Rlci94ODYvcXVhbnRpemVfc3NlNC5hc20KK1ZQOF9DWF9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gZW5jb2Rlci94ODYvcXVhbnRpemVfbW14LmFzbQorVlA4X0NYX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBlbmNvZGVyL3g4Ni9lbmNvZGVvcHQuYXNtCitWUDhfQ1hfU1JDUy0kKEFSQ0hfWDg2XzY0KSArPSBlbmNvZGVyL3g4Ni9zc2ltX29wdC5hc20KKworaWZlcSAoJChDT05GSUdfUkVBTFRJTUVfT05MWSkseWVzKQorVlA4X0NYX1NSQ1NfUkVNT1ZFLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfc3NlMi5hc20KK2VuZGlmCisKKworVlA4X0NYX1NSQ1MteWVzIDo9ICQoZmlsdGVyLW91dCAkKFZQOF9DWF9TUkNTX1JFTU9WRS15ZXMpLCQoVlA4X0NYX1NSQ1MteWVzKSkKZGlmZiAtLWdpdCBhL2xpYnZweC92cDgvdnA4Y3hfYXJtLm1rIGIvbGlidnB4L3ZwOC92cDhjeF9hcm0ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMGVlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvdnA4Y3hfYXJtLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMjCisjIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjCisjIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisjIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisjIworCisKK1ZQOF9DWF9TUkNTLSQoQVJDSF9BUk0pICArPSB2cDhjeF9hcm0ubWsKKworI0ZpbGUgbGlzdCBmb3IgYXJtCisjIGVuY29kZXIKK1ZQOF9DWF9TUkNTLSQoQVJDSF9BUk0pICArPSBlbmNvZGVyL2FybS9kY3RfYXJtLmMKK1ZQOF9DWF9TUkNTLSQoQVJDSF9BUk0pICArPSBlbmNvZGVyL2FybS9xdWFudGl6ZV9hcm0uYworCisjRmlsZSBsaXN0IGZvciBlZHNwCisjIGVuY29kZXIKK1ZQOF9DWF9TUkNTLSQoSEFWRV9FRFNQKSArPSBlbmNvZGVyL2FybS9ib29saHVmZl9hcm0uYworVlA4X0NYX1NSQ1NfUkVNT1ZFLSQoSEFWRV9FRFNQKSAgKz0gZW5jb2Rlci9ib29saHVmZi5jCitWUDhfQ1hfU1JDUy0kKEhBVkVfRURTUCkgICs9IGVuY29kZXIvYXJtL2FybXY1dGUvYm9vbGh1ZmZfYXJtdjV0ZSQoQVNNKQorVlA4X0NYX1NSQ1MtJChIQVZFX0VEU1ApICArPSBlbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX2FybXY1JChBU00pCitWUDhfQ1hfU1JDUy0kKEhBVkVfRURTUCkgICs9IGVuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfbWJyb3dfYXJtdjUkKEFTTSkKK1ZQOF9DWF9TUkNTLSQoSEFWRV9FRFNQKSAgKz0gZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19wYXJ0aXRpb25zX2FybXY1JChBU00pCisKKyNGaWxlIGxpc3QgZm9yIG1lZGlhCisjIGVuY29kZXIKK1ZQOF9DWF9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGVuY29kZXIvYXJtL2FybXY2L3ZwOF9zdWJ0cmFjdF9hcm12NiQoQVNNKQorVlA4X0NYX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3Nob3J0X2ZkY3Q0eDRfYXJtdjYkKEFTTSkKK1ZQOF9DWF9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGVuY29kZXIvYXJtL2FybXY2L3ZwOF9mYXN0X3F1YW50aXplX2JfYXJtdjYkKEFTTSkKK1ZQOF9DWF9TUkNTLSQoSEFWRV9NRURJQSkgICs9IGVuY29kZXIvYXJtL2FybXY2L3ZwOF9tc2UxNngxNl9hcm12NiQoQVNNKQorVlA4X0NYX1NSQ1MtJChIQVZFX01FRElBKSAgKz0gZW5jb2Rlci9hcm0vYXJtdjYvd2Fsc2hfdjYkKEFTTSkKKworI0ZpbGUgbGlzdCBmb3IgbmVvbgorIyBlbmNvZGVyCitWUDhfQ1hfU1JDUy0kKEhBVkVfTkVPTikgICs9IGVuY29kZXIvYXJtL25lb24vZmFzdHF1YW50aXplYl9uZW9uJChBU00pCitWUDhfQ1hfU1JDUy0kKEhBVkVfTkVPTikgICs9IGVuY29kZXIvYXJtL25lb24vcGlja2xwZl9hcm0uYworVlA4X0NYX1NSQ1MtJChIQVZFX05FT04pICArPSBlbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uJChBU00pCitWUDhfQ1hfU1JDUy0kKEhBVkVfTkVPTikgICs9IGVuY29kZXIvYXJtL25lb24vc3VidHJhY3RfbmVvbiQoQVNNKQorVlA4X0NYX1NSQ1MtJChIQVZFX05FT04pICArPSBlbmNvZGVyL2FybS9uZW9uL3ZwOF9tc2UxNngxNl9uZW9uJChBU00pCitWUDhfQ1hfU1JDUy0kKEhBVkVfTkVPTikgICs9IGVuY29kZXIvYXJtL25lb24vdnA4X21lbWNweV9uZW9uJChBU00pCitWUDhfQ1hfU1JDUy0kKEhBVkVfTkVPTikgICs9IGVuY29kZXIvYXJtL25lb24vdnA4X3Nob3J0d2Fsc2g0eDRfbmVvbiQoQVNNKQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZwOC92cDhkeC5tayBiL2xpYnZweC92cDgvdnA4ZHgubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzOTE5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cDgvdnA4ZHgubWsKQEAgLTAsMCArMSw2NiBAQAorIyMKKyMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMKKyMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisjIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisjIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMjCisKKworaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCl2cDhfY29tbW9uLm1rCisKK1ZQOF9EWF9FWFBPUlRTICs9IGV4cG9ydHNfZGVjCisKK1ZQOF9EWF9TUkNTLXllcyArPSAkKFZQOF9DT01NT05fU1JDUy15ZXMpCitWUDhfRFhfU1JDUy1ubyAgKz0gJChWUDhfQ09NTU9OX1NSQ1Mtbm8pCitWUDhfRFhfU1JDU19SRU1PVkUteWVzICs9ICQoVlA4X0NPTU1PTl9TUkNTX1JFTU9WRS15ZXMpCitWUDhfRFhfU1JDU19SRU1PVkUtbm8gICs9ICQoVlA4X0NPTU1PTl9TUkNTX1JFTU9WRS1ubykKKworVlA4X0RYX1NSQ1MteWVzICs9IHZwOGR4Lm1rCisKK1ZQOF9EWF9TUkNTLXllcyArPSB2cDhfZHhfaWZhY2UuYworCisjIGNvbW1vbgorI2RlZmluZSBBUk0KKyNkZWZpbmUgRElTQUJMRV9USFJFQUQKKworI0lOQ0xVREVTICs9IGFsZ28vdnB4X2NvbW1vbi92cHhfbWVtL2luY2x1ZGUKKyNJTkNMVURFUyArPSBjb21tb24KKyNJTkNMVURFUyArPSBjb21tb24KKyNJTkNMVURFUyArPSBjb21tb24KKyNJTkNMVURFUyArPSBjb21tb24KKyNJTkNMVURFUyArPSBkZWNvZGVyCisKKworCisjIGRlY29kZXIKKyNkZWZpbmUgQVJNCisjZGVmaW5lIERJU0FCTEVfVEhSRUFECisKKyNJTkNMVURFUyArPSBhbGdvL3ZweF9jb21tb24vdnB4X21lbS9pbmNsdWRlCisjSU5DTFVERVMgKz0gY29tbW9uCisjSU5DTFVERVMgKz0gY29tbW9uCisjSU5DTFVERVMgKz0gY29tbW9uCisjSU5DTFVERVMgKz0gY29tbW9uCisjSU5DTFVERVMgKz0gZGVjb2RlcgorCitWUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYworVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGJvb2xodWZmLmMKK1ZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL2RlY29kZW12LmMKK1ZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL2RlY29kZnJhbWUuYworVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGV0b2tlbml6ZS5jCitWUDhfRFhfU1JDUy0kKENPTkZJR19FUlJPUl9DT05DRUFMTUVOVCkgKz0gZGVjb2Rlci9lY190eXBlcy5oCitWUDhfRFhfU1JDUy0kKENPTkZJR19FUlJPUl9DT05DRUFMTUVOVCkgKz0gZGVjb2Rlci9lcnJvcl9jb25jZWFsbWVudC5oCitWUDhfRFhfU1JDUy0kKENPTkZJR19FUlJPUl9DT05DRUFMTUVOVCkgKz0gZGVjb2Rlci9lcnJvcl9jb25jZWFsbWVudC5jCitWUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9kYm9vbGh1ZmYuaAorVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGVjb2RlbXYuaAorVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGVjb2RlcnRocmVhZGluZy5oCitWUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9kZXRva2VuaXplLmgKK1ZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL29ueXhkX2ludC5oCitWUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci90cmVlcmVhZGVyLmgKK1ZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL29ueXhkX2lmLmMKK1ZQOF9EWF9TUkNTLSQoQ09ORklHX01VTFRJVEhSRUFEKSArPSBkZWNvZGVyL3RocmVhZGluZy5jCisKK1ZQOF9EWF9TUkNTLXllcyA6PSAkKGZpbHRlci1vdXQgJChWUDhfRFhfU1JDU19SRU1PVkUteWVzKSwkKFZQOF9EWF9TUkNTLXllcykpCmRpZmYgLS1naXQgYS9saWJ2cHgvdnA4X211bHRpX3Jlc29sdXRpb25fZW5jb2Rlci5jIGIvbGlidnB4L3ZwOF9tdWx0aV9yZXNvbHV0aW9uX2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUzNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOF9tdWx0aV9yZXNvbHV0aW9uX2VuY29kZXIuYwpAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhpcyBpcyBhbiBleGFtcGxlIGRlbW9uc3RyYXRpbmcgbXVsdGktcmVzb2x1dGlvbiBlbmNvZGluZyBpbiBWUDguCisgKiBIaWdoLXJlc29sdXRpb24gaW5wdXQgdmlkZW8gaXMgZG93bi1zYW1wbGVkIHRvIGxvd2VyLXJlc29sdXRpb25zLiBUaGUKKyAqIGVuY29kZXIgdGhlbiBlbmNvZGVzIHRoZSB2aWRlbyBhbmQgb3V0cHV0cyBtdWx0aXBsZSBiaXRzdHJlYW1zIHdpdGgKKyAqIGRpZmZlcmVudCByZXNvbHV0aW9ucy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibWF0aC5oIgorI2RlZmluZSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgMQorI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhjeC5oIgorI2luY2x1ZGUgInZweF9wb3J0cy9tZW1fb3BzLmgiCisjZGVmaW5lIGludGVyZmFjZSAodnB4X2NvZGVjX3ZwOF9jeCgpKQorI2RlZmluZSBmb3VyY2MgICAgMHgzMDM4NTA1NgorCisjZGVmaW5lIElWRl9GSUxFX0hEUl9TWiAgKDMyKQorI2RlZmluZSBJVkZfRlJBTUVfSERSX1NaICgxMikKKworLyoKKyAqIFRoZSBpbnB1dCB2aWRlbyBmcmFtZSBpcyBkb3duc2FtcGxlZCBzZXZlcmFsIHRpbWVzIHRvIGdlbmVyYXRlIGEgbXVsdGktbGV2ZWwKKyAqIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUuIE5VTV9FTkNPREVSUyBpcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgZW5jb2RpbmcKKyAqIGxldmVscyByZXF1aXJlZC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBzaXplIG9mIGlucHV0IHZpZGVvIGlzIDEyODB4NzIwLAorICogTlVNX0VOQ09ERVJTIGlzIDMsIGFuZCBkb3duLXNhbXBsaW5nIGZhY3RvciBpcyAyLCB0aGUgZW5jb2RlciBvdXRwdXRzIDMKKyAqIGJpdHN0cmVhbXMgd2l0aCByZXNvbHV0aW9uIG9mIDEyODB4NzIwKGxldmVsIDApLCA2NDB4MzYwKGxldmVsIDEpLCBhbmQKKyAqIDMyMHgxODAobGV2ZWwgMikgcmVzcGVjdGl2ZWx5LgorICovCisjZGVmaW5lIE5VTV9FTkNPREVSUyAzCisKKy8qIFRoaXMgZXhhbXBsZSB1c2VzIHRoZSBzY2FsZXIgZnVuY3Rpb24gaW4gbGlieXV2LiAqLworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9iYXNpY190eXBlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9zY2FsZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnl1di9pbmNsdWRlL2xpYnl1di9jcHVfaWQuaCIKKworc3RhdGljIGRvdWJsZSB2cDhfbXNlMnBzbnIoZG91YmxlIFNhbXBsZXMsIGRvdWJsZSBQZWFrLCBkb3VibGUgTXNlKQoreworICAgIGRvdWJsZSBwc25yOworCisgICAgaWYgKChkb3VibGUpTXNlID4gMC4wKQorICAgICAgICBwc25yID0gMTAuMCAqIGxvZzEwKFBlYWsgKiBQZWFrICogU2FtcGxlcyAvIE1zZSk7CisgICAgZWxzZQorICAgICAgICBwc25yID0gNjA7ICAgICAgLy8gTGltaXQgdG8gcHJldmVudCAvIDAKKworICAgIGlmIChwc25yID4gNjApCisgICAgICAgIHBzbnIgPSA2MDsKKworICAgIHJldHVybiBwc25yOworfQorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnByaW50ZihmbXQsIGFwKTsKKyAgICBpZihmbXRbc3RybGVuKGZtdCktMV0gIT0gJ1xuJykKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQgZGllX2NvZGVjKHZweF9jb2RlY19jdHhfdCAqY3R4LCBjb25zdCBjaGFyICpzKSB7CisgICAgY29uc3QgY2hhciAqZGV0YWlsID0gdnB4X2NvZGVjX2Vycm9yX2RldGFpbChjdHgpOworCisgICAgcHJpbnRmKCIlczogJXNcbiIsIHMsIHZweF9jb2RlY19lcnJvcihjdHgpKTsKKyAgICBpZihkZXRhaWwpCisgICAgICAgIHByaW50ZigiICAgICVzXG4iLGRldGFpbCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitpbnQgKCpyZWFkX2ZyYW1lX3ApKEZJTEUgKmYsIHZweF9pbWFnZV90ICppbWcpOworCitzdGF0aWMgaW50IHJlYWRfZnJhbWUoRklMRSAqZiwgdnB4X2ltYWdlX3QgKmltZykgeworICAgIHNpemVfdCBuYnl0ZXMsIHRvX3JlYWQ7CisgICAgaW50ICAgIHJlcyA9IDE7CisKKyAgICB0b19yZWFkID0gaW1nLT53KmltZy0+aCozLzI7CisgICAgbmJ5dGVzID0gZnJlYWQoaW1nLT5wbGFuZXNbMF0sIDEsIHRvX3JlYWQsIGYpOworICAgIGlmKG5ieXRlcyAhPSB0b19yZWFkKSB7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGlmKG5ieXRlcyA+IDApCisgICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IFJlYWQgcGFydGlhbCBmcmFtZS4gQ2hlY2sgeW91ciB3aWR0aCAmIGhlaWdodCFcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHJlYWRfZnJhbWVfYnlfcm93KEZJTEUgKmYsIHZweF9pbWFnZV90ICppbWcpIHsKKyAgICBzaXplX3QgbmJ5dGVzLCB0b19yZWFkOworICAgIGludCAgICByZXMgPSAxOworICAgIGludCBwbGFuZTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgICAgIGludCB3ID0gKHBsYW5lID8gKDEgKyBpbWctPmRfdykgLyAyIDogaW1nLT5kX3cpOworICAgICAgICBpbnQgaCA9IChwbGFuZSA/ICgxICsgaW1nLT5kX2gpIC8gMiA6IGltZy0+ZF9oKTsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHBsYW5lIGJhc2VkIG9uIHRoZSBpbWFnZSBmb3JtYXQuIFRoZSBmb3ItbG9vcAorICAgICAgICAgKiBhbHdheXMgY291bnRzIGluIFksVSxWIG9yZGVyLCBidXQgdGhpcyBtYXkgbm90IG1hdGNoIHRoZSBvcmRlciBvZgorICAgICAgICAgKiB0aGUgZGF0YSBvbiBkaXNrLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChwbGFuZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwdHIgPSBpbWctPnBsYW5lc1tpbWctPmZtdD09VlBYX0lNR19GTVRfWVYxMj8gVlBYX1BMQU5FX1YgOiBWUFhfUExBTkVfVV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcHRyID0gaW1nLT5wbGFuZXNbaW1nLT5mbXQ9PVZQWF9JTUdfRk1UX1lWMTI/VlBYX1BMQU5FX1UgOiBWUFhfUExBTkVfVl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHB0ciA9IGltZy0+cGxhbmVzW3BsYW5lXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAociA9IDA7IHIgPCBoOyByKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvX3JlYWQgPSB3OworCisgICAgICAgICAgICBuYnl0ZXMgPSBmcmVhZChwdHIsIDEsIHRvX3JlYWQsIGYpOworICAgICAgICAgICAgaWYobmJ5dGVzICE9IHRvX3JlYWQpIHsKKyAgICAgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgICAgIGlmKG5ieXRlcyA+IDApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogUmVhZCBwYXJ0aWFsIGZyYW1lLiBDaGVjayB5b3VyIHdpZHRoICYgaGVpZ2h0IVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB0ciArPSBpbWctPnN0cmlkZVtwbGFuZV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXMpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pdmZfZmlsZV9oZWFkZXIoRklMRSAqb3V0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfZW5jX2NmZ190ICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2NudCkgeworICAgIGNoYXIgaGVhZGVyWzMyXTsKKworICAgIGlmKGNmZy0+Z19wYXNzICE9IFZQWF9SQ19PTkVfUEFTUyAmJiBjZmctPmdfcGFzcyAhPSBWUFhfUkNfTEFTVF9QQVNTKQorICAgICAgICByZXR1cm47CisgICAgaGVhZGVyWzBdID0gJ0QnOworICAgIGhlYWRlclsxXSA9ICdLJzsKKyAgICBoZWFkZXJbMl0gPSAnSSc7CisgICAgaGVhZGVyWzNdID0gJ0YnOworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrNCwgIDApOyAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgICAgbWVtX3B1dF9sZTE2KGhlYWRlcis2LCAgMzIpOyAgICAgICAgICAgICAgICAgIC8qIGhlYWRlcnNpemUgKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzgsICBmb3VyY2MpOyAgICAgICAgICAgICAgLyogaGVhZGVyc2l6ZSAqLworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrMTIsIGNmZy0+Z193KTsgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrMTQsIGNmZy0+Z19oKTsgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzE2LCBjZmctPmdfdGltZWJhc2UuZGVuKTsgLyogcmF0ZSAqLworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIrMjAsIGNmZy0+Z190aW1lYmFzZS5udW0pOyAvKiBzY2FsZSAqLworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIrMjQsIGZyYW1lX2NudCk7ICAgICAgICAgICAvKiBsZW5ndGggKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzI4LCAwKTsgICAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCisKKyAgICAodm9pZCkgZndyaXRlKGhlYWRlciwgMSwgMzIsIG91dGZpbGUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pdmZfZnJhbWVfaGVhZGVyKEZJTEUgKm91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0KQoreworICAgIGNoYXIgICAgICAgICAgICAgaGVhZGVyWzEyXTsKKyAgICB2cHhfY29kZWNfcHRzX3QgIHB0czsKKworICAgIGlmKHBrdC0+a2luZCAhPSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUKQorICAgICAgICByZXR1cm47CisKKyAgICBwdHMgPSBwa3QtPmRhdGEuZnJhbWUucHRzOworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIsIHBrdC0+ZGF0YS5mcmFtZS5zeik7CisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcis0LCBwdHMmMHhGRkZGRkZGRik7CisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcis4LCBwdHMgPj4gMzIpOworCisgICAgKHZvaWQpIGZ3cml0ZShoZWFkZXIsIDEsIDEyLCBvdXRmaWxlKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIEZJTEUgICAgICAgICAgICAgICAgKmluZmlsZSwgKm91dGZpbGVbTlVNX0VOQ09ERVJTXTsKKyAgICB2cHhfY29kZWNfY3R4X3QgICAgICBjb2RlY1tOVU1fRU5DT0RFUlNdOworICAgIHZweF9jb2RlY19lbmNfY2ZnX3QgIGNmZ1tOVU1fRU5DT0RFUlNdOworICAgIHZweF9jb2RlY19wdHNfdCAgICAgIGZyYW1lX2NudCA9IDA7CisgICAgdnB4X2ltYWdlX3QgICAgICAgICAgcmF3W05VTV9FTkNPREVSU107CisgICAgdnB4X2NvZGVjX2Vycl90ICAgICAgcmVzW05VTV9FTkNPREVSU107CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpOworICAgIGxvbmcgICAgICAgICAgICAgICAgIHdpZHRoOworICAgIGxvbmcgICAgICAgICAgICAgICAgIGhlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9hdmFpbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBnb3RfZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisKKyAgICAvKkN1cnJlbnRseSwgb25seSByZWFsdGltZSBtb2RlIGlzIHN1cHBvcnRlZCBpbiBtdWx0aS1yZXNvbHV0aW9uIGVuY29kaW5nLiovCisgICAgaW50ICAgICAgICAgICAgICAgICAgYXJnX2RlYWRsaW5lID0gVlBYX0RMX1JFQUxUSU1FOworCisgICAgLyogU2V0IHNob3dfcHNuciB0byAxLzAgdG8gc2hvdy9ub3Qgc2hvdyBQU05SLiBDaG9vc2Ugc2hvd19wc25yPTAgaWYgeW91CisgICAgICAgZG9uJ3QgbmVlZCB0byBrbm93IFBTTlIsIHdoaWNoIHdpbGwgc2tpcCBQU05SIGNhbGN1bGF0aW9uIGFuZCBzYXZlCisgICAgICAgZW5jb2RpbmcgdGltZS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICBzaG93X3BzbnIgPSAwOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgIHBzbnJfc3NlX3RvdGFsW05VTV9FTkNPREVSU10gPSB7MH07CisgICAgdWludDY0X3QgICAgICAgICAgICAgcHNucl9zYW1wbGVzX3RvdGFsW05VTV9FTkNPREVSU10gPSB7MH07CisgICAgZG91YmxlICAgICAgICAgICAgICAgcHNucl90b3RhbHNbTlVNX0VOQ09ERVJTXVs0XSA9IHt7MCwwfX07CisgICAgaW50ICAgICAgICAgICAgICAgICAgcHNucl9jb3VudFtOVU1fRU5DT0RFUlNdID0gezB9OworCisgICAgLyogU2V0IHRoZSByZXF1aXJlZCB0YXJnZXQgYml0cmF0ZXMgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbC4KKyAgICAgKiBJZiB0YXJnZXQgYml0cmF0ZSBmb3IgaGlnaGVzdC1yZXNvbHV0aW9uIGxldmVsIGlzIHNldCB0byAwLAorICAgICAqIChpLmUuIHRhcmdldF9iaXRyYXRlWzBdPTApLCB3ZSBza2lwIGVuY29kaW5nIGF0IHRoYXQgbGV2ZWwuCisgICAgICovCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgdGFyZ2V0X2JpdHJhdGVbTlVNX0VOQ09ERVJTXT17MTQwMCwgNTAwLCAxMDB9OworICAgIC8qIEVudGVyIHRoZSBmcmFtZSByYXRlIG9mIHRoZSBpbnB1dCB2aWRlbyAqLworICAgIGludCAgICAgICAgICAgICAgICAgIGZyYW1lcmF0ZSA9IDMwOworICAgIC8qIFNldCBkb3duLXNhbXBsaW5nIGZhY3RvciBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsLgorICAgICAgIGRzZlswXSBjb250cm9scyBkb3duIHNhbXBsaW5nIGZyb20gbGV2ZWwgMCB0byBsZXZlbCAxOworICAgICAgIGRzZlsxXSBjb250cm9scyBkb3duIHNhbXBsaW5nIGZyb20gbGV2ZWwgMSB0byBsZXZlbCAyOworICAgICAgIGRzZlsyXSBpcyBub3QgdXNlZC4gKi8KKyAgICB2cHhfcmF0aW9uYWxfdCBkc2ZbTlVNX0VOQ09ERVJTXSA9IHt7MiwgMX0sIHsyLCAxfSwgezEsIDF9fTsKKworICAgIGlmKGFyZ2MhPSAoNStOVU1fRU5DT0RFUlMpKQorICAgICAgICBkaWUoIlVzYWdlOiAlcyA8d2lkdGg+IDxoZWlnaHQ+IDxpbmZpbGU+IDxvdXRmaWxlKHMpPiA8b3V0cHV0IHBzbnI/PlxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pOworCisgICAgcHJpbnRmKCJVc2luZyAlc1xuIix2cHhfY29kZWNfaWZhY2VfbmFtZShpbnRlcmZhY2UpKTsKKworICAgIHdpZHRoID0gc3RydG9sKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgIGhlaWdodCA9IHN0cnRvbChhcmd2WzJdLCBOVUxMLCAwKTsKKworICAgIGlmKHdpZHRoIDwgMTYgfHwgd2lkdGglMiB8fCBoZWlnaHQgPDE2IHx8IGhlaWdodCUyKQorICAgICAgICBkaWUoIkludmFsaWQgcmVzb2x1dGlvbjogJWxkeCVsZCIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgLyogT3BlbiBpbnB1dCB2aWRlbyBmaWxlIGZvciBlbmNvZGluZyAqLworICAgIGlmKCEoaW5maWxlID0gZm9wZW4oYXJndlszXSwgInJiIikpKQorICAgICAgICBkaWUoIkZhaWxlZCB0byBvcGVuICVzIGZvciByZWFkaW5nIiwgYXJndlszXSk7CisKKyAgICAvKiBPcGVuIG91dHB1dCBmaWxlIGZvciBlYWNoIGVuY29kZXIgdG8gb3V0cHV0IGJpdHN0cmVhbXMgKi8KKyAgICBmb3IgKGk9MDsgaTwgTlVNX0VOQ09ERVJTOyBpKyspCisgICAgeworICAgICAgICBpZighdGFyZ2V0X2JpdHJhdGVbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dGZpbGVbaV0gPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZighKG91dGZpbGVbaV0gPSBmb3Blbihhcmd2W2krNF0sICJ3YiIpKSkKKyAgICAgICAgICAgIGRpZSgiRmFpbGVkIHRvIG9wZW4gJXMgZm9yIHdyaXRpbmciLCBhcmd2W2krNF0pOworICAgIH0KKworICAgIHNob3dfcHNuciA9IHN0cnRvbChhcmd2W05VTV9FTkNPREVSUyArIDRdLCBOVUxMLCAwKTsKKworICAgIC8qIFBvcHVsYXRlIGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uICovCisgICAgZm9yIChpPTA7IGk8IE5VTV9FTkNPREVSUzsgaSsrKQorICAgIHsKKyAgICAgICAgcmVzW2ldID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChpbnRlcmZhY2UsICZjZmdbaV0sIDApOworICAgICAgICBpZihyZXNbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGVkIHRvIGdldCBjb25maWc6ICVzXG4iLCB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXNbaV0pKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byBuZWVkcyBvZiB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgLyogSGlnaGVzdC1yZXNvbHV0aW9uIGVuY29kZXIgc2V0dGluZ3MgKi8KKyAgICBjZmdbMF0uZ193ID0gd2lkdGg7CisgICAgY2ZnWzBdLmdfaCA9IGhlaWdodDsKKyAgICBjZmdbMF0uZ190aHJlYWRzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyB1c2VkICovCisgICAgY2ZnWzBdLnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAzMDsKKyAgICBjZmdbMF0ucmNfZW5kX3VzYWdlID0gVlBYX0NCUjsKKyAgICBjZmdbMF0ucmNfcmVzaXplX2FsbG93ZWQgPSAwOworICAgIGNmZ1swXS5yY19taW5fcXVhbnRpemVyID0gNDsKKyAgICBjZmdbMF0ucmNfbWF4X3F1YW50aXplciA9IDU2OworICAgIGNmZ1swXS5yY191bmRlcnNob290X3BjdCA9IDk4OworICAgIGNmZ1swXS5yY19vdmVyc2hvb3RfcGN0ID0gMTAwOworICAgIGNmZ1swXS5yY19idWZfaW5pdGlhbF9zeiA9IDUwMDsKKyAgICBjZmdbMF0ucmNfYnVmX29wdGltYWxfc3ogPSA2MDA7CisgICAgY2ZnWzBdLnJjX2J1Zl9zeiA9IDEwMDA7CisgICAgY2ZnWzBdLmdfZXJyb3JfcmVzaWxpZW50ID0gMTsgICAgICAgICAgICAgIC8qIEVuYWJsZSBlcnJvciByZXNpbGllbnQgbW9kZSAqLworICAgIGNmZ1swXS5nX2xhZ19pbl9mcmFtZXMgICA9IDA7CisKKyAgICAvKiBEaXNhYmxlIGF1dG9tYXRpYyBrZXlmcmFtZSBwbGFjZW1lbnQgKi8KKyAgICAvKiBOb3RlOiBUaGVzZSAzIHNldHRpbmdzIGFyZSBjb3BpZWQgdG8gYWxsIGxldmVscy4gQnV0LCBleGNlcHQgdGhlIGxvd2VzdAorICAgICAqIHJlc29sdXRpb24gbGV2ZWwsIGFsbCBvdGhlciBsZXZlbHMgYXJlIHNldCB0byBWUFhfS0ZfRElTQUJMRUQgaW50ZXJuYWxseS4KKyAgICAgKi8KKyAgICAvL2NmZ1swXS5rZl9tb2RlICAgICAgICAgICA9IFZQWF9LRl9ESVNBQkxFRDsKKyAgICBjZmdbMF0ua2ZfbW9kZSAgICAgICAgICAgPSBWUFhfS0ZfQVVUTzsKKyAgICBjZmdbMF0ua2ZfbWluX2Rpc3QgPSAzMDAwOworICAgIGNmZ1swXS5rZl9tYXhfZGlzdCA9IDMwMDA7CisKKyAgICBjZmdbMF0ucmNfdGFyZ2V0X2JpdHJhdGUgPSB0YXJnZXRfYml0cmF0ZVswXTsgICAgICAgLyogU2V0IHRhcmdldCBiaXRyYXRlICovCisgICAgY2ZnWzBdLmdfdGltZWJhc2UubnVtID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmcHMgKi8KKyAgICBjZmdbMF0uZ190aW1lYmFzZS5kZW4gPSBmcmFtZXJhdGU7CisKKyAgICAvKiBPdGhlci1yZXNvbHV0aW9uIGVuY29kZXIgc2V0dGluZ3MgKi8KKyAgICBmb3IgKGk9MTsgaTwgTlVNX0VOQ09ERVJTOyBpKyspCisgICAgeworICAgICAgICBtZW1jcHkoJmNmZ1tpXSwgJmNmZ1swXSwgc2l6ZW9mKHZweF9jb2RlY19lbmNfY2ZnX3QpKTsKKworICAgICAgICBjZmdbaV0uZ190aHJlYWRzID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIHVzZWQgKi8KKyAgICAgICAgY2ZnW2ldLnJjX3RhcmdldF9iaXRyYXRlID0gdGFyZ2V0X2JpdHJhdGVbaV07CisKKyAgICAgICAgLyogTm90ZTogV2lkdGggJiBoZWlnaHQgb2Ygb3RoZXItcmVzb2x1dGlvbiBlbmNvZGVycyBhcmUgY2FsY3VsYXRlZAorICAgICAgICAgKiBmcm9tIHRoZSBoaWdoZXN0LXJlc29sdXRpb24gZW5jb2RlcidzIHNpemUgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAqIGRvd25fc2FtcGxpbmdfZmFjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGl3ID0gY2ZnW2ktMV0uZ193KmRzZltpLTFdLmRlbiArIGRzZltpLTFdLm51bSAtIDE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWggPSBjZmdbaS0xXS5nX2gqZHNmW2ktMV0uZGVuICsgZHNmW2ktMV0ubnVtIC0gMTsKKyAgICAgICAgICAgIGNmZ1tpXS5nX3cgPSBpdy9kc2ZbaS0xXS5udW07CisgICAgICAgICAgICBjZmdbaV0uZ19oID0gaWgvZHNmW2ktMV0ubnVtOworICAgICAgICB9CisKKyAgICAgICAgLyogTWFrZSB3aWR0aCAmIGhlaWdodCB0byBiZSBtdWx0aXBsaWVyIG9mIDIuICovCisgICAgICAgIC8vIFNob3VsZCBzdXBwb3J0IG9kZCBzaXplID8/PworICAgICAgICBpZigoY2ZnW2ldLmdfdyklMiljZmdbaV0uZ193Kys7CisgICAgICAgIGlmKChjZmdbaV0uZ19oKSUyKWNmZ1tpXS5nX2grKzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBpbWFnZSBmb3IgZWFjaCBlbmNvZGVyICovCisgICAgZm9yIChpPTA7IGk8IE5VTV9FTkNPREVSUzsgaSsrKQorICAgICAgICBpZighdnB4X2ltZ19hbGxvYygmcmF3W2ldLCBWUFhfSU1HX0ZNVF9JNDIwLCBjZmdbaV0uZ193LCBjZmdbaV0uZ19oLCAzMikpCisgICAgICAgICAgICBkaWUoIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSIsIGNmZ1tpXS5nX3csIGNmZ1tpXS5nX2gpOworCisgICAgaWYgKHJhd1swXS5zdHJpZGVbVlBYX1BMQU5FX1ldID09IHJhd1swXS5kX3cpCisgICAgICAgIHJlYWRfZnJhbWVfcCA9IHJlYWRfZnJhbWU7CisgICAgZWxzZQorICAgICAgICByZWFkX2ZyYW1lX3AgPSByZWFkX2ZyYW1lX2J5X3JvdzsKKworICAgIGZvciAoaT0wOyBpPCBOVU1fRU5DT0RFUlM7IGkrKykKKyAgICAgICAgaWYob3V0ZmlsZVtpXSkKKyAgICAgICAgICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihvdXRmaWxlW2ldLCAmY2ZnW2ldLCAwKTsKKworICAgIC8qIEluaXRpYWxpemUgbXVsdGktZW5jb2RlciAqLworICAgIGlmKHZweF9jb2RlY19lbmNfaW5pdF9tdWx0aSgmY29kZWNbMF0sIGludGVyZmFjZSwgJmNmZ1swXSwgTlVNX0VOQ09ERVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvd19wc25yID8gVlBYX0NPREVDX1VTRV9QU05SIDogMCksICZkc2ZbMF0pKQorICAgICAgICBkaWVfY29kZWMoJmNvZGVjWzBdLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworCisgICAgLyogVGhlIGV4dHJhIGVuY29kaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBjYW4gYmUgc2V0IGFzIGZvbGxvd3MuICovCisgICAgLyogU2V0IGVuY29kaW5nIHNwZWVkICovCisgICAgZm9yICggaT0wOyBpPE5VTV9FTkNPREVSUzsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IHNwZWVkID0gLTY7CisgICAgICAgIGlmKHZweF9jb2RlY19jb250cm9sKCZjb2RlY1tpXSwgVlA4RV9TRVRfQ1BVVVNFRCwgc3BlZWQpKQorICAgICAgICAgICAgZGllX2NvZGVjKCZjb2RlY1tpXSwgIkZhaWxlZCB0byBzZXQgY3B1X3VzZWQiKTsKKyAgICB9CisgICAgLyogU2V0IHN0YXRpYyB0aHJlc2ggZm9yIGhpZ2hlc3QtcmVzb2x1dGlvbiBlbmNvZGVyLiBTZXQgaXQgdG8gMTAwMCBmb3IKKyAgICAgKiBiZXR0ZXIgcGVyZm9ybWFuY2UuICovCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgc3RhdGljX3RocmVzaCA9IDEwMDA7CisgICAgICAgIGlmKHZweF9jb2RlY19jb250cm9sKCZjb2RlY1swXSwgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwgc3RhdGljX3RocmVzaCkpCisgICAgICAgICAgICBkaWVfY29kZWMoJmNvZGVjWzBdLCAiRmFpbGVkIHRvIHNldCBzdGF0aWMgdGhyZXNob2xkIik7CisgICAgfQorICAgIC8qIFNldCBzdGF0aWMgdGhyZXNoID0gMCBmb3Igb3RoZXIgZW5jb2RlcnMgZm9yIGJldHRlciBxdWFsaXR5ICovCisgICAgZm9yICggaT0xOyBpPE5VTV9FTkNPREVSUzsgaSsrKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHN0YXRpY190aHJlc2ggPSAwOworICAgICAgICBpZih2cHhfY29kZWNfY29udHJvbCgmY29kZWNbaV0sIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsIHN0YXRpY190aHJlc2gpKQorICAgICAgICAgICAgZGllX2NvZGVjKCZjb2RlY1tpXSwgIkZhaWxlZCB0byBzZXQgc3RhdGljIHRocmVzaG9sZCIpOworICAgIH0KKyAgICAvKiBTZXQgTk9JU0VfU0VOU0lUSVZJVFkgdG8gZG8gVEVNUE9SQUxfREVOT0lTSU5HICovCisgICAgZm9yICggaT0wOyBpPCBOVU1fRU5DT0RFUlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHZweF9jb2RlY19jb250cm9sKCZjb2RlY1tpXSwgVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksIDApKQorICAgICAgICAgICAgZGllX2NvZGVjKCZjb2RlY1tpXSwgIkZhaWxlZCB0byBzZXQgbm9pc2Vfc2Vuc2l0aXZpdHkiKTsKKyAgICB9CisKKyAgICBmcmFtZV9hdmFpbCA9IDE7CisgICAgZ290X2RhdGEgPSAwOworCisgICAgd2hpbGUoZnJhbWVfYXZhaWwgfHwgZ290X2RhdGEpCisgICAgeworICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXJbTlVNX0VOQ09ERVJTXT17TlVMTH07CisgICAgICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0W05VTV9FTkNPREVSU107CisKKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBmcmFtZV9hdmFpbCA9IHJlYWRfZnJhbWVfcChpbmZpbGUsICZyYXdbMF0pOworCisgICAgICAgIGlmKGZyYW1lX2F2YWlsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpPTE7IGk8TlVNX0VOQ09ERVJTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypTY2FsZSB0aGUgaW1hZ2UgZG93biBhIG51bWJlciBvZiB0aW1lcyBieSBkb3duc2FtcGxpbmcgZmFjdG9yKi8KKyAgICAgICAgICAgICAgICAvKiBGaWx0ZXJNb2RlIDEgb3IgMiBnaXZlIGJldHRlciBwc25yIHRoYW4gRmlsdGVyTW9kZSAwLiAqLworICAgICAgICAgICAgICAgIEk0MjBTY2FsZShyYXdbaS0xXS5wbGFuZXNbVlBYX1BMQU5FX1ldLCByYXdbaS0xXS5zdHJpZGVbVlBYX1BMQU5FX1ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYXdbaS0xXS5wbGFuZXNbVlBYX1BMQU5FX1VdLCByYXdbaS0xXS5zdHJpZGVbVlBYX1BMQU5FX1VdLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYXdbaS0xXS5wbGFuZXNbVlBYX1BMQU5FX1ZdLCByYXdbaS0xXS5zdHJpZGVbVlBYX1BMQU5FX1ZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYXdbaS0xXS5kX3csIHJhd1tpLTFdLmRfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3W2ldLnBsYW5lc1tWUFhfUExBTkVfWV0sIHJhd1tpXS5zdHJpZGVbVlBYX1BMQU5FX1ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYXdbaV0ucGxhbmVzW1ZQWF9QTEFORV9VXSwgcmF3W2ldLnN0cmlkZVtWUFhfUExBTkVfVV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1tpXS5wbGFuZXNbVlBYX1BMQU5FX1ZdLCByYXdbaV0uc3RyaWRlW1ZQWF9QTEFORV9WXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3W2ldLmRfdywgcmF3W2ldLmRfaCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFbmNvZGUgZWFjaCBmcmFtZSBhdCBtdWx0aS1sZXZlbHMgKi8KKyAgICAgICAgaWYodnB4X2NvZGVjX2VuY29kZSgmY29kZWNbMF0sIGZyYW1lX2F2YWlsPyAmcmF3WzBdIDogTlVMTCwKKyAgICAgICAgICAgIGZyYW1lX2NudCwgMSwgZmxhZ3MsIGFyZ19kZWFkbGluZSkpCisgICAgICAgICAgICBkaWVfY29kZWMoJmNvZGVjWzBdLCAiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpOworCisgICAgICAgIGZvciAoaT1OVU1fRU5DT0RFUlMtMTsgaT49MCA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290X2RhdGEgPSAwOworCisgICAgICAgICAgICB3aGlsZSggKHBrdFtpXSA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgmY29kZWNbaV0sICZpdGVyW2ldKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdF9kYXRhID0gMTsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocGt0W2ldLT5raW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVlBYX0NPREVDX0NYX0ZSQU1FX1BLVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2l2Zl9mcmFtZV9oZWFkZXIob3V0ZmlsZVtpXSwgcGt0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBmd3JpdGUocGt0W2ldLT5kYXRhLmZyYW1lLmJ1ZiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0W2ldLT5kYXRhLmZyYW1lLnN6LCBvdXRmaWxlW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVlBYX0NPREVDX1BTTlJfUEtUOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dfcHNucikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbnJfc3NlX3RvdGFsW2ldICs9IHBrdFtpXS0+ZGF0YS5wc25yLnNzZVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25yX3NhbXBsZXNfdG90YWxbaV0gKz0gcGt0W2ldLT5kYXRhLnBzbnIuc2FtcGxlc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZGVyciwgIiUuM2xmICIsIHBrdFtpXS0+ZGF0YS5wc25yLnBzbnJbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25yX3RvdGFsc1tpXVtqXSArPSBwa3RbaV0tPmRhdGEucHNuci5wc25yW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25yX2NvdW50W2ldKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50Zihwa3RbaV0tPmtpbmQgPT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVAorICAgICAgICAgICAgICAgICAgICAgICAmJiAocGt0W2ldLT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0tFWSk/ICJLIjoiLiIpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lX2NudCsrOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICBmY2xvc2UoaW5maWxlKTsKKworICAgIHByaW50ZigiUHJvY2Vzc2VkICVsZCBmcmFtZXMuXG4iLChsb25nIGludClmcmFtZV9jbnQtMSk7CisgICAgZm9yIChpPTA7IGk8IE5VTV9FTkNPREVSUzsgaSsrKQorICAgIHsKKyAgICAgICAgLyogQ2FsY3VsYXRlIFBTTlIgYW5kIHByaW50IGl0IG91dCAqLworICAgICAgICBpZiAoIChzaG93X3BzbnIpICYmIChwc25yX2NvdW50W2ldPjApICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBkb3VibGUgb3Zwc25yID0gdnA4X21zZTJwc25yKHBzbnJfc2FtcGxlc190b3RhbFtpXSwgMjU1LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbnJfc3NlX3RvdGFsW2ldKTsKKworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiBFTkMlZCBQU05SIChPdmVyYWxsL0F2Zy9ZL1UvVikiLCBpKTsKKworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJS4zbGYiLCBvdnBzbnIpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlLjNsZiIsIHBzbnJfdG90YWxzW2ldW2pdL3BzbnJfY291bnRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYodnB4X2NvZGVjX2Rlc3Ryb3koJmNvZGVjW2ldKSkKKyAgICAgICAgICAgIGRpZV9jb2RlYygmY29kZWNbaV0sICJGYWlsZWQgdG8gZGVzdHJveSBjb2RlYyIpOworCisgICAgICAgIHZweF9pbWdfZnJlZSgmcmF3W2ldKTsKKworICAgICAgICBpZighb3V0ZmlsZVtpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFRyeSB0byByZXdyaXRlIHRoZSBmaWxlIGhlYWRlciB3aXRoIHRoZSBhY3R1YWwgZnJhbWUgY291bnQgKi8KKyAgICAgICAgaWYoIWZzZWVrKG91dGZpbGVbaV0sIDAsIFNFRUtfU0VUKSkKKyAgICAgICAgICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihvdXRmaWxlW2ldLCAmY2ZnW2ldLCBmcmFtZV9jbnQtMSk7CisgICAgICAgIGZjbG9zZShvdXRmaWxlW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cDhfc2NhbGFibGVfcGF0dGVybnMuYyBiL2xpYnZweC92cDhfc2NhbGFibGVfcGF0dGVybnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI3MGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZwOF9zY2FsYWJsZV9wYXR0ZXJucy5jCkBAIC0wLDAgKzEsNjk0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyoKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBkZW1vbnN0cmF0aW5nIGhvdyB0byBpbXBsZW1lbnQgYSBtdWx0aS1sYXllciBWUDgKKyAqIGVuY29kaW5nIHNjaGVtZSBiYXNlZCBvbiB0ZW1wb3JhbCBzY2FsYWJpbGl0eSBmb3IgdmlkZW8gYXBwbGljYXRpb25zCisgKiB0aGF0IGJlbmVmaXQgZnJvbSBhIHNjYWxhYmxlIGJpdHN0cmVhbS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZGVmaW5lIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCAxCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZwOGN4LmgiCisjZGVmaW5lIGludGVyZmFjZSAodnB4X2NvZGVjX3ZwOF9jeCgpKQorI2RlZmluZSBmb3VyY2MgICAgMHgzMDM4NTA1NgorCisjZGVmaW5lIElWRl9GSUxFX0hEUl9TWiAgKDMyKQorI2RlZmluZSBJVkZfRlJBTUVfSERSX1NaICgxMikKKworc3RhdGljIHZvaWQgbWVtX3B1dF9sZTE2KGNoYXIgKm1lbSwgdW5zaWduZWQgaW50IHZhbCkgeworICAgIG1lbVswXSA9IHZhbDsKKyAgICBtZW1bMV0gPSB2YWw+Pjg7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9wdXRfbGUzMihjaGFyICptZW0sIHVuc2lnbmVkIGludCB2YWwpIHsKKyAgICBtZW1bMF0gPSB2YWw7CisgICAgbWVtWzFdID0gdmFsPj44OworICAgIG1lbVsyXSA9IHZhbD4+MTY7CisgICAgbWVtWzNdID0gdmFsPj4yNDsKK30KKworc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZwcmludGYoZm10LCBhcCk7CisgICAgaWYoZm10W3N0cmxlbihmbXQpLTFdICE9ICdcbicpCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZV9jb2RlYyh2cHhfY29kZWNfY3R4X3QgKmN0eCwgY29uc3QgY2hhciAqcykgeworICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoY3R4KTsKKworICAgIHByaW50ZigiJXM6ICVzXG4iLCBzLCB2cHhfY29kZWNfZXJyb3IoY3R4KSk7CisgICAgaWYoZGV0YWlsKQorICAgICAgICBwcmludGYoIiAgICAlc1xuIixkZXRhaWwpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIGludCByZWFkX2ZyYW1lKEZJTEUgKmYsIHZweF9pbWFnZV90ICppbWcpIHsKKyAgICBzaXplX3QgbmJ5dGVzLCB0b19yZWFkOworICAgIGludCAgICByZXMgPSAxOworCisgICAgdG9fcmVhZCA9IGltZy0+dyppbWctPmgqMy8yOworICAgIG5ieXRlcyA9IGZyZWFkKGltZy0+cGxhbmVzWzBdLCAxLCB0b19yZWFkLCBmKTsKKyAgICBpZihuYnl0ZXMgIT0gdG9fcmVhZCkgeworICAgICAgICByZXMgPSAwOworICAgICAgICBpZihuYnl0ZXMgPiAwKQorICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiBSZWFkIHBhcnRpYWwgZnJhbWUuIENoZWNrIHlvdXIgd2lkdGggJiBoZWlnaHQhXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfaXZmX2ZpbGVfaGVhZGVyKEZJTEUgKm91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2VuY19jZmdfdCAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9jbnQpIHsKKyAgICBjaGFyIGhlYWRlclszMl07CisKKyAgICBpZihjZmctPmdfcGFzcyAhPSBWUFhfUkNfT05FX1BBU1MgJiYgY2ZnLT5nX3Bhc3MgIT0gVlBYX1JDX0xBU1RfUEFTUykKKyAgICAgICAgcmV0dXJuOworICAgIGhlYWRlclswXSA9ICdEJzsKKyAgICBoZWFkZXJbMV0gPSAnSyc7CisgICAgaGVhZGVyWzJdID0gJ0knOworICAgIGhlYWRlclszXSA9ICdGJzsKKyAgICBtZW1fcHV0X2xlMTYoaGVhZGVyKzQsICAwKTsgICAgICAgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIrNiwgIDMyKTsgICAgICAgICAgICAgICAgICAvKiBoZWFkZXJzaXplICovCisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcis4LCAgZm91cmNjKTsgICAgICAgICAgICAgIC8qIGhlYWRlcnNpemUgKi8KKyAgICBtZW1fcHV0X2xlMTYoaGVhZGVyKzEyLCBjZmctPmdfdyk7ICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICBtZW1fcHV0X2xlMTYoaGVhZGVyKzE0LCBjZmctPmdfaCk7ICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcisxNiwgY2ZnLT5nX3RpbWViYXNlLmRlbik7IC8qIHJhdGUgKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzIwLCBjZmctPmdfdGltZWJhc2UubnVtKTsgLyogc2NhbGUgKi8KKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyKzI0LCBmcmFtZV9jbnQpOyAgICAgICAgICAgLyogbGVuZ3RoICovCisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcisyOCwgMCk7ICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLworCisgICAgKHZvaWQpIGZ3cml0ZShoZWFkZXIsIDEsIDMyLCBvdXRmaWxlKTsKK30KKworCitzdGF0aWMgdm9pZCB3cml0ZV9pdmZfZnJhbWVfaGVhZGVyKEZJTEUgKm91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0KQoreworICAgIGNoYXIgICAgICAgICAgICAgaGVhZGVyWzEyXTsKKyAgICB2cHhfY29kZWNfcHRzX3QgIHB0czsKKworICAgIGlmKHBrdC0+a2luZCAhPSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUKQorICAgICAgICByZXR1cm47CisKKyAgICBwdHMgPSBwa3QtPmRhdGEuZnJhbWUucHRzOworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIsIHBrdC0+ZGF0YS5mcmFtZS5zeik7CisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcis0LCBwdHMmMHhGRkZGRkZGRik7CisgICAgbWVtX3B1dF9sZTMyKGhlYWRlcis4LCBwdHMgPj4gMzIpOworCisgICAgKHZvaWQpIGZ3cml0ZShoZWFkZXIsIDEsIDEyLCBvdXRmaWxlKTsKK30KKworc3RhdGljIGludCBtb2RlX3RvX251bV9sYXllcnNbMTJdID0gezEsIDIsIDIsIDMsIDMsIDMsIDMsIDUsIDIsIDMsIDMsIDN9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBGSUxFICAgICAgICAgICAgICAgICppbmZpbGUsICpvdXRmaWxlW1ZQWF9UU19NQVhfTEFZRVJTXTsKKyAgICB2cHhfY29kZWNfY3R4X3QgICAgICBjb2RlYzsKKyAgICB2cHhfY29kZWNfZW5jX2NmZ190ICBjZmc7CisgICAgaW50ICAgICAgICAgICAgICAgICAgZnJhbWVfY250ID0gMDsKKyAgICB2cHhfaW1hZ2VfdCAgICAgICAgICByYXc7CisgICAgdnB4X2NvZGVjX2Vycl90ICAgICAgcmVzOworICAgIHVuc2lnbmVkIGludCAgICAgICAgIHdpZHRoOworICAgIHVuc2lnbmVkIGludCAgICAgICAgIGhlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9hdmFpbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBnb3RfZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBwdHMgPSAwOyAgICAgICAgICAgICAgLyogUFRTIHN0YXJ0cyBhdCAwICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgZnJhbWVfZHVyYXRpb24gPSAxOyAgIC8qIDEgdGltZWJhc2UgdGljayBwZXIgZnJhbWUgKi8KKworICAgIGludCAgICAgICAgICAgICAgICAgIGxheWVyaW5nX21vZGUgPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgIGZyYW1lc19pbl9sYXllcltWUFhfVFNfTUFYX0xBWUVSU10gPSB7MH07CisgICAgaW50ICAgICAgICAgICAgICAgICAgbGF5ZXJfZmxhZ3NbVlBYX1RTX01BWF9QRVJJT0RJQ0lUWV0gPSB7MH07CisgICAgaW50ICAgICAgICAgICAgICAgICAgZmxhZ19wZXJpb2RpY2l0eTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtYXhfaW50cmFfc2l6ZV9wY3Q7CisKKyAgICAvKiBDaGVjayB1c2FnZSBhbmQgYXJndW1lbnRzICovCisgICAgaWYgKGFyZ2MgPCA5KQorICAgICAgICBkaWUoIlVzYWdlOiAlcyA8aW5maWxlPiA8b3V0ZmlsZT4gPHdpZHRoPiA8aGVpZ2h0PiA8cmF0ZV9udW0+ICIKKyAgICAgICAgICAgICIgPHJhdGVfZGVuPiA8bW9kZT4gPFJhdGVfMD4gLi4uIDxSYXRlX25sYXllcnMtMT5cbiIsIGFyZ3ZbMF0pOworCisgICAgd2lkdGggID0gc3RydG9sIChhcmd2WzNdLCBOVUxMLCAwKTsKKyAgICBoZWlnaHQgPSBzdHJ0b2wgKGFyZ3ZbNF0sIE5VTEwsIDApOworICAgIGlmICh3aWR0aCA8IDE2IHx8IHdpZHRoJTIgfHwgaGVpZ2h0IDwxNiB8fCBoZWlnaHQlMikKKyAgICAgICAgZGllICgiSW52YWxpZCByZXNvbHV0aW9uOiAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAoIXNzY2FuZihhcmd2WzddLCAiJWQiLCAmbGF5ZXJpbmdfbW9kZSkpCisgICAgICAgIGRpZSAoIkludmFsaWQgbW9kZSAlcyIsIGFyZ3ZbN10pOworICAgIGlmIChsYXllcmluZ19tb2RlPDAgfHwgbGF5ZXJpbmdfbW9kZT4xMSkKKyAgICAgICAgZGllICgiSW52YWxpZCBtb2RlICgwLi4xMSkgJXMiLCBhcmd2WzddKTsKKworICAgIGlmIChhcmdjICE9IDgrbW9kZV90b19udW1fbGF5ZXJzW2xheWVyaW5nX21vZGVdKQorICAgICAgICBkaWUgKCJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKworICAgIGlmICghdnB4X2ltZ19hbGxvYyAoJnJhdywgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwgMzIpKQorICAgICAgICBkaWUgKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW1hZ2UiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHByaW50ZigiVXNpbmcgJXNcbiIsdnB4X2NvZGVjX2lmYWNlX25hbWUoaW50ZXJmYWNlKSk7CisKKyAgICAvKiBQb3B1bGF0ZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICByZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KGludGVyZmFjZSwgJmNmZywgMCk7CisgICAgaWYocmVzKSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkIHRvIGdldCBjb25maWc6ICVzXG4iLCB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXMpKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIG91ciBzZXR0aW5ncyAqLworICAgIGNmZy5nX3cgPSB3aWR0aDsKKyAgICBjZmcuZ19oID0gaGVpZ2h0OworCisgICAgLyogVGltZWJhc2UgZm9ybWF0IGUuZy4gMzBmcHM6IG51bWVyYXRvcj0xLCBkZW1vbmluYXRvcj0zMCAqLworICAgIGlmICghc3NjYW5mIChhcmd2WzVdLCAiJWQiLCAmY2ZnLmdfdGltZWJhc2UubnVtICkpCisgICAgICAgIGRpZSAoIkludmFsaWQgdGltZWJhc2UgbnVtZXJhdG9yICVzIiwgYXJndls1XSk7CisgICAgaWYgKCFzc2NhbmYgKGFyZ3ZbNl0sICIlZCIsICZjZmcuZ190aW1lYmFzZS5kZW4gKSkKKyAgICAgICAgZGllICgiSW52YWxpZCB0aW1lYmFzZSBkZW5vbWluYXRvciAlcyIsIGFyZ3ZbNl0pOworCisgICAgZm9yIChpPTg7IGk8OCttb2RlX3RvX251bV9sYXllcnNbbGF5ZXJpbmdfbW9kZV07IGkrKykKKyAgICAgICAgaWYgKCFzc2NhbmYoYXJndltpXSwgIiV1ZCIsICZjZmcudHNfdGFyZ2V0X2JpdHJhdGVbaS04XSkpCisgICAgICAgICAgICBkaWUgKCJJbnZhbGlkIGRhdGEgcmF0ZSAlcyIsIGFyZ3ZbaV0pOworCisgICAgLyogUmVhbCB0aW1lIHBhcmFtZXRlcnMgKi8KKyAgICBjZmcucmNfZHJvcGZyYW1lX3RocmVzaCA9IDA7CisgICAgY2ZnLnJjX2VuZF91c2FnZSAgICAgICAgPSBWUFhfQ0JSOworICAgIGNmZy5yY19yZXNpemVfYWxsb3dlZCAgID0gMDsKKyAgICBjZmcucmNfbWluX3F1YW50aXplciAgICA9IDI7CisgICAgY2ZnLnJjX21heF9xdWFudGl6ZXIgICAgPSA1NjsKKyAgICBjZmcucmNfdW5kZXJzaG9vdF9wY3QgICA9IDEwMDsKKyAgICBjZmcucmNfb3ZlcnNob290X3BjdCAgICA9IDE1OworICAgIGNmZy5yY19idWZfaW5pdGlhbF9zeiAgID0gNTAwOworICAgIGNmZy5yY19idWZfb3B0aW1hbF9zeiAgID0gNjAwOworICAgIGNmZy5yY19idWZfc3ogICAgICAgICAgID0gMTAwMDsKKworICAgIC8qIEVuYWJsZSBlcnJvciByZXNpbGllbnQgbW9kZSAqLworICAgIGNmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IDE7CisgICAgY2ZnLmdfbGFnX2luX2ZyYW1lcyAgID0gMDsKKyAgICBjZmcua2ZfbW9kZSAgICAgICAgICAgPSBWUFhfS0ZfRElTQUJMRUQ7CisKKyAgICAvKiBEaXNhYmxlIGF1dG9tYXRpYyBrZXlmcmFtZSBwbGFjZW1lbnQgKi8KKyAgICBjZmcua2ZfbWluX2Rpc3QgPSBjZmcua2ZfbWF4X2Rpc3QgPSAzMDAwOworCisgICAgLyogRGVmYXVsdCBzZXR0aW5nIGZvciBiaXRyYXRlOiB1c2VkIGluIHNwZWNpYWwgY2FzZSBvZiAxIGxheWVyIChjYXNlIDApLiAqLworICAgIGNmZy5yY190YXJnZXRfYml0cmF0ZSA9IGNmZy50c190YXJnZXRfYml0cmF0ZVswXTsKKworICAgIC8qIFRlbXBvcmFsIHNjYWxpbmcgcGFyYW1ldGVyczogKi8KKyAgICAvKiBOT1RFOiBUaGUgMyBwcmVkaWN0aW9uIGZyYW1lcyBjYW5ub3QgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgZHVlIHRvCisgICAgICogZGlmZmVyZW5jZXMgaW4gdGhlIHdheSB0aGV5IGFyZSBoYW5kbGVkIHRocm91Z2hvdXQgdGhlIGNvZGUuIFRoZQorICAgICAqIGZyYW1lcyBzaG91bGQgYmUgYWxsb2NhdGVkIHRvIGxheWVycyBpbiB0aGUgb3JkZXIgTEFTVCwgR0YsIEFSRi4KKyAgICAgKiBPdGhlciBjb21iaW5hdGlvbnMgd29yaywgYnV0IG1heSBwcm9kdWNlIHNsaWdodGx5IGluZmVyaW9yIHJlc3VsdHMuCisgICAgICovCisgICAgc3dpdGNoIChsYXllcmluZ19tb2RlKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgeworICAgICAgICAvKiAxLWxheWVyICovCisgICAgICAgaW50IGlkc1sxXSA9IHswfTsKKyAgICAgICBjZmcudHNfbnVtYmVyX2xheWVycyAgICAgPSAxOworICAgICAgIGNmZy50c19wZXJpb2RpY2l0eSAgICAgICA9IDE7CisgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICBtZW1jcHkoY2ZnLnRzX2xheWVyX2lkLCBpZHMsIHNpemVvZihpZHMpKTsKKworICAgICAgIGZsYWdfcGVyaW9kaWNpdHkgPSBjZmcudHNfcGVyaW9kaWNpdHk7CisKKyAgICAgICAvLyBVcGRhdGUgTCBvbmx5LgorICAgICAgIGxheWVyX2ZsYWdzWzBdID0gVlBYX0VGTEFHX0ZPUkNFX0tGICB8CisgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0dGIHwgVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIC8qIDItbGF5ZXJzLCAyLWZyYW1lIHBlcmlvZCAqLworICAgICAgICBpbnQgaWRzWzJdID0gezAsMX07CisgICAgICAgIGNmZy50c19udW1iZXJfbGF5ZXJzICAgICA9IDI7CisgICAgICAgIGNmZy50c19wZXJpb2RpY2l0eSAgICAgICA9IDI7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclswXSA9IDI7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgIG1lbWNweShjZmcudHNfbGF5ZXJfaWQsIGlkcywgc2l6ZW9mKGlkcykpOworCisgICAgICAgIGZsYWdfcGVyaW9kaWNpdHkgPSBjZmcudHNfcGVyaW9kaWNpdHk7CisjaWYgMQorICAgICAgICAvKiAwPUwsIDE9R0YsIEludHJhLWxheWVyIHByZWRpY3Rpb24gZW5hYmxlZCAqLworICAgICAgICBsYXllcl9mbGFnc1swXSA9IFZQWF9FRkxBR19GT1JDRV9LRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfR0YgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1JFRl9HRiB8IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICBsYXllcl9mbGFnc1sxXSA9IFZQOF9FRkxBR19OT19VUERfQVJGIHwgVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyNlbHNlCisgICAgICAgIC8qIDA9TCwgMT1HRiwgSW50cmEtbGF5ZXIgcHJlZGljdGlvbiBkaXNhYmxlZCAqLworICAgICAgICBsYXllcl9mbGFnc1swXSA9IFZQWF9FRkxBR19GT1JDRV9LRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfR0YgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1JFRl9HRiB8IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICBsYXllcl9mbGFnc1sxXSA9IFZQOF9FRkxBR19OT19VUERfQVJGIHwgVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8IFZQOF9FRkxBR19OT19SRUZfTEFTVDsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIDI6CisgICAgeworICAgICAgICAvKiAyLWxheWVycywgMy1mcmFtZSBwZXJpb2QgKi8KKyAgICAgICAgaW50IGlkc1szXSA9IHswLDEsMX07CisgICAgICAgIGNmZy50c19udW1iZXJfbGF5ZXJzICAgICA9IDI7CisgICAgICAgIGNmZy50c19wZXJpb2RpY2l0eSAgICAgICA9IDM7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclswXSA9IDM7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgIG1lbWNweShjZmcudHNfbGF5ZXJfaWQsIGlkcywgc2l6ZW9mKGlkcykpOworCisgICAgICAgIGZsYWdfcGVyaW9kaWNpdHkgPSBjZmcudHNfcGVyaW9kaWNpdHk7CisKKyAgICAgICAgLyogMD1MLCAxPUdGLCBJbnRyYS1sYXllciBwcmVkaWN0aW9uIGVuYWJsZWQgKi8KKyAgICAgICAgbGF5ZXJfZmxhZ3NbMF0gPSBWUFhfRUZMQUdfRk9SQ0VfS0YgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0dGIHwgVlA4X0VGTEFHX05PX1JFRl9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfR0YgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgbGF5ZXJfZmxhZ3NbMV0gPQorICAgICAgICBsYXllcl9mbGFnc1syXSA9IFZQOF9FRkxBR19OT19SRUZfR0YgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8IFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAzOgorICAgIHsKKyAgICAgICAgLyogMy1sYXllcnMsIDYtZnJhbWUgcGVyaW9kICovCisgICAgICAgIGludCBpZHNbNl0gPSB7MCwyLDIsMSwyLDJ9OworICAgICAgICBjZmcudHNfbnVtYmVyX2xheWVycyAgICAgPSAzOworICAgICAgICBjZmcudHNfcGVyaW9kaWNpdHkgICAgICAgPSA2OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA2OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAzOworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICBtZW1jcHkoY2ZnLnRzX2xheWVyX2lkLCBpZHMsIHNpemVvZihpZHMpKTsKKworICAgICAgICBmbGFnX3BlcmlvZGljaXR5ID0gY2ZnLnRzX3BlcmlvZGljaXR5OworCisgICAgICAgIC8qIDA9TCwgMT1HRiwgMj1BUkYsIEludHJhLWxheWVyIHByZWRpY3Rpb24gZW5hYmxlZCAqLworICAgICAgICBsYXllcl9mbGFnc1swXSA9IFZQWF9FRkxBR19GT1JDRV9LRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19SRUZfR0YgfCBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9HRiB8IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1szXSA9IFZQOF9FRkxBR19OT19SRUZfQVJGIHwgVlA4X0VGTEFHX05PX1VQRF9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICBsYXllcl9mbGFnc1sxXSA9CisgICAgICAgIGxheWVyX2ZsYWdzWzJdID0KKyAgICAgICAgbGF5ZXJfZmxhZ3NbNF0gPQorICAgICAgICBsYXllcl9mbGFnc1s1XSA9IFZQOF9FRkxBR19OT19VUERfR0YgfCBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIC8qIDMtbGF5ZXJzLCA0LWZyYW1lIHBlcmlvZCAqLworICAgICAgICBpbnQgaWRzWzRdID0gezAsMiwxLDJ9OworICAgICAgICBjZmcudHNfbnVtYmVyX2xheWVycyAgICAgPSAzOworICAgICAgICBjZmcudHNfcGVyaW9kaWNpdHkgICAgICAgPSA0OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICBtZW1jcHkoY2ZnLnRzX2xheWVyX2lkLCBpZHMsIHNpemVvZihpZHMpKTsKKworICAgICAgICBmbGFnX3BlcmlvZGljaXR5ID0gY2ZnLnRzX3BlcmlvZGljaXR5OworCisgICAgICAgIC8qIDA9TCwgMT1HRiwgMj1BUkYsIEludHJhLWxheWVyIHByZWRpY3Rpb24gZGlzYWJsZWQgKi8KKyAgICAgICAgbGF5ZXJfZmxhZ3NbMF0gPSBWUFhfRUZMQUdfRk9SQ0VfS0YgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0dGIHwgVlA4X0VGTEFHX05PX1JFRl9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfR0YgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgbGF5ZXJfZmxhZ3NbMl0gPSBWUDhfRUZMQUdfTk9fUkVGX0dGIHwgVlA4X0VGTEFHX05PX1JFRl9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgIGxheWVyX2ZsYWdzWzFdID0KKyAgICAgICAgbGF5ZXJfZmxhZ3NbM10gPSBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwgVlA4X0VGTEFHX05PX1VQRF9HRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgNToKKyAgICB7CisgICAgICAgIC8qIDMtbGF5ZXJzLCA0LWZyYW1lIHBlcmlvZCAqLworICAgICAgICBpbnQgaWRzWzRdID0gezAsMiwxLDJ9OworICAgICAgICBjZmcudHNfbnVtYmVyX2xheWVycyAgICAgPSAzOworICAgICAgICBjZmcudHNfcGVyaW9kaWNpdHkgICAgICAgPSA0OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICBtZW1jcHkoY2ZnLnRzX2xheWVyX2lkLCBpZHMsIHNpemVvZihpZHMpKTsKKworICAgICAgICBmbGFnX3BlcmlvZGljaXR5ID0gY2ZnLnRzX3BlcmlvZGljaXR5OworCisgICAgICAgIC8qIDA9TCwgMT1HRiwgMj1BUkYsIEludHJhLWxheWVyIHByZWRpY3Rpb24gZW5hYmxlZCBpbiBsYXllciAxLAorICAgICAgICAgKiBkaXNhYmxlZCBpbiBsYXllciAyCisgICAgICAgICAqLworICAgICAgICBsYXllcl9mbGFnc1swXSA9IFZQWF9FRkxBR19GT1JDRV9LRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19SRUZfR0YgfCBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9HRiB8IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1syXSA9IFZQOF9FRkxBR19OT19SRUZfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0xBU1QgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgbGF5ZXJfZmxhZ3NbMV0gPQorICAgICAgICBsYXllcl9mbGFnc1szXSA9IFZQOF9FRkxBR19OT19SRUZfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0xBU1QgfCBWUDhfRUZMQUdfTk9fVVBEX0dGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSA2OgorICAgIHsKKyAgICAgICAgLyogMy1sYXllcnMsIDQtZnJhbWUgcGVyaW9kICovCisgICAgICAgIGludCBpZHNbNF0gPSB7MCwyLDEsMn07CisgICAgICAgIGNmZy50c19udW1iZXJfbGF5ZXJzICAgICA9IDM7CisgICAgICAgIGNmZy50c19wZXJpb2RpY2l0eSAgICAgICA9IDQ7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclswXSA9IDQ7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclsxXSA9IDI7CisgICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclsyXSA9IDE7CisgICAgICAgIG1lbWNweShjZmcudHNfbGF5ZXJfaWQsIGlkcywgc2l6ZW9mKGlkcykpOworCisgICAgICAgIGZsYWdfcGVyaW9kaWNpdHkgPSBjZmcudHNfcGVyaW9kaWNpdHk7CisKKyAgICAgICAgLyogMD1MLCAxPUdGLCAyPUFSRiwgSW50cmEtbGF5ZXIgcHJlZGljdGlvbiBlbmFibGVkICovCisgICAgICAgIGxheWVyX2ZsYWdzWzBdID0gVlBYX0VGTEFHX0ZPUkNFX0tGICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1JFRl9HRiB8IFZQOF9FRkxBR19OT19SRUZfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0dGIHwgVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgIGxheWVyX2ZsYWdzWzJdID0gVlA4X0VGTEFHX05PX1JFRl9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVCB8IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1sxXSA9CisgICAgICAgIGxheWVyX2ZsYWdzWzNdID0gVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwgVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSA3OgorICAgIHsKKyAgICAgICAgLyogTk9URTogUHJvYmFibHkgb2YgYWNhZGVtaWMgaW50ZXJlc3Qgb25seSAqLworCisgICAgICAgIC8qIDUtbGF5ZXJzLCAxNi1mcmFtZSBwZXJpb2QgKi8KKyAgICAgICAgaW50IGlkc1sxNl0gPSB7MCw0LDMsNCwyLDQsMyw0LDEsNCwzLDQsMiw0LDMsNH07CisgICAgICAgIGNmZy50c19udW1iZXJfbGF5ZXJzICAgICA9IDU7CisgICAgICAgIGNmZy50c19wZXJpb2RpY2l0eSAgICAgICA9IDE2OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAxNjsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gODsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gNDsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzNdID0gMjsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzRdID0gMTsKKyAgICAgICAgbWVtY3B5KGNmZy50c19sYXllcl9pZCwgaWRzLCBzaXplb2YoaWRzKSk7CisKKyAgICAgICAgZmxhZ19wZXJpb2RpY2l0eSA9IGNmZy50c19wZXJpb2RpY2l0eTsKKworICAgICAgICBsYXllcl9mbGFnc1swXSAgPSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgICAgICAgIGxheWVyX2ZsYWdzWzFdICA9CisgICAgICAgIGxheWVyX2ZsYWdzWzNdICA9CisgICAgICAgIGxheWVyX2ZsYWdzWzVdICA9CisgICAgICAgIGxheWVyX2ZsYWdzWzddICA9CisgICAgICAgIGxheWVyX2ZsYWdzWzldICA9CisgICAgICAgIGxheWVyX2ZsYWdzWzExXSA9CisgICAgICAgIGxheWVyX2ZsYWdzWzEzXSA9CisgICAgICAgIGxheWVyX2ZsYWdzWzE1XSA9IFZQOF9FRkxBR19OT19VUERfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfR0YgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1syXSAgPQorICAgICAgICBsYXllcl9mbGFnc1s2XSAgPQorICAgICAgICBsYXllcl9mbGFnc1sxMF0gPQorICAgICAgICBsYXllcl9mbGFnc1sxNF0gPSBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgIGxheWVyX2ZsYWdzWzRdICA9CisgICAgICAgIGxheWVyX2ZsYWdzWzEyXSA9IFZQOF9FRkxBR19OT19SRUZfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1s4XSAgPSBWUDhfRUZMQUdfTk9fUkVGX0xBU1QgfCBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICAvKiAyLWxheWVycywgd2l0aCBzeW5jIHBvaW50IGF0IGZpcnN0IGZyYW1lIG9mIGxheWVyIDEuICovCisgICAgICAgIGludCBpZHNbMl0gPSB7MCwxfTsKKyAgICAgICAgY2ZnLnRzX251bWJlcl9sYXllcnMgICAgID0gMjsKKyAgICAgICAgY2ZnLnRzX3BlcmlvZGljaXR5ICAgICAgID0gMjsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMjsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMTsKKyAgICAgICAgbWVtY3B5KGNmZy50c19sYXllcl9pZCwgaWRzLCBzaXplb2YoaWRzKSk7CisKKyAgICAgICAgZmxhZ19wZXJpb2RpY2l0eSA9IDg7CisKKyAgICAgICAgLyogMD1MLCAxPUdGICovCisgICAgICAgIC8vIEFSRiBpcyB1c2VkIGFzIHByZWRpY3RvciBmb3IgYWxsIGZyYW1lcywgYW5kIGlzIG9ubHkgdXBkYXRlZCBvbgorICAgICAgICAvLyBrZXkgZnJhbWUuIFN5bmMgcG9pbnQgZXZlcnkgOCBmcmFtZXMuCisKKyAgICAgICAgLy8gTGF5ZXIgMDogcHJlZGljdCBmcm9tIEwgYW5kIEFSRiwgdXBkYXRlIEwgYW5kIEcuCisgICAgICAgIGxheWVyX2ZsYWdzWzBdID0gVlBYX0VGTEFHX0ZPUkNFX0tGICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1JFRl9HRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9BUkY7CisKKyAgICAgICAgLy8gTGF5ZXIgMTogc3luYyBwb2ludDogcHJlZGljdCBmcm9tIEwgYW5kIEFSRiwgYW5kIHVwZGF0ZSBHLgorICAgICAgICBsYXllcl9mbGFnc1sxXSA9IFZQOF9FRkxBR19OT19SRUZfR0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9BUkY7CisKKyAgICAgICAgLy8gTGF5ZXIgMCwgcHJlZGljdCBmcm9tIEwgYW5kIEFSRiwgdXBkYXRlIEwuCisgICAgICAgIGxheWVyX2ZsYWdzWzJdID0gVlA4X0VGTEFHX05PX1JFRl9HRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfR0YgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKworICAgICAgICAvLyBMYXllciAxOiBwcmVkaWN0IGZyb20gTCwgRyBhbmQgQVJGLCBhbmQgdXBkYXRlIEcuCisgICAgICAgIGxheWVyX2ZsYWdzWzNdID0gVlA4X0VGTEFHX05PX1VQRF9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworCisgICAgICAgIC8vIExheWVyIDAKKyAgICAgICAgbGF5ZXJfZmxhZ3NbNF0gPSBsYXllcl9mbGFnc1syXTsKKworICAgICAgICAvLyBMYXllciAxCisgICAgICAgIGxheWVyX2ZsYWdzWzVdID0gbGF5ZXJfZmxhZ3NbM107CisKKyAgICAgICAgLy8gTGF5ZXIgMAorICAgICAgICBsYXllcl9mbGFnc1s2XSA9IGxheWVyX2ZsYWdzWzRdOworCisgICAgICAgIC8vIExheWVyIDEKKyAgICAgICAgbGF5ZXJfZmxhZ3NbN10gPSBsYXllcl9mbGFnc1s1XTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSA5OgorICAgIHsKKyAgICAgICAgLyogMy1sYXllcnMgKi8KKyAgICAgICAgLy8gU3luYyBwb2ludHMgZm9yIGxheWVyIDEgYW5kIDIgZXZlcnkgOCBmcmFtZXMuCisKKyAgICAgICAgaW50IGlkc1s0XSA9IHswLDIsMSwyfTsKKyAgICAgICAgY2ZnLnRzX251bWJlcl9sYXllcnMgICAgID0gMzsKKyAgICAgICAgY2ZnLnRzX3BlcmlvZGljaXR5ICAgICAgID0gNDsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgbWVtY3B5KGNmZy50c19sYXllcl9pZCwgaWRzLCBzaXplb2YoaWRzKSk7CisKKyAgICAgICAgZmxhZ19wZXJpb2RpY2l0eSA9IDg7CisKKyAgICAgICAgLyogMD1MLCAxPUdGLCAyPUFSRiAqLworICAgICAgICBsYXllcl9mbGFnc1swXSA9IFZQWF9FRkxBR19GT1JDRV9LRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19SRUZfR0YgfCBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9HRiB8IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1sxXSA9IFZQOF9FRkxBR19OT19SRUZfR0YgfCBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwgVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgbGF5ZXJfZmxhZ3NbMl0gPSBWUDhfRUZMQUdfTk9fUkVGX0dGICAgfCBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwgVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgIGxheWVyX2ZsYWdzWzNdID0KKyAgICAgICAgbGF5ZXJfZmxhZ3NbNV0gPSBWUDhfRUZMQUdfTk9fVVBEX0xBU1QgfCBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICBsYXllcl9mbGFnc1s0XSA9IFZQOF9FRkxBR19OT19SRUZfR0YgfCBWUDhfRUZMQUdfTk9fUkVGX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9HRiB8IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICBsYXllcl9mbGFnc1s2XSA9IFZQOF9FRkxBR19OT19SRUZfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0xBU1QgfCBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgbGF5ZXJfZmxhZ3NbN10gPSBWUDhfRUZMQUdfTk9fVVBEX0xBU1QgfCBWUDhfRUZMQUdfTk9fVVBEX0dGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxMDoKKyAgICB7CisgICAgICAgIC8vIDMtbGF5ZXJzIHN0cnVjdHVyZSB3aGVyZSBBUkYgaXMgdXNlZCBhcyBwcmVkaWN0b3IgZm9yIGFsbCBmcmFtZXMsCisgICAgICAgIC8vIGFuZCBpcyBvbmx5IHVwZGF0ZWQgb24ga2V5IGZyYW1lLgorICAgICAgICAvLyBTeW5jIHBvaW50cyBmb3IgbGF5ZXIgMSBhbmQgMiBldmVyeSA4IGZyYW1lcy4KKworICAgICAgICBpbnQgaWRzWzRdID0gezAsMiwxLDJ9OworICAgICAgICBjZmcudHNfbnVtYmVyX2xheWVycyAgICAgPSAzOworICAgICAgICBjZmcudHNfcGVyaW9kaWNpdHkgICAgICAgPSA0OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICBtZW1jcHkoY2ZnLnRzX2xheWVyX2lkLCBpZHMsIHNpemVvZihpZHMpKTsKKworICAgICAgICBmbGFnX3BlcmlvZGljaXR5ID0gODsKKworICAgICAgICAvKiAwPUwsIDE9R0YsIDI9QVJGICovCisKKyAgICAgICAgLy8gTGF5ZXIgMDogcHJlZGljdCBmcm9tIEwgYW5kIEFSRjsgdXBkYXRlIEwgYW5kIEcuCisgICAgICAgIGxheWVyX2ZsYWdzWzBdID0gIFZQWF9FRkxBR19GT1JDRV9LRiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19SRUZfR0Y7CisKKyAgICAgICAgLy8gTGF5ZXIgMjogc3luYyBwb2ludDogcHJlZGljdCBmcm9tIEwgYW5kIEFSRjsgdXBkYXRlIG5vbmUuCisgICAgICAgIGxheWVyX2ZsYWdzWzFdID0gVlA4X0VGTEFHX05PX1JFRl9HRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9HRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworCisgICAgICAgIC8vIExheWVyIDE6IHN5bmMgcG9pbnQ6IHByZWRpY3QgZnJvbSBMIGFuZCBBUkY7IHVwZGF0ZSBHLgorICAgICAgICBsYXllcl9mbGFnc1syXSA9IFZQOF9FRkxBR19OT19SRUZfR0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisKKyAgICAgICAgLy8gTGF5ZXIgMjogcHJlZGljdCBmcm9tIEwsIEcsIEFSRjsgdXBkYXRlIG5vbmUuCisgICAgICAgIGxheWVyX2ZsYWdzWzNdID0gVlA4X0VGTEFHX05PX1VQRF9HRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9BUkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworCisgICAgICAgIC8vIExheWVyIDA6IHByZWRpY3QgZnJvbSBMIGFuZCBBUkY7IHVwZGF0ZSBMLgorICAgICAgICBsYXllcl9mbGFnc1s0XSA9IFZQOF9FRkxBR19OT19VUERfR0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0dGOworCisgICAgICAgIC8vIExheWVyIDI6IHByZWRpY3QgZnJvbSBMLCBHLCBBUkY7IHVwZGF0ZSBub25lLgorICAgICAgICBsYXllcl9mbGFnc1s1XSA9IGxheWVyX2ZsYWdzWzNdOworCisgICAgICAgIC8vIExheWVyIDE6IHByZWRpY3QgZnJvbSBMLCBHLCBBUkY7IHVwZGF0ZSBHLgorICAgICAgICBsYXllcl9mbGFnc1s2XSA9IFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisKKyAgICAgICAgLy8gTGF5ZXIgMjogcHJlZGljdCBmcm9tIEwsIEcsIEFSRjsgdXBkYXRlIG5vbmUuCisgICAgICAgIGxheWVyX2ZsYWdzWzddID0gbGF5ZXJfZmxhZ3NbM107CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDExOgorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgIC8vIDMtbGF5ZXJzIHN0cnVjdHVyZSBhcyBpbiBjYXNlIDEwLCBidXQgbm8gc3luYy9yZWZyZXNoIHBvaW50cyBmb3IKKyAgICAgICAvLyBsYXllciAxIGFuZCAyLgorCisgICAgICAgaW50IGlkc1s0XSA9IHswLDIsMSwyfTsKKyAgICAgICBjZmcudHNfbnVtYmVyX2xheWVycyAgICAgPSAzOworICAgICAgIGNmZy50c19wZXJpb2RpY2l0eSAgICAgICA9IDQ7CisgICAgICAgY2ZnLnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICBjZmcudHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgIGNmZy50c19yYXRlX2RlY2ltYXRvclsyXSA9IDE7CisgICAgICAgbWVtY3B5KGNmZy50c19sYXllcl9pZCwgaWRzLCBzaXplb2YoaWRzKSk7CisKKyAgICAgICBmbGFnX3BlcmlvZGljaXR5ID0gODsKKworICAgICAgIC8qIDA9TCwgMT1HRiwgMj1BUkYgKi8KKworICAgICAgIC8vIExheWVyIDA6IHByZWRpY3QgZnJvbSBMIGFuZCBBUkY7IHVwZGF0ZSBMLgorICAgICAgIGxheWVyX2ZsYWdzWzBdID0gVlA4X0VGTEFHX05PX1VQRF9HRiB8CisgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0FSRiB8CisgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgIGxheWVyX2ZsYWdzWzRdID0gbGF5ZXJfZmxhZ3NbMF07CisKKyAgICAgICAvLyBMYXllciAxOiBwcmVkaWN0IGZyb20gTCwgRywgQVJGOyB1cGRhdGUgRy4KKyAgICAgICBsYXllcl9mbGFnc1syXSA9IFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICBsYXllcl9mbGFnc1s2XSA9IGxheWVyX2ZsYWdzWzJdOworCisgICAgICAgLy8gTGF5ZXIgMjogcHJlZGljdCBmcm9tIEwsIEcsIEFSRjsgdXBkYXRlIG5vbmUuCisgICAgICAgbGF5ZXJfZmxhZ3NbMV0gPSBWUDhfRUZMQUdfTk9fVVBEX0dGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfQVJGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9FRkxBR19OT19VUERfTEFTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgbGF5ZXJfZmxhZ3NbM10gPSBsYXllcl9mbGFnc1sxXTsKKyAgICAgICBsYXllcl9mbGFnc1s1XSA9IGxheWVyX2ZsYWdzWzFdOworICAgICAgIGxheWVyX2ZsYWdzWzddID0gbGF5ZXJfZmxhZ3NbMV07CisgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIC8qIE9wZW4gaW5wdXQgZmlsZSAqLworICAgIGlmKCEoaW5maWxlID0gZm9wZW4oYXJndlsxXSwgInJiIikpKQorICAgICAgICBkaWUoIkZhaWxlZCB0byBvcGVuICVzIGZvciByZWFkaW5nIiwgYXJndlsxXSk7CisKKyAgICAvKiBPcGVuIGFuIG91dHB1dCBmaWxlIGZvciBlYWNoIHN0cmVhbSAqLworICAgIGZvciAoaT0wOyBpPGNmZy50c19udW1iZXJfbGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICBjaGFyIGZpbGVfbmFtZVs1MTJdOworICAgICAgICBzcHJpbnRmIChmaWxlX25hbWUsICIlc18lZC5pdmYiLCBhcmd2WzJdLCBpKTsKKyAgICAgICAgaWYgKCEob3V0ZmlsZVtpXSA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIikpKQorICAgICAgICAgICAgZGllKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3Igd3JpdGluZyIsIGZpbGVfbmFtZSk7CisgICAgICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihvdXRmaWxlW2ldLCAmY2ZnLCAwKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGNvZGVjICovCisgICAgaWYgKHZweF9jb2RlY19lbmNfaW5pdCAoJmNvZGVjLCBpbnRlcmZhY2UsICZjZmcsIDApKQorICAgICAgICBkaWVfY29kZWMgKCZjb2RlYywgIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKworICAgIC8qIENhcCBDUFUgJiBmaXJzdCBJLWZyYW1lIHNpemUgKi8KKyAgICB2cHhfY29kZWNfY29udHJvbCAoJmNvZGVjLCBWUDhFX1NFVF9DUFVVU0VELCAgICAgICAgICAgICAgICAtNik7CisgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZjb2RlYywgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwgICAgICAxKTsKKyAgICB2cHhfY29kZWNfY29udHJvbCAoJmNvZGVjLCBWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWSwgICAgICAgMSk7CisgICAgdnB4X2NvZGVjX2NvbnRyb2woJmNvZGVjLCBWUDhFX1NFVF9UT0tFTl9QQVJUSVRJT05TLCAgICAgICAxKTsKKworICAgIG1heF9pbnRyYV9zaXplX3BjdCA9IChpbnQpICgoKGRvdWJsZSljZmcucmNfYnVmX29wdGltYWxfc3ogKiAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAoKGRvdWJsZSkgY2ZnLmdfdGltZWJhc2UuZGVuIC8gY2ZnLmdfdGltZWJhc2UubnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgIC8gMTAuMCk7CisgICAgLyogcHJpbnRmICgibWF4X2ludHJhX3NpemVfcGN0PSVkXG4iLCBtYXhfaW50cmFfc2l6ZV9wY3QpOyAqLworCisgICAgdnB4X2NvZGVjX2NvbnRyb2woJmNvZGVjLCBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgbWF4X2ludHJhX3NpemVfcGN0KTsKKworICAgIGZyYW1lX2F2YWlsID0gMTsKKyAgICB3aGlsZSAoZnJhbWVfYXZhaWwgfHwgZ290X2RhdGEpIHsKKyAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKKyAgICAgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3Q7CisKKyAgICAgICAgZmxhZ3MgPSBsYXllcl9mbGFnc1tmcmFtZV9jbnQgJSBmbGFnX3BlcmlvZGljaXR5XTsKKworICAgICAgICBmcmFtZV9hdmFpbCA9IHJlYWRfZnJhbWUoaW5maWxlLCAmcmF3KTsKKyAgICAgICAgaWYgKHZweF9jb2RlY19lbmNvZGUoJmNvZGVjLCBmcmFtZV9hdmFpbD8gJnJhdyA6IE5VTEwsIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBmbGFncywgVlBYX0RMX1JFQUxUSU1FKSkKKyAgICAgICAgICAgIGRpZV9jb2RlYygmY29kZWMsICJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIik7CisKKyAgICAgICAgLyogUmVzZXQgS0YgZmxhZyAqLworICAgICAgICBpZiAobGF5ZXJpbmdfbW9kZSAhPSA3KQorICAgICAgICAgICAgbGF5ZXJfZmxhZ3NbMF0gJj0gflZQWF9FRkxBR19GT1JDRV9LRjsKKworICAgICAgICBnb3RfZGF0YSA9IDA7CisgICAgICAgIHdoaWxlICggKHBrdCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgmY29kZWMsICZpdGVyKSkgKSB7CisgICAgICAgICAgICBnb3RfZGF0YSA9IDE7CisgICAgICAgICAgICBzd2l0Y2ggKHBrdC0+a2luZCkgeworICAgICAgICAgICAgY2FzZSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUOgorICAgICAgICAgICAgICAgIGZvciAoaT1jZmcudHNfbGF5ZXJfaWRbZnJhbWVfY250ICUgY2ZnLnRzX3BlcmlvZGljaXR5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPGNmZy50c19udW1iZXJfbGF5ZXJzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cml0ZV9pdmZfZnJhbWVfaGVhZGVyKG91dGZpbGVbaV0sIHBrdCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBmd3JpdGUocGt0LT5kYXRhLmZyYW1lLmJ1ZiwgMSwgcGt0LT5kYXRhLmZyYW1lLnN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVbaV0pOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNfaW5fbGF5ZXJbaV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lX2NudCsrOworICAgICAgICBwdHMgKz0gZnJhbWVfZHVyYXRpb247CisgICAgfQorICAgIGZjbG9zZSAoaW5maWxlKTsKKworICAgIHByaW50ZiAoIlByb2Nlc3NlZCAlZCBmcmFtZXMuXG4iLGZyYW1lX2NudC0xKTsKKyAgICBpZiAodnB4X2NvZGVjX2Rlc3Ryb3koJmNvZGVjKSkKKyAgICAgICAgICAgIGRpZV9jb2RlYyAoJmNvZGVjLCAiRmFpbGVkIHRvIGRlc3Ryb3kgY29kZWMiKTsKKworICAgIC8qIFRyeSB0byByZXdyaXRlIHRoZSBvdXRwdXQgZmlsZSBoZWFkZXJzIHdpdGggdGhlIGFjdHVhbCBmcmFtZSBjb3VudCAqLworICAgIGZvciAoaT0wOyBpPGNmZy50c19udW1iZXJfbGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICBpZiAoIWZzZWVrKG91dGZpbGVbaV0sIDAsIFNFRUtfU0VUKSkKKyAgICAgICAgICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlciAob3V0ZmlsZVtpXSwgJmNmZywgZnJhbWVzX2luX2xheWVyW2ldKTsKKyAgICAgICAgZmNsb3NlIChvdXRmaWxlW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdnB4L2V4cG9ydHNfY29tIGIvbGlidnB4L3ZweC9leHBvcnRzX2NvbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4L2V4cG9ydHNfY29tCnJlbmFtZSB0byBsaWJ2cHgvdnB4L2V4cG9ydHNfY29tCmRpZmYgLS1naXQgYS92cHgvZXhwb3J0c19kZWMgYi9saWJ2cHgvdnB4L2V4cG9ydHNfZGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHgvZXhwb3J0c19kZWMKcmVuYW1lIHRvIGxpYnZweC92cHgvZXhwb3J0c19kZWMKZGlmZiAtLWdpdCBhL3ZweC9leHBvcnRzX2VuYyBiL2xpYnZweC92cHgvZXhwb3J0c19lbmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweC9leHBvcnRzX2VuYwpyZW5hbWUgdG8gbGlidnB4L3ZweC9leHBvcnRzX2VuYwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCBiL2xpYnZweC92cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3NDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiFcZmlsZQorICogXGJyaWVmIERlc2NyaWJlcyB0aGUgZGVjb2RlciBhbGdvcml0aG0gaW50ZXJmYWNlIGZvciBhbGdvcml0aG0KKyAqICAgICAgICBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIHByaXZhdGUgc3RydWN0dXJlcyBhbmQgZGF0YSB0eXBlcyB0aGF0IGFyZSBvbmx5CisgKiByZWxldmFudCB0byBpbXBsZW1lbnRpbmcgYW4gYWxnb3JpdGhtLCBhcyBvcHBvc2VkIHRvIHVzaW5nIGl0LgorICoKKyAqIFRvIGNyZWF0ZSBhIGRlY29kZXIgYWxnb3JpdGhtIGNsYXNzLCBhbiBpbnRlcmZhY2Ugc3RydWN0dXJlIGlzIHB1dAorICogaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZToKKyAqICAgICA8cHJlPgorICogICAgIG15X2NvZGVjLmM6CisgKiAgICAgICB2cHhfY29kZWNfaWZhY2VfdCBteV9jb2RlYyA9IHsKKyAqICAgICAgICAgICAiTXkgQ29kZWMgdjEuMCIsCisgKiAgICAgICAgICAgVlBYX0NPREVDX0FMR19BQklfVkVSU0lPTiwKKyAqICAgICAgICAgICAuLi4KKyAqICAgICAgIH07CisgKiAgICAgPC9wcmU+CisgKgorICogQW4gYXBwbGljYXRpb24gaW5zdGFudGlhdGVzIGEgc3BlY2lmaWMgZGVjb2RlciBpbnN0YW5jZSBieSB1c2luZworICogdnB4X2NvZGVjX2luaXQoKSBhbmQgYSBwb2ludGVyIHRvIHRoZSBhbGdvcml0aG0ncyBpbnRlcmZhY2Ugc3RydWN0dXJlOgorICogICAgIDxwcmU+CisgKiAgICAgbXlfYXBwLmM6CisgKiAgICAgICBleHRlcm4gdnB4X2NvZGVjX2lmYWNlX3QgbXlfY29kZWM7CisgKiAgICAgICB7CisgKiAgICAgICAgICAgdnB4X2NvZGVjX2N0eF90IGFsZ287CisgKiAgICAgICAgICAgcmVzID0gdnB4X2NvZGVjX2luaXQoJmFsZ28sICZteV9jb2RlYyk7CisgKiAgICAgICB9CisgKiAgICAgPC9wcmU+CisgKgorICogT25jZSBpbml0aWFsaXplZCwgdGhlIGluc3RhbmNlIGlzIG1hbmdlZCB1c2luZyBvdGhlciBmdW5jdGlvbnMgZnJvbQorICogdGhlIHZweF9jb2RlY18qIGZhbWlseS4KKyAqLworI2lmbmRlZiBWUFhfQ09ERUNfSU5URVJOQUxfSAorI2RlZmluZSBWUFhfQ09ERUNfSU5URVJOQUxfSAorI2luY2x1ZGUgIi4uL3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAiLi4vdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworCisvKiFcYnJpZWYgQ3VycmVudCBBQkkgdmVyc2lvbiBudW1iZXIKKyAqCisgKiBcaW50ZXJuYWwKKyAqIElmIHRoaXMgZmlsZSBpcyBhbHRlcmVkIGluIGFueSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBBQkksIHRoaXMgdmFsdWUKKyAqIG11c3QgYmUgYnVtcGVkLiAgRXhhbXBsZXMgaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgY2hhbmdpbmcKKyAqIHR5cGVzLCByZW1vdmluZyBvciByZWFzc2lnbmluZyBlbnVtcywgYWRkaW5nL3JlbW92aW5nL3JlYXJyYW5naW5nCisgKiBmaWVsZHMgdG8gc3RydWN0dXJlcworICovCisjZGVmaW5lIFZQWF9DT0RFQ19JTlRFUk5BTF9BQklfVkVSU0lPTiAoNCkgLyoqPFxoaWRlaW5pdGlhbGl6ZXIqLworCit0eXBlZGVmIHN0cnVjdCB2cHhfY29kZWNfYWxnX3ByaXYgIHZweF9jb2RlY19hbGdfcHJpdl90OwordHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX3ByaXZfZW5jX21yX2NmZyB2cHhfY29kZWNfcHJpdl9lbmNfbXJfY2ZnX3Q7CisKKy8qIVxicmllZiBpbml0IGZ1bmN0aW9uIHBvaW50ZXIgcHJvdG90eXBlCisgKgorICogUGVyZm9ybXMgYWxnb3JpdGhtLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkZWNvZGVyIGNvbnRleHQuIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgZ2VuZXJpYyB2cHhfY29kZWNfaW5pdCgpIHdyYXBwZXIgZnVuY3Rpb24sIHNvCisgKiBwbHVnaW5zIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBtYXkgdHJ1c3QgdGhlIGlucHV0IHBhcmFtZXRlcnMgdG8gYmUKKyAqIHByb3Blcmx5IGluaXRpYWxpemVkLgorICoKKyAqIFxwYXJhbVtpbl0gY3R4ICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAorICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgKiAgICAgVGhlIGlucHV0IHN0cmVhbSB3YXMgcmVjb2duaXplZCBhbmQgZGVjb2RlciBpbml0aWFsaXplZC4KKyAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19NRU1fRVJST1IKKyAqICAgICBNZW1vcnkgb3BlcmF0aW9uIGZhaWxlZC4KKyAqLwordHlwZWRlZiB2cHhfY29kZWNfZXJyX3QgKCp2cHhfY29kZWNfaW5pdF9mbl90KSh2cHhfY29kZWNfY3R4X3QgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19wcml2X2VuY19tcl9jZmdfdCAqZGF0YSk7CisKKy8qIVxicmllZiBkZXN0cm95IGZ1bmN0aW9uIHBvaW50ZXIgcHJvdG90eXBlCisgKgorICogUGVyZm9ybXMgYWxnb3JpdGhtLXNwZWNpZmljIGRlc3RydWN0aW9uIG9mIHRoZSBkZWNvZGVyIGNvbnRleHQuIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgZ2VuZXJpYyB2cHhfY29kZWNfZGVzdHJveSgpIHdyYXBwZXIgZnVuY3Rpb24sCisgKiBzbyBwbHVnaW5zIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBtYXkgdHJ1c3QgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAqIHRvIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLgorICoKKyAqIFxwYXJhbVtpbl0gY3R4ICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAorICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgKiAgICAgVGhlIGlucHV0IHN0cmVhbSB3YXMgcmVjb2duaXplZCBhbmQgZGVjb2RlciBpbml0aWFsaXplZC4KKyAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19NRU1fRVJST1IKKyAqICAgICBNZW1vcnkgb3BlcmF0aW9uIGZhaWxlZC4KKyAqLwordHlwZWRlZiB2cHhfY29kZWNfZXJyX3QgKCp2cHhfY29kZWNfZGVzdHJveV9mbl90KSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4KTsKKworLyohXGJyaWVmIHBhcnNlIHN0cmVhbSBpbmZvIGZ1bmN0aW9uIHBvaW50ZXIgcHJvdG90eXBlCisgKgorICogUGVyZm9ybXMgaGlnaCBsZXZlbCBwYXJzaW5nIG9mIHRoZSBiaXRzdHJlYW0uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5CisgKiB0aGUgZ2VuZXJpYyB2cHhfY29kZWNfcGFyc2Vfc3RyZWFtKCkgd3JhcHBlciBmdW5jdGlvbiwgc28gcGx1Z2lucyBpbXBsZW1lbnRpbmcKKyAqIHRoaXMgaW50ZXJmYWNlIG1heSB0cnVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycyB0byBiZSBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAqCisgKiBccGFyYW1baW5dICAgICAgZGF0YSAgICBQb2ludGVyIHRvIGEgYmxvY2sgb2YgZGF0YSB0byBwYXJzZQorICogXHBhcmFtW2luXSAgICAgIGRhdGFfc3ogU2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIKKyAqIFxwYXJhbVtpbixvdXRdICBzaSAgICAgIFBvaW50ZXIgdG8gc3RyZWFtIGluZm8gdG8gdXBkYXRlLiBUaGUgc2l6ZSBtZW1iZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFxyZWYgTVVTVCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCwgYnV0IFxyZWYgTUFZIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9iYmVyZWQgYnkgdGhlIGFsZ29yaXRobS4gVGhpcyBwYXJhbWV0ZXIgXHJlZiBNQVkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIE5VTEwuCisgKgorICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgKiAgICAgQml0c3RyZWFtIGlzIHBhcnNhYmxlIGFuZCBzdHJlYW0gaW5mb3JtYXRpb24gdXBkYXRlZAorICovCit0eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19wZWVrX3NpX2ZuX3QpKGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBkYXRhX3N6LAorICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpOworCisvKiFcYnJpZWYgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0cmVhbS4KKyAqCisgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLgorICoKKyAqIFxwYXJhbVtpbl0gICAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAqIFxwYXJhbVtpbixvdXRdICBzaSAgICAgIFBvaW50ZXIgdG8gc3RyZWFtIGluZm8gdG8gdXBkYXRlLiBUaGUgc2l6ZSBtZW1iZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFxyZWYgTVVTVCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCwgYnV0IFxyZWYgTUFZIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9iYmVyZWQgYnkgdGhlIGFsZ29yaXRobS4gVGhpcyBwYXJhbWV0ZXIgXHJlZiBNQVkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIE5VTEwuCisgKgorICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgKiAgICAgQml0c3RyZWFtIGlzIHBhcnNhYmxlIGFuZCBzdHJlYW0gaW5mb3JtYXRpb24gdXBkYXRlZAorICovCit0eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19nZXRfc2lfZm5fdCkodnB4X2NvZGVjX2FsZ19wcml2X3QgICAgKmN0eCwKKyAgICAgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKnNpKTsKKworLyohXGJyaWVmIGNvbnRyb2wgZnVuY3Rpb24gcG9pbnRlciBwcm90b3R5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZXhjaGFuZ2UgYWxnb3JpdGhtIHNwZWNpZmljIGRhdGEgd2l0aCB0aGUgZGVjb2RlcgorICogaW5zdGFuY2UuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZlYXR1cmVzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhcgorICogYWxnb3JpdGhtLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIHZweF9jb2RlY19jb250cm9sKCkgd3JhcHBlcgorICogZnVuY3Rpb24sIHNvIHBsdWdpbnMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIG1heSB0cnVzdCB0aGUgaW5wdXQKKyAqIHBhcmFtZXRlcnMgdG8gYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEhvd2V2ZXIsICB0aGlzIGludGVyZmFjZSBkb2VzIG5vdAorICogcHJvdmlkZSB0eXBlIHNhZmV0eSBmb3IgdGhlIGV4Y2hhbmdlZCBkYXRhIG9yIGFzc2lnbiBtZWFuaW5ncyB0byB0aGUKKyAqIGNvbnRyb2wgY29kZXMuIFRob3NlIGRldGFpbHMgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgYWxnb3JpdGhtJ3MKKyAqIGhlYWRlciBmaWxlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgY3RybF9pZCBwYXJhbWV0ZXIgaXMgZ3VhcmFudGVlZCB0byBleGlzdAorICogaW4gdGhlIGFsZ29yaXRobSdzIGNvbnRyb2wgbWFwcGluZyB0YWJsZSwgYW5kIHRoZSBkYXRhIHBhcmFtZXRlciBtYXkgYmUgTlVMTC4KKyAqCisgKgorICogXHBhcmFtW2luXSAgICAgY3R4ICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0CisgKiBccGFyYW1baW5dICAgICBjdHJsX2lkICAgICAgICAgIEFsZ29yaXRobSBzcGVjaWZpYyBjb250cm9sIGlkZW50aWZpZXIKKyAqIFxwYXJhbVtpbixvdXRdIGRhdGEgICAgICAgICAgICAgRGF0YSB0byBleGNoYW5nZSB3aXRoIGFsZ29yaXRobSBpbnN0YW5jZS4KKyAqCisgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKKyAqICAgICBUaGUgaW50ZXJuYWwgc3RhdGUgZGF0YSB3YXMgZGVzZXJpYWxpemVkLgorICovCit0eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19jb250cm9sX2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICAqY3R4LAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjdHJsX2lkLAorICAgICAgICB2YV9saXN0ICAgICAgICAgICAgICBhcCk7CisKKy8qIVxicmllZiBjb250cm9sIGZ1bmN0aW9uIHBvaW50ZXIgbWFwcGluZworICoKKyAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGNvbnRyb2wgaWRlbnRpZmllcnMgYW5kCisgKiBpbXBsZW1lbnRpbmcgZnVuY3Rpb25zLiBFYWNoIGFsZ29yaXRobSBwcm92aWRlcyBhIGxpc3Qgb2YgdGhlc2UKKyAqIG1hcHBpbmdzLiBUaGlzIGxpc3QgaXMgc2VhcmNoZWQgYnkgdGhlIHZweF9jb2RlY19jb250cm9sKCkgd3JhcHBlcgorICogZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9uIHRvIGludm9rZS4gVGhlIHNwZWNpYWwKKyAqIHZhbHVlIHswLCBOVUxMfSBpcyB1c2VkIHRvIGluZGljYXRlIGVuZC1vZi1saXN0LCBhbmQgbXVzdCBiZQorICogcHJlc2VudC4gVGhlIHNwZWNpYWwgdmFsdWUgezAsIDxub24tbnVsbD59IGNhbiBiZSB1c2VkIGFzIGEgY2F0Y2gtYWxsCisgKiBtYXBwaW5nLiBUaGlzIGltcGxpZXMgdGhhdCBjdHJsX2lkIHZhbHVlcyBjaG9zZW4gYnkgdGhlIGFsZ29yaXRobQorICogXHJlZiBNVVNUIGJlIG5vbi16ZXJvLgorICovCit0eXBlZGVmIGNvbnN0IHN0cnVjdCB2cHhfY29kZWNfY3RybF9mbl9tYXAKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGN0cmxfaWQ7CisgICAgdnB4X2NvZGVjX2NvbnRyb2xfZm5fdCAgIGZuOworfSB2cHhfY29kZWNfY3RybF9mbl9tYXBfdDsKKworLyohXGJyaWVmIGRlY29kZSBkYXRhIGZ1bmN0aW9uIHBvaW50ZXIgcHJvdG90eXBlCisgKgorICogUHJvY2Vzc2VzIGEgYnVmZmVyIG9mIGNvZGVkIGRhdGEuIElmIHRoZSBwcm9jZXNzaW5nIHJlc3VsdHMgaW4gYSBuZXcKKyAqIGRlY29kZWQgZnJhbWUgYmVjb21pbmcgYXZhaWxhYmxlLCAjVlBYX0NPREVDX0NCX1BVVF9TTElDRSBhbmQKKyAqICNWUFhfQ09ERUNfQ0JfUFVUX0ZSQU1FIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGFzIGFwcHJvcHJpYXRlLiBUaGlzCisgKiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgdnB4X2NvZGVjX2RlY29kZSgpIHdyYXBwZXIgZnVuY3Rpb24sCisgKiBzbyBwbHVnaW5zIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBtYXkgdHJ1c3QgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAqIHRvIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLgorICoKKyAqIFxwYXJhbVtpbl0gY3R4ICAgICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAqIFxwYXJhbVtpbl0gZGF0YSAgICAgICAgIFBvaW50ZXIgdG8gdGhpcyBibG9jayBvZiBuZXcgY29kZWQgZGF0YS4gSWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGEgI1ZQWF9DT0RFQ19DQl9QVVRfRlJBTUUgZXZlbnQgaXMgcG9zdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHByZXZpb3VzbHkgZGVjb2RlZCBmcmFtZS4KKyAqIFxwYXJhbVtpbl0gZGF0YV9zeiAgICAgIFNpemUgb2YgdGhlIGNvZGVkIGRhdGEsIGluIGJ5dGVzLgorICoKKyAqIFxyZXR1cm4gUmV0dXJucyAjVlBYX0NPREVDX09LIGlmIHRoZSBjb2RlZCBkYXRhIHdhcyBwcm9jZXNzZWQgY29tcGxldGVseQorICogICAgICAgICBhbmQgZnV0dXJlIHBpY3R1cmVzIGNhbiBiZSBkZWNvZGVkIHdpdGhvdXQgZXJyb3IuIE90aGVyd2lzZSwKKyAqICAgICAgICAgc2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIG90aGVyIGVycm9yIGNvZGVzIGluIDo6dnB4X2NvZGVjX2Vycl90CisgKiAgICAgICAgIGZvciByZWNvdmVyYWJpbGl0eSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgdnB4X2NvZGVjX2Vycl90ICgqdnB4X2NvZGVjX2RlY29kZV9mbl90KSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgKmN0eCwKKyAgICAgICAgY29uc3QgdWludDhfdCAgICAgICAgICpkYXRhLAorICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGRhdGFfc3osCisgICAgICAgIHZvaWQgICAgICAgICp1c2VyX3ByaXYsCisgICAgICAgIGxvbmcgICAgICAgICBkZWFkbGluZSk7CisKKy8qIVxicmllZiBEZWNvZGVkIGZyYW1lcyBpdGVyYXRvcgorICoKKyAqIEl0ZXJhdGVzIG92ZXIgYSBsaXN0IG9mIHRoZSBmcmFtZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5LiBUaGUgaXRlcmF0b3IKKyAqIHN0b3JhZ2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4gSXRlcmF0aW9uIGlzCisgKiBjb21wbGV0ZSB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgorICoKKyAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmcmFtZXMgYmVjb21lcyB2YWxpZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhlCisgKiB2cHhfY29kZWNfZGVjb2RlIGNhbGwsIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdnB4X2NvZGVjX2RlY29kZS4KKyAqCisgKiBccGFyYW1baW5dICAgICBjdHggICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0CisgKiBccGFyYW1baW4gb3V0XSBpdGVyICAgICBJdGVyYXRvciBzdG9yYWdlLCBpbml0aWFsaXplZCB0byBOVUxMCisgKgorICogXHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpbWFnZSwgaWYgb25lIGlzIHJlYWR5IGZvciBkaXNwbGF5LiBGcmFtZXMKKyAqICAgICAgICAgcHJvZHVjZWQgd2lsbCBhbHdheXMgYmUgaW4gUFRTIChwcmVzZW50YXRpb24gdGltZSBzdGFtcCkgb3JkZXIuCisgKi8KK3R5cGVkZWYgdnB4X2ltYWdlX3QqKCp2cHhfY29kZWNfZ2V0X2ZyYW1lX2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCisgICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICppdGVyKTsKKworCisvKlxicmllZiBlWHRlcm5hbCBNZW1vcnkgQWxsb2NhdGlvbiBtZW1vcnkgbWFwIGdldCBpdGVyYXRvcgorICoKKyAqIEl0ZXJhdGVzIG92ZXIgYSBsaXN0IG9mIHRoZSBtZW1vcnkgbWFwcyByZXF1ZXN0ZWQgYnkgdGhlIGRlY29kZXIuIFRoZQorICogaXRlcmF0b3Igc3RvcmFnZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTCB0byBzdGFydCB0aGUgaXRlcmF0aW9uLgorICogSXRlcmF0aW9uIGlzIGNvbXBsZXRlIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIE5VTEwuCisgKgorICogXHBhcmFtW2luIG91dF0gaXRlciAgICAgSXRlcmF0b3Igc3RvcmFnZSwgaW5pdGlhbGl6ZWQgdG8gTlVMTAorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gbWVtb3J5IHNlZ21lbnQgZGVzY3JpcHRvciwgb3IgTlVMTCB0bworICogICAgICAgICBpbmRpY2F0ZSBlbmQtb2YtbGlzdC4KKyAqLwordHlwZWRlZiB2cHhfY29kZWNfZXJyX3QgKCp2cHhfY29kZWNfZ2V0X21tYXBfZm5fdCkoY29uc3QgdnB4X2NvZGVjX2N0eF90ICAgICAgKmN0eCwKKyAgICAgICAgdnB4X2NvZGVjX21tYXBfdCAgICAgICAgICAgKm1tYXAsCisgICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICAgICAgICppdGVyKTsKKworCisvKlxicmllZiBlWHRlcm5hbCBNZW1vcnkgQWxsb2NhdGlvbiBtZW1vcnkgbWFwIHNldCBpdGVyYXRvcgorICoKKyAqIFNldHMgYSBtZW1vcnkgZGVzY3JpcHRvciBpbnNpZGUgdGhlIGRlY29kZXIgaW5zdGFuY2UuCisgKgorICogXHBhcmFtW2luXSBjdHggICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0CisgKiBccGFyYW1baW5dIG1tYXAgICAgIE1lbW9yeSBtYXAgdG8gc3RvcmUuCisgKgorICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgKiAgICAgVGhlIG1lbW9yeSBtYXAgd2FzIGFjY2VwdGVkIGFuZCBzdG9yZWQuCisgKiBccmV0dmFsICNWUFhfQ09ERUNfTUVNX0VSUk9SCisgKiAgICAgVGhlIG1lbW9yeSBtYXAgd2FzIHJlamVjdGVkLgorICovCit0eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19zZXRfbW1hcF9mbl90KSh2cHhfY29kZWNfY3R4X3QgICAgICAgICAqY3R4LAorICAgICAgICBjb25zdCB2cHhfY29kZWNfbW1hcF90ICAqbW1hcCk7CisKKwordHlwZWRlZiB2cHhfY29kZWNfZXJyX3QgKCp2cHhfY29kZWNfZW5jb2RlX2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICAqY3R4LAorICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCAgICAgKmltZywKKyAgICAgICAgdnB4X2NvZGVjX3B0c190ICAgICAgICBwdHMsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCAgZmxhZ3MsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZGVhZGxpbmUpOwordHlwZWRlZiBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QqKCp2cHhfY29kZWNfZ2V0X2N4X2RhdGFfZm5fdCkodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKKyAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgICAgKml0ZXIpOworCit0eXBlZGVmIHZweF9jb2RlY19lcnJfdAorKCp2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXRfZm5fdCkodnB4X2NvZGVjX2FsZ19wcml2X3QgICAgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgICpjZmcpOwordHlwZWRlZiB2cHhfZml4ZWRfYnVmX3QgKgorKCp2cHhfY29kZWNfZ2V0X2dsb2JhbF9oZWFkZXJzX2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICAgKmN0eCk7CisKK3R5cGVkZWYgdnB4X2ltYWdlX3QgKgorKCp2cHhfY29kZWNfZ2V0X3ByZXZpZXdfZnJhbWVfZm5fdCkodnB4X2NvZGVjX2FsZ19wcml2X3QgICAqY3R4KTsKKwordHlwZWRlZiB2cHhfY29kZWNfZXJyX3QKKygqdnB4X2NvZGVjX2VuY19tcl9nZXRfbWVtX2xvY19mbl90KShjb25zdCB2cHhfY29kZWNfZW5jX2NmZ190ICAgICAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqbWVtX2xvYyk7CisKKy8qIVxicmllZiB1c2FnZSBjb25maWd1cmF0aW9uIG1hcHBpbmcKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB1c2FnZSBpZGVudGlmaWVycyBhbmQKKyAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlcy4gRWFjaCBhbGdvcml0aG0gcHJvdmlkZXMgYSBsaXN0IG9mIHRoZXNlCisgKiBtYXBwaW5ncy4gVGhpcyBsaXN0IGlzIHNlYXJjaGVkIGJ5IHRoZSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KCkKKyAqIHdyYXBwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbmZpZyB0byByZXR1cm4uIFRoZSBzcGVjaWFsIHZhbHVlCisgKiB7LTEsIHswfX0gaXMgdXNlZCB0byBpbmRpY2F0ZSBlbmQtb2YtbGlzdCwgYW5kIG11c3QgYmUgcHJlc2VudC4gQXQgbGVhc3QKKyAqIG9uZSBtYXBwaW5nIG11c3QgYmUgcHJlc2VudCwgaW4gYWRkaXRpb24gdG8gdGhlIGVuZC1vZi1saXN0LgorICoKKyAqLwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2VuY19jZmdfbWFwCit7CisgICAgaW50ICAgICAgICAgICAgICAgICB1c2FnZTsKKyAgICB2cHhfY29kZWNfZW5jX2NmZ190IGNmZzsKK30gdnB4X2NvZGVjX2VuY19jZmdfbWFwX3Q7CisKKyNkZWZpbmUgTk9UX0lNUExFTUVOVEVEIDAKKworLyohXGJyaWVmIERlY29kZXIgYWxnb3JpdGhtIGludGVyZmFjZSBpbnRlcmZhY2UKKyAqCisgKiBBbGwgZGVjb2RlcnMgXHJlZiBNVVNUIGV4cG9zZSBhIHZhcmlhYmxlIG9mIHRoaXMgdHlwZS4KKyAqLworc3RydWN0IHZweF9jb2RlY19pZmFjZQoreworICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqbmFtZTsgICAgICAgIC8qKjwgSWRlbnRpZmljYXRpb24gU3RyaW5nICAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgYWJpX3ZlcnNpb247IC8qKjwgSW1wbGVtZW50ZWQgQUJJIHZlcnNpb24gKi8KKyAgICB2cHhfY29kZWNfY2Fwc190ICAgICAgICAgIGNhcHM7ICAgIC8qKjwgRGVjb2RlciBjYXBhYmlsaXRpZXMgKi8KKyAgICB2cHhfY29kZWNfaW5pdF9mbl90ICAgICAgIGluaXQ7ICAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfaW5pdF9mbl90ICovCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3lfZm5fdCAgICBkZXN0cm95OyAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19kZXN0cm95X2ZuX3QgKi8KKyAgICB2cHhfY29kZWNfY3RybF9mbl9tYXBfdCAgKmN0cmxfbWFwczsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2N0cmxfZm5fbWFwX3QgKi8KKyAgICB2cHhfY29kZWNfZ2V0X21tYXBfZm5fdCAgIGdldF9tbWFwOyAgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2dldF9tbWFwX2ZuX3QgKi8KKyAgICB2cHhfY29kZWNfc2V0X21tYXBfZm5fdCAgIHNldF9tbWFwOyAgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX3NldF9tbWFwX2ZuX3QgKi8KKyAgICBzdHJ1Y3QgdnB4X2NvZGVjX2RlY19pZmFjZQorICAgIHsKKyAgICAgICAgdnB4X2NvZGVjX3BlZWtfc2lfZm5fdCAgICBwZWVrX3NpOyAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19wZWVrX3NpX2ZuX3QgKi8KKyAgICAgICAgdnB4X2NvZGVjX2dldF9zaV9mbl90ICAgICBnZXRfc2k7ICAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19wZWVrX3NpX2ZuX3QgKi8KKyAgICAgICAgdnB4X2NvZGVjX2RlY29kZV9mbl90ICAgICBkZWNvZGU7ICAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19kZWNvZGVfZm5fdCAqLworICAgICAgICB2cHhfY29kZWNfZ2V0X2ZyYW1lX2ZuX3QgIGdldF9mcmFtZTsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2dldF9mcmFtZV9mbl90ICovCisgICAgfSBkZWM7CisgICAgc3RydWN0IHZweF9jb2RlY19lbmNfaWZhY2UKKyAgICB7CisgICAgICAgIHZweF9jb2RlY19lbmNfY2ZnX21hcF90ICAgICAgICAgICAqY2ZnX21hcHM7ICAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19lbmNfY2ZnX21hcF90ICovCisgICAgICAgIHZweF9jb2RlY19lbmNvZGVfZm5fdCAgICAgICAgICAgICAgZW5jb2RlOyAgICAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19lbmNvZGVfZm5fdCAqLworICAgICAgICB2cHhfY29kZWNfZ2V0X2N4X2RhdGFfZm5fdCAgICAgICAgIGdldF9jeF9kYXRhOyAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfZ2V0X2N4X2RhdGFfZm5fdCAqLworICAgICAgICB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXRfZm5fdCAgICAgIGNmZ19zZXQ7ICAgICAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXRfZm5fdCAqLworICAgICAgICB2cHhfY29kZWNfZ2V0X2dsb2JhbF9oZWFkZXJzX2ZuX3QgIGdldF9nbG9iX2hkcnM7IC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfZ2V0X2dsb2JhbF9oZWFkZXJzX2ZuX3QgKi8KKyAgICAgICAgdnB4X2NvZGVjX2dldF9wcmV2aWV3X2ZyYW1lX2ZuX3QgICBnZXRfcHJldmlldzsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2dldF9wcmV2aWV3X2ZyYW1lX2ZuX3QgKi8KKyAgICAgICAgdnB4X2NvZGVjX2VuY19tcl9nZXRfbWVtX2xvY19mbl90ICBtcl9nZXRfbWVtX2xvYzsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2VuY19tcl9nZXRfbWVtX2xvY19mbl90ICovCisgICAgfSBlbmM7Cit9OworCisvKiFcYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciAvIHVzZXIgZGF0YSBwYWlyIHN0b3JhZ2UgKi8KK3R5cGVkZWYgc3RydWN0IHZweF9jb2RlY19wcml2X2NiX3BhaXIKK3sKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdnB4X2NvZGVjX3B1dF9mcmFtZV9jYl9mbl90ICAgIHB1dF9mcmFtZTsKKyAgICAgICAgdnB4X2NvZGVjX3B1dF9zbGljZV9jYl9mbl90ICAgIHB1dF9zbGljZTsKKyAgICB9IHU7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9wcml2OworfSB2cHhfY29kZWNfcHJpdl9jYl9wYWlyX3Q7CisKKworLyohXGJyaWVmIEluc3RhbmNlIHByaXZhdGUgc3RvcmFnZQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgYWxnb3JpdGhtJ3MgaW5pdCBmdW5jdGlvbi4gSXQgY2FuIGJlCisgKiBleHRlbmRlZCBpbiBvbmUgb2YgdHdvIHdheXMuIEZpcnN0LCBhIHNlY29uZCwgYWxnb3JpdGhtIHNwZWNpZmljIHN0cnVjdHVyZQorICogY2FuIGJlIGFsbG9jYXRlZCBhbmQgdGhlIHByaXYgbWVtYmVyIHBvaW50ZWQgdG8gaXQuIEFsdGVybmF0aXZlbHksIHRoaXMKKyAqIHN0cnVjdHVyZSBjYW4gYmUgbWFkZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBhbGdvcml0aG0gc3BlY2lmaWMgc3RydWN0dXJlLAorICogYW5kIHRoZSBwb2ludGVyIGNhc3QgdG8gdGhlIHByb3BlciB0eXBlLgorICovCitzdHJ1Y3QgdnB4X2NvZGVjX3ByaXYKK3sKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHN6OworICAgIHZweF9jb2RlY19pZmFjZV90ICAgICAgICAgICAgICAqaWZhY2U7CisgICAgc3RydWN0IHZweF9jb2RlY19hbGdfcHJpdiAgICAgICphbGdfcHJpdjsKKyAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgKmVycl9kZXRhaWw7CisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgICAgICAgICAgICAgICBpbml0X2ZsYWdzOworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgdnB4X2NvZGVjX3ByaXZfY2JfcGFpcl90ICAgIHB1dF9mcmFtZV9jYjsKKyAgICAgICAgdnB4X2NvZGVjX3ByaXZfY2JfcGFpcl90ICAgIHB1dF9zbGljZV9jYjsKKyAgICB9IGRlYzsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0YmQ7CisgICAgICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmICAgICAgICBjeF9kYXRhX2RzdF9idWY7CisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjeF9kYXRhX3BhZF9iZWZvcmU7CisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjeF9kYXRhX3BhZF9hZnRlcjsKKyAgICAgICAgdnB4X2NvZGVjX2N4X3BrdF90ICAgICAgICAgIGN4X2RhdGFfcGt0OworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgdG90YWxfZW5jb2RlcnM7CisgICAgfSBlbmM7Cit9OworCisvKgorICogTXVsdGktcmVzb2x1dGlvbiBlbmNvZGluZyBpbnRlcm5hbCBjb25maWd1cmF0aW9uCisgKi8KK3N0cnVjdCB2cHhfY29kZWNfcHJpdl9lbmNfbXJfY2ZnCit7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBtcl90b3RhbF9yZXNvbHV0aW9uczsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIG1yX2VuY29kZXJfaWQ7CisgICAgc3RydWN0IHZweF9yYXRpb25hbCAgICBtcl9kb3duX3NhbXBsaW5nX2ZhY3RvcjsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIG1yX2xvd19yZXNfbW9kZV9pbmZvOworfTsKKworI3VuZGVmIFZQWF9DVFJMX1VTRV9UWVBFCisjZGVmaW5lIFZQWF9DVFJMX1VTRV9UWVBFKGlkLCB0eXApIFwKKyAgICBzdGF0aWMgdHlwIGlkIyNfX3ZhbHVlKHZhX2xpc3QgYXJncykge3JldHVybiB2YV9hcmcoYXJncywgdHlwKTt9IFwKKyAgICBzdGF0aWMgdHlwIGlkIyNfX2NvbnZlcnQodm9pZCAqeClcCisgICAge1wKKyAgICAgICAgdW5pb25cCisgICAgICAgIHtcCisgICAgICAgICAgICB2b2lkICp4O1wKKyAgICAgICAgICAgIHR5cCAgIGQ7XAorICAgICAgICB9IHU7XAorICAgICAgICB1LnggPSB4O1wKKyAgICAgICAgcmV0dXJuIHUuZDtcCisgICAgfQorCisKKyN1bmRlZiBWUFhfQ1RSTF9VU0VfVFlQRV9ERVBSRUNBVEVECisjZGVmaW5lIFZQWF9DVFJMX1VTRV9UWVBFX0RFUFJFQ0FURUQoaWQsIHR5cCkgXAorICAgIHN0YXRpYyB0eXAgaWQjI19fdmFsdWUodmFfbGlzdCBhcmdzKSB7cmV0dXJuIHZhX2FyZyhhcmdzLCB0eXApO30gXAorICAgIHN0YXRpYyB0eXAgaWQjI19fY29udmVydCh2b2lkICp4KVwKKyAgICB7XAorICAgICAgICB1bmlvblwKKyAgICAgICAge1wKKyAgICAgICAgICAgIHZvaWQgKng7XAorICAgICAgICAgICAgdHlwICAgZDtcCisgICAgICAgIH0gdTtcCisgICAgICAgIHUueCA9IHg7XAorICAgICAgICByZXR1cm4gdS5kO1wKKyAgICB9CisKKyNkZWZpbmUgQ0FTVChpZCwgYXJnKSBpZCMjX192YWx1ZShhcmcpCisjZGVmaW5lIFJFQ0FTVChpZCwgeCkgaWQjI19fY29udmVydCh4KQorCisKKy8qIENPREVDX0lOVEVSRkFDRSBjb252ZW5pZW5jZSBtYWNybworICoKKyAqIEJ5IGNvbnZlbnRpb24sIGVhY2ggY29kZWMgaW50ZXJmYWNlIGlzIGEgc3RydWN0IHdpdGggZXh0ZXJuIGxpbmthZ2UsIHdoZXJlCisgKiB0aGUgc3ltYm9sIGlzIHN1ZmZpeGVkIHdpdGggX2FsZ28uIEEgZ2V0dGVyIGZ1bmN0aW9uIGlzIGFsc28gZGVmaW5lZCB0bworICogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RydWN0LCBzaW5jZSBpbiBzb21lIGNhc2VzIGl0J3MgZWFzaWVyIHRvIHdvcmsKKyAqIHdpdGggdGV4dCBzeW1ib2xzIHRoYW4gZGF0YSBzeW1ib2xzIChzZWUgaXNzdWUgIzE2OSkuIFRoaXMgZnVuY3Rpb24gaGFzCisgKiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzdHJ1Y3QsIGxlc3MgdGhlIF9hbGdvIHN1ZmZpeC4gVGhlIENPREVDX0lOVEVSRkFDRQorICogbWFjcm8gaXMgcHJvdmlkZWQgdG8gZGVmaW5lIHRoaXMgZ2V0dGVyIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkuCisgKi8KKyNkZWZpbmUgQ09ERUNfSU5URVJGQUNFKGlkKVwKK3ZweF9jb2RlY19pZmFjZV90KiBpZCh2b2lkKSB7IHJldHVybiAmaWQjI19hbGdvOyB9XAordnB4X2NvZGVjX2lmYWNlX3QgIGlkIyNfYWxnbworCisKKy8qIEludGVybmFsIFV0aWxpdHkgRnVuY3Rpb25zCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW5zaWRlIGFsZ29yaXRobXMgYXMKKyAqIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHZweF9jb2RlY18qIGRhdGEgc3RydWN0dXJlcy4KKyAqLworc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdAoreworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGNudDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBtYXg7CisgICAgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgcGt0c1sxXTsKK307CisKKyNkZWZpbmUgdnB4X2NvZGVjX3BrdF9saXN0X2RlY2wobilcCisgICAgdW5pb24ge3N0cnVjdCB2cHhfY29kZWNfcGt0X2xpc3QgaGVhZDtcCisgICAgICAgIHN0cnVjdCB7c3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCBoZWFkO1wKKyAgICAgICAgICAgIHN0cnVjdCB2cHhfY29kZWNfY3hfcGt0ICAgIHBrdHNbbl07fSBhbGxvYzt9CisKKyNkZWZpbmUgdnB4X2NvZGVjX3BrdF9saXN0X2luaXQobSlcCisgICAgKG0pLT5hbGxvYy5oZWFkLmNudCA9IDAsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAobSktPmFsbG9jLmhlYWQubWF4ID0gc2l6ZW9mKChtKS0+YWxsb2MucGt0cykgLyBzaXplb2YoKG0pLT5hbGxvYy5wa3RzWzBdKQorCitpbnQKK3ZweF9jb2RlY19wa3RfbGlzdF9hZGQoc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqKTsKKworY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KgordnB4X2NvZGVjX3BrdF9saXN0X2dldChzdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAgICAgICAgICAqaXRlcik7CisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CitzdHJ1Y3QgdnB4X2ludGVybmFsX2Vycm9yX2luZm8KK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgIGVycm9yX2NvZGU7CisgICAgaW50ICAgICAgICAgICAgICBoYXNfZGV0YWlsOworICAgIGNoYXIgICAgICAgICAgICAgZGV0YWlsWzgwXTsKKyAgICBpbnQgICAgICAgICAgICAgIHNldGptcDsKKyAgICBqbXBfYnVmICAgICAgICAgIGptcDsKK307CisKK3N0YXRpYyB2b2lkIHZweF9pbnRlcm5hbF9lcnJvcihzdHJ1Y3QgdnB4X2ludGVybmFsX2Vycm9yX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90ICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIGluZm8tPmVycm9yX2NvZGUgPSBlcnJvcjsKKyAgICBpbmZvLT5oYXNfZGV0YWlsID0gMDsKKworICAgIGlmIChmbXQpCisgICAgeworICAgICAgICBzaXplX3QgIHN6ID0gc2l6ZW9mKGluZm8tPmRldGFpbCk7CisKKyAgICAgICAgaW5mby0+aGFzX2RldGFpbCA9IDE7CisgICAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgICAgICB2c25wcmludGYoaW5mby0+ZGV0YWlsLCBzeiAtIDEsIGZtdCwgYXApOworICAgICAgICB2YV9lbmQoYXApOworICAgICAgICBpbmZvLT5kZXRhaWxbc3otMV0gPSAnXDAnOworICAgIH0KKworICAgIGlmIChpbmZvLT5zZXRqbXApCisgICAgICAgIGxvbmdqbXAoaW5mby0+am1wLCBpbmZvLT5lcnJvcl9jb2RlKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdnB4L3NyYy92cHhfY29kZWMuYyBiL2xpYnZweC92cHgvc3JjL3ZweF9jb2RlYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHgvc3JjL3ZweF9jb2RlYy5jCnJlbmFtZSB0byBsaWJ2cHgvdnB4L3NyYy92cHhfY29kZWMuYwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC9zcmMvdnB4X2RlY29kZXIuYyBiL2xpYnZweC92cHgvc3JjL3ZweF9kZWNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhNzgzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHgvc3JjL3ZweF9kZWNvZGVyLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiFcZmlsZQorICogXGJyaWVmIFByb3ZpZGVzIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSB0byB3cmFwIGRlY29kZXIgYWxnb3JpdGhtcy4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCisKKyNkZWZpbmUgU0FWRV9TVEFUVVMoY3R4LHZhcikgKGN0eD8oY3R4LT5lcnIgPSB2YXIpOnZhcikKKwordnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19kZWNfaW5pdF92ZXIodnB4X2NvZGVjX2N0eF90ICAgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pZmFjZV90ICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZmxhZ3NfdCAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdmVyKQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXM7CisKKyAgICBpZiAodmVyICE9IFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfQUJJX01JU01BVENIOworICAgIGVsc2UgaWYgKCFjdHggfHwgIWlmYWNlKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICBlbHNlIGlmIChpZmFjZS0+YWJpX3ZlcnNpb24gIT0gVlBYX0NPREVDX0lOVEVSTkFMX0FCSV9WRVJTSU9OKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfQUJJX01JU01BVENIOworICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfWE1BKSAmJiAhKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9YTUEpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfUE9TVFBST0MpICYmICEoaWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX1BPU1RQUk9DKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlIGlmICgoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX0VSUk9SX0NPTkNFQUxNRU5UKSAmJgorICAgICAgICAgICAgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfRVJST1JfQ09OQ0VBTE1FTlQpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfSU5QVVRfRlJBR01FTlRTKSAmJgorICAgICAgICAgICAgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfSU5QVVRfRlJBR01FTlRTKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlIGlmICghKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9ERUNPREVSKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworICAgICAgICBjdHgtPmlmYWNlID0gaWZhY2U7CisgICAgICAgIGN0eC0+bmFtZSA9IGlmYWNlLT5uYW1lOworICAgICAgICBjdHgtPnByaXYgPSBOVUxMOworICAgICAgICBjdHgtPmluaXRfZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgY3R4LT5jb25maWcuZGVjID0gY2ZnOworICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7CisKKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1hNQSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmluaXQoY3R4LCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdHgtPmVycl9kZXRhaWwgPSBjdHgtPnByaXYgPyBjdHgtPnByaXYtPmVycl9kZXRhaWwgOiBOVUxMOworICAgICAgICAgICAgICAgIHZweF9jb2RlY19kZXN0cm95KGN0eCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjdHgtPnByaXYpCisgICAgICAgICAgICAgICAgY3R4LT5wcml2LT5pZmFjZSA9IGN0eC0+aWZhY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOworfQorCisKK3ZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyh2cHhfY29kZWNfaWZhY2VfdCAgICAgICAqaWZhY2UsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBkYXRhX3N6LAorICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlczsKKworICAgIGlmICghaWZhY2UgfHwgIWRhdGEgfHwgIWRhdGFfc3ogfHwgIXNpCisgICAgICAgIHx8IHNpLT5zeiA8IHNpemVvZih2cHhfY29kZWNfc3RyZWFtX2luZm9fdCkpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNldCBkZWZhdWx0L3Vua25vd24gdmFsdWVzICovCisgICAgICAgIHNpLT53ID0gMDsKKyAgICAgICAgc2ktPmggPSAwOworCisgICAgICAgIHJlcyA9IGlmYWNlLT5kZWMucGVla19zaShkYXRhLCBkYXRhX3N6LCBzaSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworCit2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2dldF9zdHJlYW1faW5mbyh2cHhfY29kZWNfY3R4X3QgICAgICAgICAqY3R4LAorICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlczsKKworICAgIGlmICghY3R4IHx8ICFzaSB8fCBzaS0+c3ogPCBzaXplb2YodnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2KQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2V0IGRlZmF1bHQvdW5rbm93biB2YWx1ZXMgKi8KKyAgICAgICAgc2ktPncgPSAwOworICAgICAgICBzaS0+aCA9IDA7CisKKyAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+ZGVjLmdldF9zaShjdHgtPnByaXYtPmFsZ19wcml2LCBzaSk7CisgICAgfQorCisgICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKK30KKworCit2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2RlY29kZSh2cHhfY29kZWNfY3R4X3QgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGRhdGFfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICp1c2VyX3ByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICBkZWFkbGluZSkKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgcmVzOworCisgICAgLyogU2FuaXR5IGNoZWNrcyAqLworICAgIC8qIE5VTEwgZGF0YSBwdHIgYWxsb3dlZCBpZiBkYXRhX3N6IGlzIDAgdG9vICovCisgICAgaWYgKCFjdHggfHwgKCFkYXRhICYmIGRhdGFfc3opKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2KQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+ZGVjLmRlY29kZShjdHgtPnByaXYtPmFsZ19wcml2LCBkYXRhLCBkYXRhX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcHJpdiwgZGVhZGxpbmUpOworICAgIH0KKworICAgIHJldHVybiBTQVZFX1NUQVRVUyhjdHgsIHJlcyk7Cit9CisKK3ZweF9pbWFnZV90ICp2cHhfY29kZWNfZ2V0X2ZyYW1lKHZweF9jb2RlY19jdHhfdCAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgKml0ZXIpCit7CisgICAgdnB4X2ltYWdlX3QgKmltZzsKKworICAgIGlmICghY3R4IHx8ICFpdGVyIHx8ICFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYpCisgICAgICAgIGltZyA9IE5VTEw7CisgICAgZWxzZQorICAgICAgICBpbWcgPSBjdHgtPmlmYWNlLT5kZWMuZ2V0X2ZyYW1lKGN0eC0+cHJpdi0+YWxnX3ByaXYsIGl0ZXIpOworCisgICAgcmV0dXJuIGltZzsKK30KKworCit2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3JlZ2lzdGVyX3B1dF9mcmFtZV9jYih2cHhfY29kZWNfY3R4X3QgICAgICAgICAgICAgKmN0eCwKKyAgICAgICAgdnB4X2NvZGVjX3B1dF9mcmFtZV9jYl9mbl90ICBjYiwKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9wcml2KQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXM7CisKKyAgICBpZiAoIWN0eCB8fCAhY2IpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworICAgIGVsc2UgaWYgKCFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYKKyAgICAgICAgICAgICB8fCAhKGN0eC0+aWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX1BVVF9GUkFNRSkpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19FUlJPUjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBjdHgtPnByaXYtPmRlYy5wdXRfZnJhbWVfY2IudS5wdXRfZnJhbWUgPSBjYjsKKyAgICAgICAgY3R4LT5wcml2LT5kZWMucHV0X2ZyYW1lX2NiLnVzZXJfcHJpdiA9IHVzZXJfcHJpdjsKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX09LOworICAgIH0KKworICAgIHJldHVybiBTQVZFX1NUQVRVUyhjdHgsIHJlcyk7Cit9CisKKwordnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19yZWdpc3Rlcl9wdXRfc2xpY2VfY2IodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgICpjdHgsCisgICAgICAgIHZweF9jb2RlY19wdXRfc2xpY2VfY2JfZm5fdCAgY2IsCisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdikKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgcmVzOworCisgICAgaWYgKCFjdHggfHwgIWNiKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2CisgICAgICAgICAgICAgfHwgIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9QVVRfRlJBTUUpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3R4LT5wcml2LT5kZWMucHV0X3NsaWNlX2NiLnUucHV0X3NsaWNlID0gY2I7CisgICAgICAgIGN0eC0+cHJpdi0+ZGVjLnB1dF9zbGljZV9jYi51c2VyX3ByaXYgPSB1c2VyX3ByaXY7CisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKKyAgICB9CisKKyAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOworfQorCisKK3ZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZ2V0X21lbV9tYXAodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgICAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19tbWFwX3QgICAgICAgICAgICAgICAqbW1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgICAgICAgICAgICAgICppdGVyKQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfT0s7CisKKyAgICBpZiAoIWN0eCB8fCAhbW1hcCB8fCAhaXRlciB8fCAhY3R4LT5pZmFjZSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisgICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9YTUEpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7CisgICAgZWxzZQorICAgICAgICByZXMgPSBjdHgtPmlmYWNlLT5nZXRfbW1hcChjdHgsIG1tYXAsIGl0ZXIpOworCisgICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKK30KKworCit2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3NldF9tZW1fbWFwKHZweF9jb2RlY19jdHhfdCAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19tbWFwX3QgICptbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIG51bV9tYXBzKQoreworICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfTUVNX0VSUk9SOworCisgICAgaWYgKCFjdHggfHwgIW1tYXAgfHwgIWN0eC0+aWZhY2UpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOworICAgIGVsc2UgaWYgKCEoY3R4LT5pZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfWE1BKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0VSUk9SOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWFwczsgaSsrLCBtbWFwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbW1hcC0+YmFzZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogRXZlcnl0aGluZyBsb29rIG9rLCBzZXQgdGhlIG1tYXAgaW4gdGhlIGRlY29kZXIgKi8KKyAgICAgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPnNldF9tbWFwKGN0eCwgbW1hcCk7CisKKyAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC9zcmMvdnB4X2VuY29kZXIuYyBiL2xpYnZweC92cHgvc3JjL3ZweF9lbmNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjMWM2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHgvc3JjL3ZweF9lbmNvZGVyLmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiFcZmlsZQorICogXGJyaWVmIFByb3ZpZGVzIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSB0byB3cmFwIGVuY29kZXIgYWxnb3JpdGhtcy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorCisjZGVmaW5lIFNBVkVfU1RBVFVTKGN0eCx2YXIpIChjdHg/KGN0eC0+ZXJyID0gdmFyKTp2YXIpCisKK3ZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZW5jX2luaXRfdmVyKHZweF9jb2RlY19jdHhfdCAgICAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfdCAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2ZsYWdzX3QgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHZlcikKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgcmVzOworCisgICAgaWYgKHZlciAhPSBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTikKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0FCSV9NSVNNQVRDSDsKKyAgICBlbHNlIGlmICghY3R4IHx8ICFpZmFjZSB8fCAhY2ZnKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICBlbHNlIGlmIChpZmFjZS0+YWJpX3ZlcnNpb24gIT0gVlBYX0NPREVDX0lOVEVSTkFMX0FCSV9WRVJTSU9OKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfQUJJX01JU01BVENIOworICAgIGVsc2UgaWYgKCEoaWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfWE1BKSAmJiAhKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9YTUEpKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfUFNOUikKKyAgICAgICAgICAgICAmJiAhKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9QU05SKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlIGlmICgoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX09VVFBVVF9QQVJUSVRJT04pCisgICAgICAgICAgICAgJiYgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfT1VUUFVUX1BBUlRJVElPTikpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTkNBUEFCTEU7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3R4LT5pZmFjZSA9IGlmYWNlOworICAgICAgICBjdHgtPm5hbWUgPSBpZmFjZS0+bmFtZTsKKyAgICAgICAgY3R4LT5wcml2ID0gTlVMTDsKKyAgICAgICAgY3R4LT5pbml0X2ZsYWdzID0gZmxhZ3M7CisgICAgICAgIGN0eC0+Y29uZmlnLmVuYyA9IGNmZzsKKyAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+aW5pdChjdHgsIE5VTEwpOworCisgICAgICAgIGlmIChyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0eC0+ZXJyX2RldGFpbCA9IGN0eC0+cHJpdiA/IGN0eC0+cHJpdi0+ZXJyX2RldGFpbCA6IE5VTEw7CisgICAgICAgICAgICB2cHhfY29kZWNfZGVzdHJveShjdHgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0eC0+cHJpdikKKyAgICAgICAgICAgIGN0eC0+cHJpdi0+aWZhY2UgPSBjdHgtPmlmYWNlOworICAgIH0KKworICAgIHJldHVybiBTQVZFX1NUQVRVUyhjdHgsIHJlcyk7Cit9CisKK3ZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZW5jX2luaXRfbXVsdGlfdmVyKHZweF9jb2RlY19jdHhfdCAgICAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfdCAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9lbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZmxhZ3NfdCAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfcmF0aW9uYWxfdCAgICAgICAqZHNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHZlcikKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gMDsKKworICAgIGlmICh2ZXIgIT0gVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04pCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19BQklfTUlTTUFUQ0g7CisgICAgZWxzZSBpZiAoIWN0eCB8fCAhaWZhY2UgfHwgIWNmZyB8fCAobnVtX2VuYyA+IDE2IHx8IG51bV9lbmMgPCAxKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisgICAgZWxzZSBpZiAoaWZhY2UtPmFiaV92ZXJzaW9uICE9IFZQWF9DT0RFQ19JTlRFUk5BTF9BQklfVkVSU0lPTikKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0FCSV9NSVNNQVRDSDsKKyAgICBlbHNlIGlmICghKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlIGlmICgoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1hNQSkgJiYgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfWE1BKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlIGlmICgoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1BTTlIpCisgICAgICAgICAgICAgJiYgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfUFNOUikpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTkNBUEFCTEU7CisgICAgZWxzZSBpZiAoKGZsYWdzICYgVlBYX0NPREVDX1VTRV9PVVRQVVRfUEFSVElUSU9OKQorICAgICAgICAgICAgICYmICEoaWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX09VVFBVVF9QQVJUSVRJT04pKQorICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICB2b2lkICptZW1fbG9jID0gTlVMTDsKKworICAgICAgICBpZighKHJlcyA9IGlmYWNlLT5lbmMubXJfZ2V0X21lbV9sb2MoY2ZnLCAmbWVtX2xvYykpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VuYzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZweF9jb2RlY19wcml2X2VuY19tcl9jZmdfdCBtcl9jZmc7CisKKyAgICAgICAgICAgICAgICAvKiBWYWxpZGF0ZSBkb3duLXNhbXBsaW5nIGZhY3Rvci4gKi8KKyAgICAgICAgICAgICAgICBpZihkc2YtPm51bSA8IDEgfHwgZHNmLT5udW0gPiA0MDk2IHx8IGRzZi0+ZGVuIDwgMSB8fAorICAgICAgICAgICAgICAgICAgIGRzZi0+ZGVuID4gZHNmLT5udW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXJfY2ZnLm1yX2xvd19yZXNfbW9kZV9pbmZvID0gbWVtX2xvYzsKKyAgICAgICAgICAgICAgICBtcl9jZmcubXJfdG90YWxfcmVzb2x1dGlvbnMgPSBudW1fZW5jOworICAgICAgICAgICAgICAgIG1yX2NmZy5tcl9lbmNvZGVyX2lkID0gbnVtX2VuYy0xLWk7CisgICAgICAgICAgICAgICAgbXJfY2ZnLm1yX2Rvd25fc2FtcGxpbmdfZmFjdG9yLm51bSA9IGRzZi0+bnVtOworICAgICAgICAgICAgICAgIG1yX2NmZy5tcl9kb3duX3NhbXBsaW5nX2ZhY3Rvci5kZW4gPSBkc2YtPmRlbjsKKworICAgICAgICAgICAgICAgIC8qIEZvcmNlIEtleS1mcmFtZSBzeW5jaHJvbml6YXRpb24uIE5hbWVseSwgZW5jb2RlciBhdCBoaWdoZXIKKyAgICAgICAgICAgICAgICAgKiByZXNvbHV0aW9uIGFsd2F5cyB1c2UgdGhlIHNhbWUgZnJhbWVfdHlwZSBjaG9zZW4gYnkgdGhlCisgICAgICAgICAgICAgICAgICogbG93ZXN0LXJlc29sdXRpb24gZW5jb2Rlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihtcl9jZmcubXJfZW5jb2Rlcl9pZCkKKyAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZl9tb2RlID0gVlBYX0tGX0RJU0FCTEVEOworCisgICAgICAgICAgICAgICAgY3R4LT5pZmFjZSA9IGlmYWNlOworICAgICAgICAgICAgICAgIGN0eC0+bmFtZSA9IGlmYWNlLT5uYW1lOworICAgICAgICAgICAgICAgIGN0eC0+cHJpdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgY3R4LT5pbml0X2ZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgY3R4LT5jb25maWcuZW5jID0gY2ZnOworICAgICAgICAgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmluaXQoY3R4LCAmbXJfY2ZnKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9kZXRhaWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcml2ID8gY3R4LT5wcml2LT5lcnJfZGV0YWlsIDogTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgLyogRGVzdHJveSBjdXJyZW50IGN0eCAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmVycl9kZXRhaWwgPSBlcnJvcl9kZXRhaWw7CisgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19kZXN0cm95KGN0eCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRGVzdHJveSBhbHJlYWR5IGFsbG9jYXRlZCBoaWdoLWxldmVsIGN0eCAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3R4LS07CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmVycl9kZXRhaWwgPSBlcnJvcl9kZXRhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZGVzdHJveShjdHgpOworICAgICAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGN0eC0+cHJpdikKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5wcml2LT5pZmFjZSA9IGN0eC0+aWZhY2U7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGN0eCsrOworICAgICAgICAgICAgICAgIGNmZysrOworICAgICAgICAgICAgICAgIGRzZisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKK30KKworCit2cHhfY29kZWNfZXJyX3QgIHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQodnB4X2NvZGVjX2lmYWNlX3QgICAgKmlmYWNlLAorICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAorICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgdXNhZ2UpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlczsKKyAgICB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCAqbWFwOworCisgICAgaWYgKCFpZmFjZSB8fCAhY2ZnIHx8IHVzYWdlID4gSU5UX01BWCkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisgICAgZWxzZSBpZiAoIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfRU5DT0RFUikpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTkNBUEFCTEU7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisKKyAgICAgICAgZm9yIChtYXAgPSBpZmFjZS0+ZW5jLmNmZ19tYXBzOyBtYXAtPnVzYWdlID49IDA7IG1hcCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobWFwLT51c2FnZSA9PSAoaW50KXVzYWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpjZmcgPSBtYXAtPmNmZzsKKyAgICAgICAgICAgICAgICBjZmctPmdfdXNhZ2UgPSB1c2FnZTsKKyAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCisKKyNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAorLyogT24gWDg2LCBkaXNhYmxlIHRoZSB4ODcgdW5pdCdzIGludGVybmFsIDgwIGJpdCBwcmVjaXNpb24gZm9yIGJldHRlcgorICogY29uc2lzdGVuY3kgd2l0aCB0aGUgU1NFIHVuaXQncyA2NCBiaXQgcHJlY2lzaW9uLgorICovCisjaW5jbHVkZSAidnB4X3BvcnRzL3g4Ni5oIgorI2RlZmluZSBGTE9BVElOR19QT0lOVF9JTklUKCkgZG8ge1wKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgeDg3X29yaWdfbW9kZSA9IHg4N19zZXRfZG91YmxlX3ByZWNpc2lvbigpOworI2RlZmluZSBGTE9BVElOR19QT0lOVF9SRVNUT1JFKCkgXAorICAgIHg4N19zZXRfY29udHJvbF93b3JkKHg4N19vcmlnX21vZGUpOyB9d2hpbGUoMCkKKworCisjZWxzZQorc3RhdGljIHZvaWQgRkxPQVRJTkdfUE9JTlRfSU5JVCgpIHt9CitzdGF0aWMgdm9pZCBGTE9BVElOR19QT0lOVF9SRVNUT1JFKCkge30KKyNlbmRpZgorCisKK3ZweF9jb2RlY19lcnJfdCAgdnB4X2NvZGVjX2VuY29kZSh2cHhfY29kZWNfY3R4X3QgICAgICAgICAgICAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV90ICAgICAgICAgICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3B0c190ICAgICAgICAgICAgIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2VuY19mcmFtZV9mbGFnc190ICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBkZWFkbGluZSkKK3sKKyAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gMDsKKworICAgIGlmICghY3R4IHx8IChpbWcgJiYgIWR1cmF0aW9uKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisgICAgZWxzZSBpZiAoIWN0eC0+aWZhY2UgfHwgIWN0eC0+cHJpdikKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0VSUk9SOworICAgIGVsc2UgaWYgKCEoY3R4LT5pZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfRU5DT0RFUikpCisgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTkNBUEFCTEU7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRXhlY3V0ZSBpbiBhIG5vcm1hbGl6ZWQgZmxvYXRpbmcgcG9pbnQgZW52aXJvbm1lbnQsIGlmIHRoZSBwbGF0Zm9ybQorICAgICAgICAgKiByZXF1aXJlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fZW5jID1jdHgtPnByaXYtPmVuYy50b3RhbF9lbmNvZGVyczsKKworICAgICAgICBGTE9BVElOR19QT0lOVF9JTklUKCk7CisKKyAgICAgICAgaWYgKG51bV9lbmMgPT0gMSkKKyAgICAgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmVuYy5lbmNvZGUoY3R4LT5wcml2LT5hbGdfcHJpdiwgaW1nLCBwdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBmbGFncywgZGVhZGxpbmUpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE11bHRpLXJlc29sdXRpb24gZW5jb2Rpbmc6CisgICAgICAgICAgICAgKiBFbmNvZGUgbXVsdGktbGV2ZWxzIGluIHJldmVyc2Ugb3JkZXIuIEZvciBleGFtcGxlLAorICAgICAgICAgICAgICogaWYgbXJfdG90YWxfcmVzb2x1dGlvbnMgPSAzLCBmaXJzdCBlbmNvZGUgbGV2ZWwgMiwKKyAgICAgICAgICAgICAqIHRoZW4gZW5jb2RlIGxldmVsIDEsIGFuZCBmaW5hbGx5IGVuY29kZSBsZXZlbCAwLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgY3R4ICs9IG51bV9lbmMgLSAxOworICAgICAgICAgICAgaWYgKGltZykgaW1nICs9IG51bV9lbmMgLSAxOworCisgICAgICAgICAgICBmb3IgKGkgPSBudW1fZW5jLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocmVzID0gY3R4LT5pZmFjZS0+ZW5jLmVuY29kZShjdHgtPnByaXYtPmFsZ19wcml2LCBpbWcsIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sIGZsYWdzLCBkZWFkbGluZSkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGN0eC0tOworICAgICAgICAgICAgICAgIGlmIChpbWcpIGltZy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4Kys7CisgICAgICAgIH0KKworICAgICAgICBGTE9BVElOR19QT0lOVF9SRVNUT1JFKCk7CisgICAgfQorCisgICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKK30KKworCitjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnZweF9jb2RlY19nZXRfY3hfZGF0YSh2cHhfY29kZWNfY3R4X3QgICAqY3R4LAorICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAqaXRlcikKK3sKKyAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdCA9IE5VTEw7CisKKyAgICBpZiAoY3R4KQorICAgIHsKKyAgICAgICAgaWYgKCFpdGVyKQorICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgZWxzZSBpZiAoIWN0eC0+aWZhY2UgfHwgIWN0eC0+cHJpdikKKyAgICAgICAgICAgIGN0eC0+ZXJyID0gVlBYX0NPREVDX0VSUk9SOworICAgICAgICBlbHNlIGlmICghKGN0eC0+aWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIpKQorICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwa3QgPSBjdHgtPmlmYWNlLT5lbmMuZ2V0X2N4X2RhdGEoY3R4LT5wcml2LT5hbGdfcHJpdiwgaXRlcik7CisgICAgfQorCisgICAgaWYgKHBrdCAmJiBwa3QtPmtpbmQgPT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSBhcHBsaWNhdGlvbiBoYXMgc3BlY2lmaWVkIGEgZGVzdGluYXRpb24gYXJlYSBmb3IgdGhlCisgICAgICAgICAqIGNvbXByZXNzZWQgZGF0YSwgYW5kIHRoZSBjb2RlYyBoYXMgbm90IHBsYWNlZCB0aGUgZGF0YSB0aGVyZSwKKyAgICAgICAgICogYW5kIGl0IGZpdHMsIGNvcHkgaXQuCisgICAgICAgICAqLworICAgICAgICBjaGFyICpkc3RfYnVmID0gY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9kc3RfYnVmLmJ1ZjsKKworICAgICAgICBpZiAoZHN0X2J1ZgorICAgICAgICAgICAgJiYgcGt0LT5kYXRhLnJhdy5idWYgIT0gZHN0X2J1ZgorICAgICAgICAgICAgJiYgcGt0LT5kYXRhLnJhdy5zegorICAgICAgICAgICAgKyBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9iZWZvcmUKKyAgICAgICAgICAgICsgY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9wYWRfYWZ0ZXIKKyAgICAgICAgICAgIDw9IGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfZHN0X2J1Zi5zeikKKyAgICAgICAgeworICAgICAgICAgICAgdnB4X2NvZGVjX2N4X3BrdF90ICptb2RpZmllZF9wa3QgPSAmY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9wa3Q7CisKKyAgICAgICAgICAgIG1lbWNweShkc3RfYnVmICsgY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9wYWRfYmVmb3JlLAorICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS5yYXcuYnVmLCBwa3QtPmRhdGEucmF3LnN6KTsKKyAgICAgICAgICAgICptb2RpZmllZF9wa3QgPSAqcGt0OworICAgICAgICAgICAgbW9kaWZpZWRfcGt0LT5kYXRhLnJhdy5idWYgPSBkc3RfYnVmOworICAgICAgICAgICAgbW9kaWZpZWRfcGt0LT5kYXRhLnJhdy5zeiArPSBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9iZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9hZnRlcjsKKyAgICAgICAgICAgIHBrdCA9IG1vZGlmaWVkX3BrdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkc3RfYnVmID09IHBrdC0+ZGF0YS5yYXcuYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX2RzdF9idWYuYnVmID0gZHN0X2J1ZiArIHBrdC0+ZGF0YS5yYXcuc3o7CisgICAgICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX2RzdF9idWYuc3ogLT0gcGt0LT5kYXRhLnJhdy5zejsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwa3Q7Cit9CisKKwordnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19zZXRfY3hfZGF0YV9idWYodnB4X2NvZGVjX2N0eF90ICAgICAgICpjdHgsCisgICAgICAgIGNvbnN0IHZweF9maXhlZF9idWZfdCAqYnVmLAorICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHBhZF9iZWZvcmUsCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcGFkX2FmdGVyKQoreworICAgIGlmICghY3R4IHx8ICFjdHgtPnByaXYpCisgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworICAgIGlmIChidWYpCisgICAgeworICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX2RzdF9idWYgPSAqYnVmOworICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9iZWZvcmUgPSBwYWRfYmVmb3JlOworICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9hZnRlciA9IHBhZF9hZnRlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9kc3RfYnVmLmJ1ZiA9IE5VTEw7CisgICAgICAgIGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfZHN0X2J1Zi5zeiA9IDA7CisgICAgICAgIGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfcGFkX2JlZm9yZSA9IDA7CisgICAgICAgIGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfcGFkX2FmdGVyID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gVlBYX0NPREVDX09LOworfQorCisKK2NvbnN0IHZweF9pbWFnZV90ICp2cHhfY29kZWNfZ2V0X3ByZXZpZXdfZnJhbWUodnB4X2NvZGVjX2N0eF90ICAgKmN0eCkKK3sKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gTlVMTDsKKworICAgIGlmIChjdHgpCisgICAgeworICAgICAgICBpZiAoIWN0eC0+aWZhY2UgfHwgIWN0eC0+cHJpdikKKyAgICAgICAgICAgIGN0eC0+ZXJyID0gVlBYX0NPREVDX0VSUk9SOworICAgICAgICBlbHNlIGlmICghKGN0eC0+aWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIpKQorICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgICAgICBlbHNlIGlmICghY3R4LT5pZmFjZS0+ZW5jLmdldF9wcmV2aWV3KQorICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbWcgPSBjdHgtPmlmYWNlLT5lbmMuZ2V0X3ByZXZpZXcoY3R4LT5wcml2LT5hbGdfcHJpdik7CisgICAgfQorCisgICAgcmV0dXJuIGltZzsKK30KKworCit2cHhfZml4ZWRfYnVmX3QgKnZweF9jb2RlY19nZXRfZ2xvYmFsX2hlYWRlcnModnB4X2NvZGVjX2N0eF90ICAgKmN0eCkKK3sKKyAgICB2cHhfZml4ZWRfYnVmX3QgKmJ1ZiA9IE5VTEw7CisKKyAgICBpZiAoY3R4KQorICAgIHsKKyAgICAgICAgaWYgKCFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYpCisgICAgICAgICAgICBjdHgtPmVyciA9IFZQWF9DT0RFQ19FUlJPUjsKKyAgICAgICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKKyAgICAgICAgICAgIGN0eC0+ZXJyID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICAgICAgZWxzZSBpZiAoIWN0eC0+aWZhY2UtPmVuYy5nZXRfZ2xvYl9oZHJzKQorICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYgPSBjdHgtPmlmYWNlLT5lbmMuZ2V0X2dsb2JfaGRycyhjdHgtPnByaXYtPmFsZ19wcml2KTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCisKK3ZweF9jb2RlY19lcnJfdCAgdnB4X2NvZGVjX2VuY19jb25maWdfc2V0KHZweF9jb2RlY19jdHhfdCAgICAgICAgICAgICpjdHgsCisgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgICpjZmcpCit7CisgICAgdnB4X2NvZGVjX2Vycl90IHJlczsKKworICAgIGlmICghY3R4IHx8ICFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYgfHwgIWNmZykKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07CisgICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKKyAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmVuYy5jZmdfc2V0KGN0eC0+cHJpdi0+YWxnX3ByaXYsIGNmZyk7CisKKyAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOworfQorCisKK2ludCB2cHhfY29kZWNfcGt0X2xpc3RfYWRkKHN0cnVjdCB2cHhfY29kZWNfcGt0X2xpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqcGt0KQoreworICAgIGlmIChsaXN0LT5jbnQgPCBsaXN0LT5tYXgpCisgICAgeworICAgICAgICBsaXN0LT5wa3RzW2xpc3QtPmNudCsrXSA9ICpwa3Q7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKK2NvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqdnB4X2NvZGVjX3BrdF9saXN0X2dldChzdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0ICpsaXN0LAorICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAgICAgICAgICAqaXRlcikKK3sKKyAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdDsKKworICAgIGlmICghKCppdGVyKSkKKyAgICB7CisgICAgICAgICppdGVyID0gbGlzdC0+cGt0czsKKyAgICB9CisKKyAgICBwa3QgPSAoY29uc3Qgdm9pZCAqKSAqIGl0ZXI7CisKKyAgICBpZiAoKHNpemVfdCkocGt0IC0gbGlzdC0+cGt0cykgPCBsaXN0LT5jbnQpCisgICAgICAgICppdGVyID0gcGt0ICsgMTsKKyAgICBlbHNlCisgICAgICAgIHBrdCA9IE5VTEw7CisKKyAgICByZXR1cm4gcGt0OworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC9zcmMvdnB4X2ltYWdlLmMgYi9saWJ2cHgvdnB4L3NyYy92cHhfaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzZiNmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweC9zcmMvdnB4X2ltYWdlLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidnB4L3ZweF9pbWFnZS5oIgorCisjZGVmaW5lIEFERFJFU1NfU1RPUkFHRV9TSVpFICAgICAgc2l6ZW9mKHNpemVfdCkKKy8qcmV0dXJucyBhbiBhZGRyIGFsaWduZWQgdG8gdGhlIGJ5dGUgYm91bmRhcnkgc3BlY2lmaWVkIGJ5IGFsaWduKi8KKyNkZWZpbmUgYWxpZ25fYWRkcihhZGRyLGFsaWduKSAodm9pZCopKCgoc2l6ZV90KShhZGRyKSArICgoYWxpZ24pIC0gMSkpICYgKHNpemVfdCktKGFsaWduKSkKKworLyogTWVtYWxpZ24gY29kZSBpcyBjb3BpZWQgZnJvbSB2cHhfbWVtLmMgKi8KK3N0YXRpYyB2b2lkICppbWdfYnVmX21lbWFsaWduKHNpemVfdCBhbGlnbiwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqYWRkciwKKyAgICAgICAgICogeCA9IE5VTEw7CisKKyAgICBhZGRyID0gbWFsbG9jKHNpemUgKyBhbGlnbiAtIDEgKyBBRERSRVNTX1NUT1JBR0VfU0laRSk7CisKKyAgICBpZiAoYWRkcikKKyAgICB7CisgICAgICAgIHggPSBhbGlnbl9hZGRyKCh1bnNpZ25lZCBjaGFyICopYWRkciArIEFERFJFU1NfU1RPUkFHRV9TSVpFLCAoaW50KWFsaWduKTsKKyAgICAgICAgLyogc2F2ZSB0aGUgYWN0dWFsIG1hbGxvYyBhZGRyZXNzICovCisgICAgICAgICgoc2l6ZV90ICopeClbLTFdID0gKHNpemVfdClhZGRyOworICAgIH0KKworICAgIHJldHVybiB4OworfQorCitzdGF0aWMgdm9pZCBpbWdfYnVmX2ZyZWUodm9pZCAqbWVtYmxrKQoreworICAgIGlmIChtZW1ibGspCisgICAgeworICAgICAgICB2b2lkICphZGRyID0gKHZvaWQgKikoKChzaXplX3QgKiltZW1ibGspWy0xXSk7CisgICAgICAgIGZyZWUoYWRkcik7CisgICAgfQorfQorCitzdGF0aWMgdnB4X2ltYWdlX3QgKmltZ19hbGxvY19oZWxwZXIodnB4X2ltYWdlX3QgICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19mbXRfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBkX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBkX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBidWZfYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBzdHJpZGVfYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICppbWdfZGF0YSkKK3sKKworICAgIHVuc2lnbmVkIGludCAgaCwgdywgcywgeGNzLCB5Y3MsIGJwczsKKyAgICBpbnQgICAgICAgICAgIGFsaWduOworCisgICAgLyogVHJlYXQgYWxpZ249PTAgbGlrZSBhbGlnbj09MSAqLworICAgIGlmICghYnVmX2FsaWduKQorICAgICAgICBidWZfYWxpZ24gPSAxOworCisgICAgLyogVmFsaWRhdGUgYWxpZ25tZW50IChtdXN0IGJlIHBvd2VyIG9mIDIpICovCisgICAgaWYgKGJ1Zl9hbGlnbiAmIChidWZfYWxpZ24gLSAxKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogVHJlYXQgYWxpZ249PTAgbGlrZSBhbGlnbj09MSAqLworICAgIGlmICghc3RyaWRlX2FsaWduKQorICAgICAgICBzdHJpZGVfYWxpZ24gPSAxOworCisgICAgLyogVmFsaWRhdGUgYWxpZ25tZW50IChtdXN0IGJlIHBvd2VyIG9mIDIpICovCisgICAgaWYgKHN0cmlkZV9hbGlnbiAmIChzdHJpZGVfYWxpZ24gLSAxKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogR2V0IHNhbXBsZSBzaXplIGZvciB0aGlzIGZvcm1hdCAqLworICAgIHN3aXRjaCAoZm10KQorICAgIHsKKyAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjMyOgorICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCMzJfTEU6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9BUkdCOgorICAgIGNhc2UgVlBYX0lNR19GTVRfQVJHQl9MRToKKyAgICAgICAgYnBzID0gMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCMjQ6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9CR1IyNDoKKyAgICAgICAgYnBzID0gMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCNTY1OgorICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCNTY1X0xFOgorICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCNTU1OgorICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCNTU1X0xFOgorICAgIGNhc2UgVlBYX0lNR19GTVRfVVlWWToKKyAgICBjYXNlIFZQWF9JTUdfRk1UX1lVWTI6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9ZVllVOgorICAgICAgICBicHMgPSAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIwOgorICAgIGNhc2UgVlBYX0lNR19GTVRfWVYxMjoKKyAgICBjYXNlIFZQWF9JTUdfRk1UX1ZQWEk0MjA6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9WUFhZVjEyOgorICAgICAgICBicHMgPSAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnBzID0gMTY7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEdldCBjaHJvbWEgc2hpZnQgdmFsdWVzIGZvciB0aGlzIGZvcm1hdCAqLworICAgIHN3aXRjaCAoZm10KQorICAgIHsKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjA6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9ZVjEyOgorICAgIGNhc2UgVlBYX0lNR19GTVRfVlBYSTQyMDoKKyAgICBjYXNlIFZQWF9JTUdfRk1UX1ZQWFlWMTI6CisgICAgICAgIHhjcyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHhjcyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoZm10KQorICAgIHsKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjA6CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9ZVjEyOgorICAgIGNhc2UgVlBYX0lNR19GTVRfVlBYSTQyMDoKKyAgICBjYXNlIFZQWF9JTUdfRk1UX1ZQWFlWMTI6CisgICAgICAgIHljcyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHljcyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBzdG9yYWdlIHNpemVzIGdpdmVuIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmcgKi8KKyAgICBhbGlnbiA9ICgxIDw8IHhjcykgLSAxOworICAgIHcgPSAoZF93ICsgYWxpZ24pICYgfmFsaWduOworICAgIGFsaWduID0gKDEgPDwgeWNzKSAtIDE7CisgICAgaCA9IChkX2ggKyBhbGlnbikgJiB+YWxpZ247CisgICAgcyA9IChmbXQgJiBWUFhfSU1HX0ZNVF9QTEFOQVIpID8gdyA6IGJwcyAqIHcgLyA4OworICAgIHMgPSAocyArIHN0cmlkZV9hbGlnbiAtIDEpICYgfihzdHJpZGVfYWxpZ24gLSAxKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBuZXcgaW1hZ2UgKi8KKyAgICBpZiAoIWltZykKKyAgICB7CisgICAgICAgIGltZyA9ICh2cHhfaW1hZ2VfdCAqKWNhbGxvYygxLCBzaXplb2YodnB4X2ltYWdlX3QpKTsKKworICAgICAgICBpZiAoIWltZykKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpbWctPnNlbGZfYWxsb2NkID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtc2V0KGltZywgMCwgc2l6ZW9mKHZweF9pbWFnZV90KSk7CisgICAgfQorCisgICAgaW1nLT5pbWdfZGF0YSA9IGltZ19kYXRhOworCisgICAgaWYgKCFpbWdfZGF0YSkKKyAgICB7CisgICAgICAgIGltZy0+aW1nX2RhdGEgPSBpbWdfYnVmX21lbWFsaWduKGJ1Zl9hbGlnbiwgKChmbXQgJiBWUFhfSU1HX0ZNVF9QTEFOQVIpPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICogcyAqIGJwcyAvIDggOiBoICogcykpOworICAgICAgICBpbWctPmltZ19kYXRhX293bmVyID0gMTsKKyAgICB9CisKKyAgICBpZiAoIWltZy0+aW1nX2RhdGEpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGltZy0+Zm10ID0gZm10OworICAgIGltZy0+dyA9IHc7CisgICAgaW1nLT5oID0gaDsKKyAgICBpbWctPnhfY2hyb21hX3NoaWZ0ID0geGNzOworICAgIGltZy0+eV9jaHJvbWFfc2hpZnQgPSB5Y3M7CisgICAgaW1nLT5icHMgPSBicHM7CisKKyAgICAvKiBDYWxjdWxhdGUgc3RyaWRlcyAqLworICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9BTFBIQV0gPSBzOworICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXSA9IHMgPj4geGNzOworCisgICAgLyogRGVmYXVsdCB2aWV3cG9ydCB0byBlbnRpcmUgaW1hZ2UgKi8KKyAgICBpZiAoIXZweF9pbWdfc2V0X3JlY3QoaW1nLCAwLCAwLCBkX3csIGRfaCkpCisgICAgICAgIHJldHVybiBpbWc7CisKK2ZhaWw6CisgICAgdnB4X2ltZ19mcmVlKGltZyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZweF9pbWFnZV90ICp2cHhfaW1nX2FsbG9jKHZweF9pbWFnZV90ICAqaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19mbXRfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGRfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZF9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBhbGlnbikKK3sKKyAgICByZXR1cm4gaW1nX2FsbG9jX2hlbHBlcihpbWcsIGZtdCwgZF93LCBkX2gsIGFsaWduLCBhbGlnbiwgTlVMTCk7Cit9CisKK3ZweF9pbWFnZV90ICp2cHhfaW1nX3dyYXAodnB4X2ltYWdlX3QgICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfZm10X3QgZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGRfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBkX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgc3RyaWRlX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICppbWdfZGF0YSkKK3sKKyAgICAvKiBCeSBzZXR0aW5nIGJ1Zl9hbGlnbiA9IDEsIHdlIGRvbid0IGNoYW5nZSBidWZmZXIgYWxpZ25tZW50IGluIHRoaXMKKyAgICAgKiBmdW5jdGlvbi4gKi8KKyAgICByZXR1cm4gaW1nX2FsbG9jX2hlbHBlcihpbWcsIGZtdCwgZF93LCBkX2gsIDEsIHN0cmlkZV9hbGlnbiwgaW1nX2RhdGEpOworfQorCitpbnQgdnB4X2ltZ19zZXRfcmVjdCh2cHhfaW1hZ2VfdCAgKmltZywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgeCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgeSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgdywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgaCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgKmRhdGE7CisKKyAgICBpZiAoeCArIHcgPD0gaW1nLT53ICYmIHkgKyBoIDw9IGltZy0+aCkKKyAgICB7CisgICAgICAgIGltZy0+ZF93ID0gdzsKKyAgICAgICAgaW1nLT5kX2ggPSBoOworCisgICAgICAgIC8qIENhbGN1bGF0ZSBwbGFuZSBwb2ludGVycyAqLworICAgICAgICBpZiAoIShpbWctPmZtdCAmIFZQWF9JTUdfRk1UX1BMQU5BUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9QQUNLRURdID0KKyAgICAgICAgICAgICAgICBpbWctPmltZ19kYXRhICsgeCAqIGltZy0+YnBzIC8gOCArIHkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfUEFDS0VEXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEgPSBpbWctPmltZ19kYXRhOworCisgICAgICAgICAgICBpZiAoaW1nLT5mbXQgJiBWUFhfSU1HX0ZNVF9IQVNfQUxQSEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1nLT5wbGFuZXNbVlBYX1BMQU5FX0FMUEhBXSA9CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKyB4ICsgeSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9BTFBIQV07CisgICAgICAgICAgICAgICAgZGF0YSArPSBpbWctPmggKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfQUxQSEFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV0gPSBkYXRhICsgeCArIHkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgICAgICAgICBkYXRhICs9IGltZy0+aCAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKworICAgICAgICAgICAgaWYgKCEoaW1nLT5mbXQgJiBWUFhfSU1HX0ZNVF9VVl9GTElQKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVV0gPSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh4ID4+IGltZy0+eF9jaHJvbWFfc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh5ID4+IGltZy0+eV9jaHJvbWFfc2hpZnQpICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOworICAgICAgICAgICAgICAgIGRhdGEgKz0gKGltZy0+aCA+PiBpbWctPnlfY2hyb21hX3NoaWZ0KSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgICAgICAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVl0gPSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh4ID4+IGltZy0+eF9jaHJvbWFfc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh5ID4+IGltZy0+eV9jaHJvbWFfc2hpZnQpICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHggPj4gaW1nLT54X2Nocm9tYV9zaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHkgPj4gaW1nLT55X2Nocm9tYV9zaGlmdCkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisgICAgICAgICAgICAgICAgZGF0YSArPSAoaW1nLT5oID4+IGltZy0+eV9jaHJvbWFfc2hpZnQpICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOworICAgICAgICAgICAgICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHggPj4gaW1nLT54X2Nocm9tYV9zaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHkgPj4gaW1nLT55X2Nocm9tYV9zaGlmdCkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgdnB4X2ltZ19mbGlwKHZweF9pbWFnZV90ICppbWcpCit7CisgICAgLyogTm90ZTogSW4gdGhlIGNhbGN1bGF0aW9uIHBvaW50ZXIgYWRqdXN0bWVudCBjYWxjdWxhdGlvbiwgd2Ugd2FudCB0aGUKKyAgICAgKiByaHMgdG8gYmUgcHJvbW90ZWQgdG8gYSBzaWduZWQgdHlwZS4gU2VjdGlvbiA2LjMuMS44IG9mIHRoZSBJU08gQzk5CisgICAgICogc3RhbmRhcmQgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIGFkanVzdG1lbnQgcGFyYW1ldGVyIGlzIHVuc2lnbmVkLCB0aGUKKyAgICAgKiBzdHJpZGUgcGFyYW1ldGVyIHdpbGwgYmUgcHJvbW90ZWQgdG8gdW5zaWduZWQsIGNhdXNpbmcgZXJyb3JzIHdoZW4KKyAgICAgKiB0aGUgbGhzIGlzIGEgbGFyZ2VyIHR5cGUgdGhhbiB0aGUgcmhzLgorICAgICAqLworICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXSArPSAoc2lnbmVkKShpbWctPmRfaCAtIDEpICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXSA9IC1pbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisKKyAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVV0gKz0gKHNpZ25lZCkoKGltZy0+ZF9oID4+IGltZy0+eV9jaHJvbWFfc2hpZnQpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV0gPSAtaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOworCisgICAgaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdICs9IChzaWduZWQpKChpbWctPmRfaCA+PiBpbWctPnlfY2hyb21hX3NoaWZ0KSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisgICAgaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdID0gLWltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKworICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9BTFBIQV0gKz0gKHNpZ25lZCkoaW1nLT5kX2ggLSAxKSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9BTFBIQV07CisgICAgaW1nLT5zdHJpZGVbVlBYX1BMQU5FX0FMUEhBXSA9IC1pbWctPnN0cmlkZVtWUFhfUExBTkVfQUxQSEFdOworfQorCit2b2lkIHZweF9pbWdfZnJlZSh2cHhfaW1hZ2VfdCAqaW1nKQoreworICAgIGlmIChpbWcpCisgICAgeworICAgICAgICBpZiAoaW1nLT5pbWdfZGF0YSAmJiBpbWctPmltZ19kYXRhX293bmVyKQorICAgICAgICAgICAgaW1nX2J1Zl9mcmVlKGltZy0+aW1nX2RhdGEpOworCisgICAgICAgIGlmIChpbWctPnNlbGZfYWxsb2NkKQorICAgICAgICAgICAgZnJlZShpbWcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cHgvdnA4LmggYi9saWJ2cHgvdnB4L3ZwOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTIyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4L3ZwOC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyohXGRlZmdyb3VwIHZwOCBWUDgKKyAqIFxpbmdyb3VwIGNvZGVjcworICogVlA4IGlzIHZweCdzIG5ld2VzdCB2aWRlbyBjb21wcmVzc2lvbiBhbGdvcml0aG0gdGhhdCB1c2VzIG1vdGlvbgorICogY29tcGVuc2F0ZWQgcHJlZGljdGlvbiwgRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSAoRENUKSBjb2Rpbmcgb2YgdGhlCisgKiBwcmVkaWN0aW9uIGVycm9yIHNpZ25hbCBhbmQgY29udGV4dCBkZXBlbmRlbnQgZW50cm9weSBjb2RpbmcgdGVjaG5pcXVlcworICogYmFzZWQgb24gYXJpdGhtZXRpYyBwcmluY2lwbGVzLiBJdCBmZWF0dXJlczoKKyAqICAtIFlVViA0OjI6MCBpbWFnZSBmb3JtYXQKKyAqICAtIE1hY3JvLWJsb2NrIGJhc2VkIGNvZGluZyAoMTZ4MTYgbHVtYSBwbHVzIHR3byA4eDggY2hyb21hKQorICogIC0gMS80ICgxLzgpIHBpeGVsIGFjY3VyYWN5IG1vdGlvbiBjb21wZW5zYXRlZCBwcmVkaWN0aW9uCisgKiAgLSA0eDQgRENUIHRyYW5zZm9ybQorICogIC0gMTI4IGxldmVsIGxpbmVhciBxdWFudGl6ZXIKKyAqICAtIEluIGxvb3AgZGVibG9ja2luZyBmaWx0ZXIKKyAqICAtIENvbnRleHQtYmFzZWQgZW50cm9weSBjb2RpbmcKKyAqCisgKiBAeworICovCisvKiFcZmlsZQorICogXGJyaWVmIFByb3ZpZGVzIGNvbnRyb2xzIGNvbW1vbiB0byBib3RoIHRoZSBWUDggZW5jb2RlciBhbmQgZGVjb2Rlci4KKyAqLworI2lmbmRlZiBWUDhfSAorI2RlZmluZSBWUDhfSAorI2luY2x1ZGUgInZweF9jb2RlY19pbXBsX3RvcC5oIgorCisvKiFcYnJpZWYgQ29udHJvbCBmdW5jdGlvbnMKKyAqCisgKiBUaGUgc2V0IG9mIG1hY3JvcyBkZWZpbmUgdGhlIGNvbnRyb2wgZnVuY3Rpb25zIG9mIFZQOCBpbnRlcmZhY2UKKyAqLworZW51bSB2cDhfY29tX2NvbnRyb2xfaWQKK3sKKyAgICBWUDhfU0VUX1JFRkVSRU5DRSAgICAgICAgICAgPSAxLCAgICAvKio8IHBhc3MgaW4gYW4gZXh0ZXJuYWwgZnJhbWUgaW50byBkZWNvZGVyIHRvIGJlIHVzZWQgYXMgcmVmZXJlbmNlIGZyYW1lICovCisgICAgVlA4X0NPUFlfUkVGRVJFTkNFICAgICAgICAgID0gMiwgICAgLyoqPCBnZXQgYSBjb3B5IG9mIHJlZmVyZW5jZSBmcmFtZSBmcm9tIHRoZSBkZWNvZGVyICovCisgICAgVlA4X1NFVF9QT1NUUFJPQyAgICAgICAgICAgID0gMywgICAgLyoqPCBzZXQgdGhlIGRlY29kZXIncyBwb3N0IHByb2Nlc3Npbmcgc2V0dGluZ3MgICovCisgICAgVlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FID0gNCwgICAgLyoqPCBzZXQgdGhlIHJlZmVyZW5jZSBmcmFtZXMgdG8gY29sb3IgZm9yIGVhY2ggbWFjcm9ibG9jayAqLworICAgIFZQOF9TRVRfREJHX0NPTE9SX01CX01PREVTICA9IDUsICAgIC8qKjwgc2V0IHdoaWNoIG1hY3JvIGJsb2NrIG1vZGVzIHRvIGNvbG9yICovCisgICAgVlA4X1NFVF9EQkdfQ09MT1JfQl9NT0RFUyAgID0gNiwgICAgLyoqPCBzZXQgd2hpY2ggYmxvY2tzIG1vZGVzIHRvIGNvbG9yICovCisgICAgVlA4X1NFVF9EQkdfRElTUExBWV9NViAgICAgID0gNywgICAgLyoqPCBzZXQgd2hpY2ggbW90aW9uIHZlY3RvciBtb2RlcyB0byBkcmF3ICovCisgICAgVlA4X0NPTU1PTl9DVFJMX0lEX01BWCwKKyAgICBWUDhfREVDT0RFUl9DVFJMX0lEX1NUQVJUICAgPSAyNTYKK307CisKKy8qIVxicmllZiBwb3N0IHByb2Nlc3MgZmxhZ3MKKyAqCisgKiBUaGUgc2V0IG9mIG1hY3JvcyBkZWZpbmUgVlA4IGRlY29kZXIgcG9zdCBwcm9jZXNzaW5nIGZsYWdzCisgKi8KK2VudW0gdnA4X3Bvc3Rwcm9jX2xldmVsCit7CisgICAgVlA4X05PRklMVEVSSU5HICAgICAgICAgICAgID0gMCwKKyAgICBWUDhfREVCTE9DSyAgICAgICAgICAgICAgICAgPSAxPDwwLAorICAgIFZQOF9ERU1BQ1JPQkxPQ0sgICAgICAgICAgICA9IDE8PDEsCisgICAgVlA4X0FERE5PSVNFICAgICAgICAgICAgICAgID0gMTw8MiwKKyAgICBWUDhfREVCVUdfVFhUX0ZSQU1FX0lORk8gICAgPSAxPDwzLCAvKio8IHByaW50IGZyYW1lIGluZm9ybWF0aW9uICovCisgICAgVlA4X0RFQlVHX1RYVF9NQkxLX01PREVTICAgID0gMTw8NCwgLyoqPCBwcmludCBtYWNybyBibG9jayBtb2RlcyBvdmVyIGVhY2ggbWFjcm8gYmxvY2sgKi8KKyAgICBWUDhfREVCVUdfVFhUX0RDX0RJRkYgICAgICAgPSAxPDw1LCAvKio8IHByaW50IGRjIGRpZmYgZm9yIGVhY2ggbWFjcm8gYmxvY2sgKi8KKyAgICBWUDhfREVCVUdfVFhUX1JBVEVfSU5GTyAgICAgPSAxPDw2LCAvKio8IHByaW50IHZpZGVvIHJhdGUgaW5mbyAoZW5jb2RlciBvbmx5KSAqLworICAgIFZQOF9NRlFFICAgICAgICAgICAgICAgICAgICA9IDE8PDEwCit9OworCisvKiFcYnJpZWYgcG9zdCBwcm9jZXNzIGZsYWdzCisgKgorICogVGhpcyBkZWZpbmUgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZSB0aGUgcG9zdCBwcm9jZXNzaW5nIHNldHRpbmdzLiBGb3IKKyAqIHRoZSBiZXN0IG9iamVjdGl2ZSBtZWFzdXJlICh1c2luZyB0aGUgUFNOUiBtZXRyaWMpIHNldCBwb3N0X3Byb2NfZmxhZworICogdG8gVlA4X0RFQkxPQ0sgYW5kIGRlYmxvY2tpbmdfbGV2ZWwgdG8gMS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB2cDhfcG9zdHByb2NfY2ZnCit7CisgICAgaW50IHBvc3RfcHJvY19mbGFnOyAgICAgICAgIC8qKjwgdGhlIHR5cGVzIG9mIHBvc3QgcHJvY2Vzc2luZyB0byBiZSBkb25lLCBzaG91bGQgYmUgY29tYmluYXRpb24gb2YgInZwOF9wb3N0cHJvY19sZXZlbCIgKi8KKyAgICBpbnQgZGVibG9ja2luZ19sZXZlbDsgICAgICAgLyoqPCB0aGUgc3RyZW5ndGggb2YgZGVibG9ja2luZywgdmFsaWQgcmFuZ2UgWzAsIDE2XSAqLworICAgIGludCBub2lzZV9sZXZlbDsgICAgICAgICAgICAvKio8IHRoZSBzdHJlbmd0aCBvZiBhZGRpdGl2ZSBub2lzZSwgdmFsaWQgcmFuZ2UgWzAsIDE2XSAqLworfSB2cDhfcG9zdHByb2NfY2ZnX3Q7CisKKy8qIVxicmllZiByZWZlcmVuY2UgZnJhbWUgdHlwZQorICoKKyAqIFRoZSBzZXQgb2YgbWFjcm9zIGRlZmluZSB0aGUgdHlwZSBvZiBWUDggcmVmZXJlbmNlIGZyYW1lcworICovCit0eXBlZGVmIGVudW0gdnB4X3JlZl9mcmFtZV90eXBlCit7CisgICAgVlA4X0xBU1RfRlJBTUUgPSAxLAorICAgIFZQOF9HT0xEX0ZSQU1FID0gMiwKKyAgICBWUDhfQUxUUl9GUkFNRSA9IDQKK30gdnB4X3JlZl9mcmFtZV90eXBlX3Q7CisKKy8qIVxicmllZiByZWZlcmVuY2UgZnJhbWUgZGF0YSBzdHJ1Y3QKKyAqCisgKiBkZWZpbmUgdGhlIGRhdGEgc3RydWN0IHRvIGFjY2VzcyB2cDggcmVmZXJlbmNlIGZyYW1lcworICovCisKK3R5cGVkZWYgc3RydWN0IHZweF9yZWZfZnJhbWUKK3sKKyAgICB2cHhfcmVmX2ZyYW1lX3R5cGVfdCAgZnJhbWVfdHlwZTsgICAvKio8IHdoaWNoIHJlZmVyZW5jZSBmcmFtZSAqLworICAgIHZweF9pbWFnZV90ICAgICAgICAgICBpbWc7ICAgICAgICAgIC8qKjwgcmVmZXJlbmNlIGZyYW1lIGRhdGEgaW4gaW1hZ2UgZm9ybWF0ICovCit9IHZweF9yZWZfZnJhbWVfdDsKKworCisvKiFcYnJpZWYgdnA4IGRlY29kZXIgY29udHJvbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZQorICoKKyAqIGRlZmluZXMgdGhlIGRhdGEgdHlwZSBmb3IgZWFjaCBvZiBWUDggZGVjb2RlciBjb250cm9sIGZ1bmN0aW9uIHJlcXVpcmVzCisgKi8KKworVlBYX0NUUkxfVVNFX1RZUEUoVlA4X1NFVF9SRUZFUkVOQ0UsICAgICAgICAgICB2cHhfcmVmX2ZyYW1lX3QgKikKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOF9DT1BZX1JFRkVSRU5DRSwgICAgICAgICAgdnB4X3JlZl9mcmFtZV90ICopCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhfU0VUX1BPU1RQUk9DLCAgICAgICAgICAgIHZwOF9wb3N0cHJvY19jZmdfdCAqKQorVlBYX0NUUkxfVVNFX1RZUEUoVlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FLCBpbnQpCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhfU0VUX0RCR19DT0xPUl9NQl9NT0RFUywgIGludCkKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOF9TRVRfREJHX0NPTE9SX0JfTU9ERVMsICAgaW50KQorVlBYX0NUUkxfVVNFX1RZUEUoVlA4X1NFVF9EQkdfRElTUExBWV9NViwgICAgICBpbnQpCisKKworLyohIEB9IC0gZW5kIGRlZmdyb3VwIHZwOCAqLworCisjaW5jbHVkZSAidnB4X2NvZGVjX2ltcGxfYm90dG9tLmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cHgvdnA4Y3guaCBiL2xpYnZweC92cHgvdnA4Y3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M5NWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweC92cDhjeC5oCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyohXGRlZmdyb3VwIHZwOF9lbmNvZGVyIFdlYk0gVlA4IEVuY29kZXIKKyAqIFxpbmdyb3VwIHZwOAorICoKKyAqIEB7CisgKi8KKyNpbmNsdWRlICJ2cDguaCIKKworLyohXGZpbGUKKyAqIFxicmllZiBQcm92aWRlcyBkZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlIFZQOCBlbmNvZGVyIGFsZ29yaXRobSB3aXRoaW4gdGhlCisgKiAgICAgICAgdnB4IENvZGVjIEludGVyZmFjZS4KKyAqLworI2lmbmRlZiBWUDhDWF9ICisjZGVmaW5lIFZQOENYX0gKKyNpbmNsdWRlICJ2cHhfY29kZWNfaW1wbF90b3AuaCIKKworLyohXG5hbWUgQWxnb3JpdGhtIGludGVyZmFjZSBmb3IgVlA4CisgKgorICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgdG8gZW5jb2RlIHJhdyBWUDggc3RyZWFtcywgYXMgd291bGQKKyAqIGJlIGZvdW5kIGluIEFWSSBmaWxlcy4KKyAqIEB7CisgKi8KK2V4dGVybiB2cHhfY29kZWNfaWZhY2VfdCAgdnB4X2NvZGVjX3ZwOF9jeF9hbGdvOworZXh0ZXJuIHZweF9jb2RlY19pZmFjZV90KiB2cHhfY29kZWNfdnA4X2N4KHZvaWQpOworLyohQH0gLSBlbmQgYWxnb3JpdGhtIGludGVyZmFjZSBtZW1iZXIgZ3JvdXAqLworCisKKy8qCisgKiBBbGdvcml0aG0gRmxhZ3MKKyAqLworCisvKiFcYnJpZWYgRG9uJ3QgcmVmZXJlbmNlIHRoZSBsYXN0IGZyYW1lCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciB3aWxsIG5vdCB1c2UgdGhlIGxhc3QgZnJhbWUgYXMgYQorICogcHJlZGljdG9yLiBXaGVuIG5vdCBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIHdoZXRoZXIgdG8gdXNlIHRoZQorICogbGFzdCBmcmFtZSBvciBub3QgYXV0b21hdGljYWxseS4KKyAqLworI2RlZmluZSBWUDhfRUZMQUdfTk9fUkVGX0xBU1QgICAgICAoMTw8MTYpCisKKworLyohXGJyaWVmIERvbid0IHJlZmVyZW5jZSB0aGUgZ29sZGVuIGZyYW1lCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciB3aWxsIG5vdCB1c2UgdGhlIGdvbGRlbiBmcmFtZSBhcyBhCisgKiBwcmVkaWN0b3IuIFdoZW4gbm90IHNldCwgdGhlIGVuY29kZXIgd2lsbCBjaG9vc2Ugd2hldGhlciB0byB1c2UgdGhlCisgKiBnb2xkZW4gZnJhbWUgb3Igbm90IGF1dG9tYXRpY2FsbHkuCisgKi8KKyNkZWZpbmUgVlA4X0VGTEFHX05PX1JFRl9HRiAgICAgICAgKDE8PDE3KQorCisKKy8qIVxicmllZiBEb24ndCByZWZlcmVuY2UgdGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUKKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgbm90IHVzZSB0aGUgYWx0IHJlZiBmcmFtZSBhcyBhCisgKiBwcmVkaWN0b3IuIFdoZW4gbm90IHNldCwgdGhlIGVuY29kZXIgd2lsbCBjaG9vc2Ugd2hldGhlciB0byB1c2UgdGhlCisgKiBhbHQgcmVmIGZyYW1lIG9yIG5vdCBhdXRvbWF0aWNhbGx5LgorICovCisjZGVmaW5lIFZQOF9FRkxBR19OT19SRUZfQVJGICAgICAgICgxPDwyMSkKKworCisvKiFcYnJpZWYgRG9uJ3QgdXBkYXRlIHRoZSBsYXN0IGZyYW1lCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciB3aWxsIG5vdCB1cGRhdGUgdGhlIGxhc3QgZnJhbWUgd2l0aAorICogdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICovCisjZGVmaW5lIFZQOF9FRkxBR19OT19VUERfTEFTVCAgICAgICgxPDwxOCkKKworCisvKiFcYnJpZWYgRG9uJ3QgdXBkYXRlIHRoZSBnb2xkZW4gZnJhbWUKKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgbm90IHVwZGF0ZSB0aGUgZ29sZGVuIGZyYW1lIHdpdGgKKyAqIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAqLworI2RlZmluZSBWUDhfRUZMQUdfTk9fVVBEX0dGICAgICAgICAoMTw8MjIpCisKKworLyohXGJyaWVmIERvbid0IHVwZGF0ZSB0aGUgYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZQorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGVuY29kZXIgd2lsbCBub3QgdXBkYXRlIHRoZSBhbHQgcmVmIGZyYW1lIHdpdGgKKyAqIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAqLworI2RlZmluZSBWUDhfRUZMQUdfTk9fVVBEX0FSRiAgICAgICAoMTw8MjMpCisKKworLyohXGJyaWVmIEZvcmNlIGdvbGRlbiBmcmFtZSB1cGRhdGUKKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBlbmNvZGVyIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgKiB0byB0aGUgZ29sZGVuIGZyYW1lIGJ1ZmZlci4KKyAqLworI2RlZmluZSBWUDhfRUZMQUdfRk9SQ0VfR0YgICAgICAgICAoMTw8MTkpCisKKworLyohXGJyaWVmIEZvcmNlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUgdXBkYXRlCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBmcmFtZQorICogdG8gdGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyLgorICovCisjZGVmaW5lIFZQOF9FRkxBR19GT1JDRV9BUkYgICAgICAgICgxPDwyNCkKKworCisvKiFcYnJpZWYgRGlzYWJsZSBlbnRyb3B5IHVwZGF0ZQorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGVuY29kZXIgd2lsbCBub3QgdXBkYXRlIGl0cyBpbnRlcm5hbCBlbnRyb3B5CisgKiBtb2RlbCBiYXNlZCBvbiB0aGUgZW50cm9weSBvZiB0aGlzIGZyYW1lLgorICovCisjZGVmaW5lIFZQOF9FRkxBR19OT19VUERfRU5UUk9QWSAgICgxPDwyMCkKKworCisvKiFcYnJpZWYgVlA4IGVuY29kZXIgY29udHJvbCBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIHNldCBvZiBtYWNyb3MgZGVmaW5lIHRoZSBjb250cm9sIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBWUDgKKyAqIGVuY29kZXIgaW50ZXJmYWNlLgorICoKKyAqIFxzYSAjdnB4X2NvZGVjX2NvbnRyb2wKKyAqLworZW51bSB2cDhlX2VuY19jb250cm9sX2lkCit7CisgICAgVlA4RV9VUERfRU5UUk9QWSAgICAgICAgICAgPSA1LCAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCBtb2RlIG9mIGVudHJvcHkgdXBkYXRlIGluIGVuY29kZXIgKi8KKyAgICBWUDhFX1VQRF9SRUZFUkVOQ0UsICAgICAgICAgICAgICAvKio8IGNvbnRyb2wgZnVuY3Rpb24gdG8gc2V0IHJlZmVyZW5jZSB1cGRhdGUgbW9kZSBpbiBlbmNvZGVyICovCisgICAgVlA4RV9VU0VfUkVGRVJFTkNFLCAgICAgICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB3aGljaCByZWZlcmVuY2UgZnJhbWUgZW5jb2RlciBjYW4gdXNlICovCisgICAgVlA4RV9TRVRfUk9JX01BUCwgICAgICAgICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHBhc3MgYW4gUk9JIG1hcCB0byBlbmNvZGVyICovCisgICAgVlA4RV9TRVRfQUNUSVZFTUFQLCAgICAgICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHBhc3MgYW4gQWN0aXZlIG1hcCB0byBlbmNvZGVyICovCisgICAgVlA4RV9TRVRfU0NBTEVNT0RFICAgICAgICAgPSAxMSwgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCBlbmNvZGVyIHNjYWxpbmcgbW9kZSAqLworICAgIC8qIVxicmllZiBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB2cDggZW5jb2RlciBjcHV1c2VkCisgICAgICoKKyAgICAgKiBDaGFuZ2VzIGluIHRoaXMgdmFsdWUgaW5mbHVlbmNlcywgYW1vbmcgb3RoZXJzLCB0aGUgZW5jb2RlcidzIHNlbGVjdGlvbgorICAgICAqIG9mIG1vdGlvbiBlc3RpbWF0aW9uIG1ldGhvZHMuIFZhbHVlcyBncmVhdGVyIHRoYW4gMCB3aWxsIGluY3JlYXNlIGVuY29kZXIKKyAgICAgKiBzcGVlZCBhdCB0aGUgZXhwZW5zZSBvZiBxdWFsaXR5LgorICAgICAqIFRoZSBmdWxsIHNldCBvZiBhZGp1c3RtZW50cyBjYW4gYmUgZm91bmQgaW4KKyAgICAgKiBvbnl4X2lmLmM6dnA4X3NldF9zcGVlZF9mZWF0dXJlcygpLgorICAgICAqIFx0b2RvIExpc3QgaGlnaGxpZ2h0cyBvZiB0aGUgY2hhbmdlcyBhdCB2YXJpb3VzIGxldmVscy4KKyAgICAgKgorICAgICAqIFxub3RlIFZhbGlkIHJhbmdlOiAtMTYuLjE2CisgICAgICovCisgICAgVlA4RV9TRVRfQ1BVVVNFRCAgICAgICAgICAgPSAxMywKKyAgICBWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLCAgICAgICAvKio8IGNvbnRyb2wgZnVuY3Rpb24gdG8gZW5hYmxlIHZwOCB0byBhdXRvbWF0aWMgc2V0IGFuZCB1c2UgYWx0cmVmIGZyYW1lICovCisgICAgVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCBub2lzZSBzZW5zaXRpdml0eSAqLworICAgIFZQOEVfU0VUX1NIQVJQTkVTUywgICAgICAgICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgc2hhcnBuZXNzICovCisgICAgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB0aGUgdGhyZXNob2xkIGZvciBtYWNyb2Jsb2NrcyB0cmVhdGVkIHN0YXRpYyAqLworICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgdGhlIG51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zICAqLworICAgIFZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSLCAgICAgICAgIC8qKjwgcmV0dXJuIHRoZSBxdWFudGl6ZXIgY2hvc2VuIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciBmb3IgdGhlIGxhc3QgZnJhbWUgdXNpbmcgdGhlIGludGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSAqLworICAgIFZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSXzY0LCAgICAgIC8qKjwgcmV0dXJuIHRoZSBxdWFudGl6ZXIgY2hvc2VuIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciBmb3IgdGhlIGxhc3QgZnJhbWUsIHVzaW5nIHRoZSAwLi42MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgYXMgdXNlZCBieSB0aGUgcmNfKl9xdWFudGl6ZXIgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICovCisgICAgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB0aGUgbWF4IG51bWJlciBvZiBmcmFtZXMgYmx1cnJlZCBjcmVhdGluZyBhcmYqLworICAgIFZQOEVfU0VUX0FSTlJfU1RSRU5HVEggLCAgICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgdGhlIGZpbHRlciBzdHJlbmd0aCBmb3IgdGhlIGFyZiAqLworICAgIFZQOEVfU0VUX0FSTlJfVFlQRSAgICAgLCAgICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgZmlsdGVyIHRvIHVzZSBmb3IgdGhlIGFyZiovCisgICAgVlA4RV9TRVRfVFVOSU5HLCAgICAgICAgICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB2aXN1YWwgdHVuaW5nICovCisgICAgLyohXGJyaWVmIGNvbnRyb2wgZnVuY3Rpb24gdG8gc2V0IGNvbnN0cmFpbmVkIHF1YWxpdHkgbGV2ZWwKKyAgICAgKgorICAgICAqIFxhdHRlbnRpb24gRm9yIHRoaXMgdmFsdWUgdG8gYmUgdXNlZCB2cHhfY29kZWNfZW5jX2NmZ190OjpnX3VzYWdlIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIHNldCB0byAjVlBYX0NRLgorICAgICAqIFxub3RlIFZhbGlkIHJhbmdlOiAwLi42MworICAgICAqLworICAgIFZQOEVfU0VUX0NRX0xFVkVMLAorCisgICAgLyohXGJyaWVmIE1heCBkYXRhIHJhdGUgZm9yIEludHJhIGZyYW1lcworICAgICAqCisgICAgICogVGhpcyB2YWx1ZSBjb250cm9scyBhZGRpdGlvbmFsIGNsYW1waW5nIG9uIHRoZSBtYXhpbXVtIHNpemUgb2YgYQorICAgICAqIGtleWZyYW1lLiBJdCBpcyBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBhdmVyYWdlCisgICAgICogcGVyLWZyYW1lIGJpdHJhdGUsIHdpdGggdGhlIHNwZWNpYWwgKGFuZCBkZWZhdWx0KSB2YWx1ZSAwIG1lYW5pbmcKKyAgICAgKiB1bmxpbWl0ZWQsIG9yIG5vIGFkZGl0aW9uYWwgY2xhbXBpbmcgYmV5b25kIHRoZSBjb2RlYydzIGJ1aWx0LWluCisgICAgICogYWxnb3JpdGhtLgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFsbG9jYXRlIG5vIG1vcmUgdGhhbiA0LjUgZnJhbWVzIHdvcnRoIG9mIGJpdHJhdGUKKyAgICAgKiB0byBhIGtleWZyYW1lLCBzZXQgdGhpcyB0byA0NTAuCisgICAgICoKKyAgICAgKi8KKyAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QKK307CisKKy8qIVxicmllZiB2cHggMS1EIHNjYWxpbmcgbW9kZQorICoKKyAqIFRoaXMgc2V0IG9mIGNvbnN0YW50cyBkZWZpbmUgMS1EIHZweCBzY2FsaW5nIG1vZGVzCisgKi8KK3R5cGVkZWYgZW51bSB2cHhfc2NhbGluZ19tb2RlXzFkCit7CisgICAgVlA4RV9OT1JNQUwgICAgICA9IDAsCisgICAgVlA4RV9GT1VSRklWRSAgICA9IDEsCisgICAgVlA4RV9USFJFRUZJVkUgICA9IDIsCisgICAgVlA4RV9PTkVUV08gICAgICA9IDMKK30gVlBYX1NDQUxJTkdfTU9ERTsKKworCisvKiFcYnJpZWYgIHZweCByZWdpb24gb2YgaW50ZXJlc3QgbWFwCisgKgorICogVGhlc2UgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgcmVnaW9uIG9mIGludGVyZXN0IG1hcAorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB2cHhfcm9pX21hcAoreworICAgIHVuc2lnbmVkIGNoYXIgKnJvaV9tYXA7ICAgICAgLyoqPCBzcGVjaWZ5IGFuIGlkIGJldHdlZW4gMCBhbmQgMyBmb3IgZWFjaCAxNngxNiByZWdpb24gd2l0aGluIGEgZnJhbWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgICByb3dzOyAgICAgICAgIC8qKjwgbnVtYmVyIG9mIHJvd3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjb2xzOyAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGNvbHMgKi8KKyAgICBpbnQgICAgIGRlbHRhX3FbNF07ICAgICAgICAgIC8qKjwgcXVhbnRpemVyIGRlbHRhIFstNjMsIDYzXSBvZmYgYmFzZWxpbmUgZm9yIHJlZ2lvbnMgd2l0aCBpZCBiZXR3ZWVuIDAgYW5kIDMqLworICAgIGludCAgICAgZGVsdGFfbGZbNF07ICAgICAgICAgLyoqPCBsb29wIGZpbHRlciBzdHJlbmd0aCBkZWx0YSBbLTYzLCA2M10gZm9yIHJlZ2lvbnMgd2l0aCBpZCBiZXR3ZWVuIDAgYW5kIDMgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBzdGF0aWNfdGhyZXNob2xkWzRdOy8qKjwgdGhyZXNob2xkIGZvciByZWdpb24gdG8gYmUgdHJlYXRlZCBhcyBzdGF0aWMgKi8KK30gdnB4X3JvaV9tYXBfdDsKKworLyohXGJyaWVmICB2cHggYWN0aXZlIHJlZ2lvbiBtYXAKKyAqCisgKiBUaGVzZSBkZWZpbmVzIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGFjdGl2ZSByZWdpb24gbWFwCisgKgorICovCisKKwordHlwZWRlZiBzdHJ1Y3QgdnB4X2FjdGl2ZV9tYXAKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAqYWN0aXZlX21hcDsgLyoqPCBzcGVjaWZ5IGFuIG9uICgxKSBvciBvZmYgKDApIGVhY2ggMTZ4MTYgcmVnaW9uIHdpdGhpbiBhIGZyYW1lICovCisgICAgdW5zaWduZWQgaW50ICAgIHJvd3M7ICAgICAgIC8qKjwgbnVtYmVyIG9mIHJvd3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgY29sczsgICAgICAgLyoqPCBudW1iZXIgb2YgY29scyAqLworfSB2cHhfYWN0aXZlX21hcF90OworCisvKiFcYnJpZWYgIHZweCBpbWFnZSBzY2FsaW5nIG1vZGUKKyAqCisgKiBUaGlzIGRlZmluZXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBpbWFnZSBzY2FsaW5nIG1vZGUKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IHZweF9zY2FsaW5nX21vZGUKK3sKKyAgICBWUFhfU0NBTElOR19NT0RFICAgIGhfc2NhbGluZ19tb2RlOyAgLyoqPCBob3Jpem9udGFsIHNjYWxpbmcgbW9kZSAqLworICAgIFZQWF9TQ0FMSU5HX01PREUgICAgdl9zY2FsaW5nX21vZGU7ICAvKio8IHZlcnRpY2FsIHNjYWxpbmcgbW9kZSAgICovCit9IHZweF9zY2FsaW5nX21vZGVfdDsKKworLyohXGJyaWVmIFZQOCB0b2tlbiBwYXJ0aXRpb24gbW9kZQorICoKKyAqIFRoaXMgZGVmaW5lcyBWUDggcGFydGl0aW9uaW5nIG1vZGUgZm9yIGNvbXByZXNzZWQgZGF0YSwgaS5lLiwgdGhlIG51bWJlciBvZgorICogc3ViLXN0cmVhbXMgaW4gdGhlIGJpdHN0cmVhbS7CoFVzZWQgZm9yIHBhcmFsbGVsaXplZCBkZWNvZGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBlbnVtCit7CisgICAgVlA4X09ORV9UT0tFTlBBUlRJVElPTiAgID0gMCwKKyAgICBWUDhfVFdPX1RPS0VOUEFSVElUSU9OICAgPSAxLAorICAgIFZQOF9GT1VSX1RPS0VOUEFSVElUSU9OICA9IDIsCisgICAgVlA4X0VJR0hUX1RPS0VOUEFSVElUSU9OID0gMworfSB2cDhlX3Rva2VuX3BhcnRpdGlvbnM7CisKKworLyohXGJyaWVmIFZQOCBtb2RlbCB0dW5pbmcgcGFyYW1ldGVycworICoKKyAqIENoYW5nZXMgdGhlIGVuY29kZXIgdG8gdHVuZSBmb3IgY2VydGFpbiB0eXBlcyBvZiBpbnB1dCBtYXRlcmlhbC4KKyAqCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIFZQOF9UVU5FX1BTTlIsCisgICAgVlA4X1RVTkVfU1NJTQorfSB2cDhlX3R1bmluZzsKKworCisvKiFcYnJpZWYgVlA4IGVuY29kZXIgY29udHJvbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZQorICoKKyAqIERlZmluZXMgdGhlIGRhdGEgdHlwZXMgdGhhdCBWUDhFIGNvbnRyb2wgZnVuY3Rpb25zIHRha2UuIE5vdGUgdGhhdAorICogYWRkaXRpb25hbCBjb21tb24gY29udHJvbHMgYXJlIGRlZmluZWQgaW4gdnA4LmgKKyAqCisgKi8KKworCisvKiBUaGVzZSBjb250cm9scyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgZmxhZ3MgcGFyYW1ldGVyIHRvCisgKiB2cHhfY29kZWNfZW5jb2RlKCkuIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBWUDhfRUZMQUdfKiBhYm92ZS4KKyAqLworVlBYX0NUUkxfVVNFX1RZUEVfREVQUkVDQVRFRChWUDhFX1VQRF9FTlRST1BZLCAgICAgICAgICAgIGludCkKK1ZQWF9DVFJMX1VTRV9UWVBFX0RFUFJFQ0FURUQoVlA4RV9VUERfUkVGRVJFTkNFLCAgICAgICAgICBpbnQpCitWUFhfQ1RSTF9VU0VfVFlQRV9ERVBSRUNBVEVEKFZQOEVfVVNFX1JFRkVSRU5DRSwgICAgICAgICAgaW50KQorCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9ST0lfTUFQLCAgICAgICAgICAgIHZweF9yb2lfbWFwX3QgKikKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX0FDVElWRU1BUCwgICAgICAgICAgdnB4X2FjdGl2ZV9tYXBfdCAqKQorVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfU0NBTEVNT0RFLCAgICAgICAgICB2cHhfc2NhbGluZ19tb2RlX3QgKikKKworVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfQ1BVVVNFRCwgICAgICAgICAgICBpbnQpCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLCAgIHVuc2lnbmVkIGludCkKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZLCAgdW5zaWduZWQgaW50KQorVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfU0hBUlBORVNTLCAgICAgICAgICB1bnNpZ25lZCBpbnQpCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELCAgIHVuc2lnbmVkIGludCkKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsICAgaW50KSAvKiB2cDhlX3Rva2VuX3BhcnRpdGlvbnMgKi8KKworVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsICAgICB1bnNpZ25lZCBpbnQpCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9BUk5SX1NUUkVOR1RIICwgICAgIHVuc2lnbmVkIGludCkKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX0FSTlJfVFlQRSAgICAgLCAgICAgdW5zaWduZWQgaW50KQorVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfVFVOSU5HLCAgICAgICAgICAgICBpbnQpIC8qIHZwOGVfdHVuaW5nICovCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9DUV9MRVZFTCAgICAgLCAgICAgIHVuc2lnbmVkIGludCkKKworVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9HRVRfTEFTVF9RVUFOVElaRVIsICAgICBpbnQgKikKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSXzY0LCAgaW50ICopCisKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwgdW5zaWduZWQgaW50KQorCisKKy8qISBAfSAtIGVuZCBkZWZncm91cCB2cDhfZW5jb2RlciAqLworI2luY2x1ZGUgInZweF9jb2RlY19pbXBsX2JvdHRvbS5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4L3ZwOGR4LmggYi9saWJ2cHgvdnB4L3ZwOGR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2MTAzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHgvdnA4ZHguaApAQCAtMCwwICsxLDgzIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2luY2x1ZGUgInZwOC5oIgorCisvKiFcZGVmZ3JvdXAgdnA4X2RlY29kZXIgV2ViTSBWUDggRGVjb2RlcgorICogXGluZ3JvdXAgdnA4CisgKgorICogQHsKKyAqLworLyohXGZpbGUKKyAqIFxicmllZiBQcm92aWRlcyBkZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlIFZQOCBhbGdvcml0aG0gd2l0aGluIHRoZSB2cHggRGVjb2RlcgorICogICAgICAgIGludGVyZmFjZS4KKyAqLworI2lmbmRlZiBWUDhEWF9ICisjZGVmaW5lIFZQOERYX0gKKyNpbmNsdWRlICJ2cHhfY29kZWNfaW1wbF90b3AuaCIKKworLyohXG5hbWUgQWxnb3JpdGhtIGludGVyZmFjZSBmb3IgVlA4CisgKgorICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgdG8gZGVjb2RlIHJhdyBWUDggc3RyZWFtcywgYXMgd291bGQKKyAqIGJlIGZvdW5kIGluIEFWSSBmaWxlcyBhbmQgb3RoZXIgbm9uLUZsYXNoIHVzZXMuCisgKiBAeworICovCitleHRlcm4gdnB4X2NvZGVjX2lmYWNlX3QgIHZweF9jb2RlY192cDhfZHhfYWxnbzsKK2V4dGVybiB2cHhfY29kZWNfaWZhY2VfdCogdnB4X2NvZGVjX3ZwOF9keCh2b2lkKTsKKy8qIUB9IC0gZW5kIGFsZ29yaXRobSBpbnRlcmZhY2UgbWVtYmVyIGdyb3VwKi8KKworLyogSW5jbHVkZSBjb250cm9scyBjb21tb24gdG8gYm90aCB0aGUgZW5jb2RlciBhbmQgZGVjb2RlciAqLworI2luY2x1ZGUgInZwOC5oIgorCisKKy8qIVxicmllZiBWUDggZGVjb2RlciBjb250cm9sIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgc2V0IG9mIG1hY3JvcyBkZWZpbmUgdGhlIGNvbnRyb2wgZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3IgdGhlIFZQOAorICogZGVjb2RlciBpbnRlcmZhY2UuCisgKgorICogXHNhICN2cHhfY29kZWNfY29udHJvbAorICovCitlbnVtIHZwOF9kZWNfY29udHJvbF9pZAoreworICAgIC8qKiBjb250cm9sIGZ1bmN0aW9uIHRvIGdldCBpbmZvIG9uIHdoaWNoIHJlZmVyZW5jZSBmcmFtZXMgd2VyZSB1cGRhdGVkCisgICAgICogIGJ5IHRoZSBsYXN0IGRlY29kZQorICAgICAqLworICAgIFZQOERfR0VUX0xBU1RfUkVGX1VQREFURVMgPSBWUDhfREVDT0RFUl9DVFJMX0lEX1NUQVJULAorCisgICAgLyoqIGNoZWNrIGlmIHRoZSBpbmRpY2F0ZWQgZnJhbWUgaXMgY29ycnVwdGVkICovCisgICAgVlA4RF9HRVRfRlJBTUVfQ09SUlVQVEVELAorCisgICAgLyoqIGNvbnRyb2wgZnVuY3Rpb24gdG8gZ2V0IGluZm8gb24gd2hpY2ggcmVmZXJlbmNlIGZyYW1lcyB3ZXJlIHVzZWQKKyAgICAgKiAgYnkgdGhlIGxhc3QgZGVjb2RlCisgICAgICovCisgICAgVlA4RF9HRVRfTEFTVF9SRUZfVVNFRCwKKworICAgIFZQOF9ERUNPREVSX0NUUkxfSURfTUFYCit9IDsKKworCisvKiFcYnJpZWYgVlA4IGRlY29kZXIgY29udHJvbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZQorICoKKyAqIERlZmluZXMgdGhlIGRhdGEgdHlwZXMgdGhhdCBWUDhEIGNvbnRyb2wgZnVuY3Rpb25zIHRha2UuIE5vdGUgdGhhdAorICogYWRkaXRpb25hbCBjb21tb24gY29udHJvbHMgYXJlIGRlZmluZWQgaW4gdnA4LmgKKyAqCisgKi8KKworCitWUFhfQ1RSTF9VU0VfVFlQRShWUDhEX0dFVF9MQVNUX1JFRl9VUERBVEVTLCAgIGludCAqKQorVlBYX0NUUkxfVVNFX1RZUEUoVlA4RF9HRVRfRlJBTUVfQ09SUlVQVEVELCAgICBpbnQgKikKK1ZQWF9DVFJMX1VTRV9UWVBFKFZQOERfR0VUX0xBU1RfUkVGX1VTRUQsICAgICAgaW50ICopCisKKy8qISBAfSAtIGVuZCBkZWZncm91cCB2cDhfZGVjb2RlciAqLworCisKKyNpbmNsdWRlICJ2cHhfY29kZWNfaW1wbF9ib3R0b20uaCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdnB4L3ZweF9jb2RlYy5oIGIvbGlidnB4L3ZweC92cHhfY29kZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4L3ZweF9jb2RlYy5oCnJlbmFtZSB0byBsaWJ2cHgvdnB4L3ZweF9jb2RlYy5oCmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4L3ZweF9jb2RlYy5tayBiL2xpYnZweC92cHgvdnB4X2NvZGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTEyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4L3ZweF9jb2RlYy5tawpAQCAtMCwwICsxLDQxIEBACisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworCitBUElfRVhQT1JUUyArPSBleHBvcnRzCisKK0FQSV9TUkNTLSQoQ09ORklHX1ZQOF9FTkNPREVSKSArPSB2cDguaAorQVBJX1NSQ1MtJChDT05GSUdfVlA4X0VOQ09ERVIpICs9IHZwOGN4LmgKK0FQSV9ET0NfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gdnA4LmgKK0FQSV9ET0NfU1JDUy0kKENPTkZJR19WUDhfRU5DT0RFUikgKz0gdnA4Y3guaAorCitBUElfU1JDUy0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gdnA4LmgKK0FQSV9TUkNTLSQoQ09ORklHX1ZQOF9ERUNPREVSKSArPSB2cDhkeC5oCitBUElfRE9DX1NSQ1MtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwOC5oCitBUElfRE9DX1NSQ1MtJChDT05GSUdfVlA4X0RFQ09ERVIpICs9IHZwOGR4LmgKKworQVBJX0RPQ19TUkNTLXllcyArPSB2cHhfY29kZWMuaAorQVBJX0RPQ19TUkNTLXllcyArPSB2cHhfZGVjb2Rlci5oCitBUElfRE9DX1NSQ1MteWVzICs9IHZweF9lbmNvZGVyLmgKK0FQSV9ET0NfU1JDUy15ZXMgKz0gdnB4X2ltYWdlLmgKKworQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHNyYy92cHhfZGVjb2Rlci5jCitBUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gdnB4X2RlY29kZXIuaAorQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHNyYy92cHhfZW5jb2Rlci5jCitBUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gdnB4X2VuY29kZXIuaAorQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IGludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oCitBUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gc3JjL3ZweF9jb2RlYy5jCitBUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gc3JjL3ZweF9pbWFnZS5jCitBUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gdnB4X2NvZGVjLmgKK0FQSV9TUkNTLXllcyAgICAgICAgICAgICAgICArPSB2cHhfY29kZWMubWsKK0FQSV9TUkNTLXllcyAgICAgICAgICAgICAgICArPSB2cHhfY29kZWNfaW1wbF9ib3R0b20uaAorQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHZweF9jb2RlY19pbXBsX3RvcC5oCitBUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gdnB4X2ltYWdlLmgKK0FQSV9TUkNTLSQoQlVJTERfTElCVlBYKSAgICArPSB2cHhfaW50ZWdlci5oCmRpZmYgLS1naXQgYS92cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmggYi9saWJ2cHgvdnB4L3ZweF9jb2RlY19pbXBsX2JvdHRvbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgKcmVuYW1lIHRvIGxpYnZweC92cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgKZGlmZiAtLWdpdCBhL3ZweC92cHhfY29kZWNfaW1wbF90b3AuaCBiL2xpYnZweC92cHgvdnB4X2NvZGVjX2ltcGxfdG9wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweC92cHhfY29kZWNfaW1wbF90b3AuaApyZW5hbWUgdG8gbGlidnB4L3ZweC92cHhfY29kZWNfaW1wbF90b3AuaApkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC92cHhfZGVjb2Rlci5oIGIvbGlidnB4L3ZweC92cHhfZGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2YxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4L3ZweF9kZWNvZGVyLmgKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiFcZGVmZ3JvdXAgZGVjb2RlciBEZWNvZGVyIEFsZ29yaXRobSBJbnRlcmZhY2UKKyAqIFxpbmdyb3VwIGNvZGVjCisgKiBUaGlzIGFic3RyYWN0aW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBkZWNvZGVyIHRvIGVhc2lseSBzdXBwb3J0CisgKiBtdWx0aXBsZSB2aWRlbyBmb3JtYXRzIHdpdGggbWluaW1hbCBjb2RlIGR1cGxpY2F0aW9uLiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzCisgKiB0aGUgaW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgZGVjb2RlcnMuCisgKiBAeworICovCisKKy8qIVxmaWxlCisgKiBcYnJpZWYgRGVzY3JpYmVzIHRoZSBkZWNvZGVyIGFsZ29yaXRobSBpbnRlcmZhY2UgdG8gYXBwbGljYXRpb25zLgorICoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGFuIGFwcGxpY2F0aW9uIGFuZCBhCisgKiB2aWRlbyBkZWNvZGVyIGFsZ29yaXRobS4KKyAqCisgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBWUFhfREVDT0RFUl9ICisjZGVmaW5lIFZQWF9ERUNPREVSX0gKKyNpbmNsdWRlICJ2cHhfY29kZWMuaCIKKworICAgIC8qIVxicmllZiBDdXJyZW50IEFCSSB2ZXJzaW9uIG51bWJlcgorICAgICAqCisgICAgICogXGludGVybmFsCisgICAgICogSWYgdGhpcyBmaWxlIGlzIGFsdGVyZWQgaW4gYW55IHdheSB0aGF0IGNoYW5nZXMgdGhlIEFCSSwgdGhpcyB2YWx1ZQorICAgICAqIG11c3QgYmUgYnVtcGVkLiAgRXhhbXBsZXMgaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgY2hhbmdpbmcKKyAgICAgKiB0eXBlcywgcmVtb3Zpbmcgb3IgcmVhc3NpZ25pbmcgZW51bXMsIGFkZGluZy9yZW1vdmluZy9yZWFycmFuZ2luZworICAgICAqIGZpZWxkcyB0byBzdHJ1Y3R1cmVzCisgICAgICovCisjZGVmaW5lIFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OICgyICsgVlBYX0NPREVDX0FCSV9WRVJTSU9OKSAvKio8XGhpZGVpbml0aWFsaXplciovCisKKyAgICAvKiEgXGJyaWVmIERlY29kZXIgY2FwYWJpbGl0aWVzIGJpdGZpZWxkCisgICAgICoKKyAgICAgKiAgRWFjaCBkZWNvZGVyIGFkdmVydGlzZXMgdGhlIGNhcGFiaWxpdGllcyBpdCBzdXBwb3J0cyBhcyBwYXJ0IG9mIGl0cworICAgICAqICA6OnZweF9jb2RlY19pZmFjZV90IGludGVyZmFjZSBzdHJ1Y3R1cmUuIENhcGFiaWxpdGllcyBhcmUgZXh0cmEgaW50ZXJmYWNlcworICAgICAqICBvciBmdW5jdGlvbmFsaXR5LCBhbmQgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYSBkZWNvZGVyLgorICAgICAqCisgICAgICogIFRoZSBhdmFpbGFibGUgZmxhZ3MgYXJlIHNwZWNpZmllZCBieSBWUFhfQ09ERUNfQ0FQXyogZGVmaW5lcy4KKyAgICAgKi8KKyNkZWZpbmUgVlBYX0NPREVDX0NBUF9QVVRfU0xJQ0UgIDB4MTAwMDAgLyoqPCBXaWxsIGlzc3VlIHB1dF9zbGljZSBjYWxsYmFja3MgKi8KKyNkZWZpbmUgVlBYX0NPREVDX0NBUF9QVVRfRlJBTUUgIDB4MjAwMDAgLyoqPCBXaWxsIGlzc3VlIHB1dF9mcmFtZSBjYWxsYmFja3MgKi8KKyNkZWZpbmUgVlBYX0NPREVDX0NBUF9QT1NUUFJPQyAgIDB4NDAwMDAgLyoqPCBDYW4gcG9zdHByb2Nlc3MgZGVjb2RlZCBmcmFtZSAqLworI2RlZmluZSBWUFhfQ09ERUNfQ0FQX0VSUk9SX0NPTkNFQUxNRU5UICAgMHg4MDAwMCAvKio8IENhbiBjb25jZWFsIGVycm9ycyBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgbG9zcyAqLworI2RlZmluZSBWUFhfQ09ERUNfQ0FQX0lOUFVUX0ZSQUdNRU5UUyAgIDB4MTAwMDAwIC8qKjwgQ2FuIHJlY2VpdmUgZW5jb2RlZCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgZnJhZ21lbnQgYXQgYSB0aW1lICovCisKKyAgICAvKiEgXGJyaWVmIEluaXRpYWxpemF0aW9uLXRpbWUgRmVhdHVyZSBFbmFibGluZworICAgICAqCisgICAgICogIENlcnRhaW4gY29kZWMgZmVhdHVyZXMgbXVzdCBiZSBrbm93biBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCB0byBhbGxvdyBmb3IKKyAgICAgKiAgcHJvcGVyIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogIFRoZSBhdmFpbGFibGUgZmxhZ3MgYXJlIHNwZWNpZmllZCBieSBWUFhfQ09ERUNfVVNFXyogZGVmaW5lcy4KKyAgICAgKi8KKyNkZWZpbmUgVlBYX0NPREVDX1VTRV9QT1NUUFJPQyAgIDB4MTAwMDAgLyoqPCBQb3N0cHJvY2VzcyBkZWNvZGVkIGZyYW1lICovCisjZGVmaW5lIFZQWF9DT0RFQ19VU0VfRVJST1JfQ09OQ0VBTE1FTlQgMHgyMDAwMCAvKio8IENvbmNlYWwgZXJyb3JzIGluIGRlY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzICovCisjZGVmaW5lIFZQWF9DT0RFQ19VU0VfSU5QVVRfRlJBR01FTlRTICAgMHg0MDAwMCAvKio8IFRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIGRlY29kZXIgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgYXQgYSB0aW1lICovCisKKyAgICAvKiFcYnJpZWYgU3RyZWFtIHByb3BlcnRpZXMKKyAgICAgKgorICAgICAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcXVlcnkgb3Igc2V0IHByb3BlcnRpZXMgb2YgdGhlIGRlY29kZWQKKyAgICAgKiBzdHJlYW0uIEFsZ29yaXRobXMgbWF5IGV4dGVuZCB0aGlzIHN0cnVjdHVyZSB3aXRoIGRhdGEgc3BlY2lmaWMKKyAgICAgKiB0byB0aGVpciBiaXRzdHJlYW0gYnkgc2V0dGluZyB0aGUgc3ogbWVtYmVyIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX3N0cmVhbV9pbmZvCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgc3o7ICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHc7ICAgICAgLyoqPCBXaWR0aCAob3IgMCBmb3IgdW5rbm93bi9kZWZhdWx0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgaDsgICAgICAvKio8IEhlaWdodCAob3IgMCBmb3IgdW5rbm93bi9kZWZhdWx0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgaXNfa2Y7ICAvKio8IEN1cnJlbnQgZnJhbWUgaXMgYSBrZXlmcmFtZSAqLworICAgIH0gdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3Q7CisKKyAgICAvKiBSRVFVSVJFRCBGVU5DVElPTlMKKyAgICAgKgorICAgICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIGRlY29kZXJzLgorICAgICAqIFRoZXkgcmVwcmVzZW50IHRoZSBiYXNlIGNhc2UgZnVuY3Rpb25hbGl0eSBleHBlY3RlZCBvZiBhbGwgZGVjb2RlcnMuCisgICAgICovCisKKworICAgIC8qIVxicmllZiBJbml0aWFsaXphdGlvbiBDb25maWd1cmF0aW9ucworICAgICAqCisgICAgICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGluaXQgdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlCisgICAgICogZGVjb2Rlci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCB2cHhfY29kZWNfZGVjX2NmZworICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHRocmVhZHM7IC8qKjwgTWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UsIGRlZmF1bHQgMSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdzsgICAgICAvKio8IFdpZHRoICovCisgICAgICAgIHVuc2lnbmVkIGludCBoOyAgICAgIC8qKjwgSGVpZ2h0ICovCisgICAgfSB2cHhfY29kZWNfZGVjX2NmZ190OyAvKio8IGFsaWFzIGZvciBzdHJ1Y3QgdnB4X2NvZGVjX2RlY19jZmcgKi8KKworCisgICAgLyohXGJyaWVmIEluaXRpYWxpemUgYSBkZWNvZGVyIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBJbml0aWFsaXplcyBhIGRlY29kZXIgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gaW50ZXJmYWNlLiBBcHBsaWNhdGlvbnMKKyAgICAgKiBzaG91bGQgY2FsbCB0aGUgdnB4X2NvZGVjX2RlY19pbml0IGNvbnZlbmllbmNlIG1hY3JvIGluc3RlYWQgb2YgdGhpcworICAgICAqIGZ1bmN0aW9uIGRpcmVjdGx5LCB0byBlbnN1cmUgdGhhdCB0aGUgQUJJIHZlcnNpb24gbnVtYmVyIHBhcmFtZXRlcgorICAgICAqIGlzIHByb3Blcmx5IGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogSWYgdGhlIGxpYnJhcnkgd2FzIGNvbmZpZ3VyZWQgd2l0aCAtLWRpc2FibGUtbXVsdGl0aHJlYWQsIHRoaXMgY2FsbAorICAgICAqIGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgc2hvdWxkIGJlIGd1YXJkZWQgd2l0aCBhIGxvY2sgaWYgYmVpbmcgdXNlZAorICAgICAqIGluIGEgbXVsdGl0aHJlYWRlZCBjb250ZXh0LgorICAgICAqCisgICAgICogSW4gWE1BIG1vZGUgKGFjdGl2YXRlZCBieSBzZXR0aW5nIFZQWF9DT0RFQ19VU0VfWE1BIGluIHRoZSBmbGFncworICAgICAqIHBhcmFtZXRlciksIHRoZSBzdG9yYWdlIHBvaW50ZWQgdG8gYnkgdGhlIGNmZyBwYXJhbWV0ZXIgbXVzdCBiZQorICAgICAqIGtlcHQgcmVhZGFibGUgYW5kIHN0YWJsZSB1bnRpbCBhbGwgbWVtb3J5IG1hcHMgaGF2ZSBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgY3R4ICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0LgorICAgICAqIFxwYXJhbVtpbl0gICAgaWZhY2UgICBQb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlIHRvIHVzZS4KKyAgICAgKiBccGFyYW1baW5dICAgIGNmZyAgICAgQ29uZmlndXJhdGlvbiB0byB1c2UsIGlmIGtub3duLiBNYXkgYmUgTlVMTC4KKyAgICAgKiBccGFyYW1baW5dICAgIGZsYWdzICAgQml0ZmllbGQgb2YgVlBYX0NPREVDX1VTRV8qIGZsYWdzCisgICAgICogXHBhcmFtW2luXSAgICB2ZXIgICAgIEFCSSB2ZXJzaW9uIG51bWJlci4gTXVzdCBiZSBzZXQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVlBYX0RFQ09ERVJfQUJJX1ZFUlNJT04KKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKKyAgICAgKiAgICAgVGhlIGRlY29kZXIgYWxnb3JpdGhtIGluaXRpYWxpemVkLgorICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19NRU1fRVJST1IKKyAgICAgKiAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLgorICAgICAqLworICAgIHZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZGVjX2luaXRfdmVyKHZweF9jb2RlY19jdHhfdCAgICAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2lmYWNlX3QgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2ZsYWdzX3QgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB2ZXIpOworCisgICAgLyohXGJyaWVmIENvbnZlbmllbmNlIG1hY3JvIGZvciB2cHhfY29kZWNfZGVjX2luaXRfdmVyKCkKKyAgICAgKgorICAgICAqIEVuc3VyZXMgdGhlIEFCSSB2ZXJzaW9uIHBhcmFtZXRlciBpcyBwcm9wZXJseSBzZXQuCisgICAgICovCisjZGVmaW5lIHZweF9jb2RlY19kZWNfaW5pdChjdHgsIGlmYWNlLCBjZmcsIGZsYWdzKSBcCisgICAgdnB4X2NvZGVjX2RlY19pbml0X3ZlcihjdHgsIGlmYWNlLCBjZmcsIGZsYWdzLCBWUFhfREVDT0RFUl9BQklfVkVSU0lPTikKKworCisgICAgLyohXGJyaWVmIFBhcnNlIHN0cmVhbSBpbmZvIGZyb20gYSBidWZmZXIKKyAgICAgKgorICAgICAqIFBlcmZvcm1zIGhpZ2ggbGV2ZWwgcGFyc2luZyBvZiB0aGUgYml0c3RyZWFtLiBDb25zdHJ1Y3Rpb24gb2YgYSBkZWNvZGVyCisgICAgICogY29udGV4dCBpcyBub3QgbmVjZXNzYXJ5LiBDYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGJpdHN0cmVhbSBpcworICAgICAqIG9mIHRoZSBwcm9wZXIgZm9ybWF0LCBhbmQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgICAgaWZhY2UgICBQb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlCisgICAgICogXHBhcmFtW2luXSAgICAgIGRhdGEgICAgUG9pbnRlciB0byBhIGJsb2NrIG9mIGRhdGEgdG8gcGFyc2UKKyAgICAgKiBccGFyYW1baW5dICAgICAgZGF0YV9zeiBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICAgICAqIFxwYXJhbVtpbixvdXRdICBzaSAgICAgIFBvaW50ZXIgdG8gc3RyZWFtIGluZm8gdG8gdXBkYXRlLiBUaGUgc2l6ZSBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBccmVmIE1VU1QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIGJ1dCBccmVmIE1BWSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZCBieSB0aGUgYWxnb3JpdGhtLiBUaGlzIHBhcmFtZXRlciBccmVmIE1BWQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIE5VTEwuCisgICAgICoKKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKKyAgICAgKiAgICAgQml0c3RyZWFtIGlzIHBhcnNhYmxlIGFuZCBzdHJlYW0gaW5mb3JtYXRpb24gdXBkYXRlZAorICAgICAqLworICAgIHZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyh2cHhfY29kZWNfaWZhY2VfdCAgICAgICAqaWZhY2UsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBkYXRhX3N6LAorICAgICAgICAgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKnNpKTsKKworCisgICAgLyohXGJyaWVmIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAorICAgICAqIFxwYXJhbVtpbixvdXRdICBzaSAgICAgIFBvaW50ZXIgdG8gc3RyZWFtIGluZm8gdG8gdXBkYXRlLiBUaGUgc2l6ZSBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBccmVmIE1VU1QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIGJ1dCBccmVmIE1BWSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZCBieSB0aGUgYWxnb3JpdGhtLiBUaGlzIHBhcmFtZXRlciBccmVmIE1BWQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIE5VTEwuCisgICAgICoKKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKKyAgICAgKiAgICAgQml0c3RyZWFtIGlzIHBhcnNhYmxlIGFuZCBzdHJlYW0gaW5mb3JtYXRpb24gdXBkYXRlZAorICAgICAqLworICAgIHZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZ2V0X3N0cmVhbV9pbmZvKHZweF9jb2RlY19jdHhfdCAgICAgICAgICpjdHgsCisgICAgICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpOworCisKKyAgICAvKiFcYnJpZWYgRGVjb2RlIGRhdGEKKyAgICAgKgorICAgICAqIFByb2Nlc3NlcyBhIGJ1ZmZlciBvZiBjb2RlZCBkYXRhLiBJZiB0aGUgcHJvY2Vzc2luZyByZXN1bHRzIGluIGEgbmV3CisgICAgICogZGVjb2RlZCBmcmFtZSBiZWNvbWluZyBhdmFpbGFibGUsIFBVVF9TTElDRSBhbmQgUFVUX0ZSQU1FIGV2ZW50cyBtYXkgYmUKKyAgICAgKiBnZW5lcmF0ZWQsIGFzIGFwcHJvcHJpYXRlLiBFbmNvZGVkIGRhdGEgXHJlZiBNVVNUIGJlIHBhc3NlZCBpbiBEVFMgKGRlY29kZQorICAgICAqIHRpbWUgc3RhbXApIG9yZGVyLiBGcmFtZXMgcHJvZHVjZWQgd2lsbCBhbHdheXMgYmUgaW4gUFRTIChwcmVzZW50YXRpb24KKyAgICAgKiB0aW1lIHN0YW1wKSBvcmRlci4KKyAgICAgKiBJZiB0aGUgZGVjb2RlciBpcyBjb25maWd1cmVkIHdpdGggVlBYX0NPREVDX1VTRV9JTlBVVF9GUkFHTUVOVFMgZW5hYmxlZCwKKyAgICAgKiBkYXRhIGFuZCBkYXRhX3N6IGNhbiBjb250YWluIGEgZnJhZ21lbnQgb2YgdGhlIGVuY29kZWQgZnJhbWUuIEZyYWdtZW50CisgICAgICogXCNuIG11c3QgY29udGFpbiBhdCBsZWFzdCBwYXJ0aXRpb24gXCNuLCBidXQgY2FuIGFsc28gY29udGFpbiBzdWJzZXF1ZW50CisgICAgICogcGFydGl0aW9ucyAoXCNuKzEgLSBcI24raSksIGFuZCBpZiBzbywgZnJhZ21lbnRzIFwjbisxLCAuLiwgXCNuK2kgbXVzdAorICAgICAqIGJlIGVtcHR5LiBXaGVuIG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAorICAgICAqIHdpdGggTlVMTCBhcyBkYXRhIGFuZCAwIGFzIGRhdGFfc3ouIFRoZSBtZW1vcnkgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KKyAgICAgKiBtdXN0IGJlIGF2YWlsYWJsZSB1bnRpbCB0aGUgZnJhbWUgaGFzIGJlZW4gZGVjb2RlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gY3R4ICAgICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW5dIGRhdGEgICAgICAgICBQb2ludGVyIHRvIHRoaXMgYmxvY2sgb2YgbmV3IGNvZGVkIGRhdGEuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgYSBWUFhfQ09ERUNfQ0JfUFVUX0ZSQU1FIGV2ZW50IGlzIHBvc3RlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcHJldmlvdXNseSBkZWNvZGVkIGZyYW1lLgorICAgICAqIFxwYXJhbVtpbl0gZGF0YV9zeiAgICAgIFNpemUgb2YgdGhlIGNvZGVkIGRhdGEsIGluIGJ5dGVzLgorICAgICAqIFxwYXJhbVtpbl0gdXNlcl9wcml2ICAgIEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgdG8gYXNzb2NpYXRlIHdpdGgKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZyYW1lLgorICAgICAqIFxwYXJhbVtpbl0gZGVhZGxpbmUgICAgIFNvZnQgZGVhZGxpbmUgdGhlIGRlY29kZXIgc2hvdWxkIGF0dGVtcHQgdG8gbWVldCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbiB1cy4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gUmV0dXJucyAjVlBYX0NPREVDX09LIGlmIHRoZSBjb2RlZCBkYXRhIHdhcyBwcm9jZXNzZWQgY29tcGxldGVseQorICAgICAqICAgICAgICAgYW5kIGZ1dHVyZSBwaWN0dXJlcyBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IGVycm9yLiBPdGhlcndpc2UsCisgICAgICogICAgICAgICBzZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgb3RoZXIgZXJyb3IgY29kZXMgaW4gOjp2cHhfY29kZWNfZXJyX3QKKyAgICAgKiAgICAgICAgIGZvciByZWNvdmVyYWJpbGl0eSBjYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19kZWNvZGUodnB4X2NvZGVjX2N0eF90ICAgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgZGF0YV9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgIGRlYWRsaW5lKTsKKworCisgICAgLyohXGJyaWVmIERlY29kZWQgZnJhbWVzIGl0ZXJhdG9yCisgICAgICoKKyAgICAgKiBJdGVyYXRlcyBvdmVyIGEgbGlzdCBvZiB0aGUgZnJhbWVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheS4gVGhlIGl0ZXJhdG9yCisgICAgICogc3RvcmFnZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTCB0byBzdGFydCB0aGUgaXRlcmF0aW9uLiBJdGVyYXRpb24gaXMKKyAgICAgKiBjb21wbGV0ZSB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgorICAgICAqCisgICAgICogVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZyYW1lcyBiZWNvbWVzIHZhbGlkIHVwb24gY29tcGxldGlvbiBvZiB0aGUKKyAgICAgKiB2cHhfY29kZWNfZGVjb2RlIGNhbGwsIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdnB4X2NvZGVjX2RlY29kZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgIGN0eCAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW4sb3V0XSBpdGVyICAgICBJdGVyYXRvciBzdG9yYWdlLCBpbml0aWFsaXplZCB0byBOVUxMCisgICAgICoKKyAgICAgKiBccmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGFuIGltYWdlLCBpZiBvbmUgaXMgcmVhZHkgZm9yIGRpc3BsYXkuIEZyYW1lcworICAgICAqICAgICAgICAgcHJvZHVjZWQgd2lsbCBhbHdheXMgYmUgaW4gUFRTIChwcmVzZW50YXRpb24gdGltZSBzdGFtcCkgb3JkZXIuCisgICAgICovCisgICAgdnB4X2ltYWdlX3QgKnZweF9jb2RlY19nZXRfZnJhbWUodnB4X2NvZGVjX2N0eF90ICAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgKml0ZXIpOworCisKKyAgICAvKiFcZGVmZ3JvdXAgY2FwX3B1dF9mcmFtZSBGcmFtZS1CYXNlZCBEZWNvZGluZyBGdW5jdGlvbnMKKyAgICAgKgorICAgICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIGRlY29kZXJzCisgICAgICogdGhhdCBhZHZlcnRpc2UgdGhlIFZQWF9DT0RFQ19DQVBfUFVUX0ZSQU1FIGNhcGFiaWxpdHkuIENhbGxpbmcgdGhlc2UgZnVuY3Rpb25zCisgICAgICogZm9yIGNvZGVjcyB0aGF0IGRvbid0IGFkdmVydGlzZSB0aGlzIGNhcGFiaWxpdHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IKKyAgICAgKiBjb2RlIGJlaW5nIHJldHVybmVkLCB1c3VhbGx5IFZQWF9DT0RFQ19FUlJPUgorICAgICAqIEB7CisgICAgICovCisKKyAgICAvKiFcYnJpZWYgcHV0IGZyYW1lIGNhbGxiYWNrIHByb3RvdHlwZQorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IHRoZSBkZWNvZGVyIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gb2YKKyAgICAgKiB0aGUgYXZhaWxhYmlsaXR5IG9mIGRlY29kZWQgaW1hZ2UgZGF0YS4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHZvaWQgKCp2cHhfY29kZWNfcHV0X2ZyYW1lX2NiX2ZuX3QpKHZvaWQgICAgICAgICp1c2VyX3ByaXYsCisgICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCAqaW1nKTsKKworCisgICAgLyohXGJyaWVmIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2YgZnJhbWUgY29tcGxldGlvbi4KKyAgICAgKgorICAgICAqIFJlZ2lzdGVycyBhIGdpdmVuIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgZGVjb2RlZCBmcmFtZSBpcworICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gY3R4ICAgICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW5dIGNiICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAgICAqIFxwYXJhbVtpbl0gdXNlcl9wcml2ICAgIFVzZXIncyBwcml2YXRlIGRhdGEKKyAgICAgKgorICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19PSworICAgICAqICAgICBDYWxsYmFjayBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4KKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfRVJST1IKKyAgICAgKiAgICAgRGVjb2RlciBjb250ZXh0IG5vdCBpbml0aWFsaXplZCwgb3IgYWxnb3JpdGhtIG5vdCBjYXBhYmxlIG9mCisgICAgICogICAgIHBvc3Rpbmcgc2xpY2UgY29tcGxldGlvbi4KKyAgICAgKi8KKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3JlZ2lzdGVyX3B1dF9mcmFtZV9jYih2cHhfY29kZWNfY3R4X3QgICAgICAgICAgICAgKmN0eCwKKyAgICAgICAgICAgIHZweF9jb2RlY19wdXRfZnJhbWVfY2JfZm5fdCAgY2IsCisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdik7CisKKworICAgIC8qIUB9IC0gZW5kIGRlZmdyb3VwIGNhcF9wdXRfZnJhbWUgKi8KKworICAgIC8qIVxkZWZncm91cCBjYXBfcHV0X3NsaWNlIFNsaWNlLUJhc2VkIERlY29kaW5nIEZ1bmN0aW9ucworICAgICAqCisgICAgICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGJlIGltcGxlbWVudGVkIGZvciBhbGwgZGVjb2RlcnMKKyAgICAgKiB0aGF0IGFkdmVydGlzZSB0aGUgVlBYX0NPREVDX0NBUF9QVVRfU0xJQ0UgY2FwYWJpbGl0eS4gQ2FsbGluZyB0aGVzZSBmdW5jdGlvbnMKKyAgICAgKiBmb3IgY29kZWNzIHRoYXQgZG9uJ3QgYWR2ZXJ0aXNlIHRoaXMgY2FwYWJpbGl0eSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvcgorICAgICAqIGNvZGUgYmVpbmcgcmV0dXJuZWQsIHVzdWFsbHkgVlBYX0NPREVDX0VSUk9SCisgICAgICogQHsKKyAgICAgKi8KKworICAgIC8qIVxicmllZiBwdXQgc2xpY2UgY2FsbGJhY2sgcHJvdG90eXBlCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIGRlY29kZXIgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBvZgorICAgICAqIHRoZSBhdmFpbGFiaWxpdHkgb2YgcGFydGlhbGx5IGRlY29kZWQgaW1hZ2UgZGF0YS4gVGhlCisgICAgICovCisgICAgdHlwZWRlZiB2b2lkICgqdnB4X2NvZGVjX3B1dF9zbGljZV9jYl9mbl90KSh2b2lkICAgICAgICAgKnVzZXJfcHJpdiwKKyAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV90ICAgICAgKmltZywKKyAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV9yZWN0X3QgKnZhbGlkLAorICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3JlY3RfdCAqdXBkYXRlKTsKKworCisgICAgLyohXGJyaWVmIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2Ygc2xpY2UgY29tcGxldGlvbi4KKyAgICAgKgorICAgICAqIFJlZ2lzdGVycyBhIGdpdmVuIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgZGVjb2RlZCBzbGljZSBpcworICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gY3R4ICAgICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW5dIGNiICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAgICAqIFxwYXJhbVtpbl0gdXNlcl9wcml2ICAgIFVzZXIncyBwcml2YXRlIGRhdGEKKyAgICAgKgorICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19PSworICAgICAqICAgICBDYWxsYmFjayBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4KKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfRVJST1IKKyAgICAgKiAgICAgRGVjb2RlciBjb250ZXh0IG5vdCBpbml0aWFsaXplZCwgb3IgYWxnb3JpdGhtIG5vdCBjYXBhYmxlIG9mCisgICAgICogICAgIHBvc3Rpbmcgc2xpY2UgY29tcGxldGlvbi4KKyAgICAgKi8KKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3JlZ2lzdGVyX3B1dF9zbGljZV9jYih2cHhfY29kZWNfY3R4X3QgICAgICAgICAgICAgKmN0eCwKKyAgICAgICAgICAgIHZweF9jb2RlY19wdXRfc2xpY2VfY2JfZm5fdCAgY2IsCisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdik7CisKKworICAgIC8qIUB9IC0gZW5kIGRlZmdyb3VwIGNhcF9wdXRfc2xpY2UqLworCisgICAgLyohQH0gLSBlbmQgZGVmZ3JvdXAgZGVjb2RlciovCisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC92cHhfZW5jb2Rlci5oIGIvbGlidnB4L3ZweC92cHhfZW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDkwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4L3ZweF9lbmNvZGVyLmgKQEAgLTAsMCArMSw5MzUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiFcZGVmZ3JvdXAgZW5jb2RlciBFbmNvZGVyIEFsZ29yaXRobSBJbnRlcmZhY2UKKyAqIFxpbmdyb3VwIGNvZGVjCisgKiBUaGlzIGFic3RyYWN0aW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBlbmNvZGVyIHRvIGVhc2lseSBzdXBwb3J0CisgKiBtdWx0aXBsZSB2aWRlbyBmb3JtYXRzIHdpdGggbWluaW1hbCBjb2RlIGR1cGxpY2F0aW9uLiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzCisgKiB0aGUgaW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgZW5jb2RlcnMuCisgKiBAeworICovCisKKy8qIVxmaWxlCisgKiBcYnJpZWYgRGVzY3JpYmVzIHRoZSBlbmNvZGVyIGFsZ29yaXRobSBpbnRlcmZhY2UgdG8gYXBwbGljYXRpb25zLgorICoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGFuIGFwcGxpY2F0aW9uIGFuZCBhCisgKiB2aWRlbyBlbmNvZGVyIGFsZ29yaXRobS4KKyAqCisgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBWUFhfRU5DT0RFUl9ICisjZGVmaW5lIFZQWF9FTkNPREVSX0gKKyNpbmNsdWRlICJ2cHhfY29kZWMuaCIKKworLyohIFRlbXBvcmFsIFNjYWxhYmlsaXR5OiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgZGVmaW5pbmcgZnJhbWUKKyAqIGxheWVyIG1lbWJlcnNoaXAKKyAqLworI2RlZmluZSBWUFhfVFNfTUFYX1BFUklPRElDSVRZIDE2CisKKy8qISBUZW1wb3JhbCBTY2FsYWJpbGl0eTogTWF4aW11bSBudW1iZXIgb2YgY29kaW5nIGxheWVycyAqLworI2RlZmluZSBWUFhfVFNfTUFYX0xBWUVSUyAgICAgICA1CisKKy8qIVxkZXByZWNhdGVkIFVzZSAjVlBYX1RTX01BWF9QRVJJT0RJQ0lUWSBpbnN0ZWFkLiAqLworI2RlZmluZSBNQVhfUEVSSU9ESUNJVFkgVlBYX1RTX01BWF9QRVJJT0RJQ0lUWQorCisvKiFcZGVwcmVjYXRlZCBVc2UgI1ZQWF9UU19NQVhfTEFZRVJTIGluc3RlYWQuICovCisjZGVmaW5lIE1BWF9MQVlFUlMgICAgICBWUFhfVFNfTUFYX0xBWUVSUworCisgICAgLyohXGJyaWVmIEN1cnJlbnQgQUJJIHZlcnNpb24gbnVtYmVyCisgICAgICoKKyAgICAgKiBcaW50ZXJuYWwKKyAgICAgKiBJZiB0aGlzIGZpbGUgaXMgYWx0ZXJlZCBpbiBhbnkgd2F5IHRoYXQgY2hhbmdlcyB0aGUgQUJJLCB0aGlzIHZhbHVlCisgICAgICogbXVzdCBiZSBidW1wZWQuICBFeGFtcGxlcyBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBjaGFuZ2luZworICAgICAqIHR5cGVzLCByZW1vdmluZyBvciByZWFzc2lnbmluZyBlbnVtcywgYWRkaW5nL3JlbW92aW5nL3JlYXJyYW5naW5nCisgICAgICogZmllbGRzIHRvIHN0cnVjdHVyZXMKKyAgICAgKi8KKyNkZWZpbmUgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04gKDMgKyBWUFhfQ09ERUNfQUJJX1ZFUlNJT04pIC8qKjxcaGlkZWluaXRpYWxpemVyKi8KKworCisgICAgLyohIFxicmllZiBFbmNvZGVyIGNhcGFiaWxpdGllcyBiaXRmaWVsZAorICAgICAqCisgICAgICogIEVhY2ggZW5jb2RlciBhZHZlcnRpc2VzIHRoZSBjYXBhYmlsaXRpZXMgaXQgc3VwcG9ydHMgYXMgcGFydCBvZiBpdHMKKyAgICAgKiAgOjp2cHhfY29kZWNfaWZhY2VfdCBpbnRlcmZhY2Ugc3RydWN0dXJlLiBDYXBhYmlsaXRpZXMgYXJlIGV4dHJhCisgICAgICogIGludGVyZmFjZXMgb3IgZnVuY3Rpb25hbGl0eSwgYW5kIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkCisgICAgICogIGJ5IGFuIGVuY29kZXIuCisgICAgICoKKyAgICAgKiAgVGhlIGF2YWlsYWJsZSBmbGFncyBhcmUgc3BlY2lmaWVkIGJ5IFZQWF9DT0RFQ19DQVBfKiBkZWZpbmVzLgorICAgICAqLworI2RlZmluZSBWUFhfQ09ERUNfQ0FQX1BTTlIgIDB4MTAwMDAgLyoqPCBDYW4gaXNzdWUgUFNOUiBwYWNrZXRzICovCisKKyAgICAvKiEgQ2FuIG91dHB1dCBvbmUgcGFydGl0aW9uIGF0IGEgdGltZS4gRWFjaCBwYXJ0aXRpb24gaXMgcmV0dXJuZWQgaW4gaXRzCisgICAgICogIG93biBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtULCB3aXRoIHRoZSBGUkFNRV9JU19GUkFHTUVOVCBmbGFnIHNldCBmb3IKKyAgICAgKiAgZXZlcnkgcGFydGl0aW9uIGJ1dCB0aGUgbGFzdC4gSW4gdGhpcyBtb2RlIGFsbCBmcmFtZXMgYXJlIGFsd2F5cworICAgICAqICByZXR1cm5lZCBwYXJ0aXRpb24gYnkgcGFydGl0aW9uLgorICAgICAqLworI2RlZmluZSBWUFhfQ09ERUNfQ0FQX09VVFBVVF9QQVJUSVRJT04gIDB4MjAwMDAKKworCisgICAgLyohIFxicmllZiBJbml0aWFsaXphdGlvbi10aW1lIEZlYXR1cmUgRW5hYmxpbmcKKyAgICAgKgorICAgICAqICBDZXJ0YWluIGNvZGVjIGZlYXR1cmVzIG11c3QgYmUga25vd24gYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgdG8gYWxsb3cKKyAgICAgKiAgZm9yIHByb3BlciBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqICBUaGUgYXZhaWxhYmxlIGZsYWdzIGFyZSBzcGVjaWZpZWQgYnkgVlBYX0NPREVDX1VTRV8qIGRlZmluZXMuCisgICAgICovCisjZGVmaW5lIFZQWF9DT0RFQ19VU0VfUFNOUiAgMHgxMDAwMCAvKio8IENhbGN1bGF0ZSBQU05SIG9uIGVhY2ggZnJhbWUgKi8KKyNkZWZpbmUgVlBYX0NPREVDX1VTRV9PVVRQVVRfUEFSVElUSU9OICAweDIwMDAwIC8qKjwgTWFrZSB0aGUgZW5jb2RlciBvdXRwdXQgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiBhdCBhIHRpbWUuICovCisKKworICAgIC8qIVxicmllZiBHZW5lcmljIGZpeGVkIHNpemUgYnVmZmVyIHN0cnVjdHVyZQorICAgICAqCisgICAgICogVGhpcyBzdHJ1Y3R1cmUgaXMgYWJsZSB0byBob2xkIGEgcmVmZXJlbmNlIHRvIGFueSBmaXhlZCBzaXplIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCB2cHhfZml4ZWRfYnVmCisgICAgeworICAgICAgICB2b2lkICAgICAgICAgICpidWY7IC8qKjwgUG9pbnRlciB0byB0aGUgZGF0YSAqLworICAgICAgICBzaXplX3QgICAgICAgICBzejsgIC8qKjwgTGVuZ3RoIG9mIHRoZSBidWZmZXIsIGluIGNoYXJzICovCisgICAgfSB2cHhfZml4ZWRfYnVmX3Q7IC8qKjwgYWxpYXMgZm9yIHN0cnVjdCB2cHhfZml4ZWRfYnVmICovCisKKworICAgIC8qIVxicmllZiBUaW1lIFN0YW1wIFR5cGUKKyAgICAgKgorICAgICAqIEFuIGludGVnZXIsIHdoaWNoIHdoZW4gbXVsdGlwbGllZCBieSB0aGUgc3RyZWFtJ3MgdGltZSBiYXNlLCBwcm92aWRlcworICAgICAqIHRoZSBhYnNvbHV0ZSB0aW1lIG9mIGEgc2FtcGxlLgorICAgICAqLworICAgIHR5cGVkZWYgaW50NjRfdCB2cHhfY29kZWNfcHRzX3Q7CisKKworICAgIC8qIVxicmllZiBDb21wcmVzc2VkIEZyYW1lIEZsYWdzCisgICAgICoKKyAgICAgKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIGJpdGZpZWxkIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21wcmVzc2VkCisgICAgICogZnJhbWUgdGhhdCBtYXkgYmUgdXNlZnVsIHRvIGFuIGFwcGxpY2F0aW9uLiBUaGUgbW9zdCBzaWduaWZpY2FudCAxNiBiaXRzCisgICAgICogY2FuIGJlIHVzZWQgYnkgYW4gYWxnb3JpdGhtIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBkZXRhaWwsIGZvciBleGFtcGxlIHRvCisgICAgICogc3VwcG9ydCBmcmFtZSB0eXBlcyB0aGF0IGFyZSBjb2RlYyBzcGVjaWZpYyAoTVBFRy0xIEQtZnJhbWVzIGZvciBleGFtcGxlKQorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgdnB4X2NvZGVjX2ZyYW1lX2ZsYWdzX3Q7CisjZGVmaW5lIFZQWF9GUkFNRV9JU19LRVkgICAgICAgMHgxIC8qKjwgZnJhbWUgaXMgdGhlIHN0YXJ0IG9mIGEgR09QICovCisjZGVmaW5lIFZQWF9GUkFNRV9JU19EUk9QUEFCTEUgMHgyIC8qKjwgZnJhbWUgY2FuIGJlIGRyb3BwZWQgd2l0aG91dCBhZmZlY3RpbmcKKyAgICB0aGUgc3RyZWFtIChubyBmdXR1cmUgZnJhbWUgZGVwZW5kcyBvbgorICAgICAgICAgICAgICAgIHRoaXMgb25lKSAqLworI2RlZmluZSBWUFhfRlJBTUVfSVNfSU5WSVNJQkxFIDB4NCAvKio8IGZyYW1lIHNob3VsZCBiZSBkZWNvZGVkIGJ1dCB3aWxsIG5vdAorICAgIGJlIHNob3duICovCisjZGVmaW5lIFZQWF9GUkFNRV9JU19GUkFHTUVOVCAgMHg4IC8qKjwgdGhpcyBpcyBhIGZyYWdtZW50IG9mIHRoZSBlbmNvZGVkCisgICAgZnJhbWUgKi8KKworICAgIC8qIVxicmllZiBFcnJvciBSZXNpbGllbnQgZmxhZ3MKKyAgICAgKgorICAgICAqIFRoZXNlIGZsYWdzIGRlZmluZSB3aGljaCBlcnJvciByZXNpbGllbnQgZmVhdHVyZXMgdG8gZW5hYmxlIGluIHRoZQorICAgICAqIGVuY29kZXIuIFRoZSBmbGFncyBhcmUgc3BlY2lmaWVkIHRocm91Z2ggdGhlCisgICAgICogdnB4X2NvZGVjX2VuY19jZmc6OmdfZXJyb3JfcmVzaWxpZW50IHZhcmlhYmxlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgdnB4X2NvZGVjX2VyX2ZsYWdzX3Q7CisjZGVmaW5lIFZQWF9FUlJPUl9SRVNJTElFTlRfREVGQVVMVCAgICAgMHgxIC8qKjwgSW1wcm92ZSByZXNpbGllbmN5IGFnYWluc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzZXMgb2Ygd2hvbGUgZnJhbWVzICovCisjZGVmaW5lIFZQWF9FUlJPUl9SRVNJTElFTlRfUEFSVElUSU9OUyAgMHgyIC8qKjwgVGhlIGZyYW1lIHBhcnRpdGlvbnMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnRseSBkZWNvZGFibGUgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNvZGVyLCBtZWFuaW5nIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25zIGNhbiBiZSBkZWNvZGVkIGV2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggZWFybGllciBwYXJ0aXRpb25zIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGxvc3QuIE5vdGUgdGhhdCBpbnRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY2l0aW9uIGlzIHN0aWxsIGRvbmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gYm91bmRhcnkuICovCisKKyAgICAvKiFcYnJpZWYgRW5jb2RlciBvdXRwdXQgcGFja2V0IHZhcmlhbnRzCisgICAgICoKKyAgICAgKiBUaGlzIGVudW1lcmF0aW9uIGxpc3RzIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgZGF0YSBwYWNrZXRzIHRoYXQgY2FuIGJlCisgICAgICogcmV0dXJuZWQgYnkgY2FsbHMgdG8gdnB4X2NvZGVjX2dldF9jeF9kYXRhKCkuIEFsZ29yaXRobXMgXHJlZiBNQVkKKyAgICAgKiBleHRlbmQgdGhpcyBsaXN0IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LgorICAgICAqLworICAgIGVudW0gdnB4X2NvZGVjX2N4X3BrdF9raW5kCisgICAgeworICAgICAgICBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtULCAgICAvKio8IENvbXByZXNzZWQgdmlkZW8gZnJhbWUgKi8KKyAgICAgICAgVlBYX0NPREVDX1NUQVRTX1BLVCwgICAgICAgLyoqPCBUd28tcGFzcyBzdGF0aXN0aWNzIGZvciB0aGlzIGZyYW1lICovCisgICAgICAgIFZQWF9DT0RFQ19QU05SX1BLVCwgICAgICAgIC8qKjwgUFNOUiBzdGF0aXN0aWNzIGZvciB0aGlzIGZyYW1lICovCisgICAgICAgIFZQWF9DT0RFQ19DVVNUT01fUEtUID0gMjU2IC8qKjwgQWxnb3JpdGhtIGV4dGVuc2lvbnMgICovCisgICAgfTsKKworCisgICAgLyohXGJyaWVmIEVuY29kZXIgb3V0cHV0IHBhY2tldAorICAgICAqCisgICAgICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBvdXRwdXQgZGF0YSB0aGUgZW5jb2RlcgorICAgICAqIG1heSBwcm9kdWNlIHdoaWxlIGNvbXByZXNzaW5nIGEgZnJhbWUuCisgICAgICovCisgICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdAorICAgIHsKKyAgICAgICAgZW51bSB2cHhfY29kZWNfY3hfcGt0X2tpbmQgIGtpbmQ7IC8qKjwgcGFja2V0IHZhcmlhbnQgKi8KKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKmJ1ZjsgICAgICAvKio8IGNvbXByZXNzZWQgZGF0YSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgc3o7ICAgICAgIC8qKjwgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGF0YSAqLworICAgICAgICAgICAgICAgIHZweF9jb2RlY19wdHNfdCAgICAgICAgICBwdHM7ICAgICAgLyoqPCB0aW1lIHN0YW1wIHRvIHNob3cgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gdGltZWJhc2UgdW5pdHMpICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGR1cmF0aW9uOyAvKio8IGR1cmF0aW9uIHRvIHNob3cgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gdGltZWJhc2UgdW5pdHMpICovCisgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2ZyYW1lX2ZsYWdzX3QgIGZsYWdzOyAgICAvKio8IGZsYWdzIGZvciB0aGlzIGZyYW1lICovCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9pZDsgLyoqPCB0aGUgcGFydGl0aW9uIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyB0aGUgZGVjb2Rpbmcgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcGFydGl0aW9ucy4gT25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgd2hlbiAib3V0cHV0IHBhcnRpdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGlzIGVuYWJsZWQuIEZpcnN0IHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBpZCAwLiovCisKKyAgICAgICAgICAgIH0gZnJhbWU7ICAvKio8IGRhdGEgZm9yIGNvbXByZXNzZWQgZnJhbWUgcGFja2V0ICovCisgICAgICAgICAgICBzdHJ1Y3QgdnB4X2ZpeGVkX2J1ZiB0d29wYXNzX3N0YXRzOyAgLyoqPCBkYXRhIGZvciB0d28tcGFzcyBwYWNrZXQgKi8KKyAgICAgICAgICAgIHN0cnVjdCB2cHhfcHNucl9wa3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2FtcGxlc1s0XTsgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZXMsIHRvdGFsL3kvdS92ICovCisgICAgICAgICAgICAgICAgdWludDY0X3QgICAgIHNzZVs0XTsgICAgICAvKio8IHN1bSBzcXVhcmVkIGVycm9yLCB0b3RhbC95L3UvdiAqLworICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICBwc25yWzRdOyAgICAgLyoqPCBQU05SLCB0b3RhbC95L3UvdiAqLworICAgICAgICAgICAgfSBwc25yOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkYXRhIGZvciBQU05SIHBhY2tldCAqLworICAgICAgICAgICAgc3RydWN0IHZweF9maXhlZF9idWYgcmF3OyAgICAgLyoqPCBkYXRhIGZvciBhcmJpdHJhcnkgcGFja2V0cyAqLworCisgICAgICAgICAgICAvKiBUaGlzIHBhY2tldCBzaXplIGlzIGZpeGVkIHRvIGFsbG93IGNvZGVjcyB0byBleHRlbmQgdGhpcworICAgICAgICAgICAgICogaW50ZXJmYWNlIHdpdGhvdXQgaGF2aW5nIHRvIG1hbmFnZSBzdG9yYWdlIGZvciByYXcgcGFja2V0cywKKyAgICAgICAgICAgICAqIGkuZS4sIGlmIGl0J3Mgc21hbGxlciB0aGFuIDEyOCBieXRlcywgeW91IGNhbiBzdG9yZSBpbiB0aGUKKyAgICAgICAgICAgICAqIHBhY2tldCBsaXN0IGRpcmVjdGx5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjaGFyIHBhZFsxMjggLSBzaXplb2YoZW51bSB2cHhfY29kZWNfY3hfcGt0X2tpbmQpXTsgLyoqPCBmaXhlZCBzeiAqLworICAgICAgICB9IGRhdGE7IC8qKjwgcGFja2V0IGRhdGEgKi8KKyAgICB9IHZweF9jb2RlY19jeF9wa3RfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9jb2RlY19jeF9wa3QgKi8KKworCisgICAgLyohXGJyaWVmIFJhdGlvbmFsIE51bWJlcgorICAgICAqCisgICAgICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYSBmcmFjdGlvbmFsIHZhbHVlLgorICAgICAqLworICAgIHR5cGVkZWYgc3RydWN0IHZweF9yYXRpb25hbAorICAgIHsKKyAgICAgICAgaW50IG51bTsgLyoqPCBmcmFjdGlvbiBudW1lcmF0b3IgKi8KKyAgICAgICAgaW50IGRlbjsgLyoqPCBmcmFjdGlvbiBkZW5vbWluYXRvciAqLworICAgIH0gdnB4X3JhdGlvbmFsX3Q7IC8qKjwgYWxpYXMgZm9yIHN0cnVjdCB2cHhfcmF0aW9uYWwgKi8KKworCisgICAgLyohXGJyaWVmIE11bHRpLXBhc3MgRW5jb2RpbmcgUGFzcyAqLworICAgIGVudW0gdnB4X2VuY19wYXNzCisgICAgeworICAgICAgICBWUFhfUkNfT05FX1BBU1MsICAgLyoqPCBTaW5nbGUgcGFzcyBtb2RlICovCisgICAgICAgIFZQWF9SQ19GSVJTVF9QQVNTLCAvKio8IEZpcnN0IHBhc3Mgb2YgbXVsdGktcGFzcyBtb2RlICovCisgICAgICAgIFZQWF9SQ19MQVNUX1BBU1MgICAvKio8IEZpbmFsIHBhc3Mgb2YgbXVsdGktcGFzcyBtb2RlICovCisgICAgfTsKKworCisgICAgLyohXGJyaWVmIFJhdGUgY29udHJvbCBtb2RlICovCisgICAgZW51bSB2cHhfcmNfbW9kZQorICAgIHsKKyAgICAgICAgVlBYX1ZCUiwgLyoqPCBWYXJpYWJsZSBCaXQgUmF0ZSAoVkJSKSBtb2RlICovCisgICAgICAgIFZQWF9DQlIsICAvKio8IENvbnN0YW50IEJpdCBSYXRlIChDQlIpIG1vZGUgKi8KKyAgICAgICAgVlBYX0NRICAgLyoqPCBDb25zdGFudCBRdWFsaXR5ICAoQ1EpICBtb2RlICovCisgICAgfTsKKworCisgICAgLyohXGJyaWVmIEtleWZyYW1lIHBsYWNlbWVudCBtb2RlLgorICAgICAqCisgICAgICogVGhpcyBlbnVtZXJhdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIga2V5ZnJhbWVzIGFyZSBwbGFjZWQgYXV0b21hdGljYWxseSBieQorICAgICAqIHRoZSBlbmNvZGVyIG9yIHdoZXRoZXIgdGhpcyBiZWhhdmlvciBpcyBkaXNhYmxlZC4gT2xkZXIgcmVsZWFzZXMgb2YgdGhpcworICAgICAqIFNESyB3ZXJlIGltcGxlbWVudGVkIHN1Y2ggdGhhdCBWUFhfS0ZfRklYRUQgbWVhbnQga2V5ZnJhbWVzIHdlcmUgZGlzYWJsZWQuCisgICAgICogVGhpcyBuYW1lIGlzIGNvbmZ1c2luZyBmb3IgdGhpcyBiZWhhdmlvciwgc28gdGhlIG5ldyBzeW1ib2xzIHRvIGJlIHVzZWQKKyAgICAgKiBhcmUgVlBYX0tGX0FVVE8gYW5kIFZQWF9LRl9ESVNBQkxFRC4KKyAgICAgKi8KKyAgICBlbnVtIHZweF9rZl9tb2RlCisgICAgeworICAgICAgICBWUFhfS0ZfRklYRUQsIC8qKjwgZGVwcmVjYXRlZCwgaW1wbGllcyBWUFhfS0ZfRElTQUJMRUQgKi8KKyAgICAgICAgVlBYX0tGX0FVVE8sICAvKio8IEVuY29kZXIgZGV0ZXJtaW5lcyBvcHRpbWFsIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5ICovCisgICAgICAgIFZQWF9LRl9ESVNBQkxFRCA9IDAgLyoqPCBFbmNvZGVyIGRvZXMgbm90IHBsYWNlIGtleWZyYW1lcy4gKi8KKyAgICB9OworCisKKyAgICAvKiFcYnJpZWYgRW5jb2RlZCBGcmFtZSBGbGFncworICAgICAqCisgICAgICogVGhpcyB0eXBlIGluZGljYXRlcyBhIGJpdGZpZWxkIHRvIGJlIHBhc3NlZCB0byB2cHhfY29kZWNfZW5jb2RlKCksIGRlZmluaW5nCisgICAgICogcGVyLWZyYW1lIGJvb2xlYW4gdmFsdWVzLiBCeSBjb252ZW50aW9uLCBiaXRzIGNvbW1vbiB0byBhbGwgY29kZWNzIHdpbGwgYmUKKyAgICAgKiBuYW1lZCBWUFhfRUZMQUdfKiwgYW5kIGJpdHMgc3BlY2lmaWMgdG8gYW4gYWxnb3JpdGhtIHdpbGwgYmUgbmFtZWQKKyAgICAgKiAvYWxnby9fZWZsYWdfKi4gVGhlIGxvd2VyIG9yZGVyIDE2IGJpdHMgYXJlIHJlc2VydmVkIGZvciBjb21tb24gdXNlLgorICAgICAqLworICAgIHR5cGVkZWYgbG9uZyB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3Q7CisjZGVmaW5lIFZQWF9FRkxBR19GT1JDRV9LRiAoMTw8MCkgIC8qKjwgRm9yY2UgdGhpcyBmcmFtZSB0byBiZSBhIGtleWZyYW1lICovCisKKworICAgIC8qIVxicmllZiBFbmNvZGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICAgICoKKyAgICAgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZW5jb2RlciBzZXR0aW5ncyB0aGF0IGhhdmUgY29tbW9uIHJlcHJlc2VudGF0aW9ucworICAgICAqIGFjcm9zcyBhbGwgY29kZWNzLiBUaGlzIGRvZXNuJ3QgaW1wbHkgdGhhdCBhbGwgY29kZWNzIHN1cHBvcnQgYWxsIGZlYXR1cmVzLAorICAgICAqIGhvd2V2ZXIuCisgICAgICovCisgICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX2VuY19jZmcKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIGdlbmVyaWMgc2V0dGluZ3MgKGcpCisgICAgICAgICAqLworCisgICAgICAgIC8qIVxicmllZiBBbGdvcml0aG0gc3BlY2lmaWMgInVzYWdlIiB2YWx1ZQorICAgICAgICAgKgorICAgICAgICAgKiBBbGdvcml0aG1zIG1heSBkZWZpbmUgbXVsdGlwbGUgdmFsdWVzIGZvciB1c2FnZSwgd2hpY2ggbWF5IGNvbnZleSB0aGUKKyAgICAgICAgICogaW50ZW50IG9mIGhvdyB0aGUgYXBwbGljYXRpb24gaW50ZW5kcyB0byB1c2UgdGhlIHN0cmVhbS4gSWYgdGhpcyB2YWx1ZQorICAgICAgICAgKiBpcyBub24temVybywgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNvZGVjIHRvIGRldGVybWluZSBpdHMKKyAgICAgICAgICogbWVhbmluZy4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgZ191c2FnZTsKKworCisgICAgICAgIC8qIVxicmllZiBNYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZQorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgbXVsdGktdGhyZWFkZWQgaW1wbGVtZW50YXRpb25zLCB1c2Ugbm8gbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mCisgICAgICAgICAqIHRocmVhZHMuIFRoZSBjb2RlYyBtYXkgdXNlIGZld2VyIHRocmVhZHMgdGhhbiBhbGxvd2VkLiBUaGUgdmFsdWUKKyAgICAgICAgICogMCBpcyBlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSAxLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBnX3RocmVhZHM7CisKKworICAgICAgICAvKiFcYnJpZWYgQml0c3RyZWFtIHByb2ZpbGUgdG8gdXNlCisgICAgICAgICAqCisgICAgICAgICAqIFNvbWUgY29kZWNzIHN1cHBvcnQgYSBub3Rpb24gb2YgbXVsdGlwbGUgYml0c3RyZWFtIHByb2ZpbGVzLiBUeXBpY2FsbHkKKyAgICAgICAgICogdGhpcyBtYXBzIHRvIGEgc2V0IG9mIGZlYXR1cmVzIHRoYXQgYXJlIHR1cm5lZCBvbiBvciBvZmYuIE9mdGVuIHRoZQorICAgICAgICAgKiBwcm9maWxlIHRvIHVzZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmZWF0dXJlcyBvZiB0aGUgaW50ZW5kZWQgZGVjb2Rlci4KKyAgICAgICAgICogQ29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNvZGVjIHRvIGRldGVybWluZSB0aGUgdmFsaWQgdmFsdWVzCisgICAgICAgICAqIGZvciB0aGlzIHBhcmFtZXRlciwgb3Igc2V0IHRvIHplcm8gZm9yIGEgc2FuZSBkZWZhdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBnX3Byb2ZpbGU7ICAvKio8IHByb2ZpbGUgb2YgYml0c3RyZWFtIHRvIHVzZSAqLworCisKKworICAgICAgICAvKiFcYnJpZWYgV2lkdGggb2YgdGhlIGZyYW1lCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdmFsdWUgaWRlbnRpZmllcyB0aGUgcHJlc2VudGF0aW9uIHJlc29sdXRpb24gb2YgdGhlIGZyYW1lLAorICAgICAgICAgKiBpbiBwaXhlbHMuIE5vdGUgdGhhdCB0aGUgZnJhbWVzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgZW5jb2RlciBtdXN0CisgICAgICAgICAqIGhhdmUgdGhpcyByZXNvbHV0aW9uLiBGcmFtZXMgd2lsbCBiZSBwcmVzZW50ZWQgYnkgdGhlIGRlY29kZXIgaW4gdGhpcworICAgICAgICAgKiByZXNvbHV0aW9uLCBpbmRlcGVuZGVudCBvZiBhbnkgc3BhdGlhbCByZXNhbXBsaW5nIHRoZSBlbmNvZGVyIG1heSBkby4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgZ193OworCisKKyAgICAgICAgLyohXGJyaWVmIEhlaWdodCBvZiB0aGUgZnJhbWUKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSBpZGVudGlmaWVzIHRoZSBwcmVzZW50YXRpb24gcmVzb2x1dGlvbiBvZiB0aGUgZnJhbWUsCisgICAgICAgICAqIGluIHBpeGVscy4gTm90ZSB0aGF0IHRoZSBmcmFtZXMgcGFzc2VkIGFzIGlucHV0IHRvIHRoZSBlbmNvZGVyIG11c3QKKyAgICAgICAgICogaGF2ZSB0aGlzIHJlc29sdXRpb24uIEZyYW1lcyB3aWxsIGJlIHByZXNlbnRlZCBieSB0aGUgZGVjb2RlciBpbiB0aGlzCisgICAgICAgICAqIHJlc29sdXRpb24sIGluZGVwZW5kZW50IG9mIGFueSBzcGF0aWFsIHJlc2FtcGxpbmcgdGhlIGVuY29kZXIgbWF5IGRvLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBnX2g7CisKKworICAgICAgICAvKiFcYnJpZWYgU3RyZWFtIHRpbWViYXNlIHVuaXRzCisgICAgICAgICAqCisgICAgICAgICAqIEluZGljYXRlcyB0aGUgc21hbGxlc3QgaW50ZXJ2YWwgb2YgdGltZSwgaW4gc2Vjb25kcywgdXNlZCBieSB0aGUgc3RyZWFtLgorICAgICAgICAgKiBGb3IgZml4ZWQgZnJhbWUgcmF0ZSBtYXRlcmlhbCwgb3IgdmFyaWFibGUgZnJhbWUgcmF0ZSBtYXRlcmlhbCB3aGVyZQorICAgICAgICAgKiBmcmFtZXMgYXJlIHRpbWVkIGF0IGEgbXVsdGlwbGUgb2YgYSBnaXZlbiBjbG9jayAoZXg6IHZpZGVvIGNhcHR1cmUpLAorICAgICAgICAgKiB0aGUgXHJlZiBSRUNPTU1FTkRFRCBtZXRob2QgaXMgdG8gc2V0IHRoZSB0aW1lYmFzZSB0byB0aGUgcmVjaXByb2NhbAorICAgICAgICAgKiBvZiB0aGUgZnJhbWUgcmF0ZSAoZXg6IDEwMDEvMzAwMDAgZm9yIDI5Ljk3MCBIeiBOVFNDKS4gVGhpcyBhbGxvd3MgdGhlCisgICAgICAgICAqIHB0cyB0byBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBudW1iZXIsIHdoaWNoIGNhbiBiZSBoYW5keS4gRm9yCisgICAgICAgICAqIHJlLWVuY29kaW5nIHZpZGVvIGZyb20gY29udGFpbmVycyB3aXRoIGFic29sdXRlIHRpbWUgdGltZXN0YW1wcywgdGhlCisgICAgICAgICAqIFxyZWYgUkVDT01NRU5ERUQgbWV0aG9kIGlzIHRvIHNldCB0aGUgdGltZWJhc2UgdG8gdGhhdCBvZiB0aGUgcGFyZW50CisgICAgICAgICAqIGNvbnRhaW5lciBvciBtdWx0aW1lZGlhIGZyYW1ld29yayAoZXg6IDEvMTAwMCBmb3IgbXMsIGFzIGluIEZMVikuCisgICAgICAgICAqLworICAgICAgICBzdHJ1Y3QgdnB4X3JhdGlvbmFsICAgIGdfdGltZWJhc2U7CisKKworICAgICAgICAvKiFcYnJpZWYgRW5hYmxlIGVycm9yIHJlc2lsaWVudCBtb2Rlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGVycm9yIHJlc2lsaWVudCBiaXRmaWVsZCBpbmRpY2F0ZXMgdG8gdGhlIGVuY29kZXIgd2hpY2ggZmVhdHVyZXMKKyAgICAgICAgICogaXQgc2hvdWxkIGVuYWJsZSB0byB0YWtlIG1lYXN1cmVzIGZvciBzdHJlYW1pbmcgb3ZlciBsb3NzeSBvciBub2lzeQorICAgICAgICAgKiBsaW5rcy4KKyAgICAgICAgICovCisgICAgICAgIHZweF9jb2RlY19lcl9mbGFnc190ICAgZ19lcnJvcl9yZXNpbGllbnQ7CisKKworICAgICAgICAvKiFcYnJpZWYgTXVsdGktcGFzcyBFbmNvZGluZyBNb2RlCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgY3VycmVudCBwaGFzZSBmb3IgbXVsdGktcGFzcyBlbmNvZGluZy4KKyAgICAgICAgICogRm9yIHNpbmdsZSBwYXNzLCBzZXQgdG8gI1ZQWF9SQ19PTkVfUEFTUy4KKyAgICAgICAgICovCisgICAgICAgIGVudW0gdnB4X2VuY19wYXNzICAgICAgZ19wYXNzOworCisKKyAgICAgICAgLyohXGJyaWVmIEFsbG93IGxhZ2dlZCBlbmNvZGluZworICAgICAgICAgKgorICAgICAgICAgKiBJZiBzZXQsIHRoaXMgdmFsdWUgYWxsb3dzIHRoZSBlbmNvZGVyIHRvIGNvbnN1bWUgYSBudW1iZXIgb2YgaW5wdXQKKyAgICAgICAgICogZnJhbWVzIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0IGZyYW1lcy4gVGhpcyBhbGxvd3MgdGhlIGVuY29kZXIgdG8KKyAgICAgICAgICogYmFzZSBkZWNpc2lvbnMgZm9yIHRoZSBjdXJyZW50IGZyYW1lIG9uIGZ1dHVyZSBmcmFtZXMuIFRoaXMgZG9lcworICAgICAgICAgKiBpbmNyZWFzZSB0aGUgbGF0ZW5jeSBvZiB0aGUgZW5jb2RpbmcgcGlwZWxpbmUsIHNvIGl0IGlzIG5vdCBhcHByb3ByaWF0ZQorICAgICAgICAgKiBpbiBhbGwgc2l0dWF0aW9ucyAoZXg6IHJlYWx0aW1lIGVuY29kaW5nKS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgYSBtYXhpbXVtIHZhbHVlIC0tIHRoZSBlbmNvZGVyIG1heSBwcm9kdWNlIGZyYW1lcworICAgICAgICAgKiBzb29uZXIgdGhhbiB0aGUgZ2l2ZW4gbGltaXQuIFNldCB0aGlzIHZhbHVlIHRvIDAgdG8gZGlzYWJsZSB0aGlzCisgICAgICAgICAqIGZlYXR1cmUuCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGdfbGFnX2luX2ZyYW1lczsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIHJhdGUgY29udHJvbCBzZXR0aW5ncyAocmMpCisgICAgICAgICAqLworCisgICAgICAgIC8qIVxicmllZiBUZW1wb3JhbCByZXNhbXBsaW5nIGNvbmZpZ3VyYXRpb24sIGlmIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCisgICAgICAgICAqCisgICAgICAgICAqIFRlbXBvcmFsIHJlc2FtcGxpbmcgYWxsb3dzIHRoZSBjb2RlYyB0byAiZHJvcCIgZnJhbWVzIGFzIGEgc3RyYXRlZ3kgdG8KKyAgICAgICAgICogbWVldCBpdHMgdGFyZ2V0IGRhdGEgcmF0ZS4gVGhpcyBjYW4gY2F1c2UgdGVtcG9yYWwgZGlzY29udGludWl0aWVzIGluCisgICAgICAgICAqIHRoZSBlbmNvZGVkIHZpZGVvLCB3aGljaCBtYXkgYXBwZWFyIGFzIHN0dXR0ZXJpbmcgZHVyaW5nIHBsYXliYWNrLiBUaGlzCisgICAgICAgICAqIHRyYWRlLW9mZiBpcyBvZnRlbiBhY2NlcHRhYmxlLCBidXQgZm9yIG1hbnkgYXBwbGljYXRpb25zIGlzIG5vdC4gSXQgY2FuCisgICAgICAgICAqIGJlIGRpc2FibGVkIGluIHRoZXNlIGNhc2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgbm90IGFsbCBjb2RlY3Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIEFsbCB2cHggVlB4IGNvZGVjcyBkby4KKyAgICAgICAgICogRm9yIG90aGVyIGNvZGVjcywgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBhbGdvcml0aG0uCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdGhyZXNob2xkIGlzIGRlc2NyaWJlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICogV2hlbiB0aGUgZGF0YSBidWZmZXIgZmFsbHMgYmVsb3cgdGhpcyBwZXJjZW50YWdlIG9mIGZ1bGxuZXNzLCBhCisgICAgICAgICAqIGRyb3BwZWQgZnJhbWUgaXMgaW5kaWNhdGVkLiBTZXQgdGhlIHRocmVzaG9sZCB0byB6ZXJvICgwKSB0byBkaXNhYmxlCisgICAgICAgICAqIHRoaXMgZmVhdHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfZHJvcGZyYW1lX3RocmVzaDsKKworCisgICAgICAgIC8qIVxicmllZiBFbmFibGUvZGlzYWJsZSBzcGF0aWFsIHJlc2FtcGxpbmcsIGlmIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCisgICAgICAgICAqCisgICAgICAgICAqIFNwYXRpYWwgcmVzYW1wbGluZyBhbGxvd3MgdGhlIGNvZGVjIHRvIGNvbXByZXNzIGEgbG93ZXIgcmVzb2x1dGlvbgorICAgICAgICAgKiB2ZXJzaW9uIG9mIHRoZSBmcmFtZSwgd2hpY2ggaXMgdGhlbiB1cHNjYWxlZCBieSB0aGUgZW5jb2RlciB0byB0aGUKKyAgICAgICAgICogY29ycmVjdCBwcmVzZW50YXRpb24gcmVzb2x1dGlvbi4gVGhpcyBpbmNyZWFzZXMgdmlzdWFsIHF1YWxpdHkgYXQKKyAgICAgICAgICogbG93IGRhdGEgcmF0ZXMsIGF0IHRoZSBleHBlbnNlIG9mIENQVSB0aW1lIG9uIHRoZSBlbmNvZGVyL2RlY29kZXIuCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX3Jlc2l6ZV9hbGxvd2VkOworCisKKyAgICAgICAgLyohXGJyaWVmIFNwYXRpYWwgcmVzYW1wbGluZyB1cCB3YXRlcm1hcmsuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdGhyZXNob2xkIGlzIGRlc2NyaWJlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICogV2hlbiB0aGUgZGF0YSBidWZmZXIgcmlzZXMgYWJvdmUgdGhpcyBwZXJjZW50YWdlIG9mIGZ1bGxuZXNzLCB0aGUKKyAgICAgICAgICogZW5jb2RlciB3aWxsIHN0ZXAgdXAgdG8gYSBoaWdoZXIgcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBmcmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfcmVzaXplX3VwX3RocmVzaDsKKworCisgICAgICAgIC8qIVxicmllZiBTcGF0aWFsIHJlc2FtcGxpbmcgZG93biB3YXRlcm1hcmsuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdGhyZXNob2xkIGlzIGRlc2NyaWJlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICogV2hlbiB0aGUgZGF0YSBidWZmZXIgZmFsbHMgYmVsb3cgdGhpcyBwZXJjZW50YWdlIG9mIGZ1bGxuZXNzLCB0aGUKKyAgICAgICAgICogZW5jb2RlciB3aWxsIHN0ZXAgZG93biB0byBhIGxvd2VyIHJlc29sdXRpb24gdmVyc2lvbiBvZiB0aGUgZnJhbWUuCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX3Jlc2l6ZV9kb3duX3RocmVzaDsKKworCisgICAgICAgIC8qIVxicmllZiBSYXRlIGNvbnRyb2wgYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuZCB1c2FnZSBvZiB0aGlzIHN0cmVhbSBpcyB0byBiZSBzdHJlYW1lZCBvdmVyCisgICAgICAgICAqIGEgYmFuZHdpZHRoIGNvbnN0cmFpbmVkIGxpbmssIGluZGljYXRpbmcgdGhhdCBDb25zdGFudCBCaXQgUmF0ZSAoQ0JSKQorICAgICAgICAgKiBtb2RlIHNob3VsZCBiZSB1c2VkLCBvciB3aGV0aGVyIGl0IHdpbGwgYmUgcGxheWVkIGJhY2sgb24gYSBoaWdoCisgICAgICAgICAqIGJhbmR3aWR0aCBsaW5rLCBhcyBmcm9tIGEgbG9jYWwgZGlzaywgd2hlcmUgaGlnaGVyIHZhcmlhdGlvbnMgaW4KKyAgICAgICAgICogYml0cmF0ZSBhcmUgYWNjZXB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIGVudW0gdnB4X3JjX21vZGUgICAgICAgcmNfZW5kX3VzYWdlOworCisKKyAgICAgICAgLyohXGJyaWVmIFR3by1wYXNzIHN0YXRzIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBidWZmZXIgY29udGFpbmluZyBhbGwgb2YgdGhlIHN0YXRzIHBhY2tldHMgcHJvZHVjZWQgaW4gdGhlIGZpcnN0CisgICAgICAgICAqIHBhc3MsIGNvbmNhdGVuYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmICAgcmNfdHdvcGFzc19zdGF0c19pbjsKKworCisgICAgICAgIC8qIVxicmllZiBUYXJnZXQgZGF0YSByYXRlCisgICAgICAgICAqCisgICAgICAgICAqIFRhcmdldCBiYW5kd2lkdGggdG8gdXNlIGZvciB0aGlzIHN0cmVhbSwgaW4ga2lsb2JpdHMgcGVyIHNlY29uZC4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfdGFyZ2V0X2JpdHJhdGU7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBxdWFudGl6ZXIgc2V0dGluZ3MKKyAgICAgICAgICovCisKKworICAgICAgICAvKiFcYnJpZWYgTWluaW11bSAoQmVzdCBRdWFsaXR5KSBRdWFudGl6ZXIKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHF1YW50aXplciBpcyB0aGUgbW9zdCBkaXJlY3QgY29udHJvbCBvdmVyIHRoZSBxdWFsaXR5IG9mIHRoZQorICAgICAgICAgKiBlbmNvZGVkIGltYWdlLiBUaGUgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgcXVhbnRpemVyIGlzIGNvZGVjCisgICAgICAgICAqIHNwZWNpZmljLiBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY29kZWMgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAgICAgKiB2YWx1ZXMgdG8gdXNlLiBUbyBkZXRlcm1pbmUgdGhlIHJhbmdlIHByb2dyYW1tYXRpY2FsbHksIGNhbGwKKyAgICAgICAgICogdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdCgpIHdpdGggYSB1c2FnZSB2YWx1ZSBvZiAwLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICByY19taW5fcXVhbnRpemVyOworCisKKyAgICAgICAgLyohXGJyaWVmIE1heGltdW0gKFdvcnN0IFF1YWxpdHkpIFF1YW50aXplcgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgcXVhbnRpemVyIGlzIHRoZSBtb3N0IGRpcmVjdCBjb250cm9sIG92ZXIgdGhlIHF1YWxpdHkgb2YgdGhlCisgICAgICAgICAqIGVuY29kZWQgaW1hZ2UuIFRoZSByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBxdWFudGl6ZXIgaXMgY29kZWMKKyAgICAgICAgICogc3BlY2lmaWMuIENvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjb2RlYyB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICAqIHZhbHVlcyB0byB1c2UuIFRvIGRldGVybWluZSB0aGUgcmFuZ2UgcHJvZ3JhbW1hdGljYWxseSwgY2FsbAorICAgICAgICAgKiB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KCkgd2l0aCBhIHVzYWdlIHZhbHVlIG9mIDAuCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX21heF9xdWFudGl6ZXI7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBiaXRyYXRlIHRvbGVyYW5jZQorICAgICAgICAgKi8KKworCisgICAgICAgIC8qIVxicmllZiBSYXRlIGNvbnRyb2wgYWRhcHRhdGlvbiB1bmRlcnNob290IGNvbnRyb2wKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUsCisgICAgICAgICAqIGNvbnRyb2xzIHRoZSBtYXhpbXVtIGFsbG93ZWQgYWRhcHRhdGlvbiBzcGVlZCBvZiB0aGUgY29kZWMuCisgICAgICAgICAqIFRoaXMgZmFjdG9yIGNvbnRyb2xzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuCisgICAgICAgICAqIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0IGJpdHJhdGUgaW4gb3JkZXIgdG8gY29tcGVuc2F0ZQorICAgICAgICAgKiBmb3IgcHJpb3Igb3ZlcnNob290LgorICAgICAgICAgKgorICAgICAgICAgKiBWYWxpZCB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAtMTAwMC4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfdW5kZXJzaG9vdF9wY3Q7CisKKworICAgICAgICAvKiFcYnJpZWYgUmF0ZSBjb250cm9sIGFkYXB0YXRpb24gb3ZlcnNob290IGNvbnRyb2wKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUsCisgICAgICAgICAqIGNvbnRyb2xzIHRoZSBtYXhpbXVtIGFsbG93ZWQgYWRhcHRhdGlvbiBzcGVlZCBvZiB0aGUgY29kZWMuCisgICAgICAgICAqIFRoaXMgZmFjdG9yIGNvbnRyb2xzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuCisgICAgICAgICAqIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQgYml0cmF0ZSBpbiBvcmRlciB0byBjb21wZW5zYXRlIGZvcgorICAgICAgICAgKiBwcmlvciB1bmRlcnNob290LgorICAgICAgICAgKgorICAgICAgICAgKiBWYWxpZCB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAtMTAwMC4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfb3ZlcnNob290X3BjdDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIGRlY29kZXIgYnVmZmVyIG1vZGVsIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisKKworICAgICAgICAvKiFcYnJpZWYgRGVjb2RlciBCdWZmZXIgU2l6ZQorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlCisgICAgICAgICAqIGRlY29kaW5nIGFwcGxpY2F0aW9uLiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBpcyBleHByZXNzZWQgaW4gdW5pdHMgb2YKKyAgICAgICAgICogdGltZSAobWlsbGlzZWNvbmRzKS4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgNTAwMCBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAgICAgICogY2xpZW50IHdpbGwgYnVmZmVyIChhdCBsZWFzdCkgNTAwMG1zIHdvcnRoIG9mIGVuY29kZWQgZGF0YS4gVXNlIHRoZQorICAgICAgICAgKiB0YXJnZXQgYml0cmF0ZSAoI3JjX3RhcmdldF9iaXRyYXRlKSB0byBjb252ZXJ0IHRvIGJpdHMvYnl0ZXMsIGlmCisgICAgICAgICAqIG5lY2Vzc2FyeS4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfYnVmX3N6OworCisKKyAgICAgICAgLyohXGJyaWVmIERlY29kZXIgQnVmZmVyIEluaXRpYWwgU2l6ZQorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB3aWxsIGJlIGJ1ZmZlcmVkIGJ5IHRoZQorICAgICAgICAgKiBkZWNvZGluZyBhcHBsaWNhdGlvbiBwcmlvciB0byBiZWdpbm5pbmcgcGxheWJhY2suIFRoaXMgdmFsdWUgaXMKKyAgICAgICAgICogZXhwcmVzc2VkIGluIHVuaXRzIG9mIHRpbWUgKG1pbGxpc2Vjb25kcykuIFVzZSB0aGUgdGFyZ2V0IGJpdHJhdGUKKyAgICAgICAgICogKCNyY190YXJnZXRfYml0cmF0ZSkgdG8gY29udmVydCB0byBiaXRzL2J5dGVzLCBpZiBuZWNlc3NhcnkuCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX2J1Zl9pbml0aWFsX3N6OworCisKKyAgICAgICAgLyohXGJyaWVmIERlY29kZXIgQnVmZmVyIE9wdGltYWwgU2l6ZQorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB0aGUgZW5jb2RlciBzaG91bGQgdHJ5CisgICAgICAgICAqIHRvIG1haW50YWluIGluIHRoZSBkZWNvZGVyJ3MgYnVmZmVyLiBUaGlzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbiB1bml0cworICAgICAgICAgKiBvZiB0aW1lIChtaWxsaXNlY29uZHMpLiBVc2UgdGhlIHRhcmdldCBiaXRyYXRlICgjcmNfdGFyZ2V0X2JpdHJhdGUpCisgICAgICAgICAqIHRvIGNvbnZlcnQgdG8gYml0cy9ieXRlcywgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICByY19idWZfb3B0aW1hbF9zejsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIDIgcGFzcyByYXRlIGNvbnRyb2wgcGFyYW1ldGVycworICAgICAgICAgKi8KKworCisgICAgICAgIC8qIVxicmllZiBUd28tcGFzcyBtb2RlIENCUi9WQlIgYmlhcworICAgICAgICAgKgorICAgICAgICAgKiBCaWFzLCBleHByZXNzZWQgb24gYSBzY2FsZSBvZiAwIHRvIDEwMCwgZm9yIGRldGVybWluaW5nIHRhcmdldCBzaXplCisgICAgICAgICAqIGZvciB0aGUgY3VycmVudCBmcmFtZS4gVGhlIHZhbHVlIDAgaW5kaWNhdGVzIHRoZSBvcHRpbWFsIENCUiBtb2RlCisgICAgICAgICAqIHZhbHVlIHNob3VsZCBiZSB1c2VkLiBUaGUgdmFsdWUgMTAwIGluZGljYXRlcyB0aGUgb3B0aW1hbCBWQlIgbW9kZQorICAgICAgICAgKiB2YWx1ZSBzaG91bGQgYmUgdXNlZC4gVmFsdWVzIGluIGJldHdlZW4gaW5kaWNhdGUgd2hpY2ggd2F5IHRoZQorICAgICAgICAgKiBlbmNvZGVyIHNob3VsZCAibGVhbi4iCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjXzJwYXNzX3Zicl9iaWFzX3BjdDsgICAgICAgLyoqPCBSQyBtb2RlIGJpYXMgYmV0d2VlbiBDQlIgYW5kIFZCUigwLTEwMDogMC0+Q0JSLCAxMDAtPlZCUikgICAqLworCisKKyAgICAgICAgLyohXGJyaWVmIFR3by1wYXNzIG1vZGUgcGVyLUdPUCBtaW5pbXVtIGJpdHJhdGUKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUsIGluZGljYXRlcworICAgICAgICAgKiB0aGUgbWluaW11bSBiaXRyYXRlIHRvIGJlIHVzZWQgZm9yIGEgc2luZ2xlIEdPUCAoYWthICJzZWN0aW9uIikKKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfMnBhc3NfdmJyX21pbnNlY3Rpb25fcGN0OworCisKKyAgICAgICAgLyohXGJyaWVmIFR3by1wYXNzIG1vZGUgcGVyLUdPUCBtYXhpbXVtIGJpdHJhdGUKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUsIGluZGljYXRlcworICAgICAgICAgKiB0aGUgbWF4aW11bSBiaXRyYXRlIHRvIGJlIHVzZWQgZm9yIGEgc2luZ2xlIEdPUCAoYWthICJzZWN0aW9uIikKKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfMnBhc3NfdmJyX21heHNlY3Rpb25fcGN0OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICoga2V5ZnJhbWluZyBzZXR0aW5ncyAoa2YpCisgICAgICAgICAqLworCisgICAgICAgIC8qIVxicmllZiBLZXlmcmFtZSBwbGFjZW1lbnQgbW9kZQorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGVyIHNob3VsZCBwbGFjZSBrZXlmcmFtZXMgYXQgYQorICAgICAgICAgKiBmaXhlZCBpbnRlcnZhbCwgb3IgZGV0ZXJtaW5lIHRoZSBvcHRpbWFsIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAqIChhcyBnb3Zlcm5lZCBieSB0aGUgI2tmX21pbl9kaXN0IGFuZCAja2ZfbWF4X2Rpc3QgcGFyYW1ldGVycykKKyAgICAgICAgICovCisgICAgICAgIGVudW0gdnB4X2tmX21vZGUgICAgICAga2ZfbW9kZTsKKworCisgICAgICAgIC8qIVxicmllZiBLZXlmcmFtZSBtaW5pbXVtIGludGVydmFsCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdmFsdWUsIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBmcmFtZXMsIHByZXZlbnRzIHRoZSBlbmNvZGVyIGZyb20KKyAgICAgICAgICogcGxhY2luZyBhIGtleWZyYW1lIG5lYXJlciB0aGFuIGtmX21pbl9kaXN0IHRvIHRoZSBwcmV2aW91cyBrZXlmcmFtZS4gQXQKKyAgICAgICAgICogbGVhc3Qga2ZfbWluX2Rpc3QgZnJhbWVzIG5vbi1rZXlmcmFtZXMgd2lsbCBiZSBjb2RlZCBiZWZvcmUgdGhlIG5leHQKKyAgICAgICAgICoga2V5ZnJhbWUuIFNldCBrZl9taW5fZGlzdCBlcXVhbCB0byBrZl9tYXhfZGlzdCBmb3IgYSBmaXhlZCBpbnRlcnZhbC4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAga2ZfbWluX2Rpc3Q7CisKKworICAgICAgICAvKiFcYnJpZWYgS2V5ZnJhbWUgbWF4aW11bSBpbnRlcnZhbAorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHZhbHVlLCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgZnJhbWVzLCBmb3JjZXMgdGhlIGVuY29kZXIgdG8gY29kZQorICAgICAgICAgKiBhIGtleWZyYW1lIGlmIG9uZSBoYXMgbm90IGJlZW4gY29kZWQgaW4gdGhlIGxhc3Qga2ZfbWF4X2Rpc3QgZnJhbWVzLgorICAgICAgICAgKiBBIHZhbHVlIG9mIDAgaW1wbGllcyBhbGwgZnJhbWVzIHdpbGwgYmUga2V5ZnJhbWVzLiBTZXQga2ZfbWluX2Rpc3QKKyAgICAgICAgICogZXF1YWwgdG8ga2ZfbWF4X2Rpc3QgZm9yIGEgZml4ZWQgaW50ZXJ2YWwuCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGtmX21heF9kaXN0OworCisgICAgICAgIC8qCisgICAgICAgICAqIFRlbXBvcmFsIHNjYWxhYmlsaXR5IHNldHRpbmdzICh0cykKKyAgICAgICAgICovCisKKyAgICAgICAgLyohXGJyaWVmIE51bWJlciBvZiBjb2RpbmcgbGF5ZXJzCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdmFsdWUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29kaW5nIGxheWVycyB0byBiZSB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICB0c19udW1iZXJfbGF5ZXJzOworCisgICAgICAgIC8qIVxicmllZiBUYXJnZXQgYml0cmF0ZSBmb3IgZWFjaCBsYXllcgorICAgICAgICAgKgorICAgICAgICAgKiBUaGVzZSB2YWx1ZXMgc3BlY2lmeSB0aGUgdGFyZ2V0IGNvZGluZyBiaXRyYXRlIGZvciBlYWNoIGNvZGluZyBsYXllci4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgdHNfdGFyZ2V0X2JpdHJhdGVbVlBYX1RTX01BWF9MQVlFUlNdOworCisgICAgICAgIC8qIVxicmllZiBGcmFtZSByYXRlIGRlY2ltYXRpb24gZmFjdG9yIGZvciBlYWNoIGxheWVyCisgICAgICAgICAqCisgICAgICAgICAqIFRoZXNlIHZhbHVlcyBzcGVjaWZ5IHRoZSBmcmFtZSByYXRlIGRlY2ltYXRpb24gZmFjdG9ycyB0byBhcHBseQorICAgICAgICAgKiB0byBlYWNoIGxheWVyLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICB0c19yYXRlX2RlY2ltYXRvcltWUFhfVFNfTUFYX0xBWUVSU107CisKKyAgICAgICAgLyohXGJyaWVmIExlbmd0aCBvZiB0aGUgc2VxdWVuY2UgZGVmaW5pbmcgZnJhbWUgbGF5ZXIgbWVtYmVyc2hpcAorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHZhbHVlIHNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGF0IGRlZmluZXMgdGhlCisgICAgICAgICAqIG1lbWJlcnNoaXAgb2YgZnJhbWVzIHRvIGxheWVycy4gRm9yIGV4YW1wbGUsIGlmIHRzX3BlcmlvZGljaXR5PTggdGhlbgorICAgICAgICAgKiBmcmFtZXMgYXJlIGFzc2lnbmVkIHRvIGNvZGluZyBsYXllcnMgd2l0aCBhIHJlcGVhdGVkIHNlcXVlbmNlIG9mCisgICAgICAgICAqIGxlbmd0aCA4LgorICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICB0c19wZXJpb2RpY2l0eTsKKworICAgICAgICAvKiFcYnJpZWYgVGVtcGxhdGUgZGVmaW5pbmcgdGhlIG1lbWJlcnNoaXAgb2YgZnJhbWVzIHRvIGNvZGluZyBsYXllcnMKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBhcnJheSBkZWZpbmVzIHRoZSBtZW1iZXJzaGlwIG9mIGZyYW1lcyB0byBjb2RpbmcgbGF5ZXJzLiBGb3IgYQorICAgICAgICAgKiAyLWxheWVyIGVuY29kaW5nIHRoYXQgYXNzaWducyBldmVuIG51bWJlcmVkIGZyYW1lcyB0byBvbmUgbGF5ZXIgKDApCisgICAgICAgICAqIGFuZCBvZGQgbnVtYmVyZWQgZnJhbWVzIHRvIGEgc2Vjb25kIGxheWVyICgxKSB3aXRoIHRzX3BlcmlvZGljaXR5PTgsCisgICAgICAgICAqIHRoZW4gdHNfbGF5ZXJfaWQgPSAoMCwxLDAsMSwwLDEsMCwxKS4KKyAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgdHNfbGF5ZXJfaWRbVlBYX1RTX01BWF9QRVJJT0RJQ0lUWV07CisgICAgfSB2cHhfY29kZWNfZW5jX2NmZ190OyAvKio8IGFsaWFzIGZvciBzdHJ1Y3QgdnB4X2NvZGVjX2VuY19jZmcgKi8KKworCisgICAgLyohXGJyaWVmIEluaXRpYWxpemUgYW4gZW5jb2RlciBpbnN0YW5jZQorICAgICAqCisgICAgICogSW5pdGlhbGl6ZXMgYSBlbmNvZGVyIGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGludGVyZmFjZS4gQXBwbGljYXRpb25zCisgICAgICogc2hvdWxkIGNhbGwgdGhlIHZweF9jb2RlY19lbmNfaW5pdCBjb252ZW5pZW5jZSBtYWNybyBpbnN0ZWFkIG9mIHRoaXMKKyAgICAgKiBmdW5jdGlvbiBkaXJlY3RseSwgdG8gZW5zdXJlIHRoYXQgdGhlIEFCSSB2ZXJzaW9uIG51bWJlciBwYXJhbWV0ZXIKKyAgICAgKiBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIElmIHRoZSBsaWJyYXJ5IHdhcyBjb25maWd1cmVkIHdpdGggLS1kaXNhYmxlLW11bHRpdGhyZWFkLCB0aGlzIGNhbGwKKyAgICAgKiBpcyBub3QgdGhyZWFkIHNhZmUgYW5kIHNob3VsZCBiZSBndWFyZGVkIHdpdGggYSBsb2NrIGlmIGJlaW5nIHVzZWQKKyAgICAgKiBpbiBhIG11bHRpdGhyZWFkZWQgY29udGV4dC4KKyAgICAgKgorICAgICAqIEluIFhNQSBtb2RlIChhY3RpdmF0ZWQgYnkgc2V0dGluZyBWUFhfQ09ERUNfVVNFX1hNQSBpbiB0aGUgZmxhZ3MKKyAgICAgKiBwYXJhbWV0ZXIpLCB0aGUgc3RvcmFnZSBwb2ludGVkIHRvIGJ5IHRoZSBjZmcgcGFyYW1ldGVyIG11c3QgYmUKKyAgICAgKiBrZXB0IHJlYWRhYmxlIGFuZCBzdGFibGUgdW50aWwgYWxsIG1lbW9yeSBtYXBzIGhhdmUgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dC4KKyAgICAgKiBccGFyYW1baW5dICAgIGlmYWNlICAgUG9pbnRlciB0byB0aGUgYWxnb3JpdGhtIGludGVyZmFjZSB0byB1c2UuCisgICAgICogXHBhcmFtW2luXSAgICBjZmcgICAgIENvbmZpZ3VyYXRpb24gdG8gdXNlLCBpZiBrbm93bi4gTWF5IGJlIE5VTEwuCisgICAgICogXHBhcmFtW2luXSAgICBmbGFncyAgIEJpdGZpZWxkIG9mIFZQWF9DT0RFQ19VU0VfKiBmbGFncworICAgICAqIFxwYXJhbVtpbl0gICAgdmVyICAgICBBQkkgdmVyc2lvbiBudW1iZXIuIE11c3QgYmUgc2V0IHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgICAgICogICAgIFRoZSBkZWNvZGVyIGFsZ29yaXRobSBpbml0aWFsaXplZC4KKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfTUVNX0VSUk9SCisgICAgICogICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2VuY19pbml0X3Zlcih2cHhfY29kZWNfY3R4X3QgICAgICAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pZmFjZV90ICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19mbGFnc190ICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdmVyKTsKKworCisgICAgLyohXGJyaWVmIENvbnZlbmllbmNlIG1hY3JvIGZvciB2cHhfY29kZWNfZW5jX2luaXRfdmVyKCkKKyAgICAgKgorICAgICAqIEVuc3VyZXMgdGhlIEFCSSB2ZXJzaW9uIHBhcmFtZXRlciBpcyBwcm9wZXJseSBzZXQuCisgICAgICovCisjZGVmaW5lIHZweF9jb2RlY19lbmNfaW5pdChjdHgsIGlmYWNlLCBjZmcsIGZsYWdzKSBcCisgICAgdnB4X2NvZGVjX2VuY19pbml0X3ZlcihjdHgsIGlmYWNlLCBjZmcsIGZsYWdzLCBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTikKKworCisgICAgLyohXGJyaWVmIEluaXRpYWxpemUgbXVsdGktZW5jb2RlciBpbnN0YW5jZQorICAgICAqCisgICAgICogSW5pdGlhbGl6ZXMgbXVsdGktZW5jb2RlciBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBpbnRlcmZhY2UuCisgICAgICogQXBwbGljYXRpb25zIHNob3VsZCBjYWxsIHRoZSB2cHhfY29kZWNfZW5jX2luaXRfbXVsdGkgY29udmVuaWVuY2UgbWFjcm8KKyAgICAgKiBpbnN0ZWFkIG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHksIHRvIGVuc3VyZSB0aGF0IHRoZSBBQkkgdmVyc2lvbiBudW1iZXIKKyAgICAgKiBwYXJhbWV0ZXIgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBJbiBYTUEgbW9kZSAoYWN0aXZhdGVkIGJ5IHNldHRpbmcgVlBYX0NPREVDX1VTRV9YTUEgaW4gdGhlIGZsYWdzCisgICAgICogcGFyYW1ldGVyKSwgdGhlIHN0b3JhZ2UgcG9pbnRlZCB0byBieSB0aGUgY2ZnIHBhcmFtZXRlciBtdXN0IGJlCisgICAgICoga2VwdCByZWFkYWJsZSBhbmQgc3RhYmxlIHVudGlsIGFsbCBtZW1vcnkgbWFwcyBoYXZlIGJlZW4gc2V0LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQuCisgICAgICogXHBhcmFtW2luXSAgICBpZmFjZSAgIFBvaW50ZXIgdG8gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgdG8gdXNlLgorICAgICAqIFxwYXJhbVtpbl0gICAgY2ZnICAgICBDb25maWd1cmF0aW9uIHRvIHVzZSwgaWYga25vd24uIE1heSBiZSBOVUxMLgorICAgICAqIFxwYXJhbVtpbl0gICAgbnVtX2VuYyBUb3RhbCBudW1iZXIgb2YgZW5jb2RlcnMuCisgICAgICogXHBhcmFtW2luXSAgICBmbGFncyAgIEJpdGZpZWxkIG9mIFZQWF9DT0RFQ19VU0VfKiBmbGFncworICAgICAqIFxwYXJhbVtpbl0gICAgZHNmICAgICBQb2ludGVyIHRvIGRvd24tc2FtcGxpbmcgZmFjdG9ycy4KKyAgICAgKiBccGFyYW1baW5dICAgIHZlciAgICAgQUJJIHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIHNldCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTgorICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19PSworICAgICAqICAgICBUaGUgZGVjb2RlciBhbGdvcml0aG0gaW5pdGlhbGl6ZWQuCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX01FTV9FUlJPUgorICAgICAqICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgICovCisgICAgdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19lbmNfaW5pdF9tdWx0aV92ZXIodnB4X2NvZGVjX2N0eF90ICAgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfdCAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCAgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbnVtX2VuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZmxhZ3NfdCAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X3JhdGlvbmFsX3QgICAgICAgKmRzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdmVyKTsKKworCisgICAgLyohXGJyaWVmIENvbnZlbmllbmNlIG1hY3JvIGZvciB2cHhfY29kZWNfZW5jX2luaXRfbXVsdGlfdmVyKCkKKyAgICAgKgorICAgICAqIEVuc3VyZXMgdGhlIEFCSSB2ZXJzaW9uIHBhcmFtZXRlciBpcyBwcm9wZXJseSBzZXQuCisgICAgICovCisjZGVmaW5lIHZweF9jb2RlY19lbmNfaW5pdF9tdWx0aShjdHgsIGlmYWNlLCBjZmcsIG51bV9lbmMsIGZsYWdzLCBkc2YpIFwKKyAgICB2cHhfY29kZWNfZW5jX2luaXRfbXVsdGlfdmVyKGN0eCwgaWZhY2UsIGNmZywgbnVtX2VuYywgZmxhZ3MsIGRzZiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04pCisKKworICAgIC8qIVxicmllZiBHZXQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIEluaXRpYWxpemVzIGEgZW5jb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzLiBTdXBwb3J0cworICAgICAqIHRoZSBub3Rpb24gb2YgInVzYWdlcyIgc28gdGhhdCBhbiBhbGdvcml0aG0gbWF5IG9mZmVyIGRpZmZlcmVudCBkZWZhdWx0CisgICAgICogc2V0dGluZ3MgZGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3MgaW50ZW5kZWQgZ29hbC4gVGhpcyBmdW5jdGlvbiBccmVmIFNIT1VMRAorICAgICAqIGJlIGNhbGxlZCBieSBhbGwgYXBwbGljYXRpb25zIHRvIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICAgICogYmVmb3JlIHNwZWNpYWxpemluZyB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGFwcGxpY2F0aW9uIHNwZWNpZmljIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgaWZhY2UgICBQb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlIHRvIHVzZS4KKyAgICAgKiBccGFyYW1bb3V0XSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbiBidWZmZXIgdG8gcG9wdWxhdGUKKyAgICAgKiBccGFyYW1baW5dICAgIHVzYWdlICAgRW5kIHVzYWdlLiBTZXQgdG8gMCBvciB1c2UgY29kZWMgc3BlY2lmaWMgdmFsdWVzLgorICAgICAqCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgICAgICogICAgIFRoZSBjb25maWd1cmF0aW9uIHdhcyBwb3B1bGF0ZWQuCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOQ0FQQUJMRQorICAgICAqICAgICBJbnRlcmZhY2UgaXMgbm90IGFuIGVuY29kZXIgaW50ZXJmYWNlLgorICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19JTlZBTElEX1BBUkFNCisgICAgICogICAgIEEgcGFyYW1ldGVyIHdhcyBOVUxMLCBvciB0aGUgdXNhZ2UgdmFsdWUgd2FzIG5vdCByZWNvZ25pemVkLgorICAgICAqLworICAgIHZweF9jb2RlY19lcnJfdCAgdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdCh2cHhfY29kZWNfaWZhY2VfdCAgICAqaWZhY2UsCisgICAgICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAorICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIHVzYWdlKTsKKworCisgICAgLyohXGJyaWVmIFNldCBvciBjaGFuZ2UgY29uZmlndXJhdGlvbgorICAgICAqCisgICAgICogUmVjb25maWd1cmVzIGFuIGVuY29kZXIgaW5zdGFuY2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW5dICAgIGNmZyAgICAgQ29uZmlndXJhdGlvbiBidWZmZXIgdG8gdXNlCisgICAgICoKKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKKyAgICAgKiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gd2FzIHBvcHVsYXRlZC4KKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfSU5DQVBBQkxFCisgICAgICogICAgIEludGVyZmFjZSBpcyBub3QgYW4gZW5jb2RlciBpbnRlcmZhY2UuCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOVkFMSURfUEFSQU0KKyAgICAgKiAgICAgQSBwYXJhbWV0ZXIgd2FzIE5VTEwsIG9yIHRoZSB1c2FnZSB2YWx1ZSB3YXMgbm90IHJlY29nbml6ZWQuCisgICAgICovCisgICAgdnB4X2NvZGVjX2Vycl90ICB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXQodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgKmN0eCwKKyAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgICpjZmcpOworCisKKyAgICAvKiFcYnJpZWYgR2V0IGdsb2JhbCBzdHJlYW0gaGVhZGVycworICAgICAqCisgICAgICogUmV0cmlldmVzIGEgc3RyZWFtIGxldmVsIGdsb2JhbCBoZWFkZXIgcGFja2V0LCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKgorICAgICAqIFxyZXR2YWwgTlVMTAorICAgICAqICAgICBFbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2xvYmFsIGhlYWRlcgorICAgICAqIFxyZXR2YWwgTm9uLU5VTEwKKyAgICAgKiAgICAgUG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBnbG9iYWwgaGVhZGVyIHBhY2tldAorICAgICAqLworICAgIHZweF9maXhlZF9idWZfdCAqdnB4X2NvZGVjX2dldF9nbG9iYWxfaGVhZGVycyh2cHhfY29kZWNfY3R4X3QgICAqY3R4KTsKKworCisjZGVmaW5lIFZQWF9ETF9SRUFMVElNRSAgICAgKDEpICAgICAgICAvKio8IGRlYWRsaW5lIHBhcmFtZXRlciBhbmFsb2dvdXMgdG8KKyAgICAqICAgVlB4IFJFQUxUSU1FIG1vZGUuICovCisjZGVmaW5lIFZQWF9ETF9HT09EX1FVQUxJVFkgKDEwMDAwMDApICAvKio8IGRlYWRsaW5lIHBhcmFtZXRlciBhbmFsb2dvdXMgdG8KKyAgICAqICAgVlB4IEdPT0QgUVVBTElUWSBtb2RlLiAqLworI2RlZmluZSBWUFhfRExfQkVTVF9RVUFMSVRZICgwKSAgICAgICAgLyoqPCBkZWFkbGluZSBwYXJhbWV0ZXIgYW5hbG9nb3VzIHRvCisgICAgKiAgIFZQeCBCRVNUIFFVQUxJVFkgbW9kZS4gKi8KKyAgICAvKiFcYnJpZWYgRW5jb2RlIGEgZnJhbWUKKyAgICAgKgorICAgICAqIEVuY29kZXMgYSB2aWRlbyBmcmFtZSBhdCB0aGUgZ2l2ZW4gInByZXNlbnRhdGlvbiB0aW1lLiIgVGhlIHByZXNlbnRhdGlvbgorICAgICAqIHRpbWUgc3RhbXAgKFBUUykgXHJlZiBNVVNUIGJlIHN0cmljdGx5IGluY3JlYXNpbmcuCisgICAgICoKKyAgICAgKiBUaGUgZW5jb2RlciBzdXBwb3J0cyB0aGUgbm90aW9uIG9mIGEgc29mdCByZWFsLXRpbWUgZGVhZGxpbmUuIEdpdmVuIGEKKyAgICAgKiBub24temVybyB2YWx1ZSB0byB0aGUgZGVhZGxpbmUgcGFyYW1ldGVyLCB0aGUgZW5jb2RlciB3aWxsIG1ha2UgYSAiYmVzdAorICAgICAqIGVmZm9ydCIgZ3VhcmFudGVlIHRvICByZXR1cm4gYmVmb3JlIHRoZSBnaXZlbiB0aW1lIHNsaWNlIGV4cGlyZXMuIEl0IGlzCisgICAgICogaW1wbGljaXQgdGhhdCBsaW1pdGluZyB0aGUgYXZhaWxhYmxlIHRpbWUgdG8gZW5jb2RlIHdpbGwgZGVncmFkZSB0aGUKKyAgICAgKiBvdXRwdXQgcXVhbGl0eS4gVGhlIGVuY29kZXIgY2FuIGJlIGdpdmVuIGFuIHVubGltaXRlZCB0aW1lIHRvIHByb2R1Y2UgdGhlCisgICAgICogYmVzdCBwb3NzaWJsZSBmcmFtZSBieSBzcGVjaWZ5aW5nIGEgZGVhZGxpbmUgb2YgJzAnLiBUaGlzIGRlYWRsaW5lCisgICAgICogc3VwZXJjZWRlcyB0aGUgVlB4IG5vdGlvbiBvZiAiYmVzdCBxdWFsaXR5LCBnb29kIHF1YWxpdHksIHJlYWx0aW1lIi4KKyAgICAgKiBBcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIG1hcCB0aGVzZSBmb3JtZXIgc2V0dGluZ3MgdG8gdGhlIG5ldyBkZWFkbGluZQorICAgICAqIGJhc2VkIHN5c3RlbSBjYW4gdXNlIHRoZSBzeW1ib2xzICNWUFhfRExfUkVBTFRJTUUsICNWUFhfRExfR09PRF9RVUFMSVRZLAorICAgICAqIGFuZCAjVlBYX0RMX0JFU1RfUVVBTElUWS4KKyAgICAgKgorICAgICAqIFdoZW4gdGhlIGxhc3QgZnJhbWUgaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBlbmNvZGVyLCB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICAgICAqIGNvbnRpbnVlIHRvIGJlIGNhbGxlZCwgd2l0aCB0aGUgaW1nIHBhcmFtZXRlciBzZXQgdG8gTlVMTC4gVGhpcyB3aWxsCisgICAgICogc2lnbmFsIHRoZSBlbmQtb2Ytc3RyZWFtIGNvbmRpdGlvbiB0byB0aGUgZW5jb2RlciBhbmQgYWxsb3cgaXQgdG8gZW5jb2RlCisgICAgICogYW55IGhlbGQgYnVmZmVycy4gRW5jb2RpbmcgaXMgY29tcGxldGUgd2hlbiB2cHhfY29kZWNfZW5jb2RlKCkgaXMgY2FsbGVkCisgICAgICogYW5kIHZweF9jb2RlY19nZXRfY3hfZGF0YSgpIHJldHVybnMgbm8gZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgY3R4ICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW5dICAgIGltZyAgICAgICBJbWFnZSBkYXRhIHRvIGVuY29kZSwgTlVMTCB0byBmbHVzaC4KKyAgICAgKiBccGFyYW1baW5dICAgIHB0cyAgICAgICBQcmVzZW50YXRpb24gdGltZSBzdGFtcCwgaW4gdGltZWJhc2UgdW5pdHMuCisgICAgICogXHBhcmFtW2luXSAgICBkdXJhdGlvbiAgRHVyYXRpb24gdG8gc2hvdyBmcmFtZSwgaW4gdGltZWJhc2UgdW5pdHMuCisgICAgICogXHBhcmFtW2luXSAgICBmbGFncyAgICAgRmxhZ3MgdG8gdXNlIGZvciBlbmNvZGluZyB0aGlzIGZyYW1lLgorICAgICAqIFxwYXJhbVtpbl0gICAgZGVhZGxpbmUgIFRpbWUgdG8gc3BlbmQgZW5jb2RpbmcsIGluIG1pY3Jvc2Vjb25kcy4gKDA9aW5maW5pdGUpCisgICAgICoKKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKKyAgICAgKiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gd2FzIHBvcHVsYXRlZC4KKyAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfSU5DQVBBQkxFCisgICAgICogICAgIEludGVyZmFjZSBpcyBub3QgYW4gZW5jb2RlciBpbnRlcmZhY2UuCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOVkFMSURfUEFSQU0KKyAgICAgKiAgICAgQSBwYXJhbWV0ZXIgd2FzIE5VTEwsIHRoZSBpbWFnZSBmb3JtYXQgaXMgdW5zdXBwb3J0ZWQsIGV0Yy4KKyAgICAgKi8KKyAgICB2cHhfY29kZWNfZXJyX3QgIHZweF9jb2RlY19lbmNvZGUodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgICAgICAgICAgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3B0c190ICAgICAgICAgICAgIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBkZWFkbGluZSk7CisKKyAgICAvKiFcYnJpZWYgU2V0IGNvbXByZXNzZWQgZGF0YSBvdXRwdXQgYnVmZmVyCisgICAgICoKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdGhhdCB0aGUgY29kZWMgc2hvdWxkIG91dHB1dCB0aGUgY29tcHJlc3NlZCBkYXRhCisgICAgICogaW50by4gVGhpcyBjYWxsIGVmZmVjdGl2ZWx5IHNldHMgdGhlIGJ1ZmZlciBwb2ludGVyIHJldHVybmVkIGluIHRoZQorICAgICAqIG5leHQgVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCBwYWNrZXQuIFN1YnNlcXVlbnQgcGFja2V0cyB3aWxsIGJlCisgICAgICogYXBwZW5kZWQgaW50byB0aGlzIGJ1ZmZlci4gVGhlIGJ1ZmZlciBpcyBwcmVzZXJ2ZWQgYWNyb3NzIGZyYW1lcywKKyAgICAgKiBzbyBhcHBsaWNhdGlvbnMgbXVzdCBwZXJpb2RpY2FsbHkgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIGZsdXNoaW5nCisgICAgICogdGhlIGFjY3VtdWxhdGVkIGNvbXByZXNzZWQgZGF0YSB0byBkaXNrIG9yIHRvIHRoZSBuZXR3b3JrIHRvIHJlc2V0CisgICAgICogdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlcidzIGhlYWQuCisgICAgICoKKyAgICAgKiBgcGFkX2JlZm9yZWAgYnl0ZXMgd2lsbCBiZSBza2lwcGVkIGJlZm9yZSB3cml0aW5nIHRoZSBjb21wcmVzc2VkCisgICAgICogZGF0YSwgYW5kIGBwYWRfYWZ0ZXJgIGJ5dGVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHBhY2tldC4gVGhlIHNpemUKKyAgICAgKiBvZiB0aGUgcGFja2V0IHdpbGwgYmUgdGhlIHN1bSBvZiB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsIGNvbXByZXNzZWQKKyAgICAgKiBkYXRhLCBwYWRfYmVmb3JlLCBhbmQgcGFkX2FmdGVyLiBUaGUgcGFkZGluZyBieXRlcyB3aWxsIGJlIHByZXNlcnZlZAorICAgICAqIChub3Qgb3ZlcndyaXR0ZW4pLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgcmV0dXJuZWQKKyAgICAgKiBjb21wcmVzc2VkIGRhdGEgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gSW4gdGhlCisgICAgICogZXZlbnQgdGhhdCB0aGUgZW5jb2RlZCBkYXRhIHdpbGwgbm90IGZpdCBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZWQsCisgICAgICogdGhlIHJldHVybmVkIHBhY2tldCBccmVmIE1BWSBwb2ludCB0byBhbiBpbnRlcm5hbCBidWZmZXIsIGFzIGl0IHdvdWxkCisgICAgICogaWYgdGhpcyBjYWxsIHdlcmUgbmV2ZXIgdXNlZC4gSW4gdGhpcyBldmVudCwgdGhlIG91dHB1dCBwYWNrZXQgd2lsbAorICAgICAqIE5PVCBoYXZlIGFueSBwYWRkaW5nLCBhbmQgdGhlIGFwcGxpY2F0aW9uIG11c3QgZnJlZSBzcGFjZSBhbmQgY29weSBpdAorICAgICAqIHRvIHRoZSBwcm9wZXIgcGxhY2UuIFRoaXMgaXMgb2YgcGFydGljdWxhciBub3RlIGluIGNvbmZpZ3VyYXRpb25zCisgICAgICogdGhhdCBtYXkgb3V0cHV0IG11bHRpcGxlIHBhY2tldHMgZm9yIGEgc2luZ2xlIGVuY29kZWQgZnJhbWUgKGUuZy4sIGxhZ2dlZAorICAgICAqIGVuY29kaW5nKSBvciBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVzZXQgdGhlIGJ1ZmZlciBwZXJpb2RpY2FsbHkuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbnMgbWF5IHJlc3RvcmUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGNvZGVjIHByb3ZpZGluZworICAgICAqIHRoZSBjb21wcmVzc2VkIGRhdGEgYnVmZmVyIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGEgTlVMTAorICAgICAqIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9ucyBccmVmIE1VU1ROT1QgY2FsbCB0aGlzIGZ1bmN0aW9uIGR1cmluZyBpdGVyYXRpb24gb2YKKyAgICAgKiB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgY3R4ICAgICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAorICAgICAqIFxwYXJhbVtpbl0gICAgYnVmICAgICAgICAgQnVmZmVyIHRvIHN0b3JlIGNvbXByZXNzZWQgZGF0YSBpbnRvCisgICAgICogXHBhcmFtW2luXSAgICBwYWRfYmVmb3JlICBCeXRlcyB0byBza2lwIGJlZm9yZSB3cml0aW5nIGNvbXByZXNzZWQgZGF0YQorICAgICAqIFxwYXJhbVtpbl0gICAgcGFkX2FmdGVyICAgQnl0ZXMgdG8gc2tpcCBhZnRlciB3cml0aW5nIGNvbXByZXNzZWQgZGF0YQorICAgICAqCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCisgICAgICogICAgIFRoZSBidWZmZXIgd2FzIHNldCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOVkFMSURfUEFSQU0KKyAgICAgKiAgICAgQSBwYXJhbWV0ZXIgd2FzIE5VTEwsIHRoZSBpbWFnZSBmb3JtYXQgaXMgdW5zdXBwb3J0ZWQsIGV0Yy4KKyAgICAgKi8KKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3NldF9jeF9kYXRhX2J1Zih2cHhfY29kZWNfY3R4X3QgICAgICAgKmN0eCwKKyAgICAgICAgICAgIGNvbnN0IHZweF9maXhlZF9idWZfdCAqYnVmLAorICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBwYWRfYmVmb3JlLAorICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBwYWRfYWZ0ZXIpOworCisKKyAgICAvKiFcYnJpZWYgRW5jb2RlZCBkYXRhIGl0ZXJhdG9yCisgICAgICoKKyAgICAgKiBJdGVyYXRlcyBvdmVyIGEgbGlzdCBvZiBkYXRhIHBhY2tldHMgdG8gYmUgcGFzc2VkIGZyb20gdGhlIGVuY29kZXIgdG8gdGhlCisgICAgICogYXBwbGljYXRpb24uIFRoZSBkaWZmZXJlbnQga2luZHMgb2YgcGFja2V0cyBhdmFpbGFibGUgYXJlIGVudW1lcmF0ZWQgaW4KKyAgICAgKiAjdnB4X2NvZGVjX2N4X3BrdF9raW5kLgorICAgICAqCisgICAgICogI1ZQWF9DT0RFQ19DWF9GUkFNRV9QS1QgcGFja2V0cyBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbidzCisgICAgICogbXV4ZXIuIE11bHRpcGxlIGNvbXByZXNzZWQgZnJhbWVzIG1heSBiZSBpbiB0aGUgbGlzdC4KKyAgICAgKiAjVlBYX0NPREVDX1NUQVRTX1BLVCBwYWNrZXRzIHNob3VsZCBiZSBhcHBlbmRlZCB0byBhIGdsb2JhbCBidWZmZXIuCisgICAgICoKKyAgICAgKiBUaGUgYXBwbGljYXRpb24gXHJlZiBNVVNUIHNpbGVudGx5IGlnbm9yZSBhbnkgcGFja2V0IGtpbmRzIHRoYXQgaXQgZG9lcworICAgICAqIG5vdCByZWNvZ25pemUgb3Igc3VwcG9ydC4KKyAgICAgKgorICAgICAqIFRoZSBkYXRhIGJ1ZmZlcnMgcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKKyAgICAgKiB2YWxpZCB1bnRpbCB0aGUgYXBwbGljYXRpb24gbWFrZXMgYW5vdGhlciBjYWxsIHRvIGFueSB2cHhfY29kZWNfKiBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgIGN0eCAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKiBccGFyYW1baW4sb3V0XSBpdGVyICAgICBJdGVyYXRvciBzdG9yYWdlLCBpbml0aWFsaXplZCB0byBOVUxMCisgICAgICoKKyAgICAgKiBccmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGFuIG91dHB1dCBkYXRhIHBhY2tldCAoY29tcHJlc3NlZCBmcmFtZSBkYXRhLAorICAgICAqICAgICAgICAgdHdvLXBhc3Mgc3RhdGlzdGljcywgZXRjLikgb3IgTlVMTCB0byBzaWduYWwgZW5kLW9mLWxpc3QuCisgICAgICoKKyAgICAgKi8KKyAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnZweF9jb2RlY19nZXRfY3hfZGF0YSh2cHhfY29kZWNfY3R4X3QgICAqY3R4LAorICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgKml0ZXIpOworCisKKyAgICAvKiFcYnJpZWYgR2V0IFByZXZpZXcgRnJhbWUKKyAgICAgKgorICAgICAqIFJldHVybnMgYW4gaW1hZ2UgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHByZXZpZXcuIFNob3dzIHRoZSBpbWFnZSBhcyBpdCB3b3VsZAorICAgICAqIGV4aXN0IGF0IHRoZSBkZWNvbXByZXNzb3IuIFRoZSBhcHBsaWNhdGlvbiBccmVmIE1VU1QgTk9UIHdyaXRlIGludG8gdGhpcworICAgICAqIGltYWdlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgIGN0eCAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKKyAgICAgKgorICAgICAqIFxyZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBwcmV2aWV3IGltYWdlLCBvciBOVUxMIGlmIG5vIGltYWdlIGlzCisgICAgICogICAgICAgICBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKi8KKyAgICBjb25zdCB2cHhfaW1hZ2VfdCAqdnB4X2NvZGVjX2dldF9wcmV2aWV3X2ZyYW1lKHZweF9jb2RlY19jdHhfdCAgICpjdHgpOworCisKKyAgICAvKiFAfSAtIGVuZCBkZWZncm91cCBlbmNvZGVyKi8KKworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweC92cHhfaW1hZ2UuaCBiL2xpYnZweC92cHgvdnB4X2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MjQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHgvdnB4X2ltYWdlLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiFcZmlsZQorICogXGJyaWVmIERlc2NyaWJlcyB0aGUgdnB4IGltYWdlIGRlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgb3BlcmF0aW9ucworICoKKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIFZQWF9JTUFHRV9ICisjZGVmaW5lIFZQWF9JTUFHRV9ICisKKyAgICAvKiFcYnJpZWYgQ3VycmVudCBBQkkgdmVyc2lvbiBudW1iZXIKKyAgICAgKgorICAgICAqIFxpbnRlcm5hbAorICAgICAqIElmIHRoaXMgZmlsZSBpcyBhbHRlcmVkIGluIGFueSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBBQkksIHRoaXMgdmFsdWUKKyAgICAgKiBtdXN0IGJlIGJ1bXBlZC4gIEV4YW1wbGVzIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIGNoYW5naW5nCisgICAgICogdHlwZXMsIHJlbW92aW5nIG9yIHJlYXNzaWduaW5nIGVudW1zLCBhZGRpbmcvcmVtb3ZpbmcvcmVhcnJhbmdpbmcKKyAgICAgKiBmaWVsZHMgdG8gc3RydWN0dXJlcworICAgICAqLworI2RlZmluZSBWUFhfSU1BR0VfQUJJX1ZFUlNJT04gKDEpIC8qKjxcaGlkZWluaXRpYWxpemVyKi8KKworCisjZGVmaW5lIFZQWF9JTUdfRk1UX1BMQU5BUiAgICAgMHgxMDAgIC8qKjwgSW1hZ2UgaXMgYSBwbGFuYXIgZm9ybWF0ICovCisjZGVmaW5lIFZQWF9JTUdfRk1UX1VWX0ZMSVAgICAgMHgyMDAgIC8qKjwgViBwbGFuZSBwcmVjZWRlcyBVIHBsYW5lIGluIG1lbW9yeSAqLworI2RlZmluZSBWUFhfSU1HX0ZNVF9IQVNfQUxQSEEgIDB4NDAwICAvKio8IEltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIGNvbXBvbmVudCAqLworCisKKyAgICAvKiFcYnJpZWYgTGlzdCBvZiBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0cyAqLworICAgIHR5cGVkZWYgZW51bSB2cHhfaW1nX2ZtdCB7CisgICAgICAgIFZQWF9JTUdfRk1UX05PTkUsCisgICAgICAgIFZQWF9JTUdfRk1UX1JHQjI0LCAgIC8qKjwgMjQgYml0IHBlciBwaXhlbCBwYWNrZWQgUkdCICovCisgICAgICAgIFZQWF9JTUdfRk1UX1JHQjMyLCAgIC8qKjwgMzIgYml0IHBlciBwaXhlbCBwYWNrZWQgMFJHQiAqLworICAgICAgICBWUFhfSU1HX0ZNVF9SR0I1NjUsICAvKio8IDE2IGJpdCBwZXIgcGl4ZWwsIDU2NSAqLworICAgICAgICBWUFhfSU1HX0ZNVF9SR0I1NTUsICAvKio8IDE2IGJpdCBwZXIgcGl4ZWwsIDU1NSAqLworICAgICAgICBWUFhfSU1HX0ZNVF9VWVZZLCAgICAvKio8IFVZVlkgcGFja2VkIFlVViAqLworICAgICAgICBWUFhfSU1HX0ZNVF9ZVVkyLCAgICAvKio8IFlVWVYgcGFja2VkIFlVViAqLworICAgICAgICBWUFhfSU1HX0ZNVF9ZVllVLCAgICAvKio8IFlWWVUgcGFja2VkIFlVViAqLworICAgICAgICBWUFhfSU1HX0ZNVF9CR1IyNCwgICAvKio8IDI0IGJpdCBwZXIgcGl4ZWwgcGFja2VkIEJHUiAqLworICAgICAgICBWUFhfSU1HX0ZNVF9SR0IzMl9MRSwgLyoqPCAzMiBiaXQgcGFja2VkIEJHUjAgKi8KKyAgICAgICAgVlBYX0lNR19GTVRfQVJHQiwgICAgIC8qKjwgMzIgYml0IHBhY2tlZCBBUkdCLCBhbHBoYT0yNTUgKi8KKyAgICAgICAgVlBYX0lNR19GTVRfQVJHQl9MRSwgIC8qKjwgMzIgYml0IHBhY2tlZCBCR1JBLCBhbHBoYT0yNTUgKi8KKyAgICAgICAgVlBYX0lNR19GTVRfUkdCNTY1X0xFLCAgLyoqPCAxNiBiaXQgcGVyIHBpeGVsLCBnZ2diYmJiYiBycnJycmdnZyAqLworICAgICAgICBWUFhfSU1HX0ZNVF9SR0I1NTVfTEUsICAvKio8IDE2IGJpdCBwZXIgcGl4ZWwsIGdnZ2JiYmJiIDBycnJycmdnICovCisgICAgICAgIFZQWF9JTUdfRk1UX1lWMTIgICAgPSBWUFhfSU1HX0ZNVF9QTEFOQVIgfCBWUFhfSU1HX0ZNVF9VVl9GTElQIHwgMSwgLyoqPCBwbGFuYXIgWVZVICovCisgICAgICAgIFZQWF9JTUdfRk1UX0k0MjAgICAgPSBWUFhfSU1HX0ZNVF9QTEFOQVIgfCAyLAorICAgICAgICBWUFhfSU1HX0ZNVF9WUFhZVjEyID0gVlBYX0lNR19GTVRfUExBTkFSIHwgVlBYX0lNR19GTVRfVVZfRkxJUCB8IDMsIC8qKiA8IHBsYW5hciA0OjI6MCBmb3JtYXQgd2l0aCB2cHggY29sb3Igc3BhY2UgKi8KKyAgICAgICAgVlBYX0lNR19GTVRfVlBYSTQyMCA9IFZQWF9JTUdfRk1UX1BMQU5BUiB8IDQgICAvKiogPCBwbGFuYXIgNDoyOjAgZm9ybWF0IHdpdGggdnB4IGNvbG9yIHNwYWNlICovCisgICAgfQorICAgIHZweF9pbWdfZm10X3Q7IC8qKjwgYWxpYXMgZm9yIGVudW0gdnB4X2ltZ19mbXQgKi8KKworI2lmICFkZWZpbmVkKFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCkgfHwgIVZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVAorI2RlZmluZSBJTUdfRk1UX1BMQU5BUiAgICAgICAgIFZQWF9JTUdfRk1UX1BMQU5BUiAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1BMQU5BUiAqLworI2RlZmluZSBJTUdfRk1UX1VWX0ZMSVAgICAgICAgIFZQWF9JTUdfRk1UX1VWX0ZMSVAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1VWX0ZMSVAgKi8KKyNkZWZpbmUgSU1HX0ZNVF9IQVNfQUxQSEEgICAgICBWUFhfSU1HX0ZNVF9IQVNfQUxQSEEgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9IQVNfQUxQSEEgKi8KKworICAgIC8qIVxicmllZiBEZXByZWNhdGVkIGxpc3Qgb2Ygc3VwcG9ydGVkIGltYWdlIGZvcm1hdHMKKyAgICAgKiBcZGVwcmVjYXRlZCBOZXcgY29kZSBzaG91bGQgdXNlICN2cHhfaW1nX2ZtdAorICAgICAqLworI2RlZmluZSBpbWdfZm10ICAgdnB4X2ltZ19mbXQKKyAgICAvKiFcYnJpZWYgYWxpYXMgZm9yIGVudW0gaW1nX2ZtdC4KKyAgICAgKiBcZGVwcmVjYXRlZCBOZXcgY29kZSBzaG91bGQgdXNlICN2cHhfaW1nX2ZtdF90CisgICAgICovCisjZGVmaW5lIGltZ19mbXRfdCB2cHhfaW1nX2ZtdF90CisKKyNkZWZpbmUgSU1HX0ZNVF9OT05FICAgICAgIFZQWF9JTUdfRk1UX05PTkUgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX05PTkUgKi8KKyNkZWZpbmUgSU1HX0ZNVF9SR0IyNCAgICAgIFZQWF9JTUdfRk1UX1JHQjI0ICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1JHQjI0ICovCisjZGVmaW5lIElNR19GTVRfUkdCMzIgICAgICBWUFhfSU1HX0ZNVF9SR0IzMiAgICAgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0IzMiAqLworI2RlZmluZSBJTUdfRk1UX1JHQjU2NSAgICAgVlBYX0lNR19GTVRfUkdCNTY1ICAgICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfUkdCNTY1ICovCisjZGVmaW5lIElNR19GTVRfUkdCNTU1ICAgICBWUFhfSU1HX0ZNVF9SR0I1NTUgICAgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0I1NTUgKi8KKyNkZWZpbmUgSU1HX0ZNVF9VWVZZICAgICAgIFZQWF9JTUdfRk1UX1VZVlkgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1VZVlkgKi8KKyNkZWZpbmUgSU1HX0ZNVF9ZVVkyICAgICAgIFZQWF9JTUdfRk1UX1lVWTIgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1lVWTIgKi8KKyNkZWZpbmUgSU1HX0ZNVF9ZVllVICAgICAgIFZQWF9JTUdfRk1UX1lWWVUgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1lWWVUgKi8KKyNkZWZpbmUgSU1HX0ZNVF9CR1IyNCAgICAgIFZQWF9JTUdfRk1UX0JHUjI0ICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX0JHUjI0ICovCisjZGVmaW5lIElNR19GTVRfUkdCMzJfTEUgICBWUFhfSU1HX0ZNVF9SR0IzMl9MRSAgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0IzMl9MRSAqLworI2RlZmluZSBJTUdfRk1UX0FSR0IgICAgICAgVlBYX0lNR19GTVRfQVJHQiAgICAgICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfQVJHQiAqLworI2RlZmluZSBJTUdfRk1UX0FSR0JfTEUgICAgVlBYX0lNR19GTVRfQVJHQl9MRSAgICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfQVJHQl9MRSAqLworI2RlZmluZSBJTUdfRk1UX1JHQjU2NV9MRSAgVlBYX0lNR19GTVRfUkdCNTY1X0xFICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfUkdCNTY1X0xFICovCisjZGVmaW5lIElNR19GTVRfUkdCNTU1X0xFICBWUFhfSU1HX0ZNVF9SR0I1NTVfTEUgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0I1NTVfTEUgKi8KKyNkZWZpbmUgSU1HX0ZNVF9ZVjEyICAgICAgIFZQWF9JTUdfRk1UX1lWMTIgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1lWMTIgKi8KKyNkZWZpbmUgSU1HX0ZNVF9JNDIwICAgICAgIFZQWF9JTUdfRk1UX0k0MjAgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX0k0MjAgKi8KKyNkZWZpbmUgSU1HX0ZNVF9WUFhZVjEyICAgIFZQWF9JTUdfRk1UX1ZQWFlWMTIgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1ZQWFlWMTIgKi8KKyNkZWZpbmUgSU1HX0ZNVF9WUFhJNDIwICAgIFZQWF9JTUdfRk1UX1ZQWEk0MjAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1ZQWEk0MjAgKi8KKyNlbmRpZiAvKiBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgKi8KKworICAgIC8qKlxicmllZiBJbWFnZSBEZXNjcmlwdG9yICovCisgICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X2ltYWdlCisgICAgeworICAgICAgICB2cHhfaW1nX2ZtdF90IGZtdDsgLyoqPCBJbWFnZSBGb3JtYXQgKi8KKworICAgICAgICAvKiBJbWFnZSBzdG9yYWdlIGRpbWVuc2lvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICB3OyAgIC8qKjwgU3RvcmVkIGltYWdlIHdpZHRoICovCisgICAgICAgIHVuc2lnbmVkIGludCAgaDsgICAvKio8IFN0b3JlZCBpbWFnZSBoZWlnaHQgKi8KKworICAgICAgICAvKiBJbWFnZSBkaXNwbGF5IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICBkX3c7ICAgLyoqPCBEaXNwbGF5ZWQgaW1hZ2Ugd2lkdGggKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICBkX2g7ICAgLyoqPCBEaXNwbGF5ZWQgaW1hZ2UgaGVpZ2h0ICovCisKKyAgICAgICAgLyogQ2hyb21hIHN1YnNhbXBsaW5nIGluZm8gKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICB4X2Nocm9tYV9zaGlmdDsgICAvKio8IHN1YnNhbXBsaW5nIG9yZGVyLCBYICovCisgICAgICAgIHVuc2lnbmVkIGludCAgeV9jaHJvbWFfc2hpZnQ7ICAgLyoqPCBzdWJzYW1wbGluZyBvcmRlciwgWSAqLworCisgICAgICAgIC8qIEltYWdlIGRhdGEgcG9pbnRlcnMuICovCisjZGVmaW5lIFZQWF9QTEFORV9QQUNLRUQgMCAgIC8qKjwgVG8gYmUgdXNlZCBmb3IgYWxsIHBhY2tlZCBmb3JtYXRzICovCisjZGVmaW5lIFZQWF9QTEFORV9ZICAgICAgMCAgIC8qKjwgWSAoTHVtaW5hbmNlKSBwbGFuZSAqLworI2RlZmluZSBWUFhfUExBTkVfVSAgICAgIDEgICAvKio8IFUgKENocm9tYSkgcGxhbmUgKi8KKyNkZWZpbmUgVlBYX1BMQU5FX1YgICAgICAyICAgLyoqPCBWIChDaHJvbWEpIHBsYW5lICovCisjZGVmaW5lIFZQWF9QTEFORV9BTFBIQSAgMyAgIC8qKjwgQSAoVHJhbnNwYXJlbmN5KSBwbGFuZSAqLworI2lmICFkZWZpbmVkKFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCkgfHwgIVZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVAorI2RlZmluZSBQTEFORV9QQUNLRUQgICAgIFZQWF9QTEFORV9QQUNLRUQKKyNkZWZpbmUgUExBTkVfWSAgICAgICAgICBWUFhfUExBTkVfWQorI2RlZmluZSBQTEFORV9VICAgICAgICAgIFZQWF9QTEFORV9VCisjZGVmaW5lIFBMQU5FX1YgICAgICAgICAgVlBYX1BMQU5FX1YKKyNkZWZpbmUgUExBTkVfQUxQSEEgICAgICBWUFhfUExBTkVfQUxQSEEKKyNlbmRpZgorICAgICAgICB1bnNpZ25lZCBjaGFyICpwbGFuZXNbNF07ICAvKio8IHBvaW50ZXIgdG8gdGhlIHRvcCBsZWZ0IHBpeGVsIGZvciBlYWNoIHBsYW5lICovCisgICAgICAgIGludCAgICAgIHN0cmlkZVs0XTsgIC8qKjwgc3RyaWRlIGJldHdlZW4gcm93cyBmb3IgZWFjaCBwbGFuZSAqLworCisgICAgICAgIGludCAgICAgYnBzOyAvKio8IGJpdHMgcGVyIHNhbXBsZSAoZm9yIHBhY2tlZCBmb3JtYXRzKSAqLworCisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgbWVtYmVyIG1heSBiZSBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGFzc29jaWF0ZSBkYXRhCisgICAgICAgICAqIHdpdGggdGhpcyBpbWFnZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgICAgKnVzZXJfcHJpdjsgLyoqPCBtYXkgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBhc3NvY2lhdGUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICogICB3aXRoIHRoaXMgaW1hZ2UuICovCisKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBtZW1iZXJzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUuICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmltZ19kYXRhOyAgICAgICAvKio8IHByaXZhdGUgKi8KKyAgICAgICAgaW50ICAgICAgaW1nX2RhdGFfb3duZXI7IC8qKjwgcHJpdmF0ZSAqLworICAgICAgICBpbnQgICAgICBzZWxmX2FsbG9jZDsgICAgLyoqPCBwcml2YXRlICovCisgICAgfSB2cHhfaW1hZ2VfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9pbWFnZSAqLworCisgICAgLyoqXGJyaWVmIFJlcHJlc2VudGF0aW9uIG9mIGEgcmVjdGFuZ2xlIG9uIGEgc3VyZmFjZSAqLworICAgIHR5cGVkZWYgc3RydWN0IHZweF9pbWFnZV9yZWN0CisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgeDsgLyoqPCBsZWZ0bW9zdCBjb2x1bW4gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHk7IC8qKjwgdG9wbW9zdCByb3cgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHc7IC8qKjwgd2lkdGggKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGg7IC8qKjwgaGVpZ2h0ICovCisgICAgfSB2cHhfaW1hZ2VfcmVjdF90OyAvKio8IGFsaWFzIGZvciBzdHJ1Y3QgdnB4X2ltYWdlX3JlY3QgKi8KKworICAgIC8qIVxicmllZiBPcGVuIGEgZGVzY3JpcHRvciwgYWxsb2NhdGluZyBzdG9yYWdlIGZvciB0aGUgdW5kZXJseWluZyBpbWFnZQorICAgICAqCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHN0b3JpbmcgYW4gaW1hZ2Ugb2YgdGhlIGdpdmVuIGZvcm1hdC4gVGhlCisgICAgICogc3RvcmFnZSBmb3IgdGhlIGRlc2NyaXB0b3IgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgICBpbWcgICAgICAgUG9pbnRlciB0byBzdG9yYWdlIGZvciBkZXNjcmlwdG9yLiBJZiB0aGlzIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwsIHRoZSBzdG9yYWdlIGZvciB0aGUgZGVzY3JpcHRvciB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgorICAgICAqIFxwYXJhbVtpbl0gICAgZm10ICAgICAgIEZvcm1hdCBmb3IgdGhlIGltYWdlCisgICAgICogXHBhcmFtW2luXSAgICBkX3cgICAgICAgV2lkdGggb2YgdGhlIGltYWdlCisgICAgICogXHBhcmFtW2luXSAgICBkX2ggICAgICAgSGVpZ2h0IG9mIHRoZSBpbWFnZQorICAgICAqIFxwYXJhbVtpbl0gICAgYWxpZ24gICAgIEFsaWdubWVudCwgaW4gYnl0ZXMsIG9mIHRoZSBpbWFnZSBidWZmZXIgYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCByb3cgaW4gdGhlIGltYWdlKHN0cmlkZSkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBpbWFnZSBkZXNjcmlwdG9yLiBJZiB0aGUgaW1nCisgICAgICogICAgICAgICBwYXJhbWV0ZXIgaXMgbm9uLW51bGwsIHRoZSB2YWx1ZSBvZiB0aGUgaW1nIHBhcmFtZXRlciB3aWxsIGJlCisgICAgICogICAgICAgICByZXR1cm5lZC4KKyAgICAgKi8KKyAgICB2cHhfaW1hZ2VfdCAqdnB4X2ltZ19hbGxvYyh2cHhfaW1hZ2VfdCAgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX2ZtdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZF93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFsaWduKTsKKworICAgIC8qIVxicmllZiBPcGVuIGEgZGVzY3JpcHRvciwgdXNpbmcgZXhpc3Rpbmcgc3RvcmFnZSBmb3IgdGhlIHVuZGVybHlpbmcgaW1hZ2UKKyAgICAgKgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciBzdG9yaW5nIGFuIGltYWdlIG9mIHRoZSBnaXZlbiBmb3JtYXQuIFRoZQorICAgICAqIHN0b3JhZ2UgZm9yIGRlc2NyaXB0b3IgaGFzIGJlZW4gYWxsb2NhdGVkIGVsc2V3aGVyZSwgYW5kIGEgZGVzY3JpcHRvciBpcworICAgICAqIGRlc2lyZWQgdG8gIndyYXAiIHRoYXQgc3RvcmFnZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgaW1nICAgICAgIFBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgZGVzY3JpcHRvci4gSWYgdGhpcyBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMLCB0aGUgc3RvcmFnZSBmb3IgdGhlIGRlc2NyaXB0b3Igd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBvbiB0aGUgaGVhcC4KKyAgICAgKiBccGFyYW1baW5dICAgIGZtdCAgICAgICBGb3JtYXQgZm9yIHRoZSBpbWFnZQorICAgICAqIFxwYXJhbVtpbl0gICAgZF93ICAgICAgIFdpZHRoIG9mIHRoZSBpbWFnZQorICAgICAqIFxwYXJhbVtpbl0gICAgZF9oICAgICAgIEhlaWdodCBvZiB0aGUgaW1hZ2UKKyAgICAgKiBccGFyYW1baW5dICAgIGFsaWduICAgICBBbGlnbm1lbnQsIGluIGJ5dGVzLCBvZiBlYWNoIHJvdyBpbiB0aGUgaW1hZ2UuCisgICAgICogXHBhcmFtW2luXSAgICBpbWdfZGF0YSAgU3RvcmFnZSB0byB1c2UgZm9yIHRoZSBpbWFnZQorICAgICAqCisgICAgICogXHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgaW1hZ2UgZGVzY3JpcHRvci4gSWYgdGhlIGltZworICAgICAqICAgICAgICAgcGFyYW1ldGVyIGlzIG5vbi1udWxsLCB0aGUgdmFsdWUgb2YgdGhlIGltZyBwYXJhbWV0ZXIgd2lsbCBiZQorICAgICAqICAgICAgICAgcmV0dXJuZWQuCisgICAgICovCisgICAgdnB4X2ltYWdlX3QgKnZweF9pbWdfd3JhcCh2cHhfaW1hZ2VfdCAgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfZm10X3QgZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgKmltZ19kYXRhKTsKKworCisgICAgLyohXGJyaWVmIFNldCB0aGUgcmVjdGFuZ2xlIGlkZW50aWZ5aW5nIHRoZSBkaXNwbGF5ZWQgcG9ydGlvbiBvZiB0aGUgaW1hZ2UKKyAgICAgKgorICAgICAqIFVwZGF0ZXMgdGhlIGRpc3BsYXllZCByZWN0YW5nbGUgKGFrYSB2aWV3cG9ydCkgb24gdGhlIGltYWdlIHN1cmZhY2UgdG8KKyAgICAgKiBtYXRjaCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIGFuZCBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgICBpbWcgICAgICAgSW1hZ2UgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbVtpbl0gICAgeCAgICAgICAgIGxlZnRtb3N0IGNvbHVtbgorICAgICAqIFxwYXJhbVtpbl0gICAgeSAgICAgICAgIHRvcG1vc3Qgcm93CisgICAgICogXHBhcmFtW2luXSAgICB3ICAgICAgICAgd2lkdGgKKyAgICAgKiBccGFyYW1baW5dICAgIGggICAgICAgICBoZWlnaHQKKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgcmVxdWVzdGVkIHJlY3RhbmdsZSBpcyB2YWxpZCwgbm9uemVybyBvdGhlcndpc2UuCisgICAgICovCisgICAgaW50IHZweF9pbWdfc2V0X3JlY3QodnB4X2ltYWdlX3QgICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBoKTsKKworCisgICAgLyohXGJyaWVmIEZsaXAgdGhlIGltYWdlIHZlcnRpY2FsbHkgKHRvcCBmb3IgYm90dG9tKQorICAgICAqCisgICAgICogQWRqdXN0cyB0aGUgaW1hZ2UgZGVzY3JpcHRvcidzIHBvaW50ZXJzIGFuZCBzdHJpZGVzIHRvIG1ha2UgdGhlIGltYWdlCisgICAgICogYmUgcmVmZXJlbmNlZCB1cHNpZGUtZG93bi4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICAgaW1nICAgICAgIEltYWdlIGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICB2b2lkIHZweF9pbWdfZmxpcCh2cHhfaW1hZ2VfdCAqaW1nKTsKKworICAgIC8qIVxicmllZiBDbG9zZSBhbiBpbWFnZSBkZXNjcmlwdG9yCisgICAgICoKKyAgICAgKiBGcmVlcyBhbGwgYWxsb2NhdGVkIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGFuIGltYWdlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgIGltZyAgICAgICBJbWFnZSBkZXNjcmlwdG9yCisgICAgICovCisgICAgdm9pZCB2cHhfaW1nX2ZyZWUodnB4X2ltYWdlX3QgKmltZyk7CisKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cHgvdnB4X2ludGVnZXIuaCBiL2xpYnZweC92cHgvdnB4X2ludGVnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThiY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweC92cHhfaW50ZWdlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIFZQWF9JTlRFR0VSX0gKKyNkZWZpbmUgVlBYX0lOVEVHRVJfSAorCisvKiBnZXQgcHRyZGlmZl90LCBzaXplX3QsIHdjaGFyX3QsIE5VTEwgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxNjAwKSkgfHwgZGVmaW5lZChWUFhfRU1VTEFURV9JTlRUWVBFUykKK3R5cGVkZWYgc2lnbmVkIGNoYXIgIGludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgICBpbnQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1aW50MzJfdDsKKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxNjAwKSkKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgICBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OworI2VuZGlmCisKKyNpZm5kZWYgX1VJTlRQVFJfVF9ERUZJTkVECit0eXBlZGVmIHNpemVfdCB1aW50cHRyX3Q7CisjZW5kaWYKKworI2Vsc2UKKworLyogTW9zdCBwbGF0Zm9ybXMgaGF2ZSB0aGUgQzk5IHN0YW5kYXJkIGludGVnZXIgdHlwZXMuICovCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChfX1NURENfRk9STUFUX01BQ1JPUykKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZW5kaWYKKworLyogVlMyMDEwIGRlZmluZXMgc3RkaW50LmgsIGJ1dCBub3QgaW50dHlwZXMuaCAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFBSSWQ2NCAiSTY0ZCIKKyNlbHNlCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfbWVtL2luY2x1ZGUvdnB4X21lbV9pbnRybmwuaCBiL2xpYnZweC92cHhfbWVtL2luY2x1ZGUvdnB4X21lbV9pbnRybmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2M2Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9tZW0vaW5jbHVkZS92cHhfbWVtX2ludHJubC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fVlBYX01FTV9JTlRSTkxfSF9fCisjZGVmaW5lIF9fVlBYX01FTV9JTlRSTkxfSF9fCisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorCisjaWZuZGVmIENPTkZJR19NRU1fTUFOQUdFUgorIyBpZiBkZWZpbmVkKFZYV09SS1MpCisjICBkZWZpbmUgQ09ORklHX01FTV9NQU5BR0VSICAxIC8qaW5jbHVkZSBoZWFwIG1hbmFnZXIgZnVuY3Rpb25hbGl0eSwqLworLypkZWZhdWx0OiBlbmFibGVkIG9uIHZ4d29ya3MqLworIyBlbHNlCisjICBkZWZpbmUgQ09ORklHX01FTV9NQU5BR0VSICAwIC8qaW5jbHVkZSBoZWFwIG1hbmFnZXIgZnVuY3Rpb25hbGl0eSovCisjIGVuZGlmCisjZW5kaWYgLypDT05GSUdfTUVNX01BTkFHRVIqLworCisjaWZuZGVmIENPTkZJR19NRU1fVFJBQ0tFUgorIyBkZWZpbmUgQ09ORklHX01FTV9UUkFDS0VSICAgICAxIC8qaW5jbHVkZSB4dnB4XyogY2FsbHMgaW4gdGhlIGxpYiovCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfTUVNX0NIRUNLUworIyBkZWZpbmUgQ09ORklHX01FTV9DSEVDS1MgICAgICAwIC8qaW5jbHVkZSBzb21lIGJhc2ljIHNhZmV0eSBjaGVja3MgaW4KK3ZweF9tZW1jcHksIF9tZW1zZXQsIGFuZCBfbWVtbW92ZSovCisjZW5kaWYKKworI2lmbmRlZiBVU0VfR0xPQkFMX0ZVTkNUSU9OX1BPSU5URVJTCisjIGRlZmluZSBVU0VfR0xPQkFMX0ZVTkNUSU9OX1BPSU5URVJTICAgMCAgLyp1c2UgZnVuY3Rpb24gcG9pbnRlcnMgaW5zdGVhZCBvZiBjb21waWxlZCBmdW5jdGlvbnMuKi8KKyNlbmRpZgorCisjaWYgQ09ORklHX01FTV9UUkFDS0VSCisjIGluY2x1ZGUgInZweF9tZW1fdHJhY2tlci5oIgorIyBpZiBWUFhfTUVNX1RSQUNLRVJfVkVSU0lPTl9DSElFRiAhPSAyIHx8IFZQWF9NRU1fVFJBQ0tFUl9WRVJTSU9OX01BSk9SICE9IDUKKyMgIGVycm9yICJ2cHhfbWVtIHJlcXVpcmVzIG1lbW9yeSB0cmFja2VyIHZlcnNpb24gMi41IHRvIHRyYWNrIG1lbW9yeSB1c2FnZSIKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEFERFJFU1NfU1RPUkFHRV9TSVpFICAgICAgc2l6ZW9mKHNpemVfdCkKKworI2lmbmRlZiBERUZBVUxUX0FMSUdOTUVOVAorIyBpZiBkZWZpbmVkKFZYV09SS1MpCisjICBkZWZpbmUgREVGQVVMVF9BTElHTk1FTlQgICAgICAgIDMyICAgICAgICAvKmRlZmF1bHQgYWRkciBhbGlnbm1lbnQgdG8gdXNlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIHRvIHZweF8qIGZ1bmN0aW9ucyBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHZweF9tZW1hbGlnbiovCisjIGVsc2UKKyMgIGRlZmluZSBERUZBVUxUX0FMSUdOTUVOVCAgICAgICAgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBERUZBVUxUX0FMSUdOTUVOVCA8IDEKKyMgZXJyb3IgIkRFRkFVTFRfQUxJR05NRU5UIG11c3QgYmUgPj0gMSEiCisjZW5kaWYKKworI2lmIENPTkZJR19NRU1fVFJBQ0tFUgorIyBkZWZpbmUgVFJZX0JPVU5EU19DSEVDSyAgICAgICAgIDEgICAgICAgIC8qd2hlbiBzZXQgdG8gMSBwYWRzIGVhY2ggYWxsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVncml0eSBjYW4gYmUgY2hlY2tlZCB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X21lbW9yeV90cmFja2VyX2NoZWNrX2ludGVncml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igb24gZnJlZSBieSBkZWZpbmluZyovCisvKlRSWV9CT1VORFNfQ0hFQ0tfT05fRlJFRSovCisjZWxzZQorIyBkZWZpbmUgVFJZX0JPVU5EU19DSEVDSyAgICAgICAgIDAKKyNlbmRpZiAvKkNPTkZJR19NRU1fVFJBQ0tFUiovCisKKyNpZiBUUllfQk9VTkRTX0NIRUNLCisjIGRlZmluZSBUUllfQk9VTkRTX0NIRUNLX09OX0ZSRUUgMCAgICAgICAgICAvKmNoZWNrcyBtZW0gaW50ZWdyaXR5IG9uIGV2ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUsIHZlcnkgZXhwZW5zaXZlKi8KKyMgZGVmaW5lIEJPVU5EU19DSEVDS19WQUxVRSAgICAgICAweGRlYWRiZWVmIC8qdmFsdWUgc3RvcmVkIGJlZm9yZS9hZnRlciBlYS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtIGFkZHIgZm9yIGJvdW5kcyBjaGVja2luZyovCisjIGRlZmluZSBCT1VORFNfQ0hFQ0tfUEFEX1NJWkUgICAgMzIgICAgICAgICAvKnNpemUgb2YgdGhlIHBhZGRpbmcgYmVmb3JlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBlYSBhbGxvY2F0aW9uIHRvIGJlIGZpbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJPVU5EU19DSEVDS19WQUxVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA0Ki8KKyNlbHNlCisjIGRlZmluZSBCT1VORFNfQ0hFQ0tfVkFMVUUgICAgICAgMAorIyBkZWZpbmUgQk9VTkRTX0NIRUNLX1BBRF9TSVpFICAgIDAKKyNlbmRpZiAvKlRSWV9CT1VORFNfQ0hFQ0sqLworCisjaWZuZGVmIFJFTU9WRV9QUklOVEZTCisjIGRlZmluZSBSRU1PVkVfUFJJTlRGUyAwCisjZW5kaWYKKworLyogU2hvdWxkIHByb2JhYmx5IHVzZSBhIHZweF9tZW0gbG9nZ2VyIGZ1bmN0aW9uLiAqLworI2lmIFJFTU9WRV9QUklOVEZTCisjIGRlZmluZSBfUCh4KQorI2Vsc2UKKyMgZGVmaW5lIF9QKHgpIHgKKyNlbmRpZgorCisvKnJldHVybnMgYW4gYWRkciBhbGlnbmVkIHRvIHRoZSBieXRlIGJvdW5kYXJ5IHNwZWNpZmllZCBieSBhbGlnbiovCisjZGVmaW5lIGFsaWduX2FkZHIoYWRkcixhbGlnbikgKHZvaWQqKSgoKHNpemVfdCkoYWRkcikgKyAoKGFsaWduKSAtIDEpKSAmIChzaXplX3QpLShhbGlnbikpCisKKyNlbmRpZiAvKl9fVlBYX01FTV9JTlRSTkxfSF9fKi8KZGlmZiAtLWdpdCBhL3ZweF9tZW0vaW5jbHVkZS92cHhfbWVtX3RyYWNrZXIuaCBiL2xpYnZweC92cHhfbWVtL2luY2x1ZGUvdnB4X21lbV90cmFja2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vaW5jbHVkZS92cHhfbWVtX3RyYWNrZXIuaApyZW5hbWUgdG8gbGlidnB4L3ZweF9tZW0vaW5jbHVkZS92cHhfbWVtX3RyYWNrZXIuaApkaWZmIC0tZ2l0IGEvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fYWxsb2MuYyBiL2xpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9hbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9hbGxvYy5jCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fYWxsb2MuYwpkaWZmIC0tZ2l0IGEvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fYmFzZS5jIGIvbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX2Jhc2UuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fYmFzZS5jCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fYmFzZS5jCmRpZmYgLS1naXQgYS92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9kZmx0X2Fib3J0LmMgYi9saWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fZGZsdF9hYm9ydC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9kZmx0X2Fib3J0LmMKcmVuYW1lIHRvIGxpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9kZmx0X2Fib3J0LmMKZGlmZiAtLWdpdCBhL3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX2dyb3cuYyBiL2xpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9ncm93LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX2dyb3cuYwpyZW5hbWUgdG8gbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX2dyb3cuYwpkaWZmIC0tZ2l0IGEvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fbGFyZ2VzdC5jIGIvbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX2xhcmdlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fbGFyZ2VzdC5jCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fbGFyZ2VzdC5jCmRpZmYgLS1naXQgYS92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9yZXNpemUuYyBiL2xpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9yZXNpemUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fcmVzaXplLmMKcmVuYW1lIHRvIGxpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV9yZXNpemUuYwpkaWZmIC0tZ2l0IGEvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fc2hyaW5rLmMgYi9saWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fc2hyaW5rLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX3Nocmluay5jCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9obW1fc2hyaW5rLmMKZGlmZiAtLWdpdCBhL3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX3RydWUuYyBiL2xpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2htbV90cnVlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX3RydWUuYwpyZW5hbWUgdG8gbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaG1tX3RydWUuYwpkaWZmIC0tZ2l0IGEvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9pbmNsdWRlL2NhdmxfaWYuaCBiL2xpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvY2F2bF9pZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvY2F2bF9pZi5oCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9pbmNsdWRlL2NhdmxfaWYuaApkaWZmIC0tZ2l0IGEvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9pbmNsdWRlL2NhdmxfaW1wbC5oIGIvbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaW5jbHVkZS9jYXZsX2ltcGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4X21lbS9tZW1vcnlfbWFuYWdlci9pbmNsdWRlL2NhdmxfaW1wbC5oCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9pbmNsdWRlL2NhdmxfaW1wbC5oCmRpZmYgLS1naXQgYS92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvaGVhcG1tLmggYi9saWJ2cHgvdnB4X21lbS9tZW1vcnlfbWFuYWdlci9pbmNsdWRlL2hlYXBtbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvaGVhcG1tLmgKcmVuYW1lIHRvIGxpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvaGVhcG1tLmgKZGlmZiAtLWdpdCBhL3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaW5jbHVkZS9obW1fY25mZy5oIGIvbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaW5jbHVkZS9obW1fY25mZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvaG1tX2NuZmcuaApyZW5hbWUgdG8gbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaW5jbHVkZS9obW1fY25mZy5oCmRpZmYgLS1naXQgYS92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvaG1tX2ludHJubC5oIGIvbGlidnB4L3ZweF9tZW0vbWVtb3J5X21hbmFnZXIvaW5jbHVkZS9obW1faW50cm5sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vbWVtb3J5X21hbmFnZXIvaW5jbHVkZS9obW1faW50cm5sLmgKcmVuYW1lIHRvIGxpYnZweC92cHhfbWVtL21lbW9yeV9tYW5hZ2VyL2luY2x1ZGUvaG1tX2ludHJubC5oCmRpZmYgLS1naXQgYS92cHhfbWVtL3ZweF9tZW0uYyBiL2xpYnZweC92cHhfbWVtL3ZweF9tZW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdnB4X21lbS92cHhfbWVtLmMKcmVuYW1lIHRvIGxpYnZweC92cHhfbWVtL3ZweF9tZW0uYwpkaWZmIC0tZ2l0IGEvdnB4X21lbS92cHhfbWVtLmggYi9saWJ2cHgvdnB4X21lbS92cHhfbWVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vdnB4X21lbS5oCnJlbmFtZSB0byBsaWJ2cHgvdnB4X21lbS92cHhfbWVtLmgKZGlmZiAtLWdpdCBhL3ZweF9tZW0vdnB4X21lbS5tayBiL2xpYnZweC92cHhfbWVtL3ZweF9tZW0ubWsKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9tZW0vdnB4X21lbS5tawpyZW5hbWUgdG8gbGlidnB4L3ZweF9tZW0vdnB4X21lbS5tawpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9tZW0vdnB4X21lbV90cmFja2VyLmMgYi9saWJ2cHgvdnB4X21lbS92cHhfbWVtX3RyYWNrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzcwNzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9tZW0vdnB4X21lbV90cmFja2VyLmMKQEAgLTAsMCArMSw3OTggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKgorICB2cHhfbWVtX3RyYWNrZXIuYworCisgIGp3eiAyMDAzLTA5LTMwOgorICAgU3RvcmVzIGEgbGlzdCBvZiBhZGRyZXNlcywgdGhlaXIgc2l6ZSwgYW5kIGZpbGUgYW5kIGxpbmUgdGhleSBjYW1lIGZyb20uCisgICBBbGwgZXhwb3NlZCBsaWIgZnVuY3Rpb25zIGFyZSBwcmVmYWNlZCBieSB2cHhfIGFuZCBhbGxvdyB0aGUgZ2xvYmFsIGxpc3QKKyAgIHRvIGJlIHRocmVhZCBzYWZlLgorICAgQ3VycmVudCBzdXBwb3J0ZWQgcGxhdGZvcm1zIGFyZToKKyAgICBMaW51eCwgV2luMzIsIHdpbl9jZSBhbmQgdnhfd29ya3MKKyAgIEZ1cnRoZXIgc3VwcG9ydCBjYW4gYmUgYWRkZWQgYnkgZGVmaW5pbmcgdGhlIHBsYXRmb3JtIHNwZWNpZmljIG11dGV4CisgICBpbiB0aGUgbWVtb3J5X3RyYWNrZXIgc3RydWN0IGFzIHdlbGwgYXMgY2FsbHMgdG8gY3JlYXRlL2Rlc3Ryb3kvbG9jay91bmxvY2sKKyAgIHRoZSBtdXRleCBpbiB2cHhfbWVtb3J5X3RyYWNrZXJfaW5pdC9EZXN0cm95IGFuZCBtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4L3VubG9ja19tdXRleAorKi8KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKF9fdUNsaW51eF9fKQorIyBpbmNsdWRlIDxsZGRrLmg+CisjZW5kaWYKKworI2lmIEhBVkVfUFRIUkVBRF9ICisjIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKyMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBpbmNsdWRlIDx3aW5iYXNlLmg+CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisjIGluY2x1ZGUgPHNlbV9saWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy9WWFdPUktTIGRvZXNuJ3QgaGF2ZSBhIG1hbGxvYy9tZW1vcnkuaCBmaWxlLAorLy90aGlzIHNob3VsZCBwdWxsIGluIG1hbGxvYyxmcmVlLGV0Yy4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvdnB4X21lbV90cmFja2VyLmgiCisKKyN1bmRlZiB2cHhfbWFsbG9jICAgLy91bmRlZmluZSBhbnkgdnB4X21lbSBtYWNyb3MgdGhhdCBtYXkgYWZmZWN0IGNhbGxzIHRvCisjdW5kZWYgdnB4X2ZyZWUgICAgIC8vbWVtb3J5IGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUKKyN1bmRlZiB2cHhfbWVtY3B5CisjdW5kZWYgdnB4X21lbXNldAorCisKKyNpZm5kZWYgVVNFX0dMT0JBTF9GVU5DVElPTl9QT0lOVEVSUworIyBkZWZpbmUgVVNFX0dMT0JBTF9GVU5DVElPTl9QT0lOVEVSUyAgIDAgIC8vdXNlIGZ1bmN0aW9uIHBvaW50ZXJzIGluc3RlYWQgb2YgY29tcGlsZWQgZnVuY3Rpb25zLgorI2VuZGlmCisKKyNpZiBVU0VfR0xPQkFMX0ZVTkNUSU9OX1BPSU5URVJTCitzdGF0aWMgbWVtX3RyYWNrX21hbGxvY19mdW5jIGdfbWFsbG9jICAgPSBtYWxsb2M7CitzdGF0aWMgbWVtX3RyYWNrX2NhbGxvY19mdW5jIGdfY2FsbG9jICAgPSBjYWxsb2M7CitzdGF0aWMgbWVtX3RyYWNrX3JlYWxsb2NfZnVuYyBnX3JlYWxsb2MgPSByZWFsbG9jOworc3RhdGljIG1lbV90cmFja19mcmVlX2Z1bmMgZ19mcmVlICAgICAgID0gZnJlZTsKK3N0YXRpYyBtZW1fdHJhY2tfbWVtY3B5X2Z1bmMgZ19tZW1jcHkgICA9IG1lbWNweTsKK3N0YXRpYyBtZW1fdHJhY2tfbWVtc2V0X2Z1bmMgZ19tZW1zZXQgICA9IG1lbXNldDsKK3N0YXRpYyBtZW1fdHJhY2tfbWVtbW92ZV9mdW5jIGdfbWVtbW92ZSA9IG1lbW1vdmU7CisjIGRlZmluZSBNRU1fVFJBQ0tfTUFMTE9DIGdfbWFsbG9jCisjIGRlZmluZSBNRU1fVFJBQ0tfRlJFRSAgIGdfZnJlZQorIyBkZWZpbmUgTUVNX1RSQUNLX01FTUNQWSBnX21lbWNweQorIyBkZWZpbmUgTUVNX1RSQUNLX01FTVNFVCBnX21lbXNldAorI2Vsc2UKKyMgZGVmaW5lIE1FTV9UUkFDS19NQUxMT0MgdnB4X21hbGxvYworIyBkZWZpbmUgTUVNX1RSQUNLX0ZSRUUgICB2cHhfZnJlZQorIyBkZWZpbmUgTUVNX1RSQUNLX01FTUNQWSB2cHhfbWVtY3B5CisjIGRlZmluZSBNRU1fVFJBQ0tfTUVNU0VUIHZweF9tZW1zZXQKKyNlbmRpZiAvLyBVU0VfR0xPQkFMX0ZVTkNUSU9OX1BPSU5URVJTCisKKy8qIHByb3RvdHlwZXMgZm9yIGludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBtZW10cmFja19sb2coY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQgbWVtb3J5X3RyYWNrZXJfZHVtcCgpOworc3RhdGljIHZvaWQgbWVtb3J5X3RyYWNrZXJfY2hlY2tfaW50ZWdyaXR5KGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkIG1lbW9yeV90cmFja2VyX2FkZChzaXplX3QgYWRkciwgdW5zaWduZWQgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRlZCk7CitzdGF0aWMgaW50IG1lbW9yeV90cmFja2VyX3JlbW92ZShzaXplX3QgYWRkcik7CitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqbWVtb3J5X3RyYWNrZXJfZmluZChzaXplX3QgYWRkcik7CisKKyNpZiBkZWZpbmVkKE5PX01VVEVYKQorIyBkZWZpbmUgbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleCgpICghZ19iX21lbV90cmFja2VyX2luaXRlZCkKKyMgZGVmaW5lIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpCisjZWxzZQorc3RhdGljIGludCBtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCk7CitzdGF0aWMgaW50IG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOworI2VuZGlmCisKKyNpZm5kZWYgVlBYX05PX0dMT0JBTFMKK3N0cnVjdCBtZW1vcnlfdHJhY2tlcgoreworICAgIHN0cnVjdCBtZW1fYmxvY2sgKmhlYWQsCisgICAgICAgICAgICAqIHRhaWw7CisgICAgaW50IGxlbiwKKyAgICAgICAgdG90YWxzaXplOworICAgIHVuc2lnbmVkIGludCBjdXJyZW50X2FsbG9jYXRlZCwKKyAgICAgICAgICAgICBtYXhfYWxsb2NhdGVkOworCisjaWYgSEFWRV9QVEhSRUFEX0gKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisjZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgSEFORExFIG11dGV4OworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIFNFTV9JRCBtdXRleDsKKyNlbGlmIGRlZmluZWQoTk9fTVVURVgpCisjZWxzZQorI2Vycm9yICJObyBtdXRleCB0eXBlIGRlZmluZWQgZm9yIHRoaXMgcGxhdGZvcm0hIgorI2VuZGlmCisKKyAgICBpbnQgcGFkZGluZ19zaXplLAorICAgICAgICBwYWRfdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IG1lbW9yeV90cmFja2VyIG1lbXRyYWNrOyAgIC8vb3VyIGdsb2JhbCBtZW1vcnkgYWxsb2NhdGlvbiBsaXN0CitzdGF0aWMgaW50IGdfYl9tZW1fdHJhY2tlcl9pbml0ZWQgPSAwOyAgICAgLy9pbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2xvYmFsIGxpc3QgaGFzCisvL2JlZW4gaW5pdGlhbGl6ZWQgKDE6eWVzLzA6bm8pCitzdGF0aWMgc3RydWN0Cit7CisgICAgRklMRSAqZmlsZTsKKyAgICBpbnQgdHlwZTsKKyAgICB2b2lkICgqZnVuYykodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKKyAgICB2b2lkICp1c2VyZGF0YTsKK30gZ19sb2dnaW5nID0ge05VTEwsIDAsIE5VTEwsIE5VTEx9OworI2Vsc2UKKyMgaW5jbHVkZSAidnB4X2dsb2JhbF9oYW5kbGluZy5oIgorI2RlZmluZSBnX2JfbWVtX3RyYWNrZXJfaW5pdGVkIHZweGdsb2JhbG0odnB4bWVtLGdfYl9tZW1fdHJhY2tlcl9pbml0ZWQpCisjZGVmaW5lIGdfbG9nZ2luZyB2cHhnbG9iYWxtKHZweG1lbSxnX2xvZ2dpbmcpCisjZGVmaW5lIG1lbXRyYWNrIHZweGdsb2JhbG0odnB4bWVtLG1lbXRyYWNrKQorI2VuZGlmIC8vICNpZm5kZWYgVlBYX05PX0dMT0JBTFMKKworZXh0ZXJuIHZvaWQgKnZweF9tYWxsb2Moc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgdnB4X2ZyZWUodm9pZCAqbWVtYmxrKTsKK2V4dGVybiB2b2lkICp2cHhfbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbmd0aCk7CitleHRlcm4gdm9pZCAqdnB4X21lbXNldCh2b2lkICpkZXN0LCBpbnQgdmFsLCBzaXplX3QgbGVuZ3RoKTsKKworLyoKKyAqCisgKiBFeHBvc2VkIGxpYnJhcnkgZnVuY3Rpb25zCisgKgorKi8KKworLyoKKyAgICB2cHhfbWVtb3J5X3RyYWNrZXJfaW5pdChpbnQgcGFkZGluZ19zaXplLCBpbnQgcGFkX3ZhbHVlKQorICAgICAgcGFkZGluZ19zaXplIC0gdGhlIHNpemUgb2YgdGhlIHBhZGRpbmcgYmVmb3JlIGFuZCBhZnRlciBlYWNoIG1lbSBhZGRyLgorICAgICAgICAgICAgICAgICAgICAgVmFsdWVzID4gMCBpbmRpY2F0ZSB0aGF0IGludGVncml0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZAorICAgICAgICAgICAgICAgICAgICAgYnkgaW5zcGVjdGluZyB0aGVzZSBhcmVhcy4KKyAgICAgIHBhZF92YWx1ZSAtIHRoZSBpbml0aWFsIHZhbHVlIHdpdGhpbiB0aGUgcGFkZGluZyBhcmVhIGJlZm9yZSBhbmQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgIGVhY2ggbWVtIGFkZHIuCisKKyAgICBJbml0aWFsaXplcyBnbG9iYWwgbWVtb3J5IHRyYWNrZXIgc3RydWN0dXJlCisgICAgQWxsb2NhdGVzIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisqLworaW50IHZweF9tZW1vcnlfdHJhY2tlcl9pbml0KGludCBwYWRkaW5nX3NpemUsIGludCBwYWRfdmFsdWUpCit7CisgICAgaWYgKCFnX2JfbWVtX3RyYWNrZXJfaW5pdGVkKQorICAgIHsKKyAgICAgICAgaWYgKChtZW10cmFjay5oZWFkID0gKHN0cnVjdCBtZW1fYmxvY2sgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX1RSQUNLX01BTExPQyhzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJldDsKKworICAgICAgICAgICAgTUVNX1RSQUNLX01FTVNFVChtZW10cmFjay5oZWFkLCAwLCBzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykpOworCisgICAgICAgICAgICBtZW10cmFjay50YWlsID0gbWVtdHJhY2suaGVhZDsKKworICAgICAgICAgICAgbWVtdHJhY2suY3VycmVudF9hbGxvY2F0ZWQgPSAwOworICAgICAgICAgICAgbWVtdHJhY2subWF4X2FsbG9jYXRlZCAgICAgPSAwOworCisgICAgICAgICAgICBtZW10cmFjay5wYWRkaW5nX3NpemUgPSBwYWRkaW5nX3NpemU7CisgICAgICAgICAgICBtZW10cmFjay5wYWRfdmFsdWUgICAgPSBwYWRfdmFsdWU7CisKKyNpZiBIQVZFX1BUSFJFQURfSAorICAgICAgICAgICAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KCZtZW10cmFjay5tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgICAvKm11dGV4IGF0dHJpYnV0ZXMgKE5VTEw9ZGVmYXVsdCkqLworI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgICAgICAgICAgbWVtdHJhY2subXV0ZXggPSBDcmVhdGVNdXRleChOVUxMLCAgIC8qc2VjdXJpdHkgYXR0cmlidXRlcyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8qd2UgZG9uJ3Qgd2FudCBpbml0aWFsIG93bmVyc2hpcCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8qbXV0ZXggbmFtZSovCisgICAgICAgICAgICByZXQgPSAhbWVtdHJhY2subXV0ZXg7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgICAgICBtZW10cmFjay5tdXRleCA9IHNlbV9iY3JlYXRlKFNFTV9RX0ZJRk8sIC8qU0VNX1FfRklGTyBub24tcHJpb3JpdHkgYmFzZWQgbXV0ZXgqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU1fRlVMTCk7ICAvKlNFTV9GVUxMIGluaXRpYWwgc3RhdGUgaXMgdW5sb2NrZWQqLworICAgICAgICAgICAgcmV0ID0gIW1lbXRyYWNrLm11dGV4OworI2VsaWYgZGVmaW5lZChOT19NVVRFWCkKKyAgICAgICAgICAgIHJldCA9IDA7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW10cmFja19sb2coInZweF9tZW1vcnlfdHJhY2tlcl9pbml0OiBFcnJvciBjcmVhdGluZyBtdXRleCFcbiIpOworCisgICAgICAgICAgICAgICAgTUVNX1RSQUNLX0ZSRUUobWVtdHJhY2suaGVhZCk7CisgICAgICAgICAgICAgICAgbWVtdHJhY2suaGVhZCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJNZW1vcnkgVHJhY2tlciBpbml0J2QsIHYuInZweF9tZW1fdHJhY2tlcl92ZXJzaW9uIiBwYWRfc2l6ZTolZCBwYWRfdmFsOjB4JXggJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYWRkaW5nX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYWRfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYWRfdmFsdWUpOworICAgICAgICAgICAgICAgIGdfYl9tZW1fdHJhY2tlcl9pbml0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGdfYl9tZW1fdHJhY2tlcl9pbml0ZWQ7Cit9CisKKy8qCisgICAgdnB4X21lbW9yeV90cmFja2VyX2Rlc3Ryb3koKQorICAgIElmIG91ciBnbG9iYWwgc3RydWN0IHdhcyBpbml0aWFsaXplZCB6ZXJvcyBvdXQgYWxsIGl0cyBtZW1iZXJzLAorICAgIGZyZWVzIG1lbW9yeSBhbmQgZGVzdHJveXMgaXQncyBtdXRleAorKi8KK3ZvaWQgdnB4X21lbW9yeV90cmFja2VyX2Rlc3Ryb3koKQoreworICAgIGlmICghbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleCgpKQorICAgIHsKKyAgICAgICAgc3RydWN0IG1lbV9ibG9jayAqcCAgPSBtZW10cmFjay5oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcDIgPSBtZW10cmFjay5oZWFkOworCisgICAgICAgIG1lbW9yeV90cmFja2VyX2R1bXAoKTsKKworICAgICAgICB3aGlsZSAocCkKKyAgICB7CisgICAgICAgICAgICBwMiA9IHA7CisgICAgICAgICAgICBwICA9IHAtPm5leHQ7CisKKyAgICAgICAgICAgIE1FTV9UUkFDS19GUkVFKHAyKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXRyYWNrLmhlYWQgICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgbWVtdHJhY2sudGFpbCAgICAgICAgICAgICAgPSBOVUxMOworICAgICAgICBtZW10cmFjay5sZW4gICAgICAgICAgICAgICA9IDA7CisgICAgICAgIG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkID0gMDsKKyAgICAgICAgbWVtdHJhY2subWF4X2FsbG9jYXRlZCAgICAgPSAwOworCisgICAgICAgIGlmICghZ19sb2dnaW5nLnR5cGUgJiYgZ19sb2dnaW5nLmZpbGUgJiYgZ19sb2dnaW5nLmZpbGUgIT0gc3RkZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmY2xvc2UoZ19sb2dnaW5nLmZpbGUpOworICAgICAgICAgICAgZ19sb2dnaW5nLmZpbGUgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCk7CisKKyAgICAgICAgZ19iX21lbV90cmFja2VyX2luaXRlZCA9IDA7CisgICAgfQorfQorCisvKgorICAgIHZweF9tZW1vcnlfdHJhY2tlcl9hZGQoc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkKKyAgICAgIGFkZHIgLSBtZW1vcnkgYWRkcmVzcyB0byBiZSBhZGRlZCB0byBsaXN0CisgICAgICBzaXplIC0gc2l6ZSBvZiBhZGRyCisgICAgICBmaWxlIC0gdGhlIGZpbGUgYWRkciB3YXMgcmVmZXJlbmNlZCBmcm9tCisgICAgICBsaW5lIC0gdGhlIGxpbmUgaW4gZmlsZSBhZGRyIHdhcyByZWZlcmVuY2VkIGZyb20KKyAgICBBZGRzIG1lbW9yeSBhZGRyZXNzIGFkZHIsIGl0J3Mgc2l6ZSwgZmlsZSBhbmQgbGluZSBpdCBjYW1lIGZyb20KKyAgICB0byB0aGUgZ2xvYmFsIGxpc3QgdmlhIHRoZSB0aHJlYWQgc2FmZSBpbnRlcm5hbCBsaWJyYXJ5IGZ1bmN0aW9uCisqLwordm9pZCB2cHhfbWVtb3J5X3RyYWNrZXJfYWRkKHNpemVfdCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGVkKQoreworICAgIG1lbW9yeV90cmFja2VyX2FkZChhZGRyLCBzaXplLCBmaWxlLCBsaW5lLCBwYWRkZWQpOworfQorCisvKgorICAgIHZweF9tZW1vcnlfdHJhY2tlcl9yZW1vdmUoc2l6ZV90IGFkZHIpCisgICAgICBhZGRyIC0gbWVtb3J5IGFkZHJlc3MgdG8gYmUgcmVtb3ZlZCBmcm9tIGxpc3QKKyAgICBSZW1vdmVzIGFkZHIgZnJvbSB0aGUgZ2xvYmFsIGxpc3QgdmlhIHRoZSB0aHJlYWQgc2FmZQorICAgIGludGVybmFsIHJlbW92ZSBmdW5jdGlvbgorICAgIFJldHVybjoKKyAgICAgIFNhbWUgYXMgZGVzY3JpYmVkIGZvciBtZW1vcnlfdHJhY2tlcl9yZW1vdmUKKyovCitpbnQgdnB4X21lbW9yeV90cmFja2VyX3JlbW92ZShzaXplX3QgYWRkcikKK3sKKyAgICByZXR1cm4gbWVtb3J5X3RyYWNrZXJfcmVtb3ZlKGFkZHIpOworfQorCisvKgorICAgIHZweF9tZW1vcnlfdHJhY2tlcl9maW5kKHNpemVfdCBhZGRyKQorICAgICAgYWRkciAtIGFkZHJlc3MgdG8gYmUgZm91bmQgaW4gbGlzdAorICAgIFJldHVybjoKKyAgICAgICAgSWYgZm91bmQsIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB0aGF0IG1hdGNoZXMgYWRkcgorICAgICAgICBOVUxMIG90aGVyd2lzZQorKi8KK3N0cnVjdCBtZW1fYmxvY2sgKnZweF9tZW1vcnlfdHJhY2tlcl9maW5kKHNpemVfdCBhZGRyKQoreworICAgIHN0cnVjdCBtZW1fYmxvY2sgKnAgPSBOVUxMOworCisgICAgaWYgKCFtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCkpCisgICAgeworICAgICAgICBwID0gbWVtb3J5X3RyYWNrZXJfZmluZChhZGRyKTsKKyAgICAgICAgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCk7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgICAgdnB4X21lbW9yeV90cmFja2VyX2R1bXAoKQorICAgIExvY2tzIHRoZSBtZW1vcnkgdHJhY2tlcidzIG11dGV4IGFuZCBjYWxscyB0aGUgaW50ZXJuYWwKKyAgICBsaWJyYXJ5IGZ1bmN0aW9uIHRvIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlCisgICAgZ2xvYmFsIG1lbW9yeSBhbGxvY2F0aW9uIGxpc3QKKyovCit2b2lkIHZweF9tZW1vcnlfdHJhY2tlcl9kdW1wKCkKK3sKKyAgICBpZiAoIW1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKSkKKyAgICB7CisgICAgICAgIG1lbW9yeV90cmFja2VyX2R1bXAoKTsKKyAgICAgICAgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCk7CisgICAgfQorfQorCisvKgorICAgIHZweF9tZW1vcnlfdHJhY2tlcl9jaGVja19pbnRlZ3JpdHkoY2hhciogZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpCisgICAgICBmaWxlIC0gVGhlIGZpbGUgbmFtZSB3aGVyZSB0aGUgY2hlY2sgd2FzIHBsYWNlZAorICAgICAgbGluZSAtIFRoZSBsaW5lIGluIGZpbGUgd2hlcmUgdGhlIGNoZWNrIHdhcyBwbGFjZWQKKyAgICBMb2NrcyB0aGUgbWVtb3J5IHRyYWNrZXIncyBtdXRleCBhbmQgY2FsbHMgdGhlIGludGVybmFsCisgICAgaW50ZWdyaXR5IGNoZWNrIGZ1bmN0aW9uIHRvIGluc3BlY3QgZXZlcnkgYWRkcmVzcyBpbiB0aGUgZ2xvYmFsCisgICAgbWVtb3J5IGFsbG9jYXRpb24gbGlzdAorKi8KK3ZvaWQgdnB4X21lbW9yeV90cmFja2VyX2NoZWNrX2ludGVncml0eShjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkKK3sKKyAgICBpZiAoIW1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKSkKKyAgICB7CisgICAgICAgIG1lbW9yeV90cmFja2VyX2NoZWNrX2ludGVncml0eShmaWxlLCBsaW5lKTsKKyAgICAgICAgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCk7CisgICAgfQorfQorCisvKgorICAgIHZweF9tZW1vcnlfdHJhY2tlcl9zZXRfbG9nX3R5cGUKKyAgICBTZXRzIHRoZSBsb2dnaW5nIHR5cGUgZm9yIHRoZSBtZW1vcnkgdHJhY2tlci4gQmFzZWQgb24gdGhlIHZhbHVlIGl0IHdpbGwKKyAgICBkaXJlY3QgaXRzIG91dHB1dCB0byB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuCisgICAgUmV0dXJuOgorICAgICAgMDogb24gc3VjY2VzcworICAgICAgLTE6IGlmIHRoZSBsb2dnaW5nIHR5cGUgY291bGQgbm90IGJlIHNldCwgYmVjYXVzZSB0aGUgdmFsdWUgd2FzIGludmFsaWQKKyAgICAgICAgICBvciBiZWNhdXNlIGEgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkCisqLworaW50IHZweF9tZW1vcnlfdHJhY2tlcl9zZXRfbG9nX3R5cGUoaW50IHR5cGUsIGNoYXIgKm9wdGlvbikKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgZ19sb2dnaW5nLnR5cGUgPSAwOworCisgICAgICAgIGlmICghb3B0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBnX2xvZ2dpbmcuZmlsZSA9IHN0ZGVycjsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGdfbG9nZ2luZy5maWxlID0gZm9wZW4oKGNoYXIgKilvcHRpb24sICJ3IikpKQorICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorICAgIGNhc2UgMToKKyAgICAgICAgZ19sb2dnaW5nLnR5cGUgPSB0eXBlOworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vb3V0cHV0IHRoZSB2ZXJzaW9uIHRvIHRoZSBuZXcgbG9nZ2luZyBkZXN0aW5hdGlvbgorICAgIGlmICghcmV0KQorICAgICAgICBtZW10cmFja19sb2coIk1lbW9yeSBUcmFja2VyIGxvZ2dpbmcgaW5pdGlhbGl6ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgVHJhY2tlciB2LiJ2cHhfbWVtX3RyYWNrZXJfdmVyc2lvbiJcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAgICB2cHhfbWVtb3J5X3RyYWNrZXJfc2V0X2xvZ19mdW5jCisgICAgU2V0cyBhIGxvZ2dpbmcgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSB0aGUgbWVtb3J5IHRyYWNrZXIuCisgICAgUmV0dXJuOgorICAgICAgMDogb24gc3VjY2VzcworICAgICAgLTE6IGlmIHRoZSBsb2dnaW5nIHR5cGUgY291bGQgbm90IGJlIHNldCBiZWNhdXNlIGxvZ2Z1bmMgd2FzIE5VTEwKKyovCitpbnQgdnB4X21lbW9yeV90cmFja2VyX3NldF9sb2dfZnVuYyh2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoKmxvZ2Z1bmMpKHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykpCit7CisgICAgaW50IHJldCA9IC0xOworCisgICAgaWYgKGxvZ2Z1bmMpCisgICAgeworICAgICAgICBnX2xvZ2dpbmcudHlwZSAgICAgPSAtMTsKKyAgICAgICAgZ19sb2dnaW5nLnVzZXJkYXRhID0gdXNlcmRhdGE7CisgICAgICAgIGdfbG9nZ2luZy5mdW5jICAgICA9IGxvZ2Z1bmM7CisgICAgICAgIHJldCA9IDA7CisgICAgfQorCisgICAgLy9vdXRwdXQgdGhlIHZlcnNpb24gdG8gdGhlIG5ldyBsb2dnaW5nIGRlc3RpbmF0aW9uCisgICAgaWYgKCFyZXQpCisgICAgICAgIG1lbXRyYWNrX2xvZygiTWVtb3J5IFRyYWNrZXIgbG9nZ2luZyBpbml0aWFsaXplZCwgIgorICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBUcmFja2VyIHYuInZweF9tZW1fdHJhY2tlcl92ZXJzaW9uIlxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICoKKyAqIEVORCAtIEV4cG9zZWQgbGlicmFyeSBmdW5jdGlvbnMKKyAqCisqLworCisKKy8qCisgKgorICogSW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnMKKyAqCisqLworCitzdGF0aWMgdm9pZCBtZW10cmFja19sb2coY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBsaXN0OworCisgICAgdmFfc3RhcnQobGlzdCwgZm10KTsKKworICAgIHN3aXRjaCAoZ19sb2dnaW5nLnR5cGUpCisgICAgeworICAgIGNhc2UgLTE6CisKKyAgICAgICAgaWYgKGdfbG9nZ2luZy5mdW5jKQorICAgICAgICAgICAgZ19sb2dnaW5nLmZ1bmMoZ19sb2dnaW5nLnVzZXJkYXRhLCBmbXQsIGxpc3QpOworCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKworICAgICAgICBpZiAoZ19sb2dnaW5nLmZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZmcHJpbnRmKGdfbG9nZ2luZy5maWxlLCBmbXQsIGxpc3QpOworICAgICAgICAgICAgZmZsdXNoKGdfbG9nZ2luZy5maWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgY2FzZSAxOgorICAgIHsKKyAgICAgICAgY2hhciB0ZW1wWzEwMjRdOworICAgICAgICBfdnNucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSAvIHNpemVvZihjaGFyKSAtIDEsIGZtdCwgbGlzdCk7CisgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKHRlbXApOworICAgIH0KKyAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZhX2VuZChsaXN0KTsKK30KKworLyoKKyAgICBtZW1vcnlfdHJhY2tlcl9kdW1wKCkKKyAgICBEdW1wcyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZ2xvYmFsIG1lbW9yeSBhbGxvY2F0aW9uIGxpc3QKKyovCitzdGF0aWMgdm9pZCBtZW1vcnlfdHJhY2tlcl9kdW1wKCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgc3RydWN0IG1lbV9ibG9jayAqcCA9IChtZW10cmFjay5oZWFkID8gbWVtdHJhY2suaGVhZC0+bmV4dCA6IE5VTEwpOworCisgICAgbWVtdHJhY2tfbG9nKCJcbl9jdXJyZW50bHkgQWxsb2NhdGVkPSAlZDsgTWF4IGFsbG9jYXRlZD0gJWRcbiIsCisgICAgICAgICAgICAgICAgIG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkLCBtZW10cmFjay5tYXhfYWxsb2NhdGVkKTsKKworICAgIHdoaWxlIChwKQorICAgIHsKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorCisgICAgICAgIC8qd2hlbiB1c2luZyBvdXRwdXRkZWJ1Z3N0cmluZywgb3V0cHV0IGZpbGVuYW1lcyBzbyB0aGV5CisgICAgICAgICAgY2FuIGJlIGNsaWNrZWQgdG8gYmUgb3BlbmVkIGluIHZpc3VhbCBzdHVkaW8qLworICAgICAgICBpZiAoZ19sb2dnaW5nLnR5cGUgPT0gMSkKKyAgICAgICAgICAgIG1lbXRyYWNrX2xvZygibWVtYmxvY2tzWyVkXS5hZGRyPSAweCUuOHgsIG1lbWJsb2Nrc1slZF0uc2l6ZT0gJWQsIGZpbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgJXMoJWQpOlxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLT5hZGRyLCBpLCBwLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZpbGUsIHAtPmxpbmUpOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIG1lbXRyYWNrX2xvZygibWVtYmxvY2tzWyVkXS5hZGRyPSAweCUuOHgsIG1lbWJsb2Nrc1slZF0uc2l6ZT0gJWQsIGZpbGU6ICVzLCBsaW5lOiAlZFxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLT5hZGRyLCBpLCBwLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZpbGUsIHAtPmxpbmUpOworCisgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICArK2k7CisgICAgfQorCisgICAgbWVtdHJhY2tfbG9nKCJcbiIpOworfQorCisvKgorICAgIG1lbW9yeV90cmFja2VyX2NoZWNrX2ludGVncml0eShjaGFyKiBmaWxlLCB1bnNpZ25lZCBpbnQgZmlsZSkKKyAgICAgIGZpbGUgLSB0aGUgZmlsZSBuYW1lIHdoZXJlIHRoZSBjaGVjayB3YXMgcGxhY2VkCisgICAgICBsaW5lIC0gdGhlIGxpbmUgaW4gZmlsZSB3aGVyZSB0aGUgY2hlY2sgd2FzIHBsYWNlZAorICAgIElmIGEgcGFkZGluZ19zaXplIHdhcyBzdXBwbGllZCB0byB2cHhfbWVtb3J5X3RyYWNrZXJfaW5pdCgpCisgICAgdGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGVhLiBhZGRyIGluIHRoZSBsaXN0IHZlcmlmeWluZyB0aGF0CisgICAgYWRkci1wYWRkaW5nX3NpemUgYW5kIGFkZHIrcGFkZGluZ19zaXplIGlzIGZpbGxlZCB3aXRoIHBhZF92YWx1ZQorKi8KK3N0YXRpYyB2b2lkIG1lbW9yeV90cmFja2VyX2NoZWNrX2ludGVncml0eShjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkKK3sKKyAgICBpZiAobWVtdHJhY2sucGFkZGluZ19zaXplKQorICAgIHsKKyAgICAgICAgaW50IGksCisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBfc2hvd19tZSwKKyAgICAgICAgICAgICAgICAgKiBwX3Nob3dfbWUyOworICAgICAgICB1bnNpZ25lZCBpbnQgdGVtcG1lID0gbWVtdHJhY2sucGFkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgZGVhZDEsCisgICAgICAgICAgICAgICAgICAgICBkZWFkMjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqeF9ib3VuZHM7CisgICAgICAgIHN0cnVjdCBtZW1fYmxvY2sgKnAgPSBtZW10cmFjay5oZWFkLT5uZXh0OworCisgICAgICAgIHdoaWxlIChwKQorICAgICAgICB7CisgICAgICAgICAgICAvL3hfYm91bmRzID0gKHVuc2lnbmVkIGNoYXIqKXAtPmFkZHI7CisgICAgICAgICAgICAvL2JhY2sgdXAgVlBYX0JZVEVfQUxJR05NRU5UCisgICAgICAgICAgICAvL3hfYm91bmRzIC09IG1lbXRyYWNrLnBhZGRpbmdfc2l6ZTsKKworICAgICAgICAgICAgaWYgKHAtPnBhZGRlZCkgICAvLyBjYW4gdGhlIGJvdW5kcyBiZSBjaGVja2VkPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qeWVzLCBtb3ZlIHRvIHRoZSBhZGRyZXNzIHRoYXQgd2FzIGFjdHVhbGx5IGFsbG9jYXRlZAorICAgICAgICAgICAgICAgIGJ5IHRoZSB2cHhfKiBjYWxscyovCisgICAgICAgICAgICAgICAgeF9ib3VuZHMgPSAodW5zaWduZWQgY2hhciAqKSgoKHNpemVfdCAqKXAtPmFkZHIpWy0xXSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVtdHJhY2sucGFkZGluZ19zaXplOyBpICs9IHNpemVvZih1bnNpZ25lZCBpbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9zaG93X21lID0gKHhfYm91bmRzICsgaSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2hvd19tZTIgPSAodW5zaWduZWQgY2hhciAqKShwLT5hZGRyICsgcC0+c2l6ZSArIGkpOworCisgICAgICAgICAgICAgICAgICAgIE1FTV9UUkFDS19NRU1DUFkoJmRlYWQxLCBwX3Nob3dfbWUsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgTUVNX1RSQUNLX01FTUNQWSgmZGVhZDIsIHBfc2hvd19tZTIsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKGRlYWQxICE9IHRlbXBtZSkgfHwgKGRlYWQyICE9IHRlbXBtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXRyYWNrX2xvZygiXG5bdnB4X21lbSBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkXTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGluZGV4WyVkLCVkXSB7JXM6JWR9IGFkZHI9MHgleCwgc2l6ZT0lZCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmaWxlOiAlcywgbGluZTogJWQgYzA6MHgleCBjMToweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpLCBmaWxlLCBsaW5lLCBwLT5hZGRyLCBwLT5zaXplLCBwLT5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxpbmUsIGRlYWQxLCBkZWFkMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAgICBtZW1vcnlfdHJhY2tlcl9hZGQoc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGZpbGUsIHVuc2lnbmVkIGludCBsaW5lKQorICAgIEFkZHMgYW4gYWRkcmVzcyAoYWRkciksIGl0J3Mgc2l6ZSwgZmlsZSBhbmQgbGluZSBudW1iZXIgdG8gb3VyIGxpc3QuCisgICAgQWRqdXN0cyB0aGUgdG90YWwgYnl0ZXMgYWxsb2NhdGVkIGFuZCBtYXggYnl0ZXMgYWxsb2NhdGVkIGlmIG5lY2Vzc2FyeS4KKyAgICBJZiBtZW1vcnkgY2Fubm90IGJlIGFsbG9jYXRlZCB0aGUgbGlzdCB3aWxsIGJlIGRlc3Ryb3llZC4KKyovCit2b2lkIG1lbW9yeV90cmFja2VyX2FkZChzaXplX3QgYWRkciwgdW5zaWduZWQgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWRkZWQpCit7CisgICAgaWYgKCFtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCkpCisgICAgeworICAgICAgICBzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisgICAgICAgIHAgPSBNRU1fVFJBQ0tfTUFMTE9DKHNpemVvZihzdHJ1Y3QgbWVtX2Jsb2NrKSk7CisKKyAgICAgICAgaWYgKHApCisgICAgICAgIHsKKyAgICAgICAgICAgIHAtPnByZXYgICAgICAgPSBtZW10cmFjay50YWlsOworICAgICAgICAgICAgcC0+cHJldi0+bmV4dCA9IHA7CisgICAgICAgICAgICBwLT5hZGRyICAgICAgID0gYWRkcjsKKyAgICAgICAgICAgIHAtPnNpemUgICAgICAgPSBzaXplOworICAgICAgICAgICAgcC0+bGluZSAgICAgICA9IGxpbmU7CisgICAgICAgICAgICBwLT5maWxlICAgICAgID0gZmlsZTsKKyAgICAgICAgICAgIHAtPnBhZGRlZCAgICAgPSBwYWRkZWQ7CisgICAgICAgICAgICBwLT5uZXh0ICAgICAgID0gTlVMTDsKKworICAgICAgICAgICAgbWVtdHJhY2sudGFpbCA9IHA7CisKKyAgICAgICAgICAgIG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkICs9IHNpemU7CisKKyAgICAgICAgICAgIGlmIChtZW10cmFjay5jdXJyZW50X2FsbG9jYXRlZCA+IG1lbXRyYWNrLm1heF9hbGxvY2F0ZWQpCisgICAgICAgICAgICAgICAgbWVtdHJhY2subWF4X2FsbG9jYXRlZCA9IG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkOworCisgICAgICAgICAgICAvL21lbXRyYWNrX2xvZygibWVtb3J5X3RyYWNrZXJfYWRkOiBhZGRlZCBhZGRyPTB4JS44eFxuIiwgYWRkcik7CisKKyAgICAgICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl9hZGQ6IGVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IVxuIik7CisgICAgICAgICAgICBtZW1vcnlfdHJhY2tlcl91bmxvY2tfbXV0ZXgoKTsKKyAgICAgICAgICAgIHZweF9tZW1vcnlfdHJhY2tlcl9kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgICAgbWVtb3J5X3RyYWNrZXJfcmVtb3ZlKHNpemVfdCBhZGRyKQorICAgIFJlbW92ZXMgYW4gYWRkcmVzcyBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgc2l6ZSAoaWYgdGhleSBleGlzdCkKKyAgICBmcm9tIHRoZSBtZW1vcnkgdHJhY2tlciBsaXN0IGFuZCBhZGp1c3RzIHRoZSBjdXJyZW50IG51bWJlcgorICAgIG9mIGJ5dGVzIGFsbG9jYXRlZC4KKyAgICBSZXR1cm46CisgICAgICAwOiBvbiBzdWNjZXNzCisgICAgICAtMTogaWYgdGhlIG11dGV4IGNvdWxkIG5vdCBiZSBsb2NrZWQKKyAgICAgIC0yOiBpZiB0aGUgYWRkciB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0CisqLworaW50IG1lbW9yeV90cmFja2VyX3JlbW92ZShzaXplX3QgYWRkcikKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisKKyAgICBpZiAoIW1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKSkKKyAgICB7CisgICAgICAgIHN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKyAgICAgICAgaWYgKChwID0gbWVtb3J5X3RyYWNrZXJfZmluZChhZGRyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkIC09IHAtPnNpemU7CisKKyAgICAgICAgICAgIHAtPnByZXYtPm5leHQgPSBwLT5uZXh0OworCisgICAgICAgICAgICBpZiAocC0+bmV4dCkKKyAgICAgICAgICAgICAgICBwLT5uZXh0LT5wcmV2ID0gcC0+cHJldjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZW10cmFjay50YWlsID0gcC0+cHJldjsKKworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIE1FTV9UUkFDS19GUkVFKHApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkZHIpCisgICAgICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl9yZW1vdmUoKTogYWRkciBub3QgZm91bmQgaW4gbGlzdCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgMHglLjh4XG4iLCBhZGRyKTsKKworICAgICAgICAgICAgcmV0ID0gLTI7CisgICAgICAgIH0KKworICAgICAgICBtZW1vcnlfdHJhY2tlcl91bmxvY2tfbXV0ZXgoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICAgIG1lbW9yeV90cmFja2VyX2ZpbmQoc2l6ZV90IGFkZHIpCisgICAgRmluZHMgYW4gYWRkcmVzcyBpbiBvdXIgYWRkcnMgbGlzdAorICAgIE5PVEU6IHRoZSBtdXRleCBNVVNUIGJlIGxvY2tlZCBpbiB0aGUgb3RoZXIgaW50ZXJuYWwKKyAgICAgICAgICBmdW5jdGlvbnMgYmVmb3JlIGNhbGxpbmcgdGhpcyBvbmUuIFRoaXMgYXZvaWRzCisgICAgICAgICAgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIGxvY2tpbmcgYW5kIHVubG9ja2luZyBhcyBpbiBSZW1vdmUKKyAgICBSZXR1cm5zOiBwb2ludGVyIHRvIHRoZSBtZW0gYmxvY2sgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisqLworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKm1lbW9yeV90cmFja2VyX2ZpbmQoc2l6ZV90IGFkZHIpCit7CisgICAgc3RydWN0IG1lbV9ibG9jayAqcCA9IE5VTEw7CisKKyAgICBpZiAobWVtdHJhY2suaGVhZCkKKyAgICB7CisgICAgICAgIHAgPSBtZW10cmFjay5oZWFkLT5uZXh0OworCisgICAgICAgIHdoaWxlIChwICYmIChwLT5hZGRyICE9IGFkZHIpKQorICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKworI2lmICFkZWZpbmVkKE5PX01VVEVYKQorLyoKKyAgICBtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCkKKyAgICBMb2NrcyB0aGUgbWVtb3J5IHRyYWNrZXIgbXV0ZXggd2l0aCBhIHBsYXRmb3JtIHNwZWNpZmljIGNhbGwKKyAgICBSZXR1cm5zOgorICAgICAgICAwOiBTdWNjZXNzCisgICAgICAgPDA6IEZhaWx1cmUsIGVpdGhlciB0aGUgbXV0ZXggd2FzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICBvciB0aGUgY2FsbCB0byBsb2NrIHRoZSBtdXRleCBmYWlsZWQKKyovCitzdGF0aWMgaW50IG1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKQoreworICAgIGludCByZXQgPSAtMTsKKworICAgIGlmIChnX2JfbWVtX3RyYWNrZXJfaW5pdGVkKQorICAgIHsKKworI2lmIEhBVkVfUFRIUkVBRF9ICisgICAgICAgIHJldCA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbWVtdHJhY2subXV0ZXgpOworI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgICAgICByZXQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KG1lbXRyYWNrLm11dGV4LCBJTkZJTklURSk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgIHJldCA9IHNlbV90YWtlKG1lbXRyYWNrLm11dGV4LCBXQUlUX0ZPUkVWRVIpOworI2VuZGlmCisKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4OiBtdXRleCBsb2NrIGZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpCisgICAgVW5sb2NrcyB0aGUgbWVtb3J5IHRyYWNrZXIgbXV0ZXggd2l0aCBhIHBsYXRmb3JtIHNwZWNpZmljIGNhbGwKKyAgICBSZXR1cm5zOgorICAgICAgICAwOiBTdWNjZXNzCisgICAgICAgPDA6IEZhaWx1cmUsIGVpdGhlciB0aGUgbXV0ZXggd2FzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICBvciB0aGUgY2FsbCB0byB1bmxvY2sgdGhlIG11dGV4IGZhaWxlZAorKi8KK3N0YXRpYyBpbnQgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisKKyAgICBpZiAoZ19iX21lbV90cmFja2VyX2luaXRlZCkKKyAgICB7CisKKyNpZiBIQVZFX1BUSFJFQURfSAorICAgICAgICByZXQgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbWVtdHJhY2subXV0ZXgpOworI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgICAgICByZXQgPSAhUmVsZWFzZU11dGV4KG1lbXRyYWNrLm11dGV4KTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgcmV0ID0gc2VtX2dpdmUobWVtdHJhY2subXV0ZXgpOworI2VuZGlmCisKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl91bmxvY2tfbXV0ZXg6IG11dGV4IHVubG9jayBmYWlsZWRcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKgorICAgIHZweF9tZW1vcnlfdHJhY2tlcl9zZXRfZnVuY3Rpb25zCisKKyAgICBTZXRzIHRoZSBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zLgorCisgICAgUmV0dXJuOgorICAgICAgMDogb24gc3VjY2VzcworICAgICAgLTE6IGlmIHRoZSB1c2UgZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIGlzIG5vdCBzZXQuCisqLworaW50IHZweF9tZW1vcnlfdHJhY2tlcl9zZXRfZnVuY3Rpb25zKG1lbV90cmFja19tYWxsb2NfZnVuYyBnX21hbGxvY19sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtZW1fdHJhY2tfY2FsbG9jX2Z1bmMgZ19jYWxsb2NfbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWVtX3RyYWNrX3JlYWxsb2NfZnVuYyBnX3JlYWxsb2NfbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWVtX3RyYWNrX2ZyZWVfZnVuYyBnX2ZyZWVfbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWVtX3RyYWNrX21lbWNweV9mdW5jIGdfbWVtY3B5X2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1lbV90cmFja19tZW1zZXRfZnVuYyBnX21lbXNldF9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtZW1fdHJhY2tfbWVtbW92ZV9mdW5jIGdfbWVtbW92ZV9sKQoreworI2lmIFVTRV9HTE9CQUxfRlVOQ1RJT05fUE9JTlRFUlMKKworICAgIGlmIChnX21hbGxvY19sKQorICAgICAgICBnX21hbGxvYyA9IGdfbWFsbG9jX2w7CisKKyAgICBpZiAoZ19jYWxsb2NfbCkKKyAgICAgICAgZ19jYWxsb2MgPSBnX2NhbGxvY19sOworCisgICAgaWYgKGdfcmVhbGxvY19sKQorICAgICAgICBnX3JlYWxsb2MgPSBnX3JlYWxsb2NfbDsKKworICAgIGlmIChnX2ZyZWVfbCkKKyAgICAgICAgZ19mcmVlID0gZ19mcmVlX2w7CisKKyAgICBpZiAoZ19tZW1jcHlfbCkKKyAgICAgICAgZ19tZW1jcHkgPSBnX21lbWNweV9sOworCisgICAgaWYgKGdfbWVtc2V0X2wpCisgICAgICAgIGdfbWVtc2V0ID0gZ19tZW1zZXRfbDsKKworICAgIGlmIChnX21lbW1vdmVfbCkKKyAgICAgICAgZ19tZW1tb3ZlID0gZ19tZW1tb3ZlX2w7CisKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgKHZvaWQpZ19tYWxsb2NfbDsKKyAgICAodm9pZClnX2NhbGxvY19sOworICAgICh2b2lkKWdfcmVhbGxvY19sOworICAgICh2b2lkKWdfZnJlZV9sOworICAgICh2b2lkKWdfbWVtY3B5X2w7CisgICAgKHZvaWQpZ19tZW1zZXRfbDsKKyAgICAodm9pZClnX21lbW1vdmVfbDsKKyAgICByZXR1cm4gLTE7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfcG9ydHMvYXJtLmggYi9saWJ2cHgvdnB4X3BvcnRzL2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWE3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4X3BvcnRzL2FybS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIFZQWF9QT1JUU19BUk1fSAorI2RlZmluZSBWUFhfUE9SVFNfQVJNX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKKy8qQVJNdjVURSAiRW5oYW5jZWQgRFNQIiBpbnN0cnVjdGlvbnMuKi8KKyNkZWZpbmUgSEFTX0VEU1AgIDB4MDEKKy8qQVJNdjYgIlBhcmFsbGVsIiBvciAiTWVkaWEiIGluc3RydWN0aW9ucy4qLworI2RlZmluZSBIQVNfTUVESUEgMHgwMgorLypBUk12NyBvcHRpb25hbCBORU9OIGluc3RydWN0aW9ucy4qLworI2RlZmluZSBIQVNfTkVPTiAgMHgwNAorCitpbnQgYXJtX2NwdV9jYXBzKHZvaWQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9wb3J0cy9hcm1fY3B1ZGV0ZWN0LmMgYi9saWJ2cHgvdnB4X3BvcnRzL2FybV9jcHVkZXRlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmY5NWExCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9wb3J0cy9hcm1fY3B1ZGV0ZWN0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFybS5oIgorCitzdGF0aWMgaW50IGFybV9jcHVfZW52X2ZsYWdzKGludCAqZmxhZ3MpCit7CisgICAgY2hhciAqZW52OworICAgIGVudiA9IGdldGVudigiVlBYX1NJTURfQ0FQUyIpOworICAgIGlmIChlbnYgJiYgKmVudikKKyAgICB7CisgICAgICAgICpmbGFncyA9IChpbnQpc3RydG9sKGVudiwgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqZmxhZ3MgPSAwOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBhcm1fY3B1X2Vudl9tYXNrKHZvaWQpCit7CisgICAgY2hhciAqZW52OworICAgIGVudiA9IGdldGVudigiVlBYX1NJTURfQ0FQU19NQVNLIik7CisgICAgcmV0dXJuIGVudiAmJiAqZW52ID8gKGludClzdHJ0b2woZW52LCBOVUxMLCAwKSA6IH4wOworfQorCisjaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKKworaW50IGFybV9jcHVfY2Fwcyh2b2lkKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhY3R1YWxseSBiZSBhIG5vLW9wLiBUaGVyZSBpcyBubyB3YXkgdG8gYWRqdXN0IGFueSBvZgorICAgKiB0aGVzZSBiZWNhdXNlIHRoZSBSVENEIHRhYmxlcyBkbyBub3QgZXhpc3Q6IHRoZSBmdW5jdGlvbnMgYXJlIGNhbGxlZAorICAgKiBzdGF0aWNhbGx5ICovCisgICAgaW50IGZsYWdzOworICAgIGludCBtYXNrOworICAgIGlmICghYXJtX2NwdV9lbnZfZmxhZ3MoJmZsYWdzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBmbGFnczsKKyAgICB9CisgICAgbWFzayA9IGFybV9jcHVfZW52X21hc2soKTsKKyNpZiBIQVZFX0VEU1AKKyAgICBmbGFncyB8PSBIQVNfRURTUDsKKyNlbmRpZiAvKiBIQVZFX0VEU1AgKi8KKyNpZiBIQVZFX01FRElBCisgICAgZmxhZ3MgfD0gSEFTX01FRElBOworI2VuZGlmIC8qIEhBVkVfTUVESUEgKi8KKyNpZiBIQVZFX05FT04KKyAgICBmbGFncyB8PSBIQVNfTkVPTjsKKyNlbmRpZiAvKiBIQVZFX05FT04gKi8KKyAgICByZXR1cm4gZmxhZ3MgJiBtYXNrOworfQorCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAvKiBlbmQgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QgKi8KKy8qRm9yIEdldEV4Y2VwdGlvbkNvZGUoKSBhbmQgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04uKi8KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBXSU4zMl9FWFRSQV9MRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCitpbnQgYXJtX2NwdV9jYXBzKHZvaWQpCit7CisgICAgaW50IGZsYWdzOworICAgIGludCBtYXNrOworICAgIGlmICghYXJtX2NwdV9lbnZfZmxhZ3MoJmZsYWdzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBmbGFnczsKKyAgICB9CisgICAgbWFzayA9IGFybV9jcHVfZW52X21hc2soKTsKKyAgICAvKiBNU1ZDIGhhcyBubyBpbmxpbmUgX19hc20gc3VwcG9ydCBmb3IgQVJNLCBidXQgaXQgZG9lcyBsZXQgeW91IF9fZW1pdAorICAgICAqICBpbnN0cnVjdGlvbnMgdmlhIHRoZWlyIGFzc2VtYmxlZCBoZXggY29kZS4KKyAgICAgKiBBbGwgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBlc3NlbnRpYWxseSBub3BzLgorICAgICAqLworI2lmIEhBVkVfRURTUAorICAgIGlmIChtYXNrICYgSEFTX0VEU1ApCisgICAgeworICAgICAgICBfX3RyeQorICAgICAgICB7CisgICAgICAgICAgICAvKlBMRCBbcjEzXSovCisgICAgICAgICAgICBfX2VtaXQoMHhGNURERjAwMCk7CisgICAgICAgICAgICBmbGFncyB8PSBIQVNfRURTUDsKKyAgICAgICAgfQorICAgICAgICBfX2V4Y2VwdChHZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qSWdub3JlIGV4Y2VwdGlvbi4qLworICAgICAgICB9CisgICAgfQorI2lmIEhBVkVfTUVESUEKKyAgICBpZiAobWFzayAmIEhBU19NRURJQSkKKyAgICAgICAgX190cnkKKyAgICAgICAgeworICAgICAgICAgICAgLypTSEFERDggcjMscjMscjMqLworICAgICAgICAgICAgX19lbWl0KDB4RTYzMzNGOTMpOworICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX01FRElBOworICAgICAgICB9CisgICAgICAgIF9fZXhjZXB0KEdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTikKKyAgICAgICAgeworICAgICAgICAgICAgLypJZ25vcmUgZXhjZXB0aW9uLiovCisgICAgICAgIH0KKyAgICB9CisjaWYgSEFWRV9ORU9OCisgICAgaWYgKG1hc2sgJiBIQVNfTkVPTikKKyAgICB7CisgICAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qVk9SUiBxMCxxMCxxMCovCisgICAgICAgICAgICBfX2VtaXQoMHhGMjIwMDE1MCk7CisgICAgICAgICAgICBmbGFncyB8PSBIQVNfTkVPTjsKKyAgICAgICAgfQorICAgICAgICBfX2V4Y2VwdChHZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qSWdub3JlIGV4Y2VwdGlvbi4qLworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEhBVkVfTkVPTiAqLworI2VuZGlmIC8qIEhBVkVfTUVESUEgKi8KKyNlbmRpZiAvKiBIQVZFX0VEU1AgKi8KKyAgICByZXR1cm4gZmxhZ3MgJiBtYXNrOworfQorCisjZWxpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAvKiBlbmQgX01TQ19WRVIgKi8KKyNpbmNsdWRlIDxjcHUtZmVhdHVyZXMuaD4KKworaW50IGFybV9jcHVfY2Fwcyh2b2lkKQoreworICAgIGludCBmbGFnczsKKyAgICBpbnQgbWFzazsKKyAgICB1aW50NjRfdCBmZWF0dXJlczsKKyAgICBpZiAoIWFybV9jcHVfZW52X2ZsYWdzKCZmbGFncykpCisgICAgeworICAgICAgICByZXR1cm4gZmxhZ3M7CisgICAgfQorICAgIG1hc2sgPSBhcm1fY3B1X2Vudl9tYXNrKCk7CisgICAgZmVhdHVyZXMgPSBhbmRyb2lkX2dldENwdUZlYXR1cmVzKCk7CisKKyNpZiBIQVZFX0VEU1AKKyAgICBmbGFncyB8PSBIQVNfRURTUDsKKyNlbmRpZiAvKiBIQVZFX0VEU1AgKi8KKyNpZiBIQVZFX01FRElBCisgICAgZmxhZ3MgfD0gSEFTX01FRElBOworI2VuZGlmIC8qIEhBVkVfTUVESUEgKi8KKyNpZiBIQVZFX05FT04KKyAgICBpZiAoZmVhdHVyZXMgJiBBTkRST0lEX0NQVV9BUk1fRkVBVFVSRV9ORU9OKQorICAgICAgICBmbGFncyB8PSBIQVNfTkVPTjsKKyNlbmRpZiAvKiBIQVZFX05FT04gKi8KKyAgICByZXR1cm4gZmxhZ3MgJiBtYXNrOworfQorCisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykgLyogZW5kIF9fQU5EUk9JRF9fICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IGFybV9jcHVfY2Fwcyh2b2lkKQoreworICAgIEZJTEUgKmZpbjsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IG1hc2s7CisgICAgaWYgKCFhcm1fY3B1X2Vudl9mbGFncygmZmxhZ3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzOworICAgIH0KKyAgICBtYXNrID0gYXJtX2NwdV9lbnZfbWFzaygpOworICAgIC8qIFJlYWRpbmcgL3Byb2Mvc2VsZi9hdXh2IHdvdWxkIGJlIGVhc2llciwgYnV0IHRoYXQgZG9lc24ndCB3b3JrIHJlbGlhYmx5CisgICAgICogIG9uIEFuZHJvaWQuCisgICAgICogVGhpcyBhbHNvIG1lYW5zIHRoYXQgZGV0ZWN0aW9uIHdpbGwgZmFpbCBpbiBTY3JhdGNoYm94LgorICAgICAqLworICAgIGZpbiA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwiciIpOworICAgIGlmKGZpbiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogNTEyIHNob3VsZCBiZSBlbm91Z2ggZm9yIGFueWJvZHkgKGl0J3MgZXZlbiBlbm91Z2ggZm9yIGFsbCB0aGUgZmxhZ3MKKyAgICAgICAgICogdGhhdCB4ODYgaGFzIGFjY3VtdWxhdGVkLi4uIHNvIGZhcikuCisgICAgICAgICAqLworICAgICAgICBjaGFyIGJ1Zls1MTJdOworICAgICAgICB3aGlsZSAoZmdldHMoYnVmLCA1MTEsIGZpbikgIT0gTlVMTCkKKyAgICAgICAgeworI2lmIEhBVkVfRURTUCB8fCBIQVZFX05FT04KKyAgICAgICAgICAgIGlmIChtZW1jbXAoYnVmLCAiRmVhdHVyZXMiLCA4KSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKnA7CisjaWYgSEFWRV9FRFNQCisgICAgICAgICAgICAgICAgcD1zdHJzdHIoYnVmLCAiIGVkc3AiKTsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBOVUxMICYmIChwWzVdID09ICcgJyB8fCBwWzVdID09ICdcbicpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX0VEU1A7CisgICAgICAgICAgICAgICAgfQorI2lmIEhBVkVfTkVPTgorICAgICAgICAgICAgICAgIHAgPSBzdHJzdHIoYnVmLCAiIG5lb24iKTsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBOVUxMICYmIChwWzVdID09ICcgJyB8fCBwWzVdID09ICdcbicpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX05FT047CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEhBVkVfTkVPTiAqLworI2VuZGlmIC8qIEhBVkVfRURTUCAqLworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEhBVkVfRURTUCB8fCBIQVZFX05FT04gKi8KKyNpZiBIQVZFX01FRElBCisgICAgICAgICAgICBpZiAobWVtY21wKGJ1ZiwgIkNQVSBhcmNoaXRlY3R1cmU6IiwxNykgPT0gMCl7CisgICAgICAgICAgICAgICAgaW50IHZlcnNpb247CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGF0b2koYnVmKzE3KTsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA+PSA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX01FRElBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBIQVZFX01FRElBICovCisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZpbik7CisgICAgfQorICAgIHJldHVybiBmbGFncyAmIG1hc2s7Cit9CisjZWxzZSAvKiBlbmQgX19saW51eF9fICovCisjZXJyb3IgIi0tZW5hYmxlLXJ1bnRpbWUtY3B1LWRldGVjdCBzZWxlY3RlZCwgYnV0IG5vIENQVSBkZXRlY3Rpb24gbWV0aG9kICIgXAorICJhdmFpbGFibGUgZm9yIHlvdXIgcGxhdGZvcm0uIFJlY29uZmlndXJlIHdpdGggLS1kaXNhYmxlLXJ1bnRpbWUtY3B1LWRldGVjdC4iCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfcG9ydHMvYXNtX29mZnNldHMuaCBiL2xpYnZweC92cHhfcG9ydHMvYXNtX29mZnNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZhZTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9wb3J0cy9hc21fb2Zmc2V0cy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIFZQWF9QT1JUU19BU01fT0ZGU0VUU19ICisjZGVmaW5lIFZQWF9QT1JUU19BU01fT0ZGU0VUU19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBjdF9hc3NlcnQobmFtZSxjb25kKSBcCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0XyMjbmFtZSh2b2lkKSBVTlVTRUQ7XAorICAgIHN0YXRpYyB2b2lkIGFzc2VydF8jI25hbWUodm9pZCkge3N3aXRjaCgwKXtjYXNlIDA6Y2FzZSAhIShjb25kKTo7fX0KKworI2lmIElOTElORV9BU00KKyNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBhc20oIlxuIiAjc3ltICIgRVFVICUwIiA6IDogImkiICh2YWwpKQorI2RlZmluZSBCRUdJTiBpbnQgbWFpbih2b2lkKSB7CisjZGVmaW5lIEVORCByZXR1cm4gMDsgfQorI2Vsc2UKKyNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBjb25zdCBpbnQgc3ltID0gdmFsCisjZGVmaW5lIEJFR0lOCisjZGVmaW5lIEVORAorI2VuZGlmCisKKyNlbmRpZiAvKiBWUFhfUE9SVFNfQVNNX09GRlNFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9wb3J0cy9lbW1zLmFzbSBiL2xpYnZweC92cHhfcG9ydHMvZW1tcy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZDFhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfcG9ydHMvZW1tcy5hc20KQEAgLTAsMCArMSwzOCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgorCitzZWN0aW9uIC50ZXh0CitnbG9iYWwgc3ltKHZweF9yZXNldF9tbXhfc3RhdGUpIFBSSVZBVEUKK3N5bSh2cHhfcmVzZXRfbW14X3N0YXRlKToKKyAgICBlbW1zCisgICAgcmV0CisKKworJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAorZ2xvYmFsIHN5bSh2cHhfd2lueDY0X2ZsZGN3KSBQUklWQVRFCitzeW0odnB4X3dpbng2NF9mbGRjdyk6CisgICAgc3ViICAgcnNwLCA4CisgICAgbW92ICAgW3JzcF0sIHJjeCA7IHdpbiB4NjQgc3BlY2lmaWMKKyAgICBmbGRjdyBbcnNwXQorICAgIGFkZCAgIHJzcCwgOAorICAgIHJldAorCisKK2dsb2JhbCBzeW0odnB4X3dpbng2NF9mc3RjdykgUFJJVkFURQorc3ltKHZweF93aW54NjRfZnN0Y3cpOgorICAgIHN1YiAgIHJzcCwgOAorICAgIGZzdGN3IFtyc3BdCisgICAgbW92ICAgcmF4LCBbcnNwXQorICAgIGFkZCAgIHJzcCwgOAorICAgIHJldAorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3BvcnRzL21lbS5oIGIvbGlidnB4L3ZweF9wb3J0cy9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWU1MDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9wb3J0cy9tZW0uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBWUFhfUE9SVFNfTUVNX0gKKyNkZWZpbmUgVlBYX1BPUlRTX01FTV9ICisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorCisjaWYgKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpCisjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHR5cCx2YWwpICB0eXAgdmFsIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBERUNMQVJFX0FMSUdORUQobix0eXAsdmFsKSAgX19kZWNsc3BlYyhhbGlnbihuKSkgdHlwIHZhbAorI2Vsc2UKKyN3YXJuaW5nIE5vIGFsaWdubWVudCBkaXJlY3RpdmVzIGtub3duIGZvciB0aGlzIGNvbXBpbGVyLgorI2RlZmluZSBERUNMQVJFX0FMSUdORUQobix0eXAsdmFsKSAgdHlwIHZhbAorI2VuZGlmCisjZW5kaWYKKworCisvKiBEZWNsYXJlIGFuIGFsaWduZWQgYXJyYXkgb24gdGhlIHN0YWNrLCBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgc3RhY2sKKyAqIHBvaW50ZXIgbWF5IG5vdCBoYXZlIHRoZSBhbGlnbm1lbnQgd2UgZXhwZWN0LiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYQorICogbW9kaWZpZWQgbmFtZSwgdGhlbiBkZWZpbmVzIHZhbCB0byBiZSBhIHBvaW50ZXIsIGFuZCBhbGlnbnMgdGhhdCBwb2ludGVyCisgKiB3aXRoaW4gdGhlIGFycmF5LgorICovCisjZGVmaW5lIERFQ0xBUkVfQUxJR05FRF9BUlJBWShhLHR5cCx2YWwsbilcCit0eXAgdmFsIyNfWyhuKSsoYSkvc2l6ZW9mKHR5cCkrMV07XAordHlwICp2YWwgPSAodHlwKikoKCgoaW50cHRyX3QpdmFsIyNfKSsoYSktMSkmKChpbnRwdHJfdCktKGEpKSkKKworCisvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdXNhZ2Ugb2YgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSBoYXMgYmVlbiBhdWRpdGVkIHRvIGFzc3VyZQorICogdGhhdCBpdCdzIHNhZmUgdG8gdXNlIHVuaW5pdGlhbGl6ZWQuIFNpbGVuY2VzICdtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJworICogd2FybmluZ3Mgb24gZ2NjLgorICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18KKyNkZWZpbmUgVU5JTklUSUFMSVpFRF9JU19TQUZFKHgpIHg9eAorI2Vsc2UKKyNkZWZpbmUgVU5JTklUSUFMSVpFRF9JU19TQUZFKHgpIHgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9wb3J0cy9tZW1fb3BzLmggYi9saWJ2cHgvdnB4X3BvcnRzL21lbV9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWMyOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9wb3J0cy9tZW1fb3BzLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKiBcZmlsZQorICogXGJyaWVmIFByb3ZpZGVzIHBvcnRhYmxlIG1lbW9yeSBhY2Nlc3MgcHJpbWl0aXZlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgcG9ydGFibGUgcHJpbWl0aXZlcyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyBvZgorICogc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBpbiAxNiwgMjQsIGFuZCAzMiBiaXQgc2l6ZXMuIFRoZSBvcGVyYXRpb25zCisgKiBjYW4gYmUgcGVyZm9ybWVkIG9uIHVuYWxpZ25lZCBkYXRhIHJlZ2FyZGxlc3Mgb2YgaGFyZHdhcmUgc3VwcG9ydCBmb3IKKyAqIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyAqCisgKiBUaGUgdHlwZSB1c2VkIHRvIHBhc3MgdGhlIGludGVncmFsIHZhbHVlcyBtYXkgYmUgY2hhbmdlZCBieSBkZWZpbmluZworICogTUVNX1ZBTFVFX1Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gVGhlIHR5cGUgZ2l2ZW4gbXVzdCBiZSBhbiBpbnRlZ3JhbAorICogbnVtZXJpYyB0eXBlLgorICoKKyAqIFRoZSBhY3R1YWwgZnVuY3Rpb25zIGluc3RhbnRpYXRlZCBoYXZlIHRoZSBNRU1fVkFMVUVfVCB0eXBlIG5hbWUgcGFzdGVkCisgKiBvbiB0byB0aGUgc3ltYm9sIG5hbWUuIFRoaXMgYWxsb3dzIHRoZSBkZXZlbG9wZXIgdG8gaW5zdGFudGlhdGUgdGhlc2UKKyAqIG9wZXJhdGlvbnMgZm9yIG11bHRpcGxlIHR5cGVzIHdpdGhpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LiBUaGlzIGlzCisgKiBvZiBzb21ld2hhdCBxdWVzdGlvbmFibGUgdXRpbGl0eSwgYnV0IHRoZSBjYXBhYmlsaXR5IGV4aXN0cyBub25ldGhlbGVzcy4KKyAqIFVzZXJzIG5vdCBtYWtpbmcgdXNlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgY2FsbCB0aGUgZnVuY3Rpb25zCisgKiB3aXRob3V0IHRoZSB0eXBlIG5hbWUgYXBwZW5kZWQsIGFuZCB0aGUgcHJlcHJvY2Vzc29yIHdpbGwgdGFrZSBjYXJlIG9mCisgKiBpdC4KKyAqCisgKiBOT1RFOiBUaGlzIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBvbiBwbGF0Zm9ybXMgd2hlcmUgY2hhciA+IDEgb2N0ZXQgQVRNLgorICovCisKKyNpZm5kZWYgTUFVX1QKKy8qIE1pbmltdW0gQWNjZXNzIFVuaXQgZm9yIHRoaXMgdGFyZ2V0ICovCisjZGVmaW5lIE1BVV9UIHVuc2lnbmVkIGNoYXIKKyNlbmRpZgorCisjaWZuZGVmIE1FTV9WQUxVRV9UCisjZGVmaW5lIE1FTV9WQUxVRV9UIGludAorI2VuZGlmCisKKyN1bmRlZiBNRU1fVkFMVUVfVF9TWl9CSVRTCisjZGVmaW5lIE1FTV9WQUxVRV9UX1NaX0JJVFMgKHNpemVvZihNRU1fVkFMVUVfVCkgPDwgMykKKworI3VuZGVmICBtZW1fb3BzX3dyYXBfc3ltYm9sCisjZGVmaW5lIG1lbV9vcHNfd3JhcF9zeW1ib2woZm4pIG1lbV9vcHNfd3JhcF9zeW1ib2wyKGZuLCBNRU1fVkFMVUVfVCkKKyN1bmRlZiAgbWVtX29wc193cmFwX3N5bWJvbDIKKyNkZWZpbmUgbWVtX29wc193cmFwX3N5bWJvbDIoZm4sdHlwKSBtZW1fb3BzX3dyYXBfc3ltYm9sMyhmbix0eXApCisjdW5kZWYgIG1lbV9vcHNfd3JhcF9zeW1ib2wzCisjZGVmaW5lIG1lbV9vcHNfd3JhcF9zeW1ib2wzKGZuLHR5cCkgZm4jI19hc18jI3R5cAorCisvKgorICogSW5jbHVkZSBhbGlnbmVkIGFjY2VzcyByb3V0aW5lcworICovCisjZGVmaW5lIElOQ0xVREVEX0JZX01FTV9PUFNfSAorI2luY2x1ZGUgIm1lbV9vcHNfYWxpZ25lZC5oIgorI3VuZGVmICBJTkNMVURFRF9CWV9NRU1fT1BTX0gKKworI3VuZGVmICBtZW1fZ2V0X2JlMTYKKyNkZWZpbmUgbWVtX2dldF9iZTE2IG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9iZTE2KQorc3RhdGljIHVuc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfYmUxNihjb25zdCB2b2lkICp2bWVtKQoreworICAgIHVuc2lnbmVkIE1FTV9WQUxVRV9UICB2YWw7CisgICAgY29uc3QgTUFVX1QgICAgICAgICAgKm1lbSA9IChjb25zdCBNQVVfVCAqKXZtZW07CisKKyAgICB2YWwgPSBtZW1bMF0gPDwgODsKKyAgICB2YWwgfD0gbWVtWzFdOworICAgIHJldHVybiB2YWw7Cit9CisKKyN1bmRlZiAgbWVtX2dldF9iZTI0CisjZGVmaW5lIG1lbV9nZXRfYmUyNCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfYmUyNCkKK3N0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2JlMjQoY29uc3Qgdm9pZCAqdm1lbSkKK3sKKyAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOworICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOworCisgICAgdmFsID0gbWVtWzBdIDw8IDE2OworICAgIHZhbCB8PSBtZW1bMV0gPDwgODsKKyAgICB2YWwgfD0gbWVtWzJdOworICAgIHJldHVybiB2YWw7Cit9CisKKyN1bmRlZiAgbWVtX2dldF9iZTMyCisjZGVmaW5lIG1lbV9nZXRfYmUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfYmUzMikKK3N0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2JlMzIoY29uc3Qgdm9pZCAqdm1lbSkKK3sKKyAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOworICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOworCisgICAgdmFsID0gbWVtWzBdIDw8IDI0OworICAgIHZhbCB8PSBtZW1bMV0gPDwgMTY7CisgICAgdmFsIHw9IG1lbVsyXSA8PCA4OworICAgIHZhbCB8PSBtZW1bM107CisgICAgcmV0dXJuIHZhbDsKK30KKworI3VuZGVmICBtZW1fZ2V0X2xlMTYKKyNkZWZpbmUgbWVtX2dldF9sZTE2IG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9sZTE2KQorc3RhdGljIHVuc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfbGUxNihjb25zdCB2b2lkICp2bWVtKQoreworICAgIHVuc2lnbmVkIE1FTV9WQUxVRV9UICB2YWw7CisgICAgY29uc3QgTUFVX1QgICAgICAgICAgKm1lbSA9IChjb25zdCBNQVVfVCAqKXZtZW07CisKKyAgICB2YWwgPSBtZW1bMV0gPDwgODsKKyAgICB2YWwgfD0gbWVtWzBdOworICAgIHJldHVybiB2YWw7Cit9CisKKyN1bmRlZiAgbWVtX2dldF9sZTI0CisjZGVmaW5lIG1lbV9nZXRfbGUyNCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfbGUyNCkKK3N0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2xlMjQoY29uc3Qgdm9pZCAqdm1lbSkKK3sKKyAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOworICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOworCisgICAgdmFsID0gbWVtWzJdIDw8IDE2OworICAgIHZhbCB8PSBtZW1bMV0gPDwgODsKKyAgICB2YWwgfD0gbWVtWzBdOworICAgIHJldHVybiB2YWw7Cit9CisKKyN1bmRlZiAgbWVtX2dldF9sZTMyCisjZGVmaW5lIG1lbV9nZXRfbGUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfbGUzMikKK3N0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2xlMzIoY29uc3Qgdm9pZCAqdm1lbSkKK3sKKyAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOworICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOworCisgICAgdmFsID0gbWVtWzNdIDw8IDI0OworICAgIHZhbCB8PSBtZW1bMl0gPDwgMTY7CisgICAgdmFsIHw9IG1lbVsxXSA8PCA4OworICAgIHZhbCB8PSBtZW1bMF07CisgICAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBtZW1fZ2V0X3NfZ2VuZXJpYyhlbmQsc3opIFwKKyAgICBzdGF0aWMgc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfcyMjZW5kIyNzeihjb25zdCB2b2lkICp2bWVtKSB7XAorICAgICAgICBjb25zdCBNQVVfVCAqbWVtID0gKGNvbnN0IE1BVV9UKil2bWVtO1wKKyAgICAgICAgc2lnbmVkIE1FTV9WQUxVRV9UIHZhbCA9IG1lbV9nZXRfIyNlbmQjI3N6KG1lbSk7XAorICAgICAgICByZXR1cm4gKHZhbCA8PCAoTUVNX1ZBTFVFX1RfU1pfQklUUyAtIHN6KSkgPj4gKE1FTV9WQUxVRV9UX1NaX0JJVFMgLSBzeik7XAorICAgIH0KKworI3VuZGVmICBtZW1fZ2V0X3NiZTE2CisjZGVmaW5lIG1lbV9nZXRfc2JlMTYgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NiZTE2KQorbWVtX2dldF9zX2dlbmVyaWMoYmUsIDE2KQorCisjdW5kZWYgIG1lbV9nZXRfc2JlMjQKKyNkZWZpbmUgbWVtX2dldF9zYmUyNCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfc2JlMjQpCittZW1fZ2V0X3NfZ2VuZXJpYyhiZSwgMjQpCisKKyN1bmRlZiAgbWVtX2dldF9zYmUzMgorI2RlZmluZSBtZW1fZ2V0X3NiZTMyIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9zYmUzMikKK21lbV9nZXRfc19nZW5lcmljKGJlLCAzMikKKworI3VuZGVmICBtZW1fZ2V0X3NsZTE2CisjZGVmaW5lIG1lbV9nZXRfc2xlMTYgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTE2KQorbWVtX2dldF9zX2dlbmVyaWMobGUsIDE2KQorCisjdW5kZWYgIG1lbV9nZXRfc2xlMjQKKyNkZWZpbmUgbWVtX2dldF9zbGUyNCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfc2xlMjQpCittZW1fZ2V0X3NfZ2VuZXJpYyhsZSwgMjQpCisKKyN1bmRlZiAgbWVtX2dldF9zbGUzMgorI2RlZmluZSBtZW1fZ2V0X3NsZTMyIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9zbGUzMikKK21lbV9nZXRfc19nZW5lcmljKGxlLCAzMikKKworI3VuZGVmICBtZW1fcHV0X2JlMTYKKyNkZWZpbmUgbWVtX3B1dF9iZTE2IG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX3B1dF9iZTE2KQorc3RhdGljIHZvaWQgbWVtX3B1dF9iZTE2KHZvaWQgKnZtZW0sIE1FTV9WQUxVRV9UIHZhbCkKK3sKKyAgICBNQVVfVCAqbWVtID0gKE1BVV9UICopdm1lbTsKKworICAgIG1lbVswXSA9ICh2YWwgPj4gOCkgJiAweGZmOworICAgIG1lbVsxXSA9ICh2YWwgPj4gMCkgJiAweGZmOworfQorCisjdW5kZWYgIG1lbV9wdXRfYmUyNAorI2RlZmluZSBtZW1fcHV0X2JlMjQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fcHV0X2JlMjQpCitzdGF0aWMgdm9pZCBtZW1fcHV0X2JlMjQodm9pZCAqdm1lbSwgTUVNX1ZBTFVFX1QgdmFsKQoreworICAgIE1BVV9UICptZW0gPSAoTUFVX1QgKil2bWVtOworCisgICAgbWVtWzBdID0gKHZhbCA+PiAxNikgJiAweGZmOworICAgIG1lbVsxXSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKKyAgICBtZW1bMl0gPSAodmFsID4+ICAwKSAmIDB4ZmY7Cit9CisKKyN1bmRlZiAgbWVtX3B1dF9iZTMyCisjZGVmaW5lIG1lbV9wdXRfYmUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfYmUzMikKK3N0YXRpYyB2b2lkIG1lbV9wdXRfYmUzMih2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpCit7CisgICAgTUFVX1QgKm1lbSA9IChNQVVfVCAqKXZtZW07CisKKyAgICBtZW1bMF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisgICAgbWVtWzFdID0gKHZhbCA+PiAxNikgJiAweGZmOworICAgIG1lbVsyXSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKKyAgICBtZW1bM10gPSAodmFsID4+ICAwKSAmIDB4ZmY7Cit9CisKKyN1bmRlZiAgbWVtX3B1dF9sZTE2CisjZGVmaW5lIG1lbV9wdXRfbGUxNiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfbGUxNikKK3N0YXRpYyB2b2lkIG1lbV9wdXRfbGUxNih2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpCit7CisgICAgTUFVX1QgKm1lbSA9IChNQVVfVCAqKXZtZW07CisKKyAgICBtZW1bMF0gPSAodmFsID4+ICAwKSAmIDB4ZmY7CisgICAgbWVtWzFdID0gKHZhbCA+PiAgOCkgJiAweGZmOworfQorCisjdW5kZWYgIG1lbV9wdXRfbGUyNAorI2RlZmluZSBtZW1fcHV0X2xlMjQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fcHV0X2xlMjQpCitzdGF0aWMgdm9pZCBtZW1fcHV0X2xlMjQodm9pZCAqdm1lbSwgTUVNX1ZBTFVFX1QgdmFsKQoreworICAgIE1BVV9UICptZW0gPSAoTUFVX1QgKil2bWVtOworCisgICAgbWVtWzBdID0gKHZhbCA+PiAgMCkgJiAweGZmOworICAgIG1lbVsxXSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKKyAgICBtZW1bMl0gPSAodmFsID4+IDE2KSAmIDB4ZmY7Cit9CisKKyN1bmRlZiAgbWVtX3B1dF9sZTMyCisjZGVmaW5lIG1lbV9wdXRfbGUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfbGUzMikKK3N0YXRpYyB2b2lkIG1lbV9wdXRfbGUzMih2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpCit7CisgICAgTUFVX1QgKm1lbSA9IChNQVVfVCAqKXZtZW07CisKKyAgICBtZW1bMF0gPSAodmFsID4+ICAwKSAmIDB4ZmY7CisgICAgbWVtWzFdID0gKHZhbCA+PiAgOCkgJiAweGZmOworICAgIG1lbVsyXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKyAgICBtZW1bM10gPSAodmFsID4+IDI0KSAmIDB4ZmY7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3BvcnRzL21lbV9vcHNfYWxpZ25lZC5oIGIvbGlidnB4L3ZweF9wb3J0cy9tZW1fb3BzX2FsaWduZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2E2NTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9wb3J0cy9tZW1fb3BzX2FsaWduZWQuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKy8qIFxmaWxlCisgKiBcYnJpZWYgUHJvdmlkZXMgcG9ydGFibGUgbWVtb3J5IGFjY2VzcyBwcmltaXRpdmVzIGZvciBvcGVyYXRpbmcgb24gYWxpZ25lZAorICogICAgICAgIGRhdGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3BsaXQgZnJvbSBtZW1fb3BzLmggZm9yIGVhc2llciBtYWludGVuYW5jZS4gU2VlIG1lbV9vcHMuaAorICogZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBwcmltaXRpdmVzLgorICovCisjaWZuZGVmIElOQ0xVREVEX0JZX01FTV9PUFNfSAorI2Vycm9yIEluY2x1ZGUgbWVtX29wcy5oLCBub3QgbWVtX29wc19hbGlnbmVkLmggZGlyZWN0bHkuCisjZW5kaWYKKworLyogQXJjaGl0ZWN0dXJlcyB0aGF0IHByb3ZpZGUgaW5zdHJ1Y3Rpb25zIGZvciBkb2luZyB0aGlzIGJ5dGUgc3dhcHBpbmcKKyAqIGNvdWxkIHJlZGVmaW5lIHRoZXNlIG1hY3Jvcy4KKyAqLworI2RlZmluZSBzd2FwX2VuZGlhbl8xNih2YWwscmF3KSBkbyB7XAorICAgICAgICB2YWwgPSAoKHJhdz4+OCkgJiAweDAwZmYpIFwKKyAgICAgICAgICAgICAgfCAoKHJhdzw8OCkgJiAweGZmMDApO1wKKyAgICB9IHdoaWxlKDApCisjZGVmaW5lIHN3YXBfZW5kaWFuXzMyKHZhbCxyYXcpIGRvIHtcCisgICAgICAgIHZhbCA9ICgocmF3Pj4yNCkgJiAweDAwMDAwMGZmKSBcCisgICAgICAgICAgICAgIHwgKChyYXc+PjgpICAmIDB4MDAwMGZmMDApIFwKKyAgICAgICAgICAgICAgfCAoKHJhdzw8OCkgICYgMHgwMGZmMDAwMCkgXAorICAgICAgICAgICAgICB8ICgocmF3PDwyNCkgJiAweGZmMDAwMDAwKTsgXAorICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgc3dhcF9lbmRpYW5fMTZfc2UodmFsLHJhdykgZG8ge1wKKyAgICAgICAgc3dhcF9lbmRpYW5fMTYodmFsLHJhdyk7XAorICAgICAgICB2YWwgPSAoKHZhbCA8PCAxNikgPj4gMTYpO1wKKyAgICB9IHdoaWxlKDApCisjZGVmaW5lIHN3YXBfZW5kaWFuXzMyX3NlKHZhbCxyYXcpIHN3YXBfZW5kaWFuXzMyKHZhbCxyYXcpCisKKyNkZWZpbmUgbWVtX2dldF9uZV9hbGlnbmVkX2dlbmVyaWMoZW5kLHN6KSBcCisgICAgc3RhdGljIHVuc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfIyNlbmQjI3N6IyNfYWxpZ25lZChjb25zdCB2b2lkICp2bWVtKSB7XAorICAgICAgICBjb25zdCB1aW50IyNzeiMjX3QgKm1lbSA9IChjb25zdCB1aW50IyNzeiMjX3QgKil2bWVtO1wKKyAgICAgICAgcmV0dXJuICptZW07XAorICAgIH0KKworI2RlZmluZSBtZW1fZ2V0X3NuZV9hbGlnbmVkX2dlbmVyaWMoZW5kLHN6KSBcCisgICAgc3RhdGljIHNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X3MjI2VuZCMjc3ojI19hbGlnbmVkKGNvbnN0IHZvaWQgKnZtZW0pIHtcCisgICAgICAgIGNvbnN0IGludCMjc3ojI190ICptZW0gPSAoY29uc3QgaW50IyNzeiMjX3QgKil2bWVtO1wKKyAgICAgICAgcmV0dXJuICptZW07XAorICAgIH0KKworI2RlZmluZSBtZW1fZ2V0X3NlX2FsaWduZWRfZ2VuZXJpYyhlbmQsc3opIFwKKyAgICBzdGF0aWMgdW5zaWduZWQgTUVNX1ZBTFVFX1QgbWVtX2dldF8jI2VuZCMjc3ojI19hbGlnbmVkKGNvbnN0IHZvaWQgKnZtZW0pIHtcCisgICAgICAgIGNvbnN0IHVpbnQjI3N6IyNfdCAqbWVtID0gKGNvbnN0IHVpbnQjI3N6IyNfdCAqKXZtZW07XAorICAgICAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCB2YWwsIHJhdyA9ICptZW07XAorICAgICAgICBzd2FwX2VuZGlhbl8jI3N6KHZhbCxyYXcpO1wKKyAgICAgICAgcmV0dXJuIHZhbDtcCisgICAgfQorCisjZGVmaW5lIG1lbV9nZXRfc3NlX2FsaWduZWRfZ2VuZXJpYyhlbmQsc3opIFwKKyAgICBzdGF0aWMgc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfcyMjZW5kIyNzeiMjX2FsaWduZWQoY29uc3Qgdm9pZCAqdm1lbSkge1wKKyAgICAgICAgY29uc3QgaW50IyNzeiMjX3QgKm1lbSA9IChjb25zdCBpbnQjI3N6IyNfdCAqKXZtZW07XAorICAgICAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCB2YWwsIHJhdyA9ICptZW07XAorICAgICAgICBzd2FwX2VuZGlhbl8jI3N6IyNfc2UodmFsLHJhdyk7XAorICAgICAgICByZXR1cm4gdmFsO1wKKyAgICB9CisKKyNkZWZpbmUgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMoZW5kLHN6KSBcCisgICAgc3RhdGljIHZvaWQgbWVtX3B1dF8jI2VuZCMjc3ojI19hbGlnbmVkKHZvaWQgKnZtZW0sIE1FTV9WQUxVRV9UIHZhbCkge1wKKyAgICAgICAgdWludCMjc3ojI190ICptZW0gPSAodWludCMjc3ojI190ICopdm1lbTtcCisgICAgICAgICptZW0gPSAodWludCMjc3ojI190KXZhbDtcCisgICAgfQorCisjZGVmaW5lIG1lbV9wdXRfc2VfYWxpZ25lZF9nZW5lcmljKGVuZCxzeikgXAorICAgIHN0YXRpYyB2b2lkIG1lbV9wdXRfIyNlbmQjI3N6IyNfYWxpZ25lZCh2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpIHtcCisgICAgICAgIHVpbnQjI3N6IyNfdCAqbWVtID0gKHVpbnQjI3N6IyNfdCAqKXZtZW0sIHJhdztcCisgICAgICAgIHN3YXBfZW5kaWFuXyMjc3oocmF3LHZhbCk7XAorICAgICAgICAqbWVtID0gKHVpbnQjI3N6IyNfdClyYXc7XAorICAgIH0KKworI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpZiBDT05GSUdfQklHX0VORElBTgorI2RlZmluZSBtZW1fZ2V0X2JlX2FsaWduZWRfZ2VuZXJpYyhzeikgIG1lbV9nZXRfbmVfYWxpZ25lZF9nZW5lcmljKGJlLHN6KQorI2RlZmluZSBtZW1fZ2V0X3NiZV9hbGlnbmVkX2dlbmVyaWMoc3opIG1lbV9nZXRfc25lX2FsaWduZWRfZ2VuZXJpYyhiZSxzeikKKyNkZWZpbmUgbWVtX2dldF9sZV9hbGlnbmVkX2dlbmVyaWMoc3opICBtZW1fZ2V0X3NlX2FsaWduZWRfZ2VuZXJpYyhsZSxzeikKKyNkZWZpbmUgbWVtX2dldF9zbGVfYWxpZ25lZF9nZW5lcmljKHN6KSBtZW1fZ2V0X3NzZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCisjZGVmaW5lIG1lbV9wdXRfYmVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMoYmUsc3opCisjZGVmaW5lIG1lbV9wdXRfbGVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9zZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCisjZWxzZQorI2RlZmluZSBtZW1fZ2V0X2JlX2FsaWduZWRfZ2VuZXJpYyhzeikgIG1lbV9nZXRfc2VfYWxpZ25lZF9nZW5lcmljKGJlLHN6KQorI2RlZmluZSBtZW1fZ2V0X3NiZV9hbGlnbmVkX2dlbmVyaWMoc3opIG1lbV9nZXRfc3NlX2FsaWduZWRfZ2VuZXJpYyhiZSxzeikKKyNkZWZpbmUgbWVtX2dldF9sZV9hbGlnbmVkX2dlbmVyaWMoc3opICBtZW1fZ2V0X25lX2FsaWduZWRfZ2VuZXJpYyhsZSxzeikKKyNkZWZpbmUgbWVtX2dldF9zbGVfYWxpZ25lZF9nZW5lcmljKHN6KSBtZW1fZ2V0X3NuZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCisjZGVmaW5lIG1lbV9wdXRfYmVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9zZV9hbGlnbmVkX2dlbmVyaWMoYmUsc3opCisjZGVmaW5lIG1lbV9wdXRfbGVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCisjZW5kaWYKKworI3VuZGVmICBtZW1fZ2V0X2JlMTZfYWxpZ25lZAorI2RlZmluZSBtZW1fZ2V0X2JlMTZfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfYmUxNl9hbGlnbmVkKQorbWVtX2dldF9iZV9hbGlnbmVkX2dlbmVyaWMoMTYpCisKKyN1bmRlZiAgbWVtX2dldF9iZTMyX2FsaWduZWQKKyNkZWZpbmUgbWVtX2dldF9iZTMyX2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X2JlMzJfYWxpZ25lZCkKK21lbV9nZXRfYmVfYWxpZ25lZF9nZW5lcmljKDMyKQorCisjdW5kZWYgIG1lbV9nZXRfbGUxNl9hbGlnbmVkCisjZGVmaW5lIG1lbV9nZXRfbGUxNl9hbGlnbmVkIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9sZTE2X2FsaWduZWQpCittZW1fZ2V0X2xlX2FsaWduZWRfZ2VuZXJpYygxNikKKworI3VuZGVmICBtZW1fZ2V0X2xlMzJfYWxpZ25lZAorI2RlZmluZSBtZW1fZ2V0X2xlMzJfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfbGUzMl9hbGlnbmVkKQorbWVtX2dldF9sZV9hbGlnbmVkX2dlbmVyaWMoMzIpCisKKyN1bmRlZiAgbWVtX2dldF9zYmUxNl9hbGlnbmVkCisjZGVmaW5lIG1lbV9nZXRfc2JlMTZfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfc2JlMTZfYWxpZ25lZCkKK21lbV9nZXRfc2JlX2FsaWduZWRfZ2VuZXJpYygxNikKKworI3VuZGVmICBtZW1fZ2V0X3NiZTMyX2FsaWduZWQKKyNkZWZpbmUgbWVtX2dldF9zYmUzMl9hbGlnbmVkIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9zYmUzMl9hbGlnbmVkKQorbWVtX2dldF9zYmVfYWxpZ25lZF9nZW5lcmljKDMyKQorCisjdW5kZWYgIG1lbV9nZXRfc2xlMTZfYWxpZ25lZAorI2RlZmluZSBtZW1fZ2V0X3NsZTE2X2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTE2X2FsaWduZWQpCittZW1fZ2V0X3NsZV9hbGlnbmVkX2dlbmVyaWMoMTYpCisKKyN1bmRlZiAgbWVtX2dldF9zbGUzMl9hbGlnbmVkCisjZGVmaW5lIG1lbV9nZXRfc2xlMzJfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfc2xlMzJfYWxpZ25lZCkKK21lbV9nZXRfc2xlX2FsaWduZWRfZ2VuZXJpYygzMikKKworI3VuZGVmICBtZW1fcHV0X2JlMTZfYWxpZ25lZAorI2RlZmluZSBtZW1fcHV0X2JlMTZfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfYmUxNl9hbGlnbmVkKQorbWVtX3B1dF9iZV9hbGlnbmVkX2dlbmVyaWMoMTYpCisKKyN1bmRlZiAgbWVtX3B1dF9iZTMyX2FsaWduZWQKKyNkZWZpbmUgbWVtX3B1dF9iZTMyX2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fcHV0X2JlMzJfYWxpZ25lZCkKK21lbV9wdXRfYmVfYWxpZ25lZF9nZW5lcmljKDMyKQorCisjdW5kZWYgIG1lbV9wdXRfbGUxNl9hbGlnbmVkCisjZGVmaW5lIG1lbV9wdXRfbGUxNl9hbGlnbmVkIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX3B1dF9sZTE2X2FsaWduZWQpCittZW1fcHV0X2xlX2FsaWduZWRfZ2VuZXJpYygxNikKKworI3VuZGVmICBtZW1fcHV0X2xlMzJfYWxpZ25lZAorI2RlZmluZSBtZW1fcHV0X2xlMzJfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfbGUzMl9hbGlnbmVkKQorbWVtX3B1dF9sZV9hbGlnbmVkX2dlbmVyaWMoMzIpCisKKyN1bmRlZiBtZW1fZ2V0X25lX2FsaWduZWRfZ2VuZXJpYworI3VuZGVmIG1lbV9nZXRfc2VfYWxpZ25lZF9nZW5lcmljCisjdW5kZWYgbWVtX2dldF9zbmVfYWxpZ25lZF9nZW5lcmljCisjdW5kZWYgbWVtX2dldF9zc2VfYWxpZ25lZF9nZW5lcmljCisjdW5kZWYgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMKKyN1bmRlZiBtZW1fcHV0X3NlX2FsaWduZWRfZ2VuZXJpYworI3VuZGVmIHN3YXBfZW5kaWFuXzE2CisjdW5kZWYgc3dhcF9lbmRpYW5fMzIKKyN1bmRlZiBzd2FwX2VuZGlhbl8xNl9zZQorI3VuZGVmIHN3YXBfZW5kaWFuXzMyX3NlCmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3BvcnRzL3ZweF9wb3J0cy5tayBiL2xpYnZweC92cHhfcG9ydHMvdnB4X3BvcnRzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Y2I1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4X3BvcnRzL3ZweF9wb3J0cy5tawpAQCAtMCwwICsxLDI2IEBACisjIworIyMgIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIworIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisjIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorIyMKKworCitQT1JUU19TUkNTLXllcyArPSB2cHhfcG9ydHMubWsKKworUE9SVFNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gYXNtX29mZnNldHMuaAorUE9SVFNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gbWVtLmgKK1BPUlRTX1NSQ1MtJChCVUlMRF9MSUJWUFgpICs9IHZweF90aW1lci5oCisKK2lmZXEgKCQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkseWVzKQorUE9SVFNfU1JDUy0kKEJVSUxEX0xJQlZQWCkgKz0gZW1tcy5hc20KK1BPUlRTX1NSQ1MtJChCVUlMRF9MSUJWUFgpICs9IHg4Ni5oCitQT1JUU19TUkNTLSQoQlVJTERfTElCVlBYKSArPSB4ODZfYWJpX3N1cHBvcnQuYXNtCitQT1JUU19TUkNTLSQoQlVJTERfTElCVlBYKSArPSB4ODZfY3B1aWQuYworZW5kaWYKKworUE9SVFNfU1JDUy0kKEFSQ0hfQVJNKSArPSBhcm1fY3B1ZGV0ZWN0LmMKK1BPUlRTX1NSQ1MtJChBUkNIX0FSTSkgKz0gYXJtLmgKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfcG9ydHMvdnB4X3RpbWVyLmggYi9saWJ2cHgvdnB4X3BvcnRzL3ZweF90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2UwODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4X3BvcnRzL3ZweF90aW1lci5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBWUFhfVElNRVJfSAorI2RlZmluZSBWUFhfVElNRVJfSAorI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgorCisjaWYgQ09ORklHX09TX1NVUFBPUlQKKworI2lmIGRlZmluZWQoX1dJTjMyKQorLyoKKyAqIFdpbjMyIHNwZWNpZmljIGluY2x1ZGVzCisgKi8KKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorLyoKKyAqIFBPU0lYIHNwZWNpZmljIGluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisvKiB0aW1lcnN1YiBpcyBub3QgcHJvdmlkZWQgYnkgbXN5cyBhdCB0aGlzIHRpbWUuICovCisjaWZuZGVmIHRpbWVyc3ViCisjZGVmaW5lIHRpbWVyc3ViKGEsIGIsIHJlc3VsdCkgXAorICAgIGRvIHsgXAorICAgICAgICAocmVzdWx0KS0+dHZfc2VjID0gKGEpLT50dl9zZWMgLSAoYiktPnR2X3NlYzsgXAorICAgICAgICAocmVzdWx0KS0+dHZfdXNlYyA9IChhKS0+dHZfdXNlYyAtIChiKS0+dHZfdXNlYzsgXAorICAgICAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPCAwKSB7IFwKKyAgICAgICAgICAgIC0tKHJlc3VsdCktPnR2X3NlYzsgXAorICAgICAgICAgICAgKHJlc3VsdCktPnR2X3VzZWMgKz0gMTAwMDAwMDsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisjZW5kaWYKKworCitzdHJ1Y3QgdnB4X3VzZWNfdGltZXIKK3sKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICBMQVJHRV9JTlRFR0VSICBiZWdpbiwgZW5kOworI2Vsc2UKKyAgICBzdHJ1Y3QgdGltZXZhbCBiZWdpbiwgZW5kOworI2VuZGlmCit9OworCisKK3N0YXRpYyB2b2lkCit2cHhfdXNlY190aW1lcl9zdGFydChzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgKnQpCit7CisjaWYgZGVmaW5lZChfV0lOMzIpCisgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnQtPmJlZ2luKTsKKyNlbHNlCisgICAgZ2V0dGltZW9mZGF5KCZ0LT5iZWdpbiwgTlVMTCk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZAordnB4X3VzZWNfdGltZXJfbWFyayhzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgKnQpCit7CisjaWYgZGVmaW5lZChfV0lOMzIpCisgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnQtPmVuZCk7CisjZWxzZQorICAgIGdldHRpbWVvZmRheSgmdC0+ZW5kLCBOVUxMKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQ2NF90Cit2cHhfdXNlY190aW1lcl9lbGFwc2VkKHN0cnVjdCB2cHhfdXNlY190aW1lciAqdCkKK3sKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXEsIGRpZmY7CisKKyAgICBkaWZmLlF1YWRQYXJ0ID0gdC0+ZW5kLlF1YWRQYXJ0IC0gdC0+YmVnaW4uUXVhZFBhcnQ7CisKKyAgICBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxKTsKKyAgICByZXR1cm4gZGlmZi5RdWFkUGFydCAqIDEwMDAwMDAgLyBmcmVxLlF1YWRQYXJ0OworI2Vsc2UKKyAgICBzdHJ1Y3QgdGltZXZhbCBkaWZmOworCisgICAgdGltZXJzdWIoJnQtPmVuZCwgJnQtPmJlZ2luLCAmZGlmZik7CisgICAgcmV0dXJuIGRpZmYudHZfc2VjICogMTAwMDAwMCArIGRpZmYudHZfdXNlYzsKKyNlbmRpZgorfQorCisjZWxzZSAvKiBDT05GSUdfT1NfU1VQUE9SVCA9IDAqLworCisvKiBFbXB0eSB0aW1lciBmdW5jdGlvbnMgaWYgQ09ORklHX09TX1NVUFBPUlQgPSAwICovCisjaWZuZGVmIHRpbWVyc3ViCisjZGVmaW5lIHRpbWVyc3ViKGEsIGIsIHJlc3VsdCkKKyNlbmRpZgorCitzdHJ1Y3QgdnB4X3VzZWNfdGltZXIKK3sKKyAgICB2b2lkICpkdW1teTsKK307CisKK3N0YXRpYyB2b2lkCit2cHhfdXNlY190aW1lcl9zdGFydChzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgKnQpIHsgfQorCitzdGF0aWMgdm9pZAordnB4X3VzZWNfdGltZXJfbWFyayhzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgKnQpIHsgfQorCitzdGF0aWMgbG9uZwordnB4X3VzZWNfdGltZXJfZWxhcHNlZChzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgKnQpIHsgcmV0dXJuIDA7IH0KKworI2VuZGlmIC8qIENPTkZJR19PU19TVVBQT1JUICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9wb3J0cy92cHh0eXBlcy5oIGIvbGlidnB4L3ZweF9wb3J0cy92cHh0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmIwODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4X3BvcnRzL3ZweHR5cGVzLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIF9fVlBYVFlQRVNfSF9fCisjZGVmaW5lIF9fVlBYVFlQRVNfSF9fCisKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKKy8vI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGJhc2V0c2QuaD4KK3R5cGVkZWYgU1NJWkVfVCBzc2l6ZV90OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU1RESU5UX0gpICYmIEhBVkVfU1RESU5UX0gKKy8qIEM5OSB0eXBlcyBhcmUgcHJlZmVycmVkIHRvIHZweCBpbnRlZ2VyIHR5cGVzICovCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qIVxkZWZncm91cCBiYXNldHlwZXMgQmFzZSBUeXBlcworICBAeyovCisjaWYgIWRlZmluZWQoSEFWRV9TVERJTlRfSCkgJiYgIWRlZmluZWQoSU5UX1RfREVGSU5FRCkKKyMgaWZkZWYgU1RSSUNUVFlQRVMKK3R5cGVkZWYgc2lnbmVkIGNoYXIgIGludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgICBpbnQzMl90OworIyBlbHNlCit0eXBlZGVmIGNoYXIgICAgICAgICBpbnQ4X3Q7Cit0eXBlZGVmIHNob3J0ICAgICAgICBpbnQxNl90OwordHlwZWRlZiBpbnQgICAgICAgICAgaW50MzJfdDsKKyMgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVpbnQzMl90OworI2VuZGlmCisKK3R5cGVkZWYgaW50OF90ICAgICB2cHhzODsKK3R5cGVkZWYgdWludDhfdCAgICB2cHh1ODsKK3R5cGVkZWYgaW50MTZfdCAgICB2cHhzMTY7Cit0eXBlZGVmIHVpbnQxNl90ICAgdnB4dTE2OwordHlwZWRlZiBpbnQzMl90ICAgIHZweHMzMjsKK3R5cGVkZWYgdWludDMyX3QgICB2cHh1MzI7Cit0eXBlZGVmIGludDMyX3QgICAgdnB4Ym9vbDsKKworZW51bSB7dnB4ZmFsc2UsIHZweHRydWV9OworCisvKiFcZGVmIE9UQworICAgXGJyaWVmIGEgbWFjcm8gc3VpdGFibGUgZm9yIGRlY2xhcmluZyBhIGNvbnN0YW50ICN2cHh0YyovCisvKiFcZGVmIFZQWFRDCisgICBcYnJpZWYgcHJpbnRmIGZvcm1hdCBzdHJpbmcgc3VpdGFibGUgZm9yIHByaW50aW5nIGFuICN2cHh0YyovCisjaWZkZWYgVU5JQ09ERQorIyBpZmRlZiBOT19XQ0hBUgorIyAgZXJyb3IgIm5vIG5vbi13Y2hhciBzdXBwb3J0IGFkZGVkIHlldCIKKyMgZWxzZQorIyAgaW5jbHVkZSA8d2NoYXIuaD4KK3R5cGVkZWYgd2NoYXJfdCB2cHh0YzsKKyMgIGRlZmluZSBPVEMoc3RyKSBMICMjIHN0cgorIyAgZGVmaW5lIFZQWFRDICJscyIKKyMgZW5kaWYgLypOT19XQ0hBUiovCisjZWxzZQordHlwZWRlZiBjaGFyIHZweHRjOworIyBkZWZpbmUgT1RDKHN0cikgKHZweHRjKilzdHIKKyMgZGVmaW5lIFZQWFRDICJzIgorI2VuZGlmIC8qVU5JQ09ERSovCisvKkB9IGVuZCAtIGJhc2UgdHlwZXMqLworCisvKiFcYWRkdG9ncm91cCBiYXNldHlwZXMKKyAgQHsqLworLyohXGRlZiBWUFg2NAorICAgXGJyaWVmIHByaW50ZiBmb3JtYXQgc3RyaW5nIHN1aXRhYmxlIGZvciBwcmludGluZyBhbiAjdnB4czY0Ki8KKyNpZiBkZWZpbmVkKEhBVkVfU1RESU5UX0gpCisjIGRlZmluZSBWUFg2NCBQUklkNjQKK3R5cGVkZWYgaW50NjRfdCB2cHhzNjQ7CisjZWxpZiBkZWZpbmVkKEhBU0xPTkdMT05HKQorIyB1bmRlZiAgUFJJZDY0CisjIGRlZmluZSBQUklkNjQgImxsZCIKKyMgZGVmaW5lIFZQWDY0IFBSSWQ2NAordHlwZWRlZiBsb25nIGxvbmcgdnB4czY0OworI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorIyB1bmRlZiAgUFJJZDY0CisjIGRlZmluZSBQUklkNjQgIkk2NGQiCisjIGRlZmluZSBWUFg2NCBQUklkNjQKK3R5cGVkZWYgX19pbnQ2NCB2cHhzNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdnB4dTY0OworI2VsaWYgZGVmaW5lZChfX3VDbGludXhfXykgJiYgZGVmaW5lZChDSElQX0RNNjQyKQorIyBpbmNsdWRlIDxsZGRrLmg+CisjIHVuZGVmICBQUklkNjQKKyMgZGVmaW5lIFBSSWQ2NCAibGxkIgorIyBkZWZpbmUgVlBYNjQgUFJJZDY0Cit0eXBlZGVmIGxvbmcgdnB4czY0OworI2Vsc2UKKyMgZXJyb3IgIjY0IGJpdCBpbnRlZ2VyIHR5cGUgdW5kZWZpbmVkIGZvciB0aGlzIHBsYXRmb3JtISIKKyNlbmRpZgorI2lmICFkZWZpbmVkKEhBVkVfU1RESU5UX0gpICYmICFkZWZpbmVkKElOVF9UX0RFRklORUQpCit0eXBlZGVmIHZweHM2NCBpbnQ2NF90OwordHlwZWRlZiB2cHh1NjQgdWludDY0X3Q7CisjZW5kaWYKKy8qIUB9IGVuZCAtIGJhc2UgdHlwZXMqLworCisvKiFcaW5ncm91cCBiYXNldHlwZXMKKyAgIFxicmllZiBDb21tb24gcmV0dXJuIHR5cGUqLwordHlwZWRlZiBlbnVtCit7CisgICAgVlBYX05PVF9GT1VORCAgICAgICAgPSAtNDA0LAorICAgIFZQWF9CVUZGRVJfRU1QVFkgICAgID0gLTIwMiwKKyAgICBWUFhfQlVGRkVSX0ZVTEwgICAgICA9IC0yMDEsCisKKyAgICBWUFhfQ09OTlJFRlVTRUQgICAgICA9IC0xMDIsCisgICAgVlBYX1RJTUVET1VUICAgICAgICAgPSAtMTAxLAorICAgIFZQWF9XT1VMREJMT0NLICAgICAgID0gLTEwMCwKKworICAgIFZQWF9ORVRfRVJST1IgICAgICAgID0gLTksCisgICAgVlBYX0lOVkFMSURfVkVSU0lPTiAgPSAtOCwKKyAgICBWUFhfSU5QUk9HUkVTUyAgICAgICA9IC03LAorICAgIFZQWF9OT1RfU1VQUCAgICAgICAgID0gLTYsCisgICAgVlBYX05PX01FTSAgICAgICAgICAgPSAtMywKKyAgICBWUFhfSU5WQUxJRF9QQVJBTVMgICA9IC0yLAorICAgIFZQWF9FUlJPUiAgICAgICAgICAgID0gLTEsCisgICAgVlBYX09LICAgICAgICAgICAgICAgPSAwLAorICAgIFZQWF9ET05FICAgICAgICAgICAgID0gMQorfSB2cHhzYzsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKyMgZGVmaW5lIERMTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgZGVmaW5lIERMTEVYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgZGVmaW5lIERMTExPQ0FMCisjZWxpZiBkZWZpbmVkKExJTlVYKQorIyBkZWZpbmUgRExMSU1QT1JUCisvKnZpc2liaWxpdHkgYXR0cmlidXRlIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGluIDMuNCBhbmQgbGF0ZXIuCisgIHNlZTogaHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eSBmb3IgbW9yZSBpbmZvKi8KKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXzw8MTZ8KF9fR05VQ19NSU5PUl9fJjB4ZmYpKSA+PSAoMzw8MTZ8NCkpCisjICBkZWZpbmUgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyBlbmRpZiAvKmRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19QUkVSRVEoMyw0KSovCisjIGlmZGVmIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgIGRlZmluZSBETExFWFBPUlQgICBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgIGRlZmluZSBETExMT0NBTCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorIyBlbHNlCisjICBkZWZpbmUgRExMRVhQT1JUCisjICBkZWZpbmUgRExMTE9DQUwKKyMgZW5kaWYgLypHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZKi8KKyNlbmRpZiAvKnBsYXRmb3JtIGlmZGVmcyovCisKKyNlbmRpZiAvKl9fVlBYVFlQRVNfSF9fKi8KKworI3VuZGVmIFZQWEFQSQorLyohXGRlZiBWUFhBUEkKKyAgIFxicmllZiBsaWJyYXJ5IGNhbGxpbmcgY29udmVudGlvbi9zdG9yYWdlIGNsYXNzIGF0dHJpYnV0ZXMuCisKKyAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBpbXBvcnRlZCB0aHJvdWdoIGEgZGxsCisgICBvciBpcyBmcm9tIGEgc3RhdGljIGxpYnJhcnkuKi8KKyNpZmRlZiBWUFhETEwKKyMgaWZkZWYgVlBYRExMRVhQT1JUCisjICBkZWZpbmUgVlBYQVBJIERMTEVYUE9SVAorIyBlbHNlCisjICBkZWZpbmUgVlBYQVBJIERMTElNUE9SVAorIyBlbmRpZiAvKlZQWERMTEVYUE9SVCovCisjZWxzZQorIyBkZWZpbmUgVlBYQVBJCisjZW5kaWYgLypWUFhETEwqLwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9wb3J0cy94ODYuaCBiL2xpYnZweC92cHhfcG9ydHMveDg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkOGM0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfcG9ydHMveDg2LmgKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaWZuZGVmIFZQWF9QT1JUU19YODZfSAorI2RlZmluZSBWUFhfUE9SVFNfWDg2X0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIFZQWF9DUFVfVU5LTk9XTiA9IC0xLAorICAgIFZQWF9DUFVfQU1ELAorICAgIFZQWF9DUFVfQU1EX09MRCwKKyAgICBWUFhfQ1BVX0NFTlRBVVIsCisgICAgVlBYX0NQVV9DWVJJWCwKKyAgICBWUFhfQ1BVX0lOVEVMLAorICAgIFZQWF9DUFVfTkVYR0VOLAorICAgIFZQWF9DUFVfTlNDLAorICAgIFZQWF9DUFVfUklTRSwKKyAgICBWUFhfQ1BVX1NJUywKKyAgICBWUFhfQ1BVX1RSQU5TTUVUQSwKKyAgICBWUFhfQ1BVX1RSQU5TTUVUQV9PTEQsCisgICAgVlBYX0NQVV9VTUMsCisgICAgVlBYX0NQVV9WSUEsCisKKyAgICBWUFhfQ1BVX0xBU1QKK30gIHZweF9jcHVfdDsKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCisjaWYgQVJDSF9YODZfNjQKKyNkZWZpbmUgY3B1aWQoZnVuYyxheCxieCxjeCxkeClcCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNwdWlkICAgICAgICAgICBcblx0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAoYXgpLCAiPWIiIChieCksICI9YyIgKGN4KSwgIj1kIiAoZHgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiYSIgIChmdW5jKSk7CisjZWxzZQorI2RlZmluZSBjcHVpZChmdW5jLGF4LGJ4LGN4LGR4KVwKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAibW92ICUlZWJ4LCAlJWVkaSAgIFxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNwdWlkICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ4Y2hnICUlZWRpLCAlJWVieCAgXG5cdCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKGF4KSwgIj1EIiAoYngpLCAiPWMiIChjeCksICI9ZCIgKGR4KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogImEiIChmdW5jKSk7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgfHwgZGVmaW5lZChfX1NVTlBST19DQykKKyNpZiBBUkNIX1g4Nl82NAorI2RlZmluZSBjcHVpZChmdW5jLGF4LGJ4LGN4LGR4KVwKKyAgICBhc20gdm9sYXRpbGUgKFwKKyAgICAgICAgICAgICAgICAgICJ4Y2hnICVyc2ksICVyYnggXG5cdCIgXAorICAgICAgICAgICAgICAgICAgImNwdWlkICAgICAgICAgICBcblx0IiBcCisgICAgICAgICAgICAgICAgICAibW92bCAlZWJ4LCAlZWRpIFxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICJ4Y2hnICVyc2ksICVyYnggXG5cdCIgXAorICAgICAgICAgICAgICAgICAgOiAiPWEiIChheCksICI9RCIgKGJ4KSwgIj1jIiAoY3gpLCAiPWQiIChkeCkgXAorICAgICAgICAgICAgICAgICAgOiAiYSIgIChmdW5jKSk7CisjZWxzZQorI2RlZmluZSBjcHVpZChmdW5jLGF4LGJ4LGN4LGR4KVwKKyAgICBhc20gdm9sYXRpbGUgKFwKKyAgICAgICAgICAgICAgICAgICJwdXNobCAlZWJ4ICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICJjcHVpZCAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICJtb3ZsICVlYngsICVlZGkgIFxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICJwb3BsICVlYnggICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICAgICAgIDogIj1hIiAoYXgpLCAiPUQiIChieCksICI9YyIgKGN4KSwgIj1kIiAoZHgpIFwKKyAgICAgICAgICAgICAgICAgIDogImEiIChmdW5jKSk7CisjZW5kaWYKKyNlbHNlCisjaWYgQVJDSF9YODZfNjQKK3ZvaWQgX19jcHVpZChpbnQgQ1BVSW5mb1s0XSwgaW50IGluZm9fdHlwZSk7CisjcHJhZ21hIGludHJpbnNpYyhfX2NwdWlkKQorI2RlZmluZSBjcHVpZChmdW5jLGEsYixjLGQpIGRve1wKKyAgICAgICAgaW50IHJlZ3NbNF07XAorICAgICAgICBfX2NwdWlkKHJlZ3MsZnVuYyk7IGE9cmVnc1swXTsgIGI9cmVnc1sxXTsgIGM9cmVnc1syXTsgIGQ9cmVnc1szXTtcCisgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgY3B1aWQoZnVuYyxhLGIsYyxkKVwKKyAgICBfX2FzbSBtb3YgZWF4LCBmdW5jXAorICAgIF9fYXNtIGNwdWlkXAorICAgIF9fYXNtIG1vdiBhLCBlYXhcCisgICAgX19hc20gbW92IGIsIGVieFwKKyAgICBfX2FzbSBtb3YgYywgZWN4XAorICAgIF9fYXNtIG1vdiBkLCBlZHgKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgSEFTX01NWCAgIDB4MDEKKyNkZWZpbmUgSEFTX1NTRSAgIDB4MDIKKyNkZWZpbmUgSEFTX1NTRTIgIDB4MDQKKyNkZWZpbmUgSEFTX1NTRTMgIDB4MDgKKyNkZWZpbmUgSEFTX1NTU0UzIDB4MTAKKyNkZWZpbmUgSEFTX1NTRTRfMSAweDIwCisjaWZuZGVmIEJJVAorI2RlZmluZSBCSVQobikgKDE8PG4pCisjZW5kaWYKKworc3RhdGljIGludAoreDg2X3NpbWRfY2Fwcyh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCBmbGFncyA9IDA7CisgICAgdW5zaWduZWQgaW50IG1hc2sgPSB+MDsKKyAgICB1bnNpZ25lZCBpbnQgcmVnX2VheCwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeDsKKyAgICBjaGFyICplbnY7CisgICAgKHZvaWQpcmVnX2VieDsKKworICAgIC8qIFNlZSBpZiB0aGUgQ1BVIGNhcGFiaWxpdGllcyBhcmUgYmVpbmcgb3ZlcnJpZGRlbiBieSB0aGUgZW52aXJvbm1lbnQgKi8KKyAgICBlbnYgPSBnZXRlbnYoIlZQWF9TSU1EX0NBUFMiKTsKKworICAgIGlmIChlbnYgJiYgKmVudikKKyAgICAgICAgcmV0dXJuIChpbnQpc3RydG9sKGVudiwgTlVMTCwgMCk7CisKKyAgICBlbnYgPSBnZXRlbnYoIlZQWF9TSU1EX0NBUFNfTUFTSyIpOworCisgICAgaWYgKGVudiAmJiAqZW52KQorICAgICAgICBtYXNrID0gc3RydG9sKGVudiwgTlVMTCwgMCk7CisKKyAgICAvKiBFbnN1cmUgdGhhdCB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24gc3VwcG9ydHMgZXh0ZW5kZWQgZmVhdHVyZXMgKi8KKyAgICBjcHVpZCgwLCByZWdfZWF4LCByZWdfZWJ4LCByZWdfZWN4LCByZWdfZWR4KTsKKworICAgIGlmIChyZWdfZWF4IDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBHZXQgdGhlIHN0YW5kYXJkIGZlYXR1cmUgZmxhZ3MgKi8KKyAgICBjcHVpZCgxLCByZWdfZWF4LCByZWdfZWJ4LCByZWdfZWN4LCByZWdfZWR4KTsKKworICAgIGlmIChyZWdfZWR4ICYgQklUKDIzKSkgZmxhZ3MgfD0gSEFTX01NWDsKKworICAgIGlmIChyZWdfZWR4ICYgQklUKDI1KSkgZmxhZ3MgfD0gSEFTX1NTRTsgLyogYWthIHhtbSAqLworCisgICAgaWYgKHJlZ19lZHggJiBCSVQoMjYpKSBmbGFncyB8PSBIQVNfU1NFMjsgLyogYWthIHdtdCAqLworCisgICAgaWYgKHJlZ19lY3ggJiBCSVQoMCkpICBmbGFncyB8PSBIQVNfU1NFMzsKKworICAgIGlmIChyZWdfZWN4ICYgQklUKDkpKSAgZmxhZ3MgfD0gSEFTX1NTU0UzOworCisgICAgaWYgKHJlZ19lY3ggJiBCSVQoMTkpKSBmbGFncyB8PSBIQVNfU1NFNF8xOworCisgICAgcmV0dXJuIGZsYWdzICYgbWFzazsKK30KKwordnB4X2NwdV90IHZweF94ODZfdmVuZG9yKHZvaWQpOworCisjaWYgQVJDSF9YODZfNjQgJiYgZGVmaW5lZChfTVNDX1ZFUikKK3Vuc2lnbmVkIF9faW50NjQgX19yZHRzYyh2b2lkKTsKKyNwcmFnbWEgaW50cmluc2ljKF9fcmR0c2MpCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3g4Nl9yZWFkdHNjKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18KKyAgICB1bnNpZ25lZCBpbnQgdHNjOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRzY1xuXHQiOiI9YSIodHNjKTopOworICAgIHJldHVybiB0c2M7CisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisgICAgdW5zaWduZWQgaW50IHRzYzsKKyAgICBhc20gdm9sYXRpbGUoInJkdHNjXG5cdCI6Ij1hIih0c2MpOik7CisgICAgcmV0dXJuIHRzYzsKKyNlbHNlCisjaWYgQVJDSF9YODZfNjQKKyAgICByZXR1cm4gKHVuc2lnbmVkIGludClfX3JkdHNjKCk7CisjZWxzZQorICAgIF9fYXNtICByZHRzYzsKKyNlbmRpZgorI2VuZGlmCit9CisKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCisjZGVmaW5lIHg4Nl9wYXVzZV9oaW50KClcCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwYXVzZSBcblx0IikKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgfHwgZGVmaW5lZChfX1NVTlBST19DQykKKyNkZWZpbmUgeDg2X3BhdXNlX2hpbnQoKVwKKyAgICBhc20gdm9sYXRpbGUgKCJwYXVzZSBcblx0IikKKyNlbHNlCisjaWYgQVJDSF9YODZfNjQKKyNkZWZpbmUgeDg2X3BhdXNlX2hpbnQoKVwKKyAgICBfbW1fcGF1c2UoKTsKKyNlbHNlCisjZGVmaW5lIHg4Nl9wYXVzZV9oaW50KClcCisgICAgX19hc20gcGF1c2UKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXworc3RhdGljIHZvaWQKK3g4N19zZXRfY29udHJvbF93b3JkKHVuc2lnbmVkIHNob3J0IG1vZGUpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImZsZGN3ICUwIiA6IDogIm0iKCombW9kZSkpOworfQorc3RhdGljIHVuc2lnbmVkIHNob3J0Cit4ODdfZ2V0X2NvbnRyb2xfd29yZCh2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0IG1vZGU7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImZzdGN3ICUwXG5cdCI6Ij1tIigqJm1vZGUpOik7CisgICAgcmV0dXJuIG1vZGU7Cit9CisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCitzdGF0aWMgdm9pZAoreDg3X3NldF9jb250cm9sX3dvcmQodW5zaWduZWQgc2hvcnQgbW9kZSkKK3sKKyAgICBhc20gdm9sYXRpbGUoImZsZGN3ICUwIiA6IDogIm0iKCombW9kZSkpOworfQorc3RhdGljIHVuc2lnbmVkIHNob3J0Cit4ODdfZ2V0X2NvbnRyb2xfd29yZCh2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0IG1vZGU7CisgICAgYXNtIHZvbGF0aWxlKCJmc3RjdyAlMFxuXHQiOiI9bSIoKiZtb2RlKTopOworICAgIHJldHVybiBtb2RlOworfQorI2VsaWYgQVJDSF9YODZfNjQKKy8qIE5vIGZsZGN3IGludHJpbnNpY3Mgb24gV2luZG93cyB4NjQsIHB1bnQgdG8gZXh0ZXJuYWwgYXNtICovCitleHRlcm4gdm9pZCAgICAgICAgICAgdnB4X3dpbng2NF9mbGRjdyh1bnNpZ25lZCBzaG9ydCBtb2RlKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCB2cHhfd2lueDY0X2ZzdGN3KHZvaWQpOworI2RlZmluZSB4ODdfc2V0X2NvbnRyb2xfd29yZCB2cHhfd2lueDY0X2ZsZGN3CisjZGVmaW5lIHg4N19nZXRfY29udHJvbF93b3JkIHZweF93aW54NjRfZnN0Y3cKKyNlbHNlCitzdGF0aWMgdm9pZAoreDg3X3NldF9jb250cm9sX3dvcmQodW5zaWduZWQgc2hvcnQgbW9kZSkKK3sKKyAgICBfX2FzbSB7IGZsZGN3IG1vZGUgfQorfQorc3RhdGljIHVuc2lnbmVkIHNob3J0Cit4ODdfZ2V0X2NvbnRyb2xfd29yZCh2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0IG1vZGU7CisgICAgX19hc20geyBmc3RjdyBtb2RlIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK3g4N19zZXRfZG91YmxlX3ByZWNpc2lvbih2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0IG1vZGUgPSB4ODdfZ2V0X2NvbnRyb2xfd29yZCgpOworICAgIHg4N19zZXRfY29udHJvbF93b3JkKChtb2RlJn4weDMwMCkgfCAweDIwMCk7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKKworZXh0ZXJuIHZvaWQgdnB4X3Jlc2V0X21teF9zdGF0ZSh2b2lkKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20gYi9saWJ2cHgvdnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5ZmUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbQpAQCAtMCwwICsxLDM3OCBAQAorOworOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsKKzsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKzsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCis7CisKKworJWluY2x1ZGUgInZweF9jb25maWcuYXNtIgorCis7IDMyLzY0IGJpdCBjb21wYXRpYmlsaXR5IG1hY3JvcworOworOyBJbiBnZW5lcmFsLCB3ZSBtYWtlIHRoZSBzb3VyY2UgdXNlIDY0IGJpdCBzeW50YXgsIHRoZW4gdHdpZGRsZSB3aXRoIGl0IHVzaW5nCis7IHRoZSBwcmVwcm9jZXNzb3IgdG8gZ2V0IHRoZSAzMiBiaXQgc3ludGF4IG9uIDMyIGJpdCBwbGF0Zm9ybXMuCis7CislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmMzIKKyVkZWZpbmUgQUJJX0lTXzMyQklUIDEKKyVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLG1hY2hvMzIKKyVkZWZpbmUgQUJJX0lTXzMyQklUIDEKKyVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHdpbjMyCislZGVmaW5lIEFCSV9JU18zMkJJVCAxCislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxhb3V0CislZGVmaW5lIEFCSV9JU18zMkJJVCAxCislZWxzZQorJWRlZmluZSBBQklfSVNfMzJCSVQgMAorJWVuZGlmCisKKyVpZiBBQklfSVNfMzJCSVQKKyVkZWZpbmUgcmF4IGVheAorJWRlZmluZSByYnggZWJ4CislZGVmaW5lIHJjeCBlY3gKKyVkZWZpbmUgcmR4IGVkeAorJWRlZmluZSByc2kgZXNpCislZGVmaW5lIHJkaSBlZGkKKyVkZWZpbmUgcnNwIGVzcAorJWRlZmluZSByYnAgZWJwCislZGVmaW5lIG1vdnN4ZCBtb3YKKyVtYWNybyBtb3ZxIDIKKyAgJWlmaWRuICUxLGVheAorICAgIG1vdmQgJTEsJTIKKyAgJWVsaWZpZG4gJTIsZWF4CisgICAgbW92ZCAlMSwlMgorICAlZWxpZmlkbiAlMSxlYngKKyAgICBtb3ZkICUxLCUyCisgICVlbGlmaWRuICUyLGVieAorICAgIG1vdmQgJTEsJTIKKyAgJWVsaWZpZG4gJTEsZWN4CisgICAgbW92ZCAlMSwlMgorICAlZWxpZmlkbiAlMixlY3gKKyAgICBtb3ZkICUxLCUyCisgICVlbGlmaWRuICUxLGVkeAorICAgIG1vdmQgJTEsJTIKKyAgJWVsaWZpZG4gJTIsZWR4CisgICAgbW92ZCAlMSwlMgorICAlZWxpZmlkbiAlMSxlc2kKKyAgICBtb3ZkICUxLCUyCisgICVlbGlmaWRuICUyLGVzaQorICAgIG1vdmQgJTEsJTIKKyAgJWVsaWZpZG4gJTEsZWRpCisgICAgbW92ZCAlMSwlMgorICAlZWxpZmlkbiAlMixlZGkKKyAgICBtb3ZkICUxLCUyCisgICVlbGlmaWRuICUxLGVzcAorICAgIG1vdmQgJTEsJTIKKyAgJWVsaWZpZG4gJTIsZXNwCisgICAgbW92ZCAlMSwlMgorICAlZWxpZmlkbiAlMSxlYnAKKyAgICBtb3ZkICUxLCUyCisgICVlbGlmaWRuICUyLGVicAorICAgIG1vdmQgJTEsJTIKKyAgJWVsc2UKKyAgICBtb3ZxICUxLCUyCisgICVlbmRpZgorJWVuZG1hY3JvCislZW5kaWYKKworCis7IHN5bSgpCis7IFJldHVybiB0aGUgcHJvcGVyIHN5bWJvbCBuYW1lIGZvciB0aGUgdGFyZ2V0IEFCSS4KKzsKKzsgQ2VydGFpbiBBQklzLCBub3RhYmx5IE1TIENPRkYgYW5kIERhcndpbiBNQUNILU8sIHJlcXVpcmUgdGhhdCBzeW1ib2xzCis7IHdpdGggQyBsaW5rYWdlIGJlIHByZWZpeGVkIHdpdGggYW4gdW5kZXJzY29yZS4KKzsKKyVpZmlkbiAgIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjMyCislZGVmaW5lIHN5bSh4KSB4CislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGY2NAorJWRlZmluZSBzeW0oeCkgeAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmeDMyCislZGVmaW5lIHN5bSh4KSB4CislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyVkZWZpbmUgc3ltKHgpIHgKKyVlbHNlCislZGVmaW5lIHN5bSh4KSBfICUrIHgKKyVlbmRpZgorCis7ICBQUklWQVRFCis7ICBNYWNybyBmb3IgdGhlIGF0dHJpYnV0ZSB0byBoaWRlIGEgZ2xvYmFsIHN5bWJvbCBmb3IgdGhlIHRhcmdldCBBQkkuCis7ICBUaGlzIGlzIG9ubHkgYWN0aXZlIGlmIENIUk9NSVVNIGlzIGRlZmluZWQuCis7Cis7ICBDaHJvbWl1bSBkb2Vzbid0IGxpa2UgZXhwb3J0ZWQgZ2xvYmFsIHN5bWJvbHMgZHVlIHRvIHN5bWJvbCBjbGFzaGluZyB3aXRoCis7ICBwbHVnaW5zIGFtb25nIG90aGVyIHRoaW5ncy4KKzsKKzsgIFJlcXVpcmVzIENocm9taXVtJ3MgcGF0Y2hlZCBjb3B5IG9mIHlhc206Cis7ICAgIGh0dHA6Ly9zcmMuY2hyb21pdW0ub3JnL3ZpZXd2Yy9jaHJvbWU/dmlldz1yZXYmcmV2aXNpb249NzM3NjEKKzsgICAgaHR0cDovL3d3dy50b3J0YWxsLm5ldC9wcm9qZWN0cy95YXNtL3RpY2tldC8yMzYKKzsKKyVpZmRlZiBDSFJPTUlVTQorICAlaWZpZG4gICBfX09VVFBVVF9GT1JNQVRfXyxlbGYzMgorICAgICVkZWZpbmUgUFJJVkFURSA6aGlkZGVuCisgICVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjY0CisgICAgJWRlZmluZSBQUklWQVRFIDpoaWRkZW4KKyAgJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmeDMyCisgICAgJWRlZmluZSBQUklWQVRFIDpoaWRkZW4KKyAgJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgJWRlZmluZSBQUklWQVRFCisgICVlbHNlCisgICAgJWRlZmluZSBQUklWQVRFIDpwcml2YXRlX2V4dGVybgorICAlZW5kaWYKKyVlbHNlCisgICVkZWZpbmUgUFJJVkFURQorJWVuZGlmCisKKzsgYXJnKCkKKzsgUmV0dXJuIHRoZSBhZGRyZXNzIHNwZWNpZmljYXRpb24gb2YgdGhlIGdpdmVuIGFyZ3VtZW50Cis7CislaWYgQUJJX0lTXzMyQklUCisgICVkZWZpbmUgYXJnKHgpIFtlYnArOCs0KnhdCislZWxzZQorICA7IDY0IGJpdCBBQkkgcGFzc2VzIGFyZ3VtZW50cyBpbiByZWdpc3RlcnMuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGdldCB1cAorICA7IGFuZCBydW5uaW5nIHF1aWNrbHkuIFJlbGllcyBvbiBTSEFET1dfQVJHU19UT19TVEFDSworICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0CisgICAgJWRlZmluZSBhcmcoeCkgW3JicCsxNis4KnhdCisgICVlbHNlCisgICAgJWRlZmluZSBhcmcoeCkgW3JicC04LTgqeF0KKyAgJWVuZGlmCislZW5kaWYKKworOyBSRUdfU1pfQllURVMsIFJFR19TWl9CSVRTCis7IFNpemUgb2YgYSByZWdpc3RlcgorJWlmIEFCSV9JU18zMkJJVAorJWRlZmluZSBSRUdfU1pfQllURVMgNAorJWRlZmluZSBSRUdfU1pfQklUUyAgMzIKKyVlbHNlCislZGVmaW5lIFJFR19TWl9CWVRFUyA4CislZGVmaW5lIFJFR19TWl9CSVRTICA2NAorJWVuZGlmCisKKworOyBBTElHTl9TVEFDSyA8YWxpZ25tZW50PiA8cmVnaXN0ZXI+Cis7IFRoaXMgbWFjcm8gYWxpZ25zIHRoZSBzdGFjayB0byB0aGUgZ2l2ZW4gYWxpZ25tZW50IChpbiBieXRlcykuIFRoZSBzdGFjaworOyBpcyBsZWZ0IHN1Y2ggdGhhdCB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaXMgdGhlIGZpcnN0Cis7IGFyZ3VtZW50IG9uIHRoZSBzdGFjayAoaWUsIHRoZSBpbnZlcnNlIG9mIHRoaXMgbWFjcm8gaXMgJ3BvcCByc3AuJykKKzsgVGhpcyBtYWNybyB1c2VzIG9uZSB0ZW1wb3JhcnkgcmVnaXN0ZXIsIHdoaWNoIGlzIG5vdCBwcmVzZXJ2ZWQsIGFuZCB0aHVzCis7IG11c3QgYmUgc3BlY2lmaWVkIGFzIGFuIGFyZ3VtZW50LgorJW1hY3JvIEFMSUdOX1NUQUNLIDIKKyAgICBtb3YgICAgICAgICAlMiwgcnNwCisgICAgYW5kICAgICAgICAgcnNwLCAtJTEKKyAgICBsZWEgICAgICAgICByc3AsIFtyc3AgLSAoJTEgLSBSRUdfU1pfQllURVMpXQorICAgIHB1c2ggICAgICAgICUyCislZW5kbWFjcm8KKworCis7Cis7IFRoZSBNaWNyb3NvZnQgYXNzZW1ibGVyIHRyaWVzIHRvIGltcG9zZSBhIGNlcnRhaW4gYW1vdW50IG9mIHR5cGUgc2FmZXR5IGluCis7IGl0cyByZWdpc3RlciB1c2FnZS4gWUFTTSBkb2Vzbid0IHJlY29nbml6ZSB0aGVzZSBkaXJlY3RpdmVzLCBzbyB3ZSBqdXN0Cis7ICVkZWZpbmUgdGhlbSBhd2F5IHRvIG1haW50YWluIGFzIG11Y2ggY29tcGF0aWJpbGl0eSBhcyBwb3NzaWJsZSB3aXRoIHRoZQorOyBvcmlnaW5hbCBpbmxpbmUgYXNzZW1ibGVyIHdlJ3JlIHBvcnRpbmcgZnJvbS4KKzsKKyVpZGVmaW5lIFBUUgorJWlkZWZpbmUgWE1NV09SRAorJWlkZWZpbmUgTU1XT1JECisKKzsgUElDIG1hY3JvcworOworJWlmIEFCSV9JU18zMkJJVAorICAlaWYgQ09ORklHX1BJQz0xCisgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYzMgorICAgICVkZWZpbmUgR0VUX0dPVF9TQVZFX0FSRyAxCisgICAgJWRlZmluZSBXUlRfUExUIHdydCAuLnBsdAorICAgICVtYWNybyBHRVRfR09UIDEKKyAgICAgIGV4dGVybiBfR0xPQkFMX09GRlNFVF9UQUJMRV8KKyAgICAgIHB1c2ggJTEKKyAgICAgIGNhbGwgJSVnZXRfZ290CisgICAgICAlJXN1Yl9vZmZzZXQ6CisgICAgICBqbXAgJSVleGl0R0cKKyAgICAgICUlZ2V0X2dvdDoKKyAgICAgIG1vdiAlMSwgW2VzcF0KKyAgICAgIGFkZCAlMSwgX0dMT0JBTF9PRkZTRVRfVEFCTEVfICsgJCQgLSAlJXN1Yl9vZmZzZXQgd3J0IC4uZ290cGMKKyAgICAgIHJldAorICAgICAgJSVleGl0R0c6CisgICAgICAldW5kZWYgR0xPQkFMCisgICAgICAlZGVmaW5lIEdMT0JBTCh4KSB4ICsgJTEgd3J0IC4uZ290b2ZmCisgICAgICAldW5kZWYgUkVTVE9SRV9HT1QKKyAgICAgICVkZWZpbmUgUkVTVE9SRV9HT1QgcG9wICUxCisgICAgJWVuZG1hY3JvCisgICVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLG1hY2hvMzIKKyAgICAlZGVmaW5lIEdFVF9HT1RfU0FWRV9BUkcgMQorICAgICVtYWNybyBHRVRfR09UIDEKKyAgICAgIHB1c2ggJTEKKyAgICAgIGNhbGwgJSVnZXRfZ290CisgICAgICAlJWdldF9nb3Q6CisgICAgICBwb3AgICUxCisgICAgICAldW5kZWYgR0xPQkFMCisgICAgICAlZGVmaW5lIEdMT0JBTCh4KSB4ICsgJTEgLSAlJWdldF9nb3QKKyAgICAgICV1bmRlZiBSRVNUT1JFX0dPVAorICAgICAgJWRlZmluZSBSRVNUT1JFX0dPVCBwb3AgJTEKKyAgICAlZW5kbWFjcm8KKyAgJWVuZGlmCisgICVlbmRpZgorCisgICVpZmRlZiBDSFJPTUlVTQorICAgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxtYWNobzMyCisgICAgICAlZGVmaW5lIEhJRERFTl9EQVRBKHgpIHg6cHJpdmF0ZV9leHRlcm4KKyAgICAlZWxzZQorICAgICAgJWRlZmluZSBISURERU5fREFUQSh4KSB4CisgICAgJWVuZGlmCisgICVlbHNlCisgICAgJWRlZmluZSBISURERU5fREFUQSh4KSB4CisgICVlbmRpZgorJWVsc2UKKyAgJW1hY3JvIEdFVF9HT1QgMQorICAlZW5kbWFjcm8KKyAgJWRlZmluZSBHTE9CQUwoeCkgcmVsIHgKKyAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjY0CisgICAgJWRlZmluZSBXUlRfUExUIHdydCAuLnBsdAorICAgICVkZWZpbmUgSElEREVOX0RBVEEoeCkgeDpkYXRhIGhpZGRlbgorICAlZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGZ4MzIKKyAgICAlZGVmaW5lIFdSVF9QTFQgd3J0IC4ucGx0CisgICAgJWRlZmluZSBISURERU5fREFUQSh4KSB4OmRhdGEgaGlkZGVuCisgICVlbHNlCisgICAgJWRlZmluZSBISURERU5fREFUQSh4KSB4CisgICVlbmRpZgorJWVuZGlmCislaWZubWFjcm8gR0VUX0dPVAorICAgICVtYWNybyBHRVRfR09UIDEKKyAgICAlZW5kbWFjcm8KKyAgICAlZGVmaW5lIEdMT0JBTCh4KSB4CislZW5kaWYKKyVpZm5kZWYgUkVTVE9SRV9HT1QKKyVkZWZpbmUgUkVTVE9SRV9HT1QKKyVlbmRpZgorJWlmbmRlZiBXUlRfUExUCislZGVmaW5lIFdSVF9QTFQKKyVlbmRpZgorCislaWYgQUJJX0lTXzMyQklUCisgICVtYWNybyBTSEFET1dfQVJHU19UT19TVEFDSyAxCisgICVlbmRtCisgICVkZWZpbmUgVU5TSEFET1dfQVJHUworJWVsc2UKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgJW1hY3JvIFNIQURPV19BUkdTX1RPX1NUQUNLIDEgOyBhcmdjCisgICAgJWlmICUxID4gMAorICAgICAgICBtb3YgYXJnKDApLHJjeAorICAgICVlbmRpZgorICAgICVpZiAlMSA+IDEKKyAgICAgICAgbW92IGFyZygxKSxyZHgKKyAgICAlZW5kaWYKKyAgICAlaWYgJTEgPiAyCisgICAgICAgIG1vdiBhcmcoMikscjgKKyAgICAlZW5kaWYKKyAgICAlaWYgJTEgPiAzCisgICAgICAgIG1vdiBhcmcoMykscjkKKyAgICAlZW5kaWYKKyAgJWVuZG0KKyVlbHNlCisgICVtYWNybyBTSEFET1dfQVJHU19UT19TVEFDSyAxIDsgYXJnYworICAgICVpZiAlMSA+IDAKKyAgICAgICAgcHVzaCByZGkKKyAgICAlZW5kaWYKKyAgICAlaWYgJTEgPiAxCisgICAgICAgIHB1c2ggcnNpCisgICAgJWVuZGlmCisgICAgJWlmICUxID4gMgorICAgICAgICBwdXNoIHJkeAorICAgICVlbmRpZgorICAgICVpZiAlMSA+IDMKKyAgICAgICAgcHVzaCByY3gKKyAgICAlZW5kaWYKKyAgICAlaWYgJTEgPiA0CisgICAgICAgIHB1c2ggcjgKKyAgICAlZW5kaWYKKyAgICAlaWYgJTEgPiA1CisgICAgICAgIHB1c2ggcjkKKyAgICAlZW5kaWYKKyAgICAlaWYgJTEgPiA2CisgICAgICAlYXNzaWduIGkgJTEtNgorICAgICAgJWFzc2lnbiBvZmYgMTYKKyAgICAgICVyZXAgaQorICAgICAgICBtb3YgcmF4LFtyYnArb2ZmXQorICAgICAgICBwdXNoIHJheAorICAgICAgICAlYXNzaWduIG9mZiBvZmYrOAorICAgICAgJWVuZHJlcAorICAgICVlbmRpZgorICAlZW5kbQorJWVuZGlmCisgICVkZWZpbmUgVU5TSEFET1dfQVJHUyBtb3YgcnNwLCByYnAKKyVlbmRpZgorCis7IFdpbjY0IEFCSSByZXF1aXJlcyB0aGF0IFhNTTY6WE1NMTUgYXJlIGNhbGxlZSBzYXZlZAorOyBTQVZFX1hNTSBuLCBbdV0KKzsgc3RvcmUgcmVnaXN0ZXJzIDYtbiBvbiB0aGUgc3RhY2sKKzsgaWYgdSBpcyBzcGVjaWZpZWQsIHVzZSB1bmFsaWduZWQgbW92cy4KKzsgV2luNjQgQUJJIHJlcXVpcmVzIDE2IGJ5dGUgc3RhY2sgYWxpZ25tZW50LCBidXQgdGhlbiBwdXNoZXMgYW4gOCBieXRlIHJldHVybgorOyB2YWx1ZS4gVHlwaWNhbGx5IHdlIGZvbGxvdyB0aGlzIHVwIHdpdGggJ3B1c2ggcmJwJyAtIHJlLWFsaWduaW5nIHRoZSBzdGFjayAtCis7IGJ1dCBpbiBzb21lIGNhc2VzIHRoaXMgaXMgbm90IGRvbmUgYW5kIHVuYWxpZ25lZCBtb3ZzIG11c3QgYmUgdXNlZC4KKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyVtYWNybyBTQVZFX1hNTSAxLTIgYQorICAlaWYgJTEgPCA2CisgICAgJWVycm9yIE9ubHkgeG1tIHJlZ2lzdGVycyA2LTE1IG11c3QgYmUgcHJlc2VydmVkCisgICVlbHNlCisgICAgJWFzc2lnbiBsYXN0X3htbSAlMQorICAgICVkZWZpbmUgbW92eG1tIG1vdmRxICUrICUyCisgICAgJWFzc2lnbiB4bW1fc3RhY2tfc3BhY2UgKChsYXN0X3htbSAtIDUpICogMTYpCisgICAgc3ViIHJzcCwgeG1tX3N0YWNrX3NwYWNlCisgICAgJWFzc2lnbiBpIDYKKyAgICAlcmVwIChsYXN0X3htbSAtIDUpCisgICAgICBtb3Z4bW0gW3JzcCArICgoaSAtIDYpICogMTYpXSwgeG1tICUrIGkKKyAgICAgICVhc3NpZ24gaSBpKzEKKyAgICAlZW5kcmVwCisgICVlbmRpZgorJWVuZG1hY3JvCislbWFjcm8gUkVTVE9SRV9YTU0gMAorICAlaWZuZGVmIGxhc3RfeG1tCisgICAgJWVycm9yIFJFU1RPUkVfWE1NIG11c3QgYmUgcGFpcmVkIHdpdGggU0FWRV9YTU0gbgorICAlZWxzZQorICAgICVhc3NpZ24gaSBsYXN0X3htbQorICAgICVyZXAgKGxhc3RfeG1tIC0gNSkKKyAgICAgIG1vdnhtbSB4bW0gJSsgaSwgW3JzcCArKChpIC0gNikgKiAxNildCisgICAgICAlYXNzaWduIGkgaS0xCisgICAgJWVuZHJlcAorICAgIGFkZCByc3AsIHhtbV9zdGFja19zcGFjZQorICAgIDsgdGhlcmUgYXJlIGEgY291cGxlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gZnJvbSBtdWx0aXBsZSBwbGFjZXMuCisgICAgOyBvdGhlcndpc2UsIHdlIGNvdWxkIHVuY29tbWVudCB0aGVzZToKKyAgICA7ICV1bmRlZiBsYXN0X3htbQorICAgIDsgJXVuZGVmIHhtbV9zdGFja19zcGFjZQorICAgIDsgJXVuZGVmIG1vdnhtbQorICAlZW5kaWYKKyVlbmRtYWNybworJWVsc2UKKyVtYWNybyBTQVZFX1hNTSAxLTIKKyVlbmRtYWNybworJW1hY3JvIFJFU1RPUkVfWE1NIDAKKyVlbmRtYWNybworJWVuZGlmCisKKzsgTmFtZSBvZiB0aGUgcm9kYXRhIHNlY3Rpb24KKzsKKzsgLnJvZGF0YSBzZWVtcyB0byBiZSBhbiBlbGYtaXNtLCBhcyBpdCBkb2Vzbid0IHdvcmsgb24gT1NYLgorOworJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLG1hY2hvNjQKKyVkZWZpbmUgU0VDVElPTl9ST0RBVEEgc2VjdGlvbiAudGV4dAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sbWFjaG8zMgorJW1hY3JvIFNFQ1RJT05fUk9EQVRBIDAKK3NlY3Rpb24gLnRleHQKKyVlbmRtYWNybworJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sYW91dAorJWRlZmluZSBTRUNUSU9OX1JPREFUQSBzZWN0aW9uIC5kYXRhCislZWxzZQorJWRlZmluZSBTRUNUSU9OX1JPREFUQSBzZWN0aW9uIC5yb2RhdGEKKyVlbmRpZgorCisKKzsgVGVsbCBHTlUgbGQgdGhhdCB3ZSBkb24ndCByZXF1aXJlIGFuIGV4ZWN1dGFibGUgc3RhY2suCislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmMzIKK3NlY3Rpb24gLm5vdGUuR05VLXN0YWNrIG5vYWxsb2Mgbm9leGVjIG5vd3JpdGUgcHJvZ2JpdHMKK3NlY3Rpb24gLnRleHQKKyVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjY0CitzZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCitzZWN0aW9uIC50ZXh0CislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGZ4MzIKK3NlY3Rpb24gLm5vdGUuR05VLXN0YWNrIG5vYWxsb2Mgbm9leGVjIG5vd3JpdGUgcHJvZ2JpdHMKK3NlY3Rpb24gLnRleHQKKyVlbmRpZgorCmRpZmYgLS1naXQgYS92cHhfcG9ydHMveDg2X2NwdWlkLmMgYi9saWJ2cHgvdnB4X3BvcnRzL3g4Nl9jcHVpZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfcG9ydHMveDg2X2NwdWlkLmMKcmVuYW1lIHRvIGxpYnZweC92cHhfcG9ydHMveDg2X2NwdWlkLmMKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weV95X25lb24uYXNtIGIvbGlidnB4L3ZweF9zY2FsZS9hcm0vbmVvbi92cDhfdnB4eXYxMl9jb3B5X3lfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4OTY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weV95X25lb24uYXNtCkBAIC0wLDAgKzEsMTIyIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3l2MTJfY29weV95X25lb258CisKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgSU5DTFVERSBhc21fY29tX29mZnNldHMuYXNtCisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKworO3ZvaWQgdnB4eXYxMl9jb3B5X3lfbmVvbihZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYykKK3x2cDhfeXYxMl9jb3B5X3lfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgICAgICB7cjQgLSByMTEsIGxyfQorICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorCisgICAgbGRyICAgICAgICAgICAgIHI0LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9oZWlnaHRdCisgICAgbGRyICAgICAgICAgICAgIHI1LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV93aWR0aF0KKyAgICBsZHIgICAgICAgICAgICAgcjYsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3N0cmlkZV0KKyAgICBsZHIgICAgICAgICAgICAgcjcsIFtyMSwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3N0cmlkZV0KKyAgICBsZHIgICAgICAgICAgICAgcjIsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKKyAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMSwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO2RzdHB0cjEKKworICAgIDsgY29weSB0d28gcm93cyBhdCBvbmUgdGltZQorICAgIG1vdiAgICAgICAgICAgICBsciwgcjQsIGxzciAjMQorCitjcF9zcmNfdG9fZHN0X2hlaWdodF9sb29wMQorICAgIG1vdiAgICAgICAgICAgICByOCwgcjIKKyAgICBtb3YgICAgICAgICAgICAgcjksIHIzCisgICAgYWRkICAgICAgICAgICAgIHIxMCwgcjIsIHI2CisgICAgYWRkICAgICAgICAgICAgIHIxMSwgcjMsIHI3CisgICAgbW92cyAgICAgICAgICAgIHIxMiwgcjUsIGxzciAjNworICAgIGJsZSAgICAgICAgICAgICBleHRyYV9jb3B5X25lZWRlZCAgIDsgeV93aWR0aCA8IDEyOAorCitjcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AxCisgICAgdmxkMS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IxMF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjEwXSEKKyAgICB2bGQxLjggICAgICAgICAge3E0LCBxNX0sIFtyOF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMTBdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICAgICAge3ExNCwgcTE1fSwgW3IxMF0hCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisKKyAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyOV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICAgICAge3EyLCBxM30sIFtyOV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I5XSEKKyAgICB2c3QxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjldIQorICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjExXSEKKworICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AxCisKKyAgICBzdWJzICAgICAgICAgICAgbHIsIGxyLCAjMQorICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHI2LCBsc2wgIzEKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByNywgbHNsICMxCisKKyAgICBibmUgICAgICAgICAgICAgY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcDEKKworZXh0cmFfY29weV9uZWVkZWQKKyAgICBhbmRzICAgICAgICAgICAgcjEwLCByNSwgIzB4N2YgICAgICAgICAgICAgICAgICA7Y2hlY2sgdG8gc2VlIGlmIGV4dHJhIGNvcHkgaXMgbmVlZGVkCisgICAgc3ViICAgICAgICAgICAgIHIxMSwgcjUsIHIxMAorICAgIGxkciAgICAgICAgICAgICByMiwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7c3JjcHRyMQorICAgIGxkciAgICAgICAgICAgICByMywgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7ZHN0cHRyMQorICAgIGJuZSAgICAgICAgICAgICBleHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoMQorZW5kX29mX2NwX3NyY190b19kc3QxCisKKyAgICB2cG9wICAgICAgICAgICAge2Q4IC0gZDE1fQorICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLCBwY30KKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitleHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoMQorICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHIxMQorICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHIxMQorICAgIGFkZCAgICAgICAgICAgICByMCwgcjgsIHI2CisgICAgYWRkICAgICAgICAgICAgIHIxMSwgcjksIHI3CisKKyAgICBtb3YgICAgICAgICAgICAgbHIsIHI0LCBsc3IgIzEKK2V4dHJhX2NwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AxCisgICAgbW92ICAgICAgICAgICAgIHI4LCByMgorICAgIG1vdiAgICAgICAgICAgICByOSwgcjMKKyAgICBhZGQgICAgICAgICAgICAgcjAsIHI4LCByNgorICAgIGFkZCAgICAgICAgICAgICByMTEsIHI5LCByNworCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjEwCisKK2V4dHJhX2NwX3NyY190b19kc3Rfd2lkdGhfbG9vcDEKKyAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3I4XSEKKyAgICB2bGQxLjggICAgICAgICAge3ExfSwgW3IwXSEKKworICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzE2CisKKyAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I5XSEKKyAgICB2c3QxLjggICAgICAgICAge3ExfSwgW3IxMV0hCisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGhfbG9vcDEKKworICAgIHN1YnMgICAgICAgICAgICBsciwgbHIsICMxCisKKyAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByNiwgbHNsICMxCisgICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjcsIGxzbCAjMQorCisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AxCisKKyAgICBiICAgICAgICAgICAgICAgZW5kX29mX2NwX3NyY190b19kc3QxCisKKyAgICBFTkRQCisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weWZyYW1lX2Z1bmNfbmVvbi5hc20gYi9saWJ2cHgvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlmcmFtZV9mdW5jX25lb24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWQwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlmcmFtZV9mdW5jX25lb24uYXNtCkBAIC0wLDAgKzEsMjMzIEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3l2MTJfY29weV9mcmFtZV9mdW5jX25lb258CisgICAgQVJNCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIElOQ0xVREUgYXNtX2NvbV9vZmZzZXRzLmFzbQorCisgICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCisKKzt2b2lkIHZwOF95djEyX2NvcHlfZnJhbWVfZnVuY19uZW9uKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7CisKK3x2cDhfeXYxMl9jb3B5X2ZyYW1lX2Z1bmNfbmVvbnwgUFJPQworICAgIHB1c2ggICAgICAgICAgICB7cjQgLSByMTEsIGxyfQorICAgIHZwdXNoICAgICAgICAgICB7ZDggLSBkMTV9CisKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMTYKKworICAgIDtDb3B5IFkgcGxhbmUKKyAgICBsZHIgICAgICAgICAgICAgcjgsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ191X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKKyAgICBsZHIgICAgICAgICAgICAgcjksIFtyMSwgI3l2MTJfYnVmZmVyX2NvbmZpZ191X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKKyAgICBsZHIgICAgICAgICAgICAgcjEwLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfdl9idWZmZXJdICAgICAgO3NyY3B0cjEKKyAgICBsZHIgICAgICAgICAgICAgcjExLCBbcjEsICN5djEyX2J1ZmZlcl9jb25maWdfdl9idWZmZXJdICAgICAgO3NyY3B0cjEKKworICAgIGxkciAgICAgICAgICAgICByNCwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfaGVpZ2h0XQorICAgIGxkciAgICAgICAgICAgICByNSwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfd2lkdGhdCisgICAgbGRyICAgICAgICAgICAgIHI2LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9zdHJpZGVdCisgICAgbGRyICAgICAgICAgICAgIHI3LCBbcjEsICN5djEyX2J1ZmZlcl9jb25maWdfeV9zdHJpZGVdCisgICAgbGRyICAgICAgICAgICAgIHIyLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtzcmNwdHIxCisgICAgbGRyICAgICAgICAgICAgIHIzLCBbcjEsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtkc3RwdHIxCisKKyAgICBzdHIgICAgICAgICAgICAgcjgsIFtzcF0KKyAgICBzdHIgICAgICAgICAgICAgcjksIFtzcCwgIzRdCisgICAgc3RyICAgICAgICAgICAgIHIxMCwgW3NwLCAjOF0KKyAgICBzdHIgICAgICAgICAgICAgcjExLCBbc3AsICMxMl0KKworICAgIDsgY29weSB0d28gcm93cyBhdCBvbmUgdGltZQorICAgIG1vdiAgICAgICAgICAgICBsciwgcjQsIGxzciAjMQorCitjcF9zcmNfdG9fZHN0X2hlaWdodF9sb29wCisgICAgbW92ICAgICAgICAgICAgIHI4LCByMgorICAgIG1vdiAgICAgICAgICAgICByOSwgcjMKKyAgICBhZGQgICAgICAgICAgICAgcjEwLCByMiwgcjYKKyAgICBhZGQgICAgICAgICAgICAgcjExLCByMywgcjcKKyAgICBtb3ZzICAgICAgICAgICAgcjEyLCByNSwgbHNyICM3CisgICAgYmxlICAgICAgICAgICAgIGV4dHJhX2NwX25lZWRlZCAgIDsgeV93aWR0aCA8IDEyOAorCitjcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyOF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjEwXSEKKyAgICB2bGQxLjggICAgICAgICAge3EyLCBxM30sIFtyOF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTBdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IxMF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjEwXSEKKworICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKworICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I5XSEKKyAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3I5XSEKKyAgICB2c3QxLjggICAgICAgICAge3ExMCwgcTExfSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjldIQorICAgIHZzdDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyOV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyMTFdIQorCisgICAgYm5lICAgICAgICAgICAgIGNwX3NyY190b19kc3Rfd2lkdGhfbG9vcAorCisgICAgc3VicyAgICAgICAgICAgIGxyLCBsciwgIzEKKyAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByNiwgbHNsICMxCisgICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjcsIGxzbCAjMQorCisgICAgYm5lICAgICAgICAgICAgIGNwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AKKworZXh0cmFfY3BfbmVlZGVkCisgICAgYW5kcyAgICAgICAgICAgIHIxMCwgcjUsICMweDdmICAgICAgICAgICAgICAgICAgO2NoZWNrIHRvIHNlZSBpZiBleHRyYSBjb3B5IGlzIG5lZWRlZAorICAgIHN1YiAgICAgICAgICAgICByMTEsIHI1LCByMTAKKyAgICBsZHIgICAgICAgICAgICAgcjIsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKKyAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMSwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO2RzdHB0cjEKKyAgICBibmUgICAgICAgICAgICAgZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aAorZW5kX29mX2NwX3NyY190b19kc3QKKworO0NvcHkgVSAmIFYgcGxhbmVzCisgICAgbGRyICAgICAgICAgICAgIHIyLCBbc3BdICAgICAgICA7c3JjcHRyMQorICAgIGxkciAgICAgICAgICAgICByMywgW3NwLCAjNF0gICAgICAgIDtkc3RwdHIxCisgICAgbW92ICAgICAgICAgICAgIHI0LCByNCwgbHNyICMxICAgICAgICAgICAgICAgICAgO3NyYyB1dl9oZWlnaHQKKyAgICBtb3YgICAgICAgICAgICAgcjUsIHI1LCBsc3IgIzEgICAgICAgICAgICAgICAgICA7c3JjIHV2X3dpZHRoCisgICAgbW92ICAgICAgICAgICAgIHI2LCByNiwgbHNyICMxICAgICAgICAgICAgICAgICAgO3NyYyB1dl9zdHJpZGUKKyAgICBtb3YgICAgICAgICAgICAgcjcsIHI3LCBsc3IgIzEgICAgICAgICAgICAgICAgICA7ZHN0IHV2X3N0cmlkZQorCisgICAgbW92ICAgICAgICAgICAgIHIxLCAjMgorCitjcF91dl9sb29wCisKKyAgICA7Y29weSB0d28gcm93cyBhdCBvbmUgdGltZQorICAgIG1vdiAgICAgICAgICAgICBsciwgcjQsIGxzciAjMQorCitjcF9zcmNfdG9fZHN0X2hlaWdodF91dl9sb29wCisgICAgbW92ICAgICAgICAgICAgIHI4LCByMgorICAgIG1vdiAgICAgICAgICAgICByOSwgcjMKKyAgICBhZGQgICAgICAgICAgICAgcjEwLCByMiwgcjYKKyAgICBhZGQgICAgICAgICAgICAgcjExLCByMywgcjcKKyAgICBtb3ZzICAgICAgICAgICAgcjEyLCByNSwgbHNyICM2CisgICAgYmxlICAgICAgICAgICAgIGV4dHJhX3V2X2NwX25lZWRlZAorCitjcF9zcmNfdG9fZHN0X3dpZHRoX3V2X2xvb3AKKyAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyOF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjEwXSEKKyAgICB2bGQxLjggICAgICAgICAge3EyLCBxM30sIFtyOF0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTBdIQorCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorCisgICAgdnN0MS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjldIQorICAgIHZzdDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjldIQorICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjExXSEKKworICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X3dpZHRoX3V2X2xvb3AKKworICAgIHN1YnMgICAgICAgICAgICBsciwgbHIsICMxCisgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjYsIGxzbCAjMQorICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHI3LCBsc2wgIzEKKworICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X2hlaWdodF91dl9sb29wCisKK2V4dHJhX3V2X2NwX25lZWRlZAorICAgIGFuZHMgICAgICAgICAgICByMTAsIHI1LCAjMHgzZiAgICAgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKKyAgICBzdWIgICAgICAgICAgICAgcjExLCByNSwgcjEwCisgICAgbGRyICAgICAgICAgICAgIHIyLCBbc3BdICAgICAgICA7c3JjcHRyMQorICAgIGxkciAgICAgICAgICAgICByMywgW3NwLCAjNF0gICAgICAgIDtkc3RwdHIxCisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3RfdXZfd2lkdGgKK2VuZF9vZl9jcF9zcmNfdG9fZHN0X3V2CisKKyAgICBzdWJzICAgICAgICAgICAgcjEsIHIxLCAjMQorCisgICAgYWRkbmUgICAgICAgICAgICAgICBzcCwgc3AsICM4CisKKyAgICBsZHJuZSAgICAgICAgICAgICAgIHIyLCBbc3BdICAgICAgICA7c3JjcHRyMQorICAgIGxkcm5lICAgICAgICAgICAgICAgcjMsIFtzcCwgIzRdICAgICAgICA7ZHN0cHRyMQorCisgICAgYm5lICAgICAgICAgICAgIGNwX3V2X2xvb3AKKworICAgIGFkZCAgICAgICAgICAgICBzcCwgc3AsICM4CisKKyAgICB2cG9wICAgICAgICAgICAge2Q4IC0gZDE1fQorICAgIHBvcCAgICAgICAgICAgICB7cjQgLSByMTEsIHBjfQorCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2V4dHJhX2NwX3NyY190b19kc3Rfd2lkdGgKKyAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByMTEKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByMTEKKyAgICBhZGQgICAgICAgICAgICAgcjAsIHI4LCByNgorICAgIGFkZCAgICAgICAgICAgICByMTEsIHI5LCByNworCisgICAgbW92ICAgICAgICAgICAgIGxyLCByNCwgbHNyICMxCitleHRyYV9jcF9zcmNfdG9fZHN0X2hlaWdodF9sb29wCisgICAgbW92ICAgICAgICAgICAgIHI4LCByMgorICAgIG1vdiAgICAgICAgICAgICByOSwgcjMKKyAgICBhZGQgICAgICAgICAgICAgcjAsIHI4LCByNgorICAgIGFkZCAgICAgICAgICAgICByMTEsIHI5LCByNworCisgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjEwCisKK2V4dHJhX2NwX3NyY190b19kc3Rfd2lkdGhfbG9vcAorICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjBdIQorCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMTYKKworICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjldIQorICAgIHZzdDEuOCAgICAgICAgICB7cTF9LCBbcjExXSEKKyAgICBibmUgICAgICAgICAgICAgZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aF9sb29wCisKKyAgICBzdWJzICAgICAgICAgICAgbHIsIGxyLCAjMQorCisgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjYsIGxzbCAjMQorICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHI3LCBsc2wgIzEKKworICAgIGJuZSAgICAgICAgICAgICBleHRyYV9jcF9zcmNfdG9fZHN0X2hlaWdodF9sb29wCisKKyAgICBiICAgICAgICAgICAgICAgZW5kX29mX2NwX3NyY190b19kc3QKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZXh0cmFfY3Bfc3JjX3RvX2RzdF91dl93aWR0aAorICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHIxMQorICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHIxMQorICAgIGFkZCAgICAgICAgICAgICByMCwgcjgsIHI2CisgICAgYWRkICAgICAgICAgICAgIHIxMSwgcjksIHI3CisKKyAgICBtb3YgICAgICAgICAgICAgbHIsIHI0LCBsc3IgIzEKK2V4dHJhX2NwX3NyY190b19kc3RfaGVpZ2h0X3V2X2xvb3AKKyAgICBtb3YgICAgICAgICAgICAgcjgsIHIyCisgICAgbW92ICAgICAgICAgICAgIHI5LCByMworICAgIGFkZCAgICAgICAgICAgICByMCwgcjgsIHI2CisgICAgYWRkICAgICAgICAgICAgIHIxMSwgcjksIHI3CisKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCByMTAKKworZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aF91dl9sb29wCisgICAgdmxkMS44ICAgICAgICAgIHtkMH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAgICAgIHtkMX0sIFtyMF0hCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM4CisKKyAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I5XSEKKyAgICB2c3QxLjggICAgICAgICAge2QxfSwgW3IxMV0hCisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGhfdXZfbG9vcAorCisgICAgc3VicyAgICAgICAgICAgIGxyLCBsciwgIzEKKworICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHI2LCBsc2wgIzEKKyAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByNywgbHNsICMxCisKKyAgICBibmUgICAgICAgICAgICAgZXh0cmFfY3Bfc3JjX3RvX2RzdF9oZWlnaHRfdXZfbG9vcAorCisgICAgYiAgICAgICAgICAgICAgIGVuZF9vZl9jcF9zcmNfdG9fZHN0X3V2CisKKyAgICBFTkRQCisgICAgRU5ECmRpZmYgLS1naXQgYS92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weXNyY2ZyYW1lX2Z1bmNfbmVvbi5hc20gYi9saWJ2cHgvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlzcmNmcmFtZV9mdW5jX25lb24uYXNtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB2cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weXNyY2ZyYW1lX2Z1bmNfbmVvbi5hc20KcmVuYW1lIHRvIGxpYnZweC92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weXNyY2ZyYW1lX2Z1bmNfbmVvbi5hc20KZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfZXh0ZW5kZnJhbWVib3JkZXJzX25lb24uYXNtIGIvbGlidnB4L3ZweF9zY2FsZS9hcm0vbmVvbi92cDhfdnB4eXYxMl9leHRlbmRmcmFtZWJvcmRlcnNfbmVvbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjNDI0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfZXh0ZW5kZnJhbWVib3JkZXJzX25lb24uYXNtCkBAIC0wLDAgKzEsMzA4IEBACis7Cis7ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOworOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCis7ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCis7ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Cis7ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKzsKKworCisgICAgRVhQT1JUICB8dnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbnwKKyAgICBBUk0KKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgSU5DTFVERSBhc21fY29tX29mZnNldHMuYXNtCisKKyAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKKzt2b2lkIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX25lb24gKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKTsKKzsgd2UgZGVwZW5kIG9uIFZQOEJPUkRFUklOUElYRUxTIGJlaW5nIDMyCisKK3x2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19uZW9ufCBQUk9DCisgICAgcHVzaCAgICAgICAgICAgIHtyNCAtIHIxMCwgbHJ9CisgICAgdnB1c2ggICAgICAgICAgIHtkOCAtIGQxNX0KKworICAgIDsgQm9yZGVyID0gMzIKKyAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3dpZHRoXSAgOyBwbGFuZV93aWR0aAorICAgIGxkciAgICAgICAgICAgICByMSwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSA7IHNyY19wdHIxCisgICAgbGRyICAgICAgICAgICAgIHI0LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9oZWlnaHRdIDsgcGxhbmVfaGVpZ2h0CisgICAgbGRyICAgICAgICAgICAgIGxyLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9zdHJpZGVdIDsgcGxhbmVfc3RyaWRlCisKKzsgQm9yZGVyIGNvcHkgZm9yIFkgcGxhbmUKKzsgY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dAorICAgIGFkZCAgICAgICAgICAgICByNiwgcjEsIHIzICAgICAgICAgICAgICA7IGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMSAoc3JjX3B0cjEgKyBwbGFuZV93aWR0aCkKKyAgICBzdWIgICAgICAgICAgICAgcjIsIHI2LCAjMSAgICAgICAgICAgICAgOyBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxCisgICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgIzMyICAgICAgICAgICAgIDsgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXIKKworICAgIG1vdiAgICAgICAgICAgICByMTIsIHI0LCBsc3IgIzIgICAgICAgICA7IHBsYW5lX2hlaWdodCAvIDQKKworY29weV9sZWZ0X3JpZ2h0X3kKKyAgICB2bGQxLjggICAgICAgICAge2QwW10sIGQxW119LCBbcjFdLCBscgorICAgIHZsZDEuOCAgICAgICAgICB7ZDRbXSwgZDVbXX0sIFtyMl0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkOFtdLCBkOVtdfSwgW3IxXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QxMltdLCBkMTNbXX0sIFtyMl0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkMTZbXSwgZDE3W119LCBbcjFdLCBscgorICAgIHZsZDEuOCAgICAgICAgICB7ZDIwW10sIGQyMVtdfSwgW3IyXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QyNFtdLCBkMjVbXX0sIFtyMV0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkMjhbXSwgZDI5W119LCBbcjJdLCBscgorCisgICAgdm1vdiAgICAgICAgICAgIHExLCBxMAorICAgIHZtb3YgICAgICAgICAgICBxMywgcTIKKyAgICB2bW92ICAgICAgICAgICAgcTUsIHE0CisgICAgdm1vdiAgICAgICAgICAgIHE3LCBxNgorICAgIHZtb3YgICAgICAgICAgICBxOSwgcTgKKyAgICB2bW92ICAgICAgICAgICAgcTExLCBxMTAKKyAgICB2bW92ICAgICAgICAgICAgcTEzLCBxMTIKKyAgICB2bW92ICAgICAgICAgICAgcTE1LCBxMTQKKworICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKworICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I1XSwgbHIKKyAgICB2c3QxLjggICAgICAgICAge3EyLCBxM30sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3I2XSwgbHIKKyAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyNl0sIGxyCisKKyAgICBibmUgICAgICAgICAgICAgY29weV9sZWZ0X3JpZ2h0X3kKKworO05vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycworICAgIGxkciAgICAgICAgICAgICByMSwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSA7IHlfYnVmZmVyCisgICAgbXVsICAgICAgICAgICAgIHI4LCByNCwgbHIgICAgICAgICAgICAgIDsgcGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlCisKKyAgICA7IGNvcHkgd2lkdGggaXMgcGxhbmVfc3RyaWRlCisgICAgbW92cyAgICAgICAgICAgIHIxMiwgbHIsIGxzciAjNyAgICAgICAgIDsgcGxhbmVfc3RyaWRlIC8gMTI4CisKKyAgICBzdWIgICAgICAgICAgICAgcjEsIHIxLCAjMzIgICAgICAgICAgICAgOyBzcmNfcHRyMSA9IHlfYnVmZmVyIC0gQm9yZGVyCisgICAgYWRkICAgICAgICAgICAgIHI2LCByMSwgcjggICAgICAgICAgICAgIDsgZGVzdF9wdHIyID0gc3JjX3B0cjIgLSBwbGFuZV9zdHJpZGUgKHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkpCisgICAgc3ViICAgICAgICAgICAgIHIyLCByNiwgbHIgICAgICAgICAgICAgIDsgc3JjX3B0cjIgPSBzcmNfcHRyMSArIChwbGFuZV9oZWlnaHQgKiBwbGFuZV9zdHJpZGUpIC0gcGxhbmVfc3RyaWRlCisgICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgbHIsIGFzbCAjNSAgICAgIDsgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKQorICAgIGJsZSAgICAgICAgICAgICBleHRyYV95X2NvcHlfbmVlZGVkICAgICA7IHBsYW5lIHN0cmlkZSA8IDEyOAorCitjb3B5X3RvcF9ib3R0b21feQorICAgIHZsZDEuOCAgICAgICAgICB7cTAsIHExfSwgW3IxXSEKKyAgICB2bGQxLjggICAgICAgICAge3E4LCBxOX0sIFtyMl0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjFdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjJdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3IxXSEKKyAgICB2bGQxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IyXSEKKyAgICB2bGQxLjggICAgICAgICAge3E2LCBxN30sIFtyMV0hCisgICAgdmxkMS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyMl0hCisKKyAgICBtb3YgICAgICAgICAgICAgcjcsICMzMiAgICAgICAgICAgICAgICAgOyBCb3JkZXIKKwordG9wX2JvdHRvbV8zMgorICAgIHN1YnMgICAgICAgICAgICByNywgcjcsICMxCisKKyAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyNV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3I1XSEKKyAgICB2c3QxLjggICAgICAgICAge3ExMCwgcTExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICAgICAge3E0LCBxNX0sIFtyNV0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjVdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgYWRkICAgICAgICAgICAgIHI1LCByNSwgbHIgICAgICAgICAgICAgIDsgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZQorICAgIHN1YiAgICAgICAgICAgICByNSwgcjUsICMxMjggICAgICAgICAgICA7IGRlc3RfcHRyMSAtPSAxMjgKKyAgICBhZGQgICAgICAgICAgICAgcjYsIHI2LCBsciAgICAgICAgICAgICAgOyBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlCisgICAgc3ViICAgICAgICAgICAgIHI2LCByNiwgIzEyOCAgICAgICAgICAgIDsgZGVzdF9wdHIyIC09IDEyOAorCisgICAgYm5lICAgICAgICAgICAgIHRvcF9ib3R0b21fMzIKKworICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIGxyLCBhc2wgIzUgICAgICA7IHNyY19wdHIxIC0gKEJvcmRlciogcGxhbmVfc3RyaWRlKQorICAgIGFkZCAgICAgICAgICAgICByNiwgcjIsIGxyICAgICAgICAgICAgICA7IHNyY19wdHIyICsgcGxhbmVfc3RyaWRlCisKKyAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgYm5lICAgICAgICAgICAgIGNvcHlfdG9wX2JvdHRvbV95CisKK2V4dHJhX3lfY29weV9uZWVkZWQKKyAgICBtb3YgICAgICAgICAgICAgcjcsIGxyLCBsc3IgIzQgICAgICAgICAgOyBjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKKyAgICBhbmRzICAgICAgICAgICAgcjcsIHI3LCAjMHg3CisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21feQorZW5kX29mX2JvcmRlcl9jb3B5X3kKKworO0JvcmRlciBjb3B5IGZvciBVLCBWIHBsYW5lcworOyBCb3JkZXIgPSAxNgorICAgIGxkciAgICAgICAgICAgICByNywgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3VfYnVmZmVyXSAgOyBzcmNfcHRyMQorICAgIGxkciAgICAgICAgICAgICBsciwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3V2X3N0cmlkZV0gOyBwbGFuZV9zdHJpZGUKKyAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ191dl93aWR0aF0gIDsgcGxhbmVfd2lkdGgKKyAgICBsZHIgICAgICAgICAgICAgcjQsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ191dl9oZWlnaHRdIDsgcGxhbmVfaGVpZ2h0CisKKyAgICBtb3YgICAgICAgICAgICAgcjEwLCAjMgorCis7Y29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dAorYm9yZGVyX2NvcHlfdXYKKyAgICBtb3YgICAgICAgICAgICAgcjEsIHI3ICAgICAgICAgICAgICAgICAgOyBzcmNfcHRyMSBuZWVkcyB0byBiZSBzYXZlZCBmb3Igc2Vjb25kIGhhbGYgb2YgbG9vcAorICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsICMxNiAgICAgICAgICAgICA7IGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gQm9yZGVyCisgICAgYWRkICAgICAgICAgICAgIHI2LCByMSwgcjMgICAgICAgICAgICAgIDsgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxIChzcmNfcHRyMSArIHBsYW5lX3dpZHRoKQorICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsICMxICAgICAgICAgICAgICA7IHNyY19wdHIyID0gc3JjX3B0cjEgKyBwbGFuZV93aWR0aCAtIDEKKworICAgIG1vdiAgICAgICAgICAgICByMTIsIHI0LCBsc3IgIzMgICAgICAgICA7IHBsYW5lX2hlaWdodCAvIDgKKworY29weV9sZWZ0X3JpZ2h0X3V2CisgICAgdmxkMS44ICAgICAgICAgIHtkMFtdLCBkMVtdfSwgW3IxXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QyW10sIGQzW119LCBbcjJdLCBscgorICAgIHZsZDEuOCAgICAgICAgICB7ZDRbXSwgZDVbXX0sIFtyMV0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkNltdLCBkN1tdfSwgW3IyXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2Q4W10sIGQ5W119LCAgW3IxXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QxMFtdLCBkMTFbXX0sIFtyMl0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkMTJbXSwgZDEzW119LCBbcjFdLCBscgorICAgIHZsZDEuOCAgICAgICAgICB7ZDE0W10sIGQxNVtdfSwgW3IyXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QxNltdLCBkMTdbXX0sIFtyMV0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkMThbXSwgZDE5W119LCBbcjJdLCBscgorICAgIHZsZDEuOCAgICAgICAgICB7ZDIwW10sIGQyMVtdfSwgW3IxXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QyMltdLCBkMjNbXX0sIFtyMl0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkMjRbXSwgZDI1W119LCBbcjFdLCBscgorICAgIHZsZDEuOCAgICAgICAgICB7ZDI2W10sIGQyN1tdfSwgW3IyXSwgbHIKKyAgICB2bGQxLjggICAgICAgICAge2QyOFtdLCBkMjlbXX0sIFtyMV0sIGxyCisgICAgdmxkMS44ICAgICAgICAgIHtkMzBbXSwgZDMxW119LCBbcjJdLCBscgorCisgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorCisgICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMX0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxM30sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxNH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxNX0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxNn0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxN30sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxOH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxOX0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTExfSwgW3I2XSwgbHIKKyAgICB2c3QxLjggICAgICAgICAge3ExMn0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtxMTN9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTE0fSwgW3I1XSwgbHIKKyAgICB2c3QxLjggICAgICAgICAge3ExNX0sIFtyNl0sIGxyCisKKyAgICBibmUgICAgICAgICAgICAgY29weV9sZWZ0X3JpZ2h0X3V2CisKKztOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMKKyAgICBtb3YgICAgICAgICAgICAgcjEsIHI3CisgICAgbXVsICAgICAgICAgICAgIHI4LCByNCwgbHIgICAgICAgICAgICAgIDsgcGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlCisgICAgbW92cyAgICAgICAgICAgIHIxMiwgbHIsIGxzciAjNiAgICAgICAgIDsgcGxhbmVfc3RyaWRlIC8gNjQKKworICAgIHN1YiAgICAgICAgICAgICByMSwgcjEsICMxNiAgICAgICAgICAgICA7IHNyY19wdHIxID0gdV9idWZmZXIgLSBCb3JkZXIKKyAgICBhZGQgICAgICAgICAgICAgcjYsIHIxLCByOCAgICAgICAgICAgICAgOyBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZSAoc3JjX3B0cjEgKyAocGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlKQorICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsIGxyICAgICAgICAgICAgICA7IHNyY19wdHIyID0gc3JjX3B0cjEgKyAocGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlKSAtIHBsYW5lX3N0cmlkZQorICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIGxyLCBhc2wgIzQgICAgICA7IGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gKEJvcmRlciAqIHBsYW5lX3N0cmlkZSkKKyAgICBibGUgICAgICAgICAgICAgZXh0cmFfdXZfY29weV9uZWVkZWQgICAgOyBwbGFuZV9zdHJpZGUgPCA2NAorCitjb3B5X3RvcF9ib3R0b21fdXYKKyAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyMV0hCisgICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjJdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3IxXSEKKyAgICB2bGQxLjggICAgICAgICAge3ExMCwgcTExfSwgW3IyXSEKKworICAgIG1vdiAgICAgICAgICAgICByNywgIzE2ICAgICAgICAgICAgICAgICA7IEJvcmRlcgorCit0b3BfYm90dG9tXzE2CisgICAgc3VicyAgICAgICAgICAgIHI3LCByNywgIzEKKworICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I1XSEKKyAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjVdIQorICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdIQorCisgICAgYWRkICAgICAgICAgICAgIHI1LCByNSwgbHIgICAgICAgICAgICAgIDsgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZQorICAgIHN1YiAgICAgICAgICAgICByNSwgcjUsICM2NAorICAgIGFkZCAgICAgICAgICAgICByNiwgcjYsIGxyICAgICAgICAgICAgICA7IGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGUKKyAgICBzdWIgICAgICAgICAgICAgcjYsIHI2LCAjNjQKKworICAgIGJuZSAgICAgICAgICAgICB0b3BfYm90dG9tXzE2CisKKyAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCBsciwgYXNsICM0ICAgICAgOyBkZXN0X3B0cjEgPSBzcmNfcHRyMSAtIChCb3JkZXIgKiBwbGFuZV9zdHJpZGUpCisgICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIgICAgICAgICAgICAgIDsgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyBwbGFuZV9zdHJpZGUKKworICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICBibmUgICAgICAgICAgICAgY29weV90b3BfYm90dG9tX3V2CitleHRyYV91dl9jb3B5X25lZWRlZAorICAgIG1vdiAgICAgICAgICAgICByNywgbHIsIGxzciAjMyAgICAgICAgICA7IGNoZWNrIHRvIHNlZSBpZiBleHRyYSBjb3B5IGlzIG5lZWRlZAorICAgIGFuZHMgICAgICAgICAgICByNywgcjcsICMweDcKKyAgICBibmUgICAgICAgICAgICAgZXh0cmFfdG9wX2JvdHRvbV91dgorCitlbmRfb2ZfYm9yZGVyX2NvcHlfdXYKKyAgICBzdWJzICAgICAgICAgICAgcjEwLCByMTAsICMxCisgICAgbGRybmUgICAgICAgICAgIHI3LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfdl9idWZmZXJdIDsgc3JjX3B0cjEKKyAgICBibmUgICAgICAgICAgICAgYm9yZGVyX2NvcHlfdXYKKworICAgIHZwb3AgICAgICAgICAgICB7ZDggLSBkMTV9CisgICAgcG9wICAgICAgICAgICAgIHtyNCAtIHIxMCwgcGN9CisKKzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKK2V4dHJhX3RvcF9ib3R0b21feQorICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjFdIQorICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjJdIQorCisgICAgbW92ICAgICAgICAgICAgIHI5LCAjNCAgICAgICAgICAgICAgICAgIDsgMzIgPj4gMworCitleHRyYV90b3BfYm90dG9tXzMyCisgICAgc3VicyAgICAgICAgICAgIHI5LCByOSwgIzEKKworICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgorICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgorICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tXzMyCisKKyAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCBsciwgYXNsICM1ICAgICAgOyBzcmNfcHRyMSAtIChCb3JkZXIgKiBwbGFuZV9zdHJpZGUpCisgICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIgICAgICAgICAgICAgIDsgc3JjX3B0cjIgKyBwbGFuZV9zdHJpZGUKKyAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQorICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tX3kKKworICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfYm9yZGVyX2NvcHlfeQorCitleHRyYV90b3BfYm90dG9tX3V2CisgICAgdmxkMS44ICAgICAgICAgIHtkMH0sIFtyMV0hCisgICAgdmxkMS44ICAgICAgICAgIHtkOH0sIFtyMl0hCisKKyAgICBtb3YgICAgICAgICAgICAgcjksICMyICAgICAgICAgICAgICAgICAgOyAxNiA+PiAzCisKK2V4dHJhX3RvcF9ib3R0b21fMTYKKyAgICBzdWJzICAgICAgICAgICAgcjksIHI5LCAjMQorCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCisgICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fMTYKKworICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIGxyLCBhc2wgIzQgICAgICA7IHNyY19wdHIxIC0gKEJvcmRlciAqIHBsYW5lX3N0cmlkZSkKKyAgICBhZGQgICAgICAgICAgICAgcjYsIHIyLCBsciAgICAgICAgICAgICAgOyBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZQorICAgIHN1YnMgICAgICAgICAgICByNywgcjcsICMxCisgICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fdXYKKworICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfYm9yZGVyX2NvcHlfdXYKKworICAgIEVORFAKKyAgICBFTkQKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24veXYxMmV4dGVuZF9hcm0uYyBiL2xpYnZweC92cHhfc2NhbGUvYXJtL25lb24veXYxMmV4dGVuZF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJkNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS9hcm0vbmVvbi95djEyZXh0ZW5kX2FybS5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgIi4vdnB4X3J0Y2QuaCIKKworZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV9mdW5jX25lb24oc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqc3JjX3liYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMpOworCit2b2lkIHZwOF95djEyX2NvcHlfZnJhbWVfbmVvbihzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICpzcmNfeWJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqZHN0X3liYykgeworICB2cDhfeXYxMl9jb3B5X2ZyYW1lX2Z1bmNfbmVvbihzcmNfeWJjLCBkc3RfeWJjKTsKKworICB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19uZW9uKGRzdF95YmMpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL2JpY3ViaWNfc2NhbGVyLmMgYi9saWJ2cHgvdnB4X3NjYWxlL2dlbmVyaWMvYmljdWJpY19zY2FsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE2NzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL2JpY3ViaWNfc2NhbGVyLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKyNpbmNsdWRlICJ2cHhzY2FsZV9hcmJpdHJhcnkuaCIKKworI2RlZmluZSBGSVhFRF9QT0lOVAorCisjZGVmaW5lIE1BWF9JTl9XSURUSCAgICAgICAgODAwCisjZGVmaW5lIE1BWF9JTl9IRUlHSFQgICAgICAgNjAwCisjZGVmaW5lIE1BWF9PVVRfV0lEVEggICAgICAgODAwCisjZGVmaW5lIE1BWF9PVVRfSEVJR0hUICAgICAgNjAwCisjZGVmaW5lIE1BWF9PVVRfRElNRU5TSU9OICAgKChNQVhfT1VUX1dJRFRIID4gTUFYX09VVF9IRUlHSFQpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfT1VUX1dJRFRIIDogTUFYX09VVF9IRUlHSFQpCisKK0JJQ1VCSUNfU0NBTEVSX1NUUlVDVCBnX2Jfc2NhbGVyOworc3RhdGljIGludCBnX2ZpcnN0X3RpbWUgPSAxOworCisjcHJhZ21hIERBVEFfU0VDVElPTihnX2hidWYsICJWUDZfSEVBUCIpCisjcHJhZ21hIERBVEFfQUxJR04gKGdfaGJ1ZiwgMzIpOwordW5zaWduZWQgY2hhciBnX2hidWZbTUFYX09VVF9ESU1FTlNJT05dOworCisjcHJhZ21hIERBVEFfU0VDVElPTihnX2hidWZfdXYsICJWUDZfSEVBUCIpCisjcHJhZ21hIERBVEFfQUxJR04gKGdfaGJ1Zl91diwgMzIpOwordW5zaWduZWQgY2hhciBnX2hidWZfdXZbTUFYX09VVF9ESU1FTlNJT05dOworCisKKyNpZmRlZiBGSVhFRF9QT0lOVAorc3RhdGljIGludCBhX2kgPSAwLjYgKiA2NTUzNjsKKyNlbHNlCitzdGF0aWMgZmxvYXQgYSA9IC0wLjY7CisjZW5kaWYKKworI2lmZGVmIEZJWEVEX1BPSU5UCisvLyAgICAgICAgIDMgICAgIDIKKy8vIEMwID0gYSp0IC0gYSp0CisvLworc3RhdGljIHNob3J0IGMwX2ZpeGVkKHVuc2lnbmVkIGludCB0KSB7CisgIC8vIHB1dCB0IGluIFExNiBub3RhdGlvbgorICB1bnNpZ25lZCBzaG9ydCB2MSwgdjI7CisKKyAgLy8gUTE2CisgIHYxID0gKGFfaSAqIHQpID4+IDE2OworICB2MSA9ICh2MSAqIHQpID4+IDE2OworCisgIC8vIFExNgorICB2MiA9IChhX2kgKiB0KSA+PiAxNjsKKyAgdjIgPSAodjIgKiB0KSA+PiAxNjsKKyAgdjIgPSAodjIgKiB0KSA+PiAxNjsKKworICAvLyBRMTIKKyAgcmV0dXJuIC0oKHYxIC0gdjIpID4+IDQpOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgMworLy8gQzEgPSBhKnQgKyAoMy0yKmEpKnQgIC0gKDItYSkqdAorLy8KK3N0YXRpYyBzaG9ydCBjMV9maXhlZCh1bnNpZ25lZCBpbnQgdCkgeworICB1bnNpZ25lZCBzaG9ydCB2MSwgdjIsIHYzOworICB1bnNpZ25lZCBzaG9ydCB0d28sIHRocmVlOworCisgIC8vIFExNgorICB2MSA9IChhX2kgKiB0KSA+PiAxNjsKKworICAvLyBRMTMKKyAgdHdvID0gMiA8PCAxMzsKKyAgdjIgPSB0d28gLSAoYV9pID4+IDMpOworICB2MiA9ICh2MiAqIHQpID4+IDE2OworICB2MiA9ICh2MiAqIHQpID4+IDE2OworICB2MiA9ICh2MiAqIHQpID4+IDE2OworCisgIC8vIFExMworICB0aHJlZSA9IDMgPDwgMTM7CisgIHYzID0gdGhyZWUgLSAoMiAqIChhX2kgPj4gMykpOworICB2MyA9ICh2MyAqIHQpID4+IDE2OworICB2MyA9ICh2MyAqIHQpID4+IDE2OworCisgIC8vIFExMgorICByZXR1cm4gKCgodjEgPj4gMykgLSB2MiArIHYzKSA+PiAxKTsKKworfQorCisvLyAgICAgICAgICAgICAgICAgMiAgICAgICAgICAzCisvLyBDMiA9IDEgLSAoMy1hKSp0ICArICgyLWEpKnQKKy8vCitzdGF0aWMgc2hvcnQgYzJfZml4ZWQodW5zaWduZWQgaW50IHQpIHsKKyAgdW5zaWduZWQgc2hvcnQgdjEsIHYyLCB2MzsKKyAgdW5zaWduZWQgc2hvcnQgdHdvLCB0aHJlZTsKKworICAvLyBRMTMKKyAgdjEgPSAxIDw8IDEzOworCisgIC8vIFExMworICB0aHJlZSA9IDMgPDwgMTM7CisgIHYyID0gdGhyZWUgLSAoYV9pID4+IDMpOworICB2MiA9ICh2MiAqIHQpID4+IDE2OworICB2MiA9ICh2MiAqIHQpID4+IDE2OworCisgIC8vIFExMworICB0d28gPSAyIDw8IDEzOworICB2MyA9IHR3byAtIChhX2kgPj4gMyk7CisgIHYzID0gKHYzICogdCkgPj4gMTY7CisgIHYzID0gKHYzICogdCkgPj4gMTY7CisgIHYzID0gKHYzICogdCkgPj4gMTY7CisKKyAgLy8gUTEyCisgIHJldHVybiAodjEgLSB2MiArIHYzKSA+PiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgMiAgICAgIDMKKy8vIEMzID0gYSp0IC0gMiphKnQgICsgYSp0CisvLworc3RhdGljIHNob3J0IGMzX2ZpeGVkKHVuc2lnbmVkIGludCB0KSB7CisgIGludCB2MSwgdjIsIHYzOworCisgIC8vIFExNgorICB2MSA9IChhX2kgKiB0KSA+PiAxNjsKKworICAvLyBRMTUKKyAgdjIgPSAyICogKGFfaSA+PiAxKTsKKyAgdjIgPSAodjIgKiB0KSA+PiAxNjsKKyAgdjIgPSAodjIgKiB0KSA+PiAxNjsKKworICAvLyBRMTYKKyAgdjMgPSAoYV9pICogdCkgPj4gMTY7CisgIHYzID0gKHYzICogdCkgPj4gMTY7CisgIHYzID0gKHYzICogdCkgPj4gMTY7CisKKyAgLy8gUTEyCisgIHJldHVybiAoKHYyIC0gKHYxID4+IDEpIC0gKHYzID4+IDEpKSA+PiAzKTsKK30KKyNlbHNlCisvLyAgICAgICAgICAzICAgICAyCisvLyBDMCA9IC1hKnQgKyBhKnQKKy8vCitmbG9hdCBDMChmbG9hdCB0KSB7CisgIHJldHVybiAtYSAqIHQgKiB0ICogdCArIGEgKiB0ICogdDsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAzCisvLyBDMSA9IC1hKnQgKyAoMiphKzMpKnQgIC0gKGErMikqdAorLy8KK2Zsb2F0IEMxKGZsb2F0IHQpIHsKKyAgcmV0dXJuIC0oYSArIDIuMGYpICogdCAqIHQgKiB0ICsgKDIuMGYgKiBhICsgMy4wZikgKiB0ICogdCAtIGEgKiB0OworfQorCisvLyAgICAgICAgICAgICAgICAgMiAgICAgICAgICAzCisvLyBDMiA9IDEgLSAoYSszKSp0ICArIChhKzIpKnQKKy8vCitmbG9hdCBDMihmbG9hdCB0KSB7CisgIHJldHVybiAoYSArIDIuMGYpICogdCAqIHQgKiB0IC0gKGEgKyAzLjBmKSAqIHQgKiB0ICsgMS4wZjsKK30KKworLy8gICAgICAgICAgICAgICAgIDIgICAgICAzCisvLyBDMyA9IGEqdCAtIDIqYSp0ICArIGEqdAorLy8KK2Zsb2F0IEMzKGZsb2F0IHQpIHsKKyAgcmV0dXJuIGEgKiB0ICogdCAqIHQgLSAyLjBmICogYSAqIHQgKiB0ICsgYSAqIHQ7Cit9CisjZW5kaWYKKworI2lmIDAKK2ludCBjb21wYXJlX3JlYWxfZml4ZWQoKSB7CisgIGludCBpLCBlcnJvcnMgPSAwOworICBmbG9hdCBtdWx0ID0gMS4wIC8gMTAwMDAuMDsKKyAgdW5zaWduZWQgaW50IGZpeGVkX211bHQgPSBtdWx0ICogNDI5NDk2NzI5NjsvLyA2NTUzNjsKKyAgdW5zaWduZWQgaW50IHBoYXNlX29mZnNldF9pbnQ7CisgIGZsb2F0IHBoYXNlX29mZnNldF9yZWFsOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisgICAgaW50IGZpeGVkMCwgZml4ZWQxLCBmaXhlZDIsIGZpeGVkMywgZml4ZWRfdG90YWw7CisgICAgaW50IHJlYWwwLCByZWFsMSwgcmVhbDIsIHJlYWwzLCByZWFsX3RvdGFsOworCisgICAgcGhhc2Vfb2Zmc2V0X3JlYWwgPSAoZmxvYXQpaSAqIG11bHQ7CisgICAgcGhhc2Vfb2Zmc2V0X2ludCA9IChmaXhlZF9tdWx0ICogaSkgPj4gMTY7CisvLyAgICAgIHBoYXNlX29mZnNldF9pbnQgPSBwaGFzZV9vZmZzZXRfcmVhbCAqIDY1NTM2OworCisgICAgZml4ZWQwID0gYzBfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7CisgICAgcmVhbDAgPSBDMChwaGFzZV9vZmZzZXRfcmVhbCkgKiA0MDk2LjA7CisKKyAgICBpZiAoKGFicyhmaXhlZDApID4gKGFicyhyZWFsMCkgKyAxKSkgfHwgKGFicyhmaXhlZDApIDwgKGFicyhyZWFsMCkgLSAxKSkpCisgICAgICBlcnJvcnMrKzsKKworICAgIGZpeGVkMSA9IGMxX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOworICAgIHJlYWwxID0gQzEocGhhc2Vfb2Zmc2V0X3JlYWwpICogNDA5Ni4wOworCisgICAgaWYgKChhYnMoZml4ZWQxKSA+IChhYnMocmVhbDEpICsgMSkpIHx8IChhYnMoZml4ZWQxKSA8IChhYnMocmVhbDEpIC0gMSkpKQorICAgICAgZXJyb3JzKys7CisKKyAgICBmaXhlZDIgPSBjMl9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKKyAgICByZWFsMiA9IEMyKHBoYXNlX29mZnNldF9yZWFsKSAqIDQwOTYuMDsKKworICAgIGlmICgoYWJzKGZpeGVkMikgPiAoYWJzKHJlYWwyKSArIDEpKSB8fCAoYWJzKGZpeGVkMikgPCAoYWJzKHJlYWwyKSAtIDEpKSkKKyAgICAgIGVycm9ycysrOworCisgICAgZml4ZWQzID0gYzNfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7CisgICAgcmVhbDMgPSBDMyhwaGFzZV9vZmZzZXRfcmVhbCkgKiA0MDk2LjA7CisKKyAgICBpZiAoKGFicyhmaXhlZDMpID4gKGFicyhyZWFsMykgKyAxKSkgfHwgKGFicyhmaXhlZDMpIDwgKGFicyhyZWFsMykgLSAxKSkpCisgICAgICBlcnJvcnMrKzsKKworICAgIGZpeGVkX3RvdGFsID0gZml4ZWQwICsgZml4ZWQxICsgZml4ZWQyICsgZml4ZWQzOworICAgIHJlYWxfdG90YWwgPSByZWFsMCArIHJlYWwxICsgcmVhbDIgKyByZWFsMzsKKworICAgIGlmICgoZml4ZWRfdG90YWwgPiA0MDk3KSB8fCAoZml4ZWRfdG90YWwgPCA0MDk0KSkKKyAgICAgIGVycm9ycysrOworCisgICAgaWYgKChyZWFsX3RvdGFsID4gNDA5NykgfHwgKHJlYWxfdG90YWwgPCA0MDk1KSkKKyAgICAgIGVycm9ycysrOworICB9CisKKyAgcmV0dXJuIGVycm9yczsKK30KKyNlbmRpZgorCisvLyBGaW5kIGdyZWF0ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBiZXR3ZWVuIHR3byBpbnRlZ2Vycy4gIE1ldGhvZCB1c2VkIGhlcmUgaXMKKy8vICBzbG93IGNvbXBhcmVkIHRvIEV1Y2xpZCdzIGFsZ29yaXRobSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW55IGRpdmlzaW9uLgoraW50IGdjZChpbnQgYSwgaW50IGIpIHsKKyAgLy8gUHJvYmxlbSB3aXRoIHRoaXMgYWxnb3JpdGhtIGlzIHRoYXQgaWYgYSBvciBiID0gMCB0aGlzIGZ1bmN0aW9uCisgIC8vICB3aWxsIG5ldmVyIGV4aXQuICBEb24ndCB3YW50IHRvIHJldHVybiAwIGJlY2F1c2UgYW55IGNvbXB1dGF0aW9uCisgIC8vICB0aGF0IHdhcyBiYXNlZCBvbiBhIGNvbW1vbiBkZW5vbmluYXRvciBhbmQgdHJpZWQgdG8gcmVkdWNlIGJ5CisgIC8vICBkaXZpZGluZyBieSAwIHdvdWxkIGZhaWwuICBCZXN0IHNvbHV0aW9uIHRoYXQgY291bGQgYmUgdGhvdWdodCBvZgorICAvLyAgd291bGQgdG8gYmUgZmFpbCBieSByZXR1cmluZyBhIDE7CisgIGlmIChhIDw9IDAgfHwgYiA8PSAwKQorICAgIHJldHVybiAxOworCisgIHdoaWxlIChhICE9IGIpIHsKKyAgICBpZiAoYiA+IGEpCisgICAgICBiID0gYiAtIGE7CisgICAgZWxzZSB7CisgICAgICBpbnQgdG1wID0gYTsvLyBzd2FwIGxhcmdlIGFuZAorICAgICAgYSA9IGI7IC8vIHNtYWxsCisgICAgICBiID0gdG1wOworICAgIH0KKyAgfQorCisgIHJldHVybiBiOworfQorCit2b2lkIGJpY3ViaWNfY29lZmZpY2llbnRfaW5pdCgpIHsKKyAgdnB4X21lbXNldCgmZ19iX3NjYWxlciwgMCwgc2l6ZW9mKEJJQ1VCSUNfU0NBTEVSX1NUUlVDVCkpOworICBnX2ZpcnN0X3RpbWUgPSAwOworfQorCit2b2lkIGJpY3ViaWNfY29lZmZpY2llbnRfZGVzdHJveSgpIHsKKyAgaWYgKCFnX2ZpcnN0X3RpbWUpIHsKKyAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmxfdyk7CisKKyAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmxfaCk7CisKKyAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmxfaF91dik7CisKKyAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfdyk7CisKKyAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfaCk7CisKKyAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfaF91dik7CisKKyAgICB2cHhfbWVtc2V0KCZnX2Jfc2NhbGVyLCAwLCBzaXplb2YoQklDVUJJQ19TQ0FMRVJfU1RSVUNUKSk7CisgIH0KK30KKworLy8gQ3JlYXRlIHRoZSBjb2VmZmllbnRzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY3ViaWMgaW50ZXJwb2xhdGlvbi4KKy8vICBCZWNhdXNlIHNjYWxpbmcgZG9lcyBub3QgaGF2ZSB0byBiZSBlcXVhbCBpbiB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwKKy8vICByZWdpbWVzIHRoZSBwaGFzZSBvZmZzZXRzIHdpbGwgYmUgZGlmZmVyZW50LiAgVGhlcmUgYXJlIDQgY29lZmZpY2VudHMKKy8vICBmb3IgZWFjaCBwb2ludCwgdHdvIG9uIGVhY2ggc2lkZS4gIFRoZSBsYXlvdXQgaXMgdGhhdCB0aGVyZSBhcmUgdGhlCisvLyAgNCBjb2VmZmljZW50cyBmb3IgZWFjaCBwaGFzZSBpbiB0aGUgYXJyYXkgYW5kIHRoZW4gdGhlIG5leHQgcGhhc2UuCitpbnQgYmljdWJpY19jb2VmZmljaWVudF9zZXR1cChpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsIGludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0KSB7CisgIGludCBpOworI2lmZGVmIEZJWEVEX1BPSU5UCisgIGludCBwaGFzZV9vZmZzZXRfaW50OworICB1bnNpZ25lZCBpbnQgZml4ZWRfbXVsdDsKKyAgaW50IHByb2R1Y3RfdmFsID0gMDsKKyNlbHNlCisgIGZsb2F0IHBoYXNlX29mZnNldDsKKyNlbmRpZgorICBpbnQgZ2NkX3csIGdjZF9oLCBnY2RfaF91diwgZF93LCBkX2gsIGRfaF91djsKKworICBpZiAoZ19maXJzdF90aW1lKQorICAgIGJpY3ViaWNfY29lZmZpY2llbnRfaW5pdCgpOworCisKKyAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBjb2VmZmljZW50cyBoYXZlIGFscmVhZHkgYmVlbiBzZXQgdXAgY29ycmVjdGx5CisgIGlmICgoaW5fd2lkdGggPT0gZ19iX3NjYWxlci5pbl93aWR0aCkgJiYgKGluX2hlaWdodCA9PSBnX2Jfc2NhbGVyLmluX2hlaWdodCkKKyAgICAgICYmIChvdXRfd2lkdGggPT0gZ19iX3NjYWxlci5vdXRfd2lkdGgpICYmIChvdXRfaGVpZ2h0ID09IGdfYl9zY2FsZXIub3V0X2hlaWdodCkpCisgICAgcmV0dXJuIDA7CisKKyAgZ19iX3NjYWxlci5pbl93aWR0aCA9IGluX3dpZHRoOworICBnX2Jfc2NhbGVyLmluX2hlaWdodCA9IGluX2hlaWdodDsKKyAgZ19iX3NjYWxlci5vdXRfd2lkdGggPSBvdXRfd2lkdGg7CisgIGdfYl9zY2FsZXIub3V0X2hlaWdodCA9IG91dF9oZWlnaHQ7CisKKyAgLy8gRG9uJ3Qgd2FudCB0byBhbGxvdyBjcmF6eSBzY2FsaW5nLCBqdXN0IHRyeSBhbmQgcHJldmVudCBhIGNhdGFzdHJvcGhpYworICAvLyAgZmFpbHVyZSBoZXJlLiAgV2FudCB0byBmYWlsIGFmdGVyIHNldHRpbmcgdGhlIG1lbWJlciBmdW5jdGlvbnMgc28gaWYKKyAgLy8gIGlmIHRoZSBzY2FsZXIgaXMgY2FsbGVkIHRoZSBtZW1iZXIgZnVuY3Rpb25zIHdpbGwgbm90IHNjYWxlLgorICBpZiAob3V0X3dpZHRoIDw9IDAgfHwgb3V0X2hlaWdodCA8PSAwKQorICAgIHJldHVybiAtMTsKKworICAvLyByZWR1Y2UgaW4vb3V0IHdpZHRoIGFuZCBoZWlnaHQgcmF0aW9zIHVzaW5nIHRoZSBnY2QKKyAgZ2NkX3cgPSBnY2Qob3V0X3dpZHRoLCBpbl93aWR0aCk7CisgIGdjZF9oID0gZ2NkKG91dF9oZWlnaHQsIGluX2hlaWdodCk7CisgIGdjZF9oX3V2ID0gZ2NkKG91dF9oZWlnaHQsIGluX2hlaWdodCAvIDIpOworCisgIC8vIHRoZSBudW1lcmF0b3Igd2lkdGggYW5kIGhlaWdodCBhcmUgdG8gYmUgc2F2ZWQgaW4KKyAgLy8gIGdsb2JhbHMgc28gdGhleSBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIHNjYWxpbmcgcHJvY2VzcworICAvLyAgd2l0aG91dCBoYXZpbmcgdG8gYmUgcmVjYWxjdWxhdGVkLgorICBnX2Jfc2NhbGVyLm53ID0gb3V0X3dpZHRoIC8gZ2NkX3c7CisgIGRfdyA9IGluX3dpZHRoIC8gZ2NkX3c7CisKKyAgZ19iX3NjYWxlci5uaCA9IG91dF9oZWlnaHQgLyBnY2RfaDsKKyAgZF9oID0gaW5faGVpZ2h0IC8gZ2NkX2g7CisKKyAgZ19iX3NjYWxlci5uaF91diA9IG91dF9oZWlnaHQgLyBnY2RfaF91djsKKyAgZF9oX3V2ID0gKGluX2hlaWdodCAvIDIpIC8gZ2NkX2hfdXY7CisKKyAgLy8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY29lZmZpY2VudHMKKyAgdnB4X2ZyZWUoZ19iX3NjYWxlci5sX3cpOworCisgIHZweF9mcmVlKGdfYl9zY2FsZXIubF9oKTsKKworICB2cHhfZnJlZShnX2Jfc2NhbGVyLmxfaF91dik7CisKKyAgZ19iX3NjYWxlci5sX3cgPSAoc2hvcnQgKil2cHhfbWVtYWxpZ24oMzIsIG91dF93aWR0aCAqIDIpOworICBnX2Jfc2NhbGVyLmxfaCA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgb3V0X2hlaWdodCAqIDIpOworICBnX2Jfc2NhbGVyLmxfaF91diA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgb3V0X2hlaWdodCAqIDIpOworCisgIHZweF9mcmVlKGdfYl9zY2FsZXIuY193KTsKKworICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfaCk7CisKKyAgdnB4X2ZyZWUoZ19iX3NjYWxlci5jX2hfdXYpOworCisgIGdfYl9zY2FsZXIuY193ID0gKHNob3J0ICopdnB4X21lbWFsaWduKDMyLCBnX2Jfc2NhbGVyLm53ICogNCAqIDIpOworICBnX2Jfc2NhbGVyLmNfaCA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgZ19iX3NjYWxlci5uaCAqIDQgKiAyKTsKKyAgZ19iX3NjYWxlci5jX2hfdXYgPSAoc2hvcnQgKil2cHhfbWVtYWxpZ24oMzIsIGdfYl9zY2FsZXIubmhfdXYgKiA0ICogMik7CisKKyAgZ19iX3NjYWxlci5oYnVmID0gZ19oYnVmOworICBnX2Jfc2NhbGVyLmhidWZfdXYgPSBnX2hidWZfdXY7CisKKyAgLy8gU2V0IHVwIHBvbHlwaGFzZSBmaWx0ZXIgdGFwcy4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUKKyAgLy8gIHRoZSBzY2FsaW5nIGJlY2F1c2Ugb2YgdGhlIGZsb2F0aW5nIHBvaW50IG1hdGggcmVxdWlyZWQuICBUaGUKKyAgLy8gIGNvZWZmaWNpZW50cyBhcmUgbXVsdGlwbGllZCBieSAyXjEyIHNvIHRoYXQgZml4ZWQgcG9pbnQgbWF0aAorICAvLyAgY2FuIGJlIHVzZWQgaW4gdGhlIG1haW4gc2NhbGluZyBsb29wLgorI2lmZGVmIEZJWEVEX1BPSU5UCisgIGZpeGVkX211bHQgPSAoMS4wIC8gKGZsb2F0KWdfYl9zY2FsZXIubncpICogNDI5NDk2NzI5NjsKKworICBwcm9kdWN0X3ZhbCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGdfYl9zY2FsZXIubnc7IGkrKykgeworICAgIGlmIChwcm9kdWN0X3ZhbCA+IGdfYl9zY2FsZXIubncpCisgICAgICBwcm9kdWN0X3ZhbCAtPSBnX2Jfc2NhbGVyLm53OworCisgICAgcGhhc2Vfb2Zmc2V0X2ludCA9IChmaXhlZF9tdWx0ICogcHJvZHVjdF92YWwpID4+IDE2OworCisgICAgZ19iX3NjYWxlci5jX3dbaSAqIDRdICAgPSBjM19maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKKyAgICBnX2Jfc2NhbGVyLmNfd1tpICogNCArIDFdID0gYzJfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7CisgICAgZ19iX3NjYWxlci5jX3dbaSAqIDQgKyAyXSA9IGMxX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOworICAgIGdfYl9zY2FsZXIuY193W2kgKiA0ICsgM10gPSBjMF9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKKworICAgIHByb2R1Y3RfdmFsICs9IGRfdzsKKyAgfQorCisKKyAgZml4ZWRfbXVsdCA9ICgxLjAgLyAoZmxvYXQpZ19iX3NjYWxlci5uaCkgKiA0Mjk0OTY3Mjk2OworCisgIHByb2R1Y3RfdmFsID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgZ19iX3NjYWxlci5uaDsgaSsrKSB7CisgICAgaWYgKHByb2R1Y3RfdmFsID4gZ19iX3NjYWxlci5uaCkKKyAgICAgIHByb2R1Y3RfdmFsIC09IGdfYl9zY2FsZXIubmg7CisKKyAgICBwaGFzZV9vZmZzZXRfaW50ID0gKGZpeGVkX211bHQgKiBwcm9kdWN0X3ZhbCkgPj4gMTY7CisKKyAgICBnX2Jfc2NhbGVyLmNfaFtpICogNF0gICA9IGMwX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOworICAgIGdfYl9zY2FsZXIuY19oW2kgKiA0ICsgMV0gPSBjMV9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKKyAgICBnX2Jfc2NhbGVyLmNfaFtpICogNCArIDJdID0gYzJfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7CisgICAgZ19iX3NjYWxlci5jX2hbaSAqIDQgKyAzXSA9IGMzX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOworCisgICAgcHJvZHVjdF92YWwgKz0gZF9oOworICB9CisKKyAgZml4ZWRfbXVsdCA9ICgxLjAgLyAoZmxvYXQpZ19iX3NjYWxlci5uaF91dikgKiA0Mjk0OTY3Mjk2OworCisgIHByb2R1Y3RfdmFsID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgZ19iX3NjYWxlci5uaF91djsgaSsrKSB7CisgICAgaWYgKHByb2R1Y3RfdmFsID4gZ19iX3NjYWxlci5uaF91dikKKyAgICAgIHByb2R1Y3RfdmFsIC09IGdfYl9zY2FsZXIubmhfdXY7CisKKyAgICBwaGFzZV9vZmZzZXRfaW50ID0gKGZpeGVkX211bHQgKiBwcm9kdWN0X3ZhbCkgPj4gMTY7CisKKyAgICBnX2Jfc2NhbGVyLmNfaF91dltpICogNF0gICA9IGMwX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOworICAgIGdfYl9zY2FsZXIuY19oX3V2W2kgKiA0ICsgMV0gPSBjMV9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKKyAgICBnX2Jfc2NhbGVyLmNfaF91dltpICogNCArIDJdID0gYzJfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7CisgICAgZ19iX3NjYWxlci5jX2hfdXZbaSAqIDQgKyAzXSA9IGMzX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOworCisgICAgcHJvZHVjdF92YWwgKz0gZF9oX3V2OworICB9CisKKyNlbHNlCisKKyAgZm9yIChpID0gMDsgaSA8IGdfbnc7IGkrKykgeworICAgIHBoYXNlX29mZnNldCA9IChmbG9hdCkoKGkgKiBkX3cpICUgZ19udykgLyAoZmxvYXQpZ19udzsKKyAgICBnX2Nfd1tpICogNF0gICA9IChDMyhwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKKyAgICBnX2Nfd1tpICogNCArIDFdID0gKEMyKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOworICAgIGdfY193W2kgKiA0ICsgMl0gPSAoQzEocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7CisgICAgZ19jX3dbaSAqIDQgKyAzXSA9IChDMChwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBnX25oOyBpKyspIHsKKyAgICBwaGFzZV9vZmZzZXQgPSAoZmxvYXQpKChpICogZF9oKSAlIGdfbmgpIC8gKGZsb2F0KWdfbmg7CisgICAgZ19jX2hbaSAqIDRdICAgPSAoQzAocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7CisgICAgZ19jX2hbaSAqIDQgKyAxXSA9IChDMShwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKKyAgICBnX2NfaFtpICogNCArIDJdID0gKEMyKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOworICAgIGdfY19oW2kgKiA0ICsgM10gPSAoQzMocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgZ19uaF91djsgaSsrKSB7CisgICAgcGhhc2Vfb2Zmc2V0ID0gKGZsb2F0KSgoaSAqIGRfaF91dikgJSBnX25oX3V2KSAvIChmbG9hdClnX25oX3V2OworICAgIGdfY19oX3V2W2kgKiA0XSAgID0gKEMwKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOworICAgIGdfY19oX3V2W2kgKiA0ICsgMV0gPSAoQzEocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7CisgICAgZ19jX2hfdXZbaSAqIDQgKyAyXSA9IChDMihwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKKyAgICBnX2NfaF91dltpICogNCArIDNdID0gKEMzKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOworICB9CisKKyNlbmRpZgorCisgIC8vIENyZWF0ZSBhbiBhcnJheSB0aGF0IGNvcnJlc3BvbmRzIGlucHV0IGxpbmVzIHRvIG91dHB1dCBsaW5lcy4KKyAgLy8gIFRoaXMgZG9lc24ndCByZXF1aXJlIGZsb2F0aW5nIHBvaW50IG1hdGgsIGJ1dCBpdCBkb2VzIHJlcXVpcmUKKyAgLy8gIGEgZGl2aXNpb24gYW5kIGJlY2F1c2UgaGFyZHdhcmUgZGl2aXNpb24gaXMgbm90IHByZXNlbnQgdGhhdAorICAvLyAgaXMgYSBjYWxsLgorICBmb3IgKGkgPSAwOyBpIDwgb3V0X3dpZHRoOyBpKyspIHsKKyAgICBnX2Jfc2NhbGVyLmxfd1tpXSA9IChpICogZF93KSAvIGdfYl9zY2FsZXIubnc7CisKKyAgICBpZiAoKGdfYl9zY2FsZXIubF93W2ldICsgMikgPD0gaW5fd2lkdGgpCisgICAgICBnX2Jfc2NhbGVyLm1heF91c2FibGVfb3V0X3dpZHRoID0gaTsKKworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG91dF9oZWlnaHQgKyAxOyBpKyspIHsKKyAgICBnX2Jfc2NhbGVyLmxfaFtpXSA9IChpICogZF9oKSAvIGdfYl9zY2FsZXIubmg7CisgICAgZ19iX3NjYWxlci5sX2hfdXZbaV0gPSAoaSAqIGRfaF91dikgLyBnX2Jfc2NhbGVyLm5oX3V2OworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBiaWN1YmljX3NjYWxlKGludCBpbl93aWR0aCwgaW50IGluX2hlaWdodCwgaW50IGluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0LCBpbnQgb3V0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0X2ltYWdlLCB1bnNpZ25lZCBjaGFyICpvdXRwdXRfaW1hZ2UpIHsKKyAgc2hvcnQgKlJFU1RSSUNUIGxfdywgKiBSRVNUUklDVCBsX2g7CisgIHNob3J0ICpSRVNUUklDVCBjX3csICogUkVTVFJJQ1QgY19oOworICB1bnNpZ25lZCBjaGFyICpSRVNUUklDVCBpcCwgKiBSRVNUUklDVCBvcDsKKyAgdW5zaWduZWQgY2hhciAqUkVTVFJJQ1QgaGJ1ZjsKKyAgaW50IGgsIHcsIGx3LCBsaDsKKyAgaW50IHRlbXBfc3VtOworICBpbnQgcGhhc2Vfb2Zmc2V0X3csIHBoYXNlX29mZnNldF9oOworCisgIGNfdyA9IGdfYl9zY2FsZXIuY193OworICBjX2ggPSBnX2Jfc2NhbGVyLmNfaDsKKworICBvcCA9IG91dHB1dF9pbWFnZTsKKworICBsX3cgPSBnX2Jfc2NhbGVyLmxfdzsKKyAgbF9oID0gZ19iX3NjYWxlci5sX2g7CisKKyAgcGhhc2Vfb2Zmc2V0X2ggPSAwOworCisgIGZvciAoaCA9IDA7IGggPCBvdXRfaGVpZ2h0OyBoKyspIHsKKyAgICAvLyBzZWxlY3QgdGhlIHJvdyB0byB3b3JrIG9uCisgICAgbGggPSBsX2hbaF07CisgICAgaXAgPSBpbnB1dF9pbWFnZSArIChpbl9zdHJpZGUgKiBsaCk7CisKKyAgICAvLyB2cDhfZmlsdGVyIHRoZSByb3cgdmVydGljYWxseSBpbnRvIGFuIHRlbXBvcmFyeSBidWZmZXIuCisgICAgLy8gIElmIHRoZSBwaGFzZSBvZmZzZXQgPT0gMCB0aGVuIGFsbCB0aGUgbXVsdGlwbGljYXRpb24KKyAgICAvLyAgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHRoZSBvdXRwdXQgZXF1YWxsaW5nIHRoZSBpbnB1dC4KKyAgICAvLyAgU28gaW5zdGVhZCBwb2ludCB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byB0aGUgaW5wdXQuCisgICAgLy8gIEFsc28gaGFuZGxlIHRoZSBib3VuZHJ5IGNvbmRpdGlvbiBvZiBub3QgYmVpbmcgYWJsZSB0bworICAgIC8vICBmaWx0ZXIgdGhhdCBsYXN0IGxpbmVzLgorICAgIGlmIChwaGFzZV9vZmZzZXRfaCAmJiAobGggPCBpbl9oZWlnaHQgLSAyKSkgeworICAgICAgaGJ1ZiA9IGdfYl9zY2FsZXIuaGJ1ZjsKKworICAgICAgZm9yICh3ID0gMDsgdyA8IGluX3dpZHRoOyB3KyspIHsKKyAgICAgICAgdGVtcF9zdW0gPSAgY19oW3BoYXNlX29mZnNldF9oICogNCArIDNdICogaXBbdyAtIGluX3N0cmlkZV07CisgICAgICAgIHRlbXBfc3VtICs9IGNfaFtwaGFzZV9vZmZzZXRfaCAqIDQgKyAyXSAqIGlwW3ddOworICAgICAgICB0ZW1wX3N1bSArPSBjX2hbcGhhc2Vfb2Zmc2V0X2ggKiA0ICsgMV0gKiBpcFt3ICsgaW5fc3RyaWRlXTsKKyAgICAgICAgdGVtcF9zdW0gKz0gY19oW3BoYXNlX29mZnNldF9oICogNF0gICAqIGlwW3cgKyAyICogaW5fc3RyaWRlXTsKKworICAgICAgICBoYnVmW3ddID0gdGVtcF9zdW0gPj4gMTI7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBoYnVmID0gaXA7CisKKyAgICAvLyBpbmNyZWFzZSB0aGUgcGhhc2Ugb2Zmc2V0IGZvciB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KKyAgICBpZiAoKytwaGFzZV9vZmZzZXRfaCA+PSBnX2Jfc2NhbGVyLm5oKQorICAgICAgcGhhc2Vfb2Zmc2V0X2ggPSAwOworCisgICAgLy8gbm93IGZpbHRlciBhbmQgZXhwYW5kIGl0IGhvcml6b250YWxseSBpbnRvIHRoZSBmaW5hbAorICAgIC8vICBvdXRwdXQgYnVmZmVyCisgICAgcGhhc2Vfb2Zmc2V0X3cgPSAwOworCisgICAgZm9yICh3ID0gMDsgdyA8IG91dF93aWR0aDsgdysrKSB7CisgICAgICAvLyBnZXQgdGhlIGluZGV4IHRvIHVzZSB0byBleHBhbmQgdGhlIGltYWdlCisgICAgICBsdyA9IGxfd1t3XTsKKworICAgICAgdGVtcF9zdW0gPSAgY193W3BoYXNlX29mZnNldF93ICogNF0gICAqIGhidWZbbHcgLSAxXTsKKyAgICAgIHRlbXBfc3VtICs9IGNfd1twaGFzZV9vZmZzZXRfdyAqIDQgKyAxXSAqIGhidWZbbHddOworICAgICAgdGVtcF9zdW0gKz0gY193W3BoYXNlX29mZnNldF93ICogNCArIDJdICogaGJ1ZltsdyArIDFdOworICAgICAgdGVtcF9zdW0gKz0gY193W3BoYXNlX29mZnNldF93ICogNCArIDNdICogaGJ1ZltsdyArIDJdOworICAgICAgdGVtcF9zdW0gPSB0ZW1wX3N1bSA+PiAxMjsKKworICAgICAgaWYgKCsrcGhhc2Vfb2Zmc2V0X3cgPj0gZ19iX3NjYWxlci5udykKKyAgICAgICAgcGhhc2Vfb2Zmc2V0X3cgPSAwOworCisgICAgICAvLyBib3VuZHJ5IGNvbmRpdGlvbnMKKyAgICAgIGlmICgobHcgKyAyKSA+PSBpbl93aWR0aCkKKyAgICAgICAgdGVtcF9zdW0gPSBoYnVmW2x3XTsKKworICAgICAgaWYgKGx3ID09IDApCisgICAgICAgIHRlbXBfc3VtID0gaGJ1ZlswXTsKKworICAgICAgb3Bbd10gPSB0ZW1wX3N1bTsKKyAgICB9CisKKyAgICBvcCArPSBvdXRfc3RyaWRlOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmljdWJpY19zY2FsZV9mcmFtZV9yZXNldCgpIHsKKyAgZ19iX3NjYWxlci5vdXRfd2lkdGggPSAwOworICBnX2Jfc2NhbGVyLm91dF9oZWlnaHQgPSAwOworfQorCit2b2lkIGJpY3ViaWNfc2NhbGVfZnJhbWUoWVYxMl9CVUZGRVJfQ09ORklHICpzcmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfd2lkdGgsIGludCBuZXdfaGVpZ2h0KSB7CisKKyAgZHN0LT55X3dpZHRoID0gbmV3X3dpZHRoOworICBkc3QtPnlfaGVpZ2h0ID0gbmV3X2hlaWdodDsKKyAgZHN0LT51dl93aWR0aCA9IG5ld193aWR0aCAvIDI7CisgIGRzdC0+dXZfaGVpZ2h0ID0gbmV3X2hlaWdodCAvIDI7CisKKyAgZHN0LT55X3N0cmlkZSA9IGRzdC0+eV93aWR0aDsKKyAgZHN0LT51dl9zdHJpZGUgPSBkc3QtPnV2X3dpZHRoOworCisgIGJpY3ViaWNfc2NhbGUoc3JjLT55X3dpZHRoLCBzcmMtPnlfaGVpZ2h0LCBzcmMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgIG5ld193aWR0aCwgbmV3X2hlaWdodCwgZHN0LT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICBzcmMtPnlfYnVmZmVyLCBkc3QtPnlfYnVmZmVyKTsKKworICBiaWN1YmljX3NjYWxlKHNyYy0+dXZfd2lkdGgsIHNyYy0+dXZfaGVpZ2h0LCBzcmMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICBuZXdfd2lkdGggLyAyLCBuZXdfaGVpZ2h0IC8gMiwgZHN0LT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgc3JjLT51X2J1ZmZlciwgZHN0LT51X2J1ZmZlcik7CisKKyAgYmljdWJpY19zY2FsZShzcmMtPnV2X3dpZHRoLCBzcmMtPnV2X2hlaWdodCwgc3JjLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgbmV3X3dpZHRoIC8gMiwgbmV3X2hlaWdodCAvIDIsIGRzdC0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgIHNyYy0+dl9idWZmZXIsIGRzdC0+dl9idWZmZXIpOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL2dlbl9zY2FsZXJzLmMgYi9saWJ2cHgvdnB4X3NjYWxlL2dlbmVyaWMvZ2VuX3NjYWxlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGMyMWZiCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL2dlbl9zY2FsZXJzLmMKQEAgLTAsMCArMSw5MjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisjaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSW1wb3J0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bworICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDQgdG8gNS4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOworCisgICh2b2lkKSBkZXN0X3dpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2Vfd2lkdGggLSA0OyBpICs9IDQpIHsKKyAgICBhID0gc3JjWzBdOworICAgIGIgPSBzcmNbMV07CisgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKSBhOworICAgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoKGEgKiA1MSArIDIwNSAqIGIgKyAxMjgpID4+IDgpOworICAgIGMgPSBzcmNbMl0gKiAxNTQ7CisgICAgYSA9IHNyY1szXTsKKyAgICBkZXMgWzJdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMTAyICsgYyArIDEyOCkgPj4gOCk7CisgICAgZGVzIFszXSA9ICh1bnNpZ25lZCBjaGFyKSgoYyArIDEwMiAqIGEgKyAxMjgpID4+IDgpOworICAgIGIgPSBzcmNbNF07CisgICAgZGVzIFs0XSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDIwNSArIDUxICogYiArIDEyOCkgPj4gOCk7CisKKyAgICBzcmMgKz0gNDsKKyAgICBkZXMgKz0gNTsKKyAgfQorCisgIGEgPSBzcmNbMF07CisgIGIgPSBzcmNbMV07CisgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7CisgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoKGEgKiA1MSArIDIwNSAqIGIgKyAxMjgpID4+IDgpOworICBjID0gc3JjWzJdICogMTU0OworICBhID0gc3JjWzNdOworICBkZXMgWzJdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMTAyICsgYyArIDEyOCkgPj4gOCk7CisgIGRlcyBbM10gPSAodW5zaWduZWQgY2hhcikoKGMgKyAxMDIgKiBhICsgMTI4KSA+PiA4KTsKKyAgZGVzIFs0XSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDogV2lkdGggb2YgZGVzdGluYXRpb24gZGF0YS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBTY2FsZXMgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgNCB0byA1LiBUaGUKKyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyA0LXBpeGVscy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIHVzZXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJhbmQgYmVsb3cKKyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYywgZDsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKSB7CisgICAgYSA9IGRlcyBbMF07CisgICAgYiA9IGRlcyBbZGVzdF9waXRjaF07CisKKyAgICBkZXNbZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikoKGEgKiA1MSArIDIwNSAqIGIgKyAxMjgpID4+IDgpOworCisgICAgYyA9IGRlc1tkZXN0X3BpdGNoICogMl0gKiAxNTQ7CisgICAgZCA9IGRlc1tkZXN0X3BpdGNoICogM107CisKKyAgICBkZXMgW2Rlc3RfcGl0Y2ggKiAyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDEwMiArIGMgKyAxMjgpID4+IDgpOworICAgIGRlcyBbZGVzdF9waXRjaCAqIDNdID0gKHVuc2lnbmVkIGNoYXIpKChjICsgMTAyICogZCArIDEyOCkgPj4gOCk7CisKKyAgICAvKiBGaXJzdCBsaW5lIGluIG5leHQgYmFuZCAqLworICAgIGEgPSBkZXMgW2Rlc3RfcGl0Y2ggKiA1XTsKKyAgICBkZXMgW2Rlc3RfcGl0Y2ggKiA0XSA9ICh1bnNpZ25lZCBjaGFyKSgoZCAqIDIwNSArIDUxICogYSArIDEyOCkgPj4gOCk7CisKKyAgICBkZXMrKzsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYworICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2ggOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyBsYXN0IHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDQgdG8gNS4gVGhlCisgKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgNC1waXhlbHMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSBkb2VzIG5vdCBoYXZlIGF2YWlsYWJsZSB0aGUgZmlyc3QgbGluZSBvZgorICogICAgICAgICAgICAgICAgICB0aGUgYmFuZCBiZWxvdyB0aGUgY3VycmVudCBiYW5kLCBzaW5jZSB0aGlzIGlzIHRoZQorICogICAgICAgICAgICAgICAgICBsYXN0IGJhbmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGIsIGMsIGQ7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkgeworICAgIGEgPSBkZXNbMF07CisgICAgYiA9IGRlc1tkZXN0X3BpdGNoXTsKKworICAgIGRlc1tkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDUxICsgMjA1ICogYiArIDEyOCkgPj4gOCk7CisKKyAgICBjID0gZGVzW2Rlc3RfcGl0Y2ggKiAyXSAqIDE1NDsKKyAgICBkID0gZGVzW2Rlc3RfcGl0Y2ggKiAzXTsKKworICAgIGRlcyBbZGVzdF9waXRjaCAqIDJdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMTAyICsgYyArIDEyOCkgPj4gOCk7CisgICAgZGVzIFtkZXN0X3BpdGNoICogM10gPSAodW5zaWduZWQgY2hhcikoKGMgKyAxMDIgKiBkICsgMTI4KSA+PiA4KTsKKworICAgIC8qIE5vIG90aGVyIGxpbmUgZm9yIGludGVycGxhdGlvbiBvZiB0aGlzIGxpbmUsIHNvIC4uICovCisgICAgZGVzW2Rlc3RfcGl0Y2ggKiA0XSA9ICh1bnNpZ25lZCBjaGFyKSBkOworCisgICAgZGVzKys7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bworICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDIgdG8gMy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBhLCBiLCBjOworICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2U7CisKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aCAtIDI7IGkgKz0gMikgeworICAgIGEgPSBzcmNbMF07CisgICAgYiA9IHNyY1sxXTsKKyAgICBjID0gc3JjWzJdOworCisgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKKyAgICBkZXMgWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhICogODUgKyAxNzEgKiBiICsgMTI4KSA+PiA4KTsKKyAgICBkZXMgWzJdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMTcxICsgODUgKiBjICsgMTI4KSA+PiA4KTsKKworICAgIHNyYyArPSAyOworICAgIGRlcyArPSAzOworICB9CisKKyAgYSA9IHNyY1swXTsKKyAgYiA9IHNyY1sxXTsKKyAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKKyAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDg1ICsgMTcxICogYiArIDEyOCkgPj4gOCk7CisgIGRlcyBbMl0gPSAodW5zaWduZWQgY2hhcikoYik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCisgKgorICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDIgdG8gMy4gVGhlCisgKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgMi1waXhlbHMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93CisgKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGIsIGM7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7IGkrKykgeworICAgIGEgPSBkZXMgWzBdOworICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2hdOworICAgIGMgPSBkZXNbZGVzdF9waXRjaCAqIDNdOworICAgIGRlcyBbZGVzdF9waXRjaCAgXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDg1ICsgMTcxICogYiArIDEyOCkgPj4gOCk7CisgICAgZGVzIFtkZXN0X3BpdGNoICogMl0gPSAodW5zaWduZWQgY2hhcikoKGIgKiAxNzEgKyA4NSAqIGMgKyAxMjgpID4+IDgpOworCisgICAgZGVzKys7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDogV2lkdGggb2YgZGVzdGluYXRpb24gZGF0YS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBTY2FsZXMgbGFzdCB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSAyIHRvIDMuIFRoZQorICogICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGJhbmQgc2NhbGVkIGlzIDItcGl4ZWxzLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSBhdmFpbGFibGUgdGhlIGZpcnN0IGxpbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgdGhlIGJhbmQgYmVsb3cgdGhlIGN1cnJlbnQgYmFuZCwgc2luY2UgdGhpcyBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgbGFzdCBiYW5kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBhLCBiOworICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OworCisgIGZvciAoaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyArK2kpIHsKKyAgICBhID0gZGVzIFswXTsKKyAgICBiID0gZGVzIFtkZXN0X3BpdGNoXTsKKworICAgIGRlcyBbZGVzdF9waXRjaCAgXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDg1ICsgMTcxICogYiArIDEyOCkgPj4gOCk7CisgICAgZGVzIFtkZXN0X3BpdGNoICogMl0gPSAodW5zaWduZWQgY2hhcikoYik7CisgICAgZGVzKys7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bworICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDMgdG8gNS4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBhLCBiLCBjOworICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2U7CisKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aCAtIDM7IGkgKz0gMykgeworICAgIGEgPSBzcmNbMF07CisgICAgYiA9IHNyY1sxXTsKKyAgICBkZXMgWzBdID0gKHVuc2lnbmVkIGNoYXIpKGEpOworICAgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoKGEgKiAxMDIgKyAxNTQgKiBiICsgMTI4KSA+PiA4KTsKKworICAgIGMgPSBzcmNbMl07CisgICAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDIwNSArIGMgKiA1MSArIDEyOCkgPj4gOCk7CisgICAgZGVzIFszXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDUxICsgYyAqIDIwNSArIDEyOCkgPj4gOCk7CisKKyAgICBhID0gc3JjWzNdOworICAgIGRlcyBbNF0gPSAodW5zaWduZWQgY2hhcikoKGMgKiAxNTQgKyBhICogMTAyICsgMTI4KSA+PiA4KTsKKworICAgIHNyYyArPSAzOworICAgIGRlcyArPSA1OworICB9CisKKyAgYSA9IHNyY1swXTsKKyAgYiA9IHNyY1sxXTsKKyAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKKworICBkZXMgWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhICogMTAyICsgMTU0ICogYiArIDEyOCkgPj4gOCk7CisgIGMgPSBzcmNbMl07CisgIGRlcyBbMl0gPSAodW5zaWduZWQgY2hhcikoKGIgKiAyMDUgKyBjICogNTEgKyAxMjgpID4+IDgpOworICBkZXMgWzNdID0gKHVuc2lnbmVkIGNoYXIpKChiICogNTEgKyBjICogMjA1ICsgMTI4KSA+PiA4KTsKKworICBkZXMgWzRdID0gKHVuc2lnbmVkIGNoYXIpKGMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDogV2lkdGggb2YgZGVzdGluYXRpb24gZGF0YS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBTY2FsZXMgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMyB0byA1LiBUaGUKKyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAzLXBpeGVscy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIHVzZXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJhbmQgYmVsb3cKKyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKSB7CisgICAgYSA9IGRlcyBbMF07CisgICAgYiA9IGRlcyBbZGVzdF9waXRjaF07CisgICAgZGVzIFtkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDEwMiArIDE1NCAqIGIgKyAxMjgpID4+IDgpOworCisgICAgYyA9IGRlc1tkZXN0X3BpdGNoICogMl07CisgICAgZGVzIFtkZXN0X3BpdGNoICogMl0gPSAodW5zaWduZWQgY2hhcikoKGIgKiAyMDUgKyBjICogNTEgKyAxMjgpID4+IDgpOworICAgIGRlcyBbZGVzdF9waXRjaCAqIDNdID0gKHVuc2lnbmVkIGNoYXIpKChiICogNTEgKyBjICogMjA1ICsgMTI4KSA+PiA4KTsKKworICAgIC8qIEZpcnN0IGxpbmUgaW4gbmV4dCBiYW5kLi4uICovCisgICAgYSA9IGRlcyBbZGVzdF9waXRjaCAqIDVdOworICAgIGRlcyBbZGVzdF9waXRjaCAqIDRdID0gKHVuc2lnbmVkIGNoYXIpKChjICogMTU0ICsgYSAqIDEwMiArIDEyOCkgPj4gOCk7CisKKyAgICBkZXMrKzsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYworICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2ggOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyBsYXN0IHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDMgdG8gNS4gVGhlCisgKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgMy1waXhlbHMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSBkb2VzIG5vdCBoYXZlIGF2YWlsYWJsZSB0aGUgZmlyc3QgbGluZSBvZgorICogICAgICAgICAgICAgICAgICB0aGUgYmFuZCBiZWxvdyB0aGUgY3VycmVudCBiYW5kLCBzaW5jZSB0aGlzIGlzIHRoZQorICogICAgICAgICAgICAgICAgICBsYXN0IGJhbmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGIsIGM7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkgeworICAgIGEgPSBkZXMgWzBdOworICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2hdOworCisgICAgZGVzIFsgZGVzdF9waXRjaCBdID0gKHVuc2lnbmVkIGNoYXIpKChhICogMTAyICsgMTU0ICogYiArIDEyOCkgPj4gOCk7CisKKyAgICBjID0gZGVzW2Rlc3RfcGl0Y2ggKiAyXTsKKyAgICBkZXMgW2Rlc3RfcGl0Y2ggKiAyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDIwNSArIGMgKiA1MSArIDEyOCkgPj4gOCk7CisgICAgZGVzIFtkZXN0X3BpdGNoICogM10gPSAodW5zaWduZWQgY2hhcikoKGIgKiA1MSArIGMgKiAyMDUgKyAxMjgpID4+IDgpOworCisgICAgLyogTm8gb3RoZXIgbGluZSBmb3IgaW50ZXJwbGF0aW9uIG9mIHRoaXMgbGluZSwgc28gLi4gKi8KKyAgICBkZXMgWyBkZXN0X3BpdGNoICogNCBdID0gKHVuc2lnbmVkIGNoYXIpKGMpOworCisgICAgZGVzKys7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bworICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDMgdG8gNC4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBhLCBiLCBjOworICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2U7CisKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aCAtIDM7IGkgKz0gMykgeworICAgIGEgPSBzcmNbMF07CisgICAgYiA9IHNyY1sxXTsKKyAgICBkZXMgWzBdID0gKHVuc2lnbmVkIGNoYXIpKGEpOworICAgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoKGEgKiA2NCArIGIgKiAxOTIgKyAxMjgpID4+IDgpOworCisgICAgYyA9IHNyY1syXTsKKyAgICBkZXMgWzJdID0gKHVuc2lnbmVkIGNoYXIpKChiICsgYyArIDEpID4+IDEpOworCisgICAgYSA9IHNyY1szXTsKKyAgICBkZXMgWzNdID0gKHVuc2lnbmVkIGNoYXIpKChjICogMTkyICsgYSAqIDY0ICsgMTI4KSA+PiA4KTsKKworICAgIHNyYyArPSAzOworICAgIGRlcyArPSA0OworICB9CisKKyAgYSA9IHNyY1swXTsKKyAgYiA9IHNyY1sxXTsKKyAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKKyAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDY0ICsgYiAqIDE5MiArIDEyOCkgPj4gOCk7CisKKyAgYyA9IHNyY1syXTsKKyAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiArIGMgKyAxKSA+PiAxKTsKKyAgZGVzIFszXSA9ICh1bnNpZ25lZCBjaGFyKShjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCisgKgorICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDMgdG8gNC4gVGhlCisgKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgMy1waXhlbHMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93CisgKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGIsIGM7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7IGkrKykgeworICAgIGEgPSBkZXMgWzBdOworICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2hdOworICAgIGRlcyBbZGVzdF9waXRjaF0gICA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDY0ICsgYiAqIDE5MiArIDEyOCkgPj4gOCk7CisKKyAgICBjID0gZGVzW2Rlc3RfcGl0Y2ggKiAyXTsKKyAgICBkZXMgW2Rlc3RfcGl0Y2ggKiAyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiArIGMgKyAxKSA+PiAxKTsKKworICAgIC8qIEZpcnN0IGxpbmUgaW4gbmV4dCBiYW5kLi4uICovCisgICAgYSA9IGRlcyBbZGVzdF9waXRjaCAqIDRdOworICAgIGRlcyBbZGVzdF9waXRjaCAqIDNdID0gKHVuc2lnbmVkIGNoYXIpKChjICogMTkyICsgYSAqIDY0ICsgMTI4KSA+PiA4KTsKKworICAgIGRlcysrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCisgKgorICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIGxhc3QgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMyB0byA0LiBUaGUKKyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAzLXBpeGVscy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIGRvZXMgbm90IGhhdmUgYXZhaWxhYmxlIHRoZSBmaXJzdCBsaW5lIG9mCisgKiAgICAgICAgICAgICAgICAgIHRoZSBiYW5kIGJlbG93IHRoZSBjdXJyZW50IGJhbmQsIHNpbmNlIHRoaXMgaXMgdGhlCisgKiAgICAgICAgICAgICAgICAgIGxhc3QgYmFuZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgKytpKSB7CisgICAgYSA9IGRlcyBbMF07CisgICAgYiA9IGRlcyBbZGVzdF9waXRjaF07CisKKyAgICBkZXMgW2Rlc3RfcGl0Y2hdICAgPSAodW5zaWduZWQgY2hhcikoKGEgKiA2NCArIGIgKiAxOTIgKyAxMjgpID4+IDgpOworCisgICAgYyA9IGRlc1tkZXN0X3BpdGNoICogMl07CisgICAgZGVzIFtkZXN0X3BpdGNoICogMl0gPSAodW5zaWduZWQgY2hhcikoKGIgKyBjICsgMSkgPj4gMSk7CisKKyAgICAvKiBObyBvdGhlciBsaW5lIGZvciBpbnRlcnBsYXRpb24gb2YgdGhpcyBsaW5lLCBzbyAuLiAqLworICAgIGRlcyBbZGVzdF9waXRjaCAqIDNdID0gKHVuc2lnbmVkIGNoYXIpKGMpOworCisgICAgZGVzKys7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bworICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDEgdG8gMi4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGI7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKKworICAodm9pZCkgZGVzdF93aWR0aDsKKworICBmb3IgKGkgPSAwOyBpIDwgc291cmNlX3dpZHRoIC0gMTsgaSArPSAxKSB7CisgICAgYSA9IHNyY1swXTsKKyAgICBiID0gc3JjWzFdOworICAgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7CisgICAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSArIGIgKyAxKSA+PiAxKTsKKyAgICBzcmMgKz0gMTsKKyAgICBkZXMgKz0gMjsKKyAgfQorCisgIGEgPSBzcmNbMF07CisgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7CisgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoYSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYworICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2ggOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSAxIHRvIDIuIFRoZQorICogICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGJhbmQgc2NhbGVkIGlzIDEtcGl4ZWwuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93CisgKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGI7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7IGkrKykgeworICAgIGEgPSBkZXMgWzBdOworICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2ggKiAyXTsKKworICAgIGRlc1tkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSArIGIgKyAxKSA+PiAxKTsKKworICAgIGRlcysrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCisgKgorICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIGxhc3QgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMSB0byAyLiBUaGUKKyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAxLXBpeGVsLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSBhdmFpbGFibGUgdGhlIGZpcnN0IGxpbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgdGhlIGJhbmQgYmVsb3cgdGhlIGN1cnJlbnQgYmFuZCwgc2luY2UgdGhpcyBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgbGFzdCBiYW5kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkgeworICAgIGRlc1tkZXN0X3BpdGNoXSA9IGRlc1swXTsKKyAgICBkZXMrKzsKKyAgfQorfQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9jCisgKgorICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDogU3RyaWRlIG9mIHNvdXJjZS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gc2NhbGluZyB1cCBieSA0IHRvIDUuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaTsKKyAgdW5zaWduZWQgaW50IGEsIGIsIGMsIGQsIGU7CisgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKKworICAodm9pZCkgZGVzdF93aWR0aDsKKworICBmb3IgKGkgPSAwOyBpIDwgc291cmNlX3dpZHRoOyBpICs9IDUpIHsKKyAgICBhID0gc3JjWzBdOworICAgIGIgPSBzcmNbMV07CisgICAgYyA9IHNyY1syXTsKKyAgICBkID0gc3JjWzNdOworICAgIGUgPSBzcmNbNF07CisKKyAgICBkZXNbMF0gPSAodW5zaWduZWQgY2hhcikgYTsKKyAgICBkZXNbMV0gPSAodW5zaWduZWQgY2hhcikoKGIgKiAxOTIgKyBjICogNjQgKyAxMjgpID4+IDgpOworICAgIGRlc1syXSA9ICh1bnNpZ25lZCBjaGFyKSgoYyAqIDEyOCArIGQgKiAxMjggKyAxMjgpID4+IDgpOworICAgIGRlc1szXSA9ICh1bnNpZ25lZCBjaGFyKSgoZCAqIDY0ICsgZSAqIDE5MiArIDEyOCkgPj4gOCk7CisKKyAgICBzcmMgKz0gNTsKKyAgICBkZXMgKz0gNDsKKyAgfQorfQorCisKKworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYywgZCwgZTsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKyAgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOworCisgIGZvciAoaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpKyspIHsKKworICAgIGEgPSBzcmNbMCAqIHNyY19waXRjaF07CisgICAgYiA9IHNyY1sxICogc3JjX3BpdGNoXTsKKyAgICBjID0gc3JjWzIgKiBzcmNfcGl0Y2hdOworICAgIGQgPSBzcmNbMyAqIHNyY19waXRjaF07CisgICAgZSA9IHNyY1s0ICogc3JjX3BpdGNoXTsKKworICAgIGRlc1swICogZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikgYTsKKyAgICBkZXNbMSAqIGRlc3RfcGl0Y2hdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMTkyICsgYyAqIDY0ICsgMTI4KSA+PiA4KTsKKyAgICBkZXNbMiAqIGRlc3RfcGl0Y2hdID0gKHVuc2lnbmVkIGNoYXIpKChjICogMTI4ICsgZCAqIDEyOCArIDEyOCkgPj4gOCk7CisgICAgZGVzWzMgKiBkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoZCAqIDY0ICsgZSAqIDE5MiArIDEyOCkgPj4gOCk7CisKKyAgICBzcmMrKzsKKyAgICBkZXMrKzsKKworICB9Cit9CisKKworLyo3KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jCisgKgorICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDogU3RyaWRlIG9mIHNvdXJjZS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gc2NhbGluZyB1cCBieSAzIHRvIDUuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYywgZCwgZTsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOworCisgICh2b2lkKSBkZXN0X3dpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2Vfd2lkdGg7IGkgKz0gNSkgeworICAgIGEgPSBzcmNbMF07CisgICAgYiA9IHNyY1sxXTsKKyAgICBjID0gc3JjWzJdOworICAgIGQgPSBzcmNbM107CisgICAgZSA9IHNyY1s0XTsKKworICAgIGRlc1swXSA9ICh1bnNpZ25lZCBjaGFyKSBhOworICAgIGRlc1sxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDg1ICArIGMgKiAxNzEgKyAxMjgpID4+IDgpOworICAgIGRlc1syXSA9ICh1bnNpZ25lZCBjaGFyKSgoZCAqIDE3MSArIGUgKiA4NSArIDEyOCkgPj4gOCk7CisKKyAgICBzcmMgKz0gNTsKKyAgICBkZXMgKz0gMzsKKyAgfQorCit9CisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkLCBlOworICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OworICB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2U7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7IGkrKykgeworCisgICAgYSA9IHNyY1swICogc3JjX3BpdGNoXTsKKyAgICBiID0gc3JjWzEgKiBzcmNfcGl0Y2hdOworICAgIGMgPSBzcmNbMiAqIHNyY19waXRjaF07CisgICAgZCA9IHNyY1szICogc3JjX3BpdGNoXTsKKyAgICBlID0gc3JjWzQgKiBzcmNfcGl0Y2hdOworCisgICAgZGVzWzAgKiBkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSBhOworICAgIGRlc1sxICogZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikoKGIgKiA4NSArIGMgKiAxNzEgKyAxMjgpID4+IDgpOworICAgIGRlc1syICogZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikoKGQgKiAxNzEgKyBlICogODUgKyAxMjgpID4+IDgpOworCisgICAgc3JjKys7CisgICAgZGVzKys7CisKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYworICoKKyAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6IFN0cmlkZSBvZiBzb3VyY2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiAoTk9UIFVTRUQpLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzIGZyb20gc291cmNlIHRvCisgKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNjYWxpbmcgdXAgYnkgMSB0byAyLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgYTsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOworCisgICh2b2lkKSBkZXN0X3dpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2Vfd2lkdGg7IGkgKz0gMikgeworICAgIGEgPSBzcmNbMF07CisgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKKyAgICBzcmMgKz0gMjsKKyAgICBkZXMgKz0gMTsKKyAgfQorfQorCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgICh2b2lkKSBkZXN0X3BpdGNoOworICAodm9pZCkgc3JjX3BpdGNoOworICB2cHhfbWVtY3B5KGRlc3QsIHNvdXJjZSwgZGVzdF93aWR0aCk7Cit9CisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisgIGludCBpOworICBpbnQgdGVtcDsKKyAgaW50IHdpZHRoID0gZGVzdF93aWR0aDsKKworICAodm9pZCkgZGVzdF9waXRjaDsKKworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgIHRlbXAgPSA4OworICAgIHRlbXAgKz0gc291cmNlW2kgLSAoaW50KXNyY19waXRjaF0gKiAzOworICAgIHRlbXAgKz0gc291cmNlW2ldICogMTA7CisgICAgdGVtcCArPSBzb3VyY2VbaSArIHNyY19waXRjaF0gKiAzOworICAgIHRlbXAgPj49IDQ7CisgICAgZGVzdFtpXSA9ICh1bnNpZ25lZCBjaGFyKSh0ZW1wKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL3ZweHNjYWxlLmMgYi9saWJ2cHgvdnB4X3NjYWxlL2dlbmVyaWMvdnB4c2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU4NWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL3ZweHNjYWxlLmMKQEAgLTAsMCArMSwxMDEwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgIE1vZHVsZSBUaXRsZSA6ICAgICBzY2FsZS5jCisgKgorICogICBEZXNjcmlwdGlvbiAgOiAgICAgSW1hZ2Ugc2NhbGluZyBmdW5jdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEhlYWRlciBGaWxlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICIuL3ZweF9ydGNkLmgiCisjaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCisjaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKKyNpbmNsdWRlICJ2cHhfc2NhbGUvc2NhbGVfbW9kZS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCAgICAgZXhwYW5kZWRfZnJhbWVfd2lkdGg7CisgIGludCAgICAgZXhwYW5kZWRfZnJhbWVfaGVpZ2h0OworCisgIGludCBIU2NhbGU7CisgIGludCBIUmF0aW87CisgIGludCBWU2NhbGU7CisgIGludCBWUmF0aW87CisKKyAgWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeXV2X2NvbmZpZzsKKyAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeXV2X2NvbmZpZzsKKworfSBTQ0FMRV9WQVJTOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogICAgIGhvcml6b250YWxfbGluZV9jb3B5CisgKgorICogIElOUFVUUyAgICAgICAgOiAgICAgTm9uZQorICoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6ICAgICBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogICAgIE5vbmUKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6ICAgICAxIHRvIDEgc2NhbGluZyB1cCBmb3IgYSBob3Jpem9udGFsIGxpbmUgb2YgcGl4bGVzCisgKgorICogIFNQRUNJQUwgTk9URVMgOiAgICAgTm9uZS4KKyAqCisgKiAgRVJST1JTICAgICAgICA6ICAgICBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIGhvcml6b250YWxfbGluZV9jb3B5KAorICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCisgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCispIHsKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisKKyAgZHVja19tZW1jcHkoZGVzdCwgc291cmNlLCBzb3VyY2Vfd2lkdGgpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6ICAgICBudWxsX3NjYWxlCisgKgorICogIElOUFVUUyAgICAgICAgOiAgICAgTm9uZQorICoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6ICAgICBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogICAgIE5vbmUKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6ICAgICAxIHRvIDEgc2NhbGluZyB1cCBmb3IgYSB2ZXJ0aWNhbCBiYW5kCisgKgorICogIFNQRUNJQUwgTk9URVMgOiAgICAgTm9uZS4KKyAqCisgKiAgRVJST1JTICAgICAgICA6ICAgICBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIG51bGxfc2NhbGUoCisgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAorKSB7CisgICh2b2lkKSBkZXN0OworICAodm9pZCkgZGVzdF9waXRjaDsKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisKKyAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogc2NhbGUxZF8ydDFfaQorICoKKyAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBkYXRhIHRvIGJlIHNjYWxlZC4KKyAqICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9zdGVwICAgICAgICAgICAgICA6IE51bWJlciBvZiBwaXhlbHMgdG8gc3RlcCBvbiBpbiBzb3VyY2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfc2NhbGUgICAgOiBTY2FsZSBmb3Igc291cmNlIChVTlVTRUQpLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX2xlbmd0aCAgIDogTGVuZ3RoIG9mIHNvdXJjZSAoVU5VU0VEKS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBvdXRwdXQgZGF0YSBhcnJheS4KKyAqICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfc3RlcCAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBwaXhlbHMgdG8gc3RlcCBvbiBpbiBkZXN0aW5hdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfc2NhbGUgICAgICA6IFNjYWxlIGZvciBkZXN0aW5hdGlvbiAoVU5VU0VEKS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfbGVuZ3RoICAgICA6IExlbmd0aCBvZiBkZXN0aW5hdGlvbi4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBQZXJmb3JtcyAyLXRvLTEgaW50ZXJwb2xhdGVkIHNjYWxpbmcuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIHNjYWxlMWRfMnQxX2kKKygKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICBpbnQgc291cmNlX3N0ZXAsCisgIHVuc2lnbmVkIGludCBzb3VyY2Vfc2NhbGUsCisgIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoLAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICBpbnQgZGVzdF9zdGVwLAorICB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSwKKyAgdW5zaWduZWQgaW50IGRlc3RfbGVuZ3RoCispIHsKKyAgdW5zaWduZWQgaW50IGksIGo7CisgIHVuc2lnbmVkIGludCB0ZW1wOworICBpbnQgc291cmNlX3BpdGNoID0gc291cmNlX3N0ZXA7CisgICh2b2lkKSBzb3VyY2VfbGVuZ3RoOworICAodm9pZCkgc291cmNlX3NjYWxlOworICAodm9pZCkgZGVzdF9zY2FsZTsKKworICBzb3VyY2Vfc3RlcCAqPSAyOworICBkZXN0WzBdID0gc291cmNlWzBdOworCisgIGZvciAoaSA9IGRlc3Rfc3RlcCwgaiA9IHNvdXJjZV9zdGVwOyBpIDwgZGVzdF9sZW5ndGggKiBkZXN0X3N0ZXA7IGkgKz0gZGVzdF9zdGVwLCBqICs9IHNvdXJjZV9zdGVwKSB7CisgICAgdGVtcCA9IDg7CisgICAgdGVtcCArPSAzICogc291cmNlW2ogLSBzb3VyY2VfcGl0Y2hdOworICAgIHRlbXAgKz0gMTAgKiBzb3VyY2Vbal07CisgICAgdGVtcCArPSAzICogc291cmNlW2ogKyBzb3VyY2VfcGl0Y2hdOworICAgIHRlbXAgPj49IDQ7CisgICAgZGVzdFtpXSA9IChjaGFyKSh0ZW1wKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogc2NhbGUxZF8ydDFfcHMKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gZGF0YSB0byBiZSBzY2FsZWQuCisgKiAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfc3RlcCAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHN0ZXAgb24gaW4gc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3NjYWxlICAgIDogU2NhbGUgZm9yIHNvdXJjZSAoVU5VU0VEKS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9sZW5ndGggICA6IExlbmd0aCBvZiBzb3VyY2UgKFVOVVNFRCkuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEgYXJyYXkuCisgKiAgICAgICAgICAgICAgICAgIGludCBkZXN0X3N0ZXAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHN0ZXAgb24gaW4gZGVzdGluYXRpb24uCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3NjYWxlICAgICAgOiBTY2FsZSBmb3IgZGVzdGluYXRpb24gKFVOVVNFRCkuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2xlbmd0aCAgICAgOiBMZW5ndGggb2YgZGVzdGluYXRpb24uCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogUGVyZm9ybXMgMi10by0xIHBvaW50IHN1YnNhbXBsZWQgc2NhbGluZy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgc2NhbGUxZF8ydDFfcHMKKygKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICBpbnQgc291cmNlX3N0ZXAsCisgIHVuc2lnbmVkIGludCBzb3VyY2Vfc2NhbGUsCisgIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoLAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICBpbnQgZGVzdF9zdGVwLAorICB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSwKKyAgdW5zaWduZWQgaW50IGRlc3RfbGVuZ3RoCispIHsKKyAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgKHZvaWQpIHNvdXJjZV9sZW5ndGg7CisgICh2b2lkKSBzb3VyY2Vfc2NhbGU7CisgICh2b2lkKSBkZXN0X3NjYWxlOworCisgIHNvdXJjZV9zdGVwICo9IDI7CisgIGogPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBkZXN0X2xlbmd0aCAqIGRlc3Rfc3RlcDsgaSArPSBkZXN0X3N0ZXAsIGogKz0gc291cmNlX3N0ZXApCisgICAgZGVzdFtpXSA9IHNvdXJjZVtqXTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBzY2FsZTFkX2MKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gZGF0YSB0byBiZSBzY2FsZWQuCisgKiAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfc3RlcCAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHN0ZXAgb24gaW4gc291cmNlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3NjYWxlICAgIDogU2NhbGUgZm9yIHNvdXJjZS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9sZW5ndGggICA6IExlbmd0aCBvZiBzb3VyY2UgKFVOVVNFRCkuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEgYXJyYXkuCisgKiAgICAgICAgICAgICAgICAgIGludCBkZXN0X3N0ZXAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHN0ZXAgb24gaW4gZGVzdGluYXRpb24uCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3NjYWxlICAgICAgOiBTY2FsZSBmb3IgZGVzdGluYXRpb24uCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2xlbmd0aCAgICAgOiBMZW5ndGggb2YgZGVzdGluYXRpb24uCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogUGVyZm9ybXMgbGluZWFyIGludGVycG9sYXRpb24gaW4gb25lIGRpbWVuc2lvbi4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgc2NhbGUxZF9jCisoCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgaW50IHNvdXJjZV9zdGVwLAorICB1bnNpZ25lZCBpbnQgc291cmNlX3NjYWxlLAorICB1bnNpZ25lZCBpbnQgc291cmNlX2xlbmd0aCwKKyAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgaW50IGRlc3Rfc3RlcCwKKyAgdW5zaWduZWQgaW50IGRlc3Rfc2NhbGUsCisgIHVuc2lnbmVkIGludCBkZXN0X2xlbmd0aAorKSB7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgcm91bmRfdmFsdWUgPSBkZXN0X3NjYWxlIC8gMjsKKyAgdW5zaWduZWQgaW50IGxlZnRfbW9kaWZpZXIgPSBkZXN0X3NjYWxlOworICB1bnNpZ25lZCBpbnQgcmlnaHRfbW9kaWZpZXIgPSAwOworICB1bnNpZ25lZCBjaGFyIGxlZnRfcGl4ZWwgPSAqc291cmNlOworICB1bnNpZ25lZCBjaGFyIHJpZ2h0X3BpeGVsID0gKihzb3VyY2UgKyBzb3VyY2Vfc3RlcCk7CisKKyAgKHZvaWQpIHNvdXJjZV9sZW5ndGg7CisKKyAgLyogVGhlc2UgYXNzZXJ0cyBhcmUgbmVlZGVkIGlmIHRoZXJlIGFyZSBib3VuZGFyeSBpc3N1ZXMuLi4gKi8KKyAgLyphc3NlcnQgKCBkZXN0X3NjYWxlID4gc291cmNlX3NjYWxlICk7Ki8KKyAgLyphc3NlcnQgKCAoc291cmNlX2xlbmd0aC0xKSAqIGRlc3Rfc2NhbGUgPj0gKGRlc3RfbGVuZ3RoLTEpICogc291cmNlX3NjYWxlICk7Ki8KKworICBmb3IgKGkgPSAwOyBpIDwgZGVzdF9sZW5ndGggKiBkZXN0X3N0ZXA7IGkgKz0gZGVzdF9zdGVwKSB7CisgICAgZGVzdFtpXSA9IChjaGFyKSgobGVmdF9tb2RpZmllciAqIGxlZnRfcGl4ZWwgKyByaWdodF9tb2RpZmllciAqIHJpZ2h0X3BpeGVsICsgcm91bmRfdmFsdWUpIC8gZGVzdF9zY2FsZSk7CisKKyAgICByaWdodF9tb2RpZmllciArPSBzb3VyY2Vfc2NhbGU7CisKKyAgICB3aGlsZSAocmlnaHRfbW9kaWZpZXIgPiBkZXN0X3NjYWxlKSB7CisgICAgICByaWdodF9tb2RpZmllciAtPSBkZXN0X3NjYWxlOworICAgICAgc291cmNlICs9IHNvdXJjZV9zdGVwOworICAgICAgbGVmdF9waXhlbCA9ICpzb3VyY2U7CisgICAgICByaWdodF9waXhlbCA9ICooc291cmNlICsgc291cmNlX3N0ZXApOworICAgIH0KKworICAgIGxlZnRfbW9kaWZpZXIgPSBkZXN0X3NjYWxlIC0gcmlnaHRfbW9kaWZpZXI7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IFNjYWxlMkQKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSAgOiBQb2ludGVyIHRvIGRhdGEgdG8gYmUgc2NhbGVkLgorICogICAgICAgICAgICAgICAgICBpbnQgc291cmNlX3BpdGNoICAgICAgICAgICAgICA6IFN0cmlkZSBvZiBzb3VyY2UgaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgIDogV2lkdGggb2YgaW5wdXQgaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2VfaGVpZ2h0ICAgIDogSGVpZ2h0IG9mIGlucHV0IGltYWdlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgIDogUG9pbnRlciB0byBvdXRwdXQgZGF0YSBhcnJheS4KKyAqICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2ggICAgICAgICAgICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgIDogV2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2hlaWdodCAgICAgIDogSGVpZ2h0IG9mIGRlc3RpbmF0aW9uIGltYWdlLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0ZW1wX2FyZWEgICAgICA6IFBvaW50ZXIgdG8gdGVtcCB3b3JrIGFyZWEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcF9hcmVhX2hlaWdodCA6IEhlaWdodCBvZiB0ZW1wIHdvcmsgYXJlYS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhzY2FsZSAgICAgICAgICA6IEhvcml6b250YWwgc2NhbGUgZmFjdG9yIG51bWVyYXRvci4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhyYXRpbyAgICAgICAgICA6IEhvcml6b250YWwgc2NhbGUgZmFjdG9yIGRlbm9taW5hdG9yLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdnNjYWxlICAgICAgICAgIDogVmVydGljYWwgc2NhbGUgZmFjdG9yIG51bWVyYXRvci4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZyYXRpbyAgICAgICAgICA6IFZlcnRpY2FsIHNjYWxlIGZhY3RvciBkZW5vbWluYXRvci4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGludGVybGFjZWQgICAgICA6IEludGVybGFjZSBmbGFnLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IFBlcmZvcm1zIDItdGFwIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHR3byBkaW1lbnNpb25zLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogRXhwYW5zaW9uIGlzIHBlcmZvcm1lZCBvbmUgYmFuZCBhdCBhIHRpbWUgdG8gaGVscCB3aXRoCisgKiAgICAgICAgICAgICAgICAgIGNhY2hpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgU2NhbGUyRAorKAorICAvKmNvbnN0Ki8KKyAgdW5zaWduZWQgY2hhciAqc291cmNlLAorICBpbnQgc291cmNlX3BpdGNoLAorICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICB1bnNpZ25lZCBpbnQgc291cmNlX2hlaWdodCwKKyAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgaW50IGRlc3RfcGl0Y2gsCisgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoLAorICB1bnNpZ25lZCBpbnQgZGVzdF9oZWlnaHQsCisgIHVuc2lnbmVkIGNoYXIgKnRlbXBfYXJlYSwKKyAgdW5zaWduZWQgY2hhciB0ZW1wX2FyZWFfaGVpZ2h0LAorICB1bnNpZ25lZCBpbnQgaHNjYWxlLAorICB1bnNpZ25lZCBpbnQgaHJhdGlvLAorICB1bnNpZ25lZCBpbnQgdnNjYWxlLAorICB1bnNpZ25lZCBpbnQgdnJhdGlvLAorICB1bnNpZ25lZCBpbnQgaW50ZXJsYWNlZAorKSB7CisgIC8qdW5zaWduZWQqLworICBpbnQgaSwgaiwgazsKKyAgaW50IGJhbmRzOworICBpbnQgZGVzdF9iYW5kX2hlaWdodDsKKyAgaW50IHNvdXJjZV9iYW5kX2hlaWdodDsKKworICB0eXBlZGVmIHZvaWQgKCpTY2FsZTFEKShjb25zdCB1bnNpZ25lZCBjaGFyICogc291cmNlLCBpbnQgc291cmNlX3N0ZXAsIHVuc2lnbmVkIGludCBzb3VyY2Vfc2NhbGUsIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogZGVzdCwgaW50IGRlc3Rfc3RlcCwgdW5zaWduZWQgaW50IGRlc3Rfc2NhbGUsIHVuc2lnbmVkIGludCBkZXN0X2xlbmd0aCk7CisKKyAgU2NhbGUxRCBTY2FsZTFEdiA9IHNjYWxlMWRfYzsKKyAgU2NhbGUxRCBTY2FsZTFEaCA9IHNjYWxlMWRfYzsKKworICB2b2lkICgqaG9yaXpfbGluZV9zY2FsZSkoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KSA9IE5VTEw7CisgIHZvaWQgKCp2ZXJ0X2JhbmRfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSA9IE5VTEw7CisKKyAgaW50IHJhdGlvX3NjYWxhYmxlID0gMTsKKyAgaW50IGludGVycG9sYXRpb24gPSAwOworCisgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZV9iYXNlOyAvKiA9ICh1bnNpZ25lZCBjaGFyICopICgoc291cmNlX3BpdGNoID49IDApID8gc291cmNlIDogKHNvdXJjZSArICgoc291cmNlX2hlaWdodC0xKSAqIHNvdXJjZV9waXRjaCkpKTsgKi8KKyAgdW5zaWduZWQgY2hhciAqbGluZV9zcmM7CisKKworICBzb3VyY2VfYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopc291cmNlOworCisgIGlmIChzb3VyY2VfcGl0Y2ggPCAwKSB7CisgICAgaW50IG9mZnNldDsKKworICAgIG9mZnNldCA9IChzb3VyY2VfaGVpZ2h0IC0gMSk7CisgICAgb2Zmc2V0ICo9IHNvdXJjZV9waXRjaDsKKworICAgIHNvdXJjZV9iYXNlICs9IG9mZnNldDsKKyAgfQorCisgIC8qIGZpbmQgb3V0IHRoZSByYXRpbyBmb3IgZWFjaCBkaXJlY3Rpb24gKi8KKyAgc3dpdGNoIChocmF0aW8gKiAxMCAvIGhzY2FsZSkgeworICAgIGNhc2UgODoKKyAgICAgIC8qIDQtNSBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KKyAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIC8qIDMtNSBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KKyAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIC8qIDEtMiBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KKyAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBUaGUgcmF0aW8gaXMgbm90IGFjY2VwdGFibGUgbm93ICovCisgICAgICAvKiB0aHJvdygiVGhlIHJhdGlvIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBub3chIik7ICovCisgICAgICByYXRpb19zY2FsYWJsZSA9IDA7CisgICAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAodnJhdGlvICogMTAgLyB2c2NhbGUpIHsKKyAgICBjYXNlIDg6CisgICAgICAvKiA0LTUgU2NhbGUgaW4gdmVydGljYWwgZGlyZWN0aW9uICovCisgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlOworICAgICAgc291cmNlX2JhbmRfaGVpZ2h0ICA9IDU7CisgICAgICBkZXN0X2JhbmRfaGVpZ2h0ICAgID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIC8qIDMtNSBTY2FsZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gKi8KKyAgICAgIHZlcnRfYmFuZF9zY2FsZSAgICAgPSB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGU7CisgICAgICBzb3VyY2VfYmFuZF9oZWlnaHQgID0gNTsKKyAgICAgIGRlc3RfYmFuZF9oZWlnaHQgICAgPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgLyogMS0yIFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLworCisgICAgICBpZiAoaW50ZXJsYWNlZCkgeworICAgICAgICAvKiBpZiB0aGUgY29udGVudCBpcyBpbnRlcmxhY2VkLCBwb2ludCBzYW1wbGluZyBpcyB1c2VkICovCisgICAgICAgIHZlcnRfYmFuZF9zY2FsZSAgICAgPSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGU7CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGludGVycG9sYXRpb24gPSAxOworICAgICAgICAvKiBpZiB0aGUgY29udGVudCBpcyBwcm9ncmVzc2l2ZSwgaW50ZXJwbG8gKi8KKyAgICAgICAgdmVydF9iYW5kX3NjYWxlICAgICA9IHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pOworCisgICAgICB9CisKKyAgICAgIHNvdXJjZV9iYW5kX2hlaWdodCAgPSAyOworICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogVGhlIHJhdGlvIGlzIG5vdCBhY2NlcHRhYmxlIG5vdyAqLworICAgICAgLyogdGhyb3coIlRoZSByYXRpbyBpcyBub3QgYWNjZXB0YWJsZSBmb3Igbm93ISIpOyAqLworICAgICAgcmF0aW9fc2NhbGFibGUgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocmF0aW9fc2NhbGFibGUpIHsKKyAgICBpZiAoc291cmNlX2hlaWdodCA9PSBkZXN0X2hlaWdodCkgeworICAgICAgLyogZm9yIGVhY2ggYmFuZCBvZiB0aGUgaW1hZ2UgKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCAoaW50KWRlc3RfaGVpZ2h0OyBrKyspIHsKKyAgICAgICAgaG9yaXpfbGluZV9zY2FsZShzb3VyY2UsIHNvdXJjZV93aWR0aCwgZGVzdCwgZGVzdF93aWR0aCk7CisgICAgICAgIHNvdXJjZSArPSBzb3VyY2VfcGl0Y2g7CisgICAgICAgIGRlc3QgICArPSBkZXN0X3BpdGNoOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGludGVycG9sYXRpb24pIHsKKyAgICAgIGlmIChzb3VyY2UgPCBzb3VyY2VfYmFzZSkKKyAgICAgICAgc291cmNlID0gc291cmNlX2Jhc2U7CisKKyAgICAgIGhvcml6X2xpbmVfc2NhbGUoc291cmNlLCBzb3VyY2Vfd2lkdGgsIHRlbXBfYXJlYSwgZGVzdF93aWR0aCk7CisgICAgfQorCisgICAgZm9yIChrID0gMDsgayA8IChpbnQpKGRlc3RfaGVpZ2h0ICsgZGVzdF9iYW5kX2hlaWdodCAtIDEpIC8gZGVzdF9iYW5kX2hlaWdodDsgaysrKSB7CisgICAgICAvKiBzY2FsZSBvbmUgYmFuZCBob3Jpem9udGFsbHkgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VfYmFuZF9oZWlnaHQ7IGkrKykgeworICAgICAgICAvKiBUcmFwIGNhc2Ugd2hlcmUgd2UgY291bGQgcmVhZCBvZmYgdGhlIGJhc2Ugb2YgdGhlIHNvdXJjZSBidWZmZXIgKi8KKworICAgICAgICBsaW5lX3NyYyA9ICh1bnNpZ25lZCBjaGFyICopc291cmNlICsgaSAqIHNvdXJjZV9waXRjaDsKKworICAgICAgICBpZiAobGluZV9zcmMgPCBzb3VyY2VfYmFzZSkKKyAgICAgICAgICBsaW5lX3NyYyA9IHNvdXJjZV9iYXNlOworCisgICAgICAgIGhvcml6X2xpbmVfc2NhbGUobGluZV9zcmMsIHNvdXJjZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2FyZWEgKyAoaSArIDEpKmRlc3RfcGl0Y2gsIGRlc3Rfd2lkdGgpOworICAgICAgfQorCisgICAgICAvKiBWZXJ0aWNhbCBzY2FsaW5nIGlzIGluIHBsYWNlICovCisgICAgICB2ZXJ0X2JhbmRfc2NhbGUodGVtcF9hcmVhICsgZGVzdF9waXRjaCwgZGVzdF9waXRjaCwgZGVzdCwgZGVzdF9waXRjaCwgZGVzdF93aWR0aCk7CisKKyAgICAgIGlmIChpbnRlcnBvbGF0aW9uKQorICAgICAgICB2cHhfbWVtY3B5KHRlbXBfYXJlYSwgdGVtcF9hcmVhICsgc291cmNlX2JhbmRfaGVpZ2h0ICogZGVzdF9waXRjaCwgZGVzdF93aWR0aCk7CisKKyAgICAgIC8qIE5leHQgYmFuZC4uLiAqLworICAgICAgc291cmNlICs9ICh1bnNpZ25lZCBsb25nKSBzb3VyY2VfYmFuZF9oZWlnaHQgICogc291cmNlX3BpdGNoOworICAgICAgZGVzdCAgICs9ICh1bnNpZ25lZCBsb25nKSBkZXN0X2JhbmRfaGVpZ2h0ICogZGVzdF9waXRjaDsKKyAgICB9CisKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaHNjYWxlID09IDIgJiYgaHJhdGlvID09IDEpCisgICAgU2NhbGUxRGggPSBzY2FsZTFkXzJ0MV9wczsKKworICBpZiAodnNjYWxlID09IDIgJiYgdnJhdGlvID09IDEpIHsKKyAgICBpZiAoaW50ZXJsYWNlZCkKKyAgICAgIFNjYWxlMUR2ID0gc2NhbGUxZF8ydDFfcHM7CisgICAgZWxzZQorICAgICAgU2NhbGUxRHYgPSBzY2FsZTFkXzJ0MV9pOworICB9CisKKyAgaWYgKHNvdXJjZV9oZWlnaHQgPT0gZGVzdF9oZWlnaHQpIHsKKyAgICAvKiBmb3IgZWFjaCBiYW5kIG9mIHRoZSBpbWFnZSAqLworICAgIGZvciAoayA9IDA7IGsgPCAoaW50KWRlc3RfaGVpZ2h0OyBrKyspIHsKKyAgICAgIFNjYWxlMURoKHNvdXJjZSwgMSwgaHNjYWxlLCBzb3VyY2Vfd2lkdGggKyAxLCBkZXN0LCAxLCBocmF0aW8sIGRlc3Rfd2lkdGgpOworICAgICAgc291cmNlICs9IHNvdXJjZV9waXRjaDsKKyAgICAgIGRlc3QgICArPSBkZXN0X3BpdGNoOworICAgIH0KKworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChkZXN0X2hlaWdodCA+IHNvdXJjZV9oZWlnaHQpIHsKKyAgICBkZXN0X2JhbmRfaGVpZ2h0ICAgPSB0ZW1wX2FyZWFfaGVpZ2h0IC0gMTsKKyAgICBzb3VyY2VfYmFuZF9oZWlnaHQgPSBkZXN0X2JhbmRfaGVpZ2h0ICogc291cmNlX2hlaWdodCAvIGRlc3RfaGVpZ2h0OworICB9IGVsc2UgeworICAgIHNvdXJjZV9iYW5kX2hlaWdodCA9IHRlbXBfYXJlYV9oZWlnaHQgLSAxOworICAgIGRlc3RfYmFuZF9oZWlnaHQgICA9IHNvdXJjZV9iYW5kX2hlaWdodCAqIHZyYXRpbyAvIHZzY2FsZTsKKyAgfQorCisgIC8qIGZpcnN0IHJvdyBuZWVkcyB0byBiZSBkb25lIHNvIHRoYXQgd2UgY2FuIHN0YXkgb25lIHJvdyBhaGVhZCBmb3IgdmVydGljYWwgem9vbSAqLworICBTY2FsZTFEaChzb3VyY2UsIDEsIGhzY2FsZSwgc291cmNlX3dpZHRoICsgMSwgdGVtcF9hcmVhLCAxLCBocmF0aW8sIGRlc3Rfd2lkdGgpOworCisgIC8qIGZvciBlYWNoIGJhbmQgb2YgdGhlIGltYWdlICovCisgIGJhbmRzID0gKGRlc3RfaGVpZ2h0ICsgZGVzdF9iYW5kX2hlaWdodCAtIDEpIC8gZGVzdF9iYW5kX2hlaWdodDsKKworICBmb3IgKGsgPSAwOyBrIDwgYmFuZHM7IGsrKykgeworICAgIC8qIHNjYWxlIG9uZSBiYW5kIGhvcml6b250YWxseSAqLworICAgIGZvciAoaSA9IDE7IGkgPCBzb3VyY2VfYmFuZF9oZWlnaHQgKyAxOyBpKyspIHsKKyAgICAgIGlmIChrICogc291cmNlX2JhbmRfaGVpZ2h0ICsgaSA8IChpbnQpIHNvdXJjZV9oZWlnaHQpIHsKKyAgICAgICAgU2NhbGUxRGgoc291cmNlICsgaSAqIHNvdXJjZV9waXRjaCwgMSwgaHNjYWxlLCBzb3VyY2Vfd2lkdGggKyAxLAorICAgICAgICAgICAgICAgICB0ZW1wX2FyZWEgKyBpICogZGVzdF9waXRjaCwgMSwgaHJhdGlvLCBkZXN0X3dpZHRoKTsKKyAgICAgIH0gZWxzZSB7IC8qICBEdXBsaWNhdGUgdGhlIGxhc3Qgcm93ICovCisgICAgICAgIC8qIGNvcHkgdGVtcF9hcmVhIHJvdyAwIG92ZXIgZnJvbSBsYXN0IHJvdyBpbiB0aGUgcGFzdCAqLworICAgICAgICBkdWNrX21lbWNweSh0ZW1wX2FyZWEgKyBpICogZGVzdF9waXRjaCwgdGVtcF9hcmVhICsgKGkgLSAxKSpkZXN0X3BpdGNoLCBkZXN0X3BpdGNoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzY2FsZSBvbmUgYmFuZCB2ZXJ0aWNhbGx5ICovCisgICAgZm9yIChqID0gMDsgaiA8IChpbnQpZGVzdF93aWR0aDsgaisrKSB7CisgICAgICBTY2FsZTFEdigmdGVtcF9hcmVhW2pdLCBkZXN0X3BpdGNoLCB2c2NhbGUsIHNvdXJjZV9iYW5kX2hlaWdodCArIDEsCisgICAgICAgICAgICAgICAmZGVzdFtqXSwgZGVzdF9waXRjaCwgdnJhdGlvLCBkZXN0X2JhbmRfaGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKiBjb3B5IHRlbXBfYXJlYSByb3cgMCBvdmVyIGZyb20gbGFzdCByb3cgaW4gdGhlIHBhc3QgKi8KKyAgICBkdWNrX21lbWNweSh0ZW1wX2FyZWEsIHRlbXBfYXJlYSArIHNvdXJjZV9iYW5kX2hlaWdodCAqIGRlc3RfcGl0Y2gsIGRlc3RfcGl0Y2gpOworCisgICAgLyogbW92ZSB0byB0aGUgbmV4dCBiYW5kICovCisgICAgc291cmNlICs9IHNvdXJjZV9iYW5kX2hlaWdodCAqIHNvdXJjZV9waXRjaDsKKyAgICBkZXN0ICAgKz0gZGVzdF9iYW5kX2hlaWdodCAqIGRlc3RfcGl0Y2g7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6CisgKgorICogIElOUFVUUyAgICAgICAgOiBZVjEyX0JVRkZFUl9DT05GSUcgKnNyYyAgICAgICA6IFBvaW50ZXIgdG8gZnJhbWUgdG8gYmUgc2NhbGVkLgorICogICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdCAgICAgICA6IFBvaW50ZXIgdG8gYnVmZmVyIHRvIGhvbGQgc2NhbGVkIGZyYW1lLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0ZW1wX2FyZWEgICAgICA6IFBvaW50ZXIgdG8gdGVtcCB3b3JrIGFyZWEuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcF9hcmVhX2hlaWdodCA6IEhlaWdodCBvZiB0ZW1wIHdvcmsgYXJlYS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhzY2FsZSAgICAgICAgICA6IEhvcml6b250YWwgc2NhbGUgZmFjdG9yIG51bWVyYXRvci4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhyYXRpbyAgICAgICAgICA6IEhvcml6b250YWwgc2NhbGUgZmFjdG9yIGRlbm9taW5hdG9yLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdnNjYWxlICAgICAgICAgIDogVmVydGljYWwgc2NhbGUgZmFjdG9yIG51bWVyYXRvci4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZyYXRpbyAgICAgICAgICA6IFZlcnRpY2FsIHNjYWxlIGZhY3RvciBkZW5vbWluYXRvci4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGludGVybGFjZWQgICAgICA6IEludGVybGFjZSBmbGFnLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IFBlcmZvcm1zIDItdGFwIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHR3byBkaW1lbnNpb25zLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogRXhwYW5zaW9uIGlzIHBlcmZvcm1lZCBvbmUgYmFuZCBhdCBhIHRpbWUgdG8gaGVscCB3aXRoCisgKiAgICAgICAgICAgICAgICAgIGNhY2hpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHZwOF9zY2FsZV9mcmFtZQorKAorICBZVjEyX0JVRkZFUl9DT05GSUcgKnNyYywKKyAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3QsCisgIHVuc2lnbmVkIGNoYXIgKnRlbXBfYXJlYSwKKyAgdW5zaWduZWQgY2hhciB0ZW1wX2hlaWdodCwKKyAgdW5zaWduZWQgaW50IGhzY2FsZSwKKyAgdW5zaWduZWQgaW50IGhyYXRpbywKKyAgdW5zaWduZWQgaW50IHZzY2FsZSwKKyAgdW5zaWduZWQgaW50IHZyYXRpbywKKyAgdW5zaWduZWQgaW50IGludGVybGFjZWQKKykgeworICBpbnQgaTsKKyAgaW50IGR3ID0gKGhzY2FsZSAtIDEgKyBzcmMtPnlfd2lkdGggKiBocmF0aW8pIC8gaHNjYWxlOworICBpbnQgZGggPSAodnNjYWxlIC0gMSArIHNyYy0+eV9oZWlnaHQgKiB2cmF0aW8pIC8gdnNjYWxlOworCisgIC8qIGNhbGwgb3VyIGludGVybmFsIHNjYWxpbmcgcm91dGluZXMhISAqLworICBTY2FsZTJEKCh1bnNpZ25lZCBjaGFyICopIHNyYy0+eV9idWZmZXIsIHNyYy0+eV9zdHJpZGUsIHNyYy0+eV93aWR0aCwgc3JjLT55X2hlaWdodCwKKyAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSBkc3QtPnlfYnVmZmVyLCBkc3QtPnlfc3RyaWRlLCBkdywgZGgsCisgICAgICAgICAgdGVtcF9hcmVhLCB0ZW1wX2hlaWdodCwgaHNjYWxlLCBocmF0aW8sIHZzY2FsZSwgdnJhdGlvLCBpbnRlcmxhY2VkKTsKKworICBpZiAoZHcgPCAoaW50KWRzdC0+eV93aWR0aCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGg7IGkrKykKKyAgICAgIGR1Y2tfbWVtc2V0KGRzdC0+eV9idWZmZXIgKyBpICogZHN0LT55X3N0cmlkZSArIGR3IC0gMSwgZHN0LT55X2J1ZmZlcltpICogZHN0LT55X3N0cmlkZSArIGR3IC0gMl0sIGRzdC0+eV93aWR0aCAtIGR3ICsgMSk7CisKKyAgaWYgKGRoIDwgKGludClkc3QtPnlfaGVpZ2h0KQorICAgIGZvciAoaSA9IGRoIC0gMTsgaSA8IChpbnQpZHN0LT55X2hlaWdodDsgaSsrKQorICAgICAgZHVja19tZW1jcHkoZHN0LT55X2J1ZmZlciArIGkgKiBkc3QtPnlfc3RyaWRlLCBkc3QtPnlfYnVmZmVyICsgKGRoIC0gMikgKiBkc3QtPnlfc3RyaWRlLCBkc3QtPnlfd2lkdGggKyAxKTsKKworICBTY2FsZTJEKCh1bnNpZ25lZCBjaGFyICopIHNyYy0+dV9idWZmZXIsIHNyYy0+dXZfc3RyaWRlLCBzcmMtPnV2X3dpZHRoLCBzcmMtPnV2X2hlaWdodCwKKyAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSBkc3QtPnVfYnVmZmVyLCBkc3QtPnV2X3N0cmlkZSwgZHcgLyAyLCBkaCAvIDIsCisgICAgICAgICAgdGVtcF9hcmVhLCB0ZW1wX2hlaWdodCwgaHNjYWxlLCBocmF0aW8sIHZzY2FsZSwgdnJhdGlvLCBpbnRlcmxhY2VkKTsKKworICBpZiAoZHcgLyAyIDwgKGludClkc3QtPnV2X3dpZHRoKQorICAgIGZvciAoaSA9IDA7IGkgPCBkc3QtPnV2X2hlaWdodDsgaSsrKQorICAgICAgZHVja19tZW1zZXQoZHN0LT51X2J1ZmZlciArIGkgKiBkc3QtPnV2X3N0cmlkZSArIGR3IC8gMiAtIDEsIGRzdC0+dV9idWZmZXJbaSAqIGRzdC0+dXZfc3RyaWRlICsgZHcgLyAyIC0gMl0sIGRzdC0+dXZfd2lkdGggLSBkdyAvIDIgKyAxKTsKKworICBpZiAoZGggLyAyIDwgKGludClkc3QtPnV2X2hlaWdodCkKKyAgICBmb3IgKGkgPSBkaCAvIDIgLSAxOyBpIDwgKGludClkc3QtPnlfaGVpZ2h0IC8gMjsgaSsrKQorICAgICAgZHVja19tZW1jcHkoZHN0LT51X2J1ZmZlciArIGkgKiBkc3QtPnV2X3N0cmlkZSwgZHN0LT51X2J1ZmZlciArIChkaCAvIDIgLSAyKSpkc3QtPnV2X3N0cmlkZSwgZHN0LT51dl93aWR0aCk7CisKKyAgU2NhbGUyRCgodW5zaWduZWQgY2hhciAqKSBzcmMtPnZfYnVmZmVyLCBzcmMtPnV2X3N0cmlkZSwgc3JjLT51dl93aWR0aCwgc3JjLT51dl9oZWlnaHQsCisgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgZHN0LT52X2J1ZmZlciwgZHN0LT51dl9zdHJpZGUsIGR3IC8gMiwgZGggLyAyLAorICAgICAgICAgIHRlbXBfYXJlYSwgdGVtcF9oZWlnaHQsIGhzY2FsZSwgaHJhdGlvLCB2c2NhbGUsIHZyYXRpbywgaW50ZXJsYWNlZCk7CisKKyAgaWYgKGR3IC8gMiA8IChpbnQpZHN0LT51dl93aWR0aCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0LT51dl9oZWlnaHQ7IGkrKykKKyAgICAgIGR1Y2tfbWVtc2V0KGRzdC0+dl9idWZmZXIgKyBpICogZHN0LT51dl9zdHJpZGUgKyBkdyAvIDIgLSAxLCBkc3QtPnZfYnVmZmVyW2kgKiBkc3QtPnV2X3N0cmlkZSArIGR3IC8gMiAtIDJdLCBkc3QtPnV2X3dpZHRoIC0gZHcgLyAyICsgMSk7CisKKyAgaWYgKGRoIC8gMiA8IChpbnQpIGRzdC0+dXZfaGVpZ2h0KQorICAgIGZvciAoaSA9IGRoIC8gMiAtIDE7IGkgPCAoaW50KWRzdC0+eV9oZWlnaHQgLyAyOyBpKyspCisgICAgICBkdWNrX21lbWNweShkc3QtPnZfYnVmZmVyICsgaSAqIGRzdC0+dXZfc3RyaWRlLCBkc3QtPnZfYnVmZmVyICsgKGRoIC8gMiAtIDIpKmRzdC0+dXZfc3RyaWRlLCBkc3QtPnV2X3dpZHRoKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBhbnlfcmF0aW9fMmRfc2NhbGUKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IFNDQUxFX0lOU1RBTkNFICpzaSAgICAgIDogUG9pbnRlciB0byBwb3N0LXByb2Nlc3NvciBpbnN0YW5jZSAoTk9UIFVTRUQpLgorICogICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9waXRjaCAgICA6IFN0cmlkZSBvZiBzb3VyY2UgaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBXaWR0aCBvZiBzb3VyY2UgaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2VfaGVpZ2h0ICAgOiBIZWlnaHQgb2Ygc291cmNlIGltYWdlIChOT1QgVVNFRCkuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gaW1hZ2UuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfaGVpZ2h0ICAgICA6IEhlaWdodCBvZiBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiBpbnQ6IDEgaWYgaW1hZ2Ugc2NhbGVkLCAwIGlmIGltYWdlIGNvdWxkIG5vdCBiZSBzY2FsZWQuCisgKgorICogIEZVTkNUSU9OICAgICAgOiBTY2FsZSB0aGUgaW1hZ2Ugd2l0aCBjaGFuZ2luZyBhcGVjdCByYXRpby4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoaXMgc2NhbGluZyBpcyBhIGJpLWxpbmVhciBzY2FsaW5nLiBOZWVkIHRvIHJlLXdvcmsgdGhlCisgKiAgICAgICAgICAgICAgICAgIHdob2xlIGZ1bmN0aW9uIGZvciBuZXcgc2NhbGluZyBhbGdvcml0aG0uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK2ludCBhbnlfcmF0aW9fMmRfc2NhbGUKKygKKyAgU0NBTEVfVkFSUyAqc2ksCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgaW50IHNvdXJjZV9waXRjaCwKKyAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKKyAgdW5zaWduZWQgaW50IHNvdXJjZV9oZWlnaHQsCisgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCwKKyAgdW5zaWduZWQgaW50IGRlc3RfaGVpZ2h0CispIHsKKyAgdW5zaWduZWQgaW50IGksIGs7CisgIHVuc2lnbmVkIGludCBzcmNfYmFuZF9oZWlnaHQgID0gMDsKKyAgdW5zaWduZWQgaW50IGRlc3RfYmFuZF9oZWlnaHQgPSAwOworCisgIC8qIHN1Z2dlc3RlZCBzY2FsZSBmYWN0b3JzICovCisgIGludCBocyA9IHNpLT5IU2NhbGU7CisgIGludCBociA9IHNpLT5IUmF0aW87CisgIGludCB2cyA9IHNpLT5WU2NhbGU7CisgIGludCB2ciA9IHNpLT5WUmF0aW87CisKKyAgLyogYXNzdW1lIHRoZSByYXRpb3MgYXJlIHNjYWxhYmxlIGluc3RlYWQgb2Ygc2hvdWxkIGJlIGNlbnRlcmVkICovCisgIGludCByYXRpb19zY2FsYWJsZSA9IDE7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlX2Jhc2UgPSAoKHNvdXJjZV9waXRjaCA+PSAwKSA/IHNvdXJjZSA6IChzb3VyY2UgKyAoKHNvdXJjZV9oZWlnaHQgLSAxKSAqIHNvdXJjZV9waXRjaCkpKTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqbGluZV9zcmM7CisKKyAgdm9pZCAoKmhvcml6X2xpbmVfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkgPSBOVUxMOworICB2b2lkICgqdmVydF9iYW5kX3NjYWxlKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSA9IE5VTEw7CisgIHZvaWQgKCpsYXN0X3ZlcnRfYmFuZF9zY2FsZSkodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkgPSBOVUxMOworCisgICh2b2lkKSBzaTsKKworICAvKiBmaW5kIG91dCB0aGUgcmF0aW8gZm9yIGVhY2ggZGlyZWN0aW9uICovCisgIHN3aXRjaCAoaHIgKiAzMCAvIGhzKSB7CisgICAgY2FzZSAyNDoKKyAgICAgIC8qIDQtNSBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KKyAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6CisgICAgICAvKiAzLTQgU2NhbGUgaW4gV2lkdGggZGlyZWN0aW9uICovCisgICAgICBob3Jpel9saW5lX3NjYWxlID0gdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjA6CisgICAgICAvKiA0LTUgU2NhbGUgaW4gV2lkdGggZGlyZWN0aW9uICovCisgICAgICBob3Jpel9saW5lX3NjYWxlID0gdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgLyogMy01IFNjYWxlIGluIFdpZHRoIGRpcmVjdGlvbiAqLworICAgICAgaG9yaXpfbGluZV9zY2FsZSA9IHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNToKKyAgICAgIC8qIDEtMiBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KKyAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzA6CisgICAgICAvKiBubyBzY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KKyAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSBob3Jpem9udGFsX2xpbmVfY29weTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBUaGUgcmF0aW8gaXMgbm90IGFjY2VwdGFibGUgbm93ICovCisgICAgICAvKiB0aHJvdygiVGhlIHJhdGlvIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBub3chIik7ICovCisgICAgICByYXRpb19zY2FsYWJsZSA9IDA7CisgICAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAodnIgKiAzMCAvIHZzKSB7CisgICAgY2FzZSAyNDoKKyAgICAgIC8qIDQtNSBTY2FsZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gKi8KKyAgICAgIHZlcnRfYmFuZF9zY2FsZSAgICAgPSB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGU7CisgICAgICBsYXN0X3ZlcnRfYmFuZF9zY2FsZSA9IHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlOworICAgICAgc3JjX2JhbmRfaGVpZ2h0ICAgICA9IDQ7CisgICAgICBkZXN0X2JhbmRfaGVpZ2h0ICAgID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6CisgICAgICAvKiAzLTQgU2NhbGUgaW4gdmVydGljYWwgZGlyZWN0aW9uICovCisgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlOworICAgICAgbGFzdF92ZXJ0X2JhbmRfc2NhbGUgPSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZTsKKyAgICAgIHNyY19iYW5kX2hlaWdodCAgICAgPSAzOworICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIwOgorICAgICAgLyogMi0zIFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLworICAgICAgdmVydF9iYW5kX3NjYWxlICAgICA9IHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZTsKKyAgICAgIGxhc3RfdmVydF9iYW5kX3NjYWxlID0gdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGU7CisgICAgICBzcmNfYmFuZF9oZWlnaHQgICAgID0gMjsKKyAgICAgIGRlc3RfYmFuZF9oZWlnaHQgICAgPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxODoKKyAgICAgIC8qIDMtNSBTY2FsZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gKi8KKyAgICAgIHZlcnRfYmFuZF9zY2FsZSAgICAgPSB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGU7CisgICAgICBsYXN0X3ZlcnRfYmFuZF9zY2FsZSA9IHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlOworICAgICAgc3JjX2JhbmRfaGVpZ2h0ICAgICA9IDM7CisgICAgICBkZXN0X2JhbmRfaGVpZ2h0ICAgID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICAvKiAxLTIgU2NhbGUgaW4gdmVydGljYWwgZGlyZWN0aW9uICovCisgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlOworICAgICAgbGFzdF92ZXJ0X2JhbmRfc2NhbGUgPSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZTsKKyAgICAgIHNyY19iYW5kX2hlaWdodCAgICAgPSAxOworICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMwOgorICAgICAgLyogbm8gc2NhbGUgaW4gV2lkdGggZGlyZWN0aW9uICovCisgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gbnVsbF9zY2FsZTsKKyAgICAgIGxhc3RfdmVydF9iYW5kX3NjYWxlID0gbnVsbF9zY2FsZTsKKyAgICAgIHNyY19iYW5kX2hlaWdodCAgICAgPSA0OworICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogVGhlIHJhdGlvIGlzIG5vdCBhY2NlcHRhYmxlIG5vdyAqLworICAgICAgLyogdGhyb3coIlRoZSByYXRpbyBpcyBub3QgYWNjZXB0YWJsZSBmb3Igbm93ISIpOyAqLworICAgICAgcmF0aW9fc2NhbGFibGUgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocmF0aW9fc2NhbGFibGUgPT0gMCkKKyAgICByZXR1cm4gcmF0aW9fc2NhbGFibGU7CisKKyAgaG9yaXpfbGluZV9zY2FsZShzb3VyY2UsIHNvdXJjZV93aWR0aCwgZGVzdCwgZGVzdF93aWR0aCk7CisKKyAgLyogZXhjZXB0IGxhc3QgYmFuZCAqLworICBmb3IgKGsgPSAwOyBrIDwgKGRlc3RfaGVpZ2h0ICsgZGVzdF9iYW5kX2hlaWdodCAtIDEpIC8gZGVzdF9iYW5kX2hlaWdodCAtIDE7IGsrKykgeworICAgIC8qIHNjYWxlIG9uZSBiYW5kIGhvcml6b250YWxseSAqLworICAgIGZvciAoaSA9IDE7IGkgPCBzcmNfYmFuZF9oZWlnaHQ7IGkrKykgeworICAgICAgLyogVHJhcCBjYXNlIHdoZXJlIHdlIGNvdWxkIHJlYWQgb2ZmIHRoZSBiYXNlIG9mIHRoZSBzb3VyY2UgYnVmZmVyICovCisgICAgICBsaW5lX3NyYyA9IHNvdXJjZSArIGkgKiBzb3VyY2VfcGl0Y2g7CisKKyAgICAgIGlmIChsaW5lX3NyYyA8IHNvdXJjZV9iYXNlKQorICAgICAgICBsaW5lX3NyYyA9IHNvdXJjZV9iYXNlOworCisgICAgICBob3Jpel9saW5lX3NjYWxlKGxpbmVfc3JjLCBzb3VyY2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgKyBpICogZGVzdF9waXRjaCwgZGVzdF93aWR0aCk7CisgICAgfQorCisgICAgLyogZmlyc3QgbGluZSBvZiBuZXh0IGJhbmQgKi8KKyAgICAvKiBUcmFwIGNhc2Ugd2hlcmUgd2UgY291bGQgcmVhZCBvZmYgdGhlIGJhc2Ugb2YgdGhlIHNvdXJjZSBidWZmZXIgKi8KKyAgICBsaW5lX3NyYyA9IHNvdXJjZSArIHNyY19iYW5kX2hlaWdodCAqIHNvdXJjZV9waXRjaDsKKworICAgIGlmIChsaW5lX3NyYyA8IHNvdXJjZV9iYXNlKQorICAgICAgbGluZV9zcmMgPSBzb3VyY2VfYmFzZTsKKworICAgIGhvcml6X2xpbmVfc2NhbGUobGluZV9zcmMsIHNvdXJjZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIGRlc3QgKyBkZXN0X2JhbmRfaGVpZ2h0ICogZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgpOworCisgICAgLyogVmVydGljYWwgc2NhbGluZyBpcyBpbiBwbGFjZSAqLworICAgIHZlcnRfYmFuZF9zY2FsZShkZXN0LCBkZXN0X3BpdGNoLCBkZXN0X3dpZHRoKTsKKworICAgIC8qIE5leHQgYmFuZC4uLiAqLworICAgIHNvdXJjZSArPSBzcmNfYmFuZF9oZWlnaHQgICogc291cmNlX3BpdGNoOworICAgIGRlc3QgICArPSBkZXN0X2JhbmRfaGVpZ2h0ICogZGVzdF9waXRjaDsKKyAgfQorCisgIC8qIHNjYWxlIG9uZSBiYW5kIGhvcml6b250YWxseSAqLworICBmb3IgKGkgPSAxOyBpIDwgc3JjX2JhbmRfaGVpZ2h0OyBpKyspIHsKKyAgICAvKiBUcmFwIGNhc2Ugd2hlcmUgd2UgY291bGQgcmVhZCBvZmYgdGhlIGJhc2Ugb2YgdGhlIHNvdXJjZSBidWZmZXIgKi8KKyAgICBsaW5lX3NyYyA9IHNvdXJjZSArIGkgKiBzb3VyY2VfcGl0Y2g7CisKKyAgICBpZiAobGluZV9zcmMgPCBzb3VyY2VfYmFzZSkKKyAgICAgIGxpbmVfc3JjID0gc291cmNlX2Jhc2U7CisKKyAgICBob3Jpel9saW5lX3NjYWxlKGxpbmVfc3JjLCBzb3VyY2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBkZXN0ICsgaSAqIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoKTsKKyAgfQorCisgIC8qIFZlcnRpY2FsIHNjYWxpbmcgaXMgaW4gcGxhY2UgKi8KKyAgbGFzdF92ZXJ0X2JhbmRfc2NhbGUoZGVzdCwgZGVzdF9waXRjaCwgZGVzdF93aWR0aCk7CisKKyAgcmV0dXJuIHJhdGlvX3NjYWxhYmxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogYW55X3JhdGlvX2ZyYW1lX3NjYWxlCisgKgorICogIElOUFVUUyAgICAgICAgOiBTQ0FMRV9JTlNUQU5DRSAqc2kgICAgICAgOiBQb2ludGVyIHRvIHBvc3QtcHJvY2Vzc29yIGluc3RhbmNlIChOT1QgVVNFRCkuCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmZyYW1lX2J1ZmZlciAgICAgICAgICAgOiBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZS4KKyAqICAgICAgICAgICAgICAgICAgaW50IFlPZmZzZXQgICAgICAgICAgICAgICAgOiBPZmZzZXQgZnJvbSBzdGFydCBvZiBidWZmZXIgdG8gWSBzYW1wbGVzLgorICogICAgICAgICAgICAgICAgICBpbnQgVVZPZmZzZXQgICAgICAgICAgICAgICA6IE9mZnNldCBmcm9tIHN0YXJ0IG9mIGJ1ZmZlciB0byBVViBzYW1wbGVzLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IGludDogMSBpZiBpbWFnZSBzY2FsZWQsIDAgaWYgaW1hZ2UgY291bGQgbm90IGJlIHNjYWxlZC4KKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlIHRoZSBpbWFnZSB3aXRoIGNoYW5naW5nIGFwZWN0IHJhdGlvLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworaW50IGFueV9yYXRpb19mcmFtZV9zY2FsZShTQ0FMRV9WQVJTICpzY2FsZV92YXJzLCBpbnQgWU9mZnNldCwgaW50IFVWT2Zmc2V0KSB7CisgIGludCBpOworICBpbnQgZXc7CisgIGludCBlaDsKKworICAvKiBzdWdnZXN0ZWQgc2NhbGUgZmFjdG9ycyAqLworICBpbnQgaHMgPSBzY2FsZV92YXJzLT5IU2NhbGU7CisgIGludCBociA9IHNjYWxlX3ZhcnMtPkhSYXRpbzsKKyAgaW50IHZzID0gc2NhbGVfdmFycy0+VlNjYWxlOworICBpbnQgdnIgPSBzY2FsZV92YXJzLT5WUmF0aW87CisKKyAgaW50IHJhdGlvX3NjYWxhYmxlID0gMTsKKworICBpbnQgc3cgPSAoc2NhbGVfdmFycy0+ZXhwYW5kZWRfZnJhbWVfd2lkdGggKiBociArIGhzIC0gMSkgLyBoczsKKyAgaW50IHNoID0gKHNjYWxlX3ZhcnMtPmV4cGFuZGVkX2ZyYW1lX2hlaWdodCAqIHZyICsgdnMgLSAxKSAvIHZzOworICBpbnQgZHcgPSBzY2FsZV92YXJzLT5leHBhbmRlZF9mcmFtZV93aWR0aDsKKyAgaW50IGRoID0gc2NhbGVfdmFycy0+ZXhwYW5kZWRfZnJhbWVfaGVpZ2h0OworICBZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195dXZfY29uZmlnID0gc2NhbGVfdmFycy0+c3JjX3l1dl9jb25maWc7CisgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3l1dl9jb25maWcgPSBzY2FsZV92YXJzLT5kc3RfeXV2X2NvbmZpZzsKKworICBpZiAoaHIgPT0gMykKKyAgICBldyA9IChzdyArIDIpIC8gMyAqIDMgKiBocyAvIGhyOworICBlbHNlCisgICAgZXcgPSAoc3cgKyA3KSAvIDggKiA4ICogaHMgLyBocjsKKworICBpZiAodnIgPT0gMykKKyAgICBlaCA9IChzaCArIDIpIC8gMyAqIDMgKiB2cyAvIHZyOworICBlbHNlCisgICAgZWggPSAoc2ggKyA3KSAvIDggKiA4ICogdnMgLyB2cjsKKworICByYXRpb19zY2FsYWJsZSA9IGFueV9yYXRpb18yZF9zY2FsZShzY2FsZV92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyY195dXZfY29uZmlnLT55X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3l1dl9jb25maWctPnlfc3RyaWRlLCBzdywgc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopIGRzdF95dXZfY29uZmlnLT55X2J1ZmZlciArIFlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95dXZfY29uZmlnLT55X3N0cmlkZSwgZHcsIGRoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZWg7IGkrKykKKyAgICBkdWNrX21lbXNldChkc3RfeXV2X2NvbmZpZy0+eV9idWZmZXIgKyBZT2Zmc2V0ICsgaSAqIGRzdF95dXZfY29uZmlnLT55X3N0cmlkZSArIGR3LCAwLCBldyAtIGR3KTsKKworICBmb3IgKGkgPSBkaDsgaSA8IGVoOyBpKyspCisgICAgZHVja19tZW1zZXQoZHN0X3l1dl9jb25maWctPnlfYnVmZmVyICsgWU9mZnNldCArIGkgKiBkc3RfeXV2X2NvbmZpZy0+eV9zdHJpZGUsIDAsIGV3KTsKKworICBpZiAocmF0aW9fc2NhbGFibGUgPT0gMCkKKyAgICByZXR1cm4gcmF0aW9fc2NhbGFibGU7CisKKyAgc3cgPSAoc3cgKyAxKSA+PiAxOworICBzaCA9IChzaCArIDEpID4+IDE7CisgIGR3ID0gKGR3ICsgMSkgPj4gMTsKKyAgZGggPSAoZGggKyAxKSA+PiAxOworCisgIGFueV9yYXRpb18yZF9zY2FsZShzY2FsZV92YXJzLAorICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzcmNfeXV2X2NvbmZpZy0+dV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBzcmNfeXV2X2NvbmZpZy0+eV9zdHJpZGUgLyAyLCBzdywgc2gsCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWRzdF95dXZfY29uZmlnLT51X2J1ZmZlciArIFVWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZSwgZHcsIGRoKTsKKworICBhbnlfcmF0aW9fMmRfc2NhbGUoc2NhbGVfdmFycywKKyAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjX3l1dl9jb25maWctPnZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgc3JjX3l1dl9jb25maWctPnlfc3RyaWRlIC8gMiwgc3csIHNoLAorICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilkc3RfeXV2X2NvbmZpZy0+dl9idWZmZXIgKyBVVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdF95dXZfY29uZmlnLT51dl9zdHJpZGUsIGR3LCBkaCk7CisKKyAgcmV0dXJuIHJhdGlvX3NjYWxhYmxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogY2VudGVyX2ltYWdlCisgKgorICogIElOUFVUUyAgICAgICAgOiBTQ0FMRV9JTlNUQU5DRSAqc2kgICAgICAgOiBQb2ludGVyIHRvIHBvc3QtcHJvY2Vzc29yIGluc3RhbmNlLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IENlbnRlcnMgdGhlIGltYWdlIHdpdGhvdXQgc2NhbGluZyBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorY2VudGVyX2ltYWdlKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3l1dl9jb25maWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3l1dl9jb25maWcpIHsKKyAgaW50IGk7CisgIGludCByb3dfb2Zmc2V0LCBjb2xfb2Zmc2V0OworICB1bnNpZ25lZCBjaGFyICpzcmNfZGF0YV9wb2ludGVyOworICB1bnNpZ25lZCBjaGFyICpkc3RfZGF0YV9wb2ludGVyOworCisgIC8qIGNlbnRlciB2YWx1ZXMgKi8KKyAgcm93X29mZnNldCA9IChkc3RfeXV2X2NvbmZpZy0+eV9oZWlnaHQgLSBzcmNfeXV2X2NvbmZpZy0+eV9oZWlnaHQpIC8gMjsKKyAgY29sX29mZnNldCA9IChkc3RfeXV2X2NvbmZpZy0+eV93aWR0aCAtIHNyY195dXZfY29uZmlnLT55X3dpZHRoKSAvIDI7CisKKyAgLyogWSdzICovCisgIHNyY19kYXRhX3BvaW50ZXIgPSBzcmNfeXV2X2NvbmZpZy0+eV9idWZmZXI7CisgIGRzdF9kYXRhX3BvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKWRzdF95dXZfY29uZmlnLT55X2J1ZmZlciArIChyb3dfb2Zmc2V0ICogZHN0X3l1dl9jb25maWctPnlfc3RyaWRlKSArIGNvbF9vZmZzZXQ7CisKKyAgZm9yIChpID0gMDsgaSA8IHNyY195dXZfY29uZmlnLT55X2hlaWdodDsgaSsrKSB7CisgICAgZHVja19tZW1jcHkoZHN0X2RhdGFfcG9pbnRlciwgc3JjX2RhdGFfcG9pbnRlciwgc3JjX3l1dl9jb25maWctPnlfd2lkdGgpOworICAgIGRzdF9kYXRhX3BvaW50ZXIgKz0gZHN0X3l1dl9jb25maWctPnlfc3RyaWRlOworICAgIHNyY19kYXRhX3BvaW50ZXIgKz0gc3JjX3l1dl9jb25maWctPnlfc3RyaWRlOworICB9CisKKyAgcm93X29mZnNldCAvPSAyOworICBjb2xfb2Zmc2V0IC89IDI7CisKKyAgLyogVSdzICovCisgIHNyY19kYXRhX3BvaW50ZXIgPSBzcmNfeXV2X2NvbmZpZy0+dV9idWZmZXI7CisgIGRzdF9kYXRhX3BvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKWRzdF95dXZfY29uZmlnLT51X2J1ZmZlciArIChyb3dfb2Zmc2V0ICogZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZSkgKyBjb2xfb2Zmc2V0OworCisgIGZvciAoaSA9IDA7IGkgPCBzcmNfeXV2X2NvbmZpZy0+dXZfaGVpZ2h0OyBpKyspIHsKKyAgICBkdWNrX21lbWNweShkc3RfZGF0YV9wb2ludGVyLCBzcmNfZGF0YV9wb2ludGVyLCBzcmNfeXV2X2NvbmZpZy0+dXZfd2lkdGgpOworICAgIGRzdF9kYXRhX3BvaW50ZXIgKz0gZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZTsKKyAgICBzcmNfZGF0YV9wb2ludGVyICs9IHNyY195dXZfY29uZmlnLT51dl9zdHJpZGU7CisgIH0KKworICAvKiBWJ3MgKi8KKyAgc3JjX2RhdGFfcG9pbnRlciA9IHNyY195dXZfY29uZmlnLT52X2J1ZmZlcjsKKyAgZHN0X2RhdGFfcG9pbnRlciA9ICh1bnNpZ25lZCBjaGFyICopZHN0X3l1dl9jb25maWctPnZfYnVmZmVyICsgKHJvd19vZmZzZXQgKiBkc3RfeXV2X2NvbmZpZy0+dXZfc3RyaWRlKSArIGNvbF9vZmZzZXQ7CisKKyAgZm9yIChpID0gMDsgaSA8IHNyY195dXZfY29uZmlnLT51dl9oZWlnaHQ7IGkrKykgeworICAgIGR1Y2tfbWVtY3B5KGRzdF9kYXRhX3BvaW50ZXIsIHNyY19kYXRhX3BvaW50ZXIsIHNyY195dXZfY29uZmlnLT51dl93aWR0aCk7CisgICAgZHN0X2RhdGFfcG9pbnRlciArPSBkc3RfeXV2X2NvbmZpZy0+dXZfc3RyaWRlOworICAgIHNyY19kYXRhX3BvaW50ZXIgKz0gc3JjX3l1dl9jb25maWctPnV2X3N0cmlkZTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogc2NhbGVfb3JfY2VudGVyCisgKgorICogIElOUFVUUyAgICAgICAgOiBTQ0FMRV9JTlNUQU5DRSAqc2kgICAgICAgOiBQb2ludGVyIHRvIHBvc3QtcHJvY2Vzc29yIGluc3RhbmNlLgorICoKKyAqCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogRGVjaWRlcyB0byBzY2FsZSBvciBjZW50ZXIgaW1hZ2UgaW4gc2NhbGUgYnVmZmVyIGZvciBibGl0CisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAordnA4X3l2MTJfc2NhbGVfb3JfY2VudGVyCisoCisgIFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3l1dl9jb25maWcsCisgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3l1dl9jb25maWcsCisgIGludCBleHBhbmRlZF9mcmFtZV93aWR0aCwKKyAgaW50IGV4cGFuZGVkX2ZyYW1lX2hlaWdodCwKKyAgaW50IHNjYWxpbmdfbW9kZSwKKyAgaW50IEhTY2FsZSwKKyAgaW50IEhSYXRpbywKKyAgaW50IFZTY2FsZSwKKyAgaW50IFZSYXRpbworKSB7CisgIC8qaWYgKCBwcGktPnBvc3RfcHJvY2Vzc2luZ19sZXZlbCApCisgICAgICAgIHVwZGF0ZV91bXZib3JkZXIgKCBwcGksIGZyYW1lX2J1ZmZlciApOyovCisKKworICBzd2l0Y2ggKHNjYWxpbmdfbW9kZSkgeworICAgIGNhc2UgU0NBTEVfVE9fRklUOgorICAgIGNhc2UgTUFJTlRBSU5fQVNQRUNUX1JBVElPOiB7CisgICAgICBTQ0FMRV9WQVJTIHNjYWxlX3ZhcnM7CisgICAgICAvKiBjZW50ZXIgdmFsdWVzICovCisjaWYgMQorICAgICAgaW50IHJvdyA9IChkc3RfeXV2X2NvbmZpZy0+eV9oZWlnaHQgLSBleHBhbmRlZF9mcmFtZV9oZWlnaHQpIC8gMjsKKyAgICAgIGludCBjb2wgPSAoZHN0X3l1dl9jb25maWctPnlfd2lkdGggIC0gZXhwYW5kZWRfZnJhbWVfd2lkdGgpIC8gMjsKKyAgICAgIC8qaW50IFlPZmZzZXQgID0gcm93ICogZHN0X3l1dl9jb25maWctPnlfd2lkdGggKyBjb2w7CisgICAgICBpbnQgVVZPZmZzZXQgPSAocm93Pj4xKSAqIGRzdF95dXZfY29uZmlnLT51dl93aWR0aCArIChjb2w+PjEpOyovCisgICAgICBpbnQgWU9mZnNldCAgPSByb3cgKiBkc3RfeXV2X2NvbmZpZy0+eV9zdHJpZGUgKyBjb2w7CisgICAgICBpbnQgVVZPZmZzZXQgPSAocm93ID4+IDEpICogZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZSArIChjb2wgPj4gMSk7CisjZWxzZQorICAgICAgaW50IHJvdyA9IChzcmNfeXV2X2NvbmZpZy0+eV9oZWlnaHQgLSBleHBhbmRlZF9mcmFtZV9oZWlnaHQpIC8gMjsKKyAgICAgIGludCBjb2wgPSAoc3JjX3l1dl9jb25maWctPnlfd2lkdGggIC0gZXhwYW5kZWRfZnJhbWVfd2lkdGgpIC8gMjsKKyAgICAgIGludCBZT2Zmc2V0ICA9IHJvdyAqIHNyY195dXZfY29uZmlnLT55X3dpZHRoICsgY29sOworICAgICAgaW50IFVWT2Zmc2V0ID0gKHJvdyA+PiAxKSAqIHNyY195dXZfY29uZmlnLT51dl93aWR0aCArIChjb2wgPj4gMSk7CisjZW5kaWYKKworICAgICAgc2NhbGVfdmFycy5kc3RfeXV2X2NvbmZpZyA9IGRzdF95dXZfY29uZmlnOworICAgICAgc2NhbGVfdmFycy5zcmNfeXV2X2NvbmZpZyA9IHNyY195dXZfY29uZmlnOworICAgICAgc2NhbGVfdmFycy5IU2NhbGUgPSBIU2NhbGU7CisgICAgICBzY2FsZV92YXJzLkhSYXRpbyA9IEhSYXRpbzsKKyAgICAgIHNjYWxlX3ZhcnMuVlNjYWxlID0gVlNjYWxlOworICAgICAgc2NhbGVfdmFycy5WUmF0aW8gPSBWUmF0aW87CisgICAgICBzY2FsZV92YXJzLmV4cGFuZGVkX2ZyYW1lX3dpZHRoID0gZXhwYW5kZWRfZnJhbWVfd2lkdGg7CisgICAgICBzY2FsZV92YXJzLmV4cGFuZGVkX2ZyYW1lX2hlaWdodCA9IGV4cGFuZGVkX2ZyYW1lX2hlaWdodDsKKworICAgICAgLyogcGVyZm9ybSBjZW50ZXIgYW5kIHNjYWxlICovCisgICAgICBhbnlfcmF0aW9fZnJhbWVfc2NhbGUoJnNjYWxlX3ZhcnMsIFlPZmZzZXQsIFVWT2Zmc2V0KTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ0VOVEVSOgorICAgICAgY2VudGVyX2ltYWdlKHNyY195dXZfY29uZmlnLCBkc3RfeXV2X2NvbmZpZyk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL3l2MTJjb25maWcuYyBiL2xpYnZweC92cHhfc2NhbGUvZ2VuZXJpYy95djEyY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiMmE0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfc2NhbGUvZ2VuZXJpYy95djEyY29uZmlnLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXhwb3J0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAordnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKSB7CisgIGlmICh5YmYpIHsKKyAgICB2cHhfZnJlZSh5YmYtPmJ1ZmZlcl9hbGxvYyk7CisKKyAgICAvKiBidWZmZXJfYWxsb2MgaXNuJ3QgYWNjZXNzZWQgYnkgbW9zdCBmdW5jdGlvbnMuICBSYXRoZXIgeV9idWZmZXIsCisgICAgICB1X2J1ZmZlciBhbmQgdl9idWZmZXIgcG9pbnQgdG8gYnVmZmVyX2FsbG9jIGFuZCBhcmUgdXNlZC4gIENsZWFyIG91dAorICAgICAgYWxsIG9mIHRoaXMgc28gdGhhdCBhIGZyZWVkIHBvaW50ZXIgaXNuJ3QgaW5hZHZlcnRlbnRseSB1c2VkICovCisgICAgdnB4X21lbXNldCh5YmYsIDAsIHNpemVvZihZVjEyX0JVRkZFUl9DT05GSUcpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAordnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBib3JkZXIpIHsKKyAgLypOT1RFOiovCisKKyAgaWYgKHliZikgeworICAgIGludCB5X3N0cmlkZSA9ICgod2lkdGggKyAyICogYm9yZGVyKSArIDMxKSAmIH4zMTsKKyAgICBpbnQgeXBsYW5lX3NpemUgPSAoaGVpZ2h0ICsgMiAqIGJvcmRlcikgKiB5X3N0cmlkZTsKKyAgICBpbnQgdXZfd2lkdGggPSB3aWR0aCA+PiAxOworICAgIGludCB1dl9oZWlnaHQgPSBoZWlnaHQgPj4gMTsKKyAgICAvKiogVGhlcmUgaXMgY3VycmVudGx5IGEgYnVuY2ggb2YgY29kZSB3aGljaCBhc3N1bWVzCisgICAgICAqICB1dl9zdHJpZGUgPT0geV9zdHJpZGUvMiwgc28gZW5mb3JjZSB0aGlzIGhlcmUuICovCisgICAgaW50IHV2X3N0cmlkZSA9IHlfc3RyaWRlID4+IDE7CisgICAgaW50IHV2cGxhbmVfc2l6ZSA9ICh1dl9oZWlnaHQgKyBib3JkZXIpICogdXZfc3RyaWRlOworCisgICAgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKHliZik7CisKKyAgICAvKiogT25seSBzdXBwb3J0IGFsbG9jYXRpbmcgYnVmZmVycyB0aGF0IGhhdmUgYSBoZWlnaHQgYW5kIHdpZHRoIHRoYXQKKyAgICAgICogIGFyZSBtdWx0aXBsZXMgb2YgMTYsIGFuZCBhIGJvcmRlciB0aGF0J3MgYSBtdWx0aXBsZSBvZiAzMi4KKyAgICAgICogVGhlIGJvcmRlciByZXN0cmljdGlvbiBpcyByZXF1aXJlZCB0byBnZXQgMTYtYnl0ZSBhbGlnbm1lbnQgb2YgdGhlCisgICAgICAqICBzdGFydCBvZiB0aGUgY2hyb21hIHJvd3Mgd2l0aG91dCBpbnRvZHVjaW5nIGFuIGFyYml0cmFyeSBnYXAKKyAgICAgICogIGJldHdlZW4gcGxhbmVzLCB3aGljaCB3b3VsZCBicmVhayB0aGUgc2VtYW50aWNzIG9mIHRoaW5ncyBsaWtlCisgICAgICAqICB2cHhfaW1nX3NldF9yZWN0KCkuICovCisgICAgaWYgKCh3aWR0aCAmIDB4ZikgfCAoaGVpZ2h0ICYgMHhmKSB8IChib3JkZXIgJiAweDFmKSkKKyAgICAgIHJldHVybiAtMzsKKworICAgIHliZi0+eV93aWR0aCAgPSB3aWR0aDsKKyAgICB5YmYtPnlfaGVpZ2h0ID0gaGVpZ2h0OworICAgIHliZi0+eV9zdHJpZGUgPSB5X3N0cmlkZTsKKworICAgIHliZi0+dXZfd2lkdGggPSB1dl93aWR0aDsKKyAgICB5YmYtPnV2X2hlaWdodCA9IHV2X2hlaWdodDsKKyAgICB5YmYtPnV2X3N0cmlkZSA9IHV2X3N0cmlkZTsKKworICAgIHliZi0+Ym9yZGVyID0gYm9yZGVyOworICAgIHliZi0+ZnJhbWVfc2l6ZSA9IHlwbGFuZV9zaXplICsgMiAqIHV2cGxhbmVfc2l6ZTsKKworICAgIHliZi0+YnVmZmVyX2FsbG9jID0gKHVuc2lnbmVkIGNoYXIgKikgdnB4X21lbWFsaWduKDMyLCB5YmYtPmZyYW1lX3NpemUpOworCisgICAgaWYgKHliZi0+YnVmZmVyX2FsbG9jID09IE5VTEwpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB5YmYtPnlfYnVmZmVyID0geWJmLT5idWZmZXJfYWxsb2MgKyAoYm9yZGVyICogeV9zdHJpZGUpICsgYm9yZGVyOworICAgIHliZi0+dV9idWZmZXIgPSB5YmYtPmJ1ZmZlcl9hbGxvYyArIHlwbGFuZV9zaXplICsgKGJvcmRlciAvIDIgICogdXZfc3RyaWRlKSArIGJvcmRlciAvIDI7CisgICAgeWJmLT52X2J1ZmZlciA9IHliZi0+YnVmZmVyX2FsbG9jICsgeXBsYW5lX3NpemUgKyB1dnBsYW5lX3NpemUgKyAoYm9yZGVyIC8gMiAgKiB1dl9zdHJpZGUpICsgYm9yZGVyIC8gMjsKKworICAgIHliZi0+Y29ycnVwdGVkID0gMDsgLyogYXNzdW1lIG5vdCBjdXJydXB0ZWQgYnkgZXJyb3JzICovCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0yOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZC5jIGIvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDcwNzhjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmQuYwpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgorI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgorI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXhwb3J0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3ZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX2MoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpIHsKKyAgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIxLCAqc3JjX3B0cjI7CisgIHVuc2lnbmVkIGNoYXIgKmRlc3RfcHRyMSwgKmRlc3RfcHRyMjsKKworICB1bnNpZ25lZCBpbnQgQm9yZGVyOworICBpbnQgcGxhbmVfc3RyaWRlOworICBpbnQgcGxhbmVfaGVpZ2h0OworICBpbnQgcGxhbmVfd2lkdGg7CisKKyAgLyoqKioqKioqKioqLworICAvKiBZIFBsYW5lICovCisgIC8qKioqKioqKioqKi8KKyAgQm9yZGVyID0geWJmLT5ib3JkZXI7CisgIHBsYW5lX3N0cmlkZSA9IHliZi0+eV9zdHJpZGU7CisgIHBsYW5lX2hlaWdodCA9IHliZi0+eV9oZWlnaHQ7CisgIHBsYW5lX3dpZHRoID0geWJmLT55X3dpZHRoOworCisgIC8qIGNvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vc3QgY29sdW1ucyBvdXQgKi8KKyAgc3JjX3B0cjEgPSB5YmYtPnlfYnVmZmVyOworICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOworICBkZXN0X3B0cjEgPSBzcmNfcHRyMSAtIEJvcmRlcjsKKyAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxOworCisgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykgeworICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgQm9yZGVyKTsKKyAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMiwgc3JjX3B0cjJbMF0sIEJvcmRlcik7CisgICAgc3JjX3B0cjEgICs9IHBsYW5lX3N0cmlkZTsKKyAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOworICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKKyAgfQorCisgIC8qIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycyAqLworICBzcmNfcHRyMSA9IHliZi0+eV9idWZmZXIgLSBCb3JkZXI7CisgIHNyY19wdHIyID0gc3JjX3B0cjEgKyAocGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlKSAtIHBsYW5lX3N0cmlkZTsKKyAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKKyAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyBwbGFuZV9zdHJpZGU7CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpQm9yZGVyOyBpKyspIHsKKyAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIHBsYW5lX3N0cmlkZSk7CisgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBwbGFuZV9zdHJpZGUpOworICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqLworICAvKiBVIFBsYW5lICovCisgIC8qKioqKioqKioqKi8KKyAgcGxhbmVfc3RyaWRlID0geWJmLT51dl9zdHJpZGU7CisgIHBsYW5lX2hlaWdodCA9IHliZi0+dXZfaGVpZ2h0OworICBwbGFuZV93aWR0aCA9IHliZi0+dXZfd2lkdGg7CisgIEJvcmRlciAvPSAyOworCisgIC8qIGNvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vc3QgY29sdW1ucyBvdXQgKi8KKyAgc3JjX3B0cjEgPSB5YmYtPnVfYnVmZmVyOworICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOworICBkZXN0X3B0cjEgPSBzcmNfcHRyMSAtIEJvcmRlcjsKKyAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxOworCisgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykgeworICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgQm9yZGVyKTsKKyAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMiwgc3JjX3B0cjJbMF0sIEJvcmRlcik7CisgICAgc3JjX3B0cjEgICs9IHBsYW5lX3N0cmlkZTsKKyAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOworICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKKyAgfQorCisgIC8qIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycyAqLworICBzcmNfcHRyMSA9IHliZi0+dV9idWZmZXIgLSBCb3JkZXI7CisgIHNyY19wdHIyID0gc3JjX3B0cjEgKyAocGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlKSAtIHBsYW5lX3N0cmlkZTsKKyAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKKyAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyBwbGFuZV9zdHJpZGU7CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpKEJvcmRlcik7IGkrKykgeworICAgIHZweF9tZW1jcHkoZGVzdF9wdHIxLCBzcmNfcHRyMSwgcGxhbmVfc3RyaWRlKTsKKyAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMiwgc3JjX3B0cjIsIHBsYW5lX3N0cmlkZSk7CisgICAgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZTsKKyAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOworICB9CisKKyAgLyoqKioqKioqKioqLworICAvKiBWIFBsYW5lICovCisgIC8qKioqKioqKioqKi8KKworICAvKiBjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0ICovCisgIHNyY19wdHIxID0geWJmLT52X2J1ZmZlcjsKKyAgc3JjX3B0cjIgPSBzcmNfcHRyMSArIHBsYW5lX3dpZHRoIC0gMTsKKyAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXI7CisgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfaGVpZ2h0OyBpKyspIHsKKyAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMSwgc3JjX3B0cjFbMF0sIEJvcmRlcik7CisgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOworICAgIHNyY19wdHIxICArPSBwbGFuZV9zdHJpZGU7CisgICAgc3JjX3B0cjIgICs9IHBsYW5lX3N0cmlkZTsKKyAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOworICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7CisgIH0KKworICAvKiBOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMgKi8KKyAgc3JjX3B0cjEgPSB5YmYtPnZfYnVmZmVyIC0gQm9yZGVyOworICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7CisgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gKEJvcmRlciAqIHBsYW5lX3N0cmlkZSk7CisgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgcGxhbmVfc3RyaWRlOworCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KShCb3JkZXIpOyBpKyspIHsKKyAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIHBsYW5lX3N0cmlkZSk7CisgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBwbGFuZV9zdHJpZGUpOworICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7CisgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitleHRlbmRfZnJhbWVfYm9yZGVyc195b25seV9jKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKSB7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyMSwgKnNyY19wdHIyOworICB1bnNpZ25lZCBjaGFyICpkZXN0X3B0cjEsICpkZXN0X3B0cjI7CisKKyAgdW5zaWduZWQgaW50IEJvcmRlcjsKKyAgaW50IHBsYW5lX3N0cmlkZTsKKyAgaW50IHBsYW5lX2hlaWdodDsKKyAgaW50IHBsYW5lX3dpZHRoOworCisgIC8qKioqKioqKioqKi8KKyAgLyogWSBQbGFuZSAqLworICAvKioqKioqKioqKiovCisgIEJvcmRlciA9IHliZi0+Ym9yZGVyOworICBwbGFuZV9zdHJpZGUgPSB5YmYtPnlfc3RyaWRlOworICBwbGFuZV9oZWlnaHQgPSB5YmYtPnlfaGVpZ2h0OworICBwbGFuZV93aWR0aCA9IHliZi0+eV93aWR0aDsKKworICAvKiBjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0ICovCisgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlcjsKKyAgc3JjX3B0cjIgPSBzcmNfcHRyMSArIHBsYW5lX3dpZHRoIC0gMTsKKyAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXI7CisgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfaGVpZ2h0OyBpKyspIHsKKyAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMSwgc3JjX3B0cjFbMF0sIEJvcmRlcik7CisgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOworICAgIHNyY19wdHIxICArPSBwbGFuZV9zdHJpZGU7CisgICAgc3JjX3B0cjIgICs9IHBsYW5lX3N0cmlkZTsKKyAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOworICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7CisgIH0KKworICAvKiBOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMgKi8KKyAgc3JjX3B0cjEgPSB5YmYtPnlfYnVmZmVyIC0gQm9yZGVyOworICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7CisgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gKEJvcmRlciAqIHBsYW5lX3N0cmlkZSk7CisgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgcGxhbmVfc3RyaWRlOworCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KUJvcmRlcjsgaSsrKSB7CisgICAgdnB4X21lbWNweShkZXN0X3B0cjEsIHNyY19wdHIxLCBwbGFuZV9zdHJpZGUpOworICAgIHZweF9tZW1jcHkoZGVzdF9wdHIyLCBzcmNfcHRyMiwgcGxhbmVfc3RyaWRlKTsKKyAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOworICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7CisgIH0KKworICBwbGFuZV9zdHJpZGUgLz0gMjsKKyAgcGxhbmVfaGVpZ2h0IC89IDI7CisgIHBsYW5lX3dpZHRoIC89IDI7CisgIEJvcmRlciAvPSAyOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogdnA4X3l2MTJfY29weV9mcmFtZQorICoKKyAqICBJTlBVVFMgICAgICAgIDoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgdGhlIHNvdXJjZSBpbWFnZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBhbmQKKyAqICAgICAgICAgICAgICAgICAgdXBkYXRlcyB0aGUgZGVzdGluYXRpb24ncyBVTVYgYm9yZGVycy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSBmcmFtZXMgYXJlIGFzc3VtZWQgdG8gYmUgaWRlbnRpY2FsIGluIHNpemUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCit2cDhfeXYxMl9jb3B5X2ZyYW1lX2MoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLAorICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYykgeworICBpbnQgcm93OworICB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICpkZXN0OworCisgIHNvdXJjZSA9IHNyY195YmMtPnlfYnVmZmVyOworICBkZXN0ID0gZHN0X3liYy0+eV9idWZmZXI7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBzcmNfeWJjLT55X2hlaWdodDsgcm93KyspIHsKKyAgICB2cHhfbWVtY3B5KGRlc3QsIHNvdXJjZSwgc3JjX3liYy0+eV93aWR0aCk7CisgICAgc291cmNlICs9IHNyY195YmMtPnlfc3RyaWRlOworICAgIGRlc3QgICArPSBkc3RfeWJjLT55X3N0cmlkZTsKKyAgfQorCisgIHNvdXJjZSA9IHNyY195YmMtPnVfYnVmZmVyOworICBkZXN0ID0gZHN0X3liYy0+dV9idWZmZXI7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBzcmNfeWJjLT51dl9oZWlnaHQ7IHJvdysrKSB7CisgICAgdnB4X21lbWNweShkZXN0LCBzb3VyY2UsIHNyY195YmMtPnV2X3dpZHRoKTsKKyAgICBzb3VyY2UgKz0gc3JjX3liYy0+dXZfc3RyaWRlOworICAgIGRlc3QgICArPSBkc3RfeWJjLT51dl9zdHJpZGU7CisgIH0KKworICBzb3VyY2UgPSBzcmNfeWJjLT52X2J1ZmZlcjsKKyAgZGVzdCA9IGRzdF95YmMtPnZfYnVmZmVyOworCisgIGZvciAocm93ID0gMDsgcm93IDwgc3JjX3liYy0+dXZfaGVpZ2h0OyByb3crKykgeworICAgIHZweF9tZW1jcHkoZGVzdCwgc291cmNlLCBzcmNfeWJjLT51dl93aWR0aCk7CisgICAgc291cmNlICs9IHNyY195YmMtPnV2X3N0cmlkZTsKKyAgICBkZXN0ICAgKz0gZHN0X3liYy0+dXZfc3RyaWRlOworICB9CisKKyAgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfYyhkc3RfeWJjKTsKK30KKwordm9pZCB2cDhfeXYxMl9jb3B5X3lfYyhZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsCisgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYykgeworICBpbnQgcm93OworICB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICpkZXN0OworCisKKyAgc291cmNlID0gc3JjX3liYy0+eV9idWZmZXI7CisgIGRlc3QgPSBkc3RfeWJjLT55X2J1ZmZlcjsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNyY195YmMtPnlfaGVpZ2h0OyByb3crKykgeworICAgIHZweF9tZW1jcHkoZGVzdCwgc291cmNlLCBzcmNfeWJjLT55X3dpZHRoKTsKKyAgICBzb3VyY2UgKz0gc3JjX3liYy0+eV9zdHJpZGU7CisgICAgZGVzdCAgICs9IGRzdF95YmMtPnlfc3RyaWRlOworICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZF9nZW5lcmljLmggYi9saWJ2cHgvdnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZF9nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyYTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfc2NhbGUvZ2VuZXJpYy95djEyZXh0ZW5kX2dlbmVyaWMuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBZVjEyX0VYVEVORF9HRU5FUklDX0gKKyNkZWZpbmUgWVYxMl9FWFRFTkRfR0VORVJJQ19ICisKKyNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgorCisgICAgdm9pZCB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7CisKKyAgICAvKiBDb3B5IFksVSxWIGJ1ZmZlciBkYXRhIGZyb20gc3JjIHRvIGRzdCwgZmlsbGluZyBib3JkZXIgb2YgZHN0IGFzIHdlbGwuICovCisgICAgdm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKKworICAgIC8qIENvcHkgWSBidWZmZXIgZGF0YSBmcm9tIHNyY195YmMgdG8gZHN0X3liYyB3aXRob3V0IGZpbGxpbmcgYm9yZGVyIGRhdGEgKi8KKyAgICB2b2lkIHZwOF95djEyX2NvcHlfeV9jKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKKworI2VuZGlmIC8qIFlWMTJfRVhURU5EX0dFTkVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9zY2FsZS9pbmNsdWRlL2dlbmVyaWMvdnB4c2NhbGVfYXJiaXRyYXJ5LmggYi9saWJ2cHgvdnB4X3NjYWxlL2luY2x1ZGUvZ2VuZXJpYy92cHhzY2FsZV9hcmJpdHJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTM1MjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS9pbmNsdWRlL2dlbmVyaWMvdnB4c2NhbGVfYXJiaXRyYXJ5LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKyNpZm5kZWYgX19WUFhfU0NBTEVfQVJCSVRSQVJZX0hfXworI2RlZmluZSBfX1ZQWF9TQ0FMRV9BUkJJVFJBUllfSF9fCisKKyNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBpbl93aWR0aDsKKyAgaW50IGluX2hlaWdodDsKKworICBpbnQgb3V0X3dpZHRoOworICBpbnQgb3V0X2hlaWdodDsKKyAgaW50IG1heF91c2FibGVfb3V0X3dpZHRoOworCisgIC8vIG51bWVyYXRvciBmb3IgdGhlIHdpZHRoIGFuZCBoZWlnaHQKKyAgaW50IG53OworICBpbnQgbmg7CisgIGludCBuaF91djsKKworICAvLyBvdXRwdXQgdG8gaW5wdXQgY29ycmVzcG9uZGFuY2UgYXJyYXkKKyAgc2hvcnQgKmxfdzsKKyAgc2hvcnQgKmxfaDsKKyAgc2hvcnQgKmxfaF91djsKKworICAvLyBwb2x5cGhhc2UgY29lZmZpY2llbnRzCisgIHNob3J0ICpjX3c7CisgIHNob3J0ICpjX2g7CisgIHNob3J0ICpjX2hfdXY7CisKKyAgLy8gYnVmZmVyIGZvciBob3Jpem9udGFsIGZpbHRlcmluZy4KKyAgdW5zaWduZWQgY2hhciAqaGJ1ZjsKKyAgdW5zaWduZWQgY2hhciAqaGJ1Zl91djsKK30gQklDVUJJQ19TQ0FMRVJfU1RSVUNUOworCitpbnQgYmljdWJpY19jb2VmZmljaWVudF9zZXR1cChpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsIGludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0KTsKK2ludCBiaWN1YmljX3NjYWxlKGludCBpbl93aWR0aCwgaW50IGluX2hlaWdodCwgaW50IGluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0LCBpbnQgb3V0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0X2ltYWdlLCB1bnNpZ25lZCBjaGFyICpvdXRwdXRfaW1hZ2UpOwordm9pZCBiaWN1YmljX3NjYWxlX2ZyYW1lX3Jlc2V0KCk7Cit2b2lkIGJpY3ViaWNfc2NhbGVfZnJhbWUoWVYxMl9CVUZGRVJfQ09ORklHICpzcmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfd2lkdGgsIGludCBuZXdfaGVpZ2h0KTsKK3ZvaWQgYmljdWJpY19jb2VmZmljaWVudF9pbml0KCk7Cit2b2lkIGJpY3ViaWNfY29lZmZpY2llbnRfZGVzdHJveSgpOworCisjZW5kaWYgLyogX19WUFhfU0NBTEVfQVJCSVRSQVJZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL2luY2x1ZGUvZ2VuZXJpYy92cHhzY2FsZV9kZXByaWNhdGVkLmggYi9saWJ2cHgvdnB4X3NjYWxlL2luY2x1ZGUvZ2VuZXJpYy92cHhzY2FsZV9kZXByaWNhdGVkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHZweF9zY2FsZS9pbmNsdWRlL2dlbmVyaWMvdnB4c2NhbGVfZGVwcmljYXRlZC5oCnJlbmFtZSB0byBsaWJ2cHgvdnB4X3NjYWxlL2luY2x1ZGUvZ2VuZXJpYy92cHhzY2FsZV9kZXByaWNhdGVkLmgKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvc2NhbGVfbW9kZS5oIGIvbGlidnB4L3ZweF9zY2FsZS9zY2FsZV9tb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4MTM4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfc2NhbGUvc2NhbGVfbW9kZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgU0NBTEVfTU9ERV9ICisjZGVmaW5lIFNDQUxFX01PREVfSAorCit0eXBlZGVmIGVudW0geworICBNQUlOVEFJTl9BU1BFQ1RfUkFUSU8gICA9IDB4MCwKKyAgU0NBTEVfVE9fRklUICAgICAgICAgICAgPSAweDEsCisgIENFTlRFUiAgICAgICAgICAgICAgICAgID0gMHgyLAorICBPVEhFUiAgICAgICAgICAgICAgICAgICA9IDB4MworfSBTQ0FMRV9NT0RFOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweF9zY2FsZS92cHhfc2NhbGUubWsgYi9saWJ2cHgvdnB4X3NjYWxlL3ZweF9zY2FsZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg5NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS92cHhfc2NhbGUubWsKQEAgLTAsMCArMSwxOCBAQAorU0NBTEVfU1JDUy15ZXMgKz0gdnB4X3NjYWxlLm1rCitTQ0FMRV9TUkNTLXllcyArPSBzY2FsZV9tb2RlLmgKK1NDQUxFX1NSQ1MteWVzICs9IHl2MTJjb25maWcuaAorU0NBTEVfU1JDUy15ZXMgKz0gdnB4c2NhbGUuaAorU0NBTEVfU1JDUy15ZXMgKz0gZ2VuZXJpYy92cHhzY2FsZS5jCitTQ0FMRV9TUkNTLXllcyArPSBnZW5lcmljL3l2MTJjb25maWcuYworU0NBTEVfU1JDUy15ZXMgKz0gZ2VuZXJpYy95djEyZXh0ZW5kLmMKK1NDQUxFX1NSQ1MteWVzICs9IGdlbmVyaWMveXYxMmV4dGVuZF9nZW5lcmljLmgKK1NDQUxFX1NSQ1MtJChDT05GSUdfU1BBVElBTF9SRVNBTVBMSU5HKSArPSBnZW5lcmljL2dlbl9zY2FsZXJzLmMKKworI25lb24KK1NDQUxFX1NSQ1MtJChIQVZFX05FT04pICArPSBhcm0vbmVvbi92cDhfdnB4eXYxMl9jb3B5ZnJhbWVfZnVuY19uZW9uJChBU00pCitTQ0FMRV9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gYXJtL25lb24vdnA4X3ZweHl2MTJfY29weV95X25lb24kKEFTTSkKK1NDQUxFX1NSQ1MtJChIQVZFX05FT04pICArPSBhcm0vbmVvbi92cDhfdnB4eXYxMl9jb3B5c3JjZnJhbWVfZnVuY19uZW9uJChBU00pCitTQ0FMRV9TUkNTLSQoSEFWRV9ORU9OKSAgKz0gYXJtL25lb24vdnA4X3ZweHl2MTJfZXh0ZW5kZnJhbWVib3JkZXJzX25lb24kKEFTTSkKK1NDQUxFX1NSQ1MtJChIQVZFX05FT04pICArPSBhcm0vbmVvbi95djEyZXh0ZW5kX2FybS5jCisKK1NDQUxFX1NSQ1Mtbm8gKz0gJChTQ0FMRV9TUkNTX1JFTU9WRS15ZXMpCmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3NjYWxlL3ZweHNjYWxlLmggYi9saWJ2cHgvdnB4X3NjYWxlL3ZweHNjYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZweC92cHhfc2NhbGUvdnB4c2NhbGUuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBWUFhTQ0FMRV9ICisjZGVmaW5lIFZQWFNDQUxFX0gKKworI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCisKK2V4dGVybiB2b2lkIHZwOF95djEyX3NjYWxlX29yX2NlbnRlcihZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195dXZfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3l1dl9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkX2ZyYW1lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZF9mcmFtZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxpbmdfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBIUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVlJhdGlvKTsKKworZXh0ZXJuIHZvaWQgdnA4X3NjYWxlX2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRlbXBfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRlbXBfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhyYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2cmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGludGVybGFjZWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvd2luMzIvc2NhbGVvcHQuYyBiL2xpYnZweC92cHhfc2NhbGUvd2luMzIvc2NhbGVvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk2Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS93aW4zMi9zY2FsZW9wdC5jCkBAIC0wLDAgKzEsMTcxOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgTW9kdWxlIFRpdGxlIDogICAgIHNjYWxlb3B0LmNwcAorKgorKiAgIERlc2NyaXB0aW9uICA6ICAgICBPcHRpbWl6ZWQgc2NhbGluZyBmdW5jdGlvbnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicHJhZ21hcy5oIgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIE1vZHVsZSBTdGF0aWNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvbmVfZmlmdGhbXSAgPSB7IDUxLCA1MSwgNTEsIDUxIH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHR3b19maWZ0aHNbXSA9IHsgMTAyLCAxMDIsIDEwMiwgMTAyIH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRocmVlX2ZpZnRoc1tdID0geyAxNTQsIDE1NCwgMTU0LCAxNTQgfTsKK19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm91cl9maWZ0aHNbXSA9IHsgMjA1LCAyMDUsIDIwNSwgMjA1IH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHJvdW5kX3ZhbHVlc1tdID0geyAxMjgsIDEyOCwgMTI4LCAxMjggfTsKK19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm91cl9vbmVzW10gPSB7IDEsIDEsIDEsIDF9OworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDQ1XzJbXSA9IHsyMDUsIDE1NCwgMTAyLCAgNTEgfTsKK19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3Q0NV8xW10gPSB7IDUxLCAxMDIsIDE1NCwgMjA1IH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgIG1hc2s0NVtdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAyNTUsIDB9OworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDM1XzJbXSA9IHsgMTU0LCAgNTEsIDIwNSwgMTAyIH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnN0MzVfMVtdID0geyAxMDIsIDIwNSwgIDUxLCAxNTQgfTsKKworCisKKyNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKKyNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfbW14CisgKgorICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6CisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogMyB0byA1IHVwLXNjYWxpbmcgb2YgYSBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYwordm9pZCBob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX21teAorKAorICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCisgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCispIHsKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisKKyAgX19hc20geworCisgICAgcHVzaCBlYngKKworICAgIG1vdiAgICAgICAgIGVzaSwgICAgc291cmNlCisgICAgbW92ICAgICAgICAgZWRpLCAgICBkZXN0CisKKyAgICBtb3YgICAgICAgICBlY3gsICAgIHNvdXJjZV93aWR0aAorICAgIGxlYSAgICAgICAgIGVkeCwgICAgW2VzaStlY3gtM107CisKKyAgICBtb3ZxICAgICAgICBtbTUsICAgIGNvbnN0MzVfMSAgICAgICAvLyBtbTUgPSA2NiB4eCBjZCB4eCAzMyB4eCA5YSB4eAorICAgIG1vdnEgICAgICAgIG1tNiwgICAgY29uc3QzNV8yICAgICAgIC8vIG1tNiA9IDlhIHh4IDMzIHh4IGNkIHh4IDY2IHh4CisKKyAgICBtb3ZxICAgICAgICBtbTQsICAgIHJvdW5kX3ZhbHVlcyAgICAgLy8gbW00ID0gODAgeHggODAgeHggODAgeHggODAgeHgKKyAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAvLyBjbGVhciBtbTcKKworICAgIGhvcml6X2xpbmVfM181X2xvb3A6CisKKyAgICBtb3YgICAgICAgIGVheCwgICAgRFdPUkQgUFRSIFtlc2ldIC8vIGVheCA9IDAwIDAxIDAyIDAzCisgICAgbW92ICAgICAgICBlYngsICAgIGVheAorCisgICAgYW5kICAgICAgICAgZWJ4LCAgICAweGZmZmYwMCAgICAgICAgLy8gZWJ4ID0geHggMDEgMDIgeHgKKyAgICBtb3YgICAgICAgICBlY3gsICAgIGVheCAgICAgICAgICAgICAvLyBlY3ggPSAwMCAwMSAwMiAwMworCisgICAgYW5kICAgICAgICAgZWF4LCAgICAweGZmZmYwMDAwICAgICAgLy8gZWF4ID0geHggeHggMDIgMDMKKyAgICB4b3IgICAgICAgICBlY3gsICAgIGVheCAgICAgICAgICAgICAvLyBlY3ggPSAwMCAwMSB4eCB4eAorCisgICAgc2hyICAgICAgICAgZWJ4LCAgICA4ICAgICAgICAgICAgICAgLy8gZWJ4ID0gMDEgMDIgeHggeHgKKyAgICBvciAgICAgICAgICBlYXgsICAgIGVieCAgICAgICAgICAgICAvLyBlYXggPSAwMSAwMiAwMiAwMworCisgICAgc2hsICAgICAgICAgZWJ4LCAgICAxNiAgICAgICAgICAgICAgLy8gZWJ4ID0geHggeHggMDEgMDIKKyAgICBtb3ZkICAgICAgICBtbTEsICAgIGVheCAgICAgICAgICAgICAvLyBtbTEgPSAwMSAwMiAwMiAwMyB4eCB4eCB4eCB4eAorCisgICAgb3IgICAgICAgICAgZWJ4LCAgICBlY3ggICAgICAgICAgICAgLy8gZWJ4ID0gMDAgMDEgMDEgMDIKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTEgPSAwMSB4eCAwMiB4eCAwMiB4eCAwMyB4eAorCisgICAgbW92ZCAgICAgICAgbW0wLCAgICBlYnggICAgICAgICAgICAgLy8gbW0wID0gMDAgMDEgMDEgMDIKKyAgICBwbXVsbHcgICAgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAvLworCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0wID0gMDAgeHggMDEgeHggMDEgeHggMDIgeHgKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAvLworCisgICAgbW92ICAgICAgICAgW2VkaV0sICBlYnggICAgICAgICAgICAgLy8gd3JpdGVvdXRwdXQgMDAgeHggeHggeHgKKyAgICBhZGQgICAgICAgICBlc2ksICAgIDMKKworICAgIGFkZCAgICAgICAgIGVkaSwgICAgNQorICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW0xCisKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tNAorICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAorCisgICAgY21wICAgICAgICAgZXNpLCAgICBlZHgKKyAgICBwYWNrdXN3YiAgICBtbTAsICAgIG1tNworCisgICAgbW92ZCAgICAgICAgRFdPUkQgUHRyIFtlZGktNF0sIG1tMAorICAgIGpsICAgICAgICAgIGhvcml6X2xpbmVfM181X2xvb3AKKworLy8gRXhpdDoKKyAgICBtb3YgICAgICAgICBlYXgsICAgIERXT1JEIFBUUiBbZXNpXSAvLyBlYXggPSAwMCAwMSAwMiAwMworICAgIG1vdiAgICAgICAgIGVieCwgICAgZWF4CisKKyAgICBhbmQgICAgICAgICBlYngsICAgIDB4ZmZmZjAwICAgICAgICAvLyBlYnggPSB4eCAwMSAwMiB4eAorICAgIG1vdiAgICAgICAgIGVjeCwgICAgZWF4ICAgICAgICAgICAgIC8vIGVjeCA9IDAwIDAxIDAyIDAzCisKKyAgICBhbmQgICAgICAgICBlYXgsICAgIDB4ZmZmZjAwMDAgICAgICAvLyBlYXggPSB4eCB4eCAwMiAwMworICAgIHhvciAgICAgICAgIGVjeCwgICAgZWF4ICAgICAgICAgICAgIC8vIGVjeCA9IDAwIDAxIHh4IHh4CisKKyAgICBzaHIgICAgICAgICBlYngsICAgIDggICAgICAgICAgICAgICAvLyBlYnggPSAwMSAwMiB4eCB4eAorICAgIG9yICAgICAgICAgIGVheCwgICAgZWJ4ICAgICAgICAgICAgIC8vIGVheCA9IDAxIDAyIDAyIDAzCisKKyAgICBzaGwgICAgICAgICBlYXgsICAgIDggICAgICAgICAgICAgICAvLyBlYXggPSB4eCAwMSAwMiAwMgorICAgIGFuZCAgICAgICAgIGVheCwgICAgMHhmZmZmMDAwMCAgICAgIC8vIGVheCA9IHh4IHh4IDAyIDAyCisKKyAgICBvciAgICAgICAgICBlYXgsICAgIGVieCAgICAgICAgICAgICAvLyBlYXggPSAwMSAwMiAwMiAwMgorCisgICAgc2hsICAgICAgICAgZWJ4LCAgICAxNiAgICAgICAgICAgICAgLy8gZWJ4ID0geHggeHggMDEgMDIKKyAgICBtb3ZkICAgICAgICBtbTEsICAgIGVheCAgICAgICAgICAgICAvLyBtbTEgPSAwMSAwMiAwMiAwMiB4eCB4eCB4eCB4eAorCisgICAgb3IgICAgICAgICAgZWJ4LCAgICBlY3ggICAgICAgICAgICAgLy8gZWJ4ID0gMDAgMDEgMDEgMDIKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTEgPSAwMSB4eCAwMiB4eCAwMiB4eCAwMiB4eAorCisgICAgbW92ZCAgICAgICAgbW0wLCAgICBlYnggICAgICAgICAgICAgLy8gbW0wID0gMDAgMDEgMDEgMDIKKyAgICBwbXVsbHcgICAgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAvLworCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0wID0gMDAgeHggMDEgeHggMDEgeHggMDIgeHgKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAvLworCisgICAgbW92ICAgICAgICAgW2VkaV0sICBlYnggICAgICAgICAgICAgLy8gd3JpdGVvdXRwdXQgMDAgeHggeHggeHgKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMQorCisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQKKyAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKKworICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03CisgICAgbW92ZCAgICAgICAgRFdPUkQgUHRyIFtlZGkrMV0sIG1tMAorCisgICAgcG9wIGVieAorCisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX21teAorICoKKyAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IDQgdG8gNSB1cC1zY2FsaW5nIG9mIGEgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9tbXgKKygKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAorKSB7CisgICh2b2lkKWRlc3Rfd2lkdGg7CisKKyAgX19hc20geworCisgICAgbW92ICAgICAgICAgZXNpLCAgICBzb3VyY2UKKyAgICBtb3YgICAgICAgICBlZGksICAgIGRlc3QKKworICAgIG1vdiAgICAgICAgIGVjeCwgICAgc291cmNlX3dpZHRoCisgICAgbGVhICAgICAgICAgZWR4LCAgICBbZXNpK2VjeC04XTsKKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgY29uc3Q0NV8xICAgICAgIC8vIG1tNSA9IDMzIHh4IDY2IHh4IDlhIHh4IGNkIHh4CisgICAgbW92cSAgICAgICAgbW02LCAgICBjb25zdDQ1XzIgICAgICAgLy8gbW02ID0gY2QgeHggOWEgeHggNjYgeHggMzMgeHgKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgcm91bmRfdmFsdWVzICAgICAvLyBtbTQgPSA4MCB4eCA4MCB4eCA4MCB4eCA4MCB4eAorICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03ICAgICAgICAgICAgIC8vIGNsZWFyIG1tNworCisgICAgaG9yaXpfbGluZV80XzVfbG9vcDoKKworICAgIG1vdnEgICAgICAgIG1tMCwgICAgUVdPUkQgUFRSIFtlc2ldICAgICAgICAgICAvLyBtbTAgPSAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworICAgIG1vdnEgICAgICAgIG1tMSwgICAgUVdPUkQgUFRSIFtlc2krMV07ICAgICAgICAvLyBtbTEgPSAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOAorCisgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgLy8gbW0yID0gMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKKyAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMSAgICAgICAgICAgICAvLyBtbTMgPSAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOAorCisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGldLCAgbW0wICAgICAgICAgICAgIC8vIHdyaXRlIG91dHB1dCAwMCB4eCB4eCB4eAorICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03ICAgICAgICAgICAgIC8vIG1tMCA9IDAwIHh4IDAxIHh4IDAyIHh4IDAzIHh4CisKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTEgPSAwMSB4eCAwMiB4eCAwMyB4eCAwNCB4eAorICAgIHBtdWxsdyAgICAgIG1tMCwgICAgbW01ICAgICAgICAgICAgIC8vIDAwKiA1MSAwMSoxMDIgMDIqMTU0IDAzKjIwNQorCisgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTYgICAgICAgICAgICAgLy8gMDEqMjA1IDAyKjE1NCAwMyoxMDIgMDQqIDUxCisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0yID0gMDQgeHggMDUgeHggMDYgeHggMDcgeHgKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpKzVdLCBtbTIgICAgICAgICAgICAvLyB3cml0ZSBvdXB1dCAwNSB4eCB4eCB4eAorICAgIHBtdWxsdyAgICAgIG1tMiwgICAgbW01ICAgICAgICAgICAgIC8vIDA0KiA1MSAwNSoxMDIgMDYqMTU0IDA3KjIwNQorCisgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0zID0gMDUgeHggMDYgeHggMDcgeHggMDggeHgKKyAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNiAgICAgICAgICAgICAvLyAwNSoyMDUgMDYqMTU0IDA3KjEwMiAwOCogNTEKKworICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW0xICAgICAgICAgICAgIC8vIGFkZGVkIHJvdW5kIHZhbHVlcworICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00CisKKyAgICBwc3JsdyAgICAgICBtbTAsICAgIDggICAgICAgICAgICAgICAvLyBvdXRwdXQ6IDAxIHh4IDAyIHh4IDAzIHh4IDA0IHh4CisgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTcKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpKzFdLCBtbTAgIC8vIHdyaXRlIG91dHB1dCAwMSAwMiAwMyAwNAorICAgIGFkZCAgICAgICAgIGVkaSwgICAgMTAKKworICAgIGFkZCAgICAgICAgIGVzaSwgICAgOAorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW0zICAgICAgICAgICAgIC8vCisKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNCAgICAgICAgICAgICAvLyBhZGRlZCByb3VuZCB2YWx1ZXMKKyAgICBjbXAgICAgICAgICBlc2ksICAgIGVkeAorCisgICAgcHNybHcgICAgICAgbW0yLCAgICA4CisgICAgcGFja3Vzd2IgICAgbW0yLCAgICBtbTcKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpLTRdLCBtbTIgLy8gd3JpdGVvdXRwdXQgMDYgMDcgMDggMDkKKyAgICBqbCAgICAgICAgIGhvcml6X2xpbmVfNF81X2xvb3AKKworLy8gRXhpdDoKKyAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2ldICAgICAgICAgICAvLyBtbTAgPSAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworICAgIG1vdnEgICAgICAgIG1tMSwgICAgbW0wICAgICAgICAgICAgIC8vIG1tMSA9IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisKKyAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAvLyBtbTIgPSAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworICAgIHBzcmxxICAgICAgIG1tMSwgICAgOCAgICAgICAgICAgICAgIC8vIG1tMSA9IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDAwCisKKyAgICBtb3ZxICAgICAgICBtbTMsICAgIG1hc2s0NSAgICAgICAgICAvLyBtbTMgPSAwMCAwMCAwMCAwMCAwMCAwMCBmZiAwMAorICAgIHBhbmQgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgIC8vIG1tMyA9IDAwIDAwIDAwIDAwIDAwIDAwIDA3IDAwCisKKyAgICBwc2xscSAgICAgICBtbTMsICAgIDggICAgICAgICAgICAgICAvLyBtbTMgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwNworICAgIHBvciAgICAgICAgIG1tMSwgICAgbW0zICAgICAgICAgICAgIC8vIG1tMSA9IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA3CisKKyAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMQorCisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGldLCAgbW0wICAgLy8gd3JpdGUgb3V0cHV0IDAwIHh4IHh4IHh4CisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0wID0gMDAgeHggMDEgeHggMDIgeHggMDMgeHgKKworICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgIC8vIG1tMSA9IDAxIHh4IDAyIHh4IDAzIHh4IDA0IHh4CisgICAgcG11bGx3ICAgICAgbW0wLCAgICBtbTUgICAgICAgICAgICAgLy8gMDAqIDUxIDAxKjEwMiAwMioxNTQgMDMqMjA1CisKKyAgICBwbXVsbHcgICAgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAvLyAwMSoyMDUgMDIqMTU0IDAzKjEwMiAwNCogNTEKKyAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTIgPSAwNCB4eCAwNSB4eCAwNiB4eCAwNyB4eAorCisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGkrNV0sIG1tMiAgLy8gd3JpdGUgb3VwdXQgMDUgeHggeHggeHgKKyAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNSAgICAgICAgICAgICAvLyAwNCogNTEgMDUqMTAyIDA2KjE1NCAwNyoyMDUKKworICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgIC8vIG1tMyA9IDA1IHh4IDA2IHh4IDA3IHh4IDA4IHh4CisgICAgcG11bGx3ICAgICAgbW0zLCAgICBtbTYgICAgICAgICAgICAgLy8gMDUqMjA1IDA2KjE1NCAwNyoxMDIgMDcqIDUxCisKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAvLyBhZGRlZCByb3VuZCB2YWx1ZXMKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tNAorCisgICAgcHNybHcgICAgICAgbW0wLCAgICA4ICAgICAgICAgICAgICAgLy8gb3V0cHV0OiAwMSB4eCAwMiB4eCAwMyB4eCAwNCB4eAorICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03ICAgICAgICAgICAgIC8vIDAxIDAyIDAzIDA0IHh4IHh4IHh4IHh4CisKKyAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaSsxXSwgbW0wICAvLyB3cml0ZSBvdXRwdXQgMDEgMDIgMDMgMDQKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tMyAgICAgICAgICAgICAvLworCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTQgICAgICAgICAgICAgLy8gYWRkZWQgcm91bmQgdmFsdWVzCisgICAgcHNybHcgICAgICAgbW0yLCAgICA4CisKKyAgICBwYWNrdXN3YiAgICBtbTIsICAgIG1tNworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpKzZdLCBtbTIgIC8vIHdyaXRlb3V0cHV0IDA2IDA3IDA4IDA5CisKKworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9tbXgKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiA0IHRvIDUgdXAtc2NhbGluZyBvZiBhIDQgcGl4ZWwgaGlnaCBiYW5kIG9mIHBpeGVscy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIHVzZXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJhbmQgYmVsb3cKKyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4gVGhlIGZ1bmN0aW9uIGFsc28gaGFzIGEgIkMiIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYwordm9pZCB2ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9tbXgKKygKKyAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCispIHsKKyAgX19hc20geworCisgICAgbW92ICAgICAgICAgZXNpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcgorICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQorCisgICAgbGVhICAgICAgICAgZWRpLCAgICBbZXNpK2VjeCoyXSAgICAgICAgICAgICAvLyB0b3cgbGluZXMgYmVsb3cKKyAgICBhZGQgICAgICAgICBlZGksICAgIGVjeCAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVlIGxpbmVzIGJlbG93CisKKyAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtbTcKKyAgICBtb3YgICAgICAgICBlZHgsICAgIGRlc3Rfd2lkdGggICAgICAgICAgICAgICAvLyBMb29wIGNvdW50ZXIKKworICAgIHZzXzRfNV9sb29wOgorCisgICAgbW92cSAgICAgICAgbW0wLCAgICBRV09SRCBwdHIgW2VzaV0gICAgICAgICAvLyBzcmNbMF07CisgICAgbW92cSAgICAgICAgbW0xLCAgICBRV09SRCBwdHIgW2VzaStlY3hdICAgICAvLyBzcmNbMV07CisKKyAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBjb3B5CisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgb25lX2ZpZnRoCisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAxLzUKKworICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAorCisgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81CisgICAgbW92cSAgICAgICAgbW02LCAgICBmb3VyX2ZpZnRocyAgICAgICAgICAgICAgIC8vIGNvbnN0YW4KKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiBsb3cgYgorICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNQorCisgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCisgICAgbW92cSAgICAgICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIGhpZ2ggYgorCisgICAgcG11bGx3ICAgICAgbW01LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogNC81CisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81ICsgYiAqIDQvNQorCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81ICsgYiAqIDQvNQorICAgIHBhZGR3ICAgICAgIG1tMCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAorCisgICAgcHNybHcgICAgICAgbW0yLCAgICA4CisgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXMgWzFdCisKKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VzaStlY3hdLCBtbTAgICAgICAgIC8vIHdyaXRlIGRlc1sxXQorICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wID0gc3JjWzJdCisKKyAgICAvLyBtbTEsIG1tMyAtLS0gU3JjWzFdCisgICAgLy8gbW0wIC0tLSBTcmNbMl0KKyAgICAvLyBtbTcgZm9yIHVucGFja2luZworCisgICAgbW92cSAgICAgICAgbW01LCAgICB0d29fZmlmdGhzCisgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorCisgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBiICogMi81CisgICAgbW92cSAgICAgICAgbW02LCAgICB0aHJlZV9maWZ0aHMKKworCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKKyAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMKKyAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKKworICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQorICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0yCisKKyAgICBwbXVsbHcgICAgICBtbTUsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUKKyAgICBwYWRkdyAgICAgICBtbTEsICAgIG1tNCAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUgKyBjICogMy81CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUgKyBjICogMy81CisgICAgcGFkZHcgICAgICAgbW0xLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKworICAgIHBhZGR3ICAgICAgIG1tMywgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisgICAgcHNybHcgICAgICAgbW0xLCAgICA4CisKKyAgICBwc3JsdyAgICAgICBtbTMsICAgIDgKKyAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1syXQorCisgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlc2krZWN4KjJdLCBtbTEgICAgICAvLyB3cml0ZSBkZXNbMl0KKyAgICBtb3ZxICAgICAgICBtbTEsICAgIFtlZGldICAgICAgICAgICAgICAgICAgIC8vIG1tMT1TcmNbM107CisKKyAgICAvLyBtbTAsIG1tMiAtLS0gU3JjWzJdCisgICAgLy8gbW0xIC0tLSBTcmNbM10KKyAgICAvLyBtbTYgLS0tIDMvNQorICAgIC8vIG1tNyBmb3IgdW5wYWNraW5nCisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUKKyAgICBtb3ZxICAgICAgICBtbTUsICAgIHR3b19maWZ0aHMgICAgICAgICAgICAgICAvLyBtbTUgPSAyLzUKKworICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKyAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUKKworICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKworICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2gKKyAgICBwbXVsbHcgICAgICBtbTQsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGQgKiAyLzUKKworICAgIG1vdnEgICAgICAgIG1tNiwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKyAgICBwbXVsbHcgICAgICBtbTYsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGQgKiAyLzUKKworICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNSArIGQgKiAyLzUKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUgKyBkICogMi81CisKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisKKyAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKKyAgICBwc3JsdyAgICAgICBtbTIsICAgIDgKKworICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gZGVzWzNdCisgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGldLCBtbTAgICAgICAgICAgICAvLyB3cml0ZSBkZXNbM10KKworICAgIC8vICBtbTEsIG1tMyAtLS0gU3JjWzNdCisgICAgLy8gIG1tNyAtLSBjbGVhcmVkIGZvciB1bnBhY2tpbmcKKworICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VkaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wLCBTcmNbMF0gb2YgdGhlIG5leHQgZ3JvdXAKKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgIC8vIG1tNSA9IDQvNQorICAgIHBtdWxsdyAgICAgIG1tMSwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDQvNQorCisgICAgbW92cSAgICAgICAgbW02LCAgICBvbmVfZmlmdGggICAgICAgICAgICAgICAgLy8gbW02ID0gMS81CisgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorCisgICAgcG11bGx3ICAgICAgbW0zLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBkICogNC81CisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93CisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGFuICogMS81CisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaAorCisgICAgcGFkZHcgICAgICAgbW0xLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBkICogNC81ICsgYW4gKiAxLzUKKyAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGFuICogMS81CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIG1tMiAgICAgICAgICAgICAgICAgICAgIC8vIGQgKiA0LzUgKyBhbiAqIDEvNQorICAgIHBhZGR3ICAgICAgIG1tMSwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorICAgIHBzcmx3ICAgICAgIG1tMSwgICAgOAorCisgICAgcHNybHcgICAgICAgbW0zLCAgICA4CisgICAgcGFja3Vzd2IgICAgbW0xLCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbNF0KKworICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZWRpK2VjeF0sIG1tMSAgICAgICAgLy8gd3JpdGUgZGVzWzRdCisKKyAgICBhZGQgICAgICAgICBlZGksICAgIDgKKyAgICBhZGQgICAgICAgICBlc2ksICAgIDgKKworICAgIHN1YiAgICAgICAgIGVkeCwgICAgOAorICAgIGpnICAgICAgICAgdnNfNF81X2xvb3AKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9tbXgKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiBOb25lCisgKgorICogIEZVTkNUSU9OICAgICAgOiA0IHRvIDUgdXAtc2NhbGluZyBvZiB0aGUgbGFzdCA0LXBpeGVsIGhpZ2ggYmFuZCBpbiBhbiBpbWFnZS4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIHVzZXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJhbmQgYmVsb3cKKyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4gVGhlIGZ1bmN0aW9uIGFsc28gaGFzIGFuICJDIiBvbmx5CisgKiAgICAgICAgICAgICAgICAgIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9tbXgKKygKKyAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCisgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCispIHsKKyAgX19hc20geworICAgIG1vdiAgICAgICAgIGVzaSwgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAgICBtb3YgICAgICAgICBlY3gsICAgIGRlc3RfcGl0Y2ggICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBpdGNoIHNpemUKKworICAgIGxlYSAgICAgICAgIGVkaSwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gdG93IGxpbmVzIGJlbG93CisgICAgYWRkICAgICAgICAgZWRpLCAgICBlY3ggICAgICAgICAgICAgICAgICAgICAvLyB0aHJlZSBsaW5lcyBiZWxvdworCisgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgbW03CisgICAgbW92ICAgICAgICAgZWR4LCAgICBkZXN0X3dpZHRoICAgICAgICAgICAgICAgLy8gTG9vcCBjb3VudGVyCisKKyAgICBsYXN0X3ZzXzRfNV9sb29wOgorCisgICAgbW92cSAgICAgICAgbW0wLCAgICBRV09SRCBwdHIgW2VzaV0gICAgICAgICAvLyBzcmNbMF07CisgICAgbW92cSAgICAgICAgbW0xLCAgICBRV09SRCBwdHIgW2VzaStlY3hdICAgICAvLyBzcmNbMV07CisKKyAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBjb3B5CisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgb25lX2ZpZnRoCisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAxLzUKKworICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAorCisgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81CisgICAgbW92cSAgICAgICAgbW02LCAgICBmb3VyX2ZpZnRocyAgICAgICAgICAgICAgIC8vIGNvbnN0YW4KKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiBsb3cgYgorICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNQorCisgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCisgICAgbW92cSAgICAgICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIGhpZ2ggYgorCisgICAgcG11bGx3ICAgICAgbW01LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogNC81CisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81ICsgYiAqIDQvNQorCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81ICsgYiAqIDQvNQorICAgIHBhZGR3ICAgICAgIG1tMCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAorCisgICAgcHNybHcgICAgICAgbW0yLCAgICA4CisgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXMgWzFdCisKKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VzaStlY3hdLCBtbTAgICAgICAgIC8vIHdyaXRlIGRlc1sxXQorICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wID0gc3JjWzJdCisKKyAgICAvLyBtbTEsIG1tMyAtLS0gU3JjWzFdCisgICAgLy8gbW0wIC0tLSBTcmNbMl0KKyAgICAvLyBtbTcgZm9yIHVucGFja2luZworCisgICAgbW92cSAgICAgICAgbW01LCAgICB0d29fZmlmdGhzCisgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorCisgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBiICogMi81CisgICAgbW92cSAgICAgICAgbW02LCAgICB0aHJlZV9maWZ0aHMKKworCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKKyAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMKKyAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKKworICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQorICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0yCisKKyAgICBwbXVsbHcgICAgICBtbTUsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUKKyAgICBwYWRkdyAgICAgICBtbTEsICAgIG1tNCAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUgKyBjICogMy81CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUgKyBjICogMy81CisgICAgcGFkZHcgICAgICAgbW0xLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKworICAgIHBhZGR3ICAgICAgIG1tMywgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisgICAgcHNybHcgICAgICAgbW0xLCAgICA4CisKKyAgICBwc3JsdyAgICAgICBtbTMsICAgIDgKKyAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1syXQorCisgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlc2krZWN4KjJdLCBtbTEgICAgICAvLyB3cml0ZSBkZXNbMl0KKyAgICBtb3ZxICAgICAgICBtbTEsICAgIFtlZGldICAgICAgICAgICAgICAgICAgIC8vIG1tMT1TcmNbM107CisKKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VkaStlY3hdLCBtbTEgICAgICAgIC8vIHdyaXRlIGRlc1s0XTsKKworICAgIC8vIG1tMCwgbW0yIC0tLSBTcmNbMl0KKyAgICAvLyBtbTEgLS0tIFNyY1szXQorICAgIC8vIG1tNiAtLS0gMy81CisgICAgLy8gbW03IGZvciB1bnBhY2tpbmcKKworICAgIHBtdWxsdyAgICAgIG1tMCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQorICAgIG1vdnEgICAgICAgIG1tNSwgICAgdHdvX2ZpZnRocyAgICAgICAgICAgICAgIC8vIG1tNSA9IDIvNQorCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorICAgIHBtdWxsdyAgICAgIG1tMiwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQorCisgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93CisgICAgbW92cSAgICAgICAgbW00LCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorCisgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaAorICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDIvNQorCisgICAgbW92cSAgICAgICAgbW02LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorICAgIHBtdWxsdyAgICAgIG1tNiwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDIvNQorCisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81ICsgZCAqIDIvNQorICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNSArIGQgKiAyLzUKKworICAgIHBhZGR3ICAgICAgIG1tMCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKworICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAorICAgIHBzcmx3ICAgICAgIG1tMiwgICAgOAorCisgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbM10KKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VkaV0sIG1tMCAgICAgICAgICAgIC8vIHdyaXRlIGRlc1szXQorCisgICAgLy8gIG1tMSwgbW0zIC0tLSBTcmNbM10KKyAgICAvLyAgbW03IC0tIGNsZWFyZWQgZm9yIHVucGFja2luZworICAgIGFkZCAgICAgICAgIGVkaSwgICAgOAorICAgIGFkZCAgICAgICAgIGVzaSwgICAgOAorCisgICAgc3ViICAgICAgICAgZWR4LCAgICA4CisgICAgamcgICAgICAgICAgbGFzdF92c180XzVfbG9vcAorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiB2ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9tbXgKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiAzIHRvIDUgdXAtc2NhbGluZyBvZiBhIDMtcGl4ZWwgaGlnaCBiYW5kIG9mIHBpeGVscy4KKyAqCisgKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIHVzZXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJhbmQgYmVsb3cKKyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4gVGhlIGZ1bmN0aW9uIGFsc28gaGFzIGFuICJDIiBvbmx5CisgKiAgICAgICAgICAgICAgICAgIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfbW14CisoCisgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAorICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAorKSB7CisgIF9fYXNtIHsKKyAgICBtb3YgICAgICAgICBlc2ksICAgIGRlc3QgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCisgICAgbW92ICAgICAgICAgZWN4LCAgICBkZXN0X3BpdGNoICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwaXRjaCBzaXplCisKKyAgICBsZWEgICAgICAgICBlZGksICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vIHRvdyBsaW5lcyBiZWxvdworICAgIGFkZCAgICAgICAgIGVkaSwgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWUgbGluZXMgYmVsb3cKKworICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IG1tNworICAgIG1vdiAgICAgICAgIGVkeCwgICAgZGVzdF93aWR0aCAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgorCisgICAgdnNfM181X2xvb3A6CisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgIFFXT1JEIHB0ciBbZXNpXSAgICAgICAgIC8vIHNyY1swXTsKKyAgICBtb3ZxICAgICAgICBtbTEsICAgIFFXT1JEIHB0ciBbZXNpK2VjeF0gICAgIC8vIHNyY1sxXTsKKworICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkKKyAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAorCisgICAgbW92cSAgICAgICAgbW01LCAgICB0d29fZmlmdGhzICAgICAgICAgICAgICAgLy8gbW01ID0gMi81CisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAyLzUKKworICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAorCisgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81CisgICAgbW92cSAgICAgICAgbW02LCAgICB0aHJlZV9maWZ0aHMgICAgICAgICAgICAgLy8gbW02ID0gMy81CisKKyAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgbG93IGIKKyAgICBwbXVsbHcgICAgICBtbTQsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAzLzUKKworICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2ggdG8gd29yZAorICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiBoaWdoIGIKKworICAgIHBtdWxsdyAgICAgIG1tNSwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDMvNQorICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDIvNSArIGIgKiAzLzUKKworICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDIvNSArIGIgKiAzLzUKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorCisgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKyAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKKworICAgIHBzcmx3ICAgICAgIG1tMiwgICAgOAorICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gZGVzIFsxXQorCisgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlc2krZWN4XSwgbW0wICAgICAgICAvLyB3cml0ZSBkZXNbMV0KKyAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vIG1tMCA9IHNyY1syXQorCisgICAgLy8gbW0xLCBtbTMgLS0tIFNyY1sxXQorICAgIC8vIG1tMCAtLS0gU3JjWzJdCisgICAgLy8gbW03IGZvciB1bnBhY2tpbmcKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gYiBsb3cKKyAgICBwbXVsbHcgICAgICBtbTEsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBiICogNC81IGxvdworCisgICAgbW92cSAgICAgICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBiIGhpZ2gKKyAgICBwbXVsbHcgICAgICBtbTMsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBiICogNC81IGhpZ2gKKworICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gYworICAgIHBtdWxsdyAgICAgIG1tNCwgICAgb25lX2ZpZnRoICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUKKworICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gYyBsb3cKKyAgICBwbXVsbHcgICAgICBtbTUsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBiICogMS81CisKKyAgICBtb3ZxICAgICAgICBtbTYsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGxvdworICAgIHB1bnBja2hidyAgIG1tMiwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gYyBoaWdoCisKKyAgICBwbXVsbHcgICAgICBtbTYsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBjICogMS81IGxvdworICAgIG1vdnEgICAgICAgIG1tNywgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMgaGlnaAorCisgICAgcG11bGx3ICAgICAgbW03LCAgICBvbmVfZmlmdGggICAgICAgICAgICAgICAgLy8gYyAqIDEvNSBoaWdoCisgICAgcGFkZHcgICAgICAgbW0xLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogNC81ICsgYyAqIDEvNSBsb3cKKworICAgIHBhZGR3ICAgICAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNSArIGMgKiAxLzUgaGlnaAorICAgIG1vdnEgICAgICAgIG1tNiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMgbG93CisKKyAgICBwbXVsbHcgICAgICBtbTYsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBjICogNC81IGxvdworICAgIG1vdnEgICAgICAgIG1tNywgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMgaGlnaAorCisgICAgcG11bGx3ICAgICAgbW03LCAgICBmb3VyX2ZpZnRocyAgICAgICAgICAgICAgLy8gYyAqIDQvNSBoaWdoCisKKyAgICBwYWRkdyAgICAgICBtbTQsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUgKyBjICogNC81IGxvdworICAgIHBhZGR3ICAgICAgIG1tNSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDEvNSArIGMgKiA0LzUgaGlnaAorCisgICAgcGFkZHcgICAgICAgbW0xLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorCisgICAgcHNybHcgICAgICAgbW0xLCAgICA4CisgICAgcHNybHcgICAgICAgbW0zLCAgICA4CisKKyAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1syXQorICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZXNpK2VjeCoyXSwgbW0xICAgICAgLy8gd3JpdGUgZGVzWzJdCisKKyAgICBwYWRkdyAgICAgICBtbTQsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorICAgIHBhZGR3ICAgICAgIG1tNSwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisKKyAgICBwc3JsdyAgICAgICBtbTQsICAgIDgKKyAgICBwc3JsdyAgICAgICBtbTUsICAgIDgKKworICAgIHBhY2t1c3diICAgIG1tNCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZGVzWzNdCisgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGldLCBtbTQgICAgICAgICAgICAvLyB3cml0ZSBkZXNbM10KKworICAgIC8vICBtbTAsIG1tMiAtLS0gU3JjWzNdCisKKyAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG1tNyBmb3IgdW5wYWNraW5nCisgICAgbW92cSAgICAgICAgbW0xLCAgICBbZWRpK2VjeCoyXSAgICAgICAgICAgICAvLyBtbTEgPSBTcmNbMF0gb2YgdGhlIG5leHQgZ3JvdXAKKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgdGhyZWVfZmlmdGhzICAgICAgICAgICAgIC8vIG1tNSA9IDMvNQorICAgIHBtdWxsdyAgICAgIG1tMCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDMvNQorCisgICAgbW92cSAgICAgICAgbW02LCAgICB0d29fZmlmdGhzICAgICAgICAgICAgICAgIC8vIG1tNiA9IDIvNQorICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKKworICAgIHBtdWxsdyAgICAgIG1tMiwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDMvNQorICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdworCisgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBhbiAqIDIvNQorICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2gKKworICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDMvNSArIGFuICogMi81CisgICAgcG11bGx3ICAgICAgbW0zLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBhbiAqIDIvNQorCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBkICogMy81ICsgYW4gKiAyLzUKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorCisgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKyAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKKworICAgIHBzcmx3ICAgICAgIG1tMiwgICAgOAorICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gZGVzWzRdCisKKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VkaStlY3hdLCBtbTAgICAgICAgIC8vIHdyaXRlIGRlc1s0XQorCisgICAgYWRkICAgICAgICAgZWRpLCAgICA4CisgICAgYWRkICAgICAgICAgZXNpLCAgICA4CisKKyAgICBzdWIgICAgICAgICBlZHgsICAgIDgKKyAgICBqZyAgICAgICAgICB2c18zXzVfbG9vcAorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBsYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX21teAorICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IDMgdG8gNSB1cC1zY2FsaW5nIG9mIGEgMy1waXhlbCBoaWdoIGJhbmQgb2YgcGl4ZWxzLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdworICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLiBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgYW4gIkMiIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYwordm9pZCBsYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX21teAorKAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKKyAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKKykgeworICBfX2FzbSB7CisgICAgbW92ICAgICAgICAgZXNpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcgorICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQorCisgICAgbGVhICAgICAgICAgZWRpLCAgICBbZXNpK2VjeCoyXSAgICAgICAgICAgICAvLyB0b3cgbGluZXMgYmVsb3cKKyAgICBhZGQgICAgICAgICBlZGksICAgIGVjeCAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVlIGxpbmVzIGJlbG93CisKKyAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtbTcKKyAgICBtb3YgICAgICAgICBlZHgsICAgIGRlc3Rfd2lkdGggICAgICAgICAgICAgICAvLyBMb29wIGNvdW50ZXIKKworCisgICAgbGFzdF92c18zXzVfbG9vcDoKKworICAgIG1vdnEgICAgICAgIG1tMCwgICAgUVdPUkQgcHRyIFtlc2ldICAgICAgICAgLy8gc3JjWzBdOworICAgIG1vdnEgICAgICAgIG1tMSwgICAgUVdPUkQgcHRyIFtlc2krZWN4XSAgICAgLy8gc3JjWzFdOworCisgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weQorICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdyB0byB3b3JkCisKKyAgICBtb3ZxICAgICAgICBtbTUsICAgIHR3b19maWZ0aHMgICAgICAgICAgICAgICAvLyBtbTUgPSAyLzUKKyAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKKworICAgIHBtdWxsdyAgICAgIG1tMCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDIvNQorCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQorICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdyB0byB3b3JkCisKKyAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAyLzUKKyAgICBtb3ZxICAgICAgICBtbTYsICAgIHRocmVlX2ZpZnRocyAgICAgICAgICAgICAvLyBtbTYgPSAzLzUKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiBsb3cgYgorICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDMvNQorCisgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCisgICAgbW92cSAgICAgICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIGhpZ2ggYgorCisgICAgcG11bGx3ICAgICAgbW01LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogMy81CisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81ICsgYiAqIDMvNQorCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81ICsgYiAqIDMvNQorICAgIHBhZGR3ICAgICAgIG1tMCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAorCisgICAgcHNybHcgICAgICAgbW0yLCAgICA4CisgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXMgWzFdCisKKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VzaStlY3hdLCBtbTAgICAgICAgIC8vIHdyaXRlIGRlc1sxXQorICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wID0gc3JjWzJdCisKKworCisgICAgLy8gbW0xLCBtbTMgLS0tIFNyY1sxXQorICAgIC8vIG1tMCAtLS0gU3JjWzJdCisgICAgLy8gbW03IGZvciB1bnBhY2tpbmcKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gYiBsb3cKKyAgICBwbXVsbHcgICAgICBtbTEsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBiICogNC81IGxvdworCisgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGkrZWN4XSwgbW0wICAgICAgICAvLyB3cml0ZSBkZXNbNF0KKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gYiBoaWdoCisgICAgcG11bGx3ICAgICAgbW0zLCAgICBmb3VyX2ZpZnRocyAgICAgICAgICAgICAgLy8gYiAqIDQvNSBoaWdoCisKKyAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIGMKKyAgICBwbXVsbHcgICAgICBtbTQsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBiICogMS81CisKKyAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGMgbG93CisgICAgcG11bGx3ICAgICAgbW01LCAgICBvbmVfZmlmdGggICAgICAgICAgICAgICAgLy8gYiAqIDEvNQorCisgICAgbW92cSAgICAgICAgbW02LCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGNvcHkgb2YgYyBsb3cKKyAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGMgaGlnaAorCisgICAgcG11bGx3ICAgICAgbW02LCAgICBvbmVfZmlmdGggICAgICAgICAgICAgICAgLy8gYyAqIDEvNSBsb3cKKyAgICBtb3ZxICAgICAgICBtbTcsICAgIG1tMiAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGhpZ2gKKworICAgIHBtdWxsdyAgICAgIG1tNywgICAgb25lX2ZpZnRoICAgICAgICAgICAgICAgIC8vIGMgKiAxLzUgaGlnaAorICAgIHBhZGR3ICAgICAgIG1tMSwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNSArIGMgKiAxLzUgbG93CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiA0LzUgKyBjICogMS81IGhpZ2gKKyAgICBtb3ZxICAgICAgICBtbTYsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGxvdworCisgICAgcG11bGx3ICAgICAgbW02LCAgICBmb3VyX2ZpZnRocyAgICAgICAgICAgICAgLy8gYyAqIDQvNSBsb3cKKyAgICBtb3ZxICAgICAgICBtbTcsICAgIG1tMiAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGhpZ2gKKworICAgIHBtdWxsdyAgICAgIG1tNywgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgIC8vIGMgKiA0LzUgaGlnaAorCisgICAgcGFkZHcgICAgICAgbW00LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogMS81ICsgYyAqIDQvNSBsb3cKKyAgICBwYWRkdyAgICAgICBtbTUsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUgKyBjICogNC81IGhpZ2gKKworICAgIHBhZGR3ICAgICAgIG1tMSwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4CisgICAgcGFkZHcgICAgICAgbW0zLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKworICAgIHBzcmx3ICAgICAgIG1tMSwgICAgOAorICAgIHBzcmx3ICAgICAgIG1tMywgICAgOAorCisgICAgcGFja3Vzd2IgICAgbW0xLCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbMl0KKyAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VzaStlY3gqMl0sIG1tMSAgICAgIC8vIHdyaXRlIGRlc1syXQorCisgICAgcGFkZHcgICAgICAgbW00LCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKKyAgICBwYWRkdyAgICAgICBtbTUsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAorCisgICAgcHNybHcgICAgICAgbW00LCAgICA4CisgICAgcHNybHcgICAgICAgbW01LCAgICA4CisKKyAgICBwYWNrdXN3YiAgICBtbTQsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1szXQorICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZWRpXSwgbW00ICAgICAgICAgICAgLy8gd3JpdGUgZGVzWzNdCisKKyAgICAvLyAgbW0wLCBtbTIgLS0tIFNyY1szXQorCisgICAgYWRkICAgICAgICAgZWRpLCAgICA4CisgICAgYWRkICAgICAgICAgZXNpLCAgICA4CisKKyAgICBzdWIgICAgICAgICBlZHgsICAgIDgKKyAgICBqZyAgICAgICAgICBsYXN0X3ZzXzNfNV9sb29wCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teAorICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IDEgdG8gMiB1cC1zY2FsaW5nIG9mIGEgYmFuZCBvZiBwaXhlbHMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93CisgKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuIFRoZSBmdW5jdGlvbiBhbHNvIGhhcyBhbiAiQyIgb25seQorICogICAgICAgICAgICAgICAgICB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teAorKAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKKyAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKKykgeworICBfX2FzbSB7CisKKyAgICBtb3YgICAgICAgICBlc2ksICAgIGRlc3QgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCisgICAgbW92ICAgICAgICAgZWN4LCAgICBkZXN0X3BpdGNoICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwaXRjaCBzaXplCisKKyAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtbTcKKyAgICBtb3YgICAgICAgICBlZHgsICAgIGRlc3Rfd2lkdGggICAgICAgICAgICAgICAvLyBMb29wIGNvdW50ZXIKKworICAgIHZzXzFfMl9sb29wOgorCisgICAgbW92cSAgICAgICAgbW0wLCAgICBbZXNpXSAgICAgICAgICAgICAgICAgICAvLyBnZXQgU3JjWzBdCisgICAgbW92cSAgICAgICAgbW0xLCAgICBbZXNpICsgZWN4ICogMl0gICAgICAgICAvLyBnZXQgU3JjWzFdCisKKyAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBiZWZvcmUgdW5wYWNrCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGNvcHkgYmVmb3JlIHVucGFjaworCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBsb3cgU3JjWzBdCisgICAgbW92cSAgICAgICAgbW02LCAgICBmb3VyX29uZXMgICAgICAgICAgICAgICAgLy8gbW02PSAxLCAxLCAxLCAxCisKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyBTcmNbMV0KKyAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyAoYSArIGIpCisKKyAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGhpZ2ggU3JjWzBdCisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBsb3cgKGEgKyBiICsgMSkKKworICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03CisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIChhICsgYiApCisKKyAgICBwc3JhdyAgICAgICBtbTAsICAgIDEgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyAoYSArIGIgKzEgKS8yCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIChhICsgYiArIDEpCisKKyAgICBwc3JhdyAgICAgICBtbTIsICAgIDEgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZ2ggKGEgKyBiICsgMSkvMgorICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gcGFjayByZXN1bHRzCisKKyAgICBtb3ZxICAgICAgICBbZXNpK2VjeF0sIG1tMCAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG91dCBlaWdodCBieXRlcworICAgIGFkZCAgICAgICAgIGVzaSwgICAgOAorCisgICAgc3ViICAgICAgICAgZWR4LCAgICA4CisgICAgamcgICAgICAgICAgdnNfMV8yX2xvb3AKKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBsYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teAorICoKKyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IDEgdG8gMiB1cC1zY2FsaW5nIG9mIGJhbmQgb2YgcGl4ZWxzLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdworICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLiBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgYW4gIkMiIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYwordm9pZCBsYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teAorKAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKKyAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKKykgeworICBfX2FzbSB7CisgICAgbW92ICAgICAgICAgZXNpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcgorICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQorCisgICAgbW92ICAgICAgICAgZWR4LCAgICBkZXN0X3dpZHRoICAgICAgICAgICAgICAgLy8gTG9vcCBjb3VudGVyCisKKyAgICBsYXN0X3ZzXzFfMl9sb29wOgorCisgICAgbW92cSAgICAgICAgbW0wLCAgICBbZXNpXSAgICAgICAgICAgICAgICAgICAvLyBnZXQgU3JjWzBdCisgICAgbW92cSAgICAgICAgW2VzaStlY3hdLCBtbTAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBvdXQgZWlnaHQgYnl0ZXMKKworICAgIGFkZCAgICAgICAgIGVzaSwgICAgOAorICAgIHN1YiAgICAgICAgIGVkeCwgICAgOAorCisgICAgamcgICAgICAgICBsYXN0X3ZzXzFfMl9sb29wCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV8xXzJfc2NhbGUKKyAqCisgKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6CisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDoKKyAqCisgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCisgKgorICogIFJFVFVSTlMgICAgICAgOiB2b2lkCisgKgorICogIEZVTkNUSU9OICAgICAgOiAxIHRvIDIgdXAtc2NhbGluZyBvZiBhIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIGhvcml6b250YWxfbGluZV8xXzJfc2NhbGVfbW14CisoCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKKyAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKKykgeworICAodm9pZCkgZGVzdF93aWR0aDsKKworICBfX2FzbSB7CisgICAgbW92ICAgICAgICAgZXNpLCAgICBzb3VyY2UKKyAgICBtb3YgICAgICAgICBlZGksICAgIGRlc3QKKworICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03CisgICAgbW92cSAgICAgICAgbW02LCAgICBmb3VyX29uZXMKKworICAgIG1vdiAgICAgICAgIGVjeCwgICAgc291cmNlX3dpZHRoCisKKyAgICBoc18xXzJfbG9vcDoKKworICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaV0KKyAgICBtb3ZxICAgICAgICBtbTEsICAgIFtlc2krMV0KKworICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEKKworICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0wCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKKworICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03CisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTEKKworICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW02CisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcKKworICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03CisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMKKworICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW02CisgICAgcHNyYXcgICAgICAgbW0wLCAgICAxCisKKyAgICBwc3JhdyAgICAgICBtbTIsICAgIDEKKyAgICBwYWNrdXN3YiAgICBtbTAsICAgIG1tMgorCisgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTQKKyAgICBwdW5wY2tsYncgICBtbTIsICAgIG1tMAorCisgICAgbW92cSAgICAgICAgW2VkaV0sICBtbTIKKyAgICBwdW5wY2toYncgICBtbTQsICAgIG1tMAorCisgICAgbW92cSAgICAgICAgW2VkaSs4XSwgbW00CisgICAgYWRkICAgICAgICAgZXNpLCAgICA4CisKKyAgICBhZGQgICAgICAgICBlZGksICAgIDE2CisgICAgc3ViICAgICAgICAgZWN4LCAgICA4CisKKyAgICBjbXAgICAgICAgICBlY3gsICAgIDgKKyAgICBqZyAgICAgICAgICBoc18xXzJfbG9vcAorCisvLyBsYXN0IGVpZ2h0IHBpeGVsCisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2ldCisgICAgbW92cSAgICAgICAgbW0xLCAgICBtbTAKKworICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEKKworICAgIHBzcmxxICAgICAgIG1tMSwgICAgOAorICAgIHBzcmxxICAgICAgIG1tMywgICAgNTYKKworICAgIHBzbGxxICAgICAgIG1tMywgICAgNTYKKyAgICBwb3IgICAgICAgICBtbTEsICAgIG1tMworCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEKKyAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMAorCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKKyAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNworCisgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTEKKyAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tNgorCisgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcKKyAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNworCisgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMKKyAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNgorCisgICAgcHNyYXcgICAgICAgbW0wLCAgICAxCisgICAgcHNyYXcgICAgICAgbW0yLCAgICAxCisKKyAgICBwYWNrdXN3YiAgICBtbTAsICAgIG1tMgorICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW00CisKKyAgICBwdW5wY2tsYncgICBtbTIsICAgIG1tMAorICAgIG1vdnEgICAgICAgIFtlZGldLCAgbW0yCisKKyAgICBwdW5wY2toYncgICBtbTQsICAgIG1tMAorICAgIG1vdnEgICAgICAgIFtlZGkrOF0sIG1tNAorICB9Cit9CisKKworCisKKworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDU0XzJbXSA9IHsgIDAsICA2NCwgMTI4LCAxOTIgfTsKK19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3Q1NF8xW10gPSB7MjU2LCAxOTIsIDEyOCwgIDY0IH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV81XzRfc2NhbGVfbW14CisgKgorICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDogU3RyaWRlIG9mIHNvdXJjZS4KKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gc2NhbGluZyB1cCBieSA0IHRvIDUuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIGhvcml6b250YWxfbGluZV81XzRfc2NhbGVfbW14CisoCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKKyAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKKyAgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKKykgeworICAvKgorICB1bnNpZ25lZCBpOworICB1bnNpZ25lZCBpbnQgYSwgYiwgYywgZCwgZTsKKyAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOworCisgICh2b2lkKSBkZXN0X3dpZHRoOworCisgIGZvciAoIGk9MDsgaTxzb3VyY2Vfd2lkdGg7IGkrPTUgKQorICB7CisgICAgICBhID0gc3JjWzBdOworICAgICAgYiA9IHNyY1sxXTsKKyAgICAgIGMgPSBzcmNbMl07CisgICAgICBkID0gc3JjWzNdOworICAgICAgZSA9IHNyY1s0XTsKKworICAgICAgZGVzWzBdID0gYTsKKyAgICAgIGRlc1sxXSA9ICgoYioxOTIgKyBjKiA2NCArIDEyOCk+PjgpOworICAgICAgZGVzWzJdID0gKChjKjEyOCArIGQqMTI4ICsgMTI4KT4+OCk7CisgICAgICBkZXNbM10gPSAoKGQqIDY0ICsgZSoxOTIgKyAxMjgpPj44KTsKKworICAgICAgc3JjICs9IDU7CisgICAgICBkZXMgKz0gNDsKKyAgfQorICAqLworICAodm9pZCkgZGVzdF93aWR0aDsKKworICBfX2FzbSB7CisKKyAgICBtb3YgICAgICAgICBlc2ksICAgICAgICBzb3VyY2U7CisgICAgbW92ICAgICAgICAgZWRpLCAgICAgICAgZGVzdDsKKworICAgIG1vdiAgICAgICAgIGVjeCwgICAgICAgIHNvdXJjZV93aWR0aDsKKyAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBjb25zdDU0XzE7CisKKyAgICBweG9yICAgICAgICBtbTcsICAgICAgICBtbTc7CisgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgY29uc3Q1NF8yOworCisgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgcm91bmRfdmFsdWVzOworICAgIGxlYSAgICAgICAgIGVkeCwgICAgICAgIFtlc2krZWN4XTsKKyAgICBob3Jpem9udGFsX2xpbmVfNV80X2xvb3A6CisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgIFtlc2ldOworICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wOworICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisKKyAgICBwc3JscSAgICAgICBtbTAsICAgICAgICA4OworICAgIDAxIDAyIDAzIDA0IDA1IDA2IDA3IHh4CisgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgbW03OworICAgIHh4IDAwIHh4IDAxIHh4IDAyIHh4IDAzCisKKyAgICBwdW5wY2tsYncgICBtbTAsICAgICAgICBtbTc7CisgICAgeHggMDEgeHggMDIgeHggMDMgeHggMDQKKyAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTUKKworICAgIHBtdWxsdyAgICAgIG1tMCwgICAgICAgIG1tNgorICAgIGFkZCAgICAgICAgIGVzaSwgICAgICAgIDUKKworICAgIGFkZCAgICAgICAgIGVkaSwgICAgICAgIDQKKyAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTAKKworICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIG1tNAorICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDgKKworICAgIGNtcCAgICAgICAgIGVzaSwgICAgICAgIGVkeAorICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgIG1tNworCisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGktNF0sIG1tMQorCisgICAgamwgICAgICAgICAgaG9yaXpvbnRhbF9saW5lXzVfNF9sb29wCisKKyAgfQorCit9CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IG9uZV9mb3VydGhzW10gICA9IHsgIDY0LCAgNjQsICA2NCwgNjQgIH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHR3b19mb3VydGhzW10gICA9IHsgMTI4LCAxMjgsIDEyOCwgMTI4IH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRocmVlX2ZvdXJ0aHNbXSA9IHsgMTkyLCAxOTIsIDE5MiwgMTkyIH07CisKK3N0YXRpYwordm9pZCB2ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9tbXgodW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKworICBfX2FzbSB7CisgICAgcHVzaCAgICAgICAgZWJ4CisKKyAgICBtb3YgICAgICAgICBlc2ksICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAgICBtb3YgICAgICAgICBlY3gsICAgIHNyY19waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQorCisgICAgbW92ICAgICAgICAgZWRpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyB0b3cgbGluZXMgYmVsb3cKKyAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtbTcKKworICAgIG1vdiAgICAgICAgIGVkeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgorICAgIG1vdiAgICAgICAgIGVieCwgICAgZGVzdF93aWR0aAorCisgICAgdnNfNV80X2xvb3A6CisKKyAgICBtb3ZkICAgICAgICBtbTAsICAgIERXT1JEIHB0ciBbZXNpXSAgICAgICAgIC8vIHNyY1swXTsKKyAgICBtb3ZkICAgICAgICBtbTEsICAgIERXT1JEIHB0ciBbZXNpK2VjeF0gICAgIC8vIHNyY1sxXTsKKworICAgIG1vdmQgICAgICAgIG1tMiwgICAgRFdPUkQgcHRyIFtlc2krZWN4KjJdCisgICAgbGVhICAgICAgICAgZWF4LCAgICBbZXNpK2VjeCoyXSAgICAgICAgICAgICAvLworCisgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKKyAgICBwdW5wY2tsYncgICBtbTIsICAgIG1tNworCisgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTIKKyAgICBwbXVsbHcgICAgICBtbTEsICAgIHRocmVlX2ZvdXJ0aHMKKworICAgIHBtdWxsdyAgICAgIG1tMiwgICAgb25lX2ZvdXJ0aHMKKyAgICBtb3ZkICAgICAgICBtbTQsICAgIFtlYXgrZWN4XQorCisgICAgcG11bGx3ICAgICAgbW0zLCAgICB0d29fZm91cnRocworICAgIHB1bnBja2xidyAgIG1tNCwgICAgbW03CisKKyAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tNAorICAgIHBtdWxsdyAgICAgIG1tNCwgICAgdHdvX2ZvdXJ0aHMKKworICAgIHBhZGR3ICAgICAgIG1tMSwgICAgbW0yCisgICAgbW92ZCAgICAgICAgbW02LCAgICBbZWF4K2VjeCoyXQorCisgICAgcG11bGx3ICAgICAgbW01LCAgICBvbmVfZm91cnRocworICAgIHBhZGR3ICAgICAgIG1tMSwgICAgcm91bmRfdmFsdWVzOworCisgICAgcGFkZHcgICAgICAgbW0zLCAgICBtbTQKKyAgICBwc3JsdyAgICAgICBtbTEsICAgIDgKKworICAgIHB1bnBja2xidyAgIG1tNiwgICAgbW03CisgICAgcGFkZHcgICAgICAgbW0zLCAgICByb3VuZF92YWx1ZXMKKworICAgIHBtdWxsdyAgICAgIG1tNiwgICAgdGhyZWVfZm91cnRocworICAgIHBzcmx3ICAgICAgIG1tMywgICAgOAorCisgICAgcGFja3Vzd2IgICAgbW0xLCAgICBtbTcKKyAgICBwYWNrdXN3YiAgICBtbTMsICAgIG1tNworCisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGldLCBtbTAKKyAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaStlZHhdLCBtbTEKKworCisgICAgcGFkZHcgICAgICAgbW01LCAgICBtbTYKKyAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaStlZHgqMl0sIG1tMworCisgICAgbGVhICAgICAgICAgZWF4LCAgICBbZWRpK2VkeCoyXQorICAgIHBhZGR3ICAgICAgIG1tNSwgICAgcm91bmRfdmFsdWVzCisKKyAgICBwc3JsdyAgICAgICBtbTUsICAgIDgKKyAgICBhZGQgICAgICAgICBlZGksICAgIDQKKworICAgIHBhY2t1c3diICAgIG1tNSwgICAgbW03CisgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlYXgrZWR4XSwgbW01CisKKyAgICBhZGQgICAgICAgICBlc2ksICAgIDQKKyAgICBzdWIgICAgICAgICBlYngsICAgIDQKKworICAgIGpnICAgICAgICAgdnNfNV80X2xvb3AKKworICAgIHBvcCAgICAgICAgIGVieAorICB9Cit9CisKKworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDUzXzFbXSA9IHsgIDAsICA4NSwgMTcxLCAwIH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnN0NTNfMltdID0gezI1NiwgMTcxLCAgODUsIDAgfTsKKworCitzdGF0aWMKK3ZvaWQgaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9tbXgKKygKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAorICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAorKSB7CisKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisgIF9fYXNtIHsKKworICAgIG1vdiAgICAgICAgIGVzaSwgICAgICAgIHNvdXJjZTsKKyAgICBtb3YgICAgICAgICBlZGksICAgICAgICBkZXN0OworCisgICAgbW92ICAgICAgICAgZWN4LCAgICAgICAgc291cmNlX3dpZHRoOworICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIGNvbnN0NTNfMTsKKworICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgIG1tNzsKKyAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBjb25zdDUzXzI7CisKKyAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICByb3VuZF92YWx1ZXM7CisgICAgbGVhICAgICAgICAgZWR4LCAgICAgICAgW2VzaStlY3gtNV07CisgICAgaG9yaXpvbnRhbF9saW5lXzVfM19sb29wOgorCisgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgUVdPUkQgUFRSICBbZXNpXTsKKyAgICAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMDsKKyAgICAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNworCisgICAgcHNsbHcgICAgICAgbW0wLCAgICAgICAgODsKKyAgICB4eCAwMCB4eCAwMiB4eCAwNCB4eCAwNgorICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDg7CisgICAgMDEgeHggMDMgeHggMDUgeHggMDcgeHgKKworICAgIHBzcmx3ICAgICAgIG1tMCwgICAgICAgIDg7CisgICAgMDAgeHggMDIgeHggMDQgeHggMDYgeHgKKyAgICBwc2xscSAgICAgICBtbTEsICAgICAgICAxNjsKKyAgICB4eCB4eCAwMSB4eCAwMyB4eCAwNSB4eAorCisgICAgcG11bGx3ICAgICAgbW0wLCAgICAgICAgbW02CisKKyAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTUKKyAgICBhZGQgICAgICAgICBlc2ksICAgICAgICA1CisKKyAgICBhZGQgICAgICAgICBlZGksICAgICAgICAzCisgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW0wCisKKyAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTQKKyAgICBwc3JsdyAgICAgICBtbTEsICAgICAgICA4CisKKyAgICBjbXAgICAgICAgICBlc2ksICAgICAgICBlZHgKKyAgICBwYWNrdXN3YiAgICBtbTEsICAgICAgICBtbTcKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpLTNdLCBtbTEKKyAgICBqbCAgICAgICAgICBob3Jpem9udGFsX2xpbmVfNV8zX2xvb3AKKworLy8gZXhpdCBjb25kaXRpb24KKyAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgIFtlc2ldOworICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wOworICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3CisKKyAgICBwc2xsdyAgICAgICBtbTAsICAgICAgICA4OworICAgIHh4IDAwIHh4IDAyIHh4IDA0IHh4IDA2CisgICAgcHNybHcgICAgICAgbW0xLCAgICAgICAgODsKKyAgICAwMSB4eCAwMyB4eCAwNSB4eCAwNyB4eAorCisgICAgcHNybHcgICAgICAgbW0wLCAgICAgICAgODsKKyAgICAwMCB4eCAwMiB4eCAwNCB4eCAwNiB4eAorICAgIHBzbGxxICAgICAgIG1tMSwgICAgICAgIDE2OworICAgIHh4IHh4IDAxIHh4IDAzIHh4IDA1IHh4CisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgICAgICBtbTYKKworICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tNQorICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIG1tMAorCisgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW00CisgICAgcHNybHcgICAgICAgbW0xLCAgICAgICAgOAorCisgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgbW03CisgICAgbW92ZCAgICAgICAgZWF4LCAgICAgICAgbW0xCisKKyAgICBtb3YgICAgICAgICBlZHgsICAgICAgICBlYXgKKyAgICBzaHIgICAgICAgICBlZHgsICAgICAgICAxNgorCisgICAgbW92ICAgICAgICAgV09SRCBQVFJbZWRpXSwgICBheAorICAgIG1vdiAgICAgICAgIEJZVEUgUFRSW2VkaSsyXSwgZGwKKworICB9CisKK30KKworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvbmVfdGhpcmRzW10gPSB7ICA4NSwgIDg1LCAgODUsICA4NSB9OworX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0d29fdGhpcmRzW10gPSB7IDE3MSwgMTcxLCAxNzEsIDE3MSB9OworCitzdGF0aWMKK3ZvaWQgdmVydGljYWxfYmFuZF81XzNfc2NhbGVfbW14KHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSB7CisKKyAgX19hc20geworICAgIHB1c2ggICAgICAgIGVieAorCisgICAgbW92ICAgICAgICAgZXNpLCAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCisgICAgbW92ICAgICAgICAgZWN4LCAgICBzcmNfcGl0Y2ggICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBpdGNoIHNpemUKKworICAgIG1vdiAgICAgICAgIGVkaSwgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgLy8gdG93IGxpbmVzIGJlbG93CisgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgbW03CisKKyAgICBtb3YgICAgICAgICBlZHgsICAgIGRlc3RfcGl0Y2ggICAgICAgICAgICAgICAvLyBMb29wIGNvdW50ZXIKKyAgICBtb3ZxICAgICAgICBtbTUsICAgIG9uZV90aGlyZHMKKworICAgIG1vdnEgICAgICAgIG1tNiwgICAgdHdvX3RoaXJkcworICAgIG1vdiAgICAgICAgIGVieCwgICAgZGVzdF93aWR0aDsKKworICAgIHZzXzVfM19sb29wOgorCisgICAgbW92ZCAgICAgICAgbW0wLCAgICBEV09SRCBwdHIgW2VzaV0gICAgICAgICAvLyBzcmNbMF07CisgICAgbW92ZCAgICAgICAgbW0xLCAgICBEV09SRCBwdHIgW2VzaStlY3hdICAgICAvLyBzcmNbMV07CisKKyAgICBtb3ZkICAgICAgICBtbTIsICAgIERXT1JEIHB0ciBbZXNpK2VjeCoyXQorICAgIGxlYSAgICAgICAgIGVheCwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8KKworICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03CisgICAgcHVucGNrbGJ3ICAgbW0yLCAgICBtbTcKKworICAgIHBtdWxsdyAgICAgIG1tMSwgICAgbW01CisgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTYKKworICAgIG1vdmQgICAgICAgIG1tMywgICAgRFdPUkQgcHRyIFtlYXgrZWN4XQorICAgIG1vdmQgICAgICAgIG1tNCwgICAgRFdPUkQgcHRyIFtlYXgrZWN4KjJdCisKKyAgICBwdW5wY2tsYncgICBtbTMsICAgIG1tNworICAgIHB1bnBja2xidyAgIG1tNCwgICAgbW03CisKKyAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNgorICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW01CisKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpXSwgbW0wCisgICAgcGFkZHcgICAgICAgbW0xLCAgICBtbTIKKworICAgIHBhZGR3ICAgICAgIG1tMSwgICAgcm91bmRfdmFsdWVzCisgICAgcHNybHcgICAgICAgbW0xLCAgICA4CisKKyAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tNworICAgIHBhZGR3ICAgICAgIG1tMywgICAgbW00CisKKyAgICBwYWRkdyAgICAgICBtbTMsICAgIHJvdW5kX3ZhbHVlcworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpK2VkeF0sIG1tMQorCisgICAgcHNybHcgICAgICAgbW0zLCAgICA4CisgICAgcGFja3Vzd2IgICAgbW0zLCAgICBtbTcKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpK2VkeCoyXSwgbW0zCisKKworICAgIGFkZCAgICAgICAgIGVkaSwgICAgNAorICAgIGFkZCAgICAgICAgIGVzaSwgICAgNAorCisgICAgc3ViICAgICAgICAgZWJ4LCAgICA0CisgICAgamcgICAgICAgICAgdnNfNV8zX2xvb3AKKworICAgIHBvcCAgICAgICAgIGVieAorICB9Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJPVVRJTkUgICAgICAgOiBob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlCisgKgorICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOgorICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDoKKyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6CisgKgorICogIE9VVFBVVFMgICAgICAgOiBOb25lLgorICoKKyAqICBSRVRVUk5TICAgICAgIDogdm9pZAorICoKKyAqICBGVU5DVElPTiAgICAgIDogMSB0byAyIHVwLXNjYWxpbmcgb2YgYSBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzLgorICoKKyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYwordm9pZCBob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX21teAorKAorICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCisgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCisgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCispIHsKKyAgKHZvaWQpIGRlc3Rfd2lkdGg7CisgICh2b2lkKSBzb3VyY2Vfd2lkdGg7CisgIF9fYXNtIHsKKyAgICBtb3YgICAgICAgICBlc2ksICAgIHNvdXJjZQorICAgIG1vdiAgICAgICAgIGVkaSwgICAgZGVzdAorCisgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcKKyAgICBtb3YgICAgICAgICBlY3gsICAgIGRlc3Rfd2lkdGgKKworICAgIHhvciAgICAgICAgIGVkeCwgICAgZWR4CisgICAgaHNfMl8xX2xvb3A6CisKKyAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2krZWR4KjJdCisgICAgcHNsbHcgICAgICAgbW0wLCAgICA4CisKKyAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKKyAgICBwYWNrdXN3YiAgICBtbTAsICAgIG1tNworCisgICAgbW92ZCAgICAgICAgRFdPUkQgUHRyIFtlZGkrZWR4XSwgbW0wOworICAgIGFkZCAgICAgICAgIGVkeCwgICAgNAorCisgICAgY21wICAgICAgICAgZWR4LCAgICBlY3gKKyAgICBqbCAgICAgICAgICBoc18yXzFfbG9vcAorCisgIH0KK30KKworCisKK3N0YXRpYwordm9pZCB2ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9tbXgodW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpIHsKKyAgKHZvaWQpIGRlc3RfcGl0Y2g7CisgICh2b2lkKSBzcmNfcGl0Y2g7CisgIHZweF9tZW1jcHkoZGVzdCwgc291cmNlLCBkZXN0X3dpZHRoKTsKK30KKworCitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRocmVlX3NpeHRlZW50aHNbXSA9IHsgIDQ4LCAgNDgsICA0OCwgIDQ4IH07CitfX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRlbl9zaXh0ZWVudGhzW10gICA9IHsgMTYwLCAxNjAsIDE2MCwgMTYwIH07CisKK3N0YXRpYwordm9pZCB2ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX21teCh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgeworCisgICh2b2lkKSBkZXN0X3BpdGNoOworICBfX2FzbSB7CisgICAgbW92ICAgICAgICAgZXNpLCAgICAgICAgc291cmNlCisgICAgbW92ICAgICAgICAgZWRpLCAgICAgICAgZGVzdAorCisgICAgbW92ICAgICAgICAgZWF4LCAgICAgICAgc3JjX3BpdGNoCisgICAgbW92ICAgICAgICAgZWR4LCAgICAgICAgZGVzdF93aWR0aAorCisgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03CisgICAgc3ViICAgICAgICAgZXNpLCAgICAgICAgZWF4ICAgICAgICAgICAgIC8vIGJhY2sgb25lIGxpbmUKKworCisgICAgbGVhICAgICAgICAgZWN4LCAgICAgICAgW2VzaStlZHhdOworICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIHJvdW5kX3ZhbHVlczsKKworICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIHRocmVlX3NpeHRlZW50aHM7CisgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgdGVuX3NpeHRlZW50aHM7CisKKyAgICB2c18yXzFfaV9sb29wOgorICAgIG1vdmQgICAgICAgIG1tMCwgICAgICAgIFtlc2ldICAgICAgICAgICAvLworICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIFtlc2krZWF4XSAgICAgICAvLworCisgICAgbW92ZCAgICAgICAgbW0yLCAgICAgICAgW2VzaStlYXgqMl0gICAgIC8vCisgICAgcHVucGNrbGJ3ICAgbW0wLCAgICAgICAgbW03CisKKyAgICBwbXVsbHcgICAgICBtbTAsICAgICAgICBtbTUKKyAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTcKKworICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tNAorICAgIHB1bnBja2xidyAgIG1tMiwgICAgICAgIG1tNworCisgICAgcG11bGx3ICAgICAgbW0yLCAgICAgICAgbW01CisgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgcm91bmRfdmFsdWVzCisKKyAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTIKKyAgICBwYWRkdyAgICAgICBtbTAsICAgICAgICBtbTEKKworICAgIHBzcmx3ICAgICAgIG1tMCwgICAgICAgIDgKKyAgICBwYWNrdXN3YiAgICBtbTAsICAgICAgICBtbTcKKworICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpXSwgICAgICAgIG1tMAorICAgIGFkZCAgICAgICAgIGVzaSwgICAgICAgIDQKKworICAgIGFkZCAgICAgICAgIGVkaSwgICAgICAgIDQ7CisgICAgY21wICAgICAgICAgZXNpLCAgICAgICAgZWN4CisgICAgamwgICAgICAgICAgdnNfMl8xX2lfbG9vcAorCisgIH0KK30KKworCisKK3ZvaWQKK3JlZ2lzdGVyX21teHNjYWxlcnModm9pZCkgeworICB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZSAgICAgICAgPSBob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX21teDsKKyAgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlICAgICAgICAgID0gdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfbW14OworICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSAgICAgID0gbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9tbXg7CisgIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlICAgICAgICA9IGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfbW14OworICB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgICAgICAgICAgPSB2ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9tbXg7CisgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICAgPSBsYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX21teDsKKyAgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUgICAgICAgID0gaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9tbXg7CisgIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSAgICAgICAgICA9IHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX21teDsKKyAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgICAgICA9IGxhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfbW14OworCisgIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYzsKKyAgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYzsKKyAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYzsKKyAgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jOworICB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jOworICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jOworCisKKworICB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgICAgICAgICAgID0gdmVydGljYWxfYmFuZF81XzRfc2NhbGVfbW14OworICB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGUgICAgICAgICAgID0gdmVydGljYWxfYmFuZF81XzNfc2NhbGVfbW14OworICB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGUgICAgICAgICAgID0gdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfbW14OworICB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSAgICAgICAgID0gdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9tbXg7CisgIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlICAgICAgICAgPSBob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX21teDsKKyAgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUgICAgICAgICA9IGhvcml6b250YWxfbGluZV81XzNfc2NhbGVfbW14OworICB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSAgICAgICAgID0gaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9tbXg7CisKKworCisKK30KZGlmZiAtLWdpdCBhL2xpYnZweC92cHhfc2NhbGUvd2luMzIvc2NhbGVzeXN0ZW1kZXBlbmRlbnQuYyBiL2xpYnZweC92cHhfc2NhbGUvd2luMzIvc2NhbGVzeXN0ZW1kZXBlbmRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODkxM2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidnB4L3ZweF9zY2FsZS93aW4zMi9zY2FsZXN5c3RlbWRlcGVuZGVudC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKyAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisgKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIE1vZHVsZSBUaXRsZSA6ICAgICBzeXN0ZW1fZGVwZW5kZW50LmMKKyoKKyogICBEZXNjcmlwdGlvbiAgOiAgICAgTWlzY2VsbGFuZW91cyBzeXN0ZW0gZGVwZW5kZW50IGZ1bmN0aW9ucworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEhlYWRlciBGaWxlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKKyNpbmNsdWRlICJjcHVpZGxpYi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSW1wb3J0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdm9pZCByZWdpc3Rlcl9nZW5lcmljX3NjYWxlcnModm9pZCk7CitleHRlcm4gdm9pZCByZWdpc3Rlcl9tbXhzY2FsZXJzKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBST1VUSU5FICAgICAgIDogcG9zdF9wcm9jX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnCisgKgorICogIElOUFVUUyAgICAgICAgOiBVSU5UMzIgVmVyc2lvbiA6IENvZGVjIHZlcnNpb24gbnVtYmVyLgorICoKKyAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KKyAqCisgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKKyAqCisgKiAgRlVOQ1RJT04gICAgICA6IENoZWNrcyBmb3IgbWFjaGluZSBzcGVjaWZjIGZlYXR1cmVzIHN1Y2ggYXMgTU1YIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgc2V0cyBhcHByb3ByaWF0ZSBmbGFncyBhbmQgZnVuY3Rpb24gcG9pbnRlcnMuCisgKgorICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAordnA4X3NjYWxlX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKHZvaWQpIHsKKyAgLy8gSWYgTU1YIHN1cHBvcnRlZCB0aGVuIHNldCB0byB1c2UgTU1YIHZlcnNpb25zIG9mIGZ1bmN0aW9ucyBlbHNlCisgIC8vIHVzZSBvcmlnaW5hbCAnQycgdmVyc2lvbnMuCisgIGludCBtbXhfZW5hYmxlZDsKKyAgaW50IHhtbV9lbmFibGVkOworICBpbnQgd210X2VuYWJsZWQ7CisKKyAgdnB4X2dldF9wcm9jZXNzb3JfZmxhZ3MoJm1teF9lbmFibGVkLCAmeG1tX2VuYWJsZWQsICZ3bXRfZW5hYmxlZCk7CisKKyAgaWYgKG1teF9lbmFibGVkIHx8IHhtbV9lbmFibGVkIHx8IHdtdF9lbmFibGVkKSB7CisgICAgcmVnaXN0ZXJfbW14c2NhbGVycygpOworICB9IGVsc2UgeworICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYzsKKyAgICB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jOworICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlICAgICAgPSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2M7CisgICAgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jOworICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2M7CisgICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYzsKKyAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZSAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2M7CisgICAgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYzsKKyAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jOworICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYzsKKyAgICB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jOworICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlICAgICAgPSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2M7CisgICAgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9jOworICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2M7CisgICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYzsKKworCisgICAgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlICAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2M7CisgICAgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlICAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2M7CisgICAgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlICAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2M7CisgICAgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2kgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYzsKKyAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSAgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jOworICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlICAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2M7CisgICAgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGUgICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYzsKKworICB9Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgvdnB4X3NjYWxlL3l2MTJjb25maWcuaCBiL2xpYnZweC92cHhfc2NhbGUveXYxMmNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGExZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4X3NjYWxlL3l2MTJjb25maWcuaApAQCAtMCwwICsxLDczIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworI2lmbmRlZiBZVjEyX0NPTkZJR19ICisjZGVmaW5lIFlWMTJfQ09ORklHX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyNkZWZpbmUgVlA4Qk9SREVSSU5QSVhFTFMgICAgICAgMzIKKyNkZWZpbmUgVlA5Qk9SREVSSU5QSVhFTFMgICAgICAgNjQKKyNkZWZpbmUgVlA5X0lOVEVSUF9FWFRFTkQgICAgICAgIDQKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRm9yIElOVF9ZVVY6CisKKyAgIFkgPSAoUitHKjIrQikvNDsKKyAgIFUgPSAoUi1CKS8yOworICAgViA9ICAoRyoyIC0gUiAtIEIpLzQ7CisgIEFuZAorICAgUiA9IFkrVS1WOworICAgRyA9IFkrVjsKKyAgIEIgPSBZLVUtVjsKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB0eXBlZGVmIGVudW0KKyAgeworICAgIFJFR19ZVVYgPSAwLCAgICAvKiBSZWd1bGFyIHl1diAqLworICAgIElOVF9ZVVYgPSAxICAgICAvKiBUaGUgdHlwZSBvZiB5dXYgdGhhdCBjYW4gYmUgdHJhbmZlciB0byBhbmQgZnJvbSBSR0IgdGhyb3VnaCBpbnRlZ2VyIHRyYW5zZm9ybSAqLworICB9CisgICAgICAgICAgICBZVVZfVFlQRTsKKworICB0eXBlZGVmIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgeworICAgIGludCAgIHlfd2lkdGg7CisgICAgaW50ICAgeV9oZWlnaHQ7CisgICAgaW50ICAgeV9zdHJpZGU7CisgICAgLyogICAgaW50ICAgeWludGVybmFsX3dpZHRoOyAqLworCisgICAgaW50ICAgdXZfd2lkdGg7CisgICAgaW50ICAgdXZfaGVpZ2h0OworICAgIGludCAgIHV2X3N0cmlkZTsKKyAgICAvKiAgICBpbnQgICB1dmludGVybmFsX3dpZHRoOyAqLworCisgICAgdW5zaWduZWQgY2hhciAqeV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciAqdV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciAqdl9idWZmZXI7CisKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfYWxsb2M7CisgICAgaW50IGJvcmRlcjsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBZVVZfVFlQRSBjbHJ0eXBlOworCisgICAgaW50IGNvcnJ1cHRlZDsKKyAgICBpbnQgZmxhZ3M7CisgIH0gWVYxMl9CVUZGRVJfQ09ORklHOworCisgIGludCB2cDhfeXYxMl9hbGxvY19mcmFtZV9idWZmZXIoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlcik7CisgIGludCB2cDhfeXYxMl9kZV9hbGxvY19mcmFtZV9idWZmZXIoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKllWMTJfQ09ORklHX0gqLwpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweGRlYy5jIGIvbGlidnB4L3ZweGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzI4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4ZGVjLmMKQEAgLTAsMCArMSwxMTYxIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyogVGhpcyBpcyBhIHNpbXBsZSBwcm9ncmFtIHRoYXQgcmVhZHMgaXZmIGZpbGVzIGFuZCBkZWNvZGVzIHRoZW0KKyAqIHVzaW5nIHRoZSBuZXcgaW50ZXJmYWNlLiBEZWNvZGVkIGZyYW1lcyBhcmUgb3V0cHV0IGFzIFlWMTIgcmF3LgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2RlZmluZSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgMQorI2luY2x1ZGUgInZweF9jb25maWcuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvdnB4X3RpbWVyLmgiCisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisjZW5kaWYKKyNpZiBDT05GSUdfTUQ1CisjaW5jbHVkZSAibWQ1X3V0aWxzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0b29sc19jb21tb24uaCIKKyNpbmNsdWRlICJuZXN0ZWdnL2luY2x1ZGUvbmVzdGVnZy9uZXN0ZWdnLmgiCisKKyNpZiBDT05GSUdfT1NfU1VQUE9SVAorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSA8aW8uaD4KKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZGVmaW5lIGlzYXR0eSAgIF9pc2F0dHkKKyNkZWZpbmUgZmlsZW5vICAgX2ZpbGVubworI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgUEFUSF9NQVggMjU2CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWNfbmFtZTsKKworI2RlZmluZSBWUDhfRk9VUkNDICgweDAwMzg1MDU2KQorc3RhdGljIGNvbnN0IHN0cnVjdAoreworICAgIGNoYXIgY29uc3QgKm5hbWU7CisgICAgdnB4X2NvZGVjX2lmYWNlX3QgKmlmYWNlOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBmb3VyY2M7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGZvdXJjY19tYXNrOworfSBpZmFjZXNbXSA9Cit7CisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCisgICAgeyJ2cDgiLCAgJnZweF9jb2RlY192cDhfZHhfYWxnbywgICBWUDhfRk9VUkNDLCAweDAwRkZGRkZGfSwKKyNlbmRpZgorfTsKKworI2luY2x1ZGUgImFyZ3MuaCIKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgY29kZWNhcmcgPSBBUkdfREVGKE5VTEwsICJjb2RlYyIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZGVjIHRvIHVzZSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB1c2VfeXYxMiA9IEFSR19ERUYoTlVMTCwgInl2MTIiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcmF3IFlWMTIgZnJhbWVzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHVzZV9pNDIwID0gQVJHX0RFRihOVUxMLCAiaTQyMCIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCByYXcgSTQyMCBmcmFtZXMiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgZmxpcHV2YXJnID0gQVJHX0RFRihOVUxMLCAiZmxpcHV2IiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsaXAgdGhlIGNocm9tYSBwbGFuZXMgaW4gdGhlIG91dHB1dCIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBub2JsaXRhcmcgPSBBUkdfREVGKE5VTEwsICJub2JsaXQiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3QgcHJvY2VzcyB0aGUgZGVjb2RlZCBmcmFtZXMiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHJvZ3Jlc3NhcmcgPSBBUkdfREVGKE5VTEwsICJwcm9ncmVzcyIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNob3cgcHJvZ3Jlc3MgYWZ0ZXIgZWFjaCBmcmFtZSBkZWNvZGVzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGxpbWl0YXJnID0gQVJHX0RFRihOVUxMLCAibGltaXQiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9wIGRlY29kaW5nIGFmdGVyIG4gZnJhbWVzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHBvc3Rwcm9jYXJnID0gQVJHX0RFRihOVUxMLCAicG9zdHByb2MiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0cHJvY2VzcyBkZWNvZGVkIGZyYW1lcyIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBzdW1tYXJ5YXJnID0gQVJHX0RFRihOVUxMLCAic3VtbWFyeSIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hvdyB0aW1pbmcgc3VtbWFyeSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBvdXRwdXRmaWxlID0gQVJHX0RFRigibyIsICJvdXRwdXQiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBmaWxlIG5hbWUgcGF0dGVybiAoc2VlIGJlbG93KSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB0aHJlYWRzYXJnID0gQVJHX0RFRigidCIsICJ0aHJlYWRzIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggdGhyZWFkcyB0byB1c2UiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgdmVyYm9zZWFyZyA9IEFSR19ERUYoInYiLCAidmVyYm9zZSIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNob3cgdmVyc2lvbiBzdHJpbmciKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgZXJyb3JfY29uY2VhbG1lbnQgPSBBUkdfREVGKE5VTEwsICJlcnJvci1jb25jZWFsbWVudCIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIGRlY29kZXIgZXJyb3ItY29uY2VhbG1lbnQiKTsKKworCisjaWYgQ09ORklHX01ENQorc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBtZDVhcmcgPSBBUkdfREVGKE5VTEwsICJtZDUiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wdXRlIHRoZSBNRDUgc3VtIG9mIHRoZSBkZWNvZGVkIGZyYW1lIik7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgKmFsbF9hcmdzW10gPQoreworICAgICZjb2RlY2FyZywgJnVzZV95djEyLCAmdXNlX2k0MjAsICZmbGlwdXZhcmcsICZub2JsaXRhcmcsCisgICAgJnByb2dyZXNzYXJnLCAmbGltaXRhcmcsICZwb3N0cHJvY2FyZywgJnN1bW1hcnlhcmcsICZvdXRwdXRmaWxlLAorICAgICZ0aHJlYWRzYXJnLCAmdmVyYm9zZWFyZywKKyNpZiBDT05GSUdfTUQ1CisgICAgJm1kNWFyZywKKyNlbmRpZgorICAgICZlcnJvcl9jb25jZWFsbWVudCwKKyAgICBOVUxMCit9OworCisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGFkZG5vaXNlX2xldmVsID0gQVJHX0RFRihOVUxMLCAibm9pc2UtbGV2ZWwiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgVlA4IHBvc3Rwcm9jIGFkZCBub2lzZSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBkZWJsb2NrID0gQVJHX0RFRihOVUxMLCAiZGVibG9jayIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFZQOCBkZWJsb2NraW5nIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGRlbWFjcm9ibG9ja19sZXZlbCA9IEFSR19ERUYoTlVMTCwgImRlbWFjcm9ibG9jay1sZXZlbCIsIDEsCisgICAgICAgICJFbmFibGUgVlA4IGRlbWFjcm9ibG9ja2luZywgdy8gbGV2ZWwiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHBfZGVidWdfaW5mbyA9IEFSR19ERUYoTlVMTCwgInBwLWRlYnVnLWluZm8iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBWUDggdmlzaWJsZSBkZWJ1ZyBpbmZvIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHBwX2Rpc3BfcmVmX2ZyYW1lID0gQVJHX0RFRihOVUxMLCAicHAtZGJnLXJlZi1mcmFtZSIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzcGxheSBvbmx5IHNlbGVjdGVkIHJlZmVyZW5jZSBmcmFtZSBwZXIgbWFjcm8gYmxvY2siKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHBfZGlzcF9tYl9tb2RlcyA9IEFSR19ERUYoTlVMTCwgInBwLWRiZy1tYi1tb2RlcyIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzcGxheSBvbmx5IHNlbGVjdGVkIG1hY3JvIGJsb2NrIG1vZGVzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHBwX2Rpc3BfYl9tb2RlcyA9IEFSR19ERUYoTlVMTCwgInBwLWRiZy1iLW1vZGVzIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNwbGF5IG9ubHkgc2VsZWN0ZWQgYmxvY2sgbW9kZXMiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHBfZGlzcF9tdnMgPSBBUkdfREVGKE5VTEwsICJwcC1kYmctbXZzIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmF3IG9ubHkgc2VsZWN0ZWQgbW90aW9uIHZlY3RvcnMiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgbWZxZSA9IEFSR19ERUYoTlVMTCwgIm1mcWUiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBtdWx0aWZyYW1lIHF1YWxpdHkgZW5oYW5jZW1lbnQiKTsKKworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqdnA4X3BwX2FyZ3NbXSA9Cit7CisgICAgJmFkZG5vaXNlX2xldmVsLCAmZGVibG9jaywgJmRlbWFjcm9ibG9ja19sZXZlbCwgJnBwX2RlYnVnX2luZm8sCisgICAgJnBwX2Rpc3BfcmVmX2ZyYW1lLCAmcHBfZGlzcF9tYl9tb2RlcywgJnBwX2Rpc3BfYl9tb2RlcywgJnBwX2Rpc3BfbXZzLCAmbWZxZSwKKyAgICBOVUxMCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVzYWdlX2V4aXQoKQoreworICAgIGludCBpOworCisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPG9wdGlvbnM+IGZpbGVuYW1lXG5cbiIKKyAgICAgICAgICAgICJPcHRpb25zOlxuIiwgZXhlY19uYW1lKTsKKyAgICBhcmdfc2hvd191c2FnZShzdGRlcnIsIGFsbF9hcmdzKTsKKyNpZiBDT05GSUdfVlA4X0RFQ09ERVIKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuVlA4IFBvc3Rwcm9jZXNzaW5nIE9wdGlvbnM6XG4iKTsKKyAgICBhcmdfc2hvd191c2FnZShzdGRlcnIsIHZwOF9wcF9hcmdzKTsKKyNlbmRpZgorICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlxuT3V0cHV0IEZpbGUgUGF0dGVybnM6XG5cbiIKKyAgICAgICAgICAgICIgIFRoZSAtbyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUocykgdG8gIgorICAgICAgICAgICAgIndyaXRlIHRvLiBJZiB0aGVcbiAgYXJndW1lbnQgZG9lcyBub3QgaW5jbHVkZSBhbnkgZXNjYXBlICIKKyAgICAgICAgICAgICJjaGFyYWN0ZXJzLCB0aGUgb3V0cHV0IHdpbGwgYmVcbiAgd3JpdHRlbiB0byBhIHNpbmdsZSBmaWxlLiAiCisgICAgICAgICAgICAiT3RoZXJ3aXNlLCB0aGUgZmlsZW5hbWUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5XG4gIGV4cGFuZGluZyAiCisgICAgICAgICAgICAidGhlIGZvbGxvd2luZyBlc2NhcGUgY2hhcmFjdGVyczpcbiIpOworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlxuXHQlJXcgICAtIEZyYW1lIHdpZHRoIgorICAgICAgICAgICAgIlxuXHQlJWggICAtIEZyYW1lIGhlaWdodCIKKyAgICAgICAgICAgICJcblx0JSU8bj4gLSBGcmFtZSBudW1iZXIsIHplcm8gcGFkZGVkIHRvIDxuPiBwbGFjZXMgKDEuLjkpIgorICAgICAgICAgICAgIlxuXG4gIFBhdHRlcm4gYXJndW1lbnRzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBjb25qdW5jdGlvbiAiCisgICAgICAgICAgICAid2l0aCB0aGUgLS15djEyIGFuZFxuICAtLWk0MjAgb3B0aW9ucy4gSWYgdGhlIC1vIG9wdGlvbiBpcyAiCisgICAgICAgICAgICAibm90IHNwZWNpZmllZCwgdGhlIG91dHB1dCB3aWxsIGJlXG4gIGRpcmVjdGVkIHRvIHN0ZG91dC5cbiIKKyAgICAgICAgICAgICk7CisgICAgZnByaW50ZihzdGRlcnIsICJcbkluY2x1ZGVkIGRlY29kZXJzOlxuXG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoaWZhY2VzKSAvIHNpemVvZihpZmFjZXNbMF0pOyBpKyspCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICUtNnMgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBpZmFjZXNbaV0ubmFtZSwKKyAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfbmFtZShpZmFjZXNbaV0uaWZhY2UpKTsKKworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB1c2FnZV9leGl0KCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVtX2dldF9sZTE2KGNvbnN0IHZvaWQgKnZtZW0pCit7CisgICAgdW5zaWduZWQgaW50ICB2YWw7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVtID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKil2bWVtOworCisgICAgdmFsID0gbWVtWzFdIDw8IDg7CisgICAgdmFsIHw9IG1lbVswXTsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1lbV9nZXRfbGUzMihjb25zdCB2b2lkICp2bWVtKQoreworICAgIHVuc2lnbmVkIGludCAgdmFsOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1lbSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopdm1lbTsKKworICAgIHZhbCA9IG1lbVszXSA8PCAyNDsKKyAgICB2YWwgfD0gbWVtWzJdIDw8IDE2OworICAgIHZhbCB8PSBtZW1bMV0gPDwgODsKKyAgICB2YWwgfD0gbWVtWzBdOworICAgIHJldHVybiB2YWw7Cit9CisKK2VudW0gZmlsZV9raW5kCit7CisgICAgUkFXX0ZJTEUsCisgICAgSVZGX0ZJTEUsCisgICAgV0VCTV9GSUxFCit9OworCitzdHJ1Y3QgaW5wdXRfY3R4Cit7CisgICAgZW51bSBmaWxlX2tpbmQgIGtpbmQ7CisgICAgRklMRSAgICAgICAgICAgKmluZmlsZTsKKyAgICBuZXN0ZWdnICAgICAgICAqbmVzdGVnZ19jdHg7CisgICAgbmVzdGVnZ19wYWNrZXQgKnBrdDsKKyAgICB1bnNpZ25lZCBpbnQgICAgY2h1bms7CisgICAgdW5zaWduZWQgaW50ICAgIGNodW5rczsKKyAgICB1bnNpZ25lZCBpbnQgICAgdmlkZW9fdHJhY2s7Cit9OworCisjZGVmaW5lIElWRl9GUkFNRV9IRFJfU1ogKHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDY0X3QpKQorI2RlZmluZSBSQVdfRlJBTUVfSERSX1NaIChzaXplb2YodWludDMyX3QpKQorc3RhdGljIGludCByZWFkX2ZyYW1lKHN0cnVjdCBpbnB1dF9jdHggICAgICAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgICoqYnVmLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAqYnVmX3N6LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAqYnVmX2FsbG9jX3N6KQoreworICAgIGNoYXIgICAgICAgICAgICByYXdfaGRyW0lWRl9GUkFNRV9IRFJfU1pdOworICAgIHNpemVfdCAgICAgICAgICBuZXdfYnVmX3N6OworICAgIEZJTEUgICAgICAgICAgICppbmZpbGUgPSBpbnB1dC0+aW5maWxlOworICAgIGVudW0gZmlsZV9raW5kICBraW5kID0gaW5wdXQtPmtpbmQ7CisgICAgaWYoa2luZCA9PSBXRUJNX0ZJTEUpCisgICAgeworICAgICAgICBpZihpbnB1dC0+Y2h1bmsgPj0gaW5wdXQtPmNodW5rcykKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHRyYWNrOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiB0aGlzIHBhY2tldCwgZ2V0IGFub3RoZXIuICovCisgICAgICAgICAgICAgICAgaWYoaW5wdXQtPnBrdCkKKyAgICAgICAgICAgICAgICAgICAgbmVzdGVnZ19mcmVlX3BhY2tldChpbnB1dC0+cGt0KTsKKworICAgICAgICAgICAgICAgIGlmKG5lc3RlZ2dfcmVhZF9wYWNrZXQoaW5wdXQtPm5lc3RlZ2dfY3R4LCAmaW5wdXQtPnBrdCkgPD0gMAorICAgICAgICAgICAgICAgICAgIHx8IG5lc3RlZ2dfcGFja2V0X3RyYWNrKGlucHV0LT5wa3QsICZ0cmFjaykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICB9IHdoaWxlKHRyYWNrICE9IGlucHV0LT52aWRlb190cmFjayk7CisKKyAgICAgICAgICAgIGlmKG5lc3RlZ2dfcGFja2V0X2NvdW50KGlucHV0LT5wa3QsICZpbnB1dC0+Y2h1bmtzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlucHV0LT5jaHVuayA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZihuZXN0ZWdnX3BhY2tldF9kYXRhKGlucHV0LT5wa3QsIGlucHV0LT5jaHVuaywgYnVmLCBidWZfc3opKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlucHV0LT5jaHVuaysrOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBGb3IgYm90aCB0aGUgcmF3IGFuZCBpdmYgZm9ybWF0cywgdGhlIGZyYW1lIHNpemUgaXMgdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgKiBvZiB0aGUgZnJhbWUgaGVhZGVyLiBXZSBqdXN0IG5lZWQgdG8gc3BlY2lhbCBjYXNlIG9uIHRoZSBoZWFkZXIKKyAgICAgKiBzaXplLgorICAgICAqLworICAgIGVsc2UgaWYgKGZyZWFkKHJhd19oZHIsIGtpbmQ9PUlWRl9GSUxFCisgICAgICAgICAgICAgICAgICAgPyBJVkZfRlJBTUVfSERSX1NaIDogUkFXX0ZSQU1FX0hEUl9TWiwgMSwgaW5maWxlKSAhPSAxKQorICAgIHsKKyAgICAgICAgaWYgKCFmZW9mKGluZmlsZSkpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkIGZyYW1lIHNpemVcbiIpOworCisgICAgICAgIG5ld19idWZfc3ogPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuZXdfYnVmX3N6ID0gbWVtX2dldF9sZTMyKHJhd19oZHIpOworCisgICAgICAgIGlmIChuZXdfYnVmX3N6ID4gMjU2ICogMTAyNCAqIDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFJlYWQgaW52YWxpZCBmcmFtZSBzaXplICgldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbmV3X2J1Zl9zeik7CisgICAgICAgICAgICBuZXdfYnVmX3N6ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChraW5kID09IFJBV19GSUxFICYmIG5ld19idWZfc3ogPiAyNTYgKiAxMDI0KQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBSZWFkIGludmFsaWQgZnJhbWUgc2l6ZSAoJXUpIgorICAgICAgICAgICAgICAgICAgICAiIC0gbm90IGEgcmF3IGZpbGU/XG4iLCAodW5zaWduZWQgaW50KW5ld19idWZfc3opOworCisgICAgICAgIGlmIChuZXdfYnVmX3N6ID4gKmJ1Zl9hbGxvY19zeikKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCAqbmV3X2J1ZiA9IHJlYWxsb2MoKmJ1ZiwgMiAqIG5ld19idWZfc3opOworCisgICAgICAgICAgICBpZiAobmV3X2J1ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gbmV3X2J1ZjsKKyAgICAgICAgICAgICAgICAqYnVmX2FsbG9jX3N6ID0gMiAqIG5ld19idWZfc3o7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgY29tcHJlc3NlZCBkYXRhIGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgbmV3X2J1Zl9zeiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqYnVmX3N6ID0gbmV3X2J1Zl9zejsKKworICAgIGlmICghZmVvZihpbmZpbGUpKQorICAgIHsKKyAgICAgICAgaWYgKGZyZWFkKCpidWYsIDEsICpidWZfc3osIGluZmlsZSkgIT0gKmJ1Zl9zeikKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBmdWxsIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgKm91dF9vcGVuKGNvbnN0IGNoYXIgKm91dF9mbiwgaW50IGRvX21kNSkKK3sKKyAgICB2b2lkICpvdXQgPSBOVUxMOworCisgICAgaWYgKGRvX21kNSkKKyAgICB7CisjaWYgQ09ORklHX01ENQorICAgICAgICBNRDVDb250ZXh0ICptZDVfY3R4ID0gb3V0ID0gbWFsbG9jKHNpemVvZihNRDVDb250ZXh0KSk7CisgICAgICAgICh2b2lkKW91dF9mbjsKKyAgICAgICAgTUQ1SW5pdChtZDVfY3R4KTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBGSUxFICpvdXRmaWxlID0gb3V0ID0gc3RyY21wKCItIiwgb3V0X2ZuKSA/IGZvcGVuKG91dF9mbiwgIndiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXRfYmluYXJ5X21vZGUoc3Rkb3V0KTsKKworICAgICAgICBpZiAoIW91dGZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG91dHB1dCBmaWxlIik7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCit2b2lkIG91dF9wdXQodm9pZCAqb3V0LCBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBsZW4sIGludCBkb19tZDUpCit7CisgICAgaWYgKGRvX21kNSkKKyAgICB7CisjaWYgQ09ORklHX01ENQorICAgICAgICBNRDVVcGRhdGUob3V0LCBidWYsIGxlbik7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKHZvaWQpIGZ3cml0ZShidWYsIDEsIGxlbiwgb3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgb3V0X2Nsb3NlKHZvaWQgKm91dCwgY29uc3QgY2hhciAqb3V0X2ZuLCBpbnQgZG9fbWQ1KQoreworICAgIGlmIChkb19tZDUpCisgICAgeworI2lmIENPTkZJR19NRDUKKyAgICAgICAgdWludDhfdCBtZDVbMTZdOworICAgICAgICBpbnQgaTsKKworICAgICAgICBNRDVGaW5hbChtZDUsIG91dCk7CisgICAgICAgIGZyZWUob3V0KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHByaW50ZigiJTAyeCIsIG1kNVtpXSk7CisKKyAgICAgICAgcHJpbnRmKCIgICVzXG4iLCBvdXRfZm4pOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZjbG9zZShvdXQpOworICAgIH0KK30KKwordW5zaWduZWQgaW50IGZpbGVfaXNfaXZmKEZJTEUgKmluZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmZvdXJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZnBzX2RlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmZwc19udW0pCit7CisgICAgY2hhciByYXdfaGRyWzMyXTsKKyAgICBpbnQgaXNfaXZmID0gMDsKKworICAgIGlmIChmcmVhZChyYXdfaGRyLCAxLCAzMiwgaW5maWxlKSA9PSAzMikKKyAgICB7CisgICAgICAgIGlmIChyYXdfaGRyWzBdID09ICdEJyAmJiByYXdfaGRyWzFdID09ICdLJworICAgICAgICAgICAgJiYgcmF3X2hkclsyXSA9PSAnSScgJiYgcmF3X2hkclszXSA9PSAnRicpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlzX2l2ZiA9IDE7CisKKyAgICAgICAgICAgIGlmIChtZW1fZ2V0X2xlMTYocmF3X2hkciArIDQpICE9IDApCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5yZWNvZ25pemVkIElWRiB2ZXJzaW9uISBUaGlzIGZpbGUgbWF5IG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZGVjb2RlIHByb3Blcmx5LiIpOworCisgICAgICAgICAgICAqZm91cmNjID0gbWVtX2dldF9sZTMyKHJhd19oZHIgKyA4KTsKKyAgICAgICAgICAgICp3aWR0aCA9IG1lbV9nZXRfbGUxNihyYXdfaGRyICsgMTIpOworICAgICAgICAgICAgKmhlaWdodCA9IG1lbV9nZXRfbGUxNihyYXdfaGRyICsgMTQpOworICAgICAgICAgICAgKmZwc19udW0gPSBtZW1fZ2V0X2xlMzIocmF3X2hkciArIDE2KTsKKyAgICAgICAgICAgICpmcHNfZGVuID0gbWVtX2dldF9sZTMyKHJhd19oZHIgKyAyMCk7CisKKyAgICAgICAgICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgdnB4ZW5jIHVzZWQgMS8oMipmcHMpIGZvciB0aGUgdGltZWJhc2UsIHNvCisgICAgICAgICAgICAgKiB3ZSBjYW4gZ3Vlc3MgdGhlIGZyYW1lcmF0ZSB1c2luZyBvbmx5IHRoZSB0aW1lYmFzZSBpbiB0aGlzCisgICAgICAgICAgICAgKiBjYXNlLiBPdGhlciBmaWxlcyB3b3VsZCByZXF1aXJlIHJlYWRpbmcgYWhlYWQgdG8gZ3Vlc3MgdGhlCisgICAgICAgICAgICAgKiB0aW1lYmFzZSwgbGlrZSB3ZSBkbyBmb3Igd2VibS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoKmZwc19udW0gPCAxMDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENvcnJlY3QgZm9yIHRoZSBmYWN0b3Igb2YgMiBhcHBsaWVkIHRvIHRoZSB0aW1lYmFzZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgKiBlbmNvZGVyLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKCpmcHNfbnVtJjEpKmZwc19kZW48PD0xOworICAgICAgICAgICAgICAgIGVsc2UgKmZwc19udW0+Pj0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIERvbid0IGtub3cgRlBTIGZvciBzdXJlLCBhbmQgZG9uJ3QgaGF2ZSByZWFkYWhlYWQgY29kZQorICAgICAgICAgICAgICAgICAqICh5ZXQ/KSwgc28ganVzdCBkZWZhdWx0IHRvIDMwZnBzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICpmcHNfbnVtID0gMzA7CisgICAgICAgICAgICAgICAgKmZwc19kZW4gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpc19pdmYpCisgICAgICAgIHJld2luZChpbmZpbGUpOworCisgICAgcmV0dXJuIGlzX2l2ZjsKK30KKworCit1bnNpZ25lZCBpbnQgZmlsZV9pc19yYXcoRklMRSAqaW5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZm91cmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpmcHNfZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZnBzX251bSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlszMl07CisgICAgaW50IGlzX3JhdyA9IDA7CisgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3Qgc2k7CisKKyAgICBzaS5zeiA9IHNpemVvZihzaSk7CisKKyAgICBpZiAoZnJlYWQoYnVmLCAxLCAzMiwgaW5maWxlKSA9PSAzMikKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmKG1lbV9nZXRfbGUzMihidWYpIDwgMjU2ICogMTAyNCAqIDEwMjQpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGlmYWNlcykgLyBzaXplb2YoaWZhY2VzWzBdKTsgaSsrKQorICAgICAgICAgICAgICAgIGlmKCF2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyhpZmFjZXNbaV0uaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIDQsIDMyIC0gNCwgJnNpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlzX3JhdyA9IDE7CisgICAgICAgICAgICAgICAgICAgICpmb3VyY2MgPSBpZmFjZXNbaV0uZm91cmNjOworICAgICAgICAgICAgICAgICAgICAqd2lkdGggPSBzaS53OworICAgICAgICAgICAgICAgICAgICAqaGVpZ2h0ID0gc2kuaDsKKyAgICAgICAgICAgICAgICAgICAgKmZwc19udW0gPSAzMDsKKyAgICAgICAgICAgICAgICAgICAgKmZwc19kZW4gPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV3aW5kKGluZmlsZSk7CisgICAgcmV0dXJuIGlzX3JhdzsKK30KKworCitzdGF0aWMgaW50CituZXN0ZWdnX3JlYWRfY2Iodm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBGSUxFICpmID0gdXNlcmRhdGE7CisKKyAgICBpZihmcmVhZChidWZmZXIsIDEsIGxlbmd0aCwgZikgPCBsZW5ndGgpCisgICAgeworICAgICAgICBpZiAoZmVycm9yKGYpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZmVvZihmKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50CituZXN0ZWdnX3NlZWtfY2IoaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UsIHZvaWQgKiB1c2VyZGF0YSkKK3sKKyAgICBzd2l0Y2god2hlbmNlKSB7CisgICAgICAgIGNhc2UgTkVTVEVHR19TRUVLX1NFVDogd2hlbmNlID0gU0VFS19TRVQ7IGJyZWFrOworICAgICAgICBjYXNlIE5FU1RFR0dfU0VFS19DVVI6IHdoZW5jZSA9IFNFRUtfQ1VSOyBicmVhazsKKyAgICAgICAgY2FzZSBORVNURUdHX1NFRUtfRU5EOiB3aGVuY2UgPSBTRUVLX0VORDsgYnJlYWs7CisgICAgfTsKKyAgICByZXR1cm4gZnNlZWsodXNlcmRhdGEsIChsb25nKW9mZnNldCwgd2hlbmNlKT8gLTEgOiAwOworfQorCisKK3N0YXRpYyBpbnQ2NF90CituZXN0ZWdnX3RlbGxfY2Iodm9pZCAqIHVzZXJkYXRhKQoreworICAgIHJldHVybiBmdGVsbCh1c2VyZGF0YSk7Cit9CisKKworc3RhdGljIHZvaWQKK25lc3RlZ2dfbG9nX2NiKG5lc3RlZ2cgKiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgc2V2ZXJpdHksIGNoYXIgY29uc3QgKiBmb3JtYXQsCisgICAgICAgICAgICAgICAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICAgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcCk7CisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIHZhX2VuZChhcCk7Cit9CisKKworc3RhdGljIGludAord2VibV9ndWVzc19mcmFtZXJhdGUoc3RydWN0IGlucHV0X2N0eCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICpmcHNfZGVuLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAqZnBzX251bSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1aW50NjRfdCAgICAgdHN0YW1wPTA7CisKKyAgICAvKiBHdWVzcyB0aGUgZnJhbWVyYXRlLiBSZWFkIHVwIHRvIDEgc2Vjb25kLCBvciA1MCB2aWRlbyBwYWNrZXRzLAorICAgICAqIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAgICAgKi8KKyAgICBmb3IoaT0wOyB0c3RhbXAgPCAxMDAwMDAwMDAwICYmIGkgPCA1MDspCisgICAgeworICAgICAgICBuZXN0ZWdnX3BhY2tldCAqIHBrdDsKKyAgICAgICAgdW5zaWduZWQgaW50IHRyYWNrOworCisgICAgICAgIGlmKG5lc3RlZ2dfcmVhZF9wYWNrZXQoaW5wdXQtPm5lc3RlZ2dfY3R4LCAmcGt0KSA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbmVzdGVnZ19wYWNrZXRfdHJhY2socGt0LCAmdHJhY2spOworICAgICAgICBpZih0cmFjayA9PSBpbnB1dC0+dmlkZW9fdHJhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lc3RlZ2dfcGFja2V0X3RzdGFtcChwa3QsICZ0c3RhbXApOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgbmVzdGVnZ19mcmVlX3BhY2tldChwa3QpOworICAgIH0KKworICAgIGlmKG5lc3RlZ2dfdHJhY2tfc2VlayhpbnB1dC0+bmVzdGVnZ19jdHgsIGlucHV0LT52aWRlb190cmFjaywgMCkpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgICpmcHNfbnVtID0gKGkgLSAxKSAqIDEwMDAwMDA7CisgICAgKmZwc19kZW4gPSAodW5zaWduZWQgaW50KSh0c3RhbXAgLyAxMDAwKTsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgbmVzdGVnZ19kZXN0cm95KGlucHV0LT5uZXN0ZWdnX2N0eCk7CisgICAgaW5wdXQtPm5lc3RlZ2dfY3R4ID0gTlVMTDsKKyAgICByZXdpbmQoaW5wdXQtPmluZmlsZSk7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAorZmlsZV9pc193ZWJtKHN0cnVjdCBpbnB1dF9jdHggKmlucHV0LAorICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmZvdXJjYywKKyAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICp3aWR0aCwKKyAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICpoZWlnaHQsCisgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAqZnBzX2RlbiwKKyAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICpmcHNfbnVtKQoreworICAgIHVuc2lnbmVkIGludCBpLCBuOworICAgIGludCAgICAgICAgICB0cmFja190eXBlID0gLTE7CisKKyAgICBuZXN0ZWdnX2lvIGlvID0ge25lc3RlZ2dfcmVhZF9jYiwgbmVzdGVnZ19zZWVrX2NiLCBuZXN0ZWdnX3RlbGxfY2IsIDB9OworICAgIG5lc3RlZ2dfdmlkZW9fcGFyYW1zIHBhcmFtczsKKworICAgIGlvLnVzZXJkYXRhID0gaW5wdXQtPmluZmlsZTsKKyAgICBpZihuZXN0ZWdnX2luaXQoJmlucHV0LT5uZXN0ZWdnX2N0eCwgaW8sIE5VTEwpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZihuZXN0ZWdnX3RyYWNrX2NvdW50KGlucHV0LT5uZXN0ZWdnX2N0eCwgJm4pKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIHRyYWNrX3R5cGUgPSBuZXN0ZWdnX3RyYWNrX3R5cGUoaW5wdXQtPm5lc3RlZ2dfY3R4LCBpKTsKKworICAgICAgICBpZih0cmFja190eXBlID09IE5FU1RFR0dfVFJBQ0tfVklERU8pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZih0cmFja190eXBlIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZihuZXN0ZWdnX3RyYWNrX2NvZGVjX2lkKGlucHV0LT5uZXN0ZWdnX2N0eCwgaSkgIT0gTkVTVEVHR19DT0RFQ19WUDgpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBWUDggdmlkZW8sIHF1aXR0aW5nLlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaW5wdXQtPnZpZGVvX3RyYWNrID0gaTsKKworICAgIGlmKG5lc3RlZ2dfdHJhY2tfdmlkZW9fcGFyYW1zKGlucHV0LT5uZXN0ZWdnX2N0eCwgaSwgJnBhcmFtcykpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgICpmcHNfZGVuID0gMDsKKyAgICAqZnBzX251bSA9IDA7CisgICAgKmZvdXJjYyA9IFZQOF9GT1VSQ0M7CisgICAgKndpZHRoID0gcGFyYW1zLndpZHRoOworICAgICpoZWlnaHQgPSBwYXJhbXMuaGVpZ2h0OworICAgIHJldHVybiAxOworZmFpbDoKKyAgICBpbnB1dC0+bmVzdGVnZ19jdHggPSBOVUxMOworICAgIHJld2luZChpbnB1dC0+aW5maWxlKTsKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIHNob3dfcHJvZ3Jlc3MoaW50IGZyYW1lX2luLCBpbnQgZnJhbWVfb3V0LCB1bnNpZ25lZCBsb25nIGR4X3RpbWUpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlZCBkZWNvZGVkIGZyYW1lcy8lZCBzaG93ZWQgZnJhbWVzIGluICVsdSB1cyAoJS4yZiBmcHMpXHIiLAorICAgICAgICAgICAgZnJhbWVfaW4sIGZyYW1lX291dCwgZHhfdGltZSwKKyAgICAgICAgICAgIChmbG9hdClmcmFtZV9vdXQgKiAxMDAwMDAwLjAgLyAoZmxvYXQpZHhfdGltZSk7Cit9CisKKwordm9pZCBnZW5lcmF0ZV9maWxlbmFtZShjb25zdCBjaGFyICpwYXR0ZXJuLCBjaGFyICpvdXQsIHNpemVfdCBxX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRfdywgdW5zaWduZWQgaW50IGRfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZyYW1lX2luKQoreworICAgIGNvbnN0IGNoYXIgKnAgPSBwYXR0ZXJuOworICAgIGNoYXIgKnEgPSBvdXQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgY2hhciAqbmV4dF9wYXQgPSBzdHJjaHIocCwgJyUnKTsKKworICAgICAgICBpZihwID09IG5leHRfcGF0KQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgcGF0X2xlbjsKKworICAgICAgICAgICAgLyogcGFyc2UgdGhlIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIHFbcV9sZW4gLSAxXSA9ICdcMCc7CisgICAgICAgICAgICBzd2l0Y2gocFsxXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJ3cnOiBzbnByaW50ZihxLCBxX2xlbiAtIDEsICIlZCIsIGRfdyk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaCc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiVkIiwgZF9oKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcxJzogc25wcmludGYocSwgcV9sZW4gLSAxLCAiJWQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMic6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwMmQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMyc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwM2QiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNCc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwNGQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNSc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwNWQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNic6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwNmQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNyc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwN2QiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnOCc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwOGQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnOSc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwOWQiLCBmcmFtZV9pbik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBkaWUoIlVucmVjb2duaXplZCBwYXR0ZXJuICUlJWNcbiIsIHBbMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRfbGVuID0gc3RybGVuKHEpOworICAgICAgICAgICAgaWYocGF0X2xlbiA+PSBxX2xlbiAtIDEpCisgICAgICAgICAgICAgICAgZGllKCJPdXRwdXQgZmlsZW5hbWUgdG9vIGxvbmcuXG4iKTsKKyAgICAgICAgICAgIHEgKz0gcGF0X2xlbjsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIHFfbGVuIC09IHBhdF9sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgY29weV9sZW47CisKKyAgICAgICAgICAgIC8qIGNvcHkgdGhlIG5leHQgc2VnbWVudCAqLworICAgICAgICAgICAgaWYoIW5leHRfcGF0KQorICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gc3RybGVuKHApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbmV4dF9wYXQgLSBwOworCisgICAgICAgICAgICBpZihjb3B5X2xlbiA+PSBxX2xlbiAtIDEpCisgICAgICAgICAgICAgICAgZGllKCJPdXRwdXQgZmlsZW5hbWUgdG9vIGxvbmcuXG4iKTsKKworICAgICAgICAgICAgbWVtY3B5KHEsIHAsIGNvcHlfbGVuKTsKKyAgICAgICAgICAgIHFbY29weV9sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIHEgKz0gY29weV9sZW47CisgICAgICAgICAgICBwICs9IGNvcHlfbGVuOworICAgICAgICAgICAgcV9sZW4gLT0gY29weV9sZW47CisgICAgICAgIH0KKyAgICB9IHdoaWxlKCpwKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3ZfKQoreworICAgIHZweF9jb2RlY19jdHhfdCAgICAgICAgICBkZWNvZGVyOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAqZm4gPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICBidWZfc3ogPSAwLCBidWZfYWxsb2Nfc3ogPSAwOworICAgIEZJTEUgICAgICAgICAgICAgICAgICAqaW5maWxlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgZnJhbWVfaW4gPSAwLCBmcmFtZV9vdXQgPSAwLCBmbGlwdXYgPSAwLCBub2JsaXQgPSAwLCBkb19tZDUgPSAwLCBwcm9ncmVzcyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBzdG9wX2FmdGVyID0gMCwgcG9zdHByb2MgPSAwLCBzdW1tYXJ5ID0gMCwgcXVpZXQgPSAxOworICAgIGludCAgICAgICAgICAgICAgICAgICAgZWNfZW5hYmxlZCA9IDA7CisgICAgdnB4X2NvZGVjX2lmYWNlX3QgICAgICAgKmlmYWNlID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGZvdXJjYzsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGR4X3RpbWUgPSAwOworICAgIHN0cnVjdCBhcmcgICAgICAgICAgICAgICBhcmc7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAqKmFyZ3YsICoqYXJnaSwgKiphcmdqOworICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKm91dGZpbGVfcGF0dGVybiA9IDA7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVtQQVRIX01BWF07CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX2ZpbGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdXNlX3k0bSA9IDE7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgd2lkdGg7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgaGVpZ2h0OworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGZwc19kZW47CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgZnBzX251bTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICpvdXQgPSBOVUxMOworICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgICAgIGNmZyA9IHswfTsKKyNpZiBDT05GSUdfVlA4X0RFQ09ERVIKKyAgICB2cDhfcG9zdHByb2NfY2ZnX3QgICAgICB2cDhfcHBfY2ZnID0gezB9OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHZwOF9kYmdfY29sb3JfcmVmX2ZyYW1lID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX21iX21vZGVzID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX2JfbW9kZXMgPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHZwOF9kYmdfZGlzcGxheV9tdiA9IDA7CisjZW5kaWYKKyAgICBzdHJ1Y3QgaW5wdXRfY3R4ICAgICAgICBpbnB1dCA9IHswfTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmcmFtZXNfY29ycnVwdGVkID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkZWNfZmxhZ3MgPSAwOworCisgICAgLyogUGFyc2UgY29tbWFuZCBsaW5lICovCisgICAgZXhlY19uYW1lID0gYXJndl9bMF07CisgICAgYXJndiA9IGFyZ3ZfZHVwKGFyZ2MgLSAxLCBhcmd2XyArIDEpOworCisgICAgZm9yIChhcmdpID0gYXJnaiA9IGFyZ3Y7ICgqYXJnaiA9ICphcmdpKTsgYXJnaSArPSBhcmcuYXJndl9zdGVwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKyAgICAgICAgYXJnLmFyZ3Zfc3RlcCA9IDE7CisKKyAgICAgICAgaWYgKGFyZ19tYXRjaCgmYXJnLCAmY29kZWNhcmcsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiwgayA9IC0xOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKGlmYWNlcykgLyBzaXplb2YoaWZhY2VzWzBdKTsgaisrKQorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGlmYWNlc1tqXS5uYW1lLCBhcmcudmFsKSkKKyAgICAgICAgICAgICAgICAgICAgayA9IGo7CisKKyAgICAgICAgICAgIGlmIChrID49IDApCisgICAgICAgICAgICAgICAgaWZhY2UgPSBpZmFjZXNba10uaWZhY2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGllKCJFcnJvcjogVW5yZWNvZ25pemVkIGFyZ3VtZW50ICglcykgdG8gLS1jb2RlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLnZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZvdXRwdXRmaWxlLCBhcmdpKSkKKyAgICAgICAgICAgIG91dGZpbGVfcGF0dGVybiA9IGFyZy52YWw7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdXNlX3l2MTIsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICB1c2VfeTRtID0gMDsKKyAgICAgICAgICAgIGZsaXB1diA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZ1c2VfaTQyMCwgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzZV95NG0gPSAwOworICAgICAgICAgICAgZmxpcHV2ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmZsaXB1dmFyZywgYXJnaSkpCisgICAgICAgICAgICBmbGlwdXYgPSAxOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm5vYmxpdGFyZywgYXJnaSkpCisgICAgICAgICAgICBub2JsaXQgPSAxOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnByb2dyZXNzYXJnLCBhcmdpKSkKKyAgICAgICAgICAgIHByb2dyZXNzID0gMTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZsaW1pdGFyZywgYXJnaSkpCisgICAgICAgICAgICBzdG9wX2FmdGVyID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcG9zdHByb2NhcmcsIGFyZ2kpKQorICAgICAgICAgICAgcG9zdHByb2MgPSAxOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm1kNWFyZywgYXJnaSkpCisgICAgICAgICAgICBkb19tZDUgPSAxOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnN1bW1hcnlhcmcsIGFyZ2kpKQorICAgICAgICAgICAgc3VtbWFyeSA9IDE7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdGhyZWFkc2FyZywgYXJnaSkpCisgICAgICAgICAgICBjZmcudGhyZWFkcyA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnZlcmJvc2VhcmcsIGFyZ2kpKQorICAgICAgICAgICAgcXVpZXQgPSAwOworCisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYWRkbm9pc2VfbGV2ZWwsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICBwb3N0cHJvYyA9IDE7CisgICAgICAgICAgICB2cDhfcHBfY2ZnLnBvc3RfcHJvY19mbGFnIHw9IFZQOF9BREROT0lTRTsKKyAgICAgICAgICAgIHZwOF9wcF9jZmcubm9pc2VfbGV2ZWwgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmRlbWFjcm9ibG9ja19sZXZlbCwgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKKyAgICAgICAgICAgIHZwOF9wcF9jZmcucG9zdF9wcm9jX2ZsYWcgfD0gVlA4X0RFTUFDUk9CTE9DSzsKKyAgICAgICAgICAgIHZwOF9wcF9jZmcuZGVibG9ja2luZ19sZXZlbCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZGVibG9jaywgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKKyAgICAgICAgICAgIHZwOF9wcF9jZmcucG9zdF9wcm9jX2ZsYWcgfD0gVlA4X0RFQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZtZnFlLCBhcmdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9zdHByb2MgPSAxOworICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyB8PSBWUDhfTUZRRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2RlYnVnX2luZm8sIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGV2ZWwgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKworICAgICAgICAgICAgcG9zdHByb2MgPSAxOworICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyAmPSB+MHg3OworCisgICAgICAgICAgICBpZiAobGV2ZWwpCisgICAgICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyB8PSBsZXZlbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2Rpc3BfcmVmX2ZyYW1lLCBhcmdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gYXJnX3BhcnNlX2ludCgmYXJnKTsKKyAgICAgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3N0cHJvYyA9IDE7CisgICAgICAgICAgICAgICAgdnA4X2RiZ19jb2xvcl9yZWZfZnJhbWUgPSBmbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2Rpc3BfbWJfbW9kZXMsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhcmdfcGFyc2VfaW50KCZhcmcpOworICAgICAgICAgICAgaWYgKGZsYWdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKKyAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX21iX21vZGVzID0gZmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwcF9kaXNwX2JfbW9kZXMsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhcmdfcGFyc2VfaW50KCZhcmcpOworICAgICAgICAgICAgaWYgKGZsYWdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKKyAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX2JfbW9kZXMgPSBmbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2Rpc3BfbXZzLCBhcmdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gYXJnX3BhcnNlX2ludCgmYXJnKTsKKyAgICAgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3N0cHJvYyA9IDE7CisgICAgICAgICAgICAgICAgdnA4X2RiZ19kaXNwbGF5X212ID0gZmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZlcnJvcl9jb25jZWFsbWVudCwgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVjX2VuYWJsZWQgPSAxOworICAgICAgICB9CisKKyNlbmRpZgorICAgICAgICBlbHNlCisgICAgICAgICAgICBhcmdqKys7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHVucmVjb2duaXplZCBvcHRpb25zICovCisgICAgZm9yIChhcmdpID0gYXJndjsgKmFyZ2k7IGFyZ2krKykKKyAgICAgICAgaWYgKGFyZ2lbMF1bMF0gPT0gJy0nICYmIHN0cmxlbihhcmdpWzBdKSA+IDEpCisgICAgICAgICAgICBkaWUoIkVycm9yOiBVbnJlY29nbml6ZWQgb3B0aW9uICVzXG4iLCAqYXJnaSk7CisKKyAgICAvKiBIYW5kbGUgbm9uLW9wdGlvbiBhcmd1bWVudHMgKi8KKyAgICBmbiA9IGFyZ3ZbMF07CisKKyAgICBpZiAoIWZuKQorICAgICAgICB1c2FnZV9leGl0KCk7CisKKyAgICAvKiBPcGVuIGZpbGUgKi8KKyAgICBpbmZpbGUgPSBzdHJjbXAoZm4sICItIikgPyBmb3BlbihmbiwgInJiIikgOiBzZXRfYmluYXJ5X21vZGUoc3RkaW4pOworCisgICAgaWYgKCFpbmZpbGUpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJyIsCisgICAgICAgICAgICAgICAgc3RyY21wKGZuLCAiLSIpID8gZm4gOiAic3RkaW4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisjaWYgQ09ORklHX09TX1NVUFBPUlQKKyAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZHVtcCB0byB0aGUgdGVybWluYWwsIHVubGVzcyBmb3JjZWQgdG8gd2l0aCAtbyAtICovCisgICAgaWYoIW91dGZpbGVfcGF0dGVybiAmJiBpc2F0dHkoZmlsZW5vKHN0ZG91dCkpICYmICFkb19tZDUgJiYgIW5vYmxpdCkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJOb3QgZHVtcGluZyByYXcgdmlkZW8gdG8geW91ciB0ZXJtaW5hbC4gVXNlICctbyAtJyB0byAiCisgICAgICAgICAgICAgICAgIm92ZXJyaWRlLlxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorI2VuZGlmCisgICAgaW5wdXQuaW5maWxlID0gaW5maWxlOworICAgIGlmKGZpbGVfaXNfaXZmKGluZmlsZSwgJmZvdXJjYywgJndpZHRoLCAmaGVpZ2h0LCAmZnBzX2RlbiwKKyAgICAgICAgICAgICAgICAgICAmZnBzX251bSkpCisgICAgICAgIGlucHV0LmtpbmQgPSBJVkZfRklMRTsKKyAgICBlbHNlIGlmKGZpbGVfaXNfd2VibSgmaW5wdXQsICZmb3VyY2MsICZ3aWR0aCwgJmhlaWdodCwgJmZwc19kZW4sICZmcHNfbnVtKSkKKyAgICAgICAgaW5wdXQua2luZCA9IFdFQk1fRklMRTsKKyAgICBlbHNlIGlmKGZpbGVfaXNfcmF3KGluZmlsZSwgJmZvdXJjYywgJndpZHRoLCAmaGVpZ2h0LCAmZnBzX2RlbiwgJmZwc19udW0pKQorICAgICAgICBpbnB1dC5raW5kID0gUkFXX0ZJTEU7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgaW5wdXQgZmlsZSB0eXBlLlxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogSWYgdGhlIG91dHB1dCBmaWxlIGlzIG5vdCBzZXQgb3IgZG9lc24ndCBoYXZlIGEgc2VxdWVuY2UgbnVtYmVyIGluCisgICAgICogaXQsIHRoZW4gd2Ugb25seSBvcGVuIGl0IG9uY2UuCisgICAgICovCisgICAgb3V0ZmlsZV9wYXR0ZXJuID0gb3V0ZmlsZV9wYXR0ZXJuID8gb3V0ZmlsZV9wYXR0ZXJuIDogIi0iOworICAgIHNpbmdsZV9maWxlID0gMTsKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBvdXRmaWxlX3BhdHRlcm47CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJyUnKTsKKyAgICAgICAgICAgIGlmKHAgJiYgcFsxXSA+PSAnMScgJiYgcFsxXSA8PSAnOScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcGF0dGVybiBjb250YWlucyBzZXF1ZW5jZSBudW1iZXIsIHNvIGl0J3Mgbm90IHVuaXF1ZS4gKi8KKyAgICAgICAgICAgICAgICBzaW5nbGVfZmlsZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgfSB3aGlsZShwKTsKKyAgICB9CisKKyAgICBpZihzaW5nbGVfZmlsZSAmJiAhbm9ibGl0KQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZmlsZW5hbWUob3V0ZmlsZV9wYXR0ZXJuLCBvdXRmaWxlLCBzaXplb2Yob3V0ZmlsZSktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMCk7CisgICAgICAgIG91dCA9IG91dF9vcGVuKG91dGZpbGUsIGRvX21kNSk7CisgICAgfQorCisgICAgaWYgKHVzZV95NG0gJiYgIW5vYmxpdCkKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgIGlmICghc2luZ2xlX2ZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWVVWNE1QRUcyIG5vdCBzdXBwb3J0ZWQgd2l0aCBvdXRwdXQgcGF0dGVybnMsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdHJ5IC0taTQyMCBvciAtLXl2MTIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKworICAgICAgICBpZihpbnB1dC5raW5kID09IFdFQk1fRklMRSkKKyAgICAgICAgICAgIGlmKHdlYm1fZ3Vlc3NfZnJhbWVyYXRlKCZpbnB1dCwgJmZwc19kZW4sICZmcHNfbnVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBndWVzcyBmcmFtZXJhdGUgLS0gZXJyb3IgcGFyc2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJtIGZpbGU/XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgLypOb3RlOiBXZSBjYW4ndCBvdXRwdXQgYW4gYXNwZWN0IHJhdGlvIGhlcmUgYmVjYXVzZSBJVkYgZG9lc24ndAorICAgICAgICAgICBzdG9yZSBvbmUsIGFuZCBuZWl0aGVyIGRvZXMgVlA4LgorICAgICAgICAgIFRoYXQgd2lsbCBoYXZlIHRvIHdhaXQgdW50aWwgdGhlc2UgdG9vbHMgc3VwcG9ydCBXZWJNIG5hdGl2ZWx5LiovCisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiWVVWNE1QRUcyIEMlcyBXJXUgSCV1IEYldToldSBJJWNcbiIsCisgICAgICAgICAgICAgICAgIjQyMGpwZWciLCB3aWR0aCwgaGVpZ2h0LCBmcHNfbnVtLCBmcHNfZGVuLCAncCcpOworICAgICAgICBvdXRfcHV0KG91dCwgKHVuc2lnbmVkIGNoYXIgKilidWZmZXIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClzdHJsZW4oYnVmZmVyKSwgZG9fbWQ1KTsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBjb2RlYyBmcm9tIHRoZSBmb3VyY2MuICovCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihpZmFjZXMpIC8gc2l6ZW9mKGlmYWNlc1swXSk7IGkrKykKKyAgICAgICAgaWYgKChmb3VyY2MgJiBpZmFjZXNbaV0uZm91cmNjX21hc2spID09IGlmYWNlc1tpXS5mb3VyY2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZweF9jb2RlY19pZmFjZV90ICAqaXZmX2lmYWNlID0gaWZhY2VzW2ldLmlmYWNlOworCisgICAgICAgICAgICBpZiAoaWZhY2UgJiYgaWZhY2UgIT0gaXZmX2lmYWNlKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90aWNlIC0tIElWRiBoZWFkZXIgaW5kaWNhdGVzIGNvZGVjOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlc1tpXS5uYW1lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZmFjZSA9IGl2Zl9pZmFjZTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGRlY19mbGFncyA9IChwb3N0cHJvYyA/IFZQWF9DT0RFQ19VU0VfUE9TVFBST0MgOiAwKSB8CisgICAgICAgICAgICAgICAgKGVjX2VuYWJsZWQgPyBWUFhfQ09ERUNfVVNFX0VSUk9SX0NPTkNFQUxNRU5UIDogMCk7CisgICAgaWYgKHZweF9jb2RlY19kZWNfaW5pdCgmZGVjb2RlciwgaWZhY2UgPyBpZmFjZSA6ICBpZmFjZXNbMF0uaWZhY2UsICZjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNfZmxhZ3MpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyOiAlc1xuIiwgdnB4X2NvZGVjX2Vycm9yKCZkZWNvZGVyKSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKCFxdWlldCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZGVjb2Rlci5uYW1lKTsKKworI2lmIENPTkZJR19WUDhfREVDT0RFUgorCisgICAgaWYgKHZwOF9wcF9jZmcucG9zdF9wcm9jX2ZsYWcKKyAgICAgICAgJiYgdnB4X2NvZGVjX2NvbnRyb2woJmRlY29kZXIsIFZQOF9TRVRfUE9TVFBST0MsICZ2cDhfcHBfY2ZnKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwb3N0cHJvYzogJXNcbiIsIHZweF9jb2RlY19lcnJvcigmZGVjb2RlcikpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmICh2cDhfZGJnX2NvbG9yX3JlZl9mcmFtZQorICAgICAgICAmJiB2cHhfY29kZWNfY29udHJvbCgmZGVjb2RlciwgVlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FLCB2cDhfZGJnX2NvbG9yX3JlZl9mcmFtZSkpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25maWd1cmUgcmVmZXJlbmNlIGJsb2NrIHZpc3VhbGl6ZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAodnA4X2RiZ19jb2xvcl9tYl9tb2RlcworICAgICAgICAmJiB2cHhfY29kZWNfY29udHJvbCgmZGVjb2RlciwgVlA4X1NFVF9EQkdfQ09MT1JfTUJfTU9ERVMsIHZwOF9kYmdfY29sb3JfbWJfbW9kZXMpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29uZmlndXJlIG1hY3JvIGJsb2NrIHZpc3VhbGl6ZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAodnA4X2RiZ19jb2xvcl9iX21vZGVzCisgICAgICAgICYmIHZweF9jb2RlY19jb250cm9sKCZkZWNvZGVyLCBWUDhfU0VUX0RCR19DT0xPUl9CX01PREVTLCB2cDhfZGJnX2NvbG9yX2JfbW9kZXMpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29uZmlndXJlIGJsb2NrIHZpc3VhbGl6ZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAodnA4X2RiZ19kaXNwbGF5X212CisgICAgICAgICYmIHZweF9jb2RlY19jb250cm9sKCZkZWNvZGVyLCBWUDhfU0VUX0RCR19ESVNQTEFZX01WLCB2cDhfZGJnX2Rpc3BsYXlfbXYpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29uZmlndXJlIG1vdGlvbiB2ZWN0b3IgdmlzdWFsaXplcjogJXNcbiIsIHZweF9jb2RlY19lcnJvcigmZGVjb2RlcikpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyNlbmRpZgorCisgICAgLyogRGVjb2RlIGZpbGUgKi8KKyAgICB3aGlsZSAoIXJlYWRfZnJhbWUoJmlucHV0LCAmYnVmLCAmYnVmX3N6LCAmYnVmX2FsbG9jX3N6KSkKKyAgICB7CisgICAgICAgIHZweF9jb2RlY19pdGVyX3QgIGl0ZXIgPSBOVUxMOworICAgICAgICB2cHhfaW1hZ2VfdCAgICAqaW1nOworICAgICAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgdGltZXI7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBjb3JydXB0ZWQ7CisKKyAgICAgICAgdnB4X3VzZWNfdGltZXJfc3RhcnQoJnRpbWVyKTsKKworICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgmZGVjb2RlciwgYnVmLCAodW5zaWduZWQgaW50KWJ1Zl9zeiwgTlVMTCwgMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoJmRlY29kZXIpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lOiAlc1xuIiwgdnB4X2NvZGVjX2Vycm9yKCZkZWNvZGVyKSk7CisKKyAgICAgICAgICAgIGlmIChkZXRhaWwpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb246ICVzXG4iLCBkZXRhaWwpOworCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZ0aW1lcik7CisgICAgICAgIGR4X3RpbWUgKz0gKHVuc2lnbmVkIGludCl2cHhfdXNlY190aW1lcl9lbGFwc2VkKCZ0aW1lcik7CisKKyAgICAgICAgKytmcmFtZV9pbjsKKworICAgICAgICBpZiAodnB4X2NvZGVjX2NvbnRyb2woJmRlY29kZXIsIFZQOERfR0VUX0ZSQU1FX0NPUlJVUFRFRCwgJmNvcnJ1cHRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIFZQOF9HRVRfRlJBTUVfQ09SUlVQVEVEOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2Vycm9yKCZkZWNvZGVyKSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVzX2NvcnJ1cHRlZCArPSBjb3JydXB0ZWQ7CisKKyAgICAgICAgdnB4X3VzZWNfdGltZXJfc3RhcnQoJnRpbWVyKTsKKworICAgICAgICBpZiAoKGltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoJmRlY29kZXIsICZpdGVyKSkpCisgICAgICAgICAgICArK2ZyYW1lX291dDsKKworICAgICAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZ0aW1lcik7CisgICAgICAgIGR4X3RpbWUgKz0gKHVuc2lnbmVkIGludCl2cHhfdXNlY190aW1lcl9lbGFwc2VkKCZ0aW1lcik7CisKKyAgICAgICAgaWYgKHByb2dyZXNzKQorICAgICAgICAgICAgc2hvd19wcm9ncmVzcyhmcmFtZV9pbiwgZnJhbWVfb3V0LCBkeF90aW1lKTsKKworICAgICAgICBpZiAoIW5vYmxpdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGltZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgeTsKKyAgICAgICAgICAgICAgICBjaGFyIG91dF9mbltQQVRIX01BWF07CisgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmOworCisgICAgICAgICAgICAgICAgaWYgKCFzaW5nbGVfZmlsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzaXplb2Yob3V0X2ZuKS0xOworCisgICAgICAgICAgICAgICAgICAgIG91dF9mbltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZmlsZW5hbWUob3V0ZmlsZV9wYXR0ZXJuLCBvdXRfZm4sIGxlbi0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWctPmRfdywgaW1nLT5kX2gsIGZyYW1lX2luKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gb3V0X29wZW4ob3V0X2ZuLCBkb19tZDUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHVzZV95NG0pCisgICAgICAgICAgICAgICAgICAgIG91dF9wdXQob3V0LCAodW5zaWduZWQgY2hhciAqKSJGUkFNRVxuIiwgNiwgZG9fbWQ1KTsKKworICAgICAgICAgICAgICAgIGJ1ZiA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpbWctPmRfaDsgeSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0X3B1dChvdXQsIGJ1ZiwgaW1nLT5kX3csIGRvX21kNSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmID0gaW1nLT5wbGFuZXNbZmxpcHV2P1ZQWF9QTEFORV9WOlZQWF9QTEFORV9VXTsKKworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAoMSArIGltZy0+ZF9oKSAvIDI7IHkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dF9wdXQob3V0LCBidWYsICgxICsgaW1nLT5kX3cpIC8gMiwgZG9fbWQ1KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWYgPSBpbWctPnBsYW5lc1tmbGlwdXY/VlBYX1BMQU5FX1U6VlBYX1BMQU5FX1ZdOworCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8ICgxICsgaW1nLT5kX2gpIC8gMjsgeSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0X3B1dChvdXQsIGJ1ZiwgKDEgKyBpbWctPmRfdykgLyAyLCBkb19tZDUpOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghc2luZ2xlX2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIG91dF9jbG9zZShvdXQsIG91dF9mbiwgZG9fbWQ1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdG9wX2FmdGVyICYmIGZyYW1lX2luID49IHN0b3BfYWZ0ZXIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3VtbWFyeSB8fCBwcm9ncmVzcykKKyAgICB7CisgICAgICAgIHNob3dfcHJvZ3Jlc3MoZnJhbWVfaW4sIGZyYW1lX291dCwgZHhfdGltZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVzX2NvcnJ1cHRlZCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiAlZCBmcmFtZXMgY29ycnVwdGVkLlxuIixmcmFtZXNfY29ycnVwdGVkKTsKKworZmFpbDoKKworICAgIGlmICh2cHhfY29kZWNfZGVzdHJveSgmZGVjb2RlcikpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBkZXN0cm95IGRlY29kZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoc2luZ2xlX2ZpbGUgJiYgIW5vYmxpdCkKKyAgICAgICAgb3V0X2Nsb3NlKG91dCwgb3V0ZmlsZSwgZG9fbWQ1KTsKKworICAgIGlmKGlucHV0Lm5lc3RlZ2dfY3R4KQorICAgICAgICBuZXN0ZWdnX2Rlc3Ryb3koaW5wdXQubmVzdGVnZ19jdHgpOworICAgIGlmKGlucHV0LmtpbmQgIT0gV0VCTV9GSUxFKQorICAgICAgICBmcmVlKGJ1Zik7CisgICAgZmNsb3NlKGluZmlsZSk7CisgICAgZnJlZShhcmd2KTsKKworICAgIHJldHVybiBmcmFtZXNfY29ycnVwdGVkID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbGlidnB4L3ZweGVuYy5jIGIvbGlidnB4L3ZweGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDllNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgvdnB4ZW5jLmMKQEAgLTAsMCArMSwyNTY3IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKyAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisgKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICovCisKKworLyogVGhpcyBpcyBhIHNpbXBsZSBwcm9ncmFtIHRoYXQgZW5jb2RlcyBZVjEyIGZpbGVzIGFuZCBnZW5lcmF0ZXMgaXZmCisgKiBmaWxlcyB1c2luZyB0aGUgbmV3IGludGVyZmFjZS4KKyAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCAhQ09ORklHX09TX1NVUFBPUlQKKyNkZWZpbmUgVVNFX1BPU0lYX01NQVAgMAorI2Vsc2UKKyNkZWZpbmUgVVNFX1BPU0lYX01NQVAgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgorI2lmIFVTRV9QT1NJWF9NTUFQCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKyNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtX29wcy5oIgorI2luY2x1ZGUgInZweF9wb3J0cy92cHhfdGltZXIuaCIKKyNpbmNsdWRlICJ0b29sc19jb21tb24uaCIKKyNpbmNsdWRlICJ5NG1pbnB1dC5oIgorI2luY2x1ZGUgImxpYm1rdi9FYm1sV3JpdGVyLmgiCisjaW5jbHVkZSAibGlibWt2L0VibWxJRHMuaCIKKworLyogTmVlZCBzcGVjaWFsIGhhbmRsaW5nIG9mIHRoZXNlIGZ1bmN0aW9ucyBvbiBXaW5kb3dzICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8qIE1TVlMgZG9lc24ndCBkZWZpbmUgb2ZmX3QsIGFuZCB1c2VzIF9me3NlZWssdGVsbH1pNjQgKi8KK3R5cGVkZWYgX19pbnQ2NCBvZmZfdDsKKyNkZWZpbmUgZnNlZWtvIF9mc2Vla2k2NAorI2RlZmluZSBmdGVsbG8gX2Z0ZWxsaTY0CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKy8qIE1pbkdXIGRlZmluZXMgb2ZmX3QgYXMgbG9uZworICAgYW5kIHVzZXMgZntzZWVrLHRlbGx9bzY0L29mZjY0X3QgZm9yIGxhcmdlIGZpbGVzICovCisjZGVmaW5lIGZzZWVrbyBmc2Vla282NAorI2RlZmluZSBmdGVsbG8gZnRlbGxvNjQKKyNkZWZpbmUgb2ZmX3Qgb2ZmNjRfdAorI2VuZGlmCisKKyNkZWZpbmUgTElURVJBTFU2NChoaSxsbykgKCgoKHVpbnQ2NF90KWhpKTw8MzIpfGxvKQorCisvKiBXZSBzaG91bGQgdXNlIDMyLWJpdCBmaWxlIG9wZXJhdGlvbnMgaW4gV2ViTSBmaWxlIGZvcm1hdAorICogd2hlbiBidWlsZGluZyBBUk0gZXhlY3V0YWJsZSBmaWxlICguYXhmKSB3aXRoIFJWQ1QgKi8KKyNpZiAhQ09ORklHX09TX1NVUFBPUlQKK3R5cGVkZWYgbG9uZyBvZmZfdDsKKyNkZWZpbmUgZnNlZWtvIGZzZWVrCisjZGVmaW5lIGZ0ZWxsbyBmdGVsbAorI2VuZGlmCisKKy8qIFN3YWxsb3cgd2FybmluZ3MgYWJvdXQgdW51c2VkIHJlc3VsdHMgb2YgZnJlYWQvZndyaXRlICovCitzdGF0aWMgc2l6ZV90IHdyYXBfZnJlYWQodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gZnJlYWQocHRyLCBzaXplLCBubWVtYiwgc3RyZWFtKTsKK30KKyNkZWZpbmUgZnJlYWQgd3JhcF9mcmVhZAorCitzdGF0aWMgc2l6ZV90IHdyYXBfZndyaXRlKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqc3RyZWFtKQoreworICAgIHJldHVybiBmd3JpdGUocHRyLCBzaXplLCBubWVtYiwgc3RyZWFtKTsKK30KKyNkZWZpbmUgZndyaXRlIHdyYXBfZndyaXRlCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWNfbmFtZTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2RlY19pdGVtCit7CisgICAgY2hhciBjb25zdCAgICAgICAgICAgICAgKm5hbWU7CisgICAgdnB4X2NvZGVjX2lmYWNlX3QgICAgICAgKmlmYWNlOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBmb3VyY2M7Cit9IGNvZGVjc1tdID0KK3sKKyNpZiBDT05GSUdfVlA4X0VOQ09ERVIKKyAgICB7InZwOCIsICAmdnB4X2NvZGVjX3ZwOF9jeF9hbGdvLCAweDMwMzg1MDU2fSwKKyNlbmRpZgorfTsKKworc3RhdGljIHZvaWQgdXNhZ2VfZXhpdCgpOworCisjZGVmaW5lIExPR19FUlJPUihsYWJlbCkgZG8gXAore1wKKyAgICBjb25zdCBjaGFyICpsPWxhYmVsO1wKKyAgICB2YV9saXN0IGFwO1wKKyAgICB2YV9zdGFydChhcCwgZm10KTtcCisgICAgaWYobClcCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIGwpO1wKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApO1wKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7XAorICAgIHZhX2VuZChhcCk7XAorfSB3aGlsZSgwKQorCit2b2lkIGRpZShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBMT0dfRVJST1IoTlVMTCk7CisgICAgdXNhZ2VfZXhpdCgpOworfQorCisKK3ZvaWQgZmF0YWwoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgTE9HX0VSUk9SKCJGYXRhbCIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCit2b2lkIHdhcm4oY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgTE9HX0VSUk9SKCJXYXJuaW5nIik7Cit9CisKKworc3RhdGljIHZvaWQgY3R4X2V4aXRfb25fZXJyb3IodnB4X2NvZGVjX2N0eF90ICpjdHgsIGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIHMpOworICAgIGlmIChjdHgtPmVycikKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoY3R4KTsKKworICAgICAgICB2ZnByaW50ZihzdGRlcnIsIHMsIGFwKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoY3R4KSk7CisKKyAgICAgICAgaWYgKGRldGFpbCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICVzXG4iLCBkZXRhaWwpOworCisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYWJzdHJhY3QgdGhlIGRpZmZlcmVudCB3YXlzIG9mIGhhbmRsaW5nCisgKiBmaXJzdCBwYXNzIHN0YXRpc3RpY3MuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdnB4X2ZpeGVkX2J1Zl90IGJ1ZjsKKyAgICBpbnQgICAgICAgICAgICAgcGFzczsKKyAgICBGSUxFICAgICAgICAgICAqZmlsZTsKKyAgICBjaGFyICAgICAgICAgICAqYnVmX3B0cjsKKyAgICBzaXplX3QgICAgICAgICAgYnVmX2FsbG9jX3N6OworfSBzdGF0c19pb190OworCitpbnQgc3RhdHNfb3Blbl9maWxlKHN0YXRzX2lvX3QgKnN0YXRzLCBjb25zdCBjaGFyICpmcGYsIGludCBwYXNzKQoreworICAgIGludCByZXM7CisKKyAgICBzdGF0cy0+cGFzcyA9IHBhc3M7CisKKyAgICBpZiAocGFzcyA9PSAwKQorICAgIHsKKyAgICAgICAgc3RhdHMtPmZpbGUgPSBmb3BlbihmcGYsICJ3YiIpOworICAgICAgICBzdGF0cy0+YnVmLnN6ID0gMDsKKyAgICAgICAgc3RhdHMtPmJ1Zi5idWYgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgIHJlcyA9IChzdGF0cy0+ZmlsZSAhPSBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiAwCisjZWxpZiBVU0VfUE9TSVhfTU1BUAorICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKyAgICAgICAgaW50IGZkOworCisgICAgICAgIGZkID0gb3BlbihmcGYsIE9fUkRPTkxZKTsKKyAgICAgICAgc3RhdHMtPmZpbGUgPSBmZG9wZW4oZmQsICJyYiIpOworICAgICAgICBmc3RhdChmZCwgJnN0YXRfYnVmKTsKKyAgICAgICAgc3RhdHMtPmJ1Zi5zeiA9IHN0YXRfYnVmLnN0X3NpemU7CisgICAgICAgIHN0YXRzLT5idWYuYnVmID0gbW1hcChOVUxMLCBzdGF0cy0+YnVmLnN6LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIDApOworICAgICAgICByZXMgPSAoc3RhdHMtPmJ1Zi5idWYgIT0gTlVMTCk7CisjZWxzZQorICAgICAgICBzaXplX3QgbmJ5dGVzOworCisgICAgICAgIHN0YXRzLT5maWxlID0gZm9wZW4oZnBmLCAicmIiKTsKKworICAgICAgICBpZiAoZnNlZWsoc3RhdHMtPmZpbGUsIDAsIFNFRUtfRU5EKSkKKyAgICAgICAgICAgIGZhdGFsKCJGaXJzdC1wYXNzIHN0YXRzIGZpbGUgbXVzdCBiZSBzZWVrYWJsZSEiKTsKKworICAgICAgICBzdGF0cy0+YnVmLnN6ID0gc3RhdHMtPmJ1Zl9hbGxvY19zeiA9IGZ0ZWxsKHN0YXRzLT5maWxlKTsKKyAgICAgICAgcmV3aW5kKHN0YXRzLT5maWxlKTsKKworICAgICAgICBzdGF0cy0+YnVmLmJ1ZiA9IG1hbGxvYyhzdGF0cy0+YnVmX2FsbG9jX3N6KTsKKworICAgICAgICBpZiAoIXN0YXRzLT5idWYuYnVmKQorICAgICAgICAgICAgZmF0YWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBmaXJzdC1wYXNzIHN0YXRzIGJ1ZmZlciAoJWx1IGJ5dGVzKSIsCisgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzdGF0cy0+YnVmX2FsbG9jX3N6KTsKKworICAgICAgICBuYnl0ZXMgPSBmcmVhZChzdGF0cy0+YnVmLmJ1ZiwgMSwgc3RhdHMtPmJ1Zi5zeiwgc3RhdHMtPmZpbGUpOworICAgICAgICByZXMgPSAobmJ5dGVzID09IHN0YXRzLT5idWYuc3opOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworaW50IHN0YXRzX29wZW5fbWVtKHN0YXRzX2lvX3QgKnN0YXRzLCBpbnQgcGFzcykKK3sKKyAgICBpbnQgcmVzOworICAgIHN0YXRzLT5wYXNzID0gcGFzczsKKworICAgIGlmICghcGFzcykKKyAgICB7CisgICAgICAgIHN0YXRzLT5idWYuc3ogPSAwOworICAgICAgICBzdGF0cy0+YnVmX2FsbG9jX3N6ID0gNjQgKiAxMDI0OworICAgICAgICBzdGF0cy0+YnVmLmJ1ZiA9IG1hbGxvYyhzdGF0cy0+YnVmX2FsbG9jX3N6KTsKKyAgICB9CisKKyAgICBzdGF0cy0+YnVmX3B0ciA9IHN0YXRzLT5idWYuYnVmOworICAgIHJlcyA9IChzdGF0cy0+YnVmLmJ1ZiAhPSBOVUxMKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKK3ZvaWQgc3RhdHNfY2xvc2Uoc3RhdHNfaW9fdCAqc3RhdHMsIGludCBsYXN0X3Bhc3MpCit7CisgICAgaWYgKHN0YXRzLT5maWxlKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRzLT5wYXNzID09IGxhc3RfcGFzcykKKyAgICAgICAgeworI2lmIDAKKyNlbGlmIFVTRV9QT1NJWF9NTUFQCisgICAgICAgICAgICBtdW5tYXAoc3RhdHMtPmJ1Zi5idWYsIHN0YXRzLT5idWYuc3opOworI2Vsc2UKKyAgICAgICAgICAgIGZyZWUoc3RhdHMtPmJ1Zi5idWYpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBmY2xvc2Uoc3RhdHMtPmZpbGUpOworICAgICAgICBzdGF0cy0+ZmlsZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChzdGF0cy0+cGFzcyA9PSBsYXN0X3Bhc3MpCisgICAgICAgICAgICBmcmVlKHN0YXRzLT5idWYuYnVmKTsKKyAgICB9Cit9CisKK3ZvaWQgc3RhdHNfd3JpdGUoc3RhdHNfaW9fdCAqc3RhdHMsIGNvbnN0IHZvaWQgKnBrdCwgc2l6ZV90IGxlbikKK3sKKyAgICBpZiAoc3RhdHMtPmZpbGUpCisgICAgeworICAgICAgICAodm9pZCkgZndyaXRlKHBrdCwgMSwgbGVuLCBzdGF0cy0+ZmlsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChzdGF0cy0+YnVmLnN6ICsgbGVuID4gc3RhdHMtPmJ1Zl9hbGxvY19zeikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90ICBuZXdfc3ogPSBzdGF0cy0+YnVmX2FsbG9jX3N6ICsgNjQgKiAxMDI0OworICAgICAgICAgICAgY2hhciAgICpuZXdfcHRyID0gcmVhbGxvYyhzdGF0cy0+YnVmLmJ1ZiwgbmV3X3N6KTsKKworICAgICAgICAgICAgaWYgKG5ld19wdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHMtPmJ1Zl9wdHIgPSBuZXdfcHRyICsgKHN0YXRzLT5idWZfcHRyIC0gKGNoYXIgKilzdGF0cy0+YnVmLmJ1Zik7CisgICAgICAgICAgICAgICAgc3RhdHMtPmJ1Zi5idWYgPSBuZXdfcHRyOworICAgICAgICAgICAgICAgIHN0YXRzLT5idWZfYWxsb2Nfc3ogPSBuZXdfc3o7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmF0YWwoIkZhaWxlZCB0byByZWFsbG9jIGZpcnN0cGFzcyBzdGF0cyBidWZmZXIuIik7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoc3RhdHMtPmJ1Zl9wdHIsIHBrdCwgbGVuKTsKKyAgICAgICAgc3RhdHMtPmJ1Zi5zeiArPSBsZW47CisgICAgICAgIHN0YXRzLT5idWZfcHRyICs9IGxlbjsKKyAgICB9Cit9CisKK3ZweF9maXhlZF9idWZfdCBzdGF0c19nZXQoc3RhdHNfaW9fdCAqc3RhdHMpCit7CisgICAgcmV0dXJuIHN0YXRzLT5idWY7Cit9CisKKy8qIFN0ZXJlbyAzRCBwYWNrZWQgZnJhbWUgZm9ybWF0ICovCit0eXBlZGVmIGVudW0gc3RlcmVvX2Zvcm1hdAoreworICAgIFNURVJFT19GT1JNQVRfTU9OTyAgICAgICA9IDAsCisgICAgU1RFUkVPX0ZPUk1BVF9MRUZUX1JJR0hUID0gMSwKKyAgICBTVEVSRU9fRk9STUFUX0JPVFRPTV9UT1AgPSAyLAorICAgIFNURVJFT19GT1JNQVRfVE9QX0JPVFRPTSA9IDMsCisgICAgU1RFUkVPX0ZPUk1BVF9SSUdIVF9MRUZUID0gMTEKK30gc3RlcmVvX2Zvcm1hdF90OworCitlbnVtIHZpZGVvX2ZpbGVfdHlwZQoreworICAgIEZJTEVfVFlQRV9SQVcsCisgICAgRklMRV9UWVBFX0lWRiwKKyAgICBGSUxFX1RZUEVfWTRNCit9OworCitzdHJ1Y3QgZGV0ZWN0X2J1ZmZlciB7CisgICAgY2hhciBidWZbNF07CisgICAgc2l6ZV90IGJ1Zl9yZWFkOworICAgIHNpemVfdCBwb3NpdGlvbjsKK307CisKKworc3RydWN0IGlucHV0X3N0YXRlCit7CisgICAgY2hhciAgICAgICAgICAgICAgICAgKmZuOworICAgIEZJTEUgICAgICAgICAgICAgICAgICpmaWxlOworICAgIHk0bV9pbnB1dCAgICAgICAgICAgICB5NG07CisgICAgc3RydWN0IGRldGVjdF9idWZmZXIgIGRldGVjdDsKKyAgICBlbnVtIHZpZGVvX2ZpbGVfdHlwZSAgZmlsZV90eXBlOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICB3OworICAgIHVuc2lnbmVkIGludCAgICAgICAgICBoOworICAgIHN0cnVjdCB2cHhfcmF0aW9uYWwgICBmcmFtZXJhdGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIHVzZV9pNDIwOworfTsKKworCisjZGVmaW5lIElWRl9GUkFNRV9IRFJfU1ogKDQrOCkgLyogNCBieXRlIHNpemUgKyA4IGJ5dGUgdGltZXN0YW1wICovCitzdGF0aWMgaW50IHJlYWRfZnJhbWUoc3RydWN0IGlucHV0X3N0YXRlICppbnB1dCwgdnB4X2ltYWdlX3QgKmltZykKK3sKKyAgICBGSUxFICpmID0gaW5wdXQtPmZpbGU7CisgICAgZW51bSB2aWRlb19maWxlX3R5cGUgZmlsZV90eXBlID0gaW5wdXQtPmZpbGVfdHlwZTsKKyAgICB5NG1faW5wdXQgKnk0bSA9ICZpbnB1dC0+eTRtOworICAgIHN0cnVjdCBkZXRlY3RfYnVmZmVyICpkZXRlY3QgPSAmaW5wdXQtPmRldGVjdDsKKyAgICBpbnQgcGxhbmUgPSAwOworICAgIGludCBzaG9ydHJlYWQgPSAwOworCisgICAgaWYgKGZpbGVfdHlwZSA9PSBGSUxFX1RZUEVfWTRNKQorICAgIHsKKyAgICAgICAgaWYgKHk0bV9pbnB1dF9mZXRjaF9mcmFtZSh5NG0sIGYsIGltZykgPCAxKQorICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGZpbGVfdHlwZSA9PSBGSUxFX1RZUEVfSVZGKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGp1bmtbSVZGX0ZSQU1FX0hEUl9TWl07CisKKyAgICAgICAgICAgIC8qIFNraXAgdGhlIGZyYW1lIGhlYWRlci4gV2Uga25vdyBob3cgYmlnIHRoZSBmcmFtZSBzaG91bGQgYmUuIFNlZQorICAgICAgICAgICAgICogd3JpdGVfaXZmX2ZyYW1lX2hlYWRlcigpIGZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBmcmFtZSBoZWFkZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKHZvaWQpIGZyZWFkKGp1bmssIDEsIElWRl9GUkFNRV9IRFJfU1osIGYpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyOworICAgICAgICAgICAgaW50IHcgPSAocGxhbmUgPyAoMSArIGltZy0+ZF93KSAvIDIgOiBpbWctPmRfdyk7CisgICAgICAgICAgICBpbnQgaCA9IChwbGFuZSA/ICgxICsgaW1nLT5kX2gpIC8gMiA6IGltZy0+ZF9oKTsKKyAgICAgICAgICAgIGludCByOworCisgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGNvcnJlY3QgcGxhbmUgYmFzZWQgb24gdGhlIGltYWdlIGZvcm1hdC4gVGhlIGZvci1sb29wCisgICAgICAgICAgICAgKiBhbHdheXMgY291bnRzIGluIFksVSxWIG9yZGVyLCBidXQgdGhpcyBtYXkgbm90IG1hdGNoIHRoZSBvcmRlciBvZgorICAgICAgICAgICAgICogdGhlIGRhdGEgb24gZGlzay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChwbGFuZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBwdHIgPSBpbWctPnBsYW5lc1tpbWctPmZtdD09VlBYX0lNR19GTVRfWVYxMj8gVlBYX1BMQU5FX1YgOiBWUFhfUExBTkVfVV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcHRyID0gaW1nLT5wbGFuZXNbaW1nLT5mbXQ9PVZQWF9JTUdfRk1UX1lWMTI/VlBYX1BMQU5FX1UgOiBWUFhfUExBTkVfVl07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHB0ciA9IGltZy0+cGxhbmVzW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IGg7IHIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbmVlZGVkID0gdzsKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3Bvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbGVmdCA9IGRldGVjdC0+YnVmX3JlYWQgLSBkZXRlY3QtPnBvc2l0aW9uOworICAgICAgICAgICAgICAgIGlmIChsZWZ0ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtb3JlID0gKGxlZnQgPCBuZWVkZWQpID8gbGVmdCA6IG5lZWRlZDsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHB0ciwgZGV0ZWN0LT5idWYgKyBkZXRlY3QtPnBvc2l0aW9uLCBtb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3Bvc2l0aW9uID0gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZGVkIC09IG1vcmU7CisgICAgICAgICAgICAgICAgICAgIGRldGVjdC0+cG9zaXRpb24gKz0gbW9yZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5lZWRlZCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaG9ydHJlYWQgfD0gKGZyZWFkKHB0ciArIGJ1Zl9wb3NpdGlvbiwgMSwgbmVlZGVkLCBmKSA8IG5lZWRlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHRyICs9IGltZy0+c3RyaWRlW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAhc2hvcnRyZWFkOworfQorCisKK3Vuc2lnbmVkIGludCBmaWxlX2lzX3k0bShGSUxFICAgICAgKmluZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB5NG1faW5wdXQgKnk0bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgIGRldGVjdFs0XSkKK3sKKyAgICBpZihtZW1jbXAoZGV0ZWN0LCAiWVVWNCIsIDQpID09IDApCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSVZGX0ZJTEVfSERSX1NaICgzMikKK3Vuc2lnbmVkIGludCBmaWxlX2lzX2l2ZihzdHJ1Y3QgaW5wdXRfc3RhdGUgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZm91cmNjKQoreworICAgIGNoYXIgcmF3X2hkcltJVkZfRklMRV9IRFJfU1pdOworICAgIGludCBpc19pdmYgPSAwOworICAgIEZJTEUgKmluZmlsZSA9IGlucHV0LT5maWxlOworICAgIHVuc2lnbmVkIGludCAqd2lkdGggPSAmaW5wdXQtPnc7CisgICAgdW5zaWduZWQgaW50ICpoZWlnaHQgPSAmaW5wdXQtPmg7CisgICAgc3RydWN0IGRldGVjdF9idWZmZXIgKmRldGVjdCA9ICZpbnB1dC0+ZGV0ZWN0OworCisgICAgaWYobWVtY21wKGRldGVjdC0+YnVmLCAiREtJRiIsIDQpICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogU2VlIHdyaXRlX2l2Zl9maWxlX2hlYWRlcigpIGZvciBtb3JlIGRvY3VtZW50YXRpb24gb24gdGhlIGZpbGUgaGVhZGVyCisgICAgICogbGF5b3V0LgorICAgICAqLworICAgIGlmIChmcmVhZChyYXdfaGRyICsgNCwgMSwgSVZGX0ZJTEVfSERSX1NaIC0gNCwgaW5maWxlKQorICAgICAgICA9PSBJVkZfRklMRV9IRFJfU1ogLSA0KQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgaXNfaXZmID0gMTsKKworICAgICAgICAgICAgaWYgKG1lbV9nZXRfbGUxNihyYXdfaGRyICsgNCkgIT0gMCkKKyAgICAgICAgICAgICAgICB3YXJuKCJVbnJlY29nbml6ZWQgSVZGIHZlcnNpb24hIFRoaXMgZmlsZSBtYXkgbm90IGRlY29kZSAiCisgICAgICAgICAgICAgICAgICAgICAicHJvcGVybHkuIik7CisKKyAgICAgICAgICAgICpmb3VyY2MgPSBtZW1fZ2V0X2xlMzIocmF3X2hkciArIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX2l2ZikKKyAgICB7CisgICAgICAgICp3aWR0aCA9IG1lbV9nZXRfbGUxNihyYXdfaGRyICsgMTIpOworICAgICAgICAqaGVpZ2h0ID0gbWVtX2dldF9sZTE2KHJhd19oZHIgKyAxNCk7CisgICAgICAgIGRldGVjdC0+cG9zaXRpb24gPSA0OworICAgIH0KKworICAgIHJldHVybiBpc19pdmY7Cit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfaXZmX2ZpbGVfaGVhZGVyKEZJTEUgKm91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2VuY19jZmdfdCAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmb3VyY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2NudCkKK3sKKyAgICBjaGFyIGhlYWRlclszMl07CisKKyAgICBpZiAoY2ZnLT5nX3Bhc3MgIT0gVlBYX1JDX09ORV9QQVNTICYmIGNmZy0+Z19wYXNzICE9IFZQWF9SQ19MQVNUX1BBU1MpCisgICAgICAgIHJldHVybjsKKworICAgIGhlYWRlclswXSA9ICdEJzsKKyAgICBoZWFkZXJbMV0gPSAnSyc7CisgICAgaGVhZGVyWzJdID0gJ0knOworICAgIGhlYWRlclszXSA9ICdGJzsKKyAgICBtZW1fcHV0X2xlMTYoaGVhZGVyICsgNCwgIDApOyAgICAgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICAgIG1lbV9wdXRfbGUxNihoZWFkZXIgKyA2LCAgMzIpOyAgICAgICAgICAgICAgICAvKiBoZWFkZXJzaXplICovCisgICAgbWVtX3B1dF9sZTMyKGhlYWRlciArIDgsICBmb3VyY2MpOyAgICAgICAgICAgIC8qIGhlYWRlcnNpemUgKi8KKyAgICBtZW1fcHV0X2xlMTYoaGVhZGVyICsgMTIsIGNmZy0+Z193KTsgICAgICAgICAgLyogd2lkdGggKi8KKyAgICBtZW1fcHV0X2xlMTYoaGVhZGVyICsgMTQsIGNmZy0+Z19oKTsgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgbWVtX3B1dF9sZTMyKGhlYWRlciArIDE2LCBjZmctPmdfdGltZWJhc2UuZGVuKTsgLyogcmF0ZSAqLworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyAyMCwgY2ZnLT5nX3RpbWViYXNlLm51bSk7IC8qIHNjYWxlICovCisgICAgbWVtX3B1dF9sZTMyKGhlYWRlciArIDI0LCBmcmFtZV9jbnQpOyAgICAgICAgIC8qIGxlbmd0aCAqLworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyAyOCwgMCk7ICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KKworICAgICh2b2lkKSBmd3JpdGUoaGVhZGVyLCAxLCAzMiwgb3V0ZmlsZSk7Cit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfaXZmX2ZyYW1lX2hlYWRlcihGSUxFICpvdXRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdCkKK3sKKyAgICBjaGFyICAgICAgICAgICAgIGhlYWRlclsxMl07CisgICAgdnB4X2NvZGVjX3B0c190ICBwdHM7CisKKyAgICBpZiAocGt0LT5raW5kICE9IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QpCisgICAgICAgIHJldHVybjsKKworICAgIHB0cyA9IHBrdC0+ZGF0YS5mcmFtZS5wdHM7CisgICAgbWVtX3B1dF9sZTMyKGhlYWRlciwgKGludClwa3QtPmRhdGEuZnJhbWUuc3opOworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyA0LCBwdHMgJiAweEZGRkZGRkZGKTsKKyAgICBtZW1fcHV0X2xlMzIoaGVhZGVyICsgOCwgcHRzID4+IDMyKTsKKworICAgICh2b2lkKSBmd3JpdGUoaGVhZGVyLCAxLCAxMiwgb3V0ZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2l2Zl9mcmFtZV9zaXplKEZJTEUgKm91dGZpbGUsIHNpemVfdCBzaXplKQoreworICAgIGNoYXIgICAgICAgICAgICAgaGVhZGVyWzRdOworICAgIG1lbV9wdXRfbGUzMihoZWFkZXIsIChpbnQpc2l6ZSk7CisgICAgKHZvaWQpIGZ3cml0ZShoZWFkZXIsIDEsIDQsIG91dGZpbGUpOworfQorCisKK3R5cGVkZWYgb2ZmX3QgRWJtbExvYzsKKworCitzdHJ1Y3QgY3VlX2VudHJ5Cit7CisgICAgdW5zaWduZWQgaW50IHRpbWU7CisgICAgdWludDY0X3QgICAgIGxvYzsKK307CisKKworc3RydWN0IEVibWxHbG9iYWwKK3sKKyAgICBpbnQgZGVidWc7CisKKyAgICBGSUxFICAgICpzdHJlYW07CisgICAgaW50NjRfdCBsYXN0X3B0c19tczsKKyAgICB2cHhfcmF0aW9uYWxfdCAgZnJhbWVyYXRlOworCisgICAgLyogVGhlc2UgcG9pbnRlcnMgYXJlIHRvIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50ICovCisgICAgb2ZmX3QgICAgcG9zaXRpb25fcmVmZXJlbmNlOworICAgIG9mZl90ICAgIHNlZWtfaW5mb19wb3M7CisgICAgb2ZmX3QgICAgc2VnbWVudF9pbmZvX3BvczsKKyAgICBvZmZfdCAgICB0cmFja19wb3M7CisgICAgb2ZmX3QgICAgY3VlX3BvczsKKyAgICBvZmZfdCAgICBjbHVzdGVyX3BvczsKKworICAgIC8qIFRoaXMgcG9pbnRlciBpcyB0byBhIHNwZWNpZmljIGVsZW1lbnQgdG8gYmUgc2VyaWFsaXplZCAqLworICAgIG9mZl90ICAgIHRyYWNrX2lkX3BvczsKKworICAgIC8qIFRoZXNlIHBvaW50ZXJzIGFyZSB0byB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgZWxlbWVudCAqLworICAgIEVibWxMb2MgIHN0YXJ0U2VnbWVudDsKKyAgICBFYm1sTG9jICBzdGFydENsdXN0ZXI7CisKKyAgICB1aW50MzJfdCBjbHVzdGVyX3RpbWVjb2RlOworICAgIGludCAgICAgIGNsdXN0ZXJfb3BlbjsKKworICAgIHN0cnVjdCBjdWVfZW50cnkgKmN1ZV9saXN0OworICAgIHVuc2lnbmVkIGludCAgICAgIGN1ZXM7CisKK307CisKKwordm9pZCBFYm1sX1dyaXRlKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IHZvaWQgKmJ1ZmZlcl9pbiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisgICAgKHZvaWQpIGZ3cml0ZShidWZmZXJfaW4sIDEsIGxlbiwgZ2xvYi0+c3RyZWFtKTsKK30KKworI2RlZmluZSBXUklURV9CVUZGRVIocykgXAorZm9yKGkgPSBsZW4tMTsgaT49MDsgaS0tKVwKK3sgXAorICAgIHggPSAoY2hhcikoKihjb25zdCBzICopYnVmZmVyX2luID4+IChpICogQ0hBUl9CSVQpKTsgXAorICAgIEVibWxfV3JpdGUoZ2xvYiwgJngsIDEpOyBcCit9Cit2b2lkIEVibWxfU2VyaWFsaXplKEVibWxHbG9iYWwgKmdsb2IsIGNvbnN0IHZvaWQgKmJ1ZmZlcl9pbiwgaW50IGJ1ZmZlcl9zaXplLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKyAgICBjaGFyIHg7CisgICAgaW50IGk7CisKKyAgICAvKiBidWZmZXJfc2l6ZToKKyAgICAgKiAxIC0gaW50OF90OworICAgICAqIDIgLSBpbnQxNl90OworICAgICAqIDMgLSBpbnQzMl90OworICAgICAqIDQgLSBpbnQ2NF90OworICAgICAqLworICAgIHN3aXRjaCAoYnVmZmVyX3NpemUpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBXUklURV9CVUZGRVIoaW50OF90KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIFdSSVRFX0JVRkZFUihpbnQxNl90KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIFdSSVRFX0JVRkZFUihpbnQzMl90KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIFdSSVRFX0JVRkZFUihpbnQ2NF90KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisjdW5kZWYgV1JJVEVfQlVGRkVSCisKKy8qIE5lZWQgYSBmaXhlZCBzaXplIHNlcmlhbGl6ZXIgZm9yIHRoZSB0cmFjayBJRC4gbGlibWt2IHByb3ZpZGVzIGEgNjQgYml0CisgKiBvbmUsIGJ1dCBub3QgYSAzMiBiaXQgb25lLgorICovCitzdGF0aWMgdm9pZCBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkMzIoRWJtbEdsb2JhbCAqZ2xvYiwgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwgdWludDY0X3QgdWkpCit7CisgICAgdW5zaWduZWQgY2hhciBzaXplU2VyaWFsaXplZCA9IDQgfCAweDgwOworICAgIEVibWxfV3JpdGVJRChnbG9iLCBjbGFzc19pZCk7CisgICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJnNpemVTZXJpYWxpemVkLCBzaXplb2Yoc2l6ZVNlcmlhbGl6ZWQpLCAxKTsKKyAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmdWksIHNpemVvZih1aSksIDQpOworfQorCisKK3N0YXRpYyB2b2lkCitFYm1sX1N0YXJ0U3ViRWxlbWVudChFYm1sR2xvYmFsICpnbG9iLCBFYm1sTG9jICplYm1sTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNsYXNzX2lkKQoreworICAgIC8qIHRvZG8gdGhpcyBpcyBhbHdheXMgdGFraW5nIDggYnl0ZXMsIHRoaXMgbWF5IG5lZWQgbGF0ZXIgb3B0aW1pemF0aW9uICovCisgICAgLyogdGhpcyBpcyBhIGtleSB0aGF0IHNheXMgbGVuZ3RoIHVua25vd24gKi8KKyAgICB1aW50NjRfdCB1bmtub3duTGVuID0gTElURVJBTFU2NCgweDAxRkZGRkZGLCAweEZGRkZGRkZGKTsKKworICAgIEVibWxfV3JpdGVJRChnbG9iLCBjbGFzc19pZCk7CisgICAgKmVibWxMb2MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKKyAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmdW5rbm93bkxlbiwgc2l6ZW9mKHVua25vd25MZW4pLCA4KTsKK30KKworc3RhdGljIHZvaWQKK0VibWxfRW5kU3ViRWxlbWVudChFYm1sR2xvYmFsICpnbG9iLCBFYm1sTG9jICplYm1sTG9jKQoreworICAgIG9mZl90IHBvczsKKyAgICB1aW50NjRfdCBzaXplOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBzdHJlYW0gcG9pbnRlciAqLworICAgIHBvcyA9IGZ0ZWxsbyhnbG9iLT5zdHJlYW0pOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoaXMgZWxlbWVudCAqLworICAgIHNpemUgPSBwb3MgLSAqZWJtbExvYyAtIDg7CisgICAgc2l6ZSB8PSBMSVRFUkFMVTY0KDB4MDEwMDAwMDAsMHgwMDAwMDAwMCk7CisKKyAgICAvKiBTZWVrIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWxlbWVudCBhbmQgd3JpdGUgdGhlIG5ldyBzaXplICovCisgICAgZnNlZWtvKGdsb2ItPnN0cmVhbSwgKmVibWxMb2MsIFNFRUtfU0VUKTsKKyAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmc2l6ZSwgc2l6ZW9mKHNpemUpLCA4KTsKKworICAgIC8qIFJlc2V0IHRoZSBzdHJlYW0gcG9pbnRlciAqLworICAgIGZzZWVrbyhnbG9iLT5zdHJlYW0sIHBvcywgU0VFS19TRVQpOworfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV93ZWJtX3NlZWtfZWxlbWVudChFYm1sR2xvYmFsICplYm1sLCB1bnNpZ25lZCBsb25nIGlkLCBvZmZfdCBwb3MpCit7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gcG9zIC0gZWJtbC0+cG9zaXRpb25fcmVmZXJlbmNlOworICAgIEVibWxMb2Mgc3RhcnQ7CisgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0LCBTZWVrKTsKKyAgICBFYm1sX1NlcmlhbGl6ZUJpbmFyeShlYm1sLCBTZWVrSUQsIGlkKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkNjQoZWJtbCwgU2Vla1Bvc2l0aW9uLCBvZmZzZXQpOworICAgIEVibWxfRW5kU3ViRWxlbWVudChlYm1sLCAmc3RhcnQpOworfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV93ZWJtX3NlZWtfaW5mbyhFYm1sR2xvYmFsICplYm1sKQoreworCisgICAgb2ZmX3QgcG9zOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBzdHJlYW0gcG9pbnRlciAqLworICAgIHBvcyA9IGZ0ZWxsbyhlYm1sLT5zdHJlYW0pOworCisgICAgaWYoZWJtbC0+c2Vla19pbmZvX3BvcykKKyAgICAgICAgZnNlZWtvKGVibWwtPnN0cmVhbSwgZWJtbC0+c2Vla19pbmZvX3BvcywgU0VFS19TRVQpOworICAgIGVsc2UKKyAgICAgICAgZWJtbC0+c2Vla19pbmZvX3BvcyA9IHBvczsKKworICAgIHsKKyAgICAgICAgRWJtbExvYyBzdGFydDsKKworICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sLCAmc3RhcnQsIFNlZWtIZWFkKTsKKyAgICAgICAgd3JpdGVfd2VibV9zZWVrX2VsZW1lbnQoZWJtbCwgVHJhY2tzLCBlYm1sLT50cmFja19wb3MpOworICAgICAgICB3cml0ZV93ZWJtX3NlZWtfZWxlbWVudChlYm1sLCBDdWVzLCAgIGVibWwtPmN1ZV9wb3MpOworICAgICAgICB3cml0ZV93ZWJtX3NlZWtfZWxlbWVudChlYm1sLCBJbmZvLCAgIGVibWwtPnNlZ21lbnRfaW5mb19wb3MpOworICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0KTsKKyAgICB9CisgICAgeworICAgICAgICAvKiBzZWdtZW50IGluZm8gKi8KKyAgICAgICAgRWJtbExvYyBzdGFydEluZm87CisgICAgICAgIHVpbnQ2NF90IGZyYW1lX3RpbWU7CisgICAgICAgIGNoYXIgdmVyc2lvbl9zdHJpbmdbNjRdOworCisgICAgICAgIC8qIEFzc2VtYmxlIHZlcnNpb24gc3RyaW5nICovCisgICAgICAgIGlmKGVibWwtPmRlYnVnKQorICAgICAgICAgICAgc3RyY3B5KHZlcnNpb25fc3RyaW5nLCAidnB4ZW5jIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyY3B5KHZlcnNpb25fc3RyaW5nLCAidnB4ZW5jICIpOworICAgICAgICAgICAgc3RybmNhdCh2ZXJzaW9uX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3ZlcnNpb25fc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih2ZXJzaW9uX3N0cmluZykgLSAxIC0gc3RybGVuKHZlcnNpb25fc3RyaW5nKSk7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZV90aW1lID0gKHVpbnQ2NF90KTEwMDAgKiBlYm1sLT5mcmFtZXJhdGUuZGVuCisgICAgICAgICAgICAgICAgICAgICAvIGVibWwtPmZyYW1lcmF0ZS5udW07CisgICAgICAgIGVibWwtPnNlZ21lbnRfaW5mb19wb3MgPSBmdGVsbG8oZWJtbC0+c3RyZWFtKTsKKyAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0SW5mbywgSW5mbyk7CisgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbCwgVGltZWNvZGVTY2FsZSwgMTAwMDAwMCk7CisgICAgICAgIEVibWxfU2VyaWFsaXplRmxvYXQoZWJtbCwgU2VnbWVudF9EdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKShlYm1sLT5sYXN0X3B0c19tcyArIGZyYW1lX3RpbWUpKTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZWJtbCwgMHg0RDgwLCB2ZXJzaW9uX3N0cmluZyk7CisgICAgICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGVibWwsIDB4NTc0MSwgdmVyc2lvbl9zdHJpbmcpOworICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0SW5mbyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV93ZWJtX2ZpbGVfaGVhZGVyKEVibWxHbG9iYWwgICAgICAgICAgICAgICAgKmdsb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZweF9yYXRpb25hbCAqZnBzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9fZm9ybWF0X3QgICAgICAgICAgICBzdGVyZW9fZm10KQoreworICAgIHsKKyAgICAgICAgRWJtbExvYyBzdGFydDsKKyAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBFQk1MKTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBFQk1MVmVyc2lvbiwgMSk7CisgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRUJNTFJlYWRWZXJzaW9uLCAxKTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBFQk1MTWF4SURMZW5ndGgsIDQpOworICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEVCTUxNYXhTaXplTGVuZ3RoLCA4KTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZ2xvYiwgRG9jVHlwZSwgIndlYm0iKTsKKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBEb2NUeXBlVmVyc2lvbiwgMik7CisgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRG9jVHlwZVJlYWRWZXJzaW9uLCAyKTsKKyAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7CisgICAgfQorICAgIHsKKyAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0U2VnbWVudCwgU2VnbWVudCk7CisgICAgICAgIGdsb2ItPnBvc2l0aW9uX3JlZmVyZW5jZSA9IGZ0ZWxsbyhnbG9iLT5zdHJlYW0pOworICAgICAgICBnbG9iLT5mcmFtZXJhdGUgPSAqZnBzOworICAgICAgICB3cml0ZV93ZWJtX3NlZWtfaW5mbyhnbG9iKTsKKworICAgICAgICB7CisgICAgICAgICAgICBFYm1sTG9jIHRyYWNrU3RhcnQ7CisgICAgICAgICAgICBnbG9iLT50cmFja19wb3MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKKyAgICAgICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZ0cmFja1N0YXJ0LCBUcmFja3MpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0cmFja051bWJlciA9IDE7CisgICAgICAgICAgICAgICAgdWludDY0X3QgICAgIHRyYWNrSUQgPSAwOworCisgICAgICAgICAgICAgICAgRWJtbExvYyBzdGFydDsKKyAgICAgICAgICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmc3RhcnQsIFRyYWNrRW50cnkpOworICAgICAgICAgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tOdW1iZXIsIHRyYWNrTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBnbG9iLT50cmFja19pZF9wb3MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKKyAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkMzIoZ2xvYiwgVHJhY2tVSUQsIHRyYWNrSUQpOworICAgICAgICAgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgVHJhY2tUeXBlLCAxKTsKKyAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhnbG9iLCBDb2RlY0lELCAiVl9WUDgiKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaXhlbFdpZHRoID0gY2ZnLT5nX3c7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaXhlbEhlaWdodCA9IGNmZy0+Z19oOworICAgICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgZnJhbWVSYXRlICAgPSAoZmxvYXQpZnBzLT5udW0vKGZsb2F0KWZwcy0+ZGVuOworCisgICAgICAgICAgICAgICAgICAgIEVibWxMb2MgdmlkZW9TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnZpZGVvU3RhcnQsIFZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBQaXhlbFdpZHRoLCBwaXhlbFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBQaXhlbEhlaWdodCwgcGl4ZWxIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFN0ZXJlb01vZGUsIHN0ZXJlb19mbXQpOworICAgICAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZUZsb2F0KGdsb2IsIEZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZ2aWRlb1N0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7IC8qIFRyYWNrIEVudHJ5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnRyYWNrU3RhcnQpOworICAgICAgICB9CisgICAgICAgIC8qIHNlZ21lbnQgZWxlbWVudCBpcyBvcGVuICovCisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV93ZWJtX2Jsb2NrKEVibWxHbG9iYWwgICAgICAgICAgICAgICAgKmdsb2IsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICAqcGt0KQoreworICAgIHVuc2lnbmVkIGxvbmcgIGJsb2NrX2xlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyICB0cmFja19udW1iZXI7CisgICAgdW5zaWduZWQgc2hvcnQgYmxvY2tfdGltZWNvZGUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgIGZsYWdzOworICAgIGludDY0X3QgICAgICAgIHB0c19tczsKKyAgICBpbnQgICAgICAgICAgICBzdGFydF9jbHVzdGVyID0gMCwgaXNfa2V5ZnJhbWU7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIFBUUyBvZiB0aGlzIGZyYW1lIGluIG1pbGxpc2Vjb25kcyAqLworICAgIHB0c19tcyA9IHBrdC0+ZGF0YS5mcmFtZS5wdHMgKiAxMDAwCisgICAgICAgICAgICAgKiAodWludDY0X3QpY2ZnLT5nX3RpbWViYXNlLm51bSAvICh1aW50NjRfdCljZmctPmdfdGltZWJhc2UuZGVuOworICAgIGlmKHB0c19tcyA8PSBnbG9iLT5sYXN0X3B0c19tcykKKyAgICAgICAgcHRzX21zID0gZ2xvYi0+bGFzdF9wdHNfbXMgKyAxOworICAgIGdsb2ItPmxhc3RfcHRzX21zID0gcHRzX21zOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSByZWxhdGl2ZSB0aW1lIG9mIHRoaXMgYmxvY2sgKi8KKyAgICBpZihwdHNfbXMgLSBnbG9iLT5jbHVzdGVyX3RpbWVjb2RlID4gU0hSVF9NQVgpCisgICAgICAgIHN0YXJ0X2NsdXN0ZXIgPSAxOworICAgIGVsc2UKKyAgICAgICAgYmxvY2tfdGltZWNvZGUgPSAodW5zaWduZWQgc2hvcnQpcHRzX21zIC0gZ2xvYi0+Y2x1c3Rlcl90aW1lY29kZTsKKworICAgIGlzX2tleWZyYW1lID0gKHBrdC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpOworICAgIGlmKHN0YXJ0X2NsdXN0ZXIgfHwgaXNfa2V5ZnJhbWUpCisgICAgeworICAgICAgICBpZihnbG9iLT5jbHVzdGVyX29wZW4pCisgICAgICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0Q2x1c3Rlcik7CisKKyAgICAgICAgLyogT3BlbiB0aGUgbmV3IGNsdXN0ZXIgKi8KKyAgICAgICAgYmxvY2tfdGltZWNvZGUgPSAwOworICAgICAgICBnbG9iLT5jbHVzdGVyX29wZW4gPSAxOworICAgICAgICBnbG9iLT5jbHVzdGVyX3RpbWVjb2RlID0gKHVpbnQzMl90KXB0c19tczsKKyAgICAgICAgZ2xvYi0+Y2x1c3Rlcl9wb3MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKKyAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0Q2x1c3RlciwgQ2x1c3Rlcik7IC8qIGNsdXN0ZXIgKi8KKyAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUaW1lY29kZSwgZ2xvYi0+Y2x1c3Rlcl90aW1lY29kZSk7CisKKyAgICAgICAgLyogU2F2ZSBhIGN1ZSBwb2ludCBpZiB0aGlzIGlzIGEga2V5ZnJhbWUuICovCisgICAgICAgIGlmKGlzX2tleWZyYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgY3VlX2VudHJ5ICpjdWUsICpuZXdfY3VlX2xpc3Q7CisKKyAgICAgICAgICAgIG5ld19jdWVfbGlzdCA9IHJlYWxsb2MoZ2xvYi0+Y3VlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnbG9iLT5jdWVzKzEpICogc2l6ZW9mKHN0cnVjdCBjdWVfZW50cnkpKTsKKyAgICAgICAgICAgIGlmKG5ld19jdWVfbGlzdCkKKyAgICAgICAgICAgICAgICBnbG9iLT5jdWVfbGlzdCA9IG5ld19jdWVfbGlzdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmYXRhbCgiRmFpbGVkIHRvIHJlYWxsb2MgY3VlIGxpc3QuIik7CisKKyAgICAgICAgICAgIGN1ZSA9ICZnbG9iLT5jdWVfbGlzdFtnbG9iLT5jdWVzXTsKKyAgICAgICAgICAgIGN1ZS0+dGltZSA9IGdsb2ItPmNsdXN0ZXJfdGltZWNvZGU7CisgICAgICAgICAgICBjdWUtPmxvYyA9IGdsb2ItPmNsdXN0ZXJfcG9zOworICAgICAgICAgICAgZ2xvYi0+Y3VlcysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV3JpdGUgdGhlIFNpbXBsZSBCbG9jayAqLworICAgIEVibWxfV3JpdGVJRChnbG9iLCBTaW1wbGVCbG9jayk7CisKKyAgICBibG9ja19sZW5ndGggPSAodW5zaWduZWQgbG9uZylwa3QtPmRhdGEuZnJhbWUuc3ogKyA0OworICAgIGJsb2NrX2xlbmd0aCB8PSAweDEwMDAwMDAwOworICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZibG9ja19sZW5ndGgsIHNpemVvZihibG9ja19sZW5ndGgpLCA0KTsKKworICAgIHRyYWNrX251bWJlciA9IDE7CisgICAgdHJhY2tfbnVtYmVyIHw9IDB4ODA7CisgICAgRWJtbF9Xcml0ZShnbG9iLCAmdHJhY2tfbnVtYmVyLCAxKTsKKworICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZibG9ja190aW1lY29kZSwgc2l6ZW9mKGJsb2NrX3RpbWVjb2RlKSwgMik7CisKKyAgICBmbGFncyA9IDA7CisgICAgaWYoaXNfa2V5ZnJhbWUpCisgICAgICAgIGZsYWdzIHw9IDB4ODA7CisgICAgaWYocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0lOVklTSUJMRSkKKyAgICAgICAgZmxhZ3MgfD0gMHgwODsKKyAgICBFYm1sX1dyaXRlKGdsb2IsICZmbGFncywgMSk7CisKKyAgICBFYm1sX1dyaXRlKGdsb2IsIHBrdC0+ZGF0YS5mcmFtZS5idWYsICh1bnNpZ25lZCBsb25nKXBrdC0+ZGF0YS5mcmFtZS5zeik7Cit9CisKKworc3RhdGljIHZvaWQKK3dyaXRlX3dlYm1fZmlsZV9mb290ZXIoRWJtbEdsb2JhbCAqZ2xvYiwgbG9uZyBoYXNoKQoreworCisgICAgaWYoZ2xvYi0+Y2x1c3Rlcl9vcGVuKQorICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0Q2x1c3Rlcik7CisKKyAgICB7CisgICAgICAgIEVibWxMb2Mgc3RhcnQ7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgIGdsb2ItPmN1ZV9wb3MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKKyAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBDdWVzKTsKKyAgICAgICAgZm9yKGk9MDsgaTxnbG9iLT5jdWVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBjdWVfZW50cnkgKmN1ZSA9ICZnbG9iLT5jdWVfbGlzdFtpXTsKKyAgICAgICAgICAgIEVibWxMb2Mgc3RhcnQ7CisKKyAgICAgICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZzdGFydCwgQ3VlUG9pbnQpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVibWxMb2Mgc3RhcnQ7CisKKyAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEN1ZVRpbWUsIGN1ZS0+dGltZSk7CisKKyAgICAgICAgICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmc3RhcnQsIEN1ZVRyYWNrUG9zaXRpb25zKTsKKyAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEN1ZVRyYWNrLCAxKTsKKyAgICAgICAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkNjQoZ2xvYiwgQ3VlQ2x1c3RlclBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWUtPmxvYyAtIGdsb2ItPnBvc2l0aW9uX3JlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0KTsKKyAgICB9CisKKyAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0U2VnbWVudCk7CisKKyAgICAvKiBQYXRjaCB1cCB0aGUgc2VlayBpbmZvIGJsb2NrICovCisgICAgd3JpdGVfd2VibV9zZWVrX2luZm8oZ2xvYik7CisKKyAgICAvKiBQYXRjaCB1cCB0aGUgdHJhY2sgaWQgKi8KKyAgICBmc2Vla28oZ2xvYi0+c3RyZWFtLCBnbG9iLT50cmFja19pZF9wb3MsIFNFRUtfU0VUKTsKKyAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkMzIoZ2xvYiwgVHJhY2tVSUQsIGdsb2ItPmRlYnVnID8gMHhERUFEQkVFRiA6IGhhc2gpOworCisgICAgZnNlZWtvKGdsb2ItPnN0cmVhbSwgMCwgU0VFS19FTkQpOworfQorCisKKy8qIE11cm11ciBoYXNoIGRlcml2ZWQgZnJvbSBwdWJsaWMgZG9tYWluIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhdAorICogICBodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL211cm11cmhhc2gvCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXVybXVyICggY29uc3Qgdm9pZCAqIGtleSwgaW50IGxlbiwgdW5zaWduZWQgaW50IHNlZWQgKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBtID0gMHg1YmQxZTk5NTsKKyAgICBjb25zdCBpbnQgciA9IDI0OworCisgICAgdW5zaWduZWQgaW50IGggPSBzZWVkIF4gbGVuOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWtleTsKKworICAgIHdoaWxlKGxlbiA+PSA0KQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGs7CisKKyAgICAgICAgayAgPSBkYXRhWzBdOworICAgICAgICBrIHw9IGRhdGFbMV0gPDwgODsKKyAgICAgICAgayB8PSBkYXRhWzJdIDw8IDE2OworICAgICAgICBrIHw9IGRhdGFbM10gPDwgMjQ7CisKKyAgICAgICAgayAqPSBtOworICAgICAgICBrIF49IGsgPj4gcjsKKyAgICAgICAgayAqPSBtOworCisgICAgICAgIGggKj0gbTsKKyAgICAgICAgaCBePSBrOworCisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgfQorCisgICAgc3dpdGNoKGxlbikKKyAgICB7CisgICAgY2FzZSAzOiBoIF49IGRhdGFbMl0gPDwgMTY7CisgICAgY2FzZSAyOiBoIF49IGRhdGFbMV0gPDwgODsKKyAgICBjYXNlIDE6IGggXj0gZGF0YVswXTsKKyAgICAgICAgICAgIGggKj0gbTsKKyAgICB9OworCisgICAgaCBePSBoID4+IDEzOworICAgIGggKj0gbTsKKyAgICBoIF49IGggPj4gMTU7CisKKyAgICByZXR1cm4gaDsKK30KKworI2luY2x1ZGUgIm1hdGguaCIKKworc3RhdGljIGRvdWJsZSB2cDhfbXNlMnBzbnIoZG91YmxlIFNhbXBsZXMsIGRvdWJsZSBQZWFrLCBkb3VibGUgTXNlKQoreworICAgIGRvdWJsZSBwc25yOworCisgICAgaWYgKChkb3VibGUpTXNlID4gMC4wKQorICAgICAgICBwc25yID0gMTAuMCAqIGxvZzEwKFBlYWsgKiBQZWFrICogU2FtcGxlcyAvIE1zZSk7CisgICAgZWxzZQorICAgICAgICBwc25yID0gNjA7ICAgICAgLyogTGltaXQgdG8gcHJldmVudCAvIDAgKi8KKworICAgIGlmIChwc25yID4gNjApCisgICAgICAgIHBzbnIgPSA2MDsKKworICAgIHJldHVybiBwc25yOworfQorCisKKyNpbmNsdWRlICJhcmdzLmgiCitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGRlYnVnbW9kZSA9IEFSR19ERUYoIkQiLCAiZGVidWciLCAwLAorICAgICAgICAiRGVidWcgbW9kZSAobWFrZXMgb3V0cHV0IGRldGVybWluaXN0aWMpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IG91dHB1dGZpbGUgPSBBUkdfREVGKCJvIiwgIm91dHB1dCIsIDEsCisgICAgICAgICJPdXRwdXQgZmlsZW5hbWUiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgdXNlX3l2MTIgPSBBUkdfREVGKE5VTEwsICJ5djEyIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5wdXQgZmlsZSBpcyBZVjEyICIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB1c2VfaTQyMCA9IEFSR19ERUYoTlVMTCwgImk0MjAiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnB1dCBmaWxlIGlzIEk0MjAgKGRlZmF1bHQpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGNvZGVjYXJnID0gQVJHX0RFRihOVUxMLCAiY29kZWMiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlYyB0byB1c2UiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcGFzc2VzICAgICAgICAgICA9IEFSR19ERUYoInAiLCAicGFzc2VzIiwgMSwKKyAgICAgICAgIk51bWJlciBvZiBwYXNzZXMgKDEvMikiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcGFzc19hcmcgICAgICAgICA9IEFSR19ERUYoTlVMTCwgInBhc3MiLCAxLAorICAgICAgICAiUGFzcyB0byBleGVjdXRlICgxLzIpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGZwZl9uYW1lICAgICAgICAgPSBBUkdfREVGKE5VTEwsICJmcGYiLCAxLAorICAgICAgICAiRmlyc3QgcGFzcyBzdGF0aXN0aWNzIGZpbGUgbmFtZSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBsaW1pdCA9IEFSR19ERUYoTlVMTCwgImxpbWl0IiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9wIGVuY29kaW5nIGFmdGVyIG4gaW5wdXQgZnJhbWVzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGRlYWRsaW5lICAgICAgICAgPSBBUkdfREVGKCJkIiwgImRlYWRsaW5lIiwgMSwKKyAgICAgICAgIkRlYWRsaW5lIHBlciBmcmFtZSAodXNlYykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgYmVzdF9kbCAgICAgICAgICA9IEFSR19ERUYoTlVMTCwgImJlc3QiLCAwLAorICAgICAgICAiVXNlIEJlc3QgUXVhbGl0eSBEZWFkbGluZSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBnb29kX2RsICAgICAgICAgID0gQVJHX0RFRihOVUxMLCAiZ29vZCIsIDAsCisgICAgICAgICJVc2UgR29vZCBRdWFsaXR5IERlYWRsaW5lIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHJ0X2RsICAgICAgICAgICAgPSBBUkdfREVGKE5VTEwsICJydCIsIDAsCisgICAgICAgICJVc2UgUmVhbHRpbWUgUXVhbGl0eSBEZWFkbGluZSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBxdWlldGFyZyAgICAgICAgID0gQVJHX0RFRigicSIsICJxdWlldCIsIDAsCisgICAgICAgICJEbyBub3QgcHJpbnQgZW5jb2RlIHByb2dyZXNzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHZlcmJvc2VhcmcgICAgICAgPSBBUkdfREVGKCJ2IiwgInZlcmJvc2UiLCAwLAorICAgICAgICAiU2hvdyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHNucmFyZyAgICAgICAgICA9IEFSR19ERUYoTlVMTCwgInBzbnIiLCAwLAorICAgICAgICAiU2hvdyBQU05SIGluIHN0YXR1cyBsaW5lIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGZyYW1lcmF0ZSAgICAgICAgPSBBUkdfREVGKE5VTEwsICJmcHMiLCAxLAorICAgICAgICAiU3RyZWFtIGZyYW1lIHJhdGUgKHJhdGUvc2NhbGUpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHVzZV9pdmYgICAgICAgICAgPSBBUkdfREVGKE5VTEwsICJpdmYiLCAwLAorICAgICAgICAiT3V0cHV0IElWRiAoZGVmYXVsdCBpcyBXZWJNKSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBvdXRfcGFydCA9IEFSR19ERUYoIlAiLCAib3V0cHV0LXBhcnRpdGlvbnMiLCAwLAorICAgICAgICAiTWFrZXMgZW5jb2RlciBvdXRwdXQgcGFydGl0aW9ucy4gUmVxdWlyZXMgSVZGIG91dHB1dCEiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcV9oaXN0X24gICAgICAgICA9IEFSR19ERUYoTlVMTCwgInEtaGlzdCIsIDEsCisgICAgICAgICJTaG93IHF1YW50aXplciBoaXN0b2dyYW0gKG4tYnVja2V0cykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgcmF0ZV9oaXN0X24gICAgICAgICA9IEFSR19ERUYoTlVMTCwgInJhdGUtaGlzdCIsIDEsCisgICAgICAgICJTaG93IHJhdGUgaGlzdG9ncmFtIChuLWJ1Y2tldHMpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90ICptYWluX2FyZ3NbXSA9Cit7CisgICAgJmRlYnVnbW9kZSwKKyAgICAmb3V0cHV0ZmlsZSwgJmNvZGVjYXJnLCAmcGFzc2VzLCAmcGFzc19hcmcsICZmcGZfbmFtZSwgJmxpbWl0LCAmZGVhZGxpbmUsCisgICAgJmJlc3RfZGwsICZnb29kX2RsLCAmcnRfZGwsCisgICAgJnF1aWV0YXJnLCAmdmVyYm9zZWFyZywgJnBzbnJhcmcsICZ1c2VfaXZmLCAmb3V0X3BhcnQsICZxX2hpc3RfbiwgJnJhdGVfaGlzdF9uLAorICAgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgdXNhZ2UgICAgICAgICAgICA9IEFSR19ERUYoInUiLCAidXNhZ2UiLCAxLAorICAgICAgICAiVXNhZ2UgcHJvZmlsZSBudW1iZXIgdG8gdXNlIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHRocmVhZHMgICAgICAgICAgPSBBUkdfREVGKCJ0IiwgInRocmVhZHMiLCAxLAorICAgICAgICAiTWF4IG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBwcm9maWxlICAgICAgICAgID0gQVJHX0RFRihOVUxMLCAicHJvZmlsZSIsIDEsCisgICAgICAgICJCaXRzdHJlYW0gcHJvZmlsZSBudW1iZXIgdG8gdXNlIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHdpZHRoICAgICAgICAgICAgPSBBUkdfREVGKCJ3IiwgIndpZHRoIiwgMSwKKyAgICAgICAgIkZyYW1lIHdpZHRoIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGhlaWdodCAgICAgICAgICAgPSBBUkdfREVGKCJoIiwgImhlaWdodCIsIDEsCisgICAgICAgICJGcmFtZSBoZWlnaHQiKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJnX2VudW1fbGlzdCBzdGVyZW9fbW9kZV9lbnVtW10gPSB7CisgICAgeyJtb25vIiAgICAgICwgU1RFUkVPX0ZPUk1BVF9NT05PfSwKKyAgICB7ImxlZnQtcmlnaHQiLCBTVEVSRU9fRk9STUFUX0xFRlRfUklHSFR9LAorICAgIHsiYm90dG9tLXRvcCIsIFNURVJFT19GT1JNQVRfQk9UVE9NX1RPUH0sCisgICAgeyJ0b3AtYm90dG9tIiwgU1RFUkVPX0ZPUk1BVF9UT1BfQk9UVE9NfSwKKyAgICB7InJpZ2h0LWxlZnQiLCBTVEVSRU9fRk9STUFUX1JJR0hUX0xFRlR9LAorICAgIHtOVUxMLCAwfQorfTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3Qgc3RlcmVvX21vZGUgICAgICA9IEFSR19ERUZfRU5VTShOVUxMLCAic3RlcmVvLW1vZGUiLCAxLAorICAgICAgICAiU3RlcmVvIDNEIHZpZGVvIGZvcm1hdCIsIHN0ZXJlb19tb2RlX2VudW0pOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB0aW1lYmFzZSAgICAgICAgID0gQVJHX0RFRihOVUxMLCAidGltZWJhc2UiLCAxLAorICAgICAgICAiT3V0cHV0IHRpbWVzdGFtcCBwcmVjaXNpb24gKGZyYWN0aW9uYWwgc2Vjb25kcykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgZXJyb3JfcmVzaWxpZW50ICA9IEFSR19ERUYoTlVMTCwgImVycm9yLXJlc2lsaWVudCIsIDEsCisgICAgICAgICJFbmFibGUgZXJyb3IgcmVzaWxpZW5jeSBmZWF0dXJlcyIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBsYWdfaW5fZnJhbWVzICAgID0gQVJHX0RFRihOVUxMLCAibGFnLWluLWZyYW1lcyIsIDEsCisgICAgICAgICJNYXggbnVtYmVyIG9mIGZyYW1lcyB0byBsYWciKTsKKworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqZ2xvYmFsX2FyZ3NbXSA9Cit7CisgICAgJnVzZV95djEyLCAmdXNlX2k0MjAsICZ1c2FnZSwgJnRocmVhZHMsICZwcm9maWxlLAorICAgICZ3aWR0aCwgJmhlaWdodCwgJnN0ZXJlb19tb2RlLCAmdGltZWJhc2UsICZmcmFtZXJhdGUsICZlcnJvcl9yZXNpbGllbnQsCisgICAgJmxhZ19pbl9mcmFtZXMsIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgZHJvcGZyYW1lX3RocmVzaCAgID0gQVJHX0RFRihOVUxMLCAiZHJvcC1mcmFtZSIsIDEsCisgICAgICAgICJUZW1wb3JhbCByZXNhbXBsaW5nIHRocmVzaG9sZCAoYnVmICUpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHJlc2l6ZV9hbGxvd2VkICAgICA9IEFSR19ERUYoTlVMTCwgInJlc2l6ZS1hbGxvd2VkIiwgMSwKKyAgICAgICAgIlNwYXRpYWwgcmVzYW1wbGluZyBlbmFibGVkIChib29sKSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCByZXNpemVfdXBfdGhyZXNoICAgPSBBUkdfREVGKE5VTEwsICJyZXNpemUtdXAiLCAxLAorICAgICAgICAiVXBzY2FsZSB0aHJlc2hvbGQgKGJ1ZiAlKSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCByZXNpemVfZG93bl90aHJlc2ggPSBBUkdfREVGKE5VTEwsICJyZXNpemUtZG93biIsIDEsCisgICAgICAgICJEb3duc2NhbGUgdGhyZXNob2xkIChidWYgJSkiKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJnX2VudW1fbGlzdCBlbmRfdXNhZ2VfZW51bVtdID0geworICAgIHsidmJyIiwgVlBYX1ZCUn0sCisgICAgeyJjYnIiLCBWUFhfQ0JSfSwKKyAgICB7ImNxIiwgIFZQWF9DUX0sCisgICAge05VTEwsIDB9Cit9Oworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBlbmRfdXNhZ2UgICAgICAgICAgPSBBUkdfREVGX0VOVU0oTlVMTCwgImVuZC11c2FnZSIsIDEsCisgICAgICAgICJSYXRlIGNvbnRyb2wgbW9kZSIsIGVuZF91c2FnZV9lbnVtKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgdGFyZ2V0X2JpdHJhdGUgICAgID0gQVJHX0RFRihOVUxMLCAidGFyZ2V0LWJpdHJhdGUiLCAxLAorICAgICAgICAiQml0cmF0ZSAoa2JwcykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgbWluX3F1YW50aXplciAgICAgID0gQVJHX0RFRihOVUxMLCAibWluLXEiLCAxLAorICAgICAgICAiTWluaW11bSAoYmVzdCkgcXVhbnRpemVyIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IG1heF9xdWFudGl6ZXIgICAgICA9IEFSR19ERUYoTlVMTCwgIm1heC1xIiwgMSwKKyAgICAgICAgIk1heGltdW0gKHdvcnN0KSBxdWFudGl6ZXIiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgdW5kZXJzaG9vdF9wY3QgICAgID0gQVJHX0RFRihOVUxMLCAidW5kZXJzaG9vdC1wY3QiLCAxLAorICAgICAgICAiRGF0YXJhdGUgdW5kZXJzaG9vdCAobWluKSB0YXJnZXQgKCUpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IG92ZXJzaG9vdF9wY3QgICAgICA9IEFSR19ERUYoTlVMTCwgIm92ZXJzaG9vdC1wY3QiLCAxLAorICAgICAgICAiRGF0YXJhdGUgb3ZlcnNob290IChtYXgpIHRhcmdldCAoJSkiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgYnVmX3N6ICAgICAgICAgICAgID0gQVJHX0RFRihOVUxMLCAiYnVmLXN6IiwgMSwKKyAgICAgICAgIkNsaWVudCBidWZmZXIgc2l6ZSAobXMpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGJ1Zl9pbml0aWFsX3N6ICAgICA9IEFSR19ERUYoTlVMTCwgImJ1Zi1pbml0aWFsLXN6IiwgMSwKKyAgICAgICAgIkNsaWVudCBpbml0aWFsIGJ1ZmZlciBzaXplIChtcykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgYnVmX29wdGltYWxfc3ogICAgID0gQVJHX0RFRihOVUxMLCAiYnVmLW9wdGltYWwtc3oiLCAxLAorICAgICAgICAiQ2xpZW50IG9wdGltYWwgYnVmZmVyIHNpemUgKG1zKSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqcmNfYXJnc1tdID0KK3sKKyAgICAmZHJvcGZyYW1lX3RocmVzaCwgJnJlc2l6ZV9hbGxvd2VkLCAmcmVzaXplX3VwX3RocmVzaCwgJnJlc2l6ZV9kb3duX3RocmVzaCwKKyAgICAmZW5kX3VzYWdlLCAmdGFyZ2V0X2JpdHJhdGUsICZtaW5fcXVhbnRpemVyLCAmbWF4X3F1YW50aXplciwKKyAgICAmdW5kZXJzaG9vdF9wY3QsICZvdmVyc2hvb3RfcGN0LCAmYnVmX3N6LCAmYnVmX2luaXRpYWxfc3osICZidWZfb3B0aW1hbF9zeiwKKyAgICBOVUxMCit9OworCisKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgYmlhc19wY3QgPSBBUkdfREVGKE5VTEwsICJiaWFzLXBjdCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNCUi9WQlIgYmlhcyAoMD1DQlIsIDEwMD1WQlIpIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IG1pbnNlY3Rpb25fcGN0ID0gQVJHX0RFRihOVUxMLCAibWluc2VjdGlvbi1wY3QiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHT1AgbWluIGJpdHJhdGUgKCUgb2YgdGFyZ2V0KSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBtYXhzZWN0aW9uX3BjdCA9IEFSR19ERUYoTlVMTCwgIm1heHNlY3Rpb24tcGN0IiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR09QIG1heCBiaXRyYXRlICglIG9mIHRhcmdldCkiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgKnJjX3R3b3Bhc3NfYXJnc1tdID0KK3sKKyAgICAmYmlhc19wY3QsICZtaW5zZWN0aW9uX3BjdCwgJm1heHNlY3Rpb25fcGN0LCBOVUxMCit9OworCisKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3Qga2ZfbWluX2Rpc3QgPSBBUkdfREVGKE5VTEwsICJrZi1taW4tZGlzdCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmltdW0ga2V5ZnJhbWUgaW50ZXJ2YWwgKGZyYW1lcykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3Qga2ZfbWF4X2Rpc3QgPSBBUkdfREVGKE5VTEwsICJrZi1tYXgtZGlzdCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heGltdW0ga2V5ZnJhbWUgaW50ZXJ2YWwgKGZyYW1lcykiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3Qga2ZfZGlzYWJsZWQgPSBBUkdfREVGKE5VTEwsICJkaXNhYmxlLWtmIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzYWJsZSBrZXlmcmFtZSBwbGFjZW1lbnQiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgKmtmX2FyZ3NbXSA9Cit7CisgICAgJmtmX21pbl9kaXN0LCAma2ZfbWF4X2Rpc3QsICZrZl9kaXNhYmxlZCwgTlVMTAorfTsKKworCisjaWYgQ09ORklHX1ZQOF9FTkNPREVSCitzdGF0aWMgY29uc3QgYXJnX2RlZl90IG5vaXNlX3NlbnMgPSBBUkdfREVGKE5VTEwsICJub2lzZS1zZW5zaXRpdml0eSIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9pc2Ugc2Vuc2l0aXZpdHkgKGZyYW1lcyB0byBibHVyKSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBzaGFycG5lc3MgPSBBUkdfREVGKE5VTEwsICJzaGFycG5lc3MiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsdGVyIHNoYXJwbmVzcyAoMC03KSIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBzdGF0aWNfdGhyZXNoID0gQVJHX0RFRihOVUxMLCAic3RhdGljLXRocmVzaCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW90aW9uIGRldGVjdGlvbiB0aHJlc2hvbGQiKTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1ZQOF9FTkNPREVSCitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGNwdV91c2VkID0gQVJHX0RFRihOVUxMLCAiY3B1LXVzZWQiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUFUgVXNlZCAoLTE2Li4xNikiKTsKKyNlbmRpZgorCisKKyNpZiBDT05GSUdfVlA4X0VOQ09ERVIKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgdG9rZW5fcGFydHMgPSBBUkdfREVGKE5VTEwsICJ0b2tlbi1wYXJ0cyIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zIHRvIHVzZSwgbG9nMiIpOworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBhdXRvX2FsdHJlZiA9IEFSR19ERUYoTlVMTCwgImF1dG8tYWx0LXJlZiIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBhdXRvbWF0aWMgYWx0IHJlZmVyZW5jZSBmcmFtZXMiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgYXJucl9tYXhmcmFtZXMgPSBBUkdfREVGKE5VTEwsICJhcm5yLW1heGZyYW1lcyIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdFJlZiBNYXggRnJhbWVzIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IGFybnJfc3RyZW5ndGggPSBBUkdfREVGKE5VTEwsICJhcm5yLXN0cmVuZ3RoIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHRSZWYgU3RyZW5ndGgiKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgYXJucl90eXBlID0gQVJHX0RFRihOVUxMLCAiYXJuci10eXBlIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdFJlZiBUeXBlIik7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZ19lbnVtX2xpc3QgdHVuaW5nX2VudW1bXSA9IHsKKyAgICB7InBzbnIiLCBWUDhfVFVORV9QU05SfSwKKyAgICB7InNzaW0iLCBWUDhfVFVORV9TU0lNfSwKKyAgICB7TlVMTCwgMH0KK307CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IHR1bmVfc3NpbSA9IEFSR19ERUZfRU5VTShOVUxMLCAidHVuZSIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXRlcmlhbCB0byBmYXZvciIsIHR1bmluZ19lbnVtKTsKK3N0YXRpYyBjb25zdCBhcmdfZGVmX3QgY3FfbGV2ZWwgPSBBUkdfREVGKE5VTEwsICJjcS1sZXZlbCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25zdHJhaW5lZCBRdWFsaXR5IExldmVsIik7CitzdGF0aWMgY29uc3QgYXJnX2RlZl90IG1heF9pbnRyYV9yYXRlX3BjdCA9IEFSR19ERUYoTlVMTCwgIm1heC1pbnRyYS1yYXRlIiwgMSwKKyAgICAgICAgIk1heCBJLWZyYW1lIGJpdHJhdGUgKHBjdCkiKTsKKworc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqdnA4X2FyZ3NbXSA9Cit7CisgICAgJmNwdV91c2VkLCAmYXV0b19hbHRyZWYsICZub2lzZV9zZW5zLCAmc2hhcnBuZXNzLCAmc3RhdGljX3RocmVzaCwKKyAgICAmdG9rZW5fcGFydHMsICZhcm5yX21heGZyYW1lcywgJmFybnJfc3RyZW5ndGgsICZhcm5yX3R5cGUsCisgICAgJnR1bmVfc3NpbSwgJmNxX2xldmVsLCAmbWF4X2ludHJhX3JhdGVfcGN0LCBOVUxMCit9Oworc3RhdGljIGNvbnN0IGludCB2cDhfYXJnX2N0cmxfbWFwW10gPQoreworICAgIFZQOEVfU0VUX0NQVVVTRUQsIFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUYsCisgICAgVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksIFZQOEVfU0VUX1NIQVJQTkVTUywgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICBWUDhFX1NFVF9UT0tFTl9QQVJUSVRJT05TLAorICAgIFZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTLCBWUDhFX1NFVF9BUk5SX1NUUkVOR1RIICwgVlA4RV9TRVRfQVJOUl9UWVBFLAorICAgIFZQOEVfU0VUX1RVTklORywgVlA4RV9TRVRfQ1FfTEVWRUwsIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwgMAorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgYXJnX2RlZl90ICpub19hcmdzW10gPSB7IE5VTEwgfTsKKworc3RhdGljIHZvaWQgdXNhZ2VfZXhpdCgpCit7CisgICAgaW50IGk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyA8b3B0aW9ucz4gLW8gZHN0X2ZpbGVuYW1lIHNyY19maWxlbmFtZSBcbiIsCisgICAgICAgICAgICBleGVjX25hbWUpOworCisgICAgZnByaW50ZihzdGRlcnIsICJcbk9wdGlvbnM6XG4iKTsKKyAgICBhcmdfc2hvd191c2FnZShzdGRvdXQsIG1haW5fYXJncyk7CisgICAgZnByaW50ZihzdGRlcnIsICJcbkVuY29kZXIgR2xvYmFsIE9wdGlvbnM6XG4iKTsKKyAgICBhcmdfc2hvd191c2FnZShzdGRvdXQsIGdsb2JhbF9hcmdzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuUmF0ZSBDb250cm9sIE9wdGlvbnM6XG4iKTsKKyAgICBhcmdfc2hvd191c2FnZShzdGRvdXQsIHJjX2FyZ3MpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG5Ud29wYXNzIFJhdGUgQ29udHJvbCBPcHRpb25zOlxuIik7CisgICAgYXJnX3Nob3dfdXNhZ2Uoc3Rkb3V0LCByY190d29wYXNzX2FyZ3MpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG5LZXlmcmFtZSBQbGFjZW1lbnQgT3B0aW9uczpcbiIpOworICAgIGFyZ19zaG93X3VzYWdlKHN0ZG91dCwga2ZfYXJncyk7CisjaWYgQ09ORklHX1ZQOF9FTkNPREVSCisgICAgZnByaW50ZihzdGRlcnIsICJcblZQOCBTcGVjaWZpYyBPcHRpb25zOlxuIik7CisgICAgYXJnX3Nob3dfdXNhZ2Uoc3Rkb3V0LCB2cDhfYXJncyk7CisjZW5kaWYKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuU3RyZWFtIHRpbWViYXNlICgtLXRpbWViYXNlKTpcbiIKKyAgICAgICAgICAgICIgIFRoZSBkZXNpcmVkIHByZWNpc2lvbiBvZiB0aW1lc3RhbXBzIGluIHRoZSBvdXRwdXQsIGV4cHJlc3NlZFxuIgorICAgICAgICAgICAgIiAgaW4gZnJhY3Rpb25hbCBzZWNvbmRzLiBEZWZhdWx0IGlzIDEvMTAwMC5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCisgICAgICAgICAgICJJbmNsdWRlZCBlbmNvZGVyczpcbiIKKyAgICAgICAgICAgIlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNvZGVjcykgLyBzaXplb2YoY29kZWNzWzBdKTsgaSsrKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlLTZzIC0gJXNcbiIsCisgICAgICAgICAgICAgICBjb2RlY3NbaV0ubmFtZSwKKyAgICAgICAgICAgICAgIHZweF9jb2RlY19pZmFjZV9uYW1lKGNvZGVjc1tpXS5pZmFjZSkpOworCisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKKyNkZWZpbmUgSElTVF9CQVJfTUFYIDQwCitzdHJ1Y3QgaGlzdF9idWNrZXQKK3sKKyAgICBpbnQgbG93LCBoaWdoLCBjb3VudDsKK307CisKKworc3RhdGljIGludCBtZXJnZV9oaXN0X2J1Y2tldHMoc3RydWN0IGhpc3RfYnVja2V0ICpidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Y2tldHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9idWNrZXRzKQoreworICAgIGludCBzbWFsbF9idWNrZXQgPSAwLCBtZXJnZV9idWNrZXQgPSBJTlRfTUFYLCBiaWdfYnVja2V0PTA7CisgICAgaW50IGJ1Y2tldHMgPSAqYnVja2V0c187CisgICAgaW50IGk7CisKKyAgICAvKiBGaW5kIHRoZSBleHRyZW1hIGZvciB0aGlzIGxpc3Qgb2YgYnVja2V0cyAqLworICAgIGJpZ19idWNrZXQgPSBzbWFsbF9idWNrZXQgPSAwOworICAgIGZvcihpPTA7IGkgPCBidWNrZXRzOyBpKyspCisgICAgeworICAgICAgICBpZihidWNrZXRbaV0uY291bnQgPCBidWNrZXRbc21hbGxfYnVja2V0XS5jb3VudCkKKyAgICAgICAgICAgIHNtYWxsX2J1Y2tldCA9IGk7CisgICAgICAgIGlmKGJ1Y2tldFtpXS5jb3VudCA+IGJ1Y2tldFtiaWdfYnVja2V0XS5jb3VudCkKKyAgICAgICAgICAgIGJpZ19idWNrZXQgPSBpOworICAgIH0KKworICAgIC8qIElmIHdlIGhhdmUgdG9vIG1hbnkgYnVja2V0cywgbWVyZ2UgdGhlIHNtYWxsZXN0IHdpdGggYW4gYWRqYWNlbnQKKyAgICAgKiBidWNrZXQuCisgICAgICovCisgICAgd2hpbGUoYnVja2V0cyA+IG1heF9idWNrZXRzKQorICAgIHsKKyAgICAgICAgaW50IGxhc3RfYnVja2V0ID0gYnVja2V0cyAtIDE7CisKKyAgICAgICAgLyogbWVyZ2UgdGhlIHNtYWxsIGJ1Y2tldCB3aXRoIGFuIGFkamFjZW50IG9uZS4gKi8KKyAgICAgICAgaWYoc21hbGxfYnVja2V0ID09IDApCisgICAgICAgICAgICBtZXJnZV9idWNrZXQgPSAxOworICAgICAgICBlbHNlIGlmKHNtYWxsX2J1Y2tldCA9PSBsYXN0X2J1Y2tldCkKKyAgICAgICAgICAgIG1lcmdlX2J1Y2tldCA9IGxhc3RfYnVja2V0IC0gMTsKKyAgICAgICAgZWxzZSBpZihidWNrZXRbc21hbGxfYnVja2V0IC0gMV0uY291bnQgPCBidWNrZXRbc21hbGxfYnVja2V0ICsgMV0uY291bnQpCisgICAgICAgICAgICBtZXJnZV9idWNrZXQgPSBzbWFsbF9idWNrZXQgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZXJnZV9idWNrZXQgPSBzbWFsbF9idWNrZXQgKyAxOworCisgICAgICAgIGFzc2VydChhYnMobWVyZ2VfYnVja2V0IC0gc21hbGxfYnVja2V0KSA8PSAxKTsKKyAgICAgICAgYXNzZXJ0KHNtYWxsX2J1Y2tldCA8IGJ1Y2tldHMpOworICAgICAgICBhc3NlcnQoYmlnX2J1Y2tldCA8IGJ1Y2tldHMpOworICAgICAgICBhc3NlcnQobWVyZ2VfYnVja2V0IDwgYnVja2V0cyk7CisKKyAgICAgICAgaWYobWVyZ2VfYnVja2V0IDwgc21hbGxfYnVja2V0KQorICAgICAgICB7CisgICAgICAgICAgICBidWNrZXRbbWVyZ2VfYnVja2V0XS5oaWdoID0gYnVja2V0W3NtYWxsX2J1Y2tldF0uaGlnaDsKKyAgICAgICAgICAgIGJ1Y2tldFttZXJnZV9idWNrZXRdLmNvdW50ICs9IGJ1Y2tldFtzbWFsbF9idWNrZXRdLmNvdW50OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnVja2V0W3NtYWxsX2J1Y2tldF0uaGlnaCA9IGJ1Y2tldFttZXJnZV9idWNrZXRdLmhpZ2g7CisgICAgICAgICAgICBidWNrZXRbc21hbGxfYnVja2V0XS5jb3VudCArPSBidWNrZXRbbWVyZ2VfYnVja2V0XS5jb3VudDsKKyAgICAgICAgICAgIG1lcmdlX2J1Y2tldCA9IHNtYWxsX2J1Y2tldDsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydChidWNrZXRbbWVyZ2VfYnVja2V0XS5sb3cgIT0gYnVja2V0W21lcmdlX2J1Y2tldF0uaGlnaCk7CisKKyAgICAgICAgYnVja2V0cy0tOworCisgICAgICAgIC8qIFJlbW92ZSB0aGUgbWVyZ2VfYnVja2V0IGZyb20gdGhlIGxpc3QsIGFuZCBmaW5kIHRoZSBuZXcgc21hbGwKKyAgICAgICAgICogYW5kIGJpZyBidWNrZXRzIHdoaWxlIHdlJ3JlIGF0IGl0CisgICAgICAgICAqLworICAgICAgICBiaWdfYnVja2V0ID0gc21hbGxfYnVja2V0ID0gMDsKKyAgICAgICAgZm9yKGk9MDsgaSA8IGJ1Y2tldHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaSA+IG1lcmdlX2J1Y2tldCkKKyAgICAgICAgICAgICAgICBidWNrZXRbaV0gPSBidWNrZXRbaSsxXTsKKworICAgICAgICAgICAgaWYoYnVja2V0W2ldLmNvdW50IDwgYnVja2V0W3NtYWxsX2J1Y2tldF0uY291bnQpCisgICAgICAgICAgICAgICAgc21hbGxfYnVja2V0ID0gaTsKKyAgICAgICAgICAgIGlmKGJ1Y2tldFtpXS5jb3VudCA+IGJ1Y2tldFtiaWdfYnVja2V0XS5jb3VudCkKKyAgICAgICAgICAgICAgICBiaWdfYnVja2V0ID0gaTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgKmJ1Y2tldHNfID0gYnVja2V0czsKKyAgICByZXR1cm4gYnVja2V0W2JpZ19idWNrZXRdLmNvdW50OworfQorCisKK3N0YXRpYyB2b2lkIHNob3dfaGlzdG9ncmFtKGNvbnN0IHN0cnVjdCBoaXN0X2J1Y2tldCAqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpCit7CisgICAgY29uc3QgY2hhciAqcGF0MSwgKnBhdDI7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2goKGludCkobG9nKGJ1Y2tldFtidWNrZXRzLTFdLmhpZ2gpL2xvZygxMCkpKzEpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBhdDEgPSAiJTRkICUyczogIjsKKyAgICAgICAgICAgIHBhdDIgPSAiJTRkLSUyZDogIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBwYXQxID0gIiU1ZCAlM3M6ICI7CisgICAgICAgICAgICBwYXQyID0gIiU1ZC0lM2Q6ICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcGF0MSA9ICIlNmQgJTRzOiAiOworICAgICAgICAgICAgcGF0MiA9ICIlNmQtJTRkOiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHBhdDEgPSAiJTdkICU1czogIjsKKyAgICAgICAgICAgIHBhdDIgPSAiJTdkLSU1ZDogIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBwYXQxID0gIiU4ZCAlNnM6ICI7CisgICAgICAgICAgICBwYXQyID0gIiU4ZC0lNmQ6ICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgcGF0MSA9ICIlOWQgJTdzOiAiOworICAgICAgICAgICAgcGF0MiA9ICIlOWQtJTdkOiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwYXQxID0gIiUxMmQgJTEwczogIjsKKyAgICAgICAgICAgIHBhdDIgPSAiJTEyZC0lMTBkOiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxidWNrZXRzOyBpKyspCisgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBpbnQgajsKKyAgICAgICAgZmxvYXQgcGN0OworCisgICAgICAgIHBjdCA9IChmbG9hdCkoMTAwLjAgKiBidWNrZXRbaV0uY291bnQgLyB0b3RhbCk7CisgICAgICAgIGxlbiA9IEhJU1RfQkFSX01BWCAqIGJ1Y2tldFtpXS5jb3VudCAvIHNjYWxlOworICAgICAgICBpZihsZW4gPCAxKQorICAgICAgICAgICAgbGVuID0gMTsKKyAgICAgICAgYXNzZXJ0KGxlbiA8PSBISVNUX0JBUl9NQVgpOworCisgICAgICAgIGlmKGJ1Y2tldFtpXS5sb3cgPT0gYnVja2V0W2ldLmhpZ2gpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgcGF0MSwgYnVja2V0W2ldLmxvdywgIiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgcGF0MiwgYnVja2V0W2ldLmxvdywgYnVja2V0W2ldLmhpZ2gpOworCisgICAgICAgIGZvcihqPTA7IGo8SElTVF9CQVJfTUFYOyBqKyspCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgajxsZW4/Ij0iOiIgIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQlNWQgKCU2LjJmJSUpXG4iLGJ1Y2tldFtpXS5jb3VudCxwY3QpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBzaG93X3FfaGlzdG9ncmFtKGNvbnN0IGludCBjb3VudHNbNjRdLCBpbnQgbWF4X2J1Y2tldHMpCit7CisgICAgc3RydWN0IGhpc3RfYnVja2V0IGJ1Y2tldFs2NF07CisgICAgaW50IGJ1Y2tldHMgPSAwOworICAgIGludCB0b3RhbCA9IDA7CisgICAgaW50IHNjYWxlOworICAgIGludCBpOworCisKKyAgICBmb3IoaT0wOyBpPDY0OyBpKyspCisgICAgeworICAgICAgICBpZihjb3VudHNbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Y2tldFtidWNrZXRzXS5sb3cgPSBidWNrZXRbYnVja2V0c10uaGlnaCA9IGk7CisgICAgICAgICAgICBidWNrZXRbYnVja2V0c10uY291bnQgPSBjb3VudHNbaV07CisgICAgICAgICAgICBidWNrZXRzKys7CisgICAgICAgICAgICB0b3RhbCArPSBjb3VudHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuUXVhbnRpemVyIFNlbGVjdGlvbjpcbiIpOworICAgIHNjYWxlID0gbWVyZ2VfaGlzdF9idWNrZXRzKGJ1Y2tldCwgJmJ1Y2tldHMsIG1heF9idWNrZXRzKTsKKyAgICBzaG93X2hpc3RvZ3JhbShidWNrZXQsIGJ1Y2tldHMsIHRvdGFsLCBzY2FsZSk7Cit9CisKKworI2RlZmluZSBSQVRFX0JJTlMgKDEwMCkKK3N0cnVjdCByYXRlX2hpc3QKK3sKKyAgICBpbnQ2NF90ICAgICAgICAgICAgKnB0czsKKyAgICBpbnQgICAgICAgICAgICAgICAgKnN6OworICAgIGludCAgICAgICAgICAgICAgICAgc2FtcGxlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGZyYW1lczsKKyAgICBzdHJ1Y3QgaGlzdF9idWNrZXQgIGJ1Y2tldFtSQVRFX0JJTlNdOworICAgIGludCAgICAgICAgICAgICAgICAgdG90YWw7Cit9OworCisKK3N0YXRpYyB2b2lkIGluaXRfcmF0ZV9oaXN0b2dyYW0oc3RydWN0IHJhdGVfaGlzdCAgICAgICAgICAqaGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2VuY19jZmdfdCAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfcmF0aW9uYWxfdCAgICAgICpmcHMpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBidWZmZXIuIFVzZSB0aGUgZmlsZSdzIGZyYW1lcmF0ZQorICAgICAqIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiByY19idWZfc3ogbWlsbGlzZWNvbmRzLCB3aXRoIGFuCisgICAgICogYWRqdXN0bWVudCAoNS80KSB0byBhY2NvdW50IGZvciBhbHQtcmVmcworICAgICAqLworICAgIGhpc3QtPnNhbXBsZXMgPSBjZmctPnJjX2J1Zl9zeiAqIDUgLyA0ICogZnBzLT5udW0gLyBmcHMtPmRlbiAvIDEwMDA7CisKKyAgICAvKiBwcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8gKi8KKyAgICBpZiAoaGlzdC0+c2FtcGxlcyA9PSAwKQorICAgICAgaGlzdC0+c2FtcGxlcz0xOworCisgICAgaGlzdC0+cHRzID0gY2FsbG9jKGhpc3QtPnNhbXBsZXMsIHNpemVvZigqaGlzdC0+cHRzKSk7CisgICAgaGlzdC0+c3ogPSBjYWxsb2MoaGlzdC0+c2FtcGxlcywgc2l6ZW9mKCpoaXN0LT5zeikpOworICAgIGZvcihpPTA7IGk8UkFURV9CSU5TOyBpKyspCisgICAgeworICAgICAgICBoaXN0LT5idWNrZXRbaV0ubG93ID0gSU5UX01BWDsKKyAgICAgICAgaGlzdC0+YnVja2V0W2ldLmhpZ2ggPSAwOworICAgICAgICBoaXN0LT5idWNrZXRbaV0uY291bnQgPSAwOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBkZXN0cm95X3JhdGVfaGlzdG9ncmFtKHN0cnVjdCByYXRlX2hpc3QgKmhpc3QpCit7CisgICAgZnJlZShoaXN0LT5wdHMpOworICAgIGZyZWUoaGlzdC0+c3opOworfQorCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yYXRlX2hpc3RvZ3JhbShzdHJ1Y3QgcmF0ZV9oaXN0ICAgICAgICAgICpoaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgICpwa3QpCit7CisgICAgaW50IGksIGlkeDsKKyAgICBpbnQ2NF90IG5vdywgdGhlbiwgc3VtX3N6ID0gMCwgYXZnX2JpdHJhdGU7CisKKyAgICBub3cgPSBwa3QtPmRhdGEuZnJhbWUucHRzICogMTAwMAorICAgICAgICAgICogKHVpbnQ2NF90KWNmZy0+Z190aW1lYmFzZS5udW0gLyAodWludDY0X3QpY2ZnLT5nX3RpbWViYXNlLmRlbjsKKworICAgIGlkeCA9IGhpc3QtPmZyYW1lcysrICUgaGlzdC0+c2FtcGxlczsKKyAgICBoaXN0LT5wdHNbaWR4XSA9IG5vdzsKKyAgICBoaXN0LT5zeltpZHhdID0gKGludClwa3QtPmRhdGEuZnJhbWUuc3o7CisKKyAgICBpZihub3cgPCBjZmctPnJjX2J1Zl9pbml0aWFsX3N6KQorICAgICAgICByZXR1cm47CisKKyAgICB0aGVuID0gbm93OworCisgICAgLyogU3VtIHRoZSBzaXplIG92ZXIgdGhlIHBhc3QgcmNfYnVmX3N6IG1zICovCisgICAgZm9yKGkgPSBoaXN0LT5mcmFtZXM7IGkgPiAwICYmIGhpc3QtPmZyYW1lcyAtIGkgPCBoaXN0LT5zYW1wbGVzOyBpLS0pCisgICAgeworICAgICAgICBpbnQgaV9pZHggPSAoaS0xKSAlIGhpc3QtPnNhbXBsZXM7CisKKyAgICAgICAgdGhlbiA9IGhpc3QtPnB0c1tpX2lkeF07CisgICAgICAgIGlmKG5vdyAtIHRoZW4gPiBjZmctPnJjX2J1Zl9zeikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdW1fc3ogKz0gaGlzdC0+c3pbaV9pZHhdOworICAgIH0KKworICAgIGlmIChub3cgPT0gdGhlbikKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZnX2JpdHJhdGUgPSBzdW1fc3ogKiA4ICogMTAwMCAvIChub3cgLSB0aGVuKTsKKyAgICBpZHggPSAoaW50KShhdmdfYml0cmF0ZSAqIChSQVRFX0JJTlMvMikgLyAoY2ZnLT5yY190YXJnZXRfYml0cmF0ZSAqIDEwMDApKTsKKyAgICBpZihpZHggPCAwKQorICAgICAgICBpZHggPSAwOworICAgIGlmKGlkeCA+IFJBVEVfQklOUy0xKQorICAgICAgICBpZHggPSBSQVRFX0JJTlMtMTsKKyAgICBpZihoaXN0LT5idWNrZXRbaWR4XS5sb3cgPiBhdmdfYml0cmF0ZSkKKyAgICAgICAgaGlzdC0+YnVja2V0W2lkeF0ubG93ID0gKGludClhdmdfYml0cmF0ZTsKKyAgICBpZihoaXN0LT5idWNrZXRbaWR4XS5oaWdoIDwgYXZnX2JpdHJhdGUpCisgICAgICAgIGhpc3QtPmJ1Y2tldFtpZHhdLmhpZ2ggPSAoaW50KWF2Z19iaXRyYXRlOworICAgIGhpc3QtPmJ1Y2tldFtpZHhdLmNvdW50Kys7CisgICAgaGlzdC0+dG90YWwrKzsKK30KKworCitzdGF0aWMgdm9pZCBzaG93X3JhdGVfaGlzdG9ncmFtKHN0cnVjdCByYXRlX2hpc3QgICAgICAgICAgKmhpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2J1Y2tldHMpCit7CisgICAgaW50IGksIHNjYWxlOworICAgIGludCBidWNrZXRzID0gMDsKKworICAgIGZvcihpID0gMDsgaSA8IFJBVEVfQklOUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoaGlzdC0+YnVja2V0W2ldLmxvdyA9PSBJTlRfTUFYKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGhpc3QtPmJ1Y2tldFtidWNrZXRzKytdID0gaGlzdC0+YnVja2V0W2ldOworICAgIH0KKworICAgIGZwcmludGYoc3RkZXJyLCAiXG5SYXRlIChvdmVyICVkbXMgd2luZG93KTpcbiIsIGNmZy0+cmNfYnVmX3N6KTsKKyAgICBzY2FsZSA9IG1lcmdlX2hpc3RfYnVja2V0cyhoaXN0LT5idWNrZXQsICZidWNrZXRzLCBtYXhfYnVja2V0cyk7CisgICAgc2hvd19oaXN0b2dyYW0oaGlzdC0+YnVja2V0LCBidWNrZXRzLCBoaXN0LT50b3RhbCwgc2NhbGUpOworfQorCisjZGVmaW5lIE5FTEVNRU5UUyh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKyNkZWZpbmUgQVJHX0NUUkxfQ05UX01BWCBORUxFTUVOVFModnA4X2FyZ19jdHJsX21hcCkKKworCisvKiBDb25maWd1cmF0aW9uIGVsZW1lbnRzIGNvbW1vbiB0byBhbGwgc3RyZWFtcyAqLworc3RydWN0IGdsb2JhbF9jb25maWcKK3sKKyAgICBjb25zdCBzdHJ1Y3QgY29kZWNfaXRlbSAgKmNvZGVjOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VzOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFzczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZGVhZGxpbmU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB1c2VfaTQyMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgc2hvd19wc25yOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9mcmFtZXJhdGU7CisgICAgc3RydWN0IHZweF9yYXRpb25hbCAgICAgICBmcmFtZXJhdGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBvdXRfcGFydDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgc2hvd19xX2hpc3RfYnVja2V0czsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcmF0ZV9oaXN0X2J1Y2tldHM7Cit9OworCisKKy8qIFBlci1zdHJlYW0gY29uZmlndXJhdGlvbiAqLworc3RydWN0IHN0cmVhbV9jb25maWcKK3sKKyAgICBzdHJ1Y3QgdnB4X2NvZGVjX2VuY19jZmcgIGNmZzsKKyAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKm91dF9mbjsKKyAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKnN0YXRzX2ZuOworICAgIHN0ZXJlb19mb3JtYXRfdCAgICAgICAgICAgc3RlcmVvX2ZtdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGFyZ19jdHJsc1tBUkdfQ1RSTF9DTlRfTUFYXVsyXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGFyZ19jdHJsX2NudDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3dlYm07CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBoYXZlX2tmX21heF9kaXN0OworfTsKKworCitzdHJ1Y3Qgc3RyZWFtX3N0YXRlCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKyAgICBzdHJ1Y3Qgc3RyZWFtX3N0YXRlICAgICAgKm5leHQ7CisgICAgc3RydWN0IHN0cmVhbV9jb25maWcgICAgICBjb25maWc7CisgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICpmaWxlOworICAgIHN0cnVjdCByYXRlX2hpc3QgICAgICAgICAgcmF0ZV9oaXN0OworICAgIEVibWxHbG9iYWwgICAgICAgICAgICAgICAgZWJtbDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIGhhc2g7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICBwc25yX3NzZV90b3RhbDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgIHBzbnJfc2FtcGxlc190b3RhbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgIHBzbnJfdG90YWxzWzRdOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgcHNucl9jb3VudDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1s2NF07CisgICAgdnB4X2NvZGVjX2N0eF90ICAgICAgICAgICBlbmNvZGVyOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgZnJhbWVzX291dDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgIGN4X3RpbWU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBuYnl0ZXM7CisgICAgc3RhdHNfaW9fdCAgICAgICAgICAgICAgICBzdGF0czsKK307CisKKwordm9pZCB2YWxpZGF0ZV9wb3NpdGl2ZV9yYXRpb25hbChjb25zdCBjaGFyICAgICAgICAgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2cHhfcmF0aW9uYWwgKnJhdCkKK3sKKyAgICBpZiAocmF0LT5kZW4gPCAwKQorICAgIHsKKyAgICAgICAgcmF0LT5udW0gKj0gLTE7CisgICAgICAgIHJhdC0+ZGVuICo9IC0xOworICAgIH0KKworICAgIGlmIChyYXQtPm51bSA8IDApCisgICAgICAgIGRpZSgiRXJyb3I6ICVzIG11c3QgYmUgcG9zaXRpdmVcbiIsIG1zZyk7CisKKyAgICBpZiAoIXJhdC0+ZGVuKQorICAgICAgICBkaWUoIkVycm9yOiAlcyBoYXMgemVybyBkZW5vbWluYXRvclxuIiwgbXNnKTsKK30KKworCitzdGF0aWMgdm9pZCBwYXJzZV9nbG9iYWxfY29uZmlnKHN0cnVjdCBnbG9iYWxfY29uZmlnICpnbG9iYWwsIGNoYXIgKiphcmd2KQoreworICAgIGNoYXIgICAgICAgKiphcmdpLCAqKmFyZ2o7CisgICAgc3RydWN0IGFyZyAgIGFyZzsKKworICAgIC8qIEluaXRpYWxpemUgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgbWVtc2V0KGdsb2JhbCwgMCwgc2l6ZW9mKCpnbG9iYWwpKTsKKyAgICBnbG9iYWwtPmNvZGVjID0gY29kZWNzOworICAgIGdsb2JhbC0+cGFzc2VzID0gMTsKKyAgICBnbG9iYWwtPnVzZV9pNDIwID0gMTsKKworICAgIGZvciAoYXJnaSA9IGFyZ2ogPSBhcmd2OyAoKmFyZ2ogPSAqYXJnaSk7IGFyZ2kgKz0gYXJnLmFyZ3Zfc3RlcCkKKyAgICB7CisgICAgICAgIGFyZy5hcmd2X3N0ZXAgPSAxOworCisgICAgICAgIGlmIChhcmdfbWF0Y2goJmFyZywgJmNvZGVjYXJnLCBhcmdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGosIGsgPSAtMTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemVvZihjb2RlY3MpIC8gc2l6ZW9mKGNvZGVjc1swXSk7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChjb2RlY3Nbal0ubmFtZSwgYXJnLnZhbCkpCisgICAgICAgICAgICAgICAgICAgIGsgPSBqOworCisgICAgICAgICAgICBpZiAoayA+PSAwKQorICAgICAgICAgICAgICAgIGdsb2JhbC0+Y29kZWMgPSBjb2RlY3MgKyBrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpZSgiRXJyb3I6IFVucmVjb2duaXplZCBhcmd1bWVudCAoJXMpIHRvIC0tY29kZWNcbiIsCisgICAgICAgICAgICAgICAgICAgIGFyZy52YWwpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwYXNzZXMsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICBnbG9iYWwtPnBhc3NlcyA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworCisgICAgICAgICAgICBpZiAoZ2xvYmFsLT5wYXNzZXMgPCAxIHx8IGdsb2JhbC0+cGFzc2VzID4gMikKKyAgICAgICAgICAgICAgICBkaWUoIkVycm9yOiBJbnZhbGlkIG51bWJlciBvZiBwYXNzZXMgKCVkKVxuIiwgZ2xvYmFsLT5wYXNzZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcGFzc19hcmcsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICBnbG9iYWwtPnBhc3MgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKworICAgICAgICAgICAgaWYgKGdsb2JhbC0+cGFzcyA8IDEgfHwgZ2xvYmFsLT5wYXNzID4gMikKKyAgICAgICAgICAgICAgICBkaWUoIkVycm9yOiBJbnZhbGlkIHBhc3Mgc2VsZWN0ZWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLT5wYXNzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnVzYWdlLCBhcmdpKSkKKyAgICAgICAgICAgIGdsb2JhbC0+dXNhZ2UgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZkZWFkbGluZSwgYXJnaSkpCisgICAgICAgICAgICBnbG9iYWwtPmRlYWRsaW5lID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYmVzdF9kbCwgYXJnaSkpCisgICAgICAgICAgICBnbG9iYWwtPmRlYWRsaW5lID0gVlBYX0RMX0JFU1RfUVVBTElUWTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZnb29kX2RsLCBhcmdpKSkKKyAgICAgICAgICAgIGdsb2JhbC0+ZGVhZGxpbmUgPSBWUFhfRExfR09PRF9RVUFMSVRZOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnJ0X2RsLCBhcmdpKSkKKyAgICAgICAgICAgIGdsb2JhbC0+ZGVhZGxpbmUgPSBWUFhfRExfUkVBTFRJTUU7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdXNlX3l2MTIsIGFyZ2kpKQorICAgICAgICAgICAgZ2xvYmFsLT51c2VfaTQyMCA9IDA7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdXNlX2k0MjAsIGFyZ2kpKQorICAgICAgICAgICAgZ2xvYmFsLT51c2VfaTQyMCA9IDE7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcXVpZXRhcmcsIGFyZ2kpKQorICAgICAgICAgICAgZ2xvYmFsLT5xdWlldCA9IDE7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdmVyYm9zZWFyZywgYXJnaSkpCisgICAgICAgICAgICBnbG9iYWwtPnZlcmJvc2UgPSAxOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmxpbWl0LCBhcmdpKSkKKyAgICAgICAgICAgIGdsb2JhbC0+bGltaXQgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwc25yYXJnLCBhcmdpKSkKKyAgICAgICAgICAgIGdsb2JhbC0+c2hvd19wc25yID0gMTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZmcmFtZXJhdGUsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICBnbG9iYWwtPmZyYW1lcmF0ZSA9IGFyZ19wYXJzZV9yYXRpb25hbCgmYXJnKTsKKyAgICAgICAgICAgIHZhbGlkYXRlX3Bvc2l0aXZlX3JhdGlvbmFsKGFyZy5uYW1lLCAmZ2xvYmFsLT5mcmFtZXJhdGUpOworICAgICAgICAgICAgZ2xvYmFsLT5oYXZlX2ZyYW1lcmF0ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsJm91dF9wYXJ0LCBhcmdpKSkKKyAgICAgICAgICAgIGdsb2JhbC0+b3V0X3BhcnQgPSAxOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmRlYnVnbW9kZSwgYXJnaSkpCisgICAgICAgICAgICBnbG9iYWwtPmRlYnVnID0gMTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZxX2hpc3RfbiwgYXJnaSkpCisgICAgICAgICAgICBnbG9iYWwtPnNob3dfcV9oaXN0X2J1Y2tldHMgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZyYXRlX2hpc3RfbiwgYXJnaSkpCisgICAgICAgICAgICBnbG9iYWwtPnNob3dfcmF0ZV9oaXN0X2J1Y2tldHMgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXJnaisrOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIGdsb2JhbCBjb25maWcgKi8KKworICAgIGlmIChnbG9iYWwtPnBhc3MpCisgICAgeworICAgICAgICAvKiBEV0lNOiBBc3N1bWUgdGhlIHVzZXIgbWVhbnQgcGFzc2VzPTIgaWYgcGFzcz0yIGlzIHNwZWNpZmllZCAqLworICAgICAgICBpZiAoZ2xvYmFsLT5wYXNzID4gZ2xvYmFsLT5wYXNzZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm4oIkFzc3VtaW5nIC0tcGFzcz0lZCBpbXBsaWVzIC0tcGFzc2VzPSVkXG4iLAorICAgICAgICAgICAgICAgICBnbG9iYWwtPnBhc3MsIGdsb2JhbC0+cGFzcyk7CisgICAgICAgICAgICBnbG9iYWwtPnBhc3NlcyA9IGdsb2JhbC0+cGFzczsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIG9wZW5faW5wdXRfZmlsZShzdHJ1Y3QgaW5wdXRfc3RhdGUgKmlucHV0KQoreworICAgIHVuc2lnbmVkIGludCBmb3VyY2M7CisKKyAgICAvKiBQYXJzZSBjZXJ0YWluIG9wdGlvbnMgZnJvbSB0aGUgaW5wdXQgZmlsZSwgaWYgcG9zc2libGUgKi8KKyAgICBpbnB1dC0+ZmlsZSA9IHN0cmNtcChpbnB1dC0+Zm4sICItIikgPyBmb3BlbihpbnB1dC0+Zm4sICJyYiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0X2JpbmFyeV9tb2RlKHN0ZGluKTsKKworICAgIGlmICghaW5wdXQtPmZpbGUpCisgICAgICAgIGZhdGFsKCJGYWlsZWQgdG8gb3BlbiBpbnB1dCBmaWxlIik7CisKKyAgICAvKiBGb3IgUkFXIGlucHV0IHNvdXJjZXMsIHRoZXNlIGJ5dGVzIHdpbGwgYXBwbGllZCBvbiB0aGUgZmlyc3QgZnJhbWUKKyAgICAgKiAgaW4gcmVhZF9mcmFtZSgpLgorICAgICAqLworICAgIGlucHV0LT5kZXRlY3QuYnVmX3JlYWQgPSBmcmVhZChpbnB1dC0+ZGV0ZWN0LmJ1ZiwgMSwgNCwgaW5wdXQtPmZpbGUpOworICAgIGlucHV0LT5kZXRlY3QucG9zaXRpb24gPSAwOworCisgICAgaWYgKGlucHV0LT5kZXRlY3QuYnVmX3JlYWQgPT0gNAorICAgICAgICAmJiBmaWxlX2lzX3k0bShpbnB1dC0+ZmlsZSwgJmlucHV0LT55NG0sIGlucHV0LT5kZXRlY3QuYnVmKSkKKyAgICB7CisgICAgICAgIGlmICh5NG1faW5wdXRfb3BlbigmaW5wdXQtPnk0bSwgaW5wdXQtPmZpbGUsIGlucHV0LT5kZXRlY3QuYnVmLCA0KSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnB1dC0+ZmlsZV90eXBlID0gRklMRV9UWVBFX1k0TTsKKyAgICAgICAgICAgIGlucHV0LT53ID0gaW5wdXQtPnk0bS5waWNfdzsKKyAgICAgICAgICAgIGlucHV0LT5oID0gaW5wdXQtPnk0bS5waWNfaDsKKyAgICAgICAgICAgIGlucHV0LT5mcmFtZXJhdGUubnVtID0gaW5wdXQtPnk0bS5mcHNfbjsKKyAgICAgICAgICAgIGlucHV0LT5mcmFtZXJhdGUuZGVuID0gaW5wdXQtPnk0bS5mcHNfZDsKKyAgICAgICAgICAgIGlucHV0LT51c2VfaTQyMCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmF0YWwoIlVuc3VwcG9ydGVkIFk0TSBzdHJlYW0uIik7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0LT5kZXRlY3QuYnVmX3JlYWQgPT0gNCAmJiBmaWxlX2lzX2l2ZihpbnB1dCwgJmZvdXJjYykpCisgICAgeworICAgICAgICBpbnB1dC0+ZmlsZV90eXBlID0gRklMRV9UWVBFX0lWRjsKKyAgICAgICAgc3dpdGNoIChmb3VyY2MpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweDMyMzE1NjU5OgorICAgICAgICAgICAgaW5wdXQtPnVzZV9pNDIwID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MzAzMjM0NDk6CisgICAgICAgICAgICBpbnB1dC0+dXNlX2k0MjAgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmYXRhbCgiVW5zdXBwb3J0ZWQgZm91cmNjICglMDh4KSBpbiBJVkYiLCBmb3VyY2MpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlucHV0LT5maWxlX3R5cGUgPSBGSUxFX1RZUEVfUkFXOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjbG9zZV9pbnB1dF9maWxlKHN0cnVjdCBpbnB1dF9zdGF0ZSAqaW5wdXQpCit7CisgICAgZmNsb3NlKGlucHV0LT5maWxlKTsKKyAgICBpZiAoaW5wdXQtPmZpbGVfdHlwZSA9PSBGSUxFX1RZUEVfWTRNKQorICAgICAgICB5NG1faW5wdXRfY2xvc2UoJmlucHV0LT55NG0pOworfQorCitzdGF0aWMgc3RydWN0IHN0cmVhbV9zdGF0ZSAqbmV3X3N0cmVhbShzdHJ1Y3QgZ2xvYmFsX2NvbmZpZyAqZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnByZXYpCit7CisgICAgc3RydWN0IHN0cmVhbV9zdGF0ZSAqc3RyZWFtOworCisgICAgc3RyZWFtID0gY2FsbG9jKDEsIHNpemVvZigqc3RyZWFtKSk7CisgICAgaWYoIXN0cmVhbSkKKyAgICAgICAgZmF0YWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc3RyZWFtLiIpOworICAgIGlmKHByZXYpCisgICAgeworICAgICAgICBtZW1jcHkoc3RyZWFtLCBwcmV2LCBzaXplb2YoKnN0cmVhbSkpOworICAgICAgICBzdHJlYW0tPmluZGV4Kys7CisgICAgICAgIHByZXYtPm5leHQgPSBzdHJlYW07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZweF9jb2RlY19lcnJfdCAgcmVzOworCisgICAgICAgIC8qIFBvcHVsYXRlIGVuY29kZXIgY29uZmlndXJhdGlvbiAqLworICAgICAgICByZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KGdsb2JhbC0+Y29kZWMtPmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0tPmNvbmZpZy5jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLT51c2FnZSk7CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICBmYXRhbCgiRmFpbGVkIHRvIGdldCBjb25maWc6ICVzXG4iLCB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXMpKTsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIGRlZmF1bHQgdGltZWJhc2UgdG8gYSBoaWdoIGVub3VnaCB2YWx1ZSBzbyB0aGF0IHRoZQorICAgICAgICAgKiBlbmNvZGVyIHdpbGwgYWx3YXlzIGNyZWF0ZSBzdHJpY3RseSBpbmNyZWFzaW5nIHRpbWVzdGFtcHMuCisgICAgICAgICAqLworICAgICAgICBzdHJlYW0tPmNvbmZpZy5jZmcuZ190aW1lYmFzZS5kZW4gPSAxMDAwOworCisgICAgICAgIC8qIE5ldmVyIHVzZSB0aGUgbGlicmFyeSdzIGRlZmF1bHQgcmVzb2x1dGlvbiwgcmVxdWlyZSBpdCBiZSBwYXJzZWQKKyAgICAgICAgICogZnJvbSB0aGUgZmlsZSBvciBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgICovCisgICAgICAgIHN0cmVhbS0+Y29uZmlnLmNmZy5nX3cgPSAwOworICAgICAgICBzdHJlYW0tPmNvbmZpZy5jZmcuZ19oID0gMDsKKworICAgICAgICAvKiBJbml0aWFsaXplIHJlbWFpbmluZyBzdHJlYW0gcGFyYW1ldGVycyAqLworICAgICAgICBzdHJlYW0tPmNvbmZpZy5zdGVyZW9fZm10ID0gU1RFUkVPX0ZPUk1BVF9NT05POworICAgICAgICBzdHJlYW0tPmNvbmZpZy53cml0ZV93ZWJtID0gMTsKKyAgICAgICAgc3RyZWFtLT5lYm1sLmxhc3RfcHRzX21zID0gLTE7CisKKyAgICAgICAgLyogQWxsb3dzIHJlbW92YWwgb2YgdGhlIGFwcGxpY2F0aW9uIHZlcnNpb24gZnJvbSB0aGUgRUJNTCB0YWdzICovCisgICAgICAgIHN0cmVhbS0+ZWJtbC5kZWJ1ZyA9IGdsb2JhbC0+ZGVidWc7CisgICAgfQorCisgICAgLyogT3V0cHV0IGZpbGVzIG11c3QgYmUgc3BlY2lmaWVkIGZvciBlYWNoIHN0cmVhbSAqLworICAgIHN0cmVhbS0+Y29uZmlnLm91dF9mbiA9IE5VTEw7CisKKyAgICBzdHJlYW0tPm5leHQgPSBOVUxMOworICAgIHJldHVybiBzdHJlYW07Cit9CisKKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fcGFyYW1zKHN0cnVjdCBnbG9iYWxfY29uZmlnICpnbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqYXJndikKK3sKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICoqYXJnaSwgKiphcmdqOworICAgIHN0cnVjdCBhcmcgICAgICAgICAgICAgICBhcmc7CisgICAgc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqKmN0cmxfYXJncyA9IG5vX2FyZ3M7CisgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAgKmN0cmxfYXJnc19tYXAgPSBOVUxMOworICAgIHN0cnVjdCBzdHJlYW1fY29uZmlnICAgICpjb25maWcgPSAmc3RyZWFtLT5jb25maWc7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGVvc19tYXJrX2ZvdW5kID0gMDsKKworICAgIC8qIEhhbmRsZSBjb2RlYyBzcGVjaWZpYyBvcHRpb25zICovCisgICAgaWYgKGdsb2JhbC0+Y29kZWMtPmlmYWNlID09ICZ2cHhfY29kZWNfdnA4X2N4X2FsZ28pCisgICAgeworICAgICAgICBjdHJsX2FyZ3MgPSB2cDhfYXJnczsKKyAgICAgICAgY3RybF9hcmdzX21hcCA9IHZwOF9hcmdfY3RybF9tYXA7CisgICAgfQorCisgICAgZm9yIChhcmdpID0gYXJnaiA9IGFyZ3Y7ICgqYXJnaiA9ICphcmdpKTsgYXJnaSArPSBhcmcuYXJndl9zdGVwKQorICAgIHsKKyAgICAgICAgYXJnLmFyZ3Zfc3RlcCA9IDE7CisKKyAgICAgICAgLyogT25jZSB3ZSd2ZSBmb3VuZCBhbiBlbmQtb2Ytc3RyZWFtIG1hcmtlciAoLS0pIHdlIHdhbnQgdG8gY29udGludWUKKyAgICAgICAgICogc2hpZnRpbmcgYXJndW1lbnRzIGJ1dCBub3QgY29uc3VtaW5nIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBpZiAoZW9zX21hcmtfZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZ2orKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoKmFyZ2osICItLSIpKQorICAgICAgICB7CisgICAgICAgICAgICBlb3NfbWFya19mb3VuZCA9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgwKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZvdXRwdXRmaWxlLCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+b3V0X2ZuID0gYXJnLnZhbDsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZmcGZfbmFtZSwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPnN0YXRzX2ZuID0gYXJnLnZhbDsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZ1c2VfaXZmLCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+d3JpdGVfd2VibSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdGhyZWFkcywgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5nX3RocmVhZHMgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwcm9maWxlLCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLmdfcHJvZmlsZSA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJndpZHRoLCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLmdfdyA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmhlaWdodCwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5nX2ggPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZzdGVyZW9fbW9kZSwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPnN0ZXJlb19mbXQgPSBhcmdfcGFyc2VfZW51bV9vcl9pbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdGltZWJhc2UsIGFyZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25maWctPmNmZy5nX3RpbWViYXNlID0gYXJnX3BhcnNlX3JhdGlvbmFsKCZhcmcpOworICAgICAgICAgICAgdmFsaWRhdGVfcG9zaXRpdmVfcmF0aW9uYWwoYXJnLm5hbWUsICZjb25maWctPmNmZy5nX3RpbWViYXNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmVycm9yX3Jlc2lsaWVudCwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmxhZ19pbl9mcmFtZXMsIGFyZ2kpKQorICAgICAgICAgICAgY29uZmlnLT5jZmcuZ19sYWdfaW5fZnJhbWVzID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZHJvcGZyYW1lX3RocmVzaCwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5yY19kcm9wZnJhbWVfdGhyZXNoID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcmVzaXplX2FsbG93ZWQsIGFyZ2kpKQorICAgICAgICAgICAgY29uZmlnLT5jZmcucmNfcmVzaXplX2FsbG93ZWQgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZyZXNpemVfdXBfdGhyZXNoLCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjX3Jlc2l6ZV91cF90aHJlc2ggPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZyZXNpemVfZG93bl90aHJlc2gsIGFyZ2kpKQorICAgICAgICAgICAgY29uZmlnLT5jZmcucmNfcmVzaXplX2Rvd25fdGhyZXNoID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZW5kX3VzYWdlLCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjX2VuZF91c2FnZSA9IGFyZ19wYXJzZV9lbnVtX29yX2ludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZ0YXJnZXRfYml0cmF0ZSwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5yY190YXJnZXRfYml0cmF0ZSA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm1pbl9xdWFudGl6ZXIsIGFyZ2kpKQorICAgICAgICAgICAgY29uZmlnLT5jZmcucmNfbWluX3F1YW50aXplciA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm1heF9xdWFudGl6ZXIsIGFyZ2kpKQorICAgICAgICAgICAgY29uZmlnLT5jZmcucmNfbWF4X3F1YW50aXplciA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnVuZGVyc2hvb3RfcGN0LCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjX3VuZGVyc2hvb3RfcGN0ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmb3ZlcnNob290X3BjdCwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5yY19vdmVyc2hvb3RfcGN0ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYnVmX3N6LCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjX2J1Zl9zeiA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmJ1Zl9pbml0aWFsX3N6LCBhcmdpKSkKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjX2J1Zl9pbml0aWFsX3N6ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7CisgICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYnVmX29wdGltYWxfc3osIGFyZ2kpKQorICAgICAgICAgICAgY29uZmlnLT5jZmcucmNfYnVmX29wdGltYWxfc3ogPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZiaWFzX3BjdCwgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjXzJwYXNzX3Zicl9iaWFzX3BjdCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworCisgICAgICAgICAgICBpZiAoZ2xvYmFsLT5wYXNzZXMgPCAyKQorICAgICAgICAgICAgICAgIHdhcm4oIm9wdGlvbiAlcyBpZ25vcmVkIGluIG9uZS1wYXNzIG1vZGUuXG4iLCBhcmcubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZtaW5zZWN0aW9uX3BjdCwgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworCisgICAgICAgICAgICBpZiAoZ2xvYmFsLT5wYXNzZXMgPCAyKQorICAgICAgICAgICAgICAgIHdhcm4oIm9wdGlvbiAlcyBpZ25vcmVkIGluIG9uZS1wYXNzIG1vZGUuXG4iLCBhcmcubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZtYXhzZWN0aW9uX3BjdCwgYXJnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmZpZy0+Y2ZnLnJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworCisgICAgICAgICAgICBpZiAoZ2xvYmFsLT5wYXNzZXMgPCAyKQorICAgICAgICAgICAgICAgIHdhcm4oIm9wdGlvbiAlcyBpZ25vcmVkIGluIG9uZS1wYXNzIG1vZGUuXG4iLCBhcmcubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZrZl9taW5fZGlzdCwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5rZl9taW5fZGlzdCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOworICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmtmX21heF9kaXN0LCBhcmdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uZmlnLT5jZmcua2ZfbWF4X2Rpc3QgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKKyAgICAgICAgICAgIGNvbmZpZy0+aGF2ZV9rZl9tYXhfZGlzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZrZl9kaXNhYmxlZCwgYXJnaSkpCisgICAgICAgICAgICBjb25maWctPmNmZy5rZl9tb2RlID0gVlBYX0tGX0RJU0FCTEVEOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBtYXRjaCA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGN0cmxfYXJnc1tpXTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdfbWF0Y2goJmFyZywgY3RybF9hcmdzW2ldLCBhcmdpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgZWl0aGVyIHRvIHRoZSBuZXh0IGZyZWUgZWxlbWVudCBvciB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2wuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7IGo8Y29uZmlnLT5hcmdfY3RybF9jbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZy0+YXJnX2N0cmxzW2pdWzBdID09IGN0cmxfYXJnc19tYXBbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlL2luc2VydCAqLworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaiA8IEFSR19DVFJMX0NOVF9NQVgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IEFSR19DVFJMX0NOVF9NQVgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YXJnX2N0cmxzW2pdWzBdID0gY3RybF9hcmdzX21hcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YXJnX2N0cmxzW2pdWzFdID0gYXJnX3BhcnNlX2VudW1fb3JfaW50KCZhcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaiA9PSBjb25maWctPmFyZ19jdHJsX2NudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmFyZ19jdHJsX2NudCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbWF0Y2gpCisgICAgICAgICAgICAgICAgYXJnaisrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVvc19tYXJrX2ZvdW5kOworfQorCisKKyNkZWZpbmUgRk9SRUFDSF9TVFJFQU0oZnVuYylcCitkb1wKK3tcCisgICAgc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnN0cmVhbTtcCitcCisgICAgZm9yKHN0cmVhbSA9IHN0cmVhbXM7IHN0cmVhbTsgc3RyZWFtID0gc3RyZWFtLT5uZXh0KVwKKyAgICAgICAgZnVuYztcCit9d2hpbGUoMCkKKworCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9zdHJlYW1fY29uZmlnKHN0cnVjdCBzdHJlYW1fc3RhdGUgKnN0cmVhbSkKK3sKKyAgICBzdHJ1Y3Qgc3RyZWFtX3N0YXRlICpzdHJlYW1pOworCisgICAgaWYoIXN0cmVhbS0+Y29uZmlnLmNmZy5nX3cgfHwgIXN0cmVhbS0+Y29uZmlnLmNmZy5nX2gpCisgICAgICAgIGZhdGFsKCJTdHJlYW0gJWQ6IFNwZWNpZnkgc3RyZWFtIGRpbWVuc2lvbnMgd2l0aCAtLXdpZHRoICgtdykgIgorICAgICAgICAgICAgICAiIGFuZCAtLWhlaWdodCAoLWgpIiwgc3RyZWFtLT5pbmRleCk7CisKKyAgICBmb3Ioc3RyZWFtaSA9IHN0cmVhbTsgc3RyZWFtaTsgc3RyZWFtaSA9IHN0cmVhbWktPm5leHQpCisgICAgeworICAgICAgICAvKiBBbGwgc3RyZWFtcyByZXF1aXJlIG91dHB1dCBmaWxlcyAqLworICAgICAgICBpZighc3RyZWFtaS0+Y29uZmlnLm91dF9mbikKKyAgICAgICAgICAgIGZhdGFsKCJTdHJlYW0gJWQ6IE91dHB1dCBmaWxlIGlzIHJlcXVpcmVkIChzcGVjaWZ5IHdpdGggLW8pIiwKKyAgICAgICAgICAgICAgICAgIHN0cmVhbWktPmluZGV4KTsKKworICAgICAgICAvKiBDaGVjayBmb3IgdHdvIHN0cmVhbXMgb3V0cHV0dGluZyB0byB0aGUgc2FtZSBmaWxlICovCisgICAgICAgIGlmKHN0cmVhbWkgIT0gc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICphID0gc3RyZWFtLT5jb25maWcub3V0X2ZuOworICAgICAgICAgICAgY29uc3QgY2hhciAqYiA9IHN0cmVhbWktPmNvbmZpZy5vdXRfZm47CisgICAgICAgICAgICBpZighc3RyY21wKGEsYikgJiYgc3RyY21wKGEsICIvZGV2L251bGwiKSAmJiBzdHJjbXAoYSwgIjpudWwiKSkKKyAgICAgICAgICAgICAgICBmYXRhbCgiU3RyZWFtICVkOiBkdXBsaWNhdGUgb3V0cHV0IGZpbGUgKGZyb20gc3RyZWFtICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtaS0+aW5kZXgsIHN0cmVhbS0+aW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHR3byBzdHJlYW1zIHNoYXJpbmcgYSBzdGF0cyBmaWxlLiAqLworICAgICAgICBpZihzdHJlYW1pICE9IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqYSA9IHN0cmVhbS0+Y29uZmlnLnN0YXRzX2ZuOworICAgICAgICAgICAgY29uc3QgY2hhciAqYiA9IHN0cmVhbWktPmNvbmZpZy5zdGF0c19mbjsKKyAgICAgICAgICAgIGlmKGEgJiYgYiAmJiAhc3RyY21wKGEsYikpCisgICAgICAgICAgICAgICAgZmF0YWwoIlN0cmVhbSAlZDogZHVwbGljYXRlIHN0YXRzIGZpbGUgKGZyb20gc3RyZWFtICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtaS0+aW5kZXgsIHN0cmVhbS0+aW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHNldF9zdHJlYW1fZGltZW5zaW9ucyhzdHJ1Y3Qgc3RyZWFtX3N0YXRlICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGgpCit7CisgICAgaWYgKChzdHJlYW0tPmNvbmZpZy5jZmcuZ193ICYmIHN0cmVhbS0+Y29uZmlnLmNmZy5nX3cgIT0gdykKKyAgICAgICAgfHwoc3RyZWFtLT5jb25maWcuY2ZnLmdfaCAmJiBzdHJlYW0tPmNvbmZpZy5jZmcuZ19oICE9IGgpKQorICAgICAgICBmYXRhbCgiU3RyZWFtICVkOiBSZXNpemluZyBub3QgeWV0IHN1cHBvcnRlZCIsIHN0cmVhbS0+aW5kZXgpOworICAgIHN0cmVhbS0+Y29uZmlnLmNmZy5nX3cgPSB3OworICAgIHN0cmVhbS0+Y29uZmlnLmNmZy5nX2ggPSBoOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2tmX2ludGVydmFsKHN0cnVjdCBzdHJlYW1fc3RhdGUgICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xvYmFsX2NvbmZpZyAqZ2xvYmFsKQoreworICAgIC8qIFVzZSBhIG1heCBrZXlmcmFtZSBpbnRlcnZhbCBvZiA1IHNlY29uZHMsIGlmIG5vbmUgd2FzCisgICAgICogc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgaWYgKCFzdHJlYW0tPmNvbmZpZy5oYXZlX2tmX21heF9kaXN0KQorICAgIHsKKyAgICAgICAgZG91YmxlIGZyYW1lcmF0ZSA9IChkb3VibGUpZ2xvYmFsLT5mcmFtZXJhdGUubnVtL2dsb2JhbC0+ZnJhbWVyYXRlLmRlbjsKKyAgICAgICAgaWYgKGZyYW1lcmF0ZSA+IDAuMCkKKyAgICAgICAgICAgIHN0cmVhbS0+Y29uZmlnLmNmZy5rZl9tYXhfZGlzdCA9ICh1bnNpZ25lZCBpbnQpKDUuMCpmcmFtZXJhdGUpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBzaG93X3N0cmVhbV9jb25maWcoc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xvYmFsX2NvbmZpZyAqZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnB1dF9zdGF0ZSAgICppbnB1dCkKK3sKKworI2RlZmluZSBTSE9XKGZpZWxkKSBcCisgICAgZnByaW50ZihzdGRlcnIsICIgICAgJS0yOHMgPSAlZFxuIiwgI2ZpZWxkLCBzdHJlYW0tPmNvbmZpZy5jZmcuZmllbGQpCisKKyAgICBpZihzdHJlYW0tPmluZGV4ID09IDApCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvZGVjOiAlc1xuIiwKKyAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfbmFtZShnbG9iYWwtPmNvZGVjLT5pZmFjZSkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNvdXJjZSBmaWxlOiAlcyBGb3JtYXQ6ICVzXG4iLCBpbnB1dC0+Zm4sCisgICAgICAgICAgICAgICAgaW5wdXQtPnVzZV9pNDIwID8gIkk0MjAiIDogIllWMTIiKTsKKyAgICB9CisgICAgaWYoc3RyZWFtLT5uZXh0IHx8IHN0cmVhbS0+aW5kZXgpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5TdHJlYW0gSW5kZXg6ICVkXG4iLCBzdHJlYW0tPmluZGV4KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRlc3RpbmF0aW9uIGZpbGU6ICVzXG4iLCBzdHJlYW0tPmNvbmZpZy5vdXRfZm4pOworICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RlciBwYXJhbWV0ZXJzOlxuIik7CisKKyAgICBTSE9XKGdfdXNhZ2UpOworICAgIFNIT1coZ190aHJlYWRzKTsKKyAgICBTSE9XKGdfcHJvZmlsZSk7CisgICAgU0hPVyhnX3cpOworICAgIFNIT1coZ19oKTsKKyAgICBTSE9XKGdfdGltZWJhc2UubnVtKTsKKyAgICBTSE9XKGdfdGltZWJhc2UuZGVuKTsKKyAgICBTSE9XKGdfZXJyb3JfcmVzaWxpZW50KTsKKyAgICBTSE9XKGdfcGFzcyk7CisgICAgU0hPVyhnX2xhZ19pbl9mcmFtZXMpOworICAgIFNIT1cocmNfZHJvcGZyYW1lX3RocmVzaCk7CisgICAgU0hPVyhyY19yZXNpemVfYWxsb3dlZCk7CisgICAgU0hPVyhyY19yZXNpemVfdXBfdGhyZXNoKTsKKyAgICBTSE9XKHJjX3Jlc2l6ZV9kb3duX3RocmVzaCk7CisgICAgU0hPVyhyY19lbmRfdXNhZ2UpOworICAgIFNIT1cocmNfdGFyZ2V0X2JpdHJhdGUpOworICAgIFNIT1cocmNfbWluX3F1YW50aXplcik7CisgICAgU0hPVyhyY19tYXhfcXVhbnRpemVyKTsKKyAgICBTSE9XKHJjX3VuZGVyc2hvb3RfcGN0KTsKKyAgICBTSE9XKHJjX292ZXJzaG9vdF9wY3QpOworICAgIFNIT1cocmNfYnVmX3N6KTsKKyAgICBTSE9XKHJjX2J1Zl9pbml0aWFsX3N6KTsKKyAgICBTSE9XKHJjX2J1Zl9vcHRpbWFsX3N6KTsKKyAgICBTSE9XKHJjXzJwYXNzX3Zicl9iaWFzX3BjdCk7CisgICAgU0hPVyhyY18ycGFzc192YnJfbWluc2VjdGlvbl9wY3QpOworICAgIFNIT1cocmNfMnBhc3NfdmJyX21heHNlY3Rpb25fcGN0KTsKKyAgICBTSE9XKGtmX21vZGUpOworICAgIFNIT1coa2ZfbWluX2Rpc3QpOworICAgIFNIT1coa2ZfbWF4X2Rpc3QpOworfQorCisKK3N0YXRpYyB2b2lkIG9wZW5fb3V0cHV0X2ZpbGUoc3RydWN0IHN0cmVhbV9zdGF0ZSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xvYmFsX2NvbmZpZyAqZ2xvYmFsKQoreworICAgIGNvbnN0IGNoYXIgKmZuID0gc3RyZWFtLT5jb25maWcub3V0X2ZuOworCisgICAgc3RyZWFtLT5maWxlID0gc3RyY21wKGZuLCAiLSIpID8gZm9wZW4oZm4sICJ3YiIpIDogc2V0X2JpbmFyeV9tb2RlKHN0ZG91dCk7CisKKyAgICBpZiAoIXN0cmVhbS0+ZmlsZSkKKyAgICAgICAgZmF0YWwoIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIik7CisKKyAgICBpZihzdHJlYW0tPmNvbmZpZy53cml0ZV93ZWJtICYmIGZzZWVrKHN0cmVhbS0+ZmlsZSwgMCwgU0VFS19DVVIpKQorICAgICAgICBmYXRhbCgiV2ViTSBvdXRwdXQgdG8gcGlwZXMgbm90IHN1cHBvcnRlZC4iKTsKKworICAgIGlmKHN0cmVhbS0+Y29uZmlnLndyaXRlX3dlYm0pCisgICAgeworICAgICAgICBzdHJlYW0tPmVibWwuc3RyZWFtID0gc3RyZWFtLT5maWxlOworICAgICAgICB3cml0ZV93ZWJtX2ZpbGVfaGVhZGVyKCZzdHJlYW0tPmVibWwsICZzdHJlYW0tPmNvbmZpZy5jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbC0+ZnJhbWVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y29uZmlnLnN0ZXJlb19mbXQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihzdHJlYW0tPmZpbGUsICZzdHJlYW0tPmNvbmZpZy5jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmNvZGVjLT5mb3VyY2MsIDApOworfQorCisKK3N0YXRpYyB2b2lkIGNsb3NlX291dHB1dF9maWxlKHN0cnVjdCBzdHJlYW1fc3RhdGUgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgIGZvdXJjYykKK3sKKyAgICBpZihzdHJlYW0tPmNvbmZpZy53cml0ZV93ZWJtKQorICAgIHsKKyAgICAgICAgd3JpdGVfd2VibV9maWxlX2Zvb3Rlcigmc3RyZWFtLT5lYm1sLCBzdHJlYW0tPmhhc2gpOworICAgICAgICBmcmVlKHN0cmVhbS0+ZWJtbC5jdWVfbGlzdCk7CisgICAgICAgIHN0cmVhbS0+ZWJtbC5jdWVfbGlzdCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICghZnNlZWsoc3RyZWFtLT5maWxlLCAwLCBTRUVLX1NFVCkpCisgICAgICAgICAgICB3cml0ZV9pdmZfZmlsZV9oZWFkZXIoc3RyZWFtLT5maWxlLCAmc3RyZWFtLT5jb25maWcuY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdXJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmZyYW1lc19vdXQpOworICAgIH0KKworICAgIGZjbG9zZShzdHJlYW0tPmZpbGUpOworfQorCisKK3N0YXRpYyB2b2lkIHNldHVwX3Bhc3Moc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsb2JhbF9jb25maWcgKmdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHBhc3MpCit7CisgICAgaWYgKHN0cmVhbS0+Y29uZmlnLnN0YXRzX2ZuKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0c19vcGVuX2ZpbGUoJnN0cmVhbS0+c3RhdHMsIHN0cmVhbS0+Y29uZmlnLnN0YXRzX2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzKSkKKyAgICAgICAgICAgIGZhdGFsKCJGYWlsZWQgdG8gb3BlbiBzdGF0aXN0aWNzIHN0b3JlIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICghc3RhdHNfb3Blbl9tZW0oJnN0cmVhbS0+c3RhdHMsIHBhc3MpKQorICAgICAgICAgICAgZmF0YWwoIkZhaWxlZCB0byBvcGVuIHN0YXRpc3RpY3Mgc3RvcmUiKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmNvbmZpZy5jZmcuZ19wYXNzID0gZ2xvYmFsLT5wYXNzZXMgPT0gMgorICAgICAgICA/IHBhc3MgPyBWUFhfUkNfTEFTVF9QQVNTIDogVlBYX1JDX0ZJUlNUX1BBU1MKKyAgICAgICAgOiBWUFhfUkNfT05FX1BBU1M7CisgICAgaWYgKHBhc3MpCisgICAgICAgIHN0cmVhbS0+Y29uZmlnLmNmZy5yY190d29wYXNzX3N0YXRzX2luID0gc3RhdHNfZ2V0KCZzdHJlYW0tPnN0YXRzKTsKKworICAgIHN0cmVhbS0+Y3hfdGltZSA9IDA7CisgICAgc3RyZWFtLT5uYnl0ZXMgPSAwOworICAgIHN0cmVhbS0+ZnJhbWVzX291dCA9IDA7Cit9CisKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9lbmNvZGVyKHN0cnVjdCBzdHJlYW1fc3RhdGUgICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsb2JhbF9jb25maWcgKmdsb2JhbCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgZmxhZ3MgfD0gZ2xvYmFsLT5zaG93X3BzbnIgPyBWUFhfQ09ERUNfVVNFX1BTTlIgOiAwOworICAgIGZsYWdzIHw9IGdsb2JhbC0+b3V0X3BhcnQgPyBWUFhfQ09ERUNfVVNFX09VVFBVVF9QQVJUSVRJT04gOiAwOworCisgICAgLyogQ29uc3RydWN0IEVuY29kZXIgQ29udGV4dCAqLworICAgIHZweF9jb2RlY19lbmNfaW5pdCgmc3RyZWFtLT5lbmNvZGVyLCBnbG9iYWwtPmNvZGVjLT5pZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0tPmNvbmZpZy5jZmcsIGZsYWdzKTsKKyAgICBjdHhfZXhpdF9vbl9lcnJvcigmc3RyZWFtLT5lbmNvZGVyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworCisgICAgLyogTm90ZSB0aGF0IHdlIGJ5cGFzcyB0aGUgdnB4X2NvZGVjX2NvbnRyb2wgd3JhcHBlciBtYWNybyBiZWNhdXNlCisgICAgICogd2UncmUgYmVpbmcgY2xldmVyIHRvIHN0b3JlIHRoZSBjb250cm9sIElEcyBpbiBhbiBhcnJheS4gUmVhbAorICAgICAqIGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gbWFrZSB1c2Ugb2YgdGhlIGVudW1lcmF0aW9ucyBkaXJlY3RseQorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPmNvbmZpZy5hcmdfY3RybF9jbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGludCBjdHJsID0gc3RyZWFtLT5jb25maWcuYXJnX2N0cmxzW2ldWzBdOworICAgICAgICBpbnQgdmFsdWUgPSBzdHJlYW0tPmNvbmZpZy5hcmdfY3RybHNbaV1bMV07CisgICAgICAgIGlmICh2cHhfY29kZWNfY29udHJvbF8oJnN0cmVhbS0+ZW5jb2RlciwgY3RybCwgdmFsdWUpKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogVHJpZWQgdG8gc2V0IGNvbnRyb2wgJWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgY3RybCwgdmFsdWUpOworCisgICAgICAgIGN0eF9leGl0X29uX2Vycm9yKCZzdHJlYW0tPmVuY29kZXIsICJGYWlsZWQgdG8gY29udHJvbCBjb2RlYyIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBlbmNvZGVfZnJhbWUoc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xvYmFsX2NvbmZpZyAqZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2cHhfaW1hZ2UgICAgICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGZyYW1lc19pbikKK3sKKyAgICB2cHhfY29kZWNfcHRzX3QgZnJhbWVfc3RhcnQsIG5leHRfZnJhbWVfc3RhcnQ7CisgICAgc3RydWN0IHZweF9jb2RlY19lbmNfY2ZnICpjZmcgPSAmc3RyZWFtLT5jb25maWcuY2ZnOworICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciB0aW1lcjsKKworICAgIGZyYW1lX3N0YXJ0ID0gKGNmZy0+Z190aW1lYmFzZS5kZW4gKiAoaW50NjRfdCkoZnJhbWVzX2luIC0gMSkKKyAgICAgICAgICAgICAgICAgICogZ2xvYmFsLT5mcmFtZXJhdGUuZGVuKQorICAgICAgICAgICAgICAgICAgLyBjZmctPmdfdGltZWJhc2UubnVtIC8gZ2xvYmFsLT5mcmFtZXJhdGUubnVtOworICAgIG5leHRfZnJhbWVfc3RhcnQgPSAoY2ZnLT5nX3RpbWViYXNlLmRlbiAqIChpbnQ2NF90KShmcmFtZXNfaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAqIGdsb2JhbC0+ZnJhbWVyYXRlLmRlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gY2ZnLT5nX3RpbWViYXNlLm51bSAvIGdsb2JhbC0+ZnJhbWVyYXRlLm51bTsKKyAgICB2cHhfdXNlY190aW1lcl9zdGFydCgmdGltZXIpOworICAgIHZweF9jb2RlY19lbmNvZGUoJnN0cmVhbS0+ZW5jb2RlciwgaW1nLCBmcmFtZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShuZXh0X2ZyYW1lX3N0YXJ0IC0gZnJhbWVfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgMCwgZ2xvYmFsLT5kZWFkbGluZSk7CisgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdGltZXIpOworICAgIHN0cmVhbS0+Y3hfdGltZSArPSB2cHhfdXNlY190aW1lcl9lbGFwc2VkKCZ0aW1lcik7CisgICAgY3R4X2V4aXRfb25fZXJyb3IoJnN0cmVhbS0+ZW5jb2RlciwgIlN0cmVhbSAlZDogRmFpbGVkIHRvIGVuY29kZSBmcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5pbmRleCk7Cit9CisKKworc3RhdGljIHZvaWQgdXBkYXRlX3F1YW50aXplcl9oaXN0b2dyYW0oc3RydWN0IHN0cmVhbV9zdGF0ZSAqc3RyZWFtKQoreworICAgIGlmKHN0cmVhbS0+Y29uZmlnLmNmZy5nX3Bhc3MgIT0gVlBYX1JDX0ZJUlNUX1BBU1MpCisgICAgeworICAgICAgICBpbnQgcTsKKworICAgICAgICB2cHhfY29kZWNfY29udHJvbCgmc3RyZWFtLT5lbmNvZGVyLCBWUDhFX0dFVF9MQVNUX1FVQU5USVpFUl82NCwgJnEpOworICAgICAgICBjdHhfZXhpdF9vbl9lcnJvcigmc3RyZWFtLT5lbmNvZGVyLCAiRmFpbGVkIHRvIHJlYWQgcXVhbnRpemVyIik7CisgICAgICAgIHN0cmVhbS0+Y291bnRzW3FdKys7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGdldF9jeF9kYXRhKHN0cnVjdCBzdHJlYW1fc3RhdGUgICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xvYmFsX2NvbmZpZyAqZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKmdvdF9kYXRhKQoreworICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0OworICAgIGNvbnN0IHN0cnVjdCB2cHhfY29kZWNfZW5jX2NmZyAqY2ZnID0gJnN0cmVhbS0+Y29uZmlnLmNmZzsKKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworCisgICAgd2hpbGUgKChwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJnN0cmVhbS0+ZW5jb2RlciwgJml0ZXIpKSkKKyAgICB7CisgICAgICAgIHN0YXRpYyBzaXplX3QgZnNpemUgPSAwOworICAgICAgICBzdGF0aWMgb2ZmX3QgaXZmX2hlYWRlcl9wb3MgPSAwOworCisgICAgICAgICpnb3RfZGF0YSA9IDE7CisKKyAgICAgICAgc3dpdGNoIChwa3QtPmtpbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUOgorICAgICAgICAgICAgaWYgKCEocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0ZSQUdNRU5UKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmZyYW1lc19vdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ2xvYmFsLT5xdWlldCkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlNmx1RiIsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwa3QtPmRhdGEuZnJhbWUuc3opOworCisgICAgICAgICAgICB1cGRhdGVfcmF0ZV9oaXN0b2dyYW0oJnN0cmVhbS0+cmF0ZV9oaXN0LCBjZmcsIHBrdCk7CisgICAgICAgICAgICBpZihzdHJlYW0tPmNvbmZpZy53cml0ZV93ZWJtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaGFzaCAqLworICAgICAgICAgICAgICAgIGlmKCFzdHJlYW0tPmVibWwuZGVidWcpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+aGFzaCA9IG11cm11cihwa3QtPmRhdGEuZnJhbWUuYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwa3QtPmRhdGEuZnJhbWUuc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmhhc2gpOworCisgICAgICAgICAgICAgICAgd3JpdGVfd2VibV9ibG9jaygmc3RyZWFtLT5lYm1sLCBjZmcsIHBrdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBrdC0+ZGF0YS5mcmFtZS5wYXJ0aXRpb25faWQgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl2Zl9oZWFkZXJfcG9zID0gZnRlbGxvKHN0cmVhbS0+ZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGZzaXplID0gcGt0LT5kYXRhLmZyYW1lLnN6OworCisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2l2Zl9mcmFtZV9oZWFkZXIoc3RyZWFtLT5maWxlLCBwa3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmc2l6ZSArPSBwa3QtPmRhdGEuZnJhbWUuc3o7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0ZSQUdNRU5UKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgY3VycnBvcyA9IGZ0ZWxsbyhzdHJlYW0tPmZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZnNlZWtvKHN0cmVhbS0+ZmlsZSwgaXZmX2hlYWRlcl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2l2Zl9mcmFtZV9zaXplKHN0cmVhbS0+ZmlsZSwgZnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZnNlZWtvKHN0cmVhbS0+ZmlsZSwgY3VycnBvcywgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKHZvaWQpIGZ3cml0ZShwa3QtPmRhdGEuZnJhbWUuYnVmLCAxLCBwa3QtPmRhdGEuZnJhbWUuc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtLT5uYnl0ZXMgKz0gcGt0LT5kYXRhLnJhdy5zejsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZQWF9DT0RFQ19TVEFUU19QS1Q6CisgICAgICAgICAgICBzdHJlYW0tPmZyYW1lc19vdXQrKzsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICU2bHVTIiwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeik7CisgICAgICAgICAgICBzdGF0c193cml0ZSgmc3RyZWFtLT5zdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLnN6KTsKKyAgICAgICAgICAgIHN0cmVhbS0+bmJ5dGVzICs9IHBrdC0+ZGF0YS5yYXcuc3o7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWUFhfQ09ERUNfUFNOUl9QS1Q6CisKKyAgICAgICAgICAgIGlmIChnbG9iYWwtPnNob3dfcHNucikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIHN0cmVhbS0+cHNucl9zc2VfdG90YWwgKz0gcGt0LT5kYXRhLnBzbnIuc3NlWzBdOworICAgICAgICAgICAgICAgIHN0cmVhbS0+cHNucl9zYW1wbGVzX3RvdGFsICs9IHBrdC0+ZGF0YS5wc25yLnNhbXBsZXNbMF07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLT5xdWlldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJS4zZiAiLCBwa3QtPmRhdGEucHNuci5wc25yW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5wc25yX3RvdGFsc1tpXSArPSBwa3QtPmRhdGEucHNuci5wc25yW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJlYW0tPnBzbnJfY291bnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBzaG93X3BzbnIoc3RydWN0IHN0cmVhbV9zdGF0ZSAgKnN0cmVhbSkKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgb3Zwc25yOworCisgICAgaWYgKCFzdHJlYW0tPnBzbnJfY291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIGZwcmludGYoc3RkZXJyLCAiU3RyZWFtICVkIFBTTlIgKE92ZXJhbGwvQXZnL1kvVS9WKSIsIHN0cmVhbS0+aW5kZXgpOworICAgIG92cHNuciA9IHZwOF9tc2UycHNucigoZG91YmxlKXN0cmVhbS0+cHNucl9zYW1wbGVzX3RvdGFsLCAyNTUuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlzdHJlYW0tPnBzbnJfc3NlX3RvdGFsKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAlLjNmIiwgb3Zwc25yKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlLjNmIiwgc3RyZWFtLT5wc25yX3RvdGFsc1tpXS9zdHJlYW0tPnBzbnJfY291bnQpOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKKworZmxvYXQgdXNlY190b19mcHModWludDY0X3QgdXNlYywgdW5zaWduZWQgaW50IGZyYW1lcykKK3sKKyAgICByZXR1cm4gKGZsb2F0KSh1c2VjID4gMCA/IGZyYW1lcyAqIDEwMDAwMDAuMCAvIChmbG9hdCl1c2VjIDogMCk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2XykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHBhc3M7CisgICAgdnB4X2ltYWdlX3QgICAgICAgICAgICByYXc7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBmcmFtZV9hdmFpbCwgZ290X2RhdGE7CisKKyAgICBzdHJ1Y3QgaW5wdXRfc3RhdGUgICAgICAgaW5wdXQgPSB7MH07CisgICAgc3RydWN0IGdsb2JhbF9jb25maWcgICAgIGdsb2JhbDsKKyAgICBzdHJ1Y3Qgc3RyZWFtX3N0YXRlICAgICAqc3RyZWFtcyA9IE5VTEw7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAqKmFyZ3YsICoqYXJnaTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgY3hfdGltZSA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jbnQgPSAwOworCisgICAgZXhlY19uYW1lID0gYXJndl9bMF07CisKKyAgICBpZiAoYXJnYyA8IDMpCisgICAgICAgIHVzYWdlX2V4aXQoKTsKKworICAgIC8qIFNldHVwIGRlZmF1bHQgaW5wdXQgc3RyZWFtIHNldHRpbmdzICovCisgICAgaW5wdXQuZnJhbWVyYXRlLm51bSA9IDMwOworICAgIGlucHV0LmZyYW1lcmF0ZS5kZW4gPSAxOworICAgIGlucHV0LnVzZV9pNDIwID0gMTsKKworICAgIC8qIEZpcnN0IHBhcnNlIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiB2YWx1ZXMsIGJlY2F1c2Ugd2Ugd2FudCB0byBhcHBseQorICAgICAqIG90aGVyIHBhcmFtZXRlcnMgb24gdG9wIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdGhlCisgICAgICogY29kZWMuCisgICAgICovCisgICAgYXJndiA9IGFyZ3ZfZHVwKGFyZ2MgLSAxLCBhcmd2XyArIDEpOworICAgIHBhcnNlX2dsb2JhbF9jb25maWcoJmdsb2JhbCwgYXJndik7CisKKyAgICB7CisgICAgICAgIC8qIE5vdyBwYXJzZSBlYWNoIHN0cmVhbSdzIHBhcmFtZXRlcnMuIFVzaW5nIGEgbG9jYWwgc2NvcGUgaGVyZQorICAgICAgICAgKiBkdWUgdG8gdGhlIHVzZSBvZiAnc3RyZWFtJyBhcyBsb29wIHZhcmlhYmxlIGluIEZPUkVBQ0hfU1RSRUFNCisgICAgICAgICAqIGxvb3BzCisgICAgICAgICAqLworICAgICAgICBzdHJ1Y3Qgc3RyZWFtX3N0YXRlICpzdHJlYW0gPSBOVUxMOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbSA9IG5ld19zdHJlYW0oJmdsb2JhbCwgc3RyZWFtKTsKKyAgICAgICAgICAgIHN0cmVhbV9jbnQrKzsKKyAgICAgICAgICAgIGlmKCFzdHJlYW1zKQorICAgICAgICAgICAgICAgIHN0cmVhbXMgPSBzdHJlYW07CisgICAgICAgIH0gd2hpbGUocGFyc2Vfc3RyZWFtX3BhcmFtcygmZ2xvYmFsLCBzdHJlYW0sIGFyZ3YpKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMgKi8KKyAgICBmb3IgKGFyZ2kgPSBhcmd2OyAqYXJnaTsgYXJnaSsrKQorICAgICAgICBpZiAoYXJnaVswXVswXSA9PSAnLScgJiYgYXJnaVswXVsxXSkKKyAgICAgICAgICAgIGRpZSgiRXJyb3I6IFVucmVjb2duaXplZCBvcHRpb24gJXNcbiIsICphcmdpKTsKKworICAgIC8qIEhhbmRsZSBub24tb3B0aW9uIGFyZ3VtZW50cyAqLworICAgIGlucHV0LmZuID0gYXJndlswXTsKKworICAgIGlmICghaW5wdXQuZm4pCisgICAgICAgIHVzYWdlX2V4aXQoKTsKKworICAgIGZvciAocGFzcyA9IGdsb2JhbC5wYXNzID8gZ2xvYmFsLnBhc3MgLSAxIDogMDsgcGFzcyA8IGdsb2JhbC5wYXNzZXM7IHBhc3MrKykKKyAgICB7CisgICAgICAgIGludCBmcmFtZXNfaW4gPSAwOworCisgICAgICAgIG9wZW5faW5wdXRfZmlsZSgmaW5wdXQpOworCisgICAgICAgIC8qIElmIHRoZSBpbnB1dCBmaWxlIGRvZXNuJ3Qgc3BlY2lmeSBpdHMgdy9oIChyYXcgZmlsZXMpLCB0cnkgdG8gZ2V0CisgICAgICAgICAqIHRoZSBkYXRhIGZyb20gdGhlIGZpcnN0IHN0cmVhbSdzIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBpZighaW5wdXQudyB8fCAhaW5wdXQuaCkKKyAgICAgICAgICAgIEZPUkVBQ0hfU1RSRUFNKHsKKyAgICAgICAgICAgICAgICBpZihzdHJlYW0tPmNvbmZpZy5jZmcuZ193ICYmIHN0cmVhbS0+Y29uZmlnLmNmZy5nX2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dC53ID0gc3RyZWFtLT5jb25maWcuY2ZnLmdfdzsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuaCA9IHN0cmVhbS0+Y29uZmlnLmNmZy5nX2g7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgaW5wdXQgZmlsZSdzIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgRk9SRUFDSF9TVFJFQU0oc2V0X3N0cmVhbV9kaW1lbnNpb25zKHN0cmVhbSwgaW5wdXQudywgaW5wdXQuaCkpOworICAgICAgICBGT1JFQUNIX1NUUkVBTSh2YWxpZGF0ZV9zdHJlYW1fY29uZmlnKHN0cmVhbSkpOworCisgICAgICAgIC8qIEVuc3VyZSB0aGF0IC0tcGFzc2VzIGFuZCAtLXBhc3MgYXJlIGNvbnNpc3RlbnQuIElmIC0tcGFzcyBpcyBzZXQgYW5kCisgICAgICAgICAqIC0tcGFzc2VzPTIsIGVuc3VyZSAtLWZwZiB3YXMgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGdsb2JhbC5wYXNzICYmIGdsb2JhbC5wYXNzZXMgPT0gMikKKyAgICAgICAgICAgIEZPUkVBQ0hfU1RSRUFNKHsKKyAgICAgICAgICAgICAgICBpZighc3RyZWFtLT5jb25maWcuc3RhdHNfZm4pCisgICAgICAgICAgICAgICAgICAgIGRpZSgiU3RyZWFtICVkOiBNdXN0IHNwZWNpZnkgLS1mcGYgd2hlbiAtLXBhc3M9JWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCAtLXBhc3Nlcz0yXG4iLCBzdHJlYW0tPmluZGV4LCBnbG9iYWwucGFzcyk7CisgICAgICAgICAgICB9KTsKKworCisgICAgICAgIC8qIFVzZSB0aGUgZnJhbWUgcmF0ZSBmcm9tIHRoZSBmaWxlIG9ubHkgaWYgbm9uZSB3YXMgc3BlY2lmaWVkCisgICAgICAgICAqIG9uIHRoZSBjb21tYW5kLWxpbmUuCisgICAgICAgICAqLworICAgICAgICBpZiAoIWdsb2JhbC5oYXZlX2ZyYW1lcmF0ZSkKKyAgICAgICAgICAgIGdsb2JhbC5mcmFtZXJhdGUgPSBpbnB1dC5mcmFtZXJhdGU7CisKKyAgICAgICAgRk9SRUFDSF9TVFJFQU0oc2V0X2RlZmF1bHRfa2ZfaW50ZXJ2YWwoc3RyZWFtLCAmZ2xvYmFsKSk7CisKKyAgICAgICAgLyogU2hvdyBjb25maWd1cmF0aW9uICovCisgICAgICAgIGlmIChnbG9iYWwudmVyYm9zZSAmJiBwYXNzID09IDApCisgICAgICAgICAgICBGT1JFQUNIX1NUUkVBTShzaG93X3N0cmVhbV9jb25maWcoc3RyZWFtLCAmZ2xvYmFsLCAmaW5wdXQpKTsKKworICAgICAgICBpZihwYXNzID09IChnbG9iYWwucGFzcyA/IGdsb2JhbC5wYXNzIC0gMSA6IDApKSB7CisgICAgICAgICAgICBpZiAoaW5wdXQuZmlsZV90eXBlID09IEZJTEVfVFlQRV9ZNE0pCisgICAgICAgICAgICAgICAgLypUaGUgWTRNIHJlYWRlciBkb2VzIGl0cyBvd24gYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgIEp1c3QgaW5pdGlhbGl6ZSB0aGlzIGhlcmUgdG8gYXZvaWQgcHJvYmxlbXMgaWYgd2UgbmV2ZXIgcmVhZCBhbnkKKyAgICAgICAgICAgICAgICAgICBmcmFtZXMuKi8KKyAgICAgICAgICAgICAgICBtZW1zZXQoJnJhdywgMCwgc2l6ZW9mKHJhdykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZweF9pbWdfYWxsb2MoJnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnVzZV9pNDIwID8gVlBYX0lNR19GTVRfSTQyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWUFhfSU1HX0ZNVF9ZVjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudywgaW5wdXQuaCwgMzIpOworCisgICAgICAgICAgICBGT1JFQUNIX1NUUkVBTShpbml0X3JhdGVfaGlzdG9ncmFtKCZzdHJlYW0tPnJhdGVfaGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+Y29uZmlnLmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbC5mcmFtZXJhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZPUkVBQ0hfU1RSRUFNKG9wZW5fb3V0cHV0X2ZpbGUoc3RyZWFtLCAmZ2xvYmFsKSk7CisgICAgICAgIEZPUkVBQ0hfU1RSRUFNKHNldHVwX3Bhc3Moc3RyZWFtLCAmZ2xvYmFsLCBwYXNzKSk7CisgICAgICAgIEZPUkVBQ0hfU1RSRUFNKGluaXRpYWxpemVfZW5jb2RlcihzdHJlYW0sICZnbG9iYWwpKTsKKworICAgICAgICBmcmFtZV9hdmFpbCA9IDE7CisgICAgICAgIGdvdF9kYXRhID0gMDsKKworICAgICAgICB3aGlsZSAoZnJhbWVfYXZhaWwgfHwgZ290X2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciB0aW1lcjsKKworICAgICAgICAgICAgaWYgKCFnbG9iYWwubGltaXQgfHwgZnJhbWVzX2luIDwgZ2xvYmFsLmxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lX2F2YWlsID0gcmVhZF9mcmFtZSgmaW5wdXQsICZyYXcpOworCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lX2F2YWlsKQorICAgICAgICAgICAgICAgICAgICBmcmFtZXNfaW4rKzsKKworICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLnF1aWV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtX2NudCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclBhc3MgJWQvJWQgZnJhbWUgJTRkLyUtNGQgJTciUFJJZDY0IkIgXDAzM1tLIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyArIDEsIGdsb2JhbC5wYXNzZXMsIGZyYW1lc19pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy0+ZnJhbWVzX291dCwgKGludDY0X3Qpc3RyZWFtcy0+bmJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclBhc3MgJWQvJWQgZnJhbWUgJTRkICU3bHUgJXMgKCUuMmYgZnBzKVwwMzNbSyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgKyAxLCBnbG9iYWwucGFzc2VzLCBmcmFtZXNfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4X3RpbWUgPiA5OTk5OTk5ID8gY3hfdGltZSAvIDEwMDAgOiBjeF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeF90aW1lID4gOTk5OTk5OSA/ICJtcyIgOiAidXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjX3RvX2ZwcyhjeF90aW1lLCBmcmFtZXNfaW4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZV9hdmFpbCA9IDA7CisKKyAgICAgICAgICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0aW1lcik7CisgICAgICAgICAgICBGT1JFQUNIX1NUUkVBTShlbmNvZGVfZnJhbWUoc3RyZWFtLCAmZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2F2YWlsID8gJnJhdyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2luKSk7CisgICAgICAgICAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZ0aW1lcik7CisgICAgICAgICAgICBjeF90aW1lICs9ICh1bnNpZ25lZCBsb25nKXZweF91c2VjX3RpbWVyX2VsYXBzZWQoJnRpbWVyKTsKKworICAgICAgICAgICAgRk9SRUFDSF9TVFJFQU0odXBkYXRlX3F1YW50aXplcl9oaXN0b2dyYW0oc3RyZWFtKSk7CisKKyAgICAgICAgICAgIGdvdF9kYXRhID0gMDsKKyAgICAgICAgICAgIEZPUkVBQ0hfU1RSRUFNKGdldF9jeF9kYXRhKHN0cmVhbSwgJmdsb2JhbCwgJmdvdF9kYXRhKSk7CisKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3RyZWFtX2NudCA+IDEpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKyAgICAgICAgaWYgKCFnbG9iYWwucXVpZXQpCisgICAgICAgICAgICBGT1JFQUNIX1NUUkVBTShmcHJpbnRmKAorICAgICAgICAgICAgICAgIHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiXHJQYXNzICVkLyVkIGZyYW1lICU0ZC8lLTRkICU3IlBSSWQ2NCJCICU3bHViL2YgJTciUFJJZDY0ImIvcyIKKyAgICAgICAgICAgICAgICAiICU3IlBSSWQ2NCIgJXMgKCUuMmYgZnBzKVwwMzNbS1xuIiwgcGFzcyArIDEsCisgICAgICAgICAgICAgICAgZ2xvYmFsLnBhc3NlcywgZnJhbWVzX2luLCBzdHJlYW0tPmZyYW1lc19vdXQsIChpbnQ2NF90KXN0cmVhbS0+bmJ5dGVzLAorICAgICAgICAgICAgICAgIGZyYW1lc19pbiA/ICh1bnNpZ25lZCBsb25nKShzdHJlYW0tPm5ieXRlcyAqIDggLyBmcmFtZXNfaW4pIDogMCwKKyAgICAgICAgICAgICAgICBmcmFtZXNfaW4gPyAoaW50NjRfdClzdHJlYW0tPm5ieXRlcyAqIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChpbnQ2NF90KWdsb2JhbC5mcmFtZXJhdGUubnVtIC8gZ2xvYmFsLmZyYW1lcmF0ZS5kZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGZyYW1lc19pbgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5jeF90aW1lID4gOTk5OTk5OSA/IHN0cmVhbS0+Y3hfdGltZSAvIDEwMDAgOiBzdHJlYW0tPmN4X3RpbWUsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5jeF90aW1lID4gOTk5OTk5OSA/ICJtcyIgOiAidXMiLAorICAgICAgICAgICAgICAgIHVzZWNfdG9fZnBzKHN0cmVhbS0+Y3hfdGltZSwgZnJhbWVzX2luKSk7CisgICAgICAgICAgICApOworCisgICAgICAgIGlmIChnbG9iYWwuc2hvd19wc25yKQorICAgICAgICAgICAgRk9SRUFDSF9TVFJFQU0oc2hvd19wc25yKHN0cmVhbSkpOworCisgICAgICAgIEZPUkVBQ0hfU1RSRUFNKHZweF9jb2RlY19kZXN0cm95KCZzdHJlYW0tPmVuY29kZXIpKTsKKworICAgICAgICBjbG9zZV9pbnB1dF9maWxlKCZpbnB1dCk7CisKKyAgICAgICAgRk9SRUFDSF9TVFJFQU0oY2xvc2Vfb3V0cHV0X2ZpbGUoc3RyZWFtLCBnbG9iYWwuY29kZWMtPmZvdXJjYykpOworCisgICAgICAgIEZPUkVBQ0hfU1RSRUFNKHN0YXRzX2Nsb3NlKCZzdHJlYW0tPnN0YXRzLCBnbG9iYWwucGFzc2VzLTEpKTsKKworICAgICAgICBpZiAoZ2xvYmFsLnBhc3MpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZ2xvYmFsLnNob3dfcV9oaXN0X2J1Y2tldHMpCisgICAgICAgIEZPUkVBQ0hfU1RSRUFNKHNob3dfcV9oaXN0b2dyYW0oc3RyZWFtLT5jb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLnNob3dfcV9oaXN0X2J1Y2tldHMpKTsKKworICAgIGlmIChnbG9iYWwuc2hvd19yYXRlX2hpc3RfYnVja2V0cykKKyAgICAgICAgRk9SRUFDSF9TVFJFQU0oc2hvd19yYXRlX2hpc3RvZ3JhbSgmc3RyZWFtLT5yYXRlX2hpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+Y29uZmlnLmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwuc2hvd19yYXRlX2hpc3RfYnVja2V0cykpOworICAgIEZPUkVBQ0hfU1RSRUFNKGRlc3Ryb3lfcmF0ZV9oaXN0b2dyYW0oJnN0cmVhbS0+cmF0ZV9oaXN0KSk7CisKKyAgICB2cHhfaW1nX2ZyZWUoJnJhdyk7CisgICAgZnJlZShhcmd2KTsKKyAgICBmcmVlKHN0cmVhbXMpOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9saWJ2cHgveTRtaW5wdXQuYyBiL2xpYnZweC95NG1pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOWZmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2cHgveTRtaW5wdXQuYwpAQCAtMCwwICsxLDg3MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisgKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisgKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKyAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAqCisgKiAgQmFzZWQgb24gY29kZSBmcm9tIHRoZSBPZ2dUaGVvcmEgc29mdHdhcmUgY29kZWMgc291cmNlIGNvZGUsCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgVGhlIFhpcGguT3JnIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInk0bWlucHV0LmgiCisKK3N0YXRpYyBpbnQgeTRtX3BhcnNlX3RhZ3MoeTRtX2lucHV0ICpfeTRtLGNoYXIgKl90YWdzKXsKKyAgaW50ICAgZ290X3c7CisgIGludCAgIGdvdF9oOworICBpbnQgICBnb3RfZnBzOworICBpbnQgICBnb3RfaW50ZXJsYWNlOworICBpbnQgICBnb3RfcGFyOworICBpbnQgICBnb3RfY2hyb21hOworICBjaGFyICpwOworICBjaGFyICpxOworICBnb3Rfdz1nb3RfaD1nb3RfZnBzPWdvdF9pbnRlcmxhY2U9Z290X3Bhcj1nb3RfY2hyb21hPTA7CisgIGZvcihwPV90YWdzOztwPXEpeworICAgIC8qU2tpcCBhbnkgbGVhZGluZyBzcGFjZXMuKi8KKyAgICB3aGlsZSgqcD09JyAnKXArKzsKKyAgICAvKklmIHRoYXQncyBhbGwgd2UgaGF2ZSwgc3RvcC4qLworICAgIGlmKHBbMF09PSdcMCcpYnJlYWs7CisgICAgLypGaW5kIHRoZSBlbmQgb2YgdGhpcyB0YWcuKi8KKyAgICBmb3IocT1wKzE7KnEhPSdcMCcmJipxIT0nICc7cSsrKTsKKyAgICAvKlByb2Nlc3MgdGhlIHRhZy4qLworICAgIHN3aXRjaChwWzBdKXsKKyAgICAgIGNhc2UgJ1cnOnsKKyAgICAgICAgaWYoc3NjYW5mKHArMSwiJWQiLCZfeTRtLT5waWNfdykhPTEpcmV0dXJuIC0xOworICAgICAgICBnb3Rfdz0xOworICAgICAgfWJyZWFrOworICAgICAgY2FzZSAnSCc6eworICAgICAgICBpZihzc2NhbmYocCsxLCIlZCIsJl95NG0tPnBpY19oKSE9MSlyZXR1cm4gLTE7CisgICAgICAgIGdvdF9oPTE7CisgICAgICB9YnJlYWs7CisgICAgICBjYXNlICdGJzp7CisgICAgICAgIGlmKHNzY2FuZihwKzEsIiVkOiVkIiwmX3k0bS0+ZnBzX24sJl95NG0tPmZwc19kKSE9Mil7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGdvdF9mcHM9MTsKKyAgICAgIH1icmVhazsKKyAgICAgIGNhc2UgJ0knOnsKKyAgICAgICAgX3k0bS0+aW50ZXJsYWNlPXBbMV07CisgICAgICAgIGdvdF9pbnRlcmxhY2U9MTsKKyAgICAgIH1icmVhazsKKyAgICAgIGNhc2UgJ0EnOnsKKyAgICAgICAgaWYoc3NjYW5mKHArMSwiJWQ6JWQiLCZfeTRtLT5wYXJfbiwmX3k0bS0+cGFyX2QpIT0yKXsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZ290X3Bhcj0xOworICAgICAgfWJyZWFrOworICAgICAgY2FzZSAnQyc6eworICAgICAgICBpZihxLXA+MTYpcmV0dXJuIC0xOworICAgICAgICBtZW1jcHkoX3k0bS0+Y2hyb21hX3R5cGUscCsxLHEtcC0xKTsKKyAgICAgICAgX3k0bS0+Y2hyb21hX3R5cGVbcS1wLTFdPSdcMCc7CisgICAgICAgIGdvdF9jaHJvbWE9MTsKKyAgICAgIH1icmVhazsKKyAgICAgIC8qSWdub3JlIHVua25vd24gdGFncy4qLworICAgIH0KKyAgfQorICBpZighZ290X3d8fCFnb3RfaHx8IWdvdF9mcHMpcmV0dXJuIC0xOworICBpZighZ290X2ludGVybGFjZSlfeTRtLT5pbnRlcmxhY2U9Jz8nOworICBpZighZ290X3BhcilfeTRtLT5wYXJfbj1feTRtLT5wYXJfZD0wOworICAvKkNocm9tYS10eXBlIGlzIG5vdCBzcGVjaWZpZWQgaW4gb2xkZXIgZmlsZXMsIGUuZy4sIHRob3NlIGdlbmVyYXRlZCBieQorICAgICBtcGxheWVyLiovCisgIGlmKCFnb3RfY2hyb21hKXN0cmNweShfeTRtLT5jaHJvbWFfdHlwZSwiNDIwIik7CisgIHJldHVybiAwOworfQorCisKKworLypBbGwgYW50aS1hbGlhc2luZyBmaWx0ZXJzIGluIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIGJhc2VkIG9uCisgICBvbmUgb2YgdHdvIHdpbmRvdyBmdW5jdGlvbnM6CisgIFRoZSA2LXRhcCBMYW5jem9zIHdpbmRvdyAoZm9yIGRvd24tc2FtcGxpbmcgYW5kIHNoaWZ0cyk6CisgICBzaW5jKFxwaSp0KSpzaW5jKFxwaSp0LzMpLCB8dHw8MyAgKHNpbmModCk9PXNpbih0KS90KQorICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgfHR8Pj0zCisgIFRoZSA0LXRhcCBNaXRjaGVsbCB3aW5kb3cgKGZvciB1cC1zYW1wbGluZyk6CisgICA3fHR8XjMtMTJ8dHxeMisxNi8zLCAgICAgICAgICAgICB8dHw8MQorICAgLSg3LzMpfHh8XjMrMTJ8eHxeMi0yMHx4fCszMi8zLCAgfHR8PDIKKyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx0fD49MgorICBUaGUgbnVtYmVyIG9mIHRhcHMgaXMgaW50ZW50aW9uYWxseSBrZXB0IHNtYWxsIHRvIHJlZHVjZSBjb21wdXRhdGlvbmFsCisgICBvdmVyaGVhZCBhbmQgbGltaXQgcmluZ2luZy4KKworICBUaGUgdGFwcyBmcm9tIHRoZXNlIGZpbHRlcnMgYXJlIHNjYWxlZCBzbyB0aGF0IHRoZWlyIHN1bSBpcyAxLCBhbmQgdGhlIHJlc3VsdAorICAgaXMgc2NhbGVkIGJ5IDEyOCBhbmQgcm91bmRlZCB0byBpbnRlZ2VycyB0byBjcmVhdGUgYSBmaWx0ZXIgd2hvc2UKKyAgIGludGVybWVkaWF0ZSB2YWx1ZXMgZml0IGluc2lkZSAxNiBiaXRzLgorICBDb2VmZmljaWVudHMgYXJlIHJvdW5kZWQgaW4gc3VjaCBhIHdheSBhcyB0byBlbnN1cmUgdGhlaXIgc3VtIGlzIHN0aWxsIDEyOCwKKyAgIHdoaWNoIGlzIHVzdWFsbHkgZXF1aXZhbGVudCB0byBub3JtYWwgcm91bmRpbmcuCisKKyAgQ29udmVyc2lvbnMgd2hpY2ggcmVxdWlyZSBib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGZpbHRlcmluZyBjb3VsZAorICAgaGF2ZSB0aGVzZSBzdGVwcyBwaXBlbGluZWQsIGZvciBsZXNzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgYmV0dGVyIGNhY2hlCisgICBwZXJmb3JtYW5jZSwgYnV0IHdlIGRvIHRoZW0gc2VwYXJhdGVseSBmb3Igc2ltcGxpY2l0eS4qLworCisjZGVmaW5lIE9DX01JTkkoX2EsX2IpICAgICAgKChfYSk+KF9iKT8oX2IpOihfYSkpCisjZGVmaW5lIE9DX01BWEkoX2EsX2IpICAgICAgKChfYSk8KF9iKT8oX2IpOihfYSkpCisjZGVmaW5lIE9DX0NMQU1QSShfYSxfYixfYykgKE9DX01BWEkoX2EsT0NfTUlOSShfYixfYykpKQorCisvKjQyMGpwZWcgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisKKyAgNDIwbXBlZzIgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgQlIgICAgICB8ICAgICAgIEJSICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgQlIgICAgICB8ICAgICAgIEJSICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisKKyAgV2UgdXNlIGEgcmVzYW1wbGluZyBmaWx0ZXIgdG8gc2hpZnQgdGhlIHNpdGUgbG9jYXRpb25zIG9uZSBxdWFydGVyIHBpeGVsIChhdAorICAgdGhlIGNocm9tYSBwbGFuZSdzIHJlc29sdXRpb24pIHRvIHRoZSByaWdodC4KKyAgVGhlIDQ6MjoyIG1vZGVzIGxvb2sgZXhhY3RseSB0aGUgc2FtZSwgZXhjZXB0IHRoZXJlIGFyZSB0d2ljZSBhcyBtYW55IGNocm9tYQorICAgbGluZXMsIGFuZCB0aGV5IGFyZSB2ZXJ0aWNhbGx5IGNvLXNpdGVkIHdpdGggdGhlIGx1bWEgc2FtcGxlcyBpbiBib3RoIHRoZQorICAgbXBlZzIgYW5kIGpwZWcgY2FzZXMgKHRodXMgcmVxdWlyaW5nIG5vIHZlcnRpY2FsIHJlc2FtcGxpbmcpLiovCitzdGF0aWMgdm9pZCB5NG1fNDJ4bXBlZzJfNDJ4anBlZ19oZWxwZXIodW5zaWduZWQgY2hhciAqX2RzdCwKKyBjb25zdCB1bnNpZ25lZCBjaGFyICpfc3JjLGludCBfY193LGludCBfY19oKXsKKyAgaW50IHk7CisgIGludCB4OworICBmb3IoeT0wO3k8X2NfaDt5KyspeworICAgIC8qRmlsdGVyOiBbNCAtMTcgMTE0IDM1IC05IDFdLzEyOCwgZGVyaXZlZCBmcm9tIGEgNi10YXAgTGFuY3pvcworICAgICAgIHdpbmRvdy4qLworICAgIGZvcih4PTA7eDxPQ19NSU5JKF9jX3csMik7eCsrKXsKKyAgICAgIF9kc3RbeF09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKDQqX3NyY1swXS0xNypfc3JjW09DX01BWEkoeC0xLDApXSsKKyAgICAgICAxMTQqX3NyY1t4XSszNSpfc3JjW09DX01JTkkoeCsxLF9jX3ctMSldLTkqX3NyY1tPQ19NSU5JKHgrMixfY193LTEpXSsKKyAgICAgICBfc3JjW09DX01JTkkoeCszLF9jX3ctMSldKzY0KT4+NywyNTUpOworICAgIH0KKyAgICBmb3IoO3g8X2Nfdy0zO3grKyl7CisgICAgICBfZHN0W3hdPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCg0Kl9zcmNbeC0yXS0xNypfc3JjW3gtMV0rCisgICAgICAgMTE0Kl9zcmNbeF0rMzUqX3NyY1t4KzFdLTkqX3NyY1t4KzJdK19zcmNbeCszXSs2NCk+PjcsMjU1KTsKKyAgICB9CisgICAgZm9yKDt4PF9jX3c7eCsrKXsKKyAgICAgIF9kc3RbeF09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKDQqX3NyY1t4LTJdLTE3Kl9zcmNbeC0xXSsKKyAgICAgICAxMTQqX3NyY1t4XSszNSpfc3JjW09DX01JTkkoeCsxLF9jX3ctMSldLTkqX3NyY1tPQ19NSU5JKHgrMixfY193LTEpXSsKKyAgICAgICBfc3JjW19jX3ctMV0rNjQpPj43LDI1NSk7CisgICAgfQorICAgIF9kc3QrPV9jX3c7CisgICAgX3NyYys9X2NfdzsKKyAgfQorfQorCisvKkhhbmRsZXMgYm90aCA0MjIgYW5kIDQyMG1wZWcyIHRvIDQyMmpwZWcgYW5kIDQyMGpwZWcsIHJlc3BlY3RpdmVseS4qLworc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfNDJ4bXBlZzJfNDJ4anBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKKyB1bnNpZ25lZCBjaGFyICpfYXV4KXsKKyAgaW50IGNfdzsKKyAgaW50IGNfaDsKKyAgaW50IGNfc3o7CisgIGludCBwbGk7CisgIC8qU2tpcCBwYXN0IHRoZSBsdW1hIGRhdGEuKi8KKyAgX2RzdCs9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7CisgIC8qQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGNocm9tYSBwbGFuZS4qLworICBjX3c9KF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oOworICBjX2g9KF95NG0tPnBpY19oK195NG0tPmRzdF9jX2RlY192LTEpL195NG0tPmRzdF9jX2RlY192OworICBjX3N6PWNfdypjX2g7CisgIGZvcihwbGk9MTtwbGk8MztwbGkrKyl7CisgICAgeTRtXzQyeG1wZWcyXzQyeGpwZWdfaGVscGVyKF9kc3QsX2F1eCxjX3csY19oKTsKKyAgICBfZHN0Kz1jX3N6OworICAgIF9hdXgrPWNfc3o7CisgIH0KK30KKworLypUaGlzIGZvcm1hdCBpcyBvbmx5IHVzZWQgZm9yIGludGVybGFjZWQgY29udGVudCwgYnV0IGlzIGluY2x1ZGVkIGZvcgorICAgY29tcGxldGVuZXNzLgorCisgIDQyMGpwZWcgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisKKyAgNDIwcGFsZHYgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6CisgIFlSLS0tLS0tWS0tLS0tLS1ZUi0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFlCLS0tLS0tWS0tLS0tLS1ZQi0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFlSLS0tLS0tWS0tLS0tLS1ZUi0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFlCLS0tLS0tWS0tLS0tLS1ZQi0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisKKyAgV2UgdXNlIGEgcmVzYW1wbGluZyBmaWx0ZXIgdG8gc2hpZnQgdGhlIHNpdGUgbG9jYXRpb25zIG9uZSBxdWFydGVyIHBpeGVsIChhdAorICAgdGhlIGNocm9tYSBwbGFuZSdzIHJlc29sdXRpb24pIHRvIHRoZSByaWdodC4KKyAgVGhlbiB3ZSB1c2UgYW5vdGhlciBmaWx0ZXIgdG8gbW92ZSB0aGUgQ19yIGxvY2F0aW9uIGRvd24gb25lIHF1YXJ0ZXIgcGl4ZWwsCisgICBhbmQgdGhlIENfYiBsb2NhdGlvbiB1cCBvbmUgcXVhcnRlciBwaXhlbC4qLworc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfNDJ4cGFsZHZfNDJ4anBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKKyB1bnNpZ25lZCBjaGFyICpfYXV4KXsKKyAgdW5zaWduZWQgY2hhciAqdG1wOworICBpbnQgICAgICAgICAgICBjX3c7CisgIGludCAgICAgICAgICAgIGNfaDsKKyAgaW50ICAgICAgICAgICAgY19zejsKKyAgaW50ICAgICAgICAgICAgcGxpOworICBpbnQgICAgICAgICAgICB5OworICBpbnQgICAgICAgICAgICB4OworICAvKlNraXAgcGFzdCB0aGUgbHVtYSBkYXRhLiovCisgIF9kc3QrPV95NG0tPnBpY193Kl95NG0tPnBpY19oOworICAvKkNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBjaHJvbWEgcGxhbmUuKi8KKyAgY193PShfeTRtLT5waWNfdysxKS8yOworICBjX2g9KF95NG0tPnBpY19oK195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oOworICBjX3N6PWNfdypjX2g7CisgIHRtcD1fYXV4KzIqY19zejsKKyAgZm9yKHBsaT0xO3BsaTwzO3BsaSsrKXsKKyAgICAvKkZpcnN0IGRvIHRoZSBob3Jpem9udGFsIHJlLXNhbXBsaW5nLgorICAgICAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbXBlZzIgY2FzZSwgZXhjZXB0IHRoYXQgYWZ0ZXIgdGhlIGhvcml6b250YWwKKyAgICAgICBjYXNlLCB3ZSBuZWVkIHRvIGFwcGx5IGEgc2Vjb25kIHZlcnRpY2FsIGZpbHRlci4qLworICAgIHk0bV80MnhtcGVnMl80MnhqcGVnX2hlbHBlcih0bXAsX2F1eCxjX3csY19oKTsKKyAgICBfYXV4Kz1jX3N6OworICAgIHN3aXRjaChwbGkpeworICAgICAgY2FzZSAxOnsKKyAgICAgICAgLypTbGlkZSBDX2IgdXAgYSBxdWFydGVyLXBlbC4KKyAgICAgICAgICBUaGlzIGlzIHRoZSBzYW1lIGZpbHRlciB1c2VkIGFib3ZlLCBidXQgaW4gdGhlIG90aGVyIG9yZGVyLiovCisgICAgICAgIGZvcih4PTA7eDxjX3c7eCsrKXsKKyAgICAgICAgICBmb3IoeT0wO3k8T0NfTUlOSShjX2gsMyk7eSsrKXsKKyAgICAgICAgICAgIF9kc3RbeSpjX3ddPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCh0bXBbMF0KKyAgICAgICAgICAgICAtOSp0bXBbT0NfTUFYSSh5LTIsMCkqY193XSszNSp0bXBbT0NfTUFYSSh5LTEsMCkqY193XQorICAgICAgICAgICAgICsxMTQqdG1wW3kqY193XS0xNyp0bXBbT0NfTUlOSSh5KzEsY19oLTEpKmNfd10KKyAgICAgICAgICAgICArNCp0bXBbT0NfTUlOSSh5KzIsY19oLTEpKmNfd10rNjQpPj43LDI1NSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZvcig7eTxjX2gtMjt5KyspeworICAgICAgICAgICAgX2RzdFt5KmNfd109KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKHRtcFsoeS0zKSpjX3ddCisgICAgICAgICAgICAgLTkqdG1wWyh5LTIpKmNfd10rMzUqdG1wWyh5LTEpKmNfd10rMTE0KnRtcFt5KmNfd10KKyAgICAgICAgICAgICAtMTcqdG1wWyh5KzEpKmNfd10rNCp0bXBbKHkrMikqY193XSs2NCk+PjcsMjU1KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yKDt5PGNfaDt5KyspeworICAgICAgICAgICAgX2RzdFt5KmNfd109KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKHRtcFsoeS0zKSpjX3ddCisgICAgICAgICAgICAgLTkqdG1wWyh5LTIpKmNfd10rMzUqdG1wWyh5LTEpKmNfd10rMTE0KnRtcFt5KmNfd10KKyAgICAgICAgICAgICAtMTcqdG1wW09DX01JTkkoeSsxLGNfaC0xKSpjX3ddKzQqdG1wWyhjX2gtMSkqY193XSs2NCk+PjcsMjU1KTsKKyAgICAgICAgICB9CisgICAgICAgICAgX2RzdCsrOworICAgICAgICAgIHRtcCsrOworICAgICAgICB9CisgICAgICAgIF9kc3QrPWNfc3otY193OworICAgICAgICB0bXAtPWNfdzsKKyAgICAgIH1icmVhazsKKyAgICAgIGNhc2UgMjp7CisgICAgICAgIC8qU2xpZGUgQ19yIGRvd24gYSBxdWFydGVyLXBlbC4KKyAgICAgICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBob3Jpem9udGFsIGZpbHRlci4qLworICAgICAgICBmb3IoeD0wO3g8Y193O3grKyl7CisgICAgICAgICAgZm9yKHk9MDt5PE9DX01JTkkoY19oLDIpO3krKyl7CisgICAgICAgICAgICBfZHN0W3kqY193XT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoNCp0bXBbMF0KKyAgICAgICAgICAgICAtMTcqdG1wW09DX01BWEkoeS0xLDApKmNfd10rMTE0KnRtcFt5KmNfd10KKyAgICAgICAgICAgICArMzUqdG1wW09DX01JTkkoeSsxLGNfaC0xKSpjX3ddLTkqdG1wW09DX01JTkkoeSsyLGNfaC0xKSpjX3ddCisgICAgICAgICAgICAgK3RtcFtPQ19NSU5JKHkrMyxjX2gtMSkqY193XSs2NCk+PjcsMjU1KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yKDt5PGNfaC0zO3krKyl7CisgICAgICAgICAgICBfZHN0W3kqY193XT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoNCp0bXBbKHktMikqY193XQorICAgICAgICAgICAgIC0xNyp0bXBbKHktMSkqY193XSsxMTQqdG1wW3kqY193XSszNSp0bXBbKHkrMSkqY193XQorICAgICAgICAgICAgIC05KnRtcFsoeSsyKSpjX3ddK3RtcFsoeSszKSpjX3ddKzY0KT4+NywyNTUpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IoO3k8Y19oO3krKyl7CisgICAgICAgICAgICBfZHN0W3kqY193XT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoNCp0bXBbKHktMikqY193XQorICAgICAgICAgICAgIC0xNyp0bXBbKHktMSkqY193XSsxMTQqdG1wW3kqY193XSszNSp0bXBbT0NfTUlOSSh5KzEsY19oLTEpKmNfd10KKyAgICAgICAgICAgICAtOSp0bXBbT0NfTUlOSSh5KzIsY19oLTEpKmNfd10rdG1wWyhjX2gtMSkqY193XSs2NCk+PjcsMjU1KTsKKyAgICAgICAgICB9CisgICAgICAgICAgX2RzdCsrOworICAgICAgICAgIHRtcCsrOworICAgICAgICB9CisgICAgICB9YnJlYWs7CisgICAgfQorICAgIC8qRm9yIGFjdHVhbCBpbnRlcmxhY2VkIG1hdGVyaWFsLCB0aGlzIHdvdWxkIGhhdmUgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5IG9uCisgICAgICAgZWFjaCBmaWVsZCwgYW5kIHRoZSBzaGlmdCBhbW91bnRzIHdvdWxkIGJlIGRpZmZlcmVudC4KKyAgICAgIENfciBtb3ZlcyBkb3duIDEvOCwgQ19iIHVwIDMvOCBpbiB0aGUgdG9wIGZpZWxkLCBhbmQgQ19yIG1vdmVzIGRvd24gMy84LAorICAgICAgIENfYiB1cCAxLzggaW4gdGhlIGJvdHRvbSBmaWVsZC4KKyAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGZpbHRlcnMgd291bGQgYmU6CisgICAgICAgRG93biAxLzggKHJldmVyc2Ugb3JkZXIgZm9yIHVwKTogWzMgLTExIDEyNSAxNSAtNCAwXS8xMjgKKyAgICAgICBEb3duIDMvOCAocmV2ZXJzZSBvcmRlciBmb3IgdXApOiBbNCAtMTkgOTggNTYgLTEzIDJdLzEyOCovCisgIH0KK30KKworLypQZXJmb3JtIHZlcnRpY2FsIGZpbHRlcmluZyB0byByZWR1Y2UgYSBzaW5nbGUgcGxhbmUgZnJvbSA0OjI6MiB0byA0OjI6MC4KKyAgVGhpcyBpcyB1c2VkIGFzIGEgaGVscGVyIGJ5IHNldmVyYWwgY29udmVyYXRpb24gcm91dGluZXMuKi8KK3N0YXRpYyB2b2lkIHk0bV80MjJqcGVnXzQyMGpwZWdfaGVscGVyKHVuc2lnbmVkIGNoYXIgKl9kc3QsCisgY29uc3QgdW5zaWduZWQgY2hhciAqX3NyYyxpbnQgX2NfdyxpbnQgX2NfaCl7CisgIGludCB5OworICBpbnQgeDsKKyAgLypGaWx0ZXI6IFszIC0xNyA3OCA3OCAtMTcgM10vMTI4LCBkZXJpdmVkIGZyb20gYSA2LXRhcCBMYW5jem9zIHdpbmRvdy4qLworICBmb3IoeD0wO3g8X2Nfdzt4KyspeworICAgIGZvcih5PTA7eTxPQ19NSU5JKF9jX2gsMik7eSs9Mil7CisgICAgICBfZHN0Wyh5Pj4xKSpfY193XT1PQ19DTEFNUEkoMCwoNjQqX3NyY1swXQorICAgICAgICs3OCpfc3JjW09DX01JTkkoMSxfY19oLTEpKl9jX3ddCisgICAgICAgLTE3Kl9zcmNbT0NfTUlOSSgyLF9jX2gtMSkqX2Nfd10KKyAgICAgICArMypfc3JjW09DX01JTkkoMyxfY19oLTEpKl9jX3ddKzY0KT4+NywyNTUpOworICAgIH0KKyAgICBmb3IoO3k8X2NfaC0zO3krPTIpeworICAgICAgX2RzdFsoeT4+MSkqX2Nfd109T0NfQ0xBTVBJKDAsKDMqKF9zcmNbKHktMikqX2Nfd10rX3NyY1soeSszKSpfY193XSkKKyAgICAgICAtMTcqKF9zcmNbKHktMSkqX2Nfd10rX3NyY1soeSsyKSpfY193XSkKKyAgICAgICArNzgqKF9zcmNbeSpfY193XStfc3JjWyh5KzEpKl9jX3ddKSs2NCk+PjcsMjU1KTsKKyAgICB9CisgICAgZm9yKDt5PF9jX2g7eSs9Mil7CisgICAgICBfZHN0Wyh5Pj4xKSpfY193XT1PQ19DTEFNUEkoMCwoMyooX3NyY1soeS0yKSpfY193XQorICAgICAgICtfc3JjWyhfY19oLTEpKl9jX3ddKS0xNyooX3NyY1soeS0xKSpfY193XQorICAgICAgICtfc3JjW09DX01JTkkoeSsyLF9jX2gtMSkqX2Nfd10pCisgICAgICAgKzc4Kihfc3JjW3kqX2Nfd10rX3NyY1tPQ19NSU5JKHkrMSxfY19oLTEpKl9jX3ddKSs2NCk+PjcsMjU1KTsKKyAgICB9CisgICAgX3NyYysrOworICAgIF9kc3QrKzsKKyAgfQorfQorCisvKjQyMGpwZWcgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisKKyAgNDIyanBlZyBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKKyAgWS0tLUJSLS1ZLS0tLS0tLVktLS1CUi0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWS0tLUJSLS1ZLS0tLS0tLVktLS1CUi0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWS0tLUJSLS1ZLS0tLS0tLVktLS1CUi0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWS0tLUJSLS1ZLS0tLS0tLVktLS1CUi0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKworICBXZSB1c2UgYSByZXNhbXBsaW5nIGZpbHRlciB0byBkZWNpbWF0ZSB0aGUgY2hyb21hIHBsYW5lcyBieSB0d28gaW4gdGhlCisgICB2ZXJ0aWNhbCBkaXJlY3Rpb24uKi8KK3N0YXRpYyB2b2lkIHk0bV9jb252ZXJ0XzQyMmpwZWdfNDIwanBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKKyB1bnNpZ25lZCBjaGFyICpfYXV4KXsKKyAgaW50IGNfdzsKKyAgaW50IGNfaDsKKyAgaW50IGNfc3o7CisgIGludCBkc3RfY193OworICBpbnQgZHN0X2NfaDsKKyAgaW50IGRzdF9jX3N6OworICBpbnQgcGxpOworICAvKlNraXAgcGFzdCB0aGUgbHVtYSBkYXRhLiovCisgIF9kc3QrPV95NG0tPnBpY193Kl95NG0tPnBpY19oOworICAvKkNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBjaHJvbWEgcGxhbmUuKi8KKyAgY193PShfeTRtLT5waWNfdytfeTRtLT5zcmNfY19kZWNfaC0xKS9feTRtLT5zcmNfY19kZWNfaDsKKyAgY19oPV95NG0tPnBpY19oOworICBkc3RfY193PShfeTRtLT5waWNfdytfeTRtLT5kc3RfY19kZWNfaC0xKS9feTRtLT5kc3RfY19kZWNfaDsKKyAgZHN0X2NfaD0oX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3Y7CisgIGNfc3o9Y193KmNfaDsKKyAgZHN0X2Nfc3o9ZHN0X2Nfdypkc3RfY19oOworICBmb3IocGxpPTE7cGxpPDM7cGxpKyspeworICAgIHk0bV80MjJqcGVnXzQyMGpwZWdfaGVscGVyKF9kc3QsX2F1eCxjX3csY19oKTsKKyAgICBfYXV4Kz1jX3N6OworICAgIF9kc3QrPWRzdF9jX3N6OworICB9Cit9CisKKy8qNDIwanBlZyBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKKyAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgQlIgIHwgICAgICAgfCAgIEJSICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgQlIgIHwgICAgICAgfCAgIEJSICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKworICA0MjIgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6CisgIFlCUi0tLS0tWS0tLS0tLS1ZQlItLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFlCUi0tLS0tWS0tLS0tLS1ZQlItLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFlCUi0tLS0tWS0tLS0tLS1ZQlItLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIFlCUi0tLS0tWS0tLS0tLS1ZQlItLS0tLVktLS0tLS0tCisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisKKyAgV2UgdXNlIGEgcmVzYW1wbGluZyBmaWx0ZXIgdG8gc2hpZnQgdGhlIG9yaWdpbmFsIHNpdGUgbG9jYXRpb25zIG9uZSBxdWFydGVyCisgICBwaXhlbCAoYXQgdGhlIG9yaWdpbmFsIGNocm9tYSByZXNvbHV0aW9uKSB0byB0aGUgcmlnaHQuCisgIFRoZW4gd2UgdXNlIGEgc2Vjb25kIHJlc2FtcGxpbmcgZmlsdGVyIHRvIGRlY2ltYXRlIHRoZSBjaHJvbWEgcGxhbmVzIGJ5IHR3bworICAgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbi4qLworc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfNDIyXzQyMGpwZWcoeTRtX2lucHV0ICpfeTRtLHVuc2lnbmVkIGNoYXIgKl9kc3QsCisgdW5zaWduZWQgY2hhciAqX2F1eCl7CisgIHVuc2lnbmVkIGNoYXIgKnRtcDsKKyAgaW50ICAgICAgICAgICAgY193OworICBpbnQgICAgICAgICAgICBjX2g7CisgIGludCAgICAgICAgICAgIGNfc3o7CisgIGludCAgICAgICAgICAgIGRzdF9jX2g7CisgIGludCAgICAgICAgICAgIGRzdF9jX3N6OworICBpbnQgICAgICAgICAgICBwbGk7CisgIC8qU2tpcCBwYXN0IHRoZSBsdW1hIGRhdGEuKi8KKyAgX2RzdCs9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7CisgIC8qQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGNocm9tYSBwbGFuZS4qLworICBjX3c9KF95NG0tPnBpY193K195NG0tPnNyY19jX2RlY19oLTEpL195NG0tPnNyY19jX2RlY19oOworICBjX2g9X3k0bS0+cGljX2g7CisgIGRzdF9jX2g9KF95NG0tPnBpY19oK195NG0tPmRzdF9jX2RlY192LTEpL195NG0tPmRzdF9jX2RlY192OworICBjX3N6PWNfdypjX2g7CisgIGRzdF9jX3N6PWNfdypkc3RfY19oOworICB0bXA9X2F1eCsyKmNfc3o7CisgIGZvcihwbGk9MTtwbGk8MztwbGkrKyl7CisgICAgLypJbiByZWFsaXR5LCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3RlcHMgY291bGQgYmUgcGlwZWxpbmVkLCBmb3IKKyAgICAgICBsZXNzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgYmV0dGVyIGNhY2hlIHBlcmZvcm1hbmNlLCBidXQgd2UgZG8gdGhlbQorICAgICAgIHNlcGFyYXRlbHkgZm9yIHNpbXBsaWNpdHkuKi8KKyAgICAvKkZpcnN0IGRvIGhvcml6b250YWwgZmlsdGVyaW5nIChjb252ZXJ0IHRvIDQyMmpwZWcpKi8KKyAgICB5NG1fNDJ4bXBlZzJfNDJ4anBlZ19oZWxwZXIodG1wLF9hdXgsY193LGNfaCk7CisgICAgLypOb3cgZG8gdGhlIHZlcnRpY2FsIGZpbHRlcmluZy4qLworICAgIHk0bV80MjJqcGVnXzQyMGpwZWdfaGVscGVyKF9kc3QsdG1wLGNfdyxjX2gpOworICAgIF9hdXgrPWNfc3o7CisgICAgX2RzdCs9ZHN0X2Nfc3o7CisgIH0KK30KKworLyo0MjBqcGVnIGNocm9tYSBzYW1wbGVzIGFyZSBzaXRlZCBsaWtlOgorICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICBCUiAgfCAgICAgICB8ICAgQlIgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICBCUiAgfCAgICAgICB8ICAgQlIgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCisgIDQxMSBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKKyAgWUJSLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWUJSLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWUJSLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgWUJSLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KKyAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKKworICBXZSB1c2UgYSBmaWx0ZXIgdG8gcmVzYW1wbGUgYXQgc2l0ZSBsb2NhdGlvbnMgb25lIGVpZ2h0aCBwaXhlbCAoYXQgdGhlIHNvdXJjZQorICAgY2hyb21hIHBsYW5lJ3MgaG9yaXpvbnRhbCByZXNvbHV0aW9uKSBhbmQgZml2ZSBlaWdodGhzIG9mIGEgcGl4ZWwgdG8gdGhlCisgICByaWdodC4KKyAgVGhlbiB3ZSB1c2UgYW5vdGhlciBmaWx0ZXIgdG8gZGVjaW1hdGUgdGhlIHBsYW5lcyBieSAyIGluIHRoZSB2ZXJ0aWNhbAorICAgZGlyZWN0aW9uLiovCitzdGF0aWMgdm9pZCB5NG1fY29udmVydF80MTFfNDIwanBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKKyB1bnNpZ25lZCBjaGFyICpfYXV4KXsKKyAgdW5zaWduZWQgY2hhciAqdG1wOworICBpbnQgICAgICAgICAgICBjX3c7CisgIGludCAgICAgICAgICAgIGNfaDsKKyAgaW50ICAgICAgICAgICAgY19zejsKKyAgaW50ICAgICAgICAgICAgZHN0X2NfdzsKKyAgaW50ICAgICAgICAgICAgZHN0X2NfaDsKKyAgaW50ICAgICAgICAgICAgZHN0X2Nfc3o7CisgIGludCAgICAgICAgICAgIHRtcF9zejsKKyAgaW50ICAgICAgICAgICAgcGxpOworICBpbnQgICAgICAgICAgICB5OworICBpbnQgICAgICAgICAgICB4OworICAvKlNraXAgcGFzdCB0aGUgbHVtYSBkYXRhLiovCisgIF9kc3QrPV95NG0tPnBpY193Kl95NG0tPnBpY19oOworICAvKkNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBjaHJvbWEgcGxhbmUuKi8KKyAgY193PShfeTRtLT5waWNfdytfeTRtLT5zcmNfY19kZWNfaC0xKS9feTRtLT5zcmNfY19kZWNfaDsKKyAgY19oPV95NG0tPnBpY19oOworICBkc3RfY193PShfeTRtLT5waWNfdytfeTRtLT5kc3RfY19kZWNfaC0xKS9feTRtLT5kc3RfY19kZWNfaDsKKyAgZHN0X2NfaD0oX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3Y7CisgIGNfc3o9Y193KmNfaDsKKyAgZHN0X2Nfc3o9ZHN0X2Nfdypkc3RfY19oOworICB0bXBfc3o9ZHN0X2NfdypjX2g7CisgIHRtcD1fYXV4KzIqY19zejsKKyAgZm9yKHBsaT0xO3BsaTwzO3BsaSsrKXsKKyAgICAvKkluIHJlYWxpdHksIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzdGVwcyBjb3VsZCBiZSBwaXBlbGluZWQsIGZvcgorICAgICAgIGxlc3MgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBiZXR0ZXIgY2FjaGUgcGVyZm9ybWFuY2UsIGJ1dCB3ZSBkbyB0aGVtCisgICAgICAgc2VwYXJhdGVseSBmb3Igc2ltcGxpY2l0eS4qLworICAgIC8qRmlyc3QgZG8gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgKGNvbnZlcnQgdG8gNDIyanBlZykqLworICAgIGZvcih5PTA7eTxjX2g7eSsrKXsKKyAgICAgIC8qRmlsdGVyczogWzEgMTEwIDE4IC0xXS8xMjggYW5kIFstMyA1MCA4NiAtNV0vMTI4LCBib3RoIGRlcml2ZWQgZnJvbSBhCisgICAgICAgICA0LXRhcCBNaXRjaGVsbCB3aW5kb3cuKi8KKyAgICAgIGZvcih4PTA7eDxPQ19NSU5JKGNfdywxKTt4KyspeworICAgICAgICB0bXBbeDw8MV09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKDExMSpfYXV4WzBdCisgICAgICAgICArMTgqX2F1eFtPQ19NSU5JKDEsY193LTEpXS1fYXV4W09DX01JTkkoMixjX3ctMSldKzY0KT4+NywyNTUpOworICAgICAgICB0bXBbeDw8MXwxXT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoNDcqX2F1eFswXQorICAgICAgICAgKzg2Kl9hdXhbT0NfTUlOSSgxLGNfdy0xKV0tNSpfYXV4W09DX01JTkkoMixjX3ctMSldKzY0KT4+NywyNTUpOworICAgICAgfQorICAgICAgZm9yKDt4PGNfdy0yO3grKyl7CisgICAgICAgIHRtcFt4PDwxXT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoX2F1eFt4LTFdKzExMCpfYXV4W3hdCisgICAgICAgICArMTgqX2F1eFt4KzFdLV9hdXhbeCsyXSs2NCk+PjcsMjU1KTsKKyAgICAgICAgdG1wW3g8PDF8MV09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKC0zKl9hdXhbeC0xXSs1MCpfYXV4W3hdCisgICAgICAgICArODYqX2F1eFt4KzFdLTUqX2F1eFt4KzJdKzY0KT4+NywyNTUpOworICAgICAgfQorICAgICAgZm9yKDt4PGNfdzt4KyspeworICAgICAgICB0bXBbeDw8MV09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKF9hdXhbeC0xXSsxMTAqX2F1eFt4XQorICAgICAgICAgKzE4Kl9hdXhbT0NfTUlOSSh4KzEsY193LTEpXS1fYXV4W2Nfdy0xXSs2NCk+PjcsMjU1KTsKKyAgICAgICAgaWYoKHg8PDF8MSk8ZHN0X2Nfdyl7CisgICAgICAgICAgdG1wW3g8PDF8MV09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKC0zKl9hdXhbeC0xXSs1MCpfYXV4W3hdCisgICAgICAgICAgICs4NipfYXV4W09DX01JTkkoeCsxLGNfdy0xKV0tNSpfYXV4W2Nfdy0xXSs2NCk+PjcsMjU1KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG1wKz1kc3RfY193OworICAgICAgX2F1eCs9Y193OworICAgIH0KKyAgICB0bXAtPXRtcF9zejsKKyAgICAvKk5vdyBkbyB0aGUgdmVydGljYWwgZmlsdGVyaW5nLiovCisgICAgeTRtXzQyMmpwZWdfNDIwanBlZ19oZWxwZXIoX2RzdCx0bXAsZHN0X2NfdyxjX2gpOworICAgIF9kc3QrPWRzdF9jX3N6OworICB9Cit9CisKKy8qQ29udmVydCA0NDQgdG8gNDIwanBlZy4qLworc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfNDQ0XzQyMGpwZWcoeTRtX2lucHV0ICpfeTRtLHVuc2lnbmVkIGNoYXIgKl9kc3QsCisgdW5zaWduZWQgY2hhciAqX2F1eCl7CisgIHVuc2lnbmVkIGNoYXIgKnRtcDsKKyAgaW50ICAgICAgICAgICAgY193OworICBpbnQgICAgICAgICAgICBjX2g7CisgIGludCAgICAgICAgICAgIGNfc3o7CisgIGludCAgICAgICAgICAgIGRzdF9jX3c7CisgIGludCAgICAgICAgICAgIGRzdF9jX2g7CisgIGludCAgICAgICAgICAgIGRzdF9jX3N6OworICBpbnQgICAgICAgICAgICB0bXBfc3o7CisgIGludCAgICAgICAgICAgIHBsaTsKKyAgaW50ICAgICAgICAgICAgeTsKKyAgaW50ICAgICAgICAgICAgeDsKKyAgLypTa2lwIHBhc3QgdGhlIGx1bWEgZGF0YS4qLworICBfZHN0Kz1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKKyAgLypDb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggY2hyb21hIHBsYW5lLiovCisgIGNfdz0oX3k0bS0+cGljX3crX3k0bS0+c3JjX2NfZGVjX2gtMSkvX3k0bS0+c3JjX2NfZGVjX2g7CisgIGNfaD1feTRtLT5waWNfaDsKKyAgZHN0X2Nfdz0oX3k0bS0+cGljX3crX3k0bS0+ZHN0X2NfZGVjX2gtMSkvX3k0bS0+ZHN0X2NfZGVjX2g7CisgIGRzdF9jX2g9KF95NG0tPnBpY19oK195NG0tPmRzdF9jX2RlY192LTEpL195NG0tPmRzdF9jX2RlY192OworICBjX3N6PWNfdypjX2g7CisgIGRzdF9jX3N6PWRzdF9jX3cqZHN0X2NfaDsKKyAgdG1wX3N6PWRzdF9jX3cqY19oOworICB0bXA9X2F1eCsyKmNfc3o7CisgIGZvcihwbGk9MTtwbGk8MztwbGkrKyl7CisgICAgLypGaWx0ZXI6IFszIC0xNyA3OCA3OCAtMTcgM10vMTI4LCBkZXJpdmVkIGZyb20gYSA2LXRhcCBMYW5jem9zIHdpbmRvdy4qLworICAgIGZvcih5PTA7eTxjX2g7eSsrKXsKKyAgICAgIGZvcih4PTA7eDxPQ19NSU5JKGNfdywyKTt4Kz0yKXsKKyAgICAgICAgdG1wW3g+PjFdPU9DX0NMQU1QSSgwLCg2NCpfYXV4WzBdKzc4Kl9hdXhbT0NfTUlOSSgxLGNfdy0xKV0KKyAgICAgICAgIC0xNypfYXV4W09DX01JTkkoMixjX3ctMSldCisgICAgICAgICArMypfYXV4W09DX01JTkkoMyxjX3ctMSldKzY0KT4+NywyNTUpOworICAgICAgfQorICAgICAgZm9yKDt4PGNfdy0zO3grPTIpeworICAgICAgICB0bXBbeD4+MV09T0NfQ0xBTVBJKDAsKDMqKF9hdXhbeC0yXStfYXV4W3grM10pCisgICAgICAgICAtMTcqKF9hdXhbeC0xXStfYXV4W3grMl0pKzc4KihfYXV4W3hdK19hdXhbeCsxXSkrNjQpPj43LDI1NSk7CisgICAgICB9CisgICAgICBmb3IoO3g8Y193O3grPTIpeworICAgICAgICB0bXBbeD4+MV09T0NfQ0xBTVBJKDAsKDMqKF9hdXhbeC0yXStfYXV4W2Nfdy0xXSktCisgICAgICAgICAxNyooX2F1eFt4LTFdK19hdXhbT0NfTUlOSSh4KzIsY193LTEpXSkrCisgICAgICAgICA3OCooX2F1eFt4XStfYXV4W09DX01JTkkoeCsxLGNfdy0xKV0pKzY0KT4+NywyNTUpOworICAgICAgfQorICAgICAgdG1wKz1kc3RfY193OworICAgICAgX2F1eCs9Y193OworICAgIH0KKyAgICB0bXAtPXRtcF9zejsKKyAgICAvKk5vdyBkbyB0aGUgdmVydGljYWwgZmlsdGVyaW5nLiovCisgICAgeTRtXzQyMmpwZWdfNDIwanBlZ19oZWxwZXIoX2RzdCx0bXAsZHN0X2NfdyxjX2gpOworICAgIF9kc3QrPWRzdF9jX3N6OworICB9Cit9CisKKy8qVGhlIGltYWdlIGlzIHBhZGRlZCB3aXRoIGVtcHR5IGNocm9tYSBjb21wb25lbnRzIGF0IDQ6MjowLiovCitzdGF0aWMgdm9pZCB5NG1fY29udmVydF9tb25vXzQyMGpwZWcoeTRtX2lucHV0ICpfeTRtLHVuc2lnbmVkIGNoYXIgKl9kc3QsCisgdW5zaWduZWQgY2hhciAqX2F1eCl7CisgIGludCBjX3N6OworICBfZHN0Kz1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKKyAgY19zej0oKF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oKSoKKyAgICgoX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3YpOworICBtZW1zZXQoX2RzdCwxMjgsY19zeioyKTsKK30KKworLypObyBjb252ZXJzaW9uIGZ1bmN0aW9uIG5lZWRlZC4qLworc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfbnVsbCh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKKyB1bnNpZ25lZCBjaGFyICpfYXV4KXsKK30KKworaW50IHk0bV9pbnB1dF9vcGVuKHk0bV9pbnB1dCAqX3k0bSxGSUxFICpfZmluLGNoYXIgKl9za2lwLGludCBfbnNraXApeworICBjaGFyIGJ1ZmZlcls4MF07CisgIGludCAgcmV0OworICBpbnQgIGk7CisgIC8qUmVhZCB1bnRpbCBuZXdsaW5lLCBvciA4MCBjb2xzLCB3aGljaGV2ZXIgaGFwcGVucyBmaXJzdC4qLworICBmb3IoaT0wO2k8Nzk7aSsrKXsKKyAgICBpZihfbnNraXA+MCl7CisgICAgICBidWZmZXJbaV09Kl9za2lwKys7CisgICAgICBfbnNraXAtLTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHJldD0oaW50KWZyZWFkKGJ1ZmZlcitpLDEsMSxfZmluKTsKKyAgICAgIGlmKHJldDwxKXJldHVybiAtMTsKKyAgICB9CisgICAgaWYoYnVmZmVyW2ldPT0nXG4nKWJyZWFrOworICB9CisgIC8qV2Ugc2tpcHBlZCB0b28gbXVjaCBoZWFkZXIgZGF0YS4qLworICBpZihfbnNraXA+MClyZXR1cm4gLTE7CisgIGlmKGk9PTc5KXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgcGFyc2luZyBoZWFkZXI7IG5vdCBhIFlVVjJNUEVHMiBmaWxlP1xuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGJ1ZmZlcltpXT0nXDAnOworICBpZihtZW1jbXAoYnVmZmVyLCJZVVY0TVBFRyIsOCkpeworICAgIGZwcmludGYoc3RkZXJyLCJJbmNvbXBsZXRlIG1hZ2ljIGZvciBZVVY0TVBFRyBmaWxlLlxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmKGJ1ZmZlcls4XSE9JzInKXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiSW5jb3JyZWN0IFlVViBpbnB1dCBmaWxlIHZlcnNpb247IFlVVjRNUEVHMiByZXF1aXJlZC5cbiIpOworICB9CisgIHJldD15NG1fcGFyc2VfdGFncyhfeTRtLGJ1ZmZlcis1KTsKKyAgaWYocmV0PDApeworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBwYXJzaW5nIFlVVjRNUEVHMiBoZWFkZXIuXG4iKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmKF95NG0tPmludGVybGFjZT09Jz8nKXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogSW5wdXQgdmlkZW8gaW50ZXJsYWNpbmcgZm9ybWF0IHVua25vd247ICIKKyAgICAgImFzc3VtaW5nIHByb2dyZXNzaXZlIHNjYW4uXG4iKTsKKyAgfQorICBlbHNlIGlmKF95NG0tPmludGVybGFjZSE9J3AnKXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiSW5wdXQgdmlkZW8gaXMgaW50ZXJsYWNlZDsgIgorICAgICAiT25seSBwcm9ncmVzc2l2ZSBzY2FuIGhhbmRsZWQuXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0MjAiKT09MHx8CisgICBzdHJjbXAoX3k0bS0+Y2hyb21hX3R5cGUsIjQyMGpwZWciKT09MCl7CisgICAgX3k0bS0+c3JjX2NfZGVjX2g9X3k0bS0+ZHN0X2NfZGVjX2g9X3k0bS0+c3JjX2NfZGVjX3Y9X3k0bS0+ZHN0X2NfZGVjX3Y9MjsKKyAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2gKKyAgICAgKzIqKChfeTRtLT5waWNfdysxKS8yKSooKF95NG0tPnBpY19oKzEpLzIpOworICAgIC8qTmF0aXZlbHkgc3VwcG9ydGVkOiBubyBjb252ZXJzaW9uIHJlcXVpcmVkLiovCisgICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3o9MDsKKyAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0X251bGw7CisgIH0KKyAgZWxzZSBpZihzdHJjbXAoX3k0bS0+Y2hyb21hX3R5cGUsIjQyMG1wZWcyIik9PTApeworICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPmRzdF9jX2RlY19oPV95NG0tPnNyY19jX2RlY192PV95NG0tPmRzdF9jX2RlY192PTI7CisgICAgX3k0bS0+ZHN0X2J1Zl9yZWFkX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oOworICAgIC8qQ2hyb21hIGZpbHRlciByZXF1aXJlZDogcmVhZCBpbnRvIHRoZSBhdXggYnVmIGZpcnN0LiovCisgICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3o9CisgICAgIDIqKChfeTRtLT5waWNfdysxKS8yKSooKF95NG0tPnBpY19oKzEpLzIpOworICAgIF95NG0tPmNvbnZlcnQ9eTRtX2NvbnZlcnRfNDJ4bXBlZzJfNDJ4anBlZzsKKyAgfQorICBlbHNlIGlmKHN0cmNtcChfeTRtLT5jaHJvbWFfdHlwZSwiNDIwcGFsZHYiKT09MCl7CisgICAgX3k0bS0+c3JjX2NfZGVjX2g9X3k0bS0+ZHN0X2NfZGVjX2g9X3k0bS0+c3JjX2NfZGVjX3Y9X3k0bS0+ZHN0X2NfZGVjX3Y9MjsKKyAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7CisgICAgLypDaHJvbWEgZmlsdGVyIHJlcXVpcmVkOiByZWFkIGludG8gdGhlIGF1eCBidWYgZmlyc3QuCisgICAgICBXZSBuZWVkIHRvIG1ha2UgdHdvIGZpbHRlciBwYXNzZXMsIHNvIHdlIG5lZWQgc29tZSBleHRyYSBzcGFjZSBpbiB0aGUKKyAgICAgICBhdXggYnVmZmVyLiovCisgICAgX3k0bS0+YXV4X2J1Zl9zej0zKigoX3k0bS0+cGljX3crMSkvMikqKChfeTRtLT5waWNfaCsxKS8yKTsKKyAgICBfeTRtLT5hdXhfYnVmX3JlYWRfc3o9MiooKF95NG0tPnBpY193KzEpLzIpKigoX3k0bS0+cGljX2grMSkvMik7CisgICAgX3k0bS0+Y29udmVydD15NG1fY29udmVydF80MnhwYWxkdl80MnhqcGVnOworICB9CisgIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0MjJqcGVnIik9PTApeworICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPmRzdF9jX2RlY19oPTI7CisgICAgX3k0bS0+c3JjX2NfZGVjX3Y9MTsKKyAgICBfeTRtLT5kc3RfY19kZWNfdj0yOworICAgIF95NG0tPmRzdF9idWZfcmVhZF9zej1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKKyAgICAvKkNocm9tYSBmaWx0ZXIgcmVxdWlyZWQ6IHJlYWQgaW50byB0aGUgYXV4IGJ1ZiBmaXJzdC4qLworICAgIF95NG0tPmF1eF9idWZfc3o9X3k0bS0+YXV4X2J1Zl9yZWFkX3N6PTIqKChfeTRtLT5waWNfdysxKS8yKSpfeTRtLT5waWNfaDsKKyAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQyMmpwZWdfNDIwanBlZzsKKyAgfQorICBlbHNlIGlmKHN0cmNtcChfeTRtLT5jaHJvbWFfdHlwZSwiNDIyIik9PTApeworICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPmRzdF9jX2RlY19oPTI7CisgICAgX3k0bS0+c3JjX2NfZGVjX3Y9MTsKKyAgICBfeTRtLT5kc3RfY19kZWNfdj0yOworICAgIF95NG0tPmRzdF9idWZfcmVhZF9zej1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKKyAgICAvKkNocm9tYSBmaWx0ZXIgcmVxdWlyZWQ6IHJlYWQgaW50byB0aGUgYXV4IGJ1ZiBmaXJzdC4KKyAgICAgIFdlIG5lZWQgdG8gbWFrZSB0d28gZmlsdGVyIHBhc3Nlcywgc28gd2UgbmVlZCBzb21lIGV4dHJhIHNwYWNlIGluIHRoZQorICAgICAgIGF1eCBidWZmZXIuKi8KKyAgICBfeTRtLT5hdXhfYnVmX3JlYWRfc3o9MiooKF95NG0tPnBpY193KzEpLzIpKl95NG0tPnBpY19oOworICAgIF95NG0tPmF1eF9idWZfc3o9X3k0bS0+YXV4X2J1Zl9yZWFkX3N6KygoX3k0bS0+cGljX3crMSkvMikqX3k0bS0+cGljX2g7CisgICAgX3k0bS0+Y29udmVydD15NG1fY29udmVydF80MjJfNDIwanBlZzsKKyAgfQorICBlbHNlIGlmKHN0cmNtcChfeTRtLT5jaHJvbWFfdHlwZSwiNDExIik9PTApeworICAgIF95NG0tPnNyY19jX2RlY19oPTQ7CisgICAgX3k0bS0+ZHN0X2NfZGVjX2g9MjsKKyAgICBfeTRtLT5zcmNfY19kZWNfdj0xOworICAgIF95NG0tPmRzdF9jX2RlY192PTI7CisgICAgX3k0bS0+ZHN0X2J1Zl9yZWFkX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oOworICAgIC8qQ2hyb21hIGZpbHRlciByZXF1aXJlZDogcmVhZCBpbnRvIHRoZSBhdXggYnVmIGZpcnN0LgorICAgICAgV2UgbmVlZCB0byBtYWtlIHR3byBmaWx0ZXIgcGFzc2VzLCBzbyB3ZSBuZWVkIHNvbWUgZXh0cmEgc3BhY2UgaW4gdGhlCisgICAgICAgYXV4IGJ1ZmZlci4qLworICAgIF95NG0tPmF1eF9idWZfcmVhZF9zej0yKigoX3k0bS0+cGljX3crMykvNCkqX3k0bS0+cGljX2g7CisgICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3orKChfeTRtLT5waWNfdysxKS8yKSpfeTRtLT5waWNfaDsKKyAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQxMV80MjBqcGVnOworICB9CisgIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0NDQiKT09MCl7CisgICAgX3k0bS0+c3JjX2NfZGVjX2g9MTsKKyAgICBfeTRtLT5kc3RfY19kZWNfaD0yOworICAgIF95NG0tPnNyY19jX2RlY192PTE7CisgICAgX3k0bS0+ZHN0X2NfZGVjX3Y9MjsKKyAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7CisgICAgLypDaHJvbWEgZmlsdGVyIHJlcXVpcmVkOiByZWFkIGludG8gdGhlIGF1eCBidWYgZmlyc3QuCisgICAgICBXZSBuZWVkIHRvIG1ha2UgdHdvIGZpbHRlciBwYXNzZXMsIHNvIHdlIG5lZWQgc29tZSBleHRyYSBzcGFjZSBpbiB0aGUKKyAgICAgICBhdXggYnVmZmVyLiovCisgICAgX3k0bS0+YXV4X2J1Zl9yZWFkX3N6PTIqX3k0bS0+cGljX3cqX3k0bS0+cGljX2g7CisgICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3orKChfeTRtLT5waWNfdysxKS8yKSpfeTRtLT5waWNfaDsKKyAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQ0NF80MjBqcGVnOworICB9CisgIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0NDRhbHBoYSIpPT0wKXsKKyAgICBfeTRtLT5zcmNfY19kZWNfaD0xOworICAgIF95NG0tPmRzdF9jX2RlY19oPTI7CisgICAgX3k0bS0+c3JjX2NfZGVjX3Y9MTsKKyAgICBfeTRtLT5kc3RfY19kZWNfdj0yOworICAgIF95NG0tPmRzdF9idWZfcmVhZF9zej1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKKyAgICAvKkNocm9tYSBmaWx0ZXIgcmVxdWlyZWQ6IHJlYWQgaW50byB0aGUgYXV4IGJ1ZiBmaXJzdC4KKyAgICAgIFdlIG5lZWQgdG8gbWFrZSB0d28gZmlsdGVyIHBhc3Nlcywgc28gd2UgbmVlZCBzb21lIGV4dHJhIHNwYWNlIGluIHRoZQorICAgICAgIGF1eCBidWZmZXIuCisgICAgICBUaGUgZXh0cmEgcGxhbmUgYWxzbyBnZXRzIHJlYWQgaW50byB0aGUgYXV4IGJ1Zi4KKyAgICAgIEl0IHdpbGwgYmUgZGlzY2FyZGVkLiovCisgICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3o9MypfeTRtLT5waWNfdypfeTRtLT5waWNfaDsKKyAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQ0NF80MjBqcGVnOworICB9CisgIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCJtb25vIik9PTApeworICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPnNyY19jX2RlY192PTA7CisgICAgX3k0bS0+ZHN0X2NfZGVjX2g9X3k0bS0+ZHN0X2NfZGVjX3Y9MjsKKyAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7CisgICAgLypObyBleHRyYSBzcGFjZSByZXF1aXJlZCwgYnV0IHdlIG5lZWQgdG8gY2xlYXIgdGhlIGNocm9tYSBwbGFuZXMuKi8KKyAgICBfeTRtLT5hdXhfYnVmX3N6PV95NG0tPmF1eF9idWZfcmVhZF9zej0wOworICAgIF95NG0tPmNvbnZlcnQ9eTRtX2NvbnZlcnRfbW9ub180MjBqcGVnOworICB9CisgIGVsc2V7CisgICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gY2hyb21hIHNhbXBsaW5nIHR5cGU6ICVzXG4iLF95NG0tPmNocm9tYV90eXBlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLypUaGUgc2l6ZSBvZiB0aGUgZmluYWwgZnJhbWUgYnVmZmVycyBpcyBhbHdheXMgY29tcHV0ZWQgZnJvbSB0aGUKKyAgICAgZGVzdGluYXRpb24gY2hyb21hIGRlY2ltYXRpb24gdHlwZS4qLworICBfeTRtLT5kc3RfYnVmX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oCisgICArMiooKF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oKSoKKyAgICgoX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3YpOworICBfeTRtLT5kc3RfYnVmPSh1bnNpZ25lZCBjaGFyICopbWFsbG9jKF95NG0tPmRzdF9idWZfc3opOworICBfeTRtLT5hdXhfYnVmPSh1bnNpZ25lZCBjaGFyICopbWFsbG9jKF95NG0tPmF1eF9idWZfc3opOworICByZXR1cm4gMDsKK30KKwordm9pZCB5NG1faW5wdXRfY2xvc2UoeTRtX2lucHV0ICpfeTRtKXsKKyAgZnJlZShfeTRtLT5kc3RfYnVmKTsKKyAgZnJlZShfeTRtLT5hdXhfYnVmKTsKK30KKworaW50IHk0bV9pbnB1dF9mZXRjaF9mcmFtZSh5NG1faW5wdXQgKl95NG0sRklMRSAqX2Zpbix2cHhfaW1hZ2VfdCAqX2ltZyl7CisgIGNoYXIgZnJhbWVbNl07CisgIGludCAgcGljX3N6OworICBpbnQgIGNfdzsKKyAgaW50ICBjX2g7CisgIGludCAgY19zejsKKyAgaW50ICByZXQ7CisgIC8qUmVhZCBhbmQgc2tpcCB0aGUgZnJhbWUgaGVhZGVyLiovCisgIHJldD0oaW50KWZyZWFkKGZyYW1lLDEsNixfZmluKTsKKyAgaWYocmV0PDYpcmV0dXJuIDA7CisgIGlmKG1lbWNtcChmcmFtZSwiRlJBTUUiLDUpKXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiTG9zcyBvZiBmcmFtaW5nIGluIFk0TSBpbnB1dCBkYXRhXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYoZnJhbWVbNV0hPSdcbicpeworICAgIGNoYXIgYzsKKyAgICBpbnQgIGo7CisgICAgZm9yKGo9MDtqPDc5JiZmcmVhZCgmYywxLDEsX2ZpbikmJmMhPSdcbic7aisrKTsKKyAgICBpZihqPT03OSl7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgcGFyc2luZyBZNE0gZnJhbWUgaGVhZGVyXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgLypSZWFkIHRoZSBmcmFtZSBkYXRhIHRoYXQgbmVlZHMgbm8gY29udmVyc2lvbi4qLworICBpZihmcmVhZChfeTRtLT5kc3RfYnVmLDEsX3k0bS0+ZHN0X2J1Zl9yZWFkX3N6LF9maW4pIT1feTRtLT5kc3RfYnVmX3JlYWRfc3opeworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciByZWFkaW5nIFk0TSBmcmFtZSBkYXRhLlxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8qUmVhZCB0aGUgZnJhbWUgZGF0YSB0aGF0IGRvZXMgbmVlZCBjb252ZXJzaW9uLiovCisgIGlmKGZyZWFkKF95NG0tPmF1eF9idWYsMSxfeTRtLT5hdXhfYnVmX3JlYWRfc3osX2ZpbikhPV95NG0tPmF1eF9idWZfcmVhZF9zeil7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIHJlYWRpbmcgWTRNIGZyYW1lIGRhdGEuXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLypOb3cgY29udmVydCB0aGUganVzdCByZWFkIGZyYW1lLiovCisgICgqX3k0bS0+Y29udmVydCkoX3k0bSxfeTRtLT5kc3RfYnVmLF95NG0tPmF1eF9idWYpOworICAvKkZpbGwgaW4gdGhlIGZyYW1lIGJ1ZmZlciBwb2ludGVycy4KKyAgICBXZSBkb24ndCB1c2UgdnB4X2ltZ193cmFwKCkgYmVjYXVzZSBpdCBmb3JjZXMgcGFkZGluZyBmb3Igb2RkIHBpY3R1cmUKKyAgICAgc2l6ZXMsIHdoaWNoIHdvdWxkIHJlcXVpcmUgYSBzZXBhcmF0ZSBmcmVhZCBjYWxsIGZvciBldmVyeSByb3cuKi8KKyAgbWVtc2V0KF9pbWcsMCxzaXplb2YoKl9pbWcpKTsKKyAgLypZNE0gaGFzIHRoZSBwbGFuZXMgaW4gWSdDYkNyIG9yZGVyLCB3aGljaCBsaWJ2cHggY2FsbHMgWSwgVSwgYW5kIFYuKi8KKyAgX2ltZy0+Zm10PUlNR19GTVRfSTQyMDsKKyAgX2ltZy0+dz1faW1nLT5kX3c9X3k0bS0+cGljX3c7CisgIF9pbWctPmg9X2ltZy0+ZF9oPV95NG0tPnBpY19oOworICAvKlRoaXMgaXMgaGFyZC1jb2RlZCB0byA0OjI6MCBmb3Igbm93LCBhcyB0aGF0J3MgYWxsIFZQOCBzdXBwb3J0cy4qLworICBfaW1nLT54X2Nocm9tYV9zaGlmdD0xOworICBfaW1nLT55X2Nocm9tYV9zaGlmdD0xOworICBfaW1nLT5icHM9MTI7CisgIC8qU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnMuKi8KKyAgcGljX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oOworICBjX3c9KF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oOworICBjX2g9KF95NG0tPnBpY19oK195NG0tPmRzdF9jX2RlY192LTEpL195NG0tPmRzdF9jX2RlY192OworICBjX3N6PWNfdypjX2g7CisgIF9pbWctPnN0cmlkZVtQTEFORV9ZXT1feTRtLT5waWNfdzsKKyAgX2ltZy0+c3RyaWRlW1BMQU5FX1VdPV9pbWctPnN0cmlkZVtQTEFORV9WXT1jX3c7CisgIF9pbWctPnBsYW5lc1tQTEFORV9ZXT1feTRtLT5kc3RfYnVmOworICBfaW1nLT5wbGFuZXNbUExBTkVfVV09X3k0bS0+ZHN0X2J1ZitwaWNfc3o7CisgIF9pbWctPnBsYW5lc1tQTEFORV9WXT1feTRtLT5kc3RfYnVmK3BpY19zeitjX3N6OworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3k0bWlucHV0LmggYi9saWJ2cHgveTRtaW5wdXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20geTRtaW5wdXQuaApyZW5hbWUgdG8gbGlidnB4L3k0bWlucHV0LmgKZGlmZiAtLWdpdCBhL2xpYndlYm0ubWsgYi9saWJ3ZWJtLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjhjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ3ZWJtLm1rCkBAIC0wLDAgKzEsOSBAQAorIyBsaWJ3ZWJtCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYndlYm0vbWt2cGFyc2VyLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGlid2VibQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9ta3ZwYXJzZXIvbWt2cGFyc2VyLmNwcCBiL2xpYndlYm0vbWt2cGFyc2VyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWt2cGFyc2VyL21rdnBhcnNlci5jcHAKcmVuYW1lIHRvIGxpYndlYm0vbWt2cGFyc2VyLmNwcApkaWZmIC0tZ2l0IGEvbWt2cGFyc2VyL21rdnBhcnNlci5ocHAgYi9saWJ3ZWJtL21rdnBhcnNlci5ocHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1rdnBhcnNlci9ta3ZwYXJzZXIuaHBwCnJlbmFtZSB0byBsaWJ3ZWJtL21rdnBhcnNlci5ocHAKZGlmZiAtLWdpdCBhL21haW5wYWdlLmRveCBiL21haW5wYWdlLmRveApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxM2FlNy4uMDAwMDAwMAotLS0gYS9tYWlucGFnZS5kb3gKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiFcbWFpbnBhZ2UgV2ViTSBWUDggQ29kZWMgU0RLCi0KLSAgXHNlY3Rpb24gbWFpbl9jb250ZW50cyBQYWdlIENvbnRlbnRzCi0gIC0gXHJlZiBtYWluX2ludHJvCi0gIC0gXHJlZiBtYWluX3N0YXJ0cG9pbnRzCi0gIC0gXHJlZiBtYWluX3N1cHBvcnQKLQotICBcc2VjdGlvbiBtYWluX2ludHJvIEludHJvZHVjdGlvbgotICBXZWxjb21lIHRvIHRoZSBXZWJNIFZQOCBDb2RlYyBTREsuIFRoaXMgU0RLIGFsbG93cyB5b3UgdG8gaW50ZWdyYXRlIHlvdXIKLSAgYXBwbGljYXRpb25zIHdpdGggdGhlIFZQOCB2aWRlbyBjb2RlYywgYSBoaWdoIHF1YWxpdHksIHJveWFsdHkgZnJlZSwgb3BlbgotICBzb3VyY2UgY29kZWMgZGVwbG95ZWQgb24gbWlsbGlvbnMgb2YgY29tcHV0ZXJzIGFuZCBkZXZpY2VzIHdvcmxkd2lkZS4KLQotICBUaGlzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV2ViTSBWUDggQ29kZWMgU0RLIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgc3VwcG9ydDoKLQotICBcaWYgdnA4X2VuY29kZXIgICAgLSBccmVmIHZwOF9lbmNvZGVyICAgXGVuZGlmCi0gIFxpZiB2cDhfZGVjb2RlciAgICAtIFxyZWYgdnA4X2RlY29kZXIgICBcZW5kaWYKLQotCi0gIFxzZWN0aW9uIG1haW5fc3RhcnRwb2ludHMgU3RhcnRpbmcgUG9pbnRzCi0gIC0gQ29uc3VsdCB0aGUgXHJlZiBjaGFuZ2Vsb2cgZm9yIGEgY29tcGxldGUgbGlzdCBvZiBpbXByb3ZlbWVudHMgaW4gdGhpcwotICAgIHJlbGVhc2UuCi0gIC0gVGhlIFxyZWYgcmVhZG1lIGNvbnRhaW5zIGluc3RydWN0aW9ucyBvbiByZWNvbXBpbGluZyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucy4KLSAgLSBSZWFkIHRoZSBccmVmIHVzYWdlICJ1c2FnZSIgZm9yIGEgbmFycmF0aXZlIG9uIGNvZGVjIHVzYWdlLgotICAtIFJlYWQgdGhlIFxyZWYgc2FtcGxlcyAic2FtcGxlIGNvZGUiIGZvciBleGFtcGxlcyBvZiBob3cgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKLSAgICBjb2RlYy4KLSAgLSBccmVmIGNvZGVjIHJlZmVyZW5jZQotICAgIFxpZiBlbmNvZGVyIC0gXHJlZiBlbmNvZGVyIHJlZmVyZW5jZSBcZW5kaWYKLSAgICBcaWYgZGVjb2RlciAtIFxyZWYgZGVjb2RlciByZWZlcmVuY2UgXGVuZGlmCi0KLSAgXHNlY3Rpb24gbWFpbl9zdXBwb3J0IFN1cHBvcnQgT3B0aW9ucyAmIEZBUQotICBUaGUgV2ViTSBwcm9qZWN0IGlzIGFuIG9wZW4gc291cmNlIHByb2plY3Qgc3VwcG9ydGVkIGJ5IGl0cyBjb21tdW5pdHkuIEZvcgotICBxdWVzdGlvbnMgYWJvdXQgdGhpcyBTREssIHBsZWFzZSBtYWlsIHRoZSBhcHBzLWRldmVsQHdlYm1wcm9qZWN0Lm9yZyBsaXN0LgotICBUbyBjb250cmlidXRlLCBzZWUgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlIGFuZCBtYWlsCi0gIGNvZGVjLWRldmVsQHdlYm1wcm9qZWN0Lm9yZy4KLSovCi0KLS8qIVxwYWdlIGNoYW5nZWxvZyBDSEFOR0VMT0cKLSAgIFx2ZXJiaW5jbHVkZSBDSEFOR0VMT0cKLSovCi0KLS8qIVxwYWdlIHJlYWRtZSBSRUFETUUKLSAgIFx2ZXJiaW5jbHVkZSBSRUFETUUKLSovCi0KLS8qIVxkZWZncm91cCBjb2RlY3MgU3VwcG9ydGVkIENvZGVjcyAqLwpkaWZmIC0tZ2l0IGEvbWlwcy1kc3ByMi9saWJ2cHhfc3Jjcy50eHQgYi9taXBzLWRzcHIyL2xpYnZweF9zcmNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTJkNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlwcy1kc3ByMi9saWJ2cHhfc3Jjcy50eHQKQEAgLTAsMCArMSwxMTkgQEAKK2J1aWxkL21ha2UvcnRjZC5zaAorYnVpbGQvbWFrZS92ZXJzaW9uLnNoCitDSEFOR0VMT0cKK2xpYnMubWsKK3ZwOC9jb21tb24vYWxsb2Njb21tb24uYwordnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oCit2cDgvY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jCit2cDgvY29tbW9uL2Jsb2NrZC5jCit2cDgvY29tbW9uL2Jsb2NrZC5oCit2cDgvY29tbW9uL2NvZWZ1cGRhdGVwcm9icy5oCit2cDgvY29tbW9uL2NvbW1vbi5oCit2cDgvY29tbW9uL2RlYnVnbW9kZXMuYwordnA4L2NvbW1vbi9kZWZhdWx0X2NvZWZfcHJvYnMuaAordnA4L2NvbW1vbi9kZXF1YW50aXplLmMKK3ZwOC9jb21tb24vZW50cm9weS5jCit2cDgvY29tbW9uL2VudHJvcHkuaAordnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5jCit2cDgvY29tbW9uL2VudHJvcHltb2RlLmgKK3ZwOC9jb21tb24vZW50cm9weW12LmMKK3ZwOC9jb21tb24vZW50cm9weW12LmgKK3ZwOC9jb21tb24vZXh0ZW5kLmMKK3ZwOC9jb21tb24vZXh0ZW5kLmgKK3ZwOC9jb21tb24vZmlsdGVyLmMKK3ZwOC9jb21tb24vZmlsdGVyLmgKK3ZwOC9jb21tb24vZmluZG5lYXJtdi5jCit2cDgvY29tbW9uL2ZpbmRuZWFybXYuaAordnA4L2NvbW1vbi9nZW5lcmljL3N5c3RlbWRlcGVuZGVudC5jCit2cDgvY29tbW9uL2hlYWRlci5oCit2cDgvY29tbW9uL2lkY3RfYmxrLmMKK3ZwOC9jb21tb24vaWRjdGxsbS5jCit2cDgvY29tbW9uL2ludnRyYW5zLmgKK3ZwOC9jb21tb24vbG9vcGZpbHRlci5jCit2cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jCit2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaAordnA4L2NvbW1vbi9tYnBpdGNoLmMKK3ZwOC9jb21tb24vbWlwcy9kc3ByMi9kZXF1YW50aXplX2RzcHIyLmMKK3ZwOC9jb21tb24vbWlwcy9kc3ByMi9maWx0ZXJfZHNwcjIuYwordnA4L2NvbW1vbi9taXBzL2RzcHIyL2lkY3RfYmxrX2RzcHIyLmMKK3ZwOC9jb21tb24vbWlwcy9kc3ByMi9pZGN0bGxtX2RzcHIyLmMKK3ZwOC9jb21tb24vbWlwcy9kc3ByMi9sb29wZmlsdGVyX2ZpbHRlcnNfZHNwcjIuYwordnA4L2NvbW1vbi9taXBzL2RzcHIyL3JlY29uaW50ZXJfZHNwcjIuYwordnA4L2NvbW1vbi9tb2RlY29udC5jCit2cDgvY29tbW9uL21vZGVjb250LmgKK3ZwOC9jb21tb24vbXYuaAordnA4L2NvbW1vbi9vbnl4Y19pbnQuaAordnA4L2NvbW1vbi9vbnl4ZC5oCit2cDgvY29tbW9uL29ueXguaAordnA4L2NvbW1vbi9wcGZsYWdzLmgKK3ZwOC9jb21tb24vcHJhZ21hcy5oCit2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5jCit2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oCit2cDgvY29tbW9uL3JlY29uaW50ZXIuYwordnA4L2NvbW1vbi9yZWNvbmludGVyLmgKK3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5jCit2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaAordnA4L2NvbW1vbi9yZWNvbmludHJhLmMKK3ZwOC9jb21tb24vcnRjZC5jCit2cDgvY29tbW9uL3J0Y2RfZGVmcy5zaAordnA4L2NvbW1vbi9zYWRfYy5jCit2cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5jCit2cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oCit2cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmMKK3ZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuaAordnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaAordnA4L2NvbW1vbi90aHJlYWRpbmcuaAordnA4L2NvbW1vbi90cmVlY29kZXIuYwordnA4L2NvbW1vbi90cmVlY29kZXIuaAordnA4L2NvbW1vbi92YXJpYW5jZV9jLmMKK3ZwOC9jb21tb24vdmFyaWFuY2UuaAordnA4L2NvbW1vbi92cDhfZW50cm9weW1vZGVkYXRhLmgKK3ZwOC9kZWNvZGVyL2FzbV9kZWNfb2Zmc2V0cy5jCit2cDgvZGVjb2Rlci9kYm9vbGh1ZmYuYwordnA4L2RlY29kZXIvZGJvb2xodWZmLmgKK3ZwOC9kZWNvZGVyL2RlY29kZW12LmMKK3ZwOC9kZWNvZGVyL2RlY29kZW12LmgKK3ZwOC9kZWNvZGVyL2RlY29kZXJ0aHJlYWRpbmcuaAordnA4L2RlY29kZXIvZGVjb2RmcmFtZS5jCit2cDgvZGVjb2Rlci9kZXRva2VuaXplLmMKK3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuaAordnA4L2RlY29kZXIvb255eGRfaWYuYwordnA4L2RlY29kZXIvb255eGRfaW50LmgKK3ZwOC9kZWNvZGVyL3RocmVhZGluZy5jCit2cDgvZGVjb2Rlci90cmVlcmVhZGVyLmgKK3ZwOC92cDhfY29tbW9uLm1rCit2cDgvdnA4X2R4X2lmYWNlLmMKK3ZwOC92cDhkeC5tawordnB4X2NvbmZpZy5jCit2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgKK3ZweF9tZW0vaW5jbHVkZS92cHhfbWVtX2ludHJubC5oCit2cHhfbWVtL3ZweF9tZW0uYwordnB4X21lbS92cHhfbWVtLmgKK3ZweF9tZW0vdnB4X21lbS5tawordnB4X3BvcnRzL2FzbV9vZmZzZXRzLmgKK3ZweF9wb3J0cy9tZW0uaAordnB4X3BvcnRzL3ZweF9wb3J0cy5tawordnB4X3BvcnRzL3ZweF90aW1lci5oCit2cHhfc2NhbGUvZ2VuZXJpYy9nZW5fc2NhbGVycy5jCit2cHhfc2NhbGUvZ2VuZXJpYy92cHhzY2FsZS5jCit2cHhfc2NhbGUvZ2VuZXJpYy95djEyY29uZmlnLmMKK3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmQuYwordnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZF9nZW5lcmljLmgKK3ZweF9zY2FsZS9zY2FsZV9tb2RlLmgKK3ZweF9zY2FsZS92cHhzY2FsZS5oCit2cHhfc2NhbGUvdnB4X3NjYWxlLm1rCit2cHhfc2NhbGUveXYxMmNvbmZpZy5oCit2cHgvc3JjL3ZweF9jb2RlYy5jCit2cHgvc3JjL3ZweF9kZWNvZGVyLmMKK3ZweC9zcmMvdnB4X2VuY29kZXIuYwordnB4L3NyYy92cHhfaW1hZ2UuYwordnB4L3ZwOGR4LmgKK3ZweC92cDguaAordnB4L3ZweF9jb2RlYy5oCit2cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgKK3ZweC92cHhfY29kZWNfaW1wbF90b3AuaAordnB4L3ZweF9jb2RlYy5tawordnB4L3ZweF9kZWNvZGVyLmgKK3ZweC92cHhfZW5jb2Rlci5oCit2cHgvdnB4X2ltYWdlLmgKK3ZweC92cHhfaW50ZWdlci5oCmRpZmYgLS1naXQgYS9taXBzLWRzcHIyL3ZweF9jb25maWcuYyBiL21pcHMtZHNwcjIvdnB4X2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2YyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9taXBzLWRzcHIyL3ZweF9jb25maWcuYwpAQCAtMCwwICsxLDkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisvKiAgKi8KKy8qIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgKi8KKy8qIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSAqLworLyogdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCAqLworLyogaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSAqLworLyogYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuICovCitzdGF0aWMgY29uc3QgY2hhciogY29uc3QgY2ZnID0gIi0tZm9yY2UtdGFyZ2V0PW1pcHMzMi1hbmRyb2lkLWdjYyAtLWRpc2FibGUtcnVudGltZS1jcHUtZGV0ZWN0IC0tc2RrLXBhdGg9L3Vzci9sb2NhbC9nb29nbGUvaG9tZS9qb2hhbm5rb2VuaWcvYW5kcm9pZC1uZGsgLS1kaXNhYmxlLXZwOC1lbmNvZGVyIC0tZGlzYWJsZS1leGFtcGxlcyAtLWRpc2FibGUtZG9jcyAtLWVuYWJsZS1kc3ByMiI7Citjb25zdCBjaGFyICp2cHhfY29kZWNfYnVpbGRfY29uZmlnKHZvaWQpIHtyZXR1cm4gY2ZnO30KZGlmZiAtLWdpdCBhL21pcHMtZHNwcjIvdnB4X2NvbmZpZy5oIGIvbWlwcy1kc3ByMi92cHhfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZTcxMQotLS0gL2Rldi9udWxsCisrKyBiL21pcHMtZHNwcjIvdnB4X2NvbmZpZy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisvKiAgKi8KKy8qIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgKi8KKy8qIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSAqLworLyogdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCAqLworLyogaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSAqLworLyogYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuICovCisvKiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEgKi8KKyNpZm5kZWYgVlBYX0NPTkZJR19ICisjZGVmaW5lIFZQWF9DT05GSUdfSAorI2RlZmluZSBSRVNUUklDVCAgICAKKyNkZWZpbmUgQVJDSF9BUk0gMAorI2RlZmluZSBBUkNIX01JUFMgMQorI2RlZmluZSBBUkNIX1g4NiAwCisjZGVmaW5lIEFSQ0hfWDg2XzY0IDAKKyNkZWZpbmUgQVJDSF9QUEMzMiAwCisjZGVmaW5lIEFSQ0hfUFBDNjQgMAorI2RlZmluZSBIQVZFX0VEU1AgMAorI2RlZmluZSBIQVZFX01FRElBIDAKKyNkZWZpbmUgSEFWRV9ORU9OIDAKKyNkZWZpbmUgSEFWRV9NSVBTMzIgMQorI2RlZmluZSBIQVZFX0RTUFIyIDEKKyNkZWZpbmUgSEFWRV9NTVggMAorI2RlZmluZSBIQVZFX1NTRSAwCisjZGVmaW5lIEhBVkVfU1NFMiAwCisjZGVmaW5lIEhBVkVfU1NFMyAwCisjZGVmaW5lIEhBVkVfU1NTRTMgMAorI2RlZmluZSBIQVZFX1NTRTRfMSAwCisjZGVmaW5lIEhBVkVfQUxUSVZFQyAwCisjZGVmaW5lIEhBVkVfVlBYX1BPUlRTIDEKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZGVmaW5lIEhBVkVfQUxUX1RSRUVfTEFZT1VUIDAKKyNkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorI2RlZmluZSBIQVZFX1NZU19NTUFOX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKyNkZWZpbmUgQ09ORklHX0VYVEVSTkFMX0JVSUxEIDAKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfRE9DUyAxCisjZGVmaW5lIENPTkZJR19JTlNUQUxMX0JJTlMgMQorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9MSUJTIDEKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfU1JDUyAwCisjZGVmaW5lIENPTkZJR19ERUJVRyAwCisjZGVmaW5lIENPTkZJR19HUFJPRiAwCisjZGVmaW5lIENPTkZJR19HQ09WIDAKKyNkZWZpbmUgQ09ORklHX1JWQ1QgMAorI2RlZmluZSBDT05GSUdfR0NDIDEKKyNkZWZpbmUgQ09ORklHX01TVlMgMAorI2RlZmluZSBDT05GSUdfUElDIDAKKyNkZWZpbmUgQ09ORklHX0JJR19FTkRJQU4gMAorI2RlZmluZSBDT05GSUdfQ09ERUNfU1JDUyAwCisjZGVmaW5lIENPTkZJR19ERUJVR19MSUJTIDAKKyNkZWZpbmUgQ09ORklHX0ZBU1RfVU5BTElHTkVEIDAKKyNkZWZpbmUgQ09ORklHX01FTV9NQU5BR0VSIDAKKyNkZWZpbmUgQ09ORklHX01FTV9UUkFDS0VSIDAKKyNkZWZpbmUgQ09ORklHX01FTV9DSEVDS1MgMAorI2RlZmluZSBDT05GSUdfTUQ1IDEKKyNkZWZpbmUgQ09ORklHX0RFUVVBTlRfVE9LRU5TIDEKKyNkZWZpbmUgQ09ORklHX0RDX1JFQ09OIDEKKyNkZWZpbmUgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVCAwCisjZGVmaW5lIENPTkZJR19QT1NUUFJPQyAwCisjZGVmaW5lIENPTkZJR19NVUxUSVRIUkVBRCAxCisjZGVmaW5lIENPTkZJR19JTlRFUk5BTF9TVEFUUyAwCisjZGVmaW5lIENPTkZJR19WUDhfRU5DT0RFUiAwCisjZGVmaW5lIENPTkZJR19WUDhfREVDT0RFUiAxCisjZGVmaW5lIENPTkZJR19WUDggMQorI2RlZmluZSBDT05GSUdfRU5DT0RFUlMgMAorI2RlZmluZSBDT05GSUdfREVDT0RFUlMgMQorI2RlZmluZSBDT05GSUdfU1RBVElDX01TVkNSVCAwCisjZGVmaW5lIENPTkZJR19TUEFUSUFMX1JFU0FNUExJTkcgMQorI2RlZmluZSBDT05GSUdfUkVBTFRJTUVfT05MWSAwCisjZGVmaW5lIENPTkZJR19PTlRIRUZMWV9CSVRQQUNLSU5HIDAKKyNkZWZpbmUgQ09ORklHX0VSUk9SX0NPTkNFQUxNRU5UIDAKKyNkZWZpbmUgQ09ORklHX1NIQVJFRCAwCisjZGVmaW5lIENPTkZJR19TVEFUSUMgMQorI2RlZmluZSBDT05GSUdfU01BTEwgMAorI2RlZmluZSBDT05GSUdfUE9TVFBST0NfVklTVUFMSVpFUiAwCisjZGVmaW5lIENPTkZJR19PU19TVVBQT1JUIDEKKyNkZWZpbmUgQ09ORklHX1VOSVRfVEVTVFMgMAorI2RlZmluZSBDT05GSUdfTVVMVElfUkVTX0VOQ09ESU5HIDAKKyNkZWZpbmUgQ09ORklHX1RFTVBPUkFMX0RFTk9JU0lORyAxCisjZW5kaWYgLyogVlBYX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9taXBzLWRzcHIyL3ZweF9ydGNkLmggYi9taXBzLWRzcHIyL3ZweF9ydGNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZTBmNAotLS0gL2Rldi9udWxsCisrKyBiL21pcHMtZHNwcjIvdnB4X3J0Y2QuaApAQCAtMCwwICsxLDMxOCBAQAorI2lmbmRlZiBWUFhfUlRDRF8KKyNkZWZpbmUgVlBYX1JUQ0RfCisKKyNpZmRlZiBSVENEX0MKKyNkZWZpbmUgUlRDRF9FWFRFUk4KKyNlbHNlCisjZGVmaW5lIFJUQ0RfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKyNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgorCitzdHJ1Y3QgYmxvY2tkOworc3RydWN0IG1hY3JvYmxvY2tkOworc3RydWN0IGxvb3BfZmlsdGVyX2luZm87CisKKy8qIEVuY29kZXIgZm9yd2FyZCBkZWNscyAqLworc3RydWN0IGJsb2NrOworc3RydWN0IG1hY3JvYmxvY2s7CitzdHJ1Y3QgdmFyaWFuY2VfdnRhYmxlOwordW5pb24gaW50X212Oworc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZzsKKwordm9pZCB2cDhfZGVxdWFudGl6ZV9iX2Moc3RydWN0IGJsb2NrZCosIHNob3J0ICpkcWMpOworI2RlZmluZSB2cDhfZGVxdWFudGl6ZV9iIHZwOF9kZXF1YW50aXplX2JfYworCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgaW50IHN0cmlkZSk7Cit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX2RzcHIyKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBzdHJpZGUpOworI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9kc3ByMgorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYyhzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpOwordm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2RzcHIyKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSwgY2hhciAqZW9icyk7CisjZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19kc3ByMgorCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2Moc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIHVuc2lnbmVkIGNoYXIgKmRzdF92LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfZHNwcjIoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIHVuc2lnbmVkIGNoYXIgKmRzdF92LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfZHNwcjIKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X2ModW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X2RzcHIyKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX21idiB2cDhfbG9vcF9maWx0ZXJfbWJ2X2RzcHIyCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X2ModW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfZHNwcjIodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfYnYgdnA4X2xvb3BfZmlsdGVyX2J2X2RzcHIyCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9kc3ByMih1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9tYmggdnA4X2xvb3BfZmlsdGVyX21iaF9kc3ByMgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2JoX2RzcHIyKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX2JoIHZwOF9sb29wX2ZpbHRlcl9iaF9kc3ByMgorCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jKHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX21idiB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJoIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYnYgdnA4X2xvb3BfZmlsdGVyX2J2c19jCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2Joc19jKHVuc2lnbmVkIGNoYXIgKnksIGludCB5c3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpibGltaXQpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2JoIHZwOF9sb29wX2ZpbHRlcl9iaHNfYworCit2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2Moc2hvcnQgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOwordm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV9kc3ByMihzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwaXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7CisjZGVmaW5lIHZwOF9zaG9ydF9pZGN0NHg0bGxtIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2RzcHIyCisKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX2RzcHIyKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCk7CisjZGVmaW5lIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfZHNwcjIKKwordm9pZCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKK3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9kc3ByMihzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpOworI2RlZmluZSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0IHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfZHNwcjIKKwordm9pZCB2cDhfZGNfb25seV9pZGN0X2FkZF9jKHNob3J0IGlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOwordm9pZCB2cDhfZGNfb25seV9pZGN0X2FkZF9kc3ByMihzaG9ydCBpbnB1dCwgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHByZWRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2RjX29ubHlfaWRjdF9hZGQgdnA4X2RjX29ubHlfaWRjdF9hZGRfZHNwcjIKKwordm9pZCB2cDhfY29weV9tZW0xNngxNl9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2NvcHlfbWVtMTZ4MTZfZHNwcjIodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfY29weV9tZW0xNngxNiB2cDhfY29weV9tZW0xNngxNl9kc3ByMgorCit2b2lkIHZwOF9jb3B5X21lbTh4OF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2NvcHlfbWVtOHg4X2RzcHIyKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2NvcHlfbWVtOHg4IHZwOF9jb3B5X21lbTh4OF9kc3ByMgorCit2b2lkIHZwOF9jb3B5X21lbTh4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X2NvcHlfbWVtOHg0X2RzcHIyKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2NvcHlfbWVtOHg0IHZwOF9jb3B5X21lbTh4NF9kc3ByMgorCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zX2Moc3RydWN0IG1hY3JvYmxvY2tkICp4LCB1bnNpZ25lZCBjaGFyICogeWFib3ZlX3JvdywgdW5zaWduZWQgY2hhciAqIHlsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKiB5cHJlZF9wdHIsIGludCB5X3N0cmlkZSk7CisjZGVmaW5lIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zX2MKKwordm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3NfYyhzdHJ1Y3QgbWFjcm9ibG9ja2QgKngsIHVuc2lnbmVkIGNoYXIgKiB1YWJvdmVfcm93LCB1bnNpZ25lZCBjaGFyICogdmFib3ZlX3JvdywgIHVuc2lnbmVkIGNoYXIgKnVsZWZ0LCB1bnNpZ25lZCBjaGFyICp2bGVmdCwgaW50IGxlZnRfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICogdXByZWRfcHRyLCB1bnNpZ25lZCBjaGFyICogdnByZWRfcHRyLCBpbnQgcHJlZF9zdHJpZGUpOworI2RlZmluZSB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zX2MKKwordm9pZCB2cDhfaW50cmE0eDRfcHJlZGljdF9jKHVuc2lnbmVkIGNoYXIgKkFib3ZlLCB1bnNpZ25lZCBjaGFyICp5bGVmdCwgaW50IGxlZnRfc3RyaWRlLCBCX1BSRURJQ1RJT05fTU9ERSBiX21vZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgdG9wX2xlZnQpOworI2RlZmluZSB2cDhfaW50cmE0eDRfcHJlZGljdCB2cDhfaW50cmE0eDRfcHJlZGljdF9jCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9kc3ByMih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9kc3ByMgorCit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7Cit2b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9kc3ByMih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDggdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2RzcHIyCisKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKK3ZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2RzcHIyKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9zaXh0YXBfcHJlZGljdDh4NCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfZHNwcjIKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfZHNwcjIodW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X3NpeHRhcF9wcmVkaWN0NHg0IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9kc3ByMgorCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2IHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYworCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDggdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYworCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfYworCit2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlNHg0X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U0eDQgdnA4X3ZhcmlhbmNlNHg0X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlOHg4IHZwOF92YXJpYW5jZTh4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2U4eDE2IHZwOF92YXJpYW5jZTh4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlMTZ4OCB2cDhfdmFyaWFuY2UxNng4X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2UxNngxNiB2cDhfdmFyaWFuY2UxNngxNl9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X2MKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X2MKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNvdXJjZV9zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDR4NF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkNHg0IHZwOF9zYWQ0eDRfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkOHg4IHZwOF9zYWQ4eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDh4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDh4MTYgdnA4X3NhZDh4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDE2eDggdnA4X3NhZDE2eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQxNngxNiB2cDhfc2FkMTZ4MTZfYworCit2b2lkIHZwOF9zYWQ0eDR4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDR4NHgzIHZwOF9zYWQ0eDR4M19jCisKK3ZvaWQgdnA4X3NhZDh4OHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHg4eDMgdnA4X3NhZDh4OHgzX2MKKwordm9pZCB2cDhfc2FkOHgxNngzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHgxNngzIHZwOF9zYWQ4eDE2eDNfYworCit2b2lkIHZwOF9zYWQxNng4eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNng4eDMgdnA4X3NhZDE2eDh4M19jCisKK3ZvaWQgdnA4X3NhZDE2eDE2eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNngxNngzIHZwOF9zYWQxNngxNngzX2MKKwordm9pZCB2cDhfc2FkNHg0eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDR4NHg4IHZwOF9zYWQ0eDR4OF9jCisKK3ZvaWQgdnA4X3NhZDh4OHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDh4OCB2cDhfc2FkOHg4eDhfYworCit2b2lkIHZwOF9zYWQ4eDE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4MTZ4OCB2cDhfc2FkOHgxNng4X2MKKwordm9pZCB2cDhfc2FkMTZ4OHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNng4eDggdnA4X3NhZDE2eDh4OF9jCisKK3ZvaWQgdnA4X3NhZDE2eDE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDE2eDggdnA4X3NhZDE2eDE2eDhfYworCit2b2lkIHZwOF9zYWQ0eDR4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ0eDR4NGQgdnA4X3NhZDR4NHg0ZF9jCisKK3ZvaWQgdnA4X3NhZDh4OHg0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4OHg0ZCB2cDhfc2FkOHg4eDRkX2MKKwordm9pZCB2cDhfc2FkOHgxNng0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4MTZ4NGQgdnA4X3NhZDh4MTZ4NGRfYworCit2b2lkIHZwOF9zYWQxNng4eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4OHg0ZCB2cDhfc2FkMTZ4OHg0ZF9jCisKK3ZvaWQgdnA4X3NhZDE2eDE2eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4MTZ4NGQgdnA4X3NhZDE2eDE2eDRkX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZSB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9jCisKK3ZvaWQgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfYyhzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICp5YmYpOworI2RlZmluZSB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19jCisKK3ZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV9jKHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnNyY195YmMsIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMpOworI2RlZmluZSB2cDhfeXYxMl9jb3B5X2ZyYW1lIHZwOF95djEyX2NvcHlfZnJhbWVfYworCit2b2lkIHZwOF95djEyX2NvcHlfeV9jKHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKnNyY195YmMsIHN0cnVjdCB5djEyX2J1ZmZlcl9jb25maWcgKmRzdF95YmMpOworI2RlZmluZSB2cDhfeXYxMl9jb3B5X3kgdnA4X3l2MTJfY29weV95X2MKKwordm9pZCB2cHhfcnRjZCh2b2lkKTsKKyNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCisKKyNpZmRlZiBSVENEX0MKK3N0YXRpYyB2b2lkIHNldHVwX3J0Y2RfaW50ZXJuYWwodm9pZCkKK3sKKworI2lmIEhBVkVfRFNQUjIKK3ZvaWQgZHNwdXRpbF9zdGF0aWNfaW5pdCgpOworZHNwdXRpbF9zdGF0aWNfaW5pdCgpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWlwcy1kc3ByMi92cHhfdmVyc2lvbi5oIGIvbWlwcy1kc3ByMi92cHhfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2M2RkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9taXBzLWRzcHIyL3ZweF92ZXJzaW9uLmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIFZFUlNJT05fTUFKT1IgIDEKKyNkZWZpbmUgVkVSU0lPTl9NSU5PUiAgMQorI2RlZmluZSBWRVJTSU9OX1BBVENIICAwCisjZGVmaW5lIFZFUlNJT05fRVhUUkEgICIiCisjZGVmaW5lIFZFUlNJT05fUEFDS0VEICgoVkVSU0lPTl9NQUpPUjw8MTYpfChWRVJTSU9OX01JTk9SPDw4KXwoVkVSU0lPTl9QQVRDSCkpCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HX05PU1AgInYxLjEuMCIKKyNkZWZpbmUgVkVSU0lPTl9TVFJJTkcgICAgICAiIHYxLjEuMCIKZGlmZiAtLWdpdCBhL21pcHMvLmJpbnMgYi9taXBzLy5iaW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9taXBzLy5iaW5zCmRpZmYgLS1naXQgYS9taXBzLy5kb2NzIGIvbWlwcy8uZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWlwcy8uZG9jcwpkaWZmIC0tZ2l0IGEvbWlwcy8ubGlicyBiL21pcHMvLmxpYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21pcHMvLmxpYnMKZGlmZiAtLWdpdCBhL21pcHMvbGlidnB4X3NyY3MudHh0IGIvbWlwcy9saWJ2cHhfc3Jjcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNTllZgotLS0gL2Rldi9udWxsCisrKyBiL21pcHMvbGlidnB4X3NyY3MudHh0CkBAIC0wLDAgKzEsMTEzIEBACitidWlsZC9tYWtlL3J0Y2Quc2gKK2J1aWxkL21ha2UvdmVyc2lvbi5zaAorQ0hBTkdFTE9HCitsaWJzLm1rCit2cDgvY29tbW9uL2FsbG9jY29tbW9uLmMKK3ZwOC9jb21tb24vYWxsb2Njb21tb24uaAordnA4L2NvbW1vbi9hc21fY29tX29mZnNldHMuYwordnA4L2NvbW1vbi9ibG9ja2QuYwordnA4L2NvbW1vbi9ibG9ja2QuaAordnA4L2NvbW1vbi9jb2VmdXBkYXRlcHJvYnMuaAordnA4L2NvbW1vbi9jb21tb24uaAordnA4L2NvbW1vbi9kZWJ1Z21vZGVzLmMKK3ZwOC9jb21tb24vZGVmYXVsdF9jb2VmX3Byb2JzLmgKK3ZwOC9jb21tb24vZGVxdWFudGl6ZS5jCit2cDgvY29tbW9uL2VudHJvcHkuYwordnA4L2NvbW1vbi9lbnRyb3B5LmgKK3ZwOC9jb21tb24vZW50cm9weW1vZGUuYwordnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oCit2cDgvY29tbW9uL2VudHJvcHltdi5jCit2cDgvY29tbW9uL2VudHJvcHltdi5oCit2cDgvY29tbW9uL2V4dGVuZC5jCit2cDgvY29tbW9uL2V4dGVuZC5oCit2cDgvY29tbW9uL2ZpbHRlci5jCit2cDgvY29tbW9uL2ZpbHRlci5oCit2cDgvY29tbW9uL2ZpbmRuZWFybXYuYwordnA4L2NvbW1vbi9maW5kbmVhcm12LmgKK3ZwOC9jb21tb24vZ2VuZXJpYy9zeXN0ZW1kZXBlbmRlbnQuYwordnA4L2NvbW1vbi9oZWFkZXIuaAordnA4L2NvbW1vbi9pZGN0X2Jsay5jCit2cDgvY29tbW9uL2lkY3RsbG0uYwordnA4L2NvbW1vbi9pbnZ0cmFucy5oCit2cDgvY29tbW9uL2xvb3BmaWx0ZXIuYwordnA4L2NvbW1vbi9sb29wZmlsdGVyX2ZpbHRlcnMuYwordnA4L2NvbW1vbi9sb29wZmlsdGVyLmgKK3ZwOC9jb21tb24vbWJwaXRjaC5jCit2cDgvY29tbW9uL21vZGVjb250LmMKK3ZwOC9jb21tb24vbW9kZWNvbnQuaAordnA4L2NvbW1vbi9tdi5oCit2cDgvY29tbW9uL29ueXhjX2ludC5oCit2cDgvY29tbW9uL29ueXhkLmgKK3ZwOC9jb21tb24vb255eC5oCit2cDgvY29tbW9uL3BwZmxhZ3MuaAordnA4L2NvbW1vbi9wcmFnbWFzLmgKK3ZwOC9jb21tb24vcXVhbnRfY29tbW9uLmMKK3ZwOC9jb21tb24vcXVhbnRfY29tbW9uLmgKK3ZwOC9jb21tb24vcmVjb25pbnRlci5jCit2cDgvY29tbW9uL3JlY29uaW50ZXIuaAordnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmMKK3ZwOC9jb21tb24vcmVjb25pbnRyYTR4NC5oCit2cDgvY29tbW9uL3JlY29uaW50cmEuYwordnA4L2NvbW1vbi9ydGNkLmMKK3ZwOC9jb21tb24vcnRjZF9kZWZzLnNoCit2cDgvY29tbW9uL3NhZF9jLmMKK3ZwOC9jb21tb24vc2V0dXBpbnRyYXJlY29uLmMKK3ZwOC9jb21tb24vc2V0dXBpbnRyYXJlY29uLmgKK3ZwOC9jb21tb24vc3dhcHl2MTJidWZmZXIuYwordnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oCit2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oCit2cDgvY29tbW9uL3RocmVhZGluZy5oCit2cDgvY29tbW9uL3RyZWVjb2Rlci5jCit2cDgvY29tbW9uL3RyZWVjb2Rlci5oCit2cDgvY29tbW9uL3ZhcmlhbmNlX2MuYwordnA4L2NvbW1vbi92YXJpYW5jZS5oCit2cDgvY29tbW9uL3ZwOF9lbnRyb3B5bW9kZWRhdGEuaAordnA4L2RlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMKK3ZwOC9kZWNvZGVyL2Rib29saHVmZi5jCit2cDgvZGVjb2Rlci9kYm9vbGh1ZmYuaAordnA4L2RlY29kZXIvZGVjb2RlbXYuYwordnA4L2RlY29kZXIvZGVjb2RlbXYuaAordnA4L2RlY29kZXIvZGVjb2RlcnRocmVhZGluZy5oCit2cDgvZGVjb2Rlci9kZWNvZGZyYW1lLmMKK3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuYwordnA4L2RlY29kZXIvZGV0b2tlbml6ZS5oCit2cDgvZGVjb2Rlci9vbnl4ZF9pZi5jCit2cDgvZGVjb2Rlci9vbnl4ZF9pbnQuaAordnA4L2RlY29kZXIvdGhyZWFkaW5nLmMKK3ZwOC9kZWNvZGVyL3RyZWVyZWFkZXIuaAordnA4L3ZwOF9jb21tb24ubWsKK3ZwOC92cDhfZHhfaWZhY2UuYwordnA4L3ZwOGR4Lm1rCit2cHhfY29uZmlnLmMKK3ZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaAordnB4X21lbS9pbmNsdWRlL3ZweF9tZW1faW50cm5sLmgKK3ZweF9tZW0vdnB4X21lbS5jCit2cHhfbWVtL3ZweF9tZW0uaAordnB4X21lbS92cHhfbWVtLm1rCit2cHhfcG9ydHMvYXNtX29mZnNldHMuaAordnB4X3BvcnRzL21lbS5oCit2cHhfcG9ydHMvdnB4X3BvcnRzLm1rCit2cHhfcG9ydHMvdnB4X3RpbWVyLmgKK3ZweF9zY2FsZS9nZW5lcmljL2dlbl9zY2FsZXJzLmMKK3ZweF9zY2FsZS9nZW5lcmljL3ZweHNjYWxlLmMKK3ZweF9zY2FsZS9nZW5lcmljL3l2MTJjb25maWcuYwordnB4X3NjYWxlL2dlbmVyaWMveXYxMmV4dGVuZC5jCit2cHhfc2NhbGUvZ2VuZXJpYy95djEyZXh0ZW5kX2dlbmVyaWMuaAordnB4X3NjYWxlL3NjYWxlX21vZGUuaAordnB4X3NjYWxlL3ZweHNjYWxlLmgKK3ZweF9zY2FsZS92cHhfc2NhbGUubWsKK3ZweF9zY2FsZS95djEyY29uZmlnLmgKK3ZweC9zcmMvdnB4X2NvZGVjLmMKK3ZweC9zcmMvdnB4X2RlY29kZXIuYwordnB4L3NyYy92cHhfZW5jb2Rlci5jCit2cHgvc3JjL3ZweF9pbWFnZS5jCit2cHgvdnA4ZHguaAordnB4L3ZwOC5oCit2cHgvdnB4X2NvZGVjLmgKK3ZweC92cHhfY29kZWNfaW1wbF9ib3R0b20uaAordnB4L3ZweF9jb2RlY19pbXBsX3RvcC5oCit2cHgvdnB4X2NvZGVjLm1rCit2cHgvdnB4X2RlY29kZXIuaAordnB4L3ZweF9lbmNvZGVyLmgKK3ZweC92cHhfaW1hZ2UuaAordnB4L3ZweF9pbnRlZ2VyLmgKZGlmZiAtLWdpdCBhL21pcHMvdnB4X2NvbmZpZy5jIGIvbWlwcy92cHhfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwN2UwNgotLS0gL2Rldi9udWxsCisrKyBiL21pcHMvdnB4X2NvbmZpZy5jCkBAIC0wLDAgKzEsOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gKi8KKy8qICAqLworLyogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSAqLworLyogdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlICovCisvKiB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kICovCisvKiBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5ICovCisvKiBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBjZmcgPSAiLS1mb3JjZS10YXJnZXQ9bWlwczMyLWFuZHJvaWQtZ2NjIC0tZGlzYWJsZS1ydW50aW1lLWNwdS1kZXRlY3QgLS1zZGstcGF0aD0vdXNyL2xvY2FsL2dvb2dsZS9ob21lL2pvaGFubmtvZW5pZy9hbmRyb2lkLW5kayAtLWRpc2FibGUtdnA4LWVuY29kZXIgLS1kaXNhYmxlLWV4YW1wbGVzIC0tZGlzYWJsZS1kb2NzIjsKK2NvbnN0IGNoYXIgKnZweF9jb2RlY19idWlsZF9jb25maWcodm9pZCkge3JldHVybiBjZmc7fQpkaWZmIC0tZ2l0IGEvbWlwcy92cHhfY29uZmlnLmggYi9taXBzL3ZweF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY3MzYzCi0tLSAvZGV2L251bGwKKysrIGIvbWlwcy92cHhfY29uZmlnLmgKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gKi8KKy8qICAqLworLyogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSAqLworLyogdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlICovCisvKiB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kICovCisvKiBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5ICovCisvKiBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4gKi8KKy8qIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIG5vdCBlZGl0ISAqLworI2lmbmRlZiBWUFhfQ09ORklHX0gKKyNkZWZpbmUgVlBYX0NPTkZJR19ICisjZGVmaW5lIFJFU1RSSUNUICAgIAorI2RlZmluZSBBUkNIX0FSTSAwCisjZGVmaW5lIEFSQ0hfTUlQUyAxCisjZGVmaW5lIEFSQ0hfWDg2IDAKKyNkZWZpbmUgQVJDSF9YODZfNjQgMAorI2RlZmluZSBBUkNIX1BQQzMyIDAKKyNkZWZpbmUgQVJDSF9QUEM2NCAwCisjZGVmaW5lIEhBVkVfRURTUCAwCisjZGVmaW5lIEhBVkVfTUVESUEgMAorI2RlZmluZSBIQVZFX05FT04gMAorI2RlZmluZSBIQVZFX01JUFMzMiAxCisjZGVmaW5lIEhBVkVfRFNQUjIgMAorI2RlZmluZSBIQVZFX01NWCAwCisjZGVmaW5lIEhBVkVfU1NFIDAKKyNkZWZpbmUgSEFWRV9TU0UyIDAKKyNkZWZpbmUgSEFWRV9TU0UzIDAKKyNkZWZpbmUgSEFWRV9TU1NFMyAwCisjZGVmaW5lIEhBVkVfU1NFNF8xIDAKKyNkZWZpbmUgSEFWRV9BTFRJVkVDIDAKKyNkZWZpbmUgSEFWRV9WUFhfUE9SVFMgMQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNkZWZpbmUgSEFWRV9BTFRfVFJFRV9MQVlPVVQgMAorI2RlZmluZSBIQVZFX1BUSFJFQURfSCAxCisjZGVmaW5lIEhBVkVfU1lTX01NQU5fSCAxCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorI2RlZmluZSBDT05GSUdfRVhURVJOQUxfQlVJTEQgMAorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9ET0NTIDEKKyNkZWZpbmUgQ09ORklHX0lOU1RBTExfQklOUyAxCisjZGVmaW5lIENPTkZJR19JTlNUQUxMX0xJQlMgMQorI2RlZmluZSBDT05GSUdfSU5TVEFMTF9TUkNTIDAKKyNkZWZpbmUgQ09ORklHX0RFQlVHIDAKKyNkZWZpbmUgQ09ORklHX0dQUk9GIDAKKyNkZWZpbmUgQ09ORklHX0dDT1YgMAorI2RlZmluZSBDT05GSUdfUlZDVCAwCisjZGVmaW5lIENPTkZJR19HQ0MgMQorI2RlZmluZSBDT05GSUdfTVNWUyAwCisjZGVmaW5lIENPTkZJR19QSUMgMAorI2RlZmluZSBDT05GSUdfQklHX0VORElBTiAwCisjZGVmaW5lIENPTkZJR19DT0RFQ19TUkNTIDAKKyNkZWZpbmUgQ09ORklHX0RFQlVHX0xJQlMgMAorI2RlZmluZSBDT05GSUdfRkFTVF9VTkFMSUdORUQgMQorI2RlZmluZSBDT05GSUdfTUVNX01BTkFHRVIgMAorI2RlZmluZSBDT05GSUdfTUVNX1RSQUNLRVIgMAorI2RlZmluZSBDT05GSUdfTUVNX0NIRUNLUyAwCisjZGVmaW5lIENPTkZJR19NRDUgMQorI2RlZmluZSBDT05GSUdfREVRVUFOVF9UT0tFTlMgMQorI2RlZmluZSBDT05GSUdfRENfUkVDT04gMQorI2RlZmluZSBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUIDAKKyNkZWZpbmUgQ09ORklHX1BPU1RQUk9DIDAKKyNkZWZpbmUgQ09ORklHX01VTFRJVEhSRUFEIDEKKyNkZWZpbmUgQ09ORklHX0lOVEVSTkFMX1NUQVRTIDAKKyNkZWZpbmUgQ09ORklHX1ZQOF9FTkNPREVSIDAKKyNkZWZpbmUgQ09ORklHX1ZQOF9ERUNPREVSIDEKKyNkZWZpbmUgQ09ORklHX1ZQOCAxCisjZGVmaW5lIENPTkZJR19FTkNPREVSUyAwCisjZGVmaW5lIENPTkZJR19ERUNPREVSUyAxCisjZGVmaW5lIENPTkZJR19TVEFUSUNfTVNWQ1JUIDAKKyNkZWZpbmUgQ09ORklHX1NQQVRJQUxfUkVTQU1QTElORyAxCisjZGVmaW5lIENPTkZJR19SRUFMVElNRV9PTkxZIDAKKyNkZWZpbmUgQ09ORklHX09OVEhFRkxZX0JJVFBBQ0tJTkcgMAorI2RlZmluZSBDT05GSUdfRVJST1JfQ09OQ0VBTE1FTlQgMAorI2RlZmluZSBDT05GSUdfU0hBUkVEIDAKKyNkZWZpbmUgQ09ORklHX1NUQVRJQyAxCisjZGVmaW5lIENPTkZJR19TTUFMTCAwCisjZGVmaW5lIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSIDAKKyNkZWZpbmUgQ09ORklHX09TX1NVUFBPUlQgMQorI2RlZmluZSBDT05GSUdfVU5JVF9URVNUUyAwCisjZGVmaW5lIENPTkZJR19NVUxUSV9SRVNfRU5DT0RJTkcgMAorI2RlZmluZSBDT05GSUdfVEVNUE9SQUxfREVOT0lTSU5HIDEKKyNlbmRpZiAvKiBWUFhfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL21pcHMvdnB4X3J0Y2QuaCBiL21pcHMvdnB4X3J0Y2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ4NmFmCi0tLSAvZGV2L251bGwKKysrIGIvbWlwcy92cHhfcnRjZC5oCkBAIC0wLDAgKzEsMzAwIEBACisjaWZuZGVmIFZQWF9SVENEXworI2RlZmluZSBWUFhfUlRDRF8KKworI2lmZGVmIFJUQ0RfQworI2RlZmluZSBSVENEX0VYVEVSTgorI2Vsc2UKKyNkZWZpbmUgUlRDRF9FWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCisKK3N0cnVjdCBibG9ja2Q7CitzdHJ1Y3QgbWFjcm9ibG9ja2Q7CitzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbzsKKworLyogRW5jb2RlciBmb3J3YXJkIGRlY2xzICovCitzdHJ1Y3QgYmxvY2s7CitzdHJ1Y3QgbWFjcm9ibG9jazsKK3N0cnVjdCB2YXJpYW5jZV92dGFibGU7Cit1bmlvbiBpbnRfbXY7CitzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnOworCit2b2lkIHZwOF9kZXF1YW50aXplX2JfYyhzdHJ1Y3QgYmxvY2tkKiwgc2hvcnQgKmRxYyk7CisjZGVmaW5lIHZwOF9kZXF1YW50aXplX2IgdnA4X2RlcXVhbnRpemVfYl9jCisKK3ZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfYworCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYyhzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpOworI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYworCit2b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2Moc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIHVuc2lnbmVkIGNoYXIgKmRzdF92LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKTsKKyNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZfYyh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgeXN0cmlkZSwgaW50IHV2X3N0cmlkZSwgc3RydWN0IGxvb3BfZmlsdGVyX2luZm8gKmxmaSk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9tYnYgdnA4X2xvb3BfZmlsdGVyX21idl9jCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2X2ModW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfYnYgdnA4X2xvb3BfZmlsdGVyX2J2X2MKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX2ModW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHlzdHJpZGUsIGludCB1dl9zdHJpZGUsIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvICpsZmkpOworI2RlZmluZSB2cDhfbG9vcF9maWx0ZXJfbWJoIHZwOF9sb29wX2ZpbHRlcl9tYmhfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9jKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mbyAqbGZpKTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX2JoIHZwOF9sb29wX2ZpbHRlcl9iaF9jCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfbWJ2IHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jCisKK3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYyh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9tYmggdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYworCit2b2lkIHZwOF9sb29wX2ZpbHRlcl9idnNfYyh1bnNpZ25lZCBjaGFyICp5LCBpbnQgeXN0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxpbWl0KTsKKyNkZWZpbmUgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9idiB2cDhfbG9vcF9maWx0ZXJfYnZzX2MKKwordm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhzX2ModW5zaWduZWQgY2hhciAqeSwgaW50IHlzdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsaW1pdCk7CisjZGVmaW5lIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfYmggdnA4X2xvb3BfZmlsdGVyX2Joc19jCisKK3ZvaWQgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYyhzaG9ydCAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBwaXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSk7CisjZGVmaW5lIHZwOF9zaG9ydF9pZGN0NHg0bGxtIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2MKKwordm9pZCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpOworI2RlZmluZSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzEgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX2MKKwordm9pZCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KTsKKyNkZWZpbmUgdnA4X3Nob3J0X2ludl93YWxzaDR4NCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X2MKKwordm9pZCB2cDhfZGNfb25seV9pZGN0X2FkZF9jKHNob3J0IGlucHV0LCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgcHJlZF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUpOworI2RlZmluZSB2cDhfZGNfb25seV9pZGN0X2FkZCB2cDhfZGNfb25seV9pZGN0X2FkZF9jCisKK3ZvaWQgdnA4X2NvcHlfbWVtMTZ4MTZfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9jb3B5X21lbTE2eDE2IHZwOF9jb3B5X21lbTE2eDE2X2MKKwordm9pZCB2cDhfY29weV9tZW04eDhfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9jb3B5X21lbTh4OCB2cDhfY29weV9tZW04eDhfYworCit2b2lkIHZwOF9jb3B5X21lbTh4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2NvcHlfbWVtOHg0IHZwOF9jb3B5X21lbTh4NF9jCisKK3ZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfYyhzdHJ1Y3QgbWFjcm9ibG9ja2QgKngsIHVuc2lnbmVkIGNoYXIgKiB5YWJvdmVfcm93LCB1bnNpZ25lZCBjaGFyICogeWxlZnQsIGludCBsZWZ0X3N0cmlkZSwgdW5zaWduZWQgY2hhciAqIHlwcmVkX3B0ciwgaW50IHlfc3RyaWRlKTsKKyNkZWZpbmUgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfYworCit2b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfc19jKHN0cnVjdCBtYWNyb2Jsb2NrZCAqeCwgdW5zaWduZWQgY2hhciAqIHVhYm92ZV9yb3csIHVuc2lnbmVkIGNoYXIgKiB2YWJvdmVfcm93LCAgdW5zaWduZWQgY2hhciAqdWxlZnQsIHVuc2lnbmVkIGNoYXIgKnZsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKiB1cHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKiB2cHJlZF9wdHIsIGludCBwcmVkX3N0cmlkZSk7CisjZGVmaW5lIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcyB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3NfYworCit2b2lkIHZwOF9pbnRyYTR4NF9wcmVkaWN0X2ModW5zaWduZWQgY2hhciAqQWJvdmUsIHVuc2lnbmVkIGNoYXIgKnlsZWZ0LCBpbnQgbGVmdF9zdHJpZGUsIEJfUFJFRElDVElPTl9NT0RFIGJfbW9kZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgdW5zaWduZWQgY2hhciB0b3BfbGVmdCk7CisjZGVmaW5lIHZwOF9pbnRyYTR4NF9wcmVkaWN0IHZwOF9pbnRyYTR4NF9wcmVkaWN0X2MKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2MKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDggdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2MKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2MKKwordm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfYyh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIGludCB4b2ZzdCwgaW50IHlvZnN0LCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3RfcGl0Y2gpOworI2RlZmluZSB2cDhfc2l4dGFwX3ByZWRpY3Q0eDQgdnA4X3NpeHRhcF9wcmVkaWN0NHg0X2MKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3BpdGNoKTsKKyNkZWZpbmUgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNiB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2MKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2MKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2MKKwordm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19waXRjaCwgaW50IHhvZnN0LCBpbnQgeW9mc3QsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCk7CisjZGVmaW5lIHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0IHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTR4NF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlNHg0IHZwOF92YXJpYW5jZTR4NF9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZTh4OCB2cDhfdmFyaWFuY2U4eDhfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHgxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlOHgxNiB2cDhfdmFyaWFuY2U4eDE2X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZTE2eDggdnA4X3ZhcmlhbmNlMTZ4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNngxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlMTZ4MTYgdnA4X3ZhcmlhbmNlMTZ4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIGludCAgeG9mZnNldCwgaW50ICB5b2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgUmVmc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X2MKKwordW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgaW50ICB4b2Zmc2V0LCBpbnQgIHlvZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCBSZWZzdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYworCit1bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9jCisKK3Vuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCBpbnQgIHhvZmZzZXQsIGludCAgeW9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IFJlZnN0cmlkZSwgdW5zaWduZWQgaW50ICpzc2UpOworI2RlZmluZSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2MKKwordW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9jCisKK3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc291cmNlX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNzZSk7CisjZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYworCit1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzb3VyY2Vfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc3NlKTsKKyNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2MKKwordW5zaWduZWQgaW50IHZwOF9zYWQ0eDRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDR4NCB2cDhfc2FkNHg0X2MKKwordW5zaWduZWQgaW50IHZwOF9zYWQ4eDhfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCBtYXhfc2FkKTsKKyNkZWZpbmUgdnA4X3NhZDh4OCB2cDhfc2FkOHg4X2MKKwordW5zaWduZWQgaW50IHZwOF9zYWQ4eDE2X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2IHZwOF9zYWQ4eDE2X2MKKwordW5zaWduZWQgaW50IHZwOF9zYWQxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgbWF4X3NhZCk7CisjZGVmaW5lIHZwOF9zYWQxNng4IHZwOF9zYWQxNng4X2MKKwordW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50IG1heF9zYWQpOworI2RlZmluZSB2cDhfc2FkMTZ4MTYgdnA4X3NhZDE2eDE2X2MKKwordm9pZCB2cDhfc2FkNHg0eDNfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ0eDR4MyB2cDhfc2FkNHg0eDNfYworCit2b2lkIHZwOF9zYWQ4eDh4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4OHgzIHZwOF9zYWQ4eDh4M19jCisKK3ZvaWQgdnA4X3NhZDh4MTZ4M19jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDh4MTZ4MyB2cDhfc2FkOHgxNngzX2MKKwordm9pZCB2cDhfc2FkMTZ4OHgzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4OHgzIHZwOF9zYWQxNng4eDNfYworCit2b2lkIHZwOF9zYWQxNngxNngzX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4MTZ4MyB2cDhfc2FkMTZ4MTZ4M19jCisKK3ZvaWQgdnA4X3NhZDR4NHg4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ0eDR4OCB2cDhfc2FkNHg0eDhfYworCit2b2lkIHZwOF9zYWQ4eDh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkOHg4eDggdnA4X3NhZDh4OHg4X2MKKwordm9pZCB2cDhfc2FkOHgxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2eDggdnA4X3NhZDh4MTZ4OF9jCisKK3ZvaWQgdnA4X3NhZDE2eDh4OF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkMTZ4OHg4IHZwOF9zYWQxNng4eDhfYworCit2b2lkIHZwOF9zYWQxNngxNng4X2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQxNngxNng4IHZwOF9zYWQxNngxNng4X2MKKwordm9pZCB2cDhfc2FkNHg0eDRkX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCByZWZfcHRyW10sIGludCAgcmVmX3N0cmlkZSwgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkpOworI2RlZmluZSB2cDhfc2FkNHg0eDRkIHZwOF9zYWQ0eDR4NGRfYworCit2b2lkIHZwOF9zYWQ4eDh4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDh4NGQgdnA4X3NhZDh4OHg0ZF9jCisKK3ZvaWQgdnA4X3NhZDh4MTZ4NGRfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IHJlZl9wdHJbXSwgaW50ICByZWZfc3RyaWRlLCB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheSk7CisjZGVmaW5lIHZwOF9zYWQ4eDE2eDRkIHZwOF9zYWQ4eDE2eDRkX2MKKwordm9pZCB2cDhfc2FkMTZ4OHg0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDh4NGQgdnA4X3NhZDE2eDh4NGRfYworCit2b2lkIHZwOF9zYWQxNngxNng0ZF9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcmVmX3B0cltdLCBpbnQgIHJlZl9zdHJpZGUsIHVuc2lnbmVkIGludCAqc2FkX2FycmF5KTsKKyNkZWZpbmUgdnA4X3NhZDE2eDE2eDRkIHZwOF9zYWQxNngxNng0ZF9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCisKK3ZvaWQgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGUgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYworCit2b2lkIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYworCit2b2lkIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYworCit2b2lkIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2MKKwordm9pZCB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7CisjZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2MKKwordm9pZCB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jCisKK3ZvaWQgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOworI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2MKKwordm9pZCB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKKyNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2kgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYworCit2b2lkIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX2Moc3RydWN0IHl2MTJfYnVmZmVyX2NvbmZpZyAqeWJmKTsKKyNkZWZpbmUgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfYworCit2b2lkIHZwOF95djEyX2NvcHlfZnJhbWVfYyhzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICpzcmNfeWJjLCBzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICpkc3RfeWJjKTsKKyNkZWZpbmUgdnA4X3l2MTJfY29weV9mcmFtZSB2cDhfeXYxMl9jb3B5X2ZyYW1lX2MKKwordm9pZCB2cDhfeXYxMl9jb3B5X3lfYyhzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICpzcmNfeWJjLCBzdHJ1Y3QgeXYxMl9idWZmZXJfY29uZmlnICpkc3RfeWJjKTsKKyNkZWZpbmUgdnA4X3l2MTJfY29weV95IHZwOF95djEyX2NvcHlfeV9jCisKK3ZvaWQgdnB4X3J0Y2Qodm9pZCk7CisjaW5jbHVkZSAidnB4X2NvbmZpZy5oIgorCisjaWZkZWYgUlRDRF9DCitzdGF0aWMgdm9pZCBzZXR1cF9ydGNkX2ludGVybmFsKHZvaWQpCit7CisKKyNpZiBIQVZFX0RTUFIyCit2b2lkIGRzcHV0aWxfc3RhdGljX2luaXQoKTsKK2RzcHV0aWxfc3RhdGljX2luaXQoKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL21pcHMvdnB4X3ZlcnNpb24uaCBiL21pcHMvdnB4X3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjNkZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWlwcy92cHhfdmVyc2lvbi5oCkBAIC0wLDAgKzEsNyBAQAorI2RlZmluZSBWRVJTSU9OX01BSk9SICAxCisjZGVmaW5lIFZFUlNJT05fTUlOT1IgIDEKKyNkZWZpbmUgVkVSU0lPTl9QQVRDSCAgMAorI2RlZmluZSBWRVJTSU9OX0VYVFJBICAiIgorI2RlZmluZSBWRVJTSU9OX1BBQ0tFRCAoKFZFUlNJT05fTUFKT1I8PDE2KXwoVkVSU0lPTl9NSU5PUjw8OCl8KFZFUlNJT05fUEFUQ0gpKQorI2RlZmluZSBWRVJTSU9OX1NUUklOR19OT1NQICJ2MS4xLjAiCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HICAgICAgIiB2MS4xLjAiCmRpZmYgLS1naXQgYS9uZXN0ZWdnL3NyYy9uZXN0ZWdnLmMgYi9uZXN0ZWdnL3NyYy9uZXN0ZWdnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTBlODMuLjAwMDAwMDAKLS0tIGEvbmVzdGVnZy9zcmMvbmVzdGVnZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IMKpIDIwMTAgTW96aWxsYSBGb3VuZGF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFuIElTQy1zdHlsZSBsaWNlbnNlLiAgU2VlIHRoZQotICogYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBmb3IgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibmVzdGVnZy9oYWxsb2MvaGFsbG9jLmgiCi0jaW5jbHVkZSAibmVzdGVnZy9pbmNsdWRlL25lc3RlZ2cvbmVzdGVnZy5oIgotCi0vKiBFQk1MIEVsZW1lbnRzICovCi0jZGVmaW5lIElEX0VCTUwgICAgICAgICAgICAgICAgIDB4MWE0NWRmYTMKLSNkZWZpbmUgSURfRUJNTF9WRVJTSU9OICAgICAgICAgMHg0Mjg2Ci0jZGVmaW5lIElEX0VCTUxfUkVBRF9WRVJTSU9OICAgIDB4NDJmNwotI2RlZmluZSBJRF9FQk1MX01BWF9JRF9MRU5HVEggICAweDQyZjIKLSNkZWZpbmUgSURfRUJNTF9NQVhfU0laRV9MRU5HVEggMHg0MmYzCi0jZGVmaW5lIElEX0RPQ1RZUEUgICAgICAgICAgICAgIDB4NDI4MgotI2RlZmluZSBJRF9ET0NUWVBFX1ZFUlNJT04gICAgICAweDQyODcKLSNkZWZpbmUgSURfRE9DVFlQRV9SRUFEX1ZFUlNJT04gMHg0Mjg1Ci0KLS8qIEdsb2JhbCBFbGVtZW50cyAqLwotI2RlZmluZSBJRF9WT0lEICAgICAgICAgICAgICAgICAweGVjCi0jZGVmaW5lIElEX0NSQzMyICAgICAgICAgICAgICAgIDB4YmYKLQotLyogV2ViTWVkaWEgRWxlbWVudHMgKi8KLSNkZWZpbmUgSURfU0VHTUVOVCAgICAgICAgICAgICAgMHgxODUzODA2NwotCi0vKiBTZWVrIEhlYWQgRWxlbWVudHMgKi8KLSNkZWZpbmUgSURfU0VFS19IRUFEICAgICAgICAgICAgMHgxMTRkOWI3NAotI2RlZmluZSBJRF9TRUVLICAgICAgICAgICAgICAgICAweDRkYmIKLSNkZWZpbmUgSURfU0VFS19JRCAgICAgICAgICAgICAgMHg1M2FiCi0jZGVmaW5lIElEX1NFRUtfUE9TSVRJT04gICAgICAgIDB4NTNhYwotCi0vKiBJbmZvIEVsZW1lbnRzICovCi0jZGVmaW5lIElEX0lORk8gICAgICAgICAgICAgICAgIDB4MTU0OWE5NjYKLSNkZWZpbmUgSURfVElNRUNPREVfU0NBTEUgICAgICAgMHgyYWQ3YjEKLSNkZWZpbmUgSURfRFVSQVRJT04gICAgICAgICAgICAgMHg0NDg5Ci0KLS8qIENsdXN0ZXIgRWxlbWVudHMgKi8KLSNkZWZpbmUgSURfQ0xVU1RFUiAgICAgICAgICAgICAgMHgxZjQzYjY3NQotI2RlZmluZSBJRF9USU1FQ09ERSAgICAgICAgICAgICAweGU3Ci0jZGVmaW5lIElEX0JMT0NLX0dST1VQICAgICAgICAgIDB4YTAKLSNkZWZpbmUgSURfU0lNUExFX0JMT0NLICAgICAgICAgMHhhMwotCi0vKiBCbG9ja0dyb3VwIEVsZW1lbnRzICovCi0jZGVmaW5lIElEX0JMT0NLICAgICAgICAgICAgICAgIDB4YTEKLSNkZWZpbmUgSURfQkxPQ0tfRFVSQVRJT04gICAgICAgMHg5YgotI2RlZmluZSBJRF9SRUZFUkVOQ0VfQkxPQ0sgICAgICAweGZiCi0KLS8qIFRyYWNrcyBFbGVtZW50cyAqLwotI2RlZmluZSBJRF9UUkFDS1MgICAgICAgICAgICAgICAweDE2NTRhZTZiCi0jZGVmaW5lIElEX1RSQUNLX0VOVFJZICAgICAgICAgIDB4YWUKLSNkZWZpbmUgSURfVFJBQ0tfTlVNQkVSICAgICAgICAgMHhkNwotI2RlZmluZSBJRF9UUkFDS19VSUQgICAgICAgICAgICAweDczYzUKLSNkZWZpbmUgSURfVFJBQ0tfVFlQRSAgICAgICAgICAgMHg4MwotI2RlZmluZSBJRF9GTEFHX0VOQUJMRUQgICAgICAgICAweGI5Ci0jZGVmaW5lIElEX0ZMQUdfREVGQVVMVCAgICAgICAgIDB4ODgKLSNkZWZpbmUgSURfRkxBR19MQUNJTkcgICAgICAgICAgMHg5YwotI2RlZmluZSBJRF9UUkFDS19USU1FQ09ERV9TQ0FMRSAweDIzMzE0ZgotI2RlZmluZSBJRF9MQU5HVUFHRSAgICAgICAgICAgICAweDIyYjU5YwotI2RlZmluZSBJRF9DT0RFQ19JRCAgICAgICAgICAgICAweDg2Ci0jZGVmaW5lIElEX0NPREVDX1BSSVZBVEUgICAgICAgIDB4NjNhMgotCi0vKiBWaWRlbyBFbGVtZW50cyAqLwotI2RlZmluZSBJRF9WSURFTyAgICAgICAgICAgICAgICAweGUwCi0jZGVmaW5lIElEX1BJWEVMX1dJRFRIICAgICAgICAgIDB4YjAKLSNkZWZpbmUgSURfUElYRUxfSEVJR0hUICAgICAgICAgMHhiYQotI2RlZmluZSBJRF9QSVhFTF9DUk9QX0JPVFRPTSAgICAweDU0YWEKLSNkZWZpbmUgSURfUElYRUxfQ1JPUF9UT1AgICAgICAgMHg1NGJiCi0jZGVmaW5lIElEX1BJWEVMX0NST1BfTEVGVCAgICAgIDB4NTRjYwotI2RlZmluZSBJRF9QSVhFTF9DUk9QX1JJR0hUICAgICAweDU0ZGQKLSNkZWZpbmUgSURfRElTUExBWV9XSURUSCAgICAgICAgMHg1NGIwCi0jZGVmaW5lIElEX0RJU1BMQVlfSEVJR0hUICAgICAgIDB4NTRiYQotCi0vKiBBdWRpbyBFbGVtZW50cyAqLwotI2RlZmluZSBJRF9BVURJTyAgICAgICAgICAgICAgICAweGUxCi0jZGVmaW5lIElEX1NBTVBMSU5HX0ZSRVFVRU5DWSAgIDB4YjUKLSNkZWZpbmUgSURfQ0hBTk5FTFMgICAgICAgICAgICAgMHg5ZgotI2RlZmluZSBJRF9CSVRfREVQVEggICAgICAgICAgICAweDYyNjQKLQotLyogQ3VlcyBFbGVtZW50cyAqLwotI2RlZmluZSBJRF9DVUVTICAgICAgICAgICAgICAgICAweDFjNTNiYjZiCi0jZGVmaW5lIElEX0NVRV9QT0lOVCAgICAgICAgICAgIDB4YmIKLSNkZWZpbmUgSURfQ1VFX1RJTUUgICAgICAgICAgICAgMHhiMwotI2RlZmluZSBJRF9DVUVfVFJBQ0tfUE9TSVRJT05TICAweGI3Ci0jZGVmaW5lIElEX0NVRV9UUkFDSyAgICAgICAgICAgIDB4ZjcKLSNkZWZpbmUgSURfQ1VFX0NMVVNURVJfUE9TSVRJT04gMHhmMQotI2RlZmluZSBJRF9DVUVfQkxPQ0tfTlVNQkVSICAgICAweDUzNzgKLQotLyogRUJNTCBUeXBlcyAqLwotZW51bSBlYm1sX3R5cGVfZW51bSB7Ci0gIFRZUEVfVU5LTk9XTiwKLSAgVFlQRV9NQVNURVIsCi0gIFRZUEVfVUlOVCwKLSAgVFlQRV9GTE9BVCwKLSAgVFlQRV9JTlQsCi0gIFRZUEVfU1RSSU5HLAotICBUWVBFX0JJTkFSWQotfTsKLQotI2RlZmluZSBMSU1JVF9TVFJJTkcgICAgICAgICAgICAoMSA8PCAyMCkKLSNkZWZpbmUgTElNSVRfQklOQVJZICAgICAgICAgICAgKDEgPDwgMjQpCi0jZGVmaW5lIExJTUlUX0JMT0NLICAgICAgICAgICAgICgxIDw8IDMwKQotI2RlZmluZSBMSU1JVF9GUkFNRSAgICAgICAgICAgICAoMSA8PCAyOCkKLQotLyogRmllbGQgRmxhZ3MgKi8KLSNkZWZpbmUgREVTQ19GTEFHX05PTkUgICAgICAgICAgMAotI2RlZmluZSBERVNDX0ZMQUdfTVVMVEkgICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBERVNDX0ZMQUdfU1VTUEVORCAgICAgICAoMSA8PCAxKQotI2RlZmluZSBERVNDX0ZMQUdfT0ZGU0VUICAgICAgICAoMSA8PCAyKQotCi0vKiBCbG9jayBIZWFkZXIgRmxhZ3MgKi8KLSNkZWZpbmUgQkxPQ0tfRkxBR1NfTEFDSU5HICAgICAgNgotCi0vKiBMYWNpbmcgQ29uc3RhbnRzICovCi0jZGVmaW5lIExBQ0lOR19OT05FICAgICAgICAgICAgIDAKLSNkZWZpbmUgTEFDSU5HX1hJUEggICAgICAgICAgICAgMQotI2RlZmluZSBMQUNJTkdfRklYRUQgICAgICAgICAgICAyCi0jZGVmaW5lIExBQ0lOR19FQk1MICAgICAgICAgICAgIDMKLQotLyogVHJhY2sgVHlwZXMgKi8KLSNkZWZpbmUgVFJBQ0tfVFlQRV9WSURFTyAgICAgICAgMQotI2RlZmluZSBUUkFDS19UWVBFX0FVRElPICAgICAgICAyCi0KLS8qIFRyYWNrIElEcyAqLwotI2RlZmluZSBUUkFDS19JRF9WUDggICAgICAgICAgICAiVl9WUDgiCi0jZGVmaW5lIFRSQUNLX0lEX1ZPUkJJUyAgICAgICAgICJBX1ZPUkJJUyIKLQotZW51bSB2aW50X21hc2sgewotICBNQVNLX05PTkUsCi0gIE1BU0tfRklSU1RfQklUCi19OwotCi1zdHJ1Y3QgZWJtbF9iaW5hcnkgewotICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgc2l6ZV90IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCBlYm1sX2xpc3Rfbm9kZSB7Ci0gIHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIG5leHQ7Ci0gIHVpbnQ2NF90IGlkOwotICB2b2lkICogZGF0YTsKLX07Ci0KLXN0cnVjdCBlYm1sX2xpc3QgewotICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiBoZWFkOwotICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiB0YWlsOwotfTsKLQotc3RydWN0IGVibWxfdHlwZSB7Ci0gIHVuaW9uIGVibWxfdmFsdWUgewotICAgIHVpbnQ2NF90IHU7Ci0gICAgZG91YmxlIGY7Ci0gICAgaW50NjRfdCBpOwotICAgIGNoYXIgKiBzOwotICAgIHN0cnVjdCBlYm1sX2JpbmFyeSBiOwotICB9IHY7Ci0gIGVudW0gZWJtbF90eXBlX2VudW0gdHlwZTsKLSAgaW50IHJlYWQ7Ci19OwotCi0vKiBFQk1MIERlZmluaXRpb25zICovCi1zdHJ1Y3QgZWJtbCB7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgZWJtbF92ZXJzaW9uOwotICBzdHJ1Y3QgZWJtbF90eXBlIGVibWxfcmVhZF92ZXJzaW9uOwotICBzdHJ1Y3QgZWJtbF90eXBlIGVibWxfbWF4X2lkX2xlbmd0aDsKLSAgc3RydWN0IGVibWxfdHlwZSBlYm1sX21heF9zaXplX2xlbmd0aDsKLSAgc3RydWN0IGVibWxfdHlwZSBkb2N0eXBlOwotICBzdHJ1Y3QgZWJtbF90eXBlIGRvY3R5cGVfdmVyc2lvbjsKLSAgc3RydWN0IGVibWxfdHlwZSBkb2N0eXBlX3JlYWRfdmVyc2lvbjsKLX07Ci0KLS8qIE1hdHJva3NhIERlZmluaXRpb25zICovCi1zdHJ1Y3Qgc2VlayB7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgaWQ7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgcG9zaXRpb247Ci19OwotCi1zdHJ1Y3Qgc2Vla19oZWFkIHsKLSAgc3RydWN0IGVibWxfbGlzdCBzZWVrOwotfTsKLQotc3RydWN0IGluZm8gewotICBzdHJ1Y3QgZWJtbF90eXBlIHRpbWVjb2RlX3NjYWxlOwotICBzdHJ1Y3QgZWJtbF90eXBlIGR1cmF0aW9uOwotfTsKLQotc3RydWN0IGJsb2NrX2dyb3VwIHsKLSAgc3RydWN0IGVibWxfdHlwZSBkdXJhdGlvbjsKLSAgc3RydWN0IGVibWxfdHlwZSByZWZlcmVuY2VfYmxvY2s7Ci19OwotCi1zdHJ1Y3QgY2x1c3RlciB7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgdGltZWNvZGU7Ci0gIHN0cnVjdCBlYm1sX2xpc3QgYmxvY2tfZ3JvdXA7Ci19OwotCi1zdHJ1Y3QgdmlkZW8gewotICBzdHJ1Y3QgZWJtbF90eXBlIHBpeGVsX3dpZHRoOwotICBzdHJ1Y3QgZWJtbF90eXBlIHBpeGVsX2hlaWdodDsKLSAgc3RydWN0IGVibWxfdHlwZSBwaXhlbF9jcm9wX2JvdHRvbTsKLSAgc3RydWN0IGVibWxfdHlwZSBwaXhlbF9jcm9wX3RvcDsKLSAgc3RydWN0IGVibWxfdHlwZSBwaXhlbF9jcm9wX2xlZnQ7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgcGl4ZWxfY3JvcF9yaWdodDsKLSAgc3RydWN0IGVibWxfdHlwZSBkaXNwbGF5X3dpZHRoOwotICBzdHJ1Y3QgZWJtbF90eXBlIGRpc3BsYXlfaGVpZ2h0OwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLSAgc3RydWN0IGVibWxfdHlwZSBzYW1wbGluZ19mcmVxdWVuY3k7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgY2hhbm5lbHM7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgYml0X2RlcHRoOwotfTsKLQotc3RydWN0IHRyYWNrX2VudHJ5IHsKLSAgc3RydWN0IGVibWxfdHlwZSBudW1iZXI7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgdWlkOwotICBzdHJ1Y3QgZWJtbF90eXBlIHR5cGU7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgZmxhZ19lbmFibGVkOwotICBzdHJ1Y3QgZWJtbF90eXBlIGZsYWdfZGVmYXVsdDsKLSAgc3RydWN0IGVibWxfdHlwZSBmbGFnX2xhY2luZzsKLSAgc3RydWN0IGVibWxfdHlwZSB0cmFja190aW1lY29kZV9zY2FsZTsKLSAgc3RydWN0IGVibWxfdHlwZSBsYW5ndWFnZTsKLSAgc3RydWN0IGVibWxfdHlwZSBjb2RlY19pZDsKLSAgc3RydWN0IGVibWxfdHlwZSBjb2RlY19wcml2YXRlOwotICBzdHJ1Y3QgdmlkZW8gdmlkZW87Ci0gIHN0cnVjdCBhdWRpbyBhdWRpbzsKLX07Ci0KLXN0cnVjdCB0cmFja3MgewotICBzdHJ1Y3QgZWJtbF9saXN0IHRyYWNrX2VudHJ5OwotfTsKLQotc3RydWN0IGN1ZV90cmFja19wb3NpdGlvbnMgewotICBzdHJ1Y3QgZWJtbF90eXBlIHRyYWNrOwotICBzdHJ1Y3QgZWJtbF90eXBlIGNsdXN0ZXJfcG9zaXRpb247Ci0gIHN0cnVjdCBlYm1sX3R5cGUgYmxvY2tfbnVtYmVyOwotfTsKLQotc3RydWN0IGN1ZV9wb2ludCB7Ci0gIHN0cnVjdCBlYm1sX3R5cGUgdGltZTsKLSAgc3RydWN0IGVibWxfbGlzdCBjdWVfdHJhY2tfcG9zaXRpb25zOwotfTsKLQotc3RydWN0IGN1ZXMgewotICBzdHJ1Y3QgZWJtbF9saXN0IGN1ZV9wb2ludDsKLX07Ci0KLXN0cnVjdCBzZWdtZW50IHsKLSAgc3RydWN0IGVibWxfbGlzdCBzZWVrX2hlYWQ7Ci0gIHN0cnVjdCBpbmZvIGluZm87Ci0gIHN0cnVjdCBlYm1sX2xpc3QgY2x1c3RlcjsKLSAgc3RydWN0IHRyYWNrcyB0cmFja3M7Ci0gIHN0cnVjdCBjdWVzIGN1ZXM7Ci19OwotCi0vKiBNaXNjLiAqLwotc3RydWN0IHBvb2xfY3R4IHsKLSAgY2hhciBkdW1teTsKLX07Ci0KLXN0cnVjdCBsaXN0X25vZGUgewotICBzdHJ1Y3QgbGlzdF9ub2RlICogcHJldmlvdXM7Ci0gIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIG5vZGU7Ci0gIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotfTsKLQotc3RydWN0IHNhdmVkX3N0YXRlIHsKLSAgaW50NjRfdCBzdHJlYW1fb2Zmc2V0OwotICBzdHJ1Y3QgbGlzdF9ub2RlICogYW5jZXN0b3I7Ci0gIHVpbnQ2NF90IGxhc3RfaWQ7Ci0gIHVpbnQ2NF90IGxhc3Rfc2l6ZTsKLX07Ci0KLXN0cnVjdCBmcmFtZSB7Ci0gIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICBzaXplX3QgbGVuZ3RoOwotICBzdHJ1Y3QgZnJhbWUgKiBuZXh0OwotfTsKLQotLyogUHVibGljIChvcGFxdWUpIFN0cnVjdHVyZXMgKi8KLXN0cnVjdCBuZXN0ZWdnIHsKLSAgbmVzdGVnZ19pbyAqIGlvOwotICBuZXN0ZWdnX2xvZyBsb2c7Ci0gIHN0cnVjdCBwb29sX2N0eCAqIGFsbG9jX3Bvb2w7Ci0gIHVpbnQ2NF90IGxhc3RfaWQ7Ci0gIHVpbnQ2NF90IGxhc3Rfc2l6ZTsKLSAgc3RydWN0IGxpc3Rfbm9kZSAqIGFuY2VzdG9yOwotICBzdHJ1Y3QgZWJtbCBlYm1sOwotICBzdHJ1Y3Qgc2VnbWVudCBzZWdtZW50OwotICBpbnQ2NF90IHNlZ21lbnRfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgdHJhY2tfY291bnQ7Ci19OwotCi1zdHJ1Y3QgbmVzdGVnZ19wYWNrZXQgewotICB1aW50NjRfdCB0cmFjazsKLSAgdWludDY0X3QgdGltZWNvZGU7Ci0gIHN0cnVjdCBmcmFtZSAqIGZyYW1lOwotfTsKLQotLyogRWxlbWVudCBEZXNjcmlwdG9yICovCi1zdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgewotICBjaGFyIGNvbnN0ICogbmFtZTsKLSAgdWludDY0X3QgaWQ7Ci0gIGVudW0gZWJtbF90eXBlX2VudW0gdHlwZTsKLSAgc2l6ZV90IG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotICBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBjaGlsZHJlbjsKLSAgc2l6ZV90IHNpemU7Ci0gIHNpemVfdCBkYXRhX29mZnNldDsKLX07Ci0KLSNkZWZpbmUgRV9GSUVMRChJRCwgVFlQRSwgU1RSVUNULCBGSUVMRCkgXAotICB7ICNJRCwgSUQsIFRZUEUsIG9mZnNldG9mKFNUUlVDVCwgRklFTEQpLCBERVNDX0ZMQUdfTk9ORSwgTlVMTCwgMCwgMCB9Ci0jZGVmaW5lIEVfTUFTVEVSKElELCBUWVBFLCBTVFJVQ1QsIEZJRUxEKSBcCi0gIHsgI0lELCBJRCwgVFlQRSwgb2Zmc2V0b2YoU1RSVUNULCBGSUVMRCksIERFU0NfRkxBR19NVUxUSSwgbmVfICMjIEZJRUxEICMjIF9lbGVtZW50cywgXAotICAgICAgc2l6ZW9mKHN0cnVjdCBGSUVMRCksIDAgfQotI2RlZmluZSBFX1NJTkdMRV9NQVNURVJfTyhJRCwgVFlQRSwgU1RSVUNULCBGSUVMRCkgXAotICB7ICNJRCwgSUQsIFRZUEUsIG9mZnNldG9mKFNUUlVDVCwgRklFTEQpLCBERVNDX0ZMQUdfT0ZGU0VULCBuZV8gIyMgRklFTEQgIyMgX2VsZW1lbnRzLCAwLCBcCi0gICAgICBvZmZzZXRvZihTVFJVQ1QsIEZJRUxEICMjIF9vZmZzZXQpIH0KLSNkZWZpbmUgRV9TSU5HTEVfTUFTVEVSKElELCBUWVBFLCBTVFJVQ1QsIEZJRUxEKSBcCi0gIHsgI0lELCBJRCwgVFlQRSwgb2Zmc2V0b2YoU1RSVUNULCBGSUVMRCksIERFU0NfRkxBR19OT05FLCBuZV8gIyMgRklFTEQgIyMgX2VsZW1lbnRzLCAwLCAwIH0KLSNkZWZpbmUgRV9TVVNQRU5EKElELCBUWVBFKSBcCi0gIHsgI0lELCBJRCwgVFlQRSwgMCwgREVTQ19GTEFHX1NVU1BFTkQsIE5VTEwsIDAsIDAgfQotI2RlZmluZSBFX0xBU1QgXAotICB7IE5VTEwsIDAsIDAsIDAsIERFU0NfRkxBR19OT05FLCBOVUxMLCAwLCAwIH0KLQotLyogRUJNTCBFbGVtZW50IExpc3RzICovCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX2VibWxfZWxlbWVudHNbXSA9IHsKLSAgRV9GSUVMRChJRF9FQk1MX1ZFUlNJT04sIFRZUEVfVUlOVCwgc3RydWN0IGVibWwsIGVibWxfdmVyc2lvbiksCi0gIEVfRklFTEQoSURfRUJNTF9SRUFEX1ZFUlNJT04sIFRZUEVfVUlOVCwgc3RydWN0IGVibWwsIGVibWxfcmVhZF92ZXJzaW9uKSwKLSAgRV9GSUVMRChJRF9FQk1MX01BWF9JRF9MRU5HVEgsIFRZUEVfVUlOVCwgc3RydWN0IGVibWwsIGVibWxfbWF4X2lkX2xlbmd0aCksCi0gIEVfRklFTEQoSURfRUJNTF9NQVhfU0laRV9MRU5HVEgsIFRZUEVfVUlOVCwgc3RydWN0IGVibWwsIGVibWxfbWF4X3NpemVfbGVuZ3RoKSwKLSAgRV9GSUVMRChJRF9ET0NUWVBFLCBUWVBFX1NUUklORywgc3RydWN0IGVibWwsIGRvY3R5cGUpLAotICBFX0ZJRUxEKElEX0RPQ1RZUEVfVkVSU0lPTiwgVFlQRV9VSU5ULCBzdHJ1Y3QgZWJtbCwgZG9jdHlwZV92ZXJzaW9uKSwKLSAgRV9GSUVMRChJRF9ET0NUWVBFX1JFQURfVkVSU0lPTiwgVFlQRV9VSU5ULCBzdHJ1Y3QgZWJtbCwgZG9jdHlwZV9yZWFkX3ZlcnNpb24pLAotICBFX0xBU1QKLX07Ci0KLS8qIFdlYk1lZGlhIEVsZW1lbnQgTGlzdHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfc2Vla19lbGVtZW50c1tdID0gewotICBFX0ZJRUxEKElEX1NFRUtfSUQsIFRZUEVfQklOQVJZLCBzdHJ1Y3Qgc2VlaywgaWQpLAotICBFX0ZJRUxEKElEX1NFRUtfUE9TSVRJT04sIFRZUEVfVUlOVCwgc3RydWN0IHNlZWssIHBvc2l0aW9uKSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX3NlZWtfaGVhZF9lbGVtZW50c1tdID0gewotICBFX01BU1RFUihJRF9TRUVLLCBUWVBFX01BU1RFUiwgc3RydWN0IHNlZWtfaGVhZCwgc2VlayksCi0gIEVfTEFTVAotfTsKLQotc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9pbmZvX2VsZW1lbnRzW10gPSB7Ci0gIEVfRklFTEQoSURfVElNRUNPREVfU0NBTEUsIFRZUEVfVUlOVCwgc3RydWN0IGluZm8sIHRpbWVjb2RlX3NjYWxlKSwKLSAgRV9GSUVMRChJRF9EVVJBVElPTiwgVFlQRV9GTE9BVCwgc3RydWN0IGluZm8sIGR1cmF0aW9uKSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX2Jsb2NrX2dyb3VwX2VsZW1lbnRzW10gPSB7Ci0gIEVfU1VTUEVORChJRF9CTE9DSywgVFlQRV9CSU5BUlkpLAotICBFX0ZJRUxEKElEX0JMT0NLX0RVUkFUSU9OLCBUWVBFX1VJTlQsIHN0cnVjdCBibG9ja19ncm91cCwgZHVyYXRpb24pLAotICBFX0ZJRUxEKElEX1JFRkVSRU5DRV9CTE9DSywgVFlQRV9JTlQsIHN0cnVjdCBibG9ja19ncm91cCwgcmVmZXJlbmNlX2Jsb2NrKSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX2NsdXN0ZXJfZWxlbWVudHNbXSA9IHsKLSAgRV9GSUVMRChJRF9USU1FQ09ERSwgVFlQRV9VSU5ULCBzdHJ1Y3QgY2x1c3RlciwgdGltZWNvZGUpLAotICBFX01BU1RFUihJRF9CTE9DS19HUk9VUCwgVFlQRV9NQVNURVIsIHN0cnVjdCBjbHVzdGVyLCBibG9ja19ncm91cCksCi0gIEVfU1VTUEVORChJRF9TSU1QTEVfQkxPQ0ssIFRZUEVfQklOQVJZKSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX3ZpZGVvX2VsZW1lbnRzW10gPSB7Ci0gIEVfRklFTEQoSURfUElYRUxfV0lEVEgsIFRZUEVfVUlOVCwgc3RydWN0IHZpZGVvLCBwaXhlbF93aWR0aCksCi0gIEVfRklFTEQoSURfUElYRUxfSEVJR0hULCBUWVBFX1VJTlQsIHN0cnVjdCB2aWRlbywgcGl4ZWxfaGVpZ2h0KSwKLSAgRV9GSUVMRChJRF9QSVhFTF9DUk9QX0JPVFRPTSwgVFlQRV9VSU5ULCBzdHJ1Y3QgdmlkZW8sIHBpeGVsX2Nyb3BfYm90dG9tKSwKLSAgRV9GSUVMRChJRF9QSVhFTF9DUk9QX1RPUCwgVFlQRV9VSU5ULCBzdHJ1Y3QgdmlkZW8sIHBpeGVsX2Nyb3BfdG9wKSwKLSAgRV9GSUVMRChJRF9QSVhFTF9DUk9QX0xFRlQsIFRZUEVfVUlOVCwgc3RydWN0IHZpZGVvLCBwaXhlbF9jcm9wX2xlZnQpLAotICBFX0ZJRUxEKElEX1BJWEVMX0NST1BfUklHSFQsIFRZUEVfVUlOVCwgc3RydWN0IHZpZGVvLCBwaXhlbF9jcm9wX3JpZ2h0KSwKLSAgRV9GSUVMRChJRF9ESVNQTEFZX1dJRFRILCBUWVBFX1VJTlQsIHN0cnVjdCB2aWRlbywgZGlzcGxheV93aWR0aCksCi0gIEVfRklFTEQoSURfRElTUExBWV9IRUlHSFQsIFRZUEVfVUlOVCwgc3RydWN0IHZpZGVvLCBkaXNwbGF5X2hlaWdodCksCi0gIEVfTEFTVAotfTsKLQotc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9hdWRpb19lbGVtZW50c1tdID0gewotICBFX0ZJRUxEKElEX1NBTVBMSU5HX0ZSRVFVRU5DWSwgVFlQRV9GTE9BVCwgc3RydWN0IGF1ZGlvLCBzYW1wbGluZ19mcmVxdWVuY3kpLAotICBFX0ZJRUxEKElEX0NIQU5ORUxTLCBUWVBFX1VJTlQsIHN0cnVjdCBhdWRpbywgY2hhbm5lbHMpLAotICBFX0ZJRUxEKElEX0JJVF9ERVBUSCwgVFlQRV9VSU5ULCBzdHJ1Y3QgYXVkaW8sIGJpdF9kZXB0aCksCi0gIEVfTEFTVAotfTsKLQotc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV90cmFja19lbnRyeV9lbGVtZW50c1tdID0gewotICBFX0ZJRUxEKElEX1RSQUNLX05VTUJFUiwgVFlQRV9VSU5ULCBzdHJ1Y3QgdHJhY2tfZW50cnksIG51bWJlciksCi0gIEVfRklFTEQoSURfVFJBQ0tfVUlELCBUWVBFX1VJTlQsIHN0cnVjdCB0cmFja19lbnRyeSwgdWlkKSwKLSAgRV9GSUVMRChJRF9UUkFDS19UWVBFLCBUWVBFX1VJTlQsIHN0cnVjdCB0cmFja19lbnRyeSwgdHlwZSksCi0gIEVfRklFTEQoSURfRkxBR19FTkFCTEVELCBUWVBFX1VJTlQsIHN0cnVjdCB0cmFja19lbnRyeSwgZmxhZ19lbmFibGVkKSwKLSAgRV9GSUVMRChJRF9GTEFHX0RFRkFVTFQsIFRZUEVfVUlOVCwgc3RydWN0IHRyYWNrX2VudHJ5LCBmbGFnX2RlZmF1bHQpLAotICBFX0ZJRUxEKElEX0ZMQUdfTEFDSU5HLCBUWVBFX1VJTlQsIHN0cnVjdCB0cmFja19lbnRyeSwgZmxhZ19sYWNpbmcpLAotICBFX0ZJRUxEKElEX1RSQUNLX1RJTUVDT0RFX1NDQUxFLCBUWVBFX0ZMT0FULCBzdHJ1Y3QgdHJhY2tfZW50cnksIHRyYWNrX3RpbWVjb2RlX3NjYWxlKSwKLSAgRV9GSUVMRChJRF9MQU5HVUFHRSwgVFlQRV9TVFJJTkcsIHN0cnVjdCB0cmFja19lbnRyeSwgbGFuZ3VhZ2UpLAotICBFX0ZJRUxEKElEX0NPREVDX0lELCBUWVBFX1NUUklORywgc3RydWN0IHRyYWNrX2VudHJ5LCBjb2RlY19pZCksCi0gIEVfRklFTEQoSURfQ09ERUNfUFJJVkFURSwgVFlQRV9CSU5BUlksIHN0cnVjdCB0cmFja19lbnRyeSwgY29kZWNfcHJpdmF0ZSksCi0gIEVfU0lOR0xFX01BU1RFUihJRF9WSURFTywgVFlQRV9NQVNURVIsIHN0cnVjdCB0cmFja19lbnRyeSwgdmlkZW8pLAotICBFX1NJTkdMRV9NQVNURVIoSURfQVVESU8sIFRZUEVfTUFTVEVSLCBzdHJ1Y3QgdHJhY2tfZW50cnksIGF1ZGlvKSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX3RyYWNrc19lbGVtZW50c1tdID0gewotICBFX01BU1RFUihJRF9UUkFDS19FTlRSWSwgVFlQRV9NQVNURVIsIHN0cnVjdCB0cmFja3MsIHRyYWNrX2VudHJ5KSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX2N1ZV90cmFja19wb3NpdGlvbnNfZWxlbWVudHNbXSA9IHsKLSAgRV9GSUVMRChJRF9DVUVfVFJBQ0ssIFRZUEVfVUlOVCwgc3RydWN0IGN1ZV90cmFja19wb3NpdGlvbnMsIHRyYWNrKSwKLSAgRV9GSUVMRChJRF9DVUVfQ0xVU1RFUl9QT1NJVElPTiwgVFlQRV9VSU5ULCBzdHJ1Y3QgY3VlX3RyYWNrX3Bvc2l0aW9ucywgY2x1c3Rlcl9wb3NpdGlvbiksCi0gIEVfRklFTEQoSURfQ1VFX0JMT0NLX05VTUJFUiwgVFlQRV9VSU5ULCBzdHJ1Y3QgY3VlX3RyYWNrX3Bvc2l0aW9ucywgYmxvY2tfbnVtYmVyKSwKLSAgRV9MQVNUCi19OwotCi1zdGF0aWMgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjIG5lX2N1ZV9wb2ludF9lbGVtZW50c1tdID0gewotICBFX0ZJRUxEKElEX0NVRV9USU1FLCBUWVBFX1VJTlQsIHN0cnVjdCBjdWVfcG9pbnQsIHRpbWUpLAotICBFX01BU1RFUihJRF9DVUVfVFJBQ0tfUE9TSVRJT05TLCBUWVBFX01BU1RFUiwgc3RydWN0IGN1ZV9wb2ludCwgY3VlX3RyYWNrX3Bvc2l0aW9ucyksCi0gIEVfTEFTVAotfTsKLQotc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV9jdWVzX2VsZW1lbnRzW10gPSB7Ci0gIEVfTUFTVEVSKElEX0NVRV9QT0lOVCwgVFlQRV9NQVNURVIsIHN0cnVjdCBjdWVzLCBjdWVfcG9pbnQpLAotICBFX0xBU1QKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgbmVfc2VnbWVudF9lbGVtZW50c1tdID0gewotICBFX01BU1RFUihJRF9TRUVLX0hFQUQsIFRZUEVfTUFTVEVSLCBzdHJ1Y3Qgc2VnbWVudCwgc2Vla19oZWFkKSwKLSAgRV9TSU5HTEVfTUFTVEVSKElEX0lORk8sIFRZUEVfTUFTVEVSLCBzdHJ1Y3Qgc2VnbWVudCwgaW5mbyksCi0gIEVfTUFTVEVSKElEX0NMVVNURVIsIFRZUEVfTUFTVEVSLCBzdHJ1Y3Qgc2VnbWVudCwgY2x1c3RlciksCi0gIEVfU0lOR0xFX01BU1RFUihJRF9UUkFDS1MsIFRZUEVfTUFTVEVSLCBzdHJ1Y3Qgc2VnbWVudCwgdHJhY2tzKSwKLSAgRV9TSU5HTEVfTUFTVEVSKElEX0NVRVMsIFRZUEVfTUFTVEVSLCBzdHJ1Y3Qgc2VnbWVudCwgY3VlcyksCi0gIEVfTEFTVAotfTsKLQotc3RhdGljIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyBuZV90b3BfbGV2ZWxfZWxlbWVudHNbXSA9IHsKLSAgRV9TSU5HTEVfTUFTVEVSKElEX0VCTUwsIFRZUEVfTUFTVEVSLCBuZXN0ZWdnLCBlYm1sKSwKLSAgRV9TSU5HTEVfTUFTVEVSX08oSURfU0VHTUVOVCwgVFlQRV9NQVNURVIsIG5lc3RlZ2csIHNlZ21lbnQpLAotICBFX0xBU1QKLX07Ci0KLSN1bmRlZiBFX0ZJRUxECi0jdW5kZWYgRV9NQVNURVIKLSN1bmRlZiBFX1NJTkdMRV9NQVNURVJfTwotI3VuZGVmIEVfU0lOR0xFX01BU1RFUgotI3VuZGVmIEVfU1VTUEVORAotI3VuZGVmIEVfTEFTVAotCi1zdGF0aWMgc3RydWN0IHBvb2xfY3R4ICoKLW5lX3Bvb2xfaW5pdCh2b2lkKQotewotICBzdHJ1Y3QgcG9vbF9jdHggKiBwb29sOwotCi0gIHBvb2wgPSBoX21hbGxvYyhzaXplb2YoKnBvb2wpKTsKLSAgaWYgKCFwb29sKQotICAgIGFib3J0KCk7Ci0gIHJldHVybiBwb29sOwotfQotCi1zdGF0aWMgdm9pZAotbmVfcG9vbF9kZXN0cm95KHN0cnVjdCBwb29sX2N0eCAqIHBvb2wpCi17Ci0gIGhfZnJlZShwb29sKTsKLX0KLQotc3RhdGljIHZvaWQgKgotbmVfcG9vbF9hbGxvYyhzaXplX3Qgc2l6ZSwgc3RydWN0IHBvb2xfY3R4ICogcG9vbCkKLXsKLSAgdm9pZCAqIHA7Ci0KLSAgcCA9IGhfbWFsbG9jKHNpemUpOwotICBpZiAoIXApCi0gICAgYWJvcnQoKTsKLSAgaGF0dGFjaChwLCBwb29sKTsKLSAgbWVtc2V0KHAsIDAsIHNpemUpOwotICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHZvaWQgKgotbmVfYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0gIHZvaWQgKiBwOwotCi0gIHAgPSBjYWxsb2MoMSwgc2l6ZSk7Ci0gIGlmICghcCkKLSAgICBhYm9ydCgpOwotICByZXR1cm4gcDsKLX0KLQotc3RhdGljIGludAotbmVfaW9fcmVhZChuZXN0ZWdnX2lvICogaW8sIHZvaWQgKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCi17Ci0gIHJldHVybiBpby0+cmVhZChidWZmZXIsIGxlbmd0aCwgaW8tPnVzZXJkYXRhKTsKLX0KLQotc3RhdGljIGludAotbmVfaW9fc2VlayhuZXN0ZWdnX2lvICogaW8sIGludDY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQotewotICByZXR1cm4gaW8tPnNlZWsob2Zmc2V0LCB3aGVuY2UsIGlvLT51c2VyZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX2lvX3JlYWRfc2tpcChuZXN0ZWdnX2lvICogaW8sIHNpemVfdCBsZW5ndGgpCi17Ci0gIHNpemVfdCBnZXQ7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzgxOTJdOwotICBpbnQgciA9IDE7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICBnZXQgPSBsZW5ndGggPCBzaXplb2YoYnVmKSA/IGxlbmd0aCA6IHNpemVvZihidWYpOwotICAgIHIgPSBuZV9pb19yZWFkKGlvLCBidWYsIGdldCk7Ci0gICAgaWYgKHIgIT0gMSkKLSAgICAgIGJyZWFrOwotICAgIGxlbmd0aCAtPSBnZXQ7Ci0gIH0KLQotICByZXR1cm4gcjsKLX0KLQotc3RhdGljIGludDY0X3QKLW5lX2lvX3RlbGwobmVzdGVnZ19pbyAqIGlvKQotewotICByZXR1cm4gaW8tPnRlbGwoaW8tPnVzZXJkYXRhKTsKLX0KLQotc3RhdGljIGludAotbmVfYmFyZV9yZWFkX3ZpbnQobmVzdGVnZ19pbyAqIGlvLCB1aW50NjRfdCAqIHZhbHVlLCB1aW50NjRfdCAqIGxlbmd0aCwgZW51bSB2aW50X21hc2sgbWFza2ZsYWcpCi17Ci0gIGludCByOwotICB1bnNpZ25lZCBjaGFyIGI7Ci0gIHNpemVfdCBtYXhsZW4gPSA4OwotICB1bnNpZ25lZCBpbnQgY291bnQgPSAxLCBtYXNrID0gMSA8PCA3OwotCi0gIHIgPSBuZV9pb19yZWFkKGlvLCAmYiwgMSk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0KLSAgd2hpbGUgKGNvdW50IDwgbWF4bGVuKSB7Ci0gICAgaWYgKChiICYgbWFzaykgIT0gMCkKLSAgICAgIGJyZWFrOwotICAgIG1hc2sgPj49IDE7Ci0gICAgY291bnQgKz0gMTsKLSAgfQotCi0gIGlmIChsZW5ndGgpCi0gICAgKmxlbmd0aCA9IGNvdW50OwotICAqdmFsdWUgPSBiOwotCi0gIGlmIChtYXNrZmxhZyA9PSBNQVNLX0ZJUlNUX0JJVCkKLSAgICAqdmFsdWUgPSBiICYgfm1hc2s7Ci0KLSAgd2hpbGUgKC0tY291bnQpIHsKLSAgICByID0gbmVfaW9fcmVhZChpbywgJmIsIDEpOwotICAgIGlmIChyICE9IDEpCi0gICAgICByZXR1cm4gcjsKLSAgICAqdmFsdWUgPDw9IDg7Ci0gICAgKnZhbHVlIHw9IGI7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotbmVfcmVhZF9pZChuZXN0ZWdnX2lvICogaW8sIHVpbnQ2NF90ICogdmFsdWUsIHVpbnQ2NF90ICogbGVuZ3RoKQotewotICByZXR1cm4gbmVfYmFyZV9yZWFkX3ZpbnQoaW8sIHZhbHVlLCBsZW5ndGgsIE1BU0tfTk9ORSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3JlYWRfdmludChuZXN0ZWdnX2lvICogaW8sIHVpbnQ2NF90ICogdmFsdWUsIHVpbnQ2NF90ICogbGVuZ3RoKQotewotICByZXR1cm4gbmVfYmFyZV9yZWFkX3ZpbnQoaW8sIHZhbHVlLCBsZW5ndGgsIE1BU0tfRklSU1RfQklUKTsKLX0KLQotc3RhdGljIGludAotbmVfcmVhZF9zdmludChuZXN0ZWdnX2lvICogaW8sIGludDY0X3QgKiB2YWx1ZSwgdWludDY0X3QgKiBsZW5ndGgpCi17Ci0gIGludCByOwotICB1aW50NjRfdCB1dmFsdWU7Ci0gIHVpbnQ2NF90IHVsZW5ndGg7Ci0gIGludDY0X3Qgc3ZpbnRfc3VidHJbXSA9IHsKLSAgICAweDNmLCAweDFmZmYsCi0gICAgMHhmZmZmZiwgMHg3ZmZmZmZmLAotICAgIDB4M2ZmZmZmZmZmTEwsIDB4MWZmZmZmZmZmZmZMTCwKLSAgICAweGZmZmZmZmZmZmZmZkxMLCAweDdmZmZmZmZmZmZmZmZmTEwKLSAgfTsKLQotICByID0gbmVfYmFyZV9yZWFkX3ZpbnQoaW8sICZ1dmFsdWUsICZ1bGVuZ3RoLCBNQVNLX0ZJUlNUX0JJVCk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0gICp2YWx1ZSA9IHV2YWx1ZSAtIHN2aW50X3N1YnRyW3VsZW5ndGggLSAxXTsKLSAgaWYgKGxlbmd0aCkKLSAgICAqbGVuZ3RoID0gdWxlbmd0aDsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3JlYWRfdWludChuZXN0ZWdnX2lvICogaW8sIHVpbnQ2NF90ICogdmFsLCB1aW50NjRfdCBsZW5ndGgpCi17Ci0gIHVuc2lnbmVkIGNoYXIgYjsKLSAgaW50IHI7Ci0KLSAgaWYgKGxlbmd0aCA9PSAwIHx8IGxlbmd0aCA+IDgpCi0gICAgcmV0dXJuIC0xOwotICByID0gbmVfaW9fcmVhZChpbywgJmIsIDEpOwotICBpZiAociAhPSAxKQotICAgIHJldHVybiByOwotICAqdmFsID0gYjsKLSAgd2hpbGUgKC0tbGVuZ3RoKSB7Ci0gICAgciA9IG5lX2lvX3JlYWQoaW8sICZiLCAxKTsKLSAgICBpZiAociAhPSAxKQotICAgICAgcmV0dXJuIHI7Ci0gICAgKnZhbCA8PD0gODsKLSAgICAqdmFsIHw9IGI7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3JlYWRfaW50KG5lc3RlZ2dfaW8gKiBpbywgaW50NjRfdCAqIHZhbCwgdWludDY0X3QgbGVuZ3RoKQotewotICBpbnQgcjsKLSAgdWludDY0X3QgdXZhbCwgYmFzZTsKLQotICByID0gbmVfcmVhZF91aW50KGlvLCAmdXZhbCwgbGVuZ3RoKTsKLSAgaWYgKHIgIT0gMSkKLSAgICByZXR1cm4gcjsKLQotICBpZiAobGVuZ3RoIDwgc2l6ZW9mKGludDY0X3QpKSB7Ci0gICAgYmFzZSA9IDE7Ci0gICAgYmFzZSA8PD0gbGVuZ3RoICogOCAtIDE7Ci0gICAgaWYgKHV2YWwgPj0gYmFzZSkgewotICAgICAgICBiYXNlID0gMTsKLSAgICAgICAgYmFzZSA8PD0gbGVuZ3RoICogODsKLSAgICB9IGVsc2UgewotICAgICAgYmFzZSA9IDA7Ci0gICAgfQotICAgICp2YWwgPSB1dmFsIC0gYmFzZTsKLSAgfSBlbHNlIHsKLSAgICAqdmFsID0gKGludDY0X3QpIHV2YWw7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotbmVfcmVhZF9mbG9hdChuZXN0ZWdnX2lvICogaW8sIGRvdWJsZSAqIHZhbCwgdWludDY0X3QgbGVuZ3RoKQotewotICB1bmlvbiB7Ci0gICAgdWludDY0X3QgdTsKLSAgICBmbG9hdCBmOwotICAgIGRvdWJsZSBkOwotICB9IHZhbHVlOwotICBpbnQgcjsKLQotICAvKiBsZW5ndGggPT0gMTAgbm90IGltcGxlbWVudGVkICovCi0gIGlmIChsZW5ndGggIT0gNCAmJiBsZW5ndGggIT0gOCkKLSAgICByZXR1cm4gLTE7Ci0gIHIgPSBuZV9yZWFkX3VpbnQoaW8sICZ2YWx1ZS51LCBsZW5ndGgpOwotICBpZiAociAhPSAxKQotICAgIHJldHVybiByOwotICBpZiAobGVuZ3RoID09IDQpCi0gICAgKnZhbCA9IHZhbHVlLmY7Ci0gIGVsc2UKLSAgICAqdmFsID0gdmFsdWUuZDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3JlYWRfc3RyaW5nKG5lc3RlZ2cgKiBjdHgsIGNoYXIgKiogdmFsLCB1aW50NjRfdCBsZW5ndGgpCi17Ci0gIGNoYXIgKiBzdHI7Ci0gIGludCByOwotCi0gIGlmIChsZW5ndGggPT0gMCB8fCBsZW5ndGggPiBMSU1JVF9TVFJJTkcpCi0gICAgcmV0dXJuIC0xOwotICBzdHIgPSBuZV9wb29sX2FsbG9jKGxlbmd0aCArIDEsIGN0eC0+YWxsb2NfcG9vbCk7Ci0gIHIgPSBuZV9pb19yZWFkKGN0eC0+aW8sICh1bnNpZ25lZCBjaGFyICopIHN0ciwgbGVuZ3RoKTsKLSAgaWYgKHIgIT0gMSkKLSAgICByZXR1cm4gcjsKLSAgc3RyW2xlbmd0aF0gPSAnXDAnOwotICAqdmFsID0gc3RyOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotbmVfcmVhZF9iaW5hcnkobmVzdGVnZyAqIGN0eCwgc3RydWN0IGVibWxfYmluYXJ5ICogdmFsLCB1aW50NjRfdCBsZW5ndGgpCi17Ci0gIGlmIChsZW5ndGggPT0gMCB8fCBsZW5ndGggPiBMSU1JVF9CSU5BUlkpCi0gICAgcmV0dXJuIC0xOwotICB2YWwtPmRhdGEgPSBuZV9wb29sX2FsbG9jKGxlbmd0aCwgY3R4LT5hbGxvY19wb29sKTsKLSAgdmFsLT5sZW5ndGggPSBsZW5ndGg7Ci0gIHJldHVybiBuZV9pb19yZWFkKGN0eC0+aW8sIHZhbC0+ZGF0YSwgbGVuZ3RoKTsKLX0KLQotc3RhdGljIGludAotbmVfZ2V0X3VpbnQoc3RydWN0IGVibWxfdHlwZSB0eXBlLCB1aW50NjRfdCAqIHZhbHVlKQotewotICBpZiAoIXR5cGUucmVhZCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgYXNzZXJ0KHR5cGUudHlwZSA9PSBUWVBFX1VJTlQpOwotCi0gICp2YWx1ZSA9IHR5cGUudi51OwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1uZV9nZXRfZmxvYXQoc3RydWN0IGVibWxfdHlwZSB0eXBlLCBkb3VibGUgKiB2YWx1ZSkKLXsKLSAgaWYgKCF0eXBlLnJlYWQpCi0gICAgcmV0dXJuIC0xOwotCi0gIGFzc2VydCh0eXBlLnR5cGUgPT0gVFlQRV9GTE9BVCk7Ci0KLSAgKnZhbHVlID0gdHlwZS52LmY7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX2dldF9zdHJpbmcoc3RydWN0IGVibWxfdHlwZSB0eXBlLCBjaGFyICoqIHZhbHVlKQotewotICBpZiAoIXR5cGUucmVhZCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgYXNzZXJ0KHR5cGUudHlwZSA9PSBUWVBFX1NUUklORyk7Ci0KLSAgKnZhbHVlID0gdHlwZS52LnM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX2dldF9iaW5hcnkoc3RydWN0IGVibWxfdHlwZSB0eXBlLCBzdHJ1Y3QgZWJtbF9iaW5hcnkgKiB2YWx1ZSkKLXsKLSAgaWYgKCF0eXBlLnJlYWQpCi0gICAgcmV0dXJuIC0xOwotCi0gIGFzc2VydCh0eXBlLnR5cGUgPT0gVFlQRV9CSU5BUlkpOwotCi0gICp2YWx1ZSA9IHR5cGUudi5iOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1uZV9pc19hbmNlc3Rvcl9lbGVtZW50KHVpbnQ2NF90IGlkLCBzdHJ1Y3QgbGlzdF9ub2RlICogYW5jZXN0b3IpCi17Ci0gIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIGVsZW1lbnQ7Ci0KLSAgZm9yICg7IGFuY2VzdG9yOyBhbmNlc3RvciA9IGFuY2VzdG9yLT5wcmV2aW91cykKLSAgICBmb3IgKGVsZW1lbnQgPSBhbmNlc3Rvci0+bm9kZTsgZWxlbWVudC0+aWQ7ICsrZWxlbWVudCkKLSAgICAgIGlmIChlbGVtZW50LT5pZCA9PSBpZCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKgotbmVfZmluZF9lbGVtZW50KHVpbnQ2NF90IGlkLCBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBlbGVtZW50cykKLXsKLSAgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjICogZWxlbWVudDsKLQotICBmb3IgKGVsZW1lbnQgPSBlbGVtZW50czsgZWxlbWVudC0+aWQ7ICsrZWxlbWVudCkKLSAgICBpZiAoZWxlbWVudC0+aWQgPT0gaWQpCi0gICAgICByZXR1cm4gZWxlbWVudDsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLW5lX2N0eF9wdXNoKG5lc3RlZ2cgKiBjdHgsIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIGFuY2VzdG9yLCB2b2lkICogZGF0YSkKLXsKLSAgc3RydWN0IGxpc3Rfbm9kZSAqIGl0ZW07Ci0KLSAgaXRlbSA9IG5lX2FsbG9jKHNpemVvZigqaXRlbSkpOwotICBpdGVtLT5wcmV2aW91cyA9IGN0eC0+YW5jZXN0b3I7Ci0gIGl0ZW0tPm5vZGUgPSBhbmNlc3RvcjsKLSAgaXRlbS0+ZGF0YSA9IGRhdGE7Ci0gIGN0eC0+YW5jZXN0b3IgPSBpdGVtOwotfQotCi1zdGF0aWMgdm9pZAotbmVfY3R4X3BvcChuZXN0ZWdnICogY3R4KQotewotICBzdHJ1Y3QgbGlzdF9ub2RlICogaXRlbTsKLQotICBpdGVtID0gY3R4LT5hbmNlc3RvcjsKLSAgY3R4LT5hbmNlc3RvciA9IGl0ZW0tPnByZXZpb3VzOwotICBmcmVlKGl0ZW0pOwotfQotCi1zdGF0aWMgaW50Ci1uZV9jdHhfc2F2ZShuZXN0ZWdnICogY3R4LCBzdHJ1Y3Qgc2F2ZWRfc3RhdGUgKiBzKQotewotICBzLT5zdHJlYW1fb2Zmc2V0ID0gbmVfaW9fdGVsbChjdHgtPmlvKTsKLSAgaWYgKHMtPnN0cmVhbV9vZmZzZXQgPCAwKQotICAgIHJldHVybiAtMTsKLSAgcy0+YW5jZXN0b3IgPSBjdHgtPmFuY2VzdG9yOwotICBzLT5sYXN0X2lkID0gY3R4LT5sYXN0X2lkOwotICBzLT5sYXN0X3NpemUgPSBjdHgtPmxhc3Rfc2l6ZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX2N0eF9yZXN0b3JlKG5lc3RlZ2cgKiBjdHgsIHN0cnVjdCBzYXZlZF9zdGF0ZSAqIHMpCi17Ci0gIGludCByOwotCi0gIHIgPSBuZV9pb19zZWVrKGN0eC0+aW8sIHMtPnN0cmVhbV9vZmZzZXQsIE5FU1RFR0dfU0VFS19TRVQpOwotICBpZiAociAhPSAwKQotICAgIHJldHVybiAtMTsKLSAgY3R4LT5hbmNlc3RvciA9IHMtPmFuY2VzdG9yOwotICBjdHgtPmxhc3RfaWQgPSBzLT5sYXN0X2lkOwotICBjdHgtPmxhc3Rfc2l6ZSA9IHMtPmxhc3Rfc2l6ZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3BlZWtfZWxlbWVudChuZXN0ZWdnICogY3R4LCB1aW50NjRfdCAqIGlkLCB1aW50NjRfdCAqIHNpemUpCi17Ci0gIGludCByOwotCi0gIGlmIChjdHgtPmxhc3RfaWQgJiYgY3R4LT5sYXN0X3NpemUpIHsKLSAgICBpZiAoaWQpCi0gICAgICAqaWQgPSBjdHgtPmxhc3RfaWQ7Ci0gICAgaWYgKHNpemUpCi0gICAgICAqc2l6ZSA9IGN0eC0+bGFzdF9zaXplOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgciA9IG5lX3JlYWRfaWQoY3R4LT5pbywgJmN0eC0+bGFzdF9pZCwgTlVMTCk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0KLSAgciA9IG5lX3JlYWRfdmludChjdHgtPmlvLCAmY3R4LT5sYXN0X3NpemUsIE5VTEwpOwotICBpZiAociAhPSAxKQotICAgIHJldHVybiByOwotCi0gIGlmIChpZCkKLSAgICAqaWQgPSBjdHgtPmxhc3RfaWQ7Ci0gIGlmIChzaXplKQotICAgICpzaXplID0gY3R4LT5sYXN0X3NpemU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3JlYWRfZWxlbWVudChuZXN0ZWdnICogY3R4LCB1aW50NjRfdCAqIGlkLCB1aW50NjRfdCAqIHNpemUpCi17Ci0gIGludCByOwotCi0gIHIgPSBuZV9wZWVrX2VsZW1lbnQoY3R4LCBpZCwgc2l6ZSk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0KLSAgY3R4LT5sYXN0X2lkID0gMDsKLSAgY3R4LT5sYXN0X3NpemUgPSAwOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotbmVfcmVhZF9tYXN0ZXIobmVzdGVnZyAqIGN0eCwgc3RydWN0IGVibWxfZWxlbWVudF9kZXNjICogZGVzYykKLXsKLSAgc3RydWN0IGVibWxfbGlzdCAqIGxpc3Q7Ci0gIHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIG5vZGUsICogb2xkdGFpbDsKLQotICBhc3NlcnQoZGVzYy0+dHlwZSA9PSBUWVBFX01BU1RFUiAmJiBkZXNjLT5mbGFncyAmIERFU0NfRkxBR19NVUxUSSk7Ci0KLSAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgIm11bHRpIG1hc3RlciBlbGVtZW50ICVsbHggKCVzKSIsCi0gICAgICAgICAgIGRlc2MtPmlkLCBkZXNjLT5uYW1lKTsKLQotICBsaXN0ID0gKHN0cnVjdCBlYm1sX2xpc3QgKikgKGN0eC0+YW5jZXN0b3ItPmRhdGEgKyBkZXNjLT5vZmZzZXQpOwotCi0gIG5vZGUgPSBuZV9wb29sX2FsbG9jKHNpemVvZigqbm9kZSksIGN0eC0+YWxsb2NfcG9vbCk7Ci0gIG5vZGUtPmlkID0gZGVzYy0+aWQ7Ci0gIG5vZGUtPmRhdGEgPSBuZV9wb29sX2FsbG9jKGRlc2MtPnNpemUsIGN0eC0+YWxsb2NfcG9vbCk7Ci0KLSAgb2xkdGFpbCA9IGxpc3QtPnRhaWw7Ci0gIGlmIChvbGR0YWlsKQotICAgIG9sZHRhaWwtPm5leHQgPSBub2RlOwotICBsaXN0LT50YWlsID0gbm9kZTsKLSAgaWYgKCFsaXN0LT5oZWFkKQotICAgIGxpc3QtPmhlYWQgPSBub2RlOwotCi0gIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICIgLT4gdXNpbmcgZGF0YSAlcCIsIG5vZGUtPmRhdGEpOwotCi0gIG5lX2N0eF9wdXNoKGN0eCwgZGVzYy0+Y2hpbGRyZW4sIG5vZGUtPmRhdGEpOwotfQotCi1zdGF0aWMgdm9pZAotbmVfcmVhZF9zaW5nbGVfbWFzdGVyKG5lc3RlZ2cgKiBjdHgsIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIGRlc2MpCi17Ci0gIGFzc2VydChkZXNjLT50eXBlID09IFRZUEVfTUFTVEVSICYmICEoZGVzYy0+ZmxhZ3MgJiBERVNDX0ZMQUdfTVVMVEkpKTsKLQotICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAic2luZ2xlIG1hc3RlciBlbGVtZW50ICVsbHggKCVzKSIsCi0gICAgICAgICAgIGRlc2MtPmlkLCBkZXNjLT5uYW1lKTsKLSAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgIiAtPiB1c2luZyBkYXRhICVwICgldSkiLAotICAgICAgICAgICBjdHgtPmFuY2VzdG9yLT5kYXRhICsgZGVzYy0+b2Zmc2V0LCBkZXNjLT5vZmZzZXQpOwotCi0gIG5lX2N0eF9wdXNoKGN0eCwgZGVzYy0+Y2hpbGRyZW4sIGN0eC0+YW5jZXN0b3ItPmRhdGEgKyBkZXNjLT5vZmZzZXQpOwotfQotCi1zdGF0aWMgaW50Ci1uZV9yZWFkX3NpbXBsZShuZXN0ZWdnICogY3R4LCBzdHJ1Y3QgZWJtbF9lbGVtZW50X2Rlc2MgKiBkZXNjLCBzaXplX3QgbGVuZ3RoKQotewotICBzdHJ1Y3QgZWJtbF90eXBlICogc3RvcmFnZTsKLSAgaW50IHI7Ci0KLSAgc3RvcmFnZSA9IChzdHJ1Y3QgZWJtbF90eXBlICopIChjdHgtPmFuY2VzdG9yLT5kYXRhICsgZGVzYy0+b2Zmc2V0KTsKLQotICBpZiAoc3RvcmFnZS0+cmVhZCkgewotICAgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJlbGVtZW50ICVsbHggKCVzKSBhbHJlYWR5IHJlYWQsIHNraXBwaW5nIiwKLSAgICAgICAgICAgICBkZXNjLT5pZCwgZGVzYy0+bmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdG9yYWdlLT50eXBlID0gZGVzYy0+dHlwZTsKLQotICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAiZWxlbWVudCAlbGx4ICglcykgLT4gJXAgKCV1KSIsCi0gICAgICAgICAgIGRlc2MtPmlkLCBkZXNjLT5uYW1lLCBzdG9yYWdlLCBkZXNjLT5vZmZzZXQpOwotCi0gIHIgPSAtMTsKLQotICBzd2l0Y2ggKGRlc2MtPnR5cGUpIHsKLSAgY2FzZSBUWVBFX1VJTlQ6Ci0gICAgciA9IG5lX3JlYWRfdWludChjdHgtPmlvLCAmc3RvcmFnZS0+di51LCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBjYXNlIFRZUEVfRkxPQVQ6Ci0gICAgciA9IG5lX3JlYWRfZmxvYXQoY3R4LT5pbywgJnN0b3JhZ2UtPnYuZiwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgY2FzZSBUWVBFX0lOVDoKLSAgICByID0gbmVfcmVhZF9pbnQoY3R4LT5pbywgJnN0b3JhZ2UtPnYuaSwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgY2FzZSBUWVBFX1NUUklORzoKLSAgICByID0gbmVfcmVhZF9zdHJpbmcoY3R4LCAmc3RvcmFnZS0+di5zLCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBjYXNlIFRZUEVfQklOQVJZOgotICAgIHIgPSBuZV9yZWFkX2JpbmFyeShjdHgsICZzdG9yYWdlLT52LmIsIGxlbmd0aCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFlQRV9NQVNURVI6Ci0gIGNhc2UgVFlQRV9VTktOT1dOOgotICAgIGFzc2VydCgwKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGlmIChyID09IDEpCi0gICAgc3RvcmFnZS0+cmVhZCA9IDE7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3BhcnNlKG5lc3RlZ2cgKiBjdHgsIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIHRvcF9sZXZlbCkKLXsKLSAgaW50IHI7Ci0gIGludDY0X3QgKiBkYXRhX29mZnNldDsKLSAgdWludDY0X3QgaWQsIHNpemU7Ci0gIHN0cnVjdCBlYm1sX2VsZW1lbnRfZGVzYyAqIGVsZW1lbnQ7Ci0KLSAgLyogbG9vcCB1bnRpbCB3ZSBuZWVkIHRvIHJldHVybjoKLSAgICAgLSBoaXQgc3VzcGVuZCBwb2ludAotICAgICAtIHBhcnNlIGNvbXBsZXRlCi0gICAgIC0gZXJyb3Igb2NjdXJyZWQgKi8KLQotICAvKiBsb29wIG92ZXIgZWxlbWVudHMgYXQgY3VycmVudCBsZXZlbCByZWFkaW5nIHRoZW0gaWYgc3VibGV2ZWwgZm91bmQsCi0gICAgIHB1c2ggY3R4IG9udG8gc3RhY2sgYW5kIGNvbnRpbnVlIGlmIHN1YmxldmVsIGVuZGVkLCBwb3AgY3R4IG9mZiBzdGFjawotICAgICBhbmQgY29udGludWUgKi8KLQotICBpZiAoIWN0eC0+YW5jZXN0b3IpCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoOzspIHsKLSAgICByID0gbmVfcGVla19lbGVtZW50KGN0eCwgJmlkLCAmc2l6ZSk7Ci0gICAgaWYgKHIgIT0gMSkKLSAgICAgIGJyZWFrOwotCi0gICAgZWxlbWVudCA9IG5lX2ZpbmRfZWxlbWVudChpZCwgY3R4LT5hbmNlc3Rvci0+bm9kZSk7Ci0gICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgIGlmIChlbGVtZW50LT5mbGFncyAmIERFU0NfRkxBR19TVVNQRU5EKSB7Ci0gICAgICAgIGFzc2VydChlbGVtZW50LT50eXBlID09IFRZUEVfQklOQVJZKTsKLSAgICAgICAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgInN1c3BlbmQgcGFyc2UgYXQgJWxseCIsIGlkKTsKLSAgICAgICAgciA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByID0gbmVfcmVhZF9lbGVtZW50KGN0eCwgJmlkLCAmc2l6ZSk7Ci0gICAgICBpZiAociAhPSAxKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKGVsZW1lbnQtPmZsYWdzICYgREVTQ19GTEFHX09GRlNFVCkgewotICAgICAgICBkYXRhX29mZnNldCA9IChpbnQ2NF90ICopIChjdHgtPmFuY2VzdG9yLT5kYXRhICsgZWxlbWVudC0+ZGF0YV9vZmZzZXQpOwotICAgICAgICAqZGF0YV9vZmZzZXQgPSBuZV9pb190ZWxsKGN0eC0+aW8pOwotICAgICAgICBpZiAoKmRhdGFfb2Zmc2V0IDwgMCkgewotICAgICAgICAgIHIgPSAtMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZWxlbWVudC0+dHlwZSA9PSBUWVBFX01BU1RFUikgewotICAgICAgICBpZiAoZWxlbWVudC0+ZmxhZ3MgJiBERVNDX0ZMQUdfTVVMVEkpCi0gICAgICAgICAgbmVfcmVhZF9tYXN0ZXIoY3R4LCBlbGVtZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5lX3JlYWRfc2luZ2xlX21hc3RlcihjdHgsIGVsZW1lbnQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHIgPSBuZV9yZWFkX3NpbXBsZShjdHgsIGVsZW1lbnQsIHNpemUpOwotICAgICAgICBpZiAociA8IDApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChuZV9pc19hbmNlc3Rvcl9lbGVtZW50KGlkLCBjdHgtPmFuY2VzdG9yLT5wcmV2aW91cykpIHsKLSAgICAgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJwYXJlbnQgZWxlbWVudCAlbGx4IiwgaWQpOwotICAgICAgaWYgKHRvcF9sZXZlbCAmJiBjdHgtPmFuY2VzdG9yLT5ub2RlID09IHRvcF9sZXZlbCkgewotICAgICAgICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAiKioqIHBhcnNlIGFib3V0IHRvIGJhY2sgdXAgcGFzdCB0b3BfbGV2ZWwiKTsKLSAgICAgICAgciA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbmVfY3R4X3BvcChjdHgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByID0gbmVfcmVhZF9lbGVtZW50KGN0eCwgJmlkLCAmc2l6ZSk7Ci0gICAgICBpZiAociAhPSAxKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKGlkICE9IElEX1ZPSUQgJiYgaWQgIT0gSURfQ1JDMzIpCi0gICAgICAgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJ1bmtub3duIGVsZW1lbnQgJWxseCIsIGlkKTsKLSAgICAgIHIgPSBuZV9pb19yZWFkX3NraXAoY3R4LT5pbywgc2l6ZSk7Ci0gICAgICBpZiAociAhPSAxKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAociAhPSAxKQotICAgIHdoaWxlIChjdHgtPmFuY2VzdG9yKQotICAgICAgbmVfY3R4X3BvcChjdHgpOwotCi0gIHJldHVybiByOwotfQotCi1zdGF0aWMgdWludDY0X3QKLW5lX3hpcGhfbGFjZV92YWx1ZSh1bnNpZ25lZCBjaGFyICoqIG5wKQotewotICB1aW50NjRfdCBsYWNlOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgdW5zaWduZWQgY2hhciAqIHAgPSAqbnA7Ci0KLSAgbGFjZSA9ICpwKys7Ci0gIHZhbHVlID0gbGFjZTsKLSAgd2hpbGUgKGxhY2UgPT0gMjU1KSB7Ci0gICAgbGFjZSA9ICpwKys7Ci0gICAgdmFsdWUgKz0gbGFjZTsKLSAgfQotCi0gICpucCA9IHA7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50Ci1uZV9yZWFkX3hpcGhfbGFjZV92YWx1ZShuZXN0ZWdnX2lvICogaW8sIHVpbnQ2NF90ICogdmFsdWUsIHNpemVfdCAqIGNvbnN1bWVkKQotewotICBpbnQgcjsKLSAgdWludDY0X3QgbGFjZTsKLQotICByID0gbmVfcmVhZF91aW50KGlvLCAmbGFjZSwgMSk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0gICpjb25zdW1lZCArPSAxOwotCi0gICp2YWx1ZSA9IGxhY2U7Ci0gIHdoaWxlIChsYWNlID09IDI1NSkgewotICAgIHIgPSBuZV9yZWFkX3VpbnQoaW8sICZsYWNlLCAxKTsKLSAgICBpZiAociAhPSAxKQotICAgICAgcmV0dXJuIHI7Ci0gICAgKmNvbnN1bWVkICs9IDE7Ci0gICAgKnZhbHVlICs9IGxhY2U7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotbmVfcmVhZF94aXBoX2xhY2luZyhuZXN0ZWdnX2lvICogaW8sIHNpemVfdCBibG9jaywgc2l6ZV90ICogcmVhZCwgdWludDY0X3QgbiwgdWludDY0X3QgKiBzaXplcykKLXsKLSAgaW50IHI7Ci0gIHNpemVfdCBpID0gMDsKLSAgdWludDY0X3Qgc3VtID0gMDsKLQotICB3aGlsZSAoLS1uKSB7Ci0gICAgciA9IG5lX3JlYWRfeGlwaF9sYWNlX3ZhbHVlKGlvLCAmc2l6ZXNbaV0sIHJlYWQpOwotICAgIGlmIChyICE9IDEpCi0gICAgICByZXR1cm4gcjsKLSAgICBzdW0gKz0gc2l6ZXNbaV07Ci0gICAgaSArPSAxOwotICB9Ci0KLSAgaWYgKCpyZWFkICsgc3VtID4gYmxvY2spCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIGxhc3QgZnJhbWUgaXMgdGhlIHJlbWFpbmRlciBvZiB0aGUgYmxvY2sgKi8KLSAgc2l6ZXNbaV0gPSBibG9jayAtICpyZWFkIC0gc3VtOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotbmVfcmVhZF9lYm1sX2xhY2luZyhuZXN0ZWdnX2lvICogaW8sIHNpemVfdCBibG9jaywgc2l6ZV90ICogcmVhZCwgdWludDY0X3QgbiwgdWludDY0X3QgKiBzaXplcykKLXsKLSAgaW50IHI7Ci0gIHVpbnQ2NF90IGxhY2UsIHN1bSwgbGVuZ3RoOwotICBpbnQ2NF90IHNsYWNlOwotICBzaXplX3QgaSA9IDA7Ci0KLSAgciA9IG5lX3JlYWRfdmludChpbywgJmxhY2UsICZsZW5ndGgpOwotICBpZiAociAhPSAxKQotICAgIHJldHVybiByOwotICAqcmVhZCArPSBsZW5ndGg7Ci0KLSAgc2l6ZXNbaV0gPSBsYWNlOwotICBzdW0gPSBzaXplc1tpXTsKLQotICBpICs9IDE7Ci0gIG4gLT0gMTsKLQotICB3aGlsZSAoLS1uKSB7Ci0gICAgciA9IG5lX3JlYWRfc3ZpbnQoaW8sICZzbGFjZSwgJmxlbmd0aCk7Ci0gICAgaWYgKHIgIT0gMSkKLSAgICAgIHJldHVybiByOwotICAgICpyZWFkICs9IGxlbmd0aDsKLSAgICBzaXplc1tpXSA9IHNpemVzW2kgLSAxXSArIHNsYWNlOwotICAgIHN1bSArPSBzaXplc1tpXTsKLSAgICBpICs9IDE7Ci0gIH0KLQotICBpZiAoKnJlYWQgKyBzdW0gPiBibG9jaykKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogbGFzdCBmcmFtZSBpcyB0aGUgcmVtYWluZGVyIG9mIHRoZSBibG9jayAqLwotICBzaXplc1tpXSA9IGJsb2NrIC0gKnJlYWQgLSBzdW07Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdWludDY0X3QKLW5lX2dldF90aW1lY29kZV9zY2FsZShuZXN0ZWdnICogY3R4KQotewotICB1aW50NjRfdCBzY2FsZTsKLQotICBpZiAobmVfZ2V0X3VpbnQoY3R4LT5zZWdtZW50LmluZm8udGltZWNvZGVfc2NhbGUsICZzY2FsZSkgIT0gMCkKLSAgICBzY2FsZSA9IDEwMDAwMDA7Ci0KLSAgcmV0dXJuIHNjYWxlOwotfQotCi1zdGF0aWMgc3RydWN0IHRyYWNrX2VudHJ5ICoKLW5lX2ZpbmRfdHJhY2tfZW50cnkobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50IHRyYWNrKQotewotICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiBub2RlOwotICB1bnNpZ25lZCBpbnQgdHJhY2tzID0gMDsKLQotICBub2RlID0gY3R4LT5zZWdtZW50LnRyYWNrcy50cmFja19lbnRyeS5oZWFkOwotICB3aGlsZSAobm9kZSkgewotICAgIGFzc2VydChub2RlLT5pZCA9PSBJRF9UUkFDS19FTlRSWSk7Ci0gICAgaWYgKHRyYWNrID09IHRyYWNrcykKLSAgICAgIHJldHVybiBub2RlLT5kYXRhOwotICAgIHRyYWNrcyArPSAxOwotICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX3JlYWRfYmxvY2sobmVzdGVnZyAqIGN0eCwgdWludDY0X3QgYmxvY2tfaWQsIHVpbnQ2NF90IGJsb2NrX3NpemUsIG5lc3RlZ2dfcGFja2V0ICoqIGRhdGEpCi17Ci0gIGludCByOwotICBpbnQ2NF90IHRpbWVjb2RlLCBhYnNfdGltZWNvZGU7Ci0gIG5lc3RlZ2dfcGFja2V0ICogcGt0OwotICBzdHJ1Y3QgY2x1c3RlciAqIGNsdXN0ZXI7Ci0gIHN0cnVjdCBmcmFtZSAqIGYsICogbGFzdDsKLSAgc3RydWN0IHRyYWNrX2VudHJ5ICogZW50cnk7Ci0gIGRvdWJsZSB0cmFja19zY2FsZTsKLSAgdWludDY0X3QgdHJhY2ssIGxlbmd0aCwgZnJhbWVfc2l6ZXNbMjU2XSwgY2x1c3Rlcl90YywgZmxhZ3MsIGZyYW1lcywgdGNfc2NhbGUsIHRvdGFsOwotICB1bnNpZ25lZCBpbnQgaSwgbGFjaW5nOwotICBzaXplX3QgY29uc3VtZWQgPSAwOwotCi0gICpkYXRhID0gTlVMTDsKLQotICBpZiAoYmxvY2tfc2l6ZSA+IExJTUlUX0JMT0NLKQotICAgIHJldHVybiAtMTsKLQotICByID0gbmVfcmVhZF92aW50KGN0eC0+aW8sICZ0cmFjaywgJmxlbmd0aCk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0KLSAgaWYgKHRyYWNrID09IDAgfHwgdHJhY2sgPiBjdHgtPnRyYWNrX2NvdW50KQotICAgIHJldHVybiAtMTsKLQotICBjb25zdW1lZCArPSBsZW5ndGg7Ci0KLSAgciA9IG5lX3JlYWRfaW50KGN0eC0+aW8sICZ0aW1lY29kZSwgMik7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0KLSAgY29uc3VtZWQgKz0gMjsKLQotICByID0gbmVfcmVhZF91aW50KGN0eC0+aW8sICZmbGFncywgMSk7Ci0gIGlmIChyICE9IDEpCi0gICAgcmV0dXJuIHI7Ci0KLSAgY29uc3VtZWQgKz0gMTsKLQotICBmcmFtZXMgPSAwOwotCi0gIC8qIGZsYWdzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBibG9jayBhbmQgc2ltcGxlYmxvY2ssIGJ1dCBsYWNpbmcgaXMKLSAgICAgZW5jb2RlZCB0aGUgc2FtZSB3YXkgKi8KLSAgbGFjaW5nID0gKGZsYWdzICYgQkxPQ0tfRkxBR1NfTEFDSU5HKSA+PiAxOwotCi0gIHN3aXRjaCAobGFjaW5nKSB7Ci0gIGNhc2UgTEFDSU5HX05PTkU6Ci0gICAgZnJhbWVzID0gMTsKLSAgICBicmVhazsKLSAgY2FzZSBMQUNJTkdfWElQSDoKLSAgY2FzZSBMQUNJTkdfRklYRUQ6Ci0gIGNhc2UgTEFDSU5HX0VCTUw6Ci0gICAgciA9IG5lX3JlYWRfdWludChjdHgtPmlvLCAmZnJhbWVzLCAxKTsKLSAgICBpZiAociAhPSAxKQotICAgICAgcmV0dXJuIHI7Ci0gICAgY29uc3VtZWQgKz0gMTsKLSAgICBmcmFtZXMgKz0gMTsKLSAgfQotCi0gIGlmIChmcmFtZXMgPiAyNTYpCi0gICAgcmV0dXJuIC0xOwotCi0gIHN3aXRjaCAobGFjaW5nKSB7Ci0gIGNhc2UgTEFDSU5HX05PTkU6Ci0gICAgZnJhbWVfc2l6ZXNbMF0gPSBibG9ja19zaXplIC0gY29uc3VtZWQ7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgTEFDSU5HX1hJUEg6Ci0gICAgaWYgKGZyYW1lcyA9PSAxKQotICAgICAgcmV0dXJuIC0xOwotICAgIHIgPSBuZV9yZWFkX3hpcGhfbGFjaW5nKGN0eC0+aW8sIGJsb2NrX3NpemUsICZjb25zdW1lZCwgZnJhbWVzLCBmcmFtZV9zaXplcyk7Ci0gICAgaWYgKHIgIT0gMSkKLSAgICAgIHJldHVybiByOwotICAgIGJyZWFrOwotICBjYXNlIExBQ0lOR19GSVhFRDoKLSAgICBpZiAoKGJsb2NrX3NpemUgLSBjb25zdW1lZCkgJSBmcmFtZXMpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZyYW1lczsgKytpKQotICAgICAgZnJhbWVfc2l6ZXNbaV0gPSAoYmxvY2tfc2l6ZSAtIGNvbnN1bWVkKSAvIGZyYW1lczsKLSAgICBicmVhazsKLSAgY2FzZSBMQUNJTkdfRUJNTDoKLSAgICBpZiAoZnJhbWVzID09IDEpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgciA9IG5lX3JlYWRfZWJtbF9sYWNpbmcoY3R4LT5pbywgYmxvY2tfc2l6ZSwgJmNvbnN1bWVkLCBmcmFtZXMsIGZyYW1lX3NpemVzKTsKLSAgICBpZiAociAhPSAxKQotICAgICAgcmV0dXJuIHI7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBzYW5pdHkgY2hlY2sgdW5sYWNlZCBmcmFtZSBzaXplcyBhZ2FpbnN0IHRvdGFsIGJsb2NrIHNpemUuICovCi0gIHRvdGFsID0gY29uc3VtZWQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkKLSAgICB0b3RhbCArPSBmcmFtZV9zaXplc1tpXTsKLSAgaWYgKHRvdGFsID4gYmxvY2tfc2l6ZSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZW50cnkgPSBuZV9maW5kX3RyYWNrX2VudHJ5KGN0eCwgdHJhY2sgLSAxKTsKLSAgaWYgKCFlbnRyeSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgdHJhY2tfc2NhbGUgPSAxLjA7Ci0KLSAgdGNfc2NhbGUgPSBuZV9nZXRfdGltZWNvZGVfc2NhbGUoY3R4KTsKLQotICBhc3NlcnQoY3R4LT5zZWdtZW50LmNsdXN0ZXIudGFpbC0+aWQgPT0gSURfQ0xVU1RFUik7Ci0gIGNsdXN0ZXIgPSBjdHgtPnNlZ21lbnQuY2x1c3Rlci50YWlsLT5kYXRhOwotICBpZiAobmVfZ2V0X3VpbnQoY2x1c3Rlci0+dGltZWNvZGUsICZjbHVzdGVyX3RjKSAhPSAwKQotICAgIHJldHVybiAtMTsKLQotICBhYnNfdGltZWNvZGUgPSB0aW1lY29kZSArIGNsdXN0ZXJfdGM7Ci0gIGlmIChhYnNfdGltZWNvZGUgPCAwKQotICAgIHJldHVybiAtMTsKLQotICBwa3QgPSBuZV9hbGxvYyhzaXplb2YoKnBrdCkpOwotICBwa3QtPnRyYWNrID0gdHJhY2sgLSAxOwotICBwa3QtPnRpbWVjb2RlID0gYWJzX3RpbWVjb2RlICogdGNfc2NhbGUgKiB0cmFja19zY2FsZTsKLQotICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAiJXNibG9jayB0ICVsbGQgcHRzICVmIGYgJWxseCBmcmFtZXM6ICVsbHUiLAotICAgICAgICAgICBibG9ja19pZCA9PSBJRF9CTE9DSyA/ICIiIDogInNpbXBsZSIsIHBrdC0+dHJhY2ssIHBrdC0+dGltZWNvZGUgLyAxZTksIGZsYWdzLCBmcmFtZXMpOwotCi0gIGxhc3QgPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKLSAgICBpZiAoZnJhbWVfc2l6ZXNbaV0gPiBMSU1JVF9GUkFNRSkgewotICAgICAgbmVzdGVnZ19mcmVlX3BhY2tldChwa3QpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBmID0gbmVfYWxsb2Moc2l6ZW9mKCpmKSk7Ci0gICAgZi0+ZGF0YSA9IG5lX2FsbG9jKGZyYW1lX3NpemVzW2ldKTsKLSAgICBmLT5sZW5ndGggPSBmcmFtZV9zaXplc1tpXTsKLSAgICByID0gbmVfaW9fcmVhZChjdHgtPmlvLCBmLT5kYXRhLCBmcmFtZV9zaXplc1tpXSk7Ci0gICAgaWYgKHIgIT0gMSkgewotICAgICAgZnJlZShmLT5kYXRhKTsKLSAgICAgIGZyZWUoZik7Ci0gICAgICBuZXN0ZWdnX2ZyZWVfcGFja2V0KHBrdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKCFsYXN0KQotICAgICAgcGt0LT5mcmFtZSA9IGY7Ci0gICAgZWxzZQotICAgICAgbGFzdC0+bmV4dCA9IGY7Ci0gICAgbGFzdCA9IGY7Ci0gIH0KLQotICAqZGF0YSA9IHBrdDsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHVpbnQ2NF90Ci1uZV9idWZfcmVhZF9pZCh1bnNpZ25lZCBjaGFyIGNvbnN0ICogcCwgc2l6ZV90IGxlbmd0aCkKLXsKLSAgdWludDY0X3QgaWQgPSAwOwotCi0gIHdoaWxlIChsZW5ndGgtLSkgewotICAgIGlkIDw8PSA4OwotICAgIGlkIHw9ICpwKys7Ci0gIH0KLQotICByZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VlayAqCi1uZV9maW5kX3NlZWtfZm9yX2lkKHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIHNlZWtfaGVhZCwgdWludDY0X3QgaWQpCi17Ci0gIHN0cnVjdCBlYm1sX2xpc3QgKiBoZWFkOwotICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiBzZWVrOwotICBzdHJ1Y3QgZWJtbF9iaW5hcnkgYmluYXJ5X2lkOwotICBzdHJ1Y3Qgc2VlayAqIHM7Ci0KLSAgd2hpbGUgKHNlZWtfaGVhZCkgewotICAgIGFzc2VydChzZWVrX2hlYWQtPmlkID09IElEX1NFRUtfSEVBRCk7Ci0gICAgaGVhZCA9IHNlZWtfaGVhZC0+ZGF0YTsKLSAgICBzZWVrID0gaGVhZC0+aGVhZDsKLQotICAgIHdoaWxlIChzZWVrKSB7Ci0gICAgICBhc3NlcnQoc2Vlay0+aWQgPT0gSURfU0VFSyk7Ci0gICAgICBzID0gc2Vlay0+ZGF0YTsKLQotICAgICAgaWYgKG5lX2dldF9iaW5hcnkocy0+aWQsICZiaW5hcnlfaWQpID09IDAgJiYKLSAgICAgICAgICBuZV9idWZfcmVhZF9pZChiaW5hcnlfaWQuZGF0YSwgYmluYXJ5X2lkLmxlbmd0aCkgPT0gaWQpCi0gICAgICAgIHJldHVybiBzOwotCi0gICAgICBzZWVrID0gc2Vlay0+bmV4dDsKLSAgICB9Ci0KLSAgICBzZWVrX2hlYWQgPSBzZWVrX2hlYWQtPm5leHQ7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBjdWVfcG9pbnQgKgotbmVfZmluZF9jdWVfcG9pbnRfZm9yX3RzdGFtcChzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiBjdWVfcG9pbnQsIHVpbnQ2NF90IHNjYWxlLCB1aW50NjRfdCB0c3RhbXApCi17Ci0gIHVpbnQ2NF90IHRpbWU7Ci0gIHN0cnVjdCBjdWVfcG9pbnQgKiBjLCAqIHByZXYgPSBOVUxMOwotCi0gIHdoaWxlIChjdWVfcG9pbnQpIHsKLSAgICBhc3NlcnQoY3VlX3BvaW50LT5pZCA9PSBJRF9DVUVfUE9JTlQpOwotICAgIGMgPSBjdWVfcG9pbnQtPmRhdGE7Ci0KLSAgICBpZiAoIXByZXYpCi0gICAgICBwcmV2ID0gYzsKLQotICAgIGlmIChuZV9nZXRfdWludChjLT50aW1lLCAmdGltZSkgPT0gMCAmJiB0aW1lICogc2NhbGUgPiB0c3RhbXApCi0gICAgICBicmVhazsKLQotICAgIHByZXYgPSBjdWVfcG9pbnQtPmRhdGE7Ci0gICAgY3VlX3BvaW50ID0gY3VlX3BvaW50LT5uZXh0OwotICB9Ci0KLSAgcmV0dXJuIHByZXY7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lX2lzX3N1c3BlbmRfZWxlbWVudCh1aW50NjRfdCBpZCkKLXsKLSAgLyogdGhpcyBjb3VsZCBzZWFyY2ggdGhlIHRyZWUgb2YgZWxlbWVudHMgZm9yIERFU0NfRkxBR19TVVNQRU5EICovCi0gIGlmIChpZCA9PSBJRF9TSU1QTEVfQkxPQ0sgfHwgaWQgPT0gSURfQkxPQ0spCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotbmVfbnVsbF9sb2dfY2FsbGJhY2sobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50IHNldmVyaXR5LCBjaGFyIGNvbnN0ICogZm10LCAuLi4pCi17Ci0gIGlmIChjdHggJiYgc2V2ZXJpdHkgJiYgZm10KQotICAgIHJldHVybjsKLX0KLQotaW50Ci1uZXN0ZWdnX2luaXQobmVzdGVnZyAqKiBjb250ZXh0LCBuZXN0ZWdnX2lvIGlvLCBuZXN0ZWdnX2xvZyBjYWxsYmFjaykKLXsKLSAgaW50IHI7Ci0gIHVpbnQ2NF90IGlkLCB2ZXJzaW9uLCBkb2N2ZXJzaW9uOwotICBzdHJ1Y3QgZWJtbF9saXN0X25vZGUgKiB0cmFjazsKLSAgY2hhciAqIGRvY3R5cGU7Ci0gIG5lc3RlZ2cgKiBjdHggPSBOVUxMOwotCi0gIGlmICghKGlvLnJlYWQgJiYgaW8uc2VlayAmJiBpby50ZWxsKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgY3R4ID0gbmVfYWxsb2Moc2l6ZW9mKCpjdHgpKTsKLQotICBjdHgtPmlvID0gbmVfYWxsb2Moc2l6ZW9mKCpjdHgtPmlvKSk7Ci0gICpjdHgtPmlvID0gaW87Ci0gIGN0eC0+bG9nID0gY2FsbGJhY2s7Ci0gIGN0eC0+YWxsb2NfcG9vbCA9IG5lX3Bvb2xfaW5pdCgpOwotCi0gIGlmICghY3R4LT5sb2cpCi0gICAgY3R4LT5sb2cgPSBuZV9udWxsX2xvZ19jYWxsYmFjazsKLQotICByID0gbmVfcGVla19lbGVtZW50KGN0eCwgJmlkLCBOVUxMKTsKLSAgaWYgKHIgIT0gMSkgewotICAgIG5lc3RlZ2dfZGVzdHJveShjdHgpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChpZCAhPSBJRF9FQk1MKSB7Ci0gICAgbmVzdGVnZ19kZXN0cm95KGN0eCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgY3R4LT5sb2coY3R4LCBORVNURUdHX0xPR19ERUJVRywgImN0eCAlcCIsIGN0eCk7Ci0KLSAgbmVfY3R4X3B1c2goY3R4LCBuZV90b3BfbGV2ZWxfZWxlbWVudHMsIGN0eCk7Ci0KLSAgciA9IG5lX3BhcnNlKGN0eCwgTlVMTCk7Ci0KLSAgaWYgKHIgIT0gMSkgewotICAgIG5lc3RlZ2dfZGVzdHJveShjdHgpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChuZV9nZXRfdWludChjdHgtPmVibWwuZWJtbF9yZWFkX3ZlcnNpb24sICZ2ZXJzaW9uKSAhPSAwKQotICAgIHZlcnNpb24gPSAxOwotICBpZiAodmVyc2lvbiAhPSAxKSB7Ci0gICAgbmVzdGVnZ19kZXN0cm95KGN0eCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKG5lX2dldF9zdHJpbmcoY3R4LT5lYm1sLmRvY3R5cGUsICZkb2N0eXBlKSAhPSAwKQotICAgIGRvY3R5cGUgPSAibWF0cm9za2EiOwotICBpZiAoc3RyY21wKGRvY3R5cGUsICJ3ZWJtIikgIT0gMCkgewotICAgIG5lc3RlZ2dfZGVzdHJveShjdHgpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChuZV9nZXRfdWludChjdHgtPmVibWwuZG9jdHlwZV9yZWFkX3ZlcnNpb24sICZkb2N2ZXJzaW9uKSAhPSAwKQotICAgIGRvY3ZlcnNpb24gPSAxOwotICBpZiAoZG9jdmVyc2lvbiA8IDEgfHwgZG9jdmVyc2lvbiA+IDIpIHsKLSAgICBuZXN0ZWdnX2Rlc3Ryb3koY3R4KTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoIWN0eC0+c2VnbWVudC50cmFja3MudHJhY2tfZW50cnkuaGVhZCkgewotICAgIG5lc3RlZ2dfZGVzdHJveShjdHgpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHRyYWNrID0gY3R4LT5zZWdtZW50LnRyYWNrcy50cmFja19lbnRyeS5oZWFkOwotICBjdHgtPnRyYWNrX2NvdW50ID0gMDsKLQotICB3aGlsZSAodHJhY2spIHsKLSAgICBjdHgtPnRyYWNrX2NvdW50ICs9IDE7Ci0gICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKLSAgfQotCi0gICpjb250ZXh0ID0gY3R4OwotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1uZXN0ZWdnX2Rlc3Ryb3kobmVzdGVnZyAqIGN0eCkKLXsKLSAgd2hpbGUgKGN0eC0+YW5jZXN0b3IpCi0gICAgbmVfY3R4X3BvcChjdHgpOwotICBuZV9wb29sX2Rlc3Ryb3koY3R4LT5hbGxvY19wb29sKTsKLSAgZnJlZShjdHgtPmlvKTsKLSAgZnJlZShjdHgpOwotfQotCi1pbnQKLW5lc3RlZ2dfZHVyYXRpb24obmVzdGVnZyAqIGN0eCwgdWludDY0X3QgKiBkdXJhdGlvbikKLXsKLSAgdWludDY0X3QgdGNfc2NhbGU7Ci0gIGRvdWJsZSB1bnNjYWxlZF9kdXJhdGlvbjsKLQotICBpZiAobmVfZ2V0X2Zsb2F0KGN0eC0+c2VnbWVudC5pbmZvLmR1cmF0aW9uLCAmdW5zY2FsZWRfZHVyYXRpb24pICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHRjX3NjYWxlID0gbmVfZ2V0X3RpbWVjb2RlX3NjYWxlKGN0eCk7Ci0KLSAgKmR1cmF0aW9uID0gKHVpbnQ2NF90KSAodW5zY2FsZWRfZHVyYXRpb24gKiB0Y19zY2FsZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLW5lc3RlZ2dfdHN0YW1wX3NjYWxlKG5lc3RlZ2cgKiBjdHgsIHVpbnQ2NF90ICogc2NhbGUpCi17Ci0gICpzY2FsZSA9IG5lX2dldF90aW1lY29kZV9zY2FsZShjdHgpOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1uZXN0ZWdnX3RyYWNrX2NvdW50KG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCAqIHRyYWNrcykKLXsKLSAgKnRyYWNrcyA9IGN0eC0+dHJhY2tfY291bnQ7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLW5lc3RlZ2dfdHJhY2tfc2VlayhuZXN0ZWdnICogY3R4LCB1bnNpZ25lZCBpbnQgdHJhY2ssIHVpbnQ2NF90IHRzdGFtcCkKLXsKLSAgaW50IHI7Ci0gIHN0cnVjdCBjdWVfcG9pbnQgKiBjdWVfcG9pbnQ7Ci0gIHN0cnVjdCBjdWVfdHJhY2tfcG9zaXRpb25zICogcG9zOwotICBzdHJ1Y3Qgc2F2ZWRfc3RhdGUgc3RhdGU7Ci0gIHN0cnVjdCBzZWVrICogZm91bmQ7Ci0gIHVpbnQ2NF90IHNlZWtfcG9zLCB0Y19zY2FsZSwgdCwgaWQ7Ci0gIHN0cnVjdCBlYm1sX2xpc3Rfbm9kZSAqIG5vZGUgPSBjdHgtPnNlZ21lbnQuY3Vlcy5jdWVfcG9pbnQuaGVhZDsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gY3VlcyBsb2FkZWQsIGNoZWNrIGZvciBjdWVzIGVsZW1lbnQgaW4gdGhlIHNlZWsgaGVhZAotICAgICBhbmQgbG9hZCBpdC4gKi8KLSAgaWYgKCFub2RlKSB7Ci0gICAgZm91bmQgPSBuZV9maW5kX3NlZWtfZm9yX2lkKGN0eC0+c2VnbWVudC5zZWVrX2hlYWQuaGVhZCwgSURfQ1VFUyk7Ci0gICAgaWYgKCFmb3VuZCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChuZV9nZXRfdWludChmb3VuZC0+cG9zaXRpb24sICZzZWVrX3BvcykgIT0gMCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIFNhdmUgb2xkIHBhcnNlciBzdGF0ZS4gKi8KLSAgICByID0gbmVfY3R4X3NhdmUoY3R4LCAmc3RhdGUpOwotICAgIGlmIChyICE9IDApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBTZWVrIGFuZCBzZXQgdXAgcGFyc2VyIHN0YXRlIGZvciBzZWdtZW50LWxldmVsIGVsZW1lbnQgKEN1ZXMpLiAqLwotICAgIHIgPSBuZV9pb19zZWVrKGN0eC0+aW8sIGN0eC0+c2VnbWVudF9vZmZzZXQgKyBzZWVrX3BvcywgTkVTVEVHR19TRUVLX1NFVCk7Ci0gICAgaWYgKHIgIT0gMCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBjdHgtPmxhc3RfaWQgPSAwOwotICAgIGN0eC0+bGFzdF9zaXplID0gMDsKLQotICAgIHIgPSBuZV9yZWFkX2VsZW1lbnQoY3R4LCAmaWQsIE5VTEwpOwotICAgIGlmIChyICE9IDEpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoaWQgIT0gSURfQ1VFUykKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGN0eC0+YW5jZXN0b3IgPSBOVUxMOwotICAgIG5lX2N0eF9wdXNoKGN0eCwgbmVfdG9wX2xldmVsX2VsZW1lbnRzLCBjdHgpOwotICAgIG5lX2N0eF9wdXNoKGN0eCwgbmVfc2VnbWVudF9lbGVtZW50cywgJmN0eC0+c2VnbWVudCk7Ci0gICAgbmVfY3R4X3B1c2goY3R4LCBuZV9jdWVzX2VsZW1lbnRzLCAmY3R4LT5zZWdtZW50LmN1ZXMpOwotICAgIC8qIHBhcnNlciB3aWxsIHJ1biB1bnRpbCBlbmQgb2YgY3VlcyBlbGVtZW50LiAqLwotICAgIGN0eC0+bG9nKGN0eCwgTkVTVEVHR19MT0dfREVCVUcsICJzZWVrOiBwYXJzaW5nIGN1ZSBlbGVtZW50cyIpOwotICAgIHIgPSBuZV9wYXJzZShjdHgsIG5lX2N1ZXNfZWxlbWVudHMpOwotICAgIHdoaWxlIChjdHgtPmFuY2VzdG9yKQotICAgICAgbmVfY3R4X3BvcChjdHgpOwotCi0gICAgLyogUmVzZXQgcGFyc2VyIHN0YXRlIHRvIG9yaWdpbmFsIHN0YXRlIGFuZCBzZWVrIGJhY2sgdG8gb2xkIHBvc2l0aW9uLiAqLwotICAgIGlmIChuZV9jdHhfcmVzdG9yZShjdHgsICZzdGF0ZSkgIT0gMCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChyIDwgMCkKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHRjX3NjYWxlID0gbmVfZ2V0X3RpbWVjb2RlX3NjYWxlKGN0eCk7Ci0KLSAgY3VlX3BvaW50ID0gbmVfZmluZF9jdWVfcG9pbnRfZm9yX3RzdGFtcChjdHgtPnNlZ21lbnQuY3Vlcy5jdWVfcG9pbnQuaGVhZCwgdGNfc2NhbGUsIHRzdGFtcCk7Ci0gIGlmICghY3VlX3BvaW50KQotICAgIHJldHVybiAtMTsKLQotICBub2RlID0gY3VlX3BvaW50LT5jdWVfdHJhY2tfcG9zaXRpb25zLmhlYWQ7Ci0KLSAgc2Vla19wb3MgPSAwOwotCi0gIHdoaWxlIChub2RlKSB7Ci0gICAgYXNzZXJ0KG5vZGUtPmlkID09IElEX0NVRV9UUkFDS19QT1NJVElPTlMpOwotICAgIHBvcyA9IG5vZGUtPmRhdGE7Ci0gICAgaWYgKG5lX2dldF91aW50KHBvcy0+dHJhY2ssICZ0KSA9PSAwICYmIHQgLSAxID09IHRyYWNrKSB7Ci0gICAgICBpZiAobmVfZ2V0X3VpbnQocG9zLT5jbHVzdGVyX3Bvc2l0aW9uLCAmc2Vla19wb3MpICE9IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgfQotCi0gIC8qIFNlZWsgYW5kIHNldCB1cCBwYXJzZXIgc3RhdGUgZm9yIHNlZ21lbnQtbGV2ZWwgZWxlbWVudCAoQ2x1c3RlcikuICovCi0gIHIgPSBuZV9pb19zZWVrKGN0eC0+aW8sIGN0eC0+c2VnbWVudF9vZmZzZXQgKyBzZWVrX3BvcywgTkVTVEVHR19TRUVLX1NFVCk7Ci0gIGlmIChyICE9IDApCi0gICAgcmV0dXJuIC0xOwotICBjdHgtPmxhc3RfaWQgPSAwOwotICBjdHgtPmxhc3Rfc2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKGN0eC0+YW5jZXN0b3IpCi0gICAgbmVfY3R4X3BvcChjdHgpOwotCi0gIG5lX2N0eF9wdXNoKGN0eCwgbmVfdG9wX2xldmVsX2VsZW1lbnRzLCBjdHgpOwotICBuZV9jdHhfcHVzaChjdHgsIG5lX3NlZ21lbnRfZWxlbWVudHMsICZjdHgtPnNlZ21lbnQpOwotICBjdHgtPmxvZyhjdHgsIE5FU1RFR0dfTE9HX0RFQlVHLCAic2VlazogcGFyc2luZyBjbHVzdGVyIGVsZW1lbnRzIik7Ci0gIHIgPSBuZV9wYXJzZShjdHgsIE5VTEwpOwotICBpZiAociAhPSAxKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoIW5lX2lzX3N1c3BlbmRfZWxlbWVudChjdHgtPmxhc3RfaWQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1uZXN0ZWdnX3RyYWNrX3R5cGUobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50IHRyYWNrKQotewotICBzdHJ1Y3QgdHJhY2tfZW50cnkgKiBlbnRyeTsKLSAgdWludDY0X3QgdHlwZTsKLQotICBlbnRyeSA9IG5lX2ZpbmRfdHJhY2tfZW50cnkoY3R4LCB0cmFjayk7Ci0gIGlmICghZW50cnkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuZV9nZXRfdWludChlbnRyeS0+dHlwZSwgJnR5cGUpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmICh0eXBlICYgVFJBQ0tfVFlQRV9WSURFTykKLSAgICByZXR1cm4gTkVTVEVHR19UUkFDS19WSURFTzsKLQotICBpZiAodHlwZSAmIFRSQUNLX1RZUEVfQVVESU8pCi0gICAgcmV0dXJuIE5FU1RFR0dfVFJBQ0tfQVVESU87Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLW5lc3RlZ2dfdHJhY2tfY29kZWNfaWQobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50IHRyYWNrKQotewotICBjaGFyICogY29kZWNfaWQ7Ci0gIHN0cnVjdCB0cmFja19lbnRyeSAqIGVudHJ5OwotCi0gIGVudHJ5ID0gbmVfZmluZF90cmFja19lbnRyeShjdHgsIHRyYWNrKTsKLSAgaWYgKCFlbnRyeSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG5lX2dldF9zdHJpbmcoZW50cnktPmNvZGVjX2lkLCAmY29kZWNfaWQpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzdHJjbXAoY29kZWNfaWQsIFRSQUNLX0lEX1ZQOCkgPT0gMCkKLSAgICByZXR1cm4gTkVTVEVHR19DT0RFQ19WUDg7Ci0KLSAgaWYgKHN0cmNtcChjb2RlY19pZCwgVFJBQ0tfSURfVk9SQklTKSA9PSAwKQotICAgIHJldHVybiBORVNURUdHX0NPREVDX1ZPUkJJUzsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotbmVzdGVnZ190cmFja19jb2RlY19kYXRhX2NvdW50KG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCB0cmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBjb3VudCkKLXsKLSAgc3RydWN0IHRyYWNrX2VudHJ5ICogZW50cnk7Ci0gIHN0cnVjdCBlYm1sX2JpbmFyeSBjb2RlY19wcml2YXRlOwotICB1bnNpZ25lZCBjaGFyICogcDsKLQotICAqY291bnQgPSAwOwotCi0gIGVudHJ5ID0gbmVfZmluZF90cmFja19lbnRyeShjdHgsIHRyYWNrKTsKLSAgaWYgKCFlbnRyeSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG5lc3RlZ2dfdHJhY2tfY29kZWNfaWQoY3R4LCB0cmFjaykgIT0gTkVTVEVHR19DT0RFQ19WT1JCSVMpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuZV9nZXRfYmluYXJ5KGVudHJ5LT5jb2RlY19wcml2YXRlLCAmY29kZWNfcHJpdmF0ZSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGNvZGVjX3ByaXZhdGUubGVuZ3RoIDwgMSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcCA9IGNvZGVjX3ByaXZhdGUuZGF0YTsKLSAgKmNvdW50ID0gKnAgKyAxOwotCi0gIGlmICgqY291bnQgPiAzKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1uZXN0ZWdnX3RyYWNrX2NvZGVjX2RhdGEobmVzdGVnZyAqIGN0eCwgdW5zaWduZWQgaW50IHRyYWNrLCB1bnNpZ25lZCBpbnQgaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCkKLXsKLSAgc3RydWN0IHRyYWNrX2VudHJ5ICogZW50cnk7Ci0gIHN0cnVjdCBlYm1sX2JpbmFyeSBjb2RlY19wcml2YXRlOwotICB1aW50NjRfdCBzaXplc1szXSwgdG90YWw7Ci0gIHVuc2lnbmVkIGNoYXIgKiBwOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGk7Ci0KLSAgKmRhdGEgPSBOVUxMOwotICAqbGVuZ3RoID0gMDsKLQotICBlbnRyeSA9IG5lX2ZpbmRfdHJhY2tfZW50cnkoY3R4LCB0cmFjayk7Ci0gIGlmICghZW50cnkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuZXN0ZWdnX3RyYWNrX2NvZGVjX2lkKGN0eCwgdHJhY2spICE9IE5FU1RFR0dfQ09ERUNfVk9SQklTKQotICAgIHJldHVybiAtMTsKLQotICBpZiAobmVfZ2V0X2JpbmFyeShlbnRyeS0+Y29kZWNfcHJpdmF0ZSwgJmNvZGVjX3ByaXZhdGUpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHAgPSBjb2RlY19wcml2YXRlLmRhdGE7Ci0gIGNvdW50ID0gKnArKyArIDE7Ci0KLSAgaWYgKGNvdW50ID4gMykKLSAgICByZXR1cm4gLTE7Ci0KLSAgaSA9IDA7Ci0gIHRvdGFsID0gMDsKLSAgd2hpbGUgKC0tY291bnQpIHsKLSAgICBzaXplc1tpXSA9IG5lX3hpcGhfbGFjZV92YWx1ZSgmcCk7Ci0gICAgdG90YWwgKz0gc2l6ZXNbaV07Ci0gICAgaSArPSAxOwotICB9Ci0gIHNpemVzW2ldID0gY29kZWNfcHJpdmF0ZS5sZW5ndGggLSB0b3RhbCAtIChwIC0gY29kZWNfcHJpdmF0ZS5kYXRhKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgaXRlbTsgKytpKSB7Ci0gICAgaWYgKHNpemVzW2ldID4gTElNSVRfRlJBTUUpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgcCArPSBzaXplc1tpXTsKLSAgfQotICAqZGF0YSA9IHA7Ci0gICpsZW5ndGggPSBzaXplc1tpdGVtXTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1uZXN0ZWdnX3RyYWNrX3ZpZGVvX3BhcmFtcyhuZXN0ZWdnICogY3R4LCB1bnNpZ25lZCBpbnQgdHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWdnX3ZpZGVvX3BhcmFtcyAqIHBhcmFtcykKLXsKLSAgc3RydWN0IHRyYWNrX2VudHJ5ICogZW50cnk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotCi0gIG1lbXNldChwYXJhbXMsIDAsIHNpemVvZigqcGFyYW1zKSk7Ci0KLSAgZW50cnkgPSBuZV9maW5kX3RyYWNrX2VudHJ5KGN0eCwgdHJhY2spOwotICBpZiAoIWVudHJ5KQotICAgIHJldHVybiAtMTsKLQotICBpZiAobmVzdGVnZ190cmFja190eXBlKGN0eCwgdHJhY2spICE9IE5FU1RFR0dfVFJBQ0tfVklERU8pCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuZV9nZXRfdWludChlbnRyeS0+dmlkZW8ucGl4ZWxfd2lkdGgsICZ2YWx1ZSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIHBhcmFtcy0+d2lkdGggPSB2YWx1ZTsKLQotICBpZiAobmVfZ2V0X3VpbnQoZW50cnktPnZpZGVvLnBpeGVsX2hlaWdodCwgJnZhbHVlKSAhPSAwKQotICAgIHJldHVybiAtMTsKLSAgcGFyYW1zLT5oZWlnaHQgPSB2YWx1ZTsKLQotICB2YWx1ZSA9IDA7Ci0gIG5lX2dldF91aW50KGVudHJ5LT52aWRlby5waXhlbF9jcm9wX2JvdHRvbSwgJnZhbHVlKTsKLSAgcGFyYW1zLT5jcm9wX2JvdHRvbSA9IHZhbHVlOwotCi0gIHZhbHVlID0gMDsKLSAgbmVfZ2V0X3VpbnQoZW50cnktPnZpZGVvLnBpeGVsX2Nyb3BfdG9wLCAmdmFsdWUpOwotICBwYXJhbXMtPmNyb3BfdG9wID0gdmFsdWU7Ci0KLSAgdmFsdWUgPSAwOwotICBuZV9nZXRfdWludChlbnRyeS0+dmlkZW8ucGl4ZWxfY3JvcF9sZWZ0LCAmdmFsdWUpOwotICBwYXJhbXMtPmNyb3BfbGVmdCA9IHZhbHVlOwotCi0gIHZhbHVlID0gMDsKLSAgbmVfZ2V0X3VpbnQoZW50cnktPnZpZGVvLnBpeGVsX2Nyb3BfcmlnaHQsICZ2YWx1ZSk7Ci0gIHBhcmFtcy0+Y3JvcF9yaWdodCA9IHZhbHVlOwotCi0gIHZhbHVlID0gcGFyYW1zLT53aWR0aDsKLSAgbmVfZ2V0X3VpbnQoZW50cnktPnZpZGVvLmRpc3BsYXlfd2lkdGgsICZ2YWx1ZSk7Ci0gIHBhcmFtcy0+ZGlzcGxheV93aWR0aCA9IHZhbHVlOwotCi0gIHZhbHVlID0gcGFyYW1zLT5oZWlnaHQ7Ci0gIG5lX2dldF91aW50KGVudHJ5LT52aWRlby5kaXNwbGF5X2hlaWdodCwgJnZhbHVlKTsKLSAgcGFyYW1zLT5kaXNwbGF5X2hlaWdodCA9IHZhbHVlOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLW5lc3RlZ2dfdHJhY2tfYXVkaW9fcGFyYW1zKG5lc3RlZ2cgKiBjdHgsIHVuc2lnbmVkIGludCB0cmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZ2dfYXVkaW9fcGFyYW1zICogcGFyYW1zKQotewotICBzdHJ1Y3QgdHJhY2tfZW50cnkgKiBlbnRyeTsKLSAgdWludDY0X3QgdmFsdWU7Ci0KLSAgbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKLQotICBlbnRyeSA9IG5lX2ZpbmRfdHJhY2tfZW50cnkoY3R4LCB0cmFjayk7Ci0gIGlmICghZW50cnkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuZXN0ZWdnX3RyYWNrX3R5cGUoY3R4LCB0cmFjaykgIT0gTkVTVEVHR19UUkFDS19BVURJTykKLSAgICByZXR1cm4gLTE7Ci0KLSAgcGFyYW1zLT5yYXRlID0gODAwMDsKLSAgbmVfZ2V0X2Zsb2F0KGVudHJ5LT5hdWRpby5zYW1wbGluZ19mcmVxdWVuY3ksICZwYXJhbXMtPnJhdGUpOwotCi0gIHZhbHVlID0gMTsKLSAgbmVfZ2V0X3VpbnQoZW50cnktPmF1ZGlvLmNoYW5uZWxzLCAmdmFsdWUpOwotICBwYXJhbXMtPmNoYW5uZWxzID0gdmFsdWU7Ci0KLSAgdmFsdWUgPSAxNjsKLSAgbmVfZ2V0X3VpbnQoZW50cnktPmF1ZGlvLmJpdF9kZXB0aCwgJnZhbHVlKTsKLSAgcGFyYW1zLT5kZXB0aCA9IHZhbHVlOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLW5lc3RlZ2dfcmVhZF9wYWNrZXQobmVzdGVnZyAqIGN0eCwgbmVzdGVnZ19wYWNrZXQgKiogcGt0KQotewotICBpbnQgcjsKLSAgdWludDY0X3QgaWQsIHNpemU7Ci0KLSAgKnBrdCA9IE5VTEw7Ci0KLSAgZm9yICg7OykgewotICAgIHIgPSBuZV9wZWVrX2VsZW1lbnQoY3R4LCAmaWQsICZzaXplKTsKLSAgICBpZiAociAhPSAxKQotICAgICAgcmV0dXJuIHI7Ci0KLSAgICAvKiBhbnkgc3VzcGVuZCBmaWVsZHMgbXVzdCBiZSBoYW5kbGVkIGhlcmUgKi8KLSAgICBpZiAobmVfaXNfc3VzcGVuZF9lbGVtZW50KGlkKSkgewotICAgICAgciA9IG5lX3JlYWRfZWxlbWVudChjdHgsICZpZCwgJnNpemUpOwotICAgICAgaWYgKHIgIT0gMSkKLSAgICAgICAgcmV0dXJuIHI7Ci0KLSAgICAgIC8qIHRoZSBvbmx5IHN1c3BlbmQgZmllbGRzIGFyZSBibG9ja3MgYW5kIHNpbXBsZSBibG9ja3MsIHdoaWNoIHdlCi0gICAgICAgICBoYW5kbGUgZGlyZWN0bHkuICovCi0gICAgICByID0gbmVfcmVhZF9ibG9jayhjdHgsIGlkLCBzaXplLCBwa3QpOwotICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgciA9ICBuZV9wYXJzZShjdHgsIE5VTEwpOwotICAgIGlmIChyICE9IDEpCi0gICAgICByZXR1cm4gcjsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1uZXN0ZWdnX2ZyZWVfcGFja2V0KG5lc3RlZ2dfcGFja2V0ICogcGt0KQotewotICBzdHJ1Y3QgZnJhbWUgKiBmcmFtZTsKLQotICB3aGlsZSAocGt0LT5mcmFtZSkgewotICAgIGZyYW1lID0gcGt0LT5mcmFtZTsKLSAgICBwa3QtPmZyYW1lID0gZnJhbWUtPm5leHQ7Ci0gICAgZnJlZShmcmFtZS0+ZGF0YSk7Ci0gICAgZnJlZShmcmFtZSk7Ci0gIH0KLQotIGZyZWUocGt0KTsKLX0KLQotaW50Ci1uZXN0ZWdnX3BhY2tldF90cmFjayhuZXN0ZWdnX3BhY2tldCAqIHBrdCwgdW5zaWduZWQgaW50ICogdHJhY2spCi17Ci0gICp0cmFjayA9IHBrdC0+dHJhY2s7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLW5lc3RlZ2dfcGFja2V0X3RzdGFtcChuZXN0ZWdnX3BhY2tldCAqIHBrdCwgdWludDY0X3QgKiB0c3RhbXApCi17Ci0gICp0c3RhbXAgPSBwa3QtPnRpbWVjb2RlOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1uZXN0ZWdnX3BhY2tldF9jb3VudChuZXN0ZWdnX3BhY2tldCAqIHBrdCwgdW5zaWduZWQgaW50ICogY291bnQpCi17Ci0gIHN0cnVjdCBmcmFtZSAqIGYgPSBwa3QtPmZyYW1lOwotCi0gICpjb3VudCA9IDA7Ci0KLSAgd2hpbGUgKGYpIHsKLSAgICAqY291bnQgKz0gMTsKLSAgICBmID0gZi0+bmV4dDsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLW5lc3RlZ2dfcGFja2V0X2RhdGEobmVzdGVnZ19wYWNrZXQgKiBwa3QsIHVuc2lnbmVkIGludCBpdGVtLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCkKLXsKLSAgc3RydWN0IGZyYW1lICogZiA9IHBrdC0+ZnJhbWU7Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLSAgKmRhdGEgPSBOVUxMOwotICAqbGVuZ3RoID0gMDsKLQotICB3aGlsZSAoZikgewotICAgIGlmIChjb3VudCA9PSBpdGVtKSB7Ci0gICAgICAqZGF0YSA9IGYtPmRhdGE7Ci0gICAgICAqbGVuZ3RoID0gZi0+bGVuZ3RoOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGNvdW50ICs9IDE7Ci0gICAgZiA9IGYtPm5leHQ7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9zb2x1dGlvbi5tayBiL3NvbHV0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODIxNTBmLi4wMDAwMDAwCi0tLSBhL3NvbHV0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMKLSMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0jIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSMjCi0KLQotdnB4LnNsbjogJCh3aWxkY2FyZCAqLnZjcHJvaikKLQlAZWNobyAiICAgIFtDUkVBVEVdICRAIgotCSQoU1JDX1BBVEhfQkFSRSkvYnVpbGQvbWFrZS9nZW5fbXN2c19zbG4uc2ggXAotICAgICAgICAgICAgJChpZiAkKGZpbHRlciAldnB4LnZjcHJvaiwkXiksXAotICAgICAgICAgICAgICAgICQoZm9yZWFjaCB2Y3AsJChmaWx0ZXItb3V0ICV2cHgudmNwcm9qICVvYmpfaW50X2V4dHJhY3QudmNwcm9qLCReKSxcCi0gICAgICAgICAgICAgICAgICAtLWRlcD0kKHZjcDoudmNwcm9qPSk6dnB4KSkgXAotICAgICAgICAgICAgLS1kZXA9dnB4Om9ial9pbnRfZXh0cmFjdCBcCi0gICAgICAgICAgICAtLXZlcj0kKENPTkZJR19WU19WRVJTSU9OKVwKLSAgICAgICAgICAgIC0tb3V0PSRAICReCi12cHguc2xuLm1rOiB2cHguc2xuCi0JQHRydWUKLQotUFJPSkVDVFMteWVzICs9IHZweC5zbG4gdnB4LnNsbi5tawotLWluY2x1ZGUgdnB4LnNsbi5tawotCi0jIEFsd2F5cyBpbnN0YWxsIHRoaXMgZmlsZSwgYXMgaXQgaXMgYW4gdW5jb25kaXRpb25hbCBwb3N0LWJ1aWxkIHJ1bGUuCi1JTlNUQUxMX01BUFMgKz0gc3JjLyUgICAgICQoU1JDX1BBVEhfQkFSRSkvJQotSU5TVEFMTC1TUkNTLXllcyAgICAgICAgICAgICs9ICQodGFyZ2V0KS5tawpkaWZmIC0tZ2l0IGEvdG9vbHNfY29tbW9uLmMgYi90b29sc19jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4OGJiZS4uMDAwMDAwMAotLS0gYS90b29sc19jb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInRvb2xzX2NvbW1vbi5oIgotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotCi1GSUxFKiBzZXRfYmluYXJ5X21vZGUoRklMRSAqc3RyZWFtKQotewotICAgICh2b2lkKXN0cmVhbTsKLSNpZmRlZiBfV0lOMzIKLSAgICBfc2V0bW9kZShfZmlsZW5vKHN0cmVhbSksIF9PX0JJTkFSWSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gc3RyZWFtOwotfQpkaWZmIC0tZ2l0IGEvdXNhZ2UuZG94IGIvdXNhZ2UuZG94CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGIwODBiLi4wMDAwMDAwCi0tLSBhL3VzYWdlLmRveAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKiFccGFnZSB1c2FnZSBVc2FnZQotCi0gICAgVGhlIHZweCBNdWx0aS1Gb3JtYXQgY29kZWMgU0RLIHByb3ZpZGVzIGEgdW5pZmllZCBpbnRlcmZhY2UgYW1vbmdzdCBpdHMKLSAgICBzdXBwb3J0ZWQgY29kZWNzLiBUaGlzIGFic3RyYWN0aW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBTREsgdG8KLSAgICBlYXNpbHkgc3VwcG9ydCBtdWx0aXBsZSB2aWRlbyBmb3JtYXRzIHdpdGggbWluaW1hbCBjb2RlIGR1cGxpY2F0aW9uIG9yCi0gICAgInNwZWNpYWwgY2FzaW5nLiIgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgY29kZWNzLgotICAgIEZvciBjb2RlYy1zcGVjaWZpYyBkZXRhaWxzLCBzZWUgdGhlIFxyZWYgY29kZWNzIHBhZ2UuCi0KLSAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGFyZSBjb21tb24gdG8gYWxsIGNvZGVjczoKLSAgICAtIFxyZWYgdXNhZ2VfdHlwZXMKLSAgICAtIFxyZWYgdXNhZ2VfZmVhdHVyZXMKLSAgICAtIFxyZWYgdXNhZ2VfaW5pdAotICAgIC0gXHJlZiB1c2FnZV9lcnJvcnMKLQotICAgIEZvcmUgbW9yZSBpbmZvcm1hdGlvbiBvbiBkZWNvZGVyIGFuZCBlbmNvZGVyIHNwZWNpZmljIHVzYWdlLCBzZWUgdGhlCi0gICAgZm9sbG93aW5nIHBhZ2VzOgotICAgIFxpZiBkZWNvZGVyIC0gXHN1YnBhZ2UgdXNhZ2VfZGVjb2RlIFxlbmRpZgotICAgIFxpZiBkZWNvZGVyIC0gXHN1YnBhZ2UgdXNhZ2VfZW5jb2RlIFxlbmRpZgotCi0gICAgXHNlY3Rpb24gdXNhZ2VfdHlwZXMgSW1wb3J0YW50IERhdGEgVHlwZXMKLSAgICBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCBkYXRhIHN0cnVjdHVyZXMgdG8gY29uc2lkZXIgaW4gdGhpcyBpbnRlcmZhY2UuCi0KLSAgICBcc3Vic2VjdGlvbiB1c2FnZV9jdHhzIENvbnRleHRzCi0gICAgQSBjb250ZXh0IGlzIGEgc3RvcmFnZSBhcmVhIGFsbG9jYXRlZCBieSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiB0aGF0IHRoZQotICAgIGNvZGVjIG1heSB3cml0ZSBpbnRvIHRvIHN0b3JlIGRldGFpbHMgYWJvdXQgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhhdCBjb2RlYy4KLSAgICBNb3N0IG9mIHRoZSBjb250ZXh0IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLCBhbmQgdGh1cyBvcGFxdWUgdG8gdGhlCi0gICAgYXBwbGljYXRpb24uIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBhcyBzZWVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBpcyBvZiBmaXhlZAotICAgIHNpemUsIGFuZCB0aHVzIGNhbiBiZSBhbGxvY2F0ZWQgd2l0aCBhdXRvbWF0aWMgc3RvcmFnZSBvciBkeW5hbWljYWxseQotICAgIG9uIHRoZSBoZWFwLgotCi0gICAgTW9zdCBvcGVyYXRpb25zIHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgY29kZWMgY29udGV4dC4gQ29kZWMgY29udGV4dAotICAgIGluc3RhbmNlcyBhcmUgY29kZWMgc3BlY2lmaWMuIFRoYXQgaXMsIHRoZSBjb2RlYyB0byBiZSB1c2VkIGZvciB0aGUgZW5jb2RlZAotICAgIHZpZGVvIG11c3QgYmUga25vd24gYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gU2VlICN2cHhfY29kZWNfY3R4X3QgZm9yIGZ1cnRoZXIKLSAgICBpbmZvcm1hdGlvbi4KLQotICAgIFxzdWJzZWN0aW9uIHVzYWdlX2lmYWNlcyBJbnRlcmZhY2VzCi0gICAgQSBjb2RlYyBpbnRlcmZhY2UgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0aGF0IGNvbnRyb2xzIGhvdyBmdW5jdGlvbiBjYWxscwotICAgIGludG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlIGFyZSBkaXNwYXRjaGVkIHRvIHRoZWlyIGNvZGVjLXNwZWNpZmljCi0gICAgaW1wbGVtZW50YXRpb25zLiBBcHBsaWNhdGlvbnMgXHJlZiBNVVNUTk9UIGF0dGVtcHQgdG8gZXhhbWluZSBvciBvdmVycmlkZQotICAgIHRoaXMgc3RvcmFnZSwgYXMgaXQgY29udGFpbnMgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBsaWtlbHkgdG8KLSAgICBjaGFuZ2UgZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UuCi0KLSAgICBFYWNoIHN1cHBvcnRlZCBjb2RlYyB3aWxsIGV4cG9zZSBhbiBpbnRlcmZhY2Ugc3RydWN0dXJlIHRvIHRoZSBhcHBsaWNhdGlvbgotICAgIGFzIGFuIDxjb2RlPmV4dGVybjwvY29kZT4gcmVmZXJlbmNlIHRvIGEgc3RydWN0dXJlIG9mIHRoZSBpbmNvbXBsZXRlIHR5cGUKLSAgICAjdnB4X2NvZGVjX2lmYWNlX3QuCi0KLSAgICBcc2VjdGlvbiB1c2FnZV9mZWF0dXJlcyBGZWF0dXJlcwotICAgIFNldmVyYWwgImZlYXR1cmVzIiBhcmUgZGVmaW5lZCB0aGF0IGFyZSBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IGNvZGVjCi0gICAgYWxnb3JpdGhtcy4gSW5kZWVkLCB0aGUgc2FtZSBhbGdvcml0aG0gbWF5IHN1cHBvcnQgZGlmZmVyZW50IGZlYXR1cmVzIG9uCi0gICAgZGlmZmVyZW50IHBsYXRmb3Jtcy4gVGhlIHB1cnBvc2Ugb2YgZGVmaW5pbmcgdGhlc2UgZmVhdHVyZXMgaXMgdGhhdCB3aGVuCi0gICAgdGhleSBhcmUgaW1wbGVtZW50ZWQsIHRoZXkgY29uZm9ybSB0byBhIGNvbW1vbiBpbnRlcmZhY2UuIFRoZSBmZWF0dXJlcywgb3IKLSAgICBjYXBhYmlsaXRpZXMsIG9mIGFuIGFsZ29yaXRobSBjYW4gYmUgcXVlcmllZCBmcm9tIGl0J3MgaW50ZXJmYWNlIGJ5IHVzaW5nCi0gICAgdGhlIHZweF9jb2RlY19nZXRfY2FwcygpIG1ldGhvZC4gQXR0ZW1wdHMgdG8gaW52b2tlIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQKLSAgICBieSBhbiBhbGdvcml0aG0gd2lsbCBnZW5lcmFsbHkgcmVzdWx0IGluICNWUFhfQ09ERUNfSU5DQVBBQkxFLgotCi0gICAgQ3VycmVudGx5IGRlZmluZWQgZmVhdHVyZXMgYXZhaWxhYmxlIGluIGJvdGggZW5jb2RlcnMgYW5kIGRlY29kZXJzIGluY2x1ZGU6Ci0gICAgLSBcc3VicGFnZSB1c2FnZV94bWEKLQotICAgIFxpZiBkZWNvZGVyCi0gICAgQ3VycmVudGx5IGRlZmluZWQgZGVjb2RlciBmZWF0dXJlcyBpbmNsdWRlOgotICAgIC0gXHJlZiB1c2FnZV9jYgotICAgIC0gXHJlZiB1c2FnZV9wb3N0cHJvYwotICAgIFxlbmRpZgotCi0gICAgXHNlY3Rpb24gdXNhZ2VfaW5pdCBJbml0aWFsaXphdGlvbgotICAgIFRvIGluaXRpYWxpemUgYSBjb2RlYyBpbnN0YW5jZSwgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvZGVjIGNvbnRleHQKLSAgICBhbmQgaW50ZXJmYWNlIHN0cnVjdHVyZXMgYXJlIHBhc3NlZCB0byBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gRGVwZW5kaW5nCi0gICAgb24gdGhlIFxyZWYgdXNhZ2VfZmVhdHVyZXMgdGhhdCB0aGUgY29kZWMgc3VwcG9ydHMsIHRoZSBjb2RlYyBjb3VsZCBiZQotICAgIGluaXRpYWxpemVkIGluIGRpZmZlcmVudCBtb2Rlcy4gTW9zdCBub3RhYmx5LCB0aGUgYXBwbGljYXRpb24gbWF5IGNob29zZSB0bwotICAgIHVzZSBccmVmIHVzYWdlX3htYSBtb2RlIHRvIGdhaW4gZmluZSBncmFpbmVkIGNvbnRyb2wgb3ZlciBob3cgYW5kIHdoZXJlCi0gICAgbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgdGhlIGNvZGVjLgotCi0gICAgVG8gcHJldmVudCBjYXNlcyBvZiBjb25mdXNpb24gd2hlcmUgdGhlIEFCSSBvZiB0aGUgbGlicmFyeSBjaGFuZ2VzLAotICAgIHRoZSBBQkkgaXMgdmVyc2lvbmVkLiBUaGUgQUJJIHZlcnNpb24gbnVtYmVyIG11c3QgYmUgcGFzc2VkIGF0Ci0gICAgaW5pdGlhbGl6YXRpb24gdGltZSB0byBlbnN1cmUgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGEgaGVhZGVyIGZpbGUgdGhhdAotICAgIG1hdGNoZXMgdGhlIGxpYnJhcnkuIFRoZSBjdXJyZW50IEFCSSB2ZXJzaW9uIG51bWJlciBpcyBzdG9yZWQgaW4gdGhlCi0gICAgcHJlcHJvY2Vzc29yIG1hY3JvcyAjVlBYX0NPREVDX0FCSV9WRVJTSU9OLCAjVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04sIGFuZAotICAgICNWUFhfREVDT0RFUl9BQklfVkVSU0lPTi4gRm9yIGNvbnZlbmllbmNlLCBlYWNoIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGhhcwotICAgIGEgd3JhcHBlciBtYWNybyB0aGF0IGluc2VydHMgdGhlIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIuIFRoZXNlIG1hY3JvcyBhcmUKLSAgICBuYW1lZCBsaWtlIHRoZSBpbml0aWFsaXphdGlvbiBtZXRob2RzLCBidXQgd2l0aG91dCB0aGUgX3ZlciBzdWZmaXguCi0KLQotICAgIFRoZSBhdmFpbGFibGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kcyBhcmU6Ci0gICAgXGlmIGVuY29kZXIgLSAjdnB4X2NvZGVjX2VuY19pbml0IChjYWxscyB2cHhfY29kZWNfZW5jX2luaXRfdmVyKCkpIFxlbmRpZgotICAgIFxpZiBkZWNvZGVyIC0gI3ZweF9jb2RlY19kZWNfaW5pdCAoY2FsbHMgdnB4X2NvZGVjX2RlY19pbml0X3ZlcigpKSBcZW5kaWYKLQotCi0KLSAgICBcc2VjdGlvbiB1c2FnZV9lcnJvcnMgRXJyb3IgSGFuZGxpbmcKLSAgICBBbG1vc3QgYWxsIGNvZGVjIGZ1bmN0aW9ucyByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIG9mIHR5cGUgI3ZweF9jb2RlY19lcnJfdC4KLSAgICBUaGUgc2VtYW50aWNzIG9mIGhvdyBlYWNoIGVycm9yIGNvbmRpdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGlzIGNsZWFybHkKLSAgICBkZWZpbmVkIGluIHRoZSBkZWZpbml0aW9ucyBvZiBlYWNoIGVudW1lcmF0ZWQgdmFsdWUuIEVycm9yIHZhbHVlcyBjYW4gYmUKLSAgICBjb252ZXJ0ZWQgaW50byBBU0NJSSBzdHJpbmdzIHdpdGggdGhlIHZweF9jb2RlY19lcnJvcigpIGFuZAotICAgIHZweF9jb2RlY19lcnJfdG9fc3RyaW5nKCkgbWV0aG9kcy4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28gbWV0aG9kcyBpcwotICAgIHRoYXQgdnB4X2NvZGVjX2Vycm9yKCkgcmV0dXJucyB0aGUgZXJyb3Igc3RhdGUgZnJvbSBhbiBpbml0aWFsaXplZCBjb250ZXh0LAotICAgIHdoZXJlYXMgdnB4X2NvZGVjX2Vycl90b19zdHJpbmcoKSBjYW4gYmUgdXNlZCBpbiBjYXNlcyB3aGVyZSBhbiBlcnJvciBvY2N1cnMKLSAgICBvdXRzaWRlIGFueSBjb250ZXh0LiBUaGUgZW51bWVyYXRlZCB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBsYXN0IGNhbGwgY2FuIGJlCi0gICAgcmV0cmlldmVkIGZyb20gdGhlIDxjb2RlPmVycjwvY29kZT4gbWVtYmVyIG9mIHRoZSBkZWNvZGVyIGNvbnRleHQgYXMgd2VsbC4KLSAgICBGaW5hbGx5LCBtb3JlIGRldGFpbGVkIGVycm9yIGluZm9ybWF0aW9uIG1heSBiZSBhYmxlIHRvIGJlIG9idGFpbmVkIGJ5IHVzaW5nCi0gICAgdGhlIHZweF9jb2RlY19lcnJvcl9kZXRhaWwoKSBtZXRob2QuIE5vdCBhbGwgZXJyb3JzIHByb2R1Y2UgZGV0YWlsZWQgZXJyb3IKLSAgICBpbmZvcm1hdGlvbi4KLQotICAgIEluIGFkZGl0aW9uIHRvIGVycm9yIGluZm9ybWF0aW9uLCB0aGUgY29kZWMgbGlicmFyeSdzIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSAgICBpcyBhdmFpbGFibGUgYXQgcnVudGltZSBvbiBzb21lIHBsYXRmb3Jtcy4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0dXJuZWQKLSAgICBieSBjYWxsaW5nIHZweF9jb2RlY19idWlsZF9jb25maWcoKSwgYW5kIGlzIGZvcm1hdHRlZCBhcyBhIGJhc2U2NCBjb2RlZCBzdHJpbmcKLSAgICAoY29tcHJpc2VkIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHNldCBbYS16X2EtWjAtOSsvXSkuIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90Ci0gICAgdXNlZnVsIHRvIGFuIGFwcGxpY2F0aW9uIGF0IHJ1bnRpbWUsIGJ1dCBtYXkgYmUgb2YgdXNlIHRvIHZweCBmb3Igc3VwcG9ydC4KLQotCi0gICAgXHNlY3Rpb24gdXNhZ2VfZGVhZGxpbmUgRGVhZGxpbmUKLSAgICBCb3RoIHRoZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIGhhdmUgYSA8Y29kZT5kZWFkbGluZTwvY29kZT4KLSAgICBwYXJhbWV0ZXIuIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pY3Jvc2Vjb25kcwotICAgICh1cyksIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRoZSBjb2RlYyB0byBzcGVuZCBwcm9jZXNzaW5nIGJlZm9yZQotICAgIHJldHVybmluZy4gVGhpcyBpcyBhIHNvZnQgZGVhZGxpbmUgLS0gdGhhdCBpcywgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAgICByZXF1ZXN0ZWQgb3BlcmF0aW9uIHRha2UgcHJlY2VkZW5jZSBvdmVyIG1lZXRpbmcgdGhlIGRlYWRsaW5lLiBJZiwgZm9yCi0gICAgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gc2V0cyBhIDxjb2RlPmRlYWRsaW5lPC9jb2RlPiBvZiAxMDAwdXMsIGFuZCB0aGUKLSAgICBmcmFtZSB0YWtlcyAyMDAwdXMgdG8gZGVjb2RlLCB0aGUgY2FsbCB0byB2cHhfY29kZWNfZGVjb2RlKCkgd2lsbCByZXR1cm4KLSAgICBhZnRlciAyMDAwdXMuIEluIHRoaXMgY2FzZSB0aGUgZGVhZGxpbmUgaXMgbm90IG1ldCwgYnV0IHRoZSBzZW1hbnRpY3Mgb2YgdGhlCi0gICAgZnVuY3Rpb24gYXJlIHByZXNlcnZlZC4gSWYsIGZvciB0aGUgc2FtZSBmcmFtZSwgYW4gYXBwbGljYXRpb24gaW5zdGVhZCBzZXRzCi0gICAgYSA8Y29kZT5kZWFkbGluZTwvY29kZT4gb2YgNTAwMHVzLCB0aGUgZGVjb2RlciB3aWxsIHNlZSB0aGF0IGl0IGhhcyAzMDAwdXMKLSAgICByZW1haW5pbmcgaW4gaXRzIHRpbWUgc2xpY2Ugd2hlbiBkZWNvZGluZyBjb21wbGV0ZXMuIEl0IGNvdWxkIHRoZW4gY2hvb3NlIHRvCi0gICAgcnVuIGEgc2V0IG9mIFxyZWYgdXNhZ2VfcG9zdHByb2MgZmlsdGVycywgYW5kIHBlcmhhcHMgd291bGQgcmV0dXJuIGFmdGVyCi0gICAgNDAwMHVzIChpbnN0ZWFkIG9mIHRoZSBhbGxvY2F0ZWQgNTAwMHVzKS4gSW4gdGhpcyBjYXNlIHRoZSBkZWFkbGluZSBpcyBtZXQsCi0gICAgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNhbGwgYXJlIHByZXNlcnZlZCwgYXMgYmVmb3JlLgotCi0gICAgVGhlIHNwZWNpYWwgdmFsdWUgPGNvZGU+MDwvY29kZT4gaXMgcmVzZXJ2ZWQgdG8gcmVwcmVzZW50IGFuIGluZmluaXRlCi0gICAgZGVhZGxpbmUuIEluIHRoaXMgY2FzZSwgdGhlIGNvZGVjIHdpbGwgcGVyZm9ybSBhcyBtdWNoIHByb2Nlc3NpbmcgYXMKLSAgICBwb3NzaWJsZSB0byB5aWVsZCB0aGUgaGlnaGVzdCBxdWFsaXR5IGZyYW1lLgotCi0gICAgQnkgY29udmVudGlvbiwgdGhlIHZhbHVlIDxjb2RlPjE8L2NvZGU+IGlzIHVzZWQgdG8gbWVhbiAicmV0dXJuIGFzIGZhc3QgYXMKLSAgICBwb3NzaWJsZS4iCi0KLSovCi0KLQotLyohIFxwYWdlIHVzYWdlX3htYSBFeHRlcm5hbCBNZW1vcnkgQWxsb2NhdGlvbgotICAgIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gaGF2ZSBmaW5lIGdyYWluZWQgY29udHJvbCBvdmVyIGhvdyBhbmQgd2hlcmUKLSAgICBkZWNvZGVycyBhbGxvY2F0ZSBtZW1vcnkgXHJlZiBNQVkgbWFrZSB1c2Ugb2YgdGhlIGVYdGVybmFsIE1lbW9yeSBBbGxvY2F0aW9uCi0gICAgKFhNQSkgaW50ZXJmYWNlLiBOb3QgYWxsIGNvZGVjcyBzdXBwb3J0IHRoZSBYTUEgXHJlZiB1c2FnZV9mZWF0dXJlcy4KLQotICAgIFRvIHVzZSBhIGRlY29kZXIgaW4gWE1BIG1vZGUsIHRoZSBkZWNvZGVyIFxyZWYgTVVTVCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZQotICAgIHZweF9jb2RlY194bWFfaW5pdF92ZXIoKSBmdW5jdGlvbi4gVGhlIGFtb3VudCBvZiBtZW1vcnkgYSBkZWNvZGVyIG5lZWRzIHRvCi0gICAgYWxsb2NhdGUgaXMgaGVhdmlseSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIGVuY29kZWQgdmlkZW8gZnJhbWVzLiBUaGUKLSAgICBzaXplIG9mIHRoZSB2aWRlbyBtdXN0IGJlIGtub3duIGJlZm9yZSByZXF1ZXN0aW5nIHRoZSBkZWNvZGVyJ3MgbWVtb3J5IG1hcC4KLSAgICBUaGlzIHN0cmVhbSBpbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgd2l0aCB0aGUgdnB4X2NvZGVjX3BlZWtfc3RyZWFtX2luZm8oKQotICAgIGZ1bmN0aW9uLCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGEgY29uc3RydWN0ZWQgZGVjb2RlciBjb250ZXh0LiBJZiB0aGUgZXhhY3QKLSAgICBzdHJlYW0gaXMgbm90IGtub3duLCBhIHN0cmVhbSBpbmZvIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZCB0aGF0IHJlZmxlY3RzCi0gICAgdGhlIG1heGltdW0gc2l6ZSB0aGF0IHRoZSBkZWNvZGVyIGluc3RhbmNlIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQuCi0KLSAgICBPbmNlIHRoZSBkZWNvZGVyIGluc3RhbmNlIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCB0aGUgc3RyZWFtIGluZm9ybWF0aW9uCi0gICAgZGV0ZXJtaW5lZCwgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRoZSB2cHhfY29kZWNfZ2V0X21lbV9tYXAoKSBpdGVyYXRvcgotICAgIHJlcGVhdGVkbHkgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgbWVtb3J5IHNlZ21lbnRzIHJlcXVlc3RlZCBieSB0aGUgZGVjb2Rlci4KLSAgICBUaGUgaXRlcmF0b3IgdmFsdWUgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIE5VTEwgdG8gcmVxdWVzdCB0aGUgZmlyc3QKLSAgICBlbGVtZW50LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICNWUFhfQ09ERUNfTElTVF9FTkQgdG8gc2lnbmFsIHRoZSBlbmQgb2YKLSAgICB0aGUgbGlzdC4KLQotICAgIEFmdGVyIGVhY2ggc2VnbWVudCBpcyBpZGVudGlmaWVkLCBpdCBtdXN0IGJlIHBhc3NlZCB0byB0aGUgY29kZWMgdGhyb3VnaCB0aGUKLSAgICB2cHhfY29kZWNfc2V0X21lbV9tYXAoKSBmdW5jdGlvbi4gU2VnbWVudHMgXHJlZiBNVVNUIGJlIHBhc3NlZCBpbiB0aGUgc2FtZQotICAgIG9yZGVyIGFzIHRoZXkgYXJlIHJldHVybmVkIGZyb20gdnB4X2NvZGVjX2dldF9tZW1fbWFwKCksIGJ1dCB0aGVyZSBpcyBubwotICAgIHJlcXVpcmVtZW50IHRoYXQgdnB4X2NvZGVjX2dldF9tZW1fbWFwKCkgbXVzdCBmaW5pc2ggaXRlcmF0aW5nIGJlZm9yZQotICAgIHZweF9jb2RlY19zZXRfbWVtX21hcCgpIGlzIGNhbGxlZC4gRm9yIGluc3RhbmNlLCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgY2hvb3NlCi0gICAgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgcmVxdWVzdHMsIGNvbnN0cnVjdCBhbiBvcHRpbWFsIGhlYXAsIGFuZCB0aGVuIHNldCBhbGwKLSAgICBtYXBzIGF0IG9uY2Ugd2l0aCBvbmUgY2FsbC4gT3RoZXIgYXBwbGljYXRpb25zIG1heSBzZXQgb25lIG1hcCBhdCBhIHRpbWUsCi0gICAgYWxsb2NhdGluZyBpdCBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyByZXR1cm5lZCBmcm9tIHZweF9jb2RlY19nZXRfbWVtX21hcCgpLgotCi0gICAgQWZ0ZXIgYWxsIHNlZ21lbnRzIGhhdmUgYmVlbiBzZXQgdXNpbmcgdnB4X2NvZGVjX3NldF9tZW1fbWFwKCksIHRoZSBjb2RlYyBtYXkKLSAgICBiZSB1c2VkIGFzIGl0IHdvdWxkIGJlIGluIG5vcm1hbCBpbnRlcm5hbCBhbGxvY2F0aW9uIG1vZGUuCi0KLSAgICBcc2VjdGlvbiB1c2FnZV94bWFfc2VnX2lkIFNlZ21lbnQgSWRlbnRpZmllcnMKLSAgICBFYWNoIHJlcXVlc3RlZCBzZWdtZW50IGlzIGlkZW50aWZpZWQgYnkgYW4gaWRlbnRpZmllciB1bmlxdWUgdG8KLSAgICB0aGF0IGRlY29kZXIgdHlwZS4gU29tZSBvZiB0aGVzZSBpZGVudGlmaWVycyBhcmUgcHJpdmF0ZSwgd2hpbGUgb3RoZXJzIGFyZQotICAgIGVudW1lcmF0ZWQgZm9yIGFwcGxpY2F0aW9uIHVzZS4gSWRlbnRpZmllcnMgbm90IGVudW1lcmF0ZWQgcHVibGljbHkgYXJlCi0gICAgc3ViamVjdCB0byBjaGFuZ2UuIElkZW50aWZpZXJzIGFyZSBub24tY29uc2VjdXRpdmUuCi0KLSAgICBcc2VjdGlvbiB1c2FnZV94bWFfc2VnX3N6YWxpZ24gU2VnbWVudCBTaXplIGFuZCBBbGlnbm1lbnQKLSAgICBUaGUgc3ogKHNpemUpIGFuZCBhbGlnbiAoYWxpZ25tZW50KSBwYXJhbWV0ZXJzIGRlc2NyaWJlIHRoZSByZXF1aXJlZCBzaXplCi0gICAgYW5kIGFsaWdubWVudCBvZiB0aGUgcmVxdWVzdGVkIHNlZ21lbnQuIEFsaWdubWVudCB3aWxsIGFsd2F5cyBiZSBhIHBvd2VyIG9mCi0gICAgdHdvLiBBcHBsaWNhdGlvbnMgXHJlZiBNVVNUIGhvbm9yIHRoZSBhbGlnbm1lbnQgcmVxdWVzdGVkLiBGYWlsdXJlIHRvIGRvIHNvCi0gICAgY291bGQgcmVzdWx0IGluIHByb2dyYW0gY3Jhc2hlcyBvciBtYXkgaW5jdXIgYSBzcGVlZCBwZW5hbHR5LgotCi0gICAgXHNlY3Rpb24gdXNhZ2VfeG1hX3NlZ19mbGFncyBTZWdtZW50IEZsYWdzCi0gICAgVGhlIGZsYWdzIG1lbWJlciBvZiB0aGUgc2VnbWVudCBzdHJ1Y3R1cmUgaW5kaWNhdGVzIGFueSByZXF1aXJlbWVudHMgb3IKLSAgICBkZXNpcmVzIG9mIHRoZSBjb2RlYyBmb3IgdGhlIHBhcnRpY3VsYXIgc2VnbWVudC4gVGhlICNWUFhfQ09ERUNfTUVNX1pFUk8gZmxhZwotICAgIGluZGljYXRlcyB0aGF0IHRoZSBzZWdtZW50IFxyZWYgTVVTVCBiZSB6ZXJvZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByaW9yIHRvCi0gICAgcGFzc2luZyBpdCB0byB0aGUgYXBwbGljYXRpb24uIFRoZSAjVlBYX0NPREVDX01FTV9XUk9OTFkgZmxhZyBpbmRpY2F0ZXMgdGhhdAotICAgIHRoZSBzZWdtZW50IHdpbGwgb25seSBiZSB3cml0dGVuIGludG8gYnkgdGhlIGRlY29kZXIsIG5vdCByZWFkLiBJZiB0aGlzIGZsYWcKLSAgICBpcyBub3Qgc2V0LCB0aGUgYXBwbGljYXRpb24gXHJlZiBNVVNUIGluc3VyZSB0aGF0IHRoZSBtZW1vcnkgc2VnbWVudCBpcwotICAgIHJlYWRhYmxlLiBPbiBzb21lIHBsYXRmb3JtcywgZnJhbWVidWZmZXIgbWVtb3J5IGlzIHdyaXRhYmxlIGJ1dCBub3QKLSAgICByZWFkYWJsZSwgZm9yIGV4YW1wbGUuIFRoZSAjVlBYX0NPREVDX01FTV9GQVNUIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQKLSAgICB3aWxsIGJlIGZyZXF1ZW50bHkgYWNjZXNzZWQsIGFuZCB0aGF0IGl0IHNob3VsZCBiZSBwbGFjZWQgaW50byBmYXN0IG1lbW9yeSwKLSAgICBpZiBhbnkgaXMgYXZhaWxhYmxlLiBUaGUgYXBwbGljYXRpb24gXHJlZiBNQVkgY2hvb3NlIHRvIHBsYWNlIG90aGVyIHNlZ21lbnRzCi0gICAgaW4gZmFzdCBtZW1vcnkgYXMgd2VsbCwgYnV0IHRoZSBtb3N0IGNyaXRpY2FsIHNlZ21lbnRzIHdpbGwgYmUgaWRlbnRpZmllZCBieQotICAgIHRoaXMgZmxhZy4KLQotICAgIFxzZWN0aW9uIHVzYWdlX3htYV9zZWdfYmFzZWR0b3IgU2VnbWVudCBCYXNlIEFkZHJlc3MgYW5kIERlc3RydWN0b3IKLSAgICBGb3IgZWFjaCByZXF1ZXN0ZWQgbWVtb3J5IHNlZ21lbnQsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGRldGVybWluZSB0aGUKLSAgICBhZGRyZXNzIG9mIGEgbWVtb3J5IHNlZ21lbnQgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBjb2RlYy4gVGhpcwotICAgIGFkZHJlc3MgaXMgc2V0IGluIHRoZSA8Y29kZT5iYXNlPC9jb2RlPiBtZW1iZXIgb2YgdGhlICN2cHhfY29kZWNfbW1hcAotICAgIHN0cnVjdHVyZS4gSWYgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHByb2Nlc3Npbmcgd2hlbiB0aGUgc2VnbWVudCBpcyBubwotICAgIGxvbmdlciB1c2VkIGJ5IHRoZSBjb2RlYyAoZm9yIGluc3RhbmNlIHRvIGRlYWxsb2NhdGUgaXQgb3IgY2xvc2UgYW4KLSAgICBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvcikgdGhlIDxjb2RlPmR0b3I8L2NvZGU+IGFuZCA8Y29kZT5wcml2PC9jb2RlPgotICAgIG1lbWJlcnMgY2FuIGJlIHNldC4KLSovCmRpZmYgLS1naXQgYS91c2FnZV9jeC5kb3ggYi91c2FnZV9jeC5kb3gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MGEwMzQuLjAwMDAwMDAKLS0tIGEvdXNhZ2VfY3guZG94CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyohIFxwYWdlIHVzYWdlX2VuY29kZSBFbmNvZGUKLQotICAgIFRoZSB2cHhfY29kZWNfZW5jb2RlKCkgZnVuY3Rpb24gaXMgYXQgdGhlIGNvcmUgb2YgdGhlIGRlY29kZSBsb29wLiBJdAotICAgIHByb2Nlc3NlcyByYXcgaW1hZ2VzIHBhc3NlZCBieSB0aGUgYXBwbGljYXRpb24sIHByb2R1Y2luZyBwYWNrZXRzIG9mCi0gICAgY29tcHJlc3NlZCBkYXRhLiBUaGUgPGNvZGU+ZGVhZGxpbmU8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyB0aGUgYW1vdW50Ci0gICAgb2YgdGltZSBpbiBtaWNyb3NlY29uZHMgdGhlIGVuY29kZXIgc2hvdWxkIHNwZW5kIHdvcmtpbmcgb24gdGhlIGZyYW1lLiBGb3IKLSAgICBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSA8Y29kZT5kZWFkbGluZTwvY29kZT4gcGFyYW1ldGVyLCBzZWUKLSAgICBccmVmIHVzYWdlX2RlYWRsaW5lLgotCi0KLSAgICBccmVmIHNhbXBsZXMKLQotCi0qLwpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5jIGIvdnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGVmMzYwLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYWxsb2Njb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJibG9ja2QuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJvbnl4Y19pbnQuaCIKLSNpbmNsdWRlICJmaW5kbmVhcm12LmgiCi0jaW5jbHVkZSAiZW50cm9weW1vZGUuaCIKLSNpbmNsdWRlICJzeXN0ZW1kZXBlbmRlbnQuaCIKLQotCi1leHRlcm4gIHZvaWQgdnA4X2luaXRfc2Nhbl9vcmRlcl9tYXNrKCk7Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9tb2RlX2luZm9fYm9yZGVyKE1PREVfSU5GTyAqbWksIGludCByb3dzLCBpbnQgY29scykKLXsKLSAgICBpbnQgaTsKLSAgICB2cHhfbWVtc2V0KG1pIC0gY29scyAtIDIsIDAsIHNpemVvZihNT0RFX0lORk8pICogKGNvbHMgKyAxKSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbXNldCgmbWlbaSpjb2xzLTFdLCAwLCBzaXplb2YoTU9ERV9JTkZPKSk7Ci0gICAgfQotfQotCi12b2lkIHZwOF9kZV9hbGxvY19mcmFtZV9idWZmZXJzKFZQOF9DT01NT04gKm9jaSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fWVYxMl9CVUZGRVJTOyBpKyspCi0gICAgICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmb2NpLT55djEyX2ZiW2ldKTsKLQotICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmb2NpLT50ZW1wX3NjYWxlX2ZyYW1lKTsKLSAgICB2cDhfeXYxMl9kZV9hbGxvY19mcmFtZV9idWZmZXIoJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcik7Ci0KLSAgICB2cHhfZnJlZShvY2ktPmFib3ZlX2NvbnRleHQpOwotICAgIHZweF9mcmVlKG9jaS0+bWlwKTsKLQotICAgIG9jaS0+YWJvdmVfY29udGV4dCA9IDA7Ci0gICAgb2NpLT5taXAgPSAwOwotCi19Ci0KLWludCB2cDhfYWxsb2NfZnJhbWVfYnVmZmVycyhWUDhfQ09NTU9OICpvY2ksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBpbnQgaTsKLQotICAgIHZwOF9kZV9hbGxvY19mcmFtZV9idWZmZXJzKG9jaSk7Ci0KLSAgICAvKiBvdXIgaW50ZXJuYWwgYnVmZmVycyBhcmUgYWx3YXlzIG11bHRpcGxlcyBvZiAxNiAqLwotICAgIGlmICgod2lkdGggJiAweGYpICE9IDApCi0gICAgICAgIHdpZHRoICs9IDE2IC0gKHdpZHRoICYgMHhmKTsKLQotICAgIGlmICgoaGVpZ2h0ICYgMHhmKSAhPSAwKQotICAgICAgICBoZWlnaHQgKz0gMTYgLSAoaGVpZ2h0ICYgMHhmKTsKLQotCi0gICAgZm9yIChpID0gMDsgaSA8IE5VTV9ZVjEyX0JVRkZFUlM7IGkrKykKLSAgICB7Ci0gICAgICBvY2ktPmZiX2lkeF9yZWZfY250WzBdID0gMDsKLQotICAgICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmb2NpLT55djEyX2ZiW2ldLCAgd2lkdGgsIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcnMob2NpKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb2NpLT5uZXdfZmJfaWR4ID0gMDsKLSAgICBvY2ktPmxzdF9mYl9pZHggPSAxOwotICAgIG9jaS0+Z2xkX2ZiX2lkeCA9IDI7Ci0gICAgb2NpLT5hbHRfZmJfaWR4ID0gMzsKLQotICAgIG9jaS0+ZmJfaWR4X3JlZl9jbnRbMF0gPSAxOwotICAgIG9jaS0+ZmJfaWR4X3JlZl9jbnRbMV0gPSAxOwotICAgIG9jaS0+ZmJfaWR4X3JlZl9jbnRbMl0gPSAxOwotICAgIG9jaS0+ZmJfaWR4X3JlZl9jbnRbM10gPSAxOwotCi0gICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmb2NpLT50ZW1wX3NjYWxlX2ZyYW1lLCAgIHdpZHRoLCAxNiwgVlA4Qk9SREVSSU5QSVhFTFMpIDwgMCkKLSAgICB7Ci0gICAgICAgIHZwOF9kZV9hbGxvY19mcmFtZV9idWZmZXJzKG9jaSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmICh2cDhfeXYxMl9hbGxvY19mcmFtZV9idWZmZXIoJm9jaS0+cG9zdF9wcm9jX2J1ZmZlciwgd2lkdGgsIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpIDwgMCkKLSAgICB7Ci0gICAgICAgIHZwOF9kZV9hbGxvY19mcmFtZV9idWZmZXJzKG9jaSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIG9jaS0+bWJfcm93cyA9IGhlaWdodCA+PiA0OwotICAgIG9jaS0+bWJfY29scyA9IHdpZHRoID4+IDQ7Ci0gICAgb2NpLT5NQnMgPSBvY2ktPm1iX3Jvd3MgKiBvY2ktPm1iX2NvbHM7Ci0gICAgb2NpLT5tb2RlX2luZm9fc3RyaWRlID0gb2NpLT5tYl9jb2xzICsgMTsKLSAgICBvY2ktPm1pcCA9IHZweF9jYWxsb2MoKG9jaS0+bWJfY29scyArIDEpICogKG9jaS0+bWJfcm93cyArIDEpLCBzaXplb2YoTU9ERV9JTkZPKSk7Ci0KLSAgICBpZiAoIW9jaS0+bWlwKQotICAgIHsKLSAgICAgICAgdnA4X2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcnMob2NpKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgb2NpLT5taSA9IG9jaS0+bWlwICsgb2NpLT5tb2RlX2luZm9fc3RyaWRlICsgMTsKLQotCi0gICAgb2NpLT5hYm92ZV9jb250ZXh0ID0gdnB4X2NhbGxvYyhzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykgKiBvY2ktPm1iX2NvbHMsIDEpOwotCi0gICAgaWYgKCFvY2ktPmFib3ZlX2NvbnRleHQpCi0gICAgewotICAgICAgICB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycyhvY2kpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICB1cGRhdGVfbW9kZV9pbmZvX2JvcmRlcihvY2ktPm1pLCBvY2ktPm1iX3Jvd3MsIG9jaS0+bWJfY29scyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLXZvaWQgdnA4X3NldHVwX3ZlcnNpb24oVlA4X0NPTU1PTiAqY20pCi17Ci0gICAgc3dpdGNoIChjbS0+dmVyc2lvbikKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICBjbS0+bm9fbHBmID0gMDsKLSAgICAgICAgY20tPnNpbXBsZXJfbHBmID0gMDsKLSAgICAgICAgY20tPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIgPSAwOwotICAgICAgICBjbS0+ZnVsbF9waXhlbCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgICAgY20tPm5vX2xwZiA9IDA7Ci0gICAgICAgIGNtLT5zaW1wbGVyX2xwZiA9IDE7Ci0gICAgICAgIGNtLT51c2VfYmlsaW5lYXJfbWNfZmlsdGVyID0gMTsKLSAgICAgICAgY20tPmZ1bGxfcGl4ZWwgPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGNtLT5ub19scGYgPSAxOwotICAgICAgICBjbS0+c2ltcGxlcl9scGYgPSAwOwotICAgICAgICBjbS0+dXNlX2JpbGluZWFyX21jX2ZpbHRlciA9IDE7Ci0gICAgICAgIGNtLT5mdWxsX3BpeGVsID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICBjbS0+bm9fbHBmID0gMTsKLSAgICAgICAgY20tPnNpbXBsZXJfbHBmID0gMTsKLSAgICAgICAgY20tPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIgPSAxOwotICAgICAgICBjbS0+ZnVsbF9waXhlbCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qNCw1LDYsNyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UqLwotICAgICAgICBjbS0+bm9fbHBmID0gMDsKLSAgICAgICAgY20tPnNpbXBsZXJfbHBmID0gMDsKLSAgICAgICAgY20tPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIgPSAwOwotICAgICAgICBjbS0+ZnVsbF9waXhlbCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLXZvaWQgdnA4X2NyZWF0ZV9jb21tb24oVlA4X0NPTU1PTiAqb2NpKQotewotICAgIHZwOF9tYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhvY2kpOwotICAgIHZwOF9kZWZhdWx0X2NvZWZfcHJvYnMob2NpKTsKLSAgICB2cDhfaW5pdF9tYm1vZGVfcHJvYnMob2NpKTsKLSAgICB2cDhfZGVmYXVsdF9ibW9kZV9wcm9icyhvY2ktPmZjLmJtb2RlX3Byb2IpOwotCi0gICAgb2NpLT5tYl9ub19jb2VmZl9za2lwID0gMTsKLSAgICBvY2ktPm5vX2xwZiA9IDA7Ci0gICAgb2NpLT5zaW1wbGVyX2xwZiA9IDA7Ci0gICAgb2NpLT51c2VfYmlsaW5lYXJfbWNfZmlsdGVyID0gMDsKLSAgICBvY2ktPmZ1bGxfcGl4ZWwgPSAwOwotICAgIG9jaS0+bXVsdGlfdG9rZW5fcGFydGl0aW9uID0gT05FX1BBUlRJVElPTjsKLSAgICBvY2ktPmNscl90eXBlID0gUkVHX1lVVjsKLSAgICBvY2ktPmNsYW1wX3R5cGUgPSBSRUNPTl9DTEFNUF9SRVFVSVJFRDsKLQotICAgIC8qIEluaXRpYWxpc2UgcmVmZXJlbmNlIGZyYW1lIHNpZ24gYmlhcyBzdHJ1Y3R1cmUgdG8gZGVmYXVsdHMgKi8KLSAgICB2cHhfbWVtc2V0KG9jaS0+cmVmX2ZyYW1lX3NpZ25fYmlhcywgMCwgc2l6ZW9mKG9jaS0+cmVmX2ZyYW1lX3NpZ25fYmlhcykpOwotCi0gICAgLyogRGVmYXVsdCBkaXNhYmxlIGJ1ZmZlciB0byBidWZmZXIgY29weWluZyAqLwotICAgIG9jaS0+Y29weV9idWZmZXJfdG9fZ2YgPSAwOwotICAgIG9jaS0+Y29weV9idWZmZXJfdG9fYXJmID0gMDsKLX0KLQotdm9pZCB2cDhfcmVtb3ZlX2NvbW1vbihWUDhfQ09NTU9OICpvY2kpCi17Ci0gICAgdnA4X2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcnMob2NpKTsKLX0KLQotdm9pZCB2cDhfaW5pdGlhbGl6ZV9jb21tb24oKQotewotICAgIHZwOF9jb2VmX3RyZWVfaW5pdGlhbGl6ZSgpOwotCi0gICAgdnA4X2VudHJvcHlfbW9kZV9pbml0KCk7Ci0KLSAgICB2cDhfaW5pdF9zY2FuX29yZGVyX21hc2soKTsKLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vYXJtX3N5c3RlbWRlcGVuZGVudC5jIGIvdnA4L2NvbW1vbi9hcm0vYXJtX3N5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVjMDc1Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybV9zeXN0ZW1kZXBlbmRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9nX2NvbW1vbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vcHJhZ21hcy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vc3VicGl4ZWwuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9pZGN0LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKLQotdm9pZCB2cDhfYXJjaF9hcm1fY29tbW9uX2luaXQoVlA4X0NPTU1PTiAqY3R4KQotewotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBWUDhfQ09NTU9OX1JUQ0QgKnJ0Y2QgPSAmY3R4LT5ydGNkOwotICAgIGludCBmbGFncyA9IGFybV9jcHVfY2FwcygpOwotICAgIGludCBoYXNfZWRzcCA9IGZsYWdzICYgSEFTX0VEU1A7Ci0gICAgaW50IGhhc19tZWRpYSA9IGZsYWdzICYgSEFTX01FRElBOwotICAgIGludCBoYXNfbmVvbiA9IGZsYWdzICYgSEFTX05FT047Ci0gICAgcnRjZC0+ZmxhZ3MgPSBmbGFnczsKLQotICAgIC8qIE92ZXJyaWRlIGRlZmF1bHQgZnVuY3Rpb25zIHdpdGggZmFzdGVzdCBvbmVzIGZvciB0aGlzIENQVS4gKi8KLSNpZiBIQVZFX0FSTVY2Ci0gICAgaWYgKGhhc19tZWRpYSkKLSAgICB7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXAxNngxNiAgID0gdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYXJtdjY7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXA4eDggICAgID0gdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2FybXY2OwotICAgICAgICBydGNkLT5zdWJwaXguc2l4dGFwOHg0ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9hcm12NjsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDR4NCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3RfYXJtdjY7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5iaWxpbmVhcjE2eDE2ID0gdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9hcm12NjsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyOHg4ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9hcm12NjsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyOHg0ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9hcm12NjsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyNHg0ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9hcm12NjsKLQotICAgICAgICBydGNkLT5pZGN0LmlkY3QxICAgICAgICA9IHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfdjY7Ci0gICAgICAgIHJ0Y2QtPmlkY3QuaWRjdDE2ICAgICAgID0gdnA4X3Nob3J0X2lkY3Q0eDRsbG1fdjZfZHVhbDsKLSAgICAgICAgcnRjZC0+aWRjdC5pd2Fsc2gxICAgICAgPSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfdjY7Ci0gICAgICAgIHJ0Y2QtPmlkY3QuaXdhbHNoMTYgICAgID0gdnA4X3Nob3J0X2ludl93YWxzaDR4NF92NjsKLQotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl92ID0gdnA4X2xvb3BfZmlsdGVyX21idl9hcm12NjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5ub3JtYWxfYl92ICA9IHZwOF9sb29wX2ZpbHRlcl9idl9hcm12NjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5ub3JtYWxfbWJfaCA9IHZwOF9sb29wX2ZpbHRlcl9tYmhfYXJtdjY7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX2JfaCAgPSB2cDhfbG9vcF9maWx0ZXJfYmhfYXJtdjY7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX21iX3YgPSB2cDhfbG9vcF9maWx0ZXJfbWJ2c19hcm12NjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5zaW1wbGVfYl92ICA9IHZwOF9sb29wX2ZpbHRlcl9idnNfYXJtdjY7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX21iX2ggPSB2cDhfbG9vcF9maWx0ZXJfbWJoc19hcm12NjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5zaW1wbGVfYl9oICA9IHZwOF9sb29wX2ZpbHRlcl9iaHNfYXJtdjY7Ci0KLSAgICAgICAgcnRjZC0+cmVjb24uY29weTE2eDE2ICAgPSB2cDhfY29weV9tZW0xNngxNl92NjsKLSAgICAgICAgcnRjZC0+cmVjb24uY29weTh4OCAgICAgPSB2cDhfY29weV9tZW04eDhfdjY7Ci0gICAgICAgIHJ0Y2QtPnJlY29uLmNvcHk4eDQgICAgID0gdnA4X2NvcHlfbWVtOHg0X3Y2OwotICAgICAgICBydGNkLT5yZWNvbi5yZWNvbiAgICAgICA9IHZwOF9yZWNvbl9iX2FybXY2OwotICAgICAgICBydGNkLT5yZWNvbi5yZWNvbjIgICAgICA9IHZwOF9yZWNvbjJiX2FybXY2OwotICAgICAgICBydGNkLT5yZWNvbi5yZWNvbjQgICAgICA9IHZwOF9yZWNvbjRiX2FybXY2OwotICAgIH0KLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNwotICAgIGlmIChoYXNfbmVvbikKLSAgICB7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXAxNngxNiAgID0gdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfbmVvbjsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4OCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfbmVvbjsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4NCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbmVvbjsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDR4NCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3RfbmVvbjsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyMTZ4MTYgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X25lb247Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5iaWxpbmVhcjh4OCAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbmVvbjsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyOHg0ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9uZW9uOwotICAgICAgICBydGNkLT5zdWJwaXguYmlsaW5lYXI0eDQgICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X25lb247Ci0KLSAgICAgICAgcnRjZC0+aWRjdC5pZGN0MSAgICAgICAgPSB2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX25lb247Ci0gICAgICAgIHJ0Y2QtPmlkY3QuaWRjdDE2ICAgICAgID0gdnA4X3Nob3J0X2lkY3Q0eDRsbG1fbmVvbjsKLSAgICAgICAgcnRjZC0+aWRjdC5pd2Fsc2gxICAgICAgPSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfbmVvbjsKLSAgICAgICAgcnRjZC0+aWRjdC5pd2Fsc2gxNiAgICAgPSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X25lb247Ci0KLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5ub3JtYWxfbWJfdiA9IHZwOF9sb29wX2ZpbHRlcl9tYnZfbmVvbjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5ub3JtYWxfYl92ICA9IHZwOF9sb29wX2ZpbHRlcl9idl9uZW9uOwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl9oID0gdnA4X2xvb3BfZmlsdGVyX21iaF9uZW9uOwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9iX2ggID0gdnA4X2xvb3BfZmlsdGVyX2JoX25lb247Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX21iX3YgPSB2cDhfbG9vcF9maWx0ZXJfbWJ2c19uZW9uOwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9iX3YgID0gdnA4X2xvb3BfZmlsdGVyX2J2c19uZW9uOwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9tYl9oID0gdnA4X2xvb3BfZmlsdGVyX21iaHNfbmVvbjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5zaW1wbGVfYl9oICA9IHZwOF9sb29wX2ZpbHRlcl9iaHNfbmVvbjsKLQotICAgICAgICBydGNkLT5yZWNvbi5jb3B5MTZ4MTYgICA9IHZwOF9jb3B5X21lbTE2eDE2X25lb247Ci0gICAgICAgIHJ0Y2QtPnJlY29uLmNvcHk4eDggICAgID0gdnA4X2NvcHlfbWVtOHg4X25lb247Ci0gICAgICAgIHJ0Y2QtPnJlY29uLmNvcHk4eDQgICAgID0gdnA4X2NvcHlfbWVtOHg0X25lb247Ci0gICAgICAgIHJ0Y2QtPnJlY29uLnJlY29uICAgICAgID0gdnA4X3JlY29uX2JfbmVvbjsKLSAgICAgICAgcnRjZC0+cmVjb24ucmVjb24yICAgICAgPSB2cDhfcmVjb24yYl9uZW9uOwotICAgICAgICBydGNkLT5yZWNvbi5yZWNvbjQgICAgICA9IHZwOF9yZWNvbjRiX25lb247Ci0gICAgICAgIHJ0Y2QtPnJlY29uLnJlY29uX21iICAgID0gdnA4X3JlY29uX21iX25lb247Ci0gICAgICAgIHJ0Y2QtPnJlY29uLmJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5ID0KLSAgICAgICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9uZW9uOwotICAgICAgICBydGNkLT5yZWNvbi5idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zID0KLSAgICAgICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zX25lb247Ci0gICAgfQotI2VuZGlmCi0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vYXJtdjYvYmlsaW5lYXJmaWx0ZXJfdjYuYXNtIGIvdnA4L2NvbW1vbi9hcm0vYXJtdjYvYmlsaW5lYXJmaWx0ZXJfdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODZlZDVkLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2JpbGluZWFyZmlsdGVyX3Y2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzX2FybXY2fAotICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3NfYXJtdjZ8Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyByMSAgICB1bnNpZ25lZCBzaG9ydCAqZHN0X3B0ciwKLTsgcjIgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXRjaCwKLTsgcjMgICAgdW5zaWduZWQgaW50ICAgIGhlaWdodCwKLTsgc3RhY2sgdW5zaWduZWQgaW50ICAgIHdpZHRoLAotOyBzdGFjayBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgVGhlIG91dHB1dCBpcyB0cmFuc3Bvc2VkIHN0cm9lZCBpbiBvdXRwdXQgYXJyYXkgdG8gbWFrZSBpdCBlYXN5IGZvciBzZWNvbmQgcGFzcyBmaWx0ZXJpbmcuCi18dnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzX2FybXY2fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIGFkZHJlc3MKLSAgICBsZHIgICAgIHI0LCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICAgOyB3aWR0aAotCi0gICAgbW92ICAgICByMTIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgIDsgb3V0ZXItbG9vcCBjb3VudGVyCi0gICAgc3ViICAgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgc3JjIGluY3JlbWVudCBmb3IgaGVpZ2h0IGxvb3AKLQotICAgIDs7SUYgQVJDSElURUNUVVJFPTYKLSAgICBwbGQgICAgIFtyMF0KLSAgICA7O0VORElGCi0KLSAgICBsZHIgICAgIHI1LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIGZpbHRlciBjb2VmZmljaWVudHMKLQotICAgIG1vdiAgICAgcjMsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICA7IGhlaWdodCoyCi0gICAgYWRkICAgICByMywgcjMsICMyICAgICAgICAgICAgICAgICAgICAgIDsgcGx1cyAyIHRvIG1ha2Ugb3V0cHV0IGJ1ZmZlciA0LWJpdCBhbGlnbmVkIHNpbmNlIGhlaWdodCBpcyBhY3R1YWxseSAoaGVpZ2h0KzEpCi0KLSAgICBtb3YgICAgIHIxMSwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGRzdF9wdHIgZm9yIGVhY2ggcm93Ci0KLSAgICBjbXAgICAgIHI1LCAjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgOyBpZiBmaWx0ZXIgY29lZiA9IDEyOCwgdGhlbiBza2lwIHRoZSBmaWx0ZXIKLSAgICBiZXEgICAgIGJpbF9udWxsXzFzdF9maWx0ZXIKLQotfGJpbF9oZWlnaHRfbG9vcF8xc3RfdjZ8Ci0gICAgbGRyYiAgICByNiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQotICAgIGxkcmIgICAgcjcsIFtyMCwgIzFdCi0gICAgbGRyYiAgICByOCwgW3IwLCAjMl0KLSAgICBtb3YgICAgIGxyLCByNCwgbHNyICMyICAgICAgICAgICAgICAgICAgOyA0LWluLXBhcmVsbGVsIGxvb3AgY291bnRlcgotCi18YmlsX3dpZHRoX2xvb3BfMXN0X3Y2fAotICAgIGxkcmIgICAgcjksIFtyMCwgIzNdCi0gICAgbGRyYiAgICByMTAsIFtyMCwgIzRdCi0KLSAgICBwa2hidCAgIHI2LCByNiwgcjcsIGxzbCAjMTYgICAgICAgICAgICAgOyBzcmNbMV0gfCBzcmNbMF0KLSAgICBwa2hidCAgIHI3LCByNywgcjgsIGxzbCAjMTYgICAgICAgICAgICAgOyBzcmNbMl0gfCBzcmNbMV0KLQotICAgIHNtdWFkICAgcjYsIHI2LCByNSAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IHRoZSBmaWx0ZXIKLSAgICBwa2hidCAgIHI4LCByOCwgcjksIGxzbCAjMTYgICAgICAgICAgICAgOyBzcmNbM10gfCBzcmNbMl0KLSAgICBzbXVhZCAgIHI3LCByNywgcjUKLSAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyBzcmNbNF0gfCBzcmNbM10KLQotICAgIHNtdWFkICAgcjgsIHI4LCByNQotICAgIHNtdWFkICAgcjksIHI5LCByNQotCi0gICAgYWRkICAgICByMCwgcjAsICM0Ci0gICAgc3VicyAgICBsciwgbHIsICMxCi0KLSAgICBhZGQgICAgIHI2LCByNiwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKLSAgICBhZGQgICAgIHI3LCByNywgIzB4NDAKLSAgICB1c2F0ICAgIHI2LCAjMTYsIHI2LCBhc3IgIzcKLSAgICB1c2F0ICAgIHI3LCAjMTYsIHI3LCBhc3IgIzcKLQotICAgIHN0cmggICAgcjYsIFtyMV0sIHIzICAgICAgICAgICAgICAgICAgICA7IHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGFuZCBzdG9yZWQKLQotICAgIGFkZCAgICAgcjgsIHI4LCAjMHg0MCAgICAgICAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAotICAgIHN0cmggICAgcjcsIFtyMV0sIHIzCi0gICAgYWRkICAgICByOSwgcjksICMweDQwCi0gICAgdXNhdCAgICByOCwgIzE2LCByOCwgYXNyICM3Ci0gICAgdXNhdCAgICByOSwgIzE2LCByOSwgYXNyICM3Ci0KLSAgICBzdHJoICAgIHI4LCBbcjFdLCByMyAgICAgICAgICAgICAgICAgICAgOyByZXN1bHQgaXMgdHJhbnNwb3NlZCBhbmQgc3RvcmVkCi0KLSAgICBsZHJuZWIgIHI2LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHNvdXJjZSBkYXRhCi0gICAgc3RyaCAgICByOSwgW3IxXSwgcjMKLQotICAgIGxkcm5lYiAgcjcsIFtyMCwgIzFdCi0gICAgbGRybmViICByOCwgW3IwLCAjMl0KLQotICAgIGJuZSAgICAgYmlsX3dpZHRoX2xvb3BfMXN0X3Y2Ci0KLSAgICBhZGQgICAgIHIwLCByMCwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIG5leHQgaW5wdXQgcm93Ci0gICAgc3VicyAgICByMTIsIHIxMiwgIzEKLQotICAgIDs7SUYgQVJDSElURUNUVVJFPTYKLSAgICBwbGQgICAgIFtyMF0KLSAgICA7O0VORElGCi0KLSAgICBhZGQgICAgIHIxMSwgcjExLCAjMiAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIG92ZXIgdG8gbmV4dCBjb2x1bW4KLSAgICBtb3YgICAgIHIxLCByMTEKLQotICAgIGJuZSAgICAgYmlsX2hlaWdodF9sb29wXzFzdF92NgotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLXxiaWxfbnVsbF8xc3RfZmlsdGVyfAotfGJpbF9oZWlnaHRfbG9vcF9udWxsXzFzdHwKLSAgICBtb3YgICAgIGxyLCByNCwgbHNyICMyICAgICAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKLQotfGJpbF93aWR0aF9sb29wX251bGxfMXN0fAotICAgIGxkcmIgICAgcjYsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQotICAgIGxkcmIgICAgcjcsIFtyMCwgIzFdCi0gICAgbGRyYiAgICByOCwgW3IwLCAjMl0KLSAgICBsZHJiICAgIHI5LCBbcjAsICMzXQotCi0gICAgc3RyaCAgICByNiwgW3IxXSwgcjMgICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgaXQgdG8gaW1tZWRpYXRlIGJ1ZmZlcgotICAgIGFkZCAgICAgcjAsIHIwLCAjNAotICAgIHN0cmggICAgcjcsIFtyMV0sIHIzCi0gICAgc3VicyAgICBsciwgbHIsICMxCi0gICAgc3RyaCAgICByOCwgW3IxXSwgcjMKLSAgICBzdHJoICAgIHI5LCBbcjFdLCByMwotCi0gICAgYm5lICAgICBiaWxfd2lkdGhfbG9vcF9udWxsXzFzdAotCi0gICAgc3VicyAgICByMTIsIHIxMiwgIzEKLSAgICBhZGQgICAgIHIwLCByMCwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIG5leHQgaW5wdXQgbGluZQotICAgIGFkZCAgICAgcjExLCByMTEsICMyICAgICAgICAgICAgICAgICAgICA7IG1vdmUgb3ZlciB0byBuZXh0IGNvbHVtbgotICAgIG1vdiAgICAgcjEsIHIxMQotCi0gICAgYm5lICAgICBiaWxfaGVpZ2h0X2xvb3BfbnVsbF8xc3QKLQotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0gICAgRU5EUCAgOyB8dnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzX2FybXY2fAotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgcjAgICAgdW5zaWduZWQgc2hvcnQgKnNyY19wdHIsCi07IHIxICAgIHVuc2lnbmVkIGNoYXIgICpkc3RfcHRyLAotOyByMiAgICBpbnQgICAgICAgICAgICAgZHN0X3BpdGNoLAotOyByMyAgICB1bnNpZ25lZCBpbnQgICAgaGVpZ2h0LAotOyBzdGFjayB1bnNpZ25lZCBpbnQgICAgd2lkdGgsCi07IHN0YWNrIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18dnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzc19hcm12NnwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0gICAgbGRyICAgICByMTEsIFtzcCwgIzQwXSAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciBhZGRyZXNzCi0gICAgbGRyICAgICByNCwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgIDsgd2lkdGgKLQotICAgIGxkciAgICAgcjUsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgZmlsdGVyIGNvZWZmaWNpZW50cwotICAgIG1vdiAgICAgcjEyLCByNCAgICAgICAgICAgICAgICAgICAgICAgICA7IG91dGVyLWxvb3AgY291bnRlciA9IHdpZHRoLCBzaW5jZSB3ZSB3b3JrIG9uIHRyYW5zcG9zZWQgZGF0YSBtYXRyaXgKLSAgICBtb3YgICAgIHIxMSwgcjEKLQotICAgIGNtcCAgICAgcjUsICMxMjggICAgICAgICAgICAgICAgICAgICAgICA7IGlmIGZpbHRlciBjb2VmID0gMTI4LCB0aGVuIHNraXAgdGhlIGZpbHRlcgotICAgIGJlcSAgICAgYmlsX251bGxfMm5kX2ZpbHRlcgotCi18YmlsX2hlaWdodF9sb29wXzJuZHwKLSAgICBsZHIgICAgIHI2LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCi0gICAgbGRyICAgICByOCwgW3IwLCAjNF0KLSAgICBsZHJoICAgIHIxMCwgW3IwLCAjOF0KLSAgICBtb3YgICAgIGxyLCByMywgbHNyICMyICAgICAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKLQotfGJpbF93aWR0aF9sb29wXzJuZHwKLSAgICBwa2h0YiAgIHI3LCByNiwgcjggICAgICAgICAgICAgICAgICAgICAgOyBzcmNbMV0gfCBzcmNbMl0KLSAgICBwa2h0YiAgIHI5LCByOCwgcjEwICAgICAgICAgICAgICAgICAgICAgOyBzcmNbM10gfCBzcmNbNF0KLQotICAgIHNtdWFkICAgcjYsIHI2LCByNSAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IGZpbHRlcgotICAgIHNtdWFkICAgcjgsIHI4LCByNSAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IGZpbHRlcgotCi0gICAgc3VicyAgICBsciwgbHIsICMxCi0KLSAgICBzbXVhZHggIHI3LCByNywgcjUgICAgICAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKLSAgICBzbXVhZHggIHI5LCByOSwgcjUgICAgICAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKLQotICAgIGFkZCAgICAgcjAsIHIwLCAjOAotCi0gICAgYWRkICAgICByNiwgcjYsICMweDQwICAgICAgICAgICAgICAgICAgIDsgcm91bmRfc2hpZnRfYW5kX2NsYW1wCi0gICAgYWRkICAgICByNywgcjcsICMweDQwCi0gICAgdXNhdCAgICByNiwgIzgsIHI2LCBhc3IgIzcKLSAgICB1c2F0ICAgIHI3LCAjOCwgcjcsIGFzciAjNwotICAgIHN0cmIgICAgcjYsIFtyMV0sIHIyICAgICAgICAgICAgICAgICAgICA7IHRoZSByZXN1bHQgaXMgdHJhbnNwb3NlZCBiYWNrIGFuZCBzdG9yZWQKLQotICAgIGFkZCAgICAgcjgsIHI4LCAjMHg0MCAgICAgICAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAotICAgIHN0cmIgICAgcjcsIFtyMV0sIHIyCi0gICAgYWRkICAgICByOSwgcjksICMweDQwCi0gICAgdXNhdCAgICByOCwgIzgsIHI4LCBhc3IgIzcKLSAgICB1c2F0ICAgIHI5LCAjOCwgcjksIGFzciAjNwotICAgIHN0cmIgICAgcjgsIFtyMV0sIHIyICAgICAgICAgICAgICAgICAgICA7IHRoZSByZXN1bHQgaXMgdHJhbnNwb3NlZCBiYWNrIGFuZCBzdG9yZWQKLQotICAgIGxkcm5lICAgcjYsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQotICAgIHN0cmIgICAgcjksIFtyMV0sIHIyCi0gICAgbGRybmUgICByOCwgW3IwLCAjNF0KLSAgICBsZHJuZWggIHIxMCwgW3IwLCAjOF0KLQotICAgIGJuZSAgICAgYmlsX3dpZHRoX2xvb3BfMm5kCi0KLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQotICAgIGFkZCAgICAgcjAsIHIwLCAjNCAgICAgICAgICAgICAgICAgICAgICA7IHVwZGF0ZSBzcmMgZm9yIG5leHQgcm93Ci0gICAgYWRkICAgICByMTEsIHIxMSwgIzEKLSAgICBtb3YgICAgIHIxLCByMTEKLQotICAgIGJuZSAgICAgYmlsX2hlaWdodF9sb29wXzJuZAotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi18YmlsX251bGxfMm5kX2ZpbHRlcnwKLXxiaWxfaGVpZ2h0X2xvb3BfbnVsbF8ybmR8Ci0gICAgbW92ICAgICBsciwgcjMsIGxzciAjMgotCi18YmlsX3dpZHRoX2xvb3BfbnVsbF8ybmR8Ci0gICAgbGRyICAgICByNiwgW3IwXSwgIzQgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhCi0gICAgc3VicyAgICBsciwgbHIsICMxCi0gICAgbGRyICAgICByOCwgW3IwXSwgIzQKLQotICAgIHN0cmIgICAgcjYsIFtyMV0sIHIyICAgICAgICAgICAgICAgICAgICA7IHN0b3JlIGRhdGEKLSAgICBtb3YgICAgIHI3LCByNiwgbHNyICMxNgotICAgIHN0cmIgICAgcjcsIFtyMV0sIHIyCi0gICAgbW92ICAgICByOSwgcjgsIGxzciAjMTYKLSAgICBzdHJiICAgIHI4LCBbcjFdLCByMgotICAgIHN0cmIgICAgcjksIFtyMV0sIHIyCi0KLSAgICBibmUgICAgIGJpbF93aWR0aF9sb29wX251bGxfMm5kCi0KLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQotICAgIGFkZCAgICAgcjAsIHIwLCAjNAotICAgIGFkZCAgICAgcjExLCByMTEsICMxCi0gICAgbW92ICAgICByMSwgcjExCi0KLSAgICBibmUgICAgIGJpbF9oZWlnaHRfbG9vcF9udWxsXzJuZAotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgOyB8dnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2fAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtMTZ4MTZfdjYuYXNtIGIvdnA4L2NvbW1vbi9hcm0vYXJtdjYvY29weW1lbTE2eDE2X3Y2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhOTFhMC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtMTZ4MTZfdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfY29weV9tZW0xNngxNl92NnwKLSAgICA7IEFSTQotICAgIDsgUkVRVUlSRTgKLSAgICA7IFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICBCbG9jaywgQ09ERSwgUkVBRE9OTFkgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQotO3ZvaWQgY29weV9tZW0xNngxNl92NiggdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSkKLTstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KLXx2cDhfY29weV9tZW0xNngxNl92NnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjd9Ci0gICAgO3B1c2ggICB7cjQtcjd9Ci0KLSAgICA7cHJlbG9hZAotICAgIHBsZCAgICAgW3IwXQotICAgIHBsZCAgICAgW3IwLCByMV0KLSAgICBwbGQgICAgIFtyMCwgcjEsIGxzbCAjMV0KLQotICAgIGFuZHMgICAgcjQsIHIwLCAjMTUKLSAgICBiZXEgICAgIGNvcHlfbWVtMTZ4MTZfZmFzdAotCi0gICAgYW5kcyAgICByNCwgcjAsICM3Ci0gICAgYmVxICAgICBjb3B5X21lbTE2eDE2XzgKLQotICAgIGFuZHMgICAgcjQsIHIwLCAjMwotICAgIGJlcSAgICAgY29weV9tZW0xNngxNl80Ci0KLSAgICA7Y29weSBvbmUgYnl0ZSBlYWNoIHRpbWUKLSAgICBsZHJiICAgIHI0LCBbcjBdCi0gICAgbGRyYiAgICByNSwgW3IwLCAjMV0KLSAgICBsZHJiICAgIHI2LCBbcjAsICMyXQotICAgIGxkcmIgICAgcjcsIFtyMCwgIzNdCi0KLSAgICBtb3YgICAgIHIxMiwgIzE2Ci0KLWNvcHlfbWVtMTZ4MTZfMV9sb29wCi0gICAgc3RyYiAgICByNCwgW3IyXQotICAgIHN0cmIgICAgcjUsIFtyMiwgIzFdCi0gICAgc3RyYiAgICByNiwgW3IyLCAjMl0KLSAgICBzdHJiICAgIHI3LCBbcjIsICMzXQotCi0gICAgbGRyYiAgICByNCwgW3IwLCAjNF0KLSAgICBsZHJiICAgIHI1LCBbcjAsICM1XQotICAgIGxkcmIgICAgcjYsIFtyMCwgIzZdCi0gICAgbGRyYiAgICByNywgW3IwLCAjN10KLQotICAgIHN1YnMgICAgcjEyLCByMTIsICMxCi0KLSAgICBzdHJiICAgIHI0LCBbcjIsICM0XQotICAgIHN0cmIgICAgcjUsIFtyMiwgIzVdCi0gICAgc3RyYiAgICByNiwgW3IyLCAjNl0KLSAgICBzdHJiICAgIHI3LCBbcjIsICM3XQotCi0gICAgbGRyYiAgICByNCwgW3IwLCAjOF0KLSAgICBsZHJiICAgIHI1LCBbcjAsICM5XQotICAgIGxkcmIgICAgcjYsIFtyMCwgIzEwXQotICAgIGxkcmIgICAgcjcsIFtyMCwgIzExXQotCi0gICAgc3RyYiAgICByNCwgW3IyLCAjOF0KLSAgICBzdHJiICAgIHI1LCBbcjIsICM5XQotICAgIHN0cmIgICAgcjYsIFtyMiwgIzEwXQotICAgIHN0cmIgICAgcjcsIFtyMiwgIzExXQotCi0gICAgbGRyYiAgICByNCwgW3IwLCAjMTJdCi0gICAgbGRyYiAgICByNSwgW3IwLCAjMTNdCi0gICAgbGRyYiAgICByNiwgW3IwLCAjMTRdCi0gICAgbGRyYiAgICByNywgW3IwLCAjMTVdCi0KLSAgICBhZGQgICAgIHIwLCByMCwgcjEKLQotICAgIHN0cmIgICAgcjQsIFtyMiwgIzEyXQotICAgIHN0cmIgICAgcjUsIFtyMiwgIzEzXQotICAgIHN0cmIgICAgcjYsIFtyMiwgIzE0XQotICAgIHN0cmIgICAgcjcsIFtyMiwgIzE1XQotCi0gICAgYWRkICAgICByMiwgcjIsIHIzCi0KLSAgICBsZHJuZWIgIHI0LCBbcjBdCi0gICAgbGRybmViICByNSwgW3IwLCAjMV0KLSAgICBsZHJuZWIgIHI2LCBbcjAsICMyXQotICAgIGxkcm5lYiAgcjcsIFtyMCwgIzNdCi0KLSAgICBibmUgICAgIGNvcHlfbWVtMTZ4MTZfMV9sb29wCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQotICAgIDtwb3AgICAgICAgIHtyNC1yN30KLSAgICBtb3YgICAgIHBjLCBscgotCi07Y29weSA0IGJ5dGVzIGVhY2ggdGltZQotY29weV9tZW0xNngxNl80Ci0gICAgbGRyICAgICByNCwgW3IwXQotICAgIGxkciAgICAgcjUsIFtyMCwgIzRdCi0gICAgbGRyICAgICByNiwgW3IwLCAjOF0KLSAgICBsZHIgICAgIHI3LCBbcjAsICMxMl0KLQotICAgIG1vdiAgICAgcjEyLCAjMTYKLQotY29weV9tZW0xNngxNl80X2xvb3AKLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQotICAgIGFkZCAgICAgcjAsIHIwLCByMQotCi0gICAgc3RyICAgICByNCwgW3IyXQotICAgIHN0ciAgICAgcjUsIFtyMiwgIzRdCi0gICAgc3RyICAgICByNiwgW3IyLCAjOF0KLSAgICBzdHIgICAgIHI3LCBbcjIsICMxMl0KLQotICAgIGFkZCAgICAgcjIsIHIyLCByMwotCi0gICAgbGRybmUgICByNCwgW3IwXQotICAgIGxkcm5lICAgcjUsIFtyMCwgIzRdCi0gICAgbGRybmUgICByNiwgW3IwLCAjOF0KLSAgICBsZHJuZSAgIHI3LCBbcjAsICMxMl0KLQotICAgIGJuZSAgICAgY29weV9tZW0xNngxNl80X2xvb3AKLQotICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjd9Ci0gICAgO3BvcCAgICAgICAge3I0LXI3fQotICAgIG1vdiAgICAgcGMsIGxyCi0KLTtjb3B5IDggYnl0ZXMgZWFjaCB0aW1lCi1jb3B5X21lbTE2eDE2XzgKLSAgICBzdWIgICAgIHIxLCByMSwgIzE2Ci0gICAgc3ViICAgICByMywgcjMsICMxNgotCi0gICAgbW92ICAgICByMTIsICMxNgotCi1jb3B5X21lbTE2eDE2XzhfbG9vcAotICAgIGxkbWlhICAgcjAhLCB7cjQtcjV9Ci0gICAgO2xkbSAgICAgICAgcjAsIHtyNC1yNX0KLSAgICBsZG1pYSAgIHIwISwge3I2LXI3fQotCi0gICAgYWRkICAgICByMCwgcjAsIHIxCi0KLSAgICBzdG1pYSAgIHIyISwge3I0LXI1fQotICAgIHN1YnMgICAgcjEyLCByMTIsICMxCi0gICAgO3N0bSAgICAgICAgcjIsIHtyNC1yNX0KLSAgICBzdG1pYSAgIHIyISwge3I2LXI3fQotCi0gICAgYWRkICAgICByMiwgcjIsIHIzCi0KLSAgICBibmUgICAgIGNvcHlfbWVtMTZ4MTZfOF9sb29wCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQotICAgIDtwb3AgICAgICAgIHtyNC1yN30KLSAgICBtb3YgICAgIHBjLCBscgotCi07Y29weSAxNiBieXRlcyBlYWNoIHRpbWUKLWNvcHlfbWVtMTZ4MTZfZmFzdAotICAgIDtzdWIgICAgICAgIHIxLCByMSwgIzE2Ci0gICAgO3N1YiAgICAgICAgcjMsIHIzLCAjMTYKLQotICAgIG1vdiAgICAgcjEyLCAjMTYKLQotY29weV9tZW0xNngxNl9mYXN0X2xvb3AKLSAgICBsZG1pYSAgIHIwLCB7cjQtcjd9Ci0gICAgO2xkbSAgICAgICAgcjAsIHtyNC1yN30KLSAgICBhZGQgICAgIHIwLCByMCwgcjEKLQotICAgIHN1YnMgICAgcjEyLCByMTIsICMxCi0gICAgc3RtaWEgICByMiwge3I0LXI3fQotICAgIDtzdG0gICAgICAgIHIyLCB7cjQtcjd9Ci0gICAgYWRkICAgICByMiwgcjIsIHIzCi0KLSAgICBibmUgICAgIGNvcHlfbWVtMTZ4MTZfZmFzdF9sb29wCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHI3fQotICAgIDtwb3AgICAgICAgIHtyNC1yN30KLSAgICBtb3YgICAgIHBjLCBscgotCi0gICAgRU5EUCAgOyB8dnA4X2NvcHlfbWVtMTZ4MTZfdjZ8Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2RjX29ubHlfaWRjdF9hZGRfdjYuYXNtIGIvdnA4L2NvbW1vbi9hcm0vYXJtdjYvZGNfb25seV9pZGN0X2FkZF92Ni5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjYwZTkuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vYXJtdjYvZGNfb25seV9pZGN0X2FkZF92Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Ci07ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUwotOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLSAgICBFWFBPUlQgIHx2cDhfZGNfb25seV9pZGN0X2FkZF92NnwKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkKLQotO3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYoc2hvcnQgaW5wdXRfZGMsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHBpdGNoLCBpbnQgc3RyaWRlKQotOyByMCAgaW5wdXRfZGMKLTsgcjEgIHByZWRfcHRyCi07IHIyICBkZXN0X3B0cgotOyByMyAgcGl0Y2gKLTsgc3AgIHN0cmlkZQotCi18dnA4X2RjX29ubHlfaWRjdF9hZGRfdjZ8IFBST0MKLSAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHI3LCBscn0KLQotICAgIGFkZCAgICAgICAgIHIwLCByMCwgIzQgICAgICAgICAgICAgICAgOyBpbnB1dF9kYyArPSA0Ci0gICAgbGRyICAgICAgICAgcjEyLCBjMHgwMDAwRkZGRgotICAgIGxkciAgICAgICAgIHI0LCBbcjFdLCByMwotICAgIGxkciAgICAgICAgIHI2LCBbcjFdLCByMwotICAgIGFuZCAgICAgICAgIHIwLCByMTIsIHIwLCBhc3IgIzMgICAgICAgOyBpbnB1dF9kYyA+PiAzICsgbWFzawotICAgIGxkciAgICAgICAgIGxyLCBbc3AsICMyMF0KLSAgICBvcnIgICAgICAgICByMCwgcjAsIHIwLCBsc2wgIzE2ICAgICAgIDsgYTEgfCBhMQotCi0gICAgdXh0YWIxNiAgICAgcjUsIHIwLCByNCAgICAgICAgICAgICAgICA7IGExKzIgfCBhMSswCi0gICAgdXh0YWIxNiAgICAgcjQsIHIwLCByNCwgcm9yICM4ICAgICAgICA7IGExKzMgfCBhMSsxCi0gICAgdXh0YWIxNiAgICAgcjcsIHIwLCByNgotICAgIHV4dGFiMTYgICAgIHI2LCByMCwgcjYsIHJvciAjOAotICAgIHVzYXQxNiAgICAgIHI1LCAjOCwgcjUKLSAgICB1c2F0MTYgICAgICByNCwgIzgsIHI0Ci0gICAgdXNhdDE2ICAgICAgcjcsICM4LCByNwotICAgIHVzYXQxNiAgICAgIHI2LCAjOCwgcjYKLSAgICBvcnIgICAgICAgICByNSwgcjUsIHI0LCBsc2wgIzgKLSAgICBvcnIgICAgICAgICByNywgcjcsIHI2LCBsc2wgIzgKLSAgICBsZHIgICAgICAgICByNCwgW3IxXSwgcjMKLSAgICBsZHIgICAgICAgICByNiwgW3IxXQotICAgIHN0ciAgICAgICAgIHI1LCBbcjJdLCBscgotICAgIHN0ciAgICAgICAgIHI3LCBbcjJdLCBscgotCi0gICAgdXh0YWIxNiAgICAgcjUsIHIwLCByNAotICAgIHV4dGFiMTYgICAgIHI0LCByMCwgcjQsIHJvciAjOAotICAgIHV4dGFiMTYgICAgIHI3LCByMCwgcjYKLSAgICB1eHRhYjE2ICAgICByNiwgcjAsIHI2LCByb3IgIzgKLSAgICB1c2F0MTYgICAgICByNSwgIzgsIHI1Ci0gICAgdXNhdDE2ICAgICAgcjQsICM4LCByNAotICAgIHVzYXQxNiAgICAgIHI3LCAjOCwgcjcKLSAgICB1c2F0MTYgICAgICByNiwgIzgsIHI2Ci0gICAgb3JyICAgICAgICAgcjUsIHI1LCByNCwgbHNsICM4Ci0gICAgb3JyICAgICAgICAgcjcsIHI3LCByNiwgbHNsICM4Ci0gICAgc3RyICAgICAgICAgcjUsIFtyMl0sIGxyCi0gICAgc3RyICAgICAgICAgcjcsIFtyMl0KLQotICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjcsIHBjfQotCi0gICAgRU5EUCAgOyB8dnA4X2RjX29ubHlfaWRjdF9hZGRfdjZ8Ci0KLTsgQ29uc3RhbnQgUG9vbAotYzB4MDAwMEZGRkYgRENEIDB4MDAwMEZGRkYKLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2ZpbHRlcl92Ni5hc20gYi92cDgvY29tbW9uL2FybS9hcm12Ni9maWx0ZXJfdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2I1YmNjLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2ZpbHRlcl92Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX2FybXY2fAotICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NnwKLSAgICBFWFBPUlQgIHx2cDhfZmlsdGVyNF9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2fAotICAgIEVYUE9SVCAgfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX29ubHlfYXJtdjZ8Ci0gICAgRVhQT1JUICB8dnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX29ubHlfYXJtdjZ8Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IHIxICAgIHNob3J0ICAgICAgICAgKm91dHB1dF9wdHIKLTsgcjIgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUKLTsgcjMgICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aAotOyBzdGFjayB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodAotOyBzdGFjayBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdnA4X2ZpbHRlciB0aGUgaW5wdXQgYW5kIHB1dCBpbiB0aGUgb3V0cHV0IGFycmF5LiAgQXBwbHkgdGhlIDYgdGFwIEZJUiBmaWx0ZXIgd2l0aAotOyB0aGUgb3V0cHV0IGJlaW5nIGEgMiBieXRlIHZhbHVlIGFuZCB0aGUgaW50cHV0IGJlaW5nIGEgMSBieXRlIHZhbHVlLgotfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX2FybXY2fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIGFkZHJlc3MKLSAgICBsZHIgICAgIHI3LCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICAgOyBvdXRwdXQgaGVpZ2h0Ci0KLSAgICBzdWIgICAgIHIyLCByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBpbnNpZGUgbG9vcCBpbmNyZW1lbnRzIGlucHV0IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNvIHRoZSBoZWlnaHQgbG9vcCBvbmx5IG5lZWRzIHRvIGFkZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHIyIC0gd2lkdGggdG8gdGhlIGlucHV0IHBvaW50ZXIKLQotICAgIG1vdiAgICAgcjMsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICA7IG11bHRpcGx5IHdpZHRoIGJ5IDIgYmVjYXVzZSB1c2luZyBzaG9ydHMKLSAgICBhZGQgICAgIHIxMiwgcjMsICMxNiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgb2ZmIHRoZSBvdXRwdXQKLSAgICBzdWIgICAgIHNwLCBzcCwgIzQKLQotICAgIDs7SUYgQVJDSElURUNUVVJFPTYKLSAgICA7cGxkICAgICAgICBbcjAsICMtMl0KLSAgICA7O3BsZCAgICAgICBbcjAsICMzMF0KLSAgICA7O0VORElGCi0KLSAgICBsZHIgICAgIHI0LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIHBhY2tlZCBmaWx0ZXIgY29lZmZpY2llbnRzCi0gICAgbGRyICAgICByNSwgW3IxMSwgIzRdCi0gICAgbGRyICAgICByNiwgW3IxMSwgIzhdCi0KLSAgICBzdHIgICAgIHIxLCBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgOyBwdXNoIGRlc3RpbmF0aW9uIHRvIHN0YWNrCi0gICAgbW92ICAgICByNywgcjcsIGxzbCAjMTYgICAgICAgICAgICAgICAgIDsgaGVpZ2h0IGlzIHRvcCBwYXJ0IG9mIGNvdW50ZXIKLQotOyBzaXggdGFwIGZpbHRlcgotfGhlaWdodF9sb29wXzFzdF82fAotICAgIGxkcmIgICAgcjgsIFtyMCwgIy0yXSAgICAgICAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKLSAgICBsZHJiICAgIHI5LCBbcjAsICMtMV0KLSAgICBsZHJiICAgIHIxMCwgW3IwXSwgIzIKLSAgICBvcnIgICAgIHI3LCByNywgcjMsIGxzciAjMiAgICAgICAgICAgICAgOyBjb25zdHJ1Y3QgbG9vcCBjb3VudGVyCi0KLXx3aWR0aF9sb29wXzFzdF82fAotICAgIGxkcmIgICAgcjExLCBbcjAsICMtMV0KLQotICAgIHBraGJ0ICAgbHIsIHI4LCByOSwgbHNsICMxNiAgICAgICAgICAgICA7IHI5IHwgcjgKLSAgICBwa2hidCAgIHI4LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQotCi0gICAgbGRyYiAgICByOSwgW3IwXQotCi0gICAgc211YWQgICBsciwgbHIsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgYXBwbHkgdGhlIGZpbHRlcgotICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAotICAgIHNtdWFkICAgcjgsIHI4LCByNAotICAgIHBraGJ0ICAgcjExLCByMTEsIHI5LCBsc2wgIzE2ICAgICAgICAgICA7IHI5IHwgcjExCi0KLSAgICBzbWxhZCAgIGxyLCByMTAsIHI1LCBscgotICAgIGxkcmIgICAgcjEwLCBbcjAsICMxXQotICAgIHNtbGFkICAgcjgsIHIxMSwgcjUsIHI4Ci0gICAgbGRyYiAgICByMTEsIFtyMCwgIzJdCi0KLSAgICBzdWIgICAgIHI3LCByNywgIzEKLQotICAgIHBraGJ0ICAgcjksIHI5LCByMTAsIGxzbCAjMTYgICAgICAgICAgICA7IHIxMCB8IHI5Ci0gICAgcGtoYnQgICByMTAsIHIxMCwgcjExLCBsc2wgIzE2ICAgICAgICAgIDsgcjExIHwgcjEwCi0KLSAgICBzbWxhZCAgIGxyLCByOSwgcjYsIGxyCi0gICAgc21sYWQgICByMTEsIHIxMCwgcjYsIHI4Ci0KLSAgICBhbmRzICAgIHIxMCwgcjcsICMweGZmICAgICAgICAgICAgICAgICAgOyB0ZXN0IGxvb3AgY291bnRlcgotCi0gICAgYWRkICAgICBsciwgbHIsICMweDQwICAgICAgICAgICAgICAgICAgIDsgcm91bmRfc2hpZnRfYW5kX2NsYW1wCi0gICAgbGRybmViICByOCwgW3IwLCAjLTJdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZvciBuZXh0IGxvb3AKLSAgICB1c2F0ICAgIGxyLCAjOCwgbHIsIGFzciAjNwotICAgIGFkZCAgICAgcjExLCByMTEsICMweDQwCi0gICAgbGRybmViICByOSwgW3IwLCAjLTFdCi0gICAgdXNhdCAgICByMTEsICM4LCByMTEsIGFzciAjNwotCi0gICAgc3RyaCAgICBsciwgW3IxXSwgcjEyICAgICAgICAgICAgICAgICAgIDsgcmVzdWx0IGlzIHRyYW5zcG9zZWQgYW5kIHN0b3JlZCwgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aWxsIG1ha2Ugc2Vjb25kIHBhc3MgZmlsdGVyaW5nIGVhc2llci4KLSAgICBsZHJuZWIgIHIxMCwgW3IwXSwgIzIKLSAgICBzdHJoICAgIHIxMSwgW3IxXSwgcjEyCi0KLSAgICBibmUgICAgIHdpZHRoX2xvb3BfMXN0XzYKLQotICAgIDs7YWRkICAgICAgIHI5LCByMiwgIzMwICAgICAgICAgICAgICAgICA7IGF0dGVtcHQgdG8gbG9hZCAyIGFkamFjZW50IGNhY2hlIGxpbmVzCi0gICAgOztJRiBBUkNISVRFQ1RVUkU9NgotICAgIDtwbGQgICAgICAgIFtyMCwgcjJdCi0gICAgOztwbGQgICAgICAgW3IwLCByOV0KLSAgICA7O0VORElGCi0KLSAgICBsZHIgICAgIHIxLCBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGFuZCB1cGRhdGUgZHN0IGFkZHJlc3MKLSAgICBzdWJzICAgIHI3LCByNywgIzB4MTAwMDAKLSAgICBhZGQgICAgIHIwLCByMCwgcjIgICAgICAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIG5leHQgaW5wdXQgbGluZQotICAgIGFkZCAgICAgcjEsIHIxLCAjMiAgICAgICAgICAgICAgICAgICAgICA7IG1vdmUgb3ZlciB0byBuZXh0IGNvbHVtbgotICAgIHN0ciAgICAgcjEsIFtzcF0KLQotICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMXN0XzYKLQotICAgIGFkZCAgICAgc3AsIHNwLCAjNAotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0gICAgRU5EUAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHIwICAgIHNob3J0ICAgICAgICAgKnNyY19wdHIsCi07IHIxICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi07IHIyICAgIHVuc2lnbmVkIGludCBvdXRwdXRfcGl0Y2gsCi07IHIzICAgIHVuc2lnbmVkIGludCBjbnQsCi07IHN0YWNrIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18dnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHIxMSwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyIGFkZHJlc3MKLSAgICBzdWIgICAgIHNwLCBzcCwgIzQKLSAgICBtb3YgICAgIHI3LCByMywgbHNsICMxNiAgICAgICAgICAgICAgICAgOyBoZWlnaHQgaXMgdG9wIHBhcnQgb2YgY291bnRlcgotICAgIHN0ciAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHB1c2ggZGVzdGluYXRpb24gdG8gc3RhY2sKLQotICAgIGxkciAgICAgcjQsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKLSAgICBsZHIgICAgIHI1LCBbcjExLCAjNF0KLSAgICBsZHIgICAgIHI2LCBbcjExLCAjOF0KLQotICAgIHBraGJ0ICAgcjEyLCByNSwgcjQgICAgICAgICAgICAgICAgICAgICA7IHBhY2sgdGhlIGZpbHRlciBkaWZmZXJlbnRseQotICAgIHBraGJ0ICAgcjExLCByNiwgcjUKLQotICAgIHN1YiAgICAgcjAsIHIwLCAjNCAgICAgICAgICAgICAgICAgICAgICA7IG9mZnNldCBpbnB1dCBidWZmZXIKLQotfGhlaWdodF9sb29wXzJuZHwKLSAgICBsZHIgICAgIHI4LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCi0gICAgbGRyICAgICByOSwgW3IwLCAjNF0KLSAgICBvcnIgICAgIHI3LCByNywgcjMsIGxzciAjMSAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKLQotfHdpZHRoX2xvb3BfMm5kfAotICAgIHNtdWFkICAgbHIsIHI0LCByOCAgICAgICAgICAgICAgICAgICAgICA7IGFwcGx5IGZpbHRlcgotICAgIHN1YiAgICAgcjcsIHI3LCAjMQotICAgIHNtdWxidCAgcjgsIHI0LCByOAotCi0gICAgbGRyICAgICByMTAsIFtyMCwgIzhdCi0KLSAgICBzbWxhZCAgIGxyLCByNSwgcjksIGxyCi0gICAgc21sYWR4ICByOCwgcjEyLCByOSwgcjgKLQotICAgIGxkcmggICAgcjksIFtyMCwgIzEyXQotCi0gICAgc21sYWQgICBsciwgcjYsIHIxMCwgbHIKLSAgICBzbWxhZHggIHI4LCByMTEsIHIxMCwgcjgKLQotICAgIGFkZCAgICAgcjAsIHIwLCAjNAotICAgIHNtbGF0YiAgcjEwLCByNiwgcjksIHI4Ci0KLSAgICBhZGQgICAgIGxyLCBsciwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKLSAgICBhbmRzICAgIHI4LCByNywgIzB4ZmYKLSAgICB1c2F0ICAgIGxyLCAjOCwgbHIsIGFzciAjNwotICAgIGFkZCAgICAgcjEwLCByMTAsICMweDQwCi0gICAgc3RyYiAgICBsciwgW3IxXSwgcjIgICAgICAgICAgICAgICAgICAgIDsgdGhlIHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGJhY2sgYW5kIHN0b3JlZAotICAgIHVzYXQgICAgcjEwLCAjOCwgcjEwLCBhc3IgIzcKLQotICAgIGxkcm5lICAgcjgsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmb3IgbmV4dCBsb29wCi0gICAgbGRybmUgICByOSwgW3IwLCAjNF0KLSAgICBzdHJiICAgIHIxMCwgW3IxXSwgcjIKLQotICAgIGJuZSAgICAgd2lkdGhfbG9vcF8ybmQKLQotICAgIGxkciAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHVwZGF0ZSBkc3QgZm9yIG5leHQgbG9vcAotICAgIHN1YnMgICAgcjcsIHI3LCAjMHgxMDAwMAotICAgIGFkZCAgICAgcjAsIHIwLCAjMTYgICAgICAgICAgICAgICAgICAgICA7IHVwZGF0YSBzcmMgZm9yIG5leHQgbG9vcAotICAgIGFkZCAgICAgcjEsIHIxLCAjMQotICAgIHN0ciAgICAgcjEsIFtzcF0KLQotICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMm5kCi0KLSAgICBhZGQgICAgIHNwLCBzcCwgIzQKLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KLQotICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyByMCAgICBzaG9ydCAgICAgICAgICpzcmNfcHRyLAotOyByMSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAotOyByMiAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAotOyByMyAgICB1bnNpZ25lZCBpbnQgY250LAotOyBzdGFjayBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfHZwOF9maWx0ZXI0X2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjZ8IFBST0MKLSAgICBzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICAgIGxkciAgICAgcjExLCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgYWRkcmVzcwotICAgIG1vdiAgICAgcjcsIHIzLCBsc2wgIzE2ICAgICAgICAgICAgICAgICA7IGhlaWdodCBpcyB0b3AgcGFydCBvZiBjb3VudGVyCi0KLSAgICBsZHIgICAgIHI0LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHVwIHBhY2tlZCBmaWx0ZXIgY29lZmZpY2llbnRzCi0gICAgYWRkICAgICBsciwgcjEsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBmaW5hbCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgbGRyICAgICByNSwgW3IxMSwgIzRdCi0gICAgbGRyICAgICByNiwgW3IxMSwgIzhdCi0KLSAgICBwa2hidCAgIHIxMiwgcjUsIHI0ICAgICAgICAgICAgICAgICAgICAgOyBwYWNrIHRoZSBmaWx0ZXIgZGlmZmVyZW50bHkKLSAgICBwa2hidCAgIHIxMSwgcjYsIHI1Ci0gICAgbW92ICAgICByNCwgIzB4NDAgICAgICAgICAgICAgICAgICAgICAgIDsgcm91bmRpbmcgZmFjdG9yIChmb3Igc21sYWR7eH0pCi0KLXxoZWlnaHRfbG9vcF8ybmRfNHwKLSAgICBsZHJkICAgIHI4LCBbcjAsICMtNF0gICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCi0gICAgb3JyICAgICByNywgcjcsIHIzLCBsc3IgIzEgICAgICAgICAgICAgIDsgbG9vcCBjb3VudGVyCi0KLXx3aWR0aF9sb29wXzJuZF80fAotICAgIGxkciAgICAgcjEwLCBbcjAsICM0XSEKLSAgICBzbWxhZHggIHI2LCByOSwgcjEyLCByNCAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKLSAgICBwa2hidCAgIHI4LCByOSwgcjgKLSAgICBzbWxhZCAgIHI1LCByOCwgcjEyLCByNAotICAgIHBraGJ0ICAgcjgsIHIxMCwgcjkKLSAgICBzbWxhZHggIHI2LCByMTAsIHIxMSwgcjYKLSAgICBzdWIgICAgIHI3LCByNywgIzEKLSAgICBzbWxhZCAgIHI1LCByOCwgcjExLCByNQotCi0gICAgbW92ICAgICByOCwgcjkgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgdGhlIGRhdGEgZm9yIHRoZSBuZXh0IGxvb3AKLSAgICBtb3YgICAgIHI5LCByMTAKLQotICAgIHVzYXQgICAgcjYsICM4LCByNiwgYXNyICM3ICAgICAgICAgICAgICA7IHNoaWZ0IGFuZCBjbGFtcAotICAgIHVzYXQgICAgcjUsICM4LCByNSwgYXNyICM3Ci0KLSAgICBzdHJiICAgIHI1LCBbcjFdLCByMiAgICAgICAgICAgICAgICAgICAgOyB0aGUgcmVzdWx0IGlzIHRyYW5zcG9zZWQgYmFjayBhbmQgc3RvcmVkCi0gICAgdHN0ICAgICByNywgIzB4ZmYKLSAgICBzdHJiICAgIHI2LCBbcjFdLCByMgotCi0gICAgYm5lICAgICB3aWR0aF9sb29wXzJuZF80Ci0KLSAgICBzdWJzICAgIHI3LCByNywgIzB4MTAwMDAKLSAgICBhZGQgICAgIHIwLCByMCwgIzE2ICAgICAgICAgICAgICAgICAgICAgOyB1cGRhdGUgc3JjIGZvciBuZXh0IGxvb3AKLSAgICBzdWIgICAgIHIxLCBsciwgcjcsIGxzciAjMTYgICAgICAgICAgICAgOyB1cGRhdGUgZHN0IGZvciBuZXh0IGxvb3AKLQotICAgIGJuZSAgICAgaGVpZ2h0X2xvb3BfMm5kXzQKLQotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0gICAgRU5EUAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKLTsgcjEgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLTsgcjIgICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUKLTsgcjMgICAgdW5zaWduZWQgaW50IGNudCwKLTsgc3RhY2sgdW5zaWduZWQgaW50IG91dHB1dF9waXRjaCwKLTsgc3RhY2sgY29uc3Qgc2hvcnQgKnZwOF9maWx0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXx2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19vbmx5X2FybXY2fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHI0LCBbc3AsICMzNl0gICAgICAgICAgICAgICAgICAgOyBvdXRwdXQgcGl0Y2gKLSAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyBIRmlsdGVyIGFkZHJlc3MKLSAgICBzdWIgICAgIHNwLCBzcCwgIzgKLQotICAgIG1vdiAgICAgcjcsIHIzCi0gICAgc3ViICAgICByMiwgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgaW5zaWRlIGxvb3AgaW5jcmVtZW50cyBpbnB1dCBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzbyB0aGUgaGVpZ2h0IGxvb3Agb25seSBuZWVkcyB0byBhZGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMiAtIHdpZHRoIHRvIHRoZSBpbnB1dCBwb2ludGVyCi0KLSAgICBzdWIgICAgIHI0LCByNCwgcjMKLSAgICBzdHIgICAgIHI0LCBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIG1vZGlmaWVkIG91dHB1dCBwaXRjaAotICAgIHN0ciAgICAgcjIsIFtzcCwgIzRdCi0KLSAgICBtb3YgICAgIHIyLCAjMHg0MAotCi0gICAgbGRyICAgICByNCwgW3IxMV0gICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCB1cCBwYWNrZWQgZmlsdGVyIGNvZWZmaWNpZW50cwotICAgIGxkciAgICAgcjUsIFtyMTEsICM0XQotICAgIGxkciAgICAgcjYsIFtyMTEsICM4XQotCi07IHNpeCB0YXAgZmlsdGVyCi18aGVpZ2h0X2xvb3BfMXN0X29ubHlfNnwKLSAgICBsZHJiICAgIHI4LCBbcjAsICMtMl0gICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEKLSAgICBsZHJiICAgIHI5LCBbcjAsICMtMV0KLSAgICBsZHJiICAgIHIxMCwgW3IwXSwgIzIKLQotICAgIG1vdiAgICAgcjEyLCByMywgbHNyICMxICAgICAgICAgICAgICAgICA7IGxvb3AgY291bnRlcgotCi18d2lkdGhfbG9vcF8xc3Rfb25seV82fAotICAgIGxkcmIgICAgcjExLCBbcjAsICMtMV0KLQotICAgIHBraGJ0ICAgbHIsIHI4LCByOSwgbHNsICMxNiAgICAgICAgICAgICA7IHI5IHwgcjgKLSAgICBwa2hidCAgIHI4LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQotCi0gICAgbGRyYiAgICByOSwgW3IwXQotCi07OyAgc211YWQgICBsciwgbHIsIHI0Ci0gICAgc21sYWQgICBsciwgbHIsIHI0LCByMgotICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAotOzsgIHNtdWFkICAgcjgsIHI4LCByNAotICAgIHNtbGFkICAgcjgsIHI4LCByNCwgcjIKLSAgICBwa2hidCAgIHIxMSwgcjExLCByOSwgbHNsICMxNiAgICAgICAgICAgOyByOSB8IHIxMQotCi0gICAgc21sYWQgICBsciwgcjEwLCByNSwgbHIKLSAgICBsZHJiICAgIHIxMCwgW3IwLCAjMV0KLSAgICBzbWxhZCAgIHI4LCByMTEsIHI1LCByOAotICAgIGxkcmIgICAgcjExLCBbcjAsICMyXQotCi0gICAgc3VicyAgICByMTIsIHIxMiwgIzEKLQotICAgIHBraGJ0ICAgcjksIHI5LCByMTAsIGxzbCAjMTYgICAgICAgICAgICA7IHIxMCB8IHI5Ci0gICAgcGtoYnQgICByMTAsIHIxMCwgcjExLCBsc2wgIzE2ICAgICAgICAgIDsgcjExIHwgcjEwCi0KLSAgICBzbWxhZCAgIGxyLCByOSwgcjYsIGxyCi0gICAgc21sYWQgICByMTAsIHIxMCwgcjYsIHI4Ci0KLTs7ICBhZGQgICAgIGxyLCBsciwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKLSAgICBsZHJuZWIgIHI4LCBbcjAsICMtMl0gICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZm9yIG5leHQgbG9vcAotICAgIHVzYXQgICAgbHIsICM4LCBsciwgYXNyICM3Ci07OyAgYWRkICAgICByMTAsIHIxMCwgIzB4NDAKLSAgICBzdHJiICAgIGxyLCBbcjFdLCAjMSAgICAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0Ci0gICAgdXNhdCAgICByMTAsICM4LCByMTAsIGFzciAjNwotCi0gICAgbGRybmViICByOSwgW3IwLCAjLTFdCi0gICAgc3RyYiAgICByMTAsIFtyMV0sICMxCi0gICAgbGRybmViICByMTAsIFtyMF0sICMyCi0KLSAgICBibmUgICAgIHdpZHRoX2xvb3BfMXN0X29ubHlfNgotCi0gICAgOzthZGQgICAgICAgcjksIHIyLCAjMzAgICAgICAgICAgICAgICAgIDsgYXR0ZW1wdCB0byBsb2FkIDIgYWRqYWNlbnQgY2FjaGUgbGluZXMKLSAgICA7O0lGIEFSQ0hJVEVDVFVSRT02Ci0gICAgO3BsZCAgICAgICAgW3IwLCByMl0KLSAgICA7O3BsZCAgICAgICBbcjAsIHI5XQotICAgIDs7RU5ESUYKLQotICAgIGxkciAgICAgbHIsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgYmFjayBvdXRwdXQgcGl0Y2gKLSAgICBsZHIgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgICAgICAgICAgOyBsb2FkIGJhY2sgb3V0cHV0IHBpdGNoCi0gICAgc3VicyAgICByNywgcjcsICMxCi0gICAgYWRkICAgICByMCwgcjAsIHIxMiAgICAgICAgICAgICAgICAgICAgIDsgdXBkYXRhIHNyYyBmb3IgbmV4dCBsb29wCi0gICAgYWRkICAgICByMSwgcjEsIGxyICAgICAgICAgICAgICAgICAgICAgIDsgdXBkYXRlIGRzdCBmb3IgbmV4dCBsb29wCi0KLSAgICBibmUgICAgIGhlaWdodF9sb29wXzFzdF9vbmx5XzYKLQotICAgIGFkZCAgICAgc3AsIHNwLCAjOAotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgIDsgfHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX29ubHlfYXJtdjZ8Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyByMSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAotOyByMiAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZQotOyByMyAgICB1bnNpZ25lZCBpbnQgY250LAotOyBzdGFjayB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAotOyBzdGFjayBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19vbmx5X2FybXY2fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHIxMSwgW3NwLCAjNDBdICAgICAgICAgICAgICAgICAgOyBWRmlsdGVyIGFkZHJlc3MKLSAgICBsZHIgICAgIHIxMiwgW3NwLCAjMzZdICAgICAgICAgICAgICAgICAgOyBvdXRwdXQgcGl0Y2gKLQotICAgIG1vdiAgICAgcjcsIHIzLCBsc2wgIzE2ICAgICAgICAgICAgICAgICA7IGhlaWdodCBpcyB0b3AgcGFydCBvZiBjb3VudGVyCi0gICAgc3ViICAgICByMCwgcjAsIHIyLCBsc2wgIzEgICAgICAgICAgICAgIDsgbmVlZCA2IGVsZW1lbnRzIGZvciBmaWx0ZXJpbmcsIDIgYmVmb3JlLCAzIGFmdGVyCi0KLSAgICBzdWIgICAgIHNwLCBzcCwgIzgKLQotICAgIGxkciAgICAgcjQsIFtyMTFdICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKLSAgICBsZHIgICAgIHI1LCBbcjExLCAjNF0KLSAgICBsZHIgICAgIHI2LCBbcjExLCAjOF0KLQotICAgIHN0ciAgICAgcjAsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcjAgdG8gc3RhY2sKLSAgICBzdHIgICAgIHIxLCBbc3AsICM0XSAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGRzdCB0byBzdGFjawotCi07IHNpeCB0YXAgZmlsdGVyCi18d2lkdGhfbG9vcF8ybmRfb25seV82fAotICAgIGxkcmIgICAgcjgsIFtyMF0sIHIyICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQotICAgIG9yciAgICAgcjcsIHI3LCByMyAgICAgICAgICAgICAgICAgICAgICA7IGxvb3AgY291bnRlcgotICAgIGxkcmIgICAgcjksIFtyMF0sIHIyCi0gICAgbGRyYiAgICByMTAsIFtyMF0sIHIyCi0KLXxoZWlnaHRfbG9vcF8ybmRfb25seV82fAotICAgIDsgZmlsdGVyIGZpcnN0IGNvbHVtbiBpbiB0aGlzIGlubmVyIGxvb3AsIHRoYW4sIG1vdmUgdG8gbmV4dCBjb2x1bS4KLSAgICBsZHJiICAgIHIxMSwgW3IwXSwgcjIKLQotICAgIHBraGJ0ICAgbHIsIHI4LCByOSwgbHNsICMxNiAgICAgICAgICAgICA7IHI5IHwgcjgKLSAgICBwa2hidCAgIHI4LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQotCi0gICAgbGRyYiAgICByOSwgW3IwXSwgcjIKLQotICAgIHNtdWFkICAgbHIsIGxyLCByNAotICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAotICAgIHNtdWFkICAgcjgsIHI4LCByNAotICAgIHBraGJ0ICAgcjExLCByMTEsIHI5LCBsc2wgIzE2ICAgICAgICAgICA7IHI5IHwgcjExCi0KLSAgICBzbWxhZCAgIGxyLCByMTAsIHI1LCBscgotICAgIGxkcmIgICAgcjEwLCBbcjBdLCByMgotICAgIHNtbGFkICAgcjgsIHIxMSwgcjUsIHI4Ci0gICAgbGRyYiAgICByMTEsIFtyMF0KLQotICAgIHN1YiAgICAgcjcsIHI3LCAjMgotICAgIHN1YiAgICAgcjAsIHIwLCByMiwgbHNsICMyCi0KLSAgICBwa2hidCAgIHI5LCByOSwgcjEwLCBsc2wgIzE2ICAgICAgICAgICAgOyByMTAgfCByOQotICAgIHBraGJ0ICAgcjEwLCByMTAsIHIxMSwgbHNsICMxNiAgICAgICAgICA7IHIxMSB8IHIxMAotCi0gICAgc21sYWQgICBsciwgcjksIHI2LCBscgotICAgIHNtbGFkICAgcjEwLCByMTAsIHI2LCByOAotCi0gICAgYW5kcyAgICByOSwgcjcsICMweGZmCi0KLSAgICBhZGQgICAgIGxyLCBsciwgIzB4NDAgICAgICAgICAgICAgICAgICAgOyByb3VuZF9zaGlmdF9hbmRfY2xhbXAKLSAgICBsZHJuZWIgIHI4LCBbcjBdLCByMiAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZm9yIG5leHQgbG9vcAotICAgIHVzYXQgICAgbHIsICM4LCBsciwgYXNyICM3Ci0gICAgYWRkICAgICByMTAsIHIxMCwgIzB4NDAKLSAgICBzdHJiICAgIGxyLCBbcjFdLCByMTIgICAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0IGZvciB0aGUgY29sdW1uCi0gICAgdXNhdCAgICByMTAsICM4LCByMTAsIGFzciAjNwotCi0gICAgbGRybmViICByOSwgW3IwXSwgcjIKLSAgICBzdHJiICAgIHIxMCwgW3IxXSwgcjEyCi0gICAgbGRybmViICByMTAsIFtyMF0sIHIyCi0KLSAgICBibmUgICAgIGhlaWdodF9sb29wXzJuZF9vbmx5XzYKLQotICAgIGxkciAgICAgcjAsIFtzcF0KLSAgICBsZHIgICAgIHIxLCBbc3AsICM0XQotICAgIHN1YnMgICAgcjcsIHI3LCAjMHgxMDAwMAotICAgIGFkZCAgICAgcjAsIHIwLCAjMSAgICAgICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gZmlsdGVyIG5leHQgY29sdW1uCi0gICAgc3RyICAgICByMCwgW3NwXQotICAgIGFkZCAgICAgcjEsIHIxLCAjMQotICAgIHN0ciAgICAgcjEsIFtzcCwgIzRdCi0KLSAgICBibmUgICAgIHdpZHRoX2xvb3BfMm5kX29ubHlfNgotCi0gICAgYWRkICAgICBzcCwgc3AsICM4Ci0KLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KLSAgICBFTkRQICA7IHx2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3Nfb25seV9hcm12NnwKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vYXJtdjYvaWRjdF92Ni5hc20gYi92cDgvY29tbW9uL2FybS9hcm12Ni9pZGN0X3Y2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyMTVhZi4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9hcm12Ni9pZGN0X3Y2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi07ICAgICAgICAgICAgICAgICAgIHIwICByMSAgcjIgIHIzICByNCAgcjUgIHI2ICByNyAgcjggIHI5ICByMTAgcjExIHIxMiAgICAgcjE0Ci0gICAgRVhQT1JUICB8dnA4X3Nob3J0X2lkY3Q0eDRsbG1fMV92NnwKLSAgICBFWFBPUlQgIHx2cDhfc2hvcnRfaWRjdDR4NGxsbV92NnwKLSAgICBFWFBPUlQgIHx2cDhfc2hvcnRfaWRjdDR4NGxsbV92Nl9zY290dHwKLSAgICBFWFBPUlQgIHx2cDhfc2hvcnRfaWRjdDR4NGxsbV92Nl9kdWFsfAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWQotCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqICB2b2lkIHNob3J0X2lkY3Q0eDRsbG1fMV92NihJTlQxNiAqIGlucHV0LCBJTlQxNiAqIG91dHB1dCwgSU5UMzIgcGl0Y2gpCi07KiAgICAgIHIwICBJTlQxNiAqIGlucHV0Ci07KiAgICAgIHIxICBJTlQxNiAqIG91dHB1dAotOyogICAgICByMiAgSU5UMzIgcGl0Y2gKLTsqICBiZW5jaDogIDMvNQotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLXx2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX3Y2fCBQUk9DICAgICAgICAgOyAgIGN5Y2xlcyAgaW4gIG91dCBwaXQKLSAgICAgICAgICAgIDsKLSAgICBsZHJzaCAgIHIwLCBbcjBdICAgIDsgbG9hZCBpbnB1dFswXSAxLCByMCB1biAyCi0gICAgYWRkIHIwLCByMCwgIzQgIDsgICAxICAgKzQKLSAgICBzdG1kYiAgIHNwISwge3I0LCByNSwgbHJ9ICAgOyBtYWtlIHJvb20gZm9yIHdpZGUgd3JpdGVzIDEgICAgICAgICAgICAgICAgICAgYmFja3VwCi0gICAgbW92IHIwLCByMCwgYXNyICMzICA7IChpbnB1dFswXSArIDQpID4+IDMgICAxLCByMCByZXFgZCBeMSAgPj4gMwotICAgIHBraGJ0ICAgcjQsIHIwLCByMCwgbHNsICMxNiA7IHBhY2sgcjAgaW50byByNCAgIDEsIHIwIHJlcWBkIF4xICAgICAgICAgICAgICAgICAgcGFjawotICAgIG1vdiByNSwgcjQgIDsgZXhwYW5kICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kCi0KLSAgICBzdHJkICAgIHI0LCBbcjFdLCByMiAgICA7ICpvdXRwdXQgPSByMCwgcG9zdCBpbmMgICAgMQotICAgIHN0cmQgICAgcjQsIFtyMV0sIHIyICAgIDsgICAxCi0gICAgc3RyZCAgICByNCwgW3IxXSwgcjIgICAgOyAgIDEKLSAgICBzdHJkICAgIHI0LCBbcjFdICAgIDsgICAxCi0gICAgICAgICAgICA7Ci0gICAgbGRtaWEgICBzcCEsIHtyNCwgcjUsIHBjfSAgIDsgcmVwbGFjZSB2YXJzLCByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZQotICAgIEVORFAgICAgICAgIDsgfHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfdjZ8Ci07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyogIHZvaWQgc2hvcnRfaWRjdDR4NGxsbV92NihJTlQxNiAqIGlucHV0LCBJTlQxNiAqIG91dHB1dCwgSU5UMzIgcGl0Y2gpCi07KiAgICAgIHIwICBJTlQxNiAqIGlucHV0Ci07KiAgICAgIHIxICBJTlQxNiAqIG91dHB1dAotOyogICAgICByMiAgSU5UMzIgcGl0Y2gKLTsqICBiZW5jaDoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi18dnA4X3Nob3J0X2lkY3Q0eDRsbG1fdjZ8IFBST0MgICAgICAgICAgIDsgICBjeWNsZXMgIGluICBvdXQgcGl0Ci0gICAgICAgICAgICA7Ci0gICAgc3RtZGIgICBzcCEsIHtyNC1yMTEsIGxyfSAgIDsgYmFja3VwIHJlZ2lzdGVycyAgMSAgICAgICAgICAgICAgICAgICBiYWNrdXAKLSAgICAgICAgICAgIDsKLSAgICBtb3YgcjQsICMweDAwMDA0RTAwIDsgICAxICAgICAgICAgICAgICAgICAgIGNzdAotICAgIG9yciByNCwgcjQsICMweDAwMDAwMDdCIDsgY29zcGk4c3FydDJtaW51czEKLSAgICBtb3YgcjUsICMweDAwMDA4QTAwIDsgICAxICAgICAgICAgICAgICAgICAgICAgICBjc3QKLSAgICBvcnIgcjUsIHI1LCAjMHgwMDAwMDA4QyA7IHNpbnBpOHNxcnQyCi0gICAgICAgICAgICA7Ci0gICAgbW92IHI2LCAjNCAgOyBpPTQgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgaQotbG9vcDEgICAgICAgICAgIDsKLSAgICBsZHJzaCAgIHIxMiwgW3IwLCAjOF0gICA7IGlucHV0WzRdICAxLCByMTIgdW5hdmFpbCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XQotICAgIGxkcnNoICAgcjMsIFtyMCwgIzI0XSAgIDsgaW5wdXRbMTJdIDEsIHIzIHVuYXZhaWwgMiAgICAgICAgICAgICBbMTJdCi0gICAgbGRyc2ggICByOCwgW3IwLCAjMTZdICAgOyBpbnB1dFs4XSAgMSwgcjggdW5hdmFpbCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzhdCi0gICAgbGRyc2ggICByNywgW3IwXSwgIzB4MiAgOyBpbnB1dFswXSAgMSwgcjcgdW5hdmFpbCAyICsrICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0KLSAgICBzbXVsd2IgIHIxMCwgcjUsIHIxMiAgICA7IChbNF0gKiBzaW5waThzcXJ0MikgPj4gMTYgMSwgcjEwIHVuIDIsIHIxMi9yNSBeMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxCi0gICAgc211bHdiICByMTEsIHI0LCByMyA7IChbMTJdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2ICAxLCByMTEgdW4gMiwgcjMvcjQgXjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyCi0gICAgYWRkIHI5LCByNywgcjggIDsgYTEgPSBbMF0gKyBbOF0gICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExCi0gICAgc3ViIHI3LCByNywgcjggIDsgYjEgPSBbMF0gLSBbOF0gICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMQotICAgIGFkZCByMTEsIHIzLCByMTEgICAgOyB0ZW1wMiAxCi0gICAgcnNiIHIxMSwgcjExLCByMTAgICA7IGMxID0gdGVtcDEgLSB0ZW1wMiAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMQotICAgIHNtdWx3YiAgcjMsIHI1LCByMyAgOyAoWzEyXSAqIHNpbnBpOHNxcnQyKSA+PiAxNiAgICAxLCByMyB1biAyLCByMy9yNSBeIDEgICAgICAgICAgICAgICB0MgotICAgIHNtdWx3YiAgcjEwLCByNCwgcjEyICAgIDsgKFs0XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNiAgIDEsIHIxMCB1biAyLCByMTIvcjQgXjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MQotICAgIGFkZCByOCwgcjcsIHIxMSA7IGIxICsgYzEgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiK2MKLSAgICBzdHJoICAgIHI4LCBbcjEsIHIyXSAgICA7IG91dFtwaXRjaF0gPSBiMStjMSAgICAxCi0gICAgc3ViIHI3LCByNywgcjExIDsgYjEgLSBjMSAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi1jCi0gICAgYWRkIHIxMCwgcjEyLCByMTAgICA7IHRlbXAxIDEKLSAgICBhZGQgcjMsIHIxMCwgcjMgOyBkMSA9IHRlbXAxICsgdGVtcDIgICAgMSAgICAgICAgICAgICAgIGQxCi0gICAgYWRkIHIxMCwgcjksIHIzIDsgYTEgKyBkMSAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYStkCi0gICAgc3ViIHIzLCByOSwgcjMgIDsgYTEgLSBkMSAgIDEgICAgICAgICAgICAgICBhLWQKLSAgICBhZGQgcjgsIHIyLCByMiAgOyBwaXRjaCAqIDIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCoyCi0gICAgc3RyaCAgICByNywgW3IxLCByOF0gICAgOyBvdXRbcGl0Y2gqMl0gPSBiMS1jMSAgMQotICAgIGFkZCByNywgcjIsIHIyLCBsc2wgIzEgIDsgcGl0Y2ggKiAzIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCozCi0gICAgc3RyaCAgICByMywgW3IxLCByN10gICAgOyBvdXRbcGl0Y2gqM10gPSBhMS1kMSAgMQotICAgIHN1YnMgICAgcjYsIHI2LCAjMSAgOyBpLS0gICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLSAgICBzdHJoICAgIHIxMCwgW3IxXSwgIzB4MiA7IG91dFswXSA9IGExK2QxICAgIDEgICAgICAgKysKLSAgICBibmUgbG9vcDEgICA7IGlmIGk+MCwgY29udGludWUKLSAgICAgICAgICAgIDsKLSAgICBzdWIgcjEsIHIxLCAjOCAgOyBzZXQgdXAgb3V0IGZvciBuZXh0IGxvb3AgIDEgICAgICAgLTQKLSAgICAgICAgICAgIDsgZm9yIHRoaXMgaXRlcmF0aW9uLCBpbnB1dD1wcmV2IG91dHB1dAotICAgIG1vdiByNiwgIzQgIDsgaT00ICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKLTsgICBiICAgcmV0dXJuZnVsbAotbG9vcDIgICAgICAgICAgIDsKLSAgICBsZHJzaCAgIHIxMSwgW3IxLCAjMl0gICA7IGlucHV0WzFdICAxLCByMTEgdW4gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXQotICAgIGxkcnNoICAgcjgsIFtyMSwgIzZdICAgIDsgaW5wdXRbM10gIDEsIHI4IHVuIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzNdCi0gICAgbGRyc2ggICByMywgW3IxLCAjNF0gICAgOyBpbnB1dFsyXSAgMSwgcjMgdW4gMiAgICAgICAgICAgICAgWzJdCi0gICAgbGRyc2ggICByMCwgW3IxXSAgICA7IGlucHV0WzBdICAxLCByMCB1biAyICBbMF0KLSAgICBzbXVsd2IgIHI5LCByNSwgcjExIDsgKFsxXSAqIHNpbnBpOHNxcnQyKSA+PiAxNiAxLCByOSB1biAyLCByNS9yMTEgXjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MQotICAgIHNtdWx3YiAgcjEwLCByNCwgcjggOyAoWzNdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2ICAgMSwgcjEwIHVuIDIsIHI0L3I4IF4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyCi0gICAgYWRkIHI3LCByMCwgcjMgIDsgYTEgPSBbMF0gKyBbMl0gICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMQotICAgIHN1YiByMCwgcjAsIHIzICA7IGIxID0gWzBdIC0gWzJdICAgIDEgICBiMQotICAgIGFkZCByMTAsIHI4LCByMTAgICAgOyB0ZW1wMiAxCi0gICAgcnNiIHI5LCByMTAsIHI5IDsgYzEgPSB0ZW1wMSAtIHRlbXAyICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMQotICAgIHNtdWx3YiAgcjgsIHI1LCByOCAgOyAoWzNdICogc2lucGk4c3FydDIpID4+IDE2IDEsIHI4IHVuIDIsIHI1L3I4IF4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDIKLSAgICBzbXVsd2IgIHIxMCwgcjQsIHIxMSAgICA7IChbMV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYgICAxLCByMTAgdW4gMiwgcjQvcjExIF4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEKLSAgICBhZGQgcjMsIHIwLCByOSAgOyBiMStjMSAxICAgICAgICAgICAgICAgYitjCi0gICAgYWRkIHIzLCByMywgIzQgIDsgYjErYzErNCAgIDEgICAgICAgICAgICAgICArNAotICAgIGFkZCByMTAsIHIxMSwgcjEwICAgOyB0ZW1wMSAxCi0gICAgbW92IHIzLCByMywgYXNyICMzICA7IGIxK2MxKzQgPj4gMyAgMSwgcjMgXjEgICAgICAgICAgICAgICAgPj4zCi0gICAgc3RyaCAgICByMywgW3IxLCAjMl0gICAgOyBvdXRbMV0gPSBiMStjMSAgICAxCi0gICAgYWRkIHIxMCwgcjEwLCByOCAgICA7IGQxID0gdGVtcDEgKyB0ZW1wMiAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxCi0gICAgYWRkIHIzLCByNywgcjEwIDsgYTErZDEgMSAgICAgICAgICAgICAgIGErZAotICAgIGFkZCByMywgcjMsICM0ICA7IGExK2QxKzQgICAxICAgICAgICAgICAgICAgKzQKLSAgICBzdWIgcjcsIHI3LCByMTAgOyBhMS1kMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtZAotICAgIGFkZCByNywgcjcsICM0ICA7IGExLWQxKzQgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs0Ci0gICAgbW92IHIzLCByMywgYXNyICMzICA7IGExK2QxKzQgPj4gMyAgMSwgcjMgXjEgICAgICAgICAgICAgICAgPj4zCi0gICAgbW92IHI3LCByNywgYXNyICMzICA7IGExLWQxKzQgPj4gMyAgMSwgcjcgXjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+MwotICAgIHN0cmggICAgcjcsIFtyMSwgIzZdICAgIDsgb3V0WzNdID0gYTEtZDEgICAgMQotICAgIHN1YiByMCwgcjAsIHI5ICA7IGIxLWMxIDEgICBiLWMKLSAgICBhZGQgcjAsIHIwLCAjNCAgOyBiMS1jMSs0ICAgMSAgICs0Ci0gICAgc3VicyAgICByNiwgcjYsICMxICA7IGktLSAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotICAgIG1vdiByMCwgcjAsIGFzciAjMyAgOyBiMS1jMSs0ID4+IDMgIDEsIHIwIF4xICAgID4+MwotICAgIHN0cmggICAgcjAsIFtyMSwgIzRdICAgIDsgb3V0WzJdID0gYjEtYzEgICAgMQotICAgIHN0cmggICAgcjMsIFtyMV0sIHIyICAgIDsgb3V0WzBdID0gYTErZDEgICAgMQotOyAgIGFkZCByMSwgcjEsIHIyICA7IG91dCArPSBwaXRjaCAgMSAgICAgICArKwotICAgIGJuZSBsb29wMiAgIDsgaWYgaT4wLCBjb250aW51ZQotcmV0dXJuZnVsbCAgICAgICAgICA7Ci0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9IDsgcmVwbGFjZSB2YXJzLCByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZQotICAgIEVORFAKLQotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqICB2b2lkIHNob3J0X2lkY3Q0eDRsbG1fdjZfc2NvdHQoSU5UMTYgKiBpbnB1dCwgSU5UMTYgKiBvdXRwdXQsIElOVDMyIHBpdGNoKQotOyogICAgICByMCAgSU5UMTYgKiBpbnB1dAotOyogICAgICByMSAgSU5UMTYgKiBvdXRwdXQKLTsqICAgICAgcjIgIElOVDMyIHBpdGNoCi07KiAgYmVuY2g6Ci07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotfHZwOF9zaG9ydF9pZGN0NHg0bGxtX3Y2X3Njb3R0fCBQUk9DICAgICAgICAgOyAgIGN5Y2xlcyAgaW4gIG91dCBwaXQKLTsgICBtb3YgcjAsICMwICA7Ci07ICAgbGRyIHIwLCBbcjBdICAgIDsKLSAgICBzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0gOyBiYWNrdXAgcmVnaXN0ZXJzICAxICAgICAgICAgICAgICAgICAgIGJhY2t1cAotICAgICAgICAgICAgOwotICAgIG1vdiByMywgIzB4MDAwMDRFMDAgOyAgICAgICAgICAgICAgICAgICBjb3MKLSAgICBvcnIgcjMsIHIzLCAjMHgwMDAwMDA3QiA7IGNvc3BpOHNxcnQybWludXMxCi0gICAgbW92IHI0LCAjMHgwMDAwOEEwMCA7ICAgICAgICAgICAgICAgICAgICAgICBzaW4KLSAgICBvcnIgcjQsIHI0LCAjMHgwMDAwMDA4QyA7IHNpbnBpOHNxcnQyCi0gICAgICAgICAgICA7Ci0gICAgbW92IHI1LCAjMHgyICAgIDsgaSAgICAgICAgICAgICAgICAgICAgICAgICBpCi0gICAgICAgICAgICA7Ci1zaG9ydF9pZGN0NHg0bGxtX3Y2X3Njb3R0X2xvb3AxICAgICAgICAgIDsKLSAgICBsZHIgcjEwLCBbcjAsICMoNCoyKV0gICA7IGk1IHwgaTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsNAotICAgIGxkciByMTEsIFtyMCwgIygxMioyKV0gIDsgaTEzIHwgaTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLDEyCi0gICAgICAgICAgICA7Ci0gICAgc211bHdiICByNiwgcjQsIHIxMCA7ICgoaXBbNF0gKiBzaW5waThzcXJ0MikgPj4gMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdDEKLSAgICBzbXVsd2IgIHI3LCByMywgcjExIDsgKChpcFsxMl0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0MgotICAgICAgICAgICAgOwotICAgIHNtdWx3YiAgcjEyLCByMywgcjEwICAgIDsgKChpcFs0XSAqIGNvc3BpOHNxcnQybWlzdTEpID4+IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJ0MgotICAgIHNtdWx3YiAgcjE0LCByNCwgcjExICAgIDsgKChpcFsxMl0gKiBzaW5waThzcXJ0MikgPj4gMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwydDEKLSAgICAgICAgICAgIDsKLSAgICBhZGQgcjYsIHI2LCByNyAgOyBwYXJ0aWFsIGMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdDEtbHQyCi0gICAgYWRkIHIxMiwgcjEyLCByMTQgICA7IHBhcnRpYWwgZDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwydDIrbDJ0MQotICAgICAgICAgICAgOwotICAgIHNtdWx3dCAgcjE0LCByNCwgcjEwICAgIDsgKChpcFs1XSAqIHNpbnBpOHNxcnQyKSA+PiAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQxCi0gICAgc211bHd0ICByNywgcjMsIHIxMSA7ICgoaXBbMTNdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodDIKLSAgICAgICAgICAgIDsKLSAgICBzbXVsd3QgIHI4LCByMywgcjEwIDsgKChpcFs1XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMnQxCi0gICAgc211bHd0ICByOSwgcjQsIHIxMSA7ICgoaXBbMTNdICogc2lucGk4c3FydDIpID4+IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDJ0MgotICAgICAgICAgICAgOwotICAgIGFkZCByNywgcjE0LCByNyA7IHBhcnRpYWwgYzFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodDEraHQyCi0gICAgc3ViIHI4LCByOCwgcjkgIDsgcGFydGlhbCBkMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMnQxLWgydDIKLSAgICAgICAgICAgIDsKLSAgICBwa2hidCAgIHI2LCByNiwgcjcsIGxzbCAjMTYgOyBwYXJ0aWFsIGMxXzIgfCBwYXJ0aWFsIGMxXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjawotICAgIHBraGJ0ICAgcjEyLCByMTIsIHI4LCBsc2wgIzE2ICAgOyBwYXJ0aWFsIGQxXzIgfCBwYXJ0aWFsIGQxXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjawotICAgICAgICAgICAgOwotICAgIHVzdWIxNiAgcjYsIHI2LCByMTAgOyBjMV8yIHwgYzFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjCi0gICAgdWFkZDE2ICByMTIsIHIxMiwgcjExICAgOyBkMV8yIHwgZDFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkCi0gICAgICAgICAgICA7Ci0gICAgbGRyIHIxMCwgW3IwLCAjMF0gICA7IGkxIHwgaTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMAotICAgIGxkciByMTEsIFtyMCwgIyg4KjIpXSAgIDsgaTkgfCBpMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksMTAKLSAgICAgICAgICAgIDsKLTs7Ozs7OyAgYWRkIHIwLCByMCwgIzB4NCAgICA7ICAgICAgICs0Ci07Ozs7OzsgIGFkZCByMSwgcjEsICMweDQgICAgOyAgICAgICAgICAgKzQKLSAgICAgICAgICAgIDsKLSAgICB1YWRkMTYgIHI4LCByMTAsIHIxMSAgICA7IGkxICsgaTkgfCBpMCArIGk4IGFrYSBhMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYQotICAgIHVzdWIxNiAgcjksIHIxMCwgcjExICAgIDsgaTEgLSBpOSB8IGkwIC0gaTggYWthIGIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYgotICAgICAgICAgICAgOwotICAgIHVhZGQxNiAgcjcsIHI4LCByMTIgOyBhMSArIGQxIHBhaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYStkCi0gICAgdXN1YjE2ICByMTQsIHI4LCByMTIgICAgOyBhMSAtIGQxIHBhaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtZAotICAgICAgICAgICAgOwotICAgIHN0ciByNywgW3IxXSAgICA7IG9wWzBdID0gYTEgKyBkMQotICAgIHN0ciByMTQsIFtyMSwgcjJdICAgOyBvcFtwaXRjaCozXSA9IGExIC0gZDEKLSAgICAgICAgICAgIDsKLSAgICBhZGQgcjAsIHIwLCAjMHg0ICAgIDsgb3BbcGl0Y2hdID0gYjEgKyBjMSAgICAgICArKwotICAgIGFkZCByMSwgcjEsICMweDQgICAgOyBvcFtwaXRjaCoyXSA9IGIxIC0gYzEgICAgICAgICArKwotICAgICAgICAgICAgOwotICAgIHN1YnMgICAgcjUsIHI1LCAjMHgxICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotICAgIGJuZSBzaG9ydF9pZGN0NHg0bGxtX3Y2X3Njb3R0X2xvb3AxICA7Ci0gICAgICAgICAgICA7Ci0gICAgc3ViIHIxLCByMSwgIzE2IDsgcmVzZXQgb3V0cHV0IHB0cgotICAgIG1vdiByNSwgIzB4NCAgICA7Ci0gICAgbW92IHIwLCByMSAgOyBpbnB1dCA9IG91dHB1dAotICAgICAgICAgICAgOwotc2hvcnRfaWRjdDR4NGxsbV92Nl9zY290dF9sb29wMiAgICAgICAgICA7Ci0gICAgICAgICAgICA7Ci0gICAgc3VicyAgICByNSwgcjUsICMweDEgICAgOwotICAgIGJuZSBzaG9ydF9pZGN0NHg0bGxtX3Y2X3Njb3R0X2xvb3AyICA7Ci0gICAgICAgICAgICA7Ci0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9IDsKLSAgICBFTkRQICAgICAgICA7Ci0gICAgICAgICAgICA7Ci07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyogIHZvaWQgc2hvcnRfaWRjdDR4NGxsbV92Nl9kdWFsKElOVDE2ICogaW5wdXQsIElOVDE2ICogb3V0cHV0LCBJTlQzMiBwaXRjaCkKLTsqICAgICAgcjAgIElOVDE2ICogaW5wdXQKLTsqICAgICAgcjEgIElOVDE2ICogb3V0cHV0Ci07KiAgICAgIHIyICBJTlQzMiBwaXRjaAotOyogIGJlbmNoOgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLXx2cDhfc2hvcnRfaWRjdDR4NGxsbV92Nl9kdWFsfCBQUk9DICAgICAgICAgIDsgICBjeWNsZXMgIGluICBvdXQgcGl0Ci0gICAgICAgICAgICA7Ci0gICAgc3RtZGIgICBzcCEsIHtyNC1yMTEsIGxyfSAgIDsgYmFja3VwIHJlZ2lzdGVycyAgMSAgICAgICAgICAgICAgICAgICBiYWNrdXAKLSAgICBtb3YgcjMsICMweDAwMDA0RTAwIDsgICAgICAgICAgICAgICAgICAgY29zCi0gICAgb3JyIHIzLCByMywgIzB4MDAwMDAwN0IgOyBjb3NwaThzcXJ0Mm1pbnVzMQotICAgIG1vdiByNCwgIzB4MDAwMDhBMDAgOyAgICAgICAgICAgICAgICAgICAgICAgc2luCi0gICAgb3JyIHI0LCByNCwgIzB4MDAwMDAwOEMgOyBzaW5waThzcXJ0MgotICAgIG1vdiByNSwgIzB4MiAgICA7IGk9MiAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKLWxvb3AxX2R1YWwKLSAgICBsZHIgcjYsIFtyMCwgIyg0KjIpXSAgICA7IGk1IHwgaTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNXw0Ci0gICAgbGRyIHIxMiwgW3IwLCAjKDEyKjIpXSAgOyBpMTMgfCBpMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzfDEyCi0gICAgbGRyIHIxNCwgW3IwLCAjKDgqMildICAgOyBpOSB8IGk4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOXw4Ci0KLSAgICBzbXVsd3QgIHI5LCByMywgcjYgIDsgKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1YwotICAgIHNtdWx3YiAgcjcsIHIzLCByNiAgOyAoaXBbNF0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0YwotICAgIHNtdWx3dCAgcjEwLCByNCwgcjYgOyAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVzCi0gICAgc211bHdiICByOCwgcjQsIHI2ICA7IChpcFs0XSAqIHNpbnBpOHNxcnQyKSA+PiAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRzCi0gICAgcGtoYnQgICByNywgcjcsIHI5LCBsc2wgIzE2IDsgNWMgfCA0YwotICAgIHNtdWx3dCAgcjExLCByMywgcjEyICAgIDsgKGlwWzEzXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxM2MKLSAgICBwa2hidCAgIHI4LCByOCwgcjEwLCBsc2wgIzE2ICAgIDsgNXMgfCA0cwotICAgIHVhZGQxNiAgcjYsIHI2LCByNyAgOyA1Yys1IHwgNGMrNAotICAgIHNtdWx3dCAgcjcsIHI0LCByMTIgOyAoaXBbMTNdICogc2lucGk4c3FydDIpID4+IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzcwotICAgIHNtdWx3YiAgcjksIHIzLCByMTIgOyAoaXBbMTJdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMmMKLSAgICBzbXVsd2IgIHIxMCwgcjQsIHIxMiAgICA7IChpcFsxMl0gKiBzaW5waThzcXJ0MikgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTJzCi0gICAgc3VicyAgICByNSwgcjUsICMweDEgICAgOyBpLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotICAgIHBraGJ0ICAgcjksIHI5LCByMTEsIGxzbCAjMTYgICAgOyAxM2MgfCAxMmMKLSAgICBsZHIgcjExLCBbcjBdLCAjMHg0IDsgaTEgfCBpMCAgICAgICArKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDF8MAotICAgIHBraGJ0ICAgcjEwLCByMTAsIHI3LCBsc2wgIzE2ICAgOyAxM3MgfCAxMnMKLSAgICB1YWRkMTYgIHI3LCByMTIsIHI5IDsgMTNjKzEzIHwgMTJjKzEyCi0gICAgdXN1YjE2ICByNywgcjgsIHI3ICA7IGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjCi0gICAgdWFkZDE2ICByNiwgcjYsIHIxMCA7IGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQKLSAgICB1YWRkMTYgIHIxMCwgcjExLCByMTQgICA7IGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhCi0gICAgdXN1YjE2ICByOCwgcjExLCByMTQgICAgOyBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIKLSAgICB1YWRkMTYgIHI5LCByMTAsIHI2IDsgYStkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGErZAotICAgIHVzdWIxNiAgcjEwLCByMTAsIHI2ICAgIDsgYS1kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLWQKLSAgICB1YWRkMTYgIHI2LCByOCwgcjcgIDsgYitjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIrYwotICAgIHVzdWIxNiAgcjcsIHI4LCByNyAgOyBiLWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItYwotICAgIHN0ciByNiwgW3IxLCByMl0gICAgOyBvNSB8IG80Ci0gICAgYWRkIHI2LCByMiwgcjIgIDsgcGl0Y2ggKiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMgotICAgIHN0ciByNywgW3IxLCByNl0gICAgOyBvOSB8IG84Ci0gICAgYWRkIHI2LCAgcjYsIHIyIDsgcGl0Y2ggKiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMwotICAgIHN0ciByMTAsIFtyMSwgcjZdICAgOyBvMTMgfCBvMTIKLSAgICBzdHIgcjksIFtyMV0sICMweDQgIDsgbzEgfCBvMCAgICAgICAgICAgKysKLSAgICBibmUgbG9vcDFfZHVhbCAgOwotICAgIG1vdiByNSwgIzB4MiAgICA7IGk9MiAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKLSAgICBzdWIgcjAsIHIxLCAjOCAgOyByZXNldCBpbnB1dC9vdXRwdXQgICAgICAgIGkvbwotbG9vcDJfZHVhbAotICAgIGxkciByNiwgW3IwLCByMl0gICAgOyBpNSB8IGk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDV8NAotICAgIGxkciByMSwgW3IwXSAgICA7IGkxIHwgaTAgICAgICAgICAgIDF8MAotICAgIGxkciByMTIsIFtyMCwgIzB4NF0gOyBpMyB8IGkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDN8MgotICAgIGFkZCByMTQsIHIyLCAjMHg0ICAgOyBwaXRjaCArIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCsyCi0gICAgbGRyIHIxNCwgW3IwLCByMTRdICA7IGk3IHwgaTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3fDYKLSAgICBzbXVsd3QgIHI5LCByMywgcjYgIDsgKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1YwotICAgIHNtdWx3dCAgcjcsIHIzLCByMSAgOyAoaXBbMV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYwotICAgIHNtdWx3dCAgcjEwLCByNCwgcjYgOyAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVzCi0gICAgc211bHd0ICByOCwgcjQsIHIxICA7IChpcFsxXSAqIHNpbnBpOHNxcnQyKSA+PiAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFzCi0gICAgcGtoYnQgICByMTEsIHI2LCByMSwgbHNsICMxNiAgICA7IGkwIHwgaTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfDQKLSAgICBwa2hidCAgIHI3LCByOSwgcjcsIGxzbCAjMTYgOyAxYyB8IDVjCi0gICAgcGtoYnQgICByOCwgcjEwLCByOCwgbHNsICMxNiAgICA7IDFzIHwgNXMgPSB0ZW1wMSCpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjMQotICAgIHBraHRiICAgcjEsIHIxLCByNiwgYXNyICMxNiA7IGkxIHwgaTUgICAgICAgICAgIDF8NQotICAgIHVhZGQxNiAgcjEsIHI3LCByMSAgOyAxYysxIHwgNWMrNSA9IHRlbXAyIChkKSAgICAgICAgICAgdGQyCi0gICAgcGtoYnQgICByOSwgcjE0LCByMTIsIGxzbCAjMTYgICA7IGkyIHwgaTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMnw2Ci0gICAgdWFkZDE2ICByMTAsIHIxMSwgcjkgICAgOyBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYQotICAgIHVzdWIxNiAgcjksIHIxMSwgcjkgOyBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiCi0gICAgcGtodGIgICByNiwgcjEyLCByMTQsIGFzciAjMTYgICA7IGkzIHwgaTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM3w3Ci0gICAgc3VicyAgICByNSwgcjUsICMweDEgICAgOyBpLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotICAgIHNtdWx3dCAgcjcsIHIzLCByNiAgOyAoaXBbM10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzYwotICAgIHNtdWx3dCAgcjExLCByNCwgcjYgOyAoaXBbM10gKiBzaW5waThzcXJ0MikgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzcwotICAgIHNtdWx3YiAgcjEyLCByMywgcjYgOyAoaXBbN10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDdjCi0gICAgc211bHdiICByMTQsIHI0LCByNiA7IChpcFs3XSAqIHNpbnBpOHNxcnQyKSA+PiAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDdzCi0KLSAgICBwa2hidCAgIHI3LCByMTIsIHI3LCBsc2wgIzE2ICAgIDsgM2MgfCA3YwotICAgIHBraGJ0ICAgcjExLCByMTQsIHIxMSwgbHNsICMxNiAgOyAzcyB8IDdzID0gdGVtcDEgKGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxCi0gICAgdWFkZDE2ICByNiwgcjcsIHI2ICA7IDNjKzMgfCA3Yys3ID0gdGVtcDIgIChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjMgotICAgIHVzdWIxNiAgcjEyLCByOCwgcjYgOyBjIChvMSB8IG81KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjCi0gICAgdWFkZDE2ICByNiwgcjExLCByMSA7IGQgKG8zIHwgbzcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQKLSAgICB1YWRkMTYgIHI3LCByMTAsIHI2IDsgYStkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhK2QKLSAgICBtb3YgcjgsICMweDQgICAgOyBzZXQgdXAgNCdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAgICBvcnIgcjgsIHI4LCAjMHg0MDAwMCAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNHw0Ci0gICAgdXN1YjE2ICByNiwgcjEwLCByNiA7IGEtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLWQKLSAgICB1YWRkMTYgIHI2LCByNiwgcjggIDsgYS1kKzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDN8NwotICAgIHVhZGQxNiAgcjcsIHI3LCByOCAgOyBhK2QrNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB8NAotICAgIHVhZGQxNiAgcjEwLCByOSwgcjEyICAgIDsgYitjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiK2MKLSAgICB1c3ViMTYgIHIxLCByOSwgcjEyIDsgYi1jICAgICAgICAgICBiLWMKLSAgICB1YWRkMTYgIHIxMCwgcjEwLCByOCAgICA7IGIrYys0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMXw1Ci0gICAgdWFkZDE2ICByMSwgcjEsIHI4ICA7IGItYys0ICAgICAgICAgMnw2Ci0gICAgbW92IHI4LCByMTAsIGFzciAjMTkgICAgOyBvMSA+PiAzCi0gICAgc3RyaCAgICByOCwgW3IwLCAjMl0gICAgOyBvMQotICAgIG1vdiByOCwgcjEsIGFzciAjMTkgOyBvMiA+PiAzCi0gICAgc3RyaCAgICByOCwgW3IwLCAjNF0gICAgOyBvMgotICAgIG1vdiByOCwgcjYsIGFzciAjMTkgOyBvMyA+PiAzCi0gICAgc3RyaCAgICByOCwgW3IwLCAjNl0gICAgOyBvMwotICAgIG1vdiByOCwgcjcsIGFzciAjMTkgOyBvMCA+PiAzCi0gICAgc3RyaCAgICByOCwgW3IwXSwgcjIgICAgOyBvMCAgICAgICAgK3AKLSAgICBzeHRoICAgIHIxMCwgcjEwICAgIDsKLSAgICBtb3YgcjgsIHIxMCwgYXNyICMzIDsgbzUgPj4gMwotICAgIHN0cmggICAgcjgsIFtyMCwgIzJdICAgIDsgbzUKLSAgICBzeHRoICAgIHIxLCByMSAgOwotICAgIG1vdiByOCwgcjEsIGFzciAjMyAgOyBvNiA+PiAzCi0gICAgc3RyaCAgICByOCwgW3IwLCAjNF0gICAgOyBvNgotICAgIHN4dGggICAgcjYsIHI2ICA7Ci0gICAgbW92IHI4LCByNiwgYXNyICMzICA7IG83ID4+IDMKLSAgICBzdHJoICAgIHI4LCBbcjAsICM2XSAgICA7IG83Ci0gICAgc3h0aCAgICByNywgcjcgIDsKLSAgICBtb3YgcjgsIHI3LCBhc3IgIzMgIDsgbzQgPj4gMwotICAgIHN0cmggICAgcjgsIFtyMF0sIHIyICAgIDsgbzQgICAgICAgICtwCi07Ozs7OyAgIHN1YnMgICAgcjUsIHI1LCAjMHgxICAgIDsgaS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLSAgICBibmUgbG9vcDJfZHVhbCAgOwotICAgICAgICAgICAgOwotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfSA7IHJlcGxhY2UgdmFycywgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmUKLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2l3YWxzaF92Ni5hc20gYi92cDgvY29tbW9uL2FybS9hcm12Ni9pd2Fsc2hfdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNiZmYwLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2l3YWxzaF92Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLSAgICBFWFBPUlQgfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfdjZ8Ci0gICAgRVhQT1JUIHx2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfdjZ8Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQotCi07c2hvcnQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF92NihzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpCi18dnA4X3Nob3J0X2ludl93YWxzaDR4NF92NnwgUFJPQwotCi0gICAgc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0gICAgbGRyICAgICAgICAgcjIsIFtyMF0sICM0ICAgICAgICAgOyBbMSAgfCAgMF0KLSAgICBsZHIgICAgICAgICByMywgW3IwXSwgIzQgICAgICAgICA7IFszICB8ICAyXQotICAgIGxkciAgICAgICAgIHI0LCBbcjBdLCAjNCAgICAgICAgIDsgWzUgIHwgIDRdCi0gICAgbGRyICAgICAgICAgcjUsIFtyMF0sICM0ICAgICAgICAgOyBbNyAgfCAgNl0KLSAgICBsZHIgICAgICAgICByNiwgW3IwXSwgIzQgICAgICAgICA7IFs5ICB8ICA4XQotICAgIGxkciAgICAgICAgIHI3LCBbcjBdLCAjNCAgICAgICAgIDsgWzExIHwgMTBdCi0gICAgbGRyICAgICAgICAgcjgsIFtyMF0sICM0ICAgICAgICAgOyBbMTMgfCAxMl0KLSAgICBsZHIgICAgICAgICByOSwgW3IwXSAgICAgICAgICAgICA7IFsxNSB8IDE0XQotCi0gICAgcWFkZDE2ICAgICAgcjEwLCByMiwgcjggICAgICAgICAgOyBhMSBbMSsxMyAgfCAgMCsxMl0KLSAgICBxYWRkMTYgICAgICByMTEsIHI0LCByNiAgICAgICAgICA7IGIxIFs1KzkgICB8ICA0KzhdCi0gICAgcXN1YjE2ICAgICAgcjEyLCByNCwgcjYgICAgICAgICAgOyBjMSBbNS05ICAgfCAgNC04XQotICAgIHFzdWIxNiAgICAgIGxyLCByMiwgcjggICAgICAgICAgIDsgZDEgWzEtMTMgIHwgIDAtMTJdCi0KLSAgICBxYWRkMTYgICAgICByMiwgcjEwLCByMTEgICAgICAgICA7IGExICsgYjEgWzEgIHwgIDBdCi0gICAgcWFkZDE2ICAgICAgcjQsIHIxMiwgbHIgICAgICAgICAgOyBjMSArIGQxIFs1ICB8ICA0XQotICAgIHFzdWIxNiAgICAgIHI2LCByMTAsIHIxMSAgICAgICAgIDsgYTEgLSBiMSBbOSAgfCAgOF0KLSAgICBxc3ViMTYgICAgICByOCwgbHIsIHIxMiAgICAgICAgICA7IGQxIC0gYzEgWzEzIHwgMTJdCi0KLSAgICBxYWRkMTYgICAgICByMTAsIHIzLCByOSAgICAgICAgICA7IGExIFszKzE1ICB8ICAyKzE0XQotICAgIHFhZGQxNiAgICAgIHIxMSwgcjUsIHI3ICAgICAgICAgIDsgYjEgWzcrMTEgIHwgIDYrMTBdCi0gICAgcXN1YjE2ICAgICAgcjEyLCByNSwgcjcgICAgICAgICAgOyBjMSBbNy0xMSAgfCAgNi0xMF0KLSAgICBxc3ViMTYgICAgICBsciwgcjMsIHI5ICAgICAgICAgICA7IGQxIFszLTE1ICB8ICAyLTE0XQotCi0gICAgcWFkZDE2ICAgICAgcjMsIHIxMCwgcjExICAgICAgICAgOyBhMSArIGIxIFszICB8ICAyXQotICAgIHFhZGQxNiAgICAgIHI1LCByMTIsIGxyICAgICAgICAgIDsgYzEgKyBkMSBbNyAgfCAgNl0KLSAgICBxc3ViMTYgICAgICByNywgcjEwLCByMTEgICAgICAgICA7IGExIC0gYjEgWzExIHwgMTBdCi0gICAgcXN1YjE2ICAgICAgcjksIGxyLCByMTIgICAgICAgICAgOyBkMSAtIGMxIFsxNSB8IDE0XQotCi0gICAgOyBmaXJzdCB0cmFuc2Zvcm0gY29tcGxldGUKLQotICAgIHFzdWJhZGR4ICAgIHIxMCwgcjIsIHIzICAgICAgICAgIDsgW2MxfGExXSBbMS0yICAgfCAgIDArM10KLSAgICBxYWRkc3VieCAgICByMTEsIHIyLCByMyAgICAgICAgICA7IFtiMXxkMV0gWzErMiAgIHwgICAwLTNdCi0gICAgcXN1YmFkZHggICAgcjEyLCByNCwgcjUgICAgICAgICAgOyBbYzF8YTFdIFs1LTYgICB8ICAgNCs3XQotICAgIHFhZGRzdWJ4ICAgIGxyLCByNCwgcjUgICAgICAgICAgIDsgW2IxfGQxXSBbNSs2ICAgfCAgIDQtN10KLQotICAgIHFhZGRzdWJ4ICAgIHIyLCByMTAsIHIxMSAgICAgICAgIDsgW2IyfGMyXSBbYzErZDEgfCBhMS1iMV0KLSAgICBxYWRkc3VieCAgICByMywgcjExLCByMTAgICAgICAgICA7IFthMnxkMl0gW2IxK2ExIHwgZDEtYzFdCi0gICAgbGRyICAgICAgICAgcjEwLCBjMHgwMDAzMDAwMwotICAgIHFhZGRzdWJ4ICAgIHI0LCByMTIsIGxyICAgICAgICAgIDsgW2IyfGMyXSBbYzErZDEgfCBhMS1iMV0KLSAgICBxYWRkc3VieCAgICByNSwgbHIsIHIxMiAgICAgICAgICA7IFthMnxkMl0gW2IxK2ExIHwgZDEtYzFdCi0KLSAgICBxYWRkMTYgICAgICByMiwgcjIsIHIxMCAgICAgICAgICA7IFtiMiszfGMyKzNdCi0gICAgcWFkZDE2ICAgICAgcjMsIHIzLCByMTAgICAgICAgICAgOyBbYTIrM3xkMiszXQotICAgIHFhZGQxNiAgICAgIHI0LCByNCwgcjEwICAgICAgICAgIDsgW2IyKzN8YzIrM10KLSAgICBxYWRkMTYgICAgICByNSwgcjUsIHIxMCAgICAgICAgICA7IFthMiszfGQyKzNdCi0KLSAgICBhc3IgICAgICAgICByMTIsIHIyLCAjMyAgICAgICAgICA7IFsxICB8ICB4XQotICAgIHBraHRiICAgICAgIHIxMiwgcjEyLCByMywgYXNyICMxOTsgWzEgIHwgIDBdCi0gICAgbHNsICAgICAgICAgbHIsIHIzLCAjMTYgICAgICAgICAgOyBbfjMgfCAgeF0KLSAgICBsc2wgICAgICAgICByMiwgcjIsICMxNiAgICAgICAgICA7IFt+MiB8ICB4XQotICAgIGFzciAgICAgICAgIGxyLCBsciwgIzMgICAgICAgICAgIDsgWzMgIHwgIHhdCi0gICAgcGtodGIgICAgICAgbHIsIGxyLCByMiwgYXNyICMxOSAgOyBbMyAgfCAgMl0KLQotICAgIGFzciAgICAgICAgIHIyLCByNCwgIzMgICAgICAgICAgIDsgWzUgIHwgIHhdCi0gICAgcGtodGIgICAgICAgcjIsIHIyLCByNSwgYXNyICMxOSAgOyBbNSAgfCAgNF0KLSAgICBsc2wgICAgICAgICByMywgcjUsICMxNiAgICAgICAgICA7IFt+NyB8ICB4XQotICAgIGxzbCAgICAgICAgIHI0LCByNCwgIzE2ICAgICAgICAgIDsgW342IHwgIHhdCi0gICAgYXNyICAgICAgICAgcjMsIHIzLCAjMyAgICAgICAgICAgOyBbNyAgfCAgeF0KLSAgICBwa2h0YiAgICAgICByMywgcjMsIHI0LCBhc3IgIzE5ICA7IFs3ICB8ICA2XQotCi0gICAgc3RyICAgICAgICAgcjEyLCBbcjFdLCAjNAotICAgIHN0ciAgICAgICAgIGxyLCBbcjFdLCAjNAotICAgIHN0ciAgICAgICAgIHIyLCBbcjFdLCAjNAotICAgIHN0ciAgICAgICAgIHIzLCBbcjFdLCAjNAotCi0gICAgcXN1YmFkZHggICAgcjIsIHI2LCByNyAgICAgICAgICAgOyBbYzF8YTFdIFs5LTEwICB8ICA4KzExXQotICAgIHFhZGRzdWJ4ICAgIHIzLCByNiwgcjcgICAgICAgICAgIDsgW2IxfGQxXSBbOSsxMCAgfCAgOC0xMV0KLSAgICBxc3ViYWRkeCAgICByNCwgcjgsIHI5ICAgICAgICAgICA7IFtjMXxhMV0gWzEzLTE0IHwgMTIrMTVdCi0gICAgcWFkZHN1YnggICAgcjUsIHI4LCByOSAgICAgICAgICAgOyBbYjF8ZDFdIFsxMysxNCB8IDEyLTE1XQotCi0gICAgcWFkZHN1YnggICAgcjYsIHIyLCByMyAgICAgICAgICAgOyBbYjJ8YzJdIFtjMStkMSB8IGExLWIxXQotICAgIHFhZGRzdWJ4ICAgIHI3LCByMywgcjIgICAgICAgICAgIDsgW2EyfGQyXSBbYjErYTEgfCBkMS1jMV0KLSAgICBxYWRkc3VieCAgICByOCwgcjQsIHI1ICAgICAgICAgICA7IFtiMnxjMl0gW2MxK2QxIHwgYTEtYjFdCi0gICAgcWFkZHN1YnggICAgcjksIHI1LCByNCAgICAgICAgICAgOyBbYTJ8ZDJdIFtiMSthMSB8IGQxLWMxXQotCi0gICAgcWFkZDE2ICAgICAgcjYsIHI2LCByMTAgICAgICAgICAgOyBbYjIrM3xjMiszXQotICAgIHFhZGQxNiAgICAgIHI3LCByNywgcjEwICAgICAgICAgIDsgW2EyKzN8ZDIrM10KLSAgICBxYWRkMTYgICAgICByOCwgcjgsIHIxMCAgICAgICAgICA7IFtiMiszfGMyKzNdCi0gICAgcWFkZDE2ICAgICAgcjksIHI5LCByMTAgICAgICAgICAgOyBbYTIrM3xkMiszXQotCi0gICAgYXNyICAgICAgICAgcjIsIHI2LCAjMyAgICAgICAgICAgOyBbOSAgfCAgeF0KLSAgICBwa2h0YiAgICAgICByMiwgcjIsIHI3LCBhc3IgIzE5ICA7IFs5ICB8ICA4XQotICAgIGxzbCAgICAgICAgIHIzLCByNywgIzE2ICAgICAgICAgIDsgW34xMXwgIHhdCi0gICAgbHNsICAgICAgICAgcjQsIHI2LCAjMTYgICAgICAgICAgOyBbfjEwfCAgeF0KLSAgICBhc3IgICAgICAgICByMywgcjMsICMzICAgICAgICAgICA7IFsxMSB8ICB4XQotICAgIHBraHRiICAgICAgIHIzLCByMywgcjQsIGFzciAjMTkgIDsgWzExIHwgMTBdCi0KLSAgICBhc3IgICAgICAgICByNCwgcjgsICMzICAgICAgICAgICA7IFsxMyB8ICB4XQotICAgIHBraHRiICAgICAgIHI0LCByNCwgcjksIGFzciAjMTkgIDsgWzEzIHwgMTJdCi0gICAgbHNsICAgICAgICAgcjUsIHI5LCAjMTYgICAgICAgICAgOyBbfjE1fCAgeF0KLSAgICBsc2wgICAgICAgICByNiwgcjgsICMxNiAgICAgICAgICA7IFt+MTR8ICB4XQotICAgIGFzciAgICAgICAgIHI1LCByNSwgIzMgICAgICAgICAgIDsgWzE1IHwgIHhdCi0gICAgcGtodGIgICAgICAgcjUsIHI1LCByNiwgYXNyICMxOSAgOyBbMTUgfCAxNF0KLQotICAgIHN0ciAgICAgICAgIHIyLCBbcjFdLCAjNAotICAgIHN0ciAgICAgICAgIHIzLCBbcjFdLCAjNAotICAgIHN0ciAgICAgICAgIHI0LCBbcjFdLCAjNAotICAgIHN0ciAgICAgICAgIHI1LCBbcjFdCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgICAgICAgOyB8dnA4X3Nob3J0X2ludl93YWxzaDR4NF92NnwKLQotCi07c2hvcnQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX3Y2KHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKLXx2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfdjZ8IFBST0MKLQotICAgIGxkcnNoICAgICAgIHIyLCBbcjBdICAgICAgICAgICAgIDsgWzBdCi0gICAgYWRkICAgICAgICAgcjIsIHIyLCAjMyAgICAgICAgICAgOyBbMF0gKyAzCi0gICAgYXNyICAgICAgICAgcjIsIHIyLCAjMyAgICAgICAgICAgOyBhMSAoWzBdKzMpID4+IDMKLSAgICBsc2wgICAgICAgICByMiwgcjIsICMxNiAgICAgICAgICA7IFthMSB8ICB4XQotICAgIG9yciAgICAgICAgIHIyLCByMiwgcjIsIGxzciAjMTYgIDsgW2ExIHwgYTFdCi0KLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLSAgICBzdHIgICAgICAgICByMiwgW3IxXQotCi0gICAgYnggICAgICAgICAgbHIKLSAgICBFTkRQICAgICAgICA7IHx2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfdjZ8Ci0KLTsgQ29uc3RhbnQgUG9vbAotYzB4MDAwMzAwMDMgRENEIDB4MDAwMzAwMDMKLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2FybXY2L2xvb3BmaWx0ZXJfdjYuYXNtIGIvdnA4L2NvbW1vbi9hcm0vYXJtdjYvbG9vcGZpbHRlcl92Ni5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDE3ZGUuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vYXJtdjYvbG9vcGZpbHRlcl92Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMjY0ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjZ8Ci0gICAgRVhQT1JUIHx2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjZ8Ci0gICAgRVhQT1JUIHx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12NnwKLSAgICBFWFBPUlQgfHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi0KLSAgICBNQUNSTwotICAgIFRSQU5TUE9TRV9NQVRSSVggJGEwLCAkYTEsICRhMiwgJGEzLCAkYjAsICRiMSwgJGIyLCAkYjMKLSAgICA7IGlucHV0OiAkYTAsICRhMSwgJGEyLCAkYTM7IG91dHB1dDogJGIwLCAkYjEsICRiMiwgJGIzCi0gICAgOyBhMDogMDMgMDIgMDEgMDAKLSAgICA7IGExOiAxMyAxMiAxMSAxMAotICAgIDsgYTI6IDIzIDIyIDIxIDIwCi0gICAgOyBhMzogMzMgMzIgMzEgMzAKLSAgICA7ICAgICBiMyBiMiBiMSBiMAotCi0gICAgdXh0YjE2ICAgICAgJGIxLCAkYTEgICAgICAgICAgICAgICAgICAgIDsgeHggMTIgeHggMTAKLSAgICB1eHRiMTYgICAgICAkYjAsICRhMCAgICAgICAgICAgICAgICAgICAgOyB4eCAwMiB4eCAwMAotICAgIHV4dGIxNiAgICAgICRiMywgJGEzICAgICAgICAgICAgICAgICAgICA7IHh4IDMyIHh4IDMwCi0gICAgdXh0YjE2ICAgICAgJGIyLCAkYTIgICAgICAgICAgICAgICAgICAgIDsgeHggMjIgeHggMjAKLSAgICBvcnIgICAgICAgICAkYjEsICRiMCwgJGIxLCBsc2wgIzggICAgICAgOyAxMiAwMiAxMCAwMAotICAgIG9yciAgICAgICAgICRiMywgJGIyLCAkYjMsIGxzbCAjOCAgICAgICA7IDMyIDIyIDMwIDIwCi0KLSAgICB1eHRiMTYgICAgICAkYTEsICRhMSwgcm9yICM4ICAgICAgICAgICAgOyB4eCAxMyB4eCAxMQotICAgIHV4dGIxNiAgICAgICRhMywgJGEzLCByb3IgIzggICAgICAgICAgICA7IHh4IDMzIHh4IDMxCi0gICAgdXh0YjE2ICAgICAgJGEwLCAkYTAsIHJvciAjOCAgICAgICAgICAgIDsgeHggMDMgeHggMDEKLSAgICB1eHRiMTYgICAgICAkYTIsICRhMiwgcm9yICM4ICAgICAgICAgICAgOyB4eCAyMyB4eCAyMQotICAgIG9yciAgICAgICAgICRhMCwgJGEwLCAkYTEsIGxzbCAjOCAgICAgICA7IDEzIDAzIDExIDAxCi0gICAgb3JyICAgICAgICAgJGEyLCAkYTIsICRhMywgbHNsICM4ICAgICAgIDsgMzMgMjMgMzEgMjEKLQotICAgIHBraHRiICAgICAgICRiMiwgJGIzLCAkYjEsIGFzciAjMTYgICAgICA7IDMyIDIyIDEyIDAyICAgLS0gcDEKLSAgICBwa2hidCAgICAgICAkYjAsICRiMSwgJGIzLCBsc2wgIzE2ICAgICAgOyAzMCAyMCAxMCAwMCAgIC0tIHAzCi0KLSAgICBwa2h0YiAgICAgICAkYjMsICRhMiwgJGEwLCBhc3IgIzE2ICAgICAgOyAzMyAyMyAxMyAwMyAgIC0tIHAwCi0gICAgcGtoYnQgICAgICAgJGIxLCAkYTAsICRhMiwgbHNsICMxNiAgICAgIDsgMzEgMjEgMTEgMDEgICAtLSBwMgotICAgIE1FTkQKLQotCi1zcmMgICAgICAgICBSTiAgcjAKLXBzdGVwICAgICAgIFJOICByMQotY291bnQgICAgICAgUk4gIHI1Ci0KLTtyMCAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTtyMSAgICAgaW50IHNyY19waXhlbF9zdGVwLAotO3IyICAgICBjb25zdCBjaGFyICpmbGltaXQsCi07cjMgICAgIGNvbnN0IGNoYXIgKmxpbWl0LAotO3N0YWNrICBjb25zdCBjaGFyICp0aHJlc2gsCi07c3RhY2sgIGludCAgY291bnQKLQotO05vdGU6IEFsbCAxNiBlbGVtZW50cyBpbiBmbGltaXQgYXJlIGVxdWFsLiBTbywgaW4gdGhlIGNvZGUsIG9ubHkgb25lIGxvYWQgaXMgbmVlZGVkCi07Zm9yIGZsaW1pdC4gU2FtZSB3YXkgYXBwbGllcyB0byBsaW1pdCBhbmQgdGhyZXNoLgotCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLXx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2fCBQUk9DCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLSAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBsaW5lcwotICAgIGxkciAgICAgICAgIGNvdW50LCBbc3AsICM0MF0gICAgICAgICAgICA7IGNvdW50IGZvciA4LWluLXBhcmFsbGVsCi0gICAgbGRyICAgICAgICAgcjYsIFtzcCwgIzM2XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggYWRkcmVzcwotICAgIHN1YiAgICAgICAgIHNwLCBzcCwgIzE2ICAgICAgICAgICAgICAgICA7IGNyZWF0ZSB0ZW1wIGJ1ZmZlcgotCi0gICAgbGRyICAgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcDMKLSAgICBsZHIgICAgICAgICByNCwgW3IyXSwgIzQgICAgICAgICAgICAgICAgOyBmbGltaXQKLSAgICBsZHIgICAgICAgICByMTAsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMgotICAgIGxkciAgICAgICAgIHIyLCBbcjNdLCAjNCAgICAgICAgICAgICAgICA7IGxpbWl0Ci0gICAgbGRyICAgICAgICAgcjExLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDEKLSAgICB1YWRkOCAgICAgICByNCwgcjQsIHI0ICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyCi0gICAgbGRyICAgICAgICAgcjMsIFtyNl0sICM0ICAgICAgICAgICAgICAgIDsgdGhyZXNoCi0gICAgbW92ICAgICAgICAgY291bnQsIGNvdW50LCBsc2wgIzEgICAgICAgIDsgNC1pbi1wYXJhbGxlbAotICAgIHVhZGQ4ICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdAotCi18SG5leHQ4fAotICAgIDsgdnA4X2ZpbHRlcl9tYXNrKCkgZnVuY3Rpb24KLSAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDAKLQotICAgIHVxc3ViOCAgICAgIHI2LCByOSwgcjEwICAgICAgICAgICAgICAgICA7IHAzIC0gcDIKLSAgICB1cXN1YjggICAgICByNywgcjEwLCByOSAgICAgICAgICAgICAgICAgOyBwMiAtIHAzCi0gICAgdXFzdWI4ICAgICAgcjgsIHIxMCwgcjExICAgICAgICAgICAgICAgIDsgcDIgLSBwMQotICAgIHVxc3ViOCAgICAgIHIxMCwgcjExLCByMTAgICAgICAgICAgICAgICA7IHAxIC0gcDIKLQotICAgIG9yciAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICA7IGFicyAocDMtcDIpCi0gICAgb3JyICAgICAgICAgcjgsIHI4LCByMTAgICAgICAgICAgICAgICAgIDsgYWJzIChwMi1wMSkKLSAgICB1cXN1YjggICAgICBsciwgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0LiBscjogdnA4X2ZpbHRlcl9tYXNrCi0gICAgdXFzdWI4ICAgICAgcjgsIHI4LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAotICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHAxIC0gcDAKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI4Ci0gICAgdXFzdWI4ICAgICAgcjcsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgcDAgLSBwMQotICAgIGxkciAgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHEwCi0gICAgbGRyICAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcTEKLSAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAxLXAwKQotICAgIHVxc3ViOCAgICAgIHI3LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLSAgICB1cXN1YjggICAgICByOCwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaCAgLS0gc2F2ZSByOCBmb3IgbGF0ZXIKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI3Ci0KLSAgICB1cXN1YjggICAgICByNiwgcjExLCByMTAgICAgICAgICAgICAgICAgOyBwMSAtIHExCi0gICAgdXFzdWI4ICAgICAgcjcsIHIxMCwgcjExICAgICAgICAgICAgICAgIDsgcTEgLSBwMQotICAgIHVxc3ViOCAgICAgIHIxMSwgcjEyLCByOSAgICAgICAgICAgICAgICA7IHAwIC0gcTAKLSAgICB1cXN1YjggICAgICByMTIsIHI5LCByMTIgICAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMS1xMSkKLSAgICBsZHIgICAgICAgICByNywgYzB4N0Y3RjdGN0YKLSAgICBvcnIgICAgICAgICByMTIsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKQotICAgIGxkciAgICAgICAgIHIxMSwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHEyCi0gICAgdXFhZGQ4ICAgICAgcjEyLCByMTIsIHIxMiAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkgKiAyCi0gICAgYW5kICAgICAgICAgcjYsIHI3LCByNiwgbHNyICMxICAgICAgICAgIDsgYWJzIChwMS1xMSkgLyAyCi0gICAgdXFzdWI4ICAgICAgcjcsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcTAgLSBxMQotICAgIHVxYWRkOCAgICAgIHIxMiwgcjEyLCByNiAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApKjIgKyBhYnMgKHAxLXExKS8yCi0gICAgdXFzdWI4ICAgICAgcjYsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcTEgLSBxMAotICAgIHVxc3ViOCAgICAgIHIxMiwgcjEyLCByNCAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gZmxpbWl0Ci0gICAgdXFzdWI4ICAgICAgcjksIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcTIgLSBxMQotCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByMTIKLQotICAgIGxkciAgICAgICAgIHIxMiwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHEzCi0gICAgdXFzdWI4ICAgICAgcjEwLCByMTAsIHIxMSAgICAgICAgICAgICAgIDsgcTEgLSBxMgotICAgIG9yciAgICAgICAgIHI2LCByNywgcjYgICAgICAgICAgICAgICAgICA7IGFicyAocTEtcTApCi0gICAgb3JyICAgICAgICAgcjEwLCByOSwgcjEwICAgICAgICAgICAgICAgIDsgYWJzIChxMi1xMSkKLSAgICB1cXN1YjggICAgICByNywgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0Ci0gICAgdXFzdWI4ICAgICAgcjEwLCByMTAsIHIyICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAotICAgIHVxc3ViOCAgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gdGhyZXNoIC0tIHNhdmUgcjYgZm9yIGxhdGVyCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByNwotICAgIG9yciAgICAgICAgIGxyLCBsciwgcjEwCi0KLSAgICB1cXN1YjggICAgICByMTAsIHIxMiwgcjExICAgICAgICAgICAgICAgOyBxMyAtIHEyCi0gICAgdXFzdWI4ICAgICAgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgcTIgLSBxMwotCi0gICAgbXZuICAgICAgICAgcjExLCAjMCAgICAgICAgICAgICAgICAgICAgIDsgcjExID09IC0xCi0KLSAgICBvcnIgICAgICAgICByMTAsIHIxMCwgcjkgICAgICAgICAgICAgICAgOyBhYnMgKHEzLXEyKQotICAgIHVxc3ViOCAgICAgIHIxMCwgcjEwLCByMiAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLQotICAgIG1vdiAgICAgICAgIHIxMiwgIzAKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHIxMAotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyCi0KLSAgICB1c3ViOCAgICAgICBsciwgcjEyLCBsciAgICAgICAgICAgICAgICAgOyB1c2UgdXN1YjggaW5zdGVhZCBvZiBzc3ViOAotICAgIHNlbCAgICAgICAgIGxyLCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IGZpbHRlciBtYXNrOiBscgotCi0gICAgY21wICAgICAgICAgbHIsICMwCi0gICAgYmVxICAgICAgICAgaHNraXBfZmlsdGVyICAgICAgICAgICAgICAgICA7IHNraXAgZmlsdGVyaW5nCi0KLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMSAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNiBsaW5lcwotCi0gICAgO3ZwOF9oZXZtYXNrKCkgZnVuY3Rpb24KLSAgICA7Y2FsY3VsYXRlIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgIG9yciAgICAgICAgIHIxMCwgcjYsIHI4ICAgICAgICAgICAgICAgICA7IGNhbGN1bGF0ZSB2cDhfaGV2bWFzawotCi0gICAgbGRyICAgICAgICAgcjcsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcDEKLQotICAgIHVzdWI4ICAgICAgIHIxMCwgcjEyLCByMTAgICAgICAgICAgICAgICA7IHVzZSB1c3ViOCBpbnN0ZWFkIG9mIHNzdWI4Ci0gICAgc2VsICAgICAgICAgcjYsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgb2J0YWluIHZwOF9oZXZtYXNrOiByNgotCi0gICAgO3ZwOF9maWx0ZXIoKSBmdW5jdGlvbgotICAgIGxkciAgICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAwCi0gICAgbGRyICAgICAgICAgcjEyLCBjMHg4MDgwODA4MAotICAgIGxkciAgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHEwCi0gICAgbGRyICAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcTEKLQotICAgIGVvciAgICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgICAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0gICAgZW9yICAgICAgICAgcjgsIHI4LCByMTIgICAgICAgICAgICAgICAgIDsgcDAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLSAgICBlb3IgICAgICAgICByOSwgcjksIHIxMiAgICAgICAgICAgICAgICAgOyBxMCBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCByMTIgICAgICAgICAgICAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0KLSAgICBzdHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBzdG9yZSBxczAgdGVtcG9yYXJpbHkKLSAgICBzdHIgICAgICAgICByOCwgW3NwLCAjNF0gICAgICAgICAgICAgICAgOyBzdG9yZSBwczAgdGVtcG9yYXJpbHkKLSAgICBzdHIgICAgICAgICByMTAsIFtzcCwgIzhdICAgICAgICAgICAgICAgOyBzdG9yZSBxczEgdGVtcG9yYXJpbHkKLSAgICBzdHIgICAgICAgICByNywgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBzdG9yZSBwczEgdGVtcG9yYXJpbHkKLQotICAgIHFzdWI4ICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEtcXMxKQotICAgIHFzdWI4ICAgICAgIHI4LCByOSwgcjggICAgICAgICAgICAgICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKLQotICAgIGFuZCAgICAgICAgIHI3LCByNywgcjYgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgKHI3KSAmPSBoZXYKLQotICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjgKLSAgICBsZHIgICAgICAgICByOSwgYzB4MDMwMzAzMDMgICAgICAgICAgICAgOyByOSA9IDMgLS1tb2RpZmllZCBmb3IgdnA4Ci0KLSAgICBxYWRkOCAgICAgICByNywgcjcsIHI4Ci0gICAgbGRyICAgICAgICAgcjEwLCBjMHgwNDA0MDQwNAotCi0gICAgcWFkZDggICAgICAgcjcsIHI3LCByOAotICAgIGFuZCAgICAgICAgIHI3LCByNywgbHIgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzazsKLQotICAgIDttb2RpZnkgY29kZSBmb3IgdnA4IC0tIEZpbHRlcjEgPSB2cDhfZmlsdGVyIChyNykKLSAgICBxYWRkOCAgICAgICByOCAsIHI3ICwgcjkgICAgICAgICAgICAgICAgOyBGaWx0ZXIyIChyOCkgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciszKQotICAgIHFhZGQ4ICAgICAgIHI3ICwgcjcgLCByMTAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlcis0KQotCi0gICAgbW92ICAgICAgICAgcjksICMwCi0gICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHI5ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMwotICAgIHNoYWRkOCAgICAgIHI3ICwgcjcgLCByOSAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPj49IDMKLSAgICBzaGFkZDggICAgICByOCAsIHI4ICwgcjkKLSAgICBzaGFkZDggICAgICByNyAsIHI3ICwgcjkKLSAgICBzaGFkZDggICAgICBsciAsIHI4ICwgcjkgICAgICAgICAgICAgICAgOyBscjogRmlsdGVyMgotICAgIHNoYWRkOCAgICAgIHI3ICwgcjcgLCByOSAgICAgICAgICAgICAgICA7IHI3OiBmaWx0ZXIKLQotICAgIDt1c3ViOCAgICAgIGxyLCByOCwgcjEwICAgICAgICAgICAgICAgICA7IHMgPSAocz09NCkqLTEKLSAgICA7c2VsICAgICAgICBsciwgcjExLCByOQotICAgIDt1c3ViOCAgICAgIHI4LCByMTAsIHI4Ci0gICAgO3NlbCAgICAgICAgcjgsIHIxMSwgcjkKLSAgICA7YW5kICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAtMSBmb3IgZWFjaCBlbGVtZW50IHRoYXQgZXF1YWxzIDQKLQotICAgIDtjYWxjdWxhdGUgb3V0cHV0Ci0gICAgO3FhZGQ4ICAgICAgbHIsIHI4LCByNyAgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChzICsgdnA4X2ZpbHRlcikKLQotICAgIGxkciAgICAgICAgIHI4LCBbc3BdICAgICAgICAgICAgICAgICAgICA7IGxvYWQgcXMwCi0gICAgbGRyICAgICAgICAgcjksIFtzcCwgIzRdICAgICAgICAgICAgICAgIDsgbG9hZCBwczAKLQotICAgIGxkciAgICAgICAgIHIxMCwgYzB4MDEwMTAxMDEKLQotICAgIHFzdWI4ICAgICAgIHI4ICxyOCwgcjcgICAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gdnA4X2ZpbHRlcikKLSAgICBxYWRkOCAgICAgICByOSwgcjksIGxyICAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIEZpbHRlcjIpCi0KLSAgICA7ZW5kIG9mIG1vZGlmaWNhdGlvbiBmb3IgdnA4Ci0KLSAgICBtb3YgICAgICAgICBsciwgIzAKLSAgICBzYWRkOCAgICAgICByNywgcjcgLCByMTAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICs9IDEKLSAgICBzaGFkZDggICAgICByNywgcjcsIGxyICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID4+PSAxCi0KLSAgICBsZHIgICAgICAgICByMTEsIFtzcCwgIzEyXSAgICAgICAgICAgICAgOyBsb2FkIHBzMQotICAgIGxkciAgICAgICAgIHIxMCwgW3NwLCAjOF0gICAgICAgICAgICAgICA7IGxvYWQgcXMxCi0KLSAgICBiaWMgICAgICAgICByNywgcjcsIHI2ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IH5oZXYKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgotCi0gICAgcWFkZDggICAgICAgcjExLCByMTEsIHI3ICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB2cDhfZmlsdGVyKQotICAgIHFzdWI4ICAgICAgIHIxMCwgcjEwLHI3ICAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMxIC0gdnA4X2ZpbHRlcikKLQotICAgIGVvciAgICAgICAgIHIxMSwgcjExLCByMTIgICAgICAgICAgICAgICA7ICpvcDEgPSB1XjB4ODAKLSAgICBzdHIgICAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBzdG9yZSBvcDEKLSAgICBlb3IgICAgICAgICByOSwgcjksIHIxMiAgICAgICAgICAgICAgICAgOyAqb3AwID0gdV4weDgwCi0gICAgc3RyICAgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgc3RvcmUgb3AwIHJlc3VsdAotICAgIGVvciAgICAgICAgIHI4LCByOCwgcjEyICAgICAgICAgICAgICAgICA7ICpvcTAgPSB1XjB4ODAKLSAgICBzdHIgICAgICAgICByOCwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBzdG9yZSBvcTAgcmVzdWx0Ci0gICAgZW9yICAgICAgICAgcjEwLCByMTAsIHIxMiAgICAgICAgICAgICAgIDsgKm9xMSA9IHVeMHg4MAotICAgIHN0ciAgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHN0b3JlIG9xMQotCi0gICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzEKLQotfGhza2lwX2ZpbHRlcnwKLSAgICBhZGQgICAgICAgICBzcmMsIHNyYywgIzQKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgotCi0gICAgc3VicyAgICAgICAgY291bnQsIGNvdW50LCAjMQotCi0gICAgO3BsZCAgICAgICAgICAgIFtzcmNdCi0gICAgO3BsZCAgICAgICAgICAgIFtzcmMsIHBzdGVwXQotICAgIDtwbGQgICAgICAgICAgICBbc3JjLCBwc3RlcCwgbHNsICMxXQotICAgIDtwbGQgICAgICAgICAgICBbc3JjLCBwc3RlcCwgbHNsICMyXQotICAgIDtwbGQgICAgICAgICAgICBbc3JjLCBwc3RlcCwgbHNsICMzXQotCi0gICAgbGRybmUgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcDMKLSAgICBsZHJuZSAgICAgICByMTAsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMgotICAgIGxkcm5lICAgICAgIHIxMSwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHAxCi0KLSAgICBibmUgICAgICAgICBIbmV4dDgKLQotICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzE2Ci0gICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjZ8Ci0KLQotOy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCi18dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2fCBQUk9DCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLSAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBsaW5lcwotICAgIGxkciAgICAgICAgIGNvdW50LCBbc3AsICM0MF0gICAgICAgICAgICA7IGNvdW50IGZvciA4LWluLXBhcmFsbGVsCi0gICAgbGRyICAgICAgICAgcjYsIFtzcCwgIzM2XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggYWRkcmVzcwotICAgIHN1YiAgICAgICAgIHNwLCBzcCwgIzE2ICAgICAgICAgICAgICAgICA7IGNyZWF0ZSB0ZW1wIGJ1ZmZlcgotCi0gICAgbGRyICAgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcDMKLSAgICBsZHIgICAgICAgICByNCwgW3IyXSwgIzQgICAgICAgICAgICAgICAgOyBmbGltaXQKLSAgICBsZHIgICAgICAgICByMTAsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMgotICAgIGxkciAgICAgICAgIHIyLCBbcjNdLCAjNCAgICAgICAgICAgICAgICA7IGxpbWl0Ci0gICAgbGRyICAgICAgICAgcjExLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDEKLSAgICB1YWRkOCAgICAgICByNCwgcjQsIHI0ICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyCi0gICAgbGRyICAgICAgICAgcjMsIFtyNl0sICM0ICAgICAgICAgICAgICAgIDsgdGhyZXNoCi0gICAgbW92ICAgICAgICAgY291bnQsIGNvdW50LCBsc2wgIzEgICAgICAgIDsgNC1pbi1wYXJhbGxlbAotICAgIHVhZGQ4ICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdAotCi18TUJIbmV4dDh8Ci0KLSAgICA7IHZwOF9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCi0gICAgOyBjYWxjdWxhdGUgYnJlYWtvdXQgY29uZGl0aW9ucwotICAgIGxkciAgICAgICAgIHIxMiwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHAwCi0KLSAgICB1cXN1YjggICAgICByNiwgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBwMyAtIHAyCi0gICAgdXFzdWI4ICAgICAgcjcsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcDIgLSBwMwotICAgIHVxc3ViOCAgICAgIHI4LCByMTAsIHIxMSAgICAgICAgICAgICAgICA7IHAyIC0gcDEKLSAgICB1cXN1YjggICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBwMSAtIHAyCi0KLSAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAzLXAyKQotICAgIG9yciAgICAgICAgIHI4LCByOCwgcjEwICAgICAgICAgICAgICAgICA7IGFicyAocDItcDEpCi0gICAgdXFzdWI4ICAgICAgbHIsIHI2LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdC4gbHI6IHZwOF9maWx0ZXJfbWFzawotICAgIHVxc3ViOCAgICAgIHI4LCByOCwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLQotICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHAxIC0gcDAKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI4Ci0gICAgdXFzdWI4ICAgICAgcjcsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgcDAgLSBwMQotICAgIGxkciAgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHEwCi0gICAgbGRyICAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcTEKLSAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAxLXAwKQotICAgIHVxc3ViOCAgICAgIHI3LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLSAgICB1cXN1YjggICAgICByOCwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaCAgLS0gc2F2ZSByOCBmb3IgbGF0ZXIKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI3Ci0KLSAgICB1cXN1YjggICAgICByNiwgcjExLCByMTAgICAgICAgICAgICAgICAgOyBwMSAtIHExCi0gICAgdXFzdWI4ICAgICAgcjcsIHIxMCwgcjExICAgICAgICAgICAgICAgIDsgcTEgLSBwMQotICAgIHVxc3ViOCAgICAgIHIxMSwgcjEyLCByOSAgICAgICAgICAgICAgICA7IHAwIC0gcTAKLSAgICB1cXN1YjggICAgICByMTIsIHI5LCByMTIgICAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMS1xMSkKLSAgICBsZHIgICAgICAgICByNywgYzB4N0Y3RjdGN0YKLSAgICBvcnIgICAgICAgICByMTIsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKQotICAgIGxkciAgICAgICAgIHIxMSwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHEyCi0gICAgdXFhZGQ4ICAgICAgcjEyLCByMTIsIHIxMiAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkgKiAyCi0gICAgYW5kICAgICAgICAgcjYsIHI3LCByNiwgbHNyICMxICAgICAgICAgIDsgYWJzIChwMS1xMSkgLyAyCi0gICAgdXFzdWI4ICAgICAgcjcsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcTAgLSBxMQotICAgIHVxYWRkOCAgICAgIHIxMiwgcjEyLCByNiAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApKjIgKyBhYnMgKHAxLXExKS8yCi0gICAgdXFzdWI4ICAgICAgcjYsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcTEgLSBxMAotICAgIHVxc3ViOCAgICAgIHIxMiwgcjEyLCByNCAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gZmxpbWl0Ci0gICAgdXFzdWI4ICAgICAgcjksIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcTIgLSBxMQotCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByMTIKLQotICAgIGxkciAgICAgICAgIHIxMiwgW3NyY10sIHBzdGVwICAgICAgICAgICA7IHEzCi0KLSAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjExICAgICAgICAgICAgICAgOyBxMSAtIHEyCi0gICAgb3JyICAgICAgICAgcjYsIHI3LCByNiAgICAgICAgICAgICAgICAgIDsgYWJzIChxMS1xMCkKLSAgICBvcnIgICAgICAgICByMTAsIHI5LCByMTAgICAgICAgICAgICAgICAgOyBhYnMgKHEyLXExKQotICAgIHVxc3ViOCAgICAgIHI3LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLSAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjIgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0Ci0gICAgdXFzdWI4ICAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byB0aHJlc2ggLS0gc2F2ZSByNiBmb3IgbGF0ZXIKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI3Ci0gICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKLQotICAgIHVxc3ViOCAgICAgIHIxMCwgcjEyLCByMTEgICAgICAgICAgICAgICA7IHEzIC0gcTIKLSAgICB1cXN1YjggICAgICByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBxMiAtIHEzCi0KLSAgICBtdm4gICAgICAgICByMTEsICMwICAgICAgICAgICAgICAgICAgICAgOyByMTEgPT0gLTEKLQotICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByOSAgICAgICAgICAgICAgICA7IGFicyAocTMtcTIpCi0gICAgdXFzdWI4ICAgICAgcjEwLCByMTAsIHIyICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAotCi0gICAgbW92ICAgICAgICAgcjEyLCAjMAotCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKLQotICAgIHVzdWI4ICAgICAgIGxyLCByMTIsIGxyICAgICAgICAgICAgICAgICA7IHVzZSB1c3ViOCBpbnN0ZWFkIG9mIHNzdWI4Ci0gICAgc2VsICAgICAgICAgbHIsIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgZmlsdGVyIG1hc2s6IGxyCi0KLSAgICBjbXAgICAgICAgICBsciwgIzAKLSAgICBiZXEgICAgICAgICBtYmhza2lwX2ZpbHRlciAgICAgICAgICAgICAgIDsgc2tpcCBmaWx0ZXJpbmcKLQotICAgIDt2cDhfaGV2bWFzaygpIGZ1bmN0aW9uCi0gICAgO2NhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNiBsaW5lcwotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMxCi0KLSAgICBvcnIgICAgICAgICByMTAsIHI2LCByOAotICAgIGxkciAgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAxCi0KLSAgICB1c3ViOCAgICAgICByMTAsIHIxMiwgcjEwCi0gICAgc2VsICAgICAgICAgcjYsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgaGV2IG1hc2s6IHI2Ci0KLSAgICA7dnA4X21iZmlsdGVyKCkgZnVuY3Rpb24KLSAgICA7cDIsIHEyIGFyZSBvbmx5IG5lZWRlZCBhdCB0aGUgZW5kLiBEb24ndCBuZWVkIHRvIGxvYWQgdGhlbSBpbiBub3cuCi0gICAgbGRyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcDAKLSAgICBsZHIgICAgICAgICByMTIsIGMweDgwODA4MDgwCi0gICAgbGRyICAgICAgICAgcjksIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgcTAKLSAgICBsZHIgICAgICAgICByMTAsIFtzcmNdICAgICAgICAgICAgICAgICAgOyBxMQotCi0gICAgZW9yICAgICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgICAgIDsgcHMxCi0gICAgZW9yICAgICAgICAgcjgsIHI4LCByMTIgICAgICAgICAgICAgICAgIDsgcHMwCi0gICAgZW9yICAgICAgICAgcjksIHI5LCByMTIgICAgICAgICAgICAgICAgIDsgcXMwCi0gICAgZW9yICAgICAgICAgcjEwLCByMTAsIHIxMiAgICAgICAgICAgICAgIDsgcXMxCi0KLSAgICBxc3ViOCAgICAgICByMTIsIHI5LCByOCAgICAgICAgICAgICAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCi0gICAgc3RyICAgICAgICAgcjcsIFtzcCwgIzEyXSAgICAgICAgICAgICAgIDsgc3RvcmUgcHMxIHRlbXBvcmFyaWx5Ci0gICAgcXN1YjggICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMS1xczEpCi0gICAgc3RyICAgICAgICAgcjEwLCBbc3AsICM4XSAgICAgICAgICAgICAgIDsgc3RvcmUgcXMxIHRlbXBvcmFyaWx5Ci0gICAgcWFkZDggICAgICAgcjcsIHI3LCByMTIKLSAgICBzdHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBzdG9yZSBxczAgdGVtcG9yYXJpbHkKLSAgICBxYWRkOCAgICAgICByNywgcjcsIHIxMgotICAgIHN0ciAgICAgICAgIHI4LCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IHN0b3JlIHBzMCB0ZW1wb3JhcmlseQotICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXI6IHI3Ci0KLSAgICBsZHIgICAgICAgICByMTAsIGMweDAzMDMwMzAzICAgICAgICAgICAgOyByMTAgPSAzIC0tbW9kaWZpZWQgZm9yIHZwOAotICAgIGxkciAgICAgICAgIHI5LCBjMHgwNDA0MDQwNAotCi0gICAgYW5kICAgICAgICAgcjcsIHI3LCBsciAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrIChsciBpcyBmcmVlKQotCi0gICAgbW92ICAgICAgICAgcjEyLCByNyAgICAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMjogcjEyCi0gICAgYW5kICAgICAgICAgcjEyLCByMTIsIHI2ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAmPSBoZXYKLQotICAgIDttb2RpZnkgY29kZSBmb3IgdnA4Ci0gICAgO3NhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMKLSAgICBxYWRkOCAgICAgICByOCAsIHIxMiAsIHI5ICAgICAgICAgICAgICAgOyBGaWx0ZXIxIChyOCkgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMis0KQotICAgIHFhZGQ4ICAgICAgIHIxMiAsIHIxMiAsIHIxMCAgICAgICAgICAgICA7IEZpbHRlcjIgKHIxMikgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiszKQotCi0gICAgbW92ICAgICAgICAgcjEwLCAjMAotICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKLSAgICBzaGFkZDggICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHIxMAotICAgIHNoYWRkOCAgICAgIHIxMiAsIHIxMiAsIHIxMAotICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IHI4OiBGaWx0ZXIxCi0gICAgc2hhZGQ4ICAgICAgcjEyICwgcjEyICwgcjEwICAgICAgICAgICAgIDsgcjEyOiBGaWx0ZXIyCi0KLSAgICBsZHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAotICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgcHMwCi0KLSAgICBxc3ViOCAgICAgICByOSAsIHI5LCByOCAgICAgICAgICAgICAgICAgOyBxczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSkKLSAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBwczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMikKLQotICAgIDtzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszCi0gICAgO2FuZCAgICAgICAgICAgIHI4LCByMTIsIHIxMCAgICAgICAgICAgICAgICA7IHMgPSBGaWx0ZXIyICYgNyAoczogcjgpCi0gICAgO3FhZGQ4ICAgICAgcjEyICwgcjEyICwgcjkgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyKzQpCi0gICAgO21vdiAgICAgICAgICAgIHIxMCwgIzAKLSAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgO3VzdWI4ICAgICAgbHIsIHI4LCByOSAgICAgICAgICAgICAgICAgIDsgcyA9IChzPT00KSotMQotICAgIDtzZWwgICAgICAgICAgICBsciwgcjExLCByMTAKLSAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAKLSAgICA7dXN1YjggICAgICByOCwgcjksIHI4Ci0gICAgO3NlbCAgICAgICAgICAgIHI4LCByMTEsIHIxMAotICAgIDtsZHIgICAgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAotICAgIDtsZHIgICAgICAgICAgICByMTEsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHBzMAotICAgIDtzaGFkZDggICAgIHIxMiAsIHIxMiAsIHIxMAotICAgIDthbmQgICAgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAtMSBmb3IgZWFjaCBlbGVtZW50IHRoYXQgZXF1YWxzIDQKLSAgICA7cWFkZDggICAgICByMTAsIHI4LCByMTIgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHMgKyBGaWx0ZXIyKQotICAgIDtxc3ViOCAgICAgIHI5ICwgcjksIHIxMiAgICAgICAgICAgICAgICA7IHFzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSBGaWx0ZXIyKQotICAgIDtxYWRkOCAgICAgIHIxMSwgcjExLCByMTAgICAgICAgICAgICAgICA7IHBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KQotCi0gICAgO2VuZCBvZiBtb2RpZmljYXRpb24gZm9yIHZwOAotCi0gICAgYmljICAgICAgICAgcjEyLCByNywgcjYgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSB+aGV2ICAgICggcjYgaXMgZnJlZSkKLSAgICA7bW92ICAgICAgICByMTIsIHI3Ci0KLSAgICA7cm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIG1vdiAgICAgICAgIGxyLCAjMHgxYiAgICAgICAgICAgICAgICAgICA7IDI3Ci0gICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKLQotICAgIHN4dGIxNiAgICAgIHI2LCByMTIKLSAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4Ci0gICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKLSAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNwotICAgIHNtbGFiYiAgICAgIHI3LCByMTAsIGxyLCByNwotICAgIHNtdWx0YiAgICAgIHIxMCwgcjEwLCBscgotICAgIHNzYXQgICAgICAgIHI4LCAjOCwgcjgsIGFzciAjNwotICAgIHNzYXQgICAgICAgIHI2LCAjOCwgcjYsIGFzciAjNwotICAgIGFkZCAgICAgICAgIHIxMCwgcjEwLCAjNjMKLSAgICBzc2F0ICAgICAgICByNywgIzgsIHI3LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNwotCi0gICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCi0KLSAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2Ci0gICAgcGtoYnQgICAgICAgcjEwLCByNywgcjEwLCBsc2wgIzE2Ci0gICAgdXh0YjE2ICAgICAgcjYsIHI2Ci0gICAgdXh0YjE2ICAgICAgcjEwLCByMTAKLQotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcAotCi0gICAgb3JyICAgICAgICAgcjEwLCByNiwgcjEwLCBsc2wgIzggICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpPj43KQotCi0gICAgcXN1YjggICAgICAgcjgsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB1KQotICAgIHFhZGQ4ICAgICAgIHIxMCwgcjExLCByMTAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgdSkKLSAgICBlb3IgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAqb3EwID0gc14weDgwCi0gICAgc3RyICAgICAgICAgcjgsIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgKm9xMAotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcAotICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgICAgICAgICA7ICpvcDAgPSBzXjB4ODAKLSAgICBzdHIgICAgICAgICByMTAsIFtzcmNdICAgICAgICAgICAgICAgICAgOyBzdG9yZSAqb3AwCi0KLSAgICA7cm91Z2hseSAyLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIG1vdiAgICAgICAgIGxyLCAjMHgxMiAgICAgICAgICAgICAgICAgICA7IDE4Ci0gICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKLQotICAgIHN4dGIxNiAgICAgIHI2LCByMTIKLSAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4Ci0gICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKLSAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNwotICAgIHNtbGFiYiAgICAgIHI5LCByMTAsIGxyLCByNwotICAgIHNtbGF0YiAgICAgIHIxMCwgcjEwLCBsciwgcjcKLSAgICBzc2F0ICAgICAgICByOCwgIzgsIHI4LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByNiwgIzgsIHI2LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByOSwgIzgsIHI5LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNwotCi0gICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCi0KLSAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2Ci0gICAgcGtoYnQgICAgICAgcjEwLCByOSwgcjEwLCBsc2wgIzE2Ci0KLSAgICBsZHIgICAgICAgICByOSwgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBsb2FkIHFzMQotICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IGxvYWQgcHMxCi0KLSAgICB1eHRiMTYgICAgICByNiwgcjYKLSAgICB1eHRiMTYgICAgICByMTAsIHIxMAotCi0gICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwCi0KLSAgICBvcnIgICAgICAgICByMTAsIHI2LCByMTAsIGxzbCAjOCAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAxOCk+PjcpCi0KLSAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSArIHUpCi0gICAgcXN1YjggICAgICAgcjgsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB1KQotICAgIGVvciAgICAgICAgIHIxMSwgcjExLCBsciAgICAgICAgICAgICAgICA7ICpvcDEgPSBzXjB4ODAKLSAgICBzdHIgICAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBzdG9yZSAqb3AxCi0gICAgZW9yICAgICAgICAgcjgsIHI4LCBsciAgICAgICAgICAgICAgICAgIDsgKm9xMSA9IHNeMHg4MAotICAgIGFkZCAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMxCi0KLSAgICBtb3YgICAgICAgICByNywgIzB4M2YgICAgICAgICAgICAgICAgICAgOyA2MwotCi0gICAgc3RyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgc3RvcmUgKm9xMQotCi0gICAgO3JvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKLSAgICBtb3YgICAgICAgICBsciwgIzB4OSAgICAgICAgICAgICAgICAgICAgOyA5Ci0gICAgbGRyICAgICAgICAgcjksIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgbG9hZCBxMgotCi0gICAgc3h0YjE2ICAgICAgcjYsIHIxMgotICAgIHN4dGIxNiAgICAgIHIxMCwgcjEyLCByb3IgIzgKLSAgICBzbWxhYmIgICAgICByOCwgcjYsIGxyLCByNwotICAgIHNtbGF0YiAgICAgIHI2LCByNiwgbHIsIHI3Ci0gICAgc21sYWJiICAgICAgcjEyLCByMTAsIGxyLCByNwotICAgIHNtbGF0YiAgICAgIHIxMCwgcjEwLCBsciwgcjcKLSAgICBzc2F0ICAgICAgICByOCwgIzgsIHI4LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByNiwgIzgsIHI2LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByMTIsICM4LCByMTIsIGFzciAjNwotICAgIHNzYXQgICAgICAgIHIxMCwgIzgsIHIxMCwgYXNyICM3Ci0KLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgotCi0gICAgcGtoYnQgICAgICAgcjYsIHI4LCByNiwgbHNsICMxNgotICAgIHBraGJ0ICAgICAgIHIxMCwgcjEyLCByMTAsIGxzbCAjMTYKLQotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcAotICAgIGxkciAgICAgICAgIGxyLCBjMHg4MDgwODA4MAotCi0gICAgbGRyICAgICAgICAgcjExLCBbc3JjXSAgICAgICAgICAgICAgICAgIDsgbG9hZCBwMgotCi0gICAgdXh0YjE2ICAgICAgcjYsIHI2Ci0gICAgdXh0YjE2ICAgICAgcjEwLCByMTAKLQotICAgIGVvciAgICAgICAgIHI5LCByOSwgbHIKLSAgICBlb3IgICAgICAgICByMTEsIHIxMSwgbHIKLQotICAgIG9yciAgICAgICAgIHIxMCwgcjYsIHIxMCwgbHNsICM4ICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpPj43KQotCi0gICAgcWFkZDggICAgICAgcjgsIHIxMSwgcjEwICAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgKyB1KQotICAgIHFzdWI4ICAgICAgIHIxMCwgcjksIHIxMCAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSkKLSAgICBlb3IgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAqb3AyID0gc14weDgwCi0gICAgc3RyICAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCwgbHNsICMyICAgIDsgc3RvcmUgKm9wMgotICAgIGFkZCAgICAgICAgIHNyYywgc3JjLCBwc3RlcAotICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgICAgICAgICA7ICpvcTIgPSBzXjB4ODAKLSAgICBzdHIgICAgICAgICByMTAsIFtzcmNdLCBwc3RlcCwgbHNsICMxICAgOyBzdG9yZSAqb3EyCi0KLXxtYmhza2lwX2ZpbHRlcnwKLSAgICBhZGQgICAgICAgICBzcmMsIHNyYywgIzQKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMwotICAgIHN1YnMgICAgICAgIGNvdW50LCBjb3VudCwgIzEKLQotICAgIGxkcm5lICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IHAzCi0gICAgbGRybmUgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAgICAgICAgICAgIDsgcDIKLSAgICBsZHJuZSAgICAgICByMTEsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBwMQotCi0gICAgYm5lICAgICAgICAgTUJIbmV4dDgKLQotICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzE2Ci0gICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12NnwKLQotCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLXx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12NnwgUFJPQwotOy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCi0gICAgc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0gICAgc3ViICAgICAgICAgc3JjLCBzcmMsICM0ICAgICAgICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQKLSAgICBsZHIgICAgICAgICBjb3VudCwgW3NwLCAjNDBdICAgICAgICAgICAgOyBjb3VudCBmb3IgOC1pbi1wYXJhbGxlbAotICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjMzZdICAgICAgICAgICAgICA7IGxvYWQgdGhyZXNoIGFkZHJlc3MKLSAgICBzdWIgICAgICAgICBzcCwgc3AsICMxNiAgICAgICAgICAgICAgICAgOyBjcmVhdGUgdGVtcCBidWZmZXIKLQotICAgIGxkciAgICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKLSAgICBsZHIgICAgICAgICByNCwgW3IyXSwgIzQgICAgICAgICAgICAgICAgOyBmbGltaXQKLSAgICBsZHIgICAgICAgICByNywgW3NyY10sIHBzdGVwCi0gICAgbGRyICAgICAgICAgcjIsIFtyM10sICM0ICAgICAgICAgICAgICAgIDsgbGltaXQKLSAgICBsZHIgICAgICAgICByOCwgW3NyY10sIHBzdGVwCi0gICAgdWFkZDggICAgICAgcjQsIHI0LCByNCAgICAgICAgICAgICAgICAgIDsgZmxpbWl0ICogMgotICAgIGxkciAgICAgICAgIHIzLCBbcjEyXSwgIzQgICAgICAgICAgICAgICA7IHRocmVzaAotICAgIGxkciAgICAgICAgIGxyLCBbc3JjXSwgcHN0ZXAKLSAgICBtb3YgICAgICAgICBjb3VudCwgY291bnQsIGxzbCAjMSAgICAgICAgOyA0LWluLXBhcmFsbGVsCi0gICAgdWFkZDggICAgICAgcjQsIHI0LCByMiAgICAgICAgICAgICAgICAgIDsgZmxpbWl0ICogMiArIGxpbWl0Ci0KLXxWbmV4dDh8Ci0KLSAgICA7IHZwOF9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCi0gICAgOyBjYWxjdWxhdGUgYnJlYWtvdXQgY29uZGl0aW9ucwotICAgIDsgdHJhbnNwb3NlIHRoZSBzb3VyY2UgZGF0YSBmb3IgNC1pbi1wYXJhbGxlbCBvcGVyYXRpb24KLSAgICBUUkFOU1BPU0VfTUFUUklYIHI2LCByNywgcjgsIGxyLCByOSwgcjEwLCByMTEsIHIxMgotCi0gICAgdXFzdWI4ICAgICAgcjcsIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgcDMgLSBwMgotICAgIHVxc3ViOCAgICAgIHI4LCByMTAsIHI5ICAgICAgICAgICAgICAgICA7IHAyIC0gcDMKLSAgICB1cXN1YjggICAgICByOSwgcjEwLCByMTEgICAgICAgICAgICAgICAgOyBwMiAtIHAxCi0gICAgdXFzdWI4ICAgICAgcjEwLCByMTEsIHIxMCAgICAgICAgICAgICAgIDsgcDEgLSBwMgotICAgIG9yciAgICAgICAgIHI3LCByNywgcjggICAgICAgICAgICAgICAgICA7IGFicyAocDMtcDIpCi0gICAgb3JyICAgICAgICAgcjEwLCByOSwgcjEwICAgICAgICAgICAgICAgIDsgYWJzIChwMi1wMSkKLSAgICB1cXN1YjggICAgICBsciwgcjcsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0LiBscjogdnA4X2ZpbHRlcl9tYXNrCi0gICAgdXFzdWI4ICAgICAgcjEwLCByMTAsIHIyICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAotCi0gICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgbGluZXMKLQotICAgIG9yciAgICAgICAgIGxyLCBsciwgcjEwCi0KLSAgICB1cXN1YjggICAgICByNiwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBwMSAtIHAwCi0gICAgdXFzdWI4ICAgICAgcjcsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgcDAgLSBwMQotICAgIGFkZCAgICAgICAgIHNyYywgc3JjLCAjNCAgICAgICAgICAgICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgdXAgYnkgNAotICAgIG9yciAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICA7IGFicyAocDEtcDApCi0gICAgc3RyICAgICAgICAgcjExLCBbc3AsICMxMl0gICAgICAgICAgICAgIDsgc2F2ZSBwMQotICAgIHVxc3ViOCAgICAgIHIxMCwgcjYsIHIyICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLSAgICB1cXN1YjggICAgICByMTEsIHI2LCByMyAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaAotICAgIG9yciAgICAgICAgIGxyLCBsciwgcjEwCi0KLSAgICA7IHRyYW5zcG9zZSB1c2VzIDggcmVncyhyNiAtIHIxMiBhbmQgbHIpLiBOZWVkIHRvIHNhdmUgcmVnIHZhbHVlIG5vdwotICAgIDsgdHJhbnNwb3NlIHRoZSBzb3VyY2UgZGF0YSBmb3IgNC1pbi1wYXJhbGxlbCBvcGVyYXRpb24KLSAgICBsZHIgICAgICAgICByNiwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBsb2FkIHNvdXJjZSBkYXRhCi0gICAgc3RyICAgICAgICAgcjExLCBbc3BdICAgICAgICAgICAgICAgICAgIDsgcHVzaCByMTEgdG8gc3RhY2sKLSAgICBsZHIgICAgICAgICByNywgW3NyY10sIHBzdGVwCi0gICAgc3RyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgc2F2ZSBjdXJyZW50IHJlZyBiZWZvcmUgbG9hZCBxMCAtIHEzIGRhdGEKLSAgICBsZHIgICAgICAgICByOCwgW3NyY10sIHBzdGVwCi0gICAgc3RyICAgICAgICAgbHIsIFtzcCwgIzhdCi0gICAgbGRyICAgICAgICAgbHIsIFtzcmNdLCBwc3RlcAotCi0gICAgVFJBTlNQT1NFX01BVFJJWCByNiwgcjcsIHI4LCBsciwgcjksIHIxMCwgcjExLCByMTIKLQotICAgIGxkciAgICAgICAgIGxyLCBbc3AsICM4XSAgICAgICAgICAgICAgICA7IGxvYWQgYmFjayAoZilsaW1pdCBhY2N1bXVsYXRvcgotCi0gICAgdXFzdWI4ICAgICAgcjYsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgcTMgLSBxMgotICAgIHVxc3ViOCAgICAgIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHEyIC0gcTMKLSAgICB1cXN1YjggICAgICByMTIsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBxMiAtIHExCi0gICAgdXFzdWI4ICAgICAgcjExLCByMTAsIHIxMSAgICAgICAgICAgICAgIDsgcTEgLSBxMgotICAgIG9yciAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICA7IGFicyAocTMtcTIpCi0gICAgb3JyICAgICAgICAgcjcsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgYWJzIChxMi1xMSkKLSAgICB1cXN1YjggICAgICByNiwgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0Ci0gICAgdXFzdWI4ICAgICAgcjcsIHI3LCByMiAgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAotICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgYmFjayBwMAotICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IGxvYWQgYmFjayBwMQotICAgIG9yciAgICAgICAgIGxyLCBsciwgcjYKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI3Ci0KLSAgICB1cXN1YjggICAgICByNiwgcjExLCByOSAgICAgICAgICAgICAgICAgOyBwMCAtIHEwCi0gICAgdXFzdWI4ICAgICAgcjcsIHI5LCByMTEgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAotICAgIHVxc3ViOCAgICAgIHI4LCByMTIsIHIxMCAgICAgICAgICAgICAgICA7IHAxIC0gcTEKLSAgICB1cXN1YjggICAgICByMTEsIHIxMCwgcjEyICAgICAgICAgICAgICAgOyBxMSAtIHAxCi0gICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkKLSAgICBsZHIgICAgICAgICByNywgYzB4N0Y3RjdGN0YKLSAgICBvcnIgICAgICAgICByOCwgcjgsIHIxMSAgICAgICAgICAgICAgICAgOyBhYnMgKHAxLXExKQotICAgIHVxYWRkOCAgICAgIHI2LCByNiwgcjYgICAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApICogMgotICAgIGFuZCAgICAgICAgIHI4LCByNywgcjgsIGxzciAjMSAgICAgICAgICA7IGFicyAocDEtcTEpIC8gMgotICAgIHVxc3ViOCAgICAgIHIxMSwgcjEwLCByOSAgICAgICAgICAgICAgICA7IHExIC0gcTAKLSAgICB1cWFkZDggICAgICByNiwgcjgsIHI2ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKSoyICsgYWJzIChwMS1xMSkvMgotICAgIHVxc3ViOCAgICAgIHIxMiwgcjksIHIxMCAgICAgICAgICAgICAgICA7IHEwIC0gcTEKLSAgICB1cXN1YjggICAgICByNiwgcjYsIHI0ICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGZsaW1pdAotCi0gICAgb3JyICAgICAgICAgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgYWJzIChxMS1xMCkKLSAgICB1cXN1YjggICAgICByOCwgcjksIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0Ci0gICAgdXFzdWI4ICAgICAgcjEwLCByOSwgcjMgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byB0aHJlc2gKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI2Ci0gICAgb3JyICAgICAgICAgbHIsIGxyLCByOAotCi0gICAgbXZuICAgICAgICAgcjExLCAjMCAgICAgICAgICAgICAgICAgICAgIDsgcjExID09IC0xCi0gICAgbW92ICAgICAgICAgcjEyLCAjMAotCi0gICAgdXN1YjggICAgICAgbHIsIHIxMiwgbHIKLSAgICBsZHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBjb21wYXJlZCByZXN1bHQKLSAgICBzZWwgICAgICAgICBsciwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBmaWx0ZXIgbWFzazogbHIKLQotICAgIGNtcCAgICAgICAgIGxyLCAjMAotICAgIGJlcSAgICAgICAgIHZza2lwX2ZpbHRlciAgICAgICAgICAgICAgICAgOyBza2lwIGZpbHRlcmluZwotCi0gICAgO3ZwOF9oZXZtYXNrKCkgZnVuY3Rpb24KLSAgICA7Y2FsY3VsYXRlIGhpZ2ggZWRnZSB2YXJpYW5jZQotCi0gICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgbGluZXMKLQotICAgIG9yciAgICAgICAgIHI5LCByOSwgcjEwCi0KLSAgICBsZHJoICAgICAgICByNywgW3NyYywgIy0yXQotICAgIGxkcmggICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLQotICAgIHVzdWI4ICAgICAgIHI5LCByMTIsIHI5Ci0gICAgc2VsICAgICAgICAgcjYsIHIxMiwgcjExICAgICAgICAgICAgICAgIDsgaGV2IG1hc2s6IHI2Ci0KLSAgICA7dnA4X2ZpbHRlcigpIGZ1bmN0aW9uCi0gICAgOyBsb2FkIHNvdXJlIGRhdGEgdG8gcjYsIHIxMSwgcjEyLCBscgotICAgIGxkcmggICAgICAgIHI5LCBbc3JjLCAjLTJdCi0gICAgbGRyaCAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAKLQotICAgIHBraGJ0ICAgICAgIHIxMiwgcjcsIHI4LCBsc2wgIzE2Ci0KLSAgICBsZHJoICAgICAgICByNywgW3NyYywgIy0yXQotICAgIGxkcmggICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLQotICAgIHBraGJ0ICAgICAgIHIxMSwgcjksIHIxMCwgbHNsICMxNgotCi0gICAgbGRyaCAgICAgICAgcjksIFtzcmMsICMtMl0KLSAgICBsZHJoICAgICAgICByMTAsIFtzcmNdLCBwc3RlcAotCi0gICAgOyBUcmFuc3Bvc2UgbmVlZHMgOCByZWdzKHI2IC0gcjEyLCBhbmQgbHIpLiBTYXZlIHI2IGFuZCBsciBmaXJzdAotICAgIHN0ciAgICAgICAgIHI2LCBbc3BdCi0gICAgc3RyICAgICAgICAgbHIsIFtzcCwgIzRdCi0KLSAgICBwa2hidCAgICAgICByNiwgcjcsIHI4LCBsc2wgIzE2Ci0gICAgcGtoYnQgICAgICAgbHIsIHI5LCByMTAsIGxzbCAjMTYKLQotICAgIDt0cmFuc3Bvc2UgcjEyLCByMTEsIHI2LCBsciB0byByNywgcjgsIHI5LCByMTAKLSAgICBUUkFOU1BPU0VfTUFUUklYIHIxMiwgcjExLCByNiwgbHIsIHI3LCByOCwgcjksIHIxMAotCi0gICAgO2xvYWQgYmFjayBoZXZfbWFzayByNiBhbmQgZmlsdGVyX21hc2sgbHIKLSAgICBsZHIgICAgICAgICByMTIsIGMweDgwODA4MDgwCi0gICAgbGRyICAgICAgICAgcjYsIFtzcF0KLSAgICBsZHIgICAgICAgICBsciwgW3NwLCAjNF0KLQotICAgIGVvciAgICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgICAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0gICAgZW9yICAgICAgICAgcjgsIHI4LCByMTIgICAgICAgICAgICAgICAgIDsgcDAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLSAgICBlb3IgICAgICAgICByOSwgcjksIHIxMiAgICAgICAgICAgICAgICAgOyBxMCBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCByMTIgICAgICAgICAgICAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0KLSAgICBzdHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBzdG9yZSBxczAgdGVtcG9yYXJpbHkKLSAgICBzdHIgICAgICAgICByOCwgW3NwLCAjNF0gICAgICAgICAgICAgICAgOyBzdG9yZSBwczAgdGVtcG9yYXJpbHkKLSAgICBzdHIgICAgICAgICByMTAsIFtzcCwgIzhdICAgICAgICAgICAgICAgOyBzdG9yZSBxczEgdGVtcG9yYXJpbHkKLSAgICBzdHIgICAgICAgICByNywgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBzdG9yZSBwczEgdGVtcG9yYXJpbHkKLQotICAgIHFzdWI4ICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEtcXMxKQotICAgIHFzdWI4ICAgICAgIHI4LCByOSwgcjggICAgICAgICAgICAgICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKLQotICAgIGFuZCAgICAgICAgIHI3LCByNywgcjYgICAgICAgICAgICAgICAgICA7ICB2cDhfZmlsdGVyIChyNykgJj0gaGV2IChyNyA6IGZpbHRlcikKLQotICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjgKLSAgICBsZHIgICAgICAgICByOSwgYzB4MDMwMzAzMDMgICAgICAgICAgICAgOyByOSA9IDMgLS1tb2RpZmllZCBmb3IgdnA4Ci0KLSAgICBxYWRkOCAgICAgICByNywgcjcsIHI4Ci0gICAgbGRyICAgICAgICAgcjEwLCBjMHgwNDA0MDQwNAotCi0gICAgcWFkZDggICAgICAgcjcsIHI3LCByOAotICAgIDttdm4gICAgICAgICByMTEsICMwICAgICAgICAgICAgICAgICAgICAgOyByMTEgPT0gLTEKLQotICAgIGFuZCAgICAgICAgIHI3LCByNywgbHIgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzawotCi0gICAgO21vZGlmeSBjb2RlIGZvciB2cDggLS0gRmlsdGVyMSA9IHZwOF9maWx0ZXIgKHI3KQotICAgIHFhZGQ4ICAgICAgIHI4ICwgcjcgLCByOSAgICAgICAgICAgICAgICA7IEZpbHRlcjIgKHI4KSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyKzMpCi0gICAgcWFkZDggICAgICAgcjcgLCByNyAsIHIxMCAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyKzQpCi0KLSAgICBtb3YgICAgICAgICByOSwgIzAKLSAgICBzaGFkZDggICAgICByOCAsIHI4ICwgcjkgICAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgc2hhZGQ4ICAgICAgcjcgLCByNyAsIHI5ICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA+Pj0gMwotICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByOQotICAgIHNoYWRkOCAgICAgIHI3ICwgcjcgLCByOQotICAgIHNoYWRkOCAgICAgIGxyICwgcjggLCByOSAgICAgICAgICAgICAgICA7IGxyOiBmaWx0ZXIyCi0gICAgc2hhZGQ4ICAgICAgcjcgLCByNyAsIHI5ICAgICAgICAgICAgICAgIDsgcjc6IGZpbHRlcgotCi0gICAgO3VzdWI4ICAgICAgbHIsIHI4LCByMTAgICAgICAgICAgICAgICAgIDsgcyA9IChzPT00KSotMQotICAgIDtzZWwgICAgICAgICAgICBsciwgcjExLCByOQotICAgIDt1c3ViOCAgICAgIHI4LCByMTAsIHI4Ci0gICAgO3NlbCAgICAgICAgICAgIHI4LCByMTEsIHI5Ci0gICAgO2FuZCAgICAgICAgICAgIHI4LCByOCwgbHIgICAgICAgICAgICAgICAgICA7IC0xIGZvciBlYWNoIGVsZW1lbnQgdGhhdCBlcXVhbHMgNCAtLSByODogcwotCi0gICAgO2NhbGN1bGF0ZSBvdXRwdXQKLSAgICA7cWFkZDggICAgICBsciwgcjgsIHI3ICAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHMgKyB2cDhfZmlsdGVyKQotCi0gICAgbGRyICAgICAgICAgcjgsIFtzcF0gICAgICAgICAgICAgICAgICAgIDsgbG9hZCBxczAKLSAgICBsZHIgICAgICAgICByOSwgW3NwLCAjNF0gICAgICAgICAgICAgICAgOyBsb2FkIHBzMAotCi0gICAgbGRyICAgICAgICAgcjEwLCBjMHgwMTAxMDEwMQotCi0gICAgcXN1YjggICAgICAgcjgsIHI4LCByNyAgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB2cDhfZmlsdGVyKQotICAgIHFhZGQ4ICAgICAgIHI5LCByOSwgbHIgICAgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMikKLSAgICA7ZW5kIG9mIG1vZGlmaWNhdGlvbiBmb3IgdnA4Ci0KLSAgICBlb3IgICAgICAgICByOCwgcjgsIHIxMgotICAgIGVvciAgICAgICAgIHI5LCByOSwgcjEyCi0KLSAgICBtb3YgICAgICAgICBsciwgIzAKLQotICAgIHNhZGQ4ICAgICAgIHI3LCByNywgcjEwCi0gICAgc2hhZGQ4ICAgICAgcjcsIHI3LCBscgotCi0gICAgbGRyICAgICAgICAgcjEwLCBbc3AsICM4XSAgICAgICAgICAgICAgIDsgbG9hZCBxczEKLSAgICBsZHIgICAgICAgICByMTEsIFtzcCwgIzEyXSAgICAgICAgICAgICAgOyBsb2FkIHBzMQotCi0gICAgYmljICAgICAgICAgcjcsIHI3LCByNiAgICAgICAgICAgICAgICAgIDsgcjc6IHZwOF9maWx0ZXIKLQotICAgIHFzdWI4ICAgICAgIHIxMCAsIHIxMCwgcjcgICAgICAgICAgICAgICA7IHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMxIC0gdnA4X2ZpbHRlcikKLSAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjcgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSArIHZwOF9maWx0ZXIpCi0gICAgZW9yICAgICAgICAgcjEwLCByMTAsIHIxMgotICAgIGVvciAgICAgICAgIHIxMSwgcjExLCByMTIKLQotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyCi0KLSAgICA7d2UgY2FuIHVzZSBUUkFOU1BPU0VfTUFUUklYIG1hY3JvIHRvIHRyYW5zcG9zZSBvdXRwdXQgLSBpbnB1dDogcTEsIHEwLCBwMCwgcDEKLSAgICA7b3V0cHV0IGlzIGIwLCBiMSwgYjIsIGIzCi0gICAgO2IwOiAwMyAwMiAwMSAwMAotICAgIDtiMTogMTMgMTIgMTEgMTAKLSAgICA7YjI6IDIzIDIyIDIxIDIwCi0gICAgO2IzOiAzMyAzMiAzMSAzMAotICAgIDsgICAgcDEgcDAgcTAgcTEKLSAgICA7ICAgKGEzIGEyIGExIGEwKQotICAgIFRSQU5TUE9TRV9NQVRSSVggcjExLCByOSwgcjgsIHIxMCwgcjYsIHI3LCByMTIsIGxyCi0KLSAgICBzdHJoICAgICAgICByNiwgW3NyYywgIy0yXSAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0Ci0gICAgbW92ICAgICAgICAgcjYsIHI2LCBsc3IgIzE2Ci0gICAgc3RyaCAgICAgICAgcjYsIFtzcmNdLCBwc3RlcAotCi0gICAgc3RyaCAgICAgICAgcjcsIFtzcmMsICMtMl0KLSAgICBtb3YgICAgICAgICByNywgcjcsIGxzciAjMTYKLSAgICBzdHJoICAgICAgICByNywgW3NyY10sIHBzdGVwCi0KLSAgICBzdHJoICAgICAgICByMTIsIFtzcmMsICMtMl0KLSAgICBtb3YgICAgICAgICByMTIsIHIxMiwgbHNyICMxNgotICAgIHN0cmggICAgICAgIHIxMiwgW3NyY10sIHBzdGVwCi0KLSAgICBzdHJoICAgICAgICBsciwgW3NyYywgIy0yXQotICAgIG1vdiAgICAgICAgIGxyLCBsciwgbHNyICMxNgotICAgIHN0cmggICAgICAgIGxyLCBbc3JjXSwgcHN0ZXAKLQotfHZza2lwX2ZpbHRlcnwKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgIzQKLSAgICBzdWJzICAgICAgICBjb3VudCwgY291bnQsICMxCi0KLSAgICBsZHJuZSAgICAgICByNiwgW3NyY10sIHBzdGVwICAgICAgICAgICAgOyBsb2FkIHNvdXJjZSBkYXRhCi0gICAgbGRybmUgICAgICAgcjcsIFtzcmNdLCBwc3RlcAotICAgIGxkcm5lICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLSAgICBsZHJuZSAgICAgICBsciwgW3NyY10sIHBzdGVwCi0KLSAgICBibmUgICAgICAgICBWbmV4dDgKLQotICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzE2Ci0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgICAgICAgOyB8dnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8Ci0KLQotCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLXx2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2fCBQUk9DCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLSAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgIzQgICAgICAgICAgICAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNAotICAgIGxkciAgICAgICAgIGNvdW50LCBbc3AsICM0MF0gICAgICAgICAgICA7IGNvdW50IGZvciA4LWluLXBhcmFsbGVsCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3AsICMzNl0gICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggYWRkcmVzcwotICAgIHN1YiAgICAgICAgIHNwLCBzcCwgIzE2ICAgICAgICAgICAgICAgICA7IGNyZWF0ZSB0ZW1wIGJ1ZmZlcgotCi0gICAgbGRyICAgICAgICAgcjYsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQotICAgIGxkciAgICAgICAgIHI0LCBbcjJdLCAjNCAgICAgICAgICAgICAgICA7IGZsaW1pdAotICAgIGxkciAgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKLSAgICBsZHIgICAgICAgICByMiwgW3IzXSwgIzQgICAgICAgICAgICAgICAgOyBsaW1pdAotICAgIGxkciAgICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLSAgICB1YWRkOCAgICAgICByNCwgcjQsIHI0ICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyCi0gICAgbGRyICAgICAgICAgcjMsIFtyMTJdLCAjNCAgICAgICAgICAgICAgIDsgdGhyZXNoCi0gICAgbGRyICAgICAgICAgbHIsIFtzcmNdLCBwc3RlcAotICAgIG1vdiAgICAgICAgIGNvdW50LCBjb3VudCwgbHNsICMxICAgICAgICA7IDQtaW4tcGFyYWxsZWwKLSAgICB1YWRkOCAgICAgICByNCwgcjQsIHIyICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQKLQotfE1CVm5leHQ4fAotICAgIDsgdnA4X2ZpbHRlcl9tYXNrKCkgZnVuY3Rpb24KLSAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zCi0gICAgOyB0cmFuc3Bvc2UgdGhlIHNvdXJjZSBkYXRhIGZvciA0LWluLXBhcmFsbGVsIG9wZXJhdGlvbgotICAgIFRSQU5TUE9TRV9NQVRSSVggcjYsIHI3LCByOCwgbHIsIHI5LCByMTAsIHIxMSwgcjEyCi0KLSAgICB1cXN1YjggICAgICByNywgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBwMyAtIHAyCi0gICAgdXFzdWI4ICAgICAgcjgsIHIxMCwgcjkgICAgICAgICAgICAgICAgIDsgcDIgLSBwMwotICAgIHVxc3ViOCAgICAgIHI5LCByMTAsIHIxMSAgICAgICAgICAgICAgICA7IHAyIC0gcDEKLSAgICB1cXN1YjggICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICAgICAgOyBwMSAtIHAyCi0gICAgb3JyICAgICAgICAgcjcsIHI3LCByOCAgICAgICAgICAgICAgICAgIDsgYWJzIChwMy1wMikKLSAgICBvcnIgICAgICAgICByMTAsIHI5LCByMTAgICAgICAgICAgICAgICAgOyBhYnMgKHAyLXAxKQotICAgIHVxc3ViOCAgICAgIGxyLCByNywgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQuIGxyOiB2cDhfZmlsdGVyX21hc2sKLSAgICB1cXN1YjggICAgICByMTAsIHIxMCwgcjIgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0Ci0KLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMiAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgNCBsaW5lcwotCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKLQotICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IHAxIC0gcDAKLSAgICB1cXN1YjggICAgICByNywgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBwMCAtIHAxCi0gICAgYWRkICAgICAgICAgc3JjLCBzcmMsICM0ICAgICAgICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciB1cCBieSA0Ci0gICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChwMS1wMCkKLSAgICBzdHIgICAgICAgICByMTEsIFtzcCwgIzEyXSAgICAgICAgICAgICAgOyBzYXZlIHAxCi0gICAgdXFzdWI4ICAgICAgcjEwLCByNiwgcjIgICAgICAgICAgICAgICAgIDsgY29tcGFyZSB0byBsaW1pdAotICAgIHVxc3ViOCAgICAgIHIxMSwgcjYsIHIzICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gdGhyZXNoCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByMTAKLQotICAgIDsgdHJhbnNwb3NlIHVzZXMgOCByZWdzKHI2IC0gcjEyIGFuZCBscikuIE5lZWQgdG8gc2F2ZSByZWcgdmFsdWUgbm93Ci0gICAgOyB0cmFuc3Bvc2UgdGhlIHNvdXJjZSBkYXRhIGZvciA0LWluLXBhcmFsbGVsIG9wZXJhdGlvbgotICAgIGxkciAgICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKLSAgICBzdHIgICAgICAgICByMTEsIFtzcF0gICAgICAgICAgICAgICAgICAgOyBwdXNoIHIxMSB0byBzdGFjawotICAgIGxkciAgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKLSAgICBzdHIgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBzYXZlIGN1cnJlbnQgcmVnIGJlZm9yZSBsb2FkIHEwIC0gcTMgZGF0YQotICAgIGxkciAgICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLSAgICBzdHIgICAgICAgICBsciwgW3NwLCAjOF0KLSAgICBsZHIgICAgICAgICBsciwgW3NyY10sIHBzdGVwCi0KLSAgICBUUkFOU1BPU0VfTUFUUklYIHI2LCByNywgcjgsIGxyLCByOSwgcjEwLCByMTEsIHIxMgotCi0gICAgbGRyICAgICAgICAgbHIsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgbG9hZCBiYWNrIChmKWxpbWl0IGFjY3VtdWxhdG9yCi0KLSAgICB1cXN1YjggICAgICByNiwgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBxMyAtIHEyCi0gICAgdXFzdWI4ICAgICAgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIDsgcTIgLSBxMwotICAgIHVxc3ViOCAgICAgIHIxMiwgcjExLCByMTAgICAgICAgICAgICAgICA7IHEyIC0gcTEKLSAgICB1cXN1YjggICAgICByMTEsIHIxMCwgcjExICAgICAgICAgICAgICAgOyBxMSAtIHEyCi0gICAgb3JyICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgIDsgYWJzIChxMy1xMikKLSAgICBvcnIgICAgICAgICByNywgcjEyLCByMTEgICAgICAgICAgICAgICAgOyBhYnMgKHEyLXExKQotICAgIHVxc3ViOCAgICAgIHI2LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLSAgICB1cXN1YjggICAgICByNywgcjcsIHIyICAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGxpbWl0Ci0gICAgbGRyICAgICAgICAgcjExLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCBiYWNrIHAwCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3AsICMxMl0gICAgICAgICAgICAgIDsgbG9hZCBiYWNrIHAxCi0gICAgb3JyICAgICAgICAgbHIsIGxyLCByNgotICAgIG9yciAgICAgICAgIGxyLCBsciwgcjcKLQotICAgIHVxc3ViOCAgICAgIHI2LCByMTEsIHI5ICAgICAgICAgICAgICAgICA7IHAwIC0gcTAKLSAgICB1cXN1YjggICAgICByNywgcjksIHIxMSAgICAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgdXFzdWI4ICAgICAgcjgsIHIxMiwgcjEwICAgICAgICAgICAgICAgIDsgcDEgLSBxMQotICAgIHVxc3ViOCAgICAgIHIxMSwgcjEwLCByMTIgICAgICAgICAgICAgICA7IHExIC0gcDEKLSAgICBvcnIgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwLXEwKQotICAgIGxkciAgICAgICAgIHI3LCBjMHg3RjdGN0Y3RgotICAgIG9yciAgICAgICAgIHI4LCByOCwgcjExICAgICAgICAgICAgICAgICA7IGFicyAocDEtcTEpCi0gICAgdXFhZGQ4ICAgICAgcjYsIHI2LCByNiAgICAgICAgICAgICAgICAgIDsgYWJzIChwMC1xMCkgKiAyCi0gICAgYW5kICAgICAgICAgcjgsIHI3LCByOCwgbHNyICMxICAgICAgICAgIDsgYWJzIChwMS1xMSkgLyAyCi0gICAgdXFzdWI4ICAgICAgcjExLCByMTAsIHI5ICAgICAgICAgICAgICAgIDsgcTEgLSBxMAotICAgIHVxYWRkOCAgICAgIHI2LCByOCwgcjYgICAgICAgICAgICAgICAgICA7IGFicyAocDAtcTApKjIgKyBhYnMgKHAxLXExKS8yCi0gICAgdXFzdWI4ICAgICAgcjEyLCByOSwgcjEwICAgICAgICAgICAgICAgIDsgcTAgLSBxMQotICAgIHVxc3ViOCAgICAgIHI2LCByNiwgcjQgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gZmxpbWl0Ci0KLSAgICBvcnIgICAgICAgICByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgOyBhYnMgKHExLXEwKQotICAgIHVxc3ViOCAgICAgIHI4LCByOSwgcjIgICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgdG8gbGltaXQKLSAgICB1cXN1YjggICAgICByMTAsIHI5LCByMyAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIHRocmVzaAotICAgIG9yciAgICAgICAgIGxyLCBsciwgcjYKLSAgICBvcnIgICAgICAgICBsciwgbHIsIHI4Ci0KLSAgICBtdm4gICAgICAgICByMTEsICMwICAgICAgICAgICAgICAgICAgICAgOyByMTEgPT0gLTEKLSAgICBtb3YgICAgICAgICByMTIsICMwCi0KLSAgICB1c3ViOCAgICAgICBsciwgcjEyLCBscgotICAgIGxkciAgICAgICAgIHI5LCBbc3BdICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdGhlIGNvbXBhcmVkIHJlc3VsdAotICAgIHNlbCAgICAgICAgIGxyLCByMTEsIHIxMiAgICAgICAgICAgICAgICA7IGZpbHRlciBtYXNrOiBscgotCi0gICAgY21wICAgICAgICAgbHIsICMwCi0gICAgYmVxICAgICAgICAgbWJ2c2tpcF9maWx0ZXIgICAgICAgICAgICAgICA7IHNraXAgZmlsdGVyaW5nCi0KLQotICAgIDt2cDhfaGV2bWFzaygpIGZ1bmN0aW9uCi0gICAgO2NhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKLQotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0KLSAgICBvcnIgICAgICAgICByOSwgcjksIHIxMAotCi0gICAgbGRyaCAgICAgICAgcjcsIFtzcmMsICMtMl0KLSAgICBsZHJoICAgICAgICByOCwgW3NyY10sIHBzdGVwCi0KLSAgICB1c3ViOCAgICAgICByOSwgcjEyLCByOQotICAgIHNlbCAgICAgICAgIHI2LCByMTIsIHIxMSAgICAgICAgICAgICAgICA7IGhldiBtYXNrOiByNgotCi0KLSAgICA7IHZwOF9tYmZpbHRlcigpIGZ1bmN0aW9uCi0gICAgOyBwMiwgcTIgYXJlIG9ubHkgbmVlZGVkIGF0IHRoZSBlbmQuIERvbid0IG5lZWQgdG8gbG9hZCB0aGVtIGluIG5vdy4KLSAgICA7IFRyYW5zcG9zZSBuZWVkcyA4IHJlZ3MocjYgLSByMTIsIGFuZCBscikuIFNhdmUgcjYgYW5kIGxyIGZpcnN0Ci0gICAgOyBsb2FkIHNvdXJlIGRhdGEgdG8gcjYsIHIxMSwgcjEyLCBscgotICAgIGxkcmggICAgICAgIHI5LCBbc3JjLCAjLTJdCi0gICAgbGRyaCAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAKLQotICAgIHBraGJ0ICAgICAgIHIxMiwgcjcsIHI4LCBsc2wgIzE2Ci0KLSAgICBsZHJoICAgICAgICByNywgW3NyYywgIy0yXQotICAgIGxkcmggICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLQotICAgIHBraGJ0ICAgICAgIHIxMSwgcjksIHIxMCwgbHNsICMxNgotCi0gICAgbGRyaCAgICAgICAgcjksIFtzcmMsICMtMl0KLSAgICBsZHJoICAgICAgICByMTAsIFtzcmNdLCBwc3RlcAotCi0gICAgc3RyICAgICAgICAgcjYsIFtzcF0gICAgICAgICAgICAgICAgICAgIDsgc2F2ZSByNgotICAgIHN0ciAgICAgICAgIGxyLCBbc3AsICM0XSAgICAgICAgICAgICAgICA7IHNhdmUgbHIKLQotICAgIHBraGJ0ICAgICAgIHI2LCByNywgcjgsIGxzbCAjMTYKLSAgICBwa2hidCAgICAgICBsciwgcjksIHIxMCwgbHNsICMxNgotCi0gICAgO3RyYW5zcG9zZSByMTIsIHIxMSwgcjYsIGxyIHRvIHAxLCBwMCwgcTAsIHExCi0gICAgVFJBTlNQT1NFX01BVFJJWCByMTIsIHIxMSwgcjYsIGxyLCByNywgcjgsIHI5LCByMTAKLQotICAgIDtsb2FkIGJhY2sgaGV2X21hc2sgcjYgYW5kIGZpbHRlcl9tYXNrIGxyCi0gICAgbGRyICAgICAgICAgcjEyLCBjMHg4MDgwODA4MAotICAgIGxkciAgICAgICAgIHI2LCBbc3BdCi0gICAgbGRyICAgICAgICAgbHIsIFtzcCwgIzRdCi0KLSAgICBlb3IgICAgICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICAgICAgOyBwczEKLSAgICBlb3IgICAgICAgICByOCwgcjgsIHIxMiAgICAgICAgICAgICAgICAgOyBwczAKLSAgICBlb3IgICAgICAgICByOSwgcjksIHIxMiAgICAgICAgICAgICAgICAgOyBxczAKLSAgICBlb3IgICAgICAgICByMTAsIHIxMCwgcjEyICAgICAgICAgICAgICAgOyBxczEKLQotICAgIHFzdWI4ICAgICAgIHIxMiwgcjksIHI4ICAgICAgICAgICAgICAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKLSAgICBzdHIgICAgICAgICByNywgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBzdG9yZSBwczEgdGVtcG9yYXJpbHkKLSAgICBxc3ViOCAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxLXFzMSkKLSAgICBzdHIgICAgICAgICByMTAsIFtzcCwgIzhdICAgICAgICAgICAgICAgOyBzdG9yZSBxczEgdGVtcG9yYXJpbHkKLSAgICBxYWRkOCAgICAgICByNywgcjcsIHIxMgotICAgIHN0ciAgICAgICAgIHI5LCBbc3BdICAgICAgICAgICAgICAgICAgICA7IHN0b3JlIHFzMCB0ZW1wb3JhcmlseQotICAgIHFhZGQ4ICAgICAgIHI3LCByNywgcjEyCi0gICAgc3RyICAgICAgICAgcjgsIFtzcCwgIzRdICAgICAgICAgICAgICAgIDsgc3RvcmUgcHMwIHRlbXBvcmFyaWx5Ci0gICAgcWFkZDggICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlcjogcjcKLQotICAgIGxkciAgICAgICAgIHIxMCwgYzB4MDMwMzAzMDMgICAgICAgICAgICA7IHIxMCA9IDMgLS1tb2RpZmllZCBmb3IgdnA4Ci0gICAgbGRyICAgICAgICAgcjksIGMweDA0MDQwNDA0Ci0gICAgO212biAgICAgICAgIHIxMSwgIzAgICAgICAgICAgICAgICAgICAgICA7IHIxMSA9PSAtMQotCi0gICAgYW5kICAgICAgICAgcjcsIHI3LCBsciAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrIChsciBpcyBmcmVlKQotCi0gICAgbW92ICAgICAgICAgcjEyLCByNyAgICAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMjogcjEyCi0gICAgYW5kICAgICAgICAgcjEyLCByMTIsIHI2ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAmPSBoZXYKLQotICAgIDttb2RpZnkgY29kZSBmb3IgdnA4Ci0gICAgO3NhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMKLSAgICBxYWRkOCAgICAgICByOCAsIHIxMiAsIHI5ICAgICAgICAgICAgICAgOyBGaWx0ZXIxIChyOCkgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMis0KQotICAgIHFhZGQ4ICAgICAgIHIxMiAsIHIxMiAsIHIxMCAgICAgICAgICAgICA7IEZpbHRlcjIgKHIxMikgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiszKQotCi0gICAgbW92ICAgICAgICAgcjEwLCAjMAotICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKLSAgICBzaGFkZDggICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIHIxMAotICAgIHNoYWRkOCAgICAgIHIxMiAsIHIxMiAsIHIxMAotICAgIHNoYWRkOCAgICAgIHI4ICwgcjggLCByMTAgICAgICAgICAgICAgICA7IHI4OiBGaWx0ZXIxCi0gICAgc2hhZGQ4ICAgICAgcjEyICwgcjEyICwgcjEwICAgICAgICAgICAgIDsgcjEyOiBGaWx0ZXIyCi0KLSAgICBsZHIgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAotICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgcHMwCi0KLSAgICBxc3ViOCAgICAgICByOSAsIHI5LCByOCAgICAgICAgICAgICAgICAgOyBxczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSkKLSAgICBxYWRkOCAgICAgICByMTEsIHIxMSwgcjEyICAgICAgICAgICAgICAgOyBwczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMikKLQotICAgIDtzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszCi0gICAgO2FuZCAgICAgICAgICAgIHI4LCByMTIsIHIxMCAgICAgICAgICAgICAgICA7IHMgPSBGaWx0ZXIyICYgNyAoczogcjgpCi0gICAgO3FhZGQ4ICAgICAgcjEyICwgcjEyICwgcjkgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyKzQpCi0gICAgO21vdiAgICAgICAgICAgIHIxMCwgIzAKLSAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgO3VzdWI4ICAgICAgbHIsIHI4LCByOSAgICAgICAgICAgICAgICAgIDsgcyA9IChzPT00KSotMQotICAgIDtzZWwgICAgICAgICAgICBsciwgcjExLCByMTAKLSAgICA7c2hhZGQ4ICAgICByMTIgLCByMTIgLCByMTAKLSAgICA7dXN1YjggICAgICByOCwgcjksIHI4Ci0gICAgO3NlbCAgICAgICAgICAgIHI4LCByMTEsIHIxMAotICAgIDtsZHIgICAgICAgICAgICByOSwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHFzMAotICAgIDtsZHIgICAgICAgICAgICByMTEsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHBzMAotICAgIDtzaGFkZDggICAgIHIxMiAsIHIxMiAsIHIxMAotICAgIDthbmQgICAgICAgICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyAtMSBmb3IgZWFjaCBlbGVtZW50IHRoYXQgZXF1YWxzIDQKLSAgICA7cWFkZDggICAgICByMTAsIHI4LCByMTIgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHMgKyBGaWx0ZXIyKQotICAgIDtxc3ViOCAgICAgIHI5ICwgcjksIHIxMiAgICAgICAgICAgICAgICA7IHFzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSBGaWx0ZXIyKQotICAgIDtxYWRkOCAgICAgIHIxMSwgcjExLCByMTAgICAgICAgICAgICAgICA7IHBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KQotCi0gICAgO2VuZCBvZiBtb2RpZmljYXRpb24gZm9yIHZwOAotCi0gICAgYmljICAgICAgICAgcjEyLCByNywgcjYgICAgICAgICAgICAgICAgIDt2cDhfZmlsdGVyICY9IH5oZXYgICAgKCByNiBpcyBmcmVlKQotICAgIDttb3YgICAgICAgICAgICByMTIsIHI3Ci0KLSAgICA7cm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIG1vdiAgICAgICAgIGxyLCAjMHgxYiAgICAgICAgICAgICAgICAgICA7IDI3Ci0gICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKLQotICAgIHN4dGIxNiAgICAgIHI2LCByMTIKLSAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4Ci0gICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKLSAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNwotICAgIHNtbGFiYiAgICAgIHI3LCByMTAsIGxyLCByNwotICAgIHNtdWx0YiAgICAgIHIxMCwgcjEwLCBscgotICAgIHNzYXQgICAgICAgIHI4LCAjOCwgcjgsIGFzciAjNwotICAgIHNzYXQgICAgICAgIHI2LCAjOCwgcjYsIGFzciAjNwotICAgIGFkZCAgICAgICAgIHIxMCwgcjEwLCAjNjMKLSAgICBzc2F0ICAgICAgICByNywgIzgsIHI3LCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNwotCi0gICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCi0KLSAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2Ci0gICAgcGtoYnQgICAgICAgcjEwLCByNywgcjEwLCBsc2wgIzE2Ci0gICAgdXh0YjE2ICAgICAgcjYsIHI2Ci0gICAgdXh0YjE2ICAgICAgcjEwLCByMTAKLQotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0KLSAgICBvcnIgICAgICAgICByMTAsIHI2LCByMTAsIGxzbCAjOCAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAyNyk+PjcpCi0KLSAgICBxc3ViOCAgICAgICByOCwgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpCi0gICAgcWFkZDggICAgICAgcjEwLCByMTEsIHIxMCAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KQotICAgIGVvciAgICAgICAgIHI4LCByOCwgbHIgICAgICAgICAgICAgICAgICA7ICpvcTAgPSBzXjB4ODAKLSAgICBlb3IgICAgICAgICByMTAsIHIxMCwgbHIgICAgICAgICAgICAgICAgOyAqb3AwID0gc14weDgwCi0KLSAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtMV0gICAgICAgICAgICAgOyBzdG9yZSBvcDAgcmVzdWx0Ci0gICAgc3RyYiAgICAgICAgcjgsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgIDsgc3RvcmUgb3EwIHJlc3VsdAotICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKLSAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAotICAgIHN0cmIgICAgICAgIHIxMCwgW3NyYywgIy0xXQotICAgIHN0cmIgICAgICAgIHI4LCBbc3JjXSwgcHN0ZXAKLSAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNyICM4Ci0gICAgbW92ICAgICAgICAgcjgsIHI4LCBsc3IgIzgKLSAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtMV0KLSAgICBzdHJiICAgICAgICByOCwgW3NyY10sIHBzdGVwCi0gICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzciAjOAotICAgIG1vdiAgICAgICAgIHI4LCByOCwgbHNyICM4Ci0gICAgc3RyYiAgICAgICAgcjEwLCBbc3JjLCAjLTFdCi0gICAgc3RyYiAgICAgICAgcjgsIFtzcmNdLCBwc3RlcAotCi0gICAgO3JvdWdobHkgMi83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKLSAgICBtb3YgICAgICAgICBsciwgIzB4MTIgICAgICAgICAgICAgICAgICAgOyAxOAotICAgIG1vdiAgICAgICAgIHI3LCAjMHgzZiAgICAgICAgICAgICAgICAgICA7IDYzCi0KLSAgICBzeHRiMTYgICAgICByNiwgcjEyCi0gICAgc3h0YjE2ICAgICAgcjEwLCByMTIsIHJvciAjOAotICAgIHNtbGFiYiAgICAgIHI4LCByNiwgbHIsIHI3Ci0gICAgc21sYXRiICAgICAgcjYsIHI2LCBsciwgcjcKLSAgICBzbWxhYmIgICAgICByOSwgcjEwLCBsciwgcjcKLSAgICBzbWxhdGIgICAgICByMTAsIHIxMCwgbHIsIHI3Ci0gICAgc3NhdCAgICAgICAgcjgsICM4LCByOCwgYXNyICM3Ci0gICAgc3NhdCAgICAgICAgcjYsICM4LCByNiwgYXNyICM3Ci0gICAgc3NhdCAgICAgICAgcjksICM4LCByOSwgYXNyICM3Ci0gICAgc3NhdCAgICAgICAgcjEwLCAjOCwgcjEwLCBhc3IgIzcKLQotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCBwc3RlcCwgbHNsICMyICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0KLSAgICBwa2hidCAgICAgICByNiwgcjgsIHI2LCBsc2wgIzE2Ci0gICAgcGtoYnQgICAgICAgcjEwLCByOSwgcjEwLCBsc2wgIzE2Ci0KLSAgICBsZHIgICAgICAgICByOSwgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBsb2FkIHFzMQotICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjMTJdICAgICAgICAgICAgICA7IGxvYWQgcHMxCi0gICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCi0KLSAgICB1eHRiMTYgICAgICByNiwgcjYKLSAgICB1eHRiMTYgICAgICByMTAsIHIxMAotCi0gICAgYWRkICAgICAgICAgc3JjLCBzcmMsICMyCi0KLSAgICBvcnIgICAgICAgICByMTAsIHI2LCByMTAsIGxzbCAjOCAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAxOCk+PjcpCi0KLSAgICBxc3ViOCAgICAgICByOCwgcjksIHIxMCAgICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUpCi0gICAgcWFkZDggICAgICAgcjEwLCByMTEsIHIxMCAgICAgICAgICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB1KQotICAgIGVvciAgICAgICAgIHI4LCByOCwgbHIgICAgICAgICAgICAgICAgICA7ICpvcTEgPSBzXjB4ODAKLSAgICBlb3IgICAgICAgICByMTAsIHIxMCwgbHIgICAgICAgICAgICAgICAgOyAqb3AxID0gc14weDgwCi0KLSAgICBsZHJiICAgICAgICByMTEsIFtzcmMsICMtNV0gICAgICAgICAgICAgOyBsb2FkIHAyIGZvciAxLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIHN0cmIgICAgICAgIHIxMCwgW3NyYywgIy00XSAgICAgICAgICAgICA7IHN0b3JlIG9wMQotICAgIHN0cmIgICAgICAgIHI4LCBbc3JjLCAjLTFdICAgICAgICAgICAgICA7IHN0b3JlIG9xMQotICAgIGxkcmIgICAgICAgIHI5LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgcTIgZm9yIDEvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5Ci0KLSAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNyICM4Ci0gICAgbW92ICAgICAgICAgcjgsIHI4LCBsc3IgIzgKLQotICAgIGxkcmIgICAgICAgIHI2LCBbc3JjLCAjLTVdCi0gICAgc3RyYiAgICAgICAgcjEwLCBbc3JjLCAjLTRdCi0gICAgc3RyYiAgICAgICAgcjgsIFtzcmMsICMtMV0KLSAgICBsZHJiICAgICAgICByNywgW3NyY10sIHBzdGVwCi0KLSAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNyICM4Ci0gICAgbW92ICAgICAgICAgcjgsIHI4LCBsc3IgIzgKLSAgICBvcnIgICAgICAgICByMTEsIHIxMSwgcjYsIGxzbCAjOAotICAgIG9yciAgICAgICAgIHI5LCByOSwgcjcsIGxzbCAjOAotCi0gICAgbGRyYiAgICAgICAgcjYsIFtzcmMsICMtNV0KLSAgICBzdHJiICAgICAgICByMTAsIFtzcmMsICMtNF0KLSAgICBzdHJiICAgICAgICByOCwgW3NyYywgIy0xXQotICAgIGxkcmIgICAgICAgIHI3LCBbc3JjXSwgcHN0ZXAKLQotICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKLSAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAotICAgIG9yciAgICAgICAgIHIxMSwgcjExLCByNiwgbHNsICMxNgotICAgIG9yciAgICAgICAgIHI5LCByOSwgcjcsIGxzbCAjMTYKLQotICAgIGxkcmIgICAgICAgIHI2LCBbc3JjLCAjLTVdCi0gICAgc3RyYiAgICAgICAgcjEwLCBbc3JjLCAjLTRdCi0gICAgc3RyYiAgICAgICAgcjgsIFtzcmMsICMtMV0KLSAgICBsZHJiICAgICAgICByNywgW3NyY10sIHBzdGVwCi0gICAgb3JyICAgICAgICAgcjExLCByMTEsIHI2LCBsc2wgIzI0Ci0gICAgb3JyICAgICAgICAgcjksIHI5LCByNywgbHNsICMyNAotCi0gICAgO3JvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKLSAgICBlb3IgICAgICAgICByOSwgcjksIGxyCi0gICAgZW9yICAgICAgICAgcjExLCByMTEsIGxyCi0KLSAgICBtb3YgICAgICAgICBsciwgIzB4OSAgICAgICAgICAgICAgICAgICAgOyA5Ci0gICAgbW92ICAgICAgICAgcjcsICMweDNmICAgICAgICAgICAgICAgICAgIDsgNjMKLQotICAgIHN4dGIxNiAgICAgIHI2LCByMTIKLSAgICBzeHRiMTYgICAgICByMTAsIHIxMiwgcm9yICM4Ci0gICAgc21sYWJiICAgICAgcjgsIHI2LCBsciwgcjcKLSAgICBzbWxhdGIgICAgICByNiwgcjYsIGxyLCByNwotICAgIHNtbGFiYiAgICAgIHIxMiwgcjEwLCBsciwgcjcKLSAgICBzbWxhdGIgICAgICByMTAsIHIxMCwgbHIsIHI3Ci0gICAgc3NhdCAgICAgICAgcjgsICM4LCByOCwgYXNyICM3Ci0gICAgc3NhdCAgICAgICAgcjYsICM4LCByNiwgYXNyICM3Ci0gICAgc3NhdCAgICAgICAgcjEyLCAjOCwgcjEyLCBhc3IgIzcKLSAgICBzc2F0ICAgICAgICByMTAsICM4LCByMTAsIGFzciAjNwotCi0gICAgc3ViICAgICAgICAgc3JjLCBzcmMsIHBzdGVwLCBsc2wgIzIKLQotICAgIHBraGJ0ICAgICAgIHI2LCByOCwgcjYsIGxzbCAjMTYKLSAgICBwa2hidCAgICAgICByMTAsIHIxMiwgcjEwLCBsc2wgIzE2Ci0KLSAgICB1eHRiMTYgICAgICByNiwgcjYKLSAgICB1eHRiMTYgICAgICByMTAsIHIxMAotCi0gICAgbGRyICAgICAgICAgbHIsIGMweDgwODA4MDgwCi0KLSAgICBvcnIgICAgICAgICByMTAsIHI2LCByMTAsIGxzbCAjOCAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiA5KT4+NykKLQotICAgIHFhZGQ4ICAgICAgIHI4LCByMTEsIHIxMCAgICAgICAgICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMyICsgdSkKLSAgICBxc3ViOCAgICAgICByMTAsIHI5LCByMTAgICAgICAgICAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMiAtIHUpCi0gICAgZW9yICAgICAgICAgcjgsIHI4LCBsciAgICAgICAgICAgICAgICAgIDsgKm9wMiA9IHNeMHg4MAotICAgIGVvciAgICAgICAgIHIxMCwgcjEwLCBsciAgICAgICAgICAgICAgICA7ICpvcTIgPSBzXjB4ODAKLQotICAgIHN0cmIgICAgICAgIHI4LCBbc3JjLCAjLTVdICAgICAgICAgICAgICA7IHN0b3JlICpvcDIKLSAgICBzdHJiICAgICAgICByMTAsIFtzcmNdLCBwc3RlcCAgICAgICAgICAgOyBzdG9yZSAqb3EyCi0gICAgbW92ICAgICAgICAgcjgsIHI4LCBsc3IgIzgKLSAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNyICM4Ci0gICAgc3RyYiAgICAgICAgcjgsIFtzcmMsICMtNV0KLSAgICBzdHJiICAgICAgICByMTAsIFtzcmNdLCBwc3RlcAotICAgIG1vdiAgICAgICAgIHI4LCByOCwgbHNyICM4Ci0gICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzciAjOAotICAgIHN0cmIgICAgICAgIHI4LCBbc3JjLCAjLTVdCi0gICAgc3RyYiAgICAgICAgcjEwLCBbc3JjXSwgcHN0ZXAKLSAgICBtb3YgICAgICAgICByOCwgcjgsIGxzciAjOAotICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc3IgIzgKLSAgICBzdHJiICAgICAgICByOCwgW3NyYywgIy01XQotICAgIHN0cmIgICAgICAgIHIxMCwgW3NyY10sIHBzdGVwCi0KLSAgICA7YWRqdXN0IHNyYyBwb2ludGVyIGZvciBuZXh0IGxvb3AKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgIzIKLQotfG1idnNraXBfZmlsdGVyfAotICAgIHN1YiAgICAgICAgIHNyYywgc3JjLCAjNAotICAgIHN1YnMgICAgICAgIGNvdW50LCBjb3VudCwgIzEKLQotICAgIGxkcm5lICAgICAgIHI2LCBbc3JjXSwgcHN0ZXAgICAgICAgICAgICA7IGxvYWQgc291cmNlIGRhdGEKLSAgICBsZHJuZSAgICAgICByNywgW3NyY10sIHBzdGVwCi0gICAgbGRybmUgICAgICAgcjgsIFtzcmNdLCBwc3RlcAotICAgIGxkcm5lICAgICAgIGxyLCBbc3JjXSwgcHN0ZXAKLQotICAgIGJuZSAgICAgICAgIE1CVm5leHQ4Ci0KLSAgICBhZGQgICAgICAgICBzcCwgc3AsICMxNgotCi0gICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8Ci0KLTsgQ29uc3RhbnQgUG9vbAotYzB4ODA4MDgwODAgRENEICAgICAweDgwODA4MDgwCi1jMHgwMzAzMDMwMyBEQ0QgICAgIDB4MDMwMzAzMDMKLWMweDA0MDQwNDA0IERDRCAgICAgMHgwNDA0MDQwNAotYzB4MDEwMTAxMDEgRENEICAgICAweDAxMDEwMTAxCi1jMHg3RjdGN0Y3RiBEQ0QgICAgIDB4N0Y3RjdGN0YKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vYXJtdjYvcmVjb25fdjYuYXNtIGIvdnA4L2NvbW1vbi9hcm0vYXJtdjYvcmVjb25fdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM3YmNmLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybXY2L3JlY29uX3Y2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3JlY29uX2JfYXJtdjZ8Ci0gICAgRVhQT1JUICB8dnA4X3JlY29uMmJfYXJtdjZ8Ci0gICAgRVhQT1JUICB8dnA4X3JlY29uNGJfYXJtdjZ8Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi1wcmQgICAgIFJOICByMAotZGlmICAgICBSTiAgcjEKLWRzdCAgICAgUk4gIHIyCi1zdHJpZGUgICAgICBSTiAgcjMKLQotO3ZvaWQgcmVjb25fYih1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgc2hvcnQgKmRpZmZfcHRyLCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLCBpbnQgc3RyaWRlKQotOyBSMCBjaGFyKiBwcmVkX3B0cgotOyBSMSBzaG9ydCAqIGRpZl9wdHIKLTsgUjIgY2hhciAqIGRzdF9wdHIKLTsgUjMgaW50IHN0cmlkZQotCi07IERlc2NyaXB0aW9uOgotOyBMb29wIHRocm91Z2ggdGhlIGJsb2NrIGFkZGluZyB0aGUgUHJlZCBhbmQgRGlmZiB0b2dldGhlci4gIENsYW1wIGFuZCB0aGVuCi07IHN0b3JlIGJhY2sgaW50byB0aGUgRHN0LgotCi07IFJlc3RyaWN0aW9ucyA6Ci07IGFsbCBidWZmZXJzIGFyZSBleHBlY3RlZCB0byBiZSA0IGJ5dGUgYWxpZ25lZCBjb21pbmcgaW4gYW5kCi07IGdvaW5nIG91dC4KLTstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KLTsKLTsKLTsKLTstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KLXx2cDhfcmVjb25fYl9hcm12NnwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQgLSByOSwgbHJ9Ci0KLSAgICA7MCwgMSwgMiwgMwotICAgIGxkciAgICAgcjQsIFtwcmRdLCAjMTYgICAgICAgICAgOyAzIHwgMiB8IDEgfCAwCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzBdICAgICAgICAgICA7ICAgICAxIHwgICAgIDAKLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjNF0gICAgICAgICAgIDsgICAgIDMgfCAgICAgMgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2ICAgICA7ICAgICAyIHwgICAgIDAKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgICAgIDsgICAgIDMgfCAgICAgMQotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0ICAgICAgICAgICAgICA7ICAgICAyIHwgICAgIDAgICsgIDMgfCAyIHwgMiB8IDAKLSAgICB1eHRhYjE2IHI5LCByOSwgcjQsIHJvciAjOCAgICAgIDsgICAgIDMgfCAgICAgMSAgKyAgMCB8IDMgfCAyIHwgMQotCi0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgYWRkICAgICBkaWYsIGRpZiwgIzMyCi0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3RdLCBzdHJpZGUKLQotICAgIDswLCAxLCAyLCAzCi0gICAgbGRyICAgICByNCwgW3ByZF0sICMxNiAgICAgICAgICA7IDMgfCAyIHwgMSB8IDAKLTs7ICBsZHIgICAgIHI2LCBbZGlmLCAjOF0gICAgICAgICAgIDsgICAgIDEgfCAgICAgMAotOzsgIGxkciAgICAgcjcsIFtkaWYsICMxMl0gICAgICAgICAgOyAgICAgMyB8ICAgICAyCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzBdICAgICAgICAgICA7ICAgICAxIHwgICAgIDAKLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjNF0gICAgICAgICAgIDsgICAgIDMgfCAgICAgMgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2ICAgICA7ICAgICAyIHwgICAgIDAKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgICAgIDsgICAgIDMgfCAgICAgMQotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0ICAgICAgICAgICAgICA7ICAgICAyIHwgICAgIDAgICsgIDMgfCAyIHwgMiB8IDAKLSAgICB1eHRhYjE2IHI5LCByOSwgcjQsIHJvciAjOCAgICAgIDsgICAgIDMgfCAgICAgMSAgKyAgMCB8IDMgfCAyIHwgMQotCi0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgYWRkICAgICBkaWYsIGRpZiwgIzMyCi0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3RdLCBzdHJpZGUKLQotICAgIDswLCAxLCAyLCAzCi0gICAgbGRyICAgICByNCwgW3ByZF0sICMxNiAgICAgICAgICA7IDMgfCAyIHwgMSB8IDAKLTs7ICBsZHIgICAgIHI2LCBbZGlmLCAjMTZdICAgICAgICAgIDsgICAgIDEgfCAgICAgMAotOzsgIGxkciAgICAgcjcsIFtkaWYsICMyMF0gICAgICAgICAgOyAgICAgMyB8ICAgICAyCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzBdICAgICAgICAgICA7ICAgICAxIHwgICAgIDAKLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjNF0gICAgICAgICAgIDsgICAgIDMgfCAgICAgMgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2ICAgICA7ICAgICAyIHwgICAgIDAKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgICAgIDsgICAgIDMgfCAgICAgMQotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0ICAgICAgICAgICAgICA7ICAgICAyIHwgICAgIDAgICsgIDMgfCAyIHwgMiB8IDAKLSAgICB1eHRhYjE2IHI5LCByOSwgcjQsIHJvciAjOCAgICAgIDsgICAgIDMgfCAgICAgMSAgKyAgMCB8IDMgfCAyIHwgMQotCi0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgYWRkICAgICBkaWYsIGRpZiwgIzMyCi0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3RdLCBzdHJpZGUKLQotICAgIDswLCAxLCAyLCAzCi0gICAgbGRyICAgICByNCwgW3ByZF0sICMxNiAgICAgICAgICA7IDMgfCAyIHwgMSB8IDAKLTs7ICBsZHIgICAgIHI2LCBbZGlmLCAjMjRdICAgICAgICAgIDsgICAgIDEgfCAgICAgMAotOzsgIGxkciAgICAgcjcsIFtkaWYsICMyOF0gICAgICAgICAgOyAgICAgMyB8ICAgICAyCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzBdICAgICAgICAgICA7ICAgICAxIHwgICAgIDAKLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjNF0gICAgICAgICAgIDsgICAgIDMgfCAgICAgMgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2ICAgICA7ICAgICAyIHwgICAgIDAKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgICAgIDsgICAgIDMgfCAgICAgMQotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0ICAgICAgICAgICAgICA7ICAgICAyIHwgICAgIDAgICsgIDMgfCAyIHwgMiB8IDAKLSAgICB1eHRhYjE2IHI5LCByOSwgcjQsIHJvciAjOCAgICAgIDsgICAgIDMgfCAgICAgMSAgKyAgMCB8IDMgfCAyIHwgMQotCi0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3RdLCBzdHJpZGUKLQotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByOSwgcGN9Ci0KLSAgICBFTkRQICAgIDsgfHJlY29uX2J8Ci0KLTstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KLTsKLTsKLTsKLTstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KLTsgUjAgY2hhciAgKnByZWRfcHRyCi07IFIxIHNob3J0ICpkaWZfcHRyCi07IFIyIGNoYXIgICpkc3RfcHRyCi07IFIzIGludCBzdHJpZGUKLXx2cDhfcmVjb240Yl9hcm12NnwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQgLSByOSwgbHJ9Ci0KLSAgICBtb3YgICAgIGxyLCAjNAotCi1yZWNvbjRiX2xvb3AKLSAgICA7MCwgMSwgMiwgMwotICAgIGxkciAgICAgcjQsIFtwcmRdLCAjNCAgICAgICAgICAgOyAzIHwgMiB8IDEgfCAwCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzBdICAgICAgICAgICA7ICAgICAxIHwgICAgIDAKLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjNF0gICAgICAgICAgIDsgICAgIDMgfCAgICAgMgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2ICAgICA7ICAgICAyIHwgICAgIDAKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgICAgIDsgICAgIDMgfCAgICAgMQotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0ICAgICAgICAgICAgICA7ICAgICAyIHwgICAgIDAgICsgIDMgfCAyIHwgMiB8IDAKLSAgICB1eHRhYjE2IHI5LCByOSwgcjQsIHJvciAjOCAgICAgIDsgICAgIDMgfCAgICAgMSAgKyAgMCB8IDMgfCAyIHwgMQotCi0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3RdCi0KLSAgICA7NCwgNSwgNiwgNwotICAgIGxkciAgICAgcjQsIFtwcmRdLCAjNAotOzsgIGxkciAgICAgcjYsIFtkaWYsICMzMl0KLTs7ICBsZHIgICAgIHI3LCBbZGlmLCAjMzZdCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzhdCi0gICAgbGRyICAgICByNywgW2RpZiwgIzEyXQotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2Ci0gICAgcGtodGIgICByOSwgcjcsIHI2LCBhc3IgIzE2Ci0KLSAgICB1eHRhYjE2IHI4LCByOCwgcjQKLSAgICB1eHRhYjE2IHI5LCByOSwgcjQsIHJvciAjOAotICAgIHVzYXQxNiAgcjgsICM4LCByOAotICAgIHVzYXQxNiAgcjksICM4LCByOQotICAgIG9yciAgICAgcjgsIHI4LCByOSwgbHNsICM4Ci0KLSAgICBzdHIgICAgIHI4LCBbZHN0LCAjNF0KLQotICAgIDs4LCA5LCAxMCwgMTEKLSAgICBsZHIgICAgIHI0LCBbcHJkXSwgIzQKLTs7ICBsZHIgICAgIHI2LCBbZGlmLCAjNjRdCi07OyAgbGRyICAgICByNywgW2RpZiwgIzY4XQotICAgIGxkciAgICAgcjYsIFtkaWYsICMxNl0KLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjMjBdCi0KLSAgICBwa2hidCAgIHI4LCByNiwgcjcsIGxzbCAjMTYKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYKLQotICAgIHV4dGFiMTYgcjgsIHI4LCByNAotICAgIHV4dGFiMTYgcjksIHI5LCByNCwgcm9yICM4Ci0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3QsICM4XQotCi0gICAgOzEyLCAxMywgMTQsIDE1Ci0gICAgbGRyICAgICByNCwgW3ByZF0sICM0Ci07OyAgbGRyICAgICByNiwgW2RpZiwgIzk2XQotOzsgIGxkciAgICAgcjcsIFtkaWYsICMxMDBdCi0gICAgbGRyICAgICByNiwgW2RpZiwgIzI0XQotICAgIGxkciAgICAgcjcsIFtkaWYsICMyOF0KLQotICAgIHBraGJ0ICAgcjgsIHI2LCByNywgbHNsICMxNgotICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNgotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0Ci0gICAgdXh0YWIxNiByOSwgcjksIHI0LCByb3IgIzgKLSAgICB1c2F0MTYgIHI4LCAjOCwgcjgKLSAgICB1c2F0MTYgIHI5LCAjOCwgcjkKLSAgICBvcnIgICAgIHI4LCByOCwgcjksIGxzbCAjOAotCi0gICAgc3RyICAgICByOCwgW2RzdCwgIzEyXQotCi0gICAgYWRkICAgICBkc3QsIGRzdCwgc3RyaWRlCi07OyAgYWRkICAgICBkaWYsIGRpZiwgIzgKLSAgICBhZGQgICAgIGRpZiwgZGlmLCAjMzIKLQotICAgIHN1YnMgICAgbHIsIGxyLCAjMQotICAgIGJuZSAgICAgcmVjb240Yl9sb29wCi0KLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjksIHBjfQotCi0gICAgRU5EUCAgICA7IHxSZWNvbjRCfAotCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ci07Ci07Ci07Ci07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ci07IFIwIGNoYXIgICpwcmVkX3B0cgotOyBSMSBzaG9ydCAqZGlmX3B0cgotOyBSMiBjaGFyICAqZHN0X3B0cgotOyBSMyBpbnQgc3RyaWRlCi18dnA4X3JlY29uMmJfYXJtdjZ8IFBST0MKLSAgICBzdG1kYiAgIHNwISwge3I0IC0gcjksIGxyfQotCi0gICAgbW92ICAgICBsciwgIzQKLQotcmVjb24yYl9sb29wCi0gICAgOzAsIDEsIDIsIDMKLSAgICBsZHIgICAgIHI0LCBbcHJkXSwgIzQKLSAgICBsZHIgICAgIHI2LCBbZGlmLCAjMF0KLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjNF0KLQotICAgIHBraGJ0ICAgcjgsIHI2LCByNywgbHNsICMxNgotICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNgotCi0gICAgdXh0YWIxNiByOCwgcjgsIHI0Ci0gICAgdXh0YWIxNiByOSwgcjksIHI0LCByb3IgIzgKLSAgICB1c2F0MTYgIHI4LCAjOCwgcjgKLSAgICB1c2F0MTYgIHI5LCAjOCwgcjkKLSAgICBvcnIgICAgIHI4LCByOCwgcjksIGxzbCAjOAotCi0gICAgc3RyICAgICByOCwgW2RzdF0KLQotICAgIDs0LCA1LCA2LCA3Ci0gICAgbGRyICAgICByNCwgW3ByZF0sICM0Ci07OyAgbGRyICAgICByNiwgW2RpZiwgIzMyXQotOzsgIGxkciAgICAgcjcsIFtkaWYsICMzNl0KLSAgICBsZHIgICAgIHI2LCBbZGlmLCAjOF0KLSAgICBsZHIgICAgIHI3LCBbZGlmLCAjMTJdCi0KLSAgICBwa2hidCAgIHI4LCByNiwgcjcsIGxzbCAjMTYKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYKLQotICAgIHV4dGFiMTYgcjgsIHI4LCByNAotICAgIHV4dGFiMTYgcjksIHI5LCByNCwgcm9yICM4Ci0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgb3JyICAgICByOCwgcjgsIHI5LCBsc2wgIzgKLQotICAgIHN0ciAgICAgcjgsIFtkc3QsICM0XQotCi0gICAgYWRkICAgICBkc3QsIGRzdCwgc3RyaWRlCi07OyAgYWRkICAgICBkaWYsIGRpZiwgIzgKLSAgICBhZGQgICAgIGRpZiwgZGlmLCAjMTYKLQotICAgIHN1YnMgICAgbHIsIGxyLCAjMQotICAgIGJuZSAgICAgcmVjb24yYl9sb29wCi0KLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjksIHBjfQotCi0gICAgRU5EUCAgICA7IHxSZWNvbjJCfAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9hcm12Ni9zaW1wbGVsb29wZmlsdGVyX3Y2LmFzbSBiL3ZwOC9jb21tb24vYXJtL2FybXY2L3NpbXBsZWxvb3BmaWx0ZXJfdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTM3MTIwLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybXY2L3NpbXBsZWxvb3BmaWx0ZXJfdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2FybXY2fAotICAgIEVYUE9SVCB8dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2FybXY2fAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWSAgOyBuYW1lIHRoaXMgYmxvY2sgb2YgY29kZQotCi0gICAgTUFDUk8KLSAgICBUUkFOU1BPU0VfTUFUUklYICRhMCwgJGExLCAkYTIsICRhMywgJGIwLCAkYjEsICRiMiwgJGIzCi0gICAgOyBpbnB1dDogJGEwLCAkYTEsICRhMiwgJGEzOyBvdXRwdXQ6ICRiMCwgJGIxLCAkYjIsICRiMwotICAgIDsgYTA6IDAzIDAyIDAxIDAwCi0gICAgOyBhMTogMTMgMTIgMTEgMTAKLSAgICA7IGEyOiAyMyAyMiAyMSAyMAotICAgIDsgYTM6IDMzIDMyIDMxIDMwCi0gICAgOyAgICAgYjMgYjIgYjEgYjAKLQotICAgIHV4dGIxNiAgICAgICRiMSwgJGExICAgICAgICAgICAgICAgICAgICA7IHh4IDEyIHh4IDEwCi0gICAgdXh0YjE2ICAgICAgJGIwLCAkYTAgICAgICAgICAgICAgICAgICAgIDsgeHggMDIgeHggMDAKLSAgICB1eHRiMTYgICAgICAkYjMsICRhMyAgICAgICAgICAgICAgICAgICAgOyB4eCAzMiB4eCAzMAotICAgIHV4dGIxNiAgICAgICRiMiwgJGEyICAgICAgICAgICAgICAgICAgICA7IHh4IDIyIHh4IDIwCi0gICAgb3JyICAgICAgICAgJGIxLCAkYjAsICRiMSwgbHNsICM4ICAgICAgIDsgMTIgMDIgMTAgMDAKLSAgICBvcnIgICAgICAgICAkYjMsICRiMiwgJGIzLCBsc2wgIzggICAgICAgOyAzMiAyMiAzMCAyMAotCi0gICAgdXh0YjE2ICAgICAgJGExLCAkYTEsIHJvciAjOCAgICAgICAgICAgIDsgeHggMTMgeHggMTEKLSAgICB1eHRiMTYgICAgICAkYTMsICRhMywgcm9yICM4ICAgICAgICAgICAgOyB4eCAzMyB4eCAzMQotICAgIHV4dGIxNiAgICAgICRhMCwgJGEwLCByb3IgIzggICAgICAgICAgICA7IHh4IDAzIHh4IDAxCi0gICAgdXh0YjE2ICAgICAgJGEyLCAkYTIsIHJvciAjOCAgICAgICAgICAgIDsgeHggMjMgeHggMjEKLSAgICBvcnIgICAgICAgICAkYTAsICRhMCwgJGExLCBsc2wgIzggICAgICAgOyAxMyAwMyAxMSAwMQotICAgIG9yciAgICAgICAgICRhMiwgJGEyLCAkYTMsIGxzbCAjOCAgICAgICA7IDMzIDIzIDMxIDIxCi0KLSAgICBwa2h0YiAgICAgICAkYjIsICRiMywgJGIxLCBhc3IgIzE2ICAgICAgOyAzMiAyMiAxMiAwMiAgIC0tIHAxCi0gICAgcGtoYnQgICAgICAgJGIwLCAkYjEsICRiMywgbHNsICMxNiAgICAgIDsgMzAgMjAgMTAgMDAgICAtLSBwMwotCi0gICAgcGtodGIgICAgICAgJGIzLCAkYTIsICRhMCwgYXNyICMxNiAgICAgIDsgMzMgMjMgMTMgMDMgICAtLSBwMAotICAgIHBraGJ0ICAgICAgICRiMSwgJGEwLCAkYTIsIGxzbCAjMTYgICAgICA7IDMxIDIxIDExIDAxICAgLS0gcDIKLSAgICBNRU5ECi0KLQotc3JjICAgICAgICAgUk4gIHIwCi1wc3RlcCAgICAgICBSTiAgcjEKLQotO3IwICAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotO3IxICAgICBpbnQgc3JjX3BpeGVsX3N0ZXAsCi07cjIgICAgIGNvbnN0IGNoYXIgKmZsaW1pdCwKLTtyMyAgICAgY29uc3QgY2hhciAqbGltaXQsCi07c3RhY2sgIGNvbnN0IGNoYXIgKnRocmVzaCwKLTtzdGFjayAgaW50ICBjb3VudAotCi07IEFsbCAxNiBlbGVtZW50cyBpbiBmbGltaXQgYXJlIGVxdWFsLiBTbywgaW4gdGhlIGNvZGUsIG9ubHkgb25lIGxvYWQgaXMgbmVlZGVkCi07IGZvciBmbGltaXQuIFNhbWUgYXBwbGllcyB0byBsaW1pdC4gdGhyZXNoIGlzIG5vdCB1c2VkIGluIHNpbXBsZSBsb29vcGZpbHRlcgotCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLXx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12NnwgUFJPQwotOy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCi0gICAgc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0gICAgbGRyICAgICAgICAgcjEyLCBbcjNdICAgICAgICAgICAgICAgICAgIDsgbGltaXQKLSAgICBsZHIgICAgICAgICByMywgW3NyYywgLXBzdGVwLCBsc2wgIzFdICAgOyBwMQotICAgIGxkciAgICAgICAgIHI0LCBbc3JjLCAtcHN0ZXBdICAgICAgICAgICA7IHAwCi0gICAgbGRyICAgICAgICAgcjUsIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgcTAKLSAgICBsZHIgICAgICAgICByNiwgW3NyYywgcHN0ZXBdICAgICAgICAgICAgOyBxMQotICAgIGxkciAgICAgICAgIHI3LCBbcjJdICAgICAgICAgICAgICAgICAgICA7IGZsaW1pdAotICAgIGxkciAgICAgICAgIHIyLCBjMHg4MDgwODA4MAotICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM0MF0gICAgICAgICAgICAgICA7IGNvdW50IGZvciA4LWluLXBhcmFsbGVsCi0gICAgdWFkZDggICAgICAgcjcsIHI3LCByNyAgICAgICAgICAgICAgICAgIDsgZmxpbWl0ICogMgotICAgIG1vdiAgICAgICAgIHI5LCByOSwgbHNsICMxICAgICAgICAgICAgICA7IGRvdWJsZSB0aGUgY291bnQuIHdlJ3JlIGRvaW5nIDQgYXQgYSB0aW1lCi0gICAgdWFkZDggICAgICAgcjEyLCByNywgcjEyICAgICAgICAgICAgICAgIDsgZmxpbWl0ICogMiArIGxpbWl0Ci0gICAgbW92ICAgICAgICAgbHIsICMwICAgICAgICAgICAgICAgICAgICAgIDsgbmVlZCAwIGluIGEgY291cGxlIHBsYWNlcwotCi18c2ltcGxlX2huZXh0OHwKLSAgICA7IHZwOF9zaW1wbGVfZmlsdGVyX21hc2soKQotCi0gICAgdXFzdWI4ICAgICAgcjcsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMQotICAgIHVxc3ViOCAgICAgIHI4LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IHExIC0gcDEKLSAgICB1cXN1YjggICAgICByMTAsIHI0LCByNSAgICAgICAgICAgICAgICAgOyBwMCAtIHEwCi0gICAgdXFzdWI4ICAgICAgcjExLCByNSwgcjQgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAotICAgIG9yciAgICAgICAgIHI4LCByOCwgcjcgICAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKQotICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByMTEgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQotICAgIHVxYWRkOCAgICAgIHIxMCwgcjEwLCByMTAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIKLSAgICB1aGFkZDggICAgICByOCwgcjgsIGxyICAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBxMikgPj4gMQotICAgIHVxYWRkOCAgICAgIHIxMCwgcjEwLCByOCAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSoyICsgYWJzKHAxIC0gcTEpLzIKLSAgICBtdm4gICAgICAgICByOCwgIzAKLSAgICB1c3ViOCAgICAgICByMTAsIHIxMiwgcjEwICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGZsaW1pdC4gdXN1Yjggc2V0cyBHRSBmbGFncwotICAgIHNlbCAgICAgICAgIHIxMCwgcjgsIGxyICAgICAgICAgICAgICAgICA7IGZpbHRlciBtYXNrOiBGIG9yIDAKLSAgICBjbXAgICAgICAgICByMTAsICMwCi0gICAgYmVxICAgICAgICAgc2ltcGxlX2hza2lwX2ZpbHRlciAgICAgICAgIDsgc2tpcCBmaWx0ZXJpbmcgaWYgYWxsIG1hc2tzIGFyZSAweDAwCi0KLSAgICA7dnA4X3NpbXBsZV9maWx0ZXIoKQotCi0gICAgZW9yICAgICAgICAgcjMsIHIzLCByMiAgICAgICAgICAgICAgICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLSAgICBlb3IgICAgICAgICByNiwgcjYsIHIyICAgICAgICAgICAgICAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotICAgIGVvciAgICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7IHAwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0gICAgZW9yICAgICAgICAgcjUsIHI1LCByMiAgICAgICAgICAgICAgICAgIDsgcTAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLQotICAgIHFzdWI4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSBwMSAtIHExCi0gICAgcXN1YjggICAgICAgcjYsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAotICAgIHFhZGQ4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7ICs9IHEwIC0gcDAKLSAgICBsZHIgICAgICAgICByNywgYzB4MDQwNDA0MDQKLSAgICBxYWRkOCAgICAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyArPSBxMCAtIHAwCi0gICAgbGRyICAgICAgICAgcjgsIGMweDAzMDMwMzAzCi0gICAgcWFkZDggICAgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHAxLXExICsgMyoocTAtcDApKQotICAgIDtTVEFMTAotICAgIGFuZCAgICAgICAgIHIzLCByMywgcjEwICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzawotCi0gICAgcWFkZDggICAgICAgcjcgLCByMyAsIHI3ICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA9IHZwOF9maWx0ZXIgKyA0Ci0gICAgcWFkZDggICAgICAgcjggLCByMyAsIHI4ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9maWx0ZXIgKyAzCi0KLSAgICBzaGFkZDggICAgICByNyAsIHI3ICwgbHIKLSAgICBzaGFkZDggICAgICByOCAsIHI4ICwgbHIKLSAgICBzaGFkZDggICAgICByNyAsIHI3ICwgbHIKLSAgICBzaGFkZDggICAgICByOCAsIHI4ICwgbHIKLSAgICBzaGFkZDggICAgICByNyAsIHI3ICwgbHIgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID4+PSAzCi0gICAgc2hhZGQ4ICAgICAgcjggLCByOCAsIGxyICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMwotCi0gICAgcXN1YjggICAgICAgcjUgLHI1LCByNyAgICAgICAgICAgICAgICAgIDsgdSA9IHEwIC0gRmlsdGVyMQotICAgIHFhZGQ4ICAgICAgIHI0LCByNCwgcjggICAgICAgICAgICAgICAgICA7IHUgPSBwMCArIEZpbHRlcjIKLSAgICBlb3IgICAgICAgICByNSwgcjUsIHIyICAgICAgICAgICAgICAgICAgOyAqb3EwID0gdV4weDgwCi0gICAgc3RyICAgICAgICAgcjUsIFtzcmNdICAgICAgICAgICAgICAgICAgIDsgc3RvcmUgb3EwIHJlc3VsdAotICAgIGVvciAgICAgICAgIHI0LCByNCwgcjIgICAgICAgICAgICAgICAgICA7ICpvcDAgPSB1XjB4ODAKLSAgICBzdHIgICAgICAgICByNCwgW3NyYywgLXBzdGVwXSAgICAgICAgICAgOyBzdG9yZSBvcDAgcmVzdWx0Ci0KLXxzaW1wbGVfaHNraXBfZmlsdGVyfAotICAgIHN1YnMgICAgICAgIHI5LCByOSwgIzEKLSAgICBhZGRuZSAgICAgICBzcmMsIHNyYywgIzQgICAgICAgICAgICAgICAgOyBuZXh0IHJvdwotCi0gICAgbGRybmUgICAgICAgcjMsIFtzcmMsIC1wc3RlcCwgbHNsICMxXSAgIDsgcDEKLSAgICBsZHJuZSAgICAgICByNCwgW3NyYywgLXBzdGVwXSAgICAgICAgICAgOyBwMAotICAgIGxkcm5lICAgICAgIHI1LCBbc3JjXSAgICAgICAgICAgICAgICAgICA7IHEwCi0gICAgbGRybmUgICAgICAgcjYsIFtzcmMsIHBzdGVwXSAgICAgICAgICAgIDsgcTEKLQotICAgIGJuZSAgICAgICAgIHNpbXBsZV9obmV4dDgKLQotICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLSAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12NnwKLQotCi07LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLXx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8IFBST0MKLTstPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQotICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICAgIGxkciAgICAgICAgIHIxMiwgW3IyXSAgICAgICAgICAgICAgICAgICA7IHIxMjogZmxpbWl0Ci0gICAgbGRyICAgICAgICAgcjIsIGMweDgwODA4MDgwCi0gICAgbGRyICAgICAgICAgcjcsIFtyM10gICAgICAgICAgICAgICAgICAgIDsgbGltaXQKLQotICAgIDsgbG9hZCBzb3VyZSBkYXRhIHRvIHI3LCByOCwgcjksIHIxMAotICAgIGxkcmggICAgICAgIHIzLCBbc3JjLCAjLTJdCi0gICAgbGRyaCAgICAgICAgcjQsIFtzcmNdLCBwc3RlcAotICAgIHVhZGQ4ICAgICAgIHIxMiwgcjEyLCByMTIgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIKLQotICAgIGxkcmggICAgICAgIHI1LCBbc3JjLCAjLTJdCi0gICAgbGRyaCAgICAgICAgcjYsIFtzcmNdLCBwc3RlcAotICAgIHVhZGQ4ICAgICAgIHIxMiwgcjEyLCByNyAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdAotCi0gICAgcGtoYnQgICAgICAgcjcsIHIzLCByNCwgbHNsICMxNgotCi0gICAgbGRyaCAgICAgICAgcjMsIFtzcmMsICMtMl0KLSAgICBsZHJoICAgICAgICByNCwgW3NyY10sIHBzdGVwCi0gICAgbGRyICAgICAgICAgcjExLCBbc3AsICM0MF0gICAgICAgICAgICAgIDsgY291bnQgKHIxMSkgZm9yIDgtaW4tcGFyYWxsZWwKLQotICAgIHBraGJ0ICAgICAgIHI4LCByNSwgcjYsIGxzbCAjMTYKLQotICAgIGxkcmggICAgICAgIHI1LCBbc3JjLCAjLTJdCi0gICAgbGRyaCAgICAgICAgcjYsIFtzcmNdLCBwc3RlcAotICAgIG1vdiAgICAgICAgIHIxMSwgcjExLCBsc2wgIzEgICAgICAgICAgICA7IDQtaW4tcGFyYWxsZWwKLQotfHNpbXBsZV92bmV4dDh8Ci0gICAgOyB2cDhfc2ltcGxlX2ZpbHRlcl9tYXNrKCkgZnVuY3Rpb24KLSAgICBwa2hidCAgICAgICByOSwgcjMsIHI0LCBsc2wgIzE2Ci0gICAgcGtoYnQgICAgICAgcjEwLCByNSwgcjYsIGxzbCAjMTYKLQotICAgIDt0cmFuc3Bvc2UgcjcsIHI4LCByOSwgcjEwIHRvIHIzLCByNCwgcjUsIHI2Ci0gICAgVFJBTlNQT1NFX01BVFJJWCByNywgcjgsIHI5LCByMTAsIHIzLCByNCwgcjUsIHI2Ci0KLSAgICB1cXN1YjggICAgICByNywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBwMSAtIHExCi0gICAgdXFzdWI4ICAgICAgcjgsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgcTEgLSBwMQotICAgIHVxc3ViOCAgICAgIHI5LCByNCwgcjUgICAgICAgICAgICAgICAgICA7IHAwIC0gcTAKLSAgICB1cXN1YjggICAgICByMTAsIHI1LCByNCAgICAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgb3JyICAgICAgICAgcjcsIHI3LCByOCAgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcTEpCi0gICAgb3JyICAgICAgICAgcjksIHI5LCByMTAgICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCi0gICAgbW92ICAgICAgICAgcjgsICMwCi0gICAgdXFhZGQ4ICAgICAgcjksIHI5LCByOSAgICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICogMgotICAgIHVoYWRkOCAgICAgIHI3LCByNywgcjggICAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKSAvIDIKLSAgICB1cWFkZDggICAgICByNywgcjcsIHI5ICAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkqMiArIGFicyhwMSAtIHExKS8yCi0gICAgbXZuICAgICAgICAgcjEwLCAjMCAgICAgICAgICAgICAgICAgICAgIDsgcjEwID09IC0xCi0KLSAgICB1c3ViOCAgICAgICByNywgcjEyLCByNyAgICAgICAgICAgICAgICAgOyBjb21wYXJlIHRvIGZsaW1pdAotICAgIHNlbCAgICAgICAgIGxyLCByMTAsIHI4ICAgICAgICAgICAgICAgICA7IGZpbHRlciBtYXNrCi0KLSAgICBjbXAgICAgICAgICBsciwgIzAKLSAgICBiZXEgICAgICAgICBzaW1wbGVfdnNraXBfZmlsdGVyICAgICAgICAgOyBza2lwIGZpbHRlcmluZwotCi0gICAgO3ZwOF9zaW1wbGVfZmlsdGVyKCkgZnVuY3Rpb24KLSAgICBlb3IgICAgICAgICByMywgcjMsIHIyICAgICAgICAgICAgICAgICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotICAgIGVvciAgICAgICAgIHI2LCByNiwgcjIgICAgICAgICAgICAgICAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0gICAgZW9yICAgICAgICAgcjQsIHI0LCByMiAgICAgICAgICAgICAgICAgIDsgcDAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLSAgICBlb3IgICAgICAgICByNSwgcjUsIHIyICAgICAgICAgICAgICAgICAgOyBxMCBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotCi0gICAgcXN1YjggICAgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHAxIC0gcTEKLSAgICBxc3ViOCAgICAgICByNiwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyBxMCAtIHAwCi0KLSAgICBxYWRkOCAgICAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICs9IHEwIC0gcDAKLSAgICBsZHIgICAgICAgICByOSwgYzB4MDMwMzAzMDMgICAgICAgICAgICAgOyByOSA9IDMKLQotICAgIHFhZGQ4ICAgICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgKz0gcTAgLSBwMAotICAgIGxkciAgICAgICAgIHI3LCBjMHgwNDA0MDQwNAotCi0gICAgcWFkZDggICAgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHAxLXExICsgMyoocTAtcDApKQotICAgIDtTVEFMTAotICAgIGFuZCAgICAgICAgIHIzLCByMywgbHIgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzawotCi0gICAgcWFkZDggICAgICAgcjkgLCByMyAsIHI5ICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9maWx0ZXIgKyAzCi0gICAgcWFkZDggICAgICAgcjMgLCByMyAsIHI3ICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA9IHZwOF9maWx0ZXIgKyA0Ci0KLSAgICBzaGFkZDggICAgICByOSAsIHI5ICwgcjgKLSAgICBzaGFkZDggICAgICByMyAsIHIzICwgcjgKLSAgICBzaGFkZDggICAgICByOSAsIHI5ICwgcjgKLSAgICBzaGFkZDggICAgICByMyAsIHIzICwgcjgKLSAgICBzaGFkZDggICAgICByOSAsIHI5ICwgcjggICAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgc2hhZGQ4ICAgICAgcjMgLCByMyAsIHI4ICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA+Pj0gMwotCi0gICAgO2NhbGN1bGF0ZSBvdXRwdXQKLSAgICBzdWIgICAgICAgICBzcmMsIHNyYywgcHN0ZXAsIGxzbCAjMgotCi0gICAgcWFkZDggICAgICAgcjQsIHI0LCByOSAgICAgICAgICAgICAgICAgIDsgdSA9IHAwICsgRmlsdGVyMgotICAgIHFzdWI4ICAgICAgIHI1LCByNSwgcjMgICAgICAgICAgICAgICAgICA7IHUgPSBxMCAtIEZpbHRlcjEKLSAgICBlb3IgICAgICAgICByNCwgcjQsIHIyICAgICAgICAgICAgICAgICAgOyAqb3AwID0gdV4weDgwCi0gICAgZW9yICAgICAgICAgcjUsIHI1LCByMiAgICAgICAgICAgICAgICAgIDsgKm9xMCA9IHVeMHg4MAotCi0gICAgc3RyYiAgICAgICAgcjQsIFtzcmMsICMtMV0gICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdAotICAgIG1vdiAgICAgICAgIHI0LCByNCwgbHNyICM4Ci0gICAgc3RyYiAgICAgICAgcjUsIFtzcmNdLCBwc3RlcAotICAgIG1vdiAgICAgICAgIHI1LCByNSwgbHNyICM4Ci0KLSAgICBzdHJiICAgICAgICByNCwgW3NyYywgIy0xXQotICAgIG1vdiAgICAgICAgIHI0LCByNCwgbHNyICM4Ci0gICAgc3RyYiAgICAgICAgcjUsIFtzcmNdLCBwc3RlcAotICAgIG1vdiAgICAgICAgIHI1LCByNSwgbHNyICM4Ci0KLSAgICBzdHJiICAgICAgICByNCwgW3NyYywgIy0xXQotICAgIG1vdiAgICAgICAgIHI0LCByNCwgbHNyICM4Ci0gICAgc3RyYiAgICAgICAgcjUsIFtzcmNdLCBwc3RlcAotICAgIG1vdiAgICAgICAgIHI1LCByNSwgbHNyICM4Ci0KLSAgICBzdHJiICAgICAgICByNCwgW3NyYywgIy0xXQotICAgIHN0cmIgICAgICAgIHI1LCBbc3JjXSwgcHN0ZXAKLQotfHNpbXBsZV92c2tpcF9maWx0ZXJ8Ci0gICAgc3VicyAgICAgICAgcjExLCByMTEsICMxCi0KLSAgICA7IGxvYWQgc291cmUgZGF0YSB0byByNywgcjgsIHI5LCByMTAKLSAgICBsZHJuZWggICAgICByMywgW3NyYywgIy0yXQotICAgIGxkcm5laCAgICAgIHI0LCBbc3JjXSwgcHN0ZXAKLQotICAgIGxkcm5laCAgICAgIHI1LCBbc3JjLCAjLTJdCi0gICAgbGRybmVoICAgICAgcjYsIFtzcmNdLCBwc3RlcAotCi0gICAgcGtoYnQgICAgICAgcjcsIHIzLCByNCwgbHNsICMxNgotCi0gICAgbGRybmVoICAgICAgcjMsIFtzcmMsICMtMl0KLSAgICBsZHJuZWggICAgICByNCwgW3NyY10sIHBzdGVwCi0KLSAgICBwa2hidCAgICAgICByOCwgcjUsIHI2LCBsc2wgIzE2Ci0KLSAgICBsZHJuZWggICAgICByNSwgW3NyYywgIy0yXQotICAgIGxkcm5laCAgICAgIHI2LCBbc3JjXSwgcHN0ZXAKLQotICAgIGJuZSAgICAgICAgIHNpbXBsZV92bmV4dDgKLQotICAgIGxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLSAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjZ8Ci0KLTsgQ29uc3RhbnQgUG9vbAotYzB4ODA4MDgwODAgRENEICAgICAweDgwODA4MDgwCi1jMHgwMzAzMDMwMyBEQ0QgICAgIDB4MDMwMzAzMDMKLWMweDA0MDQwNDA0IERDRCAgICAgMHgwNDA0MDQwNAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9hcm12Ni9zaXh0YXBwcmVkaWN0OHg0X3Y2LmFzbSBiL3ZwOC9jb21tb24vYXJtL2FybXY2L3NpeHRhcHByZWRpY3Q4eDRfdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q3MGMzLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2FybXY2L3NpeHRhcHByZWRpY3Q4eDRfdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYXJtdjZ8Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotO09uZSB3b3JkIGVhY2ggaXMgcmVzZXJ2ZWQuIExhYmVsIGZpbHRlcl9jb2VmZiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGEuCi07RGF0YSBhZGRyZXNzOiBmaWx0ZXJfY29lZmYsIGZpbHRlcl9jb2VmZis0LCBmaWx0ZXJfY29lZmYrOCAuLi4KLWZpbHRlcjhfY29lZmYKLSAgICBEQ0QgICAgIDB4MDAwMDAwMDAsICAgICAweDAwMDAwMDgwLCAgICAgMHgwMDAwMDAwMCwgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmYTAwMDAsICAgICAweDAwMGMwMDdiLCAgICAgMHgwMDAwZmZmZiwgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmNTAwMDIsICAgICAweDAwMjQwMDZjLCAgICAgMHgwMDAxZmZmOCwgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmNzAwMDAsICAgICAweDAwMzIwMDVkLCAgICAgMHgwMDAwZmZmYSwgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmMDAwMDMsICAgICAweDAwNGQwMDRkLCAgICAgMHgwMDAzZmZmMCwgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmYTAwMDAsICAgICAweDAwNWQwMDMyLCAgICAgMHgwMDAwZmZmNywgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmODAwMDEsICAgICAweDAwNmMwMDI0LCAgICAgMHgwMDAyZmZmNSwgICAgIDB4MDAwMDAwMDAKLSAgICBEQ0QgICAgIDB4ZmZmZjAwMDAsICAgICAweDAwN2IwMDBjLCAgICAgMHgwMDAwZmZmYSwgICAgIDB4MDAwMDAwMDAKLQotICAgIDtEQ0QgICAgICAgIDAsICAwLCAgMTI4LCAgICAwLCAgIDAsICAwCi0gICAgO0RDRCAgICAgICAgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAKLSAgICA7RENEICAgICAgICAyLCAtMTEsIDEwOCwgICAzNiwgIC04LCAgMQotICAgIDtEQ0QgICAgICAgIDAsIC05LCAgIDkzLCAgIDUwLCAgLTYsICAwCi0gICAgO0RDRCAgICAgICAgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMKLSAgICA7RENEICAgICAgICAwLCAtNiwgICA1MCwgICA5MywgIC05LCAgMAotICAgIDtEQ0QgICAgICAgIDEsIC04LCAgIDM2LCAgMTA4LCAtMTEsICAyCi0gICAgO0RDRCAgICAgICAgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgIDAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyByMiAgICBpbnQgIHhvZmZzZXQsCi07IHIzICAgIGludCAgeW9mZnNldCwKLTsgc3RhY2sgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgc3RhY2sgaW50ICBkc3RfcGl0Y2gKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07bm90ZTogSW4gZmlyc3QgcGFzcywgc3RvcmUgdGhlIHJlc3VsdCBpbiB0cmFuc3Bvc2UoOGxpbmVzeDljb2x1bW5zKSBvbiBzdGFjay4gVGVtcG9yYXJ5IHN0YWNrIHNpemUgaXMgMTg0LgotO0xpbmUgd2lkdGggaXMgMjAgdGhhdCBpcyA5IHNob3J0IGRhdGEgcGx1cyAyIHRvIG1ha2UgaXQgNGJ5dGVzIGFsaWduZWQuIEluIHNlY29uZCBwYXNzLCBsb2FkIGRhdGEgZnJvbSBzdGFjaywKLTthbmQgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdHJhbnNwb3NlLgotfHZwOF9zaXh0YXBfcHJlZGljdDh4NF9hcm12NnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLSAgICBzdHIgICAgICAgICByMywgW3NwLCAjLTE4NF0hICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlLCBzdG9yZSB5b2Zmc2V0Ci0KLSAgICBjbXAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgYWRkICAgICAgICAgbHIsIHNwLCAjNCAgICAgICAgICAgICAgICAgIDtwb2ludCB0byB0ZW1wb3JhcnkgYnVmZmVyCi0gICAgYmVxICAgICAgICAgc2tpcF9maXJzdHBhc3NfZmlsdGVyCi0KLTtmaXJzdC1wYXNzIGZpbHRlcgotICAgIGFkciAgICAgICAgIHIxMiwgZmlsdGVyOF9jb2VmZgotICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQotCi0gICAgYWRkICAgICAgICAgcjIsIHIxMiwgcjIsIGxzbCAjNCAgICAgICAgIDtjYWxjdWxhdGUgZmlsdGVyIGxvY2F0aW9uCi0gICAgYWRkICAgICAgICAgcjAsIHIwLCAjMyAgICAgICAgICAgICAgICAgIDthZGp1c3Qgc3JjIG9ubHkgZm9yIGxvYWRpbmcgY29udmluaWVuY2UKLQotICAgIGxkciAgICAgICAgIHIzLCBbcjJdICAgICAgICAgICAgICAgICAgICA7IGxvYWQgdXAgcGFja2VkIGZpbHRlciBjb2VmZmljaWVudHMKLSAgICBsZHIgICAgICAgICByNCwgW3IyLCAjNF0KLSAgICBsZHIgICAgICAgICByNSwgW3IyLCAjOF0KLQotICAgIG1vdiAgICAgICAgIHIyLCAjMHg5MDAwMCAgICAgICAgICAgICAgICA7IGhlaWdodD05IGlzIHRvcCBwYXJ0IG9mIGNvdW50ZXIKLQotICAgIHN1YiAgICAgICAgIHIxLCByMSwgIzgKLQotfGZpcnN0X3Bhc3NfaGxvb3BfdjZ8Ci0gICAgbGRyYiAgICAgICAgcjYsIFtyMCwgIy01XSAgICAgICAgICAgICAgIDsgbG9hZCBzb3VyY2UgZGF0YQotICAgIGxkcmIgICAgICAgIHI3LCBbcjAsICMtNF0KLSAgICBsZHJiICAgICAgICByOCwgW3IwLCAjLTNdCi0gICAgbGRyYiAgICAgICAgcjksIFtyMCwgIy0yXQotICAgIGxkcmIgICAgICAgIHIxMCwgW3IwLCAjLTFdCi0KLSAgICBvcnIgICAgICAgICByMiwgcjIsICMweDQgICAgICAgICAgICAgICAgOyBjb25zdHJ1Y3QgbG9vcCBjb3VudGVyLiB3aWR0aD04PTR4MgotCi0gICAgcGtoYnQgICAgICAgcjYsIHI2LCByNywgbHNsICMxNiAgICAgICAgIDsgcjcgfCByNgotICAgIHBraGJ0ICAgICAgIHI3LCByNywgcjgsIGxzbCAjMTYgICAgICAgICA7IHI4IHwgcjcKLQotICAgIHBraGJ0ICAgICAgIHI4LCByOCwgcjksIGxzbCAjMTYgICAgICAgICA7IHI5IHwgcjgKLSAgICBwa2hidCAgICAgICByOSwgcjksIHIxMCwgbHNsICMxNiAgICAgICAgOyByMTAgfCByOQotCi18Zmlyc3RfcGFzc193bG9vcF92NnwKLSAgICBzbXVhZCAgICAgICByMTEsIHI2LCByMyAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyWzBdLCB2cDhfZmlsdGVyWzFdCi0gICAgc211YWQgICAgICAgcjEyLCByNywgcjMKLQotICAgIGxkcmIgICAgICAgIHI2LCBbcjBdLCAjMQotCi0gICAgc21sYWQgICAgICAgcjExLCByOCwgcjQsIHIxMSAgICAgICAgICAgIDsgdnA4X2ZpbHRlclsyXSwgdnA4X2ZpbHRlclszXQotICAgIGxkcmIgICAgICAgIHI3LCBbcjBdLCAjMQotICAgIHNtbGFkICAgICAgIHIxMiwgcjksIHI0LCByMTIKLQotICAgIHBraGJ0ICAgICAgIHIxMCwgcjEwLCByNiwgbHNsICMxNiAgICAgICA7IHIxMCB8IHI5Ci0gICAgcGtoYnQgICAgICAgcjYsIHI2LCByNywgbHNsICMxNiAgICAgICAgIDsgcjExIHwgcjEwCi0gICAgc21sYWQgICAgICAgcjExLCByMTAsIHI1LCByMTEgICAgICAgICAgIDsgdnA4X2ZpbHRlcls0XSwgdnA4X2ZpbHRlcls1XQotICAgIHNtbGFkICAgICAgIHIxMiwgcjYsIHI1LCByMTIKLQotICAgIHN1YiAgICAgICAgIHIyLCByMiwgIzEKLQotICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCAjMHg0MCAgICAgICAgICAgICA7IHJvdW5kX3NoaWZ0X2FuZF9jbGFtcAotICAgIHRzdCAgICAgICAgIHIyLCAjMHhmZiAgICAgICAgICAgICAgICAgICA7IHRlc3QgbG9vcCBjb3VudGVyCi0gICAgdXNhdCAgICAgICAgcjExLCAjOCwgcjExLCBhc3IgIzcKLSAgICBhZGQgICAgICAgICByMTIsIHIxMiwgIzB4NDAKLSAgICBzdHJoICAgICAgICByMTEsIFtscl0sICMyMCAgICAgICAgICAgICAgOyByZXN1bHQgaXMgdHJhbnNwb3NlZCBhbmQgc3RvcmVkLCB3aGljaAotICAgIHVzYXQgICAgICAgIHIxMiwgIzgsIHIxMiwgYXNyICM3Ci0KLSAgICBzdHJoICAgICAgICByMTIsIFtscl0sICMyMAotCi0gICAgbW92bmUgICAgICAgcjExLCByNgotICAgIG1vdm5lICAgICAgIHIxMiwgcjcKLQotICAgIG1vdm5lICAgICAgIHI2LCByOAotICAgIG1vdm5lICAgICAgIHI3LCByOQotICAgIG1vdm5lICAgICAgIHI4LCByMTAKLSAgICBtb3ZuZSAgICAgICByOSwgcjExCi0gICAgbW92bmUgICAgICAgcjEwLCByMTIKLQotICAgIGJuZSAgICAgICAgIGZpcnN0X3Bhc3Nfd2xvb3BfdjYKLQotICAgIDs7YWRkICAgICAgIHI5LCBwcGwsICMzMCAgICAgICAgICAgICAgICA7IGF0dGVtcHQgdG8gbG9hZCAyIGFkamFjZW50IGNhY2hlIGxpbmVzCi0gICAgOztJRiBBUkNISVRFQ1RVUkU9NgotICAgIDtwbGQgICAgICAgIFtzcmMsIHBwbF0KLSAgICA7O3BsZCAgICAgICBbc3JjLCByOV0KLSAgICA7O0VORElGCi0KLSAgICBzdWJzICAgICAgICByMiwgcjIsICMweDEwMDAwCi0KLSAgICBzdWIgICAgICAgICBsciwgbHIsICMxNTgKLQotICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEgICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gbmV4dCBpbnB1dCBsaW5lCi0KLSAgICBibmUgICAgICAgICBmaXJzdF9wYXNzX2hsb29wX3Y2Ci0KLTtzZWNvbmQgcGFzcyBmaWx0ZXIKLXNlY29uZHBhc3NfZmlsdGVyCi0gICAgbGRyICAgICAgICAgcjMsIFtzcF0sICM0ICAgICAgICAgICAgICAgIDsgbG9hZCBiYWNrIHlvZmZzZXQKLSAgICBsZHIgICAgICAgICByMCwgW3NwLCAjMjE2XSAgICAgICAgICAgICAgOyBsb2FkIGRzdCBhZGRyZXNzIGZyb20gc3RhY2sgMTgwKzM2Ci0gICAgbGRyICAgICAgICAgcjEsIFtzcCwgIzIyMF0gICAgICAgICAgICAgIDsgbG9hZCBkc3Qgc3RyaWRlIGZyb20gc3RhY2sgMTgwKzQwCi0KLSAgICBjbXAgICAgICAgICByMywgIzAKLSAgICBiZXEgICAgICAgICBza2lwX3NlY29uZHBhc3NfZmlsdGVyCi0KLSAgICBhZHIgICAgICAgICByMTIsIGZpbHRlcjhfY29lZmYKLSAgICBhZGQgICAgICAgICBsciwgcjEyLCByMywgbHNsICM0ICAgICAgICAgO2NhbGN1bGF0ZSBmaWx0ZXIgbG9jYXRpb24KLQotICAgIG1vdiAgICAgICAgIHIyLCAjMHgwMDA4MDAwMAotCi0gICAgbGRyICAgICAgICAgcjMsIFtscl0gICAgICAgICAgICAgICAgICAgIDsgbG9hZCB1cCBwYWNrZWQgZmlsdGVyIGNvZWZmaWNpZW50cwotICAgIGxkciAgICAgICAgIHI0LCBbbHIsICM0XQotICAgIGxkciAgICAgICAgIHI1LCBbbHIsICM4XQotCi0gICAgcGtoYnQgICAgICAgcjEyLCByNCwgcjMgICAgICAgICAgICAgICAgIDsgcGFjayB0aGUgZmlsdGVyIGRpZmZlcmVudGx5Ci0gICAgcGtoYnQgICAgICAgcjExLCByNSwgcjQKLQotc2Vjb25kX3Bhc3NfaGxvb3BfdjYKLSAgICBsZHIgICAgICAgICByNiwgW3NwXSAgICAgICAgICAgICAgICAgICAgOyBsb2FkIHRoZSBkYXRhCi0gICAgbGRyICAgICAgICAgcjcsIFtzcCwgIzRdCi0KLSAgICBvcnIgICAgICAgICByMiwgcjIsICMyICAgICAgICAgICAgICAgICAgOyBsb29wIGNvdW50ZXIKLQotc2Vjb25kX3Bhc3Nfd2xvb3BfdjYKLSAgICBzbXVhZCAgICAgICBsciwgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBhcHBseSBmaWx0ZXIKLSAgICBzbXVsYnQgICAgICByMTAsIHIzLCByNgotCi0gICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzhdCi0KLSAgICBzbWxhZCAgICAgICBsciwgcjQsIHI3LCBscgotICAgIHNtbGFkeCAgICAgIHIxMCwgcjEyLCByNywgcjEwCi0KLSAgICBsZHJoICAgICAgICByOSwgW3NwLCAjMTJdCi0KLSAgICBzbWxhZCAgICAgICBsciwgcjUsIHI4LCBscgotICAgIHNtbGFkeCAgICAgIHIxMCwgcjExLCByOCwgcjEwCi0KLSAgICBhZGQgICAgICAgICBzcCwgc3AsICM0Ci0gICAgc21sYXRiICAgICAgcjEwLCByNSwgcjksIHIxMAotCi0gICAgc3ViICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgYWRkICAgICAgICAgbHIsIGxyLCAjMHg0MCAgICAgICAgICAgICAgIDsgcm91bmRfc2hpZnRfYW5kX2NsYW1wCi0gICAgdHN0ICAgICAgICAgcjIsICMweGZmCi0gICAgdXNhdCAgICAgICAgbHIsICM4LCBsciwgYXNyICM3Ci0gICAgYWRkICAgICAgICAgcjEwLCByMTAsICMweDQwCi0gICAgc3RyYiAgICAgICAgbHIsIFtyMF0sIHIxICAgICAgICAgICAgICAgIDsgdGhlIHJlc3VsdCBpcyB0cmFuc3Bvc2VkIGJhY2sgYW5kIHN0b3JlZAotICAgIHVzYXQgICAgICAgIHIxMCwgIzgsIHIxMCwgYXNyICM3Ci0KLSAgICBzdHJiICAgICAgICByMTAsIFtyMF0scjEKLQotICAgIG1vdm5lICAgICAgIHI2LCByNwotICAgIG1vdm5lICAgICAgIHI3LCByOAotCi0gICAgYm5lICAgICAgICAgc2Vjb25kX3Bhc3Nfd2xvb3BfdjYKLQotICAgIHN1YnMgICAgICAgIHIyLCByMiwgIzB4MTAwMDAKLSAgICBhZGQgICAgICAgICBzcCwgc3AsICMxMiAgICAgICAgICAgICAgICAgOyB1cGRhdGEgc3JjIGZvciBuZXh0IGxvb3AgKDIwLTgpCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMyCi0gICAgYWRkICAgICAgICAgcjAsIHIwLCAjMQotCi0gICAgYm5lICAgICAgICAgc2Vjb25kX3Bhc3NfaGxvb3BfdjYKLQotICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzIwCi0gICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNraXBfZmlyc3RwYXNzX2ZpbHRlcgotICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQotICAgIHN1YiAgICAgICAgIHIxLCByMSwgIzgKLSAgICBtb3YgICAgICAgICByMiwgIzkKLQotc2tpcF9maXJzdHBhc3NfaGxvb3AKLSAgICBsZHJiICAgICAgICByNCwgW3IwXSwgIzEgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEKLSAgICBzdWJzICAgICAgICByMiwgcjIsICMxCi0gICAgbGRyYiAgICAgICAgcjUsIFtyMF0sICMxCi0gICAgc3RyaCAgICAgICAgcjQsIFtscl0sICMyMCAgICAgICAgICAgICAgIDsgc3RvcmUgaXQgdG8gaW1tZWRpYXRlIGJ1ZmZlcgotICAgIGxkcmIgICAgICAgIHI2LCBbcjBdLCAjMSAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YQotICAgIHN0cmggICAgICAgIHI1LCBbbHJdLCAjMjAKLSAgICBsZHJiICAgICAgICByNywgW3IwXSwgIzEKLSAgICBzdHJoICAgICAgICByNiwgW2xyXSwgIzIwCi0gICAgbGRyYiAgICAgICAgcjgsIFtyMF0sICMxCi0gICAgc3RyaCAgICAgICAgcjcsIFtscl0sICMyMAotICAgIGxkcmIgICAgICAgIHI5LCBbcjBdLCAjMQotICAgIHN0cmggICAgICAgIHI4LCBbbHJdLCAjMjAKLSAgICBsZHJiICAgICAgICByMTAsIFtyMF0sICMxCi0gICAgc3RyaCAgICAgICAgcjksIFtscl0sICMyMAotICAgIGxkcmIgICAgICAgIHIxMSwgW3IwXSwgIzEKLSAgICBzdHJoICAgICAgICByMTAsIFtscl0sICMyMAotICAgIGFkZCAgICAgICAgIHIwLCByMCwgcjEgICAgICAgICAgICAgICAgICA7IG1vdmUgdG8gbmV4dCBpbnB1dCBsaW5lCi0gICAgc3RyaCAgICAgICAgcjExLCBbbHJdLCAjMjAKLQotICAgIHN1YiAgICAgICAgIGxyLCBsciwgIzE1OCAgICAgICAgICAgICAgICA7IG1vdmUgb3ZlciB0byBuZXh0IGNvbHVtbgotICAgIGJuZSAgICAgICAgIHNraXBfZmlyc3RwYXNzX2hsb29wCi0KLSAgICBiICAgICAgICAgICBzZWNvbmRwYXNzX2ZpbHRlcgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNraXBfc2Vjb25kcGFzc19maWx0ZXIKLSAgICBtb3YgICAgICAgICByMiwgIzgKLSAgICBhZGQgICAgICAgICBzcCwgc3AsICM0ICAgICAgICAgICAgICAgICAgO3N0YXJ0IGZyb20gc3JjWzBdIGluc3RlYWQgb2Ygc3JjWy0yXQotCi1za2lwX3NlY29uZHBhc3NfaGxvb3AKLSAgICBsZHIgICAgICAgICByNiwgW3NwXSwgIzQKLSAgICBzdWJzICAgICAgICByMiwgcjIsICMxCi0gICAgbGRyICAgICAgICAgcjgsIFtzcF0sICM0Ci0KLSAgICBtb3YgICAgICAgICByNywgcjYsIGxzciAjMTYgICAgICAgICAgICAgOyB1bnBhY2sKLSAgICBzdHJiICAgICAgICByNiwgW3IwXSwgcjEKLSAgICBtb3YgICAgICAgICByOSwgcjgsIGxzciAjMTYKLSAgICBzdHJiICAgICAgICByNywgW3IwXSwgcjEKLSAgICBhZGQgICAgICAgICBzcCwgc3AsICMxMiAgICAgICAgICAgICAgICAgOyAyMC04Ci0gICAgc3RyYiAgICAgICAgcjgsIFtyMF0sIHIxCi0gICAgc3RyYiAgICAgICAgcjksIFtyMF0sIHIxCi0KLSAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzIKLSAgICBhZGQgICAgICAgICByMCwgcjAsICMxCi0KLSAgICBibmUgICAgICAgICBza2lwX3NlY29uZHBhc3NfaGxvb3AKLQotICAgIGFkZCAgICAgICAgIHNwLCBzcCwgIzE2ICAgICAgICAgICAgICAgICA7IDE4MCAtICgxNjAgKzQpCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2JpbGluZWFyZmlsdGVyX2FybS5jIGIvdnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDBlMjAuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vYmlsaW5lYXJmaWx0ZXJfYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAidnA4L2NvbW1vbi9maWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N1YnBpeGVsLmgiCi0jaW5jbHVkZSAiYmlsaW5lYXJmaWx0ZXJfYXJtLmgiCi0KLXZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9hcm12NgotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICBzcmNfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50ICAgZHN0X3BpdGNoLAotICAgIGNvbnN0IHNob3J0ICAgKkhGaWx0ZXIsCi0gICAgY29uc3Qgc2hvcnQgICAqVkZpbHRlciwKLSAgICBpbnQgICAgICAgICAgICBXaWR0aCwKLSAgICBpbnQgICAgICAgICAgICBIZWlnaHQKLSkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBGRGF0YVszNioxNl07IC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLQotICAgIC8qIEZpcnN0IGZpbHRlciAxLUQgaG9yaXpvbnRhbGx5Li4uICovCi0gICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzX2FybXY2KHNyY19wdHIsIEZEYXRhLCBzcmNfcGl0Y2gsIEhlaWdodCArIDEsIFdpZHRoLCBIRmlsdGVyKTsKLQotICAgIC8qIHRoZW4gMS1EIHZlcnRpY2FsbHkuLi4gKi8KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzX2FybXY2KEZEYXRhLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIEhlaWdodCwgV2lkdGgsIFZGaWx0ZXIpOwotfQotCi0KLXZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYXJtdjYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOwotICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlciwgNCwgNCk7Ci19Ci0KLXZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYXJtdjYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOwotICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlciwgOCwgOCk7Ci19Ci0KLXZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfYXJtdjYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOwotICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlciwgOCwgNCk7Ci19Ci0KLXZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9hcm12NgotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50ICBkc3RfcGl0Y2gKLSkKLXsKLSAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7Ci0gICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOwotCi0gICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOwotICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKLQotICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCAxNiwgMTYpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vZmlsdGVyX2FybS5jIGIvdnA4L2NvbW1vbi9hcm0vZmlsdGVyX2FybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTNjNWE1Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2ZpbHRlcl9hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAidnA4L2NvbW1vbi9maWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N1YnBpeGVsLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgotCi1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19hcm12NgotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgc2hvcnQgICAgICAgICAqb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAotICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCi0pOwotCi1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYKLSgKLSAgICBzaG9ydCAgICAgICAgICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9waXRjaCwKLSAgICB1bnNpZ25lZCBpbnQgY250LAotICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCi0pOwotCi1leHRlcm4gdm9pZCB2cDhfZmlsdGVyNF9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2Ci0oCi0gICAgc2hvcnQgICAgICAgICAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAotICAgIHVuc2lnbmVkIGludCBvdXRwdXRfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IGNudCwKLSAgICBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgotKTsKLQotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Nfb25seV9hcm12NgotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgY250LAotICAgIHVuc2lnbmVkIGludCBvdXRwdXRfcGl0Y2gsCi0gICAgY29uc3Qgc2hvcnQgKnZwOF9maWx0ZXIKLSk7Ci0KLQotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX29ubHlfYXJtdjYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IGNudCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3BpdGNoLAotICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCi0pOwotCi0jaWYgSEFWRV9BUk1WNgotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3RfYXJtdjYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOwotICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoNCwgc2hvcnQsIEZEYXRhLCAxMio0KTsgLyogVGVtcCBkYXRhIGJ1ZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLwotCi0KLSAgICBIRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t4b2Zmc2V0XTsgICAvKiA2IHRhcCAqLwotICAgIFZGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3lvZmZzZXRdOyAgIC8qIDYgdGFwICovCi0KLSAgICAvKiBWZmlsdGVyIGlzIG51bGwuIEZpcnN0IHBhc3Mgb25seSAqLwotICAgIGlmICh4b2Zmc2V0ICYmICF5b2Zmc2V0KQotICAgIHsKLSAgICAgICAgLyp2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19hcm12NiAoIHNyY19wdHIsIEZEYXRhKzIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDQsIDQsIEhGaWx0ZXIgKTsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX2FybXY2ICggRkRhdGErMiwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCBWRmlsdGVyICk7Ki8KLQotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19vbmx5X2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDQsIGRzdF9waXRjaCwgSEZpbHRlcik7Ci0gICAgfQotICAgIC8qIEhmaWx0ZXIgaXMgbnVsbC4gU2Vjb25kIHBhc3Mgb25seSAqLwotICAgIGVsc2UgaWYgKCF4b2Zmc2V0ICYmIHlvZmZzZXQpCi0gICAgewotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3Nfb25seV9hcm12NihzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCBkc3RfcGl0Y2gsIFZGaWx0ZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBWZmlsdGVyIGlzIGEgNCB0YXAgZmlsdGVyICovCi0gICAgICAgIGlmICh5b2Zmc2V0ICYgMHgxKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc19hcm12NihzcmNfcHRyIC0gc3JjX3BpeGVsc19wZXJfbGluZSwgRkRhdGEgKyAxLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCA3LCBIRmlsdGVyKTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXI0X2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDQsIFZGaWx0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFZmaWx0ZXIgaXMgNiB0YXAgZmlsdGVyICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCA5LCBIRmlsdGVyKTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NihGRGF0YSArIDIsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgVkZpbHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2FybXY2Ci0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgIGRzdF9waXRjaAotKQotewotICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlcjsKLSAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXI7Ci0gICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDQsIHNob3J0LCBGRGF0YSwgMTYqOCk7IC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLQotICAgIEhGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3hvZmZzZXRdOyAgIC8qIDYgdGFwICovCi0gICAgVkZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeW9mZnNldF07ICAgLyogNiB0YXAgKi8KLQotICAgIGlmICh4b2Zmc2V0ICYmICF5b2Zmc2V0KQotICAgIHsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Nfb25seV9hcm12NihzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA4LCBkc3RfcGl0Y2gsIEhGaWx0ZXIpOwotICAgIH0KLSAgICAvKiBIZmlsdGVyIGlzIG51bGwuIFNlY29uZCBwYXNzIG9ubHkgKi8KLSAgICBlbHNlIGlmICgheG9mZnNldCAmJiB5b2Zmc2V0KQotICAgIHsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzX29ubHlfYXJtdjYoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgOCwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHlvZmZzZXQgJiAweDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX2FybXY2KHNyY19wdHIgLSBzcmNfcGl4ZWxzX3Blcl9saW5lLCBGRGF0YSArIDEsIHNyY19waXhlbHNfcGVyX2xpbmUsIDgsIDExLCBIRmlsdGVyKTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXI0X2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIFZGaWx0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA4LCAxMywgSEZpbHRlcik7Ci0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIFZGaWx0ZXIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYXJtdjYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOwotICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoNCwgc2hvcnQsIEZEYXRhLCAyNCoxNik7ICAgIC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLQotICAgIEhGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3hvZmZzZXRdOyAgIC8qIDYgdGFwICovCi0gICAgVkZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeW9mZnNldF07ICAgLyogNiB0YXAgKi8KLQotICAgIGlmICh4b2Zmc2V0ICYmICF5b2Zmc2V0KQotICAgIHsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Nfb25seV9hcm12NihzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxNiwgZHN0X3BpdGNoLCBIRmlsdGVyKTsKLSAgICB9Ci0gICAgLyogSGZpbHRlciBpcyBudWxsLiBTZWNvbmQgcGFzcyBvbmx5ICovCi0gICAgZWxzZSBpZiAoIXhvZmZzZXQgJiYgeW9mZnNldCkKLSAgICB7Ci0gICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19vbmx5X2FybXY2KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDE2LCBkc3RfcGl0Y2gsIFZGaWx0ZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoeW9mZnNldCAmIDB4MSkKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciAtIHNyY19waXhlbHNfcGVyX2xpbmUsIEZEYXRhICsgMSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMTYsIDE5LCBIRmlsdGVyKTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXI0X2Jsb2NrMmRfc2Vjb25kX3Bhc3NfYXJtdjYoRkRhdGEgKyAyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCBWRmlsdGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzX2FybXY2KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMTYsIDIxLCBIRmlsdGVyKTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzc19hcm12NihGRGF0YSArIDIsIGRzdF9wdHIsIGRzdF9waXRjaCwgMTYsIFZGaWx0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL2lkY3RfYXJtLmggYi92cDgvY29tbW9uL2FybS9pZGN0X2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhkMTc5Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL2lkY3RfYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBJRENUX0FSTV9ICi0jZGVmaW5lIElEQ1RfQVJNX0gKLQotI2lmIEhBVkVfQVJNVjYKLWV4dGVybiBwcm90b3R5cGVfaWRjdCh2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX3Y2KTsKLWV4dGVybiBwcm90b3R5cGVfaWRjdCh2cDhfc2hvcnRfaWRjdDR4NGxsbV92Nl9kdWFsKTsKLWV4dGVybiBwcm90b3R5cGVfaWRjdF9zY2FsYXJfYWRkKHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2KTsKLWV4dGVybiBwcm90b3R5cGVfc2Vjb25kX29yZGVyKHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV92Nik7Ci1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0X3Y2KTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9pZGN0X2lkY3QxCi0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfdjYKLQotI3VuZGVmICB2cDhfaWRjdF9pZGN0MTYKLSNkZWZpbmUgdnA4X2lkY3RfaWRjdDE2IHZwOF9zaG9ydF9pZGN0NHg0bGxtX3Y2X2R1YWwKLQotI3VuZGVmICB2cDhfaWRjdF9pZGN0MV9zY2FsYXJfYWRkCi0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxX3NjYWxhcl9hZGQgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYKLQotI3VuZGVmICB2cDhfaWRjdF9pd2Fsc2gxCi0jZGVmaW5lIHZwOF9pZGN0X2l3YWxzaDEgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX3Y2Ci0KLSN1bmRlZiAgdnA4X2lkY3RfaXdhbHNoMTYKLSNkZWZpbmUgdnA4X2lkY3RfaXdhbHNoMTYgdnA4X3Nob3J0X2ludl93YWxzaDR4NF92NgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIEhBVkVfQVJNVjcKLWV4dGVybiBwcm90b3R5cGVfaWRjdCh2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9pZGN0KHZwOF9zaG9ydF9pZGN0NHg0bGxtX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9pZGN0X3NjYWxhcl9hZGQodnA4X2RjX29ubHlfaWRjdF9hZGRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0X25lb24pOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X2lkY3RfaWRjdDEKLSNkZWZpbmUgdnA4X2lkY3RfaWRjdDEgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fMV9uZW9uCi0KLSN1bmRlZiAgdnA4X2lkY3RfaWRjdDE2Ci0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxNiB2cDhfc2hvcnRfaWRjdDR4NGxsbV9uZW9uCi0KLSN1bmRlZiAgdnA4X2lkY3RfaWRjdDFfc2NhbGFyX2FkZAotI2RlZmluZSB2cDhfaWRjdF9pZGN0MV9zY2FsYXJfYWRkIHZwOF9kY19vbmx5X2lkY3RfYWRkX25lb24KLQotI3VuZGVmICB2cDhfaWRjdF9pd2Fsc2gxCi0jZGVmaW5lIHZwOF9pZGN0X2l3YWxzaDEgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX25lb24KLQotI3VuZGVmICB2cDhfaWRjdF9pd2Fsc2gxNgotI2RlZmluZSB2cDhfaWRjdF9pd2Fsc2gxNiB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X25lb24KLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbG9vcGZpbHRlcl9hcm0uYyBiL3ZwOC9jb21tb24vYXJtL2xvb3BmaWx0ZXJfYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MzJhMDMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbG9vcGZpbHRlcl9hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAidnA4L2NvbW1vbi9sb29wZmlsdGVyLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKLQotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjYpOwotCi1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9uZW9uKTsKLQotZXh0ZXJuIGxvb3BfZmlsdGVyX3V2ZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9uZW9uOwotZXh0ZXJuIGxvb3BfZmlsdGVyX3V2ZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbjsKLWV4dGVybiBsb29wX2ZpbHRlcl91dmZ1bmN0aW9uIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9uZW9uOwotZXh0ZXJuIGxvb3BfZmlsdGVyX3V2ZnVuY3Rpb24gdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9uOwotCi0KLSNpZiBIQVZFX0FSTVY2Ci0vKkFSTVY2IGxvb3BmaWx0ZXIgZnVuY3Rpb25zKi8KLS8qIEhvcml6b250YWwgTUIgZmlsdGVyaW5nICovCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhfYXJtdjYodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHVfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYodl9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMSk7Ci19Ci0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaHNfYXJtdjYodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci19Ci0KLS8qIFZlcnRpY2FsIE1CIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X2FybXY2KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KHVfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KHZfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZzX2FybXY2KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHVfcHRyOwotICAgICh2b2lkKSB2X3B0cjsKLSAgICAodm9pZCkgdXZfc3RyaWRlOwotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjYoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfYXJtdjYodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYXJtdjYoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12Nih5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9hcm12Nih1X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2FybXY2KHZfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMSk7Ci19Ci0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2Joc19hcm12Nih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHVfcHRyOwotICAgICh2b2lkKSB2X3B0cjsKLSAgICAodm9pZCkgdXZfc3RyaWRlOwotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12Nih5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12Nih5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9hcm12Nih5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci19Ci0KLS8qIFZlcnRpY2FsIEIgRmlsdGVyaW5nICovCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9idl9hcm12Nih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYXJtdjYoeV9wdHIgKyA0LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2FybXY2KHlfcHRyICsgOCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih1X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9hcm12Nih2X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9idnNfYXJtdjYodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2FybXY2KHlfcHRyICsgNCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYXJtdjYoeV9wdHIgKyA4LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9hcm12Nih5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotI2VuZGlmCi0KLSNpZiBIQVZFX0FSTVY3Ci0vKiBORU9OIGxvb3BmaWx0ZXIgZnVuY3Rpb25zICovCi0vKiBIb3Jpem9udGFsIE1CIGZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX25lb24odW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb24oeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb24odV9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgdl9wdHIpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhzX25lb24odW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbmVvbih5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotCi0vKiBWZXJ0aWNhbCBNQiBGaWx0ZXJpbmcgKi8KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9uZW9uKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfbmVvbih5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb24odV9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgdl9wdHIpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZzX25lb24odW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb24oeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfbmVvbih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbih5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbih5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbih5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbih1X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIHZfcHRyICsgNCAqIHV2X3N0cmlkZSk7Ci19Ci0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2Joc19uZW9uKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbmVvbih5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9uZW9uKHlfcHRyICsgOCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX25lb24oeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotCi0vKiBWZXJ0aWNhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfbmVvbih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb24oeV9wdHIgKyA0LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfbmVvbih5X3B0ciArIDgsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uKHlfcHRyICsgMTIsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb24odV9wdHIgKyA0LCB1dl9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCB2X3B0ciArIDQpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9idnNfbmVvbih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9uZW9uKHlfcHRyICsgNCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbmVvbih5X3B0ciArIDgsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb24oeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbG9vcGZpbHRlcl9hcm0uaCBiL3ZwOC9jb21tb24vYXJtL2xvb3BmaWx0ZXJfYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjIyMDcuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbG9vcGZpbHRlcl9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIExPT1BGSUxURVJfQVJNX0gKLSNkZWZpbmUgTE9PUEZJTFRFUl9BUk1fSAotCi0jaWYgSEFWRV9BUk1WNgotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9tYnZfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9idl9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21iaF9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX2JoX2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfbWJ2c19hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX2J2c19hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21iaHNfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9iaHNfYXJtdjYpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9tYl92Ci0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfbWJfdiB2cDhfbG9vcF9maWx0ZXJfbWJ2X2FybXY2Ci0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9iX3YKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9iX3YgdnA4X2xvb3BfZmlsdGVyX2J2X2FybXY2Ci0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9tYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfbWJfaCB2cDhfbG9vcF9maWx0ZXJfbWJoX2FybXY2Ci0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9iX2gKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9iX2ggdnA4X2xvb3BfZmlsdGVyX2JoX2FybXY2Ci0KLSN1bmRlZiAgdnA4X2xmX3NpbXBsZV9tYl92Ci0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfbWJfdiB2cDhfbG9vcF9maWx0ZXJfbWJ2c19hcm12NgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfYl92Ci0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfYl92IHZwOF9sb29wX2ZpbHRlcl9idnNfYXJtdjYKLQotI3VuZGVmICB2cDhfbGZfc2ltcGxlX21iX2gKLSNkZWZpbmUgdnA4X2xmX3NpbXBsZV9tYl9oIHZwOF9sb29wX2ZpbHRlcl9tYmhzX2FybXY2Ci0KLSN1bmRlZiAgdnA4X2xmX3NpbXBsZV9iX2gKLSNkZWZpbmUgdnA4X2xmX3NpbXBsZV9iX2ggdnA4X2xvb3BfZmlsdGVyX2Joc19hcm12NgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIEhBVkVfQVJNVjcKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfbWJ2X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9idl9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfbWJoX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9iaF9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfbWJ2c19uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYnZzX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9tYmhzX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9iaHNfbmVvbik7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfbGZfbm9ybWFsX21iX3YKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9tYl92IHZwOF9sb29wX2ZpbHRlcl9tYnZfbmVvbgotCi0jdW5kZWYgIHZwOF9sZl9ub3JtYWxfYl92Ci0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfYl92IHZwOF9sb29wX2ZpbHRlcl9idl9uZW9uCi0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9tYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfbWJfaCB2cDhfbG9vcF9maWx0ZXJfbWJoX25lb24KLQotI3VuZGVmICB2cDhfbGZfbm9ybWFsX2JfaAotI2RlZmluZSB2cDhfbGZfbm9ybWFsX2JfaCB2cDhfbG9vcF9maWx0ZXJfYmhfbmVvbgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfbWJfdgotI2RlZmluZSB2cDhfbGZfc2ltcGxlX21iX3YgdnA4X2xvb3BfZmlsdGVyX21idnNfbmVvbgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfYl92Ci0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfYl92IHZwOF9sb29wX2ZpbHRlcl9idnNfbmVvbgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfbWJfaAotI2RlZmluZSB2cDhfbGZfc2ltcGxlX21iX2ggdnA4X2xvb3BfZmlsdGVyX21iaHNfbmVvbgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfYl9oCi0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfYl9oIHZwOF9sb29wX2ZpbHRlcl9iaHNfbmVvbgotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL2RjX29ubHlfaWRjdF9hZGRfbmVvbi5hc20gYi92cDgvY29tbW9uL2FybS9uZW9uL2RjX29ubHlfaWRjdF9hZGRfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YmEwNWYuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9kY19vbmx5X2lkY3RfYWRkX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgYW5kIHBhdGVudAotOyAgZ3JhbnQgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMKLTsgIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfZGNfb25seV9pZGN0X2FkZF9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTt2b2lkIHZwOF9kY19vbmx5X2lkY3RfYWRkX25lb24oc2hvcnQgaW5wdXRfZGMsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLCBpbnQgcGl0Y2gsIGludCBzdHJpZGUpCi07IHIwICBpbnB1dF9kYwotOyByMSAgcHJlZF9wdHIKLTsgcjIgIGRzdF9wdHIKLTsgcjMgIHBpdGNoCi07IHNwICBzdHJpZGUKLXx2cDhfZGNfb25seV9pZGN0X2FkZF9uZW9ufCBQUk9DCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzQKLSAgICBhc3IgICAgICAgICAgICAgcjAsIHIwLCAjMwotICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KLSAgICB2ZHVwLjE2ICAgICAgICAgcTAsIHIwCi0KLSAgICB2bGQxLjMyICAgICAgICAge2QyWzBdfSwgW3IxXSwgcjMKLSAgICB2bGQxLjMyICAgICAgICAge2QyWzFdfSwgW3IxXSwgcjMKLSAgICB2bGQxLjMyICAgICAgICAge2Q0WzBdfSwgW3IxXSwgcjMKLSAgICB2bGQxLjMyICAgICAgICAge2Q0WzFdfSwgW3IxXQotCi0gICAgdmFkZHcudTggICAgICAgIHExLCBxMCwgZDIKLSAgICB2YWRkdy51OCAgICAgICAgcTIsIHEwLCBkNAotCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMQotICAgIHZxbW92dW4uczE2ICAgICBkNCwgcTIKLQotICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjJdLCByMTIKLSAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgW3IyXSwgcjEyCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMl0sIHIxMgotICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMV19LCBbcjJdCi0KLSAgICBieCAgICAgICAgICAgICBscgotCi0gICAgRU5EUAotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9pd2Fsc2hfbmVvbi5hc20gYi92cDgvY29tbW9uL2FybS9uZW9uL2l3YWxzaF9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzYmYzOS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL2l3YWxzaF9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotICAgIEVYUE9SVCAgfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbmVvbnwKLSAgICBFWFBPUlQgIHx2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfbmVvbnwKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi0KLTtzaG9ydCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X25lb24oc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KQotfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbmVvbnwgUFJPQwotCi0gICAgOyByZWFkIGluIGFsbCBmb3VyIGxpbmVzIG9mIHZhbHVlczogZDAtPmQzCi0gICAgdmxkbS42NCByMCwge3EwLCBxMX0KLQotICAgIDsgZmlyc3QgZm9yIGxvb3AKLQotICAgIHZhZGQuczE2IGQ0LCBkMCwgZDMgO2EgPSBbMF0gKyBbMTJdCi0gICAgdmFkZC5zMTYgZDUsIGQxLCBkMiA7YiA9IFs0XSArIFs4XQotICAgIHZzdWIuczE2IGQ2LCBkMSwgZDIgO2MgPSBbNF0gLSBbOF0KLSAgICB2c3ViLnMxNiBkNywgZDAsIGQzIDtkID0gWzBdIC0gWzEyXQotCi0gICAgdmFkZC5zMTYgZDAsIGQ0LCBkNSA7YSArIGIKLSAgICB2YWRkLnMxNiBkMSwgZDYsIGQ3IDtjICsgZAotICAgIHZzdWIuczE2IGQyLCBkNCwgZDUgO2EgLSBiCi0gICAgdnN1Yi5zMTYgZDMsIGQ3LCBkNiA7ZCAtIGMKLQotICAgIHZ0cm4uMzIgZDAsIGQyIDtkMDogIDAgIDEgIDggIDkKLSAgICAgICAgICAgICAgICAgICA7ZDI6ICAyICAzIDEwIDExCi0gICAgdnRybi4zMiBkMSwgZDMgO2QxOiAgNCAgNSAxMiAxMwotICAgICAgICAgICAgICAgICAgIDtkMzogIDYgIDcgMTQgMTUKLQotICAgIHZ0cm4uMTYgZDAsIGQxIDtkMDogIDAgIDQgIDggMTIKLSAgICAgICAgICAgICAgICAgICA7ZDE6ICAxICA1ICA5IDEzCi0gICAgdnRybi4xNiBkMiwgZDMgO2QyOiAgMiAgNiAxMCAxNAotICAgICAgICAgICAgICAgICAgIDtkMzogIDMgIDcgMTEgMTUKLQotICAgIDsgc2Vjb25kIGZvciBsb29wCi0KLSAgICB2YWRkLnMxNiBkNCwgZDAsIGQzIDthID0gWzBdICsgWzNdCi0gICAgdmFkZC5zMTYgZDUsIGQxLCBkMiA7YiA9IFsxXSArIFsyXQotICAgIHZzdWIuczE2IGQ2LCBkMSwgZDIgO2MgPSBbMV0gLSBbMl0KLSAgICB2c3ViLnMxNiBkNywgZDAsIGQzIDtkID0gWzBdIC0gWzNdCi0KLSAgICB2YWRkLnMxNiBkMCwgZDQsIGQ1IDtlID0gYSArIGIKLSAgICB2YWRkLnMxNiBkMSwgZDYsIGQ3IDtmID0gYyArIGQKLSAgICB2c3ViLnMxNiBkMiwgZDQsIGQ1IDtnID0gYSAtIGIKLSAgICB2c3ViLnMxNiBkMywgZDcsIGQ2IDtoID0gZCAtIGMKLQotICAgIHZtb3YuaTE2IHEyLCAjMwotICAgIHZhZGQuaTE2IHEwLCBxMCwgcTIgO2UvZiArPSAzCi0gICAgdmFkZC5pMTYgcTEsIHExLCBxMiA7Zy9oICs9IDMKLQotICAgIHZzaHIuczE2IHEwLCBxMCwgIzMgO2UvZiA+PiAzCi0gICAgdnNoci5zMTYgcTEsIHExLCAjMyA7Zy9oID4+IDMKLQotICAgIHZ0cm4uMzIgZDAsIGQyCi0gICAgdnRybi4zMiBkMSwgZDMKLSAgICB2dHJuLjE2IGQwLCBkMQotICAgIHZ0cm4uMTYgZDIsIGQzCi0KLSAgICB2c3RtaWEuMTYgcjEhLCB7cTB9Ci0gICAgdnN0bWlhLjE2IHIxISwge3ExfQotCi0gICAgYnggbHIKLSAgICBFTkRQICAgIDsgfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbmVvbnwKLQotCi07c2hvcnQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX25lb24oc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0KQotfHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9uZW9ufCBQUk9DCi0gICAgOyBsb2FkIGEgZnVsbCBsaW5lIGludG8gYSBuZW9uIHJlZ2lzdGVyCi0gICAgdmxkMS4xNiAge3EwfSwgW3IwXQotICAgIDsgZXh0cmFjdCBmaXJzdCBlbGVtZW50IGFuZCByZXBsaWNhdGUKLSAgICB2ZHVwLjE2IHExLCBkMFswXQotICAgIDsgYWRkIDMgdG8gYWxsIHZhbHVlcwotICAgIHZtb3YuaTE2IHEyLCAjMwotICAgIHZhZGQuaTE2IHEzLCBxMSwgcTIKLSAgICA7IHJpZ2h0IHNoaWZ0Ci0gICAgdnNoci5zMTYgcTMsIHEzLCAjMwotICAgIDsgd3JpdGUgaXQgYmFjawotICAgIHZzdG1pYS4xNiByMSEsIHtxM30KLSAgICB2c3RtaWEuMTYgcjEhLCB7cTN9Ci0KLSAgICBieCBscgotICAgIEVORFAgICAgOyB8dnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX25lb258Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcl9uZW9uLmFzbSBiL3ZwOC9jb21tb24vYXJtL25lb24vbG9vcGZpbHRlcl9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3ODAxMy4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9uZW9ufAotICAgIEVYUE9SVCAgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbnwKLSAgICBFWFBPUlQgIHx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258Ci0gICAgRVhQT1JUICB8dnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTsgZmxpbWl0LCBsaW1pdCwgYW5kIHRocmVzaCBzaG91bGQgYmUgcG9zaXRpdmUgbnVtYmVycy4KLTsgQWxsIDE2IGVsZW1lbnRzIGluIHRoZXNlIHZhcmlhYmxlcyBhcmUgZXF1YWwuCi0KLTsgdm9pZCB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBwaXRjaCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkKLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjCi07IHIxICAgIGludCBwaXRjaAotOyByMiAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0Ci07IHIzICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdAotOyBzcCAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyBzcCs0ICBpbnQgY291bnQgKHVudXNlZCkKLXx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge2xyfQotICAgIHZsZDEuczggICAgIHtkMFtdLCBkMVtdfSwgW3IyXSAgICAgICAgICA7IGZsaW1pdAotICAgIHZsZDEuczggICAgIHtkMltdLCBkM1tdfSwgW3IzXSAgICAgICAgICA7IGxpbWl0Ci0gICAgc3ViICAgICAgICAgcjIsIHIwLCByMSwgbHNsICMyICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgbGluZXMKLSAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaCBwb2ludGVyCi0KLSAgICB2bGQxLnU4ICAgICB7cTN9LCBbcjJdLCByMSAgICAgICAgICAgICAgOyBwMwotICAgIHZsZDEudTggICAgIHtxNH0sIFtyMl0sIHIxICAgICAgICAgICAgICA7IHAyCi0gICAgdmxkMS51OCAgICAge3E1fSwgW3IyXSwgcjEgICAgICAgICAgICAgIDsgcDEKLSAgICB2bGQxLnU4ICAgICB7cTZ9LCBbcjJdLCByMSAgICAgICAgICAgICAgOyBwMAotICAgIHZsZDEudTggICAgIHtxN30sIFtyMl0sIHIxICAgICAgICAgICAgICA7IHEwCi0gICAgdmxkMS51OCAgICAge3E4fSwgW3IyXSwgcjEgICAgICAgICAgICAgIDsgcTEKLSAgICB2bGQxLnU4ICAgICB7cTl9LCBbcjJdLCByMSAgICAgICAgICAgICAgOyBxMgotICAgIHZsZDEudTggICAgIHtxMTB9LCBbcjJdICAgICAgICAgICAgICAgICA7IHEzCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjEyXSAgICAgICAgIDsgdGhyZXNoCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCi0KLSAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbmVvbgotCi0gICAgdnN0MS51OCAgICAge3E1fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgc3RvcmUgb3AxCi0gICAgdnN0MS51OCAgICAge3E2fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgc3RvcmUgb3AwCi0gICAgdnN0MS51OCAgICAge3E3fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgc3RvcmUgb3EwCi0gICAgdnN0MS51OCAgICAge3E4fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgc3RvcmUgb3ExCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtwY30KLSAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwKLQotOyB2b2lkIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbih1bnNpZ25lZCBjaGFyICp1LCBpbnQgcGl0Y2gKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2KQotOyByMCAgICB1bnNpZ25lZCBjaGFyICp1LAotOyByMSAgICBpbnQgcGl0Y2gsCi07IHIyICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCi07IHIzICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLTsgc3AgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgc3ArNCAgdW5zaWduZWQgY2hhciAqdgotfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge2xyfQotICAgIHZsZDEuczggICAgIHtkMFtdLCBkMVtdfSwgW3IyXSAgICAgICAgICA7IGZsaW1pdAotICAgIHZsZDEuczggICAgIHtkMltdLCBkM1tdfSwgW3IzXSAgICAgICAgICA7IGxpbWl0Ci0gICAgbGRyICAgICAgICAgcjIsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgbG9hZCB2IHB0cgotCi0gICAgc3ViICAgICAgICAgcjMsIHIwLCByMSwgbHNsICMyICAgICAgICAgIDsgbW92ZSB1IHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0gICAgdmxkMS51OCAgICAge2Q2fSwgW3IzXSwgcjEgICAgICAgICAgICAgIDsgcDMKLSAgICB2bGQxLnU4ICAgICB7ZDh9LCBbcjNdLCByMSAgICAgICAgICAgICAgOyBwMgotICAgIHZsZDEudTggICAgIHtkMTB9LCBbcjNdLCByMSAgICAgICAgICAgICA7IHAxCi0gICAgdmxkMS51OCAgICAge2QxMn0sIFtyM10sIHIxICAgICAgICAgICAgIDsgcDAKLSAgICB2bGQxLnU4ICAgICB7ZDE0fSwgW3IzXSwgcjEgICAgICAgICAgICAgOyBxMAotICAgIHZsZDEudTggICAgIHtkMTZ9LCBbcjNdLCByMSAgICAgICAgICAgICA7IHExCi0gICAgdmxkMS51OCAgICAge2QxOH0sIFtyM10sIHIxICAgICAgICAgICAgIDsgcTIKLSAgICB2bGQxLnU4ICAgICB7ZDIwfSwgW3IzXSAgICAgICAgICAgICAgICAgOyBxMwotCi0gICAgbGRyICAgICAgICAgcjMsIFtzcCwgIzRdICAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggcG9pbnRlcgotCi0gICAgc3ViICAgICAgICAgcjEyLCByMiwgcjEsIGxzbCAjMiAgICAgICAgIDsgbW92ZSB2IHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0gICAgdmxkMS51OCAgICAge2Q3fSwgW3IxMl0sIHIxICAgICAgICAgICAgIDsgcDMKLSAgICB2bGQxLnU4ICAgICB7ZDl9LCBbcjEyXSwgcjEgICAgICAgICAgICAgOyBwMgotICAgIHZsZDEudTggICAgIHtkMTF9LCBbcjEyXSwgcjEgICAgICAgICAgICA7IHAxCi0gICAgdmxkMS51OCAgICAge2QxM30sIFtyMTJdLCByMSAgICAgICAgICAgIDsgcDAKLSAgICB2bGQxLnU4ICAgICB7ZDE1fSwgW3IxMl0sIHIxICAgICAgICAgICAgOyBxMAotICAgIHZsZDEudTggICAgIHtkMTd9LCBbcjEyXSwgcjEgICAgICAgICAgICA7IHExCi0gICAgdmxkMS51OCAgICAge2QxOX0sIFtyMTJdLCByMSAgICAgICAgICAgIDsgcTIKLSAgICB2bGQxLnU4ICAgICB7ZDIxfSwgW3IxMl0gICAgICAgICAgICAgICAgOyBxMwotCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjNdICAgICAgICAgIDsgdGhyZXNoCi0KLSAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbmVvbgotCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCi0gICAgc3ViICAgICAgICAgcjIsIHIyLCByMSwgbHNsICMxCi0KLSAgICB2c3QxLnU4ICAgICB7ZDEwfSwgW3IwXSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB1IG9wMQotICAgIHZzdDEudTggICAgIHtkMTF9LCBbcjJdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHYgb3AxCi0gICAgdnN0MS51OCAgICAge2QxMn0sIFtyMF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdSBvcDAKLSAgICB2c3QxLnU4ICAgICB7ZDEzfSwgW3IyXSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB2IG9wMAotICAgIHZzdDEudTggICAgIHtkMTR9LCBbcjBdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHUgb3EwCi0gICAgdnN0MS51OCAgICAge2QxNX0sIFtyMl0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdiBvcTAKLSAgICB2c3QxLnU4ICAgICB7ZDE2fSwgW3IwXSAgICAgICAgICAgICAgICAgOyBzdG9yZSB1IG9xMQotICAgIHZzdDEudTggICAgIHtkMTd9LCBbcjJdICAgICAgICAgICAgICAgICA7IHN0b3JlIHYgb3ExCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtwY30KLSAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb258Ci0KLTsgdm9pZCB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmMsCi07IHIxICAgIGludCBwaXRjaCwKLTsgcjIgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgcjMgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyBzcCAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyBzcCs0ICBpbnQgY291bnQgKHVudXNlZCkKLXx2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258IFBST0MKLSAgICBzdG1kYiAgICAgICBzcCEsIHtscn0KLSAgICB2bGQxLnM4ICAgICB7ZDBbXSwgZDFbXX0sIFtyMl0gICAgICAgICAgOyBmbGltaXQKLSAgICB2bGQxLnM4ICAgICB7ZDJbXSwgZDNbXX0sIFtyM10gICAgICAgICAgOyBsaW1pdAotICAgIHN1YiAgICAgICAgIHIyLCByMCwgIzQgICAgICAgICAgICAgICAgICA7IHNyYyBwdHIgZG93biBieSA0IGNvbHVtbnMKLSAgICBzdWIgICAgICAgICByMCwgcjAsICMyICAgICAgICAgICAgICAgICAgOyBkc3QgcHRyCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggcG9pbnRlcgotCi0gICAgdmxkMS51OCAgICAge2Q2fSwgW3IyXSwgcjEgICAgICAgICAgICAgIDsgbG9hZCBmaXJzdCA4LWxpbmUgc3JjIGRhdGEKLSAgICB2bGQxLnU4ICAgICB7ZDh9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTB9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTJ9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTR9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTZ9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTh9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMjB9LCBbcjJdLCByMQotCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjEyXSAgICAgICAgIDsgdGhyZXNoCi0KLSAgICB2bGQxLnU4ICAgICB7ZDd9LCBbcjJdLCByMSAgICAgICAgICAgICAgOyBsb2FkIHNlY29uZCA4LWxpbmUgc3JjIGRhdGEKLSAgICB2bGQxLnU4ICAgICB7ZDl9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTF9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTN9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTV9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTd9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTl9LCBbcjJdLCByMQotICAgIHZsZDEudTggICAgIHtkMjF9LCBbcjJdCi0KLSAgICA7dHJhbnNwb3NlIHRvIDh4MTYgbWF0cml4Ci0gICAgdnRybi4zMiAgICAgcTMsIHE3Ci0gICAgdnRybi4zMiAgICAgcTQsIHE4Ci0gICAgdnRybi4zMiAgICAgcTUsIHE5Ci0gICAgdnRybi4zMiAgICAgcTYsIHExMAotCi0gICAgdnRybi4xNiAgICAgcTMsIHE1Ci0gICAgdnRybi4xNiAgICAgcTQsIHE2Ci0gICAgdnRybi4xNiAgICAgcTcsIHE5Ci0gICAgdnRybi4xNiAgICAgcTgsIHExMAotCi0gICAgdnRybi44ICAgICAgcTMsIHE0Ci0gICAgdnRybi44ICAgICAgcTUsIHE2Ci0gICAgdnRybi44ICAgICAgcTcsIHE4Ci0gICAgdnRybi44ICAgICAgcTksIHExMAotCi0gICAgYmwgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX25lb24KLQotICAgIHZzd3AgICAgICAgIGQxMiwgZDExCi0gICAgdnN3cCAgICAgICAgZDE2LCBkMTMKLSAgICB2c3dwICAgICAgICBkMTQsIGQxMgotICAgIHZzd3AgICAgICAgIGQxNiwgZDE1Ci0KLSAgICA7c3RvcmUgb3AxLCBvcDAsIG9xMCwgb3ExCi0gICAgdnN0NC44ICAgICAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFsxXSwgZDExWzFdLCBkMTJbMV0sIGQxM1sxXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFsyXSwgZDExWzJdLCBkMTJbMl0sIGQxM1syXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFszXSwgZDExWzNdLCBkMTJbM10sIGQxM1szXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs0XSwgZDExWzRdLCBkMTJbNF0sIGQxM1s0XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs1XSwgZDExWzVdLCBkMTJbNV0sIGQxM1s1XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs2XSwgZDExWzZdLCBkMTJbNl0sIGQxM1s2XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs3XSwgZDExWzddLCBkMTJbN10sIGQxM1s3XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFswXSwgZDE1WzBdLCBkMTZbMF0sIGQxN1swXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFsxXSwgZDE1WzFdLCBkMTZbMV0sIGQxN1sxXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFsyXSwgZDE1WzJdLCBkMTZbMl0sIGQxN1syXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFszXSwgZDE1WzNdLCBkMTZbM10sIGQxN1szXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs0XSwgZDE1WzRdLCBkMTZbNF0sIGQxN1s0XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs1XSwgZDE1WzVdLCBkMTZbNV0sIGQxN1s1XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs2XSwgZDE1WzZdLCBkMTZbNl0sIGQxN1s2XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs3XSwgZDE1WzddLCBkMTZbN10sIGQxN1s3XX0sIFtyMF0KLQotICAgIGxkbWlhICAgICAgIHNwISwge3BjfQotICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfbmVvbnwKLQotOyB2b2lkIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb24odW5zaWduZWQgY2hhciAqdSwgaW50IHBpdGNoCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnYpCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgKnUsCi07IHIxICAgIGludCBwaXRjaCwKLTsgcjIgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgcjMgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyBzcCAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyBzcCs0ICB1bnNpZ25lZCBjaGFyICp2Ci18dnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge2xyfQotICAgIHN1YiAgICAgICAgIHIxMiwgcjAsICM0ICAgICAgICAgICAgICAgICAgOyBtb3ZlIHUgcG9pbnRlciBkb3duIGJ5IDQgY29sdW1ucwotICAgIHZsZDEuczggICAgIHtkMFtdLCBkMVtdfSwgW3IyXSAgICAgICAgICA7IGZsaW1pdAotICAgIHZsZDEuczggICAgIHtkMltdLCBkM1tdfSwgW3IzXSAgICAgICAgICA7IGxpbWl0Ci0KLSAgICBsZHIgICAgICAgICByMiwgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBsb2FkIHYgcHRyCi0KLSAgICB2bGQxLnU4ICAgICB7ZDZ9LCBbcjEyXSwgcjEgICAgICAgICAgICAgIDtsb2FkIHUgZGF0YQotICAgIHZsZDEudTggICAgIHtkOH0sIFtyMTJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTB9LCBbcjEyXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDEyfSwgW3IxMl0sIHIxCi0gICAgdmxkMS51OCAgICAge2QxNH0sIFtyMTJdLCByMQotICAgIHZsZDEudTggICAgIHtkMTZ9LCBbcjEyXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE4fSwgW3IxMl0sIHIxCi0gICAgdmxkMS51OCAgICAge2QyMH0sIFtyMTJdCi0KLSAgICBzdWIgICAgICAgICByMywgcjIsICM0ICAgICAgICAgICAgICAgICAgOyBtb3ZlIHYgcG9pbnRlciBkb3duIGJ5IDQgY29sdW1ucwotICAgIHZsZDEudTggICAgIHtkN30sIFtyM10sIHIxICAgICAgICAgICAgICA7bG9hZCB2IGRhdGEKLSAgICB2bGQxLnU4ICAgICB7ZDl9LCBbcjNdLCByMQotICAgIHZsZDEudTggICAgIHtkMTF9LCBbcjNdLCByMQotICAgIHZsZDEudTggICAgIHtkMTN9LCBbcjNdLCByMQotICAgIHZsZDEudTggICAgIHtkMTV9LCBbcjNdLCByMQotICAgIHZsZDEudTggICAgIHtkMTd9LCBbcjNdLCByMQotICAgIHZsZDEudTggICAgIHtkMTl9LCBbcjNdLCByMQotICAgIHZsZDEudTggICAgIHtkMjF9LCBbcjNdCi0KLSAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBsb2FkIHRocmVzaCBwb2ludGVyCi0KLSAgICA7dHJhbnNwb3NlIHRvIDh4MTYgbWF0cml4Ci0gICAgdnRybi4zMiAgICAgcTMsIHE3Ci0gICAgdnRybi4zMiAgICAgcTQsIHE4Ci0gICAgdnRybi4zMiAgICAgcTUsIHE5Ci0gICAgdnRybi4zMiAgICAgcTYsIHExMAotCi0gICAgdnRybi4xNiAgICAgcTMsIHE1Ci0gICAgdnRybi4xNiAgICAgcTQsIHE2Ci0gICAgdnRybi4xNiAgICAgcTcsIHE5Ci0gICAgdnRybi4xNiAgICAgcTgsIHExMAotCi0gICAgdnRybi44ICAgICAgcTMsIHE0Ci0gICAgdnRybi44ICAgICAgcTUsIHE2Ci0gICAgdnRybi44ICAgICAgcTcsIHE4Ci0gICAgdnRybi44ICAgICAgcTksIHExMAotCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjEyXSAgICAgICAgIDsgdGhyZXNoCi0KLSAgICBibCAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfbmVvbgotCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCAjMgotICAgIHN1YiAgICAgICAgIHIyLCByMiwgIzIKLQotICAgIHZzd3AgICAgICAgIGQxMiwgZDExCi0gICAgdnN3cCAgICAgICAgZDE2LCBkMTMKLSAgICB2c3dwICAgICAgICBkMTQsIGQxMgotICAgIHZzd3AgICAgICAgIGQxNiwgZDE1Ci0KLSAgICA7c3RvcmUgb3AxLCBvcDAsIG9xMCwgb3ExCi0gICAgdnN0NC44ICAgICAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFswXSwgZDE1WzBdLCBkMTZbMF0sIGQxN1swXX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFsxXSwgZDExWzFdLCBkMTJbMV0sIGQxM1sxXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFsxXSwgZDE1WzFdLCBkMTZbMV0sIGQxN1sxXX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFsyXSwgZDExWzJdLCBkMTJbMl0sIGQxM1syXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFsyXSwgZDE1WzJdLCBkMTZbMl0sIGQxN1syXX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFszXSwgZDExWzNdLCBkMTJbM10sIGQxM1szXX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFszXSwgZDE1WzNdLCBkMTZbM10sIGQxN1szXX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs0XSwgZDExWzRdLCBkMTJbNF0sIGQxM1s0XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs0XSwgZDE1WzRdLCBkMTZbNF0sIGQxN1s0XX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs1XSwgZDExWzVdLCBkMTJbNV0sIGQxM1s1XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs1XSwgZDE1WzVdLCBkMTZbNV0sIGQxN1s1XX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs2XSwgZDExWzZdLCBkMTJbNl0sIGQxM1s2XX0sIFtyMF0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxNFs2XSwgZDE1WzZdLCBkMTZbNl0sIGQxN1s2XX0sIFtyMl0sIHIxCi0gICAgdnN0NC44ICAgICAge2QxMFs3XSwgZDExWzddLCBkMTJbN10sIGQxM1s3XX0sIFtyMF0KLSAgICB2c3Q0LjggICAgICB7ZDE0WzddLCBkMTVbN10sIGQxNls3XSwgZDE3WzddfSwgW3IyXQotCi0gICAgbGRtaWEgICAgICAgc3AhLCB7cGN9Ci0gICAgRU5EUCAgICAgICAgOyB8dnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfbmVvbnwKLQotOyB2b2lkIHZwOF9sb29wX2ZpbHRlcl9uZW9uKCk7Ci07IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBsb29wZmlsdGVycy4gVGhlIGludmlkdWFsIGZ1bmN0aW9ucyBkbyB0aGUKLTsgbmVjZXNzYXJ5IGxvYWQsIHRyYW5zcG9zZSAoaWYgbmVjZXNzYXJ5KSBhbmQgc3RvcmUuCi0KLTsgcjAtcjMgUFJFU0VSVkUKLTsgcTAgICAgZmxpbWl0Ci07IHExICAgIGxpbWl0Ci07IHEyICAgIHRocmVzaAotOyBxMyAgICBwMwotOyBxNCAgICBwMgotOyBxNSAgICBwMQotOyBxNiAgICBwMAotOyBxNyAgICBxMAotOyBxOCAgICBxMQotOyBxOSAgICBxMgotOyBxMTAgICBxMwotfHZwOF9sb29wX2ZpbHRlcl9uZW9ufCBQUk9DCi0gICAgYWRyICAgICAgICAgcjEyLCBsZl9jb2VmZgotCi0gICAgOyB2cDhfZmlsdGVyX21hc2sKLSAgICB2YWJkLnU4ICAgICBxMTEsIHEzLCBxNCAgICAgICAgICAgICAgICAgOyBhYnMocDMgLSBwMikKLSAgICB2YWJkLnU4ICAgICBxMTIsIHE0LCBxNSAgICAgICAgICAgICAgICAgOyBhYnMocDIgLSBwMSkKLSAgICB2YWJkLnU4ICAgICBxMTMsIHE1LCBxNiAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBwMCkKLSAgICB2YWJkLnU4ICAgICBxMTQsIHE4LCBxNyAgICAgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkKLSAgICB2YWJkLnU4ICAgICBxMywgcTksIHE4ICAgICAgICAgICAgICAgICAgOyBhYnMocTIgLSBxMSkKLSAgICB2YWJkLnU4ICAgICBxNCwgcTEwLCBxOSAgICAgICAgICAgICAgICAgOyBhYnMocTMgLSBxMikKLSAgICB2YWJkLnU4ICAgICBxOSwgcTYsIHE3ICAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKLQotICAgIHZtYXgudTggICAgIHExMSwgcTExLCBxMTIKLSAgICB2bWF4LnU4ICAgICBxMTIsIHExMywgcTE0Ci0gICAgdm1heC51OCAgICAgcTMsIHEzLCBxNAotICAgIHZtYXgudTggICAgIHExNSwgcTExLCBxMTIKLQotICAgIDsgdnA4X2hldm1hc2sKLSAgICB2Y2d0LnU4ICAgICBxMTMsIHExMywgcTIgICAgICAgICAgICAgICAgOyAoYWJzKHAxIC0gcDApID4gdGhyZXNoKSotMQotICAgIHZjZ3QudTggICAgIHExNCwgcTE0LCBxMiAgICAgICAgICAgICAgICA7IChhYnMocTEgLSBxMCkgPiB0aHJlc2gpKi0xCi0gICAgdm1heC51OCAgICAgcTE1LCBxMTUsIHEzCi0KLSAgICB2YWRkLnU4ICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyCi0gICAgdmFkZC51OCAgICAgcTAsIHEwLCBxMSAgICAgICAgICAgICAgICAgIDsgZmxpbWl0ICogMiArIGxpbWl0Ci0gICAgdmNnZS51OCAgICAgcTE1LCBxMSwgcTE1Ci0KLSAgICB2YWJkLnU4ICAgICBxMiwgcTUsIHE4ICAgICAgICAgICAgICAgICAgOyBhID0gYWJzKHAxIC0gcTEpCi0gICAgdnFhZGQudTggICAgcTksIHE5LCBxOSAgICAgICAgICAgICAgICAgIDsgYiA9IGFicyhwMCAtIHEwKSAqIDIKLSAgICB2c2hyLnU4ICAgICBxMiwgcTIsICMxICAgICAgICAgICAgICAgICAgOyBhID0gYSAvIDIKLSAgICB2cWFkZC51OCAgICBxOSwgcTksIHEyICAgICAgICAgICAgICAgICAgOyBhID0gYiArIGEKLSAgICB2Y2dlLnU4ICAgICBxOSwgcTAsIHE5ICAgICAgICAgICAgICAgICAgOyAoYSA+IGZsaW1pdCAqIDIgKyBsaW1pdCkgKiAtMQotCi0gICAgdmxkMS51OCAgICAge3EwfSwgW3IxMl0hCi0KLSAgICA7IHZwOF9maWx0ZXIoKSBmdW5jdGlvbgotICAgIDsgY29udmVydCB0byBzaWduZWQKLSAgICB2ZW9yICAgICAgICBxNywgcTcsIHEwICAgICAgICAgICAgICAgICAgOyBxczAKLSAgICB2ZW9yICAgICAgICBxNiwgcTYsIHEwICAgICAgICAgICAgICAgICAgOyBwczAKLSAgICB2ZW9yICAgICAgICBxNSwgcTUsIHEwICAgICAgICAgICAgICAgICAgOyBwczEKLSAgICB2ZW9yICAgICAgICBxOCwgcTgsIHEwICAgICAgICAgICAgICAgICAgOyBxczEKLQotICAgIHZsZDEudTggICAgIHtxMTB9LCBbcjEyXSEKLQotICAgIHZzdWJsLnM4ICAgIHEyLCBkMTQsIGQxMiAgICAgICAgICAgICAgICA7ICggcXMwIC0gcHMwKQotICAgIHZzdWJsLnM4ICAgIHExMSwgZDE1LCBkMTMKLQotICAgIHZtb3ZsLnU4ICAgIHE0LCBkMjAKLQotICAgIHZxc3ViLnM4ICAgIHExLCBxNSwgcTggICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSBjbGFtcChwczEtcXMxKQotICAgIHZvcnIgICAgICAgIHExNCwgcTEzLCBxMTQgICAgICAgICAgICAgICA7IHZwOF9oZXZtYXNrCi0KLSAgICB2bXVsLmkxNiAgICBxMiwgcTIsIHE0ICAgICAgICAgICAgICAgICAgOyAzICogKCBxczAgLSBwczApCi0gICAgdm11bC5pMTYgICAgcTExLCBxMTEsIHE0Ci0KLSAgICB2YW5kICAgICAgICBxMSwgcTEsIHExNCAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IGhldgotICAgIHZhbmQgICAgICAgIHExNSwgcTE1LCBxOSAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXJfbWFzawotCi0gICAgdmFkZHcuczggICAgcTIsIHEyLCBkMgotICAgIHZhZGR3LnM4ICAgIHExMSwgcTExLCBkMwotCi0gICAgdmxkMS51OCAgICAge3E5fSwgW3IxMl0hCi0KLSAgICA7IHZwOF9maWx0ZXIgPSBjbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKLSAgICB2cW1vdm4uczE2ICBkMiwgcTIKLSAgICB2cW1vdm4uczE2ICBkMywgcTExCi0gICAgdmFuZCAgICAgICAgcTEsIHExLCBxMTUgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrCi0KLSAgICB2cWFkZC5zOCAgICBxMiwgcTEsIHExMCAgICAgICAgICAgICAgICAgOyBGaWx0ZXIyID0gY2xhbXAodnA4X2ZpbHRlciszKQotICAgIHZxYWRkLnM4ICAgIHExLCBxMSwgcTkgICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPSBjbGFtcCh2cDhfZmlsdGVyKzQpCi0gICAgdnNoci5zOCAgICAgcTIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMwotICAgIHZzaHIuczggICAgIHExLCBxMSwgIzMgICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKLQotICAgIHZxYWRkLnM4ICAgIHExMSwgcTYsIHEyICAgICAgICAgICAgICAgICA7IHUgPSBjbGFtcChwczAgKyBGaWx0ZXIyKQotICAgIHZxc3ViLnM4ICAgIHExMCwgcTcsIHExICAgICAgICAgICAgICAgICA7IHUgPSBjbGFtcChxczAgLSBGaWx0ZXIxKQotCi0gICAgOyBvdXRlciB0YXAgYWRqdXN0bWVudHM6ICsrdnA4X2ZpbHRlciA+PiAxCi0gICAgdnJzaHIuczggICAgcTEsIHExLCAjMQotICAgIHZiaWMgICAgICAgIHExLCBxMSwgcTE0ICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gfmhldgotCi0gICAgdnFhZGQuczggICAgcTEzLCBxNSwgcTEgICAgICAgICAgICAgICAgIDsgdSA9IGNsYW1wKHBzMSArIHZwOF9maWx0ZXIpCi0gICAgdnFzdWIuczggICAgcTEyLCBxOCwgcTEgICAgICAgICAgICAgICAgIDsgdSA9IGNsYW1wKHFzMSAtIHZwOF9maWx0ZXIpCi0KLSAgICB2ZW9yICAgICAgICBxNSwgcTEzLCBxMCAgICAgICAgICAgICAgICAgOyAqb3AxID0gdV4weDgwCi0gICAgdmVvciAgICAgICAgcTYsIHExMSwgcTAgICAgICAgICAgICAgICAgIDsgKm9wMCA9IHVeMHg4MAotICAgIHZlb3IgICAgICAgIHE3LCBxMTAsIHEwICAgICAgICAgICAgICAgICA7ICpvcTAgPSB1XjB4ODAKLSAgICB2ZW9yICAgICAgICBxOCwgcTEyLCBxMCAgICAgICAgICAgICAgICAgOyAqb3ExID0gdV4weDgwCi0KLSAgICBieCAgICAgICAgICBscgotICAgIEVORFAgICAgICAgIDsgfHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9uZW9ufAotCi07LS0tLS0tLS0tLS0tLS0tLS0KLQotbGZfY29lZmYKLSAgICBEQ0QgICAgIDB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ODA4MDgwODAKLSAgICBEQ0QgICAgIDB4MDMwMzAzMDMsIDB4MDMwMzAzMDMsIDB4MDMwMzAzMDMsIDB4MDMwMzAzMDMKLSAgICBEQ0QgICAgIDB4MDQwNDA0MDQsIDB4MDQwNDA0MDQsIDB4MDQwNDA0MDQsIDB4MDQwNDA0MDQKLSAgICBEQ0QgICAgIDB4MDEwMTAxMDEsIDB4MDEwMTAxMDEsIDB4MDEwMTAxMDEsIDB4MDEwMTAxMDEKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyc2ltcGxlaG9yaXpvbnRhbGVkZ2VfbmVvbi5hc20gYi92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGVob3Jpem9udGFsZWRnZV9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzNzEwZC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGVob3Jpem9udGFsZWRnZV9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07Tm90ZTogZmxpbWl0LCBsaW1pdCwgYW5kIHRocmVzaCBzaHB1bGQgYmUgcG9zaXRpdmUgbnVtYmVycy4gQWxsIDE2IGVsZW1lbnRzIGluIGZsaW1pdAotO2FyZSBlcXVhbC4gU28sIGluIHRoZSBjb2RlLCBvbmx5IG9uZSBsb2FkIGlzIG5lZWRlZAotO2ZvciBmbGltaXQuIFNhbWUgd2F5IGFwcGxpZXMgdG8gbGltaXQgYW5kIHRocmVzaC4KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqcywKLTsgcjEgICAgaW50IHAsIC8vcGl0Y2gKLTsgcjIgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgcjMgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyBzdGFjayhyNCkgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgLy9zdGFjayhyNSkgICBpbnQgY291bnQgLS11bnVzZWQKLQotfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX25lb258IFBST0MKLSAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEgICAgICAgICAgOyBtb3ZlIHNyYyBwb2ludGVyIGRvd24gYnkgMiBsaW5lcwotCi0gICAgYWRyICAgICAgICAgcjEyLCBsZmh5X2NvZWZmCi0gICAgdmxkMS51OCAgICAge3E1fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgcDEKLSAgICB2bGQxLnM4ICAgICB7ZDJbXSwgZDNbXX0sIFtyMl0gICAgICAgICAgOyBmbGltaXQKLSAgICB2bGQxLnM4ICAgICB7ZDI2W10sIGQyN1tdfSwgW3IzXSAgICAgICAgOyBsaW1pdCAtPiBxMTMKLSAgICB2bGQxLnU4ICAgICB7cTZ9LCBbcjBdLCByMSAgICAgICAgICAgICAgOyBwMAotICAgIHZsZDEudTggICAgIHtxMH0sIFtyMTJdISAgICAgICAgICAgICAgICA7IDB4ODAKLSAgICB2bGQxLnU4ICAgICB7cTd9LCBbcjBdLCByMSAgICAgICAgICAgICAgOyBxMAotICAgIHZsZDEudTggICAgIHtxMTB9LCBbcjEyXSEgICAgICAgICAgICAgICA7IDB4MDMKLSAgICB2bGQxLnU4ICAgICB7cTh9LCBbcjBdICAgICAgICAgICAgICAgICAgOyBxMQotCi0gICAgO3ZwOF9maWx0ZXJfbWFzaygpIGZ1bmN0aW9uCi0gICAgdmFiZC51OCAgICAgcTE1LCBxNiwgcTcgICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCi0gICAgdmFiZC51OCAgICAgcTE0LCBxNSwgcTggICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcTEpCi0gICAgdnFhZGQudTggICAgcTE1LCBxMTUsIHExNSAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICogMgotICAgIHZzaHIudTggICAgIHExNCwgcTE0LCAjMSAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKSAvIDIKLSAgICB2cWFkZC51OCAgICBxMTUsIHExNSwgcTE0ICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkgKiAyICsgYWJzKHAxIC0gcTEpIC8gMgotCi0gICAgO3ZwOF9maWx0ZXIoKSBmdW5jdGlvbgotICAgIHZlb3IgICAgICAgIHE3LCBxNywgcTAgICAgICAgICAgICAgICAgICA7IHFzMDogcTAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLSAgICB2ZW9yICAgICAgICBxNiwgcTYsIHEwICAgICAgICAgICAgICAgICAgOyBwczA6IHAwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0gICAgdmVvciAgICAgICAgcTUsIHE1LCBxMCAgICAgICAgICAgICAgICAgIDsgcHMxOiBwMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotICAgIHZlb3IgICAgICAgIHE4LCBxOCwgcTAgICAgICAgICAgICAgICAgICA7IHFzMTogcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLQotICAgIHZhZGQudTggICAgIHExLCBxMSwgcTEgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIKLSAgICB2YWRkLnU4ICAgICBxMSwgcTEsIHExMyAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQKLSAgICB2Y2dlLnU4ICAgICBxMTUsIHExLCBxMTUgICAgICAgICAgICAgICAgOyAoYWJzKHAwIC0gcTApKjIgKyBhYnMocDEtcTEpLzIgPiBmbGltaXQqMiArIGxpbWl0KSotMQotCi07Ozs7Ozs7Ozs7Ci0gICAgO3Zxc3ViLnM4ICAgcTIsIHE3LCBxNiAgICAgICAgICAgICAgICAgIDsgKCBxczAgLSBwczApCi0gICAgdnN1YmwuczggICAgcTIsIGQxNCwgZDEyICAgICAgICAgICAgICAgIDsgKCBxczAgLSBwczApCi0gICAgdnN1YmwuczggICAgcTMsIGQxNSwgZDEzCi0KLSAgICB2cXN1Yi5zOCAgICBxNCwgcTUsIHE4ICAgICAgICAgICAgICAgICAgOyBxNDogdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEtcXMxKQotCi0gICAgO3ZtdWwuaTggICAgcTIsIHEyLCBxMTAgICAgICAgICAgICAgICAgIDsgIDMgKiAoIHFzMCAtIHBzMCkKLSAgICB2YWRkLnMxNiAgICBxMTEsIHEyLCBxMiAgICAgICAgICAgICAgICAgOyAgMyAqICggcXMwIC0gcHMwKQotICAgIHZhZGQuczE2ICAgIHExMiwgcTMsIHEzCi0KLSAgICB2bGQxLnU4ICAgICB7cTl9LCBbcjEyXSEgICAgICAgICAgICAgICAgOyAweDA0Ci0KLSAgICB2YWRkLnMxNiAgICBxMiwgcTIsIHExMQotICAgIHZhZGQuczE2ICAgIHEzLCBxMywgcTEyCi0KLSAgICB2YWRkdy5zOCAgICBxMiwgcTIsIGQ4ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKQotICAgIHZhZGR3LnM4ICAgIHEzLCBxMywgZDkKLQotICAgIDt2cWFkZC5zOCAgIHE0LCBxNCwgcTIgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkpCi0gICAgdnFtb3ZuLnMxNiAgZDgsIHEyICAgICAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKLSAgICB2cW1vdm4uczE2ICBkOSwgcTMKLTs7Ozs7Ozs7Ozs7OzsKLQotICAgIHZhbmQgICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgJj0gbWFzawotCi0gICAgdnFhZGQuczggICAgcTIsIHE0LCBxMTAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyKzMpCi0gICAgdnFhZGQuczggICAgcTQsIHE0LCBxOSAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyKzQpCi0gICAgdnNoci5zOCAgICAgcTIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0gMwotICAgIHZzaHIuczggICAgIHE0LCBxNCwgIzMgICAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPj49IDMKLQotICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQotCi0gICAgO2NhbGN1bGF0ZSBvdXRwdXQKLSAgICB2cWFkZC5zOCAgICBxMTEsIHE2LCBxMiAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIEZpbHRlcjIpCi0gICAgdnFzdWIuczggICAgcTEwLCBxNywgcTQgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSBGaWx0ZXIxKQotCi0gICAgYWRkICAgICAgICAgcjMsIHIwLCByMQotCi0gICAgdmVvciAgICAgICAgcTYsIHExMSwgcTAgICAgICAgICAgICAgICAgIDsgKm9wMCA9IHVeMHg4MAotICAgIHZlb3IgICAgICAgIHE3LCBxMTAsIHEwICAgICAgICAgICAgICAgICA7ICpvcTAgPSB1XjB4ODAKLQotICAgIHZzdDEudTggICAgIHtxNn0sIFtyMF0gICAgICAgICAgICAgICAgICA7IHN0b3JlIG9wMAotICAgIHZzdDEudTggICAgIHtxN30sIFtyM10gICAgICAgICAgICAgICAgICA7IHN0b3JlIG9xMAotCi0gICAgYnggICAgICAgICAgbHIKLSAgICBFTkRQICAgICAgICA7IHx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9uZW9ufAotCi07LS0tLS0tLS0tLS0tLS0tLS0KLQotbGZoeV9jb2VmZgotICAgIERDRCAgICAgMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHg4MDgwODA4MAotICAgIERDRCAgICAgMHgwMzAzMDMwMywgMHgwMzAzMDMwMywgMHgwMzAzMDMwMywgMHgwMzAzMDMwMwotICAgIERDRCAgICAgMHgwNDA0MDQwNCwgMHgwNDA0MDQwNCwgMHgwNDA0MDQwNCwgMHgwNDA0MDQwNAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGV2ZXJ0aWNhbGVkZ2VfbmVvbi5hc20gYi92cDgvY29tbW9uL2FybS9uZW9uL2xvb3BmaWx0ZXJzaW1wbGV2ZXJ0aWNhbGVkZ2VfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNWUwOTMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyc2ltcGxldmVydGljYWxlZGdlX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07Tm90ZTogZmxpbWl0LCBsaW1pdCwgYW5kIHRocmVzaCBzaG91bGQgYmUgcG9zaXRpdmUgbnVtYmVycy4gQWxsIDE2IGVsZW1lbnRzIGluIGZsaW1pdAotO2FyZSBlcXVhbC4gU28sIGluIHRoZSBjb2RlLCBvbmx5IG9uZSBsb2FkIGlzIG5lZWRlZAotO2ZvciBmbGltaXQuIFNhbWUgd2F5IGFwcGxpZXMgdG8gbGltaXQgYW5kIHRocmVzaC4KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqcywKLTsgcjEgICAgaW50IHAsIC8vcGl0Y2gKLTsgcjIgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgcjMgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyBzdGFjayhyNCkgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgLy9zdGFjayhyNSkgICBpbnQgY291bnQgLS11bnVzZWQKLQotfHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9uZW9ufCBQUk9DCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDIgY29sdW1ucwotCi0gICAgdmxkNC44ICAgICAge2Q2WzBdLCBkN1swXSwgZDhbMF0sIGQ5WzBdfSwgW3IwXSwgcjEKLSAgICB2bGQxLnM4ICAgICB7ZDJbXSwgZDNbXX0sIFtyMl0gICAgICAgICAgOyBmbGltaXQKLSAgICB2bGQxLnM4ICAgICB7ZDI2W10sIGQyN1tdfSwgW3IzXSAgICAgICAgOyBsaW1pdCAtPiBxMTMKLSAgICB2bGQ0LjggICAgICB7ZDZbMV0sIGQ3WzFdLCBkOFsxXSwgZDlbMV19LCBbcjBdLCByMQotICAgIGFkciAgICAgICAgIHIxMiwgdmxmeV9jb2VmZgotICAgIHZsZDQuOCAgICAgIHtkNlsyXSwgZDdbMl0sIGQ4WzJdLCBkOVsyXX0sIFtyMF0sIHIxCi0gICAgdmxkNC44ICAgICAge2Q2WzNdLCBkN1szXSwgZDhbM10sIGQ5WzNdfSwgW3IwXSwgcjEKLSAgICB2bGQ0LjggICAgICB7ZDZbNF0sIGQ3WzRdLCBkOFs0XSwgZDlbNF19LCBbcjBdLCByMQotICAgIHZsZDQuOCAgICAgIHtkNls1XSwgZDdbNV0sIGQ4WzVdLCBkOVs1XX0sIFtyMF0sIHIxCi0gICAgdmxkNC44ICAgICAge2Q2WzZdLCBkN1s2XSwgZDhbNl0sIGQ5WzZdfSwgW3IwXSwgcjEKLSAgICB2bGQ0LjggICAgICB7ZDZbN10sIGQ3WzddLCBkOFs3XSwgZDlbN119LCBbcjBdLCByMQotCi0gICAgdmxkNC44ICAgICAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge3EwfSwgW3IxMl0hICAgICAgICAgICAgICAgIDsgMHg4MAotICAgIHZsZDQuOCAgICAgIHtkMTBbMV0sIGQxMVsxXSwgZDEyWzFdLCBkMTNbMV19LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgIHtxMTF9LCBbcjEyXSEgICAgICAgICAgICAgICA7IDB4MDMKLSAgICB2bGQ0LjggICAgICB7ZDEwWzJdLCBkMTFbMl0sIGQxMlsyXSwgZDEzWzJdfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7cTEyfSwgW3IxMl0hICAgICAgICAgICAgICAgOyAweDA0Ci0gICAgdmxkNC44ICAgICAge2QxMFszXSwgZDExWzNdLCBkMTJbM10sIGQxM1szXX0sIFtyMF0sIHIxCi0gICAgdmxkNC44ICAgICAge2QxMFs0XSwgZDExWzRdLCBkMTJbNF0sIGQxM1s0XX0sIFtyMF0sIHIxCi0gICAgdmxkNC44ICAgICAge2QxMFs1XSwgZDExWzVdLCBkMTJbNV0sIGQxM1s1XX0sIFtyMF0sIHIxCi0gICAgdmxkNC44ICAgICAge2QxMFs2XSwgZDExWzZdLCBkMTJbNl0sIGQxM1s2XX0sIFtyMF0sIHIxCi0gICAgdmxkNC44ICAgICAge2QxMFs3XSwgZDExWzddLCBkMTJbN10sIGQxM1s3XX0sIFtyMF0sIHIxCi0KLSAgICB2c3dwICAgICAgICBkNywgZDEwCi0gICAgdnN3cCAgICAgICAgZDEyLCBkOQotICAgIDt2c3dwICAgICAgIHE0LCBxNSAgICAgICAgICAgICAgICAgICAgICA7IHAxOnEzLCBwMDpxNSwgcTA6cTQsIHExOnE2Ci0KLSAgICA7dnA4X2ZpbHRlcl9tYXNrKCkgZnVuY3Rpb24KLSAgICA7dnA4X2hldm1hc2soKSBmdW5jdGlvbgotICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjNAotICAgIHZhYmQudTggICAgIHExNSwgcTUsIHE0ICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQotICAgIHZhYmQudTggICAgIHExNCwgcTMsIHE2ICAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHExKQotICAgIHZxYWRkLnU4ICAgIHExNSwgcTE1LCBxMTUgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqIDIKLSAgICB2c2hyLnU4ICAgICBxMTQsIHExNCwgIzEgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBxMSkgLyAyCi0gICAgdnFhZGQudTggICAgcTE1LCBxMTUsIHExNCAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIKLQotICAgIHZlb3IgICAgICAgIHE0LCBxNCwgcTAgICAgICAgICAgICAgICAgICA7IHFzMDogcTAgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLSAgICB2ZW9yICAgICAgICBxNSwgcTUsIHEwICAgICAgICAgICAgICAgICAgOyBwczA6IHAwIG9mZnNldCB0byBjb252ZXJ0IHRvIGEgc2lnbmVkIHZhbHVlCi0gICAgdmVvciAgICAgICAgcTMsIHEzLCBxMCAgICAgICAgICAgICAgICAgIDsgcHMxOiBwMSBvZmZzZXQgdG8gY29udmVydCB0byBhIHNpZ25lZCB2YWx1ZQotICAgIHZlb3IgICAgICAgIHE2LCBxNiwgcTAgICAgICAgICAgICAgICAgICA7IHFzMTogcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgdmFsdWUKLQotICAgIHZhZGQudTggICAgIHExLCBxMSwgcTEgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIKLSAgICB2YWRkLnU4ICAgICBxMSwgcTEsIHExMyAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQKLSAgICB2Y2dlLnU4ICAgICBxMTUsIHExLCBxMTUgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkqMiArIGFicyhwMS1xMSkvMiA+IGZsaW1pdCoyICsgbGltaXQpKi0xCi0KLSAgICA7dnA4X2ZpbHRlcigpIGZ1bmN0aW9uCi07Ozs7Ozs7Ozs7Ci0gICAgO3Zxc3ViLnM4ICAgcTIsIHE1LCBxNCAgICAgICAgICAgICAgICAgIDsgKCBxczAgLSBwczApCi0gICAgdnN1YmwuczggICAgcTIsIGQ4LCBkMTAgICAgICAgICAgICAgICAgIDsgKCBxczAgLSBwczApCi0gICAgdnN1YmwuczggICAgcTEzLCBkOSwgZDExCi0KLSAgICB2cXN1Yi5zOCAgICBxMSwgcTMsIHE2ICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMS1xczEpCi0KLSAgICA7dm11bC5pOCAgICBxMiwgcTIsIHExMSAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzICogKCBxczAgLSBwczApKQotICAgIHZhZGQuczE2ICAgIHExMCwgcTIsIHEyICAgICAgICAgICAgICAgICA7ICAzICogKCBxczAgLSBwczApCi0gICAgdmFkZC5zMTYgICAgcTE0LCBxMTMsIHExMwotICAgIHZhZGQuczE2ICAgIHEyLCBxMiwgcTEwCi0gICAgdmFkZC5zMTYgICAgcTEzLCBxMTMsIHExNAotCi0gICAgO3ZxYWRkLnM4ICAgcTEsIHExLCBxMgotICAgIHZhZGR3LnM4ICAgIHEyLCBxMiwgZDIgICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgKyAzICogKCBxczAgLSBwczApCi0gICAgdmFkZHcuczggICAgcTEzLCBxMTMsIGQzCi0KLSAgICB2cW1vdm4uczE2ICBkMiwgcTIgICAgICAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzICogKCBxczAgLSBwczApKQotICAgIHZxbW92bi5zMTYgIGQzLCBxMTMKLQotICAgIGFkZCAgICAgICAgIHIwLCByMCwgIzEKLSAgICBhZGQgICAgICAgICByMiwgcjAsIHIxCi07Ozs7Ozs7Ozs7OwotCi0gICAgdmFuZCAgICAgICAgcTEsIHExLCBxMTUgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciAmPSBtYXNrCi0KLSAgICB2cWFkZC5zOCAgICBxMiwgcTEsIHExMSAgICAgICAgICAgICAgICAgOyBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrMykKLSAgICB2cWFkZC5zOCAgICBxMSwgcTEsIHExMiAgICAgICAgICAgICAgICAgOyBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIrNCkKLSAgICB2c2hyLnM4ICAgICBxMiwgcTIsICMzICAgICAgICAgICAgICAgICAgOyBGaWx0ZXIyID4+PSAzCi0gICAgdnNoci5zOCAgICAgcTEsIHExLCAjMyAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA+Pj0gMwotCi0gICAgO2NhbGN1bGF0ZSBvdXRwdXQKLSAgICB2cXN1Yi5zOCAgICBxMTAsIHE0LCBxMSAgICAgICAgICAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpCi0gICAgdnFhZGQuczggICAgcTExLCBxNSwgcTIgICAgICAgICAgICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKQotCi0gICAgdmVvciAgICAgICAgcTcsIHExMCwgcTAgICAgICAgICAgICAgICAgIDsgKm9xMCA9IHVeMHg4MAotICAgIHZlb3IgICAgICAgIHE2LCBxMTEsIHEwICAgICAgICAgICAgICAgICA7ICpvcDAgPSB1XjB4ODAKLQotICAgIGFkZCAgICAgICAgIHIzLCByMiwgcjEKLSAgICB2c3dwICAgICAgICBkMTMsIGQxNAotICAgIGFkZCAgICAgICAgIHIxMiwgcjMsIHIxCi0KLSAgICA7c3RvcmUgb3AxLCBvcDAsIG9xMCwgb3ExCi0gICAgdnN0Mi44ICAgICAge2QxMlswXSwgZDEzWzBdfSwgW3IwXQotICAgIHZzdDIuOCAgICAgIHtkMTJbMV0sIGQxM1sxXX0sIFtyMl0KLSAgICB2c3QyLjggICAgICB7ZDEyWzJdLCBkMTNbMl19LCBbcjNdCi0gICAgdnN0Mi44ICAgICAge2QxMlszXSwgZDEzWzNdfSwgW3IxMl0sIHIxCi0gICAgYWRkICAgICAgICAgcjAsIHIxMiwgcjEKLSAgICB2c3QyLjggICAgICB7ZDEyWzRdLCBkMTNbNF19LCBbcjEyXQotICAgIHZzdDIuOCAgICAgIHtkMTJbNV0sIGQxM1s1XX0sIFtyMF0sIHIxCi0gICAgYWRkICAgICAgICAgcjIsIHIwLCByMQotICAgIHZzdDIuOCAgICAgIHtkMTJbNl0sIGQxM1s2XX0sIFtyMF0KLSAgICB2c3QyLjggICAgICB7ZDEyWzddLCBkMTNbN119LCBbcjJdLCByMQotICAgIGFkZCAgICAgICAgIHIzLCByMiwgcjEKLSAgICB2c3QyLjggICAgICB7ZDE0WzBdLCBkMTVbMF19LCBbcjJdCi0gICAgdnN0Mi44ICAgICAge2QxNFsxXSwgZDE1WzFdfSwgW3IzXSwgcjEKLSAgICBhZGQgICAgICAgICByMTIsIHIzLCByMQotICAgIHZzdDIuOCAgICAgIHtkMTRbMl0sIGQxNVsyXX0sIFtyM10KLSAgICB2c3QyLjggICAgICB7ZDE0WzNdLCBkMTVbM119LCBbcjEyXSwgcjEKLSAgICBhZGQgICAgICAgICByMCwgcjEyLCByMQotICAgIHZzdDIuOCAgICAgIHtkMTRbNF0sIGQxNVs0XX0sIFtyMTJdCi0gICAgdnN0Mi44ICAgICAge2QxNFs1XSwgZDE1WzVdfSwgW3IwXSwgcjEKLSAgICBhZGQgICAgICAgICByMiwgcjAsIHIxCi0gICAgdnN0Mi44ICAgICAge2QxNFs2XSwgZDE1WzZdfSwgW3IwXQotICAgIHZzdDIuOCAgICAgIHtkMTRbN10sIGQxNVs3XX0sIFtyMl0KLQotICAgIGJ4ICAgICAgICAgIGxyCi0gICAgRU5EUCAgICAgICAgOyB8dnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX25lb258Ci0KLTstLS0tLS0tLS0tLS0tLS0tLQotCi12bGZ5X2NvZWZmCi0gICAgRENEICAgICAweDgwODA4MDgwLCAweDgwODA4MDgwLCAweDgwODA4MDgwLCAweDgwODA4MDgwCi0gICAgRENEICAgICAweDAzMDMwMzAzLCAweDAzMDMwMzAzLCAweDAzMDMwMzAzLCAweDAzMDMwMzAzCi0gICAgRENEICAgICAweDA0MDQwNDA0LCAweDA0MDQwNDA0LCAweDA0MDQwNDA0LCAweDA0MDQwNDA0Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vbWJsb29wZmlsdGVyX25lb24uYXNtIGIvdnA4L2NvbW1vbi9hcm0vbmVvbi9tYmxvb3BmaWx0ZXJfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjgzMGUuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9tYmxvb3BmaWx0ZXJfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb258Ci0gICAgRVhQT1JUICB8dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X25lb258Ci0gICAgRVhQT1JUICB8dnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258Ci0gICAgRVhQT1JUICB8dnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyBmbGltaXQsIGxpbWl0LCBhbmQgdGhyZXNoIHNob3VsZCBiZSBwb3NpdGl2ZSBudW1iZXJzLgotOyBBbGwgMTYgZWxlbWVudHMgaW4gdGhlc2UgdmFyaWFibGVzIGFyZSBlcXVhbC4KLQotOyB2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb24odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkKLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjLAotOyByMSAgICBpbnQgcGl0Y2gsCi07IHIyICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCi07IHIzICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLTsgc3AgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgc3ArNCAgaW50IGNvdW50ICh1bnVzZWQpCi18dnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfbmVvbnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge2xyfQotICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMiAgICAgICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggcG9pbnRlcgotCi0gICAgdmxkMS51OCAgICAge3EzfSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgcDMKLSAgICB2bGQxLnM4ICAgICB7ZDJbXSwgZDNbXX0sIFtyM10gICAgICAgICAgOyBsaW1pdAotICAgIHZsZDEudTggICAgIHtxNH0sIFtyMF0sIHIxICAgICAgICAgICAgICA7IHAyCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjEyXSAgICAgICAgIDsgdGhyZXNoCi0gICAgdmxkMS51OCAgICAge3E1fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgcDEKLSAgICB2bGQxLnU4ICAgICB7cTZ9LCBbcjBdLCByMSAgICAgICAgICAgICAgOyBwMAotICAgIHZsZDEudTggICAgIHtxN30sIFtyMF0sIHIxICAgICAgICAgICAgICA7IHEwCi0gICAgdmxkMS51OCAgICAge3E4fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgcTEKLSAgICB2bGQxLnU4ICAgICB7cTl9LCBbcjBdLCByMSAgICAgICAgICAgICAgOyBxMgotICAgIHZsZDEudTggICAgIHtxMTB9LCBbcjBdLCByMSAgICAgICAgICAgICA7IHEzCi0KLSAgICBibCAgICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9uZW9uCi0KLSAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzMKLSAgICBhZGQgICAgICAgICByMCwgcjAsIHIxCi0gICAgYWRkICAgICAgICAgcjIsIHIwLCByMQotICAgIGFkZCAgICAgICAgIHIzLCByMiwgcjEKLQotICAgIHZzdDEudTggICAgIHtxNH0sIFtyMF0gICAgICAgICAgICAgICAgICA7IHN0b3JlIG9wMgotICAgIHZzdDEudTggICAgIHtxNX0sIFtyMl0gICAgICAgICAgICAgICAgICA7IHN0b3JlIG9wMQotICAgIHZzdDEudTggICAgIHtxNn0sIFtyM10sIHIxICAgICAgICAgICAgICA7IHN0b3JlIG9wMAotICAgIGFkZCAgICAgICAgIHIxMiwgcjMsIHIxCi0gICAgdnN0MS51OCAgICAge3E3fSwgW3IzXSAgICAgICAgICAgICAgICAgIDsgc3RvcmUgb3EwCi0gICAgdnN0MS51OCAgICAge3E4fSwgW3IxMl0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgb3ExCi0gICAgdnN0MS51OCAgICAge3E5fSwgW3IxMl0gICAgICAgICAgICAgOyBzdG9yZSBvcTIKLQotICAgIGxkbWlhICAgICAgIHNwISwge3BjfQotICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X25lb258Ci0KLTsgdm9pZCB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbih1bnNpZ25lZCBjaGFyICp1LCBpbnQgcGl0Y2gsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2KQotOyByMCAgICB1bnNpZ25lZCBjaGFyICp1LAotOyByMSAgICBpbnQgcGl0Y2gsCi07IHIyICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCi07IHIzICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLTsgc3AgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLTsgc3ArNCAgdW5zaWduZWQgY2hhciAqdgotfHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9uZW9ufCBQUk9DCi0gICAgc3RtZGIgICAgICAgc3AhLCB7bHJ9Ci0gICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMyICAgICAgICAgIDsgbW92ZSB1IHBvaW50ZXIgZG93biBieSA0IGxpbmVzCi0gICAgdmxkMS5zOCAgICAge2QyW10sIGQzW119LCBbcjNdICAgICAgICAgIDsgbGltaXQKLSAgICBsZHIgICAgICAgICByMywgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBsb2FkIHYgcHRyCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggcG9pbnRlcgotICAgIHN1YiAgICAgICAgIHIzLCByMywgcjEsIGxzbCAjMiAgICAgICAgICA7IG1vdmUgdiBwb2ludGVyIGRvd24gYnkgNCBsaW5lcwotCi0gICAgdmxkMS51OCAgICAge2Q2fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgcDMKLSAgICB2bGQxLnU4ICAgICB7ZDd9LCBbcjNdLCByMSAgICAgICAgICAgICAgOyBwMwotICAgIHZsZDEudTggICAgIHtkOH0sIFtyMF0sIHIxICAgICAgICAgICAgICA7IHAyCi0gICAgdmxkMS51OCAgICAge2Q5fSwgW3IzXSwgcjEgICAgICAgICAgICAgIDsgcDIKLSAgICB2bGQxLnU4ICAgICB7ZDEwfSwgW3IwXSwgcjEgICAgICAgICAgICAgOyBwMQotICAgIHZsZDEudTggICAgIHtkMTF9LCBbcjNdLCByMSAgICAgICAgICAgICA7IHAxCi0gICAgdmxkMS51OCAgICAge2QxMn0sIFtyMF0sIHIxICAgICAgICAgICAgIDsgcDAKLSAgICB2bGQxLnU4ICAgICB7ZDEzfSwgW3IzXSwgcjEgICAgICAgICAgICAgOyBwMAotICAgIHZsZDEudTggICAgIHtkMTR9LCBbcjBdLCByMSAgICAgICAgICAgICA7IHEwCi0gICAgdmxkMS51OCAgICAge2QxNX0sIFtyM10sIHIxICAgICAgICAgICAgIDsgcTAKLSAgICB2bGQxLnU4ICAgICB7ZDE2fSwgW3IwXSwgcjEgICAgICAgICAgICAgOyBxMQotICAgIHZsZDEudTggICAgIHtkMTd9LCBbcjNdLCByMSAgICAgICAgICAgICA7IHExCi0gICAgdmxkMS51OCAgICAge2QxOH0sIFtyMF0sIHIxICAgICAgICAgICAgIDsgcTIKLSAgICB2bGQxLnU4ICAgICB7ZDE5fSwgW3IzXSwgcjEgICAgICAgICAgICAgOyBxMgotICAgIHZsZDEudTggICAgIHtkMjB9LCBbcjBdLCByMSAgICAgICAgICAgICA7IHEzCi0gICAgdmxkMS51OCAgICAge2QyMX0sIFtyM10sIHIxICAgICAgICAgICAgIDsgcTMKLQotICAgIHZsZDEuczggICAgIHtkNFtdLCBkNVtdfSwgW3IxMl0gICAgICAgICA7IHRocmVzaAotCi0gICAgYmwgICAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfbmVvbgotCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMzCi0gICAgc3ViICAgICAgICAgcjMsIHIzLCByMSwgbHNsICMzCi0KLSAgICBhZGQgICAgICAgICByMCwgcjAsIHIxCi0gICAgYWRkICAgICAgICAgcjMsIHIzLCByMQotCi0gICAgdnN0MS51OCAgICAge2Q4fSwgW3IwXSwgcjEgICAgICAgICAgICAgIDsgc3RvcmUgdSBvcDIKLSAgICB2c3QxLnU4ICAgICB7ZDl9LCBbcjNdLCByMSAgICAgICAgICAgICAgOyBzdG9yZSB2IG9wMgotICAgIHZzdDEudTggICAgIHtkMTB9LCBbcjBdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHUgb3AxCi0gICAgdnN0MS51OCAgICAge2QxMX0sIFtyM10sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdiBvcDEKLSAgICB2c3QxLnU4ICAgICB7ZDEyfSwgW3IwXSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB1IG9wMAotICAgIHZzdDEudTggICAgIHtkMTN9LCBbcjNdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHYgb3AwCi0gICAgdnN0MS51OCAgICAge2QxNH0sIFtyMF0sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdSBvcTAKLSAgICB2c3QxLnU4ICAgICB7ZDE1fSwgW3IzXSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB2IG9xMAotICAgIHZzdDEudTggICAgIHtkMTZ9LCBbcjBdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHUgb3ExCi0gICAgdnN0MS51OCAgICAge2QxN30sIFtyM10sIHIxICAgICAgICAgICAgIDsgc3RvcmUgdiBvcTEKLSAgICB2c3QxLnU4ICAgICB7ZDE4fSwgW3IwXSwgcjEgICAgICAgICAgICAgOyBzdG9yZSB1IG9xMgotICAgIHZzdDEudTggICAgIHtkMTl9LCBbcjNdLCByMSAgICAgICAgICAgICA7IHN0b3JlIHYgb3EyCi0KLSAgICBsZG1pYSAgICAgICBzcCEsIHtwY30KLSAgICBFTkRQICAgICAgICA7IHx2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfbmVvbnwKLQotOyB2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfeV9uZW9uKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHBpdGNoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICp0aHJlc2gsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmMsCi07IHIxICAgIGludCBwaXRjaCwKLTsgcjIgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgcjMgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyBzcCAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyBzcCs0ICBpbnQgY291bnQgKHVudXNlZCkKLXx2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfbmVvbnwgUFJPQwotICAgIHN0bWRiICAgICAgIHNwISwge2xyfQotICAgIHN1YiAgICAgICAgIHIwLCByMCwgIzQgICAgICAgICAgICAgICAgICA7IG1vdmUgc3JjIHBvaW50ZXIgZG93biBieSA0IGNvbHVtbnMKLQotICAgIHZsZDEudTggICAgIHtkNn0sIFtyMF0sIHIxICAgICAgICAgICAgICA7IGxvYWQgZmlyc3QgOC1saW5lIHNyYyBkYXRhCi0gICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgbG9hZCB0aHJlc2ggcG9pbnRlcgotICAgIHZsZDEudTggICAgIHtkOH0sIFtyMF0sIHIxCi0gICAgc3ViICAgICAgICAgc3AsIHNwLCAjMzIKLSAgICB2bGQxLnU4ICAgICB7ZDEwfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDEyfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE0fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE2fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE4fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDIwfSwgW3IwXSwgcjEKLQotICAgIHZsZDEudTggICAgIHtkN30sIFtyMF0sIHIxICAgICAgICAgICAgICA7IGxvYWQgc2Vjb25kIDgtbGluZSBzcmMgZGF0YQotICAgIHZsZDEudTggICAgIHtkOX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2QxMX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2QxM30sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2QxNX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2QxN30sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2QxOX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2QyMX0sIFtyMF0sIHIxCi0KLSAgICA7dHJhbnNwb3NlIHRvIDh4MTYgbWF0cml4Ci0gICAgdnRybi4zMiAgICAgcTMsIHE3Ci0gICAgdnRybi4zMiAgICAgcTQsIHE4Ci0gICAgdnRybi4zMiAgICAgcTUsIHE5Ci0gICAgdnRybi4zMiAgICAgcTYsIHExMAotCi0gICAgdnRybi4xNiAgICAgcTMsIHE1Ci0gICAgdnRybi4xNiAgICAgcTQsIHE2Ci0gICAgdnRybi4xNiAgICAgcTcsIHE5Ci0gICAgdnRybi4xNiAgICAgcTgsIHExMAotCi0gICAgdnRybi44ICAgICAgcTMsIHE0Ci0gICAgdnRybi44ICAgICAgcTUsIHE2Ci0gICAgdnRybi44ICAgICAgcTcsIHE4Ci0gICAgdnRybi44ICAgICAgcTksIHExMAotCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjEyXSAgICAgICAgIDsgdGhyZXNoCi0gICAgdmxkMS5zOCAgICAge2QyW10sIGQzW119LCBbcjNdICAgICAgICAgIDsgbGltaXQKLSAgICBtb3YgICAgICAgICByMTIsIHNwCi0gICAgdnN0MS51OCAgICAge3EzfSwgW3IxMl0hCi0gICAgdnN0MS51OCAgICAge3ExMH0sIFtyMTJdIQotCi0gICAgYmwgICAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfbmVvbgotCi0gICAgc3ViICAgICAgICAgcjAsIHIwLCByMSwgbHNsICM0Ci0KLSAgICBhZGQgICAgICAgICByMiwgcjAsIHIxCi0KLSAgICBhZGQgICAgICAgICByMywgcjIsIHIxCi0KLSAgICB2bGQxLnU4ICAgICB7cTN9LCBbc3BdIQotICAgIHZsZDEudTggICAgIHtxMTB9LCBbc3BdIQotCi0gICAgO3RyYW5zcG9zZSB0byAxNng4IG1hdHJpeAotICAgIHZ0cm4uMzIgICAgIHEzLCBxNwotICAgIHZ0cm4uMzIgICAgIHE0LCBxOAotICAgIHZ0cm4uMzIgICAgIHE1LCBxOQotICAgIHZ0cm4uMzIgICAgIHE2LCBxMTAKLSAgICBhZGQgICAgICAgICByMTIsIHIzLCByMQotCi0gICAgdnRybi4xNiAgICAgcTMsIHE1Ci0gICAgdnRybi4xNiAgICAgcTQsIHE2Ci0gICAgdnRybi4xNiAgICAgcTcsIHE5Ci0gICAgdnRybi4xNiAgICAgcTgsIHExMAotCi0gICAgdnRybi44ICAgICAgcTMsIHE0Ci0gICAgdnRybi44ICAgICAgcTUsIHE2Ci0gICAgdnRybi44ICAgICAgcTcsIHE4Ci0gICAgdnRybi44ICAgICAgcTksIHExMAotCi0gICAgO3N0b3JlIG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTIKLSAgICB2c3QxLjggICAgICB7ZDZ9LCBbcjBdCi0gICAgdnN0MS44ICAgICAge2Q4fSwgW3IyXQotICAgIHZzdDEuOCAgICAgIHtkMTB9LCBbcjNdCi0gICAgdnN0MS44ICAgICAge2QxMn0sIFtyMTJdLCByMQotICAgIGFkZCAgICAgICAgIHIwLCByMTIsIHIxCi0gICAgdnN0MS44ICAgICAge2QxNH0sIFtyMTJdCi0gICAgdnN0MS44ICAgICAge2QxNn0sIFtyMF0sIHIxCi0gICAgYWRkICAgICAgICAgcjIsIHIwLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTh9LCBbcjBdCi0gICAgdnN0MS44ICAgICAge2QyMH0sIFtyMl0sIHIxCi0gICAgYWRkICAgICAgICAgcjMsIHIyLCByMQotICAgIHZzdDEuOCAgICAgIHtkN30sIFtyMl0KLSAgICB2c3QxLjggICAgICB7ZDl9LCBbcjNdLCByMQotICAgIGFkZCAgICAgICAgIHIxMiwgcjMsIHIxCi0gICAgdnN0MS44ICAgICAge2QxMX0sIFtyM10KLSAgICB2c3QxLjggICAgICB7ZDEzfSwgW3IxMl0sIHIxCi0gICAgYWRkICAgICAgICAgcjAsIHIxMiwgcjEKLSAgICB2c3QxLjggICAgICB7ZDE1fSwgW3IxMl0KLSAgICB2c3QxLjggICAgICB7ZDE3fSwgW3IwXSwgcjEKLSAgICBhZGQgICAgICAgICByMiwgcjAsIHIxCi0gICAgdnN0MS44ICAgICAge2QxOX0sIFtyMF0KLSAgICB2c3QxLjggICAgICB7ZDIxfSwgW3IyXQotCi0gICAgbGRtaWEgICAgICAgc3AhLCB7cGN9Ci0gICAgRU5EUCAgICAgICAgOyB8dnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X25lb258Ci0KLTsgdm9pZCB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X25lb24odW5zaWduZWQgY2hhciAqdSwgaW50IHBpdGNoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICp0aHJlc2gsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnYpCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgKnUsCi07IHIxICAgIGludCBwaXRjaCwKLTsgcjIgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLTsgcjMgICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotOyBzcCAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotOyBzcCs0ICB1bnNpZ25lZCBjaGFyICp2Ci18dnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9ufCBQUk9DCi0gICAgc3RtZGIgICAgICAgc3AhLCB7bHJ9Ci0gICAgc3ViICAgICAgICAgcjAsIHIwLCAjNCAgICAgICAgICAgICAgICAgIDsgbW92ZSBzcmMgcG9pbnRlciBkb3duIGJ5IDQgY29sdW1ucwotICAgIHZsZDEuczggICAgIHtkMltdLCBkM1tdfSwgW3IzXSAgICAgICAgICA7IGxpbWl0Ci0gICAgbGRyICAgICAgICAgcjMsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgbG9hZCB2IHB0cgotICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGxvYWQgdGhyZXNoIHBvaW50ZXIKLQotICAgIHN1YiAgICAgICAgIHIzLCByMywgIzQgICAgICAgICAgICAgICAgICA7IG1vdmUgdiBwb2ludGVyIGRvd24gYnkgNCBjb2x1bW5zCi0KLSAgICB2bGQxLnU4ICAgICB7ZDZ9LCBbcjBdLCByMSAgICAgICAgICAgICAgO2xvYWQgdSBkYXRhCi0gICAgdmxkMS51OCAgICAge2Q3fSwgW3IzXSwgcjEgICAgICAgICAgICAgIDtsb2FkIHYgZGF0YQotICAgIHZsZDEudTggICAgIHtkOH0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAge2Q5fSwgW3IzXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDEwfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDExfSwgW3IzXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDEyfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDEzfSwgW3IzXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE0fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE1fSwgW3IzXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE2fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE3fSwgW3IzXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE4fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDE5fSwgW3IzXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDIwfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICB7ZDIxfSwgW3IzXSwgcjEKLQotICAgIDt0cmFuc3Bvc2UgdG8gOHgxNiBtYXRyaXgKLSAgICB2dHJuLjMyICAgICBxMywgcTcKLSAgICB2dHJuLjMyICAgICBxNCwgcTgKLSAgICB2dHJuLjMyICAgICBxNSwgcTkKLSAgICB2dHJuLjMyICAgICBxNiwgcTEwCi0KLSAgICB2dHJuLjE2ICAgICBxMywgcTUKLSAgICB2dHJuLjE2ICAgICBxNCwgcTYKLSAgICB2dHJuLjE2ICAgICBxNywgcTkKLSAgICB2dHJuLjE2ICAgICBxOCwgcTEwCi0KLSAgICB2dHJuLjggICAgICBxMywgcTQKLSAgICB2dHJuLjggICAgICBxNSwgcTYKLSAgICB2dHJuLjggICAgICBxNywgcTgKLSAgICB2dHJuLjggICAgICBxOSwgcTEwCi0KLSAgICBzdWIgICAgICAgICBzcCwgc3AsICMzMgotICAgIHZsZDEuczggICAgIHtkNFtdLCBkNVtdfSwgW3IxMl0gICAgICAgICA7IHRocmVzaAotICAgIG1vdiAgICAgICAgIHIxMiwgc3AKLSAgICB2c3QxLnU4ICAgICB7cTN9LCBbcjEyXSEKLSAgICB2c3QxLnU4ICAgICB7cTEwfSwgW3IxMl0hCi0KLSAgICBibCAgICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9uZW9uCi0KLSAgICBzdWIgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzMKLSAgICBzdWIgICAgICAgICByMywgcjMsIHIxLCBsc2wgIzMKLQotICAgIHZsZDEudTggICAgIHtxM30sIFtzcF0hCi0gICAgdmxkMS51OCAgICAge3ExMH0sIFtzcF0hCi0KLSAgICA7dHJhbnNwb3NlIHRvIDE2eDggbWF0cml4Ci0gICAgdnRybi4zMiAgICAgcTMsIHE3Ci0gICAgdnRybi4zMiAgICAgcTQsIHE4Ci0gICAgdnRybi4zMiAgICAgcTUsIHE5Ci0gICAgdnRybi4zMiAgICAgcTYsIHExMAotCi0gICAgdnRybi4xNiAgICAgcTMsIHE1Ci0gICAgdnRybi4xNiAgICAgcTQsIHE2Ci0gICAgdnRybi4xNiAgICAgcTcsIHE5Ci0gICAgdnRybi4xNiAgICAgcTgsIHExMAotCi0gICAgdnRybi44ICAgICAgcTMsIHE0Ci0gICAgdnRybi44ICAgICAgcTUsIHE2Ci0gICAgdnRybi44ICAgICAgcTcsIHE4Ci0gICAgdnRybi44ICAgICAgcTksIHExMAotCi0gICAgO3N0b3JlIG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTIKLSAgICB2c3QxLjggICAgICB7ZDZ9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkN30sIFtyM10sIHIxCi0gICAgdnN0MS44ICAgICAge2Q4fSwgW3IwXSwgcjEKLSAgICB2c3QxLjggICAgICB7ZDl9LCBbcjNdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTB9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTF9LCBbcjNdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTJ9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTN9LCBbcjNdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTR9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTV9LCBbcjNdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTZ9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTd9LCBbcjNdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTh9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMTl9LCBbcjNdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMjB9LCBbcjBdLCByMQotICAgIHZzdDEuOCAgICAgIHtkMjF9LCBbcjNdLCByMQotCi0gICAgbGRtaWEgICAgICAgc3AhLCB7cGN9Ci0gICAgRU5EUCAgICAgICAgOyB8dnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9uZW9ufAotCi07IHZvaWQgdnA4X21ibG9vcF9maWx0ZXJfbmVvbigpCi07IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBtYWNyb2Jsb2NrIGxvb3BmaWx0ZXJzLiBUaGUgaW5kaXZpZHVhbAotOyBmdW5jdGlvbnMgZG8gdGhlIG5lY2Vzc2FyeSBsb2FkLCB0cmFuc3Bvc2UgKGlmIG5lY2Vzc2FyeSksIHByZXNlcnZlIChpZgotOyBuZWNlc3NhcnkpIGFuZCBzdG9yZS4KLQotOyBUT0RPOgotOyBUaGUgdmVydGljYWwgZmlsdGVyIHdyaXRlcyBwMy9xMyBiYWNrIG91dCBiZWNhdXNlIHR3byA0IGVsZW1lbnQgd3JpdGVzIGFyZQotOyBtdWNoIHNpbXBsZXIgdGhhbiBvcmRlcmluZyBhbmQgd3JpdGluZyB0d28gMyBlbGVtZW50IHNldHMgKG9yIHRocmVlIDIgZWxlbWVudHMKLTsgc2V0cywgb3Igd2hpY2hldmVyIG90aGVyIGNvbWJpbmF0aW9ucyBhcmUgcG9zc2libGUpLgotOyBJZiB3ZSBjYW4gcHJlc2VydmUgcTMgYW5kIHExMCwgdGhlIHZlcnRpY2FsIGZpbHRlciB3aWxsIGJlIGFibGUgdG8gYXZvaWQKLTsgc3RvcmluZyB0aG9zZSB2YWx1ZXMgb24gdGhlIHN0YWNrIGFuZCByZWFkaW5nIHRoZW0gYmFjayBhZnRlciB0aGUgZmlsdGVyLgotCi07IHIwLHIxIFBSRVNFUlZFCi07IHIyICAgIGZsaW1pdAotOyByMyAgICBQUkVTRVJWRQotOyBxMSAgICBsaW1pdAotOyBxMiAgICB0aHJlc2gKLTsgcTMgICAgcDMKLTsgcTQgICAgcDIKLTsgcTUgICAgcDEKLTsgcTYgICAgcDAKLTsgcTcgICAgcTAKLTsgcTggICAgcTEKLTsgcTkgICAgcTIKLTsgcTEwICAgcTMKLQotfHZwOF9tYmxvb3BfZmlsdGVyX25lb258IFBST0MKLSAgICBhZHIgICAgICAgICByMTIsIG1ibGZfY29lZmYKLQotICAgIDsgdnA4X2ZpbHRlcl9tYXNrCi0gICAgdmFiZC51OCAgICAgcTExLCBxMywgcTQgICAgICAgICAgICAgICAgIDsgYWJzKHAzIC0gcDIpCi0gICAgdmFiZC51OCAgICAgcTEyLCBxNCwgcTUgICAgICAgICAgICAgICAgIDsgYWJzKHAyIC0gcDEpCi0gICAgdmFiZC51OCAgICAgcTEzLCBxNSwgcTYgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApCi0gICAgdmFiZC51OCAgICAgcTE0LCBxOCwgcTcgICAgICAgICAgICAgICAgIDsgYWJzKHExIC0gcTApCi0gICAgdmFiZC51OCAgICAgcTMsIHE5LCBxOCAgICAgICAgICAgICAgICAgIDsgYWJzKHEyIC0gcTEpCi0gICAgdmFiZC51OCAgICAgcTAsIHExMCwgcTkgICAgICAgICAgICAgICAgIDsgYWJzKHEzIC0gcTIpCi0KLSAgICB2bWF4LnU4ICAgICBxMTEsIHExMSwgcTEyCi0gICAgdm1heC51OCAgICAgcTEyLCBxMTMsIHExNAotICAgIHZtYXgudTggICAgIHEzLCBxMywgcTAKLSAgICB2bWF4LnU4ICAgICBxMTUsIHExMSwgcTEyCi0KLSAgICB2YWJkLnU4ICAgICBxMTIsIHE2LCBxNyAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKLQotICAgIDsgdnA4X2hldm1hc2sKLSAgICB2Y2d0LnU4ICAgICBxMTMsIHExMywgcTIgICAgICAgICAgICAgICAgOyAoYWJzKHAxIC0gcDApID4gdGhyZXNoKSAqIC0xCi0gICAgdmNndC51OCAgICAgcTE0LCBxMTQsIHEyICAgICAgICAgICAgICAgIDsgKGFicyhxMSAtIHEwKSA+IHRocmVzaCkgKiAtMQotICAgIHZtYXgudTggICAgIHExNSwgcTE1LCBxMwotCi0gICAgdmxkMS5zOCAgICAge2Q0W10sIGQ1W119LCBbcjJdICAgICAgICAgIDsgZmxpbWl0Ci0KLSAgICB2bGQxLnU4ICAgICB7cTB9LCBbcjEyXSEKLQotICAgIHZhZGQudTggICAgIHEyLCBxMiwgcTIgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIKLSAgICB2YWRkLnU4ICAgICBxMiwgcTIsIHExICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgIGxpbWl0Ci0gICAgdmNnZS51OCAgICAgcTE1LCBxMSwgcTE1Ci0KLSAgICB2YWJkLnU4ICAgICBxMSwgcTUsIHE4ICAgICAgICAgICAgICAgICAgOyBhID0gYWJzKHAxIC0gcTEpCi0gICAgdnFhZGQudTggICAgcTEyLCBxMTIsIHExMiAgICAgICAgICAgICAgIDsgYiA9IGFicyhwMCAtIHEwKSAqIDIKLSAgICB2c2hyLnU4ICAgICBxMSwgcTEsICMxICAgICAgICAgICAgICAgICAgOyBhID0gYSAvIDIKLSAgICB2cWFkZC51OCAgICBxMTIsIHExMiwgcTEgICAgICAgICAgICAgICAgOyBhID0gYiArIGEKLSAgICB2Y2dlLnU4ICAgICBxMTIsIHEyLCBxMTIgICAgICAgICAgICAgICAgOyAoYSA+IGZsaW1pdCAqIDIgKyBsaW1pdCkgKiAtMQotCi0gICAgOyB2cDhfZmlsdGVyCi0gICAgOyBjb252ZXJ0IHRvIHNpZ25lZAotICAgIHZlb3IgICAgICAgIHE3LCBxNywgcTAgICAgICAgICAgICAgICAgICA7IHFzMAotICAgIHZlb3IgICAgICAgIHE2LCBxNiwgcTAgICAgICAgICAgICAgICAgICA7IHBzMAotICAgIHZlb3IgICAgICAgIHE1LCBxNSwgcTAgICAgICAgICAgICAgICAgICA7IHBzMQotICAgIHZlb3IgICAgICAgIHE4LCBxOCwgcTAgICAgICAgICAgICAgICAgICA7IHFzMQotICAgIHZlb3IgICAgICAgIHE0LCBxNCwgcTAgICAgICAgICAgICAgICAgICA7IHBzMgotICAgIHZlb3IgICAgICAgIHE5LCBxOSwgcTAgICAgICAgICAgICAgICAgICA7IHFzMgotCi0gICAgdm9yciAgICAgICAgcTE0LCBxMTMsIHExNCAgICAgICAgICAgICAgIDsgdnA4X2hldm1hc2sKLQotICAgIHZzdWJsLnM4ICAgIHEyLCBkMTQsIGQxMiAgICAgICAgICAgICAgICA7IHFzMCAtIHBzMAotICAgIHZzdWJsLnM4ICAgIHExMywgZDE1LCBkMTMKLQotICAgIHZxc3ViLnM4ICAgIHExLCBxNSwgcTggICAgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXIgPSBjbGFtcChwczEtcXMxKQotCi0gICAgdmFkZC5zMTYgICAgcTEwLCBxMiwgcTIgICAgICAgICAgICAgICAgIDsgMyAqIChxczAgLSBwczApCi0gICAgdmFkZC5zMTYgICAgcTExLCBxMTMsIHExMwotICAgIHZhbmQgICAgICAgIHExNSwgcTE1LCBxMTIgICAgICAgICAgICAgICA7IHZwOF9maWx0ZXJfbWFzawotCi0gICAgdmFkZC5zMTYgICAgcTIsIHEyLCBxMTAKLSAgICB2YWRkLnMxNiAgICBxMTMsIHExMywgcTExCi0KLSAgICB2bGQxLnU4ICAgICB7cTEyfSwgW3IxMl0hICAgICAgICAgICAgICAgOyAjMwotCi0gICAgdmFkZHcuczggICAgcTIsIHEyLCBkMiAgICAgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciArIDMgKiAoIHFzMCAtIHBzMCkKLSAgICB2YWRkdy5zOCAgICBxMTMsIHExMywgZDMKLQotICAgIHZsZDEudTggICAgIHtxMTF9LCBbcjEyXSEgICAgICAgICAgICAgICA7ICM0Ci0KLSAgICA7IHZwOF9maWx0ZXIgPSBjbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKLSAgICB2cW1vdm4uczE2ICBkMiwgcTIKLSAgICB2cW1vdm4uczE2ICBkMywgcTEzCi0KLSAgICB2YW5kICAgICAgICBxMSwgcTEsIHExNSAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IG1hc2sKLQotICAgIHZsZDEudTggICAgIHtxMTV9LCBbcjEyXSEgICAgICAgICAgICAgICA7ICM2MwotICAgIDsKLSAgICB2YW5kICAgICAgICBxMTMsIHExLCBxMTQgICAgICAgICAgICAgICAgOyBGaWx0ZXIyICY9IGhldgotCi0gICAgdmxkMS51OCAgICAge2Q3fSwgW3IxMl0hICAgICAgICAgICAgICAgIDsgIzkKLQotICAgIHZxYWRkLnM4ICAgIHEyLCBxMTMsIHExMSAgICAgICAgICAgICAgICA7IEZpbHRlcjEgPSBjbGFtcChGaWx0ZXIyKzQpCi0gICAgdnFhZGQuczggICAgcTEzLCBxMTMsIHExMiAgICAgICAgICAgICAgIDsgRmlsdGVyMiA9IGNsYW1wKEZpbHRlcjIrMykKLQotICAgIHZsZDEudTggICAgIHtkNn0sIFtyMTJdISAgICAgICAgICAgICAgICA7ICMxOAotCi0gICAgdnNoci5zOCAgICAgcTIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIDsgRmlsdGVyMSA+Pj0gMwotICAgIHZzaHIuczggICAgIHExMywgcTEzLCAjMyAgICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49IDMKLQotICAgIHZtb3YgICAgICAgIHExMCwgcTE1Ci0gICAgdm1vdiAgICAgICAgcTEyLCBxMTUKLQotICAgIHZxc3ViLnM4ICAgIHE3LCBxNywgcTIgICAgICAgICAgICAgICAgICA7IHFzMCA9IGNsYW1wKHFzMCAtIEZpbHRlcjEpCi0KLSAgICB2bGQxLnU4ICAgICB7ZDV9LCBbcjEyXSEgICAgICAgICAgICAgICAgOyAjMjcKLQotICAgIHZxYWRkLnM4ICAgIHE2LCBxNiwgcTEzICAgICAgICAgICAgICAgICA7IHBzMCA9IGNsYW1wKHBzMCArIEZpbHRlcjIpCi0KLSAgICB2YmljICAgICAgICBxMSwgcTEsIHExNCAgICAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyICY9IH5oZXYKLQotICAgIDsgcm91Z2hseSAxLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIDsgcm91Z2hseSAyLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIDsgcm91Z2hseSAzLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeQotICAgIHZtb3YgICAgICAgIHExMSwgcTE1Ci0gICAgdm1vdiAgICAgICAgcTEzLCBxMTUKLSAgICB2bW92ICAgICAgICBxMTQsIHExNQotCi0gICAgdm1sYWwuczggICAgcTEwLCBkMiwgZDcgICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAqIDkKLSAgICB2bWxhbC5zOCAgICBxMTEsIGQzLCBkNwotICAgIHZtbGFsLnM4ICAgIHExMiwgZDIsIGQ2ICAgICAgICAgICAgICAgICA7IEZpbHRlcjIgKiAxOAotICAgIHZtbGFsLnM4ICAgIHExMywgZDMsIGQ2Ci0gICAgdm1sYWwuczggICAgcTE0LCBkMiwgZDUgICAgICAgICAgICAgICAgIDsgRmlsdGVyMiAqIDI3Ci0gICAgdm1sYWwuczggICAgcTE1LCBkMywgZDUKLSAgICB2cXNocm4uczE2ICBkMjAsIHExMCwgIzcgICAgICAgICAgICAgICAgOyB1ID0gY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpPj43KQotICAgIHZxc2hybi5zMTYgIGQyMSwgcTExLCAjNwotICAgIHZxc2hybi5zMTYgIGQyNCwgcTEyLCAjNyAgICAgICAgICAgICAgICA7IHUgPSBjbGFtcCgoNjMgKyBGaWx0ZXIyICogMTgpPj43KQotICAgIHZxc2hybi5zMTYgIGQyNSwgcTEzLCAjNwotICAgIHZxc2hybi5zMTYgIGQyOCwgcTE0LCAjNyAgICAgICAgICAgICAgICA7IHUgPSBjbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpPj43KQotICAgIHZxc2hybi5zMTYgIGQyOSwgcTE1LCAjNwotCi0gICAgdnFzdWIuczggICAgcTExLCBxOSwgcTEwICAgICAgICAgICAgICAgIDsgcyA9IGNsYW1wKHFzMiAtIHUpCi0gICAgdnFhZGQuczggICAgcTEwLCBxNCwgcTEwICAgICAgICAgICAgICAgIDsgcyA9IGNsYW1wKHBzMiArIHUpCi0gICAgdnFzdWIuczggICAgcTEzLCBxOCwgcTEyICAgICAgICAgICAgICAgIDsgcyA9IGNsYW1wKHFzMSAtIHUpCi0gICAgdnFhZGQuczggICAgcTEyLCBxNSwgcTEyICAgICAgICAgICAgICAgIDsgcyA9IGNsYW1wKHBzMSArIHUpCi0gICAgdnFzdWIuczggICAgcTE1LCBxNywgcTE0ICAgICAgICAgICAgICAgIDsgcyA9IGNsYW1wKHFzMCAtIHUpCi0gICAgdnFhZGQuczggICAgcTE0LCBxNiwgcTE0ICAgICAgICAgICAgICAgIDsgcyA9IGNsYW1wKHBzMCArIHUpCi0gICAgdmVvciAgICAgICAgcTksIHExMSwgcTAgICAgICAgICAgICAgICAgIDsgKm9xMiA9IHNeMHg4MAotICAgIHZlb3IgICAgICAgIHE0LCBxMTAsIHEwICAgICAgICAgICAgICAgICA7ICpvcDIgPSBzXjB4ODAKLSAgICB2ZW9yICAgICAgICBxOCwgcTEzLCBxMCAgICAgICAgICAgICAgICAgOyAqb3ExID0gc14weDgwCi0gICAgdmVvciAgICAgICAgcTUsIHExMiwgcTAgICAgICAgICAgICAgICAgIDsgKm9wMiA9IHNeMHg4MAotICAgIHZlb3IgICAgICAgIHE3LCBxMTUsIHEwICAgICAgICAgICAgICAgICA7ICpvcTAgPSBzXjB4ODAKLSAgICB2ZW9yICAgICAgICBxNiwgcTE0LCBxMCAgICAgICAgICAgICAgICAgOyAqb3AwID0gc14weDgwCi0KLSAgICBieCAgICAgICAgICBscgotICAgIEVORFAgICAgICAgIDsgfHZwOF9tYmxvb3BfZmlsdGVyX25lb258Ci0KLTstLS0tLS0tLS0tLS0tLS0tLQotCi1tYmxmX2NvZWZmCi0gICAgRENEICAgICAweDgwODA4MDgwLCAweDgwODA4MDgwLCAweDgwODA4MDgwLCAweDgwODA4MDgwCi0gICAgRENEICAgICAweDAzMDMwMzAzLCAweDAzMDMwMzAzLCAweDAzMDMwMzAzLCAweDAzMDMwMzAzCi0gICAgRENEICAgICAweDA0MDQwNDA0LCAweDA0MDQwNDA0LCAweDA0MDQwNDA0LCAweDA0MDQwNDA0Ci0gICAgRENEICAgICAweDAwM2YwMDNmLCAweDAwM2YwMDNmLCAweDAwM2YwMDNmLCAweDAwM2YwMDNmCi0gICAgRENEICAgICAweDA5MDkwOTA5LCAweDA5MDkwOTA5LCAweDEyMTIxMjEyLCAweDEyMTIxMjEyCi0gICAgRENEICAgICAweDFiMWIxYjFiLCAweDFiMWIxYjFiCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vcmVjb24xNngxNm1iX25lb24uYXNtIGIvdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjE2eDE2bWJfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWEzMGYuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjE2eDE2bWJfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9yZWNvbjE2eDE2bWJfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTsgcjAgICAgdW5zaWduZWQgY2hhciAgKnByZWRfcHRyLAotOyByMSAgICBzaG9ydCAqZGlmZl9wdHIsCi07IHIyICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi07IHIzICAgIGludCB5c3RyaWRlLAotOyBzdGFjayB1bnNpZ25lZCBjaGFyICp1ZHN0X3B0ciwKLTsgc3RhY2sgdW5zaWduZWQgY2hhciAqdmRzdF9wdHIKLQotfHZwOF9yZWNvbjE2eDE2bWJfbmVvbnwgUFJPQwotICAgIG1vdiAgICAgICAgICAgICByMTIsICM0ICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIgZm9yIFkgbG9vcAotCi1yZWNvbjE2eDE2bWJfbG9vcF95Ci0gICAgdmxkMS51OCAgICAgICAgIHtxMTIsIHExM30sIFtyMF0hICAgO2xvYWQgZGF0YSBmcm9tIHByZWRfcHRyCi0gICAgdmxkMS4xNiAgICAgICAgIHtxOCwgcTl9LCBbcjFdISAgICAgO2xvYWQgZGF0YSBmcm9tIGRpZmZfcHRyCi0gICAgdmxkMS51OCAgICAgICAgIHtxMTQsIHExNX0sIFtyMF0hCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMTAsIHExMX0sIFtyMV0hCi0KLSAgICB2bW92bC51OCAgICAgICAgcTAsIGQyNCAgICAgICAgICAgICA7bW9kaWZ5IFByZWQgZGF0YSBmcm9tIDggYml0cyB0byAxNiBiaXRzCi0gICAgdm1vdmwudTggICAgICAgIHExLCBkMjUKLSAgICB2bW92bC51OCAgICAgICAgcTIsIGQyNgotICAgIHZtb3ZsLnU4ICAgICAgICBxMywgZDI3Ci0gICAgdm1vdmwudTggICAgICAgIHE0LCBkMjgKLSAgICB2bW92bC51OCAgICAgICAgcTUsIGQyOQotICAgIHZtb3ZsLnU4ICAgICAgICBxNiwgZDMwCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMTIsIHExM30sIFtyMV0hCi0gICAgdm1vdmwudTggICAgICAgIHE3LCBkMzEKLSAgICB2bGQxLjE2ICAgICAgICAge3ExNCwgcTE1fSwgW3IxXSEKLQotICAgIHBsZCAgICAgICAgICAgICBbcjBdCi0gICAgcGxkICAgICAgICAgICAgIFtyMV0KLSAgICBwbGQgICAgICAgICAgICAgW3IxLCAjNjRdCi0KLSAgICB2YWRkLnMxNiAgICAgICAgcTAsIHEwLCBxOCAgICAgICAgICA7YWRkIERpZmYgZGF0YSBhbmQgUHJlZCBkYXRhIHRvZ2V0aGVyCi0gICAgdmFkZC5zMTYgICAgICAgIHExLCBxMSwgcTkKLSAgICB2YWRkLnMxNiAgICAgICAgcTIsIHEyLCBxMTAKLSAgICB2YWRkLnMxNiAgICAgICAgcTMsIHEzLCBxMTEKLSAgICB2YWRkLnMxNiAgICAgICAgcTQsIHE0LCBxMTIKLSAgICB2YWRkLnMxNiAgICAgICAgcTUsIHE1LCBxMTMKLSAgICB2YWRkLnMxNiAgICAgICAgcTYsIHE2LCBxMTQKLSAgICB2YWRkLnMxNiAgICAgICAgcTcsIHE3LCBxMTUKLQotICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAgICAgICAgICAgICAgIDtDTEFNUCgpIHNhdHVyYXRpb24KLSAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHExCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMgotICAgIHZxbW92dW4uczE2ICAgICBkMywgcTMKLSAgICB2cW1vdnVuLnMxNiAgICAgZDQsIHE0Ci0gICAgdnFtb3Z1bi5zMTYgICAgIGQ1LCBxNQotICAgIHZzdDEudTggICAgICAgICB7cTB9LCBbcjJdLCByMyAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2cW1vdnVuLnMxNiAgICAgZDYsIHE2Ci0gICAgdnN0MS51OCAgICAgICAgIHtxMX0sIFtyMl0sIHIzCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCBxNwotICAgIHZzdDEudTggICAgICAgICB7cTJ9LCBbcjJdLCByMwotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIG1vdmVxICAgICAgICAgICByMTIsICMyICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIgZm9yIFVWIGxvb3AKLQotICAgIHZzdDEudTggICAgICAgICB7cTN9LCBbcjJdLCByMwotICAgIGJuZSAgICAgICAgICAgICByZWNvbjE2eDE2bWJfbG9vcF95Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjMsIHIzLCBsc3IgIzEgICAgICA7dXZfc3RyaWRlID0geXN0cmlkZT4+MQotICAgIGxkciAgICAgICAgICAgICByMiwgW3NwXSAgICAgICAgICAgIDtsb2FkIHVwcmVkX3B0cgotCi1yZWNvbjE2eDE2bWJfbG9vcF91dgotICAgIHZsZDEudTggICAgICAgICB7cTEyLCBxMTN9LCBbcjBdISAgIDtsb2FkIGRhdGEgZnJvbSBwcmVkX3B0cgotICAgIHZsZDEuMTYgICAgICAgICB7cTgsIHE5fSwgW3IxXSEgICAgIDtsb2FkIGRhdGEgZnJvbSBkaWZmX3B0cgotICAgIHZsZDEudTggICAgICAgICB7cTE0LCBxMTV9LCBbcjBdIQotICAgIHZsZDEuMTYgICAgICAgICB7cTEwLCBxMTF9LCBbcjFdIQotCi0gICAgdm1vdmwudTggICAgICAgIHEwLCBkMjQgICAgICAgICAgICAgO21vZGlmeSBQcmVkIGRhdGEgZnJvbSA4IGJpdHMgdG8gMTYgYml0cwotICAgIHZtb3ZsLnU4ICAgICAgICBxMSwgZDI1Ci0gICAgdm1vdmwudTggICAgICAgIHEyLCBkMjYKLSAgICB2bW92bC51OCAgICAgICAgcTMsIGQyNwotICAgIHZtb3ZsLnU4ICAgICAgICBxNCwgZDI4Ci0gICAgdm1vdmwudTggICAgICAgIHE1LCBkMjkKLSAgICB2bW92bC51OCAgICAgICAgcTYsIGQzMAotICAgIHZsZDEuMTYgICAgICAgICB7cTEyLCBxMTN9LCBbcjFdIQotICAgIHZtb3ZsLnU4ICAgICAgICBxNywgZDMxCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMTQsIHExNX0sIFtyMV0hCi0KLSAgICB2YWRkLnMxNiAgICAgICAgcTAsIHEwLCBxOCAgICAgICAgICA7YWRkIERpZmYgZGF0YSBhbmQgUHJlZCBkYXRhIHRvZ2V0aGVyCi0gICAgdmFkZC5zMTYgICAgICAgIHExLCBxMSwgcTkKLSAgICB2YWRkLnMxNiAgICAgICAgcTIsIHEyLCBxMTAKLSAgICB2YWRkLnMxNiAgICAgICAgcTMsIHEzLCBxMTEKLSAgICB2YWRkLnMxNiAgICAgICAgcTQsIHE0LCBxMTIKLSAgICB2YWRkLnMxNiAgICAgICAgcTUsIHE1LCBxMTMKLSAgICB2YWRkLnMxNiAgICAgICAgcTYsIHE2LCBxMTQKLQotICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAgICAgICAgICAgICAgIDtDTEFNUCgpIHNhdHVyYXRpb24KLSAgICB2YWRkLnMxNiAgICAgICAgcTcsIHE3LCBxMTUKLSAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHExCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMgotICAgIHZxbW92dW4uczE2ICAgICBkMywgcTMKLSAgICB2c3QxLnU4ICAgICAgICAge2QwfSwgW3IyXSwgcjMgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCBxNAotICAgIHZzdDEudTggICAgICAgICB7ZDF9LCBbcjJdLCByMwotICAgIHZxbW92dW4uczE2ICAgICBkNSwgcTUKLSAgICB2c3QxLnU4ICAgICAgICAge2QyfSwgW3IyXSwgcjMKLSAgICB2cW1vdnVuLnMxNiAgICAgZDYsIHE2Ci0gICAgdnN0MS51OCAgICAgICAgIHtkM30sIFtyMl0sIHIzCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCBxNwotICAgIHZzdDEudTggICAgICAgICB7ZDR9LCBbcjJdLCByMwotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZzdDEudTggICAgICAgICB7ZDV9LCBbcjJdLCByMwotICAgIHZzdDEudTggICAgICAgICB7ZDZ9LCBbcjJdLCByMwotICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjJdLCByMwotCi0gICAgbGRybmUgICAgICAgICAgIHIyLCBbc3AsICM0XSAgICAgICAgO2xvYWQgdnByZWRfcHRyCi0gICAgYm5lICAgICAgICAgICAgIHJlY29uMTZ4MTZtYl9sb29wX3V2Ci0KLSAgICBieCAgICAgICAgICAgICBscgotCi0gICAgRU5EUAotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjJiX25lb24uYXNtIGIvdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjJiX25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWIyNTFjLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL25lb24vcmVjb24yYl9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfcmVjb24yYl9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICAqcHJlZF9wdHIsCi07IHIxICAgIHNob3J0ICpkaWZmX3B0ciwKLTsgcjIgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgcjMgICAgaW50IHN0cmlkZQotCi18dnA4X3JlY29uMmJfbmVvbnwgUFJPQwotICAgIHZsZDEudTggICAgICAgICB7cTgsIHE5fSwgW3IwXSAgICAgIDtsb2FkIGRhdGEgZnJvbSBwcmVkX3B0cgotICAgIHZsZDEuMTYgICAgICAgICB7cTQsIHE1fSwgW3IxXSEgICAgIDtsb2FkIGRhdGEgZnJvbSBkaWZmX3B0cgotCi0gICAgdm1vdmwudTggICAgICAgIHEwLCBkMTYgICAgICAgICAgICAgO21vZGlmeSBQcmVkIGRhdGEgZnJvbSA4IGJpdHMgdG8gMTYgYml0cwotICAgIHZsZDEuMTYgICAgICAgICB7cTYsIHE3fSwgW3IxXSEKLSAgICB2bW92bC51OCAgICAgICAgcTEsIGQxNwotICAgIHZtb3ZsLnU4ICAgICAgICBxMiwgZDE4Ci0gICAgdm1vdmwudTggICAgICAgIHEzLCBkMTkKLQotICAgIHZhZGQuczE2ICAgICAgICBxMCwgcTAsIHE0ICAgICAgICAgIDthZGQgRGlmZiBkYXRhIGFuZCBQcmVkIGRhdGEgdG9nZXRoZXIKLSAgICB2YWRkLnMxNiAgICAgICAgcTEsIHExLCBxNQotICAgIHZhZGQuczE2ICAgICAgICBxMiwgcTIsIHE2Ci0gICAgdmFkZC5zMTYgICAgICAgIHEzLCBxMywgcTcKLQotICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAgICAgICAgICAgICAgIDtDTEFNUCgpIHNhdHVyYXRpb24KLSAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHExCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMgotICAgIHZxbW92dW4uczE2ICAgICBkMywgcTMKLSAgICBhZGQgICAgICAgICAgICAgcjAsIHIyLCByMwotCi0gICAgdnN0MS51OCAgICAgICAgIHtkMH0sIFtyMl0gICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDF9LCBbcjBdLCByMwotICAgIGFkZCAgICAgICAgICAgICByMiwgcjAsIHIzCi0gICAgdnN0MS51OCAgICAgICAgIHtkMn0sIFtyMF0KLSAgICB2c3QxLnU4ICAgICAgICAge2QzfSwgW3IyXSwgcjMKLQotICAgIGJ4ICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL3JlY29uNGJfbmVvbi5hc20gYi92cDgvY29tbW9uL2FybS9uZW9uL3JlY29uNGJfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTcyNzcuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbjRiX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9yZWNvbjRiX25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgICpwcmVkX3B0ciwKLTsgcjEgICAgc2hvcnQgKmRpZmZfcHRyLAotOyByMiAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotOyByMyAgICBpbnQgc3RyaWRlCi0KLXx2cDhfcmVjb240Yl9uZW9ufCBQUk9DCi0gICAgdmxkMS51OCAgICAgICAgIHtxMTIsIHExM30sIFtyMF0hICAgO2xvYWQgZGF0YSBmcm9tIHByZWRfcHRyCi0gICAgdmxkMS4xNiAgICAgICAgIHtxOCwgcTl9LCBbcjFdISAgICAgO2xvYWQgZGF0YSBmcm9tIGRpZmZfcHRyCi0gICAgdmxkMS51OCAgICAgICAgIHtxMTQsIHExNX0sIFtyMF0KLSAgICB2bGQxLjE2ICAgICAgICAge3ExMCwgcTExfSwgW3IxXSEKLQotICAgIHZtb3ZsLnU4ICAgICAgICBxMCwgZDI0ICAgICAgICAgICAgIDttb2RpZnkgUHJlZCBkYXRhIGZyb20gOCBiaXRzIHRvIDE2IGJpdHMKLSAgICB2bW92bC51OCAgICAgICAgcTEsIGQyNQotICAgIHZtb3ZsLnU4ICAgICAgICBxMiwgZDI2Ci0gICAgdm1vdmwudTggICAgICAgIHEzLCBkMjcKLSAgICB2bW92bC51OCAgICAgICAgcTQsIGQyOAotICAgIHZtb3ZsLnU4ICAgICAgICBxNSwgZDI5Ci0gICAgdm1vdmwudTggICAgICAgIHE2LCBkMzAKLSAgICB2bGQxLjE2ICAgICAgICAge3ExMiwgcTEzfSwgW3IxXSEKLSAgICB2bW92bC51OCAgICAgICAgcTcsIGQzMQotICAgIHZsZDEuMTYgICAgICAgICB7cTE0LCBxMTV9LCBbcjFdCi0KLSAgICB2YWRkLnMxNiAgICAgICAgcTAsIHEwLCBxOCAgICAgICAgICA7YWRkIERpZmYgZGF0YSBhbmQgUHJlZCBkYXRhIHRvZ2V0aGVyCi0gICAgdmFkZC5zMTYgICAgICAgIHExLCBxMSwgcTkKLSAgICB2YWRkLnMxNiAgICAgICAgcTIsIHEyLCBxMTAKLSAgICB2YWRkLnMxNiAgICAgICAgcTMsIHEzLCBxMTEKLSAgICB2YWRkLnMxNiAgICAgICAgcTQsIHE0LCBxMTIKLSAgICB2YWRkLnMxNiAgICAgICAgcTUsIHE1LCBxMTMKLSAgICB2YWRkLnMxNiAgICAgICAgcTYsIHE2LCBxMTQKLSAgICB2YWRkLnMxNiAgICAgICAgcTcsIHE3LCBxMTUKLQotICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAgICAgICAgICAgICAgIDtDTEFNUCgpIHNhdHVyYXRpb24KLSAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHExCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMgotICAgIHZxbW92dW4uczE2ICAgICBkMywgcTMKLSAgICB2cW1vdnVuLnMxNiAgICAgZDQsIHE0Ci0gICAgdnFtb3Z1bi5zMTYgICAgIGQ1LCBxNQotICAgIHZxbW92dW4uczE2ICAgICBkNiwgcTYKLSAgICB2cW1vdnVuLnMxNiAgICAgZDcsIHE3Ci0gICAgYWRkICAgICAgICAgICAgIHIwLCByMiwgcjMKLQotICAgIHZzdDEudTggICAgICAgICB7cTB9LCBbcjJdICAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2c3QxLnU4ICAgICAgICAge3ExfSwgW3IwXSwgcjMKLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIwLCByMwotICAgIHZzdDEudTggICAgICAgICB7cTJ9LCBbcjBdCi0gICAgdnN0MS51OCAgICAgICAgIHtxM30sIFtyMl0sIHIzCi0KLSAgICBieCAgICAgICAgICAgICBscgotCi0gICAgRU5EUAotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9yZWNvbl9uZW9uLmMgYi92cDgvY29tbW9uL2FybS9uZW9uL3JlY29uX25lb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZDJhNS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL3JlY29uX25lb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vcmVjb24uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgotCi1leHRlcm4gdm9pZCB2cDhfcmVjb24xNngxNm1iX25lb24odW5zaWduZWQgY2hhciAqcHJlZF9wdHIsIHNob3J0ICpkaWZmX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHlzdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnVkc3RfcHRyLCB1bnNpZ25lZCBjaGFyICp2ZHN0X3B0cik7Ci0KLXZvaWQgdnA4X3JlY29uX21iX25lb24oY29uc3QgdnA4X3JlY29uX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QsIE1BQ1JPQkxPQ0tEICp4KQotewotICAgIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyID0gJngtPnByZWRpY3RvclswXTsKLSAgICBzaG9ydCAqZGlmZl9wdHIgPSAmeC0+ZGlmZlswXTsKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyID0geC0+ZHN0LnlfYnVmZmVyOwotICAgIHVuc2lnbmVkIGNoYXIgKnVkc3RfcHRyID0geC0+ZHN0LnVfYnVmZmVyOwotICAgIHVuc2lnbmVkIGNoYXIgKnZkc3RfcHRyID0geC0+ZHN0LnZfYnVmZmVyOwotICAgIGludCB5c3RyaWRlID0geC0+ZHN0Lnlfc3RyaWRlOwotICAgIC8qaW50IHV2X3N0cmlkZSA9IHgtPmRzdC51dl9zdHJpZGU7Ki8KLQotICAgIHZwOF9yZWNvbjE2eDE2bWJfbmVvbihwcmVkX3B0ciwgZGlmZl9wdHIsIGRzdF9wdHIsIHlzdHJpZGUsIHVkc3RfcHRyLCB2ZHN0X3B0cik7Ci19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL3JlY29uYl9uZW9uLmFzbSBiL3ZwOC9jb21tb24vYXJtL25lb24vcmVjb25iX25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhjMGVmLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL25lb24vcmVjb25iX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9yZWNvbl9iX25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgICpwcmVkX3B0ciwKLTsgcjEgICAgc2hvcnQgKmRpZmZfcHRyLAotOyByMiAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotOyByMyAgICBpbnQgc3RyaWRlCi0KLXx2cDhfcmVjb25fYl9uZW9ufCBQUk9DCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzE2Ci0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyOH0sIFtyMF0sIHIxMiAgICA7bG9hZCA0IGRhdGEvbGluZSBmcm9tIHByZWRfcHRyCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMTAsIHExMX0sIFtyMV0hICAgO2xvYWQgZGF0YSBmcm9tIGRpZmZfcHRyCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjl9LCBbcjBdLCByMTIKLSAgICB2bGQxLjE2ICAgICAgICAge3ExMSwgcTEyfSwgW3IxXSEKLSAgICB2bGQxLnU4ICAgICAgICAge2QzMH0sIFtyMF0sIHIxMgotICAgIHZsZDEuMTYgICAgICAgICB7cTEyLCBxMTN9LCBbcjFdIQotICAgIHZsZDEudTggICAgICAgICB7ZDMxfSwgW3IwXSwgcjEyCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMTN9LCBbcjFdCi0KLSAgICB2bW92bC51OCAgICAgICAgcTAsIGQyOCAgICAgICAgICAgICA7bW9kaWZ5IFByZWQgZGF0YSBmcm9tIDggYml0cyB0byAxNiBiaXRzCi0gICAgdm1vdmwudTggICAgICAgIHExLCBkMjkgICAgICAgICAgICAgO1ByZWQgZGF0YSBpbiBkMCwgZDIsIGQ0LCBkNgotICAgIHZtb3ZsLnU4ICAgICAgICBxMiwgZDMwCi0gICAgdm1vdmwudTggICAgICAgIHEzLCBkMzEKLQotICAgIHZhZGQuczE2ICAgICAgICBkMCwgZDAsIGQyMCAgICAgICAgIDthZGQgRGlmZiBkYXRhIGFuZCBQcmVkIGRhdGEgdG9nZXRoZXIKLSAgICB2YWRkLnMxNiAgICAgICAgZDIsIGQyLCBkMjIKLSAgICB2YWRkLnMxNiAgICAgICAgZDQsIGQ0LCBkMjQKLSAgICB2YWRkLnMxNiAgICAgICAgZDYsIGQ2LCBkMjYKLQotICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAgICAgICAgICAgICAgIDtDTEFNUCgpIHNhdHVyYXRpb24KLSAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHExCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxMgotICAgIHZxbW92dW4uczE2ICAgICBkMywgcTMKLSAgICBhZGQgICAgICAgICAgICAgcjEsIHIyLCByMwotCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMFswXX0sIFtyMl0gICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbcjFdLCByMwotICAgIGFkZCAgICAgICAgICAgICByMiwgcjEsIHIzCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sIFtyMV0KLSAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgW3IyXSwgcjMKLQotICAgIGJ4ICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL3Nob3J0aWRjdDR4NGxsbV8xX25lb24uYXNtIGIvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fMV9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZGJhZS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL3Nob3J0aWRjdDR4NGxsbV8xX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfbmVvbnwKLSAgICBFWFBPUlQgIHx2cDhfZGNfb25seV9pZGN0X25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTt2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci07IHIwICAgIHNob3J0ICppbnB1dDsKLTsgcjEgICAgc2hvcnQgKm91dHB1dDsKLTsgcjIgICAgaW50IHBpdGNoOwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLXx2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX25lb258IFBST0MKLSAgICB2bGQxLjE2ICAgICAgICAge2QwW119LCBbcjBdICAgICAgICAgICAgO2xvYWQgaW5wdXRbMF0KLQotICAgIGFkZCAgICAgICAgICAgICByMywgcjEsIHIyCi0gICAgYWRkICAgICAgICAgICAgIHIxMiwgcjMsIHIyCi0KLSAgICB2cnNoci5zMTYgICAgICAgZDAsIGQwLCAjMwotCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByMTIsIHIyCi0KLSAgICB2c3QxLjE2ICAgICAgICAge2QwfSwgW3IxXQotICAgIHZzdDEuMTYgICAgICAgICB7ZDB9LCBbcjNdCi0gICAgdnN0MS4xNiAgICAgICAgIHtkMH0sIFtyMTJdCi0gICAgdnN0MS4xNiAgICAgICAgIHtkMH0sIFtyMF0KLQotICAgIGJ4ICAgICAgICAgICAgIGxyCi0gICAgRU5EUAotCi07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07dm9pZCB2cDhfZGNfb25seV9pZGN0X2Moc2hvcnQgaW5wdXRfZGMsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci07IHIwICAgIHNob3J0IGlucHV0X2RjOwotOyByMSAgICBzaG9ydCAqb3V0cHV0OwotOyByMiAgICBpbnQgcGl0Y2g7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotfHZwOF9kY19vbmx5X2lkY3RfbmVvbnwgUFJPQwotICAgIHZkdXAuMTYgICAgICAgICBkMCwgcjAKLQotICAgIGFkZCAgICAgICAgICAgICByMywgcjEsIHIyCi0gICAgYWRkICAgICAgICAgICAgIHIxMiwgcjMsIHIyCi0KLSAgICB2cnNoci5zMTYgICAgICAgZDAsIGQwLCAjMwotCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByMTIsIHIyCi0KLSAgICB2c3QxLjE2ICAgICAgICAge2QwfSwgW3IxXQotICAgIHZzdDEuMTYgICAgICAgICB7ZDB9LCBbcjNdCi0gICAgdnN0MS4xNiAgICAgICAgIHtkMH0sIFtyMTJdCi0gICAgdnN0MS4xNiAgICAgICAgIHtkMH0sIFtyMF0KLQotICAgIGJ4ICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2FybS9uZW9uL3Nob3J0aWRjdDR4NGxsbV9uZW9uLmFzbSBiL3ZwOC9jb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRjMzE1Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfc2hvcnRfaWRjdDR4NGxsbV9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTt2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCi07cjAgc2hvcnQgKiBpbnB1dAotO3IxIHNob3J0ICogb3V0cHV0Ci07cjIgaW50IHBpdGNoCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotO3N0YXRpYyBjb25zdCBpbnQgY29zcGk4c3FydDJtaW51czE9MjAwOTE7Ci07c3RhdGljIGNvbnN0IGludCBzaW5waThzcXJ0MiAgICAgID0zNTQ2ODsKLTtzdGF0aWMgY29uc3QgaW50IHJvdW5kaW5nID0gMDsKLTtPcHRpbWl6YXRpb24gbm90ZTogVGhlIHJlc3VsdGVkIGRhdGEgZnJvbSBkZXF1YW50aXphdGlvbiBhcmUgc2lnbmVkIDEzLWJpdCBkYXRhIHRoYXQgaXMKLTtpbiB0aGUgcmFuZ2Ugb2YgWy00MDk2LCA0MDk1XS4gVGhpcyBhbGxvd3MgdG8gdXNlICJ2cWRtdWxoIihuZW9uKSBpbnN0cnVjdGlvbiBzaW5jZQotO2l0IHdvbid0IGdvIG91dCBvZiByYW5nZSAoMTMrMTYrMT0zMGJpdHM8MzJiaXRzKS4gVGhpcyBpbnN0cnVjdGlvbiBnaXZlcyB0aGUgaGlnaCBoYWxmCi07cmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiB0aGF0IGlzIG5lZWRlZCBpbiBJRENULgotCi18dnA4X3Nob3J0X2lkY3Q0eDRsbG1fbmVvbnwgUFJPQwotICAgIGFkciAgICAgICAgICAgICByMTIsIGlkY3RfY29lZmYKLSAgICB2bGQxLjE2ICAgICAgICAge3ExLCBxMn0sIFtyMF0KLSAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3IxMl0KLQotICAgIHZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICA7cTIodnBbNF0gdnBbMTJdKQotCi0gICAgdnFkbXVsaC5zMTYgICAgIHEzLCBxMiwgZDBbMl0KLSAgICB2cWRtdWxoLnMxNiAgICAgcTQsIHEyLCBkMFswXQotCi0gICAgdnFhZGQuczE2ICAgICAgIGQxMiwgZDIsIGQzICAgICAgICAgICAgIDthMQotICAgIHZxc3ViLnMxNiAgICAgICBkMTMsIGQyLCBkMyAgICAgICAgICAgICA7YjEKLQotICAgIHZzaHIuczE2ICAgICAgICBxMywgcTMsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHE0LCBxNCwgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTMsIHEyICAgICAgICAgICAgICA7bW9kaWZ5IHNpbmNlIHNpbnBpOHNxcnQyID4gNjU1MzYvMiAobmVndGl2ZSBudW1iZXIpCi0gICAgdnFhZGQuczE2ICAgICAgIHE0LCBxNCwgcTIKLQotICAgIDtkNiAtIGMxOnRlbXAxCi0gICAgO2Q3IC0gZDE6dGVtcDIKLSAgICA7ZDggLSBkMTp0ZW1wMQotICAgIDtkOSAtIGMxOnRlbXAyCi0KLSAgICB2cXN1Yi5zMTYgICAgICAgZDEwLCBkNiwgZDkgICAgICAgICAgICAgO2MxCi0gICAgdnFhZGQuczE2ICAgICAgIGQxMSwgZDcsIGQ4ICAgICAgICAgICAgIDtkMQotCi0gICAgdnFhZGQuczE2ICAgICAgIGQyLCBkMTIsIGQxMQotICAgIHZxYWRkLnMxNiAgICAgICBkMywgZDEzLCBkMTAKLSAgICB2cXN1Yi5zMTYgICAgICAgZDQsIGQxMywgZDEwCi0gICAgdnFzdWIuczE2ICAgICAgIGQ1LCBkMTIsIGQxMQotCi0gICAgdnRybi4zMiAgICAgICAgIGQyLCBkNAotICAgIHZ0cm4uMzIgICAgICAgICBkMywgZDUKLSAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQzCi0gICAgdnRybi4xNiAgICAgICAgIGQ0LCBkNQotCi0gICAgdnN3cCAgICAgICAgICAgIGQzLCBkNAotCi0gICAgdnFkbXVsaC5zMTYgICAgIHEzLCBxMiwgZDBbMl0KLSAgICB2cWRtdWxoLnMxNiAgICAgcTQsIHEyLCBkMFswXQotCi0gICAgdnFhZGQuczE2ICAgICAgIGQxMiwgZDIsIGQzICAgICAgICAgICAgIDthMQotICAgIHZxc3ViLnMxNiAgICAgICBkMTMsIGQyLCBkMyAgICAgICAgICAgICA7YjEKLQotICAgIHZzaHIuczE2ICAgICAgICBxMywgcTMsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHE0LCBxNCwgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTMsIHEyICAgICAgICAgICAgICA7bW9kaWZ5IHNpbmNlIHNpbnBpOHNxcnQyID4gNjU1MzYvMiAobmVndGl2ZSBudW1iZXIpCi0gICAgdnFhZGQuczE2ICAgICAgIHE0LCBxNCwgcTIKLQotICAgIHZxc3ViLnMxNiAgICAgICBkMTAsIGQ2LCBkOSAgICAgICAgICAgICA7YzEKLSAgICB2cWFkZC5zMTYgICAgICAgZDExLCBkNywgZDggICAgICAgICAgICAgO2QxCi0KLSAgICB2cWFkZC5zMTYgICAgICAgZDIsIGQxMiwgZDExCi0gICAgdnFhZGQuczE2ICAgICAgIGQzLCBkMTMsIGQxMAotICAgIHZxc3ViLnMxNiAgICAgICBkNCwgZDEzLCBkMTAKLSAgICB2cXN1Yi5zMTYgICAgICAgZDUsIGQxMiwgZDExCi0KLSAgICB2cnNoci5zMTYgICAgICAgZDIsIGQyLCAjMwotICAgIHZyc2hyLnMxNiAgICAgICBkMywgZDMsICMzCi0gICAgdnJzaHIuczE2ICAgICAgIGQ0LCBkNCwgIzMKLSAgICB2cnNoci5zMTYgICAgICAgZDUsIGQ1LCAjMwotCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMSwgcjIKLSAgICBhZGQgICAgICAgICAgICAgcjEyLCByMywgcjIKLSAgICBhZGQgICAgICAgICAgICAgcjAsIHIxMiwgcjIKLQotICAgIHZ0cm4uMzIgICAgICAgICBkMiwgZDQKLSAgICB2dHJuLjMyICAgICAgICAgZDMsIGQ1Ci0gICAgdnRybi4xNiAgICAgICAgIGQyLCBkMwotICAgIHZ0cm4uMTYgICAgICAgICBkNCwgZDUKLQotICAgIHZzdDEuMTYgICAgICAgICB7ZDJ9LCBbcjFdCi0gICAgdnN0MS4xNiAgICAgICAgIHtkM30sIFtyM10KLSAgICB2c3QxLjE2ICAgICAgICAge2Q0fSwgW3IxMl0KLSAgICB2c3QxLjE2ICAgICAgICAge2Q1fSwgW3IwXQotCi0gICAgYnggICAgICAgICAgICAgbHIKLQotICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tCi0KLWlkY3RfY29lZmYKLSAgICBEQ0QgICAgIDB4NGU3YjRlN2IsIDB4OGE4YzhhOGMKLQotOzIwMDkxLCAyMDA5MSwgMzU0NjgsIDM1NDY4Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDE2eDE2X25lb24uYXNtIGIvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0MTZ4MTZfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODk5OWIuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0MTZ4MTZfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi1maWx0ZXIxNl9jb2VmZgotICAgIERDRCAgICAgMCwgIDAsICAxMjgsICAgIDAsICAgMCwgIDAsICAgMCwgIDAKLSAgICBEQ0QgICAgIDAsIC02LCAgMTIzLCAgIDEyLCAgLTEsICAwLCAgIDAsICAwCi0gICAgRENEICAgICAyLCAtMTEsIDEwOCwgICAzNiwgIC04LCAgMSwgICAwLCAgMAotICAgIERDRCAgICAgMCwgLTksICAgOTMsICAgNTAsICAtNiwgIDAsICAgMCwgIDAKLSAgICBEQ0QgICAgIDMsIC0xNiwgIDc3LCAgIDc3LCAtMTYsICAzLCAgIDAsICAwCi0gICAgRENEICAgICAwLCAtNiwgICA1MCwgICA5MywgIC05LCAgMCwgICAwLCAgMAotICAgIERDRCAgICAgMSwgLTgsICAgMzYsICAxMDgsIC0xMSwgIDIsICAgMCwgIDAKLSAgICBEQ0QgICAgIDAsIC0xLCAgIDEyLCAgMTIzLCAgLTYsICAgMCwgIDAsICAwCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyByMiAgICBpbnQgIHhvZmZzZXQsCi07IHIzICAgIGludCAgeW9mZnNldCwKLTsgcjQgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgc3RhY2socjUpIGludCAgZHN0X3BpdGNoCi0KLTtOb3RlOiBUbyB0YWtlIGFkdmFudGFnZSBvZiA4LWJpdCBtdWxwbGljYXRpb24gaW5zdHJ1Y3Rpb24gaW4gTkVPTi4gRmlyc3QgYXBwbHkgYWJzKCkgdG8KLTsgZmlsdGVyIGNvZWZmcyB0byBtYWtlIHRoZW0gdTguIFRoZW4sIHVzZSB2bWxzbCBmb3IgbmVndGl2ZSBjb2VmZnMuIEFmdGVyIG11bHRpcGxpY2F0aW9uLAotOyB0aGUgcmVzdWx0IGNhbiBiZSBuZWd0aXZlLiBTbywgSSB0cmVhdCB0aGUgcmVzdWx0IGFzIHMxNi4gQnV0LCBzaW5jZSBpdCBpcyBhbHNvIHBvc3NpYmxlCi07IHRoYXQgdGhlIHJlc3VsdCBjYW4gYmUgYSBsYXJnZSBwb3NpdGl2ZSBudW1iZXIgKD4gMl4xNS0xKSwgd2hpY2ggY291bGQgYmUgY29uZnVzZWQgYXMgYQotOyBuZWd0aXZlIG51bWJlci4gVG8gYXZvaWQgdGhhdCBlcnJvciwgYXBwbHkgZmlsdGVyIGNvZWZmcyBpbiB0aGUgb3JkZXIgb2YgMCwgMSwgNCAsNSAsMiwKLTsgd2hpY2ggZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgc3RheXMgaW4gczE2IHJhbmdlLiBGaW5hbGx5LCBzYXR1cmF0ZWQgYWRkIHRoZSByZXN1bHQgYnkKLTsgYXBwbHlpbmcgM3JkIGZpbHRlciBjb2VmZi4gU2FtZSBhcHBseXMgdG8gb3RoZXIgZmlsdGVyIGZ1bmN0aW9ucy4KLQotfHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X25lb258IFBST0MKLSAgICBwdXNoICAgICAgICAgICAge3I0LXI1LCBscn0KLQotICAgIGFkciAgICAgICAgICAgICByMTIsIGZpbHRlcjE2X2NvZWZmCi0gICAgbGRyICAgICAgICAgICAgIHI0LCBbc3AsICMxMl0gICAgICAgICAgIDtsb2FkIHBhcmFtZXRlcnMgZnJvbSBzdGFjawotICAgIGxkciAgICAgICAgICAgICByNSwgW3NwLCAjMTZdICAgICAgICAgICA7bG9hZCBwYXJhbWV0ZXJzIGZyb20gc3RhY2sKLQotICAgIGNtcCAgICAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKLSAgICBiZXEgICAgICAgICAgICAgc2Vjb25kcGFzc19maWx0ZXIxNngxNl9vbmx5Ci0KLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIxMiwgcjIsIGxzbCAjNSAgICAgO2NhbGN1bGF0ZSBmaWx0ZXIgbG9jYXRpb24KLQotICAgIGNtcCAgICAgICAgICAgICByMywgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCi0KLSAgICB2bGQxLnMzMiAgICAgICAge3ExNCwgcTE1fSwgW3IyXSAgICAgICAgO2xvYWQgZmlyc3RfcGFzcyBmaWx0ZXIKLQotICAgIGJlcSAgICAgICAgICAgICBmaXJzdHBhc3NfZmlsdGVyMTZ4MTZfb25seQotCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzMzNiAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIG1vdiAgICAgICAgICAgICBsciwgc3AKLQotICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNAotICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQotCi0gICAgbW92ICAgICAgICAgICAgIHIyLCAjNyAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLSAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgO21vdmUgc3JjcHRyIGJhY2sgdG8gKGxpbmUtMikgYW5kIChjb2x1bW4tMikKLSAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCi0KLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQyNFswXSAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMC1kNSkKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQyNFs0XQotICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDI1WzBdCi0gICAgdmR1cC44ICAgICAgICAgIGQzLCBkMjVbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDQsIGQyNlswXQotICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDI2WzRdCi0KLTtGaXJzdCBQYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDIxeDE2KQotZmlsdF9ibGsyZF9mcDE2eDE2X2xvb3BfbmVvbgotICAgIHZsZDEudTggICAgICAgICB7ZDYsIGQ3LCBkOH0sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICB2bGQxLnU4ICAgICAgICAge2Q5LCBkMTAsIGQxMX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTIsIGQxMywgZDE0fSwgW3IwXSwgcjEKLQotICAgIHBsZCAgICAgICAgICAgICBbcjBdCi0gICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCi0gICAgcGxkICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KLQotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDYsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTksIGQ3LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQ5LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTEsIGQxMCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEyLCBkMTIsIGQwCi0gICAgdm11bGwudTggICAgICAgIHExMywgZDEzLCBkMAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOSwgZDEwLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMQotCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjgsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMjksIGQxCi0gICAgdm1sc2wudTggICAgICAgIHExMiwgZDMwLCBkMQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDcsIGQ4LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMywgZDE0LCAjMQotCi0gICAgdm1sc2wudTggICAgICAgIHE5LCBkMjgsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTExLCBkMjksIGQxCi0gICAgdm1sc2wudTggICAgICAgIHExMywgZDMwLCBkMQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNCAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ5LCBkMTAsICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICM0Ci0KLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOCwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHExMCwgZDI5LCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxMTIsIGQzMCwgZDQKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ3LCBkOCwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTMsIGQxNCwgIzQKLQotICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDI4LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKLSAgICB2bWxzbC51OCAgICAgICAgcTExLCBkMjksIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHExMywgZDMwLCBkNAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ5LCBkMTAsICM1Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICM1Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKLSAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMjksIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHExMiwgZDMwLCBkNQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDcsIGQ4LCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMywgZDE0LCAjNQotCi0gICAgdm1sYWwudTggICAgICAgIHE5LCBkMjgsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCi0gICAgdm1sYWwudTggICAgICAgIHExMSwgZDI5LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxMTMsIGQzMCwgZDUKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzIgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOSwgZDEwLCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMgotCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMjgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCi0gICAgdm1sYWwudTggICAgICAgIHExMCwgZDI5LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQzMCwgZDIKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ3LCBkOCwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTMsIGQxNCwgIzIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDI4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQyOSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTEzLCBkMzAsIGQyCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMzICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDksIGQxMCwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzMKLQotICAgIHZleHQuOCAgICAgICAgICBkMTUsIGQ3LCBkOCwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTAsIGQxMSwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDYsIGQxMywgZDE0LCAjMwotCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMjgsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE1LCBkMjksIGQzCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMzAsIGQzCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0ICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE1Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMiwgcTYKLQotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDE1LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDMxLCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDYsIGQzCi0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNgotICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHE3Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMywgcTMKLQotICAgIHZxcnNocnVuLnMxNiAgICBkNiwgcTgsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDcsIHE5LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkOCwgcTEwLCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTExLCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkMTAsIHExMiwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDExLCBxMTMsICM3Ci0KLSAgICB2c3QxLnU4ICAgICAgICAge2Q2LCBkNywgZDh9LCBbbHJdISAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDksIGQxMCwgZDExfSwgW2xyXSEKLQotICAgIGJuZSAgICAgICAgICAgICBmaWx0X2JsazJkX2ZwMTZ4MTZfbG9vcF9uZW9uCi0KLTtTZWNvbmQgcGFzczogMTZ4MTYKLTtzZWNvbmRwYXNzX2ZpbHRlciAtIGRvIGZpcnN0IDgtY29sdW1ucyBhbmQgdGhlbiBzZWNvbmQgOC1jb2x1bW5zCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzUKLSAgICBzdWIgICAgICAgICAgICAgbHIsIGxyLCAjMzM2Ci0KLSAgICB2bGQxLnMzMiAgICAgICAge3E1LCBxNn0sIFtyM10gICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCi0gICAgbW92ICAgICAgICAgICAgIHIzLCAjMiAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLQotICAgIHZhYnMuczMyICAgICAgICBxNywgcTUKLSAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjIsICMxNgotCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMTRbMF0gICAgICAgICAgICAgIDtzZWNvbmRfcGFzcyBmaWx0ZXIgcGFyYW1ldGVycyAoZDAtZDUpCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMTRbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQxNVswXQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDE1WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMTZbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQxNls0XQotCi1maWx0X2JsazJkX3NwMTZ4MTZfb3V0bG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTh9LCBbbHJdLCByMiAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTl9LCBbbHJdLCByMgotICAgIHZsZDEudTggICAgICAgICB7ZDIwfSwgW2xyXSwgcjIKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMX0sIFtscl0sIHIyCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMn0sIFtscl0sIHIyCi0KLXNlY29uZHBhc3NfaW5uZXJfbG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjN9LCBbbHJdLCByMiAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjR9LCBbbHJdLCByMgotICAgIHZsZDEudTggICAgICAgICB7ZDI1fSwgW2xyXSwgcjIKLSAgICB2bGQxLnU4ICAgICAgICAge2QyNn0sIFtscl0sIHIyCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTMsIGQxOCwgZDAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMTksIGQwCi0gICAgdm11bGwudTggICAgICAgIHE1LCBkMjAsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMjEsIGQwCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTMsIGQxOSwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQotICAgIHZtbHNsLnU4ICAgICAgICBxNCwgZDIwLCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxNSwgZDIxLCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxNiwgZDIyLCBkMQotCi0gICAgdm1sc2wudTggICAgICAgIHEzLCBkMjIsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxNCwgZDIzLCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxNSwgZDI0LCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxNiwgZDI1LCBkNAotCi0gICAgdm1sYWwudTggICAgICAgIHEzLCBkMjAsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCi0gICAgdm1sYWwudTggICAgICAgIHE0LCBkMjEsIGQyCi0gICAgdm1sYWwudTggICAgICAgIHE1LCBkMjIsIGQyCi0gICAgdm1sYWwudTggICAgICAgIHE2LCBkMjMsIGQyCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyMywgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKLSAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyNCwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyNSwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyNiwgZDUKLQotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDIxLCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDIyLCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDIzLCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQyNCwgZDMKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKLSAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgotCi0gICAgdnFyc2hydW4uczE2ICAgIGQ2LCBxNywgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkNywgcTgsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ4LCBxOSwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDksIHExMCwgIzcKLQotICAgIHZzdDEudTggICAgICAgICB7ZDZ9LCBbcjRdLCByNSAgICAgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgdm1vdiAgICAgICAgICAgIHE5LCBxMTEKLSAgICB2c3QxLnU4ICAgICAgICAge2Q3fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgcTEwLCBxMTIKLSAgICB2c3QxLnU4ICAgICAgICAge2Q4fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgZDIyLCBkMjYKLSAgICB2c3QxLnU4ICAgICAgICAge2Q5fSwgW3I0XSwgcjUKLQotICAgIGJuZSAgICAgICAgICAgICBzZWNvbmRwYXNzX2lubmVyX2xvb3BfbmVvbgotCi0gICAgc3VicyAgICAgICAgICAgIHIzLCByMywgIzEKLSAgICBzdWIgICAgICAgICAgICAgbHIsIGxyLCAjMzM2Ci0gICAgYWRkICAgICAgICAgICAgIGxyLCBsciwgIzgKLQotICAgIHN1YiAgICAgICAgICAgICByNCwgcjQsIHI1LCBsc2wgIzQKLSAgICBhZGQgICAgICAgICAgICAgcjQsIHI0LCAjOAotCi0gICAgYm5lIGZpbHRfYmxrMmRfc3AxNngxNl9vdXRsb29wX25lb24KLQotICAgIGFkZCAgICAgICAgICAgICBzcCwgc3AsICMzMzYKLSAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZpcnN0cGFzc19maWx0ZXIxNngxNl9vbmx5Ci0gICAgdmFicy5zMzIgICAgICAgIHExMiwgcTE0Ci0gICAgdmFicy5zMzIgICAgICAgIHExMywgcTE1Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjIsICM4ICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMyICAgICAgICAgICAgICA7bW92ZSBzcmNwdHIgYmFjayB0byAoY29sdW1uLTIpCi0KLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQyNFswXSAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMC1kNSkKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQyNFs0XQotICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDI1WzBdCi0gICAgdmR1cC44ICAgICAgICAgIGQzLCBkMjVbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDQsIGQyNlswXQotICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDI2WzRdCi0KLTtGaXJzdCBQYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDE2eDE2KQotZmlsdF9ibGsyZF9mcG8xNngxNl9sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge2Q2LCBkNywgZDh9LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtkOSwgZDEwLCBkMTF9LCBbcjBdLCByMQotCi0gICAgcGxkICAgICAgICAgICAgIFtyMF0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KLQotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDYsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQ3LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDksIGQwCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMTAsIGQwCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDIwLCBkNiwgZDcsICMxICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQotICAgIHZleHQuOCAgICAgICAgICBkMjEsIGQ5LCBkMTAsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQyMiwgZDcsIGQ4LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMjMsIGQxMCwgZDExLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMjQsIGQ2LCBkNywgIzQgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KLSAgICB2ZXh0LjggICAgICAgICAgZDI1LCBkOSwgZDEwLCAjNAotICAgIHZleHQuOCAgICAgICAgICBkMjYsIGQ3LCBkOCwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkMTAsIGQxMSwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDksIGQxMCwgIzUKLQotICAgIHZtbHNsLnU4ICAgICAgICBxNiwgZDIwLCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjEsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE3LCBkMjIsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTksIGQyMywgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNCwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjUsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE3LCBkMjYsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDI3LCBkNAotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkNQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyMCwgZDcsIGQ4LCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMjEsIGQxMCwgZDExLCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMjIsIGQ2LCBkNywgIzIgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KLSAgICB2ZXh0LjggICAgICAgICAgZDIzLCBkOSwgZDEwLCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMjQsIGQ3LCBkOCwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDI1LCBkMTAsIGQxMSwgIzIKLQotICAgIHZleHQuOCAgICAgICAgICBkMjYsIGQ2LCBkNywgIzMgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkOSwgZDEwLCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ3LCBkOCwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzMKLQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDIwLCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDIxLCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDIyLCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDIzLCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI0LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDI1LCBkMgotCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDI2LCBkMyAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHExMSwgZDI3LCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQyOCwgZDMgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxMTUsIGQyOSwgZDMKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNiwgcTEwICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE4LCBxMTEKLSAgICB2cWFkZC5zMTYgICAgICAgcTcsIHExMgotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTE1Ci0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnFyc2hydW4uczE2ICAgIGQ2LCBxNiwgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkNywgcTcsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ4LCBxOCwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDksIHE5LCAjNwotCi0gICAgdnN0MS51OCAgICAgICAgIHtxM30sIFtyNF0sIHI1ICAgICAgICAgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgdnN0MS51OCAgICAgICAgIHtxNH0sIFtyNF0sIHI1Ci0KLSAgICBibmUgICAgICAgICAgICAgZmlsdF9ibGsyZF9mcG8xNngxNl9sb29wX25lb24KLQotICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUscGN9Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLQotc2Vjb25kcGFzc19maWx0ZXIxNngxNl9vbmx5Ci07U2Vjb25kIHBhc3M6IDE2eDE2Ci0gICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzUKLSAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMSwgbHNsICMxCi0KLSAgICB2bGQxLnMzMiAgICAgICAge3E1LCBxNn0sIFtyM10gICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCi0gICAgbW92ICAgICAgICAgICAgIHIzLCAjMiAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLQotICAgIHZhYnMuczMyICAgICAgICBxNywgcTUKLSAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2Ci0KLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQxNFswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMC1kNSkKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQotICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCi0gICAgdmR1cC44ICAgICAgICAgIGQzLCBkMTVbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQotICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCi0KLWZpbHRfYmxrMmRfc3BvMTZ4MTZfb3V0bG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTh9LCBbcjBdLCByMSAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTl9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDIwfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMX0sIFtyMF0sIHIxCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMn0sIFtyMF0sIHIxCi0KLXNlY29uZHBhc3Nfb25seV9pbm5lcl9sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge2QyM30sIFtyMF0sIHIxICAgICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICB2bGQxLnU4ICAgICAgICAge2QyNH0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjV9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDI2fSwgW3IwXSwgcjEKLQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDE4LCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQxOSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyMCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyMSwgZDAKLQotICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDE5LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjAsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjEsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjIsIGQxCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTMsIGQyMiwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjMsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjQsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjUsIGQ0Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyMCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyMSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyMiwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyMywgZDIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIzLCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI0LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI1LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI2LCBkNQotCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMjEsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMjIsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMjMsIGQzCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDI0LCBkMwotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKLSAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0Ci0gICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQotICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2Ci0KLSAgICB2cXJzaHJ1bi5zMTYgICAgZDYsIHE3LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ3LCBxOCwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDgsIHE5LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTEwLCAjNwotCi0gICAgdnN0MS51OCAgICAgICAgIHtkNn0sIFtyNF0sIHI1ICAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2bW92ICAgICAgICAgICAgcTksIHExMQotICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjRdLCByNQotICAgIHZtb3YgICAgICAgICAgICBxMTAsIHExMgotICAgIHZzdDEudTggICAgICAgICB7ZDh9LCBbcjRdLCByNQotICAgIHZtb3YgICAgICAgICAgICBkMjIsIGQyNgotICAgIHZzdDEudTggICAgICAgICB7ZDl9LCBbcjRdLCByNQotCi0gICAgYm5lICAgICAgICAgICAgIHNlY29uZHBhc3Nfb25seV9pbm5lcl9sb29wX25lb24KLQotICAgIHN1YnMgICAgICAgICAgICByMywgcjMsICMxCi0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjNAotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzIKLSAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCByMQotICAgIGFkZCAgICAgICAgICAgICByMCwgcjAsICM4Ci0KLSAgICBzdWIgICAgICAgICAgICAgcjQsIHI0LCByNSwgbHNsICM0Ci0gICAgYWRkICAgICAgICAgICAgIHI0LCByNCwgIzgKLQotICAgIGJuZSBmaWx0X2JsazJkX3NwbzE2eDE2X291dGxvb3BfbmVvbgotCi0gICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KLQotICAgIEVORFAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0NHg0X25lb24uYXNtIGIvdnA4L2NvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0NHg0X25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA5ODdhLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDR4NF9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3NpeHRhcF9wcmVkaWN0X25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi1maWx0ZXI0X2NvZWZmCi0gICAgRENEICAgICAwLCAgMCwgIDEyOCwgICAgMCwgICAwLCAgMCwgICAwLCAgMAotICAgIERDRCAgICAgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAsICAgMCwgIDAKLSAgICBEQ0QgICAgIDIsIC0xMSwgMTA4LCAgIDM2LCAgLTgsICAxLCAgIDAsICAwCi0gICAgRENEICAgICAwLCAtOSwgICA5MywgICA1MCwgIC02LCAgMCwgICAwLCAgMAotICAgIERDRCAgICAgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMsICAgMCwgIDAKLSAgICBEQ0QgICAgIDAsIC02LCAgIDUwLCAgIDkzLCAgLTksICAwLCAgIDAsICAwCi0gICAgRENEICAgICAxLCAtOCwgICAzNiwgIDEwOCwgLTExLCAgMiwgICAwLCAgMAotICAgIERDRCAgICAgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgICAwLCAgMCwgIDAKLQotOy0tLS0tLS0tLS0tLS0tLS0tCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyByMSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07IHIyICAgIGludCAgeG9mZnNldCwKLTsgcjMgICAgaW50ICB5b2Zmc2V0LAotOyBzdGFjayhyNCkgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgc3RhY2sobHIpIGludCAgZHN0X3BpdGNoCi0KLXx2cDhfc2l4dGFwX3ByZWRpY3RfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQotCi0gICAgYWRyICAgICAgICAgICAgIHIxMiwgZmlsdGVyNF9jb2VmZgotICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjOF0gICAgICAgICAgICA7bG9hZCBwYXJhbWV0ZXJzIGZyb20gc3RhY2sKLSAgICBsZHIgICAgICAgICAgICAgbHIsIFtzcCwgIzEyXSAgICAgICAgICAgO2xvYWQgcGFyYW1ldGVycyBmcm9tIHN0YWNrCi0KLSAgICBjbXAgICAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgYmVxICAgICAgICAgICAgIHNlY29uZHBhc3NfZmlsdGVyNHg0X29ubHkKLQotICAgIGFkZCAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICM1ICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgotCi0gICAgY21wICAgICAgICAgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKLSAgICB2bGQxLnMzMiAgICAgICAge3ExNCwgcTE1fSwgW3IyXSAgICAgICAgO2xvYWQgZmlyc3RfcGFzcyBmaWx0ZXIKLQotICAgIGJlcSAgICAgICAgICAgICBmaXJzdHBhc3NfZmlsdGVyNHg0X29ubHkKLQotICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNCAgICAgICAgICAgICAgICA7Z2V0IGFicyhmaWxlcl9wYXJhbWV0ZXJzKQotICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQotCi0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgIDtnbyBiYWNrIDIgY29sdW1ucyBvZiBzcmMgZGF0YQotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEgICAgICA7Z28gYmFjayAyIGxpbmVzIG9mIHNyYyBkYXRhCi0KLTtGaXJzdCBwYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDl4NCkKLSAgICB2bGQxLnU4ICAgICAgICAge3EzfSwgW3IwXSwgcjEgICAgICAgICAgO2xvYWQgZmlyc3QgNC1saW5lIHNyYyBkYXRhCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMjRbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAtZDUpCi0gICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMjRbNF0KLSAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQyNVswXQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDI1WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMjZbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQyNls0XQotCi0gICAgcGxkICAgICAgICAgICAgIFtyMF0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQotCi0gICAgdmV4dC44ICAgICAgICAgIGQxOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQotICAgIHZleHQuOCAgICAgICAgICBkMTksIGQ4LCBkOSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDIwLCBkMTAsIGQxMSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDIxLCBkMTIsIGQxMywgIzUKLQotICAgIHZzd3AgICAgICAgICAgICBkNywgZDggICAgICAgICAgICAgICAgICA7ZGlzY2FyZCAybmQgaGFsZiBkYXRhIGFmdGVyIHNyY19wdHJbM10gaXMgZG9uZQotICAgIHZzd3AgICAgICAgICAgICBkMTEsIGQxMgotCi0gICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clszXSkKLSAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQxOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKLSAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyMCwgZDUKLQotICAgIHZtb3YgICAgICAgICAgICBxNCwgcTMgICAgICAgICAgICAgICAgICA7a2VlcCBvcmlnaW5hbCBzcmMgZGF0YSBpbiBxNCBxNgotICAgIHZtb3YgICAgICAgICAgICBxNiwgcTUKLQotICAgIHZ6aXAuMzIgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTJdLCBhbmQgcHV0IDItbGluZSBkYXRhIHRvZ2V0aGVyCi0gICAgdnppcC4zMiAgICAgICAgIGQxMCwgZDExCi0gICAgdnNoci51NjQgICAgICAgIHE5LCBxNCwgIzggICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KLSAgICB2c2hyLnU2NCAgICAgICAgcTEwLCBxNiwgIzgKLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQ2LCBkMCAgICAgICAgICAgICAgOysoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDEwLCBkMAotCi0gICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clstMV0pCi0gICAgdnppcC4zMiAgICAgICAgIGQyMCwgZDIxCi0gICAgdnNoci51NjQgICAgICAgIHEzLCBxNCwgIzMyICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQotICAgIHZzaHIudTY0ICAgICAgICBxNSwgcTYsICMzMgotICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDE4LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjAsIGQxCi0KLSAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzJdKQotICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQotICAgIHZzaHIudTY0ICAgICAgICBxOSwgcTQsICMxNiAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KLSAgICB2c2hyLnU2NCAgICAgICAgcTEwLCBxNiwgIzE2Ci0gICAgdm1sc2wudTggICAgICAgIHE3LCBkNiwgZDQgICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDEwLCBkNAotCi0gICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clswXSkKLSAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKLSAgICB2c2hyLnU2NCAgICAgICAgcTMsIHE0LCAjMjQgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdnNoci51NjQgICAgICAgIHE1LCBxNiwgIzI0Ci0gICAgdm1sYWwudTggICAgICAgIHE3LCBkMTgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMjAsIGQyCi0KLSAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzFdKQotICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQotICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDYsIGQzICAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMCwgZDMKLQotICAgIHZsZDEudTggICAgICAgICB7cTN9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCByZXN0IDUtbGluZSBzcmMgZGF0YQotICAgIHZsZDEudTggICAgICAgICB7cTR9LCBbcjBdLCByMQotCi0gICAgdnFhZGQuczE2ICAgICAgIHE3LCBxOSAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKLSAgICB2cWFkZC5zMTYgICAgICAgcTgsIHExMAotCi0gICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCi0KLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI3LCBxNywgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hydW4uczE2ICAgIGQyOCwgcTgsICM3Ci0KLSAgICA7Rmlyc3QgUGFzcyBvbiByZXN0IDUtbGluZSBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtxMTF9LCBbcjBdLCByMQotCi0gICAgdmV4dC44ICAgICAgICAgIGQxOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQotICAgIHZleHQuOCAgICAgICAgICBkMTksIGQ4LCBkOSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDIwLCBkMTAsIGQxMSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDIxLCBkMTIsIGQxMywgIzUKLQotICAgIHZzd3AgICAgICAgICAgICBkNywgZDggICAgICAgICAgICAgICAgICA7ZGlzY2FyZCAybmQgaGFsZiBkYXRhIGFmdGVyIHNyY19wdHJbM10gaXMgZG9uZQotICAgIHZzd3AgICAgICAgICAgICBkMTEsIGQxMgotCi0gICAgdnppcC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clszXSkKLSAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMjIsIGQyMywgIzUgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMTgsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMjAsIGQ1Ci0gICAgdm11bGwudTggICAgICAgIHExMiwgZDMxLCBkNSAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCi0KLSAgICB2bW92ICAgICAgICAgICAgcTQsIHEzICAgICAgICAgICAgICAgICAgO2tlZXAgb3JpZ2luYWwgc3JjIGRhdGEgaW4gcTQgcTYKLSAgICB2bW92ICAgICAgICAgICAgcTYsIHE1Ci0KLSAgICB2emlwLjMyICAgICAgICAgZDYsIGQ3ICAgICAgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0yXSwgYW5kIHB1dCAyLWxpbmUgZGF0YSB0b2dldGhlcgotICAgIHZ6aXAuMzIgICAgICAgICBkMTAsIGQxMQotICAgIHZzaHIudTY0ICAgICAgICBxOSwgcTQsICM4ICAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCi0gICAgdnNoci51NjQgICAgICAgIHExMCwgcTYsICM4Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQ2LCBkMCAgICAgICAgICAgICAgOysoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDEwLCBkMAotICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQyMiwgZDAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLQotICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbLTFdKQotICAgIHZ6aXAuMzIgICAgICAgICBkMjAsIGQyMQotICAgIHZzaHIudTY0ICAgICAgICBxMywgcTQsICMzMiAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KLSAgICB2c2hyLnU2NCAgICAgICAgcTUsIHE2LCAjMzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMjIsIGQyMywgIzEgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQotCi0gICAgdm1sc2wudTggICAgICAgIHE3LCBkMTgsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyMCwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTEyLCBkMzEsIGQxICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQotCi0gICAgdnppcC4zMiAgICAgICAgIGQ2LCBkNyAgICAgICAgICAgICAgICAgIDtwdXQgMi1saW5lIGRhdGEgaW4gMSByZWdpc3RlciAoc3JjX3B0clsyXSkKLSAgICB2emlwLjMyICAgICAgICAgZDEwLCBkMTEKLSAgICB2c2hyLnU2NCAgICAgICAgcTksIHE0LCAjMTYgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCi0gICAgdnNoci51NjQgICAgICAgIHExMCwgcTYsICMxNgotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQyMiwgZDIzLCAjNCAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KLQotICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDYsIGQ0ICAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQxMCwgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTEyLCBkMzEsIGQ0ICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0KLSAgICB2emlwLjMyICAgICAgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzBdKQotICAgIHZ6aXAuMzIgICAgICAgICBkMjAsIGQyMQotICAgIHZzaHIudTY0ICAgICAgICBxMywgcTQsICMyNCAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICB2c2hyLnU2NCAgICAgICAgcTUsIHE2LCAjMjQKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMjIsIGQyMywgIzIgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQxOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyMCwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMzEsIGQyICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLQotICAgIHZ6aXAuMzIgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbMV0pCi0gICAgdnppcC4zMiAgICAgICAgIGQxMCwgZDExCi0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDIyLCBkMjMsICMzICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQotICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDYsIGQzICAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMCwgZDMKLSAgICB2bXVsbC51OCAgICAgICAgcTExLCBkMzEsIGQzICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKLQotICAgIGFkZCAgICAgICAgICAgICByMywgcjEyLCByMywgbHNsICM1Ci0KLSAgICB2cWFkZC5zMTYgICAgICAgcTcsIHE5ICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTEwCi0gICAgdnFhZGQuczE2ICAgICAgIHExMiwgcTExCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDIzLCBkMjcsIGQyOCwgIzQKLSAgICB2bGQxLnMzMiAgICAgICAge3E1LCBxNn0sIFtyM10gICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCi0KLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI5LCBxNywgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hydW4uczE2ICAgIGQzMCwgcTgsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQzMSwgcTEyLCAjNwotCi07U2Vjb25kIHBhc3M6IDR4NAotICAgIHZhYnMuczMyICAgICAgICBxNywgcTUKLSAgICB2YWJzLnMzMiAgICAgICAgcTgsIHE2Ci0KLSAgICB2ZXh0LjggICAgICAgICAgZDI0LCBkMjgsIGQyOSwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI1LCBkMjksIGQzMCwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI2LCBkMzAsIGQzMSwgIzQKLQotICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDE0WzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwLWQ1KQotICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDE0WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQyLCBkMTVbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDMsIGQxNVs0XQotICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDE2WzBdCi0gICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMTZbNF0KLQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI3LCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOCwgZDAKLQotICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI1LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDI2LCBkNQotCi0gICAgdm1sc2wudTggICAgICAgIHEzLCBkMjksIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxNCwgZDMwLCBkNAotCi0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjMsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNCwgZDEKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDI4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI5LCBkMgotCi0gICAgdm1sYWwudTggICAgICAgIHE1LCBkMjQsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm1sYWwudTggICAgICAgIHE2LCBkMjUsIGQzCi0KLSAgICBhZGQgICAgICAgICAgICAgcjAsIHI0LCBscgotICAgIGFkZCAgICAgICAgICAgICByMSwgcjAsIGxyCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMSwgbHIKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNSwgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE2LCBxNAotCi0gICAgdnFyc2hydW4uczE2ICAgIGQzLCBxNSwgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkNCwgcTYsICM3Ci0KLSAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgW3I0XSAgICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMV19LCBbcjBdCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMV0KLSAgICB2c3QxLjMyICAgICAgICAge2Q0WzFdfSwgW3IyXQotCi0gICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZmlyc3RwYXNzX2ZpbHRlcjR4NF9vbmx5Ci0gICAgdmFicy5zMzIgICAgICAgIHExMiwgcTE0ICAgICAgICAgICAgICAgIDtnZXQgYWJzKGZpbGVyX3BhcmFtZXRlcnMpCi0gICAgdmFicy5zMzIgICAgICAgIHExMywgcTE1Ci0KLSAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgO2dvIGJhY2sgMiBjb2x1bW5zIG9mIHNyYyBkYXRhCi0KLTtGaXJzdCBwYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDR4NCkKLSAgICB2bGQxLnU4ICAgICAgICAge3EzfSwgW3IwXSwgcjEgICAgICAgICAgO2xvYWQgZmlyc3QgNC1saW5lIHNyYyBkYXRhCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMjRbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAtZDUpCi0gICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMjRbNF0KLSAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQyNVswXQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotCi0gICAgdmR1cC44ICAgICAgICAgIGQzLCBkMjVbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDQsIGQyNlswXQotICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDI2WzRdCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDE4LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCi0gICAgdmV4dC44ICAgICAgICAgIGQxOSwgZDgsIGQ5LCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMjAsIGQxMCwgZDExLCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMjEsIGQxMiwgZDEzLCAjNQotCi0gICAgdnN3cCAgICAgICAgICAgIGQ3LCBkOCAgICAgICAgICAgICAgICAgIDtkaXNjYXJkIDJuZCBoYWxmIGRhdGEgYWZ0ZXIgc3JjX3B0clszXSBpcyBkb25lCi0gICAgdnN3cCAgICAgICAgICAgIGQxMSwgZDEyCi0KLSAgICB2emlwLjMyICAgICAgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzNdKQotICAgIHZ6aXAuMzIgICAgICAgICBkMjAsIGQyMQotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDE4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDIwLCBkNQotCi0gICAgdm1vdiAgICAgICAgICAgIHE0LCBxMyAgICAgICAgICAgICAgICAgIDtrZWVwIG9yaWdpbmFsIHNyYyBkYXRhIGluIHE0IHE2Ci0gICAgdm1vdiAgICAgICAgICAgIHE2LCBxNQotCi0gICAgdnppcC4zMiAgICAgICAgIGQ2LCBkNyAgICAgICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMl0sIGFuZCBwdXQgMi1saW5lIGRhdGEgdG9nZXRoZXIKLSAgICB2emlwLjMyICAgICAgICAgZDEwLCBkMTEKLSAgICB2c2hyLnU2NCAgICAgICAgcTksIHE0LCAjOCAgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQotICAgIHZzaHIudTY0ICAgICAgICBxMTAsIHE2LCAjOAotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDYsIGQwICAgICAgICAgICAgICA7KyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMTAsIGQwCi0KLSAgICB2emlwLjMyICAgICAgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWy0xXSkKLSAgICB2emlwLjMyICAgICAgICAgZDIwLCBkMjEKLSAgICB2c2hyLnU2NCAgICAgICAgcTMsIHE0LCAjMzIgICAgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCi0gICAgdnNoci51NjQgICAgICAgIHE1LCBxNiwgIzMyCi0gICAgdm1sc2wudTggICAgICAgIHE3LCBkMTgsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyMCwgZDEKLQotICAgIHZ6aXAuMzIgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbMl0pCi0gICAgdnppcC4zMiAgICAgICAgIGQxMCwgZDExCi0gICAgdnNoci51NjQgICAgICAgIHE5LCBxNCwgIzE2ICAgICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQotICAgIHZzaHIudTY0ICAgICAgICBxMTAsIHE2LCAjMTYKLSAgICB2bWxzbC51OCAgICAgICAgcTcsIGQ2LCBkNCAgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMTAsIGQ0Ci0KLSAgICB2emlwLjMyICAgICAgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgO3B1dCAyLWxpbmUgZGF0YSBpbiAxIHJlZ2lzdGVyIChzcmNfcHRyWzBdKQotICAgIHZ6aXAuMzIgICAgICAgICBkMjAsIGQyMQotICAgIHZzaHIudTY0ICAgICAgICBxMywgcTQsICMyNCAgICAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICB2c2hyLnU2NCAgICAgICAgcTUsIHE2LCAjMjQKLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQxOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyMCwgZDIKLQotICAgIHZ6aXAuMzIgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICA7cHV0IDItbGluZSBkYXRhIGluIDEgcmVnaXN0ZXIgKHNyY19wdHJbMV0pCi0gICAgdnppcC4zMiAgICAgICAgIGQxMCwgZDExCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkNiwgZDMgICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDEwLCBkMwotCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByNCwgbHIKLSAgICBhZGQgICAgICAgICAgICAgcjEsIHIwLCBscgotICAgIGFkZCAgICAgICAgICAgICByMiwgcjEsIGxyCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTcsIHE5ICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTEwCi0KLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI3LCBxNywgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hydW4uczE2ICAgIGQyOCwgcTgsICM3Ci0KLSAgICB2c3QxLjMyICAgICAgICAge2QyN1swXX0sIFtyNF0gICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEuMzIgICAgICAgICB7ZDI3WzFdfSwgW3IwXQotICAgIHZzdDEuMzIgICAgICAgICB7ZDI4WzBdfSwgW3IxXQotICAgIHZzdDEuMzIgICAgICAgICB7ZDI4WzFdfSwgW3IyXQotCi0gICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2Vjb25kcGFzc19maWx0ZXI0eDRfb25seQotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEKLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQotCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMjdbMF19LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS5zMzIgICAgICAgIHtxNSwgcTZ9LCBbcjNdICAgICAgICAgIDtsb2FkIHNlY29uZF9wYXNzIGZpbHRlcgotICAgIHZsZDEuMzIgICAgICAgICB7ZDI3WzFdfSwgW3IwXSwgcjEKLSAgICB2YWJzLnMzMiAgICAgICAgcTcsIHE1Ci0gICAgdmxkMS4zMiAgICAgICAgIHtkMjhbMF19LCBbcjBdLCByMQotICAgIHZhYnMuczMyICAgICAgICBxOCwgcTYKLSAgICB2bGQxLjMyICAgICAgICAge2QyOFsxXX0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMTRbMF0gICAgICAgICAgICAgIDtzZWNvbmRfcGFzcyBmaWx0ZXIgcGFyYW1ldGVycyAoZDAtZDUpCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMjlbMF19LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDE0WzRdCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMjlbMV19LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkMiwgZDE1WzBdCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzBbMF19LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDE1WzRdCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzBbMV19LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDE2WzBdCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzFbMF19LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkNSwgZDE2WzRdCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDIzLCBkMjcsIGQyOCwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI0LCBkMjgsIGQyOSwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI1LCBkMjksIGQzMCwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDI2LCBkMzAsIGQzMSwgIzQKLQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI3LCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOCwgZDAKLQotICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI1LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDI2LCBkNQotCi0gICAgdm1sc2wudTggICAgICAgIHEzLCBkMjksIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxNCwgZDMwLCBkNAotCi0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjMsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNCwgZDEKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDI4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI5LCBkMgotCi0gICAgdm1sYWwudTggICAgICAgIHE1LCBkMjQsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm1sYWwudTggICAgICAgIHE2LCBkMjUsIGQzCi0KLSAgICBhZGQgICAgICAgICAgICAgcjAsIHI0LCBscgotICAgIGFkZCAgICAgICAgICAgICByMSwgcjAsIGxyCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMSwgbHIKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNSwgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE2LCBxNAotCi0gICAgdnFyc2hydW4uczE2ICAgIGQzLCBxNSwgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkNCwgcTYsICM3Ci0KLSAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgW3I0XSAgICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMV19LCBbcjBdCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMV0KLSAgICB2c3QxLjMyICAgICAgICAge2Q0WzFdfSwgW3IyXQotCi0gICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9Ci0KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4NF9uZW9uLmFzbSBiL3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4NF9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTQwMC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDRfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9zaXh0YXBfcHJlZGljdDh4NF9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotZmlsdGVyOF9jb2VmZgotICAgIERDRCAgICAgMCwgIDAsICAxMjgsICAgIDAsICAgMCwgIDAsICAgMCwgIDAKLSAgICBEQ0QgICAgIDAsIC02LCAgMTIzLCAgIDEyLCAgLTEsICAwLCAgIDAsICAwCi0gICAgRENEICAgICAyLCAtMTEsIDEwOCwgICAzNiwgIC04LCAgMSwgICAwLCAgMAotICAgIERDRCAgICAgMCwgLTksICAgOTMsICAgNTAsICAtNiwgIDAsICAgMCwgIDAKLSAgICBEQ0QgICAgIDMsIC0xNiwgIDc3LCAgIDc3LCAtMTYsICAzLCAgIDAsICAwCi0gICAgRENEICAgICAwLCAtNiwgICA1MCwgICA5MywgIC05LCAgMCwgICAwLCAgMAotICAgIERDRCAgICAgMSwgLTgsICAgMzYsICAxMDgsIC0xMSwgIDIsICAgMCwgIDAKLSAgICBEQ0QgICAgIDAsIC0xLCAgIDEyLCAgMTIzLCAgLTYsICAgMCwgIDAsICAwCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyByMiAgICBpbnQgIHhvZmZzZXQsCi07IHIzICAgIGludCAgeW9mZnNldCwKLTsgcjQgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgc3RhY2socjUpIGludCAgZHN0X3BpdGNoCi0KLXx2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7cjQtcjUsIGxyfQotCi0gICAgYWRyICAgICAgICAgICAgIHIxMiwgZmlsdGVyOF9jb2VmZgotICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjMTJdICAgICAgICAgICA7bG9hZCBwYXJhbWV0ZXJzIGZyb20gc3RhY2sKLSAgICBsZHIgICAgICAgICAgICAgcjUsIFtzcCwgIzE2XSAgICAgICAgICAgO2xvYWQgcGFyYW1ldGVycyBmcm9tIHN0YWNrCi0KLSAgICBjbXAgICAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgYmVxICAgICAgICAgICAgIHNlY29uZHBhc3NfZmlsdGVyOHg0X29ubHkKLQotICAgIGFkZCAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICM1ICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgotCi0gICAgY21wICAgICAgICAgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKLQotICAgIHZsZDEuczMyICAgICAgICB7cTE0LCBxMTV9LCBbcjJdICAgICAgICA7bG9hZCBmaXJzdF9wYXNzIGZpbHRlcgotCi0gICAgYmVxICAgICAgICAgICAgIGZpcnN0cGFzc19maWx0ZXI4eDRfb25seQotCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzMyICAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNAotICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQotCi0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgIDttb3ZlIHNyY3B0ciBiYWNrIHRvIChsaW5lLTIpIGFuZCAoY29sdW1uLTIpCi0gICAgbW92ICAgICAgICAgICAgIGxyLCBzcAotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEKLQotICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDI0WzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwLWQ1KQotICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDI0WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQyLCBkMjVbMF0KLQotO0ZpcnN0IHBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoOXg4KQotICAgIHZsZDEudTggICAgICAgICB7cTN9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCBzcmMgZGF0YQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDI1WzRdCi0gICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMjZbMF0KLSAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQyNls0XQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotCi0gICAgcGxkICAgICAgICAgICAgIFtyMF0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQotCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkNiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDgsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMTAsIGQwCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDEyLCBkMAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMxCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyOCwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQotICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI5LCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDMwLCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQzMSwgZDEKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzQgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICM0Ci0KLSAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyOCwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjksIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE5LCBkMzAsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHExMCwgZDMxLCBkNAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMiAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDMwLCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzMSwgZDIKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICM1Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICM1Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICM1Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOSwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTksIGQzMCwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMzEsIGQ1Ci0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMzICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMwotCi0gICAgdm11bGwudTggICAgICAgIHEzLCBkMjgsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMjksIGQzCi0gICAgdm11bGwudTggICAgICAgIHE1LCBkMzAsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMzEsIGQzCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTcsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQKLSAgICB2cWFkZC5zMTYgICAgICAgcTksIHE1Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTYKLQotICAgIHZsZDEudTggICAgICAgICB7cTN9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCBzcmMgZGF0YQotCi0gICAgdnFyc2hydW4uczE2ICAgIGQyMiwgcTcsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkMjMsIHE4LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkMjQsIHE5LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkMjUsIHExMCwgIzcKLQotICAgIHZsZDEudTggICAgICAgICB7cTR9LCBbcjBdLCByMQotICAgIHZzdDEudTggICAgICAgICB7ZDIyfSwgW2xyXSEgICAgICAgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCi0gICAgdnN0MS51OCAgICAgICAgIHtkMjN9LCBbbHJdIQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotICAgIHZzdDEudTggICAgICAgICB7ZDI0fSwgW2xyXSEKLSAgICB2bGQxLnU4ICAgICAgICAge3E3fSwgW3IwXSwgcjEKLSAgICB2c3QxLnU4ICAgICAgICAge2QyNX0sIFtscl0hCi0KLSAgICA7Zmlyc3RfcGFzcyBmaWx0ZXJpbmcgb24gdGhlIHJlc3QgNS1saW5lIGRhdGEKLSAgICB2bXVsbC51OCAgICAgICAgcTgsIGQ2LCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkOCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTAsIGQwCi0gICAgdm11bGwudTggICAgICAgIHExMSwgZDEyLCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQxNCwgZDAKLQotICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzEgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjMQotCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjcsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTksIGQyOCwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMjksIGQxCi0gICAgdm1sc2wudTggICAgICAgIHExMSwgZDMwLCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxMTIsIGQzMSwgZDEKLQotICAgIHZleHQuOCAgICAgICAgICBkMjcsIGQ2LCBkNywgIzQgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkOCwgZDksICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDEwLCBkMTEsICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEyLCBkMTMsICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDE0LCBkMTUsICM0Ci0KLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyNywgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE5LCBkMjgsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHExMCwgZDI5LCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxMTEsIGQzMCwgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTEyLCBkMzEsIGQ0Ci0KLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICMyICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjMgotCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMjcsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCi0gICAgdm1sYWwudTggICAgICAgIHE5LCBkMjgsIGQyCi0gICAgdm1sYWwudTggICAgICAgIHExMCwgZDI5LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQzMCwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMzEsIGQyCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjNQotCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMjcsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCi0gICAgdm1sYWwudTggICAgICAgIHE5LCBkMjgsIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHExMCwgZDI5LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQzMCwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkMzEsIGQ1Ci0KLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICMzICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjMwotCi0gICAgdm11bGwudTggICAgICAgIHEzLCBkMjcsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMjgsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE1LCBkMjksIGQzCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMzAsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMzEsIGQzCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTgsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTQKLSAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNQotICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHE2Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMiwgcTcKLQotICAgIHZxcnNocnVuLnMxNiAgICBkMjYsIHE4LCAjNyAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI3LCBxOSwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI4LCBxMTAsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQyOSwgcTExLCAjNyAgICAgICAgICAgICAgICA7bG9hZCBpbnRlcm1lZGlhdGUgZGF0YSBmcm9tIHN0YWNrCi0gICAgdnFyc2hydW4uczE2ICAgIGQzMCwgcTEyLCAjNwotCi07U2Vjb25kIHBhc3M6IDh4NAotO3NlY29uZHBhc3NfZmlsdGVyCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzUKLSAgICBzdWIgICAgICAgICAgICAgbHIsIGxyLCAjMzIKLQotICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKLSAgICB2bGQxLnU4ICAgICAgICAge3ExMX0sIFtscl0hCi0KLSAgICB2YWJzLnMzMiAgICAgICAgcTcsIHE1Ci0gICAgdmFicy5zMzIgICAgICAgIHE4LCBxNgotCi0gICAgdmxkMS51OCAgICAgICAgIHtxMTJ9LCBbbHJdIQotCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMTRbMF0gICAgICAgICAgICAgIDtzZWNvbmRfcGFzcyBmaWx0ZXIgcGFyYW1ldGVycyAoZDAtZDUpCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMTRbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQxNVswXQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDE1WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMTZbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQxNls0XQotCi0gICAgdm11bGwudTggICAgICAgIHEzLCBkMjIsIGQwICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDIzLCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI0LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDI1LCBkMAotCi0gICAgdm1sc2wudTggICAgICAgIHEzLCBkMjMsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyNCwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyNSwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyNiwgZDEKLQotICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDI2LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKLSAgICB2bWxzbC51OCAgICAgICAgcTQsIGQyNywgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTUsIGQyOCwgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTYsIGQyOSwgZDQKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDI0LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI1LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI2LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI3LCBkMgotCi0gICAgdm1sYWwudTggICAgICAgIHEzLCBkMjcsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCi0gICAgdm1sYWwudTggICAgICAgIHE0LCBkMjgsIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHE1LCBkMjksIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHE2LCBkMzAsIGQ1Ci0KLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyNSwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyNiwgZDMKLSAgICB2bXVsbC51OCAgICAgICAgcTksIGQyNywgZDMKLSAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMjgsIGQzCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTcsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQKLSAgICB2cWFkZC5zMTYgICAgICAgcTksIHE1Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTYKLQotICAgIHZxcnNocnVuLnMxNiAgICBkNiwgcTcsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDcsIHE4LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkOCwgcTksICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ5LCBxMTAsICM3Ci0KLSAgICB2c3QxLnU4ICAgICAgICAge2Q2fSwgW3I0XSwgcjUgICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDd9LCBbcjRdLCByNQotICAgIHZzdDEudTggICAgICAgICB7ZDh9LCBbcjRdLCByNQotICAgIHZzdDEudTggICAgICAgICB7ZDl9LCBbcjRdLCByNQotCi0gICAgYWRkICAgICAgICAgICAgIHNwLCBzcCwgIzMyCi0gICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tCi1maXJzdHBhc3NfZmlsdGVyOHg0X29ubHkKLSAgICB2YWJzLnMzMiAgICAgICAgcTEyLCBxMTQKLSAgICB2YWJzLnMzMiAgICAgICAgcTEzLCBxMTUKLQotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMyICAgICAgICAgICAgICA7bW92ZSBzcmNwdHIgYmFjayB0byAobGluZS0yKSBhbmQgKGNvbHVtbi0yKQotICAgIHZsZDEudTggICAgICAgICB7cTN9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCBzcmMgZGF0YQotCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMjRbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAtZDUpCi0gICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMjRbNF0KLSAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQyNVswXQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDI1WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMjZbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQyNls0XQotCi07Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICg0eDgpCi0gICAgcGxkICAgICAgICAgICAgIFtyMF0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMV0KLSAgICBwbGQgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQotCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkNiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDgsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMTAsIGQwCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDEyLCBkMAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clstMV0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMxCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyOCwgZDEgICAgICAgICAgICAgOy0oc3JjX3B0clstMV0gKiB2cDhfZmlsdGVyWzFdKQotICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI5LCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDMwLCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQzMSwgZDEKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzQgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMl0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICM0Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICM0Ci0KLSAgICB2bWxzbC51OCAgICAgICAgcTcsIGQyOCwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjksIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE5LCBkMzAsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHExMCwgZDMxLCBkNAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMiAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI4LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDMwLCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzMSwgZDIKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzUgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbM10KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICM1Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICM1Ci0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICM1Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyOCwgZDUgICAgICAgICAgICAgOyhzcmNfcHRyWzNdICogdnA4X2ZpbHRlcls1XSkKLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOSwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTksIGQzMCwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMzEsIGQ1Ci0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMzICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMwotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMwotCi0gICAgdm11bGwudTggICAgICAgIHEzLCBkMjgsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMjksIGQzCi0gICAgdm11bGwudTggICAgICAgIHE1LCBkMzAsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMzEsIGQzCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTcsIHEzICAgICAgICAgICAgICAgICAgO3N1bSBvZiBhbGwgKHNyY19kYXRhKmZpbHRlcl9wYXJhbWV0ZXJzKQotICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTQKLSAgICB2cWFkZC5zMTYgICAgICAgcTksIHE1Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTYKLQotICAgIHZxcnNocnVuLnMxNiAgICBkMjIsIHE3LCAjNyAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDIzLCBxOCwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI0LCBxOSwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDI1LCBxMTAsICM3Ci0KLSAgICB2c3QxLnU4ICAgICAgICAge2QyMn0sIFtyNF0sIHI1ICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDIzfSwgW3I0XSwgcjUKLSAgICB2c3QxLnU4ICAgICAgICAge2QyNH0sIFtyNF0sIHI1Ci0gICAgdnN0MS51OCAgICAgICAgIHtkMjV9LCBbcjRdLCByNQotCi0gICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2Vjb25kcGFzc19maWx0ZXI4eDRfb25seQotO1NlY29uZCBwYXNzOiA4eDQKLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIxLCBsc2wgIzEKLSAgICB2bGQxLnMzMiAgICAgICAge3E1LCBxNn0sIFtyM10gICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCi0gICAgdmFicy5zMzIgICAgICAgIHE3LCBxNQotICAgIHZhYnMuczMyICAgICAgICBxOCwgcTYKLQotICAgIHZsZDEudTggICAgICAgICB7ZDIyfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2QyM30sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjR9LCBbcjBdLCByMQotICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDE0WzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwLWQ1KQotICAgIHZsZDEudTggICAgICAgICB7ZDI1fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQxNFs0XQotICAgIHZsZDEudTggICAgICAgICB7ZDI2fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQxNVswXQotICAgIHZsZDEudTggICAgICAgICB7ZDI3fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDMsIGQxNVs0XQotICAgIHZsZDEudTggICAgICAgICB7ZDI4fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDQsIGQxNlswXQotICAgIHZsZDEudTggICAgICAgICB7ZDI5fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQxNls0XQotICAgIHZsZDEudTggICAgICAgICB7ZDMwfSwgW3IwXSwgcjEKLQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDIyLCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyMywgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyNCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyNSwgZDAKLQotICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDIzLCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjQsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjUsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjYsIGQxCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTMsIGQyNiwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjcsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjgsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjksIGQ0Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyNCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyNSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyNiwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyNywgZDIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDI3LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI4LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI5LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDMwLCBkNQotCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMjUsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMjYsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMjcsIGQzCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDI4LCBkMwotCi0gICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKLSAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0Ci0gICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQotICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2Ci0KLSAgICB2cXJzaHJ1bi5zMTYgICAgZDYsIHE3LCAjNyAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ3LCBxOCwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDgsIHE5LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkOSwgcTEwLCAjNwotCi0gICAgdnN0MS51OCAgICAgICAgIHtkNn0sIFtyNF0sIHI1ICAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2c3QxLnU4ICAgICAgICAge2Q3fSwgW3I0XSwgcjUKLSAgICB2c3QxLnU4ICAgICAgICAge2Q4fSwgW3I0XSwgcjUKLSAgICB2c3QxLnU4ICAgICAgICAge2Q5fSwgW3I0XSwgcjUKLQotICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUscGN9Ci0KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4OF9uZW9uLmFzbSBiL3ZwOC9jb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4OF9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiZjYzZS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDhfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9zaXh0YXBfcHJlZGljdDh4OF9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTsgcjAgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07IHIxICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgcjIgICAgaW50ICB4b2Zmc2V0LAotOyByMyAgICBpbnQgIHlvZmZzZXQsCi07IHN0YWNrKHI0KSB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotOyBzdGFjayhyNSkgaW50ICBkc3RfcGl0Y2gKLQotfHZwOF9zaXh0YXBfcHJlZGljdDh4OF9uZW9ufCBQUk9DCi0gICAgcHVzaCAgICAgICAgICAgIHtyNC1yNSwgbHJ9Ci0KLSAgICBhZHJsICAgICAgICAgICAgcjEyLCBmaWx0ZXI4X2NvZWZmCi0KLSAgICBsZHIgICAgICAgICAgICAgcjQsIFtzcCwgIzEyXSAgICAgICAgICAgO2xvYWQgcGFyYW1ldGVycyBmcm9tIHN0YWNrCi0gICAgbGRyICAgICAgICAgICAgIHI1LCBbc3AsICMxNl0gICAgICAgICAgIDtsb2FkIHBhcmFtZXRlcnMgZnJvbSBzdGFjawotCi0gICAgY21wICAgICAgICAgICAgIHIyLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAotICAgIGJlcSAgICAgICAgICAgICBzZWNvbmRwYXNzX2ZpbHRlcjh4OF9vbmx5Ci0KLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIxMiwgcjIsIGxzbCAjNSAgICAgO2NhbGN1bGF0ZSBmaWx0ZXIgbG9jYXRpb24KLQotICAgIGNtcCAgICAgICAgICAgICByMywgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCi0KLSAgICB2bGQxLnMzMiAgICAgICAge3ExNCwgcTE1fSwgW3IyXSAgICAgICAgO2xvYWQgZmlyc3RfcGFzcyBmaWx0ZXIKLQotICAgIGJlcSAgICAgICAgICAgICBmaXJzdHBhc3NfZmlsdGVyOHg4X29ubHkKLQotICAgIHN1YiAgICAgICAgICAgICBzcCwgc3AsICM2NCAgICAgICAgICAgICA7cmVzZXJ2ZSBzcGFjZSBvbiBzdGFjayBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UKLSAgICBtb3YgICAgICAgICAgICAgbHIsIHNwCi0KLSAgICB2YWJzLnMzMiAgICAgICAgcTEyLCBxMTQKLSAgICB2YWJzLnMzMiAgICAgICAgcTEzLCBxMTUKLQotICAgIG1vdiAgICAgICAgICAgICByMiwgIzIgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCi0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzIgICAgICAgICAgICAgIDttb3ZlIHNyY3B0ciBiYWNrIHRvIChsaW5lLTIpIGFuZCAoY29sdW1uLTIpCi0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQotCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMjRbMF0gICAgICAgICAgICAgIDtmaXJzdF9wYXNzIGZpbHRlciAoZDAtZDUpCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMjRbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQyNVswXQotCi07Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICgxM3g4KQotICAgIHZsZDEudTggICAgICAgICB7cTN9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCBzcmMgZGF0YQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDI1WzRdCi0gICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMjZbMF0KLSAgICB2bGQxLnU4ICAgICAgICAge3E1fSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQyNls0XQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotCi1maWx0X2JsazJkX2ZwOHg4X2xvb3BfbmVvbgotICAgIHBsZCAgICAgICAgICAgICBbcjBdCi0gICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCi0gICAgcGxkICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KLQotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDYsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTgsIGQ4LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDEwLCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMiwgZDAKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzEgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMQotCi0gICAgdm1sc2wudTggICAgICAgIHE3LCBkMjgsIGQxICAgICAgICAgICAgIDstKHNyY19wdHJbLTFdICogdnA4X2ZpbHRlclsxXSkKLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOSwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTksIGQzMCwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMzEsIGQxCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM0ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjNAotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjNAotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjNAotCi0gICAgdm1sc2wudTggICAgICAgIHE3LCBkMjgsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI5LCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDMwLCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQzMSwgZDQKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzIgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMF0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMyCi0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMyCi0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMyCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyOCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQyOSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTksIGQzMCwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMzEsIGQyCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICM1ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzNdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjNQotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjNQotCi0gICAgdm1sYWwudTggICAgICAgIHE3LCBkMjgsIGQ1ICAgICAgICAgICAgIDsoc3JjX3B0clszXSAqIHZwOF9maWx0ZXJbNV0pCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMjksIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHE5LCBkMzAsIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHExMCwgZDMxLCBkNQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjMyAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzMKLQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI4LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDI5LCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDMwLCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDMxLCBkMwotCi0gICAgc3VicyAgICAgICAgICAgIHIyLCByMiwgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKLSAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgotCi0gICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0KLSAgICB2cXJzaHJ1bi5zMTYgICAgZDIyLCBxNywgIzcgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hydW4uczE2ICAgIGQyMywgcTgsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQyNCwgcTksICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQyNSwgcTEwLCAjNwotCi0gICAgdnN0MS51OCAgICAgICAgIHtkMjJ9LCBbbHJdISAgICAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKLSAgICB2c3QxLnU4ICAgICAgICAge2QyM30sIFtscl0hCi0gICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCi0gICAgdnN0MS51OCAgICAgICAgIHtkMjR9LCBbbHJdIQotICAgIHZsZDEudTggICAgICAgICB7cTZ9LCBbcjBdLCByMQotICAgIHZzdDEudTggICAgICAgICB7ZDI1fSwgW2xyXSEKLQotICAgIGJuZSAgICAgICAgICAgICBmaWx0X2JsazJkX2ZwOHg4X2xvb3BfbmVvbgotCi0gICAgO2ZpcnN0X3Bhc3MgZmlsdGVyaW5nIG9uIHRoZSByZXN0IDUtbGluZSBkYXRhCi0gICAgO3ZsZDEudTggICAgICAgICAgICB7cTN9LCBbcjBdLCByMSAgICAgICAgICA7bG9hZCBzcmMgZGF0YQotICAgIDt2bGQxLnU4ICAgICAgICAgICAge3E0fSwgW3IwXSwgcjEKLSAgICA7dmxkMS51OCAgICAgICAgICAgIHtxNX0sIFtyMF0sIHIxCi0gICAgO3ZsZDEudTggICAgICAgICAgICB7cTZ9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7cTd9LCBbcjBdLCByMQotCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkNiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clstMl0gKiB2cDhfZmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxOSwgZDgsIGQwCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDEwLCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTEsIGQxMiwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEyLCBkMTQsIGQwCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICMxICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ4LCBkOSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTQsIGQxNSwgIzEKLQotICAgIHZtbHNsLnU4ICAgICAgICBxOCwgZDI3LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE5LCBkMjgsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHExMCwgZDI5LCBkMQotICAgIHZtbHNsLnU4ICAgICAgICBxMTEsIGQzMCwgZDEKLSAgICB2bWxzbC51OCAgICAgICAgcTEyLCBkMzEsIGQxCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI3LCBkNiwgZDcsICM0ICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzJdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDgsIGQ5LCAjNAotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQxMCwgZDExLCAjNAotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMiwgZDEzLCAjNAotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxNCwgZDE1LCAjNAotCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjcsIGQ0ICAgICAgICAgICAgIDstKHNyY19wdHJbMl0gKiB2cDhfZmlsdGVyWzRdKQotICAgIHZtbHNsLnU4ICAgICAgICBxOSwgZDI4LCBkNAotICAgIHZtbHNsLnU4ICAgICAgICBxMTAsIGQyOSwgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTExLCBkMzAsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHExMiwgZDMxLCBkNAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyNywgZDYsIGQ3LCAjMiAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clswXQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ4LCBkOSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzIKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTQsIGQxNSwgIzIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI3LCBkMiAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiB2cDhfZmlsdGVyWzJdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDI4LCBkMgotICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQyOSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTExLCBkMzAsIGQyCi0gICAgdm1sYWwudTggICAgICAgIHExMiwgZDMxLCBkMgotCi0gICAgdmV4dC44ICAgICAgICAgIGQyNywgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ4LCBkOSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTQsIGQxNSwgIzUKLQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI3LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDI4LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQyOSwgZDUKLSAgICB2bWxhbC51OCAgICAgICAgcTExLCBkMzAsIGQ1Ci0gICAgdm1sYWwudTggICAgICAgIHExMiwgZDMxLCBkNQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyNywgZDYsIGQ3LCAjMyAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ4LCBkOSwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkMTAsIGQxMSwgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTIsIGQxMywgIzMKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTQsIGQxNSwgIzMKLQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI3LCBkMyAgICAgICAgICAgICA7KHNyY19wdHJbMV0gKiB2cDhfZmlsdGVyWzNdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDI4LCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI5LCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDMwLCBkMwotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDMxLCBkMwotCi0gICAgdnFhZGQuczE2ICAgICAgIHE4LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKLSAgICB2cWFkZC5zMTYgICAgICAgcTksIHE0Ci0gICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTUKLSAgICB2cWFkZC5zMTYgICAgICAgcTExLCBxNgotICAgIHZxYWRkLnMxNiAgICAgICBxMTIsIHE3Ci0KLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMiwgcjMsIGxzbCAjNQotCi0gICAgdnFyc2hydW4uczE2ICAgIGQyNiwgcTgsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHN1YiAgICAgICAgICAgICBsciwgbHIsICM2NAotICAgIHZxcnNocnVuLnMxNiAgICBkMjcsIHE5LCAjNwotICAgIHZsZDEudTggICAgICAgICB7cTl9LCBbbHJdISAgICAgICAgICAgICA7bG9hZCBpbnRlcm1lZGlhdGUgZGF0YSBmcm9tIHN0YWNrCi0gICAgdnFyc2hydW4uczE2ICAgIGQyOCwgcTEwLCAjNwotICAgIHZsZDEudTggICAgICAgICB7cTEwfSwgW2xyXSEKLQotICAgIHZsZDEuczMyICAgICAgICB7cTUsIHE2fSwgW3IzXSAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKLQotICAgIHZxcnNocnVuLnMxNiAgICBkMjksIHExMSwgIzcKLSAgICB2bGQxLnU4ICAgICAgICAge3ExMX0sIFtscl0hCi0KLSAgICB2YWJzLnMzMiAgICAgICAgcTcsIHE1Ci0gICAgdmFicy5zMzIgICAgICAgIHE4LCBxNgotCi0gICAgdnFyc2hydW4uczE2ICAgIGQzMCwgcTEyLCAjNwotICAgIHZsZDEudTggICAgICAgICB7cTEyfSwgW2xyXSEKLQotO1NlY29uZCBwYXNzOiA4eDgKLSAgICBtb3YgICAgICAgICAgICAgcjMsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgotCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMTRbMF0gICAgICAgICAgICAgIDtzZWNvbmRfcGFzcyBmaWx0ZXIgcGFyYW1ldGVycyAoZDAtZDUpCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMTRbNF0KLSAgICB2ZHVwLjggICAgICAgICAgZDIsIGQxNVswXQotICAgIHZkdXAuOCAgICAgICAgICBkMywgZDE1WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMTZbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDUsIGQxNls0XQotCi1maWx0X2JsazJkX3NwOHg4X2xvb3BfbmVvbgotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDE4LCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQxOSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyMCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyMSwgZDAKLQotICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDE5LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjAsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjEsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjIsIGQxCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTMsIGQyMiwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjMsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjQsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjUsIGQ0Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyMCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyMSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyMiwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyMywgZDIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIzLCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI0LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI1LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI2LCBkNQotCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMjEsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMjIsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMjMsIGQzCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDI0LCBkMwotCi0gICAgc3VicyAgICAgICAgICAgIHIzLCByMywgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKLSAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgotCi0gICAgdnFyc2hydW4uczE2ICAgIGQ2LCBxNywgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkNywgcTgsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ4LCBxOSwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDksIHExMCwgIzcKLQotICAgIHZtb3YgICAgICAgICAgICBxOSwgcTExCi0gICAgdnN0MS51OCAgICAgICAgIHtkNn0sIFtyNF0sIHI1ICAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2bW92ICAgICAgICAgICAgcTEwLCBxMTIKLSAgICB2c3QxLnU4ICAgICAgICAge2Q3fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgcTExLCBxMTMKLSAgICB2c3QxLnU4ICAgICAgICAge2Q4fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgcTEyLCBxMTQKLSAgICB2c3QxLnU4ICAgICAgICAge2Q5fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgZDI2LCBkMzAKLQotICAgIGJuZSBmaWx0X2JsazJkX3NwOHg4X2xvb3BfbmVvbgotCi0gICAgYWRkICAgICAgICAgICAgIHNwLCBzcCwgIzY0Ci0gICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZmlyc3RwYXNzX2ZpbHRlcjh4OF9vbmx5Ci0gICAgO2FkZCAgICAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICM1ICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgotICAgIDt2bGQxLnMzMiAgICAgICB7cTE0LCBxMTV9LCBbcjJdICAgICAgICA7bG9hZCBmaXJzdF9wYXNzIGZpbHRlcgotICAgIHZhYnMuczMyICAgICAgICBxMTIsIHExNAotICAgIHZhYnMuczMyICAgICAgICBxMTMsIHExNQotCi0gICAgbW92ICAgICAgICAgICAgIHIyLCAjMiAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLSAgICBzdWIgICAgICAgICAgICAgcjAsIHIwLCAjMiAgICAgICAgICAgICAgO21vdmUgc3JjcHRyIGJhY2sgdG8gKGxpbmUtMikgYW5kIChjb2x1bW4tMikKLQotICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDI0WzBdICAgICAgICAgICAgICA7Zmlyc3RfcGFzcyBmaWx0ZXIgKGQwLWQ1KQotICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDI0WzRdCi0gICAgdmR1cC44ICAgICAgICAgIGQyLCBkMjVbMF0KLSAgICB2ZHVwLjggICAgICAgICAgZDMsIGQyNVs0XQotICAgIHZkdXAuOCAgICAgICAgICBkNCwgZDI2WzBdCi0gICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMjZbNF0KLQotO0ZpcnN0IHBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoOHg4KQotZmlsdF9ibGsyZF9mcG84eDhfbG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtxNH0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtxNn0sIFtyMF0sIHIxCi0KLSAgICBwbGQgICAgICAgICAgICAgW3IwXQotICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxXQotICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQ2LCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWy0yXSAqIHZwOF9maWx0ZXJbMF0pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkOCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTksIGQxMCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMTIsIGQwCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMxICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWy0xXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzEKLQotICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDI4LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE4LCBkMjksIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE5LCBkMzAsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHExMCwgZDMxLCBkMQotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNCAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsyXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzQKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzQKLQotICAgIHZtbHNsLnU4ICAgICAgICBxNywgZDI4LCBkNCAgICAgICAgICAgICA7LShzcmNfcHRyWzJdICogdnA4X2ZpbHRlcls0XSkKLSAgICB2bWxzbC51OCAgICAgICAgcTgsIGQyOSwgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTksIGQzMCwgZDQKLSAgICB2bWxzbC51OCAgICAgICAgcTEwLCBkMzEsIGQ0Ci0KLSAgICB2ZXh0LjggICAgICAgICAgZDI4LCBkNiwgZDcsICMyICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzBdCi0gICAgdmV4dC44ICAgICAgICAgIGQyOSwgZDgsIGQ5LCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMzAsIGQxMCwgZDExLCAjMgotICAgIHZleHQuOCAgICAgICAgICBkMzEsIGQxMiwgZDEzLCAjMgotCi0gICAgdm1sYWwudTggICAgICAgIHE3LCBkMjgsIGQyICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMl0pCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMjksIGQyCi0gICAgdm1sYWwudTggICAgICAgIHE5LCBkMzAsIGQyCi0gICAgdm1sYWwudTggICAgICAgIHExMCwgZDMxLCBkMgotCi0gICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDYsIGQ3LCAjNSAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clszXQotICAgIHZleHQuOCAgICAgICAgICBkMjksIGQ4LCBkOSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMTAsIGQxMSwgIzUKLSAgICB2ZXh0LjggICAgICAgICAgZDMxLCBkMTIsIGQxMywgIzUKLQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDI4LCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDI5LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDMwLCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQzMSwgZDUKLQotICAgIHZleHQuOCAgICAgICAgICBkMjgsIGQ2LCBkNywgIzMgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICB2ZXh0LjggICAgICAgICAgZDI5LCBkOCwgZDksICMzCi0gICAgdmV4dC44ICAgICAgICAgIGQzMCwgZDEwLCBkMTEsICMzCi0gICAgdmV4dC44ICAgICAgICAgIGQzMSwgZDEyLCBkMTMsICMzCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTMsIGQyOCwgZDMgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogdnA4X2ZpbHRlclszXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyOSwgZDMKLSAgICB2bXVsbC51OCAgICAgICAgcTUsIGQzMCwgZDMKLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQzMSwgZDMKLSA7Ci0gICAgdnFhZGQuczE2ICAgICAgIHE3LCBxMyAgICAgICAgICAgICAgICAgIDtzdW0gb2YgYWxsIChzcmNfZGF0YSpmaWx0ZXJfcGFyYW1ldGVycykKLSAgICB2cWFkZC5zMTYgICAgICAgcTgsIHE0Ci0gICAgdnFhZGQuczE2ICAgICAgIHE5LCBxNQotICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHE2Ci0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnFyc2hydW4uczE2ICAgIGQyMiwgcTcsICM3ICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkMjMsIHE4LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkMjQsIHE5LCAjNwotICAgIHZxcnNocnVuLnMxNiAgICBkMjUsIHExMCwgIzcKLQotICAgIHZzdDEudTggICAgICAgICB7ZDIyfSwgW3I0XSwgcjUgICAgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgdnN0MS51OCAgICAgICAgIHtkMjN9LCBbcjRdLCByNQotICAgIHZzdDEudTggICAgICAgICB7ZDI0fSwgW3I0XSwgcjUKLSAgICB2c3QxLnU4ICAgICAgICAge2QyNX0sIFtyNF0sIHI1Ci0KLSAgICBibmUgICAgICAgICAgICAgZmlsdF9ibGsyZF9mcG84eDhfbG9vcF9uZW9uCi0KLSAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zZWNvbmRwYXNzX2ZpbHRlcjh4OF9vbmx5Ci0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgcjEsIGxzbCAjMQotICAgIGFkZCAgICAgICAgICAgICByMywgcjEyLCByMywgbHNsICM1Ci0KLSAgICB2bGQxLnU4ICAgICAgICAge2QxOH0sIFtyMF0sIHIxICAgICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICB2bGQxLnMzMiAgICAgICAge3E1LCBxNn0sIFtyM10gICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTl9LCBbcjBdLCByMQotICAgIHZhYnMuczMyICAgICAgICBxNywgcTUKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMH0sIFtyMF0sIHIxCi0gICAgdmFicy5zMzIgICAgICAgIHE4LCBxNgotICAgIHZsZDEudTggICAgICAgICB7ZDIxfSwgW3IwXSwgcjEKLSAgICBtb3YgICAgICAgICAgICAgcjMsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgotICAgIHZsZDEudTggICAgICAgICB7ZDIyfSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQxNFswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMC1kNSkKLSAgICB2bGQxLnU4ICAgICAgICAge2QyM30sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMTRbNF0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyNH0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQyLCBkMTVbMF0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyNX0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQzLCBkMTVbNF0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyNn0sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQ0LCBkMTZbMF0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyN30sIFtyMF0sIHIxCi0gICAgdmR1cC44ICAgICAgICAgIGQ1LCBkMTZbNF0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyOH0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjl9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDMwfSwgW3IwXSwgcjEKLQotO1NlY29uZCBwYXNzOiA4eDgKLWZpbHRfYmxrMmRfc3BvOHg4X2xvb3BfbmVvbgotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDE4LCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbLTJdICogdnA4X2ZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQxOSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyMCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyMSwgZDAKLQotICAgIHZtbHNsLnU4ICAgICAgICBxMywgZDE5LCBkMSAgICAgICAgICAgICA7LShzcmNfcHRyWy0xXSAqIHZwOF9maWx0ZXJbMV0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjAsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjEsIGQxCi0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjIsIGQxCi0KLSAgICB2bWxzbC51OCAgICAgICAgcTMsIGQyMiwgZDQgICAgICAgICAgICAgOy0oc3JjX3B0clsyXSAqIHZwOF9maWx0ZXJbNF0pCi0gICAgdm1sc2wudTggICAgICAgIHE0LCBkMjMsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE1LCBkMjQsIGQ0Ci0gICAgdm1sc2wudTggICAgICAgIHE2LCBkMjUsIGQ0Ci0KLSAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyMCwgZDIgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogdnA4X2ZpbHRlclsyXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyMSwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyMiwgZDIKLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyMywgZDIKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDIzLCBkNSAgICAgICAgICAgICA7KHNyY19wdHJbM10gKiB2cDhfZmlsdGVyWzVdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI0LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI1LCBkNQotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI2LCBkNQotCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMjEsIGQzICAgICAgICAgICAgIDsoc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbM10pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMjIsIGQzCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMjMsIGQzCi0gICAgdm11bGwudTggICAgICAgIHExMCwgZDI0LCBkMwotCi0gICAgc3VicyAgICAgICAgICAgIHIzLCByMywgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTMgICAgICAgICAgICAgICAgICA7c3VtIG9mIGFsbCAoc3JjX2RhdGEqZmlsdGVyX3BhcmFtZXRlcnMpCi0gICAgdnFhZGQuczE2ICAgICAgIHE4LCBxNAotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTUKLSAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNgotCi0gICAgdnFyc2hydW4uczE2ICAgIGQ2LCBxNywgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocnVuLnMxNiAgICBkNywgcTgsICM3Ci0gICAgdnFyc2hydW4uczE2ICAgIGQ4LCBxOSwgIzcKLSAgICB2cXJzaHJ1bi5zMTYgICAgZDksIHExMCwgIzcKLQotICAgIHZtb3YgICAgICAgICAgICBxOSwgcTExCi0gICAgdnN0MS51OCAgICAgICAgIHtkNn0sIFtyNF0sIHI1ICAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2bW92ICAgICAgICAgICAgcTEwLCBxMTIKLSAgICB2c3QxLnU4ICAgICAgICAge2Q3fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgcTExLCBxMTMKLSAgICB2c3QxLnU4ICAgICAgICAge2Q4fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgcTEyLCBxMTQKLSAgICB2c3QxLnU4ICAgICAgICAge2Q5fSwgW3I0XSwgcjUKLSAgICB2bW92ICAgICAgICAgICAgZDI2LCBkMzAKLQotICAgIGJuZSBmaWx0X2JsazJkX3Nwbzh4OF9sb29wX25lb24KLQotICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUscGN9Ci0KLSAgICBFTkRQCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotCi1maWx0ZXI4X2NvZWZmCi0gICAgRENEICAgICAwLCAgMCwgIDEyOCwgICAgMCwgICAwLCAgMCwgICAwLCAgMAotICAgIERDRCAgICAgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAsICAgMCwgIDAKLSAgICBEQ0QgICAgIDIsIC0xMSwgMTA4LCAgIDM2LCAgLTgsICAxLCAgIDAsICAwCi0gICAgRENEICAgICAwLCAtOSwgICA5MywgICA1MCwgIC02LCAgMCwgICAwLCAgMAotICAgIERDRCAgICAgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMsICAgMCwgIDAKLSAgICBEQ0QgICAgIDAsIC02LCAgIDUwLCAgIDkzLCAgLTksICAwLCAgIDAsICAwCi0gICAgRENEICAgICAxLCAtOCwgICAzNiwgIDEwOCwgLTExLCAgMiwgICAwLCAgMAotICAgIERDRCAgICAgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgICAwLCAgMCwgIDAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vcmVjb25fYXJtLmggYi92cDgvY29tbW9uL2FybS9yZWNvbl9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3Y2IyYS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9yZWNvbl9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIFJFQ09OX0FSTV9ICi0jZGVmaW5lIFJFQ09OX0FSTV9ICi0KLSNpZiBIQVZFX0FSTVY2Ci1leHRlcm4gcHJvdG90eXBlX3JlY29uX2Jsb2NrKHZwOF9yZWNvbl9iX2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfcmVjb25fYmxvY2sodnA4X3JlY29uMmJfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9yZWNvbl9ibG9jayh2cDhfcmVjb240Yl9hcm12Nik7Ci0KLWV4dGVybiBwcm90b3R5cGVfY29weV9ibG9jayh2cDhfY29weV9tZW04eDhfdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9jb3B5X2Jsb2NrKHZwOF9jb3B5X21lbTh4NF92Nik7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtMTZ4MTZfdjYpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3JlY29uX3JlY29uCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbiB2cDhfcmVjb25fYl9hcm12NgotCi0jdW5kZWYgIHZwOF9yZWNvbl9yZWNvbjIKLSNkZWZpbmUgdnA4X3JlY29uX3JlY29uMiB2cDhfcmVjb24yYl9hcm12NgotCi0jdW5kZWYgIHZwOF9yZWNvbl9yZWNvbjQKLSNkZWZpbmUgdnA4X3JlY29uX3JlY29uNCB2cDhfcmVjb240Yl9hcm12NgotCi0jdW5kZWYgIHZwOF9yZWNvbl9jb3B5OHg4Ci0jZGVmaW5lIHZwOF9yZWNvbl9jb3B5OHg4IHZwOF9jb3B5X21lbTh4OF92NgotCi0jdW5kZWYgIHZwOF9yZWNvbl9jb3B5OHg0Ci0jZGVmaW5lIHZwOF9yZWNvbl9jb3B5OHg0IHZwOF9jb3B5X21lbTh4NF92NgotCi0jdW5kZWYgIHZwOF9yZWNvbl9jb3B5MTZ4MTYKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHkxNngxNiB2cDhfY29weV9tZW0xNngxNl92NgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIEhBVkVfQVJNVjcKLWV4dGVybiBwcm90b3R5cGVfcmVjb25fYmxvY2sodnA4X3JlY29uX2JfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3JlY29uX2Jsb2NrKHZwOF9yZWNvbjJiX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9yZWNvbl9ibG9jayh2cDhfcmVjb240Yl9uZW9uKTsKLQotZXh0ZXJuIHByb3RvdHlwZV9jb3B5X2Jsb2NrKHZwOF9jb3B5X21lbTh4OF9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfY29weV9ibG9jayh2cDhfY29weV9tZW04eDRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtMTZ4MTZfbmVvbik7Ci0KLWV4dGVybiBwcm90b3R5cGVfcmVjb25fbWFjcm9ibG9jayh2cDhfcmVjb25fbWJfbmVvbik7Ci0KLWV4dGVybiBwcm90b3R5cGVfYnVpbGRfaW50cmFfcHJlZGljdG9ycyh2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2J1aWxkX2ludHJhX3ByZWRpY3RvcnModnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfbmVvbik7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfcmVjb25fcmVjb24KLSNkZWZpbmUgdnA4X3JlY29uX3JlY29uIHZwOF9yZWNvbl9iX25lb24KLQotI3VuZGVmICB2cDhfcmVjb25fcmVjb24yCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbjIgdnA4X3JlY29uMmJfbmVvbgotCi0jdW5kZWYgIHZwOF9yZWNvbl9yZWNvbjQKLSNkZWZpbmUgdnA4X3JlY29uX3JlY29uNCB2cDhfcmVjb240Yl9uZW9uCi0KLSN1bmRlZiAgdnA4X3JlY29uX2NvcHk4eDgKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHk4eDggdnA4X2NvcHlfbWVtOHg4X25lb24KLQotI3VuZGVmICB2cDhfcmVjb25fY29weTh4NAotI2RlZmluZSB2cDhfcmVjb25fY29weTh4NCB2cDhfY29weV9tZW04eDRfbmVvbgotCi0jdW5kZWYgIHZwOF9yZWNvbl9jb3B5MTZ4MTYKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHkxNngxNiB2cDhfY29weV9tZW0xNngxNl9uZW9uCi0KLSN1bmRlZiAgdnA4X3JlY29uX3JlY29uX21iCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbl9tYiB2cDhfcmVjb25fbWJfbmVvbgotCi0jdW5kZWYgIHZwOF9yZWNvbl9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieQotI2RlZmluZSB2cDhfcmVjb25fYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X25lb24KLQotI3VuZGVmICB2cDhfcmVjb25fYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcwotI2RlZmluZSB2cDhfcmVjb25fYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19uZW9uCi0KLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vcmVjb25pbnRyYV9hcm0uYyBiL3ZwOC9jb21tb24vYXJtL3JlY29uaW50cmFfYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjRkY2EuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9hcm0vcmVjb25pbnRyYV9hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludHJhLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbi5oIgotCi0jaWYgSEFWRV9BUk1WNwotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X25lb25fZnVuYygKLSAgICB1bnNpZ25lZCBjaGFyICp5X2J1ZmZlciwKLSAgICB1bnNpZ25lZCBjaGFyICp5cHJlZF9wdHIsCi0gICAgaW50IHlfc3RyaWRlLAotICAgIGludCBtb2RlLAotICAgIGludCBVcCwKLSAgICBpbnQgTGVmdCk7Ci0KLXZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X25lb24oTUFDUk9CTE9DS0QgKngpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqeV9idWZmZXIgPSB4LT5kc3QueV9idWZmZXI7Ci0gICAgdW5zaWduZWQgY2hhciAqeXByZWRfcHRyID0geC0+cHJlZGljdG9yOwotICAgIGludCB5X3N0cmlkZSA9IHgtPmRzdC55X3N0cmlkZTsKLSAgICBpbnQgbW9kZSA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGU7Ci0gICAgaW50IFVwID0geC0+dXBfYXZhaWxhYmxlOwotICAgIGludCBMZWZ0ID0geC0+bGVmdF9hdmFpbGFibGU7Ci0KLSAgICB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfbmVvbl9mdW5jKHlfYnVmZmVyLCB5cHJlZF9wdHIsIHlfc3RyaWRlLCBtb2RlLCBVcCwgTGVmdCk7Ci19Ci0jZW5kaWYKLQotCi0jaWYgSEFWRV9BUk1WNwotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfbmVvbl9mdW5jKAotICAgIHVuc2lnbmVkIGNoYXIgKnlfYnVmZmVyLAotICAgIHVuc2lnbmVkIGNoYXIgKnlwcmVkX3B0ciwKLSAgICBpbnQgeV9zdHJpZGUsCi0gICAgaW50IG1vZGUsCi0gICAgaW50IFVwLAotICAgIGludCBMZWZ0KTsKLQotdm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfc19uZW9uKE1BQ1JPQkxPQ0tEICp4KQotewotICAgIHVuc2lnbmVkIGNoYXIgKnlfYnVmZmVyID0geC0+ZHN0LnlfYnVmZmVyOwotICAgIHVuc2lnbmVkIGNoYXIgKnlwcmVkX3B0ciA9IHgtPnByZWRpY3RvcjsKLSAgICBpbnQgeV9zdHJpZGUgPSB4LT5kc3QueV9zdHJpZGU7Ci0gICAgaW50IG1vZGUgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlOwotICAgIGludCBVcCA9IHgtPnVwX2F2YWlsYWJsZTsKLSAgICBpbnQgTGVmdCA9IHgtPmxlZnRfYXZhaWxhYmxlOwotCi0gICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3NfbmVvbl9mdW5jKHlfYnVmZmVyLCB5cHJlZF9wdHIsIHlfc3RyaWRlLCBtb2RlLCBVcCwgTGVmdCk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9hcm0vc3VicGl4ZWxfYXJtLmggYi92cDgvY29tbW9uL2FybS9zdWJwaXhlbF9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4ODUzOC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2FybS9zdWJwaXhlbF9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIFNVQlBJWEVMX0FSTV9ICi0jZGVmaW5lIFNVQlBJWEVMX0FSTV9ICi0KLSNpZiBIQVZFX0FSTVY2Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4OF9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0OHg0X2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc2l4dGFwX3ByZWRpY3RfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYXJtdjYpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXAxNngxNgotI2RlZmluZSB2cDhfc3VicGl4X3NpeHRhcDE2eDE2IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA4eDgKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA4eDggdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA4eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA4eDQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA0eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA0eDQgdnA4X3NpeHRhcF9wcmVkaWN0X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjE2eDE2Ci0jZGVmaW5lIHZwOF9zdWJwaXhfYmlsaW5lYXIxNngxNiB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjh4OAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyOHg4IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjh4NAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyOHg0IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjR4NAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyNHg0IHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X2FybXY2Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4OF9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfbmVvbik7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfc3VicGl4X3NpeHRhcDE2eDE2Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwMTZ4MTYgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfbmVvbgotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwOHg4Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwOHg4IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9uZW9uCi0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA4eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA4eDQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X25lb24KLQotI3VuZGVmICB2cDhfc3VicGl4X3NpeHRhcDR4NAotI2RlZmluZSB2cDhfc3VicGl4X3NpeHRhcDR4NCB2cDhfc2l4dGFwX3ByZWRpY3RfbmVvbgotCi0jdW5kZWYgIHZwOF9zdWJwaXhfYmlsaW5lYXIxNngxNgotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyMTZ4MTYgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9uZW9uCi0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjh4OAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyOHg4IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X25lb24KLQotI3VuZGVmICB2cDhfc3VicGl4X2JpbGluZWFyOHg0Ci0jZGVmaW5lIHZwOF9zdWJwaXhfYmlsaW5lYXI4eDQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfbmVvbgotCi0jdW5kZWYgIHZwOF9zdWJwaXhfYmlsaW5lYXI0eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9iaWxpbmVhcjR4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9uZW9uCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYXNtX2NvbV9vZmZzZXRzLmMgYi92cDgvY29tbW9uL2FzbV9jb21fb2Zmc2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjk5ZGQyLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYXNtX2NvbV9vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCi0KLSNkZWZpbmUgY3RfYXNzZXJ0KG5hbWUsY29uZCkgXAotICAgIHN0YXRpYyB2b2lkIGFzc2VydF8jI25hbWUodm9pZCkgVU5VU0VEO1wKLSAgICBzdGF0aWMgdm9pZCBhc3NlcnRfIyNuYW1lKHZvaWQpIHtzd2l0Y2goMCl7Y2FzZSAwOmNhc2UgISEoY29uZCk6O319Ci0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBpbnQgc3ltID0gdmFsOwotCi0vKgotI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKLSovCi0KLS8qCi0gKiBpbnQgbWFpbih2b2lkKQotICogewotICovCi0KLS8vdnB4X3NjYWxlCi1ERUZJTkUoeXYxMl9idWZmZXJfY29uZmlnX3lfd2lkdGgsICAgICAgICAgICAgICBvZmZzZXRvZihZVjEyX0JVRkZFUl9DT05GSUcsIHlfd2lkdGgpKTsKLURFRklORSh5djEyX2J1ZmZlcl9jb25maWdfeV9oZWlnaHQsICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgeV9oZWlnaHQpKTsKLURFRklORSh5djEyX2J1ZmZlcl9jb25maWdfeV9zdHJpZGUsICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgeV9zdHJpZGUpKTsKLURFRklORSh5djEyX2J1ZmZlcl9jb25maWdfdXZfd2lkdGgsICAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgdXZfd2lkdGgpKTsKLURFRklORSh5djEyX2J1ZmZlcl9jb25maWdfdXZfaGVpZ2h0LCAgICAgICAgICAgIG9mZnNldG9mKFlWMTJfQlVGRkVSX0NPTkZJRywgdXZfaGVpZ2h0KSk7Ci1ERUZJTkUoeXYxMl9idWZmZXJfY29uZmlnX3V2X3N0cmlkZSwgICAgICAgICAgICBvZmZzZXRvZihZVjEyX0JVRkZFUl9DT05GSUcsIHV2X3N0cmlkZSkpOwotREVGSU5FKHl2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlciwgICAgICAgICAgICAgb2Zmc2V0b2YoWVYxMl9CVUZGRVJfQ09ORklHLCB5X2J1ZmZlcikpOwotREVGSU5FKHl2MTJfYnVmZmVyX2NvbmZpZ191X2J1ZmZlciwgICAgICAgICAgICAgb2Zmc2V0b2YoWVYxMl9CVUZGRVJfQ09ORklHLCB1X2J1ZmZlcikpOwotREVGSU5FKHl2MTJfYnVmZmVyX2NvbmZpZ192X2J1ZmZlciwgICAgICAgICAgICAgb2Zmc2V0b2YoWVYxMl9CVUZGRVJfQ09ORklHLCB2X2J1ZmZlcikpOwotREVGSU5FKHl2MTJfYnVmZmVyX2NvbmZpZ19ib3JkZXIsICAgICAgICAgICAgICAgb2Zmc2V0b2YoWVYxMl9CVUZGRVJfQ09ORklHLCBib3JkZXIpKTsKLQotLy9hZGQgYXNzZXJ0cyBmb3IgYW55IG9mZnNldCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXNzZW1ibHkgY29kZQotLy9hZGQgYXNzZXJ0cyBmb3IgYW55IHNpemUgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFzc2VtYmx5IGNvZGUKLS8qCi0gKiByZXR1cm4gMDsKLSAqIH0KLSAqLwpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9iaWdlbmQuaCBiL3ZwOC9jb21tb24vYmlnZW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzNmOGIuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9iaWdlbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9iaWdlbmRfaAotI2RlZmluZSBfYmlnZW5kX2gKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIGludmVydDIoeCkgKCAoKCh4KT4+OCkmMHgwMGZmKSB8ICgoKHgpPDw4KSYweGZmMDApICkKLSNkZWZpbmUgaW52ZXJ0NCh4KSAoICgoaW52ZXJ0Mih4KSYweDAwMDBmZmZmKTw8MTYpIHwgKGludmVydDIoKHg+PjE2KSkmMHgwMDAwZmZmZikgKQotCi0jZGVmaW5lIGhpZ2hfYnl0ZSh4KSAodW5zaWduZWQgY2hhcil4Ci0jZGVmaW5lIG1pZDJCeXRlKHgpICh1bnNpZ25lZCBjaGFyKSh4ID4+IDgpCi0jZGVmaW5lIG1pZDFCeXRlKHgpICh1bnNpZ25lZCBjaGFyKSh4ID4+IDE2KQotI2RlZmluZSBsb3dfYnl0ZSh4KSAodW5zaWduZWQgY2hhcikoeCA+PiAyNCkKLQotI2RlZmluZSBTV0FQRU5EUyAxCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vYmxvY2tkLmggYi92cDgvY29tbW9uL2Jsb2NrZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzhlMDcyLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vYmxvY2tkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfQkxPQ0tEX0gKLSNkZWZpbmUgX19JTkNfQkxPQ0tEX0gKLQotdm9pZCB2cHhfbG9nKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgIm12LmgiCi0jaW5jbHVkZSAidHJlZWNvZGVyLmgiCi0jaW5jbHVkZSAic3VicGl4ZWwuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCi0KLSNkZWZpbmUgVFJVRSAgICAxCi0jZGVmaW5lIEZBTFNFICAgMAotCi0vKiNkZWZpbmUgRENQUkVEIDEqLwotI2RlZmluZSBEQ1BSRURTSU1USFJFU0ggMAotI2RlZmluZSBEQ1BSRURDTlRUSFJFU0ggMwotCi0jZGVmaW5lIE1CX0ZFQVRVUkVfVFJFRV9QUk9CUyAgIDMKLSNkZWZpbmUgTUFYX01CX1NFR01FTlRTICAgICAgICAgNAotCi0jZGVmaW5lIE1BWF9SRUZfTEZfREVMVEFTICAgICAgIDQKLSNkZWZpbmUgTUFYX01PREVfTEZfREVMVEFTICAgICAgNAotCi0vKiBTZWdtZW50IEZlYXR1cmUgTWFza3MgKi8KLSNkZWZpbmUgU0VHTUVOVF9ERUxUQURBVEEgICAwCi0jZGVmaW5lIFNFR01FTlRfQUJTREFUQSAgICAgMQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludCByLCBjOwotfSBQT1M7Ci0KLSNkZWZpbmUgUExBTkVfVFlQRV9ZX05PX0RDICAgIDAKLSNkZWZpbmUgUExBTkVfVFlQRV9ZMiAgICAgICAgIDEKLSNkZWZpbmUgUExBTkVfVFlQRV9VViAgICAgICAgIDIKLSNkZWZpbmUgUExBTkVfVFlQRV9ZX1dJVEhfREMgIDMKLQotCi10eXBlZGVmIGNoYXIgRU5UUk9QWV9DT05URVhUOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBFTlRST1BZX0NPTlRFWFQgeTFbNF07Ci0gICAgRU5UUk9QWV9DT05URVhUIHVbMl07Ci0gICAgRU5UUk9QWV9DT05URVhUIHZbMl07Ci0gICAgRU5UUk9QWV9DT05URVhUIHkyOwotfSBFTlRST1BZX0NPTlRFWFRfUExBTkVTOwotCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciB2cDhfYmxvY2sybGVmdFsyNV07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciB2cDhfYmxvY2syYWJvdmVbMjVdOwotCi0jZGVmaW5lIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKCBEZXN0LCBBLCBCKSBcCi0gICAgRGVzdCA9ICgoQSkhPTApICsgKChCKSE9MCk7Ci0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgS0VZX0ZSQU1FID0gMCwKLSAgICBJTlRFUl9GUkFNRSA9IDEKLX0gRlJBTUVfVFlQRTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgRENfUFJFRCwgICAgICAgICAgICAvKiBhdmVyYWdlIG9mIGFib3ZlIGFuZCBsZWZ0IHBpeGVscyAqLwotICAgIFZfUFJFRCwgICAgICAgICAgICAgLyogdmVydGljYWwgcHJlZGljdGlvbiAqLwotICAgIEhfUFJFRCwgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCBwcmVkaWN0aW9uICovCi0gICAgVE1fUFJFRCwgICAgICAgICAgICAvKiBUcnVlbW90aW9uIHByZWRpY3Rpb24gKi8KLSAgICBCX1BSRUQsICAgICAgICAgICAgIC8qIGJsb2NrIGJhc2VkIHByZWRpY3Rpb24sIGVhY2ggYmxvY2sgaGFzIGl0cyBvd24gcHJlZGljdGlvbiBtb2RlICovCi0KLSAgICBORUFSRVNUTVYsCi0gICAgTkVBUk1WLAotICAgIFpFUk9NViwKLSAgICBORVdNViwKLSAgICBTUExJVE1WLAotCi0gICAgTUJfTU9ERV9DT1VOVAotfSBNQl9QUkVESUNUSU9OX01PREU7Ci0KLS8qIE1hY3JvYmxvY2sgbGV2ZWwgZmVhdHVyZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIE1CX0xWTF9BTFRfUSA9IDAsICAgICAgICAgICAgICAgLyogVXNlIGFsdGVybmF0ZSBRdWFudGl6ZXIgLi4uLiAqLwotICAgIE1CX0xWTF9BTFRfTEYgPSAxLCAgICAgICAgICAgICAgLyogVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZS4uLiAqLwotICAgIE1CX0xWTF9NQVggPSAyICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIE1CIGxldmVsIGZlYXR1cmVzIHN1cHBvcnRlZCAqLwotCi19IE1CX0xWTF9GRUFUVVJFUzsKLQotLyogU2VnbWVudCBGZWF0dXJlIE1hc2tzICovCi0jZGVmaW5lIFNFR01FTlRfQUxUUSAgICAweDAxCi0jZGVmaW5lIFNFR01FTlRfQUxUX0xGICAweDAyCi0KLSNkZWZpbmUgVlA4X1lNT0RFUyAgKEJfUFJFRCArIDEpCi0jZGVmaW5lIFZQOF9VVl9NT0RFUyAoVE1fUFJFRCArIDEpCi0KLSNkZWZpbmUgVlA4X01WUkVGUyAoMSArIFNQTElUTVYgLSBORUFSRVNUTVYpCi0KLXR5cGVkZWYgZW51bQotewotICAgIEJfRENfUFJFRCwgICAgICAgICAgLyogYXZlcmFnZSBvZiBhYm92ZSBhbmQgbGVmdCBwaXhlbHMgKi8KLSAgICBCX1RNX1BSRUQsCi0KLSAgICBCX1ZFX1BSRUQsICAgICAgICAgICAvKiB2ZXJ0aWNhbCBwcmVkaWN0aW9uICovCi0gICAgQl9IRV9QUkVELCAgICAgICAgICAgLyogaG9yaXpvbnRhbCBwcmVkaWN0aW9uICovCi0KLSAgICBCX0xEX1BSRUQsCi0gICAgQl9SRF9QUkVELAotCi0gICAgQl9WUl9QUkVELAotICAgIEJfVkxfUFJFRCwKLSAgICBCX0hEX1BSRUQsCi0gICAgQl9IVV9QUkVELAotCi0gICAgTEVGVDRYNCwKLSAgICBBQk9WRTRYNCwKLSAgICBaRVJPNFg0LAotICAgIE5FVzRYNCwKLQotICAgIEJfTU9ERV9DT1VOVAotfSBCX1BSRURJQ1RJT05fTU9ERTsKLQotI2RlZmluZSBWUDhfQklOVFJBTU9ERVMgKEJfSFVfUFJFRCArIDEpICAvKiAxMCAqLwotI2RlZmluZSBWUDhfU1VCTVZSRUZTICgxICsgTkVXNFg0IC0gTEVGVDRYNCkKLQotLyogRm9yIGtleWZyYW1lcywgaW50cmEgYmxvY2sgbW9kZXMgYXJlIHByZWRpY3RlZCBieSB0aGUgKGFscmVhZHkgZGVjb2RlZCkKLSAgIG1vZGVzIGZvciB0aGUgWSBibG9ja3MgdG8gdGhlIGxlZnQgYW5kIGFib3ZlIHVzOyBmb3IgaW50ZXJmcmFtZXMsIHRoZXJlCi0gICBpcyBhIHNpbmdsZSBwcm9iYWJpbGl0eSB0YWJsZS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCX1BSRURJQ1RJT05fTU9ERSBtb2RlOwotICAgIHVuaW9uCi0gICAgewotICAgICAgICBpbnQgYXNfaW50OwotICAgICAgICBNViAgYXNfbXY7Ci0gICAgfSBtdjsKLX0gQl9NT0RFX0lORk87Ci0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgSU5UUkFfRlJBTUUgPSAwLAotICAgIExBU1RfRlJBTUUgPSAxLAotICAgIEdPTERFTl9GUkFNRSA9IDIsCi0gICAgQUxUUkVGX0ZSQU1FID0gMywKLSAgICBNQVhfUkVGX0ZSQU1FUyA9IDQKLX0gTVZfUkVGRVJFTkNFX0ZSQU1FOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlLCB1dl9tb2RlOwotICAgIE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWU7Ci0gICAgdW5pb24KLSAgICB7Ci0gICAgICAgIGludCBhc19pbnQ7Ci0gICAgICAgIE1WICBhc19tdjsKLSAgICB9IG12OwotCi0gICAgdW5zaWduZWQgY2hhciBwYXJ0aXRpb25pbmc7Ci0gICAgdW5zaWduZWQgY2hhciBtYl9za2lwX2NvZWZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9lcyB0aGlzIG1iIGhhcyBjb2VmZmljaWVudHMgYXQgYWxsLCAxPW5vIGNvZWZmaWNpZW50cywgMD1uZWVkIGRlY29kZSB0b2tlbnMgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGRjX2RpZmY7Ci0gICAgdW5zaWduZWQgY2hhciBuZWVkX3RvX2NsYW1wX212czsKLQotICAgIHVuc2lnbmVkIGNoYXIgc2VnbWVudF9pZDsgICAgICAgICAgICAgICAgICAvKiBXaGljaCBzZXQgb2Ygc2VnbWVudGF0aW9uIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgTUIgKi8KLQotICAgIHVuc2lnbmVkIGNoYXIgZm9yY2Vfbm9fc2tpcDsgLyogZW5jb2RlciBvbmx5ICovCi19IE1CX01PREVfSU5GTzsKLQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE1CX01PREVfSU5GTyBtYm1pOwotICAgIEJfTU9ERV9JTkZPIGJtaVsxNl07Ci19IE1PREVfSU5GTzsKLQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHNob3J0ICpxY29lZmY7Ci0gICAgc2hvcnQgKmRxY29lZmY7Ci0gICAgdW5zaWduZWQgY2hhciAgKnByZWRpY3RvcjsKLSAgICBzaG9ydCAqZGlmZjsKLSAgICBzaG9ydCAqcmVmZXJlbmNlOwotCi0gICAgc2hvcnQgKmRlcXVhbnQ7Ci0KLSAgICAvKiAxNiBZIGJsb2NrcywgNCBVIGJsb2NrcywgNCBWIGJsb2NrcyBlYWNoIHdpdGggMTYgZW50cmllcyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKipiYXNlX3ByZTsKLSAgICBpbnQgcHJlOwotICAgIGludCBwcmVfc3RyaWRlOwotCi0gICAgdW5zaWduZWQgY2hhciAqKmJhc2VfZHN0OwotICAgIGludCBkc3Q7Ci0gICAgaW50IGRzdF9zdHJpZGU7Ci0KLSAgICBpbnQgZW9iOwotCi0gICAgQl9NT0RFX0lORk8gYm1pOwotCi19IEJMT0NLRDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBkaWZmWzQwMF0pOyAgICAgIC8qIGZyb20gaWRjdCBkaWZmICovCi0gICAgREVDTEFSRV9BTElHTkVEKDE2LCB1bnNpZ25lZCBjaGFyLCAgcHJlZGljdG9yWzM4NF0pOwotLyogbm90IHVzZWQgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgcmVmZXJlbmNlWzM4NF0pOyAqLwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIHFjb2VmZls0MDBdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBkcWNvZWZmWzQwMF0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgY2hhciwgIGVvYnNbMjVdKTsKLQotICAgIC8qIDE2IFkgYmxvY2tzLCA0IFUsIDQgViwgMSBEQyAybmQgb3JkZXIgYmxvY2ssIGVhY2ggd2l0aCAxNiBlbnRyaWVzLiAqLwotICAgIEJMT0NLRCBibG9ja1syNV07Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgcHJlOyAvKiBGaWx0ZXJlZCBjb3B5IG9mIHByZXZpb3VzIGZyYW1lIHJlY29uc3RydWN0aW9uICovCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHIGRzdDsKLQotICAgIE1PREVfSU5GTyAqbW9kZV9pbmZvX2NvbnRleHQ7Ci0gICAgaW50IG1vZGVfaW5mb19zdHJpZGU7Ci0KLSAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7Ci0KLSAgICBpbnQgdXBfYXZhaWxhYmxlOwotICAgIGludCBsZWZ0X2F2YWlsYWJsZTsKLQotICAgIC8qIFksVSxWLFkyICovCi0gICAgRU5UUk9QWV9DT05URVhUX1BMQU5FUyAqYWJvdmVfY29udGV4dDsKLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTICpsZWZ0X2NvbnRleHQ7Ci0KLSAgICAvKiAwIGluZGljYXRlcyBzZWdtZW50YXRpb24gYXQgTUIgbGV2ZWwgaXMgbm90IGVuYWJsZWQuIE90aGVyd2lzZSB0aGUgaW5kaXZpZHVhbCBiaXRzIGluZGljYXRlIHdoaWNoIGZlYXR1cmVzIGFyZSBhY3RpdmUuICovCi0gICAgdW5zaWduZWQgY2hhciBzZWdtZW50YXRpb25fZW5hYmxlZDsKLQotICAgIC8qIDAgKGRvIG5vdCB1cGRhdGUpIDEgKHVwZGF0ZSkgdGhlIG1hY3JvYmxvY2sgc2VnbWVudGF0aW9uIG1hcC4gKi8KLSAgICB1bnNpZ25lZCBjaGFyIHVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwOwotCi0gICAgLyogMCAoZG8gbm90IHVwZGF0ZSkgMSAodXBkYXRlKSB0aGUgbWFjcm9ibG9jayBzZWdtZW50YXRpb24gZmVhdHVyZSBkYXRhLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgdXBkYXRlX21iX3NlZ21lbnRhdGlvbl9kYXRhOwotCi0gICAgLyogMCAoZG8gbm90IHVwZGF0ZSkgMSAodXBkYXRlKSB0aGUgbWFjcm9ibG9jayBzZWdtZW50YXRpb24gZmVhdHVyZSBkYXRhLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgbWJfc2VnZW1lbnRfYWJzX2RlbHRhOwotCi0gICAgLyogUGVyIGZyYW1lIGZsYWdzIHRoYXQgZGVmaW5lIHdoaWNoIE1CIGxldmVsIGZlYXR1cmVzIChzdWNoIGFzIHF1YW50aXplciBvciBsb29wIGZpbHRlciBsZXZlbCkgKi8KLSAgICAvKiBhcmUgZW5hYmxlZCBhbmQgd2hlbiBlbmFibGVkIHRoZSBwcm9hYmlsaXRpZXMgdXNlZCB0byBkZWNvZGUgdGhlIHBlciBNQiBmbGFncyBpbiBNQl9NT0RFX0lORk8gKi8KLSAgICB2cDhfcHJvYiBtYl9zZWdtZW50X3RyZWVfcHJvYnNbTUJfRkVBVFVSRV9UUkVFX1BST0JTXTsgICAgICAgICAvKiBQcm9iYWJpbGl0eSBUcmVlIHVzZWQgdG8gY29kZSBTZWdtZW50IG51bWJlciAqLwotCi0gICAgc2lnbmVkIGNoYXIgc2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX01BWF1bTUFYX01CX1NFR01FTlRTXTsgICAgICAgICAgICAvKiBTZWdtZW50IHBhcmFtZXRlcnMgKi8KLQotICAgIC8qIG1vZGVfYmFzZWQgTG9vcCBmaWx0ZXIgYWRqdXN0bWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgbW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZDsKLSAgICB1bnNpZ25lZCBjaGFyIG1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZTsKLQotICAgIC8qIERlbHRhIHZhbHVlcyBoYXZlIHRoZSByYW5nZSArLy0gTUFYX0xPT1BfRklMVEVSICovCi0gICAgc2lnbmVkIGNoYXIgbGFzdF9yZWZfbGZfZGVsdGFzW01BWF9SRUZfTEZfREVMVEFTXTsgICAgICAgICAgICAgICAgLyogMCA9IEludHJhLCBMYXN0LCBHRiwgQVJGICovCi0gICAgc2lnbmVkIGNoYXIgcmVmX2xmX2RlbHRhc1tNQVhfUkVGX0xGX0RFTFRBU107ICAgICAgICAgICAgICAgICAgICAgLyogMCA9IEludHJhLCBMYXN0LCBHRiwgQVJGICovCi0gICAgc2lnbmVkIGNoYXIgbGFzdF9tb2RlX2xmX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOyAgICAgICAgICAgICAgICAgICAgICAvKiAwID0gQlBSRUQsIFpFUk9fTVYsIE1WLCBTUExJVCAqLwotICAgIHNpZ25lZCBjaGFyIG1vZGVfbGZfZGVsdGFzW01BWF9NT0RFX0xGX0RFTFRBU107ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9IEJQUkVELCBaRVJPX01WLCBNViwgU1BMSVQgKi8KLQotICAgIC8qIERpc3RhbmNlIG9mIE1CIGF3YXkgZnJvbSBmcmFtZSBlZGdlcyAqLwotICAgIGludCBtYl90b19sZWZ0X2VkZ2U7Ci0gICAgaW50IG1iX3RvX3JpZ2h0X2VkZ2U7Ci0gICAgaW50IG1iX3RvX3RvcF9lZGdlOwotICAgIGludCBtYl90b19ib3R0b21fZWRnZTsKLQotICAgIHVuc2lnbmVkIGludCBmcmFtZXNfc2luY2VfZ29sZGVuOwotICAgIHVuc2lnbmVkIGludCBmcmFtZXNfdGlsbF9hbHRfcmVmX2ZyYW1lOwotICAgIHZwOF9zdWJwaXhfZm5fdCAgc3VicGl4ZWxfcHJlZGljdDsKLSAgICB2cDhfc3VicGl4X2ZuX3QgIHN1YnBpeGVsX3ByZWRpY3Q4eDQ7Ci0gICAgdnA4X3N1YnBpeF9mbl90ICBzdWJwaXhlbF9wcmVkaWN0OHg4OwotICAgIHZwOF9zdWJwaXhfZm5fdCAgc3VicGl4ZWxfcHJlZGljdDE2eDE2OwotCi0gICAgdm9pZCAqY3VycmVudF9iYzsKLQotICAgIGludCBjb3JydXB0ZWQ7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgc3RydWN0IFZQOF9DT01NT05fUlRDRCAgKnJ0Y2Q7Ci0jZW5kaWYKLX0gTUFDUk9CTE9DS0Q7Ci0KLQotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2Jsb2NrX2RvZmZzZXRzKE1BQ1JPQkxPQ0tEICp4KTsKLWV4dGVybiB2b2lkIHZwOF9zZXR1cF9ibG9ja19kcHRycyhNQUNST0JMT0NLRCAqeCk7Ci0KLSNlbmRpZiAgLyogX19JTkNfQkxPQ0tEX0ggKi8KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vY29lZnVwZGF0ZXByb2JzLmggYi92cDgvY29tbW9uL2NvZWZ1cGRhdGVwcm9icy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODVlM2ZmLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vY29lZnVwZGF0ZXByb2JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qIFVwZGF0ZSBwcm9iYWJpbGl0aWVzIGZvciB0aGUgbm9kZXMgaW4gdGhlIHRva2VuIGVudHJvcHkgdHJlZS4KLSAgIEdlbmVyYXRlZCBmaWxlIGluY2x1ZGVkIGJ5IGVudHJvcHkuYyAqLwotCi1jb25zdCB2cDhfcHJvYiB2cDhfY29lZl91cGRhdGVfcHJvYnMgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vucy0xXSA9Ci17Ci0gICAgewotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsxNzYsIDI0NiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyMjMsIDI0MSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNDksIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjQ0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezIzNCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNDYsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjM5LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTEsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTQsIDI1MywgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjUwLCAyNTUsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgewotICAgICAgICAgICAgezIxNywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezIyNSwgMjUyLCAyNDEsIDI1MywgMjU1LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezIzNCwgMjUwLCAyNDEsIDI1MCwgMjUzLCAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjIzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjM4LCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNDksIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI0NywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHsxODYsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyMzQsIDI1MSwgMjQ0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTEsIDI1MSwgMjQzLCAyNTMsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezIzNiwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1MSwgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU0LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgIH0sCi0gICAgewotICAgICAgICB7Ci0gICAgICAgICAgICB7MjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjUwLCAyNTQsIDI1MiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjQ4LCAyNTQsIDI0OSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNDYsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTIsIDI1NCwgMjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjU0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI0OCwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1MywgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjQ1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjUzLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTIsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgezI1NSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI0OSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICAgICAgezI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCB9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgfSwKLSAgICAgICAgfSwKLSAgICB9LAotfTsKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vY29tbW9uLmggYi92cDgvY29tbW9uL2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTkzZGE5Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBjb21tb25faAotI2RlZmluZSBjb21tb25faCAxCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotLyogSW50ZXJmYWNlIGhlYWRlciBmb3IgY29tbW9uIGNvbnN0YW50IGRhdGEgc3RydWN0dXJlcyBhbmQgbG9va3VwIHRhYmxlcyAqLwotCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0KLSNpbmNsdWRlICJjb21tb25fdHlwZXMuaCIKLQotLyogT25seSBuZWVkIHRoaXMgZm9yIGZpeGVkLXNpemUgYXJyYXlzLCBmb3Igc3RydWN0cyBqdXN0IGFzc2lnbi4gKi8KLQotI2RlZmluZSB2cDhfY29weSggRGVzdCwgU3JjKSB7IFwKLSAgICAgICAgYXNzZXJ0KCBzaXplb2YoIERlc3QpID09IHNpemVvZiggU3JjKSk7IFwKLSAgICAgICAgdnB4X21lbWNweSggRGVzdCwgU3JjLCBzaXplb2YoIFNyYykpOyBcCi0gICAgfQotCi0vKiBVc2UgdGhpcyBmb3IgdmFyaWFibHktc2l6ZWQgYXJyYXlzLiAqLwotCi0jZGVmaW5lIHZwOF9jb3B5X2FycmF5KCBEZXN0LCBTcmMsIE4pIHsgXAotICAgICAgICBhc3NlcnQoIHNpemVvZiggKkRlc3QpID09IHNpemVvZiggKlNyYykpOyBcCi0gICAgICAgIHZweF9tZW1jcHkoIERlc3QsIFNyYywgTiAqIHNpemVvZiggKlNyYykpOyBcCi0gICAgfQotCi0jZGVmaW5lIHZwOF96ZXJvKCBEZXN0KSAgdnB4X21lbXNldCggJkRlc3QsIDAsIHNpemVvZiggRGVzdCkpOwotCi0jZGVmaW5lIHZwOF96ZXJvX2FycmF5KCBEZXN0LCBOKSAgdnB4X21lbXNldCggRGVzdCwgMCwgTiAqIHNpemVvZiggKkRlc3QpKTsKLQotCi0jZW5kaWYgIC8qIGNvbW1vbl9oICovCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2NvbW1vbl90eXBlcy5oIGIvdnA4L2NvbW1vbi9jb21tb25fdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2MjQ4Ni4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2NvbW1vbl90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfQ09NTU9OX1RZUEVTCi0jZGVmaW5lIF9fSU5DX0NPTU1PTl9UWVBFUwotCi0jZGVmaW5lIFRSVUUgICAgMQotI2RlZmluZSBGQUxTRSAgIDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2RlYnVnbW9kZXMuYyBiL3ZwOC9jb21tb24vZGVidWdtb2Rlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzAzNDgwLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vZGVidWdtb2Rlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJibG9ja2QuaCIKLQotCi12b2lkIHZwOF9wcmludF9tb2Rlc19hbmRfbW90aW9uX3ZlY3RvcnMoTU9ERV9JTkZPICptaSwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZnJhbWUpCi17Ci0KLSAgICBpbnQgbWJfcm93OwotICAgIGludCBtYl9jb2w7Ci0gICAgaW50IG1iX2luZGV4ID0gMDsKLSAgICBGSUxFICptdnMgPSBmb3BlbigibXZzLnN0dCIsICJhIik7Ci0KLSAgICAvKiBwcmludCBvdXQgdGhlIG1hY3JvYmxvY2sgWSBtb2RlcyAqLwotICAgIG1iX2luZGV4ID0gMDsKLSAgICBmcHJpbnRmKG12cywgIk1iIE1vZGVzIGZvciBGcmFtZSAlZFxuIiwgZnJhbWUpOwotCi0gICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCByb3dzOyBtYl9yb3crKykKLSAgICB7Ci0gICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY29sczsgbWJfY29sKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgZnByaW50ZihtdnMsICIlMmQgIiwgbWlbbWJfaW5kZXhdLm1ibWkubW9kZSk7Ci0KLSAgICAgICAgICAgIG1iX2luZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBmcHJpbnRmKG12cywgIlxuIik7Ci0gICAgICAgIG1iX2luZGV4Kys7Ci0gICAgfQotCi0gICAgZnByaW50ZihtdnMsICJcbiIpOwotCi0gICAgbWJfaW5kZXggPSAwOwotICAgIGZwcmludGYobXZzLCAiTWIgbXYgcmVmIGZvciBGcmFtZSAlZFxuIiwgZnJhbWUpOwotCi0gICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3cgPCByb3dzOyBtYl9yb3crKykKLSAgICB7Ci0gICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY29sczsgbWJfY29sKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgZnByaW50ZihtdnMsICIlMmQgIiwgbWlbbWJfaW5kZXhdLm1ibWkucmVmX2ZyYW1lKTsKLQotICAgICAgICAgICAgbWJfaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYobXZzLCAiXG4iKTsKLSAgICAgICAgbWJfaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKG12cywgIlxuIik7Ci0KLSAgICAvKiBwcmludCBvdXQgdGhlIG1hY3JvYmxvY2sgVVYgbW9kZXMgKi8KLSAgICBtYl9pbmRleCA9IDA7Ci0gICAgZnByaW50ZihtdnMsICJVViBNb2RlcyBmb3IgRnJhbWUgJWRcbiIsIGZyYW1lKTsKLQotICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgcm93czsgbWJfcm93KyspCi0gICAgewotICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNvbHM7IG1iX2NvbCsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGZwcmludGYobXZzLCAiJTJkICIsIG1pW21iX2luZGV4XS5tYm1pLnV2X21vZGUpOwotCi0gICAgICAgICAgICBtYl9pbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgbWJfaW5kZXgrKzsKLSAgICAgICAgZnByaW50ZihtdnMsICJcbiIpOwotICAgIH0KLQotICAgIGZwcmludGYobXZzLCAiXG4iKTsKLQotICAgIC8qIHByaW50IG91dCB0aGUgYmxvY2sgbW9kZXMgKi8KLSAgICBtYl9pbmRleCA9IDA7Ci0gICAgZnByaW50ZihtdnMsICJNYnMgZm9yIEZyYW1lICVkXG4iLCBmcmFtZSk7Ci0gICAgewotICAgICAgICBpbnQgYl9yb3c7Ci0KLSAgICAgICAgZm9yIChiX3JvdyA9IDA7IGJfcm93IDwgNCAqIHJvd3M7IGJfcm93KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBiX2NvbDsKLSAgICAgICAgICAgIGludCBiaW5kZXg7Ci0KLSAgICAgICAgICAgIGZvciAoYl9jb2wgPSAwOyBiX2NvbCA8IDQgKiBjb2xzOyBiX2NvbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1iX2luZGV4ID0gKGJfcm93ID4+IDIpICogKGNvbHMgKyAxKSArIChiX2NvbCA+PiAyKTsKLSAgICAgICAgICAgICAgICBiaW5kZXggPSAoYl9yb3cgJiAzKSAqIDQgKyAoYl9jb2wgJiAzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtaVttYl9pbmRleF0ubWJtaS5tb2RlID09IEJfUFJFRCkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihtdnMsICIlMmQgIiwgbWlbbWJfaW5kZXhdLmJtaVtiaW5kZXhdLm1vZGUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihtdnMsICJ4eCAiKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKG12cywgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnByaW50ZihtdnMsICJcbiIpOwotCi0gICAgLyogcHJpbnQgb3V0IHRoZSBtYWNyb2Jsb2NrIG12cyAqLwotICAgIG1iX2luZGV4ID0gMDsKLSAgICBmcHJpbnRmKG12cywgIk1WcyBmb3IgRnJhbWUgJWRcbiIsIGZyYW1lKTsKLQotICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgcm93czsgbWJfcm93KyspCi0gICAgewotICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IGNvbHM7IG1iX2NvbCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKG12cywgIiU1ZDolLTVkIiwgbWlbbWJfaW5kZXhdLm1ibWkubXYuYXNfbXYucm93IC8gMiwgbWlbbWJfaW5kZXhdLm1ibWkubXYuYXNfbXYuY29sIC8gMik7Ci0KLSAgICAgICAgICAgIG1iX2luZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBtYl9pbmRleCsrOwotICAgICAgICBmcHJpbnRmKG12cywgIlxuIik7Ci0gICAgfQotCi0gICAgZnByaW50ZihtdnMsICJcbiIpOwotCi0KLSAgICAvKiBwcmludCBvdXQgdGhlIGJsb2NrIG1vZGVzICovCi0gICAgbWJfaW5kZXggPSAwOwotICAgIGZwcmludGYobXZzLCAiTVZzIGZvciBGcmFtZSAlZFxuIiwgZnJhbWUpOwotICAgIHsKLSAgICAgICAgaW50IGJfcm93OwotCi0gICAgICAgIGZvciAoYl9yb3cgPSAwOyBiX3JvdyA8IDQgKiByb3dzOyBiX3JvdysrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYl9jb2w7Ci0gICAgICAgICAgICBpbnQgYmluZGV4OwotCi0gICAgICAgICAgICBmb3IgKGJfY29sID0gMDsgYl9jb2wgPCA0ICogY29sczsgYl9jb2wrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYl9pbmRleCA9IChiX3JvdyA+PiAyKSAqIChjb2xzICsgMSkgKyAoYl9jb2wgPj4gMik7Ci0gICAgICAgICAgICAgICAgYmluZGV4ID0gKGJfcm93ICYgMykgKiA0ICsgKGJfY29sICYgMyk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihtdnMsICIlM2Q6JS0zZCAiLCBtaVttYl9pbmRleF0uYm1pW2JpbmRleF0ubXYuYXNfbXYucm93LCBtaVttYl9pbmRleF0uYm1pW2JpbmRleF0ubXYuYXNfbXYuY29sKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKG12cywgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnByaW50ZihtdnMsICJcbiIpOwotCi0KLSAgICBmY2xvc2UobXZzKTsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vZGVmYXVsdGNvZWZjb3VudHMuaCBiL3ZwOC9jb21tb24vZGVmYXVsdGNvZWZjb3VudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1OGQ1Ni4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2RlZmF1bHRjb2VmY291bnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qIEdlbmVyYXRlZCBmaWxlLCBpbmNsdWRlZCBieSBlbnRyb3B5LmMgKi8KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0X2NvZWZfY291bnRzIFtCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFt2cDhfY29lZl90b2tlbnNdID0KLXsKLQotICAgIHsKLSAgICAgICAgLyogQmxvY2sgVHlwZSAoIDAgKSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMCApICovCi0gICAgICAgICAgICB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgeyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAxICkgKi8KLSAgICAgICAgICAgIHszMDE5MCwgMjY1NDQsIDIyNSwgIDI0LCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDQxNzE1OTMsfSwKLSAgICAgICAgICAgIHsyNjg0NiwgMjUxNTcsIDEyNDEsIDEzMCwgIDI2LCAgIDYsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAxNDk5ODcsfSwKLSAgICAgICAgICAgIHsxMDQ4NCwgOTUzOCwgMTAwNiwgMTYwLCAgMzYsICAxOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDE1MTA0LH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAyICkgKi8KLSAgICAgICAgICAgIHsyNTg0MiwgNDA0NTYsIDExMjYsICA4MywgIDExLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHs5MzM4LCA4MDEwLCA1MTIsICA3MywgICA3LCAgIDMsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCA0MzI5NCx9LAotICAgICAgICAgICAgezEwNDcsIDc1MSwgMTQ5LCAgMzEsICAxMywgICA2LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgODc5LH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAzICkgKi8KLSAgICAgICAgICAgIHsyNjEzNiwgOTgyNiwgMjUyLCAgMTMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7ODEzNCwgNTU3NCwgMTkxLCAgMTQsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMzUzMDIsfSwKLSAgICAgICAgICAgIHsgNjA1LCA2NzcsIDExNiwgICA5LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDYxMSx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNCApICovCi0gICAgICAgICAgICB7MTAyNjMsIDE1NDYzLCAyODMsICAxNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsyNzczLCAyMTkxLCAxMjgsICAgOSwgICAyLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAxMDA3Myx9LAotICAgICAgICAgICAgeyAxMzQsIDEyNSwgIDMyLCAgIDQsICAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgIDUwLH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA1ICkgKi8KLSAgICAgICAgICAgIHsxMDQ4MywgMjY2MywgIDIzLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7MjEzNywgMTI1MSwgIDI3LCAgIDEsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTQzNjIsfSwKLSAgICAgICAgICAgIHsgMTE2LCAxNTYsICAxNCwgICAyLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDE5MCx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNiApICovCi0gICAgICAgICAgICB7NDA5NzcsIDI3NjE0LCA0MTIsICAyOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHs2MTEzLCA1MjEzLCAyNjEsICAyMiwgICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAyNjE2NCx9LAotICAgICAgICAgICAgeyAzODIsIDMxMiwgIDUwLCAgMTQsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMzQ1LH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA3ICkgKi8KLSAgICAgICAgICAgIHsgICAwLCAgMjYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgeyAgIDAsICAxMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMzE5LH0sCi0gICAgICAgICAgICB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDgsfSwKLSAgICAgICAgfSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyogQmxvY2sgVHlwZSAoIDEgKSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMCApICovCi0gICAgICAgICAgICB7MzI2OCwgMTkzODIsIDEwNDMsIDI1MCwgIDkzLCAgODIsICA0OSwgIDI2LCAgMTcsICAgOCwgIDI1LCA4MjI4OSx9LAotICAgICAgICAgICAgezg3NTgsIDMyMTEwLCA1NDM2LCAxODMyLCA4MjcsIDY2OCwgNDIwLCAxNTMsICAyNCwgICAwLCAgIDMsIDUyOTE0LH0sCi0gICAgICAgICAgICB7OTMzNywgMjM3MjUsIDg0ODcsIDM5NTQsIDIxMDcsIDE4MzYsIDEwNjksIDM5OSwgIDU5LCAgIDAsICAgMCwgMTg2MjAsfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDEgKSAqLwotICAgICAgICAgICAgezEyNDE5LCA4NDIwLCA0NTIsICA2MiwgICA5LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsxMTcxNSwgODcwNSwgNjkzLCAgOTIsICAxNSwgICA3LCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgNTM5ODgsfSwKLSAgICAgICAgICAgIHs3NjAzLCA4NTg1LCAyMzA2LCA3NzgsIDI3MCwgMTQ1LCAgMzksICAgNSwgICAwLCAgIDAsICAgMCwgOTEzNix9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMiApICovCi0gICAgICAgICAgICB7MTU5MzgsIDE0MzM1LCAxMjA3LCAxODQsICA1NSwgIDEzLCAgIDQsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7NzQxNSwgNjgyOSwgMTEzOCwgMjQ0LCAgNzEsICAyNiwgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsIDk5ODAsfSwKLSAgICAgICAgICAgIHsxNTgwLCAxODI0LCA2NTUsIDI0MSwgIDg5LCAgNDYsICAxMCwgICAyLCAgIDAsICAgMCwgICAwLCA0MjksfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDMgKSAqLwotICAgICAgICAgICAgezE5NDUzLCA1MjYwLCAyMDEsICAxOSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHs5MTczLCAzNzU4LCAyMTMsICAyMiwgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA5ODIwLH0sCi0gICAgICAgICAgICB7MTY4OSwgMTI3NywgMjc2LCAgNTEsICAxNywgICA0LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNjc5LH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA0ICkgKi8KLSAgICAgICAgICAgIHsxMjA3NiwgMTA2NjcsIDYyMCwgIDg1LCAgMTksICAgOSwgICA1LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgezQ2NjUsIDM2MjUsIDQyMywgIDU1LCAgMTksICAgOSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDUxMjcsfSwKLSAgICAgICAgICAgIHsgNDE1LCA0NDAsIDE0MywgIDM0LCAgMjAsICAgNywgICAyLCAgIDAsICAgMCwgICAwLCAgIDAsIDEwMSx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNSApICovCi0gICAgICAgICAgICB7MTIxODMsIDQ4NDYsIDExNSwgIDExLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgezQyMjYsIDMxNDksIDE3NywgIDIxLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDcxNTcsfSwKLSAgICAgICAgICAgIHsgMzc1LCA2MjEsIDE4OSwgIDUxLCAgMTEsICAgNCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsIDE5OCx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNiApICovCi0gICAgICAgICAgICB7NjE2NTgsIDM3NzQzLCAxMjAzLCAgOTQsICAxMCwgICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7MTU1MTQsIDExNTYzLCA5MDMsIDExMSwgIDE0LCAgIDUsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAyNTE5NSx9LAotICAgICAgICAgICAgeyA5MjksIDEwNzcsIDI5MSwgIDc4LCAgMTQsICAgNywgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsIDUwNyx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNyApICovCi0gICAgICAgICAgICB7ICAgMCwgOTkwLCAgMTUsICAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsgICAwLCA0MTIsICAxMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDE2NDEsfSwKLSAgICAgICAgICAgIHsgICAwLCAgMTgsICAgNywgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAzMCx9LAotICAgICAgICB9LAotICAgIH0sCi0gICAgewotICAgICAgICAvKiBCbG9jayBUeXBlICggMiApICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAwICkgKi8KLSAgICAgICAgICAgIHsgOTUzLCAyNDUxOSwgNjI4LCAxMjAsICAyOCwgIDEyLCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCwgMjI0ODc5OCx9LAotICAgICAgICAgICAgezE1MjUsIDI1NjU0LCAyNjQ3LCA2MTcsIDIzOSwgMTQzLCAgNDIsICAgNSwgICAwLCAgIDAsICAgMCwgNjY4MzcsfSwKLSAgICAgICAgICAgIHsxMTgwLCAxMTAxMSwgMzAwMSwgMTIzNywgNTMyLCA0NDgsIDIzOSwgIDU0LCAgIDUsICAgMCwgICAwLCA3MTIyLH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAxICkgKi8KLSAgICAgICAgICAgIHsxMzU2LCAyMjIwLCAgNjcsICAxMCwgICA0LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsxNDUwLCAyNTQ0LCAxMDIsICAxOCwgICA0LCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA1NzA2Myx9LAotICAgICAgICAgICAgezExODIsIDIxMTAsIDQ3MCwgMTMwLCAgNDEsICAyMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDYwNDcsfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDIgKSAqLwotICAgICAgICAgICAgeyAzNzAsIDMzNzgsIDIwMCwgIDMwLCAgIDUsICAgNCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgeyAyOTMsIDEwMDYsIDEzMSwgIDI5LCAgMTEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDU0MDQsfSwKLSAgICAgICAgICAgIHsgMTE0LCAzODcsICA5OCwgIDIzLCAgIDQsICAgOCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsIDIzNix9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMyApICovCi0gICAgICAgICAgICB7IDU3OSwgMTk0LCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsgMzk1LCAyMTMsICAgNSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDQxNTcsfSwKLSAgICAgICAgICAgIHsgMTE5LCAxMjIsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDMwMCx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNCApICovCi0gICAgICAgICAgICB7ICAzOCwgNTU3LCAgMTksICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsgIDIxLCAxMTQsICAxMiwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDQyNyx9LAotICAgICAgICAgICAgeyAgIDAsICAgNSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA3LH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCA1ICkgKi8KLSAgICAgICAgICAgIHsgIDUyLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgeyAgMTgsICAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNjUyLH0sCi0gICAgICAgICAgICB7ICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgMzAsfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDYgKSAqLwotICAgICAgICAgICAgeyA2NDAsIDU2OSwgIDEwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7ICAyNSwgIDc3LCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA1MTcsfSwKLSAgICAgICAgICAgIHsgICA0LCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMyx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNyApICovCi0gICAgICAgICAgICB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgeyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qIEJsb2NrIFR5cGUgKCAzICkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDAgKSAqLwotICAgICAgICAgICAgezI1MDYsIDIwMTYxLCAyNzA3LCA3NjcsIDI2MSwgMTc4LCAxMDcsICAzMCwgIDE0LCAgIDMsICAgMCwgMTAwNjk0LH0sCi0gICAgICAgICAgICB7ODgwNiwgMzY0NzgsIDg4MTcsIDMyNjgsIDEyODAsIDg1MCwgNDAxLCAxMTQsICA0MiwgICAwLCAgIDAsIDU4NTcyLH0sCi0gICAgICAgICAgICB7MTEwMDMsIDI3MjE0LCAxMTc5OCwgNTcxNiwgMjQ4MiwgMjA3MiwgMTA0OCwgMTc1LCAgMzIsICAgMCwgICAwLCAxOTI4NCx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggMSApICovCi0gICAgICAgICAgICB7OTczOCwgMTEzMTMsIDk1OSwgMjA1LCAgNzAsICAxOCwgIDExLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCx9LAotICAgICAgICAgICAgezEyNjI4LCAxNTA4NSwgMTUwNywgMjczLCAgNTIsICAxOSwgICA5LCAgIDAsICAgMCwgICAwLCAgIDAsIDU0MjgwLH0sCi0gICAgICAgICAgICB7MTA3MDEsIDE1ODQ2LCA1NTYxLCAxOTI2LCA4MTMsIDU3MCwgMjQ5LCAgMzYsICAgMCwgICAwLCAgIDAsIDY0NjAsfSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29lZmYgQmFuZCAoIDIgKSAqLwotICAgICAgICAgICAgezY3ODEsIDIyNTM5LCAyNzg0LCA2MzQsIDE4MiwgMTIzLCAgMjAsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7NjI2MywgMTE1NDQsIDI2NDksIDc5MCwgMjU5LCAxNjgsICAyNywgICA1LCAgIDAsICAgMCwgICAwLCAyMDUzOSx9LAotICAgICAgICAgICAgezMxMDksIDQwNzUsIDIwMzEsIDg5NiwgNDU3LCAzODYsIDE1OCwgIDI5LCAgIDAsICAgMCwgICAwLCAxMTM4LH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvZWZmIEJhbmQgKCAzICkgKi8KLSAgICAgICAgICAgIHsxMTUxNSwgNDA3OSwgNDY1LCAgNzMsICAgNSwgIDE0LCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7OTM2MSwgNTgzNCwgNjUwLCAgOTYsICAyNCwgICA4LCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCwgMjIxODEsfSwKLSAgICAgICAgICAgIHs0MzQzLCAzOTc0LCAxMzYwLCA0MTUsIDEzMiwgIDk2LCAgMTQsICAgMSwgICAwLCAgIDAsICAgMCwgMTI2Nyx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNCApICovCi0gICAgICAgICAgICB7NDc4NywgOTI5NywgODIzLCAxNjgsICA0NCwgIDEyLCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7MzYxOSwgNDQ3MiwgNzE5LCAxOTgsICA2MCwgIDMxLCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgODQwMSx9LAotICAgICAgICAgICAgezExNTcsIDExNzUsIDQ4MywgMTgyLCAgODgsICAzMSwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsIDI2OCx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNSApICovCi0gICAgICAgICAgICB7ODI5OSwgMTIyNiwgIDMyLCAgIDUsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7MzUwMiwgMTU2OCwgIDU3LCAgIDQsICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgOTgxMSx9LAotICAgICAgICAgICAgezEwNTUsIDEwNzAsIDE2NiwgIDI5LCAgIDYsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDUyNyx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNiApICovCi0gICAgICAgICAgICB7Mjc0MTQsIDI3OTI3LCAxOTg5LCAzNDcsICA2OSwgIDI2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLH0sCi0gICAgICAgICAgICB7NTg3NiwgMTAwNzQsIDE1NzQsIDM0MSwgIDkxLCAgMjQsICAgNCwgICAwLCAgIDAsICAgMCwgICAwLCAyMTk1NCx9LAotICAgICAgICAgICAgezE1NzEsIDIxNzEsIDc3OCwgMzI0LCAxMjQsICA2NSwgIDE2LCAgIDAsICAgMCwgICAwLCAgIDAsIDk3OSx9LAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb2VmZiBCYW5kICggNyApICovCi0gICAgICAgICAgICB7ICAgMCwgIDI5LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsfSwKLSAgICAgICAgICAgIHsgICAwLCAgMjMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDQ1OSx9LAotICAgICAgICAgICAgeyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgIDEzLH0sCi0gICAgICAgIH0sCi0gICAgfSwKLX07CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2RtYV9kZXNjLmggYi92cDgvY29tbW9uL2RtYV9kZXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjNkYTYuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9kbWFfZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9kbWFfZGVzY19oCi0jZGVmaW5lIF9kbWFfZGVzY19oCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0jZGVmaW5lIE5EU0laRV9MRyAgIDB4MDAwMDA5MDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV9TTSAgIDB4MDAwMDA4MDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV83ICAgIDB4MDAwMDA3MDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV82ICAgIDB4MDAwMDA2MDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV81ICAgIDB4MDAwMDA1MDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV80ICAgIDB4MDAwMDA0MDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV8zICAgIDB4MDAwMDAzMDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV8yICAgIDB4MDAwMDAyMDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0jZGVmaW5lIE5EU0laRV8xICAgIDB4MDAwMDAxMDAgIC8vIE5leHQgRGVzY3JpcHRvciBTaXplCi0KLSNkZWZpbmUgRkxPV19TVE9QICAgICAgIDB4MDAwMAotI2RlZmluZSBGTE9XX0FVVE8gICAgICAgMHgxMDAwCi0jZGVmaW5lIEZMT1dfREVTQ19BUiAgICAweDQwMDAKLSNkZWZpbmUgRkxPV19ERVNDX1NNICAgIDB4NjAwMAotI2RlZmluZSBGTE9XX0RFU0NfTEcgICAgMHg3MDAwCi0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IG5kcDsKLSAgICAgICAgLy91bnNpZ25lZCBzaG9ydCBuZHBsOwotICAgICAgICAvL3Vuc2lnbmVkIHNob3J0IG5kcGg7Ci0gICAgICAgIHVuc2lnbmVkIGludCBzYTsKLSAgICAgICAgLy91bnNpZ25lZCBzaG9ydCBzYWw7Ci0gICAgICAgIC8vdW5zaWduZWQgc2hvcnQgc2FoOwotCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGRtYWNmZzsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeGNudDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeG1vZDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeWNudDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeW1vZDsKLQotICAgIH0gTEFSR0VfREVTQzsKLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBzaG9ydCBuZHBsOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYWw7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHNhaDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZG1hY2ZnOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB4Y250OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB4bW9kOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB5Y250OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB5bW9kOwotICAgIH0gU01BTExfREVTQzsKLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYWw7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHNhaDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZG1hY2ZnOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB4Y250OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB4bW9kOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB5Y250OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB5bW9kOwotICAgIH0gQVJSQVlfREVTQ183OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHNhbDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgc2FoOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBkbWFjZmc7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHhjbnQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHhtb2Q7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHljbnQ7Ci0gICAgfSBBUlJBWV9ERVNDXzY7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgc2FsOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYWg7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGRtYWNmZzsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeGNudDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeG1vZDsKLSAgICB9IEFSUkFZX0RFU0NfNTsKLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYWw7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHNhaDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZG1hY2ZnOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB4Y250OwotICAgIH0gQVJSQVlfREVTQ180OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHNhbDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgc2FoOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBkbWFjZmc7Ci0gICAgfSBBUlJBWV9ERVNDXzM7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgc2FsOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYWg7Ci0gICAgfSBBUlJBWV9ERVNDXzI7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgc2FsOwotICAgIH0gQVJSQVlfREVTQ18xOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYgLy9fZG1hX2Rlc2NfaApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9kdWNrX2lvLmggYi92cDgvY29tbW9uL2R1Y2tfaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkYWE2NS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2R1Y2tfaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfZHVja19pb19oCi0jZGVmaW5lIF9kdWNrX2lvX2gKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKQotICAgIHR5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwotI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKQotICAgIHR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX1BPV0VSUEMpCi0jaW5jbHVkZSA8cHBjL3R5cGVzLmg+Ci0jZWxzZQotICAgIHR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci0jZW5kaWYKLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICBpbnQ2NF90ICBvZmZzZXQ7ICAgICAvLyBvZmZzZXQgdG8gc3RhcnQgZnJvbQotICAgICAgICBpbnQgICAgYmxvY2tpbmc7ICAgIC8vIG5vbi16ZXJvIGZvciBibG9ja2luZwotICAgIH0gcmVfb3Blbl90OwotCi0KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIFNBTF9FUlJfTUFYICAgICAgICAgICAgICAgICA9IC0xMCwKLSAgICAgICAgU0FMX0VSUk9SICAgICAgICAgICAgICAgICAgID0gLTExLCAvLyBEZWZhdWx0IGVycm9yCi0gICAgICAgIFNBTF9FUlJfV1NBU1RBUlRVUCAgICAgICAgICA9IC0xMiwKLSAgICAgICAgU0FMX0VSUl9TT0NLRVRfQ1JFQVRFICAgICAgID0gLTEzLAotICAgICAgICBTQUxfRVJSX1JFU09MVklOR19IT1NUTkFNRSAgPSAtMTQsCi0gICAgICAgIFNBTF9FUlJfU0VSVkVSX0NPTk5FQ1RJT04gICA9IC0xNSwKLSAgICAgICAgU0FMX0VSUl9TRU5ESU5HX0RBVEEgICAgICAgID0gLTE2LAotICAgICAgICBTQUxfRVJSX1JFQ0VJVklOR19EQVRBICAgICAgPSAtMTcsCi0gICAgICAgIFNBTF9FUlJfNDA0X0ZJTEVfTk9UX0ZPVU5EICA9IC0xOCwKLSAgICAgICAgU0FMX0VSUl9QQVJTSU5HX0hUVFBfSEVBREVSID0gLTE5LAotICAgICAgICBTQUxfRVJSX1BBUlNJTkdfQ09OVEVOVF9MRU4gPSAtMjAsCi0gICAgICAgIFNBTF9FUlJfQ09OTkVDVElPTl9USU1FT1VUICA9IC0yMSwKLSAgICAgICAgU0FMX0VSUl9GSUxFX09QRU5fRkFJTEVEICAgID0gLTIyLAotICAgICAgICBTQUxfRVJSX01JTiAgICAgICAgICAgICAgICAgPSAtMjMKLSAgICB9IFNBTF9FUlI7IC8qIEVNSCAxLTE1LTAzICovCi0KLQotICAgIHR5cGVkZWYgc3RydWN0IHNhbF9lcnJfbWFwX3RlbXAKLSAgICB7Ci0gICAgICAgIFNBTF9FUlIgY29kZTsKLSAgICAgICAgY29uc3QgY2hhciAqZGVjb2RlOwotCi0gICAgfSBzYWxfZXJyX21hcF90OwotCi0KLSAgICBzdGF0aWMgY2hhciAqc2FsX2Vycl90ZXh0KFNBTF9FUlIgZSkKLSAgICB7Ci0gICAgICAgIGludCB0OwotICAgICAgICBjb25zdCBzYWxfZXJyX21hcF90IGdfc2FsX2Vycl9tYXBbXSA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1dTQVNUQVJUVVAsICAgICAgICAgICAgICJFcnJvciB3aXRoIFdTQVN0YXJ0dXAiICAgICAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1NPQ0tFVF9DUkVBVEUsICAgICAgICAgICJFcnJvciBjcmVhdGluZyBzb2NrZXQiICAgICAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1JFU09MVklOR19IT1NUTkFNRSwgICAgICJFcnJvciByZXNvbHZpbmcgaG9zdG5hbWUiICAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1NFUlZFUl9DT05ORUNUSU9OLCAgICAgICJFcnJvciBjb25uZWN0aW5nIHRvIHNlcnZlciIgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1NFTkRJTkdfREFUQSwgICAgICAgICAgICJFcnJvciBzZW5kaW5nIGRhdGEiICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1JFQ0VJVklOR19EQVRBLCAgICAgICAgICJFcnJvciByZWNlaXZpbmcgZGF0YSIgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSXzQwNF9GSUxFX05PVF9GT1VORCwgICAgICJFcnJvciBmaWxlIG5vdCBmb3VuZCAiICAgICAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1BBUlNJTkdfSFRUUF9IRUFERVIsICAgICJFcnJvciBwYXJzaW5nIGh0dHAgaGVhZGVyIiAgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX1BBUlNJTkdfQ09OVEVOVF9MRU4sICAgICJFcnJvciBwYXJzaW5nIGNvbnRlbnQgbGVuZ3RoIiAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX0NPTk5FQ1RJT05fVElNRU9VVCwgICAgICJFcnJvciBDb25uZWN0aW9uIHRpbWVkIG91dCIgICAgfSwKLSAgICAgICAgICAgIHsgICBTQUxfRVJSX0ZJTEVfT1BFTl9GQUlMRUQsICAgICAgICJFcnJvciBvcGVuaW5nIGZpbGUiICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGZvciAodCA9IDA7IHQgPCBzaXplb2YoZ19zYWxfZXJyX21hcCkgLyBzaXplb2Yoc2FsX2Vycl9tYXBfdCk7IHQrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGUgPT0gZ19zYWxfZXJyX21hcFt0XS5jb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiAoY2hhciAqKSBnX3NhbF9lcnJfbWFwW3RdLmRlY29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotCi0KLQotCi0KLQotICAgIGludCBkdWNrX29wZW4oY29uc3QgY2hhciAqZm5hbWUsIHVuc2lnbmVkIGxvbmcgdXNlcl9kYXRhKTsKLQotICAgIHZvaWQgZHVja19jbG9zZShpbnQgZ2huZGwpOwotCi0gICAgaW50IGR1Y2tfcmVhZChpbnQgZ2huZGwsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcyk7Ci0KLSAgICBpbnQ2NF90IGR1Y2tfc2VlayhpbnQgZ19obmRsLCBpbnQ2NF90IG9mZnMsIGludCBvcmlnaW4pOwotCi0gICAgaW50IGR1Y2tfcmVhZF9maW5pc2hlZChpbnQgaGFuLCBpbnQgZmxhZyk7IC8qIEZXRyA3LTktOTkgKi8KLQotICAgIGludCBkdWNrX25hbWUoaW50IGhhbmRsZSwgY2hhciBuYW1lW10sIHNpemVfdCBtYXhfbGVuKTsgLyogRU1IIDktMjMtMDMgKi8KLQotICAgIGludCBkdWNrX3JlYWRfYmxvY2tpbmcoaW50IGhhbmRsZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgYnl0ZXMpOyAvKiBFTUggOS0yMy0wMyAqLwotCi0gICAgaW50NjRfdCBkdWNrX2F2YWlsYWJsZV9kYXRhKGludCBoYW5kbGUpOyAvKiBFTUggMTAtMjMtMDMgKi8KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2VudHJvcHkuYyBiL3ZwOC9jb21tb24vZW50cm9weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZlNGY0Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vZW50cm9weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImVudHJvcHkuaCIKLSNpbmNsdWRlICJzdHJpbmcuaCIKLSNpbmNsdWRlICJibG9ja2QuaCIKLSNpbmNsdWRlICJvbnl4Y19pbnQuaCIKLQotI2RlZmluZSB1Y2hhciB1bnNpZ25lZCBjaGFyICAgICAvKiB0eXBlZGVmcyBjYW4gY2xhc2ggKi8KLSNkZWZpbmUgdWludCAgdW5zaWduZWQgaW50Ci0KLXR5cGVkZWYgY29uc3QgdWNoYXIgY3VjaGFyOwotdHlwZWRlZiBjb25zdCB1aW50IGN1aW50OwotCi10eXBlZGVmIHZwOF9wcm9iIFByb2I7Ci0KLSNpbmNsdWRlICJjb2VmdXBkYXRlcHJvYnMuaCIKLQotREVDTEFSRV9BTElHTkVEKDE2LCBjdWNoYXIsIHZwOF9jb2VmX2JhbmRzWzE2XSkgPSB7IDAsIDEsIDIsIDMsIDYsIDQsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDd9OwotREVDTEFSRV9BTElHTkVEKDE2LCBjdWNoYXIsIHZwOF9wcmV2X3Rva2VuX2NsYXNzW01BWF9FTlRST1BZX1RPS0VOU10pID0geyAwLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAwfTsKLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgaW50LCB2cDhfZGVmYXVsdF96aWdfemFnMWRbMTZdKSA9Ci17Ci0gICAgMCwgIDEsICA0LCAgOCwKLSAgICA1LCAgMiwgIDMsICA2LAotICAgIDksIDEyLCAxMywgMTAsCi0gICAgNywgMTEsIDE0LCAxNSwKLX07Ci0KLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3Qgc2hvcnQsIHZwOF9kZWZhdWx0X2ludl96aWdfemFnWzE2XSkgPQotewotICAgIDEsICAyLCAgNiwgIDcsCi0gICAgMywgIDUsICA4LCAxMywKLSAgICA0LCAgOSwgMTIsIDE0LAotICAgMTAsIDExLCAxNSwgMTYKLX07Ci0KLURFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIHZwOF9kZWZhdWx0X3ppZ196YWdfbWFza1sxNl0pOwotCi1jb25zdCBpbnQgdnA4X21iX2ZlYXR1cmVfZGF0YV9iaXRzW01CX0xWTF9NQVhdID0gezcsIDZ9OwotCi0vKiBBcnJheSBpbmRpY2VzIGFyZSBpZGVudGljYWwgdG8gcHJldmlvdXNseS1leGlzdGluZyBDT05URVhUX05PREUgaW5kaWNlcyAqLwotCi1jb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfY29lZl90cmVlWyAyMl0gPSAgICAgLyogY29ycmVzcG9uZGluZyBfQ09OVEVYVF9OT0RFcyAqLwotewotICAgIC1EQ1RfRU9CX1RPS0VOLCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9IEVPQiAqLwotICAgIC1aRVJPX1RPS0VOLCA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxID0gWkVSTyAqLwotICAgIC1PTkVfVE9LRU4sIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPSBPTkUgKi8KLSAgICA4LCAxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgPSBMT1dfVkFMICovCi0gICAgLVRXT19UT0tFTiwgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgPSBUV08gKi8KLSAgICAtVEhSRUVfVE9LRU4sIC1GT1VSX1RPS0VOLCAgICAgICAgICAgICAgICAvKiA1ID0gVEhSRUUgKi8KLSAgICAxNCwgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiA9IEhJR0hfTE9XICovCi0gICAgLURDVF9WQUxfQ0FURUdPUlkxLCAtRENUX1ZBTF9DQVRFR09SWTIsICAgLyogNyA9IENBVF9PTkUgKi8KLSAgICAxOCwgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4ID0gQ0FUX1RIUkVFRk9VUiAqLwotICAgIC1EQ1RfVkFMX0NBVEVHT1JZMywgLURDVF9WQUxfQ0FURUdPUlk0LCAgLyogOSA9IENBVF9USFJFRSAqLwotICAgIC1EQ1RfVkFMX0NBVEVHT1JZNSwgLURDVF9WQUxfQ0FURUdPUlk2ICAgLyogMTAgPSBDQVRfRklWRSAqLwotfTsKLQotc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X2NvZWZfZW5jb2RpbmdzW3ZwOF9jb2VmX3Rva2Vuc107Ci0KLS8qIFRyZWVzIGZvciBleHRyYSBiaXRzLiAgUHJvYmFiaWxpdGllcyBhcmUgY29uc3RhbnQgYW5kCi0gICBkbyBub3QgZGVwZW5kIG9uIHByZXZpb3VzbHkgZW5jb2RlZCBiaXRzICovCi0KLXN0YXRpYyBjb25zdCBQcm9iIFBjYXQxW10gPSB7IDE1OX07Ci1zdGF0aWMgY29uc3QgUHJvYiBQY2F0MltdID0geyAxNjUsIDE0NX07Ci1zdGF0aWMgY29uc3QgUHJvYiBQY2F0M1tdID0geyAxNzMsIDE0OCwgMTQwfTsKLXN0YXRpYyBjb25zdCBQcm9iIFBjYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNX07Ci1zdGF0aWMgY29uc3QgUHJvYiBQY2F0NVtdID0geyAxODAsIDE1NywgMTQxLCAxMzQsIDEzMH07Ci1zdGF0aWMgY29uc3QgUHJvYiBQY2F0NltdID0KLXsgMjU0LCAyNTQsIDI0MywgMjMwLCAxOTYsIDE3NywgMTUzLCAxNDAsIDEzMywgMTMwLCAxMjl9OwotCi1zdGF0aWMgdnA4X3RyZWVfaW5kZXggY2F0MVsyXSwgY2F0Mls0XSwgY2F0M1s2XSwgY2F0NFs4XSwgY2F0NVsxMF0sIGNhdDZbMjJdOwotCi12b2lkIHZwOF9pbml0X3NjYW5fb3JkZXJfbWFzaygpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHZwOF9kZWZhdWx0X3ppZ196YWdfbWFza1t2cDhfZGVmYXVsdF96aWdfemFnMWRbaV1dID0gMSA8PCBpOwotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZCBpbml0X2JpdF90cmVlKHZwOF90cmVlX2luZGV4ICpwLCBpbnQgbikKLXsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICB3aGlsZSAoKytpIDwgbikKLSAgICB7Ci0gICAgICAgIHBbMF0gPSBwWzFdID0gaSA8PCAxOwotICAgICAgICBwICs9IDI7Ci0gICAgfQotCi0gICAgcFswXSA9IHBbMV0gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X2JpdF90cmVlcygpCi17Ci0gICAgaW5pdF9iaXRfdHJlZShjYXQxLCAxKTsKLSAgICBpbml0X2JpdF90cmVlKGNhdDIsIDIpOwotICAgIGluaXRfYml0X3RyZWUoY2F0MywgMyk7Ci0gICAgaW5pdF9iaXRfdHJlZShjYXQ0LCA0KTsKLSAgICBpbml0X2JpdF90cmVlKGNhdDUsIDUpOwotICAgIGluaXRfYml0X3RyZWUoY2F0NiwgMTEpOwotfQotCi12cDhfZXh0cmFfYml0X3N0cnVjdCB2cDhfZXh0cmFfYml0c1sxMl0gPQotewotICAgIHsgMCwgMCwgMCwgMH0sCi0gICAgeyAwLCAwLCAwLCAxfSwKLSAgICB7IDAsIDAsIDAsIDJ9LAotICAgIHsgMCwgMCwgMCwgM30sCi0gICAgeyAwLCAwLCAwLCA0fSwKLSAgICB7IGNhdDEsIFBjYXQxLCAxLCA1fSwKLSAgICB7IGNhdDIsIFBjYXQyLCAyLCA3fSwKLSAgICB7IGNhdDMsIFBjYXQzLCAzLCAxMX0sCi0gICAgeyBjYXQ0LCBQY2F0NCwgNCwgMTl9LAotICAgIHsgY2F0NSwgUGNhdDUsIDUsIDM1fSwKLSAgICB7IGNhdDYsIFBjYXQ2LCAxMSwgNjd9LAotICAgIHsgMCwgMCwgMCwgMH0KLX07Ci0jaW5jbHVkZSAiZGVmYXVsdGNvZWZjb3VudHMuaCIKLQotdm9pZCB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKFZQOF9DT01NT04gKnBjKQotewotICAgIGludCBoID0gMDsKLQotICAgIGRvCi0gICAgewotICAgICAgICBpbnQgaSA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaW50IGsgPSAwOwotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBicmFuY2hfY3QgW3ZwOF9jb2VmX3Rva2Vucy0xXSBbMl07Ci0gICAgICAgICAgICAgICAgdnA4X3RyZWVfcHJvYnNfZnJvbV9kaXN0cmlidXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHZwOF9jb2VmX3Rva2VucywgdnA4X2NvZWZfZW5jb2RpbmdzLCB2cDhfY29lZl90cmVlLAotICAgICAgICAgICAgICAgICAgICBwYy0+ZmMuY29lZl9wcm9icyBbaF1baV1ba10sIGJyYW5jaF9jdCwgZGVmYXVsdF9jb2VmX2NvdW50cyBbaF1baV1ba10sCi0gICAgICAgICAgICAgICAgICAgIDI1NiwgMSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICgrK2sgPCBQUkVWX0NPRUZfQ09OVEVYVFMpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgrK2kgPCBDT0VGX0JBTkRTKTsKLSAgICB9Ci0gICAgd2hpbGUgKCsraCA8IEJMT0NLX1RZUEVTKTsKLX0KLQotCi12b2lkIHZwOF9jb2VmX3RyZWVfaW5pdGlhbGl6ZSgpCi17Ci0gICAgaW5pdF9iaXRfdHJlZXMoKTsKLSAgICB2cDhfdG9rZW5zX2Zyb21fdHJlZSh2cDhfY29lZl9lbmNvZGluZ3MsIHZwOF9jb2VmX3RyZWUpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9lbnRyb3B5LmggYi92cDgvY29tbW9uL2VudHJvcHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3NGU0NS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2VudHJvcHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19FTlRST1BZX0gKLSNkZWZpbmUgX19JTkNfRU5UUk9QWV9ICi0KLSNpbmNsdWRlICJ0cmVlY29kZXIuaCIKLSNpbmNsdWRlICJibG9ja2QuaCIKLQotLyogQ29lZmZpY2llbnQgdG9rZW4gYWxwaGFiZXQgKi8KLQotI2RlZmluZSBaRVJPX1RPS0VOICAgICAgICAgICAgICAwICAgICAgIC8qIDAgICAgICAgICBFeHRyYSBCaXRzIDArMCAqLwotI2RlZmluZSBPTkVfVE9LRU4gICAgICAgICAgICAgICAxICAgICAgIC8qIDEgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLwotI2RlZmluZSBUV09fVE9LRU4gICAgICAgICAgICAgICAyICAgICAgIC8qIDIgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLwotI2RlZmluZSBUSFJFRV9UT0tFTiAgICAgICAgICAgICAzICAgICAgIC8qIDMgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLwotI2RlZmluZSBGT1VSX1RPS0VOICAgICAgICAgICAgICA0ICAgICAgIC8qIDQgICAgICAgICBFeHRyYSBCaXRzIDArMSAqLwotI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZMSAgICAgICA1ICAgICAgIC8qIDUtNiAgICAgICBFeHRyYSBCaXRzIDErMSAqLwotI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZMiAgICAgICA2ICAgICAgIC8qIDctMTAgICAgICBFeHRyYSBCaXRzIDIrMSAqLwotI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZMyAgICAgICA3ICAgICAgIC8qIDExLTE4ICAgICBFeHRyYSBCaXRzIDMrMSAqLwotI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZNCAgICAgICA4ICAgICAgIC8qIDE5LTM0ICAgICBFeHRyYSBCaXRzIDQrMSAqLwotI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZNSAgICAgICA5ICAgICAgIC8qIDM1LTY2ICAgICBFeHRyYSBCaXRzIDUrMSAqLwotI2RlZmluZSBEQ1RfVkFMX0NBVEVHT1JZNiAgICAgICAxMCAgICAgIC8qIDY3KyAgICAgICBFeHRyYSBCaXRzIDExKzEgKi8KLSNkZWZpbmUgRENUX0VPQl9UT0tFTiAgICAgICAgICAgMTEgICAgICAvKiBFT0IgICAgICAgRXh0cmEgQml0cyAwKzAgKi8KLQotI2RlZmluZSB2cDhfY29lZl90b2tlbnMgMTIKLSNkZWZpbmUgTUFYX0VOVFJPUFlfVE9LRU5TIHZwOF9jb2VmX3Rva2VucwotI2RlZmluZSBFTlRST1BZX05PREVTIDExCi0KLWV4dGVybiBjb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfY29lZl90cmVlW107Ci0KLWV4dGVybiBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfY29lZl9lbmNvZGluZ3NbdnA4X2NvZWZfdG9rZW5zXTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB2cDhfdHJlZV9wIHRyZWU7Ci0gICAgY29uc3QgdnA4X3Byb2IgKnByb2I7Ci0gICAgaW50IExlbjsKLSAgICBpbnQgYmFzZV92YWw7Ci19IHZwOF9leHRyYV9iaXRfc3RydWN0OwotCi1leHRlcm4gdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgdnA4X2V4dHJhX2JpdHNbMTJdOyAgICAvKiBpbmRleGVkIGJ5IHRva2VuIHZhbHVlICovCi0KLSNkZWZpbmUgUFJPQl9VUERBVEVfQkFTRUxJTkVfQ09TVCAgIDcKLQotI2RlZmluZSBNQVhfUFJPQiAgICAgICAgICAgICAgICAyNTUKLSNkZWZpbmUgRENUX01BWF9WQUxVRSAgICAgICAgICAgMjA0OAotCi0KLS8qIENvZWZmaWNpZW50cyBhcmUgcHJlZGljdGVkIHZpYSBhIDMtZGltZW5zaW9uYWwgcHJvYmFiaWxpdHkgdGFibGUuICovCi0KLS8qIE91dHNpZGUgZGltZW5zaW9uLiAgMCA9IFkgbm8gREMsIDEgPSBZMiwgMiA9IFVWLCAzID0gWSB3aXRoIERDICovCi0KLSNkZWZpbmUgQkxPQ0tfVFlQRVMgNAotCi0vKiBNaWRkbGUgZGltZW5zaW9uIGlzIGEgY29hcnNlbmluZyBvZiB0aGUgY29lZmZpY2llbnQncwotICAgcG9zaXRpb24gd2l0aGluIHRoZSA0eDQgRENULiAqLwotCi0jZGVmaW5lIENPRUZfQkFORFMgOAotZXh0ZXJuIERFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgdW5zaWduZWQgY2hhciwgdnA4X2NvZWZfYmFuZHNbMTZdKTsKLQotLyogSW5zaWRlIGRpbWVuc2lvbiBpcyAzLXZhbHVlZCBtZWFzdXJlIG9mIG5lYXJieSBjb21wbGV4aXR5LCB0aGF0IGlzLAotICAgdGhlIGV4dGVudCB0byB3aGljaCBuZWFyYnkgY29lZmZpY2llbnRzIGFyZSBub256ZXJvLiAgRm9yIHRoZSBmaXJzdAotICAgY29lZmZpY2llbnQgKERDLCB1bmxlc3MgYmxvY2sgdHlwZSBpcyAwKSwgd2UgbG9vayBhdCB0aGUgKGFscmVhZHkgZW5jb2RlZCkKLSAgIGJsb2NrcyBhYm92ZSBhbmQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICBUaGUgY29udGV4dCBpbmRleCBpcwotICAgdGhlbiB0aGUgbnVtYmVyICgwLDEsb3IgMikgb2YgdGhlc2UgYmxvY2tzIGhhdmluZyBub256ZXJvIGNvZWZmaWNpZW50cy4KLSAgIEFmdGVyIGRlY29kaW5nIGEgY29lZmZpY2llbnQsIHRoZSBtZWFzdXJlIGlzIHJvdWdobHkgdGhlIHNpemUgb2YgdGhlCi0gICBtb3N0IHJlY2VudGx5IGRlY29kZWQgY29lZmZpY2llbnQgKDAgZm9yIDAsIDEgZm9yIDEsIDIgZm9yID4xKS4KLSAgIE5vdGUgdGhhdCB0aGUgaW50dWl0aXZlIG1lYW5pbmcgb2YgdGhpcyBtZWFzdXJlIGNoYW5nZXMgYXMgY29lZmZpY2llbnRzCi0gICBhcmUgZGVjb2RlZCwgZS5nLiwgcHJpb3IgdG8gdGhlIGZpcnN0IHRva2VuLCBhIHplcm8gbWVhbnMgdGhhdCBteSBuZWlnaGJvcnMKLSAgIGFyZSBlbXB0eSB3aGlsZSwgYWZ0ZXIgdGhlIGZpcnN0IHRva2VuLCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgZW5kLW9mLWJsb2NrLAotICAgYSB6ZXJvIG1lYW5zIHdlIGp1c3QgZGVjb2RlZCBhIHplcm8gYW5kIGhlbmNlIGd1YXJhbnRlZXMgdGhhdCBhIG5vbi16ZXJvCi0gICBjb2VmZmljaWVudCB3aWxsIGFwcGVhciBsYXRlciBpbiB0aGlzIGJsb2NrLiAgSG93ZXZlciwgdGhpcyBzaGlmdAotICAgaW4gbWVhbmluZyBpcyBwZXJmZWN0bHkgT0sgYmVjYXVzZSBvdXIgY29udGV4dCBkZXBlbmRzIGFsc28gb24gdGhlCi0gICBjb2VmZmljaWVudCBiYW5kIChhbmQgc2luY2UgemlnemFnIHBvc2l0aW9ucyAwLCAxLCBhbmQgMiBhcmUgaW4KLSAgIGRpc3RpbmN0IGJhbmRzKS4gKi8KLQotLyojIGRlZmluZSBEQ19UT0tFTl9DT05URVhUUyAgICAgICAgMyovIC8qIDAwLCAwITAsICEwITAgKi8KLSMgICBkZWZpbmUgUFJFVl9DT0VGX0NPTlRFWFRTICAgICAgIDMKLQotZXh0ZXJuIERFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgdW5zaWduZWQgY2hhciwgdnA4X3ByZXZfdG9rZW5fY2xhc3NbdnA4X2NvZWZfdG9rZW5zXSk7Ci0KLWV4dGVybiBjb25zdCB2cDhfcHJvYiB2cDhfY29lZl91cGRhdGVfcHJvYnMgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vucy0xXTsKLQotCi1zdHJ1Y3QgVlA4Q29tbW9uOwotdm9pZCB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKHN0cnVjdCBWUDhDb21tb24gKik7Ci0KLWV4dGVybiBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IGludCwgdnA4X2RlZmF1bHRfemlnX3phZzFkWzE2XSk7Ci1leHRlcm4gREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X2RlZmF1bHRfaW52X3ppZ196YWdbMTZdKTsKLWV4dGVybiBzaG9ydCB2cDhfZGVmYXVsdF96aWdfemFnX21hc2tbMTZdOwotZXh0ZXJuIGNvbnN0IGludCB2cDhfbWJfZmVhdHVyZV9kYXRhX2JpdHNbTUJfTFZMX01BWF07Ci0KLXZvaWQgdnA4X2NvZWZfdHJlZV9pbml0aWFsaXplKHZvaWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2VudHJvcHltb2RlLmMgYi92cDgvY29tbW9uL2VudHJvcHltb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZGM2NjguLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAiZW50cm9weW1vZGUuaCIKLSNpbmNsdWRlICJlbnRyb3B5LmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga2ZfeV9tb2RlX2N0c1tWUDhfWU1PREVTXSA9IHsgMTYwNywgOTE1LCA4MTIsIDgxMSwgNTQ1NX07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHlfbW9kZV9jdHMgIFtWUDhfWU1PREVTXSA9IHsgODA4MCwgMTkwOCwgMTU4MiwgMTAwNywgNTg3NH07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXZfbW9kZV9jdHMgIFtWUDhfVVZfTU9ERVNdID0geyA1OTQ4MywgMTM2MDUsIDE2NDkyLCA0MjMwfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga2ZfdXZfbW9kZV9jdHNbVlA4X1VWX01PREVTXSA9IHsgNTMxOSwgMTkwNCwgMTcwMywgNjc0fTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBibW9kZV9jdHNbVlA4X0JJTlRSQU1PREVTXSA9Ci17Ci0gICAgNDM4OTEsIDE3Njk0LCAxMDAzNiwgMzkyMCwgMzM2MywgMjU0NiwgNTExOSwgMzIyMSwgMjQ3MSwgMTcyMwotfTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgU1VCTVZSRUZfTk9STUFMLAotICAgIFNVQk1WUkVGX0xFRlRfWkVELAotICAgIFNVQk1WUkVGX0FCT1ZFX1pFRCwKLSAgICBTVUJNVlJFRl9MRUZUX0FCT1ZFX1NBTUUsCi0gICAgU1VCTVZSRUZfTEVGVF9BQk9WRV9aRUQKLX0gc3VtdmZyZWZfdDsKLQotaW50IHZwOF9tdl9jb250KGNvbnN0IE1WICpsLCBjb25zdCBNViAqYSkKLXsKLSAgICBpbnQgbGV6ID0gKGwtPnJvdyA9PSAwICYmIGwtPmNvbCA9PSAwKTsKLSAgICBpbnQgYWV6ID0gKGEtPnJvdyA9PSAwICYmIGEtPmNvbCA9PSAwKTsKLSAgICBpbnQgbGVhID0gKGwtPnJvdyA9PSBhLT5yb3cgJiYgbC0+Y29sID09IGEtPmNvbCk7Ci0KLSAgICBpZiAobGVhICYmIGxleikKLSAgICAgICAgcmV0dXJuIFNVQk1WUkVGX0xFRlRfQUJPVkVfWkVEOwotCi0gICAgaWYgKGxlYSkKLSAgICAgICAgcmV0dXJuIFNVQk1WUkVGX0xFRlRfQUJPVkVfU0FNRTsKLQotICAgIGlmIChhZXopCi0gICAgICAgIHJldHVybiBTVUJNVlJFRl9BQk9WRV9aRUQ7Ci0KLSAgICBpZiAobGV6KQotICAgICAgICByZXR1cm4gU1VCTVZSRUZfTEVGVF9aRUQ7Ci0KLSAgICByZXR1cm4gU1VCTVZSRUZfTk9STUFMOwotfQotCi1zdGF0aWMgY29uc3QgdnA4X3Byb2Igc3ViX212X3JlZl9wcm9iIFtWUDhfU1VCTVZSRUZTLTFdID0geyAxODAsIDE2MiwgMjV9OwotCi1jb25zdCB2cDhfcHJvYiB2cDhfc3ViX212X3JlZl9wcm9iMiBbU1VCTVZSRUZfQ09VTlRdW1ZQOF9TVUJNVlJFRlMtMV0gPQotewotICAgIHsgMTQ3LCAxMzYsIDE4IH0sCi0gICAgeyAxMDYsIDE0NSwgMSAgfSwKLSAgICB7IDE3OSwgMTIxLCAxICB9LAotICAgIHsgMjIzLCAxICAsIDM0IH0sCi0gICAgeyAyMDgsIDEgICwgMSAgfQotfTsKLQotCi0KLXZwOF9tYnNwbGl0IHZwOF9tYnNwbGl0cyBbVlA4X05VTU1CU1BMSVRTXSA9Ci17Ci0gICAgewotICAgICAgICAwLCAgMCwgIDAsICAwLAotICAgICAgICAwLCAgMCwgIDAsICAwLAotICAgICAgICAxLCAgMSwgIDEsICAxLAotICAgICAgICAxLCAgMSwgIDEsICAxLAotICAgIH0sCi0gICAgewotICAgICAgICAwLCAgMCwgIDEsICAxLAotICAgICAgICAwLCAgMCwgIDEsICAxLAotICAgICAgICAwLCAgMCwgIDEsICAxLAotICAgICAgICAwLCAgMCwgIDEsICAxLAotICAgIH0sCi0gICAgewotICAgICAgICAwLCAgMCwgIDEsICAxLAotICAgICAgICAwLCAgMCwgIDEsICAxLAotICAgICAgICAyLCAgMiwgIDMsICAzLAotICAgICAgICAyLCAgMiwgIDMsICAzLAotICAgIH0sCi0gICAgewotICAgICAgICAwLCAgMSwgIDIsICAzLAotICAgICAgICA0LCAgNSwgIDYsICA3LAotICAgICAgICA4LCAgOSwgIDEwLCAxMSwKLSAgICAgICAgMTIsIDEzLCAxNCwgMTUsCi0gICAgfSwKLX07Ci0KLWNvbnN0IGludCB2cDhfbWJzcGxpdF9jb3VudCBbVlA4X05VTU1CU1BMSVRTXSA9IHsgMiwgMiwgNCwgMTZ9OwotCi1jb25zdCB2cDhfcHJvYiB2cDhfbWJzcGxpdF9wcm9icyBbVlA4X05VTU1CU1BMSVRTLTFdID0geyAxMTAsIDExMSwgMTUwfTsKLQotCi0vKiBBcnJheSBpbmRpY2VzIGFyZSBpZGVudGljYWwgdG8gcHJldmlvdXNseS1leGlzdGluZyBJTlRSQU1PREVDT05URVhUTk9ERVMuICovCi0KLWNvbnN0IHZwOF90cmVlX2luZGV4IHZwOF9ibW9kZV90cmVlWzE4XSA9ICAgICAvKiBJTlRSQU1PREVDT05URVhUTk9ERSB2YWx1ZSAqLwotewotICAgIC1CX0RDX1BSRUQsIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwID0gRENfTk9ERSAqLwotICAgIC1CX1RNX1BSRUQsIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgPSBUTV9OT0RFICovCi0gICAgLUJfVkVfUFJFRCwgNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyID0gVkVfTk9ERSAqLwotICAgIDgsIDEyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzID0gQ09NX05PREUgKi8KLSAgICAtQl9IRV9QUkVELCAxMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiA0ID0gSEVfTk9ERSAqLwotICAgIC1CX1JEX1BSRUQsIC1CX1ZSX1BSRUQsICAgICAgICAgICAgICAgLyogNSA9IFJEX05PREUgKi8KLSAgICAtQl9MRF9QUkVELCAxNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ID0gTERfTk9ERSAqLwotICAgIC1CX1ZMX1BSRUQsIDE2LCAgICAgICAgICAgICAgICAgICAgICAvKiA3ID0gVkxfTk9ERSAqLwotICAgIC1CX0hEX1BSRUQsIC1CX0hVX1BSRUQgICAgICAgICAgICAgLyogOCA9IEhEX05PREUgKi8KLX07Ci0KLS8qIEFnYWluLCB0aGVzZSB0cmVlcyB1c2UgdGhlIHNhbWUgcHJvYmFiaWxpdHkgaW5kaWNlcyBhcyB0aGVpcgotICAgZXhwbGljaXRseS1wcm9ncmFtbWVkIHByZWRlY2Vzc29ycy4gKi8KLQotY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X3ltb2RlX3RyZWVbOF0gPQotewotICAgIC1EQ19QUkVELCAyLAotICAgIDQsIDYsCi0gICAgLVZfUFJFRCwgLUhfUFJFRCwKLSAgICAtVE1fUFJFRCwgLUJfUFJFRAotfTsKLQotY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X2tmX3ltb2RlX3RyZWVbOF0gPQotewotICAgIC1CX1BSRUQsIDIsCi0gICAgNCwgNiwKLSAgICAtRENfUFJFRCwgLVZfUFJFRCwKLSAgICAtSF9QUkVELCAtVE1fUFJFRAotfTsKLQotY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X3V2X21vZGVfdHJlZVs2XSA9Ci17Ci0gICAgLURDX1BSRUQsIDIsCi0gICAgLVZfUFJFRCwgNCwKLSAgICAtSF9QUkVELCAtVE1fUFJFRAotfTsKLQotY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X21ic3BsaXRfdHJlZVs2XSA9Ci17Ci0gICAgLTMsIDIsCi0gICAgLTIsIDQsCi0gICAgLTAsIC0xCi19OwotCi1jb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfbXZfcmVmX3RyZWVbOF0gPQotewotICAgIC1aRVJPTVYsIDIsCi0gICAgLU5FQVJFU1RNViwgNCwKLSAgICAtTkVBUk1WLCA2LAotICAgIC1ORVdNViwgLVNQTElUTVYKLX07Ci0KLWNvbnN0IHZwOF90cmVlX2luZGV4IHZwOF9zdWJfbXZfcmVmX3RyZWVbNl0gPQotewotICAgIC1MRUZUNFg0LCAyLAotICAgIC1BQk9WRTRYNCwgNCwKLSAgICAtWkVSTzRYNCwgLU5FVzRYNAotfTsKLQotCi1zdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfYm1vZGVfZW5jb2RpbmdzICAgW1ZQOF9CSU5UUkFNT0RFU107Ci1zdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfeW1vZGVfZW5jb2RpbmdzICAgW1ZQOF9ZTU9ERVNdOwotc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X2tmX3ltb2RlX2VuY29kaW5ncyBbVlA4X1lNT0RFU107Ci1zdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfdXZfbW9kZV9lbmNvZGluZ3MgIFtWUDhfVVZfTU9ERVNdOwotc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X21ic3BsaXRfZW5jb2RpbmdzIFtWUDhfTlVNTUJTUExJVFNdOwotCi1zdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfbXZfcmVmX2VuY29kaW5nX2FycmF5ICAgIFtWUDhfTVZSRUZTXTsKLXN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF9zdWJfbXZfcmVmX2VuY29kaW5nX2FycmF5IFtWUDhfU1VCTVZSRUZTXTsKLQotCi1jb25zdCB2cDhfdHJlZV9pbmRleCB2cDhfc21hbGxfbXZ0cmVlIFsxNF0gPQotewotICAgIDIsIDgsCi0gICAgNCwgNiwKLSAgICAtMCwgLTEsCi0gICAgLTIsIC0zLAotICAgIDEwLCAxMiwKLSAgICAtNCwgLTUsCi0gICAgLTYsIC03Ci19OwotCi1zdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfc21hbGxfbXZlbmNvZGluZ3MgWzhdOwotCi12b2lkIHZwOF9pbml0X21ibW9kZV9wcm9icyhWUDhfQ09NTU9OICp4KQotewotICAgIHVuc2lnbmVkIGludCBiY3QgW1ZQOF9ZTU9ERVNdIFsyXTsgICAgICAvKiBudW0gWW1vZGVzID4gbnVtIFVWIG1vZGVzICovCi0KLSAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKLSAgICAgICAgVlA4X1lNT0RFUywgdnA4X3ltb2RlX2VuY29kaW5ncywgdnA4X3ltb2RlX3RyZWUsCi0gICAgICAgIHgtPmZjLnltb2RlX3Byb2IsIGJjdCwgeV9tb2RlX2N0cywKLSAgICAgICAgMjU2LCAxCi0gICAgKTsKLSAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKLSAgICAgICAgVlA4X1lNT0RFUywgdnA4X2tmX3ltb2RlX2VuY29kaW5ncywgdnA4X2tmX3ltb2RlX3RyZWUsCi0gICAgICAgIHgtPmtmX3ltb2RlX3Byb2IsIGJjdCwga2ZfeV9tb2RlX2N0cywKLSAgICAgICAgMjU2LCAxCi0gICAgKTsKLSAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKLSAgICAgICAgVlA4X1VWX01PREVTLCB2cDhfdXZfbW9kZV9lbmNvZGluZ3MsIHZwOF91dl9tb2RlX3RyZWUsCi0gICAgICAgIHgtPmZjLnV2X21vZGVfcHJvYiwgYmN0LCB1dl9tb2RlX2N0cywKLSAgICAgICAgMjU2LCAxCi0gICAgKTsKLSAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKLSAgICAgICAgVlA4X1VWX01PREVTLCB2cDhfdXZfbW9kZV9lbmNvZGluZ3MsIHZwOF91dl9tb2RlX3RyZWUsCi0gICAgICAgIHgtPmtmX3V2X21vZGVfcHJvYiwgYmN0LCBrZl91dl9tb2RlX2N0cywKLSAgICAgICAgMjU2LCAxCi0gICAgKTsKLSAgICB2cHhfbWVtY3B5KHgtPmZjLnN1Yl9tdl9yZWZfcHJvYiwgc3ViX212X3JlZl9wcm9iLCBzaXplb2Yoc3ViX212X3JlZl9wcm9iKSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgaW50cmFfYm1vZGVfcHJvYnNfZnJvbV9kaXN0cmlidXRpb24oCi0gICAgdnA4X3Byb2IgcCBbVlA4X0JJTlRSQU1PREVTLTFdLAotICAgIHVuc2lnbmVkIGludCBicmFuY2hfY3QgW1ZQOF9CSU5UUkFNT0RFUy0xXSBbMl0sCi0gICAgY29uc3QgdW5zaWduZWQgaW50IGV2ZW50cyBbVlA4X0JJTlRSQU1PREVTXQotKQotewotICAgIHZwOF90cmVlX3Byb2JzX2Zyb21fZGlzdHJpYnV0aW9uKAotICAgICAgICBWUDhfQklOVFJBTU9ERVMsIHZwOF9ibW9kZV9lbmNvZGluZ3MsIHZwOF9ibW9kZV90cmVlLAotICAgICAgICBwLCBicmFuY2hfY3QsIGV2ZW50cywKLSAgICAgICAgMjU2LCAxCi0gICAgKTsKLX0KLQotdm9pZCB2cDhfZGVmYXVsdF9ibW9kZV9wcm9icyh2cDhfcHJvYiBwIFtWUDhfQklOVFJBTU9ERVMtMV0pCi17Ci0gICAgdW5zaWduZWQgaW50IGJyYW5jaF9jdCBbVlA4X0JJTlRSQU1PREVTLTFdIFsyXTsKLSAgICBpbnRyYV9ibW9kZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbihwLCBicmFuY2hfY3QsIGJtb2RlX2N0cyk7Ci19Ci0KLXZvaWQgdnA4X2tmX2RlZmF1bHRfYm1vZGVfcHJvYnModnA4X3Byb2IgcCBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTLTFdKQotewotICAgIHVuc2lnbmVkIGludCBicmFuY2hfY3QgW1ZQOF9CSU5UUkFNT0RFUy0xXSBbMl07Ci0KLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgaW50IGogPSAwOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludHJhX2Jtb2RlX3Byb2JzX2Zyb21fZGlzdHJpYnV0aW9uKAotICAgICAgICAgICAgICAgIHBbaV1bal0sIGJyYW5jaF9jdCwgdnA4X2tmX2RlZmF1bHRfYm1vZGVfY291bnRzW2ldW2pdKTsKLQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgrK2ogPCBWUDhfQklOVFJBTU9ERVMpOwotICAgIH0KLSAgICB3aGlsZSAoKytpIDwgVlA4X0JJTlRSQU1PREVTKTsKLX0KLQotCi12b2lkIHZwOF9lbnRyb3B5X21vZGVfaW5pdCgpCi17Ci0gICAgdnA4X3Rva2Vuc19mcm9tX3RyZWUodnA4X2Jtb2RlX2VuY29kaW5ncywgICB2cDhfYm1vZGVfdHJlZSk7Ci0gICAgdnA4X3Rva2Vuc19mcm9tX3RyZWUodnA4X3ltb2RlX2VuY29kaW5ncywgICB2cDhfeW1vZGVfdHJlZSk7Ci0gICAgdnA4X3Rva2Vuc19mcm9tX3RyZWUodnA4X2tmX3ltb2RlX2VuY29kaW5ncywgdnA4X2tmX3ltb2RlX3RyZWUpOwotICAgIHZwOF90b2tlbnNfZnJvbV90cmVlKHZwOF91dl9tb2RlX2VuY29kaW5ncywgIHZwOF91dl9tb2RlX3RyZWUpOwotICAgIHZwOF90b2tlbnNfZnJvbV90cmVlKHZwOF9tYnNwbGl0X2VuY29kaW5ncywgdnA4X21ic3BsaXRfdHJlZSk7Ci0KLSAgICB2cDhfdG9rZW5zX2Zyb21fdHJlZV9vZmZzZXQodnA4X212X3JlZl9lbmNvZGluZ19hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X212X3JlZl90cmVlLCBORUFSRVNUTVYpOwotICAgIHZwOF90b2tlbnNfZnJvbV90cmVlX29mZnNldCh2cDhfc3ViX212X3JlZl9lbmNvZGluZ19hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3N1Yl9tdl9yZWZfdHJlZSwgTEVGVDRYNCk7Ci0KLSAgICB2cDhfdG9rZW5zX2Zyb21fdHJlZSh2cDhfc21hbGxfbXZlbmNvZGluZ3MsIHZwOF9zbWFsbF9tdnRyZWUpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oIGIvdnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZhZThlLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vZW50cm9weW1vZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0VOVFJPUFlNT0RFX0gKLSNkZWZpbmUgX19JTkNfRU5UUk9QWU1PREVfSAotCi0jaW5jbHVkZSAib255eGNfaW50LmgiCi0jaW5jbHVkZSAidHJlZWNvZGVyLmgiCi0KLXR5cGVkZWYgY29uc3QgaW50IHZwOF9tYnNwbGl0WzE2XTsKLQotI2RlZmluZSBWUDhfTlVNTUJTUExJVFMgNAotCi1leHRlcm4gdnA4X21ic3BsaXQgdnA4X21ic3BsaXRzIFtWUDhfTlVNTUJTUExJVFNdOwotCi1leHRlcm4gY29uc3QgaW50IHZwOF9tYnNwbGl0X2NvdW50IFtWUDhfTlVNTUJTUExJVFNdOyAgICAvKiAjIG9mIHN1YnNldHMgKi8KLQotZXh0ZXJuIGNvbnN0IHZwOF9wcm9iIHZwOF9tYnNwbGl0X3Byb2JzIFtWUDhfTlVNTUJTUExJVFMtMV07Ci0KLWV4dGVybiBpbnQgdnA4X212X2NvbnQoY29uc3QgTVYgKmwsIGNvbnN0IE1WICphKTsKLSNkZWZpbmUgU1VCTVZSRUZfQ09VTlQgNQotZXh0ZXJuIGNvbnN0IHZwOF9wcm9iIHZwOF9zdWJfbXZfcmVmX3Byb2IyIFtTVUJNVlJFRl9DT1VOVF1bVlA4X1NVQk1WUkVGUy0xXTsKLQotCi1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IHZwOF9rZl9kZWZhdWx0X2Jtb2RlX2NvdW50cyBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXTsKLQotCi1leHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X2Jtb2RlX3RyZWVbXTsKLQotZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4ICB2cDhfeW1vZGVfdHJlZVtdOwotZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4ICB2cDhfa2ZfeW1vZGVfdHJlZVtdOwotZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4ICB2cDhfdXZfbW9kZV90cmVlW107Ci0KLWV4dGVybiBjb25zdCB2cDhfdHJlZV9pbmRleCAgdnA4X21ic3BsaXRfdHJlZVtdOwotZXh0ZXJuIGNvbnN0IHZwOF90cmVlX2luZGV4ICB2cDhfbXZfcmVmX3RyZWVbXTsKLWV4dGVybiBjb25zdCB2cDhfdHJlZV9pbmRleCAgdnA4X3N1Yl9tdl9yZWZfdHJlZVtdOwotCi1leHRlcm4gc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X2Jtb2RlX2VuY29kaW5ncyAgIFtWUDhfQklOVFJBTU9ERVNdOwotZXh0ZXJuIHN0cnVjdCB2cDhfdG9rZW5fc3RydWN0IHZwOF95bW9kZV9lbmNvZGluZ3MgICBbVlA4X1lNT0RFU107Ci1leHRlcm4gc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X2tmX3ltb2RlX2VuY29kaW5ncyBbVlA4X1lNT0RFU107Ci1leHRlcm4gc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X3V2X21vZGVfZW5jb2RpbmdzICBbVlA4X1VWX01PREVTXTsKLWV4dGVybiBzdHJ1Y3QgdnA4X3Rva2VuX3N0cnVjdCB2cDhfbWJzcGxpdF9lbmNvZGluZ3MgIFtWUDhfTlVNTUJTUExJVFNdOwotCi0vKiBJbnRlciBtb2RlIHZhbHVlcyBkbyBub3Qgc3RhcnQgYXQgemVybyAqLwotCi1leHRlcm4gc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X212X3JlZl9lbmNvZGluZ19hcnJheSAgICBbVlA4X01WUkVGU107Ci1leHRlcm4gc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X3N1Yl9tdl9yZWZfZW5jb2RpbmdfYXJyYXkgW1ZQOF9TVUJNVlJFRlNdOwotCi1leHRlcm4gY29uc3QgdnA4X3RyZWVfaW5kZXggdnA4X3NtYWxsX212dHJlZVtdOwotCi1leHRlcm4gc3RydWN0IHZwOF90b2tlbl9zdHJ1Y3QgdnA4X3NtYWxsX212ZW5jb2RpbmdzIFs4XTsKLQotdm9pZCB2cDhfZW50cm9weV9tb2RlX2luaXQodm9pZCk7Ci0KLXZvaWQgdnA4X2luaXRfbWJtb2RlX3Byb2JzKFZQOF9DT01NT04gKngpOwotCi12b2lkICAgdnA4X2RlZmF1bHRfYm1vZGVfcHJvYnModnA4X3Byb2IgZGVzdCBbVlA4X0JJTlRSQU1PREVTLTFdKTsKLXZvaWQgdnA4X2tmX2RlZmF1bHRfYm1vZGVfcHJvYnModnA4X3Byb2IgZGVzdCBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTLTFdKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2VudHJvcHltdi5oIGIvdnA4L2NvbW1vbi9lbnRyb3B5bXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExNTA3ZC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2VudHJvcHltdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfRU5UUk9QWU1WX0gKLSNkZWZpbmUgX19JTkNfRU5UUk9QWU1WX0gKLQotI2luY2x1ZGUgInRyZWVjb2Rlci5oIgotCi1lbnVtCi17Ci0gICAgbXZfbWF4ICA9IDEwMjMsICAgICAgICAgICAgICAvKiBtYXggYWJzb2x1dGUgdmFsdWUgb2YgYSBNViBjb21wb25lbnQgKi8KLSAgICBNVnZhbHMgPSAoMiAqIG12X21heCkgKyAxLCAgIC8qICMgcG9zc2libGUgdmFsdWVzICIiICovCi0KLSAgICBtdmxvbmdfd2lkdGggPSAxMCwgICAgICAgLyogTGFyZ2UgTVZzIGhhdmUgOSBiaXQgbWFnbml0dWRlcyAqLwotICAgIG12bnVtX3Nob3J0ID0gOCwgICAgICAgICAvKiBtYWduaXR1ZGVzIDAgdGhyb3VnaCA3ICovCi0KLSAgICAvKiBwcm9iYWJpbGl0eSBvZmZzZXRzIGZvciBjb2RpbmcgZWFjaCBNViBjb21wb25lbnQgKi8KLQotICAgIG12cGlzX3Nob3J0ID0gMCwgICAgICAgICAvKiBzaG9ydCAoPD0gNykgdnMgbG9uZyAoPj0gOCkgKi8KLSAgICBNVlBzaWduLCAgICAgICAgICAgICAgICAvKiBzaWduIGZvciBub24temVybyAqLwotICAgIE1WUHNob3J0LCAgICAgICAgICAgICAgIC8qIDggc2hvcnQgdmFsdWVzID0gNy1wb3NpdGlvbiB0cmVlICovCi0KLSAgICBNVlBiaXRzID0gTVZQc2hvcnQgKyBtdm51bV9zaG9ydCAtIDEsIC8qIG12bG9uZ193aWR0aCBsb25nIHZhbHVlIGJpdHMgKi8KLSAgICBNVlBjb3VudCA9IE1WUGJpdHMgKyBtdmxvbmdfd2lkdGggICAgLyogKHdpdGggaW5kZXBlbmRlbnQgcHJvYmFiaWxpdGllcykgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IG12X2NvbnRleHQKLXsKLSAgICB2cDhfcHJvYiBwcm9iW01WUGNvdW50XTsgIC8qIG9mdGVuIGNvbWUgaW4gcm93LCBjb2wgcGFpcnMgKi8KLX0gTVZfQ09OVEVYVDsKLQotZXh0ZXJuIGNvbnN0IE1WX0NPTlRFWFQgdnA4X212X3VwZGF0ZV9wcm9ic1syXSwgdnA4X2RlZmF1bHRfbXZfY29udGV4dFsyXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2V4dGVuZC5jIGIvdnA4L2NvbW1vbi9leHRlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyMDdmYS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2V4dGVuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAiZXh0ZW5kLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0KLQotc3RhdGljIHZvaWQgZXh0ZW5kX3BsYW5lX2JvcmRlcnMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzLCAvKiBzb3VyY2UgKi8KLSAgICBpbnQgc3AsICAgICAgICAgICAvKiBwaXRjaCAqLwotICAgIGludCBoLCAgICAgICAgICAgIC8qIGhlaWdodCAqLwotICAgIGludCB3LCAgICAgICAgICAgIC8qIHdpZHRoICovCi0gICAgaW50IGV0LCAgICAgICAgICAgLyogZXh0ZW5kIHRvcCBib3JkZXIgKi8KLSAgICBpbnQgZWwsICAgICAgICAgICAvKiBleHRlbmQgbGVmdCBib3JkZXIgKi8KLSAgICBpbnQgZWIsICAgICAgICAgICAvKiBleHRlbmQgYm90dG9tIGJvcmRlciAqLwotICAgIGludCBlciAgICAgICAgICAgIC8qIGV4dGVuZCByaWdodCBib3JkZXIgKi8KLSkKLXsKLQotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIxLCAqc3JjX3B0cjI7Ci0gICAgdW5zaWduZWQgY2hhciAqZGVzdF9wdHIxLCAqZGVzdF9wdHIyOwotICAgIGludCBsaW5lc2l6ZTsKLQotICAgIC8qIGNvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vc3QgY29sdW1ucyBvdXQgKi8KLSAgICBzcmNfcHRyMSA9IHM7Ci0gICAgc3JjX3B0cjIgPSBzICsgdyAtIDE7Ci0gICAgZGVzdF9wdHIxID0gcyAtIGVsOwotICAgIGRlc3RfcHRyMiA9IHMgKyB3OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGggLSAwICsgMTsgaSsrKQotICAgIHsKLSAgICAgICAgLyogU29tZSBsaW5rZXJzIHdpbGwgY29tcGxhaW4gaWYgd2UgY2FsbCB2cHhfbWVtc2V0IHdpdGggZWwgc2V0IHRvIGEKLSAgICAgICAgICogY29uc3RhbnQgMC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChlbCkKLSAgICAgICAgICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgZWwpOwotICAgICAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMiwgc3JjX3B0cjJbMF0sIGVyKTsKLSAgICAgICAgc3JjX3B0cjEgICs9IHNwOwotICAgICAgICBzcmNfcHRyMiAgKz0gc3A7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBzcDsKLSAgICAgICAgZGVzdF9wdHIyICs9IHNwOwotICAgIH0KLQotICAgIC8qIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycyAqLwotICAgIHNyY19wdHIxID0gcyAtIGVsOwotICAgIHNyY19wdHIyID0gcyArIHNwICogKGggLSAxKSAtIGVsOwotICAgIGRlc3RfcHRyMSA9IHMgKyBzcCAqICgtZXQpIC0gZWw7Ci0gICAgZGVzdF9wdHIyID0gcyArIHNwICogKGgpIC0gZWw7Ci0gICAgbGluZXNpemUgPSBlbCArIGVyICsgdyArIDE7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKGludClldDsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjEsIHNyY19wdHIxLCBsaW5lc2l6ZSk7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBzcDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKGludCllYjsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBsaW5lc2l6ZSk7Ci0gICAgICAgIGRlc3RfcHRyMiArPSBzcDsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfZXh0ZW5kX3RvX211bHRpcGxlX29mMTYoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBpbnQgZXIgPSAweGYgJiAoMTYgLSAod2lkdGggJiAweGYpKTsKLSAgICBpbnQgZWIgPSAweGYgJiAoMTYgLSAoaGVpZ2h0ICYgMHhmKSk7Ci0KLSAgICAvKiBjaGVjayBmb3Igbm9uIG11bHRpcGxlcyBvZiAxNiAqLwotICAgIGlmIChlciAhPSAwIHx8IGViICE9IDApCi0gICAgewotICAgICAgICBleHRlbmRfcGxhbmVfYm9yZGVycyh5YmYtPnlfYnVmZmVyLCB5YmYtPnlfc3RyaWRlLCBoZWlnaHQsIHdpZHRoLCAwLCAwLCBlYiwgZXIpOwotCi0gICAgICAgIC8qIGFkanVzdCBmb3IgdXYgKi8KLSAgICAgICAgaGVpZ2h0ID0gKGhlaWdodCArIDEpID4+IDE7Ci0gICAgICAgIHdpZHRoICA9ICh3aWR0aCAgKyAxKSA+PiAxOwotICAgICAgICBlciA9IDB4NyAmICg4IC0gKHdpZHRoICAmIDB4NykpOwotICAgICAgICBlYiA9IDB4NyAmICg4IC0gKGhlaWdodCAmIDB4NykpOwotCi0gICAgICAgIGlmIChlciB8fCBlYikKLSAgICAgICAgewotICAgICAgICAgICAgZXh0ZW5kX3BsYW5lX2JvcmRlcnMoeWJmLT51X2J1ZmZlciwgeWJmLT51dl9zdHJpZGUsIGhlaWdodCwgd2lkdGgsIDAsIDAsIGViLCBlcik7Ci0gICAgICAgICAgICBleHRlbmRfcGxhbmVfYm9yZGVycyh5YmYtPnZfYnVmZmVyLCB5YmYtPnV2X3N0cmlkZSwgaGVpZ2h0LCB3aWR0aCwgMCwgMCwgZWIsIGVyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogbm90ZSB0aGUgZXh0ZW5zaW9uIGlzIG9ubHkgZm9yIHRoZSBsYXN0IHJvdywgZm9yIGludHJhIHByZWRpY3Rpb24gcHVycG9zZSAqLwotdm9pZCB2cDhfZXh0ZW5kX21iX3JvdyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZiwgdW5zaWduZWQgY2hhciAqWVB0ciwgdW5zaWduZWQgY2hhciAqVVB0ciwgdW5zaWduZWQgY2hhciAqVlB0cikKLXsKLSAgICBpbnQgaTsKLQotICAgIFlQdHIgKz0geWJmLT55X3N0cmlkZSAqIDE0OwotICAgIFVQdHIgKz0geWJmLT51dl9zdHJpZGUgKiA2OwotICAgIFZQdHIgKz0geWJmLT51dl9zdHJpZGUgKiA2OwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIFlQdHJbaV0gPSBZUHRyWy0xXTsKLSAgICAgICAgVVB0cltpXSA9IFVQdHJbLTFdOwotICAgICAgICBWUHRyW2ldID0gVlB0clstMV07Ci0gICAgfQotCi0gICAgWVB0ciArPSB5YmYtPnlfc3RyaWRlOwotICAgIFVQdHIgKz0geWJmLT51dl9zdHJpZGU7Ci0gICAgVlB0ciArPSB5YmYtPnV2X3N0cmlkZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBZUHRyW2ldID0gWVB0clstMV07Ci0gICAgICAgIFVQdHJbaV0gPSBVUHRyWy0xXTsKLSAgICAgICAgVlB0cltpXSA9IFZQdHJbLTFdOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vZXh0ZW5kLmggYi92cDgvY29tbW9uL2V4dGVuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBhNjA4Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vZXh0ZW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19FWFRFTkRfSAotI2RlZmluZSBfX0lOQ19FWFRFTkRfSAotCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKLQotdm9pZCBFeHRlbmQoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOwotdm9pZCB2cDhfZXh0ZW5kX21iX3JvdyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZiwgdW5zaWduZWQgY2hhciAqWVB0ciwgdW5zaWduZWQgY2hhciAqVVB0ciwgdW5zaWduZWQgY2hhciAqVlB0cik7Ci12b2lkIHZwOF9leHRlbmRfdG9fbXVsdGlwbGVfb2YxNihZVjEyX0JVRkZFUl9DT05GSUcgKnliZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2ZpbHRlci5jIGIvdnA4L2NvbW1vbi9maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1OTUyOS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2ZpbHRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiZmlsdGVyLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgotCi1ERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHNob3J0LCB2cDhfYmlsaW5lYXJfZmlsdGVyc1s4XVsyXSkgPQotewotICAgIHsgMTI4LCAgIDAgfSwKLSAgICB7IDExMiwgIDE2IH0sCi0gICAgeyAgOTYsICAzMiB9LAotICAgIHsgIDgwLCAgNDggfSwKLSAgICB7ICA2NCwgIDY0IH0sCi0gICAgeyAgNDgsICA4MCB9LAotICAgIHsgIDMyLCAgOTYgfSwKLSAgICB7ICAxNiwgMTEyIH0KLX07Ci0KLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3Qgc2hvcnQsIHZwOF9zdWJfcGVsX2ZpbHRlcnNbOF1bNl0pID0KLXsKLQotICAgIHsgMCwgIDAsICAxMjgsICAgIDAsICAgMCwgIDAgfSwgICAgICAgICAvKiBub3RlIHRoYXQgMS84IHBlbCBwb3NpdGlvbnMgYXJlIGp1c3QgYXMgcGVyIGFscGhhIC0wLjUgYmljdWJpYyAqLwotICAgIHsgMCwgLTYsICAxMjMsICAgMTIsICAtMSwgIDAgfSwKLSAgICB7IDIsIC0xMSwgMTA4LCAgIDM2LCAgLTgsICAxIH0sICAgICAgICAgLyogTmV3IDEvNCBwZWwgNiB0YXAgZmlsdGVyICovCi0gICAgeyAwLCAtOSwgICA5MywgICA1MCwgIC02LCAgMCB9LAotICAgIHsgMywgLTE2LCAgNzcsICAgNzcsIC0xNiwgIDMgfSwgICAgICAgICAvKiBOZXcgMS8yIHBlbCA2IHRhcCBmaWx0ZXIgKi8KLSAgICB7IDAsIC02LCAgIDUwLCAgIDkzLCAgLTksICAwIH0sCi0gICAgeyAxLCAtOCwgICAzNiwgIDEwOCwgLTExLCAgMiB9LCAgICAgICAgIC8qIE5ldyAxLzQgcGVsIDYgdGFwIGZpbHRlciAqLwotICAgIHsgMCwgLTEsICAgMTIsICAxMjMsICAtNiwgIDAgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAqb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCi0pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7Ci0gICAgaW50ICBUZW1wOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG91dHB1dF9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRfd2lkdGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgVGVtcCA9ICgoaW50KXNyY19wdHJbLTIgKiAoaW50KXBpeGVsX3N0ZXBdICogdnA4X2ZpbHRlclswXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbLTEgKiAoaW50KXBpeGVsX3N0ZXBdICogdnA4X2ZpbHRlclsxXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbMF0gICAgICAgICAgICAgICAgICogdnA4X2ZpbHRlclsyXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbcGl4ZWxfc3RlcF0gICAgICAgICAqIHZwOF9maWx0ZXJbM10pICsKLSAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyWzIqcGl4ZWxfc3RlcF0gICAgICAgKiB2cDhfZmlsdGVyWzRdKSArCi0gICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clszKnBpeGVsX3N0ZXBdICAgICAgICogdnA4X2ZpbHRlcls1XSkgKwotICAgICAgICAgICAgICAgICAgIChWUDhfRklMVEVSX1dFSUdIVCA+PiAxKTsgICAgICAvKiBSb3VuZGluZyAqLwotCi0gICAgICAgICAgICAvKiBOb3JtYWxpemUgYmFjayB0byAwLTI1NSAqLwotICAgICAgICAgICAgVGVtcCA9IFRlbXAgPj4gVlA4X0ZJTFRFUl9TSElGVDsKLQotICAgICAgICAgICAgaWYgKFRlbXAgPCAwKQotICAgICAgICAgICAgICAgIFRlbXAgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA+IDI1NSkKLSAgICAgICAgICAgICAgICBUZW1wID0gMjU1OwotCi0gICAgICAgICAgICBvdXRwdXRfcHRyW2pdID0gVGVtcDsKLSAgICAgICAgICAgIHNyY19wdHIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5leHQgcm93Li4uICovCi0gICAgICAgIHNyY19wdHIgICAgKz0gc3JjX3BpeGVsc19wZXJfbGluZSAtIG91dHB1dF93aWR0aDsKLSAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfd2lkdGg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBmaWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzcwotKAotICAgIGludCAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAotICAgIGludCBvdXRwdXRfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKLSAgICBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgotKQotewotICAgIHVuc2lnbmVkIGludCBpLCBqOwotICAgIGludCAgVGVtcDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXRfaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0X3dpZHRoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFwcGx5IGZpbHRlciAqLwotICAgICAgICAgICAgVGVtcCA9ICgoaW50KXNyY19wdHJbLTIgKiAoaW50KXBpeGVsX3N0ZXBdICogdnA4X2ZpbHRlclswXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbLTEgKiAoaW50KXBpeGVsX3N0ZXBdICogdnA4X2ZpbHRlclsxXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbMF0gICAgICAgICAgICAgICAgICogdnA4X2ZpbHRlclsyXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbcGl4ZWxfc3RlcF0gICAgICAgICAqIHZwOF9maWx0ZXJbM10pICsKLSAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyWzIqcGl4ZWxfc3RlcF0gICAgICAgKiB2cDhfZmlsdGVyWzRdKSArCi0gICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clszKnBpeGVsX3N0ZXBdICAgICAgICogdnA4X2ZpbHRlcls1XSkgKwotICAgICAgICAgICAgICAgICAgIChWUDhfRklMVEVSX1dFSUdIVCA+PiAxKTsgICAvKiBSb3VuZGluZyAqLwotCi0gICAgICAgICAgICAvKiBOb3JtYWxpemUgYmFjayB0byAwLTI1NSAqLwotICAgICAgICAgICAgVGVtcCA9IFRlbXAgPj4gVlA4X0ZJTFRFUl9TSElGVDsKLQotICAgICAgICAgICAgaWYgKFRlbXAgPCAwKQotICAgICAgICAgICAgICAgIFRlbXAgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA+IDI1NSkKLSAgICAgICAgICAgICAgICBUZW1wID0gMjU1OwotCi0gICAgICAgICAgICBvdXRwdXRfcHRyW2pdID0gKHVuc2lnbmVkIGNoYXIpVGVtcDsKLSAgICAgICAgICAgIHNyY19wdHIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFN0YXJ0IG5leHQgcm93ICovCi0gICAgICAgIHNyY19wdHIgICAgKz0gc3JjX3BpeGVsc19wZXJfbGluZSAtIG91dHB1dF93aWR0aDsKLSAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGZpbHRlcl9ibG9jazJkCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50IG91dHB1dF9waXRjaCwKLSAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXIsCi0gICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyCi0pCi17Ci0gICAgaW50IEZEYXRhWzkqNF07IC8qIFRlbXAgZGF0YSBidWZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLQotICAgIC8qIEZpcnN0IGZpbHRlciAxLUQgaG9yaXpvbnRhbGx5Li4uICovCi0gICAgZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDksIDQsIEhGaWx0ZXIpOwotCi0gICAgLyogdGhlbiBmaWx0ZXIgdmVydGljYWx5Li4uICovCi0gICAgZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3MoRkRhdGEgKyA4LCBvdXRwdXRfcHRyLCBvdXRwdXRfcGl0Y2gsIDQsIDQsIDQsIDQsIFZGaWx0ZXIpOwotfQotCi0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0X2MKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgICpIRmlsdGVyOwotICAgIGNvbnN0IHNob3J0ICAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3hvZmZzZXRdOyAgIC8qIDYgdGFwICovCi0gICAgVkZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeW9mZnNldF07ICAgLyogNiB0YXAgKi8KLQotICAgIGZpbHRlcl9ibG9jazJkKHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlcik7Ci19Ci12b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgIGRzdF9waXRjaAotKQotewotICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlcjsKLSAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXI7Ci0gICAgaW50IEZEYXRhWzEzKjE2XTsgICAvKiBUZW1wIGRhdGEgYnVmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCi0KLSAgICBIRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t4b2Zmc2V0XTsgICAvKiA2IHRhcCAqLwotICAgIFZGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3lvZmZzZXRdOyAgIC8qIDYgdGFwICovCi0KLSAgICAvKiBGaXJzdCBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLwotICAgIGZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Moc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAxMywgOCwgSEZpbHRlcik7Ci0KLQotICAgIC8qIHRoZW4gZmlsdGVyIHZlcnRpY2FseS4uLiAqLwotICAgIGZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzKEZEYXRhICsgMTYsIGRzdF9wdHIsIGRzdF9waXRjaCwgOCwgOCwgOCwgOCwgVkZpbHRlcik7Ci0KLX0KLQotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50ICBkc3RfcGl0Y2gKLSkKLXsKLSAgICBjb25zdCBzaG9ydCAgKkhGaWx0ZXI7Ci0gICAgY29uc3Qgc2hvcnQgICpWRmlsdGVyOwotICAgIGludCBGRGF0YVsxMyoxNl07ICAgLyogVGVtcCBkYXRhIGJ1ZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLwotCi0gICAgSEZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeG9mZnNldF07ICAgLyogNiB0YXAgKi8KLSAgICBWRmlsdGVyID0gdnA4X3N1Yl9wZWxfZmlsdGVyc1t5b2Zmc2V0XTsgICAvKiA2IHRhcCAqLwotCi0gICAgLyogRmlyc3QgZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KLSAgICBmaWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgOCwgSEZpbHRlcik7Ci0KLQotICAgIC8qIHRoZW4gZmlsdGVyIHZlcnRpY2FseS4uLiAqLwotICAgIGZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzKEZEYXRhICsgMTYsIGRzdF9wdHIsIGRzdF9waXRjaCwgOCwgOCwgNCwgOCwgVkZpbHRlcik7Ci0KLX0KLQotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgIGRzdF9waXRjaAotKQotewotICAgIGNvbnN0IHNob3J0ICAqSEZpbHRlcjsKLSAgICBjb25zdCBzaG9ydCAgKlZGaWx0ZXI7Ci0gICAgaW50IEZEYXRhWzIxKjI0XTsgICAvKiBUZW1wIGRhdGEgYnVmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCi0KLQotICAgIEhGaWx0ZXIgPSB2cDhfc3ViX3BlbF9maWx0ZXJzW3hvZmZzZXRdOyAgIC8qIDYgdGFwICovCi0gICAgVkZpbHRlciA9IHZwOF9zdWJfcGVsX2ZpbHRlcnNbeW9mZnNldF07ICAgLyogNiB0YXAgKi8KLQotICAgIC8qIEZpcnN0IGZpbHRlciAxLUQgaG9yaXpvbnRhbGx5Li4uICovCi0gICAgZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDIxLCAxNiwgSEZpbHRlcik7Ci0KLSAgICAvKiB0aGVuIGZpbHRlciB2ZXJ0aWNhbHkuLi4gKi8KLSAgICBmaWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzcyhGRGF0YSArIDMyLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCAxNiwgMTYsIDE2LCBWRmlsdGVyKTsKLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBmaWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcwotICoKLSAqICBJTlBVVFMgICAgICAgIDogVUlOVDggICpzcmNfcHRyICAgIDogUG9pbnRlciB0byBzb3VyY2UgYmxvY2suCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiAgc3JjX3N0cmlkZSA6IFN0cmlkZSBvZiBzb3VyY2UgYmxvY2suCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiAgaGVpZ2h0ICAgICA6IEJsb2NrIGhlaWdodC4KLSAqICAgICAgICAgICAgICAgICAgVUlOVDMyICB3aWR0aCAgICAgIDogQmxvY2sgd2lkdGguCi0gKiAgICAgICAgICAgICAgICAgIElOVDMyICAqdnA4X2ZpbHRlciA6IEFycmF5IG9mIDIgYmktbGluZWFyIGZpbHRlciB0YXBzLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogSU5UMzIgICpkc3RfcHRyICAgIDogUG9pbnRlciB0byBmaWx0ZXJlZCBibG9jay4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IEFwcGxpZXMgYSAxLUQgMi10YXAgYmktbGluZWFyIGZpbHRlciB0byB0aGUgc291cmNlIGJsb2NrCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiB0byBwcm9kdWNlIHRoZSBmaWx0ZXJlZCBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgYmxvY2suIFVzZWQgdG8gaW1wbGVtZW50IGZpcnN0LXBhc3Mgb2YgMi1EIHNlcGFyYWJsZSBmaWx0ZXIuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBQcm9kdWNlcyBJTlQzMiBvdXRwdXQgdG8gcmV0YWluIHByZWNpc2lvbiBmb3IgbmV4dCBwYXNzLgotICogICAgICAgICAgICAgICAgICBUd28gZmlsdGVyIHRhcHMgc2hvdWxkIHN1bSB0byBWUDhfRklMVEVSX1dFSUdIVC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgc2hvcnQgKmRzdF9wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgIHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICAgIGhlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgICAgd2lkdGgsCi0gICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBcHBseSBiaWxpbmVhciBmaWx0ZXIgKi8KLSAgICAgICAgICAgIGRzdF9wdHJbal0gPSAoKChpbnQpc3JjX3B0clswXSAqIHZwOF9maWx0ZXJbMF0pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpc3JjX3B0clsxXSAqIHZwOF9maWx0ZXJbMV0pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKFZQOF9GSUxURVJfV0VJR0hUIC8gMikpID4+IFZQOF9GSUxURVJfU0hJRlQ7Ci0gICAgICAgICAgICBzcmNfcHRyKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBOZXh0IHJvdy4uLiAqLwotICAgICAgICBzcmNfcHRyICs9IHNyY19zdHJpZGUgLSB3aWR0aDsKLSAgICAgICAgZHN0X3B0ciArPSB3aWR0aDsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBmaWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IElOVDMyICAqc3JjX3B0ciAgICA6IFBvaW50ZXIgdG8gc291cmNlIGJsb2NrLgotICogICAgICAgICAgICAgICAgICBVSU5UMzIgIGRzdF9waXRjaCAgOiBEZXN0aW5hdGlvbiBibG9jayBwaXRjaC4KLSAqICAgICAgICAgICAgICAgICAgVUlOVDMyICBoZWlnaHQgICAgIDogQmxvY2sgaGVpZ2h0LgotICogICAgICAgICAgICAgICAgICBVSU5UMzIgIHdpZHRoICAgICAgOiBCbG9jayB3aWR0aC4KLSAqICAgICAgICAgICAgICAgICAgSU5UMzIgICp2cDhfZmlsdGVyIDogQXJyYXkgb2YgMiBiaS1saW5lYXIgZmlsdGVyIHRhcHMuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBVSU5UMTYgKmRzdF9wdHIgICAgOiBQb2ludGVyIHRvIGZpbHRlcmVkIGJsb2NrLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogQXBwbGllcyBhIDEtRCAyLXRhcCBiaS1saW5lYXIgZmlsdGVyIHRvIHRoZSBzb3VyY2UgYmxvY2sKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiB0byBwcm9kdWNlIHRoZSBmaWx0ZXJlZCBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgYmxvY2suIFVzZWQgdG8gaW1wbGVtZW50IHNlY29uZC1wYXNzIG9mIDItRCBzZXBhcmFibGUgZmlsdGVyLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogUmVxdWlyZXMgMzItYml0IGlucHV0IGFzIHByb2R1Y2VkIGJ5IGZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzLgotICogICAgICAgICAgICAgICAgICBUd28gZmlsdGVyIHRhcHMgc2hvdWxkIHN1bSB0byBWUDhfRklMVEVSX1dFSUdIVC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcwotKAotICAgIHVuc2lnbmVkIHNob3J0ICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgICpkc3RfcHRyLAotICAgIGludCAgICAgICAgICAgICBkc3RfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50ICAgIGhlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgICAgd2lkdGgsCi0gICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgIGksIGo7Ci0gICAgaW50ICBUZW1wOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFwcGx5IGZpbHRlciAqLwotICAgICAgICAgICAgVGVtcCA9ICgoaW50KXNyY19wdHJbMF0gICAgICogdnA4X2ZpbHRlclswXSkgKwotICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbd2lkdGhdICogdnA4X2ZpbHRlclsxXSkgKwotICAgICAgICAgICAgICAgICAgIChWUDhfRklMVEVSX1dFSUdIVCAvIDIpOwotICAgICAgICAgICAgZHN0X3B0cltqXSA9ICh1bnNpZ25lZCBpbnQpKFRlbXAgPj4gVlA4X0ZJTFRFUl9TSElGVCk7Ci0gICAgICAgICAgICBzcmNfcHRyKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBOZXh0IHJvdy4uLiAqLwotICAgICAgICBkc3RfcHRyICs9IGRzdF9waXRjaDsKLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IGZpbHRlcl9ibG9jazJkX2JpbAotICoKLSAqICBJTlBVVFMgICAgICAgIDogVUlOVDggICpzcmNfcHRyICAgICAgICAgIDogUG9pbnRlciB0byBzb3VyY2UgYmxvY2suCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiAgc3JjX3BpdGNoICAgICAgICA6IFN0cmlkZSBvZiBzb3VyY2UgYmxvY2suCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiAgZHN0X3BpdGNoICAgICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBibG9jay4KLSAqICAgICAgICAgICAgICAgICAgSU5UMzIgICpIRmlsdGVyICAgICAgICAgIDogQXJyYXkgb2YgMiBob3Jpem9udGFsIGZpbHRlciB0YXBzLgotICogICAgICAgICAgICAgICAgICBJTlQzMiAgKlZGaWx0ZXIgICAgICAgICAgOiBBcnJheSBvZiAyIHZlcnRpY2FsIGZpbHRlciB0YXBzLgotICogICAgICAgICAgICAgICAgICBJTlQzMiAgV2lkdGggICAgICAgICAgICAgOiBCbG9jayB3aWR0aAotICogICAgICAgICAgICAgICAgICBJTlQzMiAgSGVpZ2h0ICAgICAgICAgICAgOiBCbG9jayBoZWlnaHQKLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IFVJTlQxNiAqZHN0X3B0ciAgICAgICA6IFBvaW50ZXIgdG8gZmlsdGVyZWQgYmxvY2suCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiAyLUQgZmlsdGVycyBhbiBpbnB1dCBibG9jayBieSBhcHBseWluZyBhIDItdGFwCi0gKiAgICAgICAgICAgICAgICAgIGJpLWxpbmVhciBmaWx0ZXIgaG9yaXpvbnRhbGx5IGZvbGxvd2VkIGJ5IGEgMi10YXAKLSAqICAgICAgICAgICAgICAgICAgYmktbGluZWFyIGZpbHRlciB2ZXJ0aWNhbGx5IG9uIHRoZSByZXN1bHQuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgbGFyZ2VzdCBibG9jayBzaXplIGNhbiBiZSBoYW5kbGVkIGhlcmUgaXMgMTZ4MTYKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGZpbHRlcl9ibG9jazJkX2JpbAotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICBzcmNfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50ICAgZHN0X3BpdGNoLAotICAgIGNvbnN0IHNob3J0ICAgKkhGaWx0ZXIsCi0gICAgY29uc3Qgc2hvcnQgICAqVkZpbHRlciwKLSAgICBpbnQgICAgICAgICAgICBXaWR0aCwKLSAgICBpbnQgICAgICAgICAgICBIZWlnaHQKLSkKLXsKLQotICAgIHVuc2lnbmVkIHNob3J0IEZEYXRhWzE3KjE2XTsgICAgLyogVGVtcCBkYXRhIGJ1ZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLwotCi0gICAgLyogRmlyc3QgZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KLSAgICBmaWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcyhzcmNfcHRyLCBGRGF0YSwgc3JjX3BpdGNoLCBIZWlnaHQgKyAxLCBXaWR0aCwgSEZpbHRlcik7Ci0KLSAgICAvKiB0aGVuIDEtRCB2ZXJ0aWNhbGx5Li4uICovCi0gICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzKEZEYXRhLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIEhlaWdodCwgV2lkdGgsIFZGaWx0ZXIpOwotfQotCi0KLXZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl0Y2gKLSkKLXsKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlcjsKLSAgICBjb25zdCBzaG9ydCAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0jaWYgMAotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcDFbMTZdOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHRlbXAyWzE2XTsKLQotICAgICAgICBiaWxpbmVhcl9wcmVkaWN0NHg0X21teChzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCB0ZW1wMSwgNCk7Ci0gICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbChzcmNfcHRyLCB0ZW1wMiwgc3JjX3BpeGVsc19wZXJfbGluZSwgNCwgSEZpbHRlciwgVkZpbHRlciwgNCwgNCk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0ZW1wMVtpXSAhPSB0ZW1wMltpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiaWxpbmVhcl9wcmVkaWN0NHg0X21teChzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCB0ZW1wMSwgNCk7Ci0gICAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsKHNyY19wdHIsIHRlbXAyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCA0LCBIRmlsdGVyLCBWRmlsdGVyLCA0LCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIGZpbHRlcl9ibG9jazJkX2JpbChzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcGl0Y2gsIEhGaWx0ZXIsIFZGaWx0ZXIsIDQsIDQpOwotCi19Ci0KLXZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50ICBkc3RfcGl0Y2gKLSkKLXsKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlcjsKLSAgICBjb25zdCBzaG9ydCAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0KLSAgICBmaWx0ZXJfYmxvY2syZF9iaWwoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3BpdGNoLCBIRmlsdGVyLCBWRmlsdGVyLCA4LCA4KTsKLQotfQotCi12b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2MKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXI7Ci0gICAgY29uc3Qgc2hvcnQgKlZGaWx0ZXI7Ci0KLSAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07Ci0gICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOwotCi0gICAgZmlsdGVyX2Jsb2NrMmRfYmlsKHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlciwgOCwgNCk7Ci0KLX0KLQotdm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2MKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXI7Ci0gICAgY29uc3Qgc2hvcnQgKlZGaWx0ZXI7Ci0KLSAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07Ci0gICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOwotCi0gICAgZmlsdGVyX2Jsb2NrMmRfYmlsKHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9waXRjaCwgSEZpbHRlciwgVkZpbHRlciwgMTYsIDE2KTsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vZmlsdGVyLmggYi92cDgvY29tbW9uL2ZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjIyNWMyLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vZmlsdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBGSUxURVJfSAotI2RlZmluZSBGSUxURVJfSAotCi0jZGVmaW5lIEJMT0NLX0hFSUdIVF9XSURUSCA0Ci0jZGVmaW5lIFZQOF9GSUxURVJfV0VJR0hUIDEyOAotI2RlZmluZSBWUDhfRklMVEVSX1NISUZUICA3Ci0KLWV4dGVybiBjb25zdCBzaG9ydCB2cDhfYmlsaW5lYXJfZmlsdGVyc1s4XVsyXTsKLWV4dGVybiBjb25zdCBzaG9ydCB2cDhfc3ViX3BlbF9maWx0ZXJzWzhdWzZdOwotCi0jZW5kaWYgLy9GSUxURVJfSApkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9maW5kbmVhcm12LmMgYi92cDgvY29tbW9uL2ZpbmRuZWFybXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0MWFmYS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2ZpbmRuZWFybXYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgImZpbmRuZWFybXYuaCIKLQotY29uc3QgdW5zaWduZWQgY2hhciB2cDhfbWJzcGxpdF9vZmZzZXRbNF1bMTZdID0gewotICAgIHsgMCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9LAotICAgIHsgMCwgIDIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9LAotICAgIHsgMCwgIDIsICA4LCAxMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9LAotICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTV9Ci19OwotCi0vKiBQcmVkaWN0IG1vdGlvbiB2ZWN0b3JzIHVzaW5nIHRob3NlIGZyb20gYWxyZWFkeS1kZWNvZGVkIG5lYXJieSBibG9ja3MuCi0gICBOb3RlIHRoYXQgd2Ugb25seSBjb25zaWRlciBvbmUgNHg0IHN1YmJsb2NrIGZyb20gZWFjaCBjYW5kaWRhdGUgMTZ4MTYKLSAgIG1hY3JvYmxvY2suICAgKi8KLXZvaWQgdnA4X2ZpbmRfbmVhcl9tdnMKLSgKLSAgICBNQUNST0JMT0NLRCAqeGQsCi0gICAgY29uc3QgTU9ERV9JTkZPICpoZXJlLAotICAgIE1WICpuZWFyZXN0LAotICAgIE1WICpuZWFyYnksCi0gICAgTVYgKmJlc3RfbXYsCi0gICAgaW50IGNudFs0XSwKLSAgICBpbnQgcmVmZnJhbWUsCi0gICAgaW50ICpyZWZfZnJhbWVfc2lnbl9iaWFzCi0pCi17Ci0gICAgY29uc3QgTU9ERV9JTkZPICphYm92ZSA9IGhlcmUgLSB4ZC0+bW9kZV9pbmZvX3N0cmlkZTsKLSAgICBjb25zdCBNT0RFX0lORk8gKmxlZnQgPSBoZXJlIC0gMTsKLSAgICBjb25zdCBNT0RFX0lORk8gKmFib3ZlbGVmdCA9IGFib3ZlIC0gMTsKLSAgICBpbnRfbXYgICAgICAgICAgICBuZWFyX212c1s0XTsKLSAgICBpbnRfbXYgICAgICAgICAgICptdiA9IG5lYXJfbXZzOwotICAgIGludCAgICAgICAgICAgICAqY250eCA9IGNudDsKLSAgICBlbnVtIHtDTlRfSU5UUkEsIENOVF9ORUFSRVNULCBDTlRfTkVBUiwgQ05UX1NQTElUTVZ9OwotCi0gICAgLyogWmVybyBhY2N1bXVsYXRvcnMgKi8KLSAgICBtdlswXS5hc19pbnQgPSBtdlsxXS5hc19pbnQgPSBtdlsyXS5hc19pbnQgPSAwOwotICAgIGNudFswXSA9IGNudFsxXSA9IGNudFsyXSA9IGNudFszXSA9IDA7Ci0KLSAgICAvKiBQcm9jZXNzIGFib3ZlICovCi0gICAgaWYgKGFib3ZlLT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIGlmIChhYm92ZS0+bWJtaS5tdi5hc19pbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgrK212KS0+YXNfaW50ID0gYWJvdmUtPm1ibWkubXYuYXNfaW50OwotICAgICAgICAgICAgbXZfYmlhcyhyZWZfZnJhbWVfc2lnbl9iaWFzW2Fib3ZlLT5tYm1pLnJlZl9mcmFtZV0sIHJlZmZyYW1lLCBtdiwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0gICAgICAgICAgICArK2NudHg7Ci0gICAgICAgIH0KLQotICAgICAgICAqY250eCArPSAyOwotICAgIH0KLQotICAgIC8qIFByb2Nlc3MgbGVmdCAqLwotICAgIGlmIChsZWZ0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIGlmIChsZWZ0LT5tYm1pLm12LmFzX2ludCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50X212IHRoaXNfbXY7Ci0KLSAgICAgICAgICAgIHRoaXNfbXYuYXNfaW50ID0gbGVmdC0+bWJtaS5tdi5hc19pbnQ7Ci0gICAgICAgICAgICBtdl9iaWFzKHJlZl9mcmFtZV9zaWduX2JpYXNbbGVmdC0+bWJtaS5yZWZfZnJhbWVdLCByZWZmcmFtZSwgJnRoaXNfbXYsIHJlZl9mcmFtZV9zaWduX2JpYXMpOwotCi0gICAgICAgICAgICBpZiAodGhpc19tdi5hc19pbnQgIT0gbXYtPmFzX2ludCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKyttdiktPmFzX2ludCA9IHRoaXNfbXYuYXNfaW50OwotICAgICAgICAgICAgICAgICsrY250eDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKmNudHggKz0gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjbnRbQ05UX0lOVFJBXSArPSAyOwotICAgIH0KLQotICAgIC8qIFByb2Nlc3MgYWJvdmUgbGVmdCAqLwotICAgIGlmIChhYm92ZWxlZnQtPm1ibWkucmVmX2ZyYW1lICE9IElOVFJBX0ZSQU1FKQotICAgIHsKLSAgICAgICAgaWYgKGFib3ZlbGVmdC0+bWJtaS5tdi5hc19pbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludF9tdiB0aGlzX212OwotCi0gICAgICAgICAgICB0aGlzX212LmFzX2ludCA9IGFib3ZlbGVmdC0+bWJtaS5tdi5hc19pbnQ7Ci0gICAgICAgICAgICBtdl9iaWFzKHJlZl9mcmFtZV9zaWduX2JpYXNbYWJvdmVsZWZ0LT5tYm1pLnJlZl9mcmFtZV0sIHJlZmZyYW1lLCAmdGhpc19tdiwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzX212LmFzX2ludCAhPSBtdi0+YXNfaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgrK212KS0+YXNfaW50ID0gdGhpc19tdi5hc19pbnQ7Ci0gICAgICAgICAgICAgICAgKytjbnR4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqY250eCArPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNudFtDTlRfSU5UUkFdICs9IDE7Ci0gICAgfQotCi0gICAgLyogSWYgd2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBNVidzIC4uLiAqLwotICAgIGlmIChjbnRbQ05UX1NQTElUTVZdKQotICAgIHsKLSAgICAgICAgLyogU2VlIGlmIGFib3ZlLWxlZnQgTVYgY2FuIGJlIG1lcmdlZCB3aXRoIE5FQVJFU1QgKi8KLSAgICAgICAgaWYgKG12LT5hc19pbnQgPT0gbmVhcl9tdnNbQ05UX05FQVJFU1RdLmFzX2ludCkKLSAgICAgICAgICAgIGNudFtDTlRfTkVBUkVTVF0gKz0gMTsKLSAgICB9Ci0KLSAgICBjbnRbQ05UX1NQTElUTVZdID0gKChhYm92ZS0+bWJtaS5tb2RlID09IFNQTElUTVYpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChsZWZ0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikpICogMgotICAgICAgICAgICAgICAgICAgICAgICArIChhYm92ZWxlZnQtPm1ibWkubW9kZSA9PSBTUExJVE1WKTsKLQotICAgIC8qIFN3YXAgbmVhciBhbmQgbmVhcmVzdCBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoY250W0NOVF9ORUFSXSA+IGNudFtDTlRfTkVBUkVTVF0pCi0gICAgewotICAgICAgICBpbnQgdG1wOwotICAgICAgICB0bXAgPSBjbnRbQ05UX05FQVJFU1RdOwotICAgICAgICBjbnRbQ05UX05FQVJFU1RdID0gY250W0NOVF9ORUFSXTsKLSAgICAgICAgY250W0NOVF9ORUFSXSA9IHRtcDsKLSAgICAgICAgdG1wID0gbmVhcl9tdnNbQ05UX05FQVJFU1RdLmFzX2ludDsKLSAgICAgICAgbmVhcl9tdnNbQ05UX05FQVJFU1RdLmFzX2ludCA9IG5lYXJfbXZzW0NOVF9ORUFSXS5hc19pbnQ7Ci0gICAgICAgIG5lYXJfbXZzW0NOVF9ORUFSXS5hc19pbnQgPSB0bXA7Ci0gICAgfQotCi0gICAgLyogVXNlIG5lYXJfbXZzWzBdIHRvIHN0b3JlIHRoZSAiYmVzdCIgTVYgKi8KLSAgICBpZiAoY250W0NOVF9ORUFSRVNUXSA+PSBjbnRbQ05UX0lOVFJBXSkKLSAgICAgICAgbmVhcl9tdnNbQ05UX0lOVFJBXSA9IG5lYXJfbXZzW0NOVF9ORUFSRVNUXTsKLQotICAgIC8qIFNldCB1cCByZXR1cm4gdmFsdWVzICovCi0gICAgKmJlc3RfbXYgPSBuZWFyX212c1swXS5hc19tdjsKLSAgICAqbmVhcmVzdCA9IG5lYXJfbXZzW0NOVF9ORUFSRVNUXS5hc19tdjsKLSAgICAqbmVhcmJ5ID0gbmVhcl9tdnNbQ05UX05FQVJdLmFzX212OwotCi0gICAgdnA4X2NsYW1wX212KG5lYXJlc3QsIHhkKTsKLSAgICB2cDhfY2xhbXBfbXYobmVhcmJ5LCB4ZCk7Ci0gICAgdnA4X2NsYW1wX212KGJlc3RfbXYsIHhkKTsgLypUT0RPOiBtb3ZlIHRoaXMgdXAgYmVmb3JlIHRoZSBjb3B5Ki8KLX0KLQotdnA4X3Byb2IgKnZwOF9tdl9yZWZfcHJvYnMoCi0gICAgdnA4X3Byb2IgcFtWUDhfTVZSRUZTLTFdLCBjb25zdCBpbnQgbmVhcl9tdl9yZWZfY3RbNF0KLSkKLXsKLSAgICBwWzBdID0gdnA4X21vZGVfY29udGV4dHMgW25lYXJfbXZfcmVmX2N0WzBdXSBbMF07Ci0gICAgcFsxXSA9IHZwOF9tb2RlX2NvbnRleHRzIFtuZWFyX212X3JlZl9jdFsxXV0gWzFdOwotICAgIHBbMl0gPSB2cDhfbW9kZV9jb250ZXh0cyBbbmVhcl9tdl9yZWZfY3RbMl1dIFsyXTsKLSAgICBwWzNdID0gdnA4X21vZGVfY29udGV4dHMgW25lYXJfbXZfcmVmX2N0WzNdXSBbM107Ci0gICAgLypwWzNdID0gdnA4X21vZGVfY29udGV4dHMgW25lYXJfbXZfcmVmX2N0WzFdICsgbmVhcl9tdl9yZWZfY3RbMl0gKyBuZWFyX212X3JlZl9jdFszXV0gWzNdOyovCi0gICAgcmV0dXJuIHA7Ci19Ci0KLWNvbnN0IEJfTU9ERV9JTkZPICp2cDhfbGVmdF9ibWkoY29uc3QgTU9ERV9JTkZPICpjdXJfbWIsIGludCBiKQotewotICAgIGlmICghKGIgJiAzKSkKLSAgICB7Ci0gICAgICAgIC8qIE9uIEwgZWRnZSwgZ2V0IGZyb20gTUIgdG8gbGVmdCBvZiB1cyAqLwotICAgICAgICAtLWN1cl9tYjsKLSAgICAgICAgYiArPSA0OwotICAgIH0KLQotICAgIHJldHVybiBjdXJfbWItPmJtaSArIGIgLSAxOwotfQotCi1jb25zdCBCX01PREVfSU5GTyAqdnA4X2Fib3ZlX2JtaShjb25zdCBNT0RFX0lORk8gKmN1cl9tYiwgaW50IGIsIGludCBtaV9zdHJpZGUpCi17Ci0gICAgaWYgKCEoYiA+PiAyKSkKLSAgICB7Ci0gICAgICAgIC8qIE9uIHRvcCBlZGdlLCBnZXQgZnJvbSBNQiBhYm92ZSB1cyAqLwotICAgICAgICBjdXJfbWIgLT0gbWlfc3RyaWRlOwotICAgICAgICBiICs9IDE2OwotICAgIH0KLQotICAgIHJldHVybiBjdXJfbWItPmJtaSArIGIgLSA0OwotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9maW5kbmVhcm12LmggYi92cDgvY29tbW9uL2ZpbmRuZWFybXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmOWVjYS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2ZpbmRuZWFybXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0ZJTkRORUFSTVZfSAotI2RlZmluZSBfX0lOQ19GSU5ETkVBUk1WX0gKLQotI2luY2x1ZGUgIm12LmgiCi0jaW5jbHVkZSAiYmxvY2tkLmgiCi0jaW5jbHVkZSAibW9kZWNvbnQuaCIKLSNpbmNsdWRlICJ0cmVlY29kZXIuaCIKLQotdHlwZWRlZiB1bmlvbgotewotICAgIHVuc2lnbmVkIGludCBhc19pbnQ7Ci0gICAgTVYgICAgICAgICAgIGFzX212OwotfSBpbnRfbXY7ICAgICAgICAvKiBmYWNpbGl0YXRlcyByYXBpZCBlcXVhbGl0eSB0ZXN0cyAqLwotCi1zdGF0aWMgdm9pZCBtdl9iaWFzKGludCByZWZtYl9yZWZfZnJhbWVfc2lnbl9iaWFzLCBpbnQgcmVmZnJhbWUsIGludF9tdiAqbXZwLCBjb25zdCBpbnQgKnJlZl9mcmFtZV9zaWduX2JpYXMpCi17Ci0gICAgTVYgeG12OwotICAgIHhtdiA9IG12cC0+YXNfbXY7Ci0KLSAgICBpZiAocmVmbWJfcmVmX2ZyYW1lX3NpZ25fYmlhcyAhPSByZWZfZnJhbWVfc2lnbl9iaWFzW3JlZmZyYW1lXSkKLSAgICB7Ci0gICAgICAgIHhtdi5yb3cgKj0gLTE7Ci0gICAgICAgIHhtdi5jb2wgKj0gLTE7Ci0gICAgfQotCi0gICAgbXZwLT5hc19tdiA9IHhtdjsKLX0KLQotI2RlZmluZSBMRUZUX1RPUF9NQVJHSU4gKDE2IDw8IDMpCi0jZGVmaW5lIFJJR0hUX0JPVFRPTV9NQVJHSU4gKDE2IDw8IDMpCi1zdGF0aWMgdm9pZCB2cDhfY2xhbXBfbXYoTVYgKm12LCBjb25zdCBNQUNST0JMT0NLRCAqeGQpCi17Ci0gICAgaWYgKG12LT5jb2wgPCAoeGQtPm1iX3RvX2xlZnRfZWRnZSAtIExFRlRfVE9QX01BUkdJTikpCi0gICAgICAgIG12LT5jb2wgPSB4ZC0+bWJfdG9fbGVmdF9lZGdlIC0gTEVGVF9UT1BfTUFSR0lOOwotICAgIGVsc2UgaWYgKG12LT5jb2wgPiB4ZC0+bWJfdG9fcmlnaHRfZWRnZSArIFJJR0hUX0JPVFRPTV9NQVJHSU4pCi0gICAgICAgIG12LT5jb2wgPSB4ZC0+bWJfdG9fcmlnaHRfZWRnZSArIFJJR0hUX0JPVFRPTV9NQVJHSU47Ci0KLSAgICBpZiAobXYtPnJvdyA8ICh4ZC0+bWJfdG9fdG9wX2VkZ2UgLSBMRUZUX1RPUF9NQVJHSU4pKQotICAgICAgICBtdi0+cm93ID0geGQtPm1iX3RvX3RvcF9lZGdlIC0gTEVGVF9UT1BfTUFSR0lOOwotICAgIGVsc2UgaWYgKG12LT5yb3cgPiB4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgKyBSSUdIVF9CT1RUT01fTUFSR0lOKQotICAgICAgICBtdi0+cm93ID0geGQtPm1iX3RvX2JvdHRvbV9lZGdlICsgUklHSFRfQk9UVE9NX01BUkdJTjsKLX0KLQotdm9pZCB2cDhfZmluZF9uZWFyX212cwotKAotICAgIE1BQ1JPQkxPQ0tEICp4ZCwKLSAgICBjb25zdCBNT0RFX0lORk8gKmhlcmUsCi0gICAgTVYgKm5lYXJlc3QsIE1WICpuZWFyYnksIE1WICpiZXN0LAotICAgIGludCBuZWFyX212X3JlZl9jdHNbNF0sCi0gICAgaW50IHJlZmZyYW1lLAotICAgIGludCAqcmVmX2ZyYW1lX3NpZ25fYmlhcwotKTsKLQotdnA4X3Byb2IgKnZwOF9tdl9yZWZfcHJvYnMoCi0gICAgdnA4X3Byb2IgcFtWUDhfTVZSRUZTLTFdLCBjb25zdCBpbnQgbmVhcl9tdl9yZWZfY3RbNF0KLSk7Ci0KLWNvbnN0IEJfTU9ERV9JTkZPICp2cDhfbGVmdF9ibWkoY29uc3QgTU9ERV9JTkZPICpjdXJfbWIsIGludCBiKTsKLQotY29uc3QgQl9NT0RFX0lORk8gKnZwOF9hYm92ZV9ibWkoY29uc3QgTU9ERV9JTkZPICpjdXJfbWIsIGludCBiLCBpbnQgbWlfc3RyaWRlKTsKLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X21ic3BsaXRfb2Zmc2V0WzRdWzE2XTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2dfY29tbW9uLmggYi92cDgvY29tbW9uL2dfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTIzOTguLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9nX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLWV4dGVybiB2b2lkICgqdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSkodm9pZCk7Ci1leHRlcm4gdm9pZCAoKnZwOF9wbGFuZV9hZGRfbm9pc2UpKHVuc2lnbmVkIGNoYXIgKlN0YXJ0LCB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCwgaW50IERQaXRjaCwgaW50IHEpOwotZXh0ZXJuIHZvaWQgKCpkZV9pbnRlcmxhY2UpCi0oCi0gICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBXaWR0aCwKLSAgICBpbnQgSGVpZ2h0LAotICAgIGludCBTdHJpZGUKLSk7CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2dlbmVyaWMvc3lzdGVtZGVwZW5kZW50LmMgYi92cDgvY29tbW9uL2dlbmVyaWMvc3lzdGVtZGVwZW5kZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjQ2NDcuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9nZW5lcmljL3N5c3RlbWRlcGVuZGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9nX2NvbW1vbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vc3VicGl4ZWwuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9pZGN0LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKLQotZXh0ZXJuIHZvaWQgdnA4X2FyY2hfeDg2X2NvbW1vbl9pbml0KFZQOF9DT01NT04gKmN0eCk7Ci1leHRlcm4gdm9pZCB2cDhfYXJjaF9hcm1fY29tbW9uX2luaXQoVlA4X0NPTU1PTiAqY3R4KTsKLQotdm9pZCB2cDhfbWFjaGluZV9zcGVjaWZpY19jb25maWcoVlA4X0NPTU1PTiAqY3R4KQotewotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBWUDhfQ09NTU9OX1JUQ0QgKnJ0Y2QgPSAmY3R4LT5ydGNkOwotCi0gICAgcnRjZC0+aWRjdC5pZGN0MSAgICAgICAgPSB2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX2M7Ci0gICAgcnRjZC0+aWRjdC5pZGN0MTYgICAgICAgPSB2cDhfc2hvcnRfaWRjdDR4NGxsbV9jOwotICAgIHJ0Y2QtPmlkY3QuaWRjdDFfc2NhbGFyX2FkZCA9IHZwOF9kY19vbmx5X2lkY3RfYWRkX2M7Ci0gICAgcnRjZC0+aWRjdC5pd2Fsc2gxICAgICAgPSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfYzsKLSAgICBydGNkLT5pZGN0Lml3YWxzaDE2ICAgICA9IHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfYzsKLQotICAgIHJ0Y2QtPnJlY29uLmNvcHkxNngxNiAgID0gdnA4X2NvcHlfbWVtMTZ4MTZfYzsKLSAgICBydGNkLT5yZWNvbi5jb3B5OHg4ICAgICA9IHZwOF9jb3B5X21lbTh4OF9jOwotICAgIHJ0Y2QtPnJlY29uLmNvcHk4eDQgICAgID0gdnA4X2NvcHlfbWVtOHg0X2M7Ci0gICAgcnRjZC0+cmVjb24ucmVjb24gICAgICAgPSB2cDhfcmVjb25fYl9jOwotICAgIHJ0Y2QtPnJlY29uLnJlY29uMiAgICAgID0gdnA4X3JlY29uMmJfYzsKLSAgICBydGNkLT5yZWNvbi5yZWNvbjQgICAgICA9IHZwOF9yZWNvbjRiX2M7Ci0gICAgcnRjZC0+cmVjb24ucmVjb25fbWIgICAgPSB2cDhfcmVjb25fbWJfYzsKLSAgICBydGNkLT5yZWNvbi5yZWNvbl9tYnkgICA9IHZwOF9yZWNvbl9tYnlfYzsKLSAgICBydGNkLT5yZWNvbi5idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieSA9Ci0gICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieTsKLSAgICBydGNkLT5yZWNvbi5idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zID0KLSAgICAgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3M7Ci0KLSAgICBydGNkLT5zdWJwaXguc2l4dGFwMTZ4MTYgICA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X2M7Ci0gICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4OCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfYzsKLSAgICBydGNkLT5zdWJwaXguc2l4dGFwOHg0ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9jOwotICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXA0eDQgICAgID0gdnA4X3NpeHRhcF9wcmVkaWN0X2M7Ci0gICAgcnRjZC0+c3VicGl4LmJpbGluZWFyMTZ4MTYgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2M7Ci0gICAgcnRjZC0+c3VicGl4LmJpbGluZWFyOHg4ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9jOwotICAgIHJ0Y2QtPnN1YnBpeC5iaWxpbmVhcjh4NCAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfYzsKLSAgICBydGNkLT5zdWJwaXguYmlsaW5lYXI0eDQgICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X2M7Ci0KLSAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl92ID0gdnA4X2xvb3BfZmlsdGVyX21idl9jOwotICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX2JfdiAgPSB2cDhfbG9vcF9maWx0ZXJfYnZfYzsKLSAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl9oID0gdnA4X2xvb3BfZmlsdGVyX21iaF9jOwotICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX2JfaCAgPSB2cDhfbG9vcF9maWx0ZXJfYmhfYzsKLSAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9tYl92ID0gdnA4X2xvb3BfZmlsdGVyX21idnNfYzsKLSAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9iX3YgID0gdnA4X2xvb3BfZmlsdGVyX2J2c19jOwotICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX21iX2ggPSB2cDhfbG9vcF9maWx0ZXJfbWJoc19jOwotICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX2JfaCAgPSB2cDhfbG9vcF9maWx0ZXJfYmhzX2M7Ci0KLSNpZiBDT05GSUdfUE9TVFBST0MgfHwgKENPTkZJR19WUDhfRU5DT0RFUiAmJiBDT05GSUdfUFNOUikKLSAgICBydGNkLT5wb3N0cHJvYy5kb3duICAgICAgICAgICAgID0gdnA4X21icG9zdF9wcm9jX2Rvd25fYzsKLSAgICBydGNkLT5wb3N0cHJvYy5hY3Jvc3MgICAgICAgICAgID0gdnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF9jOwotICAgIHJ0Y2QtPnBvc3Rwcm9jLmRvd25hY3Jvc3MgICAgICAgPSB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19jOwotICAgIHJ0Y2QtPnBvc3Rwcm9jLmFkZG5vaXNlICAgICAgICAgPSB2cDhfcGxhbmVfYWRkX25vaXNlX2M7Ci0gICAgcnRjZC0+cG9zdHByb2MuYmxlbmRfbWJfaW5uZXIgICA9IHZwOF9ibGVuZF9tYl9pbm5lcl9jOwotICAgIHJ0Y2QtPnBvc3Rwcm9jLmJsZW5kX21iX291dGVyICAgPSB2cDhfYmxlbmRfbWJfb3V0ZXJfYzsKLSAgICBydGNkLT5wb3N0cHJvYy5ibGVuZF9iICAgICAgICAgID0gdnA4X2JsZW5kX2JfYzsKLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0Ci0gICAgdnA4X2FyY2hfeDg2X2NvbW1vbl9pbml0KGN0eCk7Ci0jZW5kaWYKLQotI2lmIEFSQ0hfQVJNCi0gICAgdnA4X2FyY2hfYXJtX2NvbW1vbl9pbml0KGN0eCk7Ci0jZW5kaWYKLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9pZGN0LmggYi92cDgvY29tbW9uL2lkY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NTUwMS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2lkY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0lEQ1RfSAotI2RlZmluZSBfX0lOQ19JRENUX0gKLQotI2RlZmluZSBwcm90b3R5cGVfc2Vjb25kX29yZGVyKHN5bSkgXAotICAgIHZvaWQgc3ltKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKLQotI2RlZmluZSBwcm90b3R5cGVfaWRjdChzeW0pIFwKLSAgICB2b2lkIHN5bShzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLQotI2RlZmluZSBwcm90b3R5cGVfaWRjdF9zY2FsYXJfYWRkKHN5bSkgXAotICAgIHZvaWQgc3ltKHNob3J0IGlucHV0LCBcCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHJlZCwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBcCi0gICAgICAgICAgICAgaW50IHBpdGNoLCBpbnQgc3RyaWRlKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvaWRjdF94ODYuaCIKLSNlbmRpZgotCi0jaWYgQVJDSF9BUk0KLSNpbmNsdWRlICJhcm0vaWRjdF9hcm0uaCIKLSNlbmRpZgotCi0jaWYgQVJDSF9NSVBTCi0jaWYgZGVmaW5lZChNSVBTX0RTUF9SRVYpICYmIE1JUFNfRFNQX1JFVj49MQotI2luY2x1ZGUgIm1pcHMvaWRjdF9taXBzLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIHZwOF9pZGN0X2lkY3QxCi0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2lkY3QodnA4X2lkY3RfaWRjdDEpOwotCi0jaWZuZGVmIHZwOF9pZGN0X2lkY3QxNgotI2RlZmluZSB2cDhfaWRjdF9pZGN0MTYgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2lkY3QodnA4X2lkY3RfaWRjdDE2KTsKLQotI2lmbmRlZiB2cDhfaWRjdF9pZGN0MV9zY2FsYXJfYWRkCi0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxX3NjYWxhcl9hZGQgdnA4X2RjX29ubHlfaWRjdF9hZGRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2lkY3Rfc2NhbGFyX2FkZCh2cDhfaWRjdF9pZGN0MV9zY2FsYXJfYWRkKTsKLQotCi0jaWZuZGVmIHZwOF9pZGN0X2l3YWxzaDEKLSNkZWZpbmUgdnA4X2lkY3RfaXdhbHNoMSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfaWRjdF9pd2Fsc2gxKTsKLQotI2lmbmRlZiB2cDhfaWRjdF9pd2Fsc2gxNgotI2RlZmluZSB2cDhfaWRjdF9pd2Fsc2gxNiB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zZWNvbmRfb3JkZXIodnA4X2lkY3RfaXdhbHNoMTYpOwotCi10eXBlZGVmIHByb3RvdHlwZV9pZGN0KCgqdnA4X2lkY3RfZm5fdCkpOwotdHlwZWRlZiBwcm90b3R5cGVfaWRjdF9zY2FsYXJfYWRkKCgqdnA4X2lkY3Rfc2NhbGFyX2FkZF9mbl90KSk7Ci10eXBlZGVmIHByb3RvdHlwZV9zZWNvbmRfb3JkZXIoKCp2cDhfc2Vjb25kX29yZGVyX2ZuX3QpKTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB2cDhfaWRjdF9mbl90ICAgICAgICAgICAgaWRjdDE7Ci0gICAgdnA4X2lkY3RfZm5fdCAgICAgICAgICAgIGlkY3QxNjsKLSAgICB2cDhfaWRjdF9zY2FsYXJfYWRkX2ZuX3QgaWRjdDFfc2NhbGFyX2FkZDsKLQotICAgIHZwOF9zZWNvbmRfb3JkZXJfZm5fdCBpd2Fsc2gxOwotICAgIHZwOF9zZWNvbmRfb3JkZXJfZm5fdCBpd2Fsc2gxNjsKLX0gdnA4X2lkY3RfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgSURDVF9JTlZPS0UoY3R4LGZuKSAoY3R4KS0+Zm4KLSNlbHNlCi0jZGVmaW5lIElEQ1RfSU5WT0tFKGN0eCxmbikgdnA4X2lkY3RfIyNmbgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9pZGN0bGxtLmMgYi92cDgvY29tbW9uL2lkY3RsbG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2MDYyZC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2lkY3RsbG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5vdGVzOgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2IGJpdCBmaXhlZCBwb2ludCB2ZXJpbyBvZiB0d28gbXVsdGlwbHkKLSAqIGNvbnN0YW50czoKLSAqICAgICAgICAgMS4gICBzcXJ0KDIpICogY29zIChwaS84KQotICogICAgICAgICAyLiAgIHNxcnQoMikgKiBzaW4gKHBpLzgpCi0gKiBCZWN1YXNlIHRoZSBmaXJzdCBjb25zdGFudCBpcyBiaWdnZXIgdGhhbiAxLCB0byBtYWludGFpbiB0aGUgc2FtZSAxNiBiaXQKLSAqIGZpeGVkIHBvaW50IHByZWNpc2lvbiBhcyB0aGUgc2Vjb25kIG9uZSwgd2UgdXNlIGEgdHJpY2sgb2YKLSAqICAgICAgICAgeCAqIGEgPSB4ICsgeCooYS0xKQotICogc28KLSAqICAgICAgICAgeCAqIHNxcnQoMikgKiBjb3MgKHBpLzgpID0geCArIHggKiAoc3FydCgyKSAqY29zKHBpLzgpLTEpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IGludCBjb3NwaThzcXJ0Mm1pbnVzMSA9IDIwMDkxOwotc3RhdGljIGNvbnN0IGludCBzaW5waThzcXJ0MiAgICAgID0gMzU0Njg7Ci1zdGF0aWMgY29uc3QgaW50IHJvdW5kaW5nID0gMDsKLXZvaWQgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgYTEsIGIxLCBjMSwgZDE7Ci0KLSAgICBzaG9ydCAqaXAgPSBpbnB1dDsKLSAgICBzaG9ydCAqb3AgPSBvdXRwdXQ7Ci0gICAgaW50IHRlbXAxLCB0ZW1wMjsKLSAgICBpbnQgc2hvcnRwaXRjaCA9IHBpdGNoID4+IDE7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgYTEgPSBpcFswXSArIGlwWzhdOwotICAgICAgICBiMSA9IGlwWzBdIC0gaXBbOF07Ci0KLSAgICAgICAgdGVtcDEgPSAoaXBbNF0gKiBzaW5waThzcXJ0MiArIHJvdW5kaW5nKSA+PiAxNjsKLSAgICAgICAgdGVtcDIgPSBpcFsxMl0gKyAoKGlwWzEyXSAqIGNvc3BpOHNxcnQybWludXMxICsgcm91bmRpbmcpID4+IDE2KTsKLSAgICAgICAgYzEgPSB0ZW1wMSAtIHRlbXAyOwotCi0gICAgICAgIHRlbXAxID0gaXBbNF0gKyAoKGlwWzRdICogY29zcGk4c3FydDJtaW51czEgKyByb3VuZGluZykgPj4gMTYpOwotICAgICAgICB0ZW1wMiA9IChpcFsxMl0gKiBzaW5waThzcXJ0MiArIHJvdW5kaW5nKSA+PiAxNjsKLSAgICAgICAgZDEgPSB0ZW1wMSArIHRlbXAyOwotCi0gICAgICAgIG9wW3Nob3J0cGl0Y2gqMF0gPSBhMSArIGQxOwotICAgICAgICBvcFtzaG9ydHBpdGNoKjNdID0gYTEgLSBkMTsKLQotICAgICAgICBvcFtzaG9ydHBpdGNoKjFdID0gYjEgKyBjMTsKLSAgICAgICAgb3Bbc2hvcnRwaXRjaCoyXSA9IGIxIC0gYzE7Ci0KLSAgICAgICAgaXArKzsKLSAgICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgICBpcCA9IG91dHB1dDsKLSAgICBvcCA9IG91dHB1dDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBhMSA9IGlwWzBdICsgaXBbMl07Ci0gICAgICAgIGIxID0gaXBbMF0gLSBpcFsyXTsKLQotICAgICAgICB0ZW1wMSA9IChpcFsxXSAqIHNpbnBpOHNxcnQyICsgcm91bmRpbmcpID4+IDE2OwotICAgICAgICB0ZW1wMiA9IGlwWzNdICsgKChpcFszXSAqIGNvc3BpOHNxcnQybWludXMxICsgcm91bmRpbmcpID4+IDE2KTsKLSAgICAgICAgYzEgPSB0ZW1wMSAtIHRlbXAyOwotCi0gICAgICAgIHRlbXAxID0gaXBbMV0gKyAoKGlwWzFdICogY29zcGk4c3FydDJtaW51czEgKyByb3VuZGluZykgPj4gMTYpOwotICAgICAgICB0ZW1wMiA9IChpcFszXSAqIHNpbnBpOHNxcnQyICsgcm91bmRpbmcpID4+IDE2OwotICAgICAgICBkMSA9IHRlbXAxICsgdGVtcDI7Ci0KLQotICAgICAgICBvcFswXSA9IChhMSArIGQxICsgNCkgPj4gMzsKLSAgICAgICAgb3BbM10gPSAoYTEgLSBkMSArIDQpID4+IDM7Ci0KLSAgICAgICAgb3BbMV0gPSAoYjEgKyBjMSArIDQpID4+IDM7Ci0gICAgICAgIG9wWzJdID0gKGIxIC0gYzEgKyA0KSA+PiAzOwotCi0gICAgICAgIGlwICs9IHNob3J0cGl0Y2g7Ci0gICAgICAgIG9wICs9IHNob3J0cGl0Y2g7Ci0gICAgfQotfQotCi12b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgYTE7Ci0gICAgc2hvcnQgKm9wID0gb3V0cHV0OwotICAgIGludCBzaG9ydHBpdGNoID0gcGl0Y2ggPj4gMTsKLSAgICBhMSA9ICgoaW5wdXRbMF0gKyA0KSA+PiAzKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBvcFswXSA9IGExOwotICAgICAgICBvcFsxXSA9IGExOwotICAgICAgICBvcFsyXSA9IGExOwotICAgICAgICBvcFszXSA9IGExOwotICAgICAgICBvcCArPSBzaG9ydHBpdGNoOwotICAgIH0KLX0KLQotdm9pZCB2cDhfZGNfb25seV9pZGN0X2FkZF9jKHNob3J0IGlucHV0X2RjLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHBpdGNoLCBpbnQgc3RyaWRlKQotewotICAgIGludCBhMSA9ICgoaW5wdXRfZGMgKyA0KSA+PiAzKTsKLSAgICBpbnQgciwgYzsKLQotICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYSA9IGExICsgcHJlZF9wdHJbY10gOwotCi0gICAgICAgICAgICBpZiAoYSA8IDApCi0gICAgICAgICAgICAgICAgYSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChhID4gMjU1KQotICAgICAgICAgICAgICAgIGEgPSAyNTU7Ci0KLSAgICAgICAgICAgIGRzdF9wdHJbY10gPSAodW5zaWduZWQgY2hhcikgYSA7Ci0gICAgICAgIH0KLQotICAgICAgICBkc3RfcHRyICs9IHN0cmlkZTsKLSAgICAgICAgcHJlZF9wdHIgKz0gcGl0Y2g7Ci0gICAgfQotCi19Ci0KLXZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgYTEsIGIxLCBjMSwgZDE7Ci0gICAgaW50IGEyLCBiMiwgYzIsIGQyOwotICAgIHNob3J0ICppcCA9IGlucHV0OwotICAgIHNob3J0ICpvcCA9IG91dHB1dDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBhMSA9IGlwWzBdICsgaXBbMTJdOwotICAgICAgICBiMSA9IGlwWzRdICsgaXBbOF07Ci0gICAgICAgIGMxID0gaXBbNF0gLSBpcFs4XTsKLSAgICAgICAgZDEgPSBpcFswXSAtIGlwWzEyXTsKLQotICAgICAgICBvcFswXSA9IGExICsgYjE7Ci0gICAgICAgIG9wWzRdID0gYzEgKyBkMTsKLSAgICAgICAgb3BbOF0gPSBhMSAtIGIxOwotICAgICAgICBvcFsxMl0gPSBkMSAtIGMxOwotICAgICAgICBpcCsrOwotICAgICAgICBvcCsrOwotICAgIH0KLQotICAgIGlwID0gb3V0cHV0OwotICAgIG9wID0gb3V0cHV0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGExID0gaXBbMF0gKyBpcFszXTsKLSAgICAgICAgYjEgPSBpcFsxXSArIGlwWzJdOwotICAgICAgICBjMSA9IGlwWzFdIC0gaXBbMl07Ci0gICAgICAgIGQxID0gaXBbMF0gLSBpcFszXTsKLQotICAgICAgICBhMiA9IGExICsgYjE7Ci0gICAgICAgIGIyID0gYzEgKyBkMTsKLSAgICAgICAgYzIgPSBhMSAtIGIxOwotICAgICAgICBkMiA9IGQxIC0gYzE7Ci0KLSAgICAgICAgb3BbMF0gPSAoYTIgKyAzKSA+PiAzOwotICAgICAgICBvcFsxXSA9IChiMiArIDMpID4+IDM7Ci0gICAgICAgIG9wWzJdID0gKGMyICsgMykgPj4gMzsKLSAgICAgICAgb3BbM10gPSAoZDIgKyAzKSA+PiAzOwotCi0gICAgICAgIGlwICs9IDQ7Ci0gICAgICAgIG9wICs9IDQ7Ci0gICAgfQotfQotCi12b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgYTE7Ci0gICAgc2hvcnQgKm9wID0gb3V0cHV0OwotCi0gICAgYTEgPSAoKGlucHV0WzBdICsgMykgPj4gMyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgb3BbMF0gPSBhMTsKLSAgICAgICAgb3BbMV0gPSBhMTsKLSAgICAgICAgb3BbMl0gPSBhMTsKLSAgICAgICAgb3BbM10gPSBhMTsKLSAgICAgICAgb3AgKz0gNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2ludnRyYW5zLmMgYi92cDgvY29tbW9uL2ludnRyYW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTNmMmQuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9pbnZ0cmFucy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJpbnZ0cmFucy5oIgotCi0KLQotc3RhdGljIHZvaWQgcmVjb25fZGNibG9jayhNQUNST0JMT0NLRCAqeCkKLXsKLSAgICBCTE9DS0QgKmIgPSAmeC0+YmxvY2tbMjRdOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICB4LT5ibG9ja1tpXS5kcWNvZWZmWzBdID0gYi0+ZGlmZltpXTsKLSAgICB9Ci0KLX0KLQotdm9pZCB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fYihjb25zdCB2cDhfaWRjdF9ydGNkX3Z0YWJsZV90ICpydGNkLCBCTE9DS0QgKmIsIGludCBwaXRjaCkKLXsKLSAgICBpZiAoYi0+ZW9iID4gMSkKLSAgICAgICAgSURDVF9JTlZPS0UocnRjZCwgaWRjdDE2KShiLT5kcWNvZWZmLCBiLT5kaWZmLCBwaXRjaCk7Ci0gICAgZWxzZQotICAgICAgICBJRENUX0lOVk9LRShydGNkLCBpZGN0MSkoYi0+ZHFjb2VmZiwgYi0+ZGlmZiwgcGl0Y2gpOwotfQotCi0KLXZvaWQgdnA4X2ludmVyc2VfdHJhbnNmb3JtX21ieShjb25zdCB2cDhfaWRjdF9ydGNkX3Z0YWJsZV90ICpydGNkLCBNQUNST0JMT0NLRCAqeCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIGRvIDJuZCBvcmRlciB0cmFuc2Zvcm0gb24gdGhlIGRjIGJsb2NrICovCi0gICAgSURDVF9JTlZPS0UocnRjZCwgaXdhbHNoMTYpKHgtPmJsb2NrWzI0XS5kcWNvZWZmLCB4LT5ibG9ja1syNF0uZGlmZik7Ci0KLSAgICByZWNvbl9kY2Jsb2NrKHgpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fYihydGNkLCAmeC0+YmxvY2tbaV0sIDMyKTsKLSAgICB9Ci0KLX0KLXZvaWQgdnA4X2ludmVyc2VfdHJhbnNmb3JtX21idXYoY29uc3QgdnA4X2lkY3RfcnRjZF92dGFibGVfdCAqcnRjZCwgTUFDUk9CTE9DS0QgKngpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpKyspCi0gICAgewotICAgICAgICB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fYihydGNkLCAmeC0+YmxvY2tbaV0sIDE2KTsKLSAgICB9Ci0KLX0KLQotCi12b2lkIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYihjb25zdCB2cDhfaWRjdF9ydGNkX3Z0YWJsZV90ICpydGNkLCBNQUNST0JMT0NLRCAqeCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCAmJgotICAgICAgICB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgewotICAgICAgICAvKiBkbyAybmQgb3JkZXIgdHJhbnNmb3JtIG9uIHRoZSBkYyBibG9jayAqLwotCi0gICAgICAgIElEQ1RfSU5WT0tFKHJ0Y2QsIGl3YWxzaDE2KSgmeC0+YmxvY2tbMjRdLmRxY29lZmZbMF0sIHgtPmJsb2NrWzI0XS5kaWZmKTsKLSAgICAgICAgcmVjb25fZGNibG9jayh4KTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9iKHJ0Y2QsICZ4LT5ibG9ja1tpXSwgMzIpOwotICAgIH0KLQotCi0gICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSsrKQotICAgIHsKLSAgICAgICAgdnA4X2ludmVyc2VfdHJhbnNmb3JtX2IocnRjZCwgJngtPmJsb2NrW2ldLCAxNik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2ludnRyYW5zLmggYi92cDgvY29tbW9uL2ludnRyYW5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmZiNzAuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9pbnZ0cmFucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfSU5WVFJBTlNfSAotI2RlZmluZSBfX0lOQ19JTlZUUkFOU19ICi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAiaWRjdC5oIgotI2luY2x1ZGUgImJsb2NrZC5oIgotZXh0ZXJuIHZvaWQgdnA4X2ludmVyc2VfdHJhbnNmb3JtX2IoY29uc3QgdnA4X2lkY3RfcnRjZF92dGFibGVfdCAqcnRjZCwgQkxPQ0tEICpiLCBpbnQgcGl0Y2gpOwotZXh0ZXJuIHZvaWQgdnA4X2ludmVyc2VfdHJhbnNmb3JtX21iKGNvbnN0IHZwOF9pZGN0X3J0Y2RfdnRhYmxlX3QgKnJ0Y2QsIE1BQ1JPQkxPQ0tEICp4KTsKLWV4dGVybiB2b2lkIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYnkoY29uc3QgdnA4X2lkY3RfcnRjZF92dGFibGVfdCAqcnRjZCwgTUFDUk9CTE9DS0QgKngpOwotZXh0ZXJuIHZvaWQgdnA4X2ludmVyc2VfdHJhbnNmb3JtX21idXYoY29uc3QgdnA4X2lkY3RfcnRjZF92dGFibGVfdCAqcnRjZCwgTUFDUk9CTE9DS0QgKngpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbGl0dGxlbmQuaCBiL3ZwOC9jb21tb24vbGl0dGxlbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkZjExNi4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL2xpdHRsZW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfbGl0dGxlbmRfaAotI2RlZmluZSBfbGl0dGxlbmRfaAotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgaW52ZXJ0Mih4KSAoeCkKLSNkZWZpbmUgaW52ZXJ0NCh4KSAoeCkKLQotI2RlZmluZSBsb3dfYnl0ZSh4KSAodW5zaWduZWQgY2hhcil4Ci0jZGVmaW5lIG1pZDFCeXRlKHgpICh1bnNpZ25lZCBjaGFyKSh4ID4+IDgpCi0jZGVmaW5lIG1pZDJCeXRlKHgpICh1bnNpZ25lZCBjaGFyKSh4ID4+IDE2KQotI2RlZmluZSBoaWdoX2J5dGUoeCkgKHVuc2lnbmVkIGNoYXIpKHggPj4gMjQpCi0KLSNkZWZpbmUgU1dBUEVORFMgMAotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbG9vcGZpbHRlci5jIGIvdnA4L2NvbW1vbi9sb29wZmlsdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzViNzcuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9sb29wZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAibG9vcGZpbHRlci5oIgotI2luY2x1ZGUgIm9ueXhjX2ludC5oIgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWM7Ci0KLQotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jKTsKLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2MpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2MpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKTsKLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2MpOwotCi0vKiBIb3Jpem9udGFsIE1CIGZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jKHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jKHVfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh2X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLX0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoc19jKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotLyogVmVydGljYWwgTUIgRmlsdGVyaW5nICovCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZfYyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYyh1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLQotICAgIGlmICh2X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKHZfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZzX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfYyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2MoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jKHlfcHRyICsgOCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyh1X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX2Modl9wdHIgKyA0ICogdXZfc3RyaWRlLCB1dl9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLX0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhzX2ModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHVfcHRyOwotICAgICh2b2lkKSB2X3B0cjsKLSAgICAodm9pZCkgdXZfc3RyaWRlOwotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9jKHlfcHRyICsgNCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX2MoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYyh5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci19Ci0KLS8qIFZlcnRpY2FsIEIgRmlsdGVyaW5nICovCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9idl9jKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIgKyA0LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIgKyA4LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYyh1X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKHZfcHRyICsgNCwgdXZfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMSk7Ci19Ci0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2c19jKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX2MoeV9wdHIgKyA0LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jKHlfcHRyICsgOCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfYyh5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotCi12b2lkIHZwOF9pbml0X2xvb3BfZmlsdGVyKFZQOF9DT01NT04gKmNtKQotewotICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSA9IGNtLT5sZl9pbmZvOwotICAgIExPT1BGSUxURVJUWVBFIGxmdCA9IGNtLT5maWx0ZXJfdHlwZTsKLSAgICBpbnQgc2hhcnBuZXNzX2x2bCA9IGNtLT5zaGFycG5lc3NfbGV2ZWw7Ci0gICAgaW50IGZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKLSAgICBpbnQgaSwgajsKLQotICAgIGludCBibG9ja19pbnNpZGVfbGltaXQgPSAwOwotICAgIGludCBIRVZUaHJlc2g7Ci0KLSAgICAvKiBGb3IgZWFjaCBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGxvb3AgZmlsdGVyIGZpbGwgb3V0IGEgImxvb3BfZmlsdGVyX2luZm8iIGVudHJ5LiAqLwotICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPT1BfRklMVEVSOyBpKyspCi0gICAgewotICAgICAgICBpbnQgZmlsdF9sdmwgPSBpOwotCi0gICAgICAgIGlmIChmcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpbHRfbHZsID49IDQwKQotICAgICAgICAgICAgICAgIEhFVlRocmVzaCA9IDI7Ci0gICAgICAgICAgICBlbHNlIGlmIChmaWx0X2x2bCA+PSAxNSkKLSAgICAgICAgICAgICAgICBIRVZUaHJlc2ggPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEhFVlRocmVzaCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmlsdF9sdmwgPj0gNDApCi0gICAgICAgICAgICAgICAgSEVWVGhyZXNoID0gMzsKLSAgICAgICAgICAgIGVsc2UgaWYgKGZpbHRfbHZsID49IDIwKQotICAgICAgICAgICAgICAgIEhFVlRocmVzaCA9IDI7Ci0gICAgICAgICAgICBlbHNlIGlmIChmaWx0X2x2bCA+PSAxNSkKLSAgICAgICAgICAgICAgICBIRVZUaHJlc2ggPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEhFVlRocmVzaCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTZXQgbG9vcCBmaWx0ZXIgcGFyYW1hZXRlcnMgdGhhdCBjb250cm9sIHNoYXJwbmVzcy4gKi8KLSAgICAgICAgYmxvY2tfaW5zaWRlX2xpbWl0ID0gZmlsdF9sdmwgPj4gKHNoYXJwbmVzc19sdmwgPiAwKTsKLSAgICAgICAgYmxvY2tfaW5zaWRlX2xpbWl0ID0gYmxvY2tfaW5zaWRlX2xpbWl0ID4+IChzaGFycG5lc3NfbHZsID4gNCk7Ci0KLSAgICAgICAgaWYgKHNoYXJwbmVzc19sdmwgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmxvY2tfaW5zaWRlX2xpbWl0ID4gKDkgLSBzaGFycG5lc3NfbHZsKSkKLSAgICAgICAgICAgICAgICBibG9ja19pbnNpZGVfbGltaXQgPSAoOSAtIHNoYXJwbmVzc19sdmwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJsb2NrX2luc2lkZV9saW1pdCA8IDEpCi0gICAgICAgICAgICBibG9ja19pbnNpZGVfbGltaXQgPSAxOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZmlbaV0ubGltW2pdID0gYmxvY2tfaW5zaWRlX2xpbWl0OwotICAgICAgICAgICAgbGZpW2ldLm1iZmxpbVtqXSA9IGZpbHRfbHZsICsgMjsKLSAgICAgICAgICAgIGxmaVtpXS5mbGltW2pdID0gZmlsdF9sdmw7Ci0gICAgICAgICAgICBsZmlbaV0udGhyW2pdID0gSEVWVGhyZXNoOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBTZXQgdXAgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBsb29wIGZpbHRlcmluZyBzZWxlY3RlZCAqLwotICAgIGlmIChsZnQgPT0gTk9STUFMX0xPT1BGSUxURVIpCi0gICAgewotICAgICAgICBjbS0+bGZfbWJ2ID0gTEZfSU5WT0tFKCZjbS0+cnRjZC5sb29wZmlsdGVyLCBub3JtYWxfbWJfdik7Ci0gICAgICAgIGNtLT5sZl9idiAgPSBMRl9JTlZPS0UoJmNtLT5ydGNkLmxvb3BmaWx0ZXIsIG5vcm1hbF9iX3YpOwotICAgICAgICBjbS0+bGZfbWJoID0gTEZfSU5WT0tFKCZjbS0+cnRjZC5sb29wZmlsdGVyLCBub3JtYWxfbWJfaCk7Ci0gICAgICAgIGNtLT5sZl9iaCAgPSBMRl9JTlZPS0UoJmNtLT5ydGNkLmxvb3BmaWx0ZXIsIG5vcm1hbF9iX2gpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjbS0+bGZfbWJ2ID0gTEZfSU5WT0tFKCZjbS0+cnRjZC5sb29wZmlsdGVyLCBzaW1wbGVfbWJfdik7Ci0gICAgICAgIGNtLT5sZl9idiAgPSBMRl9JTlZPS0UoJmNtLT5ydGNkLmxvb3BmaWx0ZXIsIHNpbXBsZV9iX3YpOwotICAgICAgICBjbS0+bGZfbWJoID0gTEZfSU5WT0tFKCZjbS0+cnRjZC5sb29wZmlsdGVyLCBzaW1wbGVfbWJfaCk7Ci0gICAgICAgIGNtLT5sZl9iaCAgPSBMRl9JTlZPS0UoJmNtLT5ydGNkLmxvb3BmaWx0ZXIsIHNpbXBsZV9iX2gpOwotICAgIH0KLX0KLQotLyogUHV0IHZwOF9pbml0X2xvb3BfZmlsdGVyKCkgaW4gdnA4ZHhfY3JlYXRlX2RlY29tcHJlc3NvcigpLiBPbmx5IGNhbGwgdnA4X2ZyYW1lX2luaXRfbG9vcF9maWx0ZXIoKSB3aGlsZSBkZWNvZGluZwotICogZWFjaCBmcmFtZS4gQ2hlY2sgbGFzdF9mcmFtZV90eXBlIHRvIHNraXAgdGhlIGZ1bmN0aW9uIG1vc3Qgb2YgdGltZXMuCi0gKi8KLXZvaWQgdnA4X2ZyYW1lX2luaXRfbG9vcF9maWx0ZXIobG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgZnJhbWVfdHlwZSkKLXsKLSAgICBpbnQgSEVWVGhyZXNoOwotICAgIGludCBpLCBqOwotCi0gICAgLyogRm9yIGVhY2ggcG9zc2libGUgdmFsdWUgZm9yIHRoZSBsb29wIGZpbHRlciBmaWxsIG91dCBhICJsb29wX2ZpbHRlcl9pbmZvIiBlbnRyeS4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT09QX0ZJTFRFUjsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IGZpbHRfbHZsID0gaTsKLQotICAgICAgICBpZiAoZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmaWx0X2x2bCA+PSA0MCkKLSAgICAgICAgICAgICAgICBIRVZUaHJlc2ggPSAyOwotICAgICAgICAgICAgZWxzZSBpZiAoZmlsdF9sdmwgPj0gMTUpCi0gICAgICAgICAgICAgICAgSEVWVGhyZXNoID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBIRVZUaHJlc2ggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpbHRfbHZsID49IDQwKQotICAgICAgICAgICAgICAgIEhFVlRocmVzaCA9IDM7Ci0gICAgICAgICAgICBlbHNlIGlmIChmaWx0X2x2bCA+PSAyMCkKLSAgICAgICAgICAgICAgICBIRVZUaHJlc2ggPSAyOwotICAgICAgICAgICAgZWxzZSBpZiAoZmlsdF9sdmwgPj0gMTUpCi0gICAgICAgICAgICAgICAgSEVWVGhyZXNoID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBIRVZUaHJlc2ggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbGZpW2ldLmxpbVtqXSA9IGJsb2NrX2luc2lkZV9saW1pdDsKLSAgICAgICAgICAgIGxmaVtpXS5tYmZsaW1bal0gPSBmaWx0X2x2bCsyOyovCi0gICAgICAgICAgICAvKmxmaVtpXS5mbGltW2pdID0gZmlsdF9sdmw7Ki8KLSAgICAgICAgICAgIGxmaVtpXS50aHJbal0gPSBIRVZUaHJlc2g7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotaW50IHZwOF9hZGp1c3RfbWJfbGZfdmFsdWUoTUFDUk9CTE9DS0QgKm1iZCwgaW50IGZpbHRlcl9sZXZlbCkKLXsKLSAgICBNQl9NT0RFX0lORk8gKm1ibWkgPSAmbWJkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaTsKLQotICAgIGlmIChtYmQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQpCi0gICAgewotICAgICAgICAvKiBBcHBseSBkZWx0YSBmb3IgcmVmZXJlbmNlIGZyYW1lICovCi0gICAgICAgIGZpbHRlcl9sZXZlbCArPSBtYmQtPnJlZl9sZl9kZWx0YXNbbWJtaS0+cmVmX2ZyYW1lXTsKLQotICAgICAgICAvKiBBcHBseSBkZWx0YSBmb3IgbW9kZSAqLwotICAgICAgICBpZiAobWJtaS0+cmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPbmx5IHRoZSBzcGxpdCBtb2RlIEJQUkVEIGhhcyBhIGZ1cnRoZXIgc3BlY2lhbCBjYXNlICovCi0gICAgICAgICAgICBpZiAobWJtaS0+bW9kZSA9PSBCX1BSRUQpCi0gICAgICAgICAgICAgICAgZmlsdGVyX2xldmVsICs9ICBtYmQtPm1vZGVfbGZfZGVsdGFzWzBdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogWmVybyBtb3Rpb24gbW9kZSAqLwotICAgICAgICAgICAgaWYgKG1ibWktPm1vZGUgPT0gWkVST01WKQotICAgICAgICAgICAgICAgIGZpbHRlcl9sZXZlbCArPSAgbWJkLT5tb2RlX2xmX2RlbHRhc1sxXTsKLQotICAgICAgICAgICAgLyogU3BsaXQgTUIgbW90aW9uIG1vZGUgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKG1ibWktPm1vZGUgPT0gU1BMSVRNVikKLSAgICAgICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgKz0gIG1iZC0+bW9kZV9sZl9kZWx0YXNbM107Ci0KLSAgICAgICAgICAgIC8qIEFsbCBvdGhlciBpbnRlciBtb3Rpb24gbW9kZXMgKE5lYXJlc3QsIE5lYXIsIE5ldykgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgKz0gIG1iZC0+bW9kZV9sZl9kZWx0YXNbMl07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSYW5nZSBjaGVjayAqLwotICAgICAgICBpZiAoZmlsdGVyX2xldmVsID4gTUFYX0xPT1BfRklMVEVSKQotICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gTUFYX0xPT1BfRklMVEVSOwotICAgICAgICBlbHNlIGlmIChmaWx0ZXJfbGV2ZWwgPCAwKQotICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbHRlcl9sZXZlbDsKLX0KLQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9mcmFtZQotKAotICAgIFZQOF9DT01NT04gKmNtLAotICAgIE1BQ1JPQkxPQ0tEICptYmQsCi0gICAgaW50IGRlZmF1bHRfZmlsdF9sdmwKLSkKLXsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnBvc3QgPSBjbS0+ZnJhbWVfdG9fc2hvdzsKLSAgICBsb29wX2ZpbHRlcl9pbmZvICpsZmkgPSBjbS0+bGZfaW5mbzsKLSAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKLQotICAgIGludCBtYl9yb3c7Ci0gICAgaW50IG1iX2NvbDsKLQotCi0gICAgaW50IGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtNQVhfTUJfU0VHTUVOVFNdOwotICAgIGludCBmaWx0ZXJfbGV2ZWw7Ci0gICAgaW50IGFsdF9mbHRfZW5hYmxlZCA9IG1iZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQ7Ci0KLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICp5X3B0ciwgKnVfcHRyLCAqdl9wdHI7Ci0KLSAgICBtYmQtPm1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pOyAgICAgICAgICAvKiBQb2ludCBhdCBiYXNlIG9mIE1iIE1PREVfSU5GTyBsaXN0ICovCi0KLSAgICAvKiBOb3RlIHRoZSBiYXNlbGluZSBmaWx0ZXIgdmFsdWVzIGZvciBlYWNoIHNlZ21lbnQgKi8KLSAgICBpZiAoYWx0X2ZsdF9lbmFibGVkKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBYnMgdmFsdWUgKi8KLSAgICAgICAgICAgIGlmIChtYmQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEpCi0gICAgICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVtpXTsKLSAgICAgICAgICAgIC8qIERlbHRhIFZhbHVlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gZGVmYXVsdF9maWx0X2x2bCArIG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1baV07Ci0gICAgICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gKGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA+PSAwKSA/ICgoYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldIDw9IE1BWF9MT09QX0ZJTFRFUikgPyBiYXNlbGluZV9maWx0ZXJfbGV2ZWxbaV0gOiBNQVhfTE9PUF9GSUxURVIpIDogMDsgIC8qIENsYW1wIHRvIHZhbGlkIHJhbmdlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgaSsrKQotICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gZGVmYXVsdF9maWx0X2x2bDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBsb29wIGZpbHRlciBmb3IgdGhpcyBmcmFtZS4gKi8KLSAgICBpZiAoKGNtLT5sYXN0X2ZpbHRlcl90eXBlICE9IGNtLT5maWx0ZXJfdHlwZSkgfHwgKGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCAhPSBjbS0+c2hhcnBuZXNzX2xldmVsKSkKLSAgICAgICAgdnA4X2luaXRfbG9vcF9maWx0ZXIoY20pOwotICAgIGVsc2UgaWYgKGZyYW1lX3R5cGUgIT0gY20tPmxhc3RfZnJhbWVfdHlwZSkKLSAgICAgICAgdnA4X2ZyYW1lX2luaXRfbG9vcF9maWx0ZXIobGZpLCBmcmFtZV90eXBlKTsKLQotICAgIC8qIFNldCB1cCB0aGUgYnVmZmVyIHBvaW50ZXJzICovCi0gICAgeV9wdHIgPSBwb3N0LT55X2J1ZmZlcjsKLSAgICB1X3B0ciA9IHBvc3QtPnVfYnVmZmVyOwotICAgIHZfcHRyID0gcG9zdC0+dl9idWZmZXI7Ci0KLSAgICAvKiB2cDhfZmlsdGVyIGVhY2ggbWFjcm8gYmxvY2sgKi8KLSAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3crKykKLSAgICB7Ci0gICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgU2VnbWVudCA9IChhbHRfZmx0X2VuYWJsZWQpID8gbWJkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkIDogMDsKLQotICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gYmFzZWxpbmVfZmlsdGVyX2xldmVsW1NlZ21lbnRdOwotCi0gICAgICAgICAgICAvKiBEaXN0YW5jZSBvZiBNYiB0byB0aGUgdmFyaW91cyBpbWFnZSBlZGdlcy4KLSAgICAgICAgICAgICAqIFRoZXNlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZCB0byB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCi0gICAgICAgICAgICAgKiBBcHBseSBhbnkgY29udGV4dCBkcml2ZW4gTUIgbGV2ZWwgYWRqdXN0bWVudAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgPSB2cDhfYWRqdXN0X21iX2xmX3ZhbHVlKG1iZCwgZmlsdGVyX2xldmVsKTsKLQotICAgICAgICAgICAgaWYgKGZpbHRlcl9sZXZlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKLSAgICAgICAgICAgICAgICAgICAgY20tPmxmX21idih5X3B0ciwgdV9wdHIsIHZfcHRyLCBwb3N0LT55X3N0cmlkZSwgcG9zdC0+dXZfc3RyaWRlLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIGNtLT5zaW1wbGVyX2xwZik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWJkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID4gMCkKLSAgICAgICAgICAgICAgICAgICAgY20tPmxmX2J2KHlfcHRyLCB1X3B0ciwgdl9wdHIsIHBvc3QtPnlfc3RyaWRlLCBwb3N0LT51dl9zdHJpZGUsICZsZmlbZmlsdGVyX2xldmVsXSwgY20tPnNpbXBsZXJfbHBmKTsKLQotICAgICAgICAgICAgICAgIC8qIGRvbid0IGFwcGx5IGFjcm9zcyB1bXYgYm9yZGVyICovCi0gICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCi0gICAgICAgICAgICAgICAgICAgIGNtLT5sZl9tYmgoeV9wdHIsIHVfcHRyLCB2X3B0ciwgcG9zdC0+eV9zdHJpZGUsIHBvc3QtPnV2X3N0cmlkZSwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCBjbS0+c2ltcGxlcl9scGYpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1iZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA+IDApCi0gICAgICAgICAgICAgICAgICAgIGNtLT5sZl9iaCh5X3B0ciwgdV9wdHIsIHZfcHRyLCBwb3N0LT55X3N0cmlkZSwgcG9zdC0+dXZfc3RyaWRlLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIGNtLT5zaW1wbGVyX2xwZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHlfcHRyICs9IDE2OwotICAgICAgICAgICAgdV9wdHIgKz0gODsKLSAgICAgICAgICAgIHZfcHRyICs9IDg7Ci0KLSAgICAgICAgICAgIG1iZC0+bW9kZV9pbmZvX2NvbnRleHQrKzsgICAgIC8qIHN0ZXAgdG8gbmV4dCBNQiAqLwotICAgICAgICB9Ci0KLSAgICAgICAgeV9wdHIgKz0gcG9zdC0+eV9zdHJpZGUgICogMTYgLSBwb3N0LT55X3dpZHRoOwotICAgICAgICB1X3B0ciArPSBwb3N0LT51dl9zdHJpZGUgKiAgOCAtIHBvc3QtPnV2X3dpZHRoOwotICAgICAgICB2X3B0ciArPSBwb3N0LT51dl9zdHJpZGUgKiAgOCAtIHBvc3QtPnV2X3dpZHRoOwotCi0gICAgICAgIG1iZC0+bW9kZV9pbmZvX2NvbnRleHQrKzsgICAgICAgICAvKiBTa2lwIGJvcmRlciBtYiAqLwotICAgIH0KLX0KLQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9mcmFtZV95b25seQotKAotICAgIFZQOF9DT01NT04gKmNtLAotICAgIE1BQ1JPQkxPQ0tEICptYmQsCi0gICAgaW50IGRlZmF1bHRfZmlsdF9sdmwsCi0gICAgaW50IHNoYXJwbmVzc19sdmwKLSkKLXsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnBvc3QgPSBjbS0+ZnJhbWVfdG9fc2hvdzsKLQotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnlfcHRyOwotICAgIGludCBtYl9yb3c7Ci0gICAgaW50IG1iX2NvbDsKLQotICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSA9IGNtLT5sZl9pbmZvOwotICAgIGludCBiYXNlbGluZV9maWx0ZXJfbGV2ZWxbTUFYX01CX1NFR01FTlRTXTsKLSAgICBpbnQgZmlsdGVyX2xldmVsOwotICAgIGludCBhbHRfZmx0X2VuYWJsZWQgPSBtYmQtPnNlZ21lbnRhdGlvbl9lbmFibGVkOwotICAgIEZSQU1FX1RZUEUgZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOwotCi0gICAgKHZvaWQpIHNoYXJwbmVzc19sdmw7Ci0KLSAgICAvKk1PREVfSU5GTyAqIHRoaXNfbWJfbW9kZV9pbmZvID0gY20tPm1pOyovIC8qIFBvaW50IGF0IGJhc2Ugb2YgTWIgTU9ERV9JTkZPIGxpc3QgKi8KLSAgICBtYmQtPm1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pOyAgICAgICAgICAvKiBQb2ludCBhdCBiYXNlIG9mIE1iIE1PREVfSU5GTyBsaXN0ICovCi0KLSAgICAvKiBOb3RlIHRoZSBiYXNlbGluZSBmaWx0ZXIgdmFsdWVzIGZvciBlYWNoIHNlZ21lbnQgKi8KLSAgICBpZiAoYWx0X2ZsdF9lbmFibGVkKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBYnMgdmFsdWUgKi8KLSAgICAgICAgICAgIGlmIChtYmQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEpCi0gICAgICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVtpXTsKLSAgICAgICAgICAgIC8qIERlbHRhIFZhbHVlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gZGVmYXVsdF9maWx0X2x2bCArIG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1baV07Ci0gICAgICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gKGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA+PSAwKSA/ICgoYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldIDw9IE1BWF9MT09QX0ZJTFRFUikgPyBiYXNlbGluZV9maWx0ZXJfbGV2ZWxbaV0gOiBNQVhfTE9PUF9GSUxURVIpIDogMDsgIC8qIENsYW1wIHRvIHZhbGlkIHJhbmdlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQl9TRUdNRU5UUzsgaSsrKQotICAgICAgICAgICAgYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gZGVmYXVsdF9maWx0X2x2bDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBsb29wIGZpbHRlciBmb3IgdGhpcyBmcmFtZS4gKi8KLSAgICBpZiAoKGNtLT5sYXN0X2ZpbHRlcl90eXBlICE9IGNtLT5maWx0ZXJfdHlwZSkgfHwgKGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCAhPSBjbS0+c2hhcnBuZXNzX2xldmVsKSkKLSAgICAgICAgdnA4X2luaXRfbG9vcF9maWx0ZXIoY20pOwotICAgIGVsc2UgaWYgKGZyYW1lX3R5cGUgIT0gY20tPmxhc3RfZnJhbWVfdHlwZSkKLSAgICAgICAgdnA4X2ZyYW1lX2luaXRfbG9vcF9maWx0ZXIobGZpLCBmcmFtZV90eXBlKTsKLQotICAgIC8qIFNldCB1cCB0aGUgYnVmZmVyIHBvaW50ZXJzICovCi0gICAgeV9wdHIgPSBwb3N0LT55X2J1ZmZlcjsKLQotICAgIC8qIHZwOF9maWx0ZXIgZWFjaCBtYWNybyBibG9jayAqLwotICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdysrKQotICAgIHsKLSAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBTZWdtZW50ID0gKGFsdF9mbHRfZW5hYmxlZCkgPyBtYmQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgOiAwOwotICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gYmFzZWxpbmVfZmlsdGVyX2xldmVsW1NlZ21lbnRdOwotCi0gICAgICAgICAgICAvKiBBcHBseSBhbnkgY29udGV4dCBkcml2ZW4gTUIgbGV2ZWwgYWRqdXN0bWVudCAqLwotICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gdnA4X2FkanVzdF9tYl9sZl92YWx1ZShtYmQsIGZpbHRlcl9sZXZlbCk7Ci0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJfbGV2ZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1iX2NvbCA+IDApCi0gICAgICAgICAgICAgICAgICAgIGNtLT5sZl9tYnYoeV9wdHIsIDAsIDAsIHBvc3QtPnlfc3RyaWRlLCAwLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIDApOwotCi0gICAgICAgICAgICAgICAgaWYgKG1iZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA+IDApCi0gICAgICAgICAgICAgICAgICAgIGNtLT5sZl9idih5X3B0ciwgMCwgMCwgcG9zdC0+eV9zdHJpZGUsIDAsICZsZmlbZmlsdGVyX2xldmVsXSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBkb24ndCBhcHBseSBhY3Jvc3MgdW12IGJvcmRlciAqLwotICAgICAgICAgICAgICAgIGlmIChtYl9yb3cgPiAwKQotICAgICAgICAgICAgICAgICAgICBjbS0+bGZfbWJoKHlfcHRyLCAwLCAwLCBwb3N0LT55X3N0cmlkZSwgMCwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYmQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmRjX2RpZmYgPiAwKQotICAgICAgICAgICAgICAgICAgICBjbS0+bGZfYmgoeV9wdHIsIDAsIDAsIHBvc3QtPnlfc3RyaWRlLCAwLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB5X3B0ciArPSAxNjsKLSAgICAgICAgICAgIG1iZC0+bW9kZV9pbmZvX2NvbnRleHQgKys7ICAgICAgICAvKiBzdGVwIHRvIG5leHQgTUIgKi8KLQotICAgICAgICB9Ci0KLSAgICAgICAgeV9wdHIgKz0gcG9zdC0+eV9zdHJpZGUgICogMTYgLSBwb3N0LT55X3dpZHRoOwotICAgICAgICBtYmQtPm1vZGVfaW5mb19jb250ZXh0ICsrOyAgICAgICAgICAgIC8qIFNraXAgYm9yZGVyIG1iICovCi0gICAgfQotCi19Ci0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfcGFydGlhbF9mcmFtZQotKAotICAgIFZQOF9DT01NT04gKmNtLAotICAgIE1BQ1JPQkxPQ0tEICptYmQsCi0gICAgaW50IGRlZmF1bHRfZmlsdF9sdmwsCi0gICAgaW50IHNoYXJwbmVzc19sdmwsCi0gICAgaW50IEZyYWN0aW9uCi0pCi17Ci0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gY20tPmZyYW1lX3RvX3Nob3c7Ci0KLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICp5X3B0cjsKLSAgICBpbnQgbWJfcm93OwotICAgIGludCBtYl9jb2w7Ci0gICAgLyppbnQgbWJfcm93cyA9IHBvc3QtPnlfaGVpZ2h0ID4+IDQ7Ki8KLSAgICBpbnQgbWJfY29scyA9IHBvc3QtPnlfd2lkdGggID4+IDQ7Ci0KLSAgICBpbnQgbGluZXN0b2NvcHk7Ci0KLSAgICBsb29wX2ZpbHRlcl9pbmZvICpsZmkgPSBjbS0+bGZfaW5mbzsKLSAgICBpbnQgYmFzZWxpbmVfZmlsdGVyX2xldmVsW01BWF9NQl9TRUdNRU5UU107Ci0gICAgaW50IGZpbHRlcl9sZXZlbDsKLSAgICBpbnQgYWx0X2ZsdF9lbmFibGVkID0gbWJkLT5zZWdtZW50YXRpb25fZW5hYmxlZDsKLSAgICBGUkFNRV9UWVBFIGZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKLQotICAgICh2b2lkKSBzaGFycG5lc3NfbHZsOwotCi0gICAgLypNT0RFX0lORk8gKiB0aGlzX21iX21vZGVfaW5mbyA9IGNtLT5taSArIChwb3N0LT55X2hlaWdodD4+NSkgKiAobWJfY29scyArIDEpOyovIC8qIFBvaW50IGF0IGJhc2Ugb2YgTWIgTU9ERV9JTkZPIGxpc3QgKi8KLSAgICBtYmQtPm1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pICsgKHBvc3QtPnlfaGVpZ2h0ID4+IDUpICogKG1iX2NvbHMgKyAxKTsgICAgICAgIC8qIFBvaW50IGF0IGJhc2Ugb2YgTWIgTU9ERV9JTkZPIGxpc3QgKi8KLQotICAgIGxpbmVzdG9jb3B5ID0gKHBvc3QtPnlfaGVpZ2h0ID4+ICg0ICsgRnJhY3Rpb24pKTsKLQotICAgIGlmIChsaW5lc3RvY29weSA8IDEpCi0gICAgICAgIGxpbmVzdG9jb3B5ID0gMTsKLQotICAgIGxpbmVzdG9jb3B5IDw8PSA0OwotCi0gICAgLyogTm90ZSB0aGUgYmFzZWxpbmUgZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBzZWdtZW50ICovCi0gICAgaWYgKGFsdF9mbHRfZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUJfU0VHTUVOVFM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWJzIHZhbHVlICovCi0gICAgICAgICAgICBpZiAobWJkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgPT0gU0VHTUVOVF9BQlNEQVRBKQotICAgICAgICAgICAgICAgIGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA9IG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1baV07Ci0gICAgICAgICAgICAvKiBEZWx0YSBWYWx1ZSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA9IGRlZmF1bHRfZmlsdF9sdmwgKyBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdW2ldOwotICAgICAgICAgICAgICAgIGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA9IChiYXNlbGluZV9maWx0ZXJfbGV2ZWxbaV0gPj0gMCkgPyAoKGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA8PSBNQVhfTE9PUF9GSUxURVIpID8gYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldIDogTUFYX0xPT1BfRklMVEVSKSA6IDA7ICAvKiBDbGFtcCB0byB2YWxpZCByYW5nZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUJfU0VHTUVOVFM7IGkrKykKLSAgICAgICAgICAgIGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA9IGRlZmF1bHRfZmlsdF9sdmw7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9vcCBmaWx0ZXIgZm9yIHRoaXMgZnJhbWUuICovCi0gICAgaWYgKChjbS0+bGFzdF9maWx0ZXJfdHlwZSAhPSBjbS0+ZmlsdGVyX3R5cGUpIHx8IChjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgIT0gY20tPnNoYXJwbmVzc19sZXZlbCkpCi0gICAgICAgIHZwOF9pbml0X2xvb3BfZmlsdGVyKGNtKTsKLSAgICBlbHNlIGlmIChmcmFtZV90eXBlICE9IGNtLT5sYXN0X2ZyYW1lX3R5cGUpCi0gICAgICAgIHZwOF9mcmFtZV9pbml0X2xvb3BfZmlsdGVyKGxmaSwgZnJhbWVfdHlwZSk7Ci0KLSAgICAvKiBTZXQgdXAgdGhlIGJ1ZmZlciBwb2ludGVycyAqLwotICAgIHlfcHRyID0gcG9zdC0+eV9idWZmZXIgKyAocG9zdC0+eV9oZWlnaHQgPj4gNSkgKiAxNiAqIHBvc3QtPnlfc3RyaWRlOwotCi0gICAgLyogdnA4X2ZpbHRlciBlYWNoIG1hY3JvIGJsb2NrICovCi0gICAgZm9yIChtYl9yb3cgPSAwOyBtYl9yb3c8KGxpbmVzdG9jb3B5ID4+IDQpOyBtYl9yb3crKykKLSAgICB7Ci0gICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgbWJfY29sczsgbWJfY29sKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBTZWdtZW50ID0gKGFsdF9mbHRfZW5hYmxlZCkgPyBtYmQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgOiAwOwotICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gYmFzZWxpbmVfZmlsdGVyX2xldmVsW1NlZ21lbnRdOwotCi0gICAgICAgICAgICBpZiAoZmlsdGVyX2xldmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtYl9jb2wgPiAwKQotICAgICAgICAgICAgICAgICAgICBjbS0+bGZfbWJ2KHlfcHRyLCAwLCAwLCBwb3N0LT55X3N0cmlkZSwgMCwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYmQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmRjX2RpZmYgPiAwKQotICAgICAgICAgICAgICAgICAgICBjbS0+bGZfYnYoeV9wdHIsIDAsIDAsIHBvc3QtPnlfc3RyaWRlLCAwLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIDApOwotCi0gICAgICAgICAgICAgICAgY20tPmxmX21iaCh5X3B0ciwgMCwgMCwgcG9zdC0+eV9zdHJpZGUsIDAsICZsZmlbZmlsdGVyX2xldmVsXSwgMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWJkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID4gMCkKLSAgICAgICAgICAgICAgICAgICAgY20tPmxmX2JoKHlfcHRyLCAwLCAwLCBwb3N0LT55X3N0cmlkZSwgMCwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeV9wdHIgKz0gMTY7Ci0gICAgICAgICAgICBtYmQtPm1vZGVfaW5mb19jb250ZXh0ICs9IDE7ICAgICAgLyogc3RlcCB0byBuZXh0IE1CICovCi0gICAgICAgIH0KLQotICAgICAgICB5X3B0ciArPSBwb3N0LT55X3N0cmlkZSAgKiAxNiAtIHBvc3QtPnlfd2lkdGg7Ci0gICAgICAgIG1iZC0+bW9kZV9pbmZvX2NvbnRleHQgKz0gMTsgICAgICAgICAgLyogU2tpcCBib3JkZXIgbWIgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL2xvb3BmaWx0ZXIuaCBiL3ZwOC9jb21tb24vbG9vcGZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTljNDI1Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbG9vcGZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIGxvb3BmaWx0ZXJfaAotI2RlZmluZSBsb29wZmlsdGVyX2gKLQotI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKLQotI2RlZmluZSBNQVhfTE9PUF9GSUxURVIgNjMKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTk9STUFMX0xPT1BGSUxURVIgPSAwLAotICAgIFNJTVBMRV9MT09QRklMVEVSID0gMQotfSBMT09QRklMVEVSVFlQRTsKLQotLyogRlJLCi0gKiBOZWVkIHRvIGFsaWduIHRoaXMgc3RydWN0dXJlIHNvIHdoZW4gaXQgaXMgZGVjbGFyZWQgYW5kCi0gKiBwYXNzZWQgaXQgY2FuIGJlIGxvYWRlZCBpbnRvIHZlY3RvciByZWdpc3RlcnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaWduZWQgY2hhciwgbGltWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaWduZWQgY2hhciwgZmxpbVsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2lnbmVkIGNoYXIsIHRoclsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2lnbmVkIGNoYXIsIG1iZmxpbVsxNl0pOwotfSBsb29wX2ZpbHRlcl9pbmZvOwotCi0KLSNkZWZpbmUgcHJvdG90eXBlX2xvb3BmaWx0ZXIoc3ltKSBcCi0gICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsXAotICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwgaW50IGNvdW50KQotCi0jZGVmaW5lIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHN5bSkgXAotICAgIHZvaWQgc3ltKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsXAotICAgICAgICAgICAgIGludCB5c3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvbG9vcGZpbHRlcl94ODYuaCIKLSNlbmRpZgotCi0jaWYgQVJDSF9BUk0KLSNpbmNsdWRlICJhcm0vbG9vcGZpbHRlcl9hcm0uaCIKLSNlbmRpZgotCi0jaWYgQVJDSF9NSVBTCi0jaWYgZGVmaW5lZChNSVBTX0RTUF9SRVYpICYmIE1JUFNfRFNQX1JFVj49MgotI2luY2x1ZGUgIm1pcHMvbG9vcGZpbHRlcl9taXBzLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIHZwOF9sZl9ub3JtYWxfbWJfdgotI2RlZmluZSB2cDhfbGZfbm9ybWFsX21iX3YgdnA4X2xvb3BfZmlsdGVyX21idl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbGZfbm9ybWFsX21iX3YpOwotCi0jaWZuZGVmIHZwOF9sZl9ub3JtYWxfYl92Ci0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfYl92IHZwOF9sb29wX2ZpbHRlcl9idl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbGZfbm9ybWFsX2Jfdik7Ci0KLSNpZm5kZWYgdnA4X2xmX25vcm1hbF9tYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfbWJfaCB2cDhfbG9vcF9maWx0ZXJfbWJoX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sZl9ub3JtYWxfbWJfaCk7Ci0KLSNpZm5kZWYgdnA4X2xmX25vcm1hbF9iX2gKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9iX2ggdnA4X2xvb3BfZmlsdGVyX2JoX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sZl9ub3JtYWxfYl9oKTsKLQotCi0jaWZuZGVmIHZwOF9sZl9zaW1wbGVfbWJfdgotI2RlZmluZSB2cDhfbGZfc2ltcGxlX21iX3YgdnA4X2xvb3BfZmlsdGVyX21idnNfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xmX3NpbXBsZV9tYl92KTsKLQotI2lmbmRlZiB2cDhfbGZfc2ltcGxlX2JfdgotI2RlZmluZSB2cDhfbGZfc2ltcGxlX2JfdiB2cDhfbG9vcF9maWx0ZXJfYnZzX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sZl9zaW1wbGVfYl92KTsKLQotI2lmbmRlZiB2cDhfbGZfc2ltcGxlX21iX2gKLSNkZWZpbmUgdnA4X2xmX3NpbXBsZV9tYl9oIHZwOF9sb29wX2ZpbHRlcl9tYmhzX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sZl9zaW1wbGVfbWJfaCk7Ci0KLSNpZm5kZWYgdnA4X2xmX3NpbXBsZV9iX2gKLSNkZWZpbmUgdnA4X2xmX3NpbXBsZV9iX2ggdnA4X2xvb3BfZmlsdGVyX2Joc19jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbGZfc2ltcGxlX2JfaCk7Ci0KLXR5cGVkZWYgcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2soKCp2cDhfbGZfYmxvY2tfZm5fdCkpOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB2cDhfbGZfYmxvY2tfZm5fdCAgbm9ybWFsX21iX3Y7Ci0gICAgdnA4X2xmX2Jsb2NrX2ZuX3QgIG5vcm1hbF9iX3Y7Ci0gICAgdnA4X2xmX2Jsb2NrX2ZuX3QgIG5vcm1hbF9tYl9oOwotICAgIHZwOF9sZl9ibG9ja19mbl90ICBub3JtYWxfYl9oOwotICAgIHZwOF9sZl9ibG9ja19mbl90ICBzaW1wbGVfbWJfdjsKLSAgICB2cDhfbGZfYmxvY2tfZm5fdCAgc2ltcGxlX2JfdjsKLSAgICB2cDhfbGZfYmxvY2tfZm5fdCAgc2ltcGxlX21iX2g7Ci0gICAgdnA4X2xmX2Jsb2NrX2ZuX3QgIHNpbXBsZV9iX2g7Ci19IHZwOF9sb29wZmlsdGVyX3J0Y2RfdnRhYmxlX3Q7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIExGX0lOVk9LRShjdHgsZm4pIChjdHgpLT5mbgotI2Vsc2UKLSNkZWZpbmUgTEZfSU5WT0tFKGN0eCxmbikgdnA4X2xmXyMjZm4KLSNlbmRpZgotCi10eXBlZGVmIHZvaWQgbG9vcF9maWx0ZXJfdXZmdW5jdGlvbgotKAotICAgIHVuc2lnbmVkIGNoYXIgKnUsICAgLyogc291cmNlIHBvaW50ZXIgKi8KLSAgICBpbnQgcCwgICAgICAgICAgICAgIC8qIHBpdGNoICovCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLSAgICB1bnNpZ25lZCBjaGFyICp2Ci0pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbG9vcGZpbHRlcl9maWx0ZXJzLmMgYi92cDgvY29tbW9uL2xvb3BmaWx0ZXJfZmlsdGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQwNTI5Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbG9vcGZpbHRlcl9maWx0ZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsb29wZmlsdGVyLmgiCi0jaW5jbHVkZSAib255eGNfaW50LmgiCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKLQotc3RhdGljIF9faW5saW5lIHNpZ25lZCBjaGFyIHZwOF9zaWduZWRfY2hhcl9jbGFtcChpbnQgdCkKLXsKLSAgICB0ID0gKHQgPCAtMTI4ID8gLTEyOCA6IHQpOwotICAgIHQgPSAodCA+IDEyNyA/IDEyNyA6IHQpOwotICAgIHJldHVybiAoc2lnbmVkIGNoYXIpIHQ7Ci19Ci0KLQotLyogc2hvdWxkIHdlIGFwcGx5IGFueSBmaWx0ZXIgYXQgYWxsICggMTExMTExMTEgeWVzLCAwMDAwMDAwMCBubykgKi8KLXN0YXRpYyBfX2lubGluZSBzaWduZWQgY2hhciB2cDhfZmlsdGVyX21hc2soc2lnbmVkIGNoYXIgbGltaXQsIHNpZ25lZCBjaGFyIGZsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YyBwMywgdWMgcDIsIHVjIHAxLCB1YyBwMCwgdWMgcTAsIHVjIHExLCB1YyBxMiwgdWMgcTMpCi17Ci0gICAgc2lnbmVkIGNoYXIgbWFzayA9IDA7Ci0gICAgbWFzayB8PSAoYWJzKHAzIC0gcDIpID4gbGltaXQpICogLTE7Ci0gICAgbWFzayB8PSAoYWJzKHAyIC0gcDEpID4gbGltaXQpICogLTE7Ci0gICAgbWFzayB8PSAoYWJzKHAxIC0gcDApID4gbGltaXQpICogLTE7Ci0gICAgbWFzayB8PSAoYWJzKHExIC0gcTApID4gbGltaXQpICogLTE7Ci0gICAgbWFzayB8PSAoYWJzKHEyIC0gcTEpID4gbGltaXQpICogLTE7Ci0gICAgbWFzayB8PSAoYWJzKHEzIC0gcTIpID4gbGltaXQpICogLTE7Ci0gICAgbWFzayB8PSAoYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIgID4gZmxpbWl0ICogMiArIGxpbWl0KSAqIC0xOwotICAgIG1hc2sgPSB+bWFzazsKLSAgICByZXR1cm4gbWFzazsKLX0KLQotLyogaXMgdGhlcmUgaGlnaCB2YXJpYW5jZSBpbnRlcm5hbCBlZGdlICggMTExMTExMTEgeWVzLCAwMDAwMDAwMCBubykgKi8KLXN0YXRpYyBfX2lubGluZSBzaWduZWQgY2hhciB2cDhfaGV2bWFzayhzaWduZWQgY2hhciB0aHJlc2gsIHVjIHAxLCB1YyBwMCwgdWMgcTAsIHVjIHExKQotewotICAgIHNpZ25lZCBjaGFyIGhldiA9IDA7Ci0gICAgaGV2ICB8PSAoYWJzKHAxIC0gcDApID4gdGhyZXNoKSAqIC0xOwotICAgIGhldiAgfD0gKGFicyhxMSAtIHEwKSA+IHRocmVzaCkgKiAtMTsKLSAgICByZXR1cm4gaGV2OwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZCB2cDhfZmlsdGVyKHNpZ25lZCBjaGFyIG1hc2ssIHNpZ25lZCBjaGFyIGhldiwgdWMgKm9wMSwgdWMgKm9wMCwgdWMgKm9xMCwgdWMgKm9xMSkKLQotewotICAgIHNpZ25lZCBjaGFyIHBzMCwgcXMwOwotICAgIHNpZ25lZCBjaGFyIHBzMSwgcXMxOwotICAgIHNpZ25lZCBjaGFyIHZwOF9maWx0ZXIsIEZpbHRlcjEsIEZpbHRlcjI7Ci0gICAgc2lnbmVkIGNoYXIgdTsKLQotICAgIHBzMSA9IChzaWduZWQgY2hhcikgKiBvcDEgXiAweDgwOwotICAgIHBzMCA9IChzaWduZWQgY2hhcikgKiBvcDAgXiAweDgwOwotICAgIHFzMCA9IChzaWduZWQgY2hhcikgKiBvcTAgXiAweDgwOwotICAgIHFzMSA9IChzaWduZWQgY2hhcikgKiBvcTEgXiAweDgwOwotCi0gICAgLyogYWRkIG91dGVyIHRhcHMgaWYgd2UgaGF2ZSBoaWdoIGVkZ2UgdmFyaWFuY2UgKi8KLSAgICB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSAtIHFzMSk7Ci0gICAgdnA4X2ZpbHRlciAmPSBoZXY7Ci0KLSAgICAvKiBpbm5lciB0YXBzICovCi0gICAgdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqIChxczAgLSBwczApKTsKLSAgICB2cDhfZmlsdGVyICY9IG1hc2s7Ci0KLSAgICAvKiBzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszCi0gICAgICogaWYgaXQgZXF1YWxzIDQgd2UnbGwgc2V0IHRvIGFkanVzdCBieSAtMSB0byBhY2NvdW50IGZvciB0aGUgZmFjdAotICAgICAqIHdlJ2Qgcm91bmQgMyB0aGUgb3RoZXIgd2F5Ci0gICAgICovCi0gICAgRmlsdGVyMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgNCk7Ci0gICAgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyk7Ci0gICAgRmlsdGVyMSA+Pj0gMzsKLSAgICBGaWx0ZXIyID4+PSAzOwotICAgIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSk7Ci0gICAgKm9xMCA9IHUgXiAweDgwOwotICAgIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgRmlsdGVyMik7Ci0gICAgKm9wMCA9IHUgXiAweDgwOwotICAgIHZwOF9maWx0ZXIgPSBGaWx0ZXIxOwotCi0gICAgLyogb3V0ZXIgdGFwIGFkanVzdG1lbnRzICovCi0gICAgdnA4X2ZpbHRlciArPSAxOwotICAgIHZwOF9maWx0ZXIgPj49IDE7Ci0gICAgdnA4X2ZpbHRlciAmPSB+aGV2OwotCi0gICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB2cDhfZmlsdGVyKTsKLSAgICAqb3ExID0gdSBeIDB4ODA7Ci0gICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB2cDhfZmlsdGVyKTsKLSAgICAqb3AxID0gdSBeIDB4ODA7Ci0KLX0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcywKLSAgICBpbnQgcCwgLyogcGl0Y2ggKi8KLSAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotICAgIGludCBjb3VudAotKQotewotICAgIGludCAgaGV2ID0gMDsgLyogaGlnaCBlZGdlIHZhcmlhbmNlICovCi0gICAgc2lnbmVkIGNoYXIgbWFzayA9IDA7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCi0gICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCi0gICAgICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIG1hc2sgPSB2cDhfZmlsdGVyX21hc2sobGltaXRbaV0sIGZsaW1pdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWy00KnBdLCBzWy0zKnBdLCBzWy0yKnBdLCBzWy0xKnBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMCpwXSwgc1sxKnBdLCBzWzIqcF0sIHNbMypwXSk7Ci0KLSAgICAgICAgaGV2ID0gdnA4X2hldm1hc2sodGhyZXNoW2ldLCBzWy0yKnBdLCBzWy0xKnBdLCBzWzAqcF0sIHNbMSpwXSk7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcihtYXNrLCBoZXYsIHMgLSAyICogcCwgcyAtIDEgKiBwLCBzLCBzICsgMSAqIHApOwotCi0gICAgICAgICsrczsKLSAgICB9Ci0gICAgd2hpbGUgKCsraSA8IGNvdW50ICogOCk7Ci19Ci0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICBpbnQgIGhldiA9IDA7IC8qIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLwotICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAwOwotICAgIGludCBpID0gMDsKLQotICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQotICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgotICAgICAqLwotICAgIGRvCi0gICAgewotICAgICAgICBtYXNrID0gdnA4X2ZpbHRlcl9tYXNrKGxpbWl0W2ldLCBmbGltaXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1stNF0sIHNbLTNdLCBzWy0yXSwgc1stMV0sIHNbMF0sIHNbMV0sIHNbMl0sIHNbM10pOwotCi0gICAgICAgIGhldiA9IHZwOF9oZXZtYXNrKHRocmVzaFtpXSwgc1stMl0sIHNbLTFdLCBzWzBdLCBzWzFdKTsKLQotICAgICAgICB2cDhfZmlsdGVyKG1hc2ssIGhldiwgcyAtIDIsIHMgLSAxLCBzLCBzICsgMSk7Ci0KLSAgICAgICAgcyArPSBwOwotICAgIH0KLSAgICB3aGlsZSAoKytpIDwgY291bnQgKiA4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X21iZmlsdGVyKHNpZ25lZCBjaGFyIG1hc2ssIHNpZ25lZCBjaGFyIGhldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjICpvcDIsIHVjICpvcDEsIHVjICpvcDAsIHVjICpvcTAsIHVjICpvcTEsIHVjICpvcTIpCi17Ci0gICAgc2lnbmVkIGNoYXIgcywgdTsKLSAgICBzaWduZWQgY2hhciB2cDhfZmlsdGVyLCBGaWx0ZXIxLCBGaWx0ZXIyOwotICAgIHNpZ25lZCBjaGFyIHBzMiA9IChzaWduZWQgY2hhcikgKiBvcDIgXiAweDgwOwotICAgIHNpZ25lZCBjaGFyIHBzMSA9IChzaWduZWQgY2hhcikgKiBvcDEgXiAweDgwOwotICAgIHNpZ25lZCBjaGFyIHBzMCA9IChzaWduZWQgY2hhcikgKiBvcDAgXiAweDgwOwotICAgIHNpZ25lZCBjaGFyIHFzMCA9IChzaWduZWQgY2hhcikgKiBvcTAgXiAweDgwOwotICAgIHNpZ25lZCBjaGFyIHFzMSA9IChzaWduZWQgY2hhcikgKiBvcTEgXiAweDgwOwotICAgIHNpZ25lZCBjaGFyIHFzMiA9IChzaWduZWQgY2hhcikgKiBvcTIgXiAweDgwOwotCi0gICAgLyogYWRkIG91dGVyIHRhcHMgaWYgd2UgaGF2ZSBoaWdoIGVkZ2UgdmFyaWFuY2UgKi8KLSAgICB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSAtIHFzMSk7Ci0gICAgdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqIChxczAgLSBwczApKTsKLSAgICB2cDhfZmlsdGVyICY9IG1hc2s7Ci0KLSAgICBGaWx0ZXIyID0gdnA4X2ZpbHRlcjsKLSAgICBGaWx0ZXIyICY9IGhldjsKLQotICAgIC8qIHNhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMgKi8KLSAgICBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyA0KTsKLSAgICBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyAzKTsKLSAgICBGaWx0ZXIxID4+PSAzOwotICAgIEZpbHRlcjIgPj49IDM7Ci0gICAgcXMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpOwotICAgIHBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKTsKLQotCi0gICAgLyogb25seSBhcHBseSB3aWRlciBmaWx0ZXIgaWYgbm90IGhpZ2ggZWRnZSB2YXJpYW5jZSAqLwotICAgIHZwOF9maWx0ZXIgJj0gfmhldjsKLSAgICBGaWx0ZXIyID0gdnA4X2ZpbHRlcjsKLQotICAgIC8qIHJvdWdobHkgMy83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkgKi8KLSAgICB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAyNykgPj4gNyk7Ci0gICAgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB1KTsKLSAgICAqb3EwID0gcyBeIDB4ODA7Ci0gICAgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KTsKLSAgICAqb3AwID0gcyBeIDB4ODA7Ci0KLSAgICAvKiByb3VnaGx5IDIvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5ICovCi0gICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMTgpID4+IDcpOwotICAgIHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMxIC0gdSk7Ci0gICAgKm9xMSA9IHMgXiAweDgwOwotICAgIHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxICsgdSk7Ci0gICAgKm9wMSA9IHMgXiAweDgwOwotCi0gICAgLyogcm91Z2hseSAxLzd0aCBkaWZmZXJlbmNlIGFjcm9zcyBib3VuZGFyeSAqLwotICAgIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpID4+IDcpOwotICAgIHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSk7Ci0gICAgKm9xMiA9IHMgXiAweDgwOwotICAgIHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMyICsgdSk7Ci0gICAgKm9wMiA9IHMgXiAweDgwOwotfQotCi12b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcywKLSAgICBpbnQgcCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotICAgIGludCBjb3VudAotKQotewotICAgIHNpZ25lZCBjaGFyIGhldiA9IDA7IC8qIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLwotICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAwOwotICAgIGludCBpID0gMDsKLQotICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQotICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgotICAgICAqLwotICAgIGRvCi0gICAgewotCi0gICAgICAgIG1hc2sgPSB2cDhfZmlsdGVyX21hc2sobGltaXRbaV0sIGZsaW1pdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWy00KnBdLCBzWy0zKnBdLCBzWy0yKnBdLCBzWy0xKnBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMCpwXSwgc1sxKnBdLCBzWzIqcF0sIHNbMypwXSk7Ci0KLSAgICAgICAgaGV2ID0gdnA4X2hldm1hc2sodGhyZXNoW2ldLCBzWy0yKnBdLCBzWy0xKnBdLCBzWzAqcF0sIHNbMSpwXSk7Ci0KLSAgICAgICAgdnA4X21iZmlsdGVyKG1hc2ssIGhldiwgcyAtIDMgKiBwLCBzIC0gMiAqIHAsIHMgLSAxICogcCwgcywgcyArIDEgKiBwLCBzICsgMiAqIHApOwotCi0gICAgICAgICsrczsKLSAgICB9Ci0gICAgd2hpbGUgKCsraSA8IGNvdW50ICogOCk7Ci0KLX0KLQotCi12b2lkIHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICBzaWduZWQgY2hhciBoZXYgPSAwOyAvKiBoaWdoIGVkZ2UgdmFyaWFuY2UgKi8KLSAgICBzaWduZWQgY2hhciBtYXNrID0gMDsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBkbwotICAgIHsKLQotICAgICAgICBtYXNrID0gdnA4X2ZpbHRlcl9tYXNrKGxpbWl0W2ldLCBmbGltaXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1stNF0sIHNbLTNdLCBzWy0yXSwgc1stMV0sIHNbMF0sIHNbMV0sIHNbMl0sIHNbM10pOwotCi0gICAgICAgIGhldiA9IHZwOF9oZXZtYXNrKHRocmVzaFtpXSwgc1stMl0sIHNbLTFdLCBzWzBdLCBzWzFdKTsKLQotICAgICAgICB2cDhfbWJmaWx0ZXIobWFzaywgaGV2LCBzIC0gMywgcyAtIDIsIHMgLSAxLCBzLCBzICsgMSwgcyArIDIpOwotCi0gICAgICAgIHMgKz0gcDsKLSAgICB9Ci0gICAgd2hpbGUgKCsraSA8IGNvdW50ICogOCk7Ci0KLX0KLQotLyogc2hvdWxkIHdlIGFwcGx5IGFueSBmaWx0ZXIgYXQgYWxsICggMTExMTExMTEgeWVzLCAwMDAwMDAwMCBubykgKi8KLXN0YXRpYyBfX2lubGluZSBzaWduZWQgY2hhciB2cDhfc2ltcGxlX2ZpbHRlcl9tYXNrKHNpZ25lZCBjaGFyIGxpbWl0LCBzaWduZWQgY2hhciBmbGltaXQsIHVjIHAxLCB1YyBwMCwgdWMgcTAsIHVjIHExKQotewotLyogV2h5IGRvZXMgdGhpcyBjYXVzZSBwcm9ibGVtcyBmb3Igd2luMzI/Ci0gKiBlcnJvciBDMjE0Mzogc3ludGF4IGVycm9yIDogbWlzc2luZyAnOycgYmVmb3JlICd0eXBlJwotICogICh2b2lkKSBsaW1pdDsKLSAqLwotICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAoYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIgIDw9IGZsaW1pdCAqIDIgKyBsaW1pdCkgKiAtMTsKLSAgICByZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X3NpbXBsZV9maWx0ZXIoc2lnbmVkIGNoYXIgbWFzaywgdWMgKm9wMSwgdWMgKm9wMCwgdWMgKm9xMCwgdWMgKm9xMSkKLXsKLSAgICBzaWduZWQgY2hhciB2cDhfZmlsdGVyLCBGaWx0ZXIxLCBGaWx0ZXIyOwotICAgIHNpZ25lZCBjaGFyIHAxID0gKHNpZ25lZCBjaGFyKSAqIG9wMSBeIDB4ODA7Ci0gICAgc2lnbmVkIGNoYXIgcDAgPSAoc2lnbmVkIGNoYXIpICogb3AwIF4gMHg4MDsKLSAgICBzaWduZWQgY2hhciBxMCA9IChzaWduZWQgY2hhcikgKiBvcTAgXiAweDgwOwotICAgIHNpZ25lZCBjaGFyIHExID0gKHNpZ25lZCBjaGFyKSAqIG9xMSBeIDB4ODA7Ci0gICAgc2lnbmVkIGNoYXIgdTsKLQotICAgIHZwOF9maWx0ZXIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocDEgLSBxMSk7Ci0gICAgdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqIChxMCAtIHAwKSk7Ci0gICAgdnA4X2ZpbHRlciAmPSBtYXNrOwotCi0gICAgLyogc2F2ZSBib3R0b20gMyBiaXRzIHNvIHRoYXQgd2Ugcm91bmQgb25lIHNpZGUgKzQgYW5kIHRoZSBvdGhlciArMyAqLwotICAgIEZpbHRlcjEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDQpOwotICAgIEZpbHRlcjEgPj49IDM7Ci0gICAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxMCAtIEZpbHRlcjEpOwotICAgICpvcTAgID0gdSBeIDB4ODA7Ci0KLSAgICBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHZwOF9maWx0ZXIgKyAzKTsKLSAgICBGaWx0ZXIyID4+PSAzOwotICAgIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocDAgKyBGaWx0ZXIyKTsKLSAgICAqb3AwID0gdSBeIDB4ODA7Ci19Ci0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKmZsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqbGltaXQsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKnRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICBzaWduZWQgY2hhciBtYXNrID0gMDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgKHZvaWQpIHRocmVzaDsKLQotICAgIGRvCi0gICAgewotICAgICAgICAvKm1hc2sgPSB2cDhfc2ltcGxlX2ZpbHRlcl9tYXNrKCBsaW1pdFtpXSwgZmxpbWl0W2ldLHNbLTEqcF0sc1swKnBdKTsqLwotICAgICAgICBtYXNrID0gdnA4X3NpbXBsZV9maWx0ZXJfbWFzayhsaW1pdFtpXSwgZmxpbWl0W2ldLCBzWy0yKnBdLCBzWy0xKnBdLCBzWzAqcF0sIHNbMSpwXSk7Ci0gICAgICAgIHZwOF9zaW1wbGVfZmlsdGVyKG1hc2ssIHMgLSAyICogcCwgcyAtIDEgKiBwLCBzLCBzICsgMSAqIHApOwotICAgICAgICArK3M7Ci0gICAgfQotICAgIHdoaWxlICgrK2kgPCBjb3VudCAqIDgpOwotfQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcywKLSAgICBpbnQgcCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoLAotICAgIGludCBjb3VudAotKQotewotICAgIHNpZ25lZCBjaGFyIG1hc2sgPSAwOwotICAgIGludCBpID0gMDsKLSAgICAodm9pZCkgdGhyZXNoOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qbWFzayA9IHZwOF9zaW1wbGVfZmlsdGVyX21hc2soIGxpbWl0W2ldLCBmbGltaXRbaV0sc1stMV0sc1swXSk7Ki8KLSAgICAgICAgbWFzayA9IHZwOF9zaW1wbGVfZmlsdGVyX21hc2sobGltaXRbaV0sIGZsaW1pdFtpXSwgc1stMl0sIHNbLTFdLCBzWzBdLCBzWzFdKTsKLSAgICAgICAgdnA4X3NpbXBsZV9maWx0ZXIobWFzaywgcyAtIDIsIHMgLSAxLCBzLCBzICsgMSk7Ci0gICAgICAgIHMgKz0gcDsKLSAgICB9Ci0gICAgd2hpbGUgKCsraSA8IGNvdW50ICogOCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbWJwaXRjaC5jIGIvdnA4L2NvbW1vbi9tYnBpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NDA0MmMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9tYnBpdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJibG9ja2QuaCIKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgUFJFRCA9IDAsCi0gICAgREVTVCA9IDEKLX0gQkxPQ0tTRVQ7Ci0KLXN0YXRpYyB2b2lkIHNldHVwX2Jsb2NrCi0oCi0gICAgQkxPQ0tEICpiLAotICAgIGludCBtdl9zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqKmJhc2UsCi0gICAgaW50IFN0cmlkZSwKLSAgICBpbnQgb2Zmc2V0LAotICAgIEJMT0NLU0VUIGJzCi0pCi17Ci0KLSAgICBpZiAoYnMgPT0gREVTVCkKLSAgICB7Ci0gICAgICAgIGItPmRzdF9zdHJpZGUgPSBTdHJpZGU7Ci0gICAgICAgIGItPmRzdCA9IG9mZnNldDsKLSAgICAgICAgYi0+YmFzZV9kc3QgPSBiYXNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBiLT5wcmVfc3RyaWRlID0gU3RyaWRlOwotICAgICAgICBiLT5wcmUgPSBvZmZzZXQ7Ci0gICAgICAgIGItPmJhc2VfcHJlID0gYmFzZTsKLSAgICB9Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBzZXR1cF9tYWNyb2Jsb2NrKE1BQ1JPQkxPQ0tEICp4LCBCTE9DS1NFVCBicykKLXsKLSAgICBpbnQgYmxvY2s7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICoqeSwgKip1LCAqKnY7Ci0KLSAgICBpZiAoYnMgPT0gREVTVCkKLSAgICB7Ci0gICAgICAgIHkgPSAmeC0+ZHN0LnlfYnVmZmVyOwotICAgICAgICB1ID0gJngtPmRzdC51X2J1ZmZlcjsKLSAgICAgICAgdiA9ICZ4LT5kc3Qudl9idWZmZXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHkgPSAmeC0+cHJlLnlfYnVmZmVyOwotICAgICAgICB1ID0gJngtPnByZS51X2J1ZmZlcjsKLSAgICAgICAgdiA9ICZ4LT5wcmUudl9idWZmZXI7Ci0gICAgfQotCi0gICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTY7IGJsb2NrKyspIC8qIHkgYmxvY2tzICovCi0gICAgewotICAgICAgICBzZXR1cF9ibG9jaygmeC0+YmxvY2tbYmxvY2tdLCB4LT5kc3QueV9zdHJpZGUsIHksIHgtPmRzdC55X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChibG9jayA+PiAyKSAqIDQgKiB4LT5kc3QueV9zdHJpZGUgKyAoYmxvY2sgJiAzKSAqIDQsIGJzKTsKLSAgICB9Ci0KLSAgICBmb3IgKGJsb2NrID0gMTY7IGJsb2NrIDwgMjA7IGJsb2NrKyspIC8qIFUgYW5kIFYgYmxvY2tzICovCi0gICAgewotICAgICAgICBzZXR1cF9ibG9jaygmeC0+YmxvY2tbYmxvY2tdLCB4LT5kc3QudXZfc3RyaWRlLCB1LCB4LT5kc3QudXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgKChibG9jayAtIDE2KSA+PiAxKSAqIDQgKiB4LT5kc3QudXZfc3RyaWRlICsgKGJsb2NrICYgMSkgKiA0LCBicyk7Ci0KLSAgICAgICAgc2V0dXBfYmxvY2soJngtPmJsb2NrW2Jsb2NrKzRdLCB4LT5kc3QudXZfc3RyaWRlLCB2LCB4LT5kc3QudXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgKChibG9jayAtIDE2KSA+PiAxKSAqIDQgKiB4LT5kc3QudXZfc3RyaWRlICsgKGJsb2NrICYgMSkgKiA0LCBicyk7Ci0gICAgfQotfQotCi12b2lkIHZwOF9zZXR1cF9ibG9ja19kcHRycyhNQUNST0JMT0NLRCAqeCkKLXsKLSAgICBpbnQgciwgYzsKLQotICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5ibG9ja1tyKjQrY10uZGlmZiAgICAgID0gJngtPmRpZmZbciAqIDQgKiAxNiArIGMgKiA0XTsKLSAgICAgICAgICAgIHgtPmJsb2NrW3IqNCtjXS5wcmVkaWN0b3IgPSB4LT5wcmVkaWN0b3IgKyByICogNCAqIDE2ICsgYyAqIDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHIgPSAwOyByIDwgMjsgcisrKQotICAgIHsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IDI7IGMrKykKLSAgICAgICAgewotICAgICAgICAgICAgeC0+YmxvY2tbMTYrcioyK2NdLmRpZmYgICAgICA9ICZ4LT5kaWZmWzI1NiArIHIgKiA0ICogOCArIGMgKiA0XTsKLSAgICAgICAgICAgIHgtPmJsb2NrWzE2K3IqMitjXS5wcmVkaWN0b3IgPSB4LT5wcmVkaWN0b3IgKyAyNTYgKyByICogNCAqIDggKyBjICogNDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChyID0gMDsgciA8IDI7IHIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHgtPmJsb2NrWzIwK3IqMitjXS5kaWZmICAgICAgPSAmeC0+ZGlmZlszMjArIHIgKiA0ICogOCArIGMgKiA0XTsKLSAgICAgICAgICAgIHgtPmJsb2NrWzIwK3IqMitjXS5wcmVkaWN0b3IgPSB4LT5wcmVkaWN0b3IgKyAzMjAgKyByICogNCAqIDggKyBjICogNDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgeC0+YmxvY2tbMjRdLmRpZmYgPSAmeC0+ZGlmZlszODRdOwotCi0gICAgZm9yIChyID0gMDsgciA8IDI1OyByKyspCi0gICAgewotICAgICAgICB4LT5ibG9ja1tyXS5xY29lZmYgID0geC0+cWNvZWZmICArIHIgKiAxNjsKLSAgICAgICAgeC0+YmxvY2tbcl0uZHFjb2VmZiA9IHgtPmRxY29lZmYgKyByICogMTY7Ci0gICAgfQotfQotCi12b2lkIHZwOF9idWlsZF9ibG9ja19kb2Zmc2V0cyhNQUNST0JMT0NLRCAqeCkKLXsKLQotICAgIC8qIGhhbmRsZSB0aGUgZGVzdGluYXRpb24gcGl0Y2ggZmVhdHVyZXMgKi8KLSAgICBzZXR1cF9tYWNyb2Jsb2NrKHgsIERFU1QpOwotICAgIHNldHVwX21hY3JvYmxvY2soeCwgUFJFRCk7Ci19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL21pcHMvaWRjdF9taXBzLmMgYi92cDgvY29tbW9uL21pcHMvaWRjdF9taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlN2VjMDEuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9taXBzL2lkY3RfbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJvbnl4Y19pbnQuaCIKLQotc3RhdGljIGNvbnN0IGludCBjb3NwaThzcXJ0Mm1pbnVzMSA9IDIwMDkxOwotc3RhdGljIGNvbnN0IGludCBzaW5waThzcXJ0MiAgICAgID0gMzU0Njg7Ci0KLQotaW5saW5lIHZvaWQgcHJlZmV0Y2hfbG9hZF9zaG9ydChzaG9ydCogc3JjKSB7Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAicHJlZiAgIDAsICAwKCVbc3JjXSkgICBcblx0IgotICAgICAgICA6Ci0gICAgICAgIDogW3NyY10gInIiIChzcmMpCi0gICAgKTsKLX0KLQotCi12b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX21pcHMoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGExLCBiMSwgYzEsIGQxLCBjMiwgZDI7Ci0KLSAgICAvKiBwaXRjaCBoYXMgYWx3YXlzIHZhbHVlIDQgKi8KLQotICAgIHNob3J0ICppcCA9IGlucHV0OwotICAgIHNob3J0ICpvcCA9IG91dHB1dDsKLSAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0KLSAgICAvKiBwcmVwYXJlIGRhdGEgZm9yIGxvYWQgKi8KLSAgICBwcmVmZXRjaF9sb2FkX3Nob3J0KGlwICsgOCk7Ci0KLSAgICAvKiBmaXJzdCBsb29wIGlzIHVucm9sbGVkICovCi0gICAgYTEgPSBpcFswXSArIGlwWzhdOwotICAgIGIxID0gaXBbMF0gLSBpcFs4XTsKLQotICAgIHRlbXAxID0gKGlwWzRdICogc2lucGk4c3FydDIpID4+IDE2OwotICAgIHRlbXAyID0gaXBbMTJdICsgKChpcFsxMl0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIGMxID0gdGVtcDEgLSB0ZW1wMjsKLQotICAgIHRlbXAxID0gaXBbNF0gKyAoKGlwWzRdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICB0ZW1wMiA9IChpcFsxMl0gKiBzaW5waThzcXJ0MikgPj4gMTY7Ci0gICAgZDEgPSB0ZW1wMSArIHRlbXAyOwotCi0gICAgdGVtcDMgPSAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTY7Ci0gICAgdGVtcDQgPSBpcFsxM10gKyAoKGlwWzEzXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7Ci0gICAgYzIgPSB0ZW1wMyAtIHRlbXA0OwotCi0gICAgdGVtcDMgPSBpcFs1XSArICgoaXBbNV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIHRlbXA0ID0gKGlwWzEzXSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKLSAgICBkMiA9IHRlbXAzICsgdGVtcDQ7Ci0KLSAgICBvcFswXSA9IGExICsgZDE7Ci0gICAgb3BbMTJdID0gYTEgLSBkMTsKLSAgICBvcFs0XSA9IGIxICsgYzE7Ci0gICAgb3BbOF0gPSBiMSAtIGMxOwotCi0gICAgYTEgPSBpcFsxXSArIGlwWzldOwotICAgIGIxID0gaXBbMV0gLSBpcFs5XTsKLQotICAgIG9wWzFdID0gYTEgKyBkMjsKLSAgICBvcFsxM10gPSBhMSAtIGQyOwotICAgIG9wWzVdID0gYjEgKyBjMjsKLSAgICBvcFs5XSA9IGIxIC0gYzI7Ci0KLSAgICBhMSA9IGlwWzJdICsgaXBbMTBdOwotICAgIGIxID0gaXBbMl0gLSBpcFsxMF07Ci0KLSAgICB0ZW1wMSA9IChpcFs2XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKLSAgICB0ZW1wMiA9IGlwWzE0XSArICgoaXBbMTRdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICBjMSA9IHRlbXAxIC0gdGVtcDI7Ci0KLSAgICB0ZW1wMSA9IGlwWzZdICsgKChpcFs2XSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7Ci0gICAgdGVtcDIgPSAoaXBbMTRdICogc2lucGk4c3FydDIpID4+IDE2OwotICAgIGQxID0gdGVtcDEgKyB0ZW1wMjsKLQotICAgIHRlbXAzID0gKGlwWzddICogc2lucGk4c3FydDIpID4+IDE2OwotICAgIHRlbXA0ID0gaXBbMTVdICsgKChpcFsxNV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIGMyID0gdGVtcDMgLSB0ZW1wNDsKLQotICAgIHRlbXAzID0gaXBbN10gKyAoKGlwWzddICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICB0ZW1wNCA9IChpcFsxNV0gKiBzaW5waThzcXJ0MikgPj4gMTY7Ci0gICAgZDIgPSB0ZW1wMyArIHRlbXA0OwotCi0gICAgb3BbMl0gPSBhMSArIGQxOwotICAgIG9wWzE0XSA9IGExIC0gZDE7Ci0gICAgb3BbNl0gPSBiMSArIGMxOwotICAgIG9wWzEwXSA9IGIxIC0gYzE7Ci0KLSAgICBhMSA9IGlwWzNdICsgaXBbMTFdOwotICAgIGIxID0gaXBbM10gLSBpcFsxMV07Ci0KLSAgICBvcFszXSA9IGExICsgZDI7Ci0gICAgb3BbMTVdID0gYTEgLSBkMjsKLSAgICBvcFs3XSA9IGIxICsgYzI7Ci0gICAgb3BbMTFdID0gYjEgLSBjMjsKLQotICAgIGlwID0gb3V0cHV0OwotCi0gICAgLyogcHJlcGFyZSBkYXRhIGZvciBsb2FkICovCi0gICAgcHJlZmV0Y2hfbG9hZF9zaG9ydChpcCArIHBpdGNoKTsKLQotICAgIC8qIHNlY29uZCBsb29wIGlzIHVucm9sbGVkICovCi0gICAgYTEgPSBpcFswXSArIGlwWzJdOwotICAgIGIxID0gaXBbMF0gLSBpcFsyXTsKLQotICAgIHRlbXAxID0gKGlwWzFdICogc2lucGk4c3FydDIpID4+IDE2OwotICAgIHRlbXAyID0gaXBbM10gKyAoKGlwWzNdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICBjMSA9IHRlbXAxIC0gdGVtcDI7Ci0KLSAgICB0ZW1wMSA9IGlwWzFdICsgKChpcFsxXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7Ci0gICAgdGVtcDIgPSAoaXBbM10gKiBzaW5waThzcXJ0MikgPj4gMTY7Ci0gICAgZDEgPSB0ZW1wMSArIHRlbXAyOwotCi0gICAgdGVtcDMgPSAoaXBbNV0gKiBzaW5waThzcXJ0MikgPj4gMTY7Ci0gICAgdGVtcDQgPSBpcFs3XSArICgoaXBbN10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIGMyID0gdGVtcDMgLSB0ZW1wNDsKLQotICAgIHRlbXAzID0gaXBbNV0gKyAoKGlwWzVdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICB0ZW1wNCA9IChpcFs3XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKLSAgICBkMiA9IHRlbXAzICsgdGVtcDQ7Ci0KLSAgICBvcFswXSA9IChhMSArIGQxICsgNCkgPj4gMzsKLSAgICBvcFszXSA9IChhMSAtIGQxICsgNCkgPj4gMzsKLSAgICBvcFsxXSA9IChiMSArIGMxICsgNCkgPj4gMzsKLSAgICBvcFsyXSA9IChiMSAtIGMxICsgNCkgPj4gMzsKLQotICAgIGExID0gaXBbNF0gKyBpcFs2XTsKLSAgICBiMSA9IGlwWzRdIC0gaXBbNl07Ci0KLSAgICBvcFs0XSA9IChhMSArIGQyICsgNCkgPj4gMzsKLSAgICBvcFs3XSA9IChhMSAtIGQyICsgNCkgPj4gMzsKLSAgICBvcFs1XSA9IChiMSArIGMyICsgNCkgPj4gMzsKLSAgICBvcFs2XSA9IChiMSAtIGMyICsgNCkgPj4gMzsKLQotICAgIGExID0gaXBbOF0gKyBpcFsxMF07Ci0gICAgYjEgPSBpcFs4XSAtIGlwWzEwXTsKLQotICAgIHRlbXAxID0gKGlwWzldICogc2lucGk4c3FydDIpID4+IDE2OwotICAgIHRlbXAyID0gaXBbMTFdICsgKChpcFsxMV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIGMxID0gdGVtcDEgLSB0ZW1wMjsKLQotICAgIHRlbXAxID0gaXBbOV0gKyAoKGlwWzldICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICB0ZW1wMiA9IChpcFsxMV0gKiBzaW5waThzcXJ0MikgPj4gMTY7Ci0gICAgZDEgPSB0ZW1wMSArIHRlbXAyOwotCi0gICAgdGVtcDMgPSAoaXBbMTNdICogc2lucGk4c3FydDIpID4+IDE2OwotICAgIHRlbXA0ID0gaXBbMTVdICsgKChpcFsxNV0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIGMyID0gdGVtcDMgLSB0ZW1wNDsKLQotICAgIHRlbXAzID0gaXBbMTNdICsgKChpcFsxM10gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgIHRlbXA0ID0gKGlwWzE1XSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsKLSAgICBkMiA9IHRlbXAzICsgdGVtcDQ7Ci0KLSAgICBvcFs4XSA9IChhMSArIGQxICsgNCkgPj4gMzsKLSAgICBvcFsxMV0gPSAoYTEgLSBkMSArIDQpID4+IDM7Ci0gICAgb3BbOV0gPSAoYjEgKyBjMSArIDQpID4+IDM7Ci0gICAgb3BbMTBdID0gKGIxIC0gYzEgKyA0KSA+PiAzOwotCi0gICAgYTEgPSBpcFsxMl0gKyBpcFsxNF07Ci0gICAgYjEgPSBpcFsxMl0gLSBpcFsxNF07Ci0KLSAgICBvcFsxMl0gPSAoYTEgKyBkMiArIDQpID4+IDM7Ci0gICAgb3BbMTVdID0gKGExIC0gZDIgKyA0KSA+PiAzOwotICAgIG9wWzEzXSA9IChiMSArIGMyICsgNCkgPj4gMzsKLSAgICBvcFsxNF0gPSAoYjEgLSBjMiArIDQpID4+IDM7Ci19Ci0KLQotdm9pZCB2cDhfZGNfb25seV9pZGN0X2FkZF9taXBzCi0oCi0gICAgc2hvcnQgaW5wdXRfZGMsCi0gICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgcGl0Y2gsCi0gICAgaW50IHN0cmlkZQotKQotewotICAgIGludCBpLCBhMSwgYWJzYTE7Ci0gICAgaW50IHQyLCB2ZWN0b3JfYTEsIHZlY3Rvcl9hOwotCi0gICAgLyogYTEgPSAoKGlucHV0X2RjICsgNCkgPj4gMyk7ICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAiYWRkaSAgJVthMV0sICVbaW5wdXRfZGNdLCA0ICAgXG5cdCIKLSAgICAgICAgInNyYSAgICVbYTFdLCAlW2ExXSwgICAgICAgMyAgIFxuXHQiCi0gICAgICAgIDogW2ExXSAiPXIiIChhMSkKLSAgICAgICAgOiBbaW5wdXRfZGNdICJyIiAoaW5wdXRfZGMpCi0gICAgKTsKLQotICAgIC8qIGZpcnN0IGZvciBsb29wIGlzIHVucm9sbGVkCi0gICAgICogaWYgKGExIDwgMCkgdGhlbiBhbHdheXMgKGExICsgcHJlZF9wdHJbY10pIDwgMjU1Ci0gICAgICovCi0gICAgaWYgKGExIDwgMCkgewotICAgICAgICAvKiB1c2UgcXVhZC1ieXRlCi0gICAgICAgICAqIGlucHV0IGFuZCBvdXRwdXQgbWVtb3J5IGFyZSBmb3VyIGJ5dGUgYWxpZ25lZAotICAgICAgICAgKi8KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgImFicyAgICAgICAgJVthYnNhMV0sICAgICAlW2ExXSAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicmVwbHYucWIgICAlW3ZlY3Rvcl9hMV0sICVbYWJzYTFdICAgICAgXG5cdCIKLSAgICAgICAgICAgIDogW2Fic2ExXSAiPXIiIChhYnNhMSksIFt2ZWN0b3JfYTFdICI9ciIgKHZlY3Rvcl9hMSkKLSAgICAgICAgICAgIDogW2ExXSAiciIgKGExKQotICAgICAgICApOwotCi0gICAgICAgIC8qIHVzZSAoYTEgLSBwcmVkcHRyW2NdKSBpbnN0ZWFkIGExICsgcHJlZHB0cltjXSAqLwotICAgICAgICBmb3IgKGkgPSA0OyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgImx3ICAgICAgICAgICAgICVbdDJdLCAgICAgICAwKCVbcHJlZF9wdHJdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICVbcHJlZF9wdHJdLCAlW3ByZWRfcHRyXSwgICAgJVtwaXRjaF0gICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN1YnVfcy5xYiAgICAgICVbdmVjdG9yX2FdLCAlW3QyXSwgICAgICAgICAgJVt2ZWN0b3JfYTFdICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAgICAgICAgICVbdmVjdG9yX2FdLCAwKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICVbZHN0X3B0cl0sICAlW2RzdF9wdHJdLCAgICAgJVtzdHJpZGVdICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbdDJdICI9JnIiICh0MiksIFt2ZWN0b3JfYV0gIj0mciIgKHZlY3Rvcl9hKSwKLSAgICAgICAgICAgICAgICAgIFtkc3RfcHRyXSAiKyZyIiAoZHN0X3B0ciksIFtwcmVkX3B0cl0gIismciIgKHByZWRfcHRyKQotICAgICAgICAgICAgICAgIDogW3N0cmlkZV0gInIiIChzdHJpZGUpLCBbcGl0Y2hdICJyIiAocGl0Y2gpLCBbdmVjdG9yX2ExXSAiciIgKHZlY3Rvcl9hMSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIHVzZSBxdWFkLWJ5dGUKLSAgICAgICAgICogaW5wdXQgYW5kIG91dHB1dCBtZW1vcnkgYXJlIGZvdXIgYnl0ZSBhbGlnbmVkCi0gICAgICAgICAqLwotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAicmVwbHYucWIgICAgICAgJVt2ZWN0b3JfYTFdLCAlW2ExXSAgICAgXG5cdCIKLSAgICAgICAgICAgIDogW3ZlY3Rvcl9hMV0gIj1yIiAodmVjdG9yX2ExKQotICAgICAgICAgICAgOiBbYTFdICJyIiAoYTEpCi0gICAgICAgICk7Ci0KLSAgICAgICAgZm9yIChpID0gNDsgaS0tOykKLSAgICAgICAgewotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJsdyAgICAgICAgICAgICAlW3QyXSwgICAgICAgMCglW3ByZWRfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICVbcHJlZF9wdHJdLCAlW3ByZWRfcHRyXSwgICAgJVtwaXRjaF0gICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdV9zLnFiICAgICAgJVt2ZWN0b3JfYV0sICVbdmVjdG9yX2ExXSwgICAlW3QyXSAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgICAgICAgICAlW3ZlY3Rvcl9hXSwgMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICVbZHN0X3B0cl0sICAlW2RzdF9wdHJdLCAgICAgJVtzdHJpZGVdICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICA6IFt0Ml0gIj0mciIgKHQyKSwgW3ZlY3Rvcl9hXSAiPSZyIiAodmVjdG9yX2EpLAotICAgICAgICAgICAgICAgICAgW2RzdF9wdHJdICIrJnIiIChkc3RfcHRyKSwgW3ByZWRfcHRyXSAiKyZyIiAocHJlZF9wdHIpCi0gICAgICAgICAgICAgICAgOiBbc3RyaWRlXSAiciIgKHN0cmlkZSksIFtwaXRjaF0gInIiIChwaXRjaCksIFt2ZWN0b3JfYTFdICJyIiAodmVjdG9yX2ExKQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi12b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbWlwcyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGExLCBiMSwgYzEsIGQxOwotICAgIGludCBhMiwgYjIsIGMyLCBkMjsKLQotICAgIHNob3J0ICppcCA9IGlucHV0OwotICAgIHNob3J0ICpvcCA9IG91dHB1dDsKLQotICAgIHByZWZldGNoX2xvYWRfc2hvcnQoaXApOwotCi0gICAgZm9yIChpID0gNDsgaS0tOykKLSAgICB7Ci0gICAgICAgIGExID0gaXBbMF0gKyBpcFsxMl07Ci0gICAgICAgIGIxID0gaXBbNF0gKyBpcFs4XTsKLSAgICAgICAgYzEgPSBpcFs0XSAtIGlwWzhdOwotICAgICAgICBkMSA9IGlwWzBdIC0gaXBbMTJdOwotCi0gICAgICAgIG9wWzBdID0gYTEgKyBiMTsKLSAgICAgICAgb3BbNF0gPSBjMSArIGQxOwotICAgICAgICBvcFs4XSA9IGExIC0gYjE7Ci0gICAgICAgIG9wWzEyXSA9IGQxIC0gYzE7Ci0KLSAgICAgICAgaXArKzsKLSAgICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgICBpcCA9IG91dHB1dDsKLSAgICBvcCA9IG91dHB1dDsKLQotICAgIHByZWZldGNoX2xvYWRfc2hvcnQoaXApOwotCi0gICAgZm9yIChpID0gNDsgaS0tOykKLSAgICB7Ci0gICAgICAgIGExID0gaXBbMF0gKyBpcFszXSArIDM7Ci0gICAgICAgIGIxID0gaXBbMV0gKyBpcFsyXTsKLSAgICAgICAgYzEgPSBpcFsxXSAtIGlwWzJdOwotICAgICAgICBkMSA9IGlwWzBdIC0gaXBbM10gKyAzOwotCi0gICAgICAgIGEyID0gYTEgKyBiMTsKLSAgICAgICAgYjIgPSBkMSArIGMxOwotICAgICAgICBjMiA9IGExIC0gYjE7Ci0gICAgICAgIGQyID0gZDEgLSBjMTsKLQotICAgICAgICBvcFswXSA9IGEyID4+IDM7Ci0gICAgICAgIG9wWzFdID0gYjIgPj4gMzsKLSAgICAgICAgb3BbMl0gPSBjMiA+PiAzOwotICAgICAgICBvcFszXSA9IGQyID4+IDM7Ci0KLSAgICAgICAgaXAgKz0gNDsKLSAgICAgICAgb3AgKz0gNDsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfbWlwcyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpCi17Ci0gICAgaW50IGExOwotICAgIGludCB2ZWN0X2E7Ci0gICAgdW5zaWduZWQgaW50ICpvcCA9ICh1bnNpZ25lZCBpbnQgKilvdXRwdXQ7Ci0KLSAgICBhMSA9ICgoaW5wdXRbMF0gKyAzKSA+PiAzKTsKLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInJlcGx2LnBoICAgJVt2ZWN0X2FdLCAlW2ExXSAgICBcblx0IgotICAgICAgICA6IFt2ZWN0X2FdICI9ciIgKHZlY3RfYSkKLSAgICAgICAgOiBbYTFdICJyIiAoYTEpCi0gICAgKTsKLQotICAgIC8qIG91dHB1dCBpcyA0IGJ5dGUgYWxpZ25lZCAqLwotICAgIG9wWzBdID0gdmVjdF9hOwotICAgIG9wWzFdID0gdmVjdF9hOwotICAgIG9wWzJdID0gdmVjdF9hOwotICAgIG9wWzNdID0gdmVjdF9hOwotICAgIG9wWzRdID0gdmVjdF9hOwotICAgIG9wWzVdID0gdmVjdF9hOwotICAgIG9wWzZdID0gdmVjdF9hOwotICAgIG9wWzddID0gdmVjdF9hOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9taXBzL2lkY3RfbWlwcy5oIGIvdnA4L2NvbW1vbi9taXBzL2lkY3RfbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTM4NDRmLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbWlwcy9pZGN0X21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLQotI2lmbmRlZiBJRENUX01JUFNfSAotI2RlZmluZSBJRENUX01JUFNfSAotCi1leHRlcm4gcHJvdG90eXBlX2lkY3QodnA4X3Nob3J0X2lkY3Q0eDRsbG1fbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0X21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9pZGN0X3NjYWxhcl9hZGQodnA4X2RjX29ubHlfaWRjdF9hZGRfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfbWlwcyk7Ci0KLSN1bmRlZiAgdnA4X2lkY3RfaWRjdDE2Ci0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxNiB2cDhfc2hvcnRfaWRjdDR4NGxsbV9taXBzCi0KLSN1bmRlZiAgdnA4X2lkY3RfaXdhbHNoMTYKLSNkZWZpbmUgdnA4X2lkY3RfaXdhbHNoMTYgdnA4X3Nob3J0X2ludl93YWxzaDR4NF9taXBzCi0KLSN1bmRlZiAgdnA4X2lkY3RfaWRjdDFfc2NhbGFyX2FkZAotI2RlZmluZSB2cDhfaWRjdF9pZGN0MV9zY2FsYXJfYWRkIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMKLQotI3VuZGVmICB2cDhfaWRjdF9pd2Fsc2gxCi0jZGVmaW5lIHZwOF9pZGN0X2l3YWxzaDEgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX21pcHMKLQotI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL21pcHMvbG9vcGZpbHRlcl9maWx0ZXJzX21pcHMuYyBiL3ZwOC9jb21tb24vbWlwcy9sb29wZmlsdGVyX2ZpbHRlcnNfbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTFhMTAwLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbWlwcy9sb29wZmlsdGVyX2ZpbHRlcnNfbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQyMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgIm9ueXhjX2ludC5oIgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWM7Ci0KLQotLyogcHJlZmV0Y2ggZGF0YSBmb3IgbG9hZCAqLwotaW5saW5lIHZvaWQgcHJlZmV0Y2hfbG9hZF9sZih1bnNpZ25lZCBjaGFyKiBzcmMpIHsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJwcmVmICAgMCwgIDAoJVtzcmNdKSAgIFxuXHQiCi0gICAgICAgIDoKLSAgICAgICAgOiBbc3JjXSAiciIgKHNyYykKLSAgICApOwotfQotCi0KLS8qIHByZWZldGNoIGRhdGEgZm9yIHN0b3JlICovCi1pbmxpbmUgdm9pZCBwcmVmZXRjaF9zdG9yZV9sZih1bnNpZ25lZCBjaGFyKiBkc3QpIHsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJwcmVmICAgMSwgIDAoJVtkc3RdKSAgIFxuXHQiCi0gICAgICAgIDoKLSAgICAgICAgOiBbZHN0XSAiciIgKGRzdCkKLSAgICApOwotfQotCi0KLS8qIHByb2Nlc3NpbmcgNCBwaXhlbHMgYXQgdGhlIHNhbWUgdGltZQotICogY29tcHV0ZSBoZXYgYW5kIG1hc2sgaW4gdGhlIHNhbWUgZnVuY3Rpb24KLSAqLwotc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzCi0oCi0gICAgdWludDMyX3QgbGltaXQsCi0gICAgdWludDMyX3QgZmxpbWl0LAotICAgIHVpbnQzMl90IHAxLAotICAgIHVpbnQzMl90IHAwLAotICAgIHVpbnQzMl90IHAzLAotICAgIHVpbnQzMl90IHAyLAotICAgIHVpbnQzMl90IHEwLAotICAgIHVpbnQzMl90IHExLAotICAgIHVpbnQzMl90IHEyLAotICAgIHVpbnQzMl90IHEzLAotICAgIHVpbnQzMl90IHRocmVzaCwKLSAgICB1aW50MzJfdCAqaGV2LAotICAgIHVpbnQzMl90ICptYXNrCi0pCi17Ci0gICAgdWludDMyX3QgYywgciwgcjMsIHJfazsKLSAgICB1aW50MzJfdCBzMSwgczIsIHMzOwotICAgIHVpbnQzMl90IG9uZXMgPSAweEZGRkZGRkZGOwotICAgIHVpbnQzMl90IGhldjE7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgIC8qIG1hc2sgfD0gKGFicyhwMyAtIHAyKSA+IGxpbWl0KSAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AzXSwgICAgICVbcDJdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3AyXSwgICAgICVbcDNdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAkMCwgICAgICAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIG1hc2sgfD0gKGFicyhwMiAtIHAxKSA+IGxpbWl0KSAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AyXSwgICAgICVbcDFdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3AxXSwgICAgICVbcDJdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIG1hc2sgfD0gKGFicyhwMSAtIHAwKSA+IGxpbWl0KQotICAgICAgICAgKiBoZXYgIHw9IChhYnMocDEgLSBwMCkgPiB0aHJlc2gpCi0gICAgICAgICAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AxXSwgICAgICVbcDBdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3AwXSwgICAgICVbcDFdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW3RocmVzaF0sICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyM10sICAkMCwgICAgICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIG1hc2sgfD0gKGFicyhxMSAtIHEwKSA+IGxpbWl0KQotICAgICAgICAgKiBoZXYgIHw9IChhYnMocTEgLSBxMCkgPiB0aHJlc2gpCi0gICAgICAgICAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3ExXSwgICAgICVbcTBdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3EwXSwgICAgICVbcTFdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW3RocmVzaF0sICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyM10sICAlW3IzXSwgICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIG1hc2sgfD0gKGFicyhxMiAtIHExKSA+IGxpbWl0KSAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3EyXSwgICAgICVbcTFdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3ExXSwgICAgICVbcTJdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAic2xsICAgICAgICAgICAgJVtyM10sICAgICVbcjNdLCAgICAyNCAgICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIG1hc2sgfD0gKGFicyhxMyAtIHEyKSA+IGxpbWl0KSAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3EzXSwgICAgICVbcTJdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3EyXSwgICAgICVbcTNdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyX2tdLCAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAlW2xpbWl0XSwgICVbcl9rXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAlW3JdLCAgICAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIDogW2NdICI9JnIiIChjKSwgW3Jfa10gIj0mciIgKHJfayksCi0gICAgICAgICAgW3JdICI9JnIiIChyKSwgW3IzXSAiPSZyIiAocjMpCi0gICAgICAgIDogW2xpbWl0XSAiciIgKGxpbWl0KSwgW3AzXSAiciIgKHAzKSwgW3AyXSAiciIgKHAyKSwKLSAgICAgICAgICBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApLCBbcTFdICJyIiAocTEpLCBbcTBdICJyIiAocTApLAotICAgICAgICAgIFtxMl0gInIiIChxMiksIFtxM10gInIiIChxMyksIFt0aHJlc2hdICJyIiAodGhyZXNoKQotICAgICk7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgIC8qIGFicyhwMCAtIHEwKSAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAlW3AwXSwgICAgICVbcTBdICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAlW3EwXSwgICAgICVbcDBdICAgICAgICBcblx0IgotICAgICAgICAid3Jkc3AgICAgICAgICAgJVtyM10gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtzMV0sICAlW3Jfa10sICAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIGFicyhwMSAtIHExKSAqLwotICAgICAgICAic3VidV9zLnFiICAgICAgJVtjXSwgICAgJVtwMV0sICAgICVbcTFdICAgICAgICBcblx0IgotICAgICAgICAiYWRkdV9zLnFiICAgICAgJVtzM10sICAgJVtzMV0sICAgICVbczFdICAgICAgICBcblx0IgotICAgICAgICAicGljay5xYiAgICAgICAgJVtoZXYxXSwgJVtvbmVzXSwgICQwICAgICAgICAgICBcblx0IgotICAgICAgICAic3VidV9zLnFiICAgICAgJVtyX2tdLCAgJVtxMV0sICAgICVbcDFdICAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtzMl0sICAgJVtyX2tdLCAgICVbY10gICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICA+IGZsaW1pdCAqIDIgKyBsaW1pdCAqLwotICAgICAgICAic2hybC5xYiAgICAgICAgJVtzMl0sICAgJVtzMl0sICAgICAxICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkdV9zLnFiICAgICAgJVtzMV0sICAgJVtzMl0sICAgICAlW3MzXSAgICAgICBcblx0IgotICAgICAgICAiY21wZ3UubHQucWIgICAgJVtjXSwgICAgJVtmbGltaXRdLCAlW3MxXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICAgJVtyXSwgICAgJVtyXSwgICAgICAlW2NdICAgICAgICBcblx0IgotICAgICAgICAic2xsICAgICAgICAgICAgJVtyXSwgICAgJVtyXSwgICAgICAyNCAgICAgICAgICBcblx0IgotCi0gICAgICAgICJ3cmRzcCAgICAgICAgICAlW3JdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwaWNrLnFiICAgICAgICAlW3MyXSwgICQwLCAgICAgICAgICVbb25lc10gICAgIFxuXHQiCi0KLSAgICAgICAgOiBbY10gIj0mciIgKGMpLCBbcl9rXSAiPSZyIiAocl9rKSwgW3MxXSAiPSZyIiAoczEpLCBbaGV2MV0gIj0mciIgKGhldjEpLAotICAgICAgICAgIFtzMl0gIj0mciIgKHMyKSwgW3JdICIrciIgKHIpLCBbczNdICI9JnIiIChzMykKLSAgICAgICAgOiBbcDBdICJyIiAocDApLCBbcTBdICJyIiAocTApLCBbcDFdICJyIiAocDEpLCBbcjNdICJyIiAocjMpLAotICAgICAgICAgIFtxMV0gInIiIChxMSksIFtvbmVzXSAiciIgKG9uZXMpLCBbZmxpbWl0XSAiciIgKGZsaW1pdCkKLSAgICApOwotCi0gICAgKmhldiA9IGhldjE7Ci0gICAgKm1hc2sgPSBzMjsKLX0KLQotCi0vKiBpbnB1dHMgJiBvdXRwdXRzIGFyZSBxdWFkLWJ5dGUgdmVjdG9ycyAqLwotc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X2ZpbHRlcl9taXBzCi0oCi0gICAgdWludDMyX3QgbWFzaywKLSAgICB1aW50MzJfdCBoZXYsCi0gICAgdWludDMyX3QgKnBzMSwKLSAgICB1aW50MzJfdCAqcHMwLAotICAgIHVpbnQzMl90ICpxczAsCi0gICAgdWludDMyX3QgKnFzMQotKQotewotICAgIGludDMyX3QgdnA4X2ZpbHRlcl9sLCB2cDhfZmlsdGVyX3I7Ci0gICAgaW50MzJfdCBGaWx0ZXIxX2wsIEZpbHRlcjFfciwgRmlsdGVyMl9sLCBGaWx0ZXIyX3I7Ci0gICAgaW50MzJfdCBzdWJyX3IsIHN1YnJfbDsKLSAgICB1aW50MzJfdCB0MSwgdDIsIEhXTSwgdDM7Ci0gICAgdWludDMyX3QgaGV2X2wsIGhldl9yLCBtYXNrX2wsIG1hc2tfciwgaW52aGV2X2wsIGludmhldl9yOwotCi0gICAgaW50MzJfdCB2cHMxLCB2cHMwLCB2cXMwLCB2cXMxOwotICAgIGludDMyX3QgdnBzMV9sLCB2cHMxX3IsIHZwczBfbCwgdnBzMF9yLCB2cXMwX2wsIHZxczBfciwgdnFzMV9sLCB2cXMxX3I7Ci0gICAgdWludDMyX3QgTjEyODsKLQotICAgIE4xMjg9IDB4ODA4MDgwODA7Ci0gICAgdDEgID0gMHgwMzAwMDMwMDsKLSAgICB0MiAgPSAweDA0MDAwNDAwOwotICAgIHQzICA9IDB4MDEwMDAxMDA7Ci0gICAgSFdNID0gMHhGRjAwRkYwMDsKLQotICAgIHZwczAgPSAoKnBzMCkgXiBOMTI4OwotICAgIHZwczEgPSAoKnBzMSkgXiBOMTI4OwotICAgIHZxczAgPSAoKnFzMCkgXiBOMTI4OwotICAgIHZxczEgPSAoKnFzMSkgXiBOMTI4OwotCi0gICAgLyogdXNlIGhhbGZ3b3JkIHBhaXJzIGluc3RlYWQgcXVhZC1ieXRlcyBiZWNhdXNlIG9mIGFjY3VyYWN5ICovCi0gICAgdnBzMF9sID0gdnBzMCAmIEhXTTsKLSAgICB2cHMwX3IgPSB2cHMwIDw8IDg7Ci0gICAgdnBzMF9yID0gdnBzMF9yICYgSFdNOwotCi0gICAgdnBzMV9sID0gdnBzMSAmIEhXTTsKLSAgICB2cHMxX3IgPSB2cHMxIDw8IDg7Ci0gICAgdnBzMV9yID0gdnBzMV9yICYgSFdNOwotCi0gICAgdnFzMF9sID0gdnFzMCAmIEhXTTsKLSAgICB2cXMwX3IgPSB2cXMwIDw8IDg7Ci0gICAgdnFzMF9yID0gdnFzMF9yICYgSFdNOwotCi0gICAgdnFzMV9sID0gdnFzMSAmIEhXTTsKLSAgICB2cXMxX3IgPSB2cXMxIDw8IDg7Ci0gICAgdnFzMV9yID0gdnFzMV9yICYgSFdNOwotCi0gICAgbWFza19sID0gbWFzayAmIEhXTTsKLSAgICBtYXNrX3IgPSBtYXNrIDw8IDg7Ci0gICAgbWFza19yID0gbWFza19yICYgSFdNOwotCi0gICAgaGV2X2wgPSBoZXYgJiBIV007Ci0gICAgaGV2X3IgPSBoZXYgPDwgODsKLSAgICBoZXZfciA9IGhldl9yICYgSFdNOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAvKiB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSAtIHFzMSk7ICovCi0gICAgICAgICJzdWJxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwczFfbF0sICAgICAgICVbdnFzMV9sXSAgICAgICBcblx0IgotICAgICAgICAic3VicV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cHMxX3JdLCAgICAgICAlW3ZxczFfcl0gICAgICAgXG5cdCIKLQotICAgICAgICAvKiBxczAgLSBwczAgKi8KLSAgICAgICAgInN1YnFfcy5waCAgICAlW3N1YnJfbF0sICAgICAgICVbdnFzMF9sXSwgICAgICAgJVt2cHMwX2xdICAgICAgIFxuXHQiCi0gICAgICAgICJzdWJxX3MucGggICAgJVtzdWJyX3JdLCAgICAgICAlW3ZxczBfcl0sICAgICAgICVbdnBzMF9yXSAgICAgICBcblx0IgotCi0gICAgICAgIC8qIHZwOF9maWx0ZXIgJj0gaGV2OyAqLwotICAgICAgICAiYW5kICAgICAgICAgICVbdnA4X2ZpbHRlcl9sXSwgJVt2cDhfZmlsdGVyX2xdLCAlW2hldl9sXSAgICAgICAgXG5cdCIKLSAgICAgICAgImFuZCAgICAgICAgICAlW3ZwOF9maWx0ZXJfcl0sICVbdnA4X2ZpbHRlcl9yXSwgJVtoZXZfcl0gICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqIChxczAgLSBwczApKTsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVtzdWJyX2xdICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbc3Vicl9yXSAgICAgICBcblx0IgotICAgICAgICAieG9yICAgICAgICAgICVbaW52aGV2X2xdLCAgICAgJVtoZXZfbF0sICAgICAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVtzdWJyX2xdICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbc3Vicl9yXSAgICAgICBcblx0IgotICAgICAgICAieG9yICAgICAgICAgICVbaW52aGV2X3JdLCAgICAgJVtoZXZfcl0sICAgICAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVtzdWJyX2xdICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbc3Vicl9yXSAgICAgICBcblx0IgotCi0gICAgICAgIC8qIHZwOF9maWx0ZXIgJj0gbWFzazsgKi8KLSAgICAgICAgImFuZCAgICAgICAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVttYXNrX2xdICAgICAgIFxuXHQiCi0gICAgICAgICJhbmQgICAgICAgICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbbWFza19yXSAgICAgICBcblx0IgotCi0gICAgICAgIDogW3ZwOF9maWx0ZXJfbF0gIj0mciIgKHZwOF9maWx0ZXJfbCksIFt2cDhfZmlsdGVyX3JdICI9JnIiICh2cDhfZmlsdGVyX3IpLAotICAgICAgICAgIFtzdWJyX2xdICI9JnIiIChzdWJyX2wpLCBbc3Vicl9yXSAiPSZyIiAoc3Vicl9yKSwKLSAgICAgICAgICBbaW52aGV2X2xdICI9JnIiIChpbnZoZXZfbCksIFtpbnZoZXZfcl0gIj0mciIgKGludmhldl9yKQotCi0gICAgICAgIDogW3ZwczBfbF0gInIiICh2cHMwX2wpLCBbdnBzMF9yXSAiciIgKHZwczBfciksIFt2cHMxX2xdICJyIiAodnBzMV9sKSwKLSAgICAgICAgICBbdnBzMV9yXSAiciIgKHZwczFfciksIFt2cXMwX2xdICJyIiAodnFzMF9sKSwgW3ZxczBfcl0gInIiICh2cXMwX3IpLAotICAgICAgICAgIFt2cXMxX2xdICJyIiAodnFzMV9sKSwgW3ZxczFfcl0gInIiICh2cXMxX3IpLAotICAgICAgICAgIFttYXNrX2xdICJyIiAobWFza19sKSwgW21hc2tfcl0gInIiIChtYXNrX3IpLAotICAgICAgICAgIFtoZXZfbF0gInIiIChoZXZfbCksIFtoZXZfcl0gInIiIChoZXZfciksCi0gICAgICAgICAgW0hXTV0gInIiIChIV00pCi0gICAgKTsKLQotICAgIC8qIHNhdmUgYm90dG9tIDMgYml0cyBzbyB0aGF0IHdlIHJvdW5kIG9uZSBzaWRlICs0IGFuZCB0aGUgb3RoZXIgKzMgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgIC8qIEZpbHRlcjIgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlciArIDMpID4+PSAzOyAqLwotICAgICAgICAiYWRkcV9zLnBoICAgICVbRmlsdGVyMV9sXSwgICAgJVt2cDhfZmlsdGVyX2xdLCAlW3QyXSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjFfcl0sICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt0Ml0gICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogRmlsdGVyMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgNCkgPj49IDM7ICovCi0gICAgICAgICJhZGRxX3MucGggICAgJVtGaWx0ZXIyX2xdLCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdDFdICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkcV9zLnBoICAgICVbRmlsdGVyMl9yXSwgICAgJVt2cDhfZmlsdGVyX3JdLCAlW3QxXSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmEucGggICAgICAlW0ZpbHRlcjFfcl0sICAgICVbRmlsdGVyMV9yXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaHJhLnBoICAgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgIDMgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICJzaHJhLnBoICAgICAgJVtGaWx0ZXIyX2xdLCAgICAlW0ZpbHRlcjJfbF0sICAgIDMgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMl9yXSwgICAgJVtGaWx0ZXIyX3JdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMV9sXSwgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKLSAgICAgICAgImFuZCAgICAgICAgICAlW0ZpbHRlcjFfcl0sICAgICVbRmlsdGVyMV9yXSwgICAgJVtIV01dICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogdnBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKTsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczBfbF0sICAgICAgICVbdnBzMF9sXSwgICAgICAgJVtGaWx0ZXIyX2xdICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cHMwX3JdLCAgICAgICAlW3ZwczBfcl0sICAgICAgICVbRmlsdGVyMl9yXSAgICBcblx0IgotCi0gICAgICAgIC8qIHZxczAgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gRmlsdGVyMSk7ICovCi0gICAgICAgICJzdWJxX3MucGggICAgJVt2cXMwX2xdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbRmlsdGVyMV9sXSAgICBcblx0IgotICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMF9yXSwgICAgICAgJVt2cXMwX3JdLCAgICAgICAlW0ZpbHRlcjFfcl0gICAgXG5cdCIKLQotICAgICAgICA6IFtGaWx0ZXIxX2xdICI9JnIiIChGaWx0ZXIxX2wpLCBbRmlsdGVyMV9yXSAiPSZyIiAoRmlsdGVyMV9yKSwKLSAgICAgICAgICBbRmlsdGVyMl9sXSAiPSZyIiAoRmlsdGVyMl9sKSwgW0ZpbHRlcjJfcl0gIj0mciIgKEZpbHRlcjJfciksCi0gICAgICAgICAgW3ZwczBfbF0gIityIiAodnBzMF9sKSwgW3ZwczBfcl0gIityIiAodnBzMF9yKSwKLSAgICAgICAgICBbdnFzMF9sXSAiK3IiICh2cXMwX2wpLCBbdnFzMF9yXSAiK3IiICh2cXMwX3IpCi0KLSAgICAgICAgOiBbdDFdICJyIiAodDEpLCBbdDJdICJyIiAodDIpLAotICAgICAgICAgIFt2cDhfZmlsdGVyX2xdICJyIiAodnA4X2ZpbHRlcl9sKSwgW3ZwOF9maWx0ZXJfcl0gInIiICh2cDhfZmlsdGVyX3IpLAotICAgICAgICAgIFtIV01dICJyIiAoSFdNKQotICAgICk7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgIC8qICh2cDhfZmlsdGVyICs9IDEpID4+PSAxICovCi0gICAgICAgICJhZGRxaC5waCAgICAlW0ZpbHRlcjFfbF0sICAgICVbRmlsdGVyMV9sXSwgICAgICVbdDNdICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkcWgucGggICAgJVtGaWx0ZXIxX3JdLCAgICAlW0ZpbHRlcjFfcl0sICAgICAlW3QzXSAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAvKiB2cDhfZmlsdGVyICY9IH5oZXY7ICovCi0gICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgICVbaW52aGV2X2xdICAgICBcblx0IgotICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIxX3JdLCAgICAlW2ludmhldl9yXSAgICAgXG5cdCIKLQotICAgICAgICAvKiB2cHMxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSArIHZwOF9maWx0ZXIpOyAqLwotICAgICAgICAiYWRkcV9zLnBoICAgICVbdnBzMV9sXSwgICAgICAgJVt2cHMxX2xdLCAgICAgICAlW0ZpbHRlcjFfbF0gICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczFfcl0sICAgICAgICVbdnBzMV9yXSwgICAgICAgJVtGaWx0ZXIxX3JdICAgIFxuXHQiCi0KLSAgICAgICAgLyogdnFzMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczEgLSB2cDhfZmlsdGVyKTsgKi8KLSAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczFfbF0sICAgICAgICVbdnFzMV9sXSwgICAgICAgJVtGaWx0ZXIxX2xdICAgIFxuXHQiCi0gICAgICAgICJzdWJxX3MucGggICAgJVt2cXMxX3JdLCAgICAgICAlW3ZxczFfcl0sICAgICAgICVbRmlsdGVyMV9yXSAgICBcblx0IgotCi0gICAgICAgIDogW0ZpbHRlcjFfbF0gIityIiAoRmlsdGVyMV9sKSwgW0ZpbHRlcjFfcl0gIityIiAoRmlsdGVyMV9yKSwKLSAgICAgICAgICBbdnBzMV9sXSAiK3IiICh2cHMxX2wpLCBbdnBzMV9yXSAiK3IiICh2cHMxX3IpLAotICAgICAgICAgIFt2cXMxX2xdICIrciIgKHZxczFfbCksIFt2cXMxX3JdICIrciIgKHZxczFfcikKLQotICAgICAgICA6IFt0M10gInIiICh0MyksIFtpbnZoZXZfbF0gInIiIChpbnZoZXZfbCksIFtpbnZoZXZfcl0gInIiIChpbnZoZXZfcikKLSAgICApOwotCi0gICAgLyogQ3JlYXRlIHF1YWQtYnl0ZXMgZnJvbSBoYWxmd29yZCBwYWlycyAqLwotICAgIHZxczBfbCA9IHZxczBfbCAmIEhXTTsKLSAgICB2cXMxX2wgPSB2cXMxX2wgJiBIV007Ci0gICAgdnBzMF9sID0gdnBzMF9sICYgSFdNOwotICAgIHZwczFfbCA9IHZwczFfbCAmIEhXTTsKLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInNocmwucGggICAgICAlW3ZxczBfcl0sICAgICAgICVbdnFzMF9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaHJsLnBoICAgICAgJVt2cHMwX3JdLCAgICAgICAlW3ZwczBfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hybC5waCAgICAgICVbdnFzMV9yXSwgICAgICAgJVt2cXMxX3JdLCAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmwucGggICAgICAlW3ZwczFfcl0sICAgICAgICVbdnBzMV9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbdnBzMV9yXSAiK3IiICh2cHMxX3IpLCBbdnFzMV9yXSAiK3IiICh2cXMxX3IpLAotICAgICAgICAgIFt2cHMwX3JdICIrciIgKHZwczBfciksIFt2cXMwX3JdICIrciIgKHZxczBfcikKLSAgICAgICAgOgotICAgICk7Ci0KLSAgICB2cXMwID0gdnFzMF9sIHwgdnFzMF9yOwotICAgIHZxczEgPSB2cXMxX2wgfCB2cXMxX3I7Ci0gICAgdnBzMCA9IHZwczBfbCB8IHZwczBfcjsKLSAgICB2cHMxID0gdnBzMV9sIHwgdnBzMV9yOwotCi0gICAgKnBzMCA9IHZwczAgXiBOMTI4OwotICAgICpwczEgPSB2cHMxIF4gTjEyODsKLSAgICAqcXMwID0gdnFzMCBeIE4xMjg7Ci0gICAgKnFzMSA9IHZxczEgXiBOMTI4OwotfQotCi0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9taXBzCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcywKLSAgICBpbnQgcCwKLSAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAotICAgIHVuc2lnbmVkIGludCBsaW1pdCwKLSAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAotICAgIGludCBjb3VudAotKQotewotICAgIHVpbnQzMl90IG1hc2s7Ci0gICAgdWludDMyX3QgaGV2OwotICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7Ci0gICAgdW5zaWduZWQgY2hhciAqc20xLCAqczAsICpzMSwgKnMyLCAqczMsICpzNCwgKnM1LCAqczY7Ci0KLSAgICBtYXNrID0gMDsKLSAgICBoZXYgPSAwOwotICAgIHAxPTA7IHAyPTA7IHAzPTA7IHA0PTA7Ci0KLSAgICAvKiBwcmVmZXRjaCBkYXRhIGZvciBzdG9yZSAqLwotICAgIHByZWZldGNoX3N0b3JlX2xmKHMpOwotCi0gICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCi0gICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCi0gICAgICovCi0KLSAgICBzbTEgPSBzIC0gKHA8PDIpOwotICAgIHMwID0gcyAtIHAgLSBwIC0gcDsKLSAgICBzMSA9IHMgLSBwIC1wIDsKLSAgICBzMiA9IHMgLSBwOwotICAgIHMzID0gczsKLSAgICBzNCA9IHMgKyBwOwotICAgIHM1ID0gcyArIHAgKyBwOwotICAgIHM2ID0gcyArIHAgKyBwICsgcDsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgKi8KLSAgICBwMSA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICBwMiA9ICooKHVpbnQzMl90KikoczIpKTsKLSAgICBwMyA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICBwNCA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHBtMSA9ICooKHVpbnQzMl90Kikoc20xKSk7Ci0gICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczApKTsKLSAgICAgICAgcDUgID0gKigodWludDMyX3QqKShzNSkpOwotICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHM2KSk7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKLQotICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCi0gICAgICAgICAgICAqKCh1aW50MzJfdCopczEpID0gcDE7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczIpID0gcDI7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczMpID0gcDM7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczQpID0gcDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbTEgKz0gNDsKLSAgICBzMCAgKz0gNDsKLSAgICBzMSAgKz0gNDsKLSAgICBzMiAgKz0gNDsKLSAgICBzMyAgKz0gNDsKLSAgICBzNCAgKz0gNDsKLSAgICBzNSAgKz0gNDsKLSAgICBzNiAgKz0gNDsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgKi8KLSAgICBwMSA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICBwMiA9ICooKHVpbnQzMl90KikoczIpKTsKLSAgICBwMyA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICBwNCA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHBtMSA9ICooKHVpbnQzMl90Kikoc20xKSk7Ci0gICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczApKTsKLSAgICAgICAgcDUgID0gKigodWludDMyX3QqKShzNSkpOwotICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHM2KSk7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKLQotICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCi0gICAgICAgICAgICAqKCh1aW50MzJfdCopczEpID0gcDE7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczIpID0gcDI7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczMpID0gcDM7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczQpID0gcDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbTEgKz0gNDsKLSAgICBzMCAgKz0gNDsKLSAgICBzMSAgKz0gNDsKLSAgICBzMiAgKz0gNDsKLSAgICBzMyAgKz0gNDsKLSAgICBzNCAgKz0gNDsKLSAgICBzNSAgKz0gNDsKLSAgICBzNiAgKz0gNDsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgKi8KLSAgICBwMSA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICBwMiA9ICooKHVpbnQzMl90KikoczIpKTsKLSAgICBwMyA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICBwNCA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHBtMSA9ICooKHVpbnQzMl90Kikoc20xKSk7Ci0gICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczApKTsKLSAgICAgICAgcDUgID0gKigodWludDMyX3QqKShzNSkpOwotICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHM2KSk7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKLQotICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCi0gICAgICAgICAgICAqKCh1aW50MzJfdCopczEpID0gcDE7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczIpID0gcDI7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczMpID0gcDM7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczQpID0gcDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbTEgKz0gNDsKLSAgICBzMCAgKz0gNDsKLSAgICBzMSAgKz0gNDsKLSAgICBzMiAgKz0gNDsKLSAgICBzMyAgKz0gNDsKLSAgICBzNCAgKz0gNDsKLSAgICBzNSAgKz0gNDsKLSAgICBzNiAgKz0gNDsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgKi8KLSAgICBwMSA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICBwMiA9ICooKHVpbnQzMl90KikoczIpKTsKLSAgICBwMyA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICBwNCA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHBtMSA9ICooKHVpbnQzMl90Kikoc20xKSk7Ci0gICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczApKTsKLSAgICAgICAgcDUgID0gKigodWludDMyX3QqKShzNSkpOwotICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHM2KSk7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKLQotICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kICovCi0gICAgICAgICAgICAqKCh1aW50MzJfdCopczEpID0gcDE7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczIpID0gcDI7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczMpID0gcDM7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczQpID0gcDQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfdXZob3Jpem9udGFsX2VkZ2VfbWlwcwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgdW5zaWduZWQgaW50IGZsaW1pdCwKLSAgICB1bnNpZ25lZCBpbnQgbGltaXQsCi0gICAgdW5zaWduZWQgaW50IHRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICB1aW50MzJfdCBtYXNrOwotICAgIHVpbnQzMl90IGhldjsKLSAgICB1aW50MzJfdCBwbTEsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2OwotICAgIHVuc2lnbmVkIGNoYXIgKnNtMSwgKnMwLCAqczEsICpzMiwgKnMzLCAqczQsICpzNSwgKnM2OwotCi0gICAgbWFzayA9IDA7Ci0gICAgaGV2ID0gMDsKLSAgICBwMT0wOyBwMj0wOyBwMz0wOyBwND0wOwotCi0gICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCi0gICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCi0gICAgICovCi0KLSAgICBzbTEgPSBzIC0gKHA8PDIpOwotICAgIHMwICA9IHMgLSBwIC0gcCAtIHA7Ci0gICAgczEgID0gcyAtIHAgLXAgOwotICAgIHMyICA9IHMgLSBwOwotICAgIHMzICA9IHM7Ci0gICAgczQgID0gcyArIHA7Ci0gICAgczUgID0gcyArIHAgKyBwOwotICAgIHM2ICA9IHMgKyBwICsgcCArIHA7Ci0KLSAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCi0gICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgICovCi0gICAgcDEgPSAqKCh1aW50MzJfdCopKHMxKSk7Ci0gICAgcDIgPSAqKCh1aW50MzJfdCopKHMyKSk7Ci0gICAgcDMgPSAqKCh1aW50MzJfdCopKHMzKSk7Ci0gICAgcDQgPSAqKCh1aW50MzJfdCopKHM0KSk7Ci0KLSAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKLSAgICAgKiBtYXNrIHdpbGwgYmUgemVybyBhbmQgZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQKLSAgICAgKi8KLSAgICBpZiAoISgoKHAxLXA0KSA9PSAwKSAmJiAoKHAyLXAzKSA9PSAwKSkpIHsKLQotICAgICAgICBwbTEgPSAqKCh1aW50MzJfdCopKHNtMSkpOwotICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCopKHMwKSk7Ci0gICAgICAgIHA1ICA9ICooKHVpbnQzMl90KikoczUpKTsKLSAgICAgICAgcDYgID0gKigodWludDMyX3QqKShzNikpOwotCi0gICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7Ci0KLSAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCi0gICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7Ci0KLSAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZCAqLwotICAgICAgICAgICAgKigodWludDMyX3QqKXMxKSA9IHAxOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMyKSA9IHAyOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMzKSA9IHAzOwotICAgICAgICAgICAgKigodWludDMyX3QqKXM0KSA9IHA0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc20xICs9IDQ7Ci0gICAgczAgICs9IDQ7Ci0gICAgczEgICs9IDQ7Ci0gICAgczIgICs9IDQ7Ci0gICAgczMgICs9IDQ7Ci0gICAgczQgICs9IDQ7Ci0gICAgczUgICs9IDQ7Ci0gICAgczYgICs9IDQ7Ci0KLSAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCi0gICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgICovCi0gICAgcDEgPSAqKCh1aW50MzJfdCopKHMxKSk7Ci0gICAgcDIgPSAqKCh1aW50MzJfdCopKHMyKSk7Ci0gICAgcDMgPSAqKCh1aW50MzJfdCopKHMzKSk7Ci0gICAgcDQgPSAqKCh1aW50MzJfdCopKHM0KSk7Ci0KLSAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKLSAgICAgKiBtYXNrIHdpbGwgYmUgemVybyBhbmQgZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQKLSAgICAgKi8KLSAgICBpZiAoISgoKHAxLXA0KSA9PSAwKSAmJiAoKHAyLXAzKSA9PSAwKSkpIHsKLQotICAgICAgICBwbTEgPSAqKCh1aW50MzJfdCopKHNtMSkpOwotICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCopKHMwKSk7Ci0gICAgICAgIHA1ICA9ICooKHVpbnQzMl90KikoczUpKTsKLSAgICAgICAgcDYgID0gKigodWludDMyX3QqKShzNikpOwotCi0gICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7Ci0KLSAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCi0gICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7Ci0KLSAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZCAqLwotICAgICAgICAgICAgKigodWludDMyX3QqKXMxKSA9IHAxOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMyKSA9IHAyOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMzKSA9IHAzOwotICAgICAgICAgICAgKigodWludDMyX3QqKXM0KSA9IHA0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbWlwcwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgdW5zaWduZWQgaW50IGZsaW1pdCwKLSAgICB1bnNpZ25lZCBpbnQgbGltaXQsCi0gICAgdW5zaWduZWQgaW50IHRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICBpbnQgaTsKLSAgICB1aW50MzJfdCBtYXNrLCBoZXY7Ci0gICAgdWludDMyX3QgcG0xLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNjsKLSAgICB1bnNpZ25lZCBjaGFyICpzMSwgKnMyLCAqczMsICpzNDsKLSAgICB1aW50MzJfdCBwcmltMSwgcHJpbTIsIHNlYzMsIHNlYzQsIHByaW0zLCBwcmltNDsKLQotICAgIGhldiA9IDA7Ci0gICAgbWFzayA9IDA7Ci0gICAgaSA9IDA7Ci0gICAgcG0xPTA7IHAwPTA7IHAxPTA7IHAyPTA7IHAzPTA7IHA0PTA7IHA1PTA7IHA2PTA7Ci0KLSAgICAvKiBsb29wIGZpbHRlciBkZXNpZ25lZCB0byB3b3JrIHVzaW5nIGNoYXJzIHNvIHRoYXQgd2UgY2FuIG1ha2UgbWF4aW11bSB1c2UKLSAgICAgKiBvZiA4IGJpdCBzaW1kIGluc3RydWN0aW9ucy4KLSAgICAgKi8KLQotICAgIC8qIGFwcGx5IGZpbHRlciBvbiA0IHBpeGVzbCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgZG8gewotCi0gICAgICAgIC8qIHByZWZldGNoIGRhdGEgZm9yIHN0b3JlICovCi0gICAgICAgIHByZWZldGNoX3N0b3JlX2xmKHMrcCk7Ci0KLSAgICAgICAgczEgPSBzOwotICAgICAgICBzMiA9IHMgKyBwOwotICAgICAgICBzMyA9IHMyICsgcDsKLSAgICAgICAgczQgPSBzMyArIHA7Ci0gICAgICAgIHMgID0gczQgKyBwOwotCi0gICAgICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgICAgICAqLwotICAgICAgICBwMiAgPSAqKCh1aW50MzJfdCopKHMxLTQpKTsKLSAgICAgICAgcDYgID0gKigodWludDMyX3QqKShzMSkpOwotICAgICAgICBwMSAgPSAqKCh1aW50MzJfdCopKHMyIC0gNCkpOwotICAgICAgICBwNSAgPSAqKCh1aW50MzJfdCopKHMyKSk7Ci0gICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczMgLSA0KSk7Ci0gICAgICAgIHA0ICA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICAgICAgcG0xID0gKigodWludDMyX3QqKShzNCAtIDQpKTsKLSAgICAgICAgcDMgID0gKigodWludDMyX3QqKShzNCkpOwotCi0gICAgICAgIC8qIHRyYW5zcG9zZSBwbTEsIHAwLCBwMSwgcDIgKi8KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3AxXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotCi0gICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3AwXSwgICAgICAlW3BtMV0sICAgICAlW3NlYzRdICAgICBcblx0IgotICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDFdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKLSAgICAgICAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCi0gICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCi0gICAgICAgICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKLSAgICAgICAgICAgIDoKLSAgICAgICAgKTsKLQotICAgICAgICAvKiB0cmFuc3Bvc2UgcDMsIHA0LCBwNSwgcDYgKi8KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3A1XSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcDNdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotCi0gICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNl0sICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgotICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDVdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwM10sICAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKLSAgICAgICAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCi0gICAgICAgICAgICAgIFtwNl0gIityIiAocDYpLCBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAotICAgICAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCi0gICAgICAgICAgICA6Ci0gICAgICAgICk7Ci0KLSAgICAgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCi0gICAgICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCEoKChwMS1wNCkgPT0gMCkgJiYgKChwMi1wMykgPT0gMCkpKSB7Ci0KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaCwgJmhldiwgJm1hc2spOwotCi0gICAgICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgLyogZmlsdGVyaW5nICovCi0gICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9taXBzKG1hc2ssIGhldiwgJnAxLCAmcDIsICZwMywgJnA0KTsKLQotICAgICAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZAotICAgICAgICAgICAgICAgICAqIGRvbid0IHVzZSB0cmFuc3Bvc2Ugb24gb3V0cHV0IGRhdGEKLSAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIG1lbW9yeSBpc24ndCBhbGlnbmVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzNF0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzNF0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczRdICJyIiAoczQpLAotICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MzXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczNdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzM10pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MzXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgOiBbcDFdICIrciIgKHAxKQotICAgICAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksIFtwMl0gInIiIChwMikKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MyXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MyXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMl0gInIiIChzMiksCi0gICAgICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczFdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMV0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczFdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwKLSAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHMxID0gczsKLSAgICAgICAgczIgPSBzICsgcDsKLSAgICAgICAgczMgPSBzMiArIHA7Ci0gICAgICAgIHM0ID0gczMgKyBwOwotICAgICAgICBzICA9IHM0ICsgcDsKLQotICAgICAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCi0gICAgICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAotICAgICAgICAgKi8KLSAgICAgICAgcDIgID0gKigodWludDMyX3QqKShzMS00KSk7Ci0gICAgICAgIHA2ICA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICAgICAgcDEgID0gKigodWludDMyX3QqKShzMiAtIDQpKTsKLSAgICAgICAgcDUgID0gKigodWludDMyX3QqKShzMikpOwotICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCopKHMzIC0gNCkpOwotICAgICAgICBwNCAgPSAqKCh1aW50MzJfdCopKHMzKSk7Ci0gICAgICAgIHBtMSA9ICooKHVpbnQzMl90KikoczQgLSA0KSk7Ci0gICAgICAgIHAzICA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgICAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgotCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3BtMV0sICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLQotICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDJdLCAgICAgICVbcDFdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMF0sICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSAgICAgXG5cdCIKLSAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcG0xXSwgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCi0gICAgICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAotICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApLCBbcG0xXSAiK3IiIChwbTEpLAotICAgICAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCi0gICAgICAgICAgICA6Ci0gICAgICAgICk7Ci0KLSAgICAgICAgLyogdHJhbnNwb3NlIHAzLCBwNCwgcDUsIHA2ICovCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgotCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwNV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLQotICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNF0sICAgICAgJVtwM10sICAgICAgJVtzZWM0XSAgICAgXG5cdCIKLSAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3A1XSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCi0gICAgICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAotICAgICAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQotICAgICAgICAgICAgOgotICAgICAgICApOwotCi0gICAgICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAgICAgKiBtYXNrIHdpbGwgYmUgemVybyBhbmQgZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgICAgICB2cDhfZmlsdGVyX21hc2tfdmVjX21pcHMobGltaXQsIGZsaW1pdCwgcDEsIHAyLCBwbTEsIHAwLCBwMywgcDQsIHA1LCBwNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB1bnBhY2sgcHJvY2Vzc2VkIDR4NCBuZWlnaGJvcmhvb2QKLSAgICAgICAgICAgICAgICAgKiBkb24ndCB1c2UgdHJhbnNwb3NlIG9uIG91dHB1dCBkYXRhCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzNF0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3M0XSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3M0XSAiciIgKHM0KSwKLSAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6IFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpCi0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzM10pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczNdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzM10pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDogW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczNdICJyIiAoczMpLCBbcDJdICJyIiAocDIpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6IFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpCi0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MyXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczJdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAgICAgOiBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczJdICJyIiAoczIpLAotICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MxXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczFdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMV0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MxXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMV0gInIiIChzMSksCi0gICAgICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaSs9ODsKLSAgICB9Ci0KLSAgICB3aGlsZSAoaSA8IGNvdW50KTsKLX0KLQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl91dnZlcnRpY2FsX2VkZ2VfbWlwcwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgdW5zaWduZWQgaW50IGZsaW1pdCwKLSAgICB1bnNpZ25lZCBpbnQgbGltaXQsCi0gICAgdW5zaWduZWQgaW50IHRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICB1aW50MzJfdCBtYXNrLCBoZXY7Ci0gICAgdWludDMyX3QgcG0xLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNjsKLSAgICB1bnNpZ25lZCBjaGFyICpzMSwgKnMyLCAqczMsICpzNDsKLSAgICB1aW50MzJfdCB0ZW1wLCBwcmltMSwgcHJpbTIsIHNlYzMsIHNlYzQsIHByaW0zLCBwcmltNDsKLQotICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQotICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgotICAgICAqLwotCi0gICAgLyogYXBwbHkgZmlsdGVyIG9uIDQgcGl4ZXNsIGF0IHRoZSBzYW1lIHRpbWUgKi8KLQotICAgIHMxID0gczsKLSAgICBzMiA9IHMgKyBwOwotICAgIHMzID0gczIgKyBwOwotICAgIHM0ID0gczMgKyBwOwotCi0gICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycwotICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgKi8KLSAgICBwMiAgPSAqKCh1aW50MzJfdCopKHMxLTQpKTsKLSAgICBwNiAgPSAqKCh1aW50MzJfdCopKHMxKSk7Ci0gICAgcDEgID0gKigodWludDMyX3QqKShzMiAtIDQpKTsKLSAgICBwNSAgPSAqKCh1aW50MzJfdCopKHMyKSk7Ci0gICAgcDAgID0gKigodWludDMyX3QqKShzMyAtIDQpKTsKLSAgICBwNCAgPSAqKCh1aW50MzJfdCopKHMzKSk7Ci0gICAgcG0xID0gKigodWludDMyX3QqKShzNCAtIDQpKTsKLSAgICBwMyAgPSAqKCh1aW50MzJfdCopKHM0KSk7Ci0KLSAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKLQotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLQotICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKLSAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCi0gICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKLQotICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAotICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAotICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCi0gICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQotICAgICAgICA6Ci0gICAgKTsKLQotICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKLSAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKLSAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCi0gICAgICAgIDoKLSAgICApOwotCi0gICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCi0gICAgKiBtYXNrIHdpbGwgYmUgemVybyBhbmQgZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQKLSAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7Ci0KLSAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCi0gICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7Ci0KLSAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZAotICAgICAgICAgICAgICogZG9uJ3QgdXNlIHRyYW5zcG9zZSBvbiBvdXRwdXQgZGF0YQotICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzNF0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzNF0gInIiIChzNCksCi0gICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczNdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzM10pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczNdKSAgICBcblx0IgotICAgICAgICAgICAgICAgIDogW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksIFtwMl0gInIiIChwMikKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MyXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MyXSAiciIgKHMyKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMV0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczFdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMV0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHMxID0gczQgK3A7Ci0gICAgczIgPSBzMSArIHA7Ci0gICAgczMgPSBzMiArIHA7Ci0gICAgczQgPSBzMyArIHA7Ci0KLSAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCi0gICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgICovCi0gICAgcDIgID0gKigodWludDMyX3QqKShzMS00KSk7Ci0gICAgcDYgID0gKigodWludDMyX3QqKShzMSkpOwotICAgIHAxICA9ICooKHVpbnQzMl90KikoczIgLSA0KSk7Ci0gICAgcDUgID0gKigodWludDMyX3QqKShzMikpOwotICAgIHAwICA9ICooKHVpbnQzMl90KikoczMgLSA0KSk7Ci0gICAgcDQgID0gKigodWludDMyX3QqKShzMykpOwotICAgIHBtMSA9ICooKHVpbnQzMl90KikoczQgLSA0KSk7Ci0gICAgcDMgID0gKigodWludDMyX3QqKShzNCkpOwotCi0gICAgLyogdHJhbnNwb3NlIHBtMSwgcDAsIHAxLCBwMiAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcDFdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3BtMV0sICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5waC53ICAgICVbcDJdLCAgICAgICVbcDFdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucGgudyAgICAlW3AwXSwgICAgICAlW3BtMV0sICAgICAlW3NlYzRdICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgICVbcG0xXSwgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKLSAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKLSAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApLCBbcG0xXSAiK3IiIChwbTEpLAotICAgICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKLSAgICAgICAgOgotICAgICk7Ci0KLSAgICAvKiB0cmFuc3Bvc2UgcDMsIHA0LCBwNSwgcDYgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgotCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3A1XSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtwM10sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotCi0gICAgICAgICJwcmVjcnEucGgudyAgICAlW3A2XSwgICAgICAlW3A1XSwgICAgICAlW3NlYzNdICAgICBcblx0IgotICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNF0sICAgICAgJVtwM10sICAgICAgJVtzZWM0XSAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDVdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhcHBlbmQgICAgICAgICAlW3AzXSwgICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgotCi0gICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCi0gICAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCi0gICAgICAgICAgW3A2XSAiK3IiIChwNiksIFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCi0gICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQotICAgICAgICA6Ci0gICAgKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7Ci0KLSAgICAgICAgLyogaWYgbWFzayA9PSAwIGRvIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkICovCi0gICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMSwgJnAyLCAmcDMsICZwNCk7Ci0KLSAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZAotICAgICAgICAgICAgICogZG9uJ3QgdXNlIHRyYW5zcG9zZSBvbiBvdXRwdXQgZGF0YQotICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzNF0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczRdKSAgICBcblx0IgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzNF0gInIiIChzNCksCi0gICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgIDogW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLCBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczNdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzM10pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczNdKSAgICBcblx0IgotICAgICAgICAgICAgICAgIDogW3AxXSAiK3IiIChwMSkKLSAgICAgICAgICAgICAgICA6IFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksIFtwMl0gInIiIChwMikKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MyXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMl0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MyXSAiciIgKHMyKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKQotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMV0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczFdKSAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MxXSkgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMV0pICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotLyogaW5wdXRzICYgb3V0cHV0cyBhcmUgcXVhZC1ieXRlIHZlY3RvcnMgKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIHZwOF9tYmZpbHRlcl9taXBzCi0oCi0gICAgdWludDMyX3QgbWFzaywKLSAgICB1aW50MzJfdCBoZXYsCi0gICAgdWludDMyX3QgKnBzMiwKLSAgICB1aW50MzJfdCAqcHMxLAotICAgIHVpbnQzMl90ICpwczAsCi0gICAgdWludDMyX3QgKnFzMCwKLSAgICB1aW50MzJfdCAqcXMxLAotICAgIHVpbnQzMl90ICpxczIKLSkKLXsKLSAgICBpbnQzMl90IHZwczIsIHZwczEsIHZwczAsIHZxczAsIHZxczEsIHZxczI7Ci0gICAgaW50MzJfdCB2cHMyX2wsIHZwczFfbCwgdnBzMF9sLCB2cXMwX2wsIHZxczFfbCwgdnFzMl9sOwotICAgIGludDMyX3QgdnBzMl9yLCB2cHMxX3IsIHZwczBfciwgdnFzMF9yLCB2cXMxX3IsIHZxczJfcjsKLSAgICB1aW50MzJfdCBIV00sIHZwOF9maWx0ZXJfbCwgdnA4X2ZpbHRlcl9yLCBtYXNrX2wsIG1hc2tfciwgaGV2X2wsIGhldl9yLCBzdWJyX3IsIHN1YnJfbDsKLSAgICB1aW50MzJfdCBGaWx0ZXIyX2wsIEZpbHRlcjJfciwgdDEsIHQyLCBGaWx0ZXIxX2wsIEZpbHRlcjFfciwgaW52aGV2X2wsIGludmhldl9yOwotICAgIHVpbnQzMl90IE4xMjgsIFI2MzsKLSAgICB1aW50MzJfdCB1MV9sLCB1MV9yLCB1Ml9sLCB1Ml9yLCB1M19sLCB1M19yOwotCi0gICAgUjYzICA9IDB4MDAzRjAwM0Y7Ci0gICAgSFdNICA9IDB4RkYwMEZGMDA7Ci0gICAgTjEyOCA9IDB4ODA4MDgwODA7Ci0gICAgdDEgICA9IDB4MDMwMDAzMDA7Ci0gICAgdDIgICA9IDB4MDQwMDA0MDA7Ci0KLSAgICB2cHMwID0gKCpwczApIF4gTjEyODsKLSAgICB2cHMxID0gKCpwczEpIF4gTjEyODsKLSAgICB2cHMyID0gKCpwczIpIF4gTjEyODsKLSAgICB2cXMwID0gKCpxczApIF4gTjEyODsKLSAgICB2cXMxID0gKCpxczEpIF4gTjEyODsKLSAgICB2cXMyID0gKCpxczIpIF4gTjEyODsKLQotICAgIC8qIHVzZSBoYWxmd29yZCBwYWlycyBpbnN0ZWFkIHF1YWQtYnl0ZXMgYmVjYXVzZSBvZiBhY2N1cmFjeSAqLwotICAgIHZwczBfbCA9IHZwczAgJiBIV007Ci0gICAgdnBzMF9yID0gdnBzMCA8PCA4OwotICAgIHZwczBfciA9IHZwczBfciAmIEhXTTsKLQotICAgIHZxczBfbCA9IHZxczAgJiBIV007Ci0gICAgdnFzMF9yID0gdnFzMCA8PCA4OwotICAgIHZxczBfciA9IHZxczBfciAmIEhXTTsKLQotICAgIHZwczFfbCA9IHZwczEgJiBIV007Ci0gICAgdnBzMV9yID0gdnBzMSA8PCA4OwotICAgIHZwczFfciA9IHZwczFfciAmIEhXTTsKLQotICAgIHZxczFfbCA9IHZxczEgJiBIV007Ci0gICAgdnFzMV9yID0gdnFzMSA8PCA4OwotICAgIHZxczFfciA9IHZxczFfciAmIEhXTTsKLQotICAgIHZxczJfbCA9IHZxczIgJiBIV007Ci0gICAgdnFzMl9yID0gdnFzMiA8PCA4OwotICAgIHZxczJfciA9IHZxczJfciAmIEhXTTsKLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgLyogcXMwIC0gcHMwICovCi0gICAgICAgICJzdWJxX3MucGggICAgJVtzdWJyX2xdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbdnBzMF9sXSAgICAgICBcblx0IgotICAgICAgICAic3VicV9zLnBoICAgICVbc3Vicl9yXSwgICAgICAgJVt2cXMwX3JdLCAgICAgICAlW3ZwczBfcl0gICAgICAgXG5cdCIKLQotICAgICAgICAvKiB2cDhfZmlsdGVyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMSAtIHFzMSk7ICovCi0gICAgICAgICJzdWJxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwczFfbF0sICAgICAgICVbdnFzMV9sXSAgICAgICBcblx0IgotICAgICAgICAic3VicV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cHMxX3JdLCAgICAgICAlW3ZxczFfcl0gICAgICAgXG5cdCIKLQotICAgICAgICA6IFt2cDhfZmlsdGVyX2xdICI9JnIiICh2cDhfZmlsdGVyX2wpLCBbdnA4X2ZpbHRlcl9yXSAiPXIiICh2cDhfZmlsdGVyX3IpLAotICAgICAgICAgIFtzdWJyX2xdICI9JnIiIChzdWJyX2wpLCBbc3Vicl9yXSAiPSZyIiAoc3Vicl9yKQotICAgICAgICA6IFt2cHMwX2xdICJyIiAodnBzMF9sKSwgW3ZwczBfcl0gInIiICh2cHMwX3IpLCBbdnBzMV9sXSAiciIgKHZwczFfbCksCi0gICAgICAgICAgW3ZwczFfcl0gInIiICh2cHMxX3IpLCBbdnFzMF9sXSAiciIgKHZxczBfbCksIFt2cXMwX3JdICJyIiAodnFzMF9yKSwKLSAgICAgICAgICBbdnFzMV9sXSAiciIgKHZxczFfbCksIFt2cXMxX3JdICJyIiAodnFzMV9yKQotICAgICk7Ci0KLSAgICB2cHMyX2wgPSB2cHMyICYgSFdNOwotICAgIHZwczJfciA9IHZwczIgPDwgODsKLSAgICB2cHMyX3IgPSB2cHMyX3IgJiBIV007Ci0KLSAgICAvKiBhZGQgb3V0ZXIgdGFwcyBpZiB3ZSBoYXZlIGhpZ2ggZWRnZSB2YXJpYW5jZSAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgLyogdnA4X2ZpbHRlciA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqIChxczAgLSBwczApKTsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbdnA4X2ZpbHRlcl9sXSwgJVtzdWJyX2xdICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX3JdLCAlW3ZwOF9maWx0ZXJfcl0sICVbc3Vicl9yXSAgICAgICBcblx0IgotICAgICAgICAiYW5kICAgICAgICAgICVbbWFza19sXSwgICAgICAgJVtIV01dLCAgICAgICAgICAlW21hc2tdICAgICAgICAgXG5cdCIKLSAgICAgICAgInNsbCAgICAgICAgICAlW21hc2tfcl0sICAgICAgICVbbWFza10sICAgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhbmQgICAgICAgICAgJVttYXNrX3JdLCAgICAgICAlW0hXTV0sICAgICAgICAgICVbbWFza19yXSAgICAgICBcblx0IgotICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9sXSwgJVt2cDhfZmlsdGVyX2xdLCAlW3N1YnJfbF0gICAgICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwOF9maWx0ZXJfcl0sICVbdnA4X2ZpbHRlcl9yXSwgJVtzdWJyX3JdICAgICAgIFxuXHQiCi0gICAgICAgICJhbmQgICAgICAgICAgJVtoZXZfbF0sICAgICAgICAlW0hXTV0sICAgICAgICAgICVbaGV2XSAgICAgICAgICBcblx0IgotICAgICAgICAic2xsICAgICAgICAgICVbaGV2X3JdLCAgICAgICAgJVtoZXZdLCAgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFuZCAgICAgICAgICAlW2hldl9yXSwgICAgICAgICVbSFdNXSwgICAgICAgICAgJVtoZXZfcl0gICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbc3Vicl9sXSAgICAgICBcblx0IgotICAgICAgICAiYWRkcV9zLnBoICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW3N1YnJfcl0gICAgICAgXG5cdCIKLQotICAgICAgICAvKiB2cDhfZmlsdGVyICY9IG1hc2s7ICovCi0gICAgICAgICJhbmQgICAgICAgICAgJVt2cDhfZmlsdGVyX2xdLCAlW3ZwOF9maWx0ZXJfbF0sICVbbWFza19sXSAgICAgICBcblx0IgotICAgICAgICAiYW5kICAgICAgICAgICVbdnA4X2ZpbHRlcl9yXSwgJVt2cDhfZmlsdGVyX3JdLCAlW21hc2tfcl0gICAgICAgXG5cdCIKLQotICAgICAgICAvKiBGaWx0ZXIyID0gdnA4X2ZpbHRlciAmIGhldjsgKi8KLSAgICAgICAgImFuZCAgICAgICAgICAlW0ZpbHRlcjJfbF0sICAgICVbdnA4X2ZpbHRlcl9sXSwgJVtoZXZfbF0gICAgICAgIFxuXHQiCi0gICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIyX3JdLCAgICAlW3ZwOF9maWx0ZXJfcl0sICVbaGV2X3JdICAgICAgICBcblx0IgotCi0gICAgICAgIDogW3ZwOF9maWx0ZXJfbF0gIityIiAodnA4X2ZpbHRlcl9sKSwgW3ZwOF9maWx0ZXJfcl0gIityIiAodnA4X2ZpbHRlcl9yKSwKLSAgICAgICAgICBbaGV2X2xdICI9JnIiIChoZXZfbCksIFtoZXZfcl0gIj0mciIgKGhldl9yKSwKLSAgICAgICAgICBbbWFza19sXSAiPSZyIiAobWFza19sKSwgW21hc2tfcl0gIj0mciIgKG1hc2tfciksCi0gICAgICAgICAgW0ZpbHRlcjJfbF0gIj0mciIgKEZpbHRlcjJfbCksIFtGaWx0ZXIyX3JdICI9JnIiIChGaWx0ZXIyX3IpCi0gICAgICAgIDogW3N1YnJfbF0gInIiIChzdWJyX2wpLCBbc3Vicl9yXSAiciIgKHN1YnJfciksCi0gICAgICAgICAgW0hXTV0gInIiIChIV00pLCBbaGV2XSAgInIiIChoZXYpLCBbbWFza10gInIiIChtYXNrKQotICAgICk7Ci0KLSAgICAvKiBzYXZlIGJvdHRvbSAzIGJpdHMgc28gdGhhdCB3ZSByb3VuZCBvbmUgc2lkZSArNCBhbmQgdGhlIG90aGVyICszICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAvKiBGaWx0ZXIxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyA0KSA+Pj0gMzsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjFfbF0sICAgICVbRmlsdGVyMl9sXSwgICAgJVt0Ml0gICAgICAgICAgIFxuXHQiCi0gICAgICAgICJ4b3IgICAgICAgICAgJVtpbnZoZXZfbF0sICAgICAlW2hldl9sXSwgICAgICAgICVbSFdNXSAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkcV9zLnBoICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIyX3JdLCAgICAlW3QyXSAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAvKiBGaWx0ZXIyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyAzKSA+Pj0gMzsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW0ZpbHRlcjJfbF0sICAgICVbRmlsdGVyMl9sXSwgICAgJVt0MV0gICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVtGaWx0ZXIyX3JdLCAgICAlW0ZpbHRlcjJfcl0sICAgICVbdDFdICAgICAgICAgICBcblx0IgotCi0gICAgICAgICJzaHJhLnBoICAgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgIDMgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIxX3JdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMl9sXSwgICAgJVtGaWx0ZXIyX2xdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmEucGggICAgICAlW0ZpbHRlcjJfcl0sICAgICVbRmlsdGVyMl9yXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIxX2xdLCAgICAlW0ZpbHRlcjFfbF0sICAgICVbSFdNXSAgICAgICAgICBcblx0IgotICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMV9yXSwgICAgJVtGaWx0ZXIxX3JdLCAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKLSAgICAgICAgInhvciAgICAgICAgICAlW2ludmhldl9yXSwgICAgICVbaGV2X3JdLCAgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogcXMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpOyAqLwotICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMF9sXSwgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW0ZpbHRlcjFfbF0gICAgXG5cdCIKLSAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczBfcl0sICAgICAgICVbdnFzMF9yXSwgICAgICAgJVtGaWx0ZXIxX3JdICAgIFxuXHQiCi0KLSAgICAgICAgLyogcHMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIEZpbHRlcjIpOyAqLwotICAgICAgICAiYWRkcV9zLnBoICAgICVbdnBzMF9sXSwgICAgICAgJVt2cHMwX2xdLCAgICAgICAlW0ZpbHRlcjJfbF0gICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczBfcl0sICAgICAgICVbdnBzMF9yXSwgICAgICAgJVtGaWx0ZXIyX3JdICAgIFxuXHQiCi0KLSAgICAgICAgOiBbaW52aGV2X2xdICI9JnIiIChpbnZoZXZfbCksIFtpbnZoZXZfcl0gIj0mciIgKGludmhldl9yKSwKLSAgICAgICAgICBbRmlsdGVyMV9sXSAiPSZyIiAoRmlsdGVyMV9sKSwgW0ZpbHRlcjFfcl0gIj0mciIgKEZpbHRlcjFfciksCi0gICAgICAgICAgW0ZpbHRlcjJfbF0gIityIiAoRmlsdGVyMl9sKSwgW0ZpbHRlcjJfcl0gIityIiAoRmlsdGVyMl9yKSwKLSAgICAgICAgICBbdnBzMF9sXSAiK3IiICh2cHMwX2wpLCBbdnBzMF9yXSAiK3IiICh2cHMwX3IpLAotICAgICAgICAgIFt2cXMwX2xdICIrciIgKHZxczBfbCksIFt2cXMwX3JdICIrciIgKHZxczBfcikKLSAgICAgICAgOiBbdDFdICJyIiAodDEpLCBbdDJdICJyIiAodDIpLCBbSFdNXSAiciIgKEhXTSksCi0gICAgICAgICAgW2hldl9sXSAiciIgKGhldl9sKSwgW2hldl9yXSAiciIgKGhldl9yKQotICAgICk7Ci0KLSAgICAvKiBvbmx5IGFwcGx5IHdpZGVyIGZpbHRlciBpZiBub3QgaGlnaCBlZGdlIHZhcmlhbmNlICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAvKiB2cDhfZmlsdGVyICY9IH5oZXY7ICovCi0gICAgICAgICJhbmQgICAgICAgICAgJVtGaWx0ZXIyX2xdLCAgICAlW3ZwOF9maWx0ZXJfbF0sICVbaW52aGV2X2xdICAgICBcblx0IgotICAgICAgICAiYW5kICAgICAgICAgICVbRmlsdGVyMl9yXSwgICAgJVt2cDhfZmlsdGVyX3JdLCAlW2ludmhldl9yXSAgICAgXG5cdCIKLQotICAgICAgICAic2hyYS5waCAgICAgICVbRmlsdGVyMl9sXSwgICAgJVtGaWx0ZXIyX2xdLCAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmEucGggICAgICAlW0ZpbHRlcjJfcl0sICAgICVbRmlsdGVyMl9yXSwgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbRmlsdGVyMl9sXSAiPSZyIiAoRmlsdGVyMl9sKSwgW0ZpbHRlcjJfcl0gIj0mciIgKEZpbHRlcjJfcikKLSAgICAgICAgOiBbdnA4X2ZpbHRlcl9sXSAiciIgKHZwOF9maWx0ZXJfbCksIFt2cDhfZmlsdGVyX3JdICJyIiAodnA4X2ZpbHRlcl9yKSwKLSAgICAgICAgICBbaW52aGV2X2xdICJyIiAoaW52aGV2X2wpLCBbaW52aGV2X3JdICJyIiAoaW52aGV2X3IpCi0gICAgKTsKLQotICAgIC8qIHJvdWdobHkgMy83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJzaGxsLnBoICAgICAgJVt1M19sXSwgICAgICAgICAlW0ZpbHRlcjJfbF0sICAgIDMgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hsbC5waCAgICAgICVbdTNfcl0sICAgICAgICAgJVtGaWx0ZXIyX3JdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiYWRkcS5waCAgICAgICVbdTNfbF0sICAgICAgICAgJVt1M19sXSwgICAgICAgICAlW0ZpbHRlcjJfbF0gICAgXG5cdCIKLSAgICAgICAgImFkZHEucGggICAgICAlW3UzX3JdLCAgICAgICAgICVbdTNfcl0sICAgICAgICAgJVtGaWx0ZXIyX3JdICAgIFxuXHQiCi0KLSAgICAgICAgInNobGwucGggICAgICAlW3UyX2xdLCAgICAgICAgICVbdTNfbF0sICAgICAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaGxsLnBoICAgICAgJVt1Ml9yXSwgICAgICAgICAlW3UzX3JdLCAgICAgICAgIDEgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICJhZGRxLnBoICAgICAgJVt1MV9sXSwgICAgICAgICAlW3UzX2xdLCAgICAgICAgICVbdTJfbF0gICAgICAgICBcblx0IgotICAgICAgICAiYWRkcS5waCAgICAgICVbdTFfcl0sICAgICAgICAgJVt1M19yXSwgICAgICAgICAlW3UyX3JdICAgICAgICAgXG5cdCIKLQotICAgICAgICAiYWRkcS5waCAgICAgICVbdTJfbF0sICAgICAgICAgJVt1Ml9sXSwgICAgICAgICAlW1I2M10gICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZHEucGggICAgICAlW3UyX3JdLCAgICAgICAgICVbdTJfcl0sICAgICAgICAgJVtSNjNdICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgImFkZHEucGggICAgICAlW3UzX2xdLCAgICAgICAgICVbdTNfbF0sICAgICAgICAgJVtSNjNdICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxLnBoICAgICAgJVt1M19yXSwgICAgICAgICAlW3UzX3JdLCAgICAgICAgICVbUjYzXSAgICAgICAgICBcblx0IgotCi0gICAgICAgIC8qIHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpID4+IDcpCi0gICAgICAgICAqIHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMTgpID4+IDcpCi0gICAgICAgICAqLwotICAgICAgICAiYWRkcS5waCAgICAgICVbdTFfbF0sICAgICAgICAgJVt1MV9sXSwgICAgICAgICAlW1I2M10gICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZHEucGggICAgICAlW3UxX3JdLCAgICAgICAgICVbdTFfcl0sICAgICAgICAgJVtSNjNdICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaHJhLnBoICAgICAgJVt1MV9sXSwgICAgICAgICAlW3UxX2xdLCAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hyYS5waCAgICAgICVbdTFfcl0sICAgICAgICAgJVt1MV9yXSwgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmEucGggICAgICAlW3UyX2xdLCAgICAgICAgICVbdTJfbF0sICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaHJhLnBoICAgICAgJVt1Ml9yXSwgICAgICAgICAlW3UyX3JdLCAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hsbC5waCAgICAgICVbdTFfbF0sICAgICAgICAgJVt1MV9sXSwgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNobGwucGggICAgICAlW3UxX3JdLCAgICAgICAgICVbdTFfcl0sICAgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaGxsLnBoICAgICAgJVt1Ml9sXSwgICAgICAgICAlW3UyX2xdLCAgICAgICAgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hsbC5waCAgICAgICVbdTJfcl0sICAgICAgICAgJVt1Ml9yXSwgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAvKiB2cXMwID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpOyAqLwotICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMF9sXSwgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW3UxX2xdICAgICAgICAgXG5cdCIKLSAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczBfcl0sICAgICAgICVbdnFzMF9yXSwgICAgICAgJVt1MV9yXSAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogdnBzMCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KTsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczBfbF0sICAgICAgICVbdnBzMF9sXSwgICAgICAgJVt1MV9sXSAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cHMwX3JdLCAgICAgICAlW3ZwczBfcl0sICAgICAgICVbdTFfcl0gICAgICAgICBcblx0IgotCi0gICAgICAgIDogW3UxX2xdICI9JnIiICh1MV9sKSwgW3UxX3JdICI9JnIiICh1MV9yKSwgW3UyX2xdICI9JnIiICh1Ml9sKSwKLSAgICAgICAgICBbdTJfcl0gIj0mciIgKHUyX3IpLCBbdTNfbF0gIj0mciIgKHUzX2wpLCBbdTNfcl0gIj0mciIgKHUzX3IpLAotICAgICAgICAgIFt2cHMwX2xdICIrciIgKHZwczBfbCksIFt2cHMwX3JdICIrciIgKHZwczBfciksCi0gICAgICAgICAgW3ZxczBfbF0gIityIiAodnFzMF9sKSwgW3ZxczBfcl0gIityIiAodnFzMF9yKQotICAgICAgICA6IFtSNjNdICAiciIgKFI2MyksCi0gICAgICAgICAgW0ZpbHRlcjJfbF0gInIiIChGaWx0ZXIyX2wpLCBbRmlsdGVyMl9yXSAiciIgKEZpbHRlcjJfcikKLSAgICApOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAvKiB2cXMxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUpOyAqLwotICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMV9sXSwgICAgICAgJVt2cXMxX2xdLCAgICAgICAlW3UyX2xdICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczFfbF0sICAgICAgICVbdnBzMV9sXSwgICAgICAgJVt1Ml9sXSAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogdnBzMSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB1KTsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczFfcl0sICAgICAgICVbdnBzMV9yXSwgICAgICAgJVt1Ml9yXSAgICAgICAgIFxuXHQiCi0gICAgICAgICJzdWJxX3MucGggICAgJVt2cXMxX3JdLCAgICAgICAlW3ZxczFfcl0sICAgICAgICVbdTJfcl0gICAgICAgICBcblx0IgotCi0gICAgICAgIDogW3ZwczFfbF0gIityIiAodnBzMV9sKSwgW3ZwczFfcl0gIityIiAodnBzMV9yKSwKLSAgICAgICAgICBbdnFzMV9sXSAiK3IiICh2cXMxX2wpLCBbdnFzMV9yXSAiK3IiICh2cXMxX3IpCi0gICAgICAgIDogW3UyX2xdICJyIiAodTJfbCksIFt1Ml9yXSAiciIgKHUyX3IpCi0gICAgKTsKLQotICAgIC8qIHJvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgIC8qIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDkpID4+IDcpOyAqLwotICAgICAgICAic2hyYS5waCAgICAgICVbdTNfbF0sICAgICAgICAgJVt1M19sXSwgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmEucGggICAgICAlW3UzX3JdLCAgICAgICAgICVbdTNfcl0sICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaGxsLnBoICAgICAgJVt1M19sXSwgICAgICAgICAlW3UzX2xdLCAgICAgICAgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2hsbC5waCAgICAgICVbdTNfcl0sICAgICAgICAgJVt1M19yXSwgICAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAvKiB2cXMyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMiAtIHUpOyAqLwotICAgICAgICAic3VicV9zLnBoICAgICVbdnFzMl9sXSwgICAgICAgJVt2cXMyX2xdLCAgICAgICAlW3UzX2xdICAgICAgICAgXG5cdCIKLSAgICAgICAgInN1YnFfcy5waCAgICAlW3ZxczJfcl0sICAgICAgICVbdnFzMl9yXSwgICAgICAgJVt1M19yXSAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgLyogdnBzMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczIgKyB1KTsgKi8KLSAgICAgICAgImFkZHFfcy5waCAgICAlW3ZwczJfbF0sICAgICAgICVbdnBzMl9sXSwgICAgICAgJVt1M19sXSAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRxX3MucGggICAgJVt2cHMyX3JdLCAgICAgICAlW3ZwczJfcl0sICAgICAgICVbdTNfcl0gICAgICAgICBcblx0IgotCi0gICAgICAgIDogW3UzX2xdICIrciIgKHUzX2wpLCBbdTNfcl0gIityIiAodTNfciksIFt2cHMyX2xdICIrciIgKHZwczJfbCksCi0gICAgICAgICAgW3ZwczJfcl0gIityIiAodnBzMl9yKSwgW3ZxczJfbF0gIityIiAodnFzMl9sKSwgW3ZxczJfcl0gIityIiAodnFzMl9yKQotICAgICAgICA6Ci0gICAgKTsKLQotICAgIC8qIENyZWF0ZSBxdWFkLWJ5dGVzIGZyb20gaGFsZndvcmQgcGFpcnMgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJhbmQgICAgICAgICAgJVt2cXMwX2xdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbSFdNXSAgICAgICAgICBcblx0IgotICAgICAgICAic2hybC5waCAgICAgICVbdnFzMF9yXSwgICAgICAgJVt2cXMwX3JdLCAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiYW5kICAgICAgICAgICVbdnBzMF9sXSwgICAgICAgJVt2cHMwX2xdLCAgICAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmwucGggICAgICAlW3ZwczBfcl0sICAgICAgICVbdnBzMF9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgImFuZCAgICAgICAgICAlW3ZxczFfbF0sICAgICAgICVbdnFzMV9sXSwgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaHJsLnBoICAgICAgJVt2cXMxX3JdLCAgICAgICAlW3ZxczFfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICJhbmQgICAgICAgICAgJVt2cHMxX2xdLCAgICAgICAlW3ZwczFfbF0sICAgICAgICVbSFdNXSAgICAgICAgICBcblx0IgotICAgICAgICAic2hybC5waCAgICAgICVbdnBzMV9yXSwgICAgICAgJVt2cHMxX3JdLCAgICAgICA4ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiYW5kICAgICAgICAgICVbdnFzMl9sXSwgICAgICAgJVt2cXMyX2xdLCAgICAgICAlW0hXTV0gICAgICAgICAgXG5cdCIKLSAgICAgICAgInNocmwucGggICAgICAlW3ZxczJfcl0sICAgICAgICVbdnFzMl9yXSwgICAgICAgOCAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgImFuZCAgICAgICAgICAlW3ZwczJfbF0sICAgICAgICVbdnBzMl9sXSwgICAgICAgJVtIV01dICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaHJsLnBoICAgICAgJVt2cHMyX3JdLCAgICAgICAlW3ZwczJfcl0sICAgICAgIDggICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICJvciAgICAgICAgICAgJVt2cXMwX3JdLCAgICAgICAlW3ZxczBfbF0sICAgICAgICVbdnFzMF9yXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICVbdnBzMF9yXSwgICAgICAgJVt2cHMwX2xdLCAgICAgICAlW3ZwczBfcl0gICAgICAgXG5cdCIKLSAgICAgICAgIm9yICAgICAgICAgICAlW3ZxczFfcl0sICAgICAgICVbdnFzMV9sXSwgICAgICAgJVt2cXMxX3JdICAgICAgIFxuXHQiCi0gICAgICAgICJvciAgICAgICAgICAgJVt2cHMxX3JdLCAgICAgICAlW3ZwczFfbF0sICAgICAgICVbdnBzMV9yXSAgICAgICBcblx0IgotICAgICAgICAib3IgICAgICAgICAgICVbdnFzMl9yXSwgICAgICAgJVt2cXMyX2xdLCAgICAgICAlW3ZxczJfcl0gICAgICAgXG5cdCIKLSAgICAgICAgIm9yICAgICAgICAgICAlW3ZwczJfcl0sICAgICAgICVbdnBzMl9sXSwgICAgICAgJVt2cHMyX3JdICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbdnBzMV9sXSAiK3IiICh2cHMxX2wpLCBbdnBzMV9yXSAiK3IiICh2cHMxX3IpLCBbdnFzMV9sXSAiK3IiICh2cXMxX2wpLAotICAgICAgICAgIFt2cXMxX3JdICIrciIgKHZxczFfciksIFt2cHMwX2xdICIrciIgKHZwczBfbCksIFt2cHMwX3JdICIrciIgKHZwczBfciksCi0gICAgICAgICAgW3ZxczBfbF0gIityIiAodnFzMF9sKSwgW3ZxczBfcl0gIityIiAodnFzMF9yKSwgW3ZxczJfbF0gIityIiAodnFzMl9sKSwKLSAgICAgICAgICBbdnFzMl9yXSAiK3IiICh2cXMyX3IpLCBbdnBzMl9yXSAiK3IiICh2cHMyX3IpLCBbdnBzMl9sXSAiK3IiICh2cHMyX2wpCi0gICAgICAgIDogW0hXTV0gInIiIChIV00pCi0gICAgKTsKLQotICAgICpwczAgPSB2cHMwX3IgXiBOMTI4OwotICAgICpwczEgPSB2cHMxX3IgXiBOMTI4OwotICAgICpwczIgPSB2cHMyX3IgXiBOMTI4OwotICAgICpxczAgPSB2cXMwX3IgXiBOMTI4OwotICAgICpxczEgPSB2cXMxX3IgXiBOMTI4OwotICAgICpxczIgPSB2cXMyX3IgXiBOMTI4OwotfQotCi0KLXZvaWQgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21pcHMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzLAotICAgIGludCBwLAotICAgIHVuc2lnbmVkIGludCBmbGltaXQsCi0gICAgdW5zaWduZWQgaW50IGxpbWl0LAotICAgIHVuc2lnbmVkIGludCB0aHJlc2gsCi0gICAgaW50IGNvdW50Ci0pCi17Ci0gICAgaW50IGk7Ci0gICAgdWludDMyX3QgbWFzaywgaGV2OwotICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7Ci0gICAgdW5zaWduZWQgY2hhciAqc20xLCAqczAsICpzMSwgKnMyLCAqczMsICpzNCwgKnM1LCAqczY7Ci0KLSAgICBtYXNrID0gMDsKLSAgICBoZXYgPSAwOwotICAgIGkgPSAwOwotICAgIHAxPTA7IHAyPTA7IHAzPTA7IHA0PTA7Ci0KLSAgICAvKiBsb29wIGZpbHRlciBkZXNpZ25lZCB0byB3b3JrIHVzaW5nIGNoYXJzIHNvIHRoYXQgd2UgY2FuIG1ha2UgbWF4aW11bSB1c2UKLSAgICAgKiBvZiA4IGJpdCBzaW1kIGluc3RydWN0aW9ucy4KLSAgICAgKi8KLQotICAgIHNtMSA9IHMgLSAocDw8Mik7Ci0gICAgczAgID0gcyAtIHAgLSBwIC0gcDsKLSAgICBzMSAgPSBzIC0gcCAtIHA7Ci0gICAgczIgID0gcyAtIHA7Ci0gICAgczMgID0gczsKLSAgICBzNCAgPSBzICsgcDsKLSAgICBzNSAgPSBzICsgcCArIHA7Ci0gICAgczYgID0gcyArIHAgKyBwICsgcDsKLQotICAgIC8qIHByZWZldGNoIGRhdGEgZm9yIGxvYWQgKi8KLSAgICBwcmVmZXRjaF9sb2FkX2xmKHMrcCk7Ci0KLSAgICAvKiBhcHBseSBmaWx0ZXIgb24gNCBwaXhlc2wgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgIGRvCi0gICAgewotICAgICAgICAvKiBsb2FkIHF1YWQtYnl0ZSB2ZWN0b3JzCi0gICAgICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAotICAgICAgICAgKi8KLSAgICAgICAgcDEgPSAqKCh1aW50MzJfdCopKHMxKSk7Ci0gICAgICAgIHAyID0gKigodWludDMyX3QqKShzMikpOwotICAgICAgICBwMyA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICAgICAgcDQgPSAqKCh1aW50MzJfdCopKHM0KSk7Ci0KLSAgICAgICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCi0gICAgICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCEoKChwMS1wNCkgPT0gMCkgJiYgKChwMi1wMykgPT0gMCkpKSB7Ci0KLSAgICAgICAgICAgIHBtMSA9ICooKHVpbnQzMl90Kikoc20xKSk7Ci0gICAgICAgICAgICBwMCAgPSAqKCh1aW50MzJfdCopKHMwKSk7Ci0gICAgICAgICAgICBwNSAgPSAqKCh1aW50MzJfdCopKHM1KSk7Ci0gICAgICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHM2KSk7Ci0KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaCwgJmhldiwgJm1hc2spOwotCi0gICAgICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgLyogZmlsdGVyaW5nICovCi0gICAgICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKLQotICAgICAgICAgICAgICAgIC8qIHVucGFjayBwcm9jZXNzZWQgNHg0IG5laWdoYm9yaG9vZAotICAgICAgICAgICAgICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICooKHVpbnQzMl90KilzMCkgPSBwMDsKLSAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopczEpID0gcDE7Ci0gICAgICAgICAgICAgICAgKigodWludDMyX3QqKXMyKSA9IHAyOwotICAgICAgICAgICAgICAgICooKHVpbnQzMl90KilzMykgPSBwMzsKLSAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopczQpID0gcDQ7Ci0gICAgICAgICAgICAgICAgKigodWludDMyX3QqKXM1KSA9IHA1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc20xICs9IDQ7Ci0gICAgICAgIHMwICArPSA0OwotICAgICAgICBzMSAgKz0gNDsKLSAgICAgICAgczIgICs9IDQ7Ci0gICAgICAgIHMzICArPSA0OwotICAgICAgICBzNCAgKz0gNDsKLSAgICAgICAgczUgICs9IDQ7Ci0gICAgICAgIHM2ICArPSA0OwotCi0gICAgICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgICAgICAqLwotICAgICAgICBwMSA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICAgICAgcDIgPSAqKCh1aW50MzJfdCopKHMyKSk7Ci0gICAgICAgIHAzID0gKigodWludDMyX3QqKShzMykpOwotICAgICAgICBwNCA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgICAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKLSAgICAgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCi0gICAgICAgICAqLwotICAgICAgICBpZiAoISgoKHAxLXA0KSA9PSAwKSAmJiAoKHAyLXAzKSA9PSAwKSkpIHsKLQotICAgICAgICAgICAgcG0xID0gKigodWludDMyX3QqKShzbTEpKTsKLSAgICAgICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczApKTsKLSAgICAgICAgICAgIHA1ICA9ICooKHVpbnQzMl90KikoczUpKTsKLSAgICAgICAgICAgIHA2ICA9ICooKHVpbnQzMl90KikoczYpKTsKLQotICAgICAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoLCAmaGV2LCAmbWFzayk7Ci0KLSAgICAgICAgICAgIC8qIGlmIG1hc2sgPT0gMCBkbyBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZCAqLwotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICB2cDhfbWJmaWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMCwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUpOwotCi0gICAgICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCi0gICAgICAgICAgICAgICAgICogbWVtb3J5IGlzIDQgYnl0ZSBhbGlnbmVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgKigodWludDMyX3QqKXMwKSA9IHAwOwotICAgICAgICAgICAgICAgICooKHVpbnQzMl90KilzMSkgPSBwMTsKLSAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopczIpID0gcDI7Ci0gICAgICAgICAgICAgICAgKigodWludDMyX3QqKXMzKSA9IHAzOwotICAgICAgICAgICAgICAgICooKHVpbnQzMl90KilzNCkgPSBwNDsKLSAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopczUpID0gcDU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzbTEgKz0gNDsKLSAgICAgICAgczAgICs9IDQ7Ci0gICAgICAgIHMxICArPSA0OwotICAgICAgICBzMiAgKz0gNDsKLSAgICAgICAgczMgICs9IDQ7Ci0gICAgICAgIHM0ICArPSA0OwotICAgICAgICBzNSAgKz0gNDsKLSAgICAgICAgczYgICs9IDQ7Ci0KLSAgICAgICAgaSArPSA4OwotICAgIH0KLQotICAgIHdoaWxlIChpIDwgY291bnQpOwotfQotCi0KLXZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdXZob3Jpem9udGFsX2VkZ2VfbWlwcwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHAsCi0gICAgdW5zaWduZWQgaW50IGZsaW1pdCwKLSAgICB1bnNpZ25lZCBpbnQgbGltaXQsCi0gICAgdW5zaWduZWQgaW50IHRocmVzaCwKLSAgICBpbnQgY291bnQKLSkKLXsKLSAgICB1aW50MzJfdCBtYXNrLCBoZXY7Ci0gICAgdWludDMyX3QgcG0xLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNjsKLSAgICB1bnNpZ25lZCBjaGFyICpzbTEsICpzMCwgKnMxLCAqczIsICpzMywgKnM0LCAqczUsICpzNjsKLQotICAgIG1hc2sgPSAwOwotICAgIGhldiA9IDA7Ci0gICAgcDE9MDsgcDI9MDsgcDM9MDsgcDQ9MDsKLQotICAgIC8qIGxvb3AgZmlsdGVyIGRlc2lnbmVkIHRvIHdvcmsgdXNpbmcgY2hhcnMgc28gdGhhdCB3ZSBjYW4gbWFrZSBtYXhpbXVtIHVzZQotICAgICAqIG9mIDggYml0IHNpbWQgaW5zdHJ1Y3Rpb25zLgotICAgICAqLwotCi0gICAgc20xID0gcyAtIChwPDwyKTsKLSAgICBzMCAgPSBzIC0gcCAtIHAgLSBwOwotICAgIHMxICA9IHMgLSBwIC0gcDsKLSAgICBzMiAgPSBzIC0gcDsKLSAgICBzMyAgPSBzOwotICAgIHM0ICA9IHMgKyBwOwotICAgIHM1ICA9IHMgKyBwICsgcDsKLSAgICBzNiAgPSBzICsgcCArIHAgKyBwOwotCi0gICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycwotICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAotICAgICAqLwotICAgIHAxID0gKigodWludDMyX3QqKShzMSkpOwotICAgIHAyID0gKigodWludDMyX3QqKShzMikpOwotICAgIHAzID0gKigodWludDMyX3QqKShzMykpOwotICAgIHA0ID0gKigodWludDMyX3QqKShzNCkpOwotCi0gICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCi0gICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCi0gICAgICovCi0gICAgaWYgKCEoKChwMS1wNCkgPT0gMCkgJiYgKChwMi1wMykgPT0gMCkpKSB7Ci0KLSAgICAgICAgcG0xID0gKigodWludDMyX3QqKShzbTEpKTsKLSAgICAgICAgcDAgID0gKigodWludDMyX3QqKShzMCkpOwotICAgICAgICBwNSAgPSAqKCh1aW50MzJfdCopKHM1KSk7Ci0gICAgICAgIHA2ICA9ICooKHVpbnQzMl90KikoczYpKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgLyogZmlsdGVyaW5nICovCi0gICAgICAgICAgICB2cDhfbWJmaWx0ZXJfbWlwcyhtYXNrLCBoZXYsICZwMCwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUpOwotCi0gICAgICAgICAgICAvKiB1bnBhY2sgcHJvY2Vzc2VkIDR4NCBuZWlnaGJvcmhvb2QKLSAgICAgICAgICAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAqKCh1aW50MzJfdCopczApID0gcDA7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczEpID0gcDE7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczIpID0gcDI7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczMpID0gcDM7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczQpID0gcDQ7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCopczUpID0gcDU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbTEgKz0gNDsKLSAgICBzMCAgKz0gNDsKLSAgICBzMSAgKz0gNDsKLSAgICBzMiAgKz0gNDsKLSAgICBzMyAgKz0gNDsKLSAgICBzNCAgKz0gNDsKLSAgICBzNSAgKz0gNDsKLSAgICBzNiAgKz0gNDsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgKi8KLSAgICBwMSA9ICooKHVpbnQzMl90KikoczEpKTsKLSAgICBwMiA9ICooKHVpbnQzMl90KikoczIpKTsKLSAgICBwMyA9ICooKHVpbnQzMl90KikoczMpKTsKLSAgICBwNCA9ICooKHVpbnQzMl90KikoczQpKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHBtMSA9ICooKHVpbnQzMl90Kikoc20xKSk7Ci0gICAgICAgIHAwICA9ICooKHVpbnQzMl90KikoczApKTsKLSAgICAgICAgcDUgID0gKigodWludDMyX3QqKShzNSkpOwotICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHM2KSk7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKLQotICAgICAgICAgICAgLyogdW5wYWNrIHByb2Nlc3NlZCA0eDQgbmVpZ2hib3Job29kCi0gICAgICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKigodWludDMyX3QqKXMwKSA9IHAwOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMxKSA9IHAxOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMyKSA9IHAyOwotICAgICAgICAgICAgKigodWludDMyX3QqKXMzKSA9IHAzOwotICAgICAgICAgICAgKigodWludDMyX3QqKXM0KSA9IHA0OwotICAgICAgICAgICAgKigodWludDMyX3QqKXM1KSA9IHA1OwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcywKLSAgICBpbnQgcCwKLSAgICB1bnNpZ25lZCBpbnQgZmxpbWl0LAotICAgIHVuc2lnbmVkIGludCBsaW1pdCwKLSAgICB1bnNpZ25lZCBpbnQgdGhyZXNoLAotICAgIGludCBjb3VudAotKQotewotCi0gICAgaW50IGk7Ci0gICAgdWludDMyX3QgbWFzaywgaGV2OwotICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7Ci0gICAgdW5zaWduZWQgY2hhciAqc20xLCAqczAsICpzMSwgKnMyLCAqczMsICpzNCwgKnM1LCAqczY7Ci0gICAgdWludDMyX3QgdGVtcCwgcHJpbTEsIHByaW0yLCBzZWMzLCBzZWM0LCBwcmltMywgcHJpbTQ7Ci0KLSAgICBtYXNrID0gMDsKLSAgICBoZXYgPSAwOwotICAgIGkgPSAwOwotICAgIHBtMT0wOyBwMD0wOyBwMT0wOyBwMj0wOyBwMz0wOyBwND0wOyBwNT0wOyBwNj0wOwotCi0gICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCi0gICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCi0gICAgICovCi0KLSAgICAvKiBhcHBseSBmaWx0ZXIgb24gNCBwaXhlc2wgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgIGRvCi0gICAgewotICAgICAgICBzMSA9IHM7Ci0gICAgICAgIHMyID0gcyArIHA7Ci0gICAgICAgIHMzID0gczIgKyBwOwotICAgICAgICBzNCA9IHMzICsgcDsKLSAgICAgICAgcyAgPSBzNCArIHA7Ci0KLSAgICAgICAgLyogbG9hZCBxdWFkLWJ5dGUgdmVjdG9ycwotICAgICAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgICAgICovCi0gICAgICAgIHAyICA9ICooKHVpbnQzMl90KikoczEtNCkpOwotICAgICAgICBwNiAgPSAqKCh1aW50MzJfdCopKHMxKSk7Ci0gICAgICAgIHAxICA9ICooKHVpbnQzMl90KikoczIgLSA0KSk7Ci0gICAgICAgIHA1ICA9ICooKHVpbnQzMl90KikoczIpKTsKLSAgICAgICAgcDAgID0gKigodWludDMyX3QqKShzMyAtIDQpKTsKLSAgICAgICAgcDQgID0gKigodWludDMyX3QqKShzMykpOwotICAgICAgICBwbTEgPSAqKCh1aW50MzJfdCopKHM0IC0gNCkpOwotICAgICAgICBwMyAgPSAqKCh1aW50MzJfdCopKHM0KSk7Ci0KLSAgICAgICAgLyogdHJhbnNwb3NlIHBtMSwgcDAsIHAxLCBwMiAqLwotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKLQotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcDFdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwbTFdLCAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0KLSAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3AyXSwgICAgICAlW3AxXSwgICAgICAlW3NlYzNdICAgICBcblx0IgotICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCi0gICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3BtMV0sICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAotICAgICAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKLSAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKSwgW3BtMV0gIityIiAocG0xKSwKLSAgICAgICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQotICAgICAgICAgICAgOgotICAgICAgICApOwotCi0gICAgICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLwotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKLQotICAgICAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY3IucWIucGggICAgJVtwM10sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotICAgICAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0KLSAgICAgICAgICAgICJwcmVjcnEucGgudyAgICAlW3A2XSwgICAgICAlW3A1XSwgICAgICAlW3NlYzNdICAgICBcblx0IgotICAgICAgICAgICAgInByZWNycS5waC53ICAgICVbcDRdLCAgICAgICVbcDNdLCAgICAgICVbc2VjNF0gICAgIFxuXHQiCi0gICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3AzXSwgICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAotICAgICAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKLSAgICAgICAgICAgICAgW3A2XSAiK3IiIChwNiksIFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCi0gICAgICAgICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKLSAgICAgICAgICAgIDoKLSAgICAgICAgKTsKLQotICAgICAgICAvKiBpZiAocDEgLSBwNCA9PSAwKSBhbmQgKHAyIC0gcDMgPT0gMCkKLSAgICAgICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCi0gICAgICAgICAqLwotICAgICAgICBpZiAoISgoKHAxLXA0KSA9PSAwKSAmJiAoKHAyLXAzKSA9PSAwKSkgKSB7Ci0KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaCwgJmhldiwgJm1hc2spOwotCi0gICAgICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgLyogZmlsdGVyaW5nICovCi0gICAgICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKLQotICAgICAgICAgICAgICAgIC8qIGRvbid0IHVzZSB0cmFuc3Bvc2Ugb24gb3V0cHV0IGRhdGEKLSAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIG1lbW9yeSBpc24ndCBhbGlnbmVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3M0XSAiciIgKHM0KSwKLSAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNV0sICVbcDVdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMF0sICVbcDBdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgOiBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAotICAgICAgICAgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCkKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczNdICJyIiAoczMpLAotICAgICAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A1XSwgJVtwNV0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AwXSwgJVtwMF0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6IFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCi0gICAgICAgICAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKQotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzMl0gInIiIChzMiksCi0gICAgICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDVdLCAlW3A1XSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDBdLCAlW3AwXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgIDogW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApCi0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwKLSAgICAgICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpKz00OwotICAgIH0KLQotICAgIHdoaWxlIChpIDwgY291bnQpOwotfQotCi0KLXZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdXZ2ZXJ0aWNhbF9lZGdlX21pcHMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzLAotICAgIGludCBwLAotICAgIHVuc2lnbmVkIGludCBmbGltaXQsCi0gICAgdW5zaWduZWQgaW50IGxpbWl0LAotICAgIHVuc2lnbmVkIGludCB0aHJlc2gsCi0gICAgaW50IGNvdW50Ci0pCi17Ci0gICAgdWludDMyX3QgbWFzaywgaGV2OwotICAgIHVpbnQzMl90IHBtMSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7Ci0gICAgdW5zaWduZWQgY2hhciAqc20xLCAqczAsICpzMSwgKnMyLCAqczMsICpzNCwgKnM1LCAqczY7Ci0gICAgdWludDMyX3QgdGVtcCwgcHJpbTEsIHByaW0yLCBzZWMxLCBzZWMyLCBzZWMzLCBzZWM0LCBwcmltMywgcHJpbTQ7Ci0KLSAgICBtYXNrID0gMDsKLSAgICBoZXYgPSAwOwotICAgIHBtMT0wOyBwMD0wOyBwMT0wOyBwMj0wOyBwMz0wOyBwND0wOyBwNT0wOyBwNj0wOwotCi0gICAgLyogbG9vcCBmaWx0ZXIgZGVzaWduZWQgdG8gd29yayB1c2luZyBjaGFycyBzbyB0aGF0IHdlIGNhbiBtYWtlIG1heGltdW0gdXNlCi0gICAgICogb2YgOCBiaXQgc2ltZCBpbnN0cnVjdGlvbnMuCi0gICAgICovCi0KLSAgICAvKiBhcHBseSBmaWx0ZXIgb24gNCBwaXhlc2wgYXQgdGhlIHNhbWUgdGltZSAqLwotCi0gICAgczEgPSBzOwotICAgIHMyID0gcyArIHA7Ci0gICAgczMgPSBzMiArIHA7Ci0gICAgczQgPSBzMyArIHA7Ci0KLSAgICAvKiBwcmVmZXRjaCBkYXRhIGZvciBsb2FkICovCi0gICAgcHJlZmV0Y2hfbG9hZF9sZihzICsgMipwKTsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAgKiBtZW1vcnkgaXMgNCBieXRlIGFsaWduZWQKLSAgICAgKi8KLSAgICBwMiAgPSAqKCh1aW50MzJfdCopKHMxLTQpKTsKLSAgICBwNiAgPSAqKCh1aW50MzJfdCopKHMxKSk7Ci0gICAgcDEgID0gKigodWludDMyX3QqKShzMiAtIDQpKTsKLSAgICBwNSAgPSAqKCh1aW50MzJfdCopKHMyKSk7Ci0gICAgcDAgID0gKigodWludDMyX3QqKShzMyAtIDQpKTsKLSAgICBwNCAgPSAqKCh1aW50MzJfdCopKHMzKSk7Ci0gICAgcG0xID0gKigodWludDMyX3QqKShzNCAtIDQpKTsKLSAgICBwMyAgPSAqKCh1aW50MzJfdCopKHM0KSk7Ci0KLSAgICAvKiB0cmFuc3Bvc2UgcG0xLCBwMCwgcDEsIHAyICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltMV0sICAgJVtwMl0sICAgICAgJVtwMV0gICAgICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTJdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0zXSwgICAlW3AwXSwgICAgICAlW3BtMV0gICAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltNF0sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKLQotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwMV0sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcG0xXSwgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3NlYzNdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtzZWM0XSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLQotICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwMl0sICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSAgICAgXG5cdCIKLSAgICAgICAgInByZWNycS5waC53ICAgICVbcDBdLCAgICAgICVbcG0xXSwgICAgICVbc2VjNF0gICAgIFxuXHQiCi0gICAgICAgICJhcHBlbmQgICAgICAgICAlW3AxXSwgICAgICAlW3NlYzNdLCAgICAxNiAgICAgICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwbTFdLCAgICAgJVtzZWM0XSwgICAgMTYgICAgICAgICAgXG5cdCIKLQotICAgICAgICA6IFtwcmltMV0gIj0mciIgKHByaW0xKSwgW3ByaW0yXSAiPSZyIiAocHJpbTIpLAotICAgICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAotICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCi0gICAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQotICAgICAgICA6Ci0gICAgKTsKLQotICAgIC8qIHRyYW5zcG9zZSBwMywgcDQsIHA1LCBwNiAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDZdLCAgICAgICVbcDVdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwNF0sICAgICAgJVtwM10gICAgICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcDVdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3AzXSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5waC53ICAgICVbcDZdLCAgICAgICVbcDVdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucGgudyAgICAlW3A0XSwgICAgICAlW3AzXSwgICAgICAlW3NlYzRdICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwNV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDNdLCAgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKLSAgICAgICAgICBbcHJpbTNdICI9JnIiIChwcmltMyksIFtwcmltNF0gIj0mciIgKHByaW00KSwKLSAgICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgICBbc2VjM10gIj0mciIgKHNlYzMpLCBbc2VjNF0gIj0mciIgKHNlYzQpCi0gICAgICAgIDoKLSAgICApOwotCi0gICAgLyogaWYgKHAxIC0gcDQgPT0gMCkgYW5kIChwMiAtIHAzID09IDApCi0gICAgICogbWFzayB3aWxsIGJlIHplcm8gYW5kIGZpbHRlcmluZyBpcyBub3QgbmVlZGVkCi0gICAgICovCi0gICAgaWYgKCEoKChwMS1wNCkgPT0gMCkgJiYgKChwMi1wMykgPT0gMCkpKSB7Ci0KLSAgICAgICAgdnA4X2ZpbHRlcl9tYXNrX3ZlY19taXBzKGxpbWl0LCBmbGltaXQsIHAxLCBwMiwgcG0xLCBwMCwgcDMsIHA0LCBwNSwgcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKLQotICAgICAgICAgICAgLyogZG9uJ3QgdXNlIHRyYW5zcG9zZSBvbiBvdXRwdXQgZGF0YQotICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczRdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczRdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3M0XSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3M0XSAiciIgKHM0KSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A1XSwgJVtwNV0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMF0sICVbcDBdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICA6IFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCi0gICAgICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczNdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzM10pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczNdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzM10pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksCi0gICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNV0sICVbcDVdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDBdLCAlW3AwXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAotICAgICAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKQotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzMl0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MyXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMl0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MyXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczJdICJyIiAoczIpLAotICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDVdLCAlW3A1XSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AwXSwgJVtwMF0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIDogW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCkKLSAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczFdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MxXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczFdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3MxXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzMSA9IHM0ICsgcDsKLSAgICBzMiA9IHMxICsgcDsKLSAgICBzMyA9IHMyICsgcDsKLSAgICBzNCA9IHMzICsgcDsKLQotICAgIC8qIGxvYWQgcXVhZC1ieXRlIHZlY3RvcnMKLSAgICAqIG1lbW9yeSBpcyA0IGJ5dGUgYWxpZ25lZAotICAgICovCi0gICAgcDIgID0gKigodWludDMyX3QqKShzMS00KSk7Ci0gICAgcDYgID0gKigodWludDMyX3QqKShzMSkpOwotICAgIHAxICA9ICooKHVpbnQzMl90KikoczIgLSA0KSk7Ci0gICAgcDUgID0gKigodWludDMyX3QqKShzMikpOwotICAgIHAwICA9ICooKHVpbnQzMl90KikoczMgLSA0KSk7Ci0gICAgcDQgID0gKigodWludDMyX3QqKShzMykpOwotICAgIHBtMSA9ICooKHVpbnQzMl90KikoczQgLSA0KSk7Ci0gICAgcDMgID0gKigodWludDMyX3QqKShzNCkpOwotCi0gICAgLyogdHJhbnNwb3NlIHBtMSwgcDAsIHAxLCBwMiAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTFdLCAgICVbcDJdLCAgICAgICVbcDFdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW0yXSwgICAlW3AyXSwgICAgICAlW3AxXSAgICAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtwcmltM10sICAgJVtwMF0sICAgICAgJVtwbTFdICAgICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbcHJpbTRdLCAgICVbcDBdLCAgICAgICVbcG0xXSAgICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcDFdLCAgICAgICVbcHJpbTFdLCAgICVbcHJpbTJdICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3BtMV0sICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAicHJlY3JxLnFiLnBoICAgJVtzZWMzXSwgICAgJVtwcmltM10sICAgJVtwcmltNF0gICAgXG5cdCIKLSAgICAgICAgInByZWNyLnFiLnBoICAgICVbc2VjNF0sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0KLSAgICAgICAgInByZWNycS5waC53ICAgICVbcDJdLCAgICAgICVbcDFdLCAgICAgICVbc2VjM10gICAgIFxuXHQiCi0gICAgICAgICJwcmVjcnEucGgudyAgICAlW3AwXSwgICAgICAlW3BtMV0sICAgICAlW3NlYzRdICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAgJVtwMV0sICAgICAgJVtzZWMzXSwgICAgMTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgICVbcG0xXSwgICAgICVbc2VjNF0sICAgIDE2ICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgOiBbcHJpbTFdICI9JnIiIChwcmltMSksIFtwcmltMl0gIj0mciIgKHByaW0yKSwKLSAgICAgICAgW3ByaW0zXSAiPSZyIiAocHJpbTMpLCBbcHJpbTRdICI9JnIiIChwcmltNCksCi0gICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCksIFtwbTFdICIrciIgKHBtMSksCi0gICAgICAgIFtzZWMzXSAiPSZyIiAoc2VjMyksIFtzZWM0XSAiPSZyIiAoc2VjNCkKLSAgICAgICAgOgotICAgICk7Ci0KLSAgICAvKiB0cmFuc3Bvc2UgcDMsIHA0LCBwNSwgcDYgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3ByaW0xXSwgICAlW3A2XSwgICAgICAlW3A1XSAgICAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtwcmltMl0sICAgJVtwNl0sICAgICAgJVtwNV0gICAgICAgXG5cdCIKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbcHJpbTNdLCAgICVbcDRdLCAgICAgICVbcDNdICAgICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3ByaW00XSwgICAlW3A0XSwgICAgICAlW3AzXSAgICAgICBcblx0IgotCi0gICAgICAgICJwcmVjcnEucWIucGggICAlW3A1XSwgICAgICAlW3ByaW0xXSwgICAlW3ByaW0yXSAgICBcblx0IgotICAgICAgICAicHJlY3IucWIucGggICAgJVtwM10sICAgICAgJVtwcmltMV0sICAgJVtwcmltMl0gICAgXG5cdCIKLSAgICAgICAgInByZWNycS5xYi5waCAgICVbc2VjM10sICAgICVbcHJpbTNdLCAgICVbcHJpbTRdICAgIFxuXHQiCi0gICAgICAgICJwcmVjci5xYi5waCAgICAlW3NlYzRdLCAgICAlW3ByaW0zXSwgICAlW3ByaW00XSAgICBcblx0IgotCi0gICAgICAgICJwcmVjcnEucGgudyAgICAlW3A2XSwgICAgICAlW3A1XSwgICAgICAlW3NlYzNdICAgICBcblx0IgotICAgICAgICAicHJlY3JxLnBoLncgICAgJVtwNF0sICAgICAgJVtwM10sICAgICAgJVtzZWM0XSAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgICVbcDVdLCAgICAgICVbc2VjM10sICAgIDE2ICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhcHBlbmQgICAgICAgICAlW3AzXSwgICAgICAlW3NlYzRdLCAgICAxNiAgICAgICAgICBcblx0IgotCi0gICAgICAgIDogW3ByaW0xXSAiPSZyIiAocHJpbTEpLCBbcHJpbTJdICI9JnIiIChwcmltMiksCi0gICAgICAgIFtwcmltM10gIj0mciIgKHByaW0zKSwgW3ByaW00XSAiPSZyIiAocHJpbTQpLAotICAgICAgICBbcDZdICIrciIgKHA2KSwgW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgW3NlYzNdICI9JnIiIChzZWMzKSwgW3NlYzRdICI9JnIiIChzZWM0KQotICAgICAgICA6Ci0gICAgKTsKLQotICAgIC8qIGlmIChwMSAtIHA0ID09IDApIGFuZCAocDIgLSBwMyA9PSAwKQotICAgICAqIG1hc2sgd2lsbCBiZSB6ZXJvIGFuZCBmaWx0ZXJpbmcgaXMgbm90IG5lZWRlZAotICAgICAqLwotICAgIGlmICghKCgocDEtcDQpID09IDApICYmICgocDItcDMpID09IDApKSkgewotCi0gICAgICAgIHZwOF9maWx0ZXJfbWFza192ZWNfbWlwcyhsaW1pdCwgZmxpbWl0LCBwMSwgcDIsIHBtMSwgcDAsIHAzLCBwNCwgcDUsIHA2LCB0aHJlc2gsICZoZXYsICZtYXNrKTsKLQotICAgICAgICAvKiBpZiBtYXNrID09IDAgZG8gZmlsdGVyaW5nIGlzIG5vdCBuZWVkZWQgKi8KLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIC8qIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgdnA4X21iZmlsdGVyX21pcHMobWFzaywgaGV2LCAmcDAsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1KTsKLQotICAgICAgICAgICAgLyogZG9uJ3QgdXNlIHRyYW5zcG9zZSBvbiBvdXRwdXQgZGF0YQotICAgICAgICAgICAgICogYmVjYXVzZSBtZW1vcnkgaXNuJ3QgYWxpZ25lZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczRdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3M0XSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczRdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzNF0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3M0XSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3M0XSAiciIgKHM0KSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A1XSwgJVtwNV0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDRdLCAlW3A0XSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwM10sICVbcDNdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AyXSwgJVtwMl0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDFdLCAlW3AxXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMF0sICVbcDBdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICA6IFtwNV0gIityIiAocDUpLCBbcDRdICIrciIgKHA0KSwgW3AzXSAiK3IiIChwMyksCi0gICAgICAgICAgICAgICAgICBbcDJdICIrciIgKHAyKSwgW3AxXSAiK3IiIChwMSksIFtwMF0gIityIiAocDApCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDVdLCAgMiglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNF0sICAxKCVbczNdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AzXSwgIDAoJVtzM10pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDJdLCAtMSglW3MzXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMV0sIC0yKCVbczNdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AwXSwgLTMoJVtzM10pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICA6IFtwNV0gInIiIChwNSksIFtwNF0gInIiIChwNCksIFtwM10gInIiIChwMyksIFtzM10gInIiIChzMyksCi0gICAgICAgICAgICAgICAgICBbcDJdICJyIiAocDIpLCBbcDFdICJyIiAocDEpLCBbcDBdICJyIiAocDApCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNV0sICVbcDVdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3A0XSwgJVtwNF0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDNdLCAlW3AzXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMl0sICVbcDJdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AxXSwgJVtwMV0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDBdLCAlW3AwXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOiBbcDVdICIrciIgKHA1KSwgW3A0XSAiK3IiIChwNCksIFtwM10gIityIiAocDMpLAotICAgICAgICAgICAgICAgICAgW3AyXSAiK3IiIChwMiksIFtwMV0gIityIiAocDEpLCBbcDBdICIrciIgKHAwKQotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A1XSwgIDIoJVtzMl0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDRdLCAgMSglW3MyXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwM10sICAwKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AyXSwgLTEoJVtzMl0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDFdLCAtMiglW3MyXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMF0sIC0zKCVbczJdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgOiBbcDVdICJyIiAocDUpLCBbcDRdICJyIiAocDQpLCBbcDNdICJyIiAocDMpLCBbczJdICJyIiAoczIpLAotICAgICAgICAgICAgICAgICAgW3AyXSAiciIgKHAyKSwgW3AxXSAiciIgKHAxKSwgW3AwXSAiciIgKHAwKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDVdLCAlW3A1XSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwNF0sICVbcDRdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AzXSwgJVtwM10sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcDJdLCAlW3AyXSwgOCAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtwMV0sICVbcDFdLCA4ICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3AwXSwgJVtwMF0sIDggICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIDogW3A1XSAiK3IiIChwNSksIFtwNF0gIityIiAocDQpLCBbcDNdICIrciIgKHAzKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gIityIiAocDIpLCBbcDFdICIrciIgKHAxKSwgW3AwXSAiK3IiIChwMCkKLSAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwNV0sICAyKCVbczFdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3A0XSwgIDEoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDNdLCAgMCglW3MxXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInNiICAgICAgICAgJVtwMl0sIC0xKCVbczFdKSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic2IgICAgICAgICAlW3AxXSwgLTIoJVtzMV0pICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzYiAgICAgICAgICVbcDBdLCAtMyglW3MxXSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDogW3A1XSAiciIgKHA1KSwgW3A0XSAiciIgKHA0KSwgW3AzXSAiciIgKHAzKSwgW3MxXSAiciIgKHMxKSwKLSAgICAgICAgICAgICAgICAgIFtwMl0gInIiIChwMiksIFtwMV0gInIiIChwMSksIFtwMF0gInIiIChwMCkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL21pcHMvbG9vcGZpbHRlcl9taXBzLmMgYi92cDgvY29tbW9uL21pcHMvbG9vcGZpbHRlcl9taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YWRhNGQuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9taXBzL2xvb3BmaWx0ZXJfbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgImxvb3BmaWx0ZXIuaCIKLSNpbmNsdWRlICJsb29wZmlsdGVyX21pcHMuaCIKLSNpbmNsdWRlICJvbnl4Y19pbnQuaCIKLQotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX21pcHModnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9taXBzKHZwOF9sb29wX2ZpbHRlcl91dmhvcml6b250YWxfZWRnZV9taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9taXBzKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX21pcHModnA4X2xvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9taXBzKHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9taXBzKHZwOF9tYmxvb3BfZmlsdGVyX3V2aG9yaXpvbnRhbF9lZGdlX21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX21pcHModnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9taXBzKHZwOF9tYmxvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzKTsKLQotLyogSG9yaXpvbnRhbCBNQiBmaWx0ZXJpbmcgKi8KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9taXBzKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgIHVuc2lnbmVkIGludCB0aHJlc2hfdmVjLCBmbGltaXRfdmVjLCBsaW1pdF92ZWM7Ci0gICAgdW5zaWduZWQgY2hhciB0aHJlc2gsIGZsaW1pdCwgbGltaXQsIGZsaW1pdF90ZW1wOwotCi0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotCi0gICAgLyogdXNlIGRpcmVjdCB2YWx1ZSBpbnN0ZWFkIHBvaW50ZXJzICovCi0gICAgbGltaXQgPSAqKGxmaS0+bGltKTsKLSAgICBmbGltaXRfdGVtcCA9ICoobGZpLT5tYmZsaW0pOwotICAgIHRocmVzaCA9ICoobGZpLT50aHIpOwotICAgIGZsaW1pdCA9IGZsaW1pdF90ZW1wICsgZmxpbWl0X3RlbXAgKyBsaW1pdDsKLQotICAgIC8qIGNyZWF0ZSBxdWFkLWJ5dGUgKi8KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJyZXBsdi5xYiAgICAgICAlW3RocmVzaF92ZWNdLCAlW3RocmVzaF0gICAgXG5cdCIKLSAgICAgICAgInJlcGx2LnFiICAgICAgICVbZmxpbWl0X3ZlY10sICVbZmxpbWl0XSAgICBcblx0IgotICAgICAgICAicmVwbHYucWIgICAgICAgJVtsaW1pdF92ZWNdLCAgJVtsaW1pdF0gICAgIFxuXHQiCi0gICAgICAgIDogW3RocmVzaF92ZWNdICI9JnIiICh0aHJlc2hfdmVjKSwgW2ZsaW1pdF92ZWNdICI9JnIiIChmbGltaXRfdmVjKSwgW2xpbWl0X3ZlY10gIj1yIiAobGltaXRfdmVjKQotICAgICAgICA6IFt0aHJlc2hdICJyIiAodGhyZXNoKSwgW2ZsaW1pdF0gInIiIChmbGltaXQpLCBbbGltaXRdICJyIiAobGltaXQpCi0gICAgKTsKLQotICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9taXBzKHlfcHRyLCB5X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAxNik7Ci0KLSAgICBpZiAodV9wdHIpIHsKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdXZob3Jpem9udGFsX2VkZ2VfbWlwcyh1X3B0ciwgdXZfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDApOwotICAgIH0KLQotICAgIGlmICh2X3B0cikgewotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl91dmhvcml6b250YWxfZWRnZV9taXBzKHZfcHRyLCB1dl9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMCk7Ci0gICAgfQotfQotCi0KLS8qIFZlcnRpY2FsIE1CIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X21pcHModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgdW5zaWduZWQgaW50IHRocmVzaF92ZWMsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYzsKLSAgICB1bnNpZ25lZCBjaGFyIHRocmVzaCwgZmxpbWl0LCBsaW1pdCwgZmxpbWl0X3RlbXA7Ci0KLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0KLSAgICAvKiB1c2UgZGlyZWN0IHZhbHVlIGluc3RlYWQgcG9pbnRlcnMgKi8KLSAgICBsaW1pdCA9ICoobGZpLT5saW0pOwotICAgIGZsaW1pdF90ZW1wID0gKihsZmktPm1iZmxpbSk7Ci0gICAgdGhyZXNoID0gKihsZmktPnRocik7Ci0gICAgZmxpbWl0ID0gZmxpbWl0X3RlbXAgKyBmbGltaXRfdGVtcCArIGxpbWl0OwotCi0gICAgLyogY3JlYXRlIHF1YWQtYnl0ZSAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInJlcGx2LnFiICAgICAgICVbdGhyZXNoX3ZlY10sICVbdGhyZXNoXSAgICBcblx0IgotICAgICAgICAicmVwbHYucWIgICAgICAgJVtmbGltaXRfdmVjXSwgJVtmbGltaXRdICAgIFxuXHQiCi0gICAgICAgICJyZXBsdi5xYiAgICAgICAlW2xpbWl0X3ZlY10sICAlW2xpbWl0XSAgICAgXG5cdCIKLSAgICAgICAgOiBbdGhyZXNoX3ZlY10gIj0mciIgKHRocmVzaF92ZWMpLCBbZmxpbWl0X3ZlY10gIj0mciIgKGZsaW1pdF92ZWMpLCBbbGltaXRfdmVjXSAiPXIiIChsaW1pdF92ZWMpCi0gICAgICAgIDogW3RocmVzaF0gInIiICh0aHJlc2gpLCBbZmxpbWl0XSAiciIgKGZsaW1pdCksIFtsaW1pdF0gInIiIChsaW1pdCkKLSAgICApOwotCi0gICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzKHlfcHRyLCB5X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAxNik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzKHVfcHRyLCB1dl9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMCk7Ci0KLSAgICBpZiAodl9wdHIpCi0gICAgICAgIHZwOF9tYmxvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzKHZfcHRyLCB1dl9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMCk7Ci19Ci0KLQotLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfbWlwcyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgIHVuc2lnbmVkIGludCB0aHJlc2hfdmVjLCBmbGltaXRfdmVjLCBsaW1pdF92ZWM7Ci0gICAgdW5zaWduZWQgY2hhciB0aHJlc2gsIGZsaW1pdCwgbGltaXQsIGZsaW1pdF90ZW1wOwotCi0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotCi0gICAgLyogdXNlIGRpcmVjdCB2YWx1ZSBpbnN0ZWFkIHBvaW50ZXJzICovCi0gICAgbGltaXQgPSAqKGxmaS0+bGltKTsKLSAgICBmbGltaXRfdGVtcCA9ICoobGZpLT5mbGltKTsKLSAgICB0aHJlc2ggPSAqKGxmaS0+dGhyKTsKLSAgICBmbGltaXQgPSBmbGltaXRfdGVtcCArIGZsaW1pdF90ZW1wICsgbGltaXQ7Ci0KLSAgICAvKiBjcmVhdGUgcXVhZC1ieXRlICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAicmVwbHYucWIgICAgICAgJVt0aHJlc2hfdmVjXSwgJVt0aHJlc2hdICAgIFxuXHQiCi0gICAgICAgICJyZXBsdi5xYiAgICAgICAlW2ZsaW1pdF92ZWNdLCAlW2ZsaW1pdF0gICAgXG5cdCIKLSAgICAgICAgInJlcGx2LnFiICAgICAgICVbbGltaXRfdmVjXSwgICVbbGltaXRdICAgICBcblx0IgotICAgICAgICA6IFt0aHJlc2hfdmVjXSAiPSZyIiAodGhyZXNoX3ZlYyksIFtmbGltaXRfdmVjXSAiPSZyIiAoZmxpbWl0X3ZlYyksIFtsaW1pdF92ZWNdICI9ciIgKGxpbWl0X3ZlYykKLSAgICAgICAgOiBbdGhyZXNoXSAiciIgKHRocmVzaCksIFtmbGltaXRdICJyIiAoZmxpbWl0KSwgW2xpbWl0XSAiciIgKGxpbWl0KQotICAgICk7Ci0KLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21pcHMoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21pcHMoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDE2KTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21pcHMoeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAxNik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9sb29wX2ZpbHRlcl91dmhvcml6b250YWxfZWRnZV9taXBzKHVfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDApOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdXZob3Jpem9udGFsX2VkZ2VfbWlwcyh2X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAwKTsKLX0KLQotCi0vKiBWZXJ0aWNhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfbWlwcyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgIHVuc2lnbmVkIGludCB0aHJlc2hfdmVjLCBmbGltaXRfdmVjLCBsaW1pdF92ZWM7Ci0gICAgdW5zaWduZWQgY2hhciB0aHJlc2gsIGZsaW1pdCwgbGltaXQsIGZsaW1pdF90ZW1wOwotCi0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotCi0gICAgLyogdXNlIGRpcmVjdCB2YWx1ZSBpbnN0ZWFkIHBvaW50ZXJzICovCi0gICAgbGltaXQgPSAqKGxmaS0+bGltKTsKLSAgICBmbGltaXRfdGVtcCA9ICoobGZpLT5mbGltKTsKLSAgICB0aHJlc2ggPSAqKGxmaS0+dGhyKTsKLSAgICBmbGltaXQgPSBmbGltaXRfdGVtcCArIGZsaW1pdF90ZW1wICsgbGltaXQ7Ci0KLSAgICAvKiBjcmVhdGUgcXVhZC1ieXRlICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAicmVwbHYucWIgICAgICAgJVt0aHJlc2hfdmVjXSwgJVt0aHJlc2hdICAgIFxuXHQiCi0gICAgICAgICJyZXBsdi5xYiAgICAgICAlW2ZsaW1pdF92ZWNdLCAlW2ZsaW1pdF0gICAgXG5cdCIKLSAgICAgICAgInJlcGx2LnFiICAgICAgICVbbGltaXRfdmVjXSwgICVbbGltaXRdICAgICBcblx0IgotICAgICAgICA6IFt0aHJlc2hfdmVjXSAiPSZyIiAodGhyZXNoX3ZlYyksIFtmbGltaXRfdmVjXSAiPSZyIiAoZmxpbWl0X3ZlYyksIFtsaW1pdF92ZWNdICI9ciIgKGxpbWl0X3ZlYykKLSAgICAgICAgOiBbdGhyZXNoXSAiciIgKHRocmVzaCksIFtmbGltaXRdICJyIiAoZmxpbWl0KSwgW2xpbWl0XSAiciIgKGxpbWl0KQotICAgICk7Ci0KLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9taXBzKHlfcHRyICsgNCwgeV9zdHJpZGUsIGZsaW1pdF92ZWMsIGxpbWl0X3ZlYywgdGhyZXNoX3ZlYywgMTYpOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21pcHMoeV9wdHIgKyA4LCB5X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAxNik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbWlwcyh5X3B0ciArIDEyLCB5X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAxNik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9sb29wX2ZpbHRlcl91dnZlcnRpY2FsX2VkZ2VfbWlwcyh1X3B0ciArIDQsIHV2X3N0cmlkZSwgZmxpbWl0X3ZlYywgbGltaXRfdmVjLCB0aHJlc2hfdmVjLCAwKTsKLQotICAgIGlmICh2X3B0cikKLSAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3V2dmVydGljYWxfZWRnZV9taXBzKHZfcHRyICsgNCwgdXZfc3RyaWRlLCBmbGltaXRfdmVjLCBsaW1pdF92ZWMsIHRocmVzaF92ZWMsIDApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbWlwcy9sb29wZmlsdGVyX21pcHMuaCBiL3ZwOC9jb21tb24vbWlwcy9sb29wZmlsdGVyX21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQxMDFjNi4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL21pcHMvbG9vcGZpbHRlcl9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSNpZm5kZWYgTE9PUEZJTFRFUl9NSVBTX0gKLSNkZWZpbmUgTE9PUEZJTFRFUl9NSVBTX0gKLQotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9tYnZfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX2J2X21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9tYmhfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX2JoX21pcHMpOwotCi0jZGVmaW5lIHByb3RvdHlwZV9sb29wZmlsdGVyX21pcHMoc3ltKSBcCi0gICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsIGNvbnN0IHVuc2lnbmVkIGludCBmbGltaXQsXAotICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBsaW1pdCwgY29uc3QgdW5zaWduZWQgaW50IHRocmVzaCwgaW50IGNvdW50KQotCi0jdW5kZWYgIHZwOF9sZl9ub3JtYWxfbWJfdgotI2RlZmluZSB2cDhfbGZfbm9ybWFsX21iX3YgdnA4X2xvb3BfZmlsdGVyX21idl9taXBzCi0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9iX3YKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9iX3YgdnA4X2xvb3BfZmlsdGVyX2J2X21pcHMKLQotI3VuZGVmICB2cDhfbGZfbm9ybWFsX21iX2gKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9tYl9oIHZwOF9sb29wX2ZpbHRlcl9tYmhfbWlwcwotCi0jdW5kZWYgIHZwOF9sZl9ub3JtYWxfYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfYl9oIHZwOF9sb29wX2ZpbHRlcl9iaF9taXBzCi0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL21pcHMvbWlwc19zeXN0ZW1kZXBlbmRlbnQuYyBiL3ZwOC9jb21tb24vbWlwcy9taXBzX3N5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjA5MDY0Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbWlwcy9taXBzX3N5c3RlbWRlcGVuZGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAiZ19jb21tb24uaCIKLSNpbmNsdWRlICJzdWJwaXhlbC5oIgotI2luY2x1ZGUgImxvb3BmaWx0ZXIuaCIKLSNpbmNsdWRlICJyZWNvbi5oIgotI2luY2x1ZGUgImlkY3QuaCIKLSNpbmNsdWRlICJwcmFnbWFzLmgiCi0jaW5jbHVkZSAib255eGNfaW50LmgiCi0KLXZvaWQgdnA4X2FyY2hfbWlwc19jb21tb25faW5pdChWUDhfQ09NTU9OICpjdHgpCi17Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSAgICBWUDhfQ09NTU9OX1JUQ0QgKnJ0Y2QgPSAmY3R4LT5ydGNkOwotI2lmZGVmIE1JUFNfRFNQX1JFVgotI2lmIChNSVBTX0RTUF9SRVY+PTEpCi0gICAgcnRjZC0+c3VicGl4LnNpeHRhcDE2eDE2ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X21pcHM7Ci0gICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4OCAgICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9taXBzOwotICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXA4eDQgICAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbWlwczsKLSAgICBydGNkLT5zdWJwaXguc2l4dGFwNHg0ICAgICAgID0gdnA4X3NpeHRhcF9wcmVkaWN0X21pcHM7Ci0KLSAgICBydGNkLT5yZWNvbi5jb3B5MTZ4MTYgICAgICAgID0gdnA4X2NvcHlfbWVtMTZ4MTZfbWlwczsKLSAgICBydGNkLT5yZWNvbi5jb3B5OHg4ICAgICAgICAgID0gdnA4X2NvcHlfbWVtOHg4X21pcHM7Ci0gICAgcnRjZC0+cmVjb24uY29weTh4NCAgICAgICAgICA9IHZwOF9jb3B5X21lbTh4NF9taXBzOwotCi0gICAgcnRjZC0+aWRjdC5pZGN0MV9zY2FsYXJfYWRkICA9IHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHM7Ci0gICAgcnRjZC0+aWRjdC5pd2Fsc2gxICAgICAgICAgICA9IHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9taXBzOwotICAgIHJ0Y2QtPmlkY3QuaWRjdDE2ICAgICAgICAgICAgPSB2cDhfc2hvcnRfaWRjdDR4NGxsbV9taXBzOwotICAgIHJ0Y2QtPmlkY3QuaXdhbHNoMTYgICAgICAgICAgPSB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X21pcHM7Ci0KLSNpZiAoTUlQU19EU1BfUkVWPj0yKQotICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX21iX3YgPSB2cDhfbG9vcF9maWx0ZXJfbWJ2X21pcHM7Ci0gICAgcnRjZC0+bG9vcGZpbHRlci5ub3JtYWxfYl92ICA9IHZwOF9sb29wX2ZpbHRlcl9idl9taXBzOwotICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX21iX2ggPSB2cDhfbG9vcF9maWx0ZXJfbWJoX21pcHM7Ci0gICAgcnRjZC0+bG9vcGZpbHRlci5ub3JtYWxfYl9oICA9IHZwOF9sb29wX2ZpbHRlcl9iaF9taXBzOwotCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9taXBzL3JlY29uX21pcHMuaCBiL3ZwOC9jb21tb24vbWlwcy9yZWNvbl9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhZDEwYTguLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9taXBzL3JlY29uX21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLQotI2lmbmRlZiBSRUNPTl9NSVBTX0gKLSNkZWZpbmUgUkVDT05fTUlQU19ICi0KLWV4dGVybiBwcm90b3R5cGVfY29weV9ibG9jayh2cDhfY29weV9tZW04eDhfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtOHg0X21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9jb3B5X2Jsb2NrKHZwOF9jb3B5X21lbTE2eDE2X21pcHMpOwotCi0jaWZuZGVmIE1VU1RfQkVfQUxJR05FRAotI2RlZmluZSBNVVNUX0JFX0FMSUdORUQKLSNlbmRpZgotCi0jdW5kZWYgIHZwOF9yZWNvbl9jb3B5OHg4Ci0jZGVmaW5lIHZwOF9yZWNvbl9jb3B5OHg4IHZwOF9jb3B5X21lbTh4OF9taXBzCi0KLSN1bmRlZiAgdnA4X3JlY29uX2NvcHk4eDQKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHk4eDQgdnA4X2NvcHlfbWVtOHg0X21pcHMKLQotI3VuZGVmICB2cDhfcmVjb25fY29weTE2eDE2Ci0jZGVmaW5lIHZwOF9yZWNvbl9jb3B5MTZ4MTYgdnA4X2NvcHlfbWVtMTZ4MTZfbWlwcwotCi0jZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbWlwcy9yZWNvbmludGVyX21pcHMuYyBiL3ZwOC9jb21tb24vbWlwcy9yZWNvbmludGVyX21pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU1YzU2OS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL21pcHMvcmVjb25pbnRlcl9taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgIm9ueXhjX2ludC5oIgotCi0KLWlubGluZSB2b2lkIHByZWZldGNoX2xvYWRfaW50KHVuc2lnbmVkIGNoYXIqIHNyYykgewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgInByZWYgICAwLCAgMCglW3NyY10pICAgXG5cdCIKLSAgICAgICAgOgotICAgICAgICA6IFtzcmNdICJyIiAoc3JjKQotICAgICk7Ci19Ci0KLQotX19pbmxpbmUgdm9pZCB2cDhfY29weV9tZW0xNngxNl9taXBzKAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBzcmMsCi0gICAgaW50IHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIGRzdCwKLSAgICBpbnQgZHN0X3N0cmlkZSkKLXsKLSAgICBpbnQgcjsKLSAgICB1bnNpZ25lZCBpbnQgYTAsIGExLCBhMiwgYTM7Ci0KLSAgICBmb3IgKHIgPSAxNjsgci0tOykKLSAgICB7Ci0gICAgICAgIC8qIGxvYWQgc3JjIGRhdGEgaW4gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgIHByZWZldGNoX2xvYWRfaW50KHNyYyArIHNyY19zdHJpZGUpOwotCi0gICAgICAgIC8qIHVzZSB1bmFsaWduZWQgbWVtb3J5IGxvYWQgYW5kIHN0b3JlICovCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICJ1bHcgICAgJVthMF0sIDAoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICVbYTFdLCA0KCVbc3JjXSkgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInVsdyAgICAlW2EyXSwgOCglW3NyY10pICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJ1bHcgICAgJVthM10sIDEyKCVbc3JjXSkgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbYTBdLCAwKCVbZHN0XSkgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInN3ICAgICAlW2ExXSwgNCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVthMl0sIDgoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbYTNdLCAxMiglW2RzdF0pICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgOiBbYTBdICI9JnIiIChhMCksIFthMV0gIj0mciIgKGExKSwKLSAgICAgICAgICAgICAgW2EyXSAiPSZyIiAoYTIpLCBbYTNdICI9JnIiIChhMykKLSAgICAgICAgICAgIDogW3NyY10gInIiIChzcmMpLCBbZHN0XSAiciIgKGRzdCkKLSAgICAgICAgKTsKLQotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotfQotCi0KLV9faW5saW5lIHZvaWQgdnA4X2NvcHlfbWVtOHg4X21pcHMoCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIHNyYywKLSAgICBpbnQgc3JjX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1QgZHN0LAotICAgIGludCBkc3Rfc3RyaWRlKQotewotICAgIGludCByOwotICAgIHVuc2lnbmVkIGludCBhMCwgYTE7Ci0KLSAgICAvKiBsb2FkIHNyYyBkYXRhIGluIGNhY2hlIG1lbW9yeSAqLwotICAgIHByZWZldGNoX2xvYWRfaW50KHNyYyArIHNyY19zdHJpZGUpOwotCi0gICAgZm9yIChyID0gODsgci0tOykKLSAgICB7Ci0gICAgICAgIC8qIHVzZSB1bmFsaWduZWQgbWVtb3J5IGxvYWQgYW5kIHN0b3JlICovCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICJ1bHcgICAgJVthMF0sIDAoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICVbYTFdLCA0KCVbc3JjXSkgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInN3ICAgICAlW2EwXSwgMCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVthMV0sIDQoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICA6IFthMF0gIj0mciIgKGEwKSwgW2ExXSAiPSZyIiAoYTEpCi0gICAgICAgICAgICA6IFtzcmNdICJyIiAoc3JjKSwgW2RzdF0gInIiIChkc3QpCi0gICAgICAgICk7Ci0KLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgIH0KLX0KLQotCi1fX2lubGluZSB2b2lkIHZwOF9jb3B5X21lbTh4NF9taXBzKAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBzcmMsCi0gICAgaW50IHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIGRzdCwKLSAgICBpbnQgZHN0X3N0cmlkZSkKLXsKLSAgICBpbnQgcjsKLSAgICB1bnNpZ25lZCBpbnQgYTAsIGExOwotCi0gICAgLyogbG9hZCBzcmMgZGF0YSBpbiBjYWNoZSBtZW1vcnkgKi8KLSAgICBwcmVmZXRjaF9sb2FkX2ludChzcmMgKyBzcmNfc3RyaWRlKTsKLQotICAgIGZvciAociA9IDQ7IHItLTspCi0gICAgewotICAgICAgICAvKiB1c2UgdW5hbGlnbmVkIG1lbW9yeSBsb2FkIGFuZCBzdG9yZSAqLwotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAidWx3ICAgICVbYTBdLCAwKCVbc3JjXSkgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInVsdyAgICAlW2ExXSwgNCglW3NyY10pICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVthMF0sIDAoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbYTFdLCA0KCVbZHN0XSkgICAgICAgICAgICBcblx0IgotICAgICAgICAgICA6IFthMF0gIj0mciIgKGEwKSwgW2ExXSAiPSZyIiAoYTEpCi0gICAgICAgICAgIDogW3NyY10gInIiIChzcmMpLCBbZHN0XSAiciIgKGRzdCkKLSAgICAgICAgKTsKLQotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9taXBzL3N1YnBpeGVsX21pcHMuYyBiL3ZwOC9jb21tb24vbWlwcy9zdWJwaXhlbF9taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3NGI5Y2QuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9taXBzL3N1YnBpeGVsX21pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ODYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFZQOCBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJvbnl4Y19pbnQuaCIKLQotI2RlZmluZSBDUk9QX1dJRFRIIDI1NgotdW5zaWduZWQgY2hhciBmZl9jcm9wVGJsWzI1NiArIDIgKiBDUk9QX1dJRFRIXSA9IHswLCB9OwotCi0vKiA2IHRhcCBmaWx0ZXIgY29lZmZpY2llbnRzICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc3ViX3BlbF9maWx0ZXJzc1s4XVszXSA9Ci17Ci0gICAgeyAgICAgIDAsICAgICAgMCwgICAgICAwfSwKLSAgICB7ICAgICAgMCwgMHgwNjAxLCAweDdiMGN9LAotICAgIHsgMHgwMjAxLCAweDBiMDgsIDB4NmMyNH0sCi0gICAgeyAgICAgIDAsIDB4MDkwNiwgMHg1ZDMyfSwKLSAgICB7IDB4MDMwMywgMHgxMDEwLCAweDRkNGR9LAotICAgIHsgICAgICAwLCAweDA2MDksIDB4MzI1ZH0sCi0gICAgeyAweDAxMDIsIDB4MDgwYiwgMHgyNDZjfSwKLSAgICB7ICAgICAgMCwgMHgwMTA2LCAweDBjN2J9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBzdWJfcGVsX2ZpbHRlcnNfaW50WzhdWzNdID0KLXsKLSAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDB9LAotICAgIHsgMHgwMDAwZmZmYSwgMHgwMDdiMDAwYywgMHhmZmZmMDAwMH0sCi0gICAgeyAweDAwMDJmZmY1LCAweDAwNmMwMDI0LCAweGZmZjgwMDAxfSwKLSAgICB7IDB4MDAwMGZmZjcsIDB4MDA1ZDAwMzIsIDB4ZmZmYTAwMDB9LAotICAgIHsgMHgwMDAzZmZmMCwgMHgwMDRkMDA0ZCwgMHhmZmYwMDAwM30sCi0gICAgeyAweDAwMDBmZmZhLCAweDAwMzIwMDVkLCAweGZmZjcwMDAwfSwKLSAgICB7IDB4MDAwMWZmZjgsIDB4MDAyNDAwNmMsIDB4ZmZmNTAwMDJ9LAotICAgIHsgMHgwMDAwZmZmZiwgMHgwMDBjMDA3YiwgMHhmZmZhMDAwMH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IHN1Yl9wZWxfZmlsdGVyc19pbnZbOF1bM10gPQotewotICAgIHsgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMH0sCi0gICAgeyAweGZmZmEwMDAwLCAweDAwMGMwMDdiLCAweDAwMDBmZmZmfSwKLSAgICB7IDB4ZmZmNTAwMDIsIDB4MDAyNDAwNmMsIDB4MDAwMWZmZjh9LAotICAgIHsgMHhmZmY3MDAwMCwgMHgwMDMyMDA1ZCwgMHgwMDAwZmZmYX0sCi0gICAgeyAweGZmZjAwMDAzLCAweDAwNGQwMDRkLCAweDAwMDNmZmYwfSwKLSAgICB7IDB4ZmZmYTAwMDAsIDB4MDA1ZDAwMzIsIDB4MDAwMGZmZjd9LAotICAgIHsgMHhmZmY4MDAwMSwgMHgwMDZjMDAyNCwgMHgwMDAyZmZmNX0sCi0gICAgeyAweGZmZmYwMDAwLCAweDAwN2IwMDBjLCAweDAwMDBmZmZhfSwKLX07Ci0KLS8qIDQgdGFwIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLXN0YXRpYyBjb25zdCBpbnQgc3ViX3BlbF9maWx0ZXJzX2ludF90YXBfNFs4XVsyXSA9Ci17Ci0gICAgeyAgICAgICAgICAwLCAgICAgICAgICAwfSwKLSAgICB7IDB4ZmZmYTAwN2IsIDB4MDAwY2ZmZmZ9LAotICAgIHsgICAgICAgICAgMCwgICAgICAgICAgMH0sCi0gICAgeyAweGZmZjcwMDVkLCAweDAwMzJmZmZhfSwKLSAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDB9LAotICAgIHsgMHhmZmZhMDAzMiwgMHgwMDVkZmZmN30sCi0gICAgeyAgICAgICAgICAwLCAgICAgICAgICAwfSwKLSAgICB7IDB4ZmZmZjAwMGMsIDB4MDA3YmZmZmF9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80WzhdWzJdID0KLXsKLSAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDB9LAotICAgIHsgMHgwMDdiZmZmYSwgMHhmZmZmMDAwY30sCi0gICAgeyAgICAgICAgICAwLCAgICAgICAgICAwfSwKLSAgICB7IDB4MDA1ZGZmZjcsIDB4ZmZmYTAwMzJ9LAotICAgIHsgICAgICAgICAgMCwgICAgICAgICAgMH0sCi0gICAgeyAweDAwMzJmZmZhLCAweGZmZjcwMDVkfSwKLSAgICB7ICAgICAgICAgIDAsICAgICAgICAgIDB9LAotICAgIHsgMHgwMDBjZmZmZiwgMHhmZmZhMDA3Yn0sCi19OwotCi0KLWlubGluZSB2b2lkIHByZWZldGNoX2xvYWQodW5zaWduZWQgY2hhciogc3JjKSB7Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAicHJlZiAgIDAsICAwKCVbc3JjXSkgICBcblx0IgotICAgICAgICA6Ci0gICAgICAgIDogW3NyY10gInIiIChzcmMpCi0gICAgKTsKLX0KLQotCi1pbmxpbmUgdm9pZCBwcmVmZXRjaF9zdG9yZSh1bnNpZ25lZCBjaGFyKiBkc3QpIHsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJwcmVmICAgMSwgIDAoJVtkc3RdKSAgIFxuXHQiCi0gICAgICAgIDoKLSAgICAgICAgOiBbZHN0XSAiciIgKGRzdCkKLSAgICApOwotfQotCi0KLXZvaWQgZHNwdXRpbF9zdGF0aWNfaW5pdCh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yKGk9MDtpPDI1NjtpKyspIGZmX2Nyb3BUYmxbaSArIENST1BfV0lEVEhdID0gaTsKLSAgICBmb3IoaT0wO2k8Q1JPUF9XSURUSDtpKyspIHsKLSAgICAgICAgZmZfY3JvcFRibFtpXSA9IDA7Ci0gICAgICAgIGZmX2Nyb3BUYmxbaSArIENST1BfV0lEVEggKyAyNTZdID0gMjU1OwotICAgIH0KLX0KLQotCi12b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzXzQKLSgKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1QgZHN0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKLSAgICBpbnQgeG9mZnNldCwKLSAgICBpbnQgcGl0Y2gKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBpbnQgVGVtcDEsIFRlbXAyLCBUZW1wMywgVGVtcDQ7Ci0KLSAgICB1bnNpZ25lZCBpbnQgdmVjdG9yNGEgPSA2NDsKLSAgICBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYjsKLSAgICB1bnNpZ25lZCBpbnQgdHAxLCB0cDIsIHRuMSwgdG4yOwotICAgIHVuc2lnbmVkIGludCBwMSwgcDIsIHAzOwotICAgIHVuc2lnbmVkIGludCBuMSwgbjIsIG4zOwotICAgIHVuc2lnbmVkIGNoYXIgKmNtID0gZmZfY3JvcFRibCArIENST1BfV0lEVEg7Ci0KLSAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZbeG9mZnNldF1bMl07Ci0KLSAgICAvKiBpZiAoeG9mZnNldCA9PSAwKSB3ZSBkb24nbiBuZWVkIGFueSBmaWx0ZXJpbmcgKi8KLSAgICBpZiAodmVjdG9yM2IgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0X2hlaWdodDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIgKyBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKLQotICAgICAgICAgICAgZHN0X3B0clswXSA9IHNyY19wdHJbMF07Ci0gICAgICAgICAgICBkc3RfcHRyWzFdID0gc3JjX3B0clsxXTsKLSAgICAgICAgICAgIGRzdF9wdHJbMl0gPSBzcmNfcHRyWzJdOwotICAgICAgICAgICAgZHN0X3B0clszXSA9IHNyY19wdHJbM107Ci0KLSAgICAgICAgICAgIC8qIG5leHQgcm93Li4uICovCi0gICAgICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmU7Ci0gICAgICAgICAgICBkc3RfcHRyICs9IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmICh2ZWN0b3IzYj42NTUzNikgewotICAgICAgICAgICAgLyogNiB0YXAgZmlsdGVyICovCi0KLSAgICAgICAgICAgIHZlY3RvcjFiID0gc3ViX3BlbF9maWx0ZXJzX2ludlt4b2Zmc2V0XVswXTsKLSAgICAgICAgICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzX2ludlt4b2Zmc2V0XVsxXTsKLQotICAgICAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLwotICAgICAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyICsgc3JjX3BpeGVsc19wZXJfbGluZSk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IG91dHB1dF9oZWlnaHQ7IGktLTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLwotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIC0yKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMl0sICAgICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAxLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDFdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICVbdmVjdG9yM2JdICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbcDFdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImJhbGlnbiAgICAgICAgICAgJVt0cDJdLCAgICAgICVbdHAxXSwgICAgICAgICAzICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yM2JdICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdG4yXSwgICAgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24xXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjJdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuM10sICAgICAgICVbdG4yXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuM10sICAgICAgICAgICVbdmVjdG9yM2JdICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjFdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24zXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjFdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXA0XSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogY2xhbXAgKi8KLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0cDFdLCAgICAgICVbVGVtcDFdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RuMV0sICAgICAgJVtUZW1wMl0oJVtjbV0pICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdHAyXSwgICAgICAlW1RlbXAzXSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVtuMl0sICAgICAgICVbVGVtcDRdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdHAxXSwgICAgICAwKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDEoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RwMl0sICAgICAgMiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbbjJdLCAgICAgICAzKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMV0gIj0mciIgKHRuMSksCi0gICAgICAgICAgICAgICAgICAgICAgW3RuMl0gIj0mciIgKHRuMiksIFtwMV0gIj0mciIgKHAxKSwgW3AyXSAiPSZyIiAocDIpLAotICAgICAgICAgICAgICAgICAgICAgIFtwM10gIj0mciIgKHAzKSwgW24xXSAiPSZyIiAobjEpLCBbbjJdICI9JnIiIChuMiksCi0gICAgICAgICAgICAgICAgICAgICAgW24zXSAiPSZyIiAobjMpLCBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj0mciIgKFRlbXA0KQotICAgICAgICAgICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCi0gICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW2NtXSAiciIgKGNtKSwgW2RzdF9wdHJdICJyIiAoZHN0X3B0ciksCi0gICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgLyogTmV4dCByb3cuLi4gKi8KLSAgICAgICAgICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmU7Ci0gICAgICAgICAgICAgICAgZHN0X3B0ciArPSBwaXRjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIDQgdGFwIGZpbHRlciAqLwotCi0gICAgICAgICAgICB2ZWN0b3IxYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZfdGFwXzRbeG9mZnNldF1bMF07Ci0gICAgICAgICAgICB2ZWN0b3IyYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZfdGFwXzRbeG9mZnNldF1bMV07Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IG91dHB1dF9oZWlnaHQ7IGktLTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLwotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMl0sICAgICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAxLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDFdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AzXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAxLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAic3JsICAgICAgICAgICAgICAlW3RuMV0sICAgICAgJVt0cDJdLCAgICAgICAgIDggICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICVbdHAyXSwgICAgICAlW3RwMV0sICAgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24xXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjJdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuM10sICAgICAgICVbdG4xXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuM10sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDRdLCAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RwMV0sICAgICAgJVtUZW1wMV0oJVtjbV0pICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdG4xXSwgICAgICAlW1RlbXAyXSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0cDJdLCAgICAgICVbVGVtcDNdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAxKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVtuMl0sICAgICAgICVbVGVtcDRdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RwMl0sICAgICAgMiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbbjJdLCAgICAgICAzKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMV0gIj0mciIgKHRuMSksCi0gICAgICAgICAgICAgICAgICAgICAgW3AxXSAiPSZyIiAocDEpLCBbcDJdICI9JnIiIChwMiksIFtwM10gIj0mciIgKHAzKSwKLSAgICAgICAgICAgICAgICAgICAgICBbbjFdICI9JnIiIChuMSksIFtuMl0gIj0mciIgKG4yKSwgW24zXSAiPSZyIiAobjMpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPSZyIiAoVGVtcDQpCi0gICAgICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbY21dICJyIiAoY20pLCBbZHN0X3B0cl0gInIiIChkc3RfcHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgLyogIE5leHQgcm93Li4uICovCi0gICAgICAgICAgICAgICAgc3JjX3B0ciAgICArPSBzcmNfcGl4ZWxzX3Blcl9saW5lOwotICAgICAgICAgICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc184X2FsbAotKAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBkc3RfcHRyLAotICAgIHVuc2lnbmVkIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAotICAgIGludCB4b2Zmc2V0LAotICAgIGludCBwaXRjaAotKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGludCBUZW1wMSwgVGVtcDIsIFRlbXAzLCBUZW1wNDsKLQotICAgIHVuc2lnbmVkIGludCB2ZWN0b3IxYSwgdmVjdG9yMmEsIHZlY3RvcjNhOwotICAgIHVuc2lnbmVkIGludCB2ZWN0b3I0YT02NDsKLSAgICB1bnNpZ25lZCBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYjsKLSAgICB1bnNpZ25lZCBpbnQgdHAxLCB0cDIsIHRuMSwgdG4yOwotICAgIHVuc2lnbmVkIGludCBwMSwgcDIsIHAzLCBwNDsKLSAgICB1bnNpZ25lZCBpbnQgbjEsIG4yLCBuMywgbjQ7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpjbSA9IGZmX2Nyb3BUYmwgKyBDUk9QX1dJRFRIOwotCi0gICAgLyogaWYgKHhvZmZzZXQgPT0gMCkgd2UgZG9uJ24gbmVlZCBhbnkgZmlsdGVyaW5nICovCi0gICAgaWYgKHhvZmZzZXQgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0X2hlaWdodDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIgKyBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKLQotICAgICAgICAgICAgZHN0X3B0clswXSA9IHNyY19wdHJbMF07Ci0gICAgICAgICAgICBkc3RfcHRyWzFdID0gc3JjX3B0clsxXTsKLSAgICAgICAgICAgIGRzdF9wdHJbMl0gPSBzcmNfcHRyWzJdOwotICAgICAgICAgICAgZHN0X3B0clszXSA9IHNyY19wdHJbM107Ci0gICAgICAgICAgICBkc3RfcHRyWzRdID0gc3JjX3B0cls0XTsKLSAgICAgICAgICAgIGRzdF9wdHJbNV0gPSBzcmNfcHRyWzVdOwotICAgICAgICAgICAgZHN0X3B0cls2XSA9IHNyY19wdHJbNl07Ci0gICAgICAgICAgICBkc3RfcHRyWzddID0gc3JjX3B0cls3XTsKLQotICAgICAgICAgICAgLyogbmV4dCByb3cuLi4gKi8KLSAgICAgICAgICAgIHNyY19wdHIgICAgKz0gc3JjX3BpeGVsc19wZXJfbGluZTsKLSAgICAgICAgICAgIGRzdF9wdHIgKz0gODsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgdmVjdG9yM2IgPSBzdWJfcGVsX2ZpbHRlcnNfaW52W3hvZmZzZXRdWzJdOwotCi0gICAgICAgIGlmICh2ZWN0b3IzYj42NTUzNikgewotICAgICAgICAgICAgLyogNiB0YXAgZmlsdGVyICovCi0KLSAgICAgICAgICAgIHZlY3RvcjFiID0gc3ViX3BlbF9maWx0ZXJzX2ludlt4b2Zmc2V0XVswXTsKLSAgICAgICAgICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzX2ludlt4b2Zmc2V0XVsxXTsKLQotICAgICAgICAgICAgZm9yIChpID0gb3V0cHV0X2hlaWdodDsgaS0tOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgICAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyICsgc3JjX3BpeGVsc19wZXJfbGluZSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgd2l0aCB2ZWN0b3JzIHBhaXJzICovCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMV0sICAgICAgLTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAyXSwgICAgICAyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDEuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwMV0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW3AyXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDNdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDFdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMl0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AzXSwgICAgICAgICAgJVt2ZWN0b3IzYl0gICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDIuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AzXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDFdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICVbdHAyXSwgICAgICAlW3RwMV0sICAgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RuMl0sICAgICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjNdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjFdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuM10sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IzYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAyXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXA0XSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiPSZyIiAodHAxKSwgW3RwMl0gIj0mciIgKHRwMiksIFt0bjJdICI9JnIiICh0bjIpLAotICAgICAgICAgICAgICAgICAgICAgIFtwMV0gIj0mciIgKHAxKSwgW3AyXSAiPSZyIiAocDIpLCBbcDNdICI9JnIiIChwMyksCi0gICAgICAgICAgICAgICAgICAgICAgW24xXSAiPSZyIiAobjEpLCBbbjJdICI9JnIiIChuMiksIFtuM10gIj0mciIgKG4zKSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpCi0gICAgICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgICAgICAgICAgZHN0X3B0clswXSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgICAgICBkc3RfcHRyWzFdID0gY21bVGVtcDJdOwotICAgICAgICAgICAgICAgIGRzdF9wdHJbMl0gPSBjbVtUZW1wM107Ci0gICAgICAgICAgICAgICAgZHN0X3B0clszXSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAgICAgICAgIC8qIG5leHQgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMy4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDNdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IzYl0gICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDQuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwNF0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDRdLCAgICAgICAgICAlW3ZlY3RvcjNiXSAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdG4xXSwgICAgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAzLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjJdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgJVt2ZWN0b3IzYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCA0LiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjRdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjFdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW240XSwgICAgICAgICAgJVt2ZWN0b3IzYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXA0XSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgOiBbdG4xXSAiPSZyIiAodG4xKSwgW24yXSAiPSZyIiAobjIpLAotICAgICAgICAgICAgICAgICAgICAgIFtwNF0gIj0mciIgKHA0KSwgW240XSAiPSZyIiAobjQpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKLSAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiciIgKHRwMSksIFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFtwMl0gInIiIChwMiksCi0gICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwgW24xXSAiciIgKG4xKSwgW3AxXSAiciIgKHAxKSwKLSAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgICAgIFtwM10gInIiIChwMyksIFtuM10gInIiIChuMyksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgICAgICAgICAgZHN0X3B0cls0XSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgICAgICBkc3RfcHRyWzVdID0gY21bVGVtcDJdOwotICAgICAgICAgICAgICAgIGRzdF9wdHJbNl0gPSBjbVtUZW1wM107Ci0gICAgICAgICAgICAgICAgZHN0X3B0cls3XSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAgICAgICAgIHNyY19wdHIgICAgKz0gc3JjX3BpeGVsc19wZXJfbGluZTsKLSAgICAgICAgICAgICAgICBkc3RfcHRyICs9IHBpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCi0KLSAgICAgICAgICAgIHZlY3RvcjFiID0gc3ViX3BlbF9maWx0ZXJzX2ludl90YXBfNFt4b2Zmc2V0XVswXTsKLSAgICAgICAgICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzX2ludl90YXBfNFt4b2Zmc2V0XVsxXTsKLQotICAgICAgICAgICAgZm9yIChpID0gb3V0cHV0X2hlaWdodDsgaS0tOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgICAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyICsgc3JjX3BpeGVsc19wZXJfbGluZSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgd2l0aCB2ZWN0b3JzIHBhaXJzICovCi0gICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMV0sICAgICAgLTEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAxLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDFdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RwMl0sICAgICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAyLiBwaXhlbCAgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbcDRdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDJdLCAgICAgICAgICAlW3ZlY3RvcjFiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwM10sICAgICAgICAgICVbdmVjdG9yMmJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDFdLCAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAiYmFsaWduICAgICAgICAgICAlW3RwMl0sICAgICAgJVt0cDFdLCAgICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0bjJdLCAgICAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjNdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtuNF0sICAgICAgICVbdG4yXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24zXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAyXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIDogW3RwMV0gIj0mciIgKHRwMSksIFt0cDJdICI9JnIiICh0cDIpLAotICAgICAgICAgICAgICAgICAgICAgIFt0bjJdICI9JnIiICh0bjIpLCBbcDFdICI9JnIiIChwMSksIFtwMl0gIj0mciIgKHAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbcDNdICI9JnIiIChwMyksIFtwNF0gIj0mciIgKHA0KSwgW24xXSAiPSZyIiAobjEpLAotICAgICAgICAgICAgICAgICAgICAgIFtuMl0gIj0mciIgKG4yKSwgW24zXSAiPSZyIiAobjMpLCBbbjRdICI9JnIiIChuNCksCi0gICAgICAgICAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCi0gICAgICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9ciIgKFRlbXA0KQotICAgICAgICAgICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCi0gICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KLSAgICAgICAgICAgICAgICBkc3RfcHRyWzBdID0gY21bVGVtcDFdOwotICAgICAgICAgICAgICAgIGRzdF9wdHJbMV0gPSBjbVtUZW1wMl07Ci0gICAgICAgICAgICAgICAgZHN0X3B0clsyXSA9IGNtW1RlbXAzXTsKLSAgICAgICAgICAgICAgICBkc3RfcHRyWzNdID0gY21bVGVtcDRdOwotCi0gICAgICAgICAgICAgICAgLyogbmV4dCA0IHBpeGVscyAqLwotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAzLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3A0XSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBldmVuIDQuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwNF0sICAgICAgICAgICVbdmVjdG9yMWJdICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAzLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24zXSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjRdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RuMV0sICAgICAgOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDNdLCAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBvZGQgNC4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24yXSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW240XSwgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAlW3ZlY3RvcjJiXSAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAlW1RlbXAyXSwgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICVbVGVtcDRdLCAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICA6IFt0bjFdICI9JnIiICh0bjEpLCBbcDJdICI9JnIiIChwMiksIFtuMl0gIj0mciIgKG4yKSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpCi0gICAgICAgICAgICAgICAgICAgIDogW3RwMV0gInIiICh0cDEpLCBbcDNdICJyIiAocDMpLCBbcDRdICJyIiAocDQpLAotICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCi0gICAgICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0ciksCi0gICAgICAgICAgICAgICAgICAgICAgW24zXSAiciIgKG4zKSwgW240XSAiciIgKG40KQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgICAgIGRzdF9wdHJbNF0gPSBjbVtUZW1wMV07Ci0gICAgICAgICAgICAgICAgZHN0X3B0cls1XSA9IGNtW1RlbXAyXTsKLSAgICAgICAgICAgICAgICBkc3RfcHRyWzZdID0gY21bVGVtcDNdOwotICAgICAgICAgICAgICAgIGRzdF9wdHJbN10gPSBjbVtUZW1wNF07Ci0KLSAgICAgICAgICAgICAgICAvKiBuZXh0IHJvdy4uLiAqLwotICAgICAgICAgICAgICAgIHNyY19wdHIgICAgKz0gc3JjX3BpeGVsc19wZXJfbGluZTsKLSAgICAgICAgICAgICAgICBkc3RfcHRyICs9IHBpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MxNl82dGFwCi0oCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIHNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIGRzdF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCi0gICAgaW50IHhvZmZzZXQsCi0gICAgaW50IHBpdGNoCi0pCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0OwotCi0gICAgdW5zaWduZWQgaW50IHZlY3RvcjRhOwotICAgIHVuc2lnbmVkIGludCB2ZWN0b3IxYiwgdmVjdG9yMmIsIHZlY3RvcjNiOwotICAgIHVuc2lnbmVkIGludCB0cDEsIHRwMiwgdG4xLCB0bjI7Ci0gICAgdW5zaWduZWQgaW50IHAxLCBwMiwgcDMsIHA0OwotICAgIHVuc2lnbmVkIGludCBuMSwgbjIsIG4zLCBuNDsKLSAgICB1bnNpZ25lZCBjaGFyICpjbSA9IGZmX2Nyb3BUYmwgKyBDUk9QX1dJRFRIOwotCi0gICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52W3hvZmZzZXRdWzBdOwotICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzX2ludlt4b2Zmc2V0XVsxXTsKLSAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZbeG9mZnNldF1bMl07Ci0gICAgdmVjdG9yNGEgPSA2NDsKLQotICAgIGZvciAoaSA9IG91dHB1dF9oZWlnaHQ7IGktLTspCi0gICAgewotICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIHNyY19waXhlbHNfcGVyX2xpbmUpOwotCi0gICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgLTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAyXSwgICAgICAyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgLyogZXZlbiAxLiBwaXhlbCAqLwotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDFdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3AxXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0KLSAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW3AxXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0KLSAgICAgICAgICAgICJiYWxpZ24gICAgICAgICAgICAgJVt0cDJdLCAgICAgICVbdHAxXSwgICAgICAgICAgMyAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgICAlW3RuMl0sICAgICAgMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAgICVbVGVtcDFdLCAgICAkYWMzLCAgICAgICAgICAgIDkgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCi0gICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24yXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjNdLCAgICAgICAlW3RuMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IzYl0gICBcblx0IgotCi0gICAgICAgICAgICAvKiBvZGQgMi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24xXSwgICAgICAgJVt0bjJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAxXSwgICAgICA2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMl0gIj0mciIgKHRuMiksCi0gICAgICAgICAgICAgIFtwMV0gIj0mciIgKHAxKSwgW3AyXSAiPSZyIiAocDIpLCBbcDNdICI9JnIiIChwMyksCi0gICAgICAgICAgICAgIFtuMV0gIj0mciIgKG4xKSwgW24yXSAiPSZyIiAobjIpLCBbbjNdICI9JnIiIChuMyksCi0gICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpCi0gICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCi0gICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksCi0gICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KLSAgICAgICAgZHN0X3B0clswXSA9IGNtW1RlbXAxXTsKLSAgICAgICAgZHN0X3B0clsxXSA9IGNtW1RlbXAyXTsKLSAgICAgICAgZHN0X3B0clsyXSA9IGNtW1RlbXAzXTsKLSAgICAgICAgZHN0X3B0clszXSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAvKiBuZXh0IDQgcGl4ZWxzICovCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgIC8qIGV2ZW4gMy4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLQotICAgICAgICAgICAgLyogZXZlbiA0LiBwaXhlbCAqLwotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAgICVbcDRdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3A0XSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLSAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA5ICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgIC8qIG9kZCAzLiBwaXhlbCAqLwotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjJdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuMV0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAvKiBvZGQgNC4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW240XSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW24xXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuNF0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAyXSwgICAgICAxMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDFdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICA6IFt0bjFdICI9JnIiICh0bjEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW24yXSAiPSZyIiAobjIpLAotICAgICAgICAgICAgICBbcDRdICI9JnIiIChwNCksIFtuNF0gIj0mciIgKG40KSwKLSAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCi0gICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKLSAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgW3RwMV0gInIiICh0cDEpLCBbbjFdICJyIiAobjEpLCBbcDFdICJyIiAocDEpLAotICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbcDJdICJyIiAocDIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICBbcDNdICJyIiAocDMpLCBbbjNdICJyIiAobjMpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQotICAgICAgICApOwotCi0gICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgIGRzdF9wdHJbNF0gPSBjbVtUZW1wMV07Ci0gICAgICAgIGRzdF9wdHJbNV0gPSBjbVtUZW1wMl07Ci0gICAgICAgIGRzdF9wdHJbNl0gPSBjbVtUZW1wM107Ci0gICAgICAgIGRzdF9wdHJbN10gPSBjbVtUZW1wNF07Ci0KLSAgICAgICAgLyogbmV4dCA0IHBpeGVscyAqLwotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAvKiBldmVuIDUuIHBpeGVsICovCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDRdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0KLSAgICAgICAgICAgIC8qIGV2ZW4gNi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3A0XSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0KLSAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA5ICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgIC8qIG9kZCA1LiBwaXhlbCAqLwotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjFdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjJdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuNF0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAvKiBvZGQgNi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24zXSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW240XSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjFdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuM10sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAgICVbdHAxXSwgICAgICAxNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wMl0sICAgICRhYzMsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbcDRdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICA6IFt0bjFdICI9JnIiICh0bjEpLCBbdHAxXSAiPSZyIiAodHAxKSwKLSAgICAgICAgICAgICAgW24xXSAiPSZyIiAobjEpLCBbcDNdICI9JnIiIChwMyksIFtuM10gIj0mciIgKG4zKSwKLSAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCi0gICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKLSAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgW3RwMl0gInIiICh0cDIpLCBbcDJdICJyIiAocDIpLCBbbjJdICJyIiAobjIpLAotICAgICAgICAgICAgICBbcDRdICJyIiAocDQpLCBbbjRdICJyIiAobjQpLCBbcDFdICJyIiAocDEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKLSAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKQotICAgICAgICApOwotCi0gICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgIGRzdF9wdHJbOF0gPSBjbVtUZW1wMV07Ci0gICAgICAgIGRzdF9wdHJbOV0gPSBjbVtUZW1wMl07Ci0gICAgICAgIGRzdF9wdHJbMTBdID0gY21bVGVtcDNdOwotICAgICAgICBkc3RfcHRyWzExXSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAvKiBuZXh0IDQgcGl4ZWxzICovCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgIC8qIGV2ZW4gNy4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW3A0XSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLQotICAgICAgICAgICAgLyogZXZlbiA4LiBwaXhlbCAqLwotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFibCAgICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtwNF0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLSAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDE1KCVbc3JjX3B0cl0pCSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImV4dHAgICAgICAgICAgICAgICAlW1RlbXAxXSwgICAgJGFjMywgICAgICAgICAgICA5ICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgIC8qIG9kZCA3LiBwaXhlbCAqLwotICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAgICVbbjRdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMywgICAgICAgICVbbjFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMzLCAgICAgICAgJVtuM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzMsICAgICAgICAlW240XSwgICAgICAgICAgICVbdmVjdG9yM2JdICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAvKiBvZGQgOC4gcGl4ZWwgKi8KLSAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgICAlW24yXSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiZHBhLncucGggICAgICAgICAgICRhYzIsICAgICAgICAlW24zXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgXG5cdCIKLSAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICAgJGFjMiwgICAgICAgICVbbjRdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICBcblx0IgotICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICAlW3ZlY3RvcjNiXSAgIFxuXHQiCi0gICAgICAgICAgICAiZXh0cCAgICAgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgIDkgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJleHRwICAgICAgICAgICAgICAgJVtUZW1wNF0sICAgICRhYzIsICAgICAgICAgICAgOSAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgImxidXggICAgICAgICAgICAgICAlW3RwMV0sICAgICAgJVtUZW1wMV0oJVtjbV0pICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAlW1RlbXAyXSglW2NtXSkgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICAgJVtwMl0sICAgICAgICVbVGVtcDNdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgMTIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic2IgICAgICAgICAgICAgICAgICVbdG4xXSwgICAgICAxMyglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICAgJVtuMl0sICAgICAgICVbVGVtcDRdKCVbY21dKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgICAlW3AyXSwgICAgICAgMTQoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic2IgICAgICAgICAgICAgICAgICVbbjJdLCAgICAgICAxNSglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgOiBbdG4xXSAiPSZyIiAodG4xKSwgW3AyXSAiPSZyIiAocDIpLCBbbjJdICI9JnIiIChuMiksIFtuNF0gIj0mciIgKG40KSwKLSAgICAgICAgICAgICAgW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCi0gICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCkKLSAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgW3RwMV0gInIiICh0cDEpLCBbcDRdICJyIiAocDQpLCBbbjFdICJyIiAobjEpLCBbcDFdICJyIiAocDEpLAotICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLCBbcDNdICJyIiAocDMpLAotICAgICAgICAgICAgICBbbjNdICJyIiAobjMpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKLSAgICAgICAgICAgICAgW2NtXSAiciIgKGNtKSwgW2RzdF9wdHJdICJyIiAoZHN0X3B0cikKLSAgICAgICAgKTsKLQotICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmU7Ci0gICAgICAgIGRzdF9wdHIgKz0gcGl0Y2g7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MxNl8wCi0oCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIHNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIG91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUKLSkKLXsKLSAgICBpbnQgVGVtcDEsIFRlbXAyLCBUZW1wMywgVGVtcDQ7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgcHJlZmV0Y2hfc3RvcmUob3V0cHV0X3B0ciArIDMyKTsKLQotICAgIC8qIGNvcHkgbWVtb3J5IGZyb20gc3JjIGJ1ZmZlciB0byBkc3QgYnVmZmVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wM10sICAgOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInVsdyAgICAlW1RlbXA0XSwgICAxMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDAoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNCglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInN3ICAgICAlW1RlbXAzXSwgICA4KCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbVGVtcDRdLCAgIDEyKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJhZGR1ICAgJVtzcmNfcHRyXSwgJVtzcmNfcHRyXSwgICAgICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLCBbVGVtcDNdICI9JnIiIChUZW1wMyksCi0gICAgICAgICAgICAgIFtUZW1wNF0gIj0mciIgKFRlbXA0KSwgW3NyY19wdHJdICIrciIgKHNyY19wdHIpCi0gICAgICAgICAgICA6IFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpLAotICAgICAgICAgICAgICBbb3V0cHV0X3B0cl0gInIiIChvdXRwdXRfcHRyKQotICAgICAgICApOwotCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICVbVGVtcDNdLCAgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wNF0sICAgMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICAxNiglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDIwKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVtUZW1wM10sICAgMjQoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInN3ICAgICAlW1RlbXA0XSwgICAyOCglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgOiBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLAotICAgICAgICAgICAgICBbVGVtcDRdICI9JnIiIChUZW1wNCksIFtzcmNfcHRyXSAiK3IiIChzcmNfcHRyKQotICAgICAgICAgICAgOiBbc3JjX3BpeGVsc19wZXJfbGluZV0gInIiIChzcmNfcGl4ZWxzX3Blcl9saW5lKSwKLSAgICAgICAgICAgICAgW291dHB1dF9wdHJdICJyIiAob3V0cHV0X3B0cikKLSAgICAgICAgKTsKLQotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAidWx3ICAgICVbVGVtcDFdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMl0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInVsdyAgICAlW1RlbXAzXSwgICA4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAidWx3ICAgICVbVGVtcDRdLCAgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMzIoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAzNiglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAic3cgICAgICVbVGVtcDNdLCAgIDQwKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJzdyAgICAgJVtUZW1wNF0sICAgNDQoJVtvdXRwdXRfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAgICAgJVtzcmNfcGl4ZWxzX3Blcl9saW5lXSAgIFxuXHQiCi0KLSAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksIFtUZW1wM10gIj0mciIgKFRlbXAzKSwKLSAgICAgICAgICAgICAgW1RlbXA0XSAiPSZyIiAoVGVtcDQpLCBbc3JjX3B0cl0gIityIiAoc3JjX3B0cikKLSAgICAgICAgICAgIDogW3NyY19waXhlbHNfcGVyX2xpbmVdICJyIiAoc3JjX3BpeGVsc19wZXJfbGluZSksCi0gICAgICAgICAgICAgIFtvdXRwdXRfcHRyXSAiciIgKG91dHB1dF9wdHIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3V0cHV0X3B0ciArPSA0ODsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzR0YXAKLSgKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAotICAgIGludCB4b2Zmc2V0LAotICAgIGludCB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBkc3RfcHRyLAotICAgIGludCBwaXRjaAotKQotewotICAgIHVuc2lnbmVkIGludCBpLCBqOwotICAgIGludCBUZW1wMSwgVGVtcDIsIFRlbXAzLCBUZW1wNDsKLQotICAgIHVuc2lnbmVkIGludCB2ZWN0b3I0YTsKLSAgICBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiOwotICAgIHVuc2lnbmVkIGludCB0cDEsIHRwMiwgdHAzLCB0bjE7Ci0gICAgdW5zaWduZWQgaW50IHAxLCBwMiwgcDM7Ci0gICAgdW5zaWduZWQgaW50IG4xLCBuMiwgbjM7Ci0gICAgdW5zaWduZWQgY2hhciAqY20gPSBmZl9jcm9wVGJsICsgQ1JPUF9XSURUSDsKLQotICAgIHZlY3RvcjRhID0gNjQ7Ci0KLSAgICB2ZWN0b3IxYiA9IHN1Yl9wZWxfZmlsdGVyc19pbnZfdGFwXzRbeG9mZnNldF1bMF07Ci0gICAgdmVjdG9yMmIgPSBzdWJfcGVsX2ZpbHRlcnNfaW52X3RhcF80W3hvZmZzZXRdWzFdOwotCi0gICAgLyogaWYgKHlvZmZzZXQgPT0gMCkgZG9uJ3QgbmVlZCB0ZW1wIGJ1ZmZlciwgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiBkc3RfcHRyICovCi0gICAgaWYgKHlvZmZzZXQgPT0gMCkgewotICAgICAgICBvdXRwdXRfaGVpZ2h0IC09IDU7Ci0gICAgICAgIHNyY19wdHIgKz0gKHNyY19waXhlbHNfcGVyX2xpbmUgKyBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKLQotICAgICAgICBmb3IgKGkgPSBvdXRwdXRfaGVpZ2h0OyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInVsdyAgICAgJVt0cDNdLCAgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICA6IFt0cDNdICI9JnIiICh0cDMpCi0gICAgICAgICAgICAgICAgOiBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgLyogcHJvY2Vzc2luZyA0IGFkamFjZW50IHBpeGVscyAqLwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLwotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDJdLCAgICAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtb3ZlICAgICAgICAgICAgICVbdHAxXSwgICAgICAlW3RwM10gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMS4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibW92ZSAgICAgICAgICAgICAlW3RwM10sICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtwMV0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbcDJdLCAgICAgICAlW3RwMV0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AzXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwMl0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbcDNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRyLncgICAgICAgICAgICVbVGVtcDFdLCAgICAkYWMzLCAgICAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAxLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAidWx3ICAgICAgICAgICAgICAlW3RuMV0sICAgICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImJhbGlnbiAgICAgICAgICAgJVt0cDJdLCAgICAgICVbdHAxXSwgICAgICAgICAgMyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAgICVbdmVjdG9yNGFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibXRoaSAgICAgICAgICAgICAkMCwgICAgICAgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYnIgICAgJVtuMV0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJsICAgICVbbjJdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24zXSwgICAgICAgJVt0bjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHIudyAgICAgICAgICAgJVtUZW1wM10sICAgICRhYzIsICAgICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24xXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtuMl0sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBvZGQgMi4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0ci53ICAgICAgICAgICAlW1RlbXAyXSwgICAgJGFjMywgICAgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjJdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW24zXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0ci53ICAgICAgICAgICAlW1RlbXA0XSwgICAgJGFjMiwgICAgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RwMV0sICAgICAgJVtUZW1wMV0oJVtjbV0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0bjFdLCAgICAgICVbVGVtcDJdKCVbY21dKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdHAyXSwgICAgICAlW1RlbXAzXSglW2NtXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RwMV0sICAgICAgMCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVt0bjFdLCAgICAgIDEoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbbjJdLCAgICAgICAlW1RlbXA0XSglW2NtXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RwMl0sICAgICAgMiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInNiICAgICAgICAgICAgICAgJVtuMl0sICAgICAgIDMoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgOiBbdHAxXSAiPSZyIiAodHAxKSwgW3RwMl0gIj0mciIgKHRwMiksIFt0cDNdICI9JnIiICh0cDMpLAotICAgICAgICAgICAgICAgICAgICAgIFt0bjFdICI9JnIiICh0bjEpLCBbcDFdICI9JnIiIChwMSksIFtwMl0gIj0mciIgKHAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbbjFdICI9JnIiIChuMSksIFtuMl0gIj0mciIgKG4yKSwgW24zXSAiPSZyIiAobjMpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLCBbcDNdICI9JnIiIChwMyksCi0gICAgICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9JnIiIChUZW1wNCkKLSAgICAgICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAotICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFtjbV0gInIiIChjbSksIFtkc3RfcHRyXSAiciIgKGRzdF9wdHIpLAotICAgICAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIHNyY19wdHIgICAgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTmV4dCByb3cuLi4gKi8KLSAgICAgICAgICAgIHNyY19wdHIgICAgKz0gc3JjX3BpeGVsc19wZXJfbGluZSAtIDE2OwotICAgICAgICAgICAgZHN0X3B0ciArPSBwaXRjaDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gb3V0cHV0X2hlaWdodDsgaS0tOykKLSAgICAgICAgewotICAgICAgICAgICAgLyogcHJvY2Vzc2luZyA0IGFkamFjZW50IHBpeGVscyAqLwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyIHdpdGggdmVjdG9ycyBwYWlycyAqLwotICAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAgICAgInVsdyAgICAgICAgICAgICAgJVt0cDFdLCAgICAgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdHAyXSwgICAgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4gMS4gcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW3AxXSwgICAgICAgJVt0cDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtwMl0sICAgICAgICVbdHAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbcDNdLCAgICAgICAlW3RwMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMzLCAgICAgICAgJVtwMV0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbcDJdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogZXZlbiAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10aGkgICAgICAgICAgICAgJDAsICAgICAgICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzIsICAgICAgICAlW3AyXSwgICAgICAgICAgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtwM10sICAgICAgICAgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHIudyAgICAgICAgICAgJVtUZW1wMV0sICAgICRhYzMsICAgICAgICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgLyogb2RkIDEuIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICJ1bHcgICAgICAgICAgICAgICVbdG4xXSwgICAgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiYmFsaWduICAgICAgICAgICAlW3RwMl0sICAgICAgJVt0cDFdLCAgICAgICAgICAzICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICAgJVt2ZWN0b3I0YV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGhpICAgICAgICAgICAgICQwLCAgICAgICAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAicHJlY2V1LnBoLnFiciAgICAlW24xXSwgICAgICAgJVt0cDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgInByZWNldS5waC5xYmwgICAgJVtuMl0sICAgICAgICVbdHAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJwcmVjZXUucGgucWJyICAgICVbbjNdLCAgICAgICAlW3RuMV0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0ci53ICAgICAgICAgICAlW1RlbXAzXSwgICAgJGFjMiwgICAgICAgICAgICA3ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMywgICAgICAgICVbbjFdLCAgICAgICAgICAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGEudy5waCAgICAgICAgICRhYzMsICAgICAgICAlW24yXSwgICAgICAgICAgICVbdmVjdG9yMmJdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIG9kZCAyLiBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgICAlW3ZlY3RvcjRhXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10aGkgICAgICAgICAgICAgJDAsICAgICAgICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRyLncgICAgICAgICAgICVbVGVtcDJdLCAgICAkYWMzLCAgICAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhLncucGggICAgICAgICAkYWMyLCAgICAgICAgJVtuMl0sICAgICAgICAgICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYS53LnBoICAgICAgICAgJGFjMiwgICAgICAgICVbbjNdLCAgICAgICAgICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRyLncgICAgICAgICAgICVbVGVtcDRdLCAgICAkYWMyLCAgICAgICAgICAgIDcgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgICAgICAgICAgICAgICJsYnV4ICAgICAgICAgICAgICVbdHAxXSwgICAgICAlW1RlbXAxXSglW2NtXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1eCAgICAgICAgICAgICAlW3RuMV0sICAgICAgJVtUZW1wMl0oJVtjbV0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVt0cDJdLCAgICAgICVbVGVtcDNdKCVbY21dKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdHAxXSwgICAgICAwKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW3RuMV0sICAgICAgMSglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidXggICAgICAgICAgICAgJVtuMl0sICAgICAgICVbVGVtcDRdKCVbY21dKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJzYiAgICAgICAgICAgICAgICVbdHAyXSwgICAgICAyKCVbb3V0cHV0X3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAic2IgICAgICAgICAgICAgICAlW24yXSwgICAgICAgMyglW291dHB1dF9wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICA6IFt0cDFdICI9JnIiICh0cDEpLCBbdHAyXSAiPSZyIiAodHAyKSwgW3RuMV0gIj0mciIgKHRuMSksCi0gICAgICAgICAgICAgICAgICAgICAgW3AxXSAiPSZyIiAocDEpLCBbcDJdICI9JnIiIChwMiksIFtwM10gIj0mciIgKHAzKSwKLSAgICAgICAgICAgICAgICAgICAgICBbbjFdICI9JnIiIChuMSksIFtuMl0gIj0mciIgKG4yKSwgW24zXSAiPSZyIiAobjMpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPSZyIiAoVGVtcDQpCi0gICAgICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLCBbY21dICJyIiAoY20pLAotICAgICAgICAgICAgICAgICAgICAgIFtvdXRwdXRfcHRyXSAiciIgKG91dHB1dF9wdHIpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBzcmNfcHRyICAgICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG5leHQgcm93Li4uICovCi0gICAgICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmU7Ci0gICAgICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF93aWR0aDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi12b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzczQKLSgKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgb3V0cHV0X3B0ciwKLSAgICBpbnQgb3V0cHV0X3BpdGNoLAotICAgIGludCB5b2Zmc2V0Ci0pCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBpbnQgVGVtcDEsIFRlbXAyLCBUZW1wMywgVGVtcDQ7Ci0gICAgdW5zaWduZWQgaW50IHZlY3RvcjFiLCB2ZWN0b3IyYiwgdmVjdG9yM2IsIHZlY3RvcjRhOwotCi0gICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX2wyOwotICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9sMTsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfMDsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfcjE7Ci0gICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX3IyOwotICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9yMzsKLQotICAgIHVuc2lnbmVkIGNoYXIgKmNtID0gZmZfY3JvcFRibCArIENST1BfV0lEVEg7Ci0KLSAgICB2ZWN0b3I0YSA9IDY0OwotCi0gICAgLyogbG9hZCBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0gICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNzW3lvZmZzZXRdWzBdOwotICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzc1t5b2Zmc2V0XVsyXTsKLSAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc3NbeW9mZnNldF1bMV07Ci0KLSAgICBpZiAodmVjdG9yMWIpIHsKLSAgICAgICAgLyogNiB0YXAgZmlsdGVyICovCi0KLSAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLwotICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIpOwotCi0gICAgICAgIGZvciAoaSA9IDI7IGktLTspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogZG8gbm90IGFsbG93IGNvbXBpbGVyIHRvIHJlb3JkZXIgaW5zdHJ1Y3Rpb25zICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC04KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC00KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAxMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC01KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDE1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA0XSwgICAgICAgJGFjMSwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgOiBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKLSAgICAgICAgICAgICAgICAgIFtUZW1wM10gIj0mciIgKFRlbXAzKSwgW1RlbXA0XSAiPXIiIChUZW1wNCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLCBbc3JjX3B0cl9yM10gIj0mciIgKHNyY19wdHJfcjMpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAotICAgICAgICAgICAgICAgICAgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgb3V0cHV0X3B0clswXSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMV0gPSBjbVtUZW1wMl07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzJdID0gY21bVGVtcDNdOwotICAgICAgICAgICAgb3V0cHV0X3B0clszXSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC00KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDE4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAxOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCi0gICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj1yIiAoVGVtcDQpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDJdICI9JnIiIChzcmNfcHRyX2wyKSwgW3NyY19wdHJfcjNdICI9JnIiIChzcmNfcHRyX3IzKQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KLSAgICAgICAgICAgIG91dHB1dF9wdHJbMF0gPSBjbVtUZW1wMV07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzFdID0gY21bVGVtcDJdOwotICAgICAgICAgICAgb3V0cHV0X3B0clsyXSA9IGNtW1RlbXAzXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbM10gPSBjbVtUZW1wNF07Ci0KLSAgICAgICAgICAgIHNyY19wdHIgKz0gODsKLSAgICAgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3BpdGNoOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiA0IHRhcCBmaWx0ZXIgKi8KLQotICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0cik7Ci0KLSAgICAgICAgZm9yIChpID0gMjsgaS0tOykKLSAgICAgICAgewotICAgICAgICAgICAgLyogZG8gbm90IGFsbG93IGNvbXBpbGVyIHRvIHJlb3JkZXIgaW5zdHJ1Y3Rpb25zICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC00KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0yKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDRdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9ciIgKFRlbXA0KSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICI9JnIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICI9JnIiIChzcmNfcHRyX3IyKQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgb3V0cHV0X3B0clswXSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMV0gPSBjbVtUZW1wMl07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzJdID0gY21bVGVtcDNdOwotICAgICAgICAgICAgb3V0cHV0X3B0clszXSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDEyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIDIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDRdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9ciIgKFRlbXA0KSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICI9JnIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICI9JnIiIChzcmNfcHRyX3IyKQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICAvKiBjbGFtcCBhbmQgc3RvcmUgcmVzdWx0cyAqLwotICAgICAgICAgICAgb3V0cHV0X3B0clswXSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMV0gPSBjbVtUZW1wMl07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzJdID0gY21bVGVtcDNdOwotICAgICAgICAgICAgb3V0cHV0X3B0clszXSA9IGNtW1RlbXA0XTsKLQotICAgICAgICAgICAgc3JjX3B0ciArPSA4OwotICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfOAotKAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBvdXRwdXRfcHRyLAotICAgIGludCBvdXRwdXRfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKLSAgICB1bnNpZ25lZCBpbnQgeW9mZnNldAotKQotewotICAgIHVuc2lnbmVkIGludCBpLCBqOwotCi0gICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0LCBUZW1wNSwgVGVtcDYsIFRlbXA3LCBUZW1wODsKLSAgICB1bnNpZ25lZCBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYiwgdmVjdG9yNGE7Ci0KLSAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfbDI7Ci0gICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX2wxOwotICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl8wOwotICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9yMTsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfcjI7Ci0gICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX3IzOwotICAgIHVuc2lnbmVkIGNoYXIgKmNtID0gZmZfY3JvcFRibCArIENST1BfV0lEVEg7Ci0KLSAgICB2ZWN0b3I0YSA9IDY0OwotCi0gICAgdmVjdG9yMWIgPSBzdWJfcGVsX2ZpbHRlcnNzW3lvZmZzZXRdWzBdOwotICAgIHZlY3RvcjJiID0gc3ViX3BlbF9maWx0ZXJzc1t5b2Zmc2V0XVsyXTsKLSAgICB2ZWN0b3IzYiA9IHN1Yl9wZWxfZmlsdGVyc3NbeW9mZnNldF1bMV07Ci0KLSAgICBpZiAodmVjdG9yMWIpIHsKLSAgICAgICAgLyogNiB0YXAgZmlsdGVyICovCi0KLSAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLwotICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIpOwotCi0gICAgICAgIGZvciAoaSA9IG91dHB1dF9oZWlnaHQ7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC04KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDI0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAyNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMjYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC01KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDE5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDI3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLCBbVGVtcDNdICI9JnIiIChUZW1wMyksCi0gICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAotICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpLAotICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLCBbc3JjX3B0cl9yM10gIj0mciIgKHNyY19wdHJfcjMpCi0gICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCi0gICAgICAgICAgICAgIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksCi0gICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgd2l0aCB2ZWN0b3JzIHBhaXJzICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAyMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAyOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgMjkoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA1XSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0yKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDIyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDMwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNl0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAyMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICAzMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDddLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wOF0sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgIDogW1RlbXA0XSAiPSZyIiAoVGVtcDQpLCBbVGVtcDVdICI9JnIiIChUZW1wNSksCi0gICAgICAgICAgICAgICAgICBbVGVtcDZdICI9JnIiIChUZW1wNiksIFtUZW1wN10gIj0mciIgKFRlbXA3KSwgW1RlbXA4XSAiPXIiIChUZW1wOCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLFtzcmNfcHRyX3IzXSAiPSZyIiAoc3JjX3B0cl9yMykKLSAgICAgICAgICAgICAgICA6IFt2ZWN0b3IxYl0gInIiICh2ZWN0b3IxYiksIFt2ZWN0b3IyYl0gInIiICh2ZWN0b3IyYiksCi0gICAgICAgICAgICAgICAgICBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLCBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgICAgICBvdXRwdXRfcHRyWzBdID0gY21bVGVtcDFdOwotICAgICAgICAgICAgb3V0cHV0X3B0clsxXSA9IGNtW1RlbXAyXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMl0gPSBjbVtUZW1wM107Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzNdID0gY21bVGVtcDRdOwotICAgICAgICAgICAgb3V0cHV0X3B0cls0XSA9IGNtW1RlbXA1XTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbNV0gPSBjbVtUZW1wNl07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzZdID0gY21bVGVtcDddOwotICAgICAgICAgICAgb3V0cHV0X3B0cls3XSA9IGNtW1RlbXA4XTsKLQotICAgICAgICAgICAgc3JjX3B0ciArPSA4OwotICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIDQgdGFwIGZpbHRlciAqLwotCi0gICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KLSAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyKTsKLQotICAgICAgICBmb3IgKGkgPSBvdXRwdXRfaGVpZ2h0OyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICI9JnIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICI9JnIiIChzcmNfcHRyX3IyKQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICA5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAxNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj1yIiAoVGVtcDEpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICI9JnIiIChzcmNfcHRyX2wxKSwgW3NyY19wdHJfMF0gIj0mciIgKHNyY19wdHJfMCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gIj0mciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gIj0mciIgKHNyY19wdHJfcjIpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0cikKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIHNyY19wdHJfbDEgPSBzcmNfcHRyWy02XTsKLSAgICAgICAgICAgIHNyY19wdHJfMCAgPSBzcmNfcHRyWzJdOwotICAgICAgICAgICAgc3JjX3B0cl9yMSA9IHNyY19wdHJbMTBdOwotICAgICAgICAgICAgc3JjX3B0cl9yMiA9IHNyY19wdHJbMThdOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDJdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMl0gIj1yIiAoVGVtcDIpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICJyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICJyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gInIiIChzcmNfcHRyX3IyKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIHNyY19wdHJfbDEgPSBzcmNfcHRyWy01XTsKLSAgICAgICAgICAgIHNyY19wdHJfMCAgPSBzcmNfcHRyWzNdOwotICAgICAgICAgICAgc3JjX3B0cl9yMSA9IHNyY19wdHJbMTFdOwotICAgICAgICAgICAgc3JjX3B0cl9yMiA9IHNyY19wdHJbMTldOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wM10gIj1yIiAoVGVtcDMpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICJyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICJyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gInIiIChzcmNfcHRyX3IyKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIHNyY19wdHJfbDEgPSBzcmNfcHRyWy00XTsKLSAgICAgICAgICAgIHNyY19wdHJfMCAgPSBzcmNfcHRyWzRdOwotICAgICAgICAgICAgc3JjX3B0cl9yMSA9IHNyY19wdHJbMTJdOwotICAgICAgICAgICAgc3JjX3B0cl9yMiA9IHNyY19wdHJbMjBdOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDRdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wNF0gIj1yIiAoVGVtcDQpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICJyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICJyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gInIiIChzcmNfcHRyX3IyKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIHNyY19wdHJfbDEgPSBzcmNfcHRyWy0zXTsKLSAgICAgICAgICAgIHNyY19wdHJfMCAgPSBzcmNfcHRyWzVdOwotICAgICAgICAgICAgc3JjX3B0cl9yMSA9IHNyY19wdHJbMTNdOwotICAgICAgICAgICAgc3JjX3B0cl9yMiA9IHNyY19wdHJbMjFdOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDVdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wNV0gIj0mciIgKFRlbXA1KQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiciIgKHNyY19wdHJfMCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gInIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICJyIiAoc3JjX3B0cl9yMiksCi0gICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBzcmNfcHRyX2wxID0gc3JjX3B0clstMl07Ci0gICAgICAgICAgICBzcmNfcHRyXzAgID0gc3JjX3B0cls2XTsKLSAgICAgICAgICAgIHNyY19wdHJfcjEgPSBzcmNfcHRyWzE0XTsKLSAgICAgICAgICAgIHNyY19wdHJfcjIgPSBzcmNfcHRyWzIyXTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA2XSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgOiBbVGVtcDZdICI9ciIgKFRlbXA2KQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiciIgKHNyY19wdHJfMCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9yMV0gInIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICJyIiAoc3JjX3B0cl9yMiksCi0gICAgICAgICAgICAgICAgICBbdmVjdG9yNGFdICJyIiAodmVjdG9yNGEpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBzcmNfcHRyX2wxID0gc3JjX3B0clstMV07Ci0gICAgICAgICAgICBzcmNfcHRyXzAgID0gc3JjX3B0cls3XTsKLSAgICAgICAgICAgIHNyY19wdHJfcjEgPSBzcmNfcHRyWzE1XTsKLSAgICAgICAgICAgIHNyY19wdHJfcjIgPSBzcmNfcHRyWzIzXTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA3XSwgICAgICAgJGFjMCwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA4XSwgICAgICAgJGFjMSwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgOiBbVGVtcDddICI9JnIiIChUZW1wNyksIFtUZW1wOF0gIj1yIiAoVGVtcDgpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfbDFdICJyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICJyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiciIgKHNyY19wdHJfcjEpLCBbc3JjX3B0cl9yMl0gInIiIChzcmNfcHRyX3IyKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgICAgICBvdXRwdXRfcHRyWzBdID0gY21bVGVtcDFdOwotICAgICAgICAgICAgb3V0cHV0X3B0clsxXSA9IGNtW1RlbXAyXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMl0gPSBjbVtUZW1wM107Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzNdID0gY21bVGVtcDRdOwotICAgICAgICAgICAgb3V0cHV0X3B0cls0XSA9IGNtW1RlbXA1XTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbNV0gPSBjbVtUZW1wNl07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzZdID0gY21bVGVtcDddOwotICAgICAgICAgICAgb3V0cHV0X3B0cls3XSA9IGNtW1RlbXA4XTsKLQotICAgICAgICAgICAgc3JjX3B0ciArPSA4OwotICAgICAgICAgICAgb3V0cHV0X3B0ciArPSBvdXRwdXRfcGl0Y2g7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3MxNjEKLSgKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgb3V0cHV0X3B0ciwKLSAgICBpbnQgb3V0cHV0X3BpdGNoLAotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp2cDhfZmlsdGVyCi0pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgICBpbnQgVGVtcDEsIFRlbXAyLCBUZW1wMywgVGVtcDQsIFRlbXA1LCBUZW1wNiwgVGVtcDcsIFRlbXA4OwotICAgIHVuc2lnbmVkIGludCB2ZWN0b3I0YTsKLSAgICB1bnNpZ25lZCBpbnQgdmVjdG9yMWIsIHZlY3RvcjJiLCB2ZWN0b3IzYjsKLQotICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9sMjsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfbDE7Ci0gICAgdW5zaWduZWQgY2hhciBzcmNfcHRyXzA7Ci0gICAgdW5zaWduZWQgY2hhciBzcmNfcHRyX3IxOwotICAgIHVuc2lnbmVkIGNoYXIgc3JjX3B0cl9yMjsKLSAgICB1bnNpZ25lZCBjaGFyIHNyY19wdHJfcjM7Ci0gICAgdW5zaWduZWQgY2hhciAqY20gPSBmZl9jcm9wVGJsICsgQ1JPUF9XSURUSDsKLQotICAgIHZlY3RvcjRhID0gNjQ7Ci0KLSAgICB2ZWN0b3IxYiA9IHZwOF9maWx0ZXJbMF07Ci0gICAgdmVjdG9yMmIgPSB2cDhfZmlsdGVyWzJdOwotICAgIHZlY3RvcjNiID0gdnA4X2ZpbHRlclsxXTsKLQotICAgIGlmICh2ZWN0b3IxYiA9PSAwKSB7Ci0gICAgICAgIC8qIDQgdGFwIGZpbHRlciAqLwotCi0gICAgICAgIC8qIHByZWZldGNoIHNyY19wdHIgZGF0YSB0byBjYWNoZSBtZW1vcnkgKi8KLSAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyICsgMTYpOwotCi0gICAgICAgIGZvciAoaSA9IDE2OyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB1bnJvbGxpbmcgZm9yIGxvb3AgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaiArPSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMV0sICAgICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTEzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDIwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNF0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA1XSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDZdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDIzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wN10sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDhdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAgICAgOiBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj0mciIgKFRlbXA0KSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDVdICI9JnIiIChUZW1wNSksIFtUZW1wNl0gIj0mciIgKFRlbXA2KSwKLSAgICAgICAgICAgICAgICAgICAgICBbVGVtcDddICI9JnIiIChUZW1wNyksIFtUZW1wOF0gIj1yIiAoVGVtcDgpLAotICAgICAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAotICAgICAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMikKLSAgICAgICAgICAgICAgICAgICAgOiBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLCBbdmVjdG9yM2JdICJyIiAodmVjdG9yM2IpLAotICAgICAgICAgICAgICAgICAgICAgIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIC8qIGNsYW1wIGFuZCBzdG9yZSByZXN1bHRzICovCi0gICAgICAgICAgICAgICAgb3V0cHV0X3B0cltqXSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgICAgICBvdXRwdXRfcHRyW2orMV0gPSBjbVtUZW1wMl07Ci0gICAgICAgICAgICAgICAgb3V0cHV0X3B0cltqKzJdID0gY21bVGVtcDNdOwotICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbaiszXSA9IGNtW1RlbXA0XTsKLSAgICAgICAgICAgICAgICBvdXRwdXRfcHRyW2orNF0gPSBjbVtUZW1wNV07Ci0gICAgICAgICAgICAgICAgb3V0cHV0X3B0cltqKzVdID0gY21bVGVtcDZdOwotICAgICAgICAgICAgICAgIG91dHB1dF9wdHJbais2XSA9IGNtW1RlbXA3XTsKLSAgICAgICAgICAgICAgICBvdXRwdXRfcHRyW2orN10gPSBjbVtUZW1wOF07Ci0KLSAgICAgICAgICAgICAgICBzcmNfcHRyICs9IDg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3BpdGNoOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiA0IHRhcCBmaWx0ZXIgKi8KLQotICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgIHByZWZldGNoX2xvYWQoc3JjX3B0ciArIDE2KTsKLQotICAgICAgICAvKiB1bnJvbGwgZm9yIGxvb3AgKi8KLSAgICAgICAgZm9yIChpID0gMTY7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciB3aXRoIHZlY3RvcnMgcGFpcnMgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0zMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDMyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDQ4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMyLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMzEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAxNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA0OSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDFdLCAgICAgICAkYWMyLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMCwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTMwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTE0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNTAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAyXSwgICAgICAgJGFjMCwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzEsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDE5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDUxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wM10sICAgICAgICRhYzEsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMzLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1MiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDRdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTI3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTExKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgMzcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNTMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA1XSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0xMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDYoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDIyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDM4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDU0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNl0sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyMyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICAzOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1NSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDddLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wOF0sICAgICAgICRhYzMsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMiksCi0gICAgICAgICAgICAgICAgICBbVGVtcDNdICI9JnIiIChUZW1wMyksIFtUZW1wNF0gIj0mciIgKFRlbXA0KSwKLSAgICAgICAgICAgICAgICAgIFtUZW1wNV0gIj0mciIgKFRlbXA1KSwgW1RlbXA2XSAiPSZyIiAoVGVtcDYpLAotICAgICAgICAgICAgICAgICAgW1RlbXA3XSAiPSZyIiAoVGVtcDcpLCBbVGVtcDhdICI9ciIgKFRlbXA4KSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wxXSAiPSZyIiAoc3JjX3B0cl9sMSksIFtzcmNfcHRyXzBdICI9JnIiIChzcmNfcHRyXzApLAotICAgICAgICAgICAgICAgICAgW3NyY19wdHJfcjFdICI9JnIiIChzcmNfcHRyX3IxKSwgW3NyY19wdHJfcjJdICI9JnIiIChzcmNfcHRyX3IyKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX2wyXSAiPSZyIiAoc3JjX3B0cl9sMiksW3NyY19wdHJfcjNdICI9JnIiIChzcmNfcHRyX3IzKQotICAgICAgICAgICAgICAgIDogW3ZlY3RvcjFiXSAiciIgKHZlY3RvcjFiKSwgW3ZlY3RvcjJiXSAiciIgKHZlY3RvcjJiKSwKLSAgICAgICAgICAgICAgICAgIFt2ZWN0b3IzYl0gInIiICh2ZWN0b3IzYiksIFt2ZWN0b3I0YV0gInIiICh2ZWN0b3I0YSksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl0gInIiIChzcmNfcHRyKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgLyogY2xhbXAgYW5kIHN0b3JlIHJlc3VsdHMgKi8KLSAgICAgICAgICAgIG91dHB1dF9wdHJbMF0gPSBjbVtUZW1wMV07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzFdID0gY21bVGVtcDJdOwotICAgICAgICAgICAgb3V0cHV0X3B0clsyXSA9IGNtW1RlbXAzXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbM10gPSBjbVtUZW1wNF07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzRdID0gY21bVGVtcDVdOwotICAgICAgICAgICAgb3V0cHV0X3B0cls1XSA9IGNtW1RlbXA2XTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbNl0gPSBjbVtUZW1wN107Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzddID0gY21bVGVtcDhdOwotCi0gICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgd2l0aCB2ZWN0b3JzIHBhaXJzICovCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICA4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA0MCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1NiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMiwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTIzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgNDEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNTcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXAxXSwgICAgICAgJGFjMiwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzAsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0yMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC02KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDEwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDI2KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDQyKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDU4KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wMl0sICAgICAgICRhYzAsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMxLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMjEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtNSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxMSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAyNyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA0MyglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA1OSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDNdLCAgICAgICAkYWMxLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMywgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTIwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMTIoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMjgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgNDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNjAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA0XSwgICAgICAgJGFjMywgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzIsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgIC0xOSglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgIC0zKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgIDEzKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IxXSwgIDI5KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IyXSwgIDQ1KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibGJ1ICAgICAgICAgICAgJVtzcmNfcHRyX3IzXSwgIDYxKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibXRsbyAgICAgICAgICAgJVt2ZWN0b3I0YV0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZXh0cCAgICAgICAgICAgJVtUZW1wNV0sICAgICAgICRhYzIsICAgICAgICAgICA5ICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVtzcmNfcHRyX3IzXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVtzcmNfcHRyX3IxXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhcHBlbmQgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVtzcmNfcHRyX3IyXSwgIDggICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbdmVjdG9yMWJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcGF1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbdmVjdG9yMmJdICAgICBcblx0IgotICAgICAgICAgICAgICAgICJkcHN1LmgucWJyICAgICAkYWMwLCAgICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbdmVjdG9yM2JdICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAtMTgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAtMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAxNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMV0sICAzMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yMl0sICA0NiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxidSAgICAgICAgICAgICVbc3JjX3B0cl9yM10sICA2MiglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm10bG8gICAgICAgICAgICVbdmVjdG9yNGFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDZdLCAgICAgICAkYWMwLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wyXSwgICVbc3JjX3B0cl9yM10sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyXzBdLCAgICVbc3JjX3B0cl9yMV0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYXBwZW5kICAgICAgICAgJVtzcmNfcHRyX2wxXSwgICVbc3JjX3B0cl9yMl0sICA4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3ZlY3RvcjFiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBhdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3ZlY3RvcjJiXSAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiZHBzdS5oLnFiciAgICAgJGFjMSwgICAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3ZlY3RvcjNiXSAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgLTE3KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgLTEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgMTUoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjFdLCAgMzEoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjJdLCAgNDcoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJsYnUgICAgICAgICAgICAlW3NyY19wdHJfcjNdLCAgNjMoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtdGxvICAgICAgICAgICAlW3ZlY3RvcjRhXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJleHRwICAgICAgICAgICAlW1RlbXA3XSwgICAgICAgJGFjMSwgICAgICAgICAgIDkgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMl0sICAlW3NyY19wdHJfcjNdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl8wXSwgICAlW3NyY19wdHJfcjFdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFwcGVuZCAgICAgICAgICVbc3JjX3B0cl9sMV0sICAlW3NyY19wdHJfcjJdLCAgOCAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDJdLCAgJVt2ZWN0b3IxYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwYXUuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfMF0sICAgJVt2ZWN0b3IyYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImRwc3UuaC5xYnIgICAgICRhYzMsICAgICAgICAgICAlW3NyY19wdHJfbDFdLCAgJVt2ZWN0b3IzYl0gICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImV4dHAgICAgICAgICAgICVbVGVtcDhdLCAgICAgICAkYWMzLCAgICAgICAgICAgOSAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpLAotICAgICAgICAgICAgICAgICAgW1RlbXAzXSAiPSZyIiAoVGVtcDMpLCBbVGVtcDRdICI9JnIiIChUZW1wNCksCi0gICAgICAgICAgICAgICAgICBbVGVtcDVdICI9JnIiIChUZW1wNSksIFtUZW1wNl0gIj0mciIgKFRlbXA2KSwKLSAgICAgICAgICAgICAgICAgIFtUZW1wN10gIj0mciIgKFRlbXA3KSwgW1RlbXA4XSAiPXIiIChUZW1wOCksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMV0gIj0mciIgKHNyY19wdHJfbDEpLCBbc3JjX3B0cl8wXSAiPSZyIiAoc3JjX3B0cl8wKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyX3IxXSAiPSZyIiAoc3JjX3B0cl9yMSksIFtzcmNfcHRyX3IyXSAiPSZyIiAoc3JjX3B0cl9yMiksCi0gICAgICAgICAgICAgICAgICBbc3JjX3B0cl9sMl0gIj0mciIgKHNyY19wdHJfbDIpLCBbc3JjX3B0cl9yM10gIj0mciIgKHNyY19wdHJfcjMpCi0gICAgICAgICAgICAgICAgOiBbdmVjdG9yMWJdICJyIiAodmVjdG9yMWIpLCBbdmVjdG9yMmJdICJyIiAodmVjdG9yMmIpLAotICAgICAgICAgICAgICAgICAgW3ZlY3RvcjNiXSAiciIgKHZlY3RvcjNiKSwgW3ZlY3RvcjRhXSAiciIgKHZlY3RvcjRhKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpCi0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBzcmNfcHRyICs9IDE2OwotICAgICAgICAgICAgb3V0cHV0X3B0cls4XSA9IGNtW1RlbXAxXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbOV0gPSBjbVtUZW1wMl07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzEwXSA9IGNtW1RlbXAzXTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMTFdID0gY21bVGVtcDRdOwotICAgICAgICAgICAgb3V0cHV0X3B0clsxMl0gPSBjbVtUZW1wNV07Ci0gICAgICAgICAgICBvdXRwdXRfcHRyWzEzXSA9IGNtW1RlbXA2XTsKLSAgICAgICAgICAgIG91dHB1dF9wdHJbMTRdID0gY21bVGVtcDddOwotICAgICAgICAgICAgb3V0cHV0X3B0clsxNV0gPSBjbVtUZW1wOF07Ci0KLSAgICAgICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3BpdGNoOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0X21pcHMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICogUkVTVFJJQ1Qgc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqIFJFU1RSSUNUIGRzdF9wdHIsCi0gICAgaW50IGRzdF9waXRjaAotKQotewotICAgIHVuc2lnbmVkIGNoYXIgRkRhdGFbOSo0XTsgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLSAgICB1bnNpZ25lZCBpbnQgcG9zID0gMTY7Ci0KLSAgICAvKiBiaXQgcG9zaXRvbiBmb3IgZXh0cmFjdCBmcm9tIGFjYyAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgIndyZHNwICAgICAgJVtwb3NdLCAgICAgMSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgOgotICAgICAgICA6IFtwb3NdICJyIiAocG9zKQotICAgICk7Ci0KLSAgICBpZiAoeW9mZnNldCkgewotICAgICAgICAvKiBGaXJzdCBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc180KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCA5LCB4b2Zmc2V0LCA0KTsKLSAgICAgICAgLyogdGhlbiBmaWx0ZXIgdmVydGljYWx5Li4uICovCi0gICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9zZWNvbmRfcGFzczQoRkRhdGEgKyA4LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIHlvZmZzZXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIC8qIGlmICh5b2Zmc3NldCA9PSAwKSB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyBzYXZlIGRhdGEgdG8gZHN0X3B0ciAqLwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc180KHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgeG9mZnNldCwgZHN0X3BpdGNoKTsKLX0KLQotCi12b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4OF9taXBzCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKiBSRVNUUklDVCBzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0KLSAgICB1bnNpZ25lZCBjaGFyIEZEYXRhWzEzKjhdOyAgIC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCi0gICAgdW5zaWduZWQgaW50IHBvcywgaSwgVGVtcDEsIFRlbXAyOwotCi0gICAgcG9zID0gMTY7Ci0KLSAgICAvKiBiaXQgcG9zaXRvbiBmb3IgZXh0cmFjdCBmcm9tIGFjYyAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgIndyZHNwICAgICAgJVtwb3NdLCAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIDoKLSAgICAgICAgOiBbcG9zXSAiciIgKHBvcykKLSAgICApOwotCi0gICAgaWYgKHlvZmZzZXQpIHsKLQotICAgICAgICBzcmNfcHRyID0gc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSk7Ci0KLSAgICAgICAgaWYgKHhvZmZzZXQpCi0gICAgICAgICAgICAvKiBmaWx0ZXIgMS1EIGhvcml6b250YWxseS4uLiAqLwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3NfOF9hbGwoc3JjX3B0ciwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywgeG9mZnNldCwgOCk7Ci0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBwcmVmZXRjaCBzcmNfcHRyIGRhdGEgdG8gY2FjaGUgbWVtb3J5ICovCi0gICAgICAgICAgICBwcmVmZXRjaF9sb2FkKHNyY19wdHIgKyAyKnNyY19waXhlbHNfcGVyX2xpbmUpOwotCi0gICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgOCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAxMiglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMTYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyMCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMjQoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyOCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMzIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAzNiglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNDAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA0NCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNDgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA1MiglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNTYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA2MCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNjQoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA2OCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgNzIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA3NiglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgODAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA4NCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgODgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICA5MiglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAiYWRkdSAgICVbc3JjX3B0cl0sICVbc3JjX3B0cl0sICAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICBcblx0IgotCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAxXSwgICAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDJdLCAgIDQoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgOTYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAxMDAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAgICAgICAgIDogW1RlbXAxXSAiPSZyIiAoVGVtcDEpLCBbVGVtcDJdICI9JnIiIChUZW1wMikKLSAgICAgICAgICAgICAgICA6IFtGRGF0YV0gInIiIChGRGF0YSksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpLAotICAgICAgICAgICAgICAgICAgW3NyY19waXhlbHNfcGVyX2xpbmVdICJyIiAoc3JjX3BpeGVsc19wZXJfbGluZSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZmlsdGVyIHZlcnRpY2FseS4uLiAqLwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3NfOChGRGF0YSArIDE2LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIDgsIHlvZmZzZXQpOwotICAgIH0KLQotICAgIC8qIGlmICh5b2Zmc3NldCA9PSAwKSB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyBzYXZlIGRhdGEgdG8gZHN0X3B0ciAqLwotICAgIGVsc2UgewotICAgICAgICBpZiAoeG9mZnNldCkKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzXzhfYWxsKHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCB4b2Zmc2V0LCBkc3RfcGl0Y2gpOwotCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogY29weSBmcm9tIHNyYyBidWZmZXIgdG8gZHN0IGJ1ZmZlciAqLwotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDgoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMTIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDE2KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDI0KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjgoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICVbc3JjX3BpeGVsc19wZXJfbGluZV0gICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDMyKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMzYoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQwKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNDQoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQ4KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNTIoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDU2KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjAoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpCi0gICAgICAgICAgICAgICAgOiBbZHN0X3B0cl0gInIiIChkc3RfcHRyKSwgW3NyY19wdHJdICJyIiAoc3JjX3B0ciksCi0gICAgICAgICAgICAgICAgICBbc3JjX3BpeGVsc19wZXJfbGluZV0gInIiIChzcmNfcGl4ZWxzX3Blcl9saW5lKQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi12b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9taXBzCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKiBSRVNUUklDVCBzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgdW5zaWduZWQgY2hhciBGRGF0YVs5KjhdOyAgIC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCi0gICAgdW5zaWduZWQgaW50IHBvcywgaSwgVGVtcDEsIFRlbXAyOwotCi0gICAgcG9zID0gMTY7Ci0KLSAgICAvKiBiaXQgcG9zaXRvbiBmb3IgZXh0cmFjdCBmcm9tIGFjYyAqLwotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgIndyZHNwICAgICAgJVtwb3NdLCAgICAgMSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgOgotICAgICAgICA6IFtwb3NdICJyIiAocG9zKQotICAgICk7Ci0KLSAgICBpZiAoeW9mZnNldCkgewotCi0gICAgICAgIHNyY19wdHIgPSBzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKTsKLQotICAgICAgICBpZiAoeG9mZnNldCkKLSAgICAgICAgICAgIC8qIGZpbHRlciAxLUQgaG9yaXpvbnRhbGx5Li4uICovCi0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc184X2FsbChzcmNfcHRyLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIHhvZmZzZXQsIDgpOwotCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogcHJlZmV0Y2ggc3JjX3B0ciBkYXRhIHRvIGNhY2hlIG1lbW9yeSAqLwotICAgICAgICAgICAgcHJlZmV0Y2hfbG9hZChzcmNfcHRyICsgMipzcmNfcGl4ZWxzX3Blcl9saW5lKTsKLQotICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNCglW0ZEYXRhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDE2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDI0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMjgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDMyKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMzYoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQwKCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNDQoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDQ4KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNTIoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDU2KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjAoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImFkZHUgICAlW3NyY19wdHJdLCAlW3NyY19wdHJdLCAgICAlW3NyY19waXhlbHNfcGVyX2xpbmVdICAgXG5cdCIKLQotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMV0sICAgMCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInVsdyAgICAlW1RlbXAyXSwgICA0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDY0KCVbRkRhdGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNjgoJVtGRGF0YV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICA6IFtUZW1wMV0gIj0mciIgKFRlbXAxKSwgW1RlbXAyXSAiPSZyIiAoVGVtcDIpCi0gICAgICAgICAgICAgICAgOiBbRkRhdGFdICJyIiAoRkRhdGEpLCBbc3JjX3B0cl0gInIiIChzcmNfcHRyKSwKLSAgICAgICAgICAgICAgICAgIFtzcmNfcGl4ZWxzX3Blcl9saW5lXSAiciIgKHNyY19waXhlbHNfcGVyX2xpbmUpCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIC8qIGZpbHRlciB2ZXJ0aWNhbHkuLi4gKi8KLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX3NlY29uZF9wYXNzXzgoRkRhdGEgKyAxNiwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCA4LCB5b2Zmc2V0KTsKLSAgICB9Ci0KLSAgICAvKiBpZiAoeW9mZnNzZXQgPT0gMCkgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3Mgc2F2ZSBkYXRhIHRvIGRzdF9wdHIgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKHhvZmZzZXQpCi0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzc184X2FsbChzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgeG9mZnNldCwgZHN0X3BpdGNoKTsKLQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBzcmMgYnVmZmVyIHRvIGRzdCBidWZmZXIgKi8KLSAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDFdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMl0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICAwKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDQoJVtkc3RfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhZGR1ICAgJVtzcmNfcHRyXSwgJVtzcmNfcHRyXSwgICAgJVtzcmNfcGl4ZWxzX3Blcl9saW5lXSAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDFdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMl0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICA4KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDEyKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhZGR1ICAgJVtzcmNfcHRyXSwgJVtzcmNfcHRyXSwgICAgJVtzcmNfcGl4ZWxzX3Blcl9saW5lXSAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDFdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMl0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICAxNiglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDIwKCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhZGR1ICAgJVtzcmNfcHRyXSwgJVtzcmNfcHRyXSwgICAgJVtzcmNfcGl4ZWxzX3Blcl9saW5lXSAgIFxuXHQiCi0KLSAgICAgICAgICAgICAgICAidWx3ICAgICVbVGVtcDFdLCAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJ1bHcgICAgJVtUZW1wMl0sICAgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICAyNCglW2RzdF9wdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDI4KCVbZHN0X3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICAgICAgICAgOiBbVGVtcDFdICI9JnIiIChUZW1wMSksIFtUZW1wMl0gIj0mciIgKFRlbXAyKQotICAgICAgICAgICAgICAgIDogW2RzdF9wdHJdICJyIiAoZHN0X3B0ciksIFtzcmNfcHRyXSAiciIgKHNyY19wdHIpLAotICAgICAgICAgICAgICAgICAgW3NyY19waXhlbHNfcGVyX2xpbmVdICJyIiAoc3JjX3BpeGVsc19wZXJfbGluZSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9taXBzCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKiBSRVNUUklDVCBzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKiBSRVNUUklDVCBkc3RfcHRyLAotICAgIGludCAgZHN0X3BpdGNoCi0pCi17Ci0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKlZGaWx0ZXI7Ci0gICAgdW5zaWduZWQgY2hhciBGRGF0YVsyMSoxNl07ICAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLSAgICB1bnNpZ25lZCBpbnQgcG9zOwotCi0gICAgVkZpbHRlciA9IHN1Yl9wZWxfZmlsdGVyc3NbeW9mZnNldF07Ci0KLSAgICBwb3MgPSAxNjsKLQotICAgIC8qIGJpdCBwb3NpdG9uIGZvciBleHRyYWN0IGZyb20gYWNjICovCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAid3Jkc3AgICAgICAlW3Bvc10sICAgICAxICAgICAgICAgICBcblx0IgotICAgICAgICA6Ci0gICAgICAgIDogW3Bvc10gInIiIChwb3MpCi0gICAgKTsKLQotICAgIGlmICh5b2Zmc2V0KSB7Ci0KLSAgICAgICAgc3JjX3B0ciA9IHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpOwotCi0gICAgICAgIHN3aXRjaCAoeG9mZnNldCkgewotICAgICAgICAgICAgLyogZmlsdGVyIDEtRCBob3Jpem9udGFsbHkuLi4gKi8KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAvKiA2IHRhcCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzZ0YXAoc3JjX3B0ciwgRkRhdGEsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCB4b2Zmc2V0LCAxNik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgLyogb25seSBjb3B5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9maXJzdF9wYXNzMTZfMChzcmNfcHRyLCBGRGF0YSwgc3JjX3BpeGVsc19wZXJfbGluZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MxNl80dGFwKHNyY19wdHIsIEZEYXRhLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIsIGRzdF9waXRjaCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZmlsdGVyIHZlcnRpY2FseS4uLiAqLwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfc2Vjb25kX3Bhc3MxNjEoRkRhdGEgKyAzMiwgZHN0X3B0ciwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGlmICh5b2Zmc3NldCA9PSAwKSB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzcyBzYXZlIGRhdGEgdG8gZHN0X3B0ciAqLwotICAgICAgICBzd2l0Y2ggKHhvZmZzZXQpIHsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAvKiA2IHRhcCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfZmlyc3RfcGFzczE2XzZ0YXAoc3JjX3B0ciwgZHN0X3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIHhvZmZzZXQsIGRzdF9waXRjaCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgLyogNCB0YXAgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2ZpcnN0X3Bhc3MxNl80dGFwKHNyY19wdHIsIGRzdF9wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgeG9mZnNldCwgeW9mZnNldCwgZHN0X3B0ciwgZHN0X3BpdGNoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vbWlwcy9zdWJwaXhlbF9taXBzLmggYi92cDgvY29tbW9uL21pcHMvc3VicGl4ZWxfbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmYxZDNmLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbWlwcy9zdWJwaXhlbF9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSNpZm5kZWYgU1VCUElYRUxfTUlQU19ICi0jZGVmaW5lIFNVQlBJWEVMX01JUFNfSAotCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0OHg4X21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4NF9taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc2l4dGFwX3ByZWRpY3RfbWlwcyk7Ci1leHRlcm4gdm9pZCBkc3B1dGlsX3N0YXRpY19pbml0KHZvaWQpOwotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwMTZ4MTYKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXAxNngxNiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9taXBzCi0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA4eDgKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA4eDggdnA4X3NpeHRhcF9wcmVkaWN0OHg4X21pcHMKLQotI3VuZGVmICB2cDhfc3VicGl4X3NpeHRhcDh4NAotI2RlZmluZSB2cDhfc3VicGl4X3NpeHRhcDh4NCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbWlwcwotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwNHg0Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwNHg0IHZwOF9zaXh0YXBfcHJlZGljdF9taXBzCi0KLSNlbmRpZgotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9tb2RlY29udGV4dC5jIGIvdnA4L2NvbW1vbi9tb2RlY29udGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFhNTYxLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbW9kZWNvbnRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgImVudHJvcHltb2RlLmgiCi0KLWNvbnN0IHVuc2lnbmVkIGludCB2cDhfa2ZfZGVmYXVsdF9ibW9kZV9jb3VudHMgW1ZQOF9CSU5UUkFNT0RFU10gW1ZQOF9CSU5UUkFNT0RFU10gW1ZQOF9CSU5UUkFNT0RFU10gPQotewotICAgIHsKLSAgICAgICAgLypBYm92ZSBNb2RlIDogIDAqLwotICAgICAgICB7IDQzNDM4LCAgIDIxOTUsICAgIDQ3MCwgICAgMzE2LCAgICA2MTUsICAgIDE3MSwgICAgMjE3LCAgICA0MTIsICAgIDEyNCwgICAgMTYwLCB9LCAvKiBsZWZ0X21vZGUgMCAqLwotICAgICAgICB7ICA1NzIyLCAgIDI3NTEsICAgIDI5NiwgICAgMjkxLCAgICAgODEsICAgICA2OCwgICAgIDgwLCAgICAxMDEsICAgIDEwMCwgICAgMTcwLCB9LCAvKiBsZWZ0X21vZGUgMSAqLwotICAgICAgICB7ICAxNjI5LCAgICAyMDEsICAgIDMwNywgICAgIDI1LCAgICAgNDcsICAgICAxNiwgICAgIDM0LCAgICAgNzIsICAgICAxOSwgICAgIDI4LCB9LCAvKiBsZWZ0X21vZGUgMiAqLwotICAgICAgICB7ICAgMzMyLCAgICAyNjYsICAgICAzNiwgICAgNTAwLCAgICAgMjAsICAgICA2NSwgICAgIDIzLCAgICAgMTQsICAgIDE1NCwgICAgMTA2LCB9LCAvKiBsZWZ0X21vZGUgMyAqLwotICAgICAgICB7ICAgNDUwLCAgICAgOTcsICAgICAxMCwgICAgIDI0LCAgICAxMTcsICAgICAxMCwgICAgICAyLCAgICAgMTIsICAgICAgOCwgICAgIDcxLCB9LCAvKiBsZWZ0X21vZGUgNCAqLwotICAgICAgICB7ICAgMzg0LCAgICAgNDksICAgICAyOSwgICAgIDQ0LCAgICAgMTIsICAgIDE2MiwgICAgIDUxLCAgICAgIDUsICAgICA4NywgICAgIDQyLCB9LCAvKiBsZWZ0X21vZGUgNSAqLwotICAgICAgICB7ICAgNDk1LCAgICAgNTMsICAgIDE1NywgICAgIDI3LCAgICAgMTQsICAgICA1NywgICAgMTgwLCAgICAgMTcsICAgICAxNywgICAgIDM0LCB9LCAvKiBsZWZ0X21vZGUgNiAqLwotICAgICAgICB7ICAgNjk1LCAgICAgNjQsICAgICA2MiwgICAgICA5LCAgICAgMjcsICAgICAgNSwgICAgICAzLCAgICAxNDcsICAgICAxMCwgICAgIDI2LCB9LCAvKiBsZWZ0X21vZGUgNyAqLwotICAgICAgICB7ICAgMjMwLCAgICAgNTQsICAgICAyMCwgICAgMTI0LCAgICAgMTYsICAgIDEyNSwgICAgIDI5LCAgICAgMTIsICAgIDI4MywgICAgIDM3LCB9LCAvKiBsZWZ0X21vZGUgOCAqLwotICAgICAgICB7ICAgMjYwLCAgICAgODcsICAgICAyMSwgICAgMTIwLCAgICAgMzIsICAgICAxNiwgICAgIDMzLCAgICAgMTYsICAgICAzMywgICAgMjAzLCB9LCAvKiBsZWZ0X21vZGUgOSAqLwotICAgIH0sCi0gICAgewotICAgICAgICAvKkFib3ZlIE1vZGUgOiAgMSovCi0gICAgICAgIHsgIDM5MzQsICAgMjU3MywgICAgMzU1LCAgICAxMzcsICAgIDEyOCwgICAgIDg3LCAgICAxMzMsICAgIDExNywgICAgIDM3LCAgICAgMjcsIH0sIC8qIGxlZnRfbW9kZSAwICovCi0gICAgICAgIHsgIDEwMzYsICAgMTkyOSwgICAgMjc4LCAgICAxMzUsICAgICAyNywgICAgIDM3LCAgICAgNDgsICAgICA1NSwgICAgIDQxLCAgICAgOTEsIH0sIC8qIGxlZnRfbW9kZSAxICovCi0gICAgICAgIHsgICAyMjMsICAgIDI1NiwgICAgMjUzLCAgICAgMTUsICAgICAxMywgICAgICA5LCAgICAgMjgsICAgICA2NCwgICAgICAzLCAgICAgIDMsIH0sIC8qIGxlZnRfbW9kZSAyICovCi0gICAgICAgIHsgICAxMjAsICAgIDEyOSwgICAgIDE3LCAgICAzMTYsICAgICAxNSwgICAgIDExLCAgICAgIDksICAgICAgNCwgICAgIDUzLCAgICAgNzQsIH0sIC8qIGxlZnRfbW9kZSAzICovCi0gICAgICAgIHsgICAxMjksICAgICA1OCwgICAgICA2LCAgICAgMTEsICAgICAzOCwgICAgICAyLCAgICAgIDAsICAgICAgNSwgICAgICAyLCAgICAgNjcsIH0sIC8qIGxlZnRfbW9kZSA0ICovCi0gICAgICAgIHsgICAgNTMsICAgICAyMiwgICAgIDExLCAgICAgMTYsICAgICAgOCwgICAgIDI2LCAgICAgMTQsICAgICAgMywgICAgIDE5LCAgICAgMTIsIH0sIC8qIGxlZnRfbW9kZSA1ICovCi0gICAgICAgIHsgICAgNTksICAgICAyNiwgICAgIDYxLCAgICAgMTEsICAgICAgNCwgICAgICA5LCAgICAgMzUsICAgICAxMywgICAgICA4LCAgICAgIDgsIH0sIC8qIGxlZnRfbW9kZSA2ICovCi0gICAgICAgIHsgICAxMDEsICAgICA1MiwgICAgIDQwLCAgICAgIDgsICAgICAgNSwgICAgICAyLCAgICAgIDgsICAgICA1OSwgICAgICAyLCAgICAgMjAsIH0sIC8qIGxlZnRfbW9kZSA3ICovCi0gICAgICAgIHsgICAgNDgsICAgICAzNCwgICAgIDEwLCAgICAgNTIsICAgICAgOCwgICAgIDE1LCAgICAgIDYsICAgICAgNiwgICAgIDYzLCAgICAgMjAsIH0sIC8qIGxlZnRfbW9kZSA4ICovCi0gICAgICAgIHsgICAgOTYsICAgICA0OCwgICAgIDIyLCAgICAgNjMsICAgICAxMSwgICAgIDE0LCAgICAgIDUsICAgICAgOCwgICAgICA5LCAgICAgOTYsIH0sIC8qIGxlZnRfbW9kZSA5ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qQWJvdmUgTW9kZSA6ICAyKi8KLSAgICAgICAgeyAgIDcwOSwgICAgNDYxLCAgICA1MDYsICAgICAzNiwgICAgIDI3LCAgICAgMzMsICAgIDE1MSwgICAgIDk4LCAgICAgMjQsICAgICAgNiwgfSwgLyogbGVmdF9tb2RlIDAgKi8KLSAgICAgICAgeyAgIDIwMSwgICAgMzc1LCAgICA0NDIsICAgICAyNywgICAgIDEzLCAgICAgIDgsICAgICA0NiwgICAgIDU4LCAgICAgIDYsICAgICAxOSwgfSwgLyogbGVmdF9tb2RlIDEgKi8KLSAgICAgICAgeyAgIDEyMiwgICAgMTQwLCAgICA0MTcsICAgICAgNCwgICAgIDEzLCAgICAgIDMsICAgICAzMywgICAgIDU5LCAgICAgIDQsICAgICAgMiwgfSwgLyogbGVmdF9tb2RlIDIgKi8KLSAgICAgICAgeyAgICAzNiwgICAgIDE3LCAgICAgMjIsICAgICAxNiwgICAgICA2LCAgICAgIDgsICAgICAxMiwgICAgIDE3LCAgICAgIDksICAgICAyMSwgfSwgLyogbGVmdF9tb2RlIDMgKi8KLSAgICAgICAgeyAgICA1MSwgICAgIDE1LCAgICAgIDcsICAgICAgMSwgICAgIDE0LCAgICAgIDAsICAgICAgNCwgICAgICA1LCAgICAgIDMsICAgICAyMiwgfSwgLyogbGVmdF9tb2RlIDQgKi8KLSAgICAgICAgeyAgICAxOCwgICAgIDExLCAgICAgMzAsICAgICAgOSwgICAgICA3LCAgICAgMjAsICAgICAxMSwgICAgICA1LCAgICAgIDIsICAgICAgNiwgfSwgLyogbGVmdF9tb2RlIDUgKi8KLSAgICAgICAgeyAgICAzOCwgICAgIDIxLCAgICAxMDMsICAgICAgOSwgICAgICA0LCAgICAgMTIsICAgICA3OSwgICAgIDEzLCAgICAgIDIsICAgICAgNSwgfSwgLyogbGVmdF9tb2RlIDYgKi8KLSAgICAgICAgeyAgICA2NCwgICAgIDE3LCAgICAgNjYsICAgICAgMiwgICAgIDEyLCAgICAgIDQsICAgICAgMiwgICAgIDY1LCAgICAgIDQsICAgICAgNSwgfSwgLyogbGVmdF9tb2RlIDcgKi8KLSAgICAgICAgeyAgICAxNCwgICAgICA3LCAgICAgIDcsICAgICAxNiwgICAgICAzLCAgICAgMTEsICAgICAgNCwgICAgIDEzLCAgICAgMTUsICAgICAxNiwgfSwgLyogbGVmdF9tb2RlIDggKi8KLSAgICAgICAgeyAgICAzNiwgICAgICA4LCAgICAgMzIsICAgICAgOSwgICAgICA5LCAgICAgIDQsICAgICAxNCwgICAgICA3LCAgICAgIDYsICAgICAyNCwgfSwgLyogbGVmdF9tb2RlIDkgKi8KLSAgICB9LAotICAgIHsKLSAgICAgICAgLypBYm92ZSBNb2RlIDogIDMqLwotICAgICAgICB7ICAxMzQwLCAgICAxNzMsICAgICAzNiwgICAgMTE5LCAgICAgMzAsICAgICAxMCwgICAgIDEzLCAgICAgMTAsICAgICAyMCwgICAgIDI2LCB9LCAvKiBsZWZ0X21vZGUgMCAqLwotICAgICAgICB7ICAgMTU2LCAgICAyOTMsICAgICAyNiwgICAgMTA4LCAgICAgIDUsICAgICAxNiwgICAgICAyLCAgICAgIDQsICAgICAyMywgICAgIDMwLCB9LCAvKiBsZWZ0X21vZGUgMSAqLwotICAgICAgICB7ICAgIDYwLCAgICAgMzQsICAgICAxMywgICAgICA3LCAgICAgIDMsICAgICAgMywgICAgICAwLCAgICAgIDgsICAgICAgNCwgICAgICA1LCB9LCAvKiBsZWZ0X21vZGUgMiAqLwotICAgICAgICB7ICAgIDcyLCAgICAgNjQsICAgICAgMSwgICAgMjM1LCAgICAgIDMsICAgICAgOSwgICAgICAyLCAgICAgIDcsICAgICAyOCwgICAgIDM4LCB9LCAvKiBsZWZ0X21vZGUgMyAqLwotICAgICAgICB7ICAgIDI5LCAgICAgMTQsICAgICAgMSwgICAgICAzLCAgICAgIDUsICAgICAgMCwgICAgICAyLCAgICAgIDIsICAgICAgNSwgICAgIDEzLCB9LCAvKiBsZWZ0X21vZGUgNCAqLwotICAgICAgICB7ICAgIDIyLCAgICAgIDcsICAgICAgNCwgICAgIDExLCAgICAgIDIsICAgICAgNSwgICAgICAxLCAgICAgIDIsICAgICAgNiwgICAgICA0LCB9LCAvKiBsZWZ0X21vZGUgNSAqLwotICAgICAgICB7ICAgIDE4LCAgICAgMTQsICAgICAgNSwgICAgICA2LCAgICAgIDQsICAgICAgMywgICAgIDE0LCAgICAgIDAsICAgICAgOSwgICAgICAyLCB9LCAvKiBsZWZ0X21vZGUgNiAqLwotICAgICAgICB7ICAgIDQxLCAgICAgMTAsICAgICAgNywgICAgICAxLCAgICAgIDIsICAgICAgMCwgICAgICAwLCAgICAgMTAsICAgICAgMiwgICAgICAxLCB9LCAvKiBsZWZ0X21vZGUgNyAqLwotICAgICAgICB7ICAgIDIzLCAgICAgMTksICAgICAgMiwgICAgIDMzLCAgICAgIDEsICAgICAgNSwgICAgICAyLCAgICAgIDAsICAgICA1MSwgICAgICA4LCB9LCAvKiBsZWZ0X21vZGUgOCAqLwotICAgICAgICB7ICAgIDMzLCAgICAgMjYsICAgICAgNywgICAgIDUzLCAgICAgIDMsICAgICAgOSwgICAgICAzLCAgICAgIDMsICAgICAgOSwgICAgIDE5LCB9LCAvKiBsZWZ0X21vZGUgOSAqLwotICAgIH0sCi0gICAgewotICAgICAgICAvKkFib3ZlIE1vZGUgOiAgNCovCi0gICAgICAgIHsgICA0MTAsICAgIDE2NSwgICAgIDQzLCAgICAgMzEsICAgICA2NiwgICAgIDE1LCAgICAgMzAsICAgICA1NCwgICAgICA4LCAgICAgMTcsIH0sIC8qIGxlZnRfbW9kZSAwICovCi0gICAgICAgIHsgICAxMTUsICAgICA2NCwgICAgIDI3LCAgICAgMTgsICAgICAzMCwgICAgICA3LCAgICAgMTEsICAgICAxNSwgICAgICA0LCAgICAgMTksIH0sIC8qIGxlZnRfbW9kZSAxICovCi0gICAgICAgIHsgICAgMzEsICAgICAyMywgICAgIDI1LCAgICAgIDEsICAgICAgNywgICAgICAyLCAgICAgIDIsICAgICAxMCwgICAgICAwLCAgICAgIDUsIH0sIC8qIGxlZnRfbW9kZSAyICovCi0gICAgICAgIHsgICAgMTcsICAgICAgNCwgICAgICAxLCAgICAgIDYsICAgICAgOCwgICAgICAyLCAgICAgIDcsICAgICAgNSwgICAgICA1LCAgICAgMjEsIH0sIC8qIGxlZnRfbW9kZSAzICovCi0gICAgICAgIHsgICAxMjAsICAgICAxMiwgICAgICAxLCAgICAgIDIsICAgICA4MywgICAgICAzLCAgICAgIDAsICAgICAgNCwgICAgICAxLCAgICAgNDAsIH0sIC8qIGxlZnRfbW9kZSA0ICovCi0gICAgICAgIHsgICAgIDQsICAgICAgMywgICAgICAxLCAgICAgIDIsICAgICAgMSwgICAgICAyLCAgICAgIDUsICAgICAgMCwgICAgICAzLCAgICAgIDYsIH0sIC8qIGxlZnRfbW9kZSA1ICovCi0gICAgICAgIHsgICAgMTAsICAgICAgMiwgICAgIDEzLCAgICAgIDYsICAgICAgNiwgICAgICA2LCAgICAgIDgsICAgICAgMiwgICAgICA0LCAgICAgIDUsIH0sIC8qIGxlZnRfbW9kZSA2ICovCi0gICAgICAgIHsgICAgNTgsICAgICAxMCwgICAgICA1LCAgICAgIDEsICAgICAyOCwgICAgICAxLCAgICAgIDEsICAgICAzMywgICAgICAxLCAgICAgIDksIH0sIC8qIGxlZnRfbW9kZSA3ICovCi0gICAgICAgIHsgICAgIDgsICAgICAgMiwgICAgICAxLCAgICAgIDQsICAgICAgMiwgICAgICA1LCAgICAgIDEsICAgICAgMSwgICAgICAyLCAgICAgMTAsIH0sIC8qIGxlZnRfbW9kZSA4ICovCi0gICAgICAgIHsgICAgNzYsICAgICAgNywgICAgICA1LCAgICAgIDcsICAgICAxOCwgICAgICAyLCAgICAgIDIsICAgICAgMCwgICAgICA1LCAgICAgNDUsIH0sIC8qIGxlZnRfbW9kZSA5ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qQWJvdmUgTW9kZSA6ICA1Ki8KLSAgICAgICAgeyAgIDQ0NCwgICAgIDQ2LCAgICAgNDcsICAgICAyMCwgICAgIDE0LCAgICAxMTAsICAgICA2MCwgICAgIDE0LCAgICAgNjAsICAgICAgNywgfSwgLyogbGVmdF9tb2RlIDAgKi8KLSAgICAgICAgeyAgICA1OSwgICAgIDU3LCAgICAgMjUsICAgICAxOCwgICAgICAzLCAgICAgMTcsICAgICAyMSwgICAgICA2LCAgICAgMTQsICAgICAgNiwgfSwgLyogbGVmdF9tb2RlIDEgKi8KLSAgICAgICAgeyAgICAyNCwgICAgIDE3LCAgICAgMjAsICAgICAgNiwgICAgICA0LCAgICAgMTMsICAgICAgNywgICAgICAyLCAgICAgIDMsICAgICAgMiwgfSwgLyogbGVmdF9tb2RlIDIgKi8KLSAgICAgICAgeyAgICAxMywgICAgIDExLCAgICAgIDUsICAgICAxNCwgICAgICA0LCAgICAgIDksICAgICAgMiwgICAgICA0LCAgICAgMTUsICAgICAgNywgfSwgLyogbGVmdF9tb2RlIDMgKi8KLSAgICAgICAgeyAgICAgOCwgICAgICA1LCAgICAgIDIsICAgICAgMSwgICAgICA0LCAgICAgIDAsICAgICAgMSwgICAgICAxLCAgICAgIDIsICAgICAxMiwgfSwgLyogbGVmdF9tb2RlIDQgKi8KLSAgICAgICAgeyAgICAxOSwgICAgICA1LCAgICAgIDUsICAgICAgNywgICAgICA0LCAgICAgNDAsICAgICAgNiwgICAgICAzLCAgICAgMTAsICAgICAgNCwgfSwgLyogbGVmdF9tb2RlIDUgKi8KLSAgICAgICAgeyAgICAxNiwgICAgICA1LCAgICAgIDksICAgICAgMSwgICAgICAxLCAgICAgMTYsICAgICAyNiwgICAgICAyLCAgICAgMTAsICAgICAgNCwgfSwgLyogbGVmdF9tb2RlIDYgKi8KLSAgICAgICAgeyAgICAxMSwgICAgICA0LCAgICAgIDgsICAgICAgMSwgICAgICAxLCAgICAgIDQsICAgICAgNCwgICAgICA1LCAgICAgIDQsICAgICAgMSwgfSwgLyogbGVmdF9tb2RlIDcgKi8KLSAgICAgICAgeyAgICAxNSwgICAgICAxLCAgICAgIDMsICAgICAgNywgICAgICAzLCAgICAgMjEsICAgICAgNywgICAgICAxLCAgICAgMzQsICAgICAgNSwgfSwgLyogbGVmdF9tb2RlIDggKi8KLSAgICAgICAgeyAgICAxOCwgICAgICA1LCAgICAgIDEsICAgICAgMywgICAgICA0LCAgICAgIDMsICAgICAgNywgICAgICAxLCAgICAgIDIsICAgICAgOSwgfSwgLyogbGVmdF9tb2RlIDkgKi8KLSAgICB9LAotICAgIHsKLSAgICAgICAgLypBYm92ZSBNb2RlIDogIDYqLwotICAgICAgICB7ICAgNDc2LCAgICAxNDksICAgICA5NCwgICAgIDEzLCAgICAgMTQsICAgICA3NywgICAgMjkxLCAgICAgMjcsICAgICAyMywgICAgICAzLCB9LCAvKiBsZWZ0X21vZGUgMCAqLwotICAgICAgICB7ICAgIDc5LCAgICAgODMsICAgICA0MiwgICAgIDE0LCAgICAgIDIsICAgICAxMiwgICAgIDYzLCAgICAgIDIsICAgICAgNCwgICAgIDE0LCB9LCAvKiBsZWZ0X21vZGUgMSAqLwotICAgICAgICB7ICAgIDQzLCAgICAgMzYsICAgICA1NSwgICAgICAxLCAgICAgIDMsICAgICAgOCwgICAgIDQyLCAgICAgMTEsICAgICAgNSwgICAgICAxLCB9LCAvKiBsZWZ0X21vZGUgMiAqLwotICAgICAgICB7ICAgICA5LCAgICAgIDksICAgICAgNiwgICAgIDE2LCAgICAgIDEsICAgICAgNSwgICAgICA2LCAgICAgIDMsICAgICAxMSwgICAgIDEwLCB9LCAvKiBsZWZ0X21vZGUgMyAqLwotICAgICAgICB7ICAgIDEwLCAgICAgIDMsICAgICAgMSwgICAgICAzLCAgICAgMTAsICAgICAgMSwgICAgICAwLCAgICAgIDEsICAgICAgMSwgICAgICA0LCB9LCAvKiBsZWZ0X21vZGUgNCAqLwotICAgICAgICB7ICAgIDE0LCAgICAgIDYsICAgICAxNSwgICAgICA1LCAgICAgIDEsICAgICAyMCwgICAgIDI1LCAgICAgIDIsICAgICAgNSwgICAgICAwLCB9LCAvKiBsZWZ0X21vZGUgNSAqLwotICAgICAgICB7ICAgIDI4LCAgICAgIDcsICAgICA1MSwgICAgICAxLCAgICAgIDAsICAgICAgOCwgICAgMTI3LCAgICAgIDYsICAgICAgMiwgICAgICA1LCB9LCAvKiBsZWZ0X21vZGUgNiAqLwotICAgICAgICB7ICAgIDEzLCAgICAgIDMsICAgICAgMywgICAgICAyLCAgICAgIDMsICAgICAgMSwgICAgICAyLCAgICAgIDgsICAgICAgMSwgICAgICAyLCB9LCAvKiBsZWZ0X21vZGUgNyAqLwotICAgICAgICB7ICAgIDEwLCAgICAgIDMsICAgICAgMywgICAgICAzLCAgICAgIDMsICAgICAgOCwgICAgICAyLCAgICAgIDIsICAgICAgOSwgICAgICAzLCB9LCAvKiBsZWZ0X21vZGUgOCAqLwotICAgICAgICB7ICAgIDEzLCAgICAgIDcsICAgICAxMSwgICAgICA0LCAgICAgIDAsICAgICAgNCwgICAgICA2LCAgICAgIDIsICAgICAgNSwgICAgICA4LCB9LCAvKiBsZWZ0X21vZGUgOSAqLwotICAgIH0sCi0gICAgewotICAgICAgICAvKkFib3ZlIE1vZGUgOiAgNyovCi0gICAgICAgIHsgICAzNzYsICAgIDEzNSwgICAgMTE5LCAgICAgIDYsICAgICAzMiwgICAgICA4LCAgICAgMzEsICAgIDIyNCwgICAgICA5LCAgICAgIDMsIH0sIC8qIGxlZnRfbW9kZSAwICovCi0gICAgICAgIHsgICAgOTMsICAgICA2MCwgICAgIDU0LCAgICAgIDYsICAgICAxMywgICAgICA3LCAgICAgIDgsICAgICA5MiwgICAgICAyLCAgICAgMTIsIH0sIC8qIGxlZnRfbW9kZSAxICovCi0gICAgICAgIHsgICAgNzQsICAgICAzNiwgICAgIDg0LCAgICAgIDAsICAgICAgMywgICAgICAyLCAgICAgIDksICAgICA2NywgICAgICAyLCAgICAgIDEsIH0sIC8qIGxlZnRfbW9kZSAyICovCi0gICAgICAgIHsgICAgMTksICAgICAgNCwgICAgICA0LCAgICAgIDgsICAgICAgOCwgICAgICAyLCAgICAgIDQsICAgICAgNywgICAgICA2LCAgICAgMTYsIH0sIC8qIGxlZnRfbW9kZSAzICovCi0gICAgICAgIHsgICAgNTEsICAgICAgNywgICAgICA0LCAgICAgIDEsICAgICA3NywgICAgICAzLCAgICAgIDAsICAgICAxNCwgICAgICAxLCAgICAgMTUsIH0sIC8qIGxlZnRfbW9kZSA0ICovCi0gICAgICAgIHsgICAgIDcsICAgICAgNywgICAgICA1LCAgICAgIDcsICAgICAgNCwgICAgICA3LCAgICAgIDQsICAgICAgNSwgICAgICAwLCAgICAgIDMsIH0sIC8qIGxlZnRfbW9kZSA1ICovCi0gICAgICAgIHsgICAgMTgsICAgICAgMiwgICAgIDE5LCAgICAgIDIsICAgICAgMiwgICAgICA0LCAgICAgMTIsICAgICAxMSwgICAgICAxLCAgICAgIDIsIH0sIC8qIGxlZnRfbW9kZSA2ICovCi0gICAgICAgIHsgICAxMjksICAgICAgNiwgICAgIDI3LCAgICAgIDEsICAgICAyMSwgICAgICAzLCAgICAgIDAsICAgIDE4OSwgICAgICAwLCAgICAgIDYsIH0sIC8qIGxlZnRfbW9kZSA3ICovCi0gICAgICAgIHsgICAgIDksICAgICAgMSwgICAgICAyLCAgICAgIDgsICAgICAgMywgICAgICA3LCAgICAgIDAsICAgICAgNSwgICAgICAzLCAgICAgIDMsIH0sIC8qIGxlZnRfbW9kZSA4ICovCi0gICAgICAgIHsgICAgMjAsICAgICAgNCwgICAgICA1LCAgICAgMTAsICAgICAgNCwgICAgICAyLCAgICAgIDcsICAgICAxNywgICAgICAzLCAgICAgMTYsIH0sIC8qIGxlZnRfbW9kZSA5ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qQWJvdmUgTW9kZSA6ICA4Ki8KLSAgICAgICAgeyAgIDYxNywgICAgIDY4LCAgICAgMzQsICAgICA3OSwgICAgIDExLCAgICAgMjcsICAgICAyNSwgICAgIDE0LCAgICAgNzUsICAgICAxMywgfSwgLyogbGVmdF9tb2RlIDAgKi8KLSAgICAgICAgeyAgICA1MSwgICAgIDgyLCAgICAgMjEsICAgICAyNiwgICAgICA2LCAgICAgMTIsICAgICAxMywgICAgICAxLCAgICAgMjYsICAgICAxNiwgfSwgLyogbGVmdF9tb2RlIDEgKi8KLSAgICAgICAgeyAgICAyOSwgICAgICA5LCAgICAgMTIsICAgICAxMSwgICAgICAzLCAgICAgIDcsICAgICAgMSwgICAgIDEwLCAgICAgIDIsICAgICAgMiwgfSwgLyogbGVmdF9tb2RlIDIgKi8KLSAgICAgICAgeyAgICAxNywgICAgIDE5LCAgICAgMTEsICAgICA3NCwgICAgICA0LCAgICAgIDMsICAgICAgMiwgICAgICAwLCAgICAgNTgsICAgICAxMywgfSwgLyogbGVmdF9tb2RlIDMgKi8KLSAgICAgICAgeyAgICAxMCwgICAgICAxLCAgICAgIDEsICAgICAgMywgICAgICA0LCAgICAgIDEsICAgICAgMCwgICAgICAyLCAgICAgIDEsICAgICAgOCwgfSwgLyogbGVmdF9tb2RlIDQgKi8KLSAgICAgICAgeyAgICAxNCwgICAgICA0LCAgICAgIDUsICAgICAgNSwgICAgICAxLCAgICAgMTMsICAgICAgMiwgICAgICAwLCAgICAgMjcsICAgICAgOCwgfSwgLyogbGVmdF9tb2RlIDUgKi8KLSAgICAgICAgeyAgICAxMCwgICAgICAzLCAgICAgIDUsICAgICAgNCwgICAgICAxLCAgICAgIDcsICAgICAgNiwgICAgICA0LCAgICAgIDUsICAgICAgMSwgfSwgLyogbGVmdF9tb2RlIDYgKi8KLSAgICAgICAgeyAgICAxMCwgICAgICAyLCAgICAgIDYsICAgICAgMiwgICAgICAxLCAgICAgIDEsICAgICAgMSwgICAgICA0LCAgICAgIDIsICAgICAgMSwgfSwgLyogbGVmdF9tb2RlIDcgKi8KLSAgICAgICAgeyAgICAxNCwgICAgICA4LCAgICAgIDUsICAgICAyMywgICAgICAyLCAgICAgMTIsICAgICAgNiwgICAgICAyLCAgICAxMTcsICAgICAgNSwgfSwgLyogbGVmdF9tb2RlIDggKi8KLSAgICAgICAgeyAgICAgOSwgICAgICA2LCAgICAgIDIsICAgICAxOSwgICAgICAxLCAgICAgIDYsICAgICAgMywgICAgICAyLCAgICAgIDksICAgICAgOSwgfSwgLyogbGVmdF9tb2RlIDkgKi8KLSAgICB9LAotICAgIHsKLSAgICAgICAgLypBYm92ZSBNb2RlIDogIDkqLwotICAgICAgICB7ICAgNjgwLCAgICAgNzMsICAgICAyMiwgICAgIDM4LCAgICAgNDIsICAgICAgNSwgICAgIDExLCAgICAgIDksICAgICAgNiwgICAgIDI4LCB9LCAvKiBsZWZ0X21vZGUgMCAqLwotICAgICAgICB7ICAgMTEzLCAgICAxMTIsICAgICAyMSwgICAgIDIyLCAgICAgMTAsICAgICAgMiwgICAgICA4LCAgICAgIDQsICAgICAgNiwgICAgIDQyLCB9LCAvKiBsZWZ0X21vZGUgMSAqLwotICAgICAgICB7ICAgIDQ0LCAgICAgMjAsICAgICAyNCwgICAgICA2LCAgICAgIDUsICAgICAgNCwgICAgICAzLCAgICAgIDMsICAgICAgMSwgICAgICAyLCB9LCAvKiBsZWZ0X21vZGUgMiAqLwotICAgICAgICB7ICAgIDQwLCAgICAgMjMsICAgICAgNywgICAgIDcxLCAgICAgIDUsICAgICAgMiwgICAgICA0LCAgICAgIDEsICAgICAgNywgICAgIDIyLCB9LCAvKiBsZWZ0X21vZGUgMyAqLwotICAgICAgICB7ICAgIDg1LCAgICAgIDksICAgICAgNCwgICAgICA0LCAgICAgMTcsICAgICAgMiwgICAgICAwLCAgICAgIDMsICAgICAgMiwgICAgIDIzLCB9LCAvKiBsZWZ0X21vZGUgNCAqLwotICAgICAgICB7ICAgIDEzLCAgICAgIDQsICAgICAgMiwgICAgICA2LCAgICAgIDEsICAgICAgNywgICAgICAwLCAgICAgIDEsICAgICAgNywgICAgICA2LCB9LCAvKiBsZWZ0X21vZGUgNSAqLwotICAgICAgICB7ICAgIDI2LCAgICAgIDYsICAgICAgOCwgICAgICAzLCAgICAgIDIsICAgICAgMywgICAgICA4LCAgICAgIDEsICAgICAgNSwgICAgICA0LCB9LCAvKiBsZWZ0X21vZGUgNiAqLwotICAgICAgICB7ICAgIDU0LCAgICAgIDgsICAgICAgOSwgICAgICA2LCAgICAgIDcsICAgICAgMCwgICAgICAxLCAgICAgMTEsICAgICAgMSwgICAgICAzLCB9LCAvKiBsZWZ0X21vZGUgNyAqLwotICAgICAgICB7ICAgICA5LCAgICAgMTAsICAgICAgNCwgICAgIDEzLCAgICAgIDIsICAgICAgNSwgICAgICA0LCAgICAgIDIsICAgICAxNCwgICAgICA4LCB9LCAvKiBsZWZ0X21vZGUgOCAqLwotICAgICAgICB7ICAgIDkyLCAgICAgIDksICAgICAgNSwgICAgIDE5LCAgICAgMTUsICAgICAgMywgICAgICAzLCAgICAgIDEsICAgICAgNiwgICAgIDU4LCB9LCAvKiBsZWZ0X21vZGUgOSAqLwotICAgIH0sCi19OwpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9tdi5oIGIvdnA4L2NvbW1vbi9tdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2M5MWI5Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vbXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX01WX0gKLSNkZWZpbmUgX19JTkNfTVZfSAotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHNob3J0IHJvdzsKLSAgICBzaG9ydCBjb2w7Ci19IE1WOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vb255eC5oIGIvdnA4L2NvbW1vbi9vbnl4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmI4ZmMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9vbnl4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfVlA4X0gKLSNkZWZpbmUgX19JTkNfVlA4X0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgInR5cGVfYWxpYXNlcy5oIgotI2luY2x1ZGUgInBwZmxhZ3MuaCIKLSAgICB0eXBlZGVmIGludCAqVlA4X1BUUjsKLQotICAgIC8qIENyZWF0ZS9kZXN0cm95IHN0YXRpYyBkYXRhIHN0cnVjdHVyZXMuICovCi0KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIE5PUk1BTCAgICAgID0gMCwKLSAgICAgICAgRk9VUkZJVkUgICAgPSAxLAotICAgICAgICBUSFJFRUZJVkUgICA9IDIsCi0gICAgICAgIE9ORVRXTyAgICAgID0gMwotCi0gICAgfSBWUFhfU0NBTElORzsKLQotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgVlA4X0xBU1RfRkxBRyA9IDEsCi0gICAgICAgIFZQOF9HT0xEX0ZMQUcgPSAyLAotICAgICAgICBWUDhfQUxUX0ZMQUcgPSA0Ci0gICAgfSBWUDhfUkVGRlJBTUU7Ci0KLQotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSICAgID0gMHgwLAotICAgICAgICBVU0FHRV9MT0NBTF9GSUxFX1BMQVlCQUNLICAgPSAweDEsCi0gICAgICAgIFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkgICA9IDB4MgotICAgIH0gRU5EX1VTQUdFOwotCi0KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIE1PREVfUkVBTFRJTUUgICAgICAgPSAweDAsCi0gICAgICAgIE1PREVfR09PRFFVQUxJVFkgICAgPSAweDEsCi0gICAgICAgIE1PREVfQkVTVFFVQUxJVFkgICAgPSAweDIsCi0gICAgICAgIE1PREVfRklSU1RQQVNTICAgICAgPSAweDMsCi0gICAgICAgIE1PREVfU0VDT05EUEFTUyAgICAgPSAweDQsCi0gICAgICAgIE1PREVfU0VDT05EUEFTU19CRVNUID0gMHg1LAotICAgIH0gTU9ERTsKLQotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgRlJBTUVGTEFHU19LRVkgICAgPSAxLAotICAgICAgICBGUkFNRUZMQUdTX0dPTERFTiA9IDIsCi0gICAgICAgIEZSQU1FRkxBR1NfQUxUUkVGID0gNCwKLSAgICB9IEZSQU1FVFlQRV9GTEFHUzsKLQotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gICAgc3RhdGljIF9faW5saW5lIHZvaWQgU2NhbGUyUmF0aW8oaW50IG1vZGUsIGludCAqaHIsIGludCAqaHMpCi0gICAgewotICAgICAgICBzd2l0Y2ggKG1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAgICBOT1JNQUw6Ci0gICAgICAgICAgICAqaHIgPSAxOwotICAgICAgICAgICAgKmhzID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICAgIEZPVVJGSVZFOgotICAgICAgICAgICAgKmhyID0gNDsKLSAgICAgICAgICAgICpocyA9IDU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAgICBUSFJFRUZJVkU6Ci0gICAgICAgICAgICAqaHIgPSAzOwotICAgICAgICAgICAgKmhzID0gNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICAgIE9ORVRXTzoKLSAgICAgICAgICAgICpociA9IDE7Ci0gICAgICAgICAgICAqaHMgPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqaHIgPSAxOwotICAgICAgICAgICAgKmhzID0gMTsKLSAgICAgICAgICAgIGFzc2VydCgwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIGludCBWZXJzaW9uOyAgICAgICAgICAgIC8vIDQgdmVyc2lvbnMgb2YgYml0c3RyZWFtIGRlZmluZWQgMCBiZXN0IHF1YWxpdHkvc2xvd2VzdCBkZWNvZGUsIDMgbG93ZXN0IHF1YWxpdHkvZmFzdGVzdCBkZWNvZGUKLSAgICAgICAgaW50IFdpZHRoOyAgICAgICAgICAgICAgLy8gd2lkdGggb2YgZGF0YSBwYXNzZWQgdG8gdGhlIGNvbXByZXNzb3IKLSAgICAgICAgaW50IEhlaWdodDsgICAgICAgICAgICAgLy8gaGVpZ2h0IG9mIGRhdGEgcGFzc2VkIHRvIHRoZSBjb21wcmVzc29yCi0gICAgICAgIGRvdWJsZSBmcmFtZV9yYXRlOyAgICAgICAvLyBzZXQgdG8gcGFzc2VkIGluIGZyYW1lcmF0ZQotICAgICAgICBpbnQgdGFyZ2V0X2JhbmR3aWR0aDsgICAgLy8gYmFuZHdpZHRoIHRvIGJlIHVzZWQgaW4ga2lsb2JpdHMgcGVyIHNlY29uZAotCi0gICAgICAgIGludCBub2lzZV9zZW5zaXRpdml0eTsgICAvLyBwYXJhbWV0ZXIgdXNlZCBmb3IgYXBwbHlpbmcgcHJlIHByb2Nlc3NpbmcgYmx1cjogcmVjb21tZW5kYXRpb24gMAotICAgICAgICBpbnQgU2hhcnBuZXNzOyAgICAgICAgICAvLyBwYXJhbWV0ZXIgdXNlZCBmb3Igc2hhcnBlbmluZyBvdXRwdXQ6IHJlY29tbWVuZGF0aW9uIDA6Ci0gICAgICAgIGludCBjcHVfdXNlZDsKLQotICAgICAgICAvLyBtb2RlIC0+Ci0gICAgICAgIC8vKDApPVJlYWx0aW1lL0xpdmUgRW5jb2RpbmcuIFRoaXMgbW9kZSBpcyBvcHRpbWl6ZWQgZm9yIHJlYWx0aW0gZW5jb2RpbmcgKGZvciBleGFtcGxlLCBjYXB0dXJpbmcKLSAgICAgICAgLy8gICAgYSB0ZWxldmlzaW9uIHNpZ25hbCBvciBmZWVkIGZyb20gYSBsaXZlIGNhbWVyYSkuICggc3BlZWQgc2V0dGluZyBjb250cm9scyBob3cgZmFzdCApCi0gICAgICAgIC8vKDEpPUdvb2QgUXVhbGl0eSBGYXN0IEVuY29kaW5nLiBUaGUgZW5jb2RlciBiYWxhbmNlcyBxdWFsaXR5IHdpdGggdGhlIGFtb3VudCBvZiB0aW1lIGl0IHRha2VzIHRvCi0gICAgICAgIC8vICAgIGVuY29kZSB0aGUgb3V0cHV0LiAoIHNwZWVkIHNldHRpbmcgY29udHJvbHMgaG93IGZhc3QgKQotICAgICAgICAvLygyKT1PbmUgUGFzcyAtIEJlc3QgUXVhbGl0eS4gVGhlIGVuY29kZXIgcGxhY2VzIHByaW9yaXR5IG9uIHRoZSBxdWFsaXR5IG9mIHRoZSBvdXRwdXQgb3ZlciBlbmNvZGluZwotICAgICAgICAvLyAgICBzcGVlZC4gVGhlIG91dHB1dCBpcyBjb21wcmVzc2VkIGF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIHF1YWxpdHkuIFRoaXMgb3B0aW9uIHRha2VzIHRoZSBsb25nZXN0Ci0gICAgICAgIC8vICAgIGFtb3VudCBvZiB0aW1lIHRvIGVuY29kZS4gKCBzcGVlZCBzZXR0aW5nIGlnbm9yZWQgKQotICAgICAgICAvLygzKT1Ud28gUGFzcyAtIEZpcnN0IFBhc3MuIFRoZSBlbmNvZGVyIGdlbmVyYXRlcyBhIGZpbGUgb2Ygc3RhdGlzdGljcyBmb3IgdXNlIGluIHRoZSBzZWNvbmQgZW5jb2RpbmcKLSAgICAgICAgLy8gICAgcGFzcy4gKCBzcGVlZCBzZXR0aW5nIGNvbnRyb2xzIGhvdyBmYXN0ICkKLSAgICAgICAgLy8oNCk9VHdvIFBhc3MgLSBTZWNvbmQgUGFzcy4gVGhlIGVuY29kZXIgdXNlcyB0aGUgc3RhdGlzdGljcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGluIHRoZSBmaXJzdCBlbmNvZGluZwotICAgICAgICAvLyAgICBwYXNzIHRvIGNyZWF0ZSB0aGUgY29tcHJlc3NlZCBvdXRwdXQuICggc3BlZWQgc2V0dGluZyBjb250cm9scyBob3cgZmFzdCApCi0gICAgICAgIC8vKDUpPVR3byBQYXNzIC0gU2Vjb25kIFBhc3MgQmVzdC4gIFRoZSBlbmNvZGVyIHVzZXMgdGhlIHN0YXRpc3RpY3MgdGhhdCB3ZXJlIGdlbmVyYXRlZCBpbiB0aGUgZmlyc3QKLSAgICAgICAgLy8gICAgZW5jb2RpbmcgcGFzcyB0byBjcmVhdGUgdGhlIGNvbXByZXNzZWQgb3V0cHV0IHVzaW5nIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHF1YWxpdHksIGFuZCB0YWtpbmcgYQotICAgICAgICAvLyAgICBsb25nZXIgYW1vdW50IG9mIHRpbWUgdG8gZW5jb2RlLi4gKCBzcGVlZCBzZXR0aW5nIGlnbm9yZWQgKQotICAgICAgICBpbnQgTW9kZTsgICAgICAgICAgICAgICAvLwotCi0gICAgICAgIC8vIEtleSBGcmFtaW5nIE9wZXJhdGlvbnMKLSAgICAgICAgaW50IGF1dG9fa2V5OyAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGN1dCBzY2VuZXMgYW5kIHNldCB0aGUga2V5ZnJhbWVzCi0gICAgICAgIGludCBrZXlfZnJlcTsgICAgICAgICAgICAvLyBtYXhpbXVtIGRpc3RhbmNlIHRvIGtleSBmcmFtZS4KLQotICAgICAgICBpbnQgYWxsb3dfbGFnOyAgICAgICAgICAgLy8gYWxsb3cgbGFnZ2VkIGNvbXByZXNzaW9uIChpZiAwIGxhZ2luIGZyYW1lcyBpcyBpZ25vcmVkKQotICAgICAgICBpbnQgbGFnX2luX2ZyYW1lczsgICAgICAgIC8vIGhvdyBtYW55IGZyYW1lcyBsYWcgYmVmb3JlIHdlIHN0YXJ0IGVuY29kaW5nCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIERBVEFSQVRFIENPTlRST0wgT1BUSU9OUwotCi0gICAgICAgIGludCBlbmRfdXNhZ2U7IC8vIHZiciBvciBjYnIKLQotICAgICAgICAvLyBzaG9vdCB0byBrZWVwIGJ1ZmZlciBmdWxsIGF0IGFsbCB0aW1lcyBieSB1bmRlcnNob290aW5nIGEgYml0IDk1IHJlY29tbWVuZGVkCi0gICAgICAgIGludCB1bmRlcl9zaG9vdF9wY3Q7Ci0KLSAgICAgICAgLy8gYnVmZmVyaW5nIHBhcmFtZXRlcnMKLSAgICAgICAgaW50IHN0YXJ0aW5nX2J1ZmZlcl9sZXZlbDsgIC8vIGluIHNlY29uZHMKLSAgICAgICAgaW50IG9wdGltYWxfYnVmZmVyX2xldmVsOwotICAgICAgICBpbnQgbWF4aW11bV9idWZmZXJfc2l6ZTsKLQotICAgICAgICAvLyBjb250cm9sbGluZyBxdWFsaXR5Ci0gICAgICAgIGludCBmaXhlZF9xOwotICAgICAgICBpbnQgd29yc3RfYWxsb3dlZF9xOwotICAgICAgICBpbnQgYmVzdF9hbGxvd2VkX3E7Ci0gICAgICAgIGludCBjcV9sZXZlbDsKLQotICAgICAgICAvLyBhbGxvdyBpbnRlcm5hbCByZXNpemluZyAoIGN1cnJlbnRseSBkaXNhYmxlZCBpbiB0aGUgYnVpbGQgISEhISEpCi0gICAgICAgIGludCBhbGxvd19zcGF0aWFsX3Jlc2FtcGxpbmc7Ci0gICAgICAgIGludCByZXNhbXBsZV9kb3duX3dhdGVyX21hcms7Ci0gICAgICAgIGludCByZXNhbXBsZV91cF93YXRlcl9tYXJrOwotCi0gICAgICAgIC8vIGFsbG93IGludGVybmFsIGZyYW1lIHJhdGUgYWx0ZXJhdGlvbnMKLSAgICAgICAgaW50IGFsbG93X2RmOwotICAgICAgICBpbnQgZHJvcF9mcmFtZXNfd2F0ZXJfbWFyazsKLQotICAgICAgICAvLyB0d28gcGFzcyBkYXRhcmF0ZSBjb250cm9sCi0gICAgICAgIGludCB0d29fcGFzc192YnJiaWFzOyAgICAgICAgLy8gdHdvIHBhc3MgZGF0YXJhdGUgY29udHJvbCB0d2Vha3MKLSAgICAgICAgaW50IHR3b19wYXNzX3Zicm1pbl9zZWN0aW9uOwotICAgICAgICBpbnQgdHdvX3Bhc3NfdmJybWF4X3NlY3Rpb247Ci0gICAgICAgIC8vIEVORCBEQVRBUkFURSBDT05UUk9MIE9QVElPTlMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgICAgICAvLyB0aGVzZSBwYXJhbWV0ZXJzIGFyZW4ndCB0byBiZSB1c2VkIGluIGZpbmFsIGJ1aWxkIGRvbid0IHVzZSEhIQotICAgICAgICBpbnQgcGxheV9hbHRlcm5hdGU7Ci0gICAgICAgIGludCBhbHRfZnJlcTsKLSAgICAgICAgaW50IGFsdF9xOwotICAgICAgICBpbnQga2V5X3E7Ci0gICAgICAgIGludCBnb2xkX3E7Ci0KLQotICAgICAgICBpbnQgbXVsdGlfdGhyZWFkZWQ7ICAgLy8gaG93IG1hbnkgdGhyZWFkcyB0byBydW4gdGhlIGVuY29kZXIgb24KLSAgICAgICAgaW50IHRva2VuX3BhcnRpdGlvbnM7IC8vIGhvdyBtYW55IHRva2VuIHBhcnRpdGlvbnMgdG8gY3JlYXRlIGZvciBtdWx0aSBjb3JlIGRlY29kaW5nCi0gICAgICAgIGludCBlbmNvZGVfYnJlYWtvdXQ7ICAvLyBlYXJseSBicmVha291dCBlbmNvZGUgdGhyZXNob2xkIDogZm9yIHZpZGVvIGNvbmYgcmVjb21tZW5kIDgwMAotCi0gICAgICAgIGludCBlcnJvcl9yZXNpbGllbnRfbW9kZTsgIC8vIGlmIHJ1bm5pbmcgb3ZlciB1ZHAgbmV0d29ya3MgcHJvdmlkZXMgZGVjb2RhYmxlIGZyYW1lcyBhZnRlciBhCi0gICAgICAgIC8vIGRyb3BwZWQgcGFja2V0Ci0KLSAgICAgICAgaW50IGFybnJfbWF4X2ZyYW1lczsKLSAgICAgICAgaW50IGFybnJfc3RyZW5ndGggOwotICAgICAgICBpbnQgYXJucl90eXBlICAgICA7Ci0KLSAgICAgICAgc3RydWN0IHZweF9maXhlZF9idWYgICAgICAgICB0d29fcGFzc19zdGF0c19pbjsKLSAgICAgICAgc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAgKm91dHB1dF9wa3RfbGlzdDsKLQotICAgICAgICB2cDhlX3R1bmluZyB0dW5pbmc7Ci0gICAgfSBWUDhfQ09ORklHOwotCi0KLSAgICB2b2lkIHZwOF9pbml0aWFsaXplKCk7Ci0KLSAgICBWUDhfUFRSIHZwOF9jcmVhdGVfY29tcHJlc3NvcihWUDhfQ09ORklHICpveGNmKTsKLSAgICB2b2lkIHZwOF9yZW1vdmVfY29tcHJlc3NvcihWUDhfUFRSICpjb21wKTsKLQotICAgIHZvaWQgdnA4X2luaXRfY29uZmlnKFZQOF9QVFIgb255eCwgVlA4X0NPTkZJRyAqb3hjZik7Ci0gICAgdm9pZCB2cDhfY2hhbmdlX2NvbmZpZyhWUDhfUFRSIG9ueXgsIFZQOF9DT05GSUcgKm94Y2YpOwotCi0vLyByZWNlaXZlIGEgZnJhbWVzIHdvcnRoIG9mIGRhdGEgY2FsbGVyIGNhbiBhc3N1bWUgdGhhdCBhIGNvcHkgb2YgdGhpcyBmcmFtZSBpcyBtYWRlCi0vLyBhbmQgbm90IGp1c3QgYSBjb3B5IG9mIHRoZSBwb2ludGVyLi4KLSAgICBpbnQgdnA4X3JlY2VpdmVfcmF3X2ZyYW1lKFZQOF9QVFIgY29tcCwgdW5zaWduZWQgaW50IGZyYW1lX2ZsYWdzLCBZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBJTlQ2NCB0aW1lX3N0YW1wLCBJTlQ2NCBlbmRfdGltZV9zdGFtcCk7Ci0gICAgaW50IHZwOF9nZXRfY29tcHJlc3NlZF9kYXRhKFZQOF9QVFIgY29tcCwgdW5zaWduZWQgaW50ICpmcmFtZV9mbGFncywgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgY2hhciAqZGVzdCwgSU5UNjQgKnRpbWVfc3RhbXAsIElOVDY0ICp0aW1lX2VuZCwgaW50IGZsdXNoKTsKLSAgICBpbnQgdnA4X2dldF9wcmV2aWV3X3Jhd19mcmFtZShWUDhfUFRSIGNvbXAsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwgdnA4X3BwZmxhZ3NfdCAqZmxhZ3MpOwotCi0gICAgaW50IHZwOF91c2VfYXNfcmVmZXJlbmNlKFZQOF9QVFIgY29tcCwgaW50IHJlZl9mcmFtZV9mbGFncyk7Ci0gICAgaW50IHZwOF91cGRhdGVfcmVmZXJlbmNlKFZQOF9QVFIgY29tcCwgaW50IHJlZl9mcmFtZV9mbGFncyk7Ci0gICAgaW50IHZwOF9nZXRfcmVmZXJlbmNlKFZQOF9QVFIgY29tcCwgVlA4X1JFRkZSQU1FIHJlZl9mcmFtZV9mbGFnLCBZVjEyX0JVRkZFUl9DT05GSUcgKnNkKTsKLSAgICBpbnQgdnA4X3NldF9yZWZlcmVuY2UoVlA4X1BUUiBjb21wLCBWUDhfUkVGRlJBTUUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpOwotICAgIGludCB2cDhfdXBkYXRlX2VudHJvcHkoVlA4X1BUUiBjb21wLCBpbnQgdXBkYXRlKTsKLSAgICBpbnQgdnA4X3NldF9yb2ltYXAoVlA4X1BUUiBjb21wLCB1bnNpZ25lZCBjaGFyICptYXAsIHVuc2lnbmVkIGludCByb3dzLCB1bnNpZ25lZCBpbnQgY29scywgaW50IGRlbHRhX3FbNF0sIGludCBkZWx0YV9sZls0XSwgdW5zaWduZWQgaW50IHRocmVzaG9sZFs0XSk7Ci0gICAgaW50IHZwOF9zZXRfYWN0aXZlX21hcChWUDhfUFRSIGNvbXAsIHVuc2lnbmVkIGNoYXIgKm1hcCwgdW5zaWduZWQgaW50IHJvd3MsIHVuc2lnbmVkIGludCBjb2xzKTsKLSAgICBpbnQgdnA4X3NldF9pbnRlcm5hbF9zaXplKFZQOF9QVFIgY29tcCwgVlBYX1NDQUxJTkcgaG9yaXpfbW9kZSwgVlBYX1NDQUxJTkcgdmVydF9tb2RlKTsKLSAgICBpbnQgdnA4X2dldF9xdWFudGl6ZXIoVlA4X1BUUiBjKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL29ueXhjX2ludC5oIGIvdnA4L2NvbW1vbi9vbnl4Y19pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMjI3Ny4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL29ueXhjX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX1ZQOENfSU5UX0gKLSNkZWZpbmUgX19JTkNfVlA4Q19JTlRfSAotCi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgotI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsb29wZmlsdGVyLmgiCi0jaW5jbHVkZSAiZW50cm9weW12LmgiCi0jaW5jbHVkZSAiZW50cm9weS5oIgotI2luY2x1ZGUgImlkY3QuaCIKLSNpbmNsdWRlICJyZWNvbi5oIgotI2luY2x1ZGUgInBvc3Rwcm9jLmgiCi0KLS8qI2lmZGVmIFBBQ0tFVF9URVNUSU5HKi8KLSNpbmNsdWRlICJoZWFkZXIuaCIKLS8qI2VuZGlmKi8KLQotLyogQ3JlYXRlL2Rlc3Ryb3kgc3RhdGljIGRhdGEgc3RydWN0dXJlcy4gKi8KLQotdm9pZCB2cDhfaW5pdGlhbGl6ZV9jb21tb24odm9pZCk7Ci0KLSNkZWZpbmUgTUlOUSAwCi0jZGVmaW5lIE1BWFEgMTI3Ci0jZGVmaW5lIFFJTkRFWF9SQU5HRSAoTUFYUSArIDEpCi0KLSNkZWZpbmUgTlVNX1lWMTJfQlVGRkVSUyA0Ci0KLXR5cGVkZWYgc3RydWN0IGZyYW1lX2NvbnRleHRzCi17Ci0gICAgdnA4X3Byb2IgYm1vZGVfcHJvYiBbVlA4X0JJTlRSQU1PREVTLTFdOwotICAgIHZwOF9wcm9iIHltb2RlX3Byb2IgW1ZQOF9ZTU9ERVMtMV07ICAgLyogaW50ZXJmcmFtZSBpbnRyYSBtb2RlIHByb2JzICovCi0gICAgdnA4X3Byb2IgdXZfbW9kZV9wcm9iIFtWUDhfVVZfTU9ERVMtMV07Ci0gICAgdnA4X3Byb2Igc3ViX212X3JlZl9wcm9iIFtWUDhfU1VCTVZSRUZTLTFdOwotICAgIHZwOF9wcm9iIGNvZWZfcHJvYnMgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vucy0xXTsKLSAgICBNVl9DT05URVhUIG12Y1syXTsKLSAgICBNVl9DT05URVhUIHByZV9tdmNbMl07ICAvKiBub3QgdG8gY2FjdWxhdGUgdGhlIG12Y29zdCBmb3IgdGhlIGZyYW1lIGlmIG12YyBkb2Vzbid0IGNoYW5nZS4gKi8KLX0gRlJBTUVfQ09OVEVYVDsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgT05FX1BBUlRJVElPTiAgPSAwLAotICAgIFRXT19QQVJUSVRJT04gID0gMSwKLSAgICBGT1VSX1BBUlRJVElPTiA9IDIsCi0gICAgRUlHSFRfUEFSVElUSU9OID0gMwotfSBUT0tFTl9QQVJUSVRJT047Ci0KLXR5cGVkZWYgZW51bQotewotICAgIFJFQ09OX0NMQU1QX1JFUVVJUkVEICAgICAgICA9IDAsCi0gICAgUkVDT05fQ0xBTVBfTk9UUkVRVUlSRUQgICAgID0gMQotfSBDTEFNUF9UWVBFOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBTSVhUQVAgICA9IDAsCi0gICAgQklMSU5FQVIgPSAxCi19IElOVEVSUE9MQVRJT05GSUxURVJUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBWUDhfQ09NTU9OX1JUQ0QKLXsKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgdnA4X2lkY3RfcnRjZF92dGFibGVfdCAgICAgICAgaWRjdDsKLSAgICB2cDhfcmVjb25fcnRjZF92dGFibGVfdCAgICAgICByZWNvbjsKLSAgICB2cDhfc3VicGl4X3J0Y2RfdnRhYmxlX3QgICAgICBzdWJwaXg7Ci0gICAgdnA4X2xvb3BmaWx0ZXJfcnRjZF92dGFibGVfdCAgbG9vcGZpbHRlcjsKLSAgICB2cDhfcG9zdHByb2NfcnRjZF92dGFibGVfdCAgICBwb3N0cHJvYzsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLSNlbHNlCi0gICAgaW50IHVudXNlZDsKLSNlbmRpZgotfSBWUDhfQ09NTU9OX1JUQ0Q7Ci0KLXR5cGVkZWYgc3RydWN0IFZQOENvbW1vbgotewotICAgIHN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbyAgZXJyb3I7Ci0KLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMWRlcXVhbnRbUUlOREVYX1JBTkdFXVsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkyZGVxdWFudFtRSU5ERVhfUkFOR0VdWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgVVZkZXF1YW50W1FJTkRFWF9SQU5HRV1bMTZdKTsKLQotICAgIGludCBXaWR0aDsKLSAgICBpbnQgSGVpZ2h0OwotICAgIGludCBob3Jpel9zY2FsZTsKLSAgICBpbnQgdmVydF9zY2FsZTsKLQotICAgIFlVVl9UWVBFIGNscl90eXBlOwotICAgIENMQU1QX1RZUEUgIGNsYW1wX3R5cGU7Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmZyYW1lX3RvX3Nob3c7Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgeXYxMl9mYltOVU1fWVYxMl9CVUZGRVJTXTsKLSAgICBpbnQgZmJfaWR4X3JlZl9jbnRbTlVNX1lWMTJfQlVGRkVSU107Ci0gICAgaW50IG5ld19mYl9pZHgsIGxzdF9mYl9pZHgsIGdsZF9mYl9pZHgsIGFsdF9mYl9pZHg7Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgcG9zdF9wcm9jX2J1ZmZlcjsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgdGVtcF9zY2FsZV9mcmFtZTsKLQotICAgIEZSQU1FX1RZUEUgbGFzdF9mcmFtZV90eXBlOyAgLyogU2F2ZSBsYXN0IGZyYW1lJ3MgZnJhbWUgdHlwZSBmb3IgbG9vcGZpbHRlciBpbml0IGNoZWNraW5nIGFuZCBtb3Rpb24gc2VhcmNoLiAqLwotICAgIEZSQU1FX1RZUEUgZnJhbWVfdHlwZTsKLQotICAgIGludCBzaG93X2ZyYW1lOwotCi0gICAgaW50IGZyYW1lX2ZsYWdzOwotICAgIGludCBNQnM7Ci0gICAgaW50IG1iX3Jvd3M7Ci0gICAgaW50IG1iX2NvbHM7Ci0gICAgaW50IG1vZGVfaW5mb19zdHJpZGU7Ci0KLSAgICAvKiBwcm9maWxlIHNldHRpbmdzICovCi0gICAgaW50IG1iX25vX2NvZWZmX3NraXA7Ci0gICAgaW50IG5vX2xwZjsKLSAgICBpbnQgc2ltcGxlcl9scGY7Ci0gICAgaW50IHVzZV9iaWxpbmVhcl9tY19maWx0ZXI7Ci0gICAgaW50IGZ1bGxfcGl4ZWw7Ci0KLSAgICBpbnQgYmFzZV9xaW5kZXg7Ci0gICAgaW50IGxhc3Rfa2ZfZ2ZfcTsgIC8qIFEgdXNlZCBvbiB0aGUgbGFzdCBHRiBvciBLRiAqLwotCi0gICAgaW50IHkxZGNfZGVsdGFfcTsKLSAgICBpbnQgeTJkY19kZWx0YV9xOwotICAgIGludCB5MmFjX2RlbHRhX3E7Ci0gICAgaW50IHV2ZGNfZGVsdGFfcTsKLSAgICBpbnQgdXZhY19kZWx0YV9xOwotCi0gICAgdW5zaWduZWQgaW50IGZyYW1lc19zaW5jZV9nb2xkZW47Ci0gICAgdW5zaWduZWQgaW50IGZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWU7Ci0KLSAgICAvKiBXZSBhbGxvY2F0ZSBhIE1PREVfSU5GTyBzdHJ1Y3QgZm9yIGVhY2ggbWFjcm9ibG9jaywgdG9nZXRoZXIgd2l0aAotICAgICAgIGFuIGV4dHJhIHJvdyBvbiB0b3AgYW5kIGNvbHVtbiBvbiB0aGUgbGVmdCB0byBzaW1wbGlmeSBwcmVkaWN0aW9uLiAqLwotCi0gICAgTU9ERV9JTkZPICptaXA7IC8qIEJhc2Ugb2YgYWxsb2NhdGVkIGFycmF5ICovCi0gICAgTU9ERV9JTkZPICptaTsgIC8qIENvcnJlc3BvbmRzIHRvIHVwcGVyIGxlZnQgdmlzaWJsZSBtYWNyb2Jsb2NrICovCi0KLQotICAgIElOVEVSUE9MQVRJT05GSUxURVJUWVBFIG1jb21wX2ZpbHRlcl90eXBlOwotICAgIExPT1BGSUxURVJUWVBFIGxhc3RfZmlsdGVyX3R5cGU7Ci0gICAgTE9PUEZJTFRFUlRZUEUgZmlsdGVyX3R5cGU7Ci0gICAgbG9vcF9maWx0ZXJfaW5mbyBsZl9pbmZvW01BWF9MT09QX0ZJTFRFUisxXTsKLSAgICBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jaygoKmxmX21idikpOwotICAgIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKCgqbGZfbWJoKSk7Ci0gICAgcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2soKCpsZl9idikpOwotICAgIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKCgqbGZfYmgpKTsKLSAgICBpbnQgZmlsdGVyX2xldmVsOwotICAgIGludCBsYXN0X3NoYXJwbmVzc19sZXZlbDsKLSAgICBpbnQgc2hhcnBuZXNzX2xldmVsOwotCi0gICAgaW50IHJlZnJlc2hfbGFzdF9mcmFtZTsgICAgICAgLyogVHdvIHN0YXRlIDAgPSBOTywgMSA9IFlFUyAqLwotICAgIGludCByZWZyZXNoX2dvbGRlbl9mcmFtZTsgICAgIC8qIFR3byBzdGF0ZSAwID0gTk8sIDEgPSBZRVMgKi8KLSAgICBpbnQgcmVmcmVzaF9hbHRfcmVmX2ZyYW1lOyAgICAgLyogVHdvIHN0YXRlIDAgPSBOTywgMSA9IFlFUyAqLwotCi0gICAgaW50IGNvcHlfYnVmZmVyX3RvX2dmOyAgICAgICAgIC8qIDAgbm9uZSwgMSBMYXN0IHRvIEdGLCAyIEFSRiB0byBHRiAqLwotICAgIGludCBjb3B5X2J1ZmZlcl90b19hcmY7ICAgICAgICAvKiAwIG5vbmUsIDEgTGFzdCB0byBBUkYsIDIgR0YgdG8gQVJGICovCi0KLSAgICBpbnQgcmVmcmVzaF9lbnRyb3B5X3Byb2JzOyAgICAvKiBUd28gc3RhdGUgMCA9IE5PLCAxID0gWUVTICovCi0KLSAgICBpbnQgcmVmX2ZyYW1lX3NpZ25fYmlhc1tNQVhfUkVGX0ZSQU1FU107ICAgIC8qIFR3byBzdGF0ZSAwLCAxICovCi0KLSAgICAvKiBZLFUsVixZMiAqLwotICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgKmFib3ZlX2NvbnRleHQ7ICAgLyogcm93IG9mIGNvbnRleHQgZm9yIGVhY2ggcGxhbmUgKi8KLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIGxlZnRfY29udGV4dDsgIC8qICh1cCB0bykgNCBjb250ZXh0cyAiIiAqLwotCi0KLSAgICAvKiBrZXlmcmFtZSBibG9jayBtb2RlcyBhcmUgcHJlZGljdGVkIGJ5IHRoZWlyIGFib3ZlLCBsZWZ0IG5laWdoYm9ycyAqLwotCi0gICAgdnA4X3Byb2Iga2ZfYm1vZGVfcHJvYiBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTXSBbVlA4X0JJTlRSQU1PREVTLTFdOwotICAgIHZwOF9wcm9iIGtmX3ltb2RlX3Byb2IgW1ZQOF9ZTU9ERVMtMV07ICAvKiBrZXlmcmFtZSAiIiAqLwotICAgIHZwOF9wcm9iIGtmX3V2X21vZGVfcHJvYiBbVlA4X1VWX01PREVTLTFdOwotCi0KLSAgICBGUkFNRV9DT05URVhUIGxmYzsgLyogbGFzdCBmcmFtZSBlbnRyb3B5ICovCi0gICAgRlJBTUVfQ09OVEVYVCBmYzsgIC8qIHRoaXMgZnJhbWUgZW50cm9weSAqLwotCi0gICAgdW5zaWduZWQgaW50IGN1cnJlbnRfdmlkZW9fZnJhbWU7Ci0KLSAgICBpbnQgbmVhcl9ib2Zmc2V0WzNdOwotICAgIGludCB2ZXJzaW9uOwotCi0gICAgVE9LRU5fUEFSVElUSU9OIG11bHRpX3Rva2VuX3BhcnRpdGlvbjsKLQotI2lmZGVmIFBBQ0tFVF9URVNUSU5HCi0gICAgVlA4X0hFQURFUiBvaDsKLSNlbmRpZgotICAgIGRvdWJsZSBiaXRyYXRlOwotICAgIGRvdWJsZSBmcmFtZXJhdGU7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgVlA4X0NPTU1PTl9SVENEIHJ0Y2Q7Ci0jZW5kaWYKLSAgICBzdHJ1Y3QgcG9zdHByb2Nfc3RhdGUgIHBvc3Rwcm9jX3N0YXRlOwotfSBWUDhfQ09NTU9OOwotCi0KLWludCB2cDhfYWRqdXN0X21iX2xmX3ZhbHVlKE1BQ1JPQkxPQ0tEICptYmQsIGludCBmaWx0ZXJfbGV2ZWwpOwotdm9pZCB2cDhfaW5pdF9sb29wX2ZpbHRlcihWUDhfQ09NTU9OICpjbSk7Ci12b2lkIHZwOF9mcmFtZV9pbml0X2xvb3BfZmlsdGVyKGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IGZyYW1lX3R5cGUpOwotZXh0ZXJuIHZvaWQgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lKFZQOF9DT01NT04gKmNtLCAgICBNQUNST0JMT0NLRCAqbWJkLCAgaW50IGZpbHRfdmFsKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL29ueXhkLmggYi92cDgvY29tbW9uL29ueXhkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1M2JjMzEuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9vbnl4ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfVlA4RF9ICi0jZGVmaW5lIF9fSU5DX1ZQOERfSAotCi0KLS8qIENyZWF0ZS9kZXN0cm95IHN0YXRpYyBkYXRhIHN0cnVjdHVyZXMuICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotI2luY2x1ZGUgInR5cGVfYWxpYXNlcy5oIgotI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCi0jaW5jbHVkZSAicHBmbGFncy5oIgotI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKLQotICAgIHR5cGVkZWYgdm9pZCAgICpWUDhEX1BUUjsKLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgaW50ICAgICBXaWR0aDsKLSAgICAgICAgaW50ICAgICBIZWlnaHQ7Ci0gICAgICAgIGludCAgICAgVmVyc2lvbjsKLSAgICAgICAgaW50ICAgICBwb3N0cHJvY2VzczsKLSAgICAgICAgaW50ICAgICBtYXhfdGhyZWFkczsKLSAgICB9IFZQOERfQ09ORklHOwotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgVlA4X0xBU1RfRkxBRyA9IDEsCi0gICAgICAgIFZQOF9HT0xEX0ZMQUcgPSAyLAotICAgICAgICBWUDhfQUxUX0ZMQUcgPSA0Ci0gICAgfSBWUDhfUkVGRlJBTUU7Ci0KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIFZQOERfT0sgPSAwCi0gICAgfSBWUDhEX1NFVFRJTkc7Ci0KLSAgICB2b2lkIHZwOGR4X2luaXRpYWxpemUodm9pZCk7Ci0KLSAgICB2b2lkIHZwOGR4X3NldF9zZXR0aW5nKFZQOERfUFRSIGNvbXAsIFZQOERfU0VUVElORyBveHN0LCBpbnQgeCk7Ci0KLSAgICBpbnQgdnA4ZHhfZ2V0X3NldHRpbmcoVlA4RF9QVFIgY29tcCwgVlA4RF9TRVRUSU5HIG94c3QpOwotCi0gICAgaW50IHZwOGR4X3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKFZQOERfUFRSIGNvbXAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCwgSU5UNjQgdGltZV9zdGFtcCk7Ci0gICAgaW50IHZwOGR4X2dldF9yYXdfZnJhbWUoVlA4RF9QVFIgY29tcCwgWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgSU5UNjQgKnRpbWVfc3RhbXAsIElOVDY0ICp0aW1lX2VuZF9zdGFtcCwgdnA4X3BwZmxhZ3NfdCAqZmxhZ3MpOwotCi0gICAgaW50IHZwOGR4X2dldF9yZWZlcmVuY2UoVlA4RF9QVFIgY29tcCwgVlA4X1JFRkZSQU1FIHJlZl9mcmFtZV9mbGFnLCBZVjEyX0JVRkZFUl9DT05GSUcgKnNkKTsKLSAgICBpbnQgdnA4ZHhfc2V0X3JlZmVyZW5jZShWUDhEX1BUUiBjb21wLCBWUDhfUkVGRlJBTUUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpOwotCi0gICAgVlA4RF9QVFIgdnA4ZHhfY3JlYXRlX2RlY29tcHJlc3NvcihWUDhEX0NPTkZJRyAqb3hjZik7Ci0KLSAgICB2b2lkIHZwOGR4X3JlbW92ZV9kZWNvbXByZXNzb3IoVlA4RF9QVFIgY29tcCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3Bvc3Rwcm9jLmMgYi92cDgvY29tbW9uL3Bvc3Rwcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmM3ZDYuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9wb3N0cHJvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgInBvc3Rwcm9jLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJleHRlbmQuaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKLSNpbmNsdWRlICJzeXN0ZW1kZXBlbmRlbnQuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIFJHQl9UT19ZVVYodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoICgwLjI1NyooZmxvYXQpKHQ+PjE2KSkgKyAoMC41MDQqKGZsb2F0KSh0Pj44JjB4ZmYpKSArICgwLjA5OCooZmxvYXQpKHQmMHhmZikpICsgMTYpLCAgXAotICAgICgtKDAuMTQ4KihmbG9hdCkodD4+MTYpKSAtICgwLjI5MSooZmxvYXQpKHQ+PjgmMHhmZikpICsgKDAuNDM5KihmbG9hdCkodCYweGZmKSkgKyAxMjgpLCBcCi0gICAgKCAoMC40MzkqKGZsb2F0KSh0Pj4xNikpIC0gKDAuMzY4KihmbG9hdCkodD4+OCYweGZmKSkgLSAoMC4wNzEqKGZsb2F0KSh0JjB4ZmYpKSArIDEyOCkKLQotLyogZ2xvYmFsIGNvbnN0YW50cyAqLwotI2lmIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNQl9QUkVESUNUSU9OX01PREVfY29sb3JzW01CX01PREVfQ09VTlRdWzNdID0KLXsKLSAgICB7IFJHQl9UT19ZVVYoMHg5OEZCOTgpIH0sICAgLyogUGFsZUdyZWVuICovCi0gICAgeyBSR0JfVE9fWVVWKDB4MDBGRjAwKSB9LCAgIC8qIEdyZWVuICovCi0gICAgeyBSR0JfVE9fWVVWKDB4QURGRjJGKSB9LCAgIC8qIEdyZWVuWWVsbG93ICovCi0gICAgeyBSR0JfVE9fWVVWKDB4MjI4QjIyKSB9LCAgIC8qIEZvcmVzdEdyZWVuICovCi0gICAgeyBSR0JfVE9fWVVWKDB4MDA2NDAwKSB9LCAgIC8qIERhcmtHcmVlbiAqLwotICAgIHsgUkdCX1RPX1lVVigweDk4RjVGRikgfSwgICAvKiBDYWRldCBCbHVlICovCi0gICAgeyBSR0JfVE9fWVVWKDB4NkNBNkNEKSB9LCAgIC8qIFNreSBCbHVlICovCi0gICAgeyBSR0JfVE9fWVVWKDB4MDAwMDhCKSB9LCAgIC8qIERhcmsgYmx1ZSAqLwotICAgIHsgUkdCX1RPX1lVVigweDU1MUE4QikgfSwgICAvKiBQdXJwbGUgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHhGRjAwMDApIH0gICAgLyogUmVkICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBCX1BSRURJQ1RJT05fTU9ERV9jb2xvcnNbQl9NT0RFX0NPVU5UXVszXSA9Ci17Ci0gICAgeyBSR0JfVE9fWVVWKDB4NjYzM2ZmKSB9LCAgIC8qIFB1cnBsZSAqLwotICAgIHsgUkdCX1RPX1lVVigweGNjMzNmZikgfSwgICAvKiBNYWdlbnRhICovCi0gICAgeyBSR0JfVE9fWVVWKDB4ZmYzM2NjKSB9LCAgIC8qIFBpbmsgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHhmZjMzNjYpIH0sICAgLyogQ29yYWwgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHgzMzY2ZmYpIH0sICAgLyogQmx1ZSAqLwotICAgIHsgUkdCX1RPX1lVVigweGVkMDBmNSkgfSwgICAvKiBEYXJrIEJsdWUgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHgyZTAwYjgpIH0sICAgLyogRGFyayBQdXJwbGUgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHhmZjY2MzMpIH0sICAgLyogT3JhbmdlICovCi0gICAgeyBSR0JfVE9fWVVWKDB4MzNjY2ZmKSB9LCAgIC8qIExpZ2h0IEJsdWUgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHg4YWI4MDApIH0sICAgLyogR3JlZW4gKi8KLSAgICB7IFJHQl9UT19ZVVYoMHhmZmNjMzMpIH0sICAgLyogTGlnaHQgT3JhbmdlICovCi0gICAgeyBSR0JfVE9fWVVWKDB4MzNmZmNjKSB9LCAgIC8qIEFxdWEgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHg2NmZmMzMpIH0sICAgLyogTGlnaHQgR3JlZW4gKi8KLSAgICB7IFJHQl9UT19ZVVYoMHhjY2ZmMzMpIH0sICAgLyogWWVsbG93ICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNVl9SRUZFUkVOQ0VfRlJBTUVfY29sb3JzW01BWF9SRUZfRlJBTUVTXVszXSA9Ci17Ci0gICAgeyBSR0JfVE9fWVVWKDB4MDBmZjAwKSB9LCAgIC8qIEJsdWUgKi8KLSAgICB7IFJHQl9UT19ZVVYoMHgwMDAwZmYpIH0sICAgLyogR3JlZW4gKi8KLSAgICB7IFJHQl9UT19ZVVYoMHhmZmZmMDApIH0sICAgLyogWWVsbG93ICovCi0gICAgeyBSR0JfVE9fWVVWKDB4ZmYwMDAwKSB9LCAgIC8qIFJlZCAqLwotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc2hvcnQga2VybmVsNVtdID0KLXsKLSAgICAxLCAxLCA0LCAxLCAxCi19OwotCi1jb25zdCBzaG9ydCB2cDhfcnZbXSA9Ci17Ci0gICAgOCwgNSwgMiwgMiwgOCwgMTIsIDQsIDksIDgsIDMsCi0gICAgMCwgMywgOSwgMCwgMCwgMCwgOCwgMywgMTQsIDQsCi0gICAgMTAsIDEsIDExLCAxNCwgMSwgMTQsIDksIDYsIDEyLCAxMSwKLSAgICA4LCA2LCAxMCwgMCwgMCwgOCwgOSwgMCwgMywgMTQsCi0gICAgOCwgMTEsIDEzLCA0LCAyLCA5LCAwLCAzLCA5LCA2LAotICAgIDEsIDIsIDMsIDE0LCAxMywgMSwgOCwgMiwgOSwgNywKLSAgICAzLCAzLCAxLCAxMywgMTMsIDYsIDYsIDUsIDIsIDcsCi0gICAgMTEsIDksIDExLCA4LCA3LCAzLCAyLCAwLCAxMywgMTMsCi0gICAgMTQsIDQsIDEyLCA1LCAxMiwgMTAsIDgsIDEwLCAxMywgMTAsCi0gICAgNCwgMTQsIDQsIDEwLCAwLCA4LCAxMSwgMSwgMTMsIDcsCi0gICAgNywgMTQsIDYsIDE0LCAxMywgMiwgMTMsIDUsIDQsIDQsCi0gICAgMCwgMTAsIDAsIDUsIDEzLCAyLCAxMiwgNywgMTEsIDEzLAotICAgIDgsIDAsIDQsIDEwLCA3LCAyLCA3LCAyLCAyLCA1LAotICAgIDMsIDQsIDcsIDMsIDMsIDE0LCAxNCwgNSwgOSwgMTMsCi0gICAgMywgMTQsIDMsIDYsIDMsIDAsIDExLCA4LCAxMywgMSwKLSAgICAxMywgMSwgMTIsIDAsIDEwLCA5LCA3LCA2LCAyLCA4LAotICAgIDUsIDIsIDEzLCA3LCAxLCAxMywgMTQsIDcsIDYsIDcsCi0gICAgOSwgNiwgMTAsIDExLCA3LCA4LCA3LCA1LCAxNCwgOCwKLSAgICA0LCA0LCAwLCA4LCA3LCAxMCwgMCwgOCwgMTQsIDExLAotICAgIDMsIDEyLCA1LCA3LCAxNCwgMywgMTQsIDUsIDIsIDYsCi0gICAgMTEsIDEyLCAxMiwgOCwgMCwgMTEsIDEzLCAxLCAyLCAwLAotICAgIDUsIDEwLCAxNCwgNywgOCwgMCwgNCwgMTEsIDAsIDgsCi0gICAgMCwgMywgMTAsIDUsIDgsIDAsIDExLCA2LCA3LCA4LAotICAgIDEwLCA3LCAxMywgOSwgMiwgNSwgMSwgNSwgMTAsIDIsCi0gICAgNCwgMywgNSwgNiwgMTAsIDgsIDksIDQsIDExLCAxNCwKLSAgICAwLCAxMCwgMCwgNSwgMTMsIDIsIDEyLCA3LCAxMSwgMTMsCi0gICAgOCwgMCwgNCwgMTAsIDcsIDIsIDcsIDIsIDIsIDUsCi0gICAgMywgNCwgNywgMywgMywgMTQsIDE0LCA1LCA5LCAxMywKLSAgICAzLCAxNCwgMywgNiwgMywgMCwgMTEsIDgsIDEzLCAxLAotICAgIDEzLCAxLCAxMiwgMCwgMTAsIDksIDcsIDYsIDIsIDgsCi0gICAgNSwgMiwgMTMsIDcsIDEsIDEzLCAxNCwgNywgNiwgNywKLSAgICA5LCA2LCAxMCwgMTEsIDcsIDgsIDcsIDUsIDE0LCA4LAotICAgIDQsIDQsIDAsIDgsIDcsIDEwLCAwLCA4LCAxNCwgMTEsCi0gICAgMywgMTIsIDUsIDcsIDE0LCAzLCAxNCwgNSwgMiwgNiwKLSAgICAxMSwgMTIsIDEyLCA4LCAwLCAxMSwgMTMsIDEsIDIsIDAsCi0gICAgNSwgMTAsIDE0LCA3LCA4LCAwLCA0LCAxMSwgMCwgOCwKLSAgICAwLCAzLCAxMCwgNSwgOCwgMCwgMTEsIDYsIDcsIDgsCi0gICAgMTAsIDcsIDEzLCA5LCAyLCA1LCAxLCA1LCAxMCwgMiwKLSAgICA0LCAzLCA1LCA2LCAxMCwgOCwgOSwgNCwgMTEsIDE0LAotICAgIDMsIDgsIDMsIDcsIDgsIDUsIDExLCA0LCAxMiwgMywKLSAgICAxMSwgOSwgMTQsIDgsIDE0LCAxMywgNCwgMywgMSwgMiwKLSAgICAxNCwgNiwgNSwgNCwgNCwgMTEsIDQsIDYsIDIsIDEsCi0gICAgNSwgOCwgOCwgMTIsIDEzLCA1LCAxNCwgMTAsIDEyLCAxMywKLSAgICAwLCA5LCA1LCA1LCAxMSwgMTAsIDEzLCA5LCAxMCwgMTMsCi19OwotCi0KLWV4dGVybiB2b2lkIHZwOF9ibGl0X3RleHQoY29uc3QgY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICphZGRyZXNzLCBjb25zdCBpbnQgcGl0Y2gpOwotZXh0ZXJuIHZvaWQgdnA4X2JsaXRfbGluZShpbnQgeDAsIGludCB4MSwgaW50IHkwLCBpbnQgeTEsIHVuc2lnbmVkIGNoYXIgKmltYWdlLCBjb25zdCBpbnQgcGl0Y2gpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgcm93cywKLSAgICBpbnQgY29scywKLSAgICBpbnQgZmxpbWl0Ci0pCi17Ci0gICAgdW5zaWduZWQgY2hhciAqcF9zcmMsICpwX2RzdDsKLSAgICBpbnQgcm93OwotICAgIGludCBjb2w7Ci0gICAgaW50IGk7Ci0gICAgaW50IHY7Ci0gICAgaW50IHBpdGNoID0gc3JjX3BpeGVsc19wZXJfbGluZTsKLSAgICB1bnNpZ25lZCBjaGFyIGRbOF07Ci0gICAgKHZvaWQpZHN0X3BpeGVsc19wZXJfbGluZTsKLQotICAgIGZvciAocm93ID0gMDsgcm93IDwgcm93czsgcm93KyspCi0gICAgewotICAgICAgICAvKiBwb3N0X3Byb2NfZG93biBmb3Igb25lIHJvdyAqLwotICAgICAgICBwX3NyYyA9IHNyY19wdHI7Ci0gICAgICAgIHBfZHN0ID0gZHN0X3B0cjsKLQotICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGludCBrZXJuZWwgPSA0OwotICAgICAgICAgICAgaW50IHYgPSBwX3NyY1tjb2xdOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAtMjsgaSA8PSAyOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFicyh2IC0gcF9zcmNbY29sK2kqcGl0Y2hdKSA+IGZsaW1pdCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBkb3duX3NraXBfY29udm9sdmU7Ci0KLSAgICAgICAgICAgICAgICBrZXJuZWwgKz0ga2VybmVsNVsyK2ldICogcF9zcmNbY29sK2kqcGl0Y2hdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2ID0gKGtlcm5lbCA+PiAzKTsKLSAgICAgICAgZG93bl9za2lwX2NvbnZvbHZlOgotICAgICAgICAgICAgcF9kc3RbY29sXSA9IHY7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgcG9zdF9wcm9jX2Fjcm9zcyAqLwotICAgICAgICBwX3NyYyA9IGRzdF9wdHI7Ci0gICAgICAgIHBfZHN0ID0gZHN0X3B0cjsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgZFtpXSA9IHBfc3JjW2ldOwotCi0gICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgY29sczsgY29sKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBrZXJuZWwgPSA0OwotICAgICAgICAgICAgdiA9IHBfc3JjW2NvbF07Ci0KLSAgICAgICAgICAgIGRbY29sJjddID0gdjsKLQotICAgICAgICAgICAgZm9yIChpID0gLTI7IGkgPD0gMjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhYnModiAtIHBfc3JjW2NvbCtpXSkgPiBmbGltaXQpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gYWNyb3NzX3NraXBfY29udm9sdmU7Ci0KLSAgICAgICAgICAgICAgICBrZXJuZWwgKz0ga2VybmVsNVsyK2ldICogcF9zcmNbY29sK2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkW2NvbCY3XSA9IChrZXJuZWwgPj4gMyk7Ci0gICAgICAgIGFjcm9zc19za2lwX2NvbnZvbHZlOgotCi0gICAgICAgICAgICBpZiAoY29sID49IDIpCi0gICAgICAgICAgICAgICAgcF9kc3RbY29sLTJdID0gZFsoY29sLTIpJjddOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaGFuZGxlIHRoZSBsYXN0IHR3byBwaXhlbHMgKi8KLSAgICAgICAgcF9kc3RbY29sLTJdID0gZFsoY29sLTIpJjddOwotICAgICAgICBwX2RzdFtjb2wtMV0gPSBkWyhjb2wtMSkmN107Ci0KLQotICAgICAgICAvKiBuZXh0IHJvdyAqLwotICAgICAgICBzcmNfcHRyICs9IHBpdGNoOwotICAgICAgICBkc3RfcHRyICs9IHBpdGNoOwotICAgIH0KLX0KLQotc3RhdGljIGludCBxMm1ibChpbnQgeCkKLXsKLSAgICBpZiAoeCA8IDIwKSB4ID0gMjA7Ci0KLSAgICB4ID0gNTAgKyAoeCAtIDUwKSAqIDEwIC8gODsKLSAgICByZXR1cm4geCAqIHggLyAzOwotfQotdm9pZCB2cDhfbWJwb3N0X3Byb2NfYWNyb3NzX2lwX2ModW5zaWduZWQgY2hhciAqc3JjLCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scywgaW50IGZsaW1pdCkKLXsKLSAgICBpbnQgciwgYywgaTsKLQotICAgIHVuc2lnbmVkIGNoYXIgKnMgPSBzcmM7Ci0gICAgdW5zaWduZWQgY2hhciBkWzE2XTsKLQotCi0gICAgZm9yIChyID0gMDsgciA8IHJvd3M7IHIrKykKLSAgICB7Ci0gICAgICAgIGludCBzdW1zcSA9IDA7Ci0gICAgICAgIGludCBzdW0gICA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gLTg7IGkgPD0gNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdW1zcSArPSBzW2ldICogc1tpXTsKLSAgICAgICAgICAgIHN1bSAgICs9IHNbaV07Ci0gICAgICAgICAgICBkW2krOF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvbHMgKyA4OyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB4ID0gc1tjKzddIC0gc1tjLThdOwotICAgICAgICAgICAgaW50IHkgPSBzW2MrN10gKyBzW2MtOF07Ci0KLSAgICAgICAgICAgIHN1bSAgKz0geDsKLSAgICAgICAgICAgIHN1bXNxICs9IHggKiB5OwotCi0gICAgICAgICAgICBkW2MmMTVdID0gc1tjXTsKLQotICAgICAgICAgICAgaWYgKHN1bXNxICogMTUgLSBzdW0gKiBzdW0gPCBmbGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZFtjJjE1XSA9ICg4ICsgc3VtICsgc1tjXSkgPj4gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc1tjLThdID0gZFsoYy04KSYxNV07Ci0gICAgICAgIH0KLQotICAgICAgICBzICs9IHBpdGNoOwotICAgIH0KLX0KLQotCi0KLQotCi12b2lkIHZwOF9tYnBvc3RfcHJvY19kb3duX2ModW5zaWduZWQgY2hhciAqZHN0LCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scywgaW50IGZsaW1pdCkKLXsKLSAgICBpbnQgciwgYywgaTsKLSAgICBjb25zdCBzaG9ydCAqcnYzID0gJnZwOF9ydls2MyZyYW5kKCldOwotCi0gICAgZm9yIChjID0gMDsgYyA8IGNvbHM7IGMrKykKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnMgPSAmZHN0W2NdOwotICAgICAgICBpbnQgc3Vtc3EgPSAwOwotICAgICAgICBpbnQgc3VtICAgPSAwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGRbMTZdOwotICAgICAgICBjb25zdCBzaG9ydCAqcnYyID0gcnYzICsgKChjICogMTcpICYgMTI3KTsKLQotICAgICAgICBmb3IgKGkgPSAtODsgaSA8PSA2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1bXNxICs9IHNbaSpwaXRjaF0gKiBzW2kqcGl0Y2hdOwotICAgICAgICAgICAgc3VtICAgKz0gc1tpKnBpdGNoXTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCByb3dzICsgODsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdW1zcSArPSBzWzcqcGl0Y2hdICogc1sgNypwaXRjaF0gLSBzWy04KnBpdGNoXSAqIHNbLTgqcGl0Y2hdOwotICAgICAgICAgICAgc3VtICArPSBzWzcqcGl0Y2hdIC0gc1stOCpwaXRjaF07Ci0gICAgICAgICAgICBkW3ImMTVdID0gc1swXTsKLQotICAgICAgICAgICAgaWYgKHN1bXNxICogMTUgLSBzdW0gKiBzdW0gPCBmbGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZFtyJjE1XSA9IChydjJbciYxMjddICsgc3VtICsgc1swXSkgPj4gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc1stOCpwaXRjaF0gPSBkWyhyLTgpJjE1XTsKLSAgICAgICAgICAgIHMgKz0gcGl0Y2g7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgdnA4X2RlYmxvY2tfYW5kX2RlX21hY3JvX2Jsb2NrKFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpzb3VyY2UsCi0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpwb3N0LAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxvd192YXJfdGhyZXNoLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZywKLSAgICAgICAgdnA4X3Bvc3Rwcm9jX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpCi17Ci0gICAgZG91YmxlIGxldmVsID0gNi4wZS0wNSAqIHEgKiBxICogcSAtIC4wMDY3ICogcSAqIHEgKyAuMzA2ICogcSArIC4wMDY1OwotICAgIGludCBwcGwgPSAoaW50KShsZXZlbCArIC41KTsKLSAgICAodm9pZCkgbG93X3Zhcl90aHJlc2g7Ci0gICAgKHZvaWQpIGZsYWc7Ci0KLSAgICBQT1NUUFJPQ19JTlZPS0UocnRjZCwgZG93bmFjcm9zcykoc291cmNlLT55X2J1ZmZlciwgcG9zdC0+eV9idWZmZXIsIHNvdXJjZS0+eV9zdHJpZGUsICBwb3N0LT55X3N0cmlkZSwgc291cmNlLT55X2hlaWdodCwgc291cmNlLT55X3dpZHRoLCAgcHBsKTsKLSAgICBQT1NUUFJPQ19JTlZPS0UocnRjZCwgYWNyb3NzKShwb3N0LT55X2J1ZmZlciwgcG9zdC0+eV9zdHJpZGUsIHBvc3QtPnlfaGVpZ2h0LCBwb3N0LT55X3dpZHRoLCBxMm1ibChxKSk7Ci0gICAgUE9TVFBST0NfSU5WT0tFKHJ0Y2QsIGRvd24pKHBvc3QtPnlfYnVmZmVyLCBwb3N0LT55X3N0cmlkZSwgcG9zdC0+eV9oZWlnaHQsIHBvc3QtPnlfd2lkdGgsIHEybWJsKHEpKTsKLQotICAgIFBPU1RQUk9DX0lOVk9LRShydGNkLCBkb3duYWNyb3NzKShzb3VyY2UtPnVfYnVmZmVyLCBwb3N0LT51X2J1ZmZlciwgc291cmNlLT51dl9zdHJpZGUsIHBvc3QtPnV2X3N0cmlkZSwgc291cmNlLT51dl9oZWlnaHQsIHNvdXJjZS0+dXZfd2lkdGgsIHBwbCk7Ci0gICAgUE9TVFBST0NfSU5WT0tFKHJ0Y2QsIGRvd25hY3Jvc3MpKHNvdXJjZS0+dl9idWZmZXIsIHBvc3QtPnZfYnVmZmVyLCBzb3VyY2UtPnV2X3N0cmlkZSwgcG9zdC0+dXZfc3RyaWRlLCBzb3VyY2UtPnV2X2hlaWdodCwgc291cmNlLT51dl93aWR0aCwgcHBsKTsKLQotfQotCi12b2lkIHZwOF9kZWJsb2NrKFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqcG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBxLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxvd192YXJfdGhyZXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfcG9zdHByb2NfcnRjZF92dGFibGVfdCAqcnRjZCkKLXsKLSAgICBkb3VibGUgbGV2ZWwgPSA2LjBlLTA1ICogcSAqIHEgKiBxIC0gLjAwNjcgKiBxICogcSArIC4zMDYgKiBxICsgLjAwNjU7Ci0gICAgaW50IHBwbCA9IChpbnQpKGxldmVsICsgLjUpOwotICAgICh2b2lkKSBsb3dfdmFyX3RocmVzaDsKLSAgICAodm9pZCkgZmxhZzsKLQotICAgIFBPU1RQUk9DX0lOVk9LRShydGNkLCBkb3duYWNyb3NzKShzb3VyY2UtPnlfYnVmZmVyLCBwb3N0LT55X2J1ZmZlciwgc291cmNlLT55X3N0cmlkZSwgIHBvc3QtPnlfc3RyaWRlLCBzb3VyY2UtPnlfaGVpZ2h0LCBzb3VyY2UtPnlfd2lkdGgsICAgcHBsKTsKLSAgICBQT1NUUFJPQ19JTlZPS0UocnRjZCwgZG93bmFjcm9zcykoc291cmNlLT51X2J1ZmZlciwgcG9zdC0+dV9idWZmZXIsIHNvdXJjZS0+dXZfc3RyaWRlLCBwb3N0LT51dl9zdHJpZGUsICBzb3VyY2UtPnV2X2hlaWdodCwgc291cmNlLT51dl93aWR0aCwgcHBsKTsKLSAgICBQT1NUUFJPQ19JTlZPS0UocnRjZCwgZG93bmFjcm9zcykoc291cmNlLT52X2J1ZmZlciwgcG9zdC0+dl9idWZmZXIsIHNvdXJjZS0+dXZfc3RyaWRlLCBwb3N0LT51dl9zdHJpZGUsIHNvdXJjZS0+dXZfaGVpZ2h0LCBzb3VyY2UtPnV2X3dpZHRoLCBwcGwpOwotfQotCi12b2lkIHZwOF9kZV9ub2lzZShZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqc291cmNlLAotICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAgICAgICAgKnBvc3QsCi0gICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfdmFyX3RocmVzaCwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLAotICAgICAgICAgICAgICAgICAgdnA4X3Bvc3Rwcm9jX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpCi17Ci0gICAgZG91YmxlIGxldmVsID0gNi4wZS0wNSAqIHEgKiBxICogcSAtIC4wMDY3ICogcSAqIHEgKyAuMzA2ICogcSArIC4wMDY1OwotICAgIGludCBwcGwgPSAoaW50KShsZXZlbCArIC41KTsKLSAgICAodm9pZCkgcG9zdDsKLSAgICAodm9pZCkgbG93X3Zhcl90aHJlc2g7Ci0gICAgKHZvaWQpIGZsYWc7Ci0KLSAgICBQT1NUUFJPQ19JTlZPS0UocnRjZCwgZG93bmFjcm9zcykoCi0gICAgICAgIHNvdXJjZS0+eV9idWZmZXIgKyAyICogc291cmNlLT55X3N0cmlkZSArIDIsCi0gICAgICAgIHNvdXJjZS0+eV9idWZmZXIgKyAyICogc291cmNlLT55X3N0cmlkZSArIDIsCi0gICAgICAgIHNvdXJjZS0+eV9zdHJpZGUsCi0gICAgICAgIHNvdXJjZS0+eV9zdHJpZGUsCi0gICAgICAgIHNvdXJjZS0+eV9oZWlnaHQgLSA0LAotICAgICAgICBzb3VyY2UtPnlfd2lkdGggLSA0LAotICAgICAgICBwcGwpOwotICAgIFBPU1RQUk9DX0lOVk9LRShydGNkLCBkb3duYWNyb3NzKSgKLSAgICAgICAgc291cmNlLT51X2J1ZmZlciArIDIgKiBzb3VyY2UtPnV2X3N0cmlkZSArIDIsCi0gICAgICAgIHNvdXJjZS0+dV9idWZmZXIgKyAyICogc291cmNlLT51dl9zdHJpZGUgKyAyLAotICAgICAgICBzb3VyY2UtPnV2X3N0cmlkZSwKLSAgICAgICAgc291cmNlLT51dl9zdHJpZGUsCi0gICAgICAgIHNvdXJjZS0+dXZfaGVpZ2h0IC0gNCwKLSAgICAgICAgc291cmNlLT51dl93aWR0aCAtIDQsIHBwbCk7Ci0gICAgUE9TVFBST0NfSU5WT0tFKHJ0Y2QsIGRvd25hY3Jvc3MpKAotICAgICAgICBzb3VyY2UtPnZfYnVmZmVyICsgMiAqIHNvdXJjZS0+dXZfc3RyaWRlICsgMiwKLSAgICAgICAgc291cmNlLT52X2J1ZmZlciArIDIgKiBzb3VyY2UtPnV2X3N0cmlkZSArIDIsCi0gICAgICAgIHNvdXJjZS0+dXZfc3RyaWRlLAotICAgICAgICBzb3VyY2UtPnV2X3N0cmlkZSwKLSAgICAgICAgc291cmNlLT51dl9oZWlnaHQgLSA0LAotICAgICAgICBzb3VyY2UtPnV2X3dpZHRoIC0gNCwgcHBsKTsKLQotfQotCi1kb3VibGUgdnA4X2dhdXNzaWFuKGRvdWJsZSBzaWdtYSwgZG91YmxlIG11LCBkb3VibGUgeCkKLXsKLSAgICByZXR1cm4gMSAvIChzaWdtYSAqIHNxcnQoMi4wICogMy4xNDE1OTI2NSkpICoKLSAgICAgICAgICAgKGV4cCgtKHggLSBtdSkgKiAoeCAtIG11KSAvICgyICogc2lnbWEgKiBzaWdtYSkpKTsKLX0KLQotZXh0ZXJuIHZvaWQgKCp2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKSh2b2lkKTsKLQotCi1zdGF0aWMgdm9pZCBmaWxscmQoc3RydWN0IHBvc3Rwcm9jX3N0YXRlICpzdGF0ZSwgaW50IHEsIGludCBhKQotewotICAgIGNoYXIgY2hhcl9kaXN0WzMwMF07Ci0KLSAgICBkb3VibGUgc2lnbWE7Ci0gICAgaW50IGFpID0gYSwgcWkgPSBxLCBpOwotCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOwotCi0KLSAgICBzaWdtYSA9IGFpICsgLjUgKyAuNiAqICg2MyAtIHFpKSAvIDYzLjA7Ci0KLSAgICAvKiBzZXQgdXAgYSBsb29rdXAgdGFibGUgb2YgMjU2IGVudHJpZXMgdGhhdCBtYXRjaGVzCi0gICAgICogYSBnYXVzc2lhbiBkaXN0cmlidXRpb24gd2l0aCBzaWdtYSBkZXRlcm1pbmVkIGJ5IHEuCi0gICAgICovCi0gICAgewotICAgICAgICBkb3VibGUgaTsKLSAgICAgICAgaW50IG5leHQsIGo7Ci0KLSAgICAgICAgbmV4dCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gLTMyOyBpIDwgMzI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGEgPSAoaW50KSguNSArIDI1NiAqIHZwOF9nYXVzc2lhbihzaWdtYSwgMCwgaSkpOwotCi0gICAgICAgICAgICBpZiAoYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYTsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcl9kaXN0W25leHQral0gPSAoY2hhcikgaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dCArIGo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAobmV4dCA9IG5leHQ7IG5leHQgPCAyNTY7IG5leHQrKykKLSAgICAgICAgICAgIGNoYXJfZGlzdFtuZXh0XSA9IDA7Ci0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMzA3MjsgaSsrKQotICAgIHsKLSAgICAgICAgc3RhdGUtPm5vaXNlW2ldID0gY2hhcl9kaXN0W3JhbmQoKSAmIDB4ZmZdOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgc3RhdGUtPmJsYWNrY2xhbXBbaV0gPSAtY2hhcl9kaXN0WzBdOwotICAgICAgICBzdGF0ZS0+d2hpdGVjbGFtcFtpXSA9IC1jaGFyX2Rpc3RbMF07Ci0gICAgICAgIHN0YXRlLT5ib3RoY2xhbXBbaV0gPSAtMiAqIGNoYXJfZGlzdFswXTsKLSAgICB9Ci0KLSAgICBzdGF0ZS0+bGFzdF9xID0gcTsKLSAgICBzdGF0ZS0+bGFzdF9ub2lzZSA9IGE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBwbGFuZV9hZGRfbm9pc2VfYwotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqU3RhcnQgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXIgdG8gYWRkIGdhdXNzaWFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZSB0bwotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgV2lkdGggICAgd2lkdGggb2YgcGxhbmUKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEhlaWdodCAgIGhlaWdodCBvZiBwbGFuZQotICogICAgICAgICAgICAgICAgICBpbnQgIFBpdGNoICAgIGRpc3RhbmNlIGJldHdlZW4gc3Vic2VxdWVudCBsaW5lcyBvZiBmcmFtZQotICogICAgICAgICAgICAgICAgICBpbnQgIHEgICAgICAgIHF1YW50aXplciB1c2VkIHRvIGRldGVybWluZSBhbW91bnQgb2Ygbm9pc2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZAotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQuCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBhZGRzIGdhdXNzaWFuIG5vaXNlIHRvIGEgcGxhbmUgb2YgcGl4ZWxzCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhfcGxhbmVfYWRkX25vaXNlX2ModW5zaWduZWQgY2hhciAqU3RhcnQsIGNoYXIgKm5vaXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBibGFja2NsYW1wWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgd2hpdGVjbGFtcFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJvdGhjbGFtcFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBIZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKlBvcyA9IFN0YXJ0ICsgaSAqIFBpdGNoOwotICAgICAgICBjaGFyICAqUmVmID0gKGNoYXIgKikobm9pc2UgKyAocmFuZCgpICYgMHhmZikpOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBXaWR0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUG9zW2pdIDwgYmxhY2tjbGFtcFswXSkKLSAgICAgICAgICAgICAgICBQb3Nbal0gPSBibGFja2NsYW1wWzBdOwotCi0gICAgICAgICAgICBpZiAoUG9zW2pdID4gMjU1ICsgd2hpdGVjbGFtcFswXSkKLSAgICAgICAgICAgICAgICBQb3Nbal0gPSAyNTUgKyB3aGl0ZWNsYW1wWzBdOwotCi0gICAgICAgICAgICBQb3Nbal0gKz0gUmVmW2pdOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBCbGVuZCB0aGUgbWFjcm8gYmxvY2sgd2l0aCBhIHNvbGlkIGNvbG9yZWQgc3F1YXJlLiAgTGVhdmUgdGhlCi0gKiBlZGdlcyB1bmJsZW5kZWQgdG8gZ2l2ZSBkaXN0aW5jdGlvbiB0byBtYWNybyBibG9ja3MgaW4gYXJlYXMKLSAqIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGNvbG9yIGJsb2NrLgotICovCi12b2lkIHZwOF9ibGVuZF9tYl9pbm5lcl9jICh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkxLCBpbnQgdTEsIGludCB2MSwgaW50IGFscGhhLCBpbnQgc3RyaWRlKQotewotICAgIGludCBpLCBqOwotICAgIGludCB5MV9jb25zdCA9IHkxKigoMTw8MTYpLWFscGhhKTsKLSAgICBpbnQgdTFfY29uc3QgPSB1MSooKDE8PDE2KS1hbHBoYSk7Ci0gICAgaW50IHYxX2NvbnN0ID0gdjEqKCgxPDwxNiktYWxwaGEpOwotCi0gICAgeSArPSAyKnN0cmlkZSArIDI7Ci0gICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTI7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgeVtqXSA9ICh5W2pdKmFscGhhICsgeTFfY29uc3QpPj4xNjsKLSAgICAgICAgfQotICAgICAgICB5ICs9IHN0cmlkZTsKLSAgICB9Ci0KLSAgICBzdHJpZGUgPj49IDE7Ci0KLSAgICB1ICs9IHN0cmlkZSArIDE7Ci0gICAgdiArPSBzdHJpZGUgKyAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVbal0gPSAodVtqXSphbHBoYSArIHUxX2NvbnN0KT4+MTY7Ci0gICAgICAgICAgICB2W2pdID0gKHZbal0qYWxwaGEgKyB2MV9jb25zdCk+PjE2OwotICAgICAgICB9Ci0gICAgICAgIHUgKz0gc3RyaWRlOwotICAgICAgICB2ICs9IHN0cmlkZTsKLSAgICB9Ci19Ci0KLS8qIEJsZW5kIG9ubHkgdGhlIGVkZ2Ugb2YgdGhlIG1hY3JvIGJsb2NrLiAgTGVhdmUgY2VudGVyCi0gKiB1bmJsZW5kZWQgdG8gYWxsb3cgZm9yIG90aGVyIHZpc3VhbGl6YXRpb25zIHRvIGJlIGxheWVyZWQuCi0gKi8KLXZvaWQgdnA4X2JsZW5kX21iX291dGVyX2MgKHVuc2lnbmVkIGNoYXIgKnksIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeTEsIGludCB1MSwgaW50IHYxLCBpbnQgYWxwaGEsIGludCBzdHJpZGUpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IHkxX2NvbnN0ID0geTEqKCgxPDwxNiktYWxwaGEpOwotICAgIGludCB1MV9jb25zdCA9IHUxKigoMTw8MTYpLWFscGhhKTsKLSAgICBpbnQgdjFfY29uc3QgPSB2MSooKDE8PDE2KS1hbHBoYSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHlbal0gPSAoeVtqXSphbHBoYSArIHkxX2NvbnN0KT4+MTY7Ci0gICAgICAgIH0KLSAgICAgICAgeSArPSBzdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0gICAgewotICAgICAgICB5WzBdICA9ICh5WzBdKmFscGhhICArIHkxX2NvbnN0KT4+MTY7Ci0gICAgICAgIHlbMV0gID0gKHlbMV0qYWxwaGEgICsgeTFfY29uc3QpPj4xNjsKLSAgICAgICAgeVsxNF0gPSAoeVsxNF0qYWxwaGEgKyB5MV9jb25zdCk+PjE2OwotICAgICAgICB5WzE1XSA9ICh5WzE1XSphbHBoYSArIHkxX2NvbnN0KT4+MTY7Ci0gICAgICAgIHkgKz0gc3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgeVtqXSA9ICh5W2pdKmFscGhhICsgeTFfY29uc3QpPj4xNjsKLSAgICAgICAgfQotICAgICAgICB5ICs9IHN0cmlkZTsKLSAgICB9Ci0KLSAgICBzdHJpZGUgPj49IDE7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQotICAgIHsKLSAgICAgICAgdVtqXSA9ICh1W2pdKmFscGhhICsgdTFfY29uc3QpPj4xNjsKLSAgICAgICAgdltqXSA9ICh2W2pdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKLSAgICB9Ci0gICAgdSArPSBzdHJpZGU7Ci0gICAgdiArPSBzdHJpZGU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgICAgdVswXSA9ICh1WzBdKmFscGhhICsgdTFfY29uc3QpPj4xNjsKLSAgICAgICAgdlswXSA9ICh2WzBdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKLQotICAgICAgICB1WzddID0gKHVbN10qYWxwaGEgKyB1MV9jb25zdCk+PjE2OwotICAgICAgICB2WzddID0gKHZbN10qYWxwaGEgKyB2MV9jb25zdCk+PjE2OwotCi0gICAgICAgIHUgKz0gc3RyaWRlOwotICAgICAgICB2ICs9IHN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQotICAgIHsKLSAgICAgICAgdVtqXSA9ICh1W2pdKmFscGhhICsgdTFfY29uc3QpPj4xNjsKLSAgICAgICAgdltqXSA9ICh2W2pdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2JsZW5kX2JfYyAodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5MSwgaW50IHUxLCBpbnQgdjEsIGludCBhbHBoYSwgaW50IHN0cmlkZSkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgeTFfY29uc3QgPSB5MSooKDE8PDE2KS1hbHBoYSk7Ci0gICAgaW50IHUxX2NvbnN0ID0gdTEqKCgxPDwxNiktYWxwaGEpOwotICAgIGludCB2MV9jb25zdCA9IHYxKigoMTw8MTYpLWFscGhhKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICB5W2pdID0gKHlbal0qYWxwaGEgKyB5MV9jb25zdCk+PjE2OwotICAgICAgICB9Ci0gICAgICAgIHkgKz0gc3RyaWRlOwotICAgIH0KLQotICAgIHN0cmlkZSA+Pj0gMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICB1W2pdID0gKHVbal0qYWxwaGEgKyB1MV9jb25zdCk+PjE2OwotICAgICAgICAgICAgdltqXSA9ICh2W2pdKmFscGhhICsgdjFfY29uc3QpPj4xNjsKLSAgICAgICAgfQotICAgICAgICB1ICs9IHN0cmlkZTsKLSAgICAgICAgdiArPSBzdHJpZGU7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb25zdHJhaW5fbGluZSAoaW50IHgwLCBpbnQgKngxLCBpbnQgeTAsIGludCAqeTEsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBpbnQgZHg7Ci0gICAgaW50IGR5OwotCi0gICAgaWYgKCp4MSA+IHdpZHRoKQotICAgIHsKLSAgICAgICAgZHggPSAqeDEgLSB4MDsKLSAgICAgICAgZHkgPSAqeTEgLSB5MDsKLQotICAgICAgICAqeDEgPSB3aWR0aDsKLSAgICAgICAgaWYgKGR4KQotICAgICAgICAgICAgKnkxID0gKCh3aWR0aC14MCkqZHkpL2R4ICsgeTA7Ci0gICAgfQotICAgIGlmICgqeDEgPCAwKQotICAgIHsKLSAgICAgICAgZHggPSAqeDEgLSB4MDsKLSAgICAgICAgZHkgPSAqeTEgLSB5MDsKLQotICAgICAgICAqeDEgPSAwOwotICAgICAgICBpZiAoZHgpCi0gICAgICAgICAgICAqeTEgPSAoKDAteDApKmR5KS9keCArIHkwOwotICAgIH0KLSAgICBpZiAoKnkxID4gaGVpZ2h0KQotICAgIHsKLSAgICAgICAgZHggPSAqeDEgLSB4MDsKLSAgICAgICAgZHkgPSAqeTEgLSB5MDsKLQotICAgICAgICAqeTEgPSBoZWlnaHQ7Ci0gICAgICAgIGlmIChkeSkKLSAgICAgICAgICAgICp4MSA9ICgoaGVpZ2h0LXkwKSpkeCkvZHkgKyB4MDsKLSAgICB9Ci0gICAgaWYgKCp5MSA8IDApCi0gICAgewotICAgICAgICBkeCA9ICp4MSAtIHgwOwotICAgICAgICBkeSA9ICp5MSAtIHkwOwotCi0gICAgICAgICp5MSA9IDA7Ci0gICAgICAgIGlmIChkeSkKLSAgICAgICAgICAgICp4MSA9ICgoMC15MCkqZHgpL2R5ICsgeDA7Ci0gICAgfQotfQotCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIFJUQ0RfVlRBQkxFKG9jaSkgKCYob2NpKS0+cnRjZC5wb3N0cHJvYykKLSNlbHNlCi0jZGVmaW5lIFJUQ0RfVlRBQkxFKG9jaSkgTlVMTAotI2VuZGlmCi0KLWludCB2cDhfcG9zdF9wcm9jX2ZyYW1lKFZQOF9DT01NT04gKm9jaSwgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LCB2cDhfcHBmbGFnc190ICpwcGZsYWdzKQotewotICAgIGludCBxID0gb2NpLT5maWx0ZXJfbGV2ZWwgKiAxMCAvIDY7Ci0gICAgaW50IGZsYWdzID0gcHBmbGFncy0+cG9zdF9wcm9jX2ZsYWc7Ci0gICAgaW50IGRlYmxvY2tfbGV2ZWwgPSBwcGZsYWdzLT5kZWJsb2NraW5nX2xldmVsOwotICAgIGludCBub2lzZV9sZXZlbCA9IHBwZmxhZ3MtPm5vaXNlX2xldmVsOwotCi0gICAgaWYgKCFvY2ktPmZyYW1lX3RvX3Nob3cpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChxID4gNjMpCi0gICAgICAgIHEgPSA2MzsKLQotICAgIGlmICghZmxhZ3MpCi0gICAgewotICAgICAgICAqZGVzdCA9ICpvY2ktPmZyYW1lX3RvX3Nob3c7Ci0KLSAgICAgICAgLyogaGFuZGxlIHByb2JsZW0gd2l0aCBleHRlbmRpbmcgYm9yZGVycyAqLwotICAgICAgICBkZXN0LT55X3dpZHRoID0gb2NpLT5XaWR0aDsKLSAgICAgICAgZGVzdC0+eV9oZWlnaHQgPSBvY2ktPkhlaWdodDsKLSAgICAgICAgZGVzdC0+dXZfaGVpZ2h0ID0gZGVzdC0+eV9oZWlnaHQgLyAyOwotICAgICAgICByZXR1cm4gMDsKLQotICAgIH0KLQotI2lmIEFSQ0hfWDg2fHxBUkNIX1g4Nl82NAotICAgIHZweF9yZXNldF9tbXhfc3RhdGUoKTsKLSNlbmRpZgotCi0gICAgaWYgKGZsYWdzICYgVlA4RF9ERU1BQ1JPQkxPQ0spCi0gICAgewotICAgICAgICB2cDhfZGVibG9ja19hbmRfZGVfbWFjcm9fYmxvY2sob2NpLT5mcmFtZV90b19zaG93LCAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSArIChkZWJsb2NrX2xldmVsIC0gNSkgKiAxMCwgMSwgMCwgUlRDRF9WVEFCTEUob2NpKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGZsYWdzICYgVlA4RF9ERUJMT0NLKQotICAgIHsKLSAgICAgICAgdnA4X2RlYmxvY2sob2NpLT5mcmFtZV90b19zaG93LCAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBxLCAxLCAwLCBSVENEX1ZUQUJMRShvY2kpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIob2NpLT5mcmFtZV90b19zaG93LCAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBWUDhEX0FERE5PSVNFKQotICAgIHsKLSAgICAgICAgaWYgKG9jaS0+cG9zdHByb2Nfc3RhdGUubGFzdF9xICE9IHEKLSAgICAgICAgICAgIHx8IG9jaS0+cG9zdHByb2Nfc3RhdGUubGFzdF9ub2lzZSAhPSBub2lzZV9sZXZlbCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbHJkKCZvY2ktPnBvc3Rwcm9jX3N0YXRlLCA2MyAtIHEsIG5vaXNlX2xldmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBPU1RQUk9DX0lOVk9LRShSVENEX1ZUQUJMRShvY2kpLCBhZGRub2lzZSkKLSAgICAgICAgKG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X2J1ZmZlciwKLSAgICAgICAgIG9jaS0+cG9zdHByb2Nfc3RhdGUubm9pc2UsCi0gICAgICAgICBvY2ktPnBvc3Rwcm9jX3N0YXRlLmJsYWNrY2xhbXAsCi0gICAgICAgICBvY2ktPnBvc3Rwcm9jX3N0YXRlLndoaXRlY2xhbXAsCi0gICAgICAgICBvY2ktPnBvc3Rwcm9jX3N0YXRlLmJvdGhjbGFtcCwKLSAgICAgICAgIG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X3dpZHRoLCBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9oZWlnaHQsCi0gICAgICAgICBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9zdHJpZGUpOwotICAgIH0KLQotI2lmIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSCi0gICAgaWYgKGZsYWdzICYgVlA4RF9ERUJVR19UWFRfRlJBTUVfSU5GTykKLSAgICB7Ci0gICAgICAgIGNoYXIgbWVzc2FnZVs1MTJdOwotICAgICAgICBzcHJpbnRmKG1lc3NhZ2UsICJGJTFkRyUxZFElM2RGJTNkUCVkX3MlZHglZCIsCi0gICAgICAgICAgICAgICAgKG9jaS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpLAotICAgICAgICAgICAgICAgIG9jaS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUsCi0gICAgICAgICAgICAgICAgb2NpLT5iYXNlX3FpbmRleCwKLSAgICAgICAgICAgICAgICBvY2ktPmZpbHRlcl9sZXZlbCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBvY2ktPm1iX2NvbHMsIG9jaS0+bWJfcm93cyk7Ci0gICAgICAgIHZwOF9ibGl0X3RleHQobWVzc2FnZSwgb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfYnVmZmVyLCBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9zdHJpZGUpOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFZQOERfREVCVUdfVFhUX01CTEtfTU9ERVMpCi0gICAgewotICAgICAgICBpbnQgaSwgajsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHI7Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqcG9zdCA9ICZvY2ktPnBvc3RfcHJvY19idWZmZXI7Ci0gICAgICAgIGludCBtYl9yb3dzID0gcG9zdC0+eV9oZWlnaHQgPj4gNDsKLSAgICAgICAgaW50IG1iX2NvbHMgPSBwb3N0LT55X3dpZHRoICA+PiA0OwotICAgICAgICBpbnQgbWJfaW5kZXggPSAwOwotICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKLQotICAgICAgICB5X3B0ciA9IHBvc3QtPnlfYnVmZmVyICsgNCAqIHBvc3QtPnlfc3RyaWRlICsgNDsKLQotICAgICAgICAvKiB2cDhfZmlsdGVyIGVhY2ggbWFjcm8gYmxvY2sgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1iX3Jvd3M7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iX2NvbHM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIHp6WzRdOwotCi0gICAgICAgICAgICAgICAgc3ByaW50Zih6eiwgIiVjIiwgbWlbbWJfaW5kZXhdLm1ibWkubW9kZSArICdhJyk7Ci0KLSAgICAgICAgICAgICAgICB2cDhfYmxpdF90ZXh0KHp6LCB5X3B0ciwgcG9zdC0+eV9zdHJpZGUpOwotICAgICAgICAgICAgICAgIG1iX2luZGV4ICsrOwotICAgICAgICAgICAgICAgIHlfcHRyICs9IDE2OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYl9pbmRleCArKzsgLyogYm9yZGVyICovCi0gICAgICAgICAgICB5X3B0ciArPSBwb3N0LT55X3N0cmlkZSAgKiAxNiAtIHBvc3QtPnlfd2lkdGg7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFZQOERfREVCVUdfVFhUX0RDX0RJRkYpCi0gICAgewotICAgICAgICBpbnQgaSwgajsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHI7Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqcG9zdCA9ICZvY2ktPnBvc3RfcHJvY19idWZmZXI7Ci0gICAgICAgIGludCBtYl9yb3dzID0gcG9zdC0+eV9oZWlnaHQgPj4gNDsKLSAgICAgICAgaW50IG1iX2NvbHMgPSBwb3N0LT55X3dpZHRoICA+PiA0OwotICAgICAgICBpbnQgbWJfaW5kZXggPSAwOwotICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKLQotICAgICAgICB5X3B0ciA9IHBvc3QtPnlfYnVmZmVyICsgNCAqIHBvc3QtPnlfc3RyaWRlICsgNDsKLQotICAgICAgICAvKiB2cDhfZmlsdGVyIGVhY2ggbWFjcm8gYmxvY2sgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1iX3Jvd3M7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iX2NvbHM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIHp6WzRdOwotCi0gICAgICAgICAgICAgICAgaWYgKG9jaS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoenosICJhIik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHp6LCAiJWMiLCBtaVttYl9pbmRleF0ubWJtaS5kY19kaWZmICsgJzAnKTsKLQotICAgICAgICAgICAgICAgIHZwOF9ibGl0X3RleHQoenosIHlfcHRyLCBwb3N0LT55X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgbWJfaW5kZXggKys7Ci0gICAgICAgICAgICAgICAgeV9wdHIgKz0gMTY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1iX2luZGV4ICsrOyAvKiBib3JkZXIgKi8KLSAgICAgICAgICAgIHlfcHRyICs9IHBvc3QtPnlfc3RyaWRlICAqIDE2IC0gcG9zdC0+eV93aWR0aDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVlA4RF9ERUJVR19UWFRfUkFURV9JTkZPKQotICAgIHsKLSAgICAgICAgY2hhciBtZXNzYWdlWzUxMl07Ci0gICAgICAgIHNwcmludGYobWVzc2FnZSwgIkJpdHJhdGU6ICUxMC4yZiBmcmFtZV9yYXRlOiAlMTAuMmYgIiwgb2NpLT5iaXRyYXRlLCBvY2ktPmZyYW1lcmF0ZSk7Ci0gICAgICAgIHZwOF9ibGl0X3RleHQobWVzc2FnZSwgb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfYnVmZmVyLCBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9zdHJpZGUpOwotICAgIH0KLQotICAgIC8qIERyYXcgbW90aW9uIHZlY3RvcnMgKi8KLSAgICBpZiAoKGZsYWdzICYgVlA4RF9ERUJVR19EUkFXX01WKSAmJiBwcGZsYWdzLT5kaXNwbGF5X212X2ZsYWcpCi0gICAgewotICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnBvc3QgPSAmb2NpLT5wb3N0X3Byb2NfYnVmZmVyOwotICAgICAgICBpbnQgd2lkdGggID0gcG9zdC0+eV93aWR0aDsKLSAgICAgICAgaW50IGhlaWdodCA9IHBvc3QtPnlfaGVpZ2h0OwotICAgICAgICBpbnQgbWJfY29scyA9IHdpZHRoICA+PiA0OwotICAgICAgICB1bnNpZ25lZCBjaGFyICp5X2J1ZmZlciA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci55X2J1ZmZlcjsKLSAgICAgICAgaW50IHlfc3RyaWRlID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfc3RyaWRlOwotICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKLSAgICAgICAgaW50IHgwLCB5MDsKLQotICAgICAgICBmb3IgKHkwID0gMDsgeTAgPCBoZWlnaHQ7IHkwICs9IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHgwID0gMDsgeDAgPCB3aWR0aDsgeDAgKz0gMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHgxLCB5MTsKLQotICAgICAgICAgICAgICAgIGlmICghKHBwZmxhZ3MtPmRpc3BsYXlfbXZfZmxhZyAmICgxPDxtaS0+bWJtaS5tb2RlKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtaSsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobWktPm1ibWkubW9kZSA9PSBTUExJVE1WKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtaS0+bWJtaS5wYXJ0aXRpb25pbmcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6ICAgIC8qIG12X3RvcF9ib3R0b20gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX01PREVfSU5GTyAqYm1pID0gJm1pLT5ibWlbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVYgKm12ID0gJmJtaS0+bXYuYXNfbXY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHgwICsgOCArIChtdi0+Y29sID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geTAgKyA0ICsgKG12LT5yb3cgPj4gMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5fbGluZSAoeDArOCwgJngxLCB5MCs0LCAmeTEsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9ibGl0X2xpbmUgICh4MCs4LCAgeDEsIHkwKzQsICB5MSwgeV9idWZmZXIsIHlfc3RyaWRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaSA9ICZtaS0+Ym1pWzhdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSB4MCArIDggKyAobXYtPmNvbCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHkwICsxMiArIChtdi0+cm93ID4+IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluX2xpbmUgKHgwKzgsICZ4MSwgeTArMTIsICZ5MSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKHgwKzgsICB4MSwgeTArMTIsICB5MSwgeV9idWZmZXIsIHlfc3RyaWRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogICAgLyogbXZfbGVmdF9yaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfTU9ERV9JTkZPICpibWkgPSAmbWktPmJtaVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNViAqbXYgPSAmYm1pLT5tdi5hc19tdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDAgKyA0ICsgKG12LT5jb2wgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5MCArIDggKyAobXYtPnJvdyA+PiAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lICh4MCs0LCAmeDEsIHkwKzgsICZ5MSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKHgwKzQsICB4MSwgeTArOCwgIHkxLCB5X2J1ZmZlciwgeV9zdHJpZGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1pID0gJm1pLT5ibWlbMl07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHgwICsxMiArIChtdi0+Y29sID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geTAgKyA4ICsgKG12LT5yb3cgPj4gMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5fbGluZSAoeDArMTIsICZ4MSwgeTArOCwgJnkxLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAoeDArMTIsICB4MSwgeTArOCwgIHkxLCB5X2J1ZmZlciwgeV9zdHJpZGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAgICAvKiBtdl9xdWFydGVycyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQl9NT0RFX0lORk8gKmJtaSA9ICZtaS0+Ym1pWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WICptdiA9ICZibWktPm12LmFzX212OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSB4MCArIDQgKyAobXYtPmNvbCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHkwICsgNCArIChtdi0+cm93ID4+IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluX2xpbmUgKHgwKzQsICZ4MSwgeTArNCwgJnkxLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAoeDArNCwgIHgxLCB5MCs0LCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkgPSAmbWktPmJtaVsyXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDAgKzEyICsgKG12LT5jb2wgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5MCArIDQgKyAobXYtPnJvdyA+PiAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lICh4MCsxMiwgJngxLCB5MCs0LCAmeTEsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9ibGl0X2xpbmUgICh4MCsxMiwgIHgxLCB5MCs0LCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkgPSAmbWktPmJtaVs4XTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDAgKyA0ICsgKG12LT5jb2wgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB5MCArMTIgKyAobXYtPnJvdyA+PiAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lICh4MCs0LCAmeDEsIHkwKzEyLCAmeTEsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9ibGl0X2xpbmUgICh4MCs0LCAgeDEsIHkwKzEyLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkgPSAmbWktPmJtaVsxMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHgwICsxMiArIChtdi0+Y29sID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0geTAgKzEyICsgKG12LT5yb3cgPj4gMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5fbGluZSAoeDArMTIsICZ4MSwgeTArMTIsICZ5MSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKHgwKzEyLCAgeDEsIHkwKzEyLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX01PREVfSU5GTyAqYm1pID0gbWktPmJtaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYngwLCBieTA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJ5MCA9IHkwOyBieTAgPCAoeTArMTYpOyBieTAgKz0gNCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYngwID0geDA7IGJ4MCA8ICh4MCsxNik7IGJ4MCArPSA0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNViAqbXYgPSAmYm1pLT5tdi5hc19tdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSBieDAgKyAyICsgKG12LT5jb2wgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IGJ5MCArIDIgKyAobXYtPnJvdyA+PiAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluX2xpbmUgKGJ4MCsyLCAmeDEsIGJ5MCsyLCAmeTEsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKGJ4MCsyLCAgeDEsIGJ5MCsyLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pLT5tYm1pLm1vZGUgPj0gTkVBUkVTVE1WKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTVYgKm12ID0gJm1pLT5tYm1pLm12LmFzX212OwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHgwID0geDAgKyA4OwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHkwID0geTAgKyA4OwotCi0gICAgICAgICAgICAgICAgICAgIHgxID0gbHgwICsgKG12LT5jb2wgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgIHkxID0gbHkwICsgKG12LT5yb3cgPj4gMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHgxICE9IGx4MCAmJiB5MSAhPSBseTApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lIChseDAsICZ4MSwgbHkwLTEsICZ5MSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAobHgwLCAgeDEsIGx5MC0xLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbl9saW5lIChseDAsICZ4MSwgbHkwKzEsICZ5MSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfYmxpdF9saW5lICAobHgwLCAgeDEsIGx5MCsxLCAgeTEsIHlfYnVmZmVyLCB5X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2JsaXRfbGluZSAgKGx4MCwgIHgxLCBseTAsICB5MSwgeV9idWZmZXIsIHlfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtaSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWkrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvbG9yIGluIGJsb2NrIG1vZGVzICovCi0gICAgaWYgKChmbGFncyAmIFZQOERfREVCVUdfQ0xSX0JMS19NT0RFUykKLSAgICAgICAgJiYgKHBwZmxhZ3MtPmRpc3BsYXlfbWJfbW9kZXNfZmxhZyB8fCBwcGZsYWdzLT5kaXNwbGF5X2JfbW9kZXNfZmxhZykpCi0gICAgewotICAgICAgICBpbnQgeSwgeDsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcjsKLSAgICAgICAgaW50IHdpZHRoICA9IHBvc3QtPnlfd2lkdGg7Ci0gICAgICAgIGludCBoZWlnaHQgPSBwb3N0LT55X2hlaWdodDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHIgPSBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9idWZmZXI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnVfcHRyID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnVfYnVmZmVyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp2X3B0ciA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci52X2J1ZmZlcjsKLSAgICAgICAgaW50IHlfc3RyaWRlID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfc3RyaWRlOwotICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKLQotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IFkgPSAwLCBVID0gMCwgViA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWktPm1ibWkubW9kZSA9PSBCX1BSRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgKChwcGZsYWdzLT5kaXNwbGF5X21iX21vZGVzX2ZsYWcgJiBCX1BSRUQpIHx8IHBwZmxhZ3MtPmRpc3BsYXlfYl9tb2Rlc19mbGFnKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBieSwgYng7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnlsLCAqdWwsICp2bDsKLSAgICAgICAgICAgICAgICAgICAgQl9NT0RFX0lORk8gKmJtaSA9IG1pLT5ibWk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeWwgPSB5X3B0ciArIHg7Ci0gICAgICAgICAgICAgICAgICAgIHVsID0gdV9wdHIgKyAoeD4+MSk7Ci0gICAgICAgICAgICAgICAgICAgIHZsID0gdl9wdHIgKyAoeD4+MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChieSA9IDA7IGJ5IDwgMTY7IGJ5ICs9IDQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYnggPSAwOyBieCA8IDE2OyBieCArPSA0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHBmbGFncy0+ZGlzcGxheV9iX21vZGVzX2ZsYWcgJiAoMTw8bWktPm1ibWkubW9kZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwcGZsYWdzLT5kaXNwbGF5X21iX21vZGVzX2ZsYWcgJiBCX1BSRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSA9IEJfUFJFRElDVElPTl9NT0RFX2NvbG9yc1tibWktPm1vZGVdWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVID0gQl9QUkVESUNUSU9OX01PREVfY29sb3JzW2JtaS0+bW9kZV1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgPSBCX1BSRURJQ1RJT05fTU9ERV9jb2xvcnNbYm1pLT5tb2RlXVsyXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NUUFJPQ19JTlZPS0UoUlRDRF9WVEFCTEUob2NpKSwgYmxlbmRfYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5bCtieCwgdWwrKGJ4Pj4xKSwgdmwrKGJ4Pj4xKSwgWSwgVSwgViwgMHhjMDAwLCB5X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB5bCArPSB5X3N0cmlkZSo0OwotICAgICAgICAgICAgICAgICAgICAgICAgdWwgKz0geV9zdHJpZGUqMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZsICs9IHlfc3RyaWRlKjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocHBmbGFncy0+ZGlzcGxheV9tYl9tb2Rlc19mbGFnICYgKDE8PG1pLT5tYm1pLm1vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWSA9IE1CX1BSRURJQ1RJT05fTU9ERV9jb2xvcnNbbWktPm1ibWkubW9kZV1bMF07Ci0gICAgICAgICAgICAgICAgICAgIFUgPSBNQl9QUkVESUNUSU9OX01PREVfY29sb3JzW21pLT5tYm1pLm1vZGVdWzFdOwotICAgICAgICAgICAgICAgICAgICBWID0gTUJfUFJFRElDVElPTl9NT0RFX2NvbG9yc1ttaS0+bWJtaS5tb2RlXVsyXTsKLQotICAgICAgICAgICAgICAgICAgICBQT1NUUFJPQ19JTlZPS0UoUlRDRF9WVEFCTEUob2NpKSwgYmxlbmRfbWJfaW5uZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAoeV9wdHIreCwgdV9wdHIrKHg+PjEpLCB2X3B0cisoeD4+MSksIFksIFUsIFYsIDB4YzAwMCwgeV9zdHJpZGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1pKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB5X3B0ciArPSB5X3N0cmlkZSoxNjsKLSAgICAgICAgICAgIHVfcHRyICs9IHlfc3RyaWRlKjQ7Ci0gICAgICAgICAgICB2X3B0ciArPSB5X3N0cmlkZSo0OwotCi0gICAgICAgICAgICBtaSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29sb3IgaW4gZnJhbWUgcmVmZXJlbmNlIGJsb2NrcyAqLwotICAgIGlmICgoZmxhZ3MgJiBWUDhEX0RFQlVHX0NMUl9GUk1fUkVGX0JMS1MpICYmIHBwZmxhZ3MtPmRpc3BsYXlfcmVmX2ZyYW1lX2ZsYWcpCi0gICAgewotICAgICAgICBpbnQgeSwgeDsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gJm9jaS0+cG9zdF9wcm9jX2J1ZmZlcjsKLSAgICAgICAgaW50IHdpZHRoICA9IHBvc3QtPnlfd2lkdGg7Ci0gICAgICAgIGludCBoZWlnaHQgPSBwb3N0LT55X2hlaWdodDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqeV9wdHIgPSBvY2ktPnBvc3RfcHJvY19idWZmZXIueV9idWZmZXI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnVfcHRyID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnVfYnVmZmVyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp2X3B0ciA9IG9jaS0+cG9zdF9wcm9jX2J1ZmZlci52X2J1ZmZlcjsKLSAgICAgICAgaW50IHlfc3RyaWRlID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyLnlfc3RyaWRlOwotICAgICAgICBNT0RFX0lORk8gKm1pID0gb2NpLT5taTsKLQotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0xNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgWSA9IDAsIFUgPSAwLCBWID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcGZsYWdzLT5kaXNwbGF5X3JlZl9mcmFtZV9mbGFnICYgKDE8PG1pLT5tYm1pLnJlZl9mcmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBZID0gTVZfUkVGRVJFTkNFX0ZSQU1FX2NvbG9yc1ttaS0+bWJtaS5yZWZfZnJhbWVdWzBdOwotICAgICAgICAgICAgICAgICAgICBVID0gTVZfUkVGRVJFTkNFX0ZSQU1FX2NvbG9yc1ttaS0+bWJtaS5yZWZfZnJhbWVdWzFdOwotICAgICAgICAgICAgICAgICAgICBWID0gTVZfUkVGRVJFTkNFX0ZSQU1FX2NvbG9yc1ttaS0+bWJtaS5yZWZfZnJhbWVdWzJdOwotCi0gICAgICAgICAgICAgICAgICAgIFBPU1RQUk9DX0lOVk9LRShSVENEX1ZUQUJMRShvY2kpLCBibGVuZF9tYl9vdXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICh5X3B0cit4LCB1X3B0cisoeD4+MSksIHZfcHRyKyh4Pj4xKSwgWSwgVSwgViwgMHhjMDAwLCB5X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHlfcHRyICs9IHlfc3RyaWRlKjE2OwotICAgICAgICAgICAgdV9wdHIgKz0geV9zdHJpZGUqNDsKLSAgICAgICAgICAgIHZfcHRyICs9IHlfc3RyaWRlKjQ7Ci0KLSAgICAgICAgICAgIG1pKys7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgICpkZXN0ID0gb2NpLT5wb3N0X3Byb2NfYnVmZmVyOwotCi0gICAgLyogaGFuZGxlIHByb2JsZW0gd2l0aCBleHRlbmRpbmcgYm9yZGVycyAqLwotICAgIGRlc3QtPnlfd2lkdGggPSBvY2ktPldpZHRoOwotICAgIGRlc3QtPnlfaGVpZ2h0ID0gb2NpLT5IZWlnaHQ7Ci0gICAgZGVzdC0+dXZfaGVpZ2h0ID0gZGVzdC0+eV9oZWlnaHQgLyAyOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9wb3N0cHJvYy5oIGIvdnA4L2NvbW1vbi9wb3N0cHJvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQxYjljLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vcG9zdHByb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBQT1NUUFJPQ19ICi0jZGVmaW5lIFBPU1RQUk9DX0gKLQotI2RlZmluZSBwcm90b3R5cGVfcG9zdHByb2NfaW5wbGFjZShzeW0pXAotICAgIHZvaWQgc3ltICh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLGludCBmbGltaXQpCi0KLSNkZWZpbmUgcHJvdG90eXBlX3Bvc3Rwcm9jKHN5bSlcCi0gICAgdm9pZCBzeW0gKHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3JjX3BpdGNoLFwKLSAgICAgICAgICAgICAgaW50IGRzdF9waXRjaCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZmxpbWl0KQotCi0jZGVmaW5lIHByb3RvdHlwZV9wb3N0cHJvY19hZGRub2lzZShzeW0pIFwKLSAgICB2b2lkIHN5bSAodW5zaWduZWQgY2hhciAqcywgY2hhciAqbm9pc2UsIGNoYXIgYmxhY2tjbGFtcFsxNl0sXAotICAgICAgICAgICAgICBjaGFyIHdoaXRlY2xhbXBbMTZdLCBjaGFyIGJvdGhjbGFtcFsxNl0sXAotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIGludCBwaXRjaCkKLQotI2RlZmluZSBwcm90b3R5cGVfcG9zdHByb2NfYmxlbmRfbWJfaW5uZXIoc3ltKVwKLSAgICB2b2lkIHN5bSAodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdixcCi0gICAgICAgICAgICAgIGludCB5MSwgaW50IHUxLCBpbnQgdjEsIGludCBhbHBoYSwgaW50IHN0cmlkZSkKLQotI2RlZmluZSBwcm90b3R5cGVfcG9zdHByb2NfYmxlbmRfbWJfb3V0ZXIoc3ltKVwKLSAgICB2b2lkIHN5bSAodW5zaWduZWQgY2hhciAqeSwgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdixcCi0gICAgICAgICAgICAgIGludCB5MSwgaW50IHUxLCBpbnQgdjEsIGludCBhbHBoYSwgaW50IHN0cmlkZSkKLQotI2RlZmluZSBwcm90b3R5cGVfcG9zdHByb2NfYmxlbmRfYihzeW0pXAotICAgIHZvaWQgc3ltICh1bnNpZ25lZCBjaGFyICp5LCB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LFwKLSAgICAgICAgICAgICAgaW50IHkxLCBpbnQgdTEsIGludCB2MSwgaW50IGFscGhhLCBpbnQgc3RyaWRlKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvcG9zdHByb2NfeDg2LmgiCi0jZW5kaWYKLQotI2lmbmRlZiB2cDhfcG9zdHByb2NfZG93bgotI2RlZmluZSB2cDhfcG9zdHByb2NfZG93biB2cDhfbWJwb3N0X3Byb2NfZG93bl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfcG9zdHByb2NfaW5wbGFjZSh2cDhfcG9zdHByb2NfZG93bik7Ci0KLSNpZm5kZWYgdnA4X3Bvc3Rwcm9jX2Fjcm9zcwotI2RlZmluZSB2cDhfcG9zdHByb2NfYWNyb3NzIHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jX2lucGxhY2UodnA4X3Bvc3Rwcm9jX2Fjcm9zcyk7Ci0KLSNpZm5kZWYgdnA4X3Bvc3Rwcm9jX2Rvd25hY3Jvc3MKLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2Rvd25hY3Jvc3MgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jKHZwOF9wb3N0cHJvY19kb3duYWNyb3NzKTsKLQotI2lmbmRlZiB2cDhfcG9zdHByb2NfYWRkbm9pc2UKLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2FkZG5vaXNlIHZwOF9wbGFuZV9hZGRfbm9pc2VfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jX2FkZG5vaXNlKHZwOF9wb3N0cHJvY19hZGRub2lzZSk7Ci0KLSNpZm5kZWYgdnA4X3Bvc3Rwcm9jX2JsZW5kX21iX2lubmVyCi0jZGVmaW5lIHZwOF9wb3N0cHJvY19ibGVuZF9tYl9pbm5lciB2cDhfYmxlbmRfbWJfaW5uZXJfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jX2JsZW5kX21iX2lubmVyKHZwOF9wb3N0cHJvY19ibGVuZF9tYl9pbm5lcik7Ci0KLSNpZm5kZWYgdnA4X3Bvc3Rwcm9jX2JsZW5kX21iX291dGVyCi0jZGVmaW5lIHZwOF9wb3N0cHJvY19ibGVuZF9tYl9vdXRlciB2cDhfYmxlbmRfbWJfb3V0ZXJfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jX2JsZW5kX21iX291dGVyKHZwOF9wb3N0cHJvY19ibGVuZF9tYl9vdXRlcik7Ci0KLSNpZm5kZWYgdnA4X3Bvc3Rwcm9jX2JsZW5kX2IKLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2JsZW5kX2IgdnA4X2JsZW5kX2JfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jX2JsZW5kX2IodnA4X3Bvc3Rwcm9jX2JsZW5kX2IpOwotCi10eXBlZGVmIHByb3RvdHlwZV9wb3N0cHJvYygoKnZwOF9wb3N0cHJvY19mbl90KSk7Ci10eXBlZGVmIHByb3RvdHlwZV9wb3N0cHJvY19pbnBsYWNlKCgqdnA4X3Bvc3Rwcm9jX2lucGxhY2VfZm5fdCkpOwotdHlwZWRlZiBwcm90b3R5cGVfcG9zdHByb2NfYWRkbm9pc2UoKCp2cDhfcG9zdHByb2NfYWRkbm9pc2VfZm5fdCkpOwotdHlwZWRlZiBwcm90b3R5cGVfcG9zdHByb2NfYmxlbmRfbWJfaW5uZXIoKCp2cDhfcG9zdHByb2NfYmxlbmRfbWJfaW5uZXJfZm5fdCkpOwotdHlwZWRlZiBwcm90b3R5cGVfcG9zdHByb2NfYmxlbmRfbWJfb3V0ZXIoKCp2cDhfcG9zdHByb2NfYmxlbmRfbWJfb3V0ZXJfZm5fdCkpOwotdHlwZWRlZiBwcm90b3R5cGVfcG9zdHByb2NfYmxlbmRfYigoKnZwOF9wb3N0cHJvY19ibGVuZF9iX2ZuX3QpKTsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdnA4X3Bvc3Rwcm9jX2lucGxhY2VfZm5fdCAgICAgICAgICAgZG93bjsKLSAgICB2cDhfcG9zdHByb2NfaW5wbGFjZV9mbl90ICAgICAgICAgICBhY3Jvc3M7Ci0gICAgdnA4X3Bvc3Rwcm9jX2ZuX3QgICAgICAgICAgICAgICAgICAgZG93bmFjcm9zczsKLSAgICB2cDhfcG9zdHByb2NfYWRkbm9pc2VfZm5fdCAgICAgICAgICBhZGRub2lzZTsKLSAgICB2cDhfcG9zdHByb2NfYmxlbmRfbWJfaW5uZXJfZm5fdCAgICBibGVuZF9tYl9pbm5lcjsKLSAgICB2cDhfcG9zdHByb2NfYmxlbmRfbWJfb3V0ZXJfZm5fdCAgICBibGVuZF9tYl9vdXRlcjsKLSAgICB2cDhfcG9zdHByb2NfYmxlbmRfYl9mbl90ICAgICAgICAgICBibGVuZF9iOwotfSB2cDhfcG9zdHByb2NfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgUE9TVFBST0NfSU5WT0tFKGN0eCxmbikgKGN0eCktPmZuCi0jZWxzZQotI2RlZmluZSBQT1NUUFJPQ19JTlZPS0UoY3R4LGZuKSB2cDhfcG9zdHByb2NfIyNmbgotI2VuZGlmCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCi1zdHJ1Y3QgcG9zdHByb2Nfc3RhdGUKLXsKLSAgICBpbnQgICAgICAgICAgIGxhc3RfcTsKLSAgICBpbnQgICAgICAgICAgIGxhc3Rfbm9pc2U7Ci0gICAgY2hhciAgICAgICAgICBub2lzZVszMDcyXTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIGNoYXIsIGJsYWNrY2xhbXBbMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIGNoYXIsIHdoaXRlY2xhbXBbMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIGNoYXIsIGJvdGhjbGFtcFsxNl0pOwotfTsKLSNpbmNsdWRlICJvbnl4Y19pbnQuaCIKLSNpbmNsdWRlICJwcGZsYWdzLmgiCi1pbnQgdnA4X3Bvc3RfcHJvY19mcmFtZShzdHJ1Y3QgVlA4Q29tbW9uICpvY2ksIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9wcGZsYWdzX3QgKmZsYWdzKTsKLQotCi12b2lkIHZwOF9kZV9ub2lzZShZVjEyX0JVRkZFUl9DT05GSUcgICAgICAgICAqc291cmNlLAotICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAgICAgICAgKnBvc3QsCi0gICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfdmFyX3RocmVzaCwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLAotICAgICAgICAgICAgICAgICAgdnA4X3Bvc3Rwcm9jX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpOwotCi12b2lkIHZwOF9kZWJsb2NrKFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICAgICpwb3N0LAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcSwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxvd192YXJfdGhyZXNoLAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZywKLSAgICAgICAgICAgICAgICAgdnA4X3Bvc3Rwcm9jX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpOwotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3BwYy9sb29wZmlsdGVyX2FsdGl2ZWMuYyBiL3ZwOC9jb21tb24vcHBjL2xvb3BmaWx0ZXJfYWx0aXZlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjAyZmVlLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vcHBjL2xvb3BmaWx0ZXJfYWx0aXZlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAibG9vcGZpbHRlci5oIgotI2luY2x1ZGUgIm9ueXhjX2ludC5oIgotCi10eXBlZGVmIHZvaWQgbG9vcF9maWx0ZXJfZnVuY3Rpb25feV9wcGMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzLCAgIC8vIHNvdXJjZSBwb2ludGVyCi0gICAgaW50IHAsICAgICAgICAgICAgICAvLyBwaXRjaAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQsCi0gICAgY29uc3Qgc2lnbmVkIGNoYXIgKmxpbWl0LAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICp0aHJlc2gKLSk7Ci0KLXR5cGVkZWYgdm9pZCBsb29wX2ZpbHRlcl9mdW5jdGlvbl91dl9wcGMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICp1LCAgIC8vIHNvdXJjZSBwb2ludGVyCi0gICAgdW5zaWduZWQgY2hhciAqdiwgICAvLyBzb3VyY2UgcG9pbnRlcgotICAgIGludCBwLCAgICAgICAgICAgICAgLy8gcGl0Y2gKLSAgICBjb25zdCBzaWduZWQgY2hhciAqZmxpbWl0LAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICpsaW1pdCwKLSAgICBjb25zdCBzaWduZWQgY2hhciAqdGhyZXNoCi0pOwotCi10eXBlZGVmIHZvaWQgbG9vcF9maWx0ZXJfZnVuY3Rpb25fc19wcGMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzLCAgIC8vIHNvdXJjZSBwb2ludGVyCi0gICAgaW50IHAsICAgICAgICAgICAgICAvLyBwaXRjaAotICAgIGNvbnN0IHNpZ25lZCBjaGFyICpmbGltaXQKLSk7Ci0KLWxvb3BfZmlsdGVyX2Z1bmN0aW9uX3lfcHBjIG1ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfcHBjOwotbG9vcF9maWx0ZXJfZnVuY3Rpb25feV9wcGMgbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfcHBjOwotbG9vcF9maWx0ZXJfZnVuY3Rpb25feV9wcGMgbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfcHBjOwotbG9vcF9maWx0ZXJfZnVuY3Rpb25feV9wcGMgbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X3BwYzsKLQotbG9vcF9maWx0ZXJfZnVuY3Rpb25fdXZfcHBjIG1ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3BwYzsKLWxvb3BfZmlsdGVyX2Z1bmN0aW9uX3V2X3BwYyBtYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfcHBjOwotbG9vcF9maWx0ZXJfZnVuY3Rpb25fdXZfcHBjIGxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9wcGM7Ci1sb29wX2ZpbHRlcl9mdW5jdGlvbl91dl9wcGMgbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9wcGM7Ci0KLWxvb3BfZmlsdGVyX2Z1bmN0aW9uX3NfcHBjIGxvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfcHBjOwotbG9vcF9maWx0ZXJfZnVuY3Rpb25fc19wcGMgbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfcHBjOwotCi0vLyBIb3Jpem9udGFsIE1CIGZpbHRlcmluZwotdm9pZCBsb29wX2ZpbHRlcl9tYmhfcHBjKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZClzaW1wbGVyX2xwZjsKLSAgICBtYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICBtYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9wcGModV9wdHIsIHZfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOwotfQotCi12b2lkIGxvb3BfZmlsdGVyX21iaHNfcHBjKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpc2ltcGxlcl9scGY7Ci0gICAgKHZvaWQpdV9wdHI7Ci0gICAgKHZvaWQpdl9wdHI7Ci0gICAgKHZvaWQpdXZfc3RyaWRlOwotICAgIGxvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfcHBjKHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmZsaW0pOwotfQotCi0vLyBWZXJ0aWNhbCBNQiBGaWx0ZXJpbmcKLXZvaWQgbG9vcF9maWx0ZXJfbWJ2X3BwYyh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpc2ltcGxlcl9scGY7Ci0gICAgbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3lfcHBjKHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRocik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIG1ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9wcGModV9wdHIsIHZfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOwotfQotCi12b2lkIGxvb3BfZmlsdGVyX21idnNfcHBjKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpc2ltcGxlcl9scGY7Ci0gICAgKHZvaWQpdV9wdHI7Ci0gICAgKHZvaWQpdl9wdHI7Ci0gICAgKHZvaWQpdXZfc3RyaWRlOwotICAgIGxvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltKTsKLX0KLQotLy8gSG9yaXpvbnRhbCBCIEZpbHRlcmluZwotdm9pZCBsb29wX2ZpbHRlcl9iaF9wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpc2ltcGxlcl9scGY7Ci0gICAgLy8gVGhlc2Ugc2hvdWxkIGFsbCBiZSBkb25lIGF0IG9uY2Ugd2l0aCBvbmUgY2FsbCwgaW5zdGVhZCBvZiAzCi0gICAgbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3lfcHBjKHlfcHRyICsgNCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOwotICAgIGxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV95X3BwYyh5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKLSAgICBsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfeV9wcGMoeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICBsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfcHBjKHVfcHRyICsgNCAqIHV2X3N0cmlkZSwgdl9wdHIgKyA0ICogdXZfc3RyaWRlLCB1dl9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKLX0KLQotdm9pZCBsb29wX2ZpbHRlcl9iaHNfcHBjKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZClzaW1wbGVyX2xwZjsKLSAgICAodm9pZCl1X3B0cjsKLSAgICAodm9pZCl2X3B0cjsKLSAgICAodm9pZCl1dl9zdHJpZGU7Ci0gICAgbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9wcGMoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0pOwotICAgIGxvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfcHBjKHlfcHRyICsgOCAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltKTsKLSAgICBsb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3BwYyh5X3B0ciArIDEyICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0pOwotfQotCi0vLyBWZXJ0aWNhbCBCIEZpbHRlcmluZwotdm9pZCBsb29wX2ZpbHRlcl9idl9wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpc2ltcGxlcl9scGY7Ci0gICAgbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV95X3BwYyh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9wcGModV9wdHIgKyA0LCB2X3B0ciArIDQsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIpOwotfQotCi12b2lkIGxvb3BfZmlsdGVyX2J2c19wcGModW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKXNpbXBsZXJfbHBmOwotICAgICh2b2lkKXVfcHRyOwotICAgICh2b2lkKXZfcHRyOwotICAgICh2b2lkKXV2X3N0cmlkZTsKLSAgICBsb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9wcGMoeV9wdHIgKyA0LCAgeV9zdHJpZGUsIGxmaS0+ZmxpbSk7Ci0gICAgbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfcHBjKHlfcHRyICsgOCwgIHlfc3RyaWRlLCBsZmktPmZsaW0pOwotICAgIGxvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3BwYyh5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltKTsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcHBjL3N5c3RlbWRlcGVuZGVudC5jIGIvdnA4L2NvbW1vbi9wcGMvc3lzdGVtZGVwZW5kZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWQ3OTAuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9wcGMvc3lzdGVtZGVwZW5kZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJnX2NvbW1vbi5oIgotI2luY2x1ZGUgInN1YnBpeGVsLmgiCi0jaW5jbHVkZSAibG9vcGZpbHRlci5oIgotI2luY2x1ZGUgInJlY29uLmgiCi0jaW5jbHVkZSAiaWRjdC5oIgotI2luY2x1ZGUgIm9ueXhjX2ludC5oIgotCi12b2lkICgqdnA4X3Nob3J0X2lkY3Q0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLXZvaWQgKCp2cDhfc2hvcnRfaWRjdDR4NF8xKShzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci12b2lkICgqdnA4X2RjX29ubHlfaWRjdCkoc2hvcnQgaW5wdXRfZGMsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci0KLWV4dGVybiB2b2lkICgqdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3MpKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgcm93cywKLSAgICBpbnQgY29scywKLSAgICBpbnQgZmxpbWl0Ci0pOwotCi1leHRlcm4gdm9pZCAoKnZwOF9tYnBvc3RfcHJvY19kb3duKSh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZmxpbWl0KTsKLWV4dGVybiB2b2lkIHZwOF9tYnBvc3RfcHJvY19kb3duX2ModW5zaWduZWQgY2hhciAqZHN0LCBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scywgaW50IGZsaW1pdCk7Ci1leHRlcm4gdm9pZCAoKnZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXApKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHBpdGNoLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBmbGltaXQpOwotZXh0ZXJuIHZvaWQgdnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF9jKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHBpdGNoLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBmbGltaXQpOwotCi1leHRlcm4gdm9pZCB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19jCi0oCi0gICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCByb3dzLAotICAgIGludCBjb2xzLAotICAgIGludCBmbGltaXQKLSk7Ci12b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2VfYyh1bnNpZ25lZCBjaGFyICpTdGFydCwgdW5zaWduZWQgaW50IFdpZHRoLCB1bnNpZ25lZCBpbnQgSGVpZ2h0LCBpbnQgUGl0Y2gsIGludCBxLCBpbnQgYSk7Ci0KLWV4dGVybiBjb3B5X21lbV9ibG9ja19mdW5jdGlvbiAqdnA4X2NvcHlfbWVtMTZ4MTY7Ci1leHRlcm4gY29weV9tZW1fYmxvY2tfZnVuY3Rpb24gKnZwOF9jb3B5X21lbTh4ODsKLWV4dGVybiBjb3B5X21lbV9ibG9ja19mdW5jdGlvbiAqdnA4X2NvcHlfbWVtOHg0OwotCi0vLyBQUEMKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHNpeHRhcF9wcmVkaWN0X3BwYzsKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHNpeHRhcF9wcmVkaWN0OHg0X3BwYzsKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHNpeHRhcF9wcmVkaWN0OHg4X3BwYzsKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHNpeHRhcF9wcmVkaWN0MTZ4MTZfcHBjOwotZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gYmlsaW5lYXJfcHJlZGljdDR4NF9wcGM7Ci1leHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiBiaWxpbmVhcl9wcmVkaWN0OHg0X3BwYzsKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIGJpbGluZWFyX3ByZWRpY3Q4eDhfcHBjOwotZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gYmlsaW5lYXJfcHJlZGljdDE2eDE2X3BwYzsKLQotZXh0ZXJuIGNvcHlfbWVtX2Jsb2NrX2Z1bmN0aW9uIGNvcHlfbWVtMTZ4MTZfcHBjOwotCi12b2lkIHJlY29uX2JfcHBjKHNob3J0ICpkaWZmX3B0ciwgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBzdHJpZGUpOwotdm9pZCByZWNvbjJiX3BwYyhzaG9ydCAqZGlmZl9wdHIsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLCBpbnQgc3RyaWRlKTsKLXZvaWQgcmVjb240Yl9wcGMoc2hvcnQgKmRpZmZfcHRyLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHN0cmlkZSk7Ci0KLWV4dGVybiB2b2lkIHNob3J0X2lkY3Q0eDRsbG1fcHBjKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLQotLy8gR2VuZXJpYyBDCi1leHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiB2cDhfc2l4dGFwX3ByZWRpY3RfYzsKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9jOwotZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2M7Ci1leHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9jOwotZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYzsKLWV4dGVybiBzdWJwaXhlbF9wcmVkaWN0X2Z1bmN0aW9uIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X2M7Ci1leHRlcm4gc3VicGl4ZWxfcHJlZGljdF9mdW5jdGlvbiB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9jOwotZXh0ZXJuIHN1YnBpeGVsX3ByZWRpY3RfZnVuY3Rpb24gdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9jOwotCi1leHRlcm4gY29weV9tZW1fYmxvY2tfZnVuY3Rpb24gdnA4X2NvcHlfbWVtMTZ4MTZfYzsKLWV4dGVybiBjb3B5X21lbV9ibG9ja19mdW5jdGlvbiB2cDhfY29weV9tZW04eDhfYzsKLWV4dGVybiBjb3B5X21lbV9ibG9ja19mdW5jdGlvbiB2cDhfY29weV9tZW04eDRfYzsKLQotdm9pZCB2cDhfcmVjb25fYl9jKHNob3J0ICpkaWZmX3B0ciwgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBzdHJpZGUpOwotdm9pZCB2cDhfcmVjb24yYl9jKHNob3J0ICpkaWZmX3B0ciwgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBzdHJpZGUpOwotdm9pZCB2cDhfcmVjb240Yl9jKHNob3J0ICpkaWZmX3B0ciwgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBzdHJpZGUpOwotCi1leHRlcm4gdm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotZXh0ZXJuIHZvaWQgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci1leHRlcm4gdm9pZCB2cDhfZGNfb25seV9pZGN0X2Moc2hvcnQgaW5wdXRfZGMsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci0KLS8vIFBQQwotZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIGxvb3BfZmlsdGVyX21idl9wcGM7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gbG9vcF9maWx0ZXJfYnZfcHBjOwotZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIGxvb3BfZmlsdGVyX21iaF9wcGM7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gbG9vcF9maWx0ZXJfYmhfcHBjOwotCi1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gbG9vcF9maWx0ZXJfbWJ2c19wcGM7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gbG9vcF9maWx0ZXJfYnZzX3BwYzsKLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiBsb29wX2ZpbHRlcl9tYmhzX3BwYzsKLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiBsb29wX2ZpbHRlcl9iaHNfcHBjOwotCi0vLyBHZW5lcmljIEMKLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfbWJ2X2M7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX2J2X2M7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX21iaF9jOwotZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uIHZwOF9sb29wX2ZpbHRlcl9iaF9jOwotCi1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX21idnNfYzsKLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfYnZzX2M7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX21iaHNfYzsKLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiB2cDhfbG9vcF9maWx0ZXJfYmhzX2M7Ci0KLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiAqdnA4X2xmX21idmZ1bGw7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gKnZwOF9sZl9tYmhmdWxsOwotZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uICp2cDhfbGZfYnZmdWxsOwotZXh0ZXJuIGxvb3BfZmlsdGVyX2Jsb2NrX2Z1bmN0aW9uICp2cDhfbGZfYmhmdWxsOwotCi1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gKnZwOF9sZl9tYnZzaW1wbGU7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gKnZwOF9sZl9tYmhzaW1wbGU7Ci1leHRlcm4gbG9vcF9maWx0ZXJfYmxvY2tfZnVuY3Rpb24gKnZwOF9sZl9idnNpbXBsZTsKLWV4dGVybiBsb29wX2ZpbHRlcl9ibG9ja19mdW5jdGlvbiAqdnA4X2xmX2Joc2ltcGxlOwotCi12b2lkIHZwOF9jbGVhcl9jKHZvaWQpCi17Ci19Ci0KLXZvaWQgdnA4X21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKHZvaWQpCi17Ci0gICAgLy8gUHVyZSBDOgotICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUgICAgICAgICAgICAgICAgPSB2cDhfY2xlYXJfYzsKLSAgICB2cDhfcmVjb25fYiAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2cDhfcmVjb25fYl9jOwotICAgIHZwOF9yZWNvbjRiICAgICAgICAgICAgICAgICAgICAgICAgID0gdnA4X3JlY29uNGJfYzsKLSAgICB2cDhfcmVjb24yYiAgICAgICAgICAgICAgICAgICAgICAgICA9IHZwOF9yZWNvbjJiX2M7Ci0KLSAgICB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2ICAgICAgICAgICAgPSBiaWxpbmVhcl9wcmVkaWN0MTZ4MTZfcHBjOwotICAgIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4ICAgICAgICAgICAgICA9IGJpbGluZWFyX3ByZWRpY3Q4eDhfcHBjOwotICAgIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0ICAgICAgICAgICAgICA9IGJpbGluZWFyX3ByZWRpY3Q4eDRfcHBjOwotICAgIHZwOF9iaWxpbmVhcl9wcmVkaWN0ICAgICAgICAgICAgICAgICA9IGJpbGluZWFyX3ByZWRpY3Q0eDRfcHBjOwotCi0gICAgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTYgICAgICAgICAgICAgID0gc2l4dGFwX3ByZWRpY3QxNngxNl9wcGM7Ci0gICAgdnA4X3NpeHRhcF9wcmVkaWN0OHg4ICAgICAgICAgICAgICAgID0gc2l4dGFwX3ByZWRpY3Q4eDhfcHBjOwotICAgIHZwOF9zaXh0YXBfcHJlZGljdDh4NCAgICAgICAgICAgICAgICA9IHNpeHRhcF9wcmVkaWN0OHg0X3BwYzsKLSAgICB2cDhfc2l4dGFwX3ByZWRpY3QgICAgICAgICAgICAgICAgICAgPSBzaXh0YXBfcHJlZGljdF9wcGM7Ci0KLSAgICB2cDhfc2hvcnRfaWRjdDR4NF8xICAgICAgICAgICAgICAgICAgPSB2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX2M7Ci0gICAgdnA4X3Nob3J0X2lkY3Q0eDQgICAgICAgICAgICAgICAgICAgID0gc2hvcnRfaWRjdDR4NGxsbV9wcGM7Ci0gICAgdnA4X2RjX29ubHlfaWRjdCAgICAgICAgICAgICAgICAgICAgICA9IHZwOF9kY19vbmx5X2lkY3RfYzsKLQotICAgIHZwOF9sZl9tYnZmdWxsICAgICAgICAgICAgICAgICAgICAgICA9IGxvb3BfZmlsdGVyX21idl9wcGM7Ci0gICAgdnA4X2xmX2J2ZnVsbCAgICAgICAgICAgICAgICAgICAgICAgID0gbG9vcF9maWx0ZXJfYnZfcHBjOwotICAgIHZwOF9sZl9tYmhmdWxsICAgICAgICAgICAgICAgICAgICAgICA9IGxvb3BfZmlsdGVyX21iaF9wcGM7Ci0gICAgdnA4X2xmX2JoZnVsbCAgICAgICAgICAgICAgICAgICAgICAgID0gbG9vcF9maWx0ZXJfYmhfcHBjOwotCi0gICAgdnA4X2xmX21idnNpbXBsZSAgICAgICAgICAgICAgICAgICAgID0gbG9vcF9maWx0ZXJfbWJ2c19wcGM7Ci0gICAgdnA4X2xmX2J2c2ltcGxlICAgICAgICAgICAgICAgICAgICAgID0gbG9vcF9maWx0ZXJfYnZzX3BwYzsKLSAgICB2cDhfbGZfbWJoc2ltcGxlICAgICAgICAgICAgICAgICAgICAgPSBsb29wX2ZpbHRlcl9tYmhzX3BwYzsKLSAgICB2cDhfbGZfYmhzaW1wbGUgICAgICAgICAgICAgICAgICAgICAgPSBsb29wX2ZpbHRlcl9iaHNfcHBjOwotCi0gICAgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3MgICAgICAgICAgID0gdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfYzsKLSAgICB2cDhfbWJwb3N0X3Byb2NfZG93biAgICAgICAgICAgICAgICAgID0gdnA4X21icG9zdF9wcm9jX2Rvd25fYzsKLSAgICB2cDhfbWJwb3N0X3Byb2NfYWNyb3NzX2lwICAgICAgICAgICAgICA9IHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfYzsKLSAgICB2cDhfcGxhbmVfYWRkX25vaXNlICAgICAgICAgICAgICAgICAgID0gdnA4X3BsYW5lX2FkZF9ub2lzZV9jOwotCi0gICAgdnA4X2NvcHlfbWVtMTZ4MTYgICAgICAgICAgICAgICAgICAgID0gY29weV9tZW0xNngxNl9wcGM7Ci0gICAgdnA4X2NvcHlfbWVtOHg4ICAgICAgICAgICAgICAgICAgICAgID0gdnA4X2NvcHlfbWVtOHg4X2M7Ci0gICAgdnA4X2NvcHlfbWVtOHg0ICAgICAgICAgICAgICAgICAgICAgID0gdnA4X2NvcHlfbWVtOHg0X2M7Ci0KLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcHBmbGFncy5oIGIvdnA4L2NvbW1vbi9wcGZsYWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjBjYWIuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9wcGZsYWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19QUEZMQUdTX0gKLSNkZWZpbmUgX19JTkNfUFBGTEFHU19ICi1lbnVtCi17Ci0gICAgVlA4RF9OT0ZJTFRFUklORyAgICAgICAgICAgID0gMCwKLSAgICBWUDhEX0RFQkxPQ0sgICAgICAgICAgICAgICAgPSAxPDwwLAotICAgIFZQOERfREVNQUNST0JMT0NLICAgICAgICAgICA9IDE8PDEsCi0gICAgVlA4RF9BREROT0lTRSAgICAgICAgICAgICAgID0gMTw8MiwKLSAgICBWUDhEX0RFQlVHX1RYVF9GUkFNRV9JTkZPICAgPSAxPDwzLAotICAgIFZQOERfREVCVUdfVFhUX01CTEtfTU9ERVMgICA9IDE8PDQsCi0gICAgVlA4RF9ERUJVR19UWFRfRENfRElGRiAgICAgID0gMTw8NSwKLSAgICBWUDhEX0RFQlVHX1RYVF9SQVRFX0lORk8gICAgPSAxPDw2LAotICAgIFZQOERfREVCVUdfRFJBV19NViAgICAgICAgICA9IDE8PDcsCi0gICAgVlA4RF9ERUJVR19DTFJfQkxLX01PREVTICAgID0gMTw8OCwKLSAgICBWUDhEX0RFQlVHX0NMUl9GUk1fUkVGX0JMS1MgPSAxPDw5Ci19OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludCBwb3N0X3Byb2NfZmxhZzsKLSAgICBpbnQgZGVibG9ja2luZ19sZXZlbDsKLSAgICBpbnQgbm9pc2VfbGV2ZWw7Ci0gICAgaW50IGRpc3BsYXlfcmVmX2ZyYW1lX2ZsYWc7Ci0gICAgaW50IGRpc3BsYXlfbWJfbW9kZXNfZmxhZzsKLSAgICBpbnQgZGlzcGxheV9iX21vZGVzX2ZsYWc7Ci0gICAgaW50IGRpc3BsYXlfbXZfZmxhZzsKLX0gdnA4X3BwZmxhZ3NfdDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3F1YW50X2NvbW1vbi5jIGIvdnA4L2NvbW1vbi9xdWFudF9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4MzNmZS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3F1YW50X2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAicXVhbnRfY29tbW9uLmgiCi0KLXN0YXRpYyBjb25zdCBpbnQgZGNfcWxvb2t1cFtRSU5ERVhfUkFOR0VdID0KLXsKLSAgICA0LCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE3LAotICAgIDE4LCAgIDE5LCAgIDIwLCAgIDIwLCAgIDIxLCAgIDIxLCAgIDIyLCAgIDIyLCAgIDIzLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LAotICAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLAotICAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLCAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LAotICAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LCAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LAotICAgIDc1LCAgIDc2LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLCAgIDgyLCAgIDgzLCAgIDg0LCAgIDg1LCAgIDg2LCAgIDg3LCAgIDg4LCAgIDg5LAotICAgIDkxLCAgIDkzLCAgIDk1LCAgIDk2LCAgIDk4LCAgMTAwLCAgMTAxLCAgMTAyLCAgMTA0LCAgMTA2LCAgMTA4LCAgMTEwLCAgMTEyLCAgMTE0LCAgMTE2LCAgMTE4LAotICAgIDEyMiwgIDEyNCwgIDEyNiwgIDEyOCwgIDEzMCwgIDEzMiwgIDEzNCwgIDEzNiwgIDEzOCwgIDE0MCwgIDE0MywgIDE0NSwgIDE0OCwgIDE1MSwgIDE1NCwgIDE1NywKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgYWNfcWxvb2t1cFtRSU5ERVhfUkFOR0VdID0KLXsKLSAgICA0LCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LAotICAgIDIwLCAgIDIxLCAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LAotICAgIDM2LCAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAotICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDYwLCAgIDYyLCAgIDY0LCAgIDY2LCAgIDY4LCAgIDcwLCAgIDcyLCAgIDc0LCAgIDc2LAotICAgIDc4LCAgIDgwLCAgIDgyLCAgIDg0LCAgIDg2LCAgIDg4LCAgIDkwLCAgIDkyLCAgIDk0LCAgIDk2LCAgIDk4LCAgMTAwLCAgMTAyLCAgMTA0LCAgMTA2LCAgMTA4LAotICAgIDExMCwgIDExMiwgIDExNCwgIDExNiwgIDExOSwgIDEyMiwgIDEyNSwgIDEyOCwgIDEzMSwgIDEzNCwgIDEzNywgIDE0MCwgIDE0MywgIDE0NiwgIDE0OSwgIDE1MiwKLSAgICAxNTUsICAxNTgsICAxNjEsICAxNjQsICAxNjcsICAxNzAsICAxNzMsICAxNzcsICAxODEsICAxODUsICAxODksICAxOTMsICAxOTcsICAyMDEsICAyMDUsICAyMDksCi0gICAgMjEzLCAgMjE3LCAgMjIxLCAgMjI1LCAgMjI5LCAgMjM0LCAgMjM5LCAgMjQ1LCAgMjQ5LCAgMjU0LCAgMjU5LCAgMjY0LCAgMjY5LCAgMjc0LCAgMjc5LCAgMjg0LAotfTsKLQotCi1pbnQgdnA4X2RjX3F1YW50KGludCBRSW5kZXgsIGludCBEZWx0YSkKLXsKLSAgICBpbnQgcmV0dmFsOwotCi0gICAgUUluZGV4ID0gUUluZGV4ICsgRGVsdGE7Ci0KLSAgICBpZiAoUUluZGV4ID4gMTI3KQotICAgICAgICBRSW5kZXggPSAxMjc7Ci0gICAgZWxzZSBpZiAoUUluZGV4IDwgMCkKLSAgICAgICAgUUluZGV4ID0gMDsKLQotICAgIHJldHZhbCA9IGRjX3Fsb29rdXBbIFFJbmRleCBdOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLWludCB2cDhfZGMycXVhbnQoaW50IFFJbmRleCwgaW50IERlbHRhKQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICBRSW5kZXggPSBRSW5kZXggKyBEZWx0YTsKLQotICAgIGlmIChRSW5kZXggPiAxMjcpCi0gICAgICAgIFFJbmRleCA9IDEyNzsKLSAgICBlbHNlIGlmIChRSW5kZXggPCAwKQotICAgICAgICBRSW5kZXggPSAwOwotCi0gICAgcmV0dmFsID0gZGNfcWxvb2t1cFsgUUluZGV4IF0gKiAyOwotICAgIHJldHVybiByZXR2YWw7Ci0KLX0KLWludCB2cDhfZGNfdXZfcXVhbnQoaW50IFFJbmRleCwgaW50IERlbHRhKQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICBRSW5kZXggPSBRSW5kZXggKyBEZWx0YTsKLQotICAgIGlmIChRSW5kZXggPiAxMjcpCi0gICAgICAgIFFJbmRleCA9IDEyNzsKLSAgICBlbHNlIGlmIChRSW5kZXggPCAwKQotICAgICAgICBRSW5kZXggPSAwOwotCi0gICAgcmV0dmFsID0gZGNfcWxvb2t1cFsgUUluZGV4IF07Ci0KLSAgICBpZiAocmV0dmFsID4gMTMyKQotICAgICAgICByZXR2YWwgPSAxMzI7Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgdnA4X2FjX3lxdWFudChpbnQgUUluZGV4KQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICBpZiAoUUluZGV4ID4gMTI3KQotICAgICAgICBRSW5kZXggPSAxMjc7Ci0gICAgZWxzZSBpZiAoUUluZGV4IDwgMCkKLSAgICAgICAgUUluZGV4ID0gMDsKLQotICAgIHJldHZhbCA9IGFjX3Fsb29rdXBbIFFJbmRleCBdOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLWludCB2cDhfYWMycXVhbnQoaW50IFFJbmRleCwgaW50IERlbHRhKQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICBRSW5kZXggPSBRSW5kZXggKyBEZWx0YTsKLQotICAgIGlmIChRSW5kZXggPiAxMjcpCi0gICAgICAgIFFJbmRleCA9IDEyNzsKLSAgICBlbHNlIGlmIChRSW5kZXggPCAwKQotICAgICAgICBRSW5kZXggPSAwOwotCi0gICAgcmV0dmFsID0gKGFjX3Fsb29rdXBbIFFJbmRleCBdICogMTU1KSAvIDEwMDsKLQotICAgIGlmIChyZXR2YWwgPCA4KQotICAgICAgICByZXR2YWwgPSA4OwotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLWludCB2cDhfYWNfdXZfcXVhbnQoaW50IFFJbmRleCwgaW50IERlbHRhKQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICBRSW5kZXggPSBRSW5kZXggKyBEZWx0YTsKLQotICAgIGlmIChRSW5kZXggPiAxMjcpCi0gICAgICAgIFFJbmRleCA9IDEyNzsKLSAgICBlbHNlIGlmIChRSW5kZXggPCAwKQotICAgICAgICBRSW5kZXggPSAwOwotCi0gICAgcmV0dmFsID0gYWNfcWxvb2t1cFsgUUluZGV4IF07Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcmVjb24uYyBiL3ZwOC9jb21tb24vcmVjb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyZDZlNC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3JlY29uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAicmVjb24uaCIKLSNpbmNsdWRlICJibG9ja2QuaCIKLQotdm9pZCB2cDhfcmVjb25fYl9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIsCi0gICAgc2hvcnQgKmRpZmZfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IHN0cmlkZQotKQotewotICAgIGludCByLCBjOwotCi0gICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhID0gZGlmZl9wdHJbY10gKyBwcmVkX3B0cltjXSA7Ci0KLSAgICAgICAgICAgIGlmIChhIDwgMCkKLSAgICAgICAgICAgICAgICBhID0gMDsKLQotICAgICAgICAgICAgaWYgKGEgPiAyNTUpCi0gICAgICAgICAgICAgICAgYSA9IDI1NTsKLQotICAgICAgICAgICAgZHN0X3B0cltjXSA9ICh1bnNpZ25lZCBjaGFyKSBhIDsKLSAgICAgICAgfQotCi0gICAgICAgIGRzdF9wdHIgKz0gc3RyaWRlOwotICAgICAgICBkaWZmX3B0ciArPSAxNjsKLSAgICAgICAgcHJlZF9wdHIgKz0gMTY7Ci0gICAgfQotfQotCi12b2lkIHZwOF9yZWNvbjRiX2MKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwKLSAgICBzaG9ydCAqZGlmZl9wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgc3RyaWRlCi0pCi17Ci0gICAgaW50IHIsIGM7Ci0KLSAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQotICAgIHsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IDE2OyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhID0gZGlmZl9wdHJbY10gKyBwcmVkX3B0cltjXSA7Ci0KLSAgICAgICAgICAgIGlmIChhIDwgMCkKLSAgICAgICAgICAgICAgICBhID0gMDsKLQotICAgICAgICAgICAgaWYgKGEgPiAyNTUpCi0gICAgICAgICAgICAgICAgYSA9IDI1NTsKLQotICAgICAgICAgICAgZHN0X3B0cltjXSA9ICh1bnNpZ25lZCBjaGFyKSBhIDsKLSAgICAgICAgfQotCi0gICAgICAgIGRzdF9wdHIgKz0gc3RyaWRlOwotICAgICAgICBkaWZmX3B0ciArPSAxNjsKLSAgICAgICAgcHJlZF9wdHIgKz0gMTY7Ci0gICAgfQotfQotCi12b2lkIHZwOF9yZWNvbjJiX2MKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwKLSAgICBzaG9ydCAqZGlmZl9wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgc3RyaWRlCi0pCi17Ci0gICAgaW50IHIsIGM7Ci0KLSAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQotICAgIHsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IDg7IGMrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGEgPSBkaWZmX3B0cltjXSArIHByZWRfcHRyW2NdIDsKLQotICAgICAgICAgICAgaWYgKGEgPCAwKQotICAgICAgICAgICAgICAgIGEgPSAwOwotCi0gICAgICAgICAgICBpZiAoYSA+IDI1NSkKLSAgICAgICAgICAgICAgICBhID0gMjU1OwotCi0gICAgICAgICAgICBkc3RfcHRyW2NdID0gKHVuc2lnbmVkIGNoYXIpIGEgOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0X3B0ciArPSBzdHJpZGU7Ci0gICAgICAgIGRpZmZfcHRyICs9IDg7Ci0gICAgICAgIHByZWRfcHRyICs9IDg7Ci0gICAgfQotfQotCi12b2lkIHZwOF9yZWNvbl9tYnlfYyhjb25zdCB2cDhfcmVjb25fcnRjZF92dGFibGVfdCAqcnRjZCwgTUFDUk9CTE9DS0QgKngpCi17Ci0jaWYgQVJDSF9BUk0KLSAgICBCTE9DS0QgKmIgPSAmeC0+YmxvY2tbMF07Ci0gICAgUkVDT05fSU5WT0tFKHJ0Y2QsIHJlY29uNCkoYi0+cHJlZGljdG9yLCBiLT5kaWZmLCAqKGItPmJhc2VfZHN0KSArIGItPmRzdCwgYi0+ZHN0X3N0cmlkZSk7Ci0KLSAgICAvKmIgPSAmeC0+YmxvY2tbNF07Ki8KLSAgICBiICs9IDQ7Ci0gICAgUkVDT05fSU5WT0tFKHJ0Y2QsIHJlY29uNCkoYi0+cHJlZGljdG9yLCBiLT5kaWZmLCAqKGItPmJhc2VfZHN0KSArIGItPmRzdCwgYi0+ZHN0X3N0cmlkZSk7Ci0KLSAgICAvKmIgPSAmeC0+YmxvY2tbOF07Ki8KLSAgICBiICs9IDQ7Ci0gICAgUkVDT05fSU5WT0tFKHJ0Y2QsIHJlY29uNCkoYi0+cHJlZGljdG9yLCBiLT5kaWZmLCAqKGItPmJhc2VfZHN0KSArIGItPmRzdCwgYi0+ZHN0X3N0cmlkZSk7Ci0KLSAgICAvKmIgPSAmeC0+YmxvY2tbMTJdOyovCi0gICAgYiArPSA0OwotICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjQpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotI2Vsc2UKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSA0KQotICAgIHsKLSAgICAgICAgQkxPQ0tEICpiID0gJngtPmJsb2NrW2ldOwotCi0gICAgICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjQpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotICAgIH0KLSNlbmRpZgotfQotCi12b2lkIHZwOF9yZWNvbl9tYl9jKGNvbnN0IHZwOF9yZWNvbl9ydGNkX3Z0YWJsZV90ICpydGNkLCBNQUNST0JMT0NLRCAqeCkKLXsKLSNpZiBBUkNIX0FSTQotICAgIEJMT0NLRCAqYiA9ICZ4LT5ibG9ja1swXTsKLQotICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjQpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotICAgIGIgKz0gNDsKLSAgICBSRUNPTl9JTlZPS0UocnRjZCwgcmVjb240KShiLT5wcmVkaWN0b3IsIGItPmRpZmYsICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0LCBiLT5kc3Rfc3RyaWRlKTsKLSAgICBiICs9IDQ7Ci0gICAgUkVDT05fSU5WT0tFKHJ0Y2QsIHJlY29uNCkoYi0+cHJlZGljdG9yLCBiLT5kaWZmLCAqKGItPmJhc2VfZHN0KSArIGItPmRzdCwgYi0+ZHN0X3N0cmlkZSk7Ci0gICAgYiArPSA0OwotICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjQpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotICAgIGIgKz0gNDsKLQotICAgIC8qYiA9ICZ4LT5ibG9ja1sxNl07Ki8KLQotICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjIpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotICAgIGIrKzsKLSAgICBiKys7Ci0gICAgUkVDT05fSU5WT0tFKHJ0Y2QsIHJlY29uMikoYi0+cHJlZGljdG9yLCBiLT5kaWZmLCAqKGItPmJhc2VfZHN0KSArIGItPmRzdCwgYi0+ZHN0X3N0cmlkZSk7Ci0gICAgYisrOwotICAgIGIrKzsKLSAgICBSRUNPTl9JTlZPS0UocnRjZCwgcmVjb24yKShiLT5wcmVkaWN0b3IsIGItPmRpZmYsICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0LCBiLT5kc3Rfc3RyaWRlKTsKLSAgICBiKys7Ci0gICAgYisrOwotICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjIpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotI2Vsc2UKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSA0KQotICAgIHsKLSAgICAgICAgQkxPQ0tEICpiID0gJngtPmJsb2NrW2ldOwotCi0gICAgICAgIFJFQ09OX0lOVk9LRShydGNkLCByZWNvbjQpKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotICAgIH0KLQotICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkgKz0gMikKLSAgICB7Ci0gICAgICAgIEJMT0NLRCAqYiA9ICZ4LT5ibG9ja1tpXTsKLQotICAgICAgICBSRUNPTl9JTlZPS0UocnRjZCwgcmVjb24yKShiLT5wcmVkaWN0b3IsIGItPmRpZmYsICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0LCBiLT5kc3Rfc3RyaWRlKTsKLSAgICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcmVjb24uaCBiL3ZwOC9jb21tb24vcmVjb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhMWNhMS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3JlY29uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfUkVDT05fSAotI2RlZmluZSBfX0lOQ19SRUNPTl9ICi0KLSNpbmNsdWRlICJibG9ja2QuaCIKLQotI2RlZmluZSBwcm90b3R5cGVfY29weV9ibG9jayhzeW0pIFwKLSAgICB2b2lkIHN5bSh1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCkKLQotI2RlZmluZSBwcm90b3R5cGVfcmVjb25fYmxvY2soc3ltKSBcCi0gICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqcHJlZCwgc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHBpdGNoKQotCi0jZGVmaW5lIHByb3RvdHlwZV9yZWNvbl9tYWNyb2Jsb2NrKHN5bSkgXAotICAgIHZvaWQgc3ltKGNvbnN0IHN0cnVjdCB2cDhfcmVjb25fcnRjZF92dGFibGUgKnJ0Y2QsIE1BQ1JPQkxPQ0tEICp4KQotCi0jZGVmaW5lIHByb3RvdHlwZV9idWlsZF9pbnRyYV9wcmVkaWN0b3JzKHN5bSkgXAotICAgIHZvaWQgc3ltKE1BQ1JPQkxPQ0tEICp4KQotCi1zdHJ1Y3QgdnA4X3JlY29uX3J0Y2RfdnRhYmxlOwotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvcmVjb25feDg2LmgiCi0jZW5kaWYKLQotI2lmIEFSQ0hfQVJNCi0jaW5jbHVkZSAiYXJtL3JlY29uX2FybS5oIgotI2VuZGlmCi0KLSNpZiBBUkNIX01JUFMKLSNpZiBkZWZpbmVkKE1JUFNfRFNQX1JFVikgJiYgTUlQU19EU1BfUkVWPj0xCi0jaW5jbHVkZSAibWlwcy9yZWNvbl9taXBzLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIHZwOF9yZWNvbl9jb3B5MTZ4MTYKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHkxNngxNiB2cDhfY29weV9tZW0xNngxNl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfY29weV9ibG9jayh2cDhfcmVjb25fY29weTE2eDE2KTsKLQotI2lmbmRlZiB2cDhfcmVjb25fY29weTh4OAotI2RlZmluZSB2cDhfcmVjb25fY29weTh4OCB2cDhfY29weV9tZW04eDhfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X3JlY29uX2NvcHk4eDgpOwotCi0jaWZuZGVmIHZwOF9yZWNvbl9jb3B5OHg0Ci0jZGVmaW5lIHZwOF9yZWNvbl9jb3B5OHg0IHZwOF9jb3B5X21lbTh4NF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfY29weV9ibG9jayh2cDhfcmVjb25fY29weTh4NCk7Ci0KLSNpZm5kZWYgdnA4X3JlY29uX3JlY29uCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbiB2cDhfcmVjb25fYl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfcmVjb25fYmxvY2sodnA4X3JlY29uX3JlY29uKTsKLQotI2lmbmRlZiB2cDhfcmVjb25fcmVjb24yCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbjIgdnA4X3JlY29uMmJfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3JlY29uX2Jsb2NrKHZwOF9yZWNvbl9yZWNvbjIpOwotCi0jaWZuZGVmIHZwOF9yZWNvbl9yZWNvbjQKLSNkZWZpbmUgdnA4X3JlY29uX3JlY29uNCB2cDhfcmVjb240Yl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfcmVjb25fYmxvY2sodnA4X3JlY29uX3JlY29uNCk7Ci0KLSNpZm5kZWYgdnA4X3JlY29uX3JlY29uX21iCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbl9tYiB2cDhfcmVjb25fbWJfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3JlY29uX21hY3JvYmxvY2sodnA4X3JlY29uX3JlY29uX21iKTsKLQotI2lmbmRlZiB2cDhfcmVjb25fcmVjb25fbWJ5Ci0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbl9tYnkgdnA4X3JlY29uX21ieV9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfcmVjb25fbWFjcm9ibG9jayh2cDhfcmVjb25fcmVjb25fbWJ5KTsKLQotI2lmbmRlZiB2cDhfcmVjb25fYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkKLSNkZWZpbmUgdnA4X3JlY29uX2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5IHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieQotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2J1aWxkX2ludHJhX3ByZWRpY3RvcnNcCi0gICAgKHZwOF9yZWNvbl9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieSk7Ci0KLSNpZm5kZWYgdnA4X3JlY29uX2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MKLSNkZWZpbmUgdnA4X3JlY29uX2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9idWlsZF9pbnRyYV9wcmVkaWN0b3JzXAotICAgICh2cDhfcmVjb25fYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyk7Ci0KLQotdHlwZWRlZiBwcm90b3R5cGVfY29weV9ibG9jaygoKnZwOF9jb3B5X2Jsb2NrX2ZuX3QpKTsKLXR5cGVkZWYgcHJvdG90eXBlX3JlY29uX2Jsb2NrKCgqdnA4X3JlY29uX2ZuX3QpKTsKLXR5cGVkZWYgcHJvdG90eXBlX3JlY29uX21hY3JvYmxvY2soKCp2cDhfcmVjb25fbWJfZm5fdCkpOwotdHlwZWRlZiBwcm90b3R5cGVfYnVpbGRfaW50cmFfcHJlZGljdG9ycygoKnZwOF9idWlsZF9pbnRyYV9wcmVkX2ZuX3QpKTsKLXR5cGVkZWYgc3RydWN0IHZwOF9yZWNvbl9ydGNkX3Z0YWJsZQotewotICAgIHZwOF9jb3B5X2Jsb2NrX2ZuX3QgIGNvcHkxNngxNjsKLSAgICB2cDhfY29weV9ibG9ja19mbl90ICBjb3B5OHg4OwotICAgIHZwOF9jb3B5X2Jsb2NrX2ZuX3QgIGNvcHk4eDQ7Ci0gICAgdnA4X3JlY29uX2ZuX3QgICAgICAgcmVjb247Ci0gICAgdnA4X3JlY29uX2ZuX3QgICAgICAgcmVjb24yOwotICAgIHZwOF9yZWNvbl9mbl90ICAgICAgIHJlY29uNDsKLSAgICB2cDhfcmVjb25fbWJfZm5fdCAgICByZWNvbl9tYjsKLSAgICB2cDhfcmVjb25fbWJfZm5fdCAgICByZWNvbl9tYnk7Ci0gICAgdnA4X2J1aWxkX2ludHJhX3ByZWRfZm5fdCAgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfczsKLSAgICB2cDhfYnVpbGRfaW50cmFfcHJlZF9mbl90ICBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieTsKLX0gdnA4X3JlY29uX3J0Y2RfdnRhYmxlX3Q7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIFJFQ09OX0lOVk9LRShjdHgsZm4pIChjdHgpLT5mbgotI2Vsc2UKLSNkZWZpbmUgUkVDT05fSU5WT0tFKGN0eCxmbikgdnA4X3JlY29uXyMjZm4KLSNlbmRpZgotCi12b2lkIHZwOF9yZWNvbl9pbnRyYV9tYnV2KGNvbnN0IHZwOF9yZWNvbl9ydGNkX3Z0YWJsZV90ICpydGNkLCBNQUNST0JMT0NLRCAqeCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24vcmVjb25pbnRlci5jIGIvdnA4L2NvbW1vbi9yZWNvbmludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmFiNDEuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9yZWNvbmludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAicmVjb24uaCIKLSNpbmNsdWRlICJzdWJwaXhlbC5oIgotI2luY2x1ZGUgImJsb2NrZC5oIgotI2luY2x1ZGUgInJlY29uaW50ZXIuaCIKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jaW5jbHVkZSAib255eGNfaW50LmgiCi0jZW5kaWYKLQotLyogdXNlIHRoaXMgZGVmaW5lIG9uIHN5c3RlbXMgd2hlcmUgdW5hbGlnbmVkIGludCByZWFkcyBhbmQgd3JpdGVzIGFyZQotICogbm90IGFsbG93ZWQsIGkuZS4gQVJNIGFyY2hpdGVjdHVyZXMKLSAqLwotLyojZGVmaW5lIE1VU1RfQkVfQUxJR05FRCovCi0KLQotc3RhdGljIGNvbnN0IGludCBiYmJbNF0gPSB7MCwgMiwgOCwgMTB9OwotCi0KLQotdm9pZCB2cDhfY29weV9tZW0xNngxNl9jKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKLSAgICBpbnQgc3JjX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgaW50IGRzdF9zdHJpZGUpCi17Ci0KLSAgICBpbnQgcjsKLQotICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgIHsKLSNpZmRlZiBNVVNUX0JFX0FMSUdORUQKLSAgICAgICAgZHN0WzBdID0gc3JjWzBdOwotICAgICAgICBkc3RbMV0gPSBzcmNbMV07Ci0gICAgICAgIGRzdFsyXSA9IHNyY1syXTsKLSAgICAgICAgZHN0WzNdID0gc3JjWzNdOwotICAgICAgICBkc3RbNF0gPSBzcmNbNF07Ci0gICAgICAgIGRzdFs1XSA9IHNyY1s1XTsKLSAgICAgICAgZHN0WzZdID0gc3JjWzZdOwotICAgICAgICBkc3RbN10gPSBzcmNbN107Ci0gICAgICAgIGRzdFs4XSA9IHNyY1s4XTsKLSAgICAgICAgZHN0WzldID0gc3JjWzldOwotICAgICAgICBkc3RbMTBdID0gc3JjWzEwXTsKLSAgICAgICAgZHN0WzExXSA9IHNyY1sxMV07Ci0gICAgICAgIGRzdFsxMl0gPSBzcmNbMTJdOwotICAgICAgICBkc3RbMTNdID0gc3JjWzEzXTsKLSAgICAgICAgZHN0WzE0XSA9IHNyY1sxNF07Ci0gICAgICAgIGRzdFsxNV0gPSBzcmNbMTVdOwotCi0jZWxzZQotICAgICAgICAoKGludCAqKWRzdClbMF0gPSAoKGludCAqKXNyYylbMF0gOwotICAgICAgICAoKGludCAqKWRzdClbMV0gPSAoKGludCAqKXNyYylbMV0gOwotICAgICAgICAoKGludCAqKWRzdClbMl0gPSAoKGludCAqKXNyYylbMl0gOwotICAgICAgICAoKGludCAqKWRzdClbM10gPSAoKGludCAqKXNyYylbM10gOwotCi0jZW5kaWYKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotCi0gICAgfQotCi19Ci0KLXZvaWQgdnA4X2NvcHlfbWVtOHg4X2MoCi0gICAgdW5zaWduZWQgY2hhciAqc3JjLAotICAgIGludCBzcmNfc3RyaWRlLAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLSAgICBpbnQgZHN0X3N0cmlkZSkKLXsKLSAgICBpbnQgcjsKLQotICAgIGZvciAociA9IDA7IHIgPCA4OyByKyspCi0gICAgewotI2lmZGVmIE1VU1RfQkVfQUxJR05FRAotICAgICAgICBkc3RbMF0gPSBzcmNbMF07Ci0gICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKLSAgICAgICAgZHN0WzJdID0gc3JjWzJdOwotICAgICAgICBkc3RbM10gPSBzcmNbM107Ci0gICAgICAgIGRzdFs0XSA9IHNyY1s0XTsKLSAgICAgICAgZHN0WzVdID0gc3JjWzVdOwotICAgICAgICBkc3RbNl0gPSBzcmNbNl07Ci0gICAgICAgIGRzdFs3XSA9IHNyY1s3XTsKLSNlbHNlCi0gICAgICAgICgoaW50ICopZHN0KVswXSA9ICgoaW50ICopc3JjKVswXSA7Ci0gICAgICAgICgoaW50ICopZHN0KVsxXSA9ICgoaW50ICopc3JjKVsxXSA7Ci0jZW5kaWYKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotCi0gICAgfQotCi19Ci0KLXZvaWQgdnA4X2NvcHlfbWVtOHg0X2MoCi0gICAgdW5zaWduZWQgY2hhciAqc3JjLAotICAgIGludCBzcmNfc3RyaWRlLAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLSAgICBpbnQgZHN0X3N0cmlkZSkKLXsKLSAgICBpbnQgcjsKLQotICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgewotI2lmZGVmIE1VU1RfQkVfQUxJR05FRAotICAgICAgICBkc3RbMF0gPSBzcmNbMF07Ci0gICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKLSAgICAgICAgZHN0WzJdID0gc3JjWzJdOwotICAgICAgICBkc3RbM10gPSBzcmNbM107Ci0gICAgICAgIGRzdFs0XSA9IHNyY1s0XTsKLSAgICAgICAgZHN0WzVdID0gc3JjWzVdOwotICAgICAgICBkc3RbNl0gPSBzcmNbNl07Ci0gICAgICAgIGRzdFs3XSA9IHNyY1s3XTsKLSNlbHNlCi0gICAgICAgICgoaW50ICopZHN0KVswXSA9ICgoaW50ICopc3JjKVswXSA7Ci0gICAgICAgICgoaW50ICopZHN0KVsxXSA9ICgoaW50ICopc3JjKVsxXSA7Ci0jZW5kaWYKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotCi0gICAgfQotCi19Ci0KLQotCi12b2lkIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoQkxPQ0tEICpkLCBpbnQgcGl0Y2gsIHZwOF9zdWJwaXhfZm5fdCBzcHBmKQotewotICAgIGludCByOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cl9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciA9IGQtPnByZWRpY3RvcjsKLQotICAgIHB0cl9iYXNlID0gKihkLT5iYXNlX3ByZSk7Ci0KLSAgICBpZiAoZC0+Ym1pLm12LmFzX212LnJvdyAmIDcgfHwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcpCi0gICAgewotICAgICAgICBwdHIgPSBwdHJfYmFzZSArIGQtPnByZSArIChkLT5ibWkubXYuYXNfbXYucm93ID4+IDMpICogZC0+cHJlX3N0cmlkZSArIChkLT5ibWkubXYuYXNfbXYuY29sID4+IDMpOwotICAgICAgICBzcHBmKHB0ciwgZC0+cHJlX3N0cmlkZSwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcsIGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3LCBwcmVkX3B0ciwgcGl0Y2gpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwdHJfYmFzZSArPSBkLT5wcmUgKyAoZC0+Ym1pLm12LmFzX212LnJvdyA+PiAzKSAqIGQtPnByZV9zdHJpZGUgKyAoZC0+Ym1pLm12LmFzX212LmNvbCA+PiAzKTsKLSAgICAgICAgcHRyID0gcHRyX2Jhc2U7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICAgICAgewotI2lmZGVmIE1VU1RfQkVfQUxJR05FRAotICAgICAgICAgICAgcHJlZF9wdHJbMF0gID0gcHRyWzBdOwotICAgICAgICAgICAgcHJlZF9wdHJbMV0gID0gcHRyWzFdOwotICAgICAgICAgICAgcHJlZF9wdHJbMl0gID0gcHRyWzJdOwotICAgICAgICAgICAgcHJlZF9wdHJbM10gID0gcHRyWzNdOwotI2Vsc2UKLSAgICAgICAgICAgICooaW50ICopcHJlZF9wdHIgPSAqKGludCAqKXB0ciA7Ci0jZW5kaWYKLSAgICAgICAgICAgIHByZWRfcHRyICAgICArPSBwaXRjaDsKLSAgICAgICAgICAgIHB0ciAgICAgICAgICs9IGQtPnByZV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnM0YihNQUNST0JMT0NLRCAqeCwgQkxPQ0tEICpkLCBpbnQgcGl0Y2gpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyX2Jhc2U7Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyID0gZC0+cHJlZGljdG9yOwotCi0gICAgcHRyX2Jhc2UgPSAqKGQtPmJhc2VfcHJlKTsKLSAgICBwdHIgPSBwdHJfYmFzZSArIGQtPnByZSArIChkLT5ibWkubXYuYXNfbXYucm93ID4+IDMpICogZC0+cHJlX3N0cmlkZSArIChkLT5ibWkubXYuYXNfbXYuY29sID4+IDMpOwotCi0gICAgaWYgKGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3IHx8IGQtPmJtaS5tdi5hc19tdi5jb2wgJiA3KQotICAgIHsKLSAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OChwdHIsIGQtPnByZV9zdHJpZGUsIGQtPmJtaS5tdi5hc19tdi5jb2wgJiA3LCBkLT5ibWkubXYuYXNfbXYucm93ICYgNywgcHJlZF9wdHIsIHBpdGNoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTh4OCkocHRyLCBkLT5wcmVfc3RyaWRlLCBwcmVkX3B0ciwgcGl0Y2gpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfaW50ZXJfcHJlZGljdG9yczJiKE1BQ1JPQkxPQ0tEICp4LCBCTE9DS0QgKmQsIGludCBwaXRjaCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSBkLT5wcmVkaWN0b3I7Ci0KLSAgICBwdHJfYmFzZSA9ICooZC0+YmFzZV9wcmUpOwotICAgIHB0ciA9IHB0cl9iYXNlICsgZC0+cHJlICsgKGQtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBkLT5wcmVfc3RyaWRlICsgKGQtPmJtaS5tdi5hc19tdi5jb2wgPj4gMyk7Ci0KLSAgICBpZiAoZC0+Ym1pLm12LmFzX212LnJvdyAmIDcgfHwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcpCi0gICAgewotICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg0KHB0ciwgZC0+cHJlX3N0cmlkZSwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcsIGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3LCBwcmVkX3B0ciwgcGl0Y2gpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBSRUNPTl9JTlZPS0UoJngtPnJ0Y2QtPnJlY29uLCBjb3B5OHg0KShwdHIsIGQtPnByZV9zdHJpZGUsIHByZWRfcHRyLCBwaXRjaCk7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWJ1dihNQUNST0JMT0NLRCAqeCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUgJiYKLSAgICAgICAgeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdXB0ciwgKnZwdHI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkX3B0ciA9ICZ4LT5wcmVkaWN0b3JbMjU2XTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdnByZWRfcHRyID0gJngtPnByZWRpY3RvclszMjBdOwotCi0gICAgICAgIGludCBtdl9yb3cgPSB4LT5ibG9ja1sxNl0uYm1pLm12LmFzX212LnJvdzsKLSAgICAgICAgaW50IG12X2NvbCA9IHgtPmJsb2NrWzE2XS5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmJsb2NrWzE2XS5wcmVfc3RyaWRlOwotCi0gICAgICAgIG9mZnNldCA9IChtdl9yb3cgPj4gMykgKiBwcmVfc3RyaWRlICsgKG12X2NvbCA+PiAzKTsKLSAgICAgICAgdXB0ciA9IHgtPnByZS51X2J1ZmZlciArIG9mZnNldDsKLSAgICAgICAgdnB0ciA9IHgtPnByZS52X2J1ZmZlciArIG9mZnNldDsKLQotICAgICAgICBpZiAoKG12X3JvdyB8IG12X2NvbCkgJiA3KQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg4KHVwdHIsIHByZV9zdHJpZGUsIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsIHVwcmVkX3B0ciwgOCk7Ci0gICAgICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg4KHZwdHIsIHByZV9zdHJpZGUsIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsIHZwcmVkX3B0ciwgOCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBSRUNPTl9JTlZPS0UoJngtPnJ0Y2QtPnJlY29uLCBjb3B5OHg4KSh1cHRyLCBwcmVfc3RyaWRlLCB1cHJlZF9wdHIsIDgpOwotICAgICAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTh4OCkodnB0ciwgcHJlX3N0cmlkZSwgdnByZWRfcHRyLCA4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJMT0NLRCAqZDAgPSAmeC0+YmxvY2tbaV07Ci0gICAgICAgICAgICBCTE9DS0QgKmQxID0gJngtPmJsb2NrW2krMV07Ci0KLSAgICAgICAgICAgIGlmIChkMC0+Ym1pLm12LmFzX2ludCA9PSBkMS0+Ym1pLm12LmFzX2ludCkKLSAgICAgICAgICAgICAgICBidWlsZF9pbnRlcl9wcmVkaWN0b3JzMmIoeCwgZDAsIDgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDAsIDgsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOwotICAgICAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDEsIDgsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKmVuY29kZXIgb25seSovCi12b2lkIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21ieShNQUNST0JMT0NLRCAqeCkKLXsKLQotICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lICE9IElOVFJBX0ZSQU1FICYmCi0gICAgICB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciA9IHgtPnByZWRpY3RvcjsKLSAgICAgICAgaW50IG12X3JvdyA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LnJvdzsKLSAgICAgICAgaW50IG12X2NvbCA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LmNvbDsKLSAgICAgICAgaW50IHByZV9zdHJpZGUgPSB4LT5ibG9ja1swXS5wcmVfc3RyaWRlOwotCi0gICAgICAgIHB0cl9iYXNlID0geC0+cHJlLnlfYnVmZmVyOwotICAgICAgICBwdHIgPSBwdHJfYmFzZSArIChtdl9yb3cgPj4gMykgKiBwcmVfc3RyaWRlICsgKG12X2NvbCA+PiAzKTsKLQotICAgICAgICBpZiAoKG12X3JvdyB8IG12X2NvbCkgJiA3KQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTYocHRyLCBwcmVfc3RyaWRlLCBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCBwcmVkX3B0ciwgMTYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTE2eDE2KShwdHIsIHByZV9zdHJpZGUsIHByZWRfcHRyLCAxNik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnBhcnRpdGlvbmluZyA8IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkID0gJngtPmJsb2NrW2JiYltpXV07Ci0gICAgICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yczRiKHgsIGQsIDE2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkMCA9ICZ4LT5ibG9ja1tpXTsKLSAgICAgICAgICAgICAgICBCTE9DS0QgKmQxID0gJngtPmJsb2NrW2krMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoZDAtPmJtaS5tdi5hc19pbnQgPT0gZDEtPmJtaS5tdi5hc19pbnQpCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ludGVyX3ByZWRpY3RvcnMyYih4LCBkMCwgMTYpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDAsIDE2LCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKLSAgICAgICAgICAgICAgICAgICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfYihkMSwgMTYsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iKE1BQ1JPQkxPQ0tEICp4KQotewotCi0gICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSAmJgotICAgICAgICB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgewotICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp1cHRyLCAqdnB0cjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSB4LT5wcmVkaWN0b3I7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkX3B0ciA9ICZ4LT5wcmVkaWN0b3JbMjU2XTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdnByZWRfcHRyID0gJngtPnByZWRpY3RvclszMjBdOwotCi0gICAgICAgIGludCBtdl9yb3cgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgIGludCBtdl9jb2wgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5jb2w7Ci0gICAgICAgIGludCBwcmVfc3RyaWRlID0geC0+YmxvY2tbMF0ucHJlX3N0cmlkZTsKLQotICAgICAgICBwdHJfYmFzZSA9IHgtPnByZS55X2J1ZmZlcjsKLSAgICAgICAgcHRyID0gcHRyX2Jhc2UgKyAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7Ci0KLSAgICAgICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKLSAgICAgICAgewotICAgICAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2KHB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywgcHJlZF9wdHIsIDE2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJFQ09OX0lOVk9LRSgmeC0+cnRjZC0+cmVjb24sIGNvcHkxNngxNikocHRyLCBwcmVfc3RyaWRlLCBwcmVkX3B0ciwgMTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXZfcm93ID0geC0+YmxvY2tbMTZdLmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgIG12X2NvbCA9IHgtPmJsb2NrWzE2XS5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICBwcmVfc3RyaWRlID4+PSAxOwotICAgICAgICBvZmZzZXQgPSAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7Ci0gICAgICAgIHVwdHIgPSB4LT5wcmUudV9idWZmZXIgKyBvZmZzZXQ7Ci0gICAgICAgIHZwdHIgPSB4LT5wcmUudl9idWZmZXIgKyBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKLSAgICAgICAgewotICAgICAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OCh1cHRyLCBwcmVfc3RyaWRlLCBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCB1cHJlZF9wdHIsIDgpOwotICAgICAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OCh2cHRyLCBwcmVfc3RyaWRlLCBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCB2cHJlZF9wdHIsIDgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTh4OCkodXB0ciwgcHJlX3N0cmlkZSwgdXByZWRfcHRyLCA4KTsKLSAgICAgICAgICAgIFJFQ09OX0lOVk9LRSgmeC0+cnRjZC0+cmVjb24sIGNvcHk4eDgpKHZwdHIsIHByZV9zdHJpZGUsIHZwcmVkX3B0ciwgOCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnBhcnRpdGlvbmluZyA8IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkID0gJngtPmJsb2NrW2JiYltpXV07Ci0gICAgICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yczRiKHgsIGQsIDE2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJMT0NLRCAqZDAgPSAmeC0+YmxvY2tbaV07Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkMSA9ICZ4LT5ibG9ja1tpKzFdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQwLT5ibWkubXYuYXNfaW50ID09IGQxLT5ibWkubXYuYXNfaW50KQotICAgICAgICAgICAgICAgICAgICBidWlsZF9pbnRlcl9wcmVkaWN0b3JzMmIoeCwgZDAsIDE2KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQwLCAxNiwgeC0+c3VicGl4ZWxfcHJlZGljdCk7Ci0gICAgICAgICAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX2IoZDEsIDE2LCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSArPSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBCTE9DS0QgKmQwID0gJngtPmJsb2NrW2ldOwotICAgICAgICAgICAgQkxPQ0tEICpkMSA9ICZ4LT5ibG9ja1tpKzFdOwotCi0gICAgICAgICAgICBpZiAoZDAtPmJtaS5tdi5hc19pbnQgPT0gZDEtPmJtaS5tdi5hc19pbnQpCi0gICAgICAgICAgICAgICAgYnVpbGRfaW50ZXJfcHJlZGljdG9yczJiKHgsIGQwLCA4KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQwLCA4LCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKLSAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGQxLCA4LCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2J1aWxkX3V2bXZzKE1BQ1JPQkxPQ0tEICp4LCBpbnQgZnVsbHBpeGVsKQotewotICAgIGludCBpLCBqOwotCi0gICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHlvZmZzZXQgPSBpICogOCArIGogKiAyOwotICAgICAgICAgICAgICAgIGludCB1b2Zmc2V0ID0gMTYgKyBpICogMiArIGo7Ci0gICAgICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAyMCArIGkgKiAyICsgajsKLQotICAgICAgICAgICAgICAgIGludCB0ZW1wOwotCi0gICAgICAgICAgICAgICAgdGVtcCA9IHgtPmJsb2NrW3lvZmZzZXQgIF0uYm1pLm12LmFzX212LnJvdwotICAgICAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrMV0uYm1pLm12LmFzX212LnJvdwotICAgICAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrNF0uYm1pLm12LmFzX212LnJvdwotICAgICAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrNV0uYm1pLm12LmFzX212LnJvdzsKLQotICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgMCkgdGVtcCAtPSA0OwotICAgICAgICAgICAgICAgIGVsc2UgdGVtcCArPSA0OwotCi0gICAgICAgICAgICAgICAgeC0+YmxvY2tbdW9mZnNldF0uYm1pLm12LmFzX212LnJvdyA9IHRlbXAgLyA4OwotCi0gICAgICAgICAgICAgICAgaWYgKGZ1bGxwaXhlbCkKLSAgICAgICAgICAgICAgICAgICAgeC0+YmxvY2tbdW9mZnNldF0uYm1pLm12LmFzX212LnJvdyA9ICh0ZW1wIC8gOCkgJiAweGZmZmZmZmY4OwotCi0gICAgICAgICAgICAgICAgdGVtcCA9IHgtPmJsb2NrW3lvZmZzZXQgIF0uYm1pLm12LmFzX212LmNvbAotICAgICAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrMV0uYm1pLm12LmFzX212LmNvbAotICAgICAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrNF0uYm1pLm12LmFzX212LmNvbAotICAgICAgICAgICAgICAgICAgICAgICArIHgtPmJsb2NrW3lvZmZzZXQrNV0uYm1pLm12LmFzX212LmNvbDsKLQotICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgMCkgdGVtcCAtPSA0OwotICAgICAgICAgICAgICAgIGVsc2UgdGVtcCArPSA0OwotCi0gICAgICAgICAgICAgICAgeC0+YmxvY2tbdW9mZnNldF0uYm1pLm12LmFzX212LmNvbCA9IHRlbXAgLyA4OwotCi0gICAgICAgICAgICAgICAgaWYgKGZ1bGxwaXhlbCkKLSAgICAgICAgICAgICAgICAgICAgeC0+YmxvY2tbdW9mZnNldF0uYm1pLm12LmFzX212LmNvbCA9ICh0ZW1wIC8gOCkgJiAweGZmZmZmZmY4OwotCi0gICAgICAgICAgICAgICAgeC0+YmxvY2tbdm9mZnNldF0uYm1pLm12LmFzX212LnJvdyA9IHgtPmJsb2NrW3VvZmZzZXRdLmJtaS5tdi5hc19tdi5yb3cgOwotICAgICAgICAgICAgICAgIHgtPmJsb2NrW3ZvZmZzZXRdLmJtaS5tdi5hc19tdi5jb2wgPSB4LT5ibG9ja1t1b2Zmc2V0XS5ibWkubXYuYXNfbXYuY29sIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgbXZyb3cgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgIGludCBtdmNvbCA9IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212LmNvbDsKLQotICAgICAgICBpZiAobXZyb3cgPCAwKQotICAgICAgICAgICAgbXZyb3cgLT0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbXZyb3cgKz0gMTsKLQotICAgICAgICBpZiAobXZjb2wgPCAwKQotICAgICAgICAgICAgbXZjb2wgLT0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbXZjb2wgKz0gMTsKLQotICAgICAgICBtdnJvdyAvPSAyOwotICAgICAgICBtdmNvbCAvPSAyOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHgtPmJsb2NrWyAxNiArIGldLmJtaS5tdi5hc19tdi5yb3cgPSBtdnJvdzsKLSAgICAgICAgICAgIHgtPmJsb2NrWyAxNiArIGldLmJtaS5tdi5hc19tdi5jb2wgPSBtdmNvbDsKLQotICAgICAgICAgICAgaWYgKGZ1bGxwaXhlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4LT5ibG9ja1sgMTYgKyBpXS5ibWkubXYuYXNfbXYucm93ID0gbXZyb3cgJiAweGZmZmZmZmY4OwotICAgICAgICAgICAgICAgIHgtPmJsb2NrWyAxNiArIGldLmJtaS5tdi5hc19tdi5jb2wgPSBtdmNvbCAmIDB4ZmZmZmZmZjg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHdyaWl0ZW4gZm9yIHNraXBfcmVjb25fbWIoKSB0byBjYWxsLiBTaW5jZSB0aGVyZSBpcyBubyByZWNvbiBpbiB0aGlzCi0gKiBzaXR1YXRpb24sIHdlIGNhbiB3cml0ZSB0aGUgcmVzdWx0IGRpcmVjdGx5IHRvIGRzdCBidWZmZXIgaW5zdGVhZCBvZiB3cml0aW5nIGl0IHRvIHByZWRpY3RvcgotICogYnVmZmVyIGFuZCB0aGVuIGNvcHlpbmcgaXQgdG8gZHN0IGJ1ZmZlci4KLSAqLwotc3RhdGljIHZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfYl9zKEJMT0NLRCAqZCwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgdnA4X3N1YnBpeF9mbl90IHNwcGYpCi17Ci0gICAgaW50IHI7Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyX2Jhc2U7Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgIC8qdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSBkLT5wcmVkaWN0b3I7Ki8KLSAgICBpbnQgZHN0X3N0cmlkZSA9IGQtPmRzdF9zdHJpZGU7Ci0gICAgaW50IHByZV9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotCi0gICAgcHRyX2Jhc2UgPSAqKGQtPmJhc2VfcHJlKTsKLQotICAgIGlmIChkLT5ibWkubXYuYXNfbXYucm93ICYgNyB8fCBkLT5ibWkubXYuYXNfbXYuY29sICYgNykKLSAgICB7Ci0gICAgICAgIHB0ciA9IHB0cl9iYXNlICsgZC0+cHJlICsgKGQtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBkLT5wcmVfc3RyaWRlICsgKGQtPmJtaS5tdi5hc19tdi5jb2wgPj4gMyk7Ci0gICAgICAgIHNwcGYocHRyLCBwcmVfc3RyaWRlLCBkLT5ibWkubXYuYXNfbXYuY29sICYgNywgZC0+Ym1pLm12LmFzX212LnJvdyAmIDcsIGRzdF9wdHIsIGRzdF9zdHJpZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwdHJfYmFzZSArPSBkLT5wcmUgKyAoZC0+Ym1pLm12LmFzX212LnJvdyA+PiAzKSAqIGQtPnByZV9zdHJpZGUgKyAoZC0+Ym1pLm12LmFzX212LmNvbCA+PiAzKTsKLSAgICAgICAgcHRyID0gcHRyX2Jhc2U7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICAgICAgewotI2lmZGVmIE1VU1RfQkVfQUxJR05FRAotICAgICAgICAgICAgZHN0X3B0clswXSAgID0gcHRyWzBdOwotICAgICAgICAgICAgZHN0X3B0clsxXSAgID0gcHRyWzFdOwotICAgICAgICAgICAgZHN0X3B0clsyXSAgID0gcHRyWzJdOwotICAgICAgICAgICAgZHN0X3B0clszXSAgID0gcHRyWzNdOwotI2Vsc2UKLSAgICAgICAgICAgICooaW50ICopZHN0X3B0ciA9ICooaW50ICopcHRyIDsKLSNlbmRpZgotICAgICAgICAgICAgZHN0X3B0ciAgICAgICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgICAgICBwdHIgICAgICAgICArPSBwcmVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLQotdm9pZCB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19tYl9zKE1BQ1JPQkxPQ0tEICp4KQotewotICAgIC8qdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSB4LT5ibG9ja1swXS5wcmVkaWN0b3I7Ci0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciA9ICooeC0+YmxvY2tbMF0uYmFzZV9kc3QpICsgeC0+YmxvY2tbMF0uZHN0OyovCi0gICAgdW5zaWduZWQgY2hhciAqcHJlZF9wdHIgPSB4LT5wcmVkaWN0b3I7Ci0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciA9IHgtPmRzdC55X2J1ZmZlcjsKLQotICAgIGlmICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgewotICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp1cHRyLCAqdnB0cjsKLSAgICAgICAgLyp1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciA9IHgtPnByZWRpY3RvcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdXByZWRfcHRyID0gJngtPnByZWRpY3RvclsyNTZdOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp2cHJlZF9wdHIgPSAmeC0+cHJlZGljdG9yWzMyMF07Ki8KLSAgICAgICAgdW5zaWduZWQgY2hhciAqdWRzdF9wdHIgPSB4LT5kc3QudV9idWZmZXI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnZkc3RfcHRyID0geC0+ZHN0LnZfYnVmZmVyOwotCi0gICAgICAgIGludCBtdl9yb3cgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgIGludCBtdl9jb2wgPSB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5jb2w7Ci0gICAgICAgIGludCBwcmVfc3RyaWRlID0geC0+ZHN0Lnlfc3RyaWRlOyAvKngtPmJsb2NrWzBdLnByZV9zdHJpZGU7Ki8KLQotICAgICAgICBwdHJfYmFzZSA9IHgtPnByZS55X2J1ZmZlcjsKLSAgICAgICAgcHRyID0gcHRyX2Jhc2UgKyAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7Ci0KLSAgICAgICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKLSAgICAgICAgewotICAgICAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2KHB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywgZHN0X3B0ciwgeC0+ZHN0Lnlfc3RyaWRlKTsgLyp4LT5ibG9ja1swXS5kc3Rfc3RyaWRlKTsqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTE2eDE2KShwdHIsIHByZV9zdHJpZGUsIGRzdF9wdHIsIHgtPmRzdC55X3N0cmlkZSk7IC8qeC0+YmxvY2tbMF0uZHN0X3N0cmlkZSk7Ki8KLSAgICAgICAgfQotCi0gICAgICAgIG12X3JvdyA9IHgtPmJsb2NrWzE2XS5ibWkubXYuYXNfbXYucm93OwotICAgICAgICBtdl9jb2wgPSB4LT5ibG9ja1sxNl0uYm1pLm12LmFzX212LmNvbDsKLSAgICAgICAgcHJlX3N0cmlkZSA+Pj0gMTsKLSAgICAgICAgb2Zmc2V0ID0gKG12X3JvdyA+PiAzKSAqIHByZV9zdHJpZGUgKyAobXZfY29sID4+IDMpOwotICAgICAgICB1cHRyID0geC0+cHJlLnVfYnVmZmVyICsgb2Zmc2V0OwotICAgICAgICB2cHRyID0geC0+cHJlLnZfYnVmZmVyICsgb2Zmc2V0OwotCi0gICAgICAgIGlmICgobXZfcm93IHwgbXZfY29sKSAmIDcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3Q4eDgodXB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywgdWRzdF9wdHIsIHgtPmRzdC51dl9zdHJpZGUpOwotICAgICAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4OCh2cHRyLCBwcmVfc3RyaWRlLCBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCB2ZHN0X3B0ciwgeC0+ZHN0LnV2X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBSRUNPTl9JTlZPS0UoJngtPnJ0Y2QtPnJlY29uLCBjb3B5OHg4KSh1cHRyLCBwcmVfc3RyaWRlLCB1ZHN0X3B0ciwgeC0+ZHN0LnV2X3N0cmlkZSk7Ci0gICAgICAgICAgICBSRUNPTl9JTlZPS0UoJngtPnJ0Y2QtPnJlY29uLCBjb3B5OHg4KSh2cHRyLCBwcmVfc3RyaWRlLCB2ZHN0X3B0ciwgeC0+ZHN0LnV2X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogbm90ZTogdGhpcyB3aG9sZSBFTFNFIHBhcnQgaXMgbm90IGV4ZWN1dGVkIGF0IGFsbC4gU28sIG5vIHdheSB0byB0ZXN0IHRoZSBjb3JyZWN0bmVzcyBvZiBteSBtb2RpZmljYXRpb24uIExhdGVyLAotICAgICAgICAgKiBpZiBzdGggaXMgd3JvbmcsIGdvIGJhY2sgdG8gd2hhdCBpdCBpcyBpbiBidWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnBhcnRpdGlvbmluZyA8IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkID0gJngtPmJsb2NrW2JiYltpXV07Ci0gICAgICAgICAgICAgICAgLypidWlsZF9pbnRlcl9wcmVkaWN0b3JzNGIoeCwgZCwgMTYpOyovCi0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0cl9iYXNlOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyID0gZC0+cHJlZGljdG9yOwotCi0gICAgICAgICAgICAgICAgICAgIHB0cl9iYXNlID0gKihkLT5iYXNlX3ByZSk7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9IHB0cl9iYXNlICsgZC0+cHJlICsgKGQtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBkLT5wcmVfc3RyaWRlICsgKGQtPmJtaS5tdi5hc19tdi5jb2wgPj4gMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3IHx8IGQtPmJtaS5tdi5hc19tdi5jb2wgJiA3KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg4KHB0ciwgZC0+cHJlX3N0cmlkZSwgZC0+Ym1pLm12LmFzX212LmNvbCAmIDcsIGQtPmJtaS5tdi5hc19tdi5yb3cgJiA3LCBkc3RfcHRyLCB4LT5kc3QueV9zdHJpZGUpOyAvKngtPmJsb2NrWzBdLmRzdF9zdHJpZGUpOyovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSRUNPTl9JTlZPS0UoJngtPnJ0Y2QtPnJlY29uLCBjb3B5OHg4KShwdHIsIGQtPnByZV9zdHJpZGUsIGRzdF9wdHIsIHgtPmRzdC55X3N0cmlkZSk7IC8qeC0+YmxvY2tbMF0uZHN0X3N0cmlkZSk7Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJMT0NLRCAqZDAgPSAmeC0+YmxvY2tbaV07Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkMSA9ICZ4LT5ibG9ja1tpKzFdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQwLT5ibWkubXYuYXNfaW50ID09IGQxLT5ibWkubXYuYXNfaW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypidWlsZF9pbnRlcl9wcmVkaWN0b3JzMmIoeCwgZDAsIDE2KTsqLwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHJfYmFzZTsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciA9IGQwLT5wcmVkaWN0b3I7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHRyX2Jhc2UgPSAqKGQwLT5iYXNlX3ByZSk7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9IHB0cl9iYXNlICsgZDAtPnByZSArIChkMC0+Ym1pLm12LmFzX212LnJvdyA+PiAzKSAqIGQwLT5wcmVfc3RyaWRlICsgKGQwLT5ibWkubXYuYXNfbXYuY29sID4+IDMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkMC0+Ym1pLm12LmFzX212LnJvdyAmIDcgfHwgZDAtPmJtaS5tdi5hc19tdi5jb2wgJiA3KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg0KHB0ciwgZDAtPnByZV9zdHJpZGUsIGQwLT5ibWkubXYuYXNfbXYuY29sICYgNywgZDAtPmJtaS5tdi5hc19tdi5yb3cgJiA3LCBkc3RfcHRyLCB4LT5kc3QueV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTh4NCkocHRyLCBkMC0+cHJlX3N0cmlkZSwgZHN0X3B0ciwgeC0+ZHN0Lnlfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iX3MoZDAsIGRzdF9wdHIsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOwotICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iX3MoZDEsIGRzdF9wdHIsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDE2OyBpIDwgMjQ7IGkgKz0gMikKLSAgICAgICAgewotICAgICAgICAgICAgQkxPQ0tEICpkMCA9ICZ4LT5ibG9ja1tpXTsKLSAgICAgICAgICAgIEJMT0NLRCAqZDEgPSAmeC0+YmxvY2tbaSsxXTsKLQotICAgICAgICAgICAgaWYgKGQwLT5ibWkubXYuYXNfaW50ID09IGQxLT5ibWkubXYuYXNfaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qYnVpbGRfaW50ZXJfcHJlZGljdG9yczJiKHgsIGQwLCA4KTsqLwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0cl9iYXNlOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciA9IGQwLT5wcmVkaWN0b3I7Ci0KLSAgICAgICAgICAgICAgICBwdHJfYmFzZSA9ICooZDAtPmJhc2VfcHJlKTsKLSAgICAgICAgICAgICAgICBwdHIgPSBwdHJfYmFzZSArIGQwLT5wcmUgKyAoZDAtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBkMC0+cHJlX3N0cmlkZSArIChkMC0+Ym1pLm12LmFzX212LmNvbCA+PiAzKTsKLQotICAgICAgICAgICAgICAgIGlmIChkMC0+Ym1pLm12LmFzX212LnJvdyAmIDcgfHwgZDAtPmJtaS5tdi5hc19tdi5jb2wgJiA3KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDh4NChwdHIsIGQwLT5wcmVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgZDAtPmJtaS5tdi5hc19tdi5jb2wgJiA3LAotICAgICAgICAgICAgICAgICAgICAgICAgZDAtPmJtaS5tdi5hc19tdi5yb3cgJiA3LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciwgeC0+ZHN0LnV2X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJFQ09OX0lOVk9LRSgmeC0+cnRjZC0+cmVjb24sIGNvcHk4eDQpKHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGQwLT5wcmVfc3RyaWRlLCBkc3RfcHRyLCB4LT5kc3QudXZfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfYl9zKGQwLCBkc3RfcHRyLCB4LT5zdWJwaXhlbF9wcmVkaWN0KTsKLSAgICAgICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iX3MoZDEsIGRzdF9wdHIsIHgtPnN1YnBpeGVsX3ByZWRpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9yZWNvbmludGVyLmggYi92cDgvY29tbW9uL3JlY29uaW50ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxZGVlNC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3JlY29uaW50ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX1JFQ09OSU5URVJfSAotI2RlZmluZSBfX0lOQ19SRUNPTklOVEVSX0gKLQotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWIoTUFDUk9CTE9DS0QgKngpOwotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWJfcyhNQUNST0JMT0NLRCAqeCk7Ci0KLWV4dGVybiB2b2lkIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21ieShNQUNST0JMT0NLRCAqeCk7Ci1leHRlcm4gdm9pZCB2cDhfYnVpbGRfdXZtdnMoTUFDUk9CTE9DS0QgKngsIGludCBmdWxscGl4ZWwpOwotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfYihCTE9DS0QgKmQsIGludCBwaXRjaCwgdnA4X3N1YnBpeF9mbl90IHNwcGYpOwotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWJ1dihNQUNST0JMT0NLRCAqeCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9yZWNvbmludHJhLmMgYi92cDgvY29tbW9uL3JlY29uaW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmNWY2YS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3JlY29uaW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJyZWNvbi5oIgotI2luY2x1ZGUgInJlY29uaW50cmEuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLQotLyogRm9yIHNraXBfcmVjb25fbWIoKSwgYWRkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieV9zKE1BQ1JPQkxPQ0tEICp4KSBhbmQKLSAqIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcyhNQUNST0JMT0NLRCAqeCkuCi0gKi8KLXZvaWQgdnA4X3JlY29uX2ludHJhX21idXYoY29uc3QgdnA4X3JlY29uX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QsIE1BQ1JPQkxPQ0tEICp4KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSArPSAyKQotICAgIHsKLSAgICAgICAgQkxPQ0tEICpiID0gJngtPmJsb2NrW2ldOwotICAgICAgICBSRUNPTl9JTlZPS0UocnRjZCwgcmVjb24yKShiLT5wcmVkaWN0b3IsIGItPmRpZmYsICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0LCBiLT5kc3Rfc3RyaWRlKTsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5KE1BQ1JPQkxPQ0tEICp4KQotewotCi0gICAgdW5zaWduZWQgY2hhciAqeWFib3ZlX3JvdyA9IHgtPmRzdC55X2J1ZmZlciAtIHgtPmRzdC55X3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyIHlsZWZ0X2NvbFsxNl07Ci0gICAgdW5zaWduZWQgY2hhciB5dG9wX2xlZnQgPSB5YWJvdmVfcm93Wy0xXTsKLSAgICB1bnNpZ25lZCBjaGFyICp5cHJlZF9wdHIgPSB4LT5wcmVkaWN0b3I7Ci0gICAgaW50IHIsIGMsIGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHlsZWZ0X2NvbFtpXSA9IHgtPmRzdC55X2J1ZmZlciBbaSogeC0+ZHN0Lnlfc3RyaWRlIC0xXTsKLSAgICB9Ci0KLSAgICAvKiBmb3IgWSAqLwotICAgIHN3aXRjaCAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSkKLSAgICB7Ci0gICAgY2FzZSBEQ19QUkVEOgotICAgIHsKLSAgICAgICAgaW50IGV4cGVjdGVkX2RjOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICBpbnQgYXZlcmFnZSA9IDA7Ci0KLQotICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlIHx8IHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSArPSB5YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdmVyYWdlICs9IHlsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgIHNoaWZ0ID0gMyArIHgtPnVwX2F2YWlsYWJsZSArIHgtPmxlZnRfYXZhaWxhYmxlOwotICAgICAgICAgICAgZXhwZWN0ZWRfZGMgPSAoYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZF9kYyA9IDEyODsKLSAgICAgICAgfQotCi0gICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCBleHBlY3RlZF9kYywgMjU2KTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBWX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVswXSA9ICgoaW50ICopeWFib3ZlX3JvdylbMF07Ci0gICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbMV0gPSAoKGludCAqKXlhYm92ZV9yb3cpWzFdOwotICAgICAgICAgICAgKChpbnQgKil5cHJlZF9wdHIpWzJdID0gKChpbnQgKil5YWJvdmVfcm93KVsyXTsKLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVszXSA9ICgoaW50ICopeWFib3ZlX3JvdylbM107Ci0gICAgICAgICAgICB5cHJlZF9wdHIgKz0gMTY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBIX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCB5bGVmdF9jb2xbcl0sIDE2KTsKLSAgICAgICAgICAgIHlwcmVkX3B0ciArPSAxNjsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgVE1fUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAxNjsgYysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwcmVkID0gIHlsZWZ0X2NvbFtyXSArIHlhYm92ZV9yb3dbIGNdIC0geXRvcF9sZWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWQgPCAwKQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMjU1OwotCi0gICAgICAgICAgICAgICAgeXByZWRfcHRyW2NdID0gcHJlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeXByZWRfcHRyICs9IDE2OwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX1BSRUQ6Ci0gICAgY2FzZSBORUFSRVNUTVY6Ci0gICAgY2FzZSBORUFSTVY6Ci0gICAgY2FzZSBaRVJPTVY6Ci0gICAgY2FzZSBORVdNVjoKLSAgICBjYXNlIFNQTElUTVY6Ci0gICAgY2FzZSBNQl9NT0RFX0NPVU5UOgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MoTUFDUk9CTE9DS0QgKngpCi17Ci0KLSAgICB1bnNpZ25lZCBjaGFyICp5YWJvdmVfcm93ID0geC0+ZHN0LnlfYnVmZmVyIC0geC0+ZHN0Lnlfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgeWxlZnRfY29sWzE2XTsKLSAgICB1bnNpZ25lZCBjaGFyIHl0b3BfbGVmdCA9IHlhYm92ZV9yb3dbLTFdOwotICAgIHVuc2lnbmVkIGNoYXIgKnlwcmVkX3B0ciA9IHgtPnByZWRpY3RvcjsKLSAgICBpbnQgciwgYywgaTsKLQotICAgIGludCB5X3N0cmlkZSA9IHgtPmRzdC55X3N0cmlkZTsKLSAgICB5cHJlZF9wdHIgPSB4LT5kc3QueV9idWZmZXI7IC8qeC0+cHJlZGljdG9yOyovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHlsZWZ0X2NvbFtpXSA9IHgtPmRzdC55X2J1ZmZlciBbaSogeC0+ZHN0Lnlfc3RyaWRlIC0xXTsKLSAgICB9Ci0KLSAgICAvKiBmb3IgWSAqLwotICAgIHN3aXRjaCAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSkKLSAgICB7Ci0gICAgY2FzZSBEQ19QUkVEOgotICAgIHsKLSAgICAgICAgaW50IGV4cGVjdGVkX2RjOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICBpbnQgYXZlcmFnZSA9IDA7Ci0KLQotICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlIHx8IHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSArPSB5YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdmVyYWdlICs9IHlsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgIHNoaWZ0ID0gMyArIHgtPnVwX2F2YWlsYWJsZSArIHgtPmxlZnRfYXZhaWxhYmxlOwotICAgICAgICAgICAgZXhwZWN0ZWRfZGMgPSAoYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZF9kYyA9IDEyODsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdnB4X21lbXNldCh5cHJlZF9wdHIsIGV4cGVjdGVkX2RjLCAyNTYpOyovCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHlwcmVkX3B0ciwgZXhwZWN0ZWRfZGMsIDE2KTsKLSAgICAgICAgICAgIHlwcmVkX3B0ciArPSB5X3N0cmlkZTsgLyoxNjsqLwotICAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgVl9QUkVEOgotICAgIHsKLQotICAgICAgICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbMF0gPSAoKGludCAqKXlhYm92ZV9yb3cpWzBdOwotICAgICAgICAgICAgKChpbnQgKil5cHJlZF9wdHIpWzFdID0gKChpbnQgKil5YWJvdmVfcm93KVsxXTsKLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVsyXSA9ICgoaW50ICopeWFib3ZlX3JvdylbMl07Ci0gICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbM10gPSAoKGludCAqKXlhYm92ZV9yb3cpWzNdOwotICAgICAgICAgICAgeXByZWRfcHRyICs9IHlfc3RyaWRlOyAvKjE2OyovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBIX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCB5bGVmdF9jb2xbcl0sIDE2KTsKLSAgICAgICAgICAgIHlwcmVkX3B0ciArPSB5X3N0cmlkZTsgIC8qMTY7Ki8KLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgVE1fUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAxNjsgYysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwcmVkID0gIHlsZWZ0X2NvbFtyXSArIHlhYm92ZV9yb3dbIGNdIC0geXRvcF9sZWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWQgPCAwKQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMjU1OwotCi0gICAgICAgICAgICAgICAgeXByZWRfcHRyW2NdID0gcHJlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeXByZWRfcHRyICs9IHlfc3RyaWRlOyAgLyoxNjsqLwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX1BSRUQ6Ci0gICAgY2FzZSBORUFSRVNUTVY6Ci0gICAgY2FzZSBORUFSTVY6Ci0gICAgY2FzZSBaRVJPTVY6Ci0gICAgY2FzZSBORVdNVjoKLSAgICBjYXNlIFNQTElUTVY6Ci0gICAgY2FzZSBNQl9NT0RFX0NPVU5UOgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dihNQUNST0JMT0NLRCAqeCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp1YWJvdmVfcm93ID0geC0+ZHN0LnVfYnVmZmVyIC0geC0+ZHN0LnV2X3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyIHVsZWZ0X2NvbFsxNl07Ci0gICAgdW5zaWduZWQgY2hhciB1dG9wX2xlZnQgPSB1YWJvdmVfcm93Wy0xXTsKLSAgICB1bnNpZ25lZCBjaGFyICp2YWJvdmVfcm93ID0geC0+ZHN0LnZfYnVmZmVyIC0geC0+ZHN0LnV2X3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyIHZsZWZ0X2NvbFsyMF07Ci0gICAgdW5zaWduZWQgY2hhciB2dG9wX2xlZnQgPSB2YWJvdmVfcm93Wy0xXTsKLSAgICB1bnNpZ25lZCBjaGFyICp1cHJlZF9wdHIgPSAmeC0+cHJlZGljdG9yWzI1Nl07Ci0gICAgdW5zaWduZWQgY2hhciAqdnByZWRfcHRyID0gJngtPnByZWRpY3RvclszMjBdOwotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICB7Ci0gICAgICAgIHVsZWZ0X2NvbFtpXSA9IHgtPmRzdC51X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07Ci0gICAgICAgIHZsZWZ0X2NvbFtpXSA9IHgtPmRzdC52X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07Ci0gICAgfQotCi0gICAgc3dpdGNoICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlKQotICAgIHsKLSAgICBjYXNlIERDX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgZXhwZWN0ZWRfdWRjOwotICAgICAgICBpbnQgZXhwZWN0ZWRfdmRjOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICBpbnQgVWF2ZXJhZ2UgPSAwOwotICAgICAgICBpbnQgVmF2ZXJhZ2UgPSAwOwotCi0gICAgICAgIGlmICh4LT51cF9hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVWF2ZXJhZ2UgKz0gdWFib3ZlX3Jvd1tpXTsKLSAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVhdmVyYWdlICs9IHVsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2bGVmdF9jb2xbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXgtPnVwX2F2YWlsYWJsZSAmJiAheC0+bGVmdF9hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdGVkX3VkYyA9IDEyODsKLSAgICAgICAgICAgIGV4cGVjdGVkX3ZkYyA9IDEyODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNoaWZ0ID0gMiArIHgtPnVwX2F2YWlsYWJsZSArIHgtPmxlZnRfYXZhaWxhYmxlOwotICAgICAgICAgICAgZXhwZWN0ZWRfdWRjID0gKFVhdmVyYWdlICsgKDEgPDwgKHNoaWZ0IC0gMSkpKSA+PiBzaGlmdDsKLSAgICAgICAgICAgIGV4cGVjdGVkX3ZkYyA9IChWYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHZweF9tZW1zZXQodXByZWRfcHRyLCBleHBlY3RlZF91ZGMsIDY0KTsKLSAgICAgICAgdnB4X21lbXNldCh2cHJlZF9wdHIsIGV4cGVjdGVkX3ZkYywgNjQpOwotCi0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBWX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KHVwcmVkX3B0ciwgdWFib3ZlX3JvdywgOCk7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KHZwcmVkX3B0ciwgdmFib3ZlX3JvdywgOCk7Ci0gICAgICAgICAgICB1cHJlZF9wdHIgKz0gODsKLSAgICAgICAgICAgIHZwcmVkX3B0ciArPSA4OwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBIX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHVwcmVkX3B0ciwgdWxlZnRfY29sW2ldLCA4KTsKLSAgICAgICAgICAgIHZweF9tZW1zZXQodnByZWRfcHRyLCB2bGVmdF9jb2xbaV0sIDgpOwotICAgICAgICAgICAgdXByZWRfcHRyICs9IDg7Ci0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJyZWFrOwotICAgIGNhc2UgVE1fUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHByZWR1ID0gdWxlZnRfY29sW2ldICsgdWFib3ZlX3Jvd1tqXSAtIHV0b3BfbGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgcHJlZHYgPSB2bGVmdF9jb2xbaV0gKyB2YWJvdmVfcm93W2pdIC0gdnRvcF9sZWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR1IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHUgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR1ID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkdSA9IDI1NTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkdiA8IDApCi0gICAgICAgICAgICAgICAgICAgIHByZWR2ID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkdiA+IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHYgPSAyNTU7Ci0KLSAgICAgICAgICAgICAgICB1cHJlZF9wdHJbal0gPSBwcmVkdTsKLSAgICAgICAgICAgICAgICB2cHJlZF9wdHJbal0gPSBwcmVkdjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXByZWRfcHRyICs9IDg7Ci0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gODsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9QUkVEOgotICAgIGNhc2UgTkVBUkVTVE1WOgotICAgIGNhc2UgTkVBUk1WOgotICAgIGNhc2UgWkVST01WOgotICAgIGNhc2UgTkVXTVY6Ci0gICAgY2FzZSBTUExJVE1WOgotICAgIGNhc2UgTUJfTU9ERV9DT1VOVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcyhNQUNST0JMT0NLRCAqeCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp1YWJvdmVfcm93ID0geC0+ZHN0LnVfYnVmZmVyIC0geC0+ZHN0LnV2X3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyIHVsZWZ0X2NvbFsxNl07Ci0gICAgdW5zaWduZWQgY2hhciB1dG9wX2xlZnQgPSB1YWJvdmVfcm93Wy0xXTsKLSAgICB1bnNpZ25lZCBjaGFyICp2YWJvdmVfcm93ID0geC0+ZHN0LnZfYnVmZmVyIC0geC0+ZHN0LnV2X3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyIHZsZWZ0X2NvbFsyMF07Ci0gICAgdW5zaWduZWQgY2hhciB2dG9wX2xlZnQgPSB2YWJvdmVfcm93Wy0xXTsKLSAgICB1bnNpZ25lZCBjaGFyICp1cHJlZF9wdHIgPSB4LT5kc3QudV9idWZmZXI7IC8qJngtPnByZWRpY3RvclsyNTZdOyovCi0gICAgdW5zaWduZWQgY2hhciAqdnByZWRfcHRyID0geC0+ZHN0LnZfYnVmZmVyOyAvKiZ4LT5wcmVkaWN0b3JbMzIwXTsqLwotICAgIGludCB1dl9zdHJpZGUgPSB4LT5kc3QudXZfc3RyaWRlOwotCi0gICAgaW50IGksIGo7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgIHsKLSAgICAgICAgdWxlZnRfY29sW2ldID0geC0+ZHN0LnVfYnVmZmVyIFtpKiB4LT5kc3QudXZfc3RyaWRlIC0xXTsKLSAgICAgICAgdmxlZnRfY29sW2ldID0geC0+ZHN0LnZfYnVmZmVyIFtpKiB4LT5kc3QudXZfc3RyaWRlIC0xXTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUpCi0gICAgewotICAgIGNhc2UgRENfUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBleHBlY3RlZF91ZGM7Ci0gICAgICAgIGludCBleHBlY3RlZF92ZGM7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgc2hpZnQ7Ci0gICAgICAgIGludCBVYXZlcmFnZSA9IDA7Ci0gICAgICAgIGludCBWYXZlcmFnZSA9IDA7Ci0KLSAgICAgICAgaWYgKHgtPnVwX2F2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVYXZlcmFnZSArPSB1YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgICAgIFZhdmVyYWdlICs9IHZhYm92ZV9yb3dbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeC0+bGVmdF9hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVWF2ZXJhZ2UgKz0gdWxlZnRfY29sW2ldOwotICAgICAgICAgICAgICAgIFZhdmVyYWdlICs9IHZsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgheC0+dXBfYXZhaWxhYmxlICYmICF4LT5sZWZ0X2F2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0ZWRfdWRjID0gMTI4OwotICAgICAgICAgICAgZXhwZWN0ZWRfdmRjID0gMTI4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc2hpZnQgPSAyICsgeC0+dXBfYXZhaWxhYmxlICsgeC0+bGVmdF9hdmFpbGFibGU7Ci0gICAgICAgICAgICBleHBlY3RlZF91ZGMgPSAoVWF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OwotICAgICAgICAgICAgZXhwZWN0ZWRfdmRjID0gKFZhdmVyYWdlICsgKDEgPDwgKHNoaWZ0IC0gMSkpKSA+PiBzaGlmdDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyp2cHhfbWVtc2V0KHVwcmVkX3B0cixleHBlY3RlZF91ZGMsNjQpOyovCi0gICAgICAgIC8qdnB4X21lbXNldCh2cHJlZF9wdHIsZXhwZWN0ZWRfdmRjLDY0KTsqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHVwcmVkX3B0ciwgZXhwZWN0ZWRfdWRjLCA4KTsKLSAgICAgICAgICAgIHZweF9tZW1zZXQodnByZWRfcHRyLCBleHBlY3RlZF92ZGMsIDgpOwotICAgICAgICAgICAgdXByZWRfcHRyICs9IHV2X3N0cmlkZTsgLyo4OyovCi0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gdXZfc3RyaWRlOyAvKjg7Ki8KLSAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIFZfUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9tZW1jcHkodXByZWRfcHRyLCB1YWJvdmVfcm93LCA4KTsKLSAgICAgICAgICAgIHZweF9tZW1jcHkodnByZWRfcHRyLCB2YWJvdmVfcm93LCA4KTsKLSAgICAgICAgICAgIHVwcmVkX3B0ciArPSB1dl9zdHJpZGU7IC8qODsqLwotICAgICAgICAgICAgdnByZWRfcHRyICs9IHV2X3N0cmlkZTsgLyo4OyovCi0gICAgICAgIH0KLQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEhfUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9tZW1zZXQodXByZWRfcHRyLCB1bGVmdF9jb2xbaV0sIDgpOwotICAgICAgICAgICAgdnB4X21lbXNldCh2cHJlZF9wdHIsIHZsZWZ0X2NvbFtpXSwgOCk7Ci0gICAgICAgICAgICB1cHJlZF9wdHIgKz0gdXZfc3RyaWRlOyAvKjg7Ki8KLSAgICAgICAgICAgIHZwcmVkX3B0ciArPSB1dl9zdHJpZGU7IC8qODsqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0gICAgY2FzZSBUTV9QUkVEOgotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcHJlZHUgPSB1bGVmdF9jb2xbaV0gKyB1YWJvdmVfcm93W2pdIC0gdXRvcF9sZWZ0OwotICAgICAgICAgICAgICAgIGludCBwcmVkdiA9IHZsZWZ0X2NvbFtpXSArIHZhYm92ZV9yb3dbal0gLSB2dG9wX2xlZnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZHUgPCAwKQotICAgICAgICAgICAgICAgICAgICBwcmVkdSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZHUgPiAyNTUpCi0gICAgICAgICAgICAgICAgICAgIHByZWR1ID0gMjU1OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR2IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHYgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR2ID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkdiA9IDI1NTsKLQotICAgICAgICAgICAgICAgIHVwcmVkX3B0cltqXSA9IHByZWR1OwotICAgICAgICAgICAgICAgIHZwcmVkX3B0cltqXSA9IHByZWR2OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cHJlZF9wdHIgKz0gdXZfc3RyaWRlOyAvKjg7Ki8KLSAgICAgICAgICAgIHZwcmVkX3B0ciArPSB1dl9zdHJpZGU7IC8qODsqLwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX1BSRUQ6Ci0gICAgY2FzZSBORUFSRVNUTVY6Ci0gICAgY2FzZSBORUFSTVY6Ci0gICAgY2FzZSBaRVJPTVY6Ci0gICAgY2FzZSBORVdNVjoKLSAgICBjYXNlIFNQTElUTVY6Ci0gICAgY2FzZSBNQl9NT0RFX0NPVU5UOgotICAgICAgICBicmVhazsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3JlY29uaW50cmEuaCBiL3ZwOC9jb21tb24vcmVjb25pbnRyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI1YTUzLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24vcmVjb25pbnRyYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfUkVDT05JTlRSQV9ICi0jZGVmaW5lIF9fSU5DX1JFQ09OSU5UUkFfSAotCi1leHRlcm4gdm9pZCBpbml0X2ludHJhX2xlZnRfYWJvdmVfcGl4ZWxzKE1BQ1JPQkxPQ0tEICp4KTsKLQotZXh0ZXJuIHZvaWQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dihNQUNST0JMT0NLRCAqeCk7Ci1leHRlcm4gdm9pZCB2cDhfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MoTUFDUk9CTE9DS0QgKngpOwotCi1leHRlcm4gdm9pZCB2cDhfcHJlZGljdF9pbnRyYTR4NChCTE9DS0QgKngsIGludCBiX21vZGUsIHVuc2lnbmVkIGNoYXIgKlByZWRpY3Rvcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmMgYi92cDgvY29tbW9uL3JlY29uaW50cmE0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3MGRjYS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3JlY29uaW50cmE0eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJyZWNvbi5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgInJlY29uaW50cmEuaCIKLQotdm9pZCB2cDhfcHJlZGljdF9pbnRyYTR4NChCTE9DS0QgKngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZWRpY3RvcikKLXsKLSAgICBpbnQgaSwgciwgYzsKLQotICAgIHVuc2lnbmVkIGNoYXIgKkFib3ZlID0gKih4LT5iYXNlX2RzdCkgKyB4LT5kc3QgLSB4LT5kc3Rfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgTGVmdFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIHRvcF9sZWZ0ID0gQWJvdmVbLTFdOwotCi0gICAgTGVmdFswXSA9ICgqKHgtPmJhc2VfZHN0KSlbeC0+ZHN0IC0gMV07Ci0gICAgTGVmdFsxXSA9ICgqKHgtPmJhc2VfZHN0KSlbeC0+ZHN0IC0gMSArIHgtPmRzdF9zdHJpZGVdOwotICAgIExlZnRbMl0gPSAoKih4LT5iYXNlX2RzdCkpW3gtPmRzdCAtIDEgKyAyICogeC0+ZHN0X3N0cmlkZV07Ci0gICAgTGVmdFszXSA9ICgqKHgtPmJhc2VfZHN0KSlbeC0+ZHN0IC0gMSArIDMgKiB4LT5kc3Rfc3RyaWRlXTsKLQotICAgIHN3aXRjaCAoYl9tb2RlKQotICAgIHsKLSAgICBjYXNlIEJfRENfUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBleHBlY3RlZF9kYyA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0ZWRfZGMgKz0gQWJvdmVbaV07Ci0gICAgICAgICAgICBleHBlY3RlZF9kYyArPSBMZWZ0W2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhwZWN0ZWRfZGMgPSAoZXhwZWN0ZWRfZGMgKyA0KSA+PiAzOwotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJlZGljdG9yW2NdID0gZXhwZWN0ZWRfZGM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByZWRpY3RvciArPSAxNjsKLSAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEJfVE1fUFJFRDoKLSAgICB7Ci0gICAgICAgIC8qIHByZWRpY3Rpb24gc2ltaWxhciB0byB0cnVlX21vdGlvbiBwcmVkaWN0aW9uICovCi0gICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHByZWQgPSBBYm92ZVtjXSAtIHRvcF9sZWZ0ICsgTGVmdFtyXTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZCA+IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDI1NTsKLQotICAgICAgICAgICAgICAgIHByZWRpY3RvcltjXSA9IHByZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByZWRpY3RvciArPSAxNjsKLSAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQl9WRV9QUkVEOgotICAgIHsKLQotICAgICAgICB1bnNpZ25lZCBpbnQgYXBbNF07Ci0gICAgICAgIGFwWzBdID0gKHRvcF9sZWZ0ICArIDIgKiBBYm92ZVswXSArIEFib3ZlWzFdICsgMikgPj4gMjsKLSAgICAgICAgYXBbMV0gPSAoQWJvdmVbMF0gKyAyICogQWJvdmVbMV0gKyBBYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgICAgIGFwWzJdID0gKEFib3ZlWzFdICsgMiAqIEFib3ZlWzJdICsgQWJvdmVbM10gKyAyKSA+PiAyOwotICAgICAgICBhcFszXSA9IChBYm92ZVsyXSArIDIgKiBBYm92ZVszXSArIEFib3ZlWzRdICsgMikgPj4gMjsKLQotICAgICAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgcHJlZGljdG9yW2NdID0gYXBbY107Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByZWRpY3RvciArPSAxNjsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIEJfSEVfUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgdW5zaWduZWQgaW50IGxwWzRdOwotICAgICAgICBscFswXSA9ICh0b3BfbGVmdCArIDIgKiBMZWZ0WzBdICsgTGVmdFsxXSArIDIpID4+IDI7Ci0gICAgICAgIGxwWzFdID0gKExlZnRbMF0gKyAyICogTGVmdFsxXSArIExlZnRbMl0gKyAyKSA+PiAyOwotICAgICAgICBscFsyXSA9IChMZWZ0WzFdICsgMiAqIExlZnRbMl0gKyBMZWZ0WzNdICsgMikgPj4gMjsKLSAgICAgICAgbHBbM10gPSAoTGVmdFsyXSArIDIgKiBMZWZ0WzNdICsgTGVmdFszXSArIDIpID4+IDI7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDQ7IGMrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbY10gPSBscFtyXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJlZGljdG9yICs9IDE2OwotICAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9MRF9QUkVEOgotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyID0gQWJvdmU7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAwXSA9IChwdHJbMF0gKyBwdHJbMV0gKiAyICsgcHRyWzJdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAwXSA9IChwdHJbMV0gKyBwdHJbMl0gKiAyICsgcHRyWzNdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDJdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAxXSA9Ci0gICAgICAgICAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDBdID0gKHB0clsyXSArIHB0clszXSAqIDIgKyBwdHJbNF0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDJdID0KLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMV0gPQotICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMF0gPSAocHRyWzNdICsgcHRyWzRdICogMiArIHB0cls1XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMl0gPQotICAgICAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAxXSA9IChwdHJbNF0gKyBwdHJbNV0gKiAyICsgcHRyWzZdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAyXSA9IChwdHJbNV0gKyBwdHJbNl0gKiAyICsgcHRyWzddICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDNdID0gKHB0cls2XSArIHB0cls3XSAqIDIgKyBwdHJbN10gKyAyKSA+PiAyOwotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9SRF9QUkVEOgotICAgIHsKLQotICAgICAgICB1bnNpZ25lZCBjaGFyIHBwWzldOwotCi0gICAgICAgIHBwWzBdID0gTGVmdFszXTsKLSAgICAgICAgcHBbMV0gPSBMZWZ0WzJdOwotICAgICAgICBwcFsyXSA9IExlZnRbMV07Ci0gICAgICAgIHBwWzNdID0gTGVmdFswXTsKLSAgICAgICAgcHBbNF0gPSB0b3BfbGVmdDsKLSAgICAgICAgcHBbNV0gPSBBYm92ZVswXTsKLSAgICAgICAgcHBbNl0gPSBBYm92ZVsxXTsKLSAgICAgICAgcHBbN10gPSBBYm92ZVsyXTsKLSAgICAgICAgcHBbOF0gPSBBYm92ZVszXTsKLQotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMF0gPSAocHBbMF0gKyBwcFsxXSAqIDIgKyBwcFsyXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclszICogMTYgKyAxXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMF0gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclszICogMTYgKyAyXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMV0gPQotICAgICAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAwXSA9IChwcFsyXSArIHBwWzNdICogMiArIHBwWzRdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsyICogMTYgKyAyXSA9Ci0gICAgICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDBdID0gKHBwWzNdICsgcHBbNF0gKiAyICsgcHBbNV0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDJdID0KLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMV0gPSAocHBbNF0gKyBwcFs1XSAqIDIgKyBwcFs2XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMl0gPSAocHBbNV0gKyBwcFs2XSAqIDIgKyBwcFs3XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAzXSA9IChwcFs2XSArIHBwWzddICogMiArIHBwWzhdICsgMikgPj4gMjsKLQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEJfVlJfUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgdW5zaWduZWQgY2hhciBwcFs5XTsKLQotICAgICAgICBwcFswXSA9IExlZnRbM107Ci0gICAgICAgIHBwWzFdID0gTGVmdFsyXTsKLSAgICAgICAgcHBbMl0gPSBMZWZ0WzFdOwotICAgICAgICBwcFszXSA9IExlZnRbMF07Ci0gICAgICAgIHBwWzRdID0gdG9wX2xlZnQ7Ci0gICAgICAgIHBwWzVdID0gQWJvdmVbMF07Ci0gICAgICAgIHBwWzZdID0gQWJvdmVbMV07Ci0gICAgICAgIHBwWzddID0gQWJvdmVbMl07Ci0gICAgICAgIHBwWzhdID0gQWJvdmVbM107Ci0KLQotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMF0gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAwXSA9IChwcFsyXSArIHBwWzNdICogMiArIHBwWzRdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAwXSA9IChwcFszXSArIHBwWzRdICogMiArIHBwWzVdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAwXSA9IChwcFs0XSArIHBwWzVdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDJdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAxXSA9IChwcFs0XSArIHBwWzVdICogMiArIHBwWzZdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDJdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAxXSA9IChwcFs1XSArIHBwWzZdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAyXSA9IChwcFs1XSArIHBwWzZdICogMiArIHBwWzddICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAyXSA9IChwcFs2XSArIHBwWzddICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDNdID0gKHBwWzZdICsgcHBbN10gKiAyICsgcHBbOF0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgM10gPSAocHBbN10gKyBwcFs4XSArIDEpID4+IDE7Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX1ZMX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwID0gQWJvdmU7Ci0KLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDBdID0gKHBwWzBdICsgcHBbMV0gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMF0gPSAocHBbMF0gKyBwcFsxXSAqIDIgKyBwcFsyXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAwXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMV0gPSAocHBbMV0gKyBwcFsyXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAxXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMF0gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAxXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMl0gPSAocHBbMl0gKyBwcFszXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclszICogMTYgKyAxXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMl0gPSAocHBbMl0gKyBwcFszXSAqIDIgKyBwcFs0XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMl0gPSAocHBbM10gKyBwcFs0XSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMl0gPSAocHBbM10gKyBwcFs0XSAqIDIgKyBwcFs1XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAzXSA9IChwcFs0XSArIHBwWzVdICogMiArIHBwWzZdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDNdID0gKHBwWzVdICsgcHBbNl0gKiAyICsgcHBbN10gKyAyKSA+PiAyOwotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQl9IRF9QUkVEOgotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBwcFs5XTsKLSAgICAgICAgcHBbMF0gPSBMZWZ0WzNdOwotICAgICAgICBwcFsxXSA9IExlZnRbMl07Ci0gICAgICAgIHBwWzJdID0gTGVmdFsxXTsKLSAgICAgICAgcHBbM10gPSBMZWZ0WzBdOwotICAgICAgICBwcFs0XSA9IHRvcF9sZWZ0OwotICAgICAgICBwcFs1XSA9IEFib3ZlWzBdOwotICAgICAgICBwcFs2XSA9IEFib3ZlWzFdOwotICAgICAgICBwcFs3XSA9IEFib3ZlWzJdOwotICAgICAgICBwcFs4XSA9IEFib3ZlWzNdOwotCi0KLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDBdID0gKHBwWzBdICsgcHBbMV0gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMV0gPSAocHBbMF0gKyBwcFsxXSAqIDIgKyBwcFsyXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAwXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMl0gPSAocHBbMV0gKyBwcFsyXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAxXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgM10gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAyXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMF0gPSAocHBbMl0gKyBwcFszXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMV0gPSAocHBbMl0gKyBwcFszXSAqIDIgKyBwcFs0XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAyXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMF0gPSAocHBbM10gKyBwcFs0XSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMV0gPSAocHBbM10gKyBwcFs0XSAqIDIgKyBwcFs1XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAyXSA9IChwcFs0XSArIHBwWzVdICogMiArIHBwWzZdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDNdID0gKHBwWzVdICsgcHBbNl0gKiAyICsgcHBbN10gKyAyKSA+PiAyOwotICAgIH0KLSAgICBicmVhazsKLQotCi0gICAgY2FzZSBCX0hVX1BSRUQ6Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpwcCA9IExlZnQ7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAwXSA9IChwcFswXSArIHBwWzFdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDFdID0gKHBwWzBdICsgcHBbMV0gKiAyICsgcHBbMl0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMl0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDBdID0gKHBwWzFdICsgcHBbMl0gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDFdID0gKHBwWzFdICsgcHBbMl0gKiAyICsgcHBbM10gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMl0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDBdID0gKHBwWzJdICsgcHBbM10gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDFdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbM10gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMl0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDNdID0KLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDJdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgM10gPSBwcFszXTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLQotICAgIH0KLX0KLS8qIGNvcHkgNCBieXRlcyBmcm9tIHRoZSBhYm92ZSByaWdodCBkb3duIHNvIHRoYXQgdGhlIDR4NCBwcmVkaWN0aW9uIG1vZGVzIHVzaW5nIHBpeGVscyBhYm92ZSBhbmQKLSAqIHRvIHRoZSByaWdodCBwcmVkaWN0aW9uIGhhdmUgZmlsbGVkIGluIHBpeGVscyB0byB1c2UuCi0gKi8KLXZvaWQgdnA4X2ludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KE1BQ1JPQkxPQ0tEICp4KQotewotICAgIHVuc2lnbmVkIGNoYXIgKmFib3ZlX3JpZ2h0ID0gKih4LT5ibG9ja1swXS5iYXNlX2RzdCkgKyB4LT5ibG9ja1swXS5kc3QgLSB4LT5ibG9ja1swXS5kc3Rfc3RyaWRlICsgMTY7Ci0KLSAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHIgPSAodW5zaWduZWQgaW50ICopYWJvdmVfcmlnaHQ7Ci0gICAgdW5zaWduZWQgaW50ICpkc3RfcHRyMCA9ICh1bnNpZ25lZCBpbnQgKikoYWJvdmVfcmlnaHQgKyA0ICogeC0+YmxvY2tbMF0uZHN0X3N0cmlkZSk7Ci0gICAgdW5zaWduZWQgaW50ICpkc3RfcHRyMSA9ICh1bnNpZ25lZCBpbnQgKikoYWJvdmVfcmlnaHQgKyA4ICogeC0+YmxvY2tbMF0uZHN0X3N0cmlkZSk7Ci0gICAgdW5zaWduZWQgaW50ICpkc3RfcHRyMiA9ICh1bnNpZ25lZCBpbnQgKikoYWJvdmVfcmlnaHQgKyAxMiAqIHgtPmJsb2NrWzBdLmRzdF9zdHJpZGUpOwotCi0gICAgKmRzdF9wdHIwID0gKnNyY19wdHI7Ci0gICAgKmRzdF9wdHIxID0gKnNyY19wdHI7Ci0gICAgKmRzdF9wdHIyID0gKnNyY19wdHI7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmggYi92cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjMmI3MS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX1JFQ09OSU5UUkE0eDRfSAotI2RlZmluZSBfX0lOQ19SRUNPTklOVFJBNHg0X0gKLQotZXh0ZXJuIHZvaWQgdnA4X2ludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KE1BQ1JPQkxPQ0tEICp4KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5jIGIvdnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3NmUyNS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJzZXR1cGludHJhcmVjb24uaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLQotdm9pZCB2cDhfc2V0dXBfaW50cmFfcmVjb24oWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBzZXQgdXAgZnJhbWUgbmV3IGZyYW1lIGZvciBpbnRyYSBjb2RlZCBibG9ja3MgKi8KLSAgICB2cHhfbWVtc2V0KHliZi0+eV9idWZmZXIgLSAxIC0geWJmLT55X3N0cmlkZSwgMTI3LCB5YmYtPnlfd2lkdGggKyA1KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgeWJmLT55X2hlaWdodDsgaSsrKQotICAgICAgICB5YmYtPnlfYnVmZmVyW3liZi0+eV9zdHJpZGUgKmkgLSAxXSA9ICh1bnNpZ25lZCBjaGFyKSAxMjk7Ci0KLSAgICB2cHhfbWVtc2V0KHliZi0+dV9idWZmZXIgLSAxIC0geWJmLT51dl9zdHJpZGUsIDEyNywgeWJmLT51dl93aWR0aCArIDUpOwotICAgIGZvciAoaSA9IDA7IGkgPCB5YmYtPnV2X2hlaWdodDsgaSsrKQotICAgICAgICB5YmYtPnVfYnVmZmVyW3liZi0+dXZfc3RyaWRlICppIC0gMV0gPSAodW5zaWduZWQgY2hhcikgMTI5OwotCi0gICAgdnB4X21lbXNldCh5YmYtPnZfYnVmZmVyIC0gMSAtIHliZi0+dXZfc3RyaWRlLCAxMjcsIHliZi0+dXZfd2lkdGggKyA1KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgeWJmLT51dl9oZWlnaHQ7IGkrKykKLSAgICAgICAgeWJmLT52X2J1ZmZlclt5YmYtPnV2X3N0cmlkZSAqaSAtIDFdID0gKHVuc2lnbmVkIGNoYXIpIDEyOTsKLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaCBiL3ZwOC9jb21tb24vc2V0dXBpbnRyYXJlY29uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjRmZDAuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKLWV4dGVybiB2b2lkIHZwOF9zZXR1cF9pbnRyYV9yZWNvbihZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3N1YnBpeGVsLmggYi92cDgvY29tbW9uL3N1YnBpeGVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYmJkYzkuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9zdWJwaXhlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgU1VCUElYRUxfSAotI2RlZmluZSBTVUJQSVhFTF9ICi0KLSNpbmNsdWRlICJ2cHhfY29uZmlnLmgiCi0KLSNkZWZpbmUgcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3Qoc3ltKSBcCi0gICAgdm9pZCBzeW0odW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3BpdGNoLCBpbnQgeG9mc3QsIGludCB5b2ZzdCwgXAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9waXRjaCkKLQotI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0Ci0jaW5jbHVkZSAieDg2L3N1YnBpeGVsX3g4Ni5oIgotI2VuZGlmCi0KLSNpZiBBUkNIX0FSTQotI2luY2x1ZGUgImFybS9zdWJwaXhlbF9hcm0uaCIKLSNlbmRpZgotCi0jaWYgQVJDSF9NSVBTCi0jaWYgZGVmaW5lZChNSVBTX0RTUF9SRVYpICYmIE1JUFNfRFNQX1JFVj49MgotI2luY2x1ZGUgIm1pcHMvc3VicGl4ZWxfbWlwcy5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiB2cDhfc3VicGl4X3NpeHRhcDE2eDE2Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwMTZ4MTYgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3N1YnBpeF9zaXh0YXAxNngxNik7Ci0KLSNpZm5kZWYgdnA4X3N1YnBpeF9zaXh0YXA4eDgKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA4eDggdnA4X3NpeHRhcF9wcmVkaWN0OHg4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zdWJwaXhfc2l4dGFwOHg4KTsKLQotI2lmbmRlZiB2cDhfc3VicGl4X3NpeHRhcDh4NAotI2RlZmluZSB2cDhfc3VicGl4X3NpeHRhcDh4NCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3N1YnBpeF9zaXh0YXA4eDQpOwotCi0jaWZuZGVmIHZwOF9zdWJwaXhfc2l4dGFwNHg0Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwNHg0IHZwOF9zaXh0YXBfcHJlZGljdF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc3VicGl4X3NpeHRhcDR4NCk7Ci0KLSNpZm5kZWYgdnA4X3N1YnBpeF9iaWxpbmVhcjE2eDE2Ci0jZGVmaW5lIHZwOF9zdWJwaXhfYmlsaW5lYXIxNngxNiB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zdWJwaXhfYmlsaW5lYXIxNngxNik7Ci0KLSNpZm5kZWYgdnA4X3N1YnBpeF9iaWxpbmVhcjh4OAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyOHg4IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zdWJwaXhfYmlsaW5lYXI4eDgpOwotCi0jaWZuZGVmIHZwOF9zdWJwaXhfYmlsaW5lYXI4eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9iaWxpbmVhcjh4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4NF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc3VicGl4X2JpbGluZWFyOHg0KTsKLQotI2lmbmRlZiB2cDhfc3VicGl4X2JpbGluZWFyNHg0Ci0jZGVmaW5lIHZwOF9zdWJwaXhfYmlsaW5lYXI0eDQgdnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3N1YnBpeF9iaWxpbmVhcjR4NCk7Ci0KLXR5cGVkZWYgcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QoKCp2cDhfc3VicGl4X2ZuX3QpKTsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdnA4X3N1YnBpeF9mbl90ICBzaXh0YXAxNngxNjsKLSAgICB2cDhfc3VicGl4X2ZuX3QgIHNpeHRhcDh4ODsKLSAgICB2cDhfc3VicGl4X2ZuX3QgIHNpeHRhcDh4NDsKLSAgICB2cDhfc3VicGl4X2ZuX3QgIHNpeHRhcDR4NDsKLSAgICB2cDhfc3VicGl4X2ZuX3QgIGJpbGluZWFyMTZ4MTY7Ci0gICAgdnA4X3N1YnBpeF9mbl90ICBiaWxpbmVhcjh4ODsKLSAgICB2cDhfc3VicGl4X2ZuX3QgIGJpbGluZWFyOHg0OwotICAgIHZwOF9zdWJwaXhfZm5fdCAgYmlsaW5lYXI0eDQ7Ci19IHZwOF9zdWJwaXhfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgU1VCUElYX0lOVk9LRShjdHgsZm4pIChjdHgpLT5mbgotI2Vsc2UKLSNkZWZpbmUgU1VCUElYX0lOVk9LRShjdHgsZm4pIHZwOF9zdWJwaXhfIyNmbgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCBiL3ZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTk2OTguLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0Ci12b2lkIHZweF9yZXNldF9tbXhfc3RhdGUodm9pZCk7Ci0jZGVmaW5lIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKSB2cHhfcmVzZXRfbW14X3N0YXRlKCkKLSNlbHNlCi0jZGVmaW5lIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKQotI2VuZGlmCi0KLXN0cnVjdCBWUDhDb21tb247Ci12b2lkIHZwOF9tYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhzdHJ1Y3QgVlA4Q29tbW9uICopOwpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi90aHJlYWRpbmcuaCBiL3ZwOC9jb21tb24vdGhyZWFkaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZWFmMDguLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi90aHJlYWRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9QVEhSRUFEX0VNVUxBVElPTgotI2RlZmluZSBfUFRIUkVBRF9FTVVMQVRJT04KLQotI2RlZmluZSBWUFhJTkZJTklURSAxMDAwMCAgICAgICAvKiAxMHNlY29uZC4gKi8KLQotI2lmIENPTkZJR19PU19TVVBQT1JUICYmIENPTkZJR19NVUxUSVRIUkVBRAotCi0vKiBUaHJlYWQgbWFuYWdlbWVudCBtYWNyb3MgKi8KLSNpZmRlZiBfV0lOMzIKLS8qIFdpbjMyICovCi0jZGVmaW5lIF9XSU4zMl9XSU5OVCAweDUwMCAvKiBXSU5CQVNFLkggLSBFbmFibGUgc2lnbmFsX29iamVjdF9hbmRfd2FpdCAqLwotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZGVmaW5lIFRIUkVBRF9GVU5DVElPTiBEV09SRCBXSU5BUEkKLSNkZWZpbmUgVEhSRUFEX0ZVTkNUSU9OX1JFVFVSTiBEV09SRAotI2RlZmluZSBUSFJFQURfU1BFQ0lGSUNfSU5ERVggRFdPUkQKLSNkZWZpbmUgcHRocmVhZF90IEhBTkRMRQotI2RlZmluZSBwdGhyZWFkX2F0dHJfdCBEV09SRAotI2RlZmluZSBwdGhyZWFkX2NyZWF0ZSh0aGhhbmRsZSxhdHRyLHRoZnVuYyx0aGFyZykgKGludCkoKCp0aGhhbmRsZT0oSEFORExFKV9iZWdpbnRocmVhZGV4KE5VTEwsMCwodW5zaWduZWQgaW50IChfX3N0ZGNhbGwgKikodm9pZCAqKSl0aGZ1bmMsdGhhcmcsMCxOVUxMKSk9PU5VTEwpCi0jZGVmaW5lIHB0aHJlYWRfam9pbih0aHJlYWQsIHJlc3VsdCkgKChXYWl0Rm9yU2luZ2xlT2JqZWN0KCh0aHJlYWQpLFZQWElORklOSVRFKSE9V0FJVF9PQkpFQ1RfMCkgfHwgIUNsb3NlSGFuZGxlKHRocmVhZCkpCi0jZGVmaW5lIHB0aHJlYWRfZGV0YWNoKHRocmVhZCkgaWYodGhyZWFkIT1OVUxMKUNsb3NlSGFuZGxlKHRocmVhZCkKLSNkZWZpbmUgdGhyZWFkX3NsZWVwKG5tcykgU2xlZXAobm1zKQotI2RlZmluZSBwdGhyZWFkX2NhbmNlbCh0aHJlYWQpIHRlcm1pbmF0ZV90aHJlYWQodGhyZWFkLDApCi0jZGVmaW5lIHRzX2tleV9jcmVhdGUodHNfa2V5LCBkZXN0cnVjdG9yKSB7dHNfa2V5ID0gVGxzQWxsb2MoKTt9OwotI2RlZmluZSBwdGhyZWFkX2dldHNwZWNpZmljKHRzX2tleSkgVGxzR2V0VmFsdWUodHNfa2V5KQotI2RlZmluZSBwdGhyZWFkX3NldHNwZWNpZmljKHRzX2tleSwgdmFsdWUpIFRsc1NldFZhbHVlKHRzX2tleSwgKHZvaWQgKil2YWx1ZSkKLSNkZWZpbmUgcHRocmVhZF9zZWxmKCkgR2V0Q3VycmVudFRocmVhZElkKCkKLSNlbHNlCi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPG1hY2gvdGFzay5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2Vsc2UKLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotLyogcHRocmVhZHMgKi8KLS8qIE5lYXJseSBldmVyeXRoaW5nIGlzIGFscmVhZHkgZGVmaW5lZCAqLwotI2RlZmluZSBUSFJFQURfRlVOQ1RJT04gdm9pZCAqCi0jZGVmaW5lIFRIUkVBRF9GVU5DVElPTl9SRVRVUk4gdm9pZCAqCi0jZGVmaW5lIFRIUkVBRF9TUEVDSUZJQ19JTkRFWCBwdGhyZWFkX2tleV90Ci0jZGVmaW5lIHRzX2tleV9jcmVhdGUodHNfa2V5LCBkZXN0cnVjdG9yKSBwdGhyZWFkX2tleV9jcmVhdGUgKCYodHNfa2V5KSwgZGVzdHJ1Y3Rvcik7Ci0jZW5kaWYKLQotLyogU3luY3Jocm9uaXphdGlvbiBtYWNyb3M6IFdpbjMyIGFuZCBQdGhyZWFkcyAqLwotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBzZW1fdCBIQU5ETEUKLSNkZWZpbmUgcGF1c2Uodm9pZHBhcmEpIF9fYXNtIFBBVVNFCi0jZGVmaW5lIHNlbV9pbml0KHNlbSwgc2VtX2F0dHIxLCBzZW1faW5pdF92YWx1ZSkgKGludCkoKCpzZW0gPSBDcmVhdGVFdmVudChOVUxMLEZBTFNFLEZBTFNFLE5VTEwpKT09TlVMTCkKLSNkZWZpbmUgc2VtX3dhaXQoc2VtKSAoaW50KShXQUlUX09CSkVDVF8wICE9IFdhaXRGb3JTaW5nbGVPYmplY3QoKnNlbSxWUFhJTkZJTklURSkpCi0jZGVmaW5lIHNlbV9wb3N0KHNlbSkgU2V0RXZlbnQoKnNlbSkKLSNkZWZpbmUgc2VtX2Rlc3Ryb3koc2VtKSBpZigqc2VtKSgoaW50KShDbG9zZUhhbmRsZSgqc2VtKSk9PVRSVUUpCi0jZGVmaW5lIHRocmVhZF9zbGVlcChubXMpIFNsZWVwKG5tcykKLQotI2Vsc2UKLQotI2lmZGVmIF9fQVBQTEVfXwotI2RlZmluZSBzZW1fdCBzZW1hcGhvcmVfdAotI2RlZmluZSBzZW1faW5pdChYLFksWikgc2VtYXBob3JlX2NyZWF0ZShtYWNoX3Rhc2tfc2VsZigpLCBYLCBTWU5DX1BPTElDWV9GSUZPLCBaKQotI2RlZmluZSBzZW1fd2FpdChzZW0pIChzZW1hcGhvcmVfd2FpdCgqc2VtKSApCi0jZGVmaW5lIHNlbV9wb3N0KHNlbSkgc2VtYXBob3JlX3NpZ25hbCgqc2VtKQotI2RlZmluZSBzZW1fZGVzdHJveShzZW0pIHNlbWFwaG9yZV9kZXN0cm95KG1hY2hfdGFza19zZWxmKCksKnNlbSkKLSNkZWZpbmUgdGhyZWFkX3NsZWVwKG5tcykgLyogeyBzdHJ1Y3QgdGltZXNwZWMgdHM7dHMudHZfc2VjPTA7IHRzLnR2X25zZWMgPSAxMDAwKm5tcztuYW5vc2xlZXAoJnRzLCBOVUxMKTt9ICovCi0jZWxzZQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jZGVmaW5lIHRocmVhZF9zbGVlcChubXMpIHNjaGVkX3lpZWxkKCk7Lyoge3N0cnVjdCB0aW1lc3BlYyB0czt0cy50dl9zZWM9MDsgdHMudHZfbnNlYyA9IDEwMDAqbm1zO25hbm9zbGVlcCgmdHMsIE5VTEwpO30gKi8KLSNlbmRpZgotLyogTm90IFdpbmRvd3MuIEFzc3VtZSBwdGhyZWFkcyAqLwotCi0jZW5kaWYKLQotI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0Ci0jaW5jbHVkZSAidnB4X3BvcnRzL3g4Ni5oIgotI2Vsc2UKLSNkZWZpbmUgeDg2X3BhdXNlX2hpbnQoKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBDT05GSUdfT1NfU1VQUE9SVCAmJiBDT05GSUdfTVVMVElUSFJFQUQgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3R5cGVfYWxpYXNlcy5oIGIvdnA4L2NvbW1vbi90eXBlX2FsaWFzZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNTMxYS4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3R5cGVfYWxpYXNlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgIE1vZHVsZSBUaXRsZSA6ICAgICB0eXBlX2FsaWFzZXMuaAotKgotKiAgIERlc2NyaXB0aW9uICA6ICAgICBTdGFuZGFyZCB0eXBlIGFsaWFzZXMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSU5DX1RZUEVfQUxJQVNFU19ICi0jZGVmaW5lIF9fSU5DX1RZUEVfQUxJQVNFU19ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRVhQT1JUCi0jZGVmaW5lIElNUE9SVCAgICAgICAgICBleHRlcm4gICAgICAvKiBVc2VkIHRvIGRlY2xhcmUgaW1wb3J0ZWQgZGF0YSAmIHJvdXRpbmVzICovCi0jZGVmaW5lIFBSSVZBVEUgICAgICAgICBzdGF0aWMgICAgICAvKiBVc2VkIHRvIGRlY2xhcmUgJiBkZWZpbmUgbW9kdWxlLWxvY2FsIGRhdGEgKi8KLSNkZWZpbmUgTE9DQUwgICAgICAgICAgIHN0YXRpYyAgICAgIC8qIFVzZWQgdG8gZGVmaW5lIGFsbCBwZXJzaXN0ZW50IHJvdXRpbmUtbG9jYWwgZGF0YSAqLwotI2RlZmluZSBTVERfSU5fUEFUSCAgICAgMCAgICAgICAgICAgLyogU3RhbmRhcmQgaW5wdXQgcGF0aCAqLwotI2RlZmluZSBTVERfT1VUX1BBVEggICAgMSAgICAgICAgICAgLyogU3RhbmRhcmQgb3V0cHV0IHBhdGggKi8KLSNkZWZpbmUgU1REX0VSUl9QQVRIICAgIDIgICAgICAgICAgIC8qIFN0YW5kYXJkIGVycm9yIHBhdGggKi8KLSNkZWZpbmUgU1REX0lOX0ZJTEUgICAgIHN0ZGluICAgICAgIC8qIFN0YW5kYXJkIGlucHV0IGZpbGUgcG9pbnRlciAqLwotI2RlZmluZSBTVERfT1VUX0ZJTEUgICAgc3Rkb3V0ICAgICAgLyogU3RhbmRhcmQgb3V0cHV0IGZpbGUgcG9pbnRlciAqLwotI2RlZmluZSBTVERfRVJSX0ZJTEUgICAgc3RkZXJyICAgICAgLyogU3RhbmRhcmQgZXJyb3IgZmlsZSBwb2ludGVyICovCi0jZGVmaW5lIG1heF9pbnQgICAgICAgICAweDdGRkZGRkZGCi0KLSNkZWZpbmUgX19leHBvcnQKLSNkZWZpbmUgX2V4cG9ydAotCi0jZGVmaW5lIENDT05WCi0KLSNpZm5kZWYgTlVMTAotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIE5VTEwgICAgMAotI2Vsc2UKLSNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgICAxCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogVHlwZWRlZnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIFRZUEVfSU5UOAotI2RlZmluZSBUWVBFX0lOVDgKLXR5cGVkZWYgc2lnbmVkIGNoYXIgICAgIElOVDg7Ci0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX0lOVDE2Ci0vKiNkZWZpbmUgVFlQRV9JTlQxNiovCi10eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBJTlQxNjsKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfSU5UMzIKLS8qI2RlZmluZSBUWVBFX0lOVDMyKi8KLXR5cGVkZWYgc2lnbmVkIGludCAgICAgIElOVDMyOwotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9VSU5UOAotLyojZGVmaW5lIFRZUEVfVUlOVDgqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVUlOVDg7Ci0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX1VJTlQzMgotLyojZGVmaW5lIFRZUEVfVUlOVDMyKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVJTlQzMjsKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfVUlOVDE2Ci0vKiNkZWZpbmUgVFlQRV9VSU5UMTYqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVUlOVDE2OwotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9CT09MCi0vKiNkZWZpbmUgVFlQRV9CT09MKi8KLXR5cGVkZWYgaW50ICAgICAgICAgICAgIEJPT0w7Ci0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgQk9PTEVBTjsKLQotI2lmZGVmIF9NU0NfVkVSCi10eXBlZGVmIF9faW50NjQgSU5UNjQ7Ci0jZWxzZQotCi0jaWZuZGVmIFRZUEVfSU5UNjQKLSNpZmRlZiBfVE1TMzIwQzZYCi0vKiBmb3Igbm93IHdlIG9ubHkgaGF2ZSA0MGJpdHMgKi8KLXR5cGVkZWYgbG9uZyBJTlQ2NDsKLSNlbHNlCi10eXBlZGVmIGxvbmcgbG9uZyBJTlQ2NDsKLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgotCi0vKiBGbG9hdGluZyBwb2ludCAqLwotdHlwZWRlZiAgZG91YmxlICAgICAgICAgRkxPQVQ2NDsKLXR5cGVkZWYgIGZsb2F0ICAgICAgICAgIEZMT0FUMzI7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYvYm9vbGNvZGVyLmN4eCBiL3ZwOC9jb21tb24veDg2L2Jvb2xjb2Rlci5jeHgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZGRmMWYuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvYm9vbGNvZGVyLmN4eAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotCi0vKiBBcml0aG1ldGljIGJvb2wgY29kZXIgd2l0aCBsYXJnaXNoIHByb2JhYmlsaXR5IHJhbmdlLgotICAgVGltb3RoeSBTIE11cnBoeSAgNiBBdWd1c3QgMjAwNCAqLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiYm9vbF9jb2Rlci5oIgotCi0jaWYgdGltX3ZwOAotICAgIGV4dGVybiAiQyIgewotIyAgICAgICBpbmNsdWRlICJWUDhjeC90cmVld3JpdGVyLmgiCi0gICAgfQotI2VuZGlmCi0KLWludF90eXBlczo6fmludF90eXBlcygpIHt9Ci0KLXZvaWQgYm9vbF9jb2Rlcl9zcGVjOjpjaGVja19wcmVjKCkgY29uc3QgewotICAgIGFzc2VydCggdyAgJiYgIChyPT1VcCB8fCB3ID4gMSkgICYmICB3IDwgMjQgICYmICAoZWJpYXMgfHwgdyA8IDE3KSk7Ci19Ci0KLWJvb2wgYm9vbF9jb2Rlcl9zcGVjOjpmbG9hdF9pbml0KCB1aW50IEViaXRzLCB1aW50IE1iaXRzKSB7Ci0gICAgdWludCBiID0gKGViaXRzID0gRWJpdHMpICsgKG1iaXRzID0gTWJpdHMpOwotICAgIGlmKCBiKSB7Ci0gICAgICAgIGFzc2VydCggZWJpdHMgPCA2ICAmJiAgdyArIG1iaXRzIDwgMzEpOwotICAgICAgICBhc3NlcnQoIGViaXRzICsgbWJpdHMgIDwgIHNpemVvZihJbmRleCkgKiA4KTsKLSAgICAgICAgZWJpYXMgPSAoMSA8PCBlYml0cykgKyAxICsgbWJpdHM7Ci0gICAgICAgIG1tYXNrID0gKDEgPDwgbWJpdHMpIC0gMTsKLSAgICAgICAgbWF4X2luZGV4ID0gKCAoIGhhbGZfaW5kZXggPSAxIDw8IGIgKSA8PCAxKSAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZWJpYXMgPSAwOwotICAgICAgICBtYXhfaW5kZXggPSAyNTU7Ci0gICAgICAgIGhhbGZfaW5kZXggPSAxMjg7Ci0gICAgfQotICAgIGNoZWNrX3ByZWMoKTsKLSAgICByZXR1cm4gYj8gMTowOwotfQotCi12b2lkIGJvb2xfY29kZXJfc3BlYzo6Y29zdF9pbml0KCkKLXsKLSAgICBzdGF0aWMgY2RvdWJsZSBjID0gLSgxIDw8IDIwKS9sb2coIDIuKTsKLQotICAgIEZJTEUgKmYgPSBmb3BlbiggImNvc3RzLnR4dCIsICJ3Iik7Ci0gICAgYXNzZXJ0KCBmKTsKLQotICAgIGFzc2VydCggc2l6ZW9mKGludCkgPj0gNCk7ICAvKiBmb3IgQyBpbnRlcmZhY2UgKi8KLSAgICBhc3NlcnQoIG1heF9pbmRleCA8PSAyNTUpOyAgIC8qIHNpemUgb2YgQ3RibCAqLwotICAgIHVpbnQgaSA9IDA7ICBkbyB7Ci0gICAgICAgIGNkb3VibGUgcCA9ICggKnRoaXMpKCAoSW5kZXgpIGkpOwotICAgICAgICBDdGJsW2ldID0gKHVpbnQzMikgKCBsb2coIHApICogYyk7Ci0gICAgICAgIGZwcmludGYoCi0gICAgICAgICAgICBmLCAiY29zdCggJWQgLT4gJTEwLjdmKSA9ICUxMGQgPSAlMTIuNWYgYml0c1xuIiwKLSAgICAgICAgICAgIGksIHAsIEN0YmxbaV0sIChkb3VibGUpIEN0YmxbaV0gLyAoMTw8MjApCi0gICAgICAgICk7Ci0gICAgfSB3aGlsZSggKytpIDw9IG1heF9pbmRleCk7Ci0gICAgZmNsb3NlKCBmKTsKLX0KLQotYm9vbF9jb2Rlcl9zcGVjX2V4cGxpY2l0X3RhYmxlOjpib29sX2NvZGVyX3NwZWNfZXhwbGljaXRfdGFibGUoCi0gICAgY3VpbnQxNiB0YmxbMjU2XSwgUm91bmRpbmcgcnIsIHVpbnQgcHJlYwotKQotICA6IGJvb2xfY29kZXJfc3BlYyggcHJlYywgcnIpCi17Ci0gICAgY2hlY2tfcHJlYygpOwotICAgIHVpbnQgaSA9IDA7Ci0gICAgaWYoIHRibCkKLSAgICAgICAgZG8geyBQdGJsW2ldID0gdGJsW2ldO30gIHdoaWxlKCArK2kgPCAyNTYpOwotICAgIGVsc2UKLSAgICAgICAgZG8geyBQdGJsW2ldID0gaSA8PCA4O30gIHdoaWxlKCArK2kgPCAyNTYpOwotICAgIGNvc3RfaW5pdCgpOwotfQotCi0KLWJvb2xfY29kZXJfc3BlY19leHBvbmVudGlhbF90YWJsZTo6Ym9vbF9jb2Rlcl9zcGVjX2V4cG9uZW50aWFsX3RhYmxlKAotICAgIHVpbnQgeCwgUm91bmRpbmcgcnIsIHVpbnQgcHJlYwotKQotICA6IGJvb2xfY29kZXJfc3BlYyggcHJlYywgcnIpCi17Ci0gICAgYXNzZXJ0KCB4ID4gMSAgJiYgIHggPD0gMTYpOwotICAgIGNoZWNrX3ByZWMoKTsKLSAgICBQdGJsWzEyOF0gPSAzMjc2OHU7Ci0gICAgUHRibFswXSA9ICh1aW50MTYpIHBvdyggMi4sIDE2LiAtIHgpOwotICAgIC0teDsKLSAgICBpbnQgaT0xOyAgZG8gewotICAgICAgICBjZG91YmxlIGQgPSBwb3coIC41LCAxLiArICgxLiAtIGkvMTI4LikqeCkgKiA2NTUzNi47Ci0gICAgICAgIHVpbnQxNiB2ID0gKHVpbnQxNikgZDsKLSAgICAgICAgaWYoIHYgPCBpKQotICAgICAgICAgICAgdiA9IGk7Ci0gICAgICAgIFB0YmxbMjU2LWldID0gKHVpbnQxNikgKCA2NTUzNlUgLSAoUHRibFtpXSA9IHYpKTsKLSAgICB9IHdoaWxlKCArK2kgPCAxMjgpOwotICAgIGNvc3RfaW5pdCgpOwotfQotCi1ib29sX2NvZGVyX3NwZWM6OmJvb2xfY29kZXJfc3BlYyggRklMRSAqZnApIHsKLSAgICBmc2NhbmYoIGZwLCAiJWQiLCAmdyk7Ci0gICAgaW50IHY7Ci0gICAgZnNjYW5mKCBmcCwgIiVkIiwgJnYpOwotICAgIGFzc2VydCggMCA8PSB2ICAmJiAgdiA8PSAyKTsKLSAgICByID0gKFJvdW5kaW5nKSB2OwotICAgIGZzY2FuZiggZnAsICIlZCIsICZlYml0cyk7Ci0gICAgZnNjYW5mKCBmcCwgIiVkIiwgJm1iaXRzKTsKLSAgICBpZiggZmxvYXRfaW5pdCggZWJpdHMsIG1iaXRzKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGludCBpPTA7ICBkbyB7Ci0gICAgICAgIHVpbnQgdjsKLSAgICAgICAgZnNjYW5mKCBmcCwgIiVkIiwgJnYpOwotICAgICAgICBhc3NlcnQoIDAgPD12ICAmJiAgdiA8PSA2NTUzNVUpOwotICAgICAgICBQdGJsW2ldID0gdjsKLSAgICB9IHdoaWxlKCArK2kgPCAyNTYpOwotICAgIGNvc3RfaW5pdCgpOwotfQotCi12b2lkIGJvb2xfY29kZXJfc3BlYzo6ZHVtcCggRklMRSAqZnApIGNvbnN0IHsKLSAgICBmcHJpbnRmKCBmcCwgIiVkICVkICVkICVkXG4iLCB3LCAoaW50KSByLCBlYml0cywgbWJpdHMpOwotICAgIGlmKCBlYml0cyAgfHwgIG1iaXRzKQotICAgICAgICByZXR1cm47Ci0gICAgaW50IGk9MDsgIGRvIHsgZnByaW50ZiggZnAsICIlZFxuIiwgUHRibFtpXSk7fSAgd2hpbGUoICsraSA8IDI1Nik7Ci19Ci0KLXZwOGJjX2luZGV4X3QgYm9vbF9jb2Rlcl9zcGVjOjpvcGVyYXRvcigpKCBkb3VibGUgcCkgY29uc3QKLXsKLSAgICBpZiggcCA8PSAwLikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYoIHAgPj0gMS4pCi0gICAgICAgIHJldHVybiBtYXhfaW5kZXg7Ci0gICAgaWYoIGViaWFzKSB7Ci0gICAgICAgIGlmKCBwID4gLjUpCi0gICAgICAgICAgICByZXR1cm4gbWF4X2luZGV4IC0gKCAqdGhpcykoIDEuIC0gcCk7Ci0gICAgICAgIGludCBlOwotICAgICAgICB1aW50IG0gPSAodWludCkgbGRleHAoIGZyZXhwKCBwLCAmZSksIG1iaXRzICsgMik7Ci0gICAgICAgIHVpbnQgeCA9IDEgPDwgKG1iaXRzICsgMSk7Ci0gICAgICAgIGFzc2VydCggeCA8PSBtICAmJiAgbSA8IHg8PDEpOwotICAgICAgICBpZiggKG0gPSAobSA+PiAxKSArIChtICYgMSkpID49IHgpIHsKLSAgICAgICAgICAgIG0gPSB4ID4+IDE7Ci0gICAgICAgICAgICArK2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHkgPSAxIDw8IGViaXRzOwotICAgICAgICBpZiggKGUgKz0geSkgPj0geSkKLSAgICAgICAgICAgIHJldHVybiBoYWxmX2luZGV4IC0gMTsKLSAgICAgICAgaWYoIGUgPCAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAoSW5kZXgpICggKGUgPDwgbWJpdHMpICsgKG0gJiBtbWFzaykpOwotICAgIH0KLQotICAgIGN1aW50MTYgdiA9ICh1aW50MTYpIChwICogNjU1MzYuKTsKLSAgICBpbnQgaSA9IDEyODsKLSAgICBpbnQgaiA9IDEyODsKLSAgICB1aW50MTYgdzsKLSAgICB3aGlsZSggdyA9IFB0YmxbaV0sIGogPj49IDEpIHsKLSAgICAgICAgaWYoIHcgPCB2KQotICAgICAgICAgICAgaSArPSBqOwotICAgICAgICBlbHNlIGlmKCB3ID09IHYpCi0gICAgICAgICAgICByZXR1cm4gKHVjaGFyKSBpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpIC09IGo7Ci0gICAgfQotICAgIGlmKCB3ID4gdikgewotICAgICAgICBjdWludDE2IHggPSBQdGJsW2ktMV07Ci0gICAgICAgIGlmKCB2IDw9IHggIHx8ICB3IC0gdiA+IHYgLSB4KQotICAgICAgICAgICAgLS1pOwotICAgIH0gZWxzZSBpZiggdyA8IHYgICYmICBpIDwgMjU1KSB7Ci0gICAgICAgIGN1aW50MTYgeCA9IFB0YmxbaSsxXTsKLSAgICAgICAgaWYoIHggPD0gdiAgfHwgIHggLSB2IDwgdiAtIHcpCi0gICAgICAgICAgICArK2k7Ci0gICAgfQotICAgIHJldHVybiAoSW5kZXgpIGk7Ci19Ci0KLWRvdWJsZSBib29sX2NvZGVyX3NwZWM6Om9wZXJhdG9yKCkoIEluZGV4IGkpIGNvbnN0IHsKLSAgICBpZiggIWViaWFzKQotICAgICAgICByZXR1cm4gUHRibFtpXS82NTUzNi47Ci0gICAgaWYoIGkgPj0gaGFsZl9pbmRleCkKLSAgICAgICAgcmV0dXJuIDEuIC0gKCAqdGhpcykoIChJbmRleCkgKG1heF9pbmRleCAtIGkpKTsKLSAgICByZXR1cm4gbGRleHAoIChkb3VibGUpbWFudGlzc2EoIGkpLCAtIChpbnQpIGV4cG9uZW50KCBpKSk7Ci19Ci0KLQotCi12b2lkIGJvb2xfd3JpdGVyOjpjYXJyeSgpIHsKLSAgICB1Y2hhciAqcCA9IEI7Ci0gICAgYXNzZXJ0KCBwID4gQnN0YXJ0KTsKLSAgICB3aGlsZSggKi0tcCA9PSAyNTUpIHsgYXNzZXJ0KCBwID4gQnN0YXJ0KTsgICpwID0gMDt9Ci0gICAgKysqcDsKLX0KLQotCi1ib29sX3dyaXRlcjo6Ym9vbF93cml0ZXIoIGNfc3BlYyYgcywgdWNoYXIgKkRlc3QsIHNpemVfdCBMZW4pCi0gIDogYm9vbF9jb2RlciggcyksCi0gICAgQnN0YXJ0KCBEZXN0KSwKLSAgICBCZW5kKCBMZW4/IERlc3QrTGVuIDogMCksCi0gICAgQiggRGVzdCkKLXsKLSAgICBhc3NlcnQoIERlc3QpOwotICAgIHJlc2V0KCk7Ci19Ci0KLWJvb2xfd3JpdGVyOjp+Ym9vbF93cml0ZXIoKSB7IGZsdXNoKCk7fQotCi0jaWYgMQotICAgIGV4dGVybiAiQyIgeyBpbnQgYmNfdiA9IDA7fQotI2Vsc2UKLSMgICBkZWZpbmUgYmNfdiAwCi0jZW5kaWYKLQotCi12b2lkIGJvb2xfd3JpdGVyOjpyYXcoIGJvb2wgdmFsdWUsIHVpbnQzMiBzKSB7Ci0gICAgdWludDMyIEwgPSBMb3c7Ci0KLSAgICBhc3NlcnQoIFJhbmdlID49IG1pbl9yYW5nZSAgJiYgIFJhbmdlIDw9IHNwZWMubWF4X3JhbmdlKCkpOwotICAgIGFzc2VydCggIWlzX3RvYXN0ICAmJiAgcyAgJiYgIHMgPCBSYW5nZSk7Ci0KLSAgICBpZiggYmNfdikgcHJpbnRmKAotICAgICAgICAiV3JpdGluZyBhICVkLCBCICV4ICBMb3cgJXggIFJhbmdlICV4ICBzICV4ICAgYmxhZyAlZCAuLi5cbiIsCi0gICAgICAgIHZhbHVlPyAxOjAsIEItQnN0YXJ0LCBMb3csIFJhbmdlLCBzLCBiaXRfbGFnCi0gICAgKTsKLSAgICBpZiggdmFsdWUpIHsKLSAgICAgICAgTCArPSBzOwotICAgICAgICBzID0gUmFuZ2UgLSBzOwotICAgIH0gZWxzZQotICAgICAgICBzIC09IHJpbmM7Ci0gICAgaWYoIHMgPCBtaW5fcmFuZ2UpIHsKLSAgICAgICAgaW50IGN0ID0gYml0X2xhZzsgIGRvIHsKLSAgICAgICAgICAgIGlmKCAhLS1jdCkgewotICAgICAgICAgICAgICAgIGN0ID0gODsKLSAgICAgICAgICAgICAgICBpZiggTCAmICgxIDw8IDMxKSkKLSAgICAgICAgICAgICAgICAgICAgY2FycnkoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoICFCZW5kICB8fCAgQiA8IEJlbmQpOwotICAgICAgICAgICAgICAgICpCKysgPSAodWNoYXIpIChMID4+IDIzKTsKLSAgICAgICAgICAgICAgICBMICY9ICgxPDwyMykgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKCBMICs9IEwsIChzICs9IHMgKyByaW5jKSA8IG1pbl9yYW5nZSk7Ci0gICAgICAgIGJpdF9sYWcgPSBjdDsKLSAgICB9Ci0gICAgTG93ID0gTDsKLSAgICBSYW5nZSA9IHM7Ci0gICAgaWYoIGJjX3YpCi0gICAgICAgIHByaW50ZigKLSAgICAgICAgICAgICIuLi5kb25lLCBCICV4ICBMb3cgJXggIFJhbmdlICV4ICBibGFnICVkIFxuIiwKLSAgICAgICAgICAgICAgICBCLUJzdGFydCwgTG93LCBSYW5nZSwgYml0X2xhZwotICAgICAgICApOwotfQotCi1ib29sX3dyaXRlciYgYm9vbF93cml0ZXI6OmZsdXNoKCkgewotICAgIGlmKCBpc190b2FzdCkKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIGludCBiID0gYml0X2xhZzsKLSAgICB1aW50MzIgTCA9IExvdzsKLSAgICBhc3NlcnQoIGIpOwotICAgIGlmKCBMICYgKDEgPDwgKDMyIC0gYikpKQotICAgICAgICBjYXJyeSgpOwotICAgIEwgPDw9IGIgJiA3OwotICAgIGIgPj49IDM7Ci0gICAgd2hpbGUoIC0tYiA+PSAwKQotICAgICAgICBMIDw8PSA4OwotICAgIGIgPSA0OwotICAgIGFzc2VydCggIUJlbmQgIHx8ICBCICsgNCA8PSBCZW5kKTsKLSAgICBkbyB7Ci0gICAgICAgICpCKysgPSAodWNoYXIpIChMID4+IDI0KTsKLSAgICAgICAgTCA8PD0gODsKLSAgICB9IHdoaWxlKCAtLWIpOwotICAgIGlzX3RvYXN0ID0gMTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLQotYm9vbF9yZWFkZXI6OmJvb2xfcmVhZGVyKCBjX3NwZWMmIHMsIGN1Y2hhciAqc3JjLCBzaXplX3QgTGVuKQotICA6IGJvb2xfY29kZXIoIHMpLAotICAgIEJzdGFydCggc3JjKSwKLSAgICBCKCBzcmMpLAotICAgIEJlbmQoIExlbj8gc3JjK0xlbiA6IDApLAotICAgIHNoZiggMzIgLSBzLncpLAotICAgIGJjdCggOCkKLXsKLSAgICBpbnQgaSA9IDQ7ICBkbyB7IExvdyA8PD0gODsgIExvdyB8PSAqQisrO30gIHdoaWxlKCAtLWkpOwotfQotCi0KLWJvb2wgYm9vbF9yZWFkZXI6OnJhdyggdWludDMyIHMpIHsKLQotICAgIGJvb2wgdmFsID0gMDsKLSAgICB1aW50MzIgTCA9IExvdzsKLSAgICBjdWludDMyIFMgPSBzIDw8IHNoZjsKLQotICAgIGFzc2VydCggUmFuZ2UgPj0gbWluX3JhbmdlICAmJiAgUmFuZ2UgPD0gc3BlYy5tYXhfcmFuZ2UoKSk7Ci0gICAgYXNzZXJ0KCBzICAmJiAgcyA8IFJhbmdlICAmJiAgKEwgPj4gc2hmKSA8IFJhbmdlKTsKLQotICAgIGlmKCBiY192KQotICAgICAgICBwcmludGYoCi0gICAgICAgICAgICAiUmVhZGluZywgQiAleCAgTG93ICV4ICBSYW5nZSAleCAgcyAleCAgYmN0ICVkIC4uLlxuIiwKLSAgICAgICAgICAgIEItQnN0YXJ0LCBMb3csIFJhbmdlLCBzLCBiY3QKLSAgICAgICAgKTsKLQotICAgIGlmKCBMID49IFMpIHsKLSAgICAgICAgTCAtPSBTOwotICAgICAgICBzID0gUmFuZ2UgLSBzOwotICAgICAgICBhc3NlcnQoIEwgPCAocyA8PCBzaGYpKTsKLSAgICAgICAgdmFsID0gMTsKLSAgICB9IGVsc2UKLSAgICAgICAgcyAtPSByaW5jOwotICAgIGlmKCBzIDwgbWluX3JhbmdlKSB7Ci0gICAgICAgIGludCBjdCA9IGJjdDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgYXNzZXJ0KCB+TCAmICgxIDw8IDMxKSk7Ci0gICAgICAgICAgICBMICs9IEw7Ci0gICAgICAgICAgICBpZiggIS0tY3QpIHsKLSAgICAgICAgICAgICAgICBjdCA9IDg7Ci0gICAgICAgICAgICAgICAgaWYoICFCZW5kICB8fCAgQiA8IEJlbmQpCi0gICAgICAgICAgICAgICAgICAgIEwgfD0gKkIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSggKHMgKz0gcyArIHJpbmMpIDwgbWluX3JhbmdlKTsKLSAgICAgICAgYmN0ID0gY3Q7Ci0gICAgfQotICAgIExvdyA9IEw7Ci0gICAgUmFuZ2UgPSBzOwotICAgIGlmKCBiY192KQotICAgICAgICBwcmludGYoCi0gICAgICAgICAgICAiLi4uZG9uZSwgdmFsICVkICBCICV4ICBMb3cgJXggIFJhbmdlICV4ICBiY3QgJWRcbiIsCi0gICAgICAgICAgICB2YWw/IDE6MCwgQi1Cc3RhcnQsIExvdywgUmFuZ2UsIGJjdAotICAgICAgICApOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLQotLyogQyBpbnRlcmZhY2VzICovCi0KLS8vIHNwZWMgaW50ZXJmYWNlCi0KLXN0cnVjdCBOUyA6IGJvb2xfY29kZXJfbmFtZXNwYWNlIHsKLSAgICBzdGF0aWMgUm91bmRpbmcgciggdnA4YmNfY19wcmVjICpwLCBSb3VuZGluZyByciA9ZG93bl9mdWxsKSB7Ci0gICAgICAgIHJldHVybiBwPyAoUm91bmRpbmcpIHAtPnIgOiBycjsKLSAgICB9Ci19OwotCi1ib29sX2NvZGVyX3NwZWMgKnZwOGJjX3ZwNnNwZWMoKSB7Ci0gICAgcmV0dXJuIG5ldyBib29sX2NvZGVyX3NwZWNfZXhwbGljaXRfdGFibGUoIDAsIGJvb2xfY29kZXJfbmFtZXNwYWNlOjpEb3duLCA4KTsKLX0KLWJvb2xfY29kZXJfc3BlYyAqdnA4YmNfZmxvYXRfc3BlYygKLSAgICB1bnNpZ25lZCBpbnQgRWJpdHMsIHVuc2lnbmVkIGludCBNYml0cywgdnA4YmNfY19wcmVjICpwCi0pIHsKLSAgICByZXR1cm4gbmV3IGJvb2xfY29kZXJfc3BlY19mbG9hdCggRWJpdHMsIE1iaXRzLCBOUzo6ciggcCksIHA/IHAtPnByZWMgOiAxMik7Ci19Ci1ib29sX2NvZGVyX3NwZWMgKnZwOGJjX2xpdGVyYWxfc3BlYygKLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBtWzI1Nl0sIHZwOGJjX2NfcHJlYyAqcAotKSB7Ci0gICAgcmV0dXJuIG5ldyBib29sX2NvZGVyX3NwZWNfZXhwbGljaXRfdGFibGUoIG0sIE5TOjpyKCBwKSwgcD8gcC0+cHJlYyA6IDE2KTsKLX0KLWJvb2xfY29kZXJfc3BlYyAqdnA4YmNfZXhwb25lbnRpYWxfc3BlYyggdW5zaWduZWQgaW50IHgsIHZwOGJjX2NfcHJlYyAqcCkKLXsKLSAgICByZXR1cm4gbmV3IGJvb2xfY29kZXJfc3BlY19leHBvbmVudGlhbF90YWJsZSggeCwgTlM6OnIoIHApLCBwPyBwLT5wcmVjIDogMTYpOwotfQotYm9vbF9jb2Rlcl9zcGVjICp2cDhiY19zcGVjX2Zyb21fZmlsZSggRklMRSAqZnApIHsKLSAgICByZXR1cm4gbmV3IGJvb2xfY29kZXJfc3BlYyggZnApOwotfQotdm9pZCB2cDhiY19kZXN0cm95X3NwZWMoIGNfYm9vbF9jb2Rlcl9zcGVjICpwKSB7IGRlbGV0ZSBwO30KLQotdm9pZCB2cDhiY19zcGVjX3RvX2ZpbGUoIGNfYm9vbF9jb2Rlcl9zcGVjICpwLCBGSUxFICpmcCkgeyBwLT5kdW1wKCBmcCk7fQotCi12cDhiY19pbmRleF90IHZwOGJjX2luZGV4KCBjX2Jvb2xfY29kZXJfc3BlYyAqcCwgZG91YmxlIHgpIHsKLSAgICByZXR1cm4gKCAqcCkoIHgpOwotfQotCi12cDhiY19pbmRleF90IHZwOGJjX2luZGV4X2Zyb21fY291bnRzKAotICAgIGNfYm9vbF9jb2Rlcl9zcGVjICpwLCB1bnNpZ25lZCBpbnQgTCwgdW5zaWduZWQgaW50IFIKLSkgewotICAgIHJldHVybiAoICpwKSggKFIgKz0gTCk/IChkb3VibGUpIEwvUiA6IC41KTsKLX0KLQotZG91YmxlIHZwOGJjX3Byb2JhYmlsaXR5KCBjX2Jvb2xfY29kZXJfc3BlYyAqcCwgdnA4YmNfaW5kZXhfdCBpKSB7Ci0gICAgcmV0dXJuICggKnApKCBpKTsKLX0KLQotdnA4YmNfaW5kZXhfdCB2cDhiY19jb21wbGVtZW50KCBjX2Jvb2xfY29kZXJfc3BlYyAqcCwgdnA4YmNfaW5kZXhfdCBpKSB7Ci0gICAgcmV0dXJuIHAtPmNvbXBsZW1lbnQoIGkpOwotfQotdW5zaWduZWQgaW50IHZwOGJjX2Nvc3RfemVybyggY19ib29sX2NvZGVyX3NwZWMgKnAsIHZwOGJjX2luZGV4X3QgaSkgewotICAgIHJldHVybiBwLT5jb3N0X3plcm8oIGkpOwotfQotdW5zaWduZWQgaW50IHZwOGJjX2Nvc3Rfb25lKCBjX2Jvb2xfY29kZXJfc3BlYyAqcCwgdnA4YmNfaW5kZXhfdCBpKSB7Ci0gICAgcmV0dXJuIHAtPmNvc3Rfb25lKCBpKTsKLX0KLXVuc2lnbmVkIGludCB2cDhiY19jb3N0X2JpdCggY19ib29sX2NvZGVyX3NwZWMgKnAsIHZwOGJjX2luZGV4X3QgaSwgaW50IHYpIHsKLSAgICByZXR1cm4gcC0+Y29zdF9iaXQoIGksIHYpOwotfQotCi0jaWYgdGltX3ZwOAotICAgIGV4dGVybiAiQyIgaW50IHRva192ZXJib3NlOwotCi0jICAgZGVmaW5lIGRiZ19sIDEwMDAwMDAKLQotICAgIHN0YXRpYyB2cDhiY19pbmRleF90IGRiZ19pIFtkYmdfbF07Ci0gICAgc3RhdGljIGNoYXIgZGJnX3YgW2RiZ19sXTsKLSAgICBzdGF0aWMgc2l6ZV90IGRiZ193ID0gMCwgZGJnX3IgPSAwOwotI2VuZGlmCi0KLS8vIHdyaXRlciBpbnRlcmZhY2UKLQotYm9vbF93cml0ZXIgKnZwOGJjX2NyZWF0ZV93cml0ZXIoCi0gICAgY19ib29sX2NvZGVyX3NwZWMgKnAsIHVuc2lnbmVkIGNoYXIgKkQsIHNpemVfdCBMCi0pIHsKLSAgICByZXR1cm4gbmV3IGJvb2xfd3JpdGVyKCAqcCwgRCwgTCk7Ci19Ci0KLXNpemVfdCB2cDhiY19kZXN0cm95X3dyaXRlciggYm9vbF93cml0ZXIgKnApIHsKLSAgICBjb25zdCBzaXplX3QgcyA9IHAtPmZsdXNoKCkuYnl0ZXNfd3JpdHRlbigpOwotICAgIGRlbGV0ZSBwOwotICAgIHJldHVybiBzOwotfQotCi12b2lkIHZwOGJjX3dyaXRlX2Jvb2woIGJvb2xfd3JpdGVyICpwLCBpbnQgdiwgdnA4YmNfaW5kZXhfdCBpKQotewotIyAgIGlmIHRpbV92cDgKLSAgICAgICAgLy8gYmNfdiA9IGRiZ193IDwgMTA7Ci0gICAgICAgIGlmKCBiY192ID0gdG9rX3ZlcmJvc2UpCi0gICAgICAgICAgICBwcmludGYoICIgd3JpdGluZyAlZCBhdCBwcm9iICVkXG4iLCB2PyAxOjAsIGkpOwotICAgICAgICBhY2N1bV9lbnRyb3B5X2JjKCAmcC0+U3BlYygpLCBpLCB2KTsKLQotICAgICAgICAoICpwKSggaSwgKGJvb2wpIHYpOwotCi0gICAgICAgIGlmKCBkYmdfdyA8IGRiZ19sKSB7Ci0gICAgICAgICAgICBkYmdfaSBbZGJnX3ddID0gaTsKLSAgICAgICAgICAgIGRiZ192IFtkYmdfdysrXSA9IHY/IDE6MDsKLSAgICAgICAgfQotIyAgIGVsc2UKLSAgICAgICAgKCAqcCkoIGksIChib29sKSB2KTsKLSMgICBlbmRpZgotfQotCi12b2lkIHZwOGJjX3dyaXRlX2JpdHMoIGJvb2xfd3JpdGVyICpwLCB1bnNpZ25lZCBpbnQgdiwgaW50IG4pCi17Ci0jICAgaWYgdGltX3ZwOAotICAgICAgICB7Ci0gICAgICAgICAgICBjX2Jvb2xfY29kZXJfc3BlYyAqIGNvbnN0IHMgPSAmIHAtPlNwZWMoKTsKLSAgICAgICAgICAgIGNvbnN0IHZwOGJjX2luZGV4X3QgaSA9IHMtPmhhbGZfaW5kZXgoKTsKLSAgICAgICAgICAgIGludCBtID0gbjsKLSAgICAgICAgICAgIHdoaWxlKCAtLW0gPj0gMCkKLSAgICAgICAgICAgICAgICBhY2N1bV9lbnRyb3B5X2JjKCBzLCBpLCAodj4+bSkgJiAxKTsKLSAgICAgICAgfQotIyAgIGVuZGlmCi0KLSAgICBwLT53cml0ZV9iaXRzKCBuLCB2KTsKLX0KLQotY19ib29sX2NvZGVyX3NwZWMgKnZwOGJjX3dyaXRlcl9zcGVjKCBjX2Jvb2xfd3JpdGVyICp3KSB7IHJldHVybiAmIHctPlNwZWMoKTt9Ci0KLS8vIHJlYWRlciBpbnRlcmZhY2UKLQotYm9vbF9yZWFkZXIgKnZwOGJjX2NyZWF0ZV9yZWFkZXIoCi0gICAgY19ib29sX2NvZGVyX3NwZWMgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlMsIHNpemVfdCBMCi0pIHsKLSAgICByZXR1cm4gbmV3IGJvb2xfcmVhZGVyKCAqcCwgUywgTCk7Ci19Ci0KLXZvaWQgdnA4YmNfZGVzdHJveV9yZWFkZXIoIGJvb2xfcmVhZGVyICogcCkgeyBkZWxldGUgcDt9Ci0KLWludCB2cDhiY19yZWFkX2Jvb2woIGJvb2xfcmVhZGVyICpwLCB2cDhiY19pbmRleF90IGkpCi17Ci0jICAgaWYgdGltX3ZwOAotICAgICAgICAvLyBiY192ID0gZGJnX3IgPCAxMDsKLSAgICAgICAgYmNfdiA9IHRva192ZXJib3NlOwotICAgICAgICBjb25zdCBpbnQgdiA9ICggKnApKCBpKT8gMTowOwotICAgICAgICBpZiggdG9rX3ZlcmJvc2UpCi0gICAgICAgICAgICBwcmludGYoICIgcmVhZGluZyAlZCBhdCBwcm9iICVkXG4iLCB2LCBpKTsKLSAgICAgICAgaWYoIGRiZ19yIDwgZGJnX2wpIHsKLSAgICAgICAgICAgIGFzc2VydCggZGJnX3IgPD0gZGJnX3cpOwotICAgICAgICAgICAgaWYoIGkgIT0gZGJnX2lbZGJnX3JdICB8fCAgdiAhPSBkYmdfdltkYmdfcl0pIHsKLSAgICAgICAgICAgICAgICBwcmludGYoCi0gICAgICAgICJQb3NpdGlvbiAlZDogSU5DT1JSRUNUTFkgUkVBRElORyAlZCAgcHJvYiAlZCwgd3JvdGUgJWQgIHByb2IgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRiZ19yLCB2LCBpLCBkYmdfdltkYmdfcl0sIGRiZ19pW2RiZ19yXQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2RiZ19yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotIyAgIGVsc2UKLSAgICAgICAgcmV0dXJuICggKnApKCBpKT8gMTowOwotIyAgIGVuZGlmCi19Ci0KLXVuc2lnbmVkIGludCB2cDhiY19yZWFkX2JpdHMoIGJvb2xfcmVhZGVyICpwLCBpbnQgbikgeyByZXR1cm4gcC0+cmVhZF9iaXRzKCBuKTt9Ci0KLWNfYm9vbF9jb2Rlcl9zcGVjICp2cDhiY19yZWFkZXJfc3BlYyggY19ib29sX3JlYWRlciAqcikgeyByZXR1cm4gJiByLT5TcGVjKCk7fQotCi0jdW5kZWYgYmNfdgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYvaWRjdF94ODYuaCBiL3ZwOC9jb21tb24veDg2L2lkY3RfeDg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTU2OGMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvaWRjdF94ODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIElEQ1RfWDg2X0gKLSNkZWZpbmUgSURDVF9YODZfSAotCi0vKiBOb3RlOgotICoKLSAqIFRoaXMgcGxhdGZvcm0gaXMgY29tbW9ubHkgYnVpbHQgZm9yIHJ1bnRpbWUgQ1BVIGRldGVjdGlvbi4gSWYgeW91IG1vZGlmeQotICogYW55IG9mIHRoZSBmdW5jdGlvbiBtYXBwaW5ncyBwcmVzZW50IGluIHRoaXMgZmlsZSwgYmUgc3VyZSB0byBhbHNvIHVwZGF0ZQotICogdGhlbSBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbml0aWFsaXphdGlvbiBjb2RlCi0gKi8KLQotI2lmIEhBVkVfTU1YCi1leHRlcm4gcHJvdG90eXBlX2lkY3QodnA4X3Nob3J0X2lkY3Q0eDRsbG1fMV9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9pZGN0KHZwOF9zaG9ydF9pZGN0NHg0bGxtX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2lkY3Rfc2NhbGFyX2FkZCh2cDhfZGNfb25seV9pZGN0X2FkZF9tbXgpOwotCi1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0XzFfbW14KTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9pZGN0X2lkY3QxCi0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfbW14Ci0KLSN1bmRlZiAgdnA4X2lkY3RfaWRjdDE2Ci0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxNiB2cDhfc2hvcnRfaWRjdDR4NGxsbV9tbXgKLQotI3VuZGVmICB2cDhfaWRjdF9pZGN0MV9zY2FsYXJfYWRkCi0jZGVmaW5lIHZwOF9pZGN0X2lkY3QxX3NjYWxhcl9hZGQgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14Ci0KLSN1bmRlZiB2cDhfaWRjdF9pd2Fsc2gxNgotI2RlZmluZSB2cDhfaWRjdF9pd2Fsc2gxNiB2cDhfc2hvcnRfaW52X3dhbHNoNHg0X21teAotCi0jdW5kZWYgdnA4X2lkY3RfaXdhbHNoMQotI2RlZmluZSB2cDhfaWRjdF9pd2Fsc2gxIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9tbXgKLQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIEhBVkVfU1NFMgotCi1leHRlcm4gcHJvdG90eXBlX3NlY29uZF9vcmRlcih2cDhfc2hvcnRfaW52X3dhbHNoNHg0X3NzZTIpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLQotI3VuZGVmIHZwOF9pZGN0X2l3YWxzaDE2Ci0jZGVmaW5lIHZwOF9pZGN0X2l3YWxzaDE2IHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfc3NlMgotCi0jZW5kaWYKLQotI2VuZGlmCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L2lkY3RsbG1fbW14LmFzbSBiL3ZwOC9jb21tb24veDg2L2lkY3RsbG1fbW14LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3MzViYy4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3g4Ni9pZGN0bGxtX21teC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi07IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07ICogTm90ZXM6Ci07ICoKLTsgKiBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNiBiaXQgZml4ZWQgcG9pbnQgdmVyaW8gb2YgdHdvIG11bHRpcGx5Ci07ICogY29uc3RhbnRzOgotOyAqICAgICAgICAxLiAgIHNxcnQoMikgKiBjb3MgKHBpLzgpCi07ICogICAgICAgICAyLiAgIHNxcnQoMikgKiBzaW4gKHBpLzgpCi07ICogQmVjdWFzZSB0aGUgZmlyc3QgY29uc3RhbnQgaXMgYmlnZ2VyIHRoYW4gMSwgdG8gbWFpbnRhaW4gdGhlIHNhbWUgMTYgYml0Ci07ICogZml4ZWQgcG9pbnQgcHJyY2lzaW9uIGFzIHRoZSBzZWNvbmQgb25lLCB3ZSB1c2UgYSB0cmljayBvZgotOyAqICAgICAgICB4ICogYSA9IHggKyB4KihhLTEpCi07ICogc28KLTsgKiAgICAgICAgeCAqIHNxcnQoMikgKiBjb3MgKHBpLzgpID0geCArIHggKiAoc3FydCgyKSAqY29zKHBpLzgpLTEpLgotOyAqCi07ICogRm9yICAgICB0aGUgc2Vjb25kIGNvbnN0YW50LCBiZWN1YXNlIG9mIHRoZSAxNmJpdCB2ZXJzaW9uIGlzIDM1NDY4LCB3aGljaAotOyAqIGlzIGJpZ2dlciB0aGFuIDMyNzY4LCBpbiBzaWduZWQgMTYgYml0IG11bHRpcGx5LCBpdCBiZWNvbWUgYSBuZWdhdGl2ZQotOyAqIG51bWJlci4KLTsgKiAgICAgICAgKHggKiAodW5zaWduZWQpMzU0NjggPj4gMTYpID0geCAqIChzaWduZWQpMzU0NjggPj4gMTYgKyB4Ci07ICoKLTsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotO3ZvaWQgc2hvcnRfaWRjdDR4NGxsbV9tbXgoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCi1nbG9iYWwgc3ltKHZwOF9zaG9ydF9pZGN0NHg0bGxtX21teCkKLXN5bSh2cDhfc2hvcnRfaWRjdDR4NGxsbV9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMwotICAgIEdFVF9HT1QgICAgIHJieAotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMCkgO2lucHV0Ci0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoMSkgO291dHB1dAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBbcmF4ICAgXQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JheCsgOF0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICAgICAgW3JheCsxNl0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIFtyYXgrMjRdCi0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO3BpdGNoCi0KLSAgICAgICAgcHN1YncgICAgICAgbW0wLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGIxPSAwLTIKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgYTEgPTArMgotCi0gICAgICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0gICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgaXAxICogc2luKHBpLzgpICogc3FydCgyKQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOwotICAgICAgICBwbXVsaHcgICAgICBtbTcsICAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV0gICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW03LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKLSAgICAgICAgcHN1YncgICAgICAgbW03LCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGMxCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLQotICAgICAgICBwbXVsaHcgICAgICBtbTMsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTQKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgZDEKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGExCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGIxCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzAKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsxCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzIKLQotICAgICAgICBwc3VidyAgICAgICBtbTYsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDszCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IDAzIDAyIDAxIDAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAyMyAyMiAyMSAyMAotCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgICAgICBwdW5wY2tod2QgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTMsICAgICAgICAgICAgbW02ICAgICAgICAgICAgIDsgMzEgMjEgMzAgMjAKLSAgICAgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMzIDIzIDMyIDIyCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IDExIDAxIDEwIDAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMgotCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMCAyMCAxMCAwMAotICAgICAgICBwdW5wY2toZHEgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzEgMjEgMTEgMDEKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTIsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMzIgMjIgMTIgMDIKLSAgICAgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzCi0KLSAgICAgICAgcHN1YncgICAgICAgbW0wLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGIxPSAwLTIKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgYTEgPTArMgotCi0gICAgICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0gICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IGlwMSAqIHNpbihwaS84KSAqIHNxcnQoMikKLQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGh3ICAgICAgbW03LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyBpcDMgKiBjb3MocGkvOCkgKiBzcXJ0KDIpCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tNywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyBjMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMwotCi0gICAgICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW0zLCAgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW00Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGQxCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgW0dMT0JBTChmb3VycyldCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBhMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBiMQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDswCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICA7MQotICAgICAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsyCi0KLSAgICAgICAgcHN1YncgICAgICAgbW02LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7MwotICAgICAgICBwc3JhdyAgICAgICBtbTIsICAgICAgICAgICAgMwotCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgICAgICAgICAgICAzCi0gICAgICAgIHBzcmF3ICAgICAgIG1tNCwgICAgICAgICAgICAzCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW02LCAgICAgICAgICAgIDMKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMDMgMDIgMDEgMDAKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDIzIDIyIDIxIDIwCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0xLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IDExIDAxIDEwIDAwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMgotCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMywgICAgICAgICAgICBtbTYgICAgICAgICAgICAgOyAzMSAyMSAzMCAyMAotICAgICAgICBwdW5wY2tod2QgICBtbTQsICAgICAgICAgICAgbW02ICAgICAgICAgICAgIDsgMzMgMjMgMzIgMjIKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IDMwIDIwIDEwIDAwCi0gICAgICAgIHB1bnBja2hkcSAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMQotCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMiwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAzMiAyMiAxMiAwMgotICAgICAgICBwdW5wY2toZHEgICBtbTUsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMKLQotICAgICAgICBtb3ZxICAgICAgICBbcmR4XSwgICAgICAgICAgbW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkeCtyYXhdLCAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBbcmR4K3JheCoyXSwgICAgbW0yCi0KLSAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgICAgIHJheAotICAgICAgICBtb3ZxICAgICAgICBbcmR4K3JheCoyXSwgICAgbW01Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIHNob3J0X2lkY3Q0eDRsbG1fMV9tbXgoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCi1nbG9iYWwgc3ltKHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfbW14KQotc3ltKHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDMKLSAgICBHRVRfR09UICAgICByYngKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDApIDtpbnB1dAotICAgICAgICBtb3ZkICAgICAgICBtbTAsICAgICAgICAgICAgW3JheF0KLQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgICAgICAgICAgW0dMT0JBTChmb3VycyldCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoMSkgO291dHB1dAotCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgICAgICAgICAgICAzCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtwaXRjaAotCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgICAgICBtbTAKLSAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgICAgIG1tMAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHhdLCAgICAgICAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgW3JkeCtyYXhdLCAgICAgIG1tMAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHgrcmF4KjJdLCAgICBtbTAKLSAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgICAgIHJheAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHgrcmF4KjJdLCAgICBtbTAKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotO3ZvaWQgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14KHNob3J0IGlucHV0X2RjLCB1bnNpZ25lZCBjaGFyICpwcmVkX3B0ciwgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgaW50IHBpdGNoLCBpbnQgc3RyaWRlKQotZ2xvYmFsIHN5bSh2cDhfZGNfb25seV9pZGN0X2FkZF9tbXgpCi1zeW0odnA4X2RjX29ubHlfaWRjdF9hZGRfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDEpIDtzIC0tIHByZWRpY3Rpb24KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7ZCAtLSBkZXN0aW5hdGlvbgotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7c3RyaWRlCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtwaXRjaAotICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICAgICAgbW0wCi0KLSAgICAgICAgbW92ZCAgICAgICAgbW01LCAgICAgICAgICAgIGFyZygwKSA7aW5wdXRfZGMKLQotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgW0dMT0JBTChmb3VycyldCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW01LCAgICAgICAgICAgIDMKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTUsICAgICAgICAgICAgbW01Ci0gICAgICAgIHB1bnBja2xkcSAgIG1tNSwgICAgICAgICAgICBtbTUKLQotICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgICAgIG1tMAotICAgICAgICBwYWRkc3cgICAgICBtbTEsICAgICAgICAgICAgbW01Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgICAgICBtbTEKLQotICAgICAgICBtb3ZkICAgICAgICBtbTIsICAgICAgICAgICAgW3JzaStyZHhdCi0gICAgICAgIHB1bnBja2xidyAgIG1tMiwgICAgICAgICAgICBtbTAKLSAgICAgICAgcGFkZHN3ICAgICAgbW0yLCAgICAgICAgICAgIG1tNQotICAgICAgICBwYWNrdXN3YiAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZkICAgICAgICBbcmRpK3JheF0sICAgICAgbW0yCi0KLSAgICAgICAgbW92ZCAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krMipyZHhdCi0gICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgICAgICBtbTAKLSAgICAgICAgcGFkZHN3ICAgICAgbW0zLCAgICAgICAgICAgIG1tNQotICAgICAgICBwYWNrdXN3YiAgICBtbTMsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZkICAgICAgICBbcmRpKzIqcmF4XSwgICAgbW0zCi0KLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgICAgIHJheAotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmR4Ci0gICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpKzIqcmR4XQotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICAgICAgbW0wCi0gICAgICAgIHBhZGRzdyAgICAgIG1tNCwgICAgICAgICAgICBtbTUKLSAgICAgICAgcGFja3Vzd2IgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCB1bnBhY2sgdG8gc2F0dXJhdGUKLSAgICAgICAgbW92ZCAgICAgICAgW3JkaSsyKnJheF0sICAgIG1tNAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXhfczFzcXIyOgotICAgIHRpbWVzIDQgZHcgMHg4QThDCi1hbGlnbiAxNgoteF9jMXNxcjJsZXNzMToKLSAgICB0aW1lcyA0IGR3IDB4NEU3QgotYWxpZ24gMTYKLWZvdXJzOgotICAgIHRpbWVzIDQgZHcgMHgwMDA0CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9pZGN0bGxtX3NzZTIuYXNtIGIvdnA4L2NvbW1vbi94ODYvaWRjdGxsbV9zc2UyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlZTE1Ny4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3g4Ni9pZGN0bGxtX3NzZTIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNzA4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO3ZvaWQgaWRjdF9kZXF1YW50XzBfMnhfc3NlMgotOyAoCi07ICAgc2hvcnQgKnFjb2VmZiAgICAgICAtIDAKLTsgICBzaG9ydCAqZGVxdWFudCAgICAgIC0gMQotOyAgIHVuc2lnbmVkIGNoYXIgKnByZSAgLSAyCi07ICAgdW5zaWduZWQgY2hhciAqZHN0ICAtIDMKLTsgICBpbnQgZHN0X3N0cmlkZSAgICAgIC0gNAotOyAgIGludCBibGtfc3RyaWRlICAgICAgLSA1Ci07ICkKLQotZ2xvYmFsIHN5bShpZGN0X2RlcXVhbnRfMF8yeF9zc2UyKQotc3ltKGlkY3RfZGVxdWFudF8wXzJ4X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIEdFVF9HT1QgICAgIHJieAotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoMSkgOyBkZXF1YW50Ci0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMCkgOyBxY29lZmYKLQotICAgIDsgWmVybyBvdXQgeG1tNywgZm9yIHVzZSB1bnBhY2tpbmcKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcKLQotICAgICAgICBtb3ZkICAgICAgICB4bW00LCAgICAgICAgICAgW3JheF0KLSAgICAgICAgbW92ZCAgICAgICAgeG1tNSwgICAgICAgICAgIFtyZHhdCi0KLSAgICAgICAgcGluc3J3ICAgICAgeG1tNCwgICAgICAgICAgIFtyYXgrMzJdLCAgIDQKLSAgICAgICAgcGluc3J3ICAgICAgeG1tNSwgICAgICAgICAgIFtyZHhdLCAgICAgIDQKLQotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICAgICAgeG1tNQotCi0gICAgOyBjbGVhciBjb2VmZnMKLSAgICAgICAgbW92ZCAgICAgICAgW3JheF0sICAgICAgICAgIHhtbTcKLSAgICAgICAgbW92ZCAgICAgICAgW3JheCszMl0sICAgICAgIHhtbTcKLTtwc2h1ZmIKLSAgICAgICAgcHNodWZsdyAgICAgeG1tNCwgICAgICAgICAgIHhtbTQsICAgICAgIDAwMDAwMDAwYgotICAgICAgICBwc2h1Zmh3ICAgICB4bW00LCAgICAgICAgICAgeG1tNCwgICAgICAgMDAwMDAwMDBiCi0KLSAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygyKSA7IHByZQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgW0dMT0JBTChmb3VycyldCi0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgOyBibGtfc3RyaWRlCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAzCi0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMCwgICAgICAgICAgIFtyYXhdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgICAgICBbcmF4K3JjeF0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFtyYXgrMipyY3hdCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgICAgICBbMypyY3hdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBbcmF4K3JjeF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMykgOyBkc3QKLSAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgOyBkc3Rfc3RyaWRlCi0KLSAgICA7IEFkZCB0byBwcmVkaWN0IGJ1ZmZlcgotICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNAotICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNAotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tNAotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNAotCi0gICAgOyBwYWNrIHVwIGJlZm9yZSBzdG9yaW5nCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTAsICAgICAgICAgICB4bW03Ci0gICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgICAgICB4bW03Ci0gICAgICAgIHBhY2t1c3diICAgIHhtbTIsICAgICAgICAgICB4bW03Ci0gICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgICAgICB4bW03Ci0KLSAgICA7IHN0b3JlIGJsb2NrcyBiYWNrIG91dAotICAgICAgICBtb3ZxICAgICAgICBbcmF4XSwgICAgICAgICAgeG1tMAotICAgICAgICBtb3ZxICAgICAgICBbcmF4ICsgcmR4XSwgICAgeG1tMQotCi0gICAgICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgICAgICBbcmF4ICsgMipyZHhdCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JheF0sICAgICAgICAgIHhtbTIKLSAgICAgICAgbW92cSAgICAgICAgW3JheCArIHJkeF0sICAgIHhtbTMKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLWdsb2JhbCBzeW0oaWRjdF9kZXF1YW50X2Z1bGxfMnhfc3NlMikKLXN5bShpZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIDsgc3BlY2lhbCBjYXNlIHdoZW4gMiBibG9ja3MgaGF2ZSAwIG9yIDEgY29lZmZzCi0gICAgOyBkYyBpcyBzZXQgYXMgZmlyc3QgY29lZmYsIHNvIG5vIG5lZWQgdG8gbG9hZCBxY29lZmYKLSAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygwKSA7IHFjb2VmZgotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDIpIDsgcHJlCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMykgOyBkc3QKLSAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgOyBibGtfc3RyaWRlCi0KLSAgICA7IFplcm8gb3V0IHhtbTcsIGZvciB1c2UgdW5wYWNraW5nCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgIGFyZygxKSAgOyBkZXF1YW50Ci0KLSAgICA7IG5vdGUgdGhlIHRyYW5zcG9zZSBvZiB4bW0xIGFuZCB4bW0yLCBuZWNlc3NhcnkgZm9yIHNodWZmbGUKLSAgICA7ICAgdG8gc3BpdCBvdXQgc2Vuc2ljbGUgZGF0YQotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgW3JheF0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIFtyYXgrMTZdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICBbcmF4KzMyXQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgW3JheCs0OF0KLQotICAgIDsgQ2xlYXIgb3V0IGNvZWZmcwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4XSwgICAgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzE2XSwgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzMyXSwgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzQ4XSwgICAgICAgeG1tNwotCi0gICAgOyBkZXF1YW50aXplIHFjb2VmZiBidWZmZXIKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHhdCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgICAgICBbcmR4KzE2XQotICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICAgICAgW3JkeF0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgICAgIFtyZHgrMTZdCi0KLSAgICA7IHJlcGFjayBzbyBibG9jayAwIHJvdyB4IGFuZCBibG9jayAxIHJvdyB4IGFyZSB0b2dldGhlcgotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBwdW5wY2toZHEgICB4bW00LCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0wLCAgICAgICAxMTAxMTAwMGIKLSAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQsICAgICAgIDExMDExMDAwYgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgotICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNCwgICAgICAgMTEwMTEwMDBiCi0KLSAgICA7IGZpcnN0IHBhc3MKLSAgICAgICAgcHN1YncgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIgICAgICAgIDsgYjEgPSAwLTIKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIgICAgICAgIDsKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgOyBhMSA9IDArMgotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEgICAgICAgIDsgaXAxICogc2luKHBpLzgpICogc3FydCgyKQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTcsICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0zICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKLSAgICAgICAgcHN1YncgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgIDsgYzEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMwotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNSAgICAgICAgOyBkMQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tMiAgICAgICAgOyBhMQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0wICAgICAgICA7IGIxCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0zICAgICAgICA7MAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgICAgICB4bW03ICAgICAgICA7MQotICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNyAgICAgICAgOzIKLQotICAgICAgICBwc3VidyAgICAgICB4bW02LCAgICAgICAgICAgeG1tMyAgICAgICAgOzMKLQotICAgIDsgdHJhbnNwb3NlIGZvciB0aGUgc2Vjb25kIHBhc3MKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTIgICAgICAgIDsgMTAzIDEwMiAxMDEgMTAwIDAwMyAwMDIgMDAxIDAwMAotICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTcsICAgICAgICAgICB4bW0wICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tNCAgICAgICAgOyAxMTEgMTEwIDEwOSAxMDggMDExIDAxMCAwMDkgMDA4Ci0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTQsICAgICAgICAgICB4bW02ICAgICAgICA7IDAxNSAwMTEgMDE0IDAxMCAwMTMgMDA5IDAxMiAwMDgKLSAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAxMTQgMTEwIDExMyAxMDkgMTEyIDEwOAotCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDA3IDAwMyAwMDYgMDAyIDAwNSAwMDEgMDA0IDAwMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNCAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMDcgMTAzIDEwNiAxMDIgMTA1IDEwMSAxMDQgMTAwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTcsICAgICAgICAgICB4bW01ICAgICAgICA7IDExMyAxMDkgMTA1IDEwMSAxMTIgMTA4IDEwNCAxMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTE1IDExMSAxMDcgMTAzIDExNCAxMTAgMTA2IDEwMgotCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDEzIDAwOSAwMDUgMDAxIDAxMiAwMDggMDA0IDAwMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMTIgMTA4IDAxMiAwMDggMTA0IDEwMCAwMDQgMDAwCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTUsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMyAxMDkgMDEzIDAwOSAxMDUgMTAxIDAwNSAwMDEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMSAgICAgICAgOyAwMTUgMDExIDAwNyAwMDMgMDE0IDAxMCAwMDYgMDAyCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW02ICAgICAgICA7IDExNCAxMTAgMDE0IDAxMCAxMDYgMTAyIDAwNiAwMDIKLSAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAwMTUgMDExIDEwNyAxMDMgMDA3IDAwMwotCi0gICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0yLCAgICAgICAxMTAxMTAwMGIKLSAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEsICAgICAgIDExMDExMDAwYgotCi0gICAgICAgIHBzaHVmZCAgICAgIHhtbTEsICAgICAgICAgICB4bW01LCAgICAgICAxMTAxMTAwMGIKLSAgICAgICAgcHNodWZkICAgICAgeG1tMywgICAgICAgICAgIHhtbTcsICAgICAgIDExMDExMDAwYgotCi0gICAgOyBzZWNvbmQgcGFzcwotICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgYjEgPSAwLTIKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgYTEgPSAwKzIKLQotICAgICAgICBwbXVsaHcgICAgICB4bW01LCAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBpcDEgKiBzaW4ocGkvOCkgKiBzcXJ0KDIpCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTMKLSAgICAgICAgcG11bGh3ICAgICAgeG1tNywgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKLSAgICAgICAgcHN1YncgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGMxCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTMKLQotICAgICAgICBwbXVsaHcgICAgICB4bW01LCAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBwbXVsaHcgICAgICB4bW0zLCAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW00Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGQxCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KLQotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTChmb3VycyldCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBhMQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBiMQotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDswCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7MQotICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsyCi0KLSAgICAgICAgcHN1YncgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7MwotICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICAgICAgMwotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTAsICAgICAgICAgICAzCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAzCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNiwgICAgICAgICAgIDMKLQotICAgIDsgdHJhbnNwb3NlIHRvIHNhdmUKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTIgICAgICAgIDsgMTAzIDEwMiAxMDEgMTAwIDAwMyAwMDIgMDAxIDAwMAotICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICAgICAgeG1tMCAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTcsICAgICAgICAgICB4bW0wICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tNCAgICAgICAgOyAxMTEgMTEwIDEwOSAxMDggMDExIDAxMCAwMDkgMDA4Ci0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTQsICAgICAgICAgICB4bW02ICAgICAgICA7IDAxNSAwMTEgMDE0IDAxMCAwMTMgMDA5IDAxMiAwMDgKLSAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAxMTQgMTEwIDExMyAxMDkgMTEyIDEwOAotCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDA3IDAwMyAwMDYgMDAyIDAwNSAwMDEgMDA0IDAwMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNCAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMDcgMTAzIDEwNiAxMDIgMTA1IDEwMSAxMDQgMTAwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTcsICAgICAgICAgICB4bW01ICAgICAgICA7IDExMyAxMDkgMTA1IDEwMSAxMTIgMTA4IDEwNCAxMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTE1IDExMSAxMDcgMTAzIDExNCAxMTAgMTA2IDEwMgotCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIHhtbTIgICAgICAgIDsgMDEzIDAwOSAwMDUgMDAxIDAxMiAwMDggMDA0IDAwMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICAgICAgeG1tNyAgICAgICAgOyAxMTIgMTA4IDAxMiAwMDggMTA0IDEwMCAwMDQgMDAwCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTUsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMyAxMDkgMDEzIDAwOSAxMDUgMTAxIDAwNSAwMDEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMSAgICAgICAgOyAwMTUgMDExIDAwNyAwMDMgMDE0IDAxMCAwMDYgMDAyCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW02ICAgICAgICA7IDExNCAxMTAgMDE0IDAxMCAxMDYgMTAyIDAwNiAwMDIKLSAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE1IDExMSAwMTUgMDExIDEwNyAxMDMgMDA3IDAwMwotCi0gICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0yLCAgICAgICAxMTAxMTAwMGIKLSAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEsICAgICAgIDExMDExMDAwYgotCi0gICAgICAgIHBzaHVmZCAgICAgIHhtbTEsICAgICAgICAgICB4bW01LCAgICAgICAxMTAxMTAwMGIKLSAgICAgICAgcHNodWZkICAgICAgeG1tMywgICAgICAgICAgIHhtbTcsICAgICAgIDExMDExMDAwYgotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03Ci0KLSAgICA7IExvYWQgdXAgcHJlZGljdCBibG9ja3MKLSAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgICAgICBbcnNpK3JjeF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgICAgIFtyc2krMipyY3hdCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgICAgICBbMypyY3hdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgICAgICBbcnNpK3JjeF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW01Ci0KLS5maW5pc2g6Ci0KLSAgICA7IHBhY2sgdXAgYmVmb3JlIHN0b3JpbmcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMCwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgICAgIHhtbTcKLQotICAgIDsgTG9hZCBkZXN0aW5hdGlvbiBzdHJpZGUgYmVmb3JlIHdyaXRpbmcgb3V0LAotICAgIDsgICBkb2Vzbid0IG5lZWQgdG8gcGVyc2lzdAotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7IGRzdF9zdHJpZGUKLQotICAgIDsgc3RvcmUgYmxvY2tzIGJhY2sgb3V0Ci0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHhdLCAgICB4bW0xCi0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyAyKnJkeF0KLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICAgICAgeG1tMgotICAgICAgICBtb3ZxICAgICAgICBbcmRpICsgcmR4XSwgICAgeG1tMwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotO3ZvaWQgaWRjdF9kZXF1YW50X2RjXzBfMnhfc3NlMgotOyAoCi07ICAgc2hvcnQgKnFjb2VmZiAgICAgICAtIDAKLTsgICBzaG9ydCAqZGVxdWFudCAgICAgIC0gMQotOyAgIHVuc2lnbmVkIGNoYXIgKnByZSAgLSAyCi07ICAgdW5zaWduZWQgY2hhciAqZHN0ICAtIDMKLTsgICBpbnQgZHN0X3N0cmlkZSAgICAgIC0gNAotOyAgIHNob3J0ICpkYyAgICAgICAgICAgLSA1Ci07ICkKLWdsb2JhbCBzeW0oaWRjdF9kZXF1YW50X2RjXzBfMnhfc3NlMikKLXN5bShpZGN0X2RlcXVhbnRfZGNfMF8yeF9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIDsgc3BlY2lhbCBjYXNlIHdoZW4gMiBibG9ja3MgaGF2ZSAwIG9yIDEgY29lZmZzCi0gICAgOyBkYyBpcyBzZXQgYXMgZmlyc3QgY29lZmYsIHNvIG5vIG5lZWQgdG8gbG9hZCBxY29lZmYKLSAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygwKSA7IHFjb2VmZgotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDIpIDsgcHJlCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMykgOyBkc3QKLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgIGFyZyg1KSA7IGRjCi0KLSAgICA7IFplcm8gb3V0IHhtbTcsIGZvciB1c2UgdW5wYWNraW5nCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03Ci0KLSAgICA7IGxvYWQgdXAgMiBkYyB3b3JkcyBoZXJlID09IDIqMTYgPSBkb3VibGV3b3JkCi0gICAgICAgIG1vdmQgICAgICAgIHhtbTQsICAgICAgICAgICBbcmR4XQotCi0gICAgOyBMb2FkIHVwIHByZWRpY3QgYmxvY2tzCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTAsICAgICAgICAgICBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgW3JzaSsxNl0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFtyc2krMzJdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgICAgICBbcnNpKzQ4XQotCi0gICAgOyBEdXBsaWNhdGUgYW5kIGV4cGFuZCBkYyBhY3Jvc3MKLSAgICAgICAgcHVucGNrbHdkICAgeG1tNCwgICAgICAgICAgIHhtbTQKLSAgICAgICAgcHVucGNrbGRxICAgeG1tNCwgICAgICAgICAgIHhtbTQKLQotICAgIDsgUm91bmRpbmcgdG8gZGVxdWFudCBhbmQgZG93bnNoaWZ0Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgICAgIDMKLQotICAgIDsgUHJlZGljdCBidWZmZXIgbmVlZHMgdG8gYmUgZXhwYW5kZWQgZnJvbSBieXRlcyB0byB3b3JkcwotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tNwotCi0gICAgOyBBZGQgdG8gcHJlZGljdCBidWZmZXIKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTQKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTQKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKLQotICAgIDsgcGFjayB1cCBiZWZvcmUgc3RvcmluZwotICAgICAgICBwYWNrdXN3YiAgICB4bW0wLCAgICAgICAgICAgeG1tNwotICAgICAgICBwYWNrdXN3YiAgICB4bW0xLCAgICAgICAgICAgeG1tNwotICAgICAgICBwYWNrdXN3YiAgICB4bW0yLCAgICAgICAgICAgeG1tNwotICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICAgICAgeG1tNwotCi0gICAgOyBMb2FkIGRlc3RpbmF0aW9uIHN0cmlkZSBiZWZvcmUgd3JpdGluZyBvdXQsCi0gICAgOyAgIGRvZXNuJ3QgbmVlZCB0byBwZXJzaXN0Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDsgZHN0X3N0cmlkZQotCi0gICAgOyBzdG9yZSBibG9ja3MgYmFjayBvdXQKLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIHhtbTAKLSAgICAgICAgbW92cSAgICAgICAgW3JkaSArIHJkeF0sICAgIHhtbTEKLQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIDIqcmR4XQotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICB4bW0yCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHhdLCAgICB4bW0zCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1nbG9iYWwgc3ltKGlkY3RfZGVxdWFudF9kY19mdWxsXzJ4X3NzZTIpCi1zeW0oaWRjdF9kZXF1YW50X2RjX2Z1bGxfMnhfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICA7IHNwZWNpYWwgY2FzZSB3aGVuIDIgYmxvY2tzIGhhdmUgMCBvciAxIGNvZWZmcwotICAgIDsgZGMgaXMgc2V0IGFzIGZpcnN0IGNvZWZmLCBzbyBubyBuZWVkIHRvIGxvYWQgcWNvZWZmCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoMCkgOyBxY29lZmYKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygyKSA7IHByZQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDMpIDsgZHN0Ci0KLSAgICA7IFplcm8gb3V0IHhtbTcsIGZvciB1c2UgdW5wYWNraW5nCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgIGFyZygxKSAgOyBkZXF1YW50Ci0KLSAgICA7IG5vdGUgdGhlIHRyYW5zcG9zZSBvZiB4bW0xIGFuZCB4bW0yLCBuZWNlc3NhcnkgZm9yIHNodWZmbGUKLSAgICA7ICAgdG8gc3BpdCBvdXQgc2Vuc2ljbGUgZGF0YQotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgW3JheF0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIFtyYXgrMTZdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICBbcmF4KzMyXQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgW3JheCs0OF0KLQotICAgIDsgQ2xlYXIgb3V0IGNvZWZmcwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4XSwgICAgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzE2XSwgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzMyXSwgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBbcmF4KzQ4XSwgICAgICAgeG1tNwotCi0gICAgOyBkZXF1YW50aXplIHFjb2VmZiBidWZmZXIKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHhdCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgICAgICBbcmR4KzE2XQotICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICAgICAgW3JkeF0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgICAgIFtyZHgrMTZdCi0KLSAgICA7IERDIGNvbXBvbmVudAotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDUpCi0KLSAgICA7IHJlcGFjayBzbyBibG9jayAwIHJvdyB4IGFuZCBibG9jayAxIHJvdyB4IGFyZSB0b2dldGhlcgotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBwdW5wY2toZHEgICB4bW00LCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBzaHVmZCAgICAgIHhtbTAsICAgICAgICAgICB4bW0wLCAgICAgICAxMTAxMTAwMGIKLSAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQsICAgICAgIDExMDExMDAwYgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgcHNodWZkICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgotICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNCwgICAgICAgMTEwMTEwMDBiCi0KLSAgICA7IGluc2VydCBEQyBjb21wb25lbnQKLSAgICAgICAgcGluc3J3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHhdLCAgICAgIDAKLSAgICAgICAgcGluc3J3ICAgICAgeG1tMCwgICAgICAgICAgIFtyZHgrMl0sICAgIDQKLQotICAgIDsgZmlyc3QgcGFzcwotICAgICAgICBwc3VidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMiAgICAgICAgOyBiMSA9IDAtMgotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMiAgICAgICAgOwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICA7IGExID0gMCsyCi0KLSAgICAgICAgcG11bGh3ICAgICAgeG1tNSwgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMSAgICAgICAgOyBpcDEgKiBzaW4ocGkvOCkgKiBzcXJ0KDIpCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgIHhtbTMKLSAgICAgICAgcG11bGh3ICAgICAgeG1tNywgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTMgICAgICAgIDsgaXAzICogY29zKHBpLzgpICogc3FydCgyKQotICAgICAgICBwc3VidyAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgOyBjMQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgcG11bGh3ICAgICAgeG1tNSwgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCi0KLSAgICAgICAgcG11bGh3ICAgICAgeG1tMywgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW01ICAgICAgICA7IGQxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW0yICAgICAgICA7IGExCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTAgICAgICAgIDsgYjEKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTMgICAgICAgIDswCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTcgICAgICAgIDsxCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW03ICAgICAgICA7MgotCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTYsICAgICAgICAgICB4bW0zICAgICAgICA7MwotCi0gICAgOyB0cmFuc3Bvc2UgZm9yIHRoZSBzZWNvbmQgcGFzcwotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAxMDMgMTAyIDEwMSAxMDAgMDAzIDAwMiAwMDEgMDAwCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICA7IDAwNyAwMDMgMDA2IDAwMiAwMDUgMDAxIDAwNCAwMDAKLSAgICAgICAgcHVucGNraHdkICAgeG1tNywgICAgICAgICAgIHhtbTAgICAgICAgIDsgMTA3IDEwMyAxMDYgMTAyIDEwNSAxMDEgMTA0IDEwMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW00ICAgICAgICA7IDExMSAxMTAgMTA5IDEwOCAwMTEgMDEwIDAwOSAwMDgKLSAgICAgICAgcHVucGNrbHdkICAgeG1tNCwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMDE1IDAxMSAwMTQgMDEwIDAxMyAwMDkgMDEyIDAwOAotICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDExNCAxMTAgMTEzIDEwOSAxMTIgMTA4Ci0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxMyAwMDkgMDA1IDAwMSAwMTIgMDA4IDAwNCAwMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgIDsgMDE1IDAxMSAwMDcgMDAzIDAxNCAwMTAgMDA2IDAwMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03ICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTEzIDEwOSAxMDUgMTAxIDExMiAxMDggMTA0IDEwMAotICAgICAgICBwdW5wY2toZHEgICB4bW02LCAgICAgICAgICAgeG1tNSAgICAgICAgOyAxMTUgMTExIDEwNyAxMDMgMTE0IDExMCAxMDYgMTAyCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMiAxMDggMDEyIDAwOCAxMDQgMTAwIDAwNCAwMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tNSwgICAgICAgICAgIHhtbTcgICAgICAgIDsgMTEzIDEwOSAwMTMgMDA5IDEwNSAxMDEgMDA1IDAwMQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE0IDExMCAwMTQgMDEwIDEwNiAxMDIgMDA2IDAwMgotICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDAxNSAwMTEgMTA3IDEwMyAwMDcgMDAzCi0KLSAgICAgICAgcHNodWZkICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgotICAgICAgICBwc2h1ZmQgICAgICB4bW0yLCAgICAgICAgICAgeG1tMSwgICAgICAgMTEwMTEwMDBiCi0KLSAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTUsICAgICAgIDExMDExMDAwYgotICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNywgICAgICAgMTEwMTEwMDBiCi0KLSAgICA7IHNlY29uZCBwYXNzCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBiMSA9IDAtMgotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBhMSA9IDArMgotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGlwMSAqIHNpbihwaS84KSAqIHNxcnQoMikKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMwotICAgICAgICBwbXVsaHcgICAgICB4bW03LCAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV0KLQotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgaXAzICogY29zKHBpLzgpICogc3FydCgyKQotICAgICAgICBwc3VidyAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgYzEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMwotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKHhfczFzcXIyKV0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgZDEKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMCwgICAgICAgICAgIFtHTE9CQUwoZm91cnMpXQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGExCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IGIxCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0zICAgICAgICAgICAgOzAKLQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsxCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTAsICAgICAgICAgICB4bW03ICAgICAgICAgICAgOzIKLQotICAgICAgICBwc3VidyAgICAgICB4bW02LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDszCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgICAgICAzCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMCwgICAgICAgICAgIDMKLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgICAgIDMKLQotICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICAgICAgMwotCi0gICAgOyB0cmFuc3Bvc2UgdG8gc2F2ZQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAxMDMgMTAyIDEwMSAxMDAgMDAzIDAwMiAwMDEgMDAwCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICA7IDAwNyAwMDMgMDA2IDAwMiAwMDUgMDAxIDAwNCAwMDAKLSAgICAgICAgcHVucGNraHdkICAgeG1tNywgICAgICAgICAgIHhtbTAgICAgICAgIDsgMTA3IDEwMyAxMDYgMTAyIDEwNSAxMDEgMTA0IDEwMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICB4bW00ICAgICAgICA7IDExMSAxMTAgMTA5IDEwOCAwMTEgMDEwIDAwOSAwMDgKLSAgICAgICAgcHVucGNrbHdkICAgeG1tNCwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMDE1IDAxMSAwMTQgMDEwIDAxMyAwMDkgMDEyIDAwOAotICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDExNCAxMTAgMTEzIDEwOSAxMTIgMTA4Ci0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMDcgMDAzIDAwNiAwMDIgMDA1IDAwMSAwMDQgMDAwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW00ICAgICAgICA7IDAxMyAwMDkgMDA1IDAwMSAwMTIgMDA4IDAwNCAwMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgIDsgMDE1IDAxMSAwMDcgMDAzIDAxNCAwMTAgMDA2IDAwMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03ICAgICAgICA7IDEwNyAxMDMgMTA2IDEwMiAxMDUgMTAxIDEwNCAxMDAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgIDsgMTEzIDEwOSAxMDUgMTAxIDExMiAxMDggMTA0IDEwMAotICAgICAgICBwdW5wY2toZHEgICB4bW02LCAgICAgICAgICAgeG1tNSAgICAgICAgOyAxMTUgMTExIDEwNyAxMDMgMTE0IDExMCAxMDYgMTAyCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgeG1tMiAgICAgICAgOyAwMTMgMDA5IDAwNSAwMDEgMDEyIDAwOCAwMDQgMDAwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgICAgICB4bW03ICAgICAgICA7IDExMiAxMDggMDEyIDAwOCAxMDQgMTAwIDAwNCAwMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tNSwgICAgICAgICAgIHhtbTcgICAgICAgIDsgMTEzIDEwOSAwMTMgMDA5IDEwNSAxMDEgMDA1IDAwMQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICA7IDAxNSAwMTEgMDA3IDAwMyAwMTQgMDEwIDAwNiAwMDIKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgICAgICAgICAgIHhtbTYgICAgICAgIDsgMTE0IDExMCAwMTQgMDEwIDEwNiAxMDIgMDA2IDAwMgotICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tNiAgICAgICAgOyAxMTUgMTExIDAxNSAwMTEgMTA3IDEwMyAwMDcgMDAzCi0KLSAgICAgICAgcHNodWZkICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIsICAgICAgIDExMDExMDAwYgotICAgICAgICBwc2h1ZmQgICAgICB4bW0yLCAgICAgICAgICAgeG1tMSwgICAgICAgMTEwMTEwMDBiCi0KLSAgICAgICAgcHNodWZkICAgICAgeG1tMSwgICAgICAgICAgIHhtbTUsICAgICAgIDExMDExMDAwYgotICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgICAgICAgICAgeG1tNywgICAgICAgMTEwMTEwMDBiCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcKLQotICAgIDsgTG9hZCB1cCBwcmVkaWN0IGJsb2NrcwotICAgICAgICBtb3ZxICAgICAgICB4bW00LCAgICAgICAgICAgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgICAgIFtyc2krMTZdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgICAgIHhtbTcKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tNAotICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgICAgICBbcnNpKzMyXQotICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICAgICAgW3JzaSs0OF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW01Ci0KLS5maW5pc2g6Ci0KLSAgICA7IHBhY2sgdXAgYmVmb3JlIHN0b3JpbmcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMCwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgICAgIHhtbTcKLQotICAgIDsgTG9hZCBkZXN0aW5hdGlvbiBzdHJpZGUgYmVmb3JlIHdyaXRpbmcgb3V0LAotICAgIDsgICBkb2Vzbid0IG5lZWQgdG8gcGVyc2lzdAotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7IGRzdF9zdHJpZGUKLQotICAgIDsgc3RvcmUgYmxvY2tzIGJhY2sgb3V0Ci0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkgKyByZHhdLCAgICB4bW0xCi0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyAyKnJkeF0KLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICAgICAgeG1tMgotICAgICAgICBtb3ZxICAgICAgICBbcmRpICsgcmR4XSwgICAgeG1tMwotCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLWZvdXJzOgotICAgIHRpbWVzIDggZHcgMHgwMDA0Ci1hbGlnbiAxNgoteF9zMXNxcjI6Ci0gICAgdGltZXMgOCBkdyAweDhBOEMKLWFsaWduIDE2Ci14X2Mxc3FyMmxlc3MxOgotICAgIHRpbWVzIDggZHcgMHg0RTdCCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9pd2Fsc2hfbW14LmFzbSBiL3ZwOC9jb21tb24veDg2L2l3YWxzaF9tbXguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI1Mjc0Li4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L2l3YWxzaF9tbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO3ZvaWQgdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX21teChzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpCi1nbG9iYWwgc3ltKHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfMV9tbXgpCi1zeW0odnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAyCi0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBtb3YgICAgIHJzaSwgYXJnKDApCi0gICAgbW92ICAgICByYXgsIDMKLQotICAgIG1vdiAgICAgcmRpLCBhcmcoMSkKLSAgICBhZGQgICAgIHJheCwgW3JzaV0gICAgICAgICAgO2lucHV0WzBdICsgMwotCi0gICAgbW92ZCAgICBtbTAsIGVheAotCi0gICAgcHVucGNrbHdkIG1tMCwgbW0wICAgICAgICAgIDt4IHggdmFsIHZhbAotCi0gICAgcHVucGNrbGRxIG1tMCwgbW0wICAgICAgICAgIDt2YWwgdmFsIHZhbCB2YWwKLQotICAgIHBzcmF3ICAgbW0wLCAzICAgICAgICAgICAgOyhpbnB1dFswXSArIDMpID4+IDMKLQotICAgIG1vdnEgIFtyZGkgKyAwXSwgbW0wCi0gICAgbW92cSAgW3JkaSArIDhdLCBtbTAKLSAgICBtb3ZxICBbcmRpICsgMTZdLCBtbTAKLSAgICBtb3ZxICBbcmRpICsgMjRdLCBtbTAKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLTt2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbW14KHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCkKLWdsb2JhbCBzeW0odnA4X3Nob3J0X2ludl93YWxzaDR4NF9tbXgpCi1zeW0odnA4X3Nob3J0X2ludl93YWxzaDR4NF9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMgotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgbW92ICAgICByYXgsIDMKLSAgICBtb3YgICAgIHJzaSwgYXJnKDApCi0gICAgbW92ICAgICByZGksIGFyZygxKQotICAgIHNobCAgICAgcmF4LCAxNgotCi0gICAgbW92cSAgICBtbTAsIFtyc2kgKyAwXSAgICAgICAgO2lwWzBdCi0gICAgbW92cSAgICBtbTEsIFtyc2kgKyA4XSAgICAgICAgO2lwWzRdCi0gICAgb3IgICAgICByYXgsIDMgICAgICAgICAgICA7MDAwMzAwMDNoCi0KLSAgICBtb3ZxICAgIG1tMiwgW3JzaSArIDE2XSAgICAgICA7aXBbOF0KLSAgICBtb3ZxICAgIG1tMywgW3JzaSArIDI0XSAgICAgICA7aXBbMTJdCi0KLSAgICBtb3ZxICAgIG1tNywgcmF4Ci0gICAgbW92cSAgICBtbTQsIG1tMAotCi0gICAgcHVucGNrbHdkIG1tNywgbW03ICAgICAgICAgIDswMDAzMDAwMzAwMDMwMDAzaAotICAgIG1vdnEgICAgbW01LCBtbTEKLQotICAgIHBhZGR3ICAgbW00LCBtbTMgICAgICAgICAgO2lwWzBdICsgaXBbMTJdIGFrYSBhbAotICAgIHBhZGR3ICAgbW01LCBtbTIgICAgICAgICAgO2lwWzRdICsgaXBbOF0gYWthIGJsCi0KLSAgICBtb3ZxICAgIG1tNiwgbW00ICAgICAgICAgIDt0ZW1wIGFsCi0KLSAgICBwYWRkdyAgIG1tNCwgbW01ICAgICAgICAgIDthbCArIGJsCi0gICAgcHN1YncgICBtbTYsIG1tNSAgICAgICAgICA7YWwgLSBibAotCi0gICAgcHN1YncgICBtbTAsIG1tMyAgICAgICAgICA7aXBbMF0gLSBpcFsxMl0gYWthIGQxCi0gICAgcHN1YncgICBtbTEsIG1tMiAgICAgICAgICA7aXBbNF0gLSBpcFs4XSBha2EgYzEKLQotICAgIG1vdnEgICAgbW01LCBtbTAgICAgICAgICAgO3RlbXAgZGwKLQotICAgIHBhZGR3ICAgbW0wLCBtbTEgICAgICAgICAgO2RsICsgY2wKLSAgICBwc3VidyAgIG1tNSwgbW0xICAgICAgICAgIDtkbCAtIGNsCi0KLSAgICA7IDAzIDAyIDAxIDAwCi0gICAgOyAxMyAxMiAxMSAxMAotICAgIDsgMjMgMjIgMjEgMjAKLSAgICA7IDMzIDMyIDMxIDMwCi0KLSAgICBtb3ZxICAgIG1tMywgbW00ICAgICAgICAgIDsgMDMgMDIgMDEgMDAKLSAgICBwdW5wY2tsd2QgbW00LCBtbTAgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgIHB1bnBja2h3ZCBtbTMsIG1tMCAgICAgICAgICA7IDEzIDAzIDEyIDAyCi0KLSAgICBtb3ZxICAgIG1tMSwgbW02ICAgICAgICAgIDsgMjMgMjIgMjEgMjAKLSAgICBwdW5wY2tsd2QgbW02LCBtbTUgICAgICAgICAgOyAzMSAyMSAzMCAyMAotICAgIHB1bnBja2h3ZCBtbTEsIG1tNSAgICAgICAgICA7IDMzIDIzIDMyIDIyCi0KLSAgICBtb3ZxICAgIG1tMCwgbW00ICAgICAgICAgIDsgMTEgMDEgMTAgMDAKLSAgICBtb3ZxICAgIG1tMiwgbW0zICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgIHB1bnBja2xkcSBtbTAsIG1tNiAgICAgICAgICA7IDMwIDIwIDEwIDAwIGFrYSBpcFswXQotICAgIHB1bnBja2hkcSBtbTQsIG1tNiAgICAgICAgICA7IDMxIDIxIDExIDAxIGFrYSBpcFs0XQotCi0gICAgcHVucGNrbGRxIG1tMiwgbW0xICAgICAgICAgIDsgMzIgMjIgMTIgMDIgYWthIGlwWzhdCi0gICAgcHVucGNraGRxIG1tMywgbW0xICAgICAgICAgIDsgMzMgMjMgMTMgMDMgYWthIGlwWzEyXQotO35+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIG1vdnEgICAgbW0xLCBtbTAKLSAgICBtb3ZxICAgIG1tNSwgbW00Ci0KLSAgICBwYWRkdyAgIG1tMSwgbW0zICAgICAgICAgIDtpcFswXSArIGlwWzEyXSBha2EgYWwKLSAgICBwYWRkdyAgIG1tNSwgbW0yICAgICAgICAgIDtpcFs0XSArIGlwWzhdIGFrYSBibAotCi0gICAgbW92cSAgICBtbTYsIG1tMSAgICAgICAgICA7dGVtcCBhbAotCi0gICAgcGFkZHcgICBtbTEsIG1tNSAgICAgICAgICA7YWwgKyBibAotICAgIHBzdWJ3ICAgbW02LCBtbTUgICAgICAgICAgO2FsIC0gYmwKLQotICAgIHBzdWJ3ICAgbW0wLCBtbTMgICAgICAgICAgO2lwWzBdIC0gaXBbMTJdIGFrYSBkMQotICAgIHBzdWJ3ICAgbW00LCBtbTIgICAgICAgICAgO2lwWzRdIC0gaXBbOF0gYWthIGMxCi0KLSAgICBtb3ZxICAgIG1tNSwgbW0wICAgICAgICAgIDt0ZW1wIGRsCi0KLSAgICBwYWRkdyAgIG1tMCwgbW00ICAgICAgICAgIDtkbCArIGNsCi0gICAgcHN1YncgICBtbTUsIG1tNCAgICAgICAgICA7ZGwgLSBjbAotO35+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIG1vdnEgICAgbW0zLCBtbTEgICAgICAgICAgOyAwMyAwMiAwMSAwMAotICAgIHB1bnBja2x3ZCBtbTEsIG1tMCAgICAgICAgICA7IDExIDAxIDEwIDAwCi0gICAgcHVucGNraHdkIG1tMywgbW0wICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgIG1vdnEgICAgbW00LCBtbTYgICAgICAgICAgOyAyMyAyMiAyMSAyMAotICAgIHB1bnBja2x3ZCBtbTYsIG1tNSAgICAgICAgICA7IDMxIDIxIDMwIDIwCi0gICAgcHVucGNraHdkIG1tNCwgbW01ICAgICAgICAgIDsgMzMgMjMgMzIgMjIKLQotICAgIG1vdnEgICAgbW0wLCBtbTEgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgIG1vdnEgICAgbW0yLCBtbTMgICAgICAgICAgOyAxMyAwMyAxMiAwMgotCi0gICAgcHVucGNrbGRxIG1tMCwgbW02ICAgICAgICAgIDsgMzAgMjAgMTAgMDAgYWthIGlwWzBdCi0gICAgcHVucGNraGRxIG1tMSwgbW02ICAgICAgICAgIDsgMzEgMjEgMTEgMDEgYWthIGlwWzRdCi0KLSAgICBwdW5wY2tsZHEgbW0yLCBtbTQgICAgICAgICAgOyAzMiAyMiAxMiAwMiBha2EgaXBbOF0KLSAgICBwdW5wY2toZHEgbW0zLCBtbTQgICAgICAgICAgOyAzMyAyMyAxMyAwMyBha2EgaXBbMTJdCi0KLSAgICBwYWRkdyAgIG1tMCwgbW03Ci0gICAgcGFkZHcgICBtbTEsIG1tNwotICAgIHBhZGR3ICAgbW0yLCBtbTcKLSAgICBwYWRkdyAgIG1tMywgbW03Ci0KLSAgICBwc3JhdyAgIG1tMCwgMwotICAgIHBzcmF3ICAgbW0xLCAzCi0gICAgcHNyYXcgICBtbTIsIDMKLSAgICBwc3JhdyAgIG1tMywgMwotCi0gICAgbW92cSAgW3JkaSArIDBdLCBtbTAKLSAgICBtb3ZxICBbcmRpICsgOF0sIG1tMQotICAgIG1vdnEgIFtyZGkgKyAxNl0sIG1tMgotICAgIG1vdnEgIFtyZGkgKyAyNF0sIG1tMwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYvaXdhbHNoX3NzZTIuYXNtIGIvdnA4L2NvbW1vbi94ODYvaXdhbHNoX3NzZTIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M5N2RmLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L2l3YWxzaF9zc2UyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLTt2b2lkIHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfc3NlMihzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQpCi1nbG9iYWwgc3ltKHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfc3NlMikKLXN5bSh2cDhfc2hvcnRfaW52X3dhbHNoNHg0X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMgotICAgIFNBVkVfWE1NCi0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBtb3YgICAgIHJzaSwgYXJnKDApCi0gICAgbW92ICAgICByZGksIGFyZygxKQotICAgIG1vdiAgICAgcmF4LCAzCi0KLSAgICBtb3ZkcWEgICAgeG1tMCwgW3JzaSArIDBdICAgICAgIDtpcFs0XSBpcFswXQotICAgIG1vdmRxYSAgICB4bW0xLCBbcnNpICsgMTZdICAgICAgO2lwWzEyXSBpcFs4XQotCi0gICAgc2hsICAgICByYXgsIDE2Ci0gICAgb3IgICAgICByYXgsIDMgICAgICAgICAgICA7MDAwMzAwMDNoCi0KLSAgICBwc2h1ZmQgICAgeG1tMiwgeG1tMSwgNGVoICAgICAgIDtpcFs4XSBpcFsxMl0KLSAgICBtb3ZkcWEgICAgeG1tMywgeG1tMCAgICAgICAgICA7aXBbNF0gaXBbMF0KLQotICAgIHBhZGR3ICAgeG1tMCwgeG1tMiAgICAgICAgICA7aXBbNF0raXBbOF0gaXBbMF0raXBbMTJdIGFrYSBiMSBhMQotICAgIHBzdWJ3ICAgeG1tMywgeG1tMiAgICAgICAgICA7aXBbNF0taXBbOF0gaXBbMF0taXBbMTJdIGFrYSBjMSBkMQotCi0gICAgbW92ZHFhICAgIHhtbTQsIHhtbTAKLSAgICBwdW5wY2tscWRxICB4bW0wLCB4bW0zICAgICAgICAgIDtkMSBhMQotICAgIHB1bnBja2hxZHEgIHhtbTQsIHhtbTMgICAgICAgICAgO2MxIGIxCi0gICAgbW92ZCAgICB4bW03LCBlYXgKLQotICAgIG1vdmRxYSAgICB4bW0xLCB4bW00ICAgICAgICAgIDtjMSBiMQotICAgIHBhZGR3ICAgeG1tNCwgeG1tMCAgICAgICAgICA7ZGwrY2wgYTErYjEgYWthIG9wWzRdIG9wWzBdCi0gICAgcHN1YncgICB4bW0wLCB4bW0xICAgICAgICAgIDtkMS1jMSBhMS1iMSBha2Egb3BbMTJdIG9wWzhdCi0KLTs7O3RlbXAgb3V0cHV0Ci07OyAgbW92ZHF1ICBbcmRpICsgMF0sIHhtbTQKLTs7ICBtb3ZkcXUgIFtyZGkgKyAxNl0sIHhtbTMKLQotO35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICAgOyAxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAotICAgIDsKLSAgICA7IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwCi0gICAgOwotICAgIG1vdmRxYSAgICB4bW0zLCB4bW00ICAgICAgICAgIDsgMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLSAgICBwdW5wY2tsd2QgeG1tNCwgeG1tMCAgICAgICAgICA7IDIzIDAzIDIyIDAyIDIxIDAxIDIwIDAwCi0gICAgcHVucGNraHdkIHhtbTMsIHhtbTAgICAgICAgICAgOyAzMyAxMyAzMiAxMiAzMSAxMSAzMCAxMAotICAgIG1vdmRxYSAgICB4bW0xLCB4bW00ICAgICAgICAgIDsgMjMgMDMgMjIgMDIgMjEgMDEgMjAgMDAKLSAgICBwdW5wY2tsd2QgeG1tNCwgeG1tMyAgICAgICAgICA7IDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCi0gICAgcHVucGNraHdkIHhtbTEsIHhtbTMgICAgICAgICAgOyAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMgotICAgIDt+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIHBzaHVmZCAgICB4bW0yLCB4bW0xLCA0ZWggICAgICAgO2lwWzhdIGlwWzEyXQotICAgIG1vdmRxYSAgICB4bW0zLCB4bW00ICAgICAgICAgIDtpcFs0XSBpcFswXQotCi0gICAgcHNodWZkICAgIHhtbTcsIHhtbTcsIDAgICAgICAgOzAzIDAzIDAzIDAzIDAzIDAzIDAzIDAzCi0KLSAgICBwYWRkdyAgIHhtbTQsIHhtbTIgICAgICAgICAgO2lwWzRdK2lwWzhdIGlwWzBdK2lwWzEyXSBha2EgYjEgYTEKLSAgICBwc3VidyAgIHhtbTMsIHhtbTIgICAgICAgICAgO2lwWzRdLWlwWzhdIGlwWzBdLWlwWzEyXSBha2EgYzEgZDEKLQotICAgIG1vdmRxYSAgICB4bW01LCB4bW00Ci0gICAgcHVucGNrbHFkcSAgeG1tNCwgeG1tMyAgICAgICAgICA7ZDEgYTEKLSAgICBwdW5wY2tocWRxICB4bW01LCB4bW0zICAgICAgICAgIDtjMSBiMQotCi0gICAgbW92ZHFhICAgIHhtbTEsIHhtbTUgICAgICAgICAgO2MxIGIxCi0gICAgcGFkZHcgICB4bW01LCB4bW00ICAgICAgICAgIDtkbCtjbCBhMStiMSBha2Egb3BbNF0gb3BbMF0KLSAgICBwc3VidyAgIHhtbTQsIHhtbTEgICAgICAgICAgO2QxLWMxIGExLWIxIGFrYSBvcFsxMl0gb3BbOF0KLTt+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIDsgMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLSAgICA7Ci0gICAgOyAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMAotICAgIDsKLSAgICBtb3ZkcWEgICAgeG1tMCwgeG1tNSAgICAgICAgICA7IDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCi0gICAgcHVucGNrbHdkIHhtbTUsIHhtbTQgICAgICAgICAgOyAyMyAwMyAyMiAwMiAyMSAwMSAyMCAwMAotICAgIHB1bnBja2h3ZCB4bW0wLCB4bW00ICAgICAgICAgIDsgMzMgMTMgMzIgMTIgMzEgMTEgMzAgMTAKLSAgICBtb3ZkcWEgICAgeG1tMSwgeG1tNSAgICAgICAgICA7IDIzIDAzIDIyIDAyIDIxIDAxIDIwIDAwCi0gICAgcHVucGNrbHdkIHhtbTUsIHhtbTAgICAgICAgICAgOyAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAotICAgIHB1bnBja2h3ZCB4bW0xLCB4bW0wICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIKLTt+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIHBhZGR3ICAgeG1tNSwgeG1tNwotICAgIHBhZGR3ICAgeG1tMSwgeG1tNwotCi0gICAgcHNyYXcgICB4bW01LCAzCi0gICAgcHNyYXcgICB4bW0xLCAzCi0KLSAgICBtb3ZkcWEgIFtyZGkgKyAwXSwgeG1tNQotICAgIG1vdmRxYSAgW3JkaSArIDE2XSwgeG1tMQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXhfczFzcXIyOgotICAgIHRpbWVzIDQgZHcgMHg4QThDCi1hbGlnbiAxNgoteF9jMXNxcjJsZXNzMToKLSAgICB0aW1lcyA0IGR3IDB4NEU3QgotYWxpZ24gMTYKLWZvdXJzOgotICAgIHRpbWVzIDQgZHcgMHgwMDA0CmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX21teC5hc20gYi92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX21teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzIxNWMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl9tbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTc3NyArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCBzcmNfcGl4ZWxfc3RlcCwKLTsgICAgY29uc3QgY2hhciAqZmxpbWl0LAotOyAgICBjb25zdCBjaGFyICpsaW1pdCwKLTsgICAgY29uc3QgY2hhciAqdGhyZXNoLAotOyAgICBpbnQgIGNvdW50Ci07KQotZ2xvYmFsIHN5bSh2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCkKLXN5bSh2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHJlc2VydmUgMzIgYnl0ZXMKLSAgICAlZGVmaW5lIHQwIFtyc3AgKyAwXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDBbOF07Ci0gICAgJWRlZmluZSB0MSBbcnNwICsgMTZdICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQxWzhdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsX3N0ZXAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBkd29yZCBwdHIgYXJnKDUpIDtjb3VudAotbmV4dDhfaDoKLSAgICAgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMykgO2xpbWl0Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNywgW3JkeF0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCByc2kgICAgICAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCByYXgKLQotICAgICAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgW3JkaSsyKnJheF0gICAgICA7IHEzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JzaSsyKnJheF0gICAgICA7IHEyCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7IHEyCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgbW0yICAgICAgICAgICAgICA7IHEyLT1xMwotICAgICAgICBwc3VidXNiICAgICBtbTIsIG1tNiAgICAgICAgICAgICAgOyBxMy09cTIKLSAgICAgICAgcG9yICAgICAgICAgbW0xLCBtbTIgICAgICAgICAgICAgIDsgYWJzKHEzLXEyKQotICAgICAgICBwc3VidXNiICAgICBtbTEsIG1tNyAgICAgICAgICAgICAgOwotCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpK3JheF0gICAgICAgIDsgcTEKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTQgICAgICAgICAgICAgIDsgcTEKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTYgICAgICAgICAgICAgIDsgcTEtPXEyCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNiwgbW0zICAgICAgICAgICAgICA7IHEyLT1xMQotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tNiAgICAgICAgICAgICAgOyBhYnMocTItcTEpCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKLSAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgW3JzaV0gICAgICAgICAgICA7IHEwCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgbW00ICAgICAgICAgICAgICA7IHEwCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW0zICAgICAgICAgICAgICA7IHEwLT1xMQotICAgICAgICBwc3VidXNiICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxMS09cTAKLSAgICAgICAgcG9yICAgICAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgYWJzKHEwLXExKQotICAgICAgICBtb3ZxICAgICAgICB0MCwgbW00ICAgICAgICAgICAgICAgOyBzYXZlIHRvIHQwCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03Ci0gICAgICAgIHBvciAgICAgICAgbW0xLCBtbTQKLQotCi0gICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICA7IG5lZ2F0ZSBwaXRjaCB0byBkZWFsIHdpdGggYWJvdmUgYm9yZGVyCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcnNpKzQqcmF4XSAgICAgIDsgcDMKLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcmRpKzQqcmF4XSAgICAgIDsgcDIKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsgcDIKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTIgICAgICAgICAgICAgIDsgcDItPXAzCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMiwgbW01ICAgICAgICAgICAgICA7IHAzLT1wMgotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tMiAgICAgICAgICAgICAgOyBhYnMocDMgLSBwMikKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKLSAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAotCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpKzIqcmF4XSAgICAgIDsgcDEKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTQgICAgICAgICAgICAgIDsgcDEKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTUgICAgICAgICAgICAgIDsgcDEtPXAyCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgbW0zICAgICAgICAgICAgICA7IHAyLT1wMQotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tNSAgICAgICAgICAgICAgOyBhYnMocDIgLSBwMSkKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKLSAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICA7IHAxCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpK3JheF0gICAgICAgIDsgcDAKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsgcDAKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgcDAtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW01ICAgICAgICAgICAgICA7IHAxLT1wMAotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBhYnMocDEgLSBwMCkKLSAgICAgICAgbW92cSAgICAgICAgdDEsIG1tNCAgICAgICAgICAgICAgIDsgc2F2ZSB0byB0MQotICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNwotICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBbcmRpXSAgICAgICAgICAgIDsgcTEKLSAgICAgICAgbW92cSAgICAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgcTEKLSAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTIgICAgICAgICAgICAgIDsgcTEtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMiwgbW00ICAgICAgICAgICAgICA7IHAxLT1xMQotICAgICAgICBwb3IgICAgICAgICBtbTIsIG1tMyAgICAgICAgICAgICAgOyBhYnMocDEtcTEpCi0gICAgICAgIHBhbmQgICAgICAgIG1tMiwgW0dMT0JBTCh0ZmUpXSAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KLSAgICAgICAgcHNybHcgICAgICAgbW0yLCAxICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKS8yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgcDAKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBbcnNpXSAgICAgICAgICAgIDsgcTAKLSAgICAgICAgcHN1YnVzYiAgICAgbW01LCBtbTMgICAgICAgICAgICAgIDsgcDAtPXEwCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW02ICAgICAgICAgICAgICA7IHEwLT1wMAotICAgICAgICBwb3IgICAgICAgICBtbTUsIG1tMyAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKLSAgICAgICAgcGFkZHVzYiAgICAgbW01LCBtbTUgICAgICAgICAgICAgIDsgYWJzKHAwLXEwKSoyCi0gICAgICAgIHBhZGR1c2IgICAgIG1tNSwgbW0yICAgICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIKLQotICAgICAgICBtb3YgICAgICAgICByZHgsIGFyZygyKSA7ZmxpbWl0ICAgICAgICAgICA7IGdldCBmbGltaXQKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcmR4XSAgICAgICAgICAgIDsgZmxpbWl0IG1tMgotICAgICAgICBwYWRkYiAgICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgOyBmbGltaXQqMiAobGVzcyB0aGFuIDI1NSkKLSAgICAgICAgcGFkZGIgICAgICAgbW03LCBtbTIgICAgICAgICAgICAgIDsgZmxpbWl0ICogMiArIGxpbWl0IChsZXNzIHRoYW4gMjU1KQotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgbW03ICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gZmxpbWl0ICogMiArIGxpbWl0Ci0gICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgbW01Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNSwgICAgbW01Ci0gICAgICAgIHBjbXBlcWIgICAgIG1tMSwgICAgbW01ICAgICAgICAgICA7IG1hc2sgbW0xCi0KLSAgICAgICAgOyBjYWxjdWxhdGUgaGlnaCBlZGdlIHZhcmlhbmNlCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDQpIDt0aHJlc2ggICAgICAgICAgIDsgZ2V0IHRocmVzaAotICAgICAgICBtb3ZxICAgICAgICBtbTcsIFtyZHhdICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICBtbTQsIHQwICAgICAgICAgICAgICAgOyBnZXQgYWJzIChxMSAtIHEwKQotICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIHQxICAgICAgICAgICAgICAgOyBnZXQgYWJzIChwMSAtIHAwKQotICAgICAgICBwc3VidXNiICAgICBtbTMsIG1tNwotICAgICAgICBwYWRkYiAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2ggfHwgYWJzKHAxIC0gcDApID4gdGhyZXNoCi0KLSAgICAgICAgcGNtcGVxYiAgICAgbW00LCAgICAgICAgbW01Ci0KLSAgICAgICAgcGNtcGVxYiAgICAgbW01LCAgICAgICAgbW01Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNCwgICAgICAgIG1tNQotCi0KLSAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcnNpKzIqcmF4XSAgICAgIDsgcDEKLSAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmRpXSAgICAgICAgICAgIDsgcTEKLSAgICAgICAgcHhvciAgICAgICAgbW0yLCBbR0xPQkFMKHQ4MCldICAgIDsgcDEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICBweG9yICAgICAgICBtbTcsIFtHTE9CQUwodDgwKV0gICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMiwgbW03ICAgICAgICAgICAgICA7IHAxIC0gcTEKLSAgICAgICAgcGFuZCAgICAgICAgbW0yLCBtbTQgICAgICAgICAgICAgIDsgaGlnaCB2YXIgbWFzayAoaHZtKShwMSAtIHExKQotICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0gICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgcHN1YnNiICAgICAgbW0wLCBtbTYgICAgICAgICAgICAgIDsgcTAgLSBwMAotICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyAxICogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IDIgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKLSAgICAgICAgcGFkZHNiICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKQotICAgICAgICBwYW5kICAgICAgICBtbTEsIG1tMiAgICAgICAgICAgICAgICAgIDsgbWFzayBmaWx0ZXIgdmFsdWVzIHdlIGRvbid0IGNhcmUgYWJvdXQKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTEKLSAgICAgICAgcGFkZHNiICAgICAgbW0xLCBbR0xPQkFMKHQ0KV0gICAgIDsgMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNAotICAgICAgICBwYWRkc2IgICAgICBtbTIsIFtHTE9CQUwodDMpXSAgICAgOyAzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyAzCi0KLSAgICAgICAgcHhvciAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICAgOwotICAgICAgICBweG9yICAgICAgICBtbTUsIG1tNQotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tMiAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNraGJ3ICAgbW01LCBtbTIgICAgICAgICAgICA7Ci0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgMTEgICAgICAgICAgICAgOwotICAgICAgICBwc3JhdyAgICAgICBtbTUsIDExCi0gICAgICAgIHBhY2tzc3diICAgIG1tMCwgbW01Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgOyAgKDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDMpID4+IDM7Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICAgIDsgMAotICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tMSAgICAgICAgICAgICAgOyBhYmNkZWZnaAotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tMSAgICAgICAgICAgICAgOyBlMGYwZzBoMAotICAgICAgICBwc3JhdyAgICAgICBtbTAsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgcHhvciAgICAgICAgbW0xLCBtbTEgICAgICAgICAgICAgIDsgMAotICAgICAgICBwdW5wY2toYncgICBtbTEsIG1tNSAgICAgICAgICAgICAgOyBhMGIwYzBkMAotICAgICAgICBwc3JhdyAgICAgICBtbTEsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgIDsgc2F2ZSByZXN1bHRzCi0KLSAgICAgICAgcGFja3Nzd2IgICAgbW0wLCBtbTEgICAgICAgICAgICAgIDsgKDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQpID4+MwotICAgICAgICBwYWRkc3cgICAgICBtbTUsIFtHTE9CQUwob25lcyldCi0gICAgICAgIHBhZGRzdyAgICAgIG1tMSwgW0dMT0JBTChvbmVzKV0KLSAgICAgICAgcHNyYXcgICAgICAgbW01LCAxICAgICAgICAgICAgICAgIDsgcGFydGlhbCBzaGlmdGVkIG9uZSBtb3JlIHRpbWUgZm9yIDJuZCB0YXAKLSAgICAgICAgcHNyYXcgICAgICAgbW0xLCAxICAgICAgICAgICAgICAgIDsgcGFydGlhbCBzaGlmdGVkIG9uZSBtb3JlIHRpbWUgZm9yIDJuZCB0YXAKLSAgICAgICAgcGFja3Nzd2IgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgKDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQpID4+NAotICAgICAgICBwYW5kbiAgICAgICBtbTQsIG1tNSAgICAgICAgICAgICAgOyBoaWdoIGVkZ2UgdmFyaWFuY2UgYWRkaXRpdmUKLQotICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tMiAgICAgICAgICAgICAgOyBwMCs9IHAwIGFkZAotICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0gICAgOyB1bm9mZnNldAotICAgICAgICBtb3ZxICAgICAgICBbcnNpK3JheF0sIG1tNiAgICAgICAgOyB3cml0ZSBiYWNrCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcnNpKzIqcmF4XSAgICAgIDsgcDEKLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgIDsgcmVvZmZzZXQKLSAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsgcDErPSBwMSBhZGQKLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgIDsgdW5vZmZzZXQKLSAgICAgICAgbW92cSAgICAgICAgW3JzaSsyKnJheF0sIG1tNiAgICAgIDsgd3JpdGUgYmFjawotCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHEwLT0gcTAgYWRkCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXSAgICA7IHVub2Zmc2V0Ci0gICAgICAgIG1vdnEgICAgICAgIFtyc2ldLCBtbTMgICAgICAgICAgICA7IHdyaXRlIGJhY2sKLQotICAgICAgICBwc3Vic2IgICAgICBtbTcsIG1tNCAgICAgICAgICAgICAgOyBxMS09IHExIGFkZAotICAgICAgICBweG9yICAgICAgICBtbTcsIFtHTE9CQUwodDgwKV0gICAgOyB1bm9mZnNldAotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgbW03ICAgICAgICAgICAgOyB3cml0ZSBiYWNrCi0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLDgKLSAgICAgICAgbmVnICAgICAgICAgcmF4Ci0gICAgICAgIGRlYyAgICAgICAgIHJjeAotICAgICAgICBqbnogICAgICAgICBuZXh0OF9oCi0KLSAgICBhZGQgcnNwLCAzMgotICAgIHBvcCByc3AKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14Ci07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19waXhlbF9zdGVwLAotOyAgICBjb25zdCBjaGFyICpmbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgKmxpbWl0LAotOyAgICBjb25zdCBjaGFyICp0aHJlc2gsCi07ICAgIGludCBjb3VudAotOykKLWdsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KQotc3ltKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgIHJzcCwgNjQgICAgICA7IHJlc2VydmUgNjQgYnl0ZXMKLSAgICAlZGVmaW5lIHQwICAgW3JzcCArIDBdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MFs4XTsKLSAgICAlZGVmaW5lIHQxICAgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVs4XTsKLSAgICAlZGVmaW5lIHNyY3QgW3JzcCArIDMyXSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciBzcmN0WzMyXTsKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsX3N0ZXAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheCo0IC0gNF0KLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtjb3VudAotbmV4dDhfdjoKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgcnNpICAgICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJheAotCi0KLSAgICAgICAgO3RyYW5zcG9zZQotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcnNpKzIqcmF4XSAgICAgICAgICAgICAgICAgOyA2NyA2NiA2NSA2NCA2MyA2MiA2MSA2MAotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NyA3NiA3NSA3NCA3MyA3MiA3MSA3MAotCi0gICAgICAgIHB1bnBja2hidyAgIG1tNywgICAgICAgIFtyZGkrMipyYXhdICAgICAgICAgICAgICAgICA7IDc3IDY3IDc2IDY2IDc1IDY1IDc0IDY0Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNiwgICAgICAgIFtyZGkrMipyYXhdICAgICAgICAgICAgICAgICA7IDczIDYzIDcyIDYyIDcxIDYxIDcwIDYwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JzaV0gICAgICAgICAgICAgICAgICAgICAgIDsgNDcgNDYgNDUgNDQgNDMgNDIgNDEgNDAKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNDcgNDYgNDUgNDQgNDMgNDIgNDEgNDAKLQotICAgICAgICBwdW5wY2toYncgICBtbTUsICAgICAgICBbcnNpK3JheF0gICAgICAgICAgICAgICAgICAgOyA1NyA0NyA1NiA0NiA1NSA0NSA1NCA0NAotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICBbcnNpK3JheF0gICAgICAgICAgICAgICAgICAgOyA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IDU3IDQ3IDU2IDQ2IDU1IDQ1IDU0IDQ0Ci0gICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IDc3IDY3IDU3IDQ3IDc2IDY2IDU2IDQ2Ci0KLSAgICAgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzUgNjUgNTUgNDUgNzQgNjQgNTQgNDQKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAKLQotICAgICAgICBwdW5wY2tod2QgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MgotICAgICAgICBwdW5wY2tsd2QgICBtbTIsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSA3MCA2MCA1MCA0MAotCi0gICAgICAgIG5lZyAgICAgICAgIHJheAotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcnNpK3JheCoyXSAgICAgICAgICAgICAgICAgOyAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwCi0gICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIFtyc2krcmF4XSAgICAgICAgICAgICAgICAgICA7IDM3IDI3IDM2IDM2IDM1IDI1IDM0IDI0Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgW3JzaStyYXhdICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JzaStyYXgqNF07ICAgICAgICAgICAgICAgIDsgMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLQotICAgICAgICBwdW5wY2toYncgICBtbTcsICAgICAgICBbcmRpK3JheCo0XSAgICAgICAgICAgICAgICAgOyAxNyAwNyAxNiAwNiAxNSAwNSAxNCAwNAotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAxNyAwNyAxNiAwNiAxNSAwNSAxNCAwNAotCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDM3IDI3IDE3IDA3IDM2IDI2IDE2IDA2Ci0gICAgICAgIHB1bnBja2x3ZCAgIG1tMCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDM1IDI1IDE1IDA1IDM0IDI0IDE0IDA0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzcgMjcgMTcgMDcgMzYgMjYgMTYgMDYKLSAgICAgICAgcHVucGNraGRxICAgbW03LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgMzcgMjcgMTcgMDcgID0gcTMKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTYsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NiA2NiA1NiA0NiAzNiAyNiAxNiAwNiAgPSBxMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2Ci0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHEyLXEzCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTMtcTIKLSAgICAgICAgcG9yICAgICAgICAgbW03LCAgICAgICAgbW01OyAgICAgICAgICAgICAgICAgICAgICAgIDsgbW03PWFicyAocTMtcTIpCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzUgMjUgMTUgMDUgMzQgMjQgMTQgMDQKLSAgICAgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzUgNjUgNTUgNDUgMzUgMjUgMTUgMDUgPSBxMQotCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IDc0IDY0IDU0IDQ0IDM0IDI0IDE1IDA0ID0gcTAKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzUgNjUgNTUgNDUgMzUgMjUgMTUgMDUgPSBxMQotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IHExLXEyCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHEyLXExCi0KLSAgICAgICAgcG9yICAgICAgICAgbW02LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW02PWFicyhxMi1xMSkKLSAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgc3JjdAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHgrMjRdLCAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcTEKLSAgICAgICAgbW92cSAgICAgICAgW3JkeCsxNl0sICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBxMAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2krcmF4KjRdICAgICAgICAgICAgICAgICA7IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0gICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgIFtyZGkrcmF4KjRdICAgICAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKLSAgICAgICAgcHVucGNrbHdkICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKLQotICAgICAgICBwdW5wY2tod2QgICBtbTMsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMgotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAotCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwICA9cDMKLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgID1wMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxICA9cDIKLSAgICAgICAgcHN1YnVzYiAgICAgbW0yLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDItcDMKLQotICAgICAgICBwc3VidXNiICAgICBtbTAsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMy1wMgotICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTA9YWJzKHAzLXAyKQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMiwgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyID0gcDEKLQotICAgICAgICBwdW5wY2toZHEgICBtbTMsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA9IHAwCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHgrOF0sICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcDAKLQotICAgICAgICBtb3ZxICAgICAgICBbcmR4XSwgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHAxCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tNSA9IHAxCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW0yLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEtcDIKLSAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDItcDEKLQotICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTE9YWJzKHAyLXAxKQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoMykgO2xpbWl0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JkeF0gICAgICAgICAgICAgICAgICAgICAgIDsgbW00ID0gbGltaXQKLSAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW00Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgbW0wLCAgICAgICAgbW00Ci0gICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tNAotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNiwgICAgICAgIG1tNAotICAgICAgICBwb3IgICAgICAgICBtbTcsICAgICAgICBtbTYKLQotICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBhYnMocTMtcTIpID4gbGltaXQgfHwgYWJzKHAzLXAyKSA+IGxpbWl0IHx8YWJzKHAyLXAxKSA+IGxpbWl0IHx8IGFicyhxMi1xMSkgPiBsaW1pdAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxCi0KLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0zPW1tNz1wMAotICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMCAtIHAxCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBwMAotICAgICAgICBwb3IgICAgICAgICBtbTUsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcDApCi0KLSAgICAgICAgbW92cSAgICAgICAgdDAsICAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBhYnMocDEtcDApCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIHNyY3QKLQotICAgICAgICBwc3VidXNiICAgICBtbTUsICAgICAgICBtbTQKLSAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0wPW1hc2sKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcmR4KzE2XSAgICAgICAgICAgICAgICAgICAgOyBtbTU9cTAKLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JkeCsyNF0gICAgICAgICAgICAgICAgICAgIDsgbW03PXExCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW02PXEwCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHExCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwLXExCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtcTAKLSAgICAgICAgcG9yICAgICAgICAgbW03LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHExLXEwKQotCi0gICAgICAgIG1vdnEgICAgICAgIHQxLCAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgYWJzKHExLXEwKQotICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTQKLQotICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBtYXNrCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEKLSAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxLT1xMQotICAgICAgICBwb3IgICAgICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpCi0gICAgICAgIHBhbmQgICAgICAgIG1tNSwgICAgICAgIFtHTE9CQUwodGZlKV0gICAgICAgICAgICAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KLSAgICAgICAgcHNybHcgICAgICAgbW01LCAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKS8yCi0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDIpIDtmbGltaXQgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIFtyZHhdICAgICAgICAgICAgICAgICAgICAgICA7ZmxpbWl0ICBtbTIKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW0xPW1tMz1wMAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tNz1tbTY9cTAKLSAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDAtcTAKLQotICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMC1wMAotICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTAtcDApCi0gICAgICAgIHBhZGR1c2IgICAgIG1tMSwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMC1wMCkqMgotICAgICAgICBwYWRkdXNiICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCi0KLSAgICAgICAgcGFkZGIgICAgICAgbW0yLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmxpbWl0KjIgKGxlc3MgdGhhbiAyNTUpCi0gICAgICAgIHBhZGRiICAgICAgIG1tNCwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdCAobGVzcyB0aGFuIDI1NSkKLQotICAgICAgICBwc3VidXNiICAgICBtbTEsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yICA+IGZsaW1pdCAqIDIgKyBsaW1pdAotICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTA7ICAgICAgICAgICAgICAgICAgICAgICAgOyBtYXNrCi0KLSAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgbW0wCi0gICAgICAgIHBjbXBlcWIgICAgIG1tMSwgICAgICAgIG1tMAotCi0gICAgICAgIDsgY2FsY3VsYXRlIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoNCkgO3RocmVzaCAgICAgICAgICAgIDsgZ2V0IHRocmVzaAotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBbcmR4XQotICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIHQwICAgICAgICAgICAgICA7IGdldCBhYnMgKHExIC0gcTApCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgICAgICAgIG1tNwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIHQxICAgICAgICAgICAgICA7IGdldCBhYnMgKHAxIC0gcDApCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMywgICAgICAgIG1tNwotCi0gICAgICAgIHBvciAgICAgICAgIG1tNCwgICAgICAgIG1tMyAgICAgICAgICAgICA7IGFicyhxMSAtIHEwKSA+IHRocmVzaCB8fCBhYnMocDEgLSBwMCkgPiB0aHJlc2gKLSAgICAgICAgcGNtcGVxYiAgICAgbW00LCAgICAgICAgbW0wCi0KLSAgICAgICAgcGNtcGVxYiAgICAgbW0wLCAgICAgICAgbW0wCi0gICAgICAgIHB4b3IgICAgICAgIG1tNCwgICAgICAgIG1tMAotCi0KLQotICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycwotICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBzcmN0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JkeF0gICAgICAgICAgIDsgcDEKLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JkeCsyNF0gICAgICAgIDsgcTEKLQotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcmR4KzhdICAgICAgICAgOyBwMAotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBbcmR4KzE2XSAgICAgICAgOyBxMAotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMiwgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgW0dMT0JBTCh0ODApXSAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMiwgICAgICAgIG1tNyAgICAgICAgICAgICA7IHAxIC0gcTEKLSAgICAgICAgcGFuZCAgICAgICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgIDsgaGlnaCB2YXIgbWFzayAoaHZtKShwMSAtIHExKQotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgW0dMT0JBTCh0ODApXSAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tMCAgICAgICAgICAgICA7IHEwCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMCwgICAgICAgIG1tNiAgICAgICAgICAgICA7IHEwIC0gcDAKLQotICAgICAgICBwYWRkc2IgICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICAgICAgOyAxICogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgICAgICAgIG1tMCAgICAgICAgICAgICA7IDIgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKLQotICAgICAgICBwYWRkc2IgICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICAgICAgOyAzICogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpCi0gICAgICAgIHBhbmQgICAgICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMSwgICAgICAgIFtHTE9CQUwodDQpXSAgICAgIDsgMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNAotCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgICAgICAgIFtHTE9CQUwodDMpXSAgICAgIDsgMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgMwotICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAgICAgICAgICAgOwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNSwgICAgICAgIG1tNQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgICAgICBtbTIgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNraGJ3ICAgbW01LCAgICAgICAgbW0yICAgICAgICAgOwotICAgICAgICBwc3JhdyAgICAgICBtbTAsICAgICAgICAxMSAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmF3ICAgICAgIG1tNSwgICAgICAgIDExCi0gICAgICAgIHBhY2tzc3diICAgIG1tMCwgICAgICAgIG1tNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMCAgICAgICAgIDsgICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyAzKSA+PiAzOwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMCAgICAgICAgICAgOyAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMSAgICAgICAgICAgOyBhYmNkZWZnaAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgICAgOyBlMGYwZzBoMAotICAgICAgICBwc3JhdyAgICAgICBtbTAsICAgICAgICAxMSAgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMSwgICAgICAgIG1tMSAgICAgICAgICAgOyAwCi0gICAgICAgIHB1bnBja2hidyAgIG1tMSwgICAgICAgIG1tNSAgICAgICAgICAgOyBhMGIwYzBkMAotCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMSwgICAgICAgIDExICAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgOyBzYXZlIHJlc3VsdHMKLQotICAgICAgICBwYWNrc3N3YiAgICBtbTAsICAgICAgICBtbTEgICAgICAgICAgIDsgKDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDQpID4+MwotICAgICAgICBwYWRkc3cgICAgICBtbTUsICAgICAgICBbR0xPQkFMKG9uZXMpXQotCi0gICAgICAgIHBhZGRzdyAgICAgIG1tMSwgICAgICAgIFtHTE9CQUwob25lcyldCi0gICAgICAgIHBzcmF3ICAgICAgIG1tNSwgICAgICAgIDEgICAgICAgICAgICAgICAgIDsgcGFydGlhbCBzaGlmdGVkIG9uZSBtb3JlIHRpbWUgZm9yIDJuZCB0YXAKLQotICAgICAgICBwc3JhdyAgICAgICBtbTEsICAgICAgICAxICAgICAgICAgICAgICAgICA7IHBhcnRpYWwgc2hpZnRlZCBvbmUgbW9yZSB0aW1lIGZvciAybmQgdGFwCi0gICAgICAgIHBhY2tzc3diICAgIG1tNSwgICAgICAgIG1tMSAgICAgICAgICAgOyAoMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNCkgPj40Ci0KLSAgICAgICAgcGFuZG4gICAgICAgbW00LCAgICAgICAgbW01ICAgICAgICAgICAgIDsgaGlnaCBlZGdlIHZhcmlhbmNlIGFkZGl0aXZlCi0KLSAgICAgICAgcGFkZHNiICAgICAgbW02LCAgICAgICAgbW0yICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKLSAgICAgICAgcHhvciAgICAgICAgbW02LCAgICAgICAgW0dMT0JBTCh0ODApXSAgIDsgdW5vZmZzZXQKLQotICAgICAgICA7IG1tNj1wMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIFtyZHhdICAgICAgICAgICA7IHAxCi0gICAgICAgIHB4b3IgICAgICAgIG1tMSwgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IHJlb2Zmc2V0Ci0KLSAgICAgICAgcGFkZHNiICAgICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7IHAxKz0gcDEgYWRkCi0gICAgICAgIHB4b3IgICAgICAgIG1tMSwgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgOyB1bm9mZnNldAotICAgICAgICA7IG1tNiA9IHAwIG1tMSA9IHAxCi0KLSAgICAgICAgcHN1YnNiICAgICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHEwLT0gcTAgYWRkCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgOyB1bm9mZnNldAotCi0gICAgICAgIDsgbW0zID0gcTAKLSAgICAgICAgcHN1YnNiICAgICAgbW03LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7IHExLT0gcTEgYWRkCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgOyB1bm9mZnNldAotICAgICAgICA7IG1tNyA9IHExCi0KLSAgICAgICAgOyB0cmFucG9zZSBhbmQgd3JpdGUgYmFjawotICAgICAgICA7IG1tMSA9ICAgIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gICAgICAgIDsgbW02ID0gICAgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKLSAgICAgICAgOyBtbTMgPSAgICA3NCA2NCA1NCA0NCAzNCAyNCAxNCAwNAotICAgICAgICA7IG1tNyA9ICAgIDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xICAgICAgICAgICAgIDsgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICAgICAgbW02ICAgICAgICAgICAgIDsgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgOyA3NCA2NCA1NCA0NCAzNCAyNCAxNCAwNAotICAgICAgICBwdW5wY2toYncgICBtbTEsICAgICAgICBtbTYgICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MgotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgIG1tNyAgICAgICAgICAgICA7IDM1IDM0IDI1IDI0IDE1IDE0IDA1IDA0Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgICAgIG1tNyAgICAgICAgICAgICA7IDc1IDc0IDY1IDY0IDU1IDU0IDQ1IDQ0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW0yICAgICAgICAgICAgIDsgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKLSAgICAgICAgcHVucGNrbHdkICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgIDsgMTUgMTQgMTMgMTIgMDUgMDQgMDMgMDIKLQotICAgICAgICBwdW5wY2tod2QgICBtbTYsICAgICAgICBtbTQgICAgICAgICAgICAgOyAzNSAzNCAzMyAzMiAyNSAyNCAyMyAyMgotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MgotCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tMyAgICAgICAgICAgICA7IDU1IDU0IDUzIDUyIDQ1IDQ0IDQzIDQyCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tMyAgICAgICAgICAgICA7IDc1IDc0IDczIDcyIDY1IDY0IDYzIDYyCi0KLQotICAgICAgICA7IG1tMiA9IDE1IDE0IDEzIDEyIDA1IDA0IDAzIDAyCi0gICAgICAgIDsgbW02ID0gMzUgMzQgMzMgMzIgMjUgMjQgMjMgMjIKLSAgICAgICAgOyBtbTUgPSA1NSA1NCA1MyA1MiA0NSA0NCA0MyA0MgotICAgICAgICA7IG1tMSA9IDc1IDc0IDczIDcyIDY1IDY0IDYzIDYyCi0KLQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2krcmF4KjQrMl0sIG1tMgotICAgICAgICBwc3JscSAgICAgICBtbTIsICAgICAgICAzMgotCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGkrcmF4KjQrMl0sIG1tMgotICAgICAgICBtb3ZkICAgICAgICBbcnNpK3JheCoyKzJdLCBtbTYKLQotICAgICAgICBwc3JscSAgICAgICBtbTYsICAgICAgICAzMgotICAgICAgICBtb3ZkICAgICAgICBbcnNpK3JheCsyXSxtbTYKLQotICAgICAgICBtb3ZkICAgICAgICBbcnNpKzJdLCAgICBtbTEKLSAgICAgICAgcHNybHEgICAgICAgbW0xLCAgICAgICAgMzIKLQotICAgICAgICBtb3ZkICAgICAgICBbcmRpKzJdLCAgICBtbTEKLSAgICAgICAgbmVnICAgICAgICAgcmF4Ci0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaStyYXgrMl0sbW01Ci0gICAgICAgIHBzcmxxICAgICAgIG1tNSwgICAgICAgIDMyCi0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaStyYXgqMisyXSwgbW01Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqOF0KLSAgICAgICAgZGVjICAgICAgICAgcmN4Ci0gICAgICAgIGpueiAgICAgICAgIG5leHQ4X3YKLQotICAgIGFkZCByc3AsIDY0Ci0gICAgcG9wIHJzcAotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14Ci07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19waXhlbF9zdGVwLAotOyAgICBjb25zdCBjaGFyICpmbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgKmxpbWl0LAotOyAgICBjb25zdCBjaGFyICp0aHJlc2gsCi07ICAgIGludCBjb3VudAotOykKLWdsb2JhbCBzeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCkKLXN5bSh2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKLSAgICBzdWIgICAgICAgICAgcnNwLCAzMiAgICAgIDsgcmVzZXJ2ZSAzMiBieXRlcwotICAgICVkZWZpbmUgdDAgICBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzhdOwotICAgICVkZWZpbmUgdDEgICBbcnNwICsgMTZdICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQxWzhdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsX3N0ZXAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBkd29yZCBwdHIgYXJnKDUpIDtjb3VudAotbmV4dDhfbWJoOgotICAgICAgICBtb3YgICAgICAgICByZHgsIGFyZygzKSA7bGltaXQKLSAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmR4XQotICAgICAgICBtb3YgICAgICAgICByZGksIHJzaSAgICAgICAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZwotICAgICAgICBhZGQgICAgICAgICByZGksIHJheAotCi0gICAgICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcmRpKzIqcmF4XSAgICAgIDsgcTMKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyc2krMipyYXhdICAgICAgOyBxMgotICAgICAgICBtb3ZxICAgICAgICBtbTYsIG1tMSAgICAgICAgICAgICAgOyBxMgotICAgICAgICBwc3VidXNiICAgICBtbTEsIG1tMiAgICAgICAgICAgICAgOyBxMi09cTMKLSAgICAgICAgcHN1YnVzYiAgICAgbW0yLCBtbTYgICAgICAgICAgICAgIDsgcTMtPXEyCi0gICAgICAgIHBvciAgICAgICAgIG1tMSwgbW0yICAgICAgICAgICAgICA7IGFicyhxMy1xMikKLSAgICAgICAgcHN1YnVzYiAgICAgbW0xLCBtbTcKLQotCi0gICAgICAgIDsgbW0xID0gYWJzKHEzLXEyKSwgbW02ID1xMiwgbW03ID0gbGltaXQKLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpK3JheF0gICAgICAgIDsgcTEKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTQgICAgICAgICAgICAgIDsgcTEKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTYgICAgICAgICAgICAgIDsgcTEtPXEyCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNiwgbW0zICAgICAgICAgICAgICA7IHEyLT1xMQotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tNiAgICAgICAgICAgICAgOyBhYnMocTItcTEpCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03Ci0gICAgICAgIHBvciAgICAgICAgbW0xLCBtbTQKLQotCi0gICAgICAgIDsgbW0xID0gbWFzaywgICAgICBtbTM9cTEsIG1tNyA9IGxpbWl0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpXSAgICAgICAgICAgIDsgcTAKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCBtbTQgICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgcTAtPXExCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHExLT1xMAotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBhYnMocTAtcTEpCi0gICAgICAgIG1vdnEgICAgICAgIHQwLCBtbTQgICAgICAgICAgICAgICA7IHNhdmUgdG8gdDAKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKLSAgICAgICAgcG9yICAgICAgICBtbTEsIG1tNAotCi0KLSAgICAgICAgOyBtbTEgPSBtYXNrLCBtbTA9cTAsICBtbTcgPSBsaW1pdCwgdDAgPSBhYnMocTAtcTEpCi0KLSAgICAgICAgbmVnICAgICAgICAgcmF4ICAgICAgICAgICAgICAgICAgIDsgbmVnYXRlIHBpdGNoIHRvIGRlYWwgd2l0aCBhYm92ZSBib3JkZXIKLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtyc2krNCpyYXhdICAgICAgOyBwMwotICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyZGkrNCpyYXhdICAgICAgOyBwMgotICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBwMgotICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tMiAgICAgICAgICAgICAgOyBwMi09cDMKLSAgICAgICAgcHN1YnVzYiAgICAgbW0yLCBtbTUgICAgICAgICAgICAgIDsgcDMtPXAyCi0gICAgICAgIHBvciAgICAgICAgIG1tNCwgbW0yICAgICAgICAgICAgICA7IGFicyhwMyAtIHAyKQotICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNwotICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00Ci0gICAgICAgIDsgbW0xID0gbWFzaywgbW0wPXEwLCAgbW03ID0gbGltaXQsIHQwID0gYWJzKHEwLXExKQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgW3JzaSsyKnJheF0gICAgICA7IHAxCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgbW00ICAgICAgICAgICAgICA7IHAxCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW01ICAgICAgICAgICAgICA7IHAxLT1wMgotICAgICAgICBwc3VidXNiICAgICBtbTUsIG1tMyAgICAgICAgICAgICAgOyBwMi09cDEKLSAgICAgICAgcG9yICAgICAgICAgbW00LCBtbTUgICAgICAgICAgICAgIDsgYWJzKHAyIC0gcDEpCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNCwgbW03Ci0gICAgICAgIHBvciAgICAgICAgbW0xLCBtbTQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMyAgICAgICAgICAgICAgOyBwMQotCi0KLSAgICAgICAgOyBtbTEgPSBtYXNrLCBtbTA9cTAsICBtbTcgPSBsaW1pdCwgdDAgPSBhYnMocTAtcTEpCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpK3JheF0gICAgICAgIDsgcDAKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsgcDAKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgcDAtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMywgbW01ICAgICAgICAgICAgICA7IHAxLT1wMAotICAgICAgICBwb3IgICAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBhYnMocDEgLSBwMCkKLSAgICAgICAgbW92cSAgICAgICAgdDEsIG1tNCAgICAgICAgICAgICAgIDsgc2F2ZSB0byB0MQotICAgICAgICBwc3VidXNiICAgICBtbTQsIG1tNwotICAgICAgICBwb3IgICAgICAgIG1tMSwgbW00Ci0gICAgICAgIDsgbW0xID0gbWFzaywgbW0wPXEwLCAgbW03ID0gbGltaXQsIHQwID0gYWJzKHEwLXExKSB0MSA9IGFicyhwMS1wMCkKLSAgICAgICAgOyBtbTUgPSBwMAotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZGldICAgICAgICAgICAgOyBxMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsIG1tMyAgICAgICAgICAgICAgOyBxMQotICAgICAgICBwc3VidXNiICAgICBtbTMsIG1tMiAgICAgICAgICAgICAgOyBxMS09cDEKLSAgICAgICAgcHN1YnVzYiAgICAgbW0yLCBtbTQgICAgICAgICAgICAgIDsgcDEtPXExCi0gICAgICAgIHBvciAgICAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKLSAgICAgICAgcGFuZCAgICAgICAgbW0yLCBbR0xPQkFMKHRmZSldICAgIDsgc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybwotICAgICAgICBwc3JsdyAgICAgICBtbTIsIDEgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKLQotICAgICAgICBtb3ZxICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBwMAotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBwc3VidXNiICAgICBtbTUsIG1tMyAgICAgICAgICAgICAgOyBwMC09cTAKLSAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgcTAtPXAwCi0gICAgICAgIHBvciAgICAgICAgIG1tNSwgbW0zICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQotICAgICAgICBwYWRkdXNiICAgICBtbTUsIG1tNSAgICAgICAgICAgICAgOyBhYnMocDAtcTApKjIKLSAgICAgICAgcGFkZHVzYiAgICAgbW01LCBtbTIgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDIpIDtmbGltaXQgICAgICAgICAgIDsgZ2V0IGZsaW1pdAotICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtyZHhdICAgICAgICAgICAgOyBmbGltaXQgbW0yCi0gICAgICAgIHBhZGRiICAgICAgIG1tMiwgbW0yICAgICAgICAgICAgICA7IGZsaW1pdCoyIChsZXNzIHRoYW4gMjU1KQotICAgICAgICBwYWRkYiAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQgKGxlc3MgdGhhbiAyNTUpCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICBtbTcgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBmbGltaXQgKiAyICsgbGltaXQKLSAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICBtbTUKLSAgICAgICAgcHhvciAgICAgICAgbW01LCAgICBtbTUKLSAgICAgICAgcGNtcGVxYiAgICAgbW0xLCAgICBtbTUgICAgICAgICAgIDsgbWFzayBtbTEKLQotICAgICAgICA7IG1tMSA9IG1hc2ssIG1tMD1xMCwgIG1tNyA9IGZsaW1pdCwgdDAgPSBhYnMocTAtcTEpIHQxID0gYWJzKHAxLXAwKQotICAgICAgICA7IG1tNiA9IHAwLAotCi0gICAgICAgIDsgY2FsY3VsYXRlIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgICAgICBtb3YgICAgICAgICByZHgsIGFyZyg0KSA7dGhyZXNoICAgICAgICAgICA7IGdldCB0aHJlc2gKLSAgICAgICAgbW92cSAgICAgICAgbW03LCBbcmR4XSAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgbW00LCB0MCAgICAgICAgICAgICAgIDsgZ2V0IGFicyAocTEgLSBxMCkKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTcKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCB0MSAgICAgICAgICAgICAgIDsgZ2V0IGFicyAocDEgLSBwMCkKLSAgICAgICAgcHN1YnVzYiAgICAgbW0zLCBtbTcKLSAgICAgICAgcGFkZGIgICAgICAgbW00LCBtbTMgICAgICAgICAgICAgIDsgYWJzKHExIC0gcTApID4gdGhyZXNoIHx8IGFicyhwMSAtIHAwKSA+IHRocmVzaAotCi0gICAgICAgIHBjbXBlcWIgICAgIG1tNCwgICAgICAgIG1tNQotCi0gICAgICAgIHBjbXBlcWIgICAgIG1tNSwgICAgICAgIG1tNQotICAgICAgICBweG9yICAgICAgICBtbTQsICAgICAgICBtbTUKLQotCi0KLSAgICAgICAgOyBtbTEgPSBtYXNrLCBtbTA9cTAsICBtbTcgPSB0aHJlc2gsIHQwID0gYWJzKHEwLXExKSB0MSA9IGFicyhwMS1wMCkKLSAgICAgICAgOyBtbTYgPSBwMCwgbW00PWhldgotICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycwotICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtyc2krMipyYXhdICAgICAgOyBwMQotICAgICAgICBtb3ZxICAgICAgICBtbTcsIFtyZGldICAgICAgICAgICAgOyBxMQotICAgICAgICBweG9yICAgICAgICBtbTIsIFtHTE9CQUwodDgwKV0gICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgW0dMT0JBTCh0ODApXSAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHN1YnNiICAgICAgbW0yLCBtbTcgICAgICAgICAgICAgIDsgcDEgLSBxMQotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgbW0wLCBbR0xPQkFMKHQ4MCldICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBwc3Vic2IgICAgICBtbTAsIG1tNiAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IDEgKiAocTAgLSBwMCkgKyAocDEgLSBxMSkKLSAgICAgICAgcGFkZHNiICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgIDsgMiAqIChxMCAtIHAwKQotICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyAzICogKHEwIC0gcDApICsgKHAxIC0gcTEpCi0gICAgICAgIHBhbmQgICAgICAgIG1tMSwgbW0yICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLQotICAgICAgICA7IG1tMSA9IHZwOF9maWx0ZXIsIG1tND1oZXYsIG1tNj1wczAsIG1tMz1xczAKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTEgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlcgotICAgICAgICBwYW5kICAgICAgICBtbTIsIG1tNDsgICAgICAgICAgICAgOyBGaWx0ZXIyID0gdnA4X2ZpbHRlciAmIGhldgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICA7Ci0gICAgICAgIHBhZGRzYiAgICAgIG1tNSwgICAgICAgIFtHTE9CQUwodDMpXTsKLQotICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgOyAwCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICA7IDAKLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNSAgICAgICAgICAgICAgOyBlMGYwZzBoMAotICAgICAgICBwc3JhdyAgICAgICBtbTAsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgcHVucGNraGJ3ICAgbW03LCBtbTUgICAgICAgICAgICAgIDsgYTBiMGMwZDAKLSAgICAgICAgcHNyYXcgICAgICAgbW03LCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCi0gICAgICAgIHBhY2tzc3diICAgIG1tMCwgbW03ICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49MzsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgOyBGaWx0ZXIyCi0KLSAgICAgICAgcGFkZHNiICAgICAgbW0yLCBbR0xPQkFMKHQ0KV0gICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyA0KQotICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgOyAwCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICA7IDAKLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tMiAgICAgICAgICAgICAgOyBlMGYwZzBoMAotICAgICAgICBwc3JhdyAgICAgICBtbTAsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgcHVucGNraGJ3ICAgbW03LCBtbTIgICAgICAgICAgICAgIDsgYTBiMGMwZDAKLSAgICAgICAgcHNyYXcgICAgICAgbW03LCAxMSAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCi0gICAgICAgIHBhY2tzc3diICAgIG1tMCwgbW03ICAgICAgICAgICAgICA7IEZpbHRlcjIgPj49MzsKLQotICAgICAgICA7IG1tMD0gZmlsdGVyMiBtbTEgPSB2cDhfZmlsdGVyLCAgbW0zID1xczAgbW01PXMgbW00ID1oZXYgbW02PXBzMAotICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxczAgPXFzMCAtIGZpbHRlcjEKLSAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgcHMwID1wczAgKyBGaXRsZXIyCi0KLSAgICAgICAgOyBtbTE9dnA4X2ZpbHRlciwgbW0zPXFzMCwgbW00ID1oZXYgbW02PXBzMAotICAgICAgICA7IHZwOF9maWx0ZXIgJj0gfmhldjsKLSAgICAgICAgOyBGaWx0ZXIyID0gdnA4X2ZpbHRlcjsKLSAgICAgICAgcGFuZG4gICAgICAgbW00LCBtbTEgICAgICAgICAgICAgIDsgdnA4X2ZpbHRlciY9fmhldgotCi0KLSAgICAgICAgOyBtbTM9cXMwLCBtbTQ9ZmlsdGVyMiwgbW02PXBzMAotCi0gICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpPj43KTsKLSAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpOwotICAgICAgICA7ICpvcTAgPSBzXjB4ODA7Ci0gICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyB1KTsKLSAgICAgICAgOyAqb3AwID0gc14weDgwOwotICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMAotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMSwgbW0xCi0gICAgICAgIHB4b3IgICAgICAgIG1tMiwgbW0yCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW00Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW00Ci0gICAgICAgIHBtdWxodyAgICAgIG1tMSwgW0dMT0JBTChzMjcpXQotICAgICAgICBwbXVsaHcgICAgICBtbTIsIFtHTE9CQUwoczI3KV0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCBbR0xPQkFMKHM2MyldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgW0dMT0JBTChzNjMpXQotICAgICAgICBwc3JhdyAgICAgICBtbTEsIDcKLSAgICAgICAgcHNyYXcgICAgICAgbW0yLCA3Ci0gICAgICAgIHBhY2tzc3diICAgIG1tMSwgbW0yCi0KLSAgICAgICAgcHN1YnNiICAgICAgbW0zLCBtbTEKLSAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTEKLQotICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4XSwgbW02Ci0gICAgICAgIG1vdnEgICAgICAgIFtyc2ldLCAgICAgbW0zCi0KLSAgICAgICAgOyByb3VnaGx5IDIvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5Ci0gICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMTgpPj43KTsKLSAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUpOwotICAgICAgICA7ICpvcTEgPSBzXjB4ODA7Ci0gICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB1KTsKLSAgICAgICAgOyAqb3AxID0gc14weDgwOwotICAgICAgICBweG9yICAgICAgICBtbTEsIG1tMQotICAgICAgICBweG9yICAgICAgICBtbTIsIG1tMgotICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNAotICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNAotICAgICAgICBwbXVsaHcgICAgICBtbTEsIFtHTE9CQUwoczE4KV0KLSAgICAgICAgcG11bGh3ICAgICAgbW0yLCBbR0xPQkFMKHMxOCldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMSwgW0dMT0JBTChzNjMpXQotICAgICAgICBwYWRkdyAgICAgICBtbTIsIFtHTE9CQUwoczYzKV0KLSAgICAgICAgcHNyYXcgICAgICAgbW0xLCA3Ci0gICAgICAgIHBzcmF3ICAgICAgIG1tMiwgNwotICAgICAgICBwYWNrc3N3YiAgICBtbTEsIG1tMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgW3JkaV0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcnNpK3JheCoyXSAgICAgICA7IHAxCi0KLSAgICAgICAgcHhvciAgICAgICAgbW0zLCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXQotCi0gICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0xCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0xCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgbW0zCi0gICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4KjJdLCBtbTYKLQotICAgICAgICA7IHJvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKLSAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiA5KT4+Nyk7Ci0gICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczIgLSB1KTsKLSAgICAgICAgOyAqb3EyID0gc14weDgwOwotICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMyICsgdSk7Ci0gICAgICAgIDsgKm9wMiA9IHNeMHg4MDsKLSAgICAgICAgcHhvciAgICAgICAgbW0xLCBtbTEKLSAgICAgICAgcHhvciAgICAgICAgbW0yLCBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTQKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTQKLSAgICAgICAgcG11bGh3ICAgICAgbW0xLCBbR0xPQkFMKHM5KV0KLSAgICAgICAgcG11bGh3ICAgICAgbW0yLCBbR0xPQkFMKHM5KV0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCBbR0xPQkFMKHM2MyldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgW0dMT0JBTChzNjMpXQotICAgICAgICBwc3JhdyAgICAgICBtbTEsIDcKLSAgICAgICAgcHNyYXcgICAgICAgbW0yLCA3Ci0gICAgICAgIHBhY2tzc3diICAgIG1tMSwgbW0yCi0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTYsIFtyZGkrcmF4KjRdCi0gICAgICAgIG5lZyAgICAgICAgIHJheAotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZGkrcmF4ICBdCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQotCi0gICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0xCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0xCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JheCAgXSwgbW0zCi0gICAgICAgIG5lZyAgICAgICAgIHJheAotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JheCo0XSwgbW02Ci0KLTtFQVJMWV9CUkVBS19PVVQ6Ci0gICAgICAgIG5lZyAgICAgICAgIHJheAotICAgICAgICBhZGQgICAgICAgICByc2ksOAotICAgICAgICBkZWMgICAgICAgICByY3gKLSAgICAgICAgam56ICAgICAgICAgbmV4dDhfbWJoCi0KLSAgICBhZGQgcnNwLCAzMgotICAgIHBvcCByc3AKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCi07ICAgIGNvbnN0IGNoYXIgKmZsaW1pdCwKLTsgICAgY29uc3QgY2hhciAqbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgKnRocmVzaCwKLTsgICAgaW50IGNvdW50Ci07KQotZ2xvYmFsIHN5bSh2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCkKLXN5bSh2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgIHJzcCwgOTYgICAgICA7IHJlc2VydmUgOTYgYnl0ZXMKLSAgICAlZGVmaW5lIHQwICAgW3JzcCArIDBdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MFs4XTsKLSAgICAlZGVmaW5lIHQxICAgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVs4XTsKLSAgICAlZGVmaW5lIHNyY3QgW3JzcCArIDMyXSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciBzcmN0WzY0XTsKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsX3N0ZXAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheCo0IC0gNF0KLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtjb3VudAotbmV4dDhfbWJ2OgotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcnNpICsgcmF4XSAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZwotCi0gICAgICAgIDt0cmFuc3Bvc2UKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JkaSsyKnJheF0gICAgICAgICAgICAgICAgIDsgNzcgNzYgNzUgNzQgNzMgNzIgNzEgNzAKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgW3JzaSsyKnJheF0gICAgICAgICAgICAgICAgIDsgNjcgNjYgNjUgNjQgNjMgNjIgNjEgNjAKLQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NyA3NiA3NSA3NCA3MyA3MiA3MSA3MAotICAgICAgICBwdW5wY2toYncgICBtbTcsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NyA2NyA3NiA2NiA3NSA2NSA3NCA2NAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDcyIDYyIDcxIDYxIDcwIDYwCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIFtyc2krcmF4XSAgICAgICAgICAgICAgICAgICA7IDU3IDU2IDU1IDU0IDUzIDUyIDUxIDUwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JzaV0gICAgICAgICAgICAgICAgICAgICAgIDsgNDcgNDYgNDUgNDQgNDMgNDIgNDEgNDAKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNDcgNDYgNDUgNDQgNDMgNDIgNDEgNDAKLQotICAgICAgICBwdW5wY2toYncgICBtbTUsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyA1NyA0NyA1NiA0NiA1NSA0NSA1NCA0NAotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IDU3IDQ3IDU2IDQ2IDU1IDQ1IDU0IDQ0Ci0gICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IDc3IDY3IDU3IDQ3IDc2IDY2IDU2IDQ2Ci0KLSAgICAgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzUgNjUgNTUgNDUgNzQgNjQgNTQgNDQKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAKLQotICAgICAgICBwdW5wY2tod2QgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MgotICAgICAgICBwdW5wY2tsd2QgICBtbTIsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSA3MCA2MCA1MCA0MAotCi0gICAgICAgIG5lZyAgICAgICAgIHJheAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIFtyc2krcmF4XSAgICAgICAgICAgICAgICAgICA7IDM3IDM2IDM1IDM0IDMzIDMyIDMxIDMwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIFtyc2krcmF4KjJdICAgICAgICAgICAgICAgICA7IDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMjcgMjYgMjUgMjQgMjMgMjIgMjEgMjAKLSAgICAgICAgcHVucGNraGJ3ICAgbW02LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzcgMjcgMzYgMzYgMzUgMjUgMzQgMjQKLQotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIFtyc2krcmF4KjRdOyAgICAgICAgICAgICAgICA7IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0gICAgICAgIHB1bnBja2hidyAgIG1tNywgICAgICAgIFtyZGkrcmF4KjRdICAgICAgICAgICAgICAgICA7IDE3IDA3IDE2IDA2IDE1IDA1IDE0IDA0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMTcgMDcgMTYgMDYgMTUgMDUgMTQgMDQKLSAgICAgICAgcHVucGNraHdkICAgbW03LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzcgMjcgMTcgMDcgMzYgMjYgMTYgMDYKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTAsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyAzNSAyNSAxNSAwNSAzNCAyNCAxNCAwNAotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyAzNyAyNyAxNyAwNyAzNiAyNiAxNiAwNgotCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IDc3IDY3IDU3IDQ3IDM3IDI3IDE3IDA3ICA9IHEzCi0gICAgICAgIHB1bnBja2xkcSAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2ICA9IHEyCi0KLSAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgc3JjdAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NiA2NiA1NiA0NiAzNiAyNiAxNiAwNgotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHgrNTZdLCAgIG1tNwotICAgICAgICBwc3VidXNiICAgICBtbTUsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMi1xMwotCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkeCs0OF0sICAgbW02Ci0gICAgICAgIHBzdWJ1c2IgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IHEzLXEyCi0KLSAgICAgICAgcG9yICAgICAgICAgbW03LCAgICAgICAgbW01OyAgICAgICAgICAgICAgICAgICAgICAgIDsgbW03PWFicyAocTMtcTIpCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDM1IDI1IDE1IDA1IDM0IDI0IDE0IDA0Ci0KLSAgICAgICAgcHVucGNraGRxICAgbW01LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzUgNjUgNTUgNDUgMzUgMjUgMTUgMDUgPSBxMQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyA3NCA2NCA1NCA0NCAzNCAyNCAxNSAwNCA9IHEwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzUgNjUgNTUgNDUgMzUgMjUgMTUgMDUgPSBxMQotICAgICAgICBwc3VidXNiICAgICBtbTMsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMS1xMgotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHEyLXExCi0gICAgICAgIHBvciAgICAgICAgIG1tNiwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tNj1hYnMocTItcTEpCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkeCs0MF0sICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBxMQotICAgICAgICBtb3ZxICAgICAgICBbcmR4KzMyXSwgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHEwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgW3JzaStyYXgqNF0gICAgICAgICAgICAgICAgIDsgMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgW3JkaStyYXgqNF0gICAgICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAotICAgICAgICBwdW5wY2tsd2QgICBtbTAsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAotCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAgID1wMwotICAgICAgICBwdW5wY2toZHEgICBtbTEsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSAgPXAyCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkeF0sICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBwMwotICAgICAgICBtb3ZxICAgICAgICBbcmR4KzhdLCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIHAyCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgID1wMgotICAgICAgICBwc3VidXNiICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMi1wMwotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzLXAyCi0gICAgICAgIHBvciAgICAgICAgIG1tMCwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMD1hYnMocDMtcDIpCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIKLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIgPSBwMQotCi0gICAgICAgIHB1bnBja2hkcSAgIG1tMywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzID0gcDAKLSAgICAgICAgbW92cSAgICAgICAgW3JkeCsyNF0sICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSBwMAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHgrMTZdLCAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgcDEKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW01ID0gcDEKLQotICAgICAgICBwc3VidXNiICAgICBtbTIsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMS1wMgotICAgICAgICBwc3VidXNiICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMi1wMQotCi0gICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMT1hYnMocDItcDEpCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygzKSA7bGltaXQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcmR4XSAgICAgICAgICAgICAgICAgICAgICAgOyBtbTQgPSBsaW1pdAotICAgICAgICBwc3VidXNiICAgICBtbTcsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTMtcTIpID4gbGltaXQKLQotICAgICAgICBwc3VidXNiICAgICBtbTAsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDMtcDIpID4gbGltaXQKLSAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAyLXAxKSA+IGxpbWl0Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgbW02LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHEyLXExKSA+IGxpbWl0Ci0gICAgICAgIHBvciAgICAgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IG9yCi0KLSAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHEzLXEyKSA+IGxpbWl0IHx8IGFicyhwMy1wMikgPiBsaW1pdCB8fGFicyhwMi1wMSkgPiBsaW1pdCB8fCBhYnMocTItcTEpID4gbGltaXQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMz1tbTc9cDAKLSAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDAgLSBwMQotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxIC0gcDAKLSAgICAgICAgcG9yICAgICAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxLXAwKQotCi0gICAgICAgIG1vdnEgICAgICAgIHQwLCAgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhdmUgYWJzKHAxLXAwKQotICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICBzcmN0Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW01ID0gYWJzKHAxLXAwKSA+IGxpbWl0Ci0gICAgICAgIHBvciAgICAgICAgIG1tMCwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMD1tYXNrCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgW3JkeCszMl0gICAgICAgICAgICAgICAgICAgIDsgbW01PXEwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIFtyZHgrNDBdICAgICAgICAgICAgICAgICAgICA7IG1tNz1xMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tNj1xMAotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMQotICAgICAgICBwc3VidXNiICAgICBtbTUsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMC1xMQotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IHExLXEwCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMS1xMCkKLQotICAgICAgICBtb3ZxICAgICAgICB0MSwgICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGFicyhxMS1xMCkKLSAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW03PWFicyhxMS1xMCk+IGxpbWl0Ci0KLSAgICAgICAgcG9yICAgICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbWFzawotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IHExCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICA7IHExLT1wMQotICAgICAgICBwc3VidXNiICAgICBtbTEsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMS09cTEKLSAgICAgICAgcG9yICAgICAgICAgbW01LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKQotICAgICAgICBwYW5kICAgICAgICBtbTUsICAgICAgICBbR0xPQkFMKHRmZSldICAgICAgICAgICAgICAgOyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCi0gICAgICAgIHBzcmx3ICAgICAgIG1tNSwgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygyKSA7ZmxpbWl0ICAgICAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBbcmR4XSAgICAgICAgICAgICAgICAgICAgICAgO2ZsaW1pdCAgbW0yCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IG1tMT1tbTM9cDAKLQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTc9bW02PXEwCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwLXEwCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtcDAKLSAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHEwLXAwKQotICAgICAgICBwYWRkdXNiICAgICBtbTEsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocTAtcDApKjIKLSAgICAgICAgcGFkZHVzYiAgICAgbW0xLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgotCi0gICAgICAgIHBhZGRiICAgICAgIG1tMiwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICA7IGZsaW1pdCoyIChsZXNzIHRoYW4gMjU1KQotICAgICAgICBwYWRkYiAgICAgICBtbTQsICAgICAgICBtbTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQgKGxlc3MgdGhhbiAyNTUpCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBmbGltaXQgKiAyICsgbGltaXQKLSAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICAgICAgbW0wOyAgICAgICAgICAgICAgICAgICAgICAgIDsgbWFzawotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMAotICAgICAgICBwY21wZXFiICAgICBtbTEsICAgICAgICBtbTAKLQotICAgICAgICA7IGNhbGN1bGF0ZSBoaWdoIGVkZ2UgdmFyaWFuY2UKLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDQpIDt0aHJlc2ggICAgICAgICAgICA7IGdldCB0aHJlc2gKLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JkeF0KLSAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICB0MCAgICAgICAgICAgICAgOyBnZXQgYWJzIChxMSAtIHEwKQotICAgICAgICBwc3VidXNiICAgICBtbTQsICAgICAgICBtbTcgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2gKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICB0MSAgICAgICAgICAgICAgOyBnZXQgYWJzIChwMSAtIHAwKQotICAgICAgICBwc3VidXNiICAgICBtbTMsICAgICAgICBtbTcgICAgICAgICAgICAgOyBhYnMocDEgLSBwMCk+IHRocmVzaAotCi0gICAgICAgIHBvciAgICAgICAgIG1tNCwgICAgICAgIG1tMyAgICAgICAgICAgICA7IGFicyhxMSAtIHEwKSA+IHRocmVzaCB8fCBhYnMocDEgLSBwMCkgPiB0aHJlc2gKLSAgICAgICAgcGNtcGVxYiAgICAgbW00LCAgICAgICAgbW0wCi0KLSAgICAgICAgcGNtcGVxYiAgICAgbW0wLCAgICAgICAgbW0wCi0gICAgICAgIHB4b3IgICAgICAgIG1tNCwgICAgICAgIG1tMAotCi0KLQotCi0gICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIHNyY3QKLQotICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycwotICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtyZHgrMTZdICAgICAgICAgOyBwMQotICAgICAgICBtb3ZxICAgICAgICBtbTcsIFtyZHgrNDBdICAgICAgICAgOyBxMQotICAgICAgICBweG9yICAgICAgICBtbTIsIFtHTE9CQUwodDgwKV0gICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgW0dMT0JBTCh0ODApXSAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHN1YnNiICAgICAgbW0yLCBtbTcgICAgICAgICAgICAgIDsgcDEgLSBxMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JkeCsyNF0gICAgICAgICA7IHAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JkeCszMl0gICAgICAgICA7IHEwCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgbW0wLCBbR0xPQkFMKHQ4MCldICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHEwCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMCwgbW02ICAgICAgICAgICAgICA7IHEwIC0gcDAKLSAgICAgICAgcGFkZHNiICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgIDsgMSAqIChxMCAtIHAwKSArIChwMSAtIHExKQotICAgICAgICBwYWRkc2IgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgOyAyICogKHEwIC0gcDApCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IDMgKiAocTAgLSBwMCkgKyAocDEgLSBxMSkKLSAgICAgICAgcGFuZCAgICAgICBtbTEsIG1tMiAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAotCi0gICAgICAgIDsgbW0xID0gdnA4X2ZpbHRlciwgbW00PWhldiwgbW02PXBzMCwgbW0zPXFzMAotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMSAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyCi0gICAgICAgIHBhbmQgICAgICAgIG1tMiwgbW00OyAgICAgICAgICAgICA7IEZpbHRlcjIgPSB2cDhfZmlsdGVyICYgaGV2Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0yICAgICAgIDsKLSAgICAgICAgcGFkZHNiICAgICAgbW01LCAgICAgICAgW0dMT0JBTCh0MyldOwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgICA7IDAKLSAgICAgICAgcHhvciAgICAgICAgbW03LCBtbTcgICAgICAgICAgICAgIDsgMAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW01ICAgICAgICAgICAgICA7IGUwZjBnMGgwCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgMTEgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotICAgICAgICBwdW5wY2toYncgICBtbTcsIG1tNSAgICAgICAgICAgICAgOyBhMGIwYzBkMAotICAgICAgICBwc3JhdyAgICAgICBtbTcsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgcGFja3Nzd2IgICAgbW0wLCBtbTcgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0zOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICA7IEZpbHRlcjIKLQotICAgICAgICBwYWRkc2IgICAgICBtbTIsIFtHTE9CQUwodDQpXSAgICAgOyB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoRmlsdGVyMiArIDQpCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgICA7IDAKLSAgICAgICAgcHhvciAgICAgICAgbW03LCBtbTcgICAgICAgICAgICAgIDsgMAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW0yICAgICAgICAgICAgICA7IGUwZjBnMGgwCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgMTEgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotICAgICAgICBwdW5wY2toYncgICBtbTcsIG1tMiAgICAgICAgICAgICAgOyBhMGIwYzBkMAotICAgICAgICBwc3JhdyAgICAgICBtbTcsIDExICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgcGFja3Nzd2IgICAgbW0wLCBtbTcgICAgICAgICAgICAgIDsgRmlsdGVyMiA+Pj0zOwotCi0gICAgICAgIDsgbW0wPSBmaWx0ZXIyIG1tMSA9IHZwOF9maWx0ZXIsICBtbTMgPXFzMCBtbTU9cyBtbTQgPWhldiBtbTY9cHMwCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0wICAgICAgICAgICAgICA7IHFzMCA9cXMwIC0gZmlsdGVyMQotICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBwczAgPXBzMCArIEZpdGxlcjIKLQotICAgICAgICA7IG1tMT12cDhfZmlsdGVyLCBtbTM9cXMwLCBtbTQgPWhldiBtbTY9cHMwCi0gICAgICAgIDsgdnA4X2ZpbHRlciAmPSB+aGV2OwotICAgICAgICA7IEZpbHRlcjIgPSB2cDhfZmlsdGVyOwotICAgICAgICBwYW5kbiAgICAgICBtbTQsIG1tMSAgICAgICAgICAgICAgOyB2cDhfZmlsdGVyJj1+aGV2Ci0KLQotICAgICAgICA7IG1tMz1xczAsIG1tND1maWx0ZXIyLCBtbTY9cHMwCi0KLSAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAyNyk+PjcpOwotICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMwIC0gdSk7Ci0gICAgICAgIDsgKm9xMCA9IHNeMHg4MDsKLSAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMCArIHUpOwotICAgICAgICA7ICpvcDAgPSBzXjB4ODA7Ci0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgbW0wCi0KLSAgICAgICAgcHhvciAgICAgICAgbW0xLCBtbTEKLSAgICAgICAgcHhvciAgICAgICAgbW0yLCBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTQKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTQKLSAgICAgICAgcG11bGh3ICAgICAgbW0xLCBbR0xPQkFMKHMyNyldCi0gICAgICAgIHBtdWxodyAgICAgIG1tMiwgW0dMT0JBTChzMjcpXQotICAgICAgICBwYWRkdyAgICAgICBtbTEsIFtHTE9CQUwoczYzKV0KLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCBbR0xPQkFMKHM2MyldCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMSwgNwotICAgICAgICBwc3JhdyAgICAgICBtbTIsIDcKLSAgICAgICAgcGFja3Nzd2IgICAgbW0xLCBtbTIKLQotICAgICAgICBwc3Vic2IgICAgICBtbTMsIG1tMQotICAgICAgICBwYWRkc2IgICAgICBtbTYsIG1tMQotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQotICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0KLSAgICAgICAgbW92cSAgICAgICAgW3JkeCsyNF0sIG1tNgotICAgICAgICBtb3ZxICAgICAgICBbcmR4KzMyXSwgbW0zCi0KLSAgICAgICAgOyByb3VnaGx5IDIvN3RoIGRpZmZlcmVuY2UgYWNyb3NzIGJvdW5kYXJ5Ci0gICAgICAgIDsgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMTgpPj43KTsKLSAgICAgICAgOyBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUpOwotICAgICAgICA7ICpvcTEgPSBzXjB4ODA7Ci0gICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgKyB1KTsKLSAgICAgICAgOyAqb3AxID0gc14weDgwOwotICAgICAgICBweG9yICAgICAgICBtbTEsIG1tMQotICAgICAgICBweG9yICAgICAgICBtbTIsIG1tMgotICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNAotICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNAotICAgICAgICBwbXVsaHcgICAgICBtbTEsIFtHTE9CQUwoczE4KV0KLSAgICAgICAgcG11bGh3ICAgICAgbW0yLCBbR0xPQkFMKHMxOCldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMSwgW0dMT0JBTChzNjMpXQotICAgICAgICBwYWRkdyAgICAgICBtbTIsIFtHTE9CQUwoczYzKV0KLSAgICAgICAgcHNyYXcgICAgICAgbW0xLCA3Ci0gICAgICAgIHBzcmF3ICAgICAgIG1tMiwgNwotICAgICAgICBwYWNrc3N3YiAgICBtbTEsIG1tMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgW3JkeCArIDQwXQotICAgICAgICBtb3ZxICAgICAgICBtbTYsIFtyZHggKyAxNl0gICAgICAgOyBwMQotICAgICAgICBweG9yICAgICAgICBtbTMsIFtHTE9CQUwodDgwKV0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCi0KLSAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTEKLSAgICAgICAgcHN1YnNiICAgICAgbW0zLCBtbTEKLQotICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0KLSAgICAgICAgcHhvciAgICAgICAgbW0zLCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIG1vdnEgICAgICAgIFtyZHggKyA0MF0sIG1tMwotICAgICAgICBtb3ZxICAgICAgICBbcmR4ICsgMTZdLCBtbTYKLQotICAgICAgICA7IHJvdWdobHkgMS83dGggZGlmZmVyZW5jZSBhY3Jvc3MgYm91bmRhcnkKLSAgICAgICAgOyB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiA5KT4+Nyk7Ci0gICAgICAgIDsgcyA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczIgLSB1KTsKLSAgICAgICAgOyAqb3EyID0gc14weDgwOwotICAgICAgICA7IHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMyICsgdSk7Ci0gICAgICAgIDsgKm9wMiA9IHNeMHg4MDsKLSAgICAgICAgcHhvciAgICAgICAgbW0xLCBtbTEKLSAgICAgICAgcHhvciAgICAgICAgbW0yLCBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTQKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTQKLSAgICAgICAgcG11bGh3ICAgICAgbW0xLCBbR0xPQkFMKHM5KV0KLSAgICAgICAgcG11bGh3ICAgICAgbW0yLCBbR0xPQkFMKHM5KV0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCBbR0xPQkFMKHM2MyldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgW0dMT0JBTChzNjMpXQotICAgICAgICBwc3JhdyAgICAgICBtbTEsIDcKLSAgICAgICAgcHNyYXcgICAgICAgbW0yLCA3Ci0gICAgICAgIHBhY2tzc3diICAgIG1tMSwgbW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmR4KyA4XQotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyZHgrNDhdCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgW0dMT0JBTCh0ODApXQotCi0gICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0xCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMywgbW0xCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgICAgICAgIDsgbW02ID0gNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEKLSAgICAgICAgcHhvciAgICAgICAgbW0zLCBbR0xPQkFMKHQ4MCldICAgICAgICAgIDsgbW0zID0gNzYgNjYgNTYgNDYgMzYgMjYgMTUgMDYKLQotICAgICAgICA7IHRyYW5wb3NlIGFuZCB3cml0ZSBiYWNrCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW3JkeF0gICAgICAgICAgICAgICA7IG1tMCA9IDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgbW0wICAgICAgICAgICAgICAgICA7IG1tMCA9IDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTYgICAgICAgICAgICAgICAgIDsgbW0wID0gMzEgMzAgMjEgMjAgMTEgMTAgMDEgMDAKLSAgICAgICAgcHVucGNraGJ3ICAgbW0xLCAgICBtbTYgICAgICAgICAgICAgICAgIDsgbW0zID0gNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAKLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIFtyZHgrMTZdICAgICAgICAgICAgOyBtbTIgPSA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIG1tMiAgICAgICAgICAgICAgICAgOyBtbTMgPSA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMiwgICAgW3JkeCsyNF0gICAgICAgICAgICA7IG1tMiA9IDMzIDMyIDIzIDIyIDEzIDEyIDAzIDAyCi0gICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgW3JkeCsyNF0gICAgICAgICAgICA7IG1tMyA9IDczIDcyIDYzIDYyIDUzIDUyIDQzIDQyCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBtbTAgICAgICAgICAgICAgICAgIDsgbW01ID0gMzEgMzAgMjEgMjAgMTEgMTAgMDEgMDAKLSAgICAgICAgcHVucGNrbHdkICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW0wID0gMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLQotICAgICAgICBwdW5wY2tod2QgICBtbTUsICAgIG1tMiAgICAgICAgICAgICAgICAgOyBtbTUgPSAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMAotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMSAgICAgICAgICAgICAgICAgOyBtbTQgPSA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MAotCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgbW02ICAgICAgICAgICAgICAgICA7IG1tMSA9IDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICA7IG1tNCA9IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBbcmR4KzMyXSAgICAgICAgICAgIDsgbW0yID0gNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICBbcmR4KzQwXSAgICAgICAgICAgIDsgbW0yID0gMzUgMzQgMjUgMjQgMTUgMTQgMDUgMDQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIG1tMyAgICAgICAgICAgICAgICAgOyBtbTYgPSA3NiA2NiA1NiA0NiAzNiAyNiAxNSAwNgotICAgICAgICBwdW5wY2tsYncgICBtbTYsICAgIFtyZHgrNTZdICAgICAgICAgICAgOyBtbTYgPSAzNyAzNiAyNyAyNiAxNyAxNiAwNyAwNgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgbW0yICAgICAgICAgICAgICAgICA7IG1tNyA9IDM1IDM0IDI1IDI0IDE1IDE0IDA1IDA0Ci0gICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgbW02ICAgICAgICAgICAgICAgICA7IG1tMiA9IDE3IDE2IDE1IDE0IDA3IDA2IDA1IDA0Ci0KLSAgICAgICAgcHVucGNraHdkICAgbW03LCAgICBtbTYgICAgICAgICAgICAgICAgIDsgbW03ID0gMzcgMzYgMzUgMzQgMjcgMjYgMjUgMjQKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBtbTAgICAgICAgICAgICAgICAgIDsgbW02ID0gMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgIG1tMiAgICAgICAgICAgICAgICAgOyBtbTAgPSAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotICAgICAgICBwdW5wY2toZHEgICBtbTYsICAgIG1tMiAgICAgICAgICAgICAgICAgOyBtbTYgPSAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4KjRdLCBtbTAgICAgICAgICAgICA7IHdyaXRlIG91dAotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JheCo0XSwgbW02ICAgICAgICAgICAgOyB3cml0ZSBvdXQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgOyBtbTAgPSAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMAotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgOyBtbTAgPSAyNyAyNiAyNSAyNCAyMyAyMiAyMCAyMAotCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNSwgICAgbW03ICAgICAgICAgICAgICAgICA7IG1tNSA9IDM3IDM2IDM1IDM0IDMzIDMyIDMxIDMwCi0gICAgICAgIG1vdnEgICAgICAgIFtyc2krcmF4KjJdLCBtbTAgICAgICAgICAgICA7IHdyaXRlIG91dAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmF4KjJdLCBtbTUgICAgICAgICAgICA7IHdyaXRlIG91dAotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIFtyZHgrMzJdICAgICAgICAgICAgOyBtbTIgPSA3NCA2NCA1NCA0NCAzNCAyNCAxNCAwNAotCi0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgICAgW3JkeCs0MF0gICAgICAgICAgICA7IG1tMiA9IDc1IDc0IDY1IDY0IDU0IDU0IDQ1IDQ0Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgW3JkeCs1Nl0gICAgICAgICAgICA7IG1tMyA9IDc3IDc2IDY3IDY2IDU3IDU2IDQ3IDQ2Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW01ID0gNzUgNzQgNjUgNjQgNTQgNTQgNDUgNDQKLSAgICAgICAgcHVucGNrbHdkICAgbW0yLCAgICBtbTMgICAgICAgICAgICAgICAgIDsgbW0yID0gNTcgNTYgNTUgNTQgNDcgNDYgNDUgNDQKLQotICAgICAgICBwdW5wY2tod2QgICBtbTUsICAgIG1tMyAgICAgICAgICAgICAgICAgOyBtbTUgPSA3NyA3NiA3NSA3NCA2NyA2NiA2NSA2NAotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAgICAgOyBtbTA9ICA1MyA1MiA1MSA1MCA0MyA0MiA0MSA0MAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgbW00ICAgICAgICAgICAgICAgICA7IG1tNCA9IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICA7IG1tMCA9IDQ3IDQ2IDQ1IDQ0IDQzIDQyIDQxIDQwCi0KLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICBtbTIgICAgICAgICAgICAgICAgIDsgbW0xID0gNTcgNTYgNTUgNTQgNTMgNTIgNTEgNTAKLSAgICAgICAgbW92cSAgICAgICAgW3JzaV0sICBtbTAgICAgICAgICAgICAgICAgIDsgd3JpdGUgb3V0Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICBtbTEgICAgICAgICAgICAgICAgIDsgd3JpdGUgb3V0Ci0gICAgICAgIG5lZyAgICAgICAgIHJheAotCi0gICAgICAgIHB1bnBja2xkcSAgIG1tMywgICAgbW01ICAgICAgICAgICAgICAgICA7IG1tMyA9IDY3IDY2IDY1IDY0IDYzIDYyIDYxIDYwCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNCwgICAgbW01ICAgICAgICAgICAgICAgICA7IG1tNCA9IDc3IDc2IDc1IDc0IDczIDcyIDcxIDYwCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JzaStyYXgqMl0sIG1tMwotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JheCoyXSwgbW00Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqOF0KLSAgICAgICAgZGVjICAgICAgICAgcmN4Ci0KLSAgICAgICAgam56ICAgICAgICAgbmV4dDhfbWJ2Ci0KLSAgICBhZGQgcnNwLCA5NgotICAgIHBvcCByc3AKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14Ci07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19waXhlbF9zdGVwLAotOyAgICBjb25zdCBjaGFyICpmbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgKmxpbWl0LAotOyAgICBjb25zdCBjaGFyICp0aHJlc2gsCi07ICAgIGludCBjb3VudAotOykKLWdsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14KQotc3ltKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxfc3RlcCAgICAgOyBkZXN0aW5hdGlvbiBwaXRjaD8KLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNSkgO2NvdW50Ci1uZXh0czhfaDoKLSAgICAgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMykgO2xpbWl0Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNywgW3JkeF0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCBhcmcoMikgO2ZsaW1pdCAgICAgICAgICAgOyBnZXQgZmxpbWl0Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMywgW3JkeF0gICAgICAgICAgICA7Ci0gICAgICAgIHBhZGRiICAgICAgIG1tMywgbW0zICAgICAgICAgICAgICA7IGZsaW1pdCoyIChsZXNzIHRoYW4gMjU1KQotICAgICAgICBwYWRkYiAgICAgICBtbTMsIG1tNyAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQgKGxlc3MgdGhhbiAyNTUpCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCByc2kgICAgICAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCByYXgKLSAgICAgICAgbmVnICAgICAgICAgcmF4Ci0KLSAgICAgICAgOyBjYWxjdWxhdGUgbWFzawotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyc2krMipyYXhdICAgICAgOyBwMQotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyZGldICAgICAgICAgICAgOyBxMQotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTcsIG1tMAotICAgICAgICBtb3ZxICAgICAgICBtbTQsIG1tMAotICAgICAgICBwc3VidXNiICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgOyBxMS09cDEKLSAgICAgICAgcHN1YnVzYiAgICAgbW0xLCBtbTQgICAgICAgICAgICAgIDsgcDEtPXExCi0gICAgICAgIHBvciAgICAgICAgIG1tMSwgbW0wICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKLSAgICAgICAgcGFuZCAgICAgICAgbW0xLCBbR0xPQkFMKHRmZSldICAgIDsgc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybwotICAgICAgICBwc3JsdyAgICAgICBtbTEsIDEgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsIFtyc2krcmF4XSAgICAgICAgOyBwMAotICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2ldICAgICAgICAgICAgOyBxMAotICAgICAgICBtb3ZxICAgICAgICBtbTAsIG1tNCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBtb3ZxICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBwMAotICAgICAgICBwc3VidXNiICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBwMC09cTAKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCBtbTYgICAgICAgICAgICAgIDsgcTAtPXAwCi0gICAgICAgIHBvciAgICAgICAgIG1tNSwgbW00ICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKQotICAgICAgICBwYWRkdXNiICAgICBtbTUsIG1tNSAgICAgICAgICAgICAgOyBhYnMocDAtcTApKjIKLSAgICAgICAgcGFkZHVzYiAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgbW0zICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBmbGltaXQgKiAyICsgbGltaXQKLSAgICAgICAgcHhvciAgICAgICAgbW0zLCBtbTMKLSAgICAgICAgcGNtcGVxYiAgICAgbW01LCBtbTMKLQotICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycwotICAgICAgICBweG9yICAgICAgICBtbTIsIFtHTE9CQUwodDgwKV0gICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgW0dMT0JBTCh0ODApXSAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHN1YnNiICAgICAgbW0yLCBtbTcgICAgICAgICAgICAgIDsgcDEgLSBxMQotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgW0dMT0JBTCh0ODApXSAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgbW0wLCBbR0xPQkFMKHQ4MCldICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBwc3Vic2IgICAgICBtbTAsIG1tNiAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAxICogKHEwIC0gcDApCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAyICogKHEwIC0gcDApCi0gICAgICAgIHBhZGRzYiAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAzICogKHEwIC0gcDApCi0gICAgICAgIHBhbmQgICAgICAgIG1tNSwgbW0yICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLSAgICAgICAgOyBkbyArIDQgc2lkZQotICAgICAgICBwYWRkc2IgICAgICBtbTUsIFtHTE9CQUwodDQpXSAgICAgOyAzKiAocTAgLSBwMCkgKyAocDEgLSBxMSkgKyA0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICAgIDsgZ2V0IGEgY29weSBvZiBmaWx0ZXJzCi0gICAgICAgIHBzbGx3ICAgICAgIG1tMCwgOCAgICAgICAgICAgICAgICA7IHNoaWZ0IGxlZnQgOAotICAgICAgICBwc3JhdyAgICAgICBtbTAsIDMgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgOAotICAgICAgICBtb3ZxICAgICAgICBtbTEsIG1tNSAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKLSAgICAgICAgcHNyYXcgICAgICAgbW0xLCAxMSAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQotICAgICAgICBwc2xsdyAgICAgICBtbTEsIDggICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDggdG8gcHV0IGl0IGJhY2sKLQotICAgICAgICBwb3IgICAgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgOyBwdXQgdGhlIHR3byB0b2dldGhlciB0byBnZXQgcmVzdWx0Ci0KLSAgICAgICAgcHN1YnNiICAgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcTAtPSBxMCBhZGQKLSAgICAgICAgcHhvciAgICAgICAgbW0zLCBbR0xPQkFMKHQ4MCldICAgIDsgdW5vZmZzZXQKLSAgICAgICAgbW92cSAgICAgICAgW3JzaV0sIG1tMyAgICAgICAgICAgIDsgd3JpdGUgYmFjawotCi0KLSAgICAgICAgOyBub3cgZG8gKzMgc2lkZQotICAgICAgICBwc3Vic2IgICAgICBtbTUsIFtHTE9CQUwodDFzKV0gICAgIDsgKzMgaW5zdGVhZCBvZiArNAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgbW01ICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycwotICAgICAgICBwc2xsdyAgICAgICBtbTAsIDggICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDgKLSAgICAgICAgcHNyYXcgICAgICAgbW0wLCAzICAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQotICAgICAgICBwc3JsdyAgICAgICBtbTAsIDgKLSAgICAgICAgcHNyYXcgICAgICAgbW01LCAxMSAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQotICAgICAgICBwc2xsdyAgICAgICBtbTUsIDggICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDggdG8gcHV0IGl0IGJhY2sKLSAgICAgICAgcG9yICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICAgIDsgcHV0IHRoZSB0d28gdG9nZXRoZXIgdG8gZ2V0IHJlc3VsdAotCi0KLSAgICAgICAgcGFkZHNiICAgICAgbW02LCBtbTAgICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKLSAgICAgICAgcHhvciAgICAgICAgbW02LCBbR0xPQkFMKHQ4MCldICAgIDsgdW5vZmZzZXQKLSAgICAgICAgbW92cSAgICAgICAgW3JzaStyYXhdLCBtbTYgICAgICAgIDsgd3JpdGUgYmFjawotCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSw4Ci0gICAgICAgIG5lZyAgICAgICAgIHJheAotICAgICAgICBkZWMgICAgICAgICByY3gKLSAgICAgICAgam56ICAgICAgICAgbmV4dHM4X2gKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14Ci07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19waXhlbF9zdGVwLAotOyAgICBjb25zdCBjaGFyICpmbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgKmxpbWl0LAotOyAgICBjb25zdCBjaGFyICp0aHJlc2gsCi07ICAgIGludCBjb3VudAotOykKLWdsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCkKLXN5bSh2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKLSAgICBzdWIgICAgICAgICAgcnNwLCAzMiAgICAgIDsgcmVzZXJ2ZSAzMiBieXRlcwotICAgICVkZWZpbmUgdDAgICBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzhdOwotICAgICVkZWZpbmUgdDEgICBbcnNwICsgMTZdICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQxWzhdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsX3N0ZXAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCBbcnNpICsgcmF4KjQtIDJdOyAgOwotICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNSkgO2NvdW50Ci1uZXh0czhfdjoKLQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcnNpICsgcmF4XTsKLSAgICAgICAgbW92ZCAgICAgICAgbW0wLCAgICAgICAgW3JkaSArIHJheCAqIDJdICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDczIDcyIDcxIDcwCi0KLSAgICAgICAgbW92ZCAgICAgICAgbW02LCAgICAgICAgW3JzaSArIHJheCAqIDJdICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDYzIDYyIDYxIDYwCi0gICAgICAgIHB1bnBja2xidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA3MiA2MiA3MSA2MSA3MCA2MAotCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCA1MyA1MiA1MSA1MAotICAgICAgICBtb3ZkICAgICAgICBtbTQsICAgICAgICBbcnNpXSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggNDMgNDIgNDEgNDAKLQotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDUzIDQzIDUyIDQyIDUxIDQxIDUwIDQwCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDYxIDUxIDQxIDcwIDYwIDUwIDQwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MgotCi0gICAgICAgIG5lZyAgICAgICAgIHJheAotCi0gICAgICAgIG1vdmQgICAgICAgIG1tNywgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAzMyAzMiAzMSAzMAotICAgICAgICBtb3ZkICAgICAgICBtbTYsICAgICAgICBbcnNpICsgcmF4ICogMl0gICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMjMgMjIgMjEgMjAKLQotICAgICAgICBwdW5wY2tsYncgICBtbTYsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKLSAgICAgICAgbW92ZCAgICAgICAgbW0xLCAgICAgICAgW3JkaSArIHJheCAqIDRdICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDEzIDEyIDExIDEwCi0KLSAgICAgICAgbW92ZCAgICAgICAgbW0wLCAgICAgICAgW3JzaSArIHJheCAqIDRdICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDAzIDAyIDAxIDAwCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAotICAgICAgICBwdW5wY2tsd2QgICBtbTAsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKLQotICAgICAgICBwdW5wY2tod2QgICBtbTIsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0wLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwICAgICAgID0gcDEKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyCi0KLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxICAgICAgID0gcDAKLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyICAgICAgID0gcTAKLQotICAgICAgICBwdW5wY2toZHEgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMgICAgICAgPSBxMQotCi0KLSAgICAgICAgOyBjYWxjdWxhdGUgbWFzawotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEKLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHExCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMS09cDEKLSAgICAgICAgcHN1YnVzYiAgICAgbW02LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxLT1xMQotICAgICAgICBwb3IgICAgICAgICBtbTYsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKQotICAgICAgICBwYW5kICAgICAgICBtbTYsICAgICAgICBbR0xPQkFMKHRmZSldICAgICAgICAgICAgICAgICAgIDsgc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybwotICAgICAgICBwc3JsdyAgICAgICBtbTYsICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKS8yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMAotCi0gICAgICAgIHBzdWJ1c2IgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMC09cTAKLSAgICAgICAgcHN1YnVzYiAgICAgbW00LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwLT1wMAotCi0gICAgICAgIHBvciAgICAgICAgIG1tNSwgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKLSAgICAgICAgcGFkZHVzYiAgICAgbW01LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMC1xMCkqMgotICAgICAgICBwYWRkdXNiICAgICBtbTUsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygyKSA7ZmxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBmbGltaXQKLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgW3JkeF0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDMpICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBsaW1pdAotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgICAgICBbcmR4XQotICAgICAgICBwYWRkYiAgICAgICBtbTcsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmxpbWl0KjIgKGxlc3MgdGhhbiAyNTUpCi0gICAgICAgIHBhZGRiICAgICAgIG1tNywgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQgKGxlc3MgdGhhbiAyNTUpCi0KLSAgICAgICAgcHN1YnVzYiAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBmbGltaXQgKiAyICsgbGltaXQKLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03Ci0gICAgICAgIHBjbXBlcWIgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSBtYXNrCi0KLSAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKLSAgICAgICAgbW92cSAgICAgICAgdDAsICAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgIHQxLCAgICAgICAgIG1tMwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0KLSAgICAgICAgcHN1YnNiICAgICAgbW0wLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxIC0gcTEKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHEwCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgICAgICAgICAgICAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG9mZnNldGVkIDsgcTAKLQotICAgICAgICBwc3Vic2IgICAgICBtbTcsICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAgLSBwMAotICAgICAgICBwYWRkc2IgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMSArIDEgKiAocTAgLSBwMCkKLQotICAgICAgICBwYWRkc2IgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMSArIDIgKiAocTAgLSBwMCkKLSAgICAgICAgcGFkZHNiICAgICAgbW0wLCAgICAgICAgbW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAzICogKHEwIC0gcDApCi0KLSAgICAgICAgcGFuZCAgICAgICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLSAgICAgICAgcGFkZHNiICAgICAgbW01LCAgICAgICAgW0dMT0JBTCh0NCldICAgICAgICAgICAgICAgICAgICA7ICAzKiAocTAgLSBwMCkgKyAocDEgLSBxMSkgKyA0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycwotICAgICAgICBwc2xsdyAgICAgICBtbTAsICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4Ci0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgICAgIDgKLQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICBtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ2V0IGEgY29weSBvZiBmaWx0ZXJzCi0gICAgICAgIHBzcmF3ICAgICAgIG1tNywgICAgICAgIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzbGx3ICAgICAgIG1tNywgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDggdG8gcHV0IGl0IGJhY2sKLQotICAgICAgICBwb3IgICAgICAgICBtbTAsICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcHV0IHRoZSB0d28gdG9nZXRoZXIgdG8gZ2V0IHJlc3VsdAotCi0gICAgICAgIHBzdWJzYiAgICAgIG1tMywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMC09IHEwc3ogYWRkCi0gICAgICAgIHB4b3IgICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICAgOyB1bm9mZnNldAotCi0gICAgICAgIDsgbm93IGRvICszIHNpZGUKLSAgICAgICAgcHN1YnNiICAgICAgbW01LCBbR0xPQkFMKHQxcyldICAgICAgICAgICAgICAgICAgICAgICAgICA7ICszIGluc3RlYWQgb2YgKzQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ2V0IGEgY29weSBvZiBmaWx0ZXJzCi0gICAgICAgIHBzbGx3ICAgICAgIG1tMCwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDgKLSAgICAgICAgcHNyYXcgICAgICAgbW0wLCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEKLSAgICAgICAgcHNybHcgICAgICAgbW0wLCA4Ci0KLSAgICAgICAgcHNyYXcgICAgICAgbW01LCAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEKLSAgICAgICAgcHNsbHcgICAgICAgbW01LCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0IGxlZnQgOCB0byBwdXQgaXQgYmFjawotICAgICAgICBwb3IgICAgICAgICBtbTAsIG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcHV0IHRoZSB0d28gdG9nZXRoZXIgdG8gZ2V0IHJlc3VsdAotCi0gICAgICAgIHBhZGRzYiAgICAgIG1tNiwgbW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMCs9IHAwIGFkZAotICAgICAgICBweG9yICAgICAgICBtbTYsIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICAgICAgICAgIDsgdW5vZmZzZXQKLQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIHQwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIHQxCi0KLSAgICAgICAgOyBtbTAgPSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotICAgICAgICA7IG1tNiA9IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxCi0gICAgICAgIDsgbW0zID0gNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLSAgICAgICAgOyBtbTQgPSA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMwotICAgICAgICA7IHRyYW5zcG9zZSBiYWNrIHRvIHdyaXRlIG91dAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgICAgICAgICA7IDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCi0KLSAgICAgICAgcHVucGNraGJ3ICAgbW0xLCAgICAgICAgbW02ICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0zICAgICAgICAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICBtbTIsICAgICAgICBtbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MAotCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDcyIDYzIDYyIDUzIDUyIDQzIDQyCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgICAgICA7IDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0wLCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLSAgICAgICAgcHVucGNraHdkICAgbW02LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAKLQotICAgICAgICBtb3ZkICAgICAgICBbcnNpK3JheCo0XSwgbW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB3cml0ZSAwMyAwMiAwMSAwMAotICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTMgICAgICAgICAgICAgICAgICAgICAgICAgOyA1MyA1MiA1MSA1MCA0MyA0MiA0MSA0MAotCi0gICAgICAgIHBzcmxxICAgICAgIG1tMCwgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDEzIDEyIDExIDEwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNSwgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwCi0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaStyYXgqNF0sIG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgd3JpdGUgMTMgMTIgMTEgMTAKLSAgICAgICAgbW92ZCAgICAgICAgW3JzaStyYXgqMl0sIG1tNiAgICAgICAgICAgICAgICAgICAgICAgIDsgd3JpdGUgMjMgMjIgMjEgMjAKLQotICAgICAgICBwc3JscSAgICAgICBtbTYsICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOyAzMyAzMiAzMSAzMAotICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICBtbTEgICAgICAgICAgICAgICAgICAgICAgICAgOyB3cml0ZSA0MyA0MiA0MSA0MAotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2kgKyByYXhdLCBtbTYgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIDMzIDMyIDMxIDMwCi0gICAgICAgIG5lZyAgICAgICAgIHJheAotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2kgKyByYXgqMl0sIG1tNSAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIDYzIDYyIDYxIDYwCi0gICAgICAgIHBzcmxxICAgICAgIG1tMSwgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICA7IDUzIDUyIDUxIDUwCi0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaV0sICAgICAgbW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsgd3JpdGUgb3V0IDUzIDUyIDUxIDUwCi0gICAgICAgIHBzcmxxICAgICAgIG1tNSwgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDcyIDcxIDcwCi0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaSArIHJheCoyXSwgbW01ICAgICAgICAgICAgICAgICAgICAgIDsgd3JpdGUgNzMgNzIgNzEgNzAKLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCo4XSAgICAgICAgICAgICAgICAgOyBuZXh0IDgKLQotICAgICAgICBkZWMgICAgICAgICByY3gKLSAgICAgICAgam56ICAgICAgICAgbmV4dHM4X3YKLQotICAgIGFkZCByc3AsIDMyCi0gICAgcG9wIHJzcAotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLTt2b2lkIGZhc3RfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZXNfbW14KHVuc2lnbmVkIGNoYXIgKnlfcHRyLAotOyAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwKLTsgICAgICAgICAgICAgICAgICBsb29wX2ZpbHRlcl9pbmZvICpsZmkpCi07ewotOwotOwotOyAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14KHlfcHRyKzQsIHlfc3RyaWRlLCBsZmktPmZsaW0sbGZpLT5saW0sbGZpLT50aHIsMik7Ci07ICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9tbXgoeV9wdHIrOCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSxsZmktPmxpbSxsZmktPnRociwyKTsKLTsgICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCh5X3B0cisxMiwgeV9zdHJpZGUsIGxmaS0+ZmxpbSxsZmktPmxpbSxsZmktPnRociwyKTsKLTt9Ci0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotdGZlOgotICAgIHRpbWVzIDggZGIgMHhmZQotYWxpZ24gMTYKLXQ4MDoKLSAgICB0aW1lcyA4IGRiIDB4ODAKLWFsaWduIDE2Ci10MXM6Ci0gICAgdGltZXMgOCBkYiAweDAxCi1hbGlnbiAxNgotdDM6Ci0gICAgdGltZXMgOCBkYiAweDAzCi1hbGlnbiAxNgotdDQ6Ci0gICAgdGltZXMgOCBkYiAweDA0Ci1hbGlnbiAxNgotb25lczoKLSAgICB0aW1lcyA0IGR3IDB4MDAwMQotYWxpZ24gMTYKLXMyNzoKLSAgICB0aW1lcyA0IGR3IDB4MWIwMAotYWxpZ24gMTYKLXMxODoKLSAgICB0aW1lcyA0IGR3IDB4MTIwMAotYWxpZ24gMTYKLXM5OgotICAgIHRpbWVzIDQgZHcgMHgwOTAwCi1hbGlnbiAxNgotczYzOgotICAgIHRpbWVzIDQgZHcgMHgwMDNmCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX3NzZTIuYXNtIGIvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl9zc2UyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5MTMzZC4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX3NzZTIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTc4MCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLTsgVXNlIG9mIHBtYXh1YiBpbnN0ZWFkIG9mIHBzdWJ1c2IgdG8gY29tcHV0ZSBmaWx0ZXIgbWFzayB3YXMgc2VlbgotOyBpbiBmZnZwOAotCi0lbWFjcm8gTEZIX0ZJTFRFUl9BTkRfSEVWX01BU0sgMQotJWlmICUxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyZGkrMipyYXhdICAgICAgIDsgcTMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgW3JzaSsyKnJheF0gICAgICAgOyBxMgotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcnNpK3JheF0gICAgICAgICA7IHExCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIFtyc2ldICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgbmVnICAgICAgICAgcmF4ICAgICAgICAgICAgICAgICAgICAgOyBuZWdhdGUgcGl0Y2ggdG8gZGVhbCB3aXRoIGFib3ZlIGJvcmRlcgotJWVsc2UKLSAgICAgICAgbW92bHBzICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JzaSArIHJjeCoyXSAgICAgOyBxMwotICAgICAgICBtb3ZscHMgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4XSAgICAgICA7IHEyCi0gICAgICAgIG1vdmxwcyAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtyc2ldICAgICAgICAgICAgIDsgcTEKLSAgICAgICAgbW92bHBzICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgW3JzaSArIHJheF0gICAgICAgOyBxMAotCi0gICAgICAgIG1vdmhwcyAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyZGkgKyByY3gqMl0KLSAgICAgICAgbW92aHBzICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeF0KLSAgICAgICAgbW92aHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JkaV0KLSAgICAgICAgbW92aHBzICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJheF0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBbcnNpICsgcmF4KjRdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgICAgIFtyZGkgKyByYXgqNF0KLQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwXSwgICAgICB4bW0xICAgICAgICAgICAgICA7IHN0b3JlIHEyCi0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3AgKyAxNl0sIHhtbTQgICAgICAgICAgICAgIDsgc3RvcmUgcTEKLSVlbmRpZgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgcTIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBxMQotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcTItPXEzCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcTMtPXEyCi0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBxMS09cTIKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBxMi09cTEKLQotICAgICAgICBwb3IgICAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICA7IGFicyhxMi1xMSkKLSAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBhYnMocTMtcTIpCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBxMAotICAgICAgICBwbWF4dWIgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW00Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBxMC09cTEKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBxMS09cTAKLQotICAgICAgICBwb3IgICAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGFicyhxMC1xMSkKLSAgICAgICAgbW92ZHFhICAgICAgdDAsICAgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBzYXZlIHRvIHQwCi0KLSAgICAgICAgcG1heHViICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNQotCi0laWYgJTEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JzaSs0KnJheF0gICAgICAgOyBwMwotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcmRpKzQqcmF4XSAgICAgICA7IHAyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIFtyc2krMipyYXhdICAgICAgIDsgcDEKLSVlbHNlCi0gICAgICAgIG1vdmxwcyAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc2kgKyByYXhdICAgICAgIDsgcDMKLSAgICAgICAgbW92bHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgOyBwMgotICAgICAgICBtb3ZscHMgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4XSAgICAgICA7IHAxCi0KLSAgICAgICAgbW92aHBzICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJheF0KLSAgICAgICAgbW92aHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JkaV0KLSAgICAgICAgbW92aHBzICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeF0KLQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwICsgMzJdLCB4bW00ICAgICAgICAgICAgICA7IHN0b3JlIHAyCi0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3AgKyA0OF0sIHhtbTYgICAgICAgICAgICAgIDsgc3RvcmUgcDEKLSVlbmRpZgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgcDIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBwMQotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcDItPXAzCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgcDMtPXAyCi0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBwMS09cDIKLSAgICAgICAgcG1heHViICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBhYnMocDMgLSBwMikKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICA7IHAyLT1wMQotICAgICAgICBwbWF4dWIgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IGFicyhwMyAtIHAyKQotCi0gICAgICAgIHBtYXh1YiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgYWJzKHAyIC0gcDEpCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcDEKLQotICAgICAgICBwbWF4dWIgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGFicyhwMiAtIHAxKQotJWlmICUxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFtyc2krcmF4XSAgICAgICAgIDsgcDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgOyBxMQotJWVsc2UKLSAgICAgICAgbW92bHBzICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW3JzaSArIHJjeCoyXSAgICAgOyBwMAotICAgICAgICBtb3ZocHMgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBbcmRpICsgcmN4KjJdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHExICAgICAgICAgICAgICAgIDsgcTEKLSVlbmRpZgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgcDAKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBwMC09cDEKLQotICAgICAgICBwc3VidXNiICAgICB4bW02LCAgICAgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgICA7IHAxLT1wMAotCi0gICAgICAgIHBvciAgICAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgIDsgZ2V0IGZsaW1pdAotCi0gICAgICAgIG1vdmRxYSAgICAgICAgdDEsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgc2F2ZSB0byB0MQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgIDsgcTEKLSAgICAgICAgcG1heHViICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNgotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcTEtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgcDEtPXExCi0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNwotICAgICAgICBwb3IgICAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmR4XSA7IGZsaW1pdAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgcGFuZCAgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ZmUpXSAgICAgOyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCi0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICAgICAgYXJnKDQpICAgICAgICAgICAgOyBoZXYgZ2V0IHRocmVzaAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgcDAKLSAgICAgICAgcHNybHcgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgICA7IHAwLT1xMAotICAgICAgICBwYWRkYiAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IGZsaW1pdCoyIChsZXNzIHRoYW4gMjU1KQotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgcTAtPXAwCi0gICAgICAgIHBvciAgICAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCi0KLSAgICAgICAgcGFkZHVzYiAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBhYnMocDAtcTApKjIKLSAgICAgICAgcGFkZGIgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBmbGltaXQgKiAyICsgbGltaXQgKGxlc3MgdGhhbiAyNTUpCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgdDAgICAgICAgICAgICAgICAgOyBoZXYgZ2V0IGFicyAocTEgLSBxMCkKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB0MSAgICAgICAgICAgICAgICA7IGdldCBhYnMgKHAxIC0gcDApCi0KLSAgICAgICAgcGFkZHVzYiAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBhYnMgKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkeF0gOyBoZXYKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIgID4gZmxpbWl0ICogMiArIGxpbWl0Ci0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgaGV2Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBoZXYKLSAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFkZGIgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBoZXYgYWJzKHExIC0gcTApID4gdGhyZXNoIHx8IGFicyhwMSAtIHAwKSA+IHRocmVzaAotCi0gICAgICAgIHBjbXBlcWIgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgaGV2Ci0gICAgICAgIHBjbXBlcWIgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgIDsgaGV2Ci0KLSAgICAgICAgcGNtcGVxYiAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgOyBtYXNrIHhtbTEKLSAgICAgICAgcHhvciAgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBoZXYKLSVlbmRtYWNybwotCi0lbWFjcm8gQl9GSUxURVIgMQotJWlmICUxID09IDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgcDEgICAgICAgICAgICAgICAgOyBwMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBxMSAgICAgICAgICAgICAgICA7IHExCi0lZWxpZiAlMSA9PSAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc2krMipyYXhdICAgICAgIDsgcDEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgOyBxMQotJWVsaWYgJTEgPT0gMgotICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICAgICAgICAgICAgICBzcmN0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkeF0gICAgICAgICAgICAgOyBwMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBbcmR4KzQ4XSAgICAgICAgICA7IHExCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIFtyZHgrMTZdICAgICAgICAgIDsgcDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgW3JkeCszMl0gICAgICAgICAgOyBxMAotJWVuZGlmCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgOyBwMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotCi0gICAgICAgIHBzdWJzYiAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgIDsgcDEgLSBxMQotICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLQotICAgICAgICBwYW5kICAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgICA7IGhpZ2ggdmFyIG1hc2sgKGh2bSkocDEgLSBxMSkKLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBwc3Vic2IgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICA7IHEwIC0gcDAKLQotICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICA7IDEgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKLQotICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICA7IDIgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKLQotICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICA7IDMgKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkKLQotICAgICAgICBwYW5kICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDQpXSAgICAgIDsgMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNAotICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQzKV0gICAgICA7IDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDMKLQotICAgICAgICBwdW5wY2toYncgICB4bW01LCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICA7IGF4YnhjeGR4Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgZXhmeGd4aHgKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgICA7IGV4ZnhneGh4Ci0gICAgICAgIHBzcmF3ICAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCi0KLSAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgOyBheGJ4Y3hkeAotICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotCi0gICAgICAgIHBhY2tzc3diICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgKDMqIChxMCAtIHAwKSArIGh2bShwMSAtIHExKSArIDMpID4+IDM7Ci0gICAgICAgIHBzcmF3ICAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgICAgOyBzaWduIGV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGJ5IDMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBzYXZlIHJlc3VsdHMKLQotICAgICAgICBwYWNrc3N3YiAgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgICA7ICgzKiAocTAgLSBwMCkgKyBodm0ocDEgLSBxMSkgKyA0KSA+PjMKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgW0dMT0JBTChvbmVzKV0KLQotICAgICAgICBwYWRkc3cgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKG9uZXMpXQotICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICA7IHBhcnRpYWwgc2hpZnRlZCBvbmUgbW9yZSB0aW1lIGZvciAybmQgdGFwCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgOyBwYXJ0aWFsIHNoaWZ0ZWQgb25lIG1vcmUgdGltZSBmb3IgMm5kIHRhcAotCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTYsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKLSAgICAgICAgcGFja3Nzd2IgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgOyAoMyogKHEwIC0gcDApICsgaHZtKHAxIC0gcTEpICsgNCkgPj40Ci0KLSVpZiAlMSA9PSAwCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHAxICAgICAgICAgICAgICAgIDsgcDEKLSVlbGlmICUxID09IDEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICAgICAgW3JzaSsyKnJheF0gICAgICAgOyBwMQotJWVsaWYgJTEgPT0gMgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICA7IHAxCi0lZW5kaWYKLSAgICAgICAgcGFuZG4gICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBoaWdoIGVkZ2UgdmFyaWFuY2UgYWRkaXRpdmUKLSAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgOyB1bm9mZnNldAotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICAgIDsgcmVvZmZzZXQKLSAgICAgICAgcHN1YnNiICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBxMC09IHEwIGFkZAotCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgcDErPSBwMSBhZGQKLSAgICAgICAgcHhvciAgICAgICAgeG1tMywgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgOyB1bm9mZnNldAotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICAgIDsgdW5vZmZzZXQKLSAgICAgICAgcHN1YnNiICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgOyBxMS09IHExIGFkZAotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICAgIDsgdW5vZmZzZXQKLSVpZiAlMSA9PSAwCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIFtyc2kgKyByY3gqMl0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeCoyXQotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyc2ldLCAgICAgICB4bW02ICAgICAgICAgICAgICA7IHAwCi0gICAgICAgIG1vdmhwcyAgICAgIE1NV09SRCBQVFIgW3JkaV0sICAgICAgIHhtbTYKLSAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmF4XSwgeG1tMSAgICAgICAgICAgICAgOyBwMQotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkgKyByYXhdLCB4bW0xCi0gICAgICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JzaSArIHJjeF0sIHhtbTMgICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgbW92aHBzICAgICAgTU1XT1JEIFBUUiBbcmRpICsgcmN4XSwgeG1tMwotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyByY3gqMl0seG1tNyAgICAgICAgICAgICA7IHExCi0gICAgICAgIG1vdmhwcyAgICAgIE1NV09SRCBQVFIgW3JkaSArIHJjeCoyXSx4bW03Ci0lZWxpZiAlMSA9PSAxCi0gICAgICAgIG1vdmRxYSAgICAgIFtyc2krcmF4XSwgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgd3JpdGUgYmFjawotICAgICAgICBtb3ZkcWEgICAgICBbcnNpKzIqcmF4XSwgICAgICAgICAgICB4bW0xICAgICAgICAgICAgICA7IHdyaXRlIGJhY2sKLSAgICAgICAgbW92ZHFhICAgICAgW3JzaV0sICAgICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgOyB3cml0ZSBiYWNrCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgIDsgd3JpdGUgYmFjawotJWVuZGlmCi0KLSVlbmRtYWNybwotCi0KLTt2b2lkIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCi07ICAgIGNvbnN0IGNoYXIgICAgKmZsaW1pdCwKLTsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKLTsgICAgaW50ICAgICAgICAgICAgY291bnQKLTspCi1nbG9iYWwgc3ltKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMikKLXN5bSh2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAzMiAgICAgOyByZXNlcnZlIDMyIGJ5dGVzCi0gICAgJWRlZmluZSB0MCBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzE2XTsKLSAgICAlZGVmaW5lIHQxIFtyc3AgKyAxNl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbMTZdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsX3N0ZXAKLQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgICAgICAgICBhcmcoMykgICAgICAgICAgIDtsaW1pdAotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmR4XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgICAgIFtyc2krcmF4XSAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZwotCi0gICAgICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgICAgICBMRkhfRklMVEVSX0FORF9IRVZfTUFTSyAxCi0gICAgICAgIDsgZmlsdGVyIGFuZCB3cml0ZSBiYWNrIHRoZSByZXN1bHQKLSAgICAgICAgQl9GSUxURVIgMQotCi0gICAgYWRkIHJzcCwgMzIKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgICAgICAgICAgICBzcmNfcGl4ZWxfc3RlcCwKLTsgICAgY29uc3QgY2hhciAgICAqZmxpbWl0LAotOyAgICBjb25zdCBjaGFyICAgICpsaW1pdCwKLTsgICAgY29uc3QgY2hhciAgICAqdGhyZXNoLAotOyAgICBpbnQgICAgICAgICAgICBjb3VudAotOykKLWdsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyKQotc3ltKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKLSAgICBzdWIgICAgICAgICByc3AsIDk2ICAgICAgIDsgcmVzZXJ2ZSA5NiBieXRlcwotICAgICVkZWZpbmUgcTIgIFtyc3AgKyAwXSAgICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHEyWzE2XTsKLSAgICAlZGVmaW5lIHExICBbcnNwICsgMTZdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciBxMVsxNl07Ci0gICAgJWRlZmluZSBwMiAgW3JzcCArIDMyXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgcDJbMTZdOwotICAgICVkZWZpbmUgcDEgIFtyc3AgKyA0OF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHAxWzE2XTsKLSAgICAlZGVmaW5lIHQwICBbcnNwICsgNjRdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MFsxNl07Ci0gICAgJWRlZmluZSB0MSAgW3JzcCArIDgwXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbMTZdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICA7IHUKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICAgICAgYXJnKDUpICAgICAgICAgICAgIDsgdgotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgOyBzcmNfcGl4ZWxfc3RlcAotICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAgICAgICAgICAgICByYXgKLSAgICAgICAgbmVnICAgICAgICAgcmF4ICAgICAgICAgICAgICAgICAgICAgOyBuZWdhdGUgcGl0Y2ggdG8gZGVhbCB3aXRoIGFib3ZlIGJvcmRlcgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgICAgIGFyZygzKSAgICAgICAgICAgICA7bGltaXQKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkeF0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBbcnNpICsgcmN4XQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgICAgICBbcmRpICsgcmN4XQotCi0gICAgICAgIDsgY2FsY3VsYXRlIGJyZWFrb3V0IGNvbmRpdGlvbnMgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgICAgICBMRkhfRklMVEVSX0FORF9IRVZfTUFTSyAwCi0gICAgICAgIDsgZmlsdGVyIGFuZCB3cml0ZSBiYWNrIHRoZSByZXN1bHQKLSAgICAgICAgQl9GSUxURVIgMAotCi0gICAgYWRkIHJzcCwgOTYKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotJW1hY3JvIE1CX0ZJTFRFUl9BTkRfV1JJVEVCQUNLIDEKLSVpZiAlMSA9PSAwCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHAxICAgICAgICAgICAgICA7IHAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHExICAgICAgICAgICAgICA7IHExCi0lZWxpZiAlMSA9PSAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtyc2krMipyYXhdICAgICA7IHAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFtyZGldICAgICAgICAgICA7IHExCi0KLSAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgICAgICAgICAgICAgcmF4Ci0gICAgICAgIG5lZyAgICAgICAgIHJjeAotJWVsaWYgJTEgPT0gMgotICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICAgICAgICAgICAgICBzcmN0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW3JkeCszMl0gICAgICAgIDsgcDEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW3JkeCs4MF0gICAgICAgIDsgcTEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgW3JkeCs0OF0gICAgICAgIDsgcDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgW3JkeCs2NF0gICAgICAgIDsgcTAKLSVlbmRpZgotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgIDsgcTEgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLQotICAgICAgICBwc3Vic2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBwMSAtIHExCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IHEwCi0KLSAgICAgICAgcHN1YnNiICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgcTAgLSBwMAotCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IDEgKiAocTAgLSBwMCkgKyAocDEgLSBxMSkKLQotICAgICAgICBwYWRkc2IgICAgICB4bW0yLCAgICAgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyAyICogKHEwIC0gcDApCi0KLSAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKSArIChwMSAtIHExKQotCi0gICAgICAgIHBhbmQgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgdnA4X2ZpbHRlcgotCi0gICAgICAgIHBhbmQgICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IEZpbHRlcjIgPSB2cDhfZmlsdGVyICYgaGV2Ci0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwYW5kbiAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyB2cDhfZmlsdGVyJj1+aGV2Ci0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTEKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIgMiAoaGkpCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTIKLQotICAgICAgICBwdW5wY2toYncgICB4bW0xLCAgICAgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBGaWx0ZXIgMiAobG8pCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDMpXSAgICA7IHZwOF9zaWduZWRfY2hhcl9jbGFtcChGaWx0ZXIyICsgMykKLQotICAgICAgICBwbXVsaHcgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHM5KV0gICAgOyBGaWx0ZXIgMiAobG8pICogOQotCi0gICAgICAgIHBtdWxodyAgICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwoczkpXSAgICA7IEZpbHRlciAyIChoaSkgKiA5Ci0KLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgYXhieGN4ZHgKLSAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0NCldICAgIDsgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKEZpbHRlcjIgKyA0KQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGV4ZnhneGh4Ci0gICAgICAgIHBzcmF3ICAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotICAgICAgICBwdW5wY2toYncgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBheGJ4Y3hkeAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGV4ZnhneGh4Ci0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICA7IHNpZ24gZXh0ZW5kZWQgc2hpZnQgcmlnaHQgYnkgMwotCi0gICAgICAgIHBhY2tzc3diICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IEZpbHRlcjIgPj49MzsKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgIDsgc2lnbiBleHRlbmRlZCBzaGlmdCByaWdodCBieSAzCi0KLSAgICAgICAgcGFja3Nzd2IgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgRmlsdGVyMSA+Pj0zOwotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICB4bW0xCi0KLSAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgcHMwID1wczAgKyBGaXRsZXIyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHhtbTEKLQotICAgICAgICBwc3Vic2IgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBxczAgPXFzMCAtIEZpbHRlcjEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTUKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMCwgICAgICAgICAgICAgICAgICAgW0dMT0JBTChzNjMpXSAgIDsgRmlsdGVyIDIgKGhpKSAqIDkgKyA2MwotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwoczYzKV0gICA7IEZpbHRlciAyIChsbykgKiA5ICsgNjMKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgRmlsdGVyIDIgKGhpKSAqIDE4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgRmlsdGVyIDIgKGxvKSAqIDE4Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IEZpbHRlciAyIChoaSkgKiAyNyArIDYzCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgRmlsdGVyIDIgKGxvKSAqIDI3ICsgNjMKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgRmlsdGVyIDIgKGhpKSAqIDE4ICsgNjMKLQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBGaWx0ZXIgMiAobG8pICogMTggKyA2MwotICAgICAgICBwc3JhdyAgICAgICB4bW0wLCAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgICAgICAgOyAoRmlsdGVyIDIgKGhpKSAqIDkgKyA2MykgPj4gNwotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIDcgICAgICAgICAgICAgICA7IChGaWx0ZXIgMiAobG8pICogOSArIDYzKSA+PiA3Ci0gICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIDcgICAgICAgICAgICAgICA7IChGaWx0ZXIgMiAoaGkpICogMTggKyA2MykgPj4gNwotCi0gICAgICAgIHBhY2tzc3diICAgIHhtbTAsICAgICAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHUxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiA5KT4+NykKLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgIDsgKEZpbHRlciAyIChsbykgKiAxOCArIDYzKSA+PiA3Ci0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgIDsgKEZpbHRlciAyIChoaSkgKiAyNyArIDYzKSA+PiA3Ci0gICAgICAgIHBhY2tzc3diICAgIHhtbTIsICAgICAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IHUyID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKCg2MyArIEZpbHRlcjIgKiAxOCk+PjcpCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgIDsgKEZpbHRlciAyIChsbykgKiAyNyArIDYzKSA+PiA3Ci0KLSAgICAgICAgcGFja3Nzd2IgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgdTMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAoKDYzICsgRmlsdGVyMiAqIDI3KT4+NykKLQotICAgICAgICBwc3Vic2IgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBzcSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChxczAgLSB1MykKLSAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgICAgICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgc3AgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwIC0gdTMpCi0KLSVpZiAlMSA9PSAwCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgICAgIHEyICAgICAgICAgICAgICA7IHEyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHExICAgICAgICAgICAgICA7IHExCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIHAxICAgICAgICAgICAgICA7IHAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIHAyICAgICAgICAgICAgICA7IHAyCi0KLSVlbGlmICUxID09IDEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaStyY3hdICAgOyBxMgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSAgICAgICA7IHExCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2krcmF4KjJdIDsgcDEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaStyYXgqNF0gOyBwMgotJWVsaWYgJTEgPT0gMgotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmR4Kzk2XSAgICA7IHEyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZHgrODBdICAgIDsgcTEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkeCszMl0gICAgOyBwMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzE2XSAgICA7IHAyCi0lZW5kaWYKLQotICAgICAgICBweG9yICAgICAgICB4bW0zLCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyAqb3EwID0gc3FeMHg4MAotICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyAqb3EwID0gc3BeMHg4MAotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIFtHTE9CQUwodDgwKV0KLSAgICAgICAgcHhvciAgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXQotCi0gICAgICAgIHBzdWJzYiAgICAgIHhtbTEsICAgICAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IHNxID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMSAtIHUyKQotICAgICAgICBwYWRkc2IgICAgICB4bW00LCAgICAgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBzcCA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczEgLSB1MikKLQotICAgICAgICBweG9yICAgICAgICB4bW0xLCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyAqb3ExID0gc3FeMHg4MDsKLSAgICAgICAgcHhvciAgICAgICAgeG1tNCwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgIDsgKm9wMSA9IHNwXjB4ODA7Ci0KLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXQotICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldCi0KLSAgICAgICAgcGFkZHNiICAgICAgeG1tNywgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgc3AgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMyIC0gdSkKLSAgICAgICAgcHN1YnNiICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgc3EgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMyIC0gdSkKLQotICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgOyAqb3AyID0gc3BeMHg4MDsKLSAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgICAgICAgICAgICAgW0dMT0JBTCh0ODApXSAgIDsgKm9xMiA9IHNxXjB4ODA7Ci0KLSVpZiAlMSA9PSAwCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIFtyc2krcmN4KjJdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgICAgIFtyZGkrcmN4KjJdCi0KLSAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUiBbcnNpXSwgICAgICAgeG1tNiAgICAgICAgICAgIDsgcDAKLSAgICAgICAgbW92aHBzICAgICAgTU1XT1JEIFBUUiBbcmRpXSwgICAgICAgeG1tNgotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyByY3hdLCB4bW0zICAgICAgICAgICAgOyBxMAotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkgKyByY3hdLCB4bW0zCi0KLSAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUiBbcnNpK3JjeCoyXSwgeG1tMSAgICAgICAgICAgIDsgcTEKLSAgICAgICAgbW92aHBzICAgICAgTU1XT1JEIFBUUiBbcmRpK3JjeCoyXSwgeG1tMQotCi0gICAgICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JzaSArIHJheF0sIHhtbTQgICAgICAgICAgICA7IHAxCi0gICAgICAgIG1vdmhwcyAgICAgIE1NV09SRCBQVFIgW3JkaSArIHJheF0sIHhtbTQKLQotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyc2krcmF4KjJdLCB4bW03ICAgICAgICAgICAgOyBwMgotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkrcmF4KjJdLCB4bW03Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICAgICAgW3JzaSArIHJjeF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeF0KLSAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUiBbcnNpK3JjeCoyXSwgeG1tNSAgICAgICAgICAgIDsgcTIKLSAgICAgICAgbW92aHBzICAgICAgTU1XT1JEIFBUUiBbcmRpK3JjeCoyXSwgeG1tNQotJWVsaWYgJTEgPT0gMQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmRpK3JjeF0sICB4bW01ICAgICAgICAgICAgOyBxMgotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgICB4bW0xICAgICAgICAgICAgOyBxMQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNpXSwgICAgICB4bW0zICAgICAgICAgICAgOyBxMAotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNpK3JheCAgXSx4bW02ICAgICAgICAgICAgOyBwMAotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNpK3JheCoyXSx4bW00ICAgICAgICAgICAgOyBwMQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmRpK3JheCo0XSx4bW03ICAgICAgICAgICAgOyBwMgotJWVsaWYgJTEgPT0gMgotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmR4KzgwXSwgICB4bW0xICAgICAgICAgICAgOyBxMQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmR4KzY0XSwgICB4bW0zICAgICAgICAgICAgOyBxMAotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmR4KzQ4XSwgICB4bW02ICAgICAgICAgICAgOyBwMAotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmR4KzMyXSwgICB4bW00ICAgICAgICAgICAgOyBwMQotJWVuZGlmCi0KLSVlbmRtYWNybwotCi0KLTt2b2lkIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgICAgICAgICAgICBzcmNfcGl4ZWxfc3RlcCwKLTsgICAgY29uc3QgY2hhciAgICAqZmxpbWl0LAotOyAgICBjb25zdCBjaGFyICAgICpsaW1pdCwKLTsgICAgY29uc3QgY2hhciAgICAqdGhyZXNoLAotOyAgICBpbnQgICAgICAgICAgICBjb3VudAotOykKLWdsb2JhbCBzeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIpCi1zeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAzMiAgICAgOyByZXNlcnZlIDMyIGJ5dGVzCi0gICAgJWRlZmluZSB0MCBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzE2XTsKLSAgICAlZGVmaW5lIHQxIFtyc3AgKyAxNl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbMTZdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgIDtzcmNfcGl4ZWxfc3RlcAotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgICAgIGFyZygzKSAgICAgICAgICAgIDtsaW1pdAotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmR4XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgICAgIFtyc2krcmF4XSAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLQotICAgICAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zIGFuZCBoaWdoIGVkZ2UgdmFyaWFuY2UKLSAgICAgICAgTEZIX0ZJTFRFUl9BTkRfSEVWX01BU0sgMQotICAgICAgICA7IGZpbHRlciBhbmQgd3JpdGUgYmFjayB0aGUgcmVzdWx0cwotICAgICAgICBNQl9GSUxURVJfQU5EX1dSSVRFQkFDSyAxCi0KLSAgICBhZGQgcnNwLCAzMgotICAgIHBvcCByc3AKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqdSwKLTsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCi07ICAgIGNvbnN0IGNoYXIgICAgKmZsaW1pdCwKLTsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKLTsgICAgdW5zaWduZWQgY2hhciAqdgotOykKLWdsb2JhbCBzeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3NzZTIpCi1zeW0odnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3V2X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCA5NiAgICAgICA7IHJlc2VydmUgOTYgYnl0ZXMKLSAgICAlZGVmaW5lIHEyICBbcnNwICsgMF0gICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciBxMlsxNl07Ci0gICAgJWRlZmluZSBxMSAgW3JzcCArIDE2XSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgcTFbMTZdOwotICAgICVkZWZpbmUgcDIgIFtyc3AgKyAzMl0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHAyWzE2XTsKLSAgICAlZGVmaW5lIHAxICBbcnNwICsgNDhdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciBwMVsxNl07Ci0gICAgJWRlZmluZSB0MCAgW3JzcCArIDY0XSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDBbMTZdOwotICAgICVkZWZpbmUgdDEgIFtyc3AgKyA4MF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQxWzE2XTsKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgOyB1Ci0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgICAgIGFyZyg1KSAgICAgICAgICAgICA7IHYKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgIDsgc3JjX3BpeGVsX3N0ZXAKLSAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgICAgICAgICAgICAgcmF4Ci0gICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICAgIDsgbmVnYXRlIHBpdGNoIHRvIGRlYWwgd2l0aCBhYm92ZSBib3JkZXIKLQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgICAgICAgICBhcmcoMykgICAgICAgICAgICAgO2xpbWl0Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZHhdCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICAgICAgW3JzaSArIHJjeF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICAgICAgW3JkaSArIHJjeF0KLQotICAgICAgICA7IGNhbGN1bGF0ZSBicmVha291dCBjb25kaXRpb25zIGFuZCBoaWdoIGVkZ2UgdmFyaWFuY2UKLSAgICAgICAgTEZIX0ZJTFRFUl9BTkRfSEVWX01BU0sgMAotICAgICAgICA7IGZpbHRlciBhbmQgd3JpdGUgYmFjayB0aGUgcmVzdWx0cwotICAgICAgICBNQl9GSUxURVJfQU5EX1dSSVRFQkFDSyAwCi0KLSAgICBhZGQgcnNwLCA5NgotICAgIHBvcCByc3AKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0lbWFjcm8gVFJBTlNQT1NFXzE2WDggMgotICAgICAgICBtb3ZxICAgICAgICB4bW00LCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMAotICAgICAgICBtb3ZxICAgICAgICB4bW0wLCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzIqcmF4XSAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMAotICAgICAgICBtb3ZxICAgICAgICB4bW03LCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzIqcmF4XSAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCAzNyAzNiAzNSAzNCAzMyAzMiAzMSAzMAotICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzQqcmF4XSAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAotICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzQqcmF4XSAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCA1NyA1NiA1NSA1NCA1MyA1MiA1MSA1MAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgMTcgMDcgMTYgMDYgMTUgMDUgMTQgMDQgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKLQotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzIqcmN4XSAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCA3NyA3NiA3NSA3NCA3MyA3MiA3MSA3MAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgMTcgMDcgMTYgMDYgMTUgMDUgMTQgMDQgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyAzNyAyNyAzNiAzNiAzNSAyNSAzNCAyNCAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgUVdPUkQgUFRSIFtyc2krMipyY3hdICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IDY3IDY2IDY1IDY0IDYzIDYyIDYxIDYwCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyA1NyA0NyA1NiA0NiA1NSA0NSA1NCA0NCA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MAotJWlmICUxCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaStyYXgqOF0KLSVlbHNlCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgYXJnKDUpICAgICAgICAgIDsgdl9wdHIKLSVlbmRpZgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgNTcgNDcgNTYgNDYgNTUgNDUgNTQgNDQgNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyA3NyA2NyA3NiA2NiA3NSA2NSA3NCA2NCA3MyA2MyA3MiA2MiA3MSA2MSA3MCA2MAotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTUsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgNzMgNjMgNTMgNDMgNzIgNjIgNTIgNDIgNzEgNjEgNTEgNDEgNzAgNjAgNTAgNDAKLQotICAgICAgICBwdW5wY2tod2QgICB4bW02LCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IDc3IDY3IDU3IDQ3IDc2IDY2IDU2IDQ2IDc1IDY1IDU1IDQ1IDc0IDY0IDU0IDQ0Ci0laWYgJTEKLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcmRpK3JheCo4XQotJWVsc2UKLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBbcnNpIC0gNF0KLSVlbmRpZgotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTMsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKLSVpZiAlMQotICAgICAgICBsZWEgICAgICAgICByZHgsICAgICAgICAgICAgICAgIHNyY3QKLSVlbHNlCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgW3JzaSArIHJheF0gICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLSVlbmRpZgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKLSAgICAgICAgcHVucGNraHdkICAgeG1tNCwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyAzNyAyNyAxNyAwNyAzNiAyNiAxNiAwNiAzNSAyNSAxNSAwNSAzNCAyNCAxNCAwNAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgMzcgMjcgMTcgMDcgMzYgMjYgMTYgMDYgMzUgMjUgMTUgMDUgMzQgMjQgMTQgMDQKLSAgICAgICAgcHVucGNraGRxICAgeG1tMywgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgNzcgNjcgNTcgNDcgMzcgMjcgMTcgMDcgNzYgNjYgNTYgNDYgMzYgMjYgMTYgMDYKLQotICAgICAgICBwdW5wY2tsZHEgICB4bW00LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0Ci0KLSAgICAgICAgcHVucGNrbGRxICAgeG1tMiwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHQwLCAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgc2F2ZSB0byBmcmVlIFhNTTIKLSAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgICAgOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCA4NyA4NiA4NSA4NCA4MyA4MiA4MSA4MAotICAgICAgICBtb3ZxICAgICAgICB4bW02LCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgICA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IDk3IDk2IDk1IDk0IDkzIDkyIDkxIDkwCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgUVdPUkQgUFRSIFtyc2krMipyYXhdIDsgeHggeHggeHggeHggeHggeHggeHggeHggYTcgYTYgYTUgYTQgYTMgYTIgYTEgYTAKLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgICAgICAgICBRV09SRCBQVFIgW3JkaSsyKnJheF0gOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCBiNyBiNiBiNSBiNCBiMyBiMiBiMSBiMAotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzQqcmF4XSA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IGM3IGM2IGM1IGM0IGMzIGMyIGMxIGMwCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyA5NyA4NyA5NiA4NiA5NSA4NSA5NCA4NCA5MyA4MyA5MiA4MiA5MSA4MSA5MCA4MAotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgICAgICAgICAgUVdPUkQgUFRSIFtyZGkrNCpyYXhdIDsgeHggeHggeHggeHggeHggeHggeHggeHggZDcgZDYgZDUgZDQgZDMgZDIgZDEgZDAKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICA7IGI3IGE3IGI2IGE2IGI1IGE1IGI0IGE0IGIzIGEzIGIyIGEyIGIxIGExIGIwIGEwCi0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgICAgICAgICBRV09SRCBQVFIgW3JzaSsyKnJjeF0gOyB4eCB4eCB4eCB4eCB4eCB4eCB4eCB4eCBlNyBlNiBlNSBlNCBlMyBlMiBlMSBlMAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgZDcgYzcgZDYgYzYgZDUgYzUgZDQgYzQgZDMgYzMgZDIgYzIgZDEgZTEgZDAgYzAKLQotICAgICAgICBtb3ZxICAgICAgICB4bW02LCAgICAgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzIqcmN4XSA7IHh4IHh4IHh4IHh4IHh4IHh4IHh4IHh4IGY3IGY2IGY1IGY0IGYzIGYyIGYxIGYwCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBmNyBlNyBmNiBlNiBmNSBlNSBmNCBlNCBmMyBlMyBmMiBlMiBmMSBlMSBmMCBlMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNraHdkICAgeG1tNiwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBmNyBlNyBkNyBjNyBmNiBlNiBkNiBjNiBmNSBlNSBkNSBjNSBmNCBlNCBkNCBjNAotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgZjMgZTMgZDMgYzMgZjIgZTIgZDIgYzIgZjEgZTEgZDEgYzEgZjAgZTAgZDAgYzAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyA5NyA4NyA5NiA4NiA5NSA4NSA5NCA4NCA5MyA4MyA5MiA4MiA5MSA4MSA5MCA4MAotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgYjMgYTMgOTMgODMgYjIgYTIgOTIgODIgYjEgYTEgOTEgODEgYjAgYTAgOTAgODAKLQotICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IGI3IGE3IDk3IDg3IGI2IGE2IDk2IDg2IGI1IGE1IDk1IDg1IGI0IGE0IDk0IDg0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW01Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAKLQotICAgICAgICBwdW5wY2toZHEgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgYjcgYTcgOTcgODcgYjYgYTYgOTYgODYgYjUgYTUgOTUgODUgYjQgYTQgOTQgODQKLQotICAgICAgICBwdW5wY2tsZHEgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICA7IGY1IGU1IGQ1IGM1IGI1IGE1IDk1IDg1IGY0IGU0IGQ0IGM0IGI0IGE0IDk0IDg0Ci0KLSAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBmNyBlNyBkNyBjNyBiNyBhNyA5NyA4NyBmNiBlNiBkNiBjNiBiNiBhNiA5NiA4NgotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IDc3IDY3IDU3IDQ3IDM3IDI3IDE3IDA3IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2Ci0KLSAgICAgICAgcHVucGNrbHFkcSAgeG1tNiwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBmNiBlNiBkNiBjNiBiNiBhNiA5NiA4NiA3NiA2NiA1NiA0NiAzNiAyNiAxNiAwNgotCi0gICAgICAgIHB1bnBja2hxZHEgIHhtbTcsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgZjcgZTcgZDcgYzcgYjcgYTcgOTcgODcgNzcgNjcgNTcgNDcgMzcgMjcgMTcgMDcKLSVpZiAlMgotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2xxZHEgIHhtbTIsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLQotICAgICAgICBwdW5wY2tocWRxICB4bW0zLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkeF0sICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBzYXZlIDIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0Ci0gICAgICAgIHB1bnBja2xxZHEgIHhtbTQsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKLQotICAgICAgICBtb3ZkcWEgICAgICBbcmR4KzE2XSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHNhdmUgMwotCi0gICAgICAgIHB1bnBja2hxZHEgIHhtbTUsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjUgZTUgZDUgYzUgYjUgYTUgOTUgODUgNzUgNjUgNTUgNDUgMzUgMjUgMTUgMDUKLQotICAgICAgICBtb3ZkcWEgICAgICBbcmR4KzMyXSwgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IHNhdmUgNAotICAgICAgICBtb3ZkcWEgICAgICBbcmR4KzQ4XSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IHNhdmUgNQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgIHQwICAgICAgICAgICAgICA7IGdldAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNraHFkcSAgeG1tMSwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQotCi0gICAgICAgIHB1bnBja2xxZHEgIHhtbTIsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSVlbHNlCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZHgrMTEyXSwgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgc2F2ZSA3Ci0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkeCs5Nl0sICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBzYXZlIDYKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2hxZHEgIHhtbTMsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgIDsgZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKLQotICAgICAgICBwdW5wY2tscWRxICB4bW0yLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkeCszMl0sICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBzYXZlIDIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0Ci0gICAgICAgIHB1bnBja2xxZHEgIHhtbTQsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKLQotICAgICAgICBtb3ZkcWEgICAgICBbcmR4KzQ4XSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHNhdmUgMwotCi0gICAgICAgIHB1bnBja2hxZHEgIHhtbTUsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjUgZTUgZDUgYzUgYjUgYTUgOTUgODUgNzUgNjUgNTUgNDUgMzUgMjUgMTUgMDUKLQotICAgICAgICBtb3ZkcWEgICAgICBbcmR4KzY0XSwgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IHNhdmUgNAotICAgICAgICBtb3ZkcWEgICAgICBbcmR4KzgwXSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IHNhdmUgNQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgIHQwICAgICAgICAgICAgICA7IGdldAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMQotICAgICAgICBwdW5wY2tocWRxICB4bW0xLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICA7IGYxIGUxIGQxIGMxIGIxIGExIDkxIDgxIDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxCi0KLSAgICAgICAgcHVucGNrbHFkcSAgeG1tMiwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZHgrMTZdLCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZHhdLCAgICAgICAgICAgICAgeG1tMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIExGVl9GSUxURVJfTUFTS19IRVZfTUFTSyAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgcTIKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBxMi1xMwotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgcTMtcTIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgICAgICAgICB4bW01ICAgICAgICAgICAgOyBxMQotCi0gICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgIDsgYWJzIChxMy1xMikKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNCwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBxMS1xMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMQotICAgICAgICBwc3VidXNiICAgICB4bW02LCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IHEyLXExCi0KLSAgICAgICAgcG9yICAgICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyBhYnMgKHEyLXExKQotICAgICAgICBwc3VidXNiICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IHAyIC0gcDM7Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMiwgICAgICAgICAgICAgICB4bW0xICAgICAgICAgICAgOyBwMyAtIHAyOwotICAgICAgICBwb3IgICAgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGFicyhwMi1wMykKLSVpZiAlMQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgIFtyZHhdICAgICAgICAgICA7IHAxCi0lZWxzZQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgIFtyZHgrMzJdICAgICAgICA7IHAxCi0lZW5kaWYKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyBwMQotICAgICAgICBwbWF4dWIgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTcKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHAxLXAyCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDItcDEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHAwCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDAtcDEKLQotICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGFicyhwMi1wMSkKLSAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW02Ci0KLSAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcDEKLQotICAgICAgICBwc3VidXNiICAgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHAxLXAwCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgc3JjdAotCi0gICAgICAgIHBvciAgICAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgYWJzKHAxLXAwKQotCi0gICAgICAgIG1vdmRxYSAgICAgIHQwLCAgICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgc2F2ZSBhYnMocDEtcDApCi0KLSAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW0yCi0KLSVpZiAlMQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIFtyZHgrMzJdICAgICAgICA7IHEwCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgW3JkeCs0OF0gICAgICAgIDsgcTEKLSVlbHNlCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgW3JkeCs2NF0gICAgICAgIDsgcTAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICBbcmR4KzgwXSAgICAgICAgOyBxMQotJWVuZGlmCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgYXJnKDMpICAgICAgICAgIDsgbGltaXQKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IHEwCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgcTEKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IHEwLXExCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTcsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgcTEtcTAKLQotICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGFicyhxMS1xMCkKLQotICAgICAgICBtb3ZkcWEgICAgICB0MSwgICAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IHNhdmUgYWJzKHExLXEwKQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkeF07IGxpbWl0Ci0KLSAgICAgICAgcG1heHViICAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW03Ci0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgYXJnKDIpICAgICAgICAgIDsgZmxpbWl0Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMCwgICAgICAgICAgICAgICB4bW00Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgcTEKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IHExLT1wMQotICAgICAgICBwc3VidXNiICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IHAxLT1xMQotCi0gICAgICAgIHBvciAgICAgICAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgYWJzKHAxLXExKQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHAwCi0KLSAgICAgICAgcGFuZCAgICAgICAgeG1tNSwgICAgICAgICAgICAgICBbR0xPQkFMKHRmZSldICAgOyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNiAgICAgICAgICAgIDsgcDAtcTAKLQotICAgICAgICBwc3JsdyAgICAgICB4bW01LCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgotICAgICAgICBwc3VidXNiICAgICB4bW02LCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICA7IHEwLXAwCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmR4XTsgZmxpbWl0Ci0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgICAgICBhcmcoNCkgICAgICAgICAgOyBnZXQgdGhyZXNoCi0KLSAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBhYnMocTAtcDApCi0gICAgICAgIHBhZGRiICAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgIDsgZmxpbWl0KjIgKGxlc3MgdGhhbiAyNTUpCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB0MCAgICAgICAgICAgICAgOyBnZXQgYWJzIChxMSAtIHEwKQotCi0gICAgICAgIHBhZGR1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgYWJzKHEwLXAwKSoyCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgICAgICAgICB0MSAgICAgICAgICAgICAgOyBnZXQgYWJzIChwMSAtIHAwKQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkeF0KLQotICAgICAgICBwYWRkdXNiICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICA7IGFicyAocDAgLSBxMCkgKjIgKyBhYnMocDEtcTEpLzIKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2gKLQotICAgICAgICBwYWRkYiAgICAgICB4bW00LCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdCAobGVzcyB0aGFuIDI1NSkKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tMywgICAgICAgICAgICAgICB4bW03ICAgICAgICAgICAgOyBhYnMocDEgLSBwMCk+IHRocmVzaAotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMiAgPiBmbGltaXQgKiAyICsgbGltaXQKLSAgICAgICAgcG9yICAgICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkgPiB0aHJlc2ggfHwgYWJzKHAxIC0gcDApID4gdGhyZXNoCi0KLSAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgOyBtYXNrCi0gICAgICAgIHBjbXBlcWIgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMAotICAgICAgICBwY21wZXFiICAgICB4bW00LCAgICAgICAgICAgICAgIHhtbTQKLQotICAgICAgICBwY21wZXFiICAgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHhvciAgICAgICAgeG1tNCwgICAgICAgICAgICAgICB4bW02Ci0lZW5kbWFjcm8KLQotJW1hY3JvIEJWX1RSQU5TUE9TRSAwCi0gICAgICAgIDsgeG1tMSA9ICAgIGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gICAgICAgIDsgeG1tNiA9ICAgIGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzCi0gICAgICAgIDsgeG1tMyA9ICAgIGY0IGU0IGQ0IGM0IGI0IGE0IDk0IDg0IDc0IDY0IDU0IDQ0IDM0IDI0IDE0IDA0Ci0gICAgICAgIDsgeG1tNyA9ICAgIGY1IGU1IGQ1IGM1IGI1IGE1IDk1IDg1IDc1IDY1IDU1IDQ1IDM1IDI1IDE1IDA1Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgIDsgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBmMyBmMiBlMyBlMiBkMyBkMiBjMyBjMiBiMyBiMiBhMyBhMiA5MyA5MiA4MyA4MgotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgIDsgNzUgNzQgNjUgNjQgNTUgNTQgNDUgNDQgMzUgMzQgMjUgMjQgMTUgMTQgMDUgMDQKLQotICAgICAgICBwdW5wY2toYncgICB4bW0zLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICA7IGY1IGY0IGU1IGU0IGQ1IGQ0IGM1IGM0IGI1IGI0IGE1IGE0IDk1IDk0IDg1IDg0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgOyA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgotICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTQgICAgICAgICAgICA7IDM1IDM0IDMzIDMyIDI1IDI0IDIzIDIyIDE1IDE0IDEzIDEyIDA1IDA0IDAzIDAyCi0KLSAgICAgICAgcHVucGNraHdkICAgeG1tNiwgICAgICAgICAgICAgICB4bW00ICAgICAgICAgICAgOyA3NSA3NCA3MyA3MiA2NSA2NCA2MyA2MiA1NSA1NCA1MyA1MiA0NSA0NCA0MyA0MgotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICAgICAgICAgIHhtbTEgICAgICAgICAgICA7IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCi0KLSAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgICAgICAgICB4bW0zICAgICAgICAgICAgOyBiNSBiNCBiMyBiMiBhNSBhNCBhMyBhMiA5NSA5NCA5MyA5MiA4NSA4NCA4MyA4MgotCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMyAgICAgICAgICAgIDsgZjUgZjQgZjMgZjIgZTUgZTQgZTMgZTIgZDUgZDQgZDMgZDIgYzUgYzQgYzMgYzIKLSAgICAgICAgOyB4bW0yID0gMzUgMzQgMzMgMzIgMjUgMjQgMjMgMjIgMTUgMTQgMTMgMTIgMDUgMDQgMDMgMDIKLSAgICAgICAgOyB4bW02ID0gNzUgNzQgNzMgNzIgNjUgNjQgNjMgNjIgNTUgNTQgNTMgNTIgNDUgNDQgNDMgNDIKLSAgICAgICAgOyB4bW0xID0gYjUgYjQgYjMgYjIgYTUgYTQgYTMgYTIgOTUgOTQgOTMgOTIgODUgODQgODMgODIKLSAgICAgICAgOyB4bW01ID0gZjUgZjQgZjMgZjIgZTUgZTQgZTMgZTIgZDUgZDQgZDMgZDIgYzUgYzQgYzMgYzIKLSVlbmRtYWNybwotCi0lbWFjcm8gQlZfV1JJVEVCQUNLIDIKLSAgICAgICAgbW92ZCAgICAgICAgW3JzaSsyXSwgICAgICAgICAgICAlMQotICAgICAgICBwc3JsZHEgICAgICAlMSwgICAgICAgICAgICAgICAgIDQKLQotICAgICAgICBtb3ZkICAgICAgICBbcmRpKzJdLCAgICAgICAgICAgICUxCi0gICAgICAgIHBzcmxkcSAgICAgICUxLCAgICAgICAgICAgICAgICAgNAotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2krMipyYXgrMl0sICAgICAgJTEKLSAgICAgICAgcHNybGRxICAgICAgJTEsICAgICAgICAgICAgICAgICA0Ci0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaSsyKnJheCsyXSwgICAgICAlMQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2krNCpyYXgrMl0sICAgICAgJTIKLSAgICAgICAgcHNybGRxICAgICAgJTIsICAgICAgICAgICAgICAgICA0Ci0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkaSs0KnJheCsyXSwgICAgICAlMgotICAgICAgICBwc3JsZHEgICAgICAlMiwgICAgICAgICAgICAgICAgIDQKLQotICAgICAgICBtb3ZkICAgICAgICBbcnNpKzIqcmN4KzJdLCAgICAgICUyCi0gICAgICAgIHBzcmxkcSAgICAgICUyLCAgICAgICAgICAgICAgICAgNAotCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGkrMipyY3grMl0sICAgICAgJTIKLSVlbmRtYWNybwotCi0KLTt2b2lkIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgICAgICAgICAgIHNyY19waXhlbF9zdGVwLAotOyAgICBjb25zdCBjaGFyICAgICpmbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgICAgKmxpbWl0LAotOyAgICBjb25zdCBjaGFyICAgICp0aHJlc2gsCi07ICAgIGludCAgICAgICAgICAgIGNvdW50Ci07KQotZ2xvYmFsIHN5bSh2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKQotc3ltKHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgICAgIHJzcCwgOTYgICAgICA7IHJlc2VydmUgOTYgYnl0ZXMKLSAgICAlZGVmaW5lIHQwICAgICAgW3JzcCArIDBdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MFsxNl07Ci0gICAgJWRlZmluZSB0MSAgICAgIFtyc3AgKyAxNl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDFbMTZdOwotICAgICVkZWZpbmUgc3JjdCAgICBbcnNwICsgMzJdICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHNyY3RbNjRdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgICAgIDsgc3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgICAgICA7IHNyY19waXhlbF9zdGVwCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSAtIDRdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JheCoyK3JheF0KLQotICAgICAgICA7dHJhbnNwb3NlIDE2eDggdG8gOHgxNiwgYW5kIHN0b3JlIHRoZSA4LWxpbmUgcmVzdWx0IG9uIHN0YWNrLgotICAgICAgICBUUkFOU1BPU0VfMTZYOCAxLCAxCi0KLSAgICAgICAgOyBjYWxjdWxhdGUgZmlsdGVyIG1hc2sgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgICAgICBMRlZfRklMVEVSX01BU0tfSEVWX01BU0sgMQotCi0gICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCi0gICAgICAgIEJfRklMVEVSIDIKLQotICAgICAgICA7IHRyYW5wb3NlIGFuZCB3cml0ZSBiYWNrIC0gb25seSB3b3JrIG9uIHExLCBxMCwgcDAsIHAxCi0gICAgICAgIEJWX1RSQU5TUE9TRQotICAgICAgICA7IHN0b3JlIDE2LWxpbmUgcmVzdWx0Ci0KLSAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgW3JheF0KLSAgICAgICAgbmVnICAgICAgICAgcmR4Ci0KLSAgICAgICAgQlZfV1JJVEVCQUNLIHhtbTEsIHhtbTUKLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JkeCo4XQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCo4XQotICAgICAgICBCVl9XUklURUJBQ0sgeG1tMiwgeG1tNgotCi0gICAgYWRkIHJzcCwgOTYKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqdSwKLTsgICAgaW50ICAgICAgICAgICAgc3JjX3BpeGVsX3N0ZXAsCi07ICAgIGNvbnN0IGNoYXIgICAgKmZsaW1pdCwKLTsgICAgY29uc3QgY2hhciAgICAqbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgICAgKnRocmVzaCwKLTsgICAgdW5zaWduZWQgY2hhciAqdgotOykKLWdsb2JhbCBzeW0odnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMikKLXN5bSh2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgQUxJR05fU1RBQ0sgMTYsIHJheAotICAgIHN1YiAgICAgICAgICAgICByc3AsIDk2ICAgICAgOyByZXNlcnZlIDk2IGJ5dGVzCi0gICAgJWRlZmluZSB0MCAgICAgIFtyc3AgKyAwXSAgICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgdDBbMTZdOwotICAgICVkZWZpbmUgdDEgICAgICBbcnNwICsgMTZdICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQxWzE2XTsKLSAgICAlZGVmaW5lIHNyY3QgICAgW3JzcCArIDMyXSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciBzcmN0WzY0XTsKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICAgICA7IHVfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgICAgIDsgc3JjX3BpeGVsX3N0ZXAKLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpIC0gNF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZwotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmF4KzIqcmF4XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIHNyY3QKLQotICAgICAgICA7dHJhbnNwb3NlIDE2eDggdG8gOHgxNiwgYW5kIHN0b3JlIHRoZSA4LWxpbmUgcmVzdWx0IG9uIHN0YWNrLgotICAgICAgICBUUkFOU1BPU0VfMTZYOCAwLCAxCi0KLSAgICAgICAgOyBjYWxjdWxhdGUgZmlsdGVyIG1hc2sgYW5kIGhpZ2ggZWRnZSB2YXJpYW5jZQotICAgICAgICBMRlZfRklMVEVSX01BU0tfSEVWX01BU0sgMQotCi0gICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCi0gICAgICAgIEJfRklMVEVSIDIKLQotICAgICAgICA7IHRyYW5wb3NlIGFuZCB3cml0ZSBiYWNrIC0gb25seSB3b3JrIG9uIHExLCBxMCwgcDAsIHAxCi0gICAgICAgIEJWX1RSQU5TUE9TRQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLQotICAgICAgICA7IHN0b3JlIDE2LWxpbmUgcmVzdWx0Ci0gICAgICAgIEJWX1dSSVRFQkFDSyB4bW0xLCB4bW01Ci0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICAgICAgICAgOyB1X3B0cgotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpIC0gNF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZwotICAgICAgICBCVl9XUklURUJBQ0sgeG1tMiwgeG1tNgotCi0gICAgYWRkIHJzcCwgOTYKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLSVtYWNybyBNQlZfVFJBTlNQT1NFIDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICAgIDsgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MCAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAotICAgICAgICBwdW5wY2toYncgICB4bW0xLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyBmMSBmMCBlMSBlMCBkMSBkMCBjMSBjMCBiMSBiMCBhMSBhMCA5MSA5MCA4MSA4MAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICAgICAgW3JkeCszMl0gICAgICAgICAgICA7IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgICAgICBbcmR4KzQ4XSAgICAgICAgICAgIDsgNzMgNzIgNjMgNjIgNTMgNTIgNDMgNDIgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgICAgICAgICBbcmR4KzQ4XSAgICAgICAgICAgIDsgZjMgZjIgZTMgZTIgZDMgZDIgYzMgYzIgYjMgYjIgYTMgYTIgOTMgOTIgODMgODIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MCAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAotICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgICAgOyAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMCAxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAotCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTMsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwIDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCi0KLSAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgYjMgYjIgYjEgYjAgYTMgYTIgYTEgYTAgOTMgOTIgOTEgOTAgODMgODIgODEgODAKLSAgICAgICAgcHVucGNraHdkICAgeG1tNCwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgZjMgZjIgZjEgZjAgZTMgZTIgZTEgZTAgZDMgZDIgZDEgZDAgYzMgYzIgYzEgYzAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgICAgIFtyZHgrNjRdICAgICAgICAgICAgOyBmNCBlNCBkNCBjNCBiNCBhNCA5NCA4NCA3NCA2NCA1NCA0NCAzNCAyNCAxNCAwNAotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgICAgIFtyZHgrODBdICAgICAgICAgICAgOyA3NSA3NCA2NSA2NCA1NSA1NCA0NSA0NCAzNSAzNCAyNSAyNCAxNSAxNCAwNSAwNAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7IGY2IGU2IGQ2IGM2IGI2IGE2IDk2IDg2IDc2IDY2IDU2IDQ2IDM2IDI2IDE2IDA2Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgICAgICAgICAgW3JkeCsxMTJdICAgICAgICAgICA7IDc3IDc2IDY3IDY2IDU3IDU2IDQ3IDQ2IDM3IDM2IDI3IDI2IDE3IDE2IDA3IDA2Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgICAgICAgICB4bW0yICAgICAgICAgICAgICAgIDsgNzUgNzQgNjUgNjQgNTUgNTQgNDUgNDQgMzUgMzQgMjUgMjQgMTUgMTQgMDUgMDQKLSAgICAgICAgcHVucGNrbHdkICAgeG1tMiwgICAgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgMzcgMzYgMzUgMzQgMjcgMjYgMjUgMjQgMTcgMTYgMTUgMTQgMDcgMDYgMDUgMDQKLQotICAgICAgICBwdW5wY2tod2QgICB4bW03LCAgICAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOyA3NyA3NiA3NSA3NCA2NyA2NiA2NSA2NCA1NyA1NiA1NSA1NCA0NyA0NiA0NSA0NAotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMCAxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAotCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IDE3IDE2IDE1IDE0IDEzIDEyIDExIDEwIDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTYsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IDM3IDM2IDM1IDM0IDMzIDMyIDMxIDMwIDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwCi0lZW5kbWFjcm8KLQotJW1hY3JvIE1CVl9XUklURUJBQ0tfMSAwCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEICBQVFIgW3JzaV0sICAgeG1tMAotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGldLCAgIHhtbTAKLQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCAgUFRSIFtyc2krMipyYXhdLCB4bW02Ci0gICAgICAgIG1vdmhwcyAgICAgIE1NV09SRCBQVFIgW3JkaSsyKnJheF0sIHhtbTYKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyA3MyA3MiA3MSA3MCA2MyA2MiA2MSA2MCA1MyA1MiA1MSA1MCA0MyA0MiA0MSA0MAotICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyA1NyA1NiA1NSA1NCA1MyA1MiA1MSA1MCA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MAotCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTMsICAgICAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7IDc3IDc2IDc1IDc0IDczIDcyIDcxIDcwIDY3IDY2IDY1IDY0IDYzIDYyIDYxIDYwCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgIFBUUiBbcnNpKzQqcmF4XSwgeG1tMAotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkrNCpyYXhdLCB4bW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgIFBUUiBbcnNpKzIqcmN4XSwgeG1tMwotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkrMipyY3hdLCB4bW0zCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgICAgICBbcmR4KzY0XSAgICAgICAgICAgIDsgZjQgZTQgZDQgYzQgYjQgYTQgOTQgODQgNzQgNjQgNTQgNDQgMzQgMjQgMTQgMDQKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tMiwgICAgICAgICAgICAgICBbcmR4KzgwXSAgICAgICAgICAgIDsgZjUgZjQgZTUgZTQgZDUgZDQgYzUgYzQgYjUgYjQgYTUgYTQgOTUgOTQgODUgODQKLQotICAgICAgICBwdW5wY2toYncgICB4bW01LCAgICAgICAgICAgICAgIFtyZHgrMTEyXSAgICAgICAgICAgOyBmNyBmNiBlNyBlNiBkNyBkNiBjNyBjNiBiNyBiNiBhNyBhNiA5NyA5NiA4NyA4NgotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTIKLQotICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyBiNyBiNiBiNCBiNCBhNyBhNiBhNSBhNCA5NyA5NiA5NSA5NCA4NyA4NiA4NSA4NAotICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyBmNyBmNiBmNSBmNCBlNyBlNiBlNSBlNCBkNyBkNiBkNSBkNCBjNyBjNiBjNSBjNAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7IGIzIGIyIGIxIGIwIGEzIGEyIGExIGEwIDkzIDkyIDkxIDkwIDgzIDgyIDgxIDgwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7IDk3IDk2IDk1IDk0IDkzIDkyIDkxIDkwIDg3IDg2IDg1IDgzIDg0IDgyIDgxIDgwCi0KLSAgICAgICAgcHVucGNraGRxICAgeG1tNSwgICAgICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgYjcgYjYgYjUgYjQgYjMgYjIgYjEgYjAgYTcgYTYgYTUgYTQgYTMgYTIgYTEgYTAKLSVlbmRtYWNybwotCi0lbWFjcm8gTUJWX1dSSVRFQkFDS18yIDAKLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgIFBUUiBbcnNpXSwgICB4bW0xCi0gICAgICAgIG1vdmhwcyAgICAgIE1NV09SRCBQVFIgW3JkaV0sICAgeG1tMQotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEICBQVFIgW3JzaSsyKnJheF0sIHhtbTUKLSAgICAgICAgbW92aHBzICAgICAgTU1XT1JEIFBUUiBbcmRpKzIqcmF4XSwgeG1tNQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgICA7IGYzIGYyIGYxIGYwIGUzIGUyIGUxIGUwIGQzIGQyIGQxIGQwIGMzIGMyIGMxIGMwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IGQ3IGQ2IGQ1IGQ0IGQzIGQyIGQxIGQwIGM3IGM2IGM1IGM0IGMzIGMyIGMxIGMwCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTQsICAgICAgICAgICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IGY3IGY2IGY0IGY0IGYzIGYyIGYxIGYwIGU3IGU2IGU1IGU0IGUzIGUyIGUxIGUwCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgIFBUUiBbcnNpKzQqcmF4XSwgeG1tMQotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkrNCpyYXhdLCB4bW0xCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgIFBUUiBbcnNpKzIqcmN4XSwgeG1tNAotICAgICAgICBtb3ZocHMgICAgICBNTVdPUkQgUFRSIFtyZGkrMipyY3hdLCB4bW00Ci0lZW5kbWFjcm8KLQotCi07dm9pZCB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgICAgICAgICAgIHNyY19waXhlbF9zdGVwLAotOyAgICBjb25zdCBjaGFyICAgICpmbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgICAgKmxpbWl0LAotOyAgICBjb25zdCBjaGFyICAgICp0aHJlc2gsCi07ICAgIGludCAgICAgICAgICAgIGNvdW50Ci07KQotZ2xvYmFsIHN5bSh2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIpCi1zeW0odnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgQUxJR05fU1RBQ0sgMTYsIHJheAotICAgIHN1YiAgICAgICAgICByc3AsIDE2MCAgICAgOyByZXNlcnZlIDE2MCBieXRlcwotICAgICVkZWZpbmUgdDAgICBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzE2XTsKLSAgICAlZGVmaW5lIHQxICAgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVsxNl07Ci0gICAgJWRlZmluZSBzcmN0IFtyc3AgKyAzMl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgc3JjdFsxMjhdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7IHNyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgIDsgc3JjX3BpeGVsX3N0ZXAKLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgIFtyc2kgLSA0XQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgOyByZGkgcG9pbnRzIHRvIHJvdyArMSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZwotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICAgICAgICAgIFtyYXgqMityYXhdCi0KLSAgICAgICAgOyBUcmFuc3Bvc2UKLSAgICAgICAgVFJBTlNQT1NFXzE2WDggMSwgMAotCi0gICAgICAgIDsgY2FsY3VsYXRlIGZpbHRlciBtYXNrIGFuZCBoaWdoIGVkZ2UgdmFyaWFuY2UKLSAgICAgICAgTEZWX0ZJTFRFUl9NQVNLX0hFVl9NQVNLIDAKLQotICAgICAgICBuZWcgICAgICAgICByYXgKLSAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKLSAgICAgICAgTUJfRklMVEVSX0FORF9XUklURUJBQ0sgMgotCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaStyYXgqOF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcmRpK3JheCo4XQotCi0gICAgICAgIDsgdHJhbnNwb3NlIGFuZCB3cml0ZSBiYWNrCi0gICAgICAgIE1CVl9UUkFOU1BPU0UKLQotICAgICAgICBuZWcgICAgICAgICByYXgKLQotICAgICAgICBNQlZfV1JJVEVCQUNLXzEKLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgICAgIFtyc2krcmF4KjhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgW3JkaStyYXgqOF0KLSAgICAgICAgTUJWX1dSSVRFQkFDS18yCi0KLSAgICBhZGQgcnNwLCAxNjAKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICp1LAotOyAgICBpbnQgICAgICAgICAgICBzcmNfcGl4ZWxfc3RlcCwKLTsgICAgY29uc3QgY2hhciAgICAqZmxpbWl0LAotOyAgICBjb25zdCBjaGFyICAgICpsaW1pdCwKLTsgICAgY29uc3QgY2hhciAgICAqdGhyZXNoLAotOyAgICB1bnNpZ25lZCBjaGFyICp2Ci07KQotZ2xvYmFsIHN5bSh2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X3NzZTIpCi1zeW0odnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgQUxJR05fU1RBQ0sgMTYsIHJheAotICAgIHN1YiAgICAgICAgICByc3AsIDE2MCAgICAgOyByZXNlcnZlIDE2MCBieXRlcwotICAgICVkZWZpbmUgdDAgICBbcnNwICsgMF0gICAgO19fZGVjbHNwZWMoYWxpZ24oMTYpKSBjaGFyIHQwWzE2XTsKLSAgICAlZGVmaW5lIHQxICAgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVsxNl07Ci0gICAgJWRlZmluZSBzcmN0IFtyc3AgKyAzMl0gICA7X19kZWNsc3BlYyhhbGlnbigxNikpIGNoYXIgc3JjdFsxMjhdOwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7IHVfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICA7IHNyY19waXhlbF9zdGVwCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBbcnNpIC0gNF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcnNpICsgcmF4XSAgICAgICAgIDsgcmRpIHBvaW50cyB0byByb3cgKzEgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcKLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgICAgICAgICBbcmF4KzIqcmF4XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgICAgICAgICAgc3JjdAotCi0gICAgICAgIDsgVHJhbnNwb3NlCi0gICAgICAgIFRSQU5TUE9TRV8xNlg4IDAsIDAKLQotICAgICAgICA7IGNhbGN1bGF0ZSBmaWx0ZXIgbWFzayBhbmQgaGlnaCBlZGdlIHZhcmlhbmNlCi0gICAgICAgIExGVl9GSUxURVJfTUFTS19IRVZfTUFTSyAwCi0KLSAgICAgICAgOyBzdGFydCB3b3JrIG9uIGZpbHRlcnMKLSAgICAgICAgTUJfRklMVEVSX0FORF9XUklURUJBQ0sgMgotCi0gICAgICAgIDsgdHJhbnNwb3NlIGFuZCB3cml0ZSBiYWNrCi0gICAgICAgIE1CVl9UUkFOU1BPU0UKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICA7dV9wdHIKLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBbcnNpIC0gNF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgICAgICBbcnNpICsgcmF4XQotICAgICAgICBNQlZfV1JJVEVCQUNLXzEKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgICAgICBhcmcoNSkgICAgICAgICAgICAgO3ZfcHRyCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICAgICAgW3JzaSAtIDRdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICAgICAgW3JzaSArIHJheF0KLSAgICAgICAgTUJWX1dSSVRFQkFDS18yCi0KLSAgICBhZGQgcnNwLCAxNjAKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2Vfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfcGl4ZWxfc3RlcCwKLTsgICAgY29uc3QgY2hhciAqZmxpbWl0LAotOyAgICBjb25zdCBjaGFyICpsaW1pdCwKLTsgICAgY29uc3QgY2hhciAqdGhyZXNoLAotOyAgICBpbnQgY291bnQKLTspCi1nbG9iYWwgc3ltKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIpCi1zeW0odnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2Vfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSAgICAgICAgICAgICA7c3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICA7c3JjX3BpeGVsX3N0ZXAgICAgIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDIpIDtmbGltaXQgICAgIDsgZ2V0IGZsaW1pdAotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCBYTU1XT1JEIFBUUiBbcmR4XQotICAgICAgICBtb3YgICAgICAgICByZHgsIGFyZygzKSA7bGltaXQKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgWE1NV09SRCBQVFIgW3JkeF0KLQotICAgICAgICBwYWRkYiAgICAgICB4bW0zLCB4bW0zICAgICAgICAgICAgICA7IGZsaW1pdCoyIChsZXNzIHRoYW4gMjU1KQotICAgICAgICBwYWRkYiAgICAgICB4bW0zLCB4bW03ICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdCAobGVzcyB0aGFuIDI1NSkKLQotICAgICAgICBtb3YgICAgICAgICByZGksIHJzaSAgICAgICAgICAgICAgICA7IHJkaSBwb2ludHMgdG8gcm93ICsxIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgcmF4Ci0gICAgICAgIG5lZyAgICAgICAgIHJheAotCi0gICAgICAgIDsgY2FsY3VsYXRlIG1hc2sKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMSwgW3JzaSsyKnJheF0gICAgICAgOyBwMQotICAgICAgICBtb3ZkcXUgICAgICB4bW0wLCBbcmRpXSAgICAgICAgICAgICA7IHExCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgeG1tMAotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCB4bW0wCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTAsIHhtbTEgICAgICAgICAgICAgIDsgcTEtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsIHhtbTQgICAgICAgICAgICAgIDsgcDEtPXExCi0gICAgICAgIHBvciAgICAgICAgIHhtbTEsIHhtbTAgICAgICAgICAgICAgIDsgYWJzKHAxLXExKQotICAgICAgICBwYW5kICAgICAgICB4bW0xLCBbR0xPQkFMKHRmZSldICAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KLSAgICAgICAgcHNybHcgICAgICAgeG1tMSwgMSAgICAgICAgICAgICAgICAgOyBhYnMocDEtcTEpLzIKLQotICAgICAgICBtb3ZkcXUgICAgICB4bW01LCBbcnNpK3JheF0gICAgICAgICA7IHAwCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTQsIFtyc2ldICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgeG1tNCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCB4bW01ICAgICAgICAgICAgICA7IHAwCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsIHhtbTQgICAgICAgICAgICAgIDsgcDAtPXEwCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTQsIHhtbTYgICAgICAgICAgICAgIDsgcTAtPXAwCi0gICAgICAgIHBvciAgICAgICAgIHhtbTUsIHhtbTQgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApCi0gICAgICAgIHBhZGR1c2IgICAgIHhtbTUsIHhtbTUgICAgICAgICAgICAgIDsgYWJzKHAwLXEwKSoyCi0gICAgICAgIHBhZGR1c2IgICAgIHhtbTUsIHhtbTEgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgotCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTUsIHhtbTMgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yICA+IGZsaW1pdCAqIDIgKyBsaW1pdAotICAgICAgICBweG9yICAgICAgICB4bW0zLCB4bW0zCi0gICAgICAgIHBjbXBlcWIgICAgIHhtbTUsIHhtbTMKLQotICAgICAgICA7IHN0YXJ0IHdvcmsgb24gZmlsdGVycwotICAgICAgICBweG9yICAgICAgICB4bW0yLCBbR0xPQkFMKHQ4MCldICAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgW0dMT0JBTCh0ODApXSAgICAgOyBxMSBvZmZzZXQgdG8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgIHBzdWJzYiAgICAgIHhtbTIsIHhtbTcgICAgICAgICAgICAgIDsgcDEgLSBxMQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTYsIFtHTE9CQUwodDgwKV0gICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICBweG9yICAgICAgICB4bW0wLCBbR0xPQkFMKHQ4MCldICAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgOyBxMAotICAgICAgICBwc3Vic2IgICAgICB4bW0wLCB4bW02ICAgICAgICAgICAgICA7IHEwIC0gcDAKLSAgICAgICAgcGFkZHNiICAgICAgeG1tMiwgeG1tMCAgICAgICAgICAgICAgOyBwMSAtIHExICsgMSAqIChxMCAtIHAwKQotICAgICAgICBwYWRkc2IgICAgICB4bW0yLCB4bW0wICAgICAgICAgICAgICA7IHAxIC0gcTEgKyAyICogKHEwIC0gcDApCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTIsIHhtbTAgICAgICAgICAgICAgIDsgcDEgLSBxMSArIDMgKiAocTAgLSBwMCkKLSAgICAgICAgcGFuZCAgICAgICAgeG1tNSwgeG1tMiAgICAgICAgICAgICAgOyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAotCi0gICAgICAgIDsgZG8gKyA0IHNpZGUKLSAgICAgICAgcGFkZHNiICAgICAgeG1tNSwgW0dMT0JBTCh0NCldICAgICAgOyAzKiAocTAgLSBwMCkgKyAocDEgLSBxMSkgKyA0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgeG1tNSAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKLSAgICAgICAgcHNsbHcgICAgICAgeG1tMCwgOCAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDgKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMCwgMyAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzcmx3ICAgICAgIHhtbTAsIDgKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tNSAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgMTEgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzbGx3ICAgICAgIHhtbTEsIDggICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4IHRvIHB1dCBpdCBiYWNrCi0KLSAgICAgICAgcG9yICAgICAgICAgeG1tMCwgeG1tMSAgICAgICAgICAgICAgOyBwdXQgdGhlIHR3byB0b2dldGhlciB0byBnZXQgcmVzdWx0Ci0KLSAgICAgICAgcHN1YnNiICAgICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgOyBxMC09IHEwIGFkZAotICAgICAgICBweG9yICAgICAgICB4bW0zLCBbR0xPQkFMKHQ4MCldICAgICA7IHVub2Zmc2V0Ci0gICAgICAgIG1vdmRxdSAgICAgIFtyc2ldLCB4bW0zICAgICAgICAgICAgIDsgd3JpdGUgYmFjawotCi0gICAgICAgIDsgbm93IGRvICszIHNpZGUKLSAgICAgICAgcHN1YnNiICAgICAgeG1tNSwgW0dMT0JBTCh0MXMpXSAgICAgOyArMyBpbnN0ZWFkIG9mICs0Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgeG1tNSAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKLSAgICAgICAgcHNsbHcgICAgICAgeG1tMCwgOCAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDgKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMCwgMyAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzcmx3ICAgICAgIHhtbTAsIDgKLSAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgMTEgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzbGx3ICAgICAgIHhtbTUsIDggICAgICAgICAgICAgICAgIDsgc2hpZnQgbGVmdCA4IHRvIHB1dCBpdCBiYWNrCi0gICAgICAgIHBvciAgICAgICAgIHhtbTAsIHhtbTUgICAgICAgICAgICAgIDsgcHV0IHRoZSB0d28gdG9nZXRoZXIgdG8gZ2V0IHJlc3VsdAotCi0KLSAgICAgICAgcGFkZHNiICAgICAgeG1tNiwgeG1tMCAgICAgICAgICAgICAgOyBwMCs9IHAwIGFkZAotICAgICAgICBweG9yICAgICAgICB4bW02LCBbR0xPQkFMKHQ4MCldICAgICA7IHVub2Zmc2V0Ci0gICAgICAgIG1vdmRxdSAgICAgIFtyc2krcmF4XSwgeG1tNiAgICAgICAgIDsgd3JpdGUgYmFjawotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3BpeGVsX3N0ZXAsCi07ICAgIGNvbnN0IGNoYXIgKmZsaW1pdCwKLTsgICAgY29uc3QgY2hhciAqbGltaXQsCi07ICAgIGNvbnN0IGNoYXIgKnRocmVzaCwKLTsgICAgaW50IGNvdW50Ci07KQotZ2xvYmFsIHN5bSh2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMikKLXN5bSh2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwICAgICAgICAgOyBzYXZlIG9sZCBiYXNlIHBvaW50ZXIgdmFsdWUuCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AgICAgOyBzZXQgbmV3IGJhc2UgcG9pbnRlciB2YWx1ZS4KLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYnggICAgICAgICA7IHNhdmUgY2FsbGVlLXNhdmVkIHJlZwotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgQUxJR05fU1RBQ0sgMTYsIHJheAotICAgIHN1YiAgICAgICAgIHJzcCwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgOyByZXNlcnZlIDMyIGJ5dGVzCi0gICAgJWRlZmluZSB0MCAgW3JzcCArIDBdICAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MFsxNl07Ci0gICAgJWRlZmluZSB0MSAgW3JzcCArIDE2XSAgIDtfX2RlY2xzcGVjKGFsaWduKDE2KSkgY2hhciB0MVsxNl07Ci0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxfc3RlcCAgICAgOyBkZXN0aW5hdGlvbiBwaXRjaD8KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpIC0gMiBdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyc2kgKyByYXgqNF0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCArIHJheF0KLQotICAgICAgICBtb3ZkcXUgICAgICB4bW0wLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgICAgICA7IChoaWdoIDk2IGJpdHMgdW51c2VkKSAwMyAwMiAwMSAwMAotICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcmR4XSAgICAgICAgICAgICAgICAgICA7IChoaWdoIDk2IGJpdHMgdW51c2VkKSA0MyA0MiA0MSA0MAotICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICBbcmRpXSAgICAgICAgICAgICAgICAgICA7IDEzIDEyIDExIDEwCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyY3hdICAgICAgICAgICAgICAgICAgIDsgNTMgNTIgNTEgNTAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyAoaGlnaCA2NCBiaXRzIHVudXNlZCkgNDMgNDIgNDEgNDAgMDMgMDIgMDEgMDAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMiwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgOyA1MyA1MiA1MSA1MCAxMyAxMiAxMSAxMAotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyc2kgKyByYXgqMl0gICAgICAgICAgIDsgMjMgMjIgMjEgMjAKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNSwgICAgICAgW3JkeCArIHJheCoyXSAgICAgICAgICAgOyA2MyA2MiA2MSA2MAotICAgICAgICBtb3ZkcXUgICAgICB4bW02LCAgICAgICBbcmRpICsgcmF4KjJdICAgICAgICAgICA7IDMzIDMyIDMxIDMwCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTcsICAgICAgIFtyY3ggKyByYXgqMl0gICAgICAgICAgIDsgNzMgNzIgNzEgNzAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tNCwgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyA2MyA2MiA2MSA2MCAyMyAyMiAyMSAyMAotICAgICAgICBwdW5wY2tsZHEgICB4bW02LCAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICA7IDczIDcyIDcxIDcwIDMzIDMyIDMxIDMwCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgeG1tMiAgICAgICAgICAgICAgICAgICAgOyA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MCAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7IDczIDYzIDcyIDYyIDcxIDYxIDcwIDYwIDMzIDIzIDMyIDIyIDMxIDIxIDMwIDIwCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyIDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTEsICAgICAgIHhtbTQgICAgICAgICAgICAgICAgICAgIDsgNzMgNjMgNTMgNDMgNzIgNjIgNTIgNDIgNzEgNjEgNTEgNDEgNzAgNjAgNTAgNDAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTAsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHQwLCAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgc2F2ZSB0byB0MAotICAgICAgICBtb3ZkcWEgICAgICB0MSwgICAgICAgICB4bW0yICAgICAgICAgICAgICAgICAgICA7IHNhdmUgdG8gdDEKLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4KjhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyc2kgKyByYXgqNF0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCArIHJheF0KLQotICAgICAgICBtb3ZkcXUgICAgICB4bW00LCAgICAgICBbcnNpXSAgICAgICAgICAgICAgICAgICA7IDgzIDgyIDgxIDgwCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgIFtyZHhdICAgICAgICAgICAgICAgICAgIDsgYzMgYzIgYzEgYzAKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNiwgICAgICAgW3JkaV0gICAgICAgICAgICAgICAgICAgOyA5MyA5MiA5MSA5MAotICAgICAgICBtb3ZkcXUgICAgICB4bW0zLCAgICAgICBbcmN4XSAgICAgICAgICAgICAgICAgICA7IGQzIGQyIGQxIGQwCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTQsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsgYzMgYzIgYzEgYzAgODMgODIgODEgODAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tNiwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgOyBkMyBkMiBkMSBkMCA5MyA5MiA5MSA5MAotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFtyc2kgKyByYXgqMl0gICAgICAgICAgIDsgYTMgYTIgYTEgYTAKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNSwgICAgICAgW3JkeCArIHJheCoyXSAgICAgICAgICAgOyBlMyBlMiBlMSBlMAotICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICBbcmRpICsgcmF4KjJdICAgICAgICAgICA7IGIzIGIyIGIxIGIwCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTcsICAgICAgIFtyY3ggKyByYXgqMl0gICAgICAgICAgIDsgZjMgZjIgZjEgZjAKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBlMyBlMiBlMSBlMCBhMyBhMiBhMSBhMAotICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICA7IGYzIGYyIGYxIGYwIGIzIGIyIGIxIGIwCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tNiAgICAgICAgICAgICAgICAgICAgOyBkMyBjMyBkMiBjMiBkMSBjMSBkMCBjMCA5MyA4MyA5MiA4MiA5MSA4MSA5MCA4MAotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICB4bW0yICAgICAgICAgICAgICAgICAgICA7IGYzIGUzIGYyIGUyIGYxIGUxIGYwIGUwIGIzIGEzIGIyIGEyIGIxIGExIGIwIGEwCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tNAotICAgICAgICBwdW5wY2tsd2QgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICA7IGIzIGEzIDkzIDgzIGIyIGEyIDkyIDgyIGIxIGExIDkxIDgxIGIwIGEwIDkwIDgwCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgZjMgZTMgZDMgYzMgZjIgZTIgZDIgYzIgZjEgZTEgZDEgYzEgZjAgZTAgZDAgYzAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW00Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTQsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsgZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAKLSAgICAgICAgcHVucGNraGRxICAgeG1tNiwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIHQwICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgdDEgICAgICAgICAgICAgICAgICAgICAgOyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0wCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTIKLQotICAgICAgICBwdW5wY2tscWRxICB4bW0wLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7IHAxICBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotICAgICAgICBwdW5wY2tocWRxICB4bW0xLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7IHAwICBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQotICAgICAgICBwdW5wY2tscWRxICB4bW0yLCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7IHEwICBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MiA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotICAgICAgICBwdW5wY2tocWRxICB4bW0zLCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7IHExICBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMwotCi0gICAgICAgIDsgY2FsY3VsYXRlIG1hc2sKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMQotICAgICAgICBwc3VidXNiICAgICB4bW03LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTEtPXAxCi0gICAgICAgIHBzdWJ1c2IgICAgIHhtbTYsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMS09cTEKLSAgICAgICAgcG9yICAgICAgICAgeG1tNiwgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKLSAgICAgICAgcGFuZCAgICAgICAgeG1tNiwgICAgICAgW0dMT0JBTCh0ZmUpXSAgICAgICAgICAgICAgICAgICA7IHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KLSAgICAgICAgcHNybHcgICAgICAgeG1tNiwgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMAotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgcHN1YnVzYiAgICAgeG1tNSwgICAgICAgeG1tMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAwLT1xMAotICAgICAgICBwc3VidXNiICAgICB4bW00LCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtPXAwCi0gICAgICAgIHBvciAgICAgICAgIHhtbTUsICAgICAgIHhtbTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDAgLSBxMCkKLSAgICAgICAgcGFkZHVzYiAgICAgeG1tNSwgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMC1xMCkqMgotICAgICAgICBwYWRkdXNiICAgICB4bW01LCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzIChwMCAtIHEwKSAqMiArIGFicyhwMS1xMSkvMgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgICAgICAgICAgICAgO2ZsaW1pdAotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmR4XQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoMykgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ2V0IGxpbWl0Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyZHhdCi0gICAgICAgIHBhZGRiICAgICAgIHhtbTcsICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmbGltaXQqMiAobGVzcyB0aGFuIDI1NSkKLSAgICAgICAgcGFkZGIgICAgICAgeG1tNywgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGZsaW1pdCAqIDIgKyBsaW1pdCAobGVzcyB0aGFuIDI1NSkKLQotICAgICAgICBwc3VidXNiICAgICB4bW01LCAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAwIC0gcTApICoyICsgYWJzKHAxLXExKS8yICA+IGZsaW1pdCAqIDIgKyBsaW1pdAotICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgeG1tNwotICAgICAgICBwY21wZXFiICAgICB4bW01LCAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbW01ID0gbWFzawotCi0gICAgICAgIDsgc3RhcnQgd29yayBvbiBmaWx0ZXJzCi0gICAgICAgIG1vdmRxYSAgICAgICAgdDAsICAgICAgICB4bW0wCi0gICAgICAgIG1vdmRxYSAgICAgICAgdDEsICAgICAgICB4bW0zCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICA7IHAxIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgcHhvciAgICAgICAgeG1tMywgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICA7IHExIG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLQotICAgICAgICBwc3Vic2IgICAgICB4bW0wLCAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgeG1tMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAKLSAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICA7IG9mZnNldCB0byBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLQotICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0IHRvIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0ZWQgOyBxMAotCi0gICAgICAgIHBzdWJzYiAgICAgIHhtbTcsICAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBxMCAtIHAwCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTAsICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMSAtIHExICsgMSAqIChxMCAtIHAwKQotCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTAsICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMSAtIHExICsgMiAqIChxMCAtIHAwKQotICAgICAgICBwYWRkc2IgICAgICB4bW0wLCAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEgLSBxMSArIDMgKiAocTAgLSBwMCkKLQotICAgICAgICBwYW5kICAgICAgICB4bW01LCAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbWFzayBmaWx0ZXIgdmFsdWVzIHdlIGRvbid0IGNhcmUgYWJvdXQKLQotCi0gICAgICAgIHBhZGRzYiAgICAgIHhtbTUsICAgICAgICBbR0xPQkFMKHQ0KV0gICAgICAgICAgICAgICAgICAgOyAgMyogKHEwIC0gcDApICsgKHAxIC0gcTEpICsgNAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBnZXQgYSBjb3B5IG9mIGZpbHRlcnMKLSAgICAgICAgcHNsbHcgICAgICAgeG1tMCwgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0IGxlZnQgOAotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTAsICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExCi0gICAgICAgIHBzcmx3ICAgICAgIHhtbTAsICAgICAgICA4Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycwotICAgICAgICBwc3JhdyAgICAgICB4bW03LCAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQotCi0gICAgICAgIHBzbGx3ICAgICAgIHhtbTcsICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDggdG8gcHV0IGl0IGJhY2sKLSAgICAgICAgcG9yICAgICAgICAgeG1tMCwgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHB1dCB0aGUgdHdvIHRvZ2V0aGVyIHRvIGdldCByZXN1bHQKLQotICAgICAgICBwc3Vic2IgICAgICB4bW0zLCAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcTAtPSBxMHN6IGFkZAotICAgICAgICBweG9yICAgICAgICB4bW0zLCAgICAgICAgW0dMT0JBTCh0ODApXSAgICAgICAgICAgICAgICAgIDsgdW5vZmZzZXQgICBxMAotCi0gICAgICAgIDsgbm93IGRvICszIHNpZGUKLSAgICAgICAgcHN1YnNiICAgICAgeG1tNSwgICAgICAgIFtHTE9CQUwodDFzKV0gICAgICAgICAgICAgICAgICA7ICszIGluc3RlYWQgb2YgKzQKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCBhIGNvcHkgb2YgZmlsdGVycwotCi0gICAgICAgIHBzbGx3ICAgICAgIHhtbTAsICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDgKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMCwgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEKLQotICAgICAgICBwc3JsdyAgICAgICB4bW0wLCAgICAgICAgOAotICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMQotCi0gICAgICAgIHBzbGx3ICAgICAgIHhtbTUsICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCBsZWZ0IDggdG8gcHV0IGl0IGJhY2sKLSAgICAgICAgcG9yICAgICAgICAgeG1tMCwgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHB1dCB0aGUgdHdvIHRvZ2V0aGVyIHRvIGdldCByZXN1bHQKLQotICAgICAgICBwYWRkc2IgICAgICB4bW02LCAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDArPSBwMCBhZGQKLSAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgIFtHTE9CQUwodDgwKV0gICAgICAgICAgICAgICAgICA7IHVub2Zmc2V0ICAgcDAKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgdDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDEKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgIHQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHExCi0KLSAgICAgICAgOyB0cmFuc3Bvc2UgYmFjayB0byB3cml0ZSBvdXQKLSAgICAgICAgOyBwMSAgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgICAgICAgOyBwMCAgZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEKLSAgICAgICAgOyBxMCAgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLSAgICAgICAgOyBxMSAgZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAgMzEgMzAgMjEgMjAgMTEgMTAgMDEgMDAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tMSwgICAgICAgeG1tNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMwotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNzMgNzIgNjMgNjIgNTMgNTIgNDMgNDIgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICB4bW0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAgMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLSAgICAgICAgcHVucGNraHdkICAgeG1tMiwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwIDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICBwdW5wY2tsd2QgICB4bW0xLCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYjMgYjIgYjEgYjAgYTMgYTIgYTEgYTAgOTMgOTIgOTEgOTAgODMgODIgODEgODAKLSAgICAgICAgcHVucGNraHdkICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGYzIGYyIGYxIGYwIGUzIGUyIGUxIGUwIGQzIGQyIGQxIGQwIGMzIGMyIGMxIGMwCi0KLSAgICAgICAgOyB3cml0ZSBvdXQgb3JkZXI6IHhtbTAgeG1tMiB4bW0xIHhtbTMKLSAgICAgICAgbGVhICAgICAgICAgcmR4LCAgICAgICAgW3JzaSArIHJheCo0XQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2ldLCAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3cml0ZSB0aGUgc2Vjb25kIDgtbGluZSByZXN1bHQKLSAgICAgICAgcHNybGRxICAgICAgeG1tMSwgICAgICAgNAotICAgICAgICBtb3ZkICAgICAgICBbcmRpXSwgICAgICB4bW0xCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgIDQKLSAgICAgICAgbW92ZCAgICAgICAgW3JzaSArIHJheCoyXSwgeG1tMQotICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICA0Ci0gICAgICAgIG1vdmQgICAgICAgIFtyZGkgKyByYXgqMl0sIHhtbTEKLQotICAgICAgICBtb3ZkICAgICAgICBbcmR4XSwgICAgICB4bW0zCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTMsICAgICAgIDQKLSAgICAgICAgbW92ZCAgICAgICAgW3JjeF0sICAgICAgeG1tMwotICAgICAgICBwc3JsZHEgICAgICB4bW0zLCAgICAgICA0Ci0gICAgICAgIG1vdmQgICAgICAgIFtyZHggKyByYXgqMl0sIHhtbTMKLSAgICAgICAgcHNybGRxICAgICAgeG1tMywgICAgICAgNAotICAgICAgICBtb3ZkICAgICAgICBbcmN4ICsgcmF4KjJdLCB4bW0zCi0KLSAgICAgICAgbmVnICAgICAgICAgcmF4Ci0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXgqOF0KLSAgICAgICAgbmVnICAgICAgICAgcmF4Ci0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyc2kgKyByYXhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgIFtyc2kgKyByYXgqNF0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkeCArIHJheF0KLQotICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHdyaXRlIHRoZSBmaXJzdCA4LWxpbmUgcmVzdWx0Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTAsICAgICAgIDQKLSAgICAgICAgbW92ZCAgICAgICAgW3JkaV0sICAgICAgeG1tMAotICAgICAgICBwc3JsZHEgICAgICB4bW0wLCAgICAgICA0Ci0gICAgICAgIG1vdmQgICAgICAgIFtyc2kgKyByYXgqMl0sIHhtbTAKLSAgICAgICAgcHNybGRxICAgICAgeG1tMCwgICAgICAgNAotICAgICAgICBtb3ZkICAgICAgICBbcmRpICsgcmF4KjJdLCB4bW0wCi0KLSAgICAgICAgbW92ZCAgICAgICAgW3JkeF0sICAgICAgeG1tMgotICAgICAgICBwc3JsZHEgICAgICB4bW0yLCAgICAgICA0Ci0gICAgICAgIG1vdmQgICAgICAgIFtyY3hdLCAgICAgIHhtbTIKLSAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgNAotICAgICAgICBtb3ZkICAgICAgICBbcmR4ICsgcmF4KjJdLCB4bW0yCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTIsICAgICAgIDQKLSAgICAgICAgbW92ZCAgICAgICAgW3JjeCArIHJheCoyXSwgeG1tMgotCi0gICAgYWRkIHJzcCwgMzIKLSAgICBwb3AgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotdGZlOgotICAgIHRpbWVzIDE2IGRiIDB4ZmUKLWFsaWduIDE2Ci10ODA6Ci0gICAgdGltZXMgMTYgZGIgMHg4MAotYWxpZ24gMTYKLXQxczoKLSAgICB0aW1lcyAxNiBkYiAweDAxCi1hbGlnbiAxNgotdDM6Ci0gICAgdGltZXMgMTYgZGIgMHgwMwotYWxpZ24gMTYKLXQ0OgotICAgIHRpbWVzIDE2IGRiIDB4MDQKLWFsaWduIDE2Ci1vbmVzOgotICAgIHRpbWVzIDggZHcgMHgwMDAxCi1hbGlnbiAxNgotczk6Ci0gICAgdGltZXMgOCBkdyAweDA5MDAKLWFsaWduIDE2Ci1zNjM6Ci0gICAgdGltZXMgOCBkdyAweDAwM2YKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmMgYi92cDgvY29tbW9uL3g4Ni9sb29wZmlsdGVyX3g4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODM3YmMwLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9sb29wZmlsdGVyLmgiCi0KLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfYyk7Ci1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9jKTsKLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9jKTsKLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9tYmxvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfYyk7Ci1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9jKTsKLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9jKTsKLQotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCk7Ci1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCk7Ci1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9tbXgpOwotCi1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKTsKLXByb3RvdHlwZV9sb29wZmlsdGVyKHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMik7Ci1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIpOwotcHJvdG90eXBlX2xvb3BmaWx0ZXIodnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2Vfc3NlMik7Ci1wcm90b3R5cGVfbG9vcGZpbHRlcih2cDhfZmFzdF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlc19zc2UyKTsKLQotZXh0ZXJuIGxvb3BfZmlsdGVyX3V2ZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyOwotZXh0ZXJuIGxvb3BfZmlsdGVyX3V2ZnVuY3Rpb24gdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfdXZfc3NlMjsKLWV4dGVybiBsb29wX2ZpbHRlcl91dmZ1bmN0aW9uIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyOwotZXh0ZXJuIGxvb3BfZmlsdGVyX3V2ZnVuY3Rpb24gdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyOwotCi0jaWYgSEFWRV9NTVgKLS8qIEhvcml6b250YWwgTUIgZmlsdGVyaW5nICovCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhfbW14KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9tYmxvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCh1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLQotICAgIGlmICh2X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCh2X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLX0KLQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYmhzX21teCh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX21teCh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotCi0KLS8qIFZlcnRpY2FsIE1CIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2X21teCh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLQotICAgIGlmICh2X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgodl9wdHIsIHV2X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMSk7Ci19Ci0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJ2c19tbXgodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHVfcHRyOwotICAgICh2b2lkKSB2X3B0cjsKLSAgICAodm9pZCkgdXZfc3RyaWRlOwotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2VfbW14KHlfcHRyLCB5X3N0cmlkZSwgbGZpLT5tYmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci19Ci0KLQotLyogSG9yaXpvbnRhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYmhfbW14KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIgKyAxMiAqIHlfc3RyaWRlLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCh1X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotCi0gICAgaWYgKHZfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX21teCh2X3B0ciArIDQgKiB1dl9zdHJpZGUsIHV2X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDEpOwotfQotCi0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2Joc19tbXgodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX21teCh5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9tbXgoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2VfbW14KHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotCi0vKiBWZXJ0aWNhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfbW14KHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KHlfcHRyICsgNCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgoeV9wdHIgKyA4LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9tbXgodV9wdHIgKyA0LCB1dl9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAxKTsKLQotICAgIGlmICh2X3B0cikKLSAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3ZlcnRpY2FsX2VkZ2VfbW14KHZfcHRyICsgNCwgdXZfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMSk7Ci19Ci0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZzX21teCh1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDQsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDgsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX21teCh5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotI2VuZGlmCi0KLQotLyogSG9yaXpvbnRhbCBNQiBmaWx0ZXJpbmcgKi8KLSNpZiBIQVZFX1NTRTIKLXZvaWQgdnA4X2xvb3BfZmlsdGVyX21iaF9zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMih5X3B0ciwgeV9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotCi0gICAgaWYgKHVfcHRyKQotICAgICAgICB2cDhfbWJsb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2VfdXZfc3NlMih1X3B0ciwgdXZfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCB2X3B0cik7Ci19Ci0KLQotdm9pZCB2cDhfbG9vcF9maWx0ZXJfbWJoc19zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotCi0vKiBWZXJ0aWNhbCBNQiBGaWx0ZXJpbmcgKi8KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX21idl9zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbWJsb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3NzZTIoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X21ibG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV91dl9zc2UyKHVfcHRyLCB1dl9zdHJpZGUsIGxmaS0+bWJmbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIHZfcHRyKTsKLX0KLQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9tYnZzX3NzZTIodW5zaWduZWQgY2hhciAqeV9wdHIsIHVuc2lnbmVkIGNoYXIgKnVfcHRyLCB1bnNpZ25lZCBjaGFyICp2X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIoeV9wdHIsIHlfc3RyaWRlLCBsZmktPm1iZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotCi0vKiBIb3Jpem9udGFsIEIgRmlsdGVyaW5nICovCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9iaF9zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHV2X3N0cmlkZSwgbG9vcF9maWx0ZXJfaW5mbyAqbGZpLCBpbnQgc2ltcGxlcl9scGYpCi17Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9ob3Jpem9udGFsX2VkZ2Vfc3NlMih5X3B0ciArIDQgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIgKyA4ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV9zc2UyKHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLQotICAgIGlmICh1X3B0cikKLSAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2hvcml6b250YWxfZWRnZV91dl9zc2UyKHVfcHRyICsgNCAqIHV2X3N0cmlkZSwgdXZfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgdl9wdHIgKyA0ICogdXZfc3RyaWRlKTsKLX0KLQotCi12b2lkIHZwOF9sb29wX2ZpbHRlcl9iaHNfc3NlMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgdXZfc3RyaWRlLCBsb29wX2ZpbHRlcl9pbmZvICpsZmksIGludCBzaW1wbGVyX2xwZikKLXsKLSAgICAodm9pZCkgdV9wdHI7Ci0gICAgKHZvaWQpIHZfcHRyOwotICAgICh2b2lkKSB1dl9zdHJpZGU7Ci0gICAgKHZvaWQpIHNpbXBsZXJfbHBmOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfaG9yaXpvbnRhbF9lZGdlX3NzZTIoeV9wdHIgKyA0ICogeV9zdHJpZGUsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV9ob3Jpem9udGFsX2VkZ2Vfc3NlMih5X3B0ciArIDggKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX2hvcml6b250YWxfZWRnZV9zc2UyKHlfcHRyICsgMTIgKiB5X3N0cmlkZSwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLQotCi0vKiBWZXJ0aWNhbCBCIEZpbHRlcmluZyAqLwotdm9pZCB2cDhfbG9vcF9maWx0ZXJfYnZfc3NlMih1bnNpZ25lZCBjaGFyICp5X3B0ciwgdW5zaWduZWQgY2hhciAqdV9wdHIsIHVuc2lnbmVkIGNoYXIgKnZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSBzaW1wbGVyX2xwZjsKLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgNCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgOCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgMTIsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0KLSAgICBpZiAodV9wdHIpCi0gICAgICAgIHZwOF9sb29wX2ZpbHRlcl92ZXJ0aWNhbF9lZGdlX3V2X3NzZTIodV9wdHIgKyA0LCB1dl9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCB2X3B0ciArIDQpOwotfQotCi0KLXZvaWQgdnA4X2xvb3BfZmlsdGVyX2J2c19zc2UyKHVuc2lnbmVkIGNoYXIgKnlfcHRyLCB1bnNpZ25lZCBjaGFyICp1X3B0ciwgdW5zaWduZWQgY2hhciAqdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1dl9zdHJpZGUsIGxvb3BfZmlsdGVyX2luZm8gKmxmaSwgaW50IHNpbXBsZXJfbHBmKQotewotICAgICh2b2lkKSB1X3B0cjsKLSAgICAodm9pZCkgdl9wdHI7Ci0gICAgKHZvaWQpIHV2X3N0cmlkZTsKLSAgICAodm9pZCkgc2ltcGxlcl9scGY7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIoeV9wdHIgKyA0LCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgOCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMih5X3B0ciArIDEyLCB5X3N0cmlkZSwgbGZpLT5mbGltLCBsZmktPmxpbSwgbGZpLT50aHIsIDIpOwotfQotCi0jZW5kaWYKLQotI2lmIDAKLXZvaWQgdnA4X2Zhc3RfbG9vcF9maWx0ZXJfdmVydGljYWxfZWRnZXNfc3NlKHVuc2lnbmVkIGNoYXIgKnlfcHRyLAotICAgICAgICBpbnQgeV9zdHJpZGUsCi0gICAgICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSkKLXsKLQotICAgIHZwOF9sb29wX2ZpbHRlcl9zaW1wbGVfdmVydGljYWxfZWRnZV9zc2UyKHlfcHRyICsgNCwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLSAgICB2cDhfbG9vcF9maWx0ZXJfc2ltcGxlX3ZlcnRpY2FsX2VkZ2Vfc3NlMih5X3B0ciArIDgsIHlfc3RyaWRlLCBsZmktPmZsaW0sIGxmaS0+bGltLCBsZmktPnRociwgMik7Ci0gICAgdnA4X2xvb3BfZmlsdGVyX3NpbXBsZV92ZXJ0aWNhbF9lZGdlX3NzZTIoeV9wdHIgKyAxMiwgeV9zdHJpZGUsIGxmaS0+ZmxpbSwgbGZpLT5saW0sIGxmaS0+dGhyLCAyKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl94ODYuaCBiL3ZwOC9jb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZGJlYmMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvbG9vcGZpbHRlcl94ODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBMT09QRklMVEVSX1g4Nl9ICi0jZGVmaW5lIExPT1BGSUxURVJfWDg2X0gKLQotLyogTm90ZToKLSAqCi0gKiBUaGlzIHBsYXRmb3JtIGlzIGNvbW1vbmx5IGJ1aWx0IGZvciBydW50aW1lIENQVSBkZXRlY3Rpb24uIElmIHlvdSBtb2RpZnkKLSAqIGFueSBvZiB0aGUgZnVuY3Rpb24gbWFwcGluZ3MgcHJlc2VudCBpbiB0aGlzIGZpbGUsIGJlIHN1cmUgdG8gYWxzbyB1cGRhdGUKLSAqIHRoZW0gaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW5pdGlhbGl6YXRpb24gY29kZQotICovCi0KLSNpZiBIQVZFX01NWAotZXh0ZXJuIHByb3RvdHlwZV9sb29wZmlsdGVyX2Jsb2NrKHZwOF9sb29wX2ZpbHRlcl9tYnZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYnZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfbWJoX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX2JoX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21idnNfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYnZzX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21iaHNfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYmhzX21teCk7Ci0KLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9sZl9ub3JtYWxfbWJfdgotI2RlZmluZSB2cDhfbGZfbm9ybWFsX21iX3YgdnA4X2xvb3BfZmlsdGVyX21idl9tbXgKLQotI3VuZGVmICB2cDhfbGZfbm9ybWFsX2JfdgotI2RlZmluZSB2cDhfbGZfbm9ybWFsX2JfdiB2cDhfbG9vcF9maWx0ZXJfYnZfbW14Ci0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9tYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfbWJfaCB2cDhfbG9vcF9maWx0ZXJfbWJoX21teAotCi0jdW5kZWYgIHZwOF9sZl9ub3JtYWxfYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfYl9oIHZwOF9sb29wX2ZpbHRlcl9iaF9tbXgKLQotI3VuZGVmICB2cDhfbGZfc2ltcGxlX21iX3YKLSNkZWZpbmUgdnA4X2xmX3NpbXBsZV9tYl92IHZwOF9sb29wX2ZpbHRlcl9tYnZzX21teAotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfYl92Ci0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfYl92IHZwOF9sb29wX2ZpbHRlcl9idnNfbW14Ci0KLSN1bmRlZiAgdnA4X2xmX3NpbXBsZV9tYl9oCi0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfbWJfaCB2cDhfbG9vcF9maWx0ZXJfbWJoc19tbXgKLQotI3VuZGVmICB2cDhfbGZfc2ltcGxlX2JfaAotI2RlZmluZSB2cDhfbGZfc2ltcGxlX2JfaCB2cDhfbG9vcF9maWx0ZXJfYmhzX21teAotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgSEFWRV9TU0UyCi1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21idl9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYnZfc3NlMik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21iaF9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYmhfc3NlMik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX21idnNfc3NlMik7Ci1leHRlcm4gcHJvdG90eXBlX2xvb3BmaWx0ZXJfYmxvY2sodnA4X2xvb3BfZmlsdGVyX2J2c19zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfbWJoc19zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfbG9vcGZpbHRlcl9ibG9jayh2cDhfbG9vcF9maWx0ZXJfYmhzX3NzZTIpOwotCi0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfbGZfbm9ybWFsX21iX3YKLSNkZWZpbmUgdnA4X2xmX25vcm1hbF9tYl92IHZwOF9sb29wX2ZpbHRlcl9tYnZfc3NlMgotCi0jdW5kZWYgIHZwOF9sZl9ub3JtYWxfYl92Ci0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfYl92IHZwOF9sb29wX2ZpbHRlcl9idl9zc2UyCi0KLSN1bmRlZiAgdnA4X2xmX25vcm1hbF9tYl9oCi0jZGVmaW5lIHZwOF9sZl9ub3JtYWxfbWJfaCB2cDhfbG9vcF9maWx0ZXJfbWJoX3NzZTIKLQotI3VuZGVmICB2cDhfbGZfbm9ybWFsX2JfaAotI2RlZmluZSB2cDhfbGZfbm9ybWFsX2JfaCB2cDhfbG9vcF9maWx0ZXJfYmhfc3NlMgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfbWJfdgotI2RlZmluZSB2cDhfbGZfc2ltcGxlX21iX3YgdnA4X2xvb3BfZmlsdGVyX21idnNfc3NlMgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfYl92Ci0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfYl92IHZwOF9sb29wX2ZpbHRlcl9idnNfc3NlMgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfbWJfaAotI2RlZmluZSB2cDhfbGZfc2ltcGxlX21iX2ggdnA4X2xvb3BfZmlsdGVyX21iaHNfc3NlMgotCi0jdW5kZWYgIHZwOF9sZl9zaW1wbGVfYl9oCi0jZGVmaW5lIHZwOF9sZl9zaW1wbGVfYl9oIHZwOF9sb29wX2ZpbHRlcl9iaHNfc3NlMgotI2VuZGlmCi0jZW5kaWYKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX21teC5hc20gYi92cDgvY29tbW9uL3g4Ni9wb3N0cHJvY19tbXguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODdlODMyLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX21teC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi0lZGVmaW5lIFZQOF9GSUxURVJfV0VJR0hUIDEyOAotJWRlZmluZSBWUDhfRklMVEVSX1NISUZUICA3Ci0KLTt2b2lkIHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotOyAgICBpbnQgcm93cywKLTsgICAgaW50IGNvbHMsCi07ICAgIGludCBmbGltaXQKLTspCi1nbG9iYWwgc3ltKHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21teCkKLXN5bSh2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc19tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNwotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0laWYgQUJJX0lTXzMyQklUPTEgJiYgQ09ORklHX1BJQz0xCi0gICAgOyBtb3ZlIHRoZSBnbG9iYWwgcmQgb250byB0aGUgc3RhY2ssIHNpbmNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIHJlZ2lzdGVycwotICAgIDsgdG8gZG8gUElDIGFkZHJlc3NpbmcKLSAgICBtb3ZxICAgICAgICBtbTAsIFtHTE9CQUwocmQpXQotICAgIHN1YiAgICAgICAgIHJzcCwgOAotICAgIG1vdnEgICAgICAgIFtyc3BdLCBtbTAKLSVkZWZpbmUgUkQgW3JzcF0KLSVlbHNlCi0lZGVmaW5lIFJEIFtHTE9CQUwocmQpXQotJWVuZGlmCi0KLSAgICAgICAgcHVzaCAgICAgICAgcmJ4Ci0gICAgICAgIGxlYSAgICAgICAgIHJieCwgW0dMT0JBTChCbHVyKV0KLSAgICAgICAgbW92ZCAgICAgICAgbW0yLCBkd29yZCBwdHIgYXJnKDYpIDtmbGltaXQKLSAgICAgICAgcHVucGNrbHdkICAgbW0yLCBtbTIKLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCBtbTIKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpIDtkc3RfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgYXJnKDQpIDtyb3dzCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgRFdPUkQgUFRSIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZSA7IGRlc3RpbmF0aW9uIHBpdGNoPwotICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgOyBtbTAgPSAwMDAwMDAwMAotCi1uZXh0cm93OgotCi0gICAgICAgIHhvciAgICAgICAgIHJkeCwgICAgICAgIHJkeCAgICAgICA7IGNsZWFyIG91dCByZHggZm9yIHVzZSBhcyBsb29wIGNvdW50ZXIKLW5leHRjb2w6Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCBtbTcgICAgICAgICAgICAgIDsgbW03ID0gMDAwMDAwMDAKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4ICsgMzIgXSAgICAgIDsgbW02ID0ga2VybmVsIDIgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyc2ldICAgICAgICAgICAgOyBtbTQgPSByMCBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgbW0zID0gcDAuLnAzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgbW0zICAgICAgICAgICAgICA7IG1tMSA9IHAwLi5wMwotICAgICAgICBwbXVsbHcgICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOyBtbTMgKj0ga2VybmVsIDIgbW9kaWZpZXJzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4ICsgNDhdICAgICAgIDsgbW02ID0ga2VybmVsIDMgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTUsIFtyc2kgKyByYXhdICAgICAgOyBtbTQgPSByMSBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCBtbTAgICAgICAgICAgICAgIDsgbW01ID0gcjEgcDAuLnAzCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IG1tNiAqPSBwMC4ucDMgKiBrZXJuZWwgMyBtb2RpZmllcnMKLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgbW0zICs9IG1tNgotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgbW0xICAgICAgICAgICAgICA7IG1tNyA9IHIwIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTcsIG1tNSAgICAgICAgICAgICAgOyBtbTcgPSByMCBwMC4ucDMgLSByMSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgbW01ID0gcjEgcDAuLnAzIC0gcjAgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNywgbW01ICAgICAgICAgICAgICA7IG1tNyA9IGFicyhyMCBwMC4ucDMgLSByMSBwMC4ucDMpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNywgbW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4ICsgNjQgXSAgICAgIDsgbW02ID0ga2VybmVsIDQgbW9kaWZpZXJzCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgW3JzaSArIDIqcmF4XSAgICA7IG1tNCA9IHIyIHAwLi5wNwotICAgICAgICBwdW5wY2tsYncgICBtbTUsIG1tMCAgICAgICAgICAgICAgOyBtbTUgPSByMiBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgbW01ICo9IGtlcm5lbCA0IG1vZGlmaWVycwotICAgICAgICBwYWRkdXN3ICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgOyB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTEgICAgICAgICAgICAgIDsgbW02ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IG1tNiA9IHIwIHAwLi5wMyAtIHIyIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTUsIG1tMSAgICAgICAgICAgICAgOyBtbTUgPSByMiBwMC4ucDMgLSByMiBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHIyIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgbW02LCBtbTIKLSAgICAgICAgcG9yICAgICAgICAgbW03LCBtbTYgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLQotICAgICAgICBuZWcgICAgICAgICByYXgKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4IF0gICAgICAgICAgIDsga2VybmVsIDAgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTUsIFtyc2krMipyYXhdICAgICAgOyBtbTQgPSByLTIgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgbW0wICAgICAgICAgICAgICA7IG1tNSA9IHItMiBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgbW01ICo9IGtlcm5lbCAwIG1vZGlmaWVycwotICAgICAgICBwYWRkdXN3ICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgOyB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTEgICAgICAgICAgICAgIDsgbW02ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IG1tNiA9IHAwLi5wMyAtIHItMiBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgbW01ID0gci0yIHAwLi5wMyAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBtbTYgPSBhYnMocjAgcDAuLnAzIC0gci0yIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgbW02LCBtbTIKLSAgICAgICAgcG9yICAgICAgICAgbW03LCBtbTYgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4ICsgMTZdICAgICAgIDsga2VybmVsIDEgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2krcmF4XSAgICAgICAgOyBtbTQgPSByLTEgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgbW0wICAgICAgICAgICAgICA7IG1tNCA9IHItMSBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsgbW00ICo9IGtlcm5lbCAxIG1vZGlmaWVycy4KLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7IG1tNiA9IHIwIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgOyBtbTYgPSBwMC4ucDMgLSByLTIgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIG1tNCwgbW0xICAgICAgICAgICAgICA7IG1tNSA9IHItMSBwMC4ucDMgLSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHItMSBwMC4ucDMpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNiwgbW0yCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgbW02ICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0KLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBSRCAgICAgICAgICAgICAgIDsgbW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgVlA4X0ZJTFRFUl9TSElGVCAgICAgOyBtbTMgLz0gMTI4Ci0KLSAgICAgICAgcGFuZCAgICAgICAgbW0xLCBtbTcgICAgICAgICAgICAgIDsgbW0xIHNlbGVjdCB2YWxzID4gdGhyZXNoIGZyb20gc291cmNlCi0gICAgICAgIHBhbmRuICAgICAgIG1tNywgbW0zICAgICAgICAgICAgICA7IG1tNyBzZWxlY3QgdmFscyA8IHRocmVzaCBmcm9tIGJsdXJyZWQgcmVzdWx0Ci0gICAgICAgIHBhZGR1c3cgICAgIG1tMSwgbW03ICAgICAgICAgICAgICA7IGNvbWJpbmF0aW9uCi0KLSAgICAgICAgcGFja3Vzd2IgICAgbW0xLCBtbTAgICAgICAgICAgICAgIDsgcGFjayB0byBieXRlcwotCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGldLCBtbTEgICAgICAgICAgICA7Ci0gICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICA7IHBpdGNoIGlzIHBvc2l0aXZlCi0KLQotICAgICAgICBhZGQgICAgICAgICByc2ksIDQKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCA0Ci0gICAgICAgIGFkZCAgICAgICAgIHJkeCwgNAotCi0gICAgICAgIGNtcCAgICAgICAgIGVkeCwgZHdvcmQgcHRyIGFyZyg1KSA7Y29scwotICAgICAgICBqbCAgICAgICAgICBuZXh0Y29sCi0gICAgICAgIDsgZG9uZSB3aXRoIHRoZSBhbGwgY29scywgc3RhcnQgdGhlIGFjcm9zcyBmaWx0ZXJpbmcgaW4gcGxhY2UKLSAgICAgICAgc3ViICAgICAgICAgcnNpLCByZHgKLSAgICAgICAgc3ViICAgICAgICAgcmRpLCByZHgKLQotCi0gICAgICAgIHB1c2ggICAgICAgIHJheAotICAgICAgICB4b3IgICAgICAgICByZHgsICAgIHJkeAotICAgICAgICBtb3YgICAgICAgICByYXgsICAgIFtyZGktNF07Ci0KLWFjcm9zc25leHRjb2w6Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICA7IG1tNyA9IDAwMDAwMDAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JieCArIDMyIF0gICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgW3JkaStyZHhdICAgICAgICA7IG1tNCA9IHAwLi5wNwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBtbTMgPSBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgbW0zID0gcDAuLnAzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgbW0zICAgICAgICAgICAgICA7IG1tMSA9IHAwLi5wMwotICAgICAgICBwbXVsbHcgICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOyBtbTMgKj0ga2VybmVsIDIgbW9kaWZpZXJzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4ICsgNDhdCi0gICAgICAgIHBzcmxxICAgICAgIG1tNCwgOCAgICAgICAgICAgICAgICA7IG1tNCA9IHAxLi5wNwotICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOyBtbTUgPSBwMS4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCBtbTAgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IG1tNiAqPSBwMS4ucDQgKiBrZXJuZWwgMyBtb2RpZmllcnMKLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgbW0zICs9IG1tNgotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgbW0xICAgICAgICAgICAgICA7IG1tNyA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTcsIG1tNSAgICAgICAgICAgICAgOyBtbTcgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNywgbW01ICAgICAgICAgICAgICA7IG1tNyA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNywgbW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbcmJ4ICsgNjQgXQotICAgICAgICBwc3JscSAgICAgICBtbTQsIDggICAgICAgICAgICAgICAgOyBtbTQgPSBwMi4ucDcKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsgbW01ID0gcDIuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgbW0wICAgICAgICAgICAgICA7IG1tNSA9IHAyLi5wNQotICAgICAgICBwbXVsbHcgICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBtbTUgKj0ga2VybmVsIDQgbW9kaWZpZXJzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tMywgbW02ICAgICAgICAgICAgICA7IG1tMyArPSBtbTUKLQotICAgICAgICA7IHRocmVzaG9sZGluZwotICAgICAgICBtb3ZxICAgICAgICBtbTYsIG1tMSAgICAgICAgICAgICAgOyBtbTYgPSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsgbW02ID0gcDAuLnAzIC0gcDEuLnA0Ci0gICAgICAgIHBzdWJ1c3cgICAgIG1tNSwgbW0xICAgICAgICAgICAgICA7IG1tNSA9IHAxLi5wNCAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBtbTYgPSBhYnMocDAuLnAzIC0gcDEuLnA0KQotICAgICAgICBwY21wZ3R3ICAgICBtbTYsIG1tMgotICAgICAgICBwb3IgICAgICAgICBtbTcsIG1tNiAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIHRocmVzaG9sZHMKLQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JieCBdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgW3JkaStyZHgtMl0gICAgICA7IG1tNCA9IHAtMi4ucDUKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsgbW01ID0gcC0yLi5wNQotICAgICAgICBwdW5wY2tsYncgICBtbTUsIG1tMCAgICAgICAgICAgICAgOyBtbTUgPSBwLTIuLnAxCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IG1tNSAqPSBrZXJuZWwgMCBtb2RpZmllcnMKLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7IG1tNiA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOyBtbTYgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7IG1tNiA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNiwgbW0yCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgbW02ICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW3JieCArIDE2XQotICAgICAgICBwc3JscSAgICAgICBtbTQsIDggICAgICAgICAgICAgICAgOyBtbTQgPSBwLTEuLnA1Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgbW0wICAgICAgICAgICAgICA7IG1tNCA9IHAtMS4ucDIKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsgbW00ICo9IGtlcm5lbCAxIG1vZGlmaWVycy4KLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7IG1tNiA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgOyBtbTYgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgbW00LCBtbTEgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNiwgbW00ICAgICAgICAgICAgICA7IG1tNiA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNiwgbW0yCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgbW02ICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0gICAgICAgIHBhZGR1c3cgICAgIG1tMywgUkQgICAgICAgICAgICAgICA7IG1tMyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICBtbTMsIFZQOF9GSUxURVJfU0hJRlQgICAgIDsgbW0zIC89IDEyOAotCi0gICAgICAgIHBhbmQgICAgICAgIG1tMSwgbW03ICAgICAgICAgICAgICA7IG1tMSBzZWxlY3QgdmFscyA+IHRocmVzaCBmcm9tIHNvdXJjZQotICAgICAgICBwYW5kbiAgICAgICBtbTcsIG1tMyAgICAgICAgICAgICAgOyBtbTcgc2VsZWN0IHZhbHMgPCB0aHJlc2ggZnJvbSBibHVycmVkIHJlc3VsdAotICAgICAgICBwYWRkdXN3ICAgICBtbTEsIG1tNyAgICAgICAgICAgICAgOyBjb21iaW5hdGlvbgotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgbW0wICAgICAgICAgICAgICA7IHBhY2sgdG8gYnl0ZXMKLSAgICAgICAgbW92ICAgICAgICAgRFdPUkQgUFRSIFtyZGkrcmR4LTRdLCAgZWF4ICAgOyBzdG9yZSBwcmV2aW91cyBmb3VyIGJ5dGVzCi0gICAgICAgIG1vdmQgICAgICAgIGVheCwgICAgbW0xCi0KLSAgICAgICAgYWRkICAgICAgICAgcmR4LCA0Ci0gICAgICAgIGNtcCAgICAgICAgIGVkeCwgZHdvcmQgcHRyIGFyZyg1KSA7Y29scwotICAgICAgICBqbCAgICAgICAgICBhY3Jvc3NuZXh0Y29sOwotCi0gICAgICAgIG1vdiAgICAgICAgIERXT1JEIFBUUiBbcmRpK3JkeC00XSwgIGVheAotICAgICAgICBwb3AgICAgICAgICByYXgKLQotICAgICAgICA7IGRvbmUgd2l0aCB0aGlzIHJ3bwotICAgICAgICBhZGQgICAgICAgICByc2kscmF4ICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDMpIDtkc3RfcGl4ZWxzX3Blcl9saW5lIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0gICAgICAgIGFkZCAgICAgICAgIHJkaSxyYXggICAgICAgICAgICAgICA7IG5leHQgZGVzdGluYXRpb24KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDIpIDtzcmNfcGl4ZWxzX3Blcl9saW5lIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgZGVjICAgICAgICAgcmN4ICAgICAgICAgICAgICAgICAgIDsgZGVjcmVtZW50IGNvdW50Ci0gICAgICAgIGpueiAgICAgICAgIG5leHRyb3cgICAgICAgICAgICAgICA7IG5leHQgcm93Ci0gICAgICAgIHBvcCAgICAgICAgIHJieAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotJXVuZGVmIFJECi0KLQotO3ZvaWQgdnA4X21icG9zdF9wcm9jX2Rvd25fbW14KHVuc2lnbmVkIGNoYXIgKmRzdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLGludCBmbGltaXQpCi1leHRlcm4gc3ltKHZwOF9ydikKLWdsb2JhbCBzeW0odnA4X21icG9zdF9wcm9jX2Rvd25fbW14KQotc3ltKHZwOF9tYnBvc3RfcHJvY19kb3duX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxMzYKLQotICAgIDsgdW5zaWduZWQgY2hhciBkWzE2XVs4XSBhdCBbcnNwXQotICAgIDsgY3JlYXRlIGZsaW1pdDIgYXQgW3JzcCsxMjhdCi0gICAgbW92ICAgICAgICAgZWF4LCBkd29yZCBwdHIgYXJnKDQpIDtmbGltaXQKLSAgICBtb3YgICAgICAgICBbcnNwKzEyOF0sIGVheAotICAgIG1vdiAgICAgICAgIFtyc3ArMTI4KzRdLCBlYXgKLSVkZWZpbmUgZmxpbWl0MiBbcnNwKzEyOF0KLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgbGVhICAgICAgICAgcjgsICAgICAgIFtHTE9CQUwoc3ltKHZwOF9ydikpXQotJWVuZGlmCi0KLSAgICA7cm93cyArPTg7Ci0gICAgYWRkICAgICAgICAgZHdvcmQgcHRyIGFyZygyKSwgOAotCi0gICAgO2ZvcihjPTA7IGM8Y29sczsgYys9NCkKLWxvb3BfY29sOgotICAgICAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICA7cwotICAgICAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgbW0wICAgICA7Ci0KLSAgICAgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3BpdGNoICAgICAgIDsKLSAgICAgICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHJheCA9IC1waXRjaAotCi0gICAgICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4KjhdOyAgICAgICAgICAgICAgOyByZGkgPSBzWy1waXRjaCo4XQotICAgICAgICAgICAgbmVnICAgICAgICAgcmF4Ci0KLQotICAgICAgICAgICAgcHhvciAgICAgICAgbW01LCAgICAgICAgbW01Ci0gICAgICAgICAgICBweG9yICAgICAgICBtbTYsICAgICAgICBtbTYgICAgIDsKLQotICAgICAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03ICAgICA7Ci0gICAgICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICByc2kKLQotICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgMTUgICAgICAgICAgOwotCi1sb29wX2luaXR2YXI6Ci0gICAgICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3JkaV07Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTAgICAgIDsKLQotICAgICAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgbW0xICAgICA7Ci0gICAgICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTEgICAgIDsKLQotICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xICAgICA7Ci0gICAgICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTAgICAgIDsKLQotICAgICAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgbW0wICAgICA7Ci0gICAgICAgICAgICBwYWRkZCAgICAgICBtbTYsICAgICAgICBtbTEgICAgIDsKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgbW03LCAgICAgICAgbW0yICAgICA7Ci0gICAgICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JheF0gICA7Ci0KLSAgICAgICAgICAgIGRlYyAgICAgICAgIHJjeAotICAgICAgICAgICAgam5lICAgICAgICAgbG9vcF9pbml0dmFyCi0gICAgICAgICAgICA7c2F2ZSB0aGUgdmFyIGFuZCBzdW0KLSAgICAgICAgICAgIHhvciAgICAgICAgIHJkeCwgICAgICAgIHJkeAotbG9vcF9yb3c6Ci0gICAgICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3JzaV0gICAgIDsgW3MtcGl0Y2gqOF0KLSAgICAgICAgICAgIG1vdmQgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcmRpXSAgICAgOyBbcytwaXRjaCo3XQotCi0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgICAgICBtbTAKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMiwgICAgICAgIG1tMAotCi0gICAgICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICBtbTIKLSAgICAgICAgICAgIHBzdWJ3ICAgICAgIG1tNSwgICAgICAgIG1tMQotCi0gICAgICAgICAgICBwbXVsbHcgICAgICBtbTIsICAgICAgICBtbTIKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tMgotCi0gICAgICAgICAgICBwdW5wY2tsd2QgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgIG1tMAotCi0gICAgICAgICAgICBwYWRkZCAgICAgICBtbTYsICAgICAgICBtbTIKLSAgICAgICAgICAgIHBhZGRkICAgICAgIG1tNywgICAgICAgIG1tNAotCi0gICAgICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTEKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMQotCi0gICAgICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTAKLSAgICAgICAgICAgIHBzdWJkICAgICAgIG1tNiwgICAgICAgIG1tMQotCi0gICAgICAgICAgICBwdW5wY2tod2QgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgICAgIHBzdWJkICAgICAgIG1tNywgICAgICAgIG1tMgotCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tNgotICAgICAgICAgICAgcHNsbGQgICAgICAgbW0zLCAgICAgICAgNAotCi0gICAgICAgICAgICBwc3ViZCAgICAgICBtbTMsICAgICAgICBtbTYKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgIG1tNQotCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTUKLSAgICAgICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tMQotCi0gICAgICAgICAgICBwbXVsaHcgICAgICBtbTQsICAgICAgICBtbTQKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMQotCi0gICAgICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICBtbTQKLSAgICAgICAgICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgIG1tNAotCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTcKLSAgICAgICAgICAgIHBzbGxkICAgICAgIG1tNCwgICAgICAgIDQKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgbW00LCAgICAgICAgbW03Ci0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIG1tMywgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YmQgICAgICAgbW00LCAgICAgICAgbW0yCi0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIG1tMywgICAgICAgIGZsaW1pdDIKLSAgICAgICAgICAgIHBzdWJkICAgICAgIG1tNCwgICAgICAgIGZsaW1pdDIKLQotICAgICAgICAgICAgcHNyYWQgICAgICAgbW0zLCAgICAgICAgMzEKLSAgICAgICAgICAgIHBzcmFkICAgICAgIG1tNCwgICAgICAgIDMxCi0KLSAgICAgICAgICAgIHBhY2tzc2R3ICAgIG1tMywgICAgICAgIG1tNAotICAgICAgICAgICAgcGFja3Nzd2IgICAgbW0zLCAgICAgICAgbW0wCi0KLSAgICAgICAgICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbcnNpK3JheCo4XQotCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tMAotCi0gICAgICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTUKLSAgICAgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIHJkeAotCi0gICAgICAgICAgICBhbmQgICAgICAgICByY3gsICAgICAgICAxMjcKLSVpZiBBQklfSVNfMzJCSVQ9MSAmJiBDT05GSUdfUElDPTEKLSAgICAgICAgICAgIHB1c2ggICAgICAgIHJheAotICAgICAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X3J2KSldCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcmF4ICsgcmN4KjJdIDt2cDhfcnZbcmN4KjJdCi0gICAgICAgICAgICBwb3AgICAgICAgICByYXgKLSVlbGlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcjggKyByY3gqMl0gO3ZwOF9ydltyY3gqMl0KLSVlbHNlCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbc3ltKHZwOF9ydikgKyByY3gqMl0KLSVlbmRpZgotICAgICAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW00Ci0gICAgICAgICAgICA7cGFkZHcgICAgIHhtbTEsICAgICAgIGVpZ2h0OHMKLSAgICAgICAgICAgIHBzcmF3ICAgICAgIG1tMSwgICAgICAgIDQKLQotICAgICAgICAgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgbW0wCi0gICAgICAgICAgICBwYW5kICAgICAgICBtbTEsICAgICAgICBtbTMKLQotICAgICAgICAgICAgcGFuZG4gICAgICAgbW0zLCAgICAgICAgbW0yCi0gICAgICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTMKLQotICAgICAgICAgICAgYW5kICAgICAgICAgcmN4LCAgICAgICAgMTUKLSAgICAgICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiAgIFtyc3ArcmN4KjRdLCBtbTEgO2RbcmN4KjRdCi0KLSAgICAgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIHJkeAotICAgICAgICAgICAgc3ViICAgICAgICAgcmN4LCAgICAgICAgOAotCi0gICAgICAgICAgICBhbmQgICAgICAgICByY3gsICAgICAgICAxNQotICAgICAgICAgICAgbW92ZCAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyc3ArcmN4KjRdIDtkW3JjeCo0XQotCi0gICAgICAgICAgICBtb3ZkICAgICAgICBbcnNpXSwgICAgICBtbTEKLSAgICAgICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4XQotCi0gICAgICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JheF0KLSAgICAgICAgICAgIGFkZCAgICAgICAgIHJkeCwgICAgICAgIDEKLQotICAgICAgICAgICAgY21wICAgICAgICAgZWR4LCAgICAgICAgZHdvcmQgYXJnKDIpIDtyb3dzCi0gICAgICAgICAgICBqbCAgICAgICAgICBsb29wX3JvdwotCi0KLSAgICAgICAgYWRkICAgICAgICAgZHdvcmQgYXJnKDApLCA0IDsgcyArPSA0Ci0gICAgICAgIHN1YiAgICAgICAgIGR3b3JkIGFyZygzKSwgNCA7IGNvbHMgLT0gNAotICAgICAgICBjbXAgICAgICAgICBkd29yZCBhcmcoMyksIDAKLSAgICAgICAgamcgICAgICAgICAgbG9vcF9jb2wKLQotICAgIGFkZCAgICAgICAgIHJzcCwgMTM2Ci0gICAgcG9wICAgICAgICAgcnNwCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0ldW5kZWYgZmxpbWl0MgotCi0KLTt2b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2VfbW14ICh1bnNpZ25lZCBjaGFyICpTdGFydCwgdW5zaWduZWQgY2hhciAqbm9pc2UsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmxhY2tjbGFtcFsxNl0sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgd2hpdGVjbGFtcFsxNl0sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYm90aGNsYW1wWzE2XSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFdpZHRoLCB1bnNpZ25lZCBpbnQgSGVpZ2h0LCBpbnQgUGl0Y2gpCi1leHRlcm4gc3ltKHJhbmQpCi1nbG9iYWwgc3ltKHZwOF9wbGFuZV9hZGRfbm9pc2VfbW14KQotc3ltKHZwOF9wbGFuZV9hZGRfbm9pc2VfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotYWRkbm9pc2VfbG9vcDoKLSAgICBjYWxsIHN5bShyYW5kKSBXUlRfUExUCi0gICAgbW92ICAgICByY3gsIGFyZygxKSA7bm9pc2UKLSAgICBhbmQgICAgIHJheCwgMHhmZgotICAgIGFkZCAgICAgcmN4LCByYXgKLQotICAgIDsgd2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSBjbGFtcGluZyB2ZWN0b3JzIGFyZSBzdG9yZWQgY29udGlndW91c2x5Ci0gICAgOyBpbiBibGFjay93aGl0ZS9ib3RoIG9yZGVyLiBOb3RlIHRoYXQgd2UgaGF2ZSB0byByZWxvYWQgdGhpcyBoZXJlIGJlY2F1c2UKLSAgICA7IHJkeCBjb3VsZCBiZSB0cmFzaGVkIGJ5IHJhbmQoKQotICAgIG1vdiAgICAgcmR4LCBhcmcoMikgOyBibGFja2NsYW1wCi0KLQotICAgICAgICAgICAgbW92ICAgICByZGksIHJjeAotICAgICAgICAgICAgbW92c3hkICByY3gsIGR3b3JkIGFyZyg1KSA7W1dpZHRoXQotICAgICAgICAgICAgbW92ICAgICByc2ksIGFyZygwKSA7UG9zCi0gICAgICAgICAgICB4b3IgICAgICAgICByYXgscmF4Ci0KLWFkZG5vaXNlX25leHRzZXQ6Ci0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTEsW3JzaStyYXhdICAgICAgICAgOyBnZXQgdGhlIHNvdXJjZQotCi0gICAgICAgICAgICBwc3VidXNiICAgICBtbTEsIFtyZHhdICAgIDtibGFja2NsYW1wICAgICAgICA7IGNsYW1wIGJvdGggc2lkZXMgc28gd2UgZG9uJ3Qgb3V0cmFuZ2UgYWRkaW5nIG5vaXNlCi0gICAgICAgICAgICBwYWRkdXNiICAgICBtbTEsIFtyZHgrMzJdIDtib3RoY2xhbXAKLSAgICAgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgW3JkeCsxNl0gO3doaXRlY2xhbXAKLQotICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLFtyZGkrcmF4XSAgICAgICAgIDsgZ2V0IHRoZSBub2lzZSBmb3IgdGhpcyBsaW5lCi0gICAgICAgICAgICBwYWRkYiAgICAgICBtbTEsbW0yICAgICAgICAgICAgICA7IGFkZCBpdCBpbgotICAgICAgICAgICAgbW92cSAgICAgICAgW3JzaStyYXhdLG1tMSAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdAotCi0gICAgICAgICAgICBhZGQgICAgICAgICByYXgsOCAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUKLQotICAgICAgICAgICAgY21wICAgICAgICAgcmF4LCByY3gKLSAgICAgICAgICAgIGpsICAgICAgICAgIGFkZG5vaXNlX25leHRzZXQKLQotICAgIG1vdnN4ZCAgcmF4LCBkd29yZCBhcmcoNykgOyBQaXRjaAotICAgIGFkZCAgICAgYXJnKDApLCByYXggOyBTdGFydCArPSBQaXRjaAotICAgIHN1YiAgICAgZHdvcmQgYXJnKDYpLCAxICAgOyBIZWlnaHQgLT0gMQotICAgIGpnICAgICAgYWRkbm9pc2VfbG9vcAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotQmx1cjoKLSAgICB0aW1lcyAxNiBkdyAxNgotICAgIHRpbWVzICA4IGR3IDY0Ci0gICAgdGltZXMgMTYgZHcgMTYKLSAgICB0aW1lcyAgOCBkdyAgMAotCi1yZDoKLSAgICB0aW1lcyA0IGR3IDB4NDAKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX21teC5jIGIvdnA4L2NvbW1vbi94ODYvcG9zdHByb2NfbW14LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjMyMWEuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvcG9zdHByb2NfbW14LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCi0jaW5jbHVkZSAicHJhZ21hcy5oIgotCi0jZGVmaW5lIFZQOF9GSUxURVJfV0VJR0hUIDEyOAotI2RlZmluZSBWUDhfRklMVEVSX1NISUZUICA3Ci0KLQotCi0vKiBzdGF0aWMgY29uc3RhbnRzICovCi1fX2RlY2xzcGVjKGFsaWduKDE2KSkKLWNvbnN0IHN0YXRpYyBzaG9ydCAgQmx1cls0OF0gPQotewotCi0gICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCi0gICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQotfTsKLSNkZWZpbmUgUkQgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSBfX2ludDY0IHJkICA9IDB4MDA0MDAwNDAwMDQwMDA0MDsKLSNkZWZpbmUgUjREMiBfX2RlY2xzcGVjKGFsaWduKDE2KSkgX19pbnQ2NCByZDQyWzJdID0gezB4MDAwNDAwMDQwMDA0MDAwNCwweDAwMDQwMDA0MDAwNDAwMDR9OwotCi0jaWZuZGVmIFJFTE9DQVRFQUJMRQotY29uc3Qgc3RhdGljIFJEOwotY29uc3Qgc3RhdGljIFI0RDI7Ci0jZW5kaWYKLQotCi0vKiBleHRlcm5hbCByZWZlcmVuY2VzICovCi1leHRlcm4gZG91YmxlIHZwOF9nYXVzc2lhbihkb3VibGUgc2lnbWEsIGRvdWJsZSBtdSwgZG91YmxlIHgpOwotZXh0ZXJuIHNob3J0IHZwOF9ydltdOwotZXh0ZXJuIGludCB2cDhfcTJtYmwoaW50IHgpIDsKLQotCi0KLXZvaWQgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbW14Ci0oCi0gICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCByb3dzLAotICAgIGludCBjb2xzLAotICAgIGludCBmbGltaXQKLSkKLXsKLSNpZmRlZiBSRUxPQ0FURUFCTEUKLSAgICBSRAotICAgIFI0RDIKLSNlbmRpZgotCi0gICAgX19hc20KLSAgICB7Ci0gICAgICAgIHB1c2ggICAgICAgIGVieAotICAgICAgICBsZWEgICAgICAgICBlYngsIEJsdXIKLSAgICAgICAgbW92ZCAgICAgICAgbW0yLCBmbGltaXQKLSAgICAgICAgcHVucGNrbHdkICAgbW0yLCBtbTIKLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCBtbTIKLQotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgICAgICBzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgICAgIGRzdF9wdHIKLQotICAgICAgICBtb3YgICAgICAgICBlY3gsIERXT1JEIFBUUiByb3dzCi0gICAgICAgIG1vdiAgICAgICAgIGVheCwgc3JjX3BpeGVsc19wZXJfbGluZSA7Ci0gICAgICAgIGRlc3RpbmF0aW9uIHBpdGNoPwotICAgICAgICBweG9yICAgICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgOwotICAgICAgICBtbTAgPSAwMDAwMDAwMAotCi0gICAgICAgIG5leHRyb3c6Ci0KLSAgICAgICAgeG9yICAgICAgICAgZWR4LCAgICAgICAgZWR4ICAgICAgIDsKLQotICAgICAgICBjbGVhciBvdXQgZWR4IGZvciB1c2UgYXMgbG9vcCBjb3VudGVyCi0gICAgICAgIG5leHRjb2w6Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCBtbTcgICAgICAgICAgICAgIDsKLQotICAgIG1tNyA9IDAwMDAwMDAwCi0gICAgbW92cSAgICAgICAgbW02LCBbZWJ4ICsgMzIgXSAgICAgIDsKLSAgICAgICAgbW02ID0ga2VybmVsIDIgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtlc2ldICAgICAgICAgICAgOwotICAgICAgICBtbTQgPSByMCBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zID0gcDAuLnAzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgbW0zICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMSA9IHAwLi5wMwotICAgICAgICBwbXVsbHcgICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKj0ga2VybmVsIDIgbW9kaWZpZXJzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbZWJ4ICsgNDhdICAgICAgIDsKLSAgICAgICAgbW02ID0ga2VybmVsIDMgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTUsIFtlc2kgKyBlYXhdICAgICAgOwotICAgICAgICBtbTQgPSByMSBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCBtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcjEgcDAuLnAzCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiAqPSBwMC4ucDMgKiBrZXJuZWwgMyBtb2RpZmllcnMKLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNgotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyA9IHIwIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTcsIG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTcgPSByMCBwMC4ucDMgLSByMSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcjEgcDAuLnAzIC0gcjAgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNywgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyA9IGFicyhyMCBwMC4ucDMgLSByMSBwMC4ucDMpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNywgbW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbZWJ4ICsgNjQgXSAgICAgIDsKLSAgICAgICAgbW02ID0ga2VybmVsIDQgbW9kaWZpZXJzCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgW2VzaSArIDIqZWF4XSAgICA7Ci0gICAgICAgIG1tNCA9IHIyIHAwLi5wNwotICAgICAgICBwdW5wY2tsYncgICBtbTUsIG1tMCAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSByMiBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ICo9IGtlcm5lbCA0IG1vZGlmaWVycwotICAgICAgICBwYWRkdXN3ICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKz0gbW01Ci0KLSAgICAgICAgOwotICAgICAgICB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHIwIHAwLi5wMyAtIHIyIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTUsIG1tMSAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSByMiBwMC4ucDMgLSByMiBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHIyIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgbW02LCBtbTIKLSAgICAgICAgcG9yICAgICAgICAgbW03LCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLQotICAgICAgICBuZWcgICAgICAgICBlYXgKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbZWJ4IF0gICAgICAgICAgIDsKLSAgICAgICAga2VybmVsIDAgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTUsIFtlc2krMiplYXhdICAgICAgOwotICAgICAgICBtbTQgPSByLTIgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgbW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSA9IHItMiBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ICo9IGtlcm5lbCAwIG1vZGlmaWVycwotICAgICAgICBwYWRkdXN3ICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKz0gbW01Ci0KLSAgICAgICAgOwotICAgICAgICB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92cSAgICAgICAgbW02LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHAwLi5wMyAtIHItMiBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gci0yIHAwLi5wMyAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBhYnMocjAgcDAuLnAzIC0gci0yIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgbW02LCBtbTIKLSAgICAgICAgcG9yICAgICAgICAgbW03LCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbZWJ4ICsgMTZdICAgICAgIDsKLSAgICAgICAga2VybmVsIDEgdGFwcwotICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtlc2krZWF4XSAgICAgICAgOwotICAgICAgICBtbTQgPSByLTEgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgbW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNCA9IHItMSBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW00ICo9IGtlcm5lbCAxIG1vZGlmaWVycy4KLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNQotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHIwIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMgLSByLTIgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIG1tNCwgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSA9IHItMSBwMC4ucDMgLSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHItMSBwMC4ucDMpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNiwgbW0yCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgbW02ICAgICAgICAgICAgICA7Ci0gICAgICAgIGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0KLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCByZCAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgVlA4X0ZJTFRFUl9TSElGVCAgICAgOwotICAgICAgICBtbTMgLz0gMTI4Ci0KLSAgICAgICAgcGFuZCAgICAgICAgbW0xLCBtbTcgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0xIHNlbGVjdCB2YWxzID4gdGhyZXNoIGZyb20gc291cmNlCi0gICAgICAgIHBhbmRuICAgICAgIG1tNywgbW0zICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyBzZWxlY3QgdmFscyA8IHRocmVzaCBmcm9tIGJsdXJyZWQgcmVzdWx0Ci0gICAgICAgIHBhZGR1c3cgICAgIG1tMSwgbW03ICAgICAgICAgICAgICA7Ci0gICAgICAgIGNvbWJpbmF0aW9uCi0KLSAgICAgICAgcGFja3Vzd2IgICAgbW0xLCBtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFjayB0byBieXRlcwotCi0gICAgICAgIG1vdmQgICAgICAgIFtlZGldLCBtbTEgICAgICAgICAgICA7Ci0gICAgICAgIG5lZyAgICAgICAgIGVheCAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBpdGNoIGlzIHBvc2l0aXZlCi0KLQotICAgICAgICBhZGQgICAgICAgICBlc2ksIDQKLSAgICAgICAgYWRkICAgICAgICAgZWRpLCA0Ci0gICAgICAgIGFkZCAgICAgICAgIGVkeCwgNAotCi0gICAgICAgIGNtcCAgICAgICAgIGVkeCwgY29scwotICAgICAgICBqbCAgICAgICAgICBuZXh0Y29sCi0gICAgICAgIC8vIGRvbmUgd2l0aCB0aGUgYWxsIGNvbHMsIHN0YXJ0IHRoZSBhY3Jvc3MgZmlsdGVyaW5nIGluIHBsYWNlCi0gICAgICAgIHN1YiAgICAgICAgIGVzaSwgZWR4Ci0gICAgICAgIHN1YiAgICAgICAgIGVkaSwgZWR4Ci0KLQotICAgICAgICBwdXNoICAgICAgICBlYXgKLSAgICAgICAgeG9yICAgICAgICAgZWR4LCAgICBlZHgKLSAgICAgICAgbW92ICAgICAgICAgZWF4LCAgICBbZWRpLTRdOwotCi0gICAgICAgIGFjcm9zc25leHRjb2w6Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyA9IDAwMDAwMDAwCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW2VieCArIDMyIF0gICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgW2VkaStlZHhdICAgICAgICA7Ci0gICAgICAgIG1tNCA9IHAwLi5wNwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgPSBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zID0gcDAuLnAzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgbW0zICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMSA9IHAwLi5wMwotICAgICAgICBwbXVsbHcgICAgICBtbTMsIG1tNiAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKj0ga2VybmVsIDIgbW9kaWZpZXJzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbZWJ4ICsgNDhdCi0gICAgICAgIHBzcmxxICAgICAgIG1tNCwgOCAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNCA9IHAxLi5wNwotICAgICAgICBtb3ZxICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSBwMS4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCBtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDEuLnA0Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiAqPSBwMS4ucDQgKiBrZXJuZWwgMyBtb2RpZmllcnMKLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNgotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTcsIG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTcgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNywgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNywgbW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCBbZWJ4ICsgNjQgXQotICAgICAgICBwc3JscSAgICAgICBtbTQsIDggICAgICAgICAgICAgICAgOwotICAgICAgICBtbTQgPSBwMi4ucDcKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDIuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgbW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSA9IHAyLi5wNQotICAgICAgICBwbXVsbHcgICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgKj0ga2VybmVsIDQgbW9kaWZpZXJzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tMywgbW02ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMyArPSBtbTUKLQotICAgICAgICA7Ci0gICAgICAgIHRocmVzaG9sZGluZwotICAgICAgICBtb3ZxICAgICAgICBtbTYsIG1tMSAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgbW02LCBtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcDAuLnAzIC0gcDEuLnA0Ci0gICAgICAgIHBzdWJ1c3cgICAgIG1tNSwgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSA9IHAxLi5wNCAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBhYnMocDAuLnAzIC0gcDEuLnA0KQotICAgICAgICBwY21wZ3R3ICAgICBtbTYsIG1tMgotICAgICAgICBwb3IgICAgICAgICBtbTcsIG1tNiAgICAgICAgICAgICAgOwotICAgICAgICBhY2N1bXVsYXRlIHRocmVzaG9sZHMKLQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW2VieCBdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgW2VkaStlZHgtMl0gICAgICA7Ci0gICAgICAgIG1tNCA9IHAtMi4ucDUKLSAgICAgICAgbW92cSAgICAgICAgbW01LCBtbTQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcC0yLi5wNQotICAgICAgICBwdW5wY2tsYncgICBtbTUsIG1tMCAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSBwLTIuLnAxCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSAqPSBrZXJuZWwgMCBtb2RpZmllcnMKLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNQotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTYsIG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgbW01LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNiwgbW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNiwgbW0yCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgbW02ICAgICAgICAgICAgICA7Ci0gICAgICAgIGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgW2VieCArIDE2XQotICAgICAgICBwc3JscSAgICAgICBtbTQsIDggICAgICAgICAgICAgICAgOwotICAgICAgICBtbTQgPSBwLTEuLnA1Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgbW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNCA9IHAtMS4ucDIKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCBtbTQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW00ICo9IGtlcm5lbCAxIG1vZGlmaWVycy4KLSAgICAgICAgcGFkZHVzdyAgICAgbW0zLCBtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNQotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgbW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgbW00LCBtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIG1tNiwgbW00ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIG1tNiwgbW0yCi0gICAgICAgIHBvciAgICAgICAgIG1tNywgbW02ICAgICAgICAgICAgICA7Ci0gICAgICAgIGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0gICAgICAgIHBhZGR1c3cgICAgIG1tMywgcmQgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICBtbTMsIFZQOF9GSUxURVJfU0hJRlQgICAgIDsKLSAgICAgICAgbW0zIC89IDEyOAotCi0gICAgICAgIHBhbmQgICAgICAgIG1tMSwgbW03ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMSBzZWxlY3QgdmFscyA+IHRocmVzaCBmcm9tIHNvdXJjZQotICAgICAgICBwYW5kbiAgICAgICBtbTcsIG1tMyAgICAgICAgICAgICAgOwotICAgICAgICBtbTcgc2VsZWN0IHZhbHMgPCB0aHJlc2ggZnJvbSBibHVycmVkIHJlc3VsdAotICAgICAgICBwYWRkdXN3ICAgICBtbTEsIG1tNyAgICAgICAgICAgICAgOwotICAgICAgICBjb21iaW5hdGlvbgotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgbW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhY2sgdG8gYnl0ZXMKLSAgICAgICAgbW92ICAgICAgICAgRFdPUkQgUFRSIFtlZGkrZWR4LTRdLCAgZWF4ICAgOwotICAgICAgICBzdG9yZSBwcmV2aW91cyBmb3VyIGJ5dGVzCi0gICAgICAgIG1vdmQgICAgICAgIGVheCwgICAgbW0xCi0KLSAgICAgICAgYWRkICAgICAgICAgZWR4LCA0Ci0gICAgICAgIGNtcCAgICAgICAgIGVkeCwgY29scwotICAgICAgICBqbCAgICAgICAgICBhY3Jvc3NuZXh0Y29sOwotCi0gICAgICAgIG1vdiAgICAgICAgIERXT1JEIFBUUiBbZWRpK2VkeC00XSwgIGVheAotICAgICAgICBwb3AgICAgICAgICBlYXgKLQotICAgICAgICAvLyBkb25lIHdpdGggdGhpcyByd28KLSAgICAgICAgYWRkICAgICAgICAgZXNpLCBlYXggICAgICAgICAgICAgICA7Ci0gICAgICAgIG5leHQgbGluZQotICAgICAgICBtb3YgICAgICAgICBlYXgsIGRzdF9waXhlbHNfcGVyX2xpbmUgOwotICAgICAgICBkZXN0aW5hdGlvbiBwaXRjaD8KLSAgICAgICAgYWRkICAgICAgICAgZWRpLCBlYXggICAgICAgICAgICAgICA7Ci0gICAgICAgIG5leHQgZGVzdGluYXRpb24KLSAgICAgICAgbW92ICAgICAgICAgZWF4LCBzcmNfcGl4ZWxzX3Blcl9saW5lIDsKLSAgICAgICAgZGVzdGluYXRpb24gcGl0Y2g/Ci0KLSAgICAgICAgZGVjICAgICAgICAgZWN4ICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgZGVjcmVtZW50IGNvdW50Ci0gICAgICAgIGpueiAgICAgICAgIG5leHRyb3cgICAgICAgICAgICAgICA7Ci0gICAgICAgIG5leHQgcm93Ci0gICAgICAgIHBvcCAgICAgICAgIGVieAotCi0gICAgfQotfQotCi0KLQotdm9pZCB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc194bW0KLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50IHJvd3MsCi0gICAgaW50IGNvbHMsCi0gICAgaW50IGZsaW1pdAotKQotewotI2lmZGVmIFJFTE9DQVRFQUJMRQotICAgIFI0RDIKLSNlbmRpZgotCi0gICAgX19hc20KLSAgICB7Ci0gICAgICAgIG1vdmQgICAgICAgIHhtbTIsICAgICAgIGZsaW1pdAotICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgIHhtbTIKLSAgICAgICAgcHVucGNrbHFkcSAgeG1tMiwgICAgICAgeG1tMgotCi0gICAgICAgIG1vdiAgICAgICAgIGVzaSwgICAgICAgIHNyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgZWRpLCAgICAgICAgZHN0X3B0cgotCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgICAgIERXT1JEIFBUUiByb3dzCi0gICAgICAgIG1vdiAgICAgICAgIGVheCwgICAgICAgIHNyY19waXhlbHNfcGVyX2xpbmUgOwotICAgICAgICBkZXN0aW5hdGlvbiBwaXRjaD8KLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMCAgICAgICAgICAgICAgOwotICAgICAgICBtbTAgPSAwMDAwMDAwMAotCi0gICAgICAgIG5leHRyb3c6Ci0KLSAgICAgICAgeG9yICAgICAgICAgZWR4LCAgICAgICAgZWR4ICAgICAgIDsKLQotICAgICAgICBjbGVhciBvdXQgZWR4IGZvciB1c2UgYXMgbG9vcCBjb3VudGVyCi0gICAgICAgIG5leHRjb2w6Ci0gICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIFFXT1JEIFBUUiBbZXNpXSAgICAgICAgIDsKLQotICAgICAgICBtbTQgPSByMCBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgPSBwMC4ucDMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTEgPSBwMC4ucDMKLSAgICAgICAgcHNsbHcgICAgICAgeG1tMywgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFFXT1JEIFBUUiBbZXNpICsgZWF4XSAgIDsKLSAgICAgICAgbW00ID0gcjEgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcjEgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNgotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW03ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTcsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW03ID0gcjAgcDAuLnAzIC0gcjEgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcjEgcDAuLnAzIC0gcjAgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTcsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW03ID0gYWJzKHIwIHAwLi5wMyAtIHIxIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgeG1tNywgICAgICAgeG1tMgotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFFXT1JEIFBUUiBbZXNpICsgMiplYXhdIDsKLSAgICAgICAgbW00ID0gcjIgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcjIgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNQotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTYsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcjAgcDAuLnAzIC0gcjIgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcjIgcDAuLnAzIC0gcjIgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTYsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHIyIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0KLSAgICAgICAgbmVnICAgICAgICAgZWF4Ci0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFFXT1JEIFBUUiBbZXNpKzIqZWF4XSAgIDsKLSAgICAgICAgbW00ID0gci0yIHAwLi5wNwotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSA9IHItMiBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKz0gbW01Ci0KLSAgICAgICAgOwotICAgICAgICB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSByMCBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNiwgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMgLSByLTIgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gci0yIHAwLi5wMyAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IGFicyhyMCBwMC4ucDMgLSByLTIgcDAuLnAzKQotICAgICAgICBwY21wZ3R3ICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgUVdPUkQgUFRSIFtlc2krZWF4XSAgICAgOwotICAgICAgICBtbTQgPSByLTEgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW00ID0gci0xIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICB4bW0zLCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMyArPSBtbTUKLQotICAgICAgICA7Ci0gICAgICAgIHRocmVzaG9sZGluZwotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHIwIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICB4bW02LCAgICAgICB4bW00ICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHAwLi5wMyAtIHItMiBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNCwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSByLTEgcDAuLnAzIC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTYsICAgICAgIHhtbTQgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHItMSBwMC4ucDMpCi0gICAgICAgIHBjbXBndHcgICAgIHhtbTYsICAgICAgIHhtbTIKLSAgICAgICAgcG9yICAgICAgICAgeG1tNywgICAgICAgeG1tNiAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBhY2N1bXVsYXRlIHRocmVzaG9sZHMKLQotCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHJkNDIgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zIC89IDgKLQotICAgICAgICBwYW5kICAgICAgICB4bW0xLCAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMSBzZWxlY3QgdmFscyA+IHRocmVzaCBmcm9tIHNvdXJjZQotICAgICAgICBwYW5kbiAgICAgICB4bW03LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNyBzZWxlY3QgdmFscyA8IHRocmVzaCBmcm9tIGJsdXJyZWQgcmVzdWx0Ci0gICAgICAgIHBhZGR1c3cgICAgIHhtbTEsICAgICAgIHhtbTcgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgY29tYmluYXRpb24KLQotICAgICAgICBwYWNrdXN3YiAgICB4bW0xLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhY2sgdG8gYnl0ZXMKLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtlZGldLCB4bW0xICAgICAgICAgICAgIDsKLQotICAgICAgICBuZWcgICAgICAgICBlYXggICAgICAgICAgICAgICAgICAgOwotICAgICAgICBwaXRjaCBpcyBwb3NpdGl2ZQotICAgICAgICBhZGQgICAgICAgICBlc2ksICAgICAgICA4Ci0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgICAgIDgKLQotICAgICAgICBhZGQgICAgICAgICBlZHgsICAgICAgICA4Ci0gICAgICAgIGNtcCAgICAgICAgIGVkeCwgICAgICAgIGNvbHMKLQotICAgICAgICBqbCAgICAgICAgICBuZXh0Y29sCi0KLSAgICAgICAgLy8gZG9uZSB3aXRoIHRoZSBhbGwgY29scywgc3RhcnQgdGhlIGFjcm9zcyBmaWx0ZXJpbmcgaW4gcGxhY2UKLSAgICAgICAgc3ViICAgICAgICAgZXNpLCAgICAgICAgZWR4Ci0gICAgICAgIHN1YiAgICAgICAgIGVkaSwgICAgICAgIGVkeAotCi0gICAgICAgIHhvciAgICAgICAgIGVkeCwgICAgICAgIGVkeAotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW2VkaS04XTsKLQotICAgICAgICBhY3Jvc3NuZXh0Y29sOgotICAgICAgICBtb3ZxICAgICAgICB4bW03LCAgICAgICBRV09SRCBQVFIgW2VkaSArZWR4IC0yXQotICAgICAgICBtb3ZkICAgICAgICB4bW00LCAgICAgICBEV09SRCBQVFIgW2VkaSArZWR4ICs2XQotCi0gICAgICAgIHBzbGxkcSAgICAgIHhtbTQsICAgICAgIDgKLSAgICAgICAgcG9yICAgICAgICAgeG1tNCwgICAgICAgeG1tNwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTQKLSAgICAgICAgcHNybGRxICAgICAgeG1tMywgICAgICAgMgotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMyA9IHAwLi5wMwotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0zICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMSA9IHAwLi5wMwotICAgICAgICBwc2xsdyAgICAgICB4bW0zLCAgICAgICAyCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW00Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDMKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSBwMS4ucDQKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKz0gbW02Ci0KLSAgICAgICAgOwotICAgICAgICB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMSAgICAgICAgICAgICAgOwotICAgICAgICBtbTcgPSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNywgICAgICAgeG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTcgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSBwMS4ucDQgLSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tNywgICAgICAgeG1tNSAgICAgICAgICAgICAgOwotICAgICAgICBtbTcgPSBhYnMocDAuLnAzIC0gcDEuLnA0KQotICAgICAgICBwY21wZ3R3ICAgICB4bW03LCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNAotICAgICAgICBwc3JsZHEgICAgICB4bW01LCAgICAgICA0Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDIuLnA1Ci0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0zICs9IG1tNQotCi0gICAgICAgIDsKLSAgICAgICAgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTYsICAgICAgIHhtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gcDAuLnAzIC0gcDEuLnA0Ci0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTYsICAgICAgIHhtbTUgICAgICAgICAgICAgIDsKLSAgICAgICAgbW02ID0gYWJzKHAwLi5wMyAtIHAxLi5wNCkKLSAgICAgICAgcGNtcGd0dyAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICB4bW02ICAgICAgICAgICAgICA7Ci0gICAgICAgIGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSBwLTIuLnA1Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW01ID0gcC0yLi5wMQotICAgICAgICBwYWRkdXN3ICAgICB4bW0zLCAgICAgICB4bW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tMyArPSBtbTUKLQotICAgICAgICA7Ci0gICAgICAgIHRocmVzaG9sZGluZwotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IHAwLi5wMyAtIHAxLi5wNAotICAgICAgICBwc3VidXN3ICAgICB4bW01LCAgICAgICB4bW0xICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNSA9IHAxLi5wNCAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNiA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIHhtbTYsICAgICAgIHhtbTIKLSAgICAgICAgcG9yICAgICAgICAgeG1tNywgICAgICAgeG1tNiAgICAgICAgICAgICAgOwotICAgICAgICBhY2N1bXVsYXRlIHRocmVzaG9sZHMKLQotICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW00ID0gcC0xLi5wNQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICA7Ci0gICAgICAgIG1tNCA9IHAtMS4ucDIKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgeG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKz0gbW01Ci0KLSAgICAgICAgOwotICAgICAgICB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMSAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNiwgICAgICAgeG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNCwgICAgICAgeG1tMSAgICAgICAgICAgICAgOwotICAgICAgICBtbTUgPSBwMS4ucDQgLSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tNiwgICAgICAgeG1tNCAgICAgICAgICAgICAgOwotICAgICAgICBtbTYgPSBhYnMocDAuLnAzIC0gcDEuLnA0KQotICAgICAgICBwY21wZ3R3ICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgIHhtbTYgICAgICAgICAgICAgIDsKLSAgICAgICAgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgcmQ0MiAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBtbTMgLz0gOAotCi0gICAgICAgIHBhbmQgICAgICAgIHhtbTEsICAgICAgIHhtbTcgICAgICAgICAgICAgIDsKLSAgICAgICAgbW0xIHNlbGVjdCB2YWxzID4gdGhyZXNoIGZyb20gc291cmNlCi0gICAgICAgIHBhbmRuICAgICAgIHhtbTcsICAgICAgIHhtbTMgICAgICAgICAgICAgIDsKLSAgICAgICAgbW03IHNlbGVjdCB2YWxzIDwgdGhyZXNoIGZyb20gYmx1cnJlZCByZXN1bHQKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMSwgICAgICAgeG1tNyAgICAgICAgICAgICAgOwotICAgICAgICBjb21iaW5hdGlvbgotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFjayB0byBieXRlcwotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW2VkaStlZHgtOF0sICBtbTAgICA7Ci0gICAgICAgIHN0b3JlIHByZXZpb3VzIGZvdXIgYnl0ZXMKLSAgICAgICAgbW92ZHEycSAgICAgbW0wLCAgICAgICAgeG1tMQotCi0gICAgICAgIGFkZCAgICAgICAgIGVkeCwgICAgICAgIDgKLSAgICAgICAgY21wICAgICAgICAgZWR4LCAgICAgICAgY29scwotICAgICAgICBqbCAgICAgICAgICBhY3Jvc3NuZXh0Y29sOwotCi0gICAgICAgIC8vIGxhc3QgOCBwaXhlbHMKLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtlZGkrZWR4LThdLCAgbW0wCi0KLSAgICAgICAgLy8gZG9uZSB3aXRoIHRoaXMgcndvCi0gICAgICAgIGFkZCAgICAgICAgIGVzaSwgZWF4ICAgICAgICAgICAgICAgOwotICAgICAgICBuZXh0IGxpbmUKLSAgICAgICAgbW92ICAgICAgICAgZWF4LCBkc3RfcGl4ZWxzX3Blcl9saW5lIDsKLSAgICAgICAgZGVzdGluYXRpb24gcGl0Y2g/Ci0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgZWF4ICAgICAgICAgICAgICAgOwotICAgICAgICBuZXh0IGRlc3RpbmF0aW9uCi0gICAgICAgIG1vdiAgICAgICAgIGVheCwgc3JjX3BpeGVsc19wZXJfbGluZSA7Ci0gICAgICAgIGRlc3RpbmF0aW9uIHBpdGNoPwotCi0gICAgICAgIGRlYyAgICAgICAgIGVjeCAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGRlY3JlbWVudCBjb3VudAotICAgICAgICBqbnogICAgICAgICBuZXh0cm93ICAgICAgICAgICAgICAgOwotICAgICAgICBuZXh0IHJvdwotICAgIH0KLX0KLQotCi12b2lkIHZwOF9tYnBvc3RfcHJvY19kb3duX21teCh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBwaXRjaCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgZmxpbWl0KQotewotICAgIGludCBjLCBpOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKQotICAgIGludCBmbGltaXQyWzJdOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKQotICAgIHVuc2lnbmVkIGNoYXIgZFsxNl1bOF07Ci0KLSAgICBmbGltaXQgPSB2cDhfcTJtYmwoZmxpbWl0KTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIGZsaW1pdDJbaV0gPSBmbGltaXQ7Ci0KLSAgICByb3dzICs9IDg7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgY29sczsgYyArPSA0KQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcyA9ICZkc3RbY107Ci0KLSAgICAgICAgX19hc20KLSAgICAgICAgewotICAgICAgICAgICAgbW92ICAgICAgICAgZXNpLCAgICAgICAgcyAgICAgICAgICAgOwotICAgICAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgbW0wICAgICA7Ci0KLSAgICAgICAgICAgIG1vdiAgICAgICAgIGVheCwgICAgICAgIHBpdGNoICAgICAgIDsKLSAgICAgICAgICAgIG5lZyAgICAgICAgIGVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYXggPSAtcGl0Y2gKLQotICAgICAgICAgICAgbGVhICAgICAgICAgZXNpLCAgICAgICAgW2VzaSArIGVheCo4XTsgICAgICAgICAgICAgIC8vIGVkaSA9IHNbLXBpdGNoKjhdCi0gICAgICAgICAgICBuZWcgICAgICAgICBlYXgKLQotCi0gICAgICAgICAgICBweG9yICAgICAgICBtbTUsICAgICAgICBtbTUKLSAgICAgICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgIG1tNiAgICAgOwotCi0gICAgICAgICAgICBweG9yICAgICAgICBtbTcsICAgICAgICBtbTcgICAgIDsKLSAgICAgICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgICAgIGVzaQotCi0gICAgICAgICAgICBtb3YgICAgICAgICBlY3gsICAgICAgICAxNSAgICAgICAgICA7Ci0KLSAgICAgICAgICAgIGxvb3BfaW5pdHZhcjoKLSAgICAgICAgICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbZWRpXTsKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tMCAgICAgOwotCi0gICAgICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICBtbTEgICAgIDsKLSAgICAgICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tMSAgICAgOwotCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTEgICAgIDsKLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tMCAgICAgOwotCi0gICAgICAgICAgICBwdW5wY2tod2QgICBtbTIsICAgICAgICBtbTAgICAgIDsKLSAgICAgICAgICAgIHBhZGRkICAgICAgIG1tNiwgICAgICAgIG1tMSAgICAgOwotCi0gICAgICAgICAgICBwYWRkZCAgICAgICBtbTcsICAgICAgICBtbTIgICAgIDsKLSAgICAgICAgICAgIGxlYSAgICAgICAgIGVkaSwgICAgICAgIFtlZGkrZWF4XSAgIDsKLQotICAgICAgICAgICAgZGVjICAgICAgICAgZWN4Ci0gICAgICAgICAgICBqbmUgICAgICAgICBsb29wX2luaXR2YXIKLSAgICAgICAgICAgIC8vc2F2ZSB0aGUgdmFyIGFuZCBzdW0KLSAgICAgICAgICAgIHhvciAgICAgICAgIGVkeCwgICAgICAgIGVkeAotICAgICAgICAgICAgbG9vcF9yb3c6Ci0gICAgICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW2VzaV0gICAgIC8vIFtzLXBpdGNoKjhdCi0gICAgICAgICAgICBtb3ZkICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW2VkaV0gICAgIC8vIFtzK3BpdGNoKjddCi0KLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tMAotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICAgICAgbW0wCi0KLSAgICAgICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgIG1tMgotICAgICAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW0xCi0KLSAgICAgICAgICAgIHBtdWxsdyAgICAgIG1tMiwgICAgICAgIG1tMgotICAgICAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0yCi0KLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMiwgICAgICAgIG1tMAotICAgICAgICAgICAgcHVucGNraHdkICAgbW00LCAgICAgICAgbW0wCi0KLSAgICAgICAgICAgIHBhZGRkICAgICAgIG1tNiwgICAgICAgIG1tMgotICAgICAgICAgICAgcGFkZGQgICAgICAgbW03LCAgICAgICAgbW00Ci0KLSAgICAgICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tMQotICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xCi0KLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tMAotICAgICAgICAgICAgcHN1YmQgICAgICAgbW02LCAgICAgICAgbW0xCi0KLSAgICAgICAgICAgIHB1bnBja2h3ZCAgIG1tMiwgICAgICAgIG1tMAotICAgICAgICAgICAgcHN1YmQgICAgICAgbW03LCAgICAgICAgbW0yCi0KLQotICAgICAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW02Ci0gICAgICAgICAgICBwc2xsZCAgICAgICBtbTMsICAgICAgICA0Ci0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIG1tMywgICAgICAgIG1tNgotICAgICAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW01Ci0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tNQotICAgICAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICAgICAgbW0xCi0KLSAgICAgICAgICAgIHBtdWxodyAgICAgIG1tNCwgICAgICAgIG1tNAotICAgICAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW0xCi0KLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tNAotICAgICAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgbW00Ci0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIG1tNwotICAgICAgICAgICAgcHNsbGQgICAgICAgbW00LCAgICAgICAgNAotCi0gICAgICAgICAgICBwc3ViZCAgICAgICBtbTQsICAgICAgICBtbTcKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgbW0zLCAgICAgICAgbW0xCi0gICAgICAgICAgICBwc3ViZCAgICAgICBtbTQsICAgICAgICBtbTIKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgbW0zLCAgICAgICAgZmxpbWl0MgotICAgICAgICAgICAgcHN1YmQgICAgICAgbW00LCAgICAgICAgZmxpbWl0MgotCi0gICAgICAgICAgICBwc3JhZCAgICAgICBtbTMsICAgICAgICAzMQotICAgICAgICAgICAgcHNyYWQgICAgICAgbW00LCAgICAgICAgMzEKLQotICAgICAgICAgICAgcGFja3NzZHcgICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgICAgICBwYWNrc3N3YiAgICBtbTMsICAgICAgICBtbTAKLQotICAgICAgICAgICAgbW92ZCAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtlc2krZWF4KjhdCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgbW0wCi0KLSAgICAgICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIG1tNQotICAgICAgICAgICAgbW92ICAgICAgICAgZWN4LCAgICAgICAgZWR4Ci0KLSAgICAgICAgICAgIGFuZCAgICAgICAgIGVjeCwgICAgICAgIDEyNwotICAgICAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgdnA4X3J2W2VjeCoyXQotCi0gICAgICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTQKLSAgICAgICAgICAgIC8vcGFkZHcgICAgIHhtbTEsICAgICAgIGVpZ2h0OHMKLSAgICAgICAgICAgIHBzcmF3ICAgICAgIG1tMSwgICAgICAgIDQKLQotICAgICAgICAgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgbW0wCi0gICAgICAgICAgICBwYW5kICAgICAgICBtbTEsICAgICAgICBtbTMKLQotICAgICAgICAgICAgcGFuZG4gICAgICAgbW0zLCAgICAgICAgbW0yCi0gICAgICAgICAgICBwb3IgICAgICAgICBtbTEsICAgICAgICBtbTMKLQotICAgICAgICAgICAgYW5kICAgICAgICAgZWN4LCAgICAgICAgMTUKLSAgICAgICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiAgZFtlY3gqNF0sIG1tMQotCi0gICAgICAgICAgICBtb3YgICAgICAgICBlY3gsICAgICAgICBlZHgKLSAgICAgICAgICAgIHN1YiAgICAgICAgIGVjeCwgICAgICAgIDgKLQotICAgICAgICAgICAgYW5kICAgICAgICAgZWN4LCAgICAgICAgMTUKLSAgICAgICAgICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBkW2VjeCo0XQotCi0gICAgICAgICAgICBtb3ZkICAgICAgICBbZXNpXSwgICAgICBtbTEKLSAgICAgICAgICAgIGxlYSAgICAgICAgIGVzaSwgICAgICAgIFtlc2krZWF4XQotCi0gICAgICAgICAgICBsZWEgICAgICAgICBlZGksICAgICAgICBbZWRpK2VheF0KLSAgICAgICAgICAgIGFkZCAgICAgICAgIGVkeCwgICAgICAgIDEKLQotICAgICAgICAgICAgY21wICAgICAgICAgZWR4LCAgICAgICAgcm93cwotICAgICAgICAgICAgamwgICAgICAgICAgbG9vcF9yb3cKLQotICAgICAgICB9Ci0KLSAgICB9Ci19Ci0KLXZvaWQgdnA4X21icG9zdF9wcm9jX2Rvd25feG1tKHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHBpdGNoLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBmbGltaXQpCi17Ci0gICAgaW50IGMsIGk7Ci0gICAgX19kZWNsc3BlYyhhbGlnbigxNikpCi0gICAgaW50IGZsaW1pdDRbNF07Ci0gICAgX19kZWNsc3BlYyhhbGlnbigxNikpCi0gICAgdW5zaWduZWQgY2hhciBkWzE2XVs4XTsKLQotICAgIGZsaW1pdCA9IHZwOF9xMm1ibChmbGltaXQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgZmxpbWl0NFtpXSA9IGZsaW1pdDsKLQotICAgIHJvd3MgKz0gODsKLQotICAgIGZvciAoYyA9IDA7IGMgPCBjb2xzOyBjICs9IDgpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpzID0gJmRzdFtjXTsKLQotICAgICAgICBfX2FzbQotICAgICAgICB7Ci0gICAgICAgICAgICBtb3YgICAgICAgICBlc2ksICAgICAgICBzICAgICAgICAgICA7Ci0gICAgICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICA7Ci0KLSAgICAgICAgICAgIG1vdiAgICAgICAgIGVheCwgICAgICAgIHBpdGNoICAgICAgIDsKLSAgICAgICAgICAgIG5lZyAgICAgICAgIGVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYXggPSAtcGl0Y2gKLQotICAgICAgICAgICAgbGVhICAgICAgICAgZXNpLCAgICAgICAgW2VzaSArIGVheCo4XTsgICAgICAgICAgICAgIC8vIGVkaSA9IHNbLXBpdGNoKjhdCi0gICAgICAgICAgICBuZWcgICAgICAgICBlYXgKLQotCi0gICAgICAgICAgICBweG9yICAgICAgICB4bW01LCAgICAgICB4bW01Ci0gICAgICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICB4bW02ICAgICAgICA7Ci0KLSAgICAgICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgIHhtbTcgICAgICAgIDsKLSAgICAgICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgICAgIGVzaQotCi0gICAgICAgICAgICBtb3YgICAgICAgICBlY3gsICAgICAgICAxNSAgICAgICAgICA7Ci0KLSAgICAgICAgICAgIGxvb3BfaW5pdHZhcjoKLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFFXT1JEIFBUUiBbZWRpXTsKLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgIDsKLQotICAgICAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgOwotICAgICAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgeG1tMSAgICAgICAgOwotCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0xICAgICAgICA7Ci0gICAgICAgICAgICBwdW5wY2tsd2QgICB4bW0xLCAgICAgICB4bW0wICAgICAgICA7Ci0KLSAgICAgICAgICAgIHB1bnBja2h3ZCAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgIDsKLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgIHhtbTEgICAgICAgIDsKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICAgICAgeG1tMiAgICAgICAgOwotICAgICAgICAgICAgbGVhICAgICAgICAgZWRpLCAgICAgICAgW2VkaStlYXhdICAgOwotCi0gICAgICAgICAgICBkZWMgICAgICAgICBlY3gKLSAgICAgICAgICAgIGpuZSAgICAgICAgIGxvb3BfaW5pdHZhcgotICAgICAgICAgICAgLy9zYXZlIHRoZSB2YXIgYW5kIHN1bQotICAgICAgICAgICAgeG9yICAgICAgICAgZWR4LCAgICAgICAgZWR4Ci0gICAgICAgICAgICBsb29wX3JvdzoKLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFFXT1JEIFBUUiBbZXNpXSAgICAgLy8gW3MtcGl0Y2gqOF0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIFFXT1JEIFBUUiBbZWRpXSAgICAgLy8gW3MrcGl0Y2gqN10KLQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgeG1tMAotCi0gICAgICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICB4bW0yCi0gICAgICAgICAgICBwc3VidyAgICAgICB4bW01LCAgICAgICB4bW0xCi0KLSAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgIHhtbTIKLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTIKLQotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICAgICAgcHVucGNraHdkICAgeG1tNCwgICAgICAgeG1tMAotCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgICAgICB4bW00Ci0KLSAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIHhtbTEKLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTEKLQotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNiwgICAgICAgeG1tMQotCi0gICAgICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICB4bW0wCi0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW03LCAgICAgICB4bW0yCi0KLQotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tNgotICAgICAgICAgICAgcHNsbGQgICAgICAgeG1tMywgICAgICAgNAotCi0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW0zLCAgICAgICB4bW02Ci0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW01Ci0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTUKLSAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIHhtbTEKLQotICAgICAgICAgICAgcG11bGh3ICAgICAgeG1tNCwgICAgICAgeG1tNAotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMQotCi0gICAgICAgICAgICBwdW5wY2tsd2QgICB4bW0xLCAgICAgICB4bW00Ci0gICAgICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICB4bW00Ci0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTcKLSAgICAgICAgICAgIHBzbGxkICAgICAgIHhtbTQsICAgICAgIDQKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNCwgICAgICAgeG1tNwotCi0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW0zLCAgICAgICB4bW0xCi0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW00LCAgICAgICB4bW0yCi0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTMsICAgICAgIGZsaW1pdDQKLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTQsICAgICAgIGZsaW1pdDQKLQotICAgICAgICAgICAgcHNyYWQgICAgICAgeG1tMywgICAgICAgMzEKLSAgICAgICAgICAgIHBzcmFkICAgICAgIHhtbTQsICAgICAgIDMxCi0KLSAgICAgICAgICAgIHBhY2tzc2R3ICAgIHhtbTMsICAgICAgIHhtbTQKLSAgICAgICAgICAgIHBhY2tzc3diICAgIHhtbTMsICAgICAgIHhtbTAKLQotICAgICAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgUVdPUkQgUFRSIFtlc2krZWF4KjhdCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIHhtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAKLQotICAgICAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgeG1tNQotICAgICAgICAgICAgbW92ICAgICAgICAgZWN4LCAgICAgICAgZWR4Ci0KLSAgICAgICAgICAgIGFuZCAgICAgICAgIGVjeCwgICAgICAgIDEyNwotICAgICAgICAgICAgbW92ZHF1ICAgICAgeG1tNCwgICAgICAgdnA4X3J2W2VjeCoyXQotCi0gICAgICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICB4bW00Ci0gICAgICAgICAgICAvL3BhZGR3ICAgICB4bW0xLCAgICAgICBlaWdodDhzCi0gICAgICAgICAgICBwc3JhdyAgICAgICB4bW0xLCAgICAgICA0Ci0KLSAgICAgICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTAKLSAgICAgICAgICAgIHBhbmQgICAgICAgIHhtbTEsICAgICAgIHhtbTMKLQotICAgICAgICAgICAgcGFuZG4gICAgICAgeG1tMywgICAgICAgeG1tMgotICAgICAgICAgICAgcG9yICAgICAgICAgeG1tMSwgICAgICAgeG1tMwotCi0gICAgICAgICAgICBhbmQgICAgICAgICBlY3gsICAgICAgICAxNQotICAgICAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSICBkW2VjeCo4XSwgeG1tMQotCi0gICAgICAgICAgICBtb3YgICAgICAgICBlY3gsICAgICAgICBlZHgKLSAgICAgICAgICAgIHN1YiAgICAgICAgIGVjeCwgICAgICAgIDgKLQotICAgICAgICAgICAgYW5kICAgICAgICAgZWN4LCAgICAgICAgMTUKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIGRbZWN4KjhdCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIFtlc2ldLCAgICAgIG1tMAotICAgICAgICAgICAgbGVhICAgICAgICAgZXNpLCAgICAgICAgW2VzaStlYXhdCi0KLSAgICAgICAgICAgIGxlYSAgICAgICAgIGVkaSwgICAgICAgIFtlZGkrZWF4XQotICAgICAgICAgICAgYWRkICAgICAgICAgZWR4LCAgICAgICAgMQotCi0gICAgICAgICAgICBjbXAgICAgICAgICBlZHgsICAgICAgICByb3dzCi0gICAgICAgICAgICBqbCAgICAgICAgICBsb29wX3JvdwotCi0gICAgICAgIH0KLQotICAgIH0KLX0KLSNpZiAwCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogcGxhbmVfYWRkX25vaXNlX3dtdAotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqU3RhcnQgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXIgdG8gYWRkIGdhdXNzaWFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZSB0bwotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgV2lkdGggICAgd2lkdGggb2YgcGxhbmUKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEhlaWdodCAgIGhlaWdodCBvZiBwbGFuZQotICogICAgICAgICAgICAgICAgICBpbnQgIFBpdGNoICAgIGRpc3RhbmNlIGJldHdlZW4gc3Vic2VxdWVudCBsaW5lcyBvZiBmcmFtZQotICogICAgICAgICAgICAgICAgICBpbnQgIHEgICAgICAgIHF1YW50aXplciB1c2VkIHRvIGRldGVybWluZSBhbW91bnQgb2Ygbm9pc2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZAotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQuCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBhZGRzIGdhdXNzaWFuIG5vaXNlIHRvIGEgcGxhbmUgb2YgcGl4ZWxzCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhfcGxhbmVfYWRkX25vaXNlX3dtdCh1bnNpZ25lZCBjaGFyICpTdGFydCwgdW5zaWduZWQgaW50IFdpZHRoLCB1bnNpZ25lZCBpbnQgSGVpZ2h0LCBpbnQgUGl0Y2gsIGludCBxLCBpbnQgYSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB1bnNpZ25lZCBjaGFyIGJsYWNrY2xhbXBbMTZdOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB1bnNpZ25lZCBjaGFyIHdoaXRlY2xhbXBbMTZdOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB1bnNpZ25lZCBjaGFyIGJvdGhjbGFtcFsxNl07Ci0gICAgY2hhciBjaGFyX2Rpc3RbMzAwXTsKLSAgICBjaGFyIFJhbmRbMjA0OF07Ci0gICAgZG91YmxlIHNpZ21hOwotLy8gICAgcmV0dXJuOwotICAgIF9fYXNtIGVtbXMKLSAgICBzaWdtYSA9IGEgKyAuNSArIC42ICogKDYzIC0gcSkgLyA2My4wOwotCi0gICAgLy8gc2V0IHVwIGEgbG9va3VwIHRhYmxlIG9mIDI1NiBlbnRyaWVzIHRoYXQgbWF0Y2hlcwotICAgIC8vIGEgZ2F1c3NpYW4gZGlzdHJpYnV0aW9uIHdpdGggc2lnbWEgZGV0ZXJtaW5lZCBieSBxLgotICAgIC8vCi0gICAgewotICAgICAgICBkb3VibGUgaTsKLSAgICAgICAgaW50IG5leHQsIGo7Ci0KLSAgICAgICAgbmV4dCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gLTMyOyBpIDwgMzI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGcgPSAyNTYgKiB2cDhfZ2F1c3NpYW4oc2lnbWEsIDAsIDEuMCAqIGkpOwotICAgICAgICAgICAgaW50IGEgPSAoaW50KShnICsgLjUpOwotCi0gICAgICAgICAgICBpZiAoYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYTsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcl9kaXN0W25leHQral0gPSAoY2hhcikgaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dCArIGo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAobmV4dCA9IG5leHQ7IG5leHQgPCAyNTY7IG5leHQrKykKLSAgICAgICAgICAgIGNoYXJfZGlzdFtuZXh0XSA9IDA7Ci0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjA0ODsgaSsrKQotICAgIHsKLSAgICAgICAgUmFuZFtpXSA9IGNoYXJfZGlzdFtyYW5kKCkgJiAweGZmXTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGJsYWNrY2xhbXBbaV0gPSAtY2hhcl9kaXN0WzBdOwotICAgICAgICB3aGl0ZWNsYW1wW2ldID0gLWNoYXJfZGlzdFswXTsKLSAgICAgICAgYm90aGNsYW1wW2ldID0gLTIgKiBjaGFyX2Rpc3RbMF07Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEhlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqUG9zID0gU3RhcnQgKyBpICogUGl0Y2g7Ci0gICAgICAgIGNoYXIgICpSZWYgPSBSYW5kICsgKHJhbmQoKSAmIDB4ZmYpOwotCi0gICAgICAgIF9fYXNtCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vdiBlY3gsIFtXaWR0aF0KLSAgICAgICAgICAgIG1vdiBlc2ksIFBvcwotICAgICAgICAgICAgbW92IGVkaSwgUmVmCi0gICAgICAgICAgICB4b3IgICAgICAgICBlYXgsIGVheAotCi0gICAgICAgICAgICBuZXh0c2V0OgotICAgICAgICAgICAgbW92ZHF1ICAgICAgeG1tMSwgW2VzaStlYXhdICAgICAgICAvLyBnZXQgdGhlIHNvdXJjZQotCi0gICAgICAgICAgICBwc3VidXNiICAgICB4bW0xLCBibGFja2NsYW1wICAgICAgIC8vIGNsYW1wIGJvdGggc2lkZXMgc28gd2UgZG9uJ3Qgb3V0cmFuZ2UgYWRkaW5nIG5vaXNlCi0gICAgICAgICAgICBwYWRkdXNiICAgICB4bW0xLCBib3RoY2xhbXAKLSAgICAgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsIHdoaXRlY2xhbXAKLQotICAgICAgICAgICAgbW92ZHF1ICAgICAgeG1tMiwgW2VkaStlYXhdICAgICAgICAvLyBnZXQgdGhlIG5vaXNlIGZvciB0aGlzIGxpbmUKLSAgICAgICAgICAgIHBhZGRiICAgICAgIHhtbTEsIHhtbTIgICAgICAgICAgICAgLy8gYWRkIGl0IGluCi0gICAgICAgICAgICBtb3ZkcXUgICAgICBbZXNpK2VheF0sIHhtbTEgICAgICAgIC8vIHN0b3JlIHRoZSByZXN1bHQKLQotICAgICAgICAgICAgYWRkICAgICAgICAgZWF4LCAxNiAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUKLQotICAgICAgICAgICAgY21wICAgICAgICAgZWF4LCBlY3gKLSAgICAgICAgICAgIGpsICAgICAgICAgIG5leHRzZXQKLQotCi0gICAgICAgIH0KLQotICAgIH0KLX0KLSNlbmRpZgotX19kZWNsc3BlYyhhbGlnbigxNikpCi1zdGF0aWMgY29uc3QgaW50IGZvdXI4c1s0XSA9IHsgOCwgOCwgOCwgOH07Ci12b2lkIHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHBpdGNoLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBmbGltaXQpCi17Ci0gICAgaW50IHIsIGk7Ci0gICAgX19kZWNsc3BlYyhhbGlnbigxNikpCi0gICAgaW50IGZsaW1pdDRbNF07Ci0gICAgdW5zaWduZWQgY2hhciAqcyA9IHNyYzsKLSAgICBpbnQgc3Vtc3E7Ci0gICAgaW50IHN1bTsKLQotCi0gICAgZmxpbWl0ID0gdnA4X3EybWJsKGZsaW1pdCk7Ci0gICAgZmxpbWl0NFswXSA9Ci0gICAgICAgIGZsaW1pdDRbMV0gPQotICAgICAgICAgICAgZmxpbWl0NFsyXSA9Ci0gICAgICAgICAgICAgICAgZmxpbWl0NFszXSA9IGZsaW1pdDsKLQotICAgIGZvciAociA9IDA7IHIgPCByb3dzOyByKyspCi0gICAgewotCi0KLSAgICAgICAgc3Vtc3EgPSAwOwotICAgICAgICBzdW0gPSAwOwotCi0gICAgICAgIGZvciAoaSA9IC04OyBpIDw9IDY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc3Vtc3EgKz0gc1tpXSAqIHNbaV07Ci0gICAgICAgICAgICBzdW0gICArPSBzW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgX19hc20KLSAgICAgICAgewotICAgICAgICAgICAgbW92ICAgICAgICAgZWF4LCAgICBzdW1zcQotICAgICAgICAgICAgbW92ZCAgICAgICAgeG1tNywgICBlYXgKLQotICAgICAgICAgICAgbW92ICAgICAgICAgZWF4LCAgICBzdW0KLSAgICAgICAgICAgIG1vdmQgICAgICAgIHhtbTYsICAgZWF4Ci0KLSAgICAgICAgICAgIG1vdiAgICAgICAgIGVzaSwgICAgcwotICAgICAgICAgICAgeG9yICAgICAgICAgZWN4LCAgICBlY3gKLQotICAgICAgICAgICAgbW92ICAgICAgICAgZWR4LCAgICBjb2xzCi0gICAgICAgICAgICBhZGQgICAgICAgICBlZHgsICAgIDgKLSAgICAgICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgbW0wCi0gICAgICAgICAgICBweG9yICAgICAgICBtbTEsICAgIG1tMQotCi0gICAgICAgICAgICBweG9yICAgICAgICB4bW0wLCAgIHhtbTAKLSAgICAgICAgICAgIG5leHRjb2w0OgotCi0gICAgICAgICAgICBtb3ZkICAgICAgICB4bW0xLCAgIERXT1JEIFBUUiBbZXNpK2VjeC04XSAgIC8vIC04IC03IC02IC01Ci0gICAgICAgICAgICBtb3ZkICAgICAgICB4bW0yLCAgIERXT1JEIFBUUiBbZXNpK2VjeCs3XSAgIC8vICs3ICs4ICs5ICsxMAotCi0gICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgIHhtbTAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZGluZwotICAgICAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICB4bW0wICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmRpbmcKLQotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICB4bW0wICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmRpbmcgdG8gZHdvcmRzCi0gICAgICAgICAgICBwdW5wY2tsd2QgICB4bW0yLCAgIHhtbTAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZGluZyB0byBkd29yZHMKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tMiwgICB4bW0xICAgICAgICAgICAgICAgICAgICAvLyA3LS04ICAgOC0tNyAgIDktLTYgMTAtLTUKLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgeG1tMSAgICAgICAgICAgICAgICAgICAgLy8gLTgqMiAgIC03KjIgICAtNioyIC01KjIKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICB4bW0yICAgICAgICAgICAgICAgICAgICAvLyA3Ky04ICAgOCstNyAgIDkrLTYgMTArLTUKLSAgICAgICAgICAgIHBtYWRkd2QgICAgIHhtbTEsICAgeG1tMiAgICAgICAgICAgICAgICAgICAgLy8gc3F1YXJlZCBvZiA3Ky04ICAgOCstNyAgIDkrLTYgMTArLTUKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW0yCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgIHhtbTEKLQotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNiwgICB4bW02LCAgIDAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgdGhlIGxhc3Qgb25lcwotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNywgICB4bW03LCAgIDAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgdGhlIGxhc3Qgb25lcwotCi0gICAgICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8vIDgtLTcgICA5LS02IDEwLS01ICAwMDAwCi0gICAgICAgICAgICBwc3JsZHEgICAgICB4bW0yLCAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8vIDgtLTcgICA5LS02IDEwLS01ICAwMDAwCi0KLSAgICAgICAgICAgIHBzaHVmZCAgICAgIHhtbTMsICAgeG1tMSwgICAzICAgICAgICAgICAgICAgLy8gMDAwMCAgOC0tNyAgIDgtLTcgICA4LS03IHNxdWFyZWQKLSAgICAgICAgICAgIHBzaHVmZCAgICAgIHhtbTQsICAgeG1tMiwgICAzICAgICAgICAgICAgICAgLy8gMDAwMCAgOC0tNyAgIDgtLTcgICA4LS03IHNxdWFyZWQKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW00Ci0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgIHhtbTMKLQotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tMywgICB4bW0xLCAgIDAxMDExMTExYiAgICAgICAvLyAwMDAwICAwMDAwICAgOS0tNiAgIDktLTYgc3F1YXJlZAotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNCwgICB4bW0yLCAgIDAxMDExMTExYiAgICAgICAvLyAwMDAwICAwMDAwICAgOS0tNiAgIDktLTYgc3F1YXJlZAotCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgIHhtbTMKLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgeG1tNAotCi0gICAgICAgICAgICBwc2h1ZmQgICAgICB4bW0zLCAgIHhtbTEsICAgMTAxMTExMTFiICAgICAgIC8vIDAwMDAgIDAwMDAgICA4LS03ICAgOC0tNyBzcXVhcmVkCi0gICAgICAgICAgICBwc2h1ZmQgICAgICB4bW00LCAgIHhtbTIsICAgMTAxMTExMTFiICAgICAgIC8vIDAwMDAgIDAwMDAgICA4LS03ICAgOC0tNyBzcXVhcmVkCi0KLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgeG1tMwotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW00Ci0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgeG1tNgotICAgICAgICAgICAgcG1hZGR3ZCAgICAgeG1tMywgICB4bW0zCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgeG1tNwotICAgICAgICAgICAgcHNsbGQgICAgICAgeG1tNSwgICA0Ci0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTUsICAgeG1tNwotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNSwgICB4bW0zCi0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTUsICAgZmxpbWl0NAotICAgICAgICAgICAgcHNyYWQgICAgICAgeG1tNSwgICAzMQotCi0gICAgICAgICAgICBwYWNrc3NkdyAgICB4bW01LCAgIHhtbTAKLSAgICAgICAgICAgIHBhY2tzc3diICAgIHhtbTUsICAgeG1tMAotCi0gICAgICAgICAgICBtb3ZkICAgICAgICB4bW0xLCAgIERXT1JEIFBUUiBbZXNpK2VjeF0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgeG1tMQotCi0gICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgIHhtbTAKLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgeG1tMAotCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgIHhtbTYKLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgZm91cjhzCi0KLSAgICAgICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgNAotICAgICAgICAgICAgcGFja3NzZHcgICAgeG1tMSwgICB4bW0wCi0KLSAgICAgICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgeG1tMAotICAgICAgICAgICAgcGFuZCAgICAgICAgeG1tMSwgICB4bW01Ci0KLSAgICAgICAgICAgIHBhbmRuICAgICAgIHhtbTUsICAgeG1tMgotICAgICAgICAgICAgcG9yICAgICAgICAgeG1tNSwgICB4bW0xCi0KLSAgICAgICAgICAgIG1vdmQgICAgICAgIFtlc2krZWN4LThdLCAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIG1tMQotCi0gICAgICAgICAgICBtb3ZkcTJxICAgICBtbTEsICAgIHhtbTUKLSAgICAgICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgMTIKLQotICAgICAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAxMgotICAgICAgICAgICAgYWRkICAgICAgICAgZWN4LCAgICA0Ci0KLSAgICAgICAgICAgIGNtcCAgICAgICAgIGVjeCwgICAgZWR4Ci0gICAgICAgICAgICBqbCAgICAgICAgICBuZXh0Y29sNAotCi0gICAgICAgIH0KLSAgICAgICAgcyArPSBwaXRjaDsKLSAgICB9Ci19Ci0KLSNpZiAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBwbGFuZV9hZGRfbm9pc2VfbW14Ci0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpTdGFydCAgICBzdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlciB0byBhZGQgZ2F1c3NpYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlIHRvCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBXaWR0aCAgICB3aWR0aCBvZiBwbGFuZQotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0ICAgaGVpZ2h0IG9mIHBsYW5lCi0gKiAgICAgICAgICAgICAgICAgIGludCAgUGl0Y2ggICAgZGlzdGFuY2UgYmV0d2VlbiBzdWJzZXF1ZW50IGxpbmVzIG9mIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgIGludCAgcSAgICAgICAgcXVhbnRpemVyIHVzZWQgdG8gZGV0ZXJtaW5lIGFtb3VudCBvZiBub2lzZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZC4KLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IGFkZHMgZ2F1c3NpYW4gbm9pc2UgdG8gYSBwbGFuZSBvZiBwaXhlbHMKLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2VfbW14KHVuc2lnbmVkIGNoYXIgKlN0YXJ0LCB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCwgaW50IHEsIGludCBhKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGludCBQaXRjaDQgPSBQaXRjaCAqIDQ7Ci0gICAgY29uc3QgaW50IG5vaXNlX2Ftb3VudCA9IDI7Ci0gICAgY29uc3QgaW50IG5vaXNlX2FkZGVyID0gMiAqIG5vaXNlX2Ftb3VudCArIDE7Ci0KLSAgICBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdW5zaWduZWQgY2hhciBibGFja2NsYW1wWzE2XTsKLSAgICBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdW5zaWduZWQgY2hhciB3aGl0ZWNsYW1wWzE2XTsKLSAgICBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdW5zaWduZWQgY2hhciBib3RoY2xhbXBbMTZdOwotCi0gICAgY2hhciBjaGFyX2Rpc3RbMzAwXTsKLSAgICBjaGFyIFJhbmRbMjA0OF07Ci0KLSAgICBkb3VibGUgc2lnbWE7Ci0gICAgX19hc20gZW1tcwotICAgIHNpZ21hID0gYSArIC41ICsgLjYgKiAoNjMgLSBxKSAvIDYzLjA7Ci0KLSAgICAvLyBzZXQgdXAgYSBsb29rdXAgdGFibGUgb2YgMjU2IGVudHJpZXMgdGhhdCBtYXRjaGVzCi0gICAgLy8gYSBnYXVzc2lhbiBkaXN0cmlidXRpb24gd2l0aCBzaWdtYSBkZXRlcm1pbmVkIGJ5IHEuCi0gICAgLy8KLSAgICB7Ci0gICAgICAgIGRvdWJsZSBpLCBzdW0gPSAwOwotICAgICAgICBpbnQgbmV4dCwgajsKLQotICAgICAgICBuZXh0ID0gMDsKLQotICAgICAgICBmb3IgKGkgPSAtMzI7IGkgPCAzMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYSA9IChpbnQpKC41ICsgMjU2ICogdnA4X2dhdXNzaWFuKHNpZ21hLCAwLCBpKSk7Ci0KLSAgICAgICAgICAgIGlmIChhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBhOyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyX2Rpc3RbbmV4dCtqXSA9IChjaGFyKSBpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0ICsgajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChuZXh0ID0gbmV4dDsgbmV4dCA8IDI1NjsgbmV4dCsrKQotICAgICAgICAgICAgY2hhcl9kaXN0W25leHRdID0gMDsKLQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCAyMDQ4OyBpKyspCi0gICAgewotICAgICAgICBSYW5kW2ldID0gY2hhcl9kaXN0W3JhbmQoKSAmIDB4ZmZdOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgYmxhY2tjbGFtcFtpXSA9IC1jaGFyX2Rpc3RbMF07Ci0gICAgICAgIHdoaXRlY2xhbXBbaV0gPSAtY2hhcl9kaXN0WzBdOwotICAgICAgICBib3RoY2xhbXBbaV0gPSAtMiAqIGNoYXJfZGlzdFswXTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpQb3MgPSBTdGFydCArIGkgKiBQaXRjaDsKLSAgICAgICAgY2hhciAgKlJlZiA9IFJhbmQgKyAocmFuZCgpICYgMHhmZik7Ci0KLSAgICAgICAgX19hc20KLSAgICAgICAgewotICAgICAgICAgICAgbW92IGVjeCwgW1dpZHRoXQotICAgICAgICAgICAgbW92IGVzaSwgUG9zCi0gICAgICAgICAgICBtb3YgZWRpLCBSZWYKLSAgICAgICAgICAgIHhvciAgICAgICAgIGVheCwgZWF4Ci0KLSAgICAgICAgICAgIG5leHRzZXQ6Ci0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtlc2krZWF4XSAgICAgICAgLy8gZ2V0IHRoZSBzb3VyY2UKLQotICAgICAgICAgICAgcHN1YnVzYiAgICAgbW0xLCBibGFja2NsYW1wICAgICAgIC8vIGNsYW1wIGJvdGggc2lkZXMgc28gd2UgZG9uJ3Qgb3V0cmFuZ2UgYWRkaW5nIG5vaXNlCi0gICAgICAgICAgICBwYWRkdXNiICAgICBtbTEsIGJvdGhjbGFtcAotICAgICAgICAgICAgcHN1YnVzYiAgICAgbW0xLCB3aGl0ZWNsYW1wCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMiwgW2VkaStlYXhdICAgICAgICAvLyBnZXQgdGhlIG5vaXNlIGZvciB0aGlzIGxpbmUKLSAgICAgICAgICAgIHBhZGRiICAgICAgIG1tMSwgbW0yICAgICAgICAgICAgIC8vIGFkZCBpdCBpbgotICAgICAgICAgICAgbW92cSAgICAgICAgW2VzaStlYXhdLCBtbTEgICAgICAgIC8vIHN0b3JlIHRoZSByZXN1bHQKLQotICAgICAgICAgICAgYWRkICAgICAgICAgZWF4LCA4ICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5leHQgbGluZQotCi0gICAgICAgICAgICBjbXAgICAgICAgICBlYXgsIGVjeAotICAgICAgICAgICAgamwgICAgICAgICAgbmV4dHNldAotCi0KLSAgICAgICAgfQotCi0gICAgfQotfQotI2Vsc2UKLWV4dGVybiBjaGFyIGFuWzhdWzY0XVszMDcyXTsKLWV4dGVybiBpbnQgY2RbOF1bNjRdOwotCi12b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2VfbW14KHVuc2lnbmVkIGNoYXIgKlN0YXJ0LCB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCwgaW50IHEsIGludCBhKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB1bnNpZ25lZCBjaGFyIGJsYWNrY2xhbXBbMTZdOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB1bnNpZ25lZCBjaGFyIHdoaXRlY2xhbXBbMTZdOwotICAgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKSB1bnNpZ25lZCBjaGFyIGJvdGhjbGFtcFsxNl07Ci0KLQotICAgIF9fYXNtIGVtbXMKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgYmxhY2tjbGFtcFtpXSA9IC1jZFthXVtxXTsKLSAgICAgICAgd2hpdGVjbGFtcFtpXSA9IC1jZFthXVtxXTsKLSAgICAgICAgYm90aGNsYW1wW2ldID0gLTIgKiBjZFthXVtxXTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpQb3MgPSBTdGFydCArIGkgKiBQaXRjaDsKLSAgICAgICAgY2hhciAgKlJlZiA9IGFuW2FdW3FdICsgKHJhbmQoKSAmIDB4ZmYpOwotCi0gICAgICAgIF9fYXNtCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vdiBlY3gsIFtXaWR0aF0KLSAgICAgICAgICAgIG1vdiBlc2ksIFBvcwotICAgICAgICAgICAgbW92IGVkaSwgUmVmCi0gICAgICAgICAgICB4b3IgICAgICAgICBlYXgsIGVheAotCi0gICAgICAgICAgICBuZXh0c2V0OgotICAgICAgICAgICAgbW92cSAgICAgICAgbW0xLCBbZXNpK2VheF0gICAgICAgIC8vIGdldCB0aGUgc291cmNlCi0KLSAgICAgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgYmxhY2tjbGFtcCAgICAgICAvLyBjbGFtcCBib3RoIHNpZGVzIHNvIHdlIGRvbid0IG91dHJhbmdlIGFkZGluZyBub2lzZQotICAgICAgICAgICAgcGFkZHVzYiAgICAgbW0xLCBib3RoY2xhbXAKLSAgICAgICAgICAgIHBzdWJ1c2IgICAgIG1tMSwgd2hpdGVjbGFtcAotCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTIsIFtlZGkrZWF4XSAgICAgICAgLy8gZ2V0IHRoZSBub2lzZSBmb3IgdGhpcyBsaW5lCi0gICAgICAgICAgICBwYWRkYiAgICAgICBtbTEsIG1tMiAgICAgICAgICAgICAvLyBhZGQgaXQgaW4KLSAgICAgICAgICAgIG1vdnEgICAgICAgIFtlc2krZWF4XSwgbW0xICAgICAgICAvLyBzdG9yZSB0aGUgcmVzdWx0Ci0KLSAgICAgICAgICAgIGFkZCAgICAgICAgIGVheCwgOCAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUKLQotICAgICAgICAgICAgY21wICAgICAgICAgZWF4LCBlY3gKLSAgICAgICAgICAgIGpsICAgICAgICAgIG5leHRzZXQKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi12b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2Vfd210KHVuc2lnbmVkIGNoYXIgKlN0YXJ0LCB1bnNpZ25lZCBpbnQgV2lkdGgsIHVuc2lnbmVkIGludCBIZWlnaHQsIGludCBQaXRjaCwgaW50IHEsIGludCBhKQotewotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgX19kZWNsc3BlYyhhbGlnbigxNikpIHVuc2lnbmVkIGNoYXIgYmxhY2tjbGFtcFsxNl07Ci0gICAgX19kZWNsc3BlYyhhbGlnbigxNikpIHVuc2lnbmVkIGNoYXIgd2hpdGVjbGFtcFsxNl07Ci0gICAgX19kZWNsc3BlYyhhbGlnbigxNikpIHVuc2lnbmVkIGNoYXIgYm90aGNsYW1wWzE2XTsKLQotICAgIF9fYXNtIGVtbXMKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgYmxhY2tjbGFtcFtpXSA9IC1jZFthXVtxXTsKLSAgICAgICAgd2hpdGVjbGFtcFtpXSA9IC1jZFthXVtxXTsKLSAgICAgICAgYm90aGNsYW1wW2ldID0gLTIgKiBjZFthXVtxXTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpQb3MgPSBTdGFydCArIGkgKiBQaXRjaDsKLSAgICAgICAgY2hhciAqUmVmID0gYW5bYV1bcV0gKyAocmFuZCgpICYgMHhmZik7Ci0KLSAgICAgICAgX19hc20KLSAgICAgICAgewotICAgICAgICAgICAgbW92IGVjeCwgICAgW1dpZHRoXQotICAgICAgICAgICAgbW92IGVzaSwgICAgUG9zCi0gICAgICAgICAgICBtb3YgZWRpLCAgICBSZWYKLSAgICAgICAgICAgIHhvciAgICAgICAgIGVheCwgZWF4Ci0KLSAgICAgICAgICAgIG5leHRzZXQ6Ci0gICAgICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCBbZXNpK2VheF0gICAgICAgIC8vIGdldCB0aGUgc291cmNlCi0KLSAgICAgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsIGJsYWNrY2xhbXAgICAgICAgLy8gY2xhbXAgYm90aCBzaWRlcyBzbyB3ZSBkb24ndCBvdXRyYW5nZSBhZGRpbmcgbm9pc2UKLSAgICAgICAgICAgIHBhZGR1c2IgICAgIHhtbTEsIGJvdGhjbGFtcAotICAgICAgICAgICAgcHN1YnVzYiAgICAgeG1tMSwgd2hpdGVjbGFtcAotCi0gICAgICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCBbZWRpK2VheF0gICAgICAgIC8vIGdldCB0aGUgbm9pc2UgZm9yIHRoaXMgbGluZQotICAgICAgICAgICAgcGFkZGIgICAgICAgeG1tMSwgeG1tMiAgICAgICAgICAgICAvLyBhZGQgaXQgaW4KLSAgICAgICAgICAgIG1vdmRxdSAgICAgIFtlc2krZWF4XSwgeG1tMSAgICAgICAgLy8gc3RvcmUgdGhlIHJlc3VsdAotCi0gICAgICAgICAgICBhZGQgICAgICAgICBlYXgsIDE2ICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5leHQgbGluZQotCi0gICAgICAgICAgICBjbXAgICAgICAgICBlYXgsIGVjeAotICAgICAgICAgICAgamwgICAgICAgICAgbmV4dHNldAotICAgICAgICB9Ci0gICAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX3NzZTIuYXNtIGIvdnA4L2NvbW1vbi94ODYvcG9zdHByb2Nfc3NlMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjRiZjUuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvcG9zdHByb2Nfc3NlMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi07dm9pZCB2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc194bW0KLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi07ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLTsgICAgaW50IHJvd3MsCi07ICAgIGludCBjb2xzLAotOyAgICBpbnQgZmxpbWl0Ci07KQotZ2xvYmFsIHN5bSh2cDhfcG9zdF9wcm9jX2Rvd25fYW5kX2Fjcm9zc194bW0pCi1zeW0odnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfeG1tKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0laWYgQUJJX0lTXzMyQklUPTEgJiYgQ09ORklHX1BJQz0xCi0gICAgQUxJR05fU1RBQ0sgMTYsIHJheAotICAgIDsgbW92ZSB0aGUgZ2xvYmFsIHJkIG9udG8gdGhlIHN0YWNrLCBzaW5jZSB3ZSBkb24ndCBoYXZlIGVub3VnaCByZWdpc3RlcnMKLSAgICA7IHRvIGRvIFBJQyBhZGRyZXNzaW5nCi0gICAgbW92ZHFhICAgICAgeG1tMCwgW0dMT0JBTChyZDQyKV0KLSAgICBzdWIgICAgICAgICByc3AsIDE2Ci0gICAgbW92ZHFhICAgICAgW3JzcF0sIHhtbTAKLSVkZWZpbmUgUkQ0MiBbcnNwXQotJWVsc2UKLSVkZWZpbmUgUkQ0MiBbR0xPQkFMKHJkNDIpXQotJWVuZGlmCi0KLQotICAgICAgICBtb3ZkICAgICAgICB4bW0yLCAgICAgICBkd29yZCBwdHIgYXJnKDYpIDtmbGltaXQKLSAgICAgICAgcHVucGNrbHdkICAgeG1tMiwgICAgICAgeG1tMgotICAgICAgICBwdW5wY2tsZHEgICB4bW0yLCAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xxZHEgIHhtbTIsICAgICAgIHhtbTIKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpIDtkc3RfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgRFdPUkQgUFRSIGFyZyg0KSA7cm93cwotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBEV09SRCBQVFIgYXJnKDIpIDtzcmNfcGl4ZWxzX3Blcl9saW5lIDsgZGVzdGluYXRpb24gcGl0Y2g/Ci0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgbW0wID0gMDAwMDAwMDAKLQotbmV4dHJvdzoKLQotICAgICAgICB4b3IgICAgICAgICByZHgsICAgICAgICByZHggICAgICAgOyBjbGVhciBvdXQgcmR4IGZvciB1c2UgYXMgbG9vcCBjb3VudGVyCi1uZXh0Y29sOgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgICAgICA7IG1tNCA9IHIwIHAwLi5wNwotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICA7IG1tMyA9IHAwLi5wMwotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0zICAgICAgICAgICAgICAgICAgICA7IG1tMSA9IHAwLi5wMwotICAgICAgICBwc2xsdyAgICAgICB4bW0zLCAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgUVdPUkQgUFRSIFtyc2kgKyByYXhdICAgOyBtbTQgPSByMSBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSByMSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBtbTMgKz0gbW02Ci0KLSAgICAgICAgOyB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBtbTcgPSByMCBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBtbTcgPSByMCBwMC4ucDMgLSByMSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSByMSBwMC4ucDMgLSByMCBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tNywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBtbTcgPSBhYnMocjAgcDAuLnAzIC0gcjEgcDAuLnAzKQotICAgICAgICBwY21wZ3R3ICAgICB4bW03LCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgUVdPUkQgUFRSIFtyc2kgKyAyKnJheF0gOyBtbTQgPSByMiBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSByMiBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgOyB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBtbTYgPSByMCBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNiwgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBtbTYgPSByMCBwMC4ucDMgLSByMiBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSByMiBwMC4ucDMgLSByMiBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tNiwgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgICAgOyBtbTYgPSBhYnMocjAgcDAuLnAzIC0gcjIgcDAuLnAzKQotICAgICAgICBwY21wZ3R3ICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLQotICAgICAgICBuZWcgICAgICAgICByYXgKLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgUVdPUkQgUFRSIFtyc2krMipyYXhdICAgOyBtbTQgPSByLTIgcDAuLnA3Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgbW01ID0gci0yIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICB4bW0zLCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICA7IG1tMyArPSBtbTUKLQotICAgICAgICA7IHRocmVzaG9sZGluZwotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7IG1tNiA9IHIwIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICAgICAgICA7IG1tNiA9IHAwLi5wMyAtIHItMiBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyBtbTUgPSByLTIgcDAuLnAzIC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTYsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgICAgIDsgbW02ID0gYWJzKHIwIHAwLi5wMyAtIHItMiBwMC4ucDMpCi0gICAgICAgIHBjbXBndHcgICAgIHhtbTYsICAgICAgIHhtbTIKLSAgICAgICAgcG9yICAgICAgICAgeG1tNywgICAgICAgeG1tNiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIHRocmVzaG9sZHMKLQotICAgICAgICBtb3ZxICAgICAgICB4bW00LCAgICAgICBRV09SRCBQVFIgW3JzaStyYXhdICAgICA7IG1tNCA9IHItMSBwMC4ucDcKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBtbTQgPSByLTEgcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHhtbTQgICAgICAgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTEgICAgICAgICAgICAgICAgICAgIDsgbW02ID0gcjAgcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTYsICAgICAgIHhtbTQgICAgICAgICAgICAgICAgICAgIDsgbW02ID0gcDAuLnAzIC0gci0yIHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICB4bW00LCAgICAgICB4bW0xICAgICAgICAgICAgICAgICAgICA7IG1tNSA9IHItMSBwMC4ucDMgLSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tNiwgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgICAgOyBtbTYgPSBhYnMocjAgcDAuLnAzIC0gci0xIHAwLi5wMykKLSAgICAgICAgcGNtcGd0dyAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICB4bW02ICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0KLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgUkQ0MiAgICAgICAgICAgICAgICAgICAgOyBtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgOyBtbTMgLz0gOAotCi0gICAgICAgIHBhbmQgICAgICAgIHhtbTEsICAgICAgIHhtbTcgICAgICAgICAgICAgICAgICAgIDsgbW0xIHNlbGVjdCB2YWxzID4gdGhyZXNoIGZyb20gc291cmNlCi0gICAgICAgIHBhbmRuICAgICAgIHhtbTcsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgICAgIDsgbW03IHNlbGVjdCB2YWxzIDwgdGhyZXNoIGZyb20gYmx1cnJlZCByZXN1bHQKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMSwgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgOyBjb21iaW5hdGlvbgotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgIDsgcGFjayB0byBieXRlcwotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaV0sIHhtbTEgICAgICAgICAgICAgOwotCi0gICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICA7IHBpdGNoIGlzIHBvc2l0aXZlCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIDgKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgOAotCi0gICAgICAgIGFkZCAgICAgICAgIHJkeCwgICAgICAgIDgKLSAgICAgICAgY21wICAgICAgICAgZWR4LCAgICAgICAgZHdvcmQgYXJnKDUpIDtjb2xzCi0KLSAgICAgICAgamwgICAgICAgICAgbmV4dGNvbAotCi0gICAgICAgIDsgZG9uZSB3aXRoIHRoZSBhbGwgY29scywgc3RhcnQgdGhlIGFjcm9zcyBmaWx0ZXJpbmcgaW4gcGxhY2UKLSAgICAgICAgc3ViICAgICAgICAgcnNpLCAgICAgICAgcmR4Ci0gICAgICAgIHN1YiAgICAgICAgIHJkaSwgICAgICAgIHJkeAotCi0gICAgICAgIHhvciAgICAgICAgIHJkeCwgICAgICAgIHJkeAotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JkaS04XTsKLQotYWNyb3NzbmV4dGNvbDoKLSAgICAgICAgbW92cSAgICAgICAgeG1tNywgICAgICAgUVdPUkQgUFRSIFtyZGkgK3JkeCAtMl0KLSAgICAgICAgbW92ZCAgICAgICAgeG1tNCwgICAgICAgRFdPUkQgUFRSIFtyZGkgK3JkeCArNl0KLQotICAgICAgICBwc2xsZHEgICAgICB4bW00LCAgICAgICA4Ci0gICAgICAgIHBvciAgICAgICAgIHhtbTQsICAgICAgIHhtbTcKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICB4bW00Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTMsICAgICAgIDIKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBtbTMgPSBwMC4ucDMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMyAgICAgICAgICAgICAgOyBtbTEgPSBwMC4ucDMKLSAgICAgICAgcHNsbHcgICAgICAgeG1tMywgICAgICAgMgotCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNAotICAgICAgICBwc3JsZHEgICAgICB4bW01LCAgICAgICAzCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0Ci0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgbW0zICs9IG1tNgotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgbW03ID0gcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTcsICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgbW03ID0gcDAuLnAzIC0gcDEuLnA0Ci0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTcsICAgICAgIHhtbTUgICAgICAgICAgICAgIDsgbW03ID0gYWJzKHAwLi5wMyAtIHAxLi5wNCkKLSAgICAgICAgcGNtcGd0dyAgICAgeG1tNywgICAgICAgeG1tMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTQKLSAgICAgICAgcHNybGRxICAgICAgeG1tNSwgICAgICAgNAotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICA7IG1tNSA9IHAyLi5wNQotICAgICAgICBwYWRkdXN3ICAgICB4bW0zLCAgICAgICB4bW01ICAgICAgICAgICAgICA7IG1tMyArPSBtbTUKLQotICAgICAgICA7IHRocmVzaG9sZGluZwotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xICAgICAgICAgICAgICA7IG1tNiA9IHAwLi5wMwotICAgICAgICBwc3VidXN3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICA7IG1tNiA9IHAwLi5wMyAtIHAxLi5wNAotICAgICAgICBwc3VidXN3ICAgICB4bW01LCAgICAgICB4bW0xICAgICAgICAgICAgICA7IG1tNSA9IHAxLi5wNCAtIHAwLi5wMwotICAgICAgICBwYWRkdXN3ICAgICB4bW02LCAgICAgICB4bW01ICAgICAgICAgICAgICA7IG1tNiA9IGFicyhwMC4ucDMgLSBwMS4ucDQpCi0gICAgICAgIHBjbXBndHcgICAgIHhtbTYsICAgICAgIHhtbTIKLSAgICAgICAgcG9yICAgICAgICAgeG1tNywgICAgICAgeG1tNiAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIHRocmVzaG9sZHMKLQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgbW01ID0gcC0yLi5wNQotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICA7IG1tNSA9IHAtMi4ucDEKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgOyB0aHJlc2hvbGRpbmcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMSAgICAgICAgICAgICAgOyBtbTYgPSBwMC4ucDMKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNiwgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBtbTYgPSBwMC4ucDMgLSBwMS4ucDQKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tNSwgICAgICAgeG1tMSAgICAgICAgICAgICAgOyBtbTUgPSBwMS4ucDQgLSBwMC4ucDMKLSAgICAgICAgcGFkZHVzdyAgICAgeG1tNiwgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBtbTYgPSBhYnMocDAuLnAzIC0gcDEuLnA0KQotICAgICAgICBwY21wZ3R3ICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBvciAgICAgICAgIHhtbTcsICAgICAgIHhtbTYgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSB0aHJlc2hvbGRzCi0KLSAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMSAgICAgICAgICAgICAgICAgICA7IG1tNCA9IHAtMS4ucDUKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBtbTQgPSBwLTEuLnAyCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIDsgdGhyZXNob2xkaW5nCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgbW02ID0gcDAuLnAzCi0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTYsICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgbW02ID0gcDAuLnAzIC0gcDEuLnA0Ci0gICAgICAgIHBzdWJ1c3cgICAgIHhtbTQsICAgICAgIHhtbTEgICAgICAgICAgICAgIDsgbW01ID0gcDEuLnA0IC0gcDAuLnAzCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTYsICAgICAgIHhtbTQgICAgICAgICAgICAgIDsgbW02ID0gYWJzKHAwLi5wMyAtIHAxLi5wNCkKLSAgICAgICAgcGNtcGd0dyAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICBwb3IgICAgICAgICB4bW03LCAgICAgICB4bW02ICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgdGhyZXNob2xkcwotCi0gICAgICAgIHBhZGR1c3cgICAgIHhtbTMsICAgICAgIFJENDIgICAgICAgICAgICAgIDsgbW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIDMgICAgICAgICAgICAgICAgIDsgbW0zIC89IDgKLQotICAgICAgICBwYW5kICAgICAgICB4bW0xLCAgICAgICB4bW03ICAgICAgICAgICAgICA7IG1tMSBzZWxlY3QgdmFscyA+IHRocmVzaCBmcm9tIHNvdXJjZQotICAgICAgICBwYW5kbiAgICAgICB4bW03LCAgICAgICB4bW0zICAgICAgICAgICAgICA7IG1tNyBzZWxlY3QgdmFscyA8IHRocmVzaCBmcm9tIGJsdXJyZWQgcmVzdWx0Ci0gICAgICAgIHBhZGR1c3cgICAgIHhtbTEsICAgICAgIHhtbTcgICAgICAgICAgICAgIDsgY29tYmluYXRpb24KLQotICAgICAgICBwYWNrdXN3YiAgICB4bW0xLCAgICAgICB4bW0wICAgICAgICAgICAgICA7IHBhY2sgdG8gYnl0ZXMKLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtyZGkrcmR4LThdLCAgbW0wICAgOyBzdG9yZSBwcmV2aW91cyBmb3VyIGJ5dGVzCi0gICAgICAgIG1vdmRxMnEgICAgIG1tMCwgICAgICAgIHhtbTEKLQotICAgICAgICBhZGQgICAgICAgICByZHgsICAgICAgICA4Ci0gICAgICAgIGNtcCAgICAgICAgIGVkeCwgICAgICAgIGR3b3JkIGFyZyg1KSA7Y29scwotICAgICAgICBqbCAgICAgICAgICBhY3Jvc3NuZXh0Y29sOwotCi0gICAgICAgIDsgbGFzdCA4IHBpeGVscwotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaStyZHgtOF0sICBtbTAKLQotICAgICAgICA7IGRvbmUgd2l0aCB0aGlzIHJ3bwotICAgICAgICBhZGQgICAgICAgICByc2kscmF4ICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKLSAgICAgICAgbW92ICAgICAgICAgZWF4LCBkd29yZCBhcmcoMykgO2RzdF9waXhlbHNfcGVyX2xpbmUgOyBkZXN0aW5hdGlvbiBwaXRjaD8KLSAgICAgICAgYWRkICAgICAgICAgcmRpLHJheCAgICAgICAgICAgICAgIDsgbmV4dCBkZXN0aW5hdGlvbgotICAgICAgICBtb3YgICAgICAgICBlYXgsIGR3b3JkIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZSA7IGRlc3RpbmF0aW9uIHBpdGNoPwotCi0gICAgICAgIGRlYyAgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgICA7IGRlY3JlbWVudCBjb3VudAotICAgICAgICBqbnogICAgICAgICBuZXh0cm93ICAgICAgICAgICAgICAgOyBuZXh0IHJvdwotCi0laWYgQUJJX0lTXzMyQklUPTEgJiYgQ09ORklHX1BJQz0xCi0gICAgYWRkIHJzcCwxNgotICAgIHBvcCByc3AKLSVlbmRpZgotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotJXVuZGVmIFJENDIKLQotCi07dm9pZCB2cDhfbWJwb3N0X3Byb2NfZG93bl94bW0odW5zaWduZWQgY2hhciAqZHN0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsIGludCByb3dzLCBpbnQgY29scyxpbnQgZmxpbWl0KQotZXh0ZXJuIHN5bSh2cDhfcnYpCi1nbG9iYWwgc3ltKHZwOF9tYnBvc3RfcHJvY19kb3duX3htbSkKLXN5bSh2cDhfbWJwb3N0X3Byb2NfZG93bl94bW0pOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxMjgrMTYKLQotICAgIDsgdW5zaWduZWQgY2hhciBkWzE2XVs4XSBhdCBbcnNwXQotICAgIDsgY3JlYXRlIGZsaW1pdDIgYXQgW3JzcCsxMjhdCi0gICAgbW92ICAgICAgICAgZWF4LCBkd29yZCBwdHIgYXJnKDQpIDtmbGltaXQKLSAgICBtb3YgICAgICAgICBbcnNwKzEyOF0sIGVheAotICAgIG1vdiAgICAgICAgIFtyc3ArMTI4KzRdLCBlYXgKLSAgICBtb3YgICAgICAgICBbcnNwKzEyOCs4XSwgZWF4Ci0gICAgbW92ICAgICAgICAgW3JzcCsxMjgrMTJdLCBlYXgKLSVkZWZpbmUgZmxpbWl0NCBbcnNwKzEyOF0KLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgbGVhICAgICAgICAgcjgsICAgICAgIFtHTE9CQUwoc3ltKHZwOF9ydikpXQotJWVuZGlmCi0KLSAgICA7cm93cyArPTg7Ci0gICAgYWRkICAgICAgICAgZHdvcmQgYXJnKDIpLCA4Ci0KLSAgICA7Zm9yKGM9MDsgYzxjb2xzOyBjKz04KQotbG9vcF9jb2w6Ci0gICAgICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgOyBzCi0gICAgICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICA7Ci0KLSAgICAgICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3BpdGNoICAgICAgIDsKLSAgICAgICAgICAgIG5lZyAgICAgICAgIHJheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHJheCA9IC1waXRjaAotCi0gICAgICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4KjhdOyAgICAgICAgICAgICAgOyByZGkgPSBzWy1waXRjaCo4XQotICAgICAgICAgICAgbmVnICAgICAgICAgcmF4Ci0KLQotICAgICAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgeG1tNQotICAgICAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgeG1tNiAgICAgICAgOwotCi0gICAgICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICB4bW03ICAgICAgICA7Ci0gICAgICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICByc2kKLQotICAgICAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgMTUgICAgICAgICAgOwotCi1sb29wX2luaXR2YXI6Ci0gICAgICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBRV09SRCBQVFIgW3JkaV07Ci0gICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wICAgICAgICA7Ci0KLSAgICAgICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgIHhtbTEgICAgICAgIDsKLSAgICAgICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIHhtbTEgICAgICAgIDsKLQotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMSAgICAgICAgOwotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgOwotCi0gICAgICAgICAgICBwdW5wY2tod2QgICB4bW0yLCAgICAgICB4bW0wICAgICAgICA7Ci0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICB4bW0xICAgICAgICA7Ci0KLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTcsICAgICAgIHhtbTIgICAgICAgIDsKLSAgICAgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmF4XSAgIDsKLQotICAgICAgICAgICAgZGVjICAgICAgICAgcmN4Ci0gICAgICAgICAgICBqbmUgICAgICAgICBsb29wX2luaXR2YXIKLSAgICAgICAgICAgIDtzYXZlIHRoZSB2YXIgYW5kIHN1bQotICAgICAgICAgICAgeG9yICAgICAgICAgcmR4LCAgICAgICAgcmR4Ci1sb29wX3JvdzoKLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgOyBbcy1waXRjaCo4XQotICAgICAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICA7IFtzK3BpdGNoKjddCi0KLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAKLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTAKLQotICAgICAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgeG1tMgotICAgICAgICAgICAgcHN1YncgICAgICAgeG1tNSwgICAgICAgeG1tMQotCi0gICAgICAgICAgICBwbXVsbHcgICAgICB4bW0yLCAgICAgICB4bW0yCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0yCi0KLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgICAgIHhtbTAKLSAgICAgICAgICAgIHB1bnBja2h3ZCAgIHhtbTQsICAgICAgIHhtbTAKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICAgICAgeG1tNAotCi0gICAgICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICB4bW0xCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0xCi0KLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgICAgIHhtbTAKLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTYsICAgICAgIHhtbTEKLQotICAgICAgICAgICAgcHVucGNraHdkICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNywgICAgICAgeG1tMgotCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTYKLSAgICAgICAgICAgIHBzbGxkICAgICAgIHhtbTMsICAgICAgIDQKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tMywgICAgICAgeG1tNgotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tNQotCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW01Ci0gICAgICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICB4bW0xCi0KLSAgICAgICAgICAgIHBtdWxodyAgICAgIHhtbTQsICAgICAgIHhtbTQKLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTEKLQotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tNAotICAgICAgICAgICAgcHVucGNraHdkICAgeG1tMiwgICAgICAgeG1tNAotCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW03Ci0gICAgICAgICAgICBwc2xsZCAgICAgICB4bW00LCAgICAgICA0Ci0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTQsICAgICAgIHhtbTcKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNCwgICAgICAgeG1tMgotCi0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW0zLCAgICAgICBmbGltaXQ0Ci0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW00LCAgICAgICBmbGltaXQ0Ci0KLSAgICAgICAgICAgIHBzcmFkICAgICAgIHhtbTMsICAgICAgIDMxCi0gICAgICAgICAgICBwc3JhZCAgICAgICB4bW00LCAgICAgICAzMQotCi0gICAgICAgICAgICBwYWNrc3NkdyAgICB4bW0zLCAgICAgICB4bW00Ci0gICAgICAgICAgICBwYWNrc3N3YiAgICB4bW0zLCAgICAgICB4bW0wCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFFXT1JEIFBUUiBbcnNpK3JheCo4XQotCi0gICAgICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICB4bW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wCi0KLSAgICAgICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIHhtbTUKLSAgICAgICAgICAgIG1vdiAgICAgICAgIHJjeCwgICAgICAgIHJkeAotCi0gICAgICAgICAgICBhbmQgICAgICAgICByY3gsICAgICAgICAxMjcKLSVpZiBBQklfSVNfMzJCSVQ9MSAmJiBDT05GSUdfUElDPTEKLSAgICAgICAgICAgIHB1c2ggICAgICAgIHJheAotICAgICAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X3J2KSldCi0gICAgICAgICAgICBtb3ZkcXUgICAgICB4bW00LCAgICAgICBbcmF4ICsgcmN4KjJdIDt2cDhfcnZbcmN4KjJdCi0gICAgICAgICAgICBwb3AgICAgICAgICByYXgKLSVlbGlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgICAgICBtb3ZkcXUgICAgICB4bW00LCAgICAgICBbcjggKyByY3gqMl0gO3ZwOF9ydltyY3gqMl0KLSVlbHNlCi0gICAgICAgICAgICBtb3ZkcXUgICAgICB4bW00LCAgICAgICBbc3ltKHZwOF9ydikgKyByY3gqMl0KLSVlbmRpZgotCi0gICAgICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICB4bW00Ci0gICAgICAgICAgICA7cGFkZHcgICAgIHhtbTEsICAgICAgIGVpZ2h0OHMKLSAgICAgICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgIDQKLQotICAgICAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICAgICAgcGFuZCAgICAgICAgeG1tMSwgICAgICAgeG1tMwotCi0gICAgICAgICAgICBwYW5kbiAgICAgICB4bW0zLCAgICAgICB4bW0yCi0gICAgICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICB4bW0zCi0KLSAgICAgICAgICAgIGFuZCAgICAgICAgIHJjeCwgICAgICAgIDE1Ci0gICAgICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgICBbcnNwICsgcmN4KjhdLCB4bW0xIDtkW3JjeCo4XQotCi0gICAgICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICByZHgKLSAgICAgICAgICAgIHN1YiAgICAgICAgIHJjeCwgICAgICAgIDgKLQotICAgICAgICAgICAgYW5kICAgICAgICAgcmN4LCAgICAgICAgMTUKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIFtyc3AgKyByY3gqOF0gO2RbcmN4KjhdCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIFtyc2ldLCAgICAgIG1tMAotICAgICAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXhdCi0KLSAgICAgICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmF4XQotICAgICAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgMQotCi0gICAgICAgICAgICBjbXAgICAgICAgICBlZHgsICAgICAgICBkd29yZCBhcmcoMikgO3Jvd3MKLSAgICAgICAgICAgIGpsICAgICAgICAgIGxvb3Bfcm93Ci0KLSAgICAgICAgYWRkICAgICAgICAgZHdvcmQgYXJnKDApLCA4IDsgcyArPSA4Ci0gICAgICAgIHN1YiAgICAgICAgIGR3b3JkIGFyZygzKSwgOCA7IGNvbHMgLT0gOAotICAgICAgICBjbXAgICAgICAgICBkd29yZCBhcmcoMyksIDAKLSAgICAgICAgamcgICAgICAgICAgbG9vcF9jb2wKLQotICAgIGFkZCAgICAgICAgIHJzcCwgMTI4KzE2Ci0gICAgcG9wICAgICAgICAgcnNwCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLSV1bmRlZiBmbGltaXQ0Ci0KLQotO3ZvaWQgdnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF94bW0odW5zaWduZWQgY2hhciAqc3JjLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBpbnQgcm93cywgaW50IGNvbHMsaW50IGZsaW1pdCkKLWdsb2JhbCBzeW0odnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF94bW0pCi1zeW0odnA4X21icG9zdF9wcm9jX2Fjcm9zc19pcF94bW0pOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxNgotCi0gICAgOyBjcmVhdGUgZmxpbWl0NCBhdCBbcnNwXQotICAgIG1vdiAgICAgICAgIGVheCwgZHdvcmQgcHRyIGFyZyg0KSA7ZmxpbWl0Ci0gICAgbW92ICAgICAgICAgW3JzcF0sIGVheAotICAgIG1vdiAgICAgICAgIFtyc3ArNF0sIGVheAotICAgIG1vdiAgICAgICAgIFtyc3ArOF0sIGVheAotICAgIG1vdiAgICAgICAgIFtyc3ArMTJdLCBlYXgKLSVkZWZpbmUgZmxpbWl0NCBbcnNwXQotCi0KLSAgICA7Zm9yKHI9MDtyPHJvd3M7cisrKQotaXBfcm93X2xvb3A6Ci0KLSAgICAgICAgeG9yICAgICAgICAgcmR4LCAgICByZHggO3N1bXNxPTA7Ci0gICAgICAgIHhvciAgICAgICAgIHJjeCwgICAgcmN4IDtzdW09MDsKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICBhcmcoMCk7IHMKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAtOAotaXBfdmFyX2xvb3A6Ci0gICAgICAgIDtmb3IoaT0tODtpPD02O2krKykKLSAgICAgICAgO3sKLSAgICAgICAgOyAgICBzdW1zcSArPSBzW2ldKnNbaV07Ci0gICAgICAgIDsgICAgc3VtICAgKz0gc1tpXTsKLSAgICAgICAgO30KLSAgICAgICAgbW92enggICAgICAgZWF4LCBieXRlIFtyc2krcmRpXQotICAgICAgICBhZGQgICAgICAgICBlY3gsIGVheAotICAgICAgICBtdWwgICAgICAgICBhbAotICAgICAgICBhZGQgICAgICAgICBlZHgsIGVheAotICAgICAgICBhZGQgICAgICAgICByZGksIDEKLSAgICAgICAgY21wICAgICAgICAgcmRpLCA2Ci0gICAgICAgIGpsZSAgICAgICAgIGlwX3Zhcl9sb29wCi0KLQotICAgICAgICAgICAgO21vdiAgICAgICAgIHJheCwgICAgc3Vtc3EKLSAgICAgICAgICAgIDttb3ZkICAgICAgICB4bW03LCAgIHJheAotICAgICAgICAgICAgbW92ZCAgICAgICAgeG1tNywgICBlZHgKLQotICAgICAgICAgICAgO21vdiAgICAgICAgIHJheCwgICAgc3VtCi0gICAgICAgICAgICA7bW92ZCAgICAgICAgeG1tNiwgICByYXgKLSAgICAgICAgICAgIG1vdmQgICAgICAgIHhtbTYsICAgZWN4Ci0KLSAgICAgICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgYXJnKDApIDtzCi0gICAgICAgICAgICB4b3IgICAgICAgICByY3gsICAgIHJjeAotCi0gICAgICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgIGR3b3JkIGFyZygzKSA7Y29scwotICAgICAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICA4Ci0gICAgICAgICAgICBweG9yICAgICAgICBtbTAsICAgIG1tMAotICAgICAgICAgICAgcHhvciAgICAgICAgbW0xLCAgICBtbTEKLQotICAgICAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICB4bW0wCi1uZXh0Y29sNDoKLQotICAgICAgICAgICAgbW92ZCAgICAgICAgeG1tMSwgICBEV09SRCBQVFIgW3JzaStyY3gtOF0gICA7IC04IC03IC02IC01Ci0gICAgICAgICAgICBtb3ZkICAgICAgICB4bW0yLCAgIERXT1JEIFBUUiBbcnNpK3JjeCs3XSAgIDsgKzcgKzggKzkgKzEwCi0KLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBleHBhbmRpbmcKLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBleHBhbmRpbmcKLQotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICB4bW0wICAgICAgICAgICAgICAgICAgICA7IGV4cGFuZGluZyB0byBkd29yZHMKLSAgICAgICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgeG1tMCAgICAgICAgICAgICAgICAgICAgOyBleHBhbmRpbmcgdG8gZHdvcmRzCi0KLSAgICAgICAgICAgIHBzdWJkICAgICAgIHhtbTIsICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyA3LS04ICAgOC0tNyAgIDktLTYgMTAtLTUKLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyAtOCoyICAgLTcqMiAgIC02KjIgLTUqMgotCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgIHhtbTIgICAgICAgICAgICAgICAgICAgIDsgNystOCAgIDgrLTcgICA5Ky02IDEwKy01Ci0gICAgICAgICAgICBwbWFkZHdkICAgICB4bW0xLCAgIHhtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlZCBvZiA3Ky04ICAgOCstNyAgIDkrLTYgMTArLTUKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW0yCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgIHhtbTEKLQotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tNiwgICB4bW02LCAgIDAgICAgICAgICAgICAgICA7IGR1cGxpY2F0ZSB0aGUgbGFzdCBvbmVzCi0gICAgICAgICAgICBwc2h1ZmQgICAgICB4bW03LCAgIHhtbTcsICAgMCAgICAgICAgICAgICAgIDsgZHVwbGljYXRlIHRoZSBsYXN0IG9uZXMKLQotICAgICAgICAgICAgcHNybGRxICAgICAgeG1tMSwgICAgICAgNCAgICAgICAgICAgICAgICAgICA7IDgtLTcgICA5LS02IDEwLS01ICAwMDAwCi0gICAgICAgICAgICBwc3JsZHEgICAgICB4bW0yLCAgICAgICA0ICAgICAgICAgICAgICAgICAgIDsgOC0tNyAgIDktLTYgMTAtLTUgIDAwMDAKLQotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tMywgICB4bW0xLCAgIDMgICAgICAgICAgICAgICA7IDAwMDAgIDgtLTcgICA4LS03ICAgOC0tNyBzcXVhcmVkCi0gICAgICAgICAgICBwc2h1ZmQgICAgICB4bW00LCAgIHhtbTIsICAgMyAgICAgICAgICAgICAgIDsgMDAwMCAgOC0tNyAgIDgtLTcgICA4LS03IHNxdWFyZWQKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICB4bW00Ci0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgIHhtbTMKLQotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tMywgICB4bW0xLCAgIDAxMDExMTExYiAgICAgICA7IDAwMDAgIDAwMDAgICA5LS02ICAgOS0tNiBzcXVhcmVkCi0gICAgICAgICAgICBwc2h1ZmQgICAgICB4bW00LCAgIHhtbTIsICAgMDEwMTExMTFiICAgICAgIDsgMDAwMCAgMDAwMCAgIDktLTYgICA5LS02IHNxdWFyZWQKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICB4bW0zCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgIHhtbTQKLQotICAgICAgICAgICAgcHNodWZkICAgICAgeG1tMywgICB4bW0xLCAgIDEwMTExMTExYiAgICAgICA7IDAwMDAgIDAwMDAgICA4LS03ICAgOC0tNyBzcXVhcmVkCi0gICAgICAgICAgICBwc2h1ZmQgICAgICB4bW00LCAgIHhtbTIsICAgMTAxMTExMTFiICAgICAgIDsgMDAwMCAgMDAwMCAgIDgtLTcgICA4LS03IHNxdWFyZWQKLQotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICB4bW0zCi0gICAgICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgIHhtbTQKLQotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICB4bW02Ci0gICAgICAgICAgICBwbWFkZHdkICAgICB4bW0zLCAgIHhtbTMKLQotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICB4bW03Ci0gICAgICAgICAgICBwc2xsZCAgICAgICB4bW01LCAgIDQKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNSwgICB4bW03Ci0gICAgICAgICAgICBwc3ViZCAgICAgICB4bW01LCAgIHhtbTMKLQotICAgICAgICAgICAgcHN1YmQgICAgICAgeG1tNSwgICBmbGltaXQ0Ci0gICAgICAgICAgICBwc3JhZCAgICAgICB4bW01LCAgIDMxCi0KLSAgICAgICAgICAgIHBhY2tzc2R3ICAgIHhtbTUsICAgeG1tMAotICAgICAgICAgICAgcGFja3Nzd2IgICAgeG1tNSwgICB4bW0wCi0KLSAgICAgICAgICAgIG1vdmQgICAgICAgIHhtbTEsICAgRFdPUkQgUFRSIFtyc2krcmN4XQotICAgICAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICB4bW0xCi0KLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgeG1tMAotICAgICAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICB4bW0wCi0KLSAgICAgICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgeG1tNgotICAgICAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICBbR0xPQkFMKGZvdXI4cyldCi0KLSAgICAgICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgNAotICAgICAgICAgICAgcGFja3NzZHcgICAgeG1tMSwgICB4bW0wCi0KLSAgICAgICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgeG1tMAotICAgICAgICAgICAgcGFuZCAgICAgICAgeG1tMSwgICB4bW01Ci0KLSAgICAgICAgICAgIHBhbmRuICAgICAgIHhtbTUsICAgeG1tMgotICAgICAgICAgICAgcG9yICAgICAgICAgeG1tNSwgICB4bW0xCi0KLSAgICAgICAgICAgIG1vdmQgICAgICAgIFtyc2krcmN4LThdLCAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIG1tMQotCi0gICAgICAgICAgICBtb3ZkcTJxICAgICBtbTEsICAgIHhtbTUKLSAgICAgICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgMTIKLQotICAgICAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAxMgotICAgICAgICAgICAgYWRkICAgICAgICAgcmN4LCAgICA0Ci0KLSAgICAgICAgICAgIGNtcCAgICAgICAgIHJjeCwgICAgcmR4Ci0gICAgICAgICAgICBqbCAgICAgICAgICBuZXh0Y29sNAotCi0gICAgICAgIDtzKz1waXRjaDsKLSAgICAgICAgbW92c3hkIHJheCwgZHdvcmQgYXJnKDEpCi0gICAgICAgIGFkZCAgICBhcmcoMCksIHJheAotCi0gICAgICAgIHN1YiBkd29yZCBhcmcoMiksIDEgO3Jvd3MtPTEKLSAgICAgICAgY21wIGR3b3JkIGFyZygyKSwgMAotICAgICAgICBqZyBpcF9yb3dfbG9vcAotCi0gICAgYWRkICAgICAgICAgcnNwLCAxNgotICAgIHBvcCAgICAgICAgIHJzcAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0ldW5kZWYgZmxpbWl0NAotCi0KLTt2b2lkIHZwOF9wbGFuZV9hZGRfbm9pc2Vfd210ICh1bnNpZ25lZCBjaGFyICpTdGFydCwgdW5zaWduZWQgY2hhciAqbm9pc2UsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmxhY2tjbGFtcFsxNl0sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgd2hpdGVjbGFtcFsxNl0sCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYm90aGNsYW1wWzE2XSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFdpZHRoLCB1bnNpZ25lZCBpbnQgSGVpZ2h0LCBpbnQgUGl0Y2gpCi1leHRlcm4gc3ltKHJhbmQpCi1nbG9iYWwgc3ltKHZwOF9wbGFuZV9hZGRfbm9pc2Vfd210KQotc3ltKHZwOF9wbGFuZV9hZGRfbm9pc2Vfd210KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotYWRkbm9pc2VfbG9vcDoKLSAgICBjYWxsIHN5bShyYW5kKSBXUlRfUExUCi0gICAgbW92ICAgICByY3gsIGFyZygxKSA7bm9pc2UKLSAgICBhbmQgICAgIHJheCwgMHhmZgotICAgIGFkZCAgICAgcmN4LCByYXgKLQotICAgIDsgd2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSBjbGFtcGluZyB2ZWN0b3JzIGFyZSBzdG9yZWQgY29udGlndW91c2x5Ci0gICAgOyBpbiBibGFjay93aGl0ZS9ib3RoIG9yZGVyLiBOb3RlIHRoYXQgd2UgaGF2ZSB0byByZWxvYWQgdGhpcyBoZXJlIGJlY2F1c2UKLSAgICA7IHJkeCBjb3VsZCBiZSB0cmFzaGVkIGJ5IHJhbmQoKQotICAgIG1vdiAgICAgcmR4LCBhcmcoMikgOyBibGFja2NsYW1wCi0KLQotICAgICAgICAgICAgbW92ICAgICByZGksIHJjeAotICAgICAgICAgICAgbW92c3hkICByY3gsIGR3b3JkIGFyZyg1KSA7W1dpZHRoXQotICAgICAgICAgICAgbW92ICAgICByc2ksIGFyZygwKSA7UG9zCi0gICAgICAgICAgICB4b3IgICAgICAgICByYXgscmF4Ci0KLWFkZG5vaXNlX25leHRzZXQ6Ci0gICAgICAgICAgICBtb3ZkcXUgICAgICB4bW0xLFtyc2krcmF4XSAgICAgICAgIDsgZ2V0IHRoZSBzb3VyY2UKLQotICAgICAgICAgICAgcHN1YnVzYiAgICAgeG1tMSwgW3JkeF0gICAgO2JsYWNrY2xhbXAgICAgICAgIDsgY2xhbXAgYm90aCBzaWRlcyBzbyB3ZSBkb24ndCBvdXRyYW5nZSBhZGRpbmcgbm9pc2UKLSAgICAgICAgICAgIHBhZGR1c2IgICAgIHhtbTEsIFtyZHgrMzJdIDtib3RoY2xhbXAKLSAgICAgICAgICAgIHBzdWJ1c2IgICAgIHhtbTEsIFtyZHgrMTZdIDt3aGl0ZWNsYW1wCi0KLSAgICAgICAgICAgIG1vdmRxdSAgICAgIHhtbTIsW3JkaStyYXhdICAgICAgICAgOyBnZXQgdGhlIG5vaXNlIGZvciB0aGlzIGxpbmUKLSAgICAgICAgICAgIHBhZGRiICAgICAgIHhtbTEseG1tMiAgICAgICAgICAgICAgOyBhZGQgaXQgaW4KLSAgICAgICAgICAgIG1vdmRxdSAgICAgIFtyc2krcmF4XSx4bW0xICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0Ci0KLSAgICAgICAgICAgIGFkZCAgICAgICAgIHJheCwxNiAgICAgICAgICAgICAgICAgOyBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUKLQotICAgICAgICAgICAgY21wICAgICAgICAgcmF4LCByY3gKLSAgICAgICAgICAgIGpsICAgICAgICAgIGFkZG5vaXNlX25leHRzZXQKLQotICAgIG1vdnN4ZCAgcmF4LCBkd29yZCBhcmcoNykgOyBQaXRjaAotICAgIGFkZCAgICAgYXJnKDApLCByYXggOyBTdGFydCArPSBQaXRjaAotICAgIHN1YiAgICAgZHdvcmQgYXJnKDYpLCAxICAgOyBIZWlnaHQgLT0gMQotICAgIGpnICAgICAgYWRkbm9pc2VfbG9vcAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotcmQ0MjoKLSAgICB0aW1lcyA4IGR3IDB4MDQKLWZvdXI4czoKLSAgICB0aW1lcyA0IGRkIDgKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3Bvc3Rwcm9jX3g4Ni5oIGIvdnA4L2NvbW1vbi94ODYvcG9zdHByb2NfeDg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWRkMmYuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvcG9zdHByb2NfeDg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBQT1NUUFJPQ19YODZfSAotI2RlZmluZSBQT1NUUFJPQ19YODZfSAotCi0vKiBOb3RlOgotICoKLSAqIFRoaXMgcGxhdGZvcm0gaXMgY29tbW9ubHkgYnVpbHQgZm9yIHJ1bnRpbWUgQ1BVIGRldGVjdGlvbi4gSWYgeW91IG1vZGlmeQotICogYW55IG9mIHRoZSBmdW5jdGlvbiBtYXBwaW5ncyBwcmVzZW50IGluIHRoaXMgZmlsZSwgYmUgc3VyZSB0byBhbHNvIHVwZGF0ZQotICogdGhlbSBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbml0aWFsaXphdGlvbiBjb2RlCi0gKi8KLQotI2lmIEhBVkVfTU1YCi1leHRlcm4gcHJvdG90eXBlX3Bvc3Rwcm9jX2lucGxhY2UodnA4X21icG9zdF9wcm9jX2Rvd25fbW14KTsKLWV4dGVybiBwcm90b3R5cGVfcG9zdHByb2ModnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfcG9zdHByb2NfYWRkbm9pc2UodnA4X3BsYW5lX2FkZF9ub2lzZV9tbXgpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2Rvd24KLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2Rvd24gdnA4X21icG9zdF9wcm9jX2Rvd25fbW14Ci0KLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2Rvd25hY3Jvc3MKLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2Rvd25hY3Jvc3MgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfbW14Ci0KLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2FkZG5vaXNlCi0jZGVmaW5lIHZwOF9wb3N0cHJvY19hZGRub2lzZSB2cDhfcGxhbmVfYWRkX25vaXNlX21teAotCi0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZiBIQVZFX1NTRTIKLWV4dGVybiBwcm90b3R5cGVfcG9zdHByb2NfaW5wbGFjZSh2cDhfbWJwb3N0X3Byb2NfZG93bl94bW0pOwotZXh0ZXJuIHByb3RvdHlwZV9wb3N0cHJvY19pbnBsYWNlKHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tKTsKLWV4dGVybiBwcm90b3R5cGVfcG9zdHByb2ModnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfeG1tKTsKLWV4dGVybiBwcm90b3R5cGVfcG9zdHByb2NfYWRkbm9pc2UodnA4X3BsYW5lX2FkZF9ub2lzZV93bXQpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2Rvd24KLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2Rvd24gdnA4X21icG9zdF9wcm9jX2Rvd25feG1tCi0KLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2Fjcm9zcwotI2RlZmluZSB2cDhfcG9zdHByb2NfYWNyb3NzIHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tCi0KLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2Rvd25hY3Jvc3MKLSNkZWZpbmUgdnA4X3Bvc3Rwcm9jX2Rvd25hY3Jvc3MgdnA4X3Bvc3RfcHJvY19kb3duX2FuZF9hY3Jvc3NfeG1tCi0KLSN1bmRlZiAgdnA4X3Bvc3Rwcm9jX2FkZG5vaXNlCi0jZGVmaW5lIHZwOF9wb3N0cHJvY19hZGRub2lzZSB2cDhfcGxhbmVfYWRkX25vaXNlX3dtdAotCi0KLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYvcmVjb25fbW14LmFzbSBiL3ZwOC9jb21tb24veDg2L3JlY29uX21teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjExZmMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvcmVjb25fbW14LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi07dm9pZCB2cDhfcmVjb25fYl9tbXgodW5zaWduZWQgY2hhciAqcywgc2hvcnQgKnEsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBzdHJpZGUpCi1nbG9iYWwgc3ltKHZwOF9yZWNvbl9iX21teCkKLXN5bSh2cDhfcmVjb25fYl9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICByc2ksIGFyZygwKSA7cwotICAgICAgICBtb3YgICAgICAgcmRpLCBhcmcoMikgO2QKLSAgICAgICAgbW92ICAgICAgIHJkeCwgYXJnKDEpIDtxCi0gICAgICAgIG1vdnN4ZCAgICByYXgsIGR3b3JkIHB0ciBhcmcoMykgO3N0cmlkZQotICAgICAgICBweG9yICAgICAgbW0wLCBtbTAKLQotICAgICAgICBtb3ZkICAgICAgbW0xLCBbcnNpXQotICAgICAgICBwdW5wY2tsYncgbW0xLCBtbTAKLSAgICAgICAgcGFkZHN3ICAgIG1tMSwgW3JkeF0KLSAgICAgICAgcGFja3Vzd2IgIG1tMSwgIG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCB1bnBhY2sgdG8gc2F0dXJhdGUKLSAgICAgICAgbW92ZCAgICAgIFtyZGldLCBtbTEKLQotICAgICAgICBtb3ZkICAgICAgbW0yLCBbcnNpKzE2XQotICAgICAgICBwdW5wY2tsYncgbW0yLCBtbTAKLSAgICAgICAgcGFkZHN3ICAgIG1tMiwgW3JkeCszMl0KLSAgICAgICAgcGFja3Vzd2IgIG1tMiwgbW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZkICAgICAgW3JkaStyYXhdLCBtbTIKLQotICAgICAgICBtb3ZkICAgICAgbW0zLCBbcnNpKzMyXQotICAgICAgICBwdW5wY2tsYncgbW0zLCBtbTAKLSAgICAgICAgcGFkZHN3ICAgIG1tMywgW3JkeCs2NF0KLSAgICAgICAgcGFja3Vzd2IgIG1tMywgIG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCB1bnBhY2sgdG8gc2F0dXJhdGUKLSAgICAgICAgbW92ZCAgICAgIFtyZGkrMipyYXhdLCBtbTMKLQotICAgICAgICBhZGQgICAgICAgcmRpLCByYXgKLSAgICAgICAgbW92ZCAgICAgIG1tNCwgW3JzaSs0OF0KLSAgICAgICAgcHVucGNrbGJ3IG1tNCwgbW0wCi0gICAgICAgIHBhZGRzdyAgICBtbTQsIFtyZHgrOTZdCi0gICAgICAgIHBhY2t1c3diICBtbTQsIG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCB1bnBhY2sgdG8gc2F0dXJhdGUKLSAgICAgICAgbW92ZCAgICAgIFtyZGkrMipyYXhdLCBtbTQKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgY29weV9tZW04eDhfbW14KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmMsCi07ICAgIGludCBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi07ICAgIGludCBkc3Rfc3RyaWRlCi07ICAgICkKLWdsb2JhbCBzeW0odnA4X2NvcHlfbWVtOHg4X21teCkKLXN5bSh2cDhfY29weV9tZW04eDhfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyYzsKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzaV0KLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlOwotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2RzdDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcnNpK3JheF0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JzaStyYXgqMl0KLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3Rfc3RyaWRlCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgbW0wCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJheAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sICAgIG1tMgotCi0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqMl0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgW3JzaV0KLQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByY3gKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgW3JzaStyYXhdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgbW0zCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3hdLCAgbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sICAgIG1tNQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIFtyc2krcmF4XQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcnNpK3JheCoyXQotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgIG1tMAotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyXSxtbTEKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgY29weV9tZW04eDRfbW14KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmMsCi07ICAgIGludCBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi07ICAgIGludCBkc3Rfc3RyaWRlCi07ICAgICkKLWdsb2JhbCBzeW0odnA4X2NvcHlfbWVtOHg0X21teCkKLXN5bSh2cDhfY29weV9tZW04eDRfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyYzsKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzaV0KLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlOwotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2RzdDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcnNpK3JheF0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JzaStyYXgqMl0KLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3Rfc3RyaWRlCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTEKLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyXSwgICAgbW0yCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgW3JzaStyYXhdCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTMKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgY29weV9tZW0xNngxNl9tbXgoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKLTsgICAgaW50IHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLTsgICAgaW50IGRzdF9zdHJpZGUKLTsgICAgKQotZ2xvYmFsIHN5bSh2cDhfY29weV9tZW0xNngxNl9tbXgpCi1zeW0odnA4X2NvcHlfbWVtMTZ4MTZfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyYzsKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZTsKLQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2RzdDsKLSAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7ZHN0X3N0cmlkZQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgW3JzaSs4XTsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaStyYXhdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpK3JheCs4XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgW3JzaStyYXgqMis4XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIG1tMAotICAgICAgICBtb3ZxICAgICAgICBbcmRpKzhdLCAgICAgICAgbW0zCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3hdLCAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCs4XSwgICAgbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sICAgIG1tMgotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyKzhdLCAgbW01Ci0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkrcmN4KjJdCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgICAgICByY3gKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krOF07Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIFtyc2krcmF4XQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaStyYXgrOF0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIFtyc2krcmF4KjIrOF0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgICAgIHJheAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgW3JkaSs4XSwgICAgICAgIG1tMwotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3grOF0sICAgIG1tNAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjJdLCAgICBtbTIKLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMis4XSwgIG1tNQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpK3JjeCoyXQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAgICAgcmN4Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzhdOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpK3JheF0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIFtyc2krcmF4KzhdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgICAgIFtyc2krcmF4KjJdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBbcnNpK3JheCoyKzhdCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2krcmF4KjJdCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgICAgICByYXgKLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrOF0sICAgICAgICBtbTMKLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeF0sICAgICAgbW0xCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KzhdLCAgICBtbTQKLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyXSwgICAgbW0yCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjIrOF0sICBtbTUKLQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaStyY3gqMl0KLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgICAgIHJjeAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgW3JzaSs4XTsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaStyYXhdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpK3JheCs4XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgW3JzaStyYXgqMis4XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIG1tMAotICAgICAgICBtb3ZxICAgICAgICBbcmRpKzhdLCAgICAgICAgbW0zCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3hdLCAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCs4XSwgICAgbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMl0sICAgIG1tMgotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JjeCoyKzhdLCAgbW01Ci0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkrcmN4KjJdCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgICAgICByY3gKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICAgICAgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIFtyc2krOF07Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIFtyc2krcmF4XQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaStyYXgrOF0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIFtyc2krcmF4KjIrOF0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgICAgIHJheAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgW3JkaSs4XSwgICAgICAgIG1tMwotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4XSwgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3grOF0sICAgIG1tNAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmN4KjJdLCAgICBtbTIKLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyY3gqMis4XSwgIG1tNQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpK3JjeCoyXQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAgICAgcmN4Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzhdOwotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgICAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgW3JkaSs4XSwgICAgICAgIG1tMwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3JlY29uX3NzZTIuYXNtIGIvdnA4L2NvbW1vbi94ODYvcmVjb25fc3NlMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDM5NzMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvcmVjb25fc3NlMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotO3ZvaWQgdnA4X3JlY29uMmJfc3NlMih1bnNpZ25lZCBjaGFyICpzLCBzaG9ydCAqcSwgdW5zaWduZWQgY2hhciAqZCwgaW50IHN0cmlkZSkKLWdsb2JhbCBzeW0odnA4X3JlY29uMmJfc3NlMikKLXN5bSh2cDhfcmVjb24yYl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3MKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtkCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZygxKSA7cQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzdHJpZGUKLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMAotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwYWRkc3cgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4XQotICAgICAgICBwYWNrdXN3YiAgICB4bW0xLCAgICAgICB4bW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyZGldLCAgIHhtbTEKLQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIE1NV09SRCBQVFIgW3JzaSs4XQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICB4bW0wCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFtyZHgrMTZdCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCi0gICAgICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JkaStyYXhdLCAgIHhtbTIKLQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JzaSsxNl0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMAotICAgICAgICBwYWRkc3cgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzMyXQotICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyZGkrcmF4KjJdLCB4bW0zCi0KLSAgICAgICAgYWRkICAgICAgICAgcmRpLCByYXgKLSAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgTU1XT1JEIFBUUiBbcnNpKzI0XQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyZHgrNDhdCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgdW5wYWNrIHRvIHNhdHVyYXRlCi0gICAgICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JkaStyYXgqMl0sIHhtbTQKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X3JlY29uNGJfc3NlMih1bnNpZ25lZCBjaGFyICpzLCBzaG9ydCAqcSwgdW5zaWduZWQgY2hhciAqZCwgaW50IHN0cmlkZSkKLWdsb2JhbCBzeW0odnA4X3JlY29uNGJfc3NlMikKLXN5bSh2cDhfcmVjb240Yl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBTQVZFX1hNTQotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7cwotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO2QKLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDEpIDtxCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3N0cmlkZQotICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMQotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2hidyAgIHhtbTUsICAgICAgIHhtbTAKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JkeF0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFIgW3JkeCsxNl0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBwYWNrIGFuZCB1bnBhY2sgdG8gc2F0dXJhdGUKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JkaV0sICB4bW0xCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzE2XQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgeG1tMAotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzMyXQotICAgICAgICBwYWRkc3cgICAgICB4bW02LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzQ4XQotICAgICAgICBwYWNrdXN3YiAgICB4bW0yLCAgICAgICB4bW02ICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmRpK3JheF0sICB4bW0yCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzMyXQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNywgICAgICAgeG1tMAotICAgICAgICBwYWRkc3cgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzY0XQotICAgICAgICBwYWRkc3cgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzgwXQotICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW03ICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmRpK3JheCoyXSwgICAgeG1tMwotCi0gICAgICAgIGFkZCAgICAgICByZGksIHJheAotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzQ4XQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW00Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4Kzk2XQotICAgICAgICBwYWRkc3cgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzExMl0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tNSAgICAgICAgICAgICAgOyBwYWNrIGFuZCB1bnBhY2sgdG8gc2F0dXJhdGUKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JkaStyYXgqMl0sICAgIHhtbTQKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCBjb3B5X21lbTE2eDE2X3NzZTIoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKLTsgICAgaW50IHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLTsgICAgaW50IGRzdF9zdHJpZGUKLTsgICAgKQotZ2xvYmFsIHN5bSh2cDhfY29weV9tZW0xNngxNl9zc2UyKQotc3ltKHZwOF9jb3B5X21lbTE2eDE2X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjOwotICAgICAgICBtb3ZkcXUgICAgICB4bW0wLCAgICAgICBbcnNpXQotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGU7Ci0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7ZHN0OwotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgIFtyc2krcmF4XQotICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICBbcnNpK3JheCoyXQotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO2RzdF9zdHJpZGUKLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KLQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW0wCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJheAotCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4XSwgIHhtbTEKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3gqMl0seG1tMgotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldCi0KLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmN4Ci0gICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyc2krcmF4XQotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTUsICAgICAgIFtyc2krcmF4KjJdCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICB4bW0zCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJheAotCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4XSwgIHhtbTQKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3gqMl0seG1tNQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFtyc2ldCi0KLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmN4Ci0gICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgIFtyc2krcmF4XQotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTIsICAgICAgIFtyc2krcmF4KjJdCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMAotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKLQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpK3JjeF0sICB4bW0xCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3gqMl0sICAgIHhtbTIKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMywgICAgICAgW3JzaV0KLQotICAgICAgICBtb3ZkcXUgICAgICB4bW00LCAgICAgICBbcnNpK3JheF0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyY3gqMl0KLQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByY3gKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNSwgICAgICAgW3JzaStyYXgqMl0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgIHhtbTMKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3hdLCAgeG1tNAotCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZGkrcmN4KjJdLHhtbTUKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgW3JzaV0KLQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpK3JjeCoyXQotICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcnNpK3JheF0KLQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByY3gKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMiwgICAgICAgW3JzaStyYXgqMl0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW0wCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3hdLCAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpK3JjeCoyXSx4bW0yCi0KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMywgICAgICAgW3JzaStyYXhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmN4KjJdCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaStyY3hdLCAgeG1tMwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3JlY29uX3g4Ni5oIGIvdnA4L2NvbW1vbi94ODYvcmVjb25feDg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZWU2NWEuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvcmVjb25feDg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBSRUNPTl9YODZfSAotI2RlZmluZSBSRUNPTl9YODZfSAotCi0vKiBOb3RlOgotICoKLSAqIFRoaXMgcGxhdGZvcm0gaXMgY29tbW9ubHkgYnVpbHQgZm9yIHJ1bnRpbWUgQ1BVIGRldGVjdGlvbi4gSWYgeW91IG1vZGlmeQotICogYW55IG9mIHRoZSBmdW5jdGlvbiBtYXBwaW5ncyBwcmVzZW50IGluIHRoaXMgZmlsZSwgYmUgc3VyZSB0byBhbHNvIHVwZGF0ZQotICogdGhlbSBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbml0aWFsaXphdGlvbiBjb2RlCi0gKi8KLQotI2lmIEhBVkVfTU1YCi1leHRlcm4gcHJvdG90eXBlX3JlY29uX2Jsb2NrKHZwOF9yZWNvbl9iX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtOHg4X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtOHg0X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtMTZ4MTZfbW14KTsKLQotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3JlY29uX3JlY29uCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbiB2cDhfcmVjb25fYl9tbXgKLQotI3VuZGVmICB2cDhfcmVjb25fY29weTh4OAotI2RlZmluZSB2cDhfcmVjb25fY29weTh4OCB2cDhfY29weV9tZW04eDhfbW14Ci0KLSN1bmRlZiAgdnA4X3JlY29uX2NvcHk4eDQKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHk4eDQgdnA4X2NvcHlfbWVtOHg0X21teAotCi0jdW5kZWYgIHZwOF9yZWNvbl9jb3B5MTZ4MTYKLSNkZWZpbmUgdnA4X3JlY29uX2NvcHkxNngxNiB2cDhfY29weV9tZW0xNngxNl9tbXgKLQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIEhBVkVfU1NFMgotZXh0ZXJuIHByb3RvdHlwZV9yZWNvbl9ibG9jayh2cDhfcmVjb24yYl9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfcmVjb25fYmxvY2sodnA4X3JlY29uNGJfc3NlMik7Ci1leHRlcm4gcHJvdG90eXBlX2NvcHlfYmxvY2sodnA4X2NvcHlfbWVtMTZ4MTZfc3NlMik7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfcmVjb25fcmVjb24yCi0jZGVmaW5lIHZwOF9yZWNvbl9yZWNvbjIgdnA4X3JlY29uMmJfc3NlMgotCi0jdW5kZWYgIHZwOF9yZWNvbl9yZWNvbjQKLSNkZWZpbmUgdnA4X3JlY29uX3JlY29uNCB2cDhfcmVjb240Yl9zc2UyCi0KLSN1bmRlZiAgdnA4X3JlY29uX2NvcHkxNngxNgotI2RlZmluZSB2cDhfcmVjb25fY29weTE2eDE2IHZwOF9jb3B5X21lbTE2eDE2X3NzZTIKLQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfbW14LmFzbSBiL3ZwOC9jb21tb24veDg2L3N1YnBpeGVsX21teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMDRiNTIuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfbW14LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLQotJWRlZmluZSBCTE9DS19IRUlHSFRfV0lEVEggNAotJWRlZmluZSB2cDhfZmlsdGVyX3dlaWdodCAxMjgKLSVkZWZpbmUgVlA4X0ZJTFRFUl9TSElGVCAgNwotCi0KLTt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgc2hvcnQgICpvdXRwdXRfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgaW50ICAgIHBpeGVsX3N0ZXAsCi07ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoLAotOyAgICBzaG9ydCAgICAgICAgICAgKiB2cDhfZmlsdGVyCi07KQotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14KQotc3ltKHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNwotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgYXJnKDYpIDt2cDhfZmlsdGVyCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICBbcmR4ICsgMTZdICAgICAgICAgICAgIDsgZG8gYm90aCB0aGUgbmVnYXRpdmUgdGFwcyBmaXJzdCEhIQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIFtyZHggKyAzMl0gICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgW3JkeCArIDQ4XSAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgIFtyZHggKyA2NF0gICAgICAgIDsKLQotICAgICAgICBtb3YgICAgICAgICByZGksICAgIGFyZygxKSA7b3V0cHV0X3B0cgotICAgICAgICBtb3YgICAgICAgICByc2ksICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgIGR3b3JkIHB0ciBhcmcoNCkgO291dHB1dF9oZWlnaHQKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICBkd29yZCBwdHIgYXJnKDUpIDtvdXRwdXRfd2lkdGggICAgICA7IGRlc3RpbmF0aW9uIHBpdGNoPwotICAgICAgICBweG9yICAgICAgICBtbTAsICAgIG1tMCAgICAgICAgICAgICAgOyBtbTAgPSAwMDAwMDAwMAotCi1uZXh0cm93OgotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIFtyc2ktMl0gICAgICAgICAgOyBtbTMgPSBwLTIuLnA1Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0zICAgICAgICAgICAgICA7IG1tNCA9IHAtMi4ucDUKLSAgICAgICAgcHNybHEgICAgICAgbW0zLCAgICA4ICAgICAgICAgICAgICAgIDsgbW0zID0gcC0xLi5wNQotICAgICAgICBwdW5wY2tsYncgICBtbTMsICAgIG1tMCAgICAgICAgICAgICAgOyBtbTMgPSBwLTEuLnAyCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICA7IG1tMyAqPSBrZXJuZWwgMSBtb2RpZmllcnMuCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBtbTQgICAgICAgICAgICAgIDsgbW01ID0gcC0yLi5wNQotICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tMCAgICAgICAgICAgICAgOyBtbTUgPSBwMi4ucDUKLSAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICBtbTcgICAgICAgICAgICAgIDsgbW01ICo9IGtlcm5lbCA0IG1vZGlmaWVycwotICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTUgICAgICAgICAgICAgIDsgbW00ID0gcC0yLi5wNTsKLSAgICAgICAgcHNybHEgICAgICAgbW01LCAgICAxNiAgICAgICAgICAgICAgIDsgbW01ID0gcDAuLnA1OwotICAgICAgICBwdW5wY2tsYncgICBtbTUsICAgIG1tMCAgICAgICAgICAgICAgOyBtbTUgPSBwMC4ucDMKLSAgICAgICAgcG11bGx3ICAgICAgbW01LCAgICBtbTIgICAgICAgICAgICAgIDsgbW01ICo9IGtlcm5lbCAyIG1vZGlmaWVycwotICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBtbTQgICAgICAgICAgICAgIDsgbW01ID0gcC0yLi5wNQotICAgICAgICBwc3JscSAgICAgICBtbTQsICAgIDI0ICAgICAgICAgICAgICAgOyBtbTQgPSBwMS4ucDUKLSAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICBtbTAgICAgICAgICAgICAgIDsgbW00ID0gcDEuLnA0Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICA7IG1tNSAqPSBrZXJuZWwgMyBtb2RpZmllcnMKLSAgICAgICAgcGFkZHN3ICAgICAgbW0zLCAgICBtbTQgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIDsgZG8gb3V0ZXIgcG9zaXRpdmUgdGFwcwotICAgICAgICBtb3ZkICAgICAgICBtbTQsICAgIFtyc2krM10KLSAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICBtbTAgICAgICAgICAgICAgIDsgbW01ID0gcDMuLnA2Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgW3JkeCs4MF0gICAgICAgICA7IG1tNSAqPSBrZXJuZWwgMCBtb2RpZmllcnMKLSAgICAgICAgcGFkZHN3ICAgICAgbW0zLCAgICBtbTQgICAgICAgICAgICAgIDsgbW0zICs9IG1tNQotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgbW0wICAgICAgICAgICAgICA7IG1tNSA9IHAtMi4ucDEKLSAgICAgICAgcG11bGx3ICAgICAgbW01LCAgICBbcmR4XSAgICAgICAgICAgIDsgbW01ICo9IGtlcm5lbCA1IG1vZGlmaWVycwotICAgICAgICBwYWRkc3cgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgOyBtbTMgKz0gbW01Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgbW0zLCAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgIDsgbW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgOyBtbTMgLz0gMTI4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMywgICAgbW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHVucGFjayB0byBzYXR1cmF0ZQotICAgICAgICBwdW5wY2tsYncgICBtbTMsICAgIG1tMCAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgbW0zICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgZHdvcmQgcHRyIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZSA7IG5leHQgbGluZQotICAgICAgICBhZGQgICAgICAgICByZGksICAgIHJheDsKLSVlbHNlCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgZHdvcmQgcHRyIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZQotICAgICAgICBhZGQgICAgICAgICByZGksICAgIHJheDsKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgIHI4ICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKLSVlbmRpZgotCi0gICAgICAgIGRlYyAgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgICAgICA7IGRlY3JlbWVudCBjb3VudAotICAgICAgICBqbnogICAgICAgICBuZXh0cm93ICAgICAgICAgICAgICAgICAgOyBuZXh0IHJvdwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14Ci07KAotOyAgIHNob3J0ICpzcmNfcHRyLAotOyAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi07ICAgIGludCBvdXRwdXRfcGl0Y2gsCi07ICAgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwKLTsgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKLTsgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKLTsgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotOyAgIHNob3J0ICogdnA4X2ZpbHRlcgotOykKLWdsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgpCi1zeW0odnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgOAotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdnEgICAgICBtbTUsIFtHTE9CQUwocmQpXQotICAgICAgICBwdXNoICAgICAgICByYngKLSAgICAgICAgbW92ICAgICAgICAgcmJ4LCBhcmcoNykgO3ZwOF9maWx0ZXIKLSAgICAgICAgbW92cSAgICAgIG1tMSwgW3JieCArIDE2XSAgICAgICAgICAgICA7IGRvIGJvdGggdGhlIG5lZ2F0aXZlIHRhcHMgZmlyc3QhISEKLSAgICAgICAgbW92cSAgICAgIG1tMiwgW3JieCArIDMyXSAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgIG1tNiwgW3JieCArIDQ4XSAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgbW03LCBbcmJ4ICsgNjRdICAgICAgICA7Ci0KLSAgICAgICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpIDtwaXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCBhcmcoMSkgO291dHB1dF9wdHIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgc3ViICAgICAgICAgcnNpLCByZHgKLSAgICAgICAgc3ViICAgICAgICAgcnNpLCByZHgKLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgYXJnKDUpIDtvdXRwdXRfaGVpZ2h0Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgRFdPUkQgUFRSIGFyZygyKSA7b3V0cHV0X3BpdGNoICAgICAgOyBkZXN0aW5hdGlvbiBwaXRjaD8KLSAgICAgICAgcHhvciAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICAgIDsgbW0wID0gMDAwMDAwMDAKLQotCi1uZXh0cm93X2N2OgotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyc2krcmR4XSAgICAgICAgOyBtbTMgPSBwMC4ucDggID0gcm93IC0xCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgbW0xICAgICAgICAgICAgICA7IG1tMyAqPSBrZXJuZWwgMSBtb2RpZmllcnMuCi0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyc2kgKyA0KnJkeF0gICAgICA7IG1tNCA9IHAwLi5wMyAgPSByb3cgMgotICAgICAgICBwbXVsbHcgICAgICBtbTQsIG1tNyAgICAgICAgICAgICAgOyBtbTQgKj0ga2VybmVsIDQgbW9kaWZpZXJzLgotICAgICAgICBwYWRkc3cgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpICsgMipyZHhdICAgICAgICAgICA7IG1tNCA9IHAwLi5wMyAgPSByb3cgMAotICAgICAgICBwbXVsbHcgICAgICBtbTQsIG1tMiAgICAgICAgICAgICAgOyBtbTQgKj0ga2VybmVsIDIgbW9kaWZpZXJzLgotICAgICAgICBwYWRkc3cgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpXSAgICAgICAgICAgIDsgbW00ID0gcDAuLnAzICA9IHJvdyAtMgotICAgICAgICBwbXVsbHcgICAgICBtbTQsIFtyYnhdICAgICAgICAgICAgOyBtbTQgKj0ga2VybmVsIDAgbW9kaWZpZXJzLgotICAgICAgICBwYWRkc3cgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW00Ci0KLQotICAgICAgICBhZGQgICAgICAgICByc2ksIHJkeCAgICAgICAgICAgICAgOyBtb3ZlIHNvdXJjZSBmb3J3YXJkIDEgbGluZSB0byBhdm9pZCAzICogcGl0Y2gKLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpICsgMipyZHhdICAgICA7IG1tNCA9IHAwLi5wMyAgPSByb3cgMQotICAgICAgICBwbXVsbHcgICAgICBtbTQsIG1tNiAgICAgICAgICAgICAgOyBtbTQgKj0ga2VybmVsIDMgbW9kaWZpZXJzLgotICAgICAgICBwYWRkc3cgICAgICBtbTMsIG1tNCAgICAgICAgICAgICAgOyBtbTMgKz0gbW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCBbcnNpICsgNCpyZHhdICAgIDsgbW00ID0gcDAuLnAzICA9IHJvdyAzCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgW3JieCArODBdICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMyBtb2RpZmllcnMuCi0gICAgICAgIHBhZGRzdyAgICAgIG1tMywgbW00ICAgICAgICAgICAgICA7IG1tMyArPSBtbTQKLQotCi0gICAgICAgIHBhZGRzdyAgICAgIG1tMywgbW01ICAgICAgICAgICAgICAgOyBtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgbW0zLCBWUDhfRklMVEVSX1NISUZUICAgICA7IG1tMyAvPSAxMjgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0zLCBtbTAgICAgICAgICAgICAgIDsgcGFjayBhbmQgc2F0dXJhdGUKLQotICAgICAgICBtb3ZkICAgICAgICBbcmRpXSxtbTMgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgOyB0aGUgc3Vic2VxdWVudCBpdGVyYXRpb25zIHJlcGVhdCAzIG91dCBvZiA0IG9mIHRoZXNlIHJlYWRzLiAgU2luY2UgdGhlCi0gICAgICAgIDsgcmVjb24gYmxvY2sgc2hvdWxkIGJlIGluIGNhY2hlIHRoaXMgc2hvdWxkbid0IGNvc3QgbXVjaC4gIEl0cyBvYnZpb3VzbHkKLSAgICAgICAgOyBhdm9pZGFibGUhISEuCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgIFtyZGkrcmF4XSA7Ci0gICAgICAgIGRlYyAgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgICA7IGRlY3JlbWVudCBjb3VudAotICAgICAgICBqbnogICAgICAgICBuZXh0cm93X2N2ICAgICAgICAgICAgIDsgbmV4dCByb3cKLQotICAgICAgICBwb3AgICAgICAgICByYngKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCBiaWxpbmVhcl9wcmVkaWN0OHg4X21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07ICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIGludCAgeG9mZnNldCwKLTsgICAgaW50ICB5b2Zmc2V0LAotOyAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi07ICAgIGludCBkc3RfcGl0Y2gKLTspCi1nbG9iYWwgc3ltKHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X21teCkKLXN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgO2NvbnN0IHNob3J0ICpIRmlsdGVyID0gYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF07Ci0gICAgO2NvbnN0IHNob3J0ICpWRmlsdGVyID0gYmlsaW5lYXJfZmlsdGVyc19tbXhbeW9mZnNldF07Ci0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7eG9mZnNldAotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO2RzdF9wdHIgICAgICAgICAgIDsKLQotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1IDsgb2Zmc2V0ICogMzIKLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfbW14KSldCi0KLSAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4IDsgSEZpbHRlcgotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JheCsxNl0gICAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3lvZmZzZXQKLQotICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1IDsgb2Zmc2V0KjMyCi0gICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeCA7IFZGaWx0ZXIKLQotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo4XSAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgOwotCi0KLQotICAgICAgICA7IGdldCB0aGUgZmlyc3QgaG9yaXpvbnRhbCBsaW5lIGRvbmUgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNgotICAgICAgICBwdW5wY2toYncgICBtbTQsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWNrdXN3YiAgICBtbTcsICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi1uZXh0X3Jvd184eDg6Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2Ci0gICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTAKLQotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOwotCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICAgICAgW3JheCsxNl0gICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOwotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMywgICAgICAgIG1tNAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaCAgICAgICAgICAgICAgICAgICA7Ci0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOCAgICAgICAgICAgICAgICAgIDtkc3RfcGl0Y2gKLSVlbmRpZgotICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3ggICAgICAgICAgICAgICAgIDsKLSAgICAgICAgam5lICAgICAgICAgbmV4dF9yb3dfOHg4Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgYmlsaW5lYXJfcHJlZGljdDh4NF9tbXgKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICBpbnQgIHhvZmZzZXQsCi07ICAgIGludCAgeW9mZnNldCwKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgICAgaW50IGRzdF9waXRjaAotOykKLWdsb2JhbCBzeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfbW14KQotc3ltKHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICA7Y29uc3Qgc2hvcnQgKkhGaWx0ZXIgPSBiaWxpbmVhcl9maWx0ZXJzX21teFt4b2Zmc2V0XTsKLSAgICA7Y29uc3Qgc2hvcnQgKlZGaWx0ZXIgPSBiaWxpbmVhcl9maWx0ZXJzX21teFt5b2Zmc2V0XTsKLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDt4b2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7ZHN0X3B0ciAgICAgICAgICAgOwotCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtHTE9CQUwoc3ltKHZwOF9iaWxpbmVhcl9maWx0ZXJzX21teCkpXQotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1Ci0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyICAgICAgICAgICAgICA7Ci0gICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeAotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaAotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBbcmF4KzE2XSAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7eW9mZnNldAotCi0gICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1Ci0KLSAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4Ci0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjRdICAgICAgICAgIDsKLQotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgIDsKLQotICAgICAgICA7IGdldCB0aGUgZmlyc3QgaG9yaXpvbnRhbCBsaW5lIGRvbmUgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNgotICAgICAgICBwdW5wY2toYncgICBtbTQsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWNrdXN3YiAgICBtbTcsICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi1uZXh0X3Jvd184eDQ6Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2Ci0gICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2hidyAgIG1tNiwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tNSwgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2toYncgICBtbTYsICAgICAgICBtbTAKLQotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwc3JhdyAgICAgICBtbTQsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW03LCAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOwotCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICAgICAgW3JheCsxNl0gICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOwotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMywgICAgICAgIG1tNAotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaCAgICAgICAgICAgICAgICAgICA7Ci0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAotJWVuZGlmCi0gICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgOwotICAgICAgICBqbmUgICAgICAgICBuZXh0X3Jvd184eDQKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCBiaWxpbmVhcl9wcmVkaWN0NHg0X21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07ICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIGludCAgeG9mZnNldCwKLTsgICAgaW50ICB5b2Zmc2V0LAotOyAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotOyAgICBpbnQgZHN0X3BpdGNoCi07KQotZ2xvYmFsIHN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9tbXgpCi1zeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIDtjb25zdCBzaG9ydCAqSEZpbHRlciA9IGJpbGluZWFyX2ZpbHRlcnNfbW14W3hvZmZzZXRdOwotICAgIDtjb25zdCBzaG9ydCAqVkZpbHRlciA9IGJpbGluZWFyX2ZpbHRlcnNfbW14W3lvZmZzZXRdOwotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO3hvZmZzZXQKLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpIDtkc3RfcHRyICAgICAgICAgICA7Ci0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW0dMT0JBTChzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfbW14KSldCi0gICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKLQotICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggOyBIRmlsdGVyCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0ciAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2xkc3RfcGl0Y2gKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgW3JheCsxNl0gICAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3lvZmZzZXQKLQotICAgICAgICBweG9yICAgICAgICBtbTAsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNQotCi0gICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeAotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo0XSAgICAgICAgICA7Ci0KLSAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7Ci0KLSAgICAgICAgOyBnZXQgdGhlIGZpcnN0IGhvcml6b250YWwgbGluZSBkb25lICAgICAgIDsKLSAgICAgICAgbW92ZCAgICAgICAgbW0zLCAgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDEwIDExIDEyIDEzIDE0Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNgotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZkICAgICAgICBtbTUsICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICBtbTUsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgbW01LCAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgbW01ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW0zLCAgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWNrdXN3YiAgICBtbTcsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi1uZXh0X3Jvd180eDQ6Ci0gICAgICAgIG1vdmQgICAgICAgIG1tMywgICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAotICAgICAgICBwdW5wY2tsYncgICBtbTMsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYKLQotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZCAgICAgICAgbW01LCAgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW01LCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tsYncgICBtbTUsICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgW0dMT0JBTChyZCldICAgICAgICAgICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKLQotICAgICAgICBwc3JhdyAgICAgICBtbTMsICAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhY2t1c3diICAgIG1tNywgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKLQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgICAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMywgICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWNrdXN3YiAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgbW92ZCAgICAgICAgW3JkaV0sICAgICAgbW0zICAgICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7ZHN0X3BpdGNoICAgICAgICAgICAgICAgICAgIDsKLSVlbHNlCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaCAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotCi0gICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgOwotICAgICAgICBqbmUgICAgICAgICBuZXh0X3Jvd180eDQKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotcmQ6Ci0gICAgdGltZXMgNCBkdyAweDQwCi0KLWFsaWduIDE2Ci1nbG9iYWwgSElEREVOX0RBVEEoc3ltKHZwOF9zaXhfdGFwX21teCkpCi1zeW0odnA4X3NpeF90YXBfbW14KToKLSAgICB0aW1lcyA4IGR3IDAKLSAgICB0aW1lcyA4IGR3IDAKLSAgICB0aW1lcyA4IGR3IDEyOAotICAgIHRpbWVzIDggZHcgMAotICAgIHRpbWVzIDggZHcgMAotICAgIHRpbWVzIDggZHcgMAotCi0gICAgdGltZXMgOCBkdyAwCi0gICAgdGltZXMgOCBkdyAtNgotICAgIHRpbWVzIDggZHcgMTIzCi0gICAgdGltZXMgOCBkdyAxMgotICAgIHRpbWVzIDggZHcgLTEKLSAgICB0aW1lcyA4IGR3IDAKLQotICAgIHRpbWVzIDggZHcgMgotICAgIHRpbWVzIDggZHcgLTExCi0gICAgdGltZXMgOCBkdyAxMDgKLSAgICB0aW1lcyA4IGR3IDM2Ci0gICAgdGltZXMgOCBkdyAtOAotICAgIHRpbWVzIDggZHcgMQotCi0gICAgdGltZXMgOCBkdyAwCi0gICAgdGltZXMgOCBkdyAtOQotICAgIHRpbWVzIDggZHcgOTMKLSAgICB0aW1lcyA4IGR3IDUwCi0gICAgdGltZXMgOCBkdyAtNgotICAgIHRpbWVzIDggZHcgMAotCi0gICAgdGltZXMgOCBkdyAzCi0gICAgdGltZXMgOCBkdyAtMTYKLSAgICB0aW1lcyA4IGR3IDc3Ci0gICAgdGltZXMgOCBkdyA3NwotICAgIHRpbWVzIDggZHcgLTE2Ci0gICAgdGltZXMgOCBkdyAzCi0KLSAgICB0aW1lcyA4IGR3IDAKLSAgICB0aW1lcyA4IGR3IC02Ci0gICAgdGltZXMgOCBkdyA1MAotICAgIHRpbWVzIDggZHcgOTMKLSAgICB0aW1lcyA4IGR3IC05Ci0gICAgdGltZXMgOCBkdyAwCi0KLSAgICB0aW1lcyA4IGR3IDEKLSAgICB0aW1lcyA4IGR3IC04Ci0gICAgdGltZXMgOCBkdyAzNgotICAgIHRpbWVzIDggZHcgMTA4Ci0gICAgdGltZXMgOCBkdyAtMTEKLSAgICB0aW1lcyA4IGR3IDIKLQotICAgIHRpbWVzIDggZHcgMAotICAgIHRpbWVzIDggZHcgLTEKLSAgICB0aW1lcyA4IGR3IDEyCi0gICAgdGltZXMgOCBkdyAxMjMKLSAgICB0aW1lcyA4IGR3IC02Ci0gICAgdGltZXMgOCBkdyAwCi0KLQotYWxpZ24gMTYKLWdsb2JhbCBISURERU5fREFUQShzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfbW14KSkKLXN5bSh2cDhfYmlsaW5lYXJfZmlsdGVyc19tbXgpOgotICAgIHRpbWVzIDggZHcgMTI4Ci0gICAgdGltZXMgOCBkdyAwCi0KLSAgICB0aW1lcyA4IGR3IDExMgotICAgIHRpbWVzIDggZHcgMTYKLQotICAgIHRpbWVzIDggZHcgOTYKLSAgICB0aW1lcyA4IGR3IDMyCi0KLSAgICB0aW1lcyA4IGR3IDgwCi0gICAgdGltZXMgOCBkdyA0OAotCi0gICAgdGltZXMgOCBkdyA2NAotICAgIHRpbWVzIDggZHcgNjQKLQotICAgIHRpbWVzIDggZHcgNDgKLSAgICB0aW1lcyA4IGR3IDgwCi0KLSAgICB0aW1lcyA4IGR3IDMyCi0gICAgdGltZXMgOCBkdyA5NgotCi0gICAgdGltZXMgOCBkdyAxNgotICAgIHRpbWVzIDggZHcgMTEyCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9zc2UyLmFzbSBiL3ZwOC9jb21tb24veDg2L3N1YnBpeGVsX3NzZTIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODdjYWQyLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L3N1YnBpeGVsX3NzZTIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLSVkZWZpbmUgQkxPQ0tfSEVJR0hUX1dJRFRIIDQKLSVkZWZpbmUgVlA4X0ZJTFRFUl9XRUlHSFQgMTI4Ci0lZGVmaW5lIFZQOF9GSUxURVJfU0hJRlQgIDcKLQotCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyBOb3RlczogZmlsdGVyX2Jsb2NrMWRfaDYgYXBwbGllcyBhIDYgdGFwIGZpbHRlciBob3Jpem9udGFsbHkgdG8gdGhlIGlucHV0IHBpeGVscy4gVGhlCi07IGlucHV0IHBpeGVsIGFycmF5IGhhcyBvdXRwdXRfaGVpZ2h0IHJvd3MuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgb3V0cHV0X2hlaWdodCBpcyBhbgotOyBldmVuIG51bWJlci4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIDggcGl4ZWxzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLCBjYWxjdWxhdGluZyBPTkUKLTsgcm93cyBlYWNoIGl0ZXJhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgMTI4IGJpdHMgb3BlcmF0aW9ucy4KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCi07ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKLTsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi07ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgsCi07ICAgIHNob3J0ICAgICAgICAgICAqdnA4X2ZpbHRlcgotOykKLWdsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyKQotc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoNikgO3ZwOF9maWx0ZXIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpIDtvdXRwdXRfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7b3V0cHV0X2hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgICAgICAgICAgOyBQaXRjaCBmb3IgU291cmNlCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSA7b3V0cHV0X3dpZHRoCi0lZW5kaWYKLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCi0KLWZpbHRlcl9ibG9jazFkOF9oNl9yb3dsb29wOgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgLSAyXQotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyA2XQotCi0gICAgICAgIHByZWZldGNodDIgIFtyc2krcmF4LTJdCi0KLSAgICAgICAgcHNsbGRxICAgICAgeG1tMSwgICAgICAgOAotICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICB4bW0zCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0xCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0xCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDEgeHgtMSB4eC0yCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTQsICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwIC0xCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JkeF0gICAgICAgICAgIDsgeFstMl0gKiBIWy0yXTsgVGFwIDEKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMCB4eC0xCi0KLSAgICAgICAgcHNybGRxICAgICAgeG1tNSwgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLSAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkeCsxNl0gICAgICAgIDsgeFstMV0gKiBIWy0xXTsgVGFwIDIKLQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMAotICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMQotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyZHgrMzJdICAgICAgICAgICAgICAgICAgICA7IHhbIDBdICogSFsgMF07IFRhcCAzCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JkeCs0OF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMV0gKiBoWyAxXSA7IFRhcCA0Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzCi0KLQotICAgICAgICBwbXVsbHcgICAgICB4bW03LCAgICAgICBbcmR4KzY0XSAgICAgICAgICAgICAgICAgICAgOyB4WyAyXSAqIGhbIDJdIDsgVGFwIDUKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDBhIHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgW3JkeCs4MF0gICAgICAgICAgICAgICAgICAgIDsgeFsgM10gKiBoWyAzXSA7IFRhcCA2Ci0KLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW03Ci0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTUKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0zCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTYKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0xCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIDcKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW00LCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAKLQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFB0ciBbcmRpXSwgICAgICAgICB4bW00Ci0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXhdCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUHRyIGFyZyg1KSA7W291dHB1dF93aWR0aF0KLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLSAgICAgICAgZGVjICAgICAgICAgcmN4Ci0KLSAgICAgICAgam56ICAgICAgICAgZmlsdGVyX2Jsb2NrMWQ4X2g2X3Jvd2xvb3AgICAgICAgICAgICAgICAgOyBuZXh0IHJvdwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07ICAgIHVuc2lnbmVkIHNob3J0ICpvdXRwdXRfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgaW50ICAgIHBpeGVsX3N0ZXAsCi07ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoLAotOyAgICBzaG9ydCAgICAgICAgICAgKnZwOF9maWx0ZXIKLTspCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyBOb3RlczogZmlsdGVyX2Jsb2NrMWRfaDYgYXBwbGllcyBhIDYgdGFwIGZpbHRlciBob3Jpem9udGFsbHkgdG8gdGhlIGlucHV0IHBpeGVscy4gVGhlCi07IGlucHV0IHBpeGVsIGFycmF5IGhhcyBvdXRwdXRfaGVpZ2h0IHJvd3MuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgb3V0cHV0X2hlaWdodCBpcyBhbgotOyBldmVuIG51bWJlci4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIDggcGl4ZWxzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLCBjYWxjdWxhdGluZyBPTkUKLTsgcm93cyBlYWNoIGl0ZXJhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgMTI4IGJpdHMgb3BlcmF0aW9ucy4KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9zc2UyKQotc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNwotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgYXJnKDYpIDt2cDhfZmlsdGVyCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7b3V0cHV0X3B0cgotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO291dHB1dF9oZWlnaHQKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICAgICAgICAgIDsgUGl0Y2ggZm9yIFNvdXJjZQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO291dHB1dF93aWR0aAotJWVuZGlmCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCi0KLWZpbHRlcl9ibG9jazFkMTZfaDZfc3NlMl9yb3dsb29wOgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgLSAyXQotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyA2XQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIE1NV09SRCBQVFIgW3JzaSArMTRdCi0gICAgICAgIHBzbGxkcSAgICAgIHhtbTIsICAgICAgIDgKLQotICAgICAgICBwb3IgICAgICAgICB4bW0yLCAgICAgICB4bW0xCi0gICAgICAgIHByZWZldGNodDIgIFtyc2krcmF4LTJdCi0KLSAgICAgICAgcHNsbGRxICAgICAgeG1tMSwgICAgICAgOAotICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICB4bW0zCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0xCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0xCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDEgeHgtMSB4eC0yCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTQsICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwIC0xCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JkeF0gICAgICAgICAgIDsgeFstMl0gKiBIWy0yXTsgVGFwIDEKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMCB4eC0xCi0KLSAgICAgICAgcHNybGRxICAgICAgeG1tNSwgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLSAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkeCsxNl0gICAgICAgIDsgeFstMV0gKiBIWy0xXTsgVGFwIDIKLQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMAotICAgICAgICBwc3JsZHEgICAgICB4bW02LCAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMQotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyZHgrMzJdICAgICAgICAgICAgICAgICAgICA7IHhbIDBdICogSFsgMF07IFRhcCAzCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JkeCs0OF0gICAgICAgICAgICAgICAgICAgIDsgeFsgMV0gKiBoWyAxXSA7IFRhcCA0Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzCi0KLQotICAgICAgICBwbXVsbHcgICAgICB4bW03LCAgICAgICBbcmR4KzY0XSAgICAgICAgICAgICAgICAgICAgOyB4WyAyXSAqIGhbIDJdIDsgVGFwIDUKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDBhIHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgW3JkeCs4MF0gICAgICAgICAgICAgICAgICAgIDsgeFsgM10gKiBoWyAzXSA7IFRhcCA2Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNwotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW01Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMwotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW02Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KLQotICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICA3Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wCi0KLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQdHIgW3JkaV0sICAgICAgICAgeG1tNAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMgotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTIKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMSB4eC0xIHh4LTIKLSAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAgLTEKLQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4XSAgICAgICAgICAgOyB4Wy0yXSAqIEhbLTJdOyBUYXAgMQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwIHh4LTEKLQotICAgICAgICBwc3JsZHEgICAgICB4bW01LCAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzE2XSAgICAgICAgOyB4Wy0xXSAqIEhbLTFdOyBUYXAgMgotCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JkeCszMl0gICAgICAgICAgICAgICAgICAgIDsgeFsgMF0gKiBIWyAwXTsgVGFwIDMKLQotICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEKLSAgICAgICAgcHNybGRxICAgICAgeG1tNywgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIKLQotICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICBbcmR4KzQ4XSAgICAgICAgICAgICAgICAgICAgOyB4WyAxXSAqIGhbIDFdIDsgVGFwIDQKLQotICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIKLSAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMKLQotICAgICAgICBwbXVsbHcgICAgICB4bW03LCAgICAgICBbcmR4KzY0XSAgICAgICAgICAgICAgICAgICAgOyB4WyAyXSAqIGhbIDJdIDsgVGFwIDUKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDBhIHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMiwgICAgICAgW3JkeCs4MF0gICAgICAgICAgICAgICAgICAgIDsgeFsgM10gKiBoWyAzXSA7IFRhcCA2Ci0KLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW03Ci0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTUKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0zCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTYKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0yCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIDcKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW00LCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAKLQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFB0ciBbcmRpKzE2XSwgICAgICB4bW00Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheF0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUHRyIGFyZyg1KSA7W291dHB1dF93aWR0aF0KLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLQotICAgICAgICBkZWMgICAgICAgICByY3gKLSAgICAgICAgam56ICAgICAgICAgZmlsdGVyX2Jsb2NrMWQxNl9oNl9zc2UyX3Jvd2xvb3AgICAgICAgICAgICAgICAgOyBuZXh0IHJvdwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc2UyCi07KAotOyAgICBzaG9ydCAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLTsgICAgaW50IGRzdF9wdGljaCwKLTsgICAgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsCi07ICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAotOyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotOyAgICBzaG9ydCAqIHZwOF9maWx0ZXIKLTspCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyBOb3RlczogZmlsdGVyX2Jsb2NrMWQ4X3Y2IGFwcGxpZXMgYSA2IHRhcCBmaWx0ZXIgdmVydGljYWxseSB0byB0aGUgaW5wdXQgcGl4ZWxzLiBUaGUKLTsgaW5wdXQgcGl4ZWwgYXJyYXkgaGFzIG91dHB1dF9oZWlnaHQgcm93cy4KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3NzZTIpCi1zeW0odnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7dnA4X2ZpbHRlcgotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtwaXhlbHNfcGVyX2xpbmUKLQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO291dHB1dF9wdHIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0KLSAgICAgICAgc3ViICAgICAgICAgcnNpLCAgICAgICAgcmR4Ci0gICAgICAgIHN1YiAgICAgICAgIHJzaSwgICAgICAgIHJkeAotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIERXT1JEIFBUUiBhcmcoNSkgO1tvdXRwdXRfaGVpZ2h0XQotICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW0dMT0JBTChyZCldCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7IGRzdF9wdGljaAotJWVuZGlmCi0KLXZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NlMl9sb29wOgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICBbcmF4XQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHhdCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgIFtyYXggKyAxNl0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgW3JheCArIDMyXQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XQotICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmF4ICsgNjRdCi0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmR4Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXQotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIFtyYXggKyA0OF0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JheCArIDgwXQotCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTUKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tMwotCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTEKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNAotCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTYKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNwotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgIDcKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgeG1tMCAgICAgICAgICAgICAgOyBwYWNrIGFuZCBzYXR1cmF0ZQotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcmRpXSwgeG1tMiAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMikgO1tkc3RfcHRpY2hdCi0lZWxzZQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAotJWVuZGlmCi0gICAgICAgIGRlYyAgICAgICAgIHJjeCAgICAgICAgIDsgZGVjcmVtZW50IGNvdW50Ci0gICAgICAgIGpueiAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NlMl9sb29wICAgICAgICAgICAgICAgOyBuZXh0IHJvdwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgUkVTVE9SRV9YTU0KLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NlMgotOygKLTsgICAgdW5zaWduZWQgc2hvcnQgKnNyY19wdHIsCi07ICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi07ICAgIGludCBkc3RfcHRpY2gsCi07ICAgIHVuc2lnbmVkIGludCBwaXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLAotOyAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKLTsgICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKLTsgICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKLTspCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyBOb3RlczogZmlsdGVyX2Jsb2NrMWQxNl92NiBhcHBsaWVzIGEgNiB0YXAgZmlsdGVyIHZlcnRpY2FsbHkgdG8gdGhlIGlucHV0IHBpeGVscy4gVGhlCi07IGlucHV0IHBpeGVsIGFycmF5IGhhcyBvdXRwdXRfaGVpZ2h0IHJvd3MuCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWdsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NlMikKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7dnA4X2ZpbHRlcgotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtwaXhlbHNfcGVyX2xpbmUKLQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgO291dHB1dF9wdHIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0KLSAgICAgICAgc3ViICAgICAgICAgcnNpLCAgICAgICAgcmR4Ci0gICAgICAgIHN1YiAgICAgICAgIHJzaSwgICAgICAgIHJkeAotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIERXT1JEIFBUUiBhcmcoNSkgO1tvdXRwdXRfaGVpZ2h0XQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgOyBkc3RfcHRpY2gKLSVlbmRpZgotCi12cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyX2xvb3A6Ci07IFRoZSBvcmRlciBmb3IgYWRkaW5nIDYtdGFwIGlzIDIgNSAzIDEgNCA2LiBSZWFkIGluIGRhdGEgaW4gdGhhdCBvcmRlci4KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeF0gICAgICAgOyBsaW5lIDIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCArIDE2XQotICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICBbcmF4ICsgMTZdCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTIsICAgICAgIFtyYXggKyAxNl0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0gICAgICAgOyBsaW5lIDUKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDQgKyAxNl0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgW3JheCArIDY0XQotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBbcmF4ICsgNjRdCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdICAgICAgIDsgbGluZSAzCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyICsgMTZdCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIFtyYXggKyAzMl0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JheCArIDMyXQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldICAgICAgIDsgbGluZSAxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyAxNl0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNywgICAgICAgW3JheF0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgW3JheF0KLQotICAgICAgICBwYWRkc3cgICAgICB4bW0xLCAgICAgICB4bW0zCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTQKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgeG1tNQotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW02Ci0gICAgICAgIHBhZGRzdyAgICAgIHhtbTEsICAgICAgIHhtbTcKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tMAotCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJkeAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICA7IGxpbmUgNAotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMiArIDE2XQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBbcmF4ICsgNDhdCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIFtyYXggKyA0OF0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0gICAgICAgOyBsaW5lIDYKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDQgKyAxNl0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JheCArIDgwXQotICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICBbcmF4ICsgODBdCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW0dMT0JBTChyZCldCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTAKLQotICAgICAgICBwYWRkc3cgICAgICB4bW0xLCAgICAgICB4bW0zCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTIsICAgICAgIHhtbTQKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgeG1tNQotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW02Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMSwgICAgICAgeG1tNwotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW03Ci0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMSwgICAgICAgNwotICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICA3Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMiAgICAgICAgICAgICAgOyBwYWNrIGFuZCBzYXR1cmF0ZQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgeG1tMSAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDIpIDtbZHN0X3B0aWNoXQotJWVsc2UKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotICAgICAgICBkZWMgICAgICAgICByY3ggICAgICAgICA7IGRlY3JlbWVudCBjb3VudAotICAgICAgICBqbnogICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyX2xvb3AgICAgICAgICAgICAgICA7IG5leHQgcm93Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKLTsgICAgaW50IGRzdF9wdGljaCwKLTsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi07ICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi07KQotOyBGaXJzdC1wYXNzIGZpbHRlciBvbmx5IHdoZW4geW9mZnNldD09MAotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMikKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICBhcmcoNSkgO3ZwOF9maWx0ZXIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtvdXRwdXRfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7b3V0cHV0X2hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgICAgICAgICAgOyBQaXRjaCBmb3IgU291cmNlCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7ZHN0X3B0aWNoCi0lZW5kaWYKLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCi0KLWZpbHRlcl9ibG9jazFkOF9oNl9vbmx5X3Jvd2xvb3A6Ci0gICAgICAgIG1vdnEgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JzaSAtIDJdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIE1NV09SRCBQVFIgW3JzaSArIDZdCi0KLSAgICAgICAgcHJlZmV0Y2h0MiAgW3JzaStyYXgtMl0KLQotICAgICAgICBwc2xsZHEgICAgICB4bW0xLCAgICAgICA4Ci0gICAgICAgIHBvciAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTEKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMSB4eC0xIHh4LTIKLSAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAgLTEKLQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmR4XSAgICAgICAgICAgOyB4Wy0yXSAqIEhbLTJdOyBUYXAgMQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwIHh4LTEKLQotICAgICAgICBwc3JsZHEgICAgICB4bW01LCAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbcmR4KzE2XSAgICAgICAgOyB4Wy0xXSAqIEhbLTFdOyBUYXAgMgotCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JkeCszMl0gICAgICAgICAgICAgICAgICAgIDsgeFsgMF0gKiBIWyAwXTsgVGFwIDMKLQotICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEKLSAgICAgICAgcHNybGRxICAgICAgeG1tNywgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIKLQotICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICBbcmR4KzQ4XSAgICAgICAgICAgICAgICAgICAgOyB4WyAxXSAqIGhbIDFdIDsgVGFwIDQKLQotICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIKLSAgICAgICAgcHNybGRxICAgICAgeG1tMSwgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMKLQotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTcsICAgICAgIFtyZHgrNjRdICAgICAgICAgICAgICAgICAgICA7IHhbIDJdICogaFsgMl0gOyBUYXAgNQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MGEgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMwotICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICBbcmR4KzgwXSAgICAgICAgICAgICAgICAgICAgOyB4WyAzXSAqIGhbIDNdIDsgVGFwIDYKLQotCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTcKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNQotCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTMKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNgotCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTEKLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgNwotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTQsICAgICAgIHhtbTAKLQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQVFIgW3JkaV0sICAgeG1tNCAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4XQotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFB0ciBhcmcoMykgO2RzdF9wdGljaAotJWVsc2UKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotICAgICAgICBkZWMgICAgICAgICByY3gKLQotICAgICAgICBqbnogICAgICAgICBmaWx0ZXJfYmxvY2sxZDhfaDZfb25seV9yb3dsb29wICAgICAgICAgICAgICAgIDsgbmV4dCByb3cKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X29ubHlfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07ICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKLTsgICAgaW50IGRzdF9wdGljaCwKLTsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi07ICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi07KQotOyBGaXJzdC1wYXNzIGZpbHRlciBvbmx5IHdoZW4geW9mZnNldD09MAotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9vbmx5X3NzZTIpCi1zeW0odnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfb25seV9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgIGFyZyg1KSA7dnA4X2ZpbHRlcgotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO291dHB1dF9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtvdXRwdXRfaGVpZ2h0Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgICAgICAgICA7IFBpdGNoIGZvciBTb3VyY2UKLSVpZiBBQklfSVNfMzJCSVQ9MAotICAgICAgICBtb3ZzeGQgICAgICByOCwgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtkc3RfcHRpY2gKLSVlbmRpZgotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTAgZm9yIHVucGFjawotCi1maWx0ZXJfYmxvY2sxZDE2X2g2X29ubHlfc3NlMl9yb3dsb29wOgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgLSAyXQotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyA2XQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIE1NV09SRCBQVFIgW3JzaSArMTRdCi0gICAgICAgIHBzbGxkcSAgICAgIHhtbTIsICAgICAgIDgKLQotICAgICAgICBwb3IgICAgICAgICB4bW0yLCAgICAgICB4bW0xCi0gICAgICAgIHByZWZldGNodDIgIFtyc2krcmF4LTJdCi0KLSAgICAgICAgcHNsbGRxICAgICAgeG1tMSwgICAgICAgOAotICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICB4bW0zCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0xCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0xCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDEgeHgtMSB4eC0yCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTQsICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwIC0xCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JkeF0gICAgICAgICAgIDsgeFstMl0gKiBIWy0yXTsgVGFwIDEKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEgeHgwMCB4eC0xCi0KLSAgICAgICAgcHNybGRxICAgICAgeG1tNSwgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLSAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkeCsxNl0gICAgICAgIDsgeFstMV0gKiBIWy0xXTsgVGFwIDIKLQotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAKLSAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEKLQotICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmR4KzMyXSAgICAgICAgICAgICAgICAgICAgOyB4WyAwXSAqIEhbIDBdOyBUYXAgMwotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMQotICAgICAgICBwc3JsZHEgICAgICB4bW03LCAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMgotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIFtyZHgrNDhdICAgICAgICAgICAgICAgICAgICA7IHhbIDFdICogaFsgMV0gOyBUYXAgNAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMgotICAgICAgICBwc3JsZHEgICAgICB4bW0xLCAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCB4eCB4eCB4eCB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMwotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTcsICAgICAgIFtyZHgrNjRdICAgICAgICAgICAgICAgICAgICA7IHhbIDJdICogaFsgMl0gOyBUYXAgNQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MGEgeHgwOSB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMwotICAgICAgICBwbXVsbHcgICAgICB4bW0xLCAgICAgICBbcmR4KzgwXSAgICAgICAgICAgICAgICAgICAgOyB4WyAzXSAqIGhbIDNdIDsgVGFwIDYKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW03Ci0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTUKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0zCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIHhtbTYKLQotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW0xCi0gICAgICAgIHBhZGRzdyAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIDcKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBsb3dlciA4IGJ5dGVzCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUHRyIFtyZGldLCAgICAgICAgIHhtbTQgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tMgotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMgotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMgotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAxIHh4LTEgeHgtMgotICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB4eCAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMCAtMQotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZHhdICAgICAgICAgICA7IHhbLTJdICogSFstMl07IFRhcCAxCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDYgeHgwNSB4eDA0IHh4MDMgeHgwMiB4eDAxIHh4MDAgeHgtMQotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyZHgrMTZdICAgICAgICA7IHhbLTFdICogSFstMV07IFRhcCAyCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAwCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4IHh4IHh4IDBkIDBjIDBiIDBhIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JkeCszMl0gICAgICAgICAgICAgICAgICAgIDsgeFsgMF0gKiBIWyAwXTsgVGFwIDMKLQotICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA4IHh4MDcgeHgwNiB4eDA1IHh4MDQgeHgwMyB4eDAyIHh4MDEKLSAgICAgICAgcHNybGRxICAgICAgeG1tNywgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIKLQotICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICBbcmR4KzQ4XSAgICAgICAgICAgICAgICAgICAgOyB4WyAxXSAqIGhbIDFdIDsgVGFwIDQKLQotICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDA5IHh4MDggeHgwNyB4eDA2IHh4MDUgeHgwNCB4eDAzIHh4MDIKLSAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgeHggeHggeHggeHggeHggMGQgMGMgMGIgMGEgMDkgMDggMDcgMDYgMDUgMDQgMDMKLQotICAgICAgICBwbXVsbHcgICAgICB4bW03LCAgICAgICBbcmR4KzY0XSAgICAgICAgICAgICAgICAgICAgOyB4WyAyXSAqIGhbIDJdIDsgVGFwIDUKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyB4eDBhIHh4MDkgeHgwOCB4eDA3IHh4MDYgeHgwNSB4eDA0IHh4MDMKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMiwgICAgICAgW3JkeCs4MF0gICAgICAgICAgICAgICAgICAgIDsgeFsgM10gKiBoWyAzXSA7IFRhcCA2Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tNwotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW01Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMwotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICB4bW02Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tNCwgICAgICAgeG1tMgotICAgICAgICBwYWRkc3cgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KLQotICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICA3Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgaGlnaGVyIDggYnl0ZXMKLQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBQdHIgW3JkaSs4XSwgICAgICB4bW00ICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICBbcnNpICsgcmF4XQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQdHIgYXJnKDMpIDtkc3RfcHRpY2gKLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLQotICAgICAgICBkZWMgICAgICAgICByY3gKLSAgICAgICAgam56ICAgICAgICAgZmlsdGVyX2Jsb2NrMWQxNl9oNl9vbmx5X3NzZTJfcm93bG9vcCAgICAgICAgICAgICAgICA7IG5leHQgcm93Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi07ICAgIGludCBkc3RfcHRpY2gsCi07ICAgIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LAotOyAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgotOykKLTsgU2Vjb25kLXBhc3MgZmlsdGVyIG9ubHkgd2hlbiB4b2Zmc2V0PT0wCi1nbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfb25seV9zc2UyKQotc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfb25seV9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgO291dHB1dF9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtvdXRwdXRfaGVpZ2h0Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUKLQotICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICBhcmcoNSkgO3ZwOF9maWx0ZXIKLQotICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW0dMT0JBTChyZCldCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICAgICAgbW92c3hkICAgICAgcjgsICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7IGRzdF9wdGljaAotJWVuZGlmCi0KLXZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfb25seV9zc2UyX2xvb3A6Ci0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmR4XQotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXQotICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHgKLSAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNiwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgIFtyYXhdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICBwbXVsbHcgICAgICB4bW0yLCAgICAgICBbcmF4ICsgMTZdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMAotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBbcmF4ICsgMzJdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICBbcmF4ICsgNjRdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tMAotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBbcmF4ICsgNDhdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tMAotICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICBbcmF4ICsgODBdCi0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNQotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW0zCi0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tMQotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW00Ci0KLSAgICAgICAgcGFkZHN3ICAgICAgeG1tMiwgICAgICAgeG1tNgotICAgICAgICBwYWRkc3cgICAgICB4bW0yLCAgICAgICB4bW03Ci0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgNwotICAgICAgICBwYWNrdXN3YiAgICB4bW0yLCAgICAgICB4bW0wICAgICAgICAgICAgICA7IHBhY2sgYW5kIHNhdHVyYXRlCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtyZGldLCB4bW0yICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W2RzdF9wdGljaF0KLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLSAgICAgICAgZGVjICAgICAgICAgcmN4ICAgICAgICAgOyBkZWNyZW1lbnQgY291bnQKLSAgICAgICAgam56ICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9vbmx5X3NzZTJfbG9vcCAgICAgICAgICAgICAgIDsgbmV4dCByb3cKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIHZwOF91bnBhY2tfYmxvY2sxZDE2X2g2X3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyAgICB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwKLTsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoCi07KQotZ2xvYmFsIHN5bSh2cDhfdW5wYWNrX2Jsb2NrMWQxNl9oNl9zc2UyKQotc3ltKHZwOF91bnBhY2tfYmxvY2sxZDE2X2g2X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIDtTQVZFX1hNTSAgICAgICAgICAgICAgICAgICAgICAgICAgO3htbTYsIHhtbTcgYXJlIG5vdCB1c2VkIGhlcmUuCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7b3V0cHV0X3B0cgotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJjeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO291dHB1dF9oZWlnaHQKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICAgICAgICAgIDsgUGl0Y2ggZm9yIFNvdXJjZQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTAgZm9yIHVucGFjawotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO291dHB1dF93aWR0aCAgICAgICAgICAgIDsgUGl0Y2ggZm9yIFNvdXJjZQotJWVuZGlmCi0KLXVucGFja19ibG9jazFkMTZfaDZfc3NlMl9yb3dsb29wOgotICAgICAgICBtb3ZxICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyc2ldICAgICAgICAgICAgOyAwZCAwYyAwYiAwYSAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMCAtMSAtMgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyc2krOF0gICAgICAgICAgOyBtYWtlIGNvcHkgb2YgeG1tMQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IHh4MDUgeHgwNCB4eDAzIHh4MDIgeHgwMSB4eDAxIHh4LTEgeHgtMgotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0wCi0KLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQdHIgW3JkaV0sICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFB0ciBbcmRpICsgMTZdLCAgICB4bW0zCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheF0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUHRyIGFyZyg0KSA7W291dHB1dF93aWR0aF0KLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLSAgICAgICAgZGVjICAgICAgICAgcmN4Ci0gICAgICAgIGpueiAgICAgICAgIHVucGFja19ibG9jazFkMTZfaDZfc3NlMl9yb3dsb29wICAgICAgICAgICAgICAgIDsgbmV4dCByb3cKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIDtSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICBpbnQgIHhvZmZzZXQsCi07ICAgIGludCAgeW9mZnNldCwKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgICAgaW50IGRzdF9waXRjaAotOykKLWV4dGVybiBzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfbW14KQotZ2xvYmFsIHN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3NzZTIpCi1zeW0odnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgO2NvbnN0IHNob3J0ICpIRmlsdGVyID0gYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF0KLSAgICA7Y29uc3Qgc2hvcnQgKlZGaWx0ZXIgPSBiaWxpbmVhcl9maWx0ZXJzX21teFt5b2Zmc2V0XQotCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtHTE9CQUwoc3ltKHZwOF9iaWxpbmVhcl9maWx0ZXJzX21teCkpXQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpIDt4b2Zmc2V0Ci0KLSAgICAgICAgY21wICAgICAgICAgcmF4LCAgICAgICAgMCAgICAgIDtza2lwIGZpcnN0X3Bhc3MgZmlsdGVyIGlmIHhvZmZzZXQ9MAotICAgICAgICBqZSAgICAgICAgICBiMTZ4MTZfc3Bfb25seQotCi0gICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKLSAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4ICAgIDtIRmlsdGVyCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpIDtkc3RfcHRyCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmF4XQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBbcmF4KzE2XQotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3lvZmZzZXQKLQotICAgICAgICBjbXAgICAgICAgICByYXgsICAgICAgICAwICAgICAgO3NraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAotICAgICAgICBqZSAgICAgICAgICBiMTZ4MTZfZnBfb25seQotCi0gICAgICAgIHNobCAgICAgICAgIHJheCwgICAgICAgIDUKLSAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgcmN4ICAgIDtWRmlsdGVyCi0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkaStyZHgqOF0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyZHgqOF0KLSAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAKLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaAotJWVuZGlmCi0gICAgICAgIDsgZ2V0IHRoZSBmaXJzdCBob3Jpem9udGFsIGxpbmUgZG9uZQotICAgICAgICBtb3ZkcXUgICAgICB4bW0zLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBtYWtlIGEgY29weSBvZiBjdXJyZW50IGxpbmUKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2Ci0gICAgICAgIHB1bnBja2hidyAgIHhtbTQsICAgICAgIHhtbTAKLQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICB4bW0xCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIHhtbTEKLQotICAgICAgICBtb3ZkcXUgICAgICB4bW01LCAgICAgICBbcnNpKzFdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTUKLQotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2hidyAgIHhtbTYsICAgICAgIHhtbTAKLQotICAgICAgICBwbXVsbHcgICAgICB4bW01LCAgICAgICB4bW0yCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTYsICAgICAgIHhtbTIKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICB4bW01Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIHhtbTYKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTcsICAgICAgIHhtbTQKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi1uZXh0X3JvdzoKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMywgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDEwIDExIDEyIDEzIDE0Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsgbWFrZSBhIGNvcHkgb2YgY3VycmVudCBsaW5lCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNgotICAgICAgICBwdW5wY2toYncgICB4bW00LCAgICAgICB4bW0wCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICB4bW0xCi0KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNSwgICAgICAgW3JzaSsxXQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW01Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2toYncgICB4bW02LCAgICAgICB4bW0wCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgeG1tMgotICAgICAgICBwbXVsbHcgICAgICB4bW02LCAgICAgICB4bW0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgeG1tNQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICB4bW02Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2toYncgICB4bW02LCAgICAgICB4bW0wCi0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNSwgICAgICAgW3JheF0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgW3JheF0KLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTcsICAgICAgIHhtbTQKLQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICBbcmF4KzE2XQotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICBbcmF4KzE2XQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTUKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgeG1tNgotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgIHhtbTQKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByZHggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoNSkgO2RzdF9waXRjaAotJWVsc2UKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotCi0gICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeAotICAgICAgICBqbmUgICAgICAgICBuZXh0X3JvdwotCi0gICAgICAgIGptcCAgICAgICAgIGRvbmUKLQotYjE2eDE2X3NwX29ubHk6Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3lvZmZzZXQKLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNQotICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggICAgO1ZGaWx0ZXIKLQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO2RzdF9wdHIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgO2RzdF9waXRjaAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyYXhdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIFtyYXgrMTZdCi0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkaStyZHgqOF0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyZHgqOF0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgIHhtbTAKLQotICAgICAgICA7IGdldCB0aGUgZmlyc3QgaG9yaXpvbnRhbCBsaW5lIGRvbmUKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNywgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7IHh4IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDEwIDExIDEyIDEzIDE0Ci0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQotbmV4dF9yb3dfc3BvOgotICAgICAgICBtb3ZkcXUgICAgICB4bW0zLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW03Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTcKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwdW5wY2toYncgICB4bW02LCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNCwgICAgICAgeG1tMAotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIHhtbTEKLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgeG1tMQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICB4bW0yCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTQsICAgICAgIHhtbTIKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICB4bW01Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIHhtbTYKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgICAgICA7IHhtbTMgLz0gMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTQsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW00Ci0gICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCi0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICByZHggICAgICAgICAgICAgICAgIDtkc3RfcGl0Y2gKLSAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4Ci0gICAgICAgIGpuZSAgICAgICAgIG5leHRfcm93X3NwbwotCi0gICAgICAgIGptcCAgICAgICAgIGRvbmUKLQotYjE2eDE2X2ZwX29ubHk6Ci0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmR4KjhdCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMAotCi1uZXh0X3Jvd19mcG86Ci0gICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyB4eCAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNAotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsgeHggMDAgMDEgMDIgMDMgMDQgMDUgMDYKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNCwgICAgICAgeG1tMAotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTMsICAgICAgIHhtbTEKLSAgICAgICAgcG11bGx3ICAgICAgeG1tNCwgICAgICAgeG1tMQotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTUsICAgICAgIFtyc2krMV0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgeG1tNQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNiwgICAgICAgeG1tMAotCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTUsICAgICAgIHhtbTIKLSAgICAgICAgcG11bGx3ICAgICAgeG1tNiwgICAgICAgeG1tMgotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTUKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgeG1tNgotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgIHhtbTQKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXggICAgICAgICAgICAgICAgIDsgbmV4dCBsaW5lCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHJkeCAgICAgICAgICAgICAgICAgOyBkc3RfcGl0Y2gKLSAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4Ci0gICAgICAgIGpuZSAgICAgICAgIG5leHRfcm93X2ZwbwotCi1kb25lOgotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICBpbnQgIHhvZmZzZXQsCi07ICAgIGludCAgeW9mZnNldCwKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgICAgaW50IGRzdF9waXRjaAotOykKLWV4dGVybiBzeW0odnA4X2JpbGluZWFyX2ZpbHRlcnNfbW14KQotZ2xvYmFsIHN5bSh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9zc2UyKQotc3ltKHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxNDQgICAgICAgICAgICAgICAgICAgICAgICAgOyByZXNlcnZlIDE0NCBieXRlcwotCi0gICAgO2NvbnN0IHNob3J0ICpIRmlsdGVyID0gYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF0KLSAgICA7Y29uc3Qgc2hvcnQgKlZGaWx0ZXIgPSBiaWxpbmVhcl9maWx0ZXJzX21teFt5b2Zmc2V0XQotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbR0xPQkFMKHN5bSh2cDhfYmlsaW5lYXJfZmlsdGVyc19tbXgpKV0KLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3BpeGVsc19wZXJfbGluZQotCi0gICAgO1JlYWQgOS1saW5lIHVuYWxpZ25lZCBkYXRhIGluIGFuZCBwdXQgdGhlbSBvbiBzdGFjay4gVGhpcyBnaXZlcyBhIGJpZwotICAgIDtwZXJmb3JtYW5jZSBib29zdC4KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgW3JzaV0KLSAgICAgICAgbGVhICAgICAgICAgcmF4LCAgICAgICAgW3JkeCArIHJkeCoyXQotICAgICAgICBtb3ZkcXUgICAgICB4bW0xLCAgICAgICBbcnNpK3JkeF0KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMiwgICAgICAgW3JzaStyZHgqMl0KLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgcmF4Ci0gICAgICAgIG1vdmRxdSAgICAgIHhtbTMsICAgICAgIFtyc2ldCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTQsICAgICAgIFtyc2krcmR4XQotICAgICAgICBtb3ZkcXUgICAgICB4bW01LCAgICAgICBbcnNpK3JkeCoyXQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNiwgICAgICAgW3JzaV0KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNywgICAgICAgW3JzaStyZHhdCi0KLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcF0sICAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTAsICAgICAgIFtyc2krcmR4KjJdCi0KLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCsxNl0sICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzMyXSwgICAgICAgICB4bW0yCi0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArNDhdLCAgICAgICAgIHhtbTMKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCs2NF0sICAgICAgICAgeG1tNAotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzgwXSwgICAgICAgICB4bW01Ci0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArOTZdLCAgICAgICAgIHhtbTYKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCsxMTJdLCAgICAgICAgeG1tNwotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzEyOF0sICAgICAgICB4bW0wCi0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSA7eG9mZnNldAotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA1Ci0gICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgIHJjeCAgICA7SEZpbHRlcgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7ZHN0X3B0cgotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtkc3RfcGl0Y2gKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmF4XQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBbcmF4KzE2XQotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3lvZmZzZXQKLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNQotICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggICAgO1ZGaWx0ZXIKLQotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbcmRpK3JkeCo4XQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIFtyYXhdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFtyYXgrMTZdCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgeG1tMAotCi0gICAgICAgIDsgZ2V0IHRoZSBmaXJzdCBob3Jpem9udGFsIGxpbmUgZG9uZQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcnNwXQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQotICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNwotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4Ci0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICB4bW0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgeG1tNAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXSAgICAgICAgOyB4bW0zICs9IHJvdW5kIHZhbHVlCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQgICAgICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCi0gICAgICAgIGFkZCAgICAgICAgIHJzcCwgICAgICAgIDE2ICAgICAgICAgICAgICAgICA7IG5leHQgbGluZQotbmV4dF9yb3c4eDg6Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyc3BdICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7IG1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQotICAgICAgICBwc3JsZHEgICAgICB4bW00LCAgICAgICAxCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNwotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4Ci0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICBwbXVsbHcgICAgICB4bW00LCAgICAgICB4bW0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgeG1tNAotICAgICAgICBwbXVsbHcgICAgICB4bW03LCAgICAgICB4bW01Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTMKLQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICB4bW02Ci0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIHhtbTcKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW00Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICAgICAgOyB4bW0zIC89IDEyOAotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTMsICAgICAgIHhtbTAKLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLQotICAgICAgICBhZGQgICAgICAgICByc3AsICAgICAgICAxNiAgICAgICAgICAgICAgICAgOyBuZXh0IGxpbmUKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcmR4Ci0KLSAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4Ci0gICAgICAgIGpuZSAgICAgICAgIG5leHRfcm93OHg4Ci0KLSAgICA7YWRkIHJzcCwgMTQ0Ci0gICAgcG9wIHJzcAotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotcmQ6Ci0gICAgdGltZXMgOCBkdyAweDQwCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9zc3NlMy5hc20gYi92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF9zc3NlMy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNmZkOTMuLjAwMDAwMDAKLS0tIGEvdnA4L2NvbW1vbi94ODYvc3VicGl4ZWxfc3NzZTMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLSVkZWZpbmUgQkxPQ0tfSEVJR0hUX1dJRFRIIDQKLSVkZWZpbmUgVlA4X0ZJTFRFUl9XRUlHSFQgMTI4Ci0lZGVmaW5lIFZQOF9GSUxURVJfU0hJRlQgIDcKLQotCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyBOb3RlczogZmlsdGVyX2Jsb2NrMWRfaDYgYXBwbGllcyBhIDYgdGFwIGZpbHRlciBob3Jpem9udGFsbHkgdG8gdGhlIGlucHV0IHBpeGVscy4gVGhlCi07IGlucHV0IHBpeGVsIGFycmF5IGhhcyBvdXRwdXRfaGVpZ2h0IHJvd3MuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgb3V0cHV0X2hlaWdodCBpcyBhbgotOyBldmVuIG51bWJlci4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIDggcGl4ZWxzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLCBjYWxjdWxhdGluZyBPTkUKLTsgcm93cyBlYWNoIGl0ZXJhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgMTI4IGJpdHMgb3BlcmF0aW9ucy4KLTsKLTsgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzb21lIG9mIHRoZSBTU0Ugb3B0aW1pemF0aW9ucyBmaXJzdCBzZWVuIGluIGZmdnA4Ci07Ci07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLTt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfc3NzZTMKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLTsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9waXRjaCwKLTsgICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi07ICAgIHVuc2lnbmVkIGludCAgICB2cDhfZmlsdGVyX2luZGV4Ci07KQotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzKQotc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfc3NzZTMpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgbW92c3hkICAgICAgcmR4LCBEV09SRCBQVFIgYXJnKDUpICAgO3RhYmxlIGluZGV4Ci0gICAgeG9yICAgICAgICAgcnNpLCByc2kKLSAgICBzaGwgICAgICAgICByZHgsIDQKLQotICAgIG1vdmRxYSAgICAgIHhtbTcsIFtHTE9CQUwocmQpXQotCi0gICAgbGVhICAgICAgICAgcmF4LCBbR0xPQkFMKGswX2s1KV0KLSAgICBhZGQgICAgICAgICByYXgsIHJkeAotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgIDtvdXRwdXRfcHRyCi0KLSAgICBjbXAgICAgICAgICBlc2ksIERXT1JEIFBUUiBbcmF4XQotICAgIGplICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDRfc3NzZTMKLQotICAgIG1vdmRxYSAgICAgIHhtbTQsIFhNTVdPUkQgUFRSIFtyYXhdICAgICAgICAgO2swX2s1Ci0gICAgbW92ZHFhICAgICAgeG1tNSwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZkcWEgICAgICB4bW02LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotCi0gICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKLSAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICA7c3JjX3BpeGVsc19wZXJfbGluZQotICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg0KSAgIDtvdXRwdXRfaGVpZ2h0Ci0KLSAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgICA7b3V0cHV0X3BpdGNoCi0KLSAgICBzdWIgICAgICAgICByZGksIHJkeAotO3htbTMgZnJlZQotZmlsdGVyX2Jsb2NrMWQ4X2g2X3Jvd2xvb3Bfc3NzZTM6Ci0gICAgbW92cSAgICAgICAgeG1tMCwgICBNTVdPUkQgUFRSIFtyc2kgLSAyXSAgICA7IC0yIC0xICAwICAxICAyICAzICA0ICA1Ci0KLSAgICBtb3ZxICAgICAgICB4bW0yLCAgIE1NV09SRCBQVFIgW3JzaSArIDNdICAgIDsgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAKLQotICAgIHB1bnBja2xidyAgIHhtbTAsICAgeG1tMiAgICAgICAgICAgICAgICAgICAgOyAtMiAgMyAtMSAgNCAgMCAgNSAgMSAgNiAgMiAgNyAgMyAgOCAgNCAgOSAgNSAxMAotCi0gICAgbW92ZHFhICAgICAgeG1tMSwgICB4bW0wCi0gICAgcG1hZGR1YnN3ICAgeG1tMCwgICB4bW00Ci0KLSAgICBtb3ZkcWEgICAgICB4bW0yLCAgIHhtbTEKLSAgICBwc2h1ZmIgICAgICB4bW0xLCAgIFtHTE9CQUwoc2h1ZjJiZnJvbTEpXQotCi0gICAgcHNodWZiICAgICAgeG1tMiwgICBbR0xPQkFMKHNodWYzYmZyb20xKV0KLSAgICBwbWFkZHVic3cgICB4bW0xLCAgIHhtbTUKLQotICAgIGxlYSAgICAgICAgIHJkaSwgICAgW3JkaSArIHJkeF0KLSAgICBwbWFkZHVic3cgICB4bW0yLCAgIHhtbTYKLQotICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KLSAgICBkZWMgICAgICAgICByY3gKLQotICAgIHBhZGRzdyAgICAgIHhtbTAsICAgeG1tMQotICAgIHBhZGRzdyAgICAgIHhtbTIsICAgeG1tNwotCi0gICAgcGFkZHN3ICAgICAgeG1tMCwgICB4bW0yCi0KLSAgICBwc3JhdyAgICAgICB4bW0wLCAgIDcKLQotICAgIHBhY2t1c3diICAgIHhtbTAsICAgeG1tMAotCi0gICAgbW92cSAgICAgICAgTU1XT1JEIFB0ciBbcmRpXSwgeG1tMAotICAgIGpueiAgICAgICAgIGZpbHRlcl9ibG9jazFkOF9oNl9yb3dsb29wX3Nzc2UzCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLXZwOF9maWx0ZXJfYmxvY2sxZDhfaDRfc3NzZTM6Ci0gICAgbW92ZHFhICAgICAgeG1tNSwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZkcWEgICAgICB4bW02LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotCi0gICAgbW92ZHFhICAgICAgeG1tMywgWE1NV09SRCBQVFIgW0dMT0JBTChzaHVmMmJmcm9tMSldCi0gICAgbW92ZHFhICAgICAgeG1tNCwgWE1NV09SRCBQVFIgW0dMT0JBTChzaHVmM2Jmcm9tMSldCi0KLSAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSAgICAgICAgICAgICA7c3JjX3B0cgotCi0gICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLSAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAotCi0gICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpICAgO291dHB1dF9waXRjaAotCi0gICAgc3ViICAgICAgICAgcmRpLCByZHgKLQotZmlsdGVyX2Jsb2NrMWQ4X2g0X3Jvd2xvb3Bfc3NzZTM6Ci0gICAgbW92cSAgICAgICAgeG1tMCwgICBNTVdPUkQgUFRSIFtyc2kgLSAyXSAgICA7IC0yIC0xICAwICAxICAyICAzICA0ICA1Ci0KLSAgICBtb3ZxICAgICAgICB4bW0xLCAgIE1NV09SRCBQVFIgW3JzaSArIDNdICAgIDsgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAKLQotICAgIHB1bnBja2xidyAgIHhtbTAsICAgeG1tMSAgICAgICAgICAgICAgICAgICAgOyAtMiAgMyAtMSAgNCAgMCAgNSAgMSAgNiAgMiAgNyAgMyAgOCAgNCAgOSAgNSAxMAotCi0gICAgbW92ZHFhICAgICAgeG1tMiwgICB4bW0wCi0gICAgcHNodWZiICAgICAgeG1tMCwgICB4bW0zCi0KLSAgICBwc2h1ZmIgICAgICB4bW0yLCAgIHhtbTQKLSAgICBwbWFkZHVic3cgICB4bW0wLCAgIHhtbTUKLQotICAgIGxlYSAgICAgICAgIHJkaSwgICAgW3JkaSArIHJkeF0KLSAgICBwbWFkZHVic3cgICB4bW0yLCAgIHhtbTYKLQotICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KLSAgICBkZWMgICAgICAgICByY3gKLQotICAgIHBhZGRzdyAgICAgIHhtbTAsICAgeG1tNwotCi0gICAgcGFkZHN3ICAgICAgeG1tMCwgICB4bW0yCi0KLSAgICBwc3JhdyAgICAgICB4bW0wLCAgIDcKLQotICAgIHBhY2t1c3diICAgIHhtbTAsICAgeG1tMAotCi0gICAgbW92cSAgICAgICAgTU1XT1JEIFB0ciBbcmRpXSwgeG1tMAotCi0gICAgam56ICAgICAgICAgZmlsdGVyX2Jsb2NrMWQ4X2g0X3Jvd2xvb3Bfc3NzZTMKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLTt2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3Nzc2UzCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3BpdGNoLAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKLTsgICAgdW5zaWduZWQgaW50ICAgIHZwOF9maWx0ZXJfaW5kZXgKLTspCi1nbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3Nzc2UzKQotc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3Nzc2UzKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgbW92c3hkICAgICAgcmR4LCBEV09SRCBQVFIgYXJnKDUpICAgICAgICAgICA7dGFibGUgaW5kZXgKLSAgICB4b3IgICAgICAgICByc2ksIHJzaQotICAgIHNobCAgICAgICAgIHJkeCwgNCAgICAgIDsKLQotICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCi0gICAgYWRkICAgICAgICAgcmF4LCByZHgKLQotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgICAgICAgICAgO291dHB1dF9wdHIKLQotOzsKLTs7ICAgIGNtcCAgICAgICAgIGVzaSwgRFdPUkQgUFRSIFtyYXhdCi07OyAgICBqZSAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNF9zc3NlMwotCi0gICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgICAgICAgICA7c3JjX3B0cgotCi0gICAgbW92ZHFhICAgICAgeG1tNCwgWE1NV09SRCBQVFIgW3JheF0gICAgICAgICA7azBfazUKLSAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAotICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyYXgrMTI4XSAgICAgO2sxX2szCi0KLSAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICAgICAgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0gICAgbW92c3hkICAgICAgcmN4LCBkd29yZCBwdHIgYXJnKDQpICAgICAgICAgICA7b3V0cHV0X2hlaWdodAotICAgIG1vdnN4ZCAgICAgIHJkeCwgZHdvcmQgcHRyIGFyZygzKSAgICAgICAgICAgO291dHB1dF9waXRjaAotCi1maWx0ZXJfYmxvY2sxZDE2X2g2X3Jvd2xvb3Bfc3NzZTM6Ci0gICAgbW92cSAgICAgICAgeG1tMCwgICBNTVdPUkQgUFRSIFtyc2kgLSAyXSAgICA7IC0yIC0xICAwICAxICAyICAzICA0ICA1Ci0KLSAgICBtb3ZxICAgICAgICB4bW0zLCAgIE1NV09SRCBQVFIgW3JzaSArIDNdICAgIDsgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAKLQotICAgIHB1bnBja2xidyAgIHhtbTAsICAgeG1tMyAgICAgICAgICAgICAgICAgICAgOyAtMiAgMyAtMSAgNCAgMCAgNSAgMSAgNiAgMiAgNyAgMyAgOCAgNCAgOSAgNSAxMAotCi0gICAgbW92ZHFhICAgICAgeG1tMSwgICB4bW0wCi0gICAgcG1hZGR1YnN3ICAgeG1tMCwgICB4bW00Ci0KLSAgICBtb3ZkcWEgICAgICB4bW0yLCAgIHhtbTEKLSAgICBwc2h1ZmIgICAgICB4bW0xLCAgIFtHTE9CQUwoc2h1ZjJiZnJvbTEpXQotCi0gICAgcHNodWZiICAgICAgeG1tMiwgICBbR0xPQkFMKHNodWYzYmZyb20xKV0KLSAgICBtb3ZxICAgICAgICB4bW0zLCAgIE1NV09SRCBQVFIgW3JzaSArICA2XQotCi0gICAgcG1hZGR1YnN3ICAgeG1tMSwgICB4bW01Ci0gICAgbW92cSAgICAgICAgeG1tNywgICBNTVdPUkQgUFRSIFtyc2kgKyAxMV0KLQotICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgeG1tNgotICAgIHB1bnBja2xidyAgIHhtbTMsICAgeG1tNwotCi0gICAgcGFkZHN3ICAgICAgeG1tMCwgICB4bW0xCi0gICAgbW92ZHFhICAgICAgeG1tMSwgICB4bW0zCi0KLSAgICBwbWFkZHVic3cgICB4bW0zLCAgIHhtbTQKLSAgICBwYWRkc3cgICAgICB4bW0wLCAgIHhtbTIKLQotICAgIG1vdmRxYSAgICAgIHhtbTIsICAgeG1tMQotICAgIHBhZGRzdyAgICAgIHhtbTAsICAgW0dMT0JBTChyZCldCi0KLSAgICBwc2h1ZmIgICAgICB4bW0xLCAgIFtHTE9CQUwoc2h1ZjJiZnJvbTEpXQotICAgIHBzaHVmYiAgICAgIHhtbTIsICAgW0dMT0JBTChzaHVmM2Jmcm9tMSldCi0KLSAgICBwc3JhdyAgICAgICB4bW0wLCAgIDcKLSAgICBwbWFkZHVic3cgICB4bW0xLCAgIHhtbTUKLQotICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgeG1tNgotICAgIHBhY2t1c3diICAgIHhtbTAsICAgeG1tMAotCi0gICAgbGVhICAgICAgICAgcnNpLCAgICBbcnNpICsgcmF4XQotICAgIHBhZGRzdyAgICAgIHhtbTMsICAgeG1tMQotCi0gICAgcGFkZHN3ICAgICAgeG1tMywgICB4bW0yCi0KLSAgICBwYWRkc3cgICAgICB4bW0zLCAgIFtHTE9CQUwocmQpXQotCi0gICAgcHNyYXcgICAgICAgeG1tMywgICA3Ci0KLSAgICBwYWNrdXN3YiAgICB4bW0zLCAgIHhtbTMKLQotICAgIHB1bnBja2xxZHEgIHhtbTAsICAgeG1tMwotCi0gICAgbW92ZHFhICAgICAgWE1NV09SRCBQdHIgW3JkaV0sIHhtbTAKLQotICAgIGxlYSAgICAgICAgIHJkaSwgICAgW3JkaSArIHJkeF0KLSAgICBkZWMgICAgICAgICByY3gKLSAgICBqbnogICAgICAgICBmaWx0ZXJfYmxvY2sxZDE2X2g2X3Jvd2xvb3Bfc3NzZTMKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDRfc3NzZTM6Ci0gICAgbW92ZHFhICAgICAgeG1tNSwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZkcWEgICAgICB4bW02LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotCi0gICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKLSAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBhcmcoMSkgICA7c3JjX3BpeGVsc19wZXJfbGluZQotICAgIG1vdnN4ZCAgICAgIHJjeCwgZHdvcmQgcHRyIGFyZyg0KSAgIDtvdXRwdXRfaGVpZ2h0Ci0gICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpICAgO291dHB1dF9waXRjaAotCi1maWx0ZXJfYmxvY2sxZDE2X2g0X3Jvd2xvb3Bfc3NzZTM6Ci0gICAgbW92ZHF1ICAgICAgeG1tMSwgICBYTU1XT1JEIFBUUiBbcnNpIC0gMl0KLQotICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKLSAgICBwc2h1ZmIgICAgICB4bW0xLCBbR0xPQkFMKHNodWYyYildCi0gICAgcHNodWZiICAgICAgeG1tMiwgW0dMT0JBTChzaHVmM2IpXQotICAgIHBtYWRkdWJzdyAgIHhtbTEsIHhtbTUKLQotICAgIG1vdmRxdSAgICAgIHhtbTMsICAgWE1NV09SRCBQVFIgW3JzaSArIDZdCi0KLSAgICBwbWFkZHVic3cgICB4bW0yLCB4bW02Ci0gICAgbW92ZHFhICAgICAgeG1tMCwgeG1tMwotICAgIHBzaHVmYiAgICAgIHhtbTMsIFtHTE9CQUwoc2h1ZjNiKV0KLSAgICBwc2h1ZmIgICAgICB4bW0wLCBbR0xPQkFMKHNodWYyYildCi0KLSAgICBwYWRkc3cgICAgICB4bW0xLCBbR0xPQkFMKHJkKV0KLSAgICBwYWRkc3cgICAgICB4bW0xLCB4bW0yCi0KLSAgICBwbWFkZHVic3cgICB4bW0wLCB4bW01Ci0gICAgcG1hZGR1YnN3ICAgeG1tMywgeG1tNgotCi0gICAgcHNyYXcgICAgICAgeG1tMSwgNwotICAgIHBhY2t1c3diICAgIHhtbTEsIHhtbTEKLSAgICBsZWEgICAgICAgICByc2ksICAgIFtyc2kgKyByYXhdCi0gICAgcGFkZHN3ICAgICAgeG1tMywgeG1tMAotICAgIHBhZGRzdyAgICAgIHhtbTMsIFtHTE9CQUwocmQpXQotICAgIHBzcmF3ICAgICAgIHhtbTMsIDcKLSAgICBwYWNrdXN3YiAgICB4bW0zLCB4bW0zCi0KLSAgICBwdW5wY2tscWRxICB4bW0xLCB4bW0zCi0KLSAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFB0ciBbcmRpXSwgeG1tMQotCi0gICAgYWRkICAgICAgICAgcmRpLCByZHgKLSAgICBkZWMgICAgICAgICByY3gKLSAgICBqbnogICAgICAgICBmaWx0ZXJfYmxvY2sxZDE2X2g0X3Jvd2xvb3Bfc3NzZTMKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ0X2g2X3Nzc2UzCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3BpdGNoLAotOyAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKLTsgICAgdW5zaWduZWQgaW50ICAgIHZwOF9maWx0ZXJfaW5kZXgKLTspCi1nbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2sxZDRfaDZfc3NzZTMpCi1zeW0odnA4X2ZpbHRlcl9ibG9jazFkNF9oNl9zc3NlMyk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoNSkgICA7dGFibGUgaW5kZXgKLSAgICB4b3IgICAgICAgICByc2ksIHJzaQotICAgIHNobCAgICAgICAgIHJkeCwgNCAgICAgIDsKLQotICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCi0gICAgYWRkICAgICAgICAgcmF4LCByZHgKLSAgICBtb3ZkcWEgICAgICB4bW03LCBbR0xPQkFMKHJkKV0KLQotICAgIGNtcCAgICAgICAgIGVzaSwgRFdPUkQgUFRSIFtyYXhdCi0gICAgamUgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkNF9oNF9zc3NlMwotCi0gICAgbW92ZHFhICAgICAgeG1tNCwgWE1NV09SRCBQVFIgW3JheF0gICAgICAgICA7azBfazUKLSAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAotICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyYXgrMTI4XSAgICAgO2sxX2szCi0KLSAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSAgICAgICAgICAgICA7c3JjX3B0cgotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgIDtvdXRwdXRfcHRyCi0gICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLSAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAotCi0gICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpICAgO291dHB1dF9waXRjaAotCi07eG1tMyBmcmVlCi1maWx0ZXJfYmxvY2sxZDRfaDZfcm93bG9vcF9zc3NlMzoKLSAgICBtb3ZkcXUgICAgICB4bW0wLCAgIFhNTVdPUkQgUFRSIFtyc2kgLSAyXQotCi0gICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAotICAgIHBzaHVmYiAgICAgIHhtbTAsIFtHTE9CQUwoc2h1ZjFiKV0KLQotICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTEKLSAgICBwc2h1ZmIgICAgICB4bW0xLCBbR0xPQkFMKHNodWYyYildCi0gICAgcG1hZGR1YnN3ICAgeG1tMCwgeG1tNAotICAgIHBzaHVmYiAgICAgIHhtbTIsIFtHTE9CQUwoc2h1ZjNiKV0KLSAgICBwbWFkZHVic3cgICB4bW0xLCB4bW01Ci0KLTstLQotICAgIHBtYWRkdWJzdyAgIHhtbTIsIHhtbTYKLQotICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KLTstLQotICAgIHBhZGRzdyAgICAgIHhtbTAsIHhtbTEKLSAgICBwYWRkc3cgICAgICB4bW0wLCB4bW03Ci0gICAgcHhvciAgICAgICAgeG1tMSwgeG1tMQotICAgIHBhZGRzdyAgICAgIHhtbTAsIHhtbTIKLSAgICBwc3JhdyAgICAgICB4bW0wLCA3Ci0gICAgcGFja3Vzd2IgICAgeG1tMCwgeG1tMAotCi0gICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtyZGldLCB4bW0wCi0KLSAgICBhZGQgICAgICAgICByZGksIHJkeAotICAgIGRlYyAgICAgICAgIHJjeAotICAgIGpueiAgICAgICAgIGZpbHRlcl9ibG9jazFkNF9oNl9yb3dsb29wX3Nzc2UzCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLXZwOF9maWx0ZXJfYmxvY2sxZDRfaDRfc3NzZTM6Ci0gICAgbW92ZHFhICAgICAgeG1tNSwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZkcWEgICAgICB4bW02LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotICAgIG1vdmRxYSAgICAgIHhtbTAsIFhNTVdPUkQgUFRSIFtHTE9CQUwoc2h1ZjJiKV0KLSAgICBtb3ZkcWEgICAgICB4bW0zLCBYTU1XT1JEIFBUUiBbR0xPQkFMKHNodWYzYildCi0KLSAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSAgICAgICAgICAgICA7c3JjX3B0cgotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgIDtvdXRwdXRfcHRyCi0gICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgYXJnKDEpICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLSAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAotCi0gICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpICAgO291dHB1dF9waXRjaAotCi1maWx0ZXJfYmxvY2sxZDRfaDRfcm93bG9vcF9zc3NlMzoKLSAgICBtb3ZkcXUgICAgICB4bW0xLCAgIFhNTVdPUkQgUFRSIFtyc2kgLSAyXQotCi0gICAgbW92ZHFhICAgICAgeG1tMiwgeG1tMQotICAgIHBzaHVmYiAgICAgIHhtbTEsIHhtbTAgOztbR0xPQkFMKHNodWYyYildCi0gICAgcHNodWZiICAgICAgeG1tMiwgeG1tMyA7O1tHTE9CQUwoc2h1ZjNiKV0KLSAgICBwbWFkZHVic3cgICB4bW0xLCB4bW01Ci0KLTstLQotICAgIHBtYWRkdWJzdyAgIHhtbTIsIHhtbTYKLQotICAgIGxlYSAgICAgICAgIHJzaSwgICAgW3JzaSArIHJheF0KLTstLQotICAgIHBhZGRzdyAgICAgIHhtbTEsIHhtbTcKLSAgICBwYWRkc3cgICAgICB4bW0xLCB4bW0yCi0gICAgcHNyYXcgICAgICAgeG1tMSwgNwotICAgIHBhY2t1c3diICAgIHhtbTEsIHhtbTEKLQotICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbcmRpXSwgeG1tMQotCi0gICAgYWRkICAgICAgICAgcmRpLCByZHgKLSAgICBkZWMgICAgICAgICByY3gKLSAgICBqbnogICAgICAgICBmaWx0ZXJfYmxvY2sxZDRfaDRfcm93bG9vcF9zc3NlMwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLQotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NzZTMKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKLTsgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLTsgICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAotOyAgICB1bnNpZ25lZCBpbnQgICBvdXRwdXRfaGVpZ2h0LAotOyAgICB1bnNpZ25lZCBpbnQgICB2cDhfZmlsdGVyX2luZGV4Ci07KQotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMykKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMyk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoNSkgICA7dGFibGUgaW5kZXgKLSAgICB4b3IgICAgICAgICByc2ksIHJzaQotICAgIHNobCAgICAgICAgIHJkeCwgNCAgICAgIDsKLQotICAgIGxlYSAgICAgICAgIHJheCwgW0dMT0JBTChrMF9rNSldCi0gICAgYWRkICAgICAgICAgcmF4LCByZHgKLQotICAgIGNtcCAgICAgICAgIGVzaSwgRFdPUkQgUFRSIFtyYXhdCi0gICAgamUgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjRfc3NzZTMKLQotICAgIG1vdmRxYSAgICAgIHhtbTUsIFhNTVdPUkQgUFRSIFtyYXhdICAgICAgICAgO2swX2s1Ci0gICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotCi0gICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKLSAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoMSkgICA7cGl4ZWxzX3Blcl9saW5lCi0gICAgbW92ICAgICAgICAgcmRpLCBhcmcoMikgICAgICAgICAgICAgO291dHB1dF9wdHIKLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgbW92c3hkICAgICAgcjgsIERXT1JEIFBUUiBhcmcoMykgICAgO291dF9waXRjaAotJWVuZGlmCi0gICAgbW92ICAgICAgICAgcmF4LCByc2kKLSAgICBtb3ZzeGQgICAgICByY3gsIERXT1JEIFBUUiBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAotICAgIGFkZCAgICAgICAgIHJheCwgcmR4Ci0KLQotdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjZfc3NzZTNfbG9vcDoKLSAgICBtb3ZxICAgICAgICB4bW0xLCBNTVdPUkQgUFRSIFtyc2ldICAgICAgICAgICAgICAgICAgO0EKLSAgICBtb3ZxICAgICAgICB4bW0yLCBNTVdPUkQgUFRSIFtyc2kgKyByZHhdICAgICAgICAgICAgO0IKLSAgICBtb3ZxICAgICAgICB4bW0zLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICAgO0MKLSAgICBtb3ZxICAgICAgICB4bW00LCBNTVdPUkQgUFRSIFtyYXggKyByZHggKiAyXSAgICAgICAgO0QKLSAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XSAgICAgICAgO0UKLQotICAgIHB1bnBja2xidyAgIHhtbTIsIHhtbTQgICAgICAgICAgICAgICAgICA7QiBECi0gICAgcHVucGNrbGJ3ICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKLQotICAgIG1vdnEgICAgICAgIHhtbTAsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDRdICAgICAgICA7RgotCi0gICAgcG1hZGR1YnN3ICAgeG1tMywgeG1tNgotICAgIHB1bnBja2xidyAgIHhtbTEsIHhtbTAgICAgICAgICAgICAgICAgICA7QSBGCi0gICAgcG1hZGR1YnN3ICAgeG1tMiwgeG1tNwotICAgIHBtYWRkdWJzdyAgIHhtbTEsIHhtbTUKLQotICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTMKLSAgICBwYWRkc3cgICAgICB4bW0yLCB4bW0xCi0gICAgcGFkZHN3ICAgICAgeG1tMiwgW0dMT0JBTChyZCldCi0gICAgcHNyYXcgICAgICAgeG1tMiwgNwotICAgIHBhY2t1c3diICAgIHhtbTIsIHhtbTIKLQotICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JkaV0sIHhtbTIgICAgICAgICAgO3N0b3JlIHRoZSByZXN1bHRzCi0KLSAgICBtb3ZxICAgICAgICB4bW0xLCBNTVdPUkQgUFRSIFtyc2kgKyA4XSAgICAgICAgICAgICAgICAgIDtBCi0gICAgbW92cSAgICAgICAgeG1tMiwgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICsgOF0gICAgICAgICAgICA7QgotICAgIG1vdnEgICAgICAgIHhtbTMsIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDIgKyA4XSAgICAgICAgO0MKLSAgICBtb3ZxICAgICAgICB4bW00LCBNTVdPUkQgUFRSIFtyYXggKyByZHggKiAyICsgOF0gICAgICAgIDtECi0gICAgbW92cSAgICAgICAgeG1tMCwgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNCArIDhdICAgICAgICA7RQotCi0gICAgcHVucGNrbGJ3ICAgeG1tMiwgeG1tNCAgICAgICAgICAgICAgICAgIDtCIEQKLSAgICBwdW5wY2tsYncgICB4bW0zLCB4bW0wICAgICAgICAgICAgICAgICAgO0MgRQotCi0gICAgbW92cSAgICAgICAgeG1tMCwgTU1XT1JEIFBUUiBbcmF4ICsgcmR4ICogNCArIDhdICAgICAgICA7RgotICAgIHBtYWRkdWJzdyAgIHhtbTMsIHhtbTYKLSAgICBwdW5wY2tsYncgICB4bW0xLCB4bW0wICAgICAgICAgICAgICAgICAgO0EgRgotICAgIHBtYWRkdWJzdyAgIHhtbTIsIHhtbTcKLSAgICBwbWFkZHVic3cgICB4bW0xLCB4bW01Ci0KLSAgICBhZGQgICAgICAgICByc2ksICByZHgKLSAgICBhZGQgICAgICAgICByYXgsICByZHgKLTstLQotOy0tCi0gICAgcGFkZHN3ICAgICAgeG1tMiwgeG1tMwotICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTEKLSAgICBwYWRkc3cgICAgICB4bW0yLCBbR0xPQkFMKHJkKV0KLSAgICBwc3JhdyAgICAgICB4bW0yLCA3Ci0gICAgcGFja3Vzd2IgICAgeG1tMiwgeG1tMgotCi0gICAgbW92cSAgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdLCB4bW0yCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtvdXRfcGl0Y2gKLSVlbHNlCi0gICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotICAgIGRlYyAgICAgICAgIHJjeAotICAgIGpueiAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3Nzc2UzX2xvb3AKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjRfc3NzZTM6Ci0gICAgbW92ZHFhICAgICAgeG1tNiwgWE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZkcWEgICAgICB4bW03LCBYTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotCi0gICAgbW92ICAgICAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgICAgO3NyY19wdHIKLSAgICBtb3ZzeGQgICAgICByZHgsIERXT1JEIFBUUiBhcmcoMSkgICA7cGl4ZWxzX3Blcl9saW5lCi0gICAgbW92ICAgICAgICAgcmRpLCBhcmcoMikgICAgICAgICAgICAgO291dHB1dF9wdHIKLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgbW92c3hkICAgICAgcjgsIERXT1JEIFBUUiBhcmcoMykgICAgO291dF9waXRjaAotJWVuZGlmCi0gICAgbW92ICAgICAgICAgcmF4LCByc2kKLSAgICBtb3ZzeGQgICAgICByY3gsIERXT1JEIFBUUiBhcmcoNCkgICA7b3V0cHV0X2hlaWdodAotICAgIGFkZCAgICAgICAgIHJheCwgcmR4Ci0KLXZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y0X3Nzc2UzX2xvb3A6Ci0gICAgbW92cSAgICAgICAgeG1tMiwgTU1XT1JEIFBUUiBbcnNpICsgcmR4XSAgICAgICAgICAgIDtCCi0gICAgbW92cSAgICAgICAgeG1tMywgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0gICAgICAgIDtDCi0gICAgbW92cSAgICAgICAgeG1tNCwgTU1XT1JEIFBUUiBbcmF4ICsgcmR4ICogMl0gICAgICAgIDtECi0gICAgbW92cSAgICAgICAgeG1tMCwgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0gICAgICAgIDtFCi0KLSAgICBwdW5wY2tsYncgICB4bW0yLCB4bW00ICAgICAgICAgICAgICAgICAgO0IgRAotICAgIHB1bnBja2xidyAgIHhtbTMsIHhtbTAgICAgICAgICAgICAgICAgICA7QyBFCi0KLSAgICBwbWFkZHVic3cgICB4bW0zLCB4bW02Ci0gICAgcG1hZGR1YnN3ICAgeG1tMiwgeG1tNwotICAgIG1vdnEgICAgICAgIHhtbTUsIE1NV09SRCBQVFIgW3JzaSArIHJkeCArIDhdICAgICAgICAgICAgO0IKLSAgICBtb3ZxICAgICAgICB4bW0xLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyICsgOF0gICAgICAgIDtDCi0gICAgbW92cSAgICAgICAgeG1tNCwgTU1XT1JEIFBUUiBbcmF4ICsgcmR4ICogMiArIDhdICAgICAgICA7RAotICAgIG1vdnEgICAgICAgIHhtbTAsIE1NV09SRCBQVFIgW3JzaSArIHJkeCAqIDQgKyA4XSAgICAgICAgO0UKLQotICAgIHBhZGRzdyAgICAgIHhtbTIsIFtHTE9CQUwocmQpXQotICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTMKLSAgICBwc3JhdyAgICAgICB4bW0yLCA3Ci0gICAgcGFja3Vzd2IgICAgeG1tMiwgeG1tMgotCi0gICAgcHVucGNrbGJ3ICAgeG1tNSwgeG1tNCAgICAgICAgICAgICAgICAgIDtCIEQKLSAgICBwdW5wY2tsYncgICB4bW0xLCB4bW0wICAgICAgICAgICAgICAgICAgO0MgRQotCi0gICAgcG1hZGR1YnN3ICAgeG1tMSwgeG1tNgotICAgIHBtYWRkdWJzdyAgIHhtbTUsIHhtbTcKLQotICAgIG1vdmRxYSAgICAgIHhtbTQsIFtHTE9CQUwocmQpXQotICAgIGFkZCAgICAgICAgIHJzaSwgIHJkeAotICAgIGFkZCAgICAgICAgIHJheCwgIHJkeAotOy0tCi07LS0KLSAgICBwYWRkc3cgICAgICB4bW01LCB4bW0xCi0gICAgcGFkZHN3ICAgICAgeG1tNSwgeG1tNAotICAgIHBzcmF3ICAgICAgIHhtbTUsIDcKLSAgICBwYWNrdXN3YiAgICB4bW01LCB4bW01Ci0KLSAgICBwdW5wY2tscWRxICB4bW0yLCB4bW01Ci0KLSAgICBtb3ZkcWEgICAgICAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTIKLQotJWlmIEFCSV9JU18zMkJJVAotICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMykgO291dF9waXRjaAotJWVsc2UKLSAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAotJWVuZGlmCi0gICAgZGVjICAgICAgICAgcmN4Ci0gICAgam56ICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfdjRfc3NzZTNfbG9vcAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3Nzc2UzCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICBzcmNfcGl0Y2gsCi07ICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi07ICAgIHVuc2lnbmVkIGludCAgIG91dF9waXRjaCwKLTsgICAgdW5zaWduZWQgaW50ICAgb3V0cHV0X2hlaWdodCwKLTsgICAgdW5zaWduZWQgaW50ICAgdnA4X2ZpbHRlcl9pbmRleAotOykKLWdsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMykKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3Nzc2UzKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIG1vdnN4ZCAgICAgIHJkeCwgRFdPUkQgUFRSIGFyZyg1KSAgIDt0YWJsZSBpbmRleAotICAgIHhvciAgICAgICAgIHJzaSwgcnNpCi0gICAgc2hsICAgICAgICAgcmR4LCA0ICAgICAgOwotCi0gICAgbGVhICAgICAgICAgcmF4LCBbR0xPQkFMKGswX2s1KV0KLSAgICBhZGQgICAgICAgICByYXgsIHJkeAotCi0gICAgbW92c3hkICAgICAgcmR4LCBEV09SRCBQVFIgYXJnKDEpICAgO3BpeGVsc19wZXJfbGluZQotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgIDtvdXRwdXRfcHRyCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICBtb3ZzeGQgICAgICByOCwgRFdPUkQgUFRSIGFyZygzKSAgICA7IG91dF9waXRjaAotJWVuZGlmCi0gICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgYXJnKDQpICAgO1tvdXRwdXRfaGVpZ2h0XQotCi0gICAgY21wICAgICAgICAgZXNpLCBEV09SRCBQVFIgW3JheF0KLSAgICBqZSAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y0X3Nzc2UzCi0KLSAgICBtb3ZkcWEgICAgICB4bW01LCBYTU1XT1JEIFBUUiBbcmF4XSAgICAgICAgIDtrMF9rNQotICAgIG1vdmRxYSAgICAgIHhtbTYsIFhNTVdPUkQgUFRSIFtyYXgrMjU2XSAgICAgO2syX2s0Ci0gICAgbW92ZHFhICAgICAgeG1tNywgWE1NV09SRCBQVFIgW3JheCsxMjhdICAgICA7azFfazMKLQotICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCi0KLSAgICBtb3YgICAgICAgICByYXgsIHJzaQotICAgIGFkZCAgICAgICAgIHJheCwgcmR4Ci0KLXZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTNfbG9vcDoKLSAgICBtb3ZxICAgICAgICB4bW0xLCBNTVdPUkQgUFRSIFtyc2ldICAgICAgICAgICAgICAgICAgO0EKLSAgICBtb3ZxICAgICAgICB4bW0yLCBNTVdPUkQgUFRSIFtyc2kgKyByZHhdICAgICAgICAgICAgO0IKLSAgICBtb3ZxICAgICAgICB4bW0zLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICAgO0MKLSAgICBtb3ZxICAgICAgICB4bW00LCBNTVdPUkQgUFRSIFtyYXggKyByZHggKiAyXSAgICAgICAgO0QKLSAgICBtb3ZxICAgICAgICB4bW0wLCBNTVdPUkQgUFRSIFtyc2kgKyByZHggKiA0XSAgICAgICAgO0UKLQotICAgIHB1bnBja2xidyAgIHhtbTIsIHhtbTQgICAgICAgICAgICAgICAgICA7QiBECi0gICAgcHVucGNrbGJ3ICAgeG1tMywgeG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKLQotICAgIG1vdnEgICAgICAgIHhtbTAsIE1NV09SRCBQVFIgW3JheCArIHJkeCAqIDRdICAgICAgICA7RgotICAgIG1vdmRxYSAgICAgIHhtbTQsIFtHTE9CQUwocmQpXQotCi0gICAgcG1hZGR1YnN3ICAgeG1tMywgeG1tNgotICAgIHB1bnBja2xidyAgIHhtbTEsIHhtbTAgICAgICAgICAgICAgICAgICA7QSBGCi0gICAgcG1hZGR1YnN3ICAgeG1tMiwgeG1tNwotICAgIHBtYWRkdWJzdyAgIHhtbTEsIHhtbTUKLSAgICBhZGQgICAgICAgICByc2ksICByZHgKLSAgICBhZGQgICAgICAgICByYXgsICByZHgKLTstLQotOy0tCi0gICAgcGFkZHN3ICAgICAgeG1tMiwgeG1tMwotICAgIHBhZGRzdyAgICAgIHhtbTIsIHhtbTEKLSAgICBwYWRkc3cgICAgICB4bW0yLCB4bW00Ci0gICAgcHNyYXcgICAgICAgeG1tMiwgNwotICAgIHBhY2t1c3diICAgIHhtbTIsIHhtbTIKLQotICAgIG1vdnEgICAgICAgIE1NV09SRCBQVFIgW3JkaV0sIHhtbTIKLQotJWlmIEFCSV9JU18zMkJJVAotICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoMykgO1tvdXRfcGl0Y2hdCi0lZWxzZQotICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLSAgICBkZWMgICAgICAgICByY3gKLSAgICBqbnogICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3Nzc2UzX2xvb3AKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotdnA4X2ZpbHRlcl9ibG9jazFkOF92NF9zc3NlMzoKLSAgICBtb3ZkcWEgICAgICB4bW02LCBYTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAotICAgIG1vdmRxYSAgICAgIHhtbTcsIFhNTVdPUkQgUFRSIFtyYXgrMTI4XSAgICAgO2sxX2szCi0gICAgbW92ZHFhICAgICAgeG1tNSwgW0dMT0JBTChyZCldCi0KLSAgICBtb3YgICAgICAgICByc2ksIGFyZygwKSAgICAgICAgICAgICA7c3JjX3B0cgotCi0gICAgbW92ICAgICAgICAgcmF4LCByc2kKLSAgICBhZGQgICAgICAgICByYXgsIHJkeAotCi12cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y0X3Nzc2UzX2xvb3A6Ci0gICAgbW92cSAgICAgICAgeG1tMiwgTU1XT1JEIFBUUiBbcnNpICsgcmR4XSAgICAgICAgICAgIDtCCi0gICAgbW92cSAgICAgICAgeG1tMywgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogMl0gICAgICAgIDtDCi0gICAgbW92cSAgICAgICAgeG1tNCwgTU1XT1JEIFBUUiBbcmF4ICsgcmR4ICogMl0gICAgICAgIDtECi0gICAgbW92cSAgICAgICAgeG1tMCwgTU1XT1JEIFBUUiBbcnNpICsgcmR4ICogNF0gICAgICAgIDtFCi0KLSAgICBwdW5wY2tsYncgICB4bW0yLCB4bW00ICAgICAgICAgICAgICAgICAgO0IgRAotICAgIHB1bnBja2xidyAgIHhtbTMsIHhtbTAgICAgICAgICAgICAgICAgICA7QyBFCi0KLSAgICBwbWFkZHVic3cgICB4bW0zLCB4bW02Ci0gICAgcG1hZGR1YnN3ICAgeG1tMiwgeG1tNwotICAgIGFkZCAgICAgICAgIHJzaSwgIHJkeAotICAgIGFkZCAgICAgICAgIHJheCwgIHJkeAotOy0tCi07LS0KLSAgICBwYWRkc3cgICAgICB4bW0yLCB4bW0zCi0gICAgcGFkZHN3ICAgICAgeG1tMiwgeG1tNQotICAgIHBzcmF3ICAgICAgIHhtbTIsIDcKLSAgICBwYWNrdXN3YiAgICB4bW0yLCB4bW0yCi0KLSAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSIFtyZGldLCB4bW0yCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICBhZGQgICAgICAgICByZGksICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtbb3V0X3BpdGNoXQotJWVsc2UKLSAgICBhZGQgICAgICAgICByZGksICAgICAgICByOAotJWVuZGlmCi0gICAgZGVjICAgICAgICAgcmN4Ci0gICAgam56ICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92NF9zc3NlM19sb29wCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci07dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y2X3Nzc2UzCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICB1bnNpZ25lZCBpbnQgICBzcmNfcGl0Y2gsCi07ICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi07ICAgIHVuc2lnbmVkIGludCAgIG91dF9waXRjaCwKLTsgICAgdW5zaWduZWQgaW50ICAgb3V0cHV0X2hlaWdodCwKLTsgICAgdW5zaWduZWQgaW50ICAgdnA4X2ZpbHRlcl9pbmRleAotOykKLWdsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazFkNF92Nl9zc3NlMykKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y2X3Nzc2UzKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIG1vdnN4ZCAgICAgIHJkeCwgRFdPUkQgUFRSIGFyZyg1KSAgIDt0YWJsZSBpbmRleAotICAgIHhvciAgICAgICAgIHJzaSwgcnNpCi0gICAgc2hsICAgICAgICAgcmR4LCA0ICAgICAgOwotCi0gICAgbGVhICAgICAgICAgcmF4LCBbR0xPQkFMKGswX2s1KV0KLSAgICBhZGQgICAgICAgICByYXgsIHJkeAotCi0gICAgbW92c3hkICAgICAgcmR4LCBEV09SRCBQVFIgYXJnKDEpICAgO3BpeGVsc19wZXJfbGluZQotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDIpICAgICAgICAgICAgIDtvdXRwdXRfcHRyCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICBtb3ZzeGQgICAgICByOCwgRFdPUkQgUFRSIGFyZygzKSAgICA7IG91dF9waXRjaAotJWVuZGlmCi0gICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgYXJnKDQpICAgO1tvdXRwdXRfaGVpZ2h0XQotCi0gICAgY21wICAgICAgICAgZXNpLCBEV09SRCBQVFIgW3JheF0KLSAgICBqZSAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y0X3Nzc2UzCi0KLSAgICBtb3ZxICAgICAgICBtbTUsIE1NV09SRCBQVFIgW3JheF0gICAgICAgICA7azBfazUKLSAgICBtb3ZxICAgICAgICBtbTYsIE1NV09SRCBQVFIgW3JheCsyNTZdICAgICA7azJfazQKLSAgICBtb3ZxICAgICAgICBtbTcsIE1NV09SRCBQVFIgW3JheCsxMjhdICAgICA7azFfazMKLQotICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCi0KLSAgICBtb3YgICAgICAgICByYXgsIHJzaQotICAgIGFkZCAgICAgICAgIHJheCwgcmR4Ci0KLXZwOF9maWx0ZXJfYmxvY2sxZDRfdjZfc3NzZTNfbG9vcDoKLSAgICBtb3ZkICAgICAgICBtbTEsIERXT1JEIFBUUiBbcnNpXSAgICAgICAgICAgICAgICAgIDtBCi0gICAgbW92ZCAgICAgICAgbW0yLCBEV09SRCBQVFIgW3JzaSArIHJkeF0gICAgICAgICAgICA7QgotICAgIG1vdmQgICAgICAgIG1tMywgRFdPUkQgUFRSIFtyc2kgKyByZHggKiAyXSAgICAgICAgO0MKLSAgICBtb3ZkICAgICAgICBtbTQsIERXT1JEIFBUUiBbcmF4ICsgcmR4ICogMl0gICAgICAgIDtECi0gICAgbW92ZCAgICAgICAgbW0wLCBEV09SRCBQVFIgW3JzaSArIHJkeCAqIDRdICAgICAgICA7RQotCi0gICAgcHVucGNrbGJ3ICAgbW0yLCBtbTQgICAgICAgICAgICAgICAgICA7QiBECi0gICAgcHVucGNrbGJ3ICAgbW0zLCBtbTAgICAgICAgICAgICAgICAgICA7QyBFCi0KLSAgICBtb3ZkICAgICAgICBtbTAsIERXT1JEIFBUUiBbcmF4ICsgcmR4ICogNF0gICAgICAgIDtGCi0KLSAgICBtb3ZxICAgICAgICBtbTQsIFtHTE9CQUwocmQpXQotCi0gICAgcG1hZGR1YnN3ICAgbW0zLCBtbTYKLSAgICBwdW5wY2tsYncgICBtbTEsIG1tMCAgICAgICAgICAgICAgICAgIDtBIEYKLSAgICBwbWFkZHVic3cgICBtbTIsIG1tNwotICAgIHBtYWRkdWJzdyAgIG1tMSwgbW01Ci0gICAgYWRkICAgICAgICAgcnNpLCAgcmR4Ci0gICAgYWRkICAgICAgICAgcmF4LCAgcmR4Ci07LS0KLTstLQotICAgIHBhZGRzdyAgICAgIG1tMiwgbW0zCi0gICAgcGFkZHN3ICAgICAgbW0yLCBtbTEKLSAgICBwYWRkc3cgICAgICBtbTIsIG1tNAotICAgIHBzcmF3ICAgICAgIG1tMiwgNwotICAgIHBhY2t1c3diICAgIG1tMiwgbW0yCi0KLSAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW3JkaV0sIG1tMgotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W291dF9waXRjaF0KLSVlbHNlCi0gICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotICAgIGRlYyAgICAgICAgIHJjeAotICAgIGpueiAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDRfdjZfc3NzZTNfbG9vcAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi12cDhfZmlsdGVyX2Jsb2NrMWQ0X3Y0X3Nzc2UzOgotICAgIG1vdnEgICAgICAgIG1tNiwgTU1XT1JEIFBUUiBbcmF4KzI1Nl0gICAgIDtrMl9rNAotICAgIG1vdnEgICAgICAgIG1tNywgTU1XT1JEIFBUUiBbcmF4KzEyOF0gICAgIDtrMV9rMwotICAgIG1vdnEgICAgICAgIG1tNSwgTU1XT1JEIFBUUiBbR0xPQkFMKHJkKV0KLQotICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApICAgICAgICAgICAgIDtzcmNfcHRyCi0KLSAgICBtb3YgICAgICAgICByYXgsIHJzaQotICAgIGFkZCAgICAgICAgIHJheCwgcmR4Ci0KLXZwOF9maWx0ZXJfYmxvY2sxZDRfdjRfc3NzZTNfbG9vcDoKLSAgICBtb3ZkICAgICAgICBtbTIsIERXT1JEIFBUUiBbcnNpICsgcmR4XSAgICAgICAgICAgIDtCCi0gICAgbW92ZCAgICAgICAgbW0zLCBEV09SRCBQVFIgW3JzaSArIHJkeCAqIDJdICAgICAgICA7QwotICAgIG1vdmQgICAgICAgIG1tNCwgRFdPUkQgUFRSIFtyYXggKyByZHggKiAyXSAgICAgICAgO0QKLSAgICBtb3ZkICAgICAgICBtbTAsIERXT1JEIFBUUiBbcnNpICsgcmR4ICogNF0gICAgICAgIDtFCi0KLSAgICBwdW5wY2tsYncgICBtbTIsIG1tNCAgICAgICAgICAgICAgICAgIDtCIEQKLSAgICBwdW5wY2tsYncgICBtbTMsIG1tMCAgICAgICAgICAgICAgICAgIDtDIEUKLQotICAgIHBtYWRkdWJzdyAgIG1tMywgbW02Ci0gICAgcG1hZGR1YnN3ICAgbW0yLCBtbTcKLSAgICBhZGQgICAgICAgICByc2ksICByZHgKLSAgICBhZGQgICAgICAgICByYXgsICByZHgKLTstLQotOy0tCi0gICAgcGFkZHN3ICAgICAgbW0yLCBtbTMKLSAgICBwYWRkc3cgICAgICBtbTIsIG1tNQotICAgIHBzcmF3ICAgICAgIG1tMiwgNwotICAgIHBhY2t1c3diICAgIG1tMiwgbW0yCi0KLSAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW3JkaV0sIG1tMgotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W291dF9waXRjaF0KLSVlbHNlCi0gICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgcjgKLSVlbmRpZgotICAgIGRlYyAgICAgICAgIHJjeAotICAgIGpueiAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDRfdjRfc3NzZTNfbG9vcAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3Nzc2UzCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgaW50ICB4b2Zmc2V0LAotOyAgICBpbnQgIHlvZmZzZXQsCi07ICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi07ICAgIGludCBkc3RfcGl0Y2gKLTspCi1nbG9iYWwgc3ltKHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfc3NzZTMpCi1zeW0odnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9zc3NlMyk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICBbR0xPQkFMKHZwOF9iaWxpbmVhcl9maWx0ZXJzX3Nzc2UzKV0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygyKSAgICA7IHhvZmZzZXQKLQotICAgICAgICBjbXAgICAgICAgICByYXgsICAgICAgICAwICAgICAgICAgICAgICAgICAgIDsgc2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKLSAgICAgICAgamUgICAgICAgICAgYjE2eDE2X3NwX29ubHkKLQotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA0Ci0gICAgICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyYXggKyByY3hdICAgICAgICAgOyBIRmlsdGVyCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpICAgICAgICAgICAgICA7IGRzdF9wdHIKLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7IHNyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSAgICA7IGRzdF9waXRjaAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIFtyYXhdCi0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHlvZmZzZXQKLQotICAgICAgICBjbXAgICAgICAgICByYXgsICAgICAgICAwICAgICAgICAgICAgICAgICAgIDsgc2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCi0gICAgICAgIGplICAgICAgICAgIGIxNngxNl9mcF9vbmx5Ci0KLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNAotICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4ICsgcmN4XSAgICAgICAgIDsgVkZpbHRlcgotCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmR4KjhdCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgW3JheF0KLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgIG1vdnN4ZCAgICAgIHI4LCAgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgOyBkc3RfcGl0Y2gKLSVlbmRpZgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7IDAwIDAxIDAxIDAyIDAyIDAzIDAzIDA0IDA0IDA1IDA1IDA2IDA2IDA3IDA3IDA4Ci0gICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgIFtyc2krOF0gICAgICAgICAgICAgOyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFtyc2krOV0gICAgICAgICAgICAgOyAwOSAxMCAxMSAxMiAxMyAxNCAxNSAxNgotCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByZHhdICAgICAgICAgOyBuZXh0IGxpbmUKLQotICAgICAgICBwbWFkZHVic3cgICB4bW0zLCAgICAgICB4bW0xICAgICAgICAgICAgICAgIDsgMDAgMDIgMDQgMDYgMDggMTAgMTIgMTQKLQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgMDggMDkgMDkgMTAgMTAgMTEgMTEgMTIgMTIgMTMgMTMgMTQgMTQgMTUgMTUgMTYKLSAgICAgICAgcG1hZGR1YnN3ICAgeG1tNCwgICAgICAgeG1tMSAgICAgICAgICAgICAgICA7IDAxIDAzIDA1IDA3IDA5IDExIDEzIDE1Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTMgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTMgLz0gMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTQgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTQgLz0gMTI4Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNywgICAgICAgeG1tMwotICAgICAgICBwYWNrdXN3YiAgICB4bW03LCAgICAgICB4bW00ICAgICAgICAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEgMTIgMTMgMTQgMTUKLQotLm5leHRfcm93OgotICAgICAgICBtb3ZxICAgICAgICB4bW02LCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNiwgICAgICAgeG1tNQotICAgICAgICBtb3ZxICAgICAgICB4bW00LCAgICAgICBbcnNpKzhdICAgICAgICAgICAgIDsgMDggMDkgMTAgMTEgMTIgMTMgMTQgMTUKLQotICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICBbcnNpKzldICAgICAgICAgICAgIDsgMDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYKLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJkeF0gICAgICAgICA7IG5leHQgbGluZQotCi0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTYsICAgICAgIHhtbTEKLQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW01Ci0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTQsICAgICAgIHhtbTEKLQotICAgICAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tNiArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tNiAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tNCArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tNCAvPSAxMjgKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW02LCAgICAgICB4bW00Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTcKLQotICAgICAgICBwdW5wY2tsYncgICB4bW01LCAgICAgICB4bW02Ci0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTUsICAgICAgIHhtbTIKLQotICAgICAgICBwdW5wY2toYncgICB4bW03LCAgICAgICB4bW02Ci0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTcsICAgICAgIHhtbTIKLQotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tNSArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tNSAvPSAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tNyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW03LCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tNyAvPSAxMjgKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW01LCAgICAgICB4bW03Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgIHhtbTYKLQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIERXT1JEIFBUUiBhcmcoNSkgICAgOyBkc3RfcGl0Y2gKLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgIHI4Ci0lZW5kaWYKLQotICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3gKLSAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93Ci0KLSAgICAgICAgam1wICAgICAgICAgZG9uZQotCi1iMTZ4MTZfc3Bfb25seToKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHlvZmZzZXQKLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNAotICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4ICsgcmN4XSAgICAgICAgIDsgVkZpbHRlcgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgICAgOyBkc3RfcHRyCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgOyBzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgOyBkc3RfcGl0Y2gKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsgVkZpbHRlcgotCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmR4KjhdCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgOyBnZXQgdGhlIGZpcnN0IGhvcml6b250YWwgbGluZSBkb25lCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgIFtyc2ldICAgICAgICAgICAgICAgOyBsb2FkIHJvdyAwCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIFtyc2kgKyA4XSAgICAgICAgICAgOyBsb2FkIHJvdyAwCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICA7IG5leHQgbGluZQotLm5leHRfcm93OgotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgbG9hZCByb3cgKyAxCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTUsICAgICAgIFtyc2kgKyA4XSAgICAgICAgICAgOyBsb2FkIHJvdyArIDEKLQotICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTUKLQotICAgICAgICBwbWFkZHVic3cgICB4bW00LCAgICAgICB4bW0xCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTcsICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgOyBsb2FkIHJvdyArIDIKLQotICAgICAgICBwbWFkZHVic3cgICB4bW0yLCAgICAgICB4bW0xCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgIFtyc2kgKyByYXggKyA4XSAgICAgOyBsb2FkIHJvdyArIDIKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW03Ci0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTYKLQotICAgICAgICBwbWFkZHVic3cgICB4bW0zLCAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTQsICAgICAgIFtHTE9CQUwocmQpXQotCi0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTUsICAgICAgIHhtbTEKLSAgICAgICAgcGFkZHcgICAgICAgeG1tMiwgICAgICAgW0dMT0JBTChyZCldCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNCwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotICAgICAgICBwc3JhdyAgICAgICB4bW0yLCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNCwgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0KLQotICAgICAgICBtb3ZkcWEgICAgICBbcmRpXSwgICAgICB4bW00ICAgICAgICAgICAgICAgIDsgc3RvcmUgcm93IDAKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgW0dMT0JBTChyZCldCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotICAgICAgICBwc3JhdyAgICAgICB4bW01LCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMywgICAgICAgeG1tNQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW03Ci0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaSArIHJkeF0seG1tMyAgICAgICAgICAgICAgICA7IHN0b3JlIHJvdyAxCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyAyKnJheF0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW02Ci0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkgKyAyKnJkeF0KLQotICAgICAgICBjbXAgICAgICAgICByZGksICAgICAgICByY3gKLSAgICAgICAgam5lICAgICAgICAgLm5leHRfcm93Ci0KLSAgICAgICAgam1wICAgICAgICAgZG9uZQotCi1iMTZ4MTZfZnBfb25seToKLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JkaStyZHgqOF0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyZHgqOF0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICA7IHNyY19waXhlbHNfcGVyX2xpbmUKLQotLm5leHRfcm93OgotICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92cSAgICAgICAgeG1tNCwgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgeG1tNAotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICBbcnNpKzhdICAgICAgICAgICAgIDsgMDggMDkgMTAgMTEgMTIgMTMgMTQgMTUKLQotICAgICAgICBwbWFkZHVic3cgICB4bW0yLCAgICAgICB4bW0xCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgIFtyc2krOV0gICAgICAgICAgICAgOyAwOSAxMCAxMSAxMiAxMyAxNCAxNSAxNgotCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgOyBuZXh0IGxpbmUKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgeG1tNAotCi0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTMsICAgICAgIHhtbTEKLSAgICAgICAgbW92cSAgICAgICAgeG1tNSwgICAgICAgW3JzaV0KLQotICAgICAgICBwYWRkdyAgICAgICB4bW0yLCAgICAgICBbR0xPQkFMKHJkKV0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNywgICAgICAgW3JzaSsxXQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTYsICAgICAgIFtyc2krOF0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMiwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTcKLSAgICAgICAgbW92cSAgICAgICAgeG1tNywgICAgICAgW3JzaSs5XQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTMsICAgICAgIFtHTE9CQUwocmQpXQotICAgICAgICBwbWFkZHVic3cgICB4bW01LCAgICAgICB4bW0xCi0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW03Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMiwgICAgICAgeG1tMwotICAgICAgICBwbWFkZHVic3cgICB4bW02LCAgICAgICB4bW0xCi0KLSAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgeG1tMiAgICAgICAgICAgICAgICA7IHN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICBbR0xPQkFMKHJkKV0KLQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgcmR4XSAgICAgICAgIDsgZHN0X3BpdGNoCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTUsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICBbR0xPQkFMKHJkKV0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNiwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTUsICAgICAgIHhtbTYKLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgW3JzaSArIHJheF0gICAgICAgICA7IG5leHQgbGluZQotCi0gICAgICAgIG1vdmRxYSAgICAgIFtyZGldLCAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIHJkeF0gICAgICAgICA7IGRzdF9waXRjaAotCi0gICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeAotCi0gICAgICAgIGpuZSAgICAgICAgIC5uZXh0X3JvdwotCi1kb25lOgotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wICAgICAgICAgcmRpCi0gICAgcG9wICAgICAgICAgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotO3ZvaWQgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NzZTMKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotOyAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICBpbnQgIHhvZmZzZXQsCi07ICAgIGludCAgeW9mZnNldCwKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgICAgaW50IGRzdF9waXRjaAotOykKLWdsb2JhbCBzeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NzZTMpCi1zeW0odnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NzZTMpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBBTElHTl9TVEFDSyAxNiwgcmF4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxNDQgICAgICAgICAgICAgICAgICAgICAgICAgOyByZXNlcnZlIDE0NCBieXRlcwotCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtHTE9CQUwodnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NzZTMpXQotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICA7UmVhZCA5LWxpbmUgdW5hbGlnbmVkIGRhdGEgaW4gYW5kIHB1dCB0aGVtIG9uIHN0YWNrLiBUaGlzIGdpdmVzIGEgYmlnCi0gICAgO3BlcmZvcm1hbmNlIGJvb3N0LgotICAgICAgICBtb3ZkcXUgICAgICB4bW0wLCAgICAgICBbcnNpXQotICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmR4ICsgcmR4KjJdCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgIFtyc2krcmR4XQotICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICBbcnNpK3JkeCoyXQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICByYXgKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMywgICAgICAgW3JzaV0KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tNCwgICAgICAgW3JzaStyZHhdCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTUsICAgICAgIFtyc2krcmR4KjJdCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgIHJheAotICAgICAgICBtb3ZkcXUgICAgICB4bW02LCAgICAgICBbcnNpXQotICAgICAgICBtb3ZkcXUgICAgICB4bW03LCAgICAgICBbcnNpK3JkeF0KLQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwXSwgICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMCwgICAgICAgW3JzaStyZHgqMl0KLQotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzE2XSwgICAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArMzJdLCAgICAgICAgIHhtbTIKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCs0OF0sICAgICAgICAgeG1tMwotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzY0XSwgICAgICAgICB4bW00Ci0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArODBdLCAgICAgICAgIHhtbTUKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JzcCs5Nl0sICAgICAgICAgeG1tNgotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUiBbcnNwKzExMl0sICAgICAgICB4bW03Ci0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyc3ArMTI4XSwgICAgICAgIHhtbTAKLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDIpICAgIDsgeG9mZnNldAotICAgICAgICBjbXAgICAgICAgICByYXgsICAgICAgICAwICAgICAgICAgICAgICAgICAgIDsgc2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKLSAgICAgICAgamUgICAgICAgICAgYjh4OF9zcF9vbmx5Ci0KLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNAotICAgICAgICBhZGQgICAgICAgICByYXgsICAgICAgICByY3ggICAgICAgICAgICAgICAgIDsgSEZpbHRlcgotCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgICAgOyBkc3RfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgOyBkc3RfcGl0Y2gKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICBbcmF4XQotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgOyB5b2Zmc2V0Ci0gICAgICAgIGNtcCAgICAgICAgIHJheCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgOyBza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKLSAgICAgICAgamUgICAgICAgICAgYjh4OF9mcF9vbmx5Ci0KLSAgICAgICAgc2hsICAgICAgICAgcmF4LCAgICAgICAgNAotICAgICAgICBsZWEgICAgICAgICByYXgsICAgICAgICBbcmF4ICsgcmN4XSAgICAgICAgIDsgVkZpbHRlcgotCi0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgW3JheF0KLQotICAgICAgICA7IGdldCB0aGUgZmlyc3QgaG9yaXpvbnRhbCBsaW5lIGRvbmUKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgW3JzcF0gICAgICAgICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDEwIDExIDEyIDEzIDE0IDE1Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNSB4eAotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDEKLSAgICAgICAgbGVhICAgICAgICAgcnNwLCAgICAgICAgW3JzcCArIDE2XSAgICAgICAgICA7IG5leHQgbGluZQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAwMCAwMSAwMSAwMiAwMiAwMyAwMyAwNCAwNCAwNSAwNSAwNiAwNiAwNyAwNyAwOAotICAgICAgICBwbWFkZHVic3cgICB4bW0zLCAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgMDAgMDIgMDQgMDYgMDggMTAgMTIgMTQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0zLCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tMyArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW0zLCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tMyAvPSAxMjgKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW0zCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTcsICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQotCi0ubmV4dF9yb3c6Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFtyc3BdICAgICAgICAgICAgICAgOyAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNQotICAgICAgICBsZWEgICAgICAgICByc3AsICAgICAgICBbcnNwICsgMTZdICAgICAgICAgIDsgbmV4dCBsaW5lCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNgotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTUsICAgICAgIDEKLQotICAgICAgICBwdW5wY2tsYncgICB4bW02LCAgICAgICB4bW01Ci0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTYsICAgICAgIHhtbTAKLQotICAgICAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICBbR0xPQkFMKHJkKV0gICAgICAgIDsgeG1tNiArPSByb3VuZCB2YWx1ZQotICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICBWUDhfRklMVEVSX1NISUZUICAgIDsgeG1tNiAvPSAxMjgKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW02LCAgICAgICB4bW02Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNywgICAgICAgeG1tNgotICAgICAgICBwbWFkZHVic3cgICB4bW03LCAgICAgICB4bW0xCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgW0dMT0JBTChyZCldICAgICAgICA7IHhtbTcgKz0gcm91bmQgdmFsdWUKLSAgICAgICAgcHNyYXcgICAgICAgeG1tNywgICAgICAgVlA4X0ZJTFRFUl9TSElGVCAgICA7IHhtbTcgLz0gMTI4Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNywgICAgICAgeG1tNwotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIHJkeF0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICB4bW02Ci0KLSAgICAgICAgY21wICAgICAgICAgcmRpLCAgICAgICAgcmN4Ci0gICAgICAgIGpuZSAgICAgICAgIC5uZXh0X3JvdwotCi0gICAgICAgIGptcCAgICAgICAgIGRvbmU4eDgKLQotYjh4OF9zcF9vbmx5OgotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgIDsgeW9mZnNldAotICAgICAgICBzaGwgICAgICAgICByYXgsICAgICAgICA0Ci0gICAgICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgIFtyYXggKyByY3hdICAgICAgICAgOyBWRmlsdGVyCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDQpIDtkc3RfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoNSkgICAgOyBkc3RfcGl0Y2gKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsgVkZpbHRlcgotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyc3BdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArMTZdCi0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JzcCszMl0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgeG1tMgotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArNDhdCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgIHhtbTMKLQotICAgICAgICBtb3ZxICAgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcnNwKzY0XQotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICB4bW00Ci0KLSAgICAgICAgbW92cSAgICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgW3JzcCs4MF0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tNCwgICAgICAgeG1tNQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTcsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArOTZdCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTYKLQotICAgICAgICBwbWFkZHVic3cgICB4bW0xLCAgICAgICB4bW0wCi0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTIsICAgICAgIHhtbTAKLQotICAgICAgICBwbWFkZHVic3cgICB4bW0zLCAgICAgICB4bW0wCi0gICAgICAgIHBtYWRkdWJzdyAgIHhtbTQsICAgICAgIHhtbTAKLQotICAgICAgICBwbWFkZHVic3cgICB4bW01LCAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTYsICAgICAgIHhtbTcKLQotICAgICAgICBwbWFkZHVic3cgICB4bW02LCAgICAgICB4bW0wCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIFtHTE9CQUwocmQpXQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgIFtHTE9CQUwocmQpXQotICAgICAgICBwc3JhdyAgICAgICB4bW0xLCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICBbR0xPQkFMKHJkKV0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tMywgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTUsICAgICAgIFtHTE9CQUwocmQpXQotICAgICAgICBwc3JhdyAgICAgICB4bW00LCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNiwgICAgICAgW0dMT0JBTChyZCldCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTUsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBwc3JhdyAgICAgICB4bW02LCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTEKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW0yLCAgICAgICB4bW0yCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTEKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW0zCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmR4XSwgIHhtbTIKLQotICAgICAgICBwYWNrdXN3YiAgICB4bW00LCAgICAgICB4bW00Ci0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArMTEyXQotCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgIFtyZGkgKyAyKnJkeF0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3JzcCsxMjhdCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNSwgICAgICAgeG1tNQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICB4bW0zCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNiwgICAgICAgeG1tNgotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JkeF0sICB4bW00Ci0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIDIqcmR4XQotICAgICAgICBwdW5wY2tsYncgICB4bW03LCAgICAgICB4bW0xCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgeG1tNQotICAgICAgICBwbWFkZHVic3cgICB4bW03LCAgICAgICB4bW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JkaStyZHhdLCAgeG1tNgotICAgICAgICBwdW5wY2tsYncgICB4bW0xLCAgICAgICB4bW0yCi0KLSAgICAgICAgcG1hZGR1YnN3ICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICBbR0xPQkFMKHJkKV0KLQotICAgICAgICBwc3JhdyAgICAgICB4bW03LCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIFtHTE9CQUwocmQpXQotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTEsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNywgICAgICAgeG1tNwotCi0gICAgICAgIHBhY2t1c3diICAgIHhtbTEsICAgICAgIHhtbTEKLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIDIqcmR4XQotCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGldLCAgICAgIHhtbTcKLQotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JkeF0sICB4bW0xCi0gICAgICAgIGxlYSAgICAgICAgIHJzcCwgICAgICAgIFtyc3AgKyAxNDRdCi0KLSAgICAgICAgam1wICAgICAgICAgZG9uZTh4OAotCi1iOHg4X2ZwX29ubHk6Ci0gICAgICAgIGxlYSAgICAgICAgIHJjeCwgICAgICAgIFtyZGkrcmR4KjhdCi0KLS5uZXh0X3JvdzoKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JzcF0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JzcCsxNl0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtyc3ArMzJdCi0KLSAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbcnNwKzQ4XQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTMKLSAgICAgICAgcHNybGRxICAgICAgeG1tNCwgICAgICAgMQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIHhtbTUKLSAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgMQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgIHhtbTIKLSAgICAgICAgcG1hZGR1YnN3ICAgeG1tMSwgICAgICAgeG1tMAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgIHhtbTQKLSAgICAgICAgcG1hZGR1YnN3ICAgeG1tMywgICAgICAgeG1tMAotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTUsICAgICAgIHhtbTYKLSAgICAgICAgcG1hZGR1YnN3ICAgeG1tNSwgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTcKLSAgICAgICAgcHNybGRxICAgICAgeG1tMiwgICAgICAgMQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTcsICAgICAgIHhtbTIKLSAgICAgICAgcG1hZGR1YnN3ICAgeG1tNywgICAgICAgeG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTEsICAgICAgIFtHTE9CQUwocmQpXQotICAgICAgICBwc3JhdyAgICAgICB4bW0xLCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMywgICAgICAgW0dMT0JBTChyZCldCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTMsICAgICAgIFZQOF9GSUxURVJfU0hJRlQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICBbR0xPQkFMKHJkKV0KLSAgICAgICAgcHNyYXcgICAgICAgeG1tNSwgICAgICAgVlA4X0ZJTFRFUl9TSElGVAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgIFtHTE9CQUwocmQpXQotICAgICAgICBwc3JhdyAgICAgICB4bW03LCAgICAgICBWUDhfRklMVEVSX1NISUZUCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tMSwgICAgICAgeG1tMQotICAgICAgICBwYWNrdXN3YiAgICB4bW0zLCAgICAgICB4bW0zCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNSwgICAgICAgeG1tNQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICB4bW0xCi0KLSAgICAgICAgcGFja3Vzd2IgICAgeG1tNywgICAgICAgeG1tNwotICAgICAgICBtb3ZxICAgICAgICBbcmRpK3JkeF0sICB4bW0zCi0KLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgW3JkaSArIDIqcmR4XQotICAgICAgICBtb3ZxICAgICAgICBbcmRpXSwgICAgICB4bW01Ci0KLSAgICAgICAgbGVhICAgICAgICAgcnNwLCAgICAgICAgW3JzcCArIDQqMTZdCi0gICAgICAgIG1vdnEgICAgICAgIFtyZGkrcmR4XSwgIHhtbTcKLQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICBbcmRpICsgMipyZHhdCi0gICAgICAgIGNtcCAgICAgICAgIHJkaSwgICAgICAgIHJjeAotCi0gICAgICAgIGpuZSAgICAgICAgIC5uZXh0X3JvdwotCi0gICAgICAgIGxlYSAgICAgICAgIHJzcCwgICAgICAgIFtyc3AgKyAxNl0KLQotZG9uZTh4ODoKLSAgICA7YWRkIHJzcCwgMTQ0Ci0gICAgcG9wICAgICAgICAgcnNwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXNodWYxYjoKLSAgICBkYiAwLCA1LCAxLCA2LCAyLCA3LCAzLCA4LCA0LCA5LCA1LCAxMCwgNiwgMTEsIDcsIDEyCi1zaHVmMmI6Ci0gICAgZGIgMiwgNCwgMywgNSwgNCwgNiwgNSwgNywgNiwgOCwgNywgOSwgOCwgMTAsIDksIDExCi1zaHVmM2I6Ci0gICAgZGIgMSwgMywgMiwgNCwgMywgNSwgNCwgNiwgNSwgNywgNiwgOCwgNywgOSwgOCwgMTAKLQotYWxpZ24gMTYKLXNodWYyYmZyb20xOgotICAgIGRiICA0LCA4LCA2LCAxLCA4LCAzLCAxLCA1LCAzLCA3LCA1LCA5LCA3LDExLCA5LDEzCi1hbGlnbiAxNgotc2h1ZjNiZnJvbTE6Ci0gICAgZGIgIDIsIDYsIDQsIDgsIDYsIDEsIDgsIDMsIDEsIDUsIDMsIDcsIDUsIDksIDcsMTEKLQotYWxpZ24gMTYKLXJkOgotICAgIHRpbWVzIDggZHcgMHg0MAotCi1hbGlnbiAxNgotazBfazU6Ci0gICAgdGltZXMgOCBkYiAwLCAwICAgICAgICAgICAgIDtwbGFjZWhvbGRlcgotICAgIHRpbWVzIDggZGIgMCwgMAotICAgIHRpbWVzIDggZGIgMiwgMQotICAgIHRpbWVzIDggZGIgMCwgMAotICAgIHRpbWVzIDggZGIgMywgMwotICAgIHRpbWVzIDggZGIgMCwgMAotICAgIHRpbWVzIDggZGIgMSwgMgotICAgIHRpbWVzIDggZGIgMCwgMAotazFfazM6Ci0gICAgdGltZXMgOCBkYiAgMCwgICAgMCAgICAgICAgIDtwbGFjZWhvbGRlcgotICAgIHRpbWVzIDggZGIgIC02LCAgMTIKLSAgICB0aW1lcyA4IGRiIC0xMSwgIDM2Ci0gICAgdGltZXMgOCBkYiAgLTksICA1MAotICAgIHRpbWVzIDggZGIgLTE2LCAgNzcKLSAgICB0aW1lcyA4IGRiICAtNiwgIDkzCi0gICAgdGltZXMgOCBkYiAgLTgsIDEwOAotICAgIHRpbWVzIDggZGIgIC0xLCAxMjMKLWsyX2s0OgotICAgIHRpbWVzIDggZGIgMTI4LCAgICAwICAgICAgICA7cGxhY2Vob2xkZXIKLSAgICB0aW1lcyA4IGRiIDEyMywgICAtMQotICAgIHRpbWVzIDggZGIgMTA4LCAgIC04Ci0gICAgdGltZXMgOCBkYiAgOTMsICAgLTYKLSAgICB0aW1lcyA4IGRiICA3NywgIC0xNgotICAgIHRpbWVzIDggZGIgIDUwLCAgIC05Ci0gICAgdGltZXMgOCBkYiAgMzYsICAtMTEKLSAgICB0aW1lcyA4IGRiICAxMiwgICAtNgotYWxpZ24gMTYKLXZwOF9iaWxpbmVhcl9maWx0ZXJzX3Nzc2UzOgotICAgIHRpbWVzIDggZGIgMTI4LCAwCi0gICAgdGltZXMgOCBkYiAxMTIsIDE2Ci0gICAgdGltZXMgOCBkYiA5NiwgIDMyCi0gICAgdGltZXMgOCBkYiA4MCwgIDQ4Ci0gICAgdGltZXMgOCBkYiA2NCwgIDY0Ci0gICAgdGltZXMgOCBkYiA0OCwgIDgwCi0gICAgdGltZXMgOCBkYiAzMiwgIDk2Ci0gICAgdGltZXMgOCBkYiAxNiwgIDExMgotCmRpZmYgLS1naXQgYS92cDgvY29tbW9uL3g4Ni9zdWJwaXhlbF94ODYuaCBiL3ZwOC9jb21tb24veDg2L3N1YnBpeGVsX3g4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk5MWNjLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L3N1YnBpeGVsX3g4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIFNVQlBJWEVMX1g4Nl9ICi0jZGVmaW5lIFNVQlBJWEVMX1g4Nl9ICi0KLS8qIE5vdGU6Ci0gKgotICogVGhpcyBwbGF0Zm9ybSBpcyBjb21tb25seSBidWlsdCBmb3IgcnVudGltZSBDUFUgZGV0ZWN0aW9uLiBJZiB5b3UgbW9kaWZ5Ci0gKiBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGFsc28gdXBkYXRlCi0gKiB0aGVtIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqLwotCi0jaWYgSEFWRV9NTVgKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4OF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4NF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDR4NF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X2JpbGluZWFyX3ByZWRpY3Q0eDRfbW14KTsKLQotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXAxNngxNgotI2RlZmluZSB2cDhfc3VicGl4X3NpeHRhcDE2eDE2IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X21teAotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwOHg4Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwOHg4IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9tbXgKLQotI3VuZGVmICB2cDhfc3VicGl4X3NpeHRhcDh4NAotI2RlZmluZSB2cDhfc3VicGl4X3NpeHRhcDh4NCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfbW14Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA0eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA0eDQgdnA4X3NpeHRhcF9wcmVkaWN0NHg0X21teAotCi0jdW5kZWYgIHZwOF9zdWJwaXhfYmlsaW5lYXIxNngxNgotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyMTZ4MTYgdnA4X2JpbGluZWFyX3ByZWRpY3QxNngxNl9tbXgKLQotI3VuZGVmICB2cDhfc3VicGl4X2JpbGluZWFyOHg4Ci0jZGVmaW5lIHZwOF9zdWJwaXhfYmlsaW5lYXI4eDggdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbW14Ci0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjh4NAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyOHg0IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg0X21teAotCi0jdW5kZWYgIHZwOF9zdWJwaXhfYmlsaW5lYXI0eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9iaWxpbmVhcjR4NCB2cDhfYmlsaW5lYXJfcHJlZGljdDR4NF9tbXgKLQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgSEFWRV9TU0UyCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NlMik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0OHg4X3NzZTIpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4NF9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3NzZTIpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X3NzZTIpOwotCi0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfc3VicGl4X3NpeHRhcDE2eDE2Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwMTZ4MTYgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NlMgotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwOHg4Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwOHg4IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9zc2UyCi0KLSN1bmRlZiAgdnA4X3N1YnBpeF9zaXh0YXA4eDQKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXA4eDQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X3NzZTIKLQotI3VuZGVmICB2cDhfc3VicGl4X2JpbGluZWFyMTZ4MTYKLSNkZWZpbmUgdnA4X3N1YnBpeF9iaWxpbmVhcjE2eDE2IHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfc3NlMgotCi0jdW5kZWYgIHZwOF9zdWJwaXhfYmlsaW5lYXI4eDgKLSNkZWZpbmUgdnA4X3N1YnBpeF9iaWxpbmVhcjh4OCB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9zc2UyCi0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBIQVZFX1NTU0UzCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NzZTMpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9zaXh0YXBfcHJlZGljdDh4OF9zc3NlMyk7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeGVsX3ByZWRpY3QodnA4X3NpeHRhcF9wcmVkaWN0OHg0X3Nzc2UzKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfc3NzZTMpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0MTZ4MTZfc3NzZTMpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXhlbF9wcmVkaWN0KHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X3Nzc2UzKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwMTZ4MTYKLSNkZWZpbmUgdnA4X3N1YnBpeF9zaXh0YXAxNngxNiB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9zc3NlMwotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwOHg4Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwOHg4IHZwOF9zaXh0YXBfcHJlZGljdDh4OF9zc3NlMwotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwOHg0Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwOHg0IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9zc3NlMwotCi0jdW5kZWYgIHZwOF9zdWJwaXhfc2l4dGFwNHg0Ci0jZGVmaW5lIHZwOF9zdWJwaXhfc2l4dGFwNHg0IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9zc3NlMwotCi0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjE2eDE2Ci0jZGVmaW5lIHZwOF9zdWJwaXhfYmlsaW5lYXIxNngxNiB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3Nzc2UzCi0KLSN1bmRlZiAgdnA4X3N1YnBpeF9iaWxpbmVhcjh4OAotI2RlZmluZSB2cDhfc3VicGl4X2JpbGluZWFyOHg4IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X3Nzc2UzCi0KLSNlbmRpZgotI2VuZGlmCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9jb21tb24veDg2L3ZwOF9hc21fc3R1YnMuYyBiL3ZwOC9jb21tb24veDg2L3ZwOF9hc21fc3R1YnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwNDAwNi4uMDAwMDAwMAotLS0gYS92cDgvY29tbW9uL3g4Ni92cDhfYXNtX3N0dWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vc3VicGl4ZWwuaCIKLQotZXh0ZXJuIGNvbnN0IHNob3J0IHZwOF9zaXhfdGFwX21teFs4XVs2KjhdOwotZXh0ZXJuIGNvbnN0IHNob3J0IHZwOF9iaWxpbmVhcl9maWx0ZXJzX21teFs4XVsyKjhdOwotCi1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14Ci0oCi0gICAgdW5zaWduZWQgY2hhciAgICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIHNob3J0ICAqb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoLAotICAgIGNvbnN0IHNob3J0ICAgICAgKnZwOF9maWx0ZXIKLSk7Ci1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWRjX3Y2X21teAotKAotICAgIHVuc2lnbmVkIHNob3J0ICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAotICAgIGludCAgICAgICAgICAgICBvdXRwdXRfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50ICAgIHBpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoLAotICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi0pOwotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICAgIHBpeGVsX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF93aWR0aCwKLSAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgotKTsKLWV4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTIKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgICAgcGl4ZWxfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3dpZHRoLAotICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi0pOwotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc2UyCi0oCi0gICAgdW5zaWduZWQgc2hvcnQgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLSAgICBpbnQgZHN0X3B0aWNoLAotICAgIHVuc2lnbmVkIGludCBwaXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKLSAgICBjb25zdCBzaG9ydCAgICAqdnA4X2ZpbHRlcgotKTsKLWV4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3NzZTIKLSgKLSAgICB1bnNpZ25lZCBzaG9ydCAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAotICAgIGludCBkc3RfcHRpY2gsCi0gICAgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi0pOwotZXh0ZXJuIHZvaWQgdnA4X3VucGFja19ibG9jazFkMTZfaDZfc3NlMgotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIHNob3J0ICpvdXRwdXRfcHRyLAotICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAotICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfd2lkdGgKLSk7Ci1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMgotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAotICAgIGludCBkc3RfcHRpY2gsCi0gICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi0gICAgY29uc3Qgc2hvcnQgICAgKnZwOF9maWx0ZXIKLSk7Ci1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQxNl9oNl9vbmx5X3NzZTIKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKLSAgICBpbnQgZHN0X3B0aWNoLAotICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAotICAgIGNvbnN0IHNob3J0ICAgICp2cDhfZmlsdGVyCi0pOwotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9vbmx5X3NzZTIKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwKLSAgICBpbnQgZHN0X3B0aWNoLAotICAgIHVuc2lnbmVkIGludCAgIG91dHB1dF9oZWlnaHQsCi0gICAgY29uc3Qgc2hvcnQgICAqdnA4X2ZpbHRlcgotKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4ZWxfcHJlZGljdCh2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgpOwotCi0KLSNpZiBIQVZFX01NWAotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q0eDRfbW14Ci0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXRjaAotKQotewotICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMTYqMTYpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0gICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YTIsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDksIDgsIEhGaWx0ZXIpOwotICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgoRkRhdGEyICsgOCwgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCA0ICwgNCwgNCwgVkZpbHRlcik7Ci0KLX0KLQotCi12b2lkIHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl0Y2gKLSkKLXsKLQotICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMjQqMjQpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLQotICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLCAqVkZpbHRlcjsKLQotCi0gICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKLQotICAgIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksICAgIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAyMSwgMzIsIEhGaWx0ZXIpOwotICAgIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSkgKyA0LCAgRkRhdGEyICsgNCwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMjEsIDMyLCBIRmlsdGVyKTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMWRfaDZfbW14KHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpICsgOCwgIEZEYXRhMiArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDIxLCAzMiwgSEZpbHRlcik7Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSArIDEyLCBGRGF0YTIgKyAxMiwgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMjEsIDMyLCBIRmlsdGVyKTsKLQotICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgoRkRhdGEyICsgMzIsIGRzdF9wdHIsICAgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgMTYsIFZGaWx0ZXIpOwotICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDM2LCBkc3RfcHRyICsgNCwgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgMTYsIFZGaWx0ZXIpOwotICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDQwLCBkc3RfcHRyICsgOCwgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgMTYsIFZGaWx0ZXIpOwotICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDQ0LCBkc3RfcHRyICsgMTIsIGRzdF9waXRjaCwgMzIsIDE2ICwgMTYsIDE2LCBWRmlsdGVyKTsKLQotfQotCi0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl0Y2gKLSkKLXsKLQotICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMjU2KTsgICAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLQotICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLCAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeG9mZnNldF07Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgICAgRkRhdGEyLCAgIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDEzLCAxNiwgSEZpbHRlcik7Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSArIDQsICBGRGF0YTIgKyA0LCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAxMywgMTYsIEhGaWx0ZXIpOwotCi0gICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMWRjX3Y2X21teChGRGF0YTIgKyAxNiwgZHN0X3B0ciwgICBkc3RfcGl0Y2gsIDE2LCA4ICwgOCwgOCwgVkZpbHRlcik7Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkY192Nl9tbXgoRkRhdGEyICsgMjAsIGRzdF9wdHIgKyA0LCBkc3RfcGl0Y2gsIDE2LCA4ICwgOCwgOCwgVkZpbHRlcik7Ci0KLX0KLQotCi12b2lkIHZwOF9zaXh0YXBfcHJlZGljdDh4NF9tbXgKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0KLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIHNob3J0LCBGRGF0YTIsIDI1Nik7ICAgIC8qIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nICovCi0KLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0KLSAgICBIRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3hvZmZzZXRdOwotICAgIHZwOF9maWx0ZXJfYmxvY2sxZF9oNl9tbXgoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksICAgIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA5LCAxNiwgSEZpbHRlcik7Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazFkX2g2X21teChzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSArIDQsICBGRGF0YTIgKyA0LCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA5LCAxNiwgSEZpbHRlcik7Ci0KLSAgICBWRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3lvZmZzZXRdOwotICAgIHZwOF9maWx0ZXJfYmxvY2sxZGNfdjZfbW14KEZEYXRhMiArIDE2LCBkc3RfcHRyLCAgIGRzdF9waXRjaCwgMTYsIDggLCA0LCA4LCBWRmlsdGVyKTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMWRjX3Y2X21teChGRGF0YTIgKyAyMCwgZHN0X3B0ciArIDQsIGRzdF9waXRjaCwgMTYsIDggLCA0LCA4LCBWRmlsdGVyKTsKLQotfQotCi0KLQotdm9pZCB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl0Y2gKLSkKLXsKLSAgICB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgoc3JjX3B0ciwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCBkc3RfcHRyLCAgIGRzdF9waXRjaCk7Ci0gICAgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbW14KHNyY19wdHIgKyA4LCBzcmNfcGl4ZWxzX3Blcl9saW5lLCB4b2Zmc2V0LCB5b2Zmc2V0LCBkc3RfcHRyICsgOCwgZHN0X3BpdGNoKTsKLSAgICB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXgoc3JjX3B0ciArIDggKiBzcmNfcGl4ZWxzX3Blcl9saW5lLCAgIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIgKyBkc3RfcGl0Y2ggKiA4LCAgIGRzdF9waXRjaCk7Ci0gICAgdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfbW14KHNyY19wdHIgKyA4ICogc3JjX3BpeGVsc19wZXJfbGluZSArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIgKyBkc3RfcGl0Y2ggKiA4ICsgOCwgZHN0X3BpdGNoKTsKLX0KLSNlbmRpZgotCi0KLSNpZiBIQVZFX1NTRTIKLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NlMgotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl0Y2gKLQotKQotewotICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgc2hvcnQsIEZEYXRhMiwgMjQqMjQpOyAgICAvKiBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZyAqLwotCi0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsICpWRmlsdGVyOwotCi0gICAgaWYgKHhvZmZzZXQpCi0gICAgewotICAgICAgICBpZiAoeW9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X3NzZTIoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCAyMSwgMzIsIEhGaWx0ZXIpOwotICAgICAgICAgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3NzZTIoRkRhdGEyICsgMzIsIGRzdF9wdHIsICAgZHN0X3BpdGNoLCAzMiwgMTYgLCAxNiwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0LXBhc3Mgb25seSAqLwotICAgICAgICAgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X2g2X29ubHlfc3NlMihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCBIRmlsdGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTZWNvbmQtcGFzcyBvbmx5ICovCi0gICAgICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07Ci0gICAgICAgIHZwOF91bnBhY2tfYmxvY2sxZDE2X2g2X3NzZTIoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIEZEYXRhMiwgICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAyMSwgMzIpOwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc2UyKEZEYXRhMiArIDMyLCBkc3RfcHRyLCAgIGRzdF9waXRjaCwgMzIsIDE2ICwgMTYsIGRzdF9waXRjaCwgVkZpbHRlcik7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg4X3NzZTIKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0gICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBzaG9ydCwgRkRhdGEyLCAyNTYpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0KLSAgICBpZiAoeG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGlmICh5b2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBIRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3hvZmZzZXRdOwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YTIsICAgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgMTMsIDE2LCBIRmlsdGVyKTsKLSAgICAgICAgICAgIFZGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeW9mZnNldF07Ci0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X3NzZTIoRkRhdGEyICsgMTYsIGRzdF9wdHIsICAgZHN0X3BpdGNoLCAxNiwgOCAsIDgsIGRzdF9waXRjaCwgVkZpbHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdC1wYXNzIG9ubHkgKi8KLSAgICAgICAgICAgIEhGaWx0ZXIgPSB2cDhfc2l4X3RhcF9tbXhbeG9mZnNldF07Ci0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X29ubHlfc3NlMihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIEhGaWx0ZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNlY29uZC1wYXNzIG9ubHkgKi8KLSAgICAgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9vbmx5X3NzZTIoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCwgOCwgVkZpbHRlcik7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0OHg0X3NzZTIKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0gICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBzaG9ydCwgRkRhdGEyLCAyNTYpOyAgLyogVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcgKi8KLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0KLSAgICBpZiAoeG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGlmICh5b2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBIRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3hvZmZzZXRdOwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc2UyKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBGRGF0YTIsICAgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgMTYsIEhGaWx0ZXIpOwotICAgICAgICAgICAgVkZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt5b2Zmc2V0XTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NlMihGRGF0YTIgKyAxNiwgZHN0X3B0ciwgICBkc3RfcGl0Y2gsIDE2LCA4ICwgNCwgZHN0X3BpdGNoLCBWRmlsdGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0LXBhc3Mgb25seSAqLwotICAgICAgICAgICAgSEZpbHRlciA9IHZwOF9zaXhfdGFwX21teFt4b2Zmc2V0XTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfb25seV9zc2UyKHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgSEZpbHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2Vjb25kLXBhc3Mgb25seSAqLwotICAgICAgICBWRmlsdGVyID0gdnA4X3NpeF90YXBfbW14W3lvZmZzZXRdOwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X3Y2X29ubHlfc3NlMihzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCBWRmlsdGVyKTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0jaWYgSEFWRV9TU1NFMwotCi1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzCi0oCi0gICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgY2hhciAgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9waXRjaCwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgICAgdnA4X2ZpbHRlcl9pbmRleAotKTsKLQotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBjaGFyICAqb3V0cHV0X3B0ciwKLSAgICB1bnNpZ25lZCBpbnQgICAgb3V0cHV0X3BpdGNoLAotICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfaGVpZ2h0LAotICAgIHVuc2lnbmVkIGludCAgICB2cDhfZmlsdGVyX2luZGV4Ci0pOwotCi1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgc3JjX3BpdGNoLAotICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAotICAgIHVuc2lnbmVkIGludCAgIG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50ICAgdnA4X2ZpbHRlcl9pbmRleAotKTsKLQotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgc3JjX3BpdGNoLAotICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50ICAgb3V0X3BpdGNoLAotICAgIHVuc2lnbmVkIGludCAgIG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50ICAgdnA4X2ZpbHRlcl9pbmRleAotKTsKLQotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazFkNF9oNl9zc3NlMwotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGludCAgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAotICAgIHVuc2lnbmVkIGludCAgICBvdXRwdXRfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50ICAgIG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50ICAgIHZwOF9maWx0ZXJfaW5kZXgKLSk7Ci0KLWV4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2sxZDRfdjZfc3NzZTMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGludCAgIHNyY19waXRjaCwKLSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLAotICAgIHVuc2lnbmVkIGludCAgIG91dF9waXRjaCwKLSAgICB1bnNpZ25lZCBpbnQgICBvdXRwdXRfaGVpZ2h0LAotICAgIHVuc2lnbmVkIGludCAgIHZwOF9maWx0ZXJfaW5kZXgKLSk7Ci0KLXZvaWQgdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NzZTMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0KLSkKLXsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIGNoYXIsIEZEYXRhMiwgMjQqMjQpOwotCi0gICAgaWYgKHhvZmZzZXQpCi0gICAgewotICAgICAgICBpZiAoeW9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIHNyY19waXhlbHNfcGVyX2xpbmUsIEZEYXRhMiwgMTYsIDIxLCB4b2Zmc2V0KTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDE2X3Y2X3Nzc2UzKEZEYXRhMiAsIDE2LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDE2LCB5b2Zmc2V0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0LXBhc3Mgb25seSAqLwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkMTZfaDZfc3NzZTMoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoLCAxNiwgeG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2Vjb25kLXBhc3Mgb25seSAqLwotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQxNl92Nl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSAsIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCwgMTYsIHlvZmZzZXQpOwotICAgIH0KLX0KLQotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfc3NzZTMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0gICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBjaGFyLCBGRGF0YTIsIDI1Nik7Ci0KLSAgICBpZiAoeG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGlmICh5b2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBGRGF0YTIsIDgsIDEzLCB4b2Zmc2V0KTsKLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTMoRkRhdGEyLCA4LCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIHlvZmZzZXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF9oNl9zc3NlMyhzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDgsIHhvZmZzZXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNlY29uZC1wYXNzIG9ubHkgKi8KLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoLCA4LCB5b2Zmc2V0KTsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfc3NzZTMKLSgKLSAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpdGNoCi0pCi17Ci0gICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBjaGFyLCBGRGF0YTIsIDI1Nik7Ci0KLSAgICBpZiAoeG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGlmICh5b2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMWQ4X2g2X3Nzc2UzKHNyY19wdHIgLSAoMiAqIHNyY19waXhlbHNfcGVyX2xpbmUpLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBGRGF0YTIsIDgsIDksIHhvZmZzZXQpOwotICAgICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkOF92Nl9zc3NlMyhGRGF0YTIsIDgsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeW9mZnNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdC1wYXNzIG9ubHkgKi8KLSAgICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfaDZfc3NzZTMoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCB4b2Zmc2V0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTZWNvbmQtcGFzcyBvbmx5ICovCi0gICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDhfdjZfc3NzZTMoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIHNyY19waXhlbHNfcGVyX2xpbmUsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeW9mZnNldCk7Ci0gICAgfQotfQotCi12b2lkIHZwOF9zaXh0YXBfcHJlZGljdDR4NF9zc3NlMwotKAotICAgIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl0Y2gKLSkKLXsKLSAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBjaGFyLCBGRGF0YTIsIDQqOSk7Ci0KLSAgaWYgKHhvZmZzZXQpCi0gIHsKLSAgICAgIGlmICh5b2Zmc2V0KQotICAgICAgewotICAgICAgICAgIHZwOF9maWx0ZXJfYmxvY2sxZDRfaDZfc3NzZTMoc3JjX3B0ciAtICgyICogc3JjX3BpeGVsc19wZXJfbGluZSksIHNyY19waXhlbHNfcGVyX2xpbmUsIEZEYXRhMiwgNCwgOSwgeG9mZnNldCk7Ci0gICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkNF92Nl9zc3NlMyhGRGF0YTIsIDQsIGRzdF9wdHIsIGRzdF9waXRjaCwgNCwgeW9mZnNldCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkNF9oNl9zc3NlMyhzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl0Y2gsIDQsIHhvZmZzZXQpOwotICAgICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgICAgdnA4X2ZpbHRlcl9ibG9jazFkNF92Nl9zc3NlMyhzcmNfcHRyIC0gKDIgKiBzcmNfcGl4ZWxzX3Blcl9saW5lKSwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpdGNoLCA0LCB5b2Zmc2V0KTsKLSAgfQotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2NvbW1vbi94ODYveDg2X3N5c3RlbWRlcGVuZGVudC5jIGIvdnA4L2NvbW1vbi94ODYveDg2X3N5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODljMDdhLi4wMDAwMDAwCi0tLSBhL3ZwOC9jb21tb24veDg2L3g4Nl9zeXN0ZW1kZXBlbmRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMveDg2LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9nX2NvbW1vbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vc3VicGl4ZWwuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9pZGN0LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9wcmFnbWFzLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4Y19pbnQuaCIKLQotdm9pZCB2cDhfYXJjaF94ODZfY29tbW9uX2luaXQoVlA4X0NPTU1PTiAqY3R4KQotewotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBWUDhfQ09NTU9OX1JUQ0QgKnJ0Y2QgPSAmY3R4LT5ydGNkOwotICAgIGludCBmbGFncyA9IHg4Nl9zaW1kX2NhcHMoKTsKLSAgICBpbnQgbW14X2VuYWJsZWQgPSBmbGFncyAmIEhBU19NTVg7Ci0gICAgaW50IHhtbV9lbmFibGVkID0gZmxhZ3MgJiBIQVNfU1NFOwotICAgIGludCB3bXRfZW5hYmxlZCA9IGZsYWdzICYgSEFTX1NTRTI7Ci0gICAgaW50IFNTU0UzRW5hYmxlZCA9IGZsYWdzICYgSEFTX1NTU0UzOwotCi0gICAgLyogTm90ZToKLSAgICAgKgotICAgICAqIFRoaXMgcGxhdGZvcm0gY2FuIGJlIGJ1aWx0IHdpdGhvdXQgcnVudGltZSBDUFUgZGV0ZWN0aW9uIGFzIHdlbGwuIElmCi0gICAgICogeW91IG1vZGlmeSBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlCi0gICAgICogdG8gYWxzbyB1cGRhdGUgdGhlbSBpbiBzdGF0aWMgbWFwaW5ncyAoPGFyY2g+L2ZpbGVuYW1lXzxhcmNoPi5oKQotICAgICAqLwotCi0gICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBmdW5jdGlvbnMgd2l0aCBmYXN0ZXN0IG9uZXMgZm9yIHRoaXMgQ1BVLiAqLwotI2lmIEhBVkVfTU1YCi0KLSAgICBpZiAobW14X2VuYWJsZWQpCi0gICAgewotICAgICAgICBydGNkLT5pZGN0LmlkY3QxICAgICAgICA9IHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfbW14OwotICAgICAgICBydGNkLT5pZGN0LmlkY3QxNiAgICAgICA9IHZwOF9zaG9ydF9pZGN0NHg0bGxtX21teDsKLSAgICAgICAgcnRjZC0+aWRjdC5pZGN0MV9zY2FsYXJfYWRkID0gdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14OwotICAgICAgICBydGNkLT5pZGN0Lml3YWxzaDE2ICAgICA9IHZwOF9zaG9ydF9pbnZfd2Fsc2g0eDRfbW14OwotICAgICAgICBydGNkLT5pZGN0Lml3YWxzaDEgICAgID0gdnA4X3Nob3J0X2ludl93YWxzaDR4NF8xX21teDsKLQotCi0KLSAgICAgICAgcnRjZC0+cmVjb24ucmVjb24gICAgICAgPSB2cDhfcmVjb25fYl9tbXg7Ci0gICAgICAgIHJ0Y2QtPnJlY29uLmNvcHk4eDggICAgID0gdnA4X2NvcHlfbWVtOHg4X21teDsKLSAgICAgICAgcnRjZC0+cmVjb24uY29weTh4NCAgICAgPSB2cDhfY29weV9tZW04eDRfbW14OwotICAgICAgICBydGNkLT5yZWNvbi5jb3B5MTZ4MTYgICA9IHZwOF9jb3B5X21lbTE2eDE2X21teDsKLQotICAgICAgICBydGNkLT5zdWJwaXguc2l4dGFwMTZ4MTYgICA9IHZwOF9zaXh0YXBfcHJlZGljdDE2eDE2X21teDsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4OCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfbW14OwotICAgICAgICBydGNkLT5zdWJwaXguc2l4dGFwOHg0ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDh4NF9tbXg7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXA0eDQgICAgID0gdnA4X3NpeHRhcF9wcmVkaWN0NHg0X21teDsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyMTZ4MTYgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X21teDsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyOHg4ICAgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDh4OF9tbXg7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5iaWxpbmVhcjh4NCAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDRfbW14OwotICAgICAgICBydGNkLT5zdWJwaXguYmlsaW5lYXI0eDQgICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0NHg0X21teDsKLQotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl92ID0gdnA4X2xvb3BfZmlsdGVyX21idl9tbXg7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX2JfdiAgPSB2cDhfbG9vcF9maWx0ZXJfYnZfbW14OwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl9oID0gdnA4X2xvb3BfZmlsdGVyX21iaF9tbXg7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX2JfaCAgPSB2cDhfbG9vcF9maWx0ZXJfYmhfbW14OwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9tYl92ID0gdnA4X2xvb3BfZmlsdGVyX21idnNfbW14OwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9iX3YgID0gdnA4X2xvb3BfZmlsdGVyX2J2c19tbXg7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX21iX2ggPSB2cDhfbG9vcF9maWx0ZXJfbWJoc19tbXg7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX2JfaCAgPSB2cDhfbG9vcF9maWx0ZXJfYmhzX21teDsKLQotI2lmIENPTkZJR19QT1NUUFJPQwotICAgICAgICBydGNkLT5wb3N0cHJvYy5kb3duICAgICAgICA9IHZwOF9tYnBvc3RfcHJvY19kb3duX21teDsKLSAgICAgICAgLypydGNkLT5wb3N0cHJvYy5hY3Jvc3MgICAgICA9IHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfYzsqLwotICAgICAgICBydGNkLT5wb3N0cHJvYy5kb3duYWNyb3NzICA9IHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX21teDsKLSAgICAgICAgcnRjZC0+cG9zdHByb2MuYWRkbm9pc2UgICAgPSB2cDhfcGxhbmVfYWRkX25vaXNlX21teDsKLSNlbmRpZgotICAgIH0KLQotI2VuZGlmCi0jaWYgSEFWRV9TU0UyCi0KLSAgICBpZiAod210X2VuYWJsZWQpCi0gICAgewotICAgICAgICBydGNkLT5yZWNvbi5yZWNvbjIgICAgICA9IHZwOF9yZWNvbjJiX3NzZTI7Ci0gICAgICAgIHJ0Y2QtPnJlY29uLnJlY29uNCAgICAgID0gdnA4X3JlY29uNGJfc3NlMjsKLSAgICAgICAgcnRjZC0+cmVjb24uY29weTE2eDE2ICAgPSB2cDhfY29weV9tZW0xNngxNl9zc2UyOwotCi0gICAgICAgIHJ0Y2QtPmlkY3QuaXdhbHNoMTYgICAgID0gdnA4X3Nob3J0X2ludl93YWxzaDR4NF9zc2UyOwotCi0gICAgICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXAxNngxNiAgID0gdnA4X3NpeHRhcF9wcmVkaWN0MTZ4MTZfc3NlMjsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4OCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfc3NlMjsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4NCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDRfc3NlMjsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyMTZ4MTYgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3NzZTI7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5iaWxpbmVhcjh4OCAgID0gdnA4X2JpbGluZWFyX3ByZWRpY3Q4eDhfc3NlMjsKLQotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9tYl92ID0gdnA4X2xvb3BfZmlsdGVyX21idl9zc2UyOwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLm5vcm1hbF9iX3YgID0gdnA4X2xvb3BfZmlsdGVyX2J2X3NzZTI7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX21iX2ggPSB2cDhfbG9vcF9maWx0ZXJfbWJoX3NzZTI7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIubm9ybWFsX2JfaCAgPSB2cDhfbG9vcF9maWx0ZXJfYmhfc3NlMjsKLSAgICAgICAgcnRjZC0+bG9vcGZpbHRlci5zaW1wbGVfbWJfdiA9IHZwOF9sb29wX2ZpbHRlcl9tYnZzX3NzZTI7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX2JfdiAgPSB2cDhfbG9vcF9maWx0ZXJfYnZzX3NzZTI7Ci0gICAgICAgIHJ0Y2QtPmxvb3BmaWx0ZXIuc2ltcGxlX21iX2ggPSB2cDhfbG9vcF9maWx0ZXJfbWJoc19zc2UyOwotICAgICAgICBydGNkLT5sb29wZmlsdGVyLnNpbXBsZV9iX2ggID0gdnA4X2xvb3BfZmlsdGVyX2Joc19zc2UyOwotCi0jaWYgQ09ORklHX1BPU1RQUk9DCi0gICAgICAgIHJ0Y2QtPnBvc3Rwcm9jLmRvd24gICAgICAgID0gdnA4X21icG9zdF9wcm9jX2Rvd25feG1tOwotICAgICAgICBydGNkLT5wb3N0cHJvYy5hY3Jvc3MgICAgICA9IHZwOF9tYnBvc3RfcHJvY19hY3Jvc3NfaXBfeG1tOwotICAgICAgICBydGNkLT5wb3N0cHJvYy5kb3duYWNyb3NzICA9IHZwOF9wb3N0X3Byb2NfZG93bl9hbmRfYWNyb3NzX3htbTsKLSAgICAgICAgcnRjZC0+cG9zdHByb2MuYWRkbm9pc2UgICAgPSB2cDhfcGxhbmVfYWRkX25vaXNlX3dtdDsKLSNlbmRpZgotICAgIH0KLQotI2VuZGlmCi0KLSNpZiBIQVZFX1NTU0UzCi0KLSAgICBpZiAoU1NTRTNFbmFibGVkKQotICAgIHsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDE2eDE2ICAgPSB2cDhfc2l4dGFwX3ByZWRpY3QxNngxNl9zc3NlMzsKLSAgICAgICAgcnRjZC0+c3VicGl4LnNpeHRhcDh4OCAgICAgPSB2cDhfc2l4dGFwX3ByZWRpY3Q4eDhfc3NzZTM7Ci0gICAgICAgIHJ0Y2QtPnN1YnBpeC5zaXh0YXA4eDQgICAgID0gdnA4X3NpeHRhcF9wcmVkaWN0OHg0X3Nzc2UzOwotICAgICAgICBydGNkLT5zdWJwaXguc2l4dGFwNHg0ICAgICA9IHZwOF9zaXh0YXBfcHJlZGljdDR4NF9zc3NlMzsKLSAgICAgICAgcnRjZC0+c3VicGl4LmJpbGluZWFyMTZ4MTYgPSB2cDhfYmlsaW5lYXJfcHJlZGljdDE2eDE2X3Nzc2UzOwotICAgICAgICBydGNkLT5zdWJwaXguYmlsaW5lYXI4eDggICA9IHZwOF9iaWxpbmVhcl9wcmVkaWN0OHg4X3Nzc2UzOwotICAgIH0KLSNlbmRpZgotCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2FybS9hcm1fZHN5c3RlbWRlcGVuZGVudC5jIGIvdnA4L2RlY29kZXIvYXJtL2FybV9kc3lzdGVtZGVwZW5kZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTkwMWQuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvYXJtL2FybV9kc3lzdGVtZGVwZW5kZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3ByYWdtYXMuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3Bvc3Rwcm9jLmgiCi0jaW5jbHVkZSAidnA4L2RlY29kZXIvZGVxdWFudGl6ZS5oIgotI2luY2x1ZGUgInZwOC9kZWNvZGVyL29ueXhkX2ludC5oIgotCi12b2lkIHZwOF9hcmNoX2FybV9kZWNvZGVfaW5pdChWUDhEX0NPTVAgKnBiaSkKLXsKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgaW50IGZsYWdzID0gcGJpLT5jb21tb24ucnRjZC5mbGFnczsKLSAgICBpbnQgaGFzX2Vkc3AgPSBmbGFncyAmIEhBU19FRFNQOwotICAgIGludCBoYXNfbWVkaWEgPSBmbGFncyAmIEhBU19NRURJQTsKLSAgICBpbnQgaGFzX25lb24gPSBmbGFncyAmIEhBU19ORU9OOwotCi0jaWYgSEFWRV9BUk1WNgotICAgIGlmIChoYXNfbWVkaWEpCi0gICAgewotICAgICAgICBwYmktPmRlcXVhbnQuYmxvY2sgICAgICAgICAgICAgICA9IHZwOF9kZXF1YW50aXplX2JfdjY7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5pZGN0X2FkZCAgICAgICAgICAgID0gdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjY7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5kY19pZGN0X2FkZCAgICAgICAgID0gdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfdjY7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5kY19pZGN0X2FkZF95X2Jsb2NrID0gdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja192NjsKLSAgICAgICAgcGJpLT5kZXF1YW50LmlkY3RfYWRkX3lfYmxvY2sgICAgPSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX3Y2OwotICAgICAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfdXZfYmxvY2sgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX3Y2OwotICAgIH0KLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNwotICAgIGlmIChoYXNfbmVvbikKLSAgICB7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5ibG9jayAgICAgICAgICAgICAgID0gdnA4X2RlcXVhbnRpemVfYl9uZW9uOwotICAgICAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGQgICAgICAgICAgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX25lb247Ci0gICAgICAgIC8qVGhpcyBpcyBub3QgdXNlZDogTkVPTiBhbHdheXMgZGVxdWFudHMgdHdvIGJsb2NrcyBhdCBvbmNlLgotICAgICAgICBwYmktPmRlcXVhbnQuZGNfaWRjdF9hZGQgICAgICAgICA9IHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX25lb247Ki8KLSAgICAgICAgcGJpLT5kZXF1YW50LmRjX2lkY3RfYWRkX3lfYmxvY2sgPSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX25lb247Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5pZGN0X2FkZF95X2Jsb2NrICAgID0gdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19uZW9uOwotICAgICAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfdXZfYmxvY2sgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX25lb247Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2FybS9hcm12NS9kZXF1YW50aXplX3Y1LmFzbSBiL3ZwOC9kZWNvZGVyL2FybS9hcm12NS9kZXF1YW50aXplX3Y1LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzNjQ4YS4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hcm0vYXJtdjUvZGVxdWFudGl6ZV92NS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X2RlcXVhbnRpemVfYl9hcm12NXwKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkgIDsgbmFtZSB0aGlzIGJsb2NrIG9mIGNvZGUKLQotcSAgICAgICBSTiAgcjAKLWRxYyAgICAgUk4gIHIxCi1jbnQgICAgIFJOICByMgotCi07dm9pZCBkZXF1YW50aXplX2JfYXJtdjUoc2hvcnQgKlEsIHNob3J0ICpEUUMpCi18dnA4X2RlcXVhbnRpemVfYl9hcm12NXwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQsIGxyfQotICAgIGxkciAgICAgcjMsIFtxXQotICAgIGxkciAgICAgcjQsIFtkcWNdLCAjOAotCi0gICAgbW92ICAgICBjbnQsICM0Ci1kZXF1YW50X2xvb3AKLSAgICBzbXVsYmIgIGxyLCByMywgcjQKLSAgICBzbXVsdHQgIHIxMiwgcjMsIHI0Ci0KLSAgICBsZHIgICAgIHIzLCBbcSwgIzRdCi0gICAgbGRyICAgICByNCwgW2RxYywgIy00XQotCi0gICAgc3RyaCAgICBsciwgW3FdLCAjMgotICAgIHN0cmggICAgcjEyLCBbcV0sICMyCi0KLSAgICBzbXVsYmIgIGxyLCByMywgcjQKLSAgICBzbXVsdHQgIHIxMiwgcjMsIHI0Ci0KLSAgICBzdWJzICAgIGNudCwgY250LCAjMQotICAgIGxkcm5lICAgcjMsIFtxLCAjNF0KLSAgICBsZHJuZSAgIHI0LCBbZHFjXSwgIzgKLQotICAgIHN0cmggICAgbHIsIFtxXSwgIzIKLSAgICBzdHJoICAgIHIxMiwgW3FdLCAjMgotCi0gICAgYm5lICAgICBkZXF1YW50X2xvb3AKLQotICAgIGxkbWlhICAgc3AhLCB7cjQsIHBjfQotICAgIEVORFAgICAgO3x2cDhfZGVxdWFudGl6ZV9iX2FybXwKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvYXJtL2FybXY2L2RlcXVhbnRfZGNfaWRjdF92Ni5hc20gYi92cDgvZGVjb2Rlci9hcm0vYXJtdjYvZGVxdWFudF9kY19pZGN0X3Y2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlYmRhMi4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hcm0vYXJtdjYvZGVxdWFudF9kY19pZGN0X3Y2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Ci07ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUwotOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCB8dnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfdjZ8Ci0KLSAgICBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi0KLTt2b2lkIHZwOF9kZXF1YW50X2RjX2lkY3RfdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZWQsCi07IHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBwaXRjaCwgaW50IHN0cmlkZSwgaW50IERjKQotOyByMCA9IGlucHV0Ci07IHIxID0gZHEKLTsgcjIgPSBwcmVkCi07IHIzID0gZGVzdAotOyBzcCArIDM2ID0gcGl0Y2ggIDsgKzQgPSA0MAotOyBzcCArIDQwID0gc3RyaWRlICA7ICs0ID0gNDQKLTsgc3AgKyA0NCA9IERjICA7ICs0ID0gNDgKLQotCi18dnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfdjZ8IFBST0MKLSAgICBzdG1kYiAgIHNwISwge3I0LXIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHI2LCBbc3AsICM0NF0KLQotICAgIGxkciAgICAgcjQsIFtyMF0gICAgICAgICAgICAgICAgO2lucHV0Ci0gICAgbGRyICAgICByNSwgW3IxXSwgIzQgICAgICAgICAgICA7ZHEKLQotICAgIHN1YiAgICAgc3AsIHNwLCAjNAotICAgIHN0ciAgICAgcjMsIFtzcF0KLQotICAgIHNtdWx0dCAgcjcsIHI0LCByNQotCi0gICAgbGRyICAgICByNCwgW3IwLCAjNF0gICAgICAgICAgICA7aW5wdXQKLSAgICBsZHIgICAgIHI1LCBbcjFdLCAjNCAgICAgICAgICAgIDtkcQotCi0gICAgc3RyaCAgICByNiwgW3IwXSwgIzIKLSAgICBzdHJoICAgIHI3LCBbcjBdLCAjMgotCi0gICAgc211bGJiICByNiwgcjQsIHI1Ci0gICAgc211bHR0ICByNywgcjQsIHI1Ci0KLSAgICBsZHIgICAgIHI0LCBbcjAsICM0XSAgICAgICAgICAgIDtpbnB1dAotICAgIGxkciAgICAgcjUsIFtyMV0sICM0ICAgICAgICAgICAgO2RxCi0KLSAgICBzdHJoICAgIHI2LCBbcjBdLCAjMgotICAgIHN0cmggICAgcjcsIFtyMF0sICMyCi0KLSAgICBtb3YgICAgIHIxMiwgIzMKLQotdnA4X2RlcXVhbnRfZGNfYWRkX2xvb3AKLSAgICBzbXVsYmIgIHI2LCByNCwgcjUKLSAgICBzbXVsdHQgIHI3LCByNCwgcjUKLQotICAgIGxkciAgICAgcjQsIFtyMCwgIzRdICAgICAgICAgICAgO2lucHV0Ci0gICAgbGRyICAgICByNSwgW3IxXSwgIzQgICAgICAgICAgICA7ZHEKLQotICAgIHN0cmggICAgcjYsIFtyMF0sICMyCi0gICAgc3RyaCAgICByNywgW3IwXSwgIzIKLQotICAgIHNtdWxiYiAgcjYsIHI0LCByNQotICAgIHNtdWx0dCAgcjcsIHI0LCByNQotCi0gICAgc3VicyAgICByMTIsIHIxMiwgIzEKLQotICAgIGxkcm5lICAgcjQsIFtyMCwgIzRdCi0gICAgbGRybmUgICByNSwgW3IxXSwgIzQKLQotICAgIHN0cmggICAgcjYsIFtyMF0sICMyCi0gICAgc3RyaCAgICByNywgW3IwXSwgIzIKLQotICAgIGJuZSAgICAgdnA4X2RlcXVhbnRfZGNfYWRkX2xvb3AKLQotICAgIHN1YiAgICAgcjAsIHIwLCAjMzIKLSAgICBtb3YgICAgIHIxLCByMAotCi07IHNob3J0X2lkY3Q0eDRsbG1fdjZfZHVhbAotICAgIGxkciAgICAgcjMsIGNvc3BpOHNxcnQybWludXMxCi0gICAgbGRyICAgICByNCwgc2lucGk4c3FydDIKLSAgICBsZHIgICAgIHI2LCBbcjAsICM4XQotICAgIG1vdiAgICAgcjUsICMyCi12cDhfZGVxdWFudF9kY19pZGN0X2xvb3AxX3Y2Ci0gICAgbGRyICAgICByMTIsIFtyMCwgIzI0XQotICAgIGxkciAgICAgcjE0LCBbcjAsICMxNl0KLSAgICBzbXVsd3QgIHI5LCByMywgcjYKLSAgICBzbXVsd2IgIHI3LCByMywgcjYKLSAgICBzbXVsd3QgIHIxMCwgcjQsIHI2Ci0gICAgc211bHdiICByOCwgcjQsIHI2Ci0gICAgcGtoYnQgICByNywgcjcsIHI5LCBsc2wgIzE2Ci0gICAgc211bHd0ICByMTEsIHIzLCByMTIKLSAgICBwa2hidCAgIHI4LCByOCwgcjEwLCBsc2wgIzE2Ci0gICAgdWFkZDE2ICByNiwgcjYsIHI3Ci0gICAgc211bHd0ICByNywgcjQsIHIxMgotICAgIHNtdWx3YiAgcjksIHIzLCByMTIKLSAgICBzbXVsd2IgIHIxMCwgcjQsIHIxMgotICAgIHN1YnMgICAgcjUsIHI1LCAjMQotICAgIHBraGJ0ICAgcjksIHI5LCByMTEsIGxzbCAjMTYKLSAgICBsZHIgICAgIHIxMSwgW3IwXSwgIzQKLSAgICBwa2hidCAgIHIxMCwgcjEwLCByNywgbHNsICMxNgotICAgIHVhZGQxNiAgcjcsIHIxMiwgcjkKLSAgICB1c3ViMTYgIHI3LCByOCwgcjcKLSAgICB1YWRkMTYgIHI2LCByNiwgcjEwCi0gICAgdWFkZDE2ICByMTAsIHIxMSwgcjE0Ci0gICAgdXN1YjE2ICByOCwgcjExLCByMTQKLSAgICB1YWRkMTYgIHI5LCByMTAsIHI2Ci0gICAgdXN1YjE2ICByMTAsIHIxMCwgcjYKLSAgICB1YWRkMTYgIHI2LCByOCwgcjcKLSAgICB1c3ViMTYgIHI3LCByOCwgcjcKLSAgICBzdHIgICAgIHI2LCBbcjEsICM4XQotICAgIGxkcm5lICAgcjYsIFtyMCwgIzhdCi0gICAgc3RyICAgICByNywgW3IxLCAjMTZdCi0gICAgc3RyICAgICByMTAsIFtyMSwgIzI0XQotICAgIHN0ciAgICAgcjksIFtyMV0sICM0Ci0gICAgYm5lICAgICB2cDhfZGVxdWFudF9kY19pZGN0X2xvb3AxX3Y2Ci0KLSAgICBtb3YgICAgIHI1LCAjMgotICAgIHN1YiAgICAgcjAsIHIxLCAjOAotdnA4X2RlcXVhbnRfZGNfaWRjdF9sb29wMl92NgotICAgIGxkciAgICAgcjYsIFtyMF0sICM0Ci0gICAgbGRyICAgICByNywgW3IwXSwgIzQKLSAgICBsZHIgICAgIHI4LCBbcjBdLCAjNAotICAgIGxkciAgICAgcjksIFtyMF0sICM0Ci0gICAgc211bHd0ICByMSwgcjMsIHI2Ci0gICAgc211bHd0ICByMTIsIHI0LCByNgotICAgIHNtdWx3dCAgbHIsIHIzLCByOAotICAgIHNtdWx3dCAgcjEwLCByNCwgcjgKLSAgICBwa2hidCAgIHIxMSwgcjgsIHI2LCBsc2wgIzE2Ci0gICAgcGtoYnQgICByMSwgbHIsIHIxLCBsc2wgIzE2Ci0gICAgcGtoYnQgICByMTIsIHIxMCwgcjEyLCBsc2wgIzE2Ci0gICAgcGtodGIgICByNiwgcjYsIHI4LCBhc3IgIzE2Ci0gICAgdWFkZDE2ICByNiwgcjEsIHI2Ci0gICAgcGtoYnQgICBsciwgcjksIHI3LCBsc2wgIzE2Ci0gICAgdWFkZDE2ICByMTAsIHIxMSwgbHIKLSAgICB1c3ViMTYgIGxyLCByMTEsIGxyCi0gICAgcGtodGIgICByOCwgcjcsIHI5LCBhc3IgIzE2Ci0gICAgc3VicyAgICByNSwgcjUsICMxCi0gICAgc211bHd0ICByMSwgcjMsIHI4Ci0gICAgc211bHdiICByNywgcjMsIHI4Ci0gICAgc211bHd0ICByMTEsIHI0LCByOAotICAgIHNtdWx3YiAgcjksIHI0LCByOAotICAgIHBraGJ0ICAgcjEsIHI3LCByMSwgbHNsICMxNgotICAgIHVhZGQxNiAgcjgsIHIxLCByOAotICAgIHBraGJ0ICAgcjExLCByOSwgcjExLCBsc2wgIzE2Ci0gICAgdXN1YjE2ICByMSwgcjEyLCByOAotICAgIHVhZGQxNiAgcjgsIHIxMSwgcjYKLSAgICBsZHIgICAgIHI5LCBjMHgwMDA0MDAwNAotICAgIGxkciAgICAgcjEyLCBbc3AsICM0MF0KLSAgICB1YWRkMTYgIHI2LCByMTAsIHI4Ci0gICAgdXN1YjE2ICByNywgcjEwLCByOAotICAgIHVhZGQxNiAgcjcsIHI3LCByOQotICAgIHVhZGQxNiAgcjYsIHI2LCByOQotICAgIHVhZGQxNiAgcjEwLCByMTQsIHIxCi0gICAgdXN1YjE2ICByMSwgcjE0LCByMQotICAgIHVhZGQxNiAgcjEwLCByMTAsIHI5Ci0gICAgdWFkZDE2ICByMSwgcjEsIHI5Ci0gICAgbGRyICAgICByMTEsIFtyMl0sIHIxMgotICAgIG1vdiAgICAgcjgsIHI3LCBhc3IgIzMKLSAgICBwa2h0YiAgIHI5LCByOCwgcjEwLCBhc3IgIzE5Ci0gICAgbW92ICAgICByOCwgcjEsIGFzciAjMwotICAgIHBraHRiICAgcjgsIHI4LCByNiwgYXNyICMxOQotICAgIHV4dGIxNiAgbHIsIHIxMSwgcm9yICM4Ci0gICAgcWFkZDE2ICByOSwgcjksIGxyCi0gICAgdXh0YjE2ICBsciwgcjExCi0gICAgcWFkZDE2ICByOCwgcjgsIGxyCi0gICAgdXNhdDE2ICByOSwgIzgsIHI5Ci0gICAgdXNhdDE2ICByOCwgIzgsIHI4Ci0gICAgb3JyICAgICByOSwgcjgsIHI5LCBsc2wgIzgKLSAgICBsZHIgICAgIHIxMSwgW3IyXSwgcjEyCi0gICAgbGRyICAgICBsciwgW3NwXQotICAgIGxkciAgICAgcjEyLCBbc3AsICM0NF0KLSAgICBtb3YgICAgIHI3LCByNywgbHNsICMxNgotICAgIG1vdiAgICAgcjEsIHIxLCBsc2wgIzE2Ci0gICAgbW92ICAgICByMTAsIHIxMCwgbHNsICMxNgotICAgIG1vdiAgICAgcjYsIHI2LCBsc2wgIzE2Ci0gICAgbW92ICAgICByNywgcjcsIGFzciAjMwotICAgIHBraHRiICAgcjcsIHI3LCByMTAsIGFzciAjMTkKLSAgICBtb3YgICAgIHIxLCByMSwgYXNyICMzCi0gICAgcGtodGIgICByMSwgcjEsIHI2LCBhc3IgIzE5Ci0gICAgdXh0YjE2ICByOCwgcjExLCByb3IgIzgKLSAgICBxYWRkMTYgIHI3LCByNywgcjgKLSAgICB1eHRiMTYgIHI4LCByMTEKLSAgICBxYWRkMTYgIHIxLCByMSwgcjgKLSAgICB1c2F0MTYgIHI3LCAjOCwgcjcKLSAgICB1c2F0MTYgIHIxLCAjOCwgcjEKLSAgICBvcnIgICAgIHIxLCByMSwgcjcsIGxzbCAjOAotICAgIHN0ciAgICAgcjksIFtscl0sIHIxMgotICAgIHN0ciAgICAgcjEsIFtscl0sIHIxMgotICAgIHN0ciAgICAgbHIsIFtzcF0KLSAgICBibmUgICAgIHZwOF9kZXF1YW50X2RjX2lkY3RfbG9vcDJfdjYKLQotOyB2cHhfbWVtc2V0Ci0gICAgc3ViICAgICByMCwgcjAsICMzMgotICAgIGFkZCAgICAgc3AsIHNwLCAjNAotCi0gICAgbW92ICAgICByMTIsICMwCi0gICAgc3RyICAgICByMTIsIFtyMF0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjNF0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjOF0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjMTJdCi0gICAgc3RyICAgICByMTIsIFtyMCwgIzE2XQotICAgIHN0ciAgICAgcjEyLCBbcjAsICMyMF0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjMjRdCi0gICAgc3RyICAgICByMTIsIFtyMCwgIzI4XQotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgICA7IHx2cDhfZGVxdWFudF9kY19pZGN0X2FkZF92NnwKLQotOyBDb25zdGFudCBQb29sCi1jb3NwaThzcXJ0Mm1pbnVzMSBEQ0QgMHgwMDAwNEU3Qgotc2lucGk4c3FydDIgICAgICAgRENEIDB4MDAwMDhBOEMKLWMweDAwMDQwMDA0ICAgICAgIERDRCAweDAwMDQwMDA0Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2FybS9hcm12Ni9kZXF1YW50X2lkY3RfdjYuYXNtIGIvdnA4L2RlY29kZXIvYXJtL2FybXY2L2RlcXVhbnRfaWRjdF92Ni5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjY3MWMuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvYXJtL2FybXY2L2RlcXVhbnRfaWRjdF92Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgYW5kIHBhdGVudAotOyAgZ3JhbnQgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMKLTsgIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0gICAgRVhQT1JUIHx2cDhfZGVxdWFudF9pZGN0X2FkZF92NnwKLQotICAgIEFSRUEgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkKLTt2b2lkIHZwOF9kZXF1YW50X2lkY3RfdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZWQsCi07IHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBwaXRjaCwgaW50IHN0cmlkZSkKLTsgcjAgPSBpbnB1dAotOyByMSA9IGRxCi07IHIyID0gcHJlZAotOyByMyA9IGRlc3QKLTsgc3AgKyAzNiA9IHBpdGNoICA7ICs0ID0gNDAKLTsgc3AgKyA0MCA9IHN0cmlkZSAgOyArNCA9IDQ0Ci0KLQotfHZwOF9kZXF1YW50X2lkY3RfYWRkX3Y2fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNC1yMTEsIGxyfQotCi0gICAgbGRyICAgICByNCwgW3IwXSAgICAgICAgICAgICAgICA7aW5wdXQKLSAgICBsZHIgICAgIHI1LCBbcjFdLCAjNCAgICAgICAgICAgIDtkcQotCi0gICAgc3ViICAgICBzcCwgc3AsICM0Ci0gICAgc3RyICAgICByMywgW3NwXQotCi0gICAgbW92ICAgICByMTIsICM0Ci0KLXZwOF9kZXF1YW50X2FkZF9sb29wCi0gICAgc211bGJiICByNiwgcjQsIHI1Ci0gICAgc211bHR0ICByNywgcjQsIHI1Ci0KLSAgICBsZHIgICAgIHI0LCBbcjAsICM0XSAgICAgICAgICAgIDtpbnB1dAotICAgIGxkciAgICAgcjUsIFtyMV0sICM0ICAgICAgICAgICAgO2RxCi0KLSAgICBzdHJoICAgIHI2LCBbcjBdLCAjMgotICAgIHN0cmggICAgcjcsIFtyMF0sICMyCi0KLSAgICBzbXVsYmIgIHI2LCByNCwgcjUKLSAgICBzbXVsdHQgIHI3LCByNCwgcjUKLQotICAgIHN1YnMgICAgcjEyLCByMTIsICMxCi0KLSAgICBsZHJuZSAgIHI0LCBbcjAsICM0XQotICAgIGxkcm5lICAgcjUsIFtyMV0sICM0Ci0KLSAgICBzdHJoICAgIHI2LCBbcjBdLCAjMgotICAgIHN0cmggICAgcjcsIFtyMF0sICMyCi0KLSAgICBibmUgICAgIHZwOF9kZXF1YW50X2FkZF9sb29wCi0KLSAgICBzdWIgICAgIHIwLCByMCwgIzMyCi0gICAgbW92ICAgICByMSwgcjAKLQotOyBzaG9ydF9pZGN0NHg0bGxtX3Y2X2R1YWwKLSAgICBsZHIgICAgIHIzLCBjb3NwaThzcXJ0Mm1pbnVzMQotICAgIGxkciAgICAgcjQsIHNpbnBpOHNxcnQyCi0gICAgbGRyICAgICByNiwgW3IwLCAjOF0KLSAgICBtb3YgICAgIHI1LCAjMgotdnA4X2RlcXVhbnRfaWRjdF9sb29wMV92NgotICAgIGxkciAgICAgcjEyLCBbcjAsICMyNF0KLSAgICBsZHIgICAgIHIxNCwgW3IwLCAjMTZdCi0gICAgc211bHd0ICByOSwgcjMsIHI2Ci0gICAgc211bHdiICByNywgcjMsIHI2Ci0gICAgc211bHd0ICByMTAsIHI0LCByNgotICAgIHNtdWx3YiAgcjgsIHI0LCByNgotICAgIHBraGJ0ICAgcjcsIHI3LCByOSwgbHNsICMxNgotICAgIHNtdWx3dCAgcjExLCByMywgcjEyCi0gICAgcGtoYnQgICByOCwgcjgsIHIxMCwgbHNsICMxNgotICAgIHVhZGQxNiAgcjYsIHI2LCByNwotICAgIHNtdWx3dCAgcjcsIHI0LCByMTIKLSAgICBzbXVsd2IgIHI5LCByMywgcjEyCi0gICAgc211bHdiICByMTAsIHI0LCByMTIKLSAgICBzdWJzICAgIHI1LCByNSwgIzEKLSAgICBwa2hidCAgIHI5LCByOSwgcjExLCBsc2wgIzE2Ci0gICAgbGRyICAgICByMTEsIFtyMF0sICM0Ci0gICAgcGtoYnQgICByMTAsIHIxMCwgcjcsIGxzbCAjMTYKLSAgICB1YWRkMTYgIHI3LCByMTIsIHI5Ci0gICAgdXN1YjE2ICByNywgcjgsIHI3Ci0gICAgdWFkZDE2ICByNiwgcjYsIHIxMAotICAgIHVhZGQxNiAgcjEwLCByMTEsIHIxNAotICAgIHVzdWIxNiAgcjgsIHIxMSwgcjE0Ci0gICAgdWFkZDE2ICByOSwgcjEwLCByNgotICAgIHVzdWIxNiAgcjEwLCByMTAsIHI2Ci0gICAgdWFkZDE2ICByNiwgcjgsIHI3Ci0gICAgdXN1YjE2ICByNywgcjgsIHI3Ci0gICAgc3RyICAgICByNiwgW3IxLCAjOF0KLSAgICBsZHJuZSAgIHI2LCBbcjAsICM4XQotICAgIHN0ciAgICAgcjcsIFtyMSwgIzE2XQotICAgIHN0ciAgICAgcjEwLCBbcjEsICMyNF0KLSAgICBzdHIgICAgIHI5LCBbcjFdLCAjNAotICAgIGJuZSAgICAgdnA4X2RlcXVhbnRfaWRjdF9sb29wMV92NgotCi0gICAgbW92ICAgICByNSwgIzIKLSAgICBzdWIgICAgIHIwLCByMSwgIzgKLXZwOF9kZXF1YW50X2lkY3RfbG9vcDJfdjYKLSAgICBsZHIgICAgIHI2LCBbcjBdLCAjNAotICAgIGxkciAgICAgcjcsIFtyMF0sICM0Ci0gICAgbGRyICAgICByOCwgW3IwXSwgIzQKLSAgICBsZHIgICAgIHI5LCBbcjBdLCAjNAotICAgIHNtdWx3dCAgcjEsIHIzLCByNgotICAgIHNtdWx3dCAgcjEyLCByNCwgcjYKLSAgICBzbXVsd3QgIGxyLCByMywgcjgKLSAgICBzbXVsd3QgIHIxMCwgcjQsIHI4Ci0gICAgcGtoYnQgICByMTEsIHI4LCByNiwgbHNsICMxNgotICAgIHBraGJ0ICAgcjEsIGxyLCByMSwgbHNsICMxNgotICAgIHBraGJ0ICAgcjEyLCByMTAsIHIxMiwgbHNsICMxNgotICAgIHBraHRiICAgcjYsIHI2LCByOCwgYXNyICMxNgotICAgIHVhZGQxNiAgcjYsIHIxLCByNgotICAgIHBraGJ0ICAgbHIsIHI5LCByNywgbHNsICMxNgotICAgIHVhZGQxNiAgcjEwLCByMTEsIGxyCi0gICAgdXN1YjE2ICBsciwgcjExLCBscgotICAgIHBraHRiICAgcjgsIHI3LCByOSwgYXNyICMxNgotICAgIHN1YnMgICAgcjUsIHI1LCAjMQotICAgIHNtdWx3dCAgcjEsIHIzLCByOAotICAgIHNtdWx3YiAgcjcsIHIzLCByOAotICAgIHNtdWx3dCAgcjExLCByNCwgcjgKLSAgICBzbXVsd2IgIHI5LCByNCwgcjgKLSAgICBwa2hidCAgIHIxLCByNywgcjEsIGxzbCAjMTYKLSAgICB1YWRkMTYgIHI4LCByMSwgcjgKLSAgICBwa2hidCAgIHIxMSwgcjksIHIxMSwgbHNsICMxNgotICAgIHVzdWIxNiAgcjEsIHIxMiwgcjgKLSAgICB1YWRkMTYgIHI4LCByMTEsIHI2Ci0gICAgbGRyICAgICByOSwgYzB4MDAwNDAwMDQKLSAgICBsZHIgICAgIHIxMiwgW3NwLCAjNDBdCi0gICAgdWFkZDE2ICByNiwgcjEwLCByOAotICAgIHVzdWIxNiAgcjcsIHIxMCwgcjgKLSAgICB1YWRkMTYgIHI3LCByNywgcjkKLSAgICB1YWRkMTYgIHI2LCByNiwgcjkKLSAgICB1YWRkMTYgIHIxMCwgcjE0LCByMQotICAgIHVzdWIxNiAgcjEsIHIxNCwgcjEKLSAgICB1YWRkMTYgIHIxMCwgcjEwLCByOQotICAgIHVhZGQxNiAgcjEsIHIxLCByOQotICAgIGxkciAgICAgcjExLCBbcjJdLCByMTIKLSAgICBtb3YgICAgIHI4LCByNywgYXNyICMzCi0gICAgcGtodGIgICByOSwgcjgsIHIxMCwgYXNyICMxOQotICAgIG1vdiAgICAgcjgsIHIxLCBhc3IgIzMKLSAgICBwa2h0YiAgIHI4LCByOCwgcjYsIGFzciAjMTkKLSAgICB1eHRiMTYgIGxyLCByMTEsIHJvciAjOAotICAgIHFhZGQxNiAgcjksIHI5LCBscgotICAgIHV4dGIxNiAgbHIsIHIxMQotICAgIHFhZGQxNiAgcjgsIHI4LCBscgotICAgIHVzYXQxNiAgcjksICM4LCByOQotICAgIHVzYXQxNiAgcjgsICM4LCByOAotICAgIG9yciAgICAgcjksIHI4LCByOSwgbHNsICM4Ci0gICAgbGRyICAgICByMTEsIFtyMl0sIHIxMgotICAgIGxkciAgICAgbHIsIFtzcF0KLSAgICBsZHIgICAgIHIxMiwgW3NwLCAjNDRdCi0gICAgbW92ICAgICByNywgcjcsIGxzbCAjMTYKLSAgICBtb3YgICAgIHIxLCByMSwgbHNsICMxNgotICAgIG1vdiAgICAgcjEwLCByMTAsIGxzbCAjMTYKLSAgICBtb3YgICAgIHI2LCByNiwgbHNsICMxNgotICAgIG1vdiAgICAgcjcsIHI3LCBhc3IgIzMKLSAgICBwa2h0YiAgIHI3LCByNywgcjEwLCBhc3IgIzE5Ci0gICAgbW92ICAgICByMSwgcjEsIGFzciAjMwotICAgIHBraHRiICAgcjEsIHIxLCByNiwgYXNyICMxOQotICAgIHV4dGIxNiAgcjgsIHIxMSwgcm9yICM4Ci0gICAgcWFkZDE2ICByNywgcjcsIHI4Ci0gICAgdXh0YjE2ICByOCwgcjExCi0gICAgcWFkZDE2ICByMSwgcjEsIHI4Ci0gICAgdXNhdDE2ICByNywgIzgsIHI3Ci0gICAgdXNhdDE2ICByMSwgIzgsIHIxCi0gICAgb3JyICAgICByMSwgcjEsIHI3LCBsc2wgIzgKLSAgICBzdHIgICAgIHI5LCBbbHJdLCByMTIKLSAgICBzdHIgICAgIHIxLCBbbHJdLCByMTIKLSAgICBzdHIgICAgIGxyLCBbc3BdCi0gICAgYm5lICAgICB2cDhfZGVxdWFudF9pZGN0X2xvb3AyX3Y2Ci0KLTsgdnB4X21lbXNldAotICAgIHN1YiAgICAgcjAsIHIwLCAjMzIKLSAgICBhZGQgICAgIHNwLCBzcCwgIzQKLQotICAgIG1vdiAgICAgcjEyLCAjMAotICAgIHN0ciAgICAgcjEyLCBbcjBdCi0gICAgc3RyICAgICByMTIsIFtyMCwgIzRdCi0gICAgc3RyICAgICByMTIsIFtyMCwgIzhdCi0gICAgc3RyICAgICByMTIsIFtyMCwgIzEyXQotICAgIHN0ciAgICAgcjEyLCBbcjAsICMxNl0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjMjBdCi0gICAgc3RyICAgICByMTIsIFtyMCwgIzI0XQotICAgIHN0ciAgICAgcjEyLCBbcjAsICMyOF0KLQotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgOyB8dnA4X2RlcXVhbnRfaWRjdF9hZGRfdjZ8Ci0KLTsgQ29uc3RhbnQgUG9vbAotY29zcGk4c3FydDJtaW51czEgRENEIDB4MDAwMDRFN0IKLXNpbnBpOHNxcnQyICAgICAgIERDRCAweDAwMDA4QThDCi1jMHgwMDA0MDAwNCAgICAgICBEQ0QgMHgwMDA0MDAwNAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9hcm0vYXJtdjYvaWRjdF9ibGtfdjYuYyBiL3ZwOC9kZWNvZGVyL2FybS9hcm12Ni9pZGN0X2Jsa192Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2MzNDQ2Li4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL2FybS9hcm12Ni9pZGN0X2Jsa192Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2lkY3QuaCIKLSNpbmNsdWRlICJ2cDgvZGVjb2Rlci9kZXF1YW50aXplLmgiCi0KLXZvaWQgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja192NgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMsIHNob3J0ICpkYykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBpZiAoZW9ic1swXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF92NiAocSwgZHEsIHByZSwgZHN0LCAxNiwgc3RyaWRlLCBkY1swXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChkY1swXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotCi0gICAgICAgIGlmIChlb2JzWzFdID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3Y2IChxKzE2LCBkcSwgcHJlKzQsIGRzdCs0LCAxNiwgc3RyaWRlLCBkY1sxXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChkY1sxXSwgcHJlKzQsIGRzdCs0LCAxNiwgc3RyaWRlKTsKLQotICAgICAgICBpZiAoZW9ic1syXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF92NiAocSszMiwgZHEsIHByZSs4LCBkc3QrOCwgMTYsIHN0cmlkZSwgZGNbMl0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF92NiAoZGNbMl0sIHByZSs4LCBkc3QrOCwgMTYsIHN0cmlkZSk7Ci0KLSAgICAgICAgaWYgKGVvYnNbM10gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfdjYgKHErNDgsIGRxLCBwcmUrMTIsIGRzdCsxMiwgMTYsIHN0cmlkZSwgZGNbM10pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF92NiAoZGNbM10sIHByZSsxMiwgZHN0KzEyLCAxNiwgc3RyaWRlKTsKLQotICAgICAgICBxICAgICs9IDY0OwotICAgICAgICBkYyAgICs9IDQ7Ci0gICAgICAgIHByZSAgKz0gNjQ7Ci0gICAgICAgIGRzdCAgKz0gNCpzdHJpZGU7Ci0gICAgICAgIGVvYnMgKz0gNDsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja192NgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGVvYnNbMF0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYgKHEsIGRxLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYgKHFbMF0qZHFbMF0sIHByZSwgZHN0LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVvYnNbMV0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYgKHErMTYsIGRxLCBwcmUrNCwgZHN0KzQsIDE2LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChxWzE2XSpkcVswXSwgcHJlKzQsIGRzdCs0LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopKHErMTYpKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW9ic1syXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF92NiAocSszMiwgZHEsIHByZSs4LCBkc3QrOCwgMTYsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYgKHFbMzJdKmRxWzBdLCBwcmUrOCwgZHN0KzgsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKikocSszMikpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlb2JzWzNdID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3Y2IChxKzQ4LCBkcSwgcHJlKzEyLCBkc3QrMTIsIDE2LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChxWzQ4XSpkcVswXSwgcHJlKzEyLCBkc3QrMTIsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKikocSs0OCkpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHEgICAgKz0gNjQ7Ci0gICAgICAgIHByZSAgKz0gNjQ7Ci0gICAgICAgIGRzdCAgKz0gNCpzdHJpZGU7Ci0gICAgICAgIGVvYnMgKz0gNDsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfdjYKLSAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmUsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0dSwgdW5zaWduZWQgY2hhciAqZHN0diwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICBpZiAoZW9ic1swXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF92NiAocSwgZHEsIHByZSwgZHN0dSwgOCwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF92NiAocVswXSpkcVswXSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW9ic1sxXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF92NiAocSsxNiwgZHEsIHByZSs0LCBkc3R1KzQsIDgsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYgKHFbMTZdKmRxWzBdLCBwcmUrNCwgZHN0dSs0LCA4LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKikocSsxNikpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHEgICAgKz0gMzI7Ci0gICAgICAgIHByZSAgKz0gMzI7Ci0gICAgICAgIGRzdHUgKz0gNCpzdHJpZGU7Ci0gICAgICAgIGVvYnMgKz0gMjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGVvYnNbMF0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYgKHEsIGRxLCBwcmUsIGRzdHYsIDgsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfdjYgKHFbMF0qZHFbMF0sIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVvYnNbMV0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYgKHErMTYsIGRxLCBwcmUrNCwgZHN0dis0LCA4LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX3Y2IChxWzE2XSpkcVswXSwgcHJlKzQsIGRzdHYrNCwgOCwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopKHErMTYpKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBxICAgICs9IDMyOwotICAgICAgICBwcmUgICs9IDMyOwotICAgICAgICBkc3R2ICs9IDQqc3RyaWRlOwotICAgICAgICBlb2JzICs9IDI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvYXJtL2RlcXVhbnRpemVfYXJtLmMgYi92cDgvZGVjb2Rlci9hcm0vZGVxdWFudGl6ZV9hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YWRiNy4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hcm0vZGVxdWFudGl6ZV9hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9kZWNvZGVyL2RlcXVhbnRpemUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2lkY3QuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLQotI2lmIEhBVkVfQVJNVjcKLWV4dGVybiB2b2lkIHZwOF9kZXF1YW50aXplX2JfbG9vcF9uZW9uKHNob3J0ICpRLCBzaG9ydCAqRFFDLCBzaG9ydCAqRFEpOwotI2VuZGlmCi0KLSNpZiBIQVZFX0FSTVY2Ci1leHRlcm4gdm9pZCB2cDhfZGVxdWFudGl6ZV9iX2xvb3BfdjYoc2hvcnQgKlEsIHNob3J0ICpEUUMsIHNob3J0ICpEUSk7Ci0jZW5kaWYKLQotI2lmIEhBVkVfQVJNVjcKLQotdm9pZCB2cDhfZGVxdWFudGl6ZV9iX25lb24oQkxPQ0tEICpkKQotewotICAgIGludCBpOwotICAgIHNob3J0ICpEUSAgPSBkLT5kcWNvZWZmOwotICAgIHNob3J0ICpRICAgPSBkLT5xY29lZmY7Ci0gICAgc2hvcnQgKkRRQyA9IGQtPmRlcXVhbnQ7Ci0KLSAgICB2cDhfZGVxdWFudGl6ZV9iX2xvb3BfbmVvbihRLCBEUUMsIERRKTsKLX0KLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNgotdm9pZCB2cDhfZGVxdWFudGl6ZV9iX3Y2KEJMT0NLRCAqZCkKLXsKLSAgICBpbnQgaTsKLSAgICBzaG9ydCAqRFEgID0gZC0+ZHFjb2VmZjsKLSAgICBzaG9ydCAqUSAgID0gZC0+cWNvZWZmOwotICAgIHNob3J0ICpEUUMgPSBkLT5kZXF1YW50OwotCi0gICAgdnA4X2RlcXVhbnRpemVfYl9sb29wX3Y2KFEsIERRQywgRFEpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9hcm0vZGVxdWFudGl6ZV9hcm0uaCBiL3ZwOC9kZWNvZGVyL2FybS9kZXF1YW50aXplX2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q4MDBkLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL2FybS9kZXF1YW50aXplX2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgREVRVUFOVElaRV9BUk1fSAotI2RlZmluZSBERVFVQU5USVpFX0FSTV9ICi0KLSNpZiBIQVZFX0FSTVY2Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfYmxvY2sodnA4X2RlcXVhbnRpemVfYl92Nik7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGQodnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2RjX2lkY3RfYWRkKHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3Y2KTsKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrKHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja192Nik7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sodnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfdjYpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X2RlcXVhbnRfYmxvY2sKLSNkZWZpbmUgdnA4X2RlcXVhbnRfYmxvY2sgdnA4X2RlcXVhbnRpemVfYl92NgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGQKLSNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdjYKLQotI3VuZGVmIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkCi0jZGVmaW5lIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3Y2Ci0KLSN1bmRlZiB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrCi0jZGVmaW5lIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2sgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja192NgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfdjYKLQotI3VuZGVmIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrCi0jZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX3Y2Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2Jsb2NrKHZwOF9kZXF1YW50aXplX2JfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGQodnA4X2RlcXVhbnRfaWRjdF9hZGRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfZGNfaWRjdF9hZGQodnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jayh2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayh2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19uZW9uKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9kZXF1YW50X2Jsb2NrCi0jZGVmaW5lIHZwOF9kZXF1YW50X2Jsb2NrIHZwOF9kZXF1YW50aXplX2JfbmVvbgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGQKLSNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbmVvbgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQKLSNkZWZpbmUgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbmVvbgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfbmVvbgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfbmVvbgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sKLSNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfbmVvbgotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9hcm0vbmVvbi9kZXF1YW50X2lkY3RfbmVvbi5hc20gYi92cDgvZGVjb2Rlci9hcm0vbmVvbi9kZXF1YW50X2lkY3RfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTJjYzcuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvYXJtL25lb24vZGVxdWFudF9pZGN0X25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfZGVxdWFudF9pZGN0X2FkZF9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTt2b2lkIHZwOF9kZXF1YW50X2lkY3RfbmVvbihzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlZCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgcGl0Y2gsIGludCBzdHJpZGUpCi07IHIwICAgIHNob3J0ICppbnB1dCwKLTsgcjEgICAgc2hvcnQgKmRxLAotOyByMiAgICB1bnNpZ25lZCBjaGFyICpwcmVkCi07IHIzICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QKLTsgc3AgICAgaW50IHBpdGNoCi07IHNwKzQgIGludCBzdHJpZGUKLQotfHZwOF9kZXF1YW50X2lkY3RfYWRkX25lb258IFBST0MKLSAgICB2bGQxLjE2ICAgICAgICAge3EzLCBxNH0sIFtyMF0KLSAgICB2bGQxLjE2ICAgICAgICAge3E1LCBxNn0sIFtyMV0KLSAgICBsZHIgICAgICAgICAgICAgcjEsIFtzcF0gICAgICAgICAgICAgICAgOyBwaXRjaAotICAgIHZsZDEuMzIgICAgICAgICB7ZDE0WzBdfSwgW3IyXSwgcjEKLSAgICB2bGQxLjMyICAgICAgICAge2QxNFsxXX0sIFtyMl0sIHIxCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMTVbMF19LCBbcjJdLCByMQotICAgIHZsZDEuMzIgICAgICAgICB7ZDE1WzFdfSwgW3IyXQotCi0gICAgbGRyICAgICAgICAgICAgIHIxLCBbc3AsICM0XSAgICAgICAgICAgIDsgc3RyaWRlCi0KLSAgICBhZHIgICAgICAgICAgICAgcjEyLCBfQ09OU1RBTlRTXwotCi0gICAgdm11bC5pMTYgICAgICAgIHExLCBxMywgcTUgICAgICAgICAgICAgIDtpbnB1dCBmb3Igc2hvcnRfaWRjdDR4NGxsbV9uZW9uCi0gICAgdm11bC5pMTYgICAgICAgIHEyLCBxNCwgcTYKLQotO3xzaG9ydF9pZGN0NHg0bGxtX25lb258IFBST0MKLSAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3IxMl0KLSAgICB2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgO3EyKHZwWzRdIHZwWzEyXSkKLQotICAgIHZxZG11bGguczE2ICAgICBxMywgcTIsIGQwWzJdCi0gICAgdnFkbXVsaC5zMTYgICAgIHE0LCBxMiwgZDBbMF0KLQotICAgIHZxYWRkLnMxNiAgICAgICBkMTIsIGQyLCBkMyAgICAgICAgICAgICA7YTEKLSAgICB2cXN1Yi5zMTYgICAgICAgZDEzLCBkMiwgZDMgICAgICAgICAgICAgO2IxCi0KLSAgICB2c2hyLnMxNiAgICAgICAgcTMsIHEzLCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxNCwgcTQsICMxCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTMsIHEzLCBxMgotICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTQsIHEyCi0KLSAgICB2cXN1Yi5zMTYgICAgICAgZDEwLCBkNiwgZDkgICAgICAgICAgICAgO2MxCi0gICAgdnFhZGQuczE2ICAgICAgIGQxMSwgZDcsIGQ4ICAgICAgICAgICAgIDtkMQotCi0gICAgdnFhZGQuczE2ICAgICAgIGQyLCBkMTIsIGQxMQotICAgIHZxYWRkLnMxNiAgICAgICBkMywgZDEzLCBkMTAKLSAgICB2cXN1Yi5zMTYgICAgICAgZDQsIGQxMywgZDEwCi0gICAgdnFzdWIuczE2ICAgICAgIGQ1LCBkMTIsIGQxMQotCi0gICAgdnRybi4zMiAgICAgICAgIGQyLCBkNAotICAgIHZ0cm4uMzIgICAgICAgICBkMywgZDUKLSAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQzCi0gICAgdnRybi4xNiAgICAgICAgIGQ0LCBkNQotCi07IG1lbXNldChpbnB1dCwgMCwgMzIpIC0tIDMyYnl0ZXMKLSAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAotCi0gICAgdnN3cCAgICAgICAgICAgIGQzLCBkNAotICAgIHZxZG11bGguczE2ICAgICBxMywgcTIsIGQwWzJdCi0gICAgdnFkbXVsaC5zMTYgICAgIHE0LCBxMiwgZDBbMF0KLQotICAgIHZxYWRkLnMxNiAgICAgICBkMTIsIGQyLCBkMyAgICAgICAgICAgICA7YTEKLSAgICB2cXN1Yi5zMTYgICAgICAgZDEzLCBkMiwgZDMgICAgICAgICAgICAgO2IxCi0KLSAgICB2bW92ICAgICAgICAgICAgcTE1LCBxMTQKLQotICAgIHZzaHIuczE2ICAgICAgICBxMywgcTMsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHE0LCBxNCwgIzEKLQotICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTMsIHEyCi0gICAgdnFhZGQuczE2ICAgICAgIHE0LCBxNCwgcTIKLQotICAgIHZxc3ViLnMxNiAgICAgICBkMTAsIGQ2LCBkOSAgICAgICAgICAgICA7YzEKLSAgICB2cWFkZC5zMTYgICAgICAgZDExLCBkNywgZDggICAgICAgICAgICAgO2QxCi0KLSAgICB2cWFkZC5zMTYgICAgICAgZDIsIGQxMiwgZDExCi0gICAgdnFhZGQuczE2ICAgICAgIGQzLCBkMTMsIGQxMAotICAgIHZxc3ViLnMxNiAgICAgICBkNCwgZDEzLCBkMTAKLSAgICB2cXN1Yi5zMTYgICAgICAgZDUsIGQxMiwgZDExCi0KLSAgICB2c3QxLjE2ICAgICAgICAge3ExNCwgcTE1fSwgW3IwXQotCi0gICAgdnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMKLSAgICB2cnNoci5zMTYgICAgICAgZDMsIGQzLCAjMwotICAgIHZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzCi0gICAgdnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMKLQotICAgIHZ0cm4uMzIgICAgICAgICBkMiwgZDQKLSAgICB2dHJuLjMyICAgICAgICAgZDMsIGQ1Ci0gICAgdnRybi4xNiAgICAgICAgIGQyLCBkMwotICAgIHZ0cm4uMTYgICAgICAgICBkNCwgZDUKLQotICAgIHZhZGR3LnU4ICAgICAgICBxMSwgcTEsIGQxNAotICAgIHZhZGR3LnU4ICAgICAgICBxMiwgcTIsIGQxNQotCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQwLCBxMQotICAgIHZxbW92dW4uczE2ICAgICBkMSwgcTIKLQotICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCBbcjNdLCByMQotICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCBbcjNdLCByMQotICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbcjNdLCByMQotICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCBbcjNdCi0KLSAgICBieCAgICAgICAgICAgICBscgotCi0gICAgRU5EUCAgICAgICAgICAgOyB8dnA4X2RlcXVhbnRfaWRjdF9hZGRfbmVvbnwKLQotOyBDb25zdGFudCBQb29sCi1fQ09OU1RBTlRTXwotY29zcGk4c3FydDJtaW51czEgRENEIDB4NGU3YjRlN2IKLXNpbnBpOHNxcnQyICAgICAgIERDRCAweDhhOGM4YThjCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfYmxrX25lb24uYyBiL3ZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfYmxrX25lb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNTAwNC4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2Jsa19uZW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vaWRjdC5oIgotI2luY2x1ZGUgInZwOC9kZWNvZGVyL2RlcXVhbnRpemUuaCIKLQotLyogcGxhY2UgdGhlc2UgZGVjbGFyYXRpb25zIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIG1haW50YWluIHRoZW0KLSAqIG91dHNpZGUgb2YgdGhpcyBzY29wZQotICovCi12b2lkIGlkY3RfZGVxdWFudF9kY19mdWxsXzJ4X25lb24KLSAgICAgICAgICAgIChzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgaW50IHN0cmlkZSwgc2hvcnQgKmRjKTsKLXZvaWQgaWRjdF9kZXF1YW50X2RjXzBfMnhfbmVvbgotICAgICAgICAgICAgKHNob3J0ICpkYywgdW5zaWduZWQgY2hhciAqcHJlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUpOwotdm9pZCBpZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9uCi0gICAgICAgICAgICAoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgaW50IHBpdGNoLCBpbnQgc3RyaWRlKTsKLXZvaWQgaWRjdF9kZXF1YW50XzBfMnhfbmVvbgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCBkcSwgdW5zaWduZWQgY2hhciAqcHJlLCBpbnQgcGl0Y2gsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlKTsKLQotdm9pZCB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX25lb24KLSAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmUsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzLCBzaG9ydCAqZGMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCgoc2hvcnQgKillb2JzKVswXSAmIDB4ZmVmZSkKLSAgICAgICAgICAgIGlkY3RfZGVxdWFudF9kY19mdWxsXzJ4X25lb24gKHEsIGRxLCBwcmUsIGRzdCwgc3RyaWRlLCBkYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlkY3RfZGVxdWFudF9kY18wXzJ4X25lb24oZGMsIHByZSwgZHN0LCBzdHJpZGUpOwotCi0gICAgICAgIGlmICgoKHNob3J0ICopZW9icylbMV0gJiAweGZlZmUpCi0gICAgICAgICAgICBpZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9uZW9uIChxKzMyLCBkcSwgcHJlKzgsIGRzdCs4LCBzdHJpZGUsIGRjKzIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZGN0X2RlcXVhbnRfZGNfMF8yeF9uZW9uKGRjKzIsIHByZSs4LCBkc3QrOCwgc3RyaWRlKTsKLQotICAgICAgICBxICAgICs9IDY0OwotICAgICAgICBkYyAgICs9IDQ7Ci0gICAgICAgIHByZSAgKz0gNjQ7Ci0gICAgICAgIGRzdCAgKz0gNCpzdHJpZGU7Ci0gICAgICAgIGVvYnMgKz0gNDsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19uZW9uCi0gICAgICAgICAgICAoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBpZiAoKChzaG9ydCAqKWVvYnMpWzBdICYgMHhmZWZlKQotICAgICAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbiAocSwgZHEsIHByZSwgZHN0LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfbmVvbiAocSwgZHFbMF0sIHByZSwgMTYsIGRzdCwgc3RyaWRlKTsKLQotICAgICAgICBpZiAoKChzaG9ydCAqKWVvYnMpWzFdICYgMHhmZWZlKQotICAgICAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbiAocSszMiwgZHEsIHByZSs4LCBkc3QrOCwgMTYsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlkY3RfZGVxdWFudF8wXzJ4X25lb24gKHErMzIsIGRxWzBdLCBwcmUrOCwgMTYsIGRzdCs4LCBzdHJpZGUpOwotCi0gICAgICAgIHEgICAgKz0gNjQ7Ci0gICAgICAgIHByZSAgKz0gNjQ7Ci0gICAgICAgIGRzdCAgKz0gNCpzdHJpZGU7Ci0gICAgICAgIGVvYnMgKz0gNDsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfbmVvbgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3R1LCB1bnNpZ25lZCBjaGFyICpkc3R2LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQotewotICAgIGlmICgoKHNob3J0ICopZW9icylbMF0gJiAweGZlZmUpCi0gICAgICAgIGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24gKHEsIGRxLCBwcmUsIGRzdHUsIDgsIHN0cmlkZSk7Ci0gICAgZWxzZQotICAgICAgICBpZGN0X2RlcXVhbnRfMF8yeF9uZW9uIChxLCBkcVswXSwgcHJlLCA4LCBkc3R1LCBzdHJpZGUpOwotCi0gICAgcSAgICArPSAzMjsKLSAgICBwcmUgICs9IDMyOwotICAgIGRzdHUgKz0gNCpzdHJpZGU7Ci0KLSAgICBpZiAoKChzaG9ydCAqKWVvYnMpWzFdICYgMHhmZWZlKQotICAgICAgICBpZGN0X2RlcXVhbnRfZnVsbF8yeF9uZW9uIChxLCBkcSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgIGVsc2UKLSAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfbmVvbiAocSwgZHFbMF0sIHByZSwgOCwgZHN0dSwgc3RyaWRlKTsKLQotICAgIHEgKz0gMzI7Ci0gICAgcHJlICs9IDMyOwotCi0gICAgaWYgKCgoc2hvcnQgKillb2JzKVsyXSAmIDB4ZmVmZSkKLSAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbiAocSwgZHEsIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICBlbHNlCi0gICAgICAgIGlkY3RfZGVxdWFudF8wXzJ4X25lb24gKHEsIGRxWzBdLCBwcmUsIDgsIGRzdHYsIHN0cmlkZSk7Ci0KLSAgICBxICAgICs9IDMyOwotICAgIHByZSAgKz0gMzI7Ci0gICAgZHN0diArPSA0KnN0cmlkZTsKLQotICAgIGlmICgoKHNob3J0ICopZW9icylbM10gJiAweGZlZmUpCi0gICAgICAgIGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24gKHEsIGRxLCBwcmUsIGRzdHYsIDgsIHN0cmlkZSk7Ci0gICAgZWxzZQotICAgICAgICBpZGN0X2RlcXVhbnRfMF8yeF9uZW9uIChxLCBkcVswXSwgcHJlLCA4LCBkc3R2LCBzdHJpZGUpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvYXJtL25lb24vaWRjdF9kZXF1YW50XzBfMnhfbmVvbi5hc20gYi92cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfMF8yeF9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2ZjhlMS4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfMF8yeF9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIGFuZCBwYXRlbnQKLTsgIGdyYW50IHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5IGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTCi07ICBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8aWRjdF9kZXF1YW50XzBfMnhfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07dm9pZCBpZGN0X2RlcXVhbnRfMF8yeF9uZW9uKHNob3J0ICpxLCBzaG9ydCBkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSk7Ci07IHIwICAgKnEKLTsgcjEgICBkcQotOyByMiAgICpwcmUKLTsgcjMgICBwaXRjaAotOyBzcCAgICpkc3QKLTsgc3ArNCBzdHJpZGUKLXxpZGN0X2RlcXVhbnRfMF8yeF9uZW9ufCBQUk9DCi0gICAgYWRkICAgICAgICAgICAgIHIxMiwgcjIsICM0Ci0gICAgdmxkMS4zMiAgICAgICAgIHtkMlswXX0sIFtyMl0sIHIzCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMlsxXX0sIFtyMl0sIHIzCi0gICAgdmxkMS4zMiAgICAgICAgIHtkNFswXX0sIFtyMl0sIHIzCi0gICAgdmxkMS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMl0KLSAgICB2bGQxLjMyICAgICAgICAge2Q4WzBdfSwgW3IxMl0sIHIzCi0gICAgdmxkMS4zMiAgICAgICAgIHtkOFsxXX0sIFtyMTJdLCByMwotICAgIHZsZDEuMzIgICAgICAgICB7ZDEwWzBdfSwgW3IxMl0sIHIzCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMTBbMV19LCBbcjEyXQotCi0gICAgbGRyaCAgICAgICAgICAgIHIxMiwgW3IwXSAgICAgICAgICAgICAgIDsgbG8gcQotICAgIGxkcmggICAgICAgICAgICByMiwgW3IwLCAjMzJdICAgICAgICAgICA7IGhpIHEKLSAgICBtb3YgICAgICAgICAgICAgcjMsICMwCi0gICAgc3RyaCAgICAgICAgICAgIHIzLCBbcjBdCi0gICAgc3RyaCAgICAgICAgICAgIHIzLCBbcjAsICMzMl0KLQotICAgIHN4dGggICAgICAgICAgICByMTIsIHIxMiAgICAgICAgICAgICAgICA7IGxvCi0gICAgbXVsICAgICAgICAgICAgIHIwLCByMTIsIHIxCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzQKLSAgICBhc3IgICAgICAgICAgICAgcjAsIHIwLCAjMwotICAgIHZkdXAuMTYgICAgICAgICBxMCwgcjAKLSAgICBzeHRoICAgICAgICAgICAgcjIsIHIyICAgICAgICAgICAgICAgICAgOyBoaQotICAgIG11bCAgICAgICAgICAgICByMCwgcjIsIHIxCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzQKLSAgICBhc3IgICAgICAgICAgICAgcjAsIHIwLCAjMwotICAgIHZkdXAuMTYgICAgICAgICBxMywgcjAKLQotICAgIHZhZGR3LnU4ICAgICAgICBxMSwgcTAsIGQyICAgICAgICAgICAgICA7IGxvCi0gICAgdmFkZHcudTggICAgICAgIHEyLCBxMCwgZDQKLSAgICB2YWRkdy51OCAgICAgICAgcTQsIHEzLCBkOCAgICAgICAgICAgICAgOyBoaQotICAgIHZhZGR3LnU4ICAgICAgICBxNSwgcTMsIGQxMAotCi0gICAgbGRyICAgICAgICAgICAgIHIyLCBbc3BdICAgICAgICAgICAgICAgIDsgZHN0Ci0gICAgbGRyICAgICAgICAgICAgIHIzLCBbc3AsICM0XSAgICAgICAgICAgIDsgc3RyaWRlCi0KLSAgICB2cW1vdnVuLnMxNiAgICAgZDIsIHExICAgICAgICAgICAgICAgICAgOyBsbwotICAgIHZxbW92dW4uczE2ICAgICBkNCwgcTIKLSAgICB2cW1vdnVuLnMxNiAgICAgZDgsIHE0ICAgICAgICAgICAgICAgICAgOyBoaQotICAgIHZxbW92dW4uczE2ICAgICBkMTAsIHE1Ci0KLSAgICBhZGQgICAgICAgICAgICAgcjAsIHIyLCAjNAotICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjJdLCByMyAgICAgICA7IGxvCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sIFtyMl0sIHIzCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMl0sIHIzCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMl0KLSAgICB2c3QxLjMyICAgICAgICAge2Q4WzBdfSwgW3IwXSwgcjMgICAgICAgOyBoaQotICAgIHZzdDEuMzIgICAgICAgICB7ZDhbMV19LCBbcjBdLCByMwotICAgIHZzdDEuMzIgICAgICAgICB7ZDEwWzBdfSwgW3IwXSwgcjMKLSAgICB2c3QxLjMyICAgICAgICAge2QxMFsxXX0sIFtyMF0KLQotICAgIGJ4ICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQICAgICAgICAgICA7IHxpZGN0X2RlcXVhbnRfMF8yeF9uZW9ufAotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvYXJtL25lb24vaWRjdF9kZXF1YW50X2RjXzBfMnhfbmVvbi5hc20gYi92cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfZGNfMF8yeF9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMDM2YS4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfZGNfMF8yeF9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2VibSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIGFuZCBwYXRlbnQKLTsgIGdyYW50IHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5IGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTCi07ICBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8aWRjdF9kZXF1YW50X2RjXzBfMnhfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07dm9pZCBpZGN0X2RlcXVhbnRfZGNfMF8yeF9uZW9uKHNob3J0ICpkYywgdW5zaWduZWQgY2hhciAqcHJlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUpOwotOyByMCAgKmRjCi07IHIxICAqcHJlCi07IHIyICAqZHN0Ci07IHIzICBzdHJpZGUKLXxpZGN0X2RlcXVhbnRfZGNfMF8yeF9uZW9ufCBQUk9DCi0gICAgbGRyICAgICAgICAgICAgIHIwLCBbcjBdICAgICAgICAgICAgICAgIDsgKmRjCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzE2Ci0KLSAgICB2bGQxLjMyICAgICAgICAge2QyWzBdfSwgW3IxXSwgcjEyICAgICAgOyBsbwotICAgIHZsZDEuMzIgICAgICAgICB7ZDJbMV19LCBbcjFdLCByMTIKLSAgICB2bGQxLjMyICAgICAgICAge2Q0WzBdfSwgW3IxXSwgcjEyCi0gICAgdmxkMS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMV0KLSAgICBzdWIgICAgICAgICAgICAgcjEsIHIxLCAjNDQKLSAgICB2bGQxLjMyICAgICAgICAge2Q4WzBdfSwgW3IxXSwgcjEyICAgICAgOyBoaQotICAgIHZsZDEuMzIgICAgICAgICB7ZDhbMV19LCBbcjFdLCByMTIKLSAgICB2bGQxLjMyICAgICAgICAge2QxMFswXX0sIFtyMV0sIHIxMgotICAgIHZsZDEuMzIgICAgICAgICB7ZDEwWzFdfSwgW3IxXQotCi0gICAgc3h0aCAgICAgICAgICAgIHIxLCByMCAgICAgICAgICAgICAgICAgIDsgbG8gKmRjCi0gICAgYWRkICAgICAgICAgICAgIHIxLCByMSwgIzQKLSAgICBhc3IgICAgICAgICAgICAgcjEsIHIxLCAjMwotICAgIHZkdXAuMTYgICAgICAgICBxMCwgcjEKLSAgICBzeHRoICAgICAgICAgICAgcjAsIHIwLCByb3IgIzE2ICAgICAgICAgOyBoaSAqZGMKLSAgICBhZGQgICAgICAgICAgICAgcjAsIHIwLCAjNAotICAgIGFzciAgICAgICAgICAgICByMCwgcjAsICMzCi0gICAgdmR1cC4xNiAgICAgICAgIHEzLCByMAotCi0gICAgdmFkZHcudTggICAgICAgIHExLCBxMCwgZDIgICAgICAgICAgICAgIDsgbG8KLSAgICB2YWRkdy51OCAgICAgICAgcTIsIHEwLCBkNAotICAgIHZhZGR3LnU4ICAgICAgICBxNCwgcTMsIGQ4ICAgICAgICAgICAgICA7IGhpCi0gICAgdmFkZHcudTggICAgICAgIHE1LCBxMywgZDEwCi0KLSAgICB2cW1vdnVuLnMxNiAgICAgZDIsIHExICAgICAgICAgICAgICAgICAgOyBsbwotICAgIHZxbW92dW4uczE2ICAgICBkNCwgcTIKLSAgICB2cW1vdnVuLnMxNiAgICAgZDgsIHE0ICAgICAgICAgICAgICAgICAgOyBoaQotICAgIHZxbW92dW4uczE2ICAgICBkMTAsIHE1Ci0KLSAgICBhZGQgICAgICAgICAgICAgcjAsIHIyLCAjNAotICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjJdLCByMyAgICAgICA7IGxvCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sIFtyMl0sIHIzCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMl0sIHIzCi0gICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMl0KLSAgICB2c3QxLjMyICAgICAgICAge2Q4WzBdfSwgW3IwXSwgcjMgICAgICAgOyBoaQotICAgIHZzdDEuMzIgICAgICAgICB7ZDhbMV19LCBbcjBdLCByMwotICAgIHZzdDEuMzIgICAgICAgICB7ZDEwWzBdfSwgW3IwXSwgcjMKLSAgICB2c3QxLjMyICAgICAgICAge2QxMFsxXX0sIFtyMF0KLQotICAgIGJ4ICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQICAgICAgICAgICA7fGlkY3RfZGVxdWFudF9kY18wXzJ4X25lb258Ci0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9uZW9uLmFzbSBiL3ZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfZGVxdWFudF9kY19mdWxsXzJ4X25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZmMzVkLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfZGVxdWFudF9kY19mdWxsXzJ4X25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2VibSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHxpZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9uZW9ufAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTt2b2lkIGlkY3RfZGVxdWFudF9kY19mdWxsXzJ4X25lb24oc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIHNob3J0ICpkYyk7Ci07IHIwICAgICpxLAotOyByMSAgICAqZHEsCi07IHIyICAgICpwcmUKLTsgcjMgICAgKmRzdAotOyBzcCAgICBzdHJpZGUKLTsgc3ArNCAgKmRjCi18aWRjdF9kZXF1YW50X2RjX2Z1bGxfMnhfbmVvbnwgUFJPQwotICAgIHZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgW3IxXSAgICAgICAgICA7IGRxIChzYW1lIGwvcikKLSAgICB2bGQxLjE2ICAgICAgICAge3EyLCBxM30sIFtyMF0gICAgICAgICAgOyBsIHEKLSAgICBtb3YgICAgICAgICAgICAgcjEsICMxNiAgICAgICAgICAgICAgICAgOyBwaXRjaAotICAgIGFkZCAgICAgICAgICAgICByMCwgcjAsICMzMgotICAgIHZsZDEuMTYgICAgICAgICB7cTQsIHE1fSwgW3IwXSAgICAgICAgICA7IHIgcQotICAgIGFkZCAgICAgICAgICAgICByMTIsIHIyLCAjNAotICAgIDsgaW50ZXJsZWF2ZSB0aGUgcHJlZGljdG9ycwotICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzBdfSwgW3IyXSwgcjEgICAgICA7IGwgcHJlCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMjhbMV19LCBbcjEyXSwgcjEgICAgIDsgciBwcmUKLSAgICB2bGQxLjMyICAgICAgICAge2QyOVswXX0sIFtyMl0sIHIxCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMjlbMV19LCBbcjEyXSwgcjEKLSAgICB2bGQxLjMyICAgICAgICAge2QzMFswXX0sIFtyMl0sIHIxCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzBbMV19LCBbcjEyXSwgcjEKLSAgICB2bGQxLjMyICAgICAgICAge2QzMVswXX0sIFtyMl0KLSAgICBsZHIgICAgICAgICAgICAgcjEsIFtzcCwgIzRdCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzFbMV19LCBbcjEyXQotCi0gICAgYWRyICAgICAgICAgICAgIHIyLCBfQ09OU1RBTlRTXwotCi0gICAgbGRyaCAgICAgICAgICAgIHIxMiwgW3IxXSwgIzIgICAgICAgICAgIDsgbG8gKmRjCi0gICAgbGRyaCAgICAgICAgICAgIHIxLCBbcjFdICAgICAgICAgICAgICAgIDsgaGkgKmRjCi0KLSAgICA7IGRlcXVhbnQ6IHFbaV0gPSBxW2ldICogZHFbaV0KLSAgICB2bXVsLmkxNiAgICAgICAgcTIsIHEyLCBxMAotICAgIHZtdWwuaTE2ICAgICAgICBxMywgcTMsIHExCi0gICAgdm11bC5pMTYgICAgICAgIHE0LCBxNCwgcTAKLSAgICB2bXVsLmkxNiAgICAgICAgcTUsIHE1LCBxMQotCi0gICAgOyBtb3ZlIGRjIHVwIHRvIG5lb24gYW5kIG92ZXJ3cml0ZSBmaXJzdCBlbGVtZW50Ci0gICAgdm1vdi4xNiAgICAgICAgIGQ0WzBdLCByMTIKLSAgICB2bW92LjE2ICAgICAgICAgZDhbMF0sIHIxCi0KLSAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3IyXQotCi0gICAgOyBxMjogbDByMCAgcTM6IGw4cjgKLSAgICA7IHE0OiBsNHI0ICBxNTogbDEycjEyCi0gICAgdnN3cCAgICAgICAgICAgIGQ1LCBkOAotICAgIHZzd3AgICAgICAgICAgICBkNywgZDEwCi0KLSAgICA7IF9DT05TVEFOVFNfICogNCwxMiA+PiAxNgotICAgIDsgcTY6ICA0ICogc2lucGkgOiBjMS90ZW1wMQotICAgIDsgcTc6IDEyICogc2lucGkgOiBkMS90ZW1wMgotICAgIDsgcTg6ICA0ICogY29zcGkKLSAgICA7IHE5OiAxMiAqIGNvc3BpCi0gICAgdnFkbXVsaC5zMTYgICAgIHE2LCBxNCwgZDBbMl0gICAgICAgICAgIDsgc2lucGk4c3FydDIKLSAgICB2cWRtdWxoLnMxNiAgICAgcTcsIHE1LCBkMFsyXQotICAgIHZxZG11bGguczE2ICAgICBxOCwgcTQsIGQwWzBdICAgICAgICAgICA7IGNvc3BpOHNxcnQybWludXMxCi0gICAgdnFkbXVsaC5zMTYgICAgIHE5LCBxNSwgZDBbMF0KLQotICAgIHZxYWRkLnMxNiAgICAgICBxMTAsIHEyLCBxMyAgICAgICAgICAgICA7IGExID0gMCArIDgKLSAgICB2cXN1Yi5zMTYgICAgICAgcTExLCBxMiwgcTMgICAgICAgICAgICAgOyBiMSA9IDAgLSA4Ci0KLSAgICA7IHZxZG11bGggb25seSBhY2NlcHRzIHNpZ25lZCB2YWx1ZXMuIHRoaXMgd2FzIGEgcHJvYmxlbSBiZWNhdXNlCi0gICAgOyBvdXIgY29uc3RhbnQgaGFkIHRoZSBoaWdoIGJpdCBzZXQsIGFuZCB3YXMgdHJlYXRlZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgotICAgIDsgdnFkbXVsaCBhbHNvIGRvdWJsZXMgdGhlIHZhbHVlIGJlZm9yZSBpdCBzaGlmdHMgYnkgMTYuIHdlIG5lZWQgdG8KLSAgICA7IGNvbXBlbnNhdGUgZm9yIHRoaXMuIGluIHRoZSBjYXNlIG9mIHNpbnBpOHNxcnQyLCB0aGUgbG93ZXN0IGJpdCBpcyAwLAotICAgIDsgc28gd2UgY2FuIHNoaWZ0IHRoZSBjb25zdGFudCB3aXRob3V0IGxvc2luZyBwcmVjaXNpb24uIHRoaXMgYXZvaWRzCi0gICAgOyBzaGlmdCBhZ2FpbiBhZnRlcndhcmQsIGJ1dCBhbHNvIGF2b2lkcyB0aGUgc2lnbiBpc3N1ZS4gd2luIHdpbiEKLSAgICA7IGZvciBjb3NwaThzcXJ0Mm1pbnVzMSB0aGUgbG93ZXN0IGJpdCBpcyAxLCBzbyB3ZSBsb3NlIHByZWNpc2lvbiBpZiB3ZQotICAgIDsgcHJlLXNoaWZ0IGl0Ci0gICAgdnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEKLSAgICB2c2hyLnMxNiAgICAgICAgcTksIHE5LCAjMQotCi0gICAgOyBxNDogIDQgKyAgNCAqIGNvc3BpIDogZDEvdGVtcDEKLSAgICA7IHE1OiAxMiArIDEyICogY29zcGkgOiBjMS90ZW1wMgotICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTQsIHE4Ci0gICAgdnFhZGQuczE2ICAgICAgIHE1LCBxNSwgcTkKLQotICAgIDsgYzEgPSB0ZW1wMSAtIHRlbXAyCi0gICAgOyBkMSA9IHRlbXAxICsgdGVtcDIKLSAgICB2cXN1Yi5zMTYgICAgICAgcTIsIHE2LCBxNQotICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTQsIHE3Ci0KLSAgICA7IFswXTogYTErZDEKLSAgICA7IFsxXTogYjErYzEKLSAgICA7IFsyXTogYjEtYzEKLSAgICA7IFszXTogYTEtZDEKLSAgICB2cWFkZC5zMTYgICAgICAgcTQsIHExMCwgcTMKLSAgICB2cWFkZC5zMTYgICAgICAgcTUsIHExMSwgcTIKLSAgICB2cXN1Yi5zMTYgICAgICAgcTYsIHExMSwgcTIKLSAgICB2cXN1Yi5zMTYgICAgICAgcTcsIHExMCwgcTMKLQotICAgIDsgcm90YXRlCi0gICAgdnRybi4zMiAgICAgICAgIHE0LCBxNgotICAgIHZ0cm4uMzIgICAgICAgICBxNSwgcTcKLSAgICB2dHJuLjE2ICAgICAgICAgcTQsIHE1Ci0gICAgdnRybi4xNiAgICAgICAgIHE2LCBxNwotICAgIDsgaWRjdCBsb29wIDIKLSAgICA7IHE0OiBsIDAsIDQsIDgsMTIgciAwLCA0LCA4LDEyCi0gICAgOyBxNTogbCAxLCA1LCA5LDEzIHIgMSwgNSwgOSwxMwotICAgIDsgcTY6IGwgMiwgNiwxMCwxNCByIDIsIDYsMTAsMTQKLSAgICA7IHE3OiBsIDMsIDcsMTEsMTUgciAzLCA3LDExLDE1Ci0KLSAgICA7IHE4OiAgMSAqIHNpbnBpIDogYzEvdGVtcDEKLSAgICA7IHE5OiAgMyAqIHNpbnBpIDogZDEvdGVtcDIKLSAgICA7IHExMDogMSAqIGNvc3BpCi0gICAgOyBxMTE6IDMgKiBjb3NwaQotICAgIHZxZG11bGguczE2ICAgICBxOCwgcTUsIGQwWzJdICAgICAgICAgICA7IHNpbnBpOHNxcnQyCi0gICAgdnFkbXVsaC5zMTYgICAgIHE5LCBxNywgZDBbMl0KLSAgICB2cWRtdWxoLnMxNiAgICAgcTEwLCBxNSwgZDBbMF0gICAgICAgICAgOyBjb3NwaThzcXJ0Mm1pbnVzMQotICAgIHZxZG11bGguczE2ICAgICBxMTEsIHE3LCBkMFswXQotCi0gICAgdnFhZGQuczE2ICAgICAgIHEyLCBxNCwgcTYgICAgICAgICAgICAgOyBhMSA9IDAgKyAyCi0gICAgdnFzdWIuczE2ICAgICAgIHEzLCBxNCwgcTYgICAgICAgICAgICAgOyBiMSA9IDAgLSAyCi0KLSAgICA7IHNlZSBub3RlIG9uIHNoaWZ0aW5nIGFib3ZlCi0gICAgdnNoci5zMTYgICAgICAgIHExMCwgcTEwLCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxMTEsIHExMSwgIzEKLQotICAgIDsgcTEwOiAxICsgMSAqIGNvc3BpIDogZDEvdGVtcDEKLSAgICA7IHExMTogMyArIDMgKiBjb3NwaSA6IGMxL3RlbXAyCi0gICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTUsIHExMAotICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHE3LCBxMTEKLQotICAgIDsgcTg6IGMxID0gdGVtcDEgLSB0ZW1wMgotICAgIDsgcTk6IGQxID0gdGVtcDEgKyB0ZW1wMgotICAgIHZxc3ViLnMxNiAgICAgICBxOCwgcTgsIHExMQotICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTEwLCBxOQotCi0gICAgOyBhMStkMQotICAgIDsgYjErYzEKLSAgICA7IGIxLWMxCi0gICAgOyBhMS1kMQotICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTIsIHE5Ci0gICAgdnFhZGQuczE2ICAgICAgIHE1LCBxMywgcTgKLSAgICB2cXN1Yi5zMTYgICAgICAgcTYsIHEzLCBxOAotICAgIHZxc3ViLnMxNiAgICAgICBxNywgcTIsIHE5Ci0KLSAgICA7ICs0ID4+IDMgKHJvdW5kaW5nKQotICAgIHZyc2hyLnMxNiAgICAgICBxNCwgcTQsICMzICAgICAgICAgICAgICA7IGxvCi0gICAgdnJzaHIuczE2ICAgICAgIHE1LCBxNSwgIzMKLSAgICB2cnNoci5zMTYgICAgICAgcTYsIHE2LCAjMyAgICAgICAgICAgICAgOyBoaQotICAgIHZyc2hyLnMxNiAgICAgICBxNywgcTcsICMzCi0KLSAgICB2dHJuLjMyICAgICAgICAgcTQsIHE2Ci0gICAgdnRybi4zMiAgICAgICAgIHE1LCBxNwotICAgIHZ0cm4uMTYgICAgICAgICBxNCwgcTUKLSAgICB2dHJuLjE2ICAgICAgICAgcTYsIHE3Ci0KLSAgICA7IGFkZGluZyBwcmUKLSAgICA7IGlucHV0IGlzIHN0aWxsIHBhY2tlZC4gcHJlIHdhcyByZWFkIGludGVybGVhdmVkCi0gICAgdmFkZHcudTggICAgICAgIHE0LCBxNCwgZDI4Ci0gICAgdmFkZHcudTggICAgICAgIHE1LCBxNSwgZDI5Ci0gICAgdmFkZHcudTggICAgICAgIHE2LCBxNiwgZDMwCi0gICAgdmFkZHcudTggICAgICAgIHE3LCBxNywgZDMxCi0KLSAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAotICAgIHZtb3YgICAgICAgICAgICBxMTUsIHExNAotICAgIHZzdDEuMTYgICAgICAgICB7cTE0LCBxMTV9LCBbcjBdICAgICAgICA7IHdyaXRlIG92ZXIgaGlnaCBpbnB1dAotICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMzMgotICAgIHZzdDEuMTYgICAgICAgICB7cTE0LCBxMTV9LCBbcjBdICAgICAgICA7IHdyaXRlIG92ZXIgbG93IGlucHV0Ci0KLSAgICA7c2F0dXJhdGUgYW5kIG5hcnJvdwotICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTQgICAgICAgICAgICAgICAgICA7IGxvCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQxLCBxNQotICAgIHZxbW92dW4uczE2ICAgICBkMiwgcTYgICAgICAgICAgICAgICAgICA7IGhpCi0gICAgdnFtb3Z1bi5zMTYgICAgIGQzLCBxNwotCi0gICAgbGRyICAgICAgICAgICAgIHIxLCBbc3BdICAgICAgICAgICAgICAgIDsgc3RyaWRlCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMywgIzQgICAgICAgICAgICAgIDsgaGkKLSAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgW3IzXSwgcjEgICAgICAgOyBsbwotICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCBbcjJdLCByMSAgICAgICA7IGhpCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyM10sIHIxCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVsxXX0sIFtyMl0sIHIxCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sIFtyM10sIHIxCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sIFtyMl0sIHIxCi0gICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sIFtyM10KLSAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgW3IyXQotCi0gICAgYnggICAgICAgICAgICAgbHIKLQotICAgIEVORFAgICAgICAgICAgIDsgfGlkY3RfZGVxdWFudF9kY19mdWxsXzJ4X25lb258Ci0KLTsgQ29uc3RhbnQgUG9vbAotX0NPTlNUQU5UU18KLWNvc3BpOHNxcnQybWludXMxIERDRCAweDRlN2IKLTsgYmVjYXVzZSB0aGUgbG93ZXN0IGJpdCBpbiAweDhhOGMgaXMgMCwgd2UgY2FuIHByZS1zaGlmdCB0aGlzCi1zaW5waThzcXJ0MiAgICAgICBEQ0QgMHg0NTQ2Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2FybS9uZW9uL2lkY3RfZGVxdWFudF9mdWxsXzJ4X25lb24uYXNtIGIvdnA4L2RlY29kZXIvYXJtL25lb24vaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjc4NTkuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvYXJtL25lb24vaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJtIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotO3ZvaWQgaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbihzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmUsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHBpdGNoLCBpbnQgc3RyaWRlKTsKLTsgcjAgICAgKnEsCi07IHIxICAgICpkcSwKLTsgcjIgICAgKnByZQotOyByMyAgICAqZHN0Ci07IHNwICAgIHBpdGNoCi07IHNwKzQgIHN0cmlkZQotfGlkY3RfZGVxdWFudF9mdWxsXzJ4X25lb258IFBST0MKLSAgICB2bGQxLjE2ICAgICAgICAge3EwLCBxMX0sIFtyMV0gICAgICAgICAgOyBkcSAoc2FtZSBsL3IpCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMiwgcTN9LCBbcjBdICAgICAgICAgIDsgbCBxCi0gICAgbGRyICAgICAgICAgICAgIHIxLCBbc3BdICAgICAgICAgICAgICAgIDsgcGl0Y2gKLSAgICBhZGQgICAgICAgICAgICAgcjAsIHIwLCAjMzIKLSAgICB2bGQxLjE2ICAgICAgICAge3E0LCBxNX0sIFtyMF0gICAgICAgICAgOyByIHEKLSAgICBhZGQgICAgICAgICAgICAgcjEyLCByMiwgIzQKLSAgICA7IGludGVybGVhdmUgdGhlIHByZWRpY3RvcnMKLSAgICB2bGQxLjMyICAgICAgICAge2QyOFswXX0sIFtyMl0sIHIxICAgICAgOyBsIHByZQotICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzFdfSwgW3IxMl0sIHIxICAgICA7IHIgcHJlCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMjlbMF19LCBbcjJdLCByMQotICAgIHZsZDEuMzIgICAgICAgICB7ZDI5WzFdfSwgW3IxMl0sIHIxCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzBbMF19LCBbcjJdLCByMQotICAgIHZsZDEuMzIgICAgICAgICB7ZDMwWzFdfSwgW3IxMl0sIHIxCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzFbMF19LCBbcjJdCi0gICAgdmxkMS4zMiAgICAgICAgIHtkMzFbMV19LCBbcjEyXQotCi0gICAgYWRyICAgICAgICAgICAgIHIyLCBfQ09OU1RBTlRTXwotCi0gICAgOyBkZXF1YW50OiBxW2ldID0gcVtpXSAqIGRxW2ldCi0gICAgdm11bC5pMTYgICAgICAgIHEyLCBxMiwgcTAKLSAgICB2bXVsLmkxNiAgICAgICAgcTMsIHEzLCBxMQotICAgIHZtdWwuaTE2ICAgICAgICBxNCwgcTQsIHEwCi0gICAgdm11bC5pMTYgICAgICAgIHE1LCBxNSwgcTEKLQotICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjJdCi0KLSAgICA7IHEyOiBsMHIwICBxMzogbDhyOAotICAgIDsgcTQ6IGw0cjQgIHE1OiBsMTJyMTIKLSAgICB2c3dwICAgICAgICAgICAgZDUsIGQ4Ci0gICAgdnN3cCAgICAgICAgICAgIGQ3LCBkMTAKLQotICAgIDsgX0NPTlNUQU5UU18gKiA0LDEyID4+IDE2Ci0gICAgOyBxNjogIDQgKiBzaW5waSA6IGMxL3RlbXAxCi0gICAgOyBxNzogMTIgKiBzaW5waSA6IGQxL3RlbXAyCi0gICAgOyBxODogIDQgKiBjb3NwaQotICAgIDsgcTk6IDEyICogY29zcGkKLSAgICB2cWRtdWxoLnMxNiAgICAgcTYsIHE0LCBkMFsyXSAgICAgICAgICAgOyBzaW5waThzcXJ0MgotICAgIHZxZG11bGguczE2ICAgICBxNywgcTUsIGQwWzJdCi0gICAgdnFkbXVsaC5zMTYgICAgIHE4LCBxNCwgZDBbMF0gICAgICAgICAgIDsgY29zcGk4c3FydDJtaW51czEKLSAgICB2cWRtdWxoLnMxNiAgICAgcTksIHE1LCBkMFswXQotCi0gICAgdnFhZGQuczE2ICAgICAgIHExMCwgcTIsIHEzICAgICAgICAgICAgIDsgYTEgPSAwICsgOAotICAgIHZxc3ViLnMxNiAgICAgICBxMTEsIHEyLCBxMyAgICAgICAgICAgICA7IGIxID0gMCAtIDgKLQotICAgIDsgdnFkbXVsaCBvbmx5IGFjY2VwdHMgc2lnbmVkIHZhbHVlcy4gdGhpcyB3YXMgYSBwcm9ibGVtIGJlY2F1c2UKLSAgICA7IG91ciBjb25zdGFudCBoYWQgdGhlIGhpZ2ggYml0IHNldCwgYW5kIHdhcyB0cmVhdGVkIGFzIGEgbmVnYXRpdmUgdmFsdWUuCi0gICAgOyB2cWRtdWxoIGFsc28gZG91YmxlcyB0aGUgdmFsdWUgYmVmb3JlIGl0IHNoaWZ0cyBieSAxNi4gd2UgbmVlZCB0bwotICAgIDsgY29tcGVuc2F0ZSBmb3IgdGhpcy4gaW4gdGhlIGNhc2Ugb2Ygc2lucGk4c3FydDIsIHRoZSBsb3dlc3QgYml0IGlzIDAsCi0gICAgOyBzbyB3ZSBjYW4gc2hpZnQgdGhlIGNvbnN0YW50IHdpdGhvdXQgbG9zaW5nIHByZWNpc2lvbi4gdGhpcyBhdm9pZHMKLSAgICA7IHNoaWZ0IGFnYWluIGFmdGVyd2FyZCwgYnV0IGFsc28gYXZvaWRzIHRoZSBzaWduIGlzc3VlLiB3aW4gd2luIQotICAgIDsgZm9yIGNvc3BpOHNxcnQybWludXMxIHRoZSBsb3dlc3QgYml0IGlzIDEsIHNvIHdlIGxvc2UgcHJlY2lzaW9uIGlmIHdlCi0gICAgOyBwcmUtc2hpZnQgaXQKLSAgICB2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxOSwgcTksICMxCi0KLSAgICA7IHE0OiAgNCArICA0ICogY29zcGkgOiBkMS90ZW1wMQotICAgIDsgcTU6IDEyICsgMTIgKiBjb3NwaSA6IGMxL3RlbXAyCi0gICAgdnFhZGQuczE2ICAgICAgIHE0LCBxNCwgcTgKLSAgICB2cWFkZC5zMTYgICAgICAgcTUsIHE1LCBxOQotCi0gICAgOyBjMSA9IHRlbXAxIC0gdGVtcDIKLSAgICA7IGQxID0gdGVtcDEgKyB0ZW1wMgotICAgIHZxc3ViLnMxNiAgICAgICBxMiwgcTYsIHE1Ci0gICAgdnFhZGQuczE2ICAgICAgIHEzLCBxNCwgcTcKLQotICAgIDsgWzBdOiBhMStkMQotICAgIDsgWzFdOiBiMStjMQotICAgIDsgWzJdOiBiMS1jMQotICAgIDsgWzNdOiBhMS1kMQotICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTEwLCBxMwotICAgIHZxYWRkLnMxNiAgICAgICBxNSwgcTExLCBxMgotICAgIHZxc3ViLnMxNiAgICAgICBxNiwgcTExLCBxMgotICAgIHZxc3ViLnMxNiAgICAgICBxNywgcTEwLCBxMwotCi0gICAgOyByb3RhdGUKLSAgICB2dHJuLjMyICAgICAgICAgcTQsIHE2Ci0gICAgdnRybi4zMiAgICAgICAgIHE1LCBxNwotICAgIHZ0cm4uMTYgICAgICAgICBxNCwgcTUKLSAgICB2dHJuLjE2ICAgICAgICAgcTYsIHE3Ci0gICAgOyBpZGN0IGxvb3AgMgotICAgIDsgcTQ6IGwgMCwgNCwgOCwxMiByIDAsIDQsIDgsMTIKLSAgICA7IHE1OiBsIDEsIDUsIDksMTMgciAxLCA1LCA5LDEzCi0gICAgOyBxNjogbCAyLCA2LDEwLDE0IHIgMiwgNiwxMCwxNAotICAgIDsgcTc6IGwgMywgNywxMSwxNSByIDMsIDcsMTEsMTUKLQotICAgIDsgcTg6ICAxICogc2lucGkgOiBjMS90ZW1wMQotICAgIDsgcTk6ICAzICogc2lucGkgOiBkMS90ZW1wMgotICAgIDsgcTEwOiAxICogY29zcGkKLSAgICA7IHExMTogMyAqIGNvc3BpCi0gICAgdnFkbXVsaC5zMTYgICAgIHE4LCBxNSwgZDBbMl0gICAgICAgICAgIDsgc2lucGk4c3FydDIKLSAgICB2cWRtdWxoLnMxNiAgICAgcTksIHE3LCBkMFsyXQotICAgIHZxZG11bGguczE2ICAgICBxMTAsIHE1LCBkMFswXSAgICAgICAgICA7IGNvc3BpOHNxcnQybWludXMxCi0gICAgdnFkbXVsaC5zMTYgICAgIHExMSwgcTcsIGQwWzBdCi0KLSAgICB2cWFkZC5zMTYgICAgICAgcTIsIHE0LCBxNiAgICAgICAgICAgICA7IGExID0gMCArIDIKLSAgICB2cXN1Yi5zMTYgICAgICAgcTMsIHE0LCBxNiAgICAgICAgICAgICA7IGIxID0gMCAtIDIKLQotICAgIDsgc2VlIG5vdGUgb24gc2hpZnRpbmcgYWJvdmUKLSAgICB2c2hyLnMxNiAgICAgICAgcTEwLCBxMTAsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHExMSwgcTExLCAjMQotCi0gICAgOyBxMTA6IDEgKyAxICogY29zcGkgOiBkMS90ZW1wMQotICAgIDsgcTExOiAzICsgMyAqIGNvc3BpIDogYzEvdGVtcDIKLSAgICB2cWFkZC5zMTYgICAgICAgcTEwLCBxNSwgcTEwCi0gICAgdnFhZGQuczE2ICAgICAgIHExMSwgcTcsIHExMQotCi0gICAgOyBxODogYzEgPSB0ZW1wMSAtIHRlbXAyCi0gICAgOyBxOTogZDEgPSB0ZW1wMSArIHRlbXAyCi0gICAgdnFzdWIuczE2ICAgICAgIHE4LCBxOCwgcTExCi0gICAgdnFhZGQuczE2ICAgICAgIHE5LCBxMTAsIHE5Ci0KLSAgICA7IGExK2QxCi0gICAgOyBiMStjMQotICAgIDsgYjEtYzEKLSAgICA7IGExLWQxCi0gICAgdnFhZGQuczE2ICAgICAgIHE0LCBxMiwgcTkKLSAgICB2cWFkZC5zMTYgICAgICAgcTUsIHEzLCBxOAotICAgIHZxc3ViLnMxNiAgICAgICBxNiwgcTMsIHE4Ci0gICAgdnFzdWIuczE2ICAgICAgIHE3LCBxMiwgcTkKLQotICAgIDsgKzQgPj4gMyAocm91bmRpbmcpCi0gICAgdnJzaHIuczE2ICAgICAgIHE0LCBxNCwgIzMgICAgICAgICAgICAgIDsgbG8KLSAgICB2cnNoci5zMTYgICAgICAgcTUsIHE1LCAjMwotICAgIHZyc2hyLnMxNiAgICAgICBxNiwgcTYsICMzICAgICAgICAgICAgICA7IGhpCi0gICAgdnJzaHIuczE2ICAgICAgIHE3LCBxNywgIzMKLQotICAgIHZ0cm4uMzIgICAgICAgICBxNCwgcTYKLSAgICB2dHJuLjMyICAgICAgICAgcTUsIHE3Ci0gICAgdnRybi4xNiAgICAgICAgIHE0LCBxNQotICAgIHZ0cm4uMTYgICAgICAgICBxNiwgcTcKLQotICAgIDsgYWRkaW5nIHByZQotICAgIDsgaW5wdXQgaXMgc3RpbGwgcGFja2VkLiBwcmUgd2FzIHJlYWQgaW50ZXJsZWF2ZWQKLSAgICB2YWRkdy51OCAgICAgICAgcTQsIHE0LCBkMjgKLSAgICB2YWRkdy51OCAgICAgICAgcTUsIHE1LCBkMjkKLSAgICB2YWRkdy51OCAgICAgICAgcTYsIHE2LCBkMzAKLSAgICB2YWRkdy51OCAgICAgICAgcTcsIHE3LCBkMzEKLQotICAgIHZtb3YuaTE2ICAgICAgICBxMTQsICMwCi0gICAgdm1vdiAgICAgICAgICAgIHExNSwgcTE0Ci0gICAgdnN0MS4xNiAgICAgICAgIHtxMTQsIHExNX0sIFtyMF0gICAgICAgIDsgd3JpdGUgb3ZlciBoaWdoIGlucHV0Ci0gICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzMyCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTQsIHExNX0sIFtyMF0gICAgICAgIDsgd3JpdGUgb3ZlciBsb3cgaW5wdXQKLQotICAgIDtzYXR1cmF0ZSBhbmQgbmFycm93Ci0gICAgdnFtb3Z1bi5zMTYgICAgIGQwLCBxNCAgICAgICAgICAgICAgICAgIDsgbG8KLSAgICB2cW1vdnVuLnMxNiAgICAgZDEsIHE1Ci0gICAgdnFtb3Z1bi5zMTYgICAgIGQyLCBxNiAgICAgICAgICAgICAgICAgIDsgaGkKLSAgICB2cW1vdnVuLnMxNiAgICAgZDMsIHE3Ci0KLSAgICBsZHIgICAgICAgICAgICAgcjEsIFtzcCwgIzRdICAgICAgICAgICAgOyBzdHJpZGUKLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIzLCAjNCAgICAgICAgICAgICAgOyBoaQotICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCBbcjNdLCByMSAgICAgICA7IGxvCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMFsxXX0sIFtyMl0sIHIxICAgICAgIDsgaGkKLSAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgW3IzXSwgcjEKLSAgICB2c3QxLjMyICAgICAgICAge2QxWzFdfSwgW3IyXSwgcjEKLSAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgW3IzXSwgcjEKLSAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgW3IyXSwgcjEKLSAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgW3IzXQotICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMV19LCBbcjJdCi0KLSAgICBieCAgICAgICAgICAgICBscgotCi0gICAgRU5EUCAgICAgICAgICAgOyB8aWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbnwKLQotOyBDb25zdGFudCBQb29sCi1fQ09OU1RBTlRTXwotY29zcGk4c3FydDJtaW51czEgRENEIDB4NGU3YgotOyBiZWNhdXNlIHRoZSBsb3dlc3QgYml0IGluIDB4OGE4YyBpcyAwLCB3ZSBjYW4gcHJlLXNoaWZ0IHRoaXMKLXNpbnBpOHNxcnQyICAgICAgIERDRCAweDQ1NDYKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMgYi92cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4NWNiNC4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9hc21fZGVjX29mZnNldHMuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAib255eGRfaW50LmgiCi0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBpbnQgc3ltID0gdmFsOwotCi0vKgotI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKLSovCi0KLS8qCi0gKiBpbnQgbWFpbih2b2lkKQotICogewotICovCi0KLURFRklORShkZXRva19zY2FuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKERFVE9LLCBzY2FuKSk7Ci1ERUZJTkUoZGV0b2tfcHRyX2Jsb2NrMmxlZnRhYm92ZSwgICAgICAgICAgICAgICBvZmZzZXRvZihERVRPSywgcHRyX2Jsb2NrMmxlZnRhYm92ZSkpOwotREVGSU5FKGRldG9rX2NvZWZfdHJlZV9wdHIsICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoREVUT0ssIHZwOF9jb2VmX3RyZWVfcHRyKSk7Ci1ERUZJTkUoZGV0b2tfdGViX2Jhc2VfcHRyLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihERVRPSywgdGViX2Jhc2VfcHRyKSk7Ci1ERUZJTkUoZGV0b2tfbm9ybV9wdHIsICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihERVRPSywgbm9ybV9wdHIpKTsKLURFRklORShkZXRva19wdHJfY29lZl9iYW5kc194LCAgICAgICAgICAgICAgICAgIG9mZnNldG9mKERFVE9LLCBwdHJfY29lZl9iYW5kc194KSk7Ci0KLURFRklORShkZXRva19BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKERFVE9LLCBBKSk7Ci1ERUZJTkUoZGV0b2tfTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihERVRPSywgTCkpOwotCi1ERUZJTkUoZGV0b2tfcWNvZWZmX3N0YXJ0X3B0ciwgICAgICAgICAgICAgICAgICBvZmZzZXRvZihERVRPSywgcWNvZWZmX3N0YXJ0X3B0cikpOwotREVGSU5FKGRldG9rX2N1cnJlbnRfYmMsICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoREVUT0ssIGN1cnJlbnRfYmMpKTsKLURFRklORShkZXRva19jb2VmX3Byb2JzLCAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKERFVE9LLCBjb2VmX3Byb2JzKSk7Ci1ERUZJTkUoZGV0b2tfZW9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihERVRPSywgZW9iKSk7Ci0KLURFRklORShib29sX2RlY29kZXJfdXNlcl9idWZmZXJfZW5kLCAgICAgICAgICAgIG9mZnNldG9mKEJPT0xfREVDT0RFUiwgdXNlcl9idWZmZXJfZW5kKSk7Ci1ERUZJTkUoYm9vbF9kZWNvZGVyX3VzZXJfYnVmZmVyLCAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIHVzZXJfYnVmZmVyKSk7Ci1ERUZJTkUoYm9vbF9kZWNvZGVyX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIHZhbHVlKSk7Ci1ERUZJTkUoYm9vbF9kZWNvZGVyX2NvdW50LCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIGNvdW50KSk7Ci1ERUZJTkUoYm9vbF9kZWNvZGVyX3JhbmdlLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCT09MX0RFQ09ERVIsIHJhbmdlKSk7Ci0KLURFRklORSh0b2tlbmV4dHJhYml0c19taW5fdmFsLCAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFRPS0VORVhUUkFCSVRTLCBtaW5fdmFsKSk7Ci1ERUZJTkUodG9rZW5leHRyYWJpdHNfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihUT0tFTkVYVFJBQklUUywgTGVuZ3RoKSk7Ci0KLS8vYWRkIGFzc2VydHMgZm9yIGFueSBvZmZzZXQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFzc2VtYmx5IGNvZGUKLS8vYWRkIGFzc2VydHMgZm9yIGFueSBzaXplIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBhc3NlbWJseSBjb2RlCi0vKgotICogcmV0dXJuIDA7Ci0gKiB9Ci0gKi8KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2Rib29saHVmZi5jIGIvdnA4L2RlY29kZXIvZGJvb2xodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjdkNTEuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvZGJvb2xodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgImRib29saHVmZi5oIgotI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLQotREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB1bnNpZ25lZCBjaGFyLCB2cDhkeF9iaXRyZWFkZXJfbm9ybVsyNTZdKSA9Ci17Ci0gICAgMCwgNywgNiwgNiwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi0KLWludCB2cDhkeF9zdGFydF9kZWNvZGUoQk9PTF9ERUNPREVSICpiciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3N6KQotewotICAgIGJyLT51c2VyX2J1ZmZlcl9lbmQgPSBzb3VyY2Urc291cmNlX3N6OwotICAgIGJyLT51c2VyX2J1ZmZlciAgICAgPSBzb3VyY2U7Ci0gICAgYnItPnZhbHVlICAgID0gMDsKLSAgICBici0+Y291bnQgICAgPSAtODsKLSAgICBici0+cmFuZ2UgICAgPSAyNTU7Ci0KLSAgICBpZiAoc291cmNlX3N6ICYmICFzb3VyY2UpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLyogUG9wdWxhdGUgdGhlIGJ1ZmZlciAqLwotICAgIHZwOGR4X2Jvb2xfZGVjb2Rlcl9maWxsKGJyKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLXZvaWQgdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwoQk9PTF9ERUNPREVSICpicikKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZwdHI7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZW5kOwotICAgIFZQOF9CRF9WQUxVRSAgICAgICAgIHZhbHVlOwotICAgIGludCAgICAgICAgICAgICAgICAgIGNvdW50OwotICAgIGJ1ZmVuZCA9IGJyLT51c2VyX2J1ZmZlcl9lbmQ7Ci0gICAgYnVmcHRyID0gYnItPnVzZXJfYnVmZmVyOwotICAgIHZhbHVlID0gYnItPnZhbHVlOwotICAgIGNvdW50ID0gYnItPmNvdW50OwotCi0gICAgVlA4RFhfQk9PTF9ERUNPREVSX0ZJTEwoY291bnQsIHZhbHVlLCBidWZwdHIsIGJ1ZmVuZCk7Ci0KLSAgICBici0+dXNlcl9idWZmZXIgPSBidWZwdHI7Ci0gICAgYnItPnZhbHVlID0gdmFsdWU7Ci0gICAgYnItPmNvdW50ID0gY291bnQ7Ci19CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9kYm9vbGh1ZmYuaCBiL3ZwOC9kZWNvZGVyL2Rib29saHVmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODNlM2YwLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL2Rib29saHVmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIERCT09MSFVGRl9ICi0jZGVmaW5lIERCT09MSFVGRl9ICi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKLSNpbmNsdWRlICJ2cHgvdnB4X2ludGVnZXIuaCIKLQotdHlwZWRlZiBzaXplX3QgVlA4X0JEX1ZBTFVFOwotCi0jIGRlZmluZSBWUDhfQkRfVkFMVUVfU0laRSAoKGludClzaXplb2YoVlA4X0JEX1ZBTFVFKSpDSEFSX0JJVCkKLS8qVGhpcyBpcyBtZWFudCB0byBiZSBhIGxhcmdlLCBwb3NpdGl2ZSBjb25zdGFudCB0aGF0IGNhbiBzdGlsbCBiZSBlZmZpY2llbnRseQotICAgbG9hZGVkIGFzIGFuIGltbWVkaWF0ZSAob24gcGxhdGZvcm1zIGxpa2UgQVJNLCBmb3IgZXhhbXBsZSkuCi0gIEV2ZW4gcmVsYXRpdmVseSBtb2Rlc3QgdmFsdWVzIGxpa2UgMTAwIHdvdWxkIHdvcmsgZmluZS4qLwotIyBkZWZpbmUgVlA4X0xPVFNfT0ZfQklUUyAoMHg0MDAwMDAwMCkKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyX2J1ZmZlcl9lbmQ7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9idWZmZXI7Ci0gICAgVlA4X0JEX1ZBTFVFICAgICAgICAgdmFsdWU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgY291bnQ7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgcmFuZ2U7Ci19IEJPT0xfREVDT0RFUjsKLQotREVDTEFSRV9BTElHTkVEKDE2LCBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciwgdnA4ZHhfYml0cmVhZGVyX25vcm1bMjU2XSk7Ci0KLWludCB2cDhkeF9zdGFydF9kZWNvZGUoQk9PTF9ERUNPREVSICpiciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3N6KTsKLQotdm9pZCB2cDhkeF9ib29sX2RlY29kZXJfZmlsbChCT09MX0RFQ09ERVIgKmJyKTsKLQotLypUaGUgcmVmaWxsIGxvb3AgaXMgdXNlZCBpbiBzZXZlcmFsIHBsYWNlcywgc28gZGVmaW5lIGl0IGluIGEgbWFjcm8gdG8gbWFrZQotICAgc3VyZSB0aGV5J3JlIGFsbCBjb25zaXN0ZW50LgotICBBbiBpbmxpbmUgZnVuY3Rpb24gd291bGQgYmUgY2xlYW5lciwgYnV0IGhhcyBhIHNpZ25pZmljYW50IHBlbmFsdHksIGJlY2F1c2UKLSAgIG11bHRpcGxlIEJPT0xfREVDT0RFUiBmaWVsZHMgbXVzdCBiZSBtb2RpZmllZCwgYW5kIHRoZSBjb21waWxlciBpcyBub3Qgc21hcnQKLSAgIGVub3VnaCB0byBlbGltaW5hdGUgdGhlIHN0b3JlcyB0byB0aG9zZSBmaWVsZHMgYW5kIHRoZSBzdWJzZXF1ZW50IHJlbG9hZHMKLSAgIGZyb20gdGhlbSB3aGVuIGlubGluaW5nIHRoZSBmdW5jdGlvbi4qLwotI2RlZmluZSBWUDhEWF9CT09MX0RFQ09ERVJfRklMTChfY291bnQsX3ZhbHVlLF9idWZwdHIsX2J1ZmVuZCkgXAotICAgIGRvIFwKLSAgICB7IFwKLSAgICAgICAgaW50IHNoaWZ0OyBcCi0gICAgICAgIGZvcihzaGlmdCA9IFZQOF9CRF9WQUxVRV9TSVpFIC0gOCAtICgoX2NvdW50KSArIDgpOyBzaGlmdCA+PSAwOyApIFwKLSAgICAgICAgeyBcCi0gICAgICAgICAgICBpZigoX2J1ZnB0cikgPj0gKF9idWZlbmQpKSB7IFwKLSAgICAgICAgICAgICAgICAoX2NvdW50KSA9IFZQOF9MT1RTX09GX0JJVFM7IFwKLSAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAoX2NvdW50KSArPSA4OyBcCi0gICAgICAgICAgICAoX3ZhbHVlKSB8PSAoVlA4X0JEX1ZBTFVFKSooX2J1ZnB0cikrKyA8PCBzaGlmdDsgXAotICAgICAgICAgICAgc2hpZnQgLT0gODsgXAotICAgICAgICB9IFwKLSAgICB9IFwKLSAgICB3aGlsZSgwKQotCi0KLXN0YXRpYyBpbnQgdnA4ZHhfZGVjb2RlX2Jvb2woQk9PTF9ERUNPREVSICpiciwgaW50IHByb2JhYmlsaXR5KSB7Ci0gICAgdW5zaWduZWQgaW50IGJpdCA9IDA7Ci0gICAgVlA4X0JEX1ZBTFVFIHZhbHVlOwotICAgIHVuc2lnbmVkIGludCBzcGxpdDsKLSAgICBWUDhfQkRfVkFMVUUgYmlnc3BsaXQ7Ci0gICAgaW50IGNvdW50OwotICAgIHVuc2lnbmVkIGludCByYW5nZTsKLQotICAgIHZhbHVlID0gYnItPnZhbHVlOwotICAgIGNvdW50ID0gYnItPmNvdW50OwotICAgIHJhbmdlID0gYnItPnJhbmdlOwotCi0gICAgc3BsaXQgPSAxICsgKCgocmFuZ2UgLSAxKSAqIHByb2JhYmlsaXR5KSA+PiA4KTsKLSAgICBiaWdzcGxpdCA9IChWUDhfQkRfVkFMVUUpc3BsaXQgPDwgKFZQOF9CRF9WQUxVRV9TSVpFIC0gOCk7Ci0KLSAgICByYW5nZSA9IHNwbGl0OwotCi0gICAgaWYgKHZhbHVlID49IGJpZ3NwbGl0KQotICAgIHsKLSAgICAgICAgcmFuZ2UgPSBici0+cmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgdmFsdWUgPSB2YWx1ZSAtIGJpZ3NwbGl0OwotICAgICAgICBiaXQgPSAxOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHNoaWZ0ID0gdnA4ZHhfYml0cmVhZGVyX25vcm1bcmFuZ2VdOwotICAgICAgICByYW5nZSA8PD0gc2hpZnQ7Ci0gICAgICAgIHZhbHVlIDw8PSBzaGlmdDsKLSAgICAgICAgY291bnQgLT0gc2hpZnQ7Ci0gICAgfQotICAgIGJyLT52YWx1ZSA9IHZhbHVlOwotICAgIGJyLT5jb3VudCA9IGNvdW50OwotICAgIGJyLT5yYW5nZSA9IHJhbmdlOwotICAgIGlmKGNvdW50IDwgMCkKLSAgICAgICAgdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwoYnIpOwotICAgIHJldHVybiBiaXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdnA4X2RlY29kZV92YWx1ZShCT09MX0RFQ09ERVIgKmJyLCBpbnQgYml0cykKLXsKLSAgICBpbnQgeiA9IDA7Ci0gICAgaW50IGJpdDsKLQotICAgIGZvciAoYml0ID0gYml0cyAtIDE7IGJpdCA+PSAwOyBiaXQtLSkKLSAgICB7Ci0gICAgICAgIHogfD0gKHZwOGR4X2RlY29kZV9ib29sKGJyLCAweDgwKSA8PCBiaXQpOwotICAgIH0KLQotICAgIHJldHVybiB6OwotfQotCi1zdGF0aWMgaW50IHZwOGR4X2Jvb2xfZXJyb3IoQk9PTF9ERUNPREVSICpicikKLXsKLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgICoKLSAgICogVmFyaWFibGUgJ2NvdW50JyBzdG9yZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSAndmFsdWUnIGJ1ZmZlciwKLSAgICogbWludXMgOC4gU28gaWYgY291bnQgPT0gOCwgdGhlcmUgYXJlIDE2IGJpdHMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuCi0gICAqIE5vcm1hbGx5LCBjb3VudCBpcyBmaWxsZWQgd2l0aCA4IGFuZCBvbmUgYnl0ZSBpcyBmaWxsZWQgaW50byB0aGUKLSAgICogdmFsdWUgYnVmZmVyLiBXaGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgY291bnQgaXMgaW5zdGVhZAotICAgKiBmaWxsZWQgd2l0aCBWUDhfTE9UU19PRl9CSVRTLCA4IG9mIHdoaWNoIHJlcHJlc2VudCB0aGUgbGFzdCA4IHJlYWwKLSAgICogYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0uIFNvIHRoZSBsYXN0IGJpdCBpbiB0aGUgYml0c3RyZWFtIHdpbGwgYmUKLSAgICogcmVwcmVzZW50ZWQgYnkgY291bnQgPT0gVlA4X0xPVFNfT0ZfQklUUyAtIDE2LgotICAgKi8KLSAgICBpZiAoKGJyLT5jb3VudCA+IFZQOF9CRF9WQUxVRV9TSVpFKQotICAgICAgICAmJiAoYnItPmNvdW50IDw9IFZQOF9MT1RTX09GX0JJVFMgLSAxNikpCi0gICAgewotICAgICAgIC8qIFdlIGhhdmUgdHJpZWQgdG8gZGVjb2RlIGJpdHMgYWZ0ZXIgdGhlIGVuZCBvZgotICAgICAgICAqIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuCi0gICAgICAgICovCi0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8qIE5vIGVycm9yLiAqLwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9kZWNvZGVtdi5jIGIvdnA4L2RlY29kZXIvZGVjb2RlbXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4MzBlOC4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9kZWNvZGVtdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidHJlZXJlYWRlci5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW12LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9lbnRyb3B5bW9kZS5oIgotI2luY2x1ZGUgIm9ueXhkX2ludC5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZmluZG5lYXJtdi5oIgotCi0jaWYgQ09ORklHX0RFQlVHCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLXN0YXRpYyBpbnQgdnA4X3JlYWRfYm1vZGUodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF9ibW9kZV90cmVlLCBwKTsKLQotICAgIHJldHVybiBpOwotfQotCi0KLXN0YXRpYyBpbnQgdnA4X3JlYWRfeW1vZGUodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF95bW9kZV90cmVlLCBwKTsKLQotICAgIHJldHVybiBpOwotfQotCi1zdGF0aWMgaW50IHZwOF9rZnJlYWRfeW1vZGUodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF9rZl95bW9kZV90cmVlLCBwKTsKLQotICAgIHJldHVybiBpOwotfQotCi0KLQotc3RhdGljIGludCB2cDhfcmVhZF91dl9tb2RlKHZwOF9yZWFkZXIgKmJjLCBjb25zdCB2cDhfcHJvYiAqcCkKLXsKLSAgICBjb25zdCBpbnQgaSA9IHZwOF90cmVlZF9yZWFkKGJjLCB2cDhfdXZfbW9kZV90cmVlLCBwKTsKLQotICAgIHJldHVybiBpOwotfQotCi1zdGF0aWMgdm9pZCB2cDhfcmVhZF9tYl9mZWF0dXJlcyh2cDhfcmVhZGVyICpyLCBNQl9NT0RFX0lORk8gKm1pLCBNQUNST0JMT0NLRCAqeCkKLXsKLSAgICAvKiBJcyBzZWdtZW50YXRpb24gZW5hYmxlZCAqLwotICAgIGlmICh4LT5zZWdtZW50YXRpb25fZW5hYmxlZCAmJiB4LT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKLSAgICB7Ci0gICAgICAgIC8qIElmIHNvIHRoZW4gcmVhZCB0aGUgc2VnbWVudCBpZC4gKi8KLSAgICAgICAgaWYgKHZwOF9yZWFkKHIsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1swXSkpCi0gICAgICAgICAgICBtaS0+c2VnbWVudF9pZCA9ICh1bnNpZ25lZCBjaGFyKSgyICsgdnA4X3JlYWQociwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzJdKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1pLT5zZWdtZW50X2lkID0gKHVuc2lnbmVkIGNoYXIpKHZwOF9yZWFkKHIsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1sxXSkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgdnA4X2tmcmVhZF9tb2RlcyhWUDhEX0NPTVAgKnBiaSwgTU9ERV9JTkZPICptLCBpbnQgbWJfcm93LCBpbnQgbWJfY29sKQotewotICAgIHZwOF9yZWFkZXIgKmNvbnN0IGJjID0gJiBwYmktPmJjOwotICAgIGNvbnN0IGludCBtaXMgPSBwYmktPmNvbW1vbi5tb2RlX2luZm9fc3RyaWRlOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1CX1BSRURJQ1RJT05fTU9ERSB5X21vZGU7Ci0KLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIE1hY3JvYmxvY2sgc2VnbWVudGF0aW9uIG1hcCBpZiBpdCBpcyBiZWluZyB1cGRhdGVkIGV4cGxpY2l0bHkgdGhpcyBmcmFtZSAocmVzZXQgdG8gMCBhYm92ZSBieSBkZWZhdWx0KQotICAgICAgICAgICAgICogQnkgZGVmYXVsdCBvbiBhIGtleSBmcmFtZSByZXNldCBhbGwgTUJzIHRvIHNlZ21lbnQgMAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtLT5tYm1pLnNlZ21lbnRfaWQgPSAwOwotCi0gICAgICAgICAgICBpZiAocGJpLT5tYi51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCkKLSAgICAgICAgICAgICAgICB2cDhfcmVhZF9tYl9mZWF0dXJlcyhiYywgJm0tPm1ibWksICZwYmktPm1iKTsKLQotICAgICAgICAgICAgLyogUmVhZCB0aGUgbWFjcm9ibG9jayBjb2VmZiBza2lwIGZsYWcgaWYgdGhpcyBmZWF0dXJlIGlzIGluIHVzZSwgZWxzZSBkZWZhdWx0IHRvIDAgKi8KLSAgICAgICAgICAgIGlmIChwYmktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKQotICAgICAgICAgICAgICAgIG0tPm1ibWkubWJfc2tpcF9jb2VmZiA9IHZwOF9yZWFkKGJjLCBwYmktPnByb2Jfc2tpcF9mYWxzZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbS0+bWJtaS5tYl9za2lwX2NvZWZmID0gMDsKLQotICAgICAgICAgICAgeV9tb2RlID0gKE1CX1BSRURJQ1RJT05fTU9ERSkgdnA4X2tmcmVhZF95bW9kZShiYywgcGJpLT5jb21tb24ua2ZfeW1vZGVfcHJvYik7Ci0KLSAgICAgICAgICAgIG0tPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7Ci0KLSAgICAgICAgICAgIGlmICgobS0+bWJtaS5tb2RlID0geV9tb2RlKSA9PSBCX1BSRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEEgPSB2cDhfYWJvdmVfYm1pKG0sIGksIG1pcyktPm1vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEwgPSB2cDhfbGVmdF9ibWkobSwgaSktPm1vZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbS0+Ym1pW2ldLm1vZGUgPSAoQl9QUkVESUNUSU9OX01PREUpIHZwOF9yZWFkX2Jtb2RlKGJjLCBwYmktPmNvbW1vbi5rZl9ibW9kZV9wcm9iIFtBXSBbTF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgMTYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBCTW9kZTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHlfbW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBEQ19QUkVEOgotICAgICAgICAgICAgICAgICAgICBCTW9kZSA9IEJfRENfUFJFRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWX1BSRUQ6Ci0gICAgICAgICAgICAgICAgICAgIEJNb2RlID0gQl9WRV9QUkVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEhfUFJFRDoKLSAgICAgICAgICAgICAgICAgICAgQk1vZGUgPSBCX0hFX1BSRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVE1fUFJFRDoKLSAgICAgICAgICAgICAgICAgICAgQk1vZGUgPSBCX1RNX1BSRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEJNb2RlID0gQl9EQ19QUkVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbS0+Ym1pW2ldLm1vZGUgPSAoQl9QUkVESUNUSU9OX01PREUpQk1vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgrK2kgPCAxNik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG0tPm1ibWkudXZfbW9kZSA9IChNQl9QUkVESUNUSU9OX01PREUpdnA4X3JlYWRfdXZfbW9kZShiYywgcGJpLT5jb21tb24ua2ZfdXZfbW9kZV9wcm9iKTsKLSAgICAgICAgfQotfQotCi1zdGF0aWMgaW50IHJlYWRfbXZjb21wb25lbnQodnA4X3JlYWRlciAqciwgY29uc3QgTVZfQ09OVEVYVCAqbXZjKQotewotICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwID0gKGNvbnN0IHZwOF9wcm9iICopIG12YzsKLSAgICBpbnQgeCA9IDA7Ci0KLSAgICBpZiAodnA4X3JlYWQociwgcCBbbXZwaXNfc2hvcnRdKSkgIC8qIExhcmdlICovCi0gICAgewotICAgICAgICBpbnQgaSA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgeCArPSB2cDhfcmVhZChyLCBwIFtNVlBiaXRzICsgaV0pIDw8IGk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsraSA8IDMpOwotCi0gICAgICAgIGkgPSBtdmxvbmdfd2lkdGggLSAxOyAgLyogU2tpcCBiaXQgMywgd2hpY2ggaXMgc29tZXRpbWVzIGltcGxpY2l0ICovCi0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgeCArPSB2cDhfcmVhZChyLCBwIFtNVlBiaXRzICsgaV0pIDw8IGk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKC0taSA+IDMpOwotCi0gICAgICAgIGlmICghKHggJiAweEZGRjApICB8fCAgdnA4X3JlYWQociwgcCBbTVZQYml0cyArIDNdKSkKLSAgICAgICAgICAgIHggKz0gODsKLSAgICB9Ci0gICAgZWxzZSAgIC8qIHNtYWxsICovCi0gICAgICAgIHggPSB2cDhfdHJlZWRfcmVhZChyLCB2cDhfc21hbGxfbXZ0cmVlLCBwICsgTVZQc2hvcnQpOwotCi0gICAgaWYgKHggICYmICB2cDhfcmVhZChyLCBwIFtNVlBzaWduXSkpCi0gICAgICAgIHggPSAteDsKLQotICAgIHJldHVybiB4OwotfQotCi1zdGF0aWMgdm9pZCByZWFkX212KHZwOF9yZWFkZXIgKnIsIE1WICptdiwgY29uc3QgTVZfQ09OVEVYVCAqbXZjKQotewotICAgIG12LT5yb3cgPSAoc2hvcnQpKHJlYWRfbXZjb21wb25lbnQociwgICBtdmMpIDw8IDEpOwotICAgIG12LT5jb2wgPSAoc2hvcnQpKHJlYWRfbXZjb21wb25lbnQociwgKyttdmMpIDw8IDEpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlYWRfbXZjb250ZXh0cyh2cDhfcmVhZGVyICpiYywgTVZfQ09OVEVYVCAqbXZjKQotewotICAgIGludCBpID0gMDsKLQotICAgIGRvCi0gICAgewotICAgICAgICBjb25zdCB2cDhfcHJvYiAqdXAgPSB2cDhfbXZfdXBkYXRlX3Byb2JzW2ldLnByb2I7Ci0gICAgICAgIHZwOF9wcm9iICpwID0gKHZwOF9wcm9iICopKG12YyArIGkpOwotICAgICAgICB2cDhfcHJvYiAqY29uc3QgcHN0b3AgPSBwICsgTVZQY291bnQ7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZwOF9yZWFkKGJjLCAqdXArKykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdnA4X3Byb2IgeCA9ICh2cDhfcHJvYil2cDhfcmVhZF9saXRlcmFsKGJjLCA3KTsKLQotICAgICAgICAgICAgICAgICpwID0geCA/IHggPDwgMSA6IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsrcCA8IHBzdG9wKTsKLSAgICB9Ci0gICAgd2hpbGUgKCsraSA8IDIpOwotfQotCi0KLXN0YXRpYyBNQl9QUkVESUNUSU9OX01PREUgcmVhZF9tdl9yZWYodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF9tdl9yZWZfdHJlZSwgcCk7Ci0KLSAgICByZXR1cm4gKE1CX1BSRURJQ1RJT05fTU9ERSlpOwotfQotCi1zdGF0aWMgTUJfUFJFRElDVElPTl9NT0RFIHN1Yl9tdl9yZWYodnA4X3JlYWRlciAqYmMsIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIGNvbnN0IGludCBpID0gdnA4X3RyZWVkX3JlYWQoYmMsIHZwOF9zdWJfbXZfcmVmX3RyZWUsIHApOwotCi0gICAgcmV0dXJuIChNQl9QUkVESUNUSU9OX01PREUpaTsKLX0KLQotI2lmZGVmIFZQWF9NT0RFX0NPVU5UCi11bnNpZ25lZCBpbnQgdnA4X212X2NvbnRfY291bnRbNV1bNF0gPQotewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCB9Ci19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1ic3BsaXRfZmlsbF9jb3VudFs0XSA9IHs4LCA4LCA0LCAxfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1ic3BsaXRfZmlsbF9vZmZzZXRbNF1bMTZdID0gewotICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTV9LAotICAgIHsgMCwgIDEsICA0LCAgNSwgIDgsICA5LCAxMiwgMTMsICAyLCAgMywgICA2LCAgNywgMTAsIDExLCAxNCwgMTV9LAotICAgIHsgMCwgIDEsICA0LCAgNSwgIDIsICAzLCAgNiwgIDcsICA4LCAgOSwgIDEyLCAxMywgMTAsIDExLCAxNCwgMTV9LAotICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTV9Ci19OwotCi0KLQotCi1zdGF0aWMgdm9pZCBtYl9tb2RlX212X2luaXQoVlA4RF9DT01QICpwYmkpCi17Ci0gICAgdnA4X3JlYWRlciAqY29uc3QgYmMgPSAmIHBiaS0+YmM7Ci0gICAgTVZfQ09OVEVYVCAqY29uc3QgbXZjID0gcGJpLT5jb21tb24uZmMubXZjOwotCi0gICAgcGJpLT5wcm9iX3NraXBfZmFsc2UgPSAwOwotICAgIGlmIChwYmktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKQotICAgICAgICBwYmktPnByb2Jfc2tpcF9mYWxzZSA9ICh2cDhfcHJvYil2cDhfcmVhZF9saXRlcmFsKGJjLCA4KTsKLQotICAgIGlmKHBiaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgcGJpLT5wcm9iX2ludHJhID0gKHZwOF9wcm9iKXZwOF9yZWFkX2xpdGVyYWwoYmMsIDgpOwotICAgICAgICBwYmktPnByb2JfbGFzdCAgPSAodnA4X3Byb2IpdnA4X3JlYWRfbGl0ZXJhbChiYywgOCk7Ci0gICAgICAgIHBiaS0+cHJvYl9nZiAgICA9ICh2cDhfcHJvYil2cDhfcmVhZF9saXRlcmFsKGJjLCA4KTsKLQotICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBiaS0+Y29tbW9uLmZjLnltb2RlX3Byb2JbaV0gPSAodnA4X3Byb2IpIHZwOF9yZWFkX2xpdGVyYWwoYmMsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsraSA8IDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZwOF9yZWFkX2JpdChiYykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYmktPmNvbW1vbi5mYy51dl9tb2RlX3Byb2JbaV0gPSAodnA4X3Byb2IpIHZwOF9yZWFkX2xpdGVyYWwoYmMsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsraSA8IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZF9tdmNvbnRleHRzKGJjLCBtdmMpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgcmVhZF9tYl9tb2Rlc19tdihWUDhEX0NPTVAgKnBiaSwgTU9ERV9JTkZPICptaSwgTUJfTU9ERV9JTkZPICptYm1pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3csIGludCBtYl9jb2wpCi17Ci0gICAgY29uc3QgTVYgWmVybyA9IHsgMCwgMH07Ci0gICAgdnA4X3JlYWRlciAqY29uc3QgYmMgPSAmIHBiaS0+YmM7Ci0gICAgTVZfQ09OVEVYVCAqY29uc3QgbXZjID0gcGJpLT5jb21tb24uZmMubXZjOwotICAgIGNvbnN0IGludCBtaXMgPSBwYmktPmNvbW1vbi5tb2RlX2luZm9fc3RyaWRlOwotCi0gICAgTVYgKmNvbnN0IG12ID0gJiBtYm1pLT5tdi5hc19tdjsKLSAgICBpbnQgbWJfdG9fbGVmdF9lZGdlOwotICAgIGludCBtYl90b19yaWdodF9lZGdlOwotICAgIGludCBtYl90b190b3BfZWRnZTsKLSAgICBpbnQgbWJfdG9fYm90dG9tX2VkZ2U7Ci0KLSAgICBtYl90b190b3BfZWRnZSA9IHBiaS0+bWIubWJfdG9fdG9wX2VkZ2U7Ci0gICAgbWJfdG9fYm90dG9tX2VkZ2UgPSBwYmktPm1iLm1iX3RvX2JvdHRvbV9lZGdlOwotICAgIG1iX3RvX3RvcF9lZGdlIC09IExFRlRfVE9QX01BUkdJTjsKLSAgICBtYl90b19ib3R0b21fZWRnZSArPSBSSUdIVF9CT1RUT01fTUFSR0lOOwotCi0gICAgbWJtaS0+bmVlZF90b19jbGFtcF9tdnMgPSAwOwotICAgIC8qIERpc3RhbmNlIG9mIE1iIHRvIHRoZSB2YXJpb3VzIGltYWdlIGVkZ2VzLgotICAgICAqIFRoZXNlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZCB0byBNViB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCi0gICAgICovCi0gICAgcGJpLT5tYi5tYl90b19sZWZ0X2VkZ2UgPQotICAgIG1iX3RvX2xlZnRfZWRnZSA9IC0oKG1iX2NvbCAqIDE2KSA8PCAzKTsKLSAgICBtYl90b19sZWZ0X2VkZ2UgLT0gTEVGVF9UT1BfTUFSR0lOOwotCi0gICAgcGJpLT5tYi5tYl90b19yaWdodF9lZGdlID0KLSAgICBtYl90b19yaWdodF9lZGdlID0gKChwYmktPmNvbW1vbi5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKLSAgICBtYl90b19yaWdodF9lZGdlICs9IFJJR0hUX0JPVFRPTV9NQVJHSU47Ci0KLSAgICAvKiBJZiByZXF1aXJlZCByZWFkIGluIG5ldyBzZWdtZW50YXRpb24gZGF0YSBmb3IgdGhpcyBNQiAqLwotICAgIGlmIChwYmktPm1iLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKQotICAgICAgICB2cDhfcmVhZF9tYl9mZWF0dXJlcyhiYywgbWJtaSwgJnBiaS0+bWIpOwotCi0gICAgLyogUmVhZCB0aGUgbWFjcm9ibG9jayBjb2VmZiBza2lwIGZsYWcgaWYgdGhpcyBmZWF0dXJlIGlzIGluIHVzZSwgZWxzZSBkZWZhdWx0IHRvIDAgKi8KLSAgICBpZiAocGJpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCkKLSAgICAgICAgbWJtaS0+bWJfc2tpcF9jb2VmZiA9IHZwOF9yZWFkKGJjLCBwYmktPnByb2Jfc2tpcF9mYWxzZSk7Ci0gICAgZWxzZQotICAgICAgICBtYm1pLT5tYl9za2lwX2NvZWZmID0gMDsKLQotICAgIGlmICgobWJtaS0+cmVmX2ZyYW1lID0gKE1WX1JFRkVSRU5DRV9GUkFNRSkgdnA4X3JlYWQoYmMsIHBiaS0+cHJvYl9pbnRyYSkpKSAgICAvKiBpbnRlciBNQiAqLwotICAgIHsKLSAgICAgICAgaW50IHJjdFs0XTsKLSAgICAgICAgdnA4X3Byb2IgbXZfcmVmX3AgW1ZQOF9NVlJFRlMtMV07Ci0gICAgICAgIE1WIG5lYXJlc3QsIG5lYXJieSwgYmVzdF9tdjsKLQotICAgICAgICBpZiAodnA4X3JlYWQoYmMsIHBiaS0+cHJvYl9sYXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgbWJtaS0+cmVmX2ZyYW1lID0gKE1WX1JFRkVSRU5DRV9GUkFNRSkoKGludCltYm1pLT5yZWZfZnJhbWUgKyAoaW50KSgxICsgdnA4X3JlYWQoYmMsIHBiaS0+cHJvYl9nZikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZwOF9maW5kX25lYXJfbXZzKCZwYmktPm1iLCBtaSwgJm5lYXJlc3QsICZuZWFyYnksICZiZXN0X212LCByY3QsIG1ibWktPnJlZl9mcmFtZSwgcGJpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0KLSAgICAgICAgdnA4X212X3JlZl9wcm9icyhtdl9yZWZfcCwgcmN0KTsKLQotICAgICAgICBtYm1pLT51dl9tb2RlID0gRENfUFJFRDsKLSAgICAgICAgc3dpdGNoIChtYm1pLT5tb2RlID0gcmVhZF9tdl9yZWYoYmMsIG12X3JlZl9wKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFNQTElUTVY6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBzID0gbWJtaS0+cGFydGl0aW9uaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICB2cDhfdHJlZWRfcmVhZChiYywgdnA4X21ic3BsaXRfdHJlZSwgdnA4X21ic3BsaXRfcHJvYnMpOwotICAgICAgICAgICAgY29uc3QgaW50IG51bV9wID0gdnA4X21ic3BsaXRfY291bnQgW3NdOwotICAgICAgICAgICAgaW50IGogPSAwOwotCi0gICAgICAgICAgICBkbyAgLyogZm9yIGVhY2ggc3Vic2V0IGogKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCX01PREVfSU5GTyBibWk7Ci0gICAgICAgICAgICAgICAgTVYgKmNvbnN0IG12ID0gJiBibWkubXYuYXNfbXY7Ci0KLSAgICAgICAgICAgICAgICBpbnQgazsgIC8qIGZpcnN0IGJsb2NrIGluIHN1YnNldCBqICovCi0gICAgICAgICAgICAgICAgaW50IG12X2NvbnR6OwotICAgICAgICAgICAgICAgIGsgPSB2cDhfbWJzcGxpdF9vZmZzZXRbc11bal07Ci0KLSAgICAgICAgICAgICAgICBtdl9jb250eiA9IHZwOF9tdl9jb250KCYodnA4X2xlZnRfYm1pKG1pLCBrKS0+bXYuYXNfbXYpLCAmKHZwOF9hYm92ZV9ibWkobWksIGssIG1pcyktPm12LmFzX212KSk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGJtaS5tb2RlID0gKEJfUFJFRElDVElPTl9NT0RFKSBzdWJfbXZfcmVmKGJjLCB2cDhfc3ViX212X3JlZl9wcm9iMiBbbXZfY29udHpdKSkgLypwYy0+ZmMuc3ViX212X3JlZl9wcm9iKSkqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE5FVzRYNDoKLSAgICAgICAgICAgICAgICAgICAgcmVhZF9tdihiYywgbXYsIChjb25zdCBNVl9DT05URVhUICopIG12Yyk7Ci0gICAgICAgICAgICAgICAgICAgIG12LT5yb3cgKz0gYmVzdF9tdi5yb3c7Ci0gICAgICAgICAgICAgICAgICAgIG12LT5jb2wgKz0gYmVzdF9tdi5jb2w7Ci0gICNpZmRlZiBWUFhfTU9ERV9DT1VOVAotICAgICAgICAgICAgICAgICAgICB2cDhfbXZfY29udF9jb3VudFttdl9jb250el1bM10rKzsKLSAgI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTEVGVDRYNDoKLSAgICAgICAgICAgICAgICAgICAgKm12ID0gdnA4X2xlZnRfYm1pKG1pLCBrKS0+bXYuYXNfbXY7Ci0gICNpZmRlZiBWUFhfTU9ERV9DT1VOVAotICAgICAgICAgICAgICAgICAgICB2cDhfbXZfY29udF9jb3VudFttdl9jb250el1bMF0rKzsKLSAgI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQUJPVkU0WDQ6Ci0gICAgICAgICAgICAgICAgICAgICptdiA9IHZwOF9hYm92ZV9ibWkobWksIGssIG1pcyktPm12LmFzX212OwotICAjaWZkZWYgVlBYX01PREVfQ09VTlQKLSAgICAgICAgICAgICAgICAgICAgdnA4X212X2NvbnRfY291bnRbbXZfY29udHpdWzFdKys7Ci0gICNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFpFUk80WDQ6Ci0gICAgICAgICAgICAgICAgICAgICptdiA9IFplcm87Ci0gICNpZmRlZiBWUFhfTU9ERV9DT1VOVAotICAgICAgICAgICAgICAgICAgICB2cDhfbXZfY29udF9jb3VudFttdl9jb250el1bMl0rKzsKLSAgI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1ibWktPm5lZWRfdG9fY2xhbXBfbXZzIHw9IChtdi0+Y29sIDwgbWJfdG9fbGVmdF9lZGdlKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgIG1ibWktPm5lZWRfdG9fY2xhbXBfbXZzIHw9IChtdi0+Y29sID4gbWJfdG9fcmlnaHRfZWRnZSkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICBtYm1pLT5uZWVkX3RvX2NsYW1wX212cyB8PSAobXYtPnJvdyA8IG1iX3RvX3RvcF9lZGdlKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgIG1ibWktPm5lZWRfdG9fY2xhbXBfbXZzIHw9IChtdi0+cm93ID4gbWJfdG9fYm90dG9tX2VkZ2UpID8gMSA6IDA7Ci0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgKHVuaWZvcm0pIG1vZGVzLCBtdnMgb2YganRoIHN1YnNldC4KLSAgICAgICAgICAgICAgICAgICAgIE11c3QgZG8gaXQgaGVyZSBiZWNhdXNlIGVuc3Vpbmcgc3Vic2V0cyBjYW4KLSAgICAgICAgICAgICAgICAgICAgIHJlZmVyIGJhY2sgdG8gdXMgdmlhICJsZWZ0IiBvciAiYWJvdmUiLiAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpmaWxsX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZpbGxfY291bnQgPSBtYnNwbGl0X2ZpbGxfY291bnRbc107Ci0KLSAgICAgICAgICAgICAgICAgICAgZmlsbF9vZmZzZXQgPSAmbWJzcGxpdF9maWxsX29mZnNldFtzXVsodW5zaWduZWQgY2hhcilqICogbWJzcGxpdF9maWxsX2NvdW50W3NdXTsKLQotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaS0+Ym1pWyAqZmlsbF9vZmZzZXRdID0gYm1pOwotICAgICAgICAgICAgICAgICAgICAgIGZpbGxfb2Zmc2V0Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgfXdoaWxlICgtLWZpbGxfY291bnQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsraiA8IG51bV9wKTsKLSAgICAgICAgfQotCi0gICAgICAgICptdiA9IG1pLT5ibWlbMTVdLm12LmFzX212OwotCi0gICAgICAgIGJyZWFrOyAgLyogZG9uZSB3aXRoIFNQTElUTVYgKi8KLQotICAgICAgICBjYXNlIE5FQVJNVjoKLSAgICAgICAgICAgICptdiA9IG5lYXJieTsKLSAgICAgICAgICAgIC8qIENsaXAgIm5leHRfbmVhcmVzdCIgc28gdGhhdCBpdCBkb2VzIG5vdCBleHRlbmQgdG8gZmFyIG91dCBvZiBpbWFnZSAqLwotICAgICAgICAgICAgbXYtPmNvbCA9IChtdi0+Y29sIDwgbWJfdG9fbGVmdF9lZGdlKSA/IG1iX3RvX2xlZnRfZWRnZSA6IG12LT5jb2w7Ci0gICAgICAgICAgICBtdi0+Y29sID0gKG12LT5jb2wgPiBtYl90b19yaWdodF9lZGdlKSA/IG1iX3RvX3JpZ2h0X2VkZ2UgOiBtdi0+Y29sOwotICAgICAgICAgICAgbXYtPnJvdyA9IChtdi0+cm93IDwgbWJfdG9fdG9wX2VkZ2UpID8gbWJfdG9fdG9wX2VkZ2UgOiBtdi0+cm93OwotICAgICAgICAgICAgbXYtPnJvdyA9IChtdi0+cm93ID4gbWJfdG9fYm90dG9tX2VkZ2UpID8gbWJfdG9fYm90dG9tX2VkZ2UgOiBtdi0+cm93OwotICAgICAgICAgICAgZ290byBwcm9wYWdhdGVfbXY7Ci0KLSAgICAgICAgY2FzZSBORUFSRVNUTVY6Ci0gICAgICAgICAgICAqbXYgPSBuZWFyZXN0OwotICAgICAgICAgICAgLyogQ2xpcCAibmV4dF9uZWFyZXN0IiBzbyB0aGF0IGl0IGRvZXMgbm90IGV4dGVuZCB0byBmYXIgb3V0IG9mIGltYWdlICovCi0gICAgICAgICAgICBtdi0+Y29sID0gKG12LT5jb2wgPCBtYl90b19sZWZ0X2VkZ2UpID8gbWJfdG9fbGVmdF9lZGdlIDogbXYtPmNvbDsKLSAgICAgICAgICAgIG12LT5jb2wgPSAobXYtPmNvbCA+IG1iX3RvX3JpZ2h0X2VkZ2UpID8gbWJfdG9fcmlnaHRfZWRnZSA6IG12LT5jb2w7Ci0gICAgICAgICAgICBtdi0+cm93ID0gKG12LT5yb3cgPCBtYl90b190b3BfZWRnZSkgPyBtYl90b190b3BfZWRnZSA6IG12LT5yb3c7Ci0gICAgICAgICAgICBtdi0+cm93ID0gKG12LT5yb3cgPiBtYl90b19ib3R0b21fZWRnZSkgPyBtYl90b19ib3R0b21fZWRnZSA6IG12LT5yb3c7Ci0gICAgICAgICAgICBnb3RvIHByb3BhZ2F0ZV9tdjsKLQotICAgICAgICBjYXNlIFpFUk9NVjoKLSAgICAgICAgICAgICptdiA9IFplcm87Ci0gICAgICAgICAgICBnb3RvIHByb3BhZ2F0ZV9tdjsKLQotICAgICAgICBjYXNlIE5FV01WOgotICAgICAgICAgICAgcmVhZF9tdihiYywgbXYsIChjb25zdCBNVl9DT05URVhUICopIG12Yyk7Ci0gICAgICAgICAgICBtdi0+cm93ICs9IGJlc3RfbXYucm93OwotICAgICAgICAgICAgbXYtPmNvbCArPSBiZXN0X212LmNvbDsKLQotICAgICAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBjaGVjayB0aGlzIG9uIE5FQVJNViBhbmQgTkVBUkVTVE1WIG1vZGVzCi0gICAgICAgICAgICAgKiBzaW5jZSB0aG9zZSBtb2RlcyBjbGFtcCB0aGUgTVYuIFRoZSBORVdNViBtb2RlIGRvZXMgbm90LAotICAgICAgICAgICAgICogc28gc2lnbmFsIHRvIHRoZSBwcmVkaWN0aW9uIHN0YWdlIHdoZXRoZXIgc3BlY2lhbAotICAgICAgICAgICAgICogaGFuZGxpbmcgbWF5IGJlIHJlcXVpcmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtYm1pLT5uZWVkX3RvX2NsYW1wX212cyA9IChtdi0+Y29sIDwgbWJfdG9fbGVmdF9lZGdlKSA/IDEgOiAwOwotICAgICAgICAgICAgbWJtaS0+bmVlZF90b19jbGFtcF9tdnMgfD0gKG12LT5jb2wgPiBtYl90b19yaWdodF9lZGdlKSA/IDEgOiAwOwotICAgICAgICAgICAgbWJtaS0+bmVlZF90b19jbGFtcF9tdnMgfD0gKG12LT5yb3cgPCBtYl90b190b3BfZWRnZSkgPyAxIDogMDsKLSAgICAgICAgICAgIG1ibWktPm5lZWRfdG9fY2xhbXBfbXZzIHw9IChtdi0+cm93ID4gbWJfdG9fYm90dG9tX2VkZ2UpID8gMSA6IDA7Ci0KLSAgICAgICAgcHJvcGFnYXRlX212OiAgLyogc2FtZSBNViB0aHJvdWdob3V0ICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppbnQgaT0wOwotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbWktPmJtaVtpXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUoICsraSA8IDE2KTsqLwotCi0gICAgICAgICAgICAgICAgbWktPmJtaVswXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzFdLm12LmFzX212ID0gKm12OwotICAgICAgICAgICAgICAgIG1pLT5ibWlbMl0ubXYuYXNfbXYgPSAqbXY7Ci0gICAgICAgICAgICAgICAgbWktPmJtaVszXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzRdLm12LmFzX212ID0gKm12OwotICAgICAgICAgICAgICAgIG1pLT5ibWlbNV0ubXYuYXNfbXYgPSAqbXY7Ci0gICAgICAgICAgICAgICAgbWktPmJtaVs2XS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzddLm12LmFzX212ID0gKm12OwotICAgICAgICAgICAgICAgIG1pLT5ibWlbOF0ubXYuYXNfbXYgPSAqbXY7Ci0gICAgICAgICAgICAgICAgbWktPmJtaVs5XS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzEwXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzExXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzEyXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzEzXS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzE0XS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pWzE1XS5tdi5hc19tdiA9ICptdjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OjsKLSAgI2lmIENPTkZJR19ERUJVRwotICAgICAgICAgICAgYXNzZXJ0KDApOwotICAjZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBNQiBpcyBpbnRyYSBjb2RlZCAqLwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pLT5ibWlbal0ubXYuYXNfbXYgPSBaZXJvOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgrK2ogPCAxNik7Ci0KLSAgICAgICAgaWYgKChtYm1pLT5tb2RlID0gKE1CX1BSRURJQ1RJT05fTU9ERSkgdnA4X3JlYWRfeW1vZGUoYmMsIHBiaS0+Y29tbW9uLmZjLnltb2RlX3Byb2IpKSA9PSBCX1BSRUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaS0+Ym1pW2pdLm1vZGUgPSAoQl9QUkVESUNUSU9OX01PREUpdnA4X3JlYWRfYm1vZGUoYmMsIHBiaS0+Y29tbW9uLmZjLmJtb2RlX3Byb2IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsraiA8IDE2KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1ibWktPnV2X21vZGUgPSAoTUJfUFJFRElDVElPTl9NT0RFKXZwOF9yZWFkX3V2X21vZGUoYmMsIHBiaS0+Y29tbW9uLmZjLnV2X21vZGVfcHJvYik7Ci0gICAgfQotCi19Ci0KLXZvaWQgdnA4X2RlY29kZV9tb2RlX212cyhWUDhEX0NPTVAgKnBiaSkKLXsKLSAgICBNT0RFX0lORk8gKm1pID0gcGJpLT5jb21tb24ubWk7Ci0gICAgaW50IG1iX3JvdyA9IC0xOwotCi0gICAgbWJfbW9kZV9tdl9pbml0KHBiaSk7Ci0KLSAgICB3aGlsZSAoKyttYl9yb3cgPCBwYmktPmNvbW1vbi5tYl9yb3dzKQotICAgIHsKLSAgICAgICAgaW50IG1iX2NvbCA9IC0xOwotICAgICAgICBpbnQgbWJfdG9fdG9wX2VkZ2U7Ci0gICAgICAgIGludCBtYl90b19ib3R0b21fZWRnZTsKLQotICAgICAgICBwYmktPm1iLm1iX3RvX3RvcF9lZGdlID0KLSAgICAgICAgbWJfdG9fdG9wX2VkZ2UgPSAtKChtYl9yb3cgKiAxNikpIDw8IDM7Ci0gICAgICAgIG1iX3RvX3RvcF9lZGdlIC09IExFRlRfVE9QX01BUkdJTjsKLQotICAgICAgICBwYmktPm1iLm1iX3RvX2JvdHRvbV9lZGdlID0KLSAgICAgICAgbWJfdG9fYm90dG9tX2VkZ2UgPSAoKHBiaS0+Y29tbW9uLm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOwotICAgICAgICBtYl90b19ib3R0b21fZWRnZSArPSBSSUdIVF9CT1RUT01fTUFSR0lOOwotCi0gICAgICAgIHdoaWxlICgrK21iX2NvbCA8IHBiaS0+Y29tbW9uLm1iX2NvbHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmVhZF9tYl9tb2Rlc19tdihwYmksIHhkLT5tb2RlX2luZm9fY29udGV4dCwgJnhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaSwgbWJfcm93LCBtYl9jb2wpOyovCi0gICAgICAgICAgICBpZihwYmktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgICAgICAgICB2cDhfa2ZyZWFkX21vZGVzKHBiaSwgbWksIG1iX3JvdywgbWJfY29sKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZWFkX21iX21vZGVzX212KHBiaSwgbWksICZtaS0+bWJtaSwgbWJfcm93LCBtYl9jb2wpOwotCi0gICAgICAgICAgICBtaSsrOyAgICAgICAvKiBuZXh0IG1hY3JvYmxvY2sgKi8KLSAgICAgICAgfQotCi0gICAgICAgIG1pKys7ICAgICAgICAgICAvKiBza2lwIGxlZnQgcHJlZGljdG9yIGVhY2ggcm93ICovCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9kZWNvZGZyYW1lLmMgYi92cDgvZGVjb2Rlci9kZWNvZGZyYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODQxZTguLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvZGVjb2RmcmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAib255eGRfaW50LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9oZWFkZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmEuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludGVyLmgiCi0jaW5jbHVkZSAiZGVxdWFudGl6ZS5oIgotI2luY2x1ZGUgImRldG9rZW5pemUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2ludnRyYW5zLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW1vZGUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oIgotI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgotI2luY2x1ZGUgInZweF9zY2FsZS95djEyZXh0ZW5kLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaCIKLQotI2luY2x1ZGUgImRlY29kZW12LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9leHRlbmQuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2lkY3QuaCIKLSNpbmNsdWRlICJkZXF1YW50aXplLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKLSNpbmNsdWRlICJkZWNvZGVydGhyZWFkaW5nLmgiCi0jaW5jbHVkZSAiZGJvb2xodWZmLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIHZwOGN4X2luaXRfZGVfcXVhbnRpemVyKFZQOERfQ09NUCAqcGJpKQotewotICAgIGludCBpOwotICAgIGludCBROwotICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKLQotICAgIGZvciAoUSA9IDA7IFEgPCBRSU5ERVhfUkFOR0U7IFErKykKLSAgICB7Ci0gICAgICAgIHBjLT5ZMWRlcXVhbnRbUV1bMF0gPSAoc2hvcnQpdnA4X2RjX3F1YW50KFEsIHBjLT55MWRjX2RlbHRhX3EpOwotICAgICAgICBwYy0+WTJkZXF1YW50W1FdWzBdID0gKHNob3J0KXZwOF9kYzJxdWFudChRLCBwYy0+eTJkY19kZWx0YV9xKTsKLSAgICAgICAgcGMtPlVWZGVxdWFudFtRXVswXSA9IChzaG9ydCl2cDhfZGNfdXZfcXVhbnQoUSwgcGMtPnV2ZGNfZGVsdGFfcSk7Ci0KLSAgICAgICAgLyogYWxsIHRoZSBhYyB2YWx1ZXMgPSA7ICovCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07Ci0KLSAgICAgICAgICAgIHBjLT5ZMWRlcXVhbnRbUV1bcmNdID0gKHNob3J0KXZwOF9hY195cXVhbnQoUSk7Ci0gICAgICAgICAgICBwYy0+WTJkZXF1YW50W1FdW3JjXSA9IChzaG9ydCl2cDhfYWMycXVhbnQoUSwgcGMtPnkyYWNfZGVsdGFfcSk7Ci0gICAgICAgICAgICBwYy0+VVZkZXF1YW50W1FdW3JjXSA9IChzaG9ydCl2cDhfYWNfdXZfcXVhbnQoUSwgcGMtPnV2YWNfZGVsdGFfcSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgbWJfaW5pdF9kZXF1YW50aXplcihWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKnhkKQotewotICAgIGludCBpOwotICAgIGludCBRSW5kZXg7Ci0gICAgTUJfTU9ERV9JTkZPICptYm1pID0gJnhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaTsKLSAgICBWUDhfQ09NTU9OICpjb25zdCBwYyA9ICYgcGJpLT5jb21tb247Ci0KLSAgICAvKiBEZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIGRlZmF1bHQgb3IgYWx0ZXJuYXRlIGJhc2VsaW5lIFEgdmFsdWUuICovCi0gICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIC8qIEFicyBWYWx1ZSAqLwotICAgICAgICBpZiAoeGQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEpCi0gICAgICAgICAgICBRSW5kZXggPSB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVttYm1pLT5zZWdtZW50X2lkXTsKLQotICAgICAgICAvKiBEZWx0YSBWYWx1ZSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFJbmRleCA9IHBjLT5iYXNlX3FpbmRleCArIHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW21ibWktPnNlZ21lbnRfaWRdOwotICAgICAgICAgICAgUUluZGV4ID0gKFFJbmRleCA+PSAwKSA/ICgoUUluZGV4IDw9IE1BWFEpID8gUUluZGV4IDogTUFYUSkgOiAwOyAgICAvKiBDbGFtcCB0byB2YWxpZCByYW5nZSAqLwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgUUluZGV4ID0gcGMtPmJhc2VfcWluZGV4OwotCi0gICAgLyogU2V0IHVwIHRoZSBibG9jayBsZXZlbCBkZXF1YW50IHBvaW50ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICB4ZC0+YmxvY2tbaV0uZGVxdWFudCA9IHBjLT5ZMWRlcXVhbnRbUUluZGV4XTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpKyspCi0gICAgewotICAgICAgICB4ZC0+YmxvY2tbaV0uZGVxdWFudCA9IHBjLT5VVmRlcXVhbnRbUUluZGV4XTsKLSAgICB9Ci0KLSAgICB4ZC0+YmxvY2tbMjRdLmRlcXVhbnQgPSBwYy0+WTJkZXF1YW50W1FJbmRleF07Ci0KLX0KLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgUlRDRF9WVEFCTEUoeCkgKCYocGJpKS0+Y29tbW9uLnJ0Y2QueCkKLSNlbHNlCi0jZGVmaW5lIFJUQ0RfVlRBQkxFKHgpIE5VTEwKLSNlbmRpZgotCi0vKiBza2lwX3JlY29uX21iKCkgaXMgTW9kaWZpZWQ6IEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgcmVzdWx0IHRvIHByZWRpY3RvciBidWZmZXIgYW5kIHRoZW4gY29weWluZyBpdAotICogIHRvIGRzdCBidWZmZXIsIHdlIGNhbiB3cml0ZSB0aGUgcmVzdWx0IGRpcmVjdGx5IHRvIGRzdCBidWZmZXIuIFRoaXMgZWxpbWluYXRlcyB1bm5lY2Vzc2FyeSBjb3B5LgotICovCi1zdGF0aWMgdm9pZCBza2lwX3JlY29uX21iKFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeGQpCi17Ci0gICAgaWYgKHhkLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAgfHwgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCi0gICAgewotCi0gICAgICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXZfcyh4ZCk7Ci0gICAgICAgIFJFQ09OX0lOVk9LRSgmcGJpLT5jb21tb24ucnRjZC5yZWNvbiwKLSAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MpKHhkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWJfcyh4ZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjbGFtcF9tdl90b191bXZfYm9yZGVyKE1WICptdiwgY29uc3QgTUFDUk9CTE9DS0QgKnhkKQotewotICAgIC8qIElmIHRoZSBNViBwb2ludHMgc28gZmFyIGludG8gdGhlIFVNViBib3JkZXIgdGhhdCBubyB2aXNpYmxlIHBpeGVscwotICAgICAqIGFyZSB1c2VkIGZvciByZWNvbnN0cnVjdGlvbiwgdGhlIHN1YnBlbCBwYXJ0IG9mIHRoZSBNViBjYW4gYmUKLSAgICAgKiBkaXNjYXJkZWQgYW5kIHRoZSBNViBsaW1pdGVkIHRvIDE2IHBpeGVscyB3aXRoIGVxdWl2YWxlbnQgcmVzdWx0cy4KLSAgICAgKgotICAgICAqIFRoaXMgbGltaXQga2lja3MgaW4gYXQgMTkgcGl4ZWxzIGZvciB0aGUgdG9wIGFuZCBsZWZ0IGVkZ2VzLCBmb3IKLSAgICAgKiB0aGUgMTYgcGl4ZWxzIHBsdXMgMyB0YXBzIHJpZ2h0IG9mIHRoZSBjZW50cmFsIHBpeGVsIHdoZW4gc3VicGVsCi0gICAgICogZmlsdGVyaW5nLiBUaGUgYm90dG9tIGFuZCByaWdodCBlZGdlcyB1c2UgMTYgcGl4ZWxzIHBsdXMgMiBwaXhlbHMKLSAgICAgKiBsZWZ0IG9mIHRoZSBjZW50cmFsIHBpeGVsIHdoZW4gZmlsdGVyaW5nLgotICAgICAqLwotICAgIGlmIChtdi0+Y29sIDwgKHhkLT5tYl90b19sZWZ0X2VkZ2UgLSAoMTkgPDwgMykpKQotICAgICAgICBtdi0+Y29sID0geGQtPm1iX3RvX2xlZnRfZWRnZSAtICgxNiA8PCAzKTsKLSAgICBlbHNlIGlmIChtdi0+Y29sID4geGQtPm1iX3RvX3JpZ2h0X2VkZ2UgKyAoMTggPDwgMykpCi0gICAgICAgIG12LT5jb2wgPSB4ZC0+bWJfdG9fcmlnaHRfZWRnZSArICgxNiA8PCAzKTsKLQotICAgIGlmIChtdi0+cm93IDwgKHhkLT5tYl90b190b3BfZWRnZSAtICgxOSA8PCAzKSkpCi0gICAgICAgIG12LT5yb3cgPSB4ZC0+bWJfdG9fdG9wX2VkZ2UgLSAoMTYgPDwgMyk7Ci0gICAgZWxzZSBpZiAobXYtPnJvdyA+IHhkLT5tYl90b19ib3R0b21fZWRnZSArICgxOCA8PCAzKSkKLSAgICAgICAgbXYtPnJvdyA9IHhkLT5tYl90b19ib3R0b21fZWRnZSArICgxNiA8PCAzKTsKLX0KLQotLyogQSB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBmdW5jdGlvbiBmb3IgY2hyb21hIGJsb2NrIE1Wcy4qLwotc3RhdGljIHZvaWQgY2xhbXBfdXZtdl90b191bXZfYm9yZGVyKE1WICptdiwgY29uc3QgTUFDUk9CTE9DS0QgKnhkKQotewotICAgIG12LT5jb2wgPSAoMiptdi0+Y29sIDwgKHhkLT5tYl90b19sZWZ0X2VkZ2UgLSAoMTkgPDwgMykpKSA/ICh4ZC0+bWJfdG9fbGVmdF9lZGdlIC0gKDE2IDw8IDMpKSA+PiAxIDogbXYtPmNvbDsKLSAgICBtdi0+Y29sID0gKDIqbXYtPmNvbCA+IHhkLT5tYl90b19yaWdodF9lZGdlICsgKDE4IDw8IDMpKSA/ICh4ZC0+bWJfdG9fcmlnaHRfZWRnZSArICgxNiA8PCAzKSkgPj4gMSA6IG12LT5jb2w7Ci0KLSAgICBtdi0+cm93ID0gKDIqbXYtPnJvdyA8ICh4ZC0+bWJfdG9fdG9wX2VkZ2UgLSAoMTkgPDwgMykpKSA/ICh4ZC0+bWJfdG9fdG9wX2VkZ2UgLSAoMTYgPDwgMykpID4+IDEgOiBtdi0+cm93OwotICAgIG12LT5yb3cgPSAoMiptdi0+cm93ID4geGQtPm1iX3RvX2JvdHRvbV9lZGdlICsgKDE4IDw8IDMpKSA/ICh4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgKyAoMTYgPDwgMykpID4+IDEgOiBtdi0+cm93OwotfQotCi12b2lkIGNsYW1wX212cyhNQUNST0JMT0NLRCAqeGQpCi17Ci0gICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IFNQTElUTVYpCi0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgICAgICAgICAgY2xhbXBfbXZfdG9fdW12X2JvcmRlcigmeGQtPmJsb2NrW2ldLmJtaS5tdi5hc19tdiwgeGQpOwotICAgICAgICBmb3IgKGk9MTY7IGk8MjQ7IGkrKykKLSAgICAgICAgICAgIGNsYW1wX3V2bXZfdG9fdW12X2JvcmRlcigmeGQtPmJsb2NrW2ldLmJtaS5tdi5hc19tdiwgeGQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjbGFtcF9tdl90b191bXZfYm9yZGVyKCZ4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYsIHhkKTsKLSAgICAgICAgY2xhbXBfdXZtdl90b191bXZfYm9yZGVyKCZ4ZC0+YmxvY2tbMTZdLmJtaS5tdi5hc19tdiwgeGQpOwotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZCBkZWNvZGVfbWFjcm9ibG9jayhWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKnhkKQotewotICAgIGludCBlb2J0b3RhbCA9IDA7Ci0gICAgaW50IGksIGRvX2NsYW1wID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm5lZWRfdG9fY2xhbXBfbXZzOwotCi0gICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tYl9za2lwX2NvZWZmKQotICAgIHsKLSAgICAgICAgdnA4X3Jlc2V0X21iX3Rva2Vuc19jb250ZXh0KHhkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZW9idG90YWwgPSB2cDhfZGVjb2RlX21iX3Rva2VucyhwYmksIHhkKTsKLSAgICB9Ci0KLSAgICAvKiBQZXJmb3JtIHRlbXBvcmFyeSBjbGFtcGluZyBvZiB0aGUgTVYgdG8gYmUgdXNlZCBmb3IgcHJlZGljdGlvbiAqLwotICAgIGlmIChkb19jbGFtcCkKLSAgICB7Ci0gICAgICAgIGNsYW1wX212cyh4ZCk7Ci0gICAgfQotCi0gICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmRjX2RpZmYgPSAxOwotCi0gICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCAmJiB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WICYmIGVvYnRvdGFsID09IDApCi0gICAgewotICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA9IDA7Ci0gICAgICAgIHNraXBfcmVjb25fbWIocGJpLCB4ZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgICAgICBtYl9pbml0X2RlcXVhbnRpemVyKHBiaSwgeGQpOwotCi0gICAgLyogZG8gcHJlZGljdGlvbiAqLwotICAgIGlmICh4ZC0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgIHx8ICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKQotICAgIHsKLSAgICAgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dih4ZCk7Ci0KLSAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCkKLSAgICAgICAgewotICAgICAgICAgICAgUkVDT05fSU5WT0tFKCZwYmktPmNvbW1vbi5ydGNkLnJlY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5KSh4ZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2cDhfaW50cmFfcHJlZGljdGlvbl9kb3duX2NvcHkoeGQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iKHhkKTsKLSAgICB9Ci0KLSAgICAvKiBkZXF1YW50aXphdGlvbiBhbmQgaWRjdCAqLwotICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKLSAgICB7Ci0gICAgICAgIEJMT0NLRCAqYiA9ICZ4ZC0+YmxvY2tbMjRdOwotICAgICAgICBERVFVQU5UX0lOVk9LRSgmcGJpLT5kZXF1YW50LCBibG9jaykoYik7Ci0KLSAgICAgICAgLyogZG8gMm5kIG9yZGVyIHRyYW5zZm9ybSBvbiB0aGUgZGMgYmxvY2sgKi8KLSAgICAgICAgaWYgKHhkLT5lb2JzWzI0XSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEQ1RfSU5WT0tFKFJUQ0RfVlRBQkxFKGlkY3QpLCBpd2Fsc2gxNikoJmItPmRxY29lZmZbMF0sIGItPmRpZmYpOwotICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzBdID0gMDsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVsxXSA9IDA7Ci0gICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMl0gPSAwOwotICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzNdID0gMDsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVs0XSA9IDA7Ci0gICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbNV0gPSAwOwotICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzZdID0gMDsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVs3XSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBJRENUX0lOVk9LRShSVENEX1ZUQUJMRShpZGN0KSwgaXdhbHNoMSkoJmItPmRxY29lZmZbMF0sIGItPmRpZmYpOwotICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIERFUVVBTlRfSU5WT0tFICgmcGJpLT5kZXF1YW50LCBkY19pZGN0X2FkZF95X2Jsb2NrKQotICAgICAgICAgICAgICAgICAgICAgICAgKHhkLT5xY29lZmYsIHhkLT5ibG9ja1swXS5kZXF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmVkaWN0b3IsIHhkLT5kc3QueV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwgeGQtPmVvYnMsIHhkLT5ibG9ja1syNF0uZGlmZik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCh4ZC0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgIHx8ICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKSAmJiB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBCX1BSRUQpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBCTE9DS0QgKmIgPSAmeGQtPmJsb2NrW2ldOwotICAgICAgICAgICAgdnA4X3ByZWRpY3RfaW50cmE0eDQoYiwgYi0+Ym1pLm1vZGUsIGItPnByZWRpY3Rvcik7Ci0KLSAgICAgICAgICAgIGlmICh4ZC0+ZW9ic1tpXSA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVRVUFOVF9JTlZPS0UoJnBiaS0+ZGVxdWFudCwgaWRjdF9hZGQpCi0gICAgICAgICAgICAgICAgICAgIChiLT5xY29lZmYsIGItPmRlcXVhbnQsICBiLT5wcmVkaWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0LCAxNiwgYi0+ZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSURDVF9JTlZPS0UoUlRDRF9WVEFCTEUoaWRjdCksIGlkY3QxX3NjYWxhcl9hZGQpCi0gICAgICAgICAgICAgICAgICAgIChiLT5xY29lZmZbMF0gKiBiLT5kZXF1YW50WzBdLCBiLT5wcmVkaWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0LCAxNiwgYi0+ZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzBdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERFUVVBTlRfSU5WT0tFICgmcGJpLT5kZXF1YW50LCBpZGN0X2FkZF95X2Jsb2NrKQotICAgICAgICAgICAgICAgICAgICAgICAgKHhkLT5xY29lZmYsIHhkLT5ibG9ja1swXS5kZXF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmVkaWN0b3IsIHhkLT5kc3QueV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwgeGQtPmVvYnMpOwotICAgIH0KLQotICAgIERFUVVBTlRfSU5WT0tFICgmcGJpLT5kZXF1YW50LCBpZGN0X2FkZF91dl9ibG9jaykKLSAgICAgICAgICAgICAgICAgICAgKHhkLT5xY29lZmYrMTYqMTYsIHhkLT5ibG9ja1sxNl0uZGVxdWFudCwKLSAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmVkaWN0b3IrMTYqMTYsIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnV2X3N0cmlkZSwgeGQtPmVvYnMrMTYpOwotfQotCi0KLXN0YXRpYyBpbnQgZ2V0X2RlbHRhX3EodnA4X3JlYWRlciAqYmMsIGludCBwcmV2LCBpbnQgKnFfdXBkYXRlKQotewotICAgIGludCByZXRfdmFsID0gMDsKLQotICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQotICAgIHsKLSAgICAgICAgcmV0X3ZhbCA9IHZwOF9yZWFkX2xpdGVyYWwoYmMsIDQpOwotCi0gICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKQotICAgICAgICAgICAgcmV0X3ZhbCA9IC1yZXRfdmFsOwotICAgIH0KLQotICAgIC8qIFRyaWdnZXIgYSBxdWFudGl6ZXIgdXBkYXRlIGlmIHRoZSBkZWx0YS1xIHZhbHVlIGhhcyBjaGFuZ2VkICovCi0gICAgaWYgKHJldF92YWwgIT0gcHJldikKLSAgICAgICAgKnFfdXBkYXRlID0gMTsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0jaWZkZWYgUEFDS0VUX1RFU1RJTkcKLSNpbmNsdWRlIDxzdGRpby5oPgotRklMRSAqdnB4bG9nID0gMDsKLSNlbmRpZgotCi0KLQotc3RhdGljIHZvaWQKLWRlY29kZV9tYl9yb3coVlA4RF9DT01QICpwYmksIFZQOF9DT01NT04gKnBjLCBpbnQgbWJfcm93LCBNQUNST0JMT0NLRCAqeGQpCi17Ci0KLSAgICBpbnQgaTsKLSAgICBpbnQgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQ7Ci0gICAgaW50IG1iX2NvbDsKLSAgICBpbnQgcmVmX2ZiX2lkeCA9IHBjLT5sc3RfZmJfaWR4OwotICAgIGludCBkc3RfZmJfaWR4ID0gcGMtPm5ld19mYl9pZHg7Ci0gICAgaW50IHJlY29uX3lfc3RyaWRlID0gcGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0ueV9zdHJpZGU7Ci0gICAgaW50IHJlY29uX3V2X3N0cmlkZSA9IHBjLT55djEyX2ZiW3JlZl9mYl9pZHhdLnV2X3N0cmlkZTsKLQotICAgIHZweF9tZW1zZXQoJnBjLT5sZWZ0X2NvbnRleHQsIDAsIHNpemVvZihwYy0+bGVmdF9jb250ZXh0KSk7Ci0gICAgcmVjb25feW9mZnNldCA9IG1iX3JvdyAqIHJlY29uX3lfc3RyaWRlICogMTY7Ci0gICAgcmVjb25fdXZvZmZzZXQgPSBtYl9yb3cgKiByZWNvbl91dl9zdHJpZGUgKiA4OwotICAgIC8qIHJlc2V0IGFib3ZlIGJsb2NrIGNvZWZmcyAqLwotCi0gICAgeGQtPmFib3ZlX2NvbnRleHQgPSBwYy0+YWJvdmVfY29udGV4dDsKLSAgICB4ZC0+dXBfYXZhaWxhYmxlID0gKG1iX3JvdyAhPSAwKTsKLQotICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSkgPDwgMzsKLSAgICB4ZC0+bWJfdG9fYm90dG9tX2VkZ2UgPSAoKHBjLT5tYl9yb3dzIC0gMSAtIG1iX3JvdykgKiAxNikgPDwgMzsKLQotICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgcGMtPm1iX2NvbHM7IG1iX2NvbCsrKQotICAgIHsKLQotICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNViB8fCB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBCX1BSRUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJMT0NLRCAqZCA9ICZ4ZC0+YmxvY2tbaV07Ci0gICAgICAgICAgICAgICAgdnB4X21lbWNweSgmZC0+Ym1pLCAmeGQtPm1vZGVfaW5mb19jb250ZXh0LT5ibWlbaV0sIHNpemVvZihCX01PREVfSU5GTykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRGlzdGFuY2Ugb2YgTWIgdG8gdGhlIHZhcmlvdXMgaW1hZ2UgZWRnZXMuCi0gICAgICAgICAqIFRoZXNlIGFyZSBzcGVjaWZpZWQgdG8gOHRoIHBlbCBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cwotICAgICAgICAgKi8KLSAgICAgICAgeGQtPm1iX3RvX2xlZnRfZWRnZSA9IC0oKG1iX2NvbCAqIDE2KSA8PCAzKTsKLSAgICAgICAgeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPSAoKHBjLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKLQotICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyID0gcGMtPnl2MTJfZmJbZHN0X2ZiX2lkeF0ueV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OwotICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyID0gcGMtPnl2MTJfZmJbZHN0X2ZiX2lkeF0udV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgeGQtPmRzdC52X2J1ZmZlciA9IHBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0KLSAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gKG1iX2NvbCAhPSAwKTsKLQotICAgICAgICAvKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHJlZmVyZW5jZSBmcmFtZSBmb3IgdGhpcyBNQiAqLwotICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKQotICAgICAgICAgICAgcmVmX2ZiX2lkeCA9IHBjLT5sc3RfZmJfaWR4OwotICAgICAgICBlbHNlIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IEdPTERFTl9GUkFNRSkKLSAgICAgICAgICAgIHJlZl9mYl9pZHggPSBwYy0+Z2xkX2ZiX2lkeDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVmX2ZiX2lkeCA9IHBjLT5hbHRfZmJfaWR4OwotCi0gICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgIHhkLT5wcmUudV9idWZmZXIgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICB4ZC0+cHJlLnZfYnVmZmVyID0gcGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0udl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLQotICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogcHJvcGFnYXRlIGVycm9ycyBmcm9tIHJlZmVyZW5jZSBmcmFtZXMgKi8KLSAgICAgICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gcGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0uY29ycnVwdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgdnA4X2J1aWxkX3V2bXZzKHhkLCBwYy0+ZnVsbF9waXhlbCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYocGMtPmN1cnJlbnRfdmlkZW9fZnJhbWU9PTAgJiZtYl9jb2w9PTEgJiYgbWJfcm93PT0wKQotICAgICAgICBwYmktPmRlYnVnb3V0cHV0ID0xOwotICAgICAgICBlbHNlCi0gICAgICAgIHBiaS0+ZGVidWdvdXRwdXQgPTA7Ci0gICAgICAgICovCi0gICAgICAgIGRlY29kZV9tYWNyb2Jsb2NrKHBiaSwgeGQpOwotCi0gICAgICAgIC8qIGNoZWNrIGlmIHRoZSBib29sZWFuIGRlY29kZXIgaGFzIHN1ZmZlcmVkIGFuIGVycm9yICovCi0gICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gdnA4ZHhfYm9vbF9lcnJvcih4ZC0+Y3VycmVudF9iYyk7Ci0KLSAgICAgICAgcmVjb25feW9mZnNldCArPSAxNjsKLSAgICAgICAgcmVjb25fdXZvZmZzZXQgKz0gODsKLQotICAgICAgICArK3hkLT5tb2RlX2luZm9fY29udGV4dDsgIC8qIG5leHQgbWIgKi8KLQotICAgICAgICB4ZC0+YWJvdmVfY29udGV4dCsrOwotCi0gICAgfQotCi0gICAgLyogYWRqdXN0IHRvIHRoZSBuZXh0IHJvdyBvZiBtYnMgKi8KLSAgICB2cDhfZXh0ZW5kX21iX3JvdygKLSAgICAgICAgJnBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLAotICAgICAgICB4ZC0+ZHN0LnlfYnVmZmVyICsgMTYsIHhkLT5kc3QudV9idWZmZXIgKyA4LCB4ZC0+ZHN0LnZfYnVmZmVyICsgOAotICAgICk7Ci0KLSAgICArK3hkLT5tb2RlX2luZm9fY29udGV4dDsgICAgICAvKiBza2lwIHByZWRpY3Rpb24gY29sdW1uICovCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCByZWFkX3BhcnRpdGlvbl9zaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN4X3NpemUpCi17Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IHNpemUgPQotICAgICAgICBjeF9zaXplWzBdICsgKGN4X3NpemVbMV0gPDwgOCkgKyAoY3hfc2l6ZVsyXSA8PCAxNik7Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLQotc3RhdGljIHZvaWQgc2V0dXBfdG9rZW5fZGVjb2RlcihWUDhEX0NPTVAgKnBiaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3hfZGF0YSkKLXsKLSAgICBpbnQgbnVtX3BhcnQ7Ci0gICAgaW50IGk7Ci0gICAgVlA4X0NPTU1PTiAgICAgICAgICAqcGMgPSAmcGJpLT5jb21tb247Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9kYXRhX2VuZCA9IHBiaS0+U291cmNlICsgcGJpLT5zb3VyY2Vfc3o7Ci0gICAgdnA4X3JlYWRlciAgICAgICAgICAqYm9vbF9kZWNvZGVyOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhcnRpdGlvbjsKLQotICAgIC8qIFBhcnNlIG51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zIHRvIHVzZSAqLwotICAgIHBjLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24gPSAoVE9LRU5fUEFSVElUSU9OKXZwOF9yZWFkX2xpdGVyYWwoJnBiaS0+YmMsIDIpOwotICAgIG51bV9wYXJ0ID0gMSA8PCBwYy0+bXVsdGlfdG9rZW5fcGFydGl0aW9uOwotCi0gICAgLyogU2V0IHVwIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KLSAgICBwYXJ0aXRpb24gPSBjeF9kYXRhOwotICAgIGJvb2xfZGVjb2RlciA9ICZwYmktPmJjMjsKLQotICAgIGlmIChudW1fcGFydCA+IDEpCi0gICAgewotICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5tYmMsIHZweF9tYWxsb2MobnVtX3BhcnQgKiBzaXplb2YodnA4X3JlYWRlcikpKTsKLSAgICAgICAgYm9vbF9kZWNvZGVyID0gcGJpLT5tYmM7Ci0gICAgICAgIHBhcnRpdGlvbiArPSAzICogKG51bV9wYXJ0IC0gMSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJ0OyBpKyspCi0gICAgewotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYXJ0aXRpb25fc2l6ZV9wdHIgPSBjeF9kYXRhICsgaSAqIDM7Ci0gICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplOwotCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoaXMgcGFydGl0aW9uLiBUaGUgbGFzdCBwYXJ0aXRpb24KLSAgICAgICAgICogc2l6ZSBpcyBpbXBsaWNpdC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChpIDwgbnVtX3BhcnQgLSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSA9IHJlYWRfcGFydGl0aW9uX3NpemUocGFydGl0aW9uX3NpemVfcHRyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0gdXNlcl9kYXRhX2VuZCAtIHBhcnRpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJ0aXRpb24gKyBwYXJ0aXRpb25fc2l6ZSA+IHVzZXJfZGF0YV9lbmQKLSAgICAgICAgICAgIHx8IHBhcnRpdGlvbiArIHBhcnRpdGlvbl9zaXplIDwgcGFydGl0aW9uKQotICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgcGFja2V0IG9yIGNvcnJ1cHQgcGFydGl0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgbGVuZ3RoIiwgaSArIDEpOwotCi0gICAgICAgIGlmICh2cDhkeF9zdGFydF9kZWNvZGUoYm9vbF9kZWNvZGVyLCBwYXJ0aXRpb24sIHBhcnRpdGlvbl9zaXplKSkKLSAgICAgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGMtPmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgYm9vbCBkZWNvZGVyICVkIiwgaSArIDEpOwotCi0gICAgICAgIC8qIEFkdmFuY2UgdG8gdGhlIG5leHQgcGFydGl0aW9uICovCi0gICAgICAgIHBhcnRpdGlvbiArPSBwYXJ0aXRpb25fc2l6ZTsKLSAgICAgICAgYm9vbF9kZWNvZGVyKys7Ci0gICAgfQotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgLyogQ2xhbXAgbnVtYmVyIG9mIGRlY29kZXIgdGhyZWFkcyAqLwotICAgIGlmIChwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCA+IG51bV9wYXJ0IC0gMSkKLSAgICAgICAgcGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQgPSBudW1fcGFydCAtIDE7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgdm9pZCBzdG9wX3Rva2VuX2RlY29kZXIoVlA4RF9DT01QICpwYmkpCi17Ci0gICAgVlA4X0NPTU1PTiAqcGMgPSAmcGJpLT5jb21tb247Ci0KLSAgICBpZiAocGMtPm11bHRpX3Rva2VuX3BhcnRpdGlvbiAhPSBPTkVfUEFSVElUSU9OKQotICAgICAgICB2cHhfZnJlZShwYmktPm1iYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfZnJhbWUoVlA4RF9DT01QICpwYmkpCi17Ci0gICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOwotICAgIE1BQ1JPQkxPQ0tEICpjb25zdCB4ZCAgPSAmIHBiaS0+bWI7Ci0KLSAgICBpZiAocGMtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgLyogVmFyaW91cyBrZXlmcmFtZSBpbml0aWFsaXphdGlvbnMgKi8KLSAgICAgICAgdnB4X21lbWNweShwYy0+ZmMubXZjLCB2cDhfZGVmYXVsdF9tdl9jb250ZXh0LCBzaXplb2YodnA4X2RlZmF1bHRfbXZfY29udGV4dCkpOwotCi0gICAgICAgIHZwOF9pbml0X21ibW9kZV9wcm9icyhwYyk7Ci0KLSAgICAgICAgdnA4X2RlZmF1bHRfY29lZl9wcm9icyhwYyk7Ci0gICAgICAgIHZwOF9rZl9kZWZhdWx0X2Jtb2RlX3Byb2JzKHBjLT5rZl9ibW9kZV9wcm9iKTsKLQotICAgICAgICAvKiByZXNldCB0aGUgc2VnbWVudCBmZWF0dXJlIGRhdGEgdG8gMCB3aXRoIGRlbHRhIGNvZGluZyAoRGVmYXVsdCBzdGF0ZSkuICovCi0gICAgICAgIHZweF9tZW1zZXQoeGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhLCAwLCBzaXplb2YoeGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhKSk7Ci0gICAgICAgIHhkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgPSBTRUdNRU5UX0RFTFRBREFUQTsKLQotICAgICAgICAvKiByZXNldCB0aGUgbW9kZSByZWYgZGVsdGFzYSBmb3IgbG9vcCBmaWx0ZXIgKi8KLSAgICAgICAgdnB4X21lbXNldCh4ZC0+cmVmX2xmX2RlbHRhcywgMCwgc2l6ZW9mKHhkLT5yZWZfbGZfZGVsdGFzKSk7Ci0gICAgICAgIHZweF9tZW1zZXQoeGQtPm1vZGVfbGZfZGVsdGFzLCAwLCBzaXplb2YoeGQtPm1vZGVfbGZfZGVsdGFzKSk7Ci0KLSAgICAgICAgLyogQWxsIGJ1ZmZlcnMgYXJlIGltcGxpY2l0bHkgdXBkYXRlZCBvbiBrZXkgZnJhbWVzLiAqLwotICAgICAgICBwYy0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAxOwotICAgICAgICBwYy0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lID0gMTsKLSAgICAgICAgcGMtPmNvcHlfYnVmZmVyX3RvX2dmID0gMDsKLSAgICAgICAgcGMtPmNvcHlfYnVmZmVyX3RvX2FyZiA9IDA7Ci0KLSAgICAgICAgLyogTm90ZSB0aGF0IEdvbGRlbiBhbmQgQWx0cmVmIG1vZGVzIGNhbm5vdCBiZSB1c2VkIG9uIGEga2V5IGZyYW1lIHNvCi0gICAgICAgICAqIHJlZl9mcmFtZV9zaWduX2JpYXNbXSBpcyB1bmRlZmluZWQgYW5kIG1lYW5pbmdsZXNzCi0gICAgICAgICAqLwotICAgICAgICBwYy0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tHT0xERU5fRlJBTUVdID0gMDsKLSAgICAgICAgcGMtPnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghcGMtPnVzZV9iaWxpbmVhcl9tY19maWx0ZXIpCi0gICAgICAgICAgICBwYy0+bWNvbXBfZmlsdGVyX3R5cGUgPSBTSVhUQVA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBjLT5tY29tcF9maWx0ZXJfdHlwZSA9IEJJTElORUFSOwotCi0gICAgICAgIC8qIFRvIGVuYWJsZSBjaG9pY2Ugb2YgZGlmZmVyZW50IGludGVycGxvYXRpb24gZmlsdGVycyAqLwotICAgICAgICBpZiAocGMtPm1jb21wX2ZpbHRlcl90eXBlID09IFNJWFRBUCkKLSAgICAgICAgewotICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICA9IFNVQlBJWF9JTlZPS0UoUlRDRF9WVEFCTEUoc3VicGl4KSwgc2l4dGFwNHg0KTsKLSAgICAgICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg0ICAgPSBTVUJQSVhfSU5WT0tFKFJUQ0RfVlRBQkxFKHN1YnBpeCksIHNpeHRhcDh4NCk7Ci0gICAgICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4OCAgID0gU1VCUElYX0lOVk9LRShSVENEX1ZUQUJMRShzdWJwaXgpLCBzaXh0YXA4eDgpOwotICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiA9IFNVQlBJWF9JTlZPS0UoUlRDRF9WVEFCTEUoc3VicGl4KSwgc2l4dGFwMTZ4MTYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICA9IFNVQlBJWF9JTlZPS0UoUlRDRF9WVEFCTEUoc3VicGl4KSwgYmlsaW5lYXI0eDQpOwotICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQgICA9IFNVQlBJWF9JTlZPS0UoUlRDRF9WVEFCTEUoc3VicGl4KSwgYmlsaW5lYXI4eDQpOwotICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDggICA9IFNVQlBJWF9JTlZPS0UoUlRDRF9WVEFCTEUoc3VicGl4KSwgYmlsaW5lYXI4eDgpOwotICAgICAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiA9IFNVQlBJWF9JTlZPS0UoUlRDRF9WVEFCTEUoc3VicGl4KSwgYmlsaW5lYXIxNngxNik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB4ZC0+bGVmdF9jb250ZXh0ID0gJnBjLT5sZWZ0X2NvbnRleHQ7Ci0gICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ID0gcGMtPm1pOwotICAgIHhkLT5mcmFtZV90eXBlID0gcGMtPmZyYW1lX3R5cGU7Ci0gICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBEQ19QUkVEOwotICAgIHhkLT5tb2RlX2luZm9fc3RyaWRlID0gcGMtPm1vZGVfaW5mb19zdHJpZGU7Ci0gICAgeGQtPmNvcnJ1cHRlZCA9IDA7IC8qIGluaXQgd2l0aG91dCBjb3JydXB0aW9uICovCi19Ci0KLWludCB2cDhfZGVjb2RlX2ZyYW1lKFZQOERfQ09NUCAqcGJpKQotewotICAgIHZwOF9yZWFkZXIgKmNvbnN0IGJjID0gJiBwYmktPmJjOwotICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKLSAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgID0gJiBwYmktPm1iOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBiaS0+U291cmNlOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IGRhdGFfZW5kID0gZGF0YSArIHBiaS0+c291cmNlX3N6OwotICAgIHB0cmRpZmZfdCBmaXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzOwotCi0gICAgaW50IG1iX3JvdzsKLSAgICBpbnQgaSwgaiwgaywgbDsKLSAgICBjb25zdCBpbnQgKmNvbnN0IG1iX2ZlYXR1cmVfZGF0YV9iaXRzID0gdnA4X21iX2ZlYXR1cmVfZGF0YV9iaXRzOwotCi0gICAgLyogc3RhcnQgd2l0aCBubyBjb3JydXB0aW9uIG9mIGN1cnJlbnQgZnJhbWUgKi8KLSAgICB4ZC0+Y29ycnVwdGVkID0gMDsKLSAgICBwYy0+eXYxMl9mYltwYy0+bmV3X2ZiX2lkeF0uY29ycnVwdGVkID0gMDsKLQotICAgIGlmIChkYXRhX2VuZCAtIGRhdGEgPCAzKQotICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBjLT5lcnJvciwgVlBYX0NPREVDX0NPUlJVUFRfRlJBTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ1bmNhdGVkIHBhY2tldCIpOwotICAgIHBjLT5mcmFtZV90eXBlID0gKEZSQU1FX1RZUEUpKGRhdGFbMF0gJiAxKTsKLSAgICBwYy0+dmVyc2lvbiA9IChkYXRhWzBdID4+IDEpICYgNzsKLSAgICBwYy0+c2hvd19mcmFtZSA9IChkYXRhWzBdID4+IDQpICYgMTsKLSAgICBmaXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzID0KLSAgICAgICAgKGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KSkgPj4gNTsKLSAgICBkYXRhICs9IDM7Ci0KLSAgICBpZiAoZGF0YSArIGZpcnN0X3BhcnRpdGlvbl9sZW5ndGhfaW5fYnl0ZXMgPiBkYXRhX2VuZAotICAgICAgICB8fCBkYXRhICsgZmlyc3RfcGFydGl0aW9uX2xlbmd0aF9pbl9ieXRlcyA8IGRhdGEpCi0gICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGMtPmVycm9yLCBWUFhfQ09ERUNfQ09SUlVQVF9GUkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgcGFja2V0IG9yIGNvcnJ1cHQgcGFydGl0aW9uIDAgbGVuZ3RoIik7Ci0gICAgdnA4X3NldHVwX3ZlcnNpb24ocGMpOwotCi0gICAgaWYgKHBjLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIGNvbnN0IGludCBXaWR0aCA9IHBjLT5XaWR0aDsKLSAgICAgICAgY29uc3QgaW50IEhlaWdodCA9IHBjLT5IZWlnaHQ7Ci0KLSAgICAgICAgLyogdmV0IHZpYSBzeW5jIGNvZGUgKi8KLSAgICAgICAgaWYgKGRhdGFbMF0gIT0gMHg5ZCB8fCBkYXRhWzFdICE9IDB4MDEgfHwgZGF0YVsyXSAhPSAweDJhKQotICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnJhbWUgc3luYyBjb2RlIik7Ci0KLSAgICAgICAgcGMtPldpZHRoID0gKGRhdGFbM10gfCAoZGF0YVs0XSA8PCA4KSkgJiAweDNmZmY7Ci0gICAgICAgIHBjLT5ob3Jpel9zY2FsZSA9IGRhdGFbNF0gPj4gNjsKLSAgICAgICAgcGMtPkhlaWdodCA9IChkYXRhWzVdIHwgKGRhdGFbNl0gPDwgOCkpICYgMHgzZmZmOwotICAgICAgICBwYy0+dmVydF9zY2FsZSA9IGRhdGFbNl0gPj4gNjsKLSAgICAgICAgZGF0YSArPSA3OwotCi0gICAgICAgIGlmIChXaWR0aCAhPSBwYy0+V2lkdGggIHx8ICBIZWlnaHQgIT0gcGMtPkhlaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHByZXZfbWJfcm93cyA9IHBjLT5tYl9yb3dzOwotCi0gICAgICAgICAgICBpZiAocGMtPldpZHRoIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGMtPldpZHRoID0gV2lkdGg7Ci0gICAgICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSB3aWR0aCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGMtPkhlaWdodCA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBjLT5IZWlnaHQgPSBIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZwYy0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSBoZWlnaHQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZwOF9hbGxvY19mcmFtZV9idWZmZXJzKHBjLCBwYy0+V2lkdGgsIHBjLT5IZWlnaHQpKQotICAgICAgICAgICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmcGMtPmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlcnMiKTsKLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgICAgICAgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkKQotICAgICAgICAgICAgICAgIHZwOG10X2FsbG9jX3RlbXBfYnVmZmVycyhwYmksIHBjLT5XaWR0aCwgcHJldl9tYl9yb3dzKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBjLT5XaWR0aCA9PSAwIHx8IHBjLT5IZWlnaHQgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbml0X2ZyYW1lKHBiaSk7Ci0KLSAgICBpZiAodnA4ZHhfc3RhcnRfZGVjb2RlKGJjLCBkYXRhLCBkYXRhX2VuZCAtIGRhdGEpKQotICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBjLT5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgYm9vbCBkZWNvZGVyIDAiKTsKLSAgICBpZiAocGMtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB7Ci0gICAgICAgIHBjLT5jbHJfdHlwZSAgICA9IChZVVZfVFlQRSl2cDhfcmVhZF9iaXQoYmMpOwotICAgICAgICBwYy0+Y2xhbXBfdHlwZSAgPSAoQ0xBTVBfVFlQRSl2cDhfcmVhZF9iaXQoYmMpOwotICAgIH0KLQotICAgIC8qIElzIHNlZ21lbnRhdGlvbiBlbmFibGVkICovCi0gICAgeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkID0gKHVuc2lnbmVkIGNoYXIpdnA4X3JlYWRfYml0KGJjKTsKLQotICAgIGlmICh4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQpCi0gICAgewotICAgICAgICAvKiBTaWduYWwgd2hldGhlciBvciBub3QgdGhlIHNlZ21lbnRhdGlvbiBtYXAgaXMgYmVpbmcgZXhwbGljaXRseSB1cGRhdGVkIHRoaXMgZnJhbWUuICovCi0gICAgICAgIHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9ICh1bnNpZ25lZCBjaGFyKXZwOF9yZWFkX2JpdChiYyk7Ci0gICAgICAgIHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAodW5zaWduZWQgY2hhcil2cDhfcmVhZF9iaXQoYmMpOwotCi0gICAgICAgIGlmICh4ZC0+dXBkYXRlX21iX3NlZ21lbnRhdGlvbl9kYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICB4ZC0+bWJfc2VnZW1lbnRfYWJzX2RlbHRhID0gKHVuc2lnbmVkIGNoYXIpdnA4X3JlYWRfYml0KGJjKTsKLQotICAgICAgICAgICAgdnB4X21lbXNldCh4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEsIDAsIHNpemVvZih4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEpKTsKLQotICAgICAgICAgICAgLyogRm9yIGVhY2ggc2VnbWVudGF0aW9uIGZlYXR1cmUgKFF1YW50IGFuZCBsb29wIGZpbHRlciBsZXZlbCkgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQl9MVkxfTUFYOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9NQl9TRUdNRU5UUzsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJhbWUgbGV2ZWwgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW2ldW2pdID0gKHNpZ25lZCBjaGFyKXZwOF9yZWFkX2xpdGVyYWwoYmMsIG1iX2ZlYXR1cmVfZGF0YV9iaXRzW2ldKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZwOF9yZWFkX2JpdChiYykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW2ldW2pdID0gLXhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtpXVtqXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbaV1bal0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4ZC0+dXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdoaWNoIG1hY3JvIGJsb2NrIGxldmVsIGZlYXR1cmVzIGFyZSBlbmFibGVkICovCi0gICAgICAgICAgICB2cHhfbWVtc2V0KHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnMsIDI1NSwgc2l6ZW9mKHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnMpKTsKLQotICAgICAgICAgICAgLyogUmVhZCB0aGUgcHJvYnMgdXNlZCB0byBkZWNvZGUgdGhlIHNlZ21lbnQgaWQgZm9yIGVhY2ggbWFjcm8gYmxvY2suICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUJfRkVBVFVSRV9UUkVFX1BST0JTOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgbm90IGV4cGxpY2l0bHkgc2V0IHZhbHVlIGlzIGRlZmF1bHRlZCB0byAyNTUgYnkgbWVtc2V0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgaWYgKHZwOF9yZWFkX2JpdChiYykpCi0gICAgICAgICAgICAgICAgICAgIHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbaV0gPSAodnA4X3Byb2IpdnA4X3JlYWRfbGl0ZXJhbChiYywgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZWFkIHRoZSBsb29wIGZpbHRlciBsZXZlbCBhbmQgdHlwZSAqLwotICAgIHBjLT5maWx0ZXJfdHlwZSA9IChMT09QRklMVEVSVFlQRSkgdnA4X3JlYWRfYml0KGJjKTsKLSAgICBwYy0+ZmlsdGVyX2xldmVsID0gdnA4X3JlYWRfbGl0ZXJhbChiYywgNik7Ci0gICAgcGMtPnNoYXJwbmVzc19sZXZlbCA9IHZwOF9yZWFkX2xpdGVyYWwoYmMsIDMpOwotCi0gICAgLyogUmVhZCBpbiBsb29wIGZpbHRlciBkZWx0YXMgYXBwbGllZCBhdCB0aGUgTUIgbGV2ZWwgYmFzZWQgb24gbW9kZSBvciByZWYgZnJhbWUuICovCi0gICAgeGQtPm1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZSA9IDA7Ci0gICAgeGQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQgPSAodW5zaWduZWQgY2hhcil2cDhfcmVhZF9iaXQoYmMpOwotCi0gICAgaWYgKHhkLT5tb2RlX3JlZl9sZl9kZWx0YV9lbmFibGVkKQotICAgIHsKLSAgICAgICAgLyogRG8gdGhlIGRlbHRhcyBuZWVkIHRvIGJlIHVwZGF0ZWQgKi8KLSAgICAgICAgeGQtPm1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZSA9ICh1bnNpZ25lZCBjaGFyKXZwOF9yZWFkX2JpdChiYyk7Ci0KLSAgICAgICAgaWYgKHhkLT5tb2RlX3JlZl9sZl9kZWx0YV91cGRhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNlbmQgdXBkYXRlICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9MRl9ERUxUQVM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qc2lnbiA9IHZwOF9yZWFkX2JpdCggYmMgKTsqLwotICAgICAgICAgICAgICAgICAgICB4ZC0+cmVmX2xmX2RlbHRhc1tpXSA9IChzaWduZWQgY2hhcil2cDhfcmVhZF9saXRlcmFsKGJjLCA2KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWRfYml0KGJjKSkgICAgICAgIC8qIEFwcGx5IHNpZ24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5yZWZfbGZfZGVsdGFzW2ldID0geGQtPnJlZl9sZl9kZWx0YXNbaV0gKiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNlbmQgdXBkYXRlICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVfTEZfREVMVEFTOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZwOF9yZWFkX2JpdChiYykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnNpZ24gPSB2cDhfcmVhZF9iaXQoIGJjICk7Ki8KLSAgICAgICAgICAgICAgICAgICAgeGQtPm1vZGVfbGZfZGVsdGFzW2ldID0gKHNpZ25lZCBjaGFyKXZwOF9yZWFkX2xpdGVyYWwoYmMsIDYpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2cDhfcmVhZF9iaXQoYmMpKSAgICAgICAgLyogQXBwbHkgc2lnbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeGQtPm1vZGVfbGZfZGVsdGFzW2ldID0geGQtPm1vZGVfbGZfZGVsdGFzW2ldICogLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2V0dXBfdG9rZW5fZGVjb2RlcihwYmksIGRhdGEgKyBmaXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzKTsKLSAgICB4ZC0+Y3VycmVudF9iYyA9ICZwYmktPmJjMjsKLQotICAgIC8qIFJlYWQgdGhlIGRlZmF1bHQgcXVhbnRpemVycy4gKi8KLSAgICB7Ci0gICAgICAgIGludCBRLCBxX3VwZGF0ZTsKLQotICAgICAgICBRID0gdnA4X3JlYWRfbGl0ZXJhbChiYywgNyk7ICAvKiBBQyAxc3Qgb3JkZXIgUSA9IGRlZmF1bHQgKi8KLSAgICAgICAgcGMtPmJhc2VfcWluZGV4ID0gUTsKLSAgICAgICAgcV91cGRhdGUgPSAwOwotICAgICAgICBwYy0+eTFkY19kZWx0YV9xID0gZ2V0X2RlbHRhX3EoYmMsIHBjLT55MWRjX2RlbHRhX3EsICZxX3VwZGF0ZSk7Ci0gICAgICAgIHBjLT55MmRjX2RlbHRhX3EgPSBnZXRfZGVsdGFfcShiYywgcGMtPnkyZGNfZGVsdGFfcSwgJnFfdXBkYXRlKTsKLSAgICAgICAgcGMtPnkyYWNfZGVsdGFfcSA9IGdldF9kZWx0YV9xKGJjLCBwYy0+eTJhY19kZWx0YV9xLCAmcV91cGRhdGUpOwotICAgICAgICBwYy0+dXZkY19kZWx0YV9xID0gZ2V0X2RlbHRhX3EoYmMsIHBjLT51dmRjX2RlbHRhX3EsICZxX3VwZGF0ZSk7Ci0gICAgICAgIHBjLT51dmFjX2RlbHRhX3EgPSBnZXRfZGVsdGFfcShiYywgcGMtPnV2YWNfZGVsdGFfcSwgJnFfdXBkYXRlKTsKLQotICAgICAgICBpZiAocV91cGRhdGUpCi0gICAgICAgICAgICB2cDhjeF9pbml0X2RlX3F1YW50aXplcihwYmkpOwotCi0gICAgICAgIC8qIE1CIGxldmVsIGRlcXVhbnRpemVyIHNldHVwICovCi0gICAgICAgIG1iX2luaXRfZGVxdWFudGl6ZXIocGJpLCAmcGJpLT5tYik7Ci0gICAgfQotCi0gICAgLyogRGV0ZXJtaW5lIGlmIHRoZSBnb2xkZW4gZnJhbWUgb3IgQVJGIGJ1ZmZlciBzaG91bGQgYmUgdXBkYXRlZCBhbmQgaG93LgotICAgICAqIEZvciBhbGwgbm9uIGtleSBmcmFtZXMgdGhlIEdGIGFuZCBBUkYgcmVmcmVzaCBmbGFncyBhbmQgc2lnbiBiaWFzCi0gICAgICogZmxhZ3MgbXVzdCBiZSBzZXQgZXhwbGljaXRseS4KLSAgICAgKi8KLSAgICBpZiAocGMtPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgLyogU2hvdWxkIHRoZSBHRiBvciBBUkYgYmUgdXBkYXRlZCBmcm9tIHRoZSBjdXJyZW50IGZyYW1lICovCi0gICAgICAgIHBjLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9IHZwOF9yZWFkX2JpdChiYyk7Ci0gICAgICAgIHBjLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSB2cDhfcmVhZF9iaXQoYmMpOwotCi0gICAgICAgIC8qIEJ1ZmZlciB0byBidWZmZXIgY29weSBmbGFncy4gKi8KLSAgICAgICAgcGMtPmNvcHlfYnVmZmVyX3RvX2dmID0gMDsKLQotICAgICAgICBpZiAoIXBjLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKLSAgICAgICAgICAgIHBjLT5jb3B5X2J1ZmZlcl90b19nZiA9IHZwOF9yZWFkX2xpdGVyYWwoYmMsIDIpOwotCi0gICAgICAgIHBjLT5jb3B5X2J1ZmZlcl90b19hcmYgPSAwOwotCi0gICAgICAgIGlmICghcGMtPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgICAgIHBjLT5jb3B5X2J1ZmZlcl90b19hcmYgPSB2cDhfcmVhZF9saXRlcmFsKGJjLCAyKTsKLQotICAgICAgICBwYy0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tHT0xERU5fRlJBTUVdID0gdnA4X3JlYWRfYml0KGJjKTsKLSAgICAgICAgcGMtPnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSA9IHZwOF9yZWFkX2JpdChiYyk7Ci0gICAgfQotCi0gICAgcGMtPnJlZnJlc2hfZW50cm9weV9wcm9icyA9IHZwOF9yZWFkX2JpdChiYyk7Ci0gICAgaWYgKHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZweF9tZW1jcHkoJnBjLT5sZmMsICZwYy0+ZmMsIHNpemVvZihwYy0+ZmMpKTsKLSAgICB9Ci0KLSAgICBwYy0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gcGMtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICB8fCAgdnA4X3JlYWRfYml0KGJjKTsKLQotICAgIGlmICgwKQotICAgIHsKLSAgICAgICAgRklMRSAqeiA9IGZvcGVuKCJkZWNvZGVzdGF0cy5zdHQiLCAiYSIpOwotICAgICAgICBmcHJpbnRmKHosICIlNmQgRjolZCxHOiVkLEE6JWQsTDolZCxROiVkXG4iLAotICAgICAgICAgICAgICAgIHBjLT5jdXJyZW50X3ZpZGVvX2ZyYW1lLAotICAgICAgICAgICAgICAgIHBjLT5mcmFtZV90eXBlLAotICAgICAgICAgICAgICAgIHBjLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSwKLSAgICAgICAgICAgICAgICBwYy0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lLAotICAgICAgICAgICAgICAgIHBjLT5yZWZyZXNoX2xhc3RfZnJhbWUsCi0gICAgICAgICAgICAgICAgcGMtPmJhc2VfcWluZGV4KTsKLSAgICAgICAgZmNsb3NlKHopOwotICAgIH0KLQotCi0gICAgewotICAgICAgICAvKiByZWFkIGNvZWYgcHJvYmFiaWxpdHkgdHJlZSAqLwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19UWVBFUzsgaSsrKQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENPRUZfQkFORFM7IGorKykKLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgUFJFVl9DT0VGX0NPTlRFWFRTOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBNQVhfRU5UUk9QWV9UT0tFTlMgLSAxOyBsKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3Byb2IgKmNvbnN0IHAgPSBwYy0+ZmMuY29lZl9wcm9icyBbaV1bal1ba10gKyBsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA4X3JlYWQoYmMsIHZwOF9jb2VmX3VwZGF0ZV9wcm9icyBbaV1bal1ba11bbF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gKHZwOF9wcm9iKXZwOF9yZWFkX2xpdGVyYWwoYmMsIDgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICB2cHhfbWVtY3B5KCZ4ZC0+cHJlLCAmcGMtPnl2MTJfZmJbcGMtPmxzdF9mYl9pZHhdLCBzaXplb2YoWVYxMl9CVUZGRVJfQ09ORklHKSk7Ci0gICAgdnB4X21lbWNweSgmeGQtPmRzdCwgJnBjLT55djEyX2ZiW3BjLT5uZXdfZmJfaWR4XSwgc2l6ZW9mKFlWMTJfQlVGRkVSX0NPTkZJRykpOwotCi0gICAgLyogc2V0IHVwIGZyYW1lIG5ldyBmcmFtZSBmb3IgaW50cmEgY29kZWQgYmxvY2tzICovCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgaWYgKCEocGJpLT5iX211bHRpdGhyZWFkZWRfcmQpIHx8IHBjLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24gPT0gT05FX1BBUlRJVElPTiB8fCAhKHBjLT5maWx0ZXJfbGV2ZWwpKQotI2VuZGlmCi0gICAgICAgIHZwOF9zZXR1cF9pbnRyYV9yZWNvbigmcGMtPnl2MTJfZmJbcGMtPm5ld19mYl9pZHhdKTsKLQotICAgIHZwOF9zZXR1cF9ibG9ja19kcHRycyh4ZCk7Ci0KLSAgICB2cDhfYnVpbGRfYmxvY2tfZG9mZnNldHMoeGQpOwotCi0gICAgLyogY2xlYXIgb3V0IHRoZSBjb2VmZiBidWZmZXIgKi8KLSAgICB2cHhfbWVtc2V0KHhkLT5xY29lZmYsIDAsIHNpemVvZih4ZC0+cWNvZWZmKSk7Ci0KLSAgICAvKiBSZWFkIHRoZSBtYl9ub19jb2VmZl9za2lwIGZsYWcgKi8KLSAgICBwYy0+bWJfbm9fY29lZmZfc2tpcCA9IChpbnQpdnA4X3JlYWRfYml0KGJjKTsKLQotCi0gICAgdnA4X2RlY29kZV9tb2RlX212cyhwYmkpOwotCi0gICAgdnB4X21lbXNldChwYy0+YWJvdmVfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpICogcGMtPm1iX2NvbHMpOwotCi0gICAgdnB4X21lbWNweSgmeGQtPmJsb2NrWzBdLmJtaSwgJnhkLT5tb2RlX2luZm9fY29udGV4dC0+Ym1pWzBdLCBzaXplb2YoQl9NT0RFX0lORk8pKTsKLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgIGlmIChwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCAmJiBwYy0+bXVsdGlfdG9rZW5fcGFydGl0aW9uICE9IE9ORV9QQVJUSVRJT04pCi0gICAgewotICAgICAgICB2cDhtdF9kZWNvZGVfbWJfcm93cyhwYmksIHhkKTsKLSAgICAgICAgaWYocGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKnZwOF9tdF9sb29wX2ZpbHRlcl9mcmFtZShwYmkpOyovIC8qY20sICZwYmktPm1iLCBjbS0+ZmlsdGVyX2xldmVsKTsqLwotCi0gICAgICAgICAgICBwYy0+bGFzdF9mcmFtZV90eXBlID0gcGMtPmZyYW1lX3R5cGU7Ci0gICAgICAgICAgICBwYy0+bGFzdF9maWx0ZXJfdHlwZSA9IHBjLT5maWx0ZXJfdHlwZTsKLSAgICAgICAgICAgIHBjLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IHBjLT5zaGFycG5lc3NfbGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfcHRyKCZwYy0+eXYxMl9mYltwYy0+bmV3X2ZiX2lkeF0pOyAgICAvKmNtLT5mcmFtZV90b19zaG93KTsqLwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIGludCBpYmMgPSAwOwotICAgICAgICBpbnQgbnVtX3BhcnQgPSAxIDw8IHBjLT5tdWx0aV90b2tlbl9wYXJ0aXRpb247Ci0KLSAgICAgICAgLyogRGVjb2RlIHRoZSBpbmRpdmlkdWFsIG1hY3JvIGJsb2NrICovCi0gICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgcGMtPm1iX3Jvd3M7IG1iX3JvdysrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChudW1fcGFydCA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeGQtPmN1cnJlbnRfYmMgPSAmIHBiaS0+bWJjW2liY107Ci0gICAgICAgICAgICAgICAgaWJjKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaWJjID09IG51bV9wYXJ0KQotICAgICAgICAgICAgICAgICAgICBpYmMgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVfbWJfcm93KHBiaSwgcGMsIG1iX3JvdywgeGQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBzdG9wX3Rva2VuX2RlY29kZXIocGJpKTsKLQotICAgIC8qIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgZGVjb2RlciBjb3JydXB0aW9uLiAqLwotICAgIC8qIDEuIENoZWNrIGZpcnN0IGJvb2xlYW4gZGVjb2RlciBmb3IgZXJyb3JzLiAqLwotICAgIHBjLT55djEyX2ZiW3BjLT5uZXdfZmJfaWR4XS5jb3JydXB0ZWQgPQotICAgICAgICB2cDhkeF9ib29sX2Vycm9yKGJjKTsKLSAgICAvKiAyLiBDaGVjayB0aGUgbWFjcm9ibG9jayBpbmZvcm1hdGlvbiAqLwotICAgIHBjLT55djEyX2ZiW3BjLT5uZXdfZmJfaWR4XS5jb3JydXB0ZWQgfD0KLSAgICAgICAgeGQtPmNvcnJ1cHRlZDsKLQotICAgIC8qIHZweF9sb2coIkRlY29kZXI6IEZyYW1lIERlY29kZWQsIFNpemUgUm91Z2hseTolZCBieXRlcyAgXG4iLGJjLT5wb3MrcGJpLT5iYzIucG9zKTsgKi8KLQotICAgIC8qIElmIHRoaXMgd2FzIGEga2Ygb3IgR2Ygbm90ZSB0aGUgUSB1c2VkICovCi0gICAgaWYgKChwYy0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHx8Ci0gICAgICAgICBwYy0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgfHwgcGMtPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICB7Ci0gICAgICAgIHBjLT5sYXN0X2tmX2dmX3EgPSBwYy0+YmFzZV9xaW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKHBjLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZweF9tZW1jcHkoJnBjLT5mYywgJnBjLT5sZmMsIHNpemVvZihwYy0+ZmMpKTsKLSAgICB9Ci0KLSNpZmRlZiBQQUNLRVRfVEVTVElORwotICAgIHsKLSAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJkZWNvbXByZXNzb3IuVlA4IiwgImFiIik7Ci0gICAgICAgIHVuc2lnbmVkIGludCBzaXplID0gcGJpLT5iYzIucG9zICsgcGJpLT5iYy5wb3MgKyA4OwotICAgICAgICBmd3JpdGUoKHZvaWQgKikgJnNpemUsIDQsIDEsIGYpOwotICAgICAgICBmd3JpdGUoKHZvaWQgKikgcGJpLT5Tb3VyY2UsIHNpemUsIDEsIGYpOwotICAgICAgICBmY2xvc2UoZik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2RlcXVhbnRpemUuYyBiL3ZwOC9kZWNvZGVyL2RlcXVhbnRpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwYzEzYi4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9kZXF1YW50aXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAiZGVxdWFudGl6ZS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vaWRjdC5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotCi1leHRlcm4gdm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKSA7Ci1leHRlcm4gdm9pZCB2cDhfc2hvcnRfaWRjdDR4NGxsbV8xX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotCi0KLXZvaWQgdnA4X2RlcXVhbnRpemVfYl9jKEJMT0NLRCAqZCkKLXsKLSAgICBpbnQgaTsKLSAgICBzaG9ydCAqRFEgID0gZC0+ZHFjb2VmZjsKLSAgICBzaG9ydCAqUSAgID0gZC0+cWNvZWZmOwotICAgIHNob3J0ICpEUUMgPSBkLT5kZXF1YW50OwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBEUVtpXSA9IFFbaV0gKiBEUUNbaV07Ci0gICAgfQotfQotCi12b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCwgaW50IHBpdGNoLCBpbnQgc3RyaWRlKQotewotICAgIHNob3J0IG91dHB1dFsxNl07Ci0gICAgc2hvcnQgKmRpZmZfcHRyID0gb3V0cHV0OwotICAgIGludCByLCBjOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBpbnB1dFtpXSA9IGRxW2ldICogaW5wdXRbaV07Ci0gICAgfQotCi0gICAgLyogdGhlIGlkY3QgaGFsdmVzICggPj4gMSkgdGhlIHBpdGNoICovCi0gICAgdnA4X3Nob3J0X2lkY3Q0eDRsbG1fYyhpbnB1dCwgb3V0cHV0LCA0IDw8IDEpOwotCi0gICAgdnB4X21lbXNldChpbnB1dCwgMCwgMzIpOwotCi0gICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhID0gZGlmZl9wdHJbY10gKyBwcmVkW2NdOwotCi0gICAgICAgICAgICBpZiAoYSA8IDApCi0gICAgICAgICAgICAgICAgYSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChhID4gMjU1KQotICAgICAgICAgICAgICAgIGEgPSAyNTU7Ci0KLSAgICAgICAgICAgIGRlc3RbY10gPSAodW5zaWduZWQgY2hhcikgYTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlc3QgKz0gc3RyaWRlOwotICAgICAgICBkaWZmX3B0ciArPSA0OwotICAgICAgICBwcmVkICs9IHBpdGNoOwotICAgIH0KLX0KLQotdm9pZCB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBwaXRjaCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGMpCi17Ci0gICAgaW50IGk7Ci0gICAgc2hvcnQgb3V0cHV0WzE2XTsKLSAgICBzaG9ydCAqZGlmZl9wdHIgPSBvdXRwdXQ7Ci0gICAgaW50IHIsIGM7Ci0KLSAgICBpbnB1dFswXSA9IChzaG9ydClEYzsKLQotICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgaW5wdXRbaV0gPSBkcVtpXSAqIGlucHV0W2ldOwotICAgIH0KLQotICAgIC8qIHRoZSBpZGN0IGhhbHZlcyAoID4+IDEpIHRoZSBwaXRjaCAqLwotICAgIHZwOF9zaG9ydF9pZGN0NHg0bGxtX2MoaW5wdXQsIG91dHB1dCwgNCA8PCAxKTsKLQotICAgIHZweF9tZW1zZXQoaW5wdXQsIDAsIDMyKTsKLQotICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYSA9IGRpZmZfcHRyW2NdICsgcHJlZFtjXTsKLQotICAgICAgICAgICAgaWYgKGEgPCAwKQotICAgICAgICAgICAgICAgIGEgPSAwOwotCi0gICAgICAgICAgICBpZiAoYSA+IDI1NSkKLSAgICAgICAgICAgICAgICBhID0gMjU1OwotCi0gICAgICAgICAgICBkZXN0W2NdID0gKHVuc2lnbmVkIGNoYXIpIGE7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXN0ICs9IHN0cmlkZTsKLSAgICAgICAgZGlmZl9wdHIgKz0gNDsKLSAgICAgICAgcHJlZCArPSBwaXRjaDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9kZXF1YW50aXplLmggYi92cDgvZGVjb2Rlci9kZXF1YW50aXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTc4YzUuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvZGVxdWFudGl6ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIERFUVVBTlRJWkVfSAotI2RlZmluZSBERVFVQU5USVpFX0gKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgotCi0jZGVmaW5lIHByb3RvdHlwZV9kZXF1YW50X2Jsb2NrKHN5bSkgXAotICAgIHZvaWQgc3ltKEJMT0NLRCAqeCkKLQotI2RlZmluZSBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZChzeW0pIFwKLSAgICB2b2lkIHN5bShzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgXAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZWQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgXAotICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IHN0cmlkZSkKLQotI2RlZmluZSBwcm90b3R5cGVfZGVxdWFudF9kY19pZGN0X2FkZChzeW0pIFwKLSAgICB2b2lkIHN5bShzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgXAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZWQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgXAotICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IHN0cmlkZSwgXAotICAgICAgICAgICAgIGludCBkYykKLQotI2RlZmluZSBwcm90b3R5cGVfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrKHN5bSkgXAotICAgIHZvaWQgc3ltKHNob3J0ICpxLCBzaG9ydCAqZHEsIFwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgXAotICAgICAgICAgICAgIGludCBzdHJpZGUsIGNoYXIgKmVvYnMsIHNob3J0ICpkYykKLQotI2RlZmluZSBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrKHN5bSkgXAotICAgIHZvaWQgc3ltKHNob3J0ICpxLCBzaG9ydCAqZHEsIFwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgXAotICAgICAgICAgICAgIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi0KLSNkZWZpbmUgcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2soc3ltKSBcCi0gICAgdm9pZCBzeW0oc2hvcnQgKnEsIHNob3J0ICpkcSwgXAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZSwgdW5zaWduZWQgY2hhciAqZHN0X3UsIFwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3RfdiwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKLQotI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0Ci0jaW5jbHVkZSAieDg2L2RlcXVhbnRpemVfeDg2LmgiCi0jZW5kaWYKLQotI2lmIEFSQ0hfQVJNCi0jaW5jbHVkZSAiYXJtL2RlcXVhbnRpemVfYXJtLmgiCi0jZW5kaWYKLQotI2lmIEFSQ0hfTUlQUwotI2lmIGRlZmluZWQoTUlQU19EU1BfUkVWKSAmJiBNSVBTX0RTUF9SRVY+PTIKLSNpbmNsdWRlICJtaXBzL2RlcXVhbnRpemVfbWlwcy5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiB2cDhfZGVxdWFudF9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9ibG9jayB2cDhfZGVxdWFudGl6ZV9iX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2Jsb2NrKHZwOF9kZXF1YW50X2Jsb2NrKTsKLQotI2lmbmRlZiB2cDhfZGVxdWFudF9pZGN0X2FkZAotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZCh2cDhfZGVxdWFudF9pZGN0X2FkZCk7Ci0KLSNpZm5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQKLSNkZWZpbmUgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfZGNfaWRjdF9hZGQodnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQpOwotCi0jaWZuZGVmIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2sKLSNkZWZpbmUgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jayB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jayk7Ci0KLSNpZm5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jayh2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrKTsKLQotI2lmbmRlZiB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayh2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayk7Ci0KLQotdHlwZWRlZiBwcm90b3R5cGVfZGVxdWFudF9ibG9jaygoKnZwOF9kZXF1YW50X2Jsb2NrX2ZuX3QpKTsKLQotdHlwZWRlZiBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZCgoKnZwOF9kZXF1YW50X2lkY3RfYWRkX2ZuX3QpKTsKLQotdHlwZWRlZiBwcm90b3R5cGVfZGVxdWFudF9kY19pZGN0X2FkZCgoKnZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX2ZuX3QpKTsKLQotdHlwZWRlZiBwcm90b3R5cGVfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrKCgqdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja19mbl90KSk7Ci0KLXR5cGVkZWYgcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jaygoKnZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfZm5fdCkpOwotCi10eXBlZGVmIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrKCgqdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfZm5fdCkpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHZwOF9kZXF1YW50X2Jsb2NrX2ZuX3QgICAgICAgICAgICAgICBibG9jazsKLSAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9mbl90ICAgICAgICAgICAgaWRjdF9hZGQ7Ci0gICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfZm5fdCAgICAgICAgIGRjX2lkY3RfYWRkOwotICAgIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfZm5fdCBkY19pZGN0X2FkZF95X2Jsb2NrOwotICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfZm5fdCAgICBpZGN0X2FkZF95X2Jsb2NrOwotICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2ZuX3QgICBpZGN0X2FkZF91dl9ibG9jazsKLX0gdnA4X2RlcXVhbnRfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgREVRVUFOVF9JTlZPS0UoY3R4LGZuKSAoY3R4KS0+Zm4KLSNlbHNlCi0jZGVmaW5lIERFUVVBTlRfSU5WT0tFKGN0eCxmbikgdnA4X2RlcXVhbnRfIyNmbgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvZGV0b2tlbml6ZS5jIGIvdnA4L2RlY29kZXIvZGV0b2tlbml6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUwODE5Li4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL2RldG9rZW5pemUuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9jb21tb24vdHlwZV9hbGlhc2VzLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKLSNpbmNsdWRlICJvbnl4ZF9pbnQuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCi0jaW5jbHVkZSAiZGV0b2tlbml6ZS5oIgotCi0jZGVmaW5lIEJPT0xfREFUQSBVSU5UOAotCi0jZGVmaW5lIE9DQl9YIFBSRVZfQ09FRl9DT05URVhUUyAqIEVOVFJPUFlfTk9ERVMKLURFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIsIGNvZWZfYmFuZHNfeFsxNl0pID0KLXsKLSAgICAwICogT0NCX1gsIDEgKiBPQ0JfWCwgMiAqIE9DQl9YLCAzICogT0NCX1gsCi0gICAgNiAqIE9DQl9YLCA0ICogT0NCX1gsIDUgKiBPQ0JfWCwgNiAqIE9DQl9YLAotICAgIDYgKiBPQ0JfWCwgNiAqIE9DQl9YLCA2ICogT0NCX1gsIDYgKiBPQ0JfWCwKLSAgICA2ICogT0NCX1gsIDYgKiBPQ0JfWCwgNiAqIE9DQl9YLCA3ICogT0NCX1gKLX07Ci0jZGVmaW5lIEVPQl9DT05URVhUX05PREUgICAgICAgICAgICAwCi0jZGVmaW5lIFpFUk9fQ09OVEVYVF9OT0RFICAgICAgICAgICAxCi0jZGVmaW5lIE9ORV9DT05URVhUX05PREUgICAgICAgICAgICAyCi0jZGVmaW5lIExPV19WQUxfQ09OVEVYVF9OT0RFICAgICAgICAzCi0jZGVmaW5lIFRXT19DT05URVhUX05PREUgICAgICAgICAgICA0Ci0jZGVmaW5lIFRIUkVFX0NPTlRFWFRfTk9ERSAgICAgICAgICA1Ci0jZGVmaW5lIEhJR0hfTE9XX0NPTlRFWFRfTk9ERSAgICAgICA2Ci0jZGVmaW5lIENBVF9PTkVfQ09OVEVYVF9OT0RFICAgICAgICA3Ci0jZGVmaW5lIENBVF9USFJFRUZPVVJfQ09OVEVYVF9OT0RFICA4Ci0jZGVmaW5lIENBVF9USFJFRV9DT05URVhUX05PREUgICAgICA5Ci0jZGVmaW5lIENBVF9GSVZFX0NPTlRFWFRfTk9ERSAgICAgICAxMAotCi0vKgotLy90aGUgZGVmaW5pdGlvbiBpcyBwdXQgaW4gIm9ueXhkX2ludC5oIgotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBJTlQxNiAgICAgICAgIG1pbl92YWw7Ci0gICAgSU5UMTYgICAgICAgICBMZW5ndGg7Ci0gICAgVUlOVDggUHJvYnNbMTJdOwotfSBUT0tFTkVYVFJBQklUUzsKLSovCi0KLURFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IFRPS0VORVhUUkFCSVRTLCB2cDhkX3Rva2VuX2V4dHJhX2JpdHMyW01BWF9FTlRST1BZX1RPS0VOU10pID0KLXsKLSAgICB7ICAwLCAtMSwgeyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9IH0sICAvKiBaRVJPX1RPS0VOICovCi0gICAgeyAgMSwgMCwgeyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9IH0sICAgLyogT05FX1RPS0VOICovCi0gICAgeyAgMiwgMCwgeyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9IH0sICAgLyogVFdPX1RPS0VOICovCi0gICAgeyAgMywgMCwgeyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9IH0sICAgLyogVEhSRUVfVE9LRU4gKi8KLSAgICB7ICA0LCAwLCB7IDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0gfSwgICAvKiBGT1VSX1RPS0VOICovCi0gICAgeyAgNSwgMCwgeyAxNTksIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSB9LCAgLyogRENUX1ZBTF9DQVRFR09SWTEgKi8KLSAgICB7ICA3LCAxLCB7IDE0NSwgMTY1LCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSB9LCAvKiBEQ1RfVkFMX0NBVEVHT1JZMiAqLwotICAgIHsgMTEsIDIsIHsgMTQwLCAxNDgsIDE3MywgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSB9LCAvKiBEQ1RfVkFMX0NBVEVHT1JZMyAqLwotICAgIHsgMTksIDMsIHsgMTM1LCAxNDAsIDE1NSwgMTc2LCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0gfSwgLyogRENUX1ZBTF9DQVRFR09SWTQgKi8KLSAgICB7IDM1LCA0LCB7IDEzMCwgMTM0LCAxNDEsIDE1NywgMTgwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSB9LCAvKiBEQ1RfVkFMX0NBVEVHT1JZNSAqLwotICAgIHsgNjcsIDEwLCB7IDEyOSwgMTMwLCAxMzMsIDE0MCwgMTUzLCAxNzcsIDE5NiwgMjMwLCAyNDMsIDI1NCwgMjU0LCAwICAgfSB9LCAvKiBEQ1RfVkFMX0NBVEVHT1JZNiAqLwotICAgIHsgIDAsIC0xLCB7IDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0gfSwgIC8qICBFT0IgVE9LRU4gKi8KLX07Ci0KLQotdm9pZCB2cDhfcmVzZXRfbWJfdG9rZW5zX2NvbnRleHQoTUFDUk9CTE9DS0QgKngpCi17Ci0gICAgLyogQ2xlYXIgZW50cm9weSBjb250ZXh0cyBmb3IgWTIgYmxvY2tzICovCi0gICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVEICYmIHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoeC0+YWJvdmVfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLSAgICAgICAgdnB4X21lbXNldCh4LT5sZWZ0X2NvbnRleHQsIDAsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoeC0+YWJvdmVfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpLTEpOwotICAgICAgICB2cHhfbWVtc2V0KHgtPmxlZnRfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpLTEpOwotICAgIH0KLX0KLQotREVDTEFSRV9BTElHTkVEKDE2LCBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciwgdnA4ZHhfYml0cmVhZGVyX25vcm1bMjU2XSk7Ci0jZGVmaW5lIEZJTEwgXAotICAgIGlmKGNvdW50IDwgMCkgXAotICAgICAgICBWUDhEWF9CT09MX0RFQ09ERVJfRklMTChjb3VudCwgdmFsdWUsIGJ1ZnB0ciwgYnVmZW5kKTsKLQotI2RlZmluZSBOT1JNQUxJWkUgXAotICAgIC8qaWYocmFuZ2UgPCAweDgwKSovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IFwKLSAgICAgICAgc2hpZnQgPSB2cDhkeF9iaXRyZWFkZXJfbm9ybVtyYW5nZV07IFwKLSAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OyBcCi0gICAgICAgIHZhbHVlIDw8PSBzaGlmdDsgXAotICAgICAgICBjb3VudCAtPSBzaGlmdDsgXAotICAgIH0KLQotI2RlZmluZSBERUNPREVfQU5EX0FQUExZU0lHTih2YWx1ZV90b19zaWduKSBcCi0gICAgc3BsaXQgPSAocmFuZ2UgKyAxKSA+PiAxOyBcCi0gICAgYmlnc3BsaXQgPSAoVlA4X0JEX1ZBTFVFKXNwbGl0IDw8IChWUDhfQkRfVkFMVUVfU0laRSAtIDgpOyBcCi0gICAgRklMTCBcCi0gICAgaWYgKCB2YWx1ZSA8IGJpZ3NwbGl0ICkgXAotICAgIHsgXAotICAgICAgICByYW5nZSA9IHNwbGl0OyBcCi0gICAgICAgIHY9IHZhbHVlX3RvX3NpZ247IFwKLSAgICB9IFwKLSAgICBlbHNlIFwKLSAgICB7IFwKLSAgICAgICAgcmFuZ2UgPSByYW5nZS1zcGxpdDsgXAotICAgICAgICB2YWx1ZSA9IHZhbHVlLWJpZ3NwbGl0OyBcCi0gICAgICAgIHYgPSAtdmFsdWVfdG9fc2lnbjsgXAotICAgIH0gXAotICAgIHJhbmdlICs9cmFuZ2U7ICAgICAgICAgICAgICAgICAgIFwKLSAgICB2YWx1ZSArPXZhbHVlOyAgICAgICAgICAgICAgICAgICBcCi0gICAgY291bnQtLTsKLQotI2RlZmluZSBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKHByb2JhYmlsaXR5LGJyYW5jaCkgXAotICAgIHsgXAotICAgICAgICBzcGxpdCA9IDEgKyAgKCgoIHByb2JhYmlsaXR5KihyYW5nZS0xKSApICk+PiA4KTsgXAotICAgICAgICBiaWdzcGxpdCA9IChWUDhfQkRfVkFMVUUpc3BsaXQgPDwgKFZQOF9CRF9WQUxVRV9TSVpFIC0gOCk7IFwKLSAgICAgICAgRklMTCBcCi0gICAgICAgIGlmICggdmFsdWUgPCBiaWdzcGxpdCApIFwKLSAgICAgICAgeyBcCi0gICAgICAgICAgICByYW5nZSA9IHNwbGl0OyBcCi0gICAgICAgICAgICBOT1JNQUxJWkUgXAotICAgICAgICAgICAgZ290byBicmFuY2g7IFwKLSAgICAgICAgfSBcCi0gICAgICAgIHZhbHVlIC09IGJpZ3NwbGl0OyBcCi0gICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsgXAotICAgICAgICBOT1JNQUxJWkUgXAotICAgIH0KLQotI2RlZmluZSBERUNPREVfQU5EX0xPT1BfSUZfWkVSTyhwcm9iYWJpbGl0eSxicmFuY2gpIFwKLSAgICB7IFwKLSAgICAgICAgc3BsaXQgPSAxICsgKCgoIHByb2JhYmlsaXR5KihyYW5nZS0xKSApICkgPj4gOCk7IFwKLSAgICAgICAgYmlnc3BsaXQgPSAoVlA4X0JEX1ZBTFVFKXNwbGl0IDw8IChWUDhfQkRfVkFMVUVfU0laRSAtIDgpOyBcCi0gICAgICAgIEZJTEwgXAotICAgICAgICBpZiAoIHZhbHVlIDwgYmlnc3BsaXQgKSBcCi0gICAgICAgIHsgXAotICAgICAgICAgICAgcmFuZ2UgPSBzcGxpdDsgXAotICAgICAgICAgICAgTk9STUFMSVpFIFwKLSAgICAgICAgICAgIFByb2IgPSBjb2VmX3Byb2JzOyBcCi0gICAgICAgICAgICBpZihjPDE1KSB7XAotICAgICAgICAgICAgKytjOyBcCi0gICAgICAgICAgICBQcm9iICs9IGNvZWZfYmFuZHNfeFtjXTsgXAotICAgICAgICAgICAgZ290byBicmFuY2g7IFwKLSAgICAgICAgICAgIH0gZ290byBCTE9DS19GSU5JU0hFRDsgLypmb3IgbWFsZm9ybWVkIGlucHV0ICovXAotICAgICAgICB9IFwKLSAgICAgICAgdmFsdWUgLT0gYmlnc3BsaXQ7IFwKLSAgICAgICAgcmFuZ2UgPSByYW5nZSAtIHNwbGl0OyBcCi0gICAgICAgIE5PUk1BTElaRSBcCi0gICAgfQotCi0jZGVmaW5lIERFQ09ERV9TSUdOX1dSSVRFX0NPRUZGX0FORF9DSEVDS19FWElUKHZhbCkgXAotICAgIERFQ09ERV9BTkRfQVBQTFlTSUdOKHZhbCkgXAotICAgIFByb2IgPSBjb2VmX3Byb2JzICsgKEVOVFJPUFlfTk9ERVMqMik7IFwKLSAgICBpZihjIDwgMTUpe1wKLSAgICAgICAgcWNvZWZmX3B0ciBbIHNjYW5bY10gXSA9IChJTlQxNikgdjsgXAotICAgICAgICArK2M7IFwKLSAgICAgICAgZ290byBET19XSElMRTsgfVwKLSAgICBxY29lZmZfcHRyIFsgc2NhblsxNV0gXSA9IChJTlQxNikgdjsgXAotICAgIGdvdG8gQkxPQ0tfRklOSVNIRUQ7Ci0KLQotI2RlZmluZSBERUNPREVfRVhUUkFCSVRfQU5EX0FESlVTVF9WQUwodCxiaXRzX2NvdW50KVwKLSAgICBzcGxpdCA9IDEgKyAgKCgocmFuZ2UtMSkgKiB2cDhkX3Rva2VuX2V4dHJhX2JpdHMyW3RdLlByb2JzW2JpdHNfY291bnRdKSA+PiA4KTsgXAotICAgIGJpZ3NwbGl0ID0gKFZQOF9CRF9WQUxVRSlzcGxpdCA8PCAoVlA4X0JEX1ZBTFVFX1NJWkUgLSA4KTsgXAotICAgIEZJTEwgXAotICAgIGlmKHZhbHVlID49IGJpZ3NwbGl0KVwKLSAgICB7XAotICAgICAgICByYW5nZSA9IHJhbmdlLXNwbGl0O1wKLSAgICAgICAgdmFsdWUgPSB2YWx1ZS1iaWdzcGxpdDtcCi0gICAgICAgIHZhbCArPSAoKFVJTlQxNikxPDxiaXRzX2NvdW50KTtcCi0gICAgfVwKLSAgICBlbHNlXAotICAgIHtcCi0gICAgICAgIHJhbmdlID0gc3BsaXQ7XAotICAgIH1cCi0gICAgTk9STUFMSVpFCi0KLWludCB2cDhfZGVjb2RlX21iX3Rva2VucyhWUDhEX0NPTVAgKmR4LCBNQUNST0JMT0NLRCAqeCkKLXsKLSAgICBFTlRST1BZX0NPTlRFWFQgKkEgPSAoRU5UUk9QWV9DT05URVhUICopeC0+YWJvdmVfY29udGV4dDsKLSAgICBFTlRST1BZX0NPTlRFWFQgKkwgPSAoRU5UUk9QWV9DT05URVhUICopeC0+bGVmdF9jb250ZXh0OwotICAgIGNvbnN0IFZQOF9DT01NT04gKmNvbnN0IG9jID0gJiBkeC0+Y29tbW9uOwotCi0gICAgQk9PTF9ERUNPREVSICpiYyA9IHgtPmN1cnJlbnRfYmM7Ci0KLSAgICBjaGFyICplb2JzID0geC0+ZW9iczsKLQotICAgIEVOVFJPUFlfQ09OVEVYVCAqYTsKLSAgICBFTlRST1BZX0NPTlRFWFQgKmw7Ci0gICAgaW50IGk7Ci0KLSAgICBpbnQgZW9idG90YWwgPSAwOwotCi0gICAgcmVnaXN0ZXIgaW50IGNvdW50OwotCi0gICAgY29uc3QgQk9PTF9EQVRBICpidWZwdHI7Ci0gICAgY29uc3QgQk9PTF9EQVRBICpidWZlbmQ7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJhbmdlOwotICAgIFZQOF9CRF9WQUxVRSB2YWx1ZTsKLSAgICBjb25zdCBpbnQgKnNjYW47Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHNoaWZ0OwotICAgIFVJTlQzMiBzcGxpdDsKLSAgICBWUDhfQkRfVkFMVUUgYmlnc3BsaXQ7Ci0gICAgSU5UMTYgKnFjb2VmZl9wdHI7Ci0KLSAgICBjb25zdCB2cDhfcHJvYiAqY29lZl9wcm9iczsKLSAgICBpbnQgdHlwZTsKLSAgICBpbnQgc3RvcDsKLSAgICBJTlQxNiB2YWwsIGJpdHNfY291bnQ7Ci0gICAgSU5UMTYgYzsKLSAgICBJTlQxNiB2OwotICAgIGNvbnN0IHZwOF9wcm9iICpQcm9iOwotCi0gICAgdHlwZSA9IDM7Ci0gICAgaSA9IDA7Ci0gICAgc3RvcCA9IDE2OwotCi0gICAgc2NhbiA9IHZwOF9kZWZhdWx0X3ppZ196YWcxZDsKLSAgICBxY29lZmZfcHRyID0gJngtPnFjb2VmZlswXTsKLQotICAgIGlmICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCAmJiB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgewotICAgICAgICBpID0gMjQ7Ci0gICAgICAgIHN0b3AgPSAyNDsKLSAgICAgICAgdHlwZSA9IDE7Ci0gICAgICAgIHFjb2VmZl9wdHIgKz0gMjQqMTY7Ci0gICAgICAgIGVvYnRvdGFsIC09IDE2OwotICAgIH0KLQotICAgIGJ1ZmVuZCAgPSBiYy0+dXNlcl9idWZmZXJfZW5kOwotICAgIGJ1ZnB0ciAgPSBiYy0+dXNlcl9idWZmZXI7Ci0gICAgdmFsdWUgICA9IGJjLT52YWx1ZTsKLSAgICBjb3VudCAgID0gYmMtPmNvdW50OwotICAgIHJhbmdlICAgPSBiYy0+cmFuZ2U7Ci0KLQotICAgIGNvZWZfcHJvYnMgPSBvYy0+ZmMuY29lZl9wcm9icyBbdHlwZV0gWyAwIF0gWzBdOwotCi1CTE9DS19MT09QOgotICAgIGEgPSBBICsgdnA4X2Jsb2NrMmFib3ZlW2ldOwotICAgIGwgPSBMICsgdnA4X2Jsb2NrMmxlZnRbaV07Ci0KLSAgICBjID0gKElOVDE2KSghdHlwZSk7Ci0KLSAgICAvKkRlc3QgPSAoKEEpIT0wKSArICgoQikhPTApOyovCi0gICAgVlA4X0NPTUJJTkVFTlRST1BZQ09OVEVYVFModiwgKmEsICpsKTsKLSAgICBQcm9iID0gY29lZl9wcm9iczsKLSAgICBQcm9iICs9IHYgKiBFTlRST1BZX05PREVTOwotCi1ET19XSElMRToKLSAgICBQcm9iICs9IGNvZWZfYmFuZHNfeFtjXTsKLSAgICBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKFByb2JbRU9CX0NPTlRFWFRfTk9ERV0sIEJMT0NLX0ZJTklTSEVEKTsKLQotQ0hFQ0tfMF86Ci0gICAgREVDT0RFX0FORF9MT09QX0lGX1pFUk8oUHJvYltaRVJPX0NPTlRFWFRfTk9ERV0sIENIRUNLXzBfKTsKLSAgICBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKFByb2JbT05FX0NPTlRFWFRfTk9ERV0sIE9ORV9DT05URVhUX05PREVfMF8pOwotICAgIERFQ09ERV9BTkRfQlJBTkNIX0lGX1pFUk8oUHJvYltMT1dfVkFMX0NPTlRFWFRfTk9ERV0sIExPV19WQUxfQ09OVEVYVF9OT0RFXzBfKTsKLSAgICBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKFByb2JbSElHSF9MT1dfQ09OVEVYVF9OT0RFXSwgSElHSF9MT1dfQ09OVEVYVF9OT0RFXzBfKTsKLSAgICBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKFByb2JbQ0FUX1RIUkVFRk9VUl9DT05URVhUX05PREVdLCBDQVRfVEhSRUVGT1VSX0NPTlRFWFRfTk9ERV8wXyk7Ci0gICAgREVDT0RFX0FORF9CUkFOQ0hfSUZfWkVSTyhQcm9iW0NBVF9GSVZFX0NPTlRFWFRfTk9ERV0sIENBVF9GSVZFX0NPTlRFWFRfTk9ERV8wXyk7Ci0gICAgdmFsID0gdnA4ZF90b2tlbl9leHRyYV9iaXRzMltEQ1RfVkFMX0NBVEVHT1JZNl0ubWluX3ZhbDsKLSAgICBiaXRzX2NvdW50ID0gdnA4ZF90b2tlbl9leHRyYV9iaXRzMltEQ1RfVkFMX0NBVEVHT1JZNl0uTGVuZ3RoOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIERFQ09ERV9FWFRSQUJJVF9BTkRfQURKVVNUX1ZBTChEQ1RfVkFMX0NBVEVHT1JZNiwgYml0c19jb3VudCk7Ci0gICAgICAgIGJpdHNfY291bnQgLS0gOwotICAgIH0KLSAgICB3aGlsZSAoYml0c19jb3VudCA+PSAwKTsKLQotICAgIERFQ09ERV9TSUdOX1dSSVRFX0NPRUZGX0FORF9DSEVDS19FWElUKHZhbCk7Ci0KLUNBVF9GSVZFX0NPTlRFWFRfTk9ERV8wXzoKLSAgICB2YWwgPSB2cDhkX3Rva2VuX2V4dHJhX2JpdHMyW0RDVF9WQUxfQ0FURUdPUlk1XS5taW5fdmFsOwotICAgIERFQ09ERV9FWFRSQUJJVF9BTkRfQURKVVNUX1ZBTChEQ1RfVkFMX0NBVEVHT1JZNSwgNCk7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlk1LCAzKTsKLSAgICBERUNPREVfRVhUUkFCSVRfQU5EX0FESlVTVF9WQUwoRENUX1ZBTF9DQVRFR09SWTUsIDIpOwotICAgIERFQ09ERV9FWFRSQUJJVF9BTkRfQURKVVNUX1ZBTChEQ1RfVkFMX0NBVEVHT1JZNSwgMSk7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlk1LCAwKTsKLSAgICBERUNPREVfU0lHTl9XUklURV9DT0VGRl9BTkRfQ0hFQ0tfRVhJVCh2YWwpOwotCi1DQVRfVEhSRUVGT1VSX0NPTlRFWFRfTk9ERV8wXzoKLSAgICBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKFByb2JbQ0FUX1RIUkVFX0NPTlRFWFRfTk9ERV0sIENBVF9USFJFRV9DT05URVhUX05PREVfMF8pOwotICAgIHZhbCA9IHZwOGRfdG9rZW5fZXh0cmFfYml0czJbRENUX1ZBTF9DQVRFR09SWTRdLm1pbl92YWw7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlk0LCAzKTsKLSAgICBERUNPREVfRVhUUkFCSVRfQU5EX0FESlVTVF9WQUwoRENUX1ZBTF9DQVRFR09SWTQsIDIpOwotICAgIERFQ09ERV9FWFRSQUJJVF9BTkRfQURKVVNUX1ZBTChEQ1RfVkFMX0NBVEVHT1JZNCwgMSk7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlk0LCAwKTsKLSAgICBERUNPREVfU0lHTl9XUklURV9DT0VGRl9BTkRfQ0hFQ0tfRVhJVCh2YWwpOwotCi1DQVRfVEhSRUVfQ09OVEVYVF9OT0RFXzBfOgotICAgIHZhbCA9IHZwOGRfdG9rZW5fZXh0cmFfYml0czJbRENUX1ZBTF9DQVRFR09SWTNdLm1pbl92YWw7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlkzLCAyKTsKLSAgICBERUNPREVfRVhUUkFCSVRfQU5EX0FESlVTVF9WQUwoRENUX1ZBTF9DQVRFR09SWTMsIDEpOwotICAgIERFQ09ERV9FWFRSQUJJVF9BTkRfQURKVVNUX1ZBTChEQ1RfVkFMX0NBVEVHT1JZMywgMCk7Ci0gICAgREVDT0RFX1NJR05fV1JJVEVfQ09FRkZfQU5EX0NIRUNLX0VYSVQodmFsKTsKLQotSElHSF9MT1dfQ09OVEVYVF9OT0RFXzBfOgotICAgIERFQ09ERV9BTkRfQlJBTkNIX0lGX1pFUk8oUHJvYltDQVRfT05FX0NPTlRFWFRfTk9ERV0sIENBVF9PTkVfQ09OVEVYVF9OT0RFXzBfKTsKLQotICAgIHZhbCA9IHZwOGRfdG9rZW5fZXh0cmFfYml0czJbRENUX1ZBTF9DQVRFR09SWTJdLm1pbl92YWw7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlkyLCAxKTsKLSAgICBERUNPREVfRVhUUkFCSVRfQU5EX0FESlVTVF9WQUwoRENUX1ZBTF9DQVRFR09SWTIsIDApOwotICAgIERFQ09ERV9TSUdOX1dSSVRFX0NPRUZGX0FORF9DSEVDS19FWElUKHZhbCk7Ci0KLUNBVF9PTkVfQ09OVEVYVF9OT0RFXzBfOgotICAgIHZhbCA9IHZwOGRfdG9rZW5fZXh0cmFfYml0czJbRENUX1ZBTF9DQVRFR09SWTFdLm1pbl92YWw7Ci0gICAgREVDT0RFX0VYVFJBQklUX0FORF9BREpVU1RfVkFMKERDVF9WQUxfQ0FURUdPUlkxLCAwKTsKLSAgICBERUNPREVfU0lHTl9XUklURV9DT0VGRl9BTkRfQ0hFQ0tfRVhJVCh2YWwpOwotCi1MT1dfVkFMX0NPTlRFWFRfTk9ERV8wXzoKLSAgICBERUNPREVfQU5EX0JSQU5DSF9JRl9aRVJPKFByb2JbVFdPX0NPTlRFWFRfTk9ERV0sIFRXT19DT05URVhUX05PREVfMF8pOwotICAgIERFQ09ERV9BTkRfQlJBTkNIX0lGX1pFUk8oUHJvYltUSFJFRV9DT05URVhUX05PREVdLCBUSFJFRV9DT05URVhUX05PREVfMF8pOwotICAgIERFQ09ERV9TSUdOX1dSSVRFX0NPRUZGX0FORF9DSEVDS19FWElUKDQpOwotCi1USFJFRV9DT05URVhUX05PREVfMF86Ci0gICAgREVDT0RFX1NJR05fV1JJVEVfQ09FRkZfQU5EX0NIRUNLX0VYSVQoMyk7Ci0KLVRXT19DT05URVhUX05PREVfMF86Ci0gICAgREVDT0RFX1NJR05fV1JJVEVfQ09FRkZfQU5EX0NIRUNLX0VYSVQoMik7Ci0KLU9ORV9DT05URVhUX05PREVfMF86Ci0gICAgREVDT0RFX0FORF9BUFBMWVNJR04oMSk7Ci0gICAgUHJvYiA9IGNvZWZfcHJvYnMgKyBFTlRST1BZX05PREVTOwotCi0gICAgaWYgKGMgPCAxNSkKLSAgICB7Ci0gICAgICAgIHFjb2VmZl9wdHIgWyBzY2FuW2NdIF0gPSAoSU5UMTYpIHY7Ci0gICAgICAgICsrYzsKLSAgICAgICAgZ290byBET19XSElMRTsKLSAgICB9Ci0KLSAgICBxY29lZmZfcHRyIFsgc2NhblsxNV0gXSA9IChJTlQxNikgdjsKLUJMT0NLX0ZJTklTSEVEOgotICAgICphID0gKmwgPSAoKGVvYnNbaV0gPSBjKSAhPSAhdHlwZSk7ICAgLyogYW55IG5vbnplcm8gZGF0YT8gKi8KLSAgICBlb2J0b3RhbCArPSBjOwotICAgIHFjb2VmZl9wdHIgKz0gMTY7Ci0KLSAgICBpKys7Ci0KLSAgICBpZiAoaSA8IHN0b3ApCi0gICAgICAgIGdvdG8gQkxPQ0tfTE9PUDsKLQotICAgIGlmIChpID09IDI1KQotICAgIHsKLSAgICAgICAgdHlwZSA9IDA7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICBzdG9wID0gMTY7Ci0gICAgICAgIGNvZWZfcHJvYnMgPSBvYy0+ZmMuY29lZl9wcm9icyBbdHlwZV0gWyAwIF0gWzBdOwotICAgICAgICBxY29lZmZfcHRyIC09ICgyNCoxNiArIDE2KTsKLSAgICAgICAgZ290byBCTE9DS19MT09QOwotICAgIH0KLQotICAgIGlmIChpID09IDE2KQotICAgIHsKLSAgICAgICAgdHlwZSA9IDI7Ci0gICAgICAgIGNvZWZfcHJvYnMgPSBvYy0+ZmMuY29lZl9wcm9icyBbdHlwZV0gWyAwIF0gWzBdOwotICAgICAgICBzdG9wID0gMjQ7Ci0gICAgICAgIGdvdG8gQkxPQ0tfTE9PUDsKLSAgICB9Ci0KLSAgICBGSUxMCi0gICAgYmMtPnVzZXJfYnVmZmVyID0gYnVmcHRyOwotICAgIGJjLT52YWx1ZSA9IHZhbHVlOwotICAgIGJjLT5jb3VudCA9IGNvdW50OwotICAgIGJjLT5yYW5nZSA9IHJhbmdlOwotICAgIHJldHVybiBlb2J0b3RhbDsKLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvZ2VuZXJpYy9kc3lzdGVtZGVwZW5kZW50LmMgYi92cDgvZGVjb2Rlci9nZW5lcmljL2RzeXN0ZW1kZXBlbmRlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwNmRlYS4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9nZW5lcmljL2RzeXN0ZW1kZXBlbmRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9kZWNvZGVyL2RlcXVhbnRpemUuaCIKLSNpbmNsdWRlICJ2cDgvZGVjb2Rlci9vbnl4ZF9pbnQuaCIKLQotZXh0ZXJuIHZvaWQgdnA4X2FyY2hfeDg2X2RlY29kZV9pbml0KFZQOERfQ09NUCAqcGJpKTsKLWV4dGVybiB2b2lkIHZwOF9hcmNoX2FybV9kZWNvZGVfaW5pdChWUDhEX0NPTVAgKnBiaSk7Ci0KLXZvaWQgdnA4X2RtYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhWUDhEX0NPTVAgKnBiaSkKLXsKLSAgICAvKiBQdXJlIEM6ICovCi0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgIHBiaS0+bWIucnRjZCAgICAgICAgICAgICAgICAgICAgID0gJnBiaS0+Y29tbW9uLnJ0Y2Q7Ci0gICAgcGJpLT5kZXF1YW50LmJsb2NrICAgICAgICAgICAgICAgPSB2cDhfZGVxdWFudGl6ZV9iX2M7Ci0gICAgcGJpLT5kZXF1YW50LmlkY3RfYWRkICAgICAgICAgICAgPSB2cDhfZGVxdWFudF9pZGN0X2FkZF9jOwotICAgIHBiaS0+ZGVxdWFudC5kY19pZGN0X2FkZCAgICAgICAgID0gdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfYzsKLSAgICBwYmktPmRlcXVhbnQuZGNfaWRjdF9hZGRfeV9ibG9jayA9IHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfYzsKLSAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfeV9ibG9jayAgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfYzsKLSAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfdXZfYmxvY2sgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX2M7Ci0jZW5kaWYKLQotI2lmIEFSQ0hfWDg2IHx8IEFSQ0hfWDg2XzY0Ci0gICAgdnA4X2FyY2hfeDg2X2RlY29kZV9pbml0KHBiaSk7Ci0jZW5kaWYKLQotI2lmIEFSQ0hfQVJNCi0gICAgdnA4X2FyY2hfYXJtX2RlY29kZV9pbml0KHBiaSk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL2lkY3RfYmxrLmMgYi92cDgvZGVjb2Rlci9pZGN0X2Jsay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjAxOTIzLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL2lkY3RfYmxrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vaWRjdC5oIgotI2luY2x1ZGUgImRlcXVhbnRpemUuaCIKLQotdm9pZCB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBwaXRjaCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGMpOwotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBwaXRjaCwgaW50IHN0cmlkZSk7Ci12b2lkIHZwOF9kY19vbmx5X2lkY3RfYWRkX2Moc2hvcnQgaW5wdXRfZGMsIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsIGludCBwaXRjaCwgaW50IHN0cmlkZSk7Ci0KLXZvaWQgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja19jCi0gICAgICAgICAgICAoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHN0cmlkZSwgY2hhciAqZW9icywgc2hvcnQgKmRjKQotewotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgICAgICAgICB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9jIChxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUsIGRjWzBdKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9jIChkY1swXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotCi0gICAgICAgICAgICBxICAgKz0gMTY7Ci0gICAgICAgICAgICBwcmUgKz0gNDsKLSAgICAgICAgICAgIGRzdCArPSA0OwotICAgICAgICAgICAgZGMgICsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlICs9IDY0IC0gMTY7Ci0gICAgICAgIGRzdCArPSA0KnN0cmlkZSAtIDE2OwotICAgIH0KLX0KLQotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX2MKLSAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmUsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQotewotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9jIChxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX2MgKHFbMF0qZHFbMF0sIHByZSwgZHN0LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcSAgICs9IDE2OwotICAgICAgICAgICAgcHJlICs9IDQ7Ci0gICAgICAgICAgICBkc3QgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIHByZSArPSA2NCAtIDE2OwotICAgICAgICBkc3QgKz0gNCpzdHJpZGUgLSAxNjsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfYwotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3R1LCB1bnNpZ25lZCBjaGFyICpkc3R2LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzKQotewotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9jIChxLCBkcSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX2MgKHFbMF0qZHFbMF0sIHByZSwgZHN0dSwgOCwgc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcSAgICArPSAxNjsKLSAgICAgICAgICAgIHByZSAgKz0gNDsKLSAgICAgICAgICAgIGRzdHUgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIHByZSAgKz0gMzIgLSA4OwotICAgICAgICBkc3R1ICs9IDQqc3RyaWRlIC0gODsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX2MgKHEsIGRxLCBwcmUsIGRzdHYsIDgsIHN0cmlkZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfYyAocVswXSpkcVswXSwgcHJlLCBkc3R2LCA4LCBzdHJpZGUpOwotICAgICAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxICAgICs9IDE2OwotICAgICAgICAgICAgcHJlICArPSA0OwotICAgICAgICAgICAgZHN0diArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlICArPSAzMiAtIDg7Ci0gICAgICAgIGRzdHYgKz0gNCpzdHJpZGUgLSA4OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL21pcHMvZGVxdWFudGl6ZV9taXBzLmMgYi92cDgvZGVjb2Rlci9taXBzL2RlcXVhbnRpemVfbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWJmMjI0Li4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL21pcHMvZGVxdWFudGl6ZV9taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAiZGVxdWFudGl6ZS5oIgotI2luY2x1ZGUgImlkY3QuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLQotREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVuc2lnbmVkIGNoYXIsIGNtYVs1MTJdKSA9IHsKLTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsCi0xMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAotMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywKLTU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsCi03NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LAotOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLAotMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCi0xMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywKLTE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LAotMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsCi0xODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwKLTE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LAotMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsCi0yMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwKLTI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0yNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0yNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUKLX07Ci0KLWV4dGVybiB2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtX21pcHMoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpIDsKLWV4dGVybiB2b2lkIHZwOF9zaG9ydF9pZGN0NHg0bGxtXzFfbWlwcyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci0KLQotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF9taXBzKHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBwaXRjaCwgaW50IHN0cmlkZSkKLXsKLSAgICBzaG9ydCBvdXRwdXRbMTZdOwotICAgIHNob3J0ICpkaWZmX3B0ciA9IG91dHB1dDsKLSAgICBpbnQgaTsKLSAgICBzaG9ydCBhMSwgYTIsIGEzLCBhMDsKLQotICAgIHNob3J0IGlucHV0X3RlbXBbMTZdOwotICAgIHVuc2lnbmVkIGludCBpbjEsIGRxMSwgeDEsIGluMiwgZHEyOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtID0gJihjbWFbMTI4XSk7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJsaCAgICAgICAgICAgICVbaW4xXSwgMCglW2lucHV0XSkgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxoICAgICAgICAgICAgJVtkcTFdLCAwKCVbZHFdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGggICAgICAgICAgICAlW2luMl0sIDIoJVtpbnB1dF0pICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsaCAgICAgICAgICAgICVbZHEyXSwgMiglW2RxXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgJVtpbjFdLCAlW2luMl0sICAgICAgICAgIDE2ICAgICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAlW2RxMV0sICVbZHEyXSwgICAgICAgICAgMTYgICAgICAgIFxuXHQiCi0gICAgICAgICJtdWwucGggICAgICAgICVbeDFdLCAgJVtkcTFdLCAgICAgICAgICAlW2luMV0gICAgXG5cdCIKLSAgICAgICAgInNoICAgICAgICAgICAgJVt4MV0sICAyKCVbaW5wdXRfdGVtcF0pICAgICAgICAgICBcblx0IgotICAgICAgICAic3JsICAgICAgICAgICAlW3gxXSwgICVbeDFdLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaCAgICAgICAgICAgICVbeDFdLCAgMCglW2lucHV0X3RlbXBdKSAgICAgICAgICAgXG5cdCIKLQotICAgICAgICA6IFt4MV0gIj0mciIgKHgxKSwgW2luMV0gIj0mciIgKGluMSksIFtkcTFdICI9JnIiIChkcTEpLAotICAgICAgICAgIFtpbjJdICI9JnIiIChpbjIpLCBbZHEyXSAiPSZyIiAoZHEyKQotICAgICAgICA6IFtkcV0gInIiIChkcSksIFtpbnB1dF0gInIiIChpbnB1dCksCi0gICAgICAgICAgW2lucHV0X3RlbXBdICJyIiAoaW5wdXRfdGVtcCkKLSAgICApOwotCi0gICAgZm9yIChpID0gMjsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBpbnB1dF90ZW1wW2ldID0gZHFbaV0gKiBpbnB1dFtpXTsKLSAgICB9Ci0KLSAgICAvKiB0aGUgaWRjdCBoYWx2ZXMgKCA+PiAxKSB0aGUgcGl0Y2ggKi8KLSAgICB2cDhfc2hvcnRfaWRjdDR4NGxsbV9taXBzKGlucHV0X3RlbXAsIG91dHB1dCwgNCk7Ci0KLSAgICB2cHhfbWVtc2V0KGlucHV0LCAwLCAzMik7Ci0KLSAgICAvKiB1bnJvbGwgdGhlIGxvb3AgKi8KLSAgICBmb3IgKGkgPSA0OyBpLS07ICkKLSAgICB7Ci0gICAgICAgIGEwID0gZGlmZl9wdHJbMF0gKyBwcmVkWzBdOwotICAgICAgICBhMSA9IGRpZmZfcHRyWzFdICsgcHJlZFsxXTsKLSAgICAgICAgYTIgPSBkaWZmX3B0clsyXSArIHByZWRbMl07Ci0gICAgICAgIGEzID0gZGlmZl9wdHJbM10gKyBwcmVkWzNdOwotCi0gICAgICAgIGRlc3RbMF0gPSBjbVthMF07Ci0gICAgICAgIGRlc3RbMV0gPSBjbVthMV07Ci0gICAgICAgIGRlc3RbMl0gPSBjbVthMl07Ci0gICAgICAgIGRlc3RbM10gPSBjbVthM107Ci0KLSAgICAgICAgZGVzdCArPSBzdHJpZGU7Ci0gICAgICAgIGRpZmZfcHRyICs9IDQ7Ci0gICAgICAgIHByZWQgKz0gcGl0Y2g7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbWlwcyhzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgcGl0Y2gsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERjKQotewotICAgIGludCBpOwotICAgIHNob3J0IG91dHB1dFsxNl07Ci0gICAgc2hvcnQgKmRpZmZfcHRyID0gb3V0cHV0OwotICAgIHNob3J0IGlucHV0X3RlbXBbMTZdOwotICAgIHNob3J0IGExLCBhMiwgYTMsIGEwOwotCi0gICAgdW5zaWduZWQgaW50IGluMSwgZHExLCB4MSwgaW4yLCBkcTI7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqY20gPSAmKGNtYVsxMjhdKTsKLQotICAgIGlucHV0X3RlbXBbMF0gPSAoc2hvcnQpRGM7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJsaCAgICAgICAgICAgICVbaW4xXSwgMiglW2lucHV0XSkgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxoICAgICAgICAgICAgJVtkcTFdLCAyKCVbZHFdKSAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGggICAgICAgICAgICAlW2luMl0sIDQoJVtpbnB1dF0pICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsaCAgICAgICAgICAgICVbZHEyXSwgNCglW2RxXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFwcGVuZCAgICAgICAgJVtpbjFdLCAlW2luMl0sICAgICAgICAgIDE2ICAgICAgICBcblx0IgotICAgICAgICAiYXBwZW5kICAgICAgICAlW2RxMV0sICVbZHEyXSwgICAgICAgICAgMTYgICAgICAgIFxuXHQiCi0gICAgICAgICJtdWwucGggICAgICAgICVbeDFdLCAgJVtkcTFdLCAgICAgICAgICAlW2luMV0gICAgXG5cdCIKLSAgICAgICAgInNoICAgICAgICAgICAgJVt4MV0sICA0KCVbaW5wdXRfdGVtcF0pICAgICAgICAgICBcblx0IgotICAgICAgICAic3JsICAgICAgICAgICAlW3gxXSwgICVbeDFdLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzaCAgICAgICAgICAgICVbeDFdLCAgMiglW2lucHV0X3RlbXBdKSAgICAgICAgICAgXG5cdCIKLQotICAgICAgICA6IFt4MV0gIj0mciIgKHgxKSwgW2luMV0gIj0mciIgKGluMSksIFtkcTFdICI9JnIiIChkcTEpLAotICAgICAgICAgIFtpbjJdICI9JnIiIChpbjIpLCBbZHEyXSAiPSZyIiAoZHEyKQotICAgICAgICA6IFtkcV0gInIiIChkcSksIFtpbnB1dF0gInIiIChpbnB1dCksCi0gICAgICAgICAgW2lucHV0X3RlbXBdICJyIiAoaW5wdXRfdGVtcCkKLSAgICApOwotCi0gICAgZm9yIChpID0gMzsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBpbnB1dF90ZW1wW2ldID0gZHFbaV0gKiBpbnB1dFtpXTsKLSAgICB9Ci0KLSAgICB2cDhfc2hvcnRfaWRjdDR4NGxsbV9taXBzKGlucHV0X3RlbXAsIG91dHB1dCwgNCk7Ci0KLSAgICB2cHhfbWVtc2V0KGlucHV0LCAwLCAzMik7Ci0KLSAgICBmb3IgKGkgPSA0OyBpLS07ICkKLSAgICB7Ci0gICAgICAgIGEwID0gZGlmZl9wdHJbMF0gKyBwcmVkWzBdOwotICAgICAgICBhMSA9IGRpZmZfcHRyWzFdICsgcHJlZFsxXTsKLSAgICAgICAgYTIgPSBkaWZmX3B0clsyXSArIHByZWRbMl07Ci0gICAgICAgIGEzID0gZGlmZl9wdHJbM10gKyBwcmVkWzNdOwotCi0gICAgICAgIGRlc3RbMF0gPSBjbVthMF07Ci0gICAgICAgIGRlc3RbMV0gPSBjbVthMV07Ci0gICAgICAgIGRlc3RbMl0gPSBjbVthMl07Ci0gICAgICAgIGRlc3RbM10gPSBjbVthM107Ci0KLSAgICAgICAgZGVzdCArPSBzdHJpZGU7Ci0gICAgICAgIGRpZmZfcHRyICs9IDQ7Ci0gICAgICAgIHByZWQgKz0gcGl0Y2g7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL21pcHMvZGVxdWFudGl6ZV9taXBzLmggYi92cDgvZGVjb2Rlci9taXBzL2RlcXVhbnRpemVfbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzJiZGE3Li4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL21pcHMvZGVxdWFudGl6ZV9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBERVFVQU5USVpFX01JUFNfSAotI2RlZmluZSBERVFVQU5USVpFX01JUFNfSAotCi1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGQodnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfZGNfaWRjdF9hZGQodnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbWlwcyk7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jayh2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX21pcHMpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19taXBzKTsKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayh2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19taXBzKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGQKLSNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGQgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcwotCi0jdW5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQKLSNkZWZpbmUgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGQgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbWlwcwotCi0jdW5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfbWlwcwotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfbWlwcwotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sKLSNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfbWlwcwotCi0jZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL21pcHMvaWRjdF9ibGtfbWlwcy5jIGIvdnA4L2RlY29kZXIvbWlwcy9pZGN0X2Jsa19taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhZTJhNzAuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvbWlwcy9pZGN0X2Jsa19taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgImlkY3QuaCIKLSNpbmNsdWRlICJkZXF1YW50aXplLmgiCi0KLQotdm9pZCB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX21pcHMKLSAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmUsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc3RyaWRlLCBjaGFyICplb2JzLCBzaG9ydCAqZGMpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGhpZ2hlciA9IDQqc3RyaWRlIC0gMTI7Ci0KLSAgICAvKiB1bnJvbGwgdGhlIGxvb3AgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUsIGRjWzBdKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbWlwcyhkY1swXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotCi0gICAgICAgIHEgICArPSAxNjsKLSAgICAgICAgcHJlICs9IDQ7Ci0gICAgICAgIGRzdCArPSA0OwotCi0gICAgICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX21pcHMocSwgZHEsIHByZSwgZHN0LCAxNiwgc3RyaWRlLCBkY1sxXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMoZGNbMV0sIHByZSwgZHN0LCAxNiwgc3RyaWRlKTsKLQotICAgICAgICBxICAgKz0gMTY7Ci0gICAgICAgIHByZSArPSA0OwotICAgICAgICBkc3QgKz0gNDsKLQotICAgICAgICBpZiAoKmVvYnMrKyA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9taXBzKHEsIGRxLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSwgZGNbMl0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9taXBzKGRjWzJdLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSk7Ci0KLSAgICAgICAgcSAgICs9IDE2OwotICAgICAgICBwcmUgKz0gNDsKLSAgICAgICAgZHN0ICs9IDQ7Ci0KLSAgICAgICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUsIGRjWzNdKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbWlwcyhkY1szXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotCi0gICAgICAgIHEgICArPSAxNjsKLSAgICAgICAgZGMgKz0gNDsKLSAgICAgICAgcHJlICs9IDUyOwotICAgICAgICBkc3QgKz0gaGlnaGVyOwotICAgIH0KLX0KLQotCi12b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfbWlwcwotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGhpZ2hlciA9IDQqc3RyaWRlIC0xMjsKLQotICAgIC8qIHVucm9sbCB0aGUgbG9vcCAqLwotICAgIGZvciAoaSA9IDQ7IGktLTsgKQotICAgIHsKLSAgICAgICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMocVswXSpkcVswXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBxICAgKz0gMTY7Ci0gICAgICAgIHByZSArPSA0OwotICAgICAgICBkc3QgKz0gNDsKLQotICAgICAgICBpZiAoKmVvYnMrKyA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9taXBzKHEsIGRxLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbWlwcyhxWzBdKmRxWzBdLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSk7Ci0gICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHEgICArPSAxNjsKLSAgICAgICAgcHJlICs9IDQ7Ci0gICAgICAgIGRzdCArPSA0OwotCi0gICAgICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21pcHMocSwgZHEsIHByZSwgZHN0LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9taXBzKHFbMF0qZHFbMF0sIHByZSwgZHN0LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcSAgICs9IDE2OwotICAgICAgICBwcmUgKz0gNDsKLSAgICAgICAgZHN0ICs9IDQ7Ci0KLSAgICAgICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMocVswXSpkcVswXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBxICAgKz0gMTY7Ci0gICAgICAgIHByZSArPSA1MjsKLSAgICAgICAgZHN0ICs9IGhpZ2hlcjsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19taXBzCi0gICAgICAgICAgICAoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdHUsIHVuc2lnbmVkIGNoYXIgKmRzdHYsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGhpZ2hlciA9IDQqc3RyaWRlIC00OwotCi0gICAgLyogdW5yb2xsIHRoZSBsb29wcyAqLwotICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMocVswXSpkcVswXSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICB9Ci0KLSAgICBxICAgICs9IDE2OwotICAgIHByZSAgKz0gNDsKLSAgICBkc3R1ICs9IDQ7Ci0KLSAgICBpZiAoKmVvYnMrKyA+IDEpCi0gICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21pcHMocSwgZHEsIHByZSwgZHN0dSwgOCwgc3RyaWRlKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9taXBzKHFbMF0qZHFbMF0sIHByZSwgZHN0dSwgOCwgc3RyaWRlKTsKLSAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgfQotCi0gICAgcSAgICArPSAxNjsKLSAgICBwcmUgICs9IDI4OwotICAgIGRzdHUgKz0gaGlnaGVyOwotCi0gICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9taXBzKHEsIGRxLCBwcmUsIGRzdHUsIDgsIHN0cmlkZSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbWlwcyhxWzBdKmRxWzBdLCBwcmUsIGRzdHUsIDgsIHN0cmlkZSk7Ci0gICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgIH0KLQotICAgIHEgICAgKz0gMTY7Ci0gICAgcHJlICArPSA0OwotICAgIGRzdHUgKz0gNDsKLQotICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMocVswXSpkcVswXSwgcHJlLCBkc3R1LCA4LCBzdHJpZGUpOwotICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICB9Ci0KLSAgICBxICAgICs9IDE2OwotICAgIHByZSAgKz0gMjg7Ci0KLSAgICBpZiAoKmVvYnMrKyA+IDEpCi0gICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21pcHMocSwgZHEsIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9taXBzKHFbMF0qZHFbMF0sIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgfQotCi0gICAgcSAgICArPSAxNjsKLSAgICBwcmUgICs9IDQ7Ci0gICAgZHN0diArPSA0OwotCi0gICAgaWYgKCplb2JzKysgPiAxKQotICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9taXBzKHEsIGRxLCBwcmUsIGRzdHYsIDgsIHN0cmlkZSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbWlwcyhxWzBdKmRxWzBdLCBwcmUsIGRzdHYsIDgsIHN0cmlkZSk7Ci0gICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgIH0KLQotICAgIHEgICAgKz0gMTY7Ci0gICAgcHJlICArPSAyODsKLSAgICBkc3R2ICs9IGhpZ2hlcjsKLQotICAgIGlmICgqZW9icysrID4gMSkKLSAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbWlwcyhxLCBkcSwgcHJlLCBkc3R2LCA4LCBzdHJpZGUpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21pcHMocVswXSpkcVswXSwgcHJlLCBkc3R2LCA4LCBzdHJpZGUpOwotICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICB9Ci0KLSAgICBxICAgICs9IDE2OwotICAgIHByZSAgKz0gNDsKLSAgICBkc3R2ICs9IDQ7Ci0KLSAgICBpZiAoKmVvYnMrKyA+IDEpCi0gICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21pcHMocSwgZHEsIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9taXBzKHFbMF0qZHFbMF0sIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL21pcHMvbWlwc19kc3lzdGVtZGVwZW5kZW50LmMgYi92cDgvZGVjb2Rlci9taXBzL21pcHNfZHN5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjIwY2M3Li4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL21pcHMvbWlwc19kc3lzdGVtZGVwZW5kZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJibG9ja2QuaCIKLSNpbmNsdWRlICJwcmFnbWFzLmgiCi0jaW5jbHVkZSAicG9zdHByb2MuaCIKLSNpbmNsdWRlICJkYm9vbGh1ZmYuaCIKLSNpbmNsdWRlICJkZXF1YW50aXplLmgiCi0jaW5jbHVkZSAib255eGRfaW50LmgiCi0KLXZvaWQgdnA4X2FyY2hfbWlwc19kZWNvZGVfaW5pdChWUDhEX0NPTVAgKnBiaSkKLXsKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSNpZmRlZiBNSVBTX0RTUF9SRVYKLSNpZiAoTUlQU19EU1BfUkVWPj0yKQotCi0gICAgcGJpLT5kZXF1YW50LmlkY3RfYWRkICAgICAgICAgICAgPSB2cDhfZGVxdWFudF9pZGN0X2FkZF9taXBzOwotICAgIHBiaS0+ZGVxdWFudC5kY19pZGN0X2FkZCAgICAgICAgID0gdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbWlwczsKLSAgICBwYmktPmRlcXVhbnQuZGNfaWRjdF9hZGRfeV9ibG9jayA9IHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfbWlwczsKLSAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfeV9ibG9jayAgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfbWlwczsKLSAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfdXZfYmxvY2sgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX21pcHM7Ci0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL29ueXhkX2lmLmMgYi92cDgvZGVjb2Rlci9vbnl4ZF9pZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJlMDBkLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL29ueXhkX2lmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhjX2ludC5oIgotI2lmIENPTkZJR19QT1NUUFJPQwotI2luY2x1ZGUgInZwOC9jb21tb24vcG9zdHByb2MuaCIKLSNlbmRpZgotI2luY2x1ZGUgInZwOC9jb21tb24vb255eGQuaCIKLSNpbmNsdWRlICJvbnl4ZF9pbnQuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2FsbG9jY29tbW9uLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJleHRlbmQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2xvb3BmaWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9nX2NvbW1vbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vdGhyZWFkaW5nLmgiCi0jaW5jbHVkZSAiZGVjb2RlcnRocmVhZGluZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJ2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oIgotI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL3ZweF90aW1lci5oIgotI2luY2x1ZGUgImRldG9rZW5pemUuaCIKLSNpZiBBUkNIX0FSTQotI2luY2x1ZGUgInZweF9wb3J0cy9hcm0uaCIKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB2cDhfaW5pdF9sb29wX2ZpbHRlcihWUDhfQ09NTU9OICpjbSk7Ci1leHRlcm4gdm9pZCB2cDhjeF9pbml0X2RlX3F1YW50aXplcihWUDhEX0NPTVAgKnBiaSk7Ci0KLQotdm9pZCB2cDhkeF9pbml0aWFsaXplKCkKLXsKLSAgICBzdGF0aWMgaW50IGluaXRfZG9uZSA9IDA7Ci0KLSAgICBpZiAoIWluaXRfZG9uZSkKLSAgICB7Ci0gICAgICAgIHZwOF9pbml0aWFsaXplX2NvbW1vbigpOwotICAgICAgICB2cDhfc2NhbGVfbWFjaGluZV9zcGVjaWZpY19jb25maWcoKTsKLSAgICAgICAgaW5pdF9kb25lID0gMTsKLSAgICB9Ci19Ci0KLQotVlA4RF9QVFIgdnA4ZHhfY3JlYXRlX2RlY29tcHJlc3NvcihWUDhEX0NPTkZJRyAqb3hjZikKLXsKLSAgICBWUDhEX0NPTVAgKnBiaSA9IHZweF9tZW1hbGlnbigzMiwgc2l6ZW9mKFZQOERfQ09NUCkpOwotCi0gICAgaWYgKCFwYmkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgdnB4X21lbXNldChwYmksIDAsIHNpemVvZihWUDhEX0NPTVApKTsKLQotICAgIGlmIChzZXRqbXAocGJpLT5jb21tb24uZXJyb3Iuam1wKSkKLSAgICB7Ci0gICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7Ci0gICAgICAgIHZwOGR4X3JlbW92ZV9kZWNvbXByZXNzb3IocGJpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcGJpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMTsKLSAgICB2cDhkeF9pbml0aWFsaXplKCk7Ci0KLSAgICB2cDhfY3JlYXRlX2NvbW1vbigmcGJpLT5jb21tb24pOwotICAgIHZwOF9kbWFjaGluZV9zcGVjaWZpY19jb25maWcocGJpKTsKLQotICAgIHBiaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUgPSAwOwotICAgIHBiaS0+cmVhZHlfZm9yX25ld19kYXRhID0gMTsKLQotICAgIHBiaS0+Q1BVRnJlcSA9IDA7IC8qdnA4X2dldF9wcm9jZXNzb3JfZnJlcSgpOyovCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgcGJpLT5tYXhfdGhyZWFkcyA9IG94Y2YtPm1heF90aHJlYWRzOwotICAgIHZwOF9kZWNvZGVyX2NyZWF0ZV90aHJlYWRzKHBiaSk7Ci0jZW5kaWYKLQotICAgIC8qIHZwOGN4X2luaXRfZGVfcXVhbnRpemVyKCkgaXMgZmlyc3QgY2FsbGVkIGhlcmUuIEFkZCBjaGVjayBpbiBmcmFtZV9pbml0X2RlcXVhbnRpemVyKCkgdG8gYXZvaWQKLSAgICAgKiAgdW5uZWNlc3NhcnkgY2FsbGluZyBvZiB2cDhjeF9pbml0X2RlX3F1YW50aXplcigpIGZvciBldmVyeSBmcmFtZS4KLSAgICAgKi8KLSAgICB2cDhjeF9pbml0X2RlX3F1YW50aXplcihwYmkpOwotCi0gICAgewotICAgICAgICBWUDhfQ09NTU9OICpjbSA9ICZwYmktPmNvbW1vbjsKLQotICAgICAgICB2cDhfaW5pdF9sb29wX2ZpbHRlcihjbSk7Ci0gICAgICAgIGNtLT5sYXN0X2ZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7Ci0gICAgICAgIGNtLT5sYXN0X2ZpbHRlcl90eXBlID0gY20tPmZpbHRlcl90eXBlOwotICAgICAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOwotICAgIH0KLQotICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7Ci0gICAgcmV0dXJuIChWUDhEX1BUUikgcGJpOwotfQotCi0KLXZvaWQgdnA4ZHhfcmVtb3ZlX2RlY29tcHJlc3NvcihWUDhEX1BUUiBwdHIpCi17Ci0gICAgVlA4RF9DT01QICpwYmkgPSAoVlA4RF9DT01QICopIHB0cjsKLQotICAgIGlmICghcGJpKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBDT05GSUdfTVVMVElUSFJFQUQKLSAgICBpZiAocGJpLT5iX211bHRpdGhyZWFkZWRfcmQpCi0gICAgICAgIHZwOG10X2RlX2FsbG9jX3RlbXBfYnVmZmVycyhwYmksIHBiaS0+Y29tbW9uLm1iX3Jvd3MpOwotICAgIHZwOF9kZWNvZGVyX3JlbW92ZV90aHJlYWRzKHBiaSk7Ci0jZW5kaWYKLSAgICB2cDhfcmVtb3ZlX2NvbW1vbigmcGJpLT5jb21tb24pOwotICAgIHZweF9mcmVlKHBiaSk7Ci19Ci0KLQotaW50IHZwOGR4X2dldF9yZWZlcmVuY2UoVlA4RF9QVFIgcHRyLCBWUDhfUkVGRlJBTUUgcmVmX2ZyYW1lX2ZsYWcsIFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QpCi17Ci0gICAgVlA4RF9DT01QICpwYmkgPSAoVlA4RF9DT01QICopIHB0cjsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZwYmktPmNvbW1vbjsKLSAgICBpbnQgcmVmX2ZiX2lkeDsKLQotICAgIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfTEFTVF9GTEFHKQotICAgICAgICByZWZfZmJfaWR4ID0gY20tPmxzdF9mYl9pZHg7Ci0gICAgZWxzZSBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0dPTERfRkxBRykKLSAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5nbGRfZmJfaWR4OwotICAgIGVsc2UgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9BTFRfRkxBRykKLSAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5hbHRfZmJfaWR4OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoJmNtLT55djEyX2ZiW3JlZl9mYl9pZHhdLCBzZCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgdnA4ZHhfc2V0X3JlZmVyZW5jZShWUDhEX1BUUiBwdHIsIFZQOF9SRUZGUkFNRSByZWZfZnJhbWVfZmxhZywgWVYxMl9CVUZGRVJfQ09ORklHICpzZCkKLXsKLSAgICBWUDhEX0NPTVAgKnBiaSA9IChWUDhEX0NPTVAgKikgcHRyOwotICAgIFZQOF9DT01NT04gKmNtID0gJnBiaS0+Y29tbW9uOwotICAgIGludCByZWZfZmJfaWR4OwotCi0gICAgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9MQVNUX0ZMQUcpCi0gICAgICAgIHJlZl9mYl9pZHggPSBjbS0+bHN0X2ZiX2lkeDsKLSAgICBlbHNlIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfR09MRF9GTEFHKQotICAgICAgICByZWZfZmJfaWR4ID0gY20tPmdsZF9mYl9pZHg7Ci0gICAgZWxzZSBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0FMVF9GTEFHKQotICAgICAgICByZWZfZmJfaWR4ID0gY20tPmFsdF9mYl9pZHg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihzZCwgJmNtLT55djEyX2ZiW3JlZl9mYl9pZHhdKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKkZvciBBUk0gTkVPTiwgZDgtZDE1IGFyZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgbmVlZCB0byBiZSBzYXZlZCBieSB1cy4qLwotI2lmIEhBVkVfQVJNVjcKLWV4dGVybiB2b2lkIHZwOF9wdXNoX25lb24oSU5UNjQgKnN0b3JlKTsKLWV4dGVybiB2b2lkIHZwOF9wb3BfbmVvbihJTlQ2NCAqc3RvcmUpOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZ2V0X2ZyZWVfZmIgKFZQOF9DT01NT04gKmNtKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fWVYxMl9CVUZGRVJTOyBpKyspCi0gICAgICAgIGlmIChjbS0+ZmJfaWR4X3JlZl9jbnRbaV0gPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgY20tPmZiX2lkeF9yZWZfY250W2ldID0gMTsKLSAgICByZXR1cm4gaTsKLX0KLQotc3RhdGljIHZvaWQgcmVmX2NudF9mYiAoaW50ICpidWYsIGludCAqaWR4LCBpbnQgbmV3X2lkeCkKLXsKLSAgICBpZiAoYnVmWyppZHhdID4gMCkKLSAgICAgICAgYnVmWyppZHhdLS07Ci0KLSAgICAqaWR4ID0gbmV3X2lkeDsKLQotICAgIGJ1ZltuZXdfaWR4XSsrOwotfQotCi0vKiBJZiBhbnkgYnVmZmVyIGNvcHkgLyBzd2FwcGluZyBpcyBzaWduYWxsZWQgaXQgc2hvdWxkIGJlIGRvbmUgaGVyZS4gKi8KLXN0YXRpYyBpbnQgc3dhcF9mcmFtZV9idWZmZXJzIChWUDhfQ09NTU9OICpjbSkKLXsKLSAgICBpbnQgZXJyID0gMDsKLQotICAgIC8qIFRoZSBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIG9yIGdvbGRlbiBmcmFtZSBjYW4gYmUgdXBkYXRlZAotICAgICAqICB1c2luZyB0aGUgbmV3LCBsYXN0LCBvciBnb2xkZW4vYWx0IHJlZiBmcmFtZS4gIElmIGl0Ci0gICAgICogIGlzIHVwZGF0ZWQgdXNpbmcgdGhlIG5ld2x5IGRlY29kZWQgZnJhbWUgaXQgaXMgYSByZWZyZXNoLgotICAgICAqICBBbiB1cGRhdGUgdXNpbmcgdGhlIGxhc3Qgb3IgZ29sZGVuL2FsdCByZWYgZnJhbWUgaXMgYSBjb3B5LgotICAgICAqLwotICAgIGlmIChjbS0+Y29weV9idWZmZXJfdG9fYXJmKQotICAgIHsKLSAgICAgICAgaW50IG5ld19mYiA9IDA7Ci0KLSAgICAgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgPT0gMSkKLSAgICAgICAgICAgIG5ld19mYiA9IGNtLT5sc3RfZmJfaWR4OwotICAgICAgICBlbHNlIGlmIChjbS0+Y29weV9idWZmZXJfdG9fYXJmID09IDIpCi0gICAgICAgICAgICBuZXdfZmIgPSBjbS0+Z2xkX2ZiX2lkeDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gLTE7Ci0KLSAgICAgICAgcmVmX2NudF9mYiAoY20tPmZiX2lkeF9yZWZfY250LCAmY20tPmFsdF9mYl9pZHgsIG5ld19mYik7Ci0gICAgfQotCi0gICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZikKLSAgICB7Ci0gICAgICAgIGludCBuZXdfZmIgPSAwOwotCi0gICAgICAgIGlmIChjbS0+Y29weV9idWZmZXJfdG9fZ2YgPT0gMSkKLSAgICAgICAgICAgIG5ld19mYiA9IGNtLT5sc3RfZmJfaWR4OwotICAgICAgICBlbHNlIGlmIChjbS0+Y29weV9idWZmZXJfdG9fZ2YgPT0gMikKLSAgICAgICAgICAgIG5ld19mYiA9IGNtLT5hbHRfZmJfaWR4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlcnIgPSAtMTsKLQotICAgICAgICByZWZfY250X2ZiIChjbS0+ZmJfaWR4X3JlZl9jbnQsICZjbS0+Z2xkX2ZiX2lkeCwgbmV3X2ZiKTsKLSAgICB9Ci0KLSAgICBpZiAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQotICAgICAgICByZWZfY250X2ZiIChjbS0+ZmJfaWR4X3JlZl9jbnQsICZjbS0+Z2xkX2ZiX2lkeCwgY20tPm5ld19mYl9pZHgpOwotCi0gICAgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgIHJlZl9jbnRfZmIgKGNtLT5mYl9pZHhfcmVmX2NudCwgJmNtLT5hbHRfZmJfaWR4LCBjbS0+bmV3X2ZiX2lkeCk7Ci0KLSAgICBpZiAoY20tPnJlZnJlc2hfbGFzdF9mcmFtZSkKLSAgICB7Ci0gICAgICAgIHJlZl9jbnRfZmIgKGNtLT5mYl9pZHhfcmVmX2NudCwgJmNtLT5sc3RfZmJfaWR4LCBjbS0+bmV3X2ZiX2lkeCk7Ci0KLSAgICAgICAgY20tPmZyYW1lX3RvX3Nob3cgPSAmY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGNtLT5mcmFtZV90b19zaG93ID0gJmNtLT55djEyX2ZiW2NtLT5uZXdfZmJfaWR4XTsKLQotICAgIGNtLT5mYl9pZHhfcmVmX2NudFtjbS0+bmV3X2ZiX2lkeF0tLTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCB2cDhkeF9yZWNlaXZlX2NvbXByZXNzZWRfZGF0YShWUDhEX1BUUiBwdHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCBJTlQ2NCB0aW1lX3N0YW1wKQotewotI2lmIEhBVkVfQVJNVjcKLSAgICBJTlQ2NCBkeF9zdG9yZV9yZWdbOF07Ci0jZW5kaWYKLSAgICBWUDhEX0NPTVAgKnBiaSA9IChWUDhEX0NPTVAgKikgcHRyOwotICAgIFZQOF9DT01NT04gKmNtID0gJnBiaS0+Y29tbW9uOwotICAgIGludCByZXRjb2RlID0gMDsKLSAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgdGltZXI7Ci0KLSAgICAvKmlmKHBiaS0+cmVhZHlfZm9yX25ld19kYXRhID09IDApCi0gICAgICAgIHJldHVybiAtMTsqLwotCi0gICAgaWYgKHB0ciA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHBiaS0+Y29tbW9uLmVycm9yLmVycm9yX2NvZGUgPSBWUFhfQ09ERUNfT0s7Ci0KLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgICAvKiBUaGlzIGlzIHVzZWQgdG8gc2lnbmFsIHRoYXQgd2UgYXJlIG1pc3NpbmcgZnJhbWVzLgotICAgICAgICAqIFdlIGRvIG5vdCBrbm93IGlmIHRoZSBtaXNzaW5nIGZyYW1lKHMpIHdhcyBzdXBwb3NlZCB0byB1cGRhdGUKLSAgICAgICAgKiBhbnkgb2YgdGhlIHJlZmVyZW5jZSBidWZmZXJzLCBidXQgd2UgYWN0IGNvbnNlcnZhdGl2ZSBhbmQKLSAgICAgICAgKiBtYXJrIG9ubHkgdGhlIGxhc3QgYnVmZmVyIGFzIGNvcnJ1cHRlZC4KLSAgICAgICAgKi8KLSAgICAgICAgY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLmNvcnJ1cHRlZCA9IDE7Ci0KLSAgICAgICAgLyogU2lnbmFsIHRoYXQgd2UgaGF2ZSBubyBmcmFtZSB0byBzaG93LiAqLwotICAgICAgICBjbS0+c2hvd19mcmFtZSA9IDA7Ci0KLSAgICAgICAgLyogTm90aGluZyBtb3JlIHRvIGRvLiAqLwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLQotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgaWYgKGNtLT5ydGNkLmZsYWdzICYgSEFTX05FT04pCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIHZwOF9wdXNoX25lb24oZHhfc3RvcmVfcmVnKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGNtLT5uZXdfZmJfaWR4ID0gZ2V0X2ZyZWVfZmIgKGNtKTsKLQotICAgIGlmIChzZXRqbXAocGJpLT5jb21tb24uZXJyb3Iuam1wKSkKLSAgICB7Ci0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICAgICAgaWYgKGNtLT5ydGNkLmZsYWdzICYgSEFTX05FT04pCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X3BvcF9uZW9uKGR4X3N0b3JlX3JlZyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBwYmktPmNvbW1vbi5lcnJvci5zZXRqbXAgPSAwOwotCi0gICAgICAgLyogV2UgZG8gbm90IGtub3cgaWYgdGhlIG1pc3NpbmcgZnJhbWUocykgd2FzIHN1cHBvc2VkIHRvIHVwZGF0ZQotICAgICAgICAqIGFueSBvZiB0aGUgcmVmZXJlbmNlIGJ1ZmZlcnMsIGJ1dCB3ZSBhY3QgY29uc2VydmF0aXZlIGFuZAotICAgICAgICAqIG1hcmsgb25seSB0aGUgbGFzdCBidWZmZXIgYXMgY29ycnVwdGVkLgotICAgICAgICAqLwotICAgICAgICBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0uY29ycnVwdGVkID0gMTsKLQotICAgICAgICBpZiAoY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XSA+IDApCi0gICAgICAgICAgY20tPmZiX2lkeF9yZWZfY250W2NtLT5uZXdfZmJfaWR4XS0tOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcGJpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMTsKLQotICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0aW1lcik7Ci0KLSAgICAvKmNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lKys7Ki8KLSAgICBwYmktPlNvdXJjZSA9IHNvdXJjZTsKLSAgICBwYmktPnNvdXJjZV9zeiA9IHNpemU7Ci0KLSAgICByZXRjb2RlID0gdnA4X2RlY29kZV9mcmFtZShwYmkpOwotCi0gICAgaWYgKHJldGNvZGUgPCAwKQotICAgIHsKLSNpZiBIQVZFX0FSTVY3Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgICAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfcG9wX25lb24oZHhfc3RvcmVfcmVnKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLmVycm9yX2NvZGUgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7Ci0gICAgICAgIGlmIChjbS0+ZmJfaWR4X3JlZl9jbnRbY20tPm5ld19mYl9pZHhdID4gMCkKLSAgICAgICAgICBjbS0+ZmJfaWR4X3JlZl9jbnRbY20tPm5ld19mYl9pZHhdLS07Ci0gICAgICAgIHJldHVybiByZXRjb2RlOwotICAgIH0KLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgIGlmIChwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCAmJiBjbS0+bXVsdGlfdG9rZW5fcGFydGl0aW9uICE9IE9ORV9QQVJUSVRJT04pCi0gICAgewotICAgICAgICBpZiAoc3dhcF9mcmFtZV9idWZmZXJzIChjbSkpCi0gICAgICAgIHsKLSNpZiBIQVZFX0FSTVY3Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgICAgICAgICAgaWYgKGNtLT5ydGNkLmZsYWdzICYgSEFTX05FT04pCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cDhfcG9wX25lb24oZHhfc3RvcmVfcmVnKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgcGJpLT5jb21tb24uZXJyb3IuZXJyb3JfY29kZSA9IFZQWF9DT0RFQ19FUlJPUjsKLSAgICAgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgICAgaWYgKHN3YXBfZnJhbWVfYnVmZmVycyAoY20pKQotICAgICAgICB7Ci0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICAgICAgICAgIGlmIChjbS0+cnRjZC5mbGFncyAmIEhBU19ORU9OKQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X3BvcF9uZW9uKGR4X3N0b3JlX3JlZyk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIHBiaS0+Y29tbW9uLmVycm9yLmVycm9yX2NvZGUgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgICAgICAgICBwYmktPmNvbW1vbi5lcnJvci5zZXRqbXAgPSAwOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgbHBmdGltZXI7Ci0gICAgICAgICAgICB2cHhfdXNlY190aW1lcl9zdGFydCgmbHBmdGltZXIpOwotICAgICAgICAgICAgLyogQXBwbHkgdGhlIGxvb3AgZmlsdGVyIGlmIGFwcHJvcHJpYXRlLiAqLwotCi0gICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfZnJhbWUoY20sICZwYmktPm1iLCBjbS0+ZmlsdGVyX2xldmVsKTsKLQotICAgICAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmbHBmdGltZXIpOwotICAgICAgICAgICAgcGJpLT50aW1lX2xvb3BfZmlsdGVyaW5nICs9IHZweF91c2VjX3RpbWVyX2VsYXBzZWQoJmxwZnRpbWVyKTsKLQotICAgICAgICAgICAgY20tPmxhc3RfZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOwotICAgICAgICAgICAgY20tPmxhc3RfZmlsdGVyX3R5cGUgPSBjbS0+ZmlsdGVyX3R5cGU7Ci0gICAgICAgICAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOwotICAgICAgICB9Ci0gICAgICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX3B0cihjbS0+ZnJhbWVfdG9fc2hvdyk7Ci0gICAgfQotCi0KLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7Ci0KLSAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZ0aW1lcik7Ci0gICAgcGJpLT5kZWNvZGVfbWljcm9zZWNvbmRzID0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmdGltZXIpOwotCi0gICAgcGJpLT50aW1lX2RlY29kaW5nICs9IHBiaS0+ZGVjb2RlX21pY3Jvc2Vjb25kczsKLQotICAgIC8qdnA4X3ByaW50X21vZGVzX2FuZF9tb3Rpb25fdmVjdG9ycyggY20tPm1pLCBjbS0+bWJfcm93cyxjbS0+bWJfY29scywgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUpOyovCi0KLSAgICBpZiAoY20tPnNob3dfZnJhbWUpCi0gICAgICAgIGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lKys7Ci0KLSAgICBwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSA9IDA7Ci0gICAgcGJpLT5sYXN0X3RpbWVfc3RhbXAgPSB0aW1lX3N0YW1wOwotCi0jaWYgMAotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIElOVDY0IGVhcmxpZXN0X3RpbWUgPSBwYmktPmRyWzBdLnRpbWVfc3RhbXA7Ci0gICAgICAgIElOVDY0IGxhdGVzdF90aW1lID0gcGJpLT5kclswXS50aW1lX3N0YW1wOwotICAgICAgICBJTlQ2NCB0aW1lX2RpZmYgPSAwOwotICAgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0gICAgICAgIHBiaS0+ZHJbcGJpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSYweGZdLnNpemUgPSBwYmktPmJjLnBvcyArIHBiaS0+YmMyLnBvcyArIDQ7OwotICAgICAgICBwYmktPmRyW3BiaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUmMHhmXS50aW1lX3N0YW1wID0gdGltZV9zdGFtcDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBieXRlcyArPSBwYmktPmRyW2ldLnNpemU7Ci0KLSAgICAgICAgICAgIGlmIChwYmktPmRyW2ldLnRpbWVfc3RhbXAgPCBlYXJsaWVzdF90aW1lKQotICAgICAgICAgICAgICAgIGVhcmxpZXN0X3RpbWUgPSBwYmktPmRyW2ldLnRpbWVfc3RhbXA7Ci0KLSAgICAgICAgICAgIGlmIChwYmktPmRyW2ldLnRpbWVfc3RhbXAgPiBsYXRlc3RfdGltZSkKLSAgICAgICAgICAgICAgICBsYXRlc3RfdGltZSA9IHBiaS0+ZHJbaV0udGltZV9zdGFtcDsKLSAgICAgICAgfQotCi0gICAgICAgIHRpbWVfZGlmZiA9IGxhdGVzdF90aW1lIC0gZWFybGllc3RfdGltZTsKLQotICAgICAgICBpZiAodGltZV9kaWZmID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcGJpLT5jb21tb24uYml0cmF0ZSA9IDgwMDAwLjAwICogYnl0ZXMgLyB0aW1lX2RpZmYgIDsKLSAgICAgICAgICAgIHBiaS0+Y29tbW9uLmZyYW1lcmF0ZSA9IDE2MDAwMDAwMC4wMCAvIHRpbWVfZGlmZiA7Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgIHsKLSAgICAgICAgdnA4X3BvcF9uZW9uKGR4X3N0b3JlX3JlZyk7Ci0gICAgfQotI2VuZGlmCi0gICAgcGJpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMDsKLSAgICByZXR1cm4gcmV0Y29kZTsKLX0KLWludCB2cDhkeF9nZXRfcmF3X2ZyYW1lKFZQOERfUFRSIHB0ciwgWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgSU5UNjQgKnRpbWVfc3RhbXAsIElOVDY0ICp0aW1lX2VuZF9zdGFtcCwgdnA4X3BwZmxhZ3NfdCAqZmxhZ3MpCi17Ci0gICAgaW50IHJldCA9IC0xOwotICAgIFZQOERfQ09NUCAqcGJpID0gKFZQOERfQ09NUCAqKSBwdHI7Ci0KLSAgICBpZiAocGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPT0gMSkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIC8qIGllIG5vIHJhdyBmcmFtZSB0byBzaG93ISEhICovCi0gICAgaWYgKHBiaS0+Y29tbW9uLnNob3dfZnJhbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIHBiaS0+cmVhZHlfZm9yX25ld19kYXRhID0gMTsKLSAgICAqdGltZV9zdGFtcCA9IHBiaS0+bGFzdF90aW1lX3N0YW1wOwotICAgICp0aW1lX2VuZF9zdGFtcCA9IDA7Ci0KLSAgICBzZC0+Y2xydHlwZSA9IHBiaS0+Y29tbW9uLmNscl90eXBlOwotI2lmIENPTkZJR19QT1NUUFJPQwotICAgIHJldCA9IHZwOF9wb3N0X3Byb2NfZnJhbWUoJnBiaS0+Y29tbW9uLCBzZCwgZmxhZ3MpOwotI2Vsc2UKLQotICAgIGlmIChwYmktPmNvbW1vbi5mcmFtZV90b19zaG93KQotICAgIHsKLSAgICAgICAgKnNkID0gKnBiaS0+Y29tbW9uLmZyYW1lX3RvX3Nob3c7Ci0gICAgICAgIHNkLT55X3dpZHRoID0gcGJpLT5jb21tb24uV2lkdGg7Ci0gICAgICAgIHNkLT55X2hlaWdodCA9IHBiaS0+Y29tbW9uLkhlaWdodDsKLSAgICAgICAgc2QtPnV2X2hlaWdodCA9IHBiaS0+Y29tbW9uLkhlaWdodCAvIDI7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLQotI2VuZGlmIC8qIUNPTkZJR19QT1NUUFJPQyovCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci9vbnl4ZF9pbnQuaCBiL3ZwOC9kZWNvZGVyL29ueXhkX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzFlMzMyLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL29ueXhkX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX1ZQOERfSU5UX0gKLSNkZWZpbmUgX19JTkNfVlA4RF9JTlRfSAotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhkLmgiCi0jaW5jbHVkZSAidHJlZXJlYWRlci5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKLSNpbmNsdWRlICJkZXF1YW50aXplLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IGl0aHJlYWQ7Ci0gICAgdm9pZCAqcHRyMTsKLSAgICB2b2lkICpwdHIyOwotfSBERUNPREVUSFJFQURfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNQUNST0JMT0NLRCAgbWJkOwotICAgIGludCBtYl9yb3c7Ci0gICAgaW50IGN1cnJlbnRfbWJfY29sOwotICAgIHNob3J0ICpjb2VmX3B0cjsKLX0gTUJfUk9XX0RFQzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBJTlQ2NCB0aW1lX3N0YW1wOwotICAgIGludCBzaXplOwotfSBEQVRBUkFURTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBJTlQxNiAgICAgICAgIG1pbl92YWw7Ci0gICAgSU5UMTYgICAgICAgICBMZW5ndGg7Ci0gICAgVUlOVDggUHJvYnNbMTJdOwotfSBUT0tFTkVYVFJBQklUUzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBpbnQgY29uc3QgKnNjYW47Ci0gICAgVUlOVDggY29uc3QgKnB0cl9ibG9jazJsZWZ0YWJvdmU7Ci0gICAgdnA4X3RyZWVfaW5kZXggY29uc3QgKnZwOF9jb2VmX3RyZWVfcHRyOwotICAgIFRPS0VORVhUUkFCSVRTIGNvbnN0ICp0ZWJfYmFzZV9wdHI7Ci0gICAgdW5zaWduZWQgY2hhciAqbm9ybV9wdHI7Ci0gICAgVUlOVDggKnB0cl9jb2VmX2JhbmRzX3g7Ci0KLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTICpBOwotICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgKkw7Ci0KLSAgICBJTlQxNiAqcWNvZWZmX3N0YXJ0X3B0cjsKLSAgICBCT09MX0RFQ09ERVIgKmN1cnJlbnRfYmM7Ci0KLSAgICB2cDhfcHJvYiBjb25zdCAqY29lZl9wcm9ic1s0XTsKLQotICAgIFVJTlQ4IGVvYlsyNV07Ci0KLX0gREVUT0s7Ci0KLXR5cGVkZWYgc3RydWN0IFZQOERlY29tcHJlc3NvcgotewotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgTUFDUk9CTE9DS0QsIG1iKTsKLQotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgVlA4X0NPTU1PTiwgY29tbW9uKTsKLQotICAgIHZwOF9yZWFkZXIgYmMsIGJjMjsKLQotICAgIFZQOERfQ09ORklHIG94Y2Y7Ci0KLQotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlNvdXJjZTsKLSAgICB1bnNpZ25lZCBpbnQgICBzb3VyY2Vfc3o7Ci0KLQotICAgIHVuc2lnbmVkIGludCBDUFVGcmVxOwotICAgIHVuc2lnbmVkIGludCBkZWNvZGVfbWljcm9zZWNvbmRzOwotICAgIHVuc2lnbmVkIGludCB0aW1lX2RlY29kaW5nOwotICAgIHVuc2lnbmVkIGludCB0aW1lX2xvb3BfZmlsdGVyaW5nOwotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgLyogdmFyaWFibGUgZm9yIHRocmVhZGluZyAqLwotCi0gICAgdm9sYXRpbGUgaW50IGJfbXVsdGl0aHJlYWRlZF9yZDsKLSAgICBpbnQgbWF4X3RocmVhZHM7Ci0gICAgaW50IGN1cnJlbnRfbWJfY29sX21haW47Ci0gICAgaW50IGRlY29kaW5nX3RocmVhZF9jb3VudDsKLSAgICBpbnQgYWxsb2NhdGVkX2RlY29kaW5nX3RocmVhZF9jb3VudDsKLQotICAgIGludCBtdF9iYXNlbGluZV9maWx0ZXJfbGV2ZWxbTUFYX01CX1NFR01FTlRTXTsKLSAgICBpbnQgc3luY19yYW5nZTsKLSAgICBpbnQgKm10X2N1cnJlbnRfbWJfY29sOyAgICAgICAgICAgICAgICAgIC8qIEVhY2ggcm93IHJlbWVtYmVycyBpdHMgYWxyZWFkeSBkZWNvZGVkIGNvbHVtbi4gKi8KLQotICAgIHVuc2lnbmVkIGNoYXIgKiptdF95YWJvdmVfcm93OyAgICAgICAgICAgLyogbWJfcm93cyB4IHdpZHRoICovCi0gICAgdW5zaWduZWQgY2hhciAqKm10X3VhYm92ZV9yb3c7Ci0gICAgdW5zaWduZWQgY2hhciAqKm10X3ZhYm92ZV9yb3c7Ci0gICAgdW5zaWduZWQgY2hhciAqKm10X3lsZWZ0X2NvbDsgICAgICAgICAgICAvKiBtYl9yb3dzIHggMTYgKi8KLSAgICB1bnNpZ25lZCBjaGFyICoqbXRfdWxlZnRfY29sOyAgICAgICAgICAgIC8qIG1iX3Jvd3MgeCA4ICovCi0gICAgdW5zaWduZWQgY2hhciAqKm10X3ZsZWZ0X2NvbDsgICAgICAgICAgICAvKiBtYl9yb3dzIHggOCAqLwotCi0gICAgTUJfUk9XX0RFQyAgICAgICAgICAgKm1iX3Jvd19kaTsKLSAgICBERUNPREVUSFJFQURfREFUQSAgICAqZGVfdGhyZWFkX2RhdGE7Ci0KLSAgICBwdGhyZWFkX3QgICAgICAgICAgICpoX2RlY29kaW5nX3RocmVhZDsKLSAgICBzZW1fdCAgICAgICAgICAgICAgICpoX2V2ZW50X3N0YXJ0X2RlY29kaW5nOwotICAgIHNlbV90ICAgICAgICAgICAgICAgIGhfZXZlbnRfZW5kX2RlY29kaW5nOwotICAgIC8qIGVuZCBvZiB0aHJlYWRpbmcgZGF0YSAqLwotI2VuZGlmCi0KLSAgICB2cDhfcmVhZGVyICptYmM7Ci0gICAgSU5UNjQgbGFzdF90aW1lX3N0YW1wOwotICAgIGludCAgIHJlYWR5X2Zvcl9uZXdfZGF0YTsKLQotICAgIERBVEFSQVRFIGRyWzE2XTsKLQotICAgIERFVE9LIGRldG9rZW47Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgdnA4X2RlcXVhbnRfcnRjZF92dGFibGVfdCAgICAgICAgZGVxdWFudDsKLSNlbmRpZgotCi0KLSAgICB2cDhfcHJvYiBwcm9iX2ludHJhOwotICAgIHZwOF9wcm9iIHByb2JfbGFzdDsKLSAgICB2cDhfcHJvYiBwcm9iX2dmOwotICAgIHZwOF9wcm9iIHByb2Jfc2tpcF9mYWxzZTsKLQotfSBWUDhEX0NPTVA7Ci0KLWludCB2cDhfZGVjb2RlX2ZyYW1lKFZQOERfQ09NUCAqY3BpKTsKLXZvaWQgdnA4X2RtYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhWUDhEX0NPTVAgKnBiaSk7Ci0KLQotI2lmIENPTkZJR19ERUJVRwotI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAotICAgICAgICBsdmFsID0gKGV4cHIpOyBcCi0gICAgICAgIGlmKCFsdmFsKSBcCi0gICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBiaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCIgYXQgJXM6JWQiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sX19MSU5FX18pO1wKLSAgICB9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAotICAgICAgICBsdmFsID0gKGV4cHIpOyBcCi0gICAgICAgIGlmKCFsdmFsKSBcCi0gICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJnBiaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCk7XAotICAgIH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL3JlY29uaW50cmFfbXQuYyBiL3ZwOC9kZWNvZGVyL3JlY29uaW50cmFfbXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMmIzNy4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9yZWNvbmludHJhX210LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vcmVjb25pbnRyYS5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgIm9ueXhkX2ludC5oIgotCi0vKiBGb3Igc2tpcF9yZWNvbl9tYigpLCBhZGQgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MoTUFDUk9CTE9DS0QgKngpIGFuZAotICogdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zKE1BQ1JPQkxPQ0tEICp4KS4KLSAqLwotCi12b2lkIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5KFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeCwgaW50IG1iX3JvdywgaW50IG1iX2NvbCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp5YWJvdmVfcm93OyAgICAvKiA9IHgtPmRzdC55X2J1ZmZlciAtIHgtPmRzdC55X3N0cmlkZTsgKi8KLSAgICB1bnNpZ25lZCBjaGFyICp5bGVmdF9jb2w7Ci0gICAgdW5zaWduZWQgY2hhciB5bGVmdF9idWZbMTZdOwotICAgIHVuc2lnbmVkIGNoYXIgeXRvcF9sZWZ0OyAgICAgIC8qID0geWFib3ZlX3Jvd1stMV07ICovCi0gICAgdW5zaWduZWQgY2hhciAqeXByZWRfcHRyID0geC0+cHJlZGljdG9yOwotICAgIGludCByLCBjLCBpOwotCi0gICAgaWYgKHBiaS0+Y29tbW9uLmZpbHRlcl9sZXZlbCkKLSAgICB7Ci0gICAgICAgIHlhYm92ZV9yb3cgPSBwYmktPm10X3lhYm92ZV9yb3dbbWJfcm93XSArIG1iX2NvbCoxNiArMzI7Ci0gICAgICAgIHlsZWZ0X2NvbCA9IHBiaS0+bXRfeWxlZnRfY29sW21iX3Jvd107Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICB5YWJvdmVfcm93ID0geC0+ZHN0LnlfYnVmZmVyIC0geC0+ZHN0Lnlfc3RyaWRlOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgeWxlZnRfYnVmW2ldID0geC0+ZHN0LnlfYnVmZmVyIFtpKiB4LT5kc3QueV9zdHJpZGUgLTFdOwotICAgICAgICB5bGVmdF9jb2wgPSB5bGVmdF9idWY7Ci0gICAgfQotCi0gICAgeXRvcF9sZWZ0ID0geWFib3ZlX3Jvd1stMV07Ci0KLSAgICAvKiBmb3IgWSAqLwotICAgIHN3aXRjaCAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSkKLSAgICB7Ci0gICAgY2FzZSBEQ19QUkVEOgotICAgIHsKLSAgICAgICAgaW50IGV4cGVjdGVkX2RjOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICBpbnQgYXZlcmFnZSA9IDA7Ci0KLQotICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlIHx8IHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSArPSB5YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdmVyYWdlICs9IHlsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgIHNoaWZ0ID0gMyArIHgtPnVwX2F2YWlsYWJsZSArIHgtPmxlZnRfYXZhaWxhYmxlOwotICAgICAgICAgICAgZXhwZWN0ZWRfZGMgPSAoYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZF9kYyA9IDEyODsKLSAgICAgICAgfQotCi0gICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCBleHBlY3RlZF9kYywgMjU2KTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBWX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVswXSA9ICgoaW50ICopeWFib3ZlX3JvdylbMF07Ci0gICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbMV0gPSAoKGludCAqKXlhYm92ZV9yb3cpWzFdOwotICAgICAgICAgICAgKChpbnQgKil5cHJlZF9wdHIpWzJdID0gKChpbnQgKil5YWJvdmVfcm93KVsyXTsKLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVszXSA9ICgoaW50ICopeWFib3ZlX3JvdylbM107Ci0gICAgICAgICAgICB5cHJlZF9wdHIgKz0gMTY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBIX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCB5bGVmdF9jb2xbcl0sIDE2KTsKLSAgICAgICAgICAgIHlwcmVkX3B0ciArPSAxNjsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgVE1fUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAxNjsgYysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwcmVkID0gIHlsZWZ0X2NvbFtyXSArIHlhYm92ZV9yb3dbIGNdIC0geXRvcF9sZWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWQgPCAwKQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMjU1OwotCi0gICAgICAgICAgICAgICAgeXByZWRfcHRyW2NdID0gcHJlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeXByZWRfcHRyICs9IDE2OwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX1BSRUQ6Ci0gICAgY2FzZSBORUFSRVNUTVY6Ci0gICAgY2FzZSBORUFSTVY6Ci0gICAgY2FzZSBaRVJPTVY6Ci0gICAgY2FzZSBORVdNVjoKLSAgICBjYXNlIFNQTElUTVY6Ci0gICAgY2FzZSBNQl9NT0RFX0NPVU5UOgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4bXRfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnlfcyhWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKngsIGludCBtYl9yb3csIGludCBtYl9jb2wpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqeWFib3ZlX3JvdzsgICAgLyogPSB4LT5kc3QueV9idWZmZXIgLSB4LT5kc3QueV9zdHJpZGU7ICovCi0gICAgdW5zaWduZWQgY2hhciAqeWxlZnRfY29sOwotICAgIHVuc2lnbmVkIGNoYXIgeWxlZnRfYnVmWzE2XTsKLSAgICB1bnNpZ25lZCBjaGFyIHl0b3BfbGVmdDsgICAgICAvKiA9IHlhYm92ZV9yb3dbLTFdOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnlwcmVkX3B0ciA9IHgtPnByZWRpY3RvcjsKLSAgICBpbnQgciwgYywgaTsKLQotICAgIGludCB5X3N0cmlkZSA9IHgtPmRzdC55X3N0cmlkZTsKLSAgICB5cHJlZF9wdHIgPSB4LT5kc3QueV9idWZmZXI7IC8qeC0+cHJlZGljdG9yOyovCi0KLSAgICBpZiAocGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQotICAgIHsKLSAgICAgICAgeWFib3ZlX3JvdyA9IHBiaS0+bXRfeWFib3ZlX3Jvd1ttYl9yb3ddICsgbWJfY29sKjE2ICszMjsKLSAgICAgICAgeWxlZnRfY29sID0gcGJpLT5tdF95bGVmdF9jb2xbbWJfcm93XTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIHlhYm92ZV9yb3cgPSB4LT5kc3QueV9idWZmZXIgLSB4LT5kc3QueV9zdHJpZGU7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICB5bGVmdF9idWZbaV0gPSB4LT5kc3QueV9idWZmZXIgW2kqIHgtPmRzdC55X3N0cmlkZSAtMV07Ci0gICAgICAgIHlsZWZ0X2NvbCA9IHlsZWZ0X2J1ZjsKLSAgICB9Ci0KLSAgICB5dG9wX2xlZnQgPSB5YWJvdmVfcm93Wy0xXTsKLQotICAgIC8qIGZvciBZICovCi0gICAgc3dpdGNoICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlKQotICAgIHsKLSAgICBjYXNlIERDX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgZXhwZWN0ZWRfZGM7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgc2hpZnQ7Ci0gICAgICAgIGludCBhdmVyYWdlID0gMDsKLQotCi0gICAgICAgIGlmICh4LT51cF9hdmFpbGFibGUgfHwgeC0+bGVmdF9hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4LT51cF9hdmFpbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdmVyYWdlICs9IHlhYm92ZV9yb3dbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoeC0+bGVmdF9hdmFpbGFibGUpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UgKz0geWxlZnRfY29sW2ldOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgc2hpZnQgPSAzICsgeC0+dXBfYXZhaWxhYmxlICsgeC0+bGVmdF9hdmFpbGFibGU7Ci0gICAgICAgICAgICBleHBlY3RlZF9kYyA9IChhdmVyYWdlICsgKDEgPDwgKHNoaWZ0IC0gMSkpKSA+PiBzaGlmdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdGVkX2RjID0gMTI4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2cHhfbWVtc2V0KHlwcmVkX3B0ciwgZXhwZWN0ZWRfZGMsIDI1Nik7Ki8KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9tZW1zZXQoeXByZWRfcHRyLCBleHBlY3RlZF9kYywgMTYpOwotICAgICAgICAgICAgeXByZWRfcHRyICs9IHlfc3RyaWRlOyAvKjE2OyovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBWX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCAxNjsgcisrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVswXSA9ICgoaW50ICopeWFib3ZlX3JvdylbMF07Ci0gICAgICAgICAgICAoKGludCAqKXlwcmVkX3B0cilbMV0gPSAoKGludCAqKXlhYm92ZV9yb3cpWzFdOwotICAgICAgICAgICAgKChpbnQgKil5cHJlZF9wdHIpWzJdID0gKChpbnQgKil5YWJvdmVfcm93KVsyXTsKLSAgICAgICAgICAgICgoaW50ICopeXByZWRfcHRyKVszXSA9ICgoaW50ICopeWFib3ZlX3JvdylbM107Ci0gICAgICAgICAgICB5cHJlZF9wdHIgKz0geV9zdHJpZGU7IC8qMTY7Ki8KLSAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEhfUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdnB4X21lbXNldCh5cHJlZF9wdHIsIHlsZWZ0X2NvbFtyXSwgMTYpOwotICAgICAgICAgICAgeXByZWRfcHRyICs9IHlfc3RyaWRlOyAgLyoxNjsqLwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBUTV9QUkVEOgotICAgIHsKLQotICAgICAgICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDE2OyBjKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHByZWQgPSAgeWxlZnRfY29sW3JdICsgeWFib3ZlX3Jvd1sgY10gLSB5dG9wX2xlZnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHByZWQgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWQgPiAyNTUpCi0gICAgICAgICAgICAgICAgICAgIHByZWQgPSAyNTU7Ci0KLSAgICAgICAgICAgICAgICB5cHJlZF9wdHJbY10gPSBwcmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB5cHJlZF9wdHIgKz0geV9zdHJpZGU7ICAvKjE2OyovCi0gICAgICAgIH0KLQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEJfUFJFRDoKLSAgICBjYXNlIE5FQVJFU1RNVjoKLSAgICBjYXNlIE5FQVJNVjoKLSAgICBjYXNlIFpFUk9NVjoKLSAgICBjYXNlIE5FV01WOgotICAgIGNhc2UgU1BMSVRNVjoKLSAgICBjYXNlIE1CX01PREVfQ09VTlQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCB2cDhtdF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXYoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4LCBpbnQgbWJfcm93LCBpbnQgbWJfY29sKQotewotICAgIHVuc2lnbmVkIGNoYXIgKnVhYm92ZV9yb3c7ICAgLyogPSB4LT5kc3QudV9idWZmZXIgLSB4LT5kc3QudXZfc3RyaWRlOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnVsZWZ0X2NvbDsgICAgLypbMTZdOyovCi0gICAgdW5zaWduZWQgY2hhciB1bGVmdF9idWZbOF07Ci0gICAgdW5zaWduZWQgY2hhciB1dG9wX2xlZnQ7ICAgICAvKiA9IHVhYm92ZV9yb3dbLTFdOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnZhYm92ZV9yb3c7ICAgLyogPSB4LT5kc3Qudl9idWZmZXIgLSB4LT5kc3QudXZfc3RyaWRlOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnZsZWZ0X2NvbDsgICAgLypbMjBdOyovCi0gICAgdW5zaWduZWQgY2hhciB2bGVmdF9idWZbOF07Ci0gICAgdW5zaWduZWQgY2hhciB2dG9wX2xlZnQ7ICAgICAvKiA9IHZhYm92ZV9yb3dbLTFdOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkX3B0ciA9ICZ4LT5wcmVkaWN0b3JbMjU2XTsKLSAgICB1bnNpZ25lZCBjaGFyICp2cHJlZF9wdHIgPSAmeC0+cHJlZGljdG9yWzMyMF07Ci0gICAgaW50IGksIGo7Ci0KLSAgICBpZiAocGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQotICAgIHsKLSAgICAgICAgdWFib3ZlX3JvdyA9IHBiaS0+bXRfdWFib3ZlX3Jvd1ttYl9yb3ddICsgbWJfY29sKjggKzE2OwotICAgICAgICB2YWJvdmVfcm93ID0gcGJpLT5tdF92YWJvdmVfcm93W21iX3Jvd10gKyBtYl9jb2wqOCArMTY7Ci0gICAgICAgIHVsZWZ0X2NvbCA9IHBiaS0+bXRfdWxlZnRfY29sW21iX3Jvd107Ci0gICAgICAgIHZsZWZ0X2NvbCA9IHBiaS0+bXRfdmxlZnRfY29sW21iX3Jvd107Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICB1YWJvdmVfcm93ID0geC0+ZHN0LnVfYnVmZmVyIC0geC0+ZHN0LnV2X3N0cmlkZTsKLSAgICAgICAgdmFib3ZlX3JvdyA9IHgtPmRzdC52X2J1ZmZlciAtIHgtPmRzdC51dl9zdHJpZGU7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdWxlZnRfYnVmW2ldID0geC0+ZHN0LnVfYnVmZmVyIFtpKiB4LT5kc3QudXZfc3RyaWRlIC0xXTsKLSAgICAgICAgICAgIHZsZWZ0X2J1ZltpXSA9IHgtPmRzdC52X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07Ci0gICAgICAgIH0KLSAgICAgICAgdWxlZnRfY29sID0gdWxlZnRfYnVmOwotICAgICAgICB2bGVmdF9jb2wgPSB2bGVmdF9idWY7Ci0gICAgfQotICAgIHV0b3BfbGVmdCA9IHVhYm92ZV9yb3dbLTFdOwotICAgIHZ0b3BfbGVmdCA9IHZhYm92ZV9yb3dbLTFdOwotCi0gICAgc3dpdGNoICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlKQotICAgIHsKLSAgICBjYXNlIERDX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgZXhwZWN0ZWRfdWRjOwotICAgICAgICBpbnQgZXhwZWN0ZWRfdmRjOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICBpbnQgVWF2ZXJhZ2UgPSAwOwotICAgICAgICBpbnQgVmF2ZXJhZ2UgPSAwOwotCi0gICAgICAgIGlmICh4LT51cF9hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVWF2ZXJhZ2UgKz0gdWFib3ZlX3Jvd1tpXTsKLSAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVhdmVyYWdlICs9IHVsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2bGVmdF9jb2xbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXgtPnVwX2F2YWlsYWJsZSAmJiAheC0+bGVmdF9hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdGVkX3VkYyA9IDEyODsKLSAgICAgICAgICAgIGV4cGVjdGVkX3ZkYyA9IDEyODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNoaWZ0ID0gMiArIHgtPnVwX2F2YWlsYWJsZSArIHgtPmxlZnRfYXZhaWxhYmxlOwotICAgICAgICAgICAgZXhwZWN0ZWRfdWRjID0gKFVhdmVyYWdlICsgKDEgPDwgKHNoaWZ0IC0gMSkpKSA+PiBzaGlmdDsKLSAgICAgICAgICAgIGV4cGVjdGVkX3ZkYyA9IChWYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHZweF9tZW1zZXQodXByZWRfcHRyLCBleHBlY3RlZF91ZGMsIDY0KTsKLSAgICAgICAgdnB4X21lbXNldCh2cHJlZF9wdHIsIGV4cGVjdGVkX3ZkYywgNjQpOwotCi0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBWX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KHVwcmVkX3B0ciwgdWFib3ZlX3JvdywgOCk7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KHZwcmVkX3B0ciwgdmFib3ZlX3JvdywgOCk7Ci0gICAgICAgICAgICB1cHJlZF9wdHIgKz0gODsKLSAgICAgICAgICAgIHZwcmVkX3B0ciArPSA4OwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBIX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHVwcmVkX3B0ciwgdWxlZnRfY29sW2ldLCA4KTsKLSAgICAgICAgICAgIHZweF9tZW1zZXQodnByZWRfcHRyLCB2bGVmdF9jb2xbaV0sIDgpOwotICAgICAgICAgICAgdXByZWRfcHRyICs9IDg7Ci0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJyZWFrOwotICAgIGNhc2UgVE1fUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHByZWR1ID0gdWxlZnRfY29sW2ldICsgdWFib3ZlX3Jvd1tqXSAtIHV0b3BfbGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgcHJlZHYgPSB2bGVmdF9jb2xbaV0gKyB2YWJvdmVfcm93W2pdIC0gdnRvcF9sZWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR1IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHUgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR1ID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkdSA9IDI1NTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkdiA8IDApCi0gICAgICAgICAgICAgICAgICAgIHByZWR2ID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkdiA+IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHYgPSAyNTU7Ci0KLSAgICAgICAgICAgICAgICB1cHJlZF9wdHJbal0gPSBwcmVkdTsKLSAgICAgICAgICAgICAgICB2cHJlZF9wdHJbal0gPSBwcmVkdjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXByZWRfcHRyICs9IDg7Ci0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gODsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9QUkVEOgotICAgIGNhc2UgTkVBUkVTVE1WOgotICAgIGNhc2UgTkVBUk1WOgotICAgIGNhc2UgWkVST01WOgotICAgIGNhc2UgTkVXTVY6Ci0gICAgY2FzZSBTUExJVE1WOgotICAgIGNhc2UgTUJfTU9ERV9DT1VOVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zKFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeCwgaW50IG1iX3JvdywgaW50IG1iX2NvbCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp1YWJvdmVfcm93OyAgLyogPSB4LT5kc3QudV9idWZmZXIgLSB4LT5kc3QudXZfc3RyaWRlOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnVsZWZ0X2NvbDsgICAvKlsxNl07Ki8KLSAgICB1bnNpZ25lZCBjaGFyIHVsZWZ0X2J1Zls4XTsKLSAgICB1bnNpZ25lZCBjaGFyIHV0b3BfbGVmdDsgICAgLyogPSB1YWJvdmVfcm93Wy0xXTsgKi8KLSAgICB1bnNpZ25lZCBjaGFyICp2YWJvdmVfcm93OyAgLyogPSB4LT5kc3Qudl9idWZmZXIgLSB4LT5kc3QudXZfc3RyaWRlOyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnZsZWZ0X2NvbDsgICAvKlsyMF07Ki8KLSAgICB1bnNpZ25lZCBjaGFyIHZsZWZ0X2J1Zls4XTsKLSAgICB1bnNpZ25lZCBjaGFyIHZ0b3BfbGVmdDsgICAgLyogPSB2YWJvdmVfcm93Wy0xXTsgKi8KLSAgICB1bnNpZ25lZCBjaGFyICp1cHJlZF9wdHIgPSB4LT5kc3QudV9idWZmZXI7IC8qJngtPnByZWRpY3RvclsyNTZdOyovCi0gICAgdW5zaWduZWQgY2hhciAqdnByZWRfcHRyID0geC0+ZHN0LnZfYnVmZmVyOyAvKiZ4LT5wcmVkaWN0b3JbMzIwXTsqLwotICAgIGludCB1dl9zdHJpZGUgPSB4LT5kc3QudXZfc3RyaWRlOwotICAgIGludCBpLCBqOwotCi0gICAgaWYgKHBiaS0+Y29tbW9uLmZpbHRlcl9sZXZlbCkKLSAgICB7Ci0gICAgICAgIHVhYm92ZV9yb3cgPSBwYmktPm10X3VhYm92ZV9yb3dbbWJfcm93XSArIG1iX2NvbCo4ICsxNjsKLSAgICAgICAgdmFib3ZlX3JvdyA9IHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3ddICsgbWJfY29sKjggKzE2OwotICAgICAgICB1bGVmdF9jb2wgPSBwYmktPm10X3VsZWZ0X2NvbFttYl9yb3ddOwotICAgICAgICB2bGVmdF9jb2wgPSBwYmktPm10X3ZsZWZ0X2NvbFttYl9yb3ddOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgdWFib3ZlX3JvdyA9IHgtPmRzdC51X2J1ZmZlciAtIHgtPmRzdC51dl9zdHJpZGU7Ci0gICAgICAgIHZhYm92ZV9yb3cgPSB4LT5kc3Qudl9idWZmZXIgLSB4LT5kc3QudXZfc3RyaWRlOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVsZWZ0X2J1ZltpXSA9IHgtPmRzdC51X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07Ci0gICAgICAgICAgICB2bGVmdF9idWZbaV0gPSB4LT5kc3Qudl9idWZmZXIgW2kqIHgtPmRzdC51dl9zdHJpZGUgLTFdOwotICAgICAgICB9Ci0gICAgICAgIHVsZWZ0X2NvbCA9IHVsZWZ0X2J1ZjsKLSAgICAgICAgdmxlZnRfY29sID0gdmxlZnRfYnVmOwotICAgIH0KLSAgICB1dG9wX2xlZnQgPSB1YWJvdmVfcm93Wy0xXTsKLSAgICB2dG9wX2xlZnQgPSB2YWJvdmVfcm93Wy0xXTsKLQotICAgIHN3aXRjaCAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBEQ19QUkVEOgotICAgIHsKLSAgICAgICAgaW50IGV4cGVjdGVkX3VkYzsKLSAgICAgICAgaW50IGV4cGVjdGVkX3ZkYzsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgaW50IFVhdmVyYWdlID0gMDsKLSAgICAgICAgaW50IFZhdmVyYWdlID0gMDsKLQotICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVhdmVyYWdlICs9IHVhYm92ZV9yb3dbaV07Ci0gICAgICAgICAgICAgICAgVmF2ZXJhZ2UgKz0gdmFib3ZlX3Jvd1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4LT5sZWZ0X2F2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVYXZlcmFnZSArPSB1bGVmdF9jb2xbaV07Ci0gICAgICAgICAgICAgICAgVmF2ZXJhZ2UgKz0gdmxlZnRfY29sW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF4LT51cF9hdmFpbGFibGUgJiYgIXgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZF91ZGMgPSAxMjg7Ci0gICAgICAgICAgICBleHBlY3RlZF92ZGMgPSAxMjg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGlmdCA9IDIgKyB4LT51cF9hdmFpbGFibGUgKyB4LT5sZWZ0X2F2YWlsYWJsZTsKLSAgICAgICAgICAgIGV4cGVjdGVkX3VkYyA9IChVYXZlcmFnZSArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7Ci0gICAgICAgICAgICBleHBlY3RlZF92ZGMgPSAoVmF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OwotICAgICAgICB9Ci0KLQotICAgICAgICAvKnZweF9tZW1zZXQodXByZWRfcHRyLGV4cGVjdGVkX3VkYyw2NCk7Ci0gICAgICAgIHZweF9tZW1zZXQodnByZWRfcHRyLGV4cGVjdGVkX3ZkYyw2NCk7Ki8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdnB4X21lbXNldCh1cHJlZF9wdHIsIGV4cGVjdGVkX3VkYywgOCk7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHZwcmVkX3B0ciwgZXhwZWN0ZWRfdmRjLCA4KTsKLSAgICAgICAgICAgIHVwcmVkX3B0ciArPSB1dl9zdHJpZGU7IC8qODsqLwotICAgICAgICAgICAgdnByZWRfcHRyICs9IHV2X3N0cmlkZTsgLyo4OyovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBWX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KHVwcmVkX3B0ciwgdWFib3ZlX3JvdywgOCk7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KHZwcmVkX3B0ciwgdmFib3ZlX3JvdywgOCk7Ci0gICAgICAgICAgICB1cHJlZF9wdHIgKz0gdXZfc3RyaWRlOyAvKjg7Ki8KLSAgICAgICAgICAgIHZwcmVkX3B0ciArPSB1dl9zdHJpZGU7IC8qODsqLwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBIX1BSRUQ6Ci0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHVwcmVkX3B0ciwgdWxlZnRfY29sW2ldLCA4KTsKLSAgICAgICAgICAgIHZweF9tZW1zZXQodnByZWRfcHRyLCB2bGVmdF9jb2xbaV0sIDgpOwotICAgICAgICAgICAgdXByZWRfcHRyICs9IHV2X3N0cmlkZTsgLyo4OyovCi0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gdXZfc3RyaWRlOyAvKjg7Ki8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGJyZWFrOwotICAgIGNhc2UgVE1fUFJFRDoKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHByZWR1ID0gdWxlZnRfY29sW2ldICsgdWFib3ZlX3Jvd1tqXSAtIHV0b3BfbGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgcHJlZHYgPSB2bGVmdF9jb2xbaV0gKyB2YWJvdmVfcm93W2pdIC0gdnRvcF9sZWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR1IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHUgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWR1ID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkdSA9IDI1NTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkdiA8IDApCi0gICAgICAgICAgICAgICAgICAgIHByZWR2ID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkdiA+IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgcHJlZHYgPSAyNTU7Ci0KLSAgICAgICAgICAgICAgICB1cHJlZF9wdHJbal0gPSBwcmVkdTsKLSAgICAgICAgICAgICAgICB2cHJlZF9wdHJbal0gPSBwcmVkdjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXByZWRfcHRyICs9IHV2X3N0cmlkZTsgLyo4OyovCi0gICAgICAgICAgICB2cHJlZF9wdHIgKz0gdXZfc3RyaWRlOyAvKjg7Ki8KLSAgICAgICAgfQotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9QUkVEOgotICAgIGNhc2UgTkVBUkVTVE1WOgotICAgIGNhc2UgTkVBUk1WOgotICAgIGNhc2UgWkVST01WOgotICAgIGNhc2UgTkVXTVY6Ci0gICAgY2FzZSBTUExJVE1WOgotICAgIGNhc2UgTUJfTU9ERV9DT1VOVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4bXRfcHJlZGljdF9pbnRyYTR4NChWUDhEX0NPTVAgKnBiaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDUk9CTE9DS0QgKnhkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkaWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW0pCi17Ci0gICAgaW50IGksIHIsIGM7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpBYm92ZTsgICAvKiA9ICooeC0+YmFzZV9kc3QpICsgeC0+ZHN0IC0geC0+ZHN0X3N0cmlkZTsgKi8KLSAgICB1bnNpZ25lZCBjaGFyIExlZnRbNF07Ci0gICAgdW5zaWduZWQgY2hhciB0b3BfbGVmdDsgLyogPSBBYm92ZVstMV07ICovCi0KLSAgICBCTE9DS0QgKnggPSAmeGQtPmJsb2NrW251bV07Ci0KLSAgICAvKkNhdXRpb246IEZvciBzb21lIGJfbW9kZSwgaXQgbmVlZHMgOCBwaXhlbHMgKDQgYWJvdmUgKyA0IGFib3ZlLXJpZ2h0KS4qLwotICAgIGlmIChudW0gPCA0ICYmIHBiaS0+Y29tbW9uLmZpbHRlcl9sZXZlbCkKLSAgICAgICAgQWJvdmUgPSBwYmktPm10X3lhYm92ZV9yb3dbbWJfcm93XSArIG1iX2NvbCoxNiArIG51bSo0ICsgMzI7Ci0gICAgZWxzZQotICAgICAgICBBYm92ZSA9ICooeC0+YmFzZV9kc3QpICsgeC0+ZHN0IC0geC0+ZHN0X3N0cmlkZTsKLQotICAgIGlmIChudW0lND09MCAmJiBwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCi0gICAgewotICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICBMZWZ0W2ldID0gcGJpLT5tdF95bGVmdF9jb2xbbWJfcm93XVtudW0gKyBpXTsKLSAgICB9ZWxzZQotICAgIHsKLSAgICAgICAgTGVmdFswXSA9ICgqKHgtPmJhc2VfZHN0KSlbeC0+ZHN0IC0gMV07Ci0gICAgICAgIExlZnRbMV0gPSAoKih4LT5iYXNlX2RzdCkpW3gtPmRzdCAtIDEgKyB4LT5kc3Rfc3RyaWRlXTsKLSAgICAgICAgTGVmdFsyXSA9ICgqKHgtPmJhc2VfZHN0KSlbeC0+ZHN0IC0gMSArIDIgKiB4LT5kc3Rfc3RyaWRlXTsKLSAgICAgICAgTGVmdFszXSA9ICgqKHgtPmJhc2VfZHN0KSlbeC0+ZHN0IC0gMSArIDMgKiB4LT5kc3Rfc3RyaWRlXTsKLSAgICB9Ci0KLSAgICBpZiAoKG51bT09NCB8fCBudW09PTggfHwgbnVtPT0xMikgJiYgcGJpLT5jb21tb24uZmlsdGVyX2xldmVsKQotICAgICAgICB0b3BfbGVmdCA9IHBiaS0+bXRfeWxlZnRfY29sW21iX3Jvd11bbnVtLTFdOwotICAgIGVsc2UKLSAgICAgICAgdG9wX2xlZnQgPSBBYm92ZVstMV07Ci0KLSAgICAgc3dpdGNoIChiX21vZGUpCi0gICAgewotICAgIGNhc2UgQl9EQ19QUkVEOgotICAgIHsKLSAgICAgICAgaW50IGV4cGVjdGVkX2RjID0gMDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZF9kYyArPSBBYm92ZVtpXTsKLSAgICAgICAgICAgIGV4cGVjdGVkX2RjICs9IExlZnRbaV07Ci0gICAgICAgIH0KLQotICAgICAgICBleHBlY3RlZF9kYyA9IChleHBlY3RlZF9kYyArIDQpID4+IDM7Ci0KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDQ7IGMrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbY10gPSBleHBlY3RlZF9kYzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJlZGljdG9yICs9IDE2OwotICAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9UTV9QUkVEOgotICAgIHsKLSAgICAgICAgLyogcHJlZGljdGlvbiBzaW1pbGFyIHRvIHRydWVfbW90aW9uIHByZWRpY3Rpb24gKi8KLSAgICAgICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDQ7IGMrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcHJlZCA9IEFib3ZlW2NdIC0gdG9wX2xlZnQgKyBMZWZ0W3JdOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWQgPCAwKQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVkID4gMjU1KQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gMjU1OwotCi0gICAgICAgICAgICAgICAgcHJlZGljdG9yW2NdID0gcHJlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJlZGljdG9yICs9IDE2OwotICAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBCX1ZFX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIHVuc2lnbmVkIGludCBhcFs0XTsKLSAgICAgICAgYXBbMF0gPSAodG9wX2xlZnQgICsgMiAqIEFib3ZlWzBdICsgQWJvdmVbMV0gKyAyKSA+PiAyOwotICAgICAgICBhcFsxXSA9IChBYm92ZVswXSArIDIgKiBBYm92ZVsxXSArIEFib3ZlWzJdICsgMikgPj4gMjsKLSAgICAgICAgYXBbMl0gPSAoQWJvdmVbMV0gKyAyICogQWJvdmVbMl0gKyBBYm92ZVszXSArIDIpID4+IDI7Ci0gICAgICAgIGFwWzNdID0gKEFib3ZlWzJdICsgMiAqIEFib3ZlWzNdICsgQWJvdmVbNF0gKyAyKSA+PiAyOwotCi0gICAgICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbY10gPSBhcFtjXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJlZGljdG9yICs9IDE2OwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgQl9IRV9QUkVEOgotICAgIHsKLQotICAgICAgICB1bnNpZ25lZCBpbnQgbHBbNF07Ci0gICAgICAgIGxwWzBdID0gKHRvcF9sZWZ0ICsgMiAqIExlZnRbMF0gKyBMZWZ0WzFdICsgMikgPj4gMjsKLSAgICAgICAgbHBbMV0gPSAoTGVmdFswXSArIDIgKiBMZWZ0WzFdICsgTGVmdFsyXSArIDIpID4+IDI7Ci0gICAgICAgIGxwWzJdID0gKExlZnRbMV0gKyAyICogTGVmdFsyXSArIExlZnRbM10gKyAyKSA+PiAyOwotICAgICAgICBscFszXSA9IChMZWZ0WzJdICsgMiAqIExlZnRbM10gKyBMZWZ0WzNdICsgMikgPj4gMjsKLQotICAgICAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZWRpY3RvcltjXSA9IGxwW3JdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcmVkaWN0b3IgKz0gMTY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX0xEX1BSRUQ6Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHIgPSBBYm92ZTsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDBdID0gKHB0clswXSArIHB0clsxXSAqIDIgKyBwdHJbMl0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMV0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDBdID0gKHB0clsxXSArIHB0clsyXSAqIDIgKyBwdHJbM10gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMl0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDFdID0KLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMF0gPSAocHRyWzJdICsgcHRyWzNdICogMiArIHB0cls0XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMl0gPQotICAgICAgICAgICAgICAgIHByZWRpY3RvclsyICogMTYgKyAxXSA9Ci0gICAgICAgICAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAwXSA9IChwdHJbM10gKyBwdHJbNF0gKiAyICsgcHRyWzVdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsyICogMTYgKyAyXSA9Ci0gICAgICAgICAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDFdID0gKHB0cls0XSArIHB0cls1XSAqIDIgKyBwdHJbNl0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDJdID0gKHB0cls1XSArIHB0cls2XSAqIDIgKyBwdHJbN10gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgM10gPSAocHRyWzZdICsgcHRyWzddICogMiArIHB0cls3XSArIDIpID4+IDI7Ci0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBCX1JEX1BSRUQ6Ci0gICAgewotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgcHBbOV07Ci0KLSAgICAgICAgcHBbMF0gPSBMZWZ0WzNdOwotICAgICAgICBwcFsxXSA9IExlZnRbMl07Ci0gICAgICAgIHBwWzJdID0gTGVmdFsxXTsKLSAgICAgICAgcHBbM10gPSBMZWZ0WzBdOwotICAgICAgICBwcFs0XSA9IHRvcF9sZWZ0OwotICAgICAgICBwcFs1XSA9IEFib3ZlWzBdOwotICAgICAgICBwcFs2XSA9IEFib3ZlWzFdOwotICAgICAgICBwcFs3XSA9IEFib3ZlWzJdOwotICAgICAgICBwcFs4XSA9IEFib3ZlWzNdOwotCi0gICAgICAgIHByZWRpY3RvclszICogMTYgKyAwXSA9IChwcFswXSArIHBwWzFdICogMiArIHBwWzJdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsyICogMTYgKyAwXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDJdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsyICogMTYgKyAxXSA9Ci0gICAgICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDBdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbNF0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDJdID0KLSAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMV0gPQotICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMF0gPSAocHBbM10gKyBwcFs0XSAqIDIgKyBwcFs1XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMl0gPQotICAgICAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAxXSA9IChwcFs0XSArIHBwWzVdICogMiArIHBwWzZdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAyXSA9IChwcFs1XSArIHBwWzZdICogMiArIHBwWzddICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDNdID0gKHBwWzZdICsgcHBbN10gKiAyICsgcHBbOF0gKyAyKSA+PiAyOwotCi0gICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgQl9WUl9QUkVEOgotICAgIHsKLQotICAgICAgICB1bnNpZ25lZCBjaGFyIHBwWzldOwotCi0gICAgICAgIHBwWzBdID0gTGVmdFszXTsKLSAgICAgICAgcHBbMV0gPSBMZWZ0WzJdOwotICAgICAgICBwcFsyXSA9IExlZnRbMV07Ci0gICAgICAgIHBwWzNdID0gTGVmdFswXTsKLSAgICAgICAgcHBbNF0gPSB0b3BfbGVmdDsKLSAgICAgICAgcHBbNV0gPSBBYm92ZVswXTsKLSAgICAgICAgcHBbNl0gPSBBYm92ZVsxXTsKLSAgICAgICAgcHBbN10gPSBBYm92ZVsyXTsKLSAgICAgICAgcHBbOF0gPSBBYm92ZVszXTsKLQotCi0gICAgICAgIHByZWRpY3RvclszICogMTYgKyAwXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDBdID0gKHBwWzJdICsgcHBbM10gKiAyICsgcHBbNF0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMV0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDBdID0gKHBwWzNdICsgcHBbNF0gKiAyICsgcHBbNV0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMV0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDBdID0gKHBwWzRdICsgcHBbNV0gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMl0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDFdID0gKHBwWzRdICsgcHBbNV0gKiAyICsgcHBbNl0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMl0gPQotICAgICAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDFdID0gKHBwWzVdICsgcHBbNl0gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDJdID0gKHBwWzVdICsgcHBbNl0gKiAyICsgcHBbN10gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgM10gPQotICAgICAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDJdID0gKHBwWzZdICsgcHBbN10gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgM10gPSAocHBbNl0gKyBwcFs3XSAqIDIgKyBwcFs4XSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAzXSA9IChwcFs3XSArIHBwWzhdICsgMSkgPj4gMTsKLQotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEJfVkxfUFJFRDoKLSAgICB7Ci0KLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHAgPSBBYm92ZTsKLQotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMF0gPSAocHBbMF0gKyBwcFsxXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAwXSA9IChwcFswXSArIHBwWzFdICogMiArIHBwWzJdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDBdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAxXSA9IChwcFsxXSArIHBwWzJdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAwXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAyXSA9IChwcFsyXSArIHBwWzNdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzMgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAyXSA9IChwcFsyXSArIHBwWzNdICogMiArIHBwWzRdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsyICogMTYgKyAyXSA9IChwcFszXSArIHBwWzRdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAyXSA9IChwcFszXSArIHBwWzRdICogMiArIHBwWzVdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDNdID0gKHBwWzRdICsgcHBbNV0gKiAyICsgcHBbNl0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgM10gPSAocHBbNV0gKyBwcFs2XSAqIDIgKyBwcFs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBCX0hEX1BSRUQ6Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyIHBwWzldOwotICAgICAgICBwcFswXSA9IExlZnRbM107Ci0gICAgICAgIHBwWzFdID0gTGVmdFsyXTsKLSAgICAgICAgcHBbMl0gPSBMZWZ0WzFdOwotICAgICAgICBwcFszXSA9IExlZnRbMF07Ci0gICAgICAgIHBwWzRdID0gdG9wX2xlZnQ7Ci0gICAgICAgIHBwWzVdID0gQWJvdmVbMF07Ci0gICAgICAgIHBwWzZdID0gQWJvdmVbMV07Ci0gICAgICAgIHBwWzddID0gQWJvdmVbMl07Ci0gICAgICAgIHBwWzhdID0gQWJvdmVbM107Ci0KLQotICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMF0gPSAocHBbMF0gKyBwcFsxXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclszICogMTYgKyAxXSA9IChwcFswXSArIHBwWzFdICogMiArIHBwWzJdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDBdID0KLSAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAyXSA9IChwcFsxXSArIHBwWzJdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDFdID0KLSAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAzXSA9IChwcFsxXSArIHBwWzJdICogMiArIHBwWzNdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDJdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAwXSA9IChwcFsyXSArIHBwWzNdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzIgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclsxICogMTYgKyAxXSA9IChwcFsyXSArIHBwWzNdICogMiArIHBwWzRdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDJdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAwXSA9IChwcFszXSArIHBwWzRdICsgMSkgPj4gMTsKLSAgICAgICAgcHJlZGljdG9yWzEgKiAxNiArIDNdID0KLSAgICAgICAgICAgIHByZWRpY3RvclswICogMTYgKyAxXSA9IChwcFszXSArIHBwWzRdICogMiArIHBwWzVdICsgMikgPj4gMjsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDJdID0gKHBwWzRdICsgcHBbNV0gKiAyICsgcHBbNl0gKyAyKSA+PiAyOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgM10gPSAocHBbNV0gKyBwcFs2XSAqIDIgKyBwcFs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIEJfSFVfUFJFRDoKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwID0gTGVmdDsKLSAgICAgICAgcHJlZGljdG9yWzAgKiAxNiArIDBdID0gKHBwWzBdICsgcHBbMV0gKyAxKSA+PiAxOwotICAgICAgICBwcmVkaWN0b3JbMCAqIDE2ICsgMV0gPSAocHBbMF0gKyBwcFsxXSAqIDIgKyBwcFsyXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAyXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMF0gPSAocHBbMV0gKyBwcFsyXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclswICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMSAqIDE2ICsgMV0gPSAocHBbMV0gKyBwcFsyXSAqIDIgKyBwcFszXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAyXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMF0gPSAocHBbMl0gKyBwcFszXSArIDEpID4+IDE7Ci0gICAgICAgIHByZWRpY3RvclsxICogMTYgKyAzXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgMV0gPSAocHBbMl0gKyBwcFszXSAqIDIgKyBwcFszXSArIDIpID4+IDI7Ci0gICAgICAgIHByZWRpY3RvclsyICogMTYgKyAyXSA9Ci0gICAgICAgICAgICBwcmVkaWN0b3JbMiAqIDE2ICsgM10gPQotICAgICAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JbMyAqIDE2ICsgMl0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvclszICogMTYgKyAzXSA9IHBwWzNdOwotICAgIH0KLSAgICBicmVhazsKLQotCi0gICAgfQotfQotCi0vKiBjb3B5IDQgYnl0ZXMgZnJvbSB0aGUgYWJvdmUgcmlnaHQgZG93biBzbyB0aGF0IHRoZSA0eDQgcHJlZGljdGlvbiBtb2RlcyB1c2luZyBwaXhlbHMgYWJvdmUgYW5kCi0gKiB0byB0aGUgcmlnaHQgcHJlZGljdGlvbiBoYXZlIGZpbGxlZCBpbiBwaXhlbHMgdG8gdXNlLgotICovCi12b2lkIHZwOG10X2ludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KFZQOERfQ09NUCAqcGJpLCBNQUNST0JMT0NLRCAqeCwgaW50IG1iX3JvdywgaW50IG1iX2NvbCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICphYm92ZV9yaWdodDsgICAvKiA9ICooeC0+YmxvY2tbMF0uYmFzZV9kc3QpICsgeC0+YmxvY2tbMF0uZHN0IC0geC0+YmxvY2tbMF0uZHN0X3N0cmlkZSArIDE2OyAqLwotICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIwOwotICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjE7Ci0gICAgdW5zaWduZWQgaW50ICpkc3RfcHRyMjsKLQotICAgIGlmIChwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCi0gICAgICAgIGFib3ZlX3JpZ2h0ID0gcGJpLT5tdF95YWJvdmVfcm93W21iX3Jvd10gKyBtYl9jb2wqMTYgKyAzMiArMTY7Ci0gICAgZWxzZQotICAgICAgICBhYm92ZV9yaWdodCA9ICooeC0+YmxvY2tbMF0uYmFzZV9kc3QpICsgeC0+YmxvY2tbMF0uZHN0IC0geC0+YmxvY2tbMF0uZHN0X3N0cmlkZSArIDE2OwotCi0gICAgc3JjX3B0ciA9ICh1bnNpZ25lZCBpbnQgKilhYm92ZV9yaWdodDsKLSAgICAvKmRzdF9wdHIwID0gKHVuc2lnbmVkIGludCAqKShhYm92ZV9yaWdodCArIDQgKiB4LT5ibG9ja1swXS5kc3Rfc3RyaWRlKTsKLSAgICBkc3RfcHRyMSA9ICh1bnNpZ25lZCBpbnQgKikoYWJvdmVfcmlnaHQgKyA4ICogeC0+YmxvY2tbMF0uZHN0X3N0cmlkZSk7Ci0gICAgZHN0X3B0cjIgPSAodW5zaWduZWQgaW50ICopKGFib3ZlX3JpZ2h0ICsgMTIgKiB4LT5ibG9ja1swXS5kc3Rfc3RyaWRlKTsqLwotICAgIGRzdF9wdHIwID0gKHVuc2lnbmVkIGludCAqKSgqKHgtPmJsb2NrWzBdLmJhc2VfZHN0KSArIHgtPmJsb2NrWzBdLmRzdCArIDE2ICsgMyAqIHgtPmJsb2NrWzBdLmRzdF9zdHJpZGUpOwotICAgIGRzdF9wdHIxID0gKHVuc2lnbmVkIGludCAqKSgqKHgtPmJsb2NrWzBdLmJhc2VfZHN0KSArIHgtPmJsb2NrWzBdLmRzdCArIDE2ICsgNyAqIHgtPmJsb2NrWzBdLmRzdF9zdHJpZGUpOwotICAgIGRzdF9wdHIyID0gKHVuc2lnbmVkIGludCAqKSgqKHgtPmJsb2NrWzBdLmJhc2VfZHN0KSArIHgtPmJsb2NrWzBdLmRzdCArIDE2ICsgMTEgKiB4LT5ibG9ja1swXS5kc3Rfc3RyaWRlKTsKLSAgICAqZHN0X3B0cjAgPSAqc3JjX3B0cjsKLSAgICAqZHN0X3B0cjEgPSAqc3JjX3B0cjsKLSAgICAqZHN0X3B0cjIgPSAqc3JjX3B0cjsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL3JlY29uaW50cmFfbXQuaCBiL3ZwOC9kZWNvZGVyL3JlY29uaW50cmFfbXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMTI5NS4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci9yZWNvbmludHJhX210LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19SRUNPTklOVFJBX01UX0gKLSNkZWZpbmUgX19JTkNfUkVDT05JTlRSQV9NVF9ICi0KLS8qIHJlY29uaW50cmEgZnVuY3Rpb25zIHVzZWQgaW4gbXVsdGktdGhyZWFkZWQgZGVjb2RlciAqLwotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotZXh0ZXJuIHZvaWQgdnA4bXRfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4LCBpbnQgbWJfcm93LCBpbnQgbWJfY29sKTsKLWV4dGVybiB2b2lkIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4LCBpbnQgbWJfcm93LCBpbnQgbWJfY29sKTsKLWV4dGVybiB2b2lkIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dihWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKngsIGludCBtYl9yb3csIGludCBtYl9jb2wpOwotZXh0ZXJuIHZvaWQgdnA4bXRfYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnV2X3MoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4LCBpbnQgbWJfcm93LCBpbnQgbWJfY29sKTsKLQotZXh0ZXJuIHZvaWQgdnA4bXRfcHJlZGljdF9pbnRyYTR4NChWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKngsIGludCBiX21vZGUsIHVuc2lnbmVkIGNoYXIgKnByZWRpY3RvciwgaW50IG1iX3JvdywgaW50IG1iX2NvbCwgaW50IG51bSk7Ci1leHRlcm4gdm9pZCB2cDhtdF9pbnRyYV9wcmVkaWN0aW9uX2Rvd25fY29weShWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKngsIGludCBtYl9yb3csIGludCBtYl9jb2wpOwotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIvdGhyZWFkaW5nLmMgYi92cDgvZGVjb2Rlci90aHJlYWRpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5ZDQyOC4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci90aHJlYWRpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmICFkZWZpbmVkKFdJTjMyKSAmJiBDT05GSUdfT1NfU1VQUE9SVCA9PSAxCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSAib255eGRfaW50LmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKLQotI2luY2x1ZGUgInZwOC9jb21tb24vbG9vcGZpbHRlci5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL3ZweF90aW1lci5oIgotI2luY2x1ZGUgImRldG9rZW5pemUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50ZXIuaCIKLSNpbmNsdWRlICJyZWNvbmludHJhX210LmgiCi0KLWV4dGVybiB2b2lkIG1iX2luaXRfZGVxdWFudGl6ZXIoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4ZCk7Ci1leHRlcm4gdm9pZCBjbGFtcF9tdnMoTUFDUk9CTE9DS0QgKnhkKTsKLWV4dGVybiB2b2lkIHZwOF9idWlsZF91dm12cyhNQUNST0JMT0NLRCAqeCwgaW50IGZ1bGxwaXhlbCk7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIFJUQ0RfVlRBQkxFKHgpICgmKHBiaSktPmNvbW1vbi5ydGNkLngpCi0jZWxzZQotI2RlZmluZSBSVENEX1ZUQUJMRSh4KSBOVUxMCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2V0dXBfZGVjb2RpbmdfdGhyZWFkX2RhdGEoVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4ZCwgTUJfUk9XX0RFQyAqbWJyZCwgaW50IGNvdW50KQotewotICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBwYmktPmNvbW1vbjsKLSAgICBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgTUFDUk9CTE9DS0QgKm1iZCA9ICZtYnJkW2ldLm1iZDsKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgIG1iZC0+cnRjZCA9IHhkLT5ydGNkOwotI2VuZGlmCi0gICAgICAgIG1iZC0+c3VicGl4ZWxfcHJlZGljdCAgICAgICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDsKLSAgICAgICAgbWJkLT5zdWJwaXhlbF9wcmVkaWN0OHg0ICAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg0OwotICAgICAgICBtYmQtPnN1YnBpeGVsX3ByZWRpY3Q4eDggICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDg7Ci0gICAgICAgIG1iZC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2ICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2OwotCi0gICAgICAgIG1iZC0+bW9kZV9pbmZvX2NvbnRleHQgPSBwYy0+bWkgICArIHBjLT5tb2RlX2luZm9fc3RyaWRlICogKGkgKyAxKTsKLSAgICAgICAgbWJkLT5tb2RlX2luZm9fc3RyaWRlICA9IHBjLT5tb2RlX2luZm9fc3RyaWRlOwotCi0gICAgICAgIG1iZC0+ZnJhbWVfdHlwZSA9IHBjLT5mcmFtZV90eXBlOwotICAgICAgICBtYmQtPmZyYW1lc19zaW5jZV9nb2xkZW4gICAgICA9IHBjLT5mcmFtZXNfc2luY2VfZ29sZGVuOwotICAgICAgICBtYmQtPmZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWUgID0gcGMtPmZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWU7Ci0KLSAgICAgICAgbWJkLT5wcmUgPSBwYy0+eXYxMl9mYltwYy0+bHN0X2ZiX2lkeF07Ci0gICAgICAgIG1iZC0+ZHN0ID0gcGMtPnl2MTJfZmJbcGMtPm5ld19mYl9pZHhdOwotCi0gICAgICAgIHZwOF9zZXR1cF9ibG9ja19kcHRycyhtYmQpOwotICAgICAgICB2cDhfYnVpbGRfYmxvY2tfZG9mZnNldHMobWJkKTsKLSAgICAgICAgbWJkLT5zZWdtZW50YXRpb25fZW5hYmxlZCAgICA9IHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZDsKLSAgICAgICAgbWJkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgICAgID0geGQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YTsKLSAgICAgICAgdnB4X21lbWNweShtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhLCB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEsIHNpemVvZih4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEpKTsKLQotICAgICAgICAvKnNpZ25lZCBjaGFyIHJlZl9sZl9kZWx0YXNbTUFYX1JFRl9MRl9ERUxUQVNdOyovCi0gICAgICAgIHZweF9tZW1jcHkobWJkLT5yZWZfbGZfZGVsdGFzLCB4ZC0+cmVmX2xmX2RlbHRhcywgc2l6ZW9mKHhkLT5yZWZfbGZfZGVsdGFzKSk7Ci0gICAgICAgIC8qc2lnbmVkIGNoYXIgbW9kZV9sZl9kZWx0YXNbTUFYX01PREVfTEZfREVMVEFTXTsqLwotICAgICAgICB2cHhfbWVtY3B5KG1iZC0+bW9kZV9sZl9kZWx0YXMsIHhkLT5tb2RlX2xmX2RlbHRhcywgc2l6ZW9mKHhkLT5tb2RlX2xmX2RlbHRhcykpOwotICAgICAgICAvKnVuc2lnbmVkIGNoYXIgbW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZDsKLSAgICAgICAgdW5zaWduZWQgY2hhciBtb2RlX3JlZl9sZl9kZWx0YV91cGRhdGU7Ki8KLSAgICAgICAgbWJkLT5tb2RlX3JlZl9sZl9kZWx0YV9lbmFibGVkICAgID0geGQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQ7Ci0gICAgICAgIG1iZC0+bW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlICAgID0geGQtPm1vZGVfcmVmX2xmX2RlbHRhX3VwZGF0ZTsKLQotICAgICAgICBtYmQtPmN1cnJlbnRfYmMgPSAmcGJpLT5iYzI7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1iZC0+YmxvY2tbal0uZGVxdWFudCA9IHhkLT5ibG9ja1tqXS5kZXF1YW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8IHBjLT5tYl9yb3dzOyBpKyspCi0gICAgICAgIHBiaS0+bXRfY3VycmVudF9tYl9jb2xbaV09LTE7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVjb2RlX21hY3JvYmxvY2soVlA4RF9DT01QICpwYmksIE1BQ1JPQkxPQ0tEICp4ZCwgaW50IG1iX3JvdywgaW50IG1iX2NvbCkKLXsKLSAgICBpbnQgZW9idG90YWwgPSAwOwotICAgIGludCBpLCBkb19jbGFtcCA9IHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5uZWVkX3RvX2NsYW1wX212czsKLSAgICBWUDhfQ09NTU9OICpwYyA9ICZwYmktPmNvbW1vbjsKLQotICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZikKLSAgICB7Ci0gICAgICAgIHZwOF9yZXNldF9tYl90b2tlbnNfY29udGV4dCh4ZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVvYnRvdGFsID0gdnA4X2RlY29kZV9tYl90b2tlbnMocGJpLCB4ZCk7Ci0gICAgfQotCi0gICAgLyogUGVyZm9ybSB0ZW1wb3JhcnkgY2xhbXBpbmcgb2YgdGhlIE1WIHRvIGJlIHVzZWQgZm9yIHByZWRpY3Rpb24gKi8KLSAgICBpZiAoZG9fY2xhbXApCi0gICAgewotICAgICAgICBjbGFtcF9tdnMoeGQpOwotICAgIH0KLQotICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID0gMTsKLQotICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNViAmJiBlb2J0b3RhbCA9PSAwKQotICAgIHsKLSAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmRjX2RpZmYgPSAwOwotCi0gICAgICAgIC8qbXRfc2tpcF9yZWNvbl9tYihwYmksIHhkLCBtYl9yb3csIG1iX2NvbCk7Ki8KLSAgICAgICAgaWYgKHhkLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAgfHwgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1dl9zKHBiaSwgeGQsIG1iX3JvdywgbWJfY29sKTsKLSAgICAgICAgICAgIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5X3MocGJpLCB4ZCwgbWJfcm93LCBtYl9jb2wpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWJfcyh4ZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQpCi0gICAgICAgIG1iX2luaXRfZGVxdWFudGl6ZXIocGJpLCB4ZCk7Ci0KLSAgICAvKiBkbyBwcmVkaWN0aW9uICovCi0gICAgaWYgKHhkLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAgfHwgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCi0gICAgewotICAgICAgICB2cDhtdF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXYocGJpLCB4ZCwgbWJfcm93LCBtYl9jb2wpOwotCi0gICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOG10X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ5KHBiaSwgeGQsIG1iX3JvdywgbWJfY29sKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZwOG10X2ludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KHBiaSwgeGQsIG1iX3JvdywgbWJfY29sKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19tYih4ZCk7Ci0gICAgfQotCi0gICAgLyogZGVxdWFudGl6YXRpb24gYW5kIGlkY3QgKi8KLSAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVEICYmIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgewotICAgICAgICBCTE9DS0QgKmIgPSAmeGQtPmJsb2NrWzI0XTsKLSAgICAgICAgREVRVUFOVF9JTlZPS0UoJnBiaS0+ZGVxdWFudCwgYmxvY2spKGIpOwotCi0gICAgICAgIC8qIGRvIDJuZCBvcmRlciB0cmFuc2Zvcm0gb24gdGhlIGRjIGJsb2NrICovCi0gICAgICAgIGlmICh4ZC0+ZW9ic1syNF0gPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRENUX0lOVk9LRShSVENEX1ZUQUJMRShpZGN0KSwgaXdhbHNoMTYpKCZiLT5kcWNvZWZmWzBdLCBiLT5kaWZmKTsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVswXSA9IDA7Ci0gICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMV0gPSAwOwotICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzJdID0gMDsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVszXSA9IDA7Ci0gICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbNF0gPSAwOwotICAgICAgICAgICAgKChpbnQgKiliLT5xY29lZmYpWzVdID0gMDsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVs2XSA9IDA7Ci0gICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbN10gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgSURDVF9JTlZPS0UoUlRDRF9WVEFCTEUoaWRjdCksIGl3YWxzaDEpKCZiLT5kcWNvZWZmWzBdLCBiLT5kaWZmKTsKLSAgICAgICAgICAgICgoaW50ICopYi0+cWNvZWZmKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBERVFVQU5UX0lOVk9LRSAoJnBiaS0+ZGVxdWFudCwgZGNfaWRjdF9hZGRfeV9ibG9jaykKLSAgICAgICAgICAgICAgICAgICAgICAgICh4ZC0+cWNvZWZmLCB4ZC0+YmxvY2tbMF0uZGVxdWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlZGljdG9yLCB4ZC0+ZHN0LnlfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9zdHJpZGUsIHhkLT5lb2JzLCB4ZC0+YmxvY2tbMjRdLmRpZmYpOwotICAgIH0KLSAgICBlbHNlIGlmICgoeGQtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICB8fCAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBJTlRSQV9GUkFNRSkgJiYgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gQl9QUkVEKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJMT0NLRCAqYiA9ICZ4ZC0+YmxvY2tbaV07Ci0gICAgICAgICAgICB2cDhtdF9wcmVkaWN0X2ludHJhNHg0KHBiaSwgeGQsIGItPmJtaS5tb2RlLCBiLT5wcmVkaWN0b3IsIG1iX3JvdywgbWJfY29sLCBpKTsKLQotICAgICAgICAgICAgaWYgKHhkLT5lb2JzW2ldID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERVFVQU5UX0lOVk9LRSgmcGJpLT5kZXF1YW50LCBpZGN0X2FkZCkKLSAgICAgICAgICAgICAgICAgICAgKGItPnFjb2VmZiwgYi0+ZGVxdWFudCwgIGItPnByZWRpY3RvciwKLSAgICAgICAgICAgICAgICAgICAgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIDE2LCBiLT5kc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJRENUX0lOVk9LRShSVENEX1ZUQUJMRShpZGN0KSwgaWRjdDFfc2NhbGFyX2FkZCkKLSAgICAgICAgICAgICAgICAgICAgKGItPnFjb2VmZlswXSAqIGItPmRlcXVhbnRbMF0sIGItPnByZWRpY3RvciwKLSAgICAgICAgICAgICAgICAgICAgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIDE2LCBiLT5kc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAoKGludCAqKWItPnFjb2VmZilbMF0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERFUVVBTlRfSU5WT0tFICgmcGJpLT5kZXF1YW50LCBpZGN0X2FkZF95X2Jsb2NrKQotICAgICAgICAgICAgICAgICAgICAgICAgKHhkLT5xY29lZmYsIHhkLT5ibG9ja1swXS5kZXF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmVkaWN0b3IsIHhkLT5kc3QueV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X3N0cmlkZSwgeGQtPmVvYnMpOwotICAgIH0KLQotICAgIERFUVVBTlRfSU5WT0tFICgmcGJpLT5kZXF1YW50LCBpZGN0X2FkZF91dl9ibG9jaykKLSAgICAgICAgICAgICAgICAgICAgKHhkLT5xY29lZmYrMTYqMTYsIHhkLT5ibG9ja1sxNl0uZGVxdWFudCwKLSAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmVkaWN0b3IrMTYqMTYsIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICB4ZC0+ZHN0LnV2X3N0cmlkZSwgeGQtPmVvYnMrMTYpOwotfQotCi0KLXN0YXRpYyBUSFJFQURfRlVOQ1RJT04gdGhyZWFkX2RlY29kaW5nX3Byb2Modm9pZCAqcF9kYXRhKQotewotICAgIGludCBpdGhyZWFkID0gKChERUNPREVUSFJFQURfREFUQSAqKXBfZGF0YSktPml0aHJlYWQ7Ci0gICAgVlA4RF9DT01QICpwYmkgPSAoVlA4RF9DT01QICopKCgoREVDT0RFVEhSRUFEX0RBVEEgKilwX2RhdGEpLT5wdHIxKTsKLSAgICBNQl9ST1dfREVDICptYnJkID0gKE1CX1JPV19ERUMgKikoKChERUNPREVUSFJFQURfREFUQSAqKXBfZGF0YSktPnB0cjIpOwotICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgbWJfcm93X2xlZnRfY29udGV4dDsKLQotICAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKmlmKFdhaXRGb3JTaW5nbGVPYmplY3QocGJpLT5oX2V2ZW50X3N0YXJ0X2RlY29kaW5nW2l0aHJlYWRdLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCkqLwotICAgICAgICBpZiAoc2VtX3dhaXQoJnBiaS0+aF9ldmVudF9zdGFydF9kZWNvZGluZ1tpdGhyZWFkXSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkID09IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVlA4X0NPTU1PTiAqcGMgPSAmcGJpLT5jb21tb247Ci0gICAgICAgICAgICAgICAgTUFDUk9CTE9DS0QgKnhkID0gJm1icmQtPm1iZDsKLQotICAgICAgICAgICAgICAgIGludCBtYl9yb3c7Ci0gICAgICAgICAgICAgICAgaW50IG51bV9wYXJ0ID0gMSA8PCBwYmktPmNvbW1vbi5tdWx0aV90b2tlbl9wYXJ0aXRpb247Ci0gICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50ICpsYXN0X3Jvd19jdXJyZW50X21iX2NvbDsKLSAgICAgICAgICAgICAgICBpbnQgbnN5bmMgPSBwYmktPnN5bmNfcmFuZ2U7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKG1iX3JvdyA9IGl0aHJlYWQrMTsgbWJfcm93IDwgcGMtPm1iX3Jvd3M7IG1iX3JvdyArPSAocGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQgKyAxKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtYl9jb2w7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWZfZmJfaWR4ID0gcGMtPmxzdF9mYl9pZHg7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkc3RfZmJfaWR4ID0gcGMtPm5ld19mYl9pZHg7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWNvbl95X3N0cmlkZSA9IHBjLT55djEyX2ZiW3JlZl9mYl9pZHhdLnlfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb25fdXZfc3RyaWRlID0gcGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0udXZfc3RyaWRlOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJfbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSA9IHBjLT5sZl9pbmZvOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWx0X2ZsdF9lbmFibGVkID0geGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkOwotICAgICAgICAgICAgICAgICAgICBpbnQgU2VnbWVudDsKLQotICAgICAgICAgICAgICAgICAgICBwYmktPm1iX3Jvd19kaVtpdGhyZWFkXS5tYl9yb3cgPSBtYl9yb3c7Ci0gICAgICAgICAgICAgICAgICAgIHBiaS0+bWJfcm93X2RpW2l0aHJlYWRdLm1iZC5jdXJyZW50X2JjID0gICZwYmktPm1iY1ttYl9yb3clbnVtX3BhcnRdOwotCi0gICAgICAgICAgICAgICAgICAgIGxhc3Rfcm93X2N1cnJlbnRfbWJfY29sID0gJnBiaS0+bXRfY3VycmVudF9tYl9jb2xbbWJfcm93IC0xXTsKLQotICAgICAgICAgICAgICAgICAgICByZWNvbl95b2Zmc2V0ID0gbWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNjsKLSAgICAgICAgICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQgPSBtYl9yb3cgKiByZWNvbl91dl9zdHJpZGUgKiA4OwotICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBhYm92ZSBibG9jayBjb2VmZnMgKi8KLQotICAgICAgICAgICAgICAgICAgICB4ZC0+YWJvdmVfY29udGV4dCA9IHBjLT5hYm92ZV9jb250ZXh0OwotICAgICAgICAgICAgICAgICAgICB4ZC0+bGVmdF9jb250ZXh0ID0gJm1iX3Jvd19sZWZ0X2NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgIHZweF9tZW1zZXQoJm1iX3Jvd19sZWZ0X2NvbnRleHQsIDAsIHNpemVvZihtYl9yb3dfbGVmdF9jb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHhkLT51cF9hdmFpbGFibGUgPSAobWJfcm93ICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgeGQtPm1iX3RvX2JvdHRvbV9lZGdlID0gKChwYy0+bWJfcm93cyAtIDEgLSBtYl9yb3cpICogMTYpIDw8IDM7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBwYy0+bWJfY29sczsgbWJfY29sKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWJfY29sICYgKG5zeW5jLTEpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtYl9jb2wgPiAoKmxhc3Rfcm93X2N1cnJlbnRfbWJfY29sIC0gbnN5bmMpICYmICpsYXN0X3Jvd19jdXJyZW50X21iX2NvbCAhPSBwYy0+bWJfY29scyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcGF1c2VfaGludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfc2xlZXAoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNViB8fCB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBCX1BSRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS0QgKmQgPSAmeGQtPmJsb2NrW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KCZkLT5ibWksICZ4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVtpXSwgc2l6ZW9mKEJfTU9ERV9JTkZPKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXN0YW5jZSBvZiBNYiB0byB0aGUgdmFyaW91cyBpbWFnZSBlZGdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZXNlIGFyZSBzcGVjaWZpZWQgdG8gOHRoIHBlbCBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fbGVmdF9lZGdlID0gLSgobWJfY29sICogMTYpIDw8IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPSAoKHBjLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciA9IHBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5kc3QudV9idWZmZXIgPSBwYy0+eXYxMl9mYltkc3RfZmJfaWR4XS51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC52X2J1ZmZlciA9IHBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5sZWZ0X2F2YWlsYWJsZSA9IChtYl9jb2wgIT0gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcmVmZXJlbmNlIGZyYW1lIGZvciB0aGlzIE1CICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9mYl9pZHggPSBwYy0+bHN0X2ZiX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gR09MREVOX0ZSQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9mYl9pZHggPSBwYy0+Z2xkX2ZiX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfZmJfaWR4ID0gcGMtPmFsdF9mYl9pZHg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlLnVfYnVmZmVyID0gcGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0udV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmUudl9idWZmZXIgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfYnVpbGRfdXZtdnMoeGQsIHBjLT5mdWxsX3BpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9tYWNyb2Jsb2NrKHBiaSwgeGQsIG1iX3JvdywgbWJfY29sKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBiaS0+Y29tbW9uLmZpbHRlcl9sZXZlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWJfcm93ICE9IHBjLT5tYl9yb3dzLTEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBkZWNvZGVkIE1CIGxhc3Qgcm93IGRhdGEgZm9yIG5leHQtcm93IGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoKHBiaS0+bXRfeWFib3ZlX3Jvd1ttYl9yb3cgKyAxXSArIDMyICsgbWJfY29sKjE2KSwgKHhkLT5kc3QueV9idWZmZXIgKyAxNSAqIHJlY29uX3lfc3RyaWRlKSwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KChwYmktPm10X3VhYm92ZV9yb3dbbWJfcm93ICsgMV0gKyAxNiArIG1iX2NvbCo4KSwgKHhkLT5kc3QudV9idWZmZXIgKyA3ICogcmVjb25fdXZfc3RyaWRlKSwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoKHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3cgKyAxXSArIDE2ICsgbWJfY29sKjgpLCAoeGQtPmRzdC52X2J1ZmZlciArIDcgKiByZWNvbl91dl9zdHJpZGUpLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGxlZnRfY29sIGZvciBuZXh0IE1CIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWJfY29sICE9IHBjLT5tYl9jb2xzLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lORk8gKm5leHQgPSB4ZC0+bW9kZV9pbmZvX2NvbnRleHQgKzE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAgfHwgIG5leHQtPm1ibWkucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3lsZWZ0X2NvbFttYl9yb3ddW2ldID0geGQtPmRzdC55X2J1ZmZlciBbaSogcmVjb25feV9zdHJpZGUgKyAxNV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdWxlZnRfY29sW21iX3Jvd11baV0gPSB4ZC0+ZHN0LnVfYnVmZmVyIFtpKiByZWNvbl91dl9zdHJpZGUgKyA3XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3ZsZWZ0X2NvbFttYl9yb3ddW2ldID0geGQtPmRzdC52X2J1ZmZlciBbaSogcmVjb25fdXZfc3RyaWRlICsgN107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgbG9vcGZpbHRlciBpbmZvICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCA9IChhbHRfZmx0X2VuYWJsZWQpID8geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9sZXZlbCA9IHBiaS0+bXRfYmFzZWxpbmVfZmlsdGVyX2xldmVsW1NlZ21lbnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc3RhbmNlIG9mIE1iIHRvIHRoZSB2YXJpb3VzIGltYWdlIGVkZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZXNlIGFyZSBzcGVjaWZpZWQgdG8gOHRoIHBlbCBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFwcGx5IGFueSBjb250ZXh0IGRyaXZlbiBNQiBsZXZlbCBhZGp1c3RtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2xldmVsID0gdnA4X2FkanVzdF9tYl9sZl92YWx1ZSh4ZCwgZmlsdGVyX2xldmVsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3BmaWx0ZXIgb24gdGhpcyBtYWNyb2Jsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfbGV2ZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5sZl9tYnYoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCBwYy0+c2ltcGxlcl9scGYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYy0+bGZfYnYoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCBwYy0+c2ltcGxlcl9scGYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGFwcGx5IGFjcm9zcyB1bXYgYm9yZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYl9yb3cgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPmxmX21iaCh4ZC0+ZHN0LnlfYnVmZmVyLCB4ZC0+ZHN0LnVfYnVmZmVyLCB4ZC0+ZHN0LnZfYnVmZmVyLCByZWNvbl95X3N0cmlkZSwgcmVjb25fdXZfc3RyaWRlLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIHBjLT5zaW1wbGVyX2xwZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5sZl9iaCh4ZC0+ZHN0LnlfYnVmZmVyLCB4ZC0+ZHN0LnVfYnVmZmVyLCB4ZC0+ZHN0LnZfYnVmZmVyLCByZWNvbl95X3N0cmlkZSwgcmVjb25fdXZfc3RyaWRlLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIHBjLT5zaW1wbGVyX2xwZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZWNvbl95b2Zmc2V0ICs9IDE2OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQgKz0gODsKLQotICAgICAgICAgICAgICAgICAgICAgICAgKyt4ZC0+bW9kZV9pbmZvX2NvbnRleHQ7ICAvKiBuZXh0IG1iICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5hYm92ZV9jb250ZXh0Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcGJpLT5tYl9yb3dfZGlbaXRocmVhZF0uY3VycmVudF9tYl9jb2wgPSBtYl9jb2w7Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfY3VycmVudF9tYl9jb2xbbWJfcm93XSA9IG1iX2NvbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0byB0aGUgbmV4dCByb3cgb2YgbWJzICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1iX3JvdyAhPSBwYy0+bWJfcm93cy0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0eSA9IHBjLT55djEyX2ZiW3JlZl9mYl9pZHhdLnlfd2lkdGggKyBWUDhCT1JERVJJTlBJWEVMUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdHV2ID0gKHBjLT55djEyX2ZiW3JlZl9mYl9pZHhdLnlfd2lkdGg+PjEpICsgKFZQOEJPUkRFUklOUElYRUxTPj4xKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3lhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0eSArIGldID0gcGJpLT5tdF95YWJvdmVfcm93W21iX3JvdyArMV1bbGFzdHkgLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3VhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0dXYgKyBpXSA9IHBiaS0+bXRfdWFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R1diAtMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R1diArIGldID0gcGJpLT5tdF92YWJvdmVfcm93W21iX3JvdyArMV1bbGFzdHV2IC0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2V4dGVuZF9tYl9yb3coJnBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLCB4ZC0+ZHN0LnlfYnVmZmVyICsgMTYsIHhkLT5kc3QudV9idWZmZXIgKyA4LCB4ZC0+ZHN0LnZfYnVmZmVyICsgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKyt4ZC0+bW9kZV9pbmZvX2NvbnRleHQ7ICAgICAgLyogc2tpcCBwcmVkaWN0aW9uIGNvbHVtbiAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNpbmNlIHdlIGhhdmUgbXVsdGl0aHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ICs9IHhkLT5tb2RlX2luZm9fc3RyaWRlICogcGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qICBhZGQgdGhpcyB0byBlYWNoIGZyYW1lICovCi0gICAgICAgIGlmICgobWJyZC0+bWJfcm93ID09IHBiaS0+Y29tbW9uLm1iX3Jvd3MtMSkgfHwgKChtYnJkLT5tYl9yb3cgPT0gcGJpLT5jb21tb24ubWJfcm93cy0yKSAmJiAocGJpLT5jb21tb24ubWJfcm93cyAlIChwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCsxKSk9PTEpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNldEV2ZW50KHBiaS0+aF9ldmVudF9lbmRfZGVjb2RpbmcpOyovCi0gICAgICAgICAgICBzZW1fcG9zdCgmcGJpLT5oX2V2ZW50X2VuZF9kZWNvZGluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMCA7Ci19Ci0KLQotdm9pZCB2cDhfZGVjb2Rlcl9jcmVhdGVfdGhyZWFkcyhWUDhEX0NPTVAgKnBiaSkKLXsKLSAgICBpbnQgY29yZV9jb3VudCA9IDA7Ci0gICAgaW50IGl0aHJlYWQ7Ci0KLSAgICBwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCA9IDA7Ci0gICAgcGJpLT5hbGxvY2F0ZWRfZGVjb2RpbmdfdGhyZWFkX2NvdW50ID0gMDsKLSAgICBjb3JlX2NvdW50ID0gKHBiaS0+bWF4X3RocmVhZHMgPiAxNikgPyAxNiA6IHBiaS0+bWF4X3RocmVhZHM7Ci0KLSAgICBpZiAoY29yZV9jb3VudCA+IDEpCi0gICAgewotICAgICAgICBwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCA9IDE7Ci0gICAgICAgIHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50ID0gY29yZV9jb3VudCAtMTsKLQotICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5oX2RlY29kaW5nX3RocmVhZCwgdnB4X21hbGxvYyhzaXplb2YocHRocmVhZF90KSAqIHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50KSk7Ci0gICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPmhfZXZlbnRfc3RhcnRfZGVjb2RpbmcsIHZweF9tYWxsb2Moc2l6ZW9mKHNlbV90KSAqIHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50KSk7Ci0gICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm1iX3Jvd19kaSwgdnB4X21lbWFsaWduKDMyLCBzaXplb2YoTUJfUk9XX0RFQykgKiBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCkpOwotICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bWJfcm93X2RpLCAwLCBzaXplb2YoTUJfUk9XX0RFQykgKiBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCk7Ci0gICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPmRlX3RocmVhZF9kYXRhLCB2cHhfbWFsbG9jKHNpemVvZihERUNPREVUSFJFQURfREFUQSkgKiBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudCkpOwotCi0gICAgICAgIGZvciAoaXRocmVhZCA9IDA7IGl0aHJlYWQgPCBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudDsgaXRocmVhZCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZW1faW5pdCgmcGJpLT5oX2V2ZW50X3N0YXJ0X2RlY29kaW5nW2l0aHJlYWRdLCAwLCAwKTsKLQotICAgICAgICAgICAgcGJpLT5kZV90aHJlYWRfZGF0YVtpdGhyZWFkXS5pdGhyZWFkICA9IGl0aHJlYWQ7Ci0gICAgICAgICAgICBwYmktPmRlX3RocmVhZF9kYXRhW2l0aHJlYWRdLnB0cjEgICAgID0gKHZvaWQgKilwYmk7Ci0gICAgICAgICAgICBwYmktPmRlX3RocmVhZF9kYXRhW2l0aHJlYWRdLnB0cjIgICAgID0gKHZvaWQgKikgJnBiaS0+bWJfcm93X2RpW2l0aHJlYWRdOwotCi0gICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcGJpLT5oX2RlY29kaW5nX3RocmVhZFtpdGhyZWFkXSwgMCwgdGhyZWFkX2RlY29kaW5nX3Byb2MsICgmcGJpLT5kZV90aHJlYWRfZGF0YVtpdGhyZWFkXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VtX2luaXQoJnBiaS0+aF9ldmVudF9lbmRfZGVjb2RpbmcsIDAsIDApOwotCi0gICAgICAgIHBiaS0+YWxsb2NhdGVkX2RlY29kaW5nX3RocmVhZF9jb3VudCA9IHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50OwotICAgIH0KLX0KLQotCi12b2lkIHZwOG10X2RlX2FsbG9jX3RlbXBfYnVmZmVycyhWUDhEX0NPTVAgKnBiaSwgaW50IG1iX3Jvd3MpCi17Ci0gICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOwotICAgIGludCBpOwotCi0gICAgaWYgKHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkKQotICAgIHsKLSAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bXRfY3VycmVudF9tYl9jb2wpOwotICAgICAgICAgICAgcGJpLT5tdF9jdXJyZW50X21iX2NvbCA9IE5VTEwgOwotCi0gICAgICAgIC8qIEZyZWUgYWJvdmVfcm93IGJ1ZmZlcnMuICovCi0gICAgICAgIGlmIChwYmktPm10X3lhYm92ZV9yb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPCBtYl9yb3dzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bXRfeWFib3ZlX3Jvd1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfeWFib3ZlX3Jvd1tpXSA9IE5VTEwgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5tdF95YWJvdmVfcm93KTsKLSAgICAgICAgICAgIHBiaS0+bXRfeWFib3ZlX3JvdyA9IE5VTEwgOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBiaS0+bXRfdWFib3ZlX3JvdykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpPTA7IGk8IG1iX3Jvd3M7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5tdF91YWJvdmVfcm93W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgcGJpLT5tdF91YWJvdmVfcm93W2ldID0gTlVMTCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3VhYm92ZV9yb3cpOwotICAgICAgICAgICAgcGJpLT5tdF91YWJvdmVfcm93ID0gTlVMTCA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGJpLT5tdF92YWJvdmVfcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3ZhYm92ZV9yb3dbaV0pOwotICAgICAgICAgICAgICAgICAgICBwYmktPm10X3ZhYm92ZV9yb3dbaV0gPSBOVUxMIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZweF9mcmVlKHBiaS0+bXRfdmFib3ZlX3Jvdyk7Ci0gICAgICAgICAgICBwYmktPm10X3ZhYm92ZV9yb3cgPSBOVUxMIDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZyZWUgbGVmdF9jb2wgYnVmZmVycy4gKi8KLSAgICAgICAgaWYgKHBiaS0+bXRfeWxlZnRfY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3lsZWZ0X2NvbFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfeWxlZnRfY29sW2ldID0gTlVMTCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3lsZWZ0X2NvbCk7Ci0gICAgICAgICAgICBwYmktPm10X3lsZWZ0X2NvbCA9IE5VTEwgOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBiaS0+bXRfdWxlZnRfY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3VsZWZ0X2NvbFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdWxlZnRfY29sW2ldID0gTlVMTCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3VsZWZ0X2NvbCk7Ci0gICAgICAgICAgICBwYmktPm10X3VsZWZ0X2NvbCA9IE5VTEwgOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBiaS0+bXRfdmxlZnRfY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTwgbWJfcm93czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3ZsZWZ0X2NvbFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfdmxlZnRfY29sW2ldID0gTlVMTCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2cHhfZnJlZShwYmktPm10X3ZsZWZ0X2NvbCk7Ci0gICAgICAgICAgICBwYmktPm10X3ZsZWZ0X2NvbCA9IE5VTEwgOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4bXRfYWxsb2NfdGVtcF9idWZmZXJzKFZQOERfQ09NUCAqcGJpLCBpbnQgd2lkdGgsIGludCBwcmV2X21iX3Jvd3MpCi17Ci0gICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIHBiaS0+Y29tbW9uOwotICAgIGludCBpOwotICAgIGludCB1dl93aWR0aDsKLQotICAgIGlmIChwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCkKLSAgICB7Ci0gICAgICAgIHZwOG10X2RlX2FsbG9jX3RlbXBfYnVmZmVycyhwYmksIHByZXZfbWJfcm93cyk7Ci0KLSAgICAgICAgLyogb3VyIGludGVybmFsIGJ1ZmZlcnMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgMTYgKi8KLSAgICAgICAgaWYgKCh3aWR0aCAmIDB4ZikgIT0gMCkKLSAgICAgICAgICAgIHdpZHRoICs9IDE2IC0gKHdpZHRoICYgMHhmKTsKLQotICAgICAgICBpZiAod2lkdGggPCA2NDApIHBiaS0+c3luY19yYW5nZSA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKHdpZHRoIDw9IDEyODApIHBiaS0+c3luY19yYW5nZSA9IDg7Ci0gICAgICAgIGVsc2UgaWYgKHdpZHRoIDw9IDI1NjApIHBiaS0+c3luY19yYW5nZSA9MTY7Ci0gICAgICAgIGVsc2UgcGJpLT5zeW5jX3JhbmdlID0gMzI7Ci0KLSAgICAgICAgdXZfd2lkdGggPSB3aWR0aCA+PjE7Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgYW4gaW50IGZvciBlYWNoIG1iIHJvdy4gKi8KLSAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKHBiaS0+bXRfY3VycmVudF9tYl9jb2wsIHZweF9tYWxsb2Moc2l6ZW9mKGludCkgKiBwYy0+bWJfcm93cykpOwotCi0gICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWJvdmVfcm93IGJ1ZmZlcnMuICovCi0gICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3lhYm92ZV9yb3csIHZweF9tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikgKiBwYy0+bWJfcm93cykpOwotICAgICAgICBmb3IgKGk9MDsgaTwgcGMtPm1iX3Jvd3M7IGkrKykKLSAgICAgICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3lhYm92ZV9yb3dbaV0sIHZweF9jYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogKHdpZHRoICsgKFZQOEJPUkRFUklOUElYRUxTPDwxKSksIDEpKTsKLQotICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5tdF91YWJvdmVfcm93LCB2cHhfbWFsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyICopICogcGMtPm1iX3Jvd3MpKTsKLSAgICAgICAgZm9yIChpPTA7IGk8IHBjLT5tYl9yb3dzOyBpKyspCi0gICAgICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5tdF91YWJvdmVfcm93W2ldLCB2cHhfY2FsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqICh1dl93aWR0aCArIFZQOEJPUkRFUklOUElYRUxTKSwgMSkpOwotCi0gICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3ZhYm92ZV9yb3csIHZweF9tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikgKiBwYy0+bWJfcm93cykpOwotICAgICAgICBmb3IgKGk9MDsgaTwgcGMtPm1iX3Jvd3M7IGkrKykKLSAgICAgICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3ZhYm92ZV9yb3dbaV0sIHZweF9jYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogKHV2X3dpZHRoICsgVlA4Qk9SREVSSU5QSVhFTFMpLCAxKSk7Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBsZWZ0X2NvbCBidWZmZXJzLiAqLwotICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5tdF95bGVmdF9jb2wsIHZweF9tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikgKiBwYy0+bWJfcm93cykpOwotICAgICAgICBmb3IgKGk9MDsgaTwgcGMtPm1iX3Jvd3M7IGkrKykKLSAgICAgICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3lsZWZ0X2NvbFtpXSwgdnB4X2NhbGxvYyhzaXplb2YodW5zaWduZWQgY2hhcikgKiAxNiwgMSkpOwotCi0gICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3VsZWZ0X2NvbCwgdnB4X21hbGxvYyhzaXplb2YodW5zaWduZWQgY2hhciAqKSAqIHBjLT5tYl9yb3dzKSk7Ci0gICAgICAgIGZvciAoaT0wOyBpPCBwYy0+bWJfcm93czsgaSsrKQotICAgICAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKHBiaS0+bXRfdWxlZnRfY29sW2ldLCB2cHhfY2FsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDgsIDEpKTsKLQotICAgICAgICBDSEVDS19NRU1fRVJST1IocGJpLT5tdF92bGVmdF9jb2wsIHZweF9tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikgKiBwYy0+bWJfcm93cykpOwotICAgICAgICBmb3IgKGk9MDsgaTwgcGMtPm1iX3Jvd3M7IGkrKykKLSAgICAgICAgICAgIENIRUNLX01FTV9FUlJPUihwYmktPm10X3ZsZWZ0X2NvbFtpXSwgdnB4X2NhbGxvYyhzaXplb2YodW5zaWduZWQgY2hhcikgKiA4LCAxKSk7Ci0gICAgfQotfQotCi0KLXZvaWQgdnA4X2RlY29kZXJfcmVtb3ZlX3RocmVhZHMoVlA4RF9DT01QICpwYmkpCi17Ci0gICAgLyogc2h1dGRvd24gTUIgRGVjb2RpbmcgdGhyZWFkOyAqLwotICAgIGlmIChwYmktPmJfbXVsdGl0aHJlYWRlZF9yZCkKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIHBiaS0+Yl9tdWx0aXRocmVhZGVkX3JkID0gMDsKLQotICAgICAgICAvKiBhbGxvdyBhbGwgdGhyZWFkcyB0byBleGl0ICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYmktPmFsbG9jYXRlZF9kZWNvZGluZ190aHJlYWRfY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2VtX3Bvc3QoJnBiaS0+aF9ldmVudF9zdGFydF9kZWNvZGluZ1tpXSk7Ci0gICAgICAgICAgICBwdGhyZWFkX2pvaW4ocGJpLT5oX2RlY29kaW5nX3RocmVhZFtpXSwgTlVMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGJpLT5hbGxvY2F0ZWRfZGVjb2RpbmdfdGhyZWFkX2NvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlbV9kZXN0cm95KCZwYmktPmhfZXZlbnRfc3RhcnRfZGVjb2RpbmdbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VtX2Rlc3Ryb3koJnBiaS0+aF9ldmVudF9lbmRfZGVjb2RpbmcpOwotCi0gICAgICAgICAgICB2cHhfZnJlZShwYmktPmhfZGVjb2RpbmdfdGhyZWFkKTsKLSAgICAgICAgICAgIHBiaS0+aF9kZWNvZGluZ190aHJlYWQgPSBOVUxMOwotCi0gICAgICAgICAgICB2cHhfZnJlZShwYmktPmhfZXZlbnRfc3RhcnRfZGVjb2RpbmcpOwotICAgICAgICAgICAgcGJpLT5oX2V2ZW50X3N0YXJ0X2RlY29kaW5nID0gTlVMTDsKLQotICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5tYl9yb3dfZGkpOwotICAgICAgICAgICAgcGJpLT5tYl9yb3dfZGkgPSBOVUxMIDsKLQotICAgICAgICAgICAgdnB4X2ZyZWUocGJpLT5kZV90aHJlYWRfZGF0YSk7Ci0gICAgICAgICAgICBwYmktPmRlX3RocmVhZF9kYXRhID0gTlVMTDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgbHBmX2luaXQoIFZQOERfQ09NUCAqcGJpLCBpbnQgZGVmYXVsdF9maWx0X2x2bCkKLXsKLSAgICBWUDhfQ09NTU9OICpjbSAgPSAmcGJpLT5jb21tb247Ci0gICAgTUFDUk9CTE9DS0QgKm1iZCA9ICZwYmktPm1iOwotICAgIC8qWVYxMl9CVUZGRVJfQ09ORklHICpwb3N0ID0gJmNtLT5uZXdfZnJhbWU7Ki8gIC8qZnJhbWVfdG9fc2hvdzsqLwotICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSA9IGNtLT5sZl9pbmZvOwotICAgIEZSQU1FX1RZUEUgZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOwotCi0gICAgLyppbnQgbWJfcm93OwotICAgIGludCBtYl9jb2w7Ci0gICAgaW50IGJhc2VsaW5lX2ZpbHRlcl9sZXZlbFtNQVhfTUJfU0VHTUVOVFNdOyovCi0gICAgaW50IGFsdF9mbHRfZW5hYmxlZCA9IG1iZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQ7Ci0KLSAgICBpbnQgaTsKLSAgICAvKnVuc2lnbmVkIGNoYXIgKnlfcHRyLCAqdV9wdHIsICp2X3B0cjsqLwotCi0gICAgLyogTm90ZSB0aGUgYmFzZWxpbmUgZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBzZWdtZW50ICovCi0gICAgaWYgKGFsdF9mbHRfZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUJfU0VHTUVOVFM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWJzIHZhbHVlICovCi0gICAgICAgICAgICBpZiAobWJkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgPT0gU0VHTUVOVF9BQlNEQVRBKQotICAgICAgICAgICAgICAgIHBiaS0+bXRfYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVtpXTsKLSAgICAgICAgICAgIC8qIERlbHRhIFZhbHVlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGJpLT5tdF9iYXNlbGluZV9maWx0ZXJfbGV2ZWxbaV0gPSBkZWZhdWx0X2ZpbHRfbHZsICsgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVtpXTsKLSAgICAgICAgICAgICAgICBwYmktPm10X2Jhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA9IChwYmktPm10X2Jhc2VsaW5lX2ZpbHRlcl9sZXZlbFtpXSA+PSAwKSA/ICgocGJpLT5tdF9iYXNlbGluZV9maWx0ZXJfbGV2ZWxbaV0gPD0gTUFYX0xPT1BfRklMVEVSKSA/IHBiaS0+bXRfYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldIDogTUFYX0xPT1BfRklMVEVSKSA6IDA7ICAvKiBDbGFtcCB0byB2YWxpZCByYW5nZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUJfU0VHTUVOVFM7IGkrKykKLSAgICAgICAgICAgIHBiaS0+bXRfYmFzZWxpbmVfZmlsdGVyX2xldmVsW2ldID0gZGVmYXVsdF9maWx0X2x2bDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBsb29wIGZpbHRlciBmb3IgdGhpcyBmcmFtZS4gKi8KLSAgICBpZiAoKGNtLT5sYXN0X2ZpbHRlcl90eXBlICE9IGNtLT5maWx0ZXJfdHlwZSkgfHwgKGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCAhPSBjbS0+c2hhcnBuZXNzX2xldmVsKSkKLSAgICAgICAgdnA4X2luaXRfbG9vcF9maWx0ZXIoY20pOwotICAgIGVsc2UgaWYgKGZyYW1lX3R5cGUgIT0gY20tPmxhc3RfZnJhbWVfdHlwZSkKLSAgICAgICAgdnA4X2ZyYW1lX2luaXRfbG9vcF9maWx0ZXIobGZpLCBmcmFtZV90eXBlKTsKLX0KLQotCi12b2lkIHZwOG10X2RlY29kZV9tYl9yb3dzKCBWUDhEX0NPTVAgKnBiaSwgTUFDUk9CTE9DS0QgKnhkKQotewotICAgIGludCBtYl9yb3c7Ci0gICAgVlA4X0NPTU1PTiAqcGMgPSAmcGJpLT5jb21tb247Ci0KLSAgICBpbnQgaWJjID0gMDsKLSAgICBpbnQgbnVtX3BhcnQgPSAxIDw8IHBiaS0+Y29tbW9uLm11bHRpX3Rva2VuX3BhcnRpdGlvbjsKLSAgICBpbnQgaTsKLSAgICB2b2xhdGlsZSBpbnQgKmxhc3Rfcm93X2N1cnJlbnRfbWJfY29sID0gTlVMTDsKLSAgICBpbnQgbnN5bmMgPSBwYmktPnN5bmNfcmFuZ2U7Ci0KLSAgICBpbnQgZmlsdGVyX2xldmVsOwotICAgIGxvb3BfZmlsdGVyX2luZm8gKmxmaSA9IHBjLT5sZl9pbmZvOwotICAgIGludCBhbHRfZmx0X2VuYWJsZWQgPSB4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQ7Ci0gICAgaW50IFNlZ21lbnQ7Ci0KLSAgICBpZihwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCi0gICAgewotICAgICAgICAvKiBTZXQgYWJvdmVfcm93IGJ1ZmZlciB0byAxMjcgZm9yIGRlY29kaW5nIGZpcnN0IE1CIHJvdyAqLwotICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfeWFib3ZlX3Jvd1swXSArIFZQOEJPUkRFUklOUElYRUxTLTEsIDEyNywgcGMtPnl2MTJfZmJbcGMtPmxzdF9mYl9pZHhdLnlfd2lkdGggKyA1KTsKLSAgICAgICAgdnB4X21lbXNldChwYmktPm10X3VhYm92ZV9yb3dbMF0gKyAoVlA4Qk9SREVSSU5QSVhFTFM+PjEpLTEsIDEyNywgKHBjLT55djEyX2ZiW3BjLT5sc3RfZmJfaWR4XS55X3dpZHRoPj4xKSArNSk7Ci0gICAgICAgIHZweF9tZW1zZXQocGJpLT5tdF92YWJvdmVfcm93WzBdICsgKFZQOEJPUkRFUklOUElYRUxTPj4xKS0xLCAxMjcsIChwYy0+eXYxMl9mYltwYy0+bHN0X2ZiX2lkeF0ueV93aWR0aD4+MSkgKzUpOwotCi0gICAgICAgIGZvciAoaT0xOyBpPHBjLT5tYl9yb3dzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9tZW1zZXQocGJpLT5tdF95YWJvdmVfcm93W2ldICsgVlA4Qk9SREVSSU5QSVhFTFMtMSwgKHVuc2lnbmVkIGNoYXIpMTI5LCAxKTsKLSAgICAgICAgICAgIHZweF9tZW1zZXQocGJpLT5tdF91YWJvdmVfcm93W2ldICsgKFZQOEJPUkRFUklOUElYRUxTPj4xKS0xLCAodW5zaWduZWQgY2hhcikxMjksIDEpOwotICAgICAgICAgICAgdnB4X21lbXNldChwYmktPm10X3ZhYm92ZV9yb3dbaV0gKyAoVlA4Qk9SREVSSU5QSVhFTFM+PjEpLTEsICh1bnNpZ25lZCBjaGFyKTEyOSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTZXQgbGVmdF9jb2wgdG8gMTI5IGluaXRpYWxseSAqLwotICAgICAgICBmb3IgKGk9MDsgaTxwYy0+bWJfcm93czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfeWxlZnRfY29sW2ldLCAodW5zaWduZWQgY2hhcikxMjksIDE2KTsKLSAgICAgICAgICAgIHZweF9tZW1zZXQocGJpLT5tdF91bGVmdF9jb2xbaV0sICh1bnNpZ25lZCBjaGFyKTEyOSwgOCk7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KHBiaS0+bXRfdmxlZnRfY29sW2ldLCAodW5zaWduZWQgY2hhcikxMjksIDgpOwotICAgICAgICB9Ci0gICAgICAgIGxwZl9pbml0KHBiaSwgcGMtPmZpbHRlcl9sZXZlbCk7Ci0gICAgfQotCi0gICAgc2V0dXBfZGVjb2RpbmdfdGhyZWFkX2RhdGEocGJpLCB4ZCwgcGJpLT5tYl9yb3dfZGksIHBiaS0+ZGVjb2RpbmdfdGhyZWFkX2NvdW50KTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwYmktPmRlY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQotICAgICAgICBzZW1fcG9zdCgmcGJpLT5oX2V2ZW50X3N0YXJ0X2RlY29kaW5nW2ldKTsKLQotICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgcGMtPm1iX3Jvd3M7IG1iX3JvdyArPSAocGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQgKyAxKSkKLSAgICB7Ci0KLSAgICAgICAgeGQtPmN1cnJlbnRfYmMgPSAmcGJpLT5tYmNbbWJfcm93JW51bV9wYXJ0XTsKLQotICAgICAgICAvKiB2cDhfZGVjb2RlX21iX3JvdyhwYmksIHBjLCBtYl9yb3csIHhkKTsgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBpbnQgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgICAgICBpbnQgbWJfY29sOwotICAgICAgICAgICAgaW50IHJlZl9mYl9pZHggPSBwYy0+bHN0X2ZiX2lkeDsKLSAgICAgICAgICAgIGludCBkc3RfZmJfaWR4ID0gcGMtPm5ld19mYl9pZHg7Ci0gICAgICAgICAgICBpbnQgcmVjb25feV9zdHJpZGUgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS55X3N0cmlkZTsKLSAgICAgICAgICAgIGludCByZWNvbl91dl9zdHJpZGUgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS51dl9zdHJpZGU7Ci0KLSAgICAgICAgICAgLyogdm9sYXRpbGUgaW50ICpsYXN0X3Jvd19jdXJyZW50X21iX2NvbCA9IE5VTEw7ICovCi0gICAgICAgICAgICBpZiAobWJfcm93ID4gMCkKLSAgICAgICAgICAgICAgICBsYXN0X3Jvd19jdXJyZW50X21iX2NvbCA9ICZwYmktPm10X2N1cnJlbnRfbWJfY29sW21iX3JvdyAtMV07Ci0KLSAgICAgICAgICAgIHZweF9tZW1zZXQoJnBjLT5sZWZ0X2NvbnRleHQsIDAsIHNpemVvZihwYy0+bGVmdF9jb250ZXh0KSk7Ci0gICAgICAgICAgICByZWNvbl95b2Zmc2V0ID0gbWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNjsKLSAgICAgICAgICAgIHJlY29uX3V2b2Zmc2V0ID0gbWJfcm93ICogcmVjb25fdXZfc3RyaWRlICogODsKLSAgICAgICAgICAgIC8qIHJlc2V0IGFib3ZlIGJsb2NrIGNvZWZmcyAqLwotCi0gICAgICAgICAgICB4ZC0+YWJvdmVfY29udGV4dCA9IHBjLT5hYm92ZV9jb250ZXh0OwotICAgICAgICAgICAgeGQtPnVwX2F2YWlsYWJsZSA9IChtYl9yb3cgIT0gMCk7Ci0KLSAgICAgICAgICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSkgPDwgMzsKLSAgICAgICAgICAgIHhkLT5tYl90b19ib3R0b21fZWRnZSA9ICgocGMtPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOwotCi0gICAgICAgICAgICBmb3IgKG1iX2NvbCA9IDA7IG1iX2NvbCA8IHBjLT5tYl9jb2xzOyBtYl9jb2wrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIG1iX3JvdyA+IDAgJiYgKG1iX2NvbCAmIChuc3luYy0xKSkgPT0gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChtYl9jb2wgPiAoKmxhc3Rfcm93X2N1cnJlbnRfbWJfY29sIC0gbnN5bmMpICYmICpsYXN0X3Jvd19jdXJyZW50X21iX2NvbCAhPSBwYy0+bWJfY29scyAtIDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9wYXVzZV9oaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfc2xlZXAoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNViB8fCB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBCX1BSRUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tEICpkID0gJnhkLT5ibG9ja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoJmQtPmJtaSwgJnhkLT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW2ldLCBzaXplb2YoQl9NT0RFX0lORk8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERpc3RhbmNlIG9mIE1iIHRvIHRoZSB2YXJpb3VzIGltYWdlIGVkZ2VzLgotICAgICAgICAgICAgICAgICAqIFRoZXNlIGFyZSBzcGVjaWZpZWQgdG8gOHRoIHBlbCBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHhkLT5tYl90b19sZWZ0X2VkZ2UgPSAtKChtYl9jb2wgKiAxNikgPDwgMyk7Ci0gICAgICAgICAgICAgICAgeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPSAoKHBjLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKLQotICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgPSBwYy0+eXYxMl9mYltkc3RfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciA9IHBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgeGQtPmRzdC52X2J1ZmZlciA9IHBjLT55djEyX2ZiW2RzdF9mYl9pZHhdLnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICB4ZC0+bGVmdF9hdmFpbGFibGUgPSAobWJfY29sICE9IDApOwotCi0gICAgICAgICAgICAgICAgLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSByZWZlcmVuY2UgZnJhbWUgZm9yIHRoaXMgTUIgKi8KLSAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKQotICAgICAgICAgICAgICAgICAgICByZWZfZmJfaWR4ID0gcGMtPmxzdF9mYl9pZHg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBHT0xERU5fRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIHJlZl9mYl9pZHggPSBwYy0+Z2xkX2ZiX2lkeDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlZl9mYl9pZHggPSBwYy0+YWx0X2ZiX2lkeDsKLQotICAgICAgICAgICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgeGQtPnByZS51X2J1ZmZlciA9IHBjLT55djEyX2ZiW3JlZl9mYl9pZHhdLnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgeGQtPnByZS52X2J1ZmZlciA9IHBjLT55djEyX2ZiW3JlZl9mYl9pZHhdLnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSByZWZlcmVuY2UgZnJhbWVzICovCi0gICAgICAgICAgICAgICAgICAgIHhkLT5jb3JydXB0ZWQgfD0gcGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0uY29ycnVwdGVkOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZwOF9idWlsZF91dm12cyh4ZCwgcGMtPmZ1bGxfcGl4ZWwpOwotICAgICAgICAgICAgICAgIGRlY29kZV9tYWNyb2Jsb2NrKHBiaSwgeGQsIG1iX3JvdywgbWJfY29sKTsKLQotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBib29sZWFuIGRlY29kZXIgaGFzIHN1ZmZlcmVkIGFuIGVycm9yICovCi0gICAgICAgICAgICAgICAgeGQtPmNvcnJ1cHRlZCB8PSB2cDhkeF9ib29sX2Vycm9yKHhkLT5jdXJyZW50X2JjKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGRlY29kZWQgTUIgbGFzdCByb3cgZGF0YSBmb3IgbmV4dC1yb3cgZGVjb2RpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYobWJfcm93ICE9IHBjLT5tYl9yb3dzLTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoKHBiaS0+bXRfeWFib3ZlX3Jvd1ttYl9yb3cgKzFdICsgMzIgKyBtYl9jb2wqMTYpLCAoeGQtPmRzdC55X2J1ZmZlciArIDE1ICogcmVjb25feV9zdHJpZGUpLCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KChwYmktPm10X3VhYm92ZV9yb3dbbWJfcm93ICsxXSArIDE2ICsgbWJfY29sKjgpLCAoeGQtPmRzdC51X2J1ZmZlciArIDcgKiByZWNvbl91dl9zdHJpZGUpLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoKHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3cgKzFdICsgMTYgKyBtYl9jb2wqOCksICh4ZC0+ZHN0LnZfYnVmZmVyICsgNyAqIHJlY29uX3V2X3N0cmlkZSksIDgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBsZWZ0X2NvbCBmb3IgbmV4dCBNQiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICBpZihtYl9jb2wgIT0gcGMtPm1iX2NvbHMtMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV9JTkZPICpuZXh0ID0geGQtPm1vZGVfaW5mb19jb250ZXh0ICsxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGQtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICB8fCAgbmV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfeWxlZnRfY29sW21iX3Jvd11baV0gPSB4ZC0+ZHN0LnlfYnVmZmVyIFtpKiByZWNvbl95X3N0cmlkZSArIDE1XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJpLT5tdF91bGVmdF9jb2xbbWJfcm93XVtpXSA9IHhkLT5kc3QudV9idWZmZXIgW2kqIHJlY29uX3V2X3N0cmlkZSArIDddOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3ZsZWZ0X2NvbFttYl9yb3ddW2ldID0geGQtPmRzdC52X2J1ZmZlciBbaSogcmVjb25fdXZfc3RyaWRlICsgN107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGxvb3BmaWx0ZXIgaW5mbyAqLwotICAgICAgICAgICAgICAgICAgICBTZWdtZW50ID0gKGFsdF9mbHRfZW5hYmxlZCkgPyB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZCA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9sZXZlbCA9IHBiaS0+bXRfYmFzZWxpbmVfZmlsdGVyX2xldmVsW1NlZ21lbnRdOwotICAgICAgICAgICAgICAgICAgICAvKiBEaXN0YW5jZSBvZiBNYiB0byB0aGUgdmFyaW91cyBpbWFnZSBlZGdlcy4KLSAgICAgICAgICAgICAgICAgICAgICogVGhlc2UgYXJlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZCB0byB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCi0gICAgICAgICAgICAgICAgICAgICAqIEFwcGx5IGFueSBjb250ZXh0IGRyaXZlbiBNQiBsZXZlbCBhZGp1c3RtZW50Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgPSB2cDhfYWRqdXN0X21iX2xmX3ZhbHVlKHhkLCBmaWx0ZXJfbGV2ZWwpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGxvb3BmaWx0ZXIgb24gdGhpcyBtYWNyb2Jsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyX2xldmVsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYy0+bGZfbWJ2KHhkLT5kc3QueV9idWZmZXIsIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsIHJlY29uX3lfc3RyaWRlLCByZWNvbl91dl9zdHJpZGUsICZsZmlbZmlsdGVyX2xldmVsXSwgcGMtPnNpbXBsZXJfbHBmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYy0+bGZfYnYoeGQtPmRzdC55X2J1ZmZlciwgeGQtPmRzdC51X2J1ZmZlciwgeGQtPmRzdC52X2J1ZmZlciwgcmVjb25feV9zdHJpZGUsIHJlY29uX3V2X3N0cmlkZSwgJmxmaVtmaWx0ZXJfbGV2ZWxdLCBwYy0+c2ltcGxlcl9scGYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBhcHBseSBhY3Jvc3MgdW12IGJvcmRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3JvdyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPmxmX21iaCh4ZC0+ZHN0LnlfYnVmZmVyLCB4ZC0+ZHN0LnVfYnVmZmVyLCB4ZC0+ZHN0LnZfYnVmZmVyLCByZWNvbl95X3N0cmlkZSwgcmVjb25fdXZfc3RyaWRlLCAmbGZpW2ZpbHRlcl9sZXZlbF0sIHBjLT5zaW1wbGVyX2xwZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPmxmX2JoKHhkLT5kc3QueV9idWZmZXIsIHhkLT5kc3QudV9idWZmZXIsIHhkLT5kc3Qudl9idWZmZXIsIHJlY29uX3lfc3RyaWRlLCByZWNvbl91dl9zdHJpZGUsICZsZmlbZmlsdGVyX2xldmVsXSwgcGMtPnNpbXBsZXJfbHBmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlY29uX3lvZmZzZXQgKz0gMTY7Ci0gICAgICAgICAgICAgICAgcmVjb25fdXZvZmZzZXQgKz0gODsKLQotICAgICAgICAgICAgICAgICsreGQtPm1vZGVfaW5mb19jb250ZXh0OyAgLyogbmV4dCBtYiAqLwotCi0gICAgICAgICAgICAgICAgeGQtPmFib3ZlX2NvbnRleHQrKzsKLQotICAgICAgICAgICAgICAgIHBiaS0+bXRfY3VycmVudF9tYl9jb2xbbWJfcm93XSA9IG1iX2NvbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYWRqdXN0IHRvIHRoZSBuZXh0IHJvdyBvZiBtYnMgKi8KLSAgICAgICAgICAgIGlmIChwYmktPmNvbW1vbi5maWx0ZXJfbGV2ZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobWJfcm93ICE9IHBjLT5tYl9yb3dzLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdHkgPSBwYy0+eXYxMl9mYltyZWZfZmJfaWR4XS55X3dpZHRoICsgVlA4Qk9SREVSSU5QSVhFTFM7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsYXN0dXYgPSAocGMtPnl2MTJfZmJbcmVmX2ZiX2lkeF0ueV93aWR0aD4+MSkgKyAoVlA4Qk9SREVSSU5QSVhFTFM+PjEpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBiaS0+bXRfeWFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R5ICsgaV0gPSBwYmktPm10X3lhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0eSAtMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3VhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0dXYgKyBpXSA9IHBiaS0+bXRfdWFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R1diAtMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYmktPm10X3ZhYm92ZV9yb3dbbWJfcm93ICsxXVtsYXN0dXYgKyBpXSA9IHBiaS0+bXRfdmFib3ZlX3Jvd1ttYl9yb3cgKzFdW2xhc3R1diAtMV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgIHZwOF9leHRlbmRfbWJfcm93KCZwYy0+eXYxMl9mYltkc3RfZmJfaWR4XSwgeGQtPmRzdC55X2J1ZmZlciArIDE2LCB4ZC0+ZHN0LnVfYnVmZmVyICsgOCwgeGQtPmRzdC52X2J1ZmZlciArIDgpOwotCi0gICAgICAgICAgICArK3hkLT5tb2RlX2luZm9fY29udGV4dDsgICAgICAvKiBza2lwIHByZWRpY3Rpb24gY29sdW1uICovCi0gICAgICAgIH0KLSAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ICs9IHhkLT5tb2RlX2luZm9fc3RyaWRlICogcGJpLT5kZWNvZGluZ190aHJlYWRfY291bnQ7Ci0gICAgfQotCi0gICAgc2VtX3dhaXQoJnBiaS0+aF9ldmVudF9lbmRfZGVjb2RpbmcpOyAgIC8qIGFkZCBiYWNrIGZvciBlYWNoIGZyYW1lICovCi19CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci90cmVlcmVhZGVyLmggYi92cDgvZGVjb2Rlci90cmVlcmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGE0ZDIuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIvdHJlZXJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgdHJlZV9yZWFkZXJfaAotI2RlZmluZSB0cmVlX3JlYWRlcl9oIDEKLQotI2luY2x1ZGUgInZwOC9jb21tb24vdHJlZWNvZGVyLmgiCi0KLSNpbmNsdWRlICJkYm9vbGh1ZmYuaCIKLQotdHlwZWRlZiBCT09MX0RFQ09ERVIgdnA4X3JlYWRlcjsKLQotI2RlZmluZSB2cDhfcmVhZCB2cDhkeF9kZWNvZGVfYm9vbAotI2RlZmluZSB2cDhfcmVhZF9saXRlcmFsIHZwOF9kZWNvZGVfdmFsdWUKLSNkZWZpbmUgdnA4X3JlYWRfYml0KCBSKSB2cDhfcmVhZCggUiwgdnA4X3Byb2JfaGFsZikKLQotCi0vKiBJbnRlbnQgb2YgdHJlZSBkYXRhIHN0cnVjdHVyZSBpcyB0byBtYWtlIGRlY29kaW5nIHRyaXZpYWwuICovCi0KLXN0YXRpYyBpbnQgdnA4X3RyZWVkX3JlYWQoCi0gICAgdnA4X3JlYWRlciAqY29uc3QgciwgICAgICAgIC8qICEhISBtdXN0IHJldHVybiBhIDAgb3IgMSAhISEgKi8KLSAgICB2cDhfdHJlZSB0LAotICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwCi0pCi17Ci0gICAgcmVnaXN0ZXIgdnA4X3RyZWVfaW5kZXggaSA9IDA7Ci0KLSAgICB3aGlsZSAoKGkgPSB0WyBpICsgdnA4X3JlYWQociwgcFtpPj4xXSldKSA+IDApIDsKLQotICAgIHJldHVybiAtaTsKLX0KLQotCi0vKiBWYXJpYW50IHJlYWRzIGEgYmluYXJ5IG51bWJlciBnaXZlbiBkaXN0cmlidXRpb25zIG9uIGVhY2ggYml0LgotICAgTm90ZSB0aGF0IHRyZWUgaXMgYXJiaXRyYXJ5OyBwcm9iYWJpbGl0eSBvZiBkZWNvZGluZyBhIHplcm8KLSAgIG1heSBvciBtYXkgbm90IGRlcGVuZCBvbiBwcmV2aW91c2x5IGRlY29kZWQgYml0cy4gKi8KLQotc3RhdGljIGludCB2cDhfdHJlZWRfcmVhZF9udW0oCi0gICAgdnA4X3JlYWRlciAqY29uc3QgciwgICAgICAgIC8qICEhISBtdXN0IHJldHVybiBhIDAgb3IgMSAhISEgKi8KLSAgICB2cDhfdHJlZSB0LAotICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwCi0pCi17Ci0gICAgdnA4X3RyZWVfaW5kZXggaSA9IDA7Ci0gICAgaW50IHYgPSAwLCBiOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGIgPSB2cDhfcmVhZChyLCBwW2k+PjFdKTsKLSAgICAgICAgdiA9ICh2IDw8IDEpICsgYjsKLSAgICB9Ci0gICAgd2hpbGUgKChpID0gdFtpK2JdKSA+IDApOwotCi0gICAgcmV0dXJuIHY7Ci19Ci0jZW5kaWYgLyogdHJlZV9yZWFkZXJfaCAqLwpkaWZmIC0tZ2l0IGEvdnA4L2RlY29kZXIveDg2L2RlcXVhbnRpemVfbW14LmFzbSBiL3ZwOC9kZWNvZGVyL3g4Ni9kZXF1YW50aXplX21teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjEzM2EuLjAwMDAwMDAKLS0tIGEvdnA4L2RlY29kZXIveDg2L2RlcXVhbnRpemVfbW14LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLQotO3ZvaWQgdnA4X2RlcXVhbnRpemVfYl9pbXBsX21teChzaG9ydCAqc3EsIHNob3J0ICpkcSwgc2hvcnQgKnEpCi1nbG9iYWwgc3ltKHZwOF9kZXF1YW50aXplX2JfaW1wbF9tbXgpCi1zeW0odnA4X2RlcXVhbnRpemVfYl9pbXBsX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAzCi0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgIHJzaSwgYXJnKDApIDtzcQotICAgICAgICBtb3YgICAgICAgcmRpLCBhcmcoMSkgO2RxCi0gICAgICAgIG1vdiAgICAgICByYXgsIGFyZygyKSA7cQotCi0gICAgICAgIG1vdnEgICAgICBtbTEsIFtyc2ldCi0gICAgICAgIHBtdWxsdyAgICBtbTEsIFtyYXgrMF0gICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMCBtb2RpZmllcnMuCi0gICAgICAgIG1vdnEgICAgICBbcmRpXSwgbW0xCi0KLSAgICAgICAgbW92cSAgICAgIG1tMSwgW3JzaSs4XQotICAgICAgICBwbXVsbHcgICAgbW0xLCBbcmF4KzhdICAgICAgICAgICAgOyBtbTQgKj0ga2VybmVsIDAgbW9kaWZpZXJzLgotICAgICAgICBtb3ZxICAgICAgW3JkaSs4XSwgbW0xCi0KLSAgICAgICAgbW92cSAgICAgIG1tMSwgW3JzaSsxNl0KLSAgICAgICAgcG11bGx3ICAgIG1tMSwgW3JheCsxNl0gICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMCBtb2RpZmllcnMuCi0gICAgICAgIG1vdnEgICAgICBbcmRpKzE2XSwgbW0xCi0KLSAgICAgICAgbW92cSAgICAgIG1tMSwgW3JzaSsyNF0KLSAgICAgICAgcG11bGx3ICAgIG1tMSwgW3JheCsyNF0gICAgICAgICAgICA7IG1tNCAqPSBrZXJuZWwgMCBtb2RpZmllcnMuCi0gICAgICAgIG1vdnEgICAgICBbcmRpKzI0XSwgbW0xCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIGRlcXVhbnRfaWRjdF9hZGRfbW14KHNob3J0ICppbnB1dCwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmVkLCB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgcGl0Y2gsIGludCBzdHJpZGUpCi1nbG9iYWwgc3ltKHZwOF9kZXF1YW50X2lkY3RfYWRkX21teCkKLXN5bSh2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgYXJnKDApIDtpbnB1dAotICAgICAgICBtb3YgICAgICAgICByZHgsICAgIGFyZygxKSA7ZHEKLQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW3JheCAgIF0KLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICBbcmR4XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgW3JheCArOF0KLSAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICBbcmR4ICs4XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgW3JheCsxNl0KLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBbcmR4KzE2XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgW3JheCsyNF0KLSAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICBbcmR4KzI0XQotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgYXJnKDMpIDtkZXN0Ci0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgYXJnKDIpIDtwcmVkCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03Ci0KLQotICAgICAgICBtb3ZxICAgICAgICBbcmF4XSwgICBtbTcKLSAgICAgICAgbW92cSAgICAgICAgW3JheCs4XSwgbW03Ci0KLSAgICAgICAgbW92cSAgICAgICAgW3JheCsxNl0sbW03Ci0gICAgICAgIG1vdnEgICAgICAgIFtyYXgrMjRdLG1tNwotCi0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO3BpdGNoCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtzdHJpZGUKLQotICAgICAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgYjE9IDAtMgotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBhMSA9MCsyCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXTsKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IGlwMSAqIHNpbihwaS84KSAqIHNxcnQoMikKLQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGh3ICAgICAgbW03LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyBpcDMgKiBjb3MocGkvOCkgKiBzcXJ0KDIpCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tNywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyBjMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMwotCi0gICAgICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW0zLCAgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW00Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGQxCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBhMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBiMQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDswCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICA7MQotICAgICAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsyCi0KLSAgICAgICAgcHN1YncgICAgICAgbW02LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7MwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAwMyAwMiAwMSAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMjMgMjIgMjEgMjAKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKLSAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMxIDIxIDMwIDIwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzAgMjAgMTAgMDAKLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IDMxIDIxIDExIDAxCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNSwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMwotCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBiMT0gMC0yCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGExID0wKzIKLQotICAgICAgICBwbXVsaHcgICAgICBtbTUsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildOwotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgaXAxICogc2luKHBpLzgpICogc3FydCgyKQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOwotICAgICAgICBwbXVsaHcgICAgICBtbTcsICAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV07Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW03LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKLSAgICAgICAgcHN1YncgICAgICAgbW03LCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGMxCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLQotICAgICAgICBwbXVsaHcgICAgICBtbTMsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTQKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgZDEKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgICAgIFtHTE9CQUwoZm91cnMpXQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGExCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGIxCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzAKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsxCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzIKLQotICAgICAgICBwc3VidyAgICAgICBtbTYsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDszCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMiwgICAgICAgICAgICAzCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW0wLCAgICAgICAgICAgIDMKLSAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgICAgIDMKLQotICAgICAgICBwc3JhdyAgICAgICBtbTYsICAgICAgICAgICAgMwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAwMyAwMiAwMSAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMjMgMjIgMjEgMjAKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKLSAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMxIDIxIDMwIDIwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzAgMjAgMTAgMDAKLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IDMxIDIxIDExIDAxCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNSwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgICAgICBtbTcKLQotICAgICAgICBtb3ZkICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tNwotICAgICAgICBwYWRkc3cgICAgICBtbTAsICAgICAgICAgICAgbW00Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgICAgICAgICBtbTcKLSAgICAgICAgbW92ZCAgICAgICAgW3JkeF0sICAgICAgICAgIG1tMAotCi0gICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpK3JheF0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tNwotICAgICAgICBwYWRkc3cgICAgICBtbTEsICAgICAgICAgICAgbW00Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgICAgICBtbTcKLSAgICAgICAgbW92ZCAgICAgICAgW3JkeCtyZGldLCAgICAgIG1tMQotCi0gICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpKzIqcmF4XQotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICAgICAgbW03Ci0gICAgICAgIHBhZGRzdyAgICAgIG1tMiwgICAgICAgICAgICBtbTQKLSAgICAgICAgcGFja3Vzd2IgICAgbW0yLCAgICAgICAgICAgIG1tNwotICAgICAgICBtb3ZkICAgICAgICBbcmR4K3JkaSoyXSwgICAgbW0yCi0KLSAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgICAgIHJkaQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4Ci0KLSAgICAgICAgbW92ZCAgICAgICAgbW00LCAgICAgICAgICAgIFtyc2krMipyYXhdCi0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgICAgICBtbTcKLSAgICAgICAgcGFkZHN3ICAgICAgbW01LCAgICAgICAgICAgIG1tNAotICAgICAgICBwYWNrdXN3YiAgICBtbTUsICAgICAgICAgICAgbW03Ci0gICAgICAgIG1vdmQgICAgICAgIFtyZHgrcmRpKjJdLCAgICBtbTUKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCBkZXF1YW50X2RjX2lkY3RfYWRkX21teChzaG9ydCAqaW5wdXQsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlZCwgdW5zaWduZWQgY2hhciAqZGVzdCwgaW50IHBpdGNoLCBpbnQgc3RyaWRlLCBpbnQgRGMpCi1nbG9iYWwgc3ltKHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX21teCkKLXN5bSh2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNwotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgYXJnKDApIDtpbnB1dAotICAgICAgICBtb3YgICAgICAgICByZHgsICAgIGFyZygxKSA7ZHEKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtyYXggICBdCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMCwgICAgW3JkeF0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgIFtyYXggKzhdCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgW3JkeCArOF0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIFtyYXgrMTZdCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMiwgICAgW3JkeCsxNl0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIFtyYXgrMjRdCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgW3JkeCsyNF0KLQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgIGFyZygzKSA7ZGVzdAotICAgICAgICBtb3YgICAgICAgICByc2ksICAgIGFyZygyKSA7cHJlZAotICAgICAgICBweG9yICAgICAgICBtbTcsICAgIG1tNwotCi0KLSAgICAgICAgbW92cSAgICAgICAgW3JheF0sICAgbW03Ci0gICAgICAgIG1vdnEgICAgICAgIFtyYXgrOF0sIG1tNwotCi0gICAgICAgIG1vdnEgICAgICAgIFtyYXgrMTZdLG1tNwotICAgICAgICBtb3ZxICAgICAgICBbcmF4KzI0XSxtbTcKLQotICAgICAgICA7IG1vdmUgbG93ZXIgd29yZCBvZiBEYyB0byBsb3dlciB3b3JkIG9mIG1tMAotICAgICAgICBwc3JscSAgICAgICBtbTAsICAgIDE2Ci0gICAgICAgIG1vdnp4ICAgICAgIHJjeCwgICAgd29yZCBwdHIgYXJnKDYpIDtEYwotICAgICAgICBwc2xscSAgICAgICBtbTAsICAgIDE2Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgcmN4Ci0gICAgICAgIHBvciAgICAgICAgIG1tMCwgICAgbW03Ci0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO3BpdGNoCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDUpIDtzdHJpZGUKLQotICAgICAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgYjE9IDAtMgotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBhMSA9MCsyCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXTsKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICA7IGlwMSAqIHNpbihwaS84KSAqIHNxcnQoMikKLQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGh3ICAgICAgbW03LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldOwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOyBpcDMgKiBjb3MocGkvOCkgKiBzcXJ0KDIpCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tNywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyBjMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMwotCi0gICAgICAgIHBtdWxodyAgICAgIG1tNSwgICAgICAgICAgICBbR0xPQkFMKHhfYzFzcXIybGVzczEpXQotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW0zLCAgICAgICAgICAgIFtHTE9CQUwoeF9zMXNxcjIpXQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW00Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGQxCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBhMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgOyBiMQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDswCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICA7MQotICAgICAgICBwc3VidyAgICAgICBtbTAsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsyCi0KLSAgICAgICAgcHN1YncgICAgICAgbW02LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7MwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAwMyAwMiAwMSAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMjMgMjIgMjEgMjAKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKLSAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMxIDIxIDMwIDIwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzAgMjAgMTAgMDAKLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IDMxIDIxIDExIDAxCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNSwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMwotCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyBiMT0gMC0yCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGExID0wKzIKLQotICAgICAgICBwbXVsaHcgICAgICBtbTUsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildOwotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgIDsgaXAxICogc2luKHBpLzgpICogc3FydCgyKQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOwotICAgICAgICBwbXVsaHcgICAgICBtbTcsICAgICAgICAgICAgW0dMT0JBTCh4X2Mxc3FyMmxlc3MxKV07Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW03LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IGlwMyAqIGNvcyhwaS84KSAqIHNxcnQoMikKLSAgICAgICAgcHN1YncgICAgICAgbW03LCAgICAgICAgICAgIG1tNSAgICAgICAgICAgICA7IGMxCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcG11bGh3ICAgICAgbW01LCAgICAgICAgICAgIFtHTE9CQUwoeF9jMXNxcjJsZXNzMSldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLQotICAgICAgICBwbXVsaHcgICAgICBtbTMsICAgICAgICAgICAgW0dMT0JBTCh4X3Mxc3FyMildCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgICAgICAgICBtbTQKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgICAgICAgICAgbW01ICAgICAgICAgICAgIDsgZDEKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgICAgIFtHTE9CQUwoZm91cnMpXQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBbR0xPQkFMKGZvdXJzKV0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICA7IGExCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IGIxCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgOzAKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgIDsxCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgOzIKLQotICAgICAgICBwc3VidyAgICAgICBtbTYsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDszCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMiwgICAgICAgICAgICAzCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW0wLCAgICAgICAgICAgIDMKLSAgICAgICAgcHNyYXcgICAgICAgbW00LCAgICAgICAgICAgIDMKLQotICAgICAgICBwc3JhdyAgICAgICBtbTYsICAgICAgICAgICAgMwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgOyAwMyAwMiAwMSAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgbW00ICAgICAgICAgICAgIDsgMjMgMjIgMjEgMjAKLQotICAgICAgICBwdW5wY2tsd2QgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgIDsgMTEgMDEgMTAgMDAKLSAgICAgICAgcHVucGNraHdkICAgbW0yLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICA7IDEzIDAzIDEyIDAyCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICA7IDMxIDIxIDMwIDIwCi0gICAgICAgIHB1bnBja2h3ZCAgIG1tNCwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgOyAzMyAyMyAzMiAyMgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgOyAxMSAwMSAxMCAwMAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgIDsgMTMgMDMgMTIgMDIKLQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICAgICAgbW0zICAgICAgICAgICAgIDsgMzAgMjAgMTAgMDAKLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICA7IDMxIDIxIDExIDAxCi0KLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICA7IDMyIDIyIDEyIDAyCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNSwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgOyAzMyAyMyAxMyAwMwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgICAgICBtbTcKLQotICAgICAgICBtb3ZkICAgICAgICBtbTQsICAgICAgICAgICAgW3JzaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tNwotICAgICAgICBwYWRkc3cgICAgICBtbTAsICAgICAgICAgICAgbW00Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgICAgICAgICBtbTcKLSAgICAgICAgbW92ZCAgICAgICAgW3JkeF0sICAgICAgICAgIG1tMAotCi0gICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpK3JheF0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW00LCAgICAgICAgICAgIG1tNwotICAgICAgICBwYWRkc3cgICAgICBtbTEsICAgICAgICAgICAgbW00Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgICAgICAgICAgICBtbTcKLSAgICAgICAgbW92ZCAgICAgICAgW3JkeCtyZGldLCAgICAgIG1tMQotCi0gICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgICAgICAgICBbcnNpKzIqcmF4XQotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgICAgICAgICAgbW03Ci0gICAgICAgIHBhZGRzdyAgICAgIG1tMiwgICAgICAgICAgICBtbTQKLSAgICAgICAgcGFja3Vzd2IgICAgbW0yLCAgICAgICAgICAgIG1tNwotICAgICAgICBtb3ZkICAgICAgICBbcmR4K3JkaSoyXSwgICAgbW0yCi0KLSAgICAgICAgYWRkICAgICAgICAgcmR4LCAgICAgICAgICAgIHJkaQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4Ci0KLSAgICAgICAgbW92ZCAgICAgICAgbW00LCAgICAgICAgICAgIFtyc2krMipyYXhdCi0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgICAgICAgICBtbTcKLSAgICAgICAgcGFkZHN3ICAgICAgbW01LCAgICAgICAgICAgIG1tNAotICAgICAgICBwYWNrdXN3YiAgICBtbTUsICAgICAgICAgICAgbW03Ci0gICAgICAgIG1vdmQgICAgICAgIFtyZHgrcmRpKjJdLCAgICBtbTUKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXhfczFzcXIyOgotICAgIHRpbWVzIDQgZHcgMHg4QThDCi1hbGlnbiAxNgoteF9jMXNxcjJsZXNzMToKLSAgICB0aW1lcyA0IGR3IDB4NEU3QgotYWxpZ24gMTYKLWZvdXJzOgotICAgIHRpbWVzIDQgZHcgMHgwMDA0CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci94ODYvZGVxdWFudGl6ZV94ODYuaCBiL3ZwOC9kZWNvZGVyL3g4Ni9kZXF1YW50aXplX3g4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzY4ZGFhLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL3g4Ni9kZXF1YW50aXplX3g4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgREVRVUFOVElaRV9YODZfSAotI2RlZmluZSBERVFVQU5USVpFX1g4Nl9ICi0KLQotLyogTm90ZToKLSAqCi0gKiBUaGlzIHBsYXRmb3JtIGlzIGNvbW1vbmx5IGJ1aWx0IGZvciBydW50aW1lIENQVSBkZXRlY3Rpb24uIElmIHlvdSBtb2RpZnkKLSAqIGFueSBvZiB0aGUgZnVuY3Rpb24gbWFwcGluZ3MgcHJlc2VudCBpbiB0aGlzIGZpbGUsIGJlIHN1cmUgdG8gYWxzbyB1cGRhdGUKLSAqIHRoZW0gaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW5pdGlhbGl6YXRpb24gY29kZQotICovCi0jaWYgSEFWRV9NTVgKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9ibG9jayh2cDhfZGVxdWFudGl6ZV9iX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfaWRjdF9hZGQodnA4X2RlcXVhbnRfaWRjdF9hZGRfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9kY19pZGN0X2FkZCh2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja19tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrKHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX21teCk7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfZGVxdWFudF9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9ibG9jayB2cDhfZGVxdWFudGl6ZV9iX21teAotCi0jdW5kZWYgIHZwOF9kZXF1YW50X2lkY3RfYWRkCi0jZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkIHZwOF9kZXF1YW50X2lkY3RfYWRkX21teAotCi0jdW5kZWYgIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkCi0jZGVmaW5lIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX21teAotCi0jdW5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfbW14Ci0KLSN1bmRlZiB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrCi0jZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19tbXgKLQotI3VuZGVmIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrCi0jZGVmaW5lIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX21teAotCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgSEFWRV9TU0UyCi1leHRlcm4gcHJvdG90eXBlX2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jayh2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX3NzZTIpOwotZXh0ZXJuIHByb3RvdHlwZV9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2sodnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9jayh2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19zc2UyKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfc3NlMgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9jawotI2RlZmluZSB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfc3NlMgotCi0jdW5kZWYgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sKLSNkZWZpbmUgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2sgdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfc3NlMgotCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9kZWNvZGVyL3g4Ni9pZGN0X2Jsa19tbXguYyBiL3ZwOC9kZWNvZGVyL3g4Ni9pZGN0X2Jsa19tbXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxYTM2My4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci94ODYvaWRjdF9ibGtfbW14LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vaWRjdC5oIgotI2luY2x1ZGUgInZwOC9kZWNvZGVyL2RlcXVhbnRpemUuaCIKLQotdm9pZCB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX21teAotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMsIHNob3J0ICpkYykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBpZiAoZW9ic1swXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9tbXggKHEsIGRxLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSwgZGNbMF0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKGRjWzBdLCBwcmUsIGRzdCwgMTYsIHN0cmlkZSk7Ci0KLSAgICAgICAgaWYgKGVvYnNbMV0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbW14IChxKzE2LCBkcSwgcHJlKzQsIGRzdCs0LCAxNiwgc3RyaWRlLCBkY1sxXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCAoZGNbMV0sIHByZSs0LCBkc3QrNCwgMTYsIHN0cmlkZSk7Ci0KLSAgICAgICAgaWYgKGVvYnNbMl0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbW14IChxKzMyLCBkcSwgcHJlKzgsIGRzdCs4LCAxNiwgc3RyaWRlLCBkY1syXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCAoZGNbMl0sIHByZSs4LCBkc3QrOCwgMTYsIHN0cmlkZSk7Ci0KLSAgICAgICAgaWYgKGVvYnNbM10gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfbW14IChxKzQ4LCBkcSwgcHJlKzEyLCBkc3QrMTIsIDE2LCBzdHJpZGUsIGRjWzNdKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChkY1szXSwgcHJlKzEyLCBkc3QrMTIsIDE2LCBzdHJpZGUpOwotCi0gICAgICAgIHEgICAgKz0gNjQ7Ci0gICAgICAgIGRjICAgKz0gNDsKLSAgICAgICAgcHJlICArPSA2NDsKLSAgICAgICAgZHN0ICArPSA0KnN0cmlkZTsKLSAgICAgICAgZW9icyArPSA0OwotICAgIH0KLX0KLQotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF95X2Jsb2NrX21teAotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGVvYnNbMF0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbW14IChxLCBkcSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCAocVswXSpkcVswXSwgcHJlLCBkc3QsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKilxKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW9ic1sxXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHErMTYsIGRxLCBwcmUrNCwgZHN0KzQsIDE2LCBzdHJpZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kY19vbmx5X2lkY3RfYWRkX21teCAocVsxNl0qZHFbMF0sIHByZSs0LCBkc3QrNCwgMTYsIHN0cmlkZSk7Ci0gICAgICAgICAgICAoKGludCAqKShxKzE2KSlbMF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVvYnNbMl0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbW14IChxKzMyLCBkcSwgcHJlKzgsIGRzdCs4LCAxNiwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbMzJdKmRxWzBdLCBwcmUrOCwgZHN0KzgsIDE2LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKikocSszMikpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlb2JzWzNdID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21teCAocSs0OCwgZHEsIHByZSsxMiwgZHN0KzEyLCAxNiwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbNDhdKmRxWzBdLCBwcmUrMTIsIGRzdCsxMiwgMTYsIHN0cmlkZSk7Ci0gICAgICAgICAgICAoKGludCAqKShxKzQ4KSlbMF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcSAgICArPSA2NDsKLSAgICAgICAgcHJlICArPSA2NDsKLSAgICAgICAgZHN0ICArPSA0KnN0cmlkZTsKLSAgICAgICAgZW9icyArPSA0OwotICAgIH0KLX0KLQotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19tbXgKLSAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxLCB1bnNpZ25lZCBjaGFyICpwcmUsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0dSwgdW5zaWduZWQgY2hhciAqZHN0diwgaW50IHN0cmlkZSwgY2hhciAqZW9icykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICBpZiAoZW9ic1swXSA+IDEpCi0gICAgICAgICAgICB2cDhfZGVxdWFudF9pZGN0X2FkZF9tbXggKHEsIGRxLCBwcmUsIGRzdHUsIDgsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChxWzBdKmRxWzBdLCBwcmUsIGRzdHUsIDgsIHN0cmlkZSk7Ci0gICAgICAgICAgICAoKGludCAqKXEpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlb2JzWzFdID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21teCAocSsxNiwgZHEsIHByZSs0LCBkc3R1KzQsIDgsIHN0cmlkZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2RjX29ubHlfaWRjdF9hZGRfbW14IChxWzE2XSpkcVswXSwgcHJlKzQsIGRzdHUrNCwgOCwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopKHErMTYpKVswXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBxICAgICs9IDMyOwotICAgICAgICBwcmUgICs9IDMyOwotICAgICAgICBkc3R1ICs9IDQqc3RyaWRlOwotICAgICAgICBlb2JzICs9IDI7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChlb2JzWzBdID4gMSkKLSAgICAgICAgICAgIHZwOF9kZXF1YW50X2lkY3RfYWRkX21teCAocSwgZHEsIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbMF0qZHFbMF0sIHByZSwgZHN0diwgOCwgc3RyaWRlKTsKLSAgICAgICAgICAgICgoaW50ICopcSlbMF0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVvYnNbMV0gPiAxKQotICAgICAgICAgICAgdnA4X2RlcXVhbnRfaWRjdF9hZGRfbW14IChxKzE2LCBkcSwgcHJlKzQsIGRzdHYrNCwgOCwgc3RyaWRlKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGNfb25seV9pZGN0X2FkZF9tbXggKHFbMTZdKmRxWzBdLCBwcmUrNCwgZHN0dis0LCA4LCBzdHJpZGUpOwotICAgICAgICAgICAgKChpbnQgKikocSsxNikpWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHEgICAgKz0gMzI7Ci0gICAgICAgIHByZSAgKz0gMzI7Ci0gICAgICAgIGRzdHYgKz0gNCpzdHJpZGU7Ci0gICAgICAgIGVvYnMgKz0gMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci94ODYvaWRjdF9ibGtfc3NlMi5jIGIvdnA4L2RlY29kZXIveDg2L2lkY3RfYmxrX3NzZTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4OGRiNC4uMDAwMDAwMAotLS0gYS92cDgvZGVjb2Rlci94ODYvaWRjdF9ibGtfc3NlMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2lkY3QuaCIKLSNpbmNsdWRlICJ2cDgvZGVjb2Rlci9kZXF1YW50aXplLmgiCi0KLXZvaWQgaWRjdF9kZXF1YW50X2RjXzBfMnhfc3NlMgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLCBzaG9ydCAqZGMpOwotdm9pZCBpZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9zc2UyCi0gICAgICAgICAgICAoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsIHNob3J0ICpkYyk7Ci0KLXZvaWQgaWRjdF9kZXF1YW50XzBfMnhfc3NlMgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEgLHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgYmxrX3N0cmlkZSk7Ci12b2lkIGlkY3RfZGVxdWFudF9mdWxsXzJ4X3NzZTIKLSAgICAgICAgICAgIChzaG9ydCAqcSwgc2hvcnQgKmRxICx1bnNpZ25lZCBjaGFyICpwcmUsCi0gICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IGJsa19zdHJpZGUpOwotCi12b2lkIHZwOF9kZXF1YW50X2RjX2lkY3RfYWRkX3lfYmxvY2tfc3NlMgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMsIHNob3J0ICpkYykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBpZiAoKChzaG9ydCAqKShlb2JzKSlbMF0gJiAweGZlZmUpCi0gICAgICAgICAgICBpZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9zc2UyIChxLCBkcSwgcHJlLCBkc3QsIHN0cmlkZSwgZGMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZGN0X2RlcXVhbnRfZGNfMF8yeF9zc2UyIChxLCBkcSwgcHJlLCBkc3QsIHN0cmlkZSwgZGMpOwotCi0gICAgICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVsxXSAmIDB4ZmVmZSkKLSAgICAgICAgICAgIGlkY3RfZGVxdWFudF9kY19mdWxsXzJ4X3NzZTIgKHErMzIsIGRxLCBwcmUrOCwgZHN0KzgsIHN0cmlkZSwgZGMrMik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlkY3RfZGVxdWFudF9kY18wXzJ4X3NzZTIgKHErMzIsIGRxLCBwcmUrOCwgZHN0KzgsIHN0cmlkZSwgZGMrMik7Ci0KLSAgICAgICAgcSAgICArPSA2NDsKLSAgICAgICAgZGMgICArPSA0OwotICAgICAgICBwcmUgICs9IDY0OwotICAgICAgICBkc3QgICs9IHN0cmlkZSo0OwotICAgICAgICBlb2JzICs9IDQ7Ci0gICAgfQotfQotCi12b2lkIHZwOF9kZXF1YW50X2lkY3RfYWRkX3lfYmxvY2tfc3NlMgotICAgICAgICAgICAgKHNob3J0ICpxLCBzaG9ydCAqZHEsIHVuc2lnbmVkIGNoYXIgKnByZSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzBdICYgMHhmZWZlKQotICAgICAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfc3NlMiAocSwgZHEsIHByZSwgZHN0LCBzdHJpZGUsIDE2KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfc3NlMiAocSwgZHEsIHByZSwgZHN0LCBzdHJpZGUsIDE2KTsKLQotICAgICAgICBpZiAoKChzaG9ydCAqKShlb2JzKSlbMV0gJiAweGZlZmUpCi0gICAgICAgICAgICBpZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyIChxKzMyLCBkcSwgcHJlKzgsIGRzdCs4LCBzdHJpZGUsIDE2KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfc3NlMiAocSszMiwgZHEsIHByZSs4LCBkc3QrOCwgc3RyaWRlLCAxNik7Ci0KLSAgICAgICAgcSAgICArPSA2NDsKLSAgICAgICAgcHJlICArPSA2NDsKLSAgICAgICAgZHN0ICArPSBzdHJpZGUqNDsKLSAgICAgICAgZW9icyArPSA0OwotICAgIH0KLX0KLQotdm9pZCB2cDhfZGVxdWFudF9pZGN0X2FkZF91dl9ibG9ja19zc2UyCi0gICAgICAgICAgICAoc2hvcnQgKnEsIHNob3J0ICpkcSwgdW5zaWduZWQgY2hhciAqcHJlLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdHUsIHVuc2lnbmVkIGNoYXIgKmRzdHYsIGludCBzdHJpZGUsIGNoYXIgKmVvYnMpCi17Ci0gICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzBdICYgMHhmZWZlKQotICAgICAgICBpZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyIChxLCBkcSwgcHJlLCBkc3R1LCBzdHJpZGUsIDgpOwotICAgIGVsc2UKLSAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfc3NlMiAocSwgZHEsIHByZSwgZHN0dSwgc3RyaWRlLCA4KTsKLQotICAgIHEgICAgKz0gMzI7Ci0gICAgcHJlICArPSAzMjsKLSAgICBkc3R1ICs9IHN0cmlkZSo0OwotCi0gICAgaWYgKCgoc2hvcnQgKikoZW9icykpWzFdICYgMHhmZWZlKQotICAgICAgICBpZGN0X2RlcXVhbnRfZnVsbF8yeF9zc2UyIChxLCBkcSwgcHJlLCBkc3R1LCBzdHJpZGUsIDgpOwotICAgIGVsc2UKLSAgICAgICAgaWRjdF9kZXF1YW50XzBfMnhfc3NlMiAocSwgZHEsIHByZSwgZHN0dSwgc3RyaWRlLCA4KTsKLQotICAgIHEgICAgKz0gMzI7Ci0gICAgcHJlICArPSAzMjsKLQotICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVsyXSAmIDB4ZmVmZSkKLSAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfc3NlMiAocSwgZHEsIHByZSwgZHN0diwgc3RyaWRlLCA4KTsKLSAgICBlbHNlCi0gICAgICAgIGlkY3RfZGVxdWFudF8wXzJ4X3NzZTIgKHEsIGRxLCBwcmUsIGRzdHYsIHN0cmlkZSwgOCk7Ci0KLSAgICBxICAgICs9IDMyOwotICAgIHByZSAgKz0gMzI7Ci0gICAgZHN0diArPSBzdHJpZGUqNDsKLQotICAgIGlmICgoKHNob3J0ICopKGVvYnMpKVszXSAmIDB4ZmVmZSkKLSAgICAgICAgaWRjdF9kZXF1YW50X2Z1bGxfMnhfc3NlMiAocSwgZHEsIHByZSwgZHN0diwgc3RyaWRlLCA4KTsKLSAgICBlbHNlCi0gICAgICAgIGlkY3RfZGVxdWFudF8wXzJ4X3NzZTIgKHEsIGRxLCBwcmUsIGRzdHYsIHN0cmlkZSwgOCk7Ci19CmRpZmYgLS1naXQgYS92cDgvZGVjb2Rlci94ODYveDg2X2RzeXN0ZW1kZXBlbmRlbnQuYyBiL3ZwOC9kZWNvZGVyL3g4Ni94ODZfZHN5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzE2ODQyLi4wMDAwMDAwCi0tLSBhL3ZwOC9kZWNvZGVyL3g4Ni94ODZfZHN5c3RlbWRlcGVuZGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL3g4Ni5oIgotI2luY2x1ZGUgInZwOC9kZWNvZGVyL29ueXhkX2ludC5oIgotCi0KLSNpZiBIQVZFX01NWAotdm9pZCB2cDhfZGVxdWFudGl6ZV9iX2ltcGxfbW14KHNob3J0ICpzcSwgc2hvcnQgKmRxLCBzaG9ydCAqcSk7Ci0KLXN0YXRpYyB2b2lkIGRlcXVhbnRpemVfYl9tbXgoQkxPQ0tEICpkKQotewotICAgIHNob3J0ICpzcSA9IChzaG9ydCAqKSBkLT5xY29lZmY7Ci0gICAgc2hvcnQgKmRxID0gKHNob3J0ICopIGQtPmRxY29lZmY7Ci0gICAgc2hvcnQgKnEgPSAoc2hvcnQgKikgZC0+ZGVxdWFudDsKLSAgICB2cDhfZGVxdWFudGl6ZV9iX2ltcGxfbW14KHNxLCBkcSwgcSk7Ci19Ci0jZW5kaWYKLQotdm9pZCB2cDhfYXJjaF94ODZfZGVjb2RlX2luaXQoVlA4RF9DT01QICpwYmkpCi17Ci0gICAgaW50IGZsYWdzID0geDg2X3NpbWRfY2FwcygpOwotCi0gICAgLyogTm90ZToKLSAgICAgKgotICAgICAqIFRoaXMgcGxhdGZvcm0gY2FuIGJlIGJ1aWx0IHdpdGhvdXQgcnVudGltZSBDUFUgZGV0ZWN0aW9uIGFzIHdlbGwuIElmCi0gICAgICogeW91IG1vZGlmeSBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlCi0gICAgICogdG8gYWxzbyB1cGRhdGUgdGhlbSBpbiBzdGF0aWMgbWFwaW5ncyAoPGFyY2g+L2ZpbGVuYW1lXzxhcmNoPi5oKQotICAgICAqLwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGZ1bmN0aW9ucyB3aXRoIGZhc3Rlc3Qgb25lcyBmb3IgdGhpcyBDUFUuICovCi0jaWYgSEFWRV9NTVgKLSAgICBpZiAoZmxhZ3MgJiBIQVNfTU1YKQotICAgIHsKLSAgICAgICAgcGJpLT5kZXF1YW50LmJsb2NrICAgICAgICAgICAgICAgPSBkZXF1YW50aXplX2JfbW14OwotICAgICAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGQgICAgICAgICAgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX21teDsKLSAgICAgICAgcGJpLT5kZXF1YW50LmRjX2lkY3RfYWRkICAgICAgICAgPSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF9tbXg7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5kY19pZGN0X2FkZF95X2Jsb2NrID0gdnA4X2RlcXVhbnRfZGNfaWRjdF9hZGRfeV9ibG9ja19tbXg7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5pZGN0X2FkZF95X2Jsb2NrICAgID0gdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19tbXg7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5pZGN0X2FkZF91dl9ibG9jayAgID0gdnA4X2RlcXVhbnRfaWRjdF9hZGRfdXZfYmxvY2tfbW14OwotICAgIH0KLSNlbmRpZgotI2lmIEhBVkVfU1NFMgotICAgIGlmIChmbGFncyAmIEhBU19TU0UyKQotICAgIHsKLSAgICAgICAgcGJpLT5kZXF1YW50LmRjX2lkY3RfYWRkX3lfYmxvY2sgPSB2cDhfZGVxdWFudF9kY19pZGN0X2FkZF95X2Jsb2NrX3NzZTI7Ci0gICAgICAgIHBiaS0+ZGVxdWFudC5pZGN0X2FkZF95X2Jsb2NrICAgID0gdnA4X2RlcXVhbnRfaWRjdF9hZGRfeV9ibG9ja19zc2UyOwotICAgICAgICBwYmktPmRlcXVhbnQuaWRjdF9hZGRfdXZfYmxvY2sgICA9IHZwOF9kZXF1YW50X2lkY3RfYWRkX3V2X2Jsb2NrX3NzZTI7Ci0gICAgfQotI2VuZGlmCi0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybV9jc3lzdGVtZGVwZW5kZW50LmMgYi92cDgvZW5jb2Rlci9hcm0vYXJtX2NzeXN0ZW1kZXBlbmRlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0OGI4OS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtX2NzeXN0ZW1kZXBlbmRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvdmFyaWFuY2UuaCIKLSNpbmNsdWRlICJ2cDgvZW5jb2Rlci9vbnl4X2ludC5oIgotCi1leHRlcm4gdm9pZCAoKnZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZV9wdHIpKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjLCBpbnQgRnJhY3Rpb24pOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9wYXJ0aWFsX2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjLCBpbnQgRnJhY3Rpb24pOwotZXh0ZXJuIHZvaWQgdnB4eXYxMl9jb3B5X3BhcnRpYWxfZnJhbWVfbmVvbihZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYywgaW50IEZyYWN0aW9uKTsKLQotdm9pZCB2cDhfYXJjaF9hcm1fZW5jb2Rlcl9pbml0KFZQOF9DT01QICpjcGkpCi17Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgIGludCBmbGFncyA9IGNwaS0+Y29tbW9uLnJ0Y2QuZmxhZ3M7Ci0gICAgaW50IGhhc19lZHNwID0gZmxhZ3MgJiBIQVNfRURTUDsKLSAgICBpbnQgaGFzX21lZGlhID0gZmxhZ3MgJiBIQVNfTUVESUE7Ci0gICAgaW50IGhhc19uZW9uID0gZmxhZ3MgJiBIQVNfTkVPTjsKLQotI2lmIEhBVkVfQVJNVjYKLSAgICBpZiAoaGFzX21lZGlhKQotICAgIHsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDE2ICAgICAgICAgICAgICA9IHZwOF9zYWQxNngxNl9hcm12NjsKLSAgICAgICAgLypjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4OCAgICAgICAgICAgICAgID0gdnA4X3NhZDE2eDhfYzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4MTYgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDE2X2M7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDggICAgICAgICAgICAgICAgPSB2cDhfc2FkOHg4X2M7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ0eDQgICAgICAgICAgICAgICAgPSB2cDhfc2FkNHg0X2M7Ki8KLQotICAgICAgICAvKmNwaS0+cnRjZC52YXJpYW5jZS52YXI0eDQgICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U0eDRfYzsqLwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyOHg4ICAgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHg4X2FybXY2OwotICAgICAgICAvKmNwaS0+cnRjZC52YXJpYW5jZS52YXI4eDE2ICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U4eDE2X2M7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXIxNng4ICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNng4X2M7Ki8KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnZhcjE2eDE2ICAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTE2eDE2X2FybXY2OwotCi0gICAgICAgIC8qY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjR4NCAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYzsqLwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyOHg4ICAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9hcm12NjsKLSAgICAgICAgLypjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyOHgxNiAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjE2eDggICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X2M7Ki8KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjE2eDE2ICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9hcm12NjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl9oICAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9hcm12NjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl92ICAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9hcm12NjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl9odiAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjY7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLm1zZTE2eDE2ICAgICAgICAgICAgICA9IHZwOF9tc2UxNngxNl9hcm12NjsKLSAgICAgICAgLypjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0bWJzcyAgICAgICAgICAgICAgID0gdnA4X2dldF9tYl9zc19jOyovCi0KLSAgICAgICAgLypjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0MTZ4MTZwcmVkZXJyb3IgICAgID0gdnA4X2dldDE2eDE2cHJlZF9lcnJvcl9jOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0OHg4dmFyICAgICAgICAgICAgID0gdnA4X2dldDh4OHZhcl9jOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0MTZ4MTZ2YXIgICAgICAgICAgID0gdnA4X2dldDE2eDE2dmFyX2M7OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0NHg0c3NlX2NzICAgICAgICAgID0gdnA4X2dldDR4NHNzZV9jc19jOyovCi0KLSAgICAgICAgLypjcGktPnJ0Y2QuZmRjdC5zaG9ydDR4NCAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfYzsKLSAgICAgICAgY3BpLT5ydGNkLmZkY3Quc2hvcnQ4eDQgICAgICAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0OHg0X2M7Ki8KLSAgICAgICAgY3BpLT5ydGNkLmZkY3QuZmFzdDR4NCAgICAgICAgICAgICAgICAgICA9IHZwOF9mYXN0X2ZkY3Q0eDRfYXJtdjY7Ci0gICAgICAgIGNwaS0+cnRjZC5mZGN0LmZhc3Q4eDQgICAgICAgICAgICAgICAgICAgPSB2cDhfZmFzdF9mZGN0OHg0X2FybXY2OwotICAgICAgICBjcGktPnJ0Y2QuZmRjdC53YWxzaF9zaG9ydDR4NCAgICAgICAgICAgID0gdnA4X3Nob3J0X3dhbHNoNHg0X2FybXY2OwotCi0gICAgICAgIC8qY3BpLT5ydGNkLmVuY29kZW1iLmJlcnIgICAgICAgICAgICAgICAgICA9IHZwOF9ibG9ja19lcnJvcl9jOwotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIubWJlcnIgICAgICAgICAgICAgICAgID0gdnA4X21iYmxvY2tfZXJyb3JfYzsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLm1idXZlcnIgICAgICAgICAgICAgICA9IHZwOF9tYnV2ZXJyb3JfYzsqLwotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuc3ViYiAgICAgICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X2JfYXJtdjY7Ci0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5zdWJtYnkgICAgICAgICAgICAgICAgPSB2cDhfc3VidHJhY3RfbWJ5X2FybXY2OwotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuc3VibWJ1diAgICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X21idXZfYXJtdjY7Ci0KLSAgICAgICAgLypjcGktPnJ0Y2QucXVhbnRpemUucXVhbnRiICAgICAgICAgICAgICAgID0gdnA4X3JlZ3VsYXJfcXVhbnRpemVfYjsqLwotICAgICAgICBjcGktPnJ0Y2QucXVhbnRpemUuZmFzdHF1YW50YiAgICAgICAgICAgID0gdnA4X2Zhc3RfcXVhbnRpemVfYl9hcm12NjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmIEhBVkVfQVJNVjcKLSAgICBpZiAoaGFzX25lb24pCi0gICAgewotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4MTYgICAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQxNng4ICAgICAgICAgICAgICAgPSB2cDhfc2FkMTZ4OF9uZW9uOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkOHgxNiAgICAgICAgICAgICAgID0gdnA4X3NhZDh4MTZfbmVvbjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4OCAgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDhfbmVvbjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDR4NCAgICAgICAgICAgICAgICA9IHZwOF9zYWQ0eDRfbmVvbjsKLQotICAgICAgICAvKmNwaS0+cnRjZC52YXJpYW5jZS52YXI0eDQgICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U0eDRfYzsqLwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyOHg4ICAgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHg4X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXI4eDE2ICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U4eDE2X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXIxNng4ICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNng4X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXIxNngxNiAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNngxNl9uZW9uOwotCi0gICAgICAgIC8qY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjR4NCAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYzsqLwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyOHg4ICAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9uOwotICAgICAgICAvKmNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXI4eDE2ICAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9jOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyMTZ4OCAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfYzsqLwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyMTZ4MTYgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5oYWxmcGl4dmFyMTZ4MTZfaCAgICAgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbmVvbjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl92ICAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9uZW9uOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuaGFsZnBpeHZhcjE2eDE2X2h2ICAgID0gdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9uZW9uOwotCi0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5tc2UxNngxNiAgICAgICAgICAgICAgPSB2cDhfbXNlMTZ4MTZfbmVvbjsKLSAgICAgICAgLypjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0bWJzcyAgICAgICAgICAgICAgID0gdnA4X2dldF9tYl9zc19jOyovCi0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDE2eDE2cHJlZGVycm9yICAgICA9IHZwOF9nZXQxNngxNnByZWRfZXJyb3JfbmVvbjsKLSAgICAgICAgLypjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0OHg4dmFyICAgICAgICAgICAgID0gdnA4X2dldDh4OHZhcl9jOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0MTZ4MTZ2YXIgICAgICAgICAgID0gdnA4X2dldDE2eDE2dmFyX2M7Ki8KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDR4NHNzZV9jcyAgICAgICAgICA9IHZwOF9nZXQ0eDRzc2VfY3NfbmVvbjsKLQotICAgICAgICBjcGktPnJ0Y2QuZmRjdC5zaG9ydDR4NCAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfbmVvbjsKLSAgICAgICAgY3BpLT5ydGNkLmZkY3Quc2hvcnQ4eDQgICAgICAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0OHg0X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC5mZGN0LmZhc3Q0eDQgICAgICAgICAgICAgICAgICAgPSB2cDhfZmFzdF9mZGN0NHg0X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC5mZGN0LmZhc3Q4eDQgICAgICAgICAgICAgICAgICAgPSB2cDhfZmFzdF9mZGN0OHg0X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC5mZGN0LndhbHNoX3Nob3J0NHg0ICAgICAgICAgICAgPSB2cDhfc2hvcnRfd2Fsc2g0eDRfbmVvbjsKLQotICAgICAgICAvKmNwaS0+cnRjZC5lbmNvZGVtYi5iZXJyICAgICAgICAgICAgICAgICAgPSB2cDhfYmxvY2tfZXJyb3JfYzsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLm1iZXJyICAgICAgICAgICAgICAgICA9IHZwOF9tYmJsb2NrX2Vycm9yX2M7Ci0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5tYnV2ZXJyICAgICAgICAgICAgICAgPSB2cDhfbWJ1dmVycm9yX2M7Ki8KLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLnN1YmIgICAgICAgICAgICAgICAgICA9IHZwOF9zdWJ0cmFjdF9iX25lb247Ci0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5zdWJtYnkgICAgICAgICAgICAgICAgPSB2cDhfc3VidHJhY3RfbWJ5X25lb247Ci0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5zdWJtYnV2ICAgICAgICAgICAgICAgPSB2cDhfc3VidHJhY3RfbWJ1dl9uZW9uOwotCi0gICAgICAgIC8qY3BpLT5ydGNkLnF1YW50aXplLnF1YW50YiAgICAgICAgICAgICAgICA9IHZwOF9yZWd1bGFyX3F1YW50aXplX2I7Ci0gICAgICAgIGNwaS0+cnRjZC5xdWFudGl6ZS5mYXN0cXVhbnRiICAgICAgICAgICAgPSB2cDhfZmFzdF9xdWFudGl6ZV9iX2M7Ki8KLSAgICAgICAgLyogVGhlIG5lb24gcXVhbnRpemVyIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIG1hdGNoIHRoZSBuZXcgZXhhY3QKLSAgICAgICAgICogcXVhbnRpemVyIGludHJvZHVjZWQgaW4gY29tbWl0IGUwNGUyOTM1Ci0gICAgICAgICAqLwotICAgICAgICAvKmNwaS0+cnRjZC5xdWFudGl6ZS5mYXN0cXVhbnRiICAgICAgICAgICAgPSB2cDhfZmFzdF9xdWFudGl6ZV9iX25lb247Ki8KLSAgICB9Ci0jZW5kaWYKLQotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgaWYgKGhhc19uZW9uKQotI2VuZGlmCi0gICAgewotICAgICAgICB2cDhfeXYxMl9jb3B5X3BhcnRpYWxfZnJhbWVfcHRyID0gdnB4eXYxMl9jb3B5X3BhcnRpYWxfZnJhbWVfbmVvbjsKLSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybXY1dGUvYm9vbGh1ZmZfYXJtdjV0ZS5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS9ib29saHVmZl9hcm12NXRlLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwNWY1Ny4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS9ib29saHVmZl9hcm12NXRlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUIHx2cDhfc3RhcnRfZW5jb2RlfAotICAgIEVYUE9SVCB8dnA4X2VuY29kZV9ib29sfAotICAgIEVYUE9SVCB8dnA4X3N0b3BfZW5jb2RlfAotICAgIEVYUE9SVCB8dnA4X2VuY29kZV92YWx1ZXwKLQotICAgIElOQ0xVREUgYXNtX2VuY19vZmZzZXRzLmFzbQotCi0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkKLQotOyByMCBCT09MX0NPREVSICpicgotOyByMSB1bnNpZ25lZCBjaGFyICpzb3VyY2UKLQotfHZwOF9zdGFydF9lbmNvZGV8IFBST0MKLSAgICBtb3YgICAgIHIxMiwgIzAKLSAgICBtb3YgICAgIHIzLCAgIzI1NQotICAgIG12biAgICAgcjIsICAjMjMKLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KLSAgICBzdHIgICAgIHIzLCAgW3IwLCAjdnA4X3dyaXRlcl9yYW5nZV0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjdnA4X3dyaXRlcl92YWx1ZV0KLSAgICBzdHIgICAgIHIyLCAgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgc3RyICAgICByMSwgIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGJ4ICAgICAgbHIKLSAgICBFTkRQCi0KLTsgcjAgQk9PTF9DT0RFUiAqYnIKLTsgcjEgaW50IGJpdAotOyByMiBpbnQgcHJvYmFiaWxpdHkKLXx2cDhfZW5jb2RlX2Jvb2x8IFBST0MKLSAgICBwdXNoICAgIHtyNC1yOSwgbHJ9Ci0KLSAgICBtb3YgICAgIHI0LCByMgotCi0gICAgbGRyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KLSAgICBsZHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQotICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCi0KLSAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKLQotICAgIGNtcCAgICAgcjEsICMwCi0gICAgbXVsICAgICByNCwgcjQsIHI3ICAgICAgICAgICAgICAgICAgOyAoKHJhbmdlLTEpICogcHJvYmFiaWxpdHkpCi0KLSAgICBtb3YgICAgIHI3LCAjMQotICAgIGFkZCAgICAgcjQsIHI3LCByNCwgbHNyICM4ICAgICAgICAgIDsgMSArICgoKHJhbmdlLTEpICogcHJvYmFiaWxpdHkpID4+IDgpCi0KLSAgICBhZGRuZSAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYml0KSBsb3d2YWx1ZSArPSBzcGxpdAotICAgIHN1Ym5lICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiaXQpIHJhbmdlID0gcmFuZ2Utc3BsaXQKLQotICAgIDsgQ291bnRpbmcgdGhlIGxlYWRpbmcgemVyb3MgaXMgdXNlZCB0byBub3JtYWxpemUgcmFuZ2UuCi0gICAgY2x6ICAgICByNiwgcjQKLSAgICBzdWIgICAgIHI2LCByNiwgIzI0ICAgICAgICAgICAgICAgICA7IHNoaWZ0Ci0KLSAgICA7IEZsYWcgaXMgc2V0IG9uIHRoZSBzdW0gb2YgY291bnQuICBUaGlzIGZsYWcgaXMgdXNlZCBsYXRlcgotICAgIDsgdG8gZGV0ZXJtaW5lIGlmIGNvdW50ID49IDAKLSAgICBhZGRzICAgIHIzLCByMywgcjYgICAgICAgICAgICAgICAgICA7IGNvdW50ICs9IHNoaWZ0Ci0gICAgbHNsICAgICByNSwgcjQsIHI2ICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gc2hpZnQKLSAgICBibWkgICAgIHRva2VuX2NvdW50X2x0X3plcm8gICAgICAgICA7IGlmKGNvdW50ID49IDApCi0KLSAgICBzdWIgICAgIHI2LCByNiwgcjMgICAgICAgICAgICAgICAgICA7IG9mZnNldCA9IHNoaWZ0IC0gY291bnQKLSAgICBzdWIgICAgIHI0LCByNiwgIzEgICAgICAgICAgICAgICAgICA7IG9mZnNldC0xCi0gICAgbHNscyAgICByNCwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZigobG93dmFsdWU8PChvZmZzZXQtMSkpICYgMHg4MDAwMDAwMCApCi0gICAgYnBsICAgICB0b2tlbl9oaWdoX2JpdF9ub3Rfc2V0Ci0KLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHgKLSAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHggPSB3LT5wb3MtMQotICAgIGIgICAgICAgdG9rZW5femVyb193aGlsZV9zdGFydAotdG9rZW5femVyb193aGlsZV9sb29wCi0gICAgbW92ICAgICByOSwgIzAKLSAgICBzdHJiICAgIHI5LCBbcjcsIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCi10b2tlbl96ZXJvX3doaWxlX3N0YXJ0Ci0gICAgY21wICAgICByNCwgIzAKLSAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxLCBbcjcsIHI0XQotICAgIGNtcGdlICAgcjEsICMweGZmCi0gICAgYmVxICAgICB0b2tlbl96ZXJvX3doaWxlX2xvb3AKLQotICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjksIFtyNywgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdCi0gICAgYWRkICAgICByOSwgcjksICMxCi0gICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCi10b2tlbl9oaWdoX2JpdF9ub3Rfc2V0Ci0gICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKLSAgICBsZHIgICAgIHI5LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB3LT5wb3MKLSAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKLSAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKLSAgICBhZGQgICAgIHIxLCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHctPnBvcysrCi0gICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgotICAgIHN0ciAgICAgcjEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAotICAgIHN0cmIgICAgcjcsIFtyOSwgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3ctPnBvcysrXQotCi10b2tlbl9jb3VudF9sdF96ZXJvCi0gICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gc2hpZnQKLQotICAgIHN0ciAgICAgcjIsIFtyMCwgI3ZwOF93cml0ZXJfbG93dmFsdWVdCi0gICAgc3RyICAgICByNSwgW3IwLCAjdnA4X3dyaXRlcl9yYW5nZV0KLSAgICBzdHIgICAgIHIzLCBbcjAsICN2cDhfd3JpdGVyX2NvdW50XQotICAgIHBvcCAgICAge3I0LXI5LCBwY30KLSAgICBFTkRQCi0KLTsgcjAgQk9PTF9DT0RFUiAqYnIKLXx2cDhfc3RvcF9lbmNvZGV8IFBST0MKLSAgICBwdXNoICAgIHtyNC1yMTAsIGxyfQotCi0gICAgbGRyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KLSAgICBsZHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQotICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCi0KLSAgICBtb3YgICAgIHIxMCwgIzMyCi0KLXN0b3BfZW5jb2RlX2xvb3AKLSAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKLQotICAgIG1vdiAgICAgcjQsIHI3LCBsc2wgIzcgICAgICAgICAgICAgIDsgKChyYW5nZS0xKSAqIDEyOCkKLQotICAgIG1vdiAgICAgcjcsICMxCi0gICAgYWRkICAgICByNCwgcjcsIHI0LCBsc3IgIzggICAgICAgICAgOyAxICsgKCgocmFuZ2UtMSkgKiAxMjgpID4+IDgpCi0KLSAgICA7IENvdW50aW5nIHRoZSBsZWFkaW5nIHplcm9zIGlzIHVzZWQgdG8gbm9ybWFsaXplIHJhbmdlLgotICAgIGNseiAgICAgcjYsIHI0Ci0gICAgc3ViICAgICByNiwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyBzaGlmdAotCi0gICAgOyBGbGFnIGlzIHNldCBvbiB0aGUgc3VtIG9mIGNvdW50LiAgVGhpcyBmbGFnIGlzIHVzZWQgbGF0ZXIKLSAgICA7IHRvIGRldGVybWluZSBpZiBjb3VudCA+PSAwCi0gICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAotICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0Ci0gICAgYm1pICAgICB0b2tlbl9jb3VudF9sdF96ZXJvX3NlICAgICAgOyBpZihjb3VudCA+PSAwKQotCi0gICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgPSBzaGlmdCAtIGNvdW50Ci0gICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQotICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQotICAgIGJwbCAgICAgdG9rZW5faGlnaF9iaXRfbm90X3NldF9zZQotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4Ci0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zLTEKLSAgICBiICAgICAgIHRva2VuX3plcm9fd2hpbGVfc3RhcnRfc2UKLXRva2VuX3plcm9fd2hpbGVfbG9vcF9zZQotICAgIG1vdiAgICAgcjksICMwCi0gICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKLSAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQotdG9rZW5femVyb193aGlsZV9zdGFydF9zZQotICAgIGNtcCAgICAgcjQsICMwCi0gICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMSwgW3I3LCByNF0KLSAgICBjbXBnZSAgIHIxLCAjMHhmZgotICAgIGJlcSAgICAgdG9rZW5femVyb193aGlsZV9sb29wX3NlCi0KLSAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHI5LCBbcjcsIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XQotICAgIGFkZCAgICAgcjksIHI5LCAjMQotICAgIHN0cmIgICAgcjksIFtyNywgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdICsgMQotdG9rZW5faGlnaF9iaXRfbm90X3NldF9zZQotICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0Ci0gICAgbGRyICAgICByOSwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgdy0+cG9zCi0gICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gb2Zmc2V0Ci0gICAgbW92ICAgICByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCA9IGNvdW50Ci0gICAgYWRkICAgICByMSwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKwotICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKLSAgICBzdHIgICAgIHIxLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KLSAgICBzdWIgICAgIHIzLCByMywgIzggICAgICAgICAgICAgICAgICA7IGNvdW50IC09IDgKLSAgICBzdHJiICAgIHI3LCBbcjksIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK10KLQotdG9rZW5fY291bnRfbHRfemVyb19zZQotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IHNoaWZ0Ci0KLSAgICBzdWJzICAgIHIxMCwgcjEwLCAjMQotICAgIGJuZSAgICAgc3RvcF9lbmNvZGVfbG9vcAotCi0gICAgc3RyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KLSAgICBzdHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQotICAgIHN0ciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCi0gICAgcG9wICAgICB7cjQtcjEwLCBwY30KLQotICAgIEVORFAKLQotOyByMCBCT09MX0NPREVSICpicgotOyByMSBpbnQgZGF0YQotOyByMiBpbnQgYml0cwotfHZwOF9lbmNvZGVfdmFsdWV8IFBST0MKLSAgICBwdXNoICAgIHtyNC1yMTEsIGxyfQotCi0gICAgbW92ICAgICByMTAsIHIyCi0KLSAgICBsZHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQotICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCi0gICAgbGRyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KLQotICAgIHJzYiAgICAgcjQsIHIxMCwgIzMyICAgICAgICAgICAgICAgICA7IDMyLW4KLQotICAgIDsgdiBpcyBrZXB0IGluIHIxIGR1cmluZyB0aGUgdG9rZW4gcGFjayBsb29wCi0gICAgbHNsICAgICByMSwgcjEsIHI0ICAgICAgICAgICAgICAgICAgOyByMSA9IHYgPDwgMzIgLSBuCi0KLWVuY29kZV92YWx1ZV9sb29wCi0gICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCi0KLSAgICA7IERlY2lzaW9ucyBhcmUgbWFkZSBiYXNlZCBvbiB0aGUgYml0IHZhbHVlIHNoaWZ0ZWQKLSAgICA7IG9mZiBvZiB2LCBzbyBzZXQgYSBmbGFnIGhlcmUgYmFzZWQgb24gdGhpcy4KLSAgICA7IFRoaXMgdmFsdWUgaXMgcmVmZXJlZCB0byBhcyAiYmIiCi0gICAgbHNscyAgICByMSwgcjEsICMxICAgICAgICAgICAgICAgICAgOyBiaXQgPSB2ID4+IG4KLSAgICBtb3YgICAgIHI0LCByNywgbHNsICM3ICAgICAgICAgICAgICA7ICgocmFuZ2UtMSkgKiAxMjgpCi0KLSAgICBtb3YgICAgIHI3LCAjMQotICAgIGFkZCAgICAgcjQsIHI3LCByNCwgbHNyICM4ICAgICAgICAgIDsgMSArICgoKHJhbmdlLTEpICogMTI4KSA+PiA4KQotCi0gICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJpdCkgbG93dmFsdWUgKz0gc3BsaXQKLSAgICBzdWJjcyAgIHI0LCByNSwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYml0KSByYW5nZSA9IHJhbmdlLXNwbGl0Ci0KLSAgICA7IENvdW50aW5nIHRoZSBsZWFkaW5nIHplcm9zIGlzIHVzZWQgdG8gbm9ybWFsaXplIHJhbmdlLgotICAgIGNseiAgICAgcjYsIHI0Ci0gICAgc3ViICAgICByNiwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyBzaGlmdAotCi0gICAgOyBGbGFnIGlzIHNldCBvbiB0aGUgc3VtIG9mIGNvdW50LiAgVGhpcyBmbGFnIGlzIHVzZWQgbGF0ZXIKLSAgICA7IHRvIGRldGVybWluZSBpZiBjb3VudCA+PSAwCi0gICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAotICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0Ci0gICAgYm1pICAgICB0b2tlbl9jb3VudF9sdF96ZXJvX2V2ICAgICAgOyBpZihjb3VudCA+PSAwKQotCi0gICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgPSBzaGlmdCAtIGNvdW50Ci0gICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQotICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQotICAgIGJwbCAgICAgdG9rZW5faGlnaF9iaXRfbm90X3NldF9ldgotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4Ci0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zLTEKLSAgICBiICAgICAgIHRva2VuX3plcm9fd2hpbGVfc3RhcnRfZXYKLXRva2VuX3plcm9fd2hpbGVfbG9vcF9ldgotICAgIG1vdiAgICAgcjksICMwCi0gICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKLSAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQotdG9rZW5femVyb193aGlsZV9zdGFydF9ldgotICAgIGNtcCAgICAgcjQsICMwCi0gICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTEsIFtyNywgcjRdCi0gICAgY21wZ2UgICByMTEsICMweGZmCi0gICAgYmVxICAgICB0b2tlbl96ZXJvX3doaWxlX2xvb3BfZXYKLQotICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjksIFtyNywgcjRdICAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdCi0gICAgYWRkICAgICByOSwgcjksICMxCi0gICAgc3RyYiAgICByOSwgW3I3LCByNF0gICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCi10b2tlbl9oaWdoX2JpdF9ub3Rfc2V0X2V2Ci0gICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKLSAgICBsZHIgICAgIHI5LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB3LT5wb3MKLSAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBvZmZzZXQKLSAgICBtb3YgICAgIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICA7IHNoaWZ0ID0gY291bnQKLSAgICBhZGQgICAgIHIxMSwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCi0gICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgotICAgIHN0ciAgICAgcjExLCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KLSAgICBzdWIgICAgIHIzLCByMywgIzggICAgICAgICAgICAgICAgICA7IGNvdW50IC09IDgKLSAgICBzdHJiICAgIHI3LCBbcjksIHI0XSAgICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt3LT5wb3MrK10KLQotdG9rZW5fY291bnRfbHRfemVyb19ldgotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IHNoaWZ0Ci0KLSAgICBzdWJzICAgIHIxMCwgcjEwLCAjMQotICAgIGJuZSAgICAgZW5jb2RlX3ZhbHVlX2xvb3AKLQotICAgIHN0ciAgICAgcjIsIFtyMCwgI3ZwOF93cml0ZXJfbG93dmFsdWVdCi0gICAgc3RyICAgICByNSwgW3IwLCAjdnA4X3dyaXRlcl9yYW5nZV0KLSAgICBzdHIgICAgIHIzLCBbcjAsICN2cDhfd3JpdGVyX2NvdW50XQotICAgIHBvcCAgICAge3I0LXIxMSwgcGN9Ci0gICAgRU5EUAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19hcm12NS5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19hcm12NS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzkyODcuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfYXJtdjUuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgfHZwOGN4X3BhY2tfdG9rZW5zX2FybXY1fAotCi0gICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCi0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWQotCi07IHIwIHZwOF93cml0ZXIgKncKLTsgcjEgY29uc3QgVE9LRU5FWFRSQSAqcAotOyByMiBpbnQgeGNvdW50Ci07IHIzIHZwOF9jb2VmX2VuY29kaW5ncwotOyBzMCB2cDhfZXh0cmFfYml0cwotOyBzMSB2cDhfY29lZl90cmVlCi18dnA4Y3hfcGFja190b2tlbnNfYXJtdjV8IFBST0MKLSAgICBwdXNoICAgIHtyNC1yMTEsIGxyfQotCi0gICAgOyBBZGQgc2l6ZSBvZiB4Y291bnQgKiBzaXplb2YgKFRPS0VORVhUUkEpIHRvIGdldCBzdG9wCi0gICAgOyAgc2l6ZW9mIChUT0tFTkVYVFJBKSBpcyA4Ci0gICAgc3ViICAgICBzcCwgc3AsICMxMgotICAgIGFkZCAgICAgcjIsIHIxLCByMiwgbHNsICMzICAgICAgICAgIDsgc3RvcCA9IHAgKyB4Y291bnQqc2l6ZW9mKFRPS0VORVhUUkEpCi0gICAgc3RyICAgICByMiwgW3NwLCAjMF0KLSAgICBzdHIgICAgIHIzLCBbc3AsICM4XSAgICAgICAgICAgICAgICA7IHNhdmUgdnA4X2NvZWZfZW5jb2RpbmdzCi0gICAgbGRyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KLSAgICBsZHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQotICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCi0gICAgYiAgICAgICBjaGVja19wX2x0X3N0b3AKLQotd2hpbGVfcF9sdF9zdG9wCi0gICAgbGRyYiAgICByNiwgW3IxLCAjdG9rZW5leHRyYV90b2tlbl0gOyB0Ci0gICAgbGRyICAgICByNCwgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyB2cDhfY29lZl9lbmNvZGluZ3MKLSAgICBtb3YgICAgIGxyLCAjMAotICAgIGFkZCAgICAgcjQsIHI0LCByNiwgbHNsICMzICAgICAgICAgIDsgYSA9IHZwOF9jb2VmX2VuY29kaW5ncyArIHQKLSAgICBsZHIgICAgIHI5LCBbcjEsICN0b2tlbmV4dHJhX2NvbnRleHRfdHJlZV0gICA7IHBwCi0KLSAgICBsZHJiICAgIHI3LCBbcjEsICN0b2tlbmV4dHJhX3NraXBfZW9iX25vZGVdCi0KLSAgICBsZHIgICAgIHI2LCBbcjQsICN2cDhfdG9rZW5fdmFsdWVdICA7IHYKLSAgICBsZHIgICAgIHI4LCBbcjQsICN2cDhfdG9rZW5fbGVuXSAgICA7IG4KLQotICAgIDsgdnA4IHNwZWNpZmljIHNraXBfZW9iX25vZGUKLSAgICBjbXAgICAgIHI3LCAjMAotICAgIG1vdm5lICAgbHIsICMyICAgICAgICAgICAgICAgICAgICAgIDsgaSA9IDIKLSAgICBzdWJuZSAgIHI4LCByOCwgIzEgICAgICAgICAgICAgICAgICA7IC0tbgotCi0gICAgcnNiICAgICByNCwgcjgsICMzMiAgICAgICAgICAgICAgICAgOyAzMi1uCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzUyXSAgICAgICAgICAgICAgOyB2cDhfY29lZl90cmVlCi0KLSAgICA7IHYgaXMga2VwdCBpbiByMTIgZHVyaW5nIHRoZSB0b2tlbiBwYWNrIGxvb3AKLSAgICBsc2wgICAgIHIxMiwgcjYsIHI0ICAgICAgICAgICAgICAgIDsgcjEyID0gdiA8PCAzMiAtIG4KLQotOyBsb29wIHN0YXJ0Ci10b2tlbl9sb29wCi0gICAgbGRyYiAgICByNCwgW3I5LCBsciwgYXNyICMxXSAgICAgICAgOyBwcCBbaT4+MV0KLSAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKLQotICAgIDsgRGVjaXNpb25zIGFyZSBtYWRlIGJhc2VkIG9uIHRoZSBiaXQgdmFsdWUgc2hpZnRlZAotICAgIDsgb2ZmIG9mIHYsIHNvIHNldCBhIGZsYWcgaGVyZSBiYXNlZCBvbiB0aGlzLgotICAgIDsgVGhpcyB2YWx1ZSBpcyByZWZlcmVkIHRvIGFzICJiYiIKLSAgICBsc2xzICAgIHIxMiwgcjEyLCAjMSAgICAgICAgICAgICAgICA7IGJiID0gdiA+PiBuCi0gICAgbXVsICAgICByNCwgcjQsIHI3ICAgICAgICAgICAgICAgICAgOyAoKHJhbmdlLTEpICogcHBbaT4+MV0pKQotCi0gICAgOyBiYiBjYW4gb25seSBiZSAwIG9yIDEuICBTbyBvbmx5IGV4ZWN1dGUgdGhpcyBzdGF0ZW1lbnQKLSAgICA7IGlmIGJiID09IDEsIG90aGVyd2lzZSBpdCB3aWxsIGFjdCBsaWtlIGkgKyAwCi0gICAgYWRkY3MgICBsciwgbHIsICMxICAgICAgICAgICAgICAgICAgOyBpICsgYmIKLQotICAgIG1vdiAgICAgcjcsICMxCi0gICAgbGRyc2IgICBsciwgW3IxMCwgbHJdICAgICAgICAgICAgICAgOyBpID0gdnA4X2NvZWZfdHJlZVtpK2JiXQotICAgIGFkZCAgICAgcjQsIHI3LCByNCwgbHNyICM4ICAgICAgICAgIDsgMSArICgoKHJhbmdlLTEpICogcHBbaT4+MV0pID4+IDgpCi0KLSAgICBhZGRjcyAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYmIpIGxvd3ZhbHVlICs9IHNwbGl0Ci0gICAgc3ViY3MgICByNCwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSByYW5nZSA9IHJhbmdlLXNwbGl0Ci0KLSAgICA7IENvdW50aW5nIHRoZSBsZWFkaW5nIHplcm9zIGlzIHVzZWQgdG8gbm9ybWFsaXplIHJhbmdlLgotICAgIGNseiAgICAgcjYsIHI0Ci0gICAgc3ViICAgICByNiwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyBzaGlmdAotCi0gICAgOyBGbGFnIGlzIHNldCBvbiB0aGUgc3VtIG9mIGNvdW50LiAgVGhpcyBmbGFnIGlzIHVzZWQgbGF0ZXIKLSAgICA7IHRvIGRldGVybWluZSBpZiBjb3VudCA+PSAwCi0gICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAotICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0Ci0gICAgYm1pICAgICB0b2tlbl9jb3VudF9sdF96ZXJvICAgICAgICAgOyBpZihjb3VudCA+PSAwKQotCi0gICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgPSBzaGlmdCAtIGNvdW50Ci0gICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQotICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQotICAgIGJwbCAgICAgdG9rZW5faGlnaF9iaXRfbm90X3NldAotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4Ci0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zLTEKLSAgICBiICAgICAgIHRva2VuX3plcm9fd2hpbGVfc3RhcnQKLXRva2VuX3plcm9fd2hpbGVfbG9vcAotICAgIG1vdiAgICAgcjEwLCAjMAotICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdID0odW5zaWduZWQgY2hhcikwCi0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KLXRva2VuX3plcm9fd2hpbGVfc3RhcnQKLSAgICBjbXAgICAgIHI0LCAjMAotICAgIGxkcmdlICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjExLCBbcjcsIHI0XQotICAgIGNtcGdlICAgcjExLCAjMHhmZgotICAgIGJlcSAgICAgdG9rZW5femVyb193aGlsZV9sb29wCi0KLSAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XQotICAgIGFkZCAgICAgcjEwLCByMTAsICMxCi0gICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCi10b2tlbl9oaWdoX2JpdF9ub3Rfc2V0Ci0gICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKLSAgICBsZHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgdy0+cG9zCi0gICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gb2Zmc2V0Ci0gICAgbW92ICAgICByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCA9IGNvdW50Ci0gICAgYWRkICAgICByMTEsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKwotICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKLSAgICBzdHIgICAgIHIxMSwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgc3ViICAgICByMywgcjMsICM4ICAgICAgICAgICAgICAgICAgOyBjb3VudCAtPSA4Ci0gICAgc3RyYiAgICByNywgW3IxMCwgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdCi0KLSAgICA7IHIxMCBpcyB1c2VkIGVhcmxpZXIgaW4gdGhlIGxvb3AsIGJ1dCByMTAgaXMgdXNlZCBhcwotICAgIDsgdGVtcCB2YXJpYWJsZSBoZXJlLiAgU28gYWZ0ZXIgcjEwIGlzIHVzZWQsIHJlbG9hZAotICAgIDsgdnA4X2NvZWZfdHJlZV9kY2QgaW50byByMTAKLSAgICBsZHIgICAgIHIxMCwgW3NwLCAjNTJdICAgICAgICAgICAgICA7IHZwOF9jb2VmX3RyZWUKLQotdG9rZW5fY291bnRfbHRfemVybwotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IHNoaWZ0Ci0KLSAgICBzdWJzICAgIHI4LCByOCwgIzEgICAgICAgICAgICAgICAgICA7IC0tbgotICAgIGJuZSAgICAgdG9rZW5fbG9vcAotCi0gICAgbGRyYiAgICByNiwgW3IxLCAjdG9rZW5leHRyYV90b2tlbl0gOyB0Ci0gICAgbGRyICAgICByNywgW3NwLCAjNDhdICAgICAgICAgICAgICAgOyB2cDhfZXh0cmFfYml0cwotICAgIDsgQWRkIHQgKiBzaXplb2YgKHZwOF9leHRyYV9iaXRfc3RydWN0KSB0byBnZXQgdGhlIGRlc2lyZWQKLSAgICA7ICBlbGVtZW50LiAgSGVyZSB2cDhfZXh0cmFfYml0X3N0cnVjdCA9PSAxNgotICAgIGFkZCAgICAgcjEyLCByNywgcjYsIGxzbCAjNCAgICAgICAgIDsgYiA9IHZwOF9leHRyYV9iaXRzICsgdAotCi0gICAgbGRyICAgICByNCwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X2Jhc2VfdmFsXQotICAgIGNtcCAgICAgcjQsICMwCi0gICAgYmVxICAgICBza2lwX2V4dHJhX2JpdHMKLQotOyAgIGlmKCBiLT5iYXNlX3ZhbCkKLSAgICBsZHIgICAgIHI4LCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfbGVuXSA7IEwKLSAgICBsZHJzaCAgIGxyLCBbcjEsICN0b2tlbmV4dHJhX2V4dHJhXSA7IGUgPSBwLT5FeHRyYQotICAgIGNtcCAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgIDsgaWYoIEwpCi0gICAgYmVxICAgICBub19leHRyYV9iaXRzCi0KLSAgICBsZHIgICAgIHI5LCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfcHJvYl0KLSAgICBhc3IgICAgIHI3LCBsciwgIzEgICAgICAgICAgICAgICAgICA7IHY9ZT4+MQotCi0gICAgbGRyICAgICByMTAsIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF90cmVlXQotICAgIHN0ciAgICAgcjEwLCBbc3AsICM0XSAgICAgICAgICAgICAgIDsgYi0+dHJlZQotCi0gICAgcnNiICAgICByNCwgcjgsICMzMgotICAgIGxzbCAgICAgcjEyLCByNywgcjQKLQotICAgIG1vdiAgICAgbHIsICMwICAgICAgICAgICAgICAgICAgICAgIDsgaSA9IDAKLQotZXh0cmFfYml0c19sb29wCi0gICAgbGRyYiAgICByNCwgW3I5LCBsciwgYXNyICMxXSAgICAgICAgICAgIDsgcHBbaT4+MV0KLSAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKLSAgICBsc2xzICAgIHIxMiwgcjEyLCAjMSAgICAgICAgICAgICAgICA7IHYgPj4gbgotICAgIG11bCAgICAgcjQsIHI0LCByNyAgICAgICAgICAgICAgICAgIDsgKHJhbmdlLTEpICogcHBbaT4+MV0KLSAgICBhZGRjcyAgIGxyLCBsciwgIzEgICAgICAgICAgICAgICAgICA7IGkgKyBiYgotCi0gICAgbW92ICAgICByNywgIzEKLSAgICBsZHJzYiAgIGxyLCBbcjEwLCBscl0gICAgICAgICAgICAgICA7IGkgPSBiLT50cmVlW2krYmJdCi0gICAgYWRkICAgICByNCwgcjcsIHI0LCBsc3IgIzggICAgICAgICAgOyBzcGxpdCA9IDEgKyAgKCgocmFuZ2UtMSkgKiBwcFtpPj4xXSkgPj4gOCkKLQotICAgIGFkZGNzICAgcjIsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgbG93dmFsdWUgKz0gc3BsaXQKLSAgICBzdWJjcyAgIHI0LCByNSwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYmIpIHJhbmdlID0gcmFuZ2Utc3BsaXQKLQotICAgIGNseiAgICAgcjYsIHI0Ci0gICAgc3ViICAgICByNiwgcjYsICMyNAotCi0gICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAotICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0Ci0gICAgYm1pICAgICBleHRyYV9jb3VudF9sdF96ZXJvICAgICAgICAgOyBpZihjb3VudCA+PSAwKQotCi0gICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQ9IHNoaWZ0IC0gY291bnQKLSAgICBzdWIgICAgIHI0LCByNiwgIzEgICAgICAgICAgICAgICAgICA7IG9mZnNldC0xCi0gICAgbHNscyAgICByNCwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZigobG93dmFsdWU8PChvZmZzZXQtMSkpICYgMHg4MDAwMDAwMCApCi0gICAgYnBsICAgICBleHRyYV9oaWdoX2JpdF9ub3Rfc2V0Ci0KLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHgKLSAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHggPSB3LT5wb3MgLSAxCi0gICAgYiAgICAgICBleHRyYV96ZXJvX3doaWxlX3N0YXJ0Ci1leHRyYV96ZXJvX3doaWxlX2xvb3AKLSAgICBtb3YgICAgIHIxMCwgIzAKLSAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCi1leHRyYV96ZXJvX3doaWxlX3N0YXJ0Ci0gICAgY21wICAgICByNCwgIzAKLSAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxMSwgW3I3LCByNF0KLSAgICBjbXBnZSAgIHIxMSwgIzB4ZmYKLSAgICBiZXEgICAgIGV4dHJhX3plcm9fd2hpbGVfbG9vcAotCi0gICAgbGRyICAgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTAsIFtyNywgcjRdCi0gICAgYWRkICAgICByMTAsIHIxMCwgIzEKLSAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0KLWV4dHJhX2hpZ2hfYml0X25vdF9zZXQKLSAgICByc2IgICAgIHI0LCByNiwgIzI0ICAgICAgICAgICAgICAgICA7IDI0LW9mZnNldAotICAgIGxkciAgICAgcjEwLCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsc3IgICAgIHI3LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+ICgyNC1vZmZzZXQpCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gb2Zmc2V0Ci0gICAgbW92ICAgICByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCA9IGNvdW50Ci0gICAgYWRkICAgICByMTEsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKwotICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKLSAgICBzdHIgICAgIHIxMSwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgc3ViICAgICByMywgcjMsICM4ICAgICAgICAgICAgICAgICAgOyBjb3VudCAtPSA4Ci0gICAgc3RyYiAgICByNywgW3IxMCwgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdPShsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KSkKLSAgICBsZHIgICAgIHIxMCwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGItPnRyZWUKLWV4dHJhX2NvdW50X2x0X3plcm8KLSAgICBsc2wgICAgIHIyLCByMiwgcjYKLQotICAgIHN1YnMgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgIDsgLS1uCi0gICAgYm5lICAgICBleHRyYV9iaXRzX2xvb3AgICAgICAgICAgICAgOyB3aGlsZSAobikKLQotbm9fZXh0cmFfYml0cwotICAgIGxkciAgICAgbHIsIFtyMSwgIzRdICAgICAgICAgICAgICAgIDsgZSA9IHAtPkV4dHJhCi0gICAgYWRkICAgICByNCwgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZSArIDEKLSAgICB0c3QgICAgIGxyLCAjMQotICAgIGxzciAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgc3BsaXQgPSAocmFuZ2UgKyAxKSA+PiAxCi0gICAgYWRkbmUgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSArPSBzcGxpdAotICAgIHN1Ym5lICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPSByYW5nZS1zcGxpdAotICAgIHRzdCAgICAgcjIsICMweDgwMDAwMDAwICAgICAgICAgICAgIDsgbG93dmFsdWUgJiAweDgwMDAwMDAwCi0gICAgbHNsICAgICByNSwgcjQsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZSA8PD0gMQotICAgIGJlcSAgICAgZW5kX2hpZ2hfYml0X25vdF9zZXQKLQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIG1vdiAgICAgcjcsICMwCi0gICAgc3ViICAgICByNCwgcjQsICMxCi0gICAgYiAgICAgICBlbmRfemVyb193aGlsZV9zdGFydAotZW5kX3plcm9fd2hpbGVfbG9vcAotICAgIHN0cmIgICAgcjcsIFtyNiwgcjRdCi0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KLWVuZF96ZXJvX3doaWxlX3N0YXJ0Ci0gICAgY21wICAgICByNCwgIzAKLSAgICBsZHJnZSAgIHI2LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxMiwgW3I2LCByNF0KLSAgICBjbXBnZSAgIHIxMiwgIzB4ZmYKLSAgICBiZXEgICAgIGVuZF96ZXJvX3doaWxlX2xvb3AKLQotICAgIGxkciAgICAgcjYsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjcsIFtyNiwgcjRdCi0gICAgYWRkICAgICByNywgcjcsICMxCi0gICAgc3RyYiAgICByNywgW3I2LCByNF0KLWVuZF9oaWdoX2JpdF9ub3Rfc2V0Ci0gICAgYWRkcyAgICByMywgcjMsICMxICAgICAgICAgICAgICAgICAgOyArK2NvdW50Ci0gICAgbHNsICAgICByMiwgcjIsICMxICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSAgPDw9IDEKLSAgICBibmUgICAgIGVuZF9jb3VudF96ZXJvCi0KLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KLSAgICBtdm4gICAgIHIzLCAjNwotICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxzciAgICAgcjYsIHIyLCAjMjQgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gMjQKLSAgICBhZGQgICAgIHIxMiwgcjQsICMxICAgICAgICAgICAgICAgICA7IHctPnBvcysrCi0gICAgYmljICAgICByMiwgcjIsICMweGZmMDAwMDAwICAgICAgICAgOyBsb3d2YWx1ZSAmPSAweGZmZmZmZgotICAgIHN0ciAgICAgcjEyLCBbcjAsICMweDEwXQotICAgIHN0cmIgICAgcjYsIFtyNywgcjRdCi1lbmRfY291bnRfemVybwotc2tpcF9leHRyYV9iaXRzCi0gICAgYWRkICAgICByMSwgcjEsICNUT0tFTkVYVFJBX1NaICAgICAgOyArK3AKLWNoZWNrX3BfbHRfc3RvcAotICAgIGxkciAgICAgcjQsIFtzcCwgIzBdICAgICAgICAgICAgICAgIDsgc3RvcAotICAgIGNtcCAgICAgcjEsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgd2hpbGUoIHAgPCBzdG9wKQotICAgIGJjYyAgICAgd2hpbGVfcF9sdF9zdG9wCi0KLSAgICBzdHIgICAgIHIyLCBbcjAsICN2cDhfd3JpdGVyX2xvd3ZhbHVlXQotICAgIHN0ciAgICAgcjUsIFtyMCwgI3ZwOF93cml0ZXJfcmFuZ2VdCi0gICAgc3RyICAgICByMywgW3IwLCAjdnA4X3dyaXRlcl9jb3VudF0KLSAgICBhZGQgICAgIHNwLCBzcCwgIzEyCi0gICAgcG9wICAgICB7cjQtcjExLCBwY30KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX21icm93X2FybXY1LmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX21icm93X2FybXY1LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyYmJhNi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19tYnJvd19hcm12NS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCB8dnA4Y3hfcGFja19tYl9yb3dfdG9rZW5zX2FybXY1fAotCi0gICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCi0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWQotCi07IHIwIFZQOF9DT01QICpjcGkKLTsgcjEgdnA4X3dyaXRlciAqdwotOyByMiB2cDhfY29lZl9lbmNvZGluZ3MKLTsgcjMgdnA4X2V4dHJhX2JpdHMKLTsgczAgdnA4X2NvZWZfdHJlZQotCi18dnA4Y3hfcGFja19tYl9yb3dfdG9rZW5zX2FybXY1fCBQUk9DCi0gICAgcHVzaCAgICB7cjQtcjExLCBscn0KLSAgICBzdWIgICAgIHNwLCBzcCwgIzI0Ci0KLSAgICA7IENvbXB1dGUgYWRkcmVzcyBvZiBjcGktPmNvbW1vbi5tYl9yb3dzCi0gICAgbGRyICAgICByNCwgX1ZQOF9DT01QX2NvbW1vbl8KLSAgICBsZHIgICAgIHI2LCBfVlA4X0NPTU1PTl9NQnJvd3NfCi0gICAgYWRkICAgICByNCwgcjAsIHI0Ci0KLSAgICBsZHIgICAgIHI1LCBbcjQsIHI2XSAgICAgICAgICAgICAgICA7IGxvYWQgdXAgbWJfcm93cwotCi0gICAgc3RyICAgICByMiwgW3NwLCAjMjBdICAgICAgICAgICAgICAgOyBzYXZlIHZwOF9jb2VmX2VuY29kaW5ncwotICAgIHN0ciAgICAgcjUsIFtzcCwgIzEyXSAgICAgICAgICAgICAgIDsgc2F2ZSBtYl9yb3dzCi0gICAgc3RyICAgICByMywgW3NwLCAjOF0gICAgICAgICAgICAgICAgOyBzYXZlIHZwOF9leHRyYV9iaXRzCi0KLSAgICBsZHIgICAgIHI0LCBfVlA4X0NPTVBfdHBsaXN0XwotICAgIGFkZCAgICAgcjQsIHIwLCByNAotICAgIGxkciAgICAgcjcsIFtyNCwgIzBdICAgICAgICAgICAgICAgIDsgZGVyZWZlcmVuY2UgY3BpLT50cF9saXN0Ci0KLSAgICBtb3YgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgICAgICA7IGtlZXAgc2FtZSBhcyBvdGhlciBsb29wcwotCi0gICAgbGRyICAgICByMiwgW3IwLCAjdnA4X3dyaXRlcl9sb3d2YWx1ZV0KLSAgICBsZHIgICAgIHI1LCBbcjAsICN2cDhfd3JpdGVyX3JhbmdlXQotICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF93cml0ZXJfY291bnRdCi0KLW1iX3Jvd19sb29wCi0KLSAgICBsZHIgICAgIHIxLCBbcjcsICN0b2tlbmxpc3Rfc3RhcnRdCi0gICAgbGRyICAgICByOSwgW3I3LCAjdG9rZW5saXN0X3N0b3BdCi0gICAgc3RyICAgICByOSwgW3NwLCAjMF0gICAgICAgICAgICAgICAgOyBzYXZlIHN0b3AgZm9yIGxhdGVyIGNvbXBhcmlzb24KLSAgICBzdHIgICAgIHI3LCBbc3AsICMxNl0gICAgICAgICAgICAgICA7IHRva2VubGlzdCBhZGRyZXNzIGZvciBuZXh0IHRpbWUKLQotICAgIGIgICAgICAgY2hlY2tfcF9sdF9zdG9wCi0KLSAgICA7IGFjdHVhbGwgd29yayBnZXRzIGRvbmUgaGVyZSEKLQotd2hpbGVfcF9sdF9zdG9wCi0gICAgbGRyYiAgICByNiwgW3IxLCAjdG9rZW5leHRyYV90b2tlbl0gOyB0Ci0gICAgbGRyICAgICByNCwgW3NwLCAjMjBdICAgICAgICAgICAgICAgOyB2cDhfY29lZl9lbmNvZGluZ3MKLSAgICBtb3YgICAgIGxyLCAjMAotICAgIGFkZCAgICAgcjQsIHI0LCByNiwgbHNsICMzICAgICAgICAgIDsgYSA9IHZwOF9jb2VmX2VuY29kaW5ncyArIHQKLSAgICBsZHIgICAgIHI5LCBbcjEsICN0b2tlbmV4dHJhX2NvbnRleHRfdHJlZV0gICA7IHBwCi0KLSAgICBsZHJiICAgIHI3LCBbcjEsICN0b2tlbmV4dHJhX3NraXBfZW9iX25vZGVdCi0KLSAgICBsZHIgICAgIHI2LCBbcjQsICN2cDhfdG9rZW5fdmFsdWVdICA7IHYKLSAgICBsZHIgICAgIHI4LCBbcjQsICN2cDhfdG9rZW5fbGVuXSAgICA7IG4KLQotICAgIDsgdnA4IHNwZWNpZmljIHNraXBfZW9iX25vZGUKLSAgICBjbXAgICAgIHI3LCAjMAotICAgIG1vdm5lICAgbHIsICMyICAgICAgICAgICAgICAgICAgICAgIDsgaSA9IDIKLSAgICBzdWJuZSAgIHI4LCByOCwgIzEgICAgICAgICAgICAgICAgICA7IC0tbgotCi0gICAgcnNiICAgICByNCwgcjgsICMzMiAgICAgICAgICAgICAgICAgOyAzMi1uCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzYwXSAgICAgICAgICAgICAgOyB2cDhfY29lZl90cmVlCi0KLSAgICA7IHYgaXMga2VwdCBpbiByMTIgZHVyaW5nIHRoZSB0b2tlbiBwYWNrIGxvb3AKLSAgICBsc2wgICAgIHIxMiwgcjYsIHI0ICAgICAgICAgICAgICAgICA7IHIxMiA9IHYgPDwgMzIgLSBuCi0KLTsgbG9vcCBzdGFydAotdG9rZW5fbG9vcAotICAgIGxkcmIgICAgcjQsIFtyOSwgbHIsIGFzciAjMV0gICAgICAgIDsgcHAgW2k+PjFdCi0gICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCi0KLSAgICA7IERlY2lzaW9ucyBhcmUgbWFkZSBiYXNlZCBvbiB0aGUgYml0IHZhbHVlIHNoaWZ0ZWQKLSAgICA7IG9mZiBvZiB2LCBzbyBzZXQgYSBmbGFnIGhlcmUgYmFzZWQgb24gdGhpcy4KLSAgICA7IFRoaXMgdmFsdWUgaXMgcmVmZXJlZCB0byBhcyAiYmIiCi0gICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyBiYiA9IHYgPj4gbgotICAgIG11bCAgICAgcjQsIHI0LCByNyAgICAgICAgICAgICAgICAgIDsgKChyYW5nZS0xKSAqIHBwW2k+PjFdKSkKLQotICAgIDsgYmIgY2FuIG9ubHkgYmUgMCBvciAxLiAgU28gb25seSBleGVjdXRlIHRoaXMgc3RhdGVtZW50Ci0gICAgOyBpZiBiYiA9PSAxLCBvdGhlcndpc2UgaXQgd2lsbCBhY3QgbGlrZSBpICsgMAotICAgIGFkZGNzICAgbHIsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgaSArIGJiCi0KLSAgICBtb3YgICAgIHI3LCAjMQotICAgIGxkcnNiICAgbHIsIFtyMTAsIGxyXSAgICAgICAgICAgICAgIDsgaSA9IHZwOF9jb2VmX3RyZWVbaStiYl0KLSAgICBhZGQgICAgIHI0LCByNywgcjQsIGxzciAjOCAgICAgICAgICA7IDEgKyAoKChyYW5nZS0xKSAqIHBwW2k+PjFdKSA+PiA4KQotCi0gICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSBsb3d2YWx1ZSArPSBzcGxpdAotICAgIHN1YmNzICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgcmFuZ2UgPSByYW5nZS1zcGxpdAotCi0gICAgOyBDb3VudGluZyB0aGUgbGVhZGluZyB6ZXJvcyBpcyB1c2VkIHRvIG5vcm1hbGl6ZSByYW5nZS4KLSAgICBjbHogICAgIHI2LCByNAotICAgIHN1YiAgICAgcjYsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgc2hpZnQKLQotICAgIDsgRmxhZyBpcyBzZXQgb24gdGhlIHN1bSBvZiBjb3VudC4gIFRoaXMgZmxhZyBpcyB1c2VkIGxhdGVyCi0gICAgOyB0byBkZXRlcm1pbmUgaWYgY291bnQgPj0gMAotICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKLSAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAotICAgIGJtaSAgICAgdG9rZW5fY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKLQotICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudAotICAgIHN1YiAgICAgcjQsIHI2LCAjMSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0LTEKLSAgICBsc2xzICAgIHI0LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmKChsb3d2YWx1ZTw8KG9mZnNldC0xKSkgJiAweDgwMDAwMDAwICkKLSAgICBicGwgICAgIHRva2VuX2hpZ2hfYml0X25vdF9zZXQKLQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgeAotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeCA9IHctPnBvcy0xCi0gICAgYiAgICAgICB0b2tlbl96ZXJvX3doaWxlX3N0YXJ0Ci10b2tlbl96ZXJvX3doaWxlX2xvb3AKLSAgICBtb3YgICAgIHIxMCwgIzAKLSAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCi10b2tlbl96ZXJvX3doaWxlX3N0YXJ0Ci0gICAgY21wICAgICByNCwgIzAKLSAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxMSwgW3I3LCByNF0KLSAgICBjbXBnZSAgIHIxMSwgIzB4ZmYKLSAgICBiZXEgICAgIHRva2VuX3plcm9fd2hpbGVfbG9vcAotCi0gICAgbGRyICAgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0KLSAgICBhZGQgICAgIHIxMCwgcjEwLCAjMQotICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdICsgMQotdG9rZW5faGlnaF9iaXRfbm90X3NldAotICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0Ci0gICAgbGRyICAgICByMTAsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxzciAgICAgcjcsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gKDI0LW9mZnNldCkKLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHctPnBvcwotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAotICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAotICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKLSAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCi0gICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAotICAgIHN0cmIgICAgcjcsIFtyMTAsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3ctPnBvcysrXQotCi0gICAgOyByMTAgaXMgdXNlZCBlYXJsaWVyIGluIHRoZSBsb29wLCBidXQgcjEwIGlzIHVzZWQgYXMKLSAgICA7IHRlbXAgdmFyaWFibGUgaGVyZS4gIFNvIGFmdGVyIHIxMCBpcyB1c2VkLCByZWxvYWQKLSAgICA7IHZwOF9jb2VmX3RyZWVfZGNkIGludG8gcjEwCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzYwXSAgICAgICAgICAgICAgOyB2cDhfY29lZl90cmVlCi0KLXRva2VuX2NvdW50X2x0X3plcm8KLSAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBzaGlmdAotCi0gICAgc3VicyAgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KLSAgICBibmUgICAgIHRva2VuX2xvb3AKLQotICAgIGxkcmIgICAgcjYsIFtyMSwgI3Rva2VuZXh0cmFfdG9rZW5dIDsgdAotICAgIGxkciAgICAgcjcsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgdnA4X2V4dHJhX2JpdHMKLSAgICA7IEFkZCB0ICogc2l6ZW9mICh2cDhfZXh0cmFfYml0X3N0cnVjdCkgdG8gZ2V0IHRoZSBkZXNpcmVkCi0gICAgOyAgZWxlbWVudC4gIEhlcmUgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgPT0gMTYKLSAgICBhZGQgICAgIHIxMiwgcjcsIHI2LCBsc2wgIzQgICAgICAgICA7IGIgPSB2cDhfZXh0cmFfYml0cyArIHQKLQotICAgIGxkciAgICAgcjQsIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF9iYXNlX3ZhbF0KLSAgICBjbXAgICAgIHI0LCAjMAotICAgIGJlcSAgICAgc2tpcF9leHRyYV9iaXRzCi0KLTsgICBpZiggYi0+YmFzZV92YWwpCi0gICAgbGRyICAgICByOCwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X2xlbl0gOyBMCi0gICAgbGRyc2ggICBsciwgW3IxLCAjdG9rZW5leHRyYV9leHRyYV0gOyBlID0gcC0+RXh0cmEKLSAgICBjbXAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7IGlmKCBMKQotICAgIGJlcSAgICAgbm9fZXh0cmFfYml0cwotCi0gICAgbGRyICAgICByOSwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X3Byb2JdCi0gICAgYXNyICAgICByNywgbHIsICMxICAgICAgICAgICAgICAgICAgOyB2PWU+PjEKLQotICAgIGxkciAgICAgcjEwLCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfdHJlZV0KLSAgICBzdHIgICAgIHIxMCwgW3NwLCAjNF0gICAgICAgICAgICAgICA7IGItPnRyZWUKLQotICAgIHJzYiAgICAgcjQsIHI4LCAjMzIKLSAgICBsc2wgICAgIHIxMiwgcjcsIHI0Ci0KLSAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgICAgICAgICA7IGkgPSAwCi0KLWV4dHJhX2JpdHNfbG9vcAotICAgIGxkcmIgICAgcjQsIFtyOSwgbHIsIGFzciAjMV0gICAgICAgICAgICA7IHBwW2k+PjFdCi0gICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCi0gICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyB2ID4+IG4KLSAgICBtdWwgICAgIHI0LCByNCwgcjcgICAgICAgICAgICAgICAgICA7IChyYW5nZS0xKSAqIHBwW2k+PjFdCi0gICAgYWRkY3MgICBsciwgbHIsICMxICAgICAgICAgICAgICAgICAgOyBpICsgYmIKLQotICAgIG1vdiAgICAgcjcsICMxCi0gICAgbGRyc2IgICBsciwgW3IxMCwgbHJdICAgICAgICAgICAgICAgOyBpID0gYi0+dHJlZVtpK2JiXQotICAgIGFkZCAgICAgcjQsIHI3LCByNCwgbHNyICM4ICAgICAgICAgIDsgc3BsaXQgPSAxICsgICgoKHJhbmdlLTEpICogcHBbaT4+MV0pID4+IDgpCi0KLSAgICBhZGRjcyAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYmIpIGxvd3ZhbHVlICs9IHNwbGl0Ci0gICAgc3ViY3MgICByNCwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSByYW5nZSA9IHJhbmdlLXNwbGl0Ci0KLSAgICBjbHogICAgIHI2LCByNAotICAgIHN1YiAgICAgcjYsIHI2LCAjMjQKLQotICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKLSAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAotICAgIGJtaSAgICAgZXh0cmFfY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKLQotICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0PSBzaGlmdCAtIGNvdW50Ci0gICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQotICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQotICAgIGJwbCAgICAgZXh0cmFfaGlnaF9iaXRfbm90X3NldAotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4Ci0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zIC0gMQotICAgIGIgICAgICAgZXh0cmFfemVyb193aGlsZV9zdGFydAotZXh0cmFfemVyb193aGlsZV9sb29wCi0gICAgbW92ICAgICByMTAsICMwCi0gICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKLSAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQotZXh0cmFfemVyb193aGlsZV9zdGFydAotICAgIGNtcCAgICAgcjQsICMwCi0gICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTEsIFtyNywgcjRdCi0gICAgY21wZ2UgICByMTEsICMweGZmCi0gICAgYmVxICAgICBleHRyYV96ZXJvX3doaWxlX2xvb3AKLQotICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjEwLCBbcjcsIHI0XQotICAgIGFkZCAgICAgcjEwLCByMTAsICMxCi0gICAgc3RyYiAgICByMTAsIFtyNywgcjRdCi1leHRyYV9oaWdoX2JpdF9ub3Rfc2V0Ci0gICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKLSAgICBsZHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAotICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAotICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKLSAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCi0gICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAotICAgIHN0cmIgICAgcjcsIFtyMTAsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3ctPnBvcysrXT0obG93dmFsdWUgPj4gKDI0LW9mZnNldCkpCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBiLT50cmVlCi1leHRyYV9jb3VudF9sdF96ZXJvCi0gICAgbHNsICAgICByMiwgcjIsIHI2Ci0KLSAgICBzdWJzICAgIHI4LCByOCwgIzEgICAgICAgICAgICAgICAgICA7IC0tbgotICAgIGJuZSAgICAgZXh0cmFfYml0c19sb29wICAgICAgICAgICAgIDsgd2hpbGUgKG4pCi0KLW5vX2V4dHJhX2JpdHMKLSAgICBsZHIgICAgIGxyLCBbcjEsICM0XSAgICAgICAgICAgICAgICA7IGUgPSBwLT5FeHRyYQotICAgIGFkZCAgICAgcjQsIHI1LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgKyAxCi0gICAgdHN0ICAgICBsciwgIzEKLSAgICBsc3IgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHNwbGl0ID0gKHJhbmdlICsgMSkgPj4gMQotICAgIGFkZG5lICAgcjIsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgKz0gc3BsaXQKLSAgICBzdWJuZSAgIHI0LCByNSwgcjQgICAgICAgICAgICAgICAgICA7IHJhbmdlID0gcmFuZ2Utc3BsaXQKLSAgICB0c3QgICAgIHIyLCAjMHg4MDAwMDAwMCAgICAgICAgICAgICA7IGxvd3ZhbHVlICYgMHg4MDAwMDAwMAotICAgIGxzbCAgICAgcjUsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IDEKLSAgICBiZXEgICAgIGVuZF9oaWdoX2JpdF9ub3Rfc2V0Ci0KLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KLSAgICBtb3YgICAgIHI3LCAjMAotICAgIHN1YiAgICAgcjQsIHI0LCAjMQotICAgIGIgICAgICAgZW5kX3plcm9fd2hpbGVfc3RhcnQKLWVuZF96ZXJvX3doaWxlX2xvb3AKLSAgICBzdHJiICAgIHI3LCBbcjYsIHI0XQotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCi1lbmRfemVyb193aGlsZV9zdGFydAotICAgIGNtcCAgICAgcjQsICMwCi0gICAgbGRyZ2UgICByNiwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTIsIFtyNiwgcjRdCi0gICAgY21wZ2UgICByMTIsICMweGZmCi0gICAgYmVxICAgICBlbmRfemVyb193aGlsZV9sb29wCi0KLSAgICBsZHIgICAgIHI2LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHI3LCBbcjYsIHI0XQotICAgIGFkZCAgICAgcjcsIHI3LCAjMQotICAgIHN0cmIgICAgcjcsIFtyNiwgcjRdCi1lbmRfaGlnaF9iaXRfbm90X3NldAotICAgIGFkZHMgICAgcjMsIHIzLCAjMSAgICAgICAgICAgICAgICAgIDsgKytjb3VudAotICAgIGxzbCAgICAgcjIsIHIyLCAjMSAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgIDw8PSAxCi0gICAgYm5lICAgICBlbmRfY291bnRfemVybwotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgbXZuICAgICByMywgIzcKLSAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsc3IgICAgIHI2LCByMiwgIzI0ICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+IDI0Ci0gICAgYWRkICAgICByMTIsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKwotICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjMHgxMF0KLSAgICBzdHJiICAgIHI2LCBbcjcsIHI0XQotZW5kX2NvdW50X3plcm8KLXNraXBfZXh0cmFfYml0cwotICAgIGFkZCAgICAgcjEsIHIxLCAjVE9LRU5FWFRSQV9TWiAgICAgIDsgKytwCi1jaGVja19wX2x0X3N0b3AKLSAgICBsZHIgICAgIHI0LCBbc3AsICMwXSAgICAgICAgICAgICAgICA7IHN0b3AKLSAgICBjbXAgICAgIHIxLCByNCAgICAgICAgICAgICAgICAgICAgICA7IHdoaWxlKCBwIDwgc3RvcCkKLSAgICBiY2MgICAgIHdoaWxlX3BfbHRfc3RvcAotCi0gICAgbGRyICAgICByNiwgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBtYl9yb3dzCi0gICAgbGRyICAgICByNywgW3NwLCAjMTZdICAgICAgICAgICAgICAgOyB0b2tlbmxpc3QgYWRkcmVzcwotICAgIHN1YnMgICAgcjYsIHI2LCAjMQotICAgIGFkZCAgICAgcjcsIHI3LCAjVE9LRU5MSVNUX1NaICAgICAgIDsgbmV4dCBlbGVtZW50IGluIHRoZSBhcnJheQotICAgIHN0ciAgICAgcjYsIFtzcCwgIzEyXQotICAgIGJuZSAgICAgbWJfcm93X2xvb3AKLQotICAgIHN0ciAgICAgcjIsIFtyMCwgI3ZwOF93cml0ZXJfbG93dmFsdWVdCi0gICAgc3RyICAgICByNSwgW3IwLCAjdnA4X3dyaXRlcl9yYW5nZV0KLSAgICBzdHIgICAgIHIzLCBbcjAsICN2cDhfd3JpdGVyX2NvdW50XQotICAgIGFkZCAgICAgc3AsIHNwLCAjMjQKLSAgICBwb3AgICAgIHtyNC1yMTEsIHBjfQotICAgIEVORFAKLQotX1ZQOF9DT01QX2NvbW1vbl8KLSAgICBEQ0QgICAgIHZwOF9jb21wX2NvbW1vbgotX1ZQOF9DT01NT05fTUJyb3dzXwotICAgIERDRCAgICAgdnA4X2NvbW1vbl9tYl9yb3dzCi1fVlA4X0NPTVBfdHBsaXN0XwotICAgIERDRCAgICAgdnA4X2NvbXBfdHBsaXN0Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX3BhcnRpdGlvbnNfYXJtdjUuYXNtIGIvdnA4L2VuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfcGFydGl0aW9uc19hcm12NS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZWNjZGIuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfcGFydGl0aW9uc19hcm12NS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCB8dnA4Y3hfcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2FybXY1fAotCi0gICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCi0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFLCBSRUFET05MWQotCi07IHIwIFZQOF9DT01QICpjcGkKLTsgcjEgdW5zaWduZWQgY2hhciAqY3hfZGF0YQotOyByMiBpbnQgbnVtX3BhcnQKLTsgcjMgKnNpemUKLTsgczAgdnA4X2NvZWZfZW5jb2RpbmdzCi07IHMxIHZwOF9leHRyYV9iaXRzLAotOyBzMiBjb25zdCB2cDhfdHJlZV9pbmRleCAqLAotCi18dnA4Y3hfcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2FybXY1fCBQUk9DCi0gICAgcHVzaCAgICB7cjQtcjExLCBscn0KLSAgICBzdWIgICAgIHNwLCBzcCwgIzQ0Ci0KLSAgICA7IENvbXB1dGUgYWRkcmVzcyBvZiBjcGktPmNvbW1vbi5tYl9yb3dzCi0gICAgbGRyICAgICByNCwgX1ZQOF9DT01QX2NvbW1vbl8KLSAgICBsZHIgICAgIHI2LCBfVlA4X0NPTU1PTl9NQnJvd3NfCi0gICAgYWRkICAgICByNCwgcjAsIHI0Ci0KLSAgICBsZHIgICAgIHI1LCBbcjQsIHI2XSAgICAgICAgICAgICAgICA7IGxvYWQgdXAgbWJfcm93cwotCi0gICAgc3RyICAgICByNSwgW3NwLCAjMzZdICAgICAgICAgICAgICAgOyBzYXZlIG1iX3Jvd3MKLSAgICBzdHIgICAgIHIxLCBbc3AsICMyNF0gICAgICAgICAgICAgICA7IHNhdmUgY3hfZGF0YQotICAgIHN0ciAgICAgcjIsIFtzcCwgIzIwXSAgICAgICAgICAgICAgIDsgc2F2ZSBudW1fcGFydAotICAgIHN0ciAgICAgcjMsIFtzcCwgIzhdICAgICAgICAgICAgICAgIDsgc2F2ZSAqc2l6ZQotCi0gICAgOyAqc2l6ZSA9IDMqKG51bV9wYXJ0IC0xICk7Ci0gICAgc3ViICAgICByMiwgcjIsICMxICAgICAgICAgICAgICAgICAgOyBudW1fcGFydCAtIDEKLSAgICBhZGQgICAgIHIyLCByMiwgcjIsIGxzbCAjMSAgICAgICAgICA7IDMqKG51bV9wYXJ0IC0gMSkKLSAgICBzdHIgICAgIHIyLCBbcjNdCi0KLSAgICBhZGQgICAgIHIyLCByMiwgcjEgICAgICAgICAgICAgICAgICA7IGN4X2RhdGEgKyAqc2l6ZQotICAgIHN0ciAgICAgcjIsIFtzcCwgIzQwXSAgICAgICAgICAgICAgIDsgcHRyCi0KLSAgICBsZHIgICAgIHI0LCBfVlA4X0NPTVBfdHBsaXN0XwotICAgIGFkZCAgICAgcjQsIHIwLCByNAotICAgIGxkciAgICAgcjcsIFtyNCwgIzBdICAgICAgICAgICAgICAgIDsgZGVyZWZlcmVuY2UgY3BpLT50cF9saXN0Ci0gICAgc3RyICAgICByNywgW3NwLCAjMzJdICAgICAgICAgICAgICAgOyBzdG9yZSBzdGFydCBvZiBjcGktPnRwX2xpc3QKLQotICAgIGxkciAgICAgcjExLCBfVlA4X0NPTVBfYmMyXyAgICAgICAgIDsgbG9hZCB1cCB2cDhfd3JpdGVyIG91dCBvZiBjcGkKLSAgICBhZGQgICAgIHIwLCByMCwgcjExCi0KLSAgICBtb3YgICAgIHIxMSwgIzAKLSAgICBzdHIgICAgIHIxMSwgW3NwLCAjMjhdICAgICAgICAgICAgICA7IGkKLQotbnVtcGFydHNfbG9vcAotICAgIGxkciAgICAgcjEwLCBbc3AsICM0MF0gICAgICAgICAgICAgIDsgcHRyCi0gICAgbGRyICAgICByNSwgIFtzcCwgIzM2XSAgICAgICAgICAgICAgOyBtb3ZlIG1iX3Jvd3MgdG8gdGhlIGNvdW50aW5nIHNlY3Rpb24KLSAgICBzdWIgICAgIHI1LCByNSwgcjExICAgICAgICAgICAgICAgICA7IG1vdmUgc3RhcnQgcG9pbnQgd2l0aCBlYWNoIHBhcnRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbWJfcm93cyBzdGFydHMgYXQgaQotICAgIHN0ciAgICAgcjUsICBbc3AsICMxMl0KLQotICAgIDsgUmVzZXQgYWxsIG9mIHRoZSBWUDggV3JpdGVyIGRhdGEgZm9yIGVhY2ggcGFydGl0aW9uIHRoYXQKLSAgICA7IGlzIHByb2Nlc3NlZC4KLSAgICA7IHN0YXJ0X2VuY29kZQotICAgIG1vdiAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgICAgIDsgdnA4X3dyaXRlcl9sb3d2YWx1ZQotICAgIG1vdiAgICAgcjUsICMyNTUgICAgICAgICAgICAgICAgICAgIDsgdnA4X3dyaXRlcl9yYW5nZQotICAgIG12biAgICAgcjMsICMyMyAgICAgICAgICAgICAgICAgICAgIDsgdnA4X3dyaXRlcl9jb3VudAotCi0gICAgc3RyICAgICByMiwgIFtyMCwgI3ZwOF93cml0ZXJfdmFsdWVdCi0gICAgc3RyICAgICByMiwgIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIHN0ciAgICAgcjEwLCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLQotbWJfcm93X2xvb3AKLQotICAgIGxkciAgICAgcjEsIFtyNywgI3Rva2VubGlzdF9zdGFydF0KLSAgICBsZHIgICAgIHI5LCBbcjcsICN0b2tlbmxpc3Rfc3RvcF0KLSAgICBzdHIgICAgIHI5LCBbc3AsICMwXSAgICAgICAgICAgICAgICA7IHNhdmUgc3RvcCBmb3IgbGF0ZXIgY29tcGFyaXNvbgotICAgIHN0ciAgICAgcjcsIFtzcCwgIzE2XSAgICAgICAgICAgICAgIDsgdG9rZW5saXN0IGFkZHJlc3MgZm9yIG5leHQgdGltZQotCi0gICAgYiAgICAgICBjaGVja19wX2x0X3N0b3AKLQotICAgIDsgYWN0dWFsIHdvcmsgZ2V0cyBkb25lIGhlcmUhCi0KLXdoaWxlX3BfbHRfc3RvcAotICAgIGxkcmIgICAgcjYsIFtyMSwgI3Rva2VuZXh0cmFfdG9rZW5dIDsgdAotICAgIGxkciAgICAgcjQsIFtzcCwgIzgwXSAgICAgICAgICAgICAgIDsgdnA4X2NvZWZfZW5jb2RpbmdzCi0gICAgbW92ICAgICBsciwgIzAKLSAgICBhZGQgICAgIHI0LCByNCwgcjYsIGxzbCAjMyAgICAgICAgICA7IGEgPSB2cDhfY29lZl9lbmNvZGluZ3MgKyB0Ci0gICAgbGRyICAgICByOSwgW3IxLCAjdG9rZW5leHRyYV9jb250ZXh0X3RyZWVdICAgOyBwcAotCi0gICAgbGRyYiAgICByNywgW3IxLCAjdG9rZW5leHRyYV9za2lwX2VvYl9ub2RlXQotCi0gICAgbGRyICAgICByNiwgW3I0LCAjdnA4X3Rva2VuX3ZhbHVlXSAgOyB2Ci0gICAgbGRyICAgICByOCwgW3I0LCAjdnA4X3Rva2VuX2xlbl0gICAgOyBuCi0KLSAgICA7IHZwOCBzcGVjaWZpYyBza2lwX2VvYl9ub2RlCi0gICAgY21wICAgICByNywgIzAKLSAgICBtb3ZuZSAgIGxyLCAjMiAgICAgICAgICAgICAgICAgICAgICA7IGkgPSAyCi0gICAgc3VibmUgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KLQotICAgIHJzYiAgICAgcjQsIHI4LCAjMzIgICAgICAgICAgICAgICAgIDsgMzItbgotICAgIGxkciAgICAgcjEwLCBbc3AsICM4OF0gICAgICAgICAgICAgIDsgdnA4X2NvZWZfdHJlZQotCi0gICAgOyB2IGlzIGtlcHQgaW4gcjEyIGR1cmluZyB0aGUgdG9rZW4gcGFjayBsb29wCi0gICAgbHNsICAgICByMTIsIHI2LCByNCAgICAgICAgICAgICAgICA7IHIxMiA9IHYgPDwgMzIgLSBuCi0KLTsgbG9vcCBzdGFydAotdG9rZW5fbG9vcAotICAgIGxkcmIgICAgcjQsIFtyOSwgbHIsIGFzciAjMV0gICAgICAgIDsgcHAgW2k+PjFdCi0gICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCi0KLSAgICA7IERlY2lzaW9ucyBhcmUgbWFkZSBiYXNlZCBvbiB0aGUgYml0IHZhbHVlIHNoaWZ0ZWQKLSAgICA7IG9mZiBvZiB2LCBzbyBzZXQgYSBmbGFnIGhlcmUgYmFzZWQgb24gdGhpcy4KLSAgICA7IFRoaXMgdmFsdWUgaXMgcmVmZXJlZCB0byBhcyAiYmIiCi0gICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyBiYiA9IHYgPj4gbgotICAgIG11bCAgICAgcjQsIHI0LCByNyAgICAgICAgICAgICAgICAgIDsgKChyYW5nZS0xKSAqIHBwW2k+PjFdKSkKLQotICAgIDsgYmIgY2FuIG9ubHkgYmUgMCBvciAxLiAgU28gb25seSBleGVjdXRlIHRoaXMgc3RhdGVtZW50Ci0gICAgOyBpZiBiYiA9PSAxLCBvdGhlcndpc2UgaXQgd2lsbCBhY3QgbGlrZSBpICsgMAotICAgIGFkZGNzICAgbHIsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgaSArIGJiCi0KLSAgICBtb3YgICAgIHI3LCAjMQotICAgIGxkcnNiICAgbHIsIFtyMTAsIGxyXSAgICAgICAgICAgICAgIDsgaSA9IHZwOF9jb2VmX3RyZWVbaStiYl0KLSAgICBhZGQgICAgIHI0LCByNywgcjQsIGxzciAjOCAgICAgICAgICA7IDEgKyAoKChyYW5nZS0xKSAqIHBwW2k+PjFdKSA+PiA4KQotCi0gICAgYWRkY3MgICByMiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSBsb3d2YWx1ZSArPSBzcGxpdAotICAgIHN1YmNzICAgcjQsIHI1LCByNCAgICAgICAgICAgICAgICAgIDsgaWYgIChiYikgcmFuZ2UgPSByYW5nZS1zcGxpdAotCi0gICAgOyBDb3VudGluZyB0aGUgbGVhZGluZyB6ZXJvcyBpcyB1c2VkIHRvIG5vcm1hbGl6ZSByYW5nZS4KLSAgICBjbHogICAgIHI2LCByNAotICAgIHN1YiAgICAgcjYsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgc2hpZnQKLQotICAgIDsgRmxhZyBpcyBzZXQgb24gdGhlIHN1bSBvZiBjb3VudC4gIFRoaXMgZmxhZyBpcyB1c2VkIGxhdGVyCi0gICAgOyB0byBkZXRlcm1pbmUgaWYgY291bnQgPj0gMAotICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKLSAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAotICAgIGJtaSAgICAgdG9rZW5fY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKLQotICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudAotICAgIHN1YiAgICAgcjQsIHI2LCAjMSAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0LTEKLSAgICBsc2xzICAgIHI0LCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmKChsb3d2YWx1ZTw8KG9mZnNldC0xKSkgJiAweDgwMDAwMDAwICkKLSAgICBicGwgICAgIHRva2VuX2hpZ2hfYml0X25vdF9zZXQKLQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgeAotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeCA9IHctPnBvcy0xCi0gICAgYiAgICAgICB0b2tlbl96ZXJvX3doaWxlX3N0YXJ0Ci10b2tlbl96ZXJvX3doaWxlX2xvb3AKLSAgICBtb3YgICAgIHIxMCwgIzAKLSAgICBzdHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XSA9KHVuc2lnbmVkIGNoYXIpMAotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCi10b2tlbl96ZXJvX3doaWxlX3N0YXJ0Ci0gICAgY21wICAgICByNCwgIzAKLSAgICBsZHJnZSAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxMSwgW3I3LCByNF0KLSAgICBjbXBnZSAgIHIxMSwgIzB4ZmYKLSAgICBiZXEgICAgIHRva2VuX3plcm9fd2hpbGVfbG9vcAotCi0gICAgbGRyICAgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0KLSAgICBhZGQgICAgIHIxMCwgcjEwLCAjMQotICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdICsgMQotdG9rZW5faGlnaF9iaXRfbm90X3NldAotICAgIHJzYiAgICAgcjQsIHI2LCAjMjQgICAgICAgICAgICAgICAgIDsgMjQtb2Zmc2V0Ci0gICAgbGRyICAgICByMTAsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxzciAgICAgcjcsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPj4gKDI0LW9mZnNldCkKLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10gICA7IHctPnBvcwotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAotICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAotICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKLSAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCi0gICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAotICAgIHN0cmIgICAgcjcsIFtyMTAsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3ctPnBvcysrXQotCi0gICAgOyByMTAgaXMgdXNlZCBlYXJsaWVyIGluIHRoZSBsb29wLCBidXQgcjEwIGlzIHVzZWQgYXMKLSAgICA7IHRlbXAgdmFyaWFibGUgaGVyZS4gIFNvIGFmdGVyIHIxMCBpcyB1c2VkLCByZWxvYWQKLSAgICA7IHZwOF9jb2VmX3RyZWVfZGNkIGludG8gcjEwCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzg4XSAgICAgICAgICAgICAgOyB2cDhfY29lZl90cmVlCi0KLXRva2VuX2NvdW50X2x0X3plcm8KLSAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBzaGlmdAotCi0gICAgc3VicyAgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgOyAtLW4KLSAgICBibmUgICAgIHRva2VuX2xvb3AKLQotICAgIGxkcmIgICAgcjYsIFtyMSwgI3Rva2VuZXh0cmFfdG9rZW5dIDsgdAotICAgIGxkciAgICAgcjcsIFtzcCwgIzg0XSAgICAgICAgICAgICAgICA7IHZwOF9leHRyYV9iaXRzCi0gICAgOyBBZGQgdCAqIHNpemVvZiAodnA4X2V4dHJhX2JpdF9zdHJ1Y3QpIHRvIGdldCB0aGUgZGVzaXJlZAotICAgIDsgIGVsZW1lbnQuICBIZXJlIHZwOF9leHRyYV9iaXRfc3RydWN0ID09IDE2Ci0gICAgYWRkICAgICByMTIsIHI3LCByNiwgbHNsICM0ICAgICAgICAgOyBiID0gdnA4X2V4dHJhX2JpdHMgKyB0Ci0KLSAgICBsZHIgICAgIHI0LCBbcjEyLCAjdnA4X2V4dHJhX2JpdF9zdHJ1Y3RfYmFzZV92YWxdCi0gICAgY21wICAgICByNCwgIzAKLSAgICBiZXEgICAgIHNraXBfZXh0cmFfYml0cwotCi07ICAgaWYoIGItPmJhc2VfdmFsKQotICAgIGxkciAgICAgcjgsIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF9sZW5dIDsgTAotICAgIGxkcnNoICAgbHIsIFtyMSwgI3Rva2VuZXh0cmFfZXh0cmFdIDsgZSA9IHAtPkV4dHJhCi0gICAgY21wICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgOyBpZiggTCkKLSAgICBiZXEgICAgIG5vX2V4dHJhX2JpdHMKLQotICAgIGxkciAgICAgcjksIFtyMTIsICN2cDhfZXh0cmFfYml0X3N0cnVjdF9wcm9iXQotICAgIGFzciAgICAgcjcsIGxyLCAjMSAgICAgICAgICAgICAgICAgIDsgdj1lPj4xCi0KLSAgICBsZHIgICAgIHIxMCwgW3IxMiwgI3ZwOF9leHRyYV9iaXRfc3RydWN0X3RyZWVdCi0gICAgc3RyICAgICByMTAsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBiLT50cmVlCi0KLSAgICByc2IgICAgIHI0LCByOCwgIzMyCi0gICAgbHNsICAgICByMTIsIHI3LCByNAotCi0gICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgICAgICAgICAgOyBpID0gMAotCi1leHRyYV9iaXRzX2xvb3AKLSAgICBsZHJiICAgIHI0LCBbcjksIGxyLCBhc3IgIzFdICAgICAgICA7IHBwW2k+PjFdCi0gICAgc3ViICAgICByNywgcjUsICMxICAgICAgICAgICAgICAgICAgOyByYW5nZS0xCi0gICAgbHNscyAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgOyB2ID4+IG4KLSAgICBtdWwgICAgIHI0LCByNCwgcjcgICAgICAgICAgICAgICAgICA7IChyYW5nZS0xKSAqIHBwW2k+PjFdCi0gICAgYWRkY3MgICBsciwgbHIsICMxICAgICAgICAgICAgICAgICAgOyBpICsgYmIKLQotICAgIG1vdiAgICAgcjcsICMxCi0gICAgbGRyc2IgICBsciwgW3IxMCwgbHJdICAgICAgICAgICAgICAgOyBpID0gYi0+dHJlZVtpK2JiXQotICAgIGFkZCAgICAgcjQsIHI3LCByNCwgbHNyICM4ICAgICAgICAgIDsgc3BsaXQgPSAxICsgICgoKHJhbmdlLTEpICogcHBbaT4+MV0pID4+IDgpCi0KLSAgICBhZGRjcyAgIHIyLCByMiwgcjQgICAgICAgICAgICAgICAgICA7IGlmICAoYmIpIGxvd3ZhbHVlICs9IHNwbGl0Ci0gICAgc3ViY3MgICByNCwgcjUsIHI0ICAgICAgICAgICAgICAgICAgOyBpZiAgKGJiKSByYW5nZSA9IHJhbmdlLXNwbGl0Ci0KLSAgICBjbHogICAgIHI2LCByNAotICAgIHN1YiAgICAgcjYsIHI2LCAjMjQKLQotICAgIGFkZHMgICAgcjMsIHIzLCByNiAgICAgICAgICAgICAgICAgIDsgY291bnQgKz0gc2hpZnQKLSAgICBsc2wgICAgIHI1LCByNCwgcjYgICAgICAgICAgICAgICAgICA7IHJhbmdlIDw8PSBzaGlmdAotICAgIGJtaSAgICAgZXh0cmFfY291bnRfbHRfemVybyAgICAgICAgIDsgaWYoY291bnQgPj0gMCkKLQotICAgIHN1YiAgICAgcjYsIHI2LCByMyAgICAgICAgICAgICAgICAgIDsgb2Zmc2V0PSBzaGlmdCAtIGNvdW50Ci0gICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQotICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQotICAgIGJwbCAgICAgZXh0cmFfaGlnaF9iaXRfbm90X3NldAotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4Ci0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zIC0gMQotICAgIGIgICAgICAgZXh0cmFfemVyb193aGlsZV9zdGFydAotZXh0cmFfemVyb193aGlsZV9sb29wCi0gICAgbW92ICAgICByMTAsICMwCi0gICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gPSh1bnNpZ25lZCBjaGFyKTAKLSAgICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHgtLQotZXh0cmFfemVyb193aGlsZV9zdGFydAotICAgIGNtcCAgICAgcjQsICMwCi0gICAgbGRyZ2UgICByNywgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTEsIFtyNywgcjRdCi0gICAgY21wZ2UgICByMTEsICMweGZmCi0gICAgYmVxICAgICBleHRyYV96ZXJvX3doaWxlX2xvb3AKLQotICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjEwLCBbcjcsIHI0XQotICAgIGFkZCAgICAgcjEwLCByMTAsICMxCi0gICAgc3RyYiAgICByMTAsIFtyNywgcjRdCi1leHRyYV9oaWdoX2JpdF9ub3Rfc2V0Ci0gICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKLSAgICBsZHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIGxzbCAgICAgcjIsIHIyLCByNiAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgPDw9IG9mZnNldAotICAgIG1vdiAgICAgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIDsgc2hpZnQgPSBjb3VudAotICAgIGFkZCAgICAgcjExLCByNCwgIzEgICAgICAgICAgICAgICAgIDsgdy0+cG9zKysKLSAgICBiaWMgICAgIHIyLCByMiwgIzB4ZmYwMDAwMDAgICAgICAgICA7IGxvd3ZhbHVlICY9IDB4ZmZmZmZmCi0gICAgc3RyICAgICByMTEsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXQotICAgIHN1YiAgICAgcjMsIHIzLCAjOCAgICAgICAgICAgICAgICAgIDsgY291bnQgLT0gOAotICAgIHN0cmIgICAgcjcsIFtyMTAsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3ctPnBvcysrXT0obG93dmFsdWUgPj4gKDI0LW9mZnNldCkpCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzRdICAgICAgICAgICAgICAgOyBiLT50cmVlCi1leHRyYV9jb3VudF9sdF96ZXJvCi0gICAgbHNsICAgICByMiwgcjIsIHI2Ci0KLSAgICBzdWJzICAgIHI4LCByOCwgIzEgICAgICAgICAgICAgICAgICA7IC0tbgotICAgIGJuZSAgICAgZXh0cmFfYml0c19sb29wICAgICAgICAgICAgIDsgd2hpbGUgKG4pCi0KLW5vX2V4dHJhX2JpdHMKLSAgICBsZHIgICAgIGxyLCBbcjEsICM0XSAgICAgICAgICAgICAgICA7IGUgPSBwLT5FeHRyYQotICAgIGFkZCAgICAgcjQsIHI1LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgKyAxCi0gICAgdHN0ICAgICBsciwgIzEKLSAgICBsc3IgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICA7IHNwbGl0ID0gKHJhbmdlICsgMSkgPj4gMQotICAgIGFkZG5lICAgcjIsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgKz0gc3BsaXQKLSAgICBzdWJuZSAgIHI0LCByNSwgcjQgICAgICAgICAgICAgICAgICA7IHJhbmdlID0gcmFuZ2Utc3BsaXQKLSAgICB0c3QgICAgIHIyLCAjMHg4MDAwMDAwMCAgICAgICAgICAgICA7IGxvd3ZhbHVlICYgMHg4MDAwMDAwMAotICAgIGxzbCAgICAgcjUsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IDEKLSAgICBiZXEgICAgIGVuZF9oaWdoX2JpdF9ub3Rfc2V0Ci0KLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfd3JpdGVyX3Bvc10KLSAgICBtb3YgICAgIHI3LCAjMAotICAgIHN1YiAgICAgcjQsIHI0LCAjMQotICAgIGIgICAgICAgZW5kX3plcm9fd2hpbGVfc3RhcnQKLWVuZF96ZXJvX3doaWxlX2xvb3AKLSAgICBzdHJiICAgIHI3LCBbcjYsIHI0XQotICAgIHN1YiAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgIDsgeC0tCi1lbmRfemVyb193aGlsZV9zdGFydAotICAgIGNtcCAgICAgcjQsICMwCi0gICAgbGRyZ2UgICByNiwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbGRyYiAgICByMTIsIFtyNiwgcjRdCi0gICAgY21wZ2UgICByMTIsICMweGZmCi0gICAgYmVxICAgICBlbmRfemVyb193aGlsZV9sb29wCi0KLSAgICBsZHIgICAgIHI2LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHI3LCBbcjYsIHI0XQotICAgIGFkZCAgICAgcjcsIHI3LCAjMQotICAgIHN0cmIgICAgcjcsIFtyNiwgcjRdCi1lbmRfaGlnaF9iaXRfbm90X3NldAotICAgIGFkZHMgICAgcjMsIHIzLCAjMSAgICAgICAgICAgICAgICAgIDsgKytjb3VudAotICAgIGxzbCAgICAgcjIsIHIyLCAjMSAgICAgICAgICAgICAgICAgIDsgbG93dmFsdWUgIDw8PSAxCi0gICAgYm5lICAgICBlbmRfY291bnRfemVybwotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgbXZuICAgICByMywgIzcKLSAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsc3IgICAgIHI2LCByMiwgIzI0ICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlID4+IDI0Ci0gICAgYWRkICAgICByMTIsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKwotICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKLSAgICBzdHIgICAgIHIxMiwgW3IwLCAjMHgxMF0KLSAgICBzdHJiICAgIHI2LCBbcjcsIHI0XQotZW5kX2NvdW50X3plcm8KLXNraXBfZXh0cmFfYml0cwotICAgIGFkZCAgICAgcjEsIHIxLCAjVE9LRU5FWFRSQV9TWiAgICAgIDsgKytwCi1jaGVja19wX2x0X3N0b3AKLSAgICBsZHIgICAgIHI0LCBbc3AsICMwXSAgICAgICAgICAgICAgICA7IHN0b3AKLSAgICBjbXAgICAgIHIxLCByNCAgICAgICAgICAgICAgICAgICAgICA7IHdoaWxlKCBwIDwgc3RvcCkKLSAgICBiY2MgICAgIHdoaWxlX3BfbHRfc3RvcAotCi0gICAgbGRyICAgICByMTAsIFtzcCwgIzIwXSAgICAgICAgICAgICAgOyBudW1fcGFydHMKLSAgICBtb3YgICAgIHIxLCAjVE9LRU5MSVNUX1NaCi0gICAgbXVsICAgICByMSwgcjEwLCByMQotCi0gICAgbGRyICAgICByNiwgW3NwLCAjMTJdICAgICAgICAgICAgICAgOyBtYl9yb3dzCi0gICAgbGRyICAgICByNywgW3NwLCAjMTZdICAgICAgICAgICAgICAgOyB0b2tlbmxpc3QgYWRkcmVzcwotICAgIHN1YnMgICAgcjYsIHI2LCByMTAKLSAgICBhZGQgICAgIHI3LCByNywgcjEgICAgICAgICAgICAgICAgICA7IG5leHQgZWxlbWVudCBpbiB0aGUgYXJyYXkKLSAgICBzdHIgICAgIHI2LCBbc3AsICMxMl0KLSAgICBiZ3QgICAgIG1iX3Jvd19sb29wCi0KLSAgICBtb3YgICAgIHIxMiwgIzMyCi0KLXN0b3BfZW5jb2RlX2xvb3AKLSAgICBzdWIgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgICAgICA7IHJhbmdlLTEKLQotICAgIG1vdiAgICAgcjQsIHI3LCBsc2wgIzcgICAgICAgICAgICAgIDsgKChyYW5nZS0xKSAqIDEyOCkKLQotICAgIG1vdiAgICAgcjcsICMxCi0gICAgYWRkICAgICByNCwgcjcsIHI0LCBsc3IgIzggICAgICAgICAgOyAxICsgKCgocmFuZ2UtMSkgKiAxMjgpID4+IDgpCi0KLSAgICA7IENvdW50aW5nIHRoZSBsZWFkaW5nIHplcm9zIGlzIHVzZWQgdG8gbm9ybWFsaXplIHJhbmdlLgotICAgIGNseiAgICAgcjYsIHI0Ci0gICAgc3ViICAgICByNiwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyBzaGlmdAotCi0gICAgOyBGbGFnIGlzIHNldCBvbiB0aGUgc3VtIG9mIGNvdW50LiAgVGhpcyBmbGFnIGlzIHVzZWQgbGF0ZXIKLSAgICA7IHRvIGRldGVybWluZSBpZiBjb3VudCA+PSAwCi0gICAgYWRkcyAgICByMywgcjMsIHI2ICAgICAgICAgICAgICAgICAgOyBjb3VudCArPSBzaGlmdAotICAgIGxzbCAgICAgcjUsIHI0LCByNiAgICAgICAgICAgICAgICAgIDsgcmFuZ2UgPDw9IHNoaWZ0Ci0gICAgYm1pICAgICB0b2tlbl9jb3VudF9sdF96ZXJvX3NlICAgICAgOyBpZihjb3VudCA+PSAwKQotCi0gICAgc3ViICAgICByNiwgcjYsIHIzICAgICAgICAgICAgICAgICAgOyBvZmZzZXQgPSBzaGlmdCAtIGNvdW50Ci0gICAgc3ViICAgICByNCwgcjYsICMxICAgICAgICAgICAgICAgICAgOyBvZmZzZXQtMQotICAgIGxzbHMgICAgcjQsIHIyLCByNCAgICAgICAgICAgICAgICAgIDsgaWYoKGxvd3ZhbHVlPDwob2Zmc2V0LTEpKSAmIDB4ODAwMDAwMDAgKQotICAgIGJwbCAgICAgdG9rZW5faGlnaF9iaXRfbm90X3NldF9zZQotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICAgOyB4Ci0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4ID0gdy0+cG9zLTEKLSAgICBiICAgICAgIHRva2VuX3plcm9fd2hpbGVfc3RhcnRfc2UKLXRva2VuX3plcm9fd2hpbGVfbG9vcF9zZQotICAgIG1vdiAgICAgcjEwLCAjMAotICAgIHN0cmIgICAgcjEwLCBbcjcsIHI0XSAgICAgICAgICAgICAgIDsgdy0+YnVmZmVyW3hdID0odW5zaWduZWQgY2hhcikwCi0gICAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgOyB4LS0KLXRva2VuX3plcm9fd2hpbGVfc3RhcnRfc2UKLSAgICBjbXAgICAgIHI0LCAjMAotICAgIGxkcmdlICAgcjcsIFtyMCwgI3ZwOF93cml0ZXJfYnVmZmVyXQotICAgIGxkcmIgICAgcjExLCBbcjcsIHI0XQotICAgIGNtcGdlICAgcjExLCAjMHhmZgotICAgIGJlcSAgICAgdG9rZW5femVyb193aGlsZV9sb29wX3NlCi0KLSAgICBsZHIgICAgIHI3LCBbcjAsICN2cDhfd3JpdGVyX2J1ZmZlcl0KLSAgICBsZHJiICAgIHIxMCwgW3I3LCByNF0gICAgICAgICAgICAgICA7IHctPmJ1ZmZlclt4XQotICAgIGFkZCAgICAgcjEwLCByMTAsICMxCi0gICAgc3RyYiAgICByMTAsIFtyNywgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbeF0gKyAxCi10b2tlbl9oaWdoX2JpdF9ub3Rfc2V0X3NlCi0gICAgcnNiICAgICByNCwgcjYsICMyNCAgICAgICAgICAgICAgICAgOyAyNC1vZmZzZXQKLSAgICBsZHIgICAgIHIxMCwgW3IwLCAjdnA4X3dyaXRlcl9idWZmZXJdCi0gICAgbHNyICAgICByNywgcjIsIHI0ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA+PiAoMjQtb2Zmc2V0KQotICAgIGxkciAgICAgcjQsIFtyMCwgI3ZwOF93cml0ZXJfcG9zXSAgIDsgdy0+cG9zCi0gICAgbHNsICAgICByMiwgcjIsIHI2ICAgICAgICAgICAgICAgICAgOyBsb3d2YWx1ZSA8PD0gb2Zmc2V0Ci0gICAgbW92ICAgICByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgOyBzaGlmdCA9IGNvdW50Ci0gICAgYWRkICAgICByMTEsIHI0LCAjMSAgICAgICAgICAgICAgICAgOyB3LT5wb3MrKwotICAgIGJpYyAgICAgcjIsIHIyLCAjMHhmZjAwMDAwMCAgICAgICAgIDsgbG93dmFsdWUgJj0gMHhmZmZmZmYKLSAgICBzdHIgICAgIHIxMSwgW3IwLCAjdnA4X3dyaXRlcl9wb3NdCi0gICAgc3ViICAgICByMywgcjMsICM4ICAgICAgICAgICAgICAgICAgOyBjb3VudCAtPSA4Ci0gICAgc3RyYiAgICByNywgW3IxMCwgcjRdICAgICAgICAgICAgICAgOyB3LT5idWZmZXJbdy0+cG9zKytdCi0KLXRva2VuX2NvdW50X2x0X3plcm9fc2UKLSAgICBsc2wgICAgIHIyLCByMiwgcjYgICAgICAgICAgICAgICAgICA7IGxvd3ZhbHVlIDw8PSBzaGlmdAotCi0gICAgc3VicyAgICByMTIsIHIxMiwgIzEKLSAgICBibmUgICAgIHN0b3BfZW5jb2RlX2xvb3AKLQotICAgIGxkciAgICAgcjEwLCBbc3AsICM4XSAgICAgICAgICAgICAgIDsgKnNpemUKLSAgICBsZHIgICAgIHIxMSwgW3IxMF0KLSAgICBsZHIgICAgIHI0LCAgW3IwLCAjdnA4X3dyaXRlcl9wb3NdICA7IHctPnBvcwotICAgIGFkZCAgICAgcjExLCByMTEsIHI0ICAgICAgICAgICAgICAgIDsgKnNpemUgKz0gdy0+cG9zCi0gICAgc3RyICAgICByMTEsIFtyMTBdCi0KLSAgICBsZHIgICAgIHI5LCBbc3AsICMyMF0gICAgICAgICAgICAgICA7IG51bV9wYXJ0cwotICAgIHN1YiAgICAgcjksIHI5LCAjMQotICAgIGxkciAgICAgcjEwLCBbc3AsICMyOF0gICAgICAgICAgICAgIDsgaQotICAgIGNtcCAgICAgcjEwLCByOSAgICAgICAgICAgICAgICAgICAgIDsgaWYoaTwobnVtX3BhcnQgLSAxKSkKLSAgICBiZ2UgICAgIHNraXBfd3JpdGVfcGFydGl0aW9uCi0KLSAgICBsZHIgICAgIHIxMiwgW3NwLCAjNDBdICAgICAgICAgICAgICA7IHB0cgotICAgIGFkZCAgICAgcjEyLCByMTIsIHI0ICAgICAgICAgICAgICAgIDsgcHRyICs9IHctPnBvcwotICAgIHN0ciAgICAgcjEyLCBbc3AsICM0MF0KLQotICAgIGxkciAgICAgcjksIFtzcCwgIzI0XSAgICAgICAgICAgICAgIDsgY3hfZGF0YQotICAgIG1vdiAgICAgcjgsIHI0LCBhc3IgIzgKLSAgICBzdHJiICAgIHI0LCBbcjksICMwXQotICAgIHN0cmIgICAgcjgsIFtyOSwgIzFdCi0gICAgbW92ICAgICByNCwgcjQsIGFzciAjMTYKLSAgICBzdHJiICAgIHI0LCBbcjksICMyXQotCi0gICAgYWRkICAgICByOSwgcjksICMzICAgICAgICAgICAgICAgICAgOyBjeF9kYXRhICs9IDMKLSAgICBzdHIgICAgIHI5LCBbc3AsICMyNF0KLQotc2tpcF93cml0ZV9wYXJ0aXRpb24KLQotICAgIGxkciAgICAgcjExLCBbc3AsICMyOF0gICAgICAgICAgICAgIDsgaQotICAgIGxkciAgICAgcjEwLCBbc3AsICMyMF0gICAgICAgICAgICAgIDsgbnVtX3BhcnRzCi0KLSAgICBhZGQgICAgIHIxMSwgcjExLCAjMSAgICAgICAgICAgICAgICA7IGkrKwotICAgIHN0ciAgICAgcjExLCBbc3AsICMyOF0KLQotICAgIGxkciAgICAgcjcsIFtzcCwgIzMyXSAgICAgICAgICAgICAgIDsgY3BpLT50cF9saXN0W2ldCi0gICAgbW92ICAgICByMSwgI1RPS0VOTElTVF9TWgotICAgIGFkZCAgICAgcjcsIHI3LCByMSAgICAgICAgICAgICAgICAgIDsgbmV4dCBlbGVtZW50IGluIGNwaS0+dHBfbGlzdAotICAgIHN0ciAgICAgcjcsIFtzcCwgIzMyXSAgICAgICAgICAgICAgIDsgY3BpLT50cF9saXN0W2krMV0KLQotICAgIGNtcCAgICAgcjEwLCByMTEKLSAgICBiZ3QgICAgIG51bXBhcnRzX2xvb3AKLQotCi0gICAgYWRkICAgICBzcCwgc3AsICM0NAotICAgIHBvcCAgICAge3I0LXIxMSwgcGN9Ci0gICAgRU5EUAotCi1fVlA4X0NPTVBfY29tbW9uXwotICAgIERDRCAgICAgdnA4X2NvbXBfY29tbW9uCi1fVlA4X0NPTU1PTl9NQnJvd3NfCi0gICAgRENEICAgICB2cDhfY29tbW9uX21iX3Jvd3MKLV9WUDhfQ09NUF90cGxpc3RfCi0gICAgRENEICAgICB2cDhfY29tcF90cGxpc3QKLV9WUDhfQ09NUF9iYzJfCi0gICAgRENEICAgICB2cDhfY29tcF9iYzIKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9mYXN0X2ZkY3Q0eDRfYXJtdjYuYXNtIGIvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9mYXN0X2ZkY3Q0eDRfYXJtdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWJkMmI0Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfZmFzdF9mZGN0NHg0X2FybXY2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotICAgIEVYUE9SVCB8dnA4X2Zhc3RfZmRjdDR4NF9hcm12NnwKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi07IHZvaWQgdnA4X3Nob3J0X2ZkY3Q0eDRfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLXx2cDhfZmFzdF9mZGN0NHg0X2FybXY2fCBQUk9DCi0KLSAgICBzdG1mZCAgICAgICBzcCEsIHtyNCAtIHIxMiwgbHJ9Ci0KLSAgICA7IFBBUlQgMQotCi0gICAgOyBjb2VmZnMgMC0zCi0gICAgbGRyZCAgICAgICAgcjQsIHI1LCBbcjBdICAgICAgICA7IFtpMSB8IGkwXSBbaTMgfCBpMl0KLQotICAgIGxkciAgICAgICAgIHIxMCwgYzc1MDAKLSAgICBsZHIgICAgICAgICByMTEsIGMxNDUwMAotICAgIGxkciAgICAgICAgIHIxMiwgYzB4MjJhNDUzYTAgICAgOyBbMjIxNyo0IHwgNTM1Mio0XQotICAgIGxkciAgICAgICAgIGxyLCBjMHgwMDA4MDAwOAotICAgIHJvciAgICAgICAgIHI1LCByNSwgIzE2ICAgICAgICAgOyBbaTIgfCBpM10KLQotICAgIHFhZGQxNiAgICAgIHI2LCByNCwgcjUgICAgICAgICAgOyBbaTEraTIgfCBpMCtpM10gPSBbYjEgfCBhMV0gd2l0aG91dCBzaGlmdAotICAgIHFzdWIxNiAgICAgIHI3LCByNCwgcjUgICAgICAgICAgOyBbaTEtaTIgfCBpMC1pM10gPSBbYzEgfCBkMV0gd2l0aG91dCBzaGlmdAotCi0gICAgYWRkICAgICAgICAgcjAsIHIwLCByMiAgICAgICAgICA7IHVwZGF0ZSBpbnB1dCBwb2ludGVyCi0KLSAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMipbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCi0KLSAgICBzbXVhZCAgICAgICByNCwgcjYsIGxyICAgICAgICAgIDsgbzAgPSAoaTEraTIpKjggKyAoaTAraTMpKjgKLSAgICBzbXVzZCAgICAgICByNSwgcjYsIGxyICAgICAgICAgIDsgbzIgPSAoaTEraTIpKjggLSAoaTAraTMpKjgKLQotICAgIHNtbGFkICAgICAgIHI2LCByNywgcjEyLCByMTEgICAgOyBvMSA9IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApCi0gICAgc21sc2R4ICAgICAgcjcsIHI3LCByMTIsIHIxMCAgICA7IG8zID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKLQotICAgIGxkcmQgICAgICAgIHI4LCByOSwgW3IwXSAgICAgICAgOyBbaTUgfCBpNF0gW2k3IHwgaTZdCi0KLSAgICBwa2hidCAgICAgICByMywgcjQsIHI2LCBsc2wgIzQgIDsgW28xIHwgbzBdLCBrZWVwIGluIHJlZ2lzdGVyIGZvciBQQVJUIDIKLSAgICBwa2hidCAgICAgICByNiwgcjUsIHI3LCBsc2wgIzQgIDsgW28zIHwgbzJdCi0KLSAgICBzdHIgICAgICAgICByNiwgW3IxLCAjNF0KLQotICAgIDsgY29lZmZzIDQtNwotICAgIHJvciAgICAgICAgIHI5LCByOSwgIzE2ICAgICAgICAgOyBbaTYgfCBpN10KLQotICAgIHFhZGQxNiAgICAgIHI2LCByOCwgcjkgICAgICAgICAgOyBbaTUraTYgfCBpNCtpN10gPSBbYjEgfCBhMV0gd2l0aG91dCBzaGlmdAotICAgIHFzdWIxNiAgICAgIHI3LCByOCwgcjkgICAgICAgICAgOyBbaTUtaTYgfCBpNC1pN10gPSBbYzEgfCBkMV0gd2l0aG91dCBzaGlmdAotCi0gICAgYWRkICAgICAgICAgcjAsIHIwLCByMiAgICAgICAgICA7IHVwZGF0ZSBpbnB1dCBwb2ludGVyCi0KLSAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMnhbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCi0KLSAgICBzbXVhZCAgICAgICByOSwgcjYsIGxyICAgICAgICAgIDsgbzQgPSAoaTUraTYpKjggKyAoaTQraTcpKjgKLSAgICBzbXVzZCAgICAgICByOCwgcjYsIGxyICAgICAgICAgIDsgbzYgPSAoaTUraTYpKjggLSAoaTQraTcpKjgKLQotICAgIHNtbGFkICAgICAgIHI2LCByNywgcjEyLCByMTEgICAgOyBvNSA9IChjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApCi0gICAgc21sc2R4ICAgICAgcjcsIHI3LCByMTIsIHIxMCAgICA7IG83ID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKLQotICAgIGxkcmQgICAgICAgIHI0LCByNSwgW3IwXSAgICAgICAgOyBbaTkgfCBpOF0gW2kxMSB8IGkxMF0KLQotICAgIHBraGJ0ICAgICAgIHI5LCByOSwgcjYsIGxzbCAjNCAgOyBbbzUgfCBvNF0sIGtlZXAgaW4gcmVnaXN0ZXIgZm9yIFBBUlQgMgotICAgIHBraGJ0ICAgICAgIHI2LCByOCwgcjcsIGxzbCAjNCAgOyBbbzcgfCBvNl0KLQotICAgIHN0ciAgICAgICAgIHI2LCBbcjEsICMxMl0KLQotICAgIDsgY29lZmZzIDgtMTEKLSAgICByb3IgICAgICAgICByNSwgcjUsICMxNiAgICAgICAgIDsgW2kxMCB8IGkxMV0KLQotICAgIHFhZGQxNiAgICAgIHI2LCByNCwgcjUgICAgICAgICAgOyBbaTkraTEwIHwgaTgraTExXT1bYjEgfCBhMV0gd2l0aG91dCBzaGlmdAotICAgIHFzdWIxNiAgICAgIHI3LCByNCwgcjUgICAgICAgICAgOyBbaTktaTEwIHwgaTgtaTExXT1bYzEgfCBkMV0gd2l0aG91dCBzaGlmdAotCi0gICAgYWRkICAgICAgICAgcjAsIHIwLCByMiAgICAgICAgICA7IHVwZGF0ZSBpbnB1dCBwb2ludGVyCi0KLSAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMnhbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCi0KLSAgICBzbXVhZCAgICAgICByMiwgcjYsIGxyICAgICAgICAgIDsgbzggPSAoaTkraTEwKSo4ICsgKGk4K2kxMSkqOAotICAgIHNtdXNkICAgICAgIHI4LCByNiwgbHIgICAgICAgICAgOyBvMTAgPSAoaTkraTEwKSo4IC0gKGk4K2kxMSkqOAotCi0gICAgc21sYWQgICAgICAgcjYsIHI3LCByMTIsIHIxMSAgICA7IG85ID0gKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCkKLSAgICBzbWxzZHggICAgICByNywgcjcsIHIxMiwgcjEwICAgIDsgbzExID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKLQotICAgIGxkcmQgICAgICAgIHI0LCByNSwgW3IwXSAgICAgICAgOyBbaTEzIHwgaTEyXSBbaTE1IHwgaTE0XQotCi0gICAgcGtoYnQgICAgICAgcjIsIHIyLCByNiwgbHNsICM0ICA7IFtvOSB8IG84XSwga2VlcCBpbiByZWdpc3RlciBmb3IgUEFSVCAyCi0gICAgcGtoYnQgICAgICAgcjYsIHI4LCByNywgbHNsICM0ICA7IFtvMTEgfCBvMTBdCi0KLSAgICBzdHIgICAgICAgICByNiwgW3IxLCAjMjBdCi0KLSAgICA7IGNvZWZmcyAxMi0xNQotICAgIHJvciAgICAgICAgIHI1LCByNSwgIzE2ICAgICAgICAgOyBbaTE0IHwgaTE1XQotCi0gICAgcWFkZDE2ICAgICAgcjYsIHI0LCByNSAgICAgICAgICA7IFtpMTMraTE0IHwgaTEyK2kxNV09W2IxfGExXSB3aXRob3V0IHNoaWZ0Ci0gICAgcXN1YjE2ICAgICAgcjcsIHI0LCByNSAgICAgICAgICA7IFtpMTMtaTE0IHwgaTEyLWkxNV09W2MxfGQxXSB3aXRob3V0IHNoaWZ0Ci0KLSAgICBxYWRkMTYgICAgICByNywgcjcsIHI3ICAgICAgICAgIDsgMnhbYzF8ZDFdIC0tPiB3ZSBjYW4gdXNlIHNtbGFkIGFuZCBzbWxzZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB3aXRoIDIyMTcqNCBhbmQgNTM1Mio0IHdpdGhvdXQgbG9zaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduIGJpdCAob3ZlcmZsb3cpCi0KLSAgICBzbXVhZCAgICAgICByNCwgcjYsIGxyICAgICAgICAgIDsgbzEyID0gKGkxMytpMTQpKjggKyAoaTEyK2kxNSkqOAotICAgIHNtdXNkICAgICAgIHI1LCByNiwgbHIgICAgICAgICAgOyBvMTQgPSAoaTEzK2kxNCkqOCAtIChpMTIraTE1KSo4Ci0KLSAgICBzbWxhZCAgICAgICByNiwgcjcsIHIxMiwgcjExICAgIDsgbzEzID0gKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCkKLSAgICBzbWxzZHggICAgICByNywgcjcsIHIxMiwgcjEwICAgIDsgbzE1ID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCkKLQotICAgIHBraGJ0ICAgICAgIHIwLCByNCwgcjYsIGxzbCAjNCAgOyBbbzEzIHwgbzEyXSwga2VlcCBpbiByZWdpc3RlciBmb3IgUEFSVCAyCi0gICAgcGtoYnQgICAgICAgcjYsIHI1LCByNywgbHNsICM0ICA7IFtvMTUgfCBvMTRdCi0KLSAgICBzdHIgICAgICAgICByNiwgW3IxLCAjMjhdCi0KLQotICAgIDsgUEFSVCAyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBsZHIgICAgICAgICByMTEsIGMxMjAwMAotICAgIGxkciAgICAgICAgIHIxMCwgYzUxMDAwCi0gICAgbGRyICAgICAgICAgbHIsIGMweDAwMDcwMDA3Ci0KLSAgICBxYWRkMTYgICAgICByNCwgcjMsIHIwICAgICAgICAgIDsgYTEgPSBbaTEraTEzIHwgaTAraTEyXQotICAgIHFhZGQxNiAgICAgIHI1LCByOSwgcjIgICAgICAgICAgOyBiMSA9IFtpNStpOSAgfCAgaTQraThdCi0gICAgcXN1YjE2ICAgICAgcjYsIHI5LCByMiAgICAgICAgICA7IGMxID0gW2k1LWk5ICB8ICBpNC1pOF0KLSAgICBxc3ViMTYgICAgICByNywgcjMsIHIwICAgICAgICAgIDsgZDEgPSBbaTEtaTEzIHwgaTAtaTEyXQotCi0gICAgcWFkZDE2ICAgICAgcjQsIHI0LCBsciAgICAgICAgICA7IGExICsgNwotCi0gICAgYWRkICAgICAgICAgcjAsIHIxMSwgIzB4MTAwMDAgICA7IGFkZCAoZCE9MCkKLQotICAgIHFhZGQxNiAgICAgIHIyLCByNCwgcjUgICAgICAgICAgOyBhMSArIGIxICsgNwotICAgIHFzdWIxNiAgICAgIHIzLCByNCwgcjUgICAgICAgICAgOyBhMSAtIGIxICsgNwotCi0gICAgbGRyICAgICAgICAgcjEyLCBjMHgwOGE5MTRlOCAgICA7IFsyMjE3IHwgNTM1Ml0KLQotICAgIGxzbCAgICAgICAgIHI4LCByMiwgIzE2ICAgICAgICAgOyBwcmVwYXJlIGJvdHRvbSBoYWxmd29yZCBmb3Igc2NhbGluZwotICAgIGFzciAgICAgICAgIHIyLCByMiwgIzQgICAgICAgICAgOyBzY2FsZSB0b3AgaGFsZndvcmQKLSAgICBsc2wgICAgICAgICByOSwgcjMsICMxNiAgICAgICAgIDsgcHJlcGFyZSBib3R0b20gaGFsZndvcmQgZm9yIHNjYWxpbmcKLSAgICBhc3IgICAgICAgICByMywgcjMsICM0ICAgICAgICAgIDsgc2NhbGUgdG9wIGhhbGZ3b3JkCi0gICAgcGtodGIgICAgICAgcjQsIHIyLCByOCwgYXNyICMyMCA7IHBhY2sgYW5kIHNjYWxlIGJvdHRvbSBoYWxmd29yZAotICAgIHBraHRiICAgICAgIHI1LCByMywgcjksIGFzciAjMjAgOyBwYWNrIGFuZCBzY2FsZSBib3R0b20gaGFsZndvcmQKLQotICAgIHNtdWxidCAgICAgIHIyLCByNiwgcjEyICAgICAgICAgOyBbIC0tLS0tLSB8IGMxKjIyMTddCi0gICAgc3RyICAgICAgICAgcjQsIFtyMSwgIzBdICAgICAgICA7IFsgICAgIG8xIHwgICAgICBvMF0KLSAgICBzbXVsdHQgICAgICByMywgcjYsIHIxMiAgICAgICAgIDsgW2MxKjIyMTcgfCAtLS0tLS0gXQotICAgIHN0ciAgICAgICAgIHI1LCBbcjEsICMxNl0gICAgICAgOyBbICAgICBvOSB8ICAgICAgbzhdCi0KLSAgICBzbWxhYmIgICAgICByOCwgcjcsIHIxMiwgcjIgICAgIDsgWyAtLS0tLS0gfCBkMSo1MzUyXQotICAgIHNtbGF0YiAgICAgIHI5LCByNywgcjEyLCByMyAgICAgOyBbZDEqNTM1MiB8IC0tLS0tLSBdCi0KLSAgICBzbXVsYmIgICAgICByMiwgcjYsIHIxMiAgICAgICAgIDsgWyAtLS0tLS0gfCBjMSo1MzUyXQotICAgIHNtdWx0YiAgICAgIHIzLCByNiwgcjEyICAgICAgICAgOyBbYzEqNTM1MiB8IC0tLS0tLSBdCi0KLSAgICBsc2xzICAgICAgICByNiwgcjcsICMxNiAgICAgICAgIDsgZDEgIT0gMCA/Ci0gICAgYWRkZXEgICAgICAgcjgsIHI4LCByMTEgICAgICAgICA7IGMxX2IqMjIxNytkMV9iKjUzNTIrMTIwMDAgKyAoZD09MCkKLSAgICBhZGRuZSAgICAgICByOCwgcjgsIHIwICAgICAgICAgIDsgYzFfYioyMjE3K2QxX2IqNTM1MisxMjAwMCArIChkIT0wKQotICAgIGFzcnMgICAgICAgIHI2LCByNywgIzE2Ci0gICAgYWRkZXEgICAgICAgcjksIHI5LCByMTEgICAgICAgICA7IGMxX3QqMjIxNytkMV90KjUzNTIrMTIwMDAgKyAoZD09MCkKLSAgICBhZGRuZSAgICAgICByOSwgcjksIHIwICAgICAgICAgIDsgYzFfdCoyMjE3K2QxX3QqNTM1MisxMjAwMCArIChkIT0wKQotCi0gICAgc21sYWJ0ICAgICAgcjQsIHI3LCByMTIsIHIxMCAgICA7IFsgLS0tLS0tIHwgZDEqMjIxN10gKyA1MTAwMAotICAgIHNtbGF0dCAgICAgIHI1LCByNywgcjEyLCByMTAgICAgOyBbZDEqMjIxNyB8IC0tLS0tLSBdICsgNTEwMDAKLQotICAgIHBraHRiICAgICAgIHI5LCByOSwgcjgsIGFzciAjMTYKLQotICAgIHN1YiAgICAgICAgIHI0LCByNCwgcjIKLSAgICBzdWIgICAgICAgICByNSwgcjUsIHIzCi0KLSAgICBsZHIgICAgICAgICByMywgW3IxLCAjNF0gICAgICAgIDsgW2kzIHwgaTJdCi0KLSAgICBwa2h0YiAgICAgICByNSwgcjUsIHI0LCBhc3IgIzE2IDsgW28xM3xvMTJdCi0KLSAgICBzdHIgICAgICAgICByOSwgW3IxLCAjOF0gICAgICAgIDsgW281IHwgMDRdCi0KLSAgICBsZHIgICAgICAgICByOSwgW3IxLCAjMTJdICAgICAgIDsgW2k3IHwgaTZdCi0gICAgbGRyICAgICAgICAgcjgsIFtyMSwgIzI4XSAgICAgICA7IFtpMTV8aTE0XQotICAgIGxkciAgICAgICAgIHIyLCBbcjEsICMyMF0gICAgICAgOyBbaTExfGkxMF0KLSAgICBzdHIgICAgICAgICByNSwgW3IxLCAjMjRdICAgICAgIDsgW28xM3xvMTJdCi0KLSAgICBxYWRkMTYgICAgICByNCwgcjMsIHI4ICAgICAgICAgIDsgYTEgPSBbaTMraTE1IHwgaTIraTE0XQotICAgIHFhZGQxNiAgICAgIHI1LCByOSwgcjIgICAgICAgICAgOyBiMSA9IFtpNytpMTEgfCBpNitpMTBdCi0KLSAgICBxYWRkMTYgICAgICByNCwgcjQsIGxyICAgICAgICAgIDsgYTEgKyA3Ci0KLSAgICBxc3ViMTYgICAgICByNiwgcjksIHIyICAgICAgICAgIDsgYzEgPSBbaTctaTExIHwgaTYtaTEwXQotICAgIHFhZGQxNiAgICAgIHIyLCByNCwgcjUgICAgICAgICAgOyBhMSArIGIxICsgNwotICAgIHFzdWIxNiAgICAgIHI3LCByMywgcjggICAgICAgICAgOyBkMSA9IFtpMy1pMTUgfCBpMi1pMTRdCi0gICAgcXN1YjE2ICAgICAgcjMsIHI0LCByNSAgICAgICAgICA7IGExIC0gYjEgKyA3Ci0KLSAgICBsc2wgICAgICAgICByOCwgcjIsICMxNiAgICAgICAgIDsgcHJlcGFyZSBib3R0b20gaGFsZndvcmQgZm9yIHNjYWxpbmcKLSAgICBhc3IgICAgICAgICByMiwgcjIsICM0ICAgICAgICAgIDsgc2NhbGUgdG9wIGhhbGZ3b3JkCi0gICAgbHNsICAgICAgICAgcjksIHIzLCAjMTYgICAgICAgICA7IHByZXBhcmUgYm90dG9tIGhhbGZ3b3JkIGZvciBzY2FsaW5nCi0gICAgYXNyICAgICAgICAgcjMsIHIzLCAjNCAgICAgICAgICA7IHNjYWxlIHRvcCBoYWxmd29yZAotICAgIHBraHRiICAgICAgIHI0LCByMiwgcjgsIGFzciAjMjAgOyBwYWNrIGFuZCBzY2FsZSBib3R0b20gaGFsZndvcmQKLSAgICBwa2h0YiAgICAgICByNSwgcjMsIHI5LCBhc3IgIzIwIDsgcGFjayBhbmQgc2NhbGUgYm90dG9tIGhhbGZ3b3JkCi0KLSAgICBzbXVsYnQgICAgICByMiwgcjYsIHIxMiAgICAgICAgIDsgWyAtLS0tLS0gfCBjMSoyMjE3XQotICAgIHN0ciAgICAgICAgIHI0LCBbcjEsICM0XSAgICAgICAgOyBbICAgICBvMyB8ICAgICAgbzJdCi0gICAgc211bHR0ICAgICAgcjMsIHI2LCByMTIgICAgICAgICA7IFtjMSoyMjE3IHwgLS0tLS0tIF0KLSAgICBzdHIgICAgICAgICByNSwgW3IxLCAjMjBdICAgICAgIDsgWyAgICBvMTEgfCAgICAgbzEwXQotCi0gICAgc21sYWJiICAgICAgcjgsIHI3LCByMTIsIHIyICAgICA7IFsgLS0tLS0tIHwgZDEqNTM1Ml0KLSAgICBzbWxhdGIgICAgICByOSwgcjcsIHIxMiwgcjMgICAgIDsgW2QxKjUzNTIgfCAtLS0tLS0gXQotCi0gICAgc211bGJiICAgICAgcjIsIHI2LCByMTIgICAgICAgICA7IFsgLS0tLS0tIHwgYzEqNTM1Ml0KLSAgICBzbXVsdGIgICAgICByMywgcjYsIHIxMiAgICAgICAgIDsgW2MxKjUzNTIgfCAtLS0tLS0gXQotCi0gICAgbHNscyAgICAgICAgcjYsIHI3LCAjMTYgICAgICAgICA7IGQxICE9IDAgPwotICAgIGFkZGVxICAgICAgIHI4LCByOCwgcjExICAgICAgICAgOyBjMV9iKjIyMTcrZDFfYio1MzUyKzEyMDAwICsgKGQ9PTApCi0gICAgYWRkbmUgICAgICAgcjgsIHI4LCByMCAgICAgICAgICA7IGMxX2IqMjIxNytkMV9iKjUzNTIrMTIwMDAgKyAoZCE9MCkKLQotICAgIGFzcnMgICAgICAgIHI2LCByNywgIzE2Ci0gICAgYWRkZXEgICAgICAgcjksIHI5LCByMTEgICAgICAgICA7IGMxX3QqMjIxNytkMV90KjUzNTIrMTIwMDAgKyAoZD09MCkKLSAgICBhZGRuZSAgICAgICByOSwgcjksIHIwICAgICAgICAgIDsgYzFfdCoyMjE3K2QxX3QqNTM1MisxMjAwMCArIChkIT0wKQotCi0gICAgc21sYWJ0ICAgICAgcjQsIHI3LCByMTIsIHIxMCAgICA7IFsgLS0tLS0tIHwgZDEqMjIxN10gKyA1MTAwMAotICAgIHNtbGF0dCAgICAgIHI1LCByNywgcjEyLCByMTAgICAgOyBbZDEqMjIxNyB8IC0tLS0tLSBdICsgNTEwMDAKLQotICAgIHBraHRiICAgICAgIHI5LCByOSwgcjgsIGFzciAjMTYKLQotICAgIHN1YiAgICAgICAgIHI0LCByNCwgcjIKLSAgICBzdWIgICAgICAgICByNSwgcjUsIHIzCi0KLSAgICBzdHIgICAgICAgICByOSwgW3IxLCAjMTJdICAgICAgIDsgW283IHwgbzZdCi0gICAgcGtodGIgICAgICAgcjUsIHI1LCByNCwgYXNyICMxNiA7IFtvMTV8bzE0XQotCi0gICAgc3RyICAgICAgICAgcjUsIFtyMSwgIzI4XSAgICAgICA7IFtvMTV8bzE0XQotCi0gICAgbGRtZmQgICAgICAgc3AhLCB7cjQgLSByMTIsIHBjfQotCi0gICAgRU5EUAotCi07IFVzZWQgY29uc3RhbnRzCi1jNzUwMAotICAgIERDRCAgICAgNzUwMAotYzE0NTAwCi0gICAgRENEICAgICAxNDUwMAotYzB4MjJhNDUzYTAKLSAgICBEQ0QgICAgIDB4MjJhNDUzYTAKLWMweDAwMDgwMDA4Ci0gICAgRENEICAgICAweDAwMDgwMDA4Ci1jMTIwMDAKLSAgICBEQ0QgICAgIDEyMDAwCi1jNTEwMDAKLSAgICBEQ0QgICAgIDUxMDAwCi1jMHgwMDA3MDAwNwotICAgIERDRCAgICAgMHgwMDA3MDAwNwotYzB4MDhhOTE0ZTgKLSAgICBEQ0QgICAgIDB4MDhhOTE0ZTgKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9mYXN0X3F1YW50aXplX2JfYXJtdjYuYXNtIGIvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9mYXN0X3F1YW50aXplX2JfYXJtdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJmNjAzLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfZmFzdF9xdWFudGl6ZV9iX2FybXY2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X2Zhc3RfcXVhbnRpemVfYl9hcm12NnwKLQotICAgIElOQ0xVREUgYXNtX2VuY19vZmZzZXRzLmFzbQotCi0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi07IHIwICAgIEJMT0NLICpiCi07IHIxICAgIEJMT0NLRCAqZAotfHZwOF9mYXN0X3F1YW50aXplX2JfYXJtdjZ8IFBST0MKLSAgICBzdG1mZCAgIHNwISwge3IxLCByNC1yMTEsIGxyfQotCi0gICAgbGRyICAgICByMywgW3IwLCAjdnA4X2Jsb2NrX2NvZWZmXSAgICAgIDsgY29lZmYKLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfYmxvY2tfcXVhbnRfZmFzdF0gOyBxdWFudF9mYXN0Ci0gICAgbGRyICAgICByNSwgW3IwLCAjdnA4X2Jsb2NrX3JvdW5kXSAgICAgIDsgcm91bmQKLSAgICBsZHIgICAgIHI2LCBbcjEsICN2cDhfYmxvY2tkX3Fjb2VmZl0gICAgOyBxY29lZmYKLSAgICBsZHIgICAgIHI3LCBbcjEsICN2cDhfYmxvY2tkX2RxY29lZmZdICAgOyBkcWNvZWZmCi0gICAgbGRyICAgICByOCwgW3IxLCAjdnA4X2Jsb2NrZF9kZXF1YW50XSAgIDsgZGVxdWFudAotCi0gICAgbGRyICAgICByMiwgbG9vcF9jb3VudCAgICAgICAgICA7IGxvb3BfY291bnQ9MHgxMDAwMDAwLiAnbHNscycgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGNvdW50ZXIgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBpdCBjYW4gYmUgdXNlZCB0byBtYXJrIG5vbnplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcXVhbnRpemVkIGNvZWZmaWNpZW50IHBhaXJzLgotCi0gICAgbW92ICAgICByMSwgIzAgICAgICAgICAgICAgICAgICA7IGZsYWdzIGZvciBxdWFudGl6ZWQgY29lZmZzCi0KLSAgICA7IFBBUlQgMTogcXVhbnRpemF0aW9uIGFuZCBkZXF1YW50aXphdGlvbiBsb29wCi1sb29wCi0gICAgbGRyICAgICByOSwgW3IzXSwgIzQgICAgICAgICAgICA7IFt6MSB8IHowXQotICAgIGxkciAgICAgcjEwLCBbcjVdLCAjNCAgICAgICAgICAgOyBbcjEgfCByMF0KLSAgICBsZHIgICAgIHIxMSwgW3I0XSwgIzQgICAgICAgICAgIDsgW3ExIHwgcTBdCi0KLSAgICBzc2F0MTYgIGxyLCAjMSwgcjkgICAgICAgICAgICAgIDsgW3N6MSB8IHN6MF0KLSAgICBlb3IgICAgIHI5LCByOSwgbHIgICAgICAgICAgICAgIDsgW3oxIF4gc3oxIHwgejAgXiBzejBdCi0gICAgc3N1YjE2ICByOSwgcjksIGxyICAgICAgICAgICAgICA7IHggPSAoeiBeIHN6KSAtIHN6Ci0gICAgc2FkZDE2ICByOSwgcjksIHIxMCAgICAgICAgICAgICA7IFt4MStyMSB8IHgwK3IwXQotCi0gICAgbGRyICAgICByMTIsIFtyM10sICM0ICAgICAgICAgICA7IFt6MyB8IHoyXQotCi0gICAgc211bGJiICByMCwgcjksIHIxMSAgICAgICAgICAgICA7IFsoeDArcjApKnEwXQotICAgIHNtdWx0dCAgcjksIHI5LCByMTEgICAgICAgICAgICAgOyBbKHgxK3IxKSpxMV0KLQotICAgIGxkciAgICAgcjEwLCBbcjVdLCAjNCAgICAgICAgICAgOyBbcjMgfCByMl0KLQotICAgIHNzYXQxNiAgcjExLCAjMSwgcjEyICAgICAgICAgICAgOyBbc3ozIHwgc3oyXQotICAgIGVvciAgICAgcjEyLCByMTIsIHIxMSAgICAgICAgICAgOyBbejMgXiBzejMgfCB6MiBeIHN6Ml0KLSAgICBwa2h0YiAgIHIwLCByOSwgcjAsIGFzciAjMTYgICAgIDsgW3kxIHwgeTBdCi0gICAgbGRyICAgICByOSwgW3I0XSwgIzQgICAgICAgICAgICA7IFtxMyB8IHEyXQotICAgIHNzdWIxNiAgcjEyLCByMTIsIHIxMSAgICAgICAgICAgOyB4ID0gKHogXiBzeikgLSBzegotCi0gICAgc2FkZDE2ICByMTIsIHIxMiwgcjEwICAgICAgICAgICA7IFt4MytyMyB8IHgyK3IyXQotCi0gICAgZW9yICAgICByMCwgcjAsIGxyICAgICAgICAgICAgICA7IFsoeTEgXiBzejEpIHwgKHkwIF4gc3owKV0KLQotICAgIHNtdWxiYiAgcjEwLCByMTIsIHI5ICAgICAgICAgICAgOyBbKHgyK3IyKSpxMl0KLSAgICBzbXVsdHQgIHIxMiwgcjEyLCByOSAgICAgICAgICAgIDsgWyh4MytyMykqcTNdCi0KLSAgICBzc3ViMTYgIHIwLCByMCwgbHIgICAgICAgICAgICAgIDsgeCA9ICh5IF4gc3opIC0gc3oKLQotICAgIGNtcCAgICAgcjAsICMwICAgICAgICAgICAgICAgICAgOyBjaGVjayBpZiB6ZXJvCi0gICAgb3JybmUgICByMSwgcjEsIHIyLCBsc3IgIzI0ICAgICA7IGFkZCBmbGFnIGZvciBub256ZXJvIGNvZWZmcwotCi0gICAgc3RyICAgICByMCwgW3I2XSwgIzQgICAgICAgICAgICA7ICpxY29lZmYrKyA9IHgKLSAgICBsZHIgICAgIHI5LCBbcjhdLCAjNCAgICAgICAgICAgIDsgW2RxMSB8IGRxMF0KLQotICAgIHBraHRiICAgcjEwLCByMTIsIHIxMCwgYXNyICMxNiAgOyBbeTMgfCB5Ml0KLSAgICBlb3IgICAgIHIxMCwgcjEwLCByMTEgICAgICAgICAgIDsgWyh5MyBeIHN6MykgfCAoeTIgXiBzejIpXQotICAgIHNzdWIxNiAgcjEwLCByMTAsIHIxMSAgICAgICAgICAgOyB4ID0gKHkgXiBzeikgLSBzegotCi0gICAgY21wICAgICByMTAsICMwICAgICAgICAgICAgICAgICA7IGNoZWNrIGlmIHplcm8KLSAgICBvcnJuZSAgIHIxLCByMSwgcjIsIGxzciAjMjMgICAgIDsgYWRkIGZsYWcgZm9yIG5vbnplcm8gY29lZmZzCi0KLSAgICBzdHIgICAgIHIxMCwgW3I2XSwgIzQgICAgICAgICAgIDsgKnFjb2VmZisrID0geAotICAgIGxkciAgICAgcjExLCBbcjhdLCAjNCAgICAgICAgICAgOyBbZHEzIHwgZHEyXQotCi0gICAgc211bGJiICByMTIsIHIwLCByOSAgICAgICAgICAgICA7IFt4MCpkcTBdCi0gICAgc211bHR0ICByMCwgcjAsIHI5ICAgICAgICAgICAgICA7IFt4MSpkcTFdCi0KLSAgICBzbXVsYmIgIHI5LCByMTAsIHIxMSAgICAgICAgICAgIDsgW3gyKmRxMl0KLSAgICBzbXVsdHQgIHIxMCwgcjEwLCByMTEgICAgICAgICAgIDsgW3gzKmRxM10KLQotICAgIGxzbHMgICAgcjIsIHIyLCAjMiAgICAgICAgICAgICAgOyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgc3RyaCAgICByMTIsIFtyNywgIzBdICAgICAgICAgICA7IGRxY29lZmZbMF0gPSBbeDAqZHEwXQotICAgIHN0cmggICAgcjAsIFtyNywgIzJdICAgICAgICAgICAgOyBkcWNvZWZmWzFdID0gW3gxKmRxMV0KLSAgICBzdHJoICAgIHI5LCBbcjcsICM0XSAgICAgICAgICAgIDsgZHFjb2VmZlsyXSA9IFt4MipkcTJdCi0gICAgc3RyaCAgICByMTAsIFtyNywgIzZdICAgICAgICAgICA7IGRxY29lZmZbM10gPSBbeDMqZHEzXQotICAgIGFkZCAgICAgcjcsIHI3LCAjOCAgICAgICAgICAgICAgOyBkcWNvZWZmICs9IDgKLSAgICBibmUgICAgIGxvb3AKLQotICAgIDsgUEFSVCAyOiBjaGVjayBwb3NpdGlvbiBmb3IgZW9iLi4uCi0gICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgICAgICA7IGluaXQgZW9iCi0gICAgY21wICAgICByMSwgIzAgICAgICAgICAgICAgICAgICA7IGNvZWZmcyBhZnRlciBxdWFudGl6YXRpb24/Ci0gICAgbGRyICAgICByMTEsIFtzcCwgIzBdICAgICAgICAgICA7IHJlc3RvcmUgQkxPQ0tEIHBvaW50ZXIKLSAgICBiZXEgICAgIGVuZCAgICAgICAgICAgICAgICAgICAgIDsgc2tpcCBlb2IgY2FsY3VsYXRpb25zIGlmIGFsbCB6ZXJvCi0KLSAgICBsZHIgICAgIHIwLCBbcjExLCAjdnA4X2Jsb2NrZF9xY29lZmZdCi0KLSAgICA7IGNoZWNrIHNob3J0Y3V0IGZvciBub256ZXJvIHFjb2VmZnMKLSAgICB0c3QgICAgcjEsICMweDgwCi0gICAgYm5lICAgIHF1YW50X2NvZWZmXzE1XzE0Ci0gICAgdHN0ICAgIHIxLCAjMHgyMAotICAgIGJuZSAgICBxdWFudF9jb2VmZl8xM18xMQotICAgIHRzdCAgICByMSwgIzB4OAotICAgIGJuZSAgICBxdWFudF9jb2VmZl8xMl83Ci0gICAgdHN0ICAgIHIxLCAjMHg0MAotICAgIGJuZSAgICBxdWFudF9jb2VmZl8xMF85Ci0gICAgdHN0ICAgIHIxLCAjMHgxMAotICAgIGJuZSAgICBxdWFudF9jb2VmZl84XzMKLSAgICB0c3QgICAgcjEsICMweDIKLSAgICBibmUgICAgcXVhbnRfY29lZmZfNl81Ci0gICAgdHN0ICAgIHIxLCAjMHg0Ci0gICAgYm5lICAgIHF1YW50X2NvZWZmXzRfMgotICAgIGIgICAgICBxdWFudF9jb2VmZl8xXzAKLQotcXVhbnRfY29lZmZfMTVfMTQKLSAgICBsZHJoICAgIHIyLCBbcjAsICMzMF0gICAgICAgOyByYz0xNSwgaT0xNQotICAgIG1vdiAgICAgbHIsICMxNgotICAgIGNtcCAgICAgcjIsICMwCi0gICAgYm5lICAgICBlbmQKLQotICAgIGxkcmggICAgcjMsIFtyMCwgIzI4XSAgICAgICA7IHJjPTE0LCBpPTE0Ci0gICAgbW92ICAgICBsciwgIzE1Ci0gICAgY21wICAgICByMywgIzAKLSAgICBibmUgICAgIGVuZAotCi1xdWFudF9jb2VmZl8xM18xMQotICAgIGxkcmggICAgcjIsIFtyMCwgIzIyXSAgICAgICA7IHJjPTExLCBpPTEzCi0gICAgbW92ICAgICBsciwgIzE0Ci0gICAgY21wICAgICByMiwgIzAKLSAgICBibmUgICAgIGVuZAotCi1xdWFudF9jb2VmZl8xMl83Ci0gICAgbGRyaCAgICByMywgW3IwLCAjMTRdICAgICAgIDsgcmM9NywgIGk9MTIKLSAgICBtb3YgICAgIGxyLCAjMTMKLSAgICBjbXAgICAgIHIzLCAjMAotICAgIGJuZSAgICAgZW5kCi0KLSAgICBsZHJoICAgIHIyLCBbcjAsICMyMF0gICAgICAgOyByYz0xMCwgaT0xMQotICAgIG1vdiAgICAgbHIsICMxMgotICAgIGNtcCAgICAgcjIsICMwCi0gICAgYm5lICAgICBlbmQKLQotcXVhbnRfY29lZmZfMTBfOQotICAgIGxkcmggICAgcjMsIFtyMCwgIzI2XSAgICAgICA7IHJjPTEzLCBpPTEwCi0gICAgbW92ICAgICBsciwgIzExCi0gICAgY21wICAgICByMywgIzAKLSAgICBibmUgICAgIGVuZAotCi0gICAgbGRyaCAgICByMiwgW3IwLCAjMjRdICAgICAgIDsgcmM9MTIsIGk9OQotICAgIG1vdiAgICAgbHIsICMxMAotICAgIGNtcCAgICAgcjIsICMwCi0gICAgYm5lICAgICBlbmQKLQotcXVhbnRfY29lZmZfOF8zCi0gICAgbGRyaCAgICByMywgW3IwLCAjMThdICAgICAgIDsgcmM9OSwgIGk9OAotICAgIG1vdiAgICAgbHIsICM5Ci0gICAgY21wICAgICByMywgIzAKLSAgICBibmUgICAgIGVuZAotCi0gICAgbGRyaCAgICByMiwgW3IwLCAjMTJdICAgICAgIDsgcmM9NiwgIGk9NwotICAgIG1vdiAgICAgbHIsICM4Ci0gICAgY21wICAgICByMiwgIzAKLSAgICBibmUgICAgIGVuZAotCi1xdWFudF9jb2VmZl82XzUKLSAgICBsZHJoICAgIHIzLCBbcjAsICM2XSAgICAgICAgOyByYz0zLCAgaT02Ci0gICAgbW92ICAgICBsciwgIzcKLSAgICBjbXAgICAgIHIzLCAjMAotICAgIGJuZSAgICAgZW5kCi0KLSAgICBsZHJoICAgIHIyLCBbcjAsICM0XSAgICAgICAgOyByYz0yLCAgaT01Ci0gICAgbW92ICAgICBsciwgIzYKLSAgICBjbXAgICAgIHIyLCAjMAotICAgIGJuZSAgICAgZW5kCi0KLXF1YW50X2NvZWZmXzRfMgotICAgIGxkcmggICAgcjMsIFtyMCwgIzEwXSAgICAgICA7IHJjPTUsICBpPTQKLSAgICBtb3YgICAgIGxyLCAjNQotICAgIGNtcCAgICAgcjMsICMwCi0gICAgYm5lICAgICBlbmQKLQotICAgIGxkcmggICAgcjIsIFtyMCwgIzE2XSAgICAgICA7IHJjPTgsICBpPTMKLSAgICBtb3YgICAgIGxyLCAjNAotICAgIGNtcCAgICAgcjIsICMwCi0gICAgYm5lICAgICBlbmQKLQotICAgIGxkcmggICAgcjMsIFtyMCwgIzhdICAgICAgICA7IHJjPTQsICBpPTIKLSAgICBtb3YgICAgIGxyLCAjMwotICAgIGNtcCAgICAgcjMsICMwCi0gICAgYm5lICAgICBlbmQKLQotcXVhbnRfY29lZmZfMV8wCi0gICAgbGRyaCAgICByMiwgW3IwLCAjMl0gICAgICAgIDsgcmM9MSwgIGk9MQotICAgIG1vdiAgICAgbHIsICMyCi0gICAgY21wICAgICByMiwgIzAKLSAgICBibmUgICAgIGVuZAotCi0gICAgbW92ICAgICBsciwgIzEgICAgICAgICAgICAgIDsgcmM9MCwgIGk9MAotCi1lbmQKLSAgICBzdHIgICAgIGxyLCBbcjExLCAjdnA4X2Jsb2NrZF9lb2JdCi0gICAgbGRtZmQgICBzcCEsIHtyMSwgcjQtcjExLCBwY30KLQotICAgIEVORFAKLQotbG9vcF9jb3VudAotICAgIERDRCAgICAgMHgxMDAwMDAwCi0KLSAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9tc2UxNngxNl9hcm12Ni5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X21zZTE2eDE2X2FybXY2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwNjBkNy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X21zZTE2eDE2X2FybXY2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X21zZTE2eDE2X2FybXY2fAotCi0gICAgQVJNCi0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCi07IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKLTsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKLTsKLTtub3RlOiBCYXNlZCBvbiB2cDhfdmFyaWFuY2UxNngxNl9hcm12Ni4gSW4gdGhpcyBmdW5jdGlvbiwgc3VtIGlzIG5ldmVyIHVzZWQuCi07ICAgICAgU28sIHdlIGNhbiByZW1vdmUgdGhpcyBwYXJ0IG9mIGNhbGN1bGF0aW9uLgotCi18dnA4X21zZTE2eDE2X2FybXY2fCBQUk9DCi0KLSAgICBwdXNoICAgIHtyNC1yOSwgbHJ9Ci0gICAgbW92ICAgICByMTIsICMxNiAgICAgICAgICAgIDsgc2V0IGxvb3AgY291bnRlciB0byAxNiAoPWJsb2NrIGhlaWdodCkKLQotICAgIG1vdiAgICAgcjQsICMwICAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAotCi1sb29wCi0gICAgOyAxc3QgNCBwaXhlbHMKLSAgICBsZHIgICAgIHI1LCBbcjAsICMweDBdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscwotICAgIGxkciAgICAgcjYsIFtyMiwgIzB4MF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0KLSAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgOyBjb25zdGFudCB6ZXJvCi0KLSAgICB1c3ViOCAgIHI4LCByNSwgcjYgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIHNlbCAgICAgcjcsIHI4LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKLSAgICB1c3ViOCAgIHI5LCByNiwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCi0gICAgc2VsICAgICByOCwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNSwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjYsIHI4LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI4LCByOCwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLQotICAgIGxkciAgICAgcjUsIFtyMCwgIzB4NF0gICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI2LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByOCwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByNCwgcjYsIHI2LCByNCAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgMm5kIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNiwgW3IyLCAjMHg0XSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLSAgICBzbWxhZCAgIHI0LCByNywgcjcsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0gICAgdXN1YjggICByOCwgcjUsIHI2ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByOCwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByOSwgcjYsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjgsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjUsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI2LCByOCwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByOCwgcjgsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNSwgW3IwLCAjMHg4XSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI2LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByOCwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByNCwgcjYsIHI2LCByNCAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgM3JkIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNiwgW3IyLCAjMHg4XSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLSAgICBzbWxhZCAgIHI0LCByNywgcjcsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0gICAgdXN1YjggICByOCwgcjUsIHI2ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByOCwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByOSwgcjYsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjgsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjUsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI2LCByOCwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByOCwgcjgsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICBsZHIgICAgIHI1LCBbcjAsICMweGNdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscwotCi0gICAgOyBjYWxjdWxhdGUgc3NlCi0gICAgdXh0YjE2ICByNiwgcjggICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCi0gICAgdXh0YjE2ICByNywgcjgsIHJvciAjOCAgICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcwotICAgIHNtbGFkICAgcjQsIHI2LCByNiwgcjQgICAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCi0KLSAgICA7IDR0aCA0IHBpeGVscwotICAgIGxkciAgICAgcjYsIFtyMiwgIzB4Y10gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0gICAgc21sYWQgICByNCwgcjcsIHI3LCByNCAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKLQotICAgIHVzdWI4ICAgcjgsIHI1LCByNiAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCi0gICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyY19wdHIgdG8gbmV4dCByb3cKLSAgICBzZWwgICAgIHI3LCByOCwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByOSwgcjYsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3RfcHRyIHRvIG5leHQgcm93Ci0gICAgc2VsICAgICByOCwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNSwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjYsIHI4LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI4LCByOCwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLQotICAgIHN1YnMgICAgcjEyLCByMTIsICMxICAgICAgICA7IG5leHQgcm93Ci0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI2LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByOCwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByNCwgcjYsIHI2LCByNCAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLSAgICBzbWxhZCAgIHI0LCByNywgcjcsIHI0ICAgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0gICAgYm5lICAgICBsb29wCi0KLSAgICA7IHJldHVybiBzdHVmZgotICAgIGxkciAgICAgcjEsIFtzcCwgIzI4XSAgICAgICA7IGdldCBhZGRyZXNzIG9mIHNzZQotICAgIG1vdiAgICAgcjAsIHI0ICAgICAgICAgICAgICA7IHJldHVybiBzc2UKLSAgICBzdHIgICAgIHI0LCBbcjFdICAgICAgICAgICAgOyBzdG9yZSBzc2UKLQotICAgIHBvcCAgICAge3I0LXI5LCBwY30KLQotICAgIEVORFAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9zYWQxNngxNl9hcm12Ni5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3NhZDE2eDE2X2FybXY2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1OWY3Yy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3NhZDE2eDE2X2FybXY2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfc2FkMTZ4MTZfYXJtdjZ8Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTsgcjAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyByMSAgICBpbnQgIHNyY19zdHJpZGUKLTsgcjIgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0cgotOyByMyAgICBpbnQgIHJlZl9zdHJpZGUKLTsgc3RhY2sgbWF4X3NhZCAobm90IHVzZWQpCi18dnA4X3NhZDE2eDE2X2FybXY2fCBQUk9DCi0gICAgc3RtZmQgICBzcCEsIHtyNC1yMTIsIGxyfQotICAgIG1vdiAgICAgcjQsICMwICAgICAgICAgICAgICA7IHNhZCA9IDA7Ci0gICAgbW92ICAgICByNSwgIzggICAgICAgICAgICAgIDsgbG9vcCBjb3VudAotCi1sb29wCi0gICAgOyAxc3Qgcm93Ci0gICAgbGRyICAgICByNiwgW3IwLCAjMHgwXSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgKDFBKQotICAgIGxkciAgICAgcjgsIFtyMiwgIzB4MF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzICgxQSkKLSAgICBsZHIgICAgIHI3LCBbcjAsICMweDRdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMUEpCi0gICAgbGRyICAgICByOSwgW3IyLCAjMHg0XSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMgKDFBKQotICAgIGxkciAgICAgcjEwLCBbcjAsICMweDhdICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzICgxQikKLSAgICBsZHIgICAgIHIxMSwgW3IwLCAjMHhDXSAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMUIpCi0KLSAgICB1c2FkYTggIHI0LCByOCwgcjYsIHI0ICAgICAgOyBjYWxjdWxhdGUgc2FkIGZvciA0IHBpeGVscwotICAgIHVzYWQ4ICAgcjgsIHI3LCByOSAgICAgICAgICA7IGNhbGN1bGF0ZSBzYWQgZm9yIDQgcGl4ZWxzCi0KLSAgICBsZHIgICAgIHIxMiwgW3IyLCAjMHg4XSAgICAgOyBsb2FkIDQgcmVmIHBpeGVscyAoMUIpCi0gICAgbGRyICAgICBsciwgW3IyLCAjMHhDXSAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMgKDFCKQotCi0gICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyYyBwb2ludGVyIHRvIG5leHQgcm93Ci0gICAgYWRkICAgICByMiwgcjIsIHIzICAgICAgICAgIDsgc2V0IGRzdCBwb2ludGVyIHRvIG5leHQgcm93Ci0KLSAgICB1c2FkYTggIHI0LCByMTAsIHIxMiwgcjQgICAgOyBjYWxjdWxhdGUgc2FkIGZvciA0IHBpeGVscwotICAgIHVzYWRhOCAgcjgsIHIxMSwgbHIsIHI4ICAgICA7IGNhbGN1bGF0ZSBzYWQgZm9yIDQgcGl4ZWxzCi0KLSAgICBsZHIgICAgIHI2LCBbcjAsICMweDBdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyAoMkEpCi0gICAgbGRyICAgICByNywgW3IwLCAjMHg0XSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgKDJBKQotICAgIGFkZCAgICAgcjQsIHI0LCByOCAgICAgICAgICA7IGFkZCBwYXJ0aWFsIHNhZCB2YWx1ZXMKLQotICAgIDsgMm5kIHJvdwotICAgIGxkciAgICAgcjgsIFtyMiwgIzB4MF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzICgyQSkKLSAgICBsZHIgICAgIHI5LCBbcjIsICMweDRdICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscyAoMkEpCi0gICAgbGRyICAgICByMTAsIFtyMCwgIzB4OF0gICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgKDJCKQotICAgIGxkciAgICAgcjExLCBbcjAsICMweENdICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzICgyQikKLQotICAgIHVzYWRhOCAgcjQsIHI2LCByOCwgcjQgICAgICA7IGNhbGN1bGF0ZSBzYWQgZm9yIDQgcGl4ZWxzCi0gICAgdXNhZDggICByOCwgcjcsIHI5ICAgICAgICAgIDsgY2FsY3VsYXRlIHNhZCBmb3IgNCBwaXhlbHMKLQotICAgIGxkciAgICAgcjEyLCBbcjIsICMweDhdICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzICgyQikKLSAgICBsZHIgICAgIGxyLCBbcjIsICMweENdICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscyAoMkIpCi0KLSAgICBhZGQgICAgIHIwLCByMCwgcjEgICAgICAgICAgOyBzZXQgc3JjIHBvaW50ZXIgdG8gbmV4dCByb3cKLSAgICBhZGQgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBzZXQgZHN0IHBvaW50ZXIgdG8gbmV4dCByb3cKLQotICAgIHVzYWRhOCAgcjQsIHIxMCwgcjEyLCByNCAgICA7IGNhbGN1bGF0ZSBzYWQgZm9yIDQgcGl4ZWxzCi0gICAgdXNhZGE4ICByOCwgcjExLCBsciwgcjggICAgIDsgY2FsY3VsYXRlIHNhZCBmb3IgNCBwaXhlbHMKLQotICAgIHN1YnMgICAgcjUsIHI1LCAjMSAgICAgICAgICA7IGRlY3JlbWVudCBsb29wIGNvdW50ZXIKLSAgICBhZGQgICAgIHI0LCByNCwgcjggICAgICAgICAgOyBhZGQgcGFydGlhbCBzYWQgdmFsdWVzCi0KLSAgICBibmUgICAgIGxvb3AKLQotICAgIG1vdiAgICAgcjAsIHI0ICAgICAgICAgICAgICA7IHJldHVybiBzYWQKLSAgICBsZG1mZCAgIHNwISwge3I0LXIxMiwgcGN9Ci0KLSAgICBFTkRQCi0KLSAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF9zdWJ0cmFjdF9hcm12Ni5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3N1YnRyYWN0X2FybXY2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNzQzOC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3N1YnRyYWN0X2FybXY2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3N1YnRyYWN0X21ieV9hcm12NnwKLSAgICBFWFBPUlQgIHx2cDhfc3VidHJhY3RfbWJ1dl9hcm12NnwKLSAgICBFWFBPUlQgIHx2cDhfc3VidHJhY3RfYl9hcm12NnwKLQotICAgIElOQ0xVREUgYXNtX2VuY19vZmZzZXRzLmFzbQotCi0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi07IHIwICAgIEJMT0NLICpiZQotOyByMSAgICBCTE9DS0QgKmJkCi07IHIyICAgIGludCBwaXRjaAotfHZwOF9zdWJ0cmFjdF9iX2FybXY2fCBQUk9DCi0KLSAgICBzdG1mZCAgIHNwISwge3I0LXI5fQotCi0gICAgbGRyICAgICByNCwgW3IwLCAjdnA4X2Jsb2NrX2Jhc2Vfc3JjXQotICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF9ibG9ja19zcmNdCi0gICAgbGRyICAgICByNiwgW3IwLCAjdnA4X2Jsb2NrX3NyY19kaWZmXQotCi0gICAgbGRyICAgICByMywgW3I0XQotICAgIGxkciAgICAgcjcsIFtyMCwgI3ZwOF9ibG9ja19zcmNfc3RyaWRlXQotICAgIGFkZCAgICAgcjMsIHIzLCByNSAgICAgICAgICA7IHNyYyA9ICpiYXNlX3NyYyArIHNyYwotICAgIGxkciAgICAgcjgsIFtyMSwgI3ZwOF9ibG9ja2RfcHJlZGljdG9yXQotCi0gICAgbW92ICAgICByOSwgIzQgICAgICAgICAgICAgIDsgbG9vcCBjb3VudAotCi1sb29wX2Jsb2NrCi0KLSAgICBsZHIgICAgIHIwLCBbcjNdLCByNyAgICAgICAgOyBzcmMKLSAgICBsZHIgICAgIHIxLCBbcjhdLCByMiAgICAgICAgOyBwcmVkCi0KLSAgICB1eHRiMTYgIHI0LCByMCAgICAgICAgICAgICAgOyBbczIgfCBzMF0KLSAgICB1eHRiMTYgIHI1LCByMSAgICAgICAgICAgICAgOyBbcDIgfCBwMF0KLSAgICB1eHRiMTYgIHIwLCByMCwgcm9yICM4ICAgICAgOyBbczMgfCBzMV0KLSAgICB1eHRiMTYgIHIxLCByMSwgcm9yICM4ICAgICAgOyBbcDMgfCBwMV0KLQotICAgIHVzdWIxNiAgcjQsIHI0LCByNSAgICAgICAgICA7IFtkMiB8IGQwXQotICAgIHVzdWIxNiAgcjUsIHIwLCByMSAgICAgICAgICA7IFtkMyB8IGQxXQotCi0gICAgc3VicyAgICByOSwgcjksICMxICAgICAgICAgIDsgZGVjcmVtZW50IGxvb3AgY291bnRlcgotCi0gICAgcGtoYnQgICByMCwgcjQsIHI1LCBsc2wgIzE2IDsgW2QxIHwgZDBdCi0gICAgcGtodGIgICByMSwgcjUsIHI0LCBhc3IgIzE2IDsgW2QzIHwgZDJdCi0KLSAgICBzdHIgICAgIHIwLCBbcjYsICMwXSAgICAgICAgOyBkaWZmCi0gICAgc3RyICAgICByMSwgW3I2LCAjNF0gICAgICAgIDsgZGlmZgotCi0gICAgYWRkICAgICByNiwgcjYsIHIyLCBsc2wgIzEgIDsgdXBkYXRlIGRpZmYgcG9pbnRlcgotICAgIGJuZSAgICAgbG9vcF9ibG9jawotCi0gICAgbGRtZmQgICBzcCEsIHtyNC1yOX0KLSAgICBtb3YgICAgIHBjLCBscgotCi0gICAgRU5EUAotCi0KLTsgcjAgICAgc2hvcnQgKmRpZmYKLTsgcjEgICAgdW5zaWduZWQgY2hhciAqdXNyYwotOyByMiAgICB1bnNpZ25lZCBjaGFyICp2c3JjCi07IHIzICAgIHVuc2lnbmVkIGNoYXIgKnByZWQKLTsgc3RhY2sgaW50IHN0cmlkZQotfHZwOF9zdWJ0cmFjdF9tYnV2X2FybXY2fCBQUk9DCi0KLSAgICBzdG1mZCAgIHNwISwge3I0LXIxMiwgbHJ9Ci0KLSAgICBhZGQgICAgIHIwLCByMCwgIzUxMiAgICAgICAgOyBzZXQgKmRpZmYgcG9pbnQgdG8gQ2IKLSAgICBhZGQgICAgIHIzLCByMywgIzI1NiAgICAgICAgOyBzZXQgKnByZWQgcG9pbnQgdG8gQ2IKLQotICAgIG1vdiAgICAgcjQsICM4ICAgICAgICAgICAgICA7IGxvb3AgY291bnQKLSAgICBsZHIgICAgIHI1LCBbc3AsICM0MF0gICAgICAgOyBzdHJpZGUKLQotICAgIDsgU3VidHJhY3QgVSBibG9jawotbG9vcF91Ci0gICAgbGRyICAgICByNiwgW3IxXSAgICAgICAgICAgIDsgc3JjICAgICAgIChBKQotICAgIGxkciAgICAgcjcsIFtyM10sICM0ICAgICAgICA7IHByZWQgICAgICAoQSkKLQotICAgIHV4dGIxNiAgcjgsIHI2ICAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoQSkKLSAgICB1eHRiMTYgIHI5LCByNyAgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEEpCi0gICAgdXh0YjE2ICByMTAsIHI2LCByb3IgIzggICAgIDsgW3MzIHwgczFdIChBKQotICAgIHV4dGIxNiAgcjExLCByNywgcm9yICM4ICAgICA7IFtwMyB8IHAxXSAoQSkKLQotICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoQSkKLSAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEEpCi0KLSAgICBsZHIgICAgIHIxMCwgW3IxLCAjNF0gICAgICAgOyBzcmMgICAgICAgKEIpCi0gICAgbGRyICAgICByMTEsIFtyM10sICM0ICAgICAgIDsgcHJlZCAgICAgIChCKQotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChBKQotICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQSkKLQotICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQSkKLSAgICB1eHRiMTYgIHI4LCByMTAgICAgICAgICAgICAgOyBbczIgfCBzMF0gKEIpCi0gICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChBKQotCi0gICAgdXh0YjE2ICByOSwgcjExICAgICAgICAgICAgIDsgW3AyIHwgcDBdIChCKQotICAgIHV4dGIxNiAgcjEwLCByMTAsIHJvciAjOCAgICA7IFtzMyB8IHMxXSAoQikKLSAgICB1eHRiMTYgIHIxMSwgcjExLCByb3IgIzggICAgOyBbcDMgfCBwMV0gKEIpCi0KLSAgICB1c3ViMTYgIHI2LCByOCwgcjkgICAgICAgICAgOyBbZDIgfCBkMF0gKEIpCi0gICAgdXN1YjE2ICByNywgcjEwLCByMTEgICAgICAgIDsgW2QzIHwgZDFdIChCKQotCi0gICAgYWRkICAgICByMSwgcjEsIHI1ICAgICAgICAgIDsgdXBkYXRlIHVzcmMgcG9pbnRlcgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChCKQotICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQikKLQotICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQikKLSAgICBzdWJzICAgIHI0LCByNCwgIzEgICAgICAgICAgOyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChCKQotCi0gICAgYm5lICAgICBsb29wX3UKLQotICAgIG1vdiAgICAgcjQsICM4ICAgICAgICAgICAgICA7IGxvb3AgY291bnQKLQotICAgIDsgU3VidHJhY3QgViBibG9jawotbG9vcF92Ci0gICAgbGRyICAgICByNiwgW3IyXSAgICAgICAgICAgIDsgc3JjICAgICAgIChBKQotICAgIGxkciAgICAgcjcsIFtyM10sICM0ICAgICAgICA7IHByZWQgICAgICAoQSkKLQotICAgIHV4dGIxNiAgcjgsIHI2ICAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoQSkKLSAgICB1eHRiMTYgIHI5LCByNyAgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEEpCi0gICAgdXh0YjE2ICByMTAsIHI2LCByb3IgIzggICAgIDsgW3MzIHwgczFdIChBKQotICAgIHV4dGIxNiAgcjExLCByNywgcm9yICM4ICAgICA7IFtwMyB8IHAxXSAoQSkKLQotICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoQSkKLSAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEEpCi0KLSAgICBsZHIgICAgIHIxMCwgW3IyLCAjNF0gICAgICAgOyBzcmMgICAgICAgKEIpCi0gICAgbGRyICAgICByMTEsIFtyM10sICM0ICAgICAgIDsgcHJlZCAgICAgIChCKQotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChBKQotICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQSkKLQotICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQSkKLSAgICB1eHRiMTYgIHI4LCByMTAgICAgICAgICAgICAgOyBbczIgfCBzMF0gKEIpCi0gICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChBKQotCi0gICAgdXh0YjE2ICByOSwgcjExICAgICAgICAgICAgIDsgW3AyIHwgcDBdIChCKQotICAgIHV4dGIxNiAgcjEwLCByMTAsIHJvciAjOCAgICA7IFtzMyB8IHMxXSAoQikKLSAgICB1eHRiMTYgIHIxMSwgcjExLCByb3IgIzggICAgOyBbcDMgfCBwMV0gKEIpCi0KLSAgICB1c3ViMTYgIHI2LCByOCwgcjkgICAgICAgICAgOyBbZDIgfCBkMF0gKEIpCi0gICAgdXN1YjE2ICByNywgcjEwLCByMTEgICAgICAgIDsgW2QzIHwgZDFdIChCKQotCi0gICAgYWRkICAgICByMiwgcjIsIHI1ICAgICAgICAgIDsgdXBkYXRlIHZzcmMgcG9pbnRlcgotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2IDsgW2QxIHwgZDBdIChCKQotICAgIHBraHRiICAgcjksIHI3LCByNiwgYXNyICMxNiA7IFtkMyB8IGQyXSAoQikKLQotICAgIHN0ciAgICAgcjgsIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQikKLSAgICBzdWJzICAgIHI0LCByNCwgIzEgICAgICAgICAgOyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgc3RyICAgICByOSwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChCKQotCi0gICAgYm5lICAgICBsb29wX3YKLQotICAgIGxkbWZkICAgc3AhLCB7cjQtcjEyLCBwY30KLQotICAgIEVORFAKLQotCi07IHIwICAgIHNob3J0ICpkaWZmCi07IHIxICAgIHVuc2lnbmVkIGNoYXIgKnNyYwotOyByMiAgICB1bnNpZ25lZCBjaGFyICpwcmVkCi07IHIzICAgIGludCBzdHJpZGUKLXx2cDhfc3VidHJhY3RfbWJ5X2FybXY2fCBQUk9DCi0KLSAgICBzdG1mZCAgIHNwISwge3I0LXIxMX0KLQotICAgIG1vdiAgICAgcjQsICMxNgotbG9vcAotICAgIGxkciAgICAgcjYsIFtyMV0gICAgICAgICAgICA7IHNyYyAgICAgICAoQSkKLSAgICBsZHIgICAgIHI3LCBbcjJdLCAjNCAgICAgICAgOyBwcmVkICAgICAgKEEpCi0KLSAgICB1eHRiMTYgIHI4LCByNiAgICAgICAgICAgICAgOyBbczIgfCBzMF0gKEEpCi0gICAgdXh0YjE2ICByOSwgcjcgICAgICAgICAgICAgIDsgW3AyIHwgcDBdIChBKQotICAgIHV4dGIxNiAgcjEwLCByNiwgcm9yICM4ICAgICA7IFtzMyB8IHMxXSAoQSkKLSAgICB1eHRiMTYgIHIxMSwgcjcsIHJvciAjOCAgICAgOyBbcDMgfCBwMV0gKEEpCi0KLSAgICB1c3ViMTYgIHI2LCByOCwgcjkgICAgICAgICAgOyBbZDIgfCBkMF0gKEEpCi0gICAgdXN1YjE2ICByNywgcjEwLCByMTEgICAgICAgIDsgW2QzIHwgZDFdIChBKQotCi0gICAgbGRyICAgICByMTAsIFtyMSwgIzRdICAgICAgIDsgc3JjICAgICAgIChCKQotICAgIGxkciAgICAgcjExLCBbcjJdLCAjNCAgICAgICA7IHByZWQgICAgICAoQikKLQotICAgIHBraGJ0ICAgcjgsIHI2LCByNywgbHNsICMxNiA7IFtkMSB8IGQwXSAoQSkKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgOyBbZDMgfCBkMl0gKEEpCi0KLSAgICBzdHIgICAgIHI4LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEEpCi0gICAgdXh0YjE2ICByOCwgcjEwICAgICAgICAgICAgIDsgW3MyIHwgczBdIChCKQotICAgIHN0ciAgICAgcjksIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoQSkKLQotICAgIHV4dGIxNiAgcjksIHIxMSAgICAgICAgICAgICA7IFtwMiB8IHAwXSAoQikKLSAgICB1eHRiMTYgIHIxMCwgcjEwLCByb3IgIzggICAgOyBbczMgfCBzMV0gKEIpCi0gICAgdXh0YjE2ICByMTEsIHIxMSwgcm9yICM4ICAgIDsgW3AzIHwgcDFdIChCKQotCi0gICAgdXN1YjE2ICByNiwgcjgsIHI5ICAgICAgICAgIDsgW2QyIHwgZDBdIChCKQotICAgIHVzdWIxNiAgcjcsIHIxMCwgcjExICAgICAgICA7IFtkMyB8IGQxXSAoQikKLQotICAgIGxkciAgICAgcjEwLCBbcjEsICM4XSAgICAgICA7IHNyYyAgICAgICAoQykKLSAgICBsZHIgICAgIHIxMSwgW3IyXSwgIzQgICAgICAgOyBwcmVkICAgICAgKEMpCi0KLSAgICBwa2hidCAgIHI4LCByNiwgcjcsIGxzbCAjMTYgOyBbZDEgfCBkMF0gKEIpCi0gICAgcGtodGIgICByOSwgcjcsIHI2LCBhc3IgIzE2IDsgW2QzIHwgZDJdIChCKQotCi0gICAgc3RyICAgICByOCwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChCKQotICAgIHV4dGIxNiAgcjgsIHIxMCAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoQykKLSAgICBzdHIgICAgIHI5LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEIpCi0KLSAgICB1eHRiMTYgIHI5LCByMTEgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEMpCi0gICAgdXh0YjE2ICByMTAsIHIxMCwgcm9yICM4ICAgIDsgW3MzIHwgczFdIChDKQotICAgIHV4dGIxNiAgcjExLCByMTEsIHJvciAjOCAgICA7IFtwMyB8IHAxXSAoQykKLQotICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoQykKLSAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEMpCi0KLSAgICBsZHIgICAgIHIxMCwgW3IxLCAjMTJdICAgICAgOyBzcmMgICAgICAgKEQpCi0gICAgbGRyICAgICByMTEsIFtyMl0sICM0ICAgICAgIDsgcHJlZCAgICAgIChEKQotCi0gICAgcGtoYnQgICByOCwgcjYsIHI3LCBsc2wgIzE2ICA7IFtkMSB8IGQwXSAoQykKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgIDsgW2QzIHwgZDJdIChDKQotCi0gICAgc3RyICAgICByOCwgW3IwXSwgIzQgICAgICAgIDsgZGlmZiAgICAgIChDKQotICAgIHV4dGIxNiAgcjgsIHIxMCAgICAgICAgICAgICA7IFtzMiB8IHMwXSAoRCkKLSAgICBzdHIgICAgIHI5LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEMpCi0KLSAgICB1eHRiMTYgIHI5LCByMTEgICAgICAgICAgICAgOyBbcDIgfCBwMF0gKEQpCi0gICAgdXh0YjE2ICByMTAsIHIxMCwgcm9yICM4ICAgIDsgW3MzIHwgczFdIChEKQotICAgIHV4dGIxNiAgcjExLCByMTEsIHJvciAjOCAgICA7IFtwMyB8IHAxXSAoRCkKLQotICAgIHVzdWIxNiAgcjYsIHI4LCByOSAgICAgICAgICA7IFtkMiB8IGQwXSAoRCkKLSAgICB1c3ViMTYgIHI3LCByMTAsIHIxMSAgICAgICAgOyBbZDMgfCBkMV0gKEQpCi0KLSAgICBhZGQgICAgIHIxLCByMSwgcjMgICAgICAgICAgOyB1cGRhdGUgc3JjIHBvaW50ZXIKLQotICAgIHBraGJ0ICAgcjgsIHI2LCByNywgbHNsICMxNiA7IFtkMSB8IGQwXSAoRCkKLSAgICBwa2h0YiAgIHI5LCByNywgcjYsIGFzciAjMTYgOyBbZDMgfCBkMl0gKEQpCi0KLSAgICBzdHIgICAgIHI4LCBbcjBdLCAjNCAgICAgICAgOyBkaWZmICAgICAgKEQpCi0gICAgc3VicyAgICByNCwgcjQsICMxICAgICAgICAgIDsgdXBkYXRlIGxvb3AgY291bnRlcgotICAgIHN0ciAgICAgcjksIFtyMF0sICM0ICAgICAgICA7IGRpZmYgICAgICAoRCkKLQotICAgIGJuZSAgICAgbG9vcAotCi0gICAgbGRtZmQgICBzcCEsIHtyNC1yMTF9Ci0gICAgbW92ICAgICBwYywgbHIKLQotICAgIEVORFAKLQotICAgIEVORAotCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYuYXNtIGIvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF92YXJpYW5jZTE2eDE2X2FybXY2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4Mzc2My4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2UxNngxNl9hcm12NnwKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCi07IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKLTsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKLXx2cDhfdmFyaWFuY2UxNngxNl9hcm12NnwgUFJPQwotCi0gICAgc3RtZmQgICBzcCEsIHtyNC1yMTIsIGxyfQotICAgIG1vdiAgICAgcjgsICMwICAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3VtID0gMAotICAgIG1vdiAgICAgcjExLCAjMCAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAotICAgIG1vdiAgICAgcjEyLCAjMTYgICAgICAgICAgICA7IHNldCBsb29wIGNvdW50ZXIgdG8gMTYgKD1ibG9jayBoZWlnaHQpCi0KLWxvb3AKLSAgICA7IDFzdCA0IHBpeGVscwotICAgIGxkciAgICAgcjQsIFtyMCwgIzBdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCi0gICAgbGRyICAgICByNSwgW3IyLCAjMF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLQotICAgIG1vdiAgICAgbHIsICMwICAgICAgICAgICAgICA7IGNvbnN0YW50IHplcm8KLQotICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCi0gICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQotICAgIHVzdWI4ICAgcjksIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKLSAgICBzZWwgICAgIHI2LCByOSwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBuZWdhdGl2ZSBkaWZmZXJlbmNlCi0KLSAgICA7IGNhbGN1bGF0ZSBwYXJ0aWFsIHN1bXMKLSAgICB1c2FkOCAgIHI0LCByNywgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIHBvc2l0aXZlIGRpZmZlcmVuY2VzCi0gICAgdXNhZDggICByNSwgcjYsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBuZWdhdGl2ZSBkaWZmZXJlbmNlcwotICAgIG9yciAgICAgcjYsIHI2LCByNyAgICAgICAgICA7IGRpZmZlcmVuY2VzIG9mIGFsbCA0IHBpeGVscwotICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQotICAgIGFkZHMgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KLSAgICBzdWJzICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KLQotICAgIDsgY2FsY3VsYXRlIHNzZQotICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcwotICAgIHV4dGIxNiAgcjEwLCByNiwgcm9yICM4ICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKLSAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQotCi0gICAgOyAybmQgNCBwaXhlbHMKLSAgICBsZHIgICAgIHI0LCBbcjAsICM0XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscwotICAgIGxkciAgICAgcjUsIFtyMiwgIzRdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0gICAgc21sYWQgICByMTEsIHIxMCwgcjEwLCByMTEgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKLQotICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCi0gICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQotICAgIHVzdWI4ICAgcjksIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKLSAgICBzZWwgICAgIHI2LCByOSwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBuZWdhdGl2ZSBkaWZmZXJlbmNlCi0KLSAgICA7IGNhbGN1bGF0ZSBwYXJ0aWFsIHN1bXMKLSAgICB1c2FkOCAgIHI0LCByNywgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIHBvc2l0aXZlIGRpZmZlcmVuY2VzCi0gICAgdXNhZDggICByNSwgcjYsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBuZWdhdGl2ZSBkaWZmZXJlbmNlcwotICAgIG9yciAgICAgcjYsIHI2LCByNyAgICAgICAgICA7IGRpZmZlcmVuY2VzIG9mIGFsbCA0IHBpeGVscwotCi0gICAgOyBjYWxjdWxhdGUgdG90YWwgc3VtCi0gICAgYWRkICAgICByOCwgcjgsIHI0ICAgICAgICAgIDsgYWRkIHBvc2l0aXZlIGRpZmZlcmVuY2VzIHRvIHN1bQotICAgIHN1YiAgICAgcjgsIHI4LCByNSAgICAgICAgICA7IHN1YnN0cmFjdCBuZWdhdGl2ZSBkaWZmZXJlbmNlcyBmcm9tIHN1bQotCi0gICAgOyBjYWxjdWxhdGUgc3NlCi0gICAgdXh0YjE2ICByNSwgcjYgICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCi0gICAgdXh0YjE2ICByMTAsIHI2LCByb3IgIzggICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcwotICAgIHNtbGFkICAgcjExLCByNSwgcjUsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCi0KLSAgICA7IDNyZCA0IHBpeGVscwotICAgIGxkciAgICAgcjQsIFtyMCwgIzhdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCi0gICAgbGRyICAgICByNSwgW3IyLCAjOF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLSAgICBzbWxhZCAgIHIxMSwgcjEwLCByMTAsIHIxMSAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0gICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByOSwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjYsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHIxMCwgcjYsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgNHRoIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjMTJdICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI1LCBbcjIsICMxMl0gICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscwotICAgIHNtbGFkICAgcjExLCByMTAsIHIxMCwgcjExICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIGFkZCAgICAgcjAsIHIwLCByMSAgICAgICAgICA7IHNldCBzcmNfcHRyIHRvIG5leHQgcm93Ci0gICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQotICAgIHVzdWI4ICAgcjksIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKLSAgICBhZGQgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBzZXQgZHN0X3B0ciB0byBuZXh0IHJvdwotICAgIHNlbCAgICAgcjYsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHIxMCwgcjYsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLSAgICBzbWxhZCAgIHIxMSwgcjEwLCByMTAsIHIxMSAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0KLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQotCi0gICAgYm5lICAgICBsb29wCi0KLSAgICA7IHJldHVybiBzdHVmZgotICAgIGxkciAgICAgcjYsIFtzcCwgIzQwXSAgICAgICA7IGdldCBhZGRyZXNzIG9mIHNzZQotICAgIG11bCAgICAgcjAsIHI4LCByOCAgICAgICAgICA7IHN1bSAqIHN1bQotICAgIHN0ciAgICAgcjExLCBbcjZdICAgICAgICAgICA7IHN0b3JlIHNzZQotICAgIHN1YiAgICAgcjAsIHIxMSwgcjAsIGFzciAjOCA7IHJldHVybiAoc3NlIC0gKChzdW0gKiBzdW0pID4+IDgpKQotCi0gICAgbGRtZmQgICBzcCEsIHtyNC1yMTIsIHBjfQotCi0gICAgRU5EUAotCi0gICAgRU5ECi0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2U4eDhfYXJtdjYuYXNtIGIvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF92YXJpYW5jZTh4OF9hcm12Ni5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWVjYjkuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF92YXJpYW5jZTh4OF9hcm12Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3ZhcmlhbmNlOHg4X2FybXY2fAotCi0gICAgQVJNCi0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCi07IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKLTsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKLXx2cDhfdmFyaWFuY2U4eDhfYXJtdjZ8IFBST0MKLQotICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9Ci0gICAgbW92ICAgICByMTIsICM4ICAgICAgICAgICAgIDsgc2V0IGxvb3AgY291bnRlciB0byA4ICg9YmxvY2sgaGVpZ2h0KQotICAgIG1vdiAgICAgcjQsICMwICAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3VtID0gMAotICAgIG1vdiAgICAgcjUsICMwICAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAotCi1sb29wCi0gICAgOyAxc3QgNCBwaXhlbHMKLSAgICBsZHIgICAgIHI2LCBbcjAsICMweDBdICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscwotICAgIGxkciAgICAgcjcsIFtyMiwgIzB4MF0gICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0KLSAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgOyBjb25zdGFudCB6ZXJvCi0KLSAgICB1c3ViOCAgIHI4LCByNiwgcjcgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIHNlbCAgICAgcjEwLCByOCwgbHIgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKLSAgICB1c3ViOCAgIHI5LCByNywgcjYgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCi0gICAgc2VsICAgICByOCwgcjksIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNiwgcjEwLCBsciAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjcsIHI4LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI4LCByOCwgcjEwICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgcjQsIHI0LCByNiAgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgIHI0LCByNCwgcjcgICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI3LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHIxMCwgcjgsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByNSwgcjcsIHI3LCByNSAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgMm5kIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNiwgW3IwLCAjMHg0XSAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI3LCBbcjIsICMweDRdICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscwotICAgIHNtbGFkICAgcjUsIHIxMCwgcjEwLCByNSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICB1c3ViOCAgIHI4LCByNiwgcjcgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIGFkZCAgICAgcjAsIHIwLCByMSAgICAgICAgICA7IHNldCBzcmNfcHRyIHRvIG5leHQgcm93Ci0gICAgc2VsICAgICByMTAsIHI4LCBsciAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQotICAgIHVzdWI4ICAgcjksIHI3LCByNiAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKLSAgICBhZGQgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBzZXQgZHN0X3B0ciB0byBuZXh0IHJvdwotICAgIHNlbCAgICAgcjgsIHI5LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjYsIHIxMCwgbHIgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI3LCByOCwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByOCwgcjgsIHIxMCAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI0LCByNCwgcjYgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByNCwgcjQsIHI3ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI3LCByOCAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHIxMCwgcjgsIHJvciAjOCAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByNSwgcjcsIHI3LCByNSAgICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMSAgICAgICAgOyBuZXh0IHJvdwotICAgIHNtbGFkICAgcjUsIHIxMCwgcjEwLCByNSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICBibmUgICAgIGxvb3AKLQotICAgIDsgcmV0dXJuIHN0dWZmCi0gICAgbGRyICAgICByOCwgW3NwLCAjMzJdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCi0gICAgbXVsICAgICByMSwgcjQsIHI0ICAgICAgICAgIDsgc3VtICogc3VtCi0gICAgc3RyICAgICByNSwgW3I4XSAgICAgICAgICAgIDsgc3RvcmUgc3NlCi0gICAgc3ViICAgICByMCwgcjUsIHIxLCBBU1IgIzYgIDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gNikpCi0KLSAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQotCi0gICAgRU5EUAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2LmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUwZjNlLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjZ8Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyByMSAgICBpbnQgc291cmNlX3N0cmlkZQotOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCi07IHIzICAgIGludCAgcmVjb25fc3RyaWRlCi07IHN0YWNrIHVuc2lnbmVkIGludCAqc3NlCi18dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2fCBQUk9DCi0KLSAgICBzdG1mZCAgIHNwISwge3I0LXIxMiwgbHJ9Ci0gICAgbW92ICAgICByOCwgIzAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzdW0gPSAwCi0gICAgbGRyICAgICByMTAsIGM4MDgwODA4MAotICAgIG1vdiAgICAgcjExLCAjMCAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAotICAgIG1vdiAgICAgcjEyLCAjMTYgICAgICAgICAgICA7IHNldCBsb29wIGNvdW50ZXIgdG8gMTYgKD1ibG9jayBoZWlnaHQpCi0gICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgIDsgY29uc3RhbnQgemVybwotbG9vcAotICAgIDsgMXN0IDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjMF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI2LCBbcjAsICMxXSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyB3aXRoIDEgYnl0ZSBvZmZzZXQKLSAgICBsZHIgICAgIHI1LCBbcjIsICMwXSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscwotCi0gICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgbXZuICAgICByNiwgcjYKLSAgICB1aHN1YjggIHI0LCByNCwgcjYKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0KLSAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKLSAgICB1c3ViOCAgIHI2LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCi0gICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGRzICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3VicyAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgMm5kIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjNF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI2LCBbcjAsICM1XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyB3aXRoIDEgYnl0ZSBvZmZzZXQKLSAgICBsZHIgICAgIHI1LCBbcjIsICM0XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscwotCi0gICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgbXZuICAgICByNiwgcjYKLSAgICB1aHN1YjggIHI0LCByNCwgcjYKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0KLSAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0gICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgM3JkIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjOF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI2LCBbcjAsICM5XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyB3aXRoIDEgYnl0ZSBvZmZzZXQKLSAgICBsZHIgICAgIHI1LCBbcjIsICM4XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscwotCi0gICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgbXZuICAgICByNiwgcjYKLSAgICB1aHN1YjggIHI0LCByNCwgcjYKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0KLSAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKLQotICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCi0gICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQotICAgIHVzdWI4ICAgcjYsIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKLSAgICBzZWwgICAgIHI2LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBuZWdhdGl2ZSBkaWZmZXJlbmNlCi0KLSAgICA7IGNhbGN1bGF0ZSBwYXJ0aWFsIHN1bXMKLSAgICB1c2FkOCAgIHI0LCByNywgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIHBvc2l0aXZlIGRpZmZlcmVuY2VzCi0gICAgdXNhZDggICByNSwgcjYsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBuZWdhdGl2ZSBkaWZmZXJlbmNlcwotICAgIG9yciAgICAgcjYsIHI2LCByNyAgICAgICAgICA7IGRpZmZlcmVuY2VzIG9mIGFsbCA0IHBpeGVscwotCi0gICAgOyBjYWxjdWxhdGUgdG90YWwgc3VtCi0gICAgYWRkICAgICByOCwgcjgsIHI0ICAgICAgICAgIDsgYWRkIHBvc2l0aXZlIGRpZmZlcmVuY2VzIHRvIHN1bQotICAgIHN1YiAgICAgcjgsIHI4LCByNSAgICAgICAgICA7IHN1YnN0cmFjdCBuZWdhdGl2ZSBkaWZmZXJlbmNlcyBmcm9tIHN1bQotCi0gICAgOyBjYWxjdWxhdGUgc3NlCi0gICAgdXh0YjE2ICByNSwgcjYgICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCi0gICAgdXh0YjE2ICByNywgcjYsIHJvciAjOCAgICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcwotICAgIHNtbGFkICAgcjExLCByNSwgcjUsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCi0KLSAgICA7IDR0aCA0IHBpeGVscwotICAgIGxkciAgICAgcjQsIFtyMCwgIzEyXSAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCi0gICAgbGRyICAgICByNiwgW3IwLCAjMTNdICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgd2l0aCAxIGJ5dGUgb2Zmc2V0Ci0gICAgbGRyICAgICByNSwgW3IyLCAjMTJdICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLQotICAgIDsgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIG12biAgICAgcjYsIHI2Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI2Ci0gICAgZW9yICAgICByNCwgcjQsIHIxMAotCi0gICAgc21sYWQgICByMTEsIHI3LCByNywgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKLQotICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCi0gICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyY19wdHIgdG8gbmV4dCByb3cKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3RfcHRyIHRvIG5leHQgcm93Ci0gICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLQotICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQotICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KLSAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KLQotICAgIDsgY2FsY3VsYXRlIHNzZQotICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcwotICAgIHV4dGIxNiAgcjcsIHI2LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKLSAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQotICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQotCi0gICAgYm5lICAgICBsb29wCi0KLSAgICA7IHJldHVybiBzdHVmZgotICAgIGxkciAgICAgcjYsIFtzcCwgIzQwXSAgICAgICA7IGdldCBhZGRyZXNzIG9mIHNzZQotICAgIG11bCAgICAgcjAsIHI4LCByOCAgICAgICAgICA7IHN1bSAqIHN1bQotICAgIHN0ciAgICAgcjExLCBbcjZdICAgICAgICAgICA7IHN0b3JlIHNzZQotICAgIHN1YiAgICAgcjAsIHIxMSwgcjAsIGFzciAjOCA7IHJldHVybiAoc3NlIC0gKChzdW0gKiBzdW0pID4+IDgpKQotCi0gICAgbGRtZmQgICBzcCEsIHtyNC1yMTIsIHBjfQotCi0gICAgRU5EUAotCi1jODA4MDgwODAKLSAgICBEQ0QgICAgIDB4ODA4MDgwODAKLQotICAgIEVORAotCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12Ni5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12Ni5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWUzYjcuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL2FybXY2L3ZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2FybXY2fAotCi0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi07IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKLTsgcjEgICAgaW50IHNvdXJjZV9zdHJpZGUKLTsgcjIgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cgotOyByMyAgICBpbnQgIHJlY29uX3N0cmlkZQotOyBzdGFjayB1bnNpZ25lZCBpbnQgKnNzZQotfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjZ8IFBST0MKLQotICAgIHN0bWZkICAgc3AhLCB7cjQtcjEyLCBscn0KLSAgICBtb3YgICAgIHI4LCAjMCAgICAgICAgICAgICAgOyBpbml0aWFsaXplIHN1bSA9IDAKLSAgICBsZHIgICAgIHIxMCwgYzgwODA4MDgwCi0gICAgbW92ICAgICByMTEsICMwICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzc2UgPSAwCi0gICAgbW92ICAgICByMTIsICMxNiAgICAgICAgICAgIDsgc2V0IGxvb3AgY291bnRlciB0byAxNiAoPWJsb2NrIGhlaWdodCkKLSAgICBtb3YgICAgIGxyLCAjMCAgICAgICAgICAgICAgOyBjb25zdGFudCB6ZXJvCi1sb29wCi0gICAgYWRkICAgICByOSwgcjAsIHIxICAgICAgICAgIDsgcG9pbnRlciB0byBwaXhlbHMgb24gdGhlIG5leHQgcm93Ci0gICAgOyAxc3QgNCBwaXhlbHMKLSAgICBsZHIgICAgIHI0LCBbcjAsICMwXSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgYSwgcm93IE4KLSAgICBsZHIgICAgIHI2LCBbcjAsICMxXSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgYiwgcm93IE4KLSAgICBsZHIgICAgIHI1LCBbcjksICMwXSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgYywgcm93IE4rMQotICAgIGxkciAgICAgcjcsIFtyOSwgIzFdICAgICAgICA7IGxvYWQgc291cmNlIHBpeGVscyBkLCByb3cgTisxCi0KLSAgICA7IHggPSAoYSArIGIgKyAxKSA+PiAxLCBpbnRlcnBvbGF0ZSBwaXhlbHMgaG9yaXpvbnRhbGx5IG9uIHJvdyBOCi0gICAgbXZuICAgICByNiwgcjYKLSAgICB1aHN1YjggIHI0LCByNCwgcjYKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0gICAgOyB5ID0gKGMgKyBkICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTisxCi0gICAgbXZuICAgICByNywgcjcKLSAgICB1aHN1YjggIHI1LCByNSwgcjcKLSAgICBlb3IgICAgIHI1LCByNSwgcjEwCi0gICAgOyB6ID0gKHggKyB5ICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgaGFsZiBwaXhlbCB2YWx1ZXMgdmVydGljYWxseQotICAgIG12biAgICAgcjUsIHI1Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI1Ci0gICAgbGRyICAgICByNSwgW3IyLCAjMF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0KLSAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKLSAgICB1c3ViOCAgIHI2LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCi0gICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGRzICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3VicyAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgMm5kIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjNF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGEsIHJvdyBOCi0gICAgbGRyICAgICByNiwgW3IwLCAjNV0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGIsIHJvdyBOCi0gICAgbGRyICAgICByNSwgW3I5LCAjNF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGMsIHJvdyBOKzEKLQotICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICBsZHIgICAgIHI3LCBbcjksICM1XSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgZCwgcm93IE4rMQotCi0gICAgOyB4ID0gKGEgKyBiICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTgotICAgIG12biAgICAgcjYsIHI2Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI2Ci0gICAgZW9yICAgICByNCwgcjQsIHIxMAotICAgIDsgeSA9IChjICsgZCArIDEpID4+IDEsIGludGVycG9sYXRlIHBpeGVscyBob3Jpem9udGFsbHkgb24gcm93IE4rMQotICAgIG12biAgICAgcjcsIHI3Ci0gICAgdWhzdWI4ICByNSwgcjUsIHI3Ci0gICAgZW9yICAgICByNSwgcjUsIHIxMAotICAgIDsgeiA9ICh4ICsgeSArIDEpID4+IDEsIGludGVycG9sYXRlIGhhbGYgcGl4ZWwgdmFsdWVzIHZlcnRpY2FsbHkKLSAgICBtdm4gICAgIHI1LCByNQotICAgIHVoc3ViOCAgcjQsIHI0LCByNQotICAgIGxkciAgICAgcjUsIFtyMiwgIzRdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0gICAgZW9yICAgICByNCwgcjQsIHIxMAotCi0gICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgM3JkIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjOF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGEsIHJvdyBOCi0gICAgbGRyICAgICByNiwgW3IwLCAjOV0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGIsIHJvdyBOCi0gICAgbGRyICAgICByNSwgW3I5LCAjOF0gICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGMsIHJvdyBOKzEKLQotICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICBsZHIgICAgIHI3LCBbcjksICM5XSAgICAgICAgOyBsb2FkIHNvdXJjZSBwaXhlbHMgZCwgcm93IE4rMQotCi0gICAgOyB4ID0gKGEgKyBiICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTgotICAgIG12biAgICAgcjYsIHI2Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI2Ci0gICAgZW9yICAgICByNCwgcjQsIHIxMAotICAgIDsgeSA9IChjICsgZCArIDEpID4+IDEsIGludGVycG9sYXRlIHBpeGVscyBob3Jpem9udGFsbHkgb24gcm93IE4rMQotICAgIG12biAgICAgcjcsIHI3Ci0gICAgdWhzdWI4ICByNSwgcjUsIHI3Ci0gICAgZW9yICAgICByNSwgcjUsIHIxMAotICAgIDsgeiA9ICh4ICsgeSArIDEpID4+IDEsIGludGVycG9sYXRlIGhhbGYgcGl4ZWwgdmFsdWVzIHZlcnRpY2FsbHkKLSAgICBtdm4gICAgIHI1LCByNQotICAgIHVoc3ViOCAgcjQsIHI0LCByNQotICAgIGxkciAgICAgcjUsIFtyMiwgIzhdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0gICAgZW9yICAgICByNCwgcjQsIHIxMAotCi0gICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgNHRoIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjMTJdICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGEsIHJvdyBOCi0gICAgbGRyICAgICByNiwgW3IwLCAjMTNdICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGIsIHJvdyBOCi0gICAgbGRyICAgICByNSwgW3I5LCAjMTJdICAgICAgIDsgbG9hZCBzb3VyY2UgcGl4ZWxzIGMsIHJvdyBOKzEKLSAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotICAgIGxkciAgICAgcjcsIFtyOSwgIzEzXSAgICAgICA7IGxvYWQgc291cmNlIHBpeGVscyBkLCByb3cgTisxCi0KLSAgICA7IHggPSAoYSArIGIgKyAxKSA+PiAxLCBpbnRlcnBvbGF0ZSBwaXhlbHMgaG9yaXpvbnRhbGx5IG9uIHJvdyBOCi0gICAgbXZuICAgICByNiwgcjYKLSAgICB1aHN1YjggIHI0LCByNCwgcjYKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0gICAgOyB5ID0gKGMgKyBkICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgcGl4ZWxzIGhvcml6b250YWxseSBvbiByb3cgTisxCi0gICAgbXZuICAgICByNywgcjcKLSAgICB1aHN1YjggIHI1LCByNSwgcjcKLSAgICBlb3IgICAgIHI1LCByNSwgcjEwCi0gICAgOyB6ID0gKHggKyB5ICsgMSkgPj4gMSwgaW50ZXJwb2xhdGUgaGFsZiBwaXhlbCB2YWx1ZXMgdmVydGljYWxseQotICAgIG12biAgICAgcjUsIHI1Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI1Ci0gICAgbGRyICAgICByNSwgW3IyLCAjMTJdICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0KLSAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIGFkZCAgICAgcjAsIHIwLCByMSAgICAgICAgICA7IHNldCBzcmNfcHRyIHRvIG5leHQgcm93Ci0gICAgc2VsICAgICByNywgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggcG9zaXRpdmUgZGlmZmVyZW5jZQotICAgIHVzdWI4ICAgcjYsIHI1LCByNCAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlIHdpdGggcmV2ZXJzZWQgb3BlcmFuZHMKLSAgICBhZGQgICAgIHIyLCByMiwgcjMgICAgICAgICAgOyBzZXQgZHN0X3B0ciB0byBuZXh0IHJvdwotICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLSAgICBzdWJzICAgIHIxMiwgcjEyLCAjMQotICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICBibmUgICAgIGxvb3AKLQotICAgIDsgcmV0dXJuIHN0dWZmCi0gICAgbGRyICAgICByNiwgW3NwLCAjNDBdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCi0gICAgbXVsICAgICByMCwgcjgsIHI4ICAgICAgICAgIDsgc3VtICogc3VtCi0gICAgc3RyICAgICByMTEsIFtyNl0gICAgICAgICAgIDsgc3RvcmUgc3NlCi0gICAgc3ViICAgICByMCwgcjExLCByMCwgYXNyICM4IDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gOCkpCi0KLSAgICBsZG1mZCAgIHNwISwge3I0LXIxMiwgcGN9Ci0KLSAgICBFTkRQCi0KLWM4MDgwODA4MAotICAgIERDRCAgICAgMHg4MDgwODA4MAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2LmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTBhMDM1Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjZ8Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyByMSAgICBpbnQgc291cmNlX3N0cmlkZQotOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCi07IHIzICAgIGludCAgcmVjb25fc3RyaWRlCi07IHN0YWNrIHVuc2lnbmVkIGludCAqc3NlCi18dnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2FybXY2fCBQUk9DCi0KLSAgICBzdG1mZCAgIHNwISwge3I0LXIxMiwgbHJ9Ci0gICAgbW92ICAgICByOCwgIzAgICAgICAgICAgICAgIDsgaW5pdGlhbGl6ZSBzdW0gPSAwCi0gICAgbGRyICAgICByMTAsIGM4MDgwODA4MAotICAgIG1vdiAgICAgcjExLCAjMCAgICAgICAgICAgICA7IGluaXRpYWxpemUgc3NlID0gMAotICAgIG1vdiAgICAgcjEyLCAjMTYgICAgICAgICAgICA7IHNldCBsb29wIGNvdW50ZXIgdG8gMTYgKD1ibG9jayBoZWlnaHQpCi0gICAgbW92ICAgICBsciwgIzAgICAgICAgICAgICAgIDsgY29uc3RhbnQgemVybwotbG9vcAotICAgIGFkZCAgICAgcjksIHIwLCByMSAgICAgICAgICA7IHNldCBzcmMgcG9pbnRlciB0byBuZXh0IHJvdwotICAgIDsgMXN0IDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjMF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI2LCBbcjksICMwXSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyBmcm9tIG5leHQgcm93Ci0gICAgbGRyICAgICByNSwgW3IyLCAjMF0gICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLQotICAgIDsgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIG12biAgICAgcjYsIHI2Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI2Ci0gICAgZW9yICAgICByNCwgcjQsIHIxMAotCi0gICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0gICAgOyBjYWxjdWxhdGUgdG90YWwgc3VtCi0gICAgYWRkcyAgICByOCwgcjgsIHI0ICAgICAgICAgIDsgYWRkIHBvc2l0aXZlIGRpZmZlcmVuY2VzIHRvIHN1bQotICAgIHN1YnMgICAgcjgsIHI4LCByNSAgICAgICAgICA7IHN1YnN0cmFjdCBuZWdhdGl2ZSBkaWZmZXJlbmNlcyBmcm9tIHN1bQotCi0gICAgOyBjYWxjdWxhdGUgc3NlCi0gICAgdXh0YjE2ICByNSwgcjYgICAgICAgICAgICAgIDsgYnl0ZSAodHdvIHBpeGVscykgdG8gaGFsZndvcmRzCi0gICAgdXh0YjE2ICByNywgcjYsIHJvciAjOCAgICAgIDsgYW5vdGhlciB0d28gcGl4ZWxzIHRvIGhhbGZ3b3JkcwotICAgIHNtbGFkICAgcjExLCByNSwgcjUsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDEpCi0KLSAgICA7IDJuZCA0IHBpeGVscwotICAgIGxkciAgICAgcjQsIFtyMCwgIzRdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzCi0gICAgbGRyICAgICByNiwgW3I5LCAjNF0gICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMgZnJvbSBuZXh0IHJvdwotICAgIGxkciAgICAgcjUsIFtyMiwgIzRdICAgICAgICA7IGxvYWQgNCByZWYgcGl4ZWxzCi0KLSAgICA7IGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBtdm4gICAgIHI2LCByNgotICAgIHVoc3ViOCAgcjQsIHI0LCByNgotICAgIGVvciAgICAgcjQsIHI0LCByMTAKLQotICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLSAgICB1c3ViOCAgIHI2LCByNCwgcjUgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZQotICAgIHNlbCAgICAgcjcsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIHBvc2l0aXZlIGRpZmZlcmVuY2UKLSAgICB1c3ViOCAgIHI2LCByNSwgcjQgICAgICAgICAgOyBjYWxjdWxhdGUgZGlmZmVyZW5jZSB3aXRoIHJldmVyc2VkIG9wZXJhbmRzCi0gICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLQotICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQotICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KLSAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KLQotICAgIDsgY2FsY3VsYXRlIHNzZQotICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcwotICAgIHV4dGIxNiAgcjcsIHI2LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKLSAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQotCi0gICAgOyAzcmQgNCBwaXhlbHMKLSAgICBsZHIgICAgIHI0LCBbcjAsICM4XSAgICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscwotICAgIGxkciAgICAgcjYsIFtyOSwgIzhdICAgICAgICA7IGxvYWQgNCBzcmMgcGl4ZWxzIGZyb20gbmV4dCByb3cKLSAgICBsZHIgICAgIHI1LCBbcjIsICM4XSAgICAgICAgOyBsb2FkIDQgcmVmIHBpeGVscwotCi0gICAgOyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgbXZuICAgICByNiwgcjYKLSAgICB1aHN1YjggIHI0LCByNCwgcjYKLSAgICBlb3IgICAgIHI0LCByNCwgcjEwCi0KLSAgICBzbWxhZCAgIHIxMSwgcjcsIHI3LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgyKQotCi0gICAgdXN1YjggICByNiwgcjQsIHI1ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2UKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIHNlbCAgICAgcjYsIHI2LCBsciAgICAgICAgICA7IHNlbGVjdCBieXRlcyB3aXRoIG5lZ2F0aXZlIGRpZmZlcmVuY2UKLQotICAgIDsgY2FsY3VsYXRlIHBhcnRpYWwgc3VtcwotICAgIHVzYWQ4ICAgcjQsIHI3LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgcG9zaXRpdmUgZGlmZmVyZW5jZXMKLSAgICB1c2FkOCAgIHI1LCByNiwgbHIgICAgICAgICAgOyBjYWxjdWxhdGUgc3VtIG9mIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCi0gICAgb3JyICAgICByNiwgcjYsIHI3ICAgICAgICAgIDsgZGlmZmVyZW5jZXMgb2YgYWxsIDQgcGl4ZWxzCi0KLSAgICA7IGNhbGN1bGF0ZSB0b3RhbCBzdW0KLSAgICBhZGQgICAgIHI4LCByOCwgcjQgICAgICAgICAgOyBhZGQgcG9zaXRpdmUgZGlmZmVyZW5jZXMgdG8gc3VtCi0gICAgc3ViICAgICByOCwgcjgsIHI1ICAgICAgICAgIDsgc3Vic3RyYWN0IG5lZ2F0aXZlIGRpZmZlcmVuY2VzIGZyb20gc3VtCi0KLSAgICA7IGNhbGN1bGF0ZSBzc2UKLSAgICB1eHRiMTYgIHI1LCByNiAgICAgICAgICAgICAgOyBieXRlICh0d28gcGl4ZWxzKSB0byBoYWxmd29yZHMKLSAgICB1eHRiMTYgIHI3LCByNiwgcm9yICM4ICAgICAgOyBhbm90aGVyIHR3byBwaXhlbHMgdG8gaGFsZndvcmRzCi0gICAgc21sYWQgICByMTEsIHI1LCByNSwgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMSkKLQotICAgIDsgNHRoIDQgcGl4ZWxzCi0gICAgbGRyICAgICByNCwgW3IwLCAjMTJdICAgICAgIDsgbG9hZCA0IHNyYyBwaXhlbHMKLSAgICBsZHIgICAgIHI2LCBbcjksICMxMl0gICAgICAgOyBsb2FkIDQgc3JjIHBpeGVscyBmcm9tIG5leHQgcm93Ci0gICAgbGRyICAgICByNSwgW3IyLCAjMTJdICAgICAgIDsgbG9hZCA0IHJlZiBwaXhlbHMKLQotICAgIDsgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIG12biAgICAgcjYsIHI2Ci0gICAgdWhzdWI4ICByNCwgcjQsIHI2Ci0gICAgZW9yICAgICByNCwgcjQsIHIxMAotCi0gICAgc21sYWQgICByMTEsIHI3LCByNywgcjExICAgIDsgZHVhbCBzaWduZWQgbXVsdGlwbHksIGFkZCBhbmQgYWNjdW11bGF0ZSAoMikKLQotICAgIHVzdWI4ICAgcjYsIHI0LCByNSAgICAgICAgICA7IGNhbGN1bGF0ZSBkaWZmZXJlbmNlCi0gICAgYWRkICAgICByMCwgcjAsIHIxICAgICAgICAgIDsgc2V0IHNyY19wdHIgdG8gbmV4dCByb3cKLSAgICBzZWwgICAgIHI3LCByNiwgbHIgICAgICAgICAgOyBzZWxlY3QgYnl0ZXMgd2l0aCBwb3NpdGl2ZSBkaWZmZXJlbmNlCi0gICAgdXN1YjggICByNiwgcjUsIHI0ICAgICAgICAgIDsgY2FsY3VsYXRlIGRpZmZlcmVuY2Ugd2l0aCByZXZlcnNlZCBvcGVyYW5kcwotICAgIGFkZCAgICAgcjIsIHIyLCByMyAgICAgICAgICA7IHNldCBkc3RfcHRyIHRvIG5leHQgcm93Ci0gICAgc2VsICAgICByNiwgcjYsIGxyICAgICAgICAgIDsgc2VsZWN0IGJ5dGVzIHdpdGggbmVnYXRpdmUgZGlmZmVyZW5jZQotCi0gICAgOyBjYWxjdWxhdGUgcGFydGlhbCBzdW1zCi0gICAgdXNhZDggICByNCwgcjcsIGxyICAgICAgICAgIDsgY2FsY3VsYXRlIHN1bSBvZiBwb3NpdGl2ZSBkaWZmZXJlbmNlcwotICAgIHVzYWQ4ICAgcjUsIHI2LCBsciAgICAgICAgICA7IGNhbGN1bGF0ZSBzdW0gb2YgbmVnYXRpdmUgZGlmZmVyZW5jZXMKLSAgICBvcnIgICAgIHI2LCByNiwgcjcgICAgICAgICAgOyBkaWZmZXJlbmNlcyBvZiBhbGwgNCBwaXhlbHMKLQotICAgIDsgY2FsY3VsYXRlIHRvdGFsIHN1bQotICAgIGFkZCAgICAgcjgsIHI4LCByNCAgICAgICAgICA7IGFkZCBwb3NpdGl2ZSBkaWZmZXJlbmNlcyB0byBzdW0KLSAgICBzdWIgICAgIHI4LCByOCwgcjUgICAgICAgICAgOyBzdWJzdHJhY3QgbmVnYXRpdmUgZGlmZmVyZW5jZXMgZnJvbSBzdW0KLQotICAgIDsgY2FsY3VsYXRlIHNzZQotICAgIHV4dGIxNiAgcjUsIHI2ICAgICAgICAgICAgICA7IGJ5dGUgKHR3byBwaXhlbHMpIHRvIGhhbGZ3b3JkcwotICAgIHV4dGIxNiAgcjcsIHI2LCByb3IgIzggICAgICA7IGFub3RoZXIgdHdvIHBpeGVscyB0byBoYWxmd29yZHMKLSAgICBzbWxhZCAgIHIxMSwgcjUsIHI1LCByMTEgICAgOyBkdWFsIHNpZ25lZCBtdWx0aXBseSwgYWRkIGFuZCBhY2N1bXVsYXRlICgxKQotICAgIHNtbGFkICAgcjExLCByNywgcjcsIHIxMSAgICA7IGR1YWwgc2lnbmVkIG11bHRpcGx5LCBhZGQgYW5kIGFjY3VtdWxhdGUgKDIpCi0KLQotICAgIHN1YnMgICAgcjEyLCByMTIsICMxCi0KLSAgICBibmUgICAgIGxvb3AKLQotICAgIDsgcmV0dXJuIHN0dWZmCi0gICAgbGRyICAgICByNiwgW3NwLCAjNDBdICAgICAgIDsgZ2V0IGFkZHJlc3Mgb2Ygc3NlCi0gICAgbXVsICAgICByMCwgcjgsIHI4ICAgICAgICAgIDsgc3VtICogc3VtCi0gICAgc3RyICAgICByMTEsIFtyNl0gICAgICAgICAgIDsgc3RvcmUgc3NlCi0gICAgc3ViICAgICByMCwgcjExLCByMCwgYXNyICM4IDsgcmV0dXJuIChzc2UgLSAoKHN1bSAqIHN1bSkgPj4gOCkpCi0KLSAgICBsZG1mZCAgIHNwISwge3I0LXIxMiwgcGN9Ci0KLSAgICBFTkRQCi0KLWM4MDgwODA4MAotICAgIERDRCAgICAgMHg4MDgwODA4MAotCi0gICAgRU5ECi0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni93YWxzaF92Ni5hc20gYi92cDgvZW5jb2Rlci9hcm0vYXJtdjYvd2Fsc2hfdjYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZmZGIzLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9hcm12Ni93YWxzaF92Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLSAgICBFWFBPUlQgfHZwOF9zaG9ydF93YWxzaDR4NF9hcm12NnwKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUsIFJFQURPTkxZICA7IG5hbWUgdGhpcyBibG9jayBvZiBjb2RlCi0KLTtzaG9ydCB2cDhfc2hvcnRfd2Fsc2g0eDRfYXJtdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCi18dnA4X3Nob3J0X3dhbHNoNHg0X2FybXY2fCBQUk9DCi0KLSAgICBzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBtb3YgICAgICAgICByMTIsIHIyICAgICAgICAgICAgICA7IHVnaC4gbm90IGNsZWFuCi0gICAgbGRyICAgICAgICAgcjIsIFtyMF0gICAgICAgICAgICAgOyBbMSAgfCAgMF0KLSAgICBsZHIgICAgICAgICByMywgW3IwLCAjNF0gICAgICAgICA7IFszICB8ICAyXQotICAgIGxkciAgICAgICAgIHI0LCBbcjAsIHIxMl0hICAgICAgIDsgWzUgIHwgIDRdCi0gICAgbGRyICAgICAgICAgcjUsIFtyMCwgIzRdICAgICAgICAgOyBbNyAgfCAgNl0KLSAgICBsZHIgICAgICAgICByNiwgW3IwLCByMTJdISAgICAgICA7IFs5ICB8ICA4XQotICAgIGxkciAgICAgICAgIHI3LCBbcjAsICM0XSAgICAgICAgIDsgWzExIHwgMTBdCi0gICAgbGRyICAgICAgICAgcjgsIFtyMCwgcjEyXSEgICAgICAgOyBbMTMgfCAxMl0KLSAgICBsZHIgICAgICAgICByOSwgW3IwLCAjNF0gICAgICAgICA7IFsxNSB8IDE0XQotCi0gICAgcXN1YmFkZHggICAgcjEwLCByMiwgcjMgICAgICAgICAgOyBbYzF8YTFdIFsxLTIgICB8ICAgMCszXQotICAgIHFhZGRzdWJ4ICAgIHIxMSwgcjIsIHIzICAgICAgICAgIDsgW2IxfGQxXSBbMSsyICAgfCAgIDAtM10KLSAgICBxc3ViYWRkeCAgICByMTIsIHI0LCByNSAgICAgICAgICA7IFtjMXxhMV0gWzUtNiAgIHwgICA0KzddCi0gICAgcWFkZHN1YnggICAgbHIsIHI0LCByNSAgICAgICAgICAgOyBbYjF8ZDFdIFs1KzYgICB8ICAgNC03XQotCi0gICAgcWFkZHN1YnggICAgcjIsIHIxMCwgcjExICAgICAgICAgOyBbMSB8IDJdIFtjMStkMSB8IGExLWIxXQotICAgIHFhZGRzdWJ4ICAgIHIzLCByMTEsIHIxMCAgICAgICAgIDsgWzAgfCAzXSBbYjErYTEgfCBkMS1jMV0KLSAgICBxYWRkc3VieCAgICByNCwgcjEyLCBsciAgICAgICAgICA7IFs1IHwgNl0gW2MxK2QxIHwgYTEtYjFdCi0gICAgcWFkZHN1YnggICAgcjUsIGxyLCByMTIgICAgICAgICAgOyBbNCB8IDddIFtiMSthMSB8IGQxLWMxXQotCi0gICAgcXN1YmFkZHggICAgcjEwLCByNiwgcjcgICAgICAgICAgOyBbYzF8YTFdIFs5LTEwICB8ICA4KzExXQotICAgIHFhZGRzdWJ4ICAgIHIxMSwgcjYsIHI3ICAgICAgICAgIDsgW2IxfGQxXSBbOSsxMCAgfCAgOC0xMV0KLSAgICBxc3ViYWRkeCAgICByMTIsIHI4LCByOSAgICAgICAgICA7IFtjMXxhMV0gWzEzLTE0IHwgMTIrMTVdCi0gICAgcWFkZHN1YnggICAgbHIsIHI4LCByOSAgICAgICAgICAgOyBbYjF8ZDFdIFsxMysxNCB8IDEyLTE1XQotCi0gICAgcWFkZHN1YnggICAgcjYsIHIxMCwgcjExICAgICAgICAgOyBbOSB8MTBdIFtjMStkMSB8IGExLWIxXQotICAgIHFhZGRzdWJ4ICAgIHI3LCByMTEsIHIxMCAgICAgICAgIDsgWzggfDExXSBbYjErYTEgfCBkMS1jMV0KLSAgICBxYWRkc3VieCAgICByOCwgcjEyLCBsciAgICAgICAgICA7IFsxM3wxNF0gW2MxK2QxIHwgYTEtYjFdCi0gICAgcWFkZHN1YnggICAgcjksIGxyLCByMTIgICAgICAgICAgOyBbMTJ8MTVdIFtiMSthMSB8IGQxLWMxXQotCi0gICAgOyBmaXJzdCB0cmFuc2Zvcm0gY29tcGxldGUKLQotICAgIHFhZGQxNiAgICAgIHIxMCwgcjMsIHI5ICAgICAgICAgIDsgYTEgWzArMTIgIHwgIDMrMTVdCi0gICAgcWFkZDE2ICAgICAgcjExLCByNSwgcjcgICAgICAgICAgOyBiMSBbNCs4ICAgfCAgNysxMV0KLSAgICBxc3ViMTYgICAgICByMTIsIHI1LCByNyAgICAgICAgICA7IGMxIFs0LTggICB8ICA3LTExXQotICAgIHFzdWIxNiAgICAgIGxyLCByMywgcjkgICAgICAgICAgIDsgZDEgWzAtMTIgIHwgIDMtMTVdCi0KLSAgICBxYWRkMTYgICAgICByMywgcjEwLCByMTEgICAgICAgICA7IGEyIFthMStiMV0gWzAgfCAzXQotICAgIHFhZGQxNiAgICAgIHI1LCByMTIsIGxyICAgICAgICAgIDsgYjIgW2MxK2QxXSBbNCB8IDddCi0gICAgcXN1YjE2ICAgICAgcjcsIHIxMCwgcjExICAgICAgICAgOyBjMiBbYTEtYjFdIFs4IHwxMV0KLSAgICBxc3ViMTYgICAgICByOSwgbHIsIHIxMiAgICAgICAgICA7IGQyIFtkMS1jMV0gWzEyfDE1XQotCi0gICAgcWFkZDE2ICAgICAgcjEwLCByMiwgcjggICAgICAgICAgOyBhMSBbMSsxMyAgfCAgMisxNF0KLSAgICBxYWRkMTYgICAgICByMTEsIHI0LCByNiAgICAgICAgICA7IGIxIFs1KzkgICB8ICA2KzEwXQotICAgIHFzdWIxNiAgICAgIHIxMiwgcjQsIHI2ICAgICAgICAgIDsgYzEgWzUtOSAgIHwgIDYtMTBdCi0gICAgcXN1YjE2ICAgICAgbHIsIHIyLCByOCAgICAgICAgICAgOyBkMSBbMS0xMyAgfCAgMi0xNF0KLQotICAgIHFhZGQxNiAgICAgIHIyLCByMTAsIHIxMSAgICAgICAgIDsgYTIgW2ExK2IxXSBbMSB8IDJdCi0gICAgcWFkZDE2ICAgICAgcjQsIHIxMiwgbHIgICAgICAgICAgOyBiMiBbYzErZDFdIFs1IHwgNl0KLSAgICBxc3ViMTYgICAgICByNiwgcjEwLCByMTEgICAgICAgICA7IGMyIFthMS1iMV0gWzkgfDEwXQotICAgIHFzdWIxNiAgICAgIHI4LCBsciwgcjEyICAgICAgICAgIDsgZDIgW2QxLWMxXSBbMTN8MTRdCi0KLSAgICA7IFthLWRdMiArPSAoW2EtZF0yID4gMCkKLQotICAgIGFzcnMgICAgICAgIHIxMCwgcjMsICMxNgotICAgIGFkZHBsICAgICAgIHIxMCwgcjEwLCAjMSAgICAgICAgIDsgW34wXQotICAgIGFzcnMgICAgICAgIHIxMSwgcjIsICMxNgotICAgIGFkZHBsICAgICAgIHIxMSwgcjExLCAjMSAgICAgICAgIDsgW34xXQotICAgIGxzbCAgICAgICAgIHIxMSwgcjExLCAjMTUgICAgICAgIDsgWzEgIHwgIHhdCi0gICAgcGtodGIgICAgICAgcjEwLCByMTEsIHIxMCwgYXNyICMxOyBbMSAgfCAgMF0KLSAgICBzdHIgICAgICAgICByMTAsIFtyMV0sICM0Ci0KLSAgICBsc2xzICAgICAgICByMTEsIHIyLCAjMTYKLSAgICBhZGRwbCAgICAgICByMTEsIHIxMSwgIzB4MTAwMDAgICA7IFt+Ml0KLSAgICBsc2xzICAgICAgICByMTIsIHIzLCAjMTYKLSAgICBhZGRwbCAgICAgICByMTIsIHIxMiwgIzB4MTAwMDAgICA7IFt+M10KLSAgICBhc3IgICAgICAgICByMTIsIHIxMiwgIzEgICAgICAgICA7IFszICB8ICB4XQotICAgIHBraHRiICAgICAgIHIxMSwgcjEyLCByMTEsIGFzciAjMTc7IFszICB8ICAyXQotICAgIHN0ciAgICAgICAgIHIxMSwgW3IxXSwgIzQKLQotICAgIGFzcnMgICAgICAgIHIyLCByNSwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjIsIHIyLCAjMSAgICAgICAgICAgOyBbfjRdCi0gICAgYXNycyAgICAgICAgcjMsIHI0LCAjMTYKLSAgICBhZGRwbCAgICAgICByMywgcjMsICMxICAgICAgICAgICA7IFt+NV0KLSAgICBsc2wgICAgICAgICByMywgcjMsICMxNSAgICAgICAgICA7IFs1ICB8ICB4XQotICAgIHBraHRiICAgICAgIHIyLCByMywgcjIsIGFzciAjMSAgIDsgWzUgIHwgIDRdCi0gICAgc3RyICAgICAgICAgcjIsIFtyMV0sICM0Ci0KLSAgICBsc2xzICAgICAgICByMiwgcjQsICMxNgotICAgIGFkZHBsICAgICAgIHIyLCByMiwgIzB4MTAwMDAgICAgIDsgW342XQotICAgIGxzbHMgICAgICAgIHIzLCByNSwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjMsIHIzLCAjMHgxMDAwMCAgICAgOyBbfjddCi0gICAgYXNyICAgICAgICAgcjMsIHIzLCAjMSAgICAgICAgICAgOyBbNyAgfCAgeF0KLSAgICBwa2h0YiAgICAgICByMiwgcjMsIHIyLCBhc3IgIzE3ICA7IFs3ICB8ICA2XQotICAgIHN0ciAgICAgICAgIHIyLCBbcjFdLCAjNAotCi0gICAgYXNycyAgICAgICAgcjIsIHI3LCAjMTYKLSAgICBhZGRwbCAgICAgICByMiwgcjIsICMxICAgICAgICAgICA7IFt+OF0KLSAgICBhc3JzICAgICAgICByMywgcjYsICMxNgotICAgIGFkZHBsICAgICAgIHIzLCByMywgIzEgICAgICAgICAgIDsgW345XQotICAgIGxzbCAgICAgICAgIHIzLCByMywgIzE1ICAgICAgICAgIDsgWzkgIHwgIHhdCi0gICAgcGtodGIgICAgICAgcjIsIHIzLCByMiwgYXNyICMxICAgOyBbOSAgfCAgOF0KLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLQotICAgIGxzbHMgICAgICAgIHIyLCByNiwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjIsIHIyLCAjMHgxMDAwMCAgICAgOyBbfjEwXQotICAgIGxzbHMgICAgICAgIHIzLCByNywgIzE2Ci0gICAgYWRkcGwgICAgICAgcjMsIHIzLCAjMHgxMDAwMCAgICAgOyBbfjExXQotICAgIGFzciAgICAgICAgIHIzLCByMywgIzEgICAgICAgICAgIDsgWzExIHwgIHhdCi0gICAgcGtodGIgICAgICAgcjIsIHIzLCByMiwgYXNyICMxNyAgOyBbMTEgfCAxMF0KLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLQotICAgIGFzcnMgICAgICAgIHIyLCByOSwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjIsIHIyLCAjMSAgICAgICAgICAgOyBbfjEyXQotICAgIGFzcnMgICAgICAgIHIzLCByOCwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjMsIHIzLCAjMSAgICAgICAgICAgOyBbfjEzXQotICAgIGxzbCAgICAgICAgIHIzLCByMywgIzE1ICAgICAgICAgIDsgWzEzIHwgIHhdCi0gICAgcGtodGIgICAgICAgcjIsIHIzLCByMiwgYXNyICMxICAgOyBbMTMgfCAxMl0KLSAgICBzdHIgICAgICAgICByMiwgW3IxXSwgIzQKLQotICAgIGxzbHMgICAgICAgIHIyLCByOCwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjIsIHIyLCAjMHgxMDAwMCAgICAgOyBbfjE0XQotICAgIGxzbHMgICAgICAgIHIzLCByOSwgIzE2Ci0gICAgYWRkcGwgICAgICAgcjMsIHIzLCAjMHgxMDAwMCAgICAgOyBbfjE1XQotICAgIGFzciAgICAgICAgIHIzLCByMywgIzEgICAgICAgICAgIDsgWzE1IHwgIHhdCi0gICAgcGtodGIgICAgICAgcjIsIHIzLCByMiwgYXNyICMxNyAgOyBbMTUgfCAxNF0KLSAgICBzdHIgICAgICAgICByMiwgW3IxXQotCi0gICAgbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgICAgIDsgfHZwOF9zaG9ydF93YWxzaDR4NF9hcm12NnwKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2Jvb2xodWZmX2FybS5jIGIvdnA4L2VuY29kZXIvYXJtL2Jvb2xodWZmX2FybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg5NjYzLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9ib29saHVmZl9hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvYm9vbGh1ZmYuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2Jsb2NrZC5oIgotCi1jb25zdCB1bnNpZ25lZCBpbnQgdnA4X3Byb2JfY29zdFsyNTZdID0KLXsKLSAgICAyMDQ3LCAyMDQ3LCAxNzkxLCAxNjQxLCAxNTM1LCAxNDUyLCAxMzg1LCAxMzI4LCAxMjc5LCAxMjM1LCAxMTk2LCAxMTYxLCAxMTI5LCAxMDk5LCAxMDcyLCAxMDQ2LAotICAgIDEwMjMsIDEwMDAsICA5NzksICA5NTksICA5NDAsICA5MjIsICA5MDUsICA4ODksICA4NzMsICA4NTgsICA4NDMsICA4MjksICA4MTYsICA4MDMsICA3OTAsICA3NzgsCi0gICAgNzY3LCAgNzU1LCAgNzQ0LCAgNzMzLCAgNzIzLCAgNzEzLCAgNzAzLCAgNjkzLCAgNjg0LCAgNjc1LCAgNjY2LCAgNjU3LCAgNjQ5LCAgNjQxLCAgNjMzLCAgNjI1LAotICAgIDYxNywgIDYwOSwgIDYwMiwgIDU5NCwgIDU4NywgIDU4MCwgIDU3MywgIDU2NywgIDU2MCwgIDU1MywgIDU0NywgIDU0MSwgIDUzNCwgIDUyOCwgIDUyMiwgIDUxNiwKLSAgICA1MTEsICA1MDUsICA0OTksICA0OTQsICA0ODgsICA0ODMsICA0NzcsICA0NzIsICA0NjcsICA0NjIsICA0NTcsICA0NTIsICA0NDcsICA0NDIsICA0MzcsICA0MzMsCi0gICAgNDI4LCAgNDI0LCAgNDE5LCAgNDE1LCAgNDEwLCAgNDA2LCAgNDAxLCAgMzk3LCAgMzkzLCAgMzg5LCAgMzg1LCAgMzgxLCAgMzc3LCAgMzczLCAgMzY5LCAgMzY1LAotICAgIDM2MSwgIDM1NywgIDM1MywgIDM0OSwgIDM0NiwgIDM0MiwgIDMzOCwgIDMzNSwgIDMzMSwgIDMyOCwgIDMyNCwgIDMyMSwgIDMxNywgIDMxNCwgIDMxMSwgIDMwNywKLSAgICAzMDQsICAzMDEsICAyOTcsICAyOTQsICAyOTEsICAyODgsICAyODUsICAyODEsICAyNzgsICAyNzUsICAyNzIsICAyNjksICAyNjYsICAyNjMsICAyNjAsICAyNTcsCi0gICAgMjU1LCAgMjUyLCAgMjQ5LCAgMjQ2LCAgMjQzLCAgMjQwLCAgMjM4LCAgMjM1LCAgMjMyLCAgMjI5LCAgMjI3LCAgMjI0LCAgMjIxLCAgMjE5LCAgMjE2LCAgMjE0LAotICAgIDIxMSwgIDIwOCwgIDIwNiwgIDIwMywgIDIwMSwgIDE5OCwgIDE5NiwgIDE5NCwgIDE5MSwgIDE4OSwgIDE4NiwgIDE4NCwgIDE4MSwgIDE3OSwgIDE3NywgIDE3NCwKLSAgICAxNzIsICAxNzAsICAxNjgsICAxNjUsICAxNjMsICAxNjEsICAxNTksICAxNTYsICAxNTQsICAxNTIsICAxNTAsICAxNDgsICAxNDUsICAxNDMsICAxNDEsICAxMzksCi0gICAgMTM3LCAgMTM1LCAgMTMzLCAgMTMxLCAgMTI5LCAgMTI3LCAgMTI1LCAgMTIzLCAgMTIxLCAgMTE5LCAgMTE3LCAgMTE1LCAgMTEzLCAgMTExLCAgMTA5LCAgMTA3LAotICAgIDEwNSwgIDEwMywgIDEwMSwgICA5OSwgICA5NywgICA5NSwgICA5MywgICA5MiwgICA5MCwgICA4OCwgICA4NiwgICA4NCwgICA4MiwgICA4MSwgICA3OSwgICA3NywKLSAgICA3NSwgICA3MywgICA3MiwgICA3MCwgICA2OCwgICA2NiwgICA2NSwgICA2MywgICA2MSwgICA2MCwgICA1OCwgICA1NiwgICA1NSwgICA1MywgICA1MSwgICA1MCwKLSAgICA0OCwgICA0NiwgICA0NSwgICA0MywgICA0MSwgICA0MCwgICAzOCwgICAzNywgICAzNSwgICAzMywgICAzMiwgICAzMCwgICAyOSwgICAyNywgICAyNSwgICAyNCwKLSAgICAyMiwgICAyMSwgICAxOSwgICAxOCwgICAxNiwgICAxNSwgICAxMywgICAxMiwgICAxMCwgICAgOSwgICAgNywgICAgNiwgICAgNCwgICAgMywgICAgMSwgICAxCi19OwotCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vZGN0X2FybS5jIGIvdnA4L2VuY29kZXIvYXJtL2RjdF9hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkNjQ5ZC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vZGN0X2FybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9lbmNvZGVyL2RjdC5oIgotCi0jaWYgSEFWRV9BUk1WNgotCi12b2lkIHZwOF9mYXN0X2ZkY3Q4eDRfYXJtdjYoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpCi17Ci0gICAgdnA4X2Zhc3RfZmRjdDR4NF9hcm12NihpbnB1dCwgICBvdXRwdXQsICAgIHBpdGNoKTsKLSAgICB2cDhfZmFzdF9mZGN0NHg0X2FybXY2KGlucHV0ICsgNCwgb3V0cHV0ICsgMTYsIHBpdGNoKTsKLX0KLQotI2VuZGlmIC8qIEhBVkVfQVJNVjYgKi8KLQotCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vZGN0X2FybS5oIGIvdnA4L2VuY29kZXIvYXJtL2RjdF9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZDVmNC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vZGN0X2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgRENUX0FSTV9ICi0jZGVmaW5lIERDVF9BUk1fSAotCi0jaWYgSEFWRV9BUk1WNgotZXh0ZXJuIHByb3RvdHlwZV9mZGN0KHZwOF9zaG9ydF93YWxzaDR4NF9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX2ZkY3QodnA4X2Zhc3RfZmRjdDR4NF9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX2ZkY3QodnA4X2Zhc3RfZmRjdDh4NF9hcm12Nik7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfZmRjdF93YWxzaF9zaG9ydDR4NAotI2RlZmluZSB2cDhfZmRjdF93YWxzaF9zaG9ydDR4NCB2cDhfc2hvcnRfd2Fsc2g0eDRfYXJtdjYKLQotI3VuZGVmICB2cDhfZmRjdF9mYXN0NHg0Ci0jZGVmaW5lIHZwOF9mZGN0X2Zhc3Q0eDQgdnA4X2Zhc3RfZmRjdDR4NF9hcm12NgotCi0jdW5kZWYgIHZwOF9mZGN0X2Zhc3Q4eDQKLSNkZWZpbmUgdnA4X2ZkY3RfZmFzdDh4NCB2cDhfZmFzdF9mZGN0OHg0X2FybXY2Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEhBVkVfQVJNVjYgKi8KLQotI2lmIEhBVkVfQVJNVjcKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfc2hvcnRfZmRjdDR4NF9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfc2hvcnRfZmRjdDh4NF9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfZmFzdF9mZGN0NHg0X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9mZGN0KHZwOF9mYXN0X2ZkY3Q4eDRfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX2ZkY3QodnA4X3Nob3J0X3dhbHNoNHg0X25lb24pOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X2ZkY3Rfc2hvcnQ0eDQKLSNkZWZpbmUgdnA4X2ZkY3Rfc2hvcnQ0eDQgdnA4X3Nob3J0X2ZkY3Q0eDRfbmVvbgotCi0jdW5kZWYgIHZwOF9mZGN0X3Nob3J0OHg0Ci0jZGVmaW5lIHZwOF9mZGN0X3Nob3J0OHg0IHZwOF9zaG9ydF9mZGN0OHg0X25lb24KLQotI3VuZGVmICB2cDhfZmRjdF9mYXN0NHg0Ci0jZGVmaW5lIHZwOF9mZGN0X2Zhc3Q0eDQgdnA4X2Zhc3RfZmRjdDR4NF9uZW9uCi0KLSN1bmRlZiAgdnA4X2ZkY3RfZmFzdDh4NAotI2RlZmluZSB2cDhfZmRjdF9mYXN0OHg0IHZwOF9mYXN0X2ZkY3Q4eDRfbmVvbgotCi0jdW5kZWYgIHZwOF9mZGN0X3dhbHNoX3Nob3J0NHg0Ci0jZGVmaW5lIHZwOF9mZGN0X3dhbHNoX3Nob3J0NHg0IHZwOF9zaG9ydF93YWxzaDR4NF9uZW9uCi0jZW5kaWYKLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL2VuY29kZW1iX2FybS5oIGIvdnA4L2VuY29kZXIvYXJtL2VuY29kZW1iX2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQxN2ZlLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9lbmNvZGVtYl9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIEVOQ09ERU1CX0FSTV9ICi0jZGVmaW5lIEVOQ09ERU1CX0FSTV9ICi0KLSNpZiBIQVZFX0FSTVY2Ci1leHRlcm4gcHJvdG90eXBlX3N1YmIodnA4X3N1YnRyYWN0X2JfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJtYnkodnA4X3N1YnRyYWN0X21ieV9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX3N1Ym1idXYodnA4X3N1YnRyYWN0X21idXZfYXJtdjYpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X2VuY29kZW1iX3N1YmIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX3N1YmIgdnA4X3N1YnRyYWN0X2JfYXJtdjYKLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfc3VibWJ5Ci0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJtYnkgdnA4X3N1YnRyYWN0X21ieV9hcm12NgotCi0jdW5kZWYgIHZwOF9lbmNvZGVtYl9zdWJtYnV2Ci0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJtYnV2IHZwOF9zdWJ0cmFjdF9tYnV2X2FybXY2Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEhBVkVfQVJNVjYgKi8KLQotI2lmIEhBVkVfQVJNVjcKLS8vZXh0ZXJuIHByb3RvdHlwZV9iZXJyKHZwOF9ibG9ja19lcnJvcl9jKTsKLS8vZXh0ZXJuIHByb3RvdHlwZV9tYmVycih2cDhfbWJibG9ja19lcnJvcl9jKTsKLS8vZXh0ZXJuIHByb3RvdHlwZV9tYnV2ZXJyKHZwOF9tYnV2ZXJyb3JfYyk7Ci0KLWV4dGVybiBwcm90b3R5cGVfc3ViYih2cDhfc3VidHJhY3RfYl9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfc3VibWJ5KHZwOF9zdWJ0cmFjdF9tYnlfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3N1Ym1idXYodnA4X3N1YnRyYWN0X21idXZfbmVvbik7Ci0KLS8vI3VuZGVmICB2cDhfZW5jb2RlbWJfYmVycgotLy8jZGVmaW5lIHZwOF9lbmNvZGVtYl9iZXJyIHZwOF9ibG9ja19lcnJvcl9jCi0KLS8vI3VuZGVmICB2cDhfZW5jb2RlbWJfbWJlcnIKLS8vI2RlZmluZSB2cDhfZW5jb2RlbWJfbWJlcnIgdnA4X21iYmxvY2tfZXJyb3JfYwotCi0vLyN1bmRlZiAgdnA4X2VuY29kZW1iX21idXZlcnIKLS8vI2RlZmluZSB2cDhfZW5jb2RlbWJfbWJ1dmVyciB2cDhfbWJ1dmVycm9yX2MKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9lbmNvZGVtYl9zdWJiCi0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJiIHZwOF9zdWJ0cmFjdF9iX25lb24KLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfc3VibWJ5Ci0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJtYnkgdnA4X3N1YnRyYWN0X21ieV9uZW9uCi0KLSN1bmRlZiAgdnA4X2VuY29kZW1iX3N1Ym1idXYKLSNkZWZpbmUgdnA4X2VuY29kZW1iX3N1Ym1idXYgdnA4X3N1YnRyYWN0X21idXZfbmVvbgotI2VuZGlmCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL2Zhc3RmZGN0NHg0X25lb24uYXNtIGIvdnA4L2VuY29kZXIvYXJtL25lb24vZmFzdGZkY3Q0eDRfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzQyNWQuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL25lb24vZmFzdGZkY3Q0eDRfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9mYXN0X2ZkY3Q0eDRfbmVvbnwKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTt2b2lkIHZwOF9mYXN0X2ZkY3Q0eDRfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci07Tk9URToKLTtUaGUgaW5wdXQgKnNyY19kaWZmLiBzcmNfZGlmZiBpcyBjYWxjdWxhdGVkIGFzOgotO2RpZmZfcHRyW2NdID0gc3JjX3B0cltjXSAtIHByZWRfcHRyW2NdOyAoaW4gU3VidHJhY3QqIGZ1bmN0aW9uKQotO0luIHdoaWNoICpzcmNfcHRyIGFuZCAqcHJlZF9wdHIgYm90aCBhcmUgdW5zaWduZWQgY2hhci4KLTtUaGVyZWZvcmUsICpzcmNfZGlmZiBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIG9mIFstMjU1LCAyNTVdLgotO0NBVVRJT046Ci07VGhlIGlucHV0IHZhbHVlcyBvZiAyNXRoIGJsb2NrIGFyZSBzZXQgaW4gdnA4X2J1aWxkX2RjYmxvY2sgZnVuY3Rpb24sIHdoaWNoIGFyZSBvdXQgb2YgWy0yNTUsIDI1NV0uCi07QnV0LCBWUDggZW5jb2RlciBvbmx5IHVzZXMgdnA4X3Nob3J0X2ZkY3Q0eDRfYyBmb3IgMjV0aCBibG9jaywgbm90IHZwOF9mYXN0X2ZkY3Q0eDRfYy4gVGhhdCBtYWtlcwotO2l0IG9rIGZvciBhc3N1bWluZyAqaW5wdXQgaW4gWy0yNTUsIDI1NV0gaW4gdnA4X2Zhc3RfZmRjdDR4NF9jLCBidXQgbm90IG9rIGluIHZwOF9zaG9ydF9mZGN0NHg0X2MuCi0KLXx2cDhfZmFzdF9mZGN0NHg0X25lb258IFBST0MKLSAgICB2bGQxLjE2ICAgICAgICAge2QyfSwgW3IwXSwgcjIgICAgICAgICAgICAgIDtsb2FkIGlucHV0Ci0gICAgYWRyICAgICAgICAgICAgIHIxMiwgZmZkY3RfY29lZmYKLSAgICB2bGQxLjE2ICAgICAgICAge2QzfSwgW3IwXSwgcjIKLSAgICB2bGQxLjE2ICAgICAgICAge2Q0fSwgW3IwXSwgcjIKLSAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3IxMl0KLSAgICB2bGQxLjE2ICAgICAgICAge2Q1fSwgW3IwXSwgcjIKLQotICAgIDtGaXJzdCBmb3ItbG9vcAotICAgIDt0cmFuc3Bvc2UgZDIsIGQzLCBkNCwgZDUuIFRoZW4sIGQyPWlwWzBdLCBkMz1pcFsxXSwgZDQ9aXBbMl0sIGQ1PWlwWzNdCi0gICAgdnRybi4zMiAgICAgICAgIGQyLCBkNAotICAgIHZ0cm4uMzIgICAgICAgICBkMywgZDUKLSAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQzCi0gICAgdnRybi4xNiAgICAgICAgIGQ0LCBkNQotCi0gICAgdmFkZC5zMTYgICAgICAgIGQ2LCBkMiwgZDUgICAgICAgICAgICAgIDtpcFswXStpcFszXQotICAgIHZhZGQuczE2ICAgICAgICBkNywgZDMsIGQ0ICAgICAgICAgICAgICA7aXBbMV0raXBbMl0KLSAgICB2c3ViLnMxNiAgICAgICAgZDgsIGQzLCBkNCAgICAgICAgICAgICAgO2lwWzFdLWlwWzJdCi0gICAgdnN1Yi5zMTYgICAgICAgIGQ5LCBkMiwgZDUgICAgICAgICAgICAgIDtpcFswXS1pcFszXQotICAgIHZzaGwuaTE2ICAgICAgICBxMywgcTMsICMxICAgICAgICAgICAgICA7IGExLCBiMQotICAgIHZzaGwuaTE2ICAgICAgICBxNCwgcTQsICMxICAgICAgICAgICAgICA7IGMxLCBkMQotCi0gICAgdmFkZC5zMTYgICAgICAgIGQxMCwgZDYsIGQ3ICAgICAgICAgICAgIDt0ZW1wMSA9IGExICsgYjEKLSAgICB2c3ViLnMxNiAgICAgICAgZDExLCBkNiwgZDcgICAgICAgICAgICAgO3RlbXAyID0gYTEgLSBiMQotCi0gICAgdnFkbXVsaC5zMTYgICAgIHE2LCBxNSwgZDBbMV0KLSAgICB2cWRtdWxoLnMxNiAgICAgcTgsIHE0LCBkMFswXQotICAgIHZxZG11bGguczE2ICAgICBxNywgcTQsIGQwWzJdCi0KLSAgICB2c2hyLnMxNiAgICAgICAgcTYsIHE2LCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHE3LCBxNywgIzEgICAgICAgICAgICAgIDtkMTQ6dGVtcDEgPSAoIGMxICogeF9jMyk+PjE2OyAgZDE1OnRlbXAxID0gIChkMSAqIHhfYzMpPj4xNgotICAgIHZhZGQuczE2ICAgICAgICBxOCwgcTQsIHE4ICAgICAgICAgICAgICA7ZDE2OnRlbXAyID0gKChjMSAqIHhfYzEpPj4xNikgKyBjMTsgIGQxNzp0ZW1wMiA9ICgoZDEgKiB4X2MxKT4+MTYpICsgZDEKLQotICAgIHZhZGQuczE2ICAgICAgICBkMiwgZDEwLCBkMTIgICAgICAgICAgICA7b3BbMF0gPSAoKHRlbXAxICogeF9jMiApPj4xNikgKyB0ZW1wMQotICAgIHZhZGQuczE2ICAgICAgICBkNCwgZDExLCBkMTMgICAgICAgICAgICA7b3BbMl0gPSAoKHRlbXAyICogeF9jMiApPj4xNikgKyB0ZW1wMgotICAgIHZhZGQuczE2ICAgICAgICBkMywgZDE0LCBkMTcgICAgICAgICAgICA7b3BbMV0gPSB0ZW1wMSArIHRlbXAyICAtLSBxIGlzIG5vdCBuZWNlc3NhcnksIGp1c3QgZm9yIHByb3RlY3Rpb24KLSAgICB2c3ViLnMxNiAgICAgICAgZDUsIGQxNSwgZDE2ICAgICAgICAgICAgO29wWzNdID0gdGVtcDEgLSB0ZW1wMgotCi0gICAgO1NlY29uZCBmb3ItbG9vcAotICAgIDt0cmFuc3Bvc2UgZDIsIGQzLCBkNCwgZDUuIFRoZW4sIGQyPWlwWzBdLCBkMz1pcFs0XSwgZDQ9aXBbOF0sIGQ1PWlwWzEyXQotICAgIHZ0cm4uMzIgICAgICAgICBkMiwgZDQKLSAgICB2dHJuLjMyICAgICAgICAgZDMsIGQ1Ci0gICAgdnRybi4xNiAgICAgICAgIGQyLCBkMwotICAgIHZ0cm4uMTYgICAgICAgICBkNCwgZDUKLQotICAgIHZhZGQuczE2ICAgICAgICBkNiwgZDIsIGQ1ICAgICAgICAgICAgICA7YTEgPSBpcFswXStpcFsxMl0KLSAgICB2YWRkLnMxNiAgICAgICAgZDcsIGQzLCBkNCAgICAgICAgICAgICAgO2IxID0gaXBbNF0raXBbOF0KLSAgICB2c3ViLnMxNiAgICAgICAgZDgsIGQzLCBkNCAgICAgICAgICAgICAgO2MxID0gaXBbNF0taXBbOF0KLSAgICB2c3ViLnMxNiAgICAgICAgZDksIGQyLCBkNSAgICAgICAgICAgICAgO2QxID0gaXBbMF0taXBbMTJdCi0KLSAgICB2YWRkLnMxNiAgICAgICAgZDEwLCBkNiwgZDcgICAgICAgICAgICAgO3RlbXAxID0gYTEgKyBiMQotICAgIHZzdWIuczE2ICAgICAgICBkMTEsIGQ2LCBkNyAgICAgICAgICAgICA7dGVtcDIgPSBhMSAtIGIxCi0KLQotICAgIHZxZG11bGguczE2ICAgICBxNiwgcTUsIGQwWzFdCi0gICAgdnFkbXVsaC5zMTYgICAgIHE4LCBxNCwgZDBbMF0KLSAgICB2cWRtdWxoLnMxNiAgICAgcTcsIHE0LCBkMFsyXQotCi0gICAgdnNoci5zMTYgICAgICAgIHE2LCBxNiwgIzEKLSAgICB2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxNywgcTcsICMxICAgICAgICAgICAgICA7ZDE0OnRlbXAxID0gKCBjMSAqIHhfYzMpPj4xNjsgIGQxNTp0ZW1wMSA9ICAoZDEgKiB4X2MzKT4+MTYKLSAgICB2YWRkLnMxNiAgICAgICAgcTgsIHE0LCBxOCAgICAgICAgICAgICAgO2QxNjp0ZW1wMiA9ICgoYzEgKiB4X2MxKT4+MTYpICsgYzE7ICBkMTc6dGVtcDIgPSAoKGQxICogeF9jMSk+PjE2KSArIGQxCi0KLSAgICB2YWRkLnMxNiAgICAgICAgZDIsIGQxMCwgZDEyICAgICAgICAgICAgO2EyID0gKCh0ZW1wMSAqIHhfYzIgKT4+MTYpICsgdGVtcDEKLSAgICB2YWRkLnMxNiAgICAgICAgZDQsIGQxMSwgZDEzICAgICAgICAgICAgO2MyID0gKCh0ZW1wMiAqIHhfYzIgKT4+MTYpICsgdGVtcDIKLSAgICB2YWRkLnMxNiAgICAgICAgZDMsIGQxNCwgZDE3ICAgICAgICAgICAgO2IyID0gdGVtcDEgKyB0ZW1wMiAgLS0gcSBpcyBub3QgbmVjZXNzYXJ5LCBqdXN0IGZvciBwcm90ZWN0aW9uCi0gICAgdnN1Yi5zMTYgICAgICAgIGQ1LCBkMTUsIGQxNiAgICAgICAgICAgIDtkMiA9IHRlbXAxIC0gdGVtcDIKLQotICAgIHZjbHQuczE2ICAgICAgICBxMywgcTEsICMwCi0gICAgdmNsdC5zMTYgICAgICAgIHE0LCBxMiwgIzAKLQotICAgIHZzdWIuczE2ICAgICAgICBxMSwgcTEsIHEzCi0gICAgdnN1Yi5zMTYgICAgICAgIHEyLCBxMiwgcTQKLQotICAgIHZzaHIuczE2ICAgICAgICBxMSwgcTEsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHEyLCBxMiwgIzEKLQotICAgIHZzdDEuMTYgICAgICAgICB7cTEsIHEyfSwgW3IxXQotCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotCi1mZmRjdF9jb2VmZgotOyA2MDU0NyA9ICAweEVDODMKLTsgNDYzNDEgPSAgMHhCNTA1Ci07IDI1MDgwID0gIDB4NjFGOAotICAgIERDRCAgICAgMHhCNTA1RUM4MywgMHgwMDAwNjFGOAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vbmVvbi9mYXN0ZmRjdDh4NF9uZW9uLmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9uZW9uL2Zhc3RmZGN0OHg0X25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTJjMGNkLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL2Zhc3RmZGN0OHg0X25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfZmFzdF9mZGN0OHg0X25lb258Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07dm9pZCB2cDhfZmFzdF9mZGN0NHg0X2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotO05PVEU6Ci07VGhlIGlucHV0ICpzcmNfZGlmZi4gc3JjX2RpZmYgaXMgY2FsY3VsYXRlZCBhczoKLTtkaWZmX3B0cltjXSA9IHNyY19wdHJbY10gLSBwcmVkX3B0cltjXTsgKGluIFN1YnRyYWN0KiBmdW5jdGlvbikKLTtJbiB3aGljaCAqc3JjX3B0ciBhbmQgKnByZWRfcHRyIGJvdGggYXJlIHVuc2lnbmVkIGNoYXIuCi07VGhlcmVmb3JlLCAqc3JjX2RpZmYgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiBbLTI1NSwgMjU1XS4KLTtDQVVUSU9OOgotO1RoZSBpbnB1dCB2YWx1ZXMgb2YgMjV0aCBibG9jayBhcmUgc2V0IGluIHZwOF9idWlsZF9kY2Jsb2NrIGZ1bmN0aW9uLCB3aGljaCBhcmUgb3V0IG9mIFstMjU1LCAyNTVdLgotO0J1dCwgVlA4IGVuY29kZXIgb25seSB1c2VzIHZwOF9zaG9ydF9mZGN0NHg0X2MgZm9yIDI1dGggYmxvY2ssIG5vdCB2cDhfZmFzdF9mZGN0NHg0X2MuIFRoYXQgbWFrZXMKLTtpdCBvayBmb3IgYXNzdW1pbmcgKmlucHV0IGluIFstMjU1LCAyNTVdIGluIHZwOF9mYXN0X2ZkY3Q0eDRfYywgYnV0IG5vdCBvayBpbiB2cDhfc2hvcnRfZmRjdDR4NF9jLgotCi18dnA4X2Zhc3RfZmRjdDh4NF9uZW9ufCBQUk9DCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMX0sIFtyMF0sIHIyICAgICAgICAgICAgICA7bG9hZCBpbnB1dAotICAgIGFkciAgICAgICAgICAgICByMTIsIGZmZGN0OF9jb2VmZgotICAgIHZsZDEuMTYgICAgICAgICB7cTJ9LCBbcjBdLCByMgotICAgIHZsZDEuMTYgICAgICAgICB7cTN9LCBbcjBdLCByMgotICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyXQotICAgIHZsZDEuMTYgICAgICAgICB7cTR9LCBbcjBdLCByMgotCi0gICAgO0ZpcnN0IGZvci1sb29wCi0gICAgO3RyYW5zcG9zZSBkMiwgZDQsIGQ2LCBkOC4gVGhlbiwgZDI9aXBbMF0sIGQ0PWlwWzFdLCBkNj1pcFsyXSwgZDg9aXBbM10KLSAgICA7dHJhbnNwb3NlIGQzLCBkNSwgZDcsIGQ5LiBUaGVuLCBkMz1pcFswXSwgZDU9aXBbMV0sIGQ3PWlwWzJdLCBkOT1pcFszXQotICAgIHZ0cm4uMzIgICAgICAgICBkMiwgZDYKLSAgICB2dHJuLjMyICAgICAgICAgZDMsIGQ3Ci0gICAgdnRybi4zMiAgICAgICAgIGQ0LCBkOAotICAgIHZ0cm4uMzIgICAgICAgICBkNSwgZDkKLSAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQ0Ci0gICAgdnRybi4xNiAgICAgICAgIGQzLCBkNQotICAgIHZ0cm4uMTYgICAgICAgICBkNiwgZDgKLSAgICB2dHJuLjE2ICAgICAgICAgZDcsIGQ5Ci0KLSAgICB2YWRkLnMxNiAgICAgICAgZDEwLCBkMiwgZDggICAgICAgICAgICAgO2lwWzBdK2lwWzNdCi0gICAgdmFkZC5zMTYgICAgICAgIGQxMSwgZDQsIGQ2ICAgICAgICAgICAgIDtpcFsxXStpcFsyXQotICAgIHZzdWIuczE2ICAgICAgICBkMTIsIGQ0LCBkNiAgICAgICAgICAgICA7aXBbMV0taXBbMl0KLSAgICB2c3ViLnMxNiAgICAgICAgZDEzLCBkMiwgZDggICAgICAgICAgICAgO2lwWzBdLWlwWzNdCi0gICAgdmFkZC5zMTYgICAgICAgIGQyMiwgZDMsIGQ5Ci0gICAgdmFkZC5zMTYgICAgICAgIGQyMywgZDUsIGQ3Ci0gICAgdnN1Yi5zMTYgICAgICAgIGQyNCwgZDUsIGQ3Ci0gICAgdnN1Yi5zMTYgICAgICAgIGQyNSwgZDMsIGQ5Ci0KLSAgICB2c2hsLmkxNiAgICAgICAgcTUsIHE1LCAjMSAgICAgICAgICAgICAgOyBhMSwgYjEKLSAgICB2c2hsLmkxNiAgICAgICAgcTYsIHE2LCAjMSAgICAgICAgICAgICAgOyBjMSwgZDEKLSAgICB2c2hsLmkxNiAgICAgICAgcTEsIHExMSwgIzEKLSAgICB2c2hsLmkxNiAgICAgICAgcTIsIHExMiwgIzEKLQotICAgIHZhZGQuczE2ICAgICAgICBkMTQsIGQxMCwgZDExICAgICAgICAgICA7dGVtcDEgPSBhMSArIGIxCi0gICAgdnN1Yi5zMTYgICAgICAgIGQxNSwgZDEwLCBkMTEgICAgICAgICAgIDt0ZW1wMiA9IGExIC0gYjEKLSAgICB2YWRkLnMxNiAgICAgICAgZDI0LCBkMiwgZDMKLSAgICB2c3ViLnMxNiAgICAgICAgZDI1LCBkMiwgZDMKLQotICAgIHZxZG11bGguczE2ICAgICBxOCwgcTcsIGQwWzFdCi0gICAgdnFkbXVsaC5zMTYgICAgIHExMywgcTEyLCBkMFsxXQotICAgIHZxZG11bGguczE2ICAgICBxMTAsIHE2LCBkMFswXQotICAgIHZxZG11bGguczE2ICAgICBxMTUsIHEyLCBkMFswXQotICAgIHZxZG11bGguczE2ICAgICBxOSwgcTYsIGQwWzJdCi0gICAgdnFkbXVsaC5zMTYgICAgIHExNCwgcTIsIGQwWzJdCi0KLSAgICB2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxMTMsIHExMywgIzEKLSAgICB2c2hyLnMxNiAgICAgICAgcTEwLCBxMTAsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHExNSwgcTE1LCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxOSwgcTksICMxICAgICAgICAgICAgICA7ZDE4OnRlbXAxID0gKCBjMSAqIHhfYzMpPj4xNjsgIGQxOTp0ZW1wMSA9ICAoZDEgKiB4X2MzKT4+MTYKLSAgICB2c2hyLnMxNiAgICAgICAgcTE0LCBxMTQsICMxICAgICAgICAgICAgO2QyODp0ZW1wMSA9ICggYzEgKiB4X2MzKT4+MTY7ICBkMjk6dGVtcDEgPSAgKGQxICogeF9jMyk+PjE2Ci0gICAgdmFkZC5zMTYgICAgICAgIHExMCwgcTYsIHExMCAgICAgICAgICAgIDtkMjA6dGVtcDIgPSAoKGMxICogeF9jMSk+PjE2KSArIGMxOyAgZDIxOnRlbXAyID0gKChkMSAqIHhfYzEpPj4xNikgKyBkMQotICAgIHZhZGQuczE2ICAgICAgICBxMTUsIHEyLCBxMTUgICAgICAgICAgICA7ZDMwOnRlbXAyID0gKChjMSAqIHhfYzEpPj4xNikgKyBjMTsgIGQzMTp0ZW1wMiA9ICgoZDEgKiB4X2MxKT4+MTYpICsgZDEKLQotICAgIHZhZGQuczE2ICAgICAgICBkMiwgZDE0LCBkMTYgICAgICAgICAgICA7b3BbMF0gPSAoKHRlbXAxICogeF9jMiApPj4xNikgKyB0ZW1wMQotICAgIHZhZGQuczE2ICAgICAgICBkMywgZDI0LCBkMjYgICAgICAgICAgICA7b3BbMF0gPSAoKHRlbXAxICogeF9jMiApPj4xNikgKyB0ZW1wMQotICAgIHZhZGQuczE2ICAgICAgICBkNiwgZDE1LCBkMTcgICAgICAgICAgICA7b3BbMl0gPSAoKHRlbXAyICogeF9jMiApPj4xNikgKyB0ZW1wMgotICAgIHZhZGQuczE2ICAgICAgICBkNywgZDI1LCBkMjcgICAgICAgICAgICA7b3BbMl0gPSAoKHRlbXAyICogeF9jMiApPj4xNikgKyB0ZW1wMgotICAgIHZhZGQuczE2ICAgICAgICBkNCwgZDE4LCBkMjEgICAgICAgICAgICA7b3BbMV0gPSB0ZW1wMSArIHRlbXAyICAtLSBxIGlzIG5vdCBuZWNlc3NhcnksIGp1c3QgZm9yIHByb3RlY3Rpb24KLSAgICB2YWRkLnMxNiAgICAgICAgZDUsIGQyOCwgZDMxICAgICAgICAgICAgO29wWzFdID0gdGVtcDEgKyB0ZW1wMiAgLS0gcSBpcyBub3QgbmVjZXNzYXJ5LCBqdXN0IGZvciBwcm90ZWN0aW9uCi0gICAgdnN1Yi5zMTYgICAgICAgIGQ4LCBkMTksIGQyMCAgICAgICAgICAgIDtvcFszXSA9IHRlbXAxIC0gdGVtcDIKLSAgICB2c3ViLnMxNiAgICAgICAgZDksIGQyOSwgZDMwICAgICAgICAgICAgO29wWzNdID0gdGVtcDEgLSB0ZW1wMgotCi0gICAgO1NlY29uZCBmb3ItbG9vcAotICAgIDt0cmFuc3Bvc2UgZDIsIGQ0LCBkNiwgZDguIFRoZW4sIGQyPWlwWzBdLCBkND1pcFs0XSwgZDY9aXBbOF0sIGQ4PWlwWzEyXQotICAgIDt0cmFuc3Bvc2UgZDMsIGQ1LCBkNywgZDkuIFRoZW4sIGQzPWlwWzBdLCBkNT1pcFs0XSwgZDc9aXBbOF0sIGQ5PWlwWzEyXQotICAgIHZ0cm4uMzIgICAgICAgICBkMiwgZDYKLSAgICB2dHJuLjMyICAgICAgICAgZDMsIGQ3Ci0gICAgdnRybi4zMiAgICAgICAgIGQ0LCBkOAotICAgIHZ0cm4uMzIgICAgICAgICBkNSwgZDkKLSAgICB2dHJuLjE2ICAgICAgICAgZDIsIGQ0Ci0gICAgdnRybi4xNiAgICAgICAgIGQzLCBkNQotICAgIHZ0cm4uMTYgICAgICAgICBkNiwgZDgKLSAgICB2dHJuLjE2ICAgICAgICAgZDcsIGQ5Ci0KLSAgICB2YWRkLnMxNiAgICAgICAgZDEwLCBkMiwgZDggICAgICAgICAgICAgO2ExID0gaXBbMF0raXBbMTJdCi0gICAgdmFkZC5zMTYgICAgICAgIGQxMSwgZDQsIGQ2ICAgICAgICAgICAgIDtiMSA9IGlwWzRdK2lwWzhdCi0gICAgdnN1Yi5zMTYgICAgICAgIGQxMiwgZDQsIGQ2ICAgICAgICAgICAgIDtjMSA9IGlwWzRdLWlwWzhdCi0gICAgdnN1Yi5zMTYgICAgICAgIGQxMywgZDIsIGQ4ICAgICAgICAgICAgIDtkMSA9IGlwWzBdLWlwWzEyXQotICAgIHZhZGQuczE2ICAgICAgICBkMiwgZDMsIGQ5Ci0gICAgdmFkZC5zMTYgICAgICAgIGQ0LCBkNSwgZDcKLSAgICB2c3ViLnMxNiAgICAgICAgZDI0LCBkNSwgZDcKLSAgICB2c3ViLnMxNiAgICAgICAgZDI1LCBkMywgZDkKLQotICAgIHZhZGQuczE2ICAgICAgICBkMTQsIGQxMCwgZDExICAgICAgICAgICA7dGVtcDEgPSBhMSArIGIxCi0gICAgdnN1Yi5zMTYgICAgICAgIGQxNSwgZDEwLCBkMTEgICAgICAgICAgIDt0ZW1wMiA9IGExIC0gYjEKLSAgICB2YWRkLnMxNiAgICAgICAgZDIyLCBkMiwgZDQKLSAgICB2c3ViLnMxNiAgICAgICAgZDIzLCBkMiwgZDQKLQotICAgIHZxZG11bGguczE2ICAgICBxOCwgcTcsIGQwWzFdCi0gICAgdnFkbXVsaC5zMTYgICAgIHExMywgcTExLCBkMFsxXQotICAgIHZxZG11bGguczE2ICAgICBxMTAsIHE2LCBkMFswXQotICAgIHZxZG11bGguczE2ICAgICBxMTUsIHExMiwgZDBbMF0KLSAgICB2cWRtdWxoLnMxNiAgICAgcTksIHE2LCBkMFsyXQotICAgIHZxZG11bGguczE2ICAgICBxMTQsIHExMiwgZDBbMl0KLQotICAgIHZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHExMywgcTEzLCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxMTAsIHExMCwgIzEKLSAgICB2c2hyLnMxNiAgICAgICAgcTE1LCBxMTUsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHE5LCBxOSwgIzEgICAgICAgICAgICAgIDtkMTg6dGVtcDEgPSAoIGMxICogeF9jMyk+PjE2OyAgZDE5OnRlbXAxID0gIChkMSAqIHhfYzMpPj4xNgotICAgIHZzaHIuczE2ICAgICAgICBxMTQsIHExNCwgIzEgICAgICAgICAgICA7ZDI4OnRlbXAxID0gKCBjMSAqIHhfYzMpPj4xNjsgIGQyOTp0ZW1wMSA9ICAoZDEgKiB4X2MzKT4+MTYKLSAgICB2YWRkLnMxNiAgICAgICAgcTEwLCBxNiwgcTEwICAgICAgICAgICAgO2QyMDp0ZW1wMiA9ICgoYzEgKiB4X2MxKT4+MTYpICsgYzE7ICBkMjE6dGVtcDIgPSAoKGQxICogeF9jMSk+PjE2KSArIGQxCi0gICAgdmFkZC5zMTYgICAgICAgIHExNSwgcTEyLCBxMTUgICAgICAgICAgIDtkMzA6dGVtcDIgPSAoKGMxICogeF9jMSk+PjE2KSArIGMxOyAgZDMxOnRlbXAyID0gKChkMSAqIHhfYzEpPj4xNikgKyBkMQotCi0gICAgdmFkZC5zMTYgICAgICAgIGQyLCBkMTQsIGQxNiAgICAgICAgICAgIDthMiA9ICgodGVtcDEgKiB4X2MyICk+PjE2KSArIHRlbXAxCi0gICAgdmFkZC5zMTYgICAgICAgIGQ2LCBkMjIsIGQyNiAgICAgICAgICAgIDthMiA9ICgodGVtcDEgKiB4X2MyICk+PjE2KSArIHRlbXAxCi0gICAgdmFkZC5zMTYgICAgICAgIGQ0LCBkMTUsIGQxNyAgICAgICAgICAgIDtjMiA9ICgodGVtcDIgKiB4X2MyICk+PjE2KSArIHRlbXAyCi0gICAgdmFkZC5zMTYgICAgICAgIGQ4LCBkMjMsIGQyNyAgICAgICAgICAgIDtjMiA9ICgodGVtcDIgKiB4X2MyICk+PjE2KSArIHRlbXAyCi0gICAgdmFkZC5zMTYgICAgICAgIGQzLCBkMTgsIGQyMSAgICAgICAgICAgIDtiMiA9IHRlbXAxICsgdGVtcDIgIC0tIHEgaXMgbm90IG5lY2Vzc2FyeSwganVzdCBmb3IgcHJvdGVjdGlvbgotICAgIHZhZGQuczE2ICAgICAgICBkNywgZDI4LCBkMzEgICAgICAgICAgICA7YjIgPSB0ZW1wMSArIHRlbXAyICAtLSBxIGlzIG5vdCBuZWNlc3NhcnksIGp1c3QgZm9yIHByb3RlY3Rpb24KLSAgICB2c3ViLnMxNiAgICAgICAgZDUsIGQxOSwgZDIwICAgICAgICAgICAgO2QyID0gdGVtcDEgLSB0ZW1wMgotICAgIHZzdWIuczE2ICAgICAgICBkOSwgZDI5LCBkMzAgICAgICAgICAgICA7ZDIgPSB0ZW1wMSAtIHRlbXAyCi0KLSAgICB2Y2x0LnMxNiAgICAgICAgcTUsIHExLCAjMAotICAgIHZjbHQuczE2ICAgICAgICBxNiwgcTIsICMwCi0gICAgdmNsdC5zMTYgICAgICAgIHE3LCBxMywgIzAKLSAgICB2Y2x0LnMxNiAgICAgICAgcTgsIHE0LCAjMAotCi0gICAgdnN1Yi5zMTYgICAgICAgIHExLCBxMSwgcTUKLSAgICB2c3ViLnMxNiAgICAgICAgcTIsIHEyLCBxNgotICAgIHZzdWIuczE2ICAgICAgICBxMywgcTMsIHE3Ci0gICAgdnN1Yi5zMTYgICAgICAgIHE0LCBxNCwgcTgKLQotICAgIHZzaHIuczE2ICAgICAgICBxMSwgcTEsICMxCi0gICAgdnNoci5zMTYgICAgICAgIHEyLCBxMiwgIzEKLSAgICB2c2hyLnMxNiAgICAgICAgcTMsIHEzLCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxNCwgcTQsICMxCi0KLSAgICB2c3QxLjE2ICAgICAgICAge3ExLCBxMn0sIFtyMV0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMywgcTR9LCBbcjFdCi0KLSAgICBieCAgICAgICAgICAgICAgbHIKLQotICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tCi0KLWZmZGN0OF9jb2VmZgotOyA2MDU0NyA9ICAweEVDODMKLTsgNDYzNDEgPSAgMHhCNTA1Ci07IDI1MDgwID0gIDB4NjFGOAotICAgIERDRCAgICAgMHhCNTA1RUM4MywgMHgwMDAwNjFGOAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vbmVvbi9mYXN0cXVhbnRpemViX25lb24uYXNtIGIvdnA4L2VuY29kZXIvYXJtL25lb24vZmFzdHF1YW50aXplYl9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExZWE5Yy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vbmVvbi9mYXN0cXVhbnRpemViX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfZmFzdF9xdWFudGl6ZV9iX25lb25fZnVuY3wKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyByMCAgICAgICAgc2hvcnQgKmNvZWZmX3B0cgotOyByMSAgICAgICAgc2hvcnQgKnpiaW5fcHRyCi07IHIyICAgICAgICBzaG9ydCAqcWNvZWZmX3B0cgotOyByMyAgICAgICAgc2hvcnQgKmRxY29lZmZfcHRyCi07IHN0YWNrICAgICBzaG9ydCAqZGVxdWFudF9wdHIKLTsgc3RhY2sgICAgIHNob3J0ICpzY2FuX21hc2sKLTsgc3RhY2sgICAgIHNob3J0ICpyb3VuZF9wdHIKLTsgc3RhY2sgICAgIHNob3J0ICpxdWFudF9wdHIKLQotOyByZXR1cm4gICAgaW50ICogZW9iCi18dnA4X2Zhc3RfcXVhbnRpemVfYl9uZW9uX2Z1bmN8IFBST0MKLSAgICB2bGQxLjE2ICAgICAgICAge3EwLCBxMX0sIFtyMF0gICAgICAgICAgICAgIDtsb2FkIHoKLSAgICB2bGQxLjE2ICAgICAgICAge3ExMCwgcTExfSwgW3IxXSAgICAgICAgICAgIDtsb2FkIHpiaW4KLQotICAgIHZhYnMuczE2ICAgICAgICBxNCwgcTAgICAgICAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSB4ID0gYWJzKHopCi0gICAgdmFicy5zMTYgICAgICAgIHE1LCBxMQotCi0gICAgdmNnZS5zMTYgICAgICAgIHExMCwgcTQsIHExMCAgICAgICAgICAgICAgICA7eD49emJpbgotICAgIHZjZ2UuczE2ICAgICAgICBxMTEsIHE1LCBxMTEKLQotICAgIDtpZiB4PHpiaW4gKHExMCAmIHExMSBhcmUgYWxsIDApLCBnbyB0byB6ZXJvX291dHB1dAotICAgIHZvcnIuczE2ICAgICAgICBxNiwgcTEwLCBxMTEKLSAgICB2b3JyLnMxNiAgICAgICAgZDEyLCBkMTIsIGQxMwotICAgIHZtb3YgICAgICAgICAgICByMCwgcjEsIGQxMgotICAgIG9yciAgICAgICAgICAgICByMCwgcjAsIHIxCi0gICAgY21wICAgICAgICAgICAgIHIwLCAjMAotICAgIGJlcSAgICAgICAgICAgICB6ZXJvX291dHB1dAotCi0gICAgbGRyICAgICAgICAgICAgIHIwLCBbc3AsICM4XSAgICAgICAgICAgICAgICA7bG9hZCByb3VuZF9wdHIKLSAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMxMl0gICAgICAgICAgICAgIDtsb2FkIHF1YW50X3B0cgotCi0gICAgO3JpZ2h0IHNoaWZ0IDE1IHRvIGdldCBzaWduLCBhbGwgMCBpZiBpdCBpcyBwb3NpdGl2ZSwgYWxsIDEgaWYgaXQgaXMgbmVnYXRpdmUKLSAgICB2c2hyLnMxNiAgICAgICAgcTIsIHEwLCAjMTUgICAgICAgICAgICAgICAgIDsgc3oKLSAgICB2c2hyLnMxNiAgICAgICAgcTMsIHExLCAjMTUKLQotICAgIHZsZDEuczE2ICAgICAgICB7cTYsIHE3fSwgW3IwXSAgICAgICAgICAgICAgO2xvYWQgcm91bmRfcHRyIFswLTE1XQotICAgIHZsZDEuczE2ICAgICAgICB7cTgsIHE5fSwgW3IxMl0gICAgICAgICAgICAgO2xvYWQgcXVhbnRfcHRyIFswLTE1XQotCi0gICAgdmFkZC5zMTYgICAgICAgIHE0LCBxNiAgICAgICAgICAgICAgICAgICAgICA7eCArIFJvdW5kCi0gICAgdmFkZC5zMTYgICAgICAgIHE1LCBxNwotCi0gICAgbGRyICAgICAgICAgICAgIHIwLCBbc3AsICM0XSAgICAgICAgICAgICAgICA7bG9hZCBydnNwbHVzMV9zY2FuX29yZGVyIHB0cgotCi0gICAgdnFkbXVsaC5zMTYgICAgIHE0LCBxOCAgICAgICAgICAgICAgICAgICAgICA7eSA9ICgoUm91bmQgKyBhYnMoeikpICogUXVhbnQpID4+IDE2Ci0gICAgdnFkbXVsaC5zMTYgICAgIHE1LCBxOQotCi0gICAgdmxkMS4xNiAgICAgICAgIHtxMCwgcTF9LCBbcjBdICAgICAgICAgICAgICA7bG9hZCBydnNwbHVzMV9zY2FuX29yZGVyCi0gICAgdmNlcS5zMTYgICAgICAgIHE4LCBxOCAgICAgICAgICAgICAgICAgICAgICA7c2V0IHE4IHRvIGFsbCAxCi0KLSAgICB2c2hyLnMxNiAgICAgICAgcTQsICMxICAgICAgICAgICAgICAgICAgICAgIDtyaWdodCBzaGlmdCAxIGFmdGVyIHZxZG11bGgKLSAgICB2c2hyLnMxNiAgICAgICAgcTUsICMxCi0KLSAgICA7bW9kaWZ5IGRhdGEgdG8gaGF2ZSBpdHMgb3JpZ2luYWwgc2lnbgotICAgIHZlb3IuczE2ICAgICAgICBxNCwgcTIgICAgICAgICAgICAgICAgICAgICAgOyB5XnN6Ci0gICAgdmVvci5zMTYgICAgICAgIHE1LCBxMwotCi0gICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgICAgICA7bG9hZCBkZXF1YW50X3B0cgotCi0gICAgdnN1Yi5zMTYgICAgICAgIHE0LCBxMiAgICAgICAgICAgICAgICAgICAgICA7IHgxID0gKHlec3opIC0gc3ogPSAoeV5zeikgLSAoLTEpICh0d28ncyBjb21wbGVtZW50KQotICAgIHZzdWIuczE2ICAgICAgICBxNSwgcTMKLQotICAgIHZhbmQuczE2ICAgICAgICBxNCwgcTEwICAgICAgICAgICAgICAgICAgICAgO21hc2sgb2ZmIHgxIGVsZW1lbnRzCi0gICAgdmFuZC5zMTYgICAgICAgIHE1LCBxMTEKLQotICAgIHZsZDEuczE2ICAgICAgICB7cTYsIHE3fSwgW3IxMl0gICAgICAgICAgICAgO2xvYWQgZGVxdWFudF9wdHJbaV0KLQotICAgIHZ0c3QuMTYgICAgICAgICBxMTQsIHE0LCBxOCAgICAgICAgICAgICAgICAgO25vdyBmaW5kIGVvYgotICAgIHZ0c3QuMTYgICAgICAgICBxMTUsIHE1LCBxOCAgICAgICAgICAgICAgICAgO25vbi16ZXJvIGVsZW1lbnQgaXMgc2V0IHRvIGFsbCAxIGluIHE0LCBxNQotCi0gICAgdnN0MS5zMTYgICAgICAgIHtxNCwgcTV9LCBbcjJdICAgICAgICAgICAgICA7c3RvcmU6IHFjb2VmZiA9IHgxCi0KLSAgICB2YW5kICAgICAgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgICAgIDtnZXQgYWxsIHZhbGlkIG51bWJlciBmcm9tIHJ2c3BsdXMxX3NjYW5fb3JkZXIgYXJyYXkKLSAgICB2YW5kICAgICAgICAgICAgcTEsIHExLCBxMTUKLQotICAgIHZtYXgudTE2ICAgICAgICBxMCwgcTAsIHExICAgICAgICAgICAgICAgICAgO2ZpbmQgbWF4aW11bSB2YWx1ZSBpbiBxMCwgcTEKLSAgICB2bWF4LnUxNiAgICAgICAgZDAsIGQwLCBkMQotICAgIHZtb3ZsLnUxNiAgICAgICBxMCwgZDAKLQotICAgIHZtdWwuczE2ICAgICAgICBxNiwgcTQgICAgICAgICAgICAgICAgICAgICAgO3ggKiBEZXF1YW50Ci0gICAgdm11bC5zMTYgICAgICAgIHE3LCBxNQotCi0gICAgdm1heC51MzIgICAgICAgIGQwLCBkMCwgZDEKLSAgICB2cG1heC51MzIgICAgICAgZDAsIGQwLCBkMAotCi0gICAgdnN0MS5zMTYgICAgICAgIHtxNiwgcTd9LCBbcjNdICAgICAgICAgICAgICA7c3RvcmUgZHFjb2VmZiA9IHggKiBEZXF1YW50Ci0KLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLXplcm9fb3V0cHV0Ci0gICAgdnN0MS5zMTYgICAgICAgIHtxMTAsIHExMX0sIFtyMl0gICAgICAgIDsgcWNvZWZmID0gMAotICAgIHZzdDEuczE2ICAgICAgICB7cTEwLCBxMTF9LCBbcjNdICAgICAgICA7IGRxY29lZmYgPSAwCi0gICAgbW92ICAgICAgICAgICAgIHIwLCAjMAotCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uLmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3ZjM2Mi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vbmVvbi9zaG9ydGZkY3RfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9zaG9ydF9mZGN0NHg0X25lb258Ci0gICAgRVhQT1JUICB8dnA4X3Nob3J0X2ZkY3Q4eDRfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOyByMCAgICBzaG9ydCAqaW5wdXQKLTsgcjEgICAgc2hvcnQgKm91dHB1dAotOyByMiAgICBpbnQgcGl0Y2gKLTsgSW5wdXQgaGFzIGEgcGl0Y2gsIG91dHB1dCBpcyBjb250aWd1b3VzCi18dnA4X3Nob3J0X2ZkY3Q0eDRfbmVvbnwgUFJPQwotICAgIGxkciAgICAgICAgICAgICByMTIsIF9kY3RfbWF0cml4XwotICAgIHZsZDEuMTYgICAgICAgICBkMCwgW3IwXSwgcjIKLSAgICB2bGQxLjE2ICAgICAgICAgZDEsIFtyMF0sIHIyCi0gICAgdmxkMS4xNiAgICAgICAgIGQyLCBbcjBdLCByMgotICAgIHZsZDEuMTYgICAgICAgICBkMywgW3IwXQotICAgIHZsZDEuMTYgICAgICAgICB7cTIsIHEzfSwgW3IxMl0KLQotO2ZpcnN0IHN0YWdlCi0gICAgdm11bGwuczE2ICAgICAgIHExMSwgZDQsIGQwWzBdICAgICAgICAgICAgICA7aT0wCi0gICAgdm11bGwuczE2ICAgICAgIHExMiwgZDQsIGQxWzBdICAgICAgICAgICAgICA7aT0xCi0gICAgdm11bGwuczE2ICAgICAgIHExMywgZDQsIGQyWzBdICAgICAgICAgICAgICA7aT0yCi0gICAgdm11bGwuczE2ICAgICAgIHExNCwgZDQsIGQzWzBdICAgICAgICAgICAgICA7aT0zCi0KLSAgICB2bWxhbC5zMTYgICAgICAgcTExLCBkNSwgZDBbMV0KLSAgICB2bWxhbC5zMTYgICAgICAgcTEyLCBkNSwgZDFbMV0KLSAgICB2bWxhbC5zMTYgICAgICAgcTEzLCBkNSwgZDJbMV0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkNSwgZDNbMV0KLQotICAgIHZtbGFsLnMxNiAgICAgICBxMTEsIGQ2LCBkMFsyXQotICAgIHZtbGFsLnMxNiAgICAgICBxMTIsIGQ2LCBkMVsyXQotICAgIHZtbGFsLnMxNiAgICAgICBxMTMsIGQ2LCBkMlsyXQotICAgIHZtbGFsLnMxNiAgICAgICBxMTQsIGQ2LCBkM1syXQotCi0gICAgdm1sYWwuczE2ICAgICAgIHExMSwgZDcsIGQwWzNdICAgICAgICAgICAgICA7c3VtdGVtcCBmb3IgaT0wCi0gICAgdm1sYWwuczE2ICAgICAgIHExMiwgZDcsIGQxWzNdICAgICAgICAgICAgICA7c3VtdGVtcCBmb3IgaT0xCi0gICAgdm1sYWwuczE2ICAgICAgIHExMywgZDcsIGQyWzNdICAgICAgICAgICAgICA7c3VtdGVtcCBmb3IgaT0yCi0gICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDcsIGQzWzNdICAgICAgICAgICAgICA7c3VtdGVtcCBmb3IgaT0zCi0KLSAgICA7IHJvdW5kaW5nCi0gICAgdnJzaHJuLmkzMiAgICAgIGQyMiwgcTExLCAjMTQKLSAgICB2cnNocm4uaTMyICAgICAgZDI0LCBxMTIsICMxNAotICAgIHZyc2hybi5pMzIgICAgICBkMjYsIHExMywgIzE0Ci0gICAgdnJzaHJuLmkzMiAgICAgIGQyOCwgcTE0LCAjMTQKLQotO3NlY29uZCBzdGFnZQotICAgIHZtdWxsLnMxNiAgICAgICBxNCwgZDIyLCBkNFswXSAgICAgICAgICAgICAgO2k9MAotICAgIHZtdWxsLnMxNiAgICAgICBxNSwgZDIyLCBkNFsxXSAgICAgICAgICAgICAgO2k9MQotICAgIHZtdWxsLnMxNiAgICAgICBxNiwgZDIyLCBkNFsyXSAgICAgICAgICAgICAgO2k9MgotICAgIHZtdWxsLnMxNiAgICAgICBxNywgZDIyLCBkNFszXSAgICAgICAgICAgICAgO2k9MwotCi0gICAgdm1sYWwuczE2ICAgICAgIHE0LCBkMjQsIGQ1WzBdCi0gICAgdm1sYWwuczE2ICAgICAgIHE1LCBkMjQsIGQ1WzFdCi0gICAgdm1sYWwuczE2ICAgICAgIHE2LCBkMjQsIGQ1WzJdCi0gICAgdm1sYWwuczE2ICAgICAgIHE3LCBkMjQsIGQ1WzNdCi0KLSAgICB2bWxhbC5zMTYgICAgICAgcTQsIGQyNiwgZDZbMF0KLSAgICB2bWxhbC5zMTYgICAgICAgcTUsIGQyNiwgZDZbMV0KLSAgICB2bWxhbC5zMTYgICAgICAgcTYsIGQyNiwgZDZbMl0KLSAgICB2bWxhbC5zMTYgICAgICAgcTcsIGQyNiwgZDZbM10KLQotICAgIHZtbGFsLnMxNiAgICAgICBxNCwgZDI4LCBkN1swXSAgICAgICAgICAgICAgO3N1bXRlbXAgZm9yIGk9MAotICAgIHZtbGFsLnMxNiAgICAgICBxNSwgZDI4LCBkN1sxXSAgICAgICAgICAgICAgO3N1bXRlbXAgZm9yIGk9MQotICAgIHZtbGFsLnMxNiAgICAgICBxNiwgZDI4LCBkN1syXSAgICAgICAgICAgICAgO3N1bXRlbXAgZm9yIGk9MgotICAgIHZtbGFsLnMxNiAgICAgICBxNywgZDI4LCBkN1szXSAgICAgICAgICAgICAgO3N1bXRlbXAgZm9yIGk9MwotCi0gICAgdnJzaHIuczMyICAgICAgIHEwLCBxNCwgIzE2Ci0gICAgdnJzaHIuczMyICAgICAgIHExLCBxNSwgIzE2Ci0gICAgdnJzaHIuczMyICAgICAgIHEyLCBxNiwgIzE2Ci0gICAgdnJzaHIuczMyICAgICAgIHEzLCBxNywgIzE2Ci0KLSAgICB2bW92bi5pMzIgICAgICAgZDAsIHEwCi0gICAgdm1vdm4uaTMyICAgICAgIGQxLCBxMQotICAgIHZtb3ZuLmkzMiAgICAgICBkMiwgcTIKLSAgICB2bW92bi5pMzIgICAgICAgZDMsIHEzCi0KLSAgICB2c3QxLjE2ICAgICAgICAge3EwLCBxMX0sIFtyMV0KLQotICAgIGJ4ICAgICAgICAgICAgICBscgotCi0gICAgRU5EUAotCi07IHIwICAgIHNob3J0ICppbnB1dAotOyByMSAgICBzaG9ydCAqb3V0cHV0Ci07IHIyICAgIGludCBwaXRjaAotfHZwOF9zaG9ydF9mZGN0OHg0X25lb258IFBST0MKLSAgICA7IFN0b3JlIGxpbmsgcmVnaXN0ZXIgYW5kIGlucHV0IGJlZm9yZSBjYWxsaW5nCi0gICAgOyAgZmlyc3QgNHg0IGZkY3QuICBEbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dAotICAgIDsgIG91dHB1dCBvciBwaXRjaCBiZWNhdXNlIHRob3NlIHBvaW50ZXJzIGFyZSBub3QKLSAgICA7ICB0b3VjaGVkIGluIHRoZSA0eDQgZmRjdCBmdW5jdGlvbgotICAgIHN0bWRiICAgICAgICAgICBzcCEsIHtyMCwgbHJ9Ci0KLSAgICBibCAgICAgICAgICAgICAgdnA4X3Nob3J0X2ZkY3Q0eDRfbmVvbgotCi0gICAgbGRtaWEgICAgICAgICAgIHNwISwge3IwLCBscn0KLQotICAgIDsgTW92ZSB0byB0aGUgbmV4dCBibG9jayBvZiBkYXRhLgotICAgIGFkZCAgICAgICAgICAgICByMCwgcjAsICM4Ci0gICAgYWRkICAgICAgICAgICAgIHIxLCByMSwgIzMyCi0KLSAgICA7IFNlY29uZCB0aW1lIHRocm91Z2ggZG8gbm90IHN0b3JlIG9mZiB0aGUKLSAgICA7ICBsaW5rIHJlZ2lzdGVyLCBqdXN0IHJldHVybiBmcm9tIHRoZSA0eDQgZmR0YwotICAgIGIgICAgICAgICAgICAgICB2cDhfc2hvcnRfZmRjdDR4NF9uZW9uCi0KLSAgICA7IFNob3VsZCBuZXZlciBnZXQgdG8gdGhpcy4KLSAgICBieCAgICAgICAgICAgICAgbHIKLQotICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tCi0KLV9kY3RfbWF0cml4XwotICAgIERDRCAgICAgZGN0X21hdHJpeAotZGN0X21hdHJpeAotOyAgIERDVyAgICAgMjMxNzAsICAzMDI3NCwgIDIzMTcwLCAxMjU0MAotOyAgIERDVyAgICAgMjMxNzAsICAxMjU0MCwgLTIzMTcwLC0zMDI3NAotOyAgIERDVyAgICAgMjMxNzAsIC0xMjU0MCwgLTIzMTcwLCAzMDI3NAotOyAgIERDVyAgICAgMjMxNzAsIC0zMDI3NCwgIDIzMTcwLC0xMjU0MAotOyAyMzE3MCA9ICAweDVhODIKLTsgLTIzMTcwID0gIDB4YTU3ZQotOyAzMDI3NCA9ICAweDc2NDIKLTsgLTMwMjc0ID0gIDB4ODliZQotOyAxMjU0MCA9ICAweDMwZmMKLTsgLTEyNTQwID0gMHhjZjA0Ci0gICAgRENEICAgICAweDc2NDI1YTgyLCAweDMwZmM1YTgyCi0gICAgRENEICAgICAweDMwZmM1YTgyLCAweDg5YmVhNTdlCi0gICAgRENEICAgICAweGNmMDQ1YTgyLCAweDc2NDJhNTdlCi0gICAgRENEICAgICAweDg5YmU1YTgyLCAweGNmMDQ1YTgyCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3N1YnRyYWN0X25lb24uYXNtIGIvdnA4L2VuY29kZXIvYXJtL25lb24vc3VidHJhY3RfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzI5NTAuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL25lb24vc3VidHJhY3RfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLSAgICBFWFBPUlQgfHZwOF9zdWJ0cmFjdF9iX25lb258Ci0gICAgRVhQT1JUIHx2cDhfc3VidHJhY3RfbWJ5X25lb258Ci0gICAgRVhQT1JUIHx2cDhfc3VidHJhY3RfbWJ1dl9uZW9ufAotCi0gICAgSU5DTFVERSBhc21fZW5jX29mZnNldHMuYXNtCi0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTt2b2lkIHZwOF9zdWJ0cmFjdF9iX25lb24oQkxPQ0sgKmJlLCBCTE9DS0QgKmJkLCBpbnQgcGl0Y2gpCi18dnA4X3N1YnRyYWN0X2JfbmVvbnwgUFJPQwotCi0gICAgc3RtZmQgICBzcCEsIHtyNC1yN30KLQotICAgIGxkciAgICAgcjMsIFtyMCwgI3ZwOF9ibG9ja19iYXNlX3NyY10KLSAgICBsZHIgICAgIHI0LCBbcjAsICN2cDhfYmxvY2tfc3JjXQotICAgIGxkciAgICAgcjUsIFtyMCwgI3ZwOF9ibG9ja19zcmNfZGlmZl0KLSAgICBsZHIgICAgIHIzLCBbcjNdCi0gICAgbGRyICAgICByNiwgW3IwLCAjdnA4X2Jsb2NrX3NyY19zdHJpZGVdCi0gICAgYWRkICAgICByMywgcjMsIHI0ICAgICAgICAgICAgICAgICAgICAgIDsgc3JjID0gKmJhc2Vfc3JjICsgc3JjCi0gICAgbGRyICAgICByNywgW3IxLCAjdnA4X2Jsb2NrZF9wcmVkaWN0b3JdCi0KLSAgICB2bGQxLjggICAgICAgICAge2QwfSwgW3IzXSwgcjYgICAgICAgICAgO2xvYWQgc3JjCi0gICAgdmxkMS44ICAgICAgICAgIHtkMX0sIFtyN10sIHIyICAgICAgICAgIDtsb2FkIHByZWQKLSAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IzXSwgcjYKLSAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3I3XSwgcjIKLSAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IzXSwgcjYKLSAgICB2bGQxLjggICAgICAgICAge2Q1fSwgW3I3XSwgcjIKLSAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IzXSwgcjYKLSAgICB2bGQxLjggICAgICAgICAge2Q3fSwgW3I3XSwgcjIKLQotICAgIHZzdWJsLnU4ICAgICAgICBxMTAsIGQwLCBkMQotICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQyLCBkMwotICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQ0LCBkNQotICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQ2LCBkNwotCi0gICAgbW92ICAgICAgICAgICAgIHIyLCByMiwgbHNsICMxCi0KLSAgICB2c3QxLjE2ICAgICAgICAge2QyMH0sIFtyNV0sIHIyICAgICAgICAgO3N0b3JlIGRpZmYKLSAgICB2c3QxLjE2ICAgICAgICAge2QyMn0sIFtyNV0sIHIyCi0gICAgdnN0MS4xNiAgICAgICAgIHtkMjR9LCBbcjVdLCByMgotICAgIHZzdDEuMTYgICAgICAgICB7ZDI2fSwgW3I1XSwgcjIKLQotICAgIGxkbWZkICAgc3AhLCB7cjQtcjd9Ci0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotO3ZvaWQgdnA4X3N1YnRyYWN0X21ieV9uZW9uKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpCi18dnA4X3N1YnRyYWN0X21ieV9uZW9ufCBQUk9DCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQKLQotc3VidHJhY3RfbWJ5X2xvb3AKLSAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IxXSwgcjMgICAgICAgICAgO2xvYWQgc3JjCi0gICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyMl0hICAgICAgICAgICAgIDtsb2FkIHByZWQKLSAgICB2bGQxLjggICAgICAgICAge3EyfSwgW3IxXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge3EzfSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3E0fSwgW3IxXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge3E1fSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3E2fSwgW3IxXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge3E3fSwgW3IyXSEKLQotICAgIHZzdWJsLnU4ICAgICAgICBxOCwgZDAsIGQyCi0gICAgdnN1YmwudTggICAgICAgIHE5LCBkMSwgZDMKLSAgICB2c3VibC51OCAgICAgICAgcTEwLCBkNCwgZDYKLSAgICB2c3VibC51OCAgICAgICAgcTExLCBkNSwgZDcKLSAgICB2c3VibC51OCAgICAgICAgcTEyLCBkOCwgZDEwCi0gICAgdnN1YmwudTggICAgICAgIHExMywgZDksIGQxMQotICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQxMiwgZDE0Ci0gICAgdnN1YmwudTggICAgICAgIHExNSwgZDEzLCBkMTUKLQotICAgIHZzdDEuMTYgICAgICAgICB7cTh9LCBbcjBdISAgICAgICAgICAgICA7c3RvcmUgZGlmZgotICAgIHZzdDEuMTYgICAgICAgICB7cTl9LCBbcjBdIQotICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IwXSEKLSAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMF0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjBdIQotICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3IwXSEKLSAgICB2c3QxLjE2ICAgICAgICAge3ExNH0sIFtyMF0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCBbcjBdIQotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotICAgIGJuZSAgICAgICAgICAgICBzdWJ0cmFjdF9tYnlfbG9vcAotCi0gICAgYnggICAgICAgICAgICAgIGxyCi0gICAgRU5EUAotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07dm9pZCB2cDhfc3VidHJhY3RfbWJ1dl9uZW9uKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICp1c3JjLCB1bnNpZ25lZCBjaGFyICp2c3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKQotfHZwOF9zdWJ0cmFjdF9tYnV2X25lb258IFBST0MKLSAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCi0KLTt1Ci0gICAgYWRkICAgICAgICAgICAgIHIwLCByMCwgIzUxMiAgICAgICAgOyAgIHNob3J0ICp1ZGlmZiA9IGRpZmYgKyAyNTY7Ci0gICAgYWRkICAgICAgICAgICAgIHIzLCByMywgIzI1NiAgICAgICAgOyAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkID0gcHJlZCArIDI1NjsKLQotICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjFdLCByMTIgICAgICAgICA7bG9hZCBzcmMKLSAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3IzXSEgICAgICAgICAgICAgO2xvYWQgcHJlZAotICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjFdLCByMTIKLSAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IxXSwgcjEyCi0gICAgdmxkMS44ICAgICAgICAgIHtkNX0sIFtyM10hCi0gICAgdmxkMS44ICAgICAgICAgIHtkNn0sIFtyMV0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCBbcjNdIQotICAgIHZsZDEuOCAgICAgICAgICB7ZDh9LCBbcjFdLCByMTIKLSAgICB2bGQxLjggICAgICAgICAge2Q5fSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2QxMH0sIFtyMV0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDExfSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2QxMn0sIFtyMV0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDEzfSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2QxNH0sIFtyMV0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDE1fSwgW3IzXSEKLQotICAgIHZzdWJsLnU4ICAgICAgICBxOCwgZDAsIGQxCi0gICAgdnN1YmwudTggICAgICAgIHE5LCBkMiwgZDMKLSAgICB2c3VibC51OCAgICAgICAgcTEwLCBkNCwgZDUKLSAgICB2c3VibC51OCAgICAgICAgcTExLCBkNiwgZDcKLSAgICB2c3VibC51OCAgICAgICAgcTEyLCBkOCwgZDkKLSAgICB2c3VibC51OCAgICAgICAgcTEzLCBkMTAsIGQxMQotICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQxMiwgZDEzCi0gICAgdnN1YmwudTggICAgICAgIHExNSwgZDE0LCBkMTUKLQotICAgIHZzdDEuMTYgICAgICAgICB7cTh9LCBbcjBdISAgICAgICAgICAgICA7c3RvcmUgZGlmZgotICAgIHZzdDEuMTYgICAgICAgICB7cTl9LCBbcjBdIQotICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IwXSEKLSAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMF0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjBdIQotICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3IwXSEKLSAgICB2c3QxLjE2ICAgICAgICAge3ExNH0sIFtyMF0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCBbcjBdIQotCi07dgotICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjJdLCByMTIgICAgICAgICA7bG9hZCBzcmMKLSAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3IzXSEgICAgICAgICAgICAgO2xvYWQgcHJlZAotICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjJdLCByMTIKLSAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IyXSwgcjEyCi0gICAgdmxkMS44ICAgICAgICAgIHtkNX0sIFtyM10hCi0gICAgdmxkMS44ICAgICAgICAgIHtkNn0sIFtyMl0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCBbcjNdIQotICAgIHZsZDEuOCAgICAgICAgICB7ZDh9LCBbcjJdLCByMTIKLSAgICB2bGQxLjggICAgICAgICAge2Q5fSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2QxMH0sIFtyMl0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDExfSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2QxMn0sIFtyMl0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDEzfSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge2QxNH0sIFtyMl0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7ZDE1fSwgW3IzXSEKLQotICAgIHZzdWJsLnU4ICAgICAgICBxOCwgZDAsIGQxCi0gICAgdnN1YmwudTggICAgICAgIHE5LCBkMiwgZDMKLSAgICB2c3VibC51OCAgICAgICAgcTEwLCBkNCwgZDUKLSAgICB2c3VibC51OCAgICAgICAgcTExLCBkNiwgZDcKLSAgICB2c3VibC51OCAgICAgICAgcTEyLCBkOCwgZDkKLSAgICB2c3VibC51OCAgICAgICAgcTEzLCBkMTAsIGQxMQotICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQxMiwgZDEzCi0gICAgdnN1YmwudTggICAgICAgIHExNSwgZDE0LCBkMTUKLQotICAgIHZzdDEuMTYgICAgICAgICB7cTh9LCBbcjBdISAgICAgICAgICAgICA7c3RvcmUgZGlmZgotICAgIHZzdDEuMTYgICAgICAgICB7cTl9LCBbcjBdIQotICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IwXSEKLSAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMF0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjBdIQotICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3IwXSEKLSAgICB2c3QxLjE2ICAgICAgICAge3ExNH0sIFtyMF0hCi0gICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCBbcjBdIQotCi0gICAgYnggICAgICAgICAgICAgIGxyCi0gICAgRU5EUAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vbmVvbi92YXJpYW5jZV9uZW9uLmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZhcmlhbmNlX25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWE0Njg2Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZhcmlhbmNlX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2UxNngxNl9uZW9ufAotICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZTE2eDhfbmVvbnwKLSAgICBFWFBPUlQgIHx2cDhfdmFyaWFuY2U4eDE2X25lb258Ci0gICAgRVhQT1JUICB8dnA4X3ZhcmlhbmNlOHg4X25lb258Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyByMSAgICBpbnQgc291cmNlX3N0cmlkZQotOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCi07IHIzICAgIGludCAgcmVjb25fc3RyaWRlCi07IHN0YWNrIHVuc2lnbmVkIGludCAqc3NlCi18dnA4X3ZhcmlhbmNlMTZ4MTZfbmVvbnwgUFJPQwotICAgIHZtb3YuaTggICAgICAgICBxOCwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E4IC0gc3VtCi0gICAgdm1vdi5pOCAgICAgICAgIHE5LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTksIHExMCAtIHNzZQotICAgIHZtb3YuaTggICAgICAgICBxMTAsICMwCi0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCAjOAotCi12YXJpYW5jZTE2eDE2X25lb25fbG9vcAotICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKLSAgICB2bGQxLjggICAgICAgICAge3EyfSwgW3IyXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge3ExfSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge3EzfSwgW3IyXSwgcjMKLQotICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkNCAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBkaWZmCi0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1Ci0gICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2Ci0gICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3Ci0KLSAgICA7VlBBREFMIGFkZHMgYWRqYWNlbnQgcGFpcnMgb2YgZWxlbWVudHMgb2YgYSB2ZWN0b3IsIGFuZCBhY2N1bXVsYXRlcwotICAgIDt0aGUgcmVzdWx0cyBpbnRvIHRoZSBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLiBUaGUgZXhwbGFuYXRpb24KLSAgICA7aW4gQVJNIGd1aWRlIGlzIHdyb25nLgotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTExICAgICAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyMiwgZDIyICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgc3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDIzLCBkMjMKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEyCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjQsIGQyNAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNSwgZDI1Ci0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTMKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNiwgZDI2Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI3LCBkMjcKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExNAotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI4LCBkMjgKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjksIGQyOQotCi0gICAgYm5lICAgICAgICAgICAgIHZhcmlhbmNlMTZ4MTZfbmVvbl9sb29wCi0KLSAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxOSwgcTEwICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHNzZQotICAgIHZwYWRkbC5zMzIgICAgICBxMCwgcTggICAgICAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3VtCi0KLSAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgICAgIDtsb2FkICpzc2UgZnJvbSBzdGFjawotCi0gICAgdnBhZGRsLnUzMiAgICAgIHExLCBxMTAKLSAgICB2YWRkLnM2NCAgICAgICAgZDAsIGQwLCBkMQotICAgIHZhZGQudTY0ICAgICAgICBkMSwgZDIsIGQzCi0KLSAgICA7dm1vdi4zMiAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDt0aGlzIGluc3RydWN0aW9uIGNvc3RzIGEgbG90Ci0gICAgO3Ztb3YuMzIgICAgICAgIHIxLCBkMVswXQotICAgIDttdWwgICAgICAgICAgICByMCwgcjAsIHIwCi0gICAgO3N0ciAgICAgICAgICAgIHIxLCBbcjEyXQotICAgIDtzdWIgICAgICAgICAgICByMCwgcjEsIHIwLCBhc3IgIzgKLQotICAgIDtzdW0gaXMgaW4gWy0yNTV4MjU2LCAyNTV4MjU2XS4gc3VteHN1bSBpcyAzMi1iaXQuIFNoaWZ0IHRvIHJpZ2h0IHNob3VsZAotICAgIDtoYXZlIHNpZ24tYml0IGV4ZW5zaW9uLCB3aGljaCBpcyB2c2hyLnMuIEhhdmUgdG8gdXNlIHMzMiB0byBtYWtlIGl0IHJpZ2h0LgotICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyMTJdICAgICAgICAgICAgICA7c3RvcmUgc3NlCi0gICAgdnNoci5zMzIgICAgICAgIGQxMCwgZDEwLCAjOAotICAgIHZzdWIuczMyICAgICAgICBkMCwgZDEsIGQxMAotCi0gICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotO3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNng4X2MoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc291cmNlX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWNvbl9zdHJpZGUsCi07ICAgdW5zaWduZWQgaW50ICpzc2UpCi18dnA4X3ZhcmlhbmNlMTZ4OF9uZW9ufCBQUk9DCi0gICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KLSAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCi0gICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKLQotICAgIG1vdiAgICAgICAgICAgICByMTIsICM0Ci0KLXZhcmlhbmNlMTZ4OF9uZW9uX2xvb3AKLSAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IwXSwgcjEgICAgICAgICAgICAgIDtMb2FkIHVwIHNvdXJjZSBhbmQgcmVmZXJlbmNlCi0gICAgdmxkMS44ICAgICAgICAgIHtxMn0sIFtyMl0sIHIzCi0gICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyMF0sIHIxCi0gICAgdmxkMS44ICAgICAgICAgIHtxM30sIFtyMl0sIHIzCi0KLSAgICB2c3VibC51OCAgICAgICAgcTExLCBkMCwgZDQgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgZGlmZgotICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQxLCBkNQotICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQyLCBkNgotICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQzLCBkNwotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTEgICAgICAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHN1bQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIyLCBkMjIgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBzc2UKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjMsIGQyMwotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTIKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNCwgZDI0Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI1LCBkMjUKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMwotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI2LCBkMjYKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjcsIGQyNwotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTE0Ci0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjgsIGQyOAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyOSwgZDI5Ci0KLSAgICBibmUgICAgICAgICAgICAgdmFyaWFuY2UxNng4X25lb25fbG9vcAotCi0gICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKLSAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQotCi0gICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKLQotICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTEwCi0gICAgdmFkZC5zNjQgICAgICAgIGQwLCBkMCwgZDEKLSAgICB2YWRkLnU2NCAgICAgICAgZDEsIGQyLCBkMwotCi0gICAgdm11bGwuczMyICAgICAgIHE1LCBkMCwgZDAKLSAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgW3IxMl0gICAgICAgICAgICAgIDtzdG9yZSBzc2UKLSAgICB2c2hyLnMzMiAgICAgICAgZDEwLCBkMTAsICM3Ci0gICAgdnN1Yi5zMzIgICAgICAgIGQwLCBkMSwgZDEwCi0KLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDtyZXR1cm4KLSAgICBieCAgICAgICAgICAgICAgbHIKLQotICAgIEVORFAKLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotO3Vuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDE2X2MoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc291cmNlX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWNvbl9zdHJpZGUsCi07ICAgdW5zaWduZWQgaW50ICpzc2UpCi0KLXx2cDhfdmFyaWFuY2U4eDE2X25lb258IFBST0MKLSAgICB2bW92Lmk4ICAgICAgICAgcTgsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQotICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E5LCBxMTAgLSBzc2UKLSAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKLQotdmFyaWFuY2U4eDE2X25lb25fbG9vcAotICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKLSAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IyXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IyXSwgcjMKLQotICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkNCAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBkaWZmCi0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDIsIGQ2Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgc3VtCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHNzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMgotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI0LCBkMjQKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjUsIGQyNQotCi0gICAgYm5lICAgICAgICAgICAgIHZhcmlhbmNlOHgxNl9uZW9uX2xvb3AKLQotICAgIHZhZGQudTMyICAgICAgICBxMTAsIHE5LCBxMTAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3NlCi0gICAgdnBhZGRsLnMzMiAgICAgIHEwLCBxOCAgICAgICAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzdW0KLQotICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0gICAgICAgICAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCi0KLSAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAotICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCi0gICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKLQotICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyMTJdICAgICAgICAgICAgICA7c3RvcmUgc3NlCi0gICAgdnNoci5zMzIgICAgICAgIGQxMCwgZDEwLCAjNwotICAgIHZzdWIuczMyICAgICAgICBkMCwgZDEsIGQxMAotCi0gICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07IHIwICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKLTsgcjEgICAgaW50IHNvdXJjZV9zdHJpZGUKLTsgcjIgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cgotOyByMyAgICBpbnQgIHJlY29uX3N0cmlkZQotOyBzdGFjayB1bnNpZ25lZCBpbnQgKnNzZQotfHZwOF92YXJpYW5jZTh4OF9uZW9ufCBQUk9DCi0gICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KLSAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCi0gICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKLQotICAgIG1vdiAgICAgICAgICAgICByMTIsICMyCi0KLXZhcmlhbmNlOHg4X25lb25fbG9vcAotICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKLSAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IyXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge2Q1fSwgW3IyXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge2Q2fSwgW3IyXSwgcjMKLSAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge2Q3fSwgW3IyXSwgcjMKLQotICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkNCAgICAgICAgICAgICAgICAgO2NhbGN1bGF0ZSBkaWZmCi0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1Ci0gICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2Ci0gICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMSAgICAgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgc3VtCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7Y2FsY3VsYXRlIHNzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMgotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI0LCBkMjQKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjUsIGQyNQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEzCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjYsIGQyNgotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNywgZDI3Ci0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTQKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyOCwgZDI4Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI5LCBkMjkKLQotICAgIGJuZSAgICAgICAgICAgICB2YXJpYW5jZTh4OF9uZW9uX2xvb3AKLQotICAgIHZhZGQudTMyICAgICAgICBxMTAsIHE5LCBxMTAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3NlCi0gICAgdnBhZGRsLnMzMiAgICAgIHEwLCBxOCAgICAgICAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzdW0KLQotICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0gICAgICAgICAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCi0KLSAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAotICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCi0gICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKLQotICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtyMTJdICAgICAgICAgICAgICA7c3RvcmUgc3NlCi0gICAgdnNoci5zMzIgICAgICAgIGQxMCwgZDEwLCAjNgotICAgIHZzdWIuczMyICAgICAgICBkMCwgZDEsIGQxMAotCi0gICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9tZW1jcHlfbmVvbi5hc20gYi92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfbWVtY3B5X25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQ1MGU1Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9tZW1jcHlfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUIHx2cDhfbWVtY3B5X25lb258Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTt2b2lkIHZwOF9tZW1jcHlfbmVvbih1bnNpZ25lZCBjaGFyICpkc3RfcHRyLCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3opOwotfHZwOF9tZW1jcHlfbmVvbnwgUFJPQwotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxXSAgICAgICAgICAgICAgICAgICAgICAgIDtwcmVsb2FkIHByZWQgZGF0YQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxLCAjMTI4XQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxLCAjMjU2XQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxLCAjMzg0XQotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgcjIsIGxzciAjOCAgICAgICAgICAgICAgICAgO2NvcHkgMjU2IGJ5dGVzIGRhdGEgYXQgb25lIHRpbWUKLQotbWVtY3B5X25lb25fbG9vcAotICAgIHZsZDEuOCAgICAgICAgICB7cTAsIHExfSwgW3IxXSEgICAgICAgICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotICAgIHZsZDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3IxXSEKLSAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyMF0hICAgICAgICAgICAgICAgICA7Y29weSB0byBkc3RfcHRyCi0gICAgdmxkMS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjFdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3IwXSEKLSAgICB2bGQxLjggICAgICAgICAge3E2LCBxN30sIFtyMV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjBdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IxXSEKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyMF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjBdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjFdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjBdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjFdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjBdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjBdIQotCi0gICAgO3BsZCAgICAgICAgICAgICAgICBbcjFdICAgICAgICAgICAgICAgICAgICAgICAgO3ByZWxvYWQgcHJlZCBkYXRhIC0tIG5lZWQgdG8gYWRqdXN0IGZvciByZWFsIGRldmljZQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxLCAjMTI4XQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxLCAjMjU2XQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IxLCAjMzg0XQotCi0gICAgYm5lICAgICAgICAgICAgIG1lbWNweV9uZW9uX2xvb3AKLQotICAgIGFuZHMgICAgICAgICAgICByMywgcjIsICMweGZmICAgICAgICAgICAgICAgICAgIDtleHRyYSBjb3B5Ci0gICAgYmVxICAgICAgICAgICAgIGRvbmVfY29weV9uZW9uX2xvb3AKLQotZXh0cmFfY29weV9uZW9uX2xvb3AKLSAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IxXSEgICAgICAgICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgc3VicyAgICAgICAgICAgIHIzLCByMywgIzE2Ci0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyMF0hCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NvcHlfbmVvbl9sb29wCi0KLWRvbmVfY29weV9uZW9uX2xvb3AKLSAgICBieCAgICAgICAgICAgICAgbHIKLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9tc2UxNngxNl9uZW9uLmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9tc2UxNngxNl9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNGU4Ny4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfbXNlMTZ4MTZfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF9tc2UxNngxNl9uZW9ufAotICAgIEVYUE9SVCAgfHZwOF9nZXQxNngxNnByZWRfZXJyb3JfbmVvbnwKLSAgICBFWFBPUlQgIHx2cDhfZ2V0NHg0c3NlX2NzX25lb258Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IHIxICAgIGludCBzb3VyY2Vfc3RyaWRlCi07IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsgcjMgICAgaW50ICByZWNvbl9zdHJpZGUKLTsgc3RhY2sgdW5zaWduZWQgaW50ICpzc2UKLTtub3RlOiBpbiB0aGlzIGZ1bmN0aW9uLCBzdW0gaXMgbmV2ZXIgdXNlZC4gU28sIHdlIGNhbiByZW1vdmUgdGhpcyBwYXJ0IG9mIGNhbGN1bGF0aW9uCi07ZnJvbSB2cDhfdmFyaWFuY2UoKS4KLQotfHZwOF9tc2UxNngxNl9uZW9ufCBQUk9DCi0gICAgdm1vdi5pOCAgICAgICAgIHE3LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTcsIHE4LCBxOSwgcTEwIC0gc3NlCi0gICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMAotICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAKLSAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKLQotbXNlMTZ4MTZfbmVvbl9sb29wCi0gICAgdmxkMS44ICAgICAgICAgIHtxMH0sIFtyMF0sIHIxICAgICAgICAgICAgICA7TG9hZCB1cCBzb3VyY2UgYW5kIHJlZmVyZW5jZQotICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjJdLCByMwotICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjBdLCByMQotICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCBbcjJdLCByMwotCi0gICAgdnN1YmwudTggICAgICAgIHExMSwgZDAsIGQ0Ci0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1Ci0gICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2Ci0gICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3Ci0KLSAgICB2bWxhbC5zMTYgICAgICAgcTcsIGQyMiwgZDIyCi0gICAgdm1sYWwuczE2ICAgICAgIHE4LCBkMjMsIGQyMwotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjQsIGQyNAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNSwgZDI1Ci0gICAgdm1sYWwuczE2ICAgICAgIHE3LCBkMjYsIGQyNgotICAgIHZtbGFsLnMxNiAgICAgICBxOCwgZDI3LCBkMjcKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyOCwgZDI4Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI5LCBkMjkKLQotICAgIGJuZSAgICAgICAgICAgICBtc2UxNngxNl9uZW9uX2xvb3AKLQotICAgIHZhZGQudTMyICAgICAgICBxNywgcTcsIHE4Ci0gICAgdmFkZC51MzIgICAgICAgIHE5LCBxOSwgcTEwCi0KLSAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCi0KLSAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxNywgcTkKLSAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAotICAgIHZhZGQudTY0ICAgICAgICBkMCwgZDIsIGQzCi0KLSAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgW3IxMl0KLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdCi0KLSAgICBieCAgICAgICAgICAgICAgbHIKLQotICAgIEVORFAKLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsgcjAgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyByMSAgICBpbnQgc3JjX3N0cmlkZQotOyByMiAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCi07IHIzICAgIGludCByZWZfc3RyaWRlCi18dnA4X2dldDE2eDE2cHJlZF9lcnJvcl9uZW9ufCBQUk9DCi0gICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KLSAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gcHJlZF9lcnJvcgotICAgIHZtb3YuaTggICAgICAgICBxMTAsICMwCi0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCAjOAotCi1nZXQxNngxNnByZWRfZXJyb3JfbmVvbl9sb29wCi0gICAgdmxkMS44ICAgICAgICAgIHtxMH0sIFtyMF0sIHIxICAgICAgICAgICAgICA7TG9hZCB1cCBzb3VyY2UgYW5kIHJlZmVyZW5jZQotICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjJdLCByMwotICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjBdLCByMQotICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCBbcjJdLCByMwotCi0gICAgdnN1YmwudTggICAgICAgIHExMSwgZDAsIGQ0Ci0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1Ci0gICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2Ci0gICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIyLCBkMjIKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjMsIGQyMwotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTIKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNCwgZDI0Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI1LCBkMjUKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMwotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI2LCBkMjYKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjcsIGQyNwotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTE0Ci0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjgsIGQyOAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyOSwgZDI5Ci0KLSAgICBibmUgICAgICAgICAgICAgZ2V0MTZ4MTZwcmVkX2Vycm9yX25lb25fbG9vcAotCi0gICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMAotICAgIHZwYWRkbC5zMzIgICAgICBxMCwgcTgKLQotICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTEwCi0gICAgdmFkZC5zNjQgICAgICAgIGQwLCBkMCwgZDEKLSAgICB2YWRkLnU2NCAgICAgICAgZDEsIGQyLCBkMwotCi0gICAgdm11bGwuczMyICAgICAgIHE1LCBkMCwgZDAKLSAgICB2c2hyLnMzMiAgICAgICAgZDEwLCBkMTAsICM4Ci0gICAgdnN1Yi5zMzIgICAgICAgIGQwLCBkMSwgZDEwCi0KLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyByMCAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyByMSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi07IHIyICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07IHIzICAgIGludCAgcmVjb25fc3RyaWRlCi18dnA4X2dldDR4NHNzZV9jc19uZW9ufCBQUk9DCi0gICAgdmxkMS44ICAgICAgICAgIHtkMH0sIFtyMF0sIHIxICAgICAgICAgICAgICA7TG9hZCB1cCBzb3VyY2UgYW5kIHJlZmVyZW5jZQotICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCBbcjJdLCByMwotICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCBbcjBdLCByMQotICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCBbcjJdLCByMwotICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjBdLCByMQotICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCBbcjJdLCByMwotICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCBbcjBdLCByMQotICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCBbcjJdLCByMwotCi0gICAgdnN1YmwudTggICAgICAgIHExMSwgZDAsIGQ0Ci0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQ1Ci0gICAgdnN1YmwudTggICAgICAgIHExMywgZDIsIGQ2Ci0gICAgdnN1YmwudTggICAgICAgIHExNCwgZDMsIGQ3Ci0KLSAgICB2bXVsbC5zMTYgICAgICAgcTcsIGQyMiwgZDIyCi0gICAgdm11bGwuczE2ICAgICAgIHE4LCBkMjQsIGQyNAotICAgIHZtdWxsLnMxNiAgICAgICBxOSwgZDI2LCBkMjYKLSAgICB2bXVsbC5zMTYgICAgICAgcTEwLCBkMjgsIGQyOAotCi0gICAgdmFkZC51MzIgICAgICAgIHE3LCBxNywgcTgKLSAgICB2YWRkLnUzMiAgICAgICAgcTksIHE5LCBxMTAKLSAgICB2YWRkLnUzMiAgICAgICAgcTksIHE3LCBxOQotCi0gICAgdnBhZGRsLnUzMiAgICAgIHExLCBxOQotICAgIHZhZGQudTY0ICAgICAgICBkMCwgZDIsIGQzCi0KLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdCi0gICAgYnggICAgICAgICAgICAgIGxyCi0KLSAgICBFTkRQCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9zaG9ydHdhbHNoNHg0X25lb24uYXNtIGIvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3Nob3J0d2Fsc2g0eDRfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2RlY2YuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3Nob3J0d2Fsc2g0eDRfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3Nob3J0X3dhbHNoNHg0X25lb258Ci0KLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSB8fC50ZXh0fHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi07dm9pZCB2cDhfc2hvcnRfd2Fsc2g0eDRfYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLQotfHZwOF9zaG9ydF93YWxzaDR4NF9uZW9ufCBQUk9DCi0gICAgdmxkMS4xNiAgICAgICAgIHtkMn0sIFtyMF0sIHIyICAgICAgICAgICAgICA7bG9hZCBpbnB1dAotICAgIHZsZDEuMTYgICAgICAgICB7ZDN9LCBbcjBdLCByMgotICAgIHZsZDEuMTYgICAgICAgICB7ZDR9LCBbcjBdLCByMgotICAgIHZsZDEuMTYgICAgICAgICB7ZDV9LCBbcjBdLCByMgotCi0gICAgO0ZpcnN0IGZvci1sb29wCi0gICAgO3RyYW5zcG9zZSBkMiwgZDMsIGQ0LCBkNS4gVGhlbiwgZDI9aXBbMF0sIGQzPWlwWzFdLCBkND1pcFsyXSwgZDU9aXBbM10KLSAgICB2dHJuLjMyICAgICAgICAgZDIsIGQ0Ci0gICAgdnRybi4zMiAgICAgICAgIGQzLCBkNQotICAgIHZ0cm4uMTYgICAgICAgICBkMiwgZDMKLSAgICB2dHJuLjE2ICAgICAgICAgZDQsIGQ1Ci0KLSAgICB2YWRkLnMxNiAgICAgICAgZDYsIGQyLCBkNSAgICAgICAgICAgICAgO2ExID0gaXBbMF0raXBbM10KLSAgICB2YWRkLnMxNiAgICAgICAgZDcsIGQzLCBkNCAgICAgICAgICAgICAgO2IxID0gaXBbMV0raXBbMl0KLSAgICB2c3ViLnMxNiAgICAgICAgZDgsIGQzLCBkNCAgICAgICAgICAgICAgO2MxID0gaXBbMV0taXBbMl0KLSAgICB2c3ViLnMxNiAgICAgICAgZDksIGQyLCBkNSAgICAgICAgICAgICAgO2QxID0gaXBbMF0taXBbM10KLQotICAgIHZhZGQuczE2ICAgICAgICBkMiwgZDYsIGQ3ICAgICAgICAgICAgIDtvcFswXSA9IGExICsgYjEKLSAgICB2c3ViLnMxNiAgICAgICAgZDQsIGQ2LCBkNyAgICAgICAgICAgICA7b3BbMl0gPSBhMSAtIGIxCi0gICAgdmFkZC5zMTYgICAgICAgIGQzLCBkOCwgZDkgICAgICAgICAgICAgO29wWzFdID0gYzEgKyBkMQotICAgIHZzdWIuczE2ICAgICAgICBkNSwgZDksIGQ4ICAgICAgICAgICAgIDtvcFszXSA9IGQxIC0gYzEKLQotICAgIDtTZWNvbmQgZm9yLWxvb3AKLSAgICA7dHJhbnNwb3NlIGQyLCBkMywgZDQsIGQ1LiBUaGVuLCBkMj1pcFswXSwgZDM9aXBbNF0sIGQ0PWlwWzhdLCBkNT1pcFsxMl0KLSAgICB2dHJuLjMyICAgICAgICAgZDIsIGQ0Ci0gICAgdnRybi4zMiAgICAgICAgIGQzLCBkNQotICAgIHZ0cm4uMTYgICAgICAgICBkMiwgZDMKLSAgICB2dHJuLjE2ICAgICAgICAgZDQsIGQ1Ci0KLSAgICB2YWRkLnMxNiAgICAgICAgZDYsIGQyLCBkNSAgICAgICAgICAgICAgO2ExID0gaXBbMF0raXBbMTJdCi0gICAgdmFkZC5zMTYgICAgICAgIGQ3LCBkMywgZDQgICAgICAgICAgICAgIDtiMSA9IGlwWzRdK2lwWzhdCi0gICAgdnN1Yi5zMTYgICAgICAgIGQ4LCBkMywgZDQgICAgICAgICAgICAgIDtjMSA9IGlwWzRdLWlwWzhdCi0gICAgdnN1Yi5zMTYgICAgICAgIGQ5LCBkMiwgZDUgICAgICAgICAgICAgIDtkMSA9IGlwWzBdLWlwWzEyXQotCi0gICAgdmFkZC5zMTYgICAgICAgIGQyLCBkNiwgZDcgICAgICAgICAgICAgIDthMiA9IGExICsgYjE7Ci0gICAgdnN1Yi5zMTYgICAgICAgIGQ0LCBkNiwgZDcgICAgICAgICAgICAgIDtjMiA9IGExIC0gYjE7Ci0gICAgdmFkZC5zMTYgICAgICAgIGQzLCBkOCwgZDkgICAgICAgICAgICAgIDtiMiA9IGMxICsgZDE7Ci0gICAgdnN1Yi5zMTYgICAgICAgIGQ1LCBkOSwgZDggICAgICAgICAgICAgIDtkMiA9IGQxIC0gYzE7Ci0KLSAgICB2Y2d0LnMxNiAgICAgICAgcTMsIHExLCAjMAotICAgIHZjZ3QuczE2ICAgICAgICBxNCwgcTIsICMwCi0KLSAgICB2c3ViLnMxNiAgICAgICAgcTEsIHExLCBxMwotICAgIHZzdWIuczE2ICAgICAgICBxMiwgcTIsIHE0Ci0KLSAgICB2c2hyLnMxNiAgICAgICAgcTEsIHExLCAjMQotICAgIHZzaHIuczE2ICAgICAgICBxMiwgcTIsICMxCi0KLSAgICB2c3QxLjE2ICAgICAgICAge3ExLCBxMn0sIFtyMV0KLQotICAgIGJ4ICAgICAgICAgICAgICBscgotCi0gICAgRU5EUAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2X25lb24uYXNtIGIvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2UxNngxNl9uZW9uLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MzlmNC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2X25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9mdW5jfAotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTsgcjAgICAgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi07IHIxICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgcjIgICAgaW50ICB4b2Zmc2V0LAotOyByMyAgICBpbnQgIHlvZmZzZXQsCi07IHN0YWNrKHI0KSB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotOyBzdGFjayhyNSkgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi07IHN0YWNrKHI2KSB1bnNpZ25lZCBpbnQgKnNzZQotO25vdGU6IG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29waWVkIGZyb20gYmlsaW5lYXJfcHJlZGljdDE2eDE2X25lb24gYW5kIHZwOF92YXJpYW5jZTE2eDE2X25lb24uCi0KLXx2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9mdW5jfCBQUk9DCi0gICAgcHVzaCAgICAgICAgICAgIHtyNC1yNiwgbHJ9Ci0KLSAgICBhZHIgICAgICAgICAgICAgcjEyLCBCaWxpbmVhclRhcHNfY29lZmYKLSAgICBsZHIgICAgICAgICAgICAgcjQsIFtzcCwgIzE2XSAgICAgICAgICAgO2xvYWQgKmRzdF9wdHIgZnJvbSBzdGFjawotICAgIGxkciAgICAgICAgICAgICByNSwgW3NwLCAjMjBdICAgICAgICAgICA7bG9hZCBkc3RfcGl4ZWxzX3Blcl9saW5lIGZyb20gc3RhY2sKLSAgICBsZHIgICAgICAgICAgICAgcjYsIFtzcCwgIzI0XSAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCi0KLSAgICBjbXAgICAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgYmVxICAgICAgICAgICAgIHNlY29uZHBhc3NfYmZpbHRlcjE2eDE2X29ubHkKLQotICAgIGFkZCAgICAgICAgICAgICByMiwgcjEyLCByMiwgbHNsICMzICAgICA7Y2FsY3VsYXRlIGZpbHRlciBsb2NhdGlvbgotCi0gICAgY21wICAgICAgICAgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKLQotICAgIHZsZDEuczMyICAgICAgICB7ZDMxfSwgW3IyXSAgICAgICAgICAgICA7bG9hZCBmaXJzdF9wYXNzIGZpbHRlcgotCi0gICAgYmVxICAgICAgICAgICAgIGZpcnN0cGFzc19iZmlsdGVyMTZ4MTZfb25seQotCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzI3MiAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIHZsZDEudTggICAgICAgICB7ZDIsIGQzLCBkNH0sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICBtb3YgICAgICAgICAgICAgbHIsIHNwCi0gICAgdmxkMS51OCAgICAgICAgIHtkNSwgZDYsIGQ3fSwgW3IwXSwgcjEKLQotICAgIG1vdiAgICAgICAgICAgICByMiwgIzMgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCi0gICAgdmxkMS51OCAgICAgICAgIHtkOCwgZDksIGQxMH0sIFtyMF0sIHIxCi0KLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQzMVswXSAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMCBkMSkKLSAgICB2bGQxLnU4ICAgICAgICAge2QxMSwgZDEyLCBkMTN9LCBbcjBdLCByMQotCi0gICAgdmR1cC44ICAgICAgICAgIGQxLCBkMzFbNF0KLQotO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMTd4MTYpCi12cDhlX2ZpbHRfYmxrMmRfZnAxNngxNl9sb29wX25lb24KLSAgICBwbGQgICAgICAgICAgICAgW3IwXQotICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxXQotICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyLCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDMsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkNSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkNiwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTExLCBkOCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEyLCBkOSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEzLCBkMTEsIGQwCi0gICAgdm11bGwudTggICAgICAgIHExNCwgZDEyLCBkMAotCi0gICAgdmV4dC44ICAgICAgICAgIGQyLCBkMiwgZDMsICMxICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQotICAgIHZleHQuOCAgICAgICAgICBkNSwgZDUsIGQ2LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkOCwgZDgsIGQ5LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMTEsIGQxMSwgZDEyLCAjMQotCi0gICAgdm1sYWwudTggICAgICAgIHE3LCBkMiwgZDEgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclsxXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTksIGQ1LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQ4LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxMTMsIGQxMSwgZDEKLQotICAgIHZleHQuOCAgICAgICAgICBkMywgZDMsIGQ0LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkNiwgZDYsIGQ3LCAjMQotICAgIHZleHQuOCAgICAgICAgICBkOSwgZDksIGQxMCwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDEyLCBkMTIsIGQxMywgIzEKLQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDMsIGQxICAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMV0pCi0gICAgdm1sYWwudTggICAgICAgIHExMCwgZDYsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHExMiwgZDksIGQxCi0gICAgdm1sYWwudTggICAgICAgIHExNCwgZDEyLCBkMQotCi0gICAgc3VicyAgICAgICAgICAgIHIyLCByMiwgIzEKLQotICAgIHZxcnNocm4udTE2ICAgIGQxNCwgcTcsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJuLnUxNiAgICBkMTUsIHE4LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxNiwgcTksICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDE3LCBxMTAsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDE4LCBxMTEsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDE5LCBxMTIsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDIwLCBxMTMsICM3Ci0KLSAgICB2bGQxLnU4ICAgICAgICAge2QyLCBkMywgZDR9LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdnFyc2hybi51MTYgICAgZDIxLCBxMTQsICM3Ci0gICAgdmxkMS51OCAgICAgICAgIHtkNSwgZDYsIGQ3fSwgW3IwXSwgcjEKLQotICAgIHZzdDEudTggICAgICAgICB7ZDE0LCBkMTUsIGQxNiwgZDE3fSwgW2xyXSEgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwfSwgW3IwXSwgcjEKLSAgICB2c3QxLnU4ICAgICAgICAge2QxOCwgZDE5LCBkMjAsIGQyMX0sIFtscl0hCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTEsIGQxMiwgZDEzfSwgW3IwXSwgcjEKLQotICAgIGJuZSAgICAgICAgICAgICB2cDhlX2ZpbHRfYmxrMmRfZnAxNngxNl9sb29wX25lb24KLQotO0ZpcnN0LXBhc3MgZmlsdGVyaW5nIGZvciByZXN0IDUgbGluZXMKLSAgICB2bGQxLnU4ICAgICAgICAge2QxNCwgZDE1LCBkMTZ9LCBbcjBdLCByMQotCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkMiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTEwLCBkMywgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTExLCBkNSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEyLCBkNiwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTEzLCBkOCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTE0LCBkOSwgZDAKLQotICAgIHZleHQuOCAgICAgICAgICBkMiwgZDIsIGQzLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICB2ZXh0LjggICAgICAgICAgZDUsIGQ1LCBkNiwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDgsIGQ4LCBkOSwgIzEKLQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDIsIGQxICAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMV0pCi0gICAgdm1sYWwudTggICAgICAgIHExMSwgZDUsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHExMywgZDgsIGQxCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDMsIGQzLCBkNCwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDYsIGQ2LCBkNywgIzEKLSAgICB2ZXh0LjggICAgICAgICAgZDksIGQ5LCBkMTAsICMxCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkMywgZDEgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQ2LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxMTQsIGQ5LCBkMQotCi0gICAgdm11bGwudTggICAgICAgIHExLCBkMTEsIGQwCi0gICAgdm11bGwudTggICAgICAgIHEyLCBkMTIsIGQwCi0gICAgdm11bGwudTggICAgICAgIHEzLCBkMTQsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMTUsIGQwCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDExLCBkMTEsIGQxMiwgIzEgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIGQxNCwgZDE0LCBkMTUsICMxCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTEsIGQxMSwgZDEgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDE0LCBkMQotCi0gICAgdmV4dC44ICAgICAgICAgIGQxMiwgZDEyLCBkMTMsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQxNSwgZDE1LCBkMTYsICMxCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTIsIGQxMiwgZDEgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDE1LCBkMQotCi0gICAgdnFyc2hybi51MTYgICAgZDEwLCBxOSwgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocm4udTE2ICAgIGQxMSwgcTEwLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxMiwgcTExLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxMywgcTEyLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxNCwgcTEzLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxNSwgcTE0LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxNiwgcTEsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDE3LCBxMiwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMTgsIHEzLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQxOSwgcTQsICM3Ci0KLSAgICB2c3QxLnU4ICAgICAgICAge2QxMCwgZDExLCBkMTIsIGQxM30sIFtscl0hICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDE0LCBkMTUsIGQxNiwgZDE3fSwgW2xyXSEKLSAgICB2c3QxLnU4ICAgICAgICAge2QxOCwgZDE5fSwgW2xyXSEKLQotO1NlY29uZCBwYXNzOiAxNngxNgotO3NlY29uZHBhc3NfZmlsdGVyCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzMKLSAgICBzdWIgICAgICAgICAgICAgbHIsIGxyLCAjMjcyCi0KLSAgICB2bGQxLnUzMiAgICAgICAge2QzMX0sIFtyM10gICAgICAgICAgICAgO2xvYWQgc2Vjb25kX3Bhc3MgZmlsdGVyCi0KLSAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMjU2Ci0gICAgbW92ICAgICAgICAgICAgIHIzLCBzcAotCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjIsIGQyM30sIFtscl0hICAgICAgIDtsb2FkIHNyYyBkYXRhCi0KLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQzMVswXSAgICAgICAgICAgICAgO3NlY29uZF9wYXNzIGZpbHRlciBwYXJhbWV0ZXJzIChkMCBkMSkKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQzMVs0XQotICAgIG1vdiAgICAgICAgICAgICByMTIsICM0ICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCi0KLXZwOGVfZmlsdF9ibGsyZF9zcDE2eDE2X2xvb3BfbmVvbgotICAgIHZsZDEudTggICAgICAgICB7ZDI0LCBkMjV9LCBbbHJdIQotICAgIHZtdWxsLnU4ICAgICAgICBxMSwgZDIyLCBkMCAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMF0pCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjYsIGQyN30sIFtscl0hCi0gICAgdm11bGwudTggICAgICAgIHEyLCBkMjMsIGQwCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjgsIGQyOX0sIFtscl0hCi0gICAgdm11bGwudTggICAgICAgIHEzLCBkMjQsIGQwCi0gICAgdmxkMS51OCAgICAgICAgIHtkMzAsIGQzMX0sIFtscl0hCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTQsIGQyNSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTUsIGQyNiwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyNywgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQyOCwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTgsIGQyOSwgZDAKLQotICAgIHZtbGFsLnU4ICAgICAgICBxMSwgZDI0LCBkMSAgICAgICAgICAgICA7KHNyY19wdHJbcGl4ZWxfc3RlcF0gKiBGaWx0ZXJbMV0pCi0gICAgdm1sYWwudTggICAgICAgIHEyLCBkMjUsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHEzLCBkMjYsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE0LCBkMjcsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE1LCBkMjgsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE2LCBkMjksIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE3LCBkMzAsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMzEsIGQxCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2cXJzaHJuLnUxNiAgICBkMiwgcTEsICM3ICAgICAgICAgICAgICAgO3NoaWZ0L3JvdW5kL3NhdHVyYXRlIHRvIHU4Ci0gICAgdnFyc2hybi51MTYgICAgZDMsIHEyLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQ0LCBxMywgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkNSwgcTQsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDYsIHE1LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQ3LCBxNiwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkOCwgcTcsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDksIHE4LCAjNwotCi0gICAgdnN0MS51OCAgICAgICAgIHtkMiwgZDN9LCBbcjNdISAgICAgICAgIDtzdG9yZSByZXN1bHQKLSAgICB2c3QxLnU4ICAgICAgICAge2Q0LCBkNX0sIFtyM10hCi0gICAgdnN0MS51OCAgICAgICAgIHtkNiwgZDd9LCBbcjNdIQotICAgIHZtb3YgICAgICAgICAgICBxMTEsIHExNQotICAgIHZzdDEudTggICAgICAgICB7ZDgsIGQ5fSwgW3IzXSEKLQotICAgIGJuZSAgICAgICAgICAgICB2cDhlX2ZpbHRfYmxrMmRfc3AxNngxNl9sb29wX25lb24KLQotICAgIGIgICAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9uZW9uCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLQotZmlyc3RwYXNzX2JmaWx0ZXIxNngxNl9vbmx5Ci0gICAgbW92ICAgICAgICAgICAgIHIyLCAjNCAgICAgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzUyOCAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDMxWzBdICAgICAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMCBkMSkKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQzMVs0XQotICAgIG1vdiAgICAgICAgICAgICByMywgc3AKLQotO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMTZ4MTYpCi12cDhlX2ZpbHRfYmxrMmRfZnBvMTZ4MTZfbG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtkMiwgZDMsIGQ0fSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQotICAgIHZsZDEudTggICAgICAgICB7ZDUsIGQ2LCBkN30sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkOCwgZDksIGQxMH0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTEsIGQxMiwgZDEzfSwgW3IwXSwgcjEKLQotICAgIHBsZCAgICAgICAgICAgICBbcjBdCi0gICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCi0gICAgcGxkICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KLQotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDIsIGQwICAgICAgICAgICAgICA7KHNyY19wdHJbMF0gKiBGaWx0ZXJbMF0pCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMywgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTksIGQ1LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQ2LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTEsIGQ4LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQ5LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTMsIGQxMSwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTE0LCBkMTIsIGQwCi0KLSAgICB2ZXh0LjggICAgICAgICAgZDIsIGQyLCBkMywgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIGQ1LCBkNSwgZDYsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ4LCBkOCwgZDksICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQxMSwgZDExLCBkMTIsICMxCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyLCBkMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxOSwgZDUsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHExMSwgZDgsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHExMywgZDExLCBkMQotCi0gICAgdmV4dC44ICAgICAgICAgIGQzLCBkMywgZDQsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ2LCBkNiwgZDcsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ5LCBkOSwgZDEwLCAjMQotICAgIHZleHQuOCAgICAgICAgICBkMTIsIGQxMiwgZDEzLCAjMQotCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkMywgZDEgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclsxXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTEwLCBkNiwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTEyLCBkOSwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTE0LCBkMTIsIGQxCi0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnFyc2hybi51MTYgICAgZDE0LCBxNywgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocm4udTE2ICAgIGQxNSwgcTgsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDE2LCBxOSwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMTcsIHExMCwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMTgsIHExMSwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMTksIHExMiwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMjAsIHExMywgIzcKLSAgICB2c3QxLnU4ICAgICAgICAge2QxNCwgZDE1fSwgW3IzXSEgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZxcnNocm4udTE2ICAgIGQyMSwgcTE0LCAjNwotCi0gICAgdnN0MS51OCAgICAgICAgIHtkMTYsIGQxN30sIFtyM10hCi0gICAgdnN0MS51OCAgICAgICAgIHtkMTgsIGQxOX0sIFtyM10hCi0gICAgdnN0MS51OCAgICAgICAgIHtkMjAsIGQyMX0sIFtyM10hCi0KLSAgICBibmUgICAgICAgICAgICAgdnA4ZV9maWx0X2JsazJkX2ZwbzE2eDE2X2xvb3BfbmVvbgotCi0gICAgYiAgICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2Vjb25kcGFzc19iZmlsdGVyMTZ4MTZfb25seQotO1NlY29uZCBwYXNzOiAxNngxNgotO3NlY29uZHBhc3NfZmlsdGVyCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzUyOCAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIGFkZCAgICAgICAgICAgICByMywgcjEyLCByMywgbHNsICMzCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQgICAgICAgICAgICAgICAgICAgICA7bG9vcCBjb3VudGVyCi0gICAgdmxkMS51MzIgICAgICAgIHtkMzF9LCBbcjNdICAgICAgICAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMiwgZDIzfSwgW3IwXSwgcjEgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgbW92ICAgICAgICAgICAgIHIzLCBzcAotCi0gICAgdmR1cC44ICAgICAgICAgIGQwLCBkMzFbMF0gICAgICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwIGQxKQotICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDMxWzRdCi0KLXZwOGVfZmlsdF9ibGsyZF9zcG8xNngxNl9sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge2QyNCwgZDI1fSwgW3IwXSwgcjEKLSAgICB2bXVsbC51OCAgICAgICAgcTEsIGQyMiwgZDAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzBdKQotICAgIHZsZDEudTggICAgICAgICB7ZDI2LCBkMjd9LCBbcjBdLCByMQotICAgIHZtdWxsLnU4ICAgICAgICBxMiwgZDIzLCBkMAotICAgIHZsZDEudTggICAgICAgICB7ZDI4LCBkMjl9LCBbcjBdLCByMQotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI0LCBkMAotICAgIHZsZDEudTggICAgICAgICB7ZDMwLCBkMzF9LCBbcjBdLCByMQotCi0gICAgdm11bGwudTggICAgICAgIHE0LCBkMjUsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE1LCBkMjYsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMjcsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE3LCBkMjgsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkMjksIGQwCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTEsIGQyNCwgZDEgICAgICAgICAgICAgOyhzcmNfcHRyW3BpeGVsX3N0ZXBdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxMiwgZDI1LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxMywgZDI2LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxNCwgZDI3LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxNSwgZDI4LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxNiwgZDI5LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDMwLCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxOCwgZDMxLCBkMQotCi0gICAgdnFyc2hybi51MTYgICAgZDIsIHExLCAjNyAgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZxcnNocm4udTE2ICAgIGQzLCBxMiwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkNCwgcTMsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDUsIHE0LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQ2LCBxNSwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkNywgcTYsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDgsIHE3LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQ5LCBxOCwgIzcKLQotICAgIHZzdDEudTggICAgICAgICB7ZDIsIGQzfSwgW3IzXSEgICAgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotICAgIHZzdDEudTggICAgICAgICB7ZDQsIGQ1fSwgW3IzXSEKLSAgICB2bW92ICAgICAgICAgICAgcTExLCBxMTUKLSAgICB2c3QxLnU4ICAgICAgICAge2Q2LCBkN30sIFtyM10hCi0gICAgdnN0MS51OCAgICAgICAgIHtkOCwgZDl9LCBbcjNdIQotCi0gICAgYm5lICAgICAgICAgICAgIHZwOGVfZmlsdF9ibGsyZF9zcG8xNngxNl9sb29wX25lb24KLQotICAgIGIgICAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9uZW9uCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07dmFyaWFuY2UxNngxNgotc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbgotICAgIHZtb3YuaTggICAgICAgICBxOCwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E4IC0gc3VtCi0gICAgdm1vdi5pOCAgICAgICAgIHE5LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTksIHExMCAtIHNzZQotICAgIHZtb3YuaTggICAgICAgICBxMTAsICMwCi0KLSAgICBzdWIgICAgICAgICAgICAgcjMsIHIzLCAjMjU2Ci0gICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKLQotc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9sb29wCi0gICAgdmxkMS44ICAgICAgICAgIHtxMH0sIFtyM10hICAgICAgICAgICAgICAgICA7TG9hZCB1cCBzb3VyY2UgYW5kIHJlZmVyZW5jZQotICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjRdLCByNQotICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjNdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCBbcjRdLCByNQotCi0gICAgdnN1YmwudTggICAgICAgIHExMSwgZDAsIGQ0ICAgICAgICAgICAgICAgICA7ZGlmZgotICAgIHZzdWJsLnU4ICAgICAgICBxMTIsIGQxLCBkNQotICAgIHZzdWJsLnU4ICAgICAgICBxMTMsIGQyLCBkNgotICAgIHZzdWJsLnU4ICAgICAgICBxMTQsIGQzLCBkNwotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTEgICAgICAgICAgICAgICAgICAgICA7c3VtCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDIzLCBkMjMKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEyCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjQsIGQyNAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNSwgZDI1Ci0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTMKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNiwgZDI2Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI3LCBkMjcKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExNAotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI4LCBkMjgKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjksIGQyOQotCi0gICAgYm5lICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb25fbG9vcAotCi0gICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKLSAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQotCi0gICAgdnBhZGRsLnUzMiAgICAgIHExLCBxMTAKLSAgICB2YWRkLnM2NCAgICAgICAgZDAsIGQwLCBkMQotICAgIHZhZGQudTY0ICAgICAgICBkMSwgZDIsIGQzCi0KLSAgICB2bXVsbC5zMzIgICAgICAgcTUsIGQwLCBkMAotICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbcjZdICAgICAgICAgICAgICAgO3N0b3JlIHNzZQotICAgIHZzaHIuczMyICAgICAgICBkMTAsIGQxMCwgIzgKLSAgICB2c3ViLnMzMiAgICAgICAgZDAsIGQxLCBkMTAKLQotICAgIGFkZCAgICAgICAgICAgICBzcCwgc3AsICM1MjgKLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDtyZXR1cm4KLQotICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYscGN9Ci0KLSAgICBFTkRQCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotCi1iaWxpbmVhcl90YXBzX2NvZWZmCi0gICAgRENEICAgICAxMjgsIDAsIDExMiwgMTYsIDk2LCAzMiwgODAsIDQ4LCA2NCwgNjQsIDQ4LCA4MCwgMzIsIDk2LCAxNiwgMTEyCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlMTZ4MTZzX25lb24uYXNtIGIvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2UxNngxNnNfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmI3MWMuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL25lb24vdnA4X3N1YnBpeGVsdmFyaWFuY2UxNngxNnNfbmVvbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9uZW9ufAotICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9uZW9ufAotICAgIEVYUE9SVCAgfHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfbmVvbnwKLSAgICBFWFBPUlQgIHx2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07dW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9uZW9uCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgcjAKLTsgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAgcjEKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgIHIyCi07ICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAgIHIzCi07ICAgIHVuc2lnbmVkIGludCAqc3NlCi07KTsKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7bHJ9Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNCAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLSAgICBsZHIgICAgICAgICAgICAgbHIsIFtzcCwgIzRdICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKLSAgICB2bW92Lmk4ICAgICAgICAgcTgsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQotICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E5LCBxMTAgLSBzc2UKLSAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAotCi07Rmlyc3QgUGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICgxNngxNikKLXZwOF9maWx0X2ZwbzE2eDE2c180XzBfbG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICB2bGQxLjggICAgICAgICAge3ExMX0sIFtyMl0sIHIzCi0gICAgdmxkMS51OCAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtyMF0sIHIxCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTJ9LCBbcjJdLCByMwotICAgIHZsZDEudTggICAgICAgICB7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0sIHIxCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTN9LCBbcjJdLCByMwotICAgIHZsZDEudTggICAgICAgICB7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IwXSwgcjEKLQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwXQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwLCByMV0KLSAgICA7cGxkICAgICAgICAgICAgICAgIFtyMCwgcjEsIGxzbCAjMV0KLQotICAgIHZleHQuOCAgICAgICAgICBxMSwgcTAsIHExLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICB2ZXh0LjggICAgICAgICAgcTMsIHEyLCBxMywgIzEKLSAgICB2ZXh0LjggICAgICAgICAgcTUsIHE0LCBxNSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgcTcsIHE2LCBxNywgIzEKLQotICAgIHZyaGFkZC51OCAgICAgICBxMCwgcTAsIHExICAgICAgICAgICAgICA7KHNyY19wdHJbMF0rc3JjX3B0clsxXSkvcm91bmQvc2hpZnQgcmlnaHQgMQotICAgIHZsZDEuOCAgICAgICAgICB7cTE0fSwgW3IyXSwgcjMKLSAgICB2cmhhZGQudTggICAgICAgcTEsIHEyLCBxMwotICAgIHZyaGFkZC51OCAgICAgICBxMiwgcTQsIHE1Ci0gICAgdnJoYWRkLnU4ICAgICAgIHEzLCBxNiwgcTcKLQotICAgIHZzdWJsLnU4ICAgICAgICBxNCwgZDAsIGQyMiAgICAgICAgICAgICAgICAgO2RpZmYKLSAgICB2c3VibC51OCAgICAgICAgcTUsIGQxLCBkMjMKLSAgICB2c3VibC51OCAgICAgICAgcTYsIGQyLCBkMjQKLSAgICB2c3VibC51OCAgICAgICAgcTcsIGQzLCBkMjUKLSAgICB2c3VibC51OCAgICAgICAgcTAsIGQ0LCBkMjYKLSAgICB2c3VibC51OCAgICAgICAgcTEsIGQ1LCBkMjcKLSAgICB2c3VibC51OCAgICAgICAgcTIsIGQ2LCBkMjgKLSAgICB2c3VibC51OCAgICAgICAgcTMsIGQ3LCBkMjkKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTQgICAgICAgICAgICAgICAgICAgICA7c3VtCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkOCwgZDggICAgICAgICAgICAgICAgO3NzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQ5LCBkOQotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxNQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDEwLCBkMTAKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMTEsIGQxMQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTYKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQxMiwgZDEyCi0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDEzLCBkMTMKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHE3Ci0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMTQsIGQxNAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQxNSwgZDE1Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEwICAgICAgICAgICAgICAgICAgICAgO3N1bQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDAsIGQwICAgICAgICAgICAgICAgIDtzc2UKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMSwgZDEKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMiwgZDIKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMywgZDMKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEyCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNCwgZDQKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkNSwgZDUKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEzCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNiwgZDYKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkNywgZDcKLQotICAgIGJuZSAgICAgICAgICAgICB2cDhfZmlsdF9mcG8xNngxNnNfNF8wX2xvb3BfbmVvbgotCi0gICAgdmFkZC51MzIgICAgICAgIHExMCwgcTksIHExMCAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKLSAgICB2cGFkZGwuczMyICAgICAgcTAsIHE4ICAgICAgICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHN1bQotCi0gICAgdnBhZGRsLnUzMiAgICAgIHExLCBxMTAKLSAgICB2YWRkLnM2NCAgICAgICAgZDAsIGQwLCBkMQotICAgIHZhZGQudTY0ICAgICAgICBkMSwgZDIsIGQzCi0KLSAgICB2bXVsbC5zMzIgICAgICAgcTUsIGQwLCBkMAotICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCBbbHJdICAgICAgICAgICAgICAgO3N0b3JlIHNzZQotICAgIHZzaHIuczMyICAgICAgICBkMTAsIGQxMCwgIzgKLSAgICB2c3ViLnMzMiAgICAgICAgZDAsIGQxLCBkMTAKLQotICAgIHZtb3YuMzIgICAgICAgICByMCwgZDBbMF0gICAgICAgICAgICAgICAgICAgO3JldHVybgotICAgIHBvcCAgICAgICAgICAgICB7cGN9Ci0gICAgRU5EUAotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07dW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9uZW9uCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgcjAKLTsgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAgcjEKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgIHIyCi07ICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAgIHIzCi07ICAgIHVuc2lnbmVkIGludCAqc3NlCi07KTsKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7bHJ9Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNCAgICAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLQotICAgIHZsZDEudTggICAgICAgICB7cTB9LCBbcjBdLCByMSAgICAgICAgICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICBsZHIgICAgICAgICAgICAgbHIsIFtzcCwgIzRdICAgICAgICAgICAgICAgIDtsb2FkICpzc2UgZnJvbSBzdGFjawotCi0gICAgdm1vdi5pOCAgICAgICAgIHE4LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTggLSBzdW0KLSAgICB2bW92Lmk4ICAgICAgICAgcTksICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCi0gICAgdm1vdi5pOCAgICAgICAgIHExMCwgIzAKLQotdnA4X2ZpbHRfc3BvMTZ4MTZzXzBfNF9sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge3EyfSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge3ExfSwgW3IyXSwgcjMKLSAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge3EzfSwgW3IyXSwgcjMKLSAgICB2bGQxLnU4ICAgICAgICAge3E2fSwgW3IwXSwgcjEKLSAgICB2bGQxLjggICAgICAgICAge3E1fSwgW3IyXSwgcjMKLSAgICB2bGQxLnU4ICAgICAgICAge3ExNX0sIFtyMF0sIHIxCi0KLSAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMgotICAgIHZsZDEuOCAgICAgICAgICB7cTd9LCBbcjJdLCByMwotICAgIHZyaGFkZC51OCAgICAgICBxMiwgcTIsIHE0Ci0gICAgdnJoYWRkLnU4ICAgICAgIHE0LCBxNCwgcTYKLSAgICB2cmhhZGQudTggICAgICAgcTYsIHE2LCBxMTUKLQotICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQwLCBkMiAgICAgICAgICAgICAgICAgO2RpZmYKLSAgICB2c3VibC51OCAgICAgICAgcTEyLCBkMSwgZDMKLSAgICB2c3VibC51OCAgICAgICAgcTEzLCBkNCwgZDYKLSAgICB2c3VibC51OCAgICAgICAgcTE0LCBkNSwgZDcKLSAgICB2c3VibC51OCAgICAgICAgcTAsIGQ4LCBkMTAKLSAgICB2c3VibC51OCAgICAgICAgcTEsIGQ5LCBkMTEKLSAgICB2c3VibC51OCAgICAgICAgcTIsIGQxMiwgZDE0Ci0gICAgdnN1YmwudTggICAgICAgIHEzLCBkMTMsIGQxNQotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTEgICAgICAgICAgICAgICAgICAgICA7c3VtCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDIzLCBkMjMKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEyCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjQsIGQyNAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyNSwgZDI1Ci0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTMKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNiwgZDI2Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI3LCBkMjcKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExNAotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI4LCBkMjgKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjksIGQyOQotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMCAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQwLCBkMCAgICAgICAgICAgICAgICAgO3NzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQxLCBkMQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTEKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyLCBkMgotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQzLCBkMwotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTIKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQ0LCBkNAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQ1LCBkNQotCi0gICAgdm1vdiAgICAgICAgICAgIHEwLCBxMTUKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTMKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQ2LCBkNgotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQ3LCBkNwotCi0gICAgYm5lICAgICAgICAgICAgIHZwOF9maWx0X3NwbzE2eDE2c18wXzRfbG9vcF9uZW9uCi0KLSAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxOSwgcTEwICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHNzZQotICAgIHZwYWRkbC5zMzIgICAgICBxMCwgcTggICAgICAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3VtCi0KLSAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAotICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCi0gICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKLQotICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtscl0gICAgICAgICAgICAgICA7c3RvcmUgc3NlCi0gICAgdnNoci5zMzIgICAgICAgIGQxMCwgZDEwLCAjOAotICAgIHZzdWIuczMyICAgICAgICBkMCwgZDEsIGQxMAotCi0gICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCi0gICAgcG9wICAgICAgICAgICAgIHtwY30KLSAgICBFTkRQCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTt1bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9uZW9uCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwgcjAKLTsgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLCAgcjEKLTsgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwgIHIyCi07ICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAgIHIzCi07ICAgIHVuc2lnbmVkIGludCAqc3NlCi07KTsKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXx2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X25lb258IFBST0MKLSAgICBwdXNoICAgICAgICAgICAge2xyfQotCi0gICAgdmxkMS51OCAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0sIHIxICAgICAgO2xvYWQgc3JjIGRhdGEKLQotICAgIGxkciAgICAgICAgICAgICBsciwgW3NwLCAjNF0gICAgICAgICAgIDtsb2FkICpzc2UgZnJvbSBzdGFjawotICAgIHZtb3YuaTggICAgICAgICBxMTMsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQotICAgIHZleHQuOCAgICAgICAgICBxMSwgcTAsIHExLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLQotICAgIHZtb3YuaTggICAgICAgICBxMTQsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOSwgcTEwIC0gc3NlCi0gICAgdm1vdi5pOCAgICAgICAgIHExNSwgIzAKLQotICAgIG1vdiAgICAgICAgICAgICByMTIsICM0ICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgotICAgIHZyaGFkZC51OCAgICAgICBxMCwgcTAsIHExICAgICAgICAgICAgICA7KHNyY19wdHJbMF0rc3JjX3B0clsxXSkvcm91bmQvc2hpZnQgcmlnaHQgMQotCi07Rmlyc3QgUGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICgxN3gxNikKLXZwOF9maWx0MTZ4MTZzXzRfNF9sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2QxNiwgZDE3LCBkMTgsIGQxOX0sIFtyMF0sIHIxCi0KLSAgICA7cGxkICAgICAgICAgICAgICAgIFtyMF0KLSAgICA7cGxkICAgICAgICAgICAgICAgIFtyMCwgcjFdCi0gICAgO3BsZCAgICAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCi0KLSAgICB2ZXh0LjggICAgICAgICAgcTMsIHEyLCBxMywgIzEgICAgICAgICAgO2NvbnN0cnVjdCBzcmNfcHRyWzFdCi0gICAgdmV4dC44ICAgICAgICAgIHE1LCBxNCwgcTUsICMxCi0gICAgdmV4dC44ICAgICAgICAgIHE3LCBxNiwgcTcsICMxCi0gICAgdmV4dC44ICAgICAgICAgIHE5LCBxOCwgcTksICMxCi0KLSAgICB2cmhhZGQudTggICAgICAgcTEsIHEyLCBxMyAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdK3NyY19wdHJbMV0pL3JvdW5kL3NoaWZ0IHJpZ2h0IDEKLSAgICB2cmhhZGQudTggICAgICAgcTIsIHE0LCBxNQotICAgIHZyaGFkZC51OCAgICAgICBxMywgcTYsIHE3Ci0gICAgdnJoYWRkLnU4ICAgICAgIHE0LCBxOCwgcTkKLQotICAgIHZsZDEuOCAgICAgICAgICB7cTV9LCBbcjJdLCByMwotICAgIHZyaGFkZC51OCAgICAgICBxMCwgcTAsIHExCi0gICAgdmxkMS44ICAgICAgICAgIHtxNn0sIFtyMl0sIHIzCi0gICAgdnJoYWRkLnU4ICAgICAgIHExLCBxMSwgcTIKLSAgICB2bGQxLjggICAgICAgICAge3E3fSwgW3IyXSwgcjMKLSAgICB2cmhhZGQudTggICAgICAgcTIsIHEyLCBxMwotICAgIHZsZDEuOCAgICAgICAgICB7cTh9LCBbcjJdLCByMwotICAgIHZyaGFkZC51OCAgICAgICBxMywgcTMsIHE0Ci0KLSAgICB2c3VibC51OCAgICAgICAgcTksIGQwLCBkMTAgICAgICAgICAgICAgICAgIDtkaWZmCi0gICAgdnN1YmwudTggICAgICAgIHExMCwgZDEsIGQxMQotICAgIHZzdWJsLnU4ICAgICAgICBxMTEsIGQyLCBkMTIKLSAgICB2c3VibC51OCAgICAgICAgcTEyLCBkMywgZDEzCi0KLSAgICB2c3VibC51OCAgICAgICAgcTAsIGQ0LCBkMTQgICAgICAgICAgICAgICAgIDtkaWZmCi0gICAgdnN1YmwudTggICAgICAgIHExLCBkNSwgZDE1Ci0gICAgdnN1YmwudTggICAgICAgIHE1LCBkNiwgZDE2Ci0gICAgdnN1YmwudTggICAgICAgIHE2LCBkNywgZDE3Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxOSAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMTgsIGQxOCAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExNSwgZDE5LCBkMTkKLQotICAgIHZwYWRhbC5zMTYgICAgICBxMTMsIHExMCAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMjAsIGQyMCAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExNSwgZDIxLCBkMjEKLQotICAgIHZwYWRhbC5zMTYgICAgICBxMTMsIHExMSAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMjIsIGQyMiAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExNSwgZDIzLCBkMjMKLQotICAgIHZwYWRhbC5zMTYgICAgICBxMTMsIHExMiAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMjQsIGQyNCAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExNSwgZDI1LCBkMjUKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZwYWRhbC5zMTYgICAgICBxMTMsIHEwICAgICAgICAgICAgICAgICAgICAgO3N1bQotICAgIHZtbGFsLnMxNiAgICAgICBxMTQsIGQwLCBkMCAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExNSwgZDEsIGQxCi0KLSAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxMSAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMiwgZDIgICAgICAgICAgICAgICAgO3NzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQzLCBkMwotCi0gICAgdnBhZGFsLnMxNiAgICAgIHExMywgcTUgICAgICAgICAgICAgICAgICAgICA7c3VtCi0gICAgdm1sYWwuczE2ICAgICAgIHExNCwgZDEwLCBkMTAgICAgICAgICAgICAgICAgO3NzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQxMSwgZDExCi0KLSAgICB2bW92ICAgICAgICAgICAgcTAsIHE0Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTEzLCBxNiAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBkMTIsIGQxMiAgICAgICAgICAgICAgICA7c3NlCi0gICAgdm1sYWwuczE2ICAgICAgIHExNSwgZDEzLCBkMTMKLQotICAgIGJuZSAgICAgICAgICAgICB2cDhfZmlsdDE2eDE2c180XzRfbG9vcF9uZW9uCi0KLSAgICB2YWRkLnUzMiAgICAgICAgcTE1LCBxMTQsIHExNSAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzc2UKLSAgICB2cGFkZGwuczMyICAgICAgcTAsIHExMyAgICAgICAgICAgICAgICAgICAgICA7YWNjdW11bGF0ZSBzdW0KLQotICAgIHZwYWRkbC51MzIgICAgICBxMSwgcTE1Ci0gICAgdmFkZC5zNjQgICAgICAgIGQwLCBkMCwgZDEKLSAgICB2YWRkLnU2NCAgICAgICAgZDEsIGQyLCBkMwotCi0gICAgdm11bGwuczMyICAgICAgIHE1LCBkMCwgZDAKLSAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgW2xyXSAgICAgICAgICAgICAgIDtzdG9yZSBzc2UKLSAgICB2c2hyLnMzMiAgICAgICAgZDEwLCBkMTAsICM4Ci0gICAgdnN1Yi5zMzIgICAgICAgIGQwLCBkMSwgZDEwCi0KLSAgICB2bW92LjMyICAgICAgICAgcjAsIGQwWzBdICAgICAgICAgICAgICAgICAgIDtyZXR1cm4KLSAgICBwb3AgICAgICAgICAgICAge3BjfQotICAgIEVORFAKLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyByMiAgICBpbnQgIHhvZmZzZXQsCi07IHIzICAgIGludCAgeW9mZnNldCwKLTsgc3RhY2sgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLTsgc3RhY2sgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi07IHN0YWNrIHVuc2lnbmVkIGludCAqc3NlCi07bm90ZTogaW4gdnA4X2ZpbmRfYmVzdF9oYWxmX3BpeGVsX3N0ZXAoKShjYWxsZWQgd2hlbiA4PFNwZWVkPDE1KSwgYW5kIGZpcnN0IGNhbGwgb2YgdnA4X2ZpbmRfYmVzdF9zdWJfcGl4ZWxfc3RlcCgpCi07KGNhbGxlZCB3aGVuIHNwZWVkPD04KS4geG9mZnNldC95b2Zmc2V0IGNhbiBvbmx5IGJlIDQgb3IgMCwgd2hpY2ggbWVhbnMgZWl0aGVyIGJ5IHBhc3MgdGhlIGZpbHRlciwKLTtvciBmaWx0ZXIgY29lZmYgaXMgezY0LCA2NH0uIFRoaXMgc2ltcGxpZmllZCBwcm9ncmFtIG9ubHkgd29ya3MgaW4gdGhpcyBzaXR1YXRpb24uCi07bm90ZTogSXQgaGFwcGVucyB0aGF0IGJvdGggeG9mZnNldCBhbmQgeW9mZnNldCBhcmUgemVyby4gVGhpcyBjYW4gYmUgaGFuZGxlZCBpbiBjIGNvZGUgbGF0ZXIuCi0KLXx2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb258IFBST0MKLSAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KLQotICAgIGxkciAgICAgICAgICAgICByNCwgW3NwLCAjOF0gICAgICAgICAgICA7bG9hZCAqZHN0X3B0ciBmcm9tIHN0YWNrCi0gICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjMTJdICAgICAgICAgIDtsb2FkIGRzdF9waXhlbHNfcGVyX2xpbmUgZnJvbSBzdGFjawotICAgIGxkciAgICAgICAgICAgICBsciwgW3NwLCAjMTZdICAgICAgICAgICA7bG9hZCAqc3NlIGZyb20gc3RhY2sKLQotICAgIGNtcCAgICAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBmaXJzdF9wYXNzIGZpbHRlciBpZiB4b2Zmc2V0PTAKLSAgICBiZXEgICAgICAgICAgICAgc2Vjb25kcGFzc19iZmlsdGVyMTZ4MTZzX29ubHkKLQotICAgIGNtcCAgICAgICAgICAgICByMywgIzAgICAgICAgICAgICAgICAgICA7c2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCi0gICAgYmVxICAgICAgICAgICAgIGZpcnN0cGFzc19iZmlsdGVyMTZ4MTZzX29ubHkKLQotICAgIHZsZDEudTggICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdLCByMSAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzI1NiAgICAgICAgICAgIDtyZXNlcnZlIHNwYWNlIG9uIHN0YWNrIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIHZleHQuOCAgICAgICAgICBxMSwgcTAsIHExLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbMV0KLSAgICBtb3YgICAgICAgICAgICAgcjMsIHNwCi0gICAgbW92ICAgICAgICAgICAgIHIyLCAjNCAgICAgICAgICAgICAgICAgIDtsb29wIGNvdW50ZXIKLSAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdK3NyY19wdHJbMV0pL3JvdW5kL3NoaWZ0IHJpZ2h0IDEKLQotO0ZpcnN0IFBhc3M6IG91dHB1dF9oZWlnaHQgbGluZXMgeCBvdXRwdXRfd2lkdGggY29sdW1ucyAoMTd4MTYpCi12cDhlX2ZpbHRfYmxrMmRfZnAxNngxNnNfbG9vcF9uZW9uCi0gICAgdmxkMS51OCAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkOCwgZDksIGQxMCwgZDExfSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjBdLCByMQotCi0gICAgO3BsZCAgICAgICAgICAgICAgICBbcjBdCi0gICAgO3BsZCAgICAgICAgICAgICAgICBbcjAsIHIxXQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQotCi0gICAgdmV4dC44ICAgICAgICAgIHEzLCBxMiwgcTMsICMxICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQotICAgIHZleHQuOCAgICAgICAgICBxNSwgcTQsIHE1LCAjMQotICAgIHZleHQuOCAgICAgICAgICBxNywgcTYsIHE3LCAjMQotICAgIHZleHQuOCAgICAgICAgICBxOSwgcTgsIHE5LCAjMQotCi0gICAgdnJoYWRkLnU4ICAgICAgIHExLCBxMiwgcTMgICAgICAgICAgICAgIDsoc3JjX3B0clswXStzcmNfcHRyWzFdKS9yb3VuZC9zaGlmdCByaWdodCAxCi0gICAgdnJoYWRkLnU4ICAgICAgIHEyLCBxNCwgcTUKLSAgICB2cmhhZGQudTggICAgICAgcTMsIHE2LCBxNwotICAgIHZyaGFkZC51OCAgICAgICBxNCwgcTgsIHE5Ci0KLSAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMQotICAgIHZyaGFkZC51OCAgICAgICBxMSwgcTEsIHEyCi0gICAgdnJoYWRkLnU4ICAgICAgIHEyLCBxMiwgcTMKLSAgICB2cmhhZGQudTggICAgICAgcTMsIHEzLCBxNAotCi0gICAgc3VicyAgICAgICAgICAgIHIyLCByMiwgIzEKLSAgICB2c3QxLnU4ICAgICAgICAge2QwLCBkMSAsZDIsIGQzfSwgW3IzXSEgICAgICAgICA7c3RvcmUgcmVzdWx0Ci0gICAgdm1vdiAgICAgICAgICAgIHEwLCBxNAotICAgIHZzdDEudTggICAgICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbcjNdIQotCi0gICAgYm5lICAgICAgICAgICAgIHZwOGVfZmlsdF9ibGsyZF9mcDE2eDE2c19sb29wX25lb24KLQotICAgIGIgICAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNnNfbmVvbgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZpcnN0cGFzc19iZmlsdGVyMTZ4MTZzX29ubHkKLSAgICBtb3YgICAgICAgICAgICAgcjIsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgotICAgIHN1YiAgICAgICAgICAgICBzcCwgc3AsICMyNTYgICAgICAgICAgICA7cmVzZXJ2ZSBzcGFjZSBvbiBzdGFjayBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UKLSAgICBtb3YgICAgICAgICAgICAgcjMsIHNwCi0KLTtGaXJzdCBQYXNzOiBvdXRwdXRfaGVpZ2h0IGxpbmVzIHggb3V0cHV0X3dpZHRoIGNvbHVtbnMgKDE2eDE2KQotdnA4ZV9maWx0X2JsazJkX2ZwbzE2eDE2c19sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQotICAgIHZsZDEudTggICAgICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTIsIGQxMywgZDE0LCBkMTV9LCBbcjBdLCByMQotCi0gICAgO3BsZCAgICAgICAgICAgICAgICBbcjBdCi0gICAgO3BsZCAgICAgICAgICAgICAgICBbcjAsIHIxXQotICAgIDtwbGQgICAgICAgICAgICAgICAgW3IwLCByMSwgbHNsICMxXQotCi0gICAgdmV4dC44ICAgICAgICAgIHExLCBxMCwgcTEsICMxICAgICAgICAgIDtjb25zdHJ1Y3Qgc3JjX3B0clsxXQotICAgIHZsZDEudTggICAgICAgICB7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3IwXSwgcjEKLSAgICB2ZXh0LjggICAgICAgICAgcTMsIHEyLCBxMywgIzEKLSAgICB2bGQxLnU4ICAgICAgICAge2QyMCwgZDIxLCBkMjIsIGQyM30sIFtyMF0sIHIxCi0gICAgdmV4dC44ICAgICAgICAgIHE1LCBxNCwgcTUsICMxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjQsIGQyNSwgZDI2LCBkMjd9LCBbcjBdLCByMQotICAgIHZleHQuOCAgICAgICAgICBxNywgcTYsIHE3LCAjMQotICAgIHZsZDEudTggICAgICAgICB7ZDI4LCBkMjksIGQzMCwgZDMxfSwgW3IwXSwgcjEKLSAgICB2ZXh0LjggICAgICAgICAgcTksIHE4LCBxOSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgcTExLCBxMTAsIHExMSwgIzEKLSAgICB2ZXh0LjggICAgICAgICAgcTEzLCBxMTIsIHExMywgIzEKLSAgICB2ZXh0LjggICAgICAgICAgcTE1LCBxMTQsIHExNSwgIzEKLQotICAgIHZyaGFkZC51OCAgICAgICBxMCwgcTAsIHExICAgICAgICAgICAgICA7KHNyY19wdHJbMF0rc3JjX3B0clsxXSkvcm91bmQvc2hpZnQgcmlnaHQgMQotICAgIHZyaGFkZC51OCAgICAgICBxMSwgcTIsIHEzCi0gICAgdnJoYWRkLnU4ICAgICAgIHEyLCBxNCwgcTUKLSAgICB2cmhhZGQudTggICAgICAgcTMsIHE2LCBxNwotICAgIHZyaGFkZC51OCAgICAgICBxNCwgcTgsIHE5Ci0gICAgdnJoYWRkLnU4ICAgICAgIHE1LCBxMTAsIHExMQotICAgIHZyaGFkZC51OCAgICAgICBxNiwgcTEyLCBxMTMKLSAgICB2cmhhZGQudTggICAgICAgcTcsIHExNCwgcTE1Ci0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnN0MS51OCAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyM10hICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbcjNdIQotICAgIHZzdDEudTggICAgICAgICB7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyM10hCi0gICAgdnN0MS51OCAgICAgICAgIHtkMTIsIGQxMywgZDE0LCBkMTV9LCBbcjNdIQotCi0gICAgYm5lICAgICAgICAgICAgIHZwOGVfZmlsdF9ibGsyZF9mcG8xNngxNnNfbG9vcF9uZW9uCi0KLSAgICBiICAgICAgICAgICAgICAgc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb24KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2Vjb25kcGFzc19iZmlsdGVyMTZ4MTZzX29ubHkKLSAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMjU2ICAgICAgICAgICAgO3Jlc2VydmUgc3BhY2Ugb24gc3RhY2sgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCi0KLSAgICBtb3YgICAgICAgICAgICAgcjIsICMyICAgICAgICAgICAgICAgICAgO2xvb3AgY291bnRlcgotICAgIHZsZDEudTggICAgICAgICB7ZDAsIGQxfSwgW3IwXSwgcjEgICAgICA7bG9hZCBzcmMgZGF0YQotICAgIG1vdiAgICAgICAgICAgICByMywgc3AKLQotdnA4ZV9maWx0X2JsazJkX3NwbzE2eDE2c19sb29wX25lb24KLSAgICB2bGQxLnU4ICAgICAgICAge2QyLCBkM30sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkNCwgZDV9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDYsIGQ3fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2Q4LCBkOX0sIFtyMF0sIHIxCi0KLSAgICB2cmhhZGQudTggICAgICAgcTAsIHEwLCBxMQotICAgIHZsZDEudTggICAgICAgICB7ZDEwLCBkMTF9LCBbcjBdLCByMQotICAgIHZyaGFkZC51OCAgICAgICBxMSwgcTEsIHEyCi0gICAgdmxkMS51OCAgICAgICAgIHtkMTIsIGQxM30sIFtyMF0sIHIxCi0gICAgdnJoYWRkLnU4ICAgICAgIHEyLCBxMiwgcTMKLSAgICB2bGQxLnU4ICAgICAgICAge2QxNCwgZDE1fSwgW3IwXSwgcjEKLSAgICB2cmhhZGQudTggICAgICAgcTMsIHEzLCBxNAotICAgIHZsZDEudTggICAgICAgICB7ZDE2LCBkMTd9LCBbcjBdLCByMQotICAgIHZyaGFkZC51OCAgICAgICBxNCwgcTQsIHE1Ci0gICAgdnJoYWRkLnU4ICAgICAgIHE1LCBxNSwgcTYKLSAgICB2cmhhZGQudTggICAgICAgcTYsIHE2LCBxNwotICAgIHZyaGFkZC51OCAgICAgICBxNywgcTcsIHE4Ci0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnN0MS51OCAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyM10hICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZtb3YgICAgICAgICAgICBxMCwgcTgKLSAgICB2c3QxLnU4ICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IzXSEKLSAgICB2c3QxLnU4ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjNdISAgICAgICAgICAgO3N0b3JlIHJlc3VsdAotICAgIHZzdDEudTggICAgICAgICB7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IzXSEKLQotICAgIGJuZSAgICAgICAgICAgICB2cDhlX2ZpbHRfYmxrMmRfc3BvMTZ4MTZzX2xvb3BfbmVvbgotCi0gICAgYiAgICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTE2eDE2c19uZW9uCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07dmFyaWFuY2UxNngxNgotc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb24KLSAgICB2bW92Lmk4ICAgICAgICAgcTgsICMwICAgICAgICAgICAgICAgICAgICAgIDtxOCAtIHN1bQotICAgIHZtb3YuaTggICAgICAgICBxOSwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E5LCBxMTAgLSBzc2UKLSAgICB2bW92Lmk4ICAgICAgICAgcTEwLCAjMAotCi0gICAgc3ViICAgICAgICAgICAgIHIzLCByMywgIzI1NgotICAgIG1vdiAgICAgICAgICAgICByMiwgIzQKLQotc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZzX25lb25fbG9vcAotICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjNdISAgICAgICAgICAgICAgICAgO0xvYWQgdXAgc291cmNlIGFuZCByZWZlcmVuY2UKLSAgICB2bGQxLjggICAgICAgICAge3ExfSwgW3I0XSwgcjEyCi0gICAgdmxkMS44ICAgICAgICAgIHtxMn0sIFtyM10hCi0gICAgdmxkMS44ICAgICAgICAgIHtxM30sIFtyNF0sIHIxMgotICAgIHZsZDEuOCAgICAgICAgICB7cTR9LCBbcjNdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTV9LCBbcjRdLCByMTIKLSAgICB2bGQxLjggICAgICAgICAge3E2fSwgW3IzXSEKLSAgICB2bGQxLjggICAgICAgICAge3E3fSwgW3I0XSwgcjEyCi0KLSAgICB2c3VibC51OCAgICAgICAgcTExLCBkMCwgZDIgICAgICAgICAgICAgICAgIDtkaWZmCi0gICAgdnN1YmwudTggICAgICAgIHExMiwgZDEsIGQzCi0gICAgdnN1YmwudTggICAgICAgIHExMywgZDQsIGQ2Ci0gICAgdnN1YmwudTggICAgICAgIHExNCwgZDUsIGQ3Ci0gICAgdnN1YmwudTggICAgICAgIHEwLCBkOCwgZDEwCi0gICAgdnN1YmwudTggICAgICAgIHExLCBkOSwgZDExCi0gICAgdnN1YmwudTggICAgICAgIHEyLCBkMTIsIGQxNAotICAgIHZzdWJsLnU4ICAgICAgICBxMywgZDEzLCBkMTUKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTExICAgICAgICAgICAgICAgICAgICAgO3N1bQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDIyLCBkMjIgICAgICAgICAgICAgICAgO3NzZQotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyMywgZDIzCi0KLSAgICBzdWJzICAgICAgICAgICAgcjIsIHIyLCAjMQotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxMTIKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQyNCwgZDI0Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDI1LCBkMjUKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExMwotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDI2LCBkMjYKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMjcsIGQyNwotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTE0Ci0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMjgsIGQyOAotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQyOSwgZDI5Ci0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEwICAgICAgICAgICAgICAgICAgICAgO3N1bQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDAsIGQwICAgICAgICAgICAgICAgIDtzc2UKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMSwgZDEKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHExCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMiwgZDIKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMywgZDMKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEyCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNCwgZDQKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkNSwgZDUKLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHEzCi0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNiwgZDYKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkNywgZDcKLQotICAgIGJuZSAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2UxNngxNnNfbmVvbl9sb29wCi0KLSAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxOSwgcTEwICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHNzZQotICAgIHZwYWRkbC5zMzIgICAgICBxMCwgcTggICAgICAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3VtCi0KLSAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAotICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCi0gICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKLQotICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtscl0gICAgICAgICAgICAgICA7c3RvcmUgc3NlCi0gICAgdnNoci5zMzIgICAgICAgIGQxMCwgZDEwLCAjOAotICAgIHZzdWIuczMyICAgICAgICBkMCwgZDEsIGQxMAotCi0gICAgYWRkICAgICAgICAgICAgIHNwLCBzcCwgIzI1NgotICAgIHZtb3YuMzIgICAgICAgICByMCwgZDBbMF0gICAgICAgICAgICAgICAgICAgO3JldHVybgotCi0gICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9Ci0gICAgRU5EUAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTh4OF9uZW9uLmFzbSBiL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlOHg4X25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmNmNTA1Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlOHg4X25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb258Ci0gICAgQVJNCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotOyByMCAgICB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLTsgcjEgICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyByMiAgICBpbnQgIHhvZmZzZXQsCi07IHIzICAgIGludCAgeW9mZnNldCwKLTsgc3RhY2socjQpIHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi07IHN0YWNrKHI1KSBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLTsgc3RhY2socjYpIHVuc2lnbmVkIGludCAqc3NlCi07bm90ZTogbW9zdCBvZiB0aGUgY29kZSBpcyBjb3BpZWQgZnJvbSBiaWxpbmVhcl9wcmVkaWN0OHg4X25lb24gYW5kIHZwOF92YXJpYW5jZTh4OF9uZW9uLgotCi18dnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9ufCBQUk9DCi0gICAgcHVzaCAgICAgICAgICAgIHtyNC1yNSwgbHJ9Ci0KLSAgICBhZHIgICAgICAgICAgICAgcjEyLCBCaWxpbmVhclRhcHNfY29lZmYKLSAgICBsZHIgICAgICAgICAgICAgcjQsIFtzcCwgIzEyXSAgICAgICAgICAgO2xvYWQgKmRzdF9wdHIgZnJvbSBzdGFjawotICAgIGxkciAgICAgICAgICAgICByNSwgW3NwLCAjMTZdICAgICAgICAgICA7bG9hZCBkc3RfcGl4ZWxzX3Blcl9saW5lIGZyb20gc3RhY2sKLSAgICBsZHIgICAgICAgICAgICAgbHIsIFtzcCwgIzIwXSAgICAgICAgICAgO2xvYWQgKnNzZSBmcm9tIHN0YWNrCi0KLSAgICBjbXAgICAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgO3NraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgYmVxICAgICAgICAgICAgIHNraXBfZmlyc3RwYXNzX2ZpbHRlcgotCi07Rmlyc3QgcGFzczogb3V0cHV0X2hlaWdodCBsaW5lcyB4IG91dHB1dF93aWR0aCBjb2x1bW5zICg5eDgpCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMTIsIHIyLCBsc2wgIzMgICAgIDtjYWxjdWxhdGUgZmlsdGVyIGxvY2F0aW9uCi0KLSAgICB2bGQxLnU4ICAgICAgICAge3ExfSwgW3IwXSwgcjEgICAgICAgICAgO2xvYWQgc3JjIGRhdGEKLSAgICB2bGQxLnUzMiAgICAgICAge2QzMX0sIFtyMl0gICAgICAgICAgICAgO2xvYWQgZmlyc3RfcGFzcyBmaWx0ZXIKLSAgICB2bGQxLnU4ICAgICAgICAge3EyfSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDAsIGQzMVswXSAgICAgICAgICAgICAgO2ZpcnN0X3Bhc3MgZmlsdGVyIChkMCBkMSkKLSAgICB2bGQxLnU4ICAgICAgICAge3EzfSwgW3IwXSwgcjEKLSAgICB2ZHVwLjggICAgICAgICAgZDEsIGQzMVs0XQotICAgIHZsZDEudTggICAgICAgICB7cTR9LCBbcjBdLCByMQotCi0gICAgdm11bGwudTggICAgICAgIHE2LCBkMiwgZDAgICAgICAgICAgICAgIDsoc3JjX3B0clswXSAqIEZpbHRlclswXSkKLSAgICB2bXVsbC51OCAgICAgICAgcTcsIGQ0LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDYsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE5LCBkOCwgZDAKLQotICAgIHZleHQuOCAgICAgICAgICBkMywgZDIsIGQzLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCi0gICAgdmV4dC44ICAgICAgICAgIGQ1LCBkNCwgZDUsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ3LCBkNiwgZDcsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ5LCBkOCwgZDksICMxCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQzLCBkMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDUsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkNywgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTksIGQ5LCBkMQotCi0gICAgdmxkMS51OCAgICAgICAgIHtxMX0sIFtyMF0sIHIxICAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdnFyc2hybi51MTYgICAgZDIyLCBxNiwgIzcgICAgICAgICAgICAgIDtzaGlmdC9yb3VuZC9zYXR1cmF0ZSB0byB1OAotICAgIHZsZDEudTggICAgICAgICB7cTJ9LCBbcjBdLCByMQotICAgIHZxcnNocm4udTE2ICAgIGQyMywgcTcsICM3Ci0gICAgdmxkMS51OCAgICAgICAgIHtxM30sIFtyMF0sIHIxCi0gICAgdnFyc2hybi51MTYgICAgZDI0LCBxOCwgIzcKLSAgICB2bGQxLnU4ICAgICAgICAge3E0fSwgW3IwXSwgcjEKLSAgICB2cXJzaHJuLnUxNiAgICBkMjUsIHE5LCAjNwotCi0gICAgO2ZpcnN0X3Bhc3MgZmlsdGVyaW5nIG9uIHRoZSByZXN0IDUtbGluZSBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtxNX0sIFtyMF0sIHIxCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTYsIGQyLCBkMCAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDQsIGQwCi0gICAgdm11bGwudTggICAgICAgIHE4LCBkNiwgZDAKLSAgICB2bXVsbC51OCAgICAgICAgcTksIGQ4LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxMCwgZDAKLQotICAgIHZleHQuOCAgICAgICAgICBkMywgZDIsIGQzLCAjMSAgICAgICAgICA7Y29uc3RydWN0IHNyY19wdHJbLTFdCi0gICAgdmV4dC44ICAgICAgICAgIGQ1LCBkNCwgZDUsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ3LCBkNiwgZDcsICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQ5LCBkOCwgZDksICMxCi0gICAgdmV4dC44ICAgICAgICAgIGQxMSwgZDEwLCBkMTEsICMxCi0KLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQzLCBkMSAgICAgICAgICAgICAgOyhzcmNfcHRyWzFdICogRmlsdGVyWzFdKQotICAgIHZtbGFsLnU4ICAgICAgICBxNywgZDUsIGQxCi0gICAgdm1sYWwudTggICAgICAgIHE4LCBkNywgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTksIGQ5LCBkMQotICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQxMSwgZDEKLQotICAgIHZxcnNocm4udTE2ICAgIGQyNiwgcTYsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJuLnUxNiAgICBkMjcsIHE3LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQyOCwgcTgsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDI5LCBxOSwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMzAsIHExMCwgIzcKLQotO1NlY29uZCBwYXNzOiA4eDgKLXNlY29uZHBhc3NfZmlsdGVyCi0gICAgY21wICAgICAgICAgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgIDtza2lwIHNlY29uZF9wYXNzIGZpbHRlciBpZiB5b2Zmc2V0PTAKLSAgICA7c2tpcF9zZWNvbmRwYXNzX2ZpbHRlcgotICAgIGJlcSAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2U4eDhfbmVvbgotCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMTIsIHIzLCBsc2wgIzMKLQotICAgIHZsZDEudTMyICAgICAgICB7ZDMxfSwgW3IzXSAgICAgICAgICAgICA7bG9hZCBzZWNvbmRfcGFzcyBmaWx0ZXIKLQotICAgIHZkdXAuOCAgICAgICAgICBkMCwgZDMxWzBdICAgICAgICAgICAgICA7c2Vjb25kX3Bhc3MgZmlsdGVyIHBhcmFtZXRlcnMgKGQwIGQxKQotICAgIHZkdXAuOCAgICAgICAgICBkMSwgZDMxWzRdCi0KLSAgICB2bXVsbC51OCAgICAgICAgcTEsIGQyMiwgZDAgICAgICAgICAgICAgOyhzcmNfcHRyWzBdICogRmlsdGVyWzBdKQotICAgIHZtdWxsLnU4ICAgICAgICBxMiwgZDIzLCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxMywgZDI0LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxNCwgZDI1LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxNSwgZDI2LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxNiwgZDI3LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxNywgZDI4LCBkMAotICAgIHZtdWxsLnU4ICAgICAgICBxOCwgZDI5LCBkMAotCi0gICAgdm1sYWwudTggICAgICAgIHExLCBkMjMsIGQxICAgICAgICAgICAgIDsoc3JjX3B0cltwaXhlbF9zdGVwXSAqIEZpbHRlclsxXSkKLSAgICB2bWxhbC51OCAgICAgICAgcTIsIGQyNCwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTMsIGQyNSwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTQsIGQyNiwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTUsIGQyNywgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTYsIGQyOCwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTcsIGQyOSwgZDEKLSAgICB2bWxhbC51OCAgICAgICAgcTgsIGQzMCwgZDEKLQotICAgIHZxcnNocm4udTE2ICAgIGQyMiwgcTEsICM3ICAgICAgICAgICAgICA7c2hpZnQvcm91bmQvc2F0dXJhdGUgdG8gdTgKLSAgICB2cXJzaHJuLnUxNiAgICBkMjMsIHEyLCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQyNCwgcTMsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDI1LCBxNCwgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMjYsIHE1LCAjNwotICAgIHZxcnNocm4udTE2ICAgIGQyNywgcTYsICM3Ci0gICAgdnFyc2hybi51MTYgICAgZDI4LCBxNywgIzcKLSAgICB2cXJzaHJuLnUxNiAgICBkMjksIHE4LCAjNwotCi0gICAgYiAgICAgICAgICAgICAgIHN1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9uCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLQotc2tpcF9maXJzdHBhc3NfZmlsdGVyCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjJ9LCBbcjBdLCByMSAgICAgICAgIDtsb2FkIHNyYyBkYXRhCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjN9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDI0fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2QyNX0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjZ9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDI3fSwgW3IwXSwgcjEKLSAgICB2bGQxLnU4ICAgICAgICAge2QyOH0sIFtyMF0sIHIxCi0gICAgdmxkMS51OCAgICAgICAgIHtkMjl9LCBbcjBdLCByMQotICAgIHZsZDEudTggICAgICAgICB7ZDMwfSwgW3IwXSwgcjEKLQotICAgIGIgICAgICAgICAgICAgICBzZWNvbmRwYXNzX2ZpbHRlcgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotO3ZwOF92YXJpYW5jZTh4OF9uZW9uCi1zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfbmVvbgotICAgIHZtb3YuaTggICAgICAgICBxOCwgIzAgICAgICAgICAgICAgICAgICAgICAgO3E4IC0gc3VtCi0gICAgdm1vdi5pOCAgICAgICAgIHE5LCAjMCAgICAgICAgICAgICAgICAgICAgICA7cTksIHExMCAtIHNzZQotICAgIHZtb3YuaTggICAgICAgICBxMTAsICMwCi0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMgotCi1zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfbmVvbl9sb29wCi0gICAgdmxkMS44ICAgICAgICAgIHtkMH0sIFtyNF0sIHI1ICAgICAgICAgICAgICA7bG9hZCBkc3QgZGF0YQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLSAgICB2bGQxLjggICAgICAgICAge2QxfSwgW3I0XSwgcjUKLSAgICB2bGQxLjggICAgICAgICAge2QyfSwgW3I0XSwgcjUKLSAgICB2c3VibC51OCAgICAgICAgcTQsIGQyMiwgZDAgICAgICAgICAgICAgICAgIDtjYWxjdWxhdGUgZGlmZgotICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCBbcjRdLCByNQotCi0gICAgdnN1YmwudTggICAgICAgIHE1LCBkMjMsIGQxCi0gICAgdnN1YmwudTggICAgICAgIHE2LCBkMjQsIGQyCi0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHE0ICAgICAgICAgICAgICAgICAgICAgIDtzdW0KLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQ4LCBkOCAgICAgICAgICAgICAgICAgIDtzc2UKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkOSwgZDkKLQotICAgIHZzdWJsLnU4ICAgICAgICBxNywgZDI1LCBkMwotCi0gICAgdnBhZGFsLnMxNiAgICAgIHE4LCBxNQotICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDEwLCBkMTAKLSAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkMTEsIGQxMQotCi0gICAgdm1vdiAgICAgICAgICAgIHExMSwgcTEzCi0KLSAgICB2cGFkYWwuczE2ICAgICAgcTgsIHE2Ci0gICAgdm1sYWwuczE2ICAgICAgIHE5LCBkMTIsIGQxMgotICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQxMywgZDEzCi0KLSAgICB2bW92ICAgICAgICAgICAgcTEyLCBxMTQKLQotICAgIHZwYWRhbC5zMTYgICAgICBxOCwgcTcKLSAgICB2bWxhbC5zMTYgICAgICAgcTksIGQxNCwgZDE0Ci0gICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDE1LCBkMTUKLQotICAgIGJuZSAgICAgICAgICAgICBzdWJfcGl4ZWxfdmFyaWFuY2U4eDhfbmVvbl9sb29wCi0KLSAgICB2YWRkLnUzMiAgICAgICAgcTEwLCBxOSwgcTEwICAgICAgICAgICAgICAgIDthY2N1bXVsYXRlIHNzZQotICAgIHZwYWRkbC5zMzIgICAgICBxMCwgcTggICAgICAgICAgICAgICAgICAgICAgO2FjY3VtdWxhdGUgc3VtCi0KLSAgICB2cGFkZGwudTMyICAgICAgcTEsIHExMAotICAgIHZhZGQuczY0ICAgICAgICBkMCwgZDAsIGQxCi0gICAgdmFkZC51NjQgICAgICAgIGQxLCBkMiwgZDMKLQotICAgIHZtdWxsLnMzMiAgICAgICBxNSwgZDAsIGQwCi0gICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sIFtscl0gICAgICAgICAgICAgICA7c3RvcmUgc3NlCi0gICAgdnNoci5zMzIgICAgICAgIGQxMCwgZDEwLCAjNgotICAgIHZzdWIuczMyICAgICAgICBkMCwgZDEsIGQxMAotCi0gICAgdm1vdi4zMiAgICAgICAgIHIwLCBkMFswXSAgICAgICAgICAgICAgICAgICA7cmV0dXJuCi0gICAgcG9wICAgICAgICAgICAgIHtyNC1yNSwgcGN9Ci0KLSAgICBFTkRQCi0KLTstLS0tLS0tLS0tLS0tLS0tLQotCi1iaWxpbmVhcl90YXBzX2NvZWZmCi0gICAgRENEICAgICAxMjgsIDAsIDExMiwgMTYsIDk2LCAzMiwgODAsIDQ4LCA2NCwgNjQsIDQ4LCA4MCwgMzIsIDk2LCAxNiwgMTEyCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS9waWNrbHBmX2FybS5jIGIvdnA4L2VuY29kZXIvYXJtL3BpY2tscGZfYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjM3MGMuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXJtL3BpY2tscGZfYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvb255eF9pbnQuaCIKLSNpbmNsdWRlICJ2cDgvZW5jb2Rlci9xdWFudGl6ZS5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgInZweF9zY2FsZS95djEyZXh0ZW5kLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIgotCi1leHRlcm4gdm9pZCB2cDhfbWVtY3B5X25lb24odW5zaWduZWQgY2hhciAqZHN0X3B0ciwgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHN6KTsKLQotCi12b2lkCi12cHh5djEyX2NvcHlfcGFydGlhbF9mcmFtZV9uZW9uKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjLCBpbnQgRnJhY3Rpb24pCi17Ci0gICAgdW5zaWduZWQgY2hhciAqc3JjX3ksICpkc3RfeTsKLSAgICBpbnQgeWhlaWdodDsKLSAgICBpbnQgeXN0cmlkZTsKLSAgICBpbnQgYm9yZGVyOwotICAgIGludCB5b2Zmc2V0OwotICAgIGludCBsaW5lc3RvY29weTsKLQotICAgIGJvcmRlciAgID0gc3JjX3liYy0+Ym9yZGVyOwotICAgIHloZWlnaHQgID0gc3JjX3liYy0+eV9oZWlnaHQ7Ci0gICAgeXN0cmlkZSAgPSBzcmNfeWJjLT55X3N0cmlkZTsKLQotICAgIGxpbmVzdG9jb3B5ID0gKHloZWlnaHQgPj4gKEZyYWN0aW9uICsgNCkpOwotCi0gICAgaWYgKGxpbmVzdG9jb3B5IDwgMSkKLSAgICAgICAgbGluZXN0b2NvcHkgPSAxOwotCi0gICAgbGluZXN0b2NvcHkgPDw9IDQ7Ci0KLSAgICB5b2Zmc2V0ICA9IHlzdHJpZGUgKiAoKHloZWlnaHQgPj4gNSkgKiAxNiAtIDgpOwotICAgIHNyY195ID0gc3JjX3liYy0+eV9idWZmZXIgKyB5b2Zmc2V0OwotICAgIGRzdF95ID0gZHN0X3liYy0+eV9idWZmZXIgKyB5b2Zmc2V0OwotCi0gICAgLy92cHhfbWVtY3B5IChkc3RfeSwgc3JjX3ksIHlzdHJpZGUgKiAobGluZXN0b2NvcHkgKzE2KSk7Ci0gICAgdnA4X21lbWNweV9uZW9uKCh1bnNpZ25lZCBjaGFyICopZHN0X3ksICh1bnNpZ25lZCBjaGFyICopc3JjX3ksIChpbnQpKHlzdHJpZGUgKihsaW5lc3RvY29weSArIDE2KSkpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL3F1YW50aXplX2FybS5jIGIvdnA4L2VuY29kZXIvYXJtL3F1YW50aXplX2FybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTMzMzRhLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9xdWFudGl6ZV9hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvcXVhbnRpemUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHkuaCIKLQotREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X3J2c3BsdXMxX2RlZmF1bHRfemlnX3phZzFkWzE2XSkgPQotewotICAgIDEsICAyLCAgNiwgIDcsCi0gICAgMywgIDUsICA4LCAgMTMsCi0gICAgNCwgIDksICAxMiwgMTQsCi0gICAgMTAsIDExLCAxNSwgMTYsCi19OwotCi0KLWV4dGVybiBpbnQgdnA4X2Zhc3RfcXVhbnRpemVfYl9uZW9uX2Z1bmMoc2hvcnQgKmNvZWZmX3B0ciwgc2hvcnQgKnpiaW5fcHRyLCBzaG9ydCAqcWNvZWZmX3B0ciwgc2hvcnQgKmRxY29lZmZfcHRyLCBzaG9ydCAqZGVxdWFudF9wdHIsIGNvbnN0IHNob3J0ICpzY2FuX21hc2ssIHNob3J0ICpyb3VuZF9wdHIsIHNob3J0ICpxdWFudF9wdHIpOwotCi12b2lkIHZwOF9mYXN0X3F1YW50aXplX2JfbmVvbihCTE9DSyAqYiwgQkxPQ0tEICpkKQotewotICAgIGQtPmVvYiA9IHZwOF9mYXN0X3F1YW50aXplX2JfbmVvbl9mdW5jKGItPmNvZWZmLCBiLT56YmluLCBkLT5xY29lZmYsIGQtPmRxY29lZmYsIGQtPmRlcXVhbnQsIHZwOF9ydnNwbHVzMV9kZWZhdWx0X3ppZ196YWcxZCwgYi0+cm91bmQsIGItPnF1YW50X2Zhc3QpOwotfQotCi0vKgotLy9uZW9uIGNvZGUgaXMgd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyByZXdyaXR0ZW4gYyBjb2RlCi12b2lkIHZwOF9mYXN0X3F1YW50aXplX2JfbmVvbihCTE9DSyAqYixCTE9DS0QgKmQpCi17Ci0gICAgaW50IGksIHJjLCBlb2I7Ci0gICAgaW50IHpiaW47Ci0gICAgaW50IHgsIHgxLCB5LCB6LCBzejsKLSAgICBzaG9ydCAqY29lZmZfcHRyICA9ICZiLT5Db2VmZlswXTsKLSAgICBzaG9ydCAqemJpbl9wdHIgICA9ICZiLT5aYmluWzBdWzBdOwotICAgIHNob3J0ICpyb3VuZF9wdHIgID0gJmItPlJvdW5kWzBdWzBdOwotICAgIHNob3J0ICpxdWFudF9wdHIgID0gJmItPlF1YW50WzBdWzBdOwotICAgIHNob3J0ICpxY29lZmZfcHRyID0gZC0+cWNvZWZmOwotICAgIHNob3J0ICpkcWNvZWZmX3B0cj0gZC0+ZHFjb2VmZjsKLSAgICBzaG9ydCAqZGVxdWFudF9wdHI9ICZkLT5EZXF1YW50WzBdWzBdOwotCi0gICAgZW9iID0gMDsKLQotICAgIGZvcihpPTA7aTwxNjtpKyspCi0gICAgewotICAgICAgICB6ICAgID0gY29lZmZfcHRyW2ldOwotICAgICAgICB6YmluID0gemJpbl9wdHJbaV0gOwotICAgICAgICB4ICA9IGFicyh6KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4ID0gYWJzKHopCi0KLSAgICAgICAgaWYoeD49emJpbikKLSAgICAgICAgewotICAgICAgICAgICAgc3ogPSAoej4+MzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduIG9mIHoKLSAgICAgICAgICAgIHkgID0gKCh4K3JvdW5kX3B0cltpXSkqcXVhbnRfcHRyW2ldKT4+MTY7ICAgICAvLyBxdWFudGl6ZSAoeCkKLSAgICAgICAgICAgIHgxICA9ICh5XnN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzaWduIGJhY2sKLQotICAgICAgICAgICAgcWNvZWZmX3B0cltpXSA9IHgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgIGRxY29lZmZfcHRyW2ldID0geDEgKiBkZXF1YW50X3B0cltpXTsgICAgICAgICAvLyBkZXF1YW50aXplZCB2YWx1ZQotCi0gICAgICAgICAgICBpZih5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGVvYjx2cDhfcnZzcGx1czFfZGVmYXVsdF96aWdfemFnMWRbaV0pCi0gICAgICAgICAgICAgICAgICAgIGVvYj0oaW50KXZwOF9ydnNwbHVzMV9kZWZhdWx0X3ppZ196YWcxZFtpXTsgICAgICAgICAvLyBsYXN0IG5vbnplcm8gY29lZmZzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH1lbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFjb2VmZl9wdHJbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgIGRxY29lZmZfcHRyW2ldID0gMDsgICAgICAgICAvLyBkZXF1YW50aXplZCB2YWx1ZQotICAgICAgICB9Ci0gICAgfQotICAgICAgICBkLT5lb2IgPSBlb2I7Ci19Ci0qLwpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL3F1YW50aXplX2FybS5oIGIvdnA4L2VuY29kZXIvYXJtL3F1YW50aXplX2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZhZGY0Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS9xdWFudGl6ZV9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIFFVQU5USVpFX0FSTV9ICi0jZGVmaW5lIFFVQU5USVpFX0FSTV9ICi0KLSNpZiBIQVZFX0FSTVY2Ci0KLWV4dGVybiBwcm90b3R5cGVfcXVhbnRpemVfYmxvY2sodnA4X2Zhc3RfcXVhbnRpemVfYl9hcm12Nik7Ci0KLSN1bmRlZiAgdnA4X3F1YW50aXplX2Zhc3RxdWFudGIKLSNkZWZpbmUgdnA4X3F1YW50aXplX2Zhc3RxdWFudGIgdnA4X2Zhc3RfcXVhbnRpemVfYl9hcm12NgotCi0jZW5kaWYgLyogSEFWRV9BUk1WNiAqLwotCi0KLSNpZiBIQVZFX0FSTVY3Ci1leHRlcm4gcHJvdG90eXBlX3F1YW50aXplX2Jsb2NrKHZwOF9mYXN0X3F1YW50aXplX2JfbmVvbik7Ci0KLS8qIFRoZSBuZW9uIHF1YW50aXplciBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBtYXRjaCB0aGUgbmV3IGV4YWN0Ci0gKiBxdWFudGl6ZXIgaW50cm9kdWNlZCBpbiBjb21taXQgZTA0ZTI5MzUKLSAqLwotLy8jdW5kZWYgIHZwOF9xdWFudGl6ZV9mYXN0cXVhbnRiCi0vLyNkZWZpbmUgdnA4X3F1YW50aXplX2Zhc3RxdWFudGIgdnA4X2Zhc3RfcXVhbnRpemVfYl9uZW9uCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FybS92YXJpYW5jZV9hcm0uYyBiL3ZwOC9lbmNvZGVyL2FybS92YXJpYW5jZV9hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3YmU5Zi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9hcm0vdmFyaWFuY2VfYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9lbmNvZGVyL3ZhcmlhbmNlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9maWx0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uaCIKLQotI2lmIEhBVkVfQVJNVjYKLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYXJtdjYKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgZmlyc3RfcGFzc1sxMCo4XTsKLSAgICB1bnNpZ25lZCBjaGFyICBzZWNvbmRfcGFzc1s4KjhdOwotICAgIGNvbnN0IHNob3J0ICpIRmlsdGVyLCAqVkZpbHRlcjsKLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3NfYXJtdjYoc3JjX3B0ciwgZmlyc3RfcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOCwgSEZpbHRlcik7Ci0gICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzc19hcm12NihmaXJzdF9wYXNzLCBzZWNvbmRfcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDgsIDgsIFZGaWx0ZXIpOwotCi0gICAgcmV0dXJuIHZwOF92YXJpYW5jZTh4OF9hcm12NihzZWNvbmRfcGFzcywgOCwgZHN0X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9hcm12NgotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLSkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBmaXJzdF9wYXNzWzM2KjE2XTsKLSAgICB1bnNpZ25lZCBjaGFyICBzZWNvbmRfcGFzc1syMCoxNl07Ci0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsICpWRmlsdGVyOwotICAgIHVuc2lnbmVkIGludCB2YXI7Ci0KLSAgICBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZhciA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9hcm12NihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeG9mZnNldCA9PSAwICYmIHlvZmZzZXQgPT0gNCkKLSAgICB7Ci0gICAgICAgIHZhciA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9hcm12NihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKLSAgICB7Ci0gICAgICAgIHZhciA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfYXJtdjYoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICAgICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOwotCi0gICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzc19hcm12NihzcmNfcHRyLCBmaXJzdF9wYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCAxNiwgSEZpbHRlcik7Ci0gICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3NfYXJtdjYoZmlyc3RfcGFzcywgc2Vjb25kX3Bhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE2LCAxNiwgVkZpbHRlcik7Ci0KLSAgICAgICAgdmFyID0gdnA4X3ZhcmlhbmNlMTZ4MTZfYXJtdjYoc2Vjb25kX3Bhc3MsIDE2LCBkc3RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhcjsKLX0KLQotI2VuZGlmIC8qIEhBVkVfQVJNVjYgKi8KLQotCi0jaWYgSEFWRV9BUk1WNwotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24KLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSAwKQotICAgIHJldHVybiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfbmVvbihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCBzc2UpOwotICBlbHNlIGlmICh4b2Zmc2V0ID09IDAgJiYgeW9mZnNldCA9PSA0KQotICAgIHJldHVybiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbihzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCBzc2UpOwotICBlbHNlIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSA0KQotICAgIHJldHVybiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X25lb24oc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLSAgZWxzZQotICAgIHJldHVybiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9mdW5jKHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYXJtL3ZhcmlhbmNlX2FybS5oIGIvdnA4L2VuY29kZXIvYXJtL3ZhcmlhbmNlX2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRlMjc0Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2FybS92YXJpYW5jZV9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBWQVJJQU5DRV9BUk1fSAotI2RlZmluZSBWQVJJQU5DRV9BUk1fSAotCi0jaWYgSEFWRV9BUk1WNgotCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkMTZ4MTZfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2UxNngxNl9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZTh4OF9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9hcm12Nik7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2FybXY2KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X21zZTE2eDE2X2FybXY2KTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNngxNiB2cDhfc2FkMTZ4MTZfYXJtdjYKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjE2eDE2IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9hcm12NgotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3ZhcjE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXIxNngxNiB2cDhfdmFyaWFuY2UxNngxNl9hcm12NgotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9tc2UxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfbXNlMTZ4MTYgdnA4X21zZTE2eDE2X2FybXY2Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3Zhcjh4OAotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyOHg4IHZwOF92YXJpYW5jZTh4OF9hcm12NgotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaAotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2FybXY2Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYXJtdjYKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12NgotCi0jZW5kaWYgLyogIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QgKi8KLQotI2VuZGlmIC8qIEhBVkVfQVJNVjYgKi8KLQotCi0jaWYgSEFWRV9BUk1WNwotZXh0ZXJuIHByb3RvdHlwZV9zYWQodnA4X3NhZDR4NF9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9zYWQ4eDhfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkOHgxNl9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9zYWQxNng4X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9zYWQodnA4X3NhZDE2eDE2X25lb24pOwotCi0vL2V4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlNHg0X2MpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2U4eDhfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZTh4MTZfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZTE2eDhfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZTE2eDE2X25lb24pOwotCi0vL2V4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9uZW9uKTsKLS8vZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9jKTsKLS8vZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9jKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbl9mdW5jKTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX25lb24pOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbmVvbik7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfbmVvbik7Ci0KLS8vZXh0ZXJuIHByb3RvdHlwZV9nZXRtYnNzKHZwOF9nZXRfbWJfc3NfYyk7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF9tc2UxNngxNl9uZW9uKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9nZXQxNngxNnByZWRfZXJyb3JfbmVvbik7Ci0vL2V4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UyKHZwOF9nZXQ4eDh2YXJfYyk7Ci0vL2V4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UyKHZwOF9nZXQxNngxNnZhcl9jKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9nZXQ0eDRzc2VfY3NfbmVvbik7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkNHg0Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ0eDQgdnA4X3NhZDR4NF9uZW9uCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDh4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkOHg4IHZwOF9zYWQ4eDhfbmVvbgotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ4eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDE2IHZwOF9zYWQ4eDE2X25lb24KLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkMTZ4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4OCB2cDhfc2FkMTZ4OF9uZW9uCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNngxNiB2cDhfc2FkMTZ4MTZfbmVvbgotCi0vLyN1bmRlZiAgdnA4X3ZhcmlhbmNlX3ZhcjR4NAotLy8jZGVmaW5lIHZwOF92YXJpYW5jZV92YXI0eDQgdnA4X3ZhcmlhbmNlNHg0X2MKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyOHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXI4eDggdnA4X3ZhcmlhbmNlOHg4X25lb24KLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyOHgxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyOHgxNiB2cDhfdmFyaWFuY2U4eDE2X25lb24KLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyMTZ4OAotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyMTZ4OCB2cDhfdmFyaWFuY2UxNng4X25lb24KLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3ZhcjE2eDE2IHZwOF92YXJpYW5jZTE2eDE2X25lb24KLQotLy8jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI0eDQKLS8vI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyNHg0IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfYwotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X25lb24KLQotLy8jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDE2Ci0vLyNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYwotCi0vLyN1bmRlZiAgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjE2eDgKLS8vI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9jCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zdWJwaXh2YXIxNngxNiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbmVvbgotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaAotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX25lb24KLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3YKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9uZW9uCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odgotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfbmVvbgotCi0vLyN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldG1ic3MKLS8vI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0bWJzcyB2cDhfZ2V0X21iX3NzX2MKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfbXNlMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX21zZTE2eDE2IHZwOF9tc2UxNngxNl9uZW9uCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldDE2eDE2cHJlZGVycm9yCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXQxNngxNnByZWRlcnJvciB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX25lb24KLQotLy8jdW5kZWYgIHZwOF92YXJpYW5jZV9nZXQ4eDh2YXIKLS8vI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0OHg4dmFyIHZwOF9nZXQ4eDh2YXJfYwotCi0vLyN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldDE2eDE2dmFyCi0vLyNkZWZpbmUgdnA4X3ZhcmlhbmNlX2dldDE2eDE2dmFyIHZwOF9nZXQxNngxNnZhcl9jCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldDR4NHNzZV9jcwotI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0NHg0c3NlX2NzIHZwOF9nZXQ0eDRzc2VfY3NfbmVvbgotI2VuZGlmCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2FzbV9lbmNfb2Zmc2V0cy5jIGIvdnA4L2VuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODFjOGQuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYXNtX2VuY19vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJibG9jay5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vYmxvY2tkLmgiCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLSNpbmNsdWRlICJ0cmVld3JpdGVyLmgiCi0jaW5jbHVkZSAidG9rZW5pemUuaCIKLQotI2RlZmluZSBjdF9hc3NlcnQobmFtZSxjb25kKSBcCi0gICAgc3RhdGljIHZvaWQgYXNzZXJ0XyMjbmFtZSh2b2lkKSBVTlVTRUQ7XAotICAgIHN0YXRpYyB2b2lkIGFzc2VydF8jI25hbWUodm9pZCkge3N3aXRjaCgwKXtjYXNlIDA6Y2FzZSAhIShjb25kKTo7fX0KLQotI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIGludCBzeW0gPSB2YWw7Ci0KLS8qCi0jZGVmaW5lIEJMQU5LKCkgYXNtIHZvbGF0aWxlKCJcbi0+IiA6IDogKQotKi8KLQotLyoKLSAqIGludCBtYWluKHZvaWQpCi0gKiB7Ci0gKi8KLQotLy9yZWd1bGFyIHF1YW50aXplCi1ERUZJTkUodnA4X2Jsb2NrX2NvZWZmLCAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgY29lZmYpKTsKLURFRklORSh2cDhfYmxvY2tfemJpbiwgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCB6YmluKSk7Ci1ERUZJTkUodnA4X2Jsb2NrX3JvdW5kLCAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgcm91bmQpKTsKLURFRklORSh2cDhfYmxvY2tfcXVhbnQsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCBxdWFudCkpOwotREVGSU5FKHZwOF9ibG9ja19xdWFudF9mYXN0LCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0ssIHF1YW50X2Zhc3QpKTsKLURFRklORSh2cDhfYmxvY2tfemJpbl9leHRyYSwgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCB6YmluX2V4dHJhKSk7Ci1ERUZJTkUodnA4X2Jsb2NrX3pydW5femJpbl9ib29zdCwgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgenJ1bl96YmluX2Jvb3N0KSk7Ci1ERUZJTkUodnA4X2Jsb2NrX3F1YW50X3NoaWZ0LCAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgcXVhbnRfc2hpZnQpKTsKLQotREVGSU5FKHZwOF9ibG9ja2RfcWNvZWZmLCAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0tELCBxY29lZmYpKTsKLURFRklORSh2cDhfYmxvY2tkX2RlcXVhbnQsICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLRCwgZGVxdWFudCkpOwotREVGSU5FKHZwOF9ibG9ja2RfZHFjb2VmZiwgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0tELCBkcWNvZWZmKSk7Ci1ERUZJTkUodnA4X2Jsb2NrZF9lb2IsICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DS0QsIGVvYikpOwotCi0vLyBzdWJ0cmFjdAotREVGSU5FKHZwOF9ibG9ja19iYXNlX3NyYywgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQkxPQ0ssIGJhc2Vfc3JjKSk7Ci1ERUZJTkUodnA4X2Jsb2NrX3NyYywgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgc3JjKSk7Ci1ERUZJTkUodnA4X2Jsb2NrX3NyY19kaWZmLCAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihCTE9DSywgc3JjX2RpZmYpKTsKLURFRklORSh2cDhfYmxvY2tfc3JjX3N0cmlkZSwgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLLCBzcmNfc3RyaWRlKSk7Ci0KLURFRklORSh2cDhfYmxvY2tkX3ByZWRpY3RvciwgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKEJMT0NLRCwgcHJlZGljdG9yKSk7Ci0KLS8vcGFjayB0b2tlbnMKLURFRklORSh2cDhfd3JpdGVyX2xvd3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF93cml0ZXIsIGxvd3ZhbHVlKSk7Ci1ERUZJTkUodnA4X3dyaXRlcl9yYW5nZSwgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfd3JpdGVyLCByYW5nZSkpOwotREVGSU5FKHZwOF93cml0ZXJfdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YodnA4X3dyaXRlciwgdmFsdWUpKTsKLURFRklORSh2cDhfd3JpdGVyX2NvdW50LCAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF93cml0ZXIsIGNvdW50KSk7Ci1ERUZJTkUodnA4X3dyaXRlcl9wb3MsICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfd3JpdGVyLCBwb3MpKTsKLURFRklORSh2cDhfd3JpdGVyX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF93cml0ZXIsIGJ1ZmZlcikpOwotCi1ERUZJTkUodG9rZW5leHRyYV90b2tlbiwgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihUT0tFTkVYVFJBLCBUb2tlbikpOwotREVGSU5FKHRva2VuZXh0cmFfZXh0cmEsICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5FWFRSQSwgRXh0cmEpKTsKLURFRklORSh0b2tlbmV4dHJhX2NvbnRleHRfdHJlZSwgICAgICAgICAgICAgICAgIG9mZnNldG9mKFRPS0VORVhUUkEsIGNvbnRleHRfdHJlZSkpOwotREVGSU5FKHRva2VuZXh0cmFfc2tpcF9lb2Jfbm9kZSwgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5FWFRSQSwgc2tpcF9lb2Jfbm9kZSkpOwotREVGSU5FKFRPS0VORVhUUkFfU1osICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRPS0VORVhUUkEpKTsKLQotREVGSU5FKHZwOF9leHRyYV9iaXRfc3RydWN0X3N6LCAgICAgICAgICAgICAgICAgc2l6ZW9mKHZwOF9leHRyYV9iaXRfc3RydWN0KSk7Ci0KLURFRklORSh2cDhfdG9rZW5fdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF90b2tlbiwgdmFsdWUpKTsKLURFRklORSh2cDhfdG9rZW5fbGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF90b2tlbiwgTGVuKSk7Ci0KLURFRklORSh2cDhfZXh0cmFfYml0X3N0cnVjdF90cmVlLCAgICAgICAgICAgICAgIG9mZnNldG9mKHZwOF9leHRyYV9iaXRfc3RydWN0LCB0cmVlKSk7Ci1ERUZJTkUodnA4X2V4dHJhX2JpdF9zdHJ1Y3RfcHJvYiwgICAgICAgICAgICAgICBvZmZzZXRvZih2cDhfZXh0cmFfYml0X3N0cnVjdCwgcHJvYikpOwotREVGSU5FKHZwOF9leHRyYV9iaXRfc3RydWN0X2xlbiwgICAgICAgICAgICAgICAgb2Zmc2V0b2YodnA4X2V4dHJhX2JpdF9zdHJ1Y3QsIExlbikpOwotREVGSU5FKHZwOF9leHRyYV9iaXRfc3RydWN0X2Jhc2VfdmFsLCAgICAgICAgICAgb2Zmc2V0b2YodnA4X2V4dHJhX2JpdF9zdHJ1Y3QsIGJhc2VfdmFsKSk7Ci0KLURFRklORSh2cDhfY29tcF90cGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01QLCB0cGxpc3QpKTsKLURFRklORSh2cDhfY29tcF9jb21tb24sICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01QLCBjb21tb24pKTsKLURFRklORSh2cDhfY29tcF9iYzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01QLCBiYzIpKTsKLQotREVGSU5FKHRva2VubGlzdF9zdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5MSVNULCBzdGFydCkpOwotREVGSU5FKHRva2VubGlzdF9zdG9wLCAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVE9LRU5MSVNULCBzdG9wKSk7Ci1ERUZJTkUoVE9LRU5MSVNUX1NaLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVE9LRU5MSVNUKSk7Ci0KLURFRklORSh2cDhfY29tbW9uX21iX3Jvd3MsICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFZQOF9DT01NT04sIG1iX3Jvd3MpKTsKLQotLy8gVGhlc2UgdHdvIHNpemVzIGFyZSB1c2VkIGluIHZwOGN4X3BhY2tfdG9rZW5zLiAgVGhleSBhcmUgaGFyZCBjb2RlZAotLy8gc28gaWYgdGhlIHNpemUgY2hhbmdlcyB0aGlzIHdpbGwgaGF2ZSB0byBiZSBhZGp1c3RlZC4KLSNpZiBIQVZFX0FSTVY1VEUKLWN0X2Fzc2VydChUT0tFTkVYVFJBX1NaLCBzaXplb2YoVE9LRU5FWFRSQSkgPT0gOCkKLWN0X2Fzc2VydCh2cDhfZXh0cmFfYml0X3N0cnVjdF9zeiwgc2l6ZW9mKHZwOF9leHRyYV9iaXRfc3RydWN0KSA9PSAxNikKLSNlbmRpZgotCi0vL2FkZCBhc3NlcnRzIGZvciBhbnkgb2Zmc2V0IHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBhc3NlbWJseSBjb2RlCi0vL2FkZCBhc3NlcnRzIGZvciBhbnkgc2l6ZSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXNzZW1ibHkgY29kZQotLyoKLSAqIHJldHVybiAwOwotICogfQotICovCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9iaXRzdHJlYW0uYyBiL3ZwOC9lbmNvZGVyL2JpdHN0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJkMTA2Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2JpdHN0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcyOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9jb21tb24vaGVhZGVyLmgiCi0jaW5jbHVkZSAiZW5jb2RlbXYuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9maW5kbmVhcm12LmgiCi0jaW5jbHVkZSAibWNvbXAuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAidnA4L2NvbW1vbi9wcmFnbWFzLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0jaW5jbHVkZSAiYml0c3RyZWFtLmgiCi0KLWNvbnN0IGludCB2cDhjeF9iYXNlX3NraXBfZmFsc2VfcHJvYlsxMjhdID0KLXsKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTEsIDI0OCwgMjQ0LCAyNDAsIDIzNiwgMjMyLCAyMjksIDIyNSwKLSAgICAyMjEsIDIxNywgMjEzLCAyMDgsIDIwNCwgMTk5LCAxOTQsIDE5MCwKLSAgICAxODcsIDE4MywgMTc5LCAxNzUsIDE3MiwgMTY4LCAxNjQsIDE2MCwKLSAgICAxNTcsIDE1MywgMTQ5LCAxNDUsIDE0MiwgMTM4LCAxMzQsIDEzMCwKLSAgICAxMjcsIDEyNCwgMTIwLCAxMTcsIDExNCwgMTEwLCAxMDcsIDEwNCwKLSAgICAxMDEsIDk4LCAgOTUsICA5MiwgIDg5LCAgODYsICA4MywgODAsCi0gICAgNzcsICA3NCwgIDcxLCAgNjgsICA2NSwgIDYyLCAgNTksIDU2LAotICAgIDUzLCAgNTAsICA0NywgIDQ0LCAgNDEsICAzOCwgIDM1LCAzMiwKLSAgICAzMCwgIDI4LCAgMjYsICAyNCwgIDIyLCAgMjAsICAxOCwgMTYsCi19OwotI2lmZGVmIFZQOFJFRgotI2RlZmluZSBfX2ludDY0IGxvbmcgbG9uZwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFNFQ1RJT05CSVRTX09VVFBVVCkKLXVuc2lnbmVkIF9faW50NjQgU2VjdGlvbmJpdHNbNTAwXTsKLSNlbmRpZgotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotaW50IGludHJhX21vZGVfc3RhdHNbMTBdWzEwXVsxMF07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHRyZWVfdXBkYXRlX2hpc3QgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vucy0xXSBbMl07Ci1leHRlcm4gdW5zaWduZWQgaW50IGFjdGl2ZV9zZWN0aW9uOwotI2VuZGlmCi0KLSNpZmRlZiBNT0RFX1NUQVRTCi1pbnQgY291bnRfbWJfc2VnWzRdID0geyAwLCAwLCAwLCAwIH07Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfbW9kZSgKLSAgICB2cDhfd3JpdGVyICpjb25zdCB3LAotICAgIGludCBuLAotICAgIHZwOF90b2tlbiB0b2sgICAgICAgICAgICAgICBbLyogbiAqL10sCi0gICAgdnA4X3RyZWUgdHJlZSwKLSAgICB2cDhfcHJvYiBQbmV3ICAgICAgICAgICAgICAgWy8qIG4tMSAqL10sCi0gICAgdnA4X3Byb2IgUGN1ciAgICAgICAgICAgICAgIFsvKiBuLTEgKi9dLAotICAgIHVuc2lnbmVkIGludCBiY3QgICAgICAgICAgICBbLyogbi0xICovXSBbMl0sCi0gICAgY29uc3QgdW5zaWduZWQgaW50IG51bV9ldmVudHNbLyogbiAqL10KLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgbmV3X2IgPSAwLCBvbGRfYiA9IDA7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgdnA4X3RyZWVfcHJvYnNfZnJvbV9kaXN0cmlidXRpb24oCi0gICAgICAgIG4tLSwgdG9rLCB0cmVlLAotICAgICAgICBQbmV3LCBiY3QsIG51bV9ldmVudHMsCi0gICAgICAgIDI1NiwgMQotICAgICk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgbmV3X2IgKz0gdnA4X2Nvc3RfYnJhbmNoKGJjdFtpXSwgUG5ld1tpXSk7Ci0gICAgICAgIG9sZF9iICs9IHZwOF9jb3N0X2JyYW5jaChiY3RbaV0sIFBjdXJbaV0pOwotICAgIH0KLSAgICB3aGlsZSAoKytpIDwgbik7Ci0KLSAgICBpZiAobmV3X2IgKyAobiA8PCA4KSA8IG9sZF9iKQotICAgIHsKLSAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgIHZwOF93cml0ZV9iaXQodywgMSk7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgdnA4X3Byb2IgcCA9IFBuZXdbaV07Ci0KLSAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKHcsIFBjdXJbaV0gPSBwID8gcCA6IDEsIDgpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgrK2kgPCBuKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB2cDhfd3JpdGVfYml0KHcsIDApOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfbWJpbnRyYV9tb2RlX3Byb2JzKFZQOF9DT01QICpjcGkpCi17Ci0gICAgVlA4X0NPTU1PTiAqY29uc3QgeCA9ICYgY3BpLT5jb21tb247Ci0KLSAgICB2cDhfd3JpdGVyICpjb25zdCB3ID0gJiBjcGktPmJjOwotCi0gICAgewotICAgICAgICB2cDhfcHJvYiBQbmV3ICAgW1ZQOF9ZTU9ERVMtMV07Ci0gICAgICAgIHVuc2lnbmVkIGludCBiY3QgW1ZQOF9ZTU9ERVMtMV0gWzJdOwotCi0gICAgICAgIHVwZGF0ZV9tb2RlKAotICAgICAgICAgICAgdywgVlA4X1lNT0RFUywgdnA4X3ltb2RlX2VuY29kaW5ncywgdnA4X3ltb2RlX3RyZWUsCi0gICAgICAgICAgICBQbmV3LCB4LT5mYy55bW9kZV9wcm9iLCBiY3QsICh1bnNpZ25lZCBpbnQgKiljcGktPnltb2RlX2NvdW50Ci0gICAgICAgICk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgdnA4X3Byb2IgUG5ldyAgIFtWUDhfVVZfTU9ERVMtMV07Ci0gICAgICAgIHVuc2lnbmVkIGludCBiY3QgW1ZQOF9VVl9NT0RFUy0xXSBbMl07Ci0KLSAgICAgICAgdXBkYXRlX21vZGUoCi0gICAgICAgICAgICB3LCBWUDhfVVZfTU9ERVMsIHZwOF91dl9tb2RlX2VuY29kaW5ncywgdnA4X3V2X21vZGVfdHJlZSwKLSAgICAgICAgICAgIFBuZXcsIHgtPmZjLnV2X21vZGVfcHJvYiwgYmN0LCAodW5zaWduZWQgaW50ICopY3BpLT51dl9tb2RlX2NvdW50Ci0gICAgICAgICk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZV95bW9kZSh2cDhfd3JpdGVyICpiYywgaW50IG0sIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIHZwOF93cml0ZV90b2tlbihiYywgdnA4X3ltb2RlX3RyZWUsIHAsIHZwOF95bW9kZV9lbmNvZGluZ3MgKyBtKTsKLX0KLQotc3RhdGljIHZvaWQga2Z3cml0ZV95bW9kZSh2cDhfd3JpdGVyICpiYywgaW50IG0sIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIHZwOF93cml0ZV90b2tlbihiYywgdnA4X2tmX3ltb2RlX3RyZWUsIHAsIHZwOF9rZl95bW9kZV9lbmNvZGluZ3MgKyBtKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfdXZfbW9kZSh2cDhfd3JpdGVyICpiYywgaW50IG0sIGNvbnN0IHZwOF9wcm9iICpwKQotewotICAgIHZwOF93cml0ZV90b2tlbihiYywgdnA4X3V2X21vZGVfdHJlZSwgcCwgdnA4X3V2X21vZGVfZW5jb2RpbmdzICsgbSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgd3JpdGVfYm1vZGUodnA4X3dyaXRlciAqYmMsIGludCBtLCBjb25zdCB2cDhfcHJvYiAqcCkKLXsKLSAgICB2cDhfd3JpdGVfdG9rZW4oYmMsIHZwOF9ibW9kZV90cmVlLCBwLCB2cDhfYm1vZGVfZW5jb2RpbmdzICsgbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3NwbGl0KHZwOF93cml0ZXIgKmJjLCBpbnQgeCkKLXsKLSAgICB2cDhfd3JpdGVfdG9rZW4oCi0gICAgICAgIGJjLCB2cDhfbWJzcGxpdF90cmVlLCB2cDhfbWJzcGxpdF9wcm9icywgdnA4X21ic3BsaXRfZW5jb2RpbmdzICsgeAotICAgICk7Ci19Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9ybVsyNTZdID0KLXsKLSAgICAwLCA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLXN0YXRpYyB2b2lkIHBhY2tfdG9rZW5zX2ModnA4X3dyaXRlciAqdywgY29uc3QgVE9LRU5FWFRSQSAqcCwgaW50IHhjb3VudCkKLXsKLSAgICBjb25zdCBUT0tFTkVYVFJBICpjb25zdCBzdG9wID0gcCArIHhjb3VudDsKLSAgICB1bnNpZ25lZCBpbnQgc3BsaXQ7Ci0gICAgdW5zaWduZWQgaW50IHNoaWZ0OwotICAgIGludCBjb3VudCA9IHctPmNvdW50OwotICAgIHVuc2lnbmVkIGludCByYW5nZSA9IHctPnJhbmdlOwotICAgIHVuc2lnbmVkIGludCBsb3d2YWx1ZSA9IHctPmxvd3ZhbHVlOwotCi0gICAgd2hpbGUgKHAgPCBzdG9wKQotICAgIHsKLSAgICAgICAgY29uc3QgaW50IHQgPSBwLT5Ub2tlbjsKLSAgICAgICAgdnA4X3Rva2VuICpjb25zdCBhID0gdnA4X2NvZWZfZW5jb2RpbmdzICsgdDsKLSAgICAgICAgY29uc3QgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKmNvbnN0IGIgPSB2cDhfZXh0cmFfYml0cyArIHQ7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHAgPSBwLT5jb250ZXh0X3RyZWU7Ci0gICAgICAgIGludCB2ID0gYS0+dmFsdWU7Ci0gICAgICAgIGludCBuID0gYS0+TGVuOwotCi0gICAgICAgIGlmIChwLT5za2lwX2VvYl9ub2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBuLS07Ci0gICAgICAgICAgICBpID0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBiYiA9ICh2ID4+IC0tbikgJiAxOwotICAgICAgICAgICAgc3BsaXQgPSAxICsgKCgocmFuZ2UgLSAxKSAqIHBwW2k+PjFdKSA+PiA4KTsKLSAgICAgICAgICAgIGkgPSB2cDhfY29lZl90cmVlW2krYmJdOwotCi0gICAgICAgICAgICBpZiAoYmIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZSAtIHNwbGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJhbmdlID0gc3BsaXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNoaWZ0ID0gbm9ybVtyYW5nZV07Ci0gICAgICAgICAgICByYW5nZSA8PD0gc2hpZnQ7Ci0gICAgICAgICAgICBjb3VudCArPSBzaGlmdDsKLQotICAgICAgICAgICAgaWYgKGNvdW50ID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHNoaWZ0IC0gY291bnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGxvd3ZhbHVlIDw8IChvZmZzZXQgLSAxKSkgJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHggPSB3LT5wb3MgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4ID49IDAgJiYgdy0+YnVmZmVyW3hdID09IDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHctPmJ1ZmZlclt4XSA9ICh1bnNpZ25lZCBjaGFyKTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4LS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3LT5idWZmZXJbdy0+cG9zKytdID0gKGxvd3ZhbHVlID4+ICgyNCAtIG9mZnNldCkpOwotICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgc2hpZnQgPSBjb3VudDsKLSAgICAgICAgICAgICAgICBsb3d2YWx1ZSAmPSAweGZmZmZmZjsKLSAgICAgICAgICAgICAgICBjb3VudCAtPSA4IDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG93dmFsdWUgPDw9IHNoaWZ0OwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChuKTsKLQotCi0gICAgICAgIGlmIChiLT5iYXNlX3ZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgaW50IGUgPSBwLT5FeHRyYSwgTCA9IGItPkxlbjsKLQotICAgICAgICAgICAgaWYgKEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHAgPSBiLT5wcm9iOwotICAgICAgICAgICAgICAgIGludCB2ID0gZSA+PiAxOwotICAgICAgICAgICAgICAgIGludCBuID0gTDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHYsIGFzc3VtZWQgbm9uemVybyAqLwotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLQotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmIgPSAodiA+PiAtLW4pICYgMTsKLSAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSAxICsgKCgocmFuZ2UgLSAxKSAqIHBwW2k+PjFdKSA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgaSA9IGItPnRyZWVbaStiYl07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSArPSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IG5vcm1bcmFuZ2VdOwotICAgICAgICAgICAgICAgICAgICByYW5nZSA8PD0gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHNoaWZ0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsb3d2YWx1ZSA8PCAob2Zmc2V0IC0gMSkpICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHctPnBvcyAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIHctPmJ1ZmZlclt4XSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdID0gKHVuc2lnbmVkIGNoYXIpMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmJ1ZmZlclt4XSArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbdy0+cG9zKytdID0gKGxvd3ZhbHVlID4+ICgyNCAtIG9mZnNldCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgPDw9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSAmPSAweGZmZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50IC09IDggOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgPDw9IHNoaWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobik7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgc3BsaXQgPSAocmFuZ2UgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYgKGUgJiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzcGxpdDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByYW5nZSA8PD0gMTsKLQotICAgICAgICAgICAgICAgIGlmICgobG93dmFsdWUgJiAweDgwMDAwMDAwKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIHctPmJ1ZmZlclt4XSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgICAgICAgICAgICAgeC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsb3d2YWx1ZSAgPDw9IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISsrY291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb3VudCA9IC04OwotICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbdy0+cG9zKytdID0gKGxvd3ZhbHVlID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICArK3A7Ci0gICAgfQotCi0gICAgdy0+Y291bnQgPSBjb3VudDsKLSAgICB3LT5sb3d2YWx1ZSA9IGxvd3ZhbHVlOwotICAgIHctPnJhbmdlID0gcmFuZ2U7Ci0KLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfcGFydGl0aW9uX3NpemUodW5zaWduZWQgY2hhciAqY3hfZGF0YSwgaW50IHNpemUpCi17Ci0gICAgc2lnbmVkIGNoYXIgY3NpemU7Ci0KLSAgICBjc2l6ZSA9IHNpemUgJiAweGZmOwotICAgICpjeF9kYXRhID0gY3NpemU7Ci0gICAgY3NpemUgPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgKihjeF9kYXRhICsgMSkgPSBjc2l6ZTsKLSAgICBjc2l6ZSA9IChzaXplID4+IDE2KSAmIDB4ZmY7Ci0gICAgKihjeF9kYXRhICsgMikgPSBjc2l6ZTsKLQotfQotCi1zdGF0aWMgdm9pZCBwYWNrX3Rva2Vuc19pbnRvX3BhcnRpdGlvbnNfYyhWUDhfQ09NUCAqY3BpLCB1bnNpZ25lZCBjaGFyICpjeF9kYXRhLCBpbnQgbnVtX3BhcnQsIGludCAqc2l6ZSkKLXsKLQotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0ciA9IGN4X2RhdGE7Ci0gICAgdW5zaWduZWQgaW50IHNoaWZ0OwotICAgIHZwOF93cml0ZXIgKncgPSAmY3BpLT5iYzI7Ci0gICAgKnNpemUgPSAzICogKG51bV9wYXJ0IC0gMSk7Ci0gICAgcHRyID0gY3hfZGF0YSArICgqc2l6ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHZwOF9zdGFydF9lbmNvZGUodywgcHRyKTsKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHNwbGl0OwotICAgICAgICAgICAgaW50IGNvdW50ID0gdy0+Y291bnQ7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UgPSB3LT5yYW5nZTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb3d2YWx1ZSA9IHctPmxvd3ZhbHVlOwotICAgICAgICAgICAgaW50IG1iX3JvdzsKLQotICAgICAgICAgICAgZm9yIChtYl9yb3cgPSBpOyBtYl9yb3cgPCBjcGktPmNvbW1vbi5tYl9yb3dzOyBtYl9yb3cgKz0gbnVtX3BhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVE9LRU5FWFRSQSAqcCAgICA9IGNwaS0+dHBsaXN0W21iX3Jvd10uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgVE9LRU5FWFRSQSAqc3RvcCA9IGNwaS0+dHBsaXN0W21iX3Jvd10uc3RvcDsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChwIDwgc3RvcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0ID0gcC0+VG9rZW47Ci0gICAgICAgICAgICAgICAgICAgIHZwOF90b2tlbiAqY29uc3QgYSA9IHZwOF9jb2VmX2VuY29kaW5ncyArIHQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9leHRyYV9iaXRfc3RydWN0ICpjb25zdCBiID0gdnA4X2V4dHJhX2JpdHMgKyB0OwotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBwID0gcC0+Y29udGV4dF90cmVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IGEtPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGEtPkxlbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocC0+c2tpcF9lb2Jfbm9kZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmIgPSAodiA+PiAtLW4pICYgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gMSArICgoKHJhbmdlIC0gMSkgKiBwcFtpPj4xXSkgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpID0gdnA4X2NvZWZfdHJlZVtpK2JiXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlICs9IHNwbGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHNwbGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IG5vcm1bcmFuZ2VdOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc2hpZnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaGlmdCAtIGNvdW50OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsb3d2YWx1ZSA8PCAob2Zmc2V0IC0gMSkpICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIHctPmJ1ZmZlclt4XSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSA8PD0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgLT0gOCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobik7Ci0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYi0+YmFzZV92YWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlID0gcC0+RXh0cmEsIEwgPSBiLT5MZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBwID0gYi0+cHJvYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IGUgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IEw7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiB2LCBhc3N1bWVkIG5vbnplcm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJiID0gKHYgPj4gLS1uKSAmIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gMSArICgoKHJhbmdlIC0gMSkgKiBwcFtpPj4xXSkgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBiLT50cmVlW2krYmJdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHJhbmdlIC0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHNwbGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBub3JtW3JhbmdlXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBzaGlmdDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHNoaWZ0IC0gY291bnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobG93dmFsdWUgPDwgKG9mZnNldCAtIDEpKSAmIDB4ODAwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSB3LT5wb3MgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHggPj0gMCAmJiB3LT5idWZmZXJbeF0gPT0gMHhmZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmJ1ZmZlclt4XSA9ICh1bnNpZ25lZCBjaGFyKTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSA4IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG4pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSAocmFuZ2UgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgKz0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA8PD0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobG93dmFsdWUgJiAweDgwMDAwMDAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIHctPmJ1ZmZlclt4XSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSAgPDw9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISsrY291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IC04OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbdy0+cG9zKytdID0gKGxvd3ZhbHVlID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICArK3A7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3LT5jb3VudCAgICA9IGNvdW50OwotICAgICAgICAgICAgdy0+bG93dmFsdWUgPSBsb3d2YWx1ZTsKLSAgICAgICAgICAgIHctPnJhbmdlICAgID0gcmFuZ2U7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZwOF9zdG9wX2VuY29kZSh3KTsKLSAgICAgICAgKnNpemUgKz0gICB3LT5wb3M7Ci0KLSAgICAgICAgaWYgKGkgPCAobnVtX3BhcnQgLSAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVfcGFydGl0aW9uX3NpemUoY3hfZGF0YSwgdy0+cG9zKTsKLSAgICAgICAgICAgIGN4X2RhdGEgKz0gMzsKLSAgICAgICAgICAgIHB0ciArPSB3LT5wb3M7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgcGFja19tYl9yb3dfdG9rZW5zX2MoVlA4X0NPTVAgKmNwaSwgdnA4X3dyaXRlciAqdykKLXsKLQotICAgIHVuc2lnbmVkIGludCBzcGxpdDsKLSAgICBpbnQgY291bnQgPSB3LT5jb3VudDsKLSAgICB1bnNpZ25lZCBpbnQgcmFuZ2UgPSB3LT5yYW5nZTsKLSAgICB1bnNpZ25lZCBpbnQgbG93dmFsdWUgPSB3LT5sb3d2YWx1ZTsKLSAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7Ci0gICAgaW50IG1iX3JvdzsKLQotICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY3BpLT5jb21tb24ubWJfcm93czsgbWJfcm93KyspCi0gICAgewotICAgICAgICBUT0tFTkVYVFJBICpwICAgID0gY3BpLT50cGxpc3RbbWJfcm93XS5zdGFydDsKLSAgICAgICAgVE9LRU5FWFRSQSAqc3RvcCA9IGNwaS0+dHBsaXN0W21iX3Jvd10uc3RvcDsKLQotICAgICAgICB3aGlsZSAocCA8IHN0b3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB0ID0gcC0+VG9rZW47Ci0gICAgICAgICAgICB2cDhfdG9rZW4gKmNvbnN0IGEgPSB2cDhfY29lZl9lbmNvZGluZ3MgKyB0OwotICAgICAgICAgICAgY29uc3QgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKmNvbnN0IGIgPSB2cDhfZXh0cmFfYml0cyArIHQ7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwcCA9IHAtPmNvbnRleHRfdHJlZTsKLSAgICAgICAgICAgIGludCB2ID0gYS0+dmFsdWU7Ci0gICAgICAgICAgICBpbnQgbiA9IGEtPkxlbjsKLQotICAgICAgICAgICAgaWYgKHAtPnNraXBfZW9iX25vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbi0tOwotICAgICAgICAgICAgICAgIGkgPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYiA9ICh2ID4+IC0tbikgJiAxOwotICAgICAgICAgICAgICAgIHNwbGl0ID0gMSArICgoKHJhbmdlIC0gMSkgKiBwcFtpPj4xXSkgPj4gOCk7Ci0gICAgICAgICAgICAgICAgaSA9IHZwOF9jb2VmX3RyZWVbaStiYl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSArPSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZSAtIHNwbGl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHNwbGl0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNoaWZ0ID0gbm9ybVtyYW5nZV07Ci0gICAgICAgICAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OwotICAgICAgICAgICAgICAgIGNvdW50ICs9IHNoaWZ0OwotCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGxvd3ZhbHVlIDw8IChvZmZzZXQgLSAxKSkgJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHctPnBvcyAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh4ID49IDAgJiYgdy0+YnVmZmVyW3hdID09IDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdID0gKHVuc2lnbmVkIGNoYXIpMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHctPmJ1ZmZlclt4XSArPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgPDw9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50IC09IDggOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChuKTsKLQotCi0gICAgICAgICAgICBpZiAoYi0+YmFzZV92YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGUgPSBwLT5FeHRyYSwgTCA9IGItPkxlbjsKLQotICAgICAgICAgICAgICAgIGlmIChMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHAgPSBiLT5wcm9iOwotICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IGUgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBMOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gdiwgYXNzdW1lZCBub256ZXJvICovCi0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmIgPSAodiA+PiAtLW4pICYgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gMSArICgoKHJhbmdlIC0gMSkgKiBwcFtpPj4xXSkgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpID0gYi0+dHJlZVtpK2JiXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlICs9IHNwbGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHNwbGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IG5vcm1bcmFuZ2VdOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc2hpZnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaGlmdCAtIGNvdW50OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsb3d2YWx1ZSA8PCAob2Zmc2V0IC0gMSkpICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIHctPmJ1ZmZlclt4XSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3ctPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSA8PD0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgLT0gOCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IChyYW5nZSArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb3d2YWx1ZSArPSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UgLSBzcGxpdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByYW5nZSA8PD0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGxvd3ZhbHVlICYgMHg4MDAwMDAwMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gdy0+cG9zIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHggPj0gMCAmJiB3LT5idWZmZXJbeF0gPT0gMHhmZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbeF0gPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdy0+YnVmZmVyW3hdICs9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlICA8PD0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoISsrY291bnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gLTg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LT5idWZmZXJbdy0+cG9zKytdID0gKGxvd3ZhbHVlID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvd3ZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICsrcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHctPmNvdW50ID0gY291bnQ7Ci0gICAgdy0+bG93dmFsdWUgPSBsb3d2YWx1ZTsKLSAgICB3LT5yYW5nZSA9IHJhbmdlOwotCi19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX212X3JlZgotKAotICAgIHZwOF93cml0ZXIgKncsIE1CX1BSRURJQ1RJT05fTU9ERSBtLCBjb25zdCB2cDhfcHJvYiAqcAotKQotewotCi0gICAgYXNzZXJ0KE5FQVJFU1RNViA8PSBtICAmJiAgbSA8PSBTUExJVE1WKTsKLQotICAgIHZwOF93cml0ZV90b2tlbih3LCB2cDhfbXZfcmVmX3RyZWUsIHAsCi0gICAgICAgICAgICAgICAgICAgIHZwOF9tdl9yZWZfZW5jb2RpbmdfYXJyYXkgLSBORUFSRVNUTVYgKyBtKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfc3ViX212X3JlZgotKAotICAgIHZwOF93cml0ZXIgKncsIEJfUFJFRElDVElPTl9NT0RFIG0sIGNvbnN0IHZwOF9wcm9iICpwCi0pCi17Ci0gICAgYXNzZXJ0KExFRlQ0WDQgPD0gbSAgJiYgIG0gPD0gTkVXNFg0KTsKLQotICAgIHZwOF93cml0ZV90b2tlbih3LCB2cDhfc3ViX212X3JlZl90cmVlLCBwLAotICAgICAgICAgICAgICAgICAgICB2cDhfc3ViX212X3JlZl9lbmNvZGluZ19hcnJheSAtIExFRlQ0WDQgKyBtKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfbXYKLSgKLSAgICB2cDhfd3JpdGVyICp3LCBjb25zdCBNViAqbXYsIGNvbnN0IE1WICpyZWYsIGNvbnN0IE1WX0NPTlRFWFQgKm12YwotKQotewotICAgIE1WIGU7Ci0gICAgZS5yb3cgPSBtdi0+cm93IC0gcmVmLT5yb3c7Ci0gICAgZS5jb2wgPSBtdi0+Y29sIC0gcmVmLT5jb2w7Ci0KLSAgICB2cDhfZW5jb2RlX21vdGlvbl92ZWN0b3IodywgJmUsIG12Yyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX21iX2ZlYXR1cmVzKHZwOF93cml0ZXIgKncsIGNvbnN0IE1CX01PREVfSU5GTyAqbWksIGNvbnN0IE1BQ1JPQkxPQ0tEICp4KQotewotICAgIC8vIEVuY29kZSB0aGUgTUIgc2VnbWVudCBpZC4KLSAgICBpZiAoeC0+c2VnbWVudGF0aW9uX2VuYWJsZWQgJiYgeC0+dXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApCi0gICAgewotICAgICAgICBzd2l0Y2ggKG1pLT5zZWdtZW50X2lkKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMF0pOwotICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDAsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1sxXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDAsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1swXSk7Ci0gICAgICAgICAgICB2cDhfd3JpdGUodywgMSwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzFdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB2cDhfd3JpdGUodywgMSwgeC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdKTsKLSAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHZwOF93cml0ZSh3LCAxLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMF0pOwotICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDEsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1syXSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gVFJBUC4uIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHZwOF93cml0ZSh3LCAwLCB4LT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMF0pOwotICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDAsIHgtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1sxXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZCBwYWNrX2ludGVyX21vZGVfbXZzKFZQOF9DT01QICpjb25zdCBjcGkpCi17Ci0gICAgVlA4X0NPTU1PTiAqY29uc3QgcGMgPSAmIGNwaS0+Y29tbW9uOwotICAgIHZwOF93cml0ZXIgKmNvbnN0IHcgPSAmIGNwaS0+YmM7Ci0gICAgY29uc3QgTVZfQ09OVEVYVCAqbXZjID0gcGMtPmZjLm12YzsKLQotICAgIGNvbnN0IGludCAqY29uc3QgcmZjdCA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlOwotICAgIGNvbnN0IGludCByZl9pbnRyYSA9IHJmY3RbSU5UUkFfRlJBTUVdOwotICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07Ci0KLSAgICBNT0RFX0lORk8gKm0gPSBwYy0+bWksICptczsKLSAgICBjb25zdCBpbnQgbWlzID0gcGMtPm1vZGVfaW5mb19zdHJpZGU7Ci0gICAgaW50IG1iX3JvdyA9IC0xOwotCi0gICAgaW50IHByb2JfbGFzdF9jb2RlZDsKLSAgICBpbnQgcHJvYl9nZl9jb2RlZDsKLSAgICBpbnQgcHJvYl9za2lwX2ZhbHNlID0gMDsKLSAgICBtcyA9IHBjLT5taSAtIDE7Ci0KLSAgICBjcGktPm1iLnBhcnRpdGlvbl9pbmZvID0gY3BpLT5tYi5waTsKLQotICAgIC8vIENhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdGllcyB0byBiZSB1c2VkIHRvIGNvZGUgdGhlIHJlZmVyZW5jZSBmcmFtZSBiYXNlZCBvbiBhY3R1YWwgdXNlYWdlIHRoaXMgZnJhbWUKLSAgICBpZiAoIShjcGktPnByb2JfaW50cmFfY29kZWQgPSByZl9pbnRyYSAqIDI1NSAvIChyZl9pbnRyYSArIHJmX2ludGVyKSkpCi0gICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDE7Ci0KLSAgICBwcm9iX2xhc3RfY29kZWQgPSByZl9pbnRlciA/IChyZmN0W0xBU1RfRlJBTUVdICogMjU1KSAvIHJmX2ludGVyIDogMTI4OwotCi0gICAgaWYgKCFwcm9iX2xhc3RfY29kZWQpCi0gICAgICAgIHByb2JfbGFzdF9jb2RlZCA9IDE7Ci0KLSAgICBwcm9iX2dmX2NvZGVkID0gKHJmY3RbR09MREVOX0ZSQU1FXSArIHJmY3RbQUxUUkVGX0ZSQU1FXSkKLSAgICAgICAgICAgICAgICAgICAgPyAocmZjdFtHT0xERU5fRlJBTUVdICogMjU1KSAvIChyZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV0pIDogMTI4OwotCi0gICAgaWYgKCFwcm9iX2dmX2NvZGVkKQotICAgICAgICBwcm9iX2dmX2NvZGVkID0gMTsKLQotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgIGFjdGl2ZV9zZWN0aW9uID0gMTsKLSNlbmRpZgotCi0gICAgaWYgKHBjLT5tYl9ub19jb2VmZl9za2lwKQotICAgIHsKLSAgICAgICAgcHJvYl9za2lwX2ZhbHNlID0gY3BpLT5za2lwX2ZhbHNlX2NvdW50ICogMjU2IC8gKGNwaS0+c2tpcF9mYWxzZV9jb3VudCArIGNwaS0+c2tpcF90cnVlX2NvdW50KTsKLQotICAgICAgICBpZiAocHJvYl9za2lwX2ZhbHNlIDw9IDEpCi0gICAgICAgICAgICBwcm9iX3NraXBfZmFsc2UgPSAxOwotCi0gICAgICAgIGlmIChwcm9iX3NraXBfZmFsc2UgPiAyNTUpCi0gICAgICAgICAgICBwcm9iX3NraXBfZmFsc2UgPSAyNTU7Ci0KLSAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBwcm9iX3NraXBfZmFsc2U7Ci0gICAgICAgIHZwOF93cml0ZV9saXRlcmFsKHcsIHByb2Jfc2tpcF9mYWxzZSwgOCk7Ci0gICAgfQotCi0gICAgdnA4X3dyaXRlX2xpdGVyYWwodywgY3BpLT5wcm9iX2ludHJhX2NvZGVkLCA4KTsKLSAgICB2cDhfd3JpdGVfbGl0ZXJhbCh3LCBwcm9iX2xhc3RfY29kZWQsIDgpOwotICAgIHZwOF93cml0ZV9saXRlcmFsKHcsIHByb2JfZ2ZfY29kZWQsIDgpOwotCi0gICAgdXBkYXRlX21iaW50cmFfbW9kZV9wcm9icyhjcGkpOwotCi0gICAgdnA4X3dyaXRlX212cHJvYnMoY3BpKTsKLQotICAgIHdoaWxlICgrK21iX3JvdyA8IHBjLT5tYl9yb3dzKQotICAgIHsKLSAgICAgICAgaW50IG1iX2NvbCA9IC0xOwotCi0gICAgICAgIHdoaWxlICgrK21iX2NvbCA8IHBjLT5tYl9jb2xzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBNQl9NT0RFX0lORk8gKmNvbnN0IG1pID0gJiBtLT5tYm1pOwotICAgICAgICAgICAgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJmID0gbWktPnJlZl9mcmFtZTsKLSAgICAgICAgICAgIGNvbnN0IE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlID0gbWktPm1vZGU7Ci0KLSAgICAgICAgICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZjcGktPm1iLmVfbWJkOwotCi0gICAgICAgICAgICAvLyBEaXN0YW5jZSBvZiBNYiB0byB0aGUgdmFyaW91cyBpbWFnZSBlZGdlcy4KLSAgICAgICAgICAgIC8vIFRoZXNlIHNwZWNpZmllZCB0byA4dGggcGVsIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZCB0byBNViB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCi0gICAgICAgICAgICB4ZC0+bWJfdG9fbGVmdF9lZGdlID0gLSgobWJfY29sICogMTYpIDw8IDMpOwotICAgICAgICAgICAgeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPSAoKHBjLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgPDwgMzsKLSAgICAgICAgICAgIHhkLT5tYl90b190b3BfZWRnZSA9IC0oKG1iX3JvdyAqIDE2KSkgPDwgMzsKLSAgICAgICAgICAgIHhkLT5tYl90b19ib3R0b21fZWRnZSA9ICgocGMtPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOwotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICAgICAgYWN0aXZlX3NlY3Rpb24gPSA5OwotI2VuZGlmCi0KLSAgICAgICAgICAgIGlmIChjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwKQotICAgICAgICAgICAgICAgIHdyaXRlX21iX2ZlYXR1cmVzKHcsIG1pLCAmY3BpLT5tYi5lX21iZCk7Ci0KLSAgICAgICAgICAgIGlmIChwYy0+bWJfbm9fY29lZmZfc2tpcCkKLSAgICAgICAgICAgICAgICB2cDhfZW5jb2RlX2Jvb2wodywgbS0+bWJtaS5tYl9za2lwX2NvZWZmLCBwcm9iX3NraXBfZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAocmYgPT0gSU5UUkFfRlJBTUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X3dyaXRlKHcsIDAsIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCk7Ci0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICAgICAgICAgIGFjdGl2ZV9zZWN0aW9uID0gNjsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHdyaXRlX3ltb2RlKHcsIG1vZGUsIHBjLT5mYy55bW9kZV9wcm9iKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2RlID09IEJfUFJFRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBqID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYm1vZGUodywgbS0+Ym1pW2pdLm1vZGUsIHBjLT5mYy5ibW9kZV9wcm9iKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytqIDwgMTYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdyaXRlX3V2X21vZGUodywgbWktPnV2X21vZGUsIHBjLT5mYy51dl9tb2RlX3Byb2IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgICAvKiBpbnRlciBjb2RlZCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WIGJlc3RfbXY7Ci0gICAgICAgICAgICAgICAgdnA4X3Byb2IgbXZfcmVmX3AgW1ZQOF9NVlJFRlMtMV07Ci0KLSAgICAgICAgICAgICAgICB2cDhfd3JpdGUodywgMSwgY3BpLT5wcm9iX2ludHJhX2NvZGVkKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZiA9PSBMQVNUX0ZSQU1FKQotICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGUodywgMCwgcHJvYl9sYXN0X2NvZGVkKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGUodywgMSwgcHJvYl9sYXN0X2NvZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlKHcsIChyZiA9PSBHT0xERU5fRlJBTUUpID8gMCA6IDEsIHByb2JfZ2ZfY29kZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTVYgbjEsIG4yOwotICAgICAgICAgICAgICAgICAgICBpbnQgY3RbNF07Ci0KLSAgICAgICAgICAgICAgICAgICAgdnA4X2ZpbmRfbmVhcl9tdnMoeGQsIG0sICZuMSwgJm4yLCAmYmVzdF9tdiwgY3QsIHJmLCBjcGktPmNvbW1vbi5yZWZfZnJhbWVfc2lnbl9iaWFzKTsKLSAgICAgICAgICAgICAgICAgICAgdnA4X212X3JlZl9wcm9icyhtdl9yZWZfcCwgY3QpOwotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICAgICAgICAgICAgICBhY2N1bV9tdl9yZWZzKG1vZGUsIGN0KTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgfQotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICAgICAgICAgIGFjdGl2ZV9zZWN0aW9uID0gMzsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgd3JpdGVfbXZfcmVmKHcsIG1vZGUsIG12X3JlZl9wKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgICAvKiBuZXcsIHNwbGl0IHJlcXVpcmUgTVZzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTkVXTVY6Ci0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9zZWN0aW9uID0gNTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlX212KHcsICZtaS0+bXYuYXNfbXYsICZiZXN0X212LCBtdmMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU1BMSVRNVjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBqID0gMDsKLQotI2lmZGVmIE1PREVfU1RBVFMKLSAgICAgICAgICAgICAgICAgICAgKytjb3VudF9tYl9zZWcgW21pLT5wYXJ0aXRpb25pbmddOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3BsaXQodywgbWktPnBhcnRpdGlvbmluZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQl9NT0RFX0lORk8gKmNvbnN0IGIgPSBjcGktPm1iLnBhcnRpdGlvbl9pbmZvLT5ibWkgKyBqOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpjb25zdCAgTCA9IHZwOF9tYnNwbGl0cyBbbWktPnBhcnRpdGlvbmluZ107Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgayA9IC0xOyAgLyogZmlyc3QgYmxvY2sgaW4gc3Vic2V0IGogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdl9jb250ejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogIT0gTFsrK2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID49IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG12X2NvbnR6ID0gdnA4X212X2NvbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCYodnA4X2xlZnRfYm1pKG0sIGspLT5tdi5hc19tdiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHZwOF9hYm92ZV9ibWkobSwgaywgbWlzKS0+bXYuYXNfbXYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3N1Yl9tdl9yZWYodywgYi0+bW9kZSwgdnA4X3N1Yl9tdl9yZWZfcHJvYjIgW212X2NvbnR6XSk7IC8vcGMtPmZjLnN1Yl9tdl9yZWZfcHJvYik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLT5tb2RlID09IE5FVzRYNCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX3NlY3Rpb24gPSAxMTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX212KHcsICZiLT5tdi5hc19tdiwgJmJlc3RfbXYsIChjb25zdCBNVl9DT05URVhUICopIG12Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsraiA8IGNwaS0+bWIucGFydGl0aW9uX2luZm8tPmNvdW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICArK207Ci0gICAgICAgICAgICBjcGktPm1iLnBhcnRpdGlvbl9pbmZvKys7Ci0gICAgICAgIH0KLQotICAgICAgICArK207ICAvKiBza2lwIEwgcHJlZGljdGlvbiBib3JkZXIgKi8KLSAgICAgICAgY3BpLT5tYi5wYXJ0aXRpb25faW5mbysrOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZCB3cml0ZV9rZm1vZGVzKFZQOF9DT01QICpjcGkpCi17Ci0gICAgdnA4X3dyaXRlciAqY29uc3QgYmMgPSAmIGNwaS0+YmM7Ci0gICAgY29uc3QgVlA4X0NPTU1PTiAqY29uc3QgYyA9ICYgY3BpLT5jb21tb247Ci0gICAgLyogY29uc3QgKi8KLSAgICBNT0RFX0lORk8gKm0gPSBjLT5taTsKLQotICAgIGludCBtYl9yb3cgPSAtMTsKLSAgICBpbnQgcHJvYl9za2lwX2ZhbHNlID0gMDsKLQotICAgIGlmIChjLT5tYl9ub19jb2VmZl9za2lwKQotICAgIHsKLSAgICAgICAgcHJvYl9za2lwX2ZhbHNlID0gY3BpLT5za2lwX2ZhbHNlX2NvdW50ICogMjU2IC8gKGNwaS0+c2tpcF9mYWxzZV9jb3VudCArIGNwaS0+c2tpcF90cnVlX2NvdW50KTsKLQotICAgICAgICBpZiAocHJvYl9za2lwX2ZhbHNlIDw9IDEpCi0gICAgICAgICAgICBwcm9iX3NraXBfZmFsc2UgPSAxOwotCi0gICAgICAgIGlmIChwcm9iX3NraXBfZmFsc2UgPj0gMjU1KQotICAgICAgICAgICAgcHJvYl9za2lwX2ZhbHNlID0gMjU1OwotCi0gICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gcHJvYl9za2lwX2ZhbHNlOwotICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcHJvYl9za2lwX2ZhbHNlLCA4KTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKyttYl9yb3cgPCBjLT5tYl9yb3dzKQotICAgIHsKLSAgICAgICAgaW50IG1iX2NvbCA9IC0xOwotCi0gICAgICAgIHdoaWxlICgrK21iX2NvbCA8IGMtPm1iX2NvbHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB5bSA9IG0tPm1ibWkubW9kZTsKLQotICAgICAgICAgICAgaWYgKGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApCi0gICAgICAgICAgICAgICAgd3JpdGVfbWJfZmVhdHVyZXMoYmMsICZtLT5tYm1pLCAmY3BpLT5tYi5lX21iZCk7Ci0KLSAgICAgICAgICAgIGlmIChjLT5tYl9ub19jb2VmZl9za2lwKQotICAgICAgICAgICAgICAgIHZwOF9lbmNvZGVfYm9vbChiYywgbS0+bWJtaS5tYl9za2lwX2NvZWZmLCBwcm9iX3NraXBfZmFsc2UpOwotCi0gICAgICAgICAgICBrZndyaXRlX3ltb2RlKGJjLCB5bSwgYy0+a2ZfeW1vZGVfcHJvYik7Ci0KLSAgICAgICAgICAgIGlmICh5bSA9PSBCX1BSRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IG1pcyA9IGMtPm1vZGVfaW5mb19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEEgPSB2cDhfYWJvdmVfYm1pKG0sIGksIG1pcyktPm1vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEwgPSB2cDhfbGVmdF9ibWkobSwgaSktPm1vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBibSA9IG0tPmJtaVtpXS5tb2RlOwotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICAgICAgICAgICAgICArK2ludHJhX21vZGVfc3RhdHMgW0FdIFtMXSBbYm1dOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVfYm1vZGUoYmMsIGJtLCBjLT5rZl9ibW9kZV9wcm9iIFtBXSBbTF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgMTYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZV91dl9tb2RlKGJjLCAobSsrKS0+bWJtaS51dl9tb2RlLCBjLT5rZl91dl9tb2RlX3Byb2IpOwotICAgICAgICB9Ci0KLSAgICAgICAgbSsrOyAgICAvLyBza2lwIEwgcHJlZGljdGlvbiBib3JkZXIKLSAgICB9Ci19Ci1pbnQgdnA4X2VzdGltYXRlX2VudHJvcHlfc2F2aW5ncyhWUDhfQ09NUCAqY3BpKQotewotICAgIGludCBpID0gMDsKLSAgICBpbnQgc2F2aW5ncyA9IDA7Ci0KLSAgICBjb25zdCBpbnQgKmNvbnN0IHJmY3QgPSBjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZTsKLSAgICBjb25zdCBpbnQgcmZfaW50cmEgPSByZmN0W0lOVFJBX0ZSQU1FXTsKLSAgICBjb25zdCBpbnQgcmZfaW50ZXIgPSByZmN0W0xBU1RfRlJBTUVdICsgcmZjdFtHT0xERU5fRlJBTUVdICsgcmZjdFtBTFRSRUZfRlJBTUVdOwotICAgIGludCBuZXdfaW50cmEsIG5ld19sYXN0LCBnZl9sYXN0LCBvbGR0b3RhbCwgbmV3dG90YWw7Ci0gICAgaW50IHJlZl9mcmFtZV9jb3N0W01BWF9SRUZfRlJBTUVTXTsKLQotICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsgLy9fX2FzbSBlbW1zOwotCi0gICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgaWYgKCEobmV3X2ludHJhID0gcmZfaW50cmEgKiAyNTUgLyAocmZfaW50cmEgKyByZl9pbnRlcikpKQotICAgICAgICAgICAgbmV3X2ludHJhID0gMTsKLQotICAgICAgICBuZXdfbGFzdCA9IHJmX2ludGVyID8gKHJmY3RbTEFTVF9GUkFNRV0gKiAyNTUpIC8gcmZfaW50ZXIgOiAxMjg7Ci0KLSAgICAgICAgZ2ZfbGFzdCA9IChyZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV0pCi0gICAgICAgICAgICAgICAgICA/IChyZmN0W0dPTERFTl9GUkFNRV0gKiAyNTUpIC8gKHJmY3RbR09MREVOX0ZSQU1FXSArIHJmY3RbQUxUUkVGX0ZSQU1FXSkgOiAxMjg7Ci0KLSAgICAgICAgLy8gbmV3IGNvc3RzCi0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0lOVFJBX0ZSQU1FXSAgID0gdnA4X2Nvc3RfemVybyhuZXdfaW50cmEpOwotICAgICAgICByZWZfZnJhbWVfY29zdFtMQVNUX0ZSQU1FXSAgICA9IHZwOF9jb3N0X29uZShuZXdfaW50cmEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF96ZXJvKG5ld19sYXN0KTsKLSAgICAgICAgcmVmX2ZyYW1lX2Nvc3RbR09MREVOX0ZSQU1FXSAgPSB2cDhfY29zdF9vbmUobmV3X2ludHJhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3Rfb25lKG5ld19sYXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3RfemVybyhnZl9sYXN0KTsKLSAgICAgICAgcmVmX2ZyYW1lX2Nvc3RbQUxUUkVGX0ZSQU1FXSAgPSB2cDhfY29zdF9vbmUobmV3X2ludHJhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3Rfb25lKG5ld19sYXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3Rfb25lKGdmX2xhc3QpOwotCi0gICAgICAgIG5ld3RvdGFsID0KLSAgICAgICAgICAgIHJmY3RbSU5UUkFfRlJBTUVdICogcmVmX2ZyYW1lX2Nvc3RbSU5UUkFfRlJBTUVdICsKLSAgICAgICAgICAgIHJmY3RbTEFTVF9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtMQVNUX0ZSQU1FXSArCi0gICAgICAgICAgICByZmN0W0dPTERFTl9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtHT0xERU5fRlJBTUVdICsKLSAgICAgICAgICAgIHJmY3RbQUxUUkVGX0ZSQU1FXSAqIHJlZl9mcmFtZV9jb3N0W0FMVFJFRl9GUkFNRV07Ci0KLQotICAgICAgICAvLyBvbGQgY29zdHMKLSAgICAgICAgcmVmX2ZyYW1lX2Nvc3RbSU5UUkFfRlJBTUVdICAgPSB2cDhfY29zdF96ZXJvKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCk7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0xBU1RfRlJBTUVdICAgID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X3plcm8oY3BpLT5wcm9iX2xhc3RfY29kZWQpOwotICAgICAgICByZWZfZnJhbWVfY29zdFtHT0xERU5fRlJBTUVdICA9IHZwOF9jb3N0X29uZShjcGktPnByb2JfaW50cmFfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUoY3BpLT5wcm9iX2xhc3RfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF96ZXJvKGNwaS0+cHJvYl9nZl9jb2RlZCk7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0FMVFJFRl9GUkFNRV0gID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZShjcGktPnByb2JfbGFzdF9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZShjcGktPnByb2JfZ2ZfY29kZWQpOwotCi0gICAgICAgIG9sZHRvdGFsID0KLSAgICAgICAgICAgIHJmY3RbSU5UUkFfRlJBTUVdICogcmVmX2ZyYW1lX2Nvc3RbSU5UUkFfRlJBTUVdICsKLSAgICAgICAgICAgIHJmY3RbTEFTVF9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtMQVNUX0ZSQU1FXSArCi0gICAgICAgICAgICByZmN0W0dPTERFTl9GUkFNRV0gKiByZWZfZnJhbWVfY29zdFtHT0xERU5fRlJBTUVdICsKLSAgICAgICAgICAgIHJmY3RbQUxUUkVGX0ZSQU1FXSAqIHJlZl9mcmFtZV9jb3N0W0FMVFJFRl9GUkFNRV07Ci0KLSAgICAgICAgc2F2aW5ncyArPSAob2xkdG90YWwgLSBuZXd0b3RhbCkgLyAyNTY7Ci0gICAgfQotCi0KLSAgICBkbwotICAgIHsKLSAgICAgICAgaW50IGogPSAwOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBrID0gMDsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBhdCBldmVyeSBjb250ZXh0ICovCi0KLSAgICAgICAgICAgICAgICAvKiBjYWxjIHByb2JzIGFuZCBicmFuY2ggY3RzIGZvciB0aGlzIGZyYW1lIG9ubHkgKi8KLSAgICAgICAgICAgICAgICAvL3ZwOF9wcm9iIG5ld19wICAgICAgICAgICBbdnA4X2NvZWZfdG9rZW5zLTFdOwotICAgICAgICAgICAgICAgIC8vdW5zaWduZWQgaW50IGJyYW5jaF9jdCAgIFt2cDhfY29lZl90b2tlbnMtMV0gWzJdOwotCi0gICAgICAgICAgICAgICAgaW50IHQgPSAwOyAgICAgIC8qIHRva2VuL3Byb2IgaW5kZXggKi8KLQotICAgICAgICAgICAgICAgIHZwOF90cmVlX3Byb2JzX2Zyb21fZGlzdHJpYnV0aW9uKAotICAgICAgICAgICAgICAgICAgICB2cDhfY29lZl90b2tlbnMsIHZwOF9jb2VmX2VuY29kaW5ncywgdnA4X2NvZWZfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZV9jb2VmX3Byb2JzIFtpXVtqXVtrXSwgY3BpLT5mcmFtZV9icmFuY2hfY3QgW2ldW2pdW2tdLCBjcGktPmNvZWZfY291bnRzIFtpXVtqXVtrXSwKLSAgICAgICAgICAgICAgICAgICAgMjU2LCAxCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmN0ICA9IGNwaS0+ZnJhbWVfYnJhbmNoX2N0IFtpXVtqXVtrXVt0XTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3Byb2IgbmV3cCA9IGNwaS0+ZnJhbWVfY29lZl9wcm9icyBbaV1bal1ba11bdF07Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3Byb2Igb2xkID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbaV1bal1ba11bdF07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIHVwZCA9IHZwOF9jb2VmX3VwZGF0ZV9wcm9icyBbaV1bal1ba11bdF07Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9sZF9iID0gdnA4X2Nvc3RfYnJhbmNoKGN0LCBvbGQpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmV3X2IgPSB2cDhfY29zdF9icmFuY2goY3QsIG5ld3ApOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1cGRhdGVfYiA9IDggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHZwOF9jb3N0X29uZSh1cGQpIC0gdnA4X2Nvc3RfemVybyh1cGQpKSA+PiA4KTsKLQotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcyA9IG9sZF9iIC0gbmV3X2IgLSB1cGRhdGVfYjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZpbmdzICs9IHM7Ci0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKyt0IDwgdnA4X2NvZWZfdG9rZW5zIC0gMSk7Ci0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsrayA8IFBSRVZfQ09FRl9DT05URVhUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsraiA8IENPRUZfQkFORFMpOwotICAgIH0KLSAgICB3aGlsZSAoKytpIDwgQkxPQ0tfVFlQRVMpOwotCi0gICAgcmV0dXJuIHNhdmluZ3M7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9jb2VmX3Byb2JzKFZQOF9DT01QICpjcGkpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHZwOF93cml0ZXIgKmNvbnN0IHcgPSAmIGNwaS0+YmM7Ci0gICAgaW50IHNhdmluZ3MgPSAwOwotCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAvL19fYXNtIGVtbXM7Ci0KLQotICAgIGRvCi0gICAgewotICAgICAgICBpbnQgaiA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaW50IGsgPSAwOwotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vbm90ZTogdXNlIHJlc3VsdCBmcm9tIHZwOF9lc3RpbWF0ZV9lbnRyb3B5X3NhdmluZ3MsIHNvIG5vIG5lZWQgdG8gY2FsbCB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbiBoZXJlLgotICAgICAgICAgICAgICAgIC8qIGF0IGV2ZXJ5IGNvbnRleHQgKi8KLQotICAgICAgICAgICAgICAgIC8qIGNhbGMgcHJvYnMgYW5kIGJyYW5jaCBjdHMgZm9yIHRoaXMgZnJhbWUgb25seSAqLwotICAgICAgICAgICAgICAgIC8vdnA4X3Byb2IgbmV3X3AgICAgICAgICAgIFt2cDhfY29lZl90b2tlbnMtMV07Ci0gICAgICAgICAgICAgICAgLy91bnNpZ25lZCBpbnQgYnJhbmNoX2N0ICAgW3ZwOF9jb2VmX3Rva2Vucy0xXSBbMl07Ci0KLSAgICAgICAgICAgICAgICBpbnQgdCA9IDA7ICAgICAgLyogdG9rZW4vcHJvYiBpbmRleCAqLwotCi0gICAgICAgICAgICAgICAgLy92cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKLSAgICAgICAgICAgICAgICAvLyAgICB2cDhfY29lZl90b2tlbnMsIHZwOF9jb2VmX2VuY29kaW5ncywgdnA4X2NvZWZfdHJlZSwKLSAgICAgICAgICAgICAgICAvLyAgICBuZXdfcCwgYnJhbmNoX2N0LCAodW5zaWduZWQgaW50ICopY3BpLT5jb2VmX2NvdW50cyBbaV1bal1ba10sCi0gICAgICAgICAgICAgICAgLy8gICAgMjU2LCAxCi0gICAgICAgICAgICAgICAgLy8gICAgKTsKLQotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmN0ICA9IGNwaS0+ZnJhbWVfYnJhbmNoX2N0IFtpXVtqXVtrXVt0XTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdnA4X3Byb2IgbmV3cCA9IGNwaS0+ZnJhbWVfY29lZl9wcm9icyBbaV1bal1ba11bdF07Ci0KLSAgICAgICAgICAgICAgICAgICAgdnA4X3Byb2IgKlBvbGQgPSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzIFtpXVtqXVtrXSArIHQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF9wcm9iIG9sZCA9ICpQb2xkOwotICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfcHJvYiB1cGQgPSB2cDhfY29lZl91cGRhdGVfcHJvYnMgW2ldW2pdW2tdW3RdOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvbGRfYiA9IHZwOF9jb3N0X2JyYW5jaChjdCwgb2xkKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5ld19iID0gdnA4X2Nvc3RfYnJhbmNoKGN0LCBuZXdwKTsKLQotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlX2IgPSA4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2cDhfY29zdF9vbmUodXBkKSAtIHZwOF9jb3N0X3plcm8odXBkKSkgPj4gOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHMgPSBvbGRfYiAtIG5ld19iIC0gdXBkYXRlX2I7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1ID0gcyA+IDAgPyAxIDogMDsKLQotICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGUodywgdSwgdXBkKTsKLQotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICAgICAgICAgICAgICArKyB0cmVlX3VwZGF0ZV9oaXN0IFtpXVtqXVtrXVt0XSBbdV07Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICBpZiAodSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VuZC91c2UgbmV3IHByb2JhYmlsaXR5ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICpQb2xkID0gbmV3cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKHcsIG5ld3AsIDgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZpbmdzICs9IHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgrK3QgPCB2cDhfY29lZl90b2tlbnMgLSAxKTsKLQotICAgICAgICAgICAgICAgIC8qIEFjY3VtIHRva2VuIGNvdW50cyBmb3IgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IHN0YXRpc3RpY3MgKi8KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgICAgICAgICAgICAgdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dF9jb3VudGVycyBbaV1bal1ba11bdF0gKz0gY3BpLT5jb2VmX2NvdW50cyBbaV1bal1ba11bdF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgrK3QgPCB2cDhfY29lZl90b2tlbnMpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsrayA8IFBSRVZfQ09FRl9DT05URVhUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsraiA8IENPRUZfQkFORFMpOwotICAgIH0KLSAgICB3aGlsZSAoKytpIDwgQkxPQ0tfVFlQRVMpOwotCi19Ci0jaWZkZWYgUEFDS0VUX1RFU1RJTkcKLUZJTEUgKnZweGxvZ2MgPSAwOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHB1dF9kZWx0YV9xKHZwOF93cml0ZXIgKmJjLCBpbnQgZGVsdGFfcSkKLXsKLSAgICBpZiAoZGVsdGFfcSAhPSAwKQotICAgIHsKLSAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMSk7Ci0gICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBhYnMoZGVsdGFfcSksIDQpOwotCi0gICAgICAgIGlmIChkZWx0YV9xIDwgMCkKLSAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsKLX0KLQotdm9pZCB2cDhfcGFja19iaXRzdHJlYW0oVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBWUDhfSEVBREVSIG9oOwotICAgIFZQOF9DT01NT04gKmNvbnN0IHBjID0gJiBjcGktPmNvbW1vbjsKLSAgICB2cDhfd3JpdGVyICpjb25zdCBiYyA9ICYgY3BpLT5iYzsKLSAgICBNQUNST0JMT0NLRCAqY29uc3QgeGQgPSAmIGNwaS0+bWIuZV9tYmQ7Ci0gICAgaW50IGV4dHJhX2J5dGVzX3BhY2tlZCA9IDA7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpjeF9kYXRhID0gZGVzdDsKLSAgICBjb25zdCBpbnQgKm1iX2ZlYXR1cmVfZGF0YV9iaXRzOwotCi0gICAgb2guc2hvd19mcmFtZSA9IChpbnQpIHBjLT5zaG93X2ZyYW1lOwotICAgIG9oLnR5cGUgPSAoaW50KXBjLT5mcmFtZV90eXBlOwotICAgIG9oLnZlcnNpb24gPSBwYy0+dmVyc2lvbjsKLSAgICBvaC5maXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzID0gMDsKLQotICAgIG1iX2ZlYXR1cmVfZGF0YV9iaXRzID0gdnA4X21iX2ZlYXR1cmVfZGF0YV9iaXRzOwotICAgIGN4X2RhdGEgKz0gMzsKLQotI2lmIGRlZmluZWQoU0VDVElPTkJJVFNfT1VUUFVUKQotICAgIFNlY3Rpb25iaXRzW2FjdGl2ZV9zZWN0aW9uID0gMV0gKz0gc2l6ZW9mKFZQOF9IRUFERVIpICogOCAqIDI1NjsKLSNlbmRpZgotCi0gICAgLy92cDhfa2ZfZGVmYXVsdF9ibW9kZV9wcm9icygpIGlzIGNhbGxlZCBpbiB2cDhfc2V0dXBfa2V5X2ZyYW1lKCkgb25jZSBmb3IgZWFjaAotICAgIC8vSyBmcmFtZSBiZWZvcmUgZW5jb2RlIGZyYW1lLiBwYy0+a2ZfYm1vZGVfcHJvYiBkb2Vzbid0IGdldCBjaGFuZ2VkIGFueXdoZXJlCi0gICAgLy9lbHNlLiBObyBuZWVkIHRvIGNhbGwgaXQgYWdhaW4gaGVyZS4gLS15dwotICAgIC8vdnA4X2tmX2RlZmF1bHRfYm1vZGVfcHJvYnMoIHBjLT5rZl9ibW9kZV9wcm9iKTsKLQotICAgIC8vIGV2ZXJ5IGtleWZyYW1lIHNlbmQgc3RhcnRjb2RlLCB3aWR0aCwgaGVpZ2h0LCBzY2FsZSBmYWN0b3IsIGNsYW1wIGFuZCBjb2xvciB0eXBlCi0gICAgaWYgKG9oLnR5cGUgPT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgaW50IHY7Ci0KLSAgICAgICAgLy8gU3RhcnQgLyBzeW5jaCBjb2RlCi0gICAgICAgIGN4X2RhdGFbMF0gPSAweDlEOwotICAgICAgICBjeF9kYXRhWzFdID0gMHgwMTsKLSAgICAgICAgY3hfZGF0YVsyXSA9IDB4MmE7Ci0KLSAgICAgICAgdiA9IChwYy0+aG9yaXpfc2NhbGUgPDwgMTQpIHwgcGMtPldpZHRoOwotICAgICAgICBjeF9kYXRhWzNdID0gdjsKLSAgICAgICAgY3hfZGF0YVs0XSA9IHYgPj4gODsKLQotICAgICAgICB2ID0gKHBjLT52ZXJ0X3NjYWxlIDw8IDE0KSB8IHBjLT5IZWlnaHQ7Ci0gICAgICAgIGN4X2RhdGFbNV0gPSB2OwotICAgICAgICBjeF9kYXRhWzZdID0gdiA+PiA4OwotCi0gICAgICAgIGV4dHJhX2J5dGVzX3BhY2tlZCA9IDc7Ci0gICAgICAgIGN4X2RhdGEgKz0gZXh0cmFfYnl0ZXNfcGFja2VkIDsKLQotICAgICAgICB2cDhfc3RhcnRfZW5jb2RlKGJjLCBjeF9kYXRhKTsKLQotICAgICAgICAvLyBzaWduYWwgY2xyIHR5cGUKLSAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgcGMtPmNscl90eXBlKTsKLSAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgcGMtPmNsYW1wX3R5cGUpOwotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgdnA4X3N0YXJ0X2VuY29kZShiYywgY3hfZGF0YSk7Ci0KLQotICAgIC8vIFNpZ25hbCB3aGV0aGVyIG9yIG5vdCBTZWdtZW50YXRpb24gaXMgZW5hYmxlZAotICAgIHZwOF93cml0ZV9iaXQoYmMsICh4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQpID8gMSA6IDApOwotCi0gICAgLy8gSW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgYXJlIGVuYWJsZWQKLSAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgIHsKLSAgICAgICAgLy8gU2lnbmFsIHdoZXRoZXIgb3Igbm90IHRoZSBzZWdtZW50YXRpb24gbWFwIGlzIGJlaW5nIHVwZGF0ZWQuCi0gICAgICAgIHZwOF93cml0ZV9iaXQoYmMsICh4ZC0+dXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApID8gMSA6IDApOwotICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAoeGQtPnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSkgPyAxIDogMCk7Ci0KLSAgICAgICAgaWYgKHhkLT51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNpZ25lZCBjaGFyIERhdGE7Ci0KLSAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsICh4ZC0+bWJfc2VnZW1lbnRfYWJzX2RlbHRhKSA/IDEgOiAwKTsKLQotICAgICAgICAgICAgLy8gRm9yIGVhY2ggc2VnbWVudGF0aW9uIGZlYXR1cmUgKFF1YW50IGFuZCBsb29wIGZpbHRlciBsZXZlbCkKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQl9MVkxfTUFYOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggb2YgdGhlIHNlZ21lbnRzCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9NQl9TRUdNRU5UUzsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtpXVtqXTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGcmFtZSBsZXZlbCBkYXRhCi0gICAgICAgICAgICAgICAgICAgIGlmIChEYXRhKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERhdGEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSAtIERhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIERhdGEsIG1iX2ZlYXR1cmVfZGF0YV9iaXRzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgRGF0YSwgbWJfZmVhdHVyZV9kYXRhX2JpdHNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4ZC0+dXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9icyB1c2VkIHRvIGRlY29kZSB0aGUgc2VnbWVudCBpZCBmb3IgZWFjaCBtYWNybyBibG9jay4KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQl9GRUFUVVJFX1RSRUVfUFJPQlM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgRGF0YSA9IHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoRGF0YSAhPSAyNTUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIERhdGEsIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ29kZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdG8gdXBkYXRlIHRoZSBzY2FuIG9yZGVyLgotICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5maWx0ZXJfdHlwZSk7Ci0gICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIHBjLT5maWx0ZXJfbGV2ZWwsIDYpOwotICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCBwYy0+c2hhcnBuZXNzX2xldmVsLCAzKTsKLQotICAgIC8vIFdyaXRlIG91dCBsb29wIGZpbHRlciBkZWx0YXMgYXBwbGllZCBhdCB0aGUgTUIgbGV2ZWwgYmFzZWQgb24gbW9kZSBvciByZWYgZnJhbWUgKGlmIHRoZXkgYXJlIGVuYWJsZWQpLgotICAgIHZwOF93cml0ZV9iaXQoYmMsICh4ZC0+bW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZCkgPyAxIDogMCk7Ci0KLSAgICBpZiAoeGQtPm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQpCi0gICAgewotICAgICAgICAvLyBEbyB0aGUgZGVsdGFzIG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAgICBpbnQgc2VuZF91cGRhdGUgPSB4ZC0+bW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZTsKLQotICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCBzZW5kX3VwZGF0ZSk7Ci0gICAgICAgIGlmIChzZW5kX3VwZGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IERhdGE7Ci0KLSAgICAgICAgICAgIC8vIFNlbmQgdXBkYXRlCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9MRl9ERUxUQVM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEYXRhID0geGQtPnJlZl9sZl9kZWx0YXNbaV07Ci0KLSAgICAgICAgICAgICAgICAvLyBGcmFtZSBsZXZlbCBkYXRhCi0gICAgICAgICAgICAgICAgaWYgKHhkLT5yZWZfbGZfZGVsdGFzW2ldICE9IHhkLT5sYXN0X3JlZl9sZl9kZWx0YXNbaV0KLSAgICAgICAgICAgICAgICAgICAgfHwgY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeGQtPmxhc3RfcmVmX2xmX2RlbHRhc1tpXSA9IHhkLT5yZWZfbGZfZGVsdGFzW2ldOwotICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCAoRGF0YSAmIDB4M0YpLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDApOyAgICAvLyBzaWduCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gLURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgKERhdGEgJiAweDNGKSwgNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAxKTsgICAgLy8gc2lnbgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNlbmQgdXBkYXRlCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVfTEZfREVMVEFTOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGF0YSA9IHhkLT5tb2RlX2xmX2RlbHRhc1tpXTsKLQotICAgICAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9sZl9kZWx0YXNbaV0gIT0geGQtPmxhc3RfbW9kZV9sZl9kZWx0YXNbaV0KLSAgICAgICAgICAgICAgICAgICAgfHwgY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeGQtPmxhc3RfbW9kZV9sZl9kZWx0YXNbaV0gPSB4ZC0+bW9kZV9sZl9kZWx0YXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChEYXRhID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIChEYXRhICYgMHgzRiksIDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3dyaXRlX2JpdChiYywgMCk7ICAgIC8vIHNpZ24KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSAtRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9saXRlcmFsKGJjLCAoRGF0YSAmIDB4M0YpLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIDEpOyAgICAvLyBzaWduCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vc2lnbmFsIGhlcmUgaXMgbXVsdGkgdG9rZW4gcGFydGl0aW9uIGlzIGVuYWJsZWQKLSAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcGMtPm11bHRpX3Rva2VuX3BhcnRpdGlvbiwgMik7Ci0KLSAgICAvLyBGcmFtZSBRYmFzZWxpbmUgcXVhbnRpemVyIGluZGV4Ci0gICAgdnA4X3dyaXRlX2xpdGVyYWwoYmMsIHBjLT5iYXNlX3FpbmRleCwgNyk7Ci0KLSAgICAvLyBUcmFuc21pdCBEYywgU2Vjb25kIG9yZGVyIGFuZCBVdiBxdWFudGl6ZXIgZGVsdGEgaW5mb3JtYXRpb24KLSAgICBwdXRfZGVsdGFfcShiYywgcGMtPnkxZGNfZGVsdGFfcSk7Ci0gICAgcHV0X2RlbHRhX3EoYmMsIHBjLT55MmRjX2RlbHRhX3EpOwotICAgIHB1dF9kZWx0YV9xKGJjLCBwYy0+eTJhY19kZWx0YV9xKTsKLSAgICBwdXRfZGVsdGFfcShiYywgcGMtPnV2ZGNfZGVsdGFfcSk7Ci0gICAgcHV0X2RlbHRhX3EoYmMsIHBjLT51dmFjX2RlbHRhX3EpOwotCi0gICAgLy8gV2hlbiB0aGVyZSBpcyBhIGtleSBmcmFtZSBhbGwgcmVmZXJlbmNlIGJ1ZmZlcnMgYXJlIHVwZGF0ZWQgdXNpbmcgdGhlIG5ldyBrZXkgZnJhbWUKLSAgICBpZiAocGMtPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgLy8gU2hvdWxkIHRoZSBHRiBvciBBUkYgYmUgdXBkYXRlZCB1c2luZyB0aGUgdHJhbnNtaXR0ZWQgZnJhbWUgb3IgYnVmZmVyCi0gICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSk7Ci0gICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpOwotCi0gICAgICAgIC8vIElmIG5vdCBiZWluZyB1cGRhdGVkIGZyb20gY3VycmVudCBmcmFtZSBzaG91bGQgZWl0aGVyIEdGIG9yIEFSRiBiZSB1cGRhdGVkIGZyb20gYW5vdGhlciBidWZmZXIKLSAgICAgICAgaWYgKCFwYy0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCi0gICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcGMtPmNvcHlfYnVmZmVyX3RvX2dmLCAyKTsKLQotICAgICAgICBpZiAoIXBjLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbChiYywgcGMtPmNvcHlfYnVmZmVyX3RvX2FyZiwgMik7Ci0KLSAgICAgICAgLy8gSW5kaWNhdGUgcmVmZXJlbmNlIGZyYW1lIHNpZ24gYmlhcyBmb3IgR29sZGVuIGFuZCBBUkYgZnJhbWVzIChhbHdheXMgMCBmb3IgbGFzdCBmcmFtZSBidWZmZXIpCi0gICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5yZWZfZnJhbWVfc2lnbl9iaWFzW0dPTERFTl9GUkFNRV0pOwotICAgICAgICB2cDhfd3JpdGVfYml0KGJjLCBwYy0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tBTFRSRUZfRlJBTUVdKTsKLSAgICB9Ci0KLSAgICB2cDhfd3JpdGVfYml0KGJjLCBwYy0+cmVmcmVzaF9lbnRyb3B5X3Byb2JzKTsKLQotICAgIGlmIChwYy0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5yZWZyZXNoX2xhc3RfZnJhbWUpOwotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotCi0gICAgaWYgKHBjLT5mcmFtZV90eXBlID09IElOVEVSX0ZSQU1FKQotICAgICAgICBhY3RpdmVfc2VjdGlvbiA9IDA7Ci0gICAgZWxzZQotICAgICAgICBhY3RpdmVfc2VjdGlvbiA9IDc7Ci0KLSNlbmRpZgotCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAgLy9fX2FzbSBlbW1zOwotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBzYXZlIGEgY29weSBmb3IgbGF0ZXIgcmVmcmVzaAotICAgIHsKLSAgICAgICAgdnB4X21lbWNweSgmY3BpLT5jb21tb24ubGZjLCAmY3BpLT5jb21tb24uZmMsIHNpemVvZihjcGktPmNvbW1vbi5mYykpOwotICAgIH0KLQotICAgIHVwZGF0ZV9jb2VmX3Byb2JzKGNwaSk7Ci0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgYWN0aXZlX3NlY3Rpb24gPSAyOwotI2VuZGlmCi0KLSAgICAvLyBXcml0ZSBvdXQgdGhlIG1iX25vX2NvZWZmX3NraXAgZmxhZwotICAgIHZwOF93cml0ZV9iaXQoYmMsIHBjLT5tYl9ub19jb2VmZl9za2lwKTsKLQotICAgIGlmIChwYy0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgewotICAgICAgICB3cml0ZV9rZm1vZGVzKGNwaSk7Ci0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgICAgIGFjdGl2ZV9zZWN0aW9uID0gODsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwYWNrX2ludGVyX21vZGVfbXZzKGNwaSk7Ci0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgICAgIGFjdGl2ZV9zZWN0aW9uID0gMTsKLSNlbmRpZgotICAgIH0KLQotICAgIHZwOF9zdG9wX2VuY29kZShiYyk7Ci0KLSAgICBvaC5maXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzID0gY3BpLT5iYy5wb3M7Ci0KLSAgICAvKiB1cGRhdGUgZnJhbWUgdGFnICovCi0gICAgewotICAgICAgICBpbnQgdiA9IChvaC5maXJzdF9wYXJ0aXRpb25fbGVuZ3RoX2luX2J5dGVzIDw8IDUpIHwKLSAgICAgICAgICAgICAgICAob2guc2hvd19mcmFtZSA8PCA0KSB8Ci0gICAgICAgICAgICAgICAgKG9oLnZlcnNpb24gPDwgMSkgfAotICAgICAgICAgICAgICAgIG9oLnR5cGU7Ci0KLSAgICAgICAgZGVzdFswXSA9IHY7Ci0gICAgICAgIGRlc3RbMV0gPSB2ID4+IDg7Ci0gICAgICAgIGRlc3RbMl0gPSB2ID4+IDE2OwotICAgIH0KLQotICAgICpzaXplID0gVlA4X0hFQURFUl9TSVpFICsgZXh0cmFfYnl0ZXNfcGFja2VkICsgY3BpLT5iYy5wb3M7Ci0KLSAgICBpZiAocGMtPm11bHRpX3Rva2VuX3BhcnRpdGlvbiAhPSBPTkVfUEFSVElUSU9OKQotICAgIHsKLSAgICAgICAgaW50IG51bV9wYXJ0OwotICAgICAgICBpbnQgYXNpemU7Ci0gICAgICAgIG51bV9wYXJ0ID0gMSA8PCBwYy0+bXVsdGlfdG9rZW5fcGFydGl0aW9uOwotCi0gICAgICAgIHBhY2tfdG9rZW5zX2ludG9fcGFydGl0aW9ucyhjcGksIGN4X2RhdGEgKyBiYy0+cG9zLCBudW1fcGFydCwgJmFzaXplKTsKLQotICAgICAgICAqc2l6ZSArPSBhc2l6ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X3N0YXJ0X2VuY29kZSgmY3BpLT5iYzIsIGN4X2RhdGEgKyBiYy0+cG9zKTsKLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgICAgICBpZiAoY3BpLT5iX211bHRpX3RocmVhZGVkKQotICAgICAgICAgICAgcGFja19tYl9yb3dfdG9rZW5zKGNwaSwgJmNwaS0+YmMyKTsKLSAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICBwYWNrX3Rva2VucygmY3BpLT5iYzIsIGNwaS0+dG9rLCBjcGktPnRva19jb3VudCk7Ci0KLSAgICAgICAgdnA4X3N0b3BfZW5jb2RlKCZjcGktPmJjMik7Ci0KLSAgICAgICAgKnNpemUgKz0gY3BpLT5iYzIucG9zOwotICAgIH0KLX0KLQotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLXZvaWQgcHJpbnRfdHJlZV91cGRhdGVfcHJvYnMoKQotewotICAgIGludCBpLCBqLCBrLCBsOwotICAgIEZJTEUgKmYgPSBmb3BlbigiY29udGV4dC5jIiwgImEiKTsKLSAgICBpbnQgU3VtOwotICAgIGZwcmludGYoZiwgIlxuLyogVXBkYXRlIHByb2JhYmlsaXRpZXMgZm9yIHRva2VuIGVudHJvcHkgdHJlZS4gKi9cblxuIik7Ci0gICAgZnByaW50ZihmLCAiY29uc3QgdnA4X3Byb2IgdHJlZV91cGRhdGVfcHJvYnNbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbdnA4X2NvZWZfdG9rZW5zLTFdID0ge1xuIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfVFlQRVM7IGkrKykKLSAgICB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgeyBcbiIpOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBDT0VGX0JBTkRTOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICB7XG4iKTsKLQotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IFBSRVZfQ09FRl9DT05URVhUUzsgaysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICAgIHsiKTsKLQotICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBNQVhfRU5UUk9QWV9UT0tFTlMgLSAxOyBsKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdW0gPSB0cmVlX3VwZGF0ZV9oaXN0W2ldW2pdW2tdW2xdWzBdICsgdHJlZV91cGRhdGVfaGlzdFtpXVtqXVtrXVtsXVsxXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU3VtID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgodHJlZV91cGRhdGVfaGlzdFtpXVtqXVtrXVtsXVswXSAqIDI1NSkgLyBTdW0pID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlM2xkLCAiLCAodHJlZV91cGRhdGVfaGlzdFtpXVtqXVtrXVtsXVswXSAqIDI1NSkgLyBTdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiUzbGQsICIsIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiUzbGQsICIsIDEyOCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAifSxcbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKGYsICIgICAgfSxcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihmLCAiICB9LFxuIik7Ci0gICAgfQotCi0gICAgZnByaW50ZihmLCAifTtcbiIpOwotICAgIGZjbG9zZShmKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYml0c3RyZWFtLmggYi92cDgvZW5jb2Rlci9iaXRzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkMTQ4ZS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9iaXRzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0JJVFNUUkVBTV9ICi0jZGVmaW5lIF9fSU5DX0JJVFNUUkVBTV9ICi0KLSNpZiBIQVZFX0FSTVY1VEUKLXZvaWQgdnA4Y3hfcGFja190b2tlbnNfYXJtdjUodnA4X3dyaXRlciAqdywgY29uc3QgVE9LRU5FWFRSQSAqcCwgaW50IHhjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3Rva2VuICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9leHRyYV9iaXRfc3RydWN0ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90cmVlX2luZGV4ICopOwotdm9pZCB2cDhjeF9wYWNrX3Rva2Vuc19pbnRvX3BhcnRpdGlvbnNfYXJtdjUoVlA4X0NPTVAgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQgLCBpbnQgKiwKLSAgICAgICAgdnA4X3Rva2VuICosCi0gICAgICAgIHZwOF9leHRyYV9iaXRfc3RydWN0ICosCi0gICAgICAgIGNvbnN0IHZwOF90cmVlX2luZGV4ICopOwotdm9pZCB2cDhjeF9wYWNrX21iX3Jvd190b2tlbnNfYXJtdjUoVlA4X0NPTVAgKmNwaSwgdnA4X3dyaXRlciAqdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF90b2tlbiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZwOF90cmVlX2luZGV4ICopOwotIyBkZWZpbmUgcGFja190b2tlbnMoYSxiLGMpICAgICAgICAgICAgICAgICAgXAotICAgIHZwOGN4X3BhY2tfdG9rZW5zX2FybXY1KGEsYixjLHZwOF9jb2VmX2VuY29kaW5ncyx2cDhfZXh0cmFfYml0cyx2cDhfY29lZl90cmVlKQotIyBkZWZpbmUgcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zKGEsYixjLGQpICBcCi0gICAgdnA4Y3hfcGFja190b2tlbnNfaW50b19wYXJ0aXRpb25zX2FybXY1KGEsYixjLGQsdnA4X2NvZWZfZW5jb2RpbmdzLHZwOF9leHRyYV9iaXRzLHZwOF9jb2VmX3RyZWUpCi0jIGRlZmluZSBwYWNrX21iX3Jvd190b2tlbnMoYSxiKSAgICAgICAgICAgICAgIFwKLSAgICB2cDhjeF9wYWNrX21iX3Jvd190b2tlbnNfYXJtdjUoYSxiLHZwOF9jb2VmX2VuY29kaW5ncyx2cDhfZXh0cmFfYml0cyx2cDhfY29lZl90cmVlKQotI2Vsc2UKLSMgZGVmaW5lIHBhY2tfdG9rZW5zKGEsYixjKSAgICAgICAgICAgICAgICAgIHBhY2tfdG9rZW5zX2MoYSxiLGMpCi0jIGRlZmluZSBwYWNrX3Rva2Vuc19pbnRvX3BhcnRpdGlvbnMoYSxiLGMsZCkgIHBhY2tfdG9rZW5zX2ludG9fcGFydGl0aW9uc19jKGEsYixjLGQpCi0jIGRlZmluZSBwYWNrX21iX3Jvd190b2tlbnMoYSxiKSAgICAgICAgICAgICAgIHBhY2tfbWJfcm93X3Rva2Vuc19jKGEsYikKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9ibG9jay5oIGIvdnA4L2VuY29kZXIvYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNjc4Mi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9ibG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0JMT0NLX0gKLSNkZWZpbmUgX19JTkNfQkxPQ0tfSAotCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltdi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weS5oIgotI2luY2x1ZGUgInZweF9wb3J0cy9tZW0uaCIKLQotLy8gbW90aW9uIHNlYXJjaCBzaXRlCi10eXBlZGVmIHN0cnVjdAotewotICAgIE1WIG12OwotICAgIGludCBvZmZzZXQ7Ci19IHNlYXJjaF9zaXRlOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8vIDE2IFkgYmxvY2tzLCA0IFUgYmxvY2tzLCA0IFYgYmxvY2tzIGVhY2ggd2l0aCAxNiBlbnRyaWVzCi0gICAgc2hvcnQgKnNyY19kaWZmOwotICAgIHNob3J0ICpjb2VmZjsKLQotICAgIC8vIDE2IFkgYmxvY2tzLCA0IFUgYmxvY2tzLCA0IFYgYmxvY2tzIGVhY2ggd2l0aCAxNiBlbnRyaWVzCi0gICAgc2hvcnQgKnF1YW50OwotICAgIHNob3J0ICpxdWFudF9mYXN0OwotICAgIHNob3J0ICpxdWFudF9zaGlmdDsKLSAgICBzaG9ydCAqemJpbjsKLSAgICBzaG9ydCAqenJ1bl96YmluX2Jvb3N0OwotICAgIHNob3J0ICpyb3VuZDsKLQotICAgIC8vIFpiaW4gT3ZlciBRdWFudCB2YWx1ZQotICAgIHNob3J0IHpiaW5fZXh0cmE7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICoqYmFzZV9zcmM7Ci0gICAgaW50IHNyYzsKLSAgICBpbnQgc3JjX3N0cmlkZTsKLQotLy8gIE1WICBlbmNfbXY7Ci0gICAgaW50IGZvcmNlX2VtcHR5OwotCi19IEJMT0NLOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludCBjb3VudDsKLSAgICBCX01PREVfSU5GTyBibWlbMTZdOwotfSBQQVJUSVRJT05fSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBzcmNfZGlmZls0MDBdKTsgICAgICAgLy8gMTZ4MTYgWSA4eDggVSA4eDggViA0eDQgMm5kIFkKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBjb2VmZls0MDBdKTsgICAgIC8vIDE2eDE2IFkgOHg4IFUgOHg4IFYgNHg0IDJuZCBZCi0KLSAgICAvLyAxNiBZIGJsb2NrcywgNCBVIGJsb2NrcywgNCBWIGJsb2NrcywgMSBEQyAybmQgb3JkZXIgYmxvY2sgZWFjaCB3aXRoIDE2IGVudHJpZXMKLSAgICBCTE9DSyBibG9ja1syNV07Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgc3JjOwotCi0gICAgTUFDUk9CTE9DS0QgZV9tYmQ7Ci0gICAgUEFSVElUSU9OX0lORk8gKnBhcnRpdGlvbl9pbmZvOyAvKiB3b3JrIHBvaW50ZXIgKi8KLSAgICBQQVJUSVRJT05fSU5GTyAqcGk7ICAgLyogQ29ycmVzcG9uZHMgdG8gdXBwZXIgbGVmdCB2aXNpYmxlIG1hY3JvYmxvY2sgKi8KLSAgICBQQVJUSVRJT05fSU5GTyAqcGlwOyAgLyogQmFzZSBvZiBhbGxvY2F0ZWQgYXJyYXkgKi8KLQotICAgIHNlYXJjaF9zaXRlICpzczsKLSAgICBpbnQgc3NfY291bnQ7Ci0gICAgaW50IHNlYXJjaGVzX3Blcl9zdGVwOwotCi0gICAgaW50IGVycm9ycGVyYml0OwotICAgIGludCBzYWRwZXJiaXQxNjsKLSAgICBpbnQgc2FkcGVyYml0NDsKLSAgICBpbnQgZXJydGhyZXNoOwotICAgIGludCByZGRpdjsKLSAgICBpbnQgcmRtdWx0OwotICAgIElOVDY0IGFjdGl2aXR5X3N1bTsKLQotICAgIGludCBtdmNvc3RzWzJdW01WdmFscysxXTsKLSAgICBpbnQgKm12Y29zdFsyXTsKLSAgICBpbnQgbXZzYWRjb3N0c1syXVtNVnZhbHMrMV07Ci0gICAgaW50ICptdnNhZGNvc3RbMl07Ci0gICAgaW50IG1ibW9kZV9jb3N0WzJdW01CX01PREVfQ09VTlRdOwotICAgIGludCBpbnRyYV91dl9tb2RlX2Nvc3RbMl1bTUJfTU9ERV9DT1VOVF07Ci0gICAgdW5zaWduZWQgaW50IGJtb2RlX2Nvc3RzWzEwXVsxMF1bMTBdOwotICAgIHVuc2lnbmVkIGludCBpbnRlcl9ibW9kZV9jb3N0c1tCX01PREVfQ09VTlRdOwotCi0gICAgLy8gVGhlc2UgZGVmaW5lIGxpbWl0cyB0byBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudHMgdG8gcHJldmVudCB0aGVtIGZyb20gZXh0ZW5kaW5nIG91dHNpZGUgdGhlIFVNViBib3JkZXJzCi0gICAgaW50IG12X2NvbF9taW47Ci0gICAgaW50IG12X2NvbF9tYXg7Ci0gICAgaW50IG12X3Jvd19taW47Ci0gICAgaW50IG12X3Jvd19tYXg7Ci0KLSAgICBpbnQgdmVjdG9yX3JhbmdlOyAgICAvLyBVc2VkIHRvIG1vbml0b3IgbGltaXRpbmcgcmFuZ2Ugb2YgcmVjZW50IHZlY3RvcnMgdG8gZ3VpZGUgc2VhcmNoLgotICAgIGludCBza2lwOwotCi0gICAgaW50IGVuY29kZV9icmVha291dDsKLQotICAgIC8vY2hhciAqIGdmX2FjdGl2ZV9wdHI7Ci0gICAgc2lnbmVkIGNoYXIgKmdmX2FjdGl2ZV9wdHI7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICphY3RpdmVfcHRyOwotICAgIE1WX0NPTlRFWFQgKm12YzsKLQotICAgIHVuc2lnbmVkIGludCB0b2tlbl9jb3N0c1tCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFt2cDhfY29lZl90b2tlbnNdOwotICAgIGludCBvcHRpbWl6ZTsKLSAgICBpbnQgcV9pbmRleDsKLQotICAgIHZvaWQgKCp2cDhfc2hvcnRfZmRjdDR4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotICAgIHZvaWQgKCp2cDhfc2hvcnRfZmRjdDh4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotICAgIHZvaWQgKCpzaG9ydF93YWxzaDR4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotICAgIHZvaWQgKCpxdWFudGl6ZV9iKShCTE9DSyAqYiwgQkxPQ0tEICpkKTsKLQotfSBNQUNST0JMT0NLOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYm9vbGh1ZmYuYyBiL3ZwOC9lbmNvZGVyL2Jvb2xodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGQyYjAuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYm9vbGh1ZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgImJvb2xodWZmLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKLQotCi0KLSNpZiBkZWZpbmVkKFNFQ1RJT05CSVRTX09VVFBVVCkKLXVuc2lnbmVkIF9faW50NjQgU2VjdGlvbmJpdHNbNTAwXTsKLQotI2VuZGlmCi0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi11bnNpZ25lZCBpbnQgYWN0aXZlX3NlY3Rpb24gPSAwOwotI2VuZGlmCi0KLWNvbnN0IHVuc2lnbmVkIGludCB2cDhfcHJvYl9jb3N0WzI1Nl0gPQotewotICAgIDIwNDcsIDIwNDcsIDE3OTEsIDE2NDEsIDE1MzUsIDE0NTIsIDEzODUsIDEzMjgsIDEyNzksIDEyMzUsIDExOTYsIDExNjEsIDExMjksIDEwOTksIDEwNzIsIDEwNDYsCi0gICAgMTAyMywgMTAwMCwgIDk3OSwgIDk1OSwgIDk0MCwgIDkyMiwgIDkwNSwgIDg4OSwgIDg3MywgIDg1OCwgIDg0MywgIDgyOSwgIDgxNiwgIDgwMywgIDc5MCwgIDc3OCwKLSAgICA3NjcsICA3NTUsICA3NDQsICA3MzMsICA3MjMsICA3MTMsICA3MDMsICA2OTMsICA2ODQsICA2NzUsICA2NjYsICA2NTcsICA2NDksICA2NDEsICA2MzMsICA2MjUsCi0gICAgNjE3LCAgNjA5LCAgNjAyLCAgNTk0LCAgNTg3LCAgNTgwLCAgNTczLCAgNTY3LCAgNTYwLCAgNTUzLCAgNTQ3LCAgNTQxLCAgNTM0LCAgNTI4LCAgNTIyLCAgNTE2LAotICAgIDUxMSwgIDUwNSwgIDQ5OSwgIDQ5NCwgIDQ4OCwgIDQ4MywgIDQ3NywgIDQ3MiwgIDQ2NywgIDQ2MiwgIDQ1NywgIDQ1MiwgIDQ0NywgIDQ0MiwgIDQzNywgIDQzMywKLSAgICA0MjgsICA0MjQsICA0MTksICA0MTUsICA0MTAsICA0MDYsICA0MDEsICAzOTcsICAzOTMsICAzODksICAzODUsICAzODEsICAzNzcsICAzNzMsICAzNjksICAzNjUsCi0gICAgMzYxLCAgMzU3LCAgMzUzLCAgMzQ5LCAgMzQ2LCAgMzQyLCAgMzM4LCAgMzM1LCAgMzMxLCAgMzI4LCAgMzI0LCAgMzIxLCAgMzE3LCAgMzE0LCAgMzExLCAgMzA3LAotICAgIDMwNCwgIDMwMSwgIDI5NywgIDI5NCwgIDI5MSwgIDI4OCwgIDI4NSwgIDI4MSwgIDI3OCwgIDI3NSwgIDI3MiwgIDI2OSwgIDI2NiwgIDI2MywgIDI2MCwgIDI1NywKLSAgICAyNTUsICAyNTIsICAyNDksICAyNDYsICAyNDMsICAyNDAsICAyMzgsICAyMzUsICAyMzIsICAyMjksICAyMjcsICAyMjQsICAyMjEsICAyMTksICAyMTYsICAyMTQsCi0gICAgMjExLCAgMjA4LCAgMjA2LCAgMjAzLCAgMjAxLCAgMTk4LCAgMTk2LCAgMTk0LCAgMTkxLCAgMTg5LCAgMTg2LCAgMTg0LCAgMTgxLCAgMTc5LCAgMTc3LCAgMTc0LAotICAgIDE3MiwgIDE3MCwgIDE2OCwgIDE2NSwgIDE2MywgIDE2MSwgIDE1OSwgIDE1NiwgIDE1NCwgIDE1MiwgIDE1MCwgIDE0OCwgIDE0NSwgIDE0MywgIDE0MSwgIDEzOSwKLSAgICAxMzcsICAxMzUsICAxMzMsICAxMzEsICAxMjksICAxMjcsICAxMjUsICAxMjMsICAxMjEsICAxMTksICAxMTcsICAxMTUsICAxMTMsICAxMTEsICAxMDksICAxMDcsCi0gICAgMTA1LCAgMTAzLCAgMTAxLCAgIDk5LCAgIDk3LCAgIDk1LCAgIDkzLCAgIDkyLCAgIDkwLCAgIDg4LCAgIDg2LCAgIDg0LCAgIDgyLCAgIDgxLCAgIDc5LCAgIDc3LAotICAgIDc1LCAgIDczLCAgIDcyLCAgIDcwLCAgIDY4LCAgIDY2LCAgIDY1LCAgIDYzLCAgIDYxLCAgIDYwLCAgIDU4LCAgIDU2LCAgIDU1LCAgIDUzLCAgIDUxLCAgIDUwLAotICAgIDQ4LCAgIDQ2LCAgIDQ1LCAgIDQzLCAgIDQxLCAgIDQwLCAgIDM4LCAgIDM3LCAgIDM1LCAgIDMzLCAgIDMyLCAgIDMwLCAgIDI5LCAgIDI3LCAgIDI1LCAgIDI0LAotICAgIDIyLCAgIDIxLCAgIDE5LCAgIDE4LCAgIDE2LCAgIDE1LCAgIDEzLCAgIDEyLCAgIDEwLCAgICA5LCAgICA3LCAgICA2LCAgICA0LCAgICAzLCAgICAxLCAgIDEKLX07Ci0KLXZvaWQgdnA4X3N0YXJ0X2VuY29kZShCT09MX0NPREVSICpiciwgdW5zaWduZWQgY2hhciAqc291cmNlKQotewotCi0gICAgYnItPmxvd3ZhbHVlID0gMDsKLSAgICBici0+cmFuZ2UgICAgPSAyNTU7Ci0gICAgYnItPnZhbHVlICAgID0gMDsKLSAgICBici0+Y291bnQgICAgPSAtMjQ7Ci0gICAgYnItPmJ1ZmZlciAgID0gc291cmNlOwotICAgIGJyLT5wb3MgICAgICA9IDA7Ci19Ci0KLXZvaWQgdnA4X3N0b3BfZW5jb2RlKEJPT0xfQ09ERVIgKmJyKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgICAgIHZwOF9lbmNvZGVfYm9vbChiciwgMCwgMTI4KTsKLX0KLQotREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50LCBub3JtWzI1Nl0pID0KLXsKLSAgICAwLCA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLXZvaWQgdnA4X2VuY29kZV9ib29sKEJPT0xfQ09ERVIgKmJyLCBpbnQgYml0LCBpbnQgcHJvYmFiaWxpdHkpCi17Ci0gICAgdW5zaWduZWQgaW50IHNwbGl0OwotICAgIGludCBjb3VudCA9IGJyLT5jb3VudDsKLSAgICB1bnNpZ25lZCBpbnQgcmFuZ2UgPSBici0+cmFuZ2U7Ci0gICAgdW5zaWduZWQgaW50IGxvd3ZhbHVlID0gYnItPmxvd3ZhbHVlOwotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBzaGlmdDsKLQotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLSNpZiBkZWZpbmVkKFNFQ1RJT05CSVRTX09VVFBVVCkKLQotICAgIGlmIChiaXQpCi0gICAgICAgIFNlY3Rpb25iaXRzW2FjdGl2ZV9zZWN0aW9uXSArPSB2cDhfcHJvYl9jb3N0WzI1NS1wcm9iYWJpbGl0eV07Ci0gICAgZWxzZQotICAgICAgICBTZWN0aW9uYml0c1thY3RpdmVfc2VjdGlvbl0gKz0gdnA4X3Byb2JfY29zdFtwcm9iYWJpbGl0eV07Ci0KLSNlbmRpZgotI2VuZGlmCi0KLSAgICBzcGxpdCA9IDEgKyAoKChyYW5nZSAtIDEpICogcHJvYmFiaWxpdHkpID4+IDgpOwotCi0gICAgcmFuZ2UgPSBzcGxpdDsKLQotICAgIGlmIChiaXQpCi0gICAgewotICAgICAgICBsb3d2YWx1ZSArPSBzcGxpdDsKLSAgICAgICAgcmFuZ2UgPSBici0+cmFuZ2UgLSBzcGxpdDsKLSAgICB9Ci0KLSAgICBzaGlmdCA9IG5vcm1bcmFuZ2VdOwotCi0gICAgcmFuZ2UgPDw9IHNoaWZ0OwotICAgIGNvdW50ICs9IHNoaWZ0OwotCi0gICAgaWYgKGNvdW50ID49IDApCi0gICAgewotICAgICAgICBpbnQgb2Zmc2V0ID0gc2hpZnQgLSBjb3VudDsKLQotICAgICAgICBpZiAoKGxvd3ZhbHVlIDw8IChvZmZzZXQgLSAxKSkgJiAweDgwMDAwMDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgeCA9IGJyLT5wb3MgLSAxOwotCi0gICAgICAgICAgICB3aGlsZSAoeCA+PSAwICYmIGJyLT5idWZmZXJbeF0gPT0gMHhmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBici0+YnVmZmVyW3hdID0gKHVuc2lnbmVkIGNoYXIpMDsKLSAgICAgICAgICAgICAgICB4LS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyLT5idWZmZXJbeF0gKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyLT5idWZmZXJbYnItPnBvcysrXSA9IChsb3d2YWx1ZSA+PiAoMjQgLSBvZmZzZXQpKTsKLSAgICAgICAgbG93dmFsdWUgPDw9IG9mZnNldDsKLSAgICAgICAgc2hpZnQgPSBjb3VudDsKLSAgICAgICAgbG93dmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICAgIGNvdW50IC09IDggOwotICAgIH0KLQotICAgIGxvd3ZhbHVlIDw8PSBzaGlmdDsKLSAgICBici0+Y291bnQgPSBjb3VudDsKLSAgICBici0+bG93dmFsdWUgPSBsb3d2YWx1ZTsKLSAgICBici0+cmFuZ2UgPSByYW5nZTsKLX0KLQotdm9pZCB2cDhfZW5jb2RlX3ZhbHVlKEJPT0xfQ09ERVIgKmJyLCBpbnQgZGF0YSwgaW50IGJpdHMpCi17Ci0gICAgaW50IGJpdDsKLQotICAgIGZvciAoYml0ID0gYml0cyAtIDE7IGJpdCA+PSAwOyBiaXQtLSkKLSAgICAgICAgdnA4X2VuY29kZV9ib29sKGJyLCAoMSAmIChkYXRhID4+IGJpdCkpLCAweDgwKTsKLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvYm9vbGh1ZmYuaCBiL3ZwOC9lbmNvZGVyL2Jvb2xodWZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjNkYTMuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvYm9vbGh1ZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgIE1vZHVsZSBUaXRsZSA6ICAgICBib29saHVmZi5oCi0qCi0qICAgRGVzY3JpcHRpb24gIDogICAgIEJvb2wgQ29kZXIgaGVhZGVyIGZpbGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lOQ19CT09MSFVGRl9ICi0jZGVmaW5lIF9fSU5DX0JPT0xIVUZGX0gKLQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVuc2lnbmVkIGludCBsb3d2YWx1ZTsKLSAgICB1bnNpZ25lZCBpbnQgcmFuZ2U7Ci0gICAgdW5zaWduZWQgaW50IHZhbHVlOwotICAgIGludCBjb3VudDsKLSAgICB1bnNpZ25lZCBpbnQgcG9zOwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQotICAgIC8vIFZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIGJpdCBjb3N0cyB3aXRob3V0IG91dHB1dGluZyB0byB0aGUgYml0c3RyZWFtCi0gICAgdW5zaWduZWQgaW50ICBtZWFzdXJlX2Nvc3Q7Ci0gICAgdW5zaWduZWQgbG9uZyBiaXRfY291bnRlcjsKLX0gQk9PTF9DT0RFUjsKLQotZXh0ZXJuIHZvaWQgdnA4X3N0YXJ0X2VuY29kZShCT09MX0NPREVSICpiYywgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKLWV4dGVybiB2b2lkIHZwOF9lbmNvZGVfYm9vbChCT09MX0NPREVSICpiYywgaW50IHgsIGludCBjb250ZXh0KTsKLWV4dGVybiB2b2lkIHZwOF9lbmNvZGVfdmFsdWUoQk9PTF9DT0RFUiAqYnIsIGludCBkYXRhLCBpbnQgYml0cyk7Ci1leHRlcm4gdm9pZCB2cDhfc3RvcF9lbmNvZGUoQk9PTF9DT0RFUiAqYmMpOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCB2cDhfcHJvYl9jb3N0WzI1Nl07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvZGN0LmggYi92cDgvZW5jb2Rlci9kY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjM2I0Yy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9kY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0RDVF9ICi0jZGVmaW5lIF9fSU5DX0RDVF9ICi0KLSNkZWZpbmUgcHJvdG90eXBlX2ZkY3Qoc3ltKSB2b2lkIChzeW0pKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvZGN0X3g4Ni5oIgotI2VuZGlmCi0KLSNpZiBBUkNIX0FSTQotI2luY2x1ZGUgImFybS9kY3RfYXJtLmgiCi0jZW5kaWYKLQotI2lmbmRlZiB2cDhfZmRjdF9zaG9ydDR4NAotI2RlZmluZSB2cDhfZmRjdF9zaG9ydDR4NCAgdnA4X3Nob3J0X2ZkY3Q0eDRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2ZkY3QodnA4X2ZkY3Rfc2hvcnQ0eDQpOwotCi0jaWZuZGVmIHZwOF9mZGN0X3Nob3J0OHg0Ci0jZGVmaW5lIHZwOF9mZGN0X3Nob3J0OHg0ICB2cDhfc2hvcnRfZmRjdDh4NF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfZmRjdF9zaG9ydDh4NCk7Ci0KLS8vIFRoZXJlIGlzIG5vIGZhc3Q0eDQgKGZvciBub3cpCi0jaWZuZGVmIHZwOF9mZGN0X2Zhc3Q0eDQKLSNkZWZpbmUgdnA4X2ZkY3RfZmFzdDR4NCAgdnA4X3Nob3J0X2ZkY3Q0eDRfYwotI2VuZGlmCi0KLSNpZm5kZWYgdnA4X2ZkY3RfZmFzdDh4NAotI2RlZmluZSB2cDhfZmRjdF9mYXN0OHg0ICB2cDhfc2hvcnRfZmRjdDh4NF9jCi0jZW5kaWYKLQotI2lmbmRlZiB2cDhfZmRjdF93YWxzaF9zaG9ydDR4NAotI2RlZmluZSB2cDhfZmRjdF93YWxzaF9zaG9ydDR4NCAgdnA4X3Nob3J0X3dhbHNoNHg0X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9mZGN0KHZwOF9mZGN0X3dhbHNoX3Nob3J0NHg0KTsKLQotdHlwZWRlZiBwcm90b3R5cGVfZmRjdCgqdnA4X2ZkY3RfZm5fdCk7Ci10eXBlZGVmIHN0cnVjdAotewotICAgIHZwOF9mZGN0X2ZuX3QgICAgc2hvcnQ0eDQ7Ci0gICAgdnA4X2ZkY3RfZm5fdCAgICBzaG9ydDh4NDsKLSAgICB2cDhfZmRjdF9mbl90ICAgIGZhc3Q0eDQ7Ci0gICAgdnA4X2ZkY3RfZm5fdCAgICBmYXN0OHg0OwotICAgIHZwOF9mZGN0X2ZuX3QgICAgd2Fsc2hfc2hvcnQ0eDQ7Ci19IHZwOF9mZGN0X3J0Y2RfdnRhYmxlX3Q7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIEZEQ1RfSU5WT0tFKGN0eCxmbikgKGN0eCktPmZuCi0jZWxzZQotI2RlZmluZSBGRENUX0lOVk9LRShjdHgsZm4pIHZwOF9mZGN0XyMjZm4KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2VuY29kZWZyYW1lLmMgYi92cDgvZW5jb2Rlci9lbmNvZGVmcmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTAxZDIwLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2VuY29kZWZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDI4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgImVuY29kZW1iLmgiCi0jaW5jbHVkZSAiZW5jb2RlbXYuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2NvbW1vbi5oIgotI2luY2x1ZGUgIm9ueXhfaW50LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9leHRlbmQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9xdWFudF9jb21tb24uaCIKLSNpbmNsdWRlICJzZWdtZW50YXRpb24uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3NldHVwaW50cmFyZWNvbi5oIgotI2luY2x1ZGUgImVuY29kZWludHJhLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludGVyLmgiCi0jaW5jbHVkZSAicmRvcHQuaCIKLSNpbmNsdWRlICJwaWNraW50ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmEuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgInZwOC9jb21tb24vc3VicGl4ZWwuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvdnB4X3RpbWVyLmgiCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIFJUQ0QoeCkgICAgICZjcGktPmNvbW1vbi5ydGNkLngKLSNkZWZpbmUgSUZfUlRDRCh4KSAgKHgpCi0jZWxzZQotI2RlZmluZSBSVENEKHgpICAgICBOVUxMCi0jZGVmaW5lIElGX1JUQ0QoeCkgIE5VTEwKLSNlbmRpZgotZXh0ZXJuIHZvaWQgdnA4X3N0dWZmX21iKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0tEICp4LCBUT0tFTkVYVFJBICoqdCkgOwotCi1leHRlcm4gdm9pZCB2cDhjeF9pbml0aWFsaXplX21lX2NvbnN0cyhWUDhfQ09NUCAqY3BpLCBpbnQgUUluZGV4KTsKLWV4dGVybiB2b2lkIHZwOF9hdXRvX3NlbGVjdF9zcGVlZChWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOGN4X2luaXRfbWJydGhyZWFkX2RhdGEoVlA4X0NPTVAgKmNwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDUk9CTE9DSyAqeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfUk9XX0NPTVAgKm1icl9laSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3JvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KTsKLXZvaWQgdnA4X2J1aWxkX2Jsb2NrX29mZnNldHMoTUFDUk9CTE9DSyAqeCk7Ci12b2lkIHZwOF9zZXR1cF9ibG9ja19wdHJzKE1BQ1JPQkxPQ0sgKngpOwotaW50IHZwOGN4X2VuY29kZV9pbnRlcl9tYWNyb2Jsb2NrKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIFRPS0VORVhUUkEgKip0LCBpbnQgcmVjb25feW9mZnNldCwgaW50IHJlY29uX3V2b2Zmc2V0KTsKLWludCB2cDhjeF9lbmNvZGVfaW50cmFfbWFjcm9fYmxvY2soVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgVE9LRU5FWFRSQSAqKnQpOwotCi0jaWZkZWYgTU9ERV9TVEFUUwotdW5zaWduZWQgaW50IGludGVyX3lfbW9kZXNbMTBdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotdW5zaWduZWQgaW50IGludGVyX3V2X21vZGVzWzRdID0gezAsIDAsIDAsIDB9OwotdW5zaWduZWQgaW50IGludGVyX2JfbW9kZXNbMTVdICA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLXVuc2lnbmVkIGludCB5X21vZGVzWzVdICAgPSB7MCwgMCwgMCwgMCwgMH07Ci11bnNpZ25lZCBpbnQgdXZfbW9kZXNbNF0gID0gezAsIDAsIDAsIDB9OwotdW5zaWduZWQgaW50IGJfbW9kZXNbMTRdICA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgaW50IHFyb3VuZGluZ19mYWN0b3JzWzEyOV0gPQotewotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OAotfTsKLQotc3RhdGljIGNvbnN0IGludCBxemJpbl9mYWN0b3JzWzEyOV0gPQotewotICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKLSAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCi0gICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAotICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKLSAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCi0gICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MAotfTsKLQotc3RhdGljIGNvbnN0IGludCBxcm91bmRpbmdfZmFjdG9yc195MlsxMjldID0KLXsKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0gICAgNDgKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgcXpiaW5fZmFjdG9yc195MlsxMjldID0KLXsKLSAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCi0gICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAotICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKLSAgICA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsCi0gICAgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LAotICAgIDg0LCA4NCwgODQsIDg0LCA4NCwgODQsIDg0LCA4NCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKLSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCi0gICAgODAKLX07Ci0KLSNkZWZpbmUgRVhBQ1RfUVVBTlQKLSNpZmRlZiBFWEFDVF9RVUFOVAotc3RhdGljIHZvaWQgdnA4Y3hfaW52ZXJ0X3F1YW50KGludCBpbXByb3ZlZF9xdWFudCwgc2hvcnQgKnF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpzaGlmdCwgc2hvcnQgZCkKLXsKLSAgICBpZihpbXByb3ZlZF9xdWFudCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIHQ7Ci0gICAgICAgIGludCBsOwotICAgICAgICB0ID0gZDsKLSAgICAgICAgZm9yKGwgPSAwOyB0ID4gMTsgbCsrKQotICAgICAgICAgICAgdD4+PTE7Ci0gICAgICAgIHQgPSAxICsgKDE8PCgxNitsKSkvZDsKLSAgICAgICAgKnF1YW50ID0gKHNob3J0KSh0IC0gKDE8PDE2KSk7Ci0gICAgICAgICpzaGlmdCA9IGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpxdWFudCA9ICgxIDw8IDE2KSAvIGQ7Ci0gICAgICAgICpzaGlmdCA9IDA7Ci0gICAgfQotfQotCi12b2lkIHZwOGN4X2luaXRfcXVhbnRpemVyKFZQOF9DT01QICpjcGkpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IHF1YW50X3ZhbDsKLSAgICBpbnQgUTsKLQotICAgIGludCB6YmluX2Jvb3N0WzE2XSA9IHswLCAwLCA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzIsIDM2LCA0MCwgNDQsIDQ0LCA0NH07Ci0KLSAgICBmb3IgKFEgPSAwOyBRIDwgUUlOREVYX1JBTkdFOyBRKyspCi0gICAgewotICAgICAgICAvLyBkYyB2YWx1ZXMKLSAgICAgICAgcXVhbnRfdmFsID0gdnA4X2RjX3F1YW50KFEsIGNwaS0+Y29tbW9uLnkxZGNfZGVsdGFfcSk7Ci0gICAgICAgIGNwaS0+WTFxdWFudF9mYXN0W1FdWzBdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOwotICAgICAgICB2cDhjeF9pbnZlcnRfcXVhbnQoY3BpLT5zZi5pbXByb3ZlZF9xdWFudCwgY3BpLT5ZMXF1YW50W1FdICsgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+WTFxdWFudF9zaGlmdFtRXSArIDAsIHF1YW50X3ZhbCk7Ci0gICAgICAgIGNwaS0+WTF6YmluW1FdWzBdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OwotICAgICAgICBjcGktPlkxcm91bmRbUV1bMF0gPSAocXJvdW5kaW5nX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpID4+IDc7Ci0gICAgICAgIGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRXVswXSA9IHF1YW50X3ZhbDsKLSAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfeTFbUV1bMF0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFswXSkgPj4gNzsKLQotICAgICAgICBxdWFudF92YWwgPSB2cDhfZGMycXVhbnQoUSwgY3BpLT5jb21tb24ueTJkY19kZWx0YV9xKTsKLSAgICAgICAgY3BpLT5ZMnF1YW50X2Zhc3RbUV1bMF0gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7Ci0gICAgICAgIHZwOGN4X2ludmVydF9xdWFudChjcGktPnNmLmltcHJvdmVkX3F1YW50LCBjcGktPlkycXVhbnRbUV0gKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5ZMnF1YW50X3NoaWZ0W1FdICsgMCwgcXVhbnRfdmFsKTsKLSAgICAgICAgY3BpLT5ZMnpiaW5bUV1bMF0gPSAoKHF6YmluX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7Ci0gICAgICAgIGNwaS0+WTJyb3VuZFtRXVswXSA9IChxcm91bmRpbmdfZmFjdG9yc195MltRXSAqIHF1YW50X3ZhbCkgPj4gNzsKLSAgICAgICAgY3BpLT5jb21tb24uWTJkZXF1YW50W1FdWzBdID0gcXVhbnRfdmFsOwotICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF95MltRXVswXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0WzBdKSA+PiA3OwotCi0gICAgICAgIHF1YW50X3ZhbCA9IHZwOF9kY191dl9xdWFudChRLCBjcGktPmNvbW1vbi51dmRjX2RlbHRhX3EpOwotICAgICAgICBjcGktPlVWcXVhbnRfZmFzdFtRXVswXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKLSAgICAgICAgdnA4Y3hfaW52ZXJ0X3F1YW50KGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQsIGNwaS0+VVZxdWFudFtRXSArIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPlVWcXVhbnRfc2hpZnRbUV0gKyAwLCBxdWFudF92YWwpOwotICAgICAgICBjcGktPlVWemJpbltRXVswXSA9ICgocXpiaW5fZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzs7Ci0gICAgICAgIGNwaS0+VVZyb3VuZFtRXVswXSA9IChxcm91bmRpbmdfZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgPj4gNzsKLSAgICAgICAgY3BpLT5jb21tb24uVVZkZXF1YW50W1FdWzBdID0gcXVhbnRfdmFsOwotICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF91dltRXVswXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0WzBdKSA+PiA3OwotCi0gICAgICAgIC8vIGFsbCB0aGUgYWMgdmFsdWVzID0gOwotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJjID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOwotCi0gICAgICAgICAgICBxdWFudF92YWwgPSB2cDhfYWNfeXF1YW50KFEpOwotICAgICAgICAgICAgY3BpLT5ZMXF1YW50X2Zhc3RbUV1bcmNdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOwotICAgICAgICAgICAgdnA4Y3hfaW52ZXJ0X3F1YW50KGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQsIGNwaS0+WTFxdWFudFtRXSArIHJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+WTFxdWFudF9zaGlmdFtRXSArIHJjLCBxdWFudF92YWwpOwotICAgICAgICAgICAgY3BpLT5ZMXpiaW5bUV1bcmNdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OwotICAgICAgICAgICAgY3BpLT5ZMXJvdW5kW1FdW3JjXSA9IChxcm91bmRpbmdfZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgPj4gNzsKLSAgICAgICAgICAgIGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRXVtyY10gPSBxdWFudF92YWw7Ci0gICAgICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF95MVtRXVtpXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0W2ldKSA+PiA3OwotCi0gICAgICAgICAgICBxdWFudF92YWwgPSB2cDhfYWMycXVhbnQoUSwgY3BpLT5jb21tb24ueTJhY19kZWx0YV9xKTsKLSAgICAgICAgICAgIGNwaS0+WTJxdWFudF9mYXN0W1FdW3JjXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKLSAgICAgICAgICAgIHZwOGN4X2ludmVydF9xdWFudChjcGktPnNmLmltcHJvdmVkX3F1YW50LCBjcGktPlkycXVhbnRbUV0gKyByYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPlkycXVhbnRfc2hpZnRbUV0gKyByYywgcXVhbnRfdmFsKTsKLSAgICAgICAgICAgIGNwaS0+WTJ6YmluW1FdW3JjXSA9ICgocXpiaW5fZmFjdG9yc195MltRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzsKLSAgICAgICAgICAgIGNwaS0+WTJyb3VuZFtRXVtyY10gPSAocXJvdW5kaW5nX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpID4+IDc7Ci0gICAgICAgICAgICBjcGktPmNvbW1vbi5ZMmRlcXVhbnRbUV1bcmNdID0gcXVhbnRfdmFsOwotICAgICAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfeTJbUV1baV0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFtpXSkgPj4gNzsKLQotICAgICAgICAgICAgcXVhbnRfdmFsID0gdnA4X2FjX3V2X3F1YW50KFEsIGNwaS0+Y29tbW9uLnV2YWNfZGVsdGFfcSk7Ci0gICAgICAgICAgICBjcGktPlVWcXVhbnRfZmFzdFtRXVtyY10gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7Ci0gICAgICAgICAgICB2cDhjeF9pbnZlcnRfcXVhbnQoY3BpLT5zZi5pbXByb3ZlZF9xdWFudCwgY3BpLT5VVnF1YW50W1FdICsgcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5VVnF1YW50X3NoaWZ0W1FdICsgcmMsIHF1YW50X3ZhbCk7Ci0gICAgICAgICAgICBjcGktPlVWemJpbltRXVtyY10gPSAoKHF6YmluX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7Ci0gICAgICAgICAgICBjcGktPlVWcm91bmRbUV1bcmNdID0gKHFyb3VuZGluZ19mYWN0b3JzW1FdICogcXVhbnRfdmFsKSA+PiA3OwotICAgICAgICAgICAgY3BpLT5jb21tb24uVVZkZXF1YW50W1FdW3JjXSA9IHF1YW50X3ZhbDsKLSAgICAgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3V2W1FdW2ldID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbaV0pID4+IDc7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZWxzZQotdm9pZCB2cDhjeF9pbml0X3F1YW50aXplcihWUDhfQ09NUCAqY3BpKQotewotICAgIGludCBpOwotICAgIGludCBxdWFudF92YWw7Ci0gICAgaW50IFE7Ci0KLSAgICBpbnQgemJpbl9ib29zdFsxNl0gPSB7MCwgMCwgOCwgMTAsIDEyLCAxNCwgMTYsIDIwLCAyNCwgMjgsIDMyLCAzNiwgNDAsIDQ0LCA0NCwgNDR9OwotCi0gICAgZm9yIChRID0gMDsgUSA8IFFJTkRFWF9SQU5HRTsgUSsrKQotICAgIHsKLSAgICAgICAgLy8gZGMgdmFsdWVzCi0gICAgICAgIHF1YW50X3ZhbCA9IHZwOF9kY19xdWFudChRLCBjcGktPmNvbW1vbi55MWRjX2RlbHRhX3EpOwotICAgICAgICBjcGktPlkxcXVhbnRbUV1bMF0gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7Ci0gICAgICAgIGNwaS0+WTF6YmluW1FdWzBdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OwotICAgICAgICBjcGktPlkxcm91bmRbUV1bMF0gPSAocXJvdW5kaW5nX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpID4+IDc7Ci0gICAgICAgIGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRXVswXSA9IHF1YW50X3ZhbDsKLSAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfeTFbUV1bMF0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFswXSkgPj4gNzsKLQotICAgICAgICBxdWFudF92YWwgPSB2cDhfZGMycXVhbnQoUSwgY3BpLT5jb21tb24ueTJkY19kZWx0YV9xKTsKLSAgICAgICAgY3BpLT5ZMnF1YW50W1FdWzBdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOwotICAgICAgICBjcGktPlkyemJpbltRXVswXSA9ICgocXpiaW5fZmFjdG9yc195MltRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzsKLSAgICAgICAgY3BpLT5ZMnJvdW5kW1FdWzBdID0gKHFyb3VuZGluZ19mYWN0b3JzX3kyW1FdICogcXVhbnRfdmFsKSA+PiA3OwotICAgICAgICBjcGktPmNvbW1vbi5ZMmRlcXVhbnRbUV1bMF0gPSBxdWFudF92YWw7Ci0gICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kyW1FdWzBdID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbMF0pID4+IDc7Ci0KLSAgICAgICAgcXVhbnRfdmFsID0gdnA4X2RjX3V2X3F1YW50KFEsIGNwaS0+Y29tbW9uLnV2ZGNfZGVsdGFfcSk7Ci0gICAgICAgIGNwaS0+VVZxdWFudFtRXVswXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKLSAgICAgICAgY3BpLT5VVnpiaW5bUV1bMF0gPSAoKHF6YmluX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7OwotICAgICAgICBjcGktPlVWcm91bmRbUV1bMF0gPSAocXJvdW5kaW5nX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpID4+IDc7Ci0gICAgICAgIGNwaS0+Y29tbW9uLlVWZGVxdWFudFtRXVswXSA9IHF1YW50X3ZhbDsKLSAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfdXZbUV1bMF0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFswXSkgPj4gNzsKLQotICAgICAgICAvLyBhbGwgdGhlIGFjIHZhbHVlcyA9IDsKLSAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByYyA9IHZwOF9kZWZhdWx0X3ppZ196YWcxZFtpXTsKLQotICAgICAgICAgICAgcXVhbnRfdmFsID0gdnA4X2FjX3lxdWFudChRKTsKLSAgICAgICAgICAgIGNwaS0+WTFxdWFudFtRXVtyY10gPSAoMSA8PCAxNikgLyBxdWFudF92YWw7Ci0gICAgICAgICAgICBjcGktPlkxemJpbltRXVtyY10gPSAoKHF6YmluX2ZhY3RvcnNbUV0gKiBxdWFudF92YWwpICsgNjQpID4+IDc7Ci0gICAgICAgICAgICBjcGktPlkxcm91bmRbUV1bcmNdID0gKHFyb3VuZGluZ19mYWN0b3JzW1FdICogcXVhbnRfdmFsKSA+PiA3OwotICAgICAgICAgICAgY3BpLT5jb21tb24uWTFkZXF1YW50W1FdW3JjXSA9IHF1YW50X3ZhbDsKLSAgICAgICAgICAgIGNwaS0+enJ1bl96YmluX2Jvb3N0X3kxW1FdW2ldID0gKHF1YW50X3ZhbCAqIHpiaW5fYm9vc3RbaV0pID4+IDc7Ci0KLSAgICAgICAgICAgIHF1YW50X3ZhbCA9IHZwOF9hYzJxdWFudChRLCBjcGktPmNvbW1vbi55MmFjX2RlbHRhX3EpOwotICAgICAgICAgICAgY3BpLT5ZMnF1YW50W1FdW3JjXSA9ICgxIDw8IDE2KSAvIHF1YW50X3ZhbDsKLSAgICAgICAgICAgIGNwaS0+WTJ6YmluW1FdW3JjXSA9ICgocXpiaW5fZmFjdG9yc195MltRXSAqIHF1YW50X3ZhbCkgKyA2NCkgPj4gNzsKLSAgICAgICAgICAgIGNwaS0+WTJyb3VuZFtRXVtyY10gPSAocXJvdW5kaW5nX2ZhY3RvcnNfeTJbUV0gKiBxdWFudF92YWwpID4+IDc7Ci0gICAgICAgICAgICBjcGktPmNvbW1vbi5ZMmRlcXVhbnRbUV1bcmNdID0gcXVhbnRfdmFsOwotICAgICAgICAgICAgY3BpLT56cnVuX3piaW5fYm9vc3RfeTJbUV1baV0gPSAocXVhbnRfdmFsICogemJpbl9ib29zdFtpXSkgPj4gNzsKLQotICAgICAgICAgICAgcXVhbnRfdmFsID0gdnA4X2FjX3V2X3F1YW50KFEsIGNwaS0+Y29tbW9uLnV2YWNfZGVsdGFfcSk7Ci0gICAgICAgICAgICBjcGktPlVWcXVhbnRbUV1bcmNdID0gKDEgPDwgMTYpIC8gcXVhbnRfdmFsOwotICAgICAgICAgICAgY3BpLT5VVnpiaW5bUV1bcmNdID0gKChxemJpbl9mYWN0b3JzW1FdICogcXVhbnRfdmFsKSArIDY0KSA+PiA3OwotICAgICAgICAgICAgY3BpLT5VVnJvdW5kW1FdW3JjXSA9IChxcm91bmRpbmdfZmFjdG9yc1tRXSAqIHF1YW50X3ZhbCkgPj4gNzsKLSAgICAgICAgICAgIGNwaS0+Y29tbW9uLlVWZGVxdWFudFtRXVtyY10gPSBxdWFudF92YWw7Ci0gICAgICAgICAgICBjcGktPnpydW5femJpbl9ib29zdF91dltRXVtpXSA9IChxdWFudF92YWwgKiB6YmluX2Jvb3N0W2ldKSA+PiA3OwotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi12b2lkIHZwOGN4X21iX2luaXRfcXVhbnRpemVyKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IFFJbmRleDsKLSAgICBNQUNST0JMT0NLRCAqeGQgPSAmeC0+ZV9tYmQ7Ci0gICAgaW50IHpiaW5fZXh0cmE7Ci0KLSAgICAvLyBTZWxlY3QgdGhlIGJhc2VsaW5lIE1CIFEgaW5kZXguCi0gICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIC8vIEFicyBWYWx1ZQotICAgICAgICBpZiAoeGQtPm1iX3NlZ2VtZW50X2Fic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEpCi0KLSAgICAgICAgICAgIFFJbmRleCA9IHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkXTsKLSAgICAgICAgLy8gRGVsdGEgVmFsdWUKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBRSW5kZXggPSBjcGktPmNvbW1vbi5iYXNlX3FpbmRleCArIHhkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkXTsKLSAgICAgICAgICAgIFFJbmRleCA9IChRSW5kZXggPj0gMCkgPyAoKFFJbmRleCA8PSBNQVhRKSA/IFFJbmRleCA6IE1BWFEpIDogMDsgICAgLy8gQ2xhbXAgdG8gdmFsaWQgcmFuZ2UKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIFFJbmRleCA9IGNwaS0+Y29tbW9uLmJhc2VfcWluZGV4OwotCi0gICAgLy8gWQotICAgIHpiaW5fZXh0cmEgPSAoY3BpLT5jb21tb24uWTFkZXF1YW50W1FJbmRleF1bMV0gKiAoY3BpLT56YmluX292ZXJfcXVhbnQgKyBjcGktPnpiaW5fbW9kZV9ib29zdCkpID4+IDc7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHgtPmJsb2NrW2ldLnF1YW50ID0gY3BpLT5ZMXF1YW50W1FJbmRleF07Ci0gICAgICAgIHgtPmJsb2NrW2ldLnF1YW50X2Zhc3QgPSBjcGktPlkxcXVhbnRfZmFzdFtRSW5kZXhdOwotICAgICAgICB4LT5ibG9ja1tpXS5xdWFudF9zaGlmdCA9IGNwaS0+WTFxdWFudF9zaGlmdFtRSW5kZXhdOwotICAgICAgICB4LT5ibG9ja1tpXS56YmluID0gY3BpLT5ZMXpiaW5bUUluZGV4XTsKLSAgICAgICAgeC0+YmxvY2tbaV0ucm91bmQgPSBjcGktPlkxcm91bmRbUUluZGV4XTsKLSAgICAgICAgeC0+ZV9tYmQuYmxvY2tbaV0uZGVxdWFudCA9IGNwaS0+Y29tbW9uLlkxZGVxdWFudFtRSW5kZXhdOwotICAgICAgICB4LT5ibG9ja1tpXS56cnVuX3piaW5fYm9vc3QgPSBjcGktPnpydW5femJpbl9ib29zdF95MVtRSW5kZXhdOwotICAgICAgICB4LT5ibG9ja1tpXS56YmluX2V4dHJhID0gKHNob3J0KXpiaW5fZXh0cmE7Ci0gICAgfQotCi0gICAgLy8gVVYKLSAgICB6YmluX2V4dHJhID0gKGNwaS0+Y29tbW9uLlVWZGVxdWFudFtRSW5kZXhdWzFdICogKGNwaS0+emJpbl9vdmVyX3F1YW50ICsgY3BpLT56YmluX21vZGVfYm9vc3QpKSA+PiA3OwotCi0gICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSsrKQotICAgIHsKLSAgICAgICAgeC0+YmxvY2tbaV0ucXVhbnQgPSBjcGktPlVWcXVhbnRbUUluZGV4XTsKLSAgICAgICAgeC0+YmxvY2tbaV0ucXVhbnRfZmFzdCA9IGNwaS0+VVZxdWFudF9mYXN0W1FJbmRleF07Ci0gICAgICAgIHgtPmJsb2NrW2ldLnF1YW50X3NoaWZ0ID0gY3BpLT5VVnF1YW50X3NoaWZ0W1FJbmRleF07Ci0gICAgICAgIHgtPmJsb2NrW2ldLnpiaW4gPSBjcGktPlVWemJpbltRSW5kZXhdOwotICAgICAgICB4LT5ibG9ja1tpXS5yb3VuZCA9IGNwaS0+VVZyb3VuZFtRSW5kZXhdOwotICAgICAgICB4LT5lX21iZC5ibG9ja1tpXS5kZXF1YW50ID0gY3BpLT5jb21tb24uVVZkZXF1YW50W1FJbmRleF07Ci0gICAgICAgIHgtPmJsb2NrW2ldLnpydW5femJpbl9ib29zdCA9IGNwaS0+enJ1bl96YmluX2Jvb3N0X3V2W1FJbmRleF07Ci0gICAgICAgIHgtPmJsb2NrW2ldLnpiaW5fZXh0cmEgPSAoc2hvcnQpemJpbl9leHRyYTsKLSAgICB9Ci0KLSAgICAvLyBZMgotICAgIHpiaW5fZXh0cmEgPSAoY3BpLT5jb21tb24uWTJkZXF1YW50W1FJbmRleF1bMV0gKiAoKGNwaS0+emJpbl9vdmVyX3F1YW50IC8gMikgKyBjcGktPnpiaW5fbW9kZV9ib29zdCkpID4+IDc7Ci0gICAgeC0+YmxvY2tbMjRdLnF1YW50X2Zhc3QgPSBjcGktPlkycXVhbnRfZmFzdFtRSW5kZXhdOwotICAgIHgtPmJsb2NrWzI0XS5xdWFudCA9IGNwaS0+WTJxdWFudFtRSW5kZXhdOwotICAgIHgtPmJsb2NrWzI0XS5xdWFudF9zaGlmdCA9IGNwaS0+WTJxdWFudF9zaGlmdFtRSW5kZXhdOwotICAgIHgtPmJsb2NrWzI0XS56YmluID0gY3BpLT5ZMnpiaW5bUUluZGV4XTsKLSAgICB4LT5ibG9ja1syNF0ucm91bmQgPSBjcGktPlkycm91bmRbUUluZGV4XTsKLSAgICB4LT5lX21iZC5ibG9ja1syNF0uZGVxdWFudCA9IGNwaS0+Y29tbW9uLlkyZGVxdWFudFtRSW5kZXhdOwotICAgIHgtPmJsb2NrWzI0XS56cnVuX3piaW5fYm9vc3QgPSBjcGktPnpydW5femJpbl9ib29zdF95MltRSW5kZXhdOwotICAgIHgtPmJsb2NrWzI0XS56YmluX2V4dHJhID0gKHNob3J0KXpiaW5fZXh0cmE7Ci0KLSAgICAvKiBzYXZlIHRoaXMgbWFjcm9ibG9jayBRSW5kZXggZm9yIHZwOF91cGRhdGVfemJpbl9leHRyYSgpICovCi0gICAgeC0+cV9pbmRleCA9IFFJbmRleDsKLX0KLXZvaWQgdnA4X3VwZGF0ZV96YmluX2V4dHJhKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IFFJbmRleCA9IHgtPnFfaW5kZXg7Ci0gICAgaW50IHpiaW5fZXh0cmE7Ci0KLSAgICAvLyBZCi0gICAgemJpbl9leHRyYSA9IChjcGktPmNvbW1vbi5ZMWRlcXVhbnRbUUluZGV4XVsxXSAqIChjcGktPnpiaW5fb3Zlcl9xdWFudCArIGNwaS0+emJpbl9tb2RlX2Jvb3N0KSkgPj4gNzsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHgtPmJsb2NrW2ldLnpiaW5fZXh0cmEgPSAoc2hvcnQpemJpbl9leHRyYTsKLSAgICB9Ci0KLSAgICAvLyBVVgotICAgIHpiaW5fZXh0cmEgPSAoY3BpLT5jb21tb24uVVZkZXF1YW50W1FJbmRleF1bMV0gKiAoY3BpLT56YmluX292ZXJfcXVhbnQgKyBjcGktPnpiaW5fbW9kZV9ib29zdCkpID4+IDc7Ci0gICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSsrKQotICAgIHsKLSAgICAgICAgeC0+YmxvY2tbaV0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOwotICAgIH0KLQotICAgIC8vIFkyCi0gICAgemJpbl9leHRyYSA9IChjcGktPmNvbW1vbi5ZMmRlcXVhbnRbUUluZGV4XVsxXSAqICgoY3BpLT56YmluX292ZXJfcXVhbnQgLyAyKSArIGNwaS0+emJpbl9tb2RlX2Jvb3N0KSkgPj4gNzsKLSAgICB4LT5ibG9ja1syNF0uemJpbl9leHRyYSA9IChzaG9ydCl6YmluX2V4dHJhOwotfQotCi12b2lkIHZwOGN4X2ZyYW1lX2luaXRfcXVhbnRpemVyKFZQOF9DT01QICpjcGkpCi17Ci0gICAgLy8gQ2xlYXIgWmJpbiBtb2RlIGJvb3N0IGZvciBkZWZhdWx0IGNhc2UKLSAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7Ci0KLSAgICAvLyBNQiBsZXZlbCBxdWFudGl6ZXIgc2V0dXAKLSAgICB2cDhjeF9tYl9pbml0X3F1YW50aXplcihjcGksICZjcGktPm1iKTsKLX0KLQotCi0vKiBhY3Rpdml0eV9hdmcgbXVzdCBiZSBwb3NpdGl2ZSwgb3IgZmxhdCByZWdpb25zIGNvdWxkIGdldCBhIHplcm8gd2VpZ2h0Ci0gKiAgKGluZmluaXRlIGxhbWJkYSksIHdoaWNoIGNvbmZvdW5kcyBhbmFseXNpcy4KLSAqIFRoaXMgYWxzbyBhdm9pZHMgdGhlIG5lZWQgZm9yIGRpdmlkZSBieSB6ZXJvIGNoZWNrcyBpbgotICogIHZwOF9hY3Rpdml0eV9tYXNraW5nKCkuCi0gKi8KLSNkZWZpbmUgVlA4X0FDVElWSVRZX0FWR19NSU4gKDY0KQotCi0vKiBUaGlzIGlzIHVzZWQgYXMgYSByZWZlcmVuY2Ugd2hlbiBjb21wdXRpbmcgdGhlIHNvdXJjZSB2YXJpYW5jZSBmb3IgdGhlCi0gKiAgcHVycG9zZXMgb2YgYWN0aXZpdHkgbWFza2luZy4KLSAqIEV2ZW50dWFsbHkgdGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgY3VzdG9tIG5vLXJlZmVyZW5jZSByb3V0aW5lcywKLSAqICB3aGljaCB3aWxsIGJlIGZhc3Rlci4KLSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVlA4X1ZBUl9PRkZTWzE2XT0KLXsKLSAgICAxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgKLX07Ci0KLXVuc2lnbmVkIGludCB2cDhfYWN0aXZpdHlfbWFza2luZyhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KQotewotICAgIHVuc2lnbmVkIGludCBhY3Q7Ci0gICAgdW5zaWduZWQgaW50IHNzZTsKLSAgICBpbnQgc3VtOwotICAgIHVuc2lnbmVkIGludCBhOwotICAgIHVuc2lnbmVkIGludCBiOwotICAgIC8qIFRPRE86IFRoaXMgY291bGQgYWxzbyBiZSBkb25lIG92ZXIgc21hbGxlciBhcmVhcyAoOHg4KSwgYnV0IHRoYXQgd291bGQKLSAgICAgKiAgcmVxdWlyZSBleHRlbnNpdmUgY2hhbmdlcyBlbHNld2hlcmUsIGFzIGxhbWJkYSBpcyBhc3N1bWVkIHRvIGJlIGZpeGVkCi0gICAgICogIG92ZXIgYW4gZW50aXJlIE1CIGluIG1vc3Qgb2YgdGhlIGNvZGUuCi0gICAgICogQW5vdGhlciBvcHRpb24gaXMgdG8gY29tcHV0ZSBmb3VyIDh4OCB2YXJpYW5jZXMsIGFuZCBwaWNrIGEgc2luZ2xlCi0gICAgICogIGxhbWJkYSB1c2luZyBhIG5vbi1saW5lYXIgY29tYmluYXRpb24gKGUuZy4sIHRoZSBzbWFsbGVzdCwgb3Igc2Vjb25kCi0gICAgICogIHNtYWxsZXN0LCBldGMuKS4KLSAgICAgKi8KLSAgICBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgZ2V0MTZ4MTZ2YXIpKHgtPnNyYy55X2J1ZmZlciwKLSAgICAgeC0+c3JjLnlfc3RyaWRlLCBWUDhfVkFSX09GRlMsIDAsICZzc2UsICZzdW0pOwotICAgIC8qIFRoaXMgcmVxdWlyZXMgYSBmdWxsIDMyIGJpdHMgb2YgcHJlY2lzaW9uLiAqLwotICAgIGFjdCA9IChzc2U8PDgpIC0gc3VtKnN1bTsKLSAgICAvKiBEcm9wIDQgdG8gZ2l2ZSB1cyBzb21lIGhlYWRyb29tIHRvIHdvcmsgd2l0aC4gKi8KLSAgICBhY3QgPSAoYWN0ICsgOCkgPj4gNDsKLSAgICAvKiBJZiB0aGUgcmVnaW9uIGlzIGZsYXQsIGxvd2VyIHRoZSBhY3Rpdml0eSBzb21lIG1vcmUuICovCi0gICAgaWYgKGFjdCA8IDg8PDEyKQotICAgICAgICBhY3QgPSBhY3QgPCA1PDwxMiA/IGFjdCA6IDU8PDEyOwotICAgIC8qIFRPRE86IEZvciBub24tZmxhdCByZWdpb25zLCBlZGdlIHJlZ2lvbnMgc2hvdWxkIHJlY2VpdmUgbGVzcyBtYXNraW5nCi0gICAgICogIHRoYW4gdGV4dHVyZWQgcmVnaW9ucywgYnV0IGlkZW50aWZ5aW5nIGVkZ2UgcmVnaW9ucyBxdWlja2x5IGFuZAotICAgICAqICByZWxpYWJseSBlbm91Z2ggaXMgc3RpbGwgYSBzdWJqZWN0IG9mIGV4cGVyaW1lbnRhdGlvbi4KLSAgICAgKiBUaGlzIHdpbGwgYmUgbW9zdCBub3RpY2FibGUgbmVhciBlZGdlcyB3aXRoIGEgY29tcGxleCBzaGFwZSAoZS5nLiwKLSAgICAgKiAgdGV4dCksIGJ1dCB0aGUgNHg0IHRyYW5zZm9ybSBzaXplIHNob3VsZCBtYWtlIHRoaXMgbGVzcyBvZiBhIHByb2JsZW0KLSAgICAgKiAgdGhhbiBpdCB3b3VsZCBiZSBmb3IgYW4gOHg4IHRyYW5zZm9ybS4KLSAgICAgKi8KLSAgICAvKiBBcHBseSB0aGUgbWFza2luZyB0byB0aGUgUkQgbXVsdGlwbGllci4gKi8KLSAgICBhID0gYWN0ICsgNCpjcGktPmFjdGl2aXR5X2F2ZzsKLSAgICBiID0gNCphY3QgKyBjcGktPmFjdGl2aXR5X2F2ZzsKLSAgICB4LT5yZG11bHQgPSAodW5zaWduZWQgaW50KSgoKElOVDY0KXgtPnJkbXVsdCpiICsgKGE+PjEpKS9hKTsKLSAgICByZXR1cm4gYWN0OwotfQotCi0KLQotc3RhdGljCi12b2lkIGVuY29kZV9tYl9yb3coVlA4X0NPTVAgKmNwaSwKLSAgICAgICAgICAgICAgICAgICBWUDhfQ09NTU9OICpjbSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbWJfcm93LAotICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0sgICp4LAotICAgICAgICAgICAgICAgICAgIE1BQ1JPQkxPQ0tEICp4ZCwKLSAgICAgICAgICAgICAgICAgICBUT0tFTkVYVFJBICoqdHAsCi0gICAgICAgICAgICAgICAgICAgaW50ICpzZWdtZW50X2NvdW50cywKLSAgICAgICAgICAgICAgICAgICBpbnQgKnRvdGFscmF0ZSkKLXsKLSAgICBJTlQ2NCBhY3Rpdml0eV9zdW0gPSAwOwotICAgIGludCBpOwotICAgIGludCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldDsKLSAgICBpbnQgbWJfY29sOwotICAgIGludCByZWZfZmJfaWR4ID0gY20tPmxzdF9mYl9pZHg7Ci0gICAgaW50IGRzdF9mYl9pZHggPSBjbS0+bmV3X2ZiX2lkeDsKLSAgICBpbnQgcmVjb25feV9zdHJpZGUgPSBjbS0+eXYxMl9mYltyZWZfZmJfaWR4XS55X3N0cmlkZTsKLSAgICBpbnQgcmVjb25fdXZfc3RyaWRlID0gY20tPnl2MTJfZmJbcmVmX2ZiX2lkeF0udXZfc3RyaWRlOwotICAgIGludCBzZWdfbWFwX2luZGV4ID0gKG1iX3JvdyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMpOwotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgY29uc3QgaW50IG5zeW5jID0gY3BpLT5tdF9zeW5jX3JhbmdlOwotICAgIGNvbnN0IGludCByaWdodG1vc3RfY29sID0gY20tPm1iX2NvbHMgLSAxOwotICAgIHZvbGF0aWxlIGNvbnN0IGludCAqbGFzdF9yb3dfY3VycmVudF9tYl9jb2w7Ci0KLSAgICBpZiAoKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCAhPSAwKSAmJiAobWJfcm93ICE9IDApKQotICAgICAgICBsYXN0X3Jvd19jdXJyZW50X21iX2NvbCA9ICZjcGktPm10X2N1cnJlbnRfbWJfY29sW21iX3JvdyAtIDFdOwotICAgIGVsc2UKLSAgICAgICAgbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgPSAmcmlnaHRtb3N0X2NvbDsKLSNlbmRpZgotCi0gICAgLy8gcmVzZXQgYWJvdmUgYmxvY2sgY29lZmZzCi0gICAgeGQtPmFib3ZlX2NvbnRleHQgPSBjbS0+YWJvdmVfY29udGV4dDsKLQotICAgIHhkLT51cF9hdmFpbGFibGUgPSAobWJfcm93ICE9IDApOwotICAgIHJlY29uX3lvZmZzZXQgPSAobWJfcm93ICogcmVjb25feV9zdHJpZGUgKiAxNik7Ci0gICAgcmVjb25fdXZvZmZzZXQgPSAobWJfcm93ICogcmVjb25fdXZfc3RyaWRlICogOCk7Ci0KLSAgICBjcGktPnRwbGlzdFttYl9yb3ddLnN0YXJ0ID0gKnRwOwotICAgIC8vcHJpbnRmKCJNYWluIG1iX3JvdyA9ICVkXG4iLCBtYl9yb3cpOwotCi0gICAgLy8gRGlzdGFuY2Ugb2YgTWIgdG8gdGhlIHRvcCAmIGJvdHRvbSBlZGdlcywgc3BlY2lmaWVkIGluIDEvOHRoIHBlbAotICAgIC8vIHVuaXRzIGFzIHRoZXkgYXJlIGFsd2F5cyBjb21wYXJlZCB0byB2YWx1ZXMgdGhhdCBhcmUgaW4gMS84dGggcGVsIHVuaXRzCi0gICAgeGQtPm1iX3RvX3RvcF9lZGdlID0gLSgobWJfcm93ICogMTYpIDw8IDMpOwotICAgIHhkLT5tYl90b19ib3R0b21fZWRnZSA9ICgoY20tPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOwotCi0gICAgLy8gU2V0IHVwIGxpbWl0IHZhbHVlcyBmb3IgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnRzCi0gICAgLy8gdG8gcHJldmVudCB0aGVtIGV4dGVuZGluZyBiZXlvbmQgdGhlIFVNViBib3JkZXJzCi0gICAgeC0+bXZfcm93X21pbiA9IC0oKG1iX3JvdyAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE2KSk7Ci0gICAgeC0+bXZfcm93X21heCA9ICgoY20tPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNik7Ci0KLSAgICAvLyBmb3IgZWFjaCBtYWNyb2Jsb2NrIGNvbCBpbiBpbWFnZQotICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQotICAgIHsKLSAgICAgICAgLy8gRGlzdGFuY2Ugb2YgTWIgdG8gdGhlIGxlZnQgJiByaWdodCBlZGdlcywgc3BlY2lmaWVkIGluCi0gICAgICAgIC8vIDEvOHRoIHBlbCB1bml0cyBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzCi0gICAgICAgIC8vIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cwotICAgICAgICB4ZC0+bWJfdG9fbGVmdF9lZGdlID0gLSgobWJfY29sICogMTYpIDw8IDMpOwotICAgICAgICB4ZC0+bWJfdG9fcmlnaHRfZWRnZSA9ICgoY20tPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KSA8PCAzOwotCi0gICAgICAgIC8vIFNldCB1cCBsaW1pdCB2YWx1ZXMgZm9yIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnRzCi0gICAgICAgIC8vIHRvIHByZXZlbnQgdGhlbSBleHRlbmRpbmcgYmV5b25kIHRoZSBVTVYgYm9yZGVycwotICAgICAgICB4LT5tdl9jb2xfbWluID0gLSgobWJfY29sICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpKTsKLSAgICAgICAgeC0+bXZfY29sX21heCA9ICgoY20tPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpOwotCi0gICAgICAgIHhkLT5kc3QueV9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgIHhkLT5kc3QudV9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICB4ZC0+ZHN0LnZfYnVmZmVyID0gY20tPnl2MTJfZmJbZHN0X2ZiX2lkeF0udl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gKG1iX2NvbCAhPSAwKTsKLQotICAgICAgICB4LT5yZGRpdiA9IGNwaS0+UkRESVY7Ci0gICAgICAgIHgtPnJkbXVsdCA9IGNwaS0+UkRNVUxUOwotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgICAgIGlmICgoY3BpLT5iX211bHRpX3RocmVhZGVkICE9IDApICYmIChtYl9yb3cgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobWJfY29sICYgKG5zeW5jIC0gMSkpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1iX2NvbCA+ICgqbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgLSBuc3luYykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgqbGFzdF9yb3dfY3VycmVudF9tYl9jb2wpICE9IChjbS0+bWJfY29scyAtIDEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeDg2X3BhdXNlX2hpbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3NsZWVwKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgaWYoY3BpLT5veGNmLnR1bmluZyA9PSBWUDhfVFVORV9TU0lNKQotICAgICAgICAgICAgYWN0aXZpdHlfc3VtICs9IHZwOF9hY3Rpdml0eV9tYXNraW5nKGNwaSwgeCk7Ci0KLSAgICAgICAgLy8gSXMgc2VnbWVudGF0aW9uIGVuYWJsZWQKLSAgICAgICAgLy8gTUIgbGV2ZWwgYWRqdXRtZW50IHRvIHF1YW50aXplcgotICAgICAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2RlIHRvIHNldCBzZWdtZW50IGlkIGluIHhkLT5tYm1pLnNlZ21lbnRfaWQgZm9yIGN1cnJlbnQgTUIgKHdpdGggcmFuZ2UgY2hlY2tpbmcpCi0gICAgICAgICAgICBpZiAoY3BpLT5zZWdtZW50YXRpb25fbWFwW3NlZ19tYXBfaW5kZXgrbWJfY29sXSA8PSAzKQotICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkID0gY3BpLT5zZWdtZW50YXRpb25fbWFwW3NlZ19tYXBfaW5kZXgrbWJfY29sXTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZCA9IDA7Ci0KLSAgICAgICAgICAgIHZwOGN4X21iX2luaXRfcXVhbnRpemVyKGNwaSwgeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPSAwOyAgICAgICAgIC8vIFNldCB0byBTZWdtZW50IDAgYnkgZGVmYXVsdAotCi0gICAgICAgIHgtPmFjdGl2ZV9wdHIgPSBjcGktPmFjdGl2ZV9tYXAgKyBzZWdfbWFwX2luZGV4ICsgbWJfY29sOwotCi0gICAgICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICp0b3RhbHJhdGUgKz0gdnA4Y3hfZW5jb2RlX2ludHJhX21hY3JvX2Jsb2NrKGNwaSwgeCwgdHApOwotI2lmZGVmIE1PREVfU1RBVFMKLSAgICAgICAgICAgIHlfbW9kZXNbeGQtPm1ibWkubW9kZV0gKys7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICp0b3RhbHJhdGUgKz0gdnA4Y3hfZW5jb2RlX2ludGVyX21hY3JvYmxvY2soY3BpLCB4LCB0cCwgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQpOwotCi0jaWZkZWYgTU9ERV9TVEFUUwotICAgICAgICAgICAgaW50ZXJfeV9tb2Rlc1t4ZC0+bWJtaS5tb2RlXSArKzsKLQotICAgICAgICAgICAgaWYgKHhkLT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYjsKLQotICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCB4ZC0+bWJtaS5wYXJ0aXRpb25fY291bnQ7IGIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVyX2JfbW9kZXNbeC0+cGFydGl0aW9uLT5ibWlbYl0ubW9kZV0gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgLy8gQ291bnQgb2YgbGFzdCByZWYgZnJhbWUgMCwwIHVzZWFnZQotICAgICAgICAgICAgaWYgKCh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBaRVJPTVYpICYmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IExBU1RfRlJBTUUpKQotICAgICAgICAgICAgICAgIGNwaS0+aW50ZXJfenpfY291bnQgKys7Ci0KLSAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBjb2RlIGZvciBjeWNsaWMgcmVmcmVzaAotICAgICAgICAgICAgLy8gSWYgY3ljbGljIHVwZGF0ZSBlbmFibGVkIHRoZW4gY29weSB4ZC0+bWJtaS5zZWdtZW50X2lkOyAod2hpY2ggbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGJhc2VkIG9uIG1vZGUKLSAgICAgICAgICAgIC8vIGR1cmluZyB2cDhjeF9lbmNvZGVfaW50ZXJfbWFjcm9ibG9jaygpKSBiYWNrIGludG8gdGhlIGdsb2JhbCBzZ21lbnRhdGlvbiBtYXAKLSAgICAgICAgICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCAmJiB4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5zZWdtZW50YXRpb25fbWFwW3NlZ19tYXBfaW5kZXgrbWJfY29sXSA9IHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBiZWVuIHJlZnJlc2hlZCBtYXJrIGl0IGFzIGNsZWFuICh0aGUgbWFnbml0dWRlIG9mIHRoZSAtdmUgaW5mbHVlbmNlcyBob3cgbG9uZyBpdCB3aWxsIGJlIGJlZm9yZSB3ZSBjb25zaWRlciBhbm90aGVyIHJlZnJlc2gpOgotICAgICAgICAgICAgICAgIC8vIEVsc2UgaWYgaXQgd2FzIGNvZGVkIChsYXN0IGZyYW1lIDAsMCkgYW5kIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlZnJlc2hlZCB0aGVuIG1hcmsgaXQgYXMgYSBjYW5kaWRhdGUgZm9yIGNsZWFudXAgbmV4dCB0aW1lIChtYXJrZWQgMCkKLSAgICAgICAgICAgICAgICAvLyBlbHNlIG1hcmsgaXQgYXMgZGlydHkgKDEpLgotICAgICAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZCkKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbc2VnX21hcF9pbmRleCttYl9jb2xdID0gLTE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IFpFUk9NVikgJiYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gTEFTVF9GUkFNRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbc2VnX21hcF9pbmRleCttYl9jb2xdID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFtzZWdfbWFwX2luZGV4K21iX2NvbF0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwW3NlZ19tYXBfaW5kZXgrbWJfY29sXSA9IDE7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNwaS0+dHBsaXN0W21iX3Jvd10uc3RvcCA9ICp0cDsKLQotICAgICAgICB4LT5nZl9hY3RpdmVfcHRyKys7ICAgICAgLy8gSW5jcmVtZW50IHBvaW50ZXIgaW50byBnZiB1c2VhZ2UgZmxhZ3Mgc3RydWN0dXJlIGZvciBuZXh0IG1iCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICB2cHhfbWVtY3B5KCZ4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPmJtaVtpXSwgJnhkLT5ibG9ja1tpXS5ibWksIHNpemVvZih4ZC0+YmxvY2tbaV0uYm1pKSk7Ci0KLSAgICAgICAgLy8gYWRqdXN0IHRvIHRoZSBuZXh0IGNvbHVtbiBvZiBtYWNyb2Jsb2NrcwotICAgICAgICB4LT5zcmMueV9idWZmZXIgKz0gMTY7Ci0gICAgICAgIHgtPnNyYy51X2J1ZmZlciArPSA4OwotICAgICAgICB4LT5zcmMudl9idWZmZXIgKz0gODsKLQotICAgICAgICByZWNvbl95b2Zmc2V0ICs9IDE2OwotICAgICAgICByZWNvbl91dm9mZnNldCArPSA4OwotCi0gICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygc2VnbWVudCB1c2VhZ2UKLSAgICAgICAgc2VnbWVudF9jb3VudHNbeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWRdICsrOwotCi0gICAgICAgIC8vIHNraXAgdG8gbmV4dCBtYgotICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQrKzsKLSAgICAgICAgeC0+cGFydGl0aW9uX2luZm8rKzsKLQotICAgICAgICB4ZC0+YWJvdmVfY29udGV4dCsrOwotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgICAgICBpZiAoY3BpLT5iX211bHRpX3RocmVhZGVkICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+bXRfY3VycmVudF9tYl9jb2xbbWJfcm93XSA9IG1iX2NvbDsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgLy9leHRlbmQgdGhlIHJlY29uIGZvciBpbnRyYSBwcmVkaWN0aW9uCi0gICAgdnA4X2V4dGVuZF9tYl9yb3coCi0gICAgICAgICZjbS0+eXYxMl9mYltkc3RfZmJfaWR4XSwKLSAgICAgICAgeGQtPmRzdC55X2J1ZmZlciArIDE2LAotICAgICAgICB4ZC0+ZHN0LnVfYnVmZmVyICsgOCwKLSAgICAgICAgeGQtPmRzdC52X2J1ZmZlciArIDgpOwotCi0gICAgLy8gdGhpcyBpcyB0byBhY2NvdW50IGZvciB0aGUgYm9yZGVyCi0gICAgeGQtPm1vZGVfaW5mb19jb250ZXh0Kys7Ci0gICAgeC0+cGFydGl0aW9uX2luZm8rKzsKLSAgICB4LT5hY3Rpdml0eV9zdW0gKz0gYWN0aXZpdHlfc3VtOwotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgaWYgKChjcGktPmJfbXVsdGlfdGhyZWFkZWQgIT0gMCkgJiYgKG1iX3JvdyA9PSBjbS0+bWJfcm93cyAtIDEpKQotICAgIHsKLSAgICAgICAgc2VtX3Bvc3QoJmNwaS0+aF9ldmVudF9lbmRfZW5jb2RpbmcpOyAvKiBzaWduYWwgZnJhbWUgZW5jb2RpbmcgZW5kICovCi0gICAgfQotI2VuZGlmCi19Ci0KLXZvaWQgdnA4X2VuY29kZV9mcmFtZShWUDhfQ09NUCAqY3BpKQotewotICAgIGludCBtYl9yb3c7Ci0gICAgTUFDUk9CTE9DSyAqY29uc3QgeCA9ICYgY3BpLT5tYjsKLSAgICBWUDhfQ09NTU9OICpjb25zdCBjbSA9ICYgY3BpLT5jb21tb247Ci0gICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJiB4LT5lX21iZDsKLQotICAgIFRPS0VORVhUUkEgKnRwID0gY3BpLT50b2s7Ci0gICAgaW50IHNlZ21lbnRfY291bnRzW01BWF9NQl9TRUdNRU5UU107Ci0gICAgaW50IHRvdGFscmF0ZTsKLQotICAgIC8vIEZ1bmN0aW9ucyBzZXR1cCBmb3IgYWxsIGZyYW1lIHR5cGVzIHNvIHdlIGNhbiB1c2UgTUMgaW4gQWx0UmVmCi0gICAgaWYgKGNtLT5tY29tcF9maWx0ZXJfdHlwZSA9PSBTSVhUQVApCi0gICAgewotICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdCAgICAgICAgPSBTVUJQSVhfSU5WT0tFKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmNvbW1vbi5ydGNkLnN1YnBpeCwgc2l4dGFwNHg0KTsKLSAgICAgICAgeGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQgICAgID0gU1VCUElYX0lOVk9LRSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5jb21tb24ucnRjZC5zdWJwaXgsIHNpeHRhcDh4NCk7Ci0gICAgICAgIHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IFNVQlBJWF9JTlZPS0UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaS0+Y29tbW9uLnJ0Y2Quc3VicGl4LCBzaXh0YXA4eDgpOwotICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2ICAgPSBTVUJQSVhfSU5WT0tFKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmNvbW1vbi5ydGNkLnN1YnBpeCwgc2l4dGFwMTZ4MTYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdCAgICAgICAgPSBTVUJQSVhfSU5WT0tFKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmNvbW1vbi5ydGNkLnN1YnBpeCwgYmlsaW5lYXI0eDQpOwotICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4NCAgICAgPSBTVUJQSVhfSU5WT0tFKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmNvbW1vbi5ydGNkLnN1YnBpeCwgYmlsaW5lYXI4eDQpOwotICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4OCAgICAgPSBTVUJQSVhfSU5WT0tFKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPmNvbW1vbi5ydGNkLnN1YnBpeCwgYmlsaW5lYXI4eDgpOwotICAgICAgICB4ZC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2ICAgPSBTVUJQSVhfSU5WT0tFKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5jb21tb24ucnRjZC5zdWJwaXgsIGJpbGluZWFyMTZ4MTYpOwotICAgIH0KLQotICAgIHgtPmdmX2FjdGl2ZV9wdHIgPSAoc2lnbmVkIGNoYXIgKiljcGktPmdmX2FjdGl2ZV9mbGFnczsgICAgIC8vIFBvaW50IHRvIGJhc2Ugb2YgR0YgYWN0aXZlIGZsYWdzIGRhdGEgc3RydWN0dXJlCi0KLSAgICB4LT52ZWN0b3JfcmFuZ2UgPSAzMjsKLQotICAgIC8vIENvdW50IG9mIE1CcyB1c2luZyB0aGUgYWx0ZXJuYXRlIFEgaWYgYW55Ci0gICAgY3BpLT5hbHRfcWNvdW50ID0gMDsKLQotICAgIC8vIFJlc2V0IGZyYW1lIGNvdW50IG9mIGludGVyIDAsMCBtb3Rpb24gdmVjdG9yIHVzZWFnZS4KLSAgICBjcGktPmludGVyX3p6X2NvdW50ID0gMDsKLQotICAgIHZweF9tZW1zZXQoc2VnbWVudF9jb3VudHMsIDAsIHNpemVvZihzZWdtZW50X2NvdW50cykpOwotCi0gICAgY3BpLT5wcmVkaWN0aW9uX2Vycm9yID0gMDsKLSAgICBjcGktPmludHJhX2Vycm9yID0gMDsKLSAgICBjcGktPnNraXBfdHJ1ZV9jb3VudCA9IDA7Ci0gICAgY3BpLT5za2lwX2ZhbHNlX2NvdW50ID0gMDsKLQotI2lmIDAKLSAgICAvLyBFeHBlcmltZW50YWwgY29kZQotICAgIGNwaS0+ZnJhbWVfZGlzdG9ydGlvbiA9IDA7Ci0gICAgY3BpLT5sYXN0X21iX2Rpc3RvcnRpb24gPSAwOwotI2VuZGlmCi0KLSAgICB0b3RhbHJhdGUgPSAwOwotCi0gICAgeC0+cGFydGl0aW9uX2luZm8gPSB4LT5waTsKLQotICAgIHhkLT5tb2RlX2luZm9fY29udGV4dCA9IGNtLT5taTsKLSAgICB4ZC0+bW9kZV9pbmZvX3N0cmlkZSA9IGNtLT5tb2RlX2luZm9fc3RyaWRlOwotCi0gICAgeGQtPmZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKLQotICAgIHhkLT5mcmFtZXNfc2luY2VfZ29sZGVuID0gY20tPmZyYW1lc19zaW5jZV9nb2xkZW47Ci0gICAgeGQtPmZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWUgPSBjbS0+ZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZTsKLSAgICB2cDhfemVybyhjcGktPk1WY291bnQpOwotICAgIC8vIHZwOF96ZXJvKCBDb250ZXh0cykKLSAgICB2cDhfemVybyhjcGktPmNvZWZfY291bnRzKTsKLQotICAgIC8vIHJlc2V0IGludHJhIG1vZGUgY29udGV4dHMKLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICB2cDhfaW5pdF9tYm1vZGVfcHJvYnMoY20pOwotCi0KLSAgICB2cDhjeF9mcmFtZV9pbml0X3F1YW50aXplcihjcGkpOwotCi0gICAgaWYgKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAyKQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8IDApCi0gICAgICAgICAgICBjcGktPlNwZWVkID0gLShjcGktPm94Y2YuY3B1X3VzZWQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfYXV0b19zZWxlY3Rfc3BlZWQoY3BpKTsKLSAgICB9Ci0KLSAgICB2cDhfaW5pdGlhbGl6ZV9yZF9jb25zdHMoY3BpLCB2cDhfZGNfcXVhbnQoY20tPmJhc2VfcWluZGV4LCBjbS0+eTFkY19kZWx0YV9xKSk7Ci0gICAgdnA4Y3hfaW5pdGlhbGl6ZV9tZV9jb25zdHMoY3BpLCBjbS0+YmFzZV9xaW5kZXgpOwotCi0gICAgLy8gQ29weSBkYXRhIG92ZXIgaW50byBtYWNybyBibG9jayBkYXRhIHN0dXJjdHVyZXMuCi0KLSAgICB4LT5zcmMgPSAqIGNwaS0+U291cmNlOwotICAgIHhkLT5wcmUgPSBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF07Ci0gICAgeGQtPmRzdCA9IGNtLT55djEyX2ZiW2NtLT5uZXdfZmJfaWR4XTsKLQotICAgIC8vIHNldCB1cCBmcmFtZSBuZXcgZnJhbWUgZm9yIGludHJhIGNvZGVkIGJsb2NrcwotCi0gICAgdnA4X3NldHVwX2ludHJhX3JlY29uKCZjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF0pOwotCi0gICAgdnA4X2J1aWxkX2Jsb2NrX29mZnNldHMoeCk7Ci0KLSAgICB2cDhfc2V0dXBfYmxvY2tfZHB0cnMoJngtPmVfbWJkKTsKLQotICAgIHZwOF9zZXR1cF9ibG9ja19wdHJzKHgpOwotCi0gICAgeC0+YWN0aXZpdHlfc3VtID0gMDsKLQotICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gRENfUFJFRDsKLSAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSA9IERDX1BSRUQ7Ci0KLSAgICB4ZC0+bGVmdF9jb250ZXh0ID0gJmNtLT5sZWZ0X2NvbnRleHQ7Ci0KLSAgICB2cDhfemVybyhjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZSkKLSAgICB2cDhfemVybyhjcGktPnltb2RlX2NvdW50KQotICAgIHZwOF96ZXJvKGNwaS0+dXZfbW9kZV9jb3VudCkKLQotICAgIHgtPm12YyA9IGNtLT5mYy5tdmM7Ci0KLSAgICB2cHhfbWVtc2V0KGNtLT5hYm92ZV9jb250ZXh0LCAwLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykgKiBjbS0+bWJfY29scyk7Ci0KLSAgICB7Ci0gICAgICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciAgZW1yX3RpbWVyOwotICAgICAgICB2cHhfdXNlY190aW1lcl9zdGFydCgmZW1yX3RpbWVyKTsKLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgICAgICBpZiAoY3BpLT5iX211bHRpX3RocmVhZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgdnA4Y3hfaW5pdF9tYnJ0aHJlYWRfZGF0YShjcGksIHgsIGNwaS0+bWJfcm93X2VpLCAxLCAgY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY20tPm1iX3Jvd3M7IGkrKykKLSAgICAgICAgICAgICAgICBjcGktPm10X2N1cnJlbnRfbWJfY29sW2ldID0gLTE7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbV9wb3N0KCZjcGktPmhfZXZlbnRfc3RhcnRfZW5jb2RpbmdbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3cgKz0gKGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X3plcm8oY20tPmxlZnRfY29udGV4dCkKLQotICAgICAgICAgICAgICAgIHRwID0gY3BpLT50b2sgKyBtYl9yb3cgKiAoY20tPm1iX2NvbHMgKiAxNiAqIDI0KTsKLQotICAgICAgICAgICAgICAgIGVuY29kZV9tYl9yb3coY3BpLCBjbSwgbWJfcm93LCB4LCB4ZCwgJnRwLCBzZWdtZW50X2NvdW50cywgJnRvdGFscmF0ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdG8gdGhlIG5leHQgcm93IG9mIG1icwotICAgICAgICAgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAqIChjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudCArIDEpIC0gMTYgKiBjbS0+bWJfY29sczsKLSAgICAgICAgICAgICAgICB4LT5zcmMudV9idWZmZXIgKz0gIDggKiB4LT5zcmMudXZfc3RyaWRlICogKGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ICsgMSkgLSA4ICogY20tPm1iX2NvbHM7Ci0gICAgICAgICAgICAgICAgeC0+c3JjLnZfYnVmZmVyICs9ICA4ICogeC0+c3JjLnV2X3N0cmlkZSAqIChjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudCArIDEpIC0gOCAqIGNtLT5tYl9jb2xzOwotCi0gICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ICs9IHhkLT5tb2RlX2luZm9fc3RyaWRlICogY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQ7Ci0gICAgICAgICAgICAgICAgeC0+cGFydGl0aW9uX2luZm8gICs9IHhkLT5tb2RlX2luZm9fc3RyaWRlICogY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VtX3dhaXQoJmNwaS0+aF9ldmVudF9lbmRfZW5jb2RpbmcpOyAvKiB3YWl0IGZvciBvdGhlciB0aHJlYWRzIHRvIGZpbmlzaCAqLwotCi0gICAgICAgICAgICBjcGktPnRva19jb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdyArKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPnRva19jb3VudCArPSBjcGktPnRwbGlzdFttYl9yb3ddLnN0b3AgLSBjcGktPnRwbGlzdFttYl9yb3ddLnN0YXJ0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpLCBqOwotCi0gICAgICAgICAgICAgICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudF9jb3VudHNbal0gKz0gY3BpLT5tYl9yb3dfZWlbaV0uc2VnbWVudF9jb3VudHNbal07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvdGFscmF0ZSArPSBjcGktPm1iX3Jvd19laVtpXS50b3RhbHJhdGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHgtPmFjdGl2aXR5X3N1bSArPSBjcGktPm1iX3Jvd19laVtpXS5tYi5hY3Rpdml0eV9zdW07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZm9yIGVhY2ggbWFjcm9ibG9jayByb3cgaW4gaW1hZ2UKLSAgICAgICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdysrKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgdnA4X3plcm8oY20tPmxlZnRfY29udGV4dCkKLQotICAgICAgICAgICAgICAgIGVuY29kZV9tYl9yb3coY3BpLCBjbSwgbWJfcm93LCB4LCB4ZCwgJnRwLCBzZWdtZW50X2NvdW50cywgJnRvdGFscmF0ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdG8gdGhlIG5leHQgcm93IG9mIG1icwotICAgICAgICAgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAtIDE2ICogY20tPm1iX2NvbHM7Ci0gICAgICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyICs9IDggKiB4LT5zcmMudXZfc3RyaWRlIC0gOCAqIGNtLT5tYl9jb2xzOwotICAgICAgICAgICAgICAgIHgtPnNyYy52X2J1ZmZlciArPSA4ICogeC0+c3JjLnV2X3N0cmlkZSAtIDggKiBjbS0+bWJfY29sczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3BpLT50b2tfY291bnQgPSB0cCAtIGNwaS0+dG9rOwotCi0gICAgICAgIH0KLQotICAgICAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZlbXJfdGltZXIpOwotICAgICAgICBjcGktPnRpbWVfZW5jb2RlX21iX3JvdyArPSB2cHhfdXNlY190aW1lcl9lbGFwc2VkKCZlbXJfdGltZXIpOwotCi0gICAgfQotCi0KLSAgICAvLyBXb3JrIG91dCB0aGUgc2VnbWVudCBwcm9iYWJpbGl0ZXMgaWYgc2VnbWVudGF0aW9uIGlzIGVuYWJsZWQKLSAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgIHsKLSAgICAgICAgaW50IHRvdF9jb3VudDsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgLy8gU2V0IHRvIGRlZmF1bHRzCi0gICAgICAgIHZweF9tZW1zZXQoeGQtPm1iX3NlZ21lbnRfdHJlZV9wcm9icywgMjU1ICwgc2l6ZW9mKHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnMpKTsKLQotICAgICAgICB0b3RfY291bnQgPSBzZWdtZW50X2NvdW50c1swXSArIHNlZ21lbnRfY291bnRzWzFdICsgc2VnbWVudF9jb3VudHNbMl0gKyBzZWdtZW50X2NvdW50c1szXTsKLQotICAgICAgICBpZiAodG90X2NvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzBdID0gKChzZWdtZW50X2NvdW50c1swXSArIHNlZ21lbnRfY291bnRzWzFdKSAqIDI1NSkgLyB0b3RfY291bnQ7Ci0KLSAgICAgICAgICAgIHRvdF9jb3VudCA9IHNlZ21lbnRfY291bnRzWzBdICsgc2VnbWVudF9jb3VudHNbMV07Ci0KLSAgICAgICAgICAgIGlmICh0b3RfY291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbMV0gPSAoc2VnbWVudF9jb3VudHNbMF0gKiAyNTUpIC8gdG90X2NvdW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0b3RfY291bnQgPSBzZWdtZW50X2NvdW50c1syXSArIHNlZ21lbnRfY291bnRzWzNdOwotCi0gICAgICAgICAgICBpZiAodG90X2NvdW50ID4gMCkKLSAgICAgICAgICAgICAgICB4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzWzJdID0gKHNlZ21lbnRfY291bnRzWzJdICogMjU1KSAvIHRvdF9jb3VudDsKLQotICAgICAgICAgICAgLy8gWmVybyBwcm9iYWJpbGl0aWVzIG5vdCBhbGxvd2VkCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUJfRkVBVFVSRV9UUkVFX1BST0JTOyBpICsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4ZC0+bWJfc2VnbWVudF90cmVlX3Byb2JzW2ldID09IDApCi0gICAgICAgICAgICAgICAgICAgIHhkLT5tYl9zZWdtZW50X3RyZWVfcHJvYnNbaV0gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gMjU2IHJhdGUgdW5pdHMgdG8gdGhlIGJpdAotICAgIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPSB0b3RhbHJhdGUgPj4gODsgICAvLyBwcm9qZWN0ZWRfZnJhbWVfc2l6ZSBpbiB1bml0cyBvZiBCWVRFUwotCi0gICAgLy8gTWFrZSBhIG5vdGUgb2YgdGhlIHBlcmNlbnRhZ2UgTUJzIGNvZGVkIEludHJhLgotICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgewotICAgICAgICBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA9IDEwMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IHRvdF9tb2RlczsKLQotICAgICAgICB0b3RfbW9kZXMgPSBjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZVtJTlRSQV9GUkFNRV0KLSAgICAgICAgICAgICAgICAgICAgKyBjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZVtMQVNUX0ZSQU1FXQotICAgICAgICAgICAgICAgICAgICArIGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0KLSAgICAgICAgICAgICAgICAgICAgKyBjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZVtBTFRSRUZfRlJBTUVdOwotCi0gICAgICAgIGlmICh0b3RfbW9kZXMpCi0gICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0lOVFJBX0ZSQU1FXSAqIDEwMCAvIHRvdF9tb2RlczsKLQotICAgIH0KLQotI2lmIDAKLSAgICB7Ci0gICAgICAgIGludCBjbnQgPSAwOwotICAgICAgICBpbnQgZmxhZ1syXSA9IHswLCAwfTsKLQotICAgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IE1WUGNvdW50OyBjbnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNtLT5mYy5wcmVfbXZjWzBdW2NudF0gIT0gY20tPmZjLm12Y1swXVtjbnRdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsYWdbMF0gPSAxOwotICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoY20tPmZjLnByZV9tdmNbMF0sIGNtLT5mYy5tdmNbMF0sIE1WUGNvdW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY250ID0gMDsgY250IDwgTVZQY291bnQ7IGNudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY20tPmZjLnByZV9tdmNbMV1bY250XSAhPSBjbS0+ZmMubXZjWzFdW2NudF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhZ1sxXSA9IDE7Ci0gICAgICAgICAgICAgICAgdnB4X21lbWNweShjbS0+ZmMucHJlX212Y1sxXSwgY20tPmZjLm12Y1sxXSwgTVZQY291bnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdbMF0gfHwgZmxhZ1sxXSkKLSAgICAgICAgICAgIHZwOF9idWlsZF9jb21wb25lbnRfY29zdF90YWJsZShjcGktPm1iLm12Y29zdCwgY3BpLT5tYi5tdnNhZGNvc3QsIChjb25zdCBNVl9DT05URVhUICopIGNtLT5mYy5tdmMsIGZsYWcpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gQWRqdXN0IHRoZSBwcm9qZWN0ZWQgcmVmZXJlbmNlIGZyYW1lIHVzZWFnZSBwcm9iYWJpbGl0eSBudW1iZXJzIHRvIHJlZmxlY3QKLSAgICAvLyB3aGF0IHdlIGhhdmUganVzdCBzZWVuLiBUaGlzIG1heSBiZSB1c2VmdWxsIHdoZW4gd2UgbWFrZSBtdWx0aXBsZSBpdHRlcmF0aW9ucwotICAgIC8vIG9mIHRoZSByZWNvZGUgbG9vcCByYXRoZXIgdGhhbiBjb250aW51aW5nIHRvIHVzZSB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUuCi0gICAgaWYgKChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpICYmICFjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lICYmICFjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCi0gICAgewotICAgICAgICBjb25zdCBpbnQgKmNvbnN0IHJmY3QgPSBjcGktPmNvdW50X21iX3JlZl9mcmFtZV91c2FnZTsKLSAgICAgICAgY29uc3QgaW50IHJmX2ludHJhID0gcmZjdFtJTlRSQV9GUkFNRV07Ci0gICAgICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07Ci0KLSAgICAgICAgaWYgKChyZl9pbnRyYSArIHJmX2ludGVyKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IChyZl9pbnRyYSAqIDI1NSkgLyAocmZfaW50cmEgKyByZl9pbnRlcik7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnByb2JfaW50cmFfY29kZWQgPCAxKQotICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDE7Ci0KLSAgICAgICAgICAgIGlmICgoY20tPmZyYW1lc19zaW5jZV9nb2xkZW4gPiAwKSB8fCBjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IHJmX2ludGVyID8gKHJmY3RbTEFTVF9GUkFNRV0gKiAyNTUpIC8gcmZfaW50ZXIgOiAxMjg7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5wcm9iX2xhc3RfY29kZWQgPCAxKQotICAgICAgICAgICAgICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IDE7Ci0KLSAgICAgICAgICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAocmZjdFtHT0xERU5fRlJBTUVdICsgcmZjdFtBTFRSRUZfRlJBTUVdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHJmY3RbR09MREVOX0ZSQU1FXSAqIDI1NSkgLyAocmZjdFtHT0xERU5fRlJBTUVdICsgcmZjdFtBTFRSRUZfRlJBTUVdKSA6IDEyODsKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPnByb2JfZ2ZfY29kZWQgPCAxKQotICAgICAgICAgICAgICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWYgMAotICAgIC8vIEtlZXAgcmVjb3JkIG9mIHRoZSB0b3RhbCBkaXN0b3J0aW9uIHRoaXMgdGltZSBhcm91bmQgZm9yIGZ1dHVyZSB1c2UKLSAgICBjcGktPmxhc3RfZnJhbWVfZGlzdG9ydGlvbiA9IGNwaS0+ZnJhbWVfZGlzdG9ydGlvbjsKLSNlbmRpZgotCi0gICAgLyogVXBkYXRlIHRoZSBhdmVyYWdlIGFjdGl2aXR5IGZvciB0aGUgbmV4dCBmcmFtZS4KLSAgICAgKiBUaGlzIGlzIGZlZWQtZm9yd2FyZCBmb3Igbm93OyBpdCBjb3VsZCBhbHNvIGJlIHNhdmVkIGluIHR3by1wYXNzLCBvcgotICAgICAqICBkb25lIGR1cmluZyBsb29rYWhlYWQgd2hlbiB0aGF0IGlzIGV2ZW50dWFsbHkgYWRkZWQuCi0gICAgICovCi0gICAgY3BpLT5hY3Rpdml0eV9hdmcgPSAodW5zaWduZWQgaW50ICkoeC0+YWN0aXZpdHlfc3VtL2NwaS0+Y29tbW9uLk1Ccyk7Ci0gICAgaWYgKGNwaS0+YWN0aXZpdHlfYXZnIDwgVlA4X0FDVElWSVRZX0FWR19NSU4pCi0gICAgICAgIGNwaS0+YWN0aXZpdHlfYXZnID0gVlA4X0FDVElWSVRZX0FWR19NSU47Ci0KLX0KLXZvaWQgdnA4X3NldHVwX2Jsb2NrX3B0cnMoTUFDUk9CTE9DSyAqeCkKLXsKLSAgICBpbnQgciwgYzsKLSAgICBpbnQgaTsKLQotICAgIGZvciAociA9IDA7IHIgPCA0OyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5ibG9ja1tyKjQrY10uc3JjX2RpZmYgPSB4LT5zcmNfZGlmZiArIHIgKiA0ICogMTYgKyBjICogNDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAociA9IDA7IHIgPCAyOyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMjsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5ibG9ja1sxNiArIHIqMitjXS5zcmNfZGlmZiA9IHgtPnNyY19kaWZmICsgMjU2ICsgciAqIDQgKiA4ICsgYyAqIDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGZvciAociA9IDA7IHIgPCAyOyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMjsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5ibG9ja1syMCArIHIqMitjXS5zcmNfZGlmZiA9IHgtPnNyY19kaWZmICsgMzIwICsgciAqIDQgKiA4ICsgYyAqIDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB4LT5ibG9ja1syNF0uc3JjX2RpZmYgPSB4LT5zcmNfZGlmZiArIDM4NDsKLQotCi0gICAgZm9yIChpID0gMDsgaSA8IDI1OyBpKyspCi0gICAgewotICAgICAgICB4LT5ibG9ja1tpXS5jb2VmZiA9IHgtPmNvZWZmICsgaSAqIDE2OwotICAgIH0KLX0KLQotdm9pZCB2cDhfYnVpbGRfYmxvY2tfb2Zmc2V0cyhNQUNST0JMT0NLICp4KQotewotICAgIGludCBibG9jayA9IDA7Ci0gICAgaW50IGJyLCBiYzsKLQotICAgIHZwOF9idWlsZF9ibG9ja19kb2Zmc2V0cygmeC0+ZV9tYmQpOwotCi0gICAgLy8geSBibG9ja3MKLSAgICBmb3IgKGJyID0gMDsgYnIgPCA0OyBicisrKQotICAgIHsKLSAgICAgICAgZm9yIChiYyA9IDA7IGJjIDwgNDsgYmMrKykKLSAgICAgICAgewotICAgICAgICAgICAgQkxPQ0sgKnRoaXNfYmxvY2sgPSAmeC0+YmxvY2tbYmxvY2tdOwotICAgICAgICAgICAgdGhpc19ibG9jay0+YmFzZV9zcmMgPSAmeC0+c3JjLnlfYnVmZmVyOwotICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjX3N0cmlkZSA9IHgtPnNyYy55X3N0cmlkZTsKLSAgICAgICAgICAgIHRoaXNfYmxvY2stPnNyYyA9IDQgKiBiciAqIHRoaXNfYmxvY2stPnNyY19zdHJpZGUgKyA0ICogYmM7Ci0gICAgICAgICAgICArK2Jsb2NrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdSBibG9ja3MKLSAgICBmb3IgKGJyID0gMDsgYnIgPCAyOyBicisrKQotICAgIHsKLSAgICAgICAgZm9yIChiYyA9IDA7IGJjIDwgMjsgYmMrKykKLSAgICAgICAgewotICAgICAgICAgICAgQkxPQ0sgKnRoaXNfYmxvY2sgPSAmeC0+YmxvY2tbYmxvY2tdOwotICAgICAgICAgICAgdGhpc19ibG9jay0+YmFzZV9zcmMgPSAmeC0+c3JjLnVfYnVmZmVyOwotICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjX3N0cmlkZSA9IHgtPnNyYy51dl9zdHJpZGU7Ci0gICAgICAgICAgICB0aGlzX2Jsb2NrLT5zcmMgPSA0ICogYnIgKiB0aGlzX2Jsb2NrLT5zcmNfc3RyaWRlICsgNCAqIGJjOwotICAgICAgICAgICAgKytibG9jazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHYgYmxvY2tzCi0gICAgZm9yIChiciA9IDA7IGJyIDwgMjsgYnIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYmMgPSAwOyBiYyA8IDI7IGJjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJMT0NLICp0aGlzX2Jsb2NrID0gJngtPmJsb2NrW2Jsb2NrXTsKLSAgICAgICAgICAgIHRoaXNfYmxvY2stPmJhc2Vfc3JjID0gJngtPnNyYy52X2J1ZmZlcjsKLSAgICAgICAgICAgIHRoaXNfYmxvY2stPnNyY19zdHJpZGUgPSB4LT5zcmMudXZfc3RyaWRlOwotICAgICAgICAgICAgdGhpc19ibG9jay0+c3JjID0gNCAqIGJyICogdGhpc19ibG9jay0+c3JjX3N0cmlkZSArIDQgKiBiYzsKLSAgICAgICAgICAgICsrYmxvY2s7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bV9pbnRyYV9zdGF0cyhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4KQotewotICAgIGNvbnN0IE1BQ1JPQkxPQ0tEICp4ZCA9ICYgeC0+ZV9tYmQ7Ci0gICAgY29uc3QgTUJfUFJFRElDVElPTl9NT0RFIG0gPSB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZTsKLSAgICBjb25zdCBNQl9QUkVESUNUSU9OX01PREUgdXZtID0geGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGU7Ci0KLSNpZmRlZiBNT0RFX1NUQVRTCi0gICAgY29uc3QgaW50IGlzX2tleSA9IGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FOwotCi0gICAgKysgKGlzX2tleSA/IHV2X21vZGVzIDogaW50ZXJfdXZfbW9kZXMpW3V2bV07Ci0KLSAgICBpZiAobSA9PSBCX1BSRUQpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgKmNvbnN0IGJjdCA9IGlzX2tleSA/IGJfbW9kZXMgOiBpbnRlcl9iX21vZGVzOwotCi0gICAgICAgIGludCBiID0gMDsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICArKyBiY3RbeGQtPmJsb2NrW2JdLmJtaS5tb2RlXTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoKytiIDwgMTYpOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICArK2NwaS0+eW1vZGVfY291bnRbbV07Ci0gICAgKytjcGktPnV2X21vZGVfY291bnRbdXZtXTsKLQotfQotaW50IHZwOGN4X2VuY29kZV9pbnRyYV9tYWNyb19ibG9jayhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LCBUT0tFTkVYVFJBICoqdCkKLXsKLSAgICBpbnQgRXJyb3I0eDQsIEVycm9yMTZ4MTYsIGVycm9yX3V2OwotICAgIGludCByYXRlNHg0LCByYXRlMTZ4MTYsIHJhdGV1djsKLSAgICBpbnQgZGlzdDR4NCwgZGlzdDE2eDE2LCBkaXN0dXY7Ci0gICAgaW50IHJhdGUgPSAwOwotICAgIGludCByYXRlNHg0X3Rva2Vub25seSA9IDA7Ci0gICAgaW50IHJhdGUxNngxNl90b2tlbm9ubHkgPSAwOwotICAgIGludCByYXRldXZfdG9rZW5vbmx5ID0gMDsKLQotICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IElOVFJBX0ZSQU1FOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICBpZiAoY3BpLT5zZi5SRCAmJiBjcGktPmNvbXByZXNzb3Jfc3BlZWQgIT0gMikKLSAgICB7Ci0gICAgICAgIGVycm9yX3V2ID0gdnA4X3JkX3BpY2tfaW50cmFfbWJ1dl9tb2RlKGNwaSwgeCwgJnJhdGV1diwgJnJhdGV1dl90b2tlbm9ubHksICZkaXN0dXYpOwotICAgICAgICByYXRlICs9IHJhdGV1djsKLQotICAgICAgICBFcnJvcjE2eDE2ID0gdnA4X3JkX3BpY2tfaW50cmExNngxNm1ieV9tb2RlKGNwaSwgeCwgJnJhdGUxNngxNiwgJnJhdGUxNngxNl90b2tlbm9ubHksICZkaXN0MTZ4MTYpOwotCi0gICAgICAgIEVycm9yNHg0ID0gdnA4X3JkX3BpY2tfaW50cmE0eDRtYnlfbW9kZXMoY3BpLCB4LCAmcmF0ZTR4NCwgJnJhdGU0eDRfdG9rZW5vbmx5LCAmZGlzdDR4NCwgRXJyb3IxNngxNik7Ci0KLSAgICAgICAgcmF0ZSArPSAoRXJyb3I0eDQgPCBFcnJvcjE2eDE2KSA/IHJhdGU0eDQgOiByYXRlMTZ4MTY7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgICAgaW50IHJhdGUyLCBiZXN0X2Rpc3RvcnRpb247Ci0gICAgICAgIE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlLCBiZXN0X21vZGUgPSBEQ19QUkVEOwotICAgICAgICBpbnQgdGhpc19yZDsKLSAgICAgICAgRXJyb3IxNngxNiA9IElOVF9NQVg7Ci0KLSAgICAgICAgdnA4X3BpY2tfaW50cmFfbWJ1dl9tb2RlKHgpOwotCi0gICAgICAgIGZvciAobW9kZSA9IERDX1BSRUQ7IG1vZGUgPD0gVE1fUFJFRDsgbW9kZSArKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGRpc3RvcnRpb24yOwotCi0gICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gbW9kZTsKLSAgICAgICAgICAgIFJFQ09OX0lOVk9LRSgmY3BpLT5jb21tb24ucnRjZC5yZWNvbiwgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkpCi0gICAgICAgICAgICAgICAgKCZ4LT5lX21iZCk7Ci0gICAgICAgICAgICBkaXN0b3J0aW9uMiA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBnZXQxNngxNnByZWRlcnJvcikoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHgtPmVfbWJkLnByZWRpY3RvciwgMTYsIDB4N2ZmZmZmZmYpOwotICAgICAgICAgICAgcmF0ZTIgID0geC0+bWJtb2RlX2Nvc3RbeC0+ZV9tYmQuZnJhbWVfdHlwZV1bbW9kZV07Ci0gICAgICAgICAgICB0aGlzX3JkID0gUkRfRVNUSU1BVEUoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZTIsIGRpc3RvcnRpb24yKTsKLQotICAgICAgICAgICAgaWYgKEVycm9yMTZ4MTYgPiB0aGlzX3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVycm9yMTZ4MTYgPSB0aGlzX3JkOwotICAgICAgICAgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgYmVzdF9kaXN0b3J0aW9uID0gZGlzdG9ydGlvbjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IGJlc3RfbW9kZTsKLQotICAgICAgICBFcnJvcjR4NCA9IHZwOF9waWNrX2ludHJhNHg0bWJ5X21vZGVzKElGX1JUQ0QoJmNwaS0+cnRjZCksIHgsICZyYXRlMiwgJmJlc3RfZGlzdG9ydGlvbik7Ci0gICAgfQotCi0gICAgaWYgKEVycm9yNHg0IDwgRXJyb3IxNngxNikKLSAgICB7Ci0gICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPSBCX1BSRUQ7Ci0gICAgICAgIHZwOF9lbmNvZGVfaW50cmE0eDRtYnkoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwOF9lbmNvZGVfaW50cmExNngxNm1ieShJRl9SVENEKCZjcGktPnJ0Y2QpLCB4KTsKLSAgICB9Ci0KLSAgICB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnV2KElGX1JUQ0QoJmNwaS0+cnRjZCksIHgpOwotICAgIHN1bV9pbnRyYV9zdGF0cyhjcGksIHgpOwotICAgIHZwOF90b2tlbml6ZV9tYihjcGksICZ4LT5lX21iZCwgdCk7Ci0KLSAgICByZXR1cm4gcmF0ZTsKLX0KLSNpZmRlZiBTUEVFRFNUQVRTCi1leHRlcm4gaW50IGNudF9wbTsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB2cDhfZml4X2NvbnRleHRzKE1BQ1JPQkxPQ0tEICp4KTsKLQotaW50IHZwOGN4X2VuY29kZV9pbnRlcl9tYWNyb2Jsb2NrCi0oCi0gICAgVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgVE9LRU5FWFRSQSAqKnQsCi0gICAgaW50IHJlY29uX3lvZmZzZXQsIGludCByZWNvbl91dm9mZnNldAotKQotewotICAgIE1BQ1JPQkxPQ0tEICpjb25zdCB4ZCA9ICZ4LT5lX21iZDsKLSAgICBpbnQgaW50ZXJfZXJyb3I7Ci0gICAgaW50IGludHJhX2Vycm9yID0gMDsKLSAgICBpbnQgcmF0ZTsKLSAgICBpbnQgZGlzdG9ydGlvbjsKLQotICAgIHgtPnNraXAgPSAwOwotCi0gICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKLSAgICAgICAgeC0+ZW5jb2RlX2JyZWFrb3V0ID0gY3BpLT5zZWdtZW50X2VuY29kZV9icmVha291dFt4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZF07Ci0gICAgZWxzZQotICAgICAgICB4LT5lbmNvZGVfYnJlYWtvdXQgPSBjcGktPm94Y2YuZW5jb2RlX2JyZWFrb3V0OwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLQotICAgIGlmIChjcGktPnNmLlJEKQotICAgIHsKLSAgICAgICAgaW50IHpiaW5fbW9kZV9ib29zdF9lbmFibGVkID0gY3BpLT56YmluX21vZGVfYm9vc3RfZW5hYmxlZDsKLQotICAgICAgICAvKiBBcmUgd2UgdXNpbmcgdGhlIGZhc3QgcXVhbnRpemVyIGZvciB0aGUgbW9kZSBzZWxlY3Rpb24/ICovCi0gICAgICAgIGlmKGNwaS0+c2YudXNlX2Zhc3RxdWFudF9mb3JfcGljaykKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5tYi5xdWFudGl6ZV9iICAgICAgPSBRVUFOVElaRV9JTlZPS0UoJmNwaS0+cnRjZC5xdWFudGl6ZSwgZmFzdHF1YW50Yik7Ci0KLSAgICAgICAgICAgIC8qIHRoZSBmYXN0IHF1YW50aXplciBkb2VzIG5vdCB1c2UgemJpbl9leHRyYSwgc28KLSAgICAgICAgICAgICAqIGRvIG5vdCByZWNhbGN1bGF0ZSAqLwotICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3RfZW5hYmxlZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJfZXJyb3IgPSB2cDhfcmRfcGlja19pbnRlcl9tb2RlKGNwaSwgeCwgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQsICZyYXRlLCAmZGlzdG9ydGlvbiwgJmludHJhX2Vycm9yKTsKLQotICAgICAgICAvKiBzd2l0Y2ggYmFjayB0byB0aGUgcmVndWxhciBxdWFudGl6ZXIgZm9yIHRoZSBlbmNvZGUgKi8KLSAgICAgICAgaWYgKGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+bWIucXVhbnRpemVfYiAgICA9IFFVQU5USVpFX0lOVk9LRSgmY3BpLT5ydGNkLnF1YW50aXplLCBxdWFudGIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmVzdG9yZSBjcGktPnpiaW5fbW9kZV9ib29zdF9lbmFibGVkICovCi0gICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0X2VuYWJsZWQgPSB6YmluX21vZGVfYm9vc3RfZW5hYmxlZDsKLQotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgaW50ZXJfZXJyb3IgPSB2cDhfcGlja19pbnRlcl9tb2RlKGNwaSwgeCwgcmVjb25feW9mZnNldCwgcmVjb25fdXZvZmZzZXQsICZyYXRlLCAmZGlzdG9ydGlvbiwgJmludHJhX2Vycm9yKTsKLQotCi0gICAgY3BpLT5wcmVkaWN0aW9uX2Vycm9yICs9IGludGVyX2Vycm9yOwotICAgIGNwaS0+aW50cmFfZXJyb3IgKz0gaW50cmFfZXJyb3I7Ci0KLSNpZiAwCi0gICAgLy8gRXhwZXJpbWVudGFsIFJEIGNvZGUKLSAgICBjcGktPmZyYW1lX2Rpc3RvcnRpb24gKz0gZGlzdG9ydGlvbjsKLSAgICBjcGktPmxhc3RfbWJfZGlzdG9ydGlvbiA9IGRpc3RvcnRpb247Ci0jZW5kaWYKLQotICAgIC8vIE1CIGxldmVsIGFkanV0bWVudCB0byBxdWFudGl6ZXIgc2V0dXAKLSAgICBpZiAoeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgIHsKLSAgICAgICAgLy8gSWYgY3ljbGljIHVwZGF0ZSBlbmFibGVkCi0gICAgICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfZW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ2xlYXIgc2VnbWVudF9pZCBiYWNrIHRvIDAgaWYgbm90IGNvZGVkIChsYXN0IGZyYW1lIDAsMCkKLSAgICAgICAgICAgIGlmICgoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnNlZ21lbnRfaWQgPT0gMSkgJiYKLSAgICAgICAgICAgICAgICAoKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgIT0gTEFTVF9GUkFNRSkgfHwgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFpFUk9NVikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHNlZ21lbnRfaWQgY2hhbmdlZCwgc28gdXBkYXRlICovCi0gICAgICAgICAgICAgICAgdnA4Y3hfbWJfaW5pdF9xdWFudGl6ZXIoY3BpLCB4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gRXhwZXJpbWVudGFsIGNvZGUuIFNwZWNpYWwgY2FzZSBmb3IgZ2YgYW5kIGFyZiB6ZXJvbXYgbW9kZXMuIEluY3JlYXNlIHpiaW4gc2l6ZSB0byBzdXByZXNzIG5vaXNlCi0gICAgICAgIGlmIChjcGktPnpiaW5fbW9kZV9ib29zdF9lbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUgKQotICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IFpFUk9NVikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lICE9IExBU1RfRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IEdGX1pFUk9NVl9aQklOX0JPT1NUOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IExGX1pFUk9NVl9aQklOX0JPT1NUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBTUExJVE1WKQotICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IE1WX1pCSU5fQk9PU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3QgPSAwOwotCi0gICAgICAgIHZwOF91cGRhdGVfemJpbl9leHRyYShjcGksIHgpOwotICAgIH0KLQotICAgIGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW3hkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdICsrOwotCi0gICAgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gSU5UUkFfRlJBTUUpCi0gICAgewotICAgICAgICB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnV2KElGX1JUQ0QoJmNwaS0+cnRjZCksIHgpOwotCi0gICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBCX1BSRUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9lbmNvZGVfaW50cmE0eDRtYnkoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnkoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdW1faW50cmFfc3RhdHMoY3BpLCB4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTVYgYmVzdF9yZWZfbXY7Ci0gICAgICAgIE1WIG5lYXJlc3QsIG5lYXJieTsKLSAgICAgICAgaW50IG1kY291bnRzWzRdOwotICAgICAgICBpbnQgcmVmX2ZiX2lkeDsKLQotICAgICAgICB2cDhfZmluZF9uZWFyX212cyh4ZCwgeGQtPm1vZGVfaW5mb19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVhcmVzdCwgJm5lYXJieSwgJmJlc3RfcmVmX212LCBtZGNvdW50cywgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSwgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0KLSAgICAgICAgdnA4X2J1aWxkX3V2bXZzKHhkLCBjcGktPmNvbW1vbi5mdWxsX3BpeGVsKTsKLQotICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9PSBMQVNUX0ZSQU1FKQotICAgICAgICAgICAgcmVmX2ZiX2lkeCA9IGNwaS0+Y29tbW9uLmxzdF9mYl9pZHg7Ci0gICAgICAgIGVsc2UgaWYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gR09MREVOX0ZSQU1FKQotICAgICAgICAgICAgcmVmX2ZiX2lkeCA9IGNwaS0+Y29tbW9uLmdsZF9mYl9pZHg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlZl9mYl9pZHggPSBjcGktPmNvbW1vbi5hbHRfZmJfaWR4OwotCi0gICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBjcGktPmNvbW1vbi55djEyX2ZiW3JlZl9mYl9pZHhdLnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKLSAgICAgICAgeGQtPnByZS51X2J1ZmZlciA9IGNwaS0+Y29tbW9uLnl2MTJfZmJbcmVmX2ZiX2lkeF0udV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgeGQtPnByZS52X2J1ZmZlciA9IGNwaS0+Y29tbW9uLnl2MTJfZmJbcmVmX2ZiX2lkeF0udl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLQotICAgICAgICBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4ZC0+YmxvY2tbaV0uYm1pLm1vZGUgPT0gTkVXNFg0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5NVmNvdW50WzBdW212X21heCsoKHhkLT5ibG9ja1tpXS5ibWkubXYuYXNfbXYucm93IC0gYmVzdF9yZWZfbXYucm93KSA+PiAxKV0rKzsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5NVmNvdW50WzFdW212X21heCsoKHhkLT5ibG9ja1tpXS5ibWkubXYuYXNfbXYuY29sIC0gYmVzdF9yZWZfbXYuY29sKSA+PiAxKV0rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gTkVXTVYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+TVZjb3VudFswXVttdl9tYXgrKCh4ZC0+YmxvY2tbMF0uYm1pLm12LmFzX212LnJvdyAtIGJlc3RfcmVmX212LnJvdykgPj4gMSldKys7Ci0gICAgICAgICAgICBjcGktPk1WY291bnRbMV1bbXZfbWF4KygoeGQtPmJsb2NrWzBdLmJtaS5tdi5hc19tdi5jb2wgLSBiZXN0X3JlZl9tdi5jb2wpID4+IDEpXSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF4LT5za2lwICYmICF4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5mb3JjZV9ub19za2lwKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZW5jb2RlX2ludGVyMTZ4MTYoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFyIG1iX3NraXBfY29lZmYgaWYgbWJfbm9fY29lZmZfc2tpcCBpcyBub3Qgc2V0Ci0gICAgICAgICAgICBpZiAoIWNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApCi0gICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYgPSAwOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnA4X3N0dWZmX2ludGVyMTZ4MTYoeCk7Ci0gICAgfQotCi0gICAgaWYgKCF4LT5za2lwKQotICAgICAgICB2cDhfdG9rZW5pemVfbWIoY3BpLCB4ZCwgdCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKLSAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA9IDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmRjX2RpZmYgPSAxOwotCi0gICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZiA9IDE7Ci0gICAgICAgICAgICBjcGktPnNraXBfdHJ1ZV9jb3VudCArKzsKLSAgICAgICAgICAgIHZwOF9maXhfY29udGV4dHMoeGQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X3N0dWZmX21iKGNwaSwgeGQsIHQpOwotICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1iX3NraXBfY29lZmYgPSAwOwotICAgICAgICAgICAgY3BpLT5za2lwX2ZhbHNlX2NvdW50ICsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJhdGU7Ci19CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9lbmNvZGVpbnRyYS5jIGIvdnA4L2VuY29kZXIvZW5jb2RlaW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwMDAwNi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9lbmNvZGVpbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vaWRjdC5oIgotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludHJhLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludHJhNHg0LmgiCi0jaW5jbHVkZSAiZW5jb2RlbWIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2ludnRyYW5zLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbi5oIgotI2luY2x1ZGUgImRjdC5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZ19jb21tb24uaCIKLSNpbmNsdWRlICJlbmNvZGVpbnRyYS5oIgotCi0jZGVmaW5lIGludHJhNHg0aWJpYXNfcmF0ZSAgICAxMjgKLSNkZWZpbmUgaW50cmE0eDRwYmlhc19yYXRlICAgIDI1NgotCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIElGX1JUQ0QoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBJRl9SVENEKHgpIE5VTEwKLSNlbmRpZgotdm9pZCB2cDhfZW5jb2RlX2ludHJhNHg0YmxvY2soY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqcnRjZCwgTUFDUk9CTE9DSyAqeCwgQkxPQ0sgKmJlLCBCTE9DS0QgKmIsIGludCBiZXN0X21vZGUpCi17Ci0gICAgdnA4X3ByZWRpY3RfaW50cmE0eDQoYiwgYmVzdF9tb2RlLCBiLT5wcmVkaWN0b3IpOwotCi0gICAgRU5DT0RFTUJfSU5WT0tFKCZydGNkLT5lbmNvZGVtYiwgc3ViYikoYmUsIGIsIDE2KTsKLQotICAgIHgtPnZwOF9zaG9ydF9mZGN0NHg0KGJlLT5zcmNfZGlmZiwgYmUtPmNvZWZmLCAzMik7Ci0KLSAgICB4LT5xdWFudGl6ZV9iKGJlLCBiKTsKLQotICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9iKElGX1JUQ0QoJnJ0Y2QtPmNvbW1vbi0+aWRjdCksIGIsIDMyKTsKLQotICAgIFJFQ09OX0lOVk9LRSgmcnRjZC0+Y29tbW9uLT5yZWNvbiwgcmVjb24pKGItPnByZWRpY3RvciwgYi0+ZGlmZiwgKihiLT5iYXNlX2RzdCkgKyBiLT5kc3QsIGItPmRzdF9zdHJpZGUpOwotfQotCi12b2lkIHZwOF9lbmNvZGVfaW50cmE0eDRtYnkoY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqcnRjZCwgTUFDUk9CTE9DSyAqbWIpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBNQUNST0JMT0NLRCAqeCA9ICZtYi0+ZV9tYmQ7Ci0gICAgdnA4X2ludHJhX3ByZWRpY3Rpb25fZG93bl9jb3B5KHgpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBCTE9DSyAqYmUgPSAmbWItPmJsb2NrW2ldOwotICAgICAgICBCTE9DS0QgKmIgPSAmeC0+YmxvY2tbaV07Ci0KLSAgICAgICAgdnA4X2VuY29kZV9pbnRyYTR4NGJsb2NrKHJ0Y2QsIG1iLCBiZSwgYiwgYi0+Ym1pLm1vZGUpOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotdm9pZCB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnkoY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqcnRjZCwgTUFDUk9CTE9DSyAqeCkKLXsKLSAgICBpbnQgYjsKLQotICAgIFJFQ09OX0lOVk9LRSgmcnRjZC0+Y29tbW9uLT5yZWNvbiwgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkpKCZ4LT5lX21iZCk7Ci0KLSAgICBFTkNPREVNQl9JTlZPS0UoJnJ0Y2QtPmVuY29kZW1iLCBzdWJtYnkpKHgtPnNyY19kaWZmLCB4LT5zcmMueV9idWZmZXIsIHgtPmVfbWJkLnByZWRpY3RvciwgeC0+c3JjLnlfc3RyaWRlKTsKLQotICAgIHZwOF90cmFuc2Zvcm1faW50cmFfbWJ5KHgpOwotCi0gICAgdnA4X3F1YW50aXplX21ieSh4KTsKLQotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0jaWYgMQotICAgIGlmICh4LT5vcHRpbWl6ZSkKLSAgICAgICAgdnA4X29wdGltaXplX21ieSh4LCBydGNkKTsKLQotI2VuZGlmCi0jZW5kaWYKLQotICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYnkoSUZfUlRDRCgmcnRjZC0+Y29tbW9uLT5pZGN0KSwgJngtPmVfbWJkKTsKLQotICAgIFJFQ09OX0lOVk9LRSgmcnRjZC0+Y29tbW9uLT5yZWNvbiwgcmVjb25fbWJ5KQotICAgICAgICAoSUZfUlRDRCgmcnRjZC0+Y29tbW9uLT5yZWNvbiksICZ4LT5lX21iZCk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgYmxvY2sgbW9kZXMgYXJlIHNldCB0aGUgd2F5IHdlIHdhbnQgdGhlbSBmb3IgY29udGV4dCB1cGRhdGVzCi0gICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCi0gICAgewotICAgICAgICBCTE9DS0QgKmQgPSAmeC0+ZV9tYmQuYmxvY2tbYl07Ci0KLSAgICAgICAgc3dpdGNoICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlKQotICAgICAgICB7Ci0KLSAgICAgICAgY2FzZSBEQ19QUkVEOgotICAgICAgICAgICAgZC0+Ym1pLm1vZGUgPSBCX0RDX1BSRUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWX1BSRUQ6Ci0gICAgICAgICAgICBkLT5ibWkubW9kZSA9IEJfVkVfUFJFRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhfUFJFRDoKLSAgICAgICAgICAgIGQtPmJtaS5tb2RlID0gQl9IRV9QUkVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVE1fUFJFRDoKLSAgICAgICAgICAgIGQtPmJtaS5tb2RlID0gQl9UTV9QUkVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBkLT5ibWkubW9kZSA9IEJfRENfUFJFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2VuY29kZV9pbnRyYTE2eDE2bWJ1dihjb25zdCBWUDhfRU5DT0RFUl9SVENEICpydGNkLCBNQUNST0JMT0NLICp4KQotewotICAgIHZwOF9idWlsZF9pbnRyYV9wcmVkaWN0b3JzX21idXYoJngtPmVfbWJkKTsKLQotICAgIEVOQ09ERU1CX0lOVk9LRSgmcnRjZC0+ZW5jb2RlbWIsIHN1Ym1idXYpKHgtPnNyY19kaWZmLCB4LT5zcmMudV9idWZmZXIsIHgtPnNyYy52X2J1ZmZlciwgeC0+ZV9tYmQucHJlZGljdG9yLCB4LT5zcmMudXZfc3RyaWRlKTsKLQotICAgIHZwOF90cmFuc2Zvcm1fbWJ1dih4KTsKLQotICAgIHZwOF9xdWFudGl6ZV9tYnV2KHgpOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSNpZiAxCi0KLSAgICBpZiAoeC0+b3B0aW1pemU9PTIgfHwoeC0+b3B0aW1pemUgJiYgeC0+cmRkaXYgPiAxKSkKLSAgICAgICAgdnA4X29wdGltaXplX21idXYoeCwgcnRjZCk7Ci0KLSNlbmRpZgotI2VuZGlmCi0KLSAgICB2cDhfaW52ZXJzZV90cmFuc2Zvcm1fbWJ1dihJRl9SVENEKCZydGNkLT5jb21tb24tPmlkY3QpLCAmeC0+ZV9tYmQpOwotCi0gICAgdnA4X3JlY29uX2ludHJhX21idXYoSUZfUlRDRCgmcnRjZC0+Y29tbW9uLT5yZWNvbiksICZ4LT5lX21iZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2VuY29kZWludHJhLmggYi92cDgvZW5jb2Rlci9lbmNvZGVpbnRyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzMGJjLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2VuY29kZWludHJhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfRU5DT0RFSU5UUkFfSF8KLSNkZWZpbmUgX0VOQ09ERUlOVFJBX0hfCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLQotdm9pZCB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnkoY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqLCBNQUNST0JMT0NLICp4KTsKLXZvaWQgdnA4X2VuY29kZV9pbnRyYTE2eDE2bWJ1dihjb25zdCBWUDhfRU5DT0RFUl9SVENEICosIE1BQ1JPQkxPQ0sgKngpOwotdm9pZCB2cDhfZW5jb2RlX2ludHJhNHg0bWJ5KGNvbnN0IFZQOF9FTkNPREVSX1JUQ0QgKiwgTUFDUk9CTE9DSyAqbWIpOwotdm9pZCB2cDhfZW5jb2RlX2ludHJhNHg0YmxvY2soY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqLCBNQUNST0JMT0NLICp4LCBCTE9DSyAqYmUsIEJMT0NLRCAqYiwgaW50IGJlc3RfbW9kZSk7Ci12b2lkIHZwOF9lbmNvZGVfaW50cmE0eDRibG9ja19yZChjb25zdCBWUDhfRU5DT0RFUl9SVENEICosIE1BQ1JPQkxPQ0sgKngsIEJMT0NLICpiZSwgQkxPQ0tEICpiLCBpbnQgYmVzdF9tb2RlKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9lbmNvZGVtYi5jIGIvdnA4L2VuY29kZXIvZW5jb2RlbWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzZGJjYS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9lbmNvZGVtYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgImVuY29kZW1iLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludGVyLmgiCi0jaW5jbHVkZSAicXVhbnRpemUuaCIKLSNpbmNsdWRlICJ0b2tlbml6ZS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vaW52dHJhbnMuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9yZWNvbmludHJhLmgiCi0jaW5jbHVkZSAiZGN0LmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIElGX1JUQ0QoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBJRl9SVENEKHgpIE5VTEwKLSNlbmRpZgotdm9pZCB2cDhfc3VidHJhY3RfYl9jKEJMT0NLICpiZSwgQkxPQ0tEICpiZCwgaW50IHBpdGNoKQotewotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIgPSAoKihiZS0+YmFzZV9zcmMpICsgYmUtPnNyYyk7Ci0gICAgc2hvcnQgKmRpZmZfcHRyID0gYmUtPnNyY19kaWZmOwotICAgIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyID0gYmQtPnByZWRpY3RvcjsKLSAgICBpbnQgc3JjX3N0cmlkZSA9IGJlLT5zcmNfc3RyaWRlOwotCi0gICAgaW50IHIsIGM7Ci0KLSAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKQotICAgIHsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IDQ7IGMrKykKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZl9wdHJbY10gPSBzcmNfcHRyW2NdIC0gcHJlZF9wdHJbY107Ci0gICAgICAgIH0KLQotICAgICAgICBkaWZmX3B0ciArPSBwaXRjaDsKLSAgICAgICAgcHJlZF9wdHIgKz0gcGl0Y2g7Ci0gICAgICAgIHNyY19wdHIgICs9IHNyY19zdHJpZGU7Ci0gICAgfQotfQotCi12b2lkIHZwOF9zdWJ0cmFjdF9tYnV2X2Moc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnVzcmMsIHVuc2lnbmVkIGNoYXIgKnZzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpCi17Ci0gICAgc2hvcnQgKnVkaWZmID0gZGlmZiArIDI1NjsKLSAgICBzaG9ydCAqdmRpZmYgPSBkaWZmICsgMzIwOwotICAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkID0gcHJlZCArIDI1NjsKLSAgICB1bnNpZ25lZCBjaGFyICp2cHJlZCA9IHByZWQgKyAzMjA7Ci0KLSAgICBpbnQgciwgYzsKLQotICAgIGZvciAociA9IDA7IHIgPCA4OyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgODsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB1ZGlmZltjXSA9IHVzcmNbY10gLSB1cHJlZFtjXTsKLSAgICAgICAgfQotCi0gICAgICAgIHVkaWZmICs9IDg7Ci0gICAgICAgIHVwcmVkICs9IDg7Ci0gICAgICAgIHVzcmMgICs9IHN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHIgPSAwOyByIDwgODsgcisrKQotICAgIHsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IDg7IGMrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmRpZmZbY10gPSB2c3JjW2NdIC0gdnByZWRbY107Ci0gICAgICAgIH0KLQotICAgICAgICB2ZGlmZiArPSA4OwotICAgICAgICB2cHJlZCArPSA4OwotICAgICAgICB2c3JjICArPSBzdHJpZGU7Ci0gICAgfQotfQotCi12b2lkIHZwOF9zdWJ0cmFjdF9tYnlfYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKQotewotICAgIGludCByLCBjOwotCi0gICAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgewotICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMTY7IGMrKykKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZltjXSA9IHNyY1tjXSAtIHByZWRbY107Ci0gICAgICAgIH0KLQotICAgICAgICBkaWZmICs9IDE2OwotICAgICAgICBwcmVkICs9IDE2OwotICAgICAgICBzcmMgICs9IHN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHZwOF9zdWJ0cmFjdF9tYihjb25zdCBWUDhfRU5DT0RFUl9SVENEICpydGNkLCBNQUNST0JMT0NLICp4KQotewotICAgIEVOQ09ERU1CX0lOVk9LRSgmcnRjZC0+ZW5jb2RlbWIsIHN1Ym1ieSkoeC0+c3JjX2RpZmYsIHgtPnNyYy55X2J1ZmZlciwgeC0+ZV9tYmQucHJlZGljdG9yLCB4LT5zcmMueV9zdHJpZGUpOwotICAgIEVOQ09ERU1CX0lOVk9LRSgmcnRjZC0+ZW5jb2RlbWIsIHN1Ym1idXYpKHgtPnNyY19kaWZmLCB4LT5zcmMudV9idWZmZXIsIHgtPnNyYy52X2J1ZmZlciwgeC0+ZV9tYmQucHJlZGljdG9yLCB4LT5zcmMudXZfc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfZGNibG9jayhNQUNST0JMT0NLICp4KQotewotICAgIHNob3J0ICpzcmNfZGlmZl9wdHIgPSAmeC0+c3JjX2RpZmZbMzg0XTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgc3JjX2RpZmZfcHRyW2ldID0geC0+Y29lZmZbaSAqIDE2XTsKLSAgICB9Ci19Ci0KLXZvaWQgdnA4X3RyYW5zZm9ybV9tYnV2KE1BQ1JPQkxPQ0sgKngpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpICs9IDIpCi0gICAgewotICAgICAgICB4LT52cDhfc2hvcnRfZmRjdDh4NCgmeC0+YmxvY2tbaV0uc3JjX2RpZmZbMF0sCi0gICAgICAgICAgICAmeC0+YmxvY2tbaV0uY29lZmZbMF0sIDE2KTsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfdHJhbnNmb3JtX2ludHJhX21ieShNQUNST0JMT0NLICp4KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpCi0gICAgewotICAgICAgICB4LT52cDhfc2hvcnRfZmRjdDh4NCgmeC0+YmxvY2tbaV0uc3JjX2RpZmZbMF0sCi0gICAgICAgICAgICAmeC0+YmxvY2tbaV0uY29lZmZbMF0sIDMyKTsKLSAgICB9Ci0KLSAgICAvLyBidWlsZCBkYyBibG9jayBmcm9tIDE2IHkgZGMgdmFsdWVzCi0gICAgYnVpbGRfZGNibG9jayh4KTsKLQotICAgIC8vIGRvIDJuZCBvcmRlciB0cmFuc2Zvcm0gb24gdGhlIGRjIGJsb2NrCi0gICAgeC0+c2hvcnRfd2Fsc2g0eDQoJngtPmJsb2NrWzI0XS5zcmNfZGlmZlswXSwKLSAgICAgICAgJngtPmJsb2NrWzI0XS5jb2VmZlswXSwgOCk7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCB0cmFuc2Zvcm1fbWIoTUFDUk9CTE9DSyAqeCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAyKQotICAgIHsKLSAgICAgICAgeC0+dnA4X3Nob3J0X2ZkY3Q4eDQoJngtPmJsb2NrW2ldLnNyY19kaWZmWzBdLAotICAgICAgICAgICAgJngtPmJsb2NrW2ldLmNvZWZmWzBdLCAzMik7Ci0gICAgfQotCi0gICAgLy8gYnVpbGQgZGMgYmxvY2sgZnJvbSAxNiB5IGRjIHZhbHVlcwotICAgIGlmICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgICAgIGJ1aWxkX2RjYmxvY2soeCk7Ci0KLSAgICBmb3IgKGkgPSAxNjsgaSA8IDI0OyBpICs9IDIpCi0gICAgewotICAgICAgICB4LT52cDhfc2hvcnRfZmRjdDh4NCgmeC0+YmxvY2tbaV0uc3JjX2RpZmZbMF0sCi0gICAgICAgICAgICAmeC0+YmxvY2tbaV0uY29lZmZbMF0sIDE2KTsKLSAgICB9Ci0KLSAgICAvLyBkbyAybmQgb3JkZXIgdHJhbnNmb3JtIG9uIHRoZSBkYyBibG9jawotICAgIGlmICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgICAgIHgtPnNob3J0X3dhbHNoNHg0KCZ4LT5ibG9ja1syNF0uc3JjX2RpZmZbMF0sCi0gICAgICAgICZ4LT5ibG9ja1syNF0uY29lZmZbMF0sIDgpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgdHJhbnNmb3JtX21ieShNQUNST0JMT0NLICp4KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpCi0gICAgewotICAgICAgICB4LT52cDhfc2hvcnRfZmRjdDh4NCgmeC0+YmxvY2tbaV0uc3JjX2RpZmZbMF0sCi0gICAgICAgICAgICAmeC0+YmxvY2tbaV0uY29lZmZbMF0sIDMyKTsKLSAgICB9Ci0KLSAgICAvLyBidWlsZCBkYyBibG9jayBmcm9tIDE2IHkgZGMgdmFsdWVzCi0gICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKLSAgICB7Ci0gICAgICAgIGJ1aWxkX2RjYmxvY2soeCk7Ci0gICAgICAgIHgtPnNob3J0X3dhbHNoNHg0KCZ4LT5ibG9ja1syNF0uc3JjX2RpZmZbMF0sCi0gICAgICAgICAgICAmeC0+YmxvY2tbMjRdLmNvZWZmWzBdLCA4KTsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfc3R1ZmZfaW50ZXIxNngxNihNQUNST0JMT0NLICp4KQotewotICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iX3MoJngtPmVfbWJkKTsKLSAgICAvKgotICAgICAgICAvLyByZWNvbiA9IGNvcHkgZnJvbSBwcmVkaWN0b3JzIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJMT0NLRCAqYiA9ICZ4LT5lX21iZC5ibG9ja1swXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZWRfcHRyID0gYi0+cHJlZGljdG9yOwotICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0X3B0ciA9ICooYi0+YmFzZV9kc3QpICsgYi0+ZHN0OwotICAgICAgICAgICAgaW50IHN0cmlkZSA9IGItPmRzdF9zdHJpZGU7Ci0KLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgZm9yKGk9MDtpPDE2O2krKykKLSAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KGRzdF9wdHIraSpzdHJpZGUscHJlZF9wdHIrMTYqaSwxNik7Ci0KLSAgICAgICAgICAgIGIgPSAmeC0+ZV9tYmQuYmxvY2tbMTZdOwotICAgICAgICAgICAgcHJlZF9wdHIgPSBiLT5wcmVkaWN0b3I7Ci0gICAgICAgICAgICBkc3RfcHRyID0gKihiLT5iYXNlX2RzdCkgKyBiLT5kc3Q7Ci0gICAgICAgICAgICBzdHJpZGUgPSBiLT5kc3Rfc3RyaWRlOwotCi0gICAgICAgICAgICBmb3IoaT0wO2k8ODtpKyspCi0gICAgICAgICAgICAgICAgdnB4X21lbWNweShkc3RfcHRyK2kqc3RyaWRlLHByZWRfcHRyKzgqaSw4KTsKLQotICAgICAgICAgICAgYiA9ICZ4LT5lX21iZC5ibG9ja1syMF07Ci0gICAgICAgICAgICBwcmVkX3B0ciA9IGItPnByZWRpY3RvcjsKLSAgICAgICAgICAgIGRzdF9wdHIgPSAqKGItPmJhc2VfZHN0KSArIGItPmRzdDsKLSAgICAgICAgICAgIHN0cmlkZSA9IGItPmRzdF9zdHJpZGU7Ci0KLSAgICAgICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KGRzdF9wdHIraSpzdHJpZGUscHJlZF9wdHIrOCppLDgpOwotICAgICAgICB9Ci0gICAgKi8KLX0KLQotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0jZGVmaW5lIFJEQ09TVChSTSxETSxSLEQpICggKCgxMjgrKFIpKihSTSkpID4+IDgpICsgKERNKSooRCkgKQotI2RlZmluZSBSRFRSVU5DKFJNLERNLFIsRCkgKCAoMTI4KyhSKSooUk0pKSAmIDB4RkYgKQotCi10eXBlZGVmIHN0cnVjdCB2cDhfdG9rZW5fc3RhdGUgdnA4X3Rva2VuX3N0YXRlOwotCi1zdHJ1Y3QgdnA4X3Rva2VuX3N0YXRlewotICBpbnQgICAgICAgICAgIHJhdGU7Ci0gIGludCAgICAgICAgICAgZXJyb3I7Ci0gIHNpZ25lZCBjaGFyICAgbmV4dDsKLSAgc2lnbmVkIGNoYXIgICB0b2tlbjsKLSAgc2hvcnQgICAgICAgICBxYzsKLX07Ci0KLS8vIFRPRE86IGV4cGVyaW1lbnRzIHRvIGZpbmQgb3B0aW1hbCBtdWx0aXBsZSBudW1iZXJzCi0jZGVmaW5lIFkxX1JEX01VTFQgNAotI2RlZmluZSBVVl9SRF9NVUxUIDIKLSNkZWZpbmUgWTJfUkRfTVVMVCAxNgotCi1zdGF0aWMgY29uc3QgaW50IHBsYW5lX3JkX211bHRbNF09Ci17Ci0gICAgWTFfUkRfTVVMVCwKLSAgICBZMl9SRF9NVUxULAotICAgIFVWX1JEX01VTFQsCi0gICAgWTFfUkRfTVVMVAotfTsKLQotc3RhdGljIHZvaWQgb3B0aW1pemVfYihNQUNST0JMT0NLICptYiwgaW50IGliLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUICphLCBFTlRST1BZX0NPTlRFWFQgKmwsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QpCi17Ci0gICAgQkxPQ0sgKmI7Ci0gICAgQkxPQ0tEICpkOwotICAgIHZwOF90b2tlbl9zdGF0ZSB0b2tlbnNbMTddWzJdOwotICAgIHVuc2lnbmVkIGJlc3RfbWFza1syXTsKLSAgICBjb25zdCBzaG9ydCAqZGVxdWFudF9wdHI7Ci0gICAgY29uc3Qgc2hvcnQgKmNvZWZmX3B0cjsKLSAgICBzaG9ydCAqcWNvZWZmX3B0cjsKLSAgICBzaG9ydCAqZHFjb2VmZl9wdHI7Ci0gICAgaW50IGVvYjsKLSAgICBpbnQgaTA7Ci0gICAgaW50IHJjOwotICAgIGludCB4OwotICAgIGludCBzejsKLSAgICBpbnQgbmV4dDsKLSAgICBpbnQgcmRtdWx0OwotICAgIGludCByZGRpdjsKLSAgICBpbnQgZmluYWxfZW9iOwotICAgIGludCByZF9jb3N0MDsKLSAgICBpbnQgcmRfY29zdDE7Ci0gICAgaW50IHJhdGUwOwotICAgIGludCByYXRlMTsKLSAgICBpbnQgZXJyb3IwOwotICAgIGludCBlcnJvcjE7Ci0gICAgaW50IHQwOwotICAgIGludCB0MTsKLSAgICBpbnQgYmVzdDsKLSAgICBpbnQgYmFuZDsKLSAgICBpbnQgcHQ7Ci0gICAgaW50IGk7Ci0gICAgaW50IGVycl9tdWx0ID0gcGxhbmVfcmRfbXVsdFt0eXBlXTsKLQotICAgIGIgPSAmbWItPmJsb2NrW2liXTsKLSAgICBkID0gJm1iLT5lX21iZC5ibG9ja1tpYl07Ci0KLSAgICAvKiBFbmFibGUgdGhpcyB0byB0ZXN0IHRoZSBlZmZlY3Qgb2YgUkRPIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkeW5hbWljCi0gICAgICogIHplcm8gYmluIGluc3RlYWQgb2YgYW4gYXVnbWVudGF0aW9uIG9mIGl0LgotICAgICAqLwotI2lmIDAKLSAgICB2cDhfc3RyaWN0X3F1YW50aXplX2IoYiwgZCk7Ci0jZW5kaWYKLQotICAgIGRlcXVhbnRfcHRyID0gZC0+ZGVxdWFudDsKLSAgICBjb2VmZl9wdHIgPSBiLT5jb2VmZjsKLSAgICBxY29lZmZfcHRyID0gZC0+cWNvZWZmOwotICAgIGRxY29lZmZfcHRyID0gZC0+ZHFjb2VmZjsKLSAgICBpMCA9ICF0eXBlOwotICAgIGVvYiA9IGQtPmVvYjsKLQotICAgIC8qIE5vdyBzZXQgdXAgYSBWaXRlcmJpIHRyZWxsaXMgdG8gZXZhbHVhdGUgYWx0ZXJuYXRpdmUgcm91bmRpbmdzLiAqLwotICAgIHJkbXVsdCA9IG1iLT5yZG11bHQgKiBlcnJfbXVsdDsKLSAgICBpZihtYi0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lPT1JTlRSQV9GUkFNRSkKLSAgICAgICAgcmRtdWx0ID0gKHJkbXVsdCAqIDkpPj40OwotCi0gICAgcmRkaXYgPSBtYi0+cmRkaXY7Ci0gICAgYmVzdF9tYXNrWzBdID0gYmVzdF9tYXNrWzFdID0gMDsKLSAgICAvKiBJbml0aWFsaXplIHRoZSBzZW50aW5lbCBub2RlIG9mIHRoZSB0cmVsbGlzLiAqLwotICAgIHRva2Vuc1tlb2JdWzBdLnJhdGUgPSAwOwotICAgIHRva2Vuc1tlb2JdWzBdLmVycm9yID0gMDsKLSAgICB0b2tlbnNbZW9iXVswXS5uZXh0ID0gMTY7Ci0gICAgdG9rZW5zW2VvYl1bMF0udG9rZW4gPSBEQ1RfRU9CX1RPS0VOOwotICAgIHRva2Vuc1tlb2JdWzBdLnFjID0gMDsKLSAgICAqKHRva2Vuc1tlb2JdICsgMSkgPSAqKHRva2Vuc1tlb2JdICsgMCk7Ci0gICAgbmV4dCA9IGVvYjsKLSAgICBmb3IgKGkgPSBlb2I7IGktLSA+IGkwOykKLSAgICB7Ci0gICAgICAgIGludCBiYXNlX2JpdHM7Ci0gICAgICAgIGludCBkMjsKLSAgICAgICAgaW50IGR4OwotCi0gICAgICAgIHJjID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOwotICAgICAgICB4ID0gcWNvZWZmX3B0cltyY107Ci0gICAgICAgIC8qIE9ubHkgYWRkIGEgdHJlbGxpcyBzdGF0ZSBmb3Igbm9uLXplcm8gY29lZmZpY2llbnRzLiAqLwotICAgICAgICBpZiAoeCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNob3J0Y3V0PTA7Ci0gICAgICAgICAgICBlcnJvcjAgPSB0b2tlbnNbbmV4dF1bMF0uZXJyb3I7Ci0gICAgICAgICAgICBlcnJvcjEgPSB0b2tlbnNbbmV4dF1bMV0uZXJyb3I7Ci0gICAgICAgICAgICAvKiBFdmFsdWF0ZSB0aGUgZmlyc3QgcG9zc2liaWxpdHkgZm9yIHRoaXMgc3RhdGUuICovCi0gICAgICAgICAgICByYXRlMCA9IHRva2Vuc1tuZXh0XVswXS5yYXRlOwotICAgICAgICAgICAgcmF0ZTEgPSB0b2tlbnNbbmV4dF1bMV0ucmF0ZTsKLSAgICAgICAgICAgIHQwID0gKHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0ciArIHgpLT5Ub2tlbjsKLSAgICAgICAgICAgIC8qIENvbnNpZGVyIGJvdGggcG9zc2libGUgc3VjY2Vzc29yIHN0YXRlcy4gKi8KLSAgICAgICAgICAgIGlmIChuZXh0IDwgMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFuZCA9IHZwOF9jb2VmX2JhbmRzW2kgKyAxXTsKLSAgICAgICAgICAgICAgICBwdCA9IHZwOF9wcmV2X3Rva2VuX2NsYXNzW3QwXTsKLSAgICAgICAgICAgICAgICByYXRlMCArPQotICAgICAgICAgICAgICAgICAgICBtYi0+dG9rZW5fY29zdHNbdHlwZV1bYmFuZF1bcHRdW3Rva2Vuc1tuZXh0XVswXS50b2tlbl07Ci0gICAgICAgICAgICAgICAgcmF0ZTEgKz0KLSAgICAgICAgICAgICAgICAgICAgbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdW3B0XVt0b2tlbnNbbmV4dF1bMV0udG9rZW5dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmRfY29zdDAgPSBSRENPU1QocmRtdWx0LCByZGRpdiwgcmF0ZTAsIGVycm9yMCk7Ci0gICAgICAgICAgICByZF9jb3N0MSA9IFJEQ09TVChyZG11bHQsIHJkZGl2LCByYXRlMSwgZXJyb3IxKTsKLSAgICAgICAgICAgIGlmIChyZF9jb3N0MCA9PSByZF9jb3N0MSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZF9jb3N0MCA9IFJEVFJVTkMocmRtdWx0LCByZGRpdiwgcmF0ZTAsIGVycm9yMCk7Ci0gICAgICAgICAgICAgICAgcmRfY29zdDEgPSBSRFRSVU5DKHJkbXVsdCwgcmRkaXYsIHJhdGUxLCBlcnJvcjEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQW5kIHBpY2sgdGhlIGJlc3QuICovCi0gICAgICAgICAgICBiZXN0ID0gcmRfY29zdDEgPCByZF9jb3N0MDsKLSAgICAgICAgICAgIGJhc2VfYml0cyA9ICoodnA4X2RjdF92YWx1ZV9jb3N0X3B0ciArIHgpOwotICAgICAgICAgICAgZHggPSBkcWNvZWZmX3B0cltyY10gLSBjb2VmZl9wdHJbcmNdOwotICAgICAgICAgICAgZDIgPSBkeCpkeDsKLSAgICAgICAgICAgIHRva2Vuc1tpXVswXS5yYXRlID0gYmFzZV9iaXRzICsgKGJlc3QgPyByYXRlMSA6IHJhdGUwKTsKLSAgICAgICAgICAgIHRva2Vuc1tpXVswXS5lcnJvciA9IGQyICsgKGJlc3QgPyBlcnJvcjEgOiBlcnJvcjApOwotICAgICAgICAgICAgdG9rZW5zW2ldWzBdLm5leHQgPSBuZXh0OwotICAgICAgICAgICAgdG9rZW5zW2ldWzBdLnRva2VuID0gdDA7Ci0gICAgICAgICAgICB0b2tlbnNbaV1bMF0ucWMgPSB4OwotICAgICAgICAgICAgYmVzdF9tYXNrWzBdIHw9IGJlc3QgPDwgaTsKLSAgICAgICAgICAgIC8qIEV2YWx1YXRlIHRoZSBzZWNvbmQgcG9zc2liaWxpdHkgZm9yIHRoaXMgc3RhdGUuICovCi0gICAgICAgICAgICByYXRlMCA9IHRva2Vuc1tuZXh0XVswXS5yYXRlOwotICAgICAgICAgICAgcmF0ZTEgPSB0b2tlbnNbbmV4dF1bMV0ucmF0ZTsKLQotICAgICAgICAgICAgaWYoKGFicyh4KSpkZXF1YW50X3B0cltyY10+YWJzKGNvZWZmX3B0cltyY10pKSAmJgotICAgICAgICAgICAgICAgKGFicyh4KSpkZXF1YW50X3B0cltyY108YWJzKGNvZWZmX3B0cltyY10pK2RlcXVhbnRfcHRyW3JjXSkpCi0gICAgICAgICAgICAgICAgc2hvcnRjdXQgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNob3J0Y3V0ID0gMDsKLQotICAgICAgICAgICAgaWYoc2hvcnRjdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3ogPSAtKHggPCAwKTsKLSAgICAgICAgICAgICAgICB4IC09IDIqc3ogKyAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDb25zaWRlciBib3RoIHBvc3NpYmxlIHN1Y2Nlc3NvciBzdGF0ZXMuICovCi0gICAgICAgICAgICBpZiAoIXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2UgcmVkdWNlZCB0aGlzIGNvZWZmaWNpZW50IHRvIHplcm8sIGNoZWNrIHRvIHNlZSBpZgotICAgICAgICAgICAgICAgICAqICB3ZSBuZWVkIHRvIG1vdmUgdGhlIEVPQiBiYWNrIGhlcmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdDAgPSB0b2tlbnNbbmV4dF1bMF0udG9rZW4gPT0gRENUX0VPQl9UT0tFTiA/Ci0gICAgICAgICAgICAgICAgICAgIERDVF9FT0JfVE9LRU4gOiBaRVJPX1RPS0VOOwotICAgICAgICAgICAgICAgIHQxID0gdG9rZW5zW25leHRdWzFdLnRva2VuID09IERDVF9FT0JfVE9LRU4gPwotICAgICAgICAgICAgICAgICAgICBEQ1RfRU9CX1RPS0VOIDogWkVST19UT0tFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0MD10MSA9ICh2cDhfZGN0X3ZhbHVlX3Rva2Vuc19wdHIgKyB4KS0+VG9rZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV4dCA8IDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhbmQgPSB2cDhfY29lZl9iYW5kc1tpICsgMV07Ci0gICAgICAgICAgICAgICAgaWYodDAhPURDVF9FT0JfVE9LRU4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdCA9IHZwOF9wcmV2X3Rva2VuX2NsYXNzW3QwXTsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZTAgKz0gbWItPnRva2VuX2Nvc3RzW3R5cGVdW2JhbmRdW3B0XVsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vuc1tuZXh0XVswXS50b2tlbl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHQxIT1EQ1RfRU9CX1RPS0VOKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHQgPSB2cDhfcHJldl90b2tlbl9jbGFzc1t0MV07Ci0gICAgICAgICAgICAgICAgICAgIHJhdGUxICs9IG1iLT50b2tlbl9jb3N0c1t0eXBlXVtiYW5kXVtwdF1bCi0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnNbbmV4dF1bMV0udG9rZW5dOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmRfY29zdDAgPSBSRENPU1QocmRtdWx0LCByZGRpdiwgcmF0ZTAsIGVycm9yMCk7Ci0gICAgICAgICAgICByZF9jb3N0MSA9IFJEQ09TVChyZG11bHQsIHJkZGl2LCByYXRlMSwgZXJyb3IxKTsKLSAgICAgICAgICAgIGlmIChyZF9jb3N0MCA9PSByZF9jb3N0MSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZF9jb3N0MCA9IFJEVFJVTkMocmRtdWx0LCByZGRpdiwgcmF0ZTAsIGVycm9yMCk7Ci0gICAgICAgICAgICAgICAgcmRfY29zdDEgPSBSRFRSVU5DKHJkbXVsdCwgcmRkaXYsIHJhdGUxLCBlcnJvcjEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQW5kIHBpY2sgdGhlIGJlc3QuICovCi0gICAgICAgICAgICBiZXN0ID0gcmRfY29zdDEgPCByZF9jb3N0MDsKLSAgICAgICAgICAgIGJhc2VfYml0cyA9ICoodnA4X2RjdF92YWx1ZV9jb3N0X3B0ciArIHgpOwotCi0gICAgICAgICAgICBpZihzaG9ydGN1dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkeCAtPSAoZGVxdWFudF9wdHJbcmNdICsgc3opIF4gc3o7Ci0gICAgICAgICAgICAgICAgZDIgPSBkeCpkeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRva2Vuc1tpXVsxXS5yYXRlID0gYmFzZV9iaXRzICsgKGJlc3QgPyByYXRlMSA6IHJhdGUwKTsKLSAgICAgICAgICAgIHRva2Vuc1tpXVsxXS5lcnJvciA9IGQyICsgKGJlc3QgPyBlcnJvcjEgOiBlcnJvcjApOwotICAgICAgICAgICAgdG9rZW5zW2ldWzFdLm5leHQgPSBuZXh0OwotICAgICAgICAgICAgdG9rZW5zW2ldWzFdLnRva2VuID1iZXN0P3QxOnQwOwotICAgICAgICAgICAgdG9rZW5zW2ldWzFdLnFjID0geDsKLSAgICAgICAgICAgIGJlc3RfbWFza1sxXSB8PSBiZXN0IDw8IGk7Ci0gICAgICAgICAgICAvKiBGaW5hbGx5LCBtYWtlIHRoaXMgdGhlIG5ldyBoZWFkIG9mIHRoZSB0cmVsbGlzLiAqLwotICAgICAgICAgICAgbmV4dCA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVGhlcmUncyBubyBjaG9pY2UgdG8gbWFrZSBmb3IgYSB6ZXJvIGNvZWZmaWNpZW50LCBzbyB3ZSBkb24ndAotICAgICAgICAgKiAgYWRkIGEgbmV3IHRyZWxsaXMgbm9kZSwgYnV0IHdlIGRvIG5lZWQgdG8gdXBkYXRlIHRoZSBjb3N0cy4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYmFuZCA9IHZwOF9jb2VmX2JhbmRzW2kgKyAxXTsKLSAgICAgICAgICAgIHQwID0gdG9rZW5zW25leHRdWzBdLnRva2VuOwotICAgICAgICAgICAgdDEgPSB0b2tlbnNbbmV4dF1bMV0udG9rZW47Ci0gICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGNvc3Qgb2YgZWFjaCBwYXRoIGlmIHdlJ3JlIHBhc3QgdGhlIEVPQiB0b2tlbi4gKi8KLSAgICAgICAgICAgIGlmICh0MCAhPSBEQ1RfRU9CX1RPS0VOKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRva2Vuc1tuZXh0XVswXS5yYXRlICs9IG1iLT50b2tlbl9jb3N0c1t0eXBlXVtiYW5kXVswXVt0MF07Ci0gICAgICAgICAgICAgICAgdG9rZW5zW25leHRdWzBdLnRva2VuID0gWkVST19UT0tFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0MSAhPSBEQ1RfRU9CX1RPS0VOKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRva2Vuc1tuZXh0XVsxXS5yYXRlICs9IG1iLT50b2tlbl9jb3N0c1t0eXBlXVtiYW5kXVswXVt0MV07Ci0gICAgICAgICAgICAgICAgdG9rZW5zW25leHRdWzFdLnRva2VuID0gWkVST19UT0tFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIERvbid0IHVwZGF0ZSBuZXh0LCBiZWNhdXNlIHdlIGRpZG4ndCBhZGQgYSBuZXcgbm9kZS4gKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIE5vdyBwaWNrIHRoZSBiZXN0IHBhdGggdGhyb3VnaCB0aGUgd2hvbGUgdHJlbGxpcy4gKi8KLSAgICBiYW5kID0gdnA4X2NvZWZfYmFuZHNbaSArIDFdOwotICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOwotICAgIHJhdGUwID0gdG9rZW5zW25leHRdWzBdLnJhdGU7Ci0gICAgcmF0ZTEgPSB0b2tlbnNbbmV4dF1bMV0ucmF0ZTsKLSAgICBlcnJvcjAgPSB0b2tlbnNbbmV4dF1bMF0uZXJyb3I7Ci0gICAgZXJyb3IxID0gdG9rZW5zW25leHRdWzFdLmVycm9yOwotICAgIHQwID0gdG9rZW5zW25leHRdWzBdLnRva2VuOwotICAgIHQxID0gdG9rZW5zW25leHRdWzFdLnRva2VuOwotICAgIHJhdGUwICs9IG1iLT50b2tlbl9jb3N0c1t0eXBlXVtiYW5kXVtwdF1bdDBdOwotICAgIHJhdGUxICs9IG1iLT50b2tlbl9jb3N0c1t0eXBlXVtiYW5kXVtwdF1bdDFdOwotICAgIHJkX2Nvc3QwID0gUkRDT1NUKHJkbXVsdCwgcmRkaXYsIHJhdGUwLCBlcnJvcjApOwotICAgIHJkX2Nvc3QxID0gUkRDT1NUKHJkbXVsdCwgcmRkaXYsIHJhdGUxLCBlcnJvcjEpOwotICAgIGlmIChyZF9jb3N0MCA9PSByZF9jb3N0MSkKLSAgICB7Ci0gICAgICAgIHJkX2Nvc3QwID0gUkRUUlVOQyhyZG11bHQsIHJkZGl2LCByYXRlMCwgZXJyb3IwKTsKLSAgICAgICAgcmRfY29zdDEgPSBSRFRSVU5DKHJkbXVsdCwgcmRkaXYsIHJhdGUxLCBlcnJvcjEpOwotICAgIH0KLSAgICBiZXN0ID0gcmRfY29zdDEgPCByZF9jb3N0MDsKLSAgICBmaW5hbF9lb2IgPSBpMCAtIDE7Ci0gICAgZm9yIChpID0gbmV4dDsgaSA8IGVvYjsgaSA9IG5leHQpCi0gICAgewotICAgICAgICB4ID0gdG9rZW5zW2ldW2Jlc3RdLnFjOwotICAgICAgICBpZiAoeCkKLSAgICAgICAgICAgIGZpbmFsX2VvYiA9IGk7Ci0gICAgICAgIHJjID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOwotICAgICAgICBxY29lZmZfcHRyW3JjXSA9IHg7Ci0gICAgICAgIGRxY29lZmZfcHRyW3JjXSA9IHggKiBkZXF1YW50X3B0cltyY107Ci0gICAgICAgIG5leHQgPSB0b2tlbnNbaV1bYmVzdF0ubmV4dDsKLSAgICAgICAgYmVzdCA9IChiZXN0X21hc2tbYmVzdF0gPj4gaSkgJiAxOwotICAgIH0KLSAgICBmaW5hbF9lb2IrKzsKLQotICAgIGQtPmVvYiA9IGZpbmFsX2VvYjsKLSAgICAqYSA9ICpsID0gKGQtPmVvYiAhPSAhdHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wdGltaXplX21iKE1BQ1JPQkxPQ0sgKngsIGNvbnN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QpCi17Ci0gICAgaW50IGI7Ci0gICAgaW50IHR5cGU7Ci0gICAgaW50IGhhc18ybmRfb3JkZXI7Ci0gICAgRU5UUk9QWV9DT05URVhUX1BMQU5FUyB0X2Fib3ZlLCB0X2xlZnQ7Ci0gICAgRU5UUk9QWV9DT05URVhUICp0YTsKLSAgICBFTlRST1BZX0NPTlRFWFQgKnRsOwotCi0gICAgdnB4X21lbWNweSgmdF9hYm92ZSwgeC0+ZV9tYmQuYWJvdmVfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLSAgICB2cHhfbWVtY3B5KCZ0X2xlZnQsIHgtPmVfbWJkLmxlZnRfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLQotICAgIHRhID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2Fib3ZlOwotICAgIHRsID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnQ7Ci0KLSAgICBoYXNfMm5kX29yZGVyID0gKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVECi0gICAgICAgICYmIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVik7Ci0gICAgdHlwZSA9IGhhc18ybmRfb3JkZXIgPyBQTEFORV9UWVBFX1lfTk9fREMgOiBQTEFORV9UWVBFX1lfV0lUSF9EQzsKLQotICAgIGZvciAoYiA9IDA7IGIgPCAxNjsgYisrKQotICAgIHsKLSAgICAgICAgb3B0aW1pemVfYih4LCBiLCB0eXBlLAotICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0sIHJ0Y2QpOwotICAgIH0KLQotICAgIGZvciAoYiA9IDE2OyBiIDwgMjQ7IGIrKykKLSAgICB7Ci0gICAgICAgIG9wdGltaXplX2IoeCwgYiwgUExBTkVfVFlQRV9VViwKLSAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdLCBydGNkKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzXzJuZF9vcmRlcikKLSAgICB7Ci0gICAgICAgIGI9MjQ7Ci0gICAgICAgIG9wdGltaXplX2IoeCwgYiwgUExBTkVfVFlQRV9ZMiwKLSAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdLCBydGNkKTsKLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfb3B0aW1pemVfbWJ5KE1BQ1JPQkxPQ0sgKngsIGNvbnN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QpCi17Ci0gICAgaW50IGI7Ci0gICAgaW50IHR5cGU7Ci0gICAgaW50IGhhc18ybmRfb3JkZXI7Ci0KLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmUsIHRfbGVmdDsKLSAgICBFTlRST1BZX0NPTlRFWFQgKnRhOwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGw7Ci0KLSAgICBpZiAoIXgtPmVfbWJkLmFib3ZlX2NvbnRleHQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgheC0+ZV9tYmQubGVmdF9jb250ZXh0KQotICAgICAgICByZXR1cm47Ci0KLSAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlLCB4LT5lX21iZC5hYm92ZV9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOwotICAgIHZweF9tZW1jcHkoJnRfbGVmdCwgeC0+ZV9tYmQubGVmdF9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOwotCi0gICAgdGEgPSAoRU5UUk9QWV9DT05URVhUICopJnRfYWJvdmU7Ci0gICAgdGwgPSAoRU5UUk9QWV9DT05URVhUICopJnRfbGVmdDsKLQotICAgIGhhc18ybmRfb3JkZXIgPSAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQKLSAgICAgICAgJiYgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKTsKLSAgICB0eXBlID0gaGFzXzJuZF9vcmRlciA/IFBMQU5FX1RZUEVfWV9OT19EQyA6IFBMQU5FX1RZUEVfWV9XSVRIX0RDOwotCi0gICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCi0gICAgewotICAgICAgICBvcHRpbWl6ZV9iKHgsIGIsIHR5cGUsCi0gICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdLCBydGNkKTsKLSAgICB9Ci0KLQotICAgIGlmIChoYXNfMm5kX29yZGVyKQotICAgIHsKLSAgICAgICAgYj0yNDsKLSAgICAgICAgb3B0aW1pemVfYih4LCBiLCBQTEFORV9UWVBFX1kyLAotICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0sIHJ0Y2QpOwotICAgIH0KLX0KLQotdm9pZCB2cDhfb3B0aW1pemVfbWJ1dihNQUNST0JMT0NLICp4LCBjb25zdCBWUDhfRU5DT0RFUl9SVENEICpydGNkKQotewotICAgIGludCBiOwotICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgdF9hYm92ZSwgdF9sZWZ0OwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGE7Ci0gICAgRU5UUk9QWV9DT05URVhUICp0bDsKLQotICAgIGlmICgheC0+ZV9tYmQuYWJvdmVfY29udGV4dCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCF4LT5lX21iZC5sZWZ0X2NvbnRleHQpCi0gICAgICAgIHJldHVybjsKLQotICAgIHZweF9tZW1jcHkoJnRfYWJvdmUsIHgtPmVfbWJkLmFib3ZlX2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0gICAgdnB4X21lbWNweSgmdF9sZWZ0LCB4LT5lX21iZC5sZWZ0X2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0KLSAgICB0YSA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZTsKLSAgICB0bCA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9sZWZ0OwotCi0gICAgZm9yIChiID0gMTY7IGIgPCAyNDsgYisrKQotICAgIHsKLSAgICAgICAgb3B0aW1pemVfYih4LCBiLCBQTEFORV9UWVBFX1VWLAotICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0sIHJ0Y2QpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIHZwOF9lbmNvZGVfaW50ZXIxNngxNihjb25zdCBWUDhfRU5DT0RFUl9SVENEICpydGNkLCBNQUNST0JMT0NLICp4KQotewotICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21iKCZ4LT5lX21iZCk7Ci0KLSAgICB2cDhfc3VidHJhY3RfbWIocnRjZCwgeCk7Ci0KLSAgICB0cmFuc2Zvcm1fbWIoeCk7Ci0KLSAgICB2cDhfcXVhbnRpemVfbWIoeCk7Ci0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotICAgIGlmICh4LT5vcHRpbWl6ZSkKLSAgICAgICAgb3B0aW1pemVfbWIoeCwgcnRjZCk7Ci0jZW5kaWYKLQotICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYihJRl9SVENEKCZydGNkLT5jb21tb24tPmlkY3QpLCAmeC0+ZV9tYmQpOwotCi0gICAgUkVDT05fSU5WT0tFKCZydGNkLT5jb21tb24tPnJlY29uLCByZWNvbl9tYikKLSAgICAgICAgKElGX1JUQ0QoJnJ0Y2QtPmNvbW1vbi0+cmVjb24pLCAmeC0+ZV9tYmQpOwotfQotCi0KLS8qIHRoaXMgZnVuY2l0b24gaXMgdXNlZCBieSBmaXJzdCBwYXNzIG9ubHkgKi8KLXZvaWQgdnA4X2VuY29kZV9pbnRlcjE2eDE2eShjb25zdCBWUDhfRU5DT0RFUl9SVENEICpydGNkLCBNQUNST0JMT0NLICp4KQotewotICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21ieSgmeC0+ZV9tYmQpOwotCi0gICAgRU5DT0RFTUJfSU5WT0tFKCZydGNkLT5lbmNvZGVtYiwgc3VibWJ5KSh4LT5zcmNfZGlmZiwgeC0+c3JjLnlfYnVmZmVyLCB4LT5lX21iZC5wcmVkaWN0b3IsIHgtPnNyYy55X3N0cmlkZSk7Ci0KLSAgICB0cmFuc2Zvcm1fbWJ5KHgpOwotCi0gICAgdnA4X3F1YW50aXplX21ieSh4KTsKLQotICAgIHZwOF9pbnZlcnNlX3RyYW5zZm9ybV9tYnkoSUZfUlRDRCgmcnRjZC0+Y29tbW9uLT5pZGN0KSwgJngtPmVfbWJkKTsKLQotICAgIFJFQ09OX0lOVk9LRSgmcnRjZC0+Y29tbW9uLT5yZWNvbiwgcmVjb25fbWJ5KQotICAgICAgICAoSUZfUlRDRCgmcnRjZC0+Y29tbW9uLT5yZWNvbiksICZ4LT5lX21iZCk7Ci19Ci0KLQotdm9pZCB2cDhfZW5jb2RlX2ludGVyMTZ4MTZ1dnJkKGNvbnN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QsIE1BQ1JPQkxPQ0sgKngpCi17Ci0gICAgdnA4X2J1aWxkX2ludGVyX3ByZWRpY3RvcnNfbWJ1digmeC0+ZV9tYmQpOwotICAgIEVOQ09ERU1CX0lOVk9LRSgmcnRjZC0+ZW5jb2RlbWIsIHN1Ym1idXYpKHgtPnNyY19kaWZmLCB4LT5zcmMudV9idWZmZXIsIHgtPnNyYy52X2J1ZmZlciwgeC0+ZV9tYmQucHJlZGljdG9yLCB4LT5zcmMudXZfc3RyaWRlKTsKLQotICAgIHZwOF90cmFuc2Zvcm1fbWJ1dih4KTsKLQotICAgIHZwOF9xdWFudGl6ZV9tYnV2KHgpOwotCi19CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9lbmNvZGVtYi5oIGIvdnA4L2VuY29kZXIvZW5jb2RlbWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5M2FhMS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9lbmNvZGVtYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX0VOQ09ERU1CX0gKLSNkZWZpbmUgX19JTkNfRU5DT0RFTUJfSAotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgImJsb2NrLmgiCi0KLSNkZWZpbmUgcHJvdG90eXBlX21iZXJyKHN5bSkgXAotICAgIGludCAoc3ltKShNQUNST0JMT0NLICptYiwgaW50IGRjKQotCi0jZGVmaW5lIHByb3RvdHlwZV9iZXJyKHN5bSkgXAotICAgIGludCAoc3ltKShzaG9ydCAqY29lZmYsIHNob3J0ICpkcWNvZWZmKQotCi0jZGVmaW5lIHByb3RvdHlwZV9tYnV2ZXJyKHN5bSkgXAotICAgIGludCAoc3ltKShNQUNST0JMT0NLICptYikKLQotI2RlZmluZSBwcm90b3R5cGVfc3ViYihzeW0pIFwKLSAgICB2b2lkIChzeW0pKEJMT0NLICpiZSxCTE9DS0QgKmJkLCBpbnQgcGl0Y2gpCi0KLSNkZWZpbmUgcHJvdG90eXBlX3N1Ym1ieShzeW0pIFwKLSAgICB2b2lkIChzeW0pKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpCi0KLSNkZWZpbmUgcHJvdG90eXBlX3N1Ym1idXYoc3ltKSBcCi0gICAgdm9pZCAoc3ltKShzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqdXNyYywgdW5zaWduZWQgY2hhciAqdnNyYyxcCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvZW5jb2RlbWJfeDg2LmgiCi0jZW5kaWYKLQotI2lmIEFSQ0hfQVJNCi0jaW5jbHVkZSAiYXJtL2VuY29kZW1iX2FybS5oIgotI2VuZGlmCi0KLSNpZm5kZWYgdnA4X2VuY29kZW1iX2JlcnIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX2JlcnIgdnA4X2Jsb2NrX2Vycm9yX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9iZXJyKHZwOF9lbmNvZGVtYl9iZXJyKTsKLQotI2lmbmRlZiB2cDhfZW5jb2RlbWJfbWJlcnIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX21iZXJyIHZwOF9tYmJsb2NrX2Vycm9yX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9tYmVycih2cDhfZW5jb2RlbWJfbWJlcnIpOwotCi0jaWZuZGVmIHZwOF9lbmNvZGVtYl9tYnV2ZXJyCi0jZGVmaW5lIHZwOF9lbmNvZGVtYl9tYnV2ZXJyIHZwOF9tYnV2ZXJyb3JfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX21idXZlcnIodnA4X2VuY29kZW1iX21idXZlcnIpOwotCi0jaWZuZGVmIHZwOF9lbmNvZGVtYl9zdWJiCi0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJiIHZwOF9zdWJ0cmFjdF9iX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJiKHZwOF9lbmNvZGVtYl9zdWJiKTsKLQotI2lmbmRlZiB2cDhfZW5jb2RlbWJfc3VibWJ5Ci0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJtYnkgdnA4X3N1YnRyYWN0X21ieV9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc3VibWJ5KHZwOF9lbmNvZGVtYl9zdWJtYnkpOwotCi0jaWZuZGVmIHZwOF9lbmNvZGVtYl9zdWJtYnV2Ci0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJtYnV2IHZwOF9zdWJ0cmFjdF9tYnV2X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJtYnV2KHZwOF9lbmNvZGVtYl9zdWJtYnV2KTsKLQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHByb3RvdHlwZV9iZXJyKCpiZXJyKTsKLSAgICBwcm90b3R5cGVfbWJlcnIoKm1iZXJyKTsKLSAgICBwcm90b3R5cGVfbWJ1dmVycigqbWJ1dmVycik7Ci0gICAgcHJvdG90eXBlX3N1YmIoKnN1YmIpOwotICAgIHByb3RvdHlwZV9zdWJtYnkoKnN1Ym1ieSk7Ci0gICAgcHJvdG90eXBlX3N1Ym1idXYoKnN1Ym1idXYpOwotfSB2cDhfZW5jb2RlbWJfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgRU5DT0RFTUJfSU5WT0tFKGN0eCxmbikgKGN0eCktPmZuCi0jZWxzZQotI2RlZmluZSBFTkNPREVNQl9JTlZPS0UoY3R4LGZuKSB2cDhfZW5jb2RlbWJfIyNmbgotI2VuZGlmCi0KLQotCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLXN0cnVjdCBWUDhfRU5DT0RFUl9SVENEOwotdm9pZCB2cDhfZW5jb2RlX2ludGVyMTZ4MTYoY29uc3Qgc3RydWN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QsIE1BQ1JPQkxPQ0sgKngpOwotCi1leHRlcm4gdm9pZCB2cDhfc3R1ZmZfaW50ZXIxNngxNihNQUNST0JMT0NLICp4KTsKLQotdm9pZCB2cDhfYnVpbGRfZGNibG9jayhNQUNST0JMT0NLICpiKTsKLXZvaWQgdnA4X3RyYW5zZm9ybV9tYihNQUNST0JMT0NLICptYik7Ci12b2lkIHZwOF90cmFuc2Zvcm1fbWJ1dihNQUNST0JMT0NLICp4KTsKLXZvaWQgdnA4X3RyYW5zZm9ybV9pbnRyYV9tYnkoTUFDUk9CTE9DSyAqeCk7Ci12b2lkIHZwOF9lbmNvZGVfaW50ZXIxNngxNnV2cmQoY29uc3Qgc3RydWN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QsIE1BQ1JPQkxPQ0sgKngpOwotdm9pZCB2cDhfb3B0aW1pemVfbWJ5KE1BQ1JPQkxPQ0sgKngsIGNvbnN0IHN0cnVjdCBWUDhfRU5DT0RFUl9SVENEICpydGNkKTsKLXZvaWQgdnA4X29wdGltaXplX21idXYoTUFDUk9CTE9DSyAqeCwgY29uc3Qgc3RydWN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QpOwotdm9pZCB2cDhfZW5jb2RlX2ludGVyMTZ4MTZ5KGNvbnN0IHN0cnVjdCBWUDhfRU5DT0RFUl9SVENEICpydGNkLCBNQUNST0JMT0NLICp4KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvZW5jb2RlbXYuYyBiL3ZwOC9lbmNvZGVyL2VuY29kZW12LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMWU2ZjkuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvZW5jb2RlbXYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9jb21tb24vY29tbW9uLmgiCi0jaW5jbHVkZSAiZW5jb2RlbXYuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLWV4dGVybiB1bnNpZ25lZCBpbnQgYWN0aXZlX3NlY3Rpb247Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgZW5jb2RlX212Y29tcG9uZW50KAotICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCi0gICAgY29uc3QgaW50IHYsCi0gICAgY29uc3Qgc3RydWN0IG12X2NvbnRleHQgKm12YwotKQotewotICAgIGNvbnN0IHZwOF9wcm9iICpwID0gbXZjLT5wcm9iOwotICAgIGNvbnN0IGludCB4ID0gdiA8IDAgPyAtdiA6IHY7Ci0KLSAgICBpZiAoeCA8IG12bnVtX3Nob3J0KSAgICAgLy8gU21hbGwKLSAgICB7Ci0gICAgICAgIHZwOF93cml0ZSh3LCAwLCBwIFttdnBpc19zaG9ydF0pOwotICAgICAgICB2cDhfdHJlZWRfd3JpdGUodywgdnA4X3NtYWxsX212dHJlZSwgcCArIE1WUHNob3J0LCB4LCAzKTsKLQotICAgICAgICBpZiAoIXgpCi0gICAgICAgICAgICByZXR1cm47ICAgICAgICAgLy8gbm8gc2lnbiBiaXQKLSAgICB9Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLy8gTGFyZ2UKLSAgICB7Ci0gICAgICAgIGludCBpID0gMDsKLQotICAgICAgICB2cDhfd3JpdGUodywgMSwgcCBbbXZwaXNfc2hvcnRdKTsKLQotICAgICAgICBkbwotICAgICAgICAgICAgdnA4X3dyaXRlKHcsICh4ID4+IGkpICYgMSwgcCBbTVZQYml0cyArIGldKTsKLQotICAgICAgICB3aGlsZSAoKytpIDwgMyk7Ci0KLSAgICAgICAgaSA9IG12bG9uZ193aWR0aCAtIDE7ICAvKiBTa2lwIGJpdCAzLCB3aGljaCBpcyBzb21ldGltZXMgaW1wbGljaXQgKi8KLQotICAgICAgICBkbwotICAgICAgICAgICAgdnA4X3dyaXRlKHcsICh4ID4+IGkpICYgMSwgcCBbTVZQYml0cyArIGldKTsKLQotICAgICAgICB3aGlsZSAoLS1pID4gMyk7Ci0KLSAgICAgICAgaWYgKHggJiAweEZGRjApCi0gICAgICAgICAgICB2cDhfd3JpdGUodywgKHggPj4gMykgJiAxLCBwIFtNVlBiaXRzICsgM10pOwotICAgIH0KLQotICAgIHZwOF93cml0ZSh3LCB2IDwgMCwgcCBbTVZQc2lnbl0pOwotfQotI2lmIDAKLXN0YXRpYyBpbnQgbWF4X212X3IgPSAwOwotc3RhdGljIGludCBtYXhfbXZfYyA9IDA7Ci0jZW5kaWYKLXZvaWQgdnA4X2VuY29kZV9tb3Rpb25fdmVjdG9yKHZwOF93cml0ZXIgKncsIGNvbnN0IE1WICptdiwgY29uc3QgTVZfQ09OVEVYVCAqbXZjKQotewotCi0jaWYgMAotICAgIHsKLSAgICAgICAgaWYgKGFicyhtdi0+cm93ID4+IDEpID4gbWF4X212X3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigibWF4bXYuc3R0IiwgImEiKTsKLSAgICAgICAgICAgIG1heF9tdl9yID0gYWJzKG12LT5yb3cgPj4gMSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJOZXcgTXYgUm93IE1heCAlNmRcbiIsIChtdi0+cm93ID4+IDEpKTsKLQotICAgICAgICAgICAgaWYgKChhYnMobXYtPnJvdykgLyAyKSAhPSBtYXhfbXZfcikKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJNViBSb3cgY29udmVyc2lvbiBlcnJvciAlNmRcbiIsIGFicyhtdi0+cm93KSAvIDIpOwotCi0gICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWJzKG12LT5jb2wgPj4gMSkgPiBtYXhfbXZfYykKLSAgICAgICAgewotICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJtYXhtdi5zdHQiLCAiYSIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiTmV3IE12IENvbCBNYXggJTZkXG4iLCAobXYtPmNvbCA+PiAxKSk7Ci0gICAgICAgICAgICBtYXhfbXZfYyA9IGFicyhtdi0+Y29sID4+IDEpOwotICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBlbmNvZGVfbXZjb21wb25lbnQodywgbXYtPnJvdyA+PiAxLCAmbXZjWzBdKTsKLSAgICBlbmNvZGVfbXZjb21wb25lbnQodywgbXYtPmNvbCA+PiAxLCAmbXZjWzFdKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNvc3RfbXZjb21wb25lbnQoY29uc3QgaW50IHYsIGNvbnN0IHN0cnVjdCBtdl9jb250ZXh0ICptdmMpCi17Ci0gICAgY29uc3QgdnA4X3Byb2IgKnAgPSBtdmMtPnByb2I7Ci0gICAgY29uc3QgaW50IHggPSB2OyAgIC8vdjwwPyAtdjp2OwotICAgIHVuc2lnbmVkIGludCBjb3N0OwotCi0gICAgaWYgKHggPCBtdm51bV9zaG9ydCkKLSAgICB7Ci0gICAgICAgIGNvc3QgPSB2cDhfY29zdF96ZXJvKHAgW212cGlzX3Nob3J0XSkKLSAgICAgICAgICAgICAgICsgdnA4X3RyZWVkX2Nvc3QodnA4X3NtYWxsX212dHJlZSwgcCArIE1WUHNob3J0LCB4LCAzKTsKLQotICAgICAgICBpZiAoIXgpCi0gICAgICAgICAgICByZXR1cm4gY29zdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBjb3N0ID0gdnA4X2Nvc3Rfb25lKHAgW212cGlzX3Nob3J0XSk7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgICAgIGNvc3QgKz0gdnA4X2Nvc3RfYml0KHAgW01WUGJpdHMgKyBpXSwgKHggPj4gaSkgJiAxKTsKLQotICAgICAgICB3aGlsZSAoKytpIDwgMyk7Ci0KLSAgICAgICAgaSA9IG12bG9uZ193aWR0aCAtIDE7ICAvKiBTa2lwIGJpdCAzLCB3aGljaCBpcyBzb21ldGltZXMgaW1wbGljaXQgKi8KLQotICAgICAgICBkbwotICAgICAgICAgICAgY29zdCArPSB2cDhfY29zdF9iaXQocCBbTVZQYml0cyArIGldLCAoeCA+PiBpKSAmIDEpOwotCi0gICAgICAgIHdoaWxlICgtLWkgPiAzKTsKLQotICAgICAgICBpZiAoeCAmIDB4RkZGMCkKLSAgICAgICAgICAgIGNvc3QgKz0gdnA4X2Nvc3RfYml0KHAgW01WUGJpdHMgKyAzXSwgKHggPj4gMykgJiAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29zdDsgICAvLyArIHZwOF9jb3N0X2JpdCggcCBbTVZQc2lnbl0sIHYgPCAwKTsKLX0KLS8vI2RlZmluZSBNX0xPRzJfRSAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNwotLy8jZGVmaW5lIGxvZzJmKHgpIChsb2cgKHgpIC8gKGZsb2F0KSBNX0xPRzJfRSkKLQotdm9pZCB2cDhfYnVpbGRfY29tcG9uZW50X2Nvc3RfdGFibGUoaW50ICptdmNvc3RbMl0sIGludCAqbXZzYWRjb3N0WzJdLCBjb25zdCBNVl9DT05URVhUICptdmMsIGludCBtdmNfZmxhZ1syXSkKLXsKLSAgICBpbnQgaSA9IDE7ICAgLy8tbXZfbWF4OwotICAgIHVuc2lnbmVkIGludCBjb3N0MCA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGNvc3QxID0gMDsKLQotICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKLSNpZiAwCi0gICAgbXZzYWRjb3N0IFswXSBbMF0gPSAzMDA7Ci0gICAgbXZzYWRjb3N0IFsxXSBbMF0gPSAzMDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgZG91YmxlIHogPSAyNTYgKiAoMiAqIChsb2cyZigyICogaSkgKyAuNikpOwotICAgICAgICBtdnNhZGNvc3QgWzBdW2ldID0gKGludCkgejsKLSAgICAgICAgbXZzYWRjb3N0IFsxXVtpXSA9IChpbnQpIHo7Ci0gICAgICAgIG12c2FkY29zdCBbMF1bLWldID0gKGludCkgejsKLSAgICAgICAgbXZzYWRjb3N0IFsxXVstaV0gPSAoaW50KSB6OwotICAgIH0KLSAgICB3aGlsZSAoKytpIDw9IG12X21heCk7Ci0KLSNlbmRpZgotCi0gICAgaSA9IDE7Ci0KLSAgICBpZiAobXZjX2ZsYWdbMF0pCi0gICAgewotICAgICAgICBtdmNvc3QgWzBdIFswXSA9IGNvc3RfbXZjb21wb25lbnQoMCwgJm12Y1swXSk7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgLy9tdmNvc3QgWzBdIFtpXSA9IGNvc3RfbXZjb21wb25lbnQoIGksICZtdmNbMF0pOwotICAgICAgICAgICAgY29zdDAgPSBjb3N0X212Y29tcG9uZW50KGksICZtdmNbMF0pOwotCi0gICAgICAgICAgICBtdmNvc3QgWzBdIFtpXSA9IGNvc3QwICsgdnA4X2Nvc3RfemVybyhtdmNbMF0ucHJvYltNVlBzaWduXSk7Ci0gICAgICAgICAgICBtdmNvc3QgWzBdIFstaV0gPSBjb3N0MCArIHZwOF9jb3N0X29uZShtdmNbMF0ucHJvYltNVlBzaWduXSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsraSA8PSBtdl9tYXgpOwotICAgIH0KLQotICAgIGkgPSAxOwotCi0gICAgaWYgKG12Y19mbGFnWzFdKQotICAgIHsKLSAgICAgICAgbXZjb3N0IFsxXSBbMF0gPSBjb3N0X212Y29tcG9uZW50KDAsICZtdmNbMV0pOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vbXZjb3N0IFsxXSBbaV0gPSBjb3N0X212Y29tcG9uZW50KCBpLCBtdmNbMV0pOwotICAgICAgICAgICAgY29zdDEgPSBjb3N0X212Y29tcG9uZW50KGksICZtdmNbMV0pOwotCi0gICAgICAgICAgICBtdmNvc3QgWzFdIFtpXSA9IGNvc3QxICsgdnA4X2Nvc3RfemVybyhtdmNbMV0ucHJvYltNVlBzaWduXSk7Ci0gICAgICAgICAgICBtdmNvc3QgWzFdIFstaV0gPSBjb3N0MSArIHZwOF9jb3N0X29uZShtdmNbMV0ucHJvYltNVlBzaWduXSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsraSA8PSBtdl9tYXgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIGk9LW12X21heDsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgbXZjb3N0IFswXSBbaV0gPSBjb3N0X212Y29tcG9uZW50KCBpLCBtdmNbMF0pOwotICAgICAgICAgICAgbXZjb3N0IFsxXSBbaV0gPSBjb3N0X212Y29tcG9uZW50KCBpLCBtdmNbMV0pOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKCArK2kgPD0gbXZfbWF4KTsKLSAgICAqLwotfQotCi0KLS8vIE1vdGlvbiB2ZWN0b3IgcHJvYmFiaWxpdHkgdGFibGUgdXBkYXRlIGRlcGVuZHMgb24gYmVuZWZpdC4KLS8vIFNtYWxsIGNvcnJlY3Rpb24gYWxsb3dzIGZvciB0aGUgZmFjdCB0aGF0IGFuIHVwZGF0ZSB0byBhbiBNViBwcm9iYWJpbGl0eQotLy8gbWF5IGhhdmUgYmVuZWZpdCBpbiBzdWJzZXF1ZW50IGZyYW1lcyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG9uZS4KLQotI2RlZmluZSBNVl9QUk9CX1VQREFURV9DT1JSRUNUSU9OICAgLTEKLQotCi1fX2lubGluZSBzdGF0aWMgdm9pZCBjYWxjX3Byb2IodnA4X3Byb2IgKnAsIGNvbnN0IHVuc2lnbmVkIGludCBjdFsyXSkKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgdG90ID0gY3RbMF0gKyBjdFsxXTsKLQotICAgIGlmICh0b3QpCi0gICAgewotICAgICAgICBjb25zdCB2cDhfcHJvYiB4ID0gKChjdFswXSAqIDI1NSkgLyB0b3QpICYgLTI7Ci0gICAgICAgICpwID0geCA/IHggOiAxOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlKAotICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCi0gICAgY29uc3QgdW5zaWduZWQgaW50IGN0WzJdLAotICAgIHZwOF9wcm9iICpjb25zdCBjdXJfcCwKLSAgICBjb25zdCB2cDhfcHJvYiBuZXdfcCwKLSAgICBjb25zdCB2cDhfcHJvYiB1cGRhdGVfcCwKLSAgICBpbnQgKnVwZGF0ZWQKLSkKLXsKLSAgICBjb25zdCBpbnQgY3VyX2IgPSB2cDhfY29zdF9icmFuY2goY3QsICpjdXJfcCk7Ci0gICAgY29uc3QgaW50IG5ld19iID0gdnA4X2Nvc3RfYnJhbmNoKGN0LCBuZXdfcCk7Ci0gICAgY29uc3QgaW50IGNvc3QgPSA3ICsgTVZfUFJPQl9VUERBVEVfQ09SUkVDVElPTiArICgodnA4X2Nvc3Rfb25lKHVwZGF0ZV9wKSAtIHZwOF9jb3N0X3plcm8odXBkYXRlX3ApICsgMTI4KSA+PiA4KTsKLQotICAgIGlmIChjdXJfYiAtIG5ld19iID4gY29zdCkKLSAgICB7Ci0gICAgICAgICpjdXJfcCA9IG5ld19wOwotICAgICAgICB2cDhfd3JpdGUodywgMSwgdXBkYXRlX3ApOwotICAgICAgICB2cDhfd3JpdGVfbGl0ZXJhbCh3LCBuZXdfcCA+PiAxLCA3KTsKLSAgICAgICAgKnVwZGF0ZWQgPSAxOwotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgdnA4X3dyaXRlKHcsIDAsIHVwZGF0ZV9wKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfY29tcG9uZW50X3Byb2JzKAotICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCi0gICAgc3RydWN0IG12X2NvbnRleHQgKmN1cl9tdmMsCi0gICAgY29uc3Qgc3RydWN0IG12X2NvbnRleHQgKmRlZmF1bHRfbXZjXywKLSAgICBjb25zdCBzdHJ1Y3QgbXZfY29udGV4dCAqdXBkYXRlX212YywKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgZXZlbnRzIFtNVnZhbHNdLAotICAgIHVuc2lnbmVkIGludCByYywKLSAgICBpbnQgKnVwZGF0ZWQKLSkKLXsKLSAgICB2cDhfcHJvYiAqUGN1ciA9IGN1cl9tdmMtPnByb2I7Ci0gICAgY29uc3QgdnA4X3Byb2IgKmRlZmF1bHRfbXZjID0gZGVmYXVsdF9tdmNfLT5wcm9iOwotICAgIGNvbnN0IHZwOF9wcm9iICpQdXBkYXRlID0gdXBkYXRlX212Yy0+cHJvYjsKLSAgICB1bnNpZ25lZCBpbnQgaXNfc2hvcnRfY3RbMl0sIHNpZ25fY3RbMl07Ci0KLSAgICB1bnNpZ25lZCBpbnQgYml0X2N0IFttdmxvbmdfd2lkdGhdIFsyXTsKLQotICAgIHVuc2lnbmVkIGludCBzaG9ydF9jdCAgW212bnVtX3Nob3J0XTsKLSAgICB1bnNpZ25lZCBpbnQgc2hvcnRfYmN0IFttdm51bV9zaG9ydC0xXSBbMl07Ci0KLSAgICB2cDhfcHJvYiBQbmV3IFtNVlBjb3VudF07Ci0KLSAgICAodm9pZCkgcmM7Ci0gICAgdnA4X2NvcHlfYXJyYXkoUG5ldywgZGVmYXVsdF9tdmMsIE1WUGNvdW50KTsKLQotICAgIHZwOF96ZXJvKGlzX3Nob3J0X2N0KQotICAgIHZwOF96ZXJvKHNpZ25fY3QpCi0gICAgdnA4X3plcm8oYml0X2N0KQotICAgIHZwOF96ZXJvKHNob3J0X2N0KQotICAgIHZwOF96ZXJvKHNob3J0X2JjdCkKLQotCi0gICAgLy9qPTAKLSAgICB7Ci0gICAgICAgIGNvbnN0IGludCBjID0gZXZlbnRzIFttdl9tYXhdOwotCi0gICAgICAgIGlzX3Nob3J0X2N0IFswXSArPSBjOyAgICAgLy8gU2hvcnQgdmVjdG9yCi0gICAgICAgIHNob3J0X2N0IFswXSArPSBjOyAgICAgICAvLyBNYWduaXR1ZGUgZGlzdHJpYnV0aW9uCi0gICAgfQotCi0gICAgLy9qOiAxIH4gbXZfbWF4ICgxMDIzKQotICAgIHsKLSAgICAgICAgaW50IGogPSAxOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGV2ZW50cyBbbXZfbWF4ICsgal07ICAvL3Bvc2l0aXZlCi0gICAgICAgICAgICBjb25zdCBpbnQgYzIgPSBldmVudHMgW212X21heCAtIGpdOyAgLy9uZWdhdGl2ZQotICAgICAgICAgICAgY29uc3QgaW50IGMgID0gYzEgKyBjMjsKLSAgICAgICAgICAgIGludCBhID0gajsKLQotICAgICAgICAgICAgc2lnbl9jdCBbMF0gKz0gYzE7Ci0gICAgICAgICAgICBzaWduX2N0IFsxXSArPSBjMjsKLQotICAgICAgICAgICAgaWYgKGEgPCBtdm51bV9zaG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpc19zaG9ydF9jdCBbMF0gKz0gYzsgICAgIC8vIFNob3J0IHZlY3RvcgotICAgICAgICAgICAgICAgIHNob3J0X2N0IFthXSArPSBjOyAgICAgICAvLyBNYWduaXR1ZGUgZGlzdHJpYnV0aW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGsgPSBtdmxvbmdfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgIGlzX3Nob3J0X2N0IFsxXSArPSBjOyAgICAgLy8gTG9uZyB2ZWN0b3IKLQotICAgICAgICAgICAgICAgIC8qICBiaXQgMyBub3QgYWx3YXlzIGVuY29kZWQuICovCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgYml0X2N0IFtrXSBbKGEgPj4gaykgJiAxXSArPSBjOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKC0tayA+PSAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoKytqIDw9IG12X21heCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICB7Ci0gICAgICAgIGludCBqID0gLW12X21heDsKLSAgICAgICAgZG8KLSAgICAgICAgewotCi0gICAgICAgICAgICBjb25zdCBpbnQgYyA9IGV2ZW50cyBbbXZfbWF4ICsgal07Ci0gICAgICAgICAgICBpbnQgYSA9IGo7Ci0KLSAgICAgICAgICAgIGlmKCBqIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaWduX2N0IFsxXSArPSBjOwotICAgICAgICAgICAgICAgIGEgPSAtajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGopCi0gICAgICAgICAgICAgICAgc2lnbl9jdCBbMF0gKz0gYzsKLQotICAgICAgICAgICAgaWYoIGEgPCBtdm51bV9zaG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpc19zaG9ydF9jdCBbMF0gKz0gYzsgICAgIC8vIFNob3J0IHZlY3RvcgotICAgICAgICAgICAgICAgIHNob3J0X2N0IFthXSArPSBjOyAgICAgICAvLyBNYWduaXR1ZGUgZGlzdHJpYnV0aW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGsgPSBtdmxvbmdfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgIGlzX3Nob3J0X2N0IFsxXSArPSBjOyAgICAgLy8gTG9uZyB2ZWN0b3IKLQotICAgICAgICAgICAgICAgIC8vICBiaXQgMyBub3QgYWx3YXlzIGVuY29kZWQuCi0KLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICBiaXRfY3QgW2tdIFsoYSA+PiBrKSAmIDFdICs9IGM7Ci0gICAgICAgICAgICAgICAgd2hpbGUoIC0tayA+PSAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSggKytqIDw9IG12X21heCk7Ci0gICAgfQotICAgICovCi0KLSAgICBjYWxjX3Byb2IoUG5ldyArIG12cGlzX3Nob3J0LCBpc19zaG9ydF9jdCk7Ci0KLSAgICBjYWxjX3Byb2IoUG5ldyArIE1WUHNpZ24sIHNpZ25fY3QpOwotCi0gICAgewotICAgICAgICB2cDhfcHJvYiBwIFttdm51bV9zaG9ydCAtIDFdOyAgICAvKiBhY3R1YWxseSBvbmx5IG5lZWQgYnJhbmNoIGN0ICovCi0gICAgICAgIGludCBqID0gMDsKLQotICAgICAgICB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbigKLSAgICAgICAgICAgIDgsIHZwOF9zbWFsbF9tdmVuY29kaW5ncywgdnA4X3NtYWxsX212dHJlZSwKLSAgICAgICAgICAgIHAsIHNob3J0X2JjdCwgc2hvcnRfY3QsCi0gICAgICAgICAgICAyNTYsIDEKLSAgICAgICAgKTsKLQotICAgICAgICBkbwotICAgICAgICAgICAgY2FsY19wcm9iKFBuZXcgKyBNVlBzaG9ydCArIGosIHNob3J0X2JjdFtqXSk7Ci0KLSAgICAgICAgd2hpbGUgKCsraiA8IG12bnVtX3Nob3J0IC0gMSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBpbnQgaiA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgICAgIGNhbGNfcHJvYihQbmV3ICsgTVZQYml0cyArIGosIGJpdF9jdFtqXSk7Ci0KLSAgICAgICAgd2hpbGUgKCsraiA8IG12bG9uZ193aWR0aCk7Ci0gICAgfQotCi0gICAgdXBkYXRlKHcsIGlzX3Nob3J0X2N0LCBQY3VyICsgbXZwaXNfc2hvcnQsIFBuZXdbbXZwaXNfc2hvcnRdLCAqUHVwZGF0ZSsrLCB1cGRhdGVkKTsKLQotICAgIHVwZGF0ZSh3LCBzaWduX2N0LCBQY3VyICsgTVZQc2lnbiwgUG5ld1tNVlBzaWduXSwgKlB1cGRhdGUrKywgdXBkYXRlZCk7Ci0KLSAgICB7Ci0gICAgICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBuZXdfcCA9IFBuZXcgKyBNVlBzaG9ydDsKLSAgICAgICAgdnA4X3Byb2IgKmNvbnN0IGN1cl9wID0gUGN1ciArIE1WUHNob3J0OwotCi0gICAgICAgIGludCBqID0gMDsKLQotICAgICAgICBkbwotCi0gICAgICAgICAgICB1cGRhdGUodywgc2hvcnRfYmN0W2pdLCBjdXJfcCArIGosIG5ld19wW2pdLCAqUHVwZGF0ZSsrLCB1cGRhdGVkKTsKLQotICAgICAgICB3aGlsZSAoKytqIDwgbXZudW1fc2hvcnQgLSAxKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBuZXdfcCA9IFBuZXcgKyBNVlBiaXRzOwotICAgICAgICB2cDhfcHJvYiAqY29uc3QgY3VyX3AgPSBQY3VyICsgTVZQYml0czsKLQotICAgICAgICBpbnQgaiA9IDA7Ci0KLSAgICAgICAgZG8KLQotICAgICAgICAgICAgdXBkYXRlKHcsIGJpdF9jdFtqXSwgY3VyX3AgKyBqLCBuZXdfcFtqXSwgKlB1cGRhdGUrKywgdXBkYXRlZCk7Ci0KLSAgICAgICAgd2hpbGUgKCsraiA8IG12bG9uZ193aWR0aCk7Ci0gICAgfQotfQotCi12b2lkIHZwOF93cml0ZV9tdnByb2JzKFZQOF9DT01QICpjcGkpCi17Ci0gICAgdnA4X3dyaXRlciAqY29uc3QgdyAgPSAmIGNwaS0+YmM7Ci0gICAgTVZfQ09OVEVYVCAqbXZjID0gY3BpLT5jb21tb24uZmMubXZjOwotICAgIGludCBmbGFnc1syXSA9IHswLCAwfTsKLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0gICAgYWN0aXZlX3NlY3Rpb24gPSA0OwotI2VuZGlmCi0gICAgd3JpdGVfY29tcG9uZW50X3Byb2JzKAotICAgICAgICB3LCAmbXZjWzBdLCAmdnA4X2RlZmF1bHRfbXZfY29udGV4dFswXSwgJnZwOF9tdl91cGRhdGVfcHJvYnNbMF0sIGNwaS0+TVZjb3VudFswXSwgMCwgJmZsYWdzWzBdCi0gICAgKTsKLSAgICB3cml0ZV9jb21wb25lbnRfcHJvYnMoCi0gICAgICAgIHcsICZtdmNbMV0sICZ2cDhfZGVmYXVsdF9tdl9jb250ZXh0WzFdLCAmdnA4X212X3VwZGF0ZV9wcm9ic1sxXSwgY3BpLT5NVmNvdW50WzFdLCAxLCAmZmxhZ3NbMV0KLSAgICApOwotCi0gICAgaWYgKGZsYWdzWzBdIHx8IGZsYWdzWzFdKQotICAgICAgICB2cDhfYnVpbGRfY29tcG9uZW50X2Nvc3RfdGFibGUoY3BpLT5tYi5tdmNvc3QsIGNwaS0+bWIubXZzYWRjb3N0LCAoY29uc3QgTVZfQ09OVEVYVCAqKSBjcGktPmNvbW1vbi5mYy5tdmMsIGZsYWdzKTsKLQotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLSAgICBhY3RpdmVfc2VjdGlvbiA9IDU7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL2VuY29kZW12LmggYi92cDgvZW5jb2Rlci9lbmNvZGVtdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ4MWJmLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2VuY29kZW12LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19FTkNPREVNVl9ICi0jZGVmaW5lIF9fSU5DX0VOQ09ERU1WX0gKLQotI2luY2x1ZGUgIm9ueXhfaW50LmgiCi0KLXZvaWQgdnA4X3dyaXRlX212cHJvYnMoVlA4X0NPTVAgKik7Ci12b2lkIHZwOF9lbmNvZGVfbW90aW9uX3ZlY3Rvcih2cDhfd3JpdGVyICosIGNvbnN0IE1WICosIGNvbnN0IE1WX0NPTlRFWFQgKik7Ci12b2lkIHZwOF9idWlsZF9jb21wb25lbnRfY29zdF90YWJsZShpbnQgKm12Y29zdFsyXSwgaW50ICptdnNhZGNvc3RbMl0sIGNvbnN0IE1WX0NPTlRFWFQgKm12YywgaW50IG12Y19mbGFnWzJdKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9ldGhyZWFkaW5nLmMgYi92cDgvZW5jb2Rlci9ldGhyZWFkaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGExMDMuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvZXRocmVhZGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotI2luY2x1ZGUgIm9ueXhfaW50LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2NvbW1vbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCi0KLSNpZiBDT05GSUdfTVVMVElUSFJFQUQKLQotZXh0ZXJuIGludCB2cDhjeF9lbmNvZGVfaW50ZXJfbWFjcm9ibG9jayhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT0tFTkVYVFJBICoqdCwgaW50IHJlY29uX3lvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNvbl91dm9mZnNldCk7Ci1leHRlcm4gaW50IHZwOGN4X2VuY29kZV9pbnRyYV9tYWNyb19ibG9jayhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9LRU5FWFRSQSAqKnQpOwotZXh0ZXJuIHZvaWQgdnA4Y3hfbWJfaW5pdF9xdWFudGl6ZXIoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCk7Ci1leHRlcm4gdm9pZCB2cDhfYnVpbGRfYmxvY2tfb2Zmc2V0cyhNQUNST0JMT0NLICp4KTsKLWV4dGVybiB2b2lkIHZwOF9zZXR1cF9ibG9ja19wdHJzKE1BQ1JPQkxPQ0sgKngpOwotCi1leHRlcm4gdm9pZCBsb29wZmlsdGVyX2ZyYW1lKFZQOF9DT01QICpjcGksIFZQOF9DT01NT04gKmNtKTsKLQotc3RhdGljIFRIUkVBRF9GVU5DVElPTiBsb29wZmlsdGVyX3RocmVhZCh2b2lkICpwX2RhdGEpCi17Ci0gICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKSgoKExQRlRIUkVBRF9EQVRBICopcF9kYXRhKS0+cHRyMSk7Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2xwZikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCA9PSBGQUxTRSkgLy8gd2UncmUgc2h1dHRpbmcgZG93bgotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBsb29wZmlsdGVyX2ZyYW1lKGNwaSwgY20pOwotCi0gICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotVEhSRUFEX0ZVTkNUSU9OIHRocmVhZF9lbmNvZGluZ19wcm9jKHZvaWQgKnBfZGF0YSkKLXsKLSAgICBpbnQgaXRocmVhZCA9ICgoRU5DT0RFVEhSRUFEX0RBVEEgKilwX2RhdGEpLT5pdGhyZWFkOwotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikoKChFTkNPREVUSFJFQURfREFUQSAqKXBfZGF0YSktPnB0cjEpOwotICAgIE1CX1JPV19DT01QICptYnJpID0gKE1CX1JPV19DT01QICopKCgoRU5DT0RFVEhSRUFEX0RBVEEgKilwX2RhdGEpLT5wdHIyKTsKLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIG1iX3Jvd19sZWZ0X2NvbnRleHQ7Ci0KLSAgICBjb25zdCBpbnQgbnN5bmMgPSBjcGktPm10X3N5bmNfcmFuZ2U7Ci0gICAgLy9wcmludGYoIlN0YXJ0ZWQgdGhyZWFkICVkXG4iLCBpdGhyZWFkKTsKLQotICAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy9pZihXYWl0Rm9yU2luZ2xlT2JqZWN0KGNwaS0+aF9ldmVudF9tYnJlbmNvZGluZ1tpdGhyZWFkXSwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApCi0gICAgICAgIGlmIChzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2l0aHJlYWRdKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLSAgICAgICAgICAgIGludCBtYl9yb3c7Ci0gICAgICAgICAgICBNQUNST0JMT0NLICp4ID0gJm1icmktPm1iOwotICAgICAgICAgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOwotICAgICAgICAgICAgVE9LRU5FWFRSQSAqdHAgOwotCi0gICAgICAgICAgICBpbnQgKnNlZ21lbnRfY291bnRzID0gbWJyaS0+c2VnbWVudF9jb3VudHM7Ci0gICAgICAgICAgICBpbnQgKnRvdGFscmF0ZSA9ICZtYnJpLT50b3RhbHJhdGU7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQgPT0gRkFMU0UpIC8vIHdlJ3JlIHNodXR0aW5nIGRvd24KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZm9yIChtYl9yb3cgPSBpdGhyZWFkICsgMTsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdyArPSAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgIGludCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldDsKLSAgICAgICAgICAgICAgICBpbnQgbWJfY29sOwotICAgICAgICAgICAgICAgIGludCByZWZfZmJfaWR4ID0gY20tPmxzdF9mYl9pZHg7Ci0gICAgICAgICAgICAgICAgaW50IGRzdF9mYl9pZHggPSBjbS0+bmV3X2ZiX2lkeDsKLSAgICAgICAgICAgICAgICBpbnQgcmVjb25feV9zdHJpZGUgPSBjbS0+eXYxMl9mYltyZWZfZmJfaWR4XS55X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBpbnQgcmVjb25fdXZfc3RyaWRlID0gY20tPnl2MTJfZmJbcmVmX2ZiX2lkeF0udXZfc3RyaWRlOwotICAgICAgICAgICAgICAgIHZvbGF0aWxlIGludCAqbGFzdF9yb3dfY3VycmVudF9tYl9jb2w7Ci0gICAgICAgICAgICAgICAgSU5UNjQgYWN0aXZpdHlfc3VtID0gMDsKLQotICAgICAgICAgICAgICAgIHRwID0gY3BpLT50b2sgKyAobWJfcm93ICogKGNtLT5tYl9jb2xzICogMTYgKiAyNCkpOwotCi0gICAgICAgICAgICAgICAgbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgPSAmY3BpLT5tdF9jdXJyZW50X21iX2NvbFttYl9yb3cgLSAxXTsKLQotICAgICAgICAgICAgICAgIC8vIHJlc2V0IGFib3ZlIGJsb2NrIGNvZWZmcwotICAgICAgICAgICAgICAgIHhkLT5hYm92ZV9jb250ZXh0ID0gY20tPmFib3ZlX2NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgeGQtPmxlZnRfY29udGV4dCA9ICZtYl9yb3dfbGVmdF9jb250ZXh0OwotCi0gICAgICAgICAgICAgICAgdnA4X3plcm8obWJfcm93X2xlZnRfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICB4ZC0+dXBfYXZhaWxhYmxlID0gKG1iX3JvdyAhPSAwKTsKLSAgICAgICAgICAgICAgICByZWNvbl95b2Zmc2V0ID0gKG1iX3JvdyAqIHJlY29uX3lfc3RyaWRlICogMTYpOwotICAgICAgICAgICAgICAgIHJlY29uX3V2b2Zmc2V0ID0gKG1iX3JvdyAqIHJlY29uX3V2X3N0cmlkZSAqIDgpOwotCi0gICAgICAgICAgICAgICAgY3BpLT50cGxpc3RbbWJfcm93XS5zdGFydCA9IHRwOwotCi0gICAgICAgICAgICAgICAgLy9wcmludGYoIlRocmVhZCBtYl9yb3cgPSAlZFxuIiwgbWJfcm93KTsKLQotICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIG1hY3JvYmxvY2sgY29sIGluIGltYWdlCi0gICAgICAgICAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2VnX21hcF9pbmRleCA9IChtYl9yb3cgKiBjbS0+bWJfY29scyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChtYl9jb2wgJiAobnN5bmMgLSAxKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1iX2NvbCA+ICgqbGFzdF9yb3dfY3VycmVudF9tYl9jb2wgLSBuc3luYykgJiYgKmxhc3Rfcm93X2N1cnJlbnRfbWJfY29sICE9IGNtLT5tYl9jb2xzIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcGF1c2VfaGludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9zbGVlcCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIERpc3RhbmNlIG9mIE1iIHRvIHRoZSB2YXJpb3VzIGltYWdlIGVkZ2VzLgotICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzcGVjaWZpZWQgdG8gOHRoIHBlbCBhcyB0aGV5IGFyZSBhbHdheXMgY29tcGFyZWQgdG8gdmFsdWVzIHRoYXQgYXJlIGluIDEvOHRoIHBlbCB1bml0cwotICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fbGVmdF9lZGdlID0gLSgobWJfY29sICogMTYpIDw8IDMpOwotICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fcmlnaHRfZWRnZSA9ICgoY20tPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KSA8PCAzOwotICAgICAgICAgICAgICAgICAgICB4ZC0+bWJfdG9fdG9wX2VkZ2UgPSAtKChtYl9yb3cgKiAxNikgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgIHhkLT5tYl90b19ib3R0b21fZWRnZSA9ICgoY20tPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSA8PCAzOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBsaW1pdCB2YWx1ZXMgZm9yIG1vdGlvbiB2ZWN0b3JzIHVzZWQgdG8gcHJldmVudCB0aGVtIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBVTVYgYm9yZGVycwotICAgICAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWluID0gLSgobWJfY29sICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpKTsKLSAgICAgICAgICAgICAgICAgICAgeC0+bXZfY29sX21heCA9ICgoY20tPm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IC0oKG1iX3JvdyAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIHgtPm12X3Jvd19tYXggPSAoKGNtLT5tYl9yb3dzIC0gMSAtIG1iX3JvdykgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC55X2J1ZmZlciA9IGNtLT55djEyX2ZiW2RzdF9mYl9pZHhdLnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciA9IGNtLT55djEyX2ZiW2RzdF9mYl9pZHhdLnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHhkLT5kc3Qudl9idWZmZXIgPSBjbS0+eXYxMl9mYltkc3RfZmJfaWR4XS52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB4ZC0+bGVmdF9hdmFpbGFibGUgPSAobWJfY29sICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgIHgtPnJkZGl2ID0gY3BpLT5SRERJVjsKLSAgICAgICAgICAgICAgICAgICAgeC0+cmRtdWx0ID0gY3BpLT5SRE1VTFQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi50dW5pbmcgPT0gVlA4X1RVTkVfU1NJTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N1bSArPSB2cDhfYWN0aXZpdHlfbWFza2luZyhjcGksIHgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElzIHNlZ21lbnRhdGlvbiBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIE1CIGxldmVsIGFkanV0bWVudCB0byBxdWFudGl6ZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhkLT5zZWdtZW50YXRpb25fZW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29kZSB0byBzZXQgc2VnbWVudCBpZCBpbiB4ZC0+bWJtaS5zZWdtZW50X2lkIGZvciBjdXJyZW50IE1CICh3aXRoIHJhbmdlIGNoZWNraW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+c2VnbWVudGF0aW9uX21hcFtzZWdfbWFwX2luZGV4ICsgbWJfY29sXSA8PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkID0gY3BpLT5zZWdtZW50YXRpb25fbWFwW3NlZ19tYXBfaW5kZXggKyBtYl9jb2xdOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5zZWdtZW50X2lkID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdnA4Y3hfbWJfaW5pdF9xdWFudGl6ZXIoY3BpLCB4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZCA9IDA7IC8vIFNldCB0byBTZWdtZW50IDAgYnkgZGVmYXVsdAotCi0gICAgICAgICAgICAgICAgICAgIHgtPmFjdGl2ZV9wdHIgPSBjcGktPmFjdGl2ZV9tYXAgKyBzZWdfbWFwX2luZGV4ICsgbWJfY29sOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0b3RhbHJhdGUgKz0gdnA4Y3hfZW5jb2RlX2ludHJhX21hY3JvX2Jsb2NrKGNwaSwgeCwgJnRwKTsKLSNpZmRlZiBNT0RFX1NUQVRTCi0gICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVzW3hkLT5tYm1pLm1vZGVdICsrOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdG90YWxyYXRlICs9IHZwOGN4X2VuY29kZV9pbnRlcl9tYWNyb2Jsb2NrKGNwaSwgeCwgJnRwLCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldCk7Ci0KLSNpZmRlZiBNT0RFX1NUQVRTCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcl95X21vZGVzW3hkLT5tYm1pLm1vZGVdICsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGQtPm1ibWkubW9kZSA9PSBTUExJVE1WKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IHhkLT5tYm1pLnBhcnRpdGlvbl9jb3VudDsgYisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfYl9tb2Rlc1t4LT5wYXJ0aXRpb24tPmJtaVtiXS5tb2RlXSArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvZiBsYXN0IHJlZiBmcmFtZSAwLDAgdXNlYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IFpFUk9NVikgJiYgKHhkLT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gTEFTVF9GUkFNRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5pbnRlcl96el9jb3VudCsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgY29kZSBmb3IgY3ljbGljIHJlZnJlc2gKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGN5Y2xpYyB1cGRhdGUgZW5hYmxlZCB0aGVuIGNvcHkgeGQtPm1ibWkuc2VnbWVudF9pZDsgKHdoaWNoIG1heSBoYXZlIGJlZW4gdXBkYXRlZCBiYXNlZCBvbiBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdnA4Y3hfZW5jb2RlX2ludGVyX21hY3JvYmxvY2soKSkgYmFjayBpbnRvIHRoZSBnbG9iYWwgc2dtZW50YXRpb24gbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2VuYWJsZWQgJiYgeGQtPnNlZ21lbnRhdGlvbl9lbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1CX01PREVfSU5GTyAqIG1ibWkgPSAmeGQtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+c2VnbWVudGF0aW9uX21hcFtzZWdfbWFwX2luZGV4ICsgbWJfY29sXSA9IG1ibWktPnNlZ21lbnRfaWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYmxvY2sgaGFzIGJlZW4gcmVmcmVzaGVkIG1hcmsgaXQgYXMgY2xlYW4gKHRoZSBtYWduaXR1ZGUgb2YgdGhlIC12ZSBpbmZsdWVuY2VzIGhvdyBsb25nIGl0IHdpbGwgYmUgYmVmb3JlIHdlIGNvbnNpZGVyIGFub3RoZXIgcmVmcmVzaCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSBpZiBpdCB3YXMgY29kZWQgKGxhc3QgZnJhbWUgMCwwKSBhbmQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVmcmVzaGVkIHRoZW4gbWFyayBpdCBhcyBhIGNhbmRpZGF0ZSBmb3IgY2xlYW51cCBuZXh0IHRpbWUgKG1hcmtlZCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgbWFyayBpdCBhcyBkaXJ0eSAoMSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ibWktPnNlZ21lbnRfaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwW3NlZ19tYXBfaW5kZXggKyBtYl9jb2xdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1ibWktPm1vZGUgPT0gWkVST01WKSAmJiAobWJtaS0+cmVmX2ZyYW1lID09IExBU1RfRlJBTUUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwW3NlZ19tYXBfaW5kZXggKyBtYl9jb2xdID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFtzZWdfbWFwX2luZGV4ICsgbWJfY29sXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbc2VnX21hcF9pbmRleCArIG1iX2NvbF0gPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY3BpLT50cGxpc3RbbWJfcm93XS5zdG9wID0gdHA7Ci0KLSAgICAgICAgICAgICAgICAgICAgeC0+Z2ZfYWN0aXZlX3B0cisrOyAvLyBJbmNyZW1lbnQgcG9pbnRlciBpbnRvIGdmIHVzZWFnZSBmbGFncyBzdHJ1Y3R1cmUgZm9yIG5leHQgbWIKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoJnhkLT5tb2RlX2luZm9fY29udGV4dC0+Ym1pW2ldLCAmeGQtPmJsb2NrW2ldLmJtaSwgc2l6ZW9mKHhkLT5ibG9ja1tpXS5ibWkpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdG8gdGhlIG5leHQgY29sdW1uIG9mIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgIHgtPnNyYy52X2J1ZmZlciArPSA4OwotCi0gICAgICAgICAgICAgICAgICAgIHJlY29uX3lvZmZzZXQgKz0gMTY7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29uX3V2b2Zmc2V0ICs9IDg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBzZWdtZW50IHVzZWFnZQotICAgICAgICAgICAgICAgICAgICBzZWdtZW50X2NvdW50c1t4ZC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuc2VnbWVudF9pZF0rKzsKLQotICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRvIG5leHQgbWIKLSAgICAgICAgICAgICAgICAgICAgeGQtPm1vZGVfaW5mb19jb250ZXh0Kys7Ci0gICAgICAgICAgICAgICAgICAgIHgtPnBhcnRpdGlvbl9pbmZvKys7Ci0gICAgICAgICAgICAgICAgICAgIHhkLT5hYm92ZV9jb250ZXh0Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3BpLT5tdF9jdXJyZW50X21iX2NvbFttYl9yb3ddID0gbWJfY29sOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZXh0ZW5kIHRoZSByZWNvbiBmb3IgaW50cmEgcHJlZGljdGlvbgotICAgICAgICAgICAgICAgIHZwOF9leHRlbmRfbWJfcm93KAotICAgICAgICAgICAgICAgICAgICAmY20tPnl2MTJfZmJbZHN0X2ZiX2lkeF0sCi0gICAgICAgICAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgKyAxNiwKLSAgICAgICAgICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciArIDgsCi0gICAgICAgICAgICAgICAgICAgIHhkLT5kc3Qudl9idWZmZXIgKyA4KTsKLQotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gYWNjb3VudCBmb3IgdGhlIGJvcmRlcgotICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dCsrOwotICAgICAgICAgICAgICAgIHgtPnBhcnRpdGlvbl9pbmZvKys7Ci0gICAgICAgICAgICAgICAgeC0+YWN0aXZpdHlfc3VtICs9IGFjdGl2aXR5X3N1bTsKLQotICAgICAgICAgICAgICAgIHgtPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAqIChjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudCArIDEpIC0gMTYgKiBjbS0+bWJfY29sczsKLSAgICAgICAgICAgICAgICB4LT5zcmMudV9idWZmZXIgKz0gOCAqIHgtPnNyYy51dl9zdHJpZGUgKiAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSAtIDggKiBjbS0+bWJfY29sczsKLSAgICAgICAgICAgICAgICB4LT5zcmMudl9idWZmZXIgKz0gOCAqIHgtPnNyYy51dl9zdHJpZGUgKiAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKyAxKSAtIDggKiBjbS0+bWJfY29sczsKLQotICAgICAgICAgICAgICAgIHhkLT5tb2RlX2luZm9fY29udGV4dCArPSB4ZC0+bW9kZV9pbmZvX3N0cmlkZSAqIGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50OwotICAgICAgICAgICAgICAgIHgtPnBhcnRpdGlvbl9pbmZvICs9IHhkLT5tb2RlX2luZm9fc3RyaWRlICogY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWJfcm93ID09IGNtLT5tYl9yb3dzIC0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vU2V0RXZlbnQoY3BpLT5oX2V2ZW50X21haW4pOwotICAgICAgICAgICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X2VuZF9lbmNvZGluZyk7IC8qIHNpZ25hbCBmcmFtZSBlbmNvZGluZyBlbmQgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL3ByaW50ZigiZXhpdCB0aHJlYWQgJWRcbiIsIGl0aHJlYWQpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9tYmJ5X2NvcHkoTUFDUk9CTE9DSyAqbWJkc3QsIE1BQ1JPQkxPQ0sgKm1ic3JjKQotewotCi0gICAgTUFDUk9CTE9DSyAqeCA9IG1ic3JjOwotICAgIE1BQ1JPQkxPQ0sgKnogPSBtYmRzdDsKLSAgICBpbnQgaTsKLQotICAgIHotPnNzICAgICAgICAgICAgICAgPSB4LT5zczsKLSAgICB6LT5zc19jb3VudCAgICAgICAgICA9IHgtPnNzX2NvdW50OwotICAgIHotPnNlYXJjaGVzX3Blcl9zdGVwICA9IHgtPnNlYXJjaGVzX3Blcl9zdGVwOwotICAgIHotPmVycm9ycGVyYml0ICAgICAgPSB4LT5lcnJvcnBlcmJpdDsKLQotICAgIHotPnNhZHBlcmJpdDE2ICAgICAgPSB4LT5zYWRwZXJiaXQxNjsKLSAgICB6LT5zYWRwZXJiaXQ0ICAgICAgID0geC0+c2FkcGVyYml0NDsKLSAgICB6LT5lcnJ0aHJlc2ggICAgICAgID0geC0+ZXJydGhyZXNoOwotCi0gICAgLyoKLSAgICB6LT5tdl9jb2xfbWluICAgID0geC0+bXZfY29sX21pbjsKLSAgICB6LT5tdl9jb2xfbWF4ICAgID0geC0+bXZfY29sX21heDsKLSAgICB6LT5tdl9yb3dfbWluICAgID0geC0+bXZfcm93X21pbjsKLSAgICB6LT5tdl9yb3dfbWF4ICAgID0geC0+bXZfcm93X21heDsKLSAgICB6LT52ZWN0b3JfcmFuZ2UgPSB4LT52ZWN0b3JfcmFuZ2UgOwotICAgICovCi0KLSAgICB6LT52cDhfc2hvcnRfZmRjdDR4NCAgICAgPSB4LT52cDhfc2hvcnRfZmRjdDR4NDsKLSAgICB6LT52cDhfc2hvcnRfZmRjdDh4NCAgICAgPSB4LT52cDhfc2hvcnRfZmRjdDh4NDsKLSAgICB6LT5zaG9ydF93YWxzaDR4NCAgICA9IHgtPnNob3J0X3dhbHNoNHg0OwotICAgIHotPnF1YW50aXplX2IgICAgICAgID0geC0+cXVhbnRpemVfYjsKLSAgICB6LT5vcHRpbWl6ZSAgICAgICAgICA9IHgtPm9wdGltaXplOwotCi0gICAgLyoKLSAgICB6LT5tdmMgICAgICAgICAgICAgID0geC0+bXZjOwotICAgIHotPnNyYy55X2J1ZmZlciAgICAgID0geC0+c3JjLnlfYnVmZmVyOwotICAgIHotPnNyYy51X2J1ZmZlciAgICAgID0geC0+c3JjLnVfYnVmZmVyOwotICAgIHotPnNyYy52X2J1ZmZlciAgICAgID0geC0+c3JjLnZfYnVmZmVyOwotICAgICovCi0KLQotICAgIHZweF9tZW1jcHkoei0+bXZjb3N0cywgICAgICAgICAgeC0+bXZjb3N0cywgICAgICAgICBzaXplb2YoeC0+bXZjb3N0cykpOwotICAgIHotPm12Y29zdFswXSA9ICZ6LT5tdmNvc3RzWzBdW212X21heCsxXTsKLSAgICB6LT5tdmNvc3RbMV0gPSAmei0+bXZjb3N0c1sxXVttdl9tYXgrMV07Ci0gICAgei0+bXZzYWRjb3N0WzBdID0gJnotPm12c2FkY29zdHNbMF1bbXZfbWF4KzFdOwotICAgIHotPm12c2FkY29zdFsxXSA9ICZ6LT5tdnNhZGNvc3RzWzFdW212X21heCsxXTsKLQotCi0gICAgdnB4X21lbWNweSh6LT50b2tlbl9jb3N0cywgICAgICAgeC0+dG9rZW5fY29zdHMsICAgICAgc2l6ZW9mKHgtPnRva2VuX2Nvc3RzKSk7Ci0gICAgdnB4X21lbWNweSh6LT5pbnRlcl9ibW9kZV9jb3N0cywgIHgtPmludGVyX2Jtb2RlX2Nvc3RzLCBzaXplb2YoeC0+aW50ZXJfYm1vZGVfY29zdHMpKTsKLSAgICAvL21lbWNweSh6LT5tdmNvc3RzLCAgICAgICAgICAgIHgtPm12Y29zdHMsICAgICAgICAgc2l6ZW9mKHgtPm12Y29zdHMpKTsKLSAgICAvL21lbWNweSh6LT5tdmNvc3QsICAgICAgICAgeC0+bXZjb3N0LCAgICAgICAgICBzaXplb2YoeC0+bXZjb3N0KSk7Ci0gICAgdnB4X21lbWNweSh6LT5tYm1vZGVfY29zdCwgICAgICAgeC0+bWJtb2RlX2Nvc3QsICAgICAgc2l6ZW9mKHgtPm1ibW9kZV9jb3N0KSk7Ci0gICAgdnB4X21lbWNweSh6LT5pbnRyYV91dl9tb2RlX2Nvc3QsICB4LT5pbnRyYV91dl9tb2RlX2Nvc3QsIHNpemVvZih4LT5pbnRyYV91dl9tb2RlX2Nvc3QpKTsKLSAgICB2cHhfbWVtY3B5KHotPmJtb2RlX2Nvc3RzLCAgICAgICB4LT5ibW9kZV9jb3N0cywgICAgICBzaXplb2YoeC0+Ym1vZGVfY29zdHMpKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQotICAgIHsKLSAgICAgICAgei0+YmxvY2tbaV0ucXVhbnQgICAgICAgICAgID0geC0+YmxvY2tbaV0ucXVhbnQ7Ci0gICAgICAgIHotPmJsb2NrW2ldLnF1YW50X2Zhc3QgICAgICA9IHgtPmJsb2NrW2ldLnF1YW50X2Zhc3Q7Ci0gICAgICAgIHotPmJsb2NrW2ldLnF1YW50X3NoaWZ0ICAgICA9IHgtPmJsb2NrW2ldLnF1YW50X3NoaWZ0OwotICAgICAgICB6LT5ibG9ja1tpXS56YmluICAgICAgICAgICAgPSB4LT5ibG9ja1tpXS56YmluOwotICAgICAgICB6LT5ibG9ja1tpXS56cnVuX3piaW5fYm9vc3QgICA9IHgtPmJsb2NrW2ldLnpydW5femJpbl9ib29zdDsKLSAgICAgICAgei0+YmxvY2tbaV0ucm91bmQgICAgICAgICAgID0geC0+YmxvY2tbaV0ucm91bmQ7Ci0gICAgICAgIC8qCi0gICAgICAgIHotPmJsb2NrW2ldLnNyYyAgICAgICAgICAgICA9IHgtPmJsb2NrW2ldLnNyYzsKLSAgICAgICAgKi8KLSAgICAgICAgei0+YmxvY2tbaV0uc3JjX3N0cmlkZSAgICAgICA9IHgtPmJsb2NrW2ldLnNyY19zdHJpZGU7Ci0gICAgICAgIHotPmJsb2NrW2ldLmZvcmNlX2VtcHR5ICAgICAgPSB4LT5ibG9ja1tpXS5mb3JjZV9lbXB0eTsKLQotICAgIH0KLQotICAgIHsKLSAgICAgICAgTUFDUk9CTE9DS0QgKnhkID0gJngtPmVfbWJkOwotICAgICAgICBNQUNST0JMT0NLRCAqemQgPSAmei0+ZV9tYmQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgemQtPm1vZGVfaW5mb19jb250ZXh0ID0geGQtPm1vZGVfaW5mb19jb250ZXh0OwotICAgICAgICB6ZC0+bW9kZV9pbmZvICAgICAgICA9IHhkLT5tb2RlX2luZm87Ci0KLSAgICAgICAgemQtPm1vZGVfaW5mb19zdHJpZGUgID0geGQtPm1vZGVfaW5mb19zdHJpZGU7Ci0gICAgICAgIHpkLT5mcmFtZV90eXBlICAgICAgID0geGQtPmZyYW1lX3R5cGU7Ci0gICAgICAgIHpkLT51cF9hdmFpbGFibGUgICAgID0geGQtPnVwX2F2YWlsYWJsZSAgIDsKLSAgICAgICAgemQtPmxlZnRfYXZhaWxhYmxlICAgPSB4ZC0+bGVmdF9hdmFpbGFibGU7Ci0gICAgICAgIHpkLT5sZWZ0X2NvbnRleHQgICAgID0geGQtPmxlZnRfY29udGV4dDsKLSAgICAgICAgemQtPmxhc3RfZnJhbWVfZGMgICAgID0geGQtPmxhc3RfZnJhbWVfZGM7Ci0gICAgICAgIHpkLT5sYXN0X2ZyYW1lX2RjY29ucyA9IHhkLT5sYXN0X2ZyYW1lX2RjY29uczsKLSAgICAgICAgemQtPmdvbGRfZnJhbWVfZGMgICAgID0geGQtPmdvbGRfZnJhbWVfZGM7Ci0gICAgICAgIHpkLT5nb2xkX2ZyYW1lX2RjY29ucyA9IHhkLT5nb2xkX2ZyYW1lX2RjY29uczsKLSAgICAgICAgemQtPm1iX3RvX2xlZnRfZWRnZSAgICA9IHhkLT5tYl90b19sZWZ0X2VkZ2U7Ci0gICAgICAgIHpkLT5tYl90b19yaWdodF9lZGdlICAgPSB4ZC0+bWJfdG9fcmlnaHRfZWRnZTsKLSAgICAgICAgemQtPm1iX3RvX3RvcF9lZGdlICAgICA9IHhkLT5tYl90b190b3BfZWRnZSAgIDsKLSAgICAgICAgemQtPm1iX3RvX2JvdHRvbV9lZGdlICA9IHhkLT5tYl90b19ib3R0b21fZWRnZTsKLSAgICAgICAgemQtPmdmX2FjdGl2ZV9wdHIgICAgID0geGQtPmdmX2FjdGl2ZV9wdHI7Ci0gICAgICAgIHpkLT5mcmFtZXNfc2luY2VfZ29sZGVuICAgICAgID0geGQtPmZyYW1lc19zaW5jZV9nb2xkZW47Ci0gICAgICAgIHpkLT5mcmFtZXNfdGlsbF9hbHRfcmVmX2ZyYW1lICAgPSB4ZC0+ZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZTsKLSAgICAgICAgKi8KLSAgICAgICAgemQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0OwotICAgICAgICB6ZC0+c3VicGl4ZWxfcHJlZGljdDh4NCAgICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3Q4eDQ7Ci0gICAgICAgIHpkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4ODsKLSAgICAgICAgemQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0MTZ4MTY7Ci0gICAgICAgIHpkLT5zZWdtZW50YXRpb25fZW5hYmxlZCAgICAgPSB4ZC0+c2VnbWVudGF0aW9uX2VuYWJsZWQ7Ci0gICAgICAgIHpkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGEgICAgICA9IHhkLT5tYl9zZWdlbWVudF9hYnNfZGVsdGE7Ci0gICAgICAgIHZweF9tZW1jcHkoemQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhLCB4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEsIHNpemVvZih4ZC0+c2VnbWVudF9mZWF0dXJlX2RhdGEpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgemQtPmJsb2NrW2ldLmRlcXVhbnQgPSB4ZC0+YmxvY2tbaV0uZGVxdWFudDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCB2cDhjeF9pbml0X21icnRocmVhZF9kYXRhKFZQOF9DT01QICpjcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDUk9CTE9DSyAqeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9ST1dfQ09NUCAqbWJyX2VpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0KLSAgICBWUDhfQ09NTU9OICpjb25zdCBjbSA9ICYgY3BpLT5jb21tb247Ci0gICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJiB4LT5lX21iZDsKLSAgICBpbnQgaTsKLSAgICAodm9pZCkgbWJfcm93OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgICBNQUNST0JMT0NLICptYiA9ICYgbWJyX2VpW2ldLm1iOwotICAgICAgICBNQUNST0JMT0NLRCAqbWJkID0gJm1iLT5lX21iZDsKLQotICAgICAgICBtYmQtPnN1YnBpeGVsX3ByZWRpY3QgICAgICAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3Q7Ci0gICAgICAgIG1iZC0+c3VicGl4ZWxfcHJlZGljdDh4NCAgICAgPSB4ZC0+c3VicGl4ZWxfcHJlZGljdDh4NDsKLSAgICAgICAgbWJkLT5zdWJwaXhlbF9wcmVkaWN0OHg4ICAgICA9IHhkLT5zdWJwaXhlbF9wcmVkaWN0OHg4OwotICAgICAgICBtYmQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNiAgID0geGQtPnN1YnBpeGVsX3ByZWRpY3QxNngxNjsKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgIG1iZC0+cnRjZCAgICAgICAgICAgICAgICAgICA9IHhkLT5ydGNkOwotI2VuZGlmCi0gICAgICAgIG1iLT5nZl9hY3RpdmVfcHRyICAgICAgICAgICAgPSB4LT5nZl9hY3RpdmVfcHRyOwotCi0gICAgICAgIG1iLT52ZWN0b3JfcmFuZ2UgICAgICAgICAgICAgPSAzMjsKLQotICAgICAgICB2cHhfbWVtc2V0KG1icl9laVtpXS5zZWdtZW50X2NvdW50cywgMCwgc2l6ZW9mKG1icl9laVtpXS5zZWdtZW50X2NvdW50cykpOwotICAgICAgICBtYnJfZWlbaV0udG90YWxyYXRlID0gMDsKLQotICAgICAgICBtYi0+cGFydGl0aW9uX2luZm8gPSB4LT5waSArIHgtPmVfbWJkLm1vZGVfaW5mb19zdHJpZGUgKiAoaSArIDEpOwotCi0gICAgICAgIG1iZC0+bW9kZV9pbmZvX2NvbnRleHQgPSBjbS0+bWkgICArIHgtPmVfbWJkLm1vZGVfaW5mb19zdHJpZGUgKiAoaSArIDEpOwotICAgICAgICBtYmQtPm1vZGVfaW5mb19zdHJpZGUgID0gY20tPm1vZGVfaW5mb19zdHJpZGU7Ci0KLSAgICAgICAgbWJkLT5mcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7Ci0KLSAgICAgICAgbWJkLT5mcmFtZXNfc2luY2VfZ29sZGVuID0gY20tPmZyYW1lc19zaW5jZV9nb2xkZW47Ci0gICAgICAgIG1iZC0+ZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZSA9IGNtLT5mcmFtZXNfdGlsbF9hbHRfcmVmX2ZyYW1lOwotCi0gICAgICAgIG1iLT5zcmMgPSAqIGNwaS0+U291cmNlOwotICAgICAgICBtYmQtPnByZSA9IGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XTsKLSAgICAgICAgbWJkLT5kc3QgPSBjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF07Ci0KLSAgICAgICAgbWItPnNyYy55X2J1ZmZlciArPSAxNiAqIHgtPnNyYy55X3N0cmlkZSAqIChpICsgMSk7Ci0gICAgICAgIG1iLT5zcmMudV9idWZmZXIgKz0gIDggKiB4LT5zcmMudXZfc3RyaWRlICogKGkgKyAxKTsKLSAgICAgICAgbWItPnNyYy52X2J1ZmZlciArPSAgOCAqIHgtPnNyYy51dl9zdHJpZGUgKiAoaSArIDEpOwotCi0gICAgICAgIHZwOF9idWlsZF9ibG9ja19vZmZzZXRzKG1iKTsKLQotICAgICAgICB2cDhfc2V0dXBfYmxvY2tfZHB0cnMobWJkKTsKLQotICAgICAgICB2cDhfc2V0dXBfYmxvY2tfcHRycyhtYik7Ci0KLSAgICAgICAgbWItPmFjdGl2aXR5X3N1bSA9IDA7Ci0KLSAgICAgICAgbWJkLT5sZWZ0X2NvbnRleHQgPSAmY20tPmxlZnRfY29udGV4dDsKLSAgICAgICAgbWItPm12YyA9IGNtLT5mYy5tdmM7Ci0KLSAgICAgICAgc2V0dXBfbWJieV9jb3B5KCZtYnJfZWlbaV0ubWIsIHgpOwotCi0gICAgfQotfQotCi12b2lkIHZwOGN4X2NyZWF0ZV9lbmNvZGVyX3RocmVhZHMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBjb25zdCBWUDhfQ09NTU9OICogY20gPSAmY3BpLT5jb21tb247Ci0KLSAgICBjcGktPmJfbXVsdGlfdGhyZWFkZWQgPSAwOwotICAgIGNwaS0+ZW5jb2RpbmdfdGhyZWFkX2NvdW50ID0gMDsKLSAgICBjcGktPnByb2Nlc3Nvcl9jb3JlX2NvdW50ID0gMzI7IC8vdnA4X2dldF9wcm9jX2NvcmVfY291bnQoKTsKLQotICAgIGlmIChjcGktPnByb2Nlc3Nvcl9jb3JlX2NvdW50ID4gMSAmJiBjcGktPm94Y2YubXVsdGlfdGhyZWFkZWQgPiAxKQotICAgIHsKLSAgICAgICAgaW50IGl0aHJlYWQ7Ci0gICAgICAgIGludCB0aF9jb3VudCA9IGNwaS0+b3hjZi5tdWx0aV90aHJlYWRlZCAtIDE7Ci0KLSAgICAgICAgaWYgKGNwaS0+b3hjZi5tdWx0aV90aHJlYWRlZCA+IGNwaS0+cHJvY2Vzc29yX2NvcmVfY291bnQpCi0gICAgICAgICAgICB0aF9jb3VudCA9IGNwaS0+cHJvY2Vzc29yX2NvcmVfY291bnQgLSAxOwotCi0gICAgICAgIC8qIHdlIGhhdmUgdGhfY291bnQgKyAxIChtYWluKSB0aHJlYWRzIHByb2Nlc3Npbmcgb25lIHJvdyBlYWNoICovCi0gICAgICAgIC8qIG5vIHBvaW50IHRvIGhhdmUgbW9yZSB0aHJlYWRzIHRoYW4gdGhlIHN5bmMgcmFuZ2UgYWxsb3dzICovCi0gICAgICAgIGlmKHRoX2NvdW50ID4gKChjbS0+bWJfY29scyAvIGNwaS0+bXRfc3luY19yYW5nZSkgLSAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhfY291bnQgPSAoY20tPm1iX2NvbHMgLyBjcGktPm10X3N5bmNfcmFuZ2UpIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoX2NvdW50ID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+aF9lbmNvZGluZ190aHJlYWQsIHZweF9tYWxsb2Moc2l6ZW9mKHB0aHJlYWRfdCkgKiB0aF9jb3VudCkpOwotICAgICAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nLCB2cHhfbWFsbG9jKHNpemVvZihzZW1fdCkgKiB0aF9jb3VudCkpOwotICAgICAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5tYl9yb3dfZWksIHZweF9tZW1hbGlnbigzMiwgc2l6ZW9mKE1CX1JPV19DT01QKSAqIHRoX2NvdW50KSk7Ci0gICAgICAgIHZweF9tZW1zZXQoY3BpLT5tYl9yb3dfZWksIDAsIHNpemVvZihNQl9ST1dfQ09NUCkgKiB0aF9jb3VudCk7Ci0gICAgICAgIENIRUNLX01FTV9FUlJPUihjcGktPmVuX3RocmVhZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgdnB4X21hbGxvYyhzaXplb2YoRU5DT0RFVEhSRUFEX0RBVEEpICogdGhfY291bnQpKTsKLSAgICAgICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+bXRfY3VycmVudF9tYl9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWFsbG9jKHNpemVvZigqY3BpLT5tdF9jdXJyZW50X21iX2NvbCkgKiBjbS0+bWJfcm93cykpOwotCi0gICAgICAgIHNlbV9pbml0KCZjcGktPmhfZXZlbnRfZW5kX2VuY29kaW5nLCAwLCAwKTsKLQotICAgICAgICBjcGktPmJfbXVsdGlfdGhyZWFkZWQgPSAxOwotICAgICAgICBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudCA9IHRoX2NvdW50OwotCi0gICAgICAgIC8qCi0gICAgICAgIHByaW50ZigiW1ZQODpdIG11bHRpX3RocmVhZGVkIGVuY29kaW5nIGlzIGVuYWJsZWQgd2l0aCAlZCB0aHJlYWRzXG5cbiIsCi0gICAgICAgICAgICAgICAoY3BpLT5lbmNvZGluZ190aHJlYWRfY291bnQgKzEpKTsKLSAgICAgICAgKi8KLQotICAgICAgICBmb3IgKGl0aHJlYWQgPSAwOyBpdGhyZWFkIDwgdGhfY291bnQ7IGl0aHJlYWQrKykKLSAgICAgICAgewotICAgICAgICAgICAgRU5DT0RFVEhSRUFEX0RBVEEgKiBldGhkID0gJmNwaS0+ZW5fdGhyZWFkX2RhdGFbaXRocmVhZF07Ci0KLSAgICAgICAgICAgIHNlbV9pbml0KCZjcGktPmhfZXZlbnRfc3RhcnRfZW5jb2RpbmdbaXRocmVhZF0sIDAsIDApOwotICAgICAgICAgICAgZXRoZC0+aXRocmVhZCA9IGl0aHJlYWQ7Ci0gICAgICAgICAgICBldGhkLT5wdHIxID0gKHZvaWQgKiljcGk7Ci0gICAgICAgICAgICBldGhkLT5wdHIyID0gKHZvaWQgKikmY3BpLT5tYl9yb3dfZWlbaXRocmVhZF07Ci0KLSAgICAgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZjcGktPmhfZW5jb2RpbmdfdGhyZWFkW2l0aHJlYWRdLCAwLCB0aHJlYWRfZW5jb2RpbmdfcHJvYywgZXRoZCk7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAgICAgICBMUEZUSFJFQURfREFUQSAqIGxwZnRoZCA9ICZjcGktPmxwZl90aHJlYWRfZGF0YTsKLQotICAgICAgICAgICAgc2VtX2luaXQoJmNwaS0+aF9ldmVudF9zdGFydF9scGYsIDAsIDApOwotICAgICAgICAgICAgc2VtX2luaXQoJmNwaS0+aF9ldmVudF9lbmRfbHBmLCAwLCAwKTsKLQotICAgICAgICAgICAgbHBmdGhkLT5wdHIxID0gKHZvaWQgKiljcGk7Ci0gICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmY3BpLT5oX2ZpbHRlcl90aHJlYWQsIDAsIGxvb3BmaWx0ZXJfdGhyZWFkLCBscGZ0aGQpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLXZvaWQgdnA4Y3hfcmVtb3ZlX2VuY29kZXJfdGhyZWFkcyhWUDhfQ09NUCAqY3BpKQotewotICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCi0gICAgewotICAgICAgICAvL3NodXRkb3duIG90aGVyIHRocmVhZHMKLSAgICAgICAgY3BpLT5iX211bHRpX3RocmVhZGVkID0gMDsKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGktPmVuY29kaW5nX3RocmVhZF9jb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vU2V0RXZlbnQoY3BpLT5oX2V2ZW50X21icmVuY29kaW5nW2ldKTsKLSAgICAgICAgICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2ldKTsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4oY3BpLT5oX2VuY29kaW5nX3RocmVhZFtpXSwgMCk7Ci0KLSAgICAgICAgICAgICAgICBzZW1fZGVzdHJveSgmY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VtX3Bvc3QoJmNwaS0+aF9ldmVudF9zdGFydF9scGYpOwotICAgICAgICAgICAgcHRocmVhZF9qb2luKGNwaS0+aF9maWx0ZXJfdGhyZWFkLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbV9kZXN0cm95KCZjcGktPmhfZXZlbnRfZW5kX2VuY29kaW5nKTsKLSAgICAgICAgc2VtX2Rlc3Ryb3koJmNwaS0+aF9ldmVudF9lbmRfbHBmKTsKLSAgICAgICAgc2VtX2Rlc3Ryb3koJmNwaS0+aF9ldmVudF9zdGFydF9scGYpOwotCi0gICAgICAgIC8vZnJlZSB0aHJlYWQgcmVsYXRlZCByZXNvdXJjZXMKLSAgICAgICAgdnB4X2ZyZWUoY3BpLT5oX2V2ZW50X3N0YXJ0X2VuY29kaW5nKTsKLSAgICAgICAgdnB4X2ZyZWUoY3BpLT5oX2VuY29kaW5nX3RocmVhZCk7Ci0gICAgICAgIHZweF9mcmVlKGNwaS0+bWJfcm93X2VpKTsKLSAgICAgICAgdnB4X2ZyZWUoY3BpLT5lbl90aHJlYWRfZGF0YSk7Ci0gICAgICAgIHZweF9mcmVlKGNwaS0+bXRfY3VycmVudF9tYl9jb2wpOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvZmlyc3RwYXNzLmMgYi92cDgvZW5jb2Rlci9maXJzdHBhc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5NDMzYi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9maXJzdHBhc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NTEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0jaW5jbHVkZSAibWF0aC5oIgotI2luY2x1ZGUgImxpbWl0cy5oIgotI2luY2x1ZGUgImJsb2NrLmgiCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLSNpbmNsdWRlICJ2YXJpYW5jZS5oIgotI2luY2x1ZGUgImVuY29kZWludHJhLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zZXR1cGludHJhcmVjb24uaCIKLSNpbmNsdWRlICJtY29tcC5oIgotI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgotI2luY2x1ZGUgImVuY29kZW1iLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9leHRlbmQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgotI2luY2x1ZGUgInZweF9zY2FsZS95djEyZXh0ZW5kLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicmRvcHQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oIgotI2luY2x1ZGUgImVuY29kZW12LmgiCi0KLS8vI2RlZmluZSBPVVRQVVRfRlBGIDEKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgSUZfUlRDRCh4KSAoeCkKLSNlbHNlCi0jZGVmaW5lIElGX1JUQ0QoeCkgTlVMTAotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHZwOF9idWlsZF9ibG9ja19vZmZzZXRzKE1BQ1JPQkxPQ0sgKngpOwotZXh0ZXJuIHZvaWQgdnA4X3NldHVwX2Jsb2NrX3B0cnMoTUFDUk9CTE9DSyAqeCk7Ci1leHRlcm4gdm9pZCB2cDhjeF9mcmFtZV9pbml0X3F1YW50aXplcihWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOF9zZXRfbWJtb2RlX2FuZF9tdnMoTUFDUk9CTE9DSyAqeCwgTUJfUFJFRElDVElPTl9NT0RFIG1iLCBNViAqbXYpOwotZXh0ZXJuIHZvaWQgdnA4X2FsbG9jX2NvbXByZXNzb3JfZGF0YShWUDhfQ09NUCAqY3BpKTsKLQotLy8jZGVmaW5lIEdGUV9BREpVU1RNRU5UICg0MCArICgoMTUqUSkvMTApKQotLy8jZGVmaW5lIEdGUV9BREpVU1RNRU5UICg4MCArICgoMTUqUSkvMTApKQotI2RlZmluZSBHRlFfQURKVVNUTUVOVCB2cDhfZ2ZfYm9vc3RfcWFkanVzdG1lbnRbUV0KLWV4dGVybiBpbnQgdnA4X2tmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV07Ci0KLWV4dGVybiBjb25zdCBpbnQgdnA4X2dmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV07Ci0KLSNkZWZpbmUgSUlGQUNUT1IgICAxLjQKLSNkZWZpbmUgSUlLRkFDVE9SMSAxLjQwCi0jZGVmaW5lIElJS0ZBQ1RPUjIgMS41Ci0jZGVmaW5lIFJNQVggICAgICAgMTQuMAotI2RlZmluZSBHRl9STUFYICAgIDQ4LjAKLQotI2RlZmluZSBLRl9NQl9JTlRSQV9NSU4gMzAwCi0jZGVmaW5lIEdGX01CX0lOVFJBX01JTiAyMDAKLQotI2RlZmluZSBET1VCTEVfRElWSURFX0NIRUNLKFgpICgoWCk8MD8oWCktLjAwMDAwMTooWCkrLjAwMDAwMSkKLQotI2RlZmluZSBQT1cxIChkb3VibGUpY3BpLT5veGNmLnR3b19wYXNzX3ZicmJpYXMvMTAwLjAKLSNkZWZpbmUgUE9XMiAoZG91YmxlKWNwaS0+b3hjZi50d29fcGFzc192YnJiaWFzLzEwMC4wCi0KLXN0YXRpYyBpbnQgdnNjYWxlX2xvb2t1cFs3XSA9IHswLCAxLCAxLCAyLCAyLCAzLCAzfTsKLXN0YXRpYyBpbnQgaHNjYWxlX2xvb2t1cFs3XSA9IHswLCAwLCAxLCAxLCAyLCAyLCAzfTsKLQotCi1zdGF0aWMgY29uc3QgaW50IGNxX2xldmVsW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwxLDEsMiwzLDMsNCw0LDUsNiw2LDcsOCw4LDksCi0gICAgOSwxMCwxMSwxMSwxMiwxMywxMywxNCwxNSwxNSwxNiwxNywxNywxOCwxOSwyMCwKLSAgICAyMCwyMSwyMiwyMiwyMywyNCwyNCwyNSwyNiwyNywyNywyOCwyOSwzMCwzMCwzMSwKLSAgICAzMiwzMywzMywzNCwzNSwzNiwzNiwzNywzOCwzOSwzOSw0MCw0MSw0Miw0Miw0MywKLSAgICA0NCw0NSw0Niw0Niw0Nyw0OCw0OSw1MCw1MCw1MSw1Miw1Myw1NCw1NSw1NSw1NiwKLSAgICA1Nyw1OCw1OSw2MCw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2Nyw2OCw2OSw3MCwKLSAgICA3MSw3Miw3Myw3NCw3NSw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSwKLSAgICA4Niw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAKLX07Ci0KLXN0YXRpYyB2b2lkIGZpbmRfbmV4dF9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICp0aGlzX2ZyYW1lKTsKLQotc3RhdGljIGludCBlbmNvZGVfaW50cmEoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50IHVzZV9kY19wcmVkKQotewotCi0gICAgaW50IGk7Ci0gICAgaW50IGludHJhX3ByZWRfdmFyID0gMDsKLSAgICAodm9pZCkgY3BpOwotCi0gICAgaWYgKHVzZV9kY19wcmVkKQotICAgIHsKLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IERDX1BSRUQ7Ci0gICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSBEQ19QUkVEOwotICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPSBJTlRSQV9GUkFNRTsKLQotICAgICAgICB2cDhfZW5jb2RlX2ludHJhMTZ4MTZtYnkoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCTE9DS0QgKmIgPSAmeC0+ZV9tYmQuYmxvY2tbaV07Ci0gICAgICAgICAgICBCTE9DSyAgKmJlID0gJngtPmJsb2NrW2ldOwotCi0gICAgICAgICAgICB2cDhfZW5jb2RlX2ludHJhNHg0YmxvY2soSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCwgYmUsIGIsIEJfRENfUFJFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRyYV9wcmVkX3ZhciA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBnZXRtYnNzKSh4LT5zcmNfZGlmZik7Ci0KLSAgICByZXR1cm4gaW50cmFfcHJlZF92YXI7Ci19Ci0KLS8vIFJlc2V0cyB0aGUgZmlyc3QgcGFzcyBmaWxlIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiB1c2luZyBhIHJlbGF0aXZlIHNlZWsgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbgotc3RhdGljIHZvaWQgcmVzZXRfZnBmX3Bvc2l0aW9uKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqUG9zaXRpb24pCi17Ci0gICAgY3BpLT5zdGF0c19pbiA9IFBvc2l0aW9uOwotfQotCi1zdGF0aWMgaW50IGxvb2t1cF9uZXh0X2ZyYW1lX3N0YXRzKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqbmV4dF9mcmFtZSkKLXsKLSAgICBpZiAoY3BpLT5zdGF0c19pbiA+PSBjcGktPnN0YXRzX2luX2VuZCkKLSAgICAgICAgcmV0dXJuIEVPRjsKLQotICAgICpuZXh0X2ZyYW1lID0gKmNwaS0+c3RhdHNfaW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8vIENhbGN1bGF0ZSBhIG1vZGlmaWVkIEVycm9yIHVzZWQgaW4gZGlzdHJpYnV0aW5nIGJpdHMgYmV0d2VlbiBlYXNpZXIgYW5kIGhhcmRlciBmcmFtZXMKLXN0YXRpYyBkb3VibGUgY2FsY3VsYXRlX21vZGlmaWVkX2VycihWUDhfQ09NUCAqY3BpLCBGSVJTVFBBU1NfU1RBVFMgKnRoaXNfZnJhbWUpCi17Ci0gICAgZG91YmxlIGF2X2VyciA9IGNwaS0+dG90YWxfc3RhdHMtPnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnI7Ci0gICAgZG91YmxlIHRoaXNfZXJyID0gdGhpc19mcmFtZS0+c3NpbV93ZWlnaHRlZF9wcmVkX2VycjsKLSAgICBkb3VibGUgbW9kaWZpZWRfZXJyOwotCi0gICAgLy9kb3VibGUgcmVsYXRpdmVfbmV4dF9paXJhdGlvOwotICAgIC8vZG91YmxlIG5leHRfaWlyYXRpbzsKLSAgICAvL2RvdWJsZSBzdW1faWlyYXRpbzsKLSAgICAvL2ludCBpOwotCi0gICAgLy9GSVJTVFBBU1NfU1RBVFMgbmV4dF9mcmFtZTsKLSAgICAvL0ZJUlNUUEFTU19TVEFUUyAqc3RhcnRfcG9zOwotCi0gICAgLypzdGFydF9wb3MgPSBjcGktPnN0YXRzX2luOwotICAgIHN1bV9paXJhdGlvID0gMC4wOwotICAgIGkgPSAwOwotICAgIHdoaWxlICggKGkgPCAxKSAmJiBpbnB1dF9zdGF0cyhjcGksJm5leHRfZnJhbWUpICE9IEVPRiApCi0gICAgewotCi0gICAgICAgIG5leHRfaWlyYXRpbyA9IG5leHRfZnJhbWUuaW50cmFfZXJyb3IgLyBET1VCTEVfRElWSURFX0NIRUNLKG5leHRfZnJhbWUuY29kZWRfZXJyb3IpOwotICAgICAgICBuZXh0X2lpcmF0aW8gPSAoIG5leHRfaWlyYXRpbyA8IDEuMCApID8gMS4wIDogKG5leHRfaWlyYXRpbyA+IDIwLjApID8gMjAuMCA6IG5leHRfaWlyYXRpbzsKLSAgICAgICAgc3VtX2lpcmF0aW8gKz0gbmV4dF9paXJhdGlvOwotICAgICAgICBpKys7Ci0gICAgfQotICAgIGlmICggaSA+IDAgKQotICAgIHsKLSAgICAgICAgcmVsYXRpdmVfbmV4dF9paXJhdGlvID0gc3VtX2lpcmF0aW8gLyBET1VCTEVfRElWSURFX0NIRUNLKGNwaS0+YXZnX2lpcmF0aW8gKiAoZG91YmxlKWkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZWxhdGl2ZV9uZXh0X2lpcmF0aW8gPSAxLjA7Ci0gICAgfQotICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIHN0YXJ0X3Bvcyk7Ki8KLQotICAgIGlmICh0aGlzX2VyciA+IGF2X2VycikKLSAgICAgICAgbW9kaWZpZWRfZXJyID0gYXZfZXJyICogcG93KCh0aGlzX2VyciAvIERPVUJMRV9ESVZJREVfQ0hFQ0soYXZfZXJyKSksIFBPVzEpOwotICAgIGVsc2UKLSAgICAgICAgbW9kaWZpZWRfZXJyID0gYXZfZXJyICogcG93KCh0aGlzX2VyciAvIERPVUJMRV9ESVZJREVfQ0hFQ0soYXZfZXJyKSksIFBPVzIpOwotCi0gICAgLyoKLSAgICByZWxhdGl2ZV9uZXh0X2lpcmF0aW8gPSBwb3cocmVsYXRpdmVfbmV4dF9paXJhdGlvLDAuMjUpOwotICAgIG1vZGlmaWVkX2VyciA9IG1vZGlmaWVkX2VyciAqIHJlbGF0aXZlX25leHRfaWlyYXRpbzsKLSAgICAqLwotCi0gICAgcmV0dXJuIG1vZGlmaWVkX2VycjsKLX0KLQotc3RhdGljIGNvbnN0IGRvdWJsZSB3ZWlnaHRfdGFibGVbMjU2XSA9IHsKLTAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwKLTAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwKLTAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwKLTAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwgMC4wMjAwMDAsIDAuMDIwMDAwLCAwLjAyMDAwMCwKLTAuMDIwMDAwLCAwLjAzMTI1MCwgMC4wNjI1MDAsIDAuMDkzNzUwLCAwLjEyNTAwMCwgMC4xNTYyNTAsIDAuMTg3NTAwLCAwLjIxODc1MCwKLTAuMjUwMDAwLCAwLjI4MTI1MCwgMC4zMTI1MDAsIDAuMzQzNzUwLCAwLjM3NTAwMCwgMC40MDYyNTAsIDAuNDM3NTAwLCAwLjQ2ODc1MCwKLTAuNTAwMDAwLCAwLjUzMTI1MCwgMC41NjI1MDAsIDAuNTkzNzUwLCAwLjYyNTAwMCwgMC42NTYyNTAsIDAuNjg3NTAwLCAwLjcxODc1MCwKLTAuNzUwMDAwLCAwLjc4MTI1MCwgMC44MTI1MDAsIDAuODQzNzUwLCAwLjg3NTAwMCwgMC45MDYyNTAsIDAuOTM3NTAwLCAwLjk2ODc1MCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwKLTEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDEuMDAwMDAwLCAxLjAwMDAwMAotfTsKLQotc3RhdGljIGRvdWJsZSBzaW1wbGVfd2VpZ2h0KFlWMTJfQlVGRkVSX0NPTkZJRyAqc291cmNlKQotewotICAgIGludCBpLCBqOwotCi0gICAgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlLT55X2J1ZmZlcjsKLSAgICBkb3VibGUgc3VtX3dlaWdodHMgPSAwLjA7Ci0KLSAgICAvLyBMb29wIHRocm91Z2h0IHRoZSBZIHBsYW5lIHJhdyBleGFtaW5pbmcgbGV2ZWxzIGFuZCBjcmVhdGluZyBhIHdlaWdodCBmb3IgdGhlIGltYWdlCi0gICAgaSA9IHNvdXJjZS0+eV9oZWlnaHQ7Ci0gICAgZG8KLSAgICB7Ci0gICAgICAgIGogPSBzb3VyY2UtPnlfd2lkdGg7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1bV93ZWlnaHRzICs9IHdlaWdodF90YWJsZVsgKnNyY107Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgfXdoaWxlKC0taik7Ci0gICAgICAgIHNyYyAtPSBzb3VyY2UtPnlfd2lkdGg7Ci0gICAgICAgIHNyYyArPSBzb3VyY2UtPnlfc3RyaWRlOwotICAgIH13aGlsZSgtLWkpOwotCi0gICAgc3VtX3dlaWdodHMgLz0gKHNvdXJjZS0+eV9oZWlnaHQgKiBzb3VyY2UtPnlfd2lkdGgpOwotCi0gICAgcmV0dXJuIHN1bV93ZWlnaHRzOwotfQotCi0KLS8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBwZXIgZnJhbWUgbWF4aW11bSBiaXRyYXRlIHRhcmdldAotc3RhdGljIGludCBmcmFtZV9tYXhfYml0cyhWUDhfQ09NUCAqY3BpKQotewotICAgIC8vIE1heCBhbGxvY2F0aW9uIGZvciBhIHNpbmdsZSBmcmFtZSBiYXNlZCBvbiB0aGUgbWF4IHNlY3Rpb24gZ3VpZGVsaW5lcyBwYXNzZWQgaW4gYW5kIGhvdyBtYW55IGJpdHMgYXJlIGxlZnQKLSAgICBpbnQgbWF4X2JpdHM7Ci0KLSAgICAvLyBGb3IgQ0JSIHdlIG5lZWQgdG8gYWxzbyBjb25zaWRlciBidWZmZXIgZnVsbG5lc3MuCi0gICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgYmVsb3cgdGhlIG9wdGltYWwgbGV2ZWwgdGhlbiB3ZSBuZWVkIHRvIGdyYWR1YWxseSB0aWdodGVuIHVwIG9uIG1heF9iaXRzLgotICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikKLSAgICB7Ci0gICAgICAgIGRvdWJsZSBidWZmZXJfZnVsbG5lc3NfcmF0aW8gPSAoZG91YmxlKWNwaS0+YnVmZmVyX2xldmVsIC8gRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCk7Ci0KLSAgICAgICAgLy8gRm9yIENCUiBiYXNlIHRoaXMgb24gdGhlIHRhcmdldCBhdmVyYWdlIGJpdHMgcGVyIGZyYW1lIHBsdXMgdGhlIG1heGltdW0gc2VkY3Rpb24gcmF0ZSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIKLSAgICAgICAgbWF4X2JpdHMgPSAoaW50KShjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggKiAoKGRvdWJsZSljcGktPm94Y2YudHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24gLyAxMDAuMCkpOwotCi0gICAgICAgIC8vIElmIG91ciBidWZmZXIgaXMgYmVsb3cgdGhlIG9wdGltdW0gbGV2ZWwKLSAgICAgICAgaWYgKGJ1ZmZlcl9mdWxsbmVzc19yYXRpbyA8IDEuMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIGxvd2VyIG9mIG1heF9iaXRzIC8gNCBvciBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggLyA0LgotICAgICAgICAgICAgaW50IG1pbl9tYXhfYml0cyA9ICgoY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoID4+IDIpIDwgKG1heF9iaXRzID4+IDIpKSA/IGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCA+PiAyIDogbWF4X2JpdHMgPj4gMjsKLQotICAgICAgICAgICAgbWF4X2JpdHMgPSAoaW50KShtYXhfYml0cyAqIGJ1ZmZlcl9mdWxsbmVzc19yYXRpbyk7Ci0KLSAgICAgICAgICAgIGlmIChtYXhfYml0cyA8IG1pbl9tYXhfYml0cykKLSAgICAgICAgICAgICAgICBtYXhfYml0cyA9IG1pbl9tYXhfYml0czsgICAgICAgLy8gTG93ZXN0IHZhbHVlIHdlIHdpbGwgc2V0IC4uLiB3aGljaCBzaG91bGQgYWxsb3cgdGhlIGJ1ZmZlciB0byByZWZpbC4KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBWQlIKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBGb3IgVkJSIGJhc2UgdGhpcyBvbiB0aGUgYml0cyBhbmQgZnJhbWVzIGxlZnQgcGx1cyB0aGUgdHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24gcmF0ZSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIKLSAgICAgICAgbWF4X2JpdHMgPSAoaW50KSgoKGRvdWJsZSljcGktPmJpdHNfbGVmdCAvIChjcGktPnRvdGFsX3N0YXRzLT5jb3VudCAtIChkb3VibGUpY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSkpICogKChkb3VibGUpY3BpLT5veGNmLnR3b19wYXNzX3Zicm1heF9zZWN0aW9uIC8gMTAwLjApKTsKLSAgICB9Ci0KLSAgICAvLyBUcmFwIGNhc2Ugd2hlcmUgd2UgYXJlIG91dCBvZiBiaXRzCi0gICAgaWYgKG1heF9iaXRzIDwgMCkKLSAgICAgICAgbWF4X2JpdHMgPSAwOwotCi0gICAgcmV0dXJuIG1heF9iaXRzOwotfQotCi0KLXN0YXRpYyB2b2lkIG91dHB1dF9zdGF0cyhjb25zdCBWUDhfQ09NUCAgICAgICAgICAgICpjcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAqcGt0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVJTVFBBU1NfU1RBVFMgICAgICAgICAgICAqc3RhdHMpCi17Ci0gICAgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgcGt0OwotICAgIHBrdC5raW5kID0gVlBYX0NPREVDX1NUQVRTX1BLVDsKLSAgICBwa3QuZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiA9IHN0YXRzOwotICAgIHBrdC5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3ogPSBzaXplb2YoRklSU1RQQVNTX1NUQVRTKTsKLSAgICB2cHhfY29kZWNfcGt0X2xpc3RfYWRkKHBrdGxpc3QsICZwa3QpOwotCi0vLyBURU1QIGRlYnVnIGNvZGUKLSNpZiBPVVRQVVRfRlBGCi0KLSAgICB7Ci0gICAgICAgIEZJTEUgKmZwZmlsZTsKLSAgICAgICAgZnBmaWxlID0gZm9wZW4oImZpcnN0cGFzcy5zdHQiLCAiYSIpOwotCi0gICAgICAgIGZwcmludGYoZnBmaWxlLCAiJTEyLjBmICUxMi4wZiAlMTIuMGYgJTEyLjRmICUxMi40ZiAlMTIuNGYgJTEyLjRmIgotICAgICAgICAgICAgICAgICIgJTEyLjRmICUxMi40ZiAlMTIuNGYgJTEyLjRmICUxMi40ZiAlMTIuNGYgJTEyLjRmICUxMi40ZiIKLSAgICAgICAgICAgICAgICAiICUxMi4wZiAlMTIuNGZcbiIsCi0gICAgICAgICAgICAgICAgc3RhdHMtPmZyYW1lLAotICAgICAgICAgICAgICAgIHN0YXRzLT5pbnRyYV9lcnJvciwKLSAgICAgICAgICAgICAgICBzdGF0cy0+Y29kZWRfZXJyb3IsCi0gICAgICAgICAgICAgICAgc3RhdHMtPnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnIsCi0gICAgICAgICAgICAgICAgc3RhdHMtPnBjbnRfaW50ZXIsCi0gICAgICAgICAgICAgICAgc3RhdHMtPnBjbnRfbW90aW9uLAotICAgICAgICAgICAgICAgIHN0YXRzLT5wY250X3NlY29uZF9yZWYsCi0gICAgICAgICAgICAgICAgc3RhdHMtPnBjbnRfbmV1dHJhbCwKLSAgICAgICAgICAgICAgICBzdGF0cy0+TVZyLAotICAgICAgICAgICAgICAgIHN0YXRzLT5tdnJfYWJzLAotICAgICAgICAgICAgICAgIHN0YXRzLT5NVmMsCi0gICAgICAgICAgICAgICAgc3RhdHMtPm12Y19hYnMsCi0gICAgICAgICAgICAgICAgc3RhdHMtPk1WcnYsCi0gICAgICAgICAgICAgICAgc3RhdHMtPk1WY3YsCi0gICAgICAgICAgICAgICAgc3RhdHMtPm12X2luX291dF9jb3VudCwKLSAgICAgICAgICAgICAgICBzdGF0cy0+Y291bnQsCi0gICAgICAgICAgICAgICAgc3RhdHMtPmR1cmF0aW9uKTsKLSAgICAgICAgZmNsb3NlKGZwZmlsZSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgaW5wdXRfc3RhdHMoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICpmcHMpCi17Ci0gICAgaWYgKGNwaS0+c3RhdHNfaW4gPj0gY3BpLT5zdGF0c19pbl9lbmQpCi0gICAgICAgIHJldHVybiBFT0Y7Ci0KLSAgICAqZnBzID0gKmNwaS0+c3RhdHNfaW47Ci0gICAgY3BpLT5zdGF0c19pbiA9ICh2b2lkKikoKGNoYXIgKiljcGktPnN0YXRzX2luICsgc2l6ZW9mKEZJUlNUUEFTU19TVEFUUykpOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCB6ZXJvX3N0YXRzKEZJUlNUUEFTU19TVEFUUyAqc2VjdGlvbikKLXsKLSAgICBzZWN0aW9uLT5mcmFtZSAgICAgID0gMC4wOwotICAgIHNlY3Rpb24tPmludHJhX2Vycm9yID0gMC4wOwotICAgIHNlY3Rpb24tPmNvZGVkX2Vycm9yID0gMC4wOwotICAgIHNlY3Rpb24tPnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnIgPSAwLjA7Ci0gICAgc2VjdGlvbi0+cGNudF9pbnRlciAgPSAwLjA7Ci0gICAgc2VjdGlvbi0+cGNudF9tb3Rpb24gID0gMC4wOwotICAgIHNlY3Rpb24tPnBjbnRfc2Vjb25kX3JlZiA9IDAuMDsKLSAgICBzZWN0aW9uLT5wY250X25ldXRyYWwgPSAwLjA7Ci0gICAgc2VjdGlvbi0+TVZyICAgICAgICA9IDAuMDsKLSAgICBzZWN0aW9uLT5tdnJfYWJzICAgICA9IDAuMDsKLSAgICBzZWN0aW9uLT5NVmMgICAgICAgID0gMC4wOwotICAgIHNlY3Rpb24tPm12Y19hYnMgICAgID0gMC4wOwotICAgIHNlY3Rpb24tPk1WcnYgICAgICAgPSAwLjA7Ci0gICAgc2VjdGlvbi0+TVZjdiAgICAgICA9IDAuMDsKLSAgICBzZWN0aW9uLT5tdl9pbl9vdXRfY291bnQgID0gMC4wOwotICAgIHNlY3Rpb24tPmNvdW50ICAgICAgPSAwLjA7Ci0gICAgc2VjdGlvbi0+ZHVyYXRpb24gICA9IDEuMDsKLX0KLXN0YXRpYyB2b2lkIGFjY3VtdWxhdGVfc3RhdHMoRklSU1RQQVNTX1NUQVRTICpzZWN0aW9uLCBGSVJTVFBBU1NfU1RBVFMgKmZyYW1lKQotewotICAgIHNlY3Rpb24tPmZyYW1lICs9IGZyYW1lLT5mcmFtZTsKLSAgICBzZWN0aW9uLT5pbnRyYV9lcnJvciArPSBmcmFtZS0+aW50cmFfZXJyb3I7Ci0gICAgc2VjdGlvbi0+Y29kZWRfZXJyb3IgKz0gZnJhbWUtPmNvZGVkX2Vycm9yOwotICAgIHNlY3Rpb24tPnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnIgKz0gZnJhbWUtPnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnI7Ci0gICAgc2VjdGlvbi0+cGNudF9pbnRlciAgKz0gZnJhbWUtPnBjbnRfaW50ZXI7Ci0gICAgc2VjdGlvbi0+cGNudF9tb3Rpb24gKz0gZnJhbWUtPnBjbnRfbW90aW9uOwotICAgIHNlY3Rpb24tPnBjbnRfc2Vjb25kX3JlZiArPSBmcmFtZS0+cGNudF9zZWNvbmRfcmVmOwotICAgIHNlY3Rpb24tPnBjbnRfbmV1dHJhbCArPSBmcmFtZS0+cGNudF9uZXV0cmFsOwotICAgIHNlY3Rpb24tPk1WciAgICAgICAgKz0gZnJhbWUtPk1WcjsKLSAgICBzZWN0aW9uLT5tdnJfYWJzICAgICArPSBmcmFtZS0+bXZyX2FiczsKLSAgICBzZWN0aW9uLT5NVmMgICAgICAgICs9IGZyYW1lLT5NVmM7Ci0gICAgc2VjdGlvbi0+bXZjX2FicyAgICAgKz0gZnJhbWUtPm12Y19hYnM7Ci0gICAgc2VjdGlvbi0+TVZydiAgICAgICArPSBmcmFtZS0+TVZydjsKLSAgICBzZWN0aW9uLT5NVmN2ICAgICAgICs9IGZyYW1lLT5NVmN2OwotICAgIHNlY3Rpb24tPm12X2luX291dF9jb3VudCAgKz0gZnJhbWUtPm12X2luX291dF9jb3VudDsKLSAgICBzZWN0aW9uLT5jb3VudCAgICAgICs9IGZyYW1lLT5jb3VudDsKLSAgICBzZWN0aW9uLT5kdXJhdGlvbiAgICs9IGZyYW1lLT5kdXJhdGlvbjsKLX0KLXN0YXRpYyB2b2lkIGF2Z19zdGF0cyhGSVJTVFBBU1NfU1RBVFMgKnNlY3Rpb24pCi17Ci0gICAgaWYgKHNlY3Rpb24tPmNvdW50IDwgMS4wKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzZWN0aW9uLT5pbnRyYV9lcnJvciAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5jb2RlZF9lcnJvciAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5zc2ltX3dlaWdodGVkX3ByZWRfZXJyIC89IHNlY3Rpb24tPmNvdW50OwotICAgIHNlY3Rpb24tPnBjbnRfaW50ZXIgIC89IHNlY3Rpb24tPmNvdW50OwotICAgIHNlY3Rpb24tPnBjbnRfc2Vjb25kX3JlZiAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5wY250X25ldXRyYWwgLz0gc2VjdGlvbi0+Y291bnQ7Ci0gICAgc2VjdGlvbi0+cGNudF9tb3Rpb24gLz0gc2VjdGlvbi0+Y291bnQ7Ci0gICAgc2VjdGlvbi0+TVZyICAgICAgICAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5tdnJfYWJzICAgICAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5NVmMgICAgICAgIC89IHNlY3Rpb24tPmNvdW50OwotICAgIHNlY3Rpb24tPm12Y19hYnMgICAgIC89IHNlY3Rpb24tPmNvdW50OwotICAgIHNlY3Rpb24tPk1WcnYgICAgICAgLz0gc2VjdGlvbi0+Y291bnQ7Ci0gICAgc2VjdGlvbi0+TVZjdiAgICAgICAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5tdl9pbl9vdXRfY291bnQgICAvPSBzZWN0aW9uLT5jb3VudDsKLSAgICBzZWN0aW9uLT5kdXJhdGlvbiAgIC89IHNlY3Rpb24tPmNvdW50OwotfQotCi12b2lkIHZwOF9pbml0X2ZpcnN0X3Bhc3MoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICB6ZXJvX3N0YXRzKGNwaS0+dG90YWxfc3RhdHMpOwotfQotCi12b2lkIHZwOF9lbmRfZmlyc3RfcGFzcyhWUDhfQ09NUCAqY3BpKQotewotICAgIG91dHB1dF9zdGF0cyhjcGksIGNwaS0+b3V0cHV0X3BrdF9saXN0LCBjcGktPnRvdGFsX3N0YXRzKTsKLX0KLQotc3RhdGljIHZvaWQgenpfbW90aW9uX3NlYXJjaCggVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqIHgsIFlWMTJfQlVGRkVSX0NPTkZJRyAqIHJlY29uX2J1ZmZlciwgaW50ICogYmVzdF9tb3Rpb25fZXJyLCBpbnQgcmVjb25feW9mZnNldCApCi17Ci0gICAgTUFDUk9CTE9DS0QgKiBjb25zdCB4ZCA9ICYgeC0+ZV9tYmQ7Ci0gICAgQkxPQ0sgKmIgPSAmeC0+YmxvY2tbMF07Ci0gICAgQkxPQ0tEICpkID0gJngtPmVfbWJkLmJsb2NrWzBdOwotCi0gICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7Ci0gICAgaW50IHNyY19zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHI7Ci0gICAgaW50IHJlZl9zdHJpZGU9ZC0+cHJlX3N0cmlkZTsKLQotICAgIC8vIFNldCB1cCBwb2ludGVycyBmb3IgdGhpcyBtYWNybyBibG9jayByZWNvbiBidWZmZXIKLSAgICB4ZC0+cHJlLnlfYnVmZmVyID0gcmVjb25fYnVmZmVyLT55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0KLSAgICByZWZfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoKihkLT5iYXNlX3ByZSkgKyBkLT5wcmUgKTsKLQotICAgIFZBUklBTkNFX0lOVk9LRShJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpLCBtc2UxNngxNikgKCBzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyLCByZWZfc3RyaWRlLCAodW5zaWduZWQgaW50ICopKGJlc3RfbW90aW9uX2VycikpOwotfQotCi1zdGF0aWMgdm9pZCBmaXJzdF9wYXNzX21vdGlvbl9zZWFyY2goVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgTVYgKnJlZl9tdiwgTVYgKmJlc3RfbXYsIFlWMTJfQlVGRkVSX0NPTkZJRyAqcmVjb25fYnVmZmVyLCBpbnQgKmJlc3RfbW90aW9uX2VyciwgaW50IHJlY29uX3lvZmZzZXQgKQotewotICAgIE1BQ1JPQkxPQ0tEICpjb25zdCB4ZCA9ICYgeC0+ZV9tYmQ7Ci0gICAgQkxPQ0sgKmIgPSAmeC0+YmxvY2tbMF07Ci0gICAgQkxPQ0tEICpkID0gJngtPmVfbWJkLmJsb2NrWzBdOwotICAgIGludCBudW0wMDsKLQotICAgIE1WIHRtcF9tdiA9IHswLCAwfTsKLQotICAgIGludCB0bXBfZXJyOwotICAgIGludCBzdGVwX3BhcmFtID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzM7ICAgICAgICAgIC8vIERvbnQgc2VhcmNoIG92ZXIgZnVsbCByYW5nZSBmb3IgZmlyc3QgcGFzcwotICAgIGludCBmdXJ0aGVyX3N0ZXBzID0gKE1BWF9NVlNFQVJDSF9TVEVQUyAtIDEpIC0gc3RlcF9wYXJhbTsgLy8zOwotICAgIGludCBuOwotICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCB2X2ZuX3B0ciA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XTsKLSAgICBpbnQgbmV3X212X21vZGVfcGVuYWx0eSA9IDI1NjsKLQotICAgIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhcmlhbmNlIGZ1bmN0aW9uIHRvIHVzZSBNU0UKLSAgICB2X2ZuX3B0ci52ZiAgICA9IFZBUklBTkNFX0lOVk9LRShJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpLCBtc2UxNngxNik7Ci0KLSAgICAvLyBTZXQgdXAgcG9pbnRlcnMgZm9yIHRoaXMgbWFjcm8gYmxvY2sgcmVjb24gYnVmZmVyCi0gICAgeGQtPnByZS55X2J1ZmZlciA9IHJlY29uX2J1ZmZlci0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OwotCi0gICAgLy8gSW5pdGlhbCBzdGVwL2RpYW1vbmQgc2VhcmNoIGNlbnRyZWQgb24gYmVzdCBtdgotICAgIHRtcF9lcnIgPSBjcGktPmRpYW1vbmRfc2VhcmNoX3NhZCh4LCBiLCBkLCByZWZfbXYsICZ0bXBfbXYsIHN0ZXBfcGFyYW0sIHgtPmVycm9ycGVyYml0LCAmbnVtMDAsICZ2X2ZuX3B0ciwgeC0+bXZzYWRjb3N0LCB4LT5tdmNvc3QsIHJlZl9tdik7Ci0gICAgaWYgKCB0bXBfZXJyIDwgSU5UX01BWC1uZXdfbXZfbW9kZV9wZW5hbHR5ICkKLSAgICAgICAgdG1wX2VyciArPSBuZXdfbXZfbW9kZV9wZW5hbHR5OwotCi0gICAgaWYgKHRtcF9lcnIgPCAqYmVzdF9tb3Rpb25fZXJyKQotICAgIHsKLSAgICAgICAgKmJlc3RfbW90aW9uX2VyciA9IHRtcF9lcnI7Ci0gICAgICAgIGJlc3RfbXYtPnJvdyA9IHRtcF9tdi5yb3c7Ci0gICAgICAgIGJlc3RfbXYtPmNvbCA9IHRtcF9tdi5jb2w7Ci0gICAgfQotCi0gICAgLy8gRnVydGhlciBzdGVwL2RpYW1vbmQgc2VhcmNoZXMgYXMgbmVjZXNzYXJ5Ci0gICAgbiA9IG51bTAwOwotICAgIG51bTAwID0gMDsKLQotICAgIHdoaWxlIChuIDwgZnVydGhlcl9zdGVwcykKLSAgICB7Ci0gICAgICAgIG4rKzsKLQotICAgICAgICBpZiAobnVtMDApCi0gICAgICAgICAgICBudW0wMC0tOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcF9lcnIgPSBjcGktPmRpYW1vbmRfc2VhcmNoX3NhZCh4LCBiLCBkLCByZWZfbXYsICZ0bXBfbXYsIHN0ZXBfcGFyYW0gKyBuLCB4LT5lcnJvcnBlcmJpdCwgJm51bTAwLCAmdl9mbl9wdHIsIHgtPm12c2FkY29zdCwgeC0+bXZjb3N0LCByZWZfbXYpOwotICAgICAgICAgICAgaWYgKCB0bXBfZXJyIDwgSU5UX01BWC1uZXdfbXZfbW9kZV9wZW5hbHR5ICkKLSAgICAgICAgICAgICAgICB0bXBfZXJyICs9IG5ld19tdl9tb2RlX3BlbmFsdHk7Ci0KLSAgICAgICAgICAgIGlmICh0bXBfZXJyIDwgKmJlc3RfbW90aW9uX2VycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqYmVzdF9tb3Rpb25fZXJyID0gdG1wX2VycjsKLSAgICAgICAgICAgICAgICBiZXN0X212LT5yb3cgPSB0bXBfbXYucm93OwotICAgICAgICAgICAgICAgIGJlc3RfbXYtPmNvbCA9IHRtcF9tdi5jb2w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgdnA4X2ZpcnN0X3Bhc3MoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBpbnQgbWJfcm93LCBtYl9jb2w7Ci0gICAgTUFDUk9CTE9DSyAqY29uc3QgeCA9ICYgY3BpLT5tYjsKLSAgICBWUDhfQ09NTU9OICpjb25zdCBjbSA9ICYgY3BpLT5jb21tb247Ci0gICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJiB4LT5lX21iZDsKLQotICAgIGludCBjb2xfYmxvY2tzID0gNCAqIGNtLT5tYl9jb2xzOwotICAgIGludCByZWNvbl95b2Zmc2V0LCByZWNvbl91dm9mZnNldDsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmxzdF95djEyID0gJmNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XTsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKm5ld195djEyID0gJmNtLT55djEyX2ZiW2NtLT5uZXdfZmJfaWR4XTsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmdsZF95djEyID0gJmNtLT55djEyX2ZiW2NtLT5nbGRfZmJfaWR4XTsKLSAgICBpbnQgcmVjb25feV9zdHJpZGUgPSBsc3RfeXYxMi0+eV9zdHJpZGU7Ci0gICAgaW50IHJlY29uX3V2X3N0cmlkZSA9IGxzdF95djEyLT51dl9zdHJpZGU7Ci0gICAgbG9uZyBsb25nIGludHJhX2Vycm9yID0gMDsKLSAgICBsb25nIGxvbmcgY29kZWRfZXJyb3IgPSAwOwotCi0gICAgaW50IHN1bV9tdnIgPSAwLCBzdW1fbXZjID0gMDsKLSAgICBpbnQgc3VtX212cl9hYnMgPSAwLCBzdW1fbXZjX2FicyA9IDA7Ci0gICAgaW50IHN1bV9tdnJzID0gMCwgc3VtX212Y3MgPSAwOwotICAgIGludCBtdmNvdW50ID0gMDsKLSAgICBpbnQgaW50ZXJjb3VudCA9IDA7Ci0gICAgaW50IHNlY29uZF9yZWZfY291bnQgPSAwOwotICAgIGludCBpbnRyYXBlbmFsdHkgPSAyNTY7Ci0gICAgaW50IG5ldXRyYWxfY291bnQgPSAwOwotCi0gICAgaW50IHN1bV9pbl92ZWN0b3JzID0gMDsKLQotICAgIE1WIHplcm9fcmVmX212ID0gezAsIDB9OwotCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAgLy9fX2FzbSBlbW1zOwotCi0gICAgeC0+c3JjID0gKiBjcGktPlNvdXJjZTsKLSAgICB4ZC0+cHJlID0gKmxzdF95djEyOwotICAgIHhkLT5kc3QgPSAqbmV3X3l2MTI7Ci0KLSAgICB4LT5wYXJ0aXRpb25faW5mbyA9IHgtPnBpOwotCi0gICAgeGQtPm1vZGVfaW5mb19jb250ZXh0ID0gY20tPm1pOwotCi0gICAgdnA4X2J1aWxkX2Jsb2NrX29mZnNldHMoeCk7Ci0KLSAgICB2cDhfc2V0dXBfYmxvY2tfZHB0cnMoJngtPmVfbWJkKTsKLQotICAgIHZwOF9zZXR1cF9ibG9ja19wdHJzKHgpOwotCi0gICAgLy8gc2V0IHVwIGZyYW1lIG5ldyBmcmFtZSBmb3IgaW50cmEgY29kZWQgYmxvY2tzCi0gICAgdnA4X3NldHVwX2ludHJhX3JlY29uKG5ld195djEyKTsKLSAgICB2cDhjeF9mcmFtZV9pbml0X3F1YW50aXplcihjcGkpOwotCi0gICAgLy8gSW5pdGlhbGlzZSB0aGUgTVYgY29zdCB0YWJsZSB0byB0aGUgZGVmYXVsdHMKLSAgICAvL2lmKCBjbS0+Y3VycmVudF92aWRlb19mcmFtZSA9PSAwKQotICAgIC8vaWYgKCAwICkKLSAgICB7Ci0gICAgICAgIGludCBmbGFnWzJdID0gezEsIDF9OwotICAgICAgICB2cDhfaW5pdGlhbGl6ZV9yZF9jb25zdHMoY3BpLCB2cDhfZGNfcXVhbnQoY20tPmJhc2VfcWluZGV4LCBjbS0+eTFkY19kZWx0YV9xKSk7Ci0gICAgICAgIHZweF9tZW1jcHkoY20tPmZjLm12YywgdnA4X2RlZmF1bHRfbXZfY29udGV4dCwgc2l6ZW9mKHZwOF9kZWZhdWx0X212X2NvbnRleHQpKTsKLSAgICAgICAgdnA4X2J1aWxkX2NvbXBvbmVudF9jb3N0X3RhYmxlKGNwaS0+bWIubXZjb3N0LCBjcGktPm1iLm12c2FkY29zdCwgKGNvbnN0IE1WX0NPTlRFWFQgKikgY20tPmZjLm12YywgZmxhZyk7Ci0gICAgfQotCi0gICAgLy8gZm9yIGVhY2ggbWFjcm9ibG9jayByb3cgaW4gaW1hZ2UKLSAgICBmb3IgKG1iX3JvdyA9IDA7IG1iX3JvdyA8IGNtLT5tYl9yb3dzOyBtYl9yb3crKykKLSAgICB7Ci0gICAgICAgIGludF9tdiBiZXN0X3JlZl9tdjsKLQotICAgICAgICBiZXN0X3JlZl9tdi5hc19pbnQgPSAwOwotCi0gICAgICAgIC8vIHJlc2V0IGFib3ZlIGJsb2NrIGNvZWZmcwotICAgICAgICB4ZC0+dXBfYXZhaWxhYmxlID0gKG1iX3JvdyAhPSAwKTsKLSAgICAgICAgcmVjb25feW9mZnNldCA9IChtYl9yb3cgKiByZWNvbl95X3N0cmlkZSAqIDE2KTsKLSAgICAgICAgcmVjb25fdXZvZmZzZXQgPSAobWJfcm93ICogcmVjb25fdXZfc3RyaWRlICogOCk7Ci0KLSAgICAgICAgLy8gU2V0IHVwIGxpbWl0IHZhbHVlcyBmb3IgbW90aW9uIHZlY3RvcnMgdG8gcHJldmVudCB0aGVtIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBVTVYgYm9yZGVycwotICAgICAgICB4LT5tdl9yb3dfbWluID0gLSgobWJfcm93ICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpKTsKLSAgICAgICAgeC0+bXZfcm93X21heCA9ICgoY20tPm1iX3Jvd3MgLSAxIC0gbWJfcm93KSAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE2KTsKLQotCi0gICAgICAgIC8vIGZvciBlYWNoIG1hY3JvYmxvY2sgY29sIGluIGltYWdlCi0gICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHM7IG1iX2NvbCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc19lcnJvcjsKLSAgICAgICAgICAgIGludCB6el90b19iZXN0X3JhdGlvOwotICAgICAgICAgICAgaW50IGdmX21vdGlvbl9lcnJvciA9IElOVF9NQVg7Ci0gICAgICAgICAgICBpbnQgdXNlX2RjX3ByZWQgPSAobWJfY29sIHx8IG1iX3JvdykgJiYgKCFtYl9jb2wgfHwgIW1iX3Jvdyk7Ci0KLSAgICAgICAgICAgIHhkLT5kc3QueV9idWZmZXIgPSBuZXdfeXYxMi0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OwotICAgICAgICAgICAgeGQtPmRzdC51X2J1ZmZlciA9IG5ld195djEyLT51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICAgICAgeGQtPmRzdC52X2J1ZmZlciA9IG5ld195djEyLT52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICAgICAgeGQtPmxlZnRfYXZhaWxhYmxlID0gKG1iX2NvbCAhPSAwKTsKLQotICAgICAgICAgICAgLy8gZG8gaW50cmEgMTZ4MTYgcHJlZGljdGlvbgotICAgICAgICAgICAgdGhpc19lcnJvciA9IGVuY29kZV9pbnRyYShjcGksIHgsIHVzZV9kY19wcmVkKTsKLQotICAgICAgICAgICAgLy8gImludHJhcGVuYWx0eSIgYmVsb3cgZGVhbHMgd2l0aCBzaXR1YXRpb25zIHdoZXJlIHRoZSBpbnRyYSBhbmQgaW50ZXIgZXJyb3Igc2NvcmVzIGFyZSB2ZXJ5IGxvdyAoZWcgYSBwbGFpbiBibGFjayBmcmFtZSkKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIHNwZWNpYWwgY2FzZXMgaW4gZmlyc3QgcGFzcyBmb3IgMCwwIGFuZCBuZWFyZXN0IGV0YyBzbyBhbGwgaW50ZXIgbW9kZXMgY2FycnkgYW4gb3ZlcmhlYWQgY29zdCBlc3RpbWF0ZSBmb3QgdGhlIG12LgotICAgICAgICAgICAgLy8gV2hlbiB0aGUgZXJyb3Igc2NvcmUgaXMgdmVyeSBsb3cgdGhpcyBjYXVzZXMgdXMgdG8gcGljayBhbGwgb3IgbG90cyBvZiBJTlRSQSBtb2RlcyBhbmQgdGhyb3cgbG90cyBvZiBrZXkgZnJhbWVzLgotICAgICAgICAgICAgLy8gVGhpcyBwZW5hbHR5IGFkZHMgYSBjb3N0IG1hdGNoaW5nIHRoYXQgb2YgYSAwLDAgbXYgdG8gdGhlIGludHJhIGNhc2UuCi0gICAgICAgICAgICB0aGlzX2Vycm9yICs9IGludHJhcGVuYWx0eTsKLQotICAgICAgICAgICAgLy8gQ3VtdWxhdGl2ZSBpbnRyYSBlcnJvciB0b3RhbAotICAgICAgICAgICAgaW50cmFfZXJyb3IgKz0gKGxvbmcgbG9uZyl0aGlzX2Vycm9yOwotCi0gICAgICAgICAgICAvLyBTZXQgdXAgbGltaXQgdmFsdWVzIGZvciBtb3Rpb24gdmVjdG9ycyB0byBwcmV2ZW50IHRoZW0gZXh0ZW5kaW5nIG91dHNpZGUgdGhlIFVNViBib3JkZXJzCi0gICAgICAgICAgICB4LT5tdl9jb2xfbWluID0gLSgobWJfY29sICogMTYpICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTYpKTsKLSAgICAgICAgICAgIHgtPm12X2NvbF9tYXggPSAoKGNtLT5tYl9jb2xzIC0gMSAtIG1iX2NvbCkgKiAxNikgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxNik7Ci0KLSAgICAgICAgICAgIC8vIE90aGVyIHRoYW4gZm9yIHRoZSBmaXJzdCBmcmFtZSBkbyBhIG1vdGlvbiBzZWFyY2gKLSAgICAgICAgICAgIGlmIChjbS0+Y3VycmVudF92aWRlb19mcmFtZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQkxPQ0sgKmIgPSAmeC0+YmxvY2tbMF07Ci0gICAgICAgICAgICAgICAgQkxPQ0tEICpkID0gJngtPmVfbWJkLmJsb2NrWzBdOwotICAgICAgICAgICAgICAgIE1WIHRtcF9tdiA9IHswLCAwfTsKLSAgICAgICAgICAgICAgICBpbnQgdG1wX2VycjsKLSAgICAgICAgICAgICAgICBpbnQgbW90aW9uX2Vycm9yID0gSU5UX01BWDsKLQotICAgICAgICAgICAgICAgIC8vIFNpbXBsZSAwLDAgbW90aW9uIHdpdGggbm8gbXYgb3ZlcmhlYWQKLSAgICAgICAgICAgICAgICB6el9tb3Rpb25fc2VhcmNoKCBjcGksIHgsIGxzdF95djEyLCAmbW90aW9uX2Vycm9yLCByZWNvbl95b2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA9IDA7Ci0gICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LmNvbCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBUZXN0IGxhc3QgcmVmZXJlbmNlIGZyYW1lIHVzaW5nIHRoZSBwcmV2aW91cyBiZXN0IG12IGFzIHRoZQotICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHBvaW50IChiZXN0IHJlZmVyZW5jZSkgZm9yIHRoZSBzZWFyY2gKLSAgICAgICAgICAgICAgICBmaXJzdF9wYXNzX21vdGlvbl9zZWFyY2goY3BpLCB4LCAmYmVzdF9yZWZfbXYuYXNfbXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQtPmJtaS5tdi5hc19tdiwgbHN0X3l2MTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbl9lcnJvciwgcmVjb25feW9mZnNldCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBiZXN0IHJlZmVyZW5jZSBtdiBpcyBub3QgY2VudHJlZCBvbiAwLDAgdGhlbiBkbyBhIDAsMCBiYXNlZCBzZWFyY2ggYXMgd2VsbAotICAgICAgICAgICAgICAgIGlmIChiZXN0X3JlZl9tdi5hc19pbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHRtcF9lcnIgPSBJTlRfTUFYOwotICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfbW90aW9uX3NlYXJjaChjcGksIHgsICZ6ZXJvX3JlZl9tdiwgJnRtcF9tdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RfeXYxMiwgJnRtcF9lcnIsIHJlY29uX3lvZmZzZXQpOwotCi0gICAgICAgICAgICAgICAgICAgaWYgKCB0bXBfZXJyIDwgbW90aW9uX2Vycm9yICkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fZXJyb3IgPSB0bXBfZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA9IHRtcF9tdi5yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkLT5ibWkubXYuYXNfbXYuY29sID0gdG1wX212LmNvbDsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRXhwZXJpbWVudGFsIHNlYXJjaCBpbiBhIHNlY29uZCByZWZlcmVuY2UgZnJhbWUgKCgwLDApIGJhc2VkIG9ubHkpCi0gICAgICAgICAgICAgICAgaWYgKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfbW90aW9uX3NlYXJjaChjcGksIHgsICZ6ZXJvX3JlZl9tdiwgJnRtcF9tdiwgZ2xkX3l2MTIsICZnZl9tb3Rpb25fZXJyb3IsIHJlY29uX3lvZmZzZXQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoZ2ZfbW90aW9uX2Vycm9yIDwgbW90aW9uX2Vycm9yKSAmJiAoZ2ZfbW90aW9uX2Vycm9yIDwgdGhpc19lcnJvcikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9yZWZfY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbW90aW9uX2Vycm9yID0gZ2ZfbW90aW9uX2Vycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9kLT5ibWkubXYuYXNfbXYucm93ID0gdG1wX212LnJvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZC0+Ym1pLm12LmFzX212LmNvbCA9IHRtcF9tdi5jb2w7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyplbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmUueV9idWZmZXIgPSBjbS0+bGFzdF9mcmFtZS55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlLnVfYnVmZmVyID0gY20tPmxhc3RfZnJhbWUudV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhkLT5wcmUudl9idWZmZXIgPSBjbS0+bGFzdF9mcmFtZS52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ki8KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRvIGxhc3QgZnJhbWUgYXMgcmVmZXJlbmNlIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlLnlfYnVmZmVyID0gbHN0X3l2MTItPnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgeGQtPnByZS51X2J1ZmZlciA9IGxzdF95djEyLT51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB4ZC0+cHJlLnZfYnVmZmVyID0gbHN0X3l2MTItPnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW50cmEgYXNzdW1lZCBiZXN0ICovCi0gICAgICAgICAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChtb3Rpb25fZXJyb3IgPD0gdGhpc19lcnJvcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgYSBjb3VudCBvZiBjYXNlcyB3aGVyZSB0aGUgaW50ZXIgYW5kIGludHJhIHdlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdmVyeSBjbG9zZSBhbmQgdmVyeSBsb3cuIFRoaXMgaGVscHMgd2l0aCBzY2VuZSBjdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZWN0aW9uIGZvciBleGFtcGxlIGluIGNyb3BwZWQgY2xpcHMgd2l0aCBibGFjayBiYXJzCi0gICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBzaWRlcyBvciB0b3AgYW5kIGJvdHRvbS4KLSAgICAgICAgICAgICAgICAgICAgaWYoICgoKHRoaXNfZXJyb3ItaW50cmFwZW5hbHR5KSAqIDkpIDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKG1vdGlvbl9lcnJvcioxMCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodGhpc19lcnJvciA8ICgyKmludHJhcGVuYWx0eSkpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV1dHJhbF9jb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA8PD0gMzsKLSAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LmNvbCA8PD0gMzsKLSAgICAgICAgICAgICAgICAgICAgdGhpc19lcnJvciA9IG1vdGlvbl9lcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgdnA4X3NldF9tYm1vZGVfYW5kX212cyh4LCBORVdNViwgJmQtPmJtaS5tdi5hc19tdik7Ci0gICAgICAgICAgICAgICAgICAgIHZwOF9lbmNvZGVfaW50ZXIxNngxNnkoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCk7Ci0gICAgICAgICAgICAgICAgICAgIHN1bV9tdnIgKz0gZC0+Ym1pLm12LmFzX212LnJvdzsKLSAgICAgICAgICAgICAgICAgICAgc3VtX212cl9hYnMgKz0gYWJzKGQtPmJtaS5tdi5hc19tdi5yb3cpOwotICAgICAgICAgICAgICAgICAgICBzdW1fbXZjICs9IGQtPmJtaS5tdi5hc19tdi5jb2w7Ci0gICAgICAgICAgICAgICAgICAgIHN1bV9tdmNfYWJzICs9IGFicyhkLT5ibWkubXYuYXNfbXYuY29sKTsKLSAgICAgICAgICAgICAgICAgICAgc3VtX212cnMgKz0gZC0+Ym1pLm12LmFzX212LnJvdyAqIGQtPmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgICAgICAgICAgICAgIHN1bV9tdmNzICs9IGQtPmJtaS5tdi5hc19tdi5jb2wgKiBkLT5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgYmVzdF9yZWZfbXYuYXNfaW50ID0gZC0+Ym1pLm12LmFzX2ludDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBXYXMgdGhlIHZlY3RvciBub24temVybwotICAgICAgICAgICAgICAgICAgICBpZiAoZC0+Ym1pLm12LmFzX2ludCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbXZjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSBSb3cgdmVjdG9yIHBvaW50IGlud2FyZHMgb3Igb3V0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYl9yb3cgPCBjbS0+bWJfcm93cyAvIDIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQtPmJtaS5tdi5hc19tdi5yb3cgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1faW5fdmVjdG9ycy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQtPmJtaS5tdi5hc19tdi5yb3cgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1faW5fdmVjdG9ycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWJfcm93ID4gY20tPm1iX3Jvd3MgLyAyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5ibWkubXYuYXNfbXYucm93ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2luX3ZlY3RvcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkLT5ibWkubXYuYXNfbXYucm93IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2luX3ZlY3RvcnMtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgUm93IHZlY3RvciBwb2ludCBpbndhcmRzIG9yIG91dHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfY29sIDwgY20tPm1iX2NvbHMgLyAyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5ibWkubXYuYXNfbXYuY29sID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2luX3ZlY3RvcnMtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkLT5ibWkubXYuYXNfbXYuY29sIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2luX3ZlY3RvcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1iX2NvbCA+IGNtLT5tYl9jb2xzIC8gMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC0+Ym1pLm12LmFzX212LmNvbCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9pbl92ZWN0b3JzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZC0+Ym1pLm12LmFzX212LmNvbCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9pbl92ZWN0b3JzLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvZGVkX2Vycm9yICs9IChsb25nIGxvbmcpdGhpc19lcnJvcjsKLQotICAgICAgICAgICAgLy8gYWRqdXN0IHRvIHRoZSBuZXh0IGNvbHVtbiBvZiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgeC0+c3JjLnlfYnVmZmVyICs9IDE2OwotICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyICs9IDg7Ci0gICAgICAgICAgICB4LT5zcmMudl9idWZmZXIgKz0gODsKLQotICAgICAgICAgICAgcmVjb25feW9mZnNldCArPSAxNjsKLSAgICAgICAgICAgIHJlY29uX3V2b2Zmc2V0ICs9IDg7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGp1c3QgdG8gdGhlIG5leHQgcm93IG9mIG1icwotICAgICAgICB4LT5zcmMueV9idWZmZXIgKz0gMTYgKiB4LT5zcmMueV9zdHJpZGUgLSAxNiAqIGNtLT5tYl9jb2xzOwotICAgICAgICB4LT5zcmMudV9idWZmZXIgKz0gOCAqIHgtPnNyYy51dl9zdHJpZGUgLSA4ICogY20tPm1iX2NvbHM7Ci0gICAgICAgIHgtPnNyYy52X2J1ZmZlciArPSA4ICogeC0+c3JjLnV2X3N0cmlkZSAtIDggKiBjbS0+bWJfY29sczsKLQotICAgICAgICAvL2V4dGVuZCB0aGUgcmVjb24gZm9yIGludHJhIHByZWRpY3Rpb24KLSAgICAgICAgdnA4X2V4dGVuZF9tYl9yb3cobmV3X3l2MTIsIHhkLT5kc3QueV9idWZmZXIgKyAxNiwgeGQtPmRzdC51X2J1ZmZlciArIDgsIHhkLT5kc3Qudl9idWZmZXIgKyA4KTsKLSAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAgLy9fX2FzbSBlbW1zOwotICAgIH0KLQotICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsgIC8vX19hc20gZW1tczsKLSAgICB7Ci0gICAgICAgIGRvdWJsZSB3ZWlnaHQgPSAwLjA7Ci0KLSAgICAgICAgRklSU1RQQVNTX1NUQVRTIGZwczsKLQotICAgICAgICBmcHMuZnJhbWUgICAgICA9IGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lIDsKLSAgICAgICAgZnBzLmludHJhX2Vycm9yID0gaW50cmFfZXJyb3IgPj4gODsKLSAgICAgICAgZnBzLmNvZGVkX2Vycm9yID0gY29kZWRfZXJyb3IgPj4gODsKLSAgICAgICAgd2VpZ2h0ID0gc2ltcGxlX3dlaWdodChjcGktPlNvdXJjZSk7Ci0KLQotICAgICAgICBpZiAod2VpZ2h0IDwgMC4xKQotICAgICAgICAgICAgd2VpZ2h0ID0gMC4xOwotCi0gICAgICAgIGZwcy5zc2ltX3dlaWdodGVkX3ByZWRfZXJyID0gZnBzLmNvZGVkX2Vycm9yICogd2VpZ2h0OwotCi0gICAgICAgIGZwcy5wY250X2ludGVyICA9IDAuMDsKLSAgICAgICAgZnBzLnBjbnRfbW90aW9uID0gMC4wOwotICAgICAgICBmcHMuTVZyICAgICAgICA9IDAuMDsKLSAgICAgICAgZnBzLm12cl9hYnMgICAgID0gMC4wOwotICAgICAgICBmcHMuTVZjICAgICAgICA9IDAuMDsKLSAgICAgICAgZnBzLm12Y19hYnMgICAgID0gMC4wOwotICAgICAgICBmcHMuTVZydiAgICAgICA9IDAuMDsKLSAgICAgICAgZnBzLk1WY3YgICAgICAgPSAwLjA7Ci0gICAgICAgIGZwcy5tdl9pbl9vdXRfY291bnQgID0gMC4wOwotICAgICAgICBmcHMuY291bnQgICAgICA9IDEuMDsKLQotICAgICAgICBmcHMucGNudF9pbnRlciAgID0gMS4wICogKGRvdWJsZSlpbnRlcmNvdW50IC8gY20tPk1CczsKLSAgICAgICAgZnBzLnBjbnRfc2Vjb25kX3JlZiA9IDEuMCAqIChkb3VibGUpc2Vjb25kX3JlZl9jb3VudCAvIGNtLT5NQnM7Ci0gICAgICAgIGZwcy5wY250X25ldXRyYWwgPSAxLjAgKiAoZG91YmxlKW5ldXRyYWxfY291bnQgLyBjbS0+TUJzOwotCi0gICAgICAgIGlmIChtdmNvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZnBzLk1WciA9IChkb3VibGUpc3VtX212ciAvIChkb3VibGUpbXZjb3VudDsKLSAgICAgICAgICAgIGZwcy5tdnJfYWJzID0gKGRvdWJsZSlzdW1fbXZyX2FicyAvIChkb3VibGUpbXZjb3VudDsKLSAgICAgICAgICAgIGZwcy5NVmMgPSAoZG91YmxlKXN1bV9tdmMgLyAoZG91YmxlKW12Y291bnQ7Ci0gICAgICAgICAgICBmcHMubXZjX2FicyA9IChkb3VibGUpc3VtX212Y19hYnMgLyAoZG91YmxlKW12Y291bnQ7Ci0gICAgICAgICAgICBmcHMuTVZydiA9ICgoZG91YmxlKXN1bV9tdnJzIC0gKGZwcy5NVnIgKiBmcHMuTVZyIC8gKGRvdWJsZSltdmNvdW50KSkgLyAoZG91YmxlKW12Y291bnQ7Ci0gICAgICAgICAgICBmcHMuTVZjdiA9ICgoZG91YmxlKXN1bV9tdmNzIC0gKGZwcy5NVmMgKiBmcHMuTVZjIC8gKGRvdWJsZSltdmNvdW50KSkgLyAoZG91YmxlKW12Y291bnQ7Ci0gICAgICAgICAgICBmcHMubXZfaW5fb3V0X2NvdW50ID0gKGRvdWJsZSlzdW1faW5fdmVjdG9ycyAvIChkb3VibGUpKG12Y291bnQgKiAyKTsKLQotICAgICAgICAgICAgZnBzLnBjbnRfbW90aW9uID0gMS4wICogKGRvdWJsZSltdmNvdW50IC8gY3BpLT5jb21tb24uTUJzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGR1cmF0aW9uIGlzIHNldCB0byAwLCBvciBzb21ldGhpbmcgbGVzcwotICAgICAgICAvLyB0aGFuIHRoZSBmdWxsIHRpbWUgYmV0d2VlbiBzdWJzZXF1ZW50IGNwaS0+c291cmNlX3RpbWVfc3RhbXAgcyAgLgotICAgICAgICBmcHMuZHVyYXRpb24gPSBjcGktPnNvdXJjZV9lbmRfdGltZV9zdGFtcCAtIGNwaS0+c291cmNlX3RpbWVfc3RhbXA7Ci0KLSAgICAgICAgLy8gZG9uJ3Qgd2FudCB0byBkbyBvdXRwdXQgc3RhdHMgd2l0aCBhIHN0YWNrIHZhcmlhYmxlIQotICAgICAgICBtZW1jcHkoY3BpLT50aGlzX2ZyYW1lX3N0YXRzLAotICAgICAgICAgICAgICAgJmZwcywKLSAgICAgICAgICAgICAgIHNpemVvZihGSVJTVFBBU1NfU1RBVFMpKTsKLSAgICAgICAgb3V0cHV0X3N0YXRzKGNwaSwgY3BpLT5vdXRwdXRfcGt0X2xpc3QsIGNwaS0+dGhpc19mcmFtZV9zdGF0cyk7Ci0gICAgICAgIGFjY3VtdWxhdGVfc3RhdHMoY3BpLT50b3RhbF9zdGF0cywgJmZwcyk7Ci0gICAgfQotCi0gICAgLy8gQ29weSB0aGUgcHJldmlvdXMgTGFzdCBGcmFtZSBpbnRvIHRoZSBHRiBidWZmZXIgaWYgc3BlY2lmaWMgY29uZGl0aW9ucyBmb3IgZG9pbmcgc28gYXJlIG1ldAotICAgIGlmICgoY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgPiAwKSAmJgotICAgICAgICAoY3BpLT50aGlzX2ZyYW1lX3N0YXRzLT5wY250X2ludGVyID4gMC4yMCkgJiYKLSAgICAgICAgKChjcGktPnRoaXNfZnJhbWVfc3RhdHMtPmludHJhX2Vycm9yIC8gY3BpLT50aGlzX2ZyYW1lX3N0YXRzLT5jb2RlZF9lcnJvcikgPiAyLjApKQotICAgIHsKLSAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIobHN0X3l2MTIsIGdsZF95djEyKTsKLSAgICB9Ci0KLSAgICAvLyBzd2FwIGZyYW1lIHBvaW50ZXJzIHNvIGxhc3QgZnJhbWUgcmVmZXJzIHRvIHRoZSBmcmFtZSB3ZSBqdXN0IGNvbXByZXNzZWQKLSAgICB2cDhfc3dhcF95djEyX2J1ZmZlcihsc3RfeXYxMiwgbmV3X3l2MTIpOwotICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzKGxzdF95djEyKTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGZpcnN0IGZyYW1lLiBDb3B5IGludG8gdGhlIEdGIGJ1ZmZlciBhcyBhIHNlY29uZCByZWZlcmVuY2UuCi0gICAgaWYgKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID09IDApCi0gICAgewotICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihsc3RfeXYxMiwgZ2xkX3l2MTIpOwotICAgIH0KLQotCi0gICAgLy8gdXNlIHRoaXMgdG8gc2VlIHdoYXQgdGhlIGZpcnN0IHBhc3MgcmVjb25zdHJ1Y3Rpb24gbG9va3MgbGlrZQotICAgIGlmICgwKQotICAgIHsKLSAgICAgICAgY2hhciBmaWxlbmFtZVs1MTJdOwotICAgICAgICBGSUxFICpyZWNvbl9maWxlOwotICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCAiZW5jJTA0ZC55dXYiLCAoaW50KSBjbS0+Y3VycmVudF92aWRlb19mcmFtZSk7Ci0KLSAgICAgICAgaWYgKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID09IDApCi0gICAgICAgICAgICByZWNvbl9maWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZWNvbl9maWxlID0gZm9wZW4oZmlsZW5hbWUsICJhYiIpOwotCi0gICAgICAgIGlmKGZ3cml0ZShsc3RfeXYxMi0+YnVmZmVyX2FsbG9jLCBsc3RfeXYxMi0+ZnJhbWVfc2l6ZSwgMSwgcmVjb25fZmlsZSkpOwotICAgICAgICBmY2xvc2UocmVjb25fZmlsZSk7Ci0gICAgfQotCi0gICAgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUrKzsKLQotfQotZXh0ZXJuIGNvbnN0IGludCB2cDhfYml0c19wZXJfbWJbMl1bUUlOREVYX1JBTkdFXTsKLQotI2RlZmluZSBCQVNFX0VSUlBFUk1CICAgMTUwCi1zdGF0aWMgaW50IGVzdGltYXRlX21heF9xKFZQOF9DT01QICpjcGksIGRvdWJsZSBzZWN0aW9uX2VyciwgaW50IHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCkKLXsKLSAgICBpbnQgUTsKLSAgICBpbnQgbnVtX21icyA9IGNwaS0+Y29tbW9uLk1CczsKLSAgICBpbnQgdGFyZ2V0X25vcm1fYml0c19wZXJfbWI7Ci0KLSAgICBkb3VibGUgZXJyX3Blcl9tYiA9IHNlY3Rpb25fZXJyIC8gbnVtX21iczsKLSAgICBkb3VibGUgY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgZG91YmxlIGNvcnJfaGlnaDsKLSAgICBkb3VibGUgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDsKLSAgICBkb3VibGUgcm9sbGluZ19yYXRpbzsKLQotICAgIGRvdWJsZSBwb3dfaGlnaHEgPSAwLjkwOwotICAgIGRvdWJsZSBwb3dfbG93cSA9IDAuNDA7Ci0KLSAgICBpZiAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIDw9IDApCi0gICAgICAgIHJldHVybiBjcGktPm1heHFfbWF4X2xpbWl0OyAgICAgICAgICAvLyBIaWdoZXN0IHZhbHVlIGFsbG93ZWQKLQotICAgIHRhcmdldF9ub3JtX2JpdHNfcGVyX21iID0gKHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCA8ICgxIDw8IDIwKSkgPyAoNTEyICogc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoKSAvIG51bV9tYnMgOiA1MTIgKiAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIC8gbnVtX21icyk7Ci0KLSAgICAvLyBDYWxjdWxhdGUgYSBjb3JyZWN0aXZlIGZhY3RvciBiYXNlZCBvbiBhIHJvbGxpbmcgcmF0aW8gb2YgYml0cyBzcGVudCB2cyB0YXJnZXQgYml0cwotICAgIGlmICgoY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzID4gMC4wKSAmJiAoY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA8IGNwaS0+d29yc3RfcXVhbGl0eSkpCi0gICAgewotICAgICAgICAvL2RvdWJsZSBhZGp1c3RtZW50X3JhdGUgPSAwLjk4NSArICgwLjAwMDA1ICogY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSk7Ci0gICAgICAgIGRvdWJsZSBhZGp1c3RtZW50X3JhdGUgPSAwLjk5OwotCi0gICAgICAgIHJvbGxpbmdfcmF0aW8gPSAoZG91YmxlKWNwaS0+cm9sbGluZ19hY3R1YWxfYml0cyAvIChkb3VibGUpY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzOwotCi0gICAgICAgIC8vaWYgKCBjcGktPmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yID4gcm9sbGluZ19yYXRpbyApCi0gICAgICAgIGlmIChyb2xsaW5nX3JhdGlvIDwgMC45NSkKLSAgICAgICAgICAgIC8vY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciAqPSBhZGp1c3RtZW50X3JhdGU7Ci0gICAgICAgICAgICBjcGktPmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yIC09IDAuMDA1OwotICAgICAgICAvL2Vsc2UgaWYgKCBjcGktPmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yIDwgcm9sbGluZ19yYXRpbyApCi0gICAgICAgIGVsc2UgaWYgKHJvbGxpbmdfcmF0aW8gPiAxLjA1KQotICAgICAgICAgICAgY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciArPSAwLjAwNTsKLQotICAgICAgICAvL2NwaS0+ZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgLz0gYWRqdXN0bWVudF9yYXRlOwotCi0gICAgICAgIGNwaS0+ZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3IgPSAoY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciA8IDAuMSkgPyAwLjEgOiAoY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciA+IDEwLjApID8gMTAuMCA6IGNwaS0+ZXN0X21heF9xY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgfQotCi0gICAgLy8gQ29ycmVjdGlvbnMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBzcGVlZCBzZXR0aW5ncyAocmVkdWNlZCBjb21wcmVzc2lvbiBleHBlY3RlZCkKLSAgICBpZiAoKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAzKSB8fCAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDEpKQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8PSA1KQotICAgICAgICAgICAgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDQgKyAoY3BpLT5veGNmLmNwdV91c2VkICogMC4wNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjI1OwotICAgIH0KLQotICAgIC8vIENvcnJlY3Rpb24gZmFjdG9yIHVzZWQgZm9yIFEgdmFsdWVzID49IDIwCi0gICAgY29ycl9oaWdoID0gcG93KGVycl9wZXJfbWIgLyBCQVNFX0VSUlBFUk1CLCBwb3dfaGlnaHEpOwotICAgIGNvcnJfaGlnaCA9IChjb3JyX2hpZ2ggPCAwLjA1KQotICAgICAgICAgICAgICAgICAgICA/IDAuMDUgOiAoY29ycl9oaWdoID4gNS4wKSA/IDUuMCA6IGNvcnJfaGlnaDsKLQotICAgIC8vIFRyeSBhbmQgcGljayBhIG1heCBRIHRoYXQgd2lsbCBiZSBoaWdoIGVub3VnaCB0byBlbmNvZGUgdGhlCi0gICAgLy8gY29udGVudCBhdCB0aGUgZ2l2ZW4gcmF0ZS4KLSAgICBmb3IgKFEgPSBjcGktPm1heHFfbWluX2xpbWl0OyBRIDwgY3BpLT5tYXhxX21heF9saW1pdDsgUSsrKQotICAgIHsKLSAgICAgICAgaW50IGJpdHNfcGVyX21iX2F0X3RoaXNfcTsKLQotICAgICAgICBpZiAoUSA8IDUwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb3JyZWN0aW9uX2ZhY3RvciA9IHBvdyhlcnJfcGVyX21iIC8gQkFTRV9FUlJQRVJNQiwgKHBvd19sb3dxICsgUSAqIDAuMDEpKTsKLSAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gKGNvcnJlY3Rpb25fZmFjdG9yIDwgMC4wNSkgPyAwLjA1IDogKGNvcnJlY3Rpb25fZmFjdG9yID4gNS4wKSA/IDUuMCA6IGNvcnJlY3Rpb25fZmFjdG9yOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY29ycl9oaWdoOwotCi0gICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9IChpbnQpKC41ICsgY29ycmVjdGlvbl9mYWN0b3IgKiBzcGVlZF9jb3JyZWN0aW9uICogY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciAqIGNwaS0+c2VjdGlvbl9tYXhfcWZhY3RvciAqIChkb3VibGUpdnA4X2JpdHNfcGVyX21iW0lOVEVSX0ZSQU1FXVtRXSAvIDEuMCk7Ci0gICAgICAgIC8vYml0c19wZXJfbWJfYXRfdGhpc19xID0gKGludCkoLjUgKyBjb3JyZWN0aW9uX2ZhY3RvciAqIHNwZWVkX2NvcnJlY3Rpb24gKiBjcGktPmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yICogKGRvdWJsZSl2cDhfYml0c19wZXJfbWJbSU5URVJfRlJBTUVdW1FdIC8gMS4wKTsKLQotICAgICAgICBpZiAoYml0c19wZXJfbWJfYXRfdGhpc19xIDw9IHRhcmdldF9ub3JtX2JpdHNfcGVyX21iKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gUmVzdHJpY3Rpb24gb24gYWN0aXZlIG1heCBxIGZvciBjb25zdHJhaW5lZCBxdWFsaXR5IG1vZGUuCi0gICAgaWYgKCAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9DT05TVFJBSU5FRF9RVUFMSVRZKSAmJgotICAgICAgICAgKFEgPCBjcGktPmNxX3RhcmdldF9xdWFsaXR5KSApCi0gICAgICAgICAvLyhRIDwgY3BpLT5veGNmLmNxX2xldmVsOykgKQotICAgIHsKLSAgICAgICAgUSA9IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHk7Ci0gICAgICAgIC8vUSA9IGNwaS0+b3hjZi5jcV9sZXZlbDsKLSAgICB9Ci0KLSAgICAvLyBBZGp1c3QgbWF4cV9taW5fbGltaXQgYW5kIG1heHFfbWF4X2xpbWl0IGxpbWl0cyBiYXNlZCBvbgotICAgIC8vIGF2ZXJhZ2EgcSBvYnNlcnZlZCBpbiBjbGlwIGZvciBub24ga2YvZ2YuYXJmIGZyYW1lcwotICAgIC8vIEdpdmUgYXZlcmFnZSBhIGNoYW5jZSB0byBzZXR0bGUgdGhvdWdoLgotICAgIGlmICggKGNwaS0+bmlfZnJhbWVzID4KLSAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KWNwaS0+dG90YWxfc3RhdHMtPmNvdW50ID4+IDgpKSAmJgotICAgICAgICAgKGNwaS0+bmlfZnJhbWVzID4gMTUwKSApCi0gICAgewotICAgICAgICBjcGktPm1heHFfbWF4X2xpbWl0ID0gKChjcGktPm5pX2F2X3FpICsgMzIpIDwgY3BpLT53b3JzdF9xdWFsaXR5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGNwaS0+bmlfYXZfcWkgKyAzMikgOiBjcGktPndvcnN0X3F1YWxpdHk7Ci0gICAgICAgIGNwaS0+bWF4cV9taW5fbGltaXQgPSAoKGNwaS0+bmlfYXZfcWkgLSAzMikgPiBjcGktPmJlc3RfcXVhbGl0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChjcGktPm5pX2F2X3FpIC0gMzIpIDogY3BpLT5iZXN0X3F1YWxpdHk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFE7Ci19Ci1zdGF0aWMgaW50IGVzdGltYXRlX3EoVlA4X0NPTVAgKmNwaSwgZG91YmxlIHNlY3Rpb25fZXJyLCBpbnQgc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoKQotewotICAgIGludCBROwotICAgIGludCBudW1fbWJzID0gY3BpLT5jb21tb24uTUJzOwotICAgIGludCB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYjsKLQotICAgIGRvdWJsZSBlcnJfcGVyX21iID0gc2VjdGlvbl9lcnIgLyBudW1fbWJzOwotICAgIGRvdWJsZSBjb3JyZWN0aW9uX2ZhY3RvcjsKLSAgICBkb3VibGUgY29ycl9oaWdoOwotICAgIGRvdWJsZSBzcGVlZF9jb3JyZWN0aW9uID0gMS4wOwotICAgIGRvdWJsZSBwb3dfaGlnaHEgPSAwLjkwOwotICAgIGRvdWJsZSBwb3dfbG93cSA9IDAuNDA7Ci0KLSAgICB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYiA9IChzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGggPCAoMSA8PCAyMCkpID8gKDUxMiAqIHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCkgLyBudW1fbWJzIDogNTEyICogKHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCAvIG51bV9tYnMpOwotCi0gICAgLy8gQ29ycmVjdGlvbnMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBzcGVlZCBzZXR0aW5ncyAocmVkdWNlZCBjb21wcmVzc2lvbiBleHBlY3RlZCkKLSAgICBpZiAoKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAzKSB8fCAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDEpKQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8PSA1KQotICAgICAgICAgICAgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDQgKyAoY3BpLT5veGNmLmNwdV91c2VkICogMC4wNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjI1OwotICAgIH0KLQotICAgIC8vIENvcnJlY3Rpb24gZmFjdG9yIHVzZWQgZm9yIFEgdmFsdWVzID49IDIwCi0gICAgY29ycl9oaWdoID0gcG93KGVycl9wZXJfbWIgLyBCQVNFX0VSUlBFUk1CLCBwb3dfaGlnaHEpOwotICAgIGNvcnJfaGlnaCA9IChjb3JyX2hpZ2ggPCAwLjA1KSA/IDAuMDUgOiAoY29ycl9oaWdoID4gNS4wKSA/IDUuMCA6IGNvcnJfaGlnaDsKLQotICAgIC8vIFRyeSBhbmQgcGljayBhIFEgdGhhdCBjYW4gZW5jb2RlIHRoZSBjb250ZW50IGF0IHRoZSBnaXZlbiByYXRlLgotICAgIGZvciAoUSA9IDA7IFEgPCBNQVhROyBRKyspCi0gICAgewotICAgICAgICBpbnQgYml0c19wZXJfbWJfYXRfdGhpc19xOwotCi0gICAgICAgIGlmIChRIDwgNTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gcG93KGVycl9wZXJfbWIgLyBCQVNFX0VSUlBFUk1CLCAocG93X2xvd3EgKyBRICogMC4wMSkpOwotICAgICAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSAoY29ycmVjdGlvbl9mYWN0b3IgPCAwLjA1KSA/IDAuMDUgOiAoY29ycmVjdGlvbl9mYWN0b3IgPiA1LjApID8gNS4wIDogY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSBjb3JyX2hpZ2g7Ci0KLSAgICAgICAgYml0c19wZXJfbWJfYXRfdGhpc19xID0gKGludCkoLjUgKyBjb3JyZWN0aW9uX2ZhY3RvciAqIHNwZWVkX2NvcnJlY3Rpb24gKiBjcGktPmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yICogKGRvdWJsZSl2cDhfYml0c19wZXJfbWJbSU5URVJfRlJBTUVdW1FdIC8gMS4wKTsKLQotICAgICAgICBpZiAoYml0c19wZXJfbWJfYXRfdGhpc19xIDw9IHRhcmdldF9ub3JtX2JpdHNfcGVyX21iKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIFE7Ci19Ci0KLS8vIEVzdGltYXRlIGEgd29yc3QgY2FzZSBRIGZvciBhIEtGIGdyb3VwCi1zdGF0aWMgaW50IGVzdGltYXRlX2tmX2dyb3VwX3EoVlA4X0NPTVAgKmNwaSwgZG91YmxlIHNlY3Rpb25fZXJyLCBpbnQgc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoLCBkb3VibGUgZ3JvdXBfaWlyYXRpbykKLXsKLSAgICBpbnQgUTsKLSAgICBpbnQgbnVtX21icyA9IGNwaS0+Y29tbW9uLk1CczsKLSAgICBpbnQgdGFyZ2V0X25vcm1fYml0c19wZXJfbWIgPSAoNTEyICogc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoKSAvIG51bV9tYnM7Ci0gICAgaW50IGJpdHNfcGVyX21iX2F0X3RoaXNfcTsKLQotICAgIGRvdWJsZSBlcnJfcGVyX21iID0gc2VjdGlvbl9lcnIgLyBudW1fbWJzOwotICAgIGRvdWJsZSBlcnJfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgZG91YmxlIGNvcnJfaGlnaDsKLSAgICBkb3VibGUgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDsKLSAgICBkb3VibGUgY3VycmVudF9zcGVuZF9yYXRpbyA9IDEuMDsKLQotICAgIGRvdWJsZSBwb3dfaGlnaHEgPSAoUE9XMSA8IDAuNikgPyBQT1cxICsgMC4zIDogMC45MDsKLSAgICBkb3VibGUgcG93X2xvd3EgPSAoUE9XMSA8IDAuNykgPyBQT1cxICsgMC4xIDogMC44MDsKLQotICAgIGRvdWJsZSBpaXJhdGlvX2NvcnJlY3Rpb25fZmFjdG9yID0gMS4wOwotCi0gICAgZG91YmxlIGNvbWJpbmVkX2NvcnJlY3Rpb25fZmFjdG9yOwotCi0gICAgLy8gVHJhcCBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIHRhcmdldCBpcyA8PSAwCi0gICAgaWYgKHRhcmdldF9ub3JtX2JpdHNfcGVyX21iIDw9IDApCi0gICAgICAgIHJldHVybiBNQVhRICogMjsKLQotICAgIC8vIENhbGN1bGF0ZSBhIGNvcnJlY3RpdmUgZmFjdG9yIGJhc2VkIG9uIGEgcm9sbGluZyByYXRpbyBvZiBiaXRzIHNwZW50IHZzIHRhcmdldCBiaXRzCi0gICAgLy8gVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByYW5nZSAwLjEgdG8gMTAuMAotICAgIGlmIChjcGktPmxvbmdfcm9sbGluZ190YXJnZXRfYml0cyA8PSAwKQotICAgICAgICBjdXJyZW50X3NwZW5kX3JhdGlvID0gMTAuMDsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBjdXJyZW50X3NwZW5kX3JhdGlvID0gKGRvdWJsZSljcGktPmxvbmdfcm9sbGluZ19hY3R1YWxfYml0cyAvIChkb3VibGUpY3BpLT5sb25nX3JvbGxpbmdfdGFyZ2V0X2JpdHM7Ci0gICAgICAgIGN1cnJlbnRfc3BlbmRfcmF0aW8gPSAoY3VycmVudF9zcGVuZF9yYXRpbyA+IDEwLjApID8gMTAuMCA6IChjdXJyZW50X3NwZW5kX3JhdGlvIDwgMC4xKSA/IDAuMSA6IGN1cnJlbnRfc3BlbmRfcmF0aW87Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIGEgY29ycmVjdGlvbiBmYWN0b3IgYmFzZWQgb24gdGhlIHF1YWxpdHkgb2YgcHJlZGljdGlvbiBpbiB0aGUgc2VxdWVuY2UgYXMgaW5kaWNhdGVkIGJ5IGludHJhX2ludGVyIGVycm9yIHNjb3JlIHJhdGlvIChJSVJhdGlvKQotICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdG8gZmF2b3VyIHN1YnNhbXBsaW5nIGluIHRoZSBoYXJkZXN0IHNlY3Rpb25zIHZzIHRoZSBlYXN5ZXN0LgotICAgIGlpcmF0aW9fY29ycmVjdGlvbl9mYWN0b3IgPSAxLjAgLSAoKGdyb3VwX2lpcmF0aW8gLSA2LjApICogMC4xKTsKLQotICAgIGlmIChpaXJhdGlvX2NvcnJlY3Rpb25fZmFjdG9yIDwgMC41KQotICAgICAgICBpaXJhdGlvX2NvcnJlY3Rpb25fZmFjdG9yID0gMC41OwotCi0gICAgLy8gQ29ycmVjdGlvbnMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBzcGVlZCBzZXR0aW5ncyAocmVkdWNlZCBjb21wcmVzc2lvbiBleHBlY3RlZCkKLSAgICBpZiAoKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAzKSB8fCAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDEpKQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8PSA1KQotICAgICAgICAgICAgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDQgKyAoY3BpLT5veGNmLmNwdV91c2VkICogMC4wNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjI1OwotICAgIH0KLQotICAgIC8vIENvbWJpbmUgdGhlIHZhcmlvdXMgZmFjdG9ycyBjYWxjdWxhdGVkIGFib3ZlCi0gICAgY29tYmluZWRfY29ycmVjdGlvbl9mYWN0b3IgPSBzcGVlZF9jb3JyZWN0aW9uICogaWlyYXRpb19jb3JyZWN0aW9uX2ZhY3RvciAqIGN1cnJlbnRfc3BlbmRfcmF0aW87Ci0KLSAgICAvLyBDb3JyZWN0aW9uIGZhY3RvciB1c2VkIGZvciBRIHZhbHVlcyA+PSAyMAotICAgIGNvcnJfaGlnaCA9IHBvdyhlcnJfcGVyX21iIC8gQkFTRV9FUlJQRVJNQiwgcG93X2hpZ2hxKTsKLSAgICBjb3JyX2hpZ2ggPSAoY29ycl9oaWdoIDwgMC4wNSkgPyAwLjA1IDogKGNvcnJfaGlnaCA+IDUuMCkgPyA1LjAgOiBjb3JyX2hpZ2g7Ci0KLSAgICAvLyBUcnkgYW5kIHBpY2sgYSBRIHRoYXQgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHRvIGVuY29kZSB0aGUgY29udGVudCBhdCB0aGUgZ2l2ZW4gcmF0ZS4KLSAgICBmb3IgKFEgPSAwOyBRIDwgTUFYUTsgUSsrKQotICAgIHsKLSAgICAgICAgLy8gUSB2YWx1ZXMgPCAyMCB0cmVhdGVkIGFzIGEgc3BlY2lhbCBjYXNlCi0gICAgICAgIGlmIChRIDwgMjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycl9jb3JyZWN0aW9uX2ZhY3RvciA9IHBvdyhlcnJfcGVyX21iIC8gQkFTRV9FUlJQRVJNQiwgKHBvd19sb3dxICsgUSAqIDAuMDEpKTsKLSAgICAgICAgICAgIGVycl9jb3JyZWN0aW9uX2ZhY3RvciA9IChlcnJfY29ycmVjdGlvbl9mYWN0b3IgPCAwLjA1KSA/IDAuMDUgOiAoZXJyX2NvcnJlY3Rpb25fZmFjdG9yID4gNS4wKSA/IDUuMCA6IGVycl9jb3JyZWN0aW9uX2ZhY3RvcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlcnJfY29ycmVjdGlvbl9mYWN0b3IgPSBjb3JyX2hpZ2g7Ci0KLSAgICAgICAgYml0c19wZXJfbWJfYXRfdGhpc19xID0gKGludCkoLjUgKyBlcnJfY29ycmVjdGlvbl9mYWN0b3IgKiBjb21iaW5lZF9jb3JyZWN0aW9uX2ZhY3RvciAqIChkb3VibGUpdnA4X2JpdHNfcGVyX21iW0lOVEVSX0ZSQU1FXVtRXSk7Ci0KLSAgICAgICAgaWYgKGJpdHNfcGVyX21iX2F0X3RoaXNfcSA8PSB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYikKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIElmIHdlIGNvdWxkIG5vdCBoaXQgdGhlIHRhcmdldCBldmVuIGF0IE1heCBRIHRoZW4gZXN0aW1hdGUgd2hhdCBRIHdvdWxkIGhhdmUgYmVlIHJlcXVpcmVkCi0gICAgd2hpbGUgKChiaXRzX3Blcl9tYl9hdF90aGlzX3EgPiB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYikgICYmIChRIDwgKE1BWFEgKiAyKSkpCi0gICAgewotCi0gICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9IChpbnQpKDAuOTYgKiBiaXRzX3Blcl9tYl9hdF90aGlzX3EpOwotICAgICAgICBRKys7Ci0gICAgfQotCi0gICAgaWYgKDApCi0gICAgewotICAgICAgICBGSUxFICpmID0gZm9wZW4oImVzdGtmX3Euc3R0IiwgImEiKTsKLSAgICAgICAgZnByaW50ZihmLCAiJThkICU4ZCAlOGQgJTguMmYgJTguM2YgJTguMmYgJTguM2YgJTguM2YgJTguM2YgJThkXG4iLCBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBiaXRzX3Blcl9tYl9hdF90aGlzX3EsCi0gICAgICAgICAgICAgICAgdGFyZ2V0X25vcm1fYml0c19wZXJfbWIsIGVycl9wZXJfbWIsIGVycl9jb3JyZWN0aW9uX2ZhY3RvciwKLSAgICAgICAgICAgICAgICBjdXJyZW50X3NwZW5kX3JhdGlvLCBncm91cF9paXJhdGlvLCBpaXJhdGlvX2NvcnJlY3Rpb25fZmFjdG9yLAotICAgICAgICAgICAgICAgIChkb3VibGUpY3BpLT5idWZmZXJfbGV2ZWwgLyAoZG91YmxlKWNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCwgUSk7Ci0gICAgICAgIGZjbG9zZShmKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUTsKLX0KLQotLy8gRm9yIGNxIG1vZGUgZXN0aW1hdGUgYSBjcSBsZXZlbCB0aGF0IG1hdGNoZXMgdGhlIG9ic2VydmVkCi0vLyBjb21wbGV4aXR5IGFuZCBkYXRhIHJhdGUuCi1zdGF0aWMgaW50IGVzdGltYXRlX2NxKFZQOF9DT01QICpjcGksIGRvdWJsZSBzZWN0aW9uX2VyciwgaW50IHNlY3Rpb25fdGFyZ2V0X2JhbmR3aXRkaCkKLXsKLSAgICBpbnQgUTsKLSAgICBpbnQgbnVtX21icyA9IGNwaS0+Y29tbW9uLk1CczsKLSAgICBpbnQgdGFyZ2V0X25vcm1fYml0c19wZXJfbWI7Ci0KLSAgICBkb3VibGUgZXJyX3Blcl9tYiA9IHNlY3Rpb25fZXJyIC8gbnVtX21iczsKLSAgICBkb3VibGUgY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgZG91YmxlIGNvcnJfaGlnaDsKLSAgICBkb3VibGUgc3BlZWRfY29ycmVjdGlvbiA9IDEuMDsKLSAgICBkb3VibGUgcG93X2hpZ2hxID0gMC45MDsKLSAgICBkb3VibGUgcG93X2xvd3EgPSAwLjQwOwotICAgIGRvdWJsZSBjbGlwX2lpcmF0aW87Ci0gICAgZG91YmxlIGNsaXBfaWlmYWN0b3I7Ci0KLSAgICB0YXJnZXRfbm9ybV9iaXRzX3Blcl9tYiA9IChzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGggPCAoMSA8PCAyMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICg1MTIgKiBzZWN0aW9uX3RhcmdldF9iYW5kd2l0ZGgpIC8gbnVtX21icwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1MTIgKiAoc2VjdGlvbl90YXJnZXRfYmFuZHdpdGRoIC8gbnVtX21icyk7Ci0KLSAgICAvLyBDb3JyZWN0aW9ucyBmb3IgaGlnaGVyIGNvbXByZXNzaW9uIHNwZWVkIHNldHRpbmdzCi0gICAgLy8gKHJlZHVjZWQgY29tcHJlc3Npb24gZXhwZWN0ZWQpCi0gICAgaWYgKChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMykgfHwgKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAxKSkKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPm94Y2YuY3B1X3VzZWQgPD0gNSkKLSAgICAgICAgICAgIHNwZWVkX2NvcnJlY3Rpb24gPSAxLjA0ICsgKGNwaS0+b3hjZi5jcHVfdXNlZCAqIDAuMDQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzcGVlZF9jb3JyZWN0aW9uID0gMS4yNTsKLSAgICB9Ci0gICAgLy8gSUkgcmF0aW8gY29ycmVjdGlvbiBmYWN0b3IgZm9yIGNsaXAgYXMgYSB3aG9sZQotICAgIGNsaXBfaWlyYXRpbyA9IGNwaS0+dG90YWxfc3RhdHMtPmludHJhX2Vycm9yIC8KLSAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKGNwaS0+dG90YWxfc3RhdHMtPmNvZGVkX2Vycm9yKTsKLSAgICBjbGlwX2lpZmFjdG9yID0gMS4wIC0gKChjbGlwX2lpcmF0aW8gLSAxMC4wKSAqIDAuMDI1KTsKLSAgICBpZiAoY2xpcF9paWZhY3RvciA8IDAuODApCi0gICAgICAgIGNsaXBfaWlmYWN0b3IgPSAwLjgwOwotCi0gICAgLy8gQ29ycmVjdGlvbiBmYWN0b3IgdXNlZCBmb3IgUSB2YWx1ZXMgPj0gMjAKLSAgICBjb3JyX2hpZ2ggPSBwb3coZXJyX3Blcl9tYiAvIEJBU0VfRVJSUEVSTUIsIHBvd19oaWdocSk7Ci0gICAgY29ycl9oaWdoID0gKGNvcnJfaGlnaCA8IDAuMDUpID8gMC4wNSA6IChjb3JyX2hpZ2ggPiA1LjApID8gNS4wIDogY29ycl9oaWdoOwotCi0gICAgLy8gVHJ5IGFuZCBwaWNrIGEgUSB0aGF0IGNhbiBlbmNvZGUgdGhlIGNvbnRlbnQgYXQgdGhlIGdpdmVuIHJhdGUuCi0gICAgZm9yIChRID0gMDsgUSA8IE1BWFE7IFErKykKLSAgICB7Ci0gICAgICAgIGludCBiaXRzX3Blcl9tYl9hdF90aGlzX3E7Ci0KLSAgICAgICAgaWYgKFEgPCA1MCkKLSAgICAgICAgewotICAgICAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPQotICAgICAgICAgICAgICAgIHBvdyggZXJyX3Blcl9tYiAvIEJBU0VfRVJSUEVSTUIsIChwb3dfbG93cSArIFEgKiAwLjAxKSk7Ci0KLSAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gKGNvcnJlY3Rpb25fZmFjdG9yIDwgMC4wNSkgPyAwLjA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChjb3JyZWN0aW9uX2ZhY3RvciA+IDUuMCkgPyA1LjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvcnJlY3Rpb25fZmFjdG9yOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY29ycl9oaWdoOwotCi0gICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9Ci0gICAgICAgICAgICAoaW50KSggLjUgKyBjb3JyZWN0aW9uX2ZhY3RvciAqCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9jb3JyZWN0aW9uICoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfaWlmYWN0b3IgKgotICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSl2cDhfYml0c19wZXJfbWJbSU5URVJfRlJBTUVdW1FdIC8gMS4wKTsKLQotICAgICAgICBpZiAoYml0c19wZXJfbWJfYXRfdGhpc19xIDw9IHRhcmdldF9ub3JtX2JpdHNfcGVyX21iKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNxX2xldmVsW1FdOwotfQotCi1leHRlcm4gdm9pZCB2cDhfbmV3X2ZyYW1lX3JhdGUoVlA4X0NPTVAgKmNwaSwgZG91YmxlIGZyYW1lcmF0ZSk7Ci0KLXZvaWQgdnA4X2luaXRfc2Vjb25kX3Bhc3MoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBGSVJTVFBBU1NfU1RBVFMgdGhpc19mcmFtZTsKLSAgICBGSVJTVFBBU1NfU1RBVFMgKnN0YXJ0X3BvczsKLQotICAgIGRvdWJsZSB0d29fcGFzc19taW5fcmF0ZSA9IChkb3VibGUpKGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoICogY3BpLT5veGNmLnR3b19wYXNzX3Zicm1pbl9zZWN0aW9uIC8gMTAwKTsKLQotICAgIHplcm9fc3RhdHMoY3BpLT50b3RhbF9zdGF0cyk7Ci0KLSAgICBpZiAoIWNwaS0+c3RhdHNfaW5fZW5kKQotICAgICAgICByZXR1cm47Ci0KLSAgICAqY3BpLT50b3RhbF9zdGF0cyA9ICpjcGktPnN0YXRzX2luX2VuZDsKLQotICAgIGNwaS0+dG90YWxfZXJyb3JfbGVmdCA9IGNwaS0+dG90YWxfc3RhdHMtPnNzaW1fd2VpZ2h0ZWRfcHJlZF9lcnI7Ci0gICAgY3BpLT50b3RhbF9pbnRyYV9lcnJvcl9sZWZ0ID0gY3BpLT50b3RhbF9zdGF0cy0+aW50cmFfZXJyb3I7Ci0gICAgY3BpLT50b3RhbF9jb2RlZF9lcnJvcl9sZWZ0ID0gY3BpLT50b3RhbF9zdGF0cy0+Y29kZWRfZXJyb3I7Ci0gICAgY3BpLT5zdGFydF90b3RfZXJyX2xlZnQgPSBjcGktPnRvdGFsX2Vycm9yX2xlZnQ7Ci0KLSAgICAvL2NwaS0+Yml0c19sZWZ0ID0gKGxvbmcgbG9uZykoY3BpLT50b3RhbF9zdGF0cy0+Y291bnQgKiBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPm94Y2YuZnJhbWVfcmF0ZSkpOwotICAgIC8vY3BpLT5iaXRzX2xlZnQgLT0gKGxvbmcgbG9uZykoY3BpLT50b3RhbF9zdGF0cy0+Y291bnQgKiB0d29fcGFzc19taW5fcmF0ZSAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPm94Y2YuZnJhbWVfcmF0ZSkpOwotCi0gICAgLy8gZWFjaCBmcmFtZSBjYW4gaGF2ZSBhIGRpZmZlcmVudCBkdXJhdGlvbiwgYXMgdGhlIGZyYW1lIHJhdGUgaW4gdGhlIHNvdXJjZQotICAgIC8vIGlzbid0IGd1YXJhbnRlZWQgdG8gYmUgY29uc3RhbnQuICAgVGhlIGZyYW1lIHJhdGUgcHJpb3IgdG8gdGhlIGZpcnN0IGZyYW1lCi0gICAgLy8gZW5jb2RlZCBpbiB0aGUgc2Vjb25kIHBhc3MgaXMgYSBndWVzcy4gIEhvd2V2ZXIgdGhlIHN1bSBkdXJhdGlvbiBpcyBub3QuCi0gICAgLy8gSXRzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGFjdHVhbCBkdXJhdGlvbnMgb2YgYWxsIGZyYW1lcyBmcm9tIHRoZSBmaXJzdAotICAgIC8vIHBhc3MuCi0gICAgdnA4X25ld19mcmFtZV9yYXRlKGNwaSwgMTAwMDAwMDAuMCAqIGNwaS0+dG90YWxfc3RhdHMtPmNvdW50IC8gY3BpLT50b3RhbF9zdGF0cy0+ZHVyYXRpb24pOwotCi0gICAgY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSA9IGNwaS0+b3hjZi5mcmFtZV9yYXRlOwotICAgIGNwaS0+Yml0c19sZWZ0ID0gKGxvbmcgbG9uZykoY3BpLT50b3RhbF9zdGF0cy0+ZHVyYXRpb24gKiBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAvIDEwMDAwMDAwLjApIDsKLSAgICBjcGktPmJpdHNfbGVmdCAtPSAobG9uZyBsb25nKShjcGktPnRvdGFsX3N0YXRzLT5kdXJhdGlvbiAqIHR3b19wYXNzX21pbl9yYXRlIC8gMTAwMDAwMDAuMCk7Ci0gICAgY3BpLT5jbGlwX2JpdHNfdG90YWwgPSBjcGktPmJpdHNfbGVmdDsKLQotICAgIC8vIENhbGN1bGF0ZSBhIG1pbmltdW0gaW50cmEgdmFsdWUgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgSUlyYXRpbwotICAgIC8vIHNjb3JlcyB1c2VkIGluIHRoZSBzZWNvbmQgcGFzcy4gV2UgaGF2ZSB0aGlzIG1pbmltdW0gdG8gbWFrZSBzdXJlCi0gICAgLy8gdGhhdCBjbGlwcyB0aGF0IGFyZSBzdGF0aWMgYnV0ICJsb3cgY29tcGxleGl0eSIgaW4gdGhlIGludHJhIGRvbWFpbgotICAgIC8vIGFyZSBzdGlsbCBib29zdGVkIGFwcHJvcHJpYXRlbHkgZm9yIEtGL0dGL0FSRgotICAgIGNwaS0+a2ZfaW50cmFfZXJyX21pbiA9IEtGX01CX0lOVFJBX01JTiAqIGNwaS0+Y29tbW9uLk1CczsKLSAgICBjcGktPmdmX2ludHJhX2Vycl9taW4gPSBHRl9NQl9JTlRSQV9NSU4gKiBjcGktPmNvbW1vbi5NQnM7Ci0KLSAgICBhdmdfc3RhdHMoY3BpLT50b3RhbF9zdGF0cyk7Ci0KLSAgICAvLyBTY2FuIHRoZSBmaXJzdCBwYXNzIGZpbGUgYW5kIGNhbGN1bGF0ZSBhbiBhdmVyYWdlIEludHJhIC8gSW50ZXIgZXJyb3Igc2NvcmUgcmF0aW8gZm9yIHRoZSBzZXF1ZW5jZQotICAgIHsKLSAgICAgICAgZG91YmxlIHN1bV9paXJhdGlvID0gMC4wOwotICAgICAgICBkb3VibGUgSUlSYXRpbzsKLQotICAgICAgICBzdGFydF9wb3MgPSBjcGktPnN0YXRzX2luOyAgICAgICAgICAgICAgIC8vIE5vdGUgc3RhcnRpbmcgImZpbGUiIHBvc2l0aW9uCi0KLSAgICAgICAgd2hpbGUgKGlucHV0X3N0YXRzKGNwaSwgJnRoaXNfZnJhbWUpICE9IEVPRikKLSAgICAgICAgewotICAgICAgICAgICAgSUlSYXRpbyA9IHRoaXNfZnJhbWUuaW50cmFfZXJyb3IgLyBET1VCTEVfRElWSURFX0NIRUNLKHRoaXNfZnJhbWUuY29kZWRfZXJyb3IpOwotICAgICAgICAgICAgSUlSYXRpbyA9IChJSVJhdGlvIDwgMS4wKSA/IDEuMCA6IChJSVJhdGlvID4gMjAuMCkgPyAyMC4wIDogSUlSYXRpbzsKLSAgICAgICAgICAgIHN1bV9paXJhdGlvICs9IElJUmF0aW87Ci0gICAgICAgIH0KLQotICAgICAgICBjcGktPmF2Z19paXJhdGlvID0gc3VtX2lpcmF0aW8gLyBET1VCTEVfRElWSURFX0NIRUNLKChkb3VibGUpY3BpLT50b3RhbF9zdGF0cy0+Y291bnQpOwotCi0gICAgICAgIC8vIFJlc2V0IGZpbGUgcG9zaXRpb24KLSAgICAgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zKTsKLSAgICB9Ci0KLSAgICAvLyBTY2FuIHRoZSBmaXJzdCBwYXNzIGZpbGUgYW5kIGNhbGN1bGF0ZSBhIG1vZGlmaWVkIHRvdGFsIGVycm9yIGJhc2VkIHVwb24gdGhlIGJpYXMvcG93ZXIgZnVuY3Rpb24KLSAgICAvLyB1c2VkIHRvIGFsbG9jYXRlIGJpdHMKLSAgICB7Ci0gICAgICAgIHN0YXJ0X3BvcyA9IGNwaS0+c3RhdHNfaW47ICAgICAgICAgICAgICAgLy8gTm90ZSBzdGFydGluZyAiZmlsZSIgcG9zaXRpb24KLQotICAgICAgICBjcGktPm1vZGlmaWVkX2Vycm9yX3RvdGFsID0gMC4wOwotICAgICAgICBjcGktPm1vZGlmaWVkX2Vycm9yX3VzZWQgPSAwLjA7Ci0KLSAgICAgICAgd2hpbGUgKGlucHV0X3N0YXRzKGNwaSwgJnRoaXNfZnJhbWUpICE9IEVPRikKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5tb2RpZmllZF9lcnJvcl90b3RhbCArPSBjYWxjdWxhdGVfbW9kaWZpZWRfZXJyKGNwaSwgJnRoaXNfZnJhbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNwaS0+bW9kaWZpZWRfZXJyb3JfbGVmdCA9IGNwaS0+bW9kaWZpZWRfZXJyb3JfdG90YWw7Ci0KLSAgICAgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zKTsgICAgICAgICAgICAvLyBSZXNldCBmaWxlIHBvc2l0aW9uCi0KLSAgICB9Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIGNsaXAgdGFyZ2V0IG1vZGlmaWVkIGJpdHMgcGVyIGVycm9yCi0gICAgLy8gVGhlIG9ic2VydmVkIGJwZSBzdGFydHMgYXMgdGhlIHNhbWUgbnVtYmVyLgotICAgIGNwaS0+Y2xpcF9icGUgPSAgY3BpLT5iaXRzX2xlZnQgLwotICAgICAgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSyhjcGktPm1vZGlmaWVkX2Vycm9yX3RvdGFsKTsKLSAgICBjcGktPm9ic2VydmVkX2JwZSA9IGNwaS0+Y2xpcF9icGU7Ci19Ci0KLXZvaWQgdnA4X2VuZF9zZWNvbmRfcGFzcyhWUDhfQ09NUCAqY3BpKQotewotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIGdpdmVzIGFuZCBlc3RpbWF0ZSBvZiBob3cgYmFkbHkgd2UgYmVsaWV2ZQotLy8gdGhlIHByZWRpY3Rpb24gcXVhbGl0eSBpcyBkZWNheWluZyBmcm9tIGZyYW1lIHRvIGZyYW1lLgotc3RhdGljIGRvdWJsZSBnZXRfcHJlZGljdGlvbl9kZWNheV9yYXRlKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqbmV4dF9mcmFtZSkKLXsKLSAgICBkb3VibGUgcHJlZGljdGlvbl9kZWNheV9yYXRlOwotICAgIGRvdWJsZSBtb3Rpb25fZGVjYXk7Ci0gICAgZG91YmxlIG1vdGlvbl9wY3QgPSBuZXh0X2ZyYW1lLT5wY250X21vdGlvbjsKLQotCi0gICAgLy8gSW5pdGlhbCBiYXNpcyBpcyB0aGUgJSBtYnMgaW50ZXIgY29kZWQKLSAgICBwcmVkaWN0aW9uX2RlY2F5X3JhdGUgPSBuZXh0X2ZyYW1lLT5wY250X2ludGVyOwotCi0gICAgLy8gSGlnaCAlIG1vdGlvbiAtPiBzb21ld2hhdCBoaWdoZXIgZGVjYXkgcmF0ZQotICAgIG1vdGlvbl9kZWNheSA9ICgxLjAgLSAobW90aW9uX3BjdCAvIDIwLjApKTsKLSAgICBpZiAobW90aW9uX2RlY2F5IDwgcHJlZGljdGlvbl9kZWNheV9yYXRlKQotICAgICAgICBwcmVkaWN0aW9uX2RlY2F5X3JhdGUgPSBtb3Rpb25fZGVjYXk7Ci0KLSAgICAvLyBBZGp1c3RtZW50IHRvIGRlY2F5IHJhdGUgYmFzZWQgb24gc3BlZWQgb2YgbW90aW9uCi0gICAgewotICAgICAgICBkb3VibGUgdGhpc19tdl9yYWJzOwotICAgICAgICBkb3VibGUgdGhpc19tdl9jYWJzOwotICAgICAgICBkb3VibGUgZGlzdGFuY2VfZmFjdG9yOwotCi0gICAgICAgIHRoaXNfbXZfcmFicyA9IGZhYnMobmV4dF9mcmFtZS0+bXZyX2FicyAqIG1vdGlvbl9wY3QpOwotICAgICAgICB0aGlzX212X2NhYnMgPSBmYWJzKG5leHRfZnJhbWUtPm12Y19hYnMgKiBtb3Rpb25fcGN0KTsKLQotICAgICAgICBkaXN0YW5jZV9mYWN0b3IgPSBzcXJ0KCh0aGlzX212X3JhYnMgKiB0aGlzX212X3JhYnMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpc19tdl9jYWJzICogdGhpc19tdl9jYWJzKSkgLyAyNTAuMDsKLSAgICAgICAgZGlzdGFuY2VfZmFjdG9yID0gKChkaXN0YW5jZV9mYWN0b3IgPiAxLjApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMC4wIDogKDEuMCAtIGRpc3RhbmNlX2ZhY3RvcikpOwotICAgICAgICBpZiAoZGlzdGFuY2VfZmFjdG9yIDwgcHJlZGljdGlvbl9kZWNheV9yYXRlKQotICAgICAgICAgICAgcHJlZGljdGlvbl9kZWNheV9yYXRlID0gZGlzdGFuY2VfZmFjdG9yOwotICAgIH0KLQotICAgIHJldHVybiBwcmVkaWN0aW9uX2RlY2F5X3JhdGU7Ci19Ci0KLS8vIEZ1bmN0aW9uIHRvIHRlc3QgZm9yIGEgY29uZGl0aW9uIHdoZXJlIGEgY29tcGxleCB0cmFuc2l0aW9uIGlzIGZvbGxvd2VkCi0vLyBieSBhIHN0YXRpYyBzZWN0aW9uLiBGb3IgZXhhbXBsZSBpbiBzbGlkZSBzaG93cyB3aGVyZSB0aGVyZSBpcyBhIGZhZGUKLS8vIGJldHdlZW4gc2xpZGVzLiBUaGlzIGlzIHRvIGhlbHAgd2l0aCBtb3JlIG9wdGltYWwga2YgYW5kIGdmIHBvc2l0aW9uaW5nLgotc3RhdGljIGludCBkZXRlY3RfdHJhbnNpdGlvbl90b19zdGlsbCgKLSAgICBWUDhfQ09NUCAqY3BpLAotICAgIGludCBmcmFtZV9pbnRlcnZhbCwKLSAgICBpbnQgc3RpbGxfaW50ZXJ2YWwsCi0gICAgZG91YmxlIGxvb3BfZGVjYXlfcmF0ZSwKLSAgICBkb3VibGUgZGVjYXlfYWNjdW11bGF0b3IgKQotewotICAgIEJPT0wgdHJhbnNfdG9fc3RpbGwgPSBGQUxTRTsKLQotICAgIC8vIEJyZWFrIGNsYXVzZSB0byBkZXRlY3QgdmVyeSBzdGlsbCBzZWN0aW9ucyBhZnRlciBtb3Rpb24KLSAgICAvLyBGb3IgZXhhbXBsZSBhIHN0YXRpYyBpbWFnZSBhZnRlciBhIGZhZGUgb3Igb3RoZXIgdHJhbnNpdGlvbgotICAgIC8vIGluc3RlYWQgb2YgYSBjbGVhbiBzY2VuZSBjdXQuCi0gICAgaWYgKCAoZnJhbWVfaW50ZXJ2YWwgPiBNSU5fR0ZfSU5URVJWQUwpICYmCi0gICAgICAgICAobG9vcF9kZWNheV9yYXRlID49IDAuOTk5KSAmJgotICAgICAgICAgKGRlY2F5X2FjY3VtdWxhdG9yIDwgMC45KSApCi0gICAgewotICAgICAgICBpbnQgajsKLSAgICAgICAgRklSU1RQQVNTX1NUQVRTICogcG9zaXRpb24gPSBjcGktPnN0YXRzX2luOwotICAgICAgICBGSVJTVFBBU1NfU1RBVFMgdG1wX25leHRfZnJhbWU7Ci0gICAgICAgIGRvdWJsZSBkZWNheV9yYXRlOwotCi0gICAgICAgIC8vIExvb2sgYWhlYWQgYSBmZXcgZnJhbWVzIHRvIHNlZSBpZiBzdGF0aWMgY29uZGl0aW9uCi0gICAgICAgIC8vIHBlcnNpc3RzLi4uCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgc3RpbGxfaW50ZXJ2YWw7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCAmdG1wX25leHRfZnJhbWUpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWNheV9yYXRlID0gZ2V0X3ByZWRpY3Rpb25fZGVjYXlfcmF0ZShjcGksICZ0bXBfbmV4dF9mcmFtZSk7Ci0gICAgICAgICAgICBpZiAoIGRlY2F5X3JhdGUgPCAwLjk5OSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVzZXQgZmlsZSBwb3NpdGlvbgotICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBwb3NpdGlvbik7Ci0KLSAgICAgICAgLy8gT25seSBpZiBpdCBkb2VzIGRvIHdlIHNpZ25hbCBhIHRyYW5zaXRpb24gdG8gc3RpbGwKLSAgICAgICAgaWYgKCBqID09IHN0aWxsX2ludGVydmFsICkKLSAgICAgICAgICAgIHRyYW5zX3RvX3N0aWxsID0gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJhbnNfdG9fc3RpbGw7Ci19Ci0KLS8vIEFuYWx5c2UgYW5kIGRlZmluZSBhIGdmL2FyZiBncm91cCAuCi1zdGF0aWMgdm9pZCBkZWZpbmVfZ2ZfZ3JvdXAoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICp0aGlzX2ZyYW1lKQotewotICAgIEZJUlNUUEFTU19TVEFUUyBuZXh0X2ZyYW1lOwotICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhcnRfcG9zOwotICAgIGludCBpOwotICAgIGludCB5X3dpZHRoICA9IGNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24ubHN0X2ZiX2lkeF0ueV93aWR0aDsKLSAgICBpbnQgeV9oZWlnaHQgPSBjcGktPmNvbW1vbi55djEyX2ZiW2NwaS0+Y29tbW9uLmxzdF9mYl9pZHhdLnlfaGVpZ2h0OwotICAgIGludCBpbWFnZV9zaXplID0geV93aWR0aCAgKiB5X2hlaWdodDsKLSAgICBkb3VibGUgYm9vc3Rfc2NvcmUgPSAwLjA7Ci0gICAgZG91YmxlIG9sZF9ib29zdF9zY29yZSA9IDAuMDsKLSAgICBkb3VibGUgZ2ZfZ3JvdXBfZXJyID0gMC4wOwotICAgIGRvdWJsZSBnZl9maXJzdF9mcmFtZV9lcnIgPSAwLjA7Ci0gICAgZG91YmxlIG1vZF9mcmFtZV9lcnIgPSAwLjA7Ci0KLSAgICBkb3VibGUgbXZfYWNjdW11bGF0b3JfcmFicyAgPSAwLjA7Ci0gICAgZG91YmxlIG12X2FjY3VtdWxhdG9yX2NhYnMgID0gMC4wOwotICAgIGRvdWJsZSBtdl9yYXRpb19hY2N1bXVsYXRvciA9IDAuMDsKLSAgICBkb3VibGUgZGVjYXlfYWNjdW11bGF0b3IgPSAxLjA7Ci0KLSAgICBkb3VibGUgYm9vc3RfZmFjdG9yID0gSUlGQUNUT1I7Ci0gICAgZG91YmxlIGxvb3BfZGVjYXlfcmF0ZSA9IDEuMDA7ICAgICAgICAgIC8vIFN0YXJ0aW5nIGRlY2F5IHJhdGUKLQotICAgIGRvdWJsZSB0aGlzX2ZyYW1lX212X2luX291dCA9IDAuMDsKLSAgICBkb3VibGUgbXZfaW5fb3V0X2FjY3VtdWxhdG9yID0gMC4wOwotICAgIGRvdWJsZSBhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yID0gMC4wOwotICAgIGRvdWJsZSBtb2RfZXJyX3Blcl9tYl9hY2N1bXVsYXRvciA9IDAuMDsKLQotICAgIGludCBtYXhfYml0cyA9IGZyYW1lX21heF9iaXRzKGNwaSk7ICAgICAvLyBNYXggZm9yIGEgc2luZ2xlIGZyYW1lCi0KLSAgICB1bnNpZ25lZCBpbnQgYWxsb3dfYWx0X3JlZiA9Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+b3hjZi5wbGF5X2FsdGVybmF0ZSAmJiBjcGktPm94Y2YubGFnX2luX2ZyYW1lczsKLQotICAgIGNwaS0+Z2ZfZ3JvdXBfYml0cyA9IDA7Ci0gICAgY3BpLT5nZl9kZWNheV9yYXRlID0gMDsKLQotICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsgIC8vX19hc20gZW1tczsKLQotICAgIHN0YXJ0X3BvcyA9IGNwaS0+c3RhdHNfaW47Ci0KLSAgICB2cHhfbWVtc2V0KCZuZXh0X2ZyYW1lLCAwLCBzaXplb2YobmV4dF9mcmFtZSkpOyAvLyBhc3N1cmUgY2xlYW4KLQotICAgIC8vIFByZWxvYWQgdGhlIHN0YXRzIGZvciB0aGUgbmV4dCBmcmFtZS4KLSAgICBtb2RfZnJhbWVfZXJyID0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksIHRoaXNfZnJhbWUpOwotCi0gICAgLy8gTm90ZSB0aGUgZXJyb3Igb2YgdGhlIGZyYW1lIGF0IHRoZSBzdGFydCBvZiB0aGUgZ3JvdXAgKHRoaXMgd2lsbCBiZQotICAgIC8vIHRoZSBHRiBmcmFtZSBlcnJvciBpZiB3ZSBjb2RlIGEgbm9ybWFsIGdmCi0gICAgZ2ZfZmlyc3RfZnJhbWVfZXJyID0gbW9kX2ZyYW1lX2VycjsKLQotICAgIC8vIFNwZWNpYWwgdHJlYXRtZW50IGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGEga2V5IGZyYW1lICh3aGljaCBpcyBhbHNvCi0gICAgLy8gYSBnZikuIElmIGl0IGlzIHRoZW4gaXRzIGVycm9yIHNjb3JlIChhbmQgaGVuY2UgYml0IGFsbG9jYXRpb24pIG5lZWQKLSAgICAvLyB0byBiZSBzdWJ0cmFjdGVkIG91dCBmcm9tIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIEdGIGdyb3VwCi0gICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICBnZl9ncm91cF9lcnIgLT0gZ2ZfZmlyc3RfZnJhbWVfZXJyOwotCi0gICAgLy8gU2NhbiBmb3J3YXJkIHRvIHRyeSBhbmQgd29yayBvdXQgaG93IG1hbnkgZnJhbWVzIHRoZSBuZXh0IGdmIGdyb3VwCi0gICAgLy8gc2hvdWxkIGNvbnRhaW4gYW5kIHdoYXQgbGV2ZWwgb2YgYm9vc3QgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBHRgotICAgIC8vIG9yIEFSRiB0aGF0IHdpbGwgYmUgY29kZWQgd2l0aCB0aGUgZ3JvdXAKLSAgICBpID0gMDsKLQotICAgIHdoaWxlICgoKGkgPCBjcGktPnN0YXRpY19zY2VuZV9tYXhfZ2ZfaW50ZXJ2YWwpIHx8Ci0gICAgICAgICAgICAoKGNwaS0+ZnJhbWVzX3RvX2tleSAtIGkpIDwgTUlOX0dGX0lOVEVSVkFMKSkgJiYKLSAgICAgICAgICAgKGkgPCBjcGktPmZyYW1lc190b19rZXkpKQotICAgIHsKLSAgICAgICAgZG91YmxlIHI7Ci0gICAgICAgIGRvdWJsZSB0aGlzX2ZyYW1lX212cl9yYXRpbzsKLSAgICAgICAgZG91YmxlIHRoaXNfZnJhbWVfbXZjX3JhdGlvOwotICAgICAgICBkb3VibGUgbW90aW9uX2RlY2F5OwotICAgICAgICAvL2RvdWJsZSBtb3Rpb25fcGN0ID0gbmV4dF9mcmFtZS5wY250X21vdGlvbjsKLSAgICAgICAgZG91YmxlIG1vdGlvbl9wY3Q7Ci0KLSAgICAgICAgaSsrOyAgICAvLyBJbmNyZW1lbnQgdGhlIGxvb3AgY291bnRlcgotCi0gICAgICAgIC8vIEFjY3VtdWxhdGUgZXJyb3Igc2NvcmUgb2YgZnJhbWVzIGluIHRoaXMgZ2YgZ3JvdXAKLSAgICAgICAgbW9kX2ZyYW1lX2VyciA9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKLQotICAgICAgICBnZl9ncm91cF9lcnIgKz0gbW9kX2ZyYW1lX2VycjsKLQotICAgICAgICBtb2RfZXJyX3Blcl9tYl9hY2N1bXVsYXRvciArPQotICAgICAgICAgICAgbW9kX2ZyYW1lX2VyciAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmNvbW1vbi5NQnMpOwotCi0gICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCAmbmV4dF9mcmFtZSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBBY2N1bXVsYXRlIG1vdGlvbiBzdGF0cy4KLSAgICAgICAgbW90aW9uX3BjdCA9IG5leHRfZnJhbWUucGNudF9tb3Rpb247Ci0gICAgICAgIG12X2FjY3VtdWxhdG9yX3JhYnMgKz0gZmFicyhuZXh0X2ZyYW1lLm12cl9hYnMgKiBtb3Rpb25fcGN0KTsKLSAgICAgICAgbXZfYWNjdW11bGF0b3JfY2FicyArPSBmYWJzKG5leHRfZnJhbWUubXZjX2FicyAqIG1vdGlvbl9wY3QpOwotCi0gICAgICAgIC8vQWNjdW11bGF0ZSBNb3Rpb24gSW4vT3V0IG9mIGZyYW1lIHN0YXRzCi0gICAgICAgIHRoaXNfZnJhbWVfbXZfaW5fb3V0ID0KLSAgICAgICAgICAgIG5leHRfZnJhbWUubXZfaW5fb3V0X2NvdW50ICogbW90aW9uX3BjdDsKLSAgICAgICAgbXZfaW5fb3V0X2FjY3VtdWxhdG9yICs9Ci0gICAgICAgICAgICBuZXh0X2ZyYW1lLm12X2luX291dF9jb3VudCAqIG1vdGlvbl9wY3Q7Ci0gICAgICAgIGFic19tdl9pbl9vdXRfYWNjdW11bGF0b3IgKz0KLSAgICAgICAgICAgIGZhYnMobmV4dF9mcmFtZS5tdl9pbl9vdXRfY291bnQgKiBtb3Rpb25fcGN0KTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBtb3Rpb24KLSAgICAgICAgaWYgKG1vdGlvbl9wY3QgPiAwLjA1KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzX2ZyYW1lX212cl9yYXRpbyA9IGZhYnMobmV4dF9mcmFtZS5tdnJfYWJzKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soZmFicyhuZXh0X2ZyYW1lLk1WcikpOwotCi0gICAgICAgICAgICB0aGlzX2ZyYW1lX212Y19yYXRpbyA9IGZhYnMobmV4dF9mcmFtZS5tdmNfYWJzKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soZmFicyhuZXh0X2ZyYW1lLk1WYykpOwotCi0gICAgICAgICAgICBtdl9yYXRpb19hY2N1bXVsYXRvciArPQotICAgICAgICAgICAgICAgICh0aGlzX2ZyYW1lX212cl9yYXRpbyA8IG5leHRfZnJhbWUubXZyX2FicykKLSAgICAgICAgICAgICAgICAgICAgPyAodGhpc19mcmFtZV9tdnJfcmF0aW8gKiBtb3Rpb25fcGN0KQotICAgICAgICAgICAgICAgICAgICA6IG5leHRfZnJhbWUubXZyX2FicyAqIG1vdGlvbl9wY3Q7Ci0KLSAgICAgICAgICAgIG12X3JhdGlvX2FjY3VtdWxhdG9yICs9Ci0gICAgICAgICAgICAgICAgKHRoaXNfZnJhbWVfbXZjX3JhdGlvIDwgbmV4dF9mcmFtZS5tdmNfYWJzKQotICAgICAgICAgICAgICAgICAgICA/ICh0aGlzX2ZyYW1lX212Y19yYXRpbyAqIG1vdGlvbl9wY3QpCi0gICAgICAgICAgICAgICAgICAgIDogbmV4dF9mcmFtZS5tdmNfYWJzICogbW90aW9uX3BjdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12X3JhdGlvX2FjY3VtdWxhdG9yICs9IDAuMDsKLSAgICAgICAgICAgIHRoaXNfZnJhbWVfbXZyX3JhdGlvID0gMS4wOwotICAgICAgICAgICAgdGhpc19mcmFtZV9tdmNfcmF0aW8gPSAxLjA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVbmRlcmx5aW5nIGJvb3N0IGZhY3RvciBpcyBiYXNlZCBvbiBpbnRlciBpbnRyYSBlcnJvciByYXRpbwotICAgICAgICByID0gKCBib29zdF9mYWN0b3IgKgotICAgICAgICAgICAgICAoIG5leHRfZnJhbWUuaW50cmFfZXJyb3IgLwotICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0sobmV4dF9mcmFtZS5jb2RlZF9lcnJvcikpKTsKLQotICAgICAgICBpZiAobmV4dF9mcmFtZS5pbnRyYV9lcnJvciA+IGNwaS0+Z2ZfaW50cmFfZXJyX21pbikKLSAgICAgICAgICAgIHIgPSAoSUlLRkFDVE9SMiAqIG5leHRfZnJhbWUuaW50cmFfZXJyb3IgLwotICAgICAgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSyhuZXh0X2ZyYW1lLmNvZGVkX2Vycm9yKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHIgPSAoSUlLRkFDVE9SMiAqIGNwaS0+Z2ZfaW50cmFfZXJyX21pbiAvCi0gICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKG5leHRfZnJhbWUuY29kZWRfZXJyb3IpKTsKLQotICAgICAgICAvLyBJbmNyZWFzZSBib29zdCBmb3IgZnJhbWVzIHdoZXJlIG5ldyBkYXRhIGNvbWluZyBpbnRvIGZyYW1lCi0gICAgICAgIC8vIChlZyB6b29tIG91dCkuIFNsaWdodGx5IHJlZHVjZSBib29zdCBpZiB0aGVyZSBpcyBhIG5ldCBiYWxhbmNlCi0gICAgICAgIC8vIG9mIG1vdGlvbiBvdXQgb2YgdGhlIGZyYW1lICh6b29tIGluKS4KLSAgICAgICAgLy8gVGhlIHJhbmdlIGZvciB0aGlzX2ZyYW1lX212X2luX291dCBpcyAtMS4wIHRvICsxLjAKLSAgICAgICAgaWYgKHRoaXNfZnJhbWVfbXZfaW5fb3V0ID4gMC4wKQotICAgICAgICAgICAgciArPSByICogKHRoaXNfZnJhbWVfbXZfaW5fb3V0ICogMi4wKTsKLSAgICAgICAgLy8gSW4gZXh0cmVtZSBjYXNlIGJvb3N0IGlzIGhhbHZlZAotICAgICAgICBlbHNlCi0gICAgICAgICAgICByICs9IHIgKiAodGhpc19mcmFtZV9tdl9pbl9vdXQgLyAyLjApOwotCi0gICAgICAgIGlmIChyID4gR0ZfUk1BWCkKLSAgICAgICAgICAgIHIgPSBHRl9STUFYOwotCi0gICAgICAgIGxvb3BfZGVjYXlfcmF0ZSA9IGdldF9wcmVkaWN0aW9uX2RlY2F5X3JhdGUoY3BpLCAmbmV4dF9mcmFtZSk7Ci0KLSAgICAgICAgLy8gQ3VtdWxhdGl2ZSBlZmZlY3Qgb2YgZGVjYXkKLSAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPSBkZWNheV9hY2N1bXVsYXRvciAqIGxvb3BfZGVjYXlfcmF0ZTsKLSAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPSBkZWNheV9hY2N1bXVsYXRvciA8IDAuMSA/IDAuMSA6IGRlY2F5X2FjY3VtdWxhdG9yOwotCi0gICAgICAgIGJvb3N0X3Njb3JlICs9IChkZWNheV9hY2N1bXVsYXRvciAqIHIpOwotCi0gICAgICAgIC8vIEJyZWFrIGNsYXVzZSB0byBkZXRlY3QgdmVyeSBzdGlsbCBzZWN0aW9ucyBhZnRlciBtb3Rpb24KLSAgICAgICAgLy8gRm9yIGV4YW1wbGUgYSBzdGFpYyBpbWFnZSBhZnRlciBhIGZhZGUgb3Igb3RoZXIgdHJhbnNpdGlvbi4KLSAgICAgICAgaWYgKCBkZXRlY3RfdHJhbnNpdGlvbl90b19zdGlsbCggY3BpLCBpLCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wX2RlY2F5X3JhdGUsIGRlY2F5X2FjY3VtdWxhdG9yICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhbGxvd19hbHRfcmVmID0gRkFMU0U7Ci0gICAgICAgICAgICBib29zdF9zY29yZSA9IG9sZF9ib29zdF9zY29yZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnJlYWsgb3V0IGNvbmRpdGlvbnMuCi0gICAgICAgIGlmICAoICAgLyogaT40IHx8ICovCi0gICAgICAgICAgICAvLyBCcmVhayBhdCBjcGktPm1heF9nZl9pbnRlcnZhbCB1bmxlc3MgYWxtb3N0IHRvdGFsbHkgc3RhdGljCi0gICAgICAgICAgICAoaSA+PSBjcGktPm1heF9nZl9pbnRlcnZhbCAmJiAoZGVjYXlfYWNjdW11bGF0b3IgPCAwLjk5NSkpIHx8Ci0gICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgLy8gRG9udCBicmVhayBvdXQgd2l0aCBhIHZlcnkgc2hvcnQgaW50ZXJ2YWwKLSAgICAgICAgICAgICAgICAoaSA+IE1JTl9HRl9JTlRFUlZBTCkgJiYKLSAgICAgICAgICAgICAgICAvLyBEb250IGJyZWFrIG91dCB2ZXJ5IGNsb3NlIHRvIGEga2V5IGZyYW1lCi0gICAgICAgICAgICAgICAgKChjcGktPmZyYW1lc190b19rZXkgLSBpKSA+PSBNSU5fR0ZfSU5URVJWQUwpICYmCi0gICAgICAgICAgICAgICAgKChib29zdF9zY29yZSA+IDIwLjApIHx8IChuZXh0X2ZyYW1lLnBjbnRfaW50ZXIgPCAwLjc1KSkgJiYKLSAgICAgICAgICAgICAgICAoKG12X3JhdGlvX2FjY3VtdWxhdG9yID4gMTAwLjApIHx8Ci0gICAgICAgICAgICAgICAgIChhYnNfbXZfaW5fb3V0X2FjY3VtdWxhdG9yID4gMy4wKSB8fAotICAgICAgICAgICAgICAgICAobXZfaW5fb3V0X2FjY3VtdWxhdG9yIDwgLTIuMCkgfHwKLSAgICAgICAgICAgICAgICAgKChib29zdF9zY29yZSAtIG9sZF9ib29zdF9zY29yZSkgPCAyLjApKQotICAgICAgICAgICAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb3N0X3Njb3JlID0gb2xkX2Jvb3N0X3Njb3JlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB2cHhfbWVtY3B5KHRoaXNfZnJhbWUsICZuZXh0X2ZyYW1lLCBzaXplb2YoKnRoaXNfZnJhbWUpKTsKLQotICAgICAgICBvbGRfYm9vc3Rfc2NvcmUgPSBib29zdF9zY29yZTsKLSAgICB9Ci0KLSAgICBjcGktPmdmX2RlY2F5X3JhdGUgPQotICAgICAgICAoaSA+IDApID8gKGludCkoMTAwLjAgKiAoMS4wIC0gZGVjYXlfYWNjdW11bGF0b3IpKSAvIGkgOiAwOwotCi0gICAgLy8gV2hlbiB1c2luZyBDQlIgYXBwbHkgYWRkaXRpb25hbCBidWZmZXIgcmVsYXRlZCB1cHBlciBsaW1pdHMKLSAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCi0gICAgewotICAgICAgICBkb3VibGUgbWF4X2Jvb3N0OwotCi0gICAgICAgIC8vIEZvciBjYnIgYXBwbHkgYnVmZmVyIHJlbGF0ZWQgbGltaXRzCi0gICAgICAgIGlmIChjcGktPmRyb3BfZnJhbWVzX2FsbG93ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBkZl9idWZmZXJfbGV2ZWwgPSBjcGktPm94Y2YuZHJvcF9mcmFtZXNfd2F0ZXJfbWFyayAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMCk7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA+IGRmX2J1ZmZlcl9sZXZlbCkKLSAgICAgICAgICAgICAgICBtYXhfYm9vc3QgPSAoKGRvdWJsZSkoKGNwaS0+YnVmZmVyX2xldmVsIC0gZGZfYnVmZmVyX2xldmVsKSAqIDIgLyAzKSAqIDE2LjApIC8gRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWF4X2Jvb3N0ID0gMC4wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNwaS0+YnVmZmVyX2xldmVsID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4X2Jvb3N0ID0gKChkb3VibGUpKGNwaS0+YnVmZmVyX2xldmVsICogMiAvIDMpICogMTYuMCkgLyBET1VCTEVfRElWSURFX0NIRUNLKChkb3VibGUpY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9ib29zdCA9IDAuMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChib29zdF9zY29yZSA+IG1heF9ib29zdCkKLSAgICAgICAgICAgIGJvb3N0X3Njb3JlID0gbWF4X2Jvb3N0OwotICAgIH0KLQotICAgIGNwaS0+Z2Z1X2Jvb3N0ID0gKGludCkoYm9vc3Rfc2NvcmUgKiAxMDAuMCkgPj4gNDsKLQotICAgIC8vIFNob3VsZCB3ZSB1c2UgdGhlIGFsdGVybmF0ZSByZWZlcm5jZSBmcmFtZQotICAgIGlmIChhbGxvd19hbHRfcmVmICYmCi0gICAgICAgIChpID49IE1JTl9HRl9JTlRFUlZBTCkgJiYKLSAgICAgICAgLy8gZG9udCB1c2UgQVJGIHZlcnkgbmVhciBuZXh0IGtmCi0gICAgICAgIChpIDw9IChjcGktPmZyYW1lc190b19rZXkgLSBNSU5fR0ZfSU5URVJWQUwpKSAmJgotICAgICAgICAoKChuZXh0X2ZyYW1lLnBjbnRfaW50ZXIgPiAwLjc1KSAmJgotICAgICAgICAgICgobXZfaW5fb3V0X2FjY3VtdWxhdG9yIC8gKGRvdWJsZSlpID4gLTAuMikgfHwgKG12X2luX291dF9hY2N1bXVsYXRvciA+IC0yLjApKSAmJgotICAgICAgICAgIC8vKGNwaS0+Z2Z1X2Jvb3N0PjE1MCkgJiYKLSAgICAgICAgICAoY3BpLT5nZnVfYm9vc3QgPiAxMDApICYmCi0gICAgICAgICAgLy8oY3BpLT5nZnVfYm9vc3Q+QUZfVEhSRVNIMikgJiYKLSAgICAgICAgICAvLygoY3BpLT5nZnVfYm9vc3QvaSk+QUZfVEhSRVNIKSAmJgotICAgICAgICAgIC8vKGRlY2F5X2FjY3VtdWxhdG9yID4gMC41KSAmJgotICAgICAgICAgIChjcGktPmdmX2RlY2F5X3JhdGUgPD0gKEFSRl9ERUNBWV9USFJFU0ggKyAoY3BpLT5nZnVfYm9vc3QgLyAyMDApKSkKLSAgICAgICAgICkKLSAgICAgICAgKQotICAgICAgICkKLSAgICB7Ci0gICAgICAgIGludCBCb29zdDsKLSAgICAgICAgaW50IGFsbG9jYXRpb25fY2h1bmtzOwotICAgICAgICBpbnQgUSA9IChjcGktPm94Y2YuZml4ZWRfcSA8IDApID8gY3BpLT5sYXN0X3FbSU5URVJfRlJBTUVdIDogY3BpLT5veGNmLmZpeGVkX3E7Ci0gICAgICAgIGludCB0bXBfcTsKLSAgICAgICAgaW50IGFyZl9mcmFtZV9iaXRzID0gMDsKLSAgICAgICAgaW50IGdyb3VwX2JpdHM7Ci0KLSAgICAgICAgLy8gRXN0aW1hdGUgdGhlIGJpdHMgdG8gYmUgYWxsb2NhdGVkIHRvIHRoZSBncm91cCBhcyBhIHdob2xlCi0gICAgICAgIGlmICgoY3BpLT5rZl9ncm91cF9iaXRzID4gMCkgJiYgKGNwaS0+a2ZfZ3JvdXBfZXJyb3JfbGVmdCA+IDApKQotICAgICAgICAgICAgZ3JvdXBfYml0cyA9IChpbnQpKChkb3VibGUpY3BpLT5rZl9ncm91cF9iaXRzICogKGdmX2dyb3VwX2VyciAvIChkb3VibGUpY3BpLT5rZl9ncm91cF9lcnJvcl9sZWZ0KSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdyb3VwX2JpdHMgPSAwOwotCi0gICAgICAgIC8vIEJvb3N0IGZvciBhcmYgZnJhbWUKLSAgICAgICAgQm9vc3QgPSAoY3BpLT5nZnVfYm9vc3QgKiAzICogR0ZRX0FESlVTVE1FTlQpIC8gKDIgKiAxMDApOwotICAgICAgICBCb29zdCArPSAoaSAqIDUwKTsKLSAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPSAoaSAqIDEwMCkgKyBCb29zdDsKLQotICAgICAgICAvLyBOb3JtYWxpemUgQWx0Ym9vc3QgYW5kIGFsbG9jYXRpb25zIGNodW5jayBkb3duIHRvIHByZXZlbnQgb3ZlcmZsb3cKLSAgICAgICAgd2hpbGUgKEJvb3N0ID4gMTAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgQm9vc3QgLz0gMjsKLSAgICAgICAgICAgIGFsbG9jYXRpb25fY2h1bmtzIC89IDI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHNwZW50IG9uIHRoZSBhcmYgYmFzZWQgb24gdGhlIGJvb3N0IG51bWJlcgotICAgICAgICBhcmZfZnJhbWVfYml0cyA9IChpbnQpKChkb3VibGUpQm9vc3QgKiAoZ3JvdXBfYml0cyAvIChkb3VibGUpYWxsb2NhdGlvbl9jaHVua3MpKTsKLQotICAgICAgICAvLyBFc3RpbWF0ZSBpZiB0aGVyZSBhcmUgZW5vdWdoIGJpdHMgYXZhaWxhYmxlIHRvIG1ha2Ugd29ydGh3aGlsZSB1c2Ugb2YgYW4gYXJmLgotICAgICAgICB0bXBfcSA9IGVzdGltYXRlX3EoY3BpLCBtb2RfZnJhbWVfZXJyLCAoaW50KWFyZl9mcmFtZV9iaXRzKTsKLQotICAgICAgICAvLyBPbmx5IHVzZSBhbiBhcmYgaWYgaXQgaXMgbGlrZWx5IHdlIHdpbGwgYmUgYWJsZSB0byBjb2RlIGl0IGF0IGEgbG93ZXIgUSB0aGFuIHRoZSBzdXJyb3VuZGluZyBmcmFtZXMuCi0gICAgICAgIGlmICh0bXBfcSA8IGNwaS0+d29yc3RfcXVhbGl0eSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGhhbGZfZ2ZfaW50OwotICAgICAgICAgICAgaW50IGZyYW1lc19hZnRlcl9hcmY7Ci0gICAgICAgICAgICBpbnQgZnJhbWVzX2J3ZCA9IGNwaS0+b3hjZi5hcm5yX21heF9mcmFtZXMgLSAxOwotICAgICAgICAgICAgaW50IGZyYW1lc19md2QgPSBjcGktPm94Y2YuYXJucl9tYXhfZnJhbWVzIC0gMTsKLQotICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gVFJVRTsKLQotICAgICAgICAgICAgLy8gRm9yIGFsdCByZWYgZnJhbWVzIHRoZSBlcnJvciBzY29yZSBmb3IgdGhlIGVuZCBmcmFtZSBvZiB0aGUgZ3JvdXAgKHRoZSBhbHQgcmVmIGZyYW1lKSBzaG91bGQgbm90IGNvbnRyaWJ1dGUgdG8gdGhlIGdyb3VwIHRvdGFsIGFuZCBoZW5jZQotICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBiaXQgYWxsb2NhdGVkIHRvIHRoZSBncm91cC4gUmF0aGVyIGl0IGZvcm1zIHBhcnQgb2YgdGhlIG5leHQgZ3JvdXAgKGl0IGlzIHRoZSBHRiBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZ3JvdXApCi0gICAgICAgICAgICBnZl9ncm91cF9lcnIgLT0gbW9kX2ZyYW1lX2VycjsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBpbnRlcnZhbCB0aWxsIHRoZSBuZXh0IGdmIG9yIGFyZi4gRm9yIEFSRnMgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBjb2RlZCBiZWZvcmUgdGhlIGZ1dHVyZSBmcmFtZSB0aGF0IGlzIGNvZGVkIGFzIGFuIEFSRi4KLSAgICAgICAgICAgIC8vIFRoZSBmdXR1cmUgZnJhbWUgaXRzZWxmIGlzIHBhcnQgb2YgdGhlIG5leHQgZ3JvdXAKLSAgICAgICAgICAgIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPSBpIC0gMTsKLQotICAgICAgICAgICAgLy8gRGVmaW5lIHRoZSBhcm5yIGZpbHRlciB3aWR0aCBmb3IgdGhpcyBncm91cCBvZiBmcmFtZXM6Ci0gICAgICAgICAgICAvLyBXZSBvbmx5IGZpbHRlciBmcmFtZXMgdGhhdCBsaWUgd2l0aGluIGEgZGlzdGFuY2Ugb2YgaGFsZgotICAgICAgICAgICAgLy8gdGhlIEdGIGludGVydmFsIGZyb20gdGhlIEFSRiBmcmFtZS4gV2UgYWxzbyBoYXZlIHRvIHRyYXAKLSAgICAgICAgICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBmaWx0ZXIgZXh0ZW5kcyBiZXlvbmQgdGhlIGVuZCBvZiBjbGlwLgotICAgICAgICAgICAgLy8gTm90ZTogdGhpc19mcmFtZS0+ZnJhbWUgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGUgbG9vcAotICAgICAgICAgICAgLy8gc28gaXQgbm93IHBvaW50cyBhdCB0aGUgQVJGIGZyYW1lLgotICAgICAgICAgICAgaGFsZl9nZl9pbnQgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID4+IDE7Ci0gICAgICAgICAgICBmcmFtZXNfYWZ0ZXJfYXJmID0gY3BpLT50b3RhbF9zdGF0cy0+Y291bnQgLSB0aGlzX2ZyYW1lLT5mcmFtZSAtIDE7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoY3BpLT5veGNmLmFybnJfdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMTogLy8gQmFja3dhcmQgZmlsdGVyCi0gICAgICAgICAgICAgICAgZnJhbWVzX2Z3ZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc19id2QgPiBoYWxmX2dmX2ludCkKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2J3ZCA9IGhhbGZfZ2ZfaW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8vIEZvcndhcmQgZmlsdGVyCi0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc19md2QgPiBoYWxmX2dmX2ludCkKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2Z3ZCA9IGhhbGZfZ2ZfaW50OwotICAgICAgICAgICAgICAgIGlmIChmcmFtZXNfZndkID4gZnJhbWVzX2FmdGVyX2FyZikKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2Z3ZCA9IGZyYW1lc19hZnRlcl9hcmY7Ci0gICAgICAgICAgICAgICAgZnJhbWVzX2J3ZCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzogLy8gQ2VudGVyZWQgZmlsdGVyCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZyYW1lc19md2QgPj49IDE7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc19md2QgPiBmcmFtZXNfYWZ0ZXJfYXJmKQotICAgICAgICAgICAgICAgICAgICBmcmFtZXNfZndkID0gZnJhbWVzX2FmdGVyX2FyZjsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVzX2Z3ZCA+IGhhbGZfZ2ZfaW50KQotICAgICAgICAgICAgICAgICAgICBmcmFtZXNfZndkID0gaGFsZl9nZl9pbnQ7Ci0KLSAgICAgICAgICAgICAgICBmcmFtZXNfYndkID0gZnJhbWVzX2Z3ZDsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBldmVuIGxlbmd0aCBmaWx0ZXIgdGhlcmUgaXMgb25lIG1vcmUgZnJhbWUgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAvLyB0aGFuIGZvcndhcmQ6IGUuZy4gbGVuPTYgPT0+IGJiYkFmZiwgbGVuPTcgPT0+IGJiYkFmZmYuCi0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc19id2QgPCBoYWxmX2dmX2ludCkKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2J3ZCArPSAoY3BpLT5veGNmLmFybnJfbWF4X2ZyYW1lcysxKSAmIDB4MTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3BpLT5hY3RpdmVfYXJucl9mcmFtZXMgPSBmcmFtZXNfYndkICsgMSArIGZyYW1lc19md2Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IEZBTFNFOwotICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0gaTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZW50aW9uYWwgR0YKLSAgICBpZiAoIWNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZykKLSAgICB7Ci0gICAgICAgIC8vIERvbnQgYWxsb3cgY29udmVudGlvbmFsIGdmIHRvbyBuZWFyIHRoZSBuZXh0IGtmCi0gICAgICAgIGlmICgoY3BpLT5mcmFtZXNfdG9fa2V5IC0gY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCkgPCBNSU5fR0ZfSU5URVJWQUwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsIDwgY3BpLT5mcmFtZXNfdG9fa2V5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCB0aGlzX2ZyYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCA8IGNwaS0+ZnJhbWVzX3RvX2tleSkKLSAgICAgICAgICAgICAgICAgICAgZ2ZfZ3JvdXBfZXJyICs9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBkZWNpZGUgaG93IG1hbnkgYml0cyBzaG91bGQgYmUgYWxsb2NhdGVkIHRvIHRoZSBHRiBncm91cCBhcyAgYSBwcm9wb3J0aW9uIG9mIHRob3NlIHJlbWFpbmluZyBpbiB0aGUga2YgZ3JvdXAuCi0gICAgLy8gVGhlIGZpbmFsIGtleSBmcmFtZSBncm91cCBpbiB0aGUgY2xpcCBpcyB0cmVhdGVkIGFzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGNwaS0+a2ZfZ3JvdXBfYml0cyBpcyB0aWVkIHRvIGNwaS0+Yml0c19sZWZ0LgotICAgIC8vIFRoaXMgaXMgYWxzbyBpbXBvcnRhbnQgZm9yIHNob3J0IGNsaXBzIHdoZXJlIHRoZXJlIG1heSBvbmx5IGJlIG9uZSBrZXkgZnJhbWUuCi0gICAgaWYgKGNwaS0+ZnJhbWVzX3RvX2tleSA+PSAoaW50KShjcGktPnRvdGFsX3N0YXRzLT5jb3VudCAtIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUpKQotICAgIHsKLSAgICAgICAgY3BpLT5rZl9ncm91cF9iaXRzID0gKGNwaS0+Yml0c19sZWZ0ID4gMCkgPyBjcGktPmJpdHNfbGVmdCA6IDA7Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBiaXRzIHRvIGJlIGFsbG9jYXRlZCB0byB0aGUgZ3JvdXAgYXMgYSB3aG9sZQotICAgIGlmICgoY3BpLT5rZl9ncm91cF9iaXRzID4gMCkgJiYgKGNwaS0+a2ZfZ3JvdXBfZXJyb3JfbGVmdCA+IDApKQotICAgICAgICBjcGktPmdmX2dyb3VwX2JpdHMgPSAoaW50KSgoZG91YmxlKWNwaS0+a2ZfZ3JvdXBfYml0cyAqIChnZl9ncm91cF9lcnIgLyAoZG91YmxlKWNwaS0+a2ZfZ3JvdXBfZXJyb3JfbGVmdCkpOwotICAgIGVsc2UKLSAgICAgICAgY3BpLT5nZl9ncm91cF9iaXRzID0gMDsKLQotICAgIGNwaS0+Z2ZfZ3JvdXBfYml0cyA9IChjcGktPmdmX2dyb3VwX2JpdHMgPCAwKSA/IDAgOiAoY3BpLT5nZl9ncm91cF9iaXRzID4gY3BpLT5rZl9ncm91cF9iaXRzKSA/IGNwaS0+a2ZfZ3JvdXBfYml0cyA6IGNwaS0+Z2ZfZ3JvdXBfYml0czsKLQotICAgIC8vIENsaXAgY3BpLT5nZl9ncm91cF9iaXRzIGJhc2VkIG9uIHVzZXIgc3VwcGxpZWQgZGF0YSByYXRlIHZhcmlhYmlsaXR5IGxpbWl0IChjcGktPm94Y2YudHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24pCi0gICAgaWYgKGNwaS0+Z2ZfZ3JvdXBfYml0cyA+IG1heF9iaXRzICogY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCkKLSAgICAgICAgY3BpLT5nZl9ncm91cF9iaXRzID0gbWF4X2JpdHMgKiBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOwotCi0gICAgLy8gUmVzZXQgdGhlIGZpbGUgcG9zaXRpb24KLSAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBzdGFydF9wb3MpOwotCi0gICAgLy8gVXBkYXRlIHRoZSByZWNvcmQgb2YgZXJyb3IgdXNlZCBzbyBmYXIgKG9ubHkgZG9uZSBvbmNlIHBlciBnZiBncm91cCkKLSAgICBjcGktPm1vZGlmaWVkX2Vycm9yX3VzZWQgKz0gZ2ZfZ3JvdXBfZXJyOwotCi0gICAgLy8gQXNzaWduICBiaXRzIHRvIHRoZSBhcmYgb3IgZ2YuCi0gICAgewotICAgICAgICBpbnQgQm9vc3Q7Ci0gICAgICAgIGludCBmcmFtZXNfaW5fc2VjdGlvbjsKLSAgICAgICAgaW50IGFsbG9jYXRpb25fY2h1bmtzOwotICAgICAgICBpbnQgUSA9IChjcGktPm94Y2YuZml4ZWRfcSA8IDApID8gY3BpLT5sYXN0X3FbSU5URVJfRlJBTUVdIDogY3BpLT5veGNmLmZpeGVkX3E7Ci0KLSAgICAgICAgLy8gRm9yIEFSRiBmcmFtZXMKLSAgICAgICAgaWYgKGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZykKLSAgICAgICAgewotICAgICAgICAgICAgQm9vc3QgPSAoY3BpLT5nZnVfYm9vc3QgKiAzICogR0ZRX0FESlVTVE1FTlQpIC8gKDIgKiAxMDApOwotICAgICAgICAgICAgLy9Cb29zdCArPSAoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCAqIDI1KTsKLSAgICAgICAgICAgIEJvb3N0ICs9IChjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsICogNTApOwotCi0gICAgICAgICAgICAvLyBTZXQgbWF4IGFuZCBtaW5pbXVtIGJvb3N0IGFuZCBoZW5jZSBtaW5pbXVtIGFsbG9jYXRpb24KLSAgICAgICAgICAgIGlmIChCb29zdCA+ICgoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCArIDEpICogMjAwKSkKLSAgICAgICAgICAgICAgICBCb29zdCA9ICgoY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCArIDEpICogMjAwKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKEJvb3N0IDwgMTI1KQotICAgICAgICAgICAgICAgIEJvb3N0ID0gMTI1OwotCi0gICAgICAgICAgICBmcmFtZXNfaW5fc2VjdGlvbiA9IGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgKyAxOwotICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPSAoZnJhbWVzX2luX3NlY3Rpb24gKiAxMDApICsgQm9vc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRWxzZSBmb3Igc3RhbmRhcmQgZ29sZGVuIGZyYW1lcwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGJvb3N0IGJhc2VkIG9uIGludGVyIC8gaW50cmEgcmF0aW8gb2Ygc3Vic2VxdWVudCBmcmFtZXMKLSAgICAgICAgICAgIEJvb3N0ID0gKGNwaS0+Z2Z1X2Jvb3N0ICogR0ZRX0FESlVTVE1FTlQpIC8gMTAwOwotCi0gICAgICAgICAgICAvLyBTZXQgbWF4IGFuZCBtaW5pbXVtIGJvb3N0IGFuZCBoZW5jZSBtaW5pbXVtIGFsbG9jYXRpb24KLSAgICAgICAgICAgIGlmIChCb29zdCA+IChjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsICogMTUwKSkKLSAgICAgICAgICAgICAgICBCb29zdCA9IChjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsICogMTUwKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKEJvb3N0IDwgMTI1KQotICAgICAgICAgICAgICAgIEJvb3N0ID0gMTI1OwotCi0gICAgICAgICAgICBmcmFtZXNfaW5fc2VjdGlvbiA9IGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWw7Ci0gICAgICAgICAgICBhbGxvY2F0aW9uX2NodW5rcyA9IChmcmFtZXNfaW5fc2VjdGlvbiAqIDEwMCkgKyAoQm9vc3QgLSAxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm9ybWFsaXplIEFsdGJvb3N0IGFuZCBhbGxvY2F0aW9ucyBjaHVuY2sgZG93biB0byBwcmV2ZW50IG92ZXJmbG93Ci0gICAgICAgIHdoaWxlIChCb29zdCA+IDEwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb3N0IC89IDI7Ci0gICAgICAgICAgICBhbGxvY2F0aW9uX2NodW5rcyAvPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBzcGVudCBvbiB0aGUgZ2Ygb3IgYXJmIGJhc2VkIG9uIHRoZSBib29zdCBudW1iZXIKLSAgICAgICAgY3BpLT5nZl9iaXRzID0gKGludCkoKGRvdWJsZSlCb29zdCAqIChjcGktPmdmX2dyb3VwX2JpdHMgLyAoZG91YmxlKWFsbG9jYXRpb25fY2h1bmtzKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGZyYW1lIHRoYXQgaXMgdG8gYmUgYm9vc3RlZCBpcyBzaW1wbGVyIHRoYW4gdGhlIGF2ZXJhZ2UgZm9yCi0gICAgICAgIC8vIHRoZSBnZi9hcmYgZ3JvdXAgdGhlbiB1c2UgYW4gYWx0ZXJuYXRpdmUgY2FsY3VsYXRpb24KLSAgICAgICAgLy8gYmFzZWQgb24gdGhlIGVycm9yIHNjb3JlIG9mIHRoZSBmcmFtZSBpdHNlbGYKLSAgICAgICAgaWYgKG1vZF9mcmFtZV9lcnIgPCBnZl9ncm91cF9lcnIgLyAoZG91YmxlKWNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSAgYWx0X2dmX2dycF9iaXRzOwotICAgICAgICAgICAgaW50ICAgICBhbHRfZ2ZfYml0czsKLQotICAgICAgICAgICAgYWx0X2dmX2dycF9iaXRzID0KLSAgICAgICAgICAgICAgICAoZG91YmxlKWNwaS0+a2ZfZ3JvdXBfYml0cyAgKgotICAgICAgICAgICAgICAgIChtb2RfZnJhbWVfZXJyICogKGRvdWJsZSljcGktPmJhc2VsaW5lX2dmX2ludGVydmFsKSAvCi0gICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+a2ZfZ3JvdXBfZXJyb3JfbGVmdCk7Ci0KLSAgICAgICAgICAgIGFsdF9nZl9iaXRzID0gKGludCkoKGRvdWJsZSlCb29zdCAqIChhbHRfZ2ZfZ3JwX2JpdHMgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpYWxsb2NhdGlvbl9jaHVua3MpKTsKLQotICAgICAgICAgICAgaWYgKGNwaS0+Z2ZfYml0cyA+IGFsdF9nZl9iaXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+Z2ZfYml0cyA9IGFsdF9nZl9iaXRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2UgaWYgaXQgaXMgaGFyZGVyIHRoYW4gb3RoZXIgZnJhbWVzIGluIHRoZSBncm91cCBtYWtlIHN1cmUgaXQgYXQKLSAgICAgICAgLy8gbGVhc3QgcmVjZWl2ZXMgYW4gYWxsb2NhdGlvbiBpbiBrZWVwaW5nIHdpdGggaXRzIHJlbGF0aXZlIGVycm9yCi0gICAgICAgIC8vIHNjb3JlLCBvdGhlcndpc2UgaXQgbWF5IGJlIHdvcnNlIG9mZiB0aGFuIGFuICJ1bi1ib29zdGVkIiBmcmFtZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhbHRfZ2ZfYml0cyA9Ci0gICAgICAgICAgICAgICAgKGludCkoKGRvdWJsZSljcGktPmtmX2dyb3VwX2JpdHMgKgotICAgICAgICAgICAgICAgICAgICAgIG1vZF9mcmFtZV9lcnIgLwotICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmtmX2dyb3VwX2Vycm9yX2xlZnQpKTsKLQotICAgICAgICAgICAgaWYgKGFsdF9nZl9iaXRzID4gY3BpLT5nZl9iaXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+Z2ZfYml0cyA9IGFsdF9nZl9iaXRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwbHkgYW4gYWRkaXRpb25hbCBsaW1pdCBmb3IgQ0JSCi0gICAgICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNwaS0+Z2ZfYml0cyA+IChjcGktPmJ1ZmZlcl9sZXZlbCA+PiAxKSkKLSAgICAgICAgICAgICAgICBjcGktPmdmX2JpdHMgPSBjcGktPmJ1ZmZlcl9sZXZlbCA+PiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRG9udCBhbGxvdyBhIG5lZ2F0aXZlIHZhbHVlIGZvciBnZl9iaXRzCi0gICAgICAgIGlmIChjcGktPmdmX2JpdHMgPCAwKQotICAgICAgICAgICAgY3BpLT5nZl9iaXRzID0gMDsKLQotICAgICAgICAvLyBBZGp1c3QgS0YgZ3JvdXAgYml0cyBhbmQgZXJyb3IgcmVtYWluaW4KLSAgICAgICAgY3BpLT5rZl9ncm91cF9lcnJvcl9sZWZ0IC09IGdmX2dyb3VwX2VycjsKLSAgICAgICAgY3BpLT5rZl9ncm91cF9iaXRzIC09IGNwaS0+Z2ZfZ3JvdXBfYml0czsKLQotICAgICAgICBpZiAoY3BpLT5rZl9ncm91cF9iaXRzIDwgMCkKLSAgICAgICAgICAgIGNwaS0+a2ZfZ3JvdXBfYml0cyA9IDA7Ci0KLSAgICAgICAgLy8gTm90ZSB0aGUgZXJyb3Igc2NvcmUgbGVmdCBpbiB0aGUgcmVtYWluaW5nIGZyYW1lcyBvZiB0aGUgZ3JvdXAuCi0gICAgICAgIC8vIEZvciBub3JtYWwgR0ZzIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBlcnJvciBzY29yZSBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSBncm91cCAoZXhjZXB0IGluIEtleSBmcmFtZSBjYXNlIHdoZXJlIHRoaXMgaGFzIGFscmVhZHkgaGFwcGVuZWQpCi0gICAgICAgIGlmICghY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nICYmIGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQotICAgICAgICAgICAgY3BpLT5nZl9ncm91cF9lcnJvcl9sZWZ0ID0gZ2ZfZ3JvdXBfZXJyIC0gZ2ZfZmlyc3RfZnJhbWVfZXJyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjcGktPmdmX2dyb3VwX2Vycm9yX2xlZnQgPSBnZl9ncm91cF9lcnI7Ci0KLSAgICAgICAgY3BpLT5nZl9ncm91cF9iaXRzIC09IGNwaS0+Z2ZfYml0czsKLQotICAgICAgICBpZiAoY3BpLT5nZl9ncm91cF9iaXRzIDwgMCkKLSAgICAgICAgICAgIGNwaS0+Z2ZfZ3JvdXBfYml0cyA9IDA7Ci0KLSAgICAgICAgLy8gU2V0IGFzaWRlIHNvbWUgYml0cyBmb3IgYSBtaWQgZ2Ygc2VxdWVuY2UgYm9vc3QKLSAgICAgICAgaWYgKChjcGktPmdmdV9ib29zdCA+IDE1MCkgJiYgKGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPiA1KSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHBjdF9leHRyYSA9IChjcGktPmdmdV9ib29zdCAtIDEwMCkgLyA1MDsKLSAgICAgICAgICAgIHBjdF9leHRyYSA9IChwY3RfZXh0cmEgPiAxMCkgPyAxMCA6IHBjdF9leHRyYTsKLQotICAgICAgICAgICAgY3BpLT5taWRfZ2ZfZXh0cmFfYml0cyA9IChjcGktPmdmX2dyb3VwX2JpdHMgKiBwY3RfZXh0cmEpIC8gMTAwOwotICAgICAgICAgICAgY3BpLT5nZl9ncm91cF9iaXRzIC09IGNwaS0+bWlkX2dmX2V4dHJhX2JpdHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3BpLT5taWRfZ2ZfZXh0cmFfYml0cyA9IDA7Ci0KLSAgICAgICAgY3BpLT5nZl9iaXRzICs9IGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGluIG1pbmltdW0gZm9yIGEgZnJhbWUKLSAgICB9Ci0KLSAgICBpZiAoIWNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyAmJiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpKSAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBHRiBhbmQgbm90IGEgS0YKLSAgICB7Ci0gICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IGNwaS0+Z2ZfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlciBmcmFtZSBiaXQgdGFyZ2V0IGZvciB0aGlzIGZyYW1lCi0gICAgfQotCi0gICAgLy8gQWRqdXN0bWVudCB0byBlc3RpbWF0ZV9tYXhfcSBiYXNlZCBvbiBhIG1lYXN1cmUgb2YgY29tcGxleGl0eSBvZiB0aGUgc2VjdGlvbgotICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIEZJUlNUUEFTU19TVEFUUyBzZWN0aW9uc3RhdHM7Ci0gICAgICAgIGRvdWJsZSBSYXRpbzsKLQotICAgICAgICB6ZXJvX3N0YXRzKCZzZWN0aW9uc3RhdHMpOwotICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBzdGFydF9wb3MpOwotCi0gICAgICAgIGZvciAoaSA9IDAgOyBpIDwgY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW5wdXRfc3RhdHMoY3BpLCAmbmV4dF9mcmFtZSk7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlX3N0YXRzKCZzZWN0aW9uc3RhdHMsICZuZXh0X2ZyYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2Z19zdGF0cygmc2VjdGlvbnN0YXRzKTsKLQotICAgICAgICBjcGktPnNlY3Rpb25faW50cmFfcmF0aW5nID0KLSAgICAgICAgICAgIHNlY3Rpb25zdGF0cy5pbnRyYV9lcnJvciAvCi0gICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKHNlY3Rpb25zdGF0cy5jb2RlZF9lcnJvcik7Ci0KLSAgICAgICAgUmF0aW8gPSBzZWN0aW9uc3RhdHMuaW50cmFfZXJyb3IgLyBET1VCTEVfRElWSURFX0NIRUNLKHNlY3Rpb25zdGF0cy5jb2RlZF9lcnJvcik7Ci0gICAgICAgIC8vaWYoIChSYXRpbyA+IDExKSApIC8vJiYgKHNlY3Rpb25zdGF0cy5wY250X3NlY29uZF9yZWYgPCAuMjApICkKLSAgICAgICAgLy97Ci0gICAgICAgIGNwaS0+c2VjdGlvbl9tYXhfcWZhY3RvciA9IDEuMCAtICgoUmF0aW8gLSAxMC4wKSAqIDAuMDI1KTsKLQotICAgICAgICBpZiAoY3BpLT5zZWN0aW9uX21heF9xZmFjdG9yIDwgMC44MCkKLSAgICAgICAgICAgIGNwaS0+c2VjdGlvbl9tYXhfcWZhY3RvciA9IDAuODA7Ci0KLSAgICAgICAgLy99Ci0gICAgICAgIC8vZWxzZQotICAgICAgICAvLyAgICBjcGktPnNlY3Rpb25fbWF4X3FmYWN0b3IgPSAxLjA7Ci0KLSAgICAgICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zKTsKLSAgICB9Ci19Ci0KLS8vIEFsbG9jYXRlIGJpdHMgdG8gYSBub3JtYWwgZnJhbWUgdGhhdCBpcyBuZWl0aGVyIGEgZ2YgYW4gYXJmIG9yIGEga2V5IGZyYW1lLgotc3RhdGljIHZvaWQgYXNzaWduX3N0ZF9mcmFtZV9iaXRzKFZQOF9DT01QICpjcGksIEZJUlNUUEFTU19TVEFUUyAqdGhpc19mcmFtZSkKLXsKLSAgICBpbnQgICAgdGFyZ2V0X2ZyYW1lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdmX2dyb3VwX2Vycm9yX2xlZnQKLQotICAgIGRvdWJsZSBtb2RpZmllZF9lcnI7Ci0gICAgZG91YmxlIGVycl9mcmFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgcG9ydGlvbiBvZiB0aGUgcmVtYWluaW5nIEdGIGdyb3VwIGVycm9yIGlzIHVzZWQgYnkgdGhpcyBmcmFtZQotCi0gICAgaW50IG1heF9iaXRzID0gZnJhbWVfbWF4X2JpdHMoY3BpKTsgICAgLy8gTWF4IGZvciBhIHNpbmdsZSBmcmFtZQotCi0gICAgLy8gVGhlIGZpbmFsIGZldyBmcmFtZXMgaGF2ZSBzcGVjaWFsIHRyZWF0bWVudAotICAgIGlmIChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPj0gKGludCkoY3BpLT50b3RhbF9zdGF0cy0+Y291bnQgLSBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lKSkKLSAgICB7Ci0gICAgICAgIGNwaS0+Z2ZfZ3JvdXBfYml0cyA9IChjcGktPmJpdHNfbGVmdCA+IDApID8gY3BpLT5iaXRzX2xlZnQgOiAwOzsKLSAgICB9Ci0KLSAgICAvLyBDYWxjdWxhdGUgbW9kaWZpZWQgcHJlZGljdGlvbiBlcnJvciB1c2VkIGluIGJpdCBhbGxvY2F0aW9uCi0gICAgbW9kaWZpZWRfZXJyID0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksIHRoaXNfZnJhbWUpOwotCi0gICAgaWYgKGNwaS0+Z2ZfZ3JvdXBfZXJyb3JfbGVmdCA+IDApCi0gICAgICAgIGVycl9mcmFjdGlvbiA9IG1vZGlmaWVkX2VyciAvIGNwaS0+Z2ZfZ3JvdXBfZXJyb3JfbGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0IHBvcnRpb24gb2YgdGhlIHJlbWFpbmluZyBHRiBncm91cCBlcnJvciBpcyB1c2VkIGJ5IHRoaXMgZnJhbWUKLSAgICBlbHNlCi0gICAgICAgIGVycl9mcmFjdGlvbiA9IDAuMDsKLQotICAgIHRhcmdldF9mcmFtZV9zaXplID0gKGludCkoKGRvdWJsZSljcGktPmdmX2dyb3VwX2JpdHMgKiBlcnJfZnJhY3Rpb24pOyAgICAgICAgICAgICAgICAgICAgLy8gSG93IG1hbnkgb2YgdGhvc2UgYml0cyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gc2hvdWxkIHdlIGdpdmUgaXQ/Ci0KLSAgICAvLyBDbGlwIHRvIHRhcmdldCBzaXplIHRvIDAgLSBtYXhfYml0cyAob3IgY3BpLT5nZl9ncm91cF9iaXRzKSBhdCB0aGUgdG9wIGVuZC4KLSAgICBpZiAodGFyZ2V0X2ZyYW1lX3NpemUgPCAwKQotICAgICAgICB0YXJnZXRfZnJhbWVfc2l6ZSA9IDA7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHRhcmdldF9mcmFtZV9zaXplID4gbWF4X2JpdHMpCi0gICAgICAgICAgICB0YXJnZXRfZnJhbWVfc2l6ZSA9IG1heF9iaXRzOwotCi0gICAgICAgIGlmICh0YXJnZXRfZnJhbWVfc2l6ZSA+IGNwaS0+Z2ZfZ3JvdXBfYml0cykKLSAgICAgICAgICAgIHRhcmdldF9mcmFtZV9zaXplID0gY3BpLT5nZl9ncm91cF9iaXRzOwotICAgIH0KLQotICAgIGNwaS0+Z2ZfZ3JvdXBfZXJyb3JfbGVmdCAtPSBtb2RpZmllZF9lcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZXJyb3IgcmVtYWluaW5nCi0gICAgY3BpLT5nZl9ncm91cF9iaXRzIC09IHRhcmdldF9mcmFtZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBiaXRzIHJlbWFpbmluZwotCi0gICAgaWYgKGNwaS0+Z2ZfZ3JvdXBfYml0cyA8IDApCi0gICAgICAgIGNwaS0+Z2ZfZ3JvdXBfYml0cyA9IDA7Ci0KLSAgICB0YXJnZXRfZnJhbWVfc2l6ZSArPSBjcGktPm1pbl9mcmFtZV9iYW5kd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGluIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHRoYXQgaXMgc2V0IGFzaWRlIGZvciBldmVyeSBmcmFtZS4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGZyYW1lIHRoYXQgbGllcyBoYWxmIHdheSBiZXR3ZWVuIHR3byBnZnMKLSAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA9PSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsIC8gMikKLSAgICAgICAgdGFyZ2V0X2ZyYW1lX3NpemUgKz0gY3BpLT5taWRfZ2ZfZXh0cmFfYml0czsKLQotICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IHRhcmdldF9mcmFtZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXIgZnJhbWUgYml0IHRhcmdldCBmb3IgdGhpcyBmcmFtZQotfQotCi12b2lkIHZwOF9zZWNvbmRfcGFzcyhWUDhfQ09NUCAqY3BpKQotewotICAgIGludCB0bXBfcTsKLSAgICBpbnQgZnJhbWVzX2xlZnQgPSAoaW50KShjcGktPnRvdGFsX3N0YXRzLT5jb3VudCAtIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUpOwotCi0gICAgRklSU1RQQVNTX1NUQVRTIHRoaXNfZnJhbWU7Ci0gICAgRklSU1RQQVNTX1NUQVRTIHRoaXNfZnJhbWVfY29weTsKLQotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotCi0gICAgZG91YmxlIHRoaXNfZnJhbWVfZXJyb3I7Ci0gICAgZG91YmxlIHRoaXNfZnJhbWVfaW50cmFfZXJyb3I7Ci0gICAgZG91YmxlIHRoaXNfZnJhbWVfY29kZWRfZXJyb3I7Ci0KLSAgICBGSVJTVFBBU1NfU1RBVFMgKnN0YXJ0X3BvczsKLQotICAgIGlmICghY3BpLT5zdGF0c19pbikKLSAgICB7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOwotCi0gICAgaWYgKEVPRiA9PSBpbnB1dF9zdGF0cyhjcGksICZ0aGlzX2ZyYW1lKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdGhpc19mcmFtZV9lcnJvciA9IHRoaXNfZnJhbWUuc3NpbV93ZWlnaHRlZF9wcmVkX2VycjsKLSAgICB0aGlzX2ZyYW1lX2ludHJhX2Vycm9yID0gdGhpc19mcmFtZS5pbnRyYV9lcnJvcjsKLSAgICB0aGlzX2ZyYW1lX2NvZGVkX2Vycm9yID0gdGhpc19mcmFtZS5jb2RlZF9lcnJvcjsKLQotICAgIC8vIFN0b3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBsZXZlbCBvZiBtb3Rpb24gZXRjIGZvciB1c2UgbW9kZSBkZWNpc2lvbnMuCi0gICAgY3BpLT5tb3Rpb25fc3BlZWQgPSAoaW50KShmYWJzKHRoaXNfZnJhbWUuTVZyKSArIGZhYnModGhpc19mcmFtZS5NVmMpKTsKLSAgICBjcGktPm1vdGlvbl92YXIgPSAoaW50KShmYWJzKHRoaXNfZnJhbWUuTVZydikgKyBmYWJzKHRoaXNfZnJhbWUuTVZjdikpOwotICAgIGNwaS0+aW50ZXJfbHZsID0gKGludCkodGhpc19mcmFtZS5wY250X2ludGVyICogMTAwKTsKLSAgICBjcGktPmludHJhX2x2bCA9IChpbnQpKCgxLjAgLSB0aGlzX2ZyYW1lLnBjbnRfaW50ZXIpICogMTAwKTsKLSAgICBjcGktPm1vdGlvbl9sdmwgPSAoaW50KSh0aGlzX2ZyYW1lLnBjbnRfbW90aW9uICogMTAwKTsKLQotICAgIHN0YXJ0X3BvcyA9IGNwaS0+c3RhdHNfaW47Ci0KLSAgICAvLyBrZXlmcmFtZSBhbmQgc2VjdGlvbiBwcm9jZXNzaW5nICEKLSAgICBpZiAoY3BpLT5mcmFtZXNfdG9fa2V5ID09IDApCi0gICAgewotICAgICAgICAvLyBEZWZpbmUgbmV4dCBLRiBncm91cCBhbmQgYXNzaWduIGJpdHMgdG8gaXQKLSAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKLSAgICAgICAgZmluZF9uZXh0X2tleV9mcmFtZShjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOwotCi0gICAgICAgIC8vIFNwZWNpYWwgY2FzZTogRXJyb3IgZXJyb3JfcmVzaWxpZW50X21vZGUgbW9kZSBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgZm9yIHR3byBwYXNzIGJ1dCB3aXRoIGl0cyBjdXJyZW50IG1lYW5pbmcgYnV0IHRoaXMgY29kZSBpcyBkZXNpZ25lZCB0byBzdG9wCi0gICAgICAgIC8vIG91dGxhbmRpc2ggYmVoYXZpb3VyIGlmIHNvbWVvbmUgZG9lcyBzZXQgaXQgd2hlbiB1c2luZyB0d28gcGFzcy4gSXQgZWZmZWN0aXZlbHkgZGlzYWJsZXMgR0YgZ3JvdXBzLgotICAgICAgICAvLyBUaGlzIGlzIHRlbXBvcmFyeSBjb2RlIHRpbGwgd2UgZGVjaWRlIHdoYXQgc2hvdWxkIHJlYWxseSBoYXBwZW4gaW4gdGhpcyBjYXNlLgotICAgICAgICBpZiAoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmdmX2dyb3VwX2JpdHMgPSBjcGktPmtmX2dyb3VwX2JpdHM7Ci0gICAgICAgICAgICBjcGktPmdmX2dyb3VwX2Vycm9yX2xlZnQgPSBjcGktPmtmX2dyb3VwX2Vycm9yX2xlZnQ7Ci0gICAgICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0gY3BpLT5mcmFtZXNfdG9fa2V5OwotICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbDsKLSAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IEZBTFNFOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBJcyB0aGlzIGEgR0YgLyBBUkYgKE5vdGUgdGhhdCBhIEtGIGlzIGFsd2F5cyBhbHNvIGEgR0YpCi0gICAgaWYgKGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9PSAwKQotICAgIHsKLSAgICAgICAgLy8gVXBkYXRlIG1vbml0b3Igb2YgdGhlIGJpdHMgcGVyIGVycm9yIG9ic2VydmVkIHNvIGZhci4KLSAgICAgICAgLy8gRG9uZSBvbmNlIHBlciBnZiBncm91cCBiYXNlZCBvbiB3aGF0IGhhcyBnb25lIGJlZm9yZQotICAgICAgICAvLyBzbyBkbyBub3RoaW5nIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGZyYW1lLgotICAgICAgICBpZiAoY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+b2JzZXJ2ZWRfYnBlID0KLSAgICAgICAgICAgICAgICAoZG91YmxlKShjcGktPmNsaXBfYml0c190b3RhbCAtIGNwaS0+Yml0c19sZWZ0KSAvCi0gICAgICAgICAgICAgICAgY3BpLT5tb2RpZmllZF9lcnJvcl91c2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGVmaW5lIG5leHQgZ2YgZ3JvdXAgYW5kIGFzc2lnbiBiaXRzIHRvIGl0Ci0gICAgICAgIHZweF9tZW1jcHkoJnRoaXNfZnJhbWVfY29weSwgJnRoaXNfZnJhbWUsIHNpemVvZih0aGlzX2ZyYW1lKSk7Ci0gICAgICAgIGRlZmluZV9nZl9ncm91cChjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOwotCi0gICAgICAgIC8vIElmIHdlIGFyZSBnb2luZyB0byBjb2RlIGFuIGFsdHJlZiBmcmFtZSBhdCB0aGUgZW5kIG9mIHRoZSBncm91cCBhbmQgdGhlIGN1cnJlbnQgZnJhbWUgaXMgbm90IGEga2V5IGZyYW1lLi4uLgotICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgZ3JvdXAgdXNlZCBhbiBhcmYgdGhpcyBmcmFtZSBoYXMgYWxyZWFkeSBiZW5lZml0ZWQgZnJvbSB0aGF0IGFyZiBib29zdCBhbmQgaXQgc2hvdWxkIG5vdCBiZSBnaXZlbiBleHRyYSBiaXRzCi0gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBncm91cCB3YXMgTk9UIGNvZGVkIHVzaW5nIGFyZiB3ZSBtYXkgd2FudCB0byBhcHBseSBzb21lIGJvb3N0IHRvIHRoaXMgR0YgYXMgd2VsbAotICAgICAgICBpZiAoY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nICYmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFzc2lnbiBhIHN0YW5kYXJkIGZyYW1lcyB3b3J0aCBvZiBiaXRzIGZyb20gdGhvc2UgYWxsb2NhdGVkIHRvIHRoZSBHRiBncm91cAotICAgICAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKLSAgICAgICAgICAgIGFzc2lnbl9zdGRfZnJhbWVfYml0cyhjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOwotCi0gICAgICAgICAgICAvLyBJZiBhcHByb3ByaWF0ZSAod2UgYXJlIHN3aXRjaGluZyBpbnRvIEFSRiBhY3RpdmUgYnV0IGl0IHdhcyBub3QgcHJldmlvdXNseSBhY3RpdmUpIGFwcGx5IGEgYm9vc3QgZm9yIHRoZSBnZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGdyb3VwLgotICAgICAgICAgICAgLy9pZiAoICFjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSAmJiAoY3BpLT5nZnVfYm9vc3QgPiAxNTApICkKLSAgICAgICAgICAgIGlmIChGQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZXh0cmFfYml0czsKLSAgICAgICAgICAgICAgICBpbnQgcGN0X2V4dHJhID0gKGNwaS0+Z2Z1X2Jvb3N0IC0gMTAwKSAvIDUwOwotCi0gICAgICAgICAgICAgICAgcGN0X2V4dHJhID0gKHBjdF9leHRyYSA+IDIwKSA/IDIwIDogcGN0X2V4dHJhOwotCi0gICAgICAgICAgICAgICAgZXh0cmFfYml0cyA9IChjcGktPmdmX2dyb3VwX2JpdHMgKiBwY3RfZXh0cmEpIC8gMTAwOwotICAgICAgICAgICAgICAgIGNwaS0+Z2ZfZ3JvdXBfYml0cyAtPSBleHRyYV9iaXRzOwotICAgICAgICAgICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCArPSBleHRyYV9iaXRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIHRoaXMgaXMgYW4gb3JkaW5hcnkgZnJhbWUKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IEVycm9yIGVycm9yX3Jlc2lsaWVudF9tb2RlIG1vZGUgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGZvciB0d28gcGFzcyBidXQgd2l0aCBpdHMgY3VycmVudCBtZWFuaW5nIGJ1dCB0aGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gc3RvcAotICAgICAgICAvLyBvdXRsYW5kaXNoIGJlaGF2aW91ciBpZiBzb21lb25lIGRvZXMgc2V0IGl0IHdoZW4gdXNpbmcgdHdvIHBhc3MuIEl0IGVmZmVjdGl2ZWx5IGRpc2FibGVzIEdGIGdyb3Vwcy4KLSAgICAgICAgLy8gVGhpcyBpcyB0ZW1wb3JhcnkgY29kZSB0aWxsIHdlIGRlY2lkZSB3aGF0IHNob3VsZCByZWFsbHkgaGFwcGVuIGluIHRoaXMgY2FzZS4KLSAgICAgICAgaWYgKGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5mcmFtZXNfdG9fa2V5OwotCi0gICAgICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQXNzaWduIGJpdHMgZnJvbSB0aG9zZSBhbGxvY2F0ZWQgdG8gdGhlIEdGIGdyb3VwCi0gICAgICAgICAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKLSAgICAgICAgICAgICAgICBhc3NpZ25fc3RkX2ZyYW1lX2JpdHMoY3BpLCAmdGhpc19mcmFtZV9jb3B5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFzc2lnbiBiaXRzIGZyb20gdGhvc2UgYWxsb2NhdGVkIHRvIHRoZSBHRiBncm91cAotICAgICAgICAgICAgdnB4X21lbWNweSgmdGhpc19mcmFtZV9jb3B5LCAmdGhpc19mcmFtZSwgc2l6ZW9mKHRoaXNfZnJhbWUpKTsKLSAgICAgICAgICAgIGFzc2lnbl9zdGRfZnJhbWVfYml0cyhjcGksICZ0aGlzX2ZyYW1lX2NvcHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gS2VlcCBhIGdsb2JhbGx5IGF2YWlsYWJsZSBjb3B5IG9mIHRoaXMgYW5kIHRoZSBuZXh0IGZyYW1lJ3MgaWlyYXRpby4KLSAgICBjcGktPnRoaXNfaWlyYXRpbyA9IHRoaXNfZnJhbWVfaW50cmFfZXJyb3IgLwotICAgICAgICAgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSyh0aGlzX2ZyYW1lX2NvZGVkX2Vycm9yKTsKLSAgICB7Ci0gICAgICAgIEZJUlNUUEFTU19TVEFUUyBuZXh0X2ZyYW1lOwotICAgICAgICBpZiAoIGxvb2t1cF9uZXh0X2ZyYW1lX3N0YXRzKGNwaSwgJm5leHRfZnJhbWUpICE9IEVPRiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+bmV4dF9paXJhdGlvID0gbmV4dF9mcmFtZS5pbnRyYV9lcnJvciAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0sobmV4dF9mcmFtZS5jb2RlZF9lcnJvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTZXQgbm9taW5hbCBwZXIgc2Vjb25kIGJhbmR3aWR0aCBmb3IgdGhpcyBmcmFtZQotICAgIGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAqIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGU7Ci0gICAgaWYgKGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA8IDApCi0gICAgICAgIGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA9IDA7Ci0KLSAgICBpZiAoY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSA9PSAwKQotICAgIHsKLSAgICAgICAgY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciA9IDEuMDsKLQotICAgICAgICAvLyBFeHBlcmltZW50YWwgY29kZSB0byB0cnkgYW5kIHNldCBhIGNxX2xldmVsIGluIGNvbnN0cmFpbmVkCi0gICAgICAgIC8vIHF1YWxpdHkgbW9kZS4KLSAgICAgICAgaWYgKCBjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZXN0X2NxOwotCi0gICAgICAgICAgICBlc3RfY3EgPQotICAgICAgICAgICAgICAgIGVzdGltYXRlX2NxKCBjcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPnRvdGFsX2NvZGVkX2Vycm9yX2xlZnQgLyBmcmFtZXNfbGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGNwaS0+Yml0c19sZWZ0IC8gZnJhbWVzX2xlZnQpKTsKLQotICAgICAgICAgICAgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSA9IGNwaS0+b3hjZi5jcV9sZXZlbDsKLSAgICAgICAgICAgIGlmICggZXN0X2NxID4gY3BpLT5jcV90YXJnZXRfcXVhbGl0eSApCi0gICAgICAgICAgICAgICAgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSA9IGVzdF9jcTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGd1ZXNzIGF0IG1heHEgbmVlZGVkIGluIDJuZCBwYXNzCi0gICAgICAgIGNwaS0+bWF4cV9tYXhfbGltaXQgPSBjcGktPndvcnN0X3F1YWxpdHk7Ci0gICAgICAgIGNwaS0+bWF4cV9taW5fbGltaXQgPSBjcGktPmJlc3RfcXVhbGl0eTsKLSAgICAgICAgdG1wX3EgPSBlc3RpbWF0ZV9tYXhfcSggY3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT50b3RhbF9jb2RlZF9lcnJvcl9sZWZ0IC8gZnJhbWVzX2xlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShjcGktPmJpdHNfbGVmdCAvIGZyYW1lc19sZWZ0KSk7Ci0KLSAgICAgICAgLy8gTGltaXQgdGhlIG1heHEgdmFsdWUgcmV0dXJuZWQgc3Vic2VxdWVudGx5LgotICAgICAgICAvLyBUaGlzIGluY3JlYXNlcyB0aGUgcmlzayBvZiBvdmVyc3BlbmQgb3IgdW5kZXJzcGVuZCBpZiB0aGUgaW5pdGlhbAotICAgICAgICAvLyBlc3RpbWF0ZSBmb3IgdGhlIGNsaXAgaXMgYmFkLCBidXQgaGVscHMgcHJldmVudCBleGNlc3NpdmUKLSAgICAgICAgLy8gdmFyaWF0aW9uIGluIFEsIGVzcGVjaWFsbHkgbmVhciB0aGUgZW5kIG9mIGEgY2xpcAotICAgICAgICAvLyB3aGVyZSBmb3IgZXhhbXBsZSBhIHNtYWxsIG92ZXJzcGVuZCBtYXkgY2F1c2UgUSB0byBjcmFzaAotICAgICAgICBjcGktPm1heHFfbWF4X2xpbWl0ID0gKCh0bXBfcSArIDMyKSA8IGNwaS0+d29yc3RfcXVhbGl0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0bXBfcSArIDMyKSA6IGNwaS0+d29yc3RfcXVhbGl0eTsKLSAgICAgICAgY3BpLT5tYXhxX21pbl9saW1pdCA9ICgodG1wX3EgLSAzMikgPiBjcGktPmJlc3RfcXVhbGl0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0bXBfcSAtIDMyKSA6IGNwaS0+YmVzdF9xdWFsaXR5OwotCi0gICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgICAgICAgICA9IHRtcF9xOwotICAgICAgICBjcGktPm5pX2F2X3FpICAgICAgICAgICAgICAgICAgICAgPSB0bXBfcTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbGFzdCBmZXcgZnJhbWVzIG9mIGEgY2xpcCBhbG1vc3QgYWx3YXlzIGhhdmUgdG8gZmV3IG9yIHRvbyBtYW55Ci0gICAgLy8gYml0cyBhbmQgZm9yIHRoZSBzYWtlIG9mIG92ZXIgZXhhY3QgcmF0ZSBjb250cm9sIHdlIGRvbnQgd2FudCB0byBtYWtlCi0gICAgLy8gcmFkaWNhbCBhZGp1c3RtZW50cyB0byB0aGUgYWxsb3dlZCBxdWFudGl6ZXIgcmFuZ2UganVzdCB0byB1c2UgdXAgYQotICAgIC8vIGZldyBzdXJwbHVzIGJpdHMgb3IgZ2V0IGJlbmVhdGggdGhlIHRhcmdldCByYXRlLgotICAgIGVsc2UgaWYgKCAoY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSA8Ci0gICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpY3BpLT50b3RhbF9zdGF0cy0+Y291bnQgKiAyNTUpPj44KSkgJiYKLSAgICAgICAgICAgICAgKChjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lICsgY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbCkgPAotICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljcGktPnRvdGFsX3N0YXRzLT5jb3VudCkgKQotICAgIHsKLSAgICAgICAgaWYgKGZyYW1lc19sZWZ0IDwgMSkKLSAgICAgICAgICAgIGZyYW1lc19sZWZ0ID0gMTsKLQotICAgICAgICB0bXBfcSA9IGVzdGltYXRlX21heF9xKGNwaSwgKGNwaS0+dG90YWxfY29kZWRfZXJyb3JfbGVmdCAvIGZyYW1lc19sZWZ0KSwgKGludCkoY3BpLT5iaXRzX2xlZnQgLyBmcmFtZXNfbGVmdCkpOwotCi0gICAgICAgIC8vIE1vdmUgYWN0aXZlX3dvcnN0X3F1YWxpdHkgYnV0IGluIGEgZGFtcGVkIHdheQotICAgICAgICBpZiAodG1wX3EgPiBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5KQotICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSArKzsKLSAgICAgICAgZWxzZSBpZiAodG1wX3EgPCBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5KQotICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSAtLTsKLQotICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gKChjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ICogMykgKyB0bXBfcSArIDIpIC8gNDsKLSAgICB9Ci0KLSAgICBjcGktPmZyYW1lc190b19rZXkgLS07Ci0gICAgY3BpLT50b3RhbF9lcnJvcl9sZWZ0ICAgICAgLT0gdGhpc19mcmFtZV9lcnJvcjsKLSAgICBjcGktPnRvdGFsX2ludHJhX2Vycm9yX2xlZnQgLT0gdGhpc19mcmFtZV9pbnRyYV9lcnJvcjsKLSAgICBjcGktPnRvdGFsX2NvZGVkX2Vycm9yX2xlZnQgLT0gdGhpc19mcmFtZV9jb2RlZF9lcnJvcjsKLX0KLQotCi1zdGF0aWMgQk9PTCB0ZXN0X2NhbmRpZGF0ZV9rZihWUDhfQ09NUCAqY3BpLCAgRklSU1RQQVNTX1NUQVRTICpsYXN0X2ZyYW1lLCBGSVJTVFBBU1NfU1RBVFMgKnRoaXNfZnJhbWUsIEZJUlNUUEFTU19TVEFUUyAqbmV4dF9mcmFtZSkKLXsKLSAgICBCT09MIGlzX3ZpYWJsZV9rZiA9IEZBTFNFOwotCi0gICAgLy8gRG9lcyB0aGUgZnJhbWUgc2F0aXNmeSB0aGUgcHJpbWFyeSBjcml0ZXJpYSBvZiBhIGtleSBmcmFtZQotICAgIC8vICAgICAgSWYgc28sIHRoZW4gZXhhbWluZSBob3cgd2VsbCBpdCBwcmVkaWN0cyBzdWJzZXF1ZW50IGZyYW1lcwotICAgIGlmICgodGhpc19mcmFtZS0+cGNudF9zZWNvbmRfcmVmIDwgMC4xMCkgJiYKLSAgICAgICAgKG5leHRfZnJhbWUtPnBjbnRfc2Vjb25kX3JlZiA8IDAuMTApICYmCi0gICAgICAgICgodGhpc19mcmFtZS0+cGNudF9pbnRlciA8IDAuMDUpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgICAgKCh0aGlzX2ZyYW1lLT5wY250X2ludGVyIC0gdGhpc19mcmFtZS0+cGNudF9uZXV0cmFsKSA8IC4yNSkgJiYKLSAgICAgICAgICAgICAoKHRoaXNfZnJhbWUtPmludHJhX2Vycm9yIC8gRE9VQkxFX0RJVklERV9DSEVDSyh0aGlzX2ZyYW1lLT5jb2RlZF9lcnJvcikpIDwgMi41KSAmJgotICAgICAgICAgICAgICgoZmFicyhsYXN0X2ZyYW1lLT5jb2RlZF9lcnJvciAtIHRoaXNfZnJhbWUtPmNvZGVkX2Vycm9yKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0sodGhpc19mcmFtZS0+Y29kZWRfZXJyb3IpID4gLjQwKSB8fAotICAgICAgICAgICAgICAoZmFicyhsYXN0X2ZyYW1lLT5pbnRyYV9lcnJvciAtIHRoaXNfZnJhbWUtPmludHJhX2Vycm9yKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0sodGhpc19mcmFtZS0+aW50cmFfZXJyb3IpID4gLjQwKSB8fAotICAgICAgICAgICAgICAoKG5leHRfZnJhbWUtPmludHJhX2Vycm9yIC8gRE9VQkxFX0RJVklERV9DSEVDSyhuZXh0X2ZyYW1lLT5jb2RlZF9lcnJvcikpID4gMy41KQotICAgICAgICAgICAgICkKLSAgICAgICAgICkKLSAgICAgICAgKQotICAgICAgICkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBGSVJTVFBBU1NfU1RBVFMgKnN0YXJ0X3BvczsKLQotICAgICAgICBGSVJTVFBBU1NfU1RBVFMgbG9jYWxfbmV4dF9mcmFtZTsKLQotICAgICAgICBkb3VibGUgYm9vc3Rfc2NvcmUgPSAwLjA7Ci0gICAgICAgIGRvdWJsZSBvbGRfYm9vc3Rfc2NvcmUgPSAwLjA7Ci0gICAgICAgIGRvdWJsZSBkZWNheV9hY2N1bXVsYXRvciA9IDEuMDsKLSAgICAgICAgZG91YmxlIG5leHRfaWlyYXRpbzsKLQotICAgICAgICB2cHhfbWVtY3B5KCZsb2NhbF9uZXh0X2ZyYW1lLCBuZXh0X2ZyYW1lLCBzaXplb2YoKm5leHRfZnJhbWUpKTsKLQotICAgICAgICAvLyBOb3RlIHRoZSBzdGFydGluZyBmaWxlIHBvc2l0aW9uIHNvIHdlIGNhbiByZXNldCB0byBpdAotICAgICAgICBzdGFydF9wb3MgPSBjcGktPnN0YXRzX2luOwotCi0gICAgICAgIC8vIEV4YW1pbmUgaG93IHdlbGwgdGhlIGtleSBmcmFtZSBwcmVkaWN0cyBzdWJzZXF1ZW50IGZyYW1lcwotICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRfaWlyYXRpbyA9IChJSUtGQUNUT1IxICogbG9jYWxfbmV4dF9mcmFtZS5pbnRyYV9lcnJvciAvIERPVUJMRV9ESVZJREVfQ0hFQ0sobG9jYWxfbmV4dF9mcmFtZS5jb2RlZF9lcnJvcikpIDsKLQotICAgICAgICAgICAgaWYgKG5leHRfaWlyYXRpbyA+IFJNQVgpCi0gICAgICAgICAgICAgICAgbmV4dF9paXJhdGlvID0gUk1BWDsKLQotICAgICAgICAgICAgLy8gQ3VtdWxhdGl2ZSBlZmZlY3Qgb2YgZGVjYXkgaW4gcHJlZGljdGlvbiBxdWFsaXR5Ci0gICAgICAgICAgICBpZiAobG9jYWxfbmV4dF9mcmFtZS5wY250X2ludGVyID4gMC44NSkKLSAgICAgICAgICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9IGRlY2F5X2FjY3VtdWxhdG9yICogbG9jYWxfbmV4dF9mcmFtZS5wY250X2ludGVyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yID0gZGVjYXlfYWNjdW11bGF0b3IgKiAoKDAuODUgKyBsb2NhbF9uZXh0X2ZyYW1lLnBjbnRfaW50ZXIpIC8gMi4wKTsKLQotICAgICAgICAgICAgLy9kZWNheV9hY2N1bXVsYXRvciA9IGRlY2F5X2FjY3VtdWxhdG9yICogbG9jYWxfbmV4dF9mcmFtZS5wY250X2ludGVyOwotCi0gICAgICAgICAgICAvLyBLZWVwIGEgcnVubmluZyB0b3RhbAotICAgICAgICAgICAgYm9vc3Rfc2NvcmUgKz0gKGRlY2F5X2FjY3VtdWxhdG9yICogbmV4dF9paXJhdGlvKTsKLQotICAgICAgICAgICAgLy8gVGVzdCB2YXJpb3VzIGJyZWFrb3V0IGNsYXVzZXMKLSAgICAgICAgICAgIGlmICgobG9jYWxfbmV4dF9mcmFtZS5wY250X2ludGVyIDwgMC4wNSkgfHwKLSAgICAgICAgICAgICAgICAobmV4dF9paXJhdGlvIDwgMS41KSB8fAotICAgICAgICAgICAgICAgICgoKGxvY2FsX25leHRfZnJhbWUucGNudF9pbnRlciAtCi0gICAgICAgICAgICAgICAgICAgbG9jYWxfbmV4dF9mcmFtZS5wY250X25ldXRyYWwpIDwgMC4yMCkgJiYKLSAgICAgICAgICAgICAgICAgKG5leHRfaWlyYXRpbyA8IDMuMCkpIHx8Ci0gICAgICAgICAgICAgICAgKChib29zdF9zY29yZSAtIG9sZF9ib29zdF9zY29yZSkgPCAwLjUpIHx8Ci0gICAgICAgICAgICAgICAgKGxvY2FsX25leHRfZnJhbWUuaW50cmFfZXJyb3IgPCAyMDApCi0gICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9sZF9ib29zdF9zY29yZSA9IGJvb3N0X3Njb3JlOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgZnJhbWUgZGV0YWlscwotICAgICAgICAgICAgaWYgKEVPRiA9PSBpbnB1dF9zdGF0cyhjcGksICZsb2NhbF9uZXh0X2ZyYW1lKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIHRvbGVyYWJsZSBwcmVkaWN0aW9uIGZvciBhdCBsZWFzdCB0aGUgbmV4dCAzIGZyYW1lcyB0aGVuIGJyZWFrIG91dCBlbHNlIGRpc2NhcmQgdGhpcyBwb3R0ZW50aWFsIGtleSBmcmFtZSBhbmQgbW92ZSBvbgotICAgICAgICBpZiAoYm9vc3Rfc2NvcmUgPiA1LjAgJiYgKGkgPiAzKSkKLSAgICAgICAgICAgIGlzX3ZpYWJsZV9rZiA9IFRSVUU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGZpbGUgcG9zaXRpb24KLSAgICAgICAgICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIHN0YXJ0X3Bvcyk7Ci0KLSAgICAgICAgICAgIGlzX3ZpYWJsZV9rZiA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGlzX3ZpYWJsZV9rZjsKLX0KLXN0YXRpYyB2b2lkIGZpbmRfbmV4dF9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSwgRklSU1RQQVNTX1NUQVRTICp0aGlzX2ZyYW1lKQotewotICAgIGludCBpLGo7Ci0gICAgRklSU1RQQVNTX1NUQVRTIGxhc3RfZnJhbWU7Ci0gICAgRklSU1RQQVNTX1NUQVRTIGZpcnN0X2ZyYW1lOwotICAgIEZJUlNUUEFTU19TVEFUUyBuZXh0X2ZyYW1lOwotICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhcnRfcG9zaXRpb247Ci0KLSAgICBkb3VibGUgZGVjYXlfYWNjdW11bGF0b3IgPSAxLjA7Ci0gICAgZG91YmxlIGJvb3N0X3Njb3JlID0gMDsKLSAgICBkb3VibGUgb2xkX2Jvb3N0X3Njb3JlID0gMC4wOwotICAgIGRvdWJsZSBsb29wX2RlY2F5X3JhdGU7Ci0KLSAgICBkb3VibGUga2ZfbW9kX2VyciA9IDAuMDsKLSAgICBkb3VibGUga2ZfZ3JvdXBfZXJyID0gMC4wOwotICAgIGRvdWJsZSBrZl9ncm91cF9pbnRyYV9lcnIgPSAwLjA7Ci0gICAgZG91YmxlIGtmX2dyb3VwX2NvZGVkX2VyciA9IDAuMDsKLSAgICBkb3VibGUgdHdvX3Bhc3NfbWluX3JhdGUgPSAoZG91YmxlKShjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAqIGNwaS0+b3hjZi50d29fcGFzc192YnJtaW5fc2VjdGlvbiAvIDEwMCk7Ci0gICAgZG91YmxlIHJlY2VudF9sb29wX2RlY2F5WzhdID0gezEuMCwxLjAsMS4wLDEuMCwxLjAsMS4wLDEuMCwxLjB9OwotCi0gICAgdnB4X21lbXNldCgmbmV4dF9mcmFtZSwgMCwgc2l6ZW9mKG5leHRfZnJhbWUpKTsgLy8gYXNzdXJlIGNsZWFuCi0KLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7ICAvL19fYXNtIGVtbXM7Ci0gICAgc3RhcnRfcG9zaXRpb24gPSBjcGktPnN0YXRzX2luOwotCi0gICAgY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9IEtFWV9GUkFNRTsKLQotICAgIC8vIGlzIHRoaXMgYSBmb3JjZWQga2V5IGZyYW1lIGJ5IGludGVydmFsCi0gICAgY3BpLT50aGlzX2tleV9mcmFtZV9mb3JjZWQgPSBjcGktPm5leHRfa2V5X2ZyYW1lX2ZvcmNlZDsKLQotICAgIC8vIENsZWFyIHRoZSBhbHQgcmVmIGFjdGl2ZSBmbGFnIGFzIHRoaXMgY2FuIG5ldmVyIGJlIGFjdGl2ZSBvbiBhIGtleSBmcmFtZQotICAgIGNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlID0gRkFMU0U7Ci0KLSAgICAvLyBLZiBpcyBhbHdheXMgYSBnZiBzbyBjbGVhciBmcmFtZXMgdGlsbCBuZXh0IGdmIGNvdW50ZXIKLSAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSAwOwotCi0gICAgY3BpLT5mcmFtZXNfdG9fa2V5ID0gMTsKLQotICAgIC8vIFRha2UgYSBjb3B5IG9mIHRoZSBpbml0aWFsIGZyYW1lIGRldGFpbHMKLSAgICB2cHhfbWVtY3B5KCZmaXJzdF9mcmFtZSwgdGhpc19mcmFtZSwgc2l6ZW9mKCp0aGlzX2ZyYW1lKSk7Ci0KLSAgICBjcGktPmtmX2dyb3VwX2JpdHMgPSAwOyAgICAgICAgLy8gVG90YWwgYml0cyBhdmFpYWxhYmxlIHRvIGtmIGdyb3VwCi0gICAgY3BpLT5rZl9ncm91cF9lcnJvcl9sZWZ0ID0gMDsgIC8vIEdyb3VwIG1vZGlmaWVkIGVycm9yIHNjb3JlLgotCi0gICAga2ZfbW9kX2VyciA9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKLQotICAgIC8vIGZpbmQgdGhlIG5leHQga2V5ZnJhbWUKLSAgICBpID0gMDsKLSAgICB3aGlsZSAoY3BpLT5zdGF0c19pbiA8IGNwaS0+c3RhdHNfaW5fZW5kKQotICAgIHsKLSAgICAgICAgLy8gQWNjdW11bGF0ZSBrZiBncm91cCBlcnJvcgotICAgICAgICBrZl9ncm91cF9lcnIgKz0gY2FsY3VsYXRlX21vZGlmaWVkX2VycihjcGksIHRoaXNfZnJhbWUpOwotCi0gICAgICAgIC8vIFRoZXNlIGZpZ3VyZXMga2VlcCBpbnRyYSBhbmQgY29kZWQgZXJyb3IgY291bnRzIGZvciBhbGwgZnJhbWVzIGluY2x1ZGluZyBrZXkgZnJhbWVzIGluIHRoZSBncm91cC4KLSAgICAgICAgLy8gVGhlIGVmZmVjdCBvZiB0aGUga2V5IGZyYW1lIGl0c2VsZiBjYW4gYmUgc3VidHJhY3RlZCBvdXQgdXNpbmcgdGhlIGZpcnN0X2ZyYW1lIGRhdGEgY29sbGVjdGVkIGFib3ZlCi0gICAgICAgIGtmX2dyb3VwX2ludHJhX2VyciArPSB0aGlzX2ZyYW1lLT5pbnRyYV9lcnJvcjsKLSAgICAgICAga2ZfZ3JvdXBfY29kZWRfZXJyICs9IHRoaXNfZnJhbWUtPmNvZGVkX2Vycm9yOwotCi0gICAgICAgIC8vIGxvYWQgYSB0aGUgbmV4dCBmcmFtZSdzIHN0YXRzCi0gICAgICAgIHZweF9tZW1jcHkoJmxhc3RfZnJhbWUsIHRoaXNfZnJhbWUsIHNpemVvZigqdGhpc19mcmFtZSkpOwotICAgICAgICBpbnB1dF9zdGF0cyhjcGksIHRoaXNfZnJhbWUpOwotCi0gICAgICAgIC8vIFByb3ZpZGVkIHRoYXQgd2UgYXJlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLi4uCi0gICAgICAgIGlmIChjcGktPm94Y2YuYXV0b19rZXkKLSAgICAgICAgICAgICYmIGxvb2t1cF9uZXh0X2ZyYW1lX3N0YXRzKGNwaSwgJm5leHRfZnJhbWUpICE9IEVPRikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm9ybWFsIHNjZW5lIGN1dCBjaGVjawotICAgICAgICAgICAgaWYgKHRlc3RfY2FuZGlkYXRlX2tmKGNwaSwgJmxhc3RfZnJhbWUsIHRoaXNfZnJhbWUsICZuZXh0X2ZyYW1lKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gSG93IGZhc3QgaXMgcHJlZGljdGlvbiBxdWFsaXR5IGRlY2F5aW5nCi0gICAgICAgICAgICBsb29wX2RlY2F5X3JhdGUgPSBnZXRfcHJlZGljdGlvbl9kZWNheV9yYXRlKGNwaSwgJm5leHRfZnJhbWUpOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtub3cgc29tZXRoaW5nIGFib3V0IHRoZSByZWNlbnQgcGFzdC4uLiByYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gYXMgdXNlZCBlbHNld2hlcmUgd2hlcmUgd2UgYXJlIGNvbmNlbmVkIHdpdGggZGVjYXkgaW4gcHJlZGljdGlvbgotICAgICAgICAgICAgLy8gcXVhbGl0eSBzaW5jZSB0aGUgbGFzdCBHRiBvciBLRi4KLSAgICAgICAgICAgIHJlY2VudF9sb29wX2RlY2F5W2klOF0gPSBsb29wX2RlY2F5X3JhdGU7Ci0gICAgICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9IDEuMDsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVjYXlfYWNjdW11bGF0b3IgPSBkZWNheV9hY2N1bXVsYXRvciAqIHJlY2VudF9sb29wX2RlY2F5W2pdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTcGVjaWFsIGNoZWNrIGZvciB0cmFuc2l0aW9uIG9yIGhpZ2ggbW90aW9uIGZvbGxvd2VkIGJ5IGEKLSAgICAgICAgICAgIC8vIHRvIGEgc3RhdGljIHNjZW5lLgotICAgICAgICAgICAgaWYgKCBkZXRlY3RfdHJhbnNpdGlvbl90b19zdGlsbCggY3BpLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+a2V5X2ZyYW1lX2ZyZXF1ZW5jeS1pKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZGVjYXlfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2F5X2FjY3VtdWxhdG9yICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIC8vIFN0ZXAgb24gdG8gdGhlIG5leHQgZnJhbWUKLSAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RvX2tleSArKzsKLQotICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHJlYWwga2V5IGZyYW1lIHdpdGhpbiB0aGUgbmV4dCB0d28KLSAgICAgICAgICAgIC8vIGZvcmNla2V5ZnJhbWVldmVyeSBpbnRlcnZhbHMgdGhlbiBicmVhayBvdXQgb2YgdGhlIGxvb3AuCi0gICAgICAgICAgICBpZiAoY3BpLT5mcmFtZXNfdG9fa2V5ID49IDIgKihpbnQpY3BpLT5rZXlfZnJhbWVfZnJlcXVlbmN5KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RvX2tleSArKzsKLQotICAgICAgICBpKys7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBtYXgga2YgaW50ZXJ2YWwgc2V0IGJ5IHRoZSB1c2VyIHdlIG11c3Qgb2JleSBpdC4KLSAgICAvLyBXZSBhbHJlYWR5IGJyZWFrb3V0IG9mIHRoZSBsb29wIGFib3ZlIGF0IDJ4IG1heC4KLSAgICAvLyBUaGlzIGNvZGUgY2VudGVycyB0aGUgZXh0cmEga2YgaWYgdGhlIGFjdHVhbCBuYXR1cmFsCi0gICAgLy8gaW50ZXJ2YWwgaXMgYmV0d2VlbiAxeCBhbmQgMngKLSAgICBpZiAoY3BpLT5veGNmLmF1dG9fa2V5Ci0gICAgICAgICYmIGNwaS0+ZnJhbWVzX3RvX2tleSA+IChpbnQpY3BpLT5rZXlfZnJhbWVfZnJlcXVlbmN5ICkKLSAgICB7Ci0gICAgICAgIEZJUlNUUEFTU19TVEFUUyAqY3VycmVudF9wb3MgPSBjcGktPnN0YXRzX2luOwotICAgICAgICBGSVJTVFBBU1NfU1RBVFMgdG1wX2ZyYW1lOwotCi0gICAgICAgIGNwaS0+ZnJhbWVzX3RvX2tleSAvPSAyOwotCi0gICAgICAgIC8vIENvcHkgZmlyc3QgZnJhbWUgZGV0YWlscwotICAgICAgICB2cHhfbWVtY3B5KCZ0bXBfZnJhbWUsICZmaXJzdF9mcmFtZSwgc2l6ZW9mKGZpcnN0X2ZyYW1lKSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBncm91cAotICAgICAgICByZXNldF9mcGZfcG9zaXRpb24oY3BpLCBzdGFydF9wb3NpdGlvbik7Ci0KLSAgICAgICAga2ZfZ3JvdXBfZXJyID0gMDsKLSAgICAgICAga2ZfZ3JvdXBfaW50cmFfZXJyID0gMDsKLSAgICAgICAga2ZfZ3JvdXBfY29kZWRfZXJyID0gMDsKLQotICAgICAgICAvLyBSZXNjYW4gdG8gZ2V0IHRoZSBjb3JyZWN0IGVycm9yIGRhdGEgZm9yIHRoZSBmb3JjZWQga2YgZ3JvdXAKLSAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNwaS0+ZnJhbWVzX3RvX2tleTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSBrZiBncm91cCBlcnJvcnMKLSAgICAgICAgICAgIGtmX2dyb3VwX2VyciArPSBjYWxjdWxhdGVfbW9kaWZpZWRfZXJyKGNwaSwgJnRtcF9mcmFtZSk7Ci0gICAgICAgICAgICBrZl9ncm91cF9pbnRyYV9lcnIgKz0gdG1wX2ZyYW1lLmludHJhX2Vycm9yOwotICAgICAgICAgICAga2ZfZ3JvdXBfY29kZWRfZXJyICs9IHRtcF9mcmFtZS5jb2RlZF9lcnJvcjsKLQotICAgICAgICAgICAgLy8gTG9hZCBhIHRoZSBuZXh0IGZyYW1lJ3Mgc3RhdHMKLSAgICAgICAgICAgIGlucHV0X3N0YXRzKGNwaSwgJnRtcF9mcmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGdyb3VwCi0gICAgICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIGN1cnJlbnRfcG9zKTsKLQotICAgICAgICBjcGktPm5leHRfa2V5X2ZyYW1lX2ZvcmNlZCA9IFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgY3BpLT5uZXh0X2tleV9mcmFtZV9mb3JjZWQgPSBGQUxTRTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGZpbGUKLSAgICBpZiAoY3BpLT5zdGF0c19pbiA+PSBjcGktPnN0YXRzX2luX2VuZCkKLSAgICB7Ci0gICAgICAgIC8vIEFjY3VtdWxhdGUga2YgZ3JvdXAgZXJyb3IKLSAgICAgICAga2ZfZ3JvdXBfZXJyICs9IGNhbGN1bGF0ZV9tb2RpZmllZF9lcnIoY3BpLCB0aGlzX2ZyYW1lKTsKLQotICAgICAgICAvLyBUaGVzZSBmaWd1cmVzIGtlZXAgaW50cmEgYW5kIGNvZGVkIGVycm9yIGNvdW50cyBmb3IgYWxsIGZyYW1lcyBpbmNsdWRpbmcga2V5IGZyYW1lcyBpbiB0aGUgZ3JvdXAuCi0gICAgICAgIC8vIFRoZSBlZmZlY3Qgb2YgdGhlIGtleSBmcmFtZSBpdHNlbGYgY2FuIGJlIHN1YnRyYWN0ZWQgb3V0IHVzaW5nIHRoZSBmaXJzdF9mcmFtZSBkYXRhIGNvbGxlY3RlZCBhYm92ZQotICAgICAgICBrZl9ncm91cF9pbnRyYV9lcnIgKz0gdGhpc19mcmFtZS0+aW50cmFfZXJyb3I7Ci0gICAgICAgIGtmX2dyb3VwX2NvZGVkX2VyciArPSB0aGlzX2ZyYW1lLT5jb2RlZF9lcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBrZiBncm91cC4KLSAgICBpZiAoKGNwaS0+Yml0c19sZWZ0ID4gMCkgJiYgKGNwaS0+bW9kaWZpZWRfZXJyb3JfbGVmdCA+IDAuMCkpCi0gICAgewotICAgICAgICAvLyBNYXggZm9yIGEgc2luZ2xlIG5vcm1hbCBmcmFtZSAobm90IGtleSBmcmFtZSkKLSAgICAgICAgaW50IG1heF9iaXRzID0gZnJhbWVfbWF4X2JpdHMoY3BpKTsKLQotICAgICAgICAvLyBNYXhpbXVtIGJpdHMgZm9yIHRoZSBrZiBncm91cAotICAgICAgICBsb25nIGxvbmcgbWF4X2dycF9iaXRzOwotCi0gICAgICAgIC8vIERlZmF1bHQgYWxsb2NhdGlvbiBiYXNlZCBvbiBiaXRzIGxlZnQgYW5kIHJlbGF0aXZlCi0gICAgICAgIC8vIGNvbXBsZXhpdHkgb2YgdGhlIHNlY3Rpb24KLSAgICAgICAgY3BpLT5rZl9ncm91cF9iaXRzID0gKGxvbmcgbG9uZykoIGNwaS0+Yml0c19sZWZ0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgga2ZfZ3JvdXBfZXJyIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5tb2RpZmllZF9lcnJvcl9sZWZ0ICkpOwotCi0gICAgICAgIC8vIENsaXAgYmFzZWQgb24gbWF4aW11bSBwZXIgZnJhbWUgcmF0ZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLgotICAgICAgICBtYXhfZ3JwX2JpdHMgPSAobG9uZyBsb25nKW1heF9iaXRzICogKGxvbmcgbG9uZyljcGktPmZyYW1lc190b19rZXk7Ci0gICAgICAgIGlmIChjcGktPmtmX2dyb3VwX2JpdHMgPiBtYXhfZ3JwX2JpdHMpCi0gICAgICAgICAgICBjcGktPmtmX2dyb3VwX2JpdHMgPSBtYXhfZ3JwX2JpdHM7Ci0KLSAgICAgICAgLy8gQWRkaXRpb25hbCBzcGVjaWFsIGNhc2UgZm9yIENCUiBpZiBidWZmZXIgaXMgZ2V0dGluZyBmdWxsLgotICAgICAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvcHRfYnVmZmVyX2x2bCA9IGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbDsKLSAgICAgICAgICAgIGludCBidWZmZXJfbHZsID0gY3BpLT5idWZmZXJfbGV2ZWw7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBidWZmZXIgaXMgbmVhciBvciBhYm92ZSB0aGUgb3B0aW1hbCBhbmQgdGhpcyBrZiBncm91cCBpcwotICAgICAgICAgICAgLy8gbm90IGJlaW5nIGFsbG9jYXRlZCBtdWNoIHRoZW4gaW5jcmVhc2UgdGhlIGFsbG9jYXRpb24gYSBiaXQuCi0gICAgICAgICAgICBpZiAoYnVmZmVyX2x2bCA+PSBvcHRfYnVmZmVyX2x2bCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaGlnaF93YXRlcl9tYXJrID0gKG9wdF9idWZmZXJfbHZsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+b3hjZi5tYXhpbXVtX2J1ZmZlcl9zaXplKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgbG9uZyBsb25nIGF2X2dyb3VwX2JpdHM7Ci0KLSAgICAgICAgICAgICAgICAvLyBBdiBiaXRzIHBlciBmcmFtZSAqIG51bWJlciBvZiBmcmFtZXMKLSAgICAgICAgICAgICAgICBhdl9ncm91cF9iaXRzID0gKGxvbmcgbG9uZyljcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWNwaS0+ZnJhbWVzX3RvX2tleTsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhdCBvciBhYm92ZSB0aGUgbWF4aW11bS4KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPj0gaGlnaF93YXRlcl9tYXJrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIG1pbl9ncm91cF9iaXRzOwotCi0gICAgICAgICAgICAgICAgICAgIG1pbl9ncm91cF9iaXRzID0gYXZfZ3JvdXBfYml0cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykoYnVmZmVyX2x2bCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF93YXRlcl9tYXJrKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5rZl9ncm91cF9iaXRzIDwgbWluX2dyb3VwX2JpdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmtmX2dyb3VwX2JpdHMgPSBtaW5fZ3JvdXBfYml0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGFib3ZlIG9wdGltYWwgYnV0IGJlbG93IHRoZSBtYXhpbXVtCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5rZl9ncm91cF9iaXRzIDwgYXZfZ3JvdXBfYml0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBiaXRzX2JlbG93X2F2ID0gYXZfZ3JvdXBfYml0cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5rZl9ncm91cF9iaXRzOwotCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+a2ZfZ3JvdXBfYml0cyArPQotICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSgoZG91YmxlKWJpdHNfYmVsb3dfYXYgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKShidWZmZXJfbHZsIC0gb3B0X2J1ZmZlcl9sdmwpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkoaGlnaF93YXRlcl9tYXJrIC0gb3B0X2J1ZmZlcl9sdmwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBjcGktPmtmX2dyb3VwX2JpdHMgPSAwOwotCi0gICAgLy8gUmVzZXQgdGhlIGZpcnN0IHBhc3MgZmlsZSBwb3NpdGlvbgotICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIHN0YXJ0X3Bvc2l0aW9uKTsKLQotICAgIC8vIGRldGVybWluZSBob3cgYmlnIHRvIG1ha2UgdGhpcyBrZXlmcmFtZSBiYXNlZCBvbiBob3cgd2VsbCB0aGUgc3Vic2VxdWVudCBmcmFtZXMgdXNlIGludGVyIGJsb2NrcwotICAgIGRlY2F5X2FjY3VtdWxhdG9yID0gMS4wOwotICAgIGJvb3N0X3Njb3JlID0gMC4wOwotICAgIGxvb3BfZGVjYXlfcmF0ZSA9IDEuMDA7ICAgICAgIC8vIFN0YXJ0aW5nIGRlY2F5IHJhdGUKLQotICAgIGZvciAoaSA9IDAgOyBpIDwgY3BpLT5mcmFtZXNfdG9fa2V5IDsgaSsrKQotICAgIHsKLSAgICAgICAgZG91YmxlIHI7Ci0gICAgICAgIGRvdWJsZSBtb3Rpb25fZGVjYXk7Ci0gICAgICAgIGRvdWJsZSBtb3Rpb25fcGN0OwotCi0gICAgICAgIGlmIChFT0YgPT0gaW5wdXRfc3RhdHMoY3BpLCAmbmV4dF9mcmFtZSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAobmV4dF9mcmFtZS5pbnRyYV9lcnJvciA+IGNwaS0+a2ZfaW50cmFfZXJyX21pbikKLSAgICAgICAgICAgIHIgPSAoSUlLRkFDVE9SMiAqIG5leHRfZnJhbWUuaW50cmFfZXJyb3IgLwotICAgICAgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSyhuZXh0X2ZyYW1lLmNvZGVkX2Vycm9yKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHIgPSAoSUlLRkFDVE9SMiAqIGNwaS0+a2ZfaW50cmFfZXJyX21pbiAvCi0gICAgICAgICAgICAgICAgICAgICBET1VCTEVfRElWSURFX0NIRUNLKG5leHRfZnJhbWUuY29kZWRfZXJyb3IpKTsKLQotICAgICAgICBpZiAociA+IFJNQVgpCi0gICAgICAgICAgICByID0gUk1BWDsKLQotICAgICAgICAvLyBIb3cgZmFzdCBpcyBwcmVkaWN0aW9uIHF1YWxpdHkgZGVjYXlpbmcKLSAgICAgICAgbG9vcF9kZWNheV9yYXRlID0gZ2V0X3ByZWRpY3Rpb25fZGVjYXlfcmF0ZShjcGksICZuZXh0X2ZyYW1lKTsKLQotICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9IGRlY2F5X2FjY3VtdWxhdG9yICogbG9vcF9kZWNheV9yYXRlOwotICAgICAgICBkZWNheV9hY2N1bXVsYXRvciA9IGRlY2F5X2FjY3VtdWxhdG9yIDwgMC4xID8gMC4xIDogZGVjYXlfYWNjdW11bGF0b3I7Ci0KLSAgICAgICAgYm9vc3Rfc2NvcmUgKz0gKGRlY2F5X2FjY3VtdWxhdG9yICogcik7Ci0KLSAgICAgICAgaWYgKChpID4gTUlOX0dGX0lOVEVSVkFMKSAmJgotICAgICAgICAgICAgKChib29zdF9zY29yZSAtIG9sZF9ib29zdF9zY29yZSkgPCAxLjApKQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG9sZF9ib29zdF9zY29yZSA9IGJvb3N0X3Njb3JlOwotICAgIH0KLQotICAgIGlmICgxKQotICAgIHsKLSAgICAgICAgRklSU1RQQVNTX1NUQVRTIHNlY3Rpb25zdGF0czsKLSAgICAgICAgZG91YmxlIFJhdGlvOwotCi0gICAgICAgIHplcm9fc3RhdHMoJnNlY3Rpb25zdGF0cyk7Ci0gICAgICAgIHJlc2V0X2ZwZl9wb3NpdGlvbihjcGksIHN0YXJ0X3Bvc2l0aW9uKTsKLQotICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IGNwaS0+ZnJhbWVzX3RvX2tleSA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW5wdXRfc3RhdHMoY3BpLCAmbmV4dF9mcmFtZSk7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlX3N0YXRzKCZzZWN0aW9uc3RhdHMsICZuZXh0X2ZyYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2Z19zdGF0cygmc2VjdGlvbnN0YXRzKTsKLQotICAgICAgICAgY3BpLT5zZWN0aW9uX2ludHJhX3JhdGluZyA9IHNlY3Rpb25zdGF0cy5pbnRyYV9lcnJvciAvIERPVUJMRV9ESVZJREVfQ0hFQ0soc2VjdGlvbnN0YXRzLmNvZGVkX2Vycm9yKTsKLQotICAgICAgICBSYXRpbyA9IHNlY3Rpb25zdGF0cy5pbnRyYV9lcnJvciAvIERPVUJMRV9ESVZJREVfQ0hFQ0soc2VjdGlvbnN0YXRzLmNvZGVkX2Vycm9yKTsKLSAgICAgICAgLy8gaWYoIChSYXRpbyA+IDExKSApIC8vJiYgKHNlY3Rpb25zdGF0cy5wY250X3NlY29uZF9yZWYgPCAuMjApICkKLSAgICAgICAgLy97Ci0gICAgICAgIGNwaS0+c2VjdGlvbl9tYXhfcWZhY3RvciA9IDEuMCAtICgoUmF0aW8gLSAxMC4wKSAqIDAuMDI1KTsKLQotICAgICAgICBpZiAoY3BpLT5zZWN0aW9uX21heF9xZmFjdG9yIDwgMC44MCkKLSAgICAgICAgICAgIGNwaS0+c2VjdGlvbl9tYXhfcWZhY3RvciA9IDAuODA7Ci0KLSAgICAgICAgLy99Ci0gICAgICAgIC8vZWxzZQotICAgICAgICAvLyAgICBjcGktPnNlY3Rpb25fbWF4X3FmYWN0b3IgPSAxLjA7Ci0gICAgfQotCi0gICAgLy8gV2hlbiB1c2luZyBDQlIgYXBwbHkgYWRkaXRpb25hbCBidWZmZXIgZnVsbG5lc3MgcmVsYXRlZCB1cHBlciBsaW1pdHMKLSAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCi0gICAgewotICAgICAgICBkb3VibGUgbWF4X2Jvb3N0OwotCi0gICAgICAgIGlmIChjcGktPmRyb3BfZnJhbWVzX2FsbG93ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBkZl9idWZmZXJfbGV2ZWwgPSBjcGktPm94Y2YuZHJvcF9mcmFtZXNfd2F0ZXJfbWFyayAqIChjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgLyAxMDApOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPiBkZl9idWZmZXJfbGV2ZWwpCi0gICAgICAgICAgICAgICAgbWF4X2Jvb3N0ID0gKChkb3VibGUpKChjcGktPmJ1ZmZlcl9sZXZlbCAtIGRmX2J1ZmZlcl9sZXZlbCkgKiAyIC8gMykgKiAxNi4wKSAvIERPVUJMRV9ESVZJREVfQ0hFQ0soKGRvdWJsZSljcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1heF9ib29zdCA9IDAuMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9ib29zdCA9ICgoZG91YmxlKShjcGktPmJ1ZmZlcl9sZXZlbCAqIDIgLyAzKSAqIDE2LjApIC8gRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhfYm9vc3QgPSAwLjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYm9vc3Rfc2NvcmUgPiBtYXhfYm9vc3QpCi0gICAgICAgICAgICBib29zdF9zY29yZSA9IG1heF9ib29zdDsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCB0aGUgZmlyc3QgcGFzcyBmaWxlIHBvc2l0aW9uCi0gICAgcmVzZXRfZnBmX3Bvc2l0aW9uKGNwaSwgc3RhcnRfcG9zaXRpb24pOwotCi0gICAgLy8gV29yayBvdXQgaG93IG1hbnkgYml0cyB0byBhbGxvY2F0ZSBmb3IgdGhlIGtleSBmcmFtZSBpdHNlbGYKLSAgICBpZiAoMSkKLSAgICB7Ci0gICAgICAgIGludCBrZl9ib29zdCA9IGJvb3N0X3Njb3JlOwotICAgICAgICBpbnQgYWxsb2NhdGlvbl9jaHVua3M7Ci0gICAgICAgIGludCBDb3VudGVyID0gY3BpLT5mcmFtZXNfdG9fa2V5OwotICAgICAgICBpbnQgYWx0X2tmX2JpdHM7Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqbHN0X3l2MTIgPSAmY3BpLT5jb21tb24ueXYxMl9mYltjcGktPmNvbW1vbi5sc3RfZmJfaWR4XTsKLSAgICAgICAgLy8gTWluIGJvb3N0IGJhc2VkIG9uIGtmIGludGVydmFsCi0jaWYgMAotCi0gICAgICAgIHdoaWxlICgoa2ZfYm9vc3QgPCA0OCkgJiYgKENvdW50ZXIgPiAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ291bnRlciAtPSAyOwotICAgICAgICAgICAga2ZfYm9vc3QgKys7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKGtmX2Jvb3N0IDwgNDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGtmX2Jvb3N0ICs9ICgoQ291bnRlciArIDEpID4+IDEpOwotCi0gICAgICAgICAgICBpZiAoa2ZfYm9vc3QgPiA0OCkga2ZfYm9vc3QgPSA0ODsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJpZ2dlciBmcmFtZSBzaXplcyBuZWVkIGxhcmdlciBrZiBib29zdHMsIHNtYWxsZXIgZnJhbWVzIHNtYWxsZXIgYm9vc3RzLi4uCi0gICAgICAgIGlmICgobHN0X3l2MTItPnlfd2lkdGggKiBsc3RfeXYxMi0+eV9oZWlnaHQpID4gKDMyMCAqIDI0MCkpCi0gICAgICAgICAgICBrZl9ib29zdCArPSAyICogKGxzdF95djEyLT55X3dpZHRoICogbHN0X3l2MTItPnlfaGVpZ2h0KSAvICgzMjAgKiAyNDApOwotICAgICAgICBlbHNlIGlmICgobHN0X3l2MTItPnlfd2lkdGggKiBsc3RfeXYxMi0+eV9oZWlnaHQpIDwgKDMyMCAqIDI0MCkpCi0gICAgICAgICAgICBrZl9ib29zdCAtPSA0ICogKDMyMCAqIDI0MCkgLyAobHN0X3l2MTItPnlfd2lkdGggKiBsc3RfeXYxMi0+eV9oZWlnaHQpOwotCi0gICAgICAgIGtmX2Jvb3N0ID0gKGludCkoKGRvdWJsZSlrZl9ib29zdCAqIDEwMC4wKSA+PiA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGUgMTYgdG8gMTAwCi0KLSAgICAgICAgLy8gQWRqdXN0bWVudCB0byBib29zdCBiYXNlZCBvbiByZWNlbnQgYXZlcmFnZSBxCi0gICAgICAgIC8va2ZfYm9vc3QgPSBrZl9ib29zdCAqIHZwOF9rZl9ib29zdF9xYWRqdXN0bWVudFtjcGktPm5pX2F2X3FpXSAvIDEwMDsKLQotICAgICAgICBpZiAoa2ZfYm9vc3QgPCAyNTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWluIEtGIGJvb3N0Ci0gICAgICAgICAgICBrZl9ib29zdCA9IDI1MDsKLQotICAgICAgICAvLyBXZSBkbyB0aHJlZSBjYWxjdWxhdGlvbnMgZm9yIGtmIHNpemUuCi0gICAgICAgIC8vIFRoZSBmaXJzdCBpcyBiYXNlZCBvbiB0aGUgZXJyb3Igc2NvcmUgZm9yIHRoZSB3aG9sZSBrZiBncm91cC4KLSAgICAgICAgLy8gVGhlIHNlY29uZCAob3B0aW9uYWx5KSBvbiB0aGUga2V5IGZyYW1lcyBvd24gZXJyb3IgaWYgdGhpcyBpcyBzbWFsbGVyIHRoYW4gdGhlIGF2ZXJhZ2UgZm9yIHRoZSBncm91cC4KLSAgICAgICAgLy8gVGhlIGZpbmFsIG9uZSBpbnN1cmVzIHRoYXQgdGhlIGZyYW1lIHJlY2VpdmVzIGF0IGxlYXN0IHRoZSBhbGxvY2F0aW9uIGl0IHdvdWxkIGhhdmUgcmVjZWl2ZWQgYmFzZWQgb24gaXRzIG93biBlcnJvciBzY29yZSB2cyB0aGUgZXJyb3Igc2NvcmUgcmVtYWluaW5nCi0KLSAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPSAoKGNwaS0+ZnJhbWVzX3RvX2tleSAtIDEpICogMTAwKSArIGtmX2Jvb3N0OyAgICAgICAgICAgLy8gY3BpLT5mcmFtZXNfdG9fa2V5LTEgYmVjYXVzZSBrZXkgZnJhbWUgaXRzZWxmIGlzIHRha2VuIGNhcmUgb2YgYnkga2ZfYm9vc3QKLQotICAgICAgICAvLyBOb3JtYWxpemUgQWx0Ym9vc3QgYW5kIGFsbG9jYXRpb25zIGNodW5jayBkb3duIHRvIHByZXZlbnQgb3ZlcmZsb3cKLSAgICAgICAgd2hpbGUgKGtmX2Jvb3N0ID4gMTAwMCkKLSAgICAgICAgewotICAgICAgICAgICAga2ZfYm9vc3QgLz0gMjsKLSAgICAgICAgICAgIGFsbG9jYXRpb25fY2h1bmtzIC89IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBjcGktPmtmX2dyb3VwX2JpdHMgPSAoY3BpLT5rZl9ncm91cF9iaXRzIDwgMCkgPyAwIDogY3BpLT5rZl9ncm91cF9iaXRzOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgc3BlbnQgb24gdGhlIGtleSBmcmFtZQotICAgICAgICBjcGktPmtmX2JpdHMgID0gKGludCkoKGRvdWJsZSlrZl9ib29zdCAqICgoZG91YmxlKWNwaS0+a2ZfZ3JvdXBfYml0cyAvIChkb3VibGUpYWxsb2NhdGlvbl9jaHVua3MpKTsKLQotICAgICAgICAvLyBBcHBseSBhbiBhZGRpdGlvbmFsIGxpbWl0IGZvciBDQlIKLSAgICAgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3BpLT5rZl9iaXRzID4gKCgzICogY3BpLT5idWZmZXJfbGV2ZWwpID4+IDIpKQotICAgICAgICAgICAgICAgIGNwaS0+a2ZfYml0cyA9ICgzICogY3BpLT5idWZmZXJfbGV2ZWwpID4+IDI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUga2V5IGZyYW1lIGlzIGFjdHVhbGx5IGVhc2llciB0aGFuIHRoZSBhdmVyYWdlIGZvciB0aGUKLSAgICAgICAgLy8ga2YgZ3JvdXAgKHdoaWNoIGRvZXMgc29tZXRpbWVzIGhhcHBlbi4uLiBlZyBhIGJsYW5rIGludHJvIGZyYW1lKQotICAgICAgICAvLyBUaGVuIHVzZSBhbiBhbHRlcm5hdGUgY2FsY3VsYXRpb24gYmFzZWQgb24gdGhlIGtmIGVycm9yIHNjb3JlCi0gICAgICAgIC8vIHdoaWNoIHNob3VsZCBnaXZlIGEgc21hbGxlciBrZXkgZnJhbWUuCi0gICAgICAgIGlmIChrZl9tb2RfZXJyIDwga2ZfZ3JvdXBfZXJyIC8gY3BpLT5mcmFtZXNfdG9fa2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgIGFsdF9rZl9ncnBfYml0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSljcGktPmJpdHNfbGVmdCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGtmX21vZF9lcnIgKiAoZG91YmxlKWNwaS0+ZnJhbWVzX3RvX2tleSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgIERPVUJMRV9ESVZJREVfQ0hFQ0soY3BpLT5tb2RpZmllZF9lcnJvcl9sZWZ0KSk7Ci0KLSAgICAgICAgICAgIGFsdF9rZl9iaXRzID0gKGludCkoKGRvdWJsZSlrZl9ib29zdCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHRfa2ZfZ3JwX2JpdHMgLyAoZG91YmxlKWFsbG9jYXRpb25fY2h1bmtzKSk7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmtmX2JpdHMgPiBhbHRfa2ZfYml0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPmtmX2JpdHMgPSBhbHRfa2ZfYml0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBFbHNlIGlmIGl0IGlzIG11Y2ggaGFyZGVyIHRoYW4gb3RoZXIgZnJhbWVzIGluIHRoZSBncm91cCBtYWtlIHN1cmUKLSAgICAgICAgLy8gaXQgYXQgbGVhc3QgcmVjZWl2ZXMgYW4gYWxsb2NhdGlvbiBpbiBrZWVwaW5nIHdpdGggaXRzIHJlbGF0aXZlCi0gICAgICAgIC8vIGVycm9yIHNjb3JlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYWx0X2tmX2JpdHMgPQotICAgICAgICAgICAgICAgIChpbnQpKChkb3VibGUpY3BpLT5iaXRzX2xlZnQgKgotICAgICAgICAgICAgICAgICAgICAgIChrZl9tb2RfZXJyIC8KLSAgICAgICAgICAgICAgICAgICAgICAgRE9VQkxFX0RJVklERV9DSEVDSyhjcGktPm1vZGlmaWVkX2Vycm9yX2xlZnQpKSk7Ci0KLSAgICAgICAgICAgIGlmIChhbHRfa2ZfYml0cyA+IGNwaS0+a2ZfYml0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPmtmX2JpdHMgPSBhbHRfa2ZfYml0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNwaS0+a2ZfZ3JvdXBfYml0cyAtPSBjcGktPmtmX2JpdHM7Ci0gICAgICAgIGNwaS0+a2ZfYml0cyArPSBjcGktPm1pbl9mcmFtZV9iYW5kd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGluIHRoZSBtaW5pbXVtIGZyYW1lIGFsbG93YW5jZQotCi0gICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IGNwaS0+a2ZfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVlciBmcmFtZSBiaXQgdGFyZ2V0IGZvciB0aGlzIGZyYW1lCi0gICAgICAgIGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA9IGNwaS0+a2ZfYml0cyAqIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYSBwZXIgc2Vjb25kIGJpdHJhdGUKLSAgICB9Ci0KLSAgICAvLyBOb3RlIHRoZSB0b3RhbCBlcnJvciBzY29yZSBvZiB0aGUga2YgZ3JvdXAgbWludXMgdGhlIGtleSBmcmFtZSBpdHNlbGYKLSAgICBjcGktPmtmX2dyb3VwX2Vycm9yX2xlZnQgPSAoaW50KShrZl9ncm91cF9lcnIgLSBrZl9tb2RfZXJyKTsKLQotICAgIC8vIEFkanVzdCB0aGUgY291bnQgb2YgdG90YWwgbW9kaWZpZWQgZXJyb3IgbGVmdC4KLSAgICAvLyBUaGUgY291bnQgb2YgYml0cyBsZWZ0IGlzIGFkanVzdGVkIGVsc2V3aGVyZSBiYXNlZCBvbiByZWFsIGNvZGVkIGZyYW1lIHNpemVzCi0gICAgY3BpLT5tb2RpZmllZF9lcnJvcl9sZWZ0IC09IGtmX2dyb3VwX2VycjsKLQotICAgIGlmIChjcGktPm94Y2YuYWxsb3dfc3BhdGlhbF9yZXNhbXBsaW5nKQotICAgIHsKLSAgICAgICAgaW50IHJlc2FtcGxlX3RyaWdnZXIgPSBGQUxTRTsKLSAgICAgICAgaW50IGxhc3Rfa2ZfcmVzYW1wbGVkID0gRkFMU0U7Ci0gICAgICAgIGludCBrZl9xOwotICAgICAgICBpbnQgc2NhbGVfdmFsID0gMDsKLSAgICAgICAgaW50IGhyLCBocywgdnIsIHZzOwotICAgICAgICBpbnQgbmV3X3dpZHRoID0gY3BpLT5veGNmLldpZHRoOwotICAgICAgICBpbnQgbmV3X2hlaWdodCA9IGNwaS0+b3hjZi5IZWlnaHQ7Ci0KLSAgICAgICAgaW50IHByb2plY3RlZF9idWZmZXJfbGV2ZWwgPSBjcGktPmJ1ZmZlcl9sZXZlbDsKLSAgICAgICAgaW50IHRtcF9xOwotCi0gICAgICAgIGRvdWJsZSBwcm9qZWN0ZWRfYml0c19wZXJmcmFtZTsKLSAgICAgICAgZG91YmxlIGdyb3VwX2lpcmF0aW8gPSAoa2ZfZ3JvdXBfaW50cmFfZXJyIC0gZmlyc3RfZnJhbWUuaW50cmFfZXJyb3IpIC8gKGtmX2dyb3VwX2NvZGVkX2VyciAtIGZpcnN0X2ZyYW1lLmNvZGVkX2Vycm9yKTsKLSAgICAgICAgZG91YmxlIGVycl9wZXJfZnJhbWUgPSBrZl9ncm91cF9lcnIgLyBjcGktPmZyYW1lc190b19rZXk7Ci0gICAgICAgIGRvdWJsZSBiaXRzX3Blcl9mcmFtZTsKLSAgICAgICAgZG91YmxlIGF2X2JpdHNfcGVyX2ZyYW1lOwotICAgICAgICBkb3VibGUgZWZmZWN0aXZlX3NpemVfcmF0aW87Ci0KLSAgICAgICAgaWYgKChjcGktPmNvbW1vbi5XaWR0aCAhPSBjcGktPm94Y2YuV2lkdGgpIHx8IChjcGktPmNvbW1vbi5IZWlnaHQgIT0gY3BpLT5veGNmLkhlaWdodCkpCi0gICAgICAgICAgICBsYXN0X2tmX3Jlc2FtcGxlZCA9IFRSVUU7Ci0KLSAgICAgICAgLy8gU2V0IGJhY2sgdG8gdW5zY2FsZWQgYnkgZGVmYXVsdHMKLSAgICAgICAgY3BpLT5jb21tb24uaG9yaXpfc2NhbGUgPSBOT1JNQUw7Ci0gICAgICAgIGNwaS0+Y29tbW9uLnZlcnRfc2NhbGUgPSBOT1JNQUw7Ci0KLSAgICAgICAgLy8gQ2FsY3VsYXRlIEF2ZXJhZ2UgYml0cyBwZXIgZnJhbWUuCi0gICAgICAgIC8vYXZfYml0c19wZXJfZnJhbWUgPSBjcGktPmJpdHNfbGVmdC8oZG91YmxlKShjcGktPnRvdGFsX3N0YXRzLT5jb3VudCAtIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUpOwotICAgICAgICBhdl9iaXRzX3Blcl9mcmFtZSA9IGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+b3hjZi5mcmFtZV9yYXRlKTsKLSAgICAgICAgLy9pZiAoIGF2X2JpdHNfcGVyX2ZyYW1lIDwgMC4wICkKLSAgICAgICAgLy8gIGF2X2JpdHNfcGVyX2ZyYW1lID0gMC4wCi0KLSAgICAgICAgLy8gQ0JSLi4uIFVzZSB0aGUgY2xpcCBhdmVyYWdlIGFzIHRoZSB0YXJnZXQgZm9yIGRlY2lkaW5nIHJlc2FtcGxlCi0gICAgICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikKLSAgICAgICAgewotICAgICAgICAgICAgYml0c19wZXJfZnJhbWUgPSBhdl9iaXRzX3Blcl9mcmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluIFZCUiB3ZSB3YW50IHRvIGF2b2lkIGRvd25zYW1wbGluZyBpbiBlYXN5IHNlY3Rpb24gdW5sZXNzIHdlIGFyZSB1bmRlciBleHRyZW1lIHByZXNzdXJlCi0gICAgICAgIC8vIFNvIHVzZSB0aGUgbGFyZ2VyIG9mIHRhcmdldCBiaXRyYXRlIGZvciB0aGlzIHNlY3RvaW9uIG9yIGF2ZXJhZ2UgYml0cmF0ZSBmb3Igc2VxdWVuY2UKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiaXRzX3Blcl9mcmFtZSA9IGNwaS0+a2ZfZ3JvdXBfYml0cyAvIGNwaS0+ZnJhbWVzX3RvX2tleTsgICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIGhvdyBoYXJkIHRoZSBzZWN0aW9uIGlzLi4uCi0KLSAgICAgICAgICAgIGlmIChiaXRzX3Blcl9mcmFtZSA8IGF2X2JpdHNfcGVyX2ZyYW1lKSAgICAgICAgICAgICAgICAgICAgICAvLyBEb250IHR1cm4gdG8gcmVzYW1wbGluZyBpbiBlYXN5IHNlY3Rpb25zIGp1c3QgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHNtYWxsIG51bWJlciBvZiBiaXRzCi0gICAgICAgICAgICAgICAgYml0c19wZXJfZnJhbWUgPSBhdl9iaXRzX3Blcl9mcmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJpdHNfcGVyX2ZyYW1lIHNob3VsZCBjb21wbHkgd2l0aCBvdXIgbWluaW11bQotICAgICAgICBpZiAoYml0c19wZXJfZnJhbWUgPCAoY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggKiBjcGktPm94Y2YudHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gLyAxMDApKQotICAgICAgICAgICAgYml0c19wZXJfZnJhbWUgPSAoY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggKiBjcGktPm94Y2YudHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gLyAxMDApOwotCi0gICAgICAgIC8vIFdvcmsgb3V0IGlmIHNwYXRpYWwgcmVzYW1wbGluZyBpcyBuZWNlc3NhcnkKLSAgICAgICAga2ZfcSA9IGVzdGltYXRlX2tmX2dyb3VwX3EoY3BpLCBlcnJfcGVyX2ZyYW1lLCBiaXRzX3Blcl9mcmFtZSwgZ3JvdXBfaWlyYXRpbyk7Ci0KLSAgICAgICAgLy8gSWYgd2UgcHJvamVjdCBhIHJlcXVpcmVkIFEgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCBRIHRoZW4gbWFrZSBhIGd1ZXNzIGF0IHRoZSBhY3R1YWwgc2l6ZSBvZiBmcmFtZXMgaW4gdGhpcyBzZWN0aW9uCi0gICAgICAgIHByb2plY3RlZF9iaXRzX3BlcmZyYW1lID0gYml0c19wZXJfZnJhbWU7Ci0gICAgICAgIHRtcF9xID0ga2ZfcTsKLQotICAgICAgICB3aGlsZSAodG1wX3EgPiBjcGktPndvcnN0X3F1YWxpdHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2plY3RlZF9iaXRzX3BlcmZyYW1lICo9IDEuMDQ7Ci0gICAgICAgICAgICB0bXBfcS0tOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR3Vlc3MgYXQgYnVmZmVyIGxldmVsIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24KLSAgICAgICAgcHJvamVjdGVkX2J1ZmZlcl9sZXZlbCA9IGNwaS0+YnVmZmVyX2xldmVsIC0gKGludCkoKHByb2plY3RlZF9iaXRzX3BlcmZyYW1lIC0gYXZfYml0c19wZXJfZnJhbWUpICogY3BpLT5mcmFtZXNfdG9fa2V5KTsKLQotICAgICAgICBpZiAoMCkKLSAgICAgICAgewotICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJTdWJzYW1sZS5zdHQiLCAiYSIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiICU4ZCAlOGQgJThkICU4ZCAlMTIuMGYgJThkICU4ZCAlOGRcbiIsICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBrZl9xLCBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwgY3BpLT5jb21tb24udmVydF9zY2FsZSwgIGtmX2dyb3VwX2VyciAvIGNwaS0+ZnJhbWVzX3RvX2tleSwgKGludCkoY3BpLT5rZl9ncm91cF9iaXRzIC8gY3BpLT5mcmFtZXNfdG9fa2V5KSwgbmV3X2hlaWdodCwgbmV3X3dpZHRoKTsKLSAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSB0cmlnZ2VyIGZvciBzcGF0aWFsIHJlc2FtcGxpbmcgZGVwZW5kcyBvbiB0aGUgdmFyaW91cyBwYXJhbWV0ZXJzIHN1Y2ggYXMgd2hldGhlciB3ZSBhcmUgc3RyZWFtaW5nIChDQlIpIG9yIFZCUi4KLSAgICAgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcmlnZ2VyIHJlc2FtcGxlIGlmIHdlIGFyZSBwcm9qZWN0ZWQgdG8gZmFsbCBiZWxvdyBkb3duIHNhbXBsZSBsZXZlbCBvcgotICAgICAgICAgICAgLy8gcmVzYW1wbGVkIGxhc3QgdGltZSBhbmQgYXJlIHByb2plY3RlZCB0byByZW1haW4gYmVsb3cgdGhlIHVwIHNhbXBsZSBsZXZlbAotICAgICAgICAgICAgaWYgKChwcm9qZWN0ZWRfYnVmZmVyX2xldmVsIDwgKGNwaS0+b3hjZi5yZXNhbXBsZV9kb3duX3dhdGVyX21hcmsgKiBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgLyAxMDApKSB8fAotICAgICAgICAgICAgICAgIChsYXN0X2tmX3Jlc2FtcGxlZCAmJiAocHJvamVjdGVkX2J1ZmZlcl9sZXZlbCA8IChjcGktPm94Y2YucmVzYW1wbGVfdXBfd2F0ZXJfbWFyayAqIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMCkpKSkKLSAgICAgICAgICAgICAgICAvLyggKChjcGktPmJ1ZmZlcl9sZXZlbCA8IChjcGktPm94Y2YucmVzYW1wbGVfZG93bl93YXRlcl9tYXJrICogY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKSkpICYmCi0gICAgICAgICAgICAgICAgLy8gICgocHJvamVjdGVkX2J1ZmZlcl9sZXZlbCA8IChjcGktPm94Y2YucmVzYW1wbGVfdXBfd2F0ZXJfbWFyayAqIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMCkpKSApKQotICAgICAgICAgICAgICAgIHJlc2FtcGxlX3RyaWdnZXIgPSBUUlVFOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc2FtcGxlX3RyaWdnZXIgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbG9uZyBjbGlwX2JpdHMgPSAobG9uZyBsb25nKShjcGktPnRvdGFsX3N0YXRzLT5jb3VudCAqIGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gRE9VQkxFX0RJVklERV9DSEVDSygoZG91YmxlKWNwaS0+b3hjZi5mcmFtZV9yYXRlKSk7Ci0gICAgICAgICAgICBsb25nIGxvbmcgb3Zlcl9zcGVuZCA9IGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwgLSBjcGktPmJ1ZmZlcl9sZXZlbDsKLSAgICAgICAgICAgIGxvbmcgbG9uZyBvdmVyX3NwZW5kMiA9IGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwgLSBwcm9qZWN0ZWRfYnVmZmVyX2xldmVsOwotCi0gICAgICAgICAgICBpZiAoKGxhc3Rfa2ZfcmVzYW1wbGVkICYmIChrZl9xID4gY3BpLT53b3JzdF9xdWFsaXR5KSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRyaWdnZXJlZCBsYXN0IHRpbWUgdGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZyBhZ2FpbiBpcyByZWR1Y2VkCi0gICAgICAgICAgICAgICAgKChrZl9xID4gY3BpLT53b3JzdF9xdWFsaXR5KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2plY3RlZCBRIGhpZ2hlciB0aGFuIGFsbG93ZWQgYW5kIC4uLgotICAgICAgICAgICAgICAgICAob3Zlcl9zcGVuZCA+IGNsaXBfYml0cyAvIDIwKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uIE92ZXJzcGVuZCA+IDUlIG9mIHRvdGFsIGJpdHMKLSAgICAgICAgICAgICAgICByZXNhbXBsZV90cmlnZ2VyID0gVFJVRTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXNhbXBsZV90cmlnZ2VyID0gRkFMU0U7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNhbXBsZV90cmlnZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoKGtmX3EgPj0gY3BpLT53b3JzdF9xdWFsaXR5KSAmJiAoc2NhbGVfdmFsIDwgNikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2NhbGVfdmFsICsrOwotCi0gICAgICAgICAgICAgICAgY3BpLT5jb21tb24udmVydF9zY2FsZSAgID0gdnNjYWxlX2xvb2t1cFtzY2FsZV92YWxdOwotICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmhvcml6X3NjYWxlICA9IGhzY2FsZV9sb29rdXBbc2NhbGVfdmFsXTsKLQotICAgICAgICAgICAgICAgIFNjYWxlMlJhdGlvKGNwaS0+Y29tbW9uLmhvcml6X3NjYWxlLCAmaHIsICZocyk7Ci0gICAgICAgICAgICAgICAgU2NhbGUyUmF0aW8oY3BpLT5jb21tb24udmVydF9zY2FsZSwgJnZyLCAmdnMpOwotCi0gICAgICAgICAgICAgICAgbmV3X3dpZHRoID0gKChocyAtIDEpICsgKGNwaS0+b3hjZi5XaWR0aCAqIGhyKSkgLyBoczsKLSAgICAgICAgICAgICAgICBuZXdfaGVpZ2h0ID0gKCh2cyAtIDEpICsgKGNwaS0+b3hjZi5IZWlnaHQgKiB2cikpIC8gdnM7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWR1Y2luZyB0aGUgYXJlYSB0byAxLzQgZG9lcyBub3QgcmVkdWNlIHRoZSBjb21wbGV4aXR5IChlcnJfcGVyX2ZyYW1lKSB0byAxLzQuLi4KLSAgICAgICAgICAgICAgICAvLyBlZmZlY3RpdmVfc2l6ZXJhdGlvIGF0dGVtcHRzIHRvIHByb3ZpZGUgYSBjcnVkZSBjb3JyZWN0aW9uIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgZWZmZWN0aXZlX3NpemVfcmF0aW8gPSAoZG91YmxlKShuZXdfd2lkdGggKiBuZXdfaGVpZ2h0KSAvIChkb3VibGUpKGNwaS0+b3hjZi5XaWR0aCAqIGNwaS0+b3hjZi5IZWlnaHQpOwotICAgICAgICAgICAgICAgIGVmZmVjdGl2ZV9zaXplX3JhdGlvID0gKDEuMCArICgzLjAgKiBlZmZlY3RpdmVfc2l6ZV9yYXRpbykpIC8gNC4wOwotCi0gICAgICAgICAgICAgICAgLy8gTm93IHRyeSBhZ2FpbiBhbmQgc2VlIHdoYXQgUSB3ZSBnZXQgd2l0aCB0aGUgc21hbGxlciBpbWFnZSBzaXplCi0gICAgICAgICAgICAgICAga2ZfcSA9IGVzdGltYXRlX2tmX2dyb3VwX3EoY3BpLCBlcnJfcGVyX2ZyYW1lICogZWZmZWN0aXZlX3NpemVfcmF0aW8sIGJpdHNfcGVyX2ZyYW1lLCBncm91cF9paXJhdGlvKTsKLQotICAgICAgICAgICAgICAgIGlmICgwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJTdWJzYW1sZS5zdHQiLCAiYSIpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIqKioqKioqKiAlOGQgJThkICU4ZCAlMTIuMGYgJThkICU4ZCAlOGRcbiIsICBrZl9xLCBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwgY3BpLT5jb21tb24udmVydF9zY2FsZSwgIGtmX2dyb3VwX2VyciAvIGNwaS0+ZnJhbWVzX3RvX2tleSwgKGludCkoY3BpLT5rZl9ncm91cF9iaXRzIC8gY3BpLT5mcmFtZXNfdG9fa2V5KSwgbmV3X2hlaWdodCwgbmV3X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoY3BpLT5jb21tb24uV2lkdGggIT0gbmV3X3dpZHRoKSB8fCAoY3BpLT5jb21tb24uSGVpZ2h0ICE9IG5ld19oZWlnaHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmNvbW1vbi5XaWR0aCA9IG5ld193aWR0aDsKLSAgICAgICAgICAgIGNwaS0+Y29tbW9uLkhlaWdodCA9IG5ld19oZWlnaHQ7Ci0gICAgICAgICAgICB2cDhfYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9nZW5lcmljL2NzeXN0ZW1kZXBlbmRlbnQuYyBiL3ZwOC9lbmNvZGVyL2dlbmVyaWMvY3N5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDY3MmJlLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL2dlbmVyaWMvY3N5c3RlbWRlcGVuZGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9lbmNvZGVyL3ZhcmlhbmNlLmgiCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvb255eF9pbnQuaCIKLQotCi12b2lkIHZwOF9hcmNoX3g4Nl9lbmNvZGVyX2luaXQoVlA4X0NPTVAgKmNwaSk7Ci12b2lkIHZwOF9hcmNoX2FybV9lbmNvZGVyX2luaXQoVlA4X0NPTVAgKmNwaSk7Ci0KLWV4dGVybiB2b2lkIHZwOF9mYXN0X3F1YW50aXplX2JfYyhCTE9DSyAqYiwgQkxPQ0tEICpkKTsKLQotdm9pZCAoKnZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZV9wdHIpKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjLCBpbnQgRnJhY3Rpb24pOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9wYXJ0aWFsX2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjLCBpbnQgRnJhY3Rpb24pOwotCi12b2lkIHZwOF9jbWFjaGluZV9zcGVjaWZpY19jb25maWcoVlA4X0NPTVAgKmNwaSkKLXsKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgY3BpLT5ydGNkLmNvbW1vbiAgICAgICAgICAgICAgICAgICAgPSAmY3BpLT5jb21tb24ucnRjZDsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4MTYgICAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDggICAgICAgICAgICAgICA9IHZwOF9zYWQxNng4X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4MTYgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDE2X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4OCAgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDhfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkNHg0ICAgICAgICAgICAgICAgID0gdnA4X3NhZDR4NF9jOwotCi0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDE2eDMgICAgICAgICAgICA9IHZwOF9zYWQxNngxNngzX2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDh4MyAgICAgICAgICAgICA9IHZwOF9zYWQxNng4eDNfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkOHgxNngzICAgICAgICAgICAgID0gdnA4X3NhZDh4MTZ4M19jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDh4MyAgICAgICAgICAgICAgPSB2cDhfc2FkOHg4eDNfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkNHg0eDMgICAgICAgICAgICAgID0gdnA4X3NhZDR4NHgzX2M7Ci0KLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4MTZ4OCAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2eDhfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4OHg4ICAgICAgICAgICAgID0gdnA4X3NhZDE2eDh4OF9jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDE2eDggICAgICAgICAgICAgPSB2cDhfc2FkOHgxNng4X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4OHg4ICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDh4OF9jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ0eDR4OCAgICAgICAgICAgICAgPSB2cDhfc2FkNHg0eDhfYzsKLQotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQxNngxNng0ZCAgICAgICAgICAgPSB2cDhfc2FkMTZ4MTZ4NGRfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4OHg0ZCAgICAgICAgICAgID0gdnA4X3NhZDE2eDh4NGRfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkOHgxNng0ZCAgICAgICAgICAgID0gdnA4X3NhZDh4MTZ4NGRfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkOHg4eDRkICAgICAgICAgICAgID0gdnA4X3NhZDh4OHg0ZF9jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ0eDR4NGQgICAgICAgICAgICAgPSB2cDhfc2FkNHg0eDRkX2M7Ci0KLSAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyNHg0ICAgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlNHg0X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnZhcjh4OCAgICAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTh4OF9jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXI4eDE2ICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U4eDE2X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnZhcjE2eDggICAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTE2eDhfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyMTZ4MTYgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlMTZ4MTZfYzsKLQotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXI0eDQgICAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjh4OCAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyOHgxNiAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyMTZ4OCAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyMTZ4MTYgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl9oICAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5oYWxmcGl4dmFyMTZ4MTZfdiAgICAgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2UuaGFsZnBpeHZhcjE2eDE2X2h2ICAgID0gdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9jOwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXhtc2UxNngxNiAgICAgICAgPSB2cDhfc3ViX3BpeGVsX21zZTE2eDE2X2M7Ci0KLSAgICBjcGktPnJ0Y2QudmFyaWFuY2UubXNlMTZ4MTYgICAgICAgICAgICAgID0gdnA4X21zZTE2eDE2X2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldG1ic3MgICAgICAgICAgICAgICA9IHZwOF9nZXRfbWJfc3NfYzsKLQotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5nZXQxNngxNnByZWRlcnJvciAgICAgPSB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX2M7Ci0gICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDh4OHZhciAgICAgICAgICAgICA9IHZwOF9nZXQ4eDh2YXJfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0MTZ4MTZ2YXIgICAgICAgICAgID0gdnA4X2dldDE2eDE2dmFyX2M7OwotICAgIGNwaS0+cnRjZC52YXJpYW5jZS5nZXQ0eDRzc2VfY3MgICAgICAgICAgPSB2cDhfZ2V0NHg0c3NlX2NzX2M7Ci0KLSAgICBjcGktPnJ0Y2QuZmRjdC5zaG9ydDR4NCAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfYzsKLSAgICBjcGktPnJ0Y2QuZmRjdC5zaG9ydDh4NCAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q4eDRfYzsKLSAgICBjcGktPnJ0Y2QuZmRjdC5mYXN0NHg0ICAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfYzsKLSAgICBjcGktPnJ0Y2QuZmRjdC5mYXN0OHg0ICAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q4eDRfYzsKLSAgICBjcGktPnJ0Y2QuZmRjdC53YWxzaF9zaG9ydDR4NCAgICAgICAgICAgID0gdnA4X3Nob3J0X3dhbHNoNHg0X2M7Ci0KLSAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuYmVyciAgICAgICAgICAgICAgICAgID0gdnA4X2Jsb2NrX2Vycm9yX2M7Ci0gICAgY3BpLT5ydGNkLmVuY29kZW1iLm1iZXJyICAgICAgICAgICAgICAgICA9IHZwOF9tYmJsb2NrX2Vycm9yX2M7Ci0gICAgY3BpLT5ydGNkLmVuY29kZW1iLm1idXZlcnIgICAgICAgICAgICAgICA9IHZwOF9tYnV2ZXJyb3JfYzsKLSAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuc3ViYiAgICAgICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X2JfYzsKLSAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuc3VibWJ5ICAgICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X21ieV9jOwotICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5zdWJtYnV2ICAgICAgICAgICAgICAgPSB2cDhfc3VidHJhY3RfbWJ1dl9jOwotCi0gICAgY3BpLT5ydGNkLnF1YW50aXplLnF1YW50YiAgICAgICAgICAgICAgICA9IHZwOF9yZWd1bGFyX3F1YW50aXplX2I7Ci0gICAgY3BpLT5ydGNkLnF1YW50aXplLmZhc3RxdWFudGIgICAgICAgICAgICA9IHZwOF9mYXN0X3F1YW50aXplX2JfYzsKLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotICAgIGNwaS0+cnRjZC5zZWFyY2guZnVsbF9zZWFyY2ggICAgICAgICAgICAgPSB2cDhfZnVsbF9zZWFyY2hfc2FkOwotI2VuZGlmCi0gICAgY3BpLT5ydGNkLnNlYXJjaC5kaWFtb25kX3NlYXJjaCAgICAgICAgICA9IHZwOF9kaWFtb25kX3NlYXJjaF9zYWQ7Ci0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICBjcGktPnJ0Y2QudGVtcG9yYWwuYXBwbHkgICAgICAgICAgICAgICAgID0gdnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9jOwotI2VuZGlmCi0jZW5kaWYKLQotICAgIC8vIFB1cmUgQzoKLSAgICB2cDhfeXYxMl9jb3B5X3BhcnRpYWxfZnJhbWVfcHRyID0gdnA4X3l2MTJfY29weV9wYXJ0aWFsX2ZyYW1lOwotCi0jaWYgQ09ORklHX1BTTlIKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3NpbXBmXzh4OCAgICAgICAgICAgID0gc3NpbV9wYXJtc184eDhfYzsKLSAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3NpbXBmICAgICAgICAgICAgICAgID0gc3NpbV9wYXJtc19jOwotI2VuZGlmCi0KLSNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAotICAgIHZwOF9hcmNoX3g4Nl9lbmNvZGVyX2luaXQoY3BpKTsKLSNlbmRpZgotCi0jaWYgQVJDSF9BUk0KLSAgICB2cDhfYXJjaF9hcm1fZW5jb2Rlcl9pbml0KGNwaSk7Ci0jZW5kaWYKLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvbWNvbXAuYyBiL3ZwOC9lbmNvZGVyL21jb21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjY0MmIuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvbWNvbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NTkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJtY29tcC5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi1zdGF0aWMgaW50IG12X3JlZl9jdCBbMzFdIFs0XSBbMl07Ci1zdGF0aWMgaW50IG12X21vZGVfY3RzIFs0XSBbMl07Ci0jZW5kaWYKLQotc3RhdGljIGludCBtdl9iaXRzX3NhZGNvc3RbMjU2XTsKLQotdm9pZCB2cDhjeF9pbml0X212X2JpdHNfc2FkY29zdCgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgewotICAgICAgICBtdl9iaXRzX3NhZGNvc3RbaV0gPSAoaW50KXNxcnQoaSAqIDE2KTsKLSAgICB9Ci19Ci0KLQotaW50IHZwOF9tdl9iaXRfY29zdChNViAqbXYsIE1WICpyZWYsIGludCAqbXZjb3N0WzJdLCBpbnQgV2VpZ2h0KQotewotICAgIC8vIE1WIGNvc3RpbmcgaXMgYmFzZWQgb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiB2ZWN0b3JzIGluIHRoZSBwcmV2aW91cyBmcmFtZSBhbmQgYXMgc3VjaCB3aWxsIHRlbmQgdG8KLSAgICAvLyBvdmVyIHN0YXRlIHRoZSBjb3N0IG9mIHZlY3RvcnMuIEluIGFkZGl0aW9uIGNvZGluZyBhIG5ldyB2ZWN0b3IgY2FuIGhhdmUgYSBrbm9jayBvbiBlZmZlY3Qgb24gdGhlCi0gICAgLy8gY29zdCBvZiBzdWJzZXF1ZW50IHZlY3RvcnMgYW5kIHRoZSBxdWFsaXR5IG9mIHByZWRpY3Rpb24gZnJvbSBORUFSIGFuZCBORUFSRVNUIGZvciBzdWJzZXF1ZW50IGJsb2Nrcy4KLSAgICAvLyBUaGUgIldlaWdodCIgcGFyYW1ldGVyIGFsbG93cywgdG8gYSBsaW1pdGVkIGV4dGVudCwgZm9yIHNvbWUgYWNjb3VudCB0byBiZSB0YWtlbiBvZiB0aGVzZSBmYWN0b3JzLgotICAgIHJldHVybiAoKG12Y29zdFswXVsobXYtPnJvdyAtIHJlZi0+cm93KSA+PiAxXSArIG12Y29zdFsxXVsobXYtPmNvbCAtIHJlZi0+Y29sKSA+PiAxXSkgKiBXZWlnaHQpID4+IDc7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfZXJyX2Nvc3QoTVYgKm12LCBNViAqcmVmLCBpbnQgKm12Y29zdFsyXSwgaW50IGVycm9yX3Blcl9iaXQpCi17Ci0gICAgLy9pbnQgaTsKLSAgICAvL3JldHVybiAoKG12Y29zdFswXVsobXYtPnJvdyAtIHJlZi0+cm93KT4+MV0gKyBtdmNvc3RbMV1bKG12LT5jb2wgLSByZWYtPmNvbCk+PjFdICsgMTI4KSAqIGVycm9yX3Blcl9iaXQpID4+IDg7Ci0gICAgLy9yZXR1cm4gKCAodnA4X212X2JpdF9jb3N0KG12LCAgcmVmLCBtdmNvc3QsIDEwMCkgKyAxMjgpICogZXJyb3JfcGVyX2JpdCkgPj4gODsKLQotICAgIC8vaSA9ICh2cDhfbXZfYml0X2Nvc3QobXYsICByZWYsIG12Y29zdCwgMTAwKSAqIGVycm9yX3Blcl9iaXQgKyAxMjgpID4+IDg7Ci0gICAgcmV0dXJuICgobXZjb3N0WzBdWyhtdi0+cm93IC0gcmVmLT5yb3cpID4+IDFdICsgbXZjb3N0WzFdWyhtdi0+Y29sIC0gcmVmLT5jb2wpID4+IDFdKSAqIGVycm9yX3Blcl9iaXQgKyAxMjgpID4+IDg7Ci0gICAgLy9yZXR1cm4gKHZwOF9tdl9iaXRfY29zdChtdiwgIHJlZiwgbXZjb3N0LCAxMjgpICogZXJyb3JfcGVyX2JpdCArIDEyOCkgPj4gODsKLX0KLQotCi1zdGF0aWMgaW50IG12X2JpdHMoTVYgKm12LCBNViAqcmVmLCBpbnQgKm12Y29zdFsyXSkKLXsKLSAgICAvLyBnZXQgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgYml0cyBmb3IgYSBtb3Rpb24gdmVjdG9yLCB0byBiZSB1c2VkIGZvciBjb3N0aW5nIGluIFNBRCBiYXNlZAotICAgIC8vIG1vdGlvbiBlc3RpbWF0aW9uCi0gICAgcmV0dXJuICgobXZjb3N0WzBdWyhtdi0+cm93IC0gcmVmLT5yb3cpID4+IDFdICArICBtdmNvc3RbMV1bKG12LT5jb2wgLSByZWYtPmNvbCk+PiAxXSkgKyAxMjgpID4+IDg7Ci19Ci0KLXZvaWQgdnA4X2luaXRfZHNtb3Rpb25fY29tcGVuc2F0aW9uKE1BQ1JPQkxPQ0sgKngsIGludCBzdHJpZGUpCi17Ci0gICAgaW50IExlbjsKLSAgICBpbnQgc2VhcmNoX3NpdGVfY291bnQgPSAwOwotCi0KLSAgICAvLyBHZW5lcmF0ZSBvZmZzZXRzIGZvciA0IHNlYXJjaCBzaXRlcyBwZXIgc3RlcC4KLSAgICBMZW4gPSBNQVhfRklSU1RfU1RFUDsKLSAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gMDsKLSAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gMDsKLSAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gMDsKLSAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOwotCi0gICAgd2hpbGUgKExlbiA+IDApCi0gICAgewotCi0gICAgICAgIC8vIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLgotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gMDsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IC1MZW47Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSAtTGVuICogc3RyaWRlOwotICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOwotCi0gICAgICAgIC8vIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLgotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gMDsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IExlbjsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IExlbiAqIHN0cmlkZTsKLSAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKLQotICAgICAgICAvLyBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4KLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IC1MZW47Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSAwOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gLUxlbjsKLSAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKLQotICAgICAgICAvLyBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4KLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IExlbjsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IDA7Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSBMZW47Ci0gICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7Ci0KLSAgICAgICAgLy8gQ29udHJhY3QuCi0gICAgICAgIExlbiAvPSAyOwotICAgIH0KLQotICAgIHgtPnNzX2NvdW50ID0gc2VhcmNoX3NpdGVfY291bnQ7Ci0gICAgeC0+c2VhcmNoZXNfcGVyX3N0ZXAgPSA0OwotfQotCi12b2lkIHZwOF9pbml0M3Ntb3Rpb25fY29tcGVuc2F0aW9uKE1BQ1JPQkxPQ0sgKngsIGludCBzdHJpZGUpCi17Ci0gICAgaW50IExlbjsKLSAgICBpbnQgc2VhcmNoX3NpdGVfY291bnQgPSAwOwotCi0gICAgLy8gR2VuZXJhdGUgb2Zmc2V0cyBmb3IgOCBzZWFyY2ggc2l0ZXMgcGVyIHN0ZXAuCi0gICAgTGVuID0gTUFYX0ZJUlNUX1NURVA7Ci0gICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IDA7Ci0gICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IDA7Ci0gICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IDA7Ci0gICAgc2VhcmNoX3NpdGVfY291bnQrKzsKLQotICAgIHdoaWxlIChMZW4gPiAwKQotICAgIHsKLQotICAgICAgICAvLyBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4KLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IDA7Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSAtTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gLUxlbiAqIHN0cmlkZTsKLSAgICAgICAgc2VhcmNoX3NpdGVfY291bnQrKzsKLQotICAgICAgICAvLyBDb21wdXRlIG9mZnNldHMgZm9yIHNlYXJjaCBzaXRlcy4KLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LmNvbCA9IDA7Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSBMZW47Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSBMZW4gKiBzdHJpZGU7Ci0gICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuCi0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSAtTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gMDsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IC1MZW47Ci0gICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuCi0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSBMZW47Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5yb3cgPSAwOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gTGVuOwotICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOwotCi0gICAgICAgIC8vIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLgotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gLUxlbjsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm12LnJvdyA9IC1MZW47Ci0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5vZmZzZXQgPSAtTGVuICogc3RyaWRlIC0gTGVuOwotICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOwotCi0gICAgICAgIC8vIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLgotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gLUxlbjsKLSAgICAgICAgeC0+c3Nbc2VhcmNoX3NpdGVfY291bnRdLm9mZnNldCA9IC1MZW4gKiBzdHJpZGUgKyBMZW47Ci0gICAgICAgIHNlYXJjaF9zaXRlX2NvdW50Kys7Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSBvZmZzZXRzIGZvciBzZWFyY2ggc2l0ZXMuCi0gICAgICAgIHgtPnNzW3NlYXJjaF9zaXRlX2NvdW50XS5tdi5jb2wgPSAtTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gTGVuICogc3RyaWRlIC0gTGVuOwotICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOwotCi0gICAgICAgIC8vIENvbXB1dGUgb2Zmc2V0cyBmb3Igc2VhcmNoIHNpdGVzLgotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYuY29sID0gTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ubXYucm93ID0gTGVuOwotICAgICAgICB4LT5zc1tzZWFyY2hfc2l0ZV9jb3VudF0ub2Zmc2V0ID0gTGVuICogc3RyaWRlICsgTGVuOwotICAgICAgICBzZWFyY2hfc2l0ZV9jb3VudCsrOwotCi0KLSAgICAgICAgLy8gQ29udHJhY3QuCi0gICAgICAgIExlbiAvPSAyOwotICAgIH0KLQotICAgIHgtPnNzX2NvdW50ID0gc2VhcmNoX3NpdGVfY291bnQ7Ci0gICAgeC0+c2VhcmNoZXNfcGVyX3N0ZXAgPSA4OwotfQotCi0KLSNkZWZpbmUgTVZDKHIsYykgKCgobXZjb3N0WzBdWyhyKS1ycl0gKyBtdmNvc3RbMV1bKGMpIC0gcmNdKSAqIGVycm9yX3Blcl9iaXQgKyAxMjggKT4+OCApIC8vIGVzdGltYXRlZCBjb3N0IG9mIGEgbW90aW9uIHZlY3RvciAocixjKQotI2RlZmluZSBQUkUocixjKSAoKihkLT5iYXNlX3ByZSkgKyBkLT5wcmUgKyAoKHIpPj4yKSAqIGQtPnByZV9zdHJpZGUgKyAoKGMpPj4yKSkgLy8gcG9pbnRlciB0byBwcmVkaWN0b3IgYmFzZSBvZiBhIG1vdGlvbnZlY3RvcgotI2RlZmluZSBTUCh4KSAoKCh4KSYzKTw8MSkgLy8gY29udmVydCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCB0byBvZmZzZXQgZm9yIHN2ZiBjYWxjCi0jZGVmaW5lIERJU1QocixjKSB2ZnAtPnN2ZiggUFJFKHIsYyksIGQtPnByZV9zdHJpZGUsIFNQKGMpLFNQKHIpLCB6LGItPnNyY19zdHJpZGUsJnNzZSkgLy8gcmV0dXJucyBzdWJwaXhlbCB2YXJpYW5jZSBlcnJvciBmdW5jdGlvbi4KLSNkZWZpbmUgSUZNVkNWKHIsYyxzLGUpIGlmICggYyA+PSBtaW5jICYmIGMgPD0gbWF4YyAmJiByID49IG1pbnIgJiYgciA8PSBtYXhyKSBzIGVsc2UgZTsKLSNkZWZpbmUgRVJSKHIsYykgKE1WQyhyLGMpK0RJU1QocixjKSkgLy8gcmV0dXJucyBkaXN0b3J0aW9uICsgbW90aW9uIHZlY3RvciBjb3N0Ci0jZGVmaW5lIENIRUNLX0JFVFRFUih2LHIsYykgSUZNVkNWKHIsYyx7aWYoKHYgPSBFUlIocixjKSkgPCBiZXN0ZXJyKSB7IGJlc3RlcnIgPSB2OyBicj1yOyBiYz1jOyB9fSwgdj1JTlRfTUFYOykvLyBjaGVja3MgaWYgKHIsYykgaGFzIGJldHRlciBzY29yZSB0aGFuIHByZXZpb3VzIGJlc3QKLSNkZWZpbmUgTUlOKHgseSkgKCgoeCk8KHkpKT8oeCk6KHkpKQotI2RlZmluZSBNQVgoeCx5KSAoKCh4KT4oeSkpPyh4KTooeSkpCi0KLS8vI2RlZmluZSBDSEVDS19CRVRURVIodixyLGMpIGlmKCh2ID0gRVJSKHIsYykpIDwgYmVzdGVycikgeyBiZXN0ZXJyID0gdjsgYnI9cjsgYmM9YzsgfQotCi1pbnQgdnA4X2ZpbmRfYmVzdF9zdWJfcGl4ZWxfc3RlcF9pdGVyYXRpdmVseShNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBNViAqYmVzdG12LCBNViAqcmVmX212LCBpbnQgZXJyb3JfcGVyX2JpdCwgY29uc3QgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICp2ZnAsIGludCAqbXZjb3N0WzJdKQotewotICAgIHVuc2lnbmVkIGNoYXIgKnkgPSAqKGQtPmJhc2VfcHJlKSArIGQtPnByZSArIChiZXN0bXYtPnJvdykgKiBkLT5wcmVfc3RyaWRlICsgYmVzdG12LT5jb2w7Ci0gICAgdW5zaWduZWQgY2hhciAqeiA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7Ci0KLSAgICBpbnQgcnIgPSByZWZfbXYtPnJvdyA+PiAxLCByYyA9IHJlZl9tdi0+Y29sID4+IDE7Ci0gICAgaW50IGJyID0gYmVzdG12LT5yb3cgPDwgMiwgYmMgPSBiZXN0bXYtPmNvbCA8PCAyOwotICAgIGludCB0ciA9IGJyLCB0YyA9IGJjOwotICAgIHVuc2lnbmVkIGludCBiZXN0ZXJyID0gSU5UX01BWDsKLSAgICB1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQsIHVwLCBkb3duLCBkaWFnOwotICAgIHVuc2lnbmVkIGludCBzc2U7Ci0gICAgdW5zaWduZWQgaW50IHdoaWNoZGlyOwotICAgIHVuc2lnbmVkIGludCBoYWxmaXRlcnMgPSA0OwotICAgIHVuc2lnbmVkIGludCBxdWFydGVyaXRlcnMgPSA0OwotCi0gICAgaW50IG1pbmMgPSBNQVgoeC0+bXZfY29sX21pbiA8PCAyLCAocmVmX212LT5jb2wgPj4gMSkgLSAoKDEgPDwgbXZsb25nX3dpZHRoKSAtIDEpKTsKLSAgICBpbnQgbWF4YyA9IE1JTih4LT5tdl9jb2xfbWF4IDw8IDIsIChyZWZfbXYtPmNvbCA+PiAxKSArICgoMSA8PCBtdmxvbmdfd2lkdGgpIC0gMSkpOwotICAgIGludCBtaW5yID0gTUFYKHgtPm12X3Jvd19taW4gPDwgMiwgKHJlZl9tdi0+cm93ID4+IDEpIC0gKCgxIDw8IG12bG9uZ193aWR0aCkgLSAxKSk7Ci0gICAgaW50IG1heHIgPSBNSU4oeC0+bXZfcm93X21heCA8PCAyLCAocmVmX212LT5yb3cgPj4gMSkgKyAoKDEgPDwgbXZsb25nX3dpZHRoKSAtIDEpKTsKLQotICAgIC8vIGNlbnRyYWwgbXYKLSAgICBiZXN0bXYtPnJvdyA8PD0gMzsKLSAgICBiZXN0bXYtPmNvbCA8PD0gMzsKLQotICAgIC8vIGNhbGN1bGF0ZSBjZW50cmFsIHBvaW50IGVycm9yCi0gICAgYmVzdGVyciA9IHZmcC0+dmYoeSwgZC0+cHJlX3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgYmVzdGVyciArPSBtdl9lcnJfY29zdChiZXN0bXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgIC8vIFRPRE86IEVhY2ggc3Vic2VxdWVudCBpdGVyYXRpb24gY2hlY2tzIGF0IGxlYXN0IG9uZSBwb2ludCBpbiBjb21tb24gd2l0aCB0aGUgbGFzdCBpdGVyYXRpb24gY291bGQgYmUgMiAoIGlmIGRpYWcgc2VsZWN0ZWQpCi0gICAgd2hpbGUgKC0taGFsZml0ZXJzKQotICAgIHsKLSAgICAgICAgLy8gMS8yIHBlbAotICAgICAgICBDSEVDS19CRVRURVIobGVmdCwgdHIsIHRjIC0gMik7Ci0gICAgICAgIENIRUNLX0JFVFRFUihyaWdodCwgdHIsIHRjICsgMik7Ci0gICAgICAgIENIRUNLX0JFVFRFUih1cCwgdHIgLSAyLCB0Yyk7Ci0gICAgICAgIENIRUNLX0JFVFRFUihkb3duLCB0ciArIDIsIHRjKTsKLQotICAgICAgICB3aGljaGRpciA9IChsZWZ0IDwgcmlnaHQgPyAwIDogMSkgKyAodXAgPCBkb3duID8gMCA6IDIpOwotCi0gICAgICAgIHN3aXRjaCAod2hpY2hkaXIpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSKGRpYWcsIHRyIC0gMiwgdGMgLSAyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBDSEVDS19CRVRURVIoZGlhZywgdHIgLSAyLCB0YyArIDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIENIRUNLX0JFVFRFUihkaWFnLCB0ciArIDIsIHRjIC0gMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSKGRpYWcsIHRyICsgMiwgdGMgKyAyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm8gcmVhc29uIHRvIGNoZWNrIHRoZSBzYW1lIG9uZSBhZ2Fpbi4KLSAgICAgICAgaWYgKHRyID09IGJyICYmIHRjID09IGJjKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdHIgPSBicjsKLSAgICAgICAgdGMgPSBiYzsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBFYWNoIHN1YnNlcXVlbnQgaXRlcmF0aW9uIGNoZWNrcyBhdCBsZWFzdCBvbmUgcG9pbnQgaW4gY29tbW9uIHdpdGggdGhlIGxhc3QgaXRlcmF0aW9uIGNvdWxkIGJlIDIgKCBpZiBkaWFnIHNlbGVjdGVkKQotICAgIC8vIDEvNCBwZWwKLSAgICB3aGlsZSAoLS1xdWFydGVyaXRlcnMpCi0gICAgewotICAgICAgICBDSEVDS19CRVRURVIobGVmdCwgdHIsIHRjIC0gMSk7Ci0gICAgICAgIENIRUNLX0JFVFRFUihyaWdodCwgdHIsIHRjICsgMSk7Ci0gICAgICAgIENIRUNLX0JFVFRFUih1cCwgdHIgLSAxLCB0Yyk7Ci0gICAgICAgIENIRUNLX0JFVFRFUihkb3duLCB0ciArIDEsIHRjKTsKLQotICAgICAgICB3aGljaGRpciA9IChsZWZ0IDwgcmlnaHQgPyAwIDogMSkgKyAodXAgPCBkb3duID8gMCA6IDIpOwotCi0gICAgICAgIHN3aXRjaCAod2hpY2hkaXIpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSKGRpYWcsIHRyIC0gMSwgdGMgLSAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBDSEVDS19CRVRURVIoZGlhZywgdHIgLSAxLCB0YyArIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIENIRUNLX0JFVFRFUihkaWFnLCB0ciArIDEsIHRjIC0gMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgQ0hFQ0tfQkVUVEVSKGRpYWcsIHRyICsgMSwgdGMgKyAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm8gcmVhc29uIHRvIGNoZWNrIHRoZSBzYW1lIG9uZSBhZ2Fpbi4KLSAgICAgICAgaWYgKHRyID09IGJyICYmIHRjID09IGJjKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdHIgPSBicjsKLSAgICAgICAgdGMgPSBiYzsKLSAgICB9Ci0KLSAgICBiZXN0bXYtPnJvdyA9IGJyIDw8IDE7Ci0gICAgYmVzdG12LT5jb2wgPSBiYyA8PCAxOwotCi0gICAgaWYgKChhYnMoYmVzdG12LT5jb2wgLSByZWZfbXYtPmNvbCkgPiBNQVhfRlVMTF9QRUxfVkFMKSB8fCAoYWJzKGJlc3Rtdi0+cm93IC0gcmVmX212LT5yb3cpID4gTUFYX0ZVTExfUEVMX1ZBTCkpCi0gICAgICAgIHJldHVybiBJTlRfTUFYOwotCi0gICAgcmV0dXJuIGJlc3RlcnI7Ci19Ci0jdW5kZWYgTVZDCi0jdW5kZWYgUFJFCi0jdW5kZWYgU1AKLSN1bmRlZiBESVNUCi0jdW5kZWYgRVJSCi0jdW5kZWYgQ0hFQ0tfQkVUVEVSCi0jdW5kZWYgTUlOCi0jdW5kZWYgTUFYCi1pbnQgdnA4X2ZpbmRfYmVzdF9zdWJfcGl4ZWxfc3RlcChNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBNViAqYmVzdG12LCBNViAqcmVmX212LCBpbnQgZXJyb3JfcGVyX2JpdCwgY29uc3QgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICp2ZnAsIGludCAqbXZjb3N0WzJdKQotewotICAgIGludCBiZXN0bXNlID0gSU5UX01BWDsKLSAgICBNViBzdGFydG12OwotICAgIC8vTVYgdGhpc19tdjsKLSAgICBNViB0aGlzX212OwotICAgIHVuc2lnbmVkIGNoYXIgKnkgPSAqKGQtPmJhc2VfcHJlKSArIGQtPnByZSArIChiZXN0bXYtPnJvdykgKiBkLT5wcmVfc3RyaWRlICsgYmVzdG12LT5jb2w7Ci0gICAgdW5zaWduZWQgY2hhciAqeiA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7Ci0gICAgaW50IGxlZnQsIHJpZ2h0LCB1cCwgZG93biwgZGlhZzsKLSAgICB1bnNpZ25lZCBpbnQgc3NlOwotICAgIGludCB3aGljaGRpciA7Ci0KLQotICAgIC8vIFRyYXAgdW5jb2RhYmxlIHZlY3RvcnMKLSAgICBpZiAoKGFicygoYmVzdG12LT5jb2wgPDwgMykgLSByZWZfbXYtPmNvbCkgPiBNQVhfRlVMTF9QRUxfVkFMKSB8fCAoYWJzKChiZXN0bXYtPnJvdyA8PCAzKSAtIHJlZl9tdi0+cm93KSA+IE1BWF9GVUxMX1BFTF9WQUwpKQotICAgIHsKLSAgICAgICAgYmVzdG12LT5yb3cgPDw9IDM7Ci0gICAgICAgIGJlc3Rtdi0+Y29sIDw8PSAzOwotICAgICAgICByZXR1cm4gSU5UX01BWDsKLSAgICB9Ci0KLSAgICAvLyBjZW50cmFsIG12Ci0gICAgYmVzdG12LT5yb3cgPDw9IDM7Ci0gICAgYmVzdG12LT5jb2wgPDw9IDM7Ci0gICAgc3RhcnRtdiA9ICpiZXN0bXY7Ci0KLSAgICAvLyBjYWxjdWxhdGUgY2VudHJhbCBwb2ludCBlcnJvcgotICAgIGJlc3Rtc2UgPSB2ZnAtPnZmKHksIGQtPnByZV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIGJlc3Rtc2UgKz0gbXZfZXJyX2Nvc3QoYmVzdG12LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICAvLyBnbyBsZWZ0IHRoZW4gcmlnaHQgYW5kIGNoZWNrIGVycm9yCi0gICAgdGhpc19tdi5yb3cgPSBzdGFydG12LnJvdzsKLSAgICB0aGlzX212LmNvbCA9ICgoc3RhcnRtdi5jb2wgLSA4KSB8IDQpOwotICAgIGxlZnQgPSB2ZnAtPnN2Zl9oYWxmcGl4X2goeSAtIDEsIGQtPnByZV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIGxlZnQgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgIGlmIChsZWZ0IDwgYmVzdG1zZSkKLSAgICB7Ci0gICAgICAgICpiZXN0bXYgPSB0aGlzX212OwotICAgICAgICBiZXN0bXNlID0gbGVmdDsKLSAgICB9Ci0KLSAgICB0aGlzX212LmNvbCArPSA4OwotICAgIHJpZ2h0ID0gdmZwLT5zdmZfaGFsZnBpeF9oKHksIGQtPnByZV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIHJpZ2h0ICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAocmlnaHQgPCBiZXN0bXNlKQotICAgIHsKLSAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7Ci0gICAgICAgIGJlc3Rtc2UgPSByaWdodDsKLSAgICB9Ci0KLSAgICAvLyBnbyB1cCB0aGVuIGRvd24gYW5kIGNoZWNrIGVycm9yCi0gICAgdGhpc19tdi5jb2wgPSBzdGFydG12LmNvbDsKLSAgICB0aGlzX212LnJvdyA9ICgoc3RhcnRtdi5yb3cgLSA4KSB8IDQpOwotICAgIHVwID0gdmZwLT5zdmZfaGFsZnBpeF92KHkgLSBkLT5wcmVfc3RyaWRlLCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICB1cCArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgaWYgKHVwIDwgYmVzdG1zZSkKLSAgICB7Ci0gICAgICAgICpiZXN0bXYgPSB0aGlzX212OwotICAgICAgICBiZXN0bXNlID0gdXA7Ci0gICAgfQotCi0gICAgdGhpc19tdi5yb3cgKz0gODsKLSAgICBkb3duID0gdmZwLT5zdmZfaGFsZnBpeF92KHksIGQtPnByZV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIGRvd24gKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgIGlmIChkb3duIDwgYmVzdG1zZSkKLSAgICB7Ci0gICAgICAgICpiZXN0bXYgPSB0aGlzX212OwotICAgICAgICBiZXN0bXNlID0gZG93bjsKLSAgICB9Ci0KLQotICAgIC8vIG5vdyBjaGVjayAxIG1vcmUgZGlhZ29uYWwKLSAgICB3aGljaGRpciA9IChsZWZ0IDwgcmlnaHQgPyAwIDogMSkgKyAodXAgPCBkb3duID8gMCA6IDIpOwotICAgIC8vZm9yKHdoaWNoZGlyID0wO3doaWNoZGlyPDQ7d2hpY2hkaXIrKykKLSAgICAvL3sKLSAgICB0aGlzX212ID0gc3RhcnRtdjsKLQotICAgIHN3aXRjaCAod2hpY2hkaXIpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgdGhpc19tdi5jb2wgPSAodGhpc19tdi5jb2wgLSA4KSB8IDQ7Ci0gICAgICAgIHRoaXNfbXYucm93ID0gKHRoaXNfbXYucm93IC0gOCkgfCA0OwotICAgICAgICBkaWFnID0gdmZwLT5zdmZfaGFsZnBpeF9odih5IC0gMSAtIGQtPnByZV9zdHJpZGUsIGQtPnByZV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICAgIHRoaXNfbXYuY29sICs9IDQ7Ci0gICAgICAgIHRoaXNfbXYucm93ID0gKHRoaXNfbXYucm93IC0gOCkgfCA0OwotICAgICAgICBkaWFnID0gdmZwLT5zdmZfaGFsZnBpeF9odih5IC0gZC0+cHJlX3N0cmlkZSwgZC0+cHJlX3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgdGhpc19tdi5jb2wgPSAodGhpc19tdi5jb2wgLSA4KSB8IDQ7Ci0gICAgICAgIHRoaXNfbXYucm93ICs9IDQ7Ci0gICAgICAgIGRpYWcgPSB2ZnAtPnN2Zl9oYWxmcGl4X2h2KHkgLSAxLCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRoaXNfbXYuY29sICs9IDQ7Ci0gICAgICAgIHRoaXNfbXYucm93ICs9IDQ7Ci0gICAgICAgIGRpYWcgPSB2ZnAtPnN2Zl9oYWxmcGl4X2h2KHksIGQtPnByZV9zdHJpZGUsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkaWFnICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAoZGlhZyA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IGRpYWc7Ci0gICAgfQotCi0vLyAgfQotCi0KLSAgICAvLyB0aW1lIHRvIGNoZWNrIHF1YXJ0ZXIgcGVscy4KLSAgICBpZiAoYmVzdG12LT5yb3cgPCBzdGFydG12LnJvdykKLSAgICAgICAgeSAtPSBkLT5wcmVfc3RyaWRlOwotCi0gICAgaWYgKGJlc3Rtdi0+Y29sIDwgc3RhcnRtdi5jb2wpCi0gICAgICAgIHktLTsKLQotICAgIHN0YXJ0bXYgPSAqYmVzdG12OwotCi0KLQotICAgIC8vIGdvIGxlZnQgdGhlbiByaWdodCBhbmQgY2hlY2sgZXJyb3IKLSAgICB0aGlzX212LnJvdyA9IHN0YXJ0bXYucm93OwotCi0gICAgaWYgKHN0YXJ0bXYuY29sICYgNykKLSAgICB7Ci0gICAgICAgIHRoaXNfbXYuY29sID0gc3RhcnRtdi5jb2wgLSAyOwotICAgICAgICBsZWZ0ID0gdmZwLT5zdmYoeSwgZC0+cHJlX3N0cmlkZSwgdGhpc19tdi5jb2wgJiA3LCB0aGlzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0aGlzX212LmNvbCA9IChzdGFydG12LmNvbCAtIDgpIHwgNjsKLSAgICAgICAgbGVmdCA9IHZmcC0+c3ZmKHkgLSAxLCBkLT5wcmVfc3RyaWRlLCA2LCB0aGlzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIH0KLQotICAgIGxlZnQgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgIGlmIChsZWZ0IDwgYmVzdG1zZSkKLSAgICB7Ci0gICAgICAgICpiZXN0bXYgPSB0aGlzX212OwotICAgICAgICBiZXN0bXNlID0gbGVmdDsKLSAgICB9Ci0KLSAgICB0aGlzX212LmNvbCArPSA0OwotICAgIHJpZ2h0ID0gdmZwLT5zdmYoeSwgZC0+cHJlX3N0cmlkZSwgdGhpc19tdi5jb2wgJiA3LCB0aGlzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIHJpZ2h0ICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAocmlnaHQgPCBiZXN0bXNlKQotICAgIHsKLSAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7Ci0gICAgICAgIGJlc3Rtc2UgPSByaWdodDsKLSAgICB9Ci0KLSAgICAvLyBnbyB1cCB0aGVuIGRvd24gYW5kIGNoZWNrIGVycm9yCi0gICAgdGhpc19tdi5jb2wgPSBzdGFydG12LmNvbDsKLQotICAgIGlmIChzdGFydG12LnJvdyAmIDcpCi0gICAgewotICAgICAgICB0aGlzX212LnJvdyA9IHN0YXJ0bXYucm93IC0gMjsKLSAgICAgICAgdXAgPSB2ZnAtPnN2Zih5LCBkLT5wcmVfc3RyaWRlLCB0aGlzX212LmNvbCAmIDcsIHRoaXNfbXYucm93ICYgNywgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRoaXNfbXYucm93ID0gKHN0YXJ0bXYucm93IC0gOCkgfCA2OwotICAgICAgICB1cCA9IHZmcC0+c3ZmKHkgLSBkLT5wcmVfc3RyaWRlLCBkLT5wcmVfc3RyaWRlLCB0aGlzX212LmNvbCAmIDcsIDYsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgIH0KLQotICAgIHVwICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAodXAgPCBiZXN0bXNlKQotICAgIHsKLSAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7Ci0gICAgICAgIGJlc3Rtc2UgPSB1cDsKLSAgICB9Ci0KLSAgICB0aGlzX212LnJvdyArPSA0OwotICAgIGRvd24gPSB2ZnAtPnN2Zih5LCBkLT5wcmVfc3RyaWRlLCB0aGlzX212LmNvbCAmIDcsIHRoaXNfbXYucm93ICYgNywgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgZG93biArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgaWYgKGRvd24gPCBiZXN0bXNlKQotICAgIHsKLSAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7Ci0gICAgICAgIGJlc3Rtc2UgPSBkb3duOwotICAgIH0KLQotCi0gICAgLy8gbm93IGNoZWNrIDEgbW9yZSBkaWFnb25hbAotICAgIHdoaWNoZGlyID0gKGxlZnQgPCByaWdodCA/IDAgOiAxKSArICh1cCA8IGRvd24gPyAwIDogMik7Ci0KLS8vICBmb3Iod2hpY2hkaXI9MDt3aGljaGRpcjw0O3doaWNoZGlyKyspCi0vLyAgewotICAgIHRoaXNfbXYgPSBzdGFydG12OwotCi0gICAgc3dpdGNoICh3aGljaGRpcikKLSAgICB7Ci0gICAgY2FzZSAwOgotCi0gICAgICAgIGlmIChzdGFydG12LnJvdyAmIDcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXNfbXYucm93IC09IDI7Ci0KLSAgICAgICAgICAgIGlmIChzdGFydG12LmNvbCAmIDcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpc19tdi5jb2wgLT0gMjsKLSAgICAgICAgICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSwgZC0+cHJlX3N0cmlkZSwgdGhpc19tdi5jb2wgJiA3LCB0aGlzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXNfbXYuY29sID0gKHN0YXJ0bXYuY29sIC0gOCkgfCA2OwotICAgICAgICAgICAgICAgIGRpYWcgPSB2ZnAtPnN2Zih5IC0gMSwgZC0+cHJlX3N0cmlkZSwgNiwgdGhpc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzX212LnJvdyA9IChzdGFydG12LnJvdyAtIDgpIHwgNjsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0bXYuY29sICYgNykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzX212LmNvbCAtPSAyOwotICAgICAgICAgICAgICAgIGRpYWcgPSB2ZnAtPnN2Zih5IC0gZC0+cHJlX3N0cmlkZSwgZC0+cHJlX3N0cmlkZSwgdGhpc19tdi5jb2wgJiA3LCA2LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzX212LmNvbCA9IChzdGFydG12LmNvbCAtIDgpIHwgNjsKLSAgICAgICAgICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSAtIGQtPnByZV9zdHJpZGUgLSAxLCBkLT5wcmVfc3RyaWRlLCA2LCA2LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgICAgdGhpc19tdi5jb2wgKz0gMjsKLQotICAgICAgICBpZiAoc3RhcnRtdi5yb3cgJiA3KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzX212LnJvdyAtPSAyOwotICAgICAgICAgICAgZGlhZyA9IHZmcC0+c3ZmKHksIGQtPnByZV9zdHJpZGUsIHRoaXNfbXYuY29sICYgNywgdGhpc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXNfbXYucm93ID0gKHN0YXJ0bXYucm93IC0gOCkgfCA2OwotICAgICAgICAgICAgZGlhZyA9IHZmcC0+c3ZmKHkgLSBkLT5wcmVfc3RyaWRlLCBkLT5wcmVfc3RyaWRlLCB0aGlzX212LmNvbCAmIDcsIDYsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICB0aGlzX212LnJvdyArPSAyOwotCi0gICAgICAgIGlmIChzdGFydG12LmNvbCAmIDcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXNfbXYuY29sIC09IDI7Ci0gICAgICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSwgZC0+cHJlX3N0cmlkZSwgdGhpc19tdi5jb2wgJiA3LCB0aGlzX212LnJvdyAmIDcsIHosIGItPnNyY19zdHJpZGUsICZzc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhpc19tdi5jb2wgPSAoc3RhcnRtdi5jb2wgLSA4KSB8IDY7Ci0gICAgICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSAtIDEsIGQtPnByZV9zdHJpZGUsIDYsIHRoaXNfbXYucm93ICYgNywgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7OwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICB0aGlzX212LmNvbCArPSAyOwotICAgICAgICB0aGlzX212LnJvdyArPSAyOwotICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSwgZC0+cHJlX3N0cmlkZSwgIHRoaXNfbXYuY29sICYgNywgdGhpc19tdi5yb3cgJiA3LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGlhZyArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgaWYgKGRpYWcgPCBiZXN0bXNlKQotICAgIHsKLSAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7Ci0gICAgICAgIGJlc3Rtc2UgPSBkaWFnOwotICAgIH0KLQotLy8gIH0KLQotICAgIHJldHVybiBiZXN0bXNlOwotfQotCi1pbnQgdnA4X2ZpbmRfYmVzdF9oYWxmX3BpeGVsX3N0ZXAoTUFDUk9CTE9DSyAqbWIsIEJMT0NLICpiLCBCTE9DS0QgKmQsIE1WICpiZXN0bXYsIE1WICpyZWZfbXYsIGludCBlcnJvcl9wZXJfYml0LCBjb25zdCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKnZmcCwgaW50ICptdmNvc3RbMl0pCi17Ci0gICAgaW50IGJlc3Rtc2UgPSBJTlRfTUFYOwotICAgIE1WIHN0YXJ0bXY7Ci0gICAgLy9NViB0aGlzX212OwotICAgIE1WIHRoaXNfbXY7Ci0gICAgdW5zaWduZWQgY2hhciAqeSA9ICooZC0+YmFzZV9wcmUpICsgZC0+cHJlICsgKGJlc3Rtdi0+cm93KSAqIGQtPnByZV9zdHJpZGUgKyBiZXN0bXYtPmNvbDsKLSAgICB1bnNpZ25lZCBjaGFyICp6ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKLSAgICBpbnQgbGVmdCwgcmlnaHQsIHVwLCBkb3duLCBkaWFnOwotICAgIHVuc2lnbmVkIGludCBzc2U7Ci0KLSAgICAvLyBUcmFwIHVuY29kYWJsZSB2ZWN0b3JzCi0gICAgaWYgKChhYnMoKGJlc3Rtdi0+Y29sIDw8IDMpIC0gcmVmX212LT5jb2wpID4gTUFYX0ZVTExfUEVMX1ZBTCkgfHwgKGFicygoYmVzdG12LT5yb3cgPDwgMykgLSByZWZfbXYtPnJvdykgPiBNQVhfRlVMTF9QRUxfVkFMKSkKLSAgICB7Ci0gICAgICAgIGJlc3Rtdi0+cm93IDw8PSAzOwotICAgICAgICBiZXN0bXYtPmNvbCA8PD0gMzsKLSAgICAgICAgcmV0dXJuIElOVF9NQVg7Ci0gICAgfQotCi0gICAgLy8gY2VudHJhbCBtdgotICAgIGJlc3Rtdi0+cm93IDw8PSAzOwotICAgIGJlc3Rtdi0+Y29sIDw8PSAzOwotICAgIHN0YXJ0bXYgPSAqYmVzdG12OwotCi0gICAgLy8gY2FsY3VsYXRlIGNlbnRyYWwgcG9pbnQgZXJyb3IKLSAgICBiZXN0bXNlID0gdmZwLT52Zih5LCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICBiZXN0bXNlICs9IG12X2Vycl9jb3N0KGJlc3RtdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgLy8gZ28gbGVmdCB0aGVuIHJpZ2h0IGFuZCBjaGVjayBlcnJvcgotICAgIHRoaXNfbXYucm93ID0gc3RhcnRtdi5yb3c7Ci0gICAgdGhpc19tdi5jb2wgPSAoKHN0YXJ0bXYuY29sIC0gOCkgfCA0KTsKLSAgICBsZWZ0ID0gdmZwLT5zdmZfaGFsZnBpeF9oKHkgLSAxLCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICBsZWZ0ICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAobGVmdCA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IGxlZnQ7Ci0gICAgfQotCi0gICAgdGhpc19tdi5jb2wgKz0gODsKLSAgICByaWdodCA9IHZmcC0+c3ZmX2hhbGZwaXhfaCh5LCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICByaWdodCArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgaWYgKHJpZ2h0IDwgYmVzdG1zZSkKLSAgICB7Ci0gICAgICAgICpiZXN0bXYgPSB0aGlzX212OwotICAgICAgICBiZXN0bXNlID0gcmlnaHQ7Ci0gICAgfQotCi0gICAgLy8gZ28gdXAgdGhlbiBkb3duIGFuZCBjaGVjayBlcnJvcgotICAgIHRoaXNfbXYuY29sID0gc3RhcnRtdi5jb2w7Ci0gICAgdGhpc19tdi5yb3cgPSAoKHN0YXJ0bXYucm93IC0gOCkgfCA0KTsKLSAgICB1cCA9IHZmcC0+c3ZmX2hhbGZwaXhfdih5IC0gZC0+cHJlX3N0cmlkZSwgZC0+cHJlX3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgdXAgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgIGlmICh1cCA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IHVwOwotICAgIH0KLQotICAgIHRoaXNfbXYucm93ICs9IDg7Ci0gICAgZG93biA9IHZmcC0+c3ZmX2hhbGZwaXhfdih5LCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICBkb3duICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAoZG93biA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IGRvd247Ci0gICAgfQotCi0gICAgLy8gc29tZXdoYXQgc3RyYW5nZWx5IG5vdCBkb2luZyBhbGwgdGhlIGRpYWdvbmFscyBmb3IgaGFsZiBwZWwgaXMgc2xvd2VyIHRoYW4gZG9pbmcgdGhlbS4KLSNpZiAwCi0gICAgLy8gbm93IGNoZWNrIDEgbW9yZSBkaWFnb25hbCAtCi0gICAgd2hpY2hkaXIgPSAobGVmdCA8IHJpZ2h0ID8gMCA6IDEpICsgKHVwIDwgZG93biA/IDAgOiAyKTsKLSAgICB0aGlzX212ID0gc3RhcnRtdjsKLQotICAgIHN3aXRjaCAod2hpY2hkaXIpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgdGhpc19tdi5jb2wgPSAodGhpc19tdi5jb2wgLSA4KSB8IDQ7Ci0gICAgICAgIHRoaXNfbXYucm93ID0gKHRoaXNfbXYucm93IC0gOCkgfCA0OwotICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSAtIDEgLSBkLT5wcmVfc3RyaWRlLCBkLT5wcmVfc3RyaWRlLCA0LCA0LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgICB0aGlzX212LmNvbCArPSA0OwotICAgICAgICB0aGlzX212LnJvdyA9ICh0aGlzX212LnJvdyAtIDgpIHwgNDsKLSAgICAgICAgZGlhZyA9IHZmcC0+c3ZmKHkgLSBkLT5wcmVfc3RyaWRlLCBkLT5wcmVfc3RyaWRlLCA0LCA0LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICB0aGlzX212LmNvbCA9ICh0aGlzX212LmNvbCAtIDgpIHwgNDsKLSAgICAgICAgdGhpc19tdi5yb3cgKz0gNDsKLSAgICAgICAgZGlhZyA9IHZmcC0+c3ZmKHkgLSAxLCBkLT5wcmVfc3RyaWRlLCA0LCA0LCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICB0aGlzX212LmNvbCArPSA0OwotICAgICAgICB0aGlzX212LnJvdyArPSA0OwotICAgICAgICBkaWFnID0gdmZwLT5zdmYoeSwgZC0+cHJlX3N0cmlkZSwgNCwgNCwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRpYWcgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIHJlZl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgIGlmIChkaWFnIDwgYmVzdG1zZSkKLSAgICB7Ci0gICAgICAgICpiZXN0bXYgPSB0aGlzX212OwotICAgICAgICBiZXN0bXNlID0gZGlhZzsKLSAgICB9Ci0KLSNlbHNlCi0gICAgdGhpc19tdi5jb2wgPSAodGhpc19tdi5jb2wgLSA4KSB8IDQ7Ci0gICAgdGhpc19tdi5yb3cgPSAodGhpc19tdi5yb3cgLSA4KSB8IDQ7Ci0gICAgZGlhZyA9IHZmcC0+c3ZmX2hhbGZwaXhfaHYoeSAtIDEgLSBkLT5wcmVfc3RyaWRlLCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICBkaWFnICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAoZGlhZyA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IGRpYWc7Ci0gICAgfQotCi0gICAgdGhpc19tdi5jb2wgKz0gODsKLSAgICBkaWFnID0gdmZwLT5zdmZfaGFsZnBpeF9odih5IC0gZC0+cHJlX3N0cmlkZSwgZC0+cHJlX3N0cmlkZSwgeiwgYi0+c3JjX3N0cmlkZSwgJnNzZSk7Ci0gICAgZGlhZyArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgcmVmX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgaWYgKGRpYWcgPCBiZXN0bXNlKQotICAgIHsKLSAgICAgICAgKmJlc3RtdiA9IHRoaXNfbXY7Ci0gICAgICAgIGJlc3Rtc2UgPSBkaWFnOwotICAgIH0KLQotICAgIHRoaXNfbXYuY29sID0gKHRoaXNfbXYuY29sIC0gOCkgfCA0OwotICAgIHRoaXNfbXYucm93ID0gc3RhcnRtdi5yb3cgKyA0OwotICAgIGRpYWcgPSB2ZnAtPnN2Zl9oYWxmcGl4X2h2KHkgLSAxLCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICBkaWFnICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAoZGlhZyA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IGRpYWc7Ci0gICAgfQotCi0gICAgdGhpc19tdi5jb2wgKz0gODsKLSAgICBkaWFnID0gdmZwLT5zdmZfaGFsZnBpeF9odih5LCBkLT5wcmVfc3RyaWRlLCB6LCBiLT5zcmNfc3RyaWRlLCAmc3NlKTsKLSAgICBkaWFnICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICBpZiAoZGlhZyA8IGJlc3Rtc2UpCi0gICAgewotICAgICAgICAqYmVzdG12ID0gdGhpc19tdjsKLSAgICAgICAgYmVzdG1zZSA9IGRpYWc7Ci0gICAgfQotCi0jZW5kaWYKLSAgICByZXR1cm4gYmVzdG1zZTsKLX0KLQotCi0jZGVmaW5lIE1WQyhyLGMpICgoKG12c2FkY29zdFswXVsoKHIpPDwyKS1ycl0gKyBtdnNhZGNvc3RbMV1bKChjKTw8MikgLSByY10pICogZXJyb3JfcGVyX2JpdCArIDEyOCApPj44ICkgLy8gZXN0aW1hdGVkIGNvc3Qgb2YgYSBtb3Rpb24gdmVjdG9yIChyLGMpCi0jZGVmaW5lIFBSRShyLGMpICgqKGQtPmJhc2VfcHJlKSArIGQtPnByZSArIChyKSAqIGQtPnByZV9zdHJpZGUgKyAoYykpIC8vIHBvaW50ZXIgdG8gcHJlZGljdG9yIGJhc2Ugb2YgYSBtb3Rpb252ZWN0b3IKLSNkZWZpbmUgRElTVChyLGMsdikgdmZwLT5zZGYoIHNyYyxzcmNfc3RyaWRlLFBSRShyLGMpLGQtPnByZV9zdHJpZGUsIHYpIC8vIHJldHVybnMgc2FkIGVycm9yIHNjb3JlLgotI2RlZmluZSBFUlIocixjLHYpIChNVkMocixjKStESVNUKHIsYyx2KSkgLy8gcmV0dXJucyBkaXN0b3J0aW9uICsgbW90aW9uIHZlY3RvciBjb3N0Ci0jZGVmaW5lIENIRUNLX0JFVFRFUih2LHIsYykgaWYgKCh2ID0gRVJSKHIsYyxiZXN0ZXJyKSkgPCBiZXN0ZXJyKSB7IGJlc3RlcnIgPSB2OyBicj1yOyBiYz1jOyB9IC8vIGNoZWNrcyBpZiAocixjKSBoYXMgYmV0dGVyIHNjb3JlIHRoYW4gcHJldmlvdXMgYmVzdAotc3RhdGljIGNvbnN0IE1WIG5leHRfY2hrcHRzWzZdWzNdID0KLXsKLSAgICB7eyAtMiwgMH0sIHsgLTEsIC0yfSwgezEsIC0yfX0sCi0gICAge3sgLTEsIC0yfSwgezEsIC0yfSwgezIsIDB9fSwKLSAgICB7ezEsIC0yfSwgezIsIDB9LCB7MSwgMn19LAotICAgIHt7MiwgMH0sIHsxLCAyfSwgeyAtMSwgMn19LAotICAgIHt7MSwgMn0sIHsgLTEsIDJ9LCB7IC0yLCAwfX0sCi0gICAge3sgLTEsIDJ9LCB7IC0yLCAwfSwgeyAtMSwgLTJ9fQotfTsKLWludCB2cDhfaGV4X3NlYXJjaAotKAotICAgIE1BQ1JPQkxPQ0sgKngsCi0gICAgQkxPQ0sgKmIsCi0gICAgQkxPQ0tEICpkLAotICAgIE1WICpyZWZfbXYsCi0gICAgTVYgKmJlc3RfbXYsCi0gICAgaW50IHNlYXJjaF9wYXJhbSwKLSAgICBpbnQgZXJyb3JfcGVyX2JpdCwKLSAgICBpbnQgKm51bTAwLAotICAgIGNvbnN0IHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqdmZwLAotICAgIGludCAqbXZzYWRjb3N0WzJdLAotICAgIGludCAqbXZjb3N0WzJdLAotICAgIE1WICpjZW50ZXJfbXYKLSkKLXsKLSAgICBNViBoZXhbNl0gPSB7IHsgLTEsIC0yfSwgezEsIC0yfSwgezIsIDB9LCB7MSwgMn0sIHsgLTEsIDJ9LCB7IC0yLCAwfSB9IDsKLSAgICBNViBuZWlnaGJvcnNbOF0gPSB7IHsgLTEsIC0xfSwgezAsIC0xfSwgezEsIC0xfSwgeyAtMSwgMH0sIHsxLCAwfSwgeyAtMSwgMX0sIHswLCAxfSwgezEsIDF9IH0gOwotICAgIGludCBpLCBqOwotICAgIHVuc2lnbmVkIGNoYXIgKnNyYyA9ICgqKGItPmJhc2Vfc3JjKSArIGItPnNyYyk7Ci0gICAgaW50IHNyY19zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOwotICAgIGludCByciA9IGNlbnRlcl9tdi0+cm93LCByYyA9IGNlbnRlcl9tdi0+Y29sOwotICAgIGludCBiciA9IHJlZl9tdi0+cm93ID4+IDMsIGJjID0gcmVmX212LT5jb2wgPj4gMywgdHIsIHRjOwotICAgIHVuc2lnbmVkIGludCBiZXN0ZXJyLCB0aGlzZXJyID0gMHg3ZmZmZmZmZjsKLSAgICBpbnQgayA9IC0xLCB0azsKLQotICAgIGlmIChiYyA8IHgtPm12X2NvbF9taW4pIGJjID0geC0+bXZfY29sX21pbjsKLQotICAgIGlmIChiYyA+IHgtPm12X2NvbF9tYXgpIGJjID0geC0+bXZfY29sX21heDsKLQotICAgIGlmIChiciA8IHgtPm12X3Jvd19taW4pIGJyID0geC0+bXZfcm93X21pbjsKLQotICAgIGlmIChiciA+IHgtPm12X3Jvd19tYXgpIGJyID0geC0+bXZfcm93X21heDsKLQotICAgIHJyID4+PSAxOwotICAgIHJjID4+PSAxOwotCi0gICAgYmVzdGVyciA9IEVSUihiciwgYmMsIHRoaXNlcnIpOwotCi0gICAgLy8gaGV4IHNlYXJjaAotICAgIC8vaj0wCi0gICAgdHIgPSBicjsKLSAgICB0YyA9IGJjOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBuciA9IHRyICsgaGV4W2ldLnJvdywgbmMgPSB0YyArIGhleFtpXS5jb2w7Ci0KLSAgICAgICAgaWYgKG5jIDwgeC0+bXZfY29sX21pbikgY29udGludWU7Ci0KLSAgICAgICAgaWYgKG5jID4geC0+bXZfY29sX21heCkgY29udGludWU7Ci0KLSAgICAgICAgaWYgKG5yIDwgeC0+bXZfcm93X21pbikgY29udGludWU7Ci0KLSAgICAgICAgaWYgKG5yID4geC0+bXZfcm93X21heCkgY29udGludWU7Ci0KLSAgICAgICAgLy9DSEVDS19CRVRURVIodGhpc2VycixucixuYyk7Ci0gICAgICAgIGlmICgodGhpc2VyciA9IEVSUihuciwgbmMsIGJlc3RlcnIpKSA8IGJlc3RlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJlc3RlcnIgPSB0aGlzZXJyOwotICAgICAgICAgICAgYnIgPSBucjsKLSAgICAgICAgICAgIGJjID0gbmM7Ci0gICAgICAgICAgICBrID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh0ciA9PSBiciAmJiB0YyA9PSBiYykKLSAgICAgICAgZ290byBjYWxfbmVpZ2hib3JzOwotCi0gICAgZm9yIChqID0gMTsgaiA8IDEyNzsgaisrKQotICAgIHsKLSAgICAgICAgdHIgPSBicjsKLSAgICAgICAgdGMgPSBiYzsKLSAgICAgICAgdGsgPSBrOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuciA9IHRyICsgbmV4dF9jaGtwdHNbdGtdW2ldLnJvdywgbmMgPSB0YyArIG5leHRfY2hrcHRzW3RrXVtpXS5jb2w7Ci0KLSAgICAgICAgICAgIGlmIChuYyA8IHgtPm12X2NvbF9taW4pIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAobmMgPiB4LT5tdl9jb2xfbWF4KSBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKG5yIDwgeC0+bXZfcm93X21pbikgY29udGludWU7Ci0KLSAgICAgICAgICAgIGlmIChuciA+IHgtPm12X3Jvd19tYXgpIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvL0NIRUNLX0JFVFRFUih0aGlzZXJyLG5yLG5jKTsKLSAgICAgICAgICAgIGlmICgodGhpc2VyciA9IEVSUihuciwgbmMsIGJlc3RlcnIpKSA8IGJlc3RlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVzdGVyciA9IHRoaXNlcnI7Ci0gICAgICAgICAgICAgICAgYnIgPSBucjsKLSAgICAgICAgICAgICAgICBiYyA9IG5jOyAvL2s9KHRrKzUraSklNjt9Ci0gICAgICAgICAgICAgICAgayA9IHRrICsgNSArIGk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoayA+PSAxMikgayAtPSAxMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChrID49IDYpIGsgLT0gNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ciA9PSBiciAmJiB0YyA9PSBiYykKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIGNoZWNrIDggMSBhd2F5IG5laWdoYm9ycwotY2FsX25laWdoYm9yczoKLSAgICB0ciA9IGJyOwotICAgIHRjID0gYmM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IG5yID0gdHIgKyBuZWlnaGJvcnNbaV0ucm93LCBuYyA9IHRjICsgbmVpZ2hib3JzW2ldLmNvbDsKLQotICAgICAgICBpZiAobmMgPCB4LT5tdl9jb2xfbWluKSBjb250aW51ZTsKLQotICAgICAgICBpZiAobmMgPiB4LT5tdl9jb2xfbWF4KSBjb250aW51ZTsKLQotICAgICAgICBpZiAobnIgPCB4LT5tdl9yb3dfbWluKSBjb250aW51ZTsKLQotICAgICAgICBpZiAobnIgPiB4LT5tdl9yb3dfbWF4KSBjb250aW51ZTsKLQotICAgICAgICBDSEVDS19CRVRURVIodGhpc2VyciwgbnIsIG5jKTsKLSAgICB9Ci0KLSAgICBiZXN0X212LT5yb3cgPSBicjsKLSAgICBiZXN0X212LT5jb2wgPSBiYzsKLQotICAgIHJldHVybiB2ZnAtPnZmKHNyYywgc3JjX3N0cmlkZSwgUFJFKGJyLCBiYyksIGQtPnByZV9zdHJpZGUsICZ0aGlzZXJyKSArIG12X2Vycl9jb3N0KGJlc3RfbXYsIGNlbnRlcl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KSA7Ci19Ci0jdW5kZWYgTVZDCi0jdW5kZWYgUFJFCi0jdW5kZWYgU1AKLSN1bmRlZiBESVNUCi0jdW5kZWYgRVJSCi0jdW5kZWYgQ0hFQ0tfQkVUVEVSCi0KLQotaW50IHZwOF9kaWFtb25kX3NlYXJjaF9zYWQKLSgKLSAgICBNQUNST0JMT0NLICp4LAotICAgIEJMT0NLICpiLAotICAgIEJMT0NLRCAqZCwKLSAgICBNViAqcmVmX212LAotICAgIE1WICpiZXN0X212LAotICAgIGludCBzZWFyY2hfcGFyYW0sCi0gICAgaW50IGVycm9yX3Blcl9iaXQsCi0gICAgaW50ICpudW0wMCwKLSAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwKLSAgICBpbnQgKm12c2FkY29zdFsyXSwKLSAgICBpbnQgKm12Y29zdFsyXSwKLSAgICBNViAqY2VudGVyX212Ci0pCi17Ci0gICAgaW50IGksIGosIHN0ZXA7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKLSAgICBpbnQgd2hhdF9zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgKmluX3doYXQ7Ci0gICAgaW50IGluX3doYXRfc3RyaWRlID0gZC0+cHJlX3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyICpiZXN0X2FkZHJlc3M7Ci0KLSAgICBpbnQgdG90X3N0ZXBzOwotICAgIE1WIHRoaXNfbXY7Ci0KLSAgICBpbnQgYmVzdHNhZCA9IElOVF9NQVg7Ci0gICAgaW50IGJlc3Rfc2l0ZSA9IDA7Ci0gICAgaW50IGxhc3Rfc2l0ZSA9IDA7Ci0KLSAgICBpbnQgcmVmX3JvdyA9IHJlZl9tdi0+cm93ID4+IDM7Ci0gICAgaW50IHJlZl9jb2wgPSByZWZfbXYtPmNvbCA+PiAzOwotICAgIGludCB0aGlzX3Jvd19vZmZzZXQ7Ci0gICAgaW50IHRoaXNfY29sX29mZnNldDsKLSAgICBzZWFyY2hfc2l0ZSAqc3M7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpjaGVja19oZXJlOwotICAgIGludCB0aGlzc2FkOwotCi0gICAgKm51bTAwID0gMDsKLQotICAgIC8vIFdvcmsgb3V0IHRoZSBzdGFydCBwb2ludCBmb3IgdGhlIHNlYXJjaAotICAgIGluX3doYXQgPSAodW5zaWduZWQgY2hhciAqKSgqKGQtPmJhc2VfcHJlKSArIGQtPnByZSArIChyZWZfcm93ICogKGQtPnByZV9zdHJpZGUpKSArIHJlZl9jb2wpOwotICAgIGJlc3RfYWRkcmVzcyA9IGluX3doYXQ7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgc2VhcmNoIChhcyBpbmRpY2F0ZWQgYnkgcmVmX212KSBpcyB3aXRoaW4gdGhlIGJ1ZmZlciBsaW1pdHMKLSAgICBpZiAoKHJlZl9jb2wgPiB4LT5tdl9jb2xfbWluKSAmJiAocmVmX2NvbCA8IHgtPm12X2NvbF9tYXgpICYmCi0gICAgKHJlZl9yb3cgPiB4LT5tdl9yb3dfbWluKSAmJiAocmVmX3JvdyA8IHgtPm12X3Jvd19tYXgpKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgIGJlc3RzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgaW5fd2hhdCwgaW5fd2hhdF9zdHJpZGUsIDB4N2ZmZmZmZmYpICsgbXZfZXJyX2Nvc3QocmVmX212LCBjZW50ZXJfbXYsIG12c2FkY29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0gICAgfQotCi0gICAgLy8gc2VhcmNoX3BhcmFtIGRldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzdGVwIGFuZCBoZW5jZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKLSAgICAvLyAwID0gaW5pdGlhbCBzdGVwIChNQVhfRklSU1RfU1RFUCkgcGVsIDogMSA9IChNQVhfRklSU1RfU1RFUC8yKSBwZWwsIDIgPSAoTUFYX0ZJUlNUX1NURVAvNCkgcGVsLi4uIGV0Yy4KLSAgICBzcyA9ICZ4LT5zc1tzZWFyY2hfcGFyYW0gKiB4LT5zZWFyY2hlc19wZXJfc3RlcF07Ci0gICAgdG90X3N0ZXBzID0gKHgtPnNzX2NvdW50IC8geC0+c2VhcmNoZXNfcGVyX3N0ZXApIC0gc2VhcmNoX3BhcmFtOwotCi0gICAgaSA9IDE7Ci0gICAgYmVzdF9tdi0+cm93ID0gcmVmX3JvdzsKLSAgICBiZXN0X212LT5jb2wgPSByZWZfY29sOwotCi0gICAgZm9yIChzdGVwID0gMDsgc3RlcCA8IHRvdF9zdGVwcyA7IHN0ZXArKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDAgOyBqIDwgeC0+c2VhcmNoZXNfcGVyX3N0ZXAgOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyYXAgaWxsZWdhbCB2ZWN0b3JzCi0gICAgICAgICAgICB0aGlzX3Jvd19vZmZzZXQgPSBiZXN0X212LT5yb3cgKyBzc1tpXS5tdi5yb3c7Ci0gICAgICAgICAgICB0aGlzX2NvbF9vZmZzZXQgPSBiZXN0X212LT5jb2wgKyBzc1tpXS5tdi5jb2w7Ci0KLSAgICAgICAgICAgIGlmICgodGhpc19jb2xfb2Zmc2V0ID4geC0+bXZfY29sX21pbikgJiYgKHRoaXNfY29sX29mZnNldCA8IHgtPm12X2NvbF9tYXgpICYmCi0gICAgICAgICAgICAodGhpc19yb3dfb2Zmc2V0ID4geC0+bXZfcm93X21pbikgJiYgKHRoaXNfcm93X29mZnNldCA8IHgtPm12X3Jvd19tYXgpKQotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hlY2tfaGVyZSA9IHNzW2ldLm9mZnNldCArIGJlc3RfYWRkcmVzczsKLSAgICAgICAgICAgICAgICB0aGlzc2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUgLCBpbl93aGF0X3N0cmlkZSwgYmVzdHNhZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzX212LnJvdyA9IHRoaXNfcm93X29mZnNldCA8PCAzOwotICAgICAgICAgICAgICAgICAgICB0aGlzX212LmNvbCA9IHRoaXNfY29sX29mZnNldCA8PCAzOwotICAgICAgICAgICAgICAgICAgICB0aGlzc2FkICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12c2FkY29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0c2FkID0gdGhpc3NhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2l0ZSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiZXN0X3NpdGUgIT0gbGFzdF9zaXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBiZXN0X212LT5yb3cgKz0gc3NbYmVzdF9zaXRlXS5tdi5yb3c7Ci0gICAgICAgICAgICBiZXN0X212LT5jb2wgKz0gc3NbYmVzdF9zaXRlXS5tdi5jb2w7Ci0gICAgICAgICAgICBiZXN0X2FkZHJlc3MgKz0gc3NbYmVzdF9zaXRlXS5vZmZzZXQ7Ci0gICAgICAgICAgICBsYXN0X3NpdGUgPSBiZXN0X3NpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmVzdF9hZGRyZXNzID09IGluX3doYXQpCi0gICAgICAgICAgICAoKm51bTAwKSsrOwotICAgIH0KLQotICAgIHRoaXNfbXYucm93ID0gYmVzdF9tdi0+cm93IDw8IDM7Ci0gICAgdGhpc19tdi5jb2wgPSBiZXN0X212LT5jb2wgPDwgMzsKLQotICAgIGlmIChiZXN0c2FkID09IElOVF9NQVgpCi0gICAgICAgIHJldHVybiBJTlRfTUFYOwotCi0gICAgcmV0dXJuIGZuX3B0ci0+dmYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RfYWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICh1bnNpZ25lZCBpbnQgKikoJnRoaXNzYWQpKQotICAgICsgbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIGNlbnRlcl9tdiwgbXZjb3N0LCBlcnJvcl9wZXJfYml0KTsKLX0KLQotaW50IHZwOF9kaWFtb25kX3NlYXJjaF9zYWR4NAotKAotICAgIE1BQ1JPQkxPQ0sgKngsCi0gICAgQkxPQ0sgKmIsCi0gICAgQkxPQ0tEICpkLAotICAgIE1WICpyZWZfbXYsCi0gICAgTVYgKmJlc3RfbXYsCi0gICAgaW50IHNlYXJjaF9wYXJhbSwKLSAgICBpbnQgZXJyb3JfcGVyX2JpdCwKLSAgICBpbnQgKm51bTAwLAotICAgIHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqZm5fcHRyLAotICAgIGludCAqbXZzYWRjb3N0WzJdLAotICAgIGludCAqbXZjb3N0WzJdLAotICAgIE1WICpjZW50ZXJfbXYKLSkKLXsKLSAgICBpbnQgaSwgaiwgc3RlcDsKLQotICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOwotICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fd2hhdDsKLSAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgKmJlc3RfYWRkcmVzczsKLQotICAgIGludCB0b3Rfc3RlcHM7Ci0gICAgTVYgdGhpc19tdjsKLQotICAgIGludCBiZXN0c2FkID0gSU5UX01BWDsKLSAgICBpbnQgYmVzdF9zaXRlID0gMDsKLSAgICBpbnQgbGFzdF9zaXRlID0gMDsKLQotICAgIGludCByZWZfcm93ID0gcmVmX212LT5yb3cgPj4gMzsKLSAgICBpbnQgcmVmX2NvbCA9IHJlZl9tdi0+Y29sID4+IDM7Ci0gICAgaW50IHRoaXNfcm93X29mZnNldDsKLSAgICBpbnQgdGhpc19jb2xfb2Zmc2V0OwotICAgIHNlYXJjaF9zaXRlICpzczsKLQotICAgIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2hlcmU7Ci0gICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7Ci0KLSAgICAqbnVtMDAgPSAwOwotCi0gICAgLy8gV29yayBvdXQgdGhlIHN0YXJ0IHBvaW50IGZvciB0aGUgc2VhcmNoCi0gICAgaW5fd2hhdCA9ICh1bnNpZ25lZCBjaGFyICopKCooZC0+YmFzZV9wcmUpICsgZC0+cHJlICsgKHJlZl9yb3cgKiAoZC0+cHJlX3N0cmlkZSkpICsgcmVmX2NvbCk7Ci0gICAgYmVzdF9hZGRyZXNzID0gaW5fd2hhdDsKLQotICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBzZWFyY2ggKGFzIGluZGljYXRlZCBieSByZWZfbXYpIGlzIHdpdGhpbiB0aGUgYnVmZmVyIGxpbWl0cwotICAgIGlmICgocmVmX2NvbCA+IHgtPm12X2NvbF9taW4pICYmIChyZWZfY29sIDwgeC0+bXZfY29sX21heCkgJiYKLSAgICAocmVmX3JvdyA+IHgtPm12X3Jvd19taW4pICYmIChyZWZfcm93IDwgeC0+bXZfcm93X21heCkpCi0gICAgewotICAgICAgICAvLyBDaGVjayB0aGUgc3RhcnRpbmcgcG9zaXRpb24KLSAgICAgICAgYmVzdHNhZCA9IGZuX3B0ci0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCBpbl93aGF0LCBpbl93aGF0X3N0cmlkZSwgMHg3ZmZmZmZmZikgKyBtdl9lcnJfY29zdChyZWZfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKLSAgICB9Ci0KLSAgICAvLyBzZWFyY2hfcGFyYW0gZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHN0ZXAgYW5kIGhlbmNlIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucwotICAgIC8vIDAgPSBpbml0aWFsIHN0ZXAgKE1BWF9GSVJTVF9TVEVQKSBwZWwgOiAxID0gKE1BWF9GSVJTVF9TVEVQLzIpIHBlbCwgMiA9IChNQVhfRklSU1RfU1RFUC80KSBwZWwuLi4gZXRjLgotICAgIHNzID0gJngtPnNzW3NlYXJjaF9wYXJhbSAqIHgtPnNlYXJjaGVzX3Blcl9zdGVwXTsKLSAgICB0b3Rfc3RlcHMgPSAoeC0+c3NfY291bnQgLyB4LT5zZWFyY2hlc19wZXJfc3RlcCkgLSBzZWFyY2hfcGFyYW07Ci0KLSAgICBpID0gMTsKLSAgICBiZXN0X212LT5yb3cgPSByZWZfcm93OwotICAgIGJlc3RfbXYtPmNvbCA9IHJlZl9jb2w7Ci0KLSAgICBmb3IgKHN0ZXAgPSAwOyBzdGVwIDwgdG90X3N0ZXBzIDsgc3RlcCsrKQotICAgIHsKLSAgICAgICAgaW50IGFsbF9pbiA9IDEsIHQ7Ci0KLSAgICAgICAgLy8gVG8ga25vdyBpZiBhbGwgbmVpZ2hib3IgcG9pbnRzIGFyZSB3aXRoaW4gdGhlIGJvdW5kcywgNCBib3VuZHMgY2hlY2tpbmcgYXJlIGVub3VnaCBpbnN0ZWFkIG9mCi0gICAgICAgIC8vIGNoZWNraW5nIDQgYm91bmRzIGZvciBlYWNoIHBvaW50cy4KLSAgICAgICAgYWxsX2luICY9ICgoYmVzdF9tdi0+cm93ICsgc3NbaV0ubXYucm93KT4geC0+bXZfcm93X21pbik7Ci0gICAgICAgIGFsbF9pbiAmPSAoKGJlc3RfbXYtPnJvdyArIHNzW2krMV0ubXYucm93KSA8IHgtPm12X3Jvd19tYXgpOwotICAgICAgICBhbGxfaW4gJj0gKChiZXN0X212LT5jb2wgKyBzc1tpKzJdLm12LmNvbCkgPiB4LT5tdl9jb2xfbWluKTsKLSAgICAgICAgYWxsX2luICY9ICgoYmVzdF9tdi0+Y29sICsgc3NbaSszXS5tdi5jb2wpIDwgeC0+bXZfY29sX21heCk7Ci0KLSAgICAgICAgaWYgKGFsbF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhZF9hcnJheVs0XTsKLQotICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCB4LT5zZWFyY2hlc19wZXJfc3RlcCA7IGogKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpibG9ja19vZmZzZXRbNF07Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgNDsgdCsrKQotICAgICAgICAgICAgICAgICAgICBibG9ja19vZmZzZXRbdF0gPSBzc1tpK3RdLm9mZnNldCArIGJlc3RfYWRkcmVzczsKLQotICAgICAgICAgICAgICAgIGZuX3B0ci0+c2R4NGRmKHdoYXQsIHdoYXRfc3RyaWRlLCBibG9ja19vZmZzZXQsIGluX3doYXRfc3RyaWRlLCBzYWRfYXJyYXkpOwotCi0gICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IDQ7IHQrKywgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNhZF9hcnJheVt0XSA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYucm93ID0gKGJlc3RfbXYtPnJvdyArIHNzW2ldLm12LnJvdykgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYuY29sID0gKGJlc3RfbXYtPmNvbCArIHNzW2ldLm12LmNvbCkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhZF9hcnJheVt0XSArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgY2VudGVyX212LCBtdnNhZGNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2FkX2FycmF5W3RdIDwgYmVzdHNhZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c2FkID0gc2FkX2FycmF5W3RdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2l0ZSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IHgtPnNlYXJjaGVzX3Blcl9zdGVwIDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRyYXAgaWxsZWdhbCB2ZWN0b3JzCi0gICAgICAgICAgICAgICAgdGhpc19yb3dfb2Zmc2V0ID0gYmVzdF9tdi0+cm93ICsgc3NbaV0ubXYucm93OwotICAgICAgICAgICAgICAgIHRoaXNfY29sX29mZnNldCA9IGJlc3RfbXYtPmNvbCArIHNzW2ldLm12LmNvbDsKLQotICAgICAgICAgICAgICAgIGlmICgodGhpc19jb2xfb2Zmc2V0ID4geC0+bXZfY29sX21pbikgJiYgKHRoaXNfY29sX29mZnNldCA8IHgtPm12X2NvbF9tYXgpICYmCi0gICAgICAgICAgICAgICAgKHRoaXNfcm93X29mZnNldCA+IHgtPm12X3Jvd19taW4pICYmICh0aGlzX3Jvd19vZmZzZXQgPCB4LT5tdl9yb3dfbWF4KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlcmUgPSBzc1tpXS5vZmZzZXQgKyBiZXN0X2FkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgY2hlY2tfaGVyZSAsIGluX3doYXRfc3RyaWRlLCBiZXN0c2FkKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfbXYucm93ID0gdGhpc19yb3dfb2Zmc2V0IDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzX212LmNvbCA9IHRoaXNfY29sX29mZnNldCA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpc3NhZCArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgY2VudGVyX212LCBtdnNhZGNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNhZCA9IHRoaXNzYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zaXRlID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVzdF9zaXRlICE9IGxhc3Rfc2l0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYmVzdF9tdi0+cm93ICs9IHNzW2Jlc3Rfc2l0ZV0ubXYucm93OwotICAgICAgICAgICAgYmVzdF9tdi0+Y29sICs9IHNzW2Jlc3Rfc2l0ZV0ubXYuY29sOwotICAgICAgICAgICAgYmVzdF9hZGRyZXNzICs9IHNzW2Jlc3Rfc2l0ZV0ub2Zmc2V0OwotICAgICAgICAgICAgbGFzdF9zaXRlID0gYmVzdF9zaXRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJlc3RfYWRkcmVzcyA9PSBpbl93aGF0KQotICAgICAgICAgICAgKCpudW0wMCkrKzsKLSAgICB9Ci0KLSAgICB0aGlzX212LnJvdyA9IGJlc3RfbXYtPnJvdyA8PCAzOwotICAgIHRoaXNfbXYuY29sID0gYmVzdF9tdi0+Y29sIDw8IDM7Ci0KLSAgICBpZiAoYmVzdHNhZCA9PSBJTlRfTUFYKQotICAgICAgICByZXR1cm4gSU5UX01BWDsKLQotICAgIHJldHVybiBmbl9wdHItPnZmKHdoYXQsIHdoYXRfc3RyaWRlLCBiZXN0X2FkZHJlc3MsIGluX3doYXRfc3RyaWRlLCAodW5zaWduZWQgaW50ICopKCZ0aGlzc2FkKSkKLSAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci19Ci0KLQotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi1pbnQgdnA4X2Z1bGxfc2VhcmNoX3NhZChNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBNViAqcmVmX212LCBpbnQgZXJyb3JfcGVyX2JpdCwgaW50IGRpc3RhbmNlLCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgaW50ICptdmNvc3RbMl0sIGludCAqbXZzYWRjb3N0WzJdLCBNViAqY2VudGVyX212KQotewotICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOwotICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fd2hhdDsKLSAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotICAgIGludCBtdl9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgKmJlc3RhZGRyZXNzOwotICAgIE1WICpiZXN0X212ID0gJmQtPmJtaS5tdi5hc19tdjsKLSAgICBNViB0aGlzX212OwotICAgIGludCBiZXN0c2FkID0gSU5UX01BWDsKLSAgICBpbnQgciwgYzsKLQotICAgIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2hlcmU7Ci0gICAgaW50IHRoaXNzYWQ7Ci0KLSAgICBpbnQgcmVmX3JvdyA9IHJlZl9tdi0+cm93ID4+IDM7Ci0gICAgaW50IHJlZl9jb2wgPSByZWZfbXYtPmNvbCA+PiAzOwotCi0gICAgaW50IHJvd19taW4gPSByZWZfcm93IC0gZGlzdGFuY2U7Ci0gICAgaW50IHJvd19tYXggPSByZWZfcm93ICsgZGlzdGFuY2U7Ci0gICAgaW50IGNvbF9taW4gPSByZWZfY29sIC0gZGlzdGFuY2U7Ci0gICAgaW50IGNvbF9tYXggPSByZWZfY29sICsgZGlzdGFuY2U7Ci0KLSAgICAvLyBXb3JrIG91dCB0aGUgbWlkIHBvaW50IGZvciB0aGUgc2VhcmNoCi0gICAgaW5fd2hhdCA9ICooZC0+YmFzZV9wcmUpICsgZC0+cHJlOwotICAgIGJlc3RhZGRyZXNzID0gaW5fd2hhdCArIChyZWZfcm93ICogZC0+cHJlX3N0cmlkZSkgKyByZWZfY29sOwotCi0gICAgYmVzdF9tdi0+cm93ID0gcmVmX3JvdzsKLSAgICBiZXN0X212LT5jb2wgPSByZWZfY29sOwotCi0gICAgLy8gV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIHNlYXJjaCAoYXMgaW5kaWNhdGVkIGJ5IHJlZl9tdikgaXMgd2l0aGluIHRoZSBidWZmZXIgbGltaXRzCi0gICAgaWYgKChyZWZfY29sID4geC0+bXZfY29sX21pbikgJiYgKHJlZl9jb2wgPCB4LT5tdl9jb2xfbWF4KSAmJgotICAgIChyZWZfcm93ID4geC0+bXZfcm93X21pbikgJiYgKHJlZl9yb3cgPCB4LT5tdl9yb3dfbWF4KSkKLSAgICB7Ci0gICAgICAgIC8vIEJhc2VsaW5lIHZhbHVlIGF0IHRoZSBjZW50cmUKLQotICAgICAgICAvL2Jlc3RzYWQgPSBmbl9wdHItPnNmKCB3aGF0LHdoYXRfc3RyaWRlLGJlc3RhZGRyZXNzLGluX3doYXRfc3RyaWRlKSArIChpbnQpc3FydChtdl9lcnJfY29zdChyZWZfbXYscmVmX212LCBtdmNvc3QsZXJyb3JfcGVyX2JpdCoxNCkpOwotICAgICAgICBiZXN0c2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RhZGRyZXNzLCBpbl93aGF0X3N0cmlkZSwgMHg3ZmZmZmZmZikgKyBtdl9lcnJfY29zdChyZWZfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKLSAgICB9Ci0KLSAgICAvLyBBcHBseSBmdXJ0aGVyIGxpbWl0cyB0byBwcmV2ZW50IHVzIGxvb2tpbmcgdXNpbmcgdmVjdG9ycyB0aGF0IHN0cmV0Y2ggYmV5aW9uZCB0aGUgVU1WIGJvcmRlcgotICAgIGlmIChjb2xfbWluIDwgeC0+bXZfY29sX21pbikKLSAgICAgICAgY29sX21pbiA9IHgtPm12X2NvbF9taW47Ci0KLSAgICBpZiAoY29sX21heCA+IHgtPm12X2NvbF9tYXgpCi0gICAgICAgIGNvbF9tYXggPSB4LT5tdl9jb2xfbWF4OwotCi0gICAgaWYgKHJvd19taW4gPCB4LT5tdl9yb3dfbWluKQotICAgICAgICByb3dfbWluID0geC0+bXZfcm93X21pbjsKLQotICAgIGlmIChyb3dfbWF4ID4geC0+bXZfcm93X21heCkKLSAgICAgICAgcm93X21heCA9IHgtPm12X3Jvd19tYXg7Ci0KLSAgICBmb3IgKHIgPSByb3dfbWluOyByIDwgcm93X21heCA7IHIrKykKLSAgICB7Ci0gICAgICAgIHRoaXNfbXYucm93ID0gciA8PCAzOwotICAgICAgICBjaGVja19oZXJlID0gciAqIG12X3N0cmlkZSArIGluX3doYXQgKyBjb2xfbWluOwotCi0gICAgICAgIGZvciAoYyA9IGNvbF9taW47IGMgPCBjb2xfbWF4OyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXNzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgY2hlY2tfaGVyZSAsIGluX3doYXRfc3RyaWRlLCBiZXN0c2FkKTsKLQotICAgICAgICAgICAgdGhpc19tdi5jb2wgPSBjIDw8IDM7Ci0gICAgICAgICAgICAvL3RoaXNzYWQgKz0gKGludClzcXJ0KG12X2Vycl9jb3N0KCZ0aGlzX212LHJlZl9tdiwgbXZjb3N0LGVycm9yX3Blcl9iaXQqMTQpKTsKLSAgICAgICAgICAgIC8vdGhpc3NhZCAgKz0gZXJyb3JfcGVyX2JpdCAqIG12X2JpdHNfc2FkY29zdFttdl9iaXRzKCZ0aGlzX212LCByZWZfbXYsIG12Y29zdCldOwotICAgICAgICAgICAgdGhpc3NhZCAgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsgLy9tdl9iaXRzKGVycm9yX3Blcl9iaXQsICZ0aGlzX212LCByZWZfbXYsIG12c2FkY29zdCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZXN0c2FkID0gdGhpc3NhZDsKLSAgICAgICAgICAgICAgICBiZXN0X212LT5yb3cgPSByOwotICAgICAgICAgICAgICAgIGJlc3RfbXYtPmNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgYmVzdGFkZHJlc3MgPSBjaGVja19oZXJlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjaGVja19oZXJlKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0aGlzX212LnJvdyA9IGJlc3RfbXYtPnJvdyA8PCAzOwotICAgIHRoaXNfbXYuY29sID0gYmVzdF9tdi0+Y29sIDw8IDM7Ci0KLSAgICBpZiAoYmVzdHNhZCA8IElOVF9NQVgpCi0gICAgICAgIHJldHVybiBmbl9wdHItPnZmKHdoYXQsIHdoYXRfc3RyaWRlLCBiZXN0YWRkcmVzcywgaW5fd2hhdF9zdHJpZGUsICh1bnNpZ25lZCBpbnQgKikoJnRoaXNzYWQpKQotICAgICAgICArIG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12Y29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5UX01BWDsKLX0KLQotaW50IHZwOF9mdWxsX3NlYXJjaF9zYWR4MyhNQUNST0JMT0NLICp4LCBCTE9DSyAqYiwgQkxPQ0tEICpkLCBNViAqcmVmX212LCBpbnQgZXJyb3JfcGVyX2JpdCwgaW50IGRpc3RhbmNlLCB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgaW50ICptdmNvc3RbMl0sIGludCAqbXZzYWRjb3N0WzJdLCBNViAqY2VudGVyX212KQotewotICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOwotICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fd2hhdDsKLSAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotICAgIGludCBtdl9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgKmJlc3RhZGRyZXNzOwotICAgIE1WICpiZXN0X212ID0gJmQtPmJtaS5tdi5hc19tdjsKLSAgICBNViB0aGlzX212OwotICAgIGludCBiZXN0c2FkID0gSU5UX01BWDsKLSAgICBpbnQgciwgYzsKLQotICAgIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2hlcmU7Ci0gICAgdW5zaWduZWQgaW50IHRoaXNzYWQ7Ci0KLSAgICBpbnQgcmVmX3JvdyA9IHJlZl9tdi0+cm93ID4+IDM7Ci0gICAgaW50IHJlZl9jb2wgPSByZWZfbXYtPmNvbCA+PiAzOwotCi0gICAgaW50IHJvd19taW4gPSByZWZfcm93IC0gZGlzdGFuY2U7Ci0gICAgaW50IHJvd19tYXggPSByZWZfcm93ICsgZGlzdGFuY2U7Ci0gICAgaW50IGNvbF9taW4gPSByZWZfY29sIC0gZGlzdGFuY2U7Ci0gICAgaW50IGNvbF9tYXggPSByZWZfY29sICsgZGlzdGFuY2U7Ci0KLSAgICB1bnNpZ25lZCBpbnQgc2FkX2FycmF5WzNdOwotCi0gICAgLy8gV29yayBvdXQgdGhlIG1pZCBwb2ludCBmb3IgdGhlIHNlYXJjaAotICAgIGluX3doYXQgPSAqKGQtPmJhc2VfcHJlKSArIGQtPnByZTsKLSAgICBiZXN0YWRkcmVzcyA9IGluX3doYXQgKyAocmVmX3JvdyAqIGQtPnByZV9zdHJpZGUpICsgcmVmX2NvbDsKLQotICAgIGJlc3RfbXYtPnJvdyA9IHJlZl9yb3c7Ci0gICAgYmVzdF9tdi0+Y29sID0gcmVmX2NvbDsKLQotICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBzZWFyY2ggKGFzIGluZGljYXRlZCBieSByZWZfbXYpIGlzIHdpdGhpbiB0aGUgYnVmZmVyIGxpbWl0cwotICAgIGlmICgocmVmX2NvbCA+IHgtPm12X2NvbF9taW4pICYmIChyZWZfY29sIDwgeC0+bXZfY29sX21heCkgJiYKLSAgICAocmVmX3JvdyA+IHgtPm12X3Jvd19taW4pICYmIChyZWZfcm93IDwgeC0+bXZfcm93X21heCkpCi0gICAgewotICAgICAgICAvLyBCYXNlbGluZSB2YWx1ZSBhdCB0aGUgY2VudHJlCi0gICAgICAgIGJlc3RzYWQgPSBmbl9wdHItPnNkZih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdGFkZHJlc3MsIGluX3doYXRfc3RyaWRlLCAweDdmZmZmZmZmKSArIG12X2Vycl9jb3N0KHJlZl9tdiwgY2VudGVyX212LCBtdnNhZGNvc3QsIGVycm9yX3Blcl9iaXQpOwotICAgIH0KLQotICAgIC8vIEFwcGx5IGZ1cnRoZXIgbGltaXRzIHRvIHByZXZlbnQgdXMgbG9va2luZyB1c2luZyB2ZWN0b3JzIHRoYXQgc3RyZXRjaCBiZXlpb25kIHRoZSBVTVYgYm9yZGVyCi0gICAgaWYgKGNvbF9taW4gPCB4LT5tdl9jb2xfbWluKQotICAgICAgICBjb2xfbWluID0geC0+bXZfY29sX21pbjsKLQotICAgIGlmIChjb2xfbWF4ID4geC0+bXZfY29sX21heCkKLSAgICAgICAgY29sX21heCA9IHgtPm12X2NvbF9tYXg7Ci0KLSAgICBpZiAocm93X21pbiA8IHgtPm12X3Jvd19taW4pCi0gICAgICAgIHJvd19taW4gPSB4LT5tdl9yb3dfbWluOwotCi0gICAgaWYgKHJvd19tYXggPiB4LT5tdl9yb3dfbWF4KQotICAgICAgICByb3dfbWF4ID0geC0+bXZfcm93X21heDsKLQotICAgIGZvciAociA9IHJvd19taW47IHIgPCByb3dfbWF4IDsgcisrKQotICAgIHsKLSAgICAgICAgdGhpc19tdi5yb3cgPSByIDw8IDM7Ci0gICAgICAgIGNoZWNrX2hlcmUgPSByICogbXZfc3RyaWRlICsgaW5fd2hhdCArIGNvbF9taW47Ci0gICAgICAgIGMgPSBjb2xfbWluOwotCi0gICAgICAgIHdoaWxlICgoYyArIDIpIDwgY29sX21heCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZuX3B0ci0+c2R4M2Yod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUgLCBpbl93aGF0X3N0cmlkZSwgc2FkX2FycmF5KTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzc2FkID0gc2FkX2FycmF5W2ldOwotCi0gICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5jb2wgPSBjIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNzYWQgICs9IG12X2Vycl9jb3N0KCZ0aGlzX212LCBjZW50ZXJfbXYsIG12c2FkY29zdCwgZXJyb3JfcGVyX2JpdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0c2FkID0gdGhpc3NhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPnJvdyA9IHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0X212LT5jb2wgPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdGFkZHJlc3MgPSBjaGVja19oZXJlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hlY2tfaGVyZSsrOwotICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChjIDwgY29sX21heCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpc3NhZCA9IGZuX3B0ci0+c2RmKHdoYXQsIHdoYXRfc3RyaWRlLCBjaGVja19oZXJlICwgaW5fd2hhdF9zdHJpZGUsIGJlc3RzYWQpOwotCi0gICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpc19tdi5jb2wgPSBjIDw8IDM7Ci0gICAgICAgICAgICAgICAgdGhpc3NhZCAgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgICAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOwotICAgICAgICAgICAgICAgICAgICBiZXN0X212LT5yb3cgPSByOwotICAgICAgICAgICAgICAgICAgICBiZXN0X212LT5jb2wgPSBjOwotICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcyA9IGNoZWNrX2hlcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjaGVja19oZXJlICsrOwotICAgICAgICAgICAgYyArKzsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgdGhpc19tdi5yb3cgPSBiZXN0X212LT5yb3cgPDwgMzsKLSAgICB0aGlzX212LmNvbCA9IGJlc3RfbXYtPmNvbCA8PCAzOwotCi0gICAgaWYgKGJlc3RzYWQgPCBJTlRfTUFYKQotICAgICAgICByZXR1cm4gZm5fcHRyLT52Zih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdGFkZHJlc3MsIGluX3doYXRfc3RyaWRlLCAodW5zaWduZWQgaW50ICopKCZ0aGlzc2FkKSkKLSAgICAgICAgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgY2VudGVyX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIElOVF9NQVg7Ci19Ci0KLWludCB2cDhfZnVsbF9zZWFyY2hfc2FkeDgoTUFDUk9CTE9DSyAqeCwgQkxPQ0sgKmIsIEJMT0NLRCAqZCwgTVYgKnJlZl9tdiwgaW50IGVycm9yX3Blcl9iaXQsIGludCBkaXN0YW5jZSwgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICpmbl9wdHIsIGludCAqbXZjb3N0WzJdLCBpbnQgKm12c2FkY29zdFsyXSwgTVYgKmNlbnRlcl9tdikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp3aGF0ID0gKCooYi0+YmFzZV9zcmMpICsgYi0+c3JjKTsKLSAgICBpbnQgd2hhdF9zdHJpZGUgPSBiLT5zcmNfc3RyaWRlOwotICAgIHVuc2lnbmVkIGNoYXIgKmluX3doYXQ7Ci0gICAgaW50IGluX3doYXRfc3RyaWRlID0gZC0+cHJlX3N0cmlkZTsKLSAgICBpbnQgbXZfc3RyaWRlID0gZC0+cHJlX3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyICpiZXN0YWRkcmVzczsKLSAgICBNViAqYmVzdF9tdiA9ICZkLT5ibWkubXYuYXNfbXY7Ci0gICAgTVYgdGhpc19tdjsKLSAgICBpbnQgYmVzdHNhZCA9IElOVF9NQVg7Ci0gICAgaW50IHIsIGM7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpjaGVja19oZXJlOwotICAgIHVuc2lnbmVkIGludCB0aGlzc2FkOwotCi0gICAgaW50IHJlZl9yb3cgPSByZWZfbXYtPnJvdyA+PiAzOwotICAgIGludCByZWZfY29sID0gcmVmX212LT5jb2wgPj4gMzsKLQotICAgIGludCByb3dfbWluID0gcmVmX3JvdyAtIGRpc3RhbmNlOwotICAgIGludCByb3dfbWF4ID0gcmVmX3JvdyArIGRpc3RhbmNlOwotICAgIGludCBjb2xfbWluID0gcmVmX2NvbCAtIGRpc3RhbmNlOwotICAgIGludCBjb2xfbWF4ID0gcmVmX2NvbCArIGRpc3RhbmNlOwotCi0gICAgREVDTEFSRV9BTElHTkVEX0FSUkFZKDE2LCB1bnNpZ25lZCBzaG9ydCwgc2FkX2FycmF5OCwgOCk7Ci0gICAgdW5zaWduZWQgaW50IHNhZF9hcnJheVszXTsKLQotICAgIC8vIFdvcmsgb3V0IHRoZSBtaWQgcG9pbnQgZm9yIHRoZSBzZWFyY2gKLSAgICBpbl93aGF0ID0gKihkLT5iYXNlX3ByZSkgKyBkLT5wcmU7Ci0gICAgYmVzdGFkZHJlc3MgPSBpbl93aGF0ICsgKHJlZl9yb3cgKiBkLT5wcmVfc3RyaWRlKSArIHJlZl9jb2w7Ci0KLSAgICBiZXN0X212LT5yb3cgPSByZWZfcm93OwotICAgIGJlc3RfbXYtPmNvbCA9IHJlZl9jb2w7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgc2VhcmNoIChhcyBpbmRpY2F0ZWQgYnkgcmVmX212KSBpcyB3aXRoaW4gdGhlIGJ1ZmZlciBsaW1pdHMKLSAgICBpZiAoKHJlZl9jb2wgPiB4LT5tdl9jb2xfbWluKSAmJiAocmVmX2NvbCA8IHgtPm12X2NvbF9tYXgpICYmCi0gICAgKHJlZl9yb3cgPiB4LT5tdl9yb3dfbWluKSAmJiAocmVmX3JvdyA8IHgtPm12X3Jvd19tYXgpKQotICAgIHsKLSAgICAgICAgLy8gQmFzZWxpbmUgdmFsdWUgYXQgdGhlIGNlbnRyZQotICAgICAgICBiZXN0c2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGJlc3RhZGRyZXNzLCBpbl93aGF0X3N0cmlkZSwgMHg3ZmZmZmZmZikgKyBtdl9lcnJfY29zdChyZWZfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKLSAgICB9Ci0KLSAgICAvLyBBcHBseSBmdXJ0aGVyIGxpbWl0cyB0byBwcmV2ZW50IHVzIGxvb2tpbmcgdXNpbmcgdmVjdG9ycyB0aGF0IHN0cmV0Y2ggYmV5aW9uZCB0aGUgVU1WIGJvcmRlcgotICAgIGlmIChjb2xfbWluIDwgeC0+bXZfY29sX21pbikKLSAgICAgICAgY29sX21pbiA9IHgtPm12X2NvbF9taW47Ci0KLSAgICBpZiAoY29sX21heCA+IHgtPm12X2NvbF9tYXgpCi0gICAgICAgIGNvbF9tYXggPSB4LT5tdl9jb2xfbWF4OwotCi0gICAgaWYgKHJvd19taW4gPCB4LT5tdl9yb3dfbWluKQotICAgICAgICByb3dfbWluID0geC0+bXZfcm93X21pbjsKLQotICAgIGlmIChyb3dfbWF4ID4geC0+bXZfcm93X21heCkKLSAgICAgICAgcm93X21heCA9IHgtPm12X3Jvd19tYXg7Ci0KLSAgICBmb3IgKHIgPSByb3dfbWluOyByIDwgcm93X21heCA7IHIrKykKLSAgICB7Ci0gICAgICAgIHRoaXNfbXYucm93ID0gciA8PCAzOwotICAgICAgICBjaGVja19oZXJlID0gciAqIG12X3N0cmlkZSArIGluX3doYXQgKyBjb2xfbWluOwotICAgICAgICBjID0gY29sX21pbjsKLQotICAgICAgICB3aGlsZSAoKGMgKyA3KSA8IGNvbF9tYXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmbl9wdHItPnNkeDhmKHdoYXQsIHdoYXRfc3RyaWRlLCBjaGVja19oZXJlICwgaW5fd2hhdF9zdHJpZGUsIHNhZF9hcnJheTgpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXNzYWQgPSAodW5zaWduZWQgaW50KXNhZF9hcnJheThbaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzX212LmNvbCA9IGMgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgdGhpc3NhZCAgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9tdi0+cm93ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcyA9IGNoZWNrX2hlcmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGVja19oZXJlKys7Ci0gICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKChjICsgMikgPCBjb2xfbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm5fcHRyLT5zZHgzZih3aGF0LCB3aGF0X3N0cmlkZSwgY2hlY2tfaGVyZSAsIGluX3doYXRfc3RyaWRlLCBzYWRfYXJyYXkpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXNzYWQgPSBzYWRfYXJyYXlbaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzX212LmNvbCA9IGMgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgdGhpc3NhZCAgKz0gbXZfZXJyX2Nvc3QoJnRoaXNfbXYsIGNlbnRlcl9tdiwgbXZzYWRjb3N0LCBlcnJvcl9wZXJfYml0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NhZCA8IGJlc3RzYWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzYWQgPSB0aGlzc2FkOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9tdi0+cm93ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0YWRkcmVzcyA9IGNoZWNrX2hlcmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGVja19oZXJlKys7Ci0gICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGMgPCBjb2xfbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzc2FkID0gZm5fcHRyLT5zZGYod2hhdCwgd2hhdF9zdHJpZGUsIGNoZWNrX2hlcmUgLCBpbl93aGF0X3N0cmlkZSwgYmVzdHNhZCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzc2FkIDwgYmVzdHNhZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzX212LmNvbCA9IGMgPDwgMzsKLSAgICAgICAgICAgICAgICB0aGlzc2FkICArPSBtdl9lcnJfY29zdCgmdGhpc19tdiwgY2VudGVyX212LCBtdnNhZGNvc3QsIGVycm9yX3Blcl9iaXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRoaXNzYWQgPCBiZXN0c2FkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdHNhZCA9IHRoaXNzYWQ7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPnJvdyA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfbXYtPmNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RhZGRyZXNzID0gY2hlY2tfaGVyZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoZWNrX2hlcmUgKys7Ci0gICAgICAgICAgICBjICsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGhpc19tdi5yb3cgPSBiZXN0X212LT5yb3cgPDwgMzsKLSAgICB0aGlzX212LmNvbCA9IGJlc3RfbXYtPmNvbCA8PCAzOwotCi0gICAgaWYgKGJlc3RzYWQgPCBJTlRfTUFYKQotICAgICAgICByZXR1cm4gZm5fcHRyLT52Zih3aGF0LCB3aGF0X3N0cmlkZSwgYmVzdGFkZHJlc3MsIGluX3doYXRfc3RyaWRlLCAodW5zaWduZWQgaW50ICopKCZ0aGlzc2FkKSkKLSAgICAgICAgKyBtdl9lcnJfY29zdCgmdGhpc19tdiwgY2VudGVyX212LCBtdmNvc3QsIGVycm9yX3Blcl9iaXQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIElOVF9NQVg7Ci19Ci0jZW5kaWYgLyogIShDT05GSUdfUkVBTFRJTUVfT05MWSkgKi8KLQotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLXZvaWQgcHJpbnRfbW9kZV9jb250ZXh0KHZvaWQpCi17Ci0gICAgRklMRSAqZiA9IGZvcGVuKCJtb2RlY29udC5jIiwgInciKTsKLSAgICBpbnQgaSwgajsKLQotICAgIGZwcmludGYoZiwgIiNpbmNsdWRlIFwiZW50cm9weS5oXCJcbiIpOwotICAgIGZwcmludGYoZiwgImNvbnN0IGludCB2cDhfbW9kZV9jb250ZXh0c1s2XVs0XSA9XG4iKTsKLSAgICBmcHJpbnRmKGYsICJ7XG4iKTsKLQotICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCi0gICAgewotICAgICAgICBmcHJpbnRmKGYsICIgIHsgLy8gJWQgXG4iLCBqKTsKLSAgICAgICAgZnByaW50ZihmLCAiICAgICIpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvdmVyYWxfcHJvYjsKLSAgICAgICAgICAgIGludCB0aGlzX3Byb2I7Ci0gICAgICAgICAgICBpbnQgY291bnQ7IC8vID0gbXZfcmVmX2N0W2pdW2ldWzBdK212X3JlZl9jdFtqXVtpXVsxXTsKLQotICAgICAgICAgICAgLy8gT3ZlcmFsbCBwcm9icwotICAgICAgICAgICAgY291bnQgPSBtdl9tb2RlX2N0c1tpXVswXSArIG12X21vZGVfY3RzW2ldWzFdOwotCi0gICAgICAgICAgICBpZiAoY291bnQpCi0gICAgICAgICAgICAgICAgb3ZlcmFsX3Byb2IgPSAyNTYgKiBtdl9tb2RlX2N0c1tpXVswXSAvIGNvdW50OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG92ZXJhbF9wcm9iID0gMTI4OwotCi0gICAgICAgICAgICBpZiAob3ZlcmFsX3Byb2IgPT0gMCkKLSAgICAgICAgICAgICAgICBvdmVyYWxfcHJvYiA9IDE7Ci0KLSAgICAgICAgICAgIC8vIGNvbnRleHQgcHJvYnMKLSAgICAgICAgICAgIGNvdW50ID0gbXZfcmVmX2N0W2pdW2ldWzBdICsgbXZfcmVmX2N0W2pdW2ldWzFdOwotCi0gICAgICAgICAgICBpZiAoY291bnQpCi0gICAgICAgICAgICAgICAgdGhpc19wcm9iID0gMjU2ICogbXZfcmVmX2N0W2pdW2ldWzBdIC8gY291bnQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhpc19wcm9iID0gMTI4OwotCi0gICAgICAgICAgICBpZiAodGhpc19wcm9iID09IDApCi0gICAgICAgICAgICAgICAgdGhpc19wcm9iID0gMTsKLQotICAgICAgICAgICAgZnByaW50ZihmLCAiJTVkLCAiLCB0aGlzX3Byb2IpOwotICAgICAgICAgICAgLy9mcHJpbnRmKGYsIiU1ZCwgJTVkLCAlOGQsIiwgdGhpc19wcm9iLCBvdmVyYWxfcHJvYiwgKHRoaXNfcHJvYiA8PCAxMCkvb3ZlcmFsX3Byb2IpOwotICAgICAgICAgICAgLy9mcHJpbnRmKGYsIiU4ZCwgIiwgKHRoaXNfcHJvYiA8PCAxMCkvb3ZlcmFsX3Byb2IpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihmLCAiICB9LFxuIik7Ci0gICAgfQotCi0gICAgZnByaW50ZihmLCAifTtcbiIpOwotICAgIGZjbG9zZShmKTsKLX0KLQotLyogTVYgcmVmIGNvdW50IEVOVFJPUFlfU1RBVFMgc3RhdHMgY29kZSAqLwotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLXZvaWQgaW5pdF9tdl9yZWZfY291bnRzKCkKLXsKLSAgICB2cHhfbWVtc2V0KG12X3JlZl9jdCwgMCwgc2l6ZW9mKG12X3JlZl9jdCkpOwotICAgIHZweF9tZW1zZXQobXZfbW9kZV9jdHMsIDAsIHNpemVvZihtdl9tb2RlX2N0cykpOwotfQotCi12b2lkIGFjY3VtX212X3JlZnMoTUJfUFJFRElDVElPTl9NT0RFIG0sIGNvbnN0IGludCBjdFs0XSkKLXsKLSAgICBpZiAobSA9PSBaRVJPTVYpCi0gICAgewotICAgICAgICArK212X3JlZl9jdCBbY3RbMF1dIFswXSBbMF07Ci0gICAgICAgICsrbXZfbW9kZV9jdHNbMF1bMF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICsrbXZfcmVmX2N0IFtjdFswXV0gWzBdIFsxXTsKLSAgICAgICAgKyttdl9tb2RlX2N0c1swXVsxXTsKLQotICAgICAgICBpZiAobSA9PSBORUFSRVNUTVYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICsrbXZfcmVmX2N0IFtjdFsxXV0gWzFdIFswXTsKLSAgICAgICAgICAgICsrbXZfbW9kZV9jdHNbMV1bMF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICArK212X3JlZl9jdCBbY3RbMV1dIFsxXSBbMV07Ci0gICAgICAgICAgICArK212X21vZGVfY3RzWzFdWzFdOwotCi0gICAgICAgICAgICBpZiAobSA9PSBORUFSTVYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKyttdl9yZWZfY3QgW2N0WzJdXSBbMl0gWzBdOwotICAgICAgICAgICAgICAgICsrbXZfbW9kZV9jdHNbMl1bMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKyttdl9yZWZfY3QgW2N0WzJdXSBbMl0gWzFdOwotICAgICAgICAgICAgICAgICsrbXZfbW9kZV9jdHNbMl1bMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAobSA9PSBORVdNVikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICsrbXZfcmVmX2N0IFtjdFszXV0gWzNdIFswXTsKLSAgICAgICAgICAgICAgICAgICAgKyttdl9tb2RlX2N0c1szXVswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKyttdl9yZWZfY3QgW2N0WzNdXSBbM10gWzFdOwotICAgICAgICAgICAgICAgICAgICArK212X21vZGVfY3RzWzNdWzFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotI2VuZGlmLyogRU5EIE1WIHJlZiBjb3VudCBFTlRST1BZX1NUQVRTIHN0YXRzIGNvZGUgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9tY29tcC5oIGIvdnA4L2VuY29kZXIvbWNvbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmOTVjNi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9tY29tcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX01DT01QX0gKLSNkZWZpbmUgX19JTkNfTUNPTVBfSAotCi0jaW5jbHVkZSAiYmxvY2suaCIKLSNpbmNsdWRlICJ2YXJpYW5jZS5oIgotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotZXh0ZXJuIHZvaWQgaW5pdF9tdl9yZWZfY291bnRzKCk7Ci1leHRlcm4gdm9pZCBhY2N1bV9tdl9yZWZzKE1CX1BSRURJQ1RJT05fTU9ERSwgY29uc3QgaW50IG5lYXJfbXZfcmVmX2N0c1s0XSk7Ci0jZW5kaWYKLQotCi0jZGVmaW5lIE1BWF9NVlNFQVJDSF9TVEVQUyA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzIGluIGEgc3RlcCBzZWFyY2ggZ2l2ZW4gdGhlIGxhcmdlc3QgYWxsb3dlZCBpbml0aWFsIHN0ZXAKLSNkZWZpbmUgTUFYX0ZVTExfUEVMX1ZBTCAoKDEgPDwgKE1BWF9NVlNFQVJDSF9TVEVQUyszKSkgLSA4KSAgICAvLyBNYXggZnVsbCBwZWwgbXYgc3BlY2lmaWVkIGluIDEvOCBwZWwgdW5pdHMKLSNkZWZpbmUgTUFYX0ZJUlNUX1NURVAgKDEgPDwgKE1BWF9NVlNFQVJDSF9TVEVQUy0xKSkgICAgICAgICAgICAvLyBNYXhpbXVtIHNpemUgb2YgdGhlIGZpcnN0IHN0ZXAgaW4gZnVsbCBwZWwgdW5pdHMKLQotZXh0ZXJuIHZvaWQgcHJpbnRfbW9kZV9jb250ZXh0KHZvaWQpOwotZXh0ZXJuIGludCB2cDhfbXZfYml0X2Nvc3QoTVYgKm12LCBNViAqcmVmLCBpbnQgKm12Y29zdFsyXSwgaW50IFdlaWdodCk7Ci1leHRlcm4gdm9pZCB2cDhfaW5pdF9kc21vdGlvbl9jb21wZW5zYXRpb24oTUFDUk9CTE9DSyAqeCwgaW50IHN0cmlkZSk7Ci1leHRlcm4gdm9pZCB2cDhfaW5pdDNzbW90aW9uX2NvbXBlbnNhdGlvbihNQUNST0JMT0NLICp4LCAgaW50IHN0cmlkZSk7Ci0KLQotZXh0ZXJuIGludCB2cDhfaGV4X3NlYXJjaAotKAotICAgIE1BQ1JPQkxPQ0sgKngsCi0gICAgQkxPQ0sgKmIsCi0gICAgQkxPQ0tEICpkLAotICAgIE1WICpyZWZfbXYsCi0gICAgTVYgKmJlc3RfbXYsCi0gICAgaW50IHNlYXJjaF9wYXJhbSwKLSAgICBpbnQgZXJyb3JfcGVyX2JpdCwKLSAgICBpbnQgKm51bTAwLAotICAgIGNvbnN0IHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqdmYsCi0gICAgaW50ICptdnNhZGNvc3RbMl0sCi0gICAgaW50ICptdmNvc3RbMl0sCi0gICAgTVYgKmNlbnRlcl9tdgotKTsKLQotdHlwZWRlZiBpbnQgKGZyYWN0aW9uYWxfbXZfc3RlcF9mcCkKLSAgICAoTUFDUk9CTE9DSyAqeCwgQkxPQ0sgKmIsIEJMT0NLRCAqZCwgTVYgKmJlc3RtdiwgTVYgKnJlZl9tdiwKLSAgICAgaW50IGVycm9yX3Blcl9iaXQsIGNvbnN0IHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqdmZwLCBpbnQgKm12Y29zdFsyXSk7Ci1leHRlcm4gZnJhY3Rpb25hbF9tdl9zdGVwX2ZwIHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXBfaXRlcmF0aXZlbHk7Ci1leHRlcm4gZnJhY3Rpb25hbF9tdl9zdGVwX2ZwIHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXA7Ci1leHRlcm4gZnJhY3Rpb25hbF9tdl9zdGVwX2ZwIHZwOF9maW5kX2Jlc3RfaGFsZl9waXhlbF9zdGVwOwotZXh0ZXJuIGZyYWN0aW9uYWxfbXZfc3RlcF9mcCB2cDhfc2tpcF9mcmFjdGlvbmFsX212X3N0ZXA7Ci0KLSNkZWZpbmUgcHJvdG90eXBlX2Z1bGxfc2VhcmNoX3NhZChzeW0pXAotICAgIGludCAoc3ltKVwKLSAgICAoXAotICAgICBNQUNST0JMT0NLICp4LCBcCi0gICAgIEJMT0NLICpiLCBcCi0gICAgIEJMT0NLRCAqZCwgXAotICAgICBNViAqcmVmX212LCBcCi0gICAgIGludCBlcnJvcl9wZXJfYml0LCBcCi0gICAgIGludCBkaXN0YW5jZSwgXAotICAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgXAotICAgICBpbnQgKm12Y29zdFsyXSwgXAotICAgICBpbnQgKm12c2FkY29zdFsyXSwgXAotICAgICBNViAqY2VudGVyX212IFwKLSAgICApCi0KLSNkZWZpbmUgcHJvdG90eXBlX2RpYW1vbmRfc2VhcmNoX3NhZChzeW0pXAotICAgIGludCAoc3ltKVwKLSAgICAoXAotICAgICBNQUNST0JMT0NLICp4LCBcCi0gICAgIEJMT0NLICpiLCBcCi0gICAgIEJMT0NLRCAqZCwgXAotICAgICBNViAqcmVmX212LCBcCi0gICAgIE1WICpiZXN0X212LCBcCi0gICAgIGludCBzZWFyY2hfcGFyYW0sIFwKLSAgICAgaW50IGVycm9yX3Blcl9iaXQsIFwKLSAgICAgaW50ICpudW0wMCwgXAotICAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgKmZuX3B0ciwgXAotICAgICBpbnQgKm12c2FkY29zdFsyXSwgXAotICAgICBpbnQgKm12Y29zdFsyXSwgXAotICAgICBNViAqY2VudGVyX212IFwKLSAgICApCi0KLSNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAotI2luY2x1ZGUgIng4Ni9tY29tcF94ODYuaCIKLSNlbmRpZgotCi10eXBlZGVmIHByb3RvdHlwZV9mdWxsX3NlYXJjaF9zYWQoKnZwOF9mdWxsX3NlYXJjaF9mbl90KTsKLWV4dGVybiBwcm90b3R5cGVfZnVsbF9zZWFyY2hfc2FkKHZwOF9mdWxsX3NlYXJjaF9zYWQpOwotZXh0ZXJuIHByb3RvdHlwZV9mdWxsX3NlYXJjaF9zYWQodnA4X2Z1bGxfc2VhcmNoX3NhZHgzKTsKLWV4dGVybiBwcm90b3R5cGVfZnVsbF9zZWFyY2hfc2FkKHZwOF9mdWxsX3NlYXJjaF9zYWR4OCk7Ci0KLXR5cGVkZWYgcHJvdG90eXBlX2RpYW1vbmRfc2VhcmNoX3NhZCgqdnA4X2RpYW1vbmRfc2VhcmNoX2ZuX3QpOwotZXh0ZXJuIHByb3RvdHlwZV9kaWFtb25kX3NlYXJjaF9zYWQodnA4X2RpYW1vbmRfc2VhcmNoX3NhZCk7Ci1leHRlcm4gcHJvdG90eXBlX2RpYW1vbmRfc2VhcmNoX3NhZCh2cDhfZGlhbW9uZF9zZWFyY2hfc2FkeDQpOwotCi0jaWZuZGVmIHZwOF9zZWFyY2hfZnVsbF9zZWFyY2gKLSNkZWZpbmUgdnA4X3NlYXJjaF9mdWxsX3NlYXJjaCB2cDhfZnVsbF9zZWFyY2hfc2FkCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfZnVsbF9zZWFyY2hfc2FkKHZwOF9zZWFyY2hfZnVsbF9zZWFyY2gpOwotCi0jaWZuZGVmIHZwOF9zZWFyY2hfZGlhbW9uZF9zZWFyY2gKLSNkZWZpbmUgdnA4X3NlYXJjaF9kaWFtb25kX3NlYXJjaCB2cDhfZGlhbW9uZF9zZWFyY2hfc2FkCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfZGlhbW9uZF9zZWFyY2hfc2FkKHZwOF9zZWFyY2hfZGlhbW9uZF9zZWFyY2gpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHByb3RvdHlwZV9mdWxsX3NlYXJjaF9zYWQoKmZ1bGxfc2VhcmNoKTsKLSAgICBwcm90b3R5cGVfZGlhbW9uZF9zZWFyY2hfc2FkKCpkaWFtb25kX3NlYXJjaCk7Ci19IHZwOF9zZWFyY2hfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgU0VBUkNIX0lOVk9LRShjdHgsZm4pIChjdHgpLT5mbgotI2Vsc2UKLSNkZWZpbmUgU0VBUkNIX0lOVk9LRShjdHgsZm4pIHZwOF9zZWFyY2hfIyNmbgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvbW9kZWNvc3RzLmMgYi92cDgvZW5jb2Rlci9tb2RlY29zdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNmM0OC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9tb2RlY29zdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9ibG9ja2QuaCIKLSNpbmNsdWRlICJvbnl4X2ludC5oIgotI2luY2x1ZGUgInRyZWV3cml0ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCi0KLQotdm9pZCB2cDhfaW5pdF9tb2RlX2Nvc3RzKFZQOF9DT01QICpjKQotewotICAgIFZQOF9DT01NT04gKnggPSAmYy0+Y29tbW9uOwotICAgIHsKLSAgICAgICAgY29uc3QgdnA4X3RyZWVfcCBUID0gdnA4X2Jtb2RlX3RyZWU7Ci0KLSAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBqID0gMDsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cDhfY29zdF90b2tlbnMoKGludCAqKWMtPm1iLmJtb2RlX2Nvc3RzW2ldW2pdLCB4LT5rZl9ibW9kZV9wcm9iW2ldW2pdLCBUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICgrK2ogPCBWUDhfQklOVFJBTU9ERVMpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgrK2kgPCBWUDhfQklOVFJBTU9ERVMpOwotCi0gICAgICAgIHZwOF9jb3N0X3Rva2VucygoaW50ICopYy0+bWIuaW50ZXJfYm1vZGVfY29zdHMsIHgtPmZjLmJtb2RlX3Byb2IsIFQpOwotICAgIH0KLSAgICB2cDhfY29zdF90b2tlbnMoKGludCAqKWMtPm1iLmludGVyX2Jtb2RlX2Nvc3RzLCB4LT5mYy5zdWJfbXZfcmVmX3Byb2IsIHZwOF9zdWJfbXZfcmVmX3RyZWUpOwotCi0gICAgdnA4X2Nvc3RfdG9rZW5zKGMtPm1iLm1ibW9kZV9jb3N0WzFdLCB4LT5mYy55bW9kZV9wcm9iLCB2cDhfeW1vZGVfdHJlZSk7Ci0gICAgdnA4X2Nvc3RfdG9rZW5zKGMtPm1iLm1ibW9kZV9jb3N0WzBdLCB4LT5rZl95bW9kZV9wcm9iLCB2cDhfa2ZfeW1vZGVfdHJlZSk7Ci0KLSAgICB2cDhfY29zdF90b2tlbnMoYy0+bWIuaW50cmFfdXZfbW9kZV9jb3N0WzFdLCB4LT5mYy51dl9tb2RlX3Byb2IsIHZwOF91dl9tb2RlX3RyZWUpOwotICAgIHZwOF9jb3N0X3Rva2VucyhjLT5tYi5pbnRyYV91dl9tb2RlX2Nvc3RbMF0sIHgtPmtmX3V2X21vZGVfcHJvYiwgdnA4X3V2X21vZGVfdHJlZSk7Ci19CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9vbnl4X2lmLmMgYi92cDgvZW5jb2Rlci9vbnl4X2lmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjU1NDUuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvb255eF9pZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIgotI2luY2x1ZGUgIm1jb21wLmgiCi0jaW5jbHVkZSAiZmlyc3RwYXNzLmgiCi0jaW5jbHVkZSAicHNuci5oIgotI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZXh0ZW5kLmgiCi0jaW5jbHVkZSAicmF0ZWN0cmwuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3F1YW50X2NvbW1vbi5oIgotI2luY2x1ZGUgInNlZ21lbnRhdGlvbi5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZ19jb21tb24uaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmV4dGVuZC5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vcG9zdHByb2MuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N3YXB5djEyYnVmZmVyLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi90aHJlYWRpbmcuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvdnB4X3RpbWVyLmgiCi0jaW5jbHVkZSAidGVtcG9yYWxfZmlsdGVyLmgiCi0jaWYgQVJDSF9BUk0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI2RlZmluZSBJRl9SVENEKHgpICh4KQotI2RlZmluZSBSVENEKHgpICZjcGktPmNvbW1vbi5ydGNkLngKLSNlbHNlCi0jZGVmaW5lIElGX1JUQ0QoeCkgTlVMTAotI2RlZmluZSBSVENEKHgpIE5VTEwKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB2cDhjeF9pbml0X212X2JpdHNfc2FkY29zdCgpOwotZXh0ZXJuIHZvaWQgdnA4Y3hfcGlja19maWx0ZXJfbGV2ZWxfZmFzdChZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOGN4X3NldF9hbHRfbGZfbGV2ZWwoVlA4X0NPTVAgKmNwaSwgaW50IGZpbHRfdmFsKTsKLWV4dGVybiB2b2lkIHZwOGN4X3BpY2tfZmlsdGVyX2xldmVsKFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QsIFZQOF9DT01QICpjcGkpOwotCi1leHRlcm4gdm9pZCB2cDhfaW5pdF9sb29wX2ZpbHRlcihWUDhfQ09NTU9OICpjbSk7Ci1leHRlcm4gdm9pZCB2cDhfbG9vcF9maWx0ZXJfZnJhbWUoVlA4X0NPTU1PTiAqY20sICAgIE1BQ1JPQkxPQ0tEICptYmQsICBpbnQgZmlsdF92YWwpOwotZXh0ZXJuIHZvaWQgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX3lvbmx5KFZQOF9DT01NT04gKmNtLCAgICBNQUNST0JMT0NLRCAqbWJkLCAgaW50IGZpbHRfdmFsLCBpbnQgc2hhcnBuZXNzX2x2bCk7Ci1leHRlcm4gdm9pZCB2cDhfZG1hY2hpbmVfc3BlY2lmaWNfY29uZmlnKFZQOF9DT01QICpjcGkpOwotZXh0ZXJuIHZvaWQgdnA4X2NtYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOF9jYWxjX2F1dG9faWZyYW1lX3RhcmdldF9zaXplKFZQOF9DT01QICpjcGkpOwotZXh0ZXJuIHZvaWQgdnA4X2RlYmxvY2tfZnJhbWUoWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsIFlWMTJfQlVGRkVSX0NPTkZJRyAqcG9zdCwgaW50IGZpbHRfbHZsLCBpbnQgbG93X3Zhcl90aHJlc2gsIGludCBmbGFnKTsKLWV4dGVybiB2b2lkIHByaW50X3Bhcm1zKFZQOF9DT05GSUcgKm9jZiwgY2hhciAqZmlsZW5hbSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXRfcHJvY2Vzc29yX2ZyZXEoKTsKLWV4dGVybiB2b2lkIHByaW50X3RyZWVfdXBkYXRlX3Byb2JzKCk7Ci1leHRlcm4gdm9pZCB2cDhjeF9jcmVhdGVfZW5jb2Rlcl90aHJlYWRzKFZQOF9DT01QICpjcGkpOwotZXh0ZXJuIHZvaWQgdnA4Y3hfcmVtb3ZlX2VuY29kZXJfdGhyZWFkcyhWUDhfQ09NUCAqY3BpKTsKLSNpZiBIQVZFX0FSTVY3Ci1leHRlcm4gdm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX2Z1bmNfbmVvbihZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7Ci1leHRlcm4gdm9pZCB2cDhfeXYxMl9jb3B5X3NyY19mcmFtZV9mdW5jX25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotI2VuZGlmCi0KLWludCB2cDhfZXN0aW1hdGVfZW50cm9weV9zYXZpbmdzKFZQOF9DT01QICpjcGkpOwotaW50IHZwOF9jYWxjX3NzX2VycihZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LCBjb25zdCB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAqcnRjZCk7Ci0KLWV4dGVybiB2b2lkIHZwOF90ZW1wb3JhbF9maWx0ZXJfcHJlcGFyZV9jKFZQOF9DT01QICpjcGkpOwotCi1zdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9sZl9kZWx0YXMoVlA4X0NPTVAgKmNwaSk7Ci0KLWV4dGVybiBjb25zdCBpbnQgdnA4X2dmX2ludGVydmFsX3RhYmxlWzEwMV07Ci0KLSNpZiBDT05GSUdfUFNOUgotI2luY2x1ZGUgIm1hdGguaCIKLQotZXh0ZXJuIGRvdWJsZSB2cDhfY2FsY19zc2ltCi0oCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LAotICAgIGludCBsdW1hbWFzaywKLSAgICBkb3VibGUgKndlaWdodCwKLSAgICBjb25zdCB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAqcnRjZAotKTsKLQotCi1leHRlcm4gZG91YmxlIHZwOF9jYWxjX3NzaW1nCi0oCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LAotICAgIGRvdWJsZSAqc3NpbV95LAotICAgIGRvdWJsZSAqc3NpbV91LAotICAgIGRvdWJsZSAqc3NpbV92Ci0pOwotCi0KLSNlbmRpZgotCi0KLSNpZmRlZiBPVVRQVVRfWVVWX1NSQwotRklMRSAqeXV2X2ZpbGU7Ci0jZW5kaWYKLQotI2lmIDAKLUZJTEUgKmZyYW1lcHNucjsKLUZJTEUgKmtmX2xpc3Q7Ci1GSUxFICprZXlmaWxlOwotI2VuZGlmCi0KLSNpZiAwCi1leHRlcm4gaW50IHNraXBfdHJ1ZV9jb3VudDsKLWV4dGVybiBpbnQgc2tpcF9mYWxzZV9jb3VudDsKLSNlbmRpZgotCi0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi1leHRlcm4gaW50IGludHJhX21vZGVfc3RhdHNbMTBdWzEwXVsxMF07Ci0jZW5kaWYKLQotI2lmZGVmIFNQRUVEU1RBVFMKLXVuc2lnbmVkIGludCBmcmFtZXNfYXRfc3BlZWRbMTZdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotdW5zaWduZWQgaW50IHRvdF9wbSA9IDA7Ci11bnNpZ25lZCBpbnQgY250X3BtID0gMDsKLXVuc2lnbmVkIGludCB0b3RfZWYgPSAwOwotdW5zaWduZWQgaW50IGNudF9lZiA9IDA7Ci0jZW5kaWYKLQotI2lmZGVmIE1PREVfU1RBVFMKLWV4dGVybiB1bnNpZ25lZCBfX2ludDY0IFNlY3Rpb25iaXRzWzUwXTsKLWV4dGVybiBpbnQgeV9tb2Rlc1s1XSAgOwotZXh0ZXJuIGludCB1dl9tb2Rlc1s0XSA7Ci1leHRlcm4gaW50IGJfbW9kZXNbMTBdICA7Ci0KLWV4dGVybiBpbnQgaW50ZXJfeV9tb2Rlc1sxMF0gOwotZXh0ZXJuIGludCBpbnRlcl91dl9tb2Rlc1s0XSA7Ci1leHRlcm4gdW5zaWduZWQgaW50IGludGVyX2JfbW9kZXNbMTVdOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkICgqdnA4X3Nob3J0X2ZkY3Q0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLWV4dGVybiB2b2lkICgqdnA4X3Nob3J0X2ZkY3Q4eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLQotZXh0ZXJuIGNvbnN0IGludCB2cDhfYml0c19wZXJfbWJbMl1bUUlOREVYX1JBTkdFXTsKLQotZXh0ZXJuIGNvbnN0IGludCBxcm91bmRpbmdfZmFjdG9yc1sxMjldOwotZXh0ZXJuIGNvbnN0IGludCBxemJpbl9mYWN0b3JzWzEyOV07Ci1leHRlcm4gdm9pZCB2cDhjeF9pbml0X3F1YW50aXplcihWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiBjb25zdCBpbnQgdnA4Y3hfYmFzZV9za2lwX2ZhbHNlX3Byb2JbMTI4XTsKLQotLy8gVGFibGVzIHJlbGF0aW5nIGFjdGl2ZSBtYXggUSB0byBhY3RpdmUgbWluIFEKLXN0YXRpYyBjb25zdCBpbnQga2ZfbG93X21vdGlvbl9taW5xW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDIsMiwyLDIsCi0gICAgMywzLDMsMywzLDMsNCw0LDQsNSw1LDUsNSw1LDYsNiwKLSAgICA2LDYsNyw3LDgsOCw4LDgsOSw5LDEwLDEwLDEwLDEwLDExLDExLAotICAgIDExLDExLDEyLDEyLDEzLDEzLDEzLDEzLDE0LDE0LDE1LDE1LDE1LDE1LDE2LDE2LAotICAgIDE2LDE2LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDIwLDIwLDIxLDIxLDIyLDIzLDIzCi19Owotc3RhdGljIGNvbnN0IGludCBrZl9oaWdoX21vdGlvbl9taW5xW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAxLDEsMSwxLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLAotICAgIDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDUsNSw2LDYsCi0gICAgNiw2LDcsNyw4LDgsOCw4LDksOSwxMCwxMCwxMCwxMCwxMSwxMSwKLSAgICAxMSwxMSwxMiwxMiwxMywxMywxMywxMywxNCwxNCwxNSwxNSwxNSwxNSwxNiwxNiwKLSAgICAxNiwxNiwxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwKLSAgICAyMSwyMSwyMiwyMiwyMywyMywyNCwyNSwyNSwyNiwyNiwyNywyOCwyOCwyOSwzMAotfTsKLXN0YXRpYyBjb25zdCBpbnQgZ2ZfbG93X21vdGlvbl9taW5xW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDIsMiwyLDIsCi0gICAgMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsNiw2LDYsNiwKLSAgICA3LDcsNyw3LDgsOCw4LDgsOSw5LDksOSwxMCwxMCwxMCwxMCwKLSAgICAxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOCwKLSAgICAxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwKLSAgICAyNywyNywyOCwyOCwyOSwyOSwzMCwzMCwzMSwzMSwzMiwzMiwzMywzMywzNCwzNCwKLSAgICAzNSwzNSwzNiwzNiwzNywzNywzOCwzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0MiwKLSAgICA0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OAotfTsKLXN0YXRpYyBjb25zdCBpbnQgZ2ZfbWlkX21vdGlvbl9taW5xW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwwLDAsMSwxLDEsMSwxLDEsMiwyLDMsMywzLDQsCi0gICAgNCw0LDUsNSw1LDYsNiw2LDcsNyw3LDgsOCw4LDksOSwKLSAgICA5LDEwLDEwLDEwLDEwLDExLDExLDExLDEyLDEyLDEyLDEyLDEzLDEzLDEzLDE0LAotICAgIDE0LDE0LDE1LDE1LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLAotICAgIDIyLDIyLDIzLDIzLDI0LDI0LDI1LDI1LDI2LDI2LDI3LDI3LDI4LDI4LDI5LDI5LAotICAgIDMwLDMwLDMxLDMxLDMyLDMyLDMzLDMzLDM0LDM0LDM1LDM1LDM2LDM2LDM3LDM3LAotICAgIDM4LDM5LDM5LDQwLDQwLDQxLDQxLDQyLDQyLDQzLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LAotICAgIDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0Ci19Owotc3RhdGljIGNvbnN0IGludCBnZl9oaWdoX21vdGlvbl9taW5xW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwwLDAsMSwxLDEsMSwxLDIsMiwyLDMsMywzLDQsCi0gICAgNCw0LDUsNSw1LDYsNiw2LDcsNyw3LDgsOCw4LDksOSwKLSAgICA5LDEwLDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LAotICAgIDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIyLDIyLDIzLDIzLDI0LDI0LAotICAgIDI1LDI1LDI2LDI2LDI3LDI3LDI4LDI4LDI5LDI5LDMwLDMwLDMxLDMxLDMyLDMyLAotICAgIDMzLDMzLDM0LDM0LDM1LDM1LDM2LDM2LDM3LDM3LDM4LDM4LDM5LDM5LDQwLDQwLAotICAgIDQxLDQxLDQyLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LAotICAgIDU1LDU2LDU3LDU4LDU5LDYwLDYyLDY0LDY2LDY4LDcwLDcyLDc0LDc2LDc4LDgwCi19Owotc3RhdGljIGNvbnN0IGludCBpbnRlcl9taW5xW1FJTkRFWF9SQU5HRV0gPQotewotICAgIDAsMCwxLDEsMiwzLDMsNCw0LDUsNiw2LDcsOCw4LDksCi0gICAgOSwxMCwxMSwxMSwxMiwxMywxMywxNCwxNSwxNSwxNiwxNywxNywxOCwxOSwyMCwKLSAgICAyMCwyMSwyMiwyMiwyMywyNCwyNCwyNSwyNiwyNywyNywyOCwyOSwzMCwzMCwzMSwKLSAgICAzMiwzMywzMywzNCwzNSwzNiwzNiwzNywzOCwzOSwzOSw0MCw0MSw0Miw0Miw0MywKLSAgICA0NCw0NSw0Niw0Niw0Nyw0OCw0OSw1MCw1MCw1MSw1Miw1Myw1NCw1NSw1NSw1NiwKLSAgICA1Nyw1OCw1OSw2MCw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2Nyw2OCw2OSw3MCwKLSAgICA3MSw3Miw3Myw3NCw3NSw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSwKLSAgICA4Niw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAKLX07Ci0KLXZvaWQgdnA4X2luaXRpYWxpemUoKQotewotICAgIHN0YXRpYyBpbnQgaW5pdF9kb25lID0gMDsKLQotICAgIGlmICghaW5pdF9kb25lKQotICAgIHsKLSAgICAgICAgdnA4X3NjYWxlX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKCk7Ci0gICAgICAgIHZwOF9pbml0aWFsaXplX2NvbW1vbigpOwotICAgICAgICAvL3ZwOF9kbWFjaGluZV9zcGVjaWZpY19jb25maWcoKTsKLSAgICAgICAgdnA4X3Rva2VuaXplX2luaXRpYWxpemUoKTsKLQotICAgICAgICB2cDhjeF9pbml0X212X2JpdHNfc2FkY29zdCgpOwotICAgICAgICBpbml0X2RvbmUgPSAxOwotICAgIH0KLX0KLSNpZmRlZiBQQUNLRVRfVEVTVElORwotZXh0ZXJuIEZJTEUgKnZweGxvZ2M7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2V0dXBfZmVhdHVyZXMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICAvLyBTZXQgdXAgZGVmYXVsdCBzdGF0ZSBmb3IgTUIgZmVhdHVyZSBmbGFncwotICAgIGNwaS0+bWIuZV9tYmQuc2VnbWVudGF0aW9uX2VuYWJsZWQgPSAwOwotICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXAgPSAwOwotICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9kYXRhID0gMDsKLSAgICB2cHhfbWVtc2V0KGNwaS0+bWIuZV9tYmQubWJfc2VnbWVudF90cmVlX3Byb2JzLCAyNTUsIHNpemVvZihjcGktPm1iLmVfbWJkLm1iX3NlZ21lbnRfdHJlZV9wcm9icykpOwotICAgIHZweF9tZW1zZXQoY3BpLT5tYi5lX21iZC5zZWdtZW50X2ZlYXR1cmVfZGF0YSwgMCwgc2l6ZW9mKGNwaS0+bWIuZV9tYmQuc2VnbWVudF9mZWF0dXJlX2RhdGEpKTsKLQotICAgIGNwaS0+bWIuZV9tYmQubW9kZV9yZWZfbGZfZGVsdGFfZW5hYmxlZCA9IDA7Ci0gICAgY3BpLT5tYi5lX21iZC5tb2RlX3JlZl9sZl9kZWx0YV91cGRhdGUgPSAwOwotICAgIHZweF9tZW1zZXQoY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzLCAwLCBzaXplb2YoY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzKSk7Ci0gICAgdnB4X21lbXNldChjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzLCAwLCBzaXplb2YoY3BpLT5tYi5lX21iZC5tb2RlX2xmX2RlbHRhcykpOwotICAgIHZweF9tZW1zZXQoY3BpLT5tYi5lX21iZC5sYXN0X3JlZl9sZl9kZWx0YXMsIDAsIHNpemVvZihjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXMpKTsKLSAgICB2cHhfbWVtc2V0KGNwaS0+bWIuZV9tYmQubGFzdF9tb2RlX2xmX2RlbHRhcywgMCwgc2l6ZW9mKGNwaS0+bWIuZV9tYmQubW9kZV9sZl9kZWx0YXMpKTsKLQotICAgIHNldF9kZWZhdWx0X2xmX2RlbHRhcyhjcGkpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgZGVhbGxvY19jb21wcmVzc29yX2RhdGEoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICB2cHhfZnJlZShjcGktPnRwbGlzdCk7Ci0gICAgY3BpLT50cGxpc3QgPSBOVUxMOwotCi0gICAgLy8gRGVsZXRlIGxhc3QgZnJhbWUgTVYgc3RvcmFnZSBidWZmZXJzCi0gICAgdnB4X2ZyZWUoY3BpLT5sZm12KTsKLSAgICBjcGktPmxmbXYgPSAwOwotCi0gICAgdnB4X2ZyZWUoY3BpLT5sZl9yZWZfZnJhbWVfc2lnbl9iaWFzKTsKLSAgICBjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXMgPSAwOwotCi0gICAgdnB4X2ZyZWUoY3BpLT5sZl9yZWZfZnJhbWUpOwotICAgIGNwaS0+bGZfcmVmX2ZyYW1lID0gMDsKLQotICAgIC8vIERlbGV0ZSBzZW1lbnRhdGlvbiBtYXAKLSAgICB2cHhfZnJlZShjcGktPnNlZ21lbnRhdGlvbl9tYXApOwotICAgIGNwaS0+c2VnbWVudGF0aW9uX21hcCA9IDA7Ci0KLSAgICB2cHhfZnJlZShjcGktPmFjdGl2ZV9tYXApOwotICAgIGNwaS0+YWN0aXZlX21hcCA9IDA7Ci0KLSAgICB2cDhfZGVfYWxsb2NfZnJhbWVfYnVmZmVycygmY3BpLT5jb21tb24pOwotCi0gICAgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKCZjcGktPmxhc3RfZnJhbWVfdWYpOwotICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5zY2FsZWRfc291cmNlKTsKLSNpZiBWUDhfVEVNUE9SQUxfQUxUX1JFRgotICAgIHZwOF95djEyX2RlX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5hbHRfcmVmX2J1ZmZlci5zb3VyY2VfYnVmZmVyKTsKLSNlbmRpZgotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MQUdfQlVGRkVSUzsgaSsrKQotICAgICAgICAgICAgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKCZjcGktPnNyY19idWZmZXJbaV0uc291cmNlX2J1ZmZlcik7Ci0KLSAgICAgICAgY3BpLT5zb3VyY2VfYnVmZmVyX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgICB2cHhfZnJlZShjcGktPnRvayk7Ci0gICAgY3BpLT50b2sgPSAwOwotCi0gICAgLy8gU3RydWN0dXJlIHVzZWQgdG8gbW9uaXRvciBHRiB1c2FnZQotICAgIHZweF9mcmVlKGNwaS0+Z2ZfYWN0aXZlX2ZsYWdzKTsKLSAgICBjcGktPmdmX2FjdGl2ZV9mbGFncyA9IDA7Ci0KLSAgICB2cHhfZnJlZShjcGktPm1iLnBpcCk7Ci0gICAgY3BpLT5tYi5waXAgPSAwOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICB2cHhfZnJlZShjcGktPnRvdGFsX3N0YXRzKTsKLSAgICBjcGktPnRvdGFsX3N0YXRzID0gMDsKLQotICAgIHZweF9mcmVlKGNwaS0+dGhpc19mcmFtZV9zdGF0cyk7Ci0gICAgY3BpLT50aGlzX2ZyYW1lX3N0YXRzID0gMDsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2VnbWVudGF0aW9uKFZQOF9QVFIgcHRyKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikocHRyKTsKLQotICAgIC8vIFNldCB0aGUgYXBwcm9wcmlhdGUgZmVhdHVyZSBiaXQKLSAgICBjcGktPm1iLmVfbWJkLnNlZ21lbnRhdGlvbl9lbmFibGVkID0gMTsKLSAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMTsKLSAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSA9IDE7Ci19Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX3NlZ21lbnRhdGlvbihWUDhfUFRSIHB0cikKLXsKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopKHB0cik7Ci0KLSAgICAvLyBDbGVhciB0aGUgYXBwcm9wcmlhdGUgZmVhdHVyZSBiaXQKLSAgICBjcGktPm1iLmVfbWJkLnNlZ21lbnRhdGlvbl9lbmFibGVkID0gMDsKLX0KLQotLy8gVmFsaWQgdmFsdWVzIGZvciBhIHNlZ21lbnQgYXJlIDAgdG8gMwotLy8gU2VnbWVudGF0aW9uIG1hcCBpcyBhcnJhbmdlIGFzIFtSb3dzXVtDb2x1bW5zXQotc3RhdGljIHZvaWQgc2V0X3NlZ21lbnRhdGlvbl9tYXAoVlA4X1BUUiBwdHIsIHVuc2lnbmVkIGNoYXIgKnNlZ21lbnRhdGlvbl9tYXApCi17Ci0gICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKShwdHIpOwotCi0gICAgLy8gQ29weSBpbiB0aGUgbmV3IHNlZ21lbnRhdGlvbiBtYXAKLSAgICB2cHhfbWVtY3B5KGNwaS0+c2VnbWVudGF0aW9uX21hcCwgc2VnbWVudGF0aW9uX21hcCwgKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzKSk7Ci0KLSAgICAvLyBTaWduYWwgdGhhdCB0aGUgbWFwIHNob3VsZCBiZSB1cGRhdGVkLgotICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXAgPSAxOwotICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9kYXRhID0gMTsKLX0KLQotLy8gVGhlIHZhbHVlcyBnaXZlbiBmb3IgZWFjaCBzZWdtZW50IGNhbiBiZSBlaXRoZXIgZGVsdGFzIChmcm9tIHRoZSBkZWZhdWx0IHZhbHVlIGNob3NlbiBmb3IgdGhlIGZyYW1lKSBvciBhYnNvbHV0ZSB2YWx1ZXMuCi0vLwotLy8gVmFsaWQgcmFuZ2UgZm9yIGFicyB2YWx1ZXMgaXMgKDAtMTI3IGZvciBNQl9MVkxfQUxUX1EpICwgKDAtNjMgZm9yIFNFR01FTlRfQUxUX0xGKQotLy8gVmFsaWQgcmFuZ2UgZm9yIGRlbHRhIHZhbHVlcyBhcmUgKCsvLTEyNyBmb3IgTUJfTFZMX0FMVF9RKSAsICgrLy02MyBmb3IgU0VHTUVOVF9BTFRfTEYpCi0vLwotLy8gYWJzX2RlbHRhID0gU0VHTUVOVF9ERUxUQURBVEEgKGRlbHRhcykgYWJzX2RlbHRhID0gU0VHTUVOVF9BQlNEQVRBICh1c2UgdGhlIGFic29sdXRlIHZhbHVlcyBnaXZlbikuCi0vLwotLy8KLXN0YXRpYyB2b2lkIHNldF9zZWdtZW50X2RhdGEoVlA4X1BUUiBwdHIsIHNpZ25lZCBjaGFyICpmZWF0dXJlX2RhdGEsIHVuc2lnbmVkIGNoYXIgYWJzX2RlbHRhKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikocHRyKTsKLQotICAgIGNwaS0+bWIuZV9tYmQubWJfc2VnZW1lbnRfYWJzX2RlbHRhID0gYWJzX2RlbHRhOwotICAgIHZweF9tZW1jcHkoY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSwgZmVhdHVyZV9kYXRhLCBzaXplb2YoY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YSkpOwotfQotCi0KLXN0YXRpYyB2b2lkIHNlZ21lbnRhdGlvbl90ZXN0X2Z1bmN0aW9uKFZQOF9QVFIgcHRyKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikocHRyKTsKLQotICAgIHVuc2lnbmVkIGNoYXIgKnNlZ19tYXA7Ci0gICAgc2lnbmVkIGNoYXIgZmVhdHVyZV9kYXRhW01CX0xWTF9NQVhdW01BWF9NQl9TRUdNRU5UU107Ci0KLSAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgbWFwIGZvciBzZWdtZW50YXRpb24gZGF0YS4KLSAgICBDSEVDS19NRU1fRVJST1Ioc2VnX21hcCwgdnB4X2NhbGxvYyhjcGktPmNvbW1vbi5tYl9yb3dzICogY3BpLT5jb21tb24ubWJfY29scywgMSkpOwotCi0gICAgLy8gTUIgbG9vcCB0byBzZXQgbG9jYWwgc2VnbWVudGF0aW9uIG1hcAotICAgIC8qZm9yICggaSA9IDA7IGkgPCBjcGktPmNvbW1vbi5tYl9yb3dzOyBpKysgKQotICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBjcGktPmNvbW1vbi5tYl9jb2xzOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3NlZ19tYXBbKGkqY3BpLT5jb21tb24ubWJfY29scykgKyBqXSA9IChqICUgMikgKyAoKGklMikqIDIpOwotICAgICAgICAgICAgLy9pZiAoIGogPCBjcGktPmNvbW1vbi5tYl9jb2xzLzIgKQotCi0gICAgICAgICAgICAvLyBTZWdtZW50IDEgYXJvdW5kIHRoZSBlZGdlIGVsc2UgMAotICAgICAgICAgICAgaWYgKCAoaSA9PSAwKSB8fCAoaiA9PSAwKSB8fCAoaSA9PSAoY3BpLT5jb21tb24ubWJfcm93cy0xKSkgfHwgKGogPT0gKGNwaS0+Y29tbW9uLm1iX2NvbHMtMSkpICkKLSAgICAgICAgICAgICAgICBzZWdfbWFwWyhpKmNwaS0+Y29tbW9uLm1iX2NvbHMpICsgal0gPSAxOwotICAgICAgICAgICAgLy9lbHNlIGlmICggKGkgPCAyKSB8fCAoaiA8IDIpIHx8IChpID4gKGNwaS0+Y29tbW9uLm1iX3Jvd3MtMykpIHx8IChqID4gKGNwaS0+Y29tbW9uLm1iX2NvbHMtMykpICkKLSAgICAgICAgICAgIC8vICBzZWdfbWFwWyhpKmNwaS0+Y29tbW9uLm1iX2NvbHMpICsgal0gPSAyOwotICAgICAgICAgICAgLy9lbHNlIGlmICggKGkgPCA1KSB8fCAoaiA8IDUpIHx8IChpID4gKGNwaS0+Y29tbW9uLm1iX3Jvd3MtNikpIHx8IChqID4gKGNwaS0+Y29tbW9uLm1iX2NvbHMtNikpICkKLSAgICAgICAgICAgIC8vICBzZWdfbWFwWyhpKmNwaS0+Y29tbW9uLm1iX2NvbHMpICsgal0gPSAzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNlZ19tYXBbKGkqY3BpLT5jb21tb24ubWJfY29scykgKyBqXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ki8KLQotICAgIC8vIFNldCB0aGUgc2VnbWVudGF0aW9uIE1hcAotICAgIHNldF9zZWdtZW50YXRpb25fbWFwKHB0ciwgc2VnX21hcCk7Ci0KLSAgICAvLyBBY3RpdmF0ZSBzZWdtZW50YXRpb24uCi0gICAgZW5hYmxlX3NlZ21lbnRhdGlvbihwdHIpOwotCi0gICAgLy8gU2V0IHVwIHRoZSBxdWFudCBzZWdtZW50IGRhdGEKLSAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVswXSA9IDA7Ci0gICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMV0gPSA0OwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdID0gMDsKLSAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXSA9IDA7Ci0gICAgLy8gU2V0IHVwIHRoZSBsb29wIHNlZ21lbnQgZGF0YQotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVswXSA9IDA7Ci0gICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzFdID0gMDsKLSAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMl0gPSAwOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVszXSA9IDA7Ci0KLSAgICAvLyBJbml0aWFsaXNlIHRoZSBmZWF0dXJlIGRhdGEgc3RydWN0dXJlCi0gICAgLy8gU0VHTUVOVF9ERUxUQURBVEEgICAgMCwgU0VHTUVOVF9BQlNEQVRBICAgICAgMQotICAgIHNldF9zZWdtZW50X2RhdGEocHRyLCAmZmVhdHVyZV9kYXRhWzBdWzBdLCBTRUdNRU5UX0RFTFRBREFUQSk7Ci0KLSAgICAvLyBEZWxldGUgc2VtZW50YXRpb24gbWFwCi0gICAgICAgIHZweF9mcmVlKHNlZ19tYXApOwotCi0gICAgc2VnX21hcCA9IDA7Ci0KLX0KLQotLy8gQSBzaW1wbGUgZnVuY3Rpb24gdG8gY3ljbGljYWxseSByZWZyZXNoIHRoZSBiYWNrZ3JvdW5kIGF0IGEgbG93ZXIgUQotc3RhdGljIHZvaWQgY3ljbGljX2JhY2tncm91bmRfcmVmcmVzaChWUDhfQ09NUCAqY3BpLCBpbnQgUSwgaW50IGxmX2FkanVzdG1lbnQpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqc2VnX21hcDsKLSAgICBzaWduZWQgY2hhciBmZWF0dXJlX2RhdGFbTUJfTFZMX01BWF1bTUFYX01CX1NFR01FTlRTXTsKLSAgICBpbnQgaTsKLSAgICBpbnQgYmxvY2tfY291bnQgPSBjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfbWF4X21ic19wZXJmcmFtZTsKLSAgICBpbnQgbWJzX2luX2ZyYW1lID0gY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHM7Ci0KLSAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgbWFwIGZvciBzZWdtZW50YXRpb24gZGF0YS4KLSAgICBDSEVDS19NRU1fRVJST1Ioc2VnX21hcCwgdnB4X2NhbGxvYyhjcGktPmNvbW1vbi5tYl9yb3dzICogY3BpLT5jb21tb24ubWJfY29scywgMSkpOwotCi0gICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9xID0gUTsKLQotICAgIGZvciAoaSA9IFE7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBpZiAodnA4X2JpdHNfcGVyX21iW2NwaS0+Y29tbW9uLmZyYW1lX3R5cGVdW2ldID49ICgodnA4X2JpdHNfcGVyX21iW2NwaS0+Y29tbW9uLmZyYW1lX3R5cGVdW1FdKihRICsgMTI4KSkgLyA2NCkpCi0gICAgICAgICAgICAvL2lmICggdnA4X2JpdHNfcGVyX21iW2NwaS0+Y29tbW9uLmZyYW1lX3R5cGVdW2ldID49ICgodnA4X2JpdHNfcGVyX21iW2NwaS0+Y29tbW9uLmZyYW1lX3R5cGVdW1FdKigoMipRKSs5NikpLzY0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9xID0gaTsKLQotICAgIC8vIE9ubHkgdXBkYXRlIGZvciBpbnRlciBmcmFtZXMKLSAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgewotICAgICAgICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBtYWNyb19ibG9jayByb3dzCi0gICAgICAgIC8vIE1CIGxvb3AgdG8gc2V0IGxvY2FsIHNlZ21lbnRhdGlvbiBtYXAKLSAgICAgICAgZm9yIChpID0gY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2luZGV4OyBpIDwgbWJzX2luX2ZyYW1lOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBNQiBpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgY2xlYW4gdXAgdGhlbiBtYXJrIGl0IGZvciBwb3NzaWJsZSBib29zdC9yZWZyZXNoIChzZWdtZW50IDEpCi0gICAgICAgICAgICAvLyBUaGUgc2VnbWVudCBpZCBtYXkgZ2V0IHJlc2V0IHRvIDAgbGF0ZXIgaWYgdGhlIE1CIGdldHMgY29kZWQgYW55dGhpbmcgb3RoZXIgdGhhbiBsYXN0IGZyYW1lIDAsMAotICAgICAgICAgICAgLy8gYXMgb25seSAobGFzdCBmcmFtZSAwLDApIE1CcyBhcmUgZWxpZ2FibGUgZm9yIHJlZnJlc2ggOiB0aGF0IGlzIHRvIHNheSBNYnMgbGlrZWx5IHRvIGJlIGJhY2tncm91bmQgYmxvY2tzLgotICAgICAgICAgICAgaWYgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwW2ldID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnX21hcFtpXSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnX21hcFtpXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiByZWZyZXNoZWQgcmVjZW50bHkgYW55d2F5LgotICAgICAgICAgICAgICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21hcFtpXSA8IDApCi0gICAgICAgICAgICAgICAgICAgIC8vY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXBbaV0gPSBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFtpXSAvIDE2OwotICAgICAgICAgICAgICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21hcFtpXSsrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGlmIChibG9ja19jb3VudCA+IDApCi0gICAgICAgICAgICAgICAgYmxvY2tfY291bnQtLTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBnb25lIHRocm91Z2ggdGhlIGZyYW1lIHJlc2V0IHRvIHRoZSBzdGFydAotICAgICAgICBjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfaW5kZXggPSBpOwotCi0gICAgICAgIGlmIChjcGktPmN5Y2xpY19yZWZyZXNoX21vZGVfaW5kZXggPj0gbWJzX2luX2ZyYW1lKQotICAgICAgICAgICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2luZGV4ID0gMDsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHNlZ21lbnRhdGlvbiBNYXAKLSAgICBzZXRfc2VnbWVudGF0aW9uX21hcCgoVlA4X1BUUiljcGksIHNlZ19tYXApOwotCi0gICAgLy8gQWN0aXZhdGUgc2VnbWVudGF0aW9uLgotICAgIGVuYWJsZV9zZWdtZW50YXRpb24oKFZQOF9QVFIpY3BpKTsKLQotICAgIC8vIFNldCB1cCB0aGUgcXVhbnQgc2VnbWVudCBkYXRhCi0gICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMF0gPSAwOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzFdID0gKGNwaS0+Y3ljbGljX3JlZnJlc2hfcSAtIFEpOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdID0gMDsKLSAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXSA9IDA7Ci0KLSAgICAvLyBTZXQgdXAgdGhlIGxvb3Agc2VnbWVudCBkYXRhCi0gICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzBdID0gMDsKLSAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9MRl1bMV0gPSBsZl9hZGp1c3RtZW50OwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsyXSA9IDA7Ci0gICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzNdID0gMDsKLQotICAgIC8vIEluaXRpYWxpc2UgdGhlIGZlYXR1cmUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAvLyBTRUdNRU5UX0RFTFRBREFUQSAgICAwLCBTRUdNRU5UX0FCU0RBVEEgICAgICAxCi0gICAgc2V0X3NlZ21lbnRfZGF0YSgoVlA4X1BUUiljcGksICZmZWF0dXJlX2RhdGFbMF1bMF0sIFNFR01FTlRfREVMVEFEQVRBKTsKLQotICAgIC8vIERlbGV0ZSBzZW1lbnRhdGlvbiBtYXAKLSAgICAgICAgdnB4X2ZyZWUoc2VnX21hcCk7Ci0KLSAgICBzZWdfbWFwID0gMDsKLQotfQotCi1zdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9sZl9kZWx0YXMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBjcGktPm1iLmVfbWJkLm1vZGVfcmVmX2xmX2RlbHRhX2VuYWJsZWQgPSAxOwotICAgIGNwaS0+bWIuZV9tYmQubW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlID0gMTsKLQotICAgIHZweF9tZW1zZXQoY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzLCAwLCBzaXplb2YoY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzKSk7Ci0gICAgdnB4X21lbXNldChjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzLCAwLCBzaXplb2YoY3BpLT5tYi5lX21iZC5tb2RlX2xmX2RlbHRhcykpOwotCi0gICAgLy8gVGVzdCBvZiByZWYgZnJhbWUgZGVsdGFzCi0gICAgY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzW0lOVFJBX0ZSQU1FXSA9IDI7Ci0gICAgY3BpLT5tYi5lX21iZC5yZWZfbGZfZGVsdGFzW0xBU1RfRlJBTUVdID0gMDsKLSAgICBjcGktPm1iLmVfbWJkLnJlZl9sZl9kZWx0YXNbR09MREVOX0ZSQU1FXSA9IC0yOwotICAgIGNwaS0+bWIuZV9tYmQucmVmX2xmX2RlbHRhc1tBTFRSRUZfRlJBTUVdID0gLTI7Ci0KLSAgICBjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzWzBdID0gNDsgICAgICAgICAgICAgICAvLyBCUFJFRAotICAgIGNwaS0+bWIuZV9tYmQubW9kZV9sZl9kZWx0YXNbMV0gPSAtMjsgICAgICAgICAgICAgIC8vIFplcm8KLSAgICBjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzWzJdID0gMjsgICAgICAgICAgICAgICAvLyBOZXcgbXYKLSAgICBjcGktPm1iLmVfbWJkLm1vZGVfbGZfZGVsdGFzWzNdID0gNDsgICAgICAgICAgICAgICAvLyBTcGxpdCBtdgotfQotCi12b2lkIHZwOF9zZXRfc3BlZWRfZmVhdHVyZXMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBTUEVFRF9GRUFUVVJFUyAqc2YgPSAmY3BpLT5zZjsKLSAgICBpbnQgTW9kZSA9IGNwaS0+Y29tcHJlc3Nvcl9zcGVlZDsKLSAgICBpbnQgU3BlZWQgPSBjcGktPlNwZWVkOwotICAgIGludCBpOwotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotICAgIGludCBsYXN0X2ltcHJvdmVkX3F1YW50ID0gc2YtPmltcHJvdmVkX3F1YW50OwotCi0gICAgLy8gSW5pdGlhbGlzZSBkZWZhdWx0IG1vZGUgZnJlcXVlbmN5IHNhbXBsaW5nIHZhcmlhYmxlcwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkgKyspCi0gICAgewotICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtpXSA9IDA7Ci0gICAgICAgIGNwaS0+bW9kZV90ZXN0X2hpdF9jb3VudHNbaV0gPSAwOwotICAgICAgICBjcGktPm1vZGVfY2hvc2VuX2NvdW50c1tpXSA9IDA7Ci0gICAgfQotCi0gICAgY3BpLT5tYnNfdGVzdGVkX3NvX2ZhciA9IDA7Ci0KLSAgICAvLyBiZXN0IHF1YWxpdHkgZGVmYXVsdHMKLSAgICBzZi0+UkQgPSAxOwotICAgIHNmLT5zZWFyY2hfbWV0aG9kID0gTlNURVA7Ci0gICAgc2YtPmltcHJvdmVkX3F1YW50ID0gMTsKLSAgICBzZi0+aW1wcm92ZWRfZGN0ID0gMTsKLSAgICBzZi0+YXV0b19maWx0ZXIgPSAxOwotICAgIHNmLT5yZWNvZGVfbG9vcCA9IDE7Ci0gICAgc2YtPnF1YXJ0ZXJfcGl4ZWxfc2VhcmNoID0gMTsKLSAgICBzZi0+aGFsZl9waXhlbF9zZWFyY2ggPSAxOwotICAgIHNmLT5mdWxsX2ZyZXFbMF0gPSA3OwotICAgIHNmLT5mdWxsX2ZyZXFbMV0gPSA3OwotICAgIHNmLT5taW5fZnNfcmFkaXVzID0gODsKLSAgICBzZi0+bWF4X2ZzX3JhZGl1cyA9IDMyOwotICAgIHNmLT5pdGVyYXRpdmVfc3ViX3BpeGVsID0gMTsKLSAgICBzZi0+b3B0aW1pemVfY29lZmZpY2llbnRzID0gMTsKLSAgICBzZi0+dXNlX2Zhc3RxdWFudF9mb3JfcGljayA9IDA7Ci0gICAgc2YtPm5vX3NraXBfYmxvY2s0eDRfc2VhcmNoID0gMTsKLQotICAgIHNmLT5maXJzdF9zdGVwID0gMDsKLSAgICBzZi0+bWF4X3N0ZXBfc2VhcmNoX3N0ZXBzID0gTUFYX01WU0VBUkNIX1NURVBTOwotICAgIHNmLT5pbXByb3ZlZF9tdl9wcmVkID0gMTsKLQotICAgIGNwaS0+ZG9fZnVsbFswXSA9IDA7Ci0gICAgY3BpLT5kb19mdWxsWzFdID0gMDsKLQotICAgIC8vIGRlZmF1bHQgdGhyZXNob2xkcyB0byAwCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NT0RFUzsgaSsrKQotICAgICAgICBzZi0+dGhyZXNoX211bHRbaV0gPSAwOwotCi0gICAgc3dpdGNoIChNb2RlKQotICAgIHsKLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotICAgIGNhc2UgMDogLy8gYmVzdCBxdWFsaXR5IG1vZGUKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPTVYgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUTVZdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUQSBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSTVYgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSQSAgICBdID0gMDsKLQotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0RDICAgICAgIF0gPSAwOwotCi0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfVl9QUkVEICAgXSA9IDEwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfSF9QUkVEICAgXSA9IDEwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfQl9QUkVEICAgXSA9IDIwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfVE0gICAgICAgXSA9IDEwMDA7Ci0KLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdNViAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdHICAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdBICAgICBdID0gMTAwMDsKLQotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElUTVYgIF0gPSAyNTAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElURyAgIF0gPSA1MDAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElUQSAgIF0gPSA1MDAwOwotCi0gICAgICAgIHNmLT5mdWxsX2ZyZXFbMF0gPSA3OwotICAgICAgICBzZi0+ZnVsbF9mcmVxWzFdID0gMTU7Ci0KLSAgICAgICAgc2YtPmZpcnN0X3N0ZXAgPSAwOwotICAgICAgICBzZi0+bWF4X3N0ZXBfc2VhcmNoX3N0ZXBzID0gTUFYX01WU0VBUkNIX1NURVBTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAzOgotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RNVl0gPSAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk9NViAgIF0gPSAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0RDICAgICAgIF0gPSAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJNViAgIF0gPSAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1ZfUFJFRCAgIF0gPSAxMDAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0hfUFJFRCAgIF0gPSAxMDAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0JfUFJFRCAgIF0gPSAyNTAwOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1RNICAgICAgIF0gPSAxMDAwOwotCi0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEcgXSA9IDEwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEEgXSA9IDEwMDA7Ci0KLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSQSAgICBdID0gMTAwMDsKLQotI2lmIDEKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPTVYgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUTVZdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUQSBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSTVYgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSQSAgICBdID0gMDsKLQotLy8gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfREMgICAgICAgXSA9IDA7Ci0KLS8vICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1ZfUFJFRCAgIF0gPSAxMDAwOwotLy8gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfSF9QUkVEICAgXSA9IDEwMDA7Ci0vLyAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9CX1BSRUQgICBdID0gMjAwMDsKLS8vICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1RNICAgICAgIF0gPSAxMDAwOwotCi0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXTVYgICAgXSA9IDEwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXRyAgICAgXSA9IDEwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXQSAgICAgXSA9IDEwMDA7Ci0KLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVE1WICBdID0gMTcwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEcgICBdID0gNDUwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEEgICBdID0gNDUwMDsKLSNlbHNlCi0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXTVYgICAgXSA9IDE1MDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXRyAgICAgXSA9IDE1MDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXQSAgICAgXSA9IDE1MDA7Ci0KLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVE1WICBdID0gNTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEcgICBdID0gMTAwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRBICAgXSA9IDEwMDAwOwotI2VuZGlmCi0gICAgICAgIHNmLT5mdWxsX2ZyZXFbMF0gPSAxNTsKLSAgICAgICAgc2YtPmZ1bGxfZnJlcVsxXSA9IDMxOwotCi0gICAgICAgIGlmIChTcGVlZCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIERpc2FibGUgY29lZmZpY2llbnQgb3B0aW1pemF0aW9uIGFib3ZlIHNwZWVkIDAgKi8KLSAgICAgICAgICAgIHNmLT5vcHRpbWl6ZV9jb2VmZmljaWVudHMgPSAwOwotICAgICAgICAgICAgc2YtPnVzZV9mYXN0cXVhbnRfZm9yX3BpY2sgPSAxOwotICAgICAgICAgICAgc2YtPm5vX3NraXBfYmxvY2s0eDRfc2VhcmNoID0gMDsKLQotICAgICAgICAgICAgc2YtPmZpcnN0X3N0ZXAgPSAxOwotCi0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRHXSA9IDI7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRBXSA9IDI7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRNVl0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNwZWVkID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1NQTElUR10gPSA0OwotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1NQTElUQV0gPSA0OwotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1NQTElUTVZdID0gMjsKLQotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9UTSAgICAgICBdID0gMTUwMDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfVl9QUkVEICAgXSA9IDE1MDA7Ci0gICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0hfUFJFRCAgIF0gPSAxNTAwOwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9CX1BSRUQgICBdID0gNTAwMDsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0xBU1RfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV01WICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRNViAgXSA9IDEwMDAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfR09MRF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEcgXSA9IDE1MDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gMTUwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJHICAgIF0gPSAxNTAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXRyAgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEcgICBdID0gMjAwMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9BTFRfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RBIF0gPSAxNTAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfWkVST0EgICAgXSA9IDE1MDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSQSAgICBdID0gMTUwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV0EgICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRBICAgXSA9IDIwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNwZWVkID4gMikKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1NQTElUR10gPSAxNTsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9TUExJVEFdID0gMTU7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRNVl0gPSA3OwotCi0gICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1RNICAgICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9WX1BSRUQgICBdID0gMjAwMDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfSF9QUkVEICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0JfUFJFRCAgIF0gPSA3NTAwOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfTEFTVF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXTVYgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVE1WICBdID0gMjUwMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk9HICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkcgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdHICAgICBdID0gMjUwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElURyAgIF0gPSA1MDAwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEEgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJBICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXQSAgICAgXSA9IDI1MDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEEgICBdID0gNTAwMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNmLT5pbXByb3ZlZF9xdWFudCA9IDA7Ci0gICAgICAgICAgICBzZi0+aW1wcm92ZWRfZGN0ID0gMDsKLQotICAgICAgICAgICAgLy8gT25seSBkbyByZWNvZGUgbG9vcCBvbiBrZXkgZnJhbWVzLCBnb2xkZW4gZnJhbWVzIGFuZAotICAgICAgICAgICAgLy8gYWx0IHJlZiBmcmFtZXMKLSAgICAgICAgICAgIHNmLT5yZWNvZGVfbG9vcCA9IDI7Ci0KLSAgICAgICAgICAgIHNmLT5mdWxsX2ZyZXFbMF0gPSAzMTsKLSAgICAgICAgICAgIHNmLT5mdWxsX2ZyZXFbMV0gPSA2MzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTcGVlZCA+IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRBICBdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRHICBdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRNViAgXSA9IElOVF9NQVg7Ci0KLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9WX1BSRURdID0gMDsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9IX1BSRURdID0gMDsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9CX1BSRURdID0gMDsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORUFSR10gPSAwOwotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV0ddID0gMDsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORUFSQV0gPSAwOwotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV0FdID0gMDsKLQotICAgICAgICAgICAgc2YtPmF1dG9fZmlsdGVyID0gMTsKLSAgICAgICAgICAgIHNmLT5yZWNvZGVfbG9vcCA9IDA7IC8vIHJlY29kZSBsb29wIG9mZgotICAgICAgICAgICAgc2YtPlJEID0gMDsgICAgICAgICAvLyBUdXJuIHJkIG9mZgotCi0gICAgICAgICAgICBzZi0+ZnVsbF9mcmVxWzBdID0gNjM7Ci0gICAgICAgICAgICBzZi0+ZnVsbF9mcmVxWzFdID0gMTI3OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNwZWVkID4gNCkKLSAgICAgICAgewotICAgICAgICAgICAgc2YtPmF1dG9fZmlsdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAvLyBGYXN0ZXIgc2VsZWN0aW9uIG9mIGxvb3AgZmlsdGVyCi0gICAgICAgICAgICBzZi0+ZnVsbF9mcmVxWzBdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT5mdWxsX2ZyZXFbMV0gPSBJTlRfTUFYOwotCi0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfVl9QUkVEXSA9IDI7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfSF9QUkVEXSA9IDI7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfQl9QUkVEXSA9IDI7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FQVJHXSA9IDI7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV0ddID0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORUFSQV0gPSAyOwotICAgICAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORVdBXSA9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk9HICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkcgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdHICAgICBdID0gNDAwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEEgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJBICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXQSAgICAgXSA9IDQwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgMjoKLSAgICAgICAgc2YtPm9wdGltaXplX2NvZWZmaWNpZW50cyA9IDA7Ci0gICAgICAgIHNmLT5yZWNvZGVfbG9vcCA9IDA7Ci0gICAgICAgIHNmLT5hdXRvX2ZpbHRlciA9IDE7Ci0gICAgICAgIHNmLT5pdGVyYXRpdmVfc3ViX3BpeGVsID0gMTsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUTVZdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPTVYgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9EQyAgICAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9UTSAgICAgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSTVYgICBdID0gMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9WX1BSRUQgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9IX1BSRUQgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9CX1BSRUQgICBdID0gMjUwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUQSBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSQSAgICBdID0gMTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdNViAgICBdID0gMjAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdHICAgICBdID0gMjAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdBICAgICBdID0gMjAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVE1WICBdID0gNTAwMDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEcgICBdID0gMTAwMDA7Ci0gICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRBICAgXSA9IDEwMDAwOwotICAgICAgICBzZi0+ZnVsbF9mcmVxWzBdID0gMTU7Ci0gICAgICAgIHNmLT5mdWxsX2ZyZXFbMV0gPSAzMTsKLSAgICAgICAgc2YtPnNlYXJjaF9tZXRob2QgPSBOU1RFUDsKLQotICAgICAgICBpZiAoU3BlZWQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRHXSA9IDQ7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRBXSA9IDQ7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRNVl0gPSAyOwotCi0gICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0RDICAgICAgIF0gPSAwOwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9UTSAgICAgICBdID0gMTAwMDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfVl9QUkVEICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX0hfUFJFRCAgIF0gPSAyMDAwOwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9CX1BSRUQgICBdID0gNTAwMDsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0xBU1RfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RNVl0gPSAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfWkVST01WICAgXSA9IDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSTVYgICBdID0gMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV01WICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRNViAgXSA9IDEwMDAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfR09MRF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEcgXSA9IDEwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gMTAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJHICAgIF0gPSAxMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXRyAgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEcgICBdID0gMjAwMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9BTFRfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RBIF0gPSAxMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfWkVST0EgICAgXSA9IDEwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSQSAgICBdID0gMTAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV0EgICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRBICAgXSA9IDIwMDAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZi0+aW1wcm92ZWRfcXVhbnQgPSAwOwotICAgICAgICAgICAgc2YtPmltcHJvdmVkX2RjdCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU3BlZWQgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfU1BMSVRNVl0gPSA3OwotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1NQTElUR10gPSAxNTsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9TUExJVEFdID0gMTU7Ci0KLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfVE0gICAgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1ZfUFJFRCAgIF0gPSAyMDAwOwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9IX1BSRUQgICBdID0gMjAwMDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfQl9QUkVEICAgXSA9IDUwMDA7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdNViAgICBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElUTVYgIF0gPSAyNTAwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0dPTERfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RHIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfWkVST0cgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV0cgICAgIF0gPSAyNTAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRHICAgXSA9IDUwMDAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUQSBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk9BICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkEgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdBICAgICBdID0gMjUwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElUQSAgIF0gPSA1MDAwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2YtPmZ1bGxfZnJlcVswXSA9IDMxOwotICAgICAgICAgICAgc2YtPmZ1bGxfZnJlcVsxXSA9IDYzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNwZWVkID4gMikKLSAgICAgICAgewotICAgICAgICAgICAgc2YtPmF1dG9fZmlsdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAvLyBGYXN0ZXIgc2VsZWN0aW9uIG9mIGxvb3AgZmlsdGVyCi0KLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9WX1BSRURdID0gMjsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9IX1BSRURdID0gMjsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9CX1BSRURdID0gMjsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0dPTERfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVBUkddID0gMjsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVXR10gPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FQVJBXSA9IDI7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV0FdID0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVE1WICBdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRHICBdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfU1BMSVRBICBdID0gSU5UX01BWDsKLQotICAgICAgICAgICAgc2YtPmZ1bGxfZnJlcVswXSA9IDYzOwotICAgICAgICAgICAgc2YtPmZ1bGxfZnJlcVsxXSA9IDEyNzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTcGVlZCA+IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNmLT5SRCA9IDA7Ci0gICAgICAgICAgICBzZi0+ZnVsbF9mcmVxWzBdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT5mdWxsX2ZyZXFbMV0gPSBJTlRfTUFYOwotCi0gICAgICAgICAgICBzZi0+YXV0b19maWx0ZXIgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNwZWVkID4gNCkKLSAgICAgICAgewotICAgICAgICAgICAgc2YtPmF1dG9fZmlsdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAvLyBGYXN0ZXIgc2VsZWN0aW9uIG9mIGxvb3AgZmlsdGVyCi0KLSNpZiBDT05GSUdfUkVBTFRJTUVfT05MWQotICAgICAgICAgICAgc2YtPnNlYXJjaF9tZXRob2QgPSBIRVg7Ci0jZWxzZQotICAgICAgICAgICAgc2YtPnNlYXJjaF9tZXRob2QgPSBESUFNT05EOwotI2VuZGlmCi0gICAgICAgICAgICBzZi0+aXRlcmF0aXZlX3N1Yl9waXhlbCA9IDA7Ci0KLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9WX1BSRURdID0gNDsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9IX1BSRURdID0gNDsKLSAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9CX1BSRURdID0gNDsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0dPTERfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVBUkddID0gMjsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVXR10gPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FQVJBXSA9IDI7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV0FdID0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9UTSAgICAgICBdID0gMjAwMDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfQl9QUkVEICAgXSA9IDUwMDA7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk9HICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkcgICAgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdHICAgICBdID0gNDAwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0FMVF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEEgXSA9IDIwMDA7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPQSAgICBdID0gMjAwMDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJBICAgIF0gPSAyMDAwOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXQSAgICAgXSA9IDQwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU3BlZWQgPiA1KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBEaXNhYmxlIHNwbGl0IE1CIGludHJhIHByZWRpY3Rpb24gbW9kZQotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9CX1BSRURdID0gSU5UX01BWDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTcGVlZCA+IDYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBpLCBzdW0gPSAwOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IHRvdGFsX21icyA9IGNtLT5NQnM7Ci0gICAgICAgICAgICBpbnQgdGhyZXNoOwotICAgICAgICAgICAgaW50IHRvdGFsX3NraXA7Ci0KLSAgICAgICAgICAgIGludCBtaW4gPSAyMDAwOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5veGNmLmVuY29kZV9icmVha291dCA+IDIwMDApCi0gICAgICAgICAgICAgICAgbWluID0gY3BpLT5veGNmLmVuY29kZV9icmVha291dDsKLQotICAgICAgICAgICAgbWluID4+PSA3OwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtICs9IGNwaS0+ZXJyb3JfYmluc1tpXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG90YWxfc2tpcCA9IHN1bTsKLSAgICAgICAgICAgIHN1bSA9IDA7Ci0KLSAgICAgICAgICAgIC8vIGkgc3RhcnRzIGZyb20gMiB0byBtYWtlIHN1cmUgdGhyZXNoIHN0YXJ0ZWQgZnJvbSAyMDQ4Ci0gICAgICAgICAgICBmb3IgKDsgaSA8IDEwMjQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdW0gKz0gY3BpLT5lcnJvcl9iaW5zW2ldOwotCi0gICAgICAgICAgICAgICAgaWYgKDEwICogc3VtID49ICh1bnNpZ25lZCBpbnQpKGNwaS0+U3BlZWQgLSA2KSoodG90YWxfbWJzIC0gdG90YWxfc2tpcCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICB0aHJlc2ggPSAoaSA8PCA3KTsKLQotICAgICAgICAgICAgaWYgKHRocmVzaCA8IDIwMDApCi0gICAgICAgICAgICAgICAgdGhyZXNoID0gMjAwMDsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0xBU1RfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV01WXSA9IHRocmVzaDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RNViBdID0gdGhyZXNoID4+IDE7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSTVYgICAgXSA9IHRocmVzaCA+PiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfR09MRF9GTEFHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVXR10gPSB0aHJlc2ggPDwgMTsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RHIF0gPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gdGhyZXNoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdBXSA9IHRocmVzaCA8PCAxOwotICAgICAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfTkVBUkVTVEEgXSA9IHRocmVzaDsKLSAgICAgICAgICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJBICAgIF0gPSB0aHJlc2g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERpc2FibGUgb3RoZXIgaW50cmEgcHJlZGljdGlvbiBtb2RlcwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9UTV0gPSBJTlRfTUFYOwotICAgICAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9WX1BSRURdID0gSU5UX01BWDsKLSAgICAgICAgICAgIHNmLT50aHJlc2hfbXVsdFtUSFJfSF9QUkVEXSA9IElOVF9NQVg7Ci0KLSAgICAgICAgICAgIHNmLT5pbXByb3ZlZF9tdl9wcmVkID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTcGVlZCA+IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNmLT5xdWFydGVyX3BpeGVsX3NlYXJjaCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU3BlZWQgPiA5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgVG1wID0gY3BpLT5TcGVlZCAtIDg7Ci0KLSAgICAgICAgICAgIGlmIChUbXAgPiA0KQotICAgICAgICAgICAgICAgIFRtcCA9IDQ7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX1pFUk9HXSA9IDEgPDwgKFRtcCAtIDEpOwotICAgICAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORUFSRVNUR10gPSAxIDw8IChUbXAgLSAxKTsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVBUkddID0gMSA8PCBUbXA7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV0ddID0gMSA8PCAoVG1wICsgMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9BTFRfRkxBRykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfWkVST0FdID0gMSA8PCAoVG1wIC0gMSk7Ci0gICAgICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FQVJFU1RBXSA9IDEgPDwgKFRtcCAtIDEpOwotICAgICAgICAgICAgICAgIGNwaS0+bW9kZV9jaGVja19mcmVxW1RIUl9ORUFSQV0gPSAxIDw8IFRtcDsKLSAgICAgICAgICAgICAgICBjcGktPm1vZGVfY2hlY2tfZnJlcVtUSFJfTkVXQV0gPSAxIDw8IChUbXAgKyAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3BpLT5tb2RlX2NoZWNrX2ZyZXFbVEhSX05FV01WXSA9IDEgPDwgKFRtcCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgY20tPmZpbHRlcl90eXBlID0gTk9STUFMX0xPT1BGSUxURVI7Ci0KLSAgICAgICAgaWYgKFNwZWVkID49IDE0KQotICAgICAgICAgICAgY20tPmZpbHRlcl90eXBlID0gU0lNUExFX0xPT1BGSUxURVI7Ci0KLSAgICAgICAgaWYgKFNwZWVkID49IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBzZi0+aGFsZl9waXhlbF9zZWFyY2ggPSAwOyAgICAgICAgLy8gVGhpcyBoYXMgYSBiaWcgaGl0IG9uIHF1YWxpdHkuIExhc3QgcmVzb3J0Ci0gICAgICAgIH0KLQotICAgICAgICB2cHhfbWVtc2V0KGNwaS0+ZXJyb3JfYmlucywgMCwgc2l6ZW9mKGNwaS0+ZXJyb3JfYmlucykpOwotCi0gICAgfTsgLyogc3dpdGNoICovCi0KLSAgICAvKiBkaXNhYmxlIGZyYW1lIG1vZGVzIGlmIGZsYWdzIG5vdCBzZXQgKi8KLSAgICBpZiAoIShjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZMQUcpKQotICAgIHsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdNViAgICBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNUTVZdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPTVYgICBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSTVYgICBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVE1WICBdID0gSU5UX01BWDsKLSAgICB9Ci0KLSAgICBpZiAoIShjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpKQotICAgIHsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRVNURyBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9aRVJPRyAgICBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORUFSRyAgICBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9ORVdHICAgICBdID0gSU5UX01BWDsKLSAgICAgICAgc2YtPnRocmVzaF9tdWx0W1RIUl9TUExJVEcgICBdID0gSU5UX01BWDsKLSAgICB9Ci0KLSAgICBpZiAoIShjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9BTFRfRkxBRykpCi0gICAgewotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJFU1RBIF0gPSBJTlRfTUFYOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1pFUk9BICAgIF0gPSBJTlRfTUFYOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FQVJBICAgIF0gPSBJTlRfTUFYOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX05FV0EgICAgIF0gPSBJTlRfTUFYOwotICAgICAgICBzZi0+dGhyZXNoX211bHRbVEhSX1NQTElUQSAgIF0gPSBJTlRfTUFYOwotICAgIH0KLQotCi0gICAgLy8gU2xvdyBxdWFudCwgZGN0IGFuZCB0cmVsbGlzIG5vdCB3b3J0aHdoaWxlIGZvciBmaXJzdCBwYXNzCi0gICAgLy8gc28gbWFrZSBzdXJlIHRoZXkgYXJlIGFsd2F5cyB0dXJuZWQgb2ZmLgotICAgIGlmICggY3BpLT5wYXNzID09IDEgKQotICAgIHsKLSAgICAgICAgc2YtPmltcHJvdmVkX3F1YW50ID0gMDsKLSAgICAgICAgc2YtPm9wdGltaXplX2NvZWZmaWNpZW50cyA9IDA7Ci0gICAgICAgIHNmLT5pbXByb3ZlZF9kY3QgPSAwOwotICAgIH0KLQotICAgIGlmIChjcGktPnNmLnNlYXJjaF9tZXRob2QgPT0gTlNURVApCi0gICAgewotICAgICAgICB2cDhfaW5pdDNzbW90aW9uX2NvbXBlbnNhdGlvbigmY3BpLT5tYiwgY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLnlfc3RyaWRlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3BpLT5zZi5zZWFyY2hfbWV0aG9kID09IERJQU1PTkQpCi0gICAgewotICAgICAgICB2cDhfaW5pdF9kc21vdGlvbl9jb21wZW5zYXRpb24oJmNwaS0+bWIsIGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS55X3N0cmlkZSk7Ci0gICAgfQotCi0gICAgaWYgKGNwaS0+c2YuaW1wcm92ZWRfZGN0KQotICAgIHsKLSAgICAgICAgY3BpLT5tYi52cDhfc2hvcnRfZmRjdDh4NCA9IEZEQ1RfSU5WT0tFKCZjcGktPnJ0Y2QuZmRjdCwgc2hvcnQ4eDQpOwotICAgICAgICBjcGktPm1iLnZwOF9zaG9ydF9mZGN0NHg0ID0gRkRDVF9JTlZPS0UoJmNwaS0+cnRjZC5mZGN0LCBzaG9ydDR4NCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNwaS0+bWIudnA4X3Nob3J0X2ZkY3Q4eDQgICA9IEZEQ1RfSU5WT0tFKCZjcGktPnJ0Y2QuZmRjdCwgZmFzdDh4NCk7Ci0gICAgICAgIGNwaS0+bWIudnA4X3Nob3J0X2ZkY3Q0eDQgICA9IEZEQ1RfSU5WT0tFKCZjcGktPnJ0Y2QuZmRjdCwgZmFzdDR4NCk7Ci0gICAgfQotCi0gICAgY3BpLT5tYi5zaG9ydF93YWxzaDR4NCA9IEZEQ1RfSU5WT0tFKCZjcGktPnJ0Y2QuZmRjdCwgd2Fsc2hfc2hvcnQ0eDQpOwotCi0gICAgaWYgKGNwaS0+c2YuaW1wcm92ZWRfcXVhbnQpCi0gICAgewotICAgICAgICBjcGktPm1iLnF1YW50aXplX2IgICAgPSBRVUFOVElaRV9JTlZPS0UoJmNwaS0+cnRjZC5xdWFudGl6ZSwgcXVhbnRiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3BpLT5tYi5xdWFudGl6ZV9iICAgICAgPSBRVUFOVElaRV9JTlZPS0UoJmNwaS0+cnRjZC5xdWFudGl6ZSwgZmFzdHF1YW50Yik7Ci0gICAgfQotICAgIGlmIChjcGktPnNmLmltcHJvdmVkX3F1YW50ICE9IGxhc3RfaW1wcm92ZWRfcXVhbnQpCi0gICAgICAgIHZwOGN4X2luaXRfcXVhbnRpemVyKGNwaSk7Ci0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgY3BpLT5tYi5lX21iZC5ydGNkID0gJmNwaS0+Y29tbW9uLnJ0Y2Q7Ci0jZW5kaWYKLQotICAgIGlmIChjcGktPnNmLml0ZXJhdGl2ZV9zdWJfcGl4ZWwgPT0gMSkKLSAgICB7Ci0gICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAgPSB2cDhfZmluZF9iZXN0X3N1Yl9waXhlbF9zdGVwX2l0ZXJhdGl2ZWx5OwotICAgIH0KLSAgICBlbHNlIGlmIChjcGktPnNmLnF1YXJ0ZXJfcGl4ZWxfc2VhcmNoKQotICAgIHsKLSAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCA9IHZwOF9maW5kX2Jlc3Rfc3ViX3BpeGVsX3N0ZXA7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNwaS0+c2YuaGFsZl9waXhlbF9zZWFyY2gpCi0gICAgewotICAgICAgICBjcGktPmZpbmRfZnJhY3Rpb25hbF9tdl9zdGVwID0gdnA4X2ZpbmRfYmVzdF9oYWxmX3BpeGVsX3N0ZXA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAgPSB2cDhfc2tpcF9mcmFjdGlvbmFsX212X3N0ZXA7Ci0gICAgfQotCi0gICAgaWYgKGNwaS0+c2Yub3B0aW1pemVfY29lZmZpY2llbnRzID09IDEpCi0gICAgICAgIGNwaS0+bWIub3B0aW1pemUgPSAxICsgY3BpLT5pc19uZXh0X3NyY19hbHRfcmVmOwotICAgIGVsc2UKLSAgICAgICAgY3BpLT5tYi5vcHRpbWl6ZSA9IDA7Ci0KLSAgICBpZiAoY3BpLT5jb21tb24uZnVsbF9waXhlbCkKLSAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCA9IHZwOF9za2lwX2ZyYWN0aW9uYWxfbXZfc3RlcDsKLQotI2lmZGVmIFNQRUVEU1RBVFMKLSAgICBmcmFtZXNfYXRfc3BlZWRbY3BpLT5TcGVlZF0rKzsKLSNlbmRpZgotfQotc3RhdGljIHZvaWQgYWxsb2NfcmF3X2ZyYW1lX2J1ZmZlcnMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBpbnQgaSwgYnVmZmVyczsKLSAgICAvKiBhbGxvY2F0ZSBzb3VyY2VfYnVmZmVyIHRvIGJlIG11bHRpcGxlcyBvZiAxNiAqLwotICAgIGludCB3aWR0aCA9IChjcGktPm94Y2YuV2lkdGggKyAxNSkgJiB+MTU7Ci0KLSAgICBidWZmZXJzID0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXM7Ci0KLSAgICBpZiAoYnVmZmVycyA+IE1BWF9MQUdfQlVGRkVSUykKLSAgICAgICAgYnVmZmVycyA9IE1BWF9MQUdfQlVGRkVSUzsKLQotICAgIGlmIChidWZmZXJzIDwgMSkKLSAgICAgICAgYnVmZmVycyA9IDE7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyczsgaSsrKQotICAgICAgICBpZiAodnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKCZjcGktPnNyY19idWZmZXJbaV0uc291cmNlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgY3BpLT5veGNmLkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNikpCi0gICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbGFnIGJ1ZmZlciIpOwotCi0jaWYgVlA4X1RFTVBPUkFMX0FMVF9SRUYKLQotICAgIGlmICh2cDhfeXYxMl9hbGxvY19mcmFtZV9idWZmZXIoJmNwaS0+YWx0X3JlZl9idWZmZXIuc291cmNlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBjcGktPm94Y2YuSGVpZ2h0LCAxNikpCi0gICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmY3BpLT5jb21tb24uZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGFsdHJlZiBidWZmZXIiKTsKLQotI2VuZGlmCi0KLSAgICBjcGktPnNvdXJjZV9idWZmZXJfY291bnQgPSAwOwotfQotCi1zdGF0aWMgaW50IHZwOF9hbGxvY19wYXJ0aXRpb25fZGF0YShWUDhfQ09NUCAqY3BpKQotewotICAgICAgICB2cHhfZnJlZShjcGktPm1iLnBpcCk7Ci0KLSAgICBjcGktPm1iLnBpcCA9IHZweF9jYWxsb2MoKGNwaS0+Y29tbW9uLm1iX2NvbHMgKyAxKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPmNvbW1vbi5tYl9yb3dzICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQQVJUSVRJT05fSU5GTykpOwotICAgIGlmKCFjcGktPm1iLnBpcCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjcGktPm1iLnBpID0gY3BpLT5tYi5waXAgKyBjcGktPmNvbW1vbi5tb2RlX2luZm9fc3RyaWRlICsgMTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIHZwOF9hbGxvY19jb21wcmVzc29yX2RhdGEoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICYgY3BpLT5jb21tb247Ci0KLSAgICBpbnQgd2lkdGggPSBjbS0+V2lkdGg7Ci0gICAgaW50IGhlaWdodCA9IGNtLT5IZWlnaHQ7Ci0KLSAgICBpZiAodnA4X2FsbG9jX2ZyYW1lX2J1ZmZlcnMoY20sIHdpZHRoLCBoZWlnaHQpKQotICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXJzIik7Ci0KLSAgICBpZiAodnA4X2FsbG9jX3BhcnRpdGlvbl9kYXRhKGNwaSkpCi0gICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmY3BpLT5jb21tb24uZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHBhcnRpdGlvbiBkYXRhIik7Ci0KLQotICAgIGlmICgod2lkdGggJiAweGYpICE9IDApCi0gICAgICAgIHdpZHRoICs9IDE2IC0gKHdpZHRoICYgMHhmKTsKLQotICAgIGlmICgoaGVpZ2h0ICYgMHhmKSAhPSAwKQotICAgICAgICBoZWlnaHQgKz0gMTYgLSAoaGVpZ2h0ICYgMHhmKTsKLQotCi0gICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5sYXN0X2ZyYW1lX3VmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgVlA4Qk9SREVSSU5QSVhFTFMpKQotICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBsYXN0IGZyYW1lIGJ1ZmZlciIpOwotCi0gICAgaWYgKHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcigmY3BpLT5zY2FsZWRfc291cmNlLCB3aWR0aCwgaGVpZ2h0LCAxNikpCi0gICAgICAgIHZweF9pbnRlcm5hbF9lcnJvcigmY3BpLT5jb21tb24uZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHNjYWxlZCBzb3VyY2UgYnVmZmVyIik7Ci0KLQotICAgICAgICB2cHhfZnJlZShjcGktPnRvayk7Ci0KLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0b2tlbnMgPSBjbS0+bWJfcm93cyAqIGNtLT5tYl9jb2xzICogMjQgKiAxNjsKLQotICAgICAgICBDSEVDS19NRU1fRVJST1IoY3BpLT50b2ssIHZweF9jYWxsb2ModG9rZW5zLCBzaXplb2YoKmNwaS0+dG9rKSkpOwotICAgIH0KLQotICAgIC8vIERhdGEgdXNlZCBmb3IgcmVhbCB0aW1lIHZjIG1vZGUgdG8gc2VlIGlmIGdmIG5lZWRzIHJlZnJlc2hpbmcKLSAgICBjcGktPmludGVyX3p6X2NvdW50ID0gMDsKLSAgICBjcGktPmdmX2JhZF9jb3VudCA9IDA7Ci0gICAgY3BpLT5nZl91cGRhdGVfcmVjb21tZW5kZWQgPSAwOwotCi0KLSAgICAvLyBTdHJ1Y3R1cmVzIHVzZWQgdG8gbWluaXRvciBHRiB1c2FnZQotICAgICAgICB2cHhfZnJlZShjcGktPmdmX2FjdGl2ZV9mbGFncyk7Ci0KLSAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5nZl9hY3RpdmVfZmxhZ3MsIHZweF9jYWxsb2MoMSwgY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scykpOwotCi0gICAgY3BpLT5nZl9hY3RpdmVfY291bnQgPSBjbS0+bWJfcm93cyAqIGNtLT5tYl9jb2xzOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICAgICAgdnB4X2ZyZWUoY3BpLT50b3RhbF9zdGF0cyk7Ci0KLSAgICBjcGktPnRvdGFsX3N0YXRzID0gdnB4X2NhbGxvYygxLCBzaXplb2YoRklSU1RQQVNTX1NUQVRTKSk7Ci0KLSAgICAgICAgdnB4X2ZyZWUoY3BpLT50aGlzX2ZyYW1lX3N0YXRzKTsKLQotICAgIGNwaS0+dGhpc19mcmFtZV9zdGF0cyA9IHZweF9jYWxsb2MoMSwgc2l6ZW9mKEZJUlNUUEFTU19TVEFUUykpOwotCi0gICAgaWYoIWNwaS0+dG90YWxfc3RhdHMgfHwgIWNwaS0+dGhpc19mcmFtZV9zdGF0cykKLSAgICAgICAgdnB4X2ludGVybmFsX2Vycm9yKCZjcGktPmNvbW1vbi5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlyc3RwYXNzIHN0YXRzIik7Ci0jZW5kaWYKLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgIGlmICh3aWR0aCA8IDY0MCkKLSAgICAgICAgY3BpLT5tdF9zeW5jX3JhbmdlID0gMTsKLSAgICBlbHNlIGlmICh3aWR0aCA8PSAxMjgwKQotICAgICAgICBjcGktPm10X3N5bmNfcmFuZ2UgPSA0OwotICAgIGVsc2UgaWYgKHdpZHRoIDw9IDI1NjApCi0gICAgICAgIGNwaS0+bXRfc3luY19yYW5nZSA9IDg7Ci0gICAgZWxzZQotICAgICAgICBjcGktPm10X3N5bmNfcmFuZ2UgPSAxNjsKLSNlbmRpZgotCi0gICAgICAgIHZweF9mcmVlKGNwaS0+dHBsaXN0KTsKLQotICAgIENIRUNLX01FTV9FUlJPUihjcGktPnRwbGlzdCwgdnB4X21hbGxvYyhzaXplb2YoVE9LRU5MSVNUKSAqIGNwaS0+Y29tbW9uLm1iX3Jvd3MpKTsKLX0KLQotCi0vLyBRdWFudCBNT0QKLXN0YXRpYyBjb25zdCBpbnQgcV90cmFuc1tdID0KLXsKLSAgICAwLCAgIDEsICAyLCAgMywgIDQsICA1LCAgNywgIDgsCi0gICAgOSwgIDEwLCAxMiwgMTMsIDE1LCAxNywgMTgsIDE5LAotICAgIDIwLCAgMjEsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCi0gICAgMjksICAzMCwgMzEsIDMzLCAzNSwgMzcsIDM5LCA0MSwKLSAgICA0MywgIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsIDU3LAotICAgIDU5LCAgNjEsIDY0LCA2NywgNzAsIDczLCA3NiwgNzksCi0gICAgODIsICA4NSwgODgsIDkxLCA5NCwgOTcsIDEwMCwgMTAzLAotICAgIDEwNiwgMTA5LCAxMTIsIDExNSwgMTE4LCAxMjEsIDEyNCwgMTI3LAotfTsKLQotaW50IHZwOF9yZXZlcnNlX3RyYW5zKGludCB4KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgIGlmIChxX3RyYW5zW2ldID49IHgpCi0gICAgICAgICAgICByZXR1cm4gaTsKLQotICAgIHJldHVybiA2MzsKLX07Ci12b2lkIHZwOF9uZXdfZnJhbWVfcmF0ZShWUDhfQ09NUCAqY3BpLCBkb3VibGUgZnJhbWVyYXRlKQotewotICAgIGlmKGZyYW1lcmF0ZSA8IC4xKQotICAgICAgICBmcmFtZXJhdGUgPSAzMDsKLQotICAgIGNwaS0+b3hjZi5mcmFtZV9yYXRlICAgICAgICAgICAgID0gZnJhbWVyYXRlOwotICAgIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUgICAgICAgICAgICA9IGNwaS0+b3hjZi5mcmFtZV9yYXRlOwotICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAgICAgICAgICA9IChpbnQpKGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSk7Ci0gICAgY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoICAgICAgICA9IChpbnQpKGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSk7Ci0gICAgY3BpLT5taW5fZnJhbWVfYmFuZHdpZHRoICAgICAgICAgID0gKGludCkoY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoICogY3BpLT5veGNmLnR3b19wYXNzX3Zicm1pbl9zZWN0aW9uIC8gMTAwKTsKLQotICAgIC8vIFNldCBNYXhpbXVtIGdmL2FyZiBpbnRlcnZhbAotICAgIGNwaS0+bWF4X2dmX2ludGVydmFsID0gKChpbnQpKGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUgLyAyLjApICsgMik7Ci0KLSAgICBpZihjcGktPm1heF9nZl9pbnRlcnZhbCA8IDEyKQotICAgICAgICBjcGktPm1heF9nZl9pbnRlcnZhbCA9IDEyOwotCi0gICAgLy8gRXh0ZW5kZWQgaW50ZXJ2YWwgZm9yIGdlbnVpbmVseSBzdGF0aWMgc2NlbmVzCi0gICAgY3BpLT5zdGF0aWNfc2NlbmVfbWF4X2dmX2ludGVydmFsID0gY3BpLT5rZXlfZnJhbWVfZnJlcXVlbmN5ID4+IDE7Ci0KLSAgICAgLy8gU3BlY2lhbCBjb25kaXRpb25zIHdoZW4gYWx0ciByZWYgZnJhbWUgZW5hYmxlZCBpbiBsYWdnZWQgY29tcHJlc3MgbW9kZQotICAgIGlmIChjcGktPm94Y2YucGxheV9hbHRlcm5hdGUgJiYgY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMpCi0gICAgewotICAgICAgICBpZiAoY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgPiBjcGktPm94Y2YubGFnX2luX2ZyYW1lcyAtIDEpCi0gICAgICAgICAgICBjcGktPm1heF9nZl9pbnRlcnZhbCA9IGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzIC0gMTsKLQotICAgICAgICBpZiAoY3BpLT5zdGF0aWNfc2NlbmVfbWF4X2dmX2ludGVydmFsID4gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgLSAxKQotICAgICAgICAgICAgY3BpLT5zdGF0aWNfc2NlbmVfbWF4X2dmX2ludGVydmFsID0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgLSAxOwotICAgIH0KLQotICAgIGlmICggY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgPiBjcGktPnN0YXRpY19zY2VuZV9tYXhfZ2ZfaW50ZXJ2YWwgKQotICAgICAgICBjcGktPm1heF9nZl9pbnRlcnZhbCA9IGNwaS0+c3RhdGljX3NjZW5lX21heF9nZl9pbnRlcnZhbDsKLX0KLQotCi1zdGF0aWMgaW50Ci1yZXNjYWxlKGludCB2YWwsIGludCBudW0sIGludCBkZW5vbSkKLXsKLSAgICBpbnQ2NF90IGxsbnVtID0gbnVtOwotICAgIGludDY0X3QgbGxkZW4gPSBkZW5vbTsKLSAgICBpbnQ2NF90IGxsdmFsID0gdmFsOwotCi0gICAgcmV0dXJuIGxsdmFsICogbGxudW0gLyBsbGRlbjsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbml0X2NvbmZpZyhWUDhfUFRSIHB0ciwgVlA4X0NPTkZJRyAqb3hjZikKLXsKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopKHB0cik7Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0KLSAgICBjcGktPm94Y2YgPSAqb3hjZjsKLQotICAgIGNwaS0+YXV0b19nb2xkID0gMTsKLSAgICBjcGktPmF1dG9fYWRqdXN0X2dvbGRfcXVhbnRpemVyID0gMTsKLSAgICBjcGktPmdvbGRxdWFudGl6ZXIgPSAxOwotICAgIGNwaS0+Z29sZGZyZXEgPSA3OwotICAgIGNwaS0+YXV0b19hZGp1c3Rfa2V5X3F1YW50aXplciA9IDE7Ci0gICAgY3BpLT5rZXlxdWFudGl6ZXIgPSAxOwotCi0gICAgY20tPnZlcnNpb24gPSBveGNmLT5WZXJzaW9uOwotICAgIHZwOF9zZXR1cF92ZXJzaW9uKGNtKTsKLQotICAgIC8vIGNoYW5nZSBpbmNsdWRlcyBhbGwgam9pbnQgZnVuY3Rpb25hbGl0eQotICAgIHZwOF9jaGFuZ2VfY29uZmlnKHB0ciwgb3hjZik7Ci0KLSAgICAvLyBJbml0aWFsaXplIGFjdGl2ZSBiZXN0IGFuZCB3b3JzdCBxIGFuZCBhdmVyYWdlIHEgdmFsdWVzLgotICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgICAgICAgICA9IGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3E7Ci0gICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ICAgICAgICAgID0gY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xOwotICAgIGNwaS0+YXZnX2ZyYW1lX3FpbmRleCAgICAgICAgICAgICA9IGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3E7Ci0KLSAgICAvLyBJbml0aWFsaXNlIHRoZSBzdGFydGluZyBidWZmZXIgbGV2ZWxzCi0gICAgY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbCA9Ci0gICAgICAgIHJlc2NhbGUoY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbCwKLSAgICAgICAgICAgICAgICBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCwgMTAwMCk7Ci0KLSAgICBjcGktPmJ1ZmZlcl9sZXZlbCAgICAgICAgICAgICAgICAgPSBjcGktPm94Y2Yuc3RhcnRpbmdfYnVmZmVyX2xldmVsOwotICAgIGNwaS0+Yml0c19vZmZfdGFyZ2V0ICAgICAgICAgICAgICA9IGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWw7Ci0KLSAgICBjcGktPnJvbGxpbmdfdGFyZ2V0X2JpdHMgICAgICAgICAgPSBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGg7Ci0gICAgY3BpLT5yb2xsaW5nX2FjdHVhbF9iaXRzICAgICAgICAgID0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOwotICAgIGNwaS0+bG9uZ19yb2xsaW5nX3RhcmdldF9iaXRzICAgICA9IGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aDsKLSAgICBjcGktPmxvbmdfcm9sbGluZ19hY3R1YWxfYml0cyAgICAgPSBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGg7Ci0KLSAgICBjcGktPnRvdGFsX2FjdHVhbF9iaXRzICAgICAgICAgICAgPSAwOwotICAgIGNwaS0+dG90YWxfdGFyZ2V0X3ZzX2FjdHVhbCAgICAgICA9IDA7Ci0KLSNpZiBWUDhfVEVNUE9SQUxfQUxUX1JFRgotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgY3BpLT5maXhlZF9kaXZpZGVbMF0gPSAwOwotCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCA1MTI7IGkrKykKLSAgICAgICAgICAgIGNwaS0+Zml4ZWRfZGl2aWRlW2ldID0gMHg4MDAwMCAvIGk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLQotdm9pZCB2cDhfY2hhbmdlX2NvbmZpZyhWUDhfUFRSIHB0ciwgVlA4X0NPTkZJRyAqb3hjZikKLXsKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopKHB0cik7Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0KLSAgICBpZiAoIWNwaSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFveGNmKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoY20tPnZlcnNpb24gIT0gb3hjZi0+VmVyc2lvbikKLSAgICB7Ci0gICAgICAgIGNtLT52ZXJzaW9uID0gb3hjZi0+VmVyc2lvbjsKLSAgICAgICAgdnA4X3NldHVwX3ZlcnNpb24oY20pOwotICAgIH0KLQotICAgIGNwaS0+b3hjZiA9ICpveGNmOwotCi0gICAgc3dpdGNoIChjcGktPm94Y2YuTW9kZSkKLSAgICB7Ci0KLSAgICBjYXNlIE1PREVfUkVBTFRJTUU6Ci0gICAgICAgIGNwaS0+cGFzcyA9IDA7Ci0gICAgICAgIGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9IDI7Ci0KLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA8IC0xNikKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5veGNmLmNwdV91c2VkID0gLTE2OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA+IDE2KQotICAgICAgICAgICAgY3BpLT5veGNmLmNwdV91c2VkID0gMTY7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotICAgIGNhc2UgTU9ERV9HT09EUVVBTElUWToKLSAgICAgICAgY3BpLT5wYXNzID0gMDsKLSAgICAgICAgY3BpLT5jb21wcmVzc29yX3NwZWVkID0gMTsKLQotICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkIDwgLTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+b3hjZi5jcHVfdXNlZCA9IC01OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNwaS0+b3hjZi5jcHVfdXNlZCA+IDUpCi0gICAgICAgICAgICBjcGktPm94Y2YuY3B1X3VzZWQgPSA1OwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNT0RFX0JFU1RRVUFMSVRZOgotICAgICAgICBjcGktPnBhc3MgPSAwOwotICAgICAgICBjcGktPmNvbXByZXNzb3Jfc3BlZWQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTU9ERV9GSVJTVFBBU1M6Ci0gICAgICAgIGNwaS0+cGFzcyA9IDE7Ci0gICAgICAgIGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9TRUNPTkRQQVNTOgotICAgICAgICBjcGktPnBhc3MgPSAyOwotICAgICAgICBjcGktPmNvbXByZXNzb3Jfc3BlZWQgPSAxOwotCi0gICAgICAgIGlmIChjcGktPm94Y2YuY3B1X3VzZWQgPCAtNSkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5veGNmLmNwdV91c2VkID0gLTU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3BpLT5veGNmLmNwdV91c2VkID4gNSkKLSAgICAgICAgICAgIGNwaS0+b3hjZi5jcHVfdXNlZCA9IDU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX1NFQ09ORFBBU1NfQkVTVDoKLSAgICAgICAgY3BpLT5wYXNzID0gMjsKLSAgICAgICAgY3BpLT5jb21wcmVzc29yX3NwZWVkID0gMDsKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBpZiAoY3BpLT5wYXNzID09IDApCi0gICAgICAgIGNwaS0+YXV0b193b3JzdF9xID0gMTsKLQotICAgIGNwaS0+b3hjZi53b3JzdF9hbGxvd2VkX3EgPSBxX3RyYW5zW294Y2YtPndvcnN0X2FsbG93ZWRfcV07Ci0gICAgY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xID0gcV90cmFuc1tveGNmLT5iZXN0X2FsbG93ZWRfcV07Ci0gICAgY3BpLT5veGNmLmNxX2xldmVsID0gcV90cmFuc1tjcGktPm94Y2YuY3FfbGV2ZWxdOwotCi0gICAgaWYgKG94Y2YtPmZpeGVkX3EgPj0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChveGNmLT53b3JzdF9hbGxvd2VkX3EgPCAwKQotICAgICAgICAgICAgY3BpLT5veGNmLmZpeGVkX3EgPSBxX3RyYW5zWzBdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjcGktPm94Y2YuZml4ZWRfcSA9IHFfdHJhbnNbb3hjZi0+d29yc3RfYWxsb3dlZF9xXTsKLQotICAgICAgICBpZiAob3hjZi0+YWx0X3EgPCAwKQotICAgICAgICAgICAgY3BpLT5veGNmLmFsdF9xID0gcV90cmFuc1swXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3BpLT5veGNmLmFsdF9xID0gcV90cmFuc1tveGNmLT5hbHRfcV07Ci0KLSAgICAgICAgaWYgKG94Y2YtPmtleV9xIDwgMCkKLSAgICAgICAgICAgIGNwaS0+b3hjZi5rZXlfcSA9IHFfdHJhbnNbMF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNwaS0+b3hjZi5rZXlfcSA9IHFfdHJhbnNbb3hjZi0+a2V5X3FdOwotCi0gICAgICAgIGlmIChveGNmLT5nb2xkX3EgPCAwKQotICAgICAgICAgICAgY3BpLT5veGNmLmdvbGRfcSA9IHFfdHJhbnNbMF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNwaS0+b3hjZi5nb2xkX3EgPSBxX3RyYW5zW294Y2YtPmdvbGRfcV07Ci0KLSAgICB9Ci0KLSAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0KLSAgICAgICAgY3BpLT5veGNmLmFsdF9mcmVxID8gY3BpLT5veGNmLmFsdF9mcmVxIDogREVGQVVMVF9HRl9JTlRFUlZBTDsKLQotICAgIGNwaS0+cmVmX2ZyYW1lX2ZsYWdzID0gVlA4X0FMVF9GTEFHIHwgVlA4X0dPTERfRkxBRyB8IFZQOF9MQVNUX0ZMQUc7Ci0KLSAgICAvL2NwaS0+dXNlX2dvbGRlbl9mcmFtZV9vbmx5ID0gMDsKLSAgICAvL2NwaS0+dXNlX2xhc3RfZnJhbWVfb25seSA9IDA7Ci0gICAgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gMDsKLSAgICBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMTsKLSAgICBjbS0+cmVmcmVzaF9lbnRyb3B5X3Byb2JzID0gMTsKLQotICAgIGlmIChjcGktPm94Y2YudG9rZW5fcGFydGl0aW9ucyA+PSAwICYmIGNwaS0+b3hjZi50b2tlbl9wYXJ0aXRpb25zIDw9IDMpCi0gICAgICAgIGNtLT5tdWx0aV90b2tlbl9wYXJ0aXRpb24gPQotICAgICAgICAgICAgKFRPS0VOX1BBUlRJVElPTikgY3BpLT5veGNmLnRva2VuX3BhcnRpdGlvbnM7Ci0KLSAgICBzZXR1cF9mZWF0dXJlcyhjcGkpOwotCi0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01CX1NFR01FTlRTOyBpKyspCi0gICAgICAgICAgICBjcGktPnNlZ21lbnRfZW5jb2RlX2JyZWFrb3V0W2ldID0gY3BpLT5veGNmLmVuY29kZV9icmVha291dDsKLSAgICB9Ci0KLSAgICAvLyBBdCB0aGUgbW9tZW50IHRoZSBmaXJzdCBvcmRlciB2YWx1ZXMgbWF5IG5vdCBiZSA+IE1BWFEKLSAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPiBNQVhRKQotICAgICAgICBjcGktPm94Y2YuZml4ZWRfcSA9IE1BWFE7Ci0KLSAgICAvLyBsb2NhbCBmaWxlIHBsYXliYWNrIG1vZGUgPT0gcmVhbGx5IGJpZyBidWZmZXIKLSAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9MT0NBTF9GSUxFX1BMQVlCQUNLKQotICAgIHsKLSAgICAgICAgY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbCAgID0gNjAwMDA7Ci0gICAgICAgIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAgICA9IDYwMDAwOwotICAgICAgICBjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSAgICAgPSAyNDAwMDA7Ci0gICAgfQotCi0gICAgLy8gQ29udmVydCB0YXJnZXQgYmFuZHdpZHRoIGZyb20gS2JpdC9zIHRvIEJpdC9zCi0gICAgY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGggICAgICAgKj0gMTAwMDsKLQotICAgIC8vIFNldCBvciByZXNldCBvcHRpbWFsIGFuZCBtYXhpbXVtIGJ1ZmZlciBsZXZlbHMuCi0gICAgaWYgKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA9PSAwKQotICAgICAgICBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgPSBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aCAvIDg7Ci0gICAgZWxzZQotICAgICAgICBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgPQotICAgICAgICAgICAgcmVzY2FsZShjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoLCAxMDAwKTsKLQotICAgIGlmIChjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSA9PSAwKQotICAgICAgICBjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSA9IGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gODsKLSAgICBlbHNlCi0gICAgICAgIGNwaS0+b3hjZi5tYXhpbXVtX2J1ZmZlcl9zaXplID0KLSAgICAgICAgICAgIHJlc2NhbGUoY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoLCAxMDAwKTsKLQotICAgIC8vIFNldCB1cCBmcmFtZSByYXRlIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMgcmF0ZSBjb250cm9sIHZhbHVlcy4KLSAgICB2cDhfbmV3X2ZyYW1lX3JhdGUoY3BpLCBjcGktPm94Y2YuZnJhbWVfcmF0ZSk7Ci0KLSAgICAvLyBTZXQgYWJzb2x1dGUgdXBwZXIgYW5kIGxvd2VyIHF1YWxpdHkgbGltaXRzCi0gICAgY3BpLT53b3JzdF9xdWFsaXR5ICAgICAgICAgICAgICAgPSBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xOwotICAgIGNwaS0+YmVzdF9xdWFsaXR5ICAgICAgICAgICAgICAgID0gY3BpLT5veGNmLmJlc3RfYWxsb3dlZF9xOwotCi0gICAgLy8gYWN0aXZlIHZhbHVlcyBzaG91bGQgb25seSBiZSBtb2RpZmllZCBpZiBvdXQgb2YgbmV3IHJhbmdlCi0gICAgaWYgKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPiBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xKQotICAgIHsKLSAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xOwotICAgIH0KLSAgICAvLyBsZXNzIGxpa2VseQotICAgIGVsc2UgaWYgKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPCBjcGktPm94Y2YuYmVzdF9hbGxvd2VkX3EpCi0gICAgewotICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+b3hjZi5iZXN0X2FsbG93ZWRfcTsKLSAgICB9Ci0gICAgaWYgKGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA8IGNwaS0+b3hjZi5iZXN0X2FsbG93ZWRfcSkKLSAgICB7Ci0gICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBjcGktPm94Y2YuYmVzdF9hbGxvd2VkX3E7Ci0gICAgfQotICAgIC8vIGxlc3MgbGlrZWx5Ci0gICAgZWxzZSBpZiAoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID4gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcSkKLSAgICB7Ci0gICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xOwotICAgIH0KLQotICAgIGNwaS0+YnVmZmVyZWRfbW9kZSA9IChjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgPiAwKSA/IFRSVUUgOiBGQUxTRTsKLQotICAgIGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkgPSBjcGktPm94Y2YuY3FfbGV2ZWw7Ci0KLSAgICAvLyBPbmx5IGFsbG93IGRyb3BwZWQgZnJhbWVzIGluIGJ1ZmZlcmVkIG1vZGUKLSAgICBjcGktPmRyb3BfZnJhbWVzX2FsbG93ZWQgPSBjcGktPm94Y2YuYWxsb3dfZGYgJiYgY3BpLT5idWZmZXJlZF9tb2RlOwotCi0gICAgY20tPmZpbHRlcl90eXBlICAgICAgICAgID0gKExPT1BGSUxURVJUWVBFKSBjcGktPmZpbHRlcl90eXBlOwotCi0gICAgaWYgKCFjbS0+dXNlX2JpbGluZWFyX21jX2ZpbHRlcikKLSAgICAgICAgY20tPm1jb21wX2ZpbHRlcl90eXBlID0gU0lYVEFQOwotICAgIGVsc2UKLSAgICAgICAgY20tPm1jb21wX2ZpbHRlcl90eXBlID0gQklMSU5FQVI7Ci0KLSAgICBjcGktPnRhcmdldF9iYW5kd2lkdGggPSBjcGktPm94Y2YudGFyZ2V0X2JhbmR3aWR0aDsKLQotICAgIGNtLT5XaWR0aCAgICAgICA9IGNwaS0+b3hjZi5XaWR0aCAgICAgOwotICAgIGNtLT5IZWlnaHQgICAgICA9IGNwaS0+b3hjZi5IZWlnaHQgICAgOwotCi0gICAgY20tPmhvcml6X3NjYWxlICA9IGNwaS0+aG9yaXpfc2NhbGU7Ci0gICAgY20tPnZlcnRfc2NhbGUgICA9IGNwaS0+dmVydF9zY2FsZSA7Ci0KLSAgICAvLyBBcyBwZXIgVlA4Ci0gICAgY3BpLT5pbnRyYV9mcmFtZV90YXJnZXQgPSAoNCAqIChjbS0+V2lkdGggKyBjbS0+SGVpZ2h0KSAvIDE1KSAqIDEwMDA7Ci0KLSAgICAvLyBWUDggc2hhcnBuZXNzIGxldmVsIG1hcHBpbmcgMC03ICh2cyAwLTEwIGluIGdlbmVyYWwgVlB4IGRpYWxvZ3MpCi0gICAgaWYgKGNwaS0+b3hjZi5TaGFycG5lc3MgPiA3KQotICAgICAgICBjcGktPm94Y2YuU2hhcnBuZXNzID0gNzsKLQotICAgIGNtLT5zaGFycG5lc3NfbGV2ZWwgPSBjcGktPm94Y2YuU2hhcnBuZXNzOwotCi0gICAgaWYgKGNtLT5ob3Jpel9zY2FsZSAhPSBOT1JNQUwgfHwgY20tPnZlcnRfc2NhbGUgIT0gTk9STUFMKQotICAgIHsKLSAgICAgICAgaW50IFVOSU5JVElBTElaRURfSVNfU0FGRShociksIFVOSU5JVElBTElaRURfSVNfU0FGRShocyk7Ci0gICAgICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUodnIpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUodnMpOwotCi0gICAgICAgIFNjYWxlMlJhdGlvKGNtLT5ob3Jpel9zY2FsZSwgJmhyLCAmaHMpOwotICAgICAgICBTY2FsZTJSYXRpbyhjbS0+dmVydF9zY2FsZSwgJnZyLCAmdnMpOwotCi0gICAgICAgIC8vIGFsd2F5cyBnbyB0byB0aGUgbmV4dCB3aG9sZSBudW1iZXIKLSAgICAgICAgY20tPldpZHRoID0gKGhzIC0gMSArIGNwaS0+b3hjZi5XaWR0aCAqIGhyKSAvIGhzOwotICAgICAgICBjbS0+SGVpZ2h0ID0gKHZzIC0gMSArIGNwaS0+b3hjZi5IZWlnaHQgKiB2cikgLyB2czsKLSAgICB9Ci0KLSAgICBpZiAoKChjbS0+V2lkdGggKyAxNSkgJiAweGZmZmZmZmYwKSAhPQotICAgICAgICAgIGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS55X3dpZHRoIHx8Ci0gICAgICAgICgoY20tPkhlaWdodCArIDE1KSAmIDB4ZmZmZmZmZjApICE9Ci0gICAgICAgICAgY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLnlfaGVpZ2h0IHx8Ci0gICAgICAgIGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS55X3dpZHRoID09IDApCi0gICAgewotICAgICAgICBhbGxvY19yYXdfZnJhbWVfYnVmZmVycyhjcGkpOwotICAgICAgICB2cDhfYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7Ci0gICAgfQotCi0gICAgLy8gQ2xhbXAgS0YgZnJhbWUgc2l6ZSB0byBxdWFydGVyIG9mIGRhdGEgcmF0ZQotICAgIGlmIChjcGktPmludHJhX2ZyYW1lX3RhcmdldCA+IGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA+PiAyKQotICAgICAgICBjcGktPmludHJhX2ZyYW1lX3RhcmdldCA9IGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA+PiAyOwotCi0gICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDApCi0gICAgewotICAgICAgICBjcGktPmxhc3RfcVswXSA9IGNwaS0+b3hjZi5maXhlZF9xOwotICAgICAgICBjcGktPmxhc3RfcVsxXSA9IGNwaS0+b3hjZi5maXhlZF9xOwotICAgIH0KLQotICAgIGNwaS0+U3BlZWQgPSBjcGktPm94Y2YuY3B1X3VzZWQ7Ci0KLSAgICAvLyBmb3JjZSB0byBhbGxvd2xhZyB0byAwIGlmIGxhZ19pbl9mcmFtZXMgaXMgMDsKLSAgICBpZiAoY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICAgIGNwaS0+b3hjZi5hbGxvd19sYWcgPSAwOwotICAgIH0KLSAgICAvLyBMaW1pdCBvbiBsYWcgYnVmZmVycyBhcyB0aGVzZSBhcmUgbm90IGN1cnJlbnRseSBkeW5hbWljYWxseSBhbGxvY2F0ZWQKLSAgICBlbHNlIGlmIChjcGktPm94Y2YubGFnX2luX2ZyYW1lcyA+IE1BWF9MQUdfQlVGRkVSUykKLSAgICAgICAgY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgPSBNQVhfTEFHX0JVRkZFUlM7Ci0KLSAgICAvLyBZWCBUZW1wCi0gICAgY3BpLT5sYXN0X2FsdF9yZWZfc2VpICAgID0gLTE7Ci0gICAgY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiA9IDA7Ci0gICAgY3BpLT5pc19uZXh0X3NyY19hbHRfcmVmID0gMDsKLQotI2lmIDAKLSAgICAvLyBFeHBlcmltZW50YWwgUkQgQ29kZQotICAgIGNwaS0+ZnJhbWVfZGlzdG9ydGlvbiA9IDA7Ci0gICAgY3BpLT5sYXN0X2ZyYW1lX2Rpc3RvcnRpb24gPSAwOwotI2VuZGlmCi0KLX0KLQotI2RlZmluZSBNX0xPRzJfRSAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNwotI2RlZmluZSBsb2cyZih4KSAobG9nICh4KSAvIChmbG9hdCkgTV9MT0cyX0UpCi1zdGF0aWMgdm9pZCBjYWxfbXZzYWRjb3N0cyhpbnQgKm12c2FkY29zdFsyXSkKLXsKLSAgICBpbnQgaSA9IDE7Ci0KLSAgICBtdnNhZGNvc3QgWzBdIFswXSA9IDMwMDsKLSAgICBtdnNhZGNvc3QgWzFdIFswXSA9IDMwMDsKLQotICAgIGRvCi0gICAgewotICAgICAgICBkb3VibGUgeiA9IDI1NiAqICgyICogKGxvZzJmKDIgKiBpKSArIC42KSk7Ci0gICAgICAgIG12c2FkY29zdCBbMF1baV0gPSAoaW50KSB6OwotICAgICAgICBtdnNhZGNvc3QgWzFdW2ldID0gKGludCkgejsKLSAgICAgICAgbXZzYWRjb3N0IFswXVstaV0gPSAoaW50KSB6OwotICAgICAgICBtdnNhZGNvc3QgWzFdWy1pXSA9IChpbnQpIHo7Ci0gICAgfQotICAgIHdoaWxlICgrK2kgPD0gbXZfbWF4KTsKLX0KLQotVlA4X1BUUiB2cDhfY3JlYXRlX2NvbXByZXNzb3IoVlA4X0NPTkZJRyAqb3hjZikKLXsKLSAgICBpbnQgaTsKLSAgICB2b2xhdGlsZSB1bmlvbgotICAgIHsKLSAgICAgICAgVlA4X0NPTVAgKmNwaTsKLSAgICAgICAgVlA4X1BUUiAgIHB0cjsKLSAgICB9IGN0eDsKLQotICAgIFZQOF9DT01QICpjcGk7Ci0gICAgVlA4X0NPTU1PTiAqY207Ci0KLSAgICBjcGkgPSBjdHguY3BpID0gdnB4X21lbWFsaWduKDMyLCBzaXplb2YoVlA4X0NPTVApKTsKLSAgICAvLyBDaGVjayB0aGF0IHRoZSBDUEkgaW5zdGFuY2UgaXMgdmFsaWQKLSAgICBpZiAoIWNwaSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjbSA9ICZjcGktPmNvbW1vbjsKLQotICAgIHZweF9tZW1zZXQoY3BpLCAwLCBzaXplb2YoVlA4X0NPTVApKTsKLQotICAgIGlmIChzZXRqbXAoY20tPmVycm9yLmptcCkpCi0gICAgewotICAgICAgICBWUDhfUFRSIHB0ciA9IGN0eC5wdHI7Ci0KLSAgICAgICAgY3R4LmNwaS0+Y29tbW9uLmVycm9yLnNldGptcCA9IDA7Ci0gICAgICAgIHZwOF9yZW1vdmVfY29tcHJlc3NvcigmcHRyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY3BpLT5jb21tb24uZXJyb3Iuc2V0am1wID0gMTsKLQotICAgIENIRUNLX01FTV9FUlJPUihjcGktPm1iLnNzLCB2cHhfY2FsbG9jKHNpemVvZihzZWFyY2hfc2l0ZSksIChNQVhfTVZTRUFSQ0hfU1RFUFMgKiA4KSArIDEpKTsKLQotICAgIHZwOF9jcmVhdGVfY29tbW9uKCZjcGktPmNvbW1vbik7Ci0gICAgdnA4X2NtYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhjcGkpOwotCi0gICAgaW5pdF9jb25maWcoKFZQOF9QVFIpY3BpLCBveGNmKTsKLQotICAgIG1lbWNweShjcGktPmJhc2Vfc2tpcF9mYWxzZV9wcm9iLCB2cDhjeF9iYXNlX3NraXBfZmFsc2VfcHJvYiwgc2l6ZW9mKHZwOGN4X2Jhc2Vfc2tpcF9mYWxzZV9wcm9iKSk7Ci0gICAgY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSAgID0gMDsKLSAgICBjcGktPmtmX292ZXJzcGVuZF9iaXRzICAgICAgICAgICAgPSAwOwotICAgIGNwaS0+a2ZfYml0cmF0ZV9hZGp1c3RtZW50ICAgICAgICA9IDA7Ci0gICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlICAgICAgPSAwOwotICAgIGNwaS0+Z2Zfb3ZlcnNwZW5kX2JpdHMgICAgICAgICAgICA9IDA7Ci0gICAgY3BpLT5ub25fZ2ZfYml0cmF0ZV9hZGp1c3RtZW50ICAgICA9IDA7Ci0gICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgICAgICAgICAgICAgID0gMTI4OwotICAgIGNwaS0+cHJvYl9nZl9jb2RlZCAgICAgICAgICAgICAgICA9IDEyODsKLSAgICBjcGktPnByb2JfaW50cmFfY29kZWQgICAgICAgICAgICAgPSA2MzsKLQotICAgIC8vIFByaW1lIHRoZSByZWNlbnQgcmVmZXJlbmNlIGZyYW1lIHVzZWFnZSBjb3VudGVycy4KLSAgICAvLyBIZXJlYWZ0ZXIgdGhleSB3aWxsIGJlIG1haW50YWluZWQgYXMgYSBzb3J0IG9mIG1vdmluZyBhdmVyYWdlCi0gICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0lOVFJBX0ZSQU1FXSAgPSAxOwotICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtMQVNUX0ZSQU1FXSAgID0gMTsKLSAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbR09MREVOX0ZSQU1FXSA9IDE7Ci0gICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV0gPSAxOwotCi0gICAgLy8gU2V0IHJlZmVyZW5jZSBmcmFtZSBzaWduIGJpYXMgZm9yIEFMVFJFRiBmcmFtZSB0byAxIChmb3Igbm93KQotICAgIGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSA9IDE7Ci0KLSAgICBjcGktPmdmX2RlY2F5X3JhdGUgPSAwOwotICAgIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwgPSBERUZBVUxUX0dGX0lOVEVSVkFMOwotCi0gICAgY3BpLT5nb2xkX2lzX2xhc3QgPSAwIDsKLSAgICBjcGktPmFsdF9pc19sYXN0ICA9IDAgOwotICAgIGNwaS0+Z29sZF9pc19hbHQgID0gMCA7Ci0KLSAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0b3JpbmcgbGFzdCBmcmFtZSdzIE1WcyBmb3IgTVYgcHJlZGljdGlvbi4KLSAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5sZm12LCB2cHhfY2FsbG9jKChjcGktPmNvbW1vbi5tYl9yb3dzKzIpICogKGNwaS0+Y29tbW9uLm1iX2NvbHMrMiksIHNpemVvZihpbnRfbXYpKSk7Ci0gICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhcywgdnB4X2NhbGxvYygoY3BpLT5jb21tb24ubWJfcm93cysyKSAqIChjcGktPmNvbW1vbi5tYl9jb2xzKzIpLCBzaXplb2YoaW50KSkpOwotICAgIENIRUNLX01FTV9FUlJPUihjcGktPmxmX3JlZl9mcmFtZSwgdnB4X2NhbGxvYygoY3BpLT5jb21tb24ubWJfcm93cysyKSAqIChjcGktPmNvbW1vbi5tYl9jb2xzKzIpLCBzaXplb2YoaW50KSkpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNlZ21lbnRhdGlvbiBtYXAgYW5kIHNldCBhbGwgZW50cmllcyB0byAwCi0gICAgQ0hFQ0tfTUVNX0VSUk9SKGNwaS0+c2VnbWVudGF0aW9uX21hcCwgdnB4X2NhbGxvYyhjcGktPmNvbW1vbi5tYl9yb3dzICogY3BpLT5jb21tb24ubWJfY29scywgMSkpOwotICAgIENIRUNLX01FTV9FUlJPUihjcGktPmFjdGl2ZV9tYXAsIHZweF9jYWxsb2MoY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMsIDEpKTsKLSAgICB2cHhfbWVtc2V0KGNwaS0+YWN0aXZlX21hcCAsIDEsIChjcGktPmNvbW1vbi5tYl9yb3dzICogY3BpLT5jb21tb24ubWJfY29scykpOwotICAgIGNwaS0+YWN0aXZlX21hcF9lbmFibGVkID0gMDsKLQotI2lmIDAKLSAgICAvLyBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGFuZCBvbmUgcGFzcwotICAgIC8vIEluaXRpYWxpc2Ugb25lX3Bhc3MgR0YgZnJhbWVzIHN0YXRzCi0gICAgLy8gVXBkYXRlIHN0YXRzIHVzZWQgZm9yIEdGIHNlbGVjdGlvbgotICAgIGlmIChjcGktPnBhc3MgPT0gMCkKLSAgICB7Ci0gICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggPSAwOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTEFHX0JVRkZFUlM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZXNfc29fZmFyID0gMDsKLSAgICAgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbaV0uZnJhbWVfaW50cmFfZXJyb3IgPSAwLjA7Ci0gICAgICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2ldLmZyYW1lX2NvZGVkX2Vycm9yID0gMC4wOwotICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9wY250X2ludGVyID0gMC4wOwotICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9wY250X21vdGlvbiA9IDAuMDsKLSAgICAgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbaV0uZnJhbWVfbXZyID0gMC4wOwotICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9tdnJfYWJzID0gMC4wOwotICAgICAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpXS5mcmFtZV9tdmMgPSAwLjA7Ci0gICAgICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2ldLmZyYW1lX212Y19hYnMgPSAwLjA7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIFNob3VsZCB3ZSB1c2UgdGhlIGN5Y2xpYyByZWZyZXNoIG1ldGhvZC4KLSAgICAvLyBDdXJyZW50bHkgdGhpcyBpcyB0aWVkIHRvIGVycm9yIHJlc2lsbGlhbnQgbW9kZQotICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkID0gY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlOwotICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9tYXhfbWJzX3BlcmZyYW1lID0gKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzKSAvIDQwOwotICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9pbmRleCA9IDA7Ci0gICAgY3BpLT5jeWNsaWNfcmVmcmVzaF9xID0gMzI7Ci0KLSAgICBpZiAoY3BpLT5jeWNsaWNfcmVmcmVzaF9tb2RlX2VuYWJsZWQpCi0gICAgewotICAgICAgICBDSEVDS19NRU1fRVJST1IoY3BpLT5jeWNsaWNfcmVmcmVzaF9tYXAsIHZweF9jYWxsb2MoKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzKSwgMSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwID0gKHNpZ25lZCBjaGFyICopIE5VTEw7Ci0KLSAgICAvLyBUZXN0IGZ1bmN0aW9uIGZvciBzZWdtZW50YXRpb24KLSAgICAvL3NlZ21lbnRhdGlvbl90ZXN0X2Z1bmN0aW9uKChWUDhfUFRSKSBjcGkpOwotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgIGluaXRfY29udGV4dF9jb3VudGVycygpOwotI2VuZGlmCi0KLSAgICAvKkluaXRpYWxpemUgdGhlIGZlZWQtZm9yd2FyZCBhY3Rpdml0eSBtYXNraW5nLiovCi0gICAgY3BpLT5hY3Rpdml0eV9hdmcgPSA5MDw8MTI7Ci0KLSAgICBjcGktPmZyYW1lc19zaW5jZV9rZXkgPSA4OyAgICAgICAgLy8gR2l2ZSBhIHNlbnNpYmxlIGRlZmF1bHQgZm9yIHRoZSBmaXJzdCBmcmFtZS4KLSAgICBjcGktPmtleV9mcmFtZV9mcmVxdWVuY3kgPSBjcGktPm94Y2Yua2V5X2ZyZXE7Ci0gICAgY3BpLT50aGlzX2tleV9mcmFtZV9mb3JjZWQgPSBGQUxTRTsKLSAgICBjcGktPm5leHRfa2V5X2ZyYW1lX2ZvcmNlZCA9IEZBTFNFOwotCi0gICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gRkFMU0U7Ci0gICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUgPSBGQUxTRTsKLSAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSAwOwotCi0gICAgY3BpLT5iX2NhbGN1bGF0ZV9wc25yID0gQ09ORklHX1BTTlI7Ci0jaWYgQ09ORklHX1BTTlIKLSAgICBjcGktPmJfY2FsY3VsYXRlX3NzaW1nID0gMDsKLQotICAgIGNwaS0+Y291bnQgPSAwOwotICAgIGNwaS0+Ynl0ZXMgPSAwOwotCi0gICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfcHNucikKLSAgICB7Ci0gICAgICAgIGNwaS0+dG90YWxfc3FfZXJyb3IgPSAwLjA7Ci0gICAgICAgIGNwaS0+dG90YWxfc3FfZXJyb3IyID0gMC4wOwotICAgICAgICBjcGktPnRvdGFsX3kgPSAwLjA7Ci0gICAgICAgIGNwaS0+dG90YWxfdSA9IDAuMDsKLSAgICAgICAgY3BpLT50b3RhbF92ID0gMC4wOwotICAgICAgICBjcGktPnRvdGFsID0gMC4wOwotICAgICAgICBjcGktPnRvdGFscF95ID0gMC4wOwotICAgICAgICBjcGktPnRvdGFscF91ID0gMC4wOwotICAgICAgICBjcGktPnRvdGFscF92ID0gMC4wOwotICAgICAgICBjcGktPnRvdGFscCA9IDAuMDsKLSAgICAgICAgY3BpLT50b3RfcmVjb2RlX2hpdHMgPSAwOwotICAgICAgICBjcGktPnN1bW1lZF9xdWFsaXR5ID0gMDsKLSAgICAgICAgY3BpLT5zdW1tZWRfd2VpZ2h0cyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfc3NpbWcpCi0gICAgewotICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3kgPSAwOwotICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3UgPSAwOwotICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3YgPSAwOwotICAgICAgICBjcGktPnRvdGFsX3NzaW1nX2FsbCA9IDA7Ci0gICAgfQotCi0jaWZuZGVmIExMT05HX01BWAotI2RlZmluZSBMTE9OR19NQVggIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAotI2VuZGlmCi0gICAgY3BpLT5maXJzdF90aW1lX3N0YW1wX2V2ZXIgPSBMTE9OR19NQVg7Ci0KLSNlbmRpZgotCi0gICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlICAgICAgPSAwOwotICAgIGNwaS0+a2V5X2ZyYW1lX2NvdW50ICAgICAgICAgICAgICA9IDE7Ci0gICAgY3BpLT50b3Rfa2V5X2ZyYW1lX2JpdHMgICAgICAgICAgICA9IDA7Ci0KLSAgICBjcGktPm5pX2F2X3FpICAgICAgICAgICAgICAgICAgICAgPSBjcGktPm94Y2Yud29yc3RfYWxsb3dlZF9xOwotICAgIGNwaS0+bmlfdG90X3FpICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgY3BpLT5uaV9mcmFtZXMgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIGNwaS0+dG90YWxfYnl0ZV9jb3VudCAgICAgICAgICAgICA9IDA7Ci0KLSAgICBjcGktPmRyb3BfZnJhbWUgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgY3BpLT5kcm9wX2NvdW50ICAgICAgICAgICAgICAgICAgPSAwOwotICAgIGNwaS0+bWF4X2Ryb3BfY291bnQgICAgICAgICAgICAgICA9IDA7Ci0gICAgY3BpLT5tYXhfY29uc2VjX2Ryb3BwZWRfZnJhbWVzICAgICA9IDQ7Ci0KLSAgICBjcGktPnJhdGVfY29ycmVjdGlvbl9mYWN0b3IgICAgICAgICA9IDEuMDsKLSAgICBjcGktPmtleV9mcmFtZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yID0gMS4wOwotICAgIGNwaS0+Z2ZfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciAgPSAxLjA7Ci0gICAgY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciAgPSAxLjA7Ci0KLSAgICBjcGktPm1iLm12Y29zdFswXSA9ICZjcGktPm1iLm12Y29zdHNbMF1bbXZfbWF4KzFdOwotICAgIGNwaS0+bWIubXZjb3N0WzFdID0gJmNwaS0+bWIubXZjb3N0c1sxXVttdl9tYXgrMV07Ci0gICAgY3BpLT5tYi5tdnNhZGNvc3RbMF0gPSAmY3BpLT5tYi5tdnNhZGNvc3RzWzBdW212X21heCsxXTsKLSAgICBjcGktPm1iLm12c2FkY29zdFsxXSA9ICZjcGktPm1iLm12c2FkY29zdHNbMV1bbXZfbWF4KzFdOwotCi0gICAgY2FsX212c2FkY29zdHMoY3BpLT5tYi5tdnNhZGNvc3QpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEtFWV9GUkFNRV9DT05URVhUOyBpKyspCi0gICAgewotICAgICAgICBjcGktPnByaW9yX2tleV9mcmFtZV9zaXplW2ldICAgICA9IGNwaS0+aW50cmFfZnJhbWVfdGFyZ2V0OwotICAgICAgICBjcGktPnByaW9yX2tleV9mcmFtZV9kaXN0YW5jZVtpXSA9IChpbnQpY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZTsKLSAgICB9Ci0KLSAgICBjcGktPmNoZWNrX2ZyZXFbMF0gPSAxNTsKLSAgICBjcGktPmNoZWNrX2ZyZXFbMV0gPSAxNTsKLQotI2lmZGVmIE9VVFBVVF9ZVVZfU1JDCi0gICAgeXV2X2ZpbGUgPSBmb3BlbigiYmQueXV2IiwgImFiIik7Ci0jZW5kaWYKLQotI2lmIDAKLSAgICBmcmFtZXBzbnIgPSBmb3BlbigiZnJhbWVwc25yLnN0dCIsICJhIik7Ci0gICAga2ZfbGlzdCA9IGZvcGVuKCJrZl9saXN0LnN0dCIsICJ3Iik7Ci0jZW5kaWYKLQotICAgIGNwaS0+b3V0cHV0X3BrdF9saXN0ID0gb3hjZi0+b3V0cHV0X3BrdF9saXN0OwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLQotICAgIGlmIChjcGktPnBhc3MgPT0gMSkKLSAgICB7Ci0gICAgICAgIHZwOF9pbml0X2ZpcnN0X3Bhc3MoY3BpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3BpLT5wYXNzID09IDIpCi0gICAgewotICAgICAgICBzaXplX3QgcGFja2V0X3N6ID0gc2l6ZW9mKEZJUlNUUEFTU19TVEFUUyk7Ci0gICAgICAgIGludCBwYWNrZXRzID0gb3hjZi0+dHdvX3Bhc3Nfc3RhdHNfaW4uc3ogLyBwYWNrZXRfc3o7Ci0KLSAgICAgICAgY3BpLT5zdGF0c19pbiA9IG94Y2YtPnR3b19wYXNzX3N0YXRzX2luLmJ1ZjsKLSAgICAgICAgY3BpLT5zdGF0c19pbl9lbmQgPSAodm9pZCopKChjaGFyICopY3BpLT5zdGF0c19pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHBhY2tldHMgLSAxKSAqIHBhY2tldF9zeik7Ci0gICAgICAgIHZwOF9pbml0X3NlY29uZF9wYXNzKGNwaSk7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIGlmIChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMikKLSAgICB7Ci0gICAgICAgIGNwaS0+Y3B1X2ZyZXEgICAgICAgICAgICA9IDA7IC8vdnA4X2dldF9wcm9jZXNzb3JfZnJlcSgpOwotICAgICAgICBjcGktPmF2Z19lbmNvZGVfdGltZSAgICAgID0gMDsKLSAgICAgICAgY3BpLT5hdmdfcGlja19tb2RlX3RpbWUgICAgPSAwOwotICAgIH0KLQotICAgIHZwOF9zZXRfc3BlZWRfZmVhdHVyZXMoY3BpKTsKLQotICAgIC8vIFNldCBzdGFydGluZyB2YWx1ZXMgb2YgUkQgdGhyZXNob2xkIG11bHRpcGxpZXJzICgxMjggPSAqMSkKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVTOyBpKyspCi0gICAgewotICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W2ldID0gMTI4OwotICAgIH0KLQotI2lmZGVmIEVOVFJPUFlfU1RBVFMKLSAgICBpbml0X212X3JlZl9jb3VudHMoKTsKLSNlbmRpZgotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgdnA4Y3hfY3JlYXRlX2VuY29kZXJfdGhyZWFkcyhjcGkpOwotI2VuZGlmCi0KLSAgICBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc2RmICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc2FkMTZ4MTYpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS52ZiAgICAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCB2YXIxNngxNik7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnN2ZiAgICAgICAgICAgID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIHN1YnBpeHZhcjE2eDE2KTsKLSAgICBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc3ZmX2hhbGZwaXhfaCAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgaGFsZnBpeHZhcjE2eDE2X2gpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zdmZfaGFsZnBpeF92ICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBoYWxmcGl4dmFyMTZ4MTZfdik7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnN2Zl9oYWxmcGl4X2h2ID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIGhhbGZwaXh2YXIxNngxNl9odik7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkeDNmICAgICAgICAgID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIHNhZDE2eDE2eDMpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZHg4ZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQxNngxNng4KTsKLSAgICBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc2R4NGRmICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc2FkMTZ4MTZ4NGQpOwotCi0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc2RmICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc2FkMTZ4OCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0udmYgICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgdmFyMTZ4OCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc3ZmICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc3VicGl4dmFyMTZ4OCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc3ZmX2hhbGZwaXhfaCAgPSBOVUxMOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDhdLnN2Zl9oYWxmcGl4X3YgID0gTlVMTDsKLSAgICBjcGktPmZuX3B0cltCTE9DS18xNlg4XS5zdmZfaGFsZnBpeF9odiA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfMTZYOF0uc2R4M2YgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc2FkMTZ4OHgzKTsKLSAgICBjcGktPmZuX3B0cltCTE9DS18xNlg4XS5zZHg4ZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQxNng4eDgpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDhdLnNkeDRkZiAgICAgICAgID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIHNhZDE2eDh4NGQpOwotCi0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0uc2RmICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc2FkOHgxNik7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0udmYgICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgdmFyOHgxNik7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0uc3ZmICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc3VicGl4dmFyOHgxNik7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0uc3ZmX2hhbGZwaXhfaCAgPSBOVUxMOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYMTZdLnN2Zl9oYWxmcGl4X3YgID0gTlVMTDsKLSAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5zdmZfaGFsZnBpeF9odiA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFgxNl0uc2R4M2YgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgc2FkOHgxNngzKTsKLSAgICBjcGktPmZuX3B0cltCTE9DS184WDE2XS5zZHg4ZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ4eDE2eDgpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYMTZdLnNkeDRkZiAgICAgICAgID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIHNhZDh4MTZ4NGQpOwotCi0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zZGYgICAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ4eDgpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzhYOF0udmYgICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgdmFyOHg4KTsKLSAgICBjcGktPmZuX3B0cltCTE9DS184WDhdLnN2ZiAgICAgICAgICAgID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIHN1YnBpeHZhcjh4OCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmZfaGFsZnBpeF9oICA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmZfaGFsZnBpeF92ICA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zdmZfaGFsZnBpeF9odiA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zZHgzZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ4eDh4Myk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zZHg4ZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ4eDh4OCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfOFg4XS5zZHg0ZGYgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ4eDh4NGQpOwotCi0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zZGYgICAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ0eDQpOwotICAgIGNwaS0+Zm5fcHRyW0JMT0NLXzRYNF0udmYgICAgICAgICAgICAgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgdmFyNHg0KTsKLSAgICBjcGktPmZuX3B0cltCTE9DS180WDRdLnN2ZiAgICAgICAgICAgID0gVkFSSUFOQ0VfSU5WT0tFKCZjcGktPnJ0Y2QudmFyaWFuY2UsIHN1YnBpeHZhcjR4NCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zdmZfaGFsZnBpeF9oICA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zdmZfaGFsZnBpeF92ICA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zdmZfaGFsZnBpeF9odiA9IE5VTEw7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zZHgzZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ0eDR4Myk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zZHg4ZiAgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ0eDR4OCk7Ci0gICAgY3BpLT5mbl9wdHJbQkxPQ0tfNFg0XS5zZHg0ZGYgICAgICAgICA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBzYWQ0eDR4NGQpOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICBjcGktPmZ1bGxfc2VhcmNoX3NhZCA9IFNFQVJDSF9JTlZPS0UoJmNwaS0+cnRjZC5zZWFyY2gsIGZ1bGxfc2VhcmNoKTsKLSNlbmRpZgotICAgIGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkID0gU0VBUkNIX0lOVk9LRSgmY3BpLT5ydGNkLnNlYXJjaCwgZGlhbW9uZF9zZWFyY2gpOwotCi0gICAgY3BpLT5yZWFkeV9mb3JfbmV3X2ZyYW1lID0gMTsKLQotICAgIGNwaS0+c291cmNlX2VuY29kZV9pbmRleCA9IDA7Ci0KLSAgICAvLyBtYWtlIHN1cmUgZnJhbWUgMSBpcyBva2F5Ci0gICAgY3BpLT5lcnJvcl9iaW5zWzBdID0gY3BpLT5jb21tb24uTUJzOwotCi0gICAgLy92cDhjeF9pbml0X3F1YW50aXplcigpIGlzIGZpcnN0IGNhbGxlZCBoZXJlLiBBZGQgY2hlY2sgaW4gdnA4Y3hfZnJhbWVfaW5pdF9xdWFudGl6ZXIoKSBzbyB0aGF0IHZwOGN4X2luaXRfcXVhbnRpemVyIGlzIG9ubHkgY2FsbGVkIGxhdGVyCi0gICAgLy93aGVuIG5lZWRlZC4gVGhpcyB3aWxsIGF2b2lkIHVubmVjZXNzYXJ5IGNhbGxzIG9mIHZwOGN4X2luaXRfcXVhbnRpemVyKCkgZm9yIGV2ZXJ5IGZyYW1lLgotICAgIHZwOGN4X2luaXRfcXVhbnRpemVyKGNwaSk7Ci0gICAgewotICAgICAgICB2cDhfaW5pdF9sb29wX2ZpbHRlcihjbSk7Ci0gICAgICAgIGNtLT5sYXN0X2ZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7Ci0gICAgICAgIGNtLT5sYXN0X2ZpbHRlcl90eXBlID0gY20tPmZpbHRlcl90eXBlOwotICAgICAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOwotICAgIH0KLSAgICBjcGktPmNvbW1vbi5lcnJvci5zZXRqbXAgPSAwOwotICAgIHJldHVybiAoVlA4X1BUUikgY3BpOwotCi19Ci0KLQotdm9pZCB2cDhfcmVtb3ZlX2NvbXByZXNzb3IoVlA4X1BUUiAqcHRyKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikoKnB0cik7Ci0KLSAgICBpZiAoIWNwaSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNwaSAmJiAoY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSA+IDApKQotICAgIHsKLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotCi0gICAgICAgIGlmIChjcGktPnBhc3MgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2VuZF9zZWNvbmRfcGFzcyhjcGkpOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICBwcmludF9jb250ZXh0X2NvdW50ZXJzKCk7Ci0gICAgICAgIHByaW50X3RyZWVfdXBkYXRlX3Byb2JzKCk7Ci0gICAgICAgIHByaW50X21vZGVfY29udGV4dCgpOwotI2VuZGlmCi0KLSNpZiBDT05GSUdfUFNOUgotCi0gICAgICAgIGlmIChjcGktPnBhc3MgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJvcHNuci5zdHQiLCAiYSIpOwotICAgICAgICAgICAgZG91YmxlIHRpbWVfZW5jb2RlZCA9IChjcGktPnNvdXJjZV9lbmRfdGltZV9zdGFtcCAtIGNwaS0+Zmlyc3RfdGltZV9zdGFtcF9ldmVyKSAvIDEwMDAwMDAwLjAwMDsKLSAgICAgICAgICAgIGRvdWJsZSB0b3RhbF9lbmNvZGVfdGltZSA9IChjcGktPnRpbWVfcmVjZWl2ZV9kYXRhICsgY3BpLT50aW1lX2NvbXByZXNzX2RhdGEpICAgLyAxMDAwLjAwMDsKLSAgICAgICAgICAgIGRvdWJsZSBkciA9IChkb3VibGUpY3BpLT5ieXRlcyAqIChkb3VibGUpIDggLyAoZG91YmxlKTEwMDAgIC8gdGltZV9lbmNvZGVkOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5iX2NhbGN1bGF0ZV9wc25yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqbHN0X3l2MTIgPSAmY3BpLT5jb21tb24ueXYxMl9mYltjcGktPmNvbW1vbi5sc3RfZmJfaWR4XTsKLSAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlcyA9IDMuMCAvIDIgKiBjcGktPmNvdW50ICogbHN0X3l2MTItPnlfd2lkdGggKiBsc3RfeXYxMi0+eV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHRvdGFsX3BzbnIgPSB2cDhfbXNlMnBzbnIoc2FtcGxlcywgMjU1LjAsIGNwaS0+dG90YWxfc3FfZXJyb3IpOwotICAgICAgICAgICAgICAgIGRvdWJsZSB0b3RhbF9wc25yMiA9IHZwOF9tc2UycHNucihzYW1wbGVzLCAyNTUuMCwgY3BpLT50b3RhbF9zcV9lcnJvcjIpOwotICAgICAgICAgICAgICAgIGRvdWJsZSB0b3RhbF9zc2ltID0gMTAwICogcG93KGNwaS0+c3VtbWVkX3F1YWxpdHkgLyBjcGktPnN1bW1lZF93ZWlnaHRzLCA4LjApOwotCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQml0cmF0ZVx0QVZHUHNuclx0R0xCUHNuclx0QVZQc25yUFx0R0xQc25yUFx0VlBYU1NJTVx0ICBUaW1lKHVzKVxuIik7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTcuM2ZcdCU3LjNmXHQlNy4zZlx0JTcuM2ZcdCU3LjNmXHQlNy4zZiAlOC4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyLCBjcGktPnRvdGFsIC8gY3BpLT5jb3VudCwgdG90YWxfcHNuciwgY3BpLT50b3RhbHAgLyBjcGktPmNvdW50LCB0b3RhbF9wc25yMiwgdG90YWxfc3NpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2VuY29kZV90aW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfc3NpbWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQml0UmF0ZVx0U1NJTV9ZXHRTU0lNX1VcdFNTSU1fVlx0U1NJTV9BXHQgIFRpbWUodXMpXG4iKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlNy4zZlx0JTYuNGZcdCU2LjRmXHQlNi40Zlx0JTYuNGZcdCU4LjBmXG4iLCBkciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfc3NpbWdfeSAvIGNwaS0+Y291bnQsIGNwaS0+dG90YWxfc3NpbWdfdSAvIGNwaS0+Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3YgLyBjcGktPmNvdW50LCBjcGktPnRvdGFsX3NzaW1nX2FsbCAvIGNwaS0+Y291bnQsIHRvdGFsX2VuY29kZV90aW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmNsb3NlKGYpOwotI2lmIDAKLSAgICAgICAgICAgIGYgPSBmb3BlbigicXNraXAuc3R0IiwgImEiKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIm1pbnE6JWQgLW1heHE6JWQgc2tpcHR1cmU6c2tpcGZhbHNlID0gJWQ6JWRcbiIsIGNwaS0+b3hjZi5iZXN0X2FsbG93ZWRfcSwgY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcSwgc2tpcHRydWVjb3VudCwgc2tpcGZhbHNlY291bnQpOwotICAgICAgICAgICAgZmNsb3NlKGYpOwotI2VuZGlmCi0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgU1BFRURTVEFUUwotCi0gICAgICAgIGlmIChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBGSUxFICpmID0gZm9wZW4oImN4c3BlZWQuc3R0IiwgImEiKTsKLSAgICAgICAgICAgIGNudF9wbSAvPSBjcGktPmNvbW1vbi5NQnM7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiU1ZCIsIGZyYW1lc19hdF9zcGVlZFtpXSk7Ci0KLSAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7Ci0gICAgICAgICAgICAvL2ZwcmludGYoZiwgIiUxMGQgUE0gJTEwZCAlMTBkICUxMGQgRUYgJTEwZCAlMTBkICUxMGRcbiIsIGNwaS0+U3BlZWQsIGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lLCAodG90X3BtL2NudF9wbSksIGNudF9wbSwgIGNwaS0+YXZnX2VuY29kZV90aW1lLCAwLCAwKTsKLSAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgTU9ERV9TVEFUUwotICAgICAgICB7Ci0gICAgICAgICAgICBleHRlcm4gaW50IGNvdW50X21iX3NlZ1s0XTsKLSAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigibW9kZXMuc3R0IiwgImEiKTsKLSAgICAgICAgICAgIGRvdWJsZSBkciA9IChkb3VibGUpY3BpLT5veGNmLmZyYW1lX3JhdGUgKiAoZG91YmxlKWJ5dGVzICogKGRvdWJsZSk4IC8gKGRvdWJsZSljb3VudCAvIChkb3VibGUpMTAwMCA7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJpbnRyYV9tb2RlIGluIEludHJhIEZyYW1lczpcbiIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiWTogJThkLCAlOGQsICU4ZCwgJThkLCAlOGRcbiIsIHlfbW9kZXNbMF0sIHlfbW9kZXNbMV0sIHlfbW9kZXNbMl0sIHlfbW9kZXNbM10sIHlfbW9kZXNbNF0pOwotICAgICAgICAgICAgZnByaW50ZihmLCAiVVY6JThkLCAlOGQsICU4ZCwgJThkXG4iLCB1dl9tb2Rlc1swXSwgdXZfbW9kZXNbMV0sIHV2X21vZGVzWzJdLCB1dl9tb2Rlc1szXSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJCOiAiKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlOGQsICIsIGJfbW9kZXNbaV0pOwotCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKGYsICJNb2RlcyBpbiBJbnRlciBGcmFtZXM6XG4iKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIlk6ICU4ZCwgJThkLCAlOGQsICU4ZCwgJThkLCAlOGQsICU4ZCwgJThkLCAlOGQsICU4ZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJfeV9tb2Rlc1swXSwgaW50ZXJfeV9tb2Rlc1sxXSwgaW50ZXJfeV9tb2Rlc1syXSwgaW50ZXJfeV9tb2Rlc1szXSwgaW50ZXJfeV9tb2Rlc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJfeV9tb2Rlc1s1XSwgaW50ZXJfeV9tb2Rlc1s2XSwgaW50ZXJfeV9tb2Rlc1s3XSwgaW50ZXJfeV9tb2Rlc1s4XSwgaW50ZXJfeV9tb2Rlc1s5XSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJVVjolOGQsICU4ZCwgJThkLCAlOGRcbiIsIGludGVyX3V2X21vZGVzWzBdLCBpbnRlcl91dl9tb2Rlc1sxXSwgaW50ZXJfdXZfbW9kZXNbMl0sIGludGVyX3V2X21vZGVzWzNdKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIkI6ICIpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiU4ZCwgIiwgaW50ZXJfYl9tb2Rlc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJQOiU4ZCwgJThkLCAlOGQsICU4ZFxuIiwgY291bnRfbWJfc2VnWzBdLCBjb3VudF9tYl9zZWdbMV0sIGNvdW50X21iX3NlZ1syXSwgY291bnRfbWJfc2VnWzNdKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIlBCOiU4ZCwgJThkLCAlOGQsICU4ZFxuIiwgaW50ZXJfYl9tb2Rlc1tMRUZUNFg0XSwgaW50ZXJfYl9tb2Rlc1tBQk9WRTRYNF0sIGludGVyX2JfbW9kZXNbWkVSTzRYNF0sIGludGVyX2JfbW9kZXNbTkVXNFg0XSk7Ci0KLQotCi0gICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaSwgaiwgazsKLSAgICAgICAgICAgIEZJTEUgKmZtb2RlID0gZm9wZW4oIm1vZGVjb250ZXh0LmMiLCAidyIpOwotCi0gICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAiXG4jaW5jbHVkZSBcImVudHJvcHltb2RlLmhcIlxuXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICJjb25zdCB1bnNpZ25lZCBpbnQgdnA4X2tmX2RlZmF1bHRfYm1vZGVfY291bnRzICIpOwotICAgICAgICAgICAgZnByaW50ZihmbW9kZSwgIltWUDhfQklOVFJBTU9ERVNdIFtWUDhfQklOVFJBTU9ERVNdIFtWUDhfQklOVFJBTU9ERVNdID1cbntcbiIpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICIgICAgeyAvL0Fib3ZlIE1vZGUgOiAgJWRcbiIsIGkpOwotCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICIgICAgICAgIHsiKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTA7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRyYV9tb2RlX3N0YXRzW2ldW2pdW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICIgJTVkLCAiLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAiICU1ZCwgIiwgaW50cmFfbW9kZV9zdGF0c1tpXVtqXVtrXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZtb2RlLCAifSwgLy8gbGVmdF9tb2RlICVkXG4iLCBqKTsKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICIgICAgfSxcbiIpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZwcmludGYoZm1vZGUsICJ9O1xuIik7Ci0gICAgICAgICAgICBmY2xvc2UoZm1vZGUpOwotICAgICAgICB9Ci0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChTRUNUSU9OQklUU19PVVRQVVQpCi0KLSAgICAgICAgaWYgKDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJ0b2tlbmJpdHMuc3R0IiwgImEiKTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI4OyBpKyspCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJThkIiwgKGludCkoU2VjdGlvbmJpdHNbaV0gLyAyNTYpKTsKLQotICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKLSAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotI2lmIDAKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJcbl9waWNrX2xvb3BfZmlsdGVyX2xldmVsOiVkXG4iLCBjcGktPnRpbWVfcGlja19scGYgLyAxMDAwKTsKLSAgICAgICAgICAgIHByaW50ZigiXG5fZnJhbWVzIHJlY2l2ZV9kYXRhIGVuY29kX21iX3JvdyBjb21wcmVzc19mcmFtZSAgVG90YWxcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIlNmQgJTEwbGQgJTEwbGQgJTEwbGQgJTEwbGRcbiIsIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsIGNwaS0+dGltZV9yZWNlaXZlX2RhdGEgLyAxMDAwLCBjcGktPnRpbWVfZW5jb2RlX21iX3JvdyAvIDEwMDAsIGNwaS0+dGltZV9jb21wcmVzc19kYXRhIC8gMTAwMCwgKGNwaS0+dGltZV9yZWNlaXZlX2RhdGEgKyBjcGktPnRpbWVfY29tcHJlc3NfZGF0YSkgLyAxMDAwKTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICB9Ci0KLSNpZiBDT05GSUdfTVVMVElUSFJFQUQKLSAgICB2cDhjeF9yZW1vdmVfZW5jb2Rlcl90aHJlYWRzKGNwaSk7Ci0jZW5kaWYKLQotICAgIGRlYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7Ci0gICAgdnB4X2ZyZWUoY3BpLT5tYi5zcyk7Ci0gICAgdnB4X2ZyZWUoY3BpLT50b2spOwotICAgIHZweF9mcmVlKGNwaS0+Y3ljbGljX3JlZnJlc2hfbWFwKTsKLQotICAgIHZwOF9yZW1vdmVfY29tbW9uKCZjcGktPmNvbW1vbik7Ci0gICAgdnB4X2ZyZWUoY3BpKTsKLSAgICAqcHRyID0gMDsKLQotI2lmZGVmIE9VVFBVVF9ZVVZfU1JDCi0gICAgZmNsb3NlKHl1dl9maWxlKTsKLSNlbmRpZgotCi0jaWYgMAotCi0gICAgaWYgKGtleWZpbGUpCi0gICAgICAgIGZjbG9zZShrZXlmaWxlKTsKLQotICAgIGlmIChmcmFtZXBzbnIpCi0gICAgICAgIGZjbG9zZShmcmFtZXBzbnIpOwotCi0gICAgaWYgKGtmX2xpc3QpCi0gICAgICAgIGZjbG9zZShrZl9saXN0KTsKLQotI2VuZGlmCi0KLX0KLQotCi1zdGF0aWMgdWludDY0X3QgY2FsY19wbGFuZV9lcnJvcih1bnNpZ25lZCBjaGFyICpvcmlnLCBpbnQgb3JpZ19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpyZWNvbiwgaW50IHJlY29uX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb2xzLCB1bnNpZ25lZCBpbnQgcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF92YXJpYW5jZV9ydGNkX3Z0YWJsZV90ICpydGNkKQotewotICAgIHVuc2lnbmVkIGludCByb3csIGNvbDsKLSAgICB1aW50NjRfdCB0b3RhbF9zc2UgPSAwOwotICAgIGludCBkaWZmOwotCi0gICAgZm9yIChyb3cgPSAwOyByb3cgKyAxNiA8PSByb3dzOyByb3cgKz0gMTYpCi0gICAgewotICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCArIDE2IDw9IGNvbHM7IGNvbCArPSAxNikKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHNzZTsKLQotICAgICAgICAgICAgVkFSSUFOQ0VfSU5WT0tFKHJ0Y2QsIG1zZTE2eDE2KShvcmlnICsgY29sLCBvcmlnX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb24gKyBjb2wsIHJlY29uX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNzZSk7Ci0gICAgICAgICAgICB0b3RhbF9zc2UgKz0gc3NlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFuZGxlIG9kZC1zaXplZCB3aWR0aCAqLwotICAgICAgICBpZiAoY29sIDwgY29scykKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgYm9yZGVyX3JvdywgYm9yZGVyX2NvbDsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJvcmRlcl9vcmlnID0gb3JpZzsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJvcmRlcl9yZWNvbiA9IHJlY29uOwotCi0gICAgICAgICAgICBmb3IgKGJvcmRlcl9yb3cgPSAwOyBib3JkZXJfcm93IDwgMTY7IGJvcmRlcl9yb3crKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGJvcmRlcl9jb2wgPSBjb2w7IGJvcmRlcl9jb2wgPCBjb2xzOyBib3JkZXJfY29sKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkaWZmID0gYm9yZGVyX29yaWdbYm9yZGVyX2NvbF0gLSBib3JkZXJfcmVjb25bYm9yZGVyX2NvbF07Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsX3NzZSArPSBkaWZmICogZGlmZjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib3JkZXJfb3JpZyArPSBvcmlnX3N0cmlkZTsKLSAgICAgICAgICAgICAgICBib3JkZXJfcmVjb24gKz0gcmVjb25fc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3JpZyArPSBvcmlnX3N0cmlkZSAqIDE2OwotICAgICAgICByZWNvbiArPSByZWNvbl9zdHJpZGUgKiAxNjsKLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgb2RkLXNpemVkIGhlaWdodCAqLwotICAgIGZvciAoOyByb3cgPCByb3dzOyByb3crKykKLSAgICB7Ci0gICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgY29sczsgY29sKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZmYgPSBvcmlnW2NvbF0gLSByZWNvbltjb2xdOwotICAgICAgICAgICAgdG90YWxfc3NlICs9IGRpZmYgKiBkaWZmOwotICAgICAgICB9Ci0KLSAgICAgICAgb3JpZyArPSBvcmlnX3N0cmlkZTsKLSAgICAgICAgcmVjb24gKz0gcmVjb25fc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiB0b3RhbF9zc2U7Ci19Ci0KLQotc3RhdGljIHZvaWQgZ2VuZXJhdGVfcHNucl9wYWNrZXQoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAqb3JpZyA9IGNwaS0+U291cmNlOwotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICpyZWNvbiA9IGNwaS0+Y29tbW9uLmZyYW1lX3RvX3Nob3c7Ci0gICAgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgIHBrdDsKLSAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgc3NlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB3aWR0aCA9IGNwaS0+Y29tbW9uLldpZHRoOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBoZWlnaHQgPSBjcGktPmNvbW1vbi5IZWlnaHQ7Ci0KLSAgICBwa3Qua2luZCA9IFZQWF9DT0RFQ19QU05SX1BLVDsKLSAgICBzc2UgPSBjYWxjX3BsYW5lX2Vycm9yKG9yaWctPnlfYnVmZmVyLCBvcmlnLT55X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uLT55X2J1ZmZlciwgcmVjb24tPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotICAgIHBrdC5kYXRhLnBzbnIuc3NlWzBdID0gc3NlOwotICAgIHBrdC5kYXRhLnBzbnIuc3NlWzFdID0gc3NlOwotICAgIHBrdC5kYXRhLnBzbnIuc2FtcGxlc1swXSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHBrdC5kYXRhLnBzbnIuc2FtcGxlc1sxXSA9IHdpZHRoICogaGVpZ2h0OwotCi0gICAgd2lkdGggPSAod2lkdGggKyAxKSAvIDI7Ci0gICAgaGVpZ2h0ID0gKGhlaWdodCArIDEpIC8gMjsKLQotICAgIHNzZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+dV9idWZmZXIsIG9yaWctPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uLT51X2J1ZmZlciwgcmVjb24tPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLSAgICBwa3QuZGF0YS5wc25yLnNzZVswXSArPSBzc2U7Ci0gICAgcGt0LmRhdGEucHNuci5zc2VbMl0gPSBzc2U7Ci0gICAgcGt0LmRhdGEucHNuci5zYW1wbGVzWzBdICs9IHdpZHRoICogaGVpZ2h0OwotICAgIHBrdC5kYXRhLnBzbnIuc2FtcGxlc1syXSA9IHdpZHRoICogaGVpZ2h0OwotCi0gICAgc3NlID0gY2FsY19wbGFuZV9lcnJvcihvcmlnLT52X2J1ZmZlciwgb3JpZy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb24tPnZfYnVmZmVyLCByZWNvbi0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotICAgIHBrdC5kYXRhLnBzbnIuc3NlWzBdICs9IHNzZTsKLSAgICBwa3QuZGF0YS5wc25yLnNzZVszXSA9IHNzZTsKLSAgICBwa3QuZGF0YS5wc25yLnNhbXBsZXNbMF0gKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgcGt0LmRhdGEucHNuci5zYW1wbGVzWzNdID0gd2lkdGggKiBoZWlnaHQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICBwa3QuZGF0YS5wc25yLnBzbnJbaV0gPSB2cDhfbXNlMnBzbnIocGt0LmRhdGEucHNuci5zYW1wbGVzW2ldLCAyNTUuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC5kYXRhLnBzbnIuc3NlW2ldKTsKLQotICAgIHZweF9jb2RlY19wa3RfbGlzdF9hZGQoY3BpLT5vdXRwdXRfcGt0X2xpc3QsICZwa3QpOwotfQotCi0KLWludCB2cDhfdXNlX2FzX3JlZmVyZW5jZShWUDhfUFRSIHB0ciwgaW50IHJlZl9mcmFtZV9mbGFncykKLXsKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopKHB0cik7Ci0KLSAgICBpZiAocmVmX2ZyYW1lX2ZsYWdzID4gNykKLSAgICAgICAgcmV0dXJuIC0xIDsKLQotICAgIGNwaS0+cmVmX2ZyYW1lX2ZsYWdzID0gcmVmX2ZyYW1lX2ZsYWdzOwotICAgIHJldHVybiAwOwotfQotaW50IHZwOF91cGRhdGVfcmVmZXJlbmNlKFZQOF9QVFIgcHRyLCBpbnQgcmVmX2ZyYW1lX2ZsYWdzKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikocHRyKTsKLQotICAgIGlmIChyZWZfZnJhbWVfZmxhZ3MgPiA3KQotICAgICAgICByZXR1cm4gLTEgOwotCi0gICAgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOwotICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSA9IDA7Ci0gICAgY3BpLT5jb21tb24ucmVmcmVzaF9sYXN0X2ZyYW1lICAgPSAwOwotCi0gICAgaWYgKHJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZMQUcpCi0gICAgICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfbGFzdF9mcmFtZSA9IDE7Ci0KLSAgICBpZiAocmVmX2ZyYW1lX2ZsYWdzICYgVlA4X0dPTERfRkxBRykKLSAgICAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAxOwotCi0gICAgaWYgKHJlZl9mcmFtZV9mbGFncyAmIFZQOF9BTFRfRkxBRykKLSAgICAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lID0gMTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgdnA4X2dldF9yZWZlcmVuY2UoVlA4X1BUUiBwdHIsIFZQOF9SRUZGUkFNRSByZWZfZnJhbWVfZmxhZywgWVYxMl9CVUZGRVJfQ09ORklHICpzZCkKLXsKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopKHB0cik7Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0gICAgaW50IHJlZl9mYl9pZHg7Ci0KLSAgICBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0xBU1RfRkxBRykKLSAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5sc3RfZmJfaWR4OwotICAgIGVsc2UgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9HT0xEX0ZMQUcpCi0gICAgICAgIHJlZl9mYl9pZHggPSBjbS0+Z2xkX2ZiX2lkeDsKLSAgICBlbHNlIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfQUxUX0ZMQUcpCi0gICAgICAgIHJlZl9mYl9pZHggPSBjbS0+YWx0X2ZiX2lkeDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKCZjbS0+eXYxMl9mYltyZWZfZmJfaWR4XSwgc2QpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci1pbnQgdnA4X3NldF9yZWZlcmVuY2UoVlA4X1BUUiBwdHIsIFZQOF9SRUZGUkFNRSByZWZfZnJhbWVfZmxhZywgWVYxMl9CVUZGRVJfQ09ORklHICpzZCkKLXsKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopKHB0cik7Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0KLSAgICBpbnQgcmVmX2ZiX2lkeDsKLQotICAgIGlmIChyZWZfZnJhbWVfZmxhZyA9PSBWUDhfTEFTVF9GTEFHKQotICAgICAgICByZWZfZmJfaWR4ID0gY20tPmxzdF9mYl9pZHg7Ci0gICAgZWxzZSBpZiAocmVmX2ZyYW1lX2ZsYWcgPT0gVlA4X0dPTERfRkxBRykKLSAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5nbGRfZmJfaWR4OwotICAgIGVsc2UgaWYgKHJlZl9mcmFtZV9mbGFnID09IFZQOF9BTFRfRkxBRykKLSAgICAgICAgcmVmX2ZiX2lkeCA9IGNtLT5hbHRfZmJfaWR4OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoc2QsICZjbS0+eXYxMl9mYltyZWZfZmJfaWR4XSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLWludCB2cDhfdXBkYXRlX2VudHJvcHkoVlA4X1BUUiBjb21wLCBpbnQgdXBkYXRlKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikgY29tcDsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLSAgICBjbS0+cmVmcmVzaF9lbnRyb3B5X3Byb2JzID0gdXBkYXRlOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotI2lmIE9VVFBVVF9ZVVZfU1JDCi12b2lkIHZwOF93cml0ZV95dXZfZnJhbWUoY29uc3QgY2hhciAqbmFtZSwgWVYxMl9CVUZGRVJfQ09ORklHICpzKQotewotICAgIEZJTEUgKnl1dl9maWxlID0gZm9wZW4obmFtZSwgImFiIik7Ci0gICAgdW5zaWduZWQgY2hhciAqc3JjID0gcy0+eV9idWZmZXI7Ci0gICAgaW50IGggPSBzLT55X2hlaWdodDsKLQotICAgIGRvCi0gICAgewotICAgICAgICBmd3JpdGUoc3JjLCBzLT55X3dpZHRoLCAxLCAgeXV2X2ZpbGUpOwotICAgICAgICBzcmMgKz0gcy0+eV9zdHJpZGU7Ci0gICAgfQotICAgIHdoaWxlICgtLWgpOwotCi0gICAgc3JjID0gcy0+dV9idWZmZXI7Ci0gICAgaCA9IHMtPnV2X2hlaWdodDsKLQotICAgIGRvCi0gICAgewotICAgICAgICBmd3JpdGUoc3JjLCBzLT51dl93aWR0aCwgMSwgIHl1dl9maWxlKTsKLSAgICAgICAgc3JjICs9IHMtPnV2X3N0cmlkZTsKLSAgICB9Ci0gICAgd2hpbGUgKC0taCk7Ci0KLSAgICBzcmMgPSBzLT52X2J1ZmZlcjsKLSAgICBoID0gcy0+dXZfaGVpZ2h0OwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGZ3cml0ZShzcmMsIHMtPnV2X3dpZHRoLCAxLCB5dXZfZmlsZSk7Ci0gICAgICAgIHNyYyArPSBzLT51dl9zdHJpZGU7Ci0gICAgfQotICAgIHdoaWxlICgtLWgpOwotCi0gICAgZmNsb3NlKHl1dl9maWxlKTsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkIHNjYWxlX2FuZF9leHRlbmRfc291cmNlKFlWMTJfQlVGRkVSX0NPTkZJRyAqc2QsIFZQOF9DT01QICpjcGkpCi17Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0KLSAgICAvLyBhcmUgd2UgcmVzaXppbmcgdGhlIGltYWdlCi0gICAgaWYgKGNtLT5ob3Jpel9zY2FsZSAhPSAwIHx8IGNtLT52ZXJ0X3NjYWxlICE9IDApCi0gICAgewotI2lmIENPTkZJR19TUEFUSUFMX1JFU0FNUExJTkcKLSAgICAgICAgaW50IFVOSU5JVElBTElaRURfSVNfU0FGRShociksIFVOSU5JVElBTElaRURfSVNfU0FGRShocyk7Ci0gICAgICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUodnIpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUodnMpOwotICAgICAgICBpbnQgdG1wX2hlaWdodDsKLQotICAgICAgICBpZiAoY20tPnZlcnRfc2NhbGUgPT0gMykKLSAgICAgICAgICAgIHRtcF9oZWlnaHQgPSA5OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0bXBfaGVpZ2h0ID0gMTE7Ci0KLSAgICAgICAgU2NhbGUyUmF0aW8oY20tPmhvcml6X3NjYWxlLCAmaHIsICZocyk7Ci0gICAgICAgIFNjYWxlMlJhdGlvKGNtLT52ZXJ0X3NjYWxlLCAmdnIsICZ2cyk7Ci0KLSAgICAgICAgdnA4X3NjYWxlX2ZyYW1lKHNkLCAmY3BpLT5zY2FsZWRfc291cmNlLCBjbS0+dGVtcF9zY2FsZV9mcmFtZS55X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9oZWlnaHQsIGhzLCBociwgdnMsIHZyLCAwKTsKLQotICAgICAgICBjcGktPlNvdXJjZSA9ICZjcGktPnNjYWxlZF9zb3VyY2U7Ci0jZW5kaWYKLSAgICB9Ci0gICAgLy8gd2UgbWF5IG5lZWQgdG8gY29weSB0byBhIGJ1ZmZlciBzbyB3ZSBjYW4gZXh0ZW5kIHRoZSBpbWFnZS4uLgotICAgIGVsc2UgaWYgKGNtLT5XaWR0aCAhPSBjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF0ueV93aWR0aCB8fAotICAgICAgICAgICAgIGNtLT5IZWlnaHQgIT0gY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLnlfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgLy92cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihzZCwgJmNwaS0+c2NhbGVkX3NvdXJjZSk7Ci0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICAgICAgaWYgKGNtLT5ydGNkLmZsYWdzICYgSEFTX05FT04pCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X3l2MTJfY29weV9zcmNfZnJhbWVfZnVuY19uZW9uKHNkLCAmY3BpLT5zY2FsZWRfc291cmNlKTsKLSAgICAgICAgfQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICAgICAgZWxzZQotI2VuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9BUk1WNyB8fCBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKHNkLCAmY3BpLT5zY2FsZWRfc291cmNlKTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgY3BpLT5Tb3VyY2UgPSAmY3BpLT5zY2FsZWRfc291cmNlOwotICAgIH0KLQotICAgIHZwOF9leHRlbmRfdG9fbXVsdGlwbGVfb2YxNihjcGktPlNvdXJjZSwgY20tPldpZHRoLCBjbS0+SGVpZ2h0KTsKLQotfQotc3RhdGljIHZvaWQgcmVzaXplX2tleV9mcmFtZShWUDhfQ09NUCAqY3BpKQotewotI2lmIENPTkZJR19TUEFUSUFMX1JFU0FNUExJTkcKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLQotICAgIC8vIERvIHdlIG5lZWQgdG8gYXBwbHkgcmVzYW1wbGluZyBmb3Igb25lIHBhc3MgY2JyLgotICAgIC8vIEluIG9uZSBwYXNzIHRoaXMgaXMgbW9yZSBsaW1pdGVkIHRoYW4gaW4gdHdvIHBhc3MgY2JyCi0gICAgLy8gVGhlIHRlc3QgYW5kIGFueSBjaGFuZ2UgaXMgb25seSBtYWRlIG9uZSBwZXIga2V5IGZyYW1lIHNlcXVlbmNlCi0gICAgaWYgKGNwaS0+b3hjZi5hbGxvd19zcGF0aWFsX3Jlc2FtcGxpbmcgJiYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKSkKLSAgICB7Ci0gICAgICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUoaHIpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUoaHMpOwotICAgICAgICBpbnQgVU5JTklUSUFMSVpFRF9JU19TQUZFKHZyKSwgVU5JTklUSUFMSVpFRF9JU19TQUZFKHZzKTsKLSAgICAgICAgaW50IG5ld193aWR0aCwgbmV3X2hlaWdodDsKLQotICAgICAgICAvLyBJZiB3ZSBhcmUgYmVsb3cgdGhlIHJlc2FtcGxlIERPV04gd2F0ZXJtYXJrIHRoZW4gc2NhbGUgZG93biBhIG5vdGNoLgotICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPCAoY3BpLT5veGNmLnJlc2FtcGxlX2Rvd25fd2F0ZXJfbWFyayAqIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNtLT5ob3Jpel9zY2FsZSA9IChjbS0+aG9yaXpfc2NhbGUgPCBPTkVUV08pID8gY20tPmhvcml6X3NjYWxlICsgMSA6IE9ORVRXTzsKLSAgICAgICAgICAgIGNtLT52ZXJ0X3NjYWxlID0gKGNtLT52ZXJ0X3NjYWxlIDwgT05FVFdPKSA/IGNtLT52ZXJ0X3NjYWxlICsgMSA6IE9ORVRXTzsKLSAgICAgICAgfQotICAgICAgICAvLyBTaG91bGQgd2Ugbm93IHN0YXJ0IHNjYWxpbmcgYmFjayB1cAotICAgICAgICBlbHNlIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA+IChjcGktPm94Y2YucmVzYW1wbGVfdXBfd2F0ZXJfbWFyayAqIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNtLT5ob3Jpel9zY2FsZSA9IChjbS0+aG9yaXpfc2NhbGUgPiBOT1JNQUwpID8gY20tPmhvcml6X3NjYWxlIC0gMSA6IE5PUk1BTDsKLSAgICAgICAgICAgIGNtLT52ZXJ0X3NjYWxlID0gKGNtLT52ZXJ0X3NjYWxlID4gTk9STUFMKSA/IGNtLT52ZXJ0X3NjYWxlIC0gMSA6IE5PUk1BTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgbmV3IGhpZWdodCBhbmQgd2lkdGgKLSAgICAgICAgU2NhbGUyUmF0aW8oY20tPmhvcml6X3NjYWxlLCAmaHIsICZocyk7Ci0gICAgICAgIFNjYWxlMlJhdGlvKGNtLT52ZXJ0X3NjYWxlLCAmdnIsICZ2cyk7Ci0gICAgICAgIG5ld193aWR0aCA9ICgoaHMgLSAxKSArIChjcGktPm94Y2YuV2lkdGggKiBocikpIC8gaHM7Ci0gICAgICAgIG5ld19oZWlnaHQgPSAoKHZzIC0gMSkgKyAoY3BpLT5veGNmLkhlaWdodCAqIHZyKSkgLyB2czsKLQotICAgICAgICAvLyBJZiB0aGUgaW1hZ2Ugc2l6ZSBoYXMgY2hhbmdlZCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMKLSAgICAgICAgLy8gYW5kIHJlc2FtcGxlIHRoZSBzb3VyY2UgaW1hZ2UKLSAgICAgICAgaWYgKChjbS0+V2lkdGggIT0gbmV3X3dpZHRoKSB8fCAoY20tPkhlaWdodCAhPSBuZXdfaGVpZ2h0KSkKLSAgICAgICAgewotICAgICAgICAgICAgY20tPldpZHRoID0gbmV3X3dpZHRoOwotICAgICAgICAgICAgY20tPkhlaWdodCA9IG5ld19oZWlnaHQ7Ci0gICAgICAgICAgICB2cDhfYWxsb2NfY29tcHJlc3Nvcl9kYXRhKGNwaSk7Ci0gICAgICAgICAgICBzY2FsZV9hbmRfZXh0ZW5kX3NvdXJjZShjcGktPnVuX3NjYWxlZF9zb3VyY2UsIGNwaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZgotfQotLy8gcmV0dXJuIG9mIDAgbWVhbnMgZHJvcCBmcmFtZQotc3RhdGljIGludCBwaWNrX2ZyYW1lX3NpemUoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLQotICAgIC8vIEZpcnN0IEZyYW1lIGlzIGEgc3BlY2lhbCBjYXNlCi0gICAgaWYgKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID09IDApCi0gICAgewotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0KLSAgICAgICAgaWYgKGNwaS0+cGFzcyA9PSAyKQotICAgICAgICAgICAgdnA4X2NhbGNfYXV0b19pZnJhbWVfdGFyZ2V0X3NpemUoY3BpKTsKLQotICAgICAgICAvLyAxIFBhc3MgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gb24gd2hpY2ggdG8gYmFzZSBzaXplIHNvIHVzZSBiYW5kd2lkdGggcGVyIHNlY29uZCAqIGZpeGVkIGZyYWN0aW9uCi0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IGNwaS0+b3hjZi50YXJnZXRfYmFuZHdpZHRoIC8gMjsKLQotICAgICAgICAvLyBpbiBlcnJvciByZXNpbGllbnQgbW9kZSB0aGUgZmlyc3QgZnJhbWUgaXMgYmlnZ2VyIHNpbmNlIGl0IGxpa2VseSBjb250YWlucwotICAgICAgICAvLyBhbGwgdGhlIHN0YXRpYyBiYWNrZ3JvdW5kCi0gICAgICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUgPT0gMSB8fCAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICo9IDM7ICAgICAgLy8gNTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEtleSBmcmFtZSBmcm9tIFZGVy9hdXRvLWtleWZyYW1lL2ZpcnN0IGZyYW1lCi0gICAgICAgIGNtLT5mcmFtZV90eXBlID0gS0VZX0ZSQU1FOwotCi0gICAgfQotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZm9yY2VkIGtleSBmcmFtZXMKLSAgICAvLyBUaGUgZnJhbWUgc2l6aW5nIGhlcmUgaXMgc3RpbGwgZmFyIGZyb20gaWRlYWwgZm9yIDIgcGFzcy4KLSAgICBlbHNlIGlmIChjbS0+ZnJhbWVfZmxhZ3MgJiBGUkFNRUZMQUdTX0tFWSkKLSAgICB7Ci0gICAgICAgIGNtLT5mcmFtZV90eXBlID0gS0VZX0ZSQU1FOwotICAgICAgICByZXNpemVfa2V5X2ZyYW1lKGNwaSk7Ci0gICAgICAgIHZwOF9jYWxjX2lmcmFtZV90YXJnZXRfc2l6ZShjcGkpOwotICAgIH0KLSAgICBlbHNlIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgewotICAgICAgICB2cDhfY2FsY19hdXRvX2lmcmFtZV90YXJnZXRfc2l6ZShjcGkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBJTlRFUiBmcmFtZTogY29tcHV0ZSB0YXJnZXQgZnJhbWUgc2l6ZQotICAgICAgICBjbS0+ZnJhbWVfdHlwZSA9IElOVEVSX0ZSQU1FOwotICAgICAgICB2cDhfY2FsY19wZnJhbWVfdGFyZ2V0X3NpemUoY3BpKTsKLQotICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkcm9wcGluZyB0aGUgZnJhbWU6Ci0gICAgICAgIGlmIChjcGktPmRyb3BfZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+ZHJvcF9mcmFtZSA9IEZBTFNFOwotICAgICAgICAgICAgY3BpLT5kcm9wX2NvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfcXVhbnRpemVyKFZQOF9DT01QICpjcGksIGludCBRKQotewotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotICAgIE1BQ1JPQkxPQ0tEICptYmQgPSAmY3BpLT5tYi5lX21iZDsKLSAgICBpbnQgdXBkYXRlID0gMDsKLSAgICBpbnQgbmV3X2RlbHRhX3E7Ci0gICAgY20tPmJhc2VfcWluZGV4ID0gUTsKLQotICAgIC8qIGlmIGFueSBvZiB0aGUgZGVsdGFfcSB2YWx1ZXMgYXJlIGNoYW5naW5nIHVwZGF0ZSBmbGFnIGhhcyB0byBiZSBzZXQgKi8KLSAgICAvKiBjdXJyZW50bHkgb25seSB5MmRjX2RlbHRhX3EgbWF5IGNoYW5nZSAqLwotCi0gICAgY20tPnkxZGNfZGVsdGFfcSA9IDA7Ci0gICAgY20tPnkyYWNfZGVsdGFfcSA9IDA7Ci0gICAgY20tPnV2ZGNfZGVsdGFfcSA9IDA7Ci0gICAgY20tPnV2YWNfZGVsdGFfcSA9IDA7Ci0KLSAgICBpZiAoUSA8IDQpCi0gICAgewotICAgICAgICBuZXdfZGVsdGFfcSA9IDQtUTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBuZXdfZGVsdGFfcSA9IDA7Ci0KLSAgICB1cGRhdGUgfD0gY20tPnkyZGNfZGVsdGFfcSAhPSBuZXdfZGVsdGFfcTsKLSAgICBjbS0+eTJkY19kZWx0YV9xID0gbmV3X2RlbHRhX3E7Ci0KLQotICAgIC8vIFNldCBTZWdtZW50IHNwZWNpZmljIHF1YXRpemVycwotICAgIG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVswXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVswXTsKLSAgICBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMV0gPSBjcGktPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMV07Ci0gICAgbWJkLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdID0gY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzJdOwotICAgIG1iZC0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXSA9IGNwaS0+c2VnbWVudF9mZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVszXTsKLQotICAgIC8qIHF1YW50aXplciBoYXMgdG8gYmUgcmVpbml0aWFsaXplZCBmb3IgYW55IGRlbHRhX3EgY2hhbmdlcyAqLwotICAgIGlmKHVwZGF0ZSkKLSAgICAgICAgdnA4Y3hfaW5pdF9xdWFudGl6ZXIoY3BpKTsKLQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYWx0X3JlZl9mcmFtZV9hbmRfc3RhdHMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLQotICAgIC8vIFVwZGF0ZSB0aGUgZ29sZGVuIGZyYW1lIGJ1ZmZlcgotICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKGNtLT5mcmFtZV90b19zaG93LCAmY20tPnl2MTJfZmJbY20tPmFsdF9mYl9pZHhdKTsKLQotICAgIC8vIFNlbGVjdCBhbiBpbnRlcnZhbCBiZWZvcmUgbmV4dCBHRiBvciBhbHRyZWYKLSAgICBpZiAoIWNwaS0+YXV0b19nb2xkKQotICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmdvbGRmcmVxOwotCi0gICAgaWYgKChjcGktPnBhc3MgIT0gMikgJiYgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlKQotICAgIHsKLSAgICAgICAgY3BpLT5jdXJyZW50X2dmX2ludGVydmFsID0gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOwotCi0gICAgICAgIC8vIFNldCB0aGUgYml0cyBwZXIgZnJhbWUgdGhhdCB3ZSBzaG91bGQgdHJ5IGFuZCByZWNvdmVyIGluIHN1YnNlcXVlbnQgaW50ZXIgZnJhbWVzCi0gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHRoZSBleHRyYSBHRiBzcGVuZC4uLiBub3RlIHRoYXQgaGlzIGRvZXMgbm90IGFwcGx5IGZvciBHRiB1cGRhdGVzCi0gICAgICAgIC8vIHRoYXQgb2NjdXIgY29pbmNpZGVudCB3aXRoIGEga2V5IGZyYW1lIGFzIHRoZSBleHRyYSBjb3N0IG9mIGtleSBmcmFtZXMgaXMgZGVhbHQKLSAgICAgICAgLy8gd2l0aCBlbHNld2hlcmUuCi0KLSAgICAgICAgY3BpLT5nZl9vdmVyc3BlbmRfYml0cyArPSBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplOwotICAgICAgICBjcGktPm5vbl9nZl9iaXRyYXRlX2FkanVzdG1lbnQgPSBjcGktPmdmX292ZXJzcGVuZF9iaXRzIC8gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOwotICAgIH0KLQotICAgIC8vIFVwZGF0ZSBkYXRhIHN0cnVjdHVyZSB0aGF0IG1vbml0b3JzIGxldmVsIG9mIHJlZmVyZW5jZSB0byBsYXN0IEdGCi0gICAgdnB4X21lbXNldChjcGktPmdmX2FjdGl2ZV9mbGFncywgMSwgKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpKTsKLSAgICBjcGktPmdmX2FjdGl2ZV9jb3VudCA9IGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHM7Ci0KLSAgICAvLyB0aGlzIGZyYW1lIHJlZnJlc2hlcyBtZWFucyBuZXh0IGZyYW1lcyBkb24ndCB1bmxlc3Mgc3BlY2lmaWVkIGJ5IHVzZXIKLSAgICBjcGktPmNvbW1vbi5mcmFtZXNfc2luY2VfZ29sZGVuID0gMDsKLQotICAgIC8vIENsZWFyIHRoZSBhbHRlcm5hdGUgcmVmZXJlbmNlIHVwZGF0ZSBwZW5kaW5nIGZsYWcuCi0gICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gRkFMU0U7Ci0KLSAgICAvLyBTZXQgdGhlIGFsdGVybmF0ZSByZWZlcm5jZSBmcmFtZSBhY3RpdmUgZmxhZwotICAgIGNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlID0gVFJVRTsKLQotCi19Ci1zdGF0aWMgdm9pZCB1cGRhdGVfZ29sZGVuX2ZyYW1lX2FuZF9zdGF0cyhWUDhfQ09NUCAqY3BpKQotewotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotCi0gICAgLy8gVXBkYXRlIHRoZSBHb2xkZW4gZnJhbWUgcmVjb25zdHJ1Y3Rpb24gYnVmZmVyIGlmIHNpZ25hbGxlZCBhbmQgdGhlIEdGIHVzYWdlIGNvdW50cy4KLSAgICBpZiAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBnb2xkZW4gZnJhbWUgYnVmZmVyCi0gICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihjbS0+ZnJhbWVfdG9fc2hvdywgJmNtLT55djEyX2ZiW2NtLT5nbGRfZmJfaWR4XSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWxlY3QgYW4gaW50ZXJ2YWwgYmVmb3JlIG5leHQgR0YKLSAgICAgICAgaWYgKCFjcGktPmF1dG9fZ29sZCkKLSAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9IGNwaS0+Z29sZGZyZXE7Ci0KLSAgICAgICAgaWYgKChjcGktPnBhc3MgIT0gMikgJiYgKGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA+IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmN1cnJlbnRfZ2ZfaW50ZXJ2YWwgPSBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgYml0cyBwZXIgZnJhbWUgdGhhdCB3ZSBzaG91bGQgdHJ5IGFuZCByZWNvdmVyIGluIHN1YnNlcXVlbnQgaW50ZXIgZnJhbWVzCi0gICAgICAgICAgICAvLyB0byBhY2NvdW50IGZvciB0aGUgZXh0cmEgR0Ygc3BlbmQuLi4gbm90ZSB0aGF0IGhpcyBkb2VzIG5vdCBhcHBseSBmb3IgR0YgdXBkYXRlcwotICAgICAgICAgICAgLy8gdGhhdCBvY2N1ciBjb2luY2lkZW50IHdpdGggYSBrZXkgZnJhbWUgYXMgdGhlIGV4dHJhIGNvc3Qgb2Yga2V5IGZyYW1lcyBpcyBkZWFsdAotICAgICAgICAgICAgLy8gd2l0aCBlbHNld2hlcmUuCi0gICAgICAgICAgICBpZiAoKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYgIWNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIENhbGNsdWF0ZSBHRiBiaXRzIHRvIGJlIHJlY292ZXJlZAotICAgICAgICAgICAgICAgIC8vIFByb2plY3RlZCBzaXplIC0gYXYgZnJhbWUgYml0cyBhdmFpbGFibGUgZm9yIGludGVyIGZyYW1lcyBmb3IgY2xpcCBhcyBhIHdob2xlCi0gICAgICAgICAgICAgICAgY3BpLT5nZl9vdmVyc3BlbmRfYml0cyArPSAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSAtIGNwaS0+aW50ZXJfZnJhbWVfdGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3BpLT5ub25fZ2ZfYml0cmF0ZV9hZGp1c3RtZW50ID0gY3BpLT5nZl9vdmVyc3BlbmRfYml0cyAvIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIGRhdGEgc3RydWN0dXJlIHRoYXQgbW9uaXRvcnMgbGV2ZWwgb2YgcmVmZXJlbmNlIHRvIGxhc3QgR0YKLSAgICAgICAgdnB4X21lbXNldChjcGktPmdmX2FjdGl2ZV9mbGFncywgMSwgKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpKTsKLSAgICAgICAgY3BpLT5nZl9hY3RpdmVfY291bnQgPSBjbS0+bWJfcm93cyAqIGNtLT5tYl9jb2xzOwotCi0gICAgICAgIC8vIHRoaXMgZnJhbWUgcmVmcmVzaGVzIG1lYW5zIG5leHQgZnJhbWVzIGRvbid0IHVubGVzcyBzcGVjaWZpZWQgYnkgdXNlcgotICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOwotICAgICAgICBjcGktPmNvbW1vbi5mcmFtZXNfc2luY2VfZ29sZGVuID0gMDsKLQotICAgICAgICAvL2lmICggY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICkKLSAgICAgICAgLy97Ci0gICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtJTlRSQV9GUkFNRV0gPSAxOwotICAgICAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbTEFTVF9GUkFNRV0gPSAxOwotICAgICAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbR09MREVOX0ZSQU1FXSA9IDE7Ci0gICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtBTFRSRUZfRlJBTUVdID0gMTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vZWxzZQotICAgICAgICAvL3sKLSAgICAgICAgLy8gIC8vIENhcnJ5IGEgcG90cnRpb24gb2YgY291bnQgb3ZlciB0byBiZWdpbmluZyBvZiBuZXh0IGdmIHNlcXVlbmNlCi0gICAgICAgIC8vICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbSU5UUkFfRlJBTUVdID4+PSA1OwotICAgICAgICAvLyAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdID4+PSA1OwotICAgICAgICAvLyAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gPj49IDU7Ci0gICAgICAgIC8vICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbQUxUUkVGX0ZSQU1FXSA+Pj0gNTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy8gKioqKioqKiogRml4ZWQgUSB0ZXN0IGNvZGUgb25seSAqKioqKioqKioqKioKLSAgICAgICAgLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgQUxUIHJlZmVyZW5jZSBmb3IgdGhlIG5leHQgZ3JvdXAgb2YgZnJhbWVzIHNldCBhIGZsYWcgdG8gc2F5IHNvLgotICAgICAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPj0gMCAmJgotICAgICAgICAgICAgY3BpLT5veGNmLnBsYXlfYWx0ZXJuYXRlICYmICFjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IFRSVUU7Ci0gICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcpCi0gICAgICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSA9IEZBTFNFOwotCi0gICAgICAgIC8vIERlY3JlbWVudCBjb3VudCBkb3duIHRpbGwgbmV4dCBnZgotICAgICAgICBpZiAoY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID4gMCkKLSAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZS0tOwotCi0gICAgfQotICAgIGVsc2UgaWYgKCFjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgewotICAgICAgICAvLyBEZWNyZW1lbnQgY291bnQgZG93biB0aWxsIG5leHQgZ2YKLSAgICAgICAgaWYgKGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA+IDApCi0gICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUtLTsKLQotICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgICAgIGNwaS0+Y29tbW9uLmZyYW1lc190aWxsX2FsdF9yZWZfZnJhbWUgLS07Ci0KLSAgICAgICAgY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiArKzsKLQotICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtJTlRSQV9GUkFNRV0gKz0gY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbSU5UUkFfRlJBTUVdOwotICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdICs9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdOwotICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKz0gY3BpLT5jb3VudF9tYl9yZWZfZnJhbWVfdXNhZ2VbR09MREVOX0ZSQU1FXTsKLSAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtBTFRSRUZfRlJBTUVdICs9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgcmVmZXJlbmNlIGZyYW1lIHByb2JhYmlsaXR5IGVzdGltYXRlcyB0aGF0Ci0vLyB3aWxsIGJlIHVzZWQgZHVyaW5nIG1vZGUgc2VsZWN0aW9uCi1zdGF0aWMgdm9pZCB1cGRhdGVfcmRfcmVmX2ZyYW1lX3Byb2JzKFZQOF9DT01QICpjcGkpCi17Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0KLSNpZiAwCi0gICAgY29uc3QgaW50ICpjb25zdCByZmN0ID0gY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlOwotICAgIGNvbnN0IGludCByZl9pbnRyYSA9IHJmY3RbSU5UUkFfRlJBTUVdOwotICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07Ci0KLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkID0gMjU1OwotICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCAgPSAxMjg7Ci0gICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCAgPSAxMjg7Ci0gICAgfQotICAgIGVsc2UgaWYgKCEocmZfaW50cmEgKyByZl9pbnRlcikpCi0gICAgewotICAgICAgICAvLyBUaGlzIGlzIGEgdHJhcCBpbiBjYXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW10gYmxhbmsuCi0gICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDYzOwotICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCAgPSAxMjg7Ci0gICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCAgICA9IDEyODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkID0gKHJmX2ludHJhICogMjU1KSAvIChyZl9pbnRyYSArIHJmX2ludGVyKTsKLQotICAgICAgICBpZiAoY3BpLT5wcm9iX2ludHJhX2NvZGVkIDwgMSkKLSAgICAgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDE7Ci0KLSAgICAgICAgaWYgKChjbS0+ZnJhbWVzX3NpbmNlX2dvbGRlbiA+IDApIHx8IGNwaS0+c291cmNlX2FsdF9yZWZfYWN0aXZlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IHJmX2ludGVyID8gKHJmY3RbTEFTVF9GUkFNRV0gKiAyNTUpIC8gcmZfaW50ZXIgOiAxMjg7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPnByb2JfbGFzdF9jb2RlZCA8IDEpCi0gICAgICAgICAgICAgICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgPSAxOwotCi0gICAgICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAocmZjdFtHT0xERU5fRlJBTUVdICsgcmZjdFtBTFRSRUZfRlJBTUVdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAocmZjdFtHT0xERU5fRlJBTUVdICogMjU1KSAvIChyZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV0pIDogMTI4OwotCi0gICAgICAgICAgICBpZiAoY3BpLT5wcm9iX2dmX2NvZGVkIDwgMSkKLSAgICAgICAgICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0jZWxzZQotICAgIGNvbnN0IGludCAqY29uc3QgcmZjdCA9IGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlOwotICAgIGNvbnN0IGludCByZl9pbnRyYSA9IHJmY3RbSU5UUkFfRlJBTUVdOwotICAgIGNvbnN0IGludCByZl9pbnRlciA9IHJmY3RbTEFTVF9GUkFNRV0gKyByZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV07Ci0KLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkID0gMjU1OwotICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCAgPSAxMjg7Ci0gICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCAgPSAxMjg7Ci0gICAgfQotICAgIGVsc2UgaWYgKCEocmZfaW50cmEgKyByZl9pbnRlcikpCi0gICAgewotICAgICAgICAvLyBUaGlzIGlzIGEgdHJhcCBpbiBjYXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW10gYmxhbmsuCi0gICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDYzOwotICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCAgPSAxMjg7Ci0gICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCAgICA9IDEyODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3BpLT5wcm9iX2ludHJhX2NvZGVkID0gKHJmX2ludHJhICogMjU1KSAvIChyZl9pbnRyYSArIHJmX2ludGVyKTsKLQotICAgICAgICBpZiAoY3BpLT5wcm9iX2ludHJhX2NvZGVkIDwgMSkKLSAgICAgICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCA9IDE7Ci0KLSAgICAgICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgPSByZl9pbnRlciA/IChyZmN0W0xBU1RfRlJBTUVdICogMjU1KSAvIHJmX2ludGVyIDogMTI4OwotCi0gICAgICAgIGlmIChjcGktPnByb2JfbGFzdF9jb2RlZCA8IDEpCi0gICAgICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IDE7Ci0KLSAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkID0gKHJmY3RbR09MREVOX0ZSQU1FXSArIHJmY3RbQUxUUkVGX0ZSQU1FXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAocmZjdFtHT0xERU5fRlJBTUVdICogMjU1KSAvIChyZmN0W0dPTERFTl9GUkFNRV0gKyByZmN0W0FMVFJFRl9GUkFNRV0pIDogMTI4OwotCi0gICAgICAgIGlmIChjcGktPnByb2JfZ2ZfY29kZWQgPCAxKQotICAgICAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkID0gMTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUgcmVmZXJlbmNlIGZyYW1lIGNvc3RzIHNpbmNlIHdlIGNhbiBkbyBiZXR0ZXIgdGhhbiB3aGF0IHdlIGdvdCBsYXN0IGZyYW1lLgotCi0gICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICB7Ci0gICAgICAgIGNwaS0+cHJvYl9pbnRyYV9jb2RlZCArPSA0MDsKLSAgICAgICAgY3BpLT5wcm9iX2xhc3RfY29kZWQgPSAyMDA7Ci0gICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNwaS0+Y29tbW9uLmZyYW1lc19zaW5jZV9nb2xkZW4gPT0gMCkKLSAgICB7Ci0gICAgICAgIGNwaS0+cHJvYl9sYXN0X2NvZGVkID0gMjE0OwotICAgICAgICBjcGktPnByb2JfZ2ZfY29kZWQgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChjcGktPmNvbW1vbi5mcmFtZXNfc2luY2VfZ29sZGVuID09IDEpCi0gICAgewotICAgICAgICBjcGktPnByb2JfbGFzdF9jb2RlZCA9IDE5MjsKLSAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkID0gMjIwOwotICAgIH0KLSAgICBlbHNlIGlmIChjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkKLSAgICB7Ci0gICAgICAgIC8vaW50IGRpc3QgPSBjcGktPmNvbW1vbi5mcmFtZXNfdGlsbF9hbHRfcmVmX2ZyYW1lICsgY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbjsKLSAgICAgICAgY3BpLT5wcm9iX2dmX2NvZGVkIC09IDIwOwotCi0gICAgICAgIGlmIChjcGktPnByb2JfZ2ZfY29kZWQgPCAxMCkKLSAgICAgICAgICAgIGNwaS0+cHJvYl9nZl9jb2RlZCA9IDEwOwotICAgIH0KLQotI2VuZGlmCi19Ci0KLQotLy8gMSA9IGtleSwgMCA9IGludGVyCi1zdGF0aWMgaW50IGRlY2lkZV9rZXlfZnJhbWUoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLQotICAgIGludCBjb2RlX2tleV9mcmFtZSA9IEZBTFNFOwotCi0gICAgY3BpLT5rZl9ib29zdCA9IDA7Ci0KLSAgICBpZiAoY3BpLT5TcGVlZCA+IDExKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBDbGVhciBkb3duIG1teCByZWdpc3RlcnMKLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7ICAvL19fYXNtIGVtbXM7Ci0KLSAgICBpZiAoKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAyKSAmJiAoY3BpLT5TcGVlZCA+PSA1KSAmJiAoY3BpLT5zZi5SRCA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGRvdWJsZSBjaGFuZ2UgPSAxLjAgKiBhYnMoKGludCkoY3BpLT5pbnRyYV9lcnJvciAtIGNwaS0+bGFzdF9pbnRyYV9lcnJvcikpIC8gKDEgKyBjcGktPmxhc3RfaW50cmFfZXJyb3IpOwotICAgICAgICBkb3VibGUgY2hhbmdlMiA9IDEuMCAqIGFicygoaW50KShjcGktPnByZWRpY3Rpb25fZXJyb3IgLSBjcGktPmxhc3RfcHJlZGljdGlvbl9lcnJvcikpIC8gKDEgKyBjcGktPmxhc3RfcHJlZGljdGlvbl9lcnJvcik7Ci0gICAgICAgIGRvdWJsZSBtaW5lcnJvciA9IGNtLT5NQnMgKiAyNTY7Ci0KLSNpZiAwCi0KLSAgICAgICAgaWYgKDEwICogY3BpLT5pbnRyYV9lcnJvciAvICgxICsgY3BpLT5wcmVkaWN0aW9uX2Vycm9yKSA8IDE1Ci0gICAgICAgICAgICAmJiBjcGktPnByZWRpY3Rpb25fZXJyb3IgPiBtaW5lcnJvcgotICAgICAgICAgICAgJiYgKGNoYW5nZSA+IC4yNSB8fCBjaGFuZ2UyID4gLjI1KSkKLSAgICAgICAgewotICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJpbnRyYV9pbnRlci5zdHQiLCAiYSIpOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5wcmVkaWN0aW9uX2Vycm9yIDw9IDApCi0gICAgICAgICAgICAgICAgY3BpLT5wcmVkaWN0aW9uX2Vycm9yID0gMTsKLQotICAgICAgICAgICAgZnByaW50ZihmLCAiJWQgJWQgJWQgJWQgJTE0LjRmXG4iLAotICAgICAgICAgICAgICAgICAgICBjbS0+Y3VycmVudF92aWRlb19mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgY3BpLT5wcmVkaWN0aW9uX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAoaW50KSBjcGktPmludHJhX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAoaW50KSgoMTAgKiBjcGktPmludHJhX2Vycm9yKSAvIGNwaS0+cHJlZGljdGlvbl9lcnJvciksCi0gICAgICAgICAgICAgICAgICAgIGNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBjcGktPmxhc3RfaW50cmFfZXJyb3IgPSBjcGktPmludHJhX2Vycm9yOwotICAgICAgICBjcGktPmxhc3RfcHJlZGljdGlvbl9lcnJvciA9IGNwaS0+cHJlZGljdGlvbl9lcnJvcjsKLQotICAgICAgICBpZiAoMTAgKiBjcGktPmludHJhX2Vycm9yIC8gKDEgKyBjcGktPnByZWRpY3Rpb25fZXJyb3IpIDwgMTUKLSAgICAgICAgICAgICYmIGNwaS0+cHJlZGljdGlvbl9lcnJvciA+IG1pbmVycm9yCi0gICAgICAgICAgICAmJiAoY2hhbmdlID4gLjI1IHx8IGNoYW5nZTIgPiAuMjUpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKihjaGFuZ2UgPiAxLjQgfHwgY2hhbmdlIDwgLjc1KSYmIGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID4gY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgKyAzKi8KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgfQotCi0gICAgLy8gSWYgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZSB3ZSBtaWdodCBhcyB3ZWxsIGNvZGUgYSBrZXkgZnJhbWUKLSAgICBpZiAoKChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA9PSAxMDApICYmCi0gICAgICAgICAoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiAoY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgKyAyKSkpIHx8Ci0gICAgICAgICgoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiA5NSkgJiYKLSAgICAgICAgIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+PSAoY3BpLT5sYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmEgKyA1KSkpKQotICAgIHsKLSAgICAgICAgY29kZV9rZXlfZnJhbWUgPSBUUlVFOwotICAgIH0KLSAgICAvLyBpbiBhZGRpdGlvbiBpZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlIGFuZCB0aGlzIGlzIG5vdCBhIGdvbGRlbiBmcmFtZSB0aGVuIGNvZGUgYSBrZXkgZnJhbWUKLSAgICAvLyBOb3RlIHRoYXQgb24gZ29sZGVuIGZyYW1lcyB0aGVyZSBvZnRlbiBzZWVtcyB0byBiZSBhIHBvcCBpbiBpbnRyYSB1c2VhZ2UgYW55d2F5IGhlbmNlIHRoaXMKLSAgICAvLyByZXN0cmljdGlvbiBpcyBkZXNpZ25lZCB0byBwcmV2ZW50IHNwdXJpb3VzIGtleSBmcmFtZXMuIFRoZSBJbnRyYSBwb3AgbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgotICAgIGVsc2UgaWYgKCgoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiA2MCkgJiYKLSAgICAgICAgICAgICAgKGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID4gKGNwaS0+bGFzdF9mcmFtZV9wZXJjZW50X2ludHJhICogMikpKSB8fAotICAgICAgICAgICAgICgoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPiA3NSkgJiYKLSAgICAgICAgICAgICAgKGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID4gKGNwaS0+bGFzdF9mcmFtZV9wZXJjZW50X2ludHJhICogMyAvIDIpKSkgfHwKLSAgICAgICAgICAgICAoKGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhID4gOTApICYmCi0gICAgICAgICAgICAgIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA+IChjcGktPmxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYSArIDEwKSkpKQotICAgIHsKLSAgICAgICAgaWYgKCFjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCi0gICAgICAgICAgICBjb2RlX2tleV9mcmFtZSA9IFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvZGVfa2V5X2ZyYW1lOwotCi19Ci0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotc3RhdGljIHZvaWQgUGFzczFFbmNvZGUoVlA4X0NPTVAgKmNwaSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50ICpmcmFtZV9mbGFncykKLXsKLSAgICAodm9pZCkgc2l6ZTsKLSAgICAodm9pZCkgZGVzdDsKLSAgICAodm9pZCkgZnJhbWVfZmxhZ3M7Ci0gICAgc2V0X3F1YW50aXplcihjcGksIDI2KTsKLQotICAgIHNjYWxlX2FuZF9leHRlbmRfc291cmNlKGNwaS0+dW5fc2NhbGVkX3NvdXJjZSwgY3BpKTsKLSAgICB2cDhfZmlyc3RfcGFzcyhjcGkpOwotfQotI2VuZGlmCi0KLSNpZiAwCi12b2lkIHdyaXRlX2N4X2ZyYW1lX3RvX2ZpbGUoWVYxMl9CVUZGRVJfQ09ORklHICpmcmFtZSwgaW50IHRoaXNfZnJhbWUpCi17Ci0KLSAgICAvLyB3cml0ZSB0aGUgZnJhbWUKLSAgICBGSUxFICp5ZnJhbWU7Ci0gICAgaW50IGk7Ci0gICAgY2hhciBmaWxlbmFtZVsyNTVdOwotCi0gICAgc3ByaW50ZihmaWxlbmFtZSwgImN4XFx5JTA0ZC5yYXciLCB0aGlzX2ZyYW1lKTsKLSAgICB5ZnJhbWUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPnlfaGVpZ2h0OyBpKyspCi0gICAgICAgIGZ3cml0ZShmcmFtZS0+eV9idWZmZXIgKyBpICogZnJhbWUtPnlfc3RyaWRlLCBmcmFtZS0+eV93aWR0aCwgMSwgeWZyYW1lKTsKLQotICAgIGZjbG9zZSh5ZnJhbWUpOwotICAgIHNwcmludGYoZmlsZW5hbWUsICJjeFxcdSUwNGQucmF3IiwgdGhpc19mcmFtZSk7Ci0gICAgeWZyYW1lID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT51dl9oZWlnaHQ7IGkrKykKLSAgICAgICAgZndyaXRlKGZyYW1lLT51X2J1ZmZlciArIGkgKiBmcmFtZS0+dXZfc3RyaWRlLCBmcmFtZS0+dXZfd2lkdGgsIDEsIHlmcmFtZSk7Ci0KLSAgICBmY2xvc2UoeWZyYW1lKTsKLSAgICBzcHJpbnRmKGZpbGVuYW1lLCAiY3hcXHYlMDRkLnJhdyIsIHRoaXNfZnJhbWUpOwotICAgIHlmcmFtZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+dXZfaGVpZ2h0OyBpKyspCi0gICAgICAgIGZ3cml0ZShmcmFtZS0+dl9idWZmZXIgKyBpICogZnJhbWUtPnV2X3N0cmlkZSwgZnJhbWUtPnV2X3dpZHRoLCAxLCB5ZnJhbWUpOwotCi0gICAgZmNsb3NlKHlmcmFtZSk7Ci19Ci0jZW5kaWYKLS8vIHJldHVybiBvZiAwIG1lYW5zIGRyb3AgZnJhbWUKLQotLy8gRnVuY3Rpb24gdG8gdGVzdCBmb3IgY29uZGl0aW9ucyB0aGF0IGluZGVpY2F0ZSB3ZSBzaG91bGQgbG9vcAotLy8gYmFjayBhbmQgcmVjb2RlIGEgZnJhbWUuCi1zdGF0aWMgQk9PTCByZWNvZGVfbG9vcF90ZXN0KCBWUDhfQ09NUCAqY3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hfbGltaXQsIGludCBsb3dfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcSwgaW50IG1heHEsIGludCBtaW5xICkKLXsKLSAgICBCT09MICAgIGZvcmNlX3JlY29kZSA9IEZBTFNFOwotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotCi0gICAgLy8gSXMgZnJhbWUgcmVjb2RlIGFsbG93ZWQgYXQgYWxsCi0gICAgLy8gWWVzIGlmIGVpdGhlciByZWNvZGUgbW9kZSAxIGlzIHNlbGVjdGVkIG9yIG1vZGUgdHdvIGlzIHNlbGN0ZWQKLSAgICAvLyBhbmQgdGhlIGZyYW1lIGlzIGEga2V5IGZyYW1lLiBnb2xkZW4gZnJhbWUgb3IgYWx0X3JlZl9mcmFtZQotICAgIGlmICggKGNwaS0+c2YucmVjb2RlX2xvb3AgPT0gMSkgfHwKLSAgICAgICAgICggKGNwaS0+c2YucmVjb2RlX2xvb3AgPT0gMikgJiYKLSAgICAgICAgICAgKCAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB8fAotICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSB8fAotICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgKSApICkKLSAgICB7Ci0gICAgICAgIC8vIEdlbmVyYWwgb3ZlciBhbmQgdW5kZXIgc2hvb3QgdGVzdHMKLSAgICAgICAgaWYgKCAoKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPiBoaWdoX2xpbWl0KSAmJiAocSA8IG1heHEpKSB8fAotICAgICAgICAgICAgICgoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA8IGxvd19saW1pdCkgJiYgKHEgPiBtaW5xKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3JjZV9yZWNvZGUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNwZWNpYWwgQ29uc3RyYWluZWQgcXVhbGl0eSB0ZXN0cwotICAgICAgICBlbHNlIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFVuZGVyc2hvb3QgYW5kIGJlbG93IGF1dG8gY3EgbGV2ZWwKLSAgICAgICAgICAgIGlmICggKHEgPiBjcGktPmNxX3RhcmdldF9xdWFsaXR5KSAmJgotICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA8Ci0gICAgICAgICAgICAgICAgICAgICAoKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiA3KSA+PiAzKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yY2VfcmVjb2RlID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNldmVyZSB1bmRlcnNob290IGFuZCBiZXR3ZWVuIGF1dG8gYW5kIHVzZXIgY3EgbGV2ZWwKLSAgICAgICAgICAgIGVsc2UgaWYgKCAocSA+IGNwaS0+b3hjZi5jcV9sZXZlbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA8IGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID4gY3BpLT5veGNmLmNxX2xldmVsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JjZV9yZWNvZGUgPSBUUlVFOwotICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGNwaS0+b3hjZi5jcV9sZXZlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmb3JjZV9yZWNvZGU7Ci19Ci0KLXZvaWQgbG9vcGZpbHRlcl9mcmFtZShWUDhfQ09NUCAqY3BpLCBWUDhfQ09NTU9OICpjbSkKLXsKLSAgICBpZiAoY20tPm5vX2xwZikKLSAgICB7Ci0gICAgICAgIGNtLT5maWx0ZXJfbGV2ZWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgdGltZXI7Ci0KLSAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOwotCi0gICAgICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0aW1lcik7Ci0gICAgICAgIGlmIChjcGktPnNmLmF1dG9fZmlsdGVyID09IDApCi0gICAgICAgICAgICB2cDhjeF9waWNrX2ZpbHRlcl9sZXZlbF9mYXN0KGNwaS0+U291cmNlLCBjcGkpOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwOGN4X3BpY2tfZmlsdGVyX2xldmVsKGNwaS0+U291cmNlLCBjcGkpOwotCi0gICAgICAgIHZweF91c2VjX3RpbWVyX21hcmsoJnRpbWVyKTsKLSAgICAgICAgY3BpLT50aW1lX3BpY2tfbHBmICs9IHZweF91c2VjX3RpbWVyX2VsYXBzZWQoJnRpbWVyKTsKLSAgICB9Ci0KLSNpZiBDT05GSUdfTVVMVElUSFJFQUQKLSAgICBpZiAoY3BpLT5iX211bHRpX3RocmVhZGVkKQotICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOyAvKiBzaWduYWwgdGhhdCB3ZSBoYXZlIHNldCBmaWx0ZXJfbGV2ZWwgKi8KLSNlbmRpZgotCi0gICAgaWYgKGNtLT5maWx0ZXJfbGV2ZWwgPiAwKQotICAgIHsKLSAgICAgICAgdnA4Y3hfc2V0X2FsdF9sZl9sZXZlbChjcGksIGNtLT5maWx0ZXJfbGV2ZWwpOwotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfZnJhbWUoY20sICZjcGktPm1iLmVfbWJkLCBjbS0+ZmlsdGVyX2xldmVsKTsKLSAgICAgICAgY20tPmxhc3RfZmlsdGVyX3R5cGUgPSBjbS0+ZmlsdGVyX3R5cGU7Ci0gICAgICAgIGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGNtLT5zaGFycG5lc3NfbGV2ZWw7Ci0gICAgfQotCi0gICAgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfcHRyKGNtLT5mcmFtZV90b19zaG93KTsKLQotICAgIHsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpsc3RfeXYxMiA9ICZjbS0+eXYxMl9mYltjbS0+bHN0X2ZiX2lkeF07Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqbmV3X3l2MTIgPSAmY20tPnl2MTJfZmJbY20tPm5ld19mYl9pZHhdOwotICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmdsZF95djEyID0gJmNtLT55djEyX2ZiW2NtLT5nbGRfZmJfaWR4XTsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICphbHRfeXYxMiA9ICZjbS0+eXYxMl9mYltjbS0+YWx0X2ZiX2lkeF07Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIG5ldyBmcmFtZSBoYXMgYmVlbiBlbmNvZGVkLgotICAgICAgICAvLyBJZiBhbnkgYnVmZmVyIGNvcHkgLyBzd2FwcGluZyBpcyBzaWduYWxlZCBpdCBzaG91bGQgYmUgZG9uZSBoZXJlLgotICAgICAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihjbS0+ZnJhbWVfdG9fc2hvdywgZ2xkX3l2MTIpOwotICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoY20tPmZyYW1lX3RvX3Nob3csIGFsdF95djEyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgIC8vIEZvciBub24ga2V5IGZyYW1lcwotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2RlIHRvIGNvcHkgYmV0d2VlbiByZWZlcmVuY2UgYnVmZmVycwotICAgICAgICAgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY29weSBuZXdfZnJhbWUgaGVyZSBiZWNhdXNlIGxhc3QgYW5kIG5ldyBidWZmZXJzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gc3dhcHBlZCBpZiBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lIGlzIHNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKG5ld195djEyLCBhbHRfeXYxMik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKGxzdF95djEyLCBhbHRfeXYxMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoZ2xkX3l2MTIsIGFsdF95djEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNtLT5jb3B5X2J1ZmZlcl90b19nZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY20tPmNvcHlfYnVmZmVyX3RvX2dmID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY20tPnJlZnJlc2hfbGFzdF9mcmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvcHkgbmV3X2ZyYW1lIGhlcmUgYmVjYXVzZSBsYXN0IGFuZCBuZXcgYnVmZmVycyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHN3YXBwZWQgaWYgY20tPnJlZnJlc2hfbGFzdF9mcmFtZSBpcyBzZXQuCi0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihuZXdfeXYxMiwgZ2xkX3l2MTIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cihsc3RfeXYxMiwgZ2xkX3l2MTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjbS0+Y29weV9idWZmZXJfdG9fZ2YgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoYWx0X3l2MTIsIGdsZF95djEyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZW5jb2RlX2ZyYW1lX3RvX2RhdGFfcmF0ZQotKAotICAgIFZQOF9DT01QICpjcGksCi0gICAgdW5zaWduZWQgbG9uZyAqc2l6ZSwKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIHVuc2lnbmVkIGludCAqZnJhbWVfZmxhZ3MKLSkKLXsKLSAgICBpbnQgUTsKLSAgICBpbnQgZnJhbWVfb3Zlcl9zaG9vdF9saW1pdDsKLSAgICBpbnQgZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQ7Ci0KLSAgICBpbnQgTG9vcCA9IEZBTFNFOwotICAgIGludCBsb29wX2NvdW50OwotICAgIGludCB0aGlzX3E7Ci0gICAgaW50IGxhc3RfemJpbl9vcTsKLQotICAgIGludCBxX2xvdzsKLSAgICBpbnQgcV9oaWdoOwotICAgIGludCB6YmluX29xX2hpZ2g7Ci0gICAgaW50IHpiaW5fb3FfbG93ID0gMDsKLSAgICBpbnQgdG9wX2luZGV4OwotICAgIGludCBib3R0b21faW5kZXg7Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0gICAgaW50IGFjdGl2ZV93b3JzdF9xY2hhbmdlZCA9IEZBTFNFOwotCi0gICAgaW50IG92ZXJzaG9vdF9zZWVuID0gRkFMU0U7Ci0gICAgaW50IHVuZGVyc2hvb3Rfc2VlbiA9IEZBTFNFOwotICAgIGludCBkcm9wX21hcmsgPSBjcGktPm94Y2YuZHJvcF9mcmFtZXNfd2F0ZXJfbWFyayAqIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCAvIDEwMDsKLSAgICBpbnQgZHJvcF9tYXJrNzUgPSBkcm9wX21hcmsgKiAyIC8gMzsKLSAgICBpbnQgZHJvcF9tYXJrNTAgPSBkcm9wX21hcmsgLyA0OwotICAgIGludCBkcm9wX21hcmsyNSA9IGRyb3BfbWFyayAvIDg7Ci0KLQotICAgIC8vIENsZWFyIGRvd24gbW14IHJlZ2lzdGVycyB0byBhbGxvdyBmbG9hdGluZyBwb2ludCBpbiB3aGF0IGZvbGxvd3MKLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7Ci0KLSAgICAvLyBUZXN0IGNvZGUgZm9yIHNlZ21lbnRhdGlvbiBvZiBnZi9hcmYgKDAsMCkKLSAgICAvL3NlZ21lbnRhdGlvbl90ZXN0X2Z1bmN0aW9uKChWUDhfUFRSKSBjcGkpOwotCi0jaWYgQ09ORklHX1JFQUxUSU1FX09OTFkKLSAgICBpZihjcGktPm94Y2YuYXV0b19rZXkgJiYgY20tPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgaWYoY3BpLT5mb3JjZV9uZXh0X2ZyYW1lX2ludHJhKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbS0+ZnJhbWVfdHlwZSA9IEtFWV9GUkFNRTsgIC8qIGRlbGF5ZWQgaW50cmEgZnJhbWUgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBjcGktPmZvcmNlX25leHRfZnJhbWVfaW50cmEgPSAwOwotI2VuZGlmCi0KLSAgICAvLyBGb3IgYW4gYWx0IHJlZiBmcmFtZSBpbiAyIHBhc3Mgd2Ugc2tpcCB0aGUgY2FsbCB0byB0aGUgc2Vjb25kIHBhc3MgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSB0YXJnZXQgYmFuZHdpZHRoCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLQotICAgIGlmIChjcGktPnBhc3MgPT0gMikKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IGNwaS0+Z2ZfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXIgZnJhbWUgYml0IHRhcmdldCBmb3IgdGhlIGFsdCByZWYgZnJhbWUKLSAgICAgICAgICAgIGNwaS0+dGFyZ2V0X2JhbmR3aWR0aCA9IGNwaS0+Z2ZfYml0cyAqIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGU7ICAgICAgLy8gcGVyIHNlY29uZCB0YXJnZXQgYml0cmF0ZQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggID0gKGludCkoY3BpLT50YXJnZXRfYmFuZHdpZHRoIC8gY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSk7Ci0KLSAgICAvLyBEZWZhdWx0IHR1cm4gb2ZmIGJ1ZmZlciB0byBidWZmZXIgY29weWluZwotICAgIGNtLT5jb3B5X2J1ZmZlcl90b19nZiA9IDA7Ci0gICAgY20tPmNvcHlfYnVmZmVyX3RvX2FyZiA9IDA7Ci0KLSAgICAvLyBDbGVhciB6YmluIG92ZXItcXVhbnQgdmFsdWUgYW5kIG1vZGUgYm9vc3QgdmFsdWVzLgotICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gMDsKLSAgICBjcGktPnpiaW5fbW9kZV9ib29zdCA9IDA7Ci0KLSAgICAvLyBFbmFibGUgb3IgZGlzYWJsZSBtb2RlIGJhc2VkIHR3ZWFraW5nIG9mIHRoZSB6YmluCi0gICAgLy8gRm9yIDIgUGFzcyBPbmx5IHVzZWQgd2hlcmUgR0YvQVJGIHByZWRpY3Rpb24gcXVhbGl0eQotICAgIC8vIGlzIGFib3ZlIGEgdGhyZXNob2xkCi0gICAgY3BpLT56YmluX21vZGVfYm9vc3QgPSAwOwotICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0X2VuYWJsZWQgPSBUUlVFOwotICAgIGlmIChjcGktPnBhc3MgPT0gMikKLSAgICB7Ci0gICAgICAgIGlmICggY3BpLT5nZnVfYm9vc3QgPD0gNDAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT56YmluX21vZGVfYm9vc3RfZW5hYmxlZCA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ3VycmVudCBkZWZhdWx0IGVuY29kZXIgYmVoYXZpb3VyIGZvciB0aGUgYWx0cmVmIHNpZ24gYmlhcwotICAgIGlmIChjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkKLSAgICAgICAgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhc1tBTFRSRUZfRlJBTUVdID0gMTsKLSAgICBlbHNlCi0gICAgICAgIGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXNbQUxUUkVGX0ZSQU1FXSA9IDA7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgYSBrZXkgZnJhbWUgaXMgc2lnbmFsbGVkCi0gICAgLy8gRm9yIHR3byBwYXNzIHdpdGggYXV0byBrZXkgZnJhbWUgZW5hYmxlZCBjbS0+ZnJhbWVfdHlwZSBtYXkgYWxyZWFkeSBiZSBzZXQsIGJ1dCBub3QgZm9yIG9uZSBwYXNzLgotICAgIGlmICgoY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgPT0gMCkgfHwKLSAgICAgICAgKGNtLT5mcmFtZV9mbGFncyAmIEZSQU1FRkxBR1NfS0VZKSB8fAotICAgICAgICAoY3BpLT5veGNmLmF1dG9fa2V5ICYmIChjcGktPmZyYW1lc19zaW5jZV9rZXkgJSBjcGktPmtleV9mcmFtZV9mcmVxdWVuY3kgPT0gMCkpKQotICAgIHsKLSAgICAgICAgLy8gS2V5IGZyYW1lIGZyb20gVkZXL2F1dG8ta2V5ZnJhbWUvZmlyc3QgZnJhbWUKLSAgICAgICAgY20tPmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7Ci0gICAgfQotCi0gICAgLy8gU2V0IGRlZmF1bHQgc3RhdGUgZm9yIHNlZ21lbnQgYW5kIG1vZGUgYmFzZWQgbG9vcCBmaWx0ZXIgdXBkYXRlIGZsYWdzCi0gICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9IDA7Ci0gICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAwOwotICAgIGNwaS0+bWIuZV9tYmQubW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlID0gMDsKLQotICAgIC8vIFNldCB2YXJpb3VzIGZsYWdzIGV0YyB0byBzcGVjaWFsIHN0YXRlIGlmIGl0IGlzIGEga2V5IGZyYW1lCi0gICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIC8vIFJlc2V0IHRoZSBsb29wIGZpbHRlciBkZWx0YXMgYW5kIHNlZ21lbnRhdGlvbiBtYXAKLSAgICAgICAgc2V0dXBfZmVhdHVyZXMoY3BpKTsKLQotICAgICAgICAvLyBJZiBzZWdtZW50YXRpb24gaXMgZW5hYmxlZCBmb3JjZSBhIG1hcCB1cGRhdGUgZm9yIGtleSBmcmFtZXMKLSAgICAgICAgaWYgKGNwaS0+bWIuZV9tYmQuc2VnbWVudGF0aW9uX2VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+bWIuZV9tYmQudXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXAgPSAxOwotICAgICAgICAgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUgY2Fubm90IGJlIGFjdGl2ZSBmb3IgYSBrZXkgZnJhbWUKLSAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUgPSBGQUxTRTsKLQotICAgICAgICAvLyBSZXNldCB0aGUgUkQgdGhyZXNob2xkIG11bHRpcGxpZXJzIHRvIGRlZmF1bHQgb2YgKiAxICgxMjgpCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU9ERVM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtpXSA9IDEyODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRlc3QgY29kZSBmb3Igc2VnbWVudGF0aW9uCi0gICAgLy9pZiAoIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHx8ICgoY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgJSAyKSA9PSAwKSkKLSAgICAvL2lmICggKGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lICUgMikgPT0gMCApCi0gICAgLy8gIGVuYWJsZV9zZWdtZW50YXRpb24oKFZQOF9QVFIpY3BpKTsKLSAgICAvL2Vsc2UKLSAgICAvLyAgZGlzYWJsZV9zZWdtZW50YXRpb24oKFZQOF9QVFIpY3BpKTsKLQotI2lmIDAKLSAgICAvLyBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGNvbXByZXNzIGFuZCBvbmUgcGFzcwotICAgIC8vIEluaXRpYWxpc2Ugb25lX3Bhc3MgR0YgZnJhbWVzIHN0YXRzCi0gICAgLy8gVXBkYXRlIHN0YXRzIHVzZWQgZm9yIEdGIHNlbGVjdGlvbgotICAgIC8vaWYgKCBjcGktPnBhc3MgPT0gMCApCi0gICAgewotICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4ID0gY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgJSBNQVhfTEFHX0JVRkZFUlM7Ci0KLSAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVzX3NvX2ZhciA9IDA7Ci0gICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lX2ludHJhX2Vycm9yID0gMC4wOwotICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2NwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggXS5mcmFtZV9jb2RlZF9lcnJvciA9IDAuMDsKLSAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVfcGNudF9pbnRlciA9IDAuMDsKLSAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVfcGNudF9tb3Rpb24gPSAwLjA7Ci0gICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleCBdLmZyYW1lX212ciA9IDAuMDsKLSAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVfbXZyX2FicyA9IDAuMDsKLSAgICAgICAgY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tjcGktPm9uZV9wYXNzX2ZyYW1lX2luZGV4IF0uZnJhbWVfbXZjID0gMC4wOwotICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2NwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggXS5mcmFtZV9tdmNfYWJzID0gMC4wOwotICAgIH0KLSNlbmRpZgotCi0gICAgdXBkYXRlX3JkX3JlZl9mcmFtZV9wcm9icyhjcGkpOwotCi0gICAgaWYgKGNwaS0+ZHJvcF9mcmFtZXNfYWxsb3dlZCkKLSAgICB7Ci0gICAgICAgIC8vIFRoZSByZXNldCB0byBkZWNpbWF0aW9uIDAgaXMgb25seSBkb25lIGhlcmUgZm9yIG9uZSBwYXNzLgotICAgICAgICAvLyBPbmNlIGl0IGlzIHNldCB0d28gcGFzcyBsZWF2ZXMgZGVjaW1hdGlvbiBvbiB0aWxsIHRoZSBuZXh0IGtmLgotICAgICAgICBpZiAoKGNwaS0+YnVmZmVyX2xldmVsID4gZHJvcF9tYXJrKSAmJiAoY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA+IDApKQotICAgICAgICAgICAgY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciAtLTsKLQotICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPiBkcm9wX21hcms3NSAmJiBjcGktPmRlY2ltYXRpb25fZmFjdG9yID4gMCkKLSAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPSAxOwotCi0gICAgICAgIGVsc2UgaWYgKGNwaS0+YnVmZmVyX2xldmVsIDwgZHJvcF9tYXJrMjUgJiYgKGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPT0gMiB8fCBjcGktPmRlY2ltYXRpb25fZmFjdG9yID09IDMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmRlY2ltYXRpb25fZmFjdG9yID0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGRyb3BfbWFyazUwICYmIChjcGktPmRlY2ltYXRpb25fZmFjdG9yID09IDEgfHwgY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9PSAyKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPCBkcm9wX21hcms3NSAmJiAoY3BpLT5kZWNpbWF0aW9uX2ZhY3RvciA9PSAwIHx8IGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPT0gMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy92cHhfbG9nKCJFbmNvZGVyOiBEZWNpbWF0aW9uIEZhY3RvcjogJWQgXG4iLGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IpOwotICAgIH0KLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgZGVjaW1hdGVzIHRoZSBmcmFtZSByYXRlIGFjY29yZGluZyB0byBhIHJlZ3VsYXIgcGF0dGVybiAoaS5lLiB0byAxLzIgb3IgMi8zIGZyYW1lIHJhdGUpCi0gICAgLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBoZWxwIHByZXZlbnQgYnVmZmVyIHVuZGVyLXJ1biBpbiBDQlIgbW9kZS4gQWx0ZXJuYXRpdmVseSBpdCBtaWdodCBiZSBkZXNpcmFibGUgaW4KLSAgICAvLyBzb21lIHNpdHVhdGlvbnMgdG8gZHJvcCBmcmFtZSByYXRlIGJ1dCB0aHJvdyBtb3JlIGJpdHMgYXQgZWFjaCBmcmFtZS4KLSAgICAvLwotICAgIC8vIE5vdGUgdGhhdCBkcm9wcGluZyBhIGtleSBmcmFtZSBjYW4gYmUgcHJvYmxlbWF0aWMgaWYgc3BhdGlhbCByZXNhbXBsaW5nIGlzIGFsc28gYWN0aXZlCi0gICAgaWYgKGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3IgPiAwKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjcGktPmRlY2ltYXRpb25fZmFjdG9yKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggKiAzIC8gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoICogNSAvIDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoICA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAqIDUgLyA0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIHRoYXQgd2Ugc2hvdWxkIG5vdCB0aHJvdyBvdXQgYSBrZXkgZnJhbWUgKGVzcGVjaWFsbHkgd2hlbiBzcGF0aWFsIHJlc2FtcGxpbmcgaXMgZW5hYmxlZCkuCi0gICAgICAgIGlmICgoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSkgLy8gJiYgY3BpLT5veGNmLmFsbG93X3NwYXRpYWxfcmVzYW1wbGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9jb3VudCA9IGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3BpLT5kZWNpbWF0aW9uX2NvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5kZWNpbWF0aW9uX2NvdW50IC0tOwotICAgICAgICAgICAgY3BpLT5iaXRzX29mZl90YXJnZXQgKz0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOwotICAgICAgICAgICAgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUrKzsKLSAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3NpbmNlX2tleSsrOwotCi0jaWYgQ09ORklHX1BTTlIKLSAgICAgICAgICAgIGNwaS0+Y291bnQgKys7Ci0jZW5kaWYKLQotICAgICAgICAgICAgY3BpLT5idWZmZXJfbGV2ZWwgPSBjcGktPmJpdHNfb2ZmX3RhcmdldDsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNwaS0+ZGVjaW1hdGlvbl9jb3VudCA9IGNwaS0+ZGVjaW1hdGlvbl9mYWN0b3I7Ci0gICAgfQotCi0gICAgLy8gRGVjaWRlIGhvdyBiaWcgdG8gbWFrZSB0aGUgZnJhbWUKLSAgICBpZiAoIXBpY2tfZnJhbWVfc2l6ZShjcGkpKQotICAgIHsKLSAgICAgICAgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUrKzsKLSAgICAgICAgY3BpLT5mcmFtZXNfc2luY2Vfa2V5Kys7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBSZWR1Y2UgYWN0aXZlX3dvcnN0X2FsbG93ZWRfcSBmb3IgQ0JSIGlmIG91ciBidWZmZXIgaXMgZ2V0dGluZyB0b28gZnVsbC4KLSAgICAvLyBUaGlzIGhhcyBhIGtub2NrIG9uIGVmZmVjdCBvbiBhY3RpdmUgYmVzdCBxdWFsaXR5IGFzIHdlbGwuCi0gICAgLy8gRm9yIENCUiBpZiB0aGUgYnVmZmVyIHJlYWNoZXMgaXRzIG1heGltdW0gbGV2ZWwgdGhlbiB3ZSBjYW4gbm8gbG9uZ2VyCi0gICAgLy8gc2F2ZSB1cCBiaXRzIGZvciBsYXRlciBmcmFtZXMgc28gd2UgbWlnaHQgYXMgd2VsbCB1c2UgdGhlbSB1cAotICAgIC8vIG9uIHRoZSBjdXJyZW50IGZyYW1lLgotICAgIGlmICgoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpICYmCi0gICAgICAgIChjcGktPmJ1ZmZlcl9sZXZlbCA+PSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpICYmIGNwaS0+YnVmZmVyZWRfbW9kZSkKLSAgICB7Ci0gICAgICAgIGludCBBZGp1c3RtZW50ID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSAvIDQ7ICAgICAgIC8vIE1heCBhZGp1c3RtZW50IGlzIDEvNAotCi0gICAgICAgIGlmIChBZGp1c3RtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYnVmZl9sdmxfc3RlcDsKLSAgICAgICAgICAgIGludCB0bXBfbHZsID0gY3BpLT5idWZmZXJfbGV2ZWw7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+b3hjZi5tYXhpbXVtX2J1ZmZlcl9zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1ZmZfbHZsX3N0ZXAgPSAoY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUgLSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpIC8gQWRqdXN0bWVudDsKLQotICAgICAgICAgICAgICAgIGlmIChidWZmX2x2bF9zdGVwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQWRqdXN0bWVudCA9IChjcGktPmJ1ZmZlcl9sZXZlbCAtIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCkgLyBidWZmX2x2bF9zdGVwOwotICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IC09IEFkanVzdG1lbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgLT0gQWRqdXN0bWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNldCBhbiBhY3RpdmUgYmVzdCBxdWFsaXR5IGFuZCBpZiBuZWNlc3NhcnkgYWN0aXZlIHdvcnN0IHF1YWxpdHkKLSAgICAvLyBUaGVyZSBpcyBzb21lIG9kZCBiZWhhdmlvdXIgZm9yIG9uZSBwYXNzIGhlcmUgdGhhdCBuZWVkcyBhdHRlbnRpb24uCi0gICAgaWYgKCAoY3BpLT5wYXNzID09IDIpIHx8IChjcGktPm5pX2ZyYW1lcyA+IDE1MCkpCi0gICAgewotICAgICAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7Ci0KLSAgICAgICAgUSA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7Ci0KLSAgICAgICAgaWYgKCBjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGNwaS0+cGFzcyA9PSAyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5nZnVfYm9vc3QgPiA2MDApCi0gICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0ga2ZfbG93X21vdGlvbl9taW5xW1FdOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBrZl9oaWdoX21vdGlvbl9taW5xW1FdOwotCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBrZXkgZnJhbWVzIGZvcmNlZCBiZWNhdXNlIHdlIGhhdmUgcmVhY2hlZAotICAgICAgICAgICAgICAgIC8vIHRoZSBtYXhpbXVtIGtleSBmcmFtZSBpbnRlcnZhbC4gSGVyZSBmb3JjZSB0aGUgUSB0byBhIHJhbmdlCi0gICAgICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGFtYmllbnQgUSB0byByZWR1Y2UgdGhlIHJpc2sgb2YgcG9wcGluZwotICAgICAgICAgICAgICAgIGlmICggY3BpLT50aGlzX2tleV9mcmFtZV9mb3JjZWQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPiBjcGktPmF2Z19mcmFtZV9xaW5kZXggKiA3LzgpCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBjcGktPmF2Z19mcmFtZV9xaW5kZXggKiA3Lzg7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPCBjcGktPmF2Z19mcmFtZV9xaW5kZXggPj4gMiApCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBjcGktPmF2Z19mcmFtZV9xaW5kZXggPj4gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPbmUgcGFzcyBtb3JlIGNvbnNlcnZhdGl2ZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0ga2ZfaGlnaF9tb3Rpb25fbWlucVtRXTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSB8fCBjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFVzZSB0aGUgbG93ZXIgb2YgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSBhbmQgcmVjZW50Ci0gICAgICAgICAgICAvLyBhdmVyYWdlIFEgYXMgYmFzaXMgZm9yIEdGL0FSRiBRIGxpbWl0IHVubGVzcyBsYXN0IGZyYW1lIHdhcwotICAgICAgICAgICAgLy8gYSBrZXkgZnJhbWUuCi0gICAgICAgICAgICBpZiAoIChjcGktPmZyYW1lc19zaW5jZV9rZXkgPiAxKSAmJgotICAgICAgICAgICAgICAgICAoY3BpLT5hdmdfZnJhbWVfcWluZGV4IDwgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFEgPSBjcGktPmF2Z19mcmFtZV9xaW5kZXg7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpICYmCi0gICAgICAgICAgICAgICAgICAgICAoUSA8IGNwaS0+b3hjZi5jcV9sZXZlbCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUSA9IGNwaS0+b3hjZi5jcV9sZXZlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggY3BpLT5wYXNzID09IDIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggY3BpLT5nZnVfYm9vc3QgPiAxMDAwICkKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gZ2ZfbG93X21vdGlvbl9taW5xW1FdOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBjcGktPmdmdV9ib29zdCA8IDQwMCApCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGdmX2hpZ2hfbW90aW9uX21pbnFbUV07Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBnZl9taWRfbW90aW9uX21pbnFbUV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPbmUgcGFzcyBtb3JlIGNvbnNlcnZhdGl2ZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA9IGdmX2hpZ2hfbW90aW9uX21pbnFbUV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBpbnRlcl9taW5xW1FdOwotCi0gICAgICAgICAgICAvLyBGb3IgdGhlIGNvbnN0YW50L2NvbnN0cmFpbmVkIHF1YWxpdHkgbW9kZSB3ZSBkb250IHdhbnQKLSAgICAgICAgICAgIC8vIHRoZSBxdWFsaXR5IHRvIHJpc2UgYWJvdmUgdGhlIGNxIGxldmVsLgotICAgICAgICAgICAgaWYgKChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpICYmCi0gICAgICAgICAgICAgICAgKGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSA8IGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHkpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc3Ryb25nbHkgdW5kZXJzaG9vdGluZyB0aGUgdGFyZ2V0IHJhdGUgaW4gdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAvLyBmcmFtZXMgdGhlbiB1c2UgdGhlIHVzZXIgcGFzc2VkIGluIGNxIHZhbHVlIG5vdCB0aGUgYXV0bwotICAgICAgICAgICAgICAgIC8vIGNxIHZhbHVlLgotICAgICAgICAgICAgICAgIGlmICggY3BpLT5yb2xsaW5nX2FjdHVhbF9iaXRzIDwgY3BpLT5taW5fZnJhbWVfYmFuZHdpZHRoICkKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5veGNmLmNxX2xldmVsOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5jcV90YXJnZXRfcXVhbGl0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIENCUiBhbmQgdGhlIGJ1ZmZlciBpcyBhcyBmdWxsIHRoZW4gaXQgaXMgcmVhc29uYWJsZSB0byBhbGxvdwotICAgICAgICAvLyBoaWdoZXIgcXVhbGl0eSBvbiB0aGUgZnJhbWVzIHRvIHByZXZlbnQgYml0cyBqdXN0IGdvaW5nIHRvIHdhc3RlLgotICAgICAgICBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgdXNlIG9mID49IGhlcmUgZWxsaW1pbmF0ZXMgdGhlIHJpc2sgb2YgYSBkZXZpZGUKLSAgICAgICAgICAgIC8vIGJ5IDAgZXJyb3IgaW4gdGhlIGVsc2UgaWYgY2xhdXNlCi0gICAgICAgICAgICBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPj0gY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpCi0gICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5iZXN0X3F1YWxpdHk7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNwaS0+YnVmZmVyX2xldmVsID4gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBGcmFjdGlvbiA9ICgoY3BpLT5idWZmZXJfbGV2ZWwgLSBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpICogMTI4KSAvIChjcGktPm94Y2YubWF4aW11bV9idWZmZXJfc2l6ZSAtIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCk7Ci0gICAgICAgICAgICAgICAgaW50IG1pbl9xYWRqdXN0bWVudCA9ICgoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5IC0gY3BpLT5iZXN0X3F1YWxpdHkpICogRnJhY3Rpb24pIC8gMTI4OwotCi0gICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5IC09IG1pbl9xYWRqdXN0bWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBNYWtlIHN1cmUgY29uc3RyYWluZWQgcXVhbGl0eSBtb2RlIGxpbWl0cyBhcmUgYWRoZXJlZCB0byBmb3IgdGhlIGZpcnN0Ci0gICAgLy8gZmV3IGZyYW1lcyBvZiBvbmUgcGFzcyBlbmNvZGVzCi0gICAgZWxzZSBpZiAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9DT05TVFJBSU5FRF9RVUFMSVRZKQotICAgIHsKLSAgICAgICAgaWYgKCAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB8fAotICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSB8fCBjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5iZXN0X3F1YWxpdHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5IDwgY3BpLT5jcV90YXJnZXRfcXVhbGl0eSkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5jcV90YXJnZXRfcXVhbGl0eTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENsaXAgdGhlIGFjdGl2ZSBiZXN0IGFuZCB3b3JzdCBxdWFsaXR5IHZhbHVlcyB0byBsaW1pdHMKLSAgICBpZiAoY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA+IGNwaS0+d29yc3RfcXVhbGl0eSkKLSAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+d29yc3RfcXVhbGl0eTsKLQotICAgIGlmIChjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPCBjcGktPmJlc3RfcXVhbGl0eSkKLSAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5iZXN0X3F1YWxpdHk7Ci0gICAgZWxzZSBpZiAoY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID4gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSkKLSAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5ID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKLQotICAgIC8vIERldGVybWluZSBpbml0aWFsIFEgdG8gdHJ5Ci0gICAgUSA9IHZwOF9yZWd1bGF0ZV9xKGNwaSwgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCk7Ci0gICAgbGFzdF96YmluX29xID0gY3BpLT56YmluX292ZXJfcXVhbnQ7Ci0KLSAgICAvLyBTZXQgaGlnaGVzdCBhbGxvd2VkIHZhbHVlIGZvciBaYmluIG92ZXIgcXVhbnQKLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICB6YmluX29xX2hpZ2ggPSAwOyAvL1pCSU5fT1FfTUFYLzE2Ci0gICAgZWxzZSBpZiAoY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSB8fCAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lICYmICFjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSkpCi0gICAgICAgIHpiaW5fb3FfaGlnaCA9IDE2OwotICAgIGVsc2UKLSAgICAgICAgemJpbl9vcV9oaWdoID0gWkJJTl9PUV9NQVg7Ci0KLSAgICAvLyBTZXR1cCBiYWNrZ3JvdW5kIFEgYWRqdXN0bWVudCBmb3IgZXJyb3IgcmVzaWxsaWFudCBtb2RlCi0gICAgaWYgKGNwaS0+Y3ljbGljX3JlZnJlc2hfbW9kZV9lbmFibGVkKQotICAgICAgICBjeWNsaWNfYmFja2dyb3VuZF9yZWZyZXNoKGNwaSwgUSwgMCk7Ci0KLSAgICB2cDhfY29tcHV0ZV9mcmFtZV9zaXplX2JvdW5kcyhjcGksICZmcmFtZV91bmRlcl9zaG9vdF9saW1pdCwgJmZyYW1lX292ZXJfc2hvb3RfbGltaXQpOwotCi0gICAgLy8gTGltaXQgUSByYW5nZSBmb3IgdGhlIGFkYXB0aXZlIGxvb3AuCi0gICAgYm90dG9tX2luZGV4ID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OwotICAgIHRvcF9pbmRleCAgICA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7Ci0gICAgcV9sb3cgID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OwotICAgIHFfaGlnaCA9IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHk7Ci0KLSAgICB2cDhfc2F2ZV9jb2RpbmdfY29udGV4dChjcGkpOwotCi0gICAgbG9vcF9jb3VudCA9IDA7Ci0KLQotICAgIHNjYWxlX2FuZF9leHRlbmRfc291cmNlKGNwaS0+dW5fc2NhbGVkX3NvdXJjZSwgY3BpKTsKLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKSAmJiBDT05GSUdfUE9TVFBST0MKLQotICAgIGlmIChjcGktPm94Y2Yubm9pc2Vfc2Vuc2l0aXZpdHkgPiAwKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjOwotICAgICAgICBpbnQgbCA9IDA7Ci0KLSAgICAgICAgc3dpdGNoIChjcGktPm94Y2Yubm9pc2Vfc2Vuc2l0aXZpdHkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgbCA9IDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGwgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBsID0gNjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgbCA9IDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGwgPSAxMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgbCA9IDE1MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZGVfbm9pc2UoY3BpLT5Tb3VyY2UsIGNwaS0+U291cmNlLCBsICwgMSwgIDAsIFJUQ0QocG9zdHByb2MpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9kZV9ub2lzZShjcGktPlNvdXJjZSwgY3BpLT5Tb3VyY2UsIGwgLCAxLCAgMCwgUlRDRChwb3N0cHJvYykpOwotCi0gICAgICAgICAgICBzcmMgPSBjcGktPlNvdXJjZS0+eV9idWZmZXI7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPlNvdXJjZS0+eV9zdHJpZGUgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNyYyArPSBjcGktPlNvdXJjZS0+eV9zdHJpZGUgKiAoY3BpLT5Tb3VyY2UtPnlfaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZgotCi0jaWZkZWYgT1VUUFVUX1lVVl9TUkMKLSAgICB2cDhfd3JpdGVfeXV2X2ZyYW1lKGNwaS0+U291cmNlKTsKLSNlbmRpZgotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsgIC8vX19hc20gZW1tczsKLQotICAgICAgICAvKgotICAgICAgICBpZihjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmKQotICAgICAgICAgICAgUSA9IDEyNzsKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgc2V0X3F1YW50aXplcihjcGksIFEpOwotICAgICAgICB0aGlzX3EgPSBROwotCi0gICAgICAgIC8vIHNldHVwIHNraXAgcHJvYiBmb3IgY29zdGluZyBpbiBtb2RlL212IGRlY2lzaW9uCi0gICAgICAgIGlmIChjcGktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IGNwaS0+YmFzZV9za2lwX2ZhbHNlX3Byb2JbUV07Ci0KLSAgICAgICAgICAgIGlmIChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1syXSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1syXTsKLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzJdIT0wICYmIGFicyhRLSBjcGktPmxhc3Rfc2tpcF9wcm9ic19xWzJdKTw9MTYgKQotICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzJdIT0wKQotICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IChjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1syXSAgKyBjcGktPnByb2Jfc2tpcF9mYWxzZSApIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMV0gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMV07Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1sxXSE9MCAmJiBhYnMoUS0gY3BpLT5sYXN0X3NraXBfcHJvYnNfcVsxXSk8PTE2ICkKLSAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1sxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1sxXSE9MCkKLSAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSAoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMV0gICsgY3BpLT5wcm9iX3NraXBfZmFsc2UgKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1swXSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSBjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1swXTsKLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBpZihjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1swXSE9MCAmJiBhYnMoUS0gY3BpLT5sYXN0X3NraXBfcHJvYnNfcVswXSk8PTE2ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvYl9za2lwX2ZhbHNlID0gY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF07Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY3BpLT5sYXN0X3NraXBfZmFsc2VfcHJvYnNbMF0hPTApCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IChjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1swXSAgKyBjcGktPnByb2Jfc2tpcF9mYWxzZSApIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9hcyB0aGlzIGlzIGZvciBjb3N0IGVzdGltYXRlLCBsZXQncyBtYWtlIHN1cmUgaXQgZG9lcyBub3QgZ28gZXh0cmVtZSBlaXRlaHIgd2F5Ci0gICAgICAgICAgICAgICAgaWYgKGNwaS0+cHJvYl9za2lwX2ZhbHNlIDwgNSkKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5wcm9iX3NraXBfZmFsc2UgPSA1OwotCi0gICAgICAgICAgICAgICAgaWYgKGNwaS0+cHJvYl9za2lwX2ZhbHNlID4gMjUwKQotICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IDI1MDsKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmKQotICAgICAgICAgICAgICAgICAgICBjcGktPnByb2Jfc2tpcF9mYWxzZSA9IDE7Ci0KLQotICAgICAgICAgICAgfQotCi0jaWYgMAotCi0gICAgICAgICAgICBpZiAoY3BpLT5wYXNzICE9IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJza2lwLnN0dCIsICJhIik7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJWQsICVkLCAlNGQgIiwgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUsIGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSwgY3BpLT5wcm9iX3NraXBfZmFsc2UpOwotICAgICAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgICAgICB2cDhfc2V0dXBfa2V5X2ZyYW1lKGNwaSk7Ci0KLSAgICAgICAgLy8gdHJhbnNmb3JtIC8gbW90aW9uIGNvbXBlbnNhdGlvbiBidWlsZCByZWNvbnN0cnVjdGlvbiBmcmFtZQotICAgICAgICB2cDhfZW5jb2RlX2ZyYW1lKGNwaSk7Ci0KLSAgICAgICAgY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSAtPSB2cDhfZXN0aW1hdGVfZW50cm9weV9zYXZpbmdzKGNwaSk7Ci0gICAgICAgIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPSAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA+IDApID8gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA6IDA7Ci0KLSAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAgLy9fX2FzbSBlbW1zOwotCi0gICAgICAgIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBzdGF0cyBnZW5lcmF0ZWQgZm9yIHRoaXMgZnJhbWUgaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgaGF2ZSBjb2RlZCBhIGtleSBmcmFtZQotICAgICAgICAvLyAoYXNzdW1pbmcgdGhhdCB3ZSBkaWRuJ3QpIQotICAgICAgICBpZiAoY3BpLT5wYXNzICE9IDIgJiYgY3BpLT5veGNmLmF1dG9fa2V5ICYmIGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICAgICAgewotCi0jaWYgQ09ORklHX1JFQUxUSU1FX09OTFkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB3ZSBkb24ndCBkbyByZS1lbmNvZGluZyBpbiByZWFsdGltZSBtb2RlCi0gICAgICAgICAgICAgICAgICogaWYga2V5IGZyYW1lIGlzIGRlY2lkZWQgdGhhbiB3ZSBmb3JjZSBpdCBvbiBuZXh0IGZyYW1lICovCi0gICAgICAgICAgICAgICAgY3BpLT5mb3JjZV9uZXh0X2ZyYW1lX2ludHJhID0gZGVjaWRlX2tleV9mcmFtZShjcGkpOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIGlmIChkZWNpZGVfa2V5X2ZyYW1lKGNwaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X2NhbGNfYXV0b19pZnJhbWVfdGFyZ2V0X3NpemUoY3BpKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbCBvdXIgc2l6aW5nIG51bWJlcnMgYW5kIHJlY29kZQotICAgICAgICAgICAgICAgIGNtLT5mcmFtZV90eXBlID0gS0VZX0ZSQU1FOwotCi0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIEFsdCByZWZlcmVuY2UgZnJhbWUgYWN0aXZlIGZsYWcgd2hlbiB3ZSBoYXZlIGEga2V5IGZyYW1lCi0gICAgICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUgPSBGQUxTRTsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBsb29wIGZpbHRlciBkZWx0YXMgYW5kIHNlZ21lbnRhdGlvbiBtYXAKLSAgICAgICAgICAgICAgICBzZXR1cF9mZWF0dXJlcyhjcGkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgc2VnbWVudGF0aW9uIGlzIGVuYWJsZWQgZm9yY2UgYSBtYXAgdXBkYXRlIGZvciBrZXkgZnJhbWVzCi0gICAgICAgICAgICAgICAgaWYgKGNwaS0+bWIuZV9tYmQuc2VnbWVudGF0aW9uX2VuYWJsZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMTsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5tYi5lX21iZC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX2RhdGEgPSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZwOF9yZXN0b3JlX2NvZGluZ19jb250ZXh0KGNwaSk7Ci0KLSAgICAgICAgICAgICAgICBRID0gdnA4X3JlZ3VsYXRlX3EoY3BpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIHZwOF9jb21wdXRlX2ZyYW1lX3NpemVfYm91bmRzKGNwaSwgJmZyYW1lX3VuZGVyX3Nob290X2xpbWl0LCAmZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBMaW1pdCBRIHJhbmdlIGZvciB0aGUgYWRhcHRpdmUgbG9vcC4KLSAgICAgICAgICAgICAgICBib3R0b21faW5kZXggPSBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHk7Ci0gICAgICAgICAgICAgICAgdG9wX2luZGV4ICAgID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKLSAgICAgICAgICAgICAgICBxX2xvdyAgPSBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHk7Ci0gICAgICAgICAgICAgICAgcV9oaWdoID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKLQotICAgICAgICAgICAgICAgIGxvb3BfY291bnQrKzsKLSAgICAgICAgICAgICAgICBMb29wID0gVFJVRTsKLQotICAgICAgICAgICAgICAgIHJlc2l6ZV9rZXlfZnJhbWUoY3BpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOwotCi0gICAgICAgIGlmIChmcmFtZV9vdmVyX3Nob290X2xpbWl0ID09IDApCi0gICAgICAgICAgICBmcmFtZV9vdmVyX3Nob290X2xpbWl0ID0gMTsKLQotICAgICAgICAvLyBBcmUgd2UgYXJlIG92ZXJzaG9vdGluZyBhbmQgdXAgYWdhaW5zdCB0aGUgbGltaXQgb2YgYWN0aXZlIG1heCBRLgotICAgICAgICBpZiAoKChjcGktPnBhc3MgIT0gMikgfHwgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKSkgJiYKLSAgICAgICAgICAgIChRID09IGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkpICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIChjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IDwgY3BpLT53b3JzdF9xdWFsaXR5KSAgICAgICYmCi0gICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA+IGZyYW1lX292ZXJfc2hvb3RfbGltaXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb3Zlcl9zaXplX3BlcmNlbnQgPSAoKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgLSBmcmFtZV9vdmVyX3Nob290X2xpbWl0KSAqIDEwMCkgLyBmcmFtZV9vdmVyX3Nob290X2xpbWl0OwotCi0gICAgICAgICAgICAvLyBJZiBzbyBpcyB0aGVyZSBhbnkgc2NvcGUgZm9yIHJlbGF4aW5nIGl0Ci0gICAgICAgICAgICB3aGlsZSAoKGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPCBjcGktPndvcnN0X3F1YWxpdHkpICYmIChvdmVyX3NpemVfcGVyY2VudCA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkrKzsKLSAgICAgICAgICAgICAgICB0b3BfaW5kZXggPSBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5OwotICAgICAgICAgICAgICAgIG92ZXJfc2l6ZV9wZXJjZW50ID0gKGludCkob3Zlcl9zaXplX3BlcmNlbnQgKiAwLjk2KTsgICAgICAgIC8vIEFzc3VtZSAxIHFzdGVwID0gYWJvdXQgNCUgb24gZnJhbWUgc2l6ZS4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSB1cGRhdGVkIHRoZSBhY3RpdmUgbWF4IFEgZG8gbm90IGNhbGwgdnA4X3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycygpIHRoaXMgbG9vcC4KLSAgICAgICAgICAgIGFjdGl2ZV93b3JzdF9xY2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWN0aXZlX3dvcnN0X3FjaGFuZ2VkID0gRkFMU0U7Ci0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotICAgICAgICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgZm9yIGZvcmNlZCBrZXkgZnJhbWVzCi0gICAgICAgIGlmICggKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkgJiYgY3BpLT50aGlzX2tleV9mcmFtZV9mb3JjZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGFzdF9xID0gUTsKLSAgICAgICAgICAgIGludCBrZl9lcnIgPSB2cDhfY2FsY19zc19lcnIoY3BpLT5Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotCi0gICAgICAgICAgICAvLyBUaGUga2V5IGZyYW1lIGlzIG5vdCBnb29kIGVub3VnaAotICAgICAgICAgICAgaWYgKCBrZl9lcnIgPiAoKGNwaS0+YW1iaWVudF9lcnIgKiA3KSA+PiAzKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTG93ZXIgcV9oaWdoCi0gICAgICAgICAgICAgICAgcV9oaWdoID0gKFEgPiBxX2xvdykgPyAoUSAtIDEpIDogcV9sb3c7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGp1c3QgUQotICAgICAgICAgICAgICAgIFEgPSAocV9oaWdoICsgcV9sb3cpID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUga2V5IGZyYW1lIGlzIG11Y2ggYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIGZyYW1lCi0gICAgICAgICAgICBlbHNlIGlmICgga2ZfZXJyIDwgKGNwaS0+YW1iaWVudF9lcnIgPj4gMSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFJhaXNlIHFfbG93Ci0gICAgICAgICAgICAgICAgcV9sb3cgPSAoUSA8IHFfaGlnaCkgPyAoUSArIDEpIDogcV9oaWdoOwotCi0gICAgICAgICAgICAgICAgLy8gQWRqdXN0IFEKLSAgICAgICAgICAgICAgICBRID0gKHFfaGlnaCArIHFfbG93ICsgMSkgPj4gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2xhbXAgUSB0byB1cHBlciBhbmQgbG93ZXIgbGltaXRzOgotICAgICAgICAgICAgaWYgKFEgPiBxX2hpZ2gpCi0gICAgICAgICAgICAgICAgUSA9IHFfaGlnaDsKLSAgICAgICAgICAgIGVsc2UgaWYgKFEgPCBxX2xvdykKLSAgICAgICAgICAgICAgICBRID0gcV9sb3c7Ci0KLSAgICAgICAgICAgIExvb3AgPSAoKFEgIT0gbGFzdF9xKSkgPyBUUlVFIDogRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJcyB0aGUgcHJvamVjdGVkIGZyYW1lIHNpemUgb3V0IG9mIHJhbmdlIGFuZCBhcmUgd2UgYWxsb3dlZCB0byBhdHRlbXB0IHRvIHJlY29kZS4KLSAgICAgICAgZWxzZSBpZiAoIHJlY29kZV9sb29wX3Rlc3QoIGNwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9vdmVyX3Nob290X2xpbWl0LCBmcmFtZV91bmRlcl9zaG9vdF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRLCB0b3BfaW5kZXgsIGJvdHRvbV9pbmRleCApICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxhc3RfcSA9IFE7Ci0gICAgICAgICAgICBpbnQgUmV0cmllcyA9IDA7Ci0KLSAgICAgICAgICAgIC8vIEZyYW1lIHNpemUgb3V0IG9mIHBlcm1pdHRlZCByYW5nZToKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBjb3JyZWN0aW9uIGZhY3RvciAmIGNvbXB1dGUgbmV3IFEgdG8gdHJ5Li4uCi0KLSAgICAgICAgICAgIC8vIEZyYW1lIGlzIHRvbyBsYXJnZQotICAgICAgICAgICAgaWYgKGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPiBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vaWYgKCBjcGktPnpiaW5fb3Zlcl9xdWFudCA9PSAwICkKLSAgICAgICAgICAgICAgICBxX2xvdyA9IChRIDwgcV9oaWdoKSA/IChRICsgMSkgOiBxX2hpZ2g7IC8vIFJhaXNlIFFsb3cgYXMgdG8gYXQgbGVhc3QgdGhlIGN1cnJlbnQgdmFsdWUKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPnpiaW5fb3Zlcl9xdWFudCA+IDApICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIG92ZXIgcXVhbnQgZG8gdGhlIHNhbWUgZm9yIHpiaW5fb3FfbG93Ci0gICAgICAgICAgICAgICAgICAgIHpiaW5fb3FfbG93ID0gKGNwaS0+emJpbl9vdmVyX3F1YW50IDwgemJpbl9vcV9oaWdoKSA/IChjcGktPnpiaW5fb3Zlcl9xdWFudCArIDEpIDogemJpbl9vcV9oaWdoOwotCi0gICAgICAgICAgICAgICAgLy9pZiAoIHVuZGVyc2hvb3Rfc2VlbiB8fCAoUSA9PSBNQVhRKSApCi0gICAgICAgICAgICAgICAgaWYgKHVuZGVyc2hvb3Rfc2VlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSByYXRlX2NvcnJlY3Rpb25fZmFjdG9yIHVubGVzcyBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZV93b3JzdF9xY2hhbmdlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoY3BpLCAxKTsKLQotICAgICAgICAgICAgICAgICAgICBRID0gKHFfaGlnaCArIHFfbG93ICsgMSkgLyAyOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBjcGktPnpiaW5fb3Zlcl9xdWFudCAob25seSBhbGxvd2VkIHdoZW4gUSBpcyBtYXgpCi0gICAgICAgICAgICAgICAgICAgIGlmIChRIDwgTUFYUSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6YmluX29xX2xvdyA9IChjcGktPnpiaW5fb3Zlcl9xdWFudCA8IHpiaW5fb3FfaGlnaCkgPyAoY3BpLT56YmluX292ZXJfcXVhbnQgKyAxKSA6IHpiaW5fb3FfaGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gKHpiaW5fb3FfaGlnaCArIHpiaW5fb3FfbG93KSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgdW5sZXNzIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgaGFzIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmICghYWN0aXZlX3dvcnN0X3FjaGFuZ2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycyhjcGksIDApOwotCi0gICAgICAgICAgICAgICAgICAgIFEgPSB2cDhfcmVndWxhdGVfcShjcGksIGNwaS0+dGhpc19mcmFtZV90YXJnZXQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKFEgPCBxX2xvdykgfHwgKGNwaS0+emJpbl9vdmVyX3F1YW50IDwgemJpbl9vcV9sb3cpKSAmJiAoUmV0cmllcyA8IDEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycyhjcGksIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgUSA9IHZwOF9yZWd1bGF0ZV9xKGNwaSwgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXRyaWVzICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3ZlcnNob290X3NlZW4gPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRnJhbWUgaXMgdG9vIHNtYWxsCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNwaS0+emJpbl9vdmVyX3F1YW50ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHFfaGlnaCA9IChRID4gcV9sb3cpID8gKFEgLSAxKSA6IHFfbG93OyAvLyBMb3dlciBxX2hpZ2ggaWYgbm90IHVzaW5nIG92ZXIgcXVhbnQKLSAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBsb3dlciB6YmluX29xX2hpZ2gKLSAgICAgICAgICAgICAgICAgICAgemJpbl9vcV9oaWdoID0gKGNwaS0+emJpbl9vdmVyX3F1YW50ID4gemJpbl9vcV9sb3cpID8gKGNwaS0+emJpbl9vdmVyX3F1YW50IC0gMSkgOiB6YmluX29xX2xvdzsKLQotICAgICAgICAgICAgICAgIGlmIChvdmVyc2hvb3Rfc2VlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSByYXRlX2NvcnJlY3Rpb25fZmFjdG9yIHVubGVzcyBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5IGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZV93b3JzdF9xY2hhbmdlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoY3BpLCAxKTsKLQotICAgICAgICAgICAgICAgICAgICBRID0gKHFfaGlnaCArIHFfbG93KSAvIDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGNwaS0+emJpbl9vdmVyX3F1YW50IChvbmx5IGFsbG93ZWQgd2hlbiBRIGlzIG1heCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKFEgPCBNQVhRKQotICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT56YmluX292ZXJfcXVhbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPnpiaW5fb3Zlcl9xdWFudCA9ICh6YmluX29xX2hpZ2ggKyB6YmluX29xX2xvdykgLyAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciB1bmxlc3MgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVfd29yc3RfcWNoYW5nZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfdXBkYXRlX3JhdGVfY29ycmVjdGlvbl9mYWN0b3JzKGNwaSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgUSA9IHZwOF9yZWd1bGF0ZV9xKGNwaSwgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHJlc2V0IGZvciBxbG93IGZvciBjb25zdHJhaW5lZCBxdWFsaXR5LgotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IHRyaWdnZXIgd2hlcmUgdGhlcmUgaXMgdmVyeSBzdWJzdGFudGlhbAotICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcnNob290IG9uIGEgZnJhbWUgYW5kIHRoZSBhdXRvIGNxIGxldmVsIGlzIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHBhc3NzZWQgaW4gdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgIGlmICggKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfQ09OU1RSQUlORURfUVVBTElUWSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoUSA8IHFfbG93KSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFfbG93ID0gUTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKFEgPiBxX2hpZ2gpIHx8IChjcGktPnpiaW5fb3Zlcl9xdWFudCA+IHpiaW5fb3FfaGlnaCkpICYmIChSZXRyaWVzIDwgMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cDhfdXBkYXRlX3JhdGVfY29ycmVjdGlvbl9mYWN0b3JzKGNwaSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRID0gdnA4X3JlZ3VsYXRlX3EoY3BpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJldHJpZXMgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1bmRlcnNob290X3NlZW4gPSBUUlVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDbGFtcCBRIHRvIHVwcGVyIGFuZCBsb3dlciBsaW1pdHM6Ci0gICAgICAgICAgICBpZiAoUSA+IHFfaGlnaCkKLSAgICAgICAgICAgICAgICBRID0gcV9oaWdoOwotICAgICAgICAgICAgZWxzZSBpZiAoUSA8IHFfbG93KQotICAgICAgICAgICAgICAgIFEgPSBxX2xvdzsKLQotICAgICAgICAgICAgLy8gQ2xhbXAgY3BpLT56YmluX292ZXJfcXVhbnQKLSAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gKGNwaS0+emJpbl9vdmVyX3F1YW50IDwgemJpbl9vcV9sb3cpID8gemJpbl9vcV9sb3cgOiAoY3BpLT56YmluX292ZXJfcXVhbnQgPiB6YmluX29xX2hpZ2gpID8gemJpbl9vcV9oaWdoIDogY3BpLT56YmluX292ZXJfcXVhbnQ7Ci0KLSAgICAgICAgICAgIC8vTG9vcCA9ICgoUSAhPSBsYXN0X3EpIHx8IChsYXN0X3piaW5fb3EgIT0gY3BpLT56YmluX292ZXJfcXVhbnQpKSA/IFRSVUUgOiBGQUxTRTsKLSAgICAgICAgICAgIExvb3AgPSAoKFEgIT0gbGFzdF9xKSkgPyBUUlVFIDogRkFMU0U7Ci0gICAgICAgICAgICBsYXN0X3piaW5fb3EgPSBjcGktPnpiaW5fb3Zlcl9xdWFudDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIExvb3AgPSBGQUxTRTsKLQotICAgICAgICBpZiAoY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZikKLSAgICAgICAgICAgIExvb3AgPSBGQUxTRTsKLQotICAgICAgICBpZiAoTG9vcCA9PSBUUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfcmVzdG9yZV9jb2RpbmdfY29udGV4dChjcGkpOwotICAgICAgICAgICAgbG9vcF9jb3VudCsrOwotI2lmIENPTkZJR19QU05SCi0gICAgICAgICAgICBjcGktPnRvdF9yZWNvZGVfaGl0cysrOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKExvb3AgPT0gVFJVRSk7Ci0KLSNpZiAwCi0gICAgLy8gRXhwZXJpbWVudGFsIGNvZGUgZm9yIGxhZ2dlZCBhbmQgb25lIHBhc3MKLSAgICAvLyBVcGRhdGUgc3RhdHMgdXNlZCBmb3Igb25lIHBhc3MgR0Ygc2VsZWN0aW9uCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgICAgaW50IGZyYW1lc19zb19mYXI7Ci0gICAgICAgICAgICBkb3VibGUgZnJhbWVfaW50cmFfZXJyb3I7Ci0gICAgICAgICAgICBkb3VibGUgZnJhbWVfY29kZWRfZXJyb3I7Ci0gICAgICAgICAgICBkb3VibGUgZnJhbWVfcGNudF9pbnRlcjsKLSAgICAgICAgICAgIGRvdWJsZSBmcmFtZV9wY250X21vdGlvbjsKLSAgICAgICAgICAgIGRvdWJsZSBmcmFtZV9tdnI7Ci0gICAgICAgICAgICBkb3VibGUgZnJhbWVfbXZyX2FiczsKLSAgICAgICAgICAgIGRvdWJsZSBmcmFtZV9tdmM7Ci0gICAgICAgICAgICBkb3VibGUgZnJhbWVfbXZjX2FiczsKLSAgICAgICAgKi8KLQotICAgICAgICBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2NwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXhdLmZyYW1lX2NvZGVkX2Vycm9yID0gKGRvdWJsZSljcGktPnByZWRpY3Rpb25fZXJyb3I7Ci0gICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleF0uZnJhbWVfaW50cmFfZXJyb3IgPSAoZG91YmxlKWNwaS0+aW50cmFfZXJyb3I7Ci0gICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfc3RhdHNbY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleF0uZnJhbWVfcGNudF9pbnRlciA9IChkb3VibGUpKDEwMCAtIGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhKSAvIDEwMC4wOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gU3BlY2lhbCBjYXNlIGNvZGUgdG8gcmVkdWNlIHB1bHNpbmcgd2hlbiBrZXkgZnJhbWVzIGFyZSBmb3JjZWQgYXQgYQotICAgIC8vIGZpeGVkIGludGVydmFsLiBOb3RlIHRoZSByZWNvbnN0cnVjdGlvbiBlcnJvciBpZiBpdCBpcyB0aGUgZnJhbWUgYmVmb3JlCi0gICAgLy8gdGhlIGZvcmNlIGtleSBmcmFtZQotICAgIGlmICggY3BpLT5uZXh0X2tleV9mcmFtZV9mb3JjZWQgJiYgKGNwaS0+ZnJhbWVzX3RvX2tleSA9PSAwKSApCi0gICAgewotICAgICAgICBjcGktPmFtYmllbnRfZXJyID0gdnA4X2NhbGNfc3NfZXJyKGNwaS0+U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZfUlRDRCgmY3BpLT5ydGNkLnZhcmlhbmNlKSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBmcmFtZSdzIE1WcyBhcmUgc2F2ZWQgYW5kIHdpbGwgYmUgdXNlZCBpbiBuZXh0IGZyYW1lJ3MgTVYgcHJlZGljdGlvbi4KLSAgICAvLyBMYXN0IGZyYW1lIGhhcyBvbmUgbW9yZSBsaW5lKGFkZCB0byBib3R0b20pIGFuZCBvbmUgbW9yZSBjb2x1bW4oYWRkIHRvIHJpZ2h0KSB0aGFuIGNtLT5taXAuIFRoZSBlZGdlIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byAwLgotICAgIGlmKGNtLT5zaG93X2ZyYW1lKSAgIC8vZG8gbm90IHNhdmUgZm9yIGFsdHJlZiBmcmFtZQotICAgIHsKLSAgICAgICAgaW50IG1iX3JvdzsKLSAgICAgICAgaW50IG1iX2NvbDsKLSAgICAgICAgTU9ERV9JTkZPICp0bXAgPSBjbS0+bWlwOyAvL3BvaW50IHRvIGJlZ2lubmluZyBvZiBhbGxvY2F0ZWQgTU9ERV9JTkZPIGFycmF5cy4KLQotICAgICAgICBpZihjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3MrMTsgbWJfcm93ICsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAobWJfY29sID0gMDsgbWJfY29sIDwgY20tPm1iX2NvbHMrMTsgbWJfY29sICsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodG1wLT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+bGZtdlttYl9jb2wgKyBtYl9yb3cqKGNtLT5tb2RlX2luZm9fc3RyaWRlKzEpXS5hc19pbnQgPSB0bXAtPm1ibWkubXYuYXNfaW50OwotCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhc1ttYl9jb2wgKyBtYl9yb3cqKGNtLT5tb2RlX2luZm9fc3RyaWRlKzEpXSA9IGNtLT5yZWZfZnJhbWVfc2lnbl9iaWFzW3RtcC0+bWJtaS5yZWZfZnJhbWVdOwotICAgICAgICAgICAgICAgICAgICBjcGktPmxmX3JlZl9mcmFtZVttYl9jb2wgKyBtYl9yb3cqKGNtLT5tb2RlX2luZm9fc3RyaWRlKzEpXSA9IHRtcC0+bWJtaS5yZWZfZnJhbWU7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFVwZGF0ZSB0aGUgR0YgdXNlYWdlIG1hcHMuCi0gICAgLy8gVGhpcyBpcyBkb25lIGFmdGVyIGNvbXBsZXRpbmcgdGhlIGNvbXByZXNzaW9uIG9mIGEgZnJhbWUgd2hlbiBhbGwgbW9kZXMgZXRjLiBhcmUgZmluYWxpemVkIGJ1dCBiZWZvcmUgbG9vcCBmaWx0ZXIKLSAgICAvLyBUaGlzIGlzIGRvbmUgYWZ0ZXIgY29tcGxldGluZyB0aGUgY29tcHJlc3Npb24gb2YgYSBmcmFtZSB3aGVuIGFsbCBtb2RlcyBldGMuIGFyZSBmaW5hbGl6ZWQgYnV0IGJlZm9yZSBsb29wIGZpbHRlcgotICAgIHZwOF91cGRhdGVfZ2ZfdXNlYWdlX21hcHMoY3BpLCBjbSwgJmNwaS0+bWIpOwotCi0gICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgY20tPnJlZnJlc2hfbGFzdF9mcmFtZSA9IDE7Ci0KLSNpZiAwCi0gICAgewotICAgICAgICBGSUxFICpmID0gZm9wZW4oImdmYWN0aXZlLnN0dCIsICJhIik7Ci0gICAgICAgIGZwcmludGYoZiwgIiU4ZCAlOGQgJThkICU4ZCAlOGRcbiIsIGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lLCAoMTAwICogY3BpLT5nZl9hY3RpdmVfY291bnQpIC8gKGNwaS0+Y29tbW9uLm1iX3Jvd3MgKiBjcGktPmNvbW1vbi5tYl9jb2xzKSwgY3BpLT50aGlzX2lpcmF0aW8sIGNwaS0+bmV4dF9paXJhdGlvLCBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpOwotICAgICAgICBmY2xvc2UoZik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBGb3IgaW50ZXIgZnJhbWVzIHRoZSBjdXJyZW50IGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRoYXQgd2hlbiBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgaXMgc2V0IHdlIGNvcHkgdGhlIG9sZCBHRiBvdmVyIHRvIHRoZSBBUkYgYnVmZmVyCi0gICAgLy8gVGhpcyBpcyBwdXJlbHkgYW4gZW5jb2RlciBkZXNjaXNpb24gYXQgcHJlc2VudC4KLSAgICBpZiAoIWNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSAmJiBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpCi0gICAgICAgIGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgID0gMjsKLSAgICBlbHNlCi0gICAgICAgIGNtLT5jb3B5X2J1ZmZlcl90b19hcmYgID0gMDsKLQotICAgIGlmIChjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lKQotICAgIHsKLSAgICAgICAgdnA4X3N3YXBfeXYxMl9idWZmZXIoJmNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XSwgJmNtLT55djEyX2ZiW2NtLT5uZXdfZmJfaWR4XSk7Ci0gICAgICAgIGNtLT5mcmFtZV90b19zaG93ID0gJmNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBjbS0+ZnJhbWVfdG9fc2hvdyA9ICZjbS0+eXYxMl9mYltjbS0+bmV3X2ZiX2lkeF07Ci0KLQotI2lmIENPTkZJR19NVUxUSVRIUkVBRAotICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCi0gICAgewotICAgICAgICBzZW1fcG9zdCgmY3BpLT5oX2V2ZW50X3N0YXJ0X2xwZik7IC8qIHN0YXJ0IGxvb3BmaWx0ZXIgaW4gc2VwYXJhdGUgdGhyZWFkICovCi0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgICAgbG9vcGZpbHRlcl9mcmFtZShjcGksIGNtKTsKLSAgICB9Ci0KLSAgICBpZiAoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlID09IDEpCi0gICAgewotICAgICAgICBjbS0+cmVmcmVzaF9lbnRyb3B5X3Byb2JzID0gMDsKLSAgICB9Ci0KLSNpZiBDT05GSUdfTVVMVElUSFJFQUQKLSAgICAvKiB3YWl0IHRoYXQgZmlsdGVyX2xldmVsIGlzIHBpY2tlZCBzbyB0aGF0IHdlIGNhbiBjb250aW51ZSB3aXRoIHN0cmVhbSBwYWNraW5nICovCi0gICAgaWYgKGNwaS0+Yl9tdWx0aV90aHJlYWRlZCkKLSAgICAgICAgc2VtX3dhaXQoJmNwaS0+aF9ldmVudF9lbmRfbHBmKTsKLSNlbmRpZgotCi0gICAgLy8gYnVpbGQgdGhlIGJpdHN0cmVhbQotICAgIHZwOF9wYWNrX2JpdHN0cmVhbShjcGksIGRlc3QsIHNpemUpOwotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgLyogd2FpdCBmb3IgbG9vcGZpbHRlciB0aHJlYWQgZG9uZSAqLwotICAgIGlmIChjcGktPmJfbXVsdGlfdGhyZWFkZWQpCi0gICAgewotICAgICAgICBzZW1fd2FpdCgmY3BpLT5oX2V2ZW50X2VuZF9scGYpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogTW92ZSBzdG9yaW5nIGZyYW1lX3R5cGUgb3V0IG9mIHRoZSBhYm92ZSBsb29wIHNpbmNlIGl0IGlzIGFsc28KLSAgICAgKiBuZWVkZWQgaW4gbW90aW9uIHNlYXJjaCBiZXNpZGVzIGxvb3BmaWx0ZXIgKi8KLSAgICAgIGNtLT5sYXN0X2ZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKLQotICAgIC8vIFVwZGF0ZSByYXRlIGNvbnRyb2wgaGV1cmlzdGljcwotICAgIGNwaS0+dG90YWxfYnl0ZV9jb3VudCArPSAoKnNpemUpOwotICAgIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUgPSAoKnNpemUpIDw8IDM7Ci0KLSAgICBpZiAoIWFjdGl2ZV93b3JzdF9xY2hhbmdlZCkKLSAgICAgICAgdnA4X3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycyhjcGksIDIpOwotCi0gICAgY3BpLT5sYXN0X3FbY20tPmZyYW1lX3R5cGVdID0gY20tPmJhc2VfcWluZGV4OwotCi0gICAgaWYgKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIHZwOF9hZGp1c3Rfa2V5X2ZyYW1lX2NvbnRleHQoY3BpKTsKLSAgICB9Ci0KLSAgICAvLyBLZWVwIGEgcmVjb3JkIG9mIGFtYmllbnQgYXZlcmFnZSBRLgotICAgIGlmIChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgIGNwaS0+YXZnX2ZyYW1lX3FpbmRleCA9ICgyICsgMyAqIGNwaS0+YXZnX2ZyYW1lX3FpbmRleCArIGNtLT5iYXNlX3FpbmRleCkgPj4gMjsKLQotICAgIC8vIEtlZXAgYSByZWNvcmQgZnJvbSB3aGljaCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIFEgZXhjbHVkaW5nIEdGIHVwZGF0ZXMgYW5kIGtleSBmcmFtZXMKLSAgICBpZiAoKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYgIWNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSAmJiAhY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICB7Ci0gICAgICAgIGNwaS0+bmlfZnJhbWVzKys7Ci0KLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIFEgZm9yIG5vcm1hbCBpbnRlciBmcmFtZXMgKG5vdCBrZXkgb3IgR0ZVCi0gICAgICAgIC8vIGZyYW1lcykuCi0gICAgICAgIGlmICggY3BpLT5wYXNzID09IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPm5pX3RvdF9xaSArPSBROwotICAgICAgICAgICAgY3BpLT5uaV9hdl9xaSA9IChjcGktPm5pX3RvdF9xaSAvIGNwaS0+bmlfZnJhbWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIERhbXAgdmFsdWUgZm9yIGZpcnN0IGZldyBmcmFtZXMKLSAgICAgICAgICAgIGlmIChjcGktPm5pX2ZyYW1lcyA+IDE1MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5uaV90b3RfcWkgKz0gUTsKLSAgICAgICAgICAgICAgICBjcGktPm5pX2F2X3FpID0gKGNwaS0+bmlfdG90X3FpIC8gY3BpLT5uaV9mcmFtZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9yIG9uZSBwYXNzLCBlYXJseSBpbiB0aGUgY2xpcCAuLi4gYXZlcmFnZSB0aGUgY3VycmVudCBmcmFtZSBRCi0gICAgICAgICAgICAvLyB2YWx1ZSB3aXRoIHRoZSB3b3JzdHEgZW50ZXJlZCBieSB0aGUgdXNlciBhcyBhIGRhbXBlbmluZyBtZWFzdXJlCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5uaV90b3RfcWkgKz0gUTsKLSAgICAgICAgICAgICAgICBjcGktPm5pX2F2X3FpID0gKChjcGktPm5pX3RvdF9xaSAvIGNwaS0+bmlfZnJhbWVzKSArIGNwaS0+d29yc3RfcXVhbGl0eSArIDEpIC8gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlIGF2ZXJhZ2UgUSBpcyBoaWdoZXIgdGhhbiB3aGF0IHdhcyB1c2VkIGluIHRoZSBsYXN0IGZyYW1lCi0gICAgICAgICAgICAvLyAoYWZ0ZXIgZ29pbmcgdGhyb3VnaCB0aGUgcmVjb2RlIGxvb3AgdG8ga2VlcCB0aGUgZnJhbWUgc2l6ZSB3aXRoaW4gcmFuZ2UpCi0gICAgICAgICAgICAvLyB0aGVuIHVzZSB0aGUgbGFzdCBmcmFtZSB2YWx1ZSAtIDEuCi0gICAgICAgICAgICAvLyBUaGUgLTEgaXMgZGVzaWduZWQgdG8gc3RvcCBRIGFuZCBoZW5jZSB0aGUgZGF0YSByYXRlLCBmcm9tIHByb2dyZXNzaXZlbHkKLSAgICAgICAgICAgIC8vIGZhbGxpbmcgYXdheSBkdXJpbmcgZGlmZmljdWx0IHNlY3Rpb25zLCBidXQgYXQgdGhlIHNhbWUgdGltZSByZWR1Y2UgdGhlIG51bWJlciBvZgotICAgICAgICAgICAgLy8gaXR0ZXJhdGlvbnMgYXJvdW5kIHRoZSByZWNvZGUgbG9vcC4KLSAgICAgICAgICAgIGlmIChRID4gY3BpLT5uaV9hdl9xaSkKLSAgICAgICAgICAgICAgICBjcGktPm5pX2F2X3FpID0gUSAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiAwCi0KLSAgICAvLyBJZiB0aGUgZnJhbWUgd2FzIG1hc3NpdmVseSBvdmVyc2l6ZSBhbmQgd2UgYXJlIGJlbG93IG9wdGltYWwgYnVmZmVyIGxldmVsIGRyb3AgbmV4dCBmcmFtZQotICAgIGlmICgoY3BpLT5kcm9wX2ZyYW1lc19hbGxvd2VkKSAmJgotICAgICAgICAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpICYmCi0gICAgICAgIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+b3hjZi5kcm9wX2ZyYW1lc193YXRlcl9tYXJrICogY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKSAmJgotICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA+ICg0ICogY3BpLT50aGlzX2ZyYW1lX3RhcmdldCkpKQotICAgIHsKLSAgICAgICAgY3BpLT5kcm9wX2ZyYW1lID0gVFJVRTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLy8gU2V0IHRoZSBjb3VudCBmb3IgbWF4aW11bSBjb25zZXF1YXRpdmUgZHJvcHBlZCBmcmFtZXMgYmFzZWQgdXBvbiB0aGUgcmF0aW8gb2YKLSAgICAvLyB0aGlzIGZyYW1lIHNpemUgdG8gdGhlIHRhcmdldCBhdmVyYWdlIHBlciBmcmFtZSBiYW5kd2lkdGguCi0gICAgLy8gKGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCA+IDApIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2sgdG8gcHJldmVudCAvIDAuCi0gICAgaWYgKGNwaS0+ZHJvcF9mcmFtZXNfYWxsb3dlZCAmJiAoY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoID4gMCkpCi0gICAgewotICAgICAgICBjcGktPm1heF9kcm9wX2NvdW50ID0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSAvIGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aDsKLQotICAgICAgICBpZiAoY3BpLT5tYXhfZHJvcF9jb3VudCA+IGNwaS0+bWF4X2NvbnNlY19kcm9wcGVkX2ZyYW1lcykKLSAgICAgICAgICAgIGNwaS0+bWF4X2Ryb3BfY291bnQgPSBjcGktPm1heF9jb25zZWNfZHJvcHBlZF9mcmFtZXM7Ci0gICAgfQotCi0gICAgLy8gVXBkYXRlIHRoZSBidWZmZXIgbGV2ZWwgdmFyaWFibGUuCi0gICAgLy8gTm9uLXZpZXdhYmxlIGZyYW1lcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIGFyZSB0cmVhdGVkIGFzIHB1cmUgb3ZlcmhlYWQuCi0gICAgaWYgKCAhY20tPnNob3dfZnJhbWUgKQotICAgICAgICBjcGktPmJpdHNfb2ZmX3RhcmdldCAtPSBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplOwotICAgIGVsc2UKLSAgICAgICAgY3BpLT5iaXRzX29mZl90YXJnZXQgKz0gY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoIC0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKLQotICAgIC8vIFJvbGxpbmcgbW9uaXRvcnMgb2Ygd2hldGhlciB3ZSBhcmUgb3ZlciBvciB1bmRlcnNwZW5kaW5nIHVzZWQgdG8gaGVscCByZWd1bGF0ZSBtaW4gYW5kIE1heCBRIGluIHR3byBwYXNzLgotICAgIGNwaS0+cm9sbGluZ190YXJnZXRfYml0cyA9ICgoY3BpLT5yb2xsaW5nX3RhcmdldF9iaXRzICogMykgKyBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICsgMikgLyA0OwotICAgIGNwaS0+cm9sbGluZ19hY3R1YWxfYml0cyA9ICgoY3BpLT5yb2xsaW5nX2FjdHVhbF9iaXRzICogMykgKyBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplICsgMikgLyA0OwotICAgIGNwaS0+bG9uZ19yb2xsaW5nX3RhcmdldF9iaXRzID0gKChjcGktPmxvbmdfcm9sbGluZ190YXJnZXRfYml0cyAqIDMxKSArIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKyAxNikgLyAzMjsKLSAgICBjcGktPmxvbmdfcm9sbGluZ19hY3R1YWxfYml0cyA9ICgoY3BpLT5sb25nX3JvbGxpbmdfYWN0dWFsX2JpdHMgKiAzMSkgKyBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplICsgMTYpIC8gMzI7Ci0KLSAgICAvLyBBY3R1YWwgYml0cyBzcGVudAotICAgIGNwaS0+dG90YWxfYWN0dWFsX2JpdHMgICAgKz0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKLQotICAgIC8vIERlYnVnIHN0YXRzCi0gICAgY3BpLT50b3RhbF90YXJnZXRfdnNfYWN0dWFsICs9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSk7Ci0KLSAgICBjcGktPmJ1ZmZlcl9sZXZlbCA9IGNwaS0+Yml0c19vZmZfdGFyZ2V0OwotCi0gICAgLy8gVXBkYXRlIGJpdHMgbGVmdCB0byB0aGUga2YgYW5kIGdmIGdyb3VwcyB0byBhY2NvdW50IGZvciBvdmVyc2hvb3Qgb3IgdW5kZXJzaG9vdCBvbiB0aGVzZSBmcmFtZXMKLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgY3BpLT5rZl9ncm91cF9iaXRzICs9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLSBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplOwotCi0gICAgICAgIGlmIChjcGktPmtmX2dyb3VwX2JpdHMgPCAwKQotICAgICAgICAgICAgY3BpLT5rZl9ncm91cF9iaXRzID0gMCA7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSB8fCBjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQotICAgIHsKLSAgICAgICAgY3BpLT5nZl9ncm91cF9iaXRzICs9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLSBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplOwotCi0gICAgICAgIGlmIChjcGktPmdmX2dyb3VwX2JpdHMgPCAwKQotICAgICAgICAgICAgY3BpLT5nZl9ncm91cF9iaXRzID0gMCA7Ci0gICAgfQotCi0gICAgaWYgKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzJdID0gY3BpLT5wcm9iX3NraXBfZmFsc2U7Ci0gICAgICAgICAgICBjcGktPmxhc3Rfc2tpcF9wcm9ic19xWzJdID0gY20tPmJhc2VfcWluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmxhc3Rfc2tpcF9mYWxzZV9wcm9ic1sxXSA9IGNwaS0+cHJvYl9za2lwX2ZhbHNlOwotICAgICAgICAgICAgY3BpLT5sYXN0X3NraXBfcHJvYnNfcVsxXSA9IGNtLT5iYXNlX3FpbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+bGFzdF9za2lwX2ZhbHNlX3Byb2JzWzBdID0gY3BpLT5wcm9iX3NraXBfZmFsc2U7Ci0gICAgICAgICAgICBjcGktPmxhc3Rfc2tpcF9wcm9ic19xWzBdID0gY20tPmJhc2VfcWluZGV4OwotCi0gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgYmFzZWxpbmUKLSAgICAgICAgICAgIGNwaS0+YmFzZV9za2lwX2ZhbHNlX3Byb2JbY20tPmJhc2VfcWluZGV4XSA9IGNwaS0+cHJvYl9za2lwX2ZhbHNlOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiAwICYmIENPTkZJR19QU05SCi0gICAgewotICAgICAgICBGSUxFICpmID0gZm9wZW4oInRtcC5zdHQiLCAiYSIpOwotCi0gICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsgIC8vX19hc20gZW1tczsKLQotICAgICAgICBpZiAoY3BpLT50b3RhbF9jb2RlZF9lcnJvcl9sZWZ0ICE9IDAuMCkKLSAgICAgICAgICAgIGZwcmludGYoZiwgIiUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlNmxkICU2bGQiCi0gICAgICAgICAgICAgICAgICAgICAgICIlNmxkICU2bGQgJTZsZCAlNWxkICU1bGQgJTVsZCAlOGxkICU4LjJmICUxMGQgJTEwLjNmIgotICAgICAgICAgICAgICAgICAgICAgICAiJTEwLjNmICU4bGRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsIGNwaS0+dGhpc19mcmFtZV90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIChjcGktPnByb2plY3RlZF9mcmFtZV9zaXplIC0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCksCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpY3BpLT50b3RhbF90YXJnZXRfdnNfYWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5veGNmLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbC1jcGktPmJpdHNfb2ZmX3RhcmdldCksCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpY3BpLT50b3RhbF9hY3R1YWxfYml0cywgY20tPmJhc2VfcWluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHksIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgIGNwaS0+bmlfYXZfcWksIGNwaS0+Y3FfdGFyZ2V0X3F1YWxpdHksIGNwaS0+emJpbl9vdmVyX3F1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAvL2NwaS0+YXZnX2ZyYW1lX3FpbmRleCwgY3BpLT56YmluX292ZXJfcXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSwgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY20tPmZyYW1lX3R5cGUsIGNwaS0+Z2Z1X2Jvb3N0LAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPmVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yLCAoaW50KWNwaS0+Yml0c19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFsX2NvZGVkX2Vycm9yX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpY3BpLT5iaXRzX2xlZnQgLyBjcGktPnRvdGFsX2NvZGVkX2Vycm9yX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dG90X3JlY29kZV9oaXRzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihmLCAiJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZCAlMTBkICU2bGQgJTZsZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIiU2bGQgJTZsZCAlNmxkICU1bGQgJTVsZCAlNWxkICU4bGQgJTguMmYgJTEwZCAlMTAuM2YiCi0gICAgICAgICAgICAgICAgICAgICAgICIlOGxkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0LCBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSAtIGNwaS0+dGhpc19mcmFtZV90YXJnZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAoaW50KWNwaS0+dG90YWxfdGFyZ2V0X3ZzX2FjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+b3hjZi5zdGFydGluZ19idWZmZXJfbGV2ZWwtY3BpLT5iaXRzX29mZl90YXJnZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAoaW50KWNwaS0+dG90YWxfYWN0dWFsX2JpdHMsIGNtLT5iYXNlX3FpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5LCBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPm5pX2F2X3FpLCBjcGktPmNxX3RhcmdldF9xdWFsaXR5LCBjcGktPnpiaW5fb3Zlcl9xdWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgLy9jcGktPmF2Z19mcmFtZV9xaW5kZXgsIGNwaS0+emJpbl9vdmVyX3F1YW50LAotICAgICAgICAgICAgICAgICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUsIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNtLT5mcmFtZV90eXBlLCBjcGktPmdmdV9ib29zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5lc3RfbWF4X3Fjb3JyZWN0aW9uX2ZhY3RvciwgKGludCljcGktPmJpdHNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50b3RhbF9jb2RlZF9lcnJvcl9sZWZ0LCBjcGktPnRvdF9yZWNvZGVfaGl0cyk7Ci0KLSAgICAgICAgZmNsb3NlKGYpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZJTEUgKmZtb2RlcyA9IGZvcGVuKCJNb2Rlcy5zdHQiLCAiYSIpOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZwcmludGYoZm1vZGVzLCAiJTZkOiUxZDolMWQ6JTFkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY20tPmZyYW1lX3R5cGUsIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVTOyBpKyspCi0gICAgICAgICAgICAgICAgZnByaW50ZihmbW9kZXMsICIlNWQgIiwgY3BpLT5tb2RlX2Nob3Nlbl9jb3VudHNbaV0pOwotCi0gICAgICAgICAgICBmcHJpbnRmKGZtb2RlcywgIlxuIik7Ci0KLSAgICAgICAgICAgIGZjbG9zZShmbW9kZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8vIElmIHRoaXMgd2FzIGEga2Ygb3IgR2Ygbm90ZSB0aGUgUQotICAgIGlmICgoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB8fCBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgfHwgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgY20tPmxhc3Rfa2ZfZ2ZfcSA9IGNtLT5iYXNlX3FpbmRleDsKLQotICAgIGlmIChjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPT0gMSkKLSAgICAgICAgY20tPmZyYW1lX2ZsYWdzID0gY20tPmZyYW1lX2ZsYWdzIHwgRlJBTUVGTEFHU19HT0xERU47Ci0gICAgZWxzZQotICAgICAgICBjbS0+ZnJhbWVfZmxhZ3MgPSBjbS0+ZnJhbWVfZmxhZ3MmfkZSQU1FRkxBR1NfR09MREVOOwotCi0gICAgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPT0gMSkKLSAgICAgICAgY20tPmZyYW1lX2ZsYWdzID0gY20tPmZyYW1lX2ZsYWdzIHwgRlJBTUVGTEFHU19BTFRSRUY7Ci0gICAgZWxzZQotICAgICAgICBjbS0+ZnJhbWVfZmxhZ3MgPSBjbS0+ZnJhbWVfZmxhZ3MmfkZSQU1FRkxBR1NfQUxUUkVGOwotCi0KLSAgICBpZiAoY20tPnJlZnJlc2hfbGFzdF9mcmFtZSAmIGNtLT5yZWZyZXNoX2dvbGRlbl9mcmFtZSkgLy8gYm90aCByZWZyZXNoZWQKLSAgICAgICAgY3BpLT5nb2xkX2lzX2xhc3QgPSAxOwotICAgIGVsc2UgaWYgKGNtLT5yZWZyZXNoX2xhc3RfZnJhbWUgXiBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpIC8vIDEgcmVmcmVzaGVkIGJ1dCBub3QgdGhlIG90aGVyCi0gICAgICAgIGNwaS0+Z29sZF9pc19sYXN0ID0gMDsKLQotICAgIGlmIChjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lICYgY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkgLy8gYm90aCByZWZyZXNoZWQKLSAgICAgICAgY3BpLT5hbHRfaXNfbGFzdCA9IDE7Ci0gICAgZWxzZSBpZiAoY20tPnJlZnJlc2hfbGFzdF9mcmFtZSBeIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpIC8vIDEgcmVmcmVzaGVkIGJ1dCBub3QgdGhlIG90aGVyCi0gICAgICAgIGNwaS0+YWx0X2lzX2xhc3QgPSAwOwotCi0gICAgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgJiBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpIC8vIGJvdGggcmVmcmVzaGVkCi0gICAgICAgIGNwaS0+Z29sZF9pc19hbHQgPSAxOwotICAgIGVsc2UgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgXiBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUpIC8vIDEgcmVmcmVzaGVkIGJ1dCBub3QgdGhlIG90aGVyCi0gICAgICAgIGNwaS0+Z29sZF9pc19hbHQgPSAwOwotCi0gICAgY3BpLT5yZWZfZnJhbWVfZmxhZ3MgPSBWUDhfQUxUX0ZMQUcgfCBWUDhfR09MRF9GTEFHIHwgVlA4X0xBU1RfRkxBRzsKLQotICAgIGlmIChjcGktPmdvbGRfaXNfbGFzdCkKLSAgICAgICAgY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJj0gflZQOF9HT0xEX0ZMQUc7Ci0KLSAgICBpZiAoY3BpLT5hbHRfaXNfbGFzdCkKLSAgICAgICAgY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJj0gflZQOF9BTFRfRkxBRzsKLQotICAgIGlmIChjcGktPmdvbGRfaXNfYWx0KQotICAgICAgICBjcGktPnJlZl9mcmFtZV9mbGFncyAmPSB+VlA4X0FMVF9GTEFHOwotCi0KLSAgICBpZiAoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlKQotICAgIHsKLSAgICAgICAgaWYgKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSXMgdGhpcyBhbiBhbHRlcm5hdGUgcmVmZXJlbmNlIHVwZGF0ZQotICAgICAgICAgICAgaWYgKGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoY20tPmZyYW1lX3RvX3Nob3csICZjbS0+eXYxMl9mYltjbS0+YWx0X2ZiX2lkeF0pOwotCi0gICAgICAgICAgICBpZiAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQotICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKGNtLT5mcmFtZV90b19zaG93LCAmY20tPnl2MTJfZmJbY20tPmdsZF9mYl9pZHhdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoY3BpLT5veGNmLnBsYXlfYWx0ZXJuYXRlICYmIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgJiYgKGNtLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkpCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUgYW5kIHN0YXRzIGFzIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgdXBkYXRlX2FsdF9yZWZfZnJhbWVfYW5kX3N0YXRzKGNwaSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgR29sZGVuIGZyYW1lIGFuZCBnb2xkZW4gZnJhbWUgYW5kIHN0YXRzIGFzIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgdXBkYXRlX2dvbGRlbl9mcmFtZV9hbmRfc3RhdHMoY3BpKTsKLSAgICB9Ci0KLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgIHsKLSAgICAgICAgLy8gVGVsbCB0aGUgY2FsbGVyIHRoYXQgdGhlIGZyYW1lIHdhcyBjb2RlZCBhcyBhIGtleSBmcmFtZQotICAgICAgICAqZnJhbWVfZmxhZ3MgPSBjbS0+ZnJhbWVfZmxhZ3MgfCBGUkFNRUZMQUdTX0tFWTsKLQotICAgICAgICAvLyBBcyB0aGlzIGZyYW1lIGlzIGEga2V5IGZyYW1lICB0aGUgbmV4dCBkZWZhdWx0cyB0byBhbiBpbnRlciBmcmFtZS4KLSAgICAgICAgY20tPmZyYW1lX3R5cGUgPSBJTlRFUl9GUkFNRTsKLQotICAgICAgICBjcGktPmxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYSA9IDEwMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKmZyYW1lX2ZsYWdzID0gY20tPmZyYW1lX2ZsYWdzJn5GUkFNRUZMQUdTX0tFWTsKLQotICAgICAgICBjcGktPmxhc3RfZnJhbWVfcGVyY2VudF9pbnRyYSA9IGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhOwotICAgIH0KLQotICAgIC8vIENsZWFyIHRoZSBvbmUgc2hvdCB1cGRhdGUgZmxhZ3MgZm9yIHNlZ21lbnRhdGlvbiBtYXAgYW5kIG1vZGUvcmVmIGxvb3AgZmlsdGVyIGRlbHRhcy4KLSAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fbWFwID0gMDsKLSAgICBjcGktPm1iLmVfbWJkLnVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YSA9IDA7Ci0gICAgY3BpLT5tYi5lX21iZC5tb2RlX3JlZl9sZl9kZWx0YV91cGRhdGUgPSAwOwotCi0KLSAgICAvLyBEb250IGluY3JlbWVudCBmcmFtZSBjb3VudGVycyBpZiB0aGlzIHdhcyBhbiBhbHRyZWYgYnVmZmVyIHVwZGF0ZSBub3QgYSByZWFsIGZyYW1lCi0gICAgaWYgKGNtLT5zaG93X2ZyYW1lKQotICAgIHsKLSAgICAgICAgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUrKzsKLSAgICAgICAgY3BpLT5mcmFtZXNfc2luY2Vfa2V5Kys7Ci0gICAgfQotCi0gICAgLy8gcmVzZXQgdG8gbm9ybWFsIHN0YXRlIG5vdyB0aGF0IHdlIGFyZSBkb25lLgotCi0KLQotI2lmIDAKLSAgICB7Ci0gICAgICAgIGNoYXIgZmlsZW5hbWVbNTEyXTsKLSAgICAgICAgRklMRSAqcmVjb25fZmlsZTsKLSAgICAgICAgc3ByaW50ZihmaWxlbmFtZSwgImVuYyUwNGQueXV2IiwgKGludCkgY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUpOwotICAgICAgICByZWNvbl9maWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOwotICAgICAgICBmd3JpdGUoY20tPnl2MTJfZmJbY20tPmxzdF9mYl9pZHhdLmJ1ZmZlcl9hbGxvYywKLSAgICAgICAgICAgICAgIGNtLT55djEyX2ZiW2NtLT5sc3RfZmJfaWR4XS5mcmFtZV9zaXplLCAxLCByZWNvbl9maWxlKTsKLSAgICAgICAgZmNsb3NlKHJlY29uX2ZpbGUpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gREVCVUcKLSAgICAvL3ZwOF93cml0ZV95dXZfZnJhbWUoImVuY29kZXJfcmVjb24ueXV2IiwgY20tPmZyYW1lX3RvX3Nob3cpOwotCi0KLX0KLQotCi1zdGF0aWMgdm9pZCBjaGVja19nZl9xdWFsaXR5KFZQOF9DT01QICpjcGkpCi17Ci0gICAgVlA4X0NPTU1PTiAqY20gPSAmY3BpLT5jb21tb247Ci0gICAgaW50IGdmX2FjdGl2ZV9wY3QgPSAoMTAwICogY3BpLT5nZl9hY3RpdmVfY291bnQpIC8gKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpOwotICAgIGludCBnZl9yZWZfdXNhZ2VfcGN0ID0gKGNwaS0+Y291bnRfbWJfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKiAxMDApIC8gKGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHMpOwotICAgIGludCBsYXN0X3JlZl96el91c2VhZ2UgPSAoY3BpLT5pbnRlcl96el9jb3VudCAqIDEwMCkgLyAoY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scyk7Ci0KLSAgICAvLyBHZiByZWZyZXNoIGlzIG5vdCBjdXJyZW50bHkgYmVpbmcgc2lnbmFsbGVkCi0gICAgaWYgKGNwaS0+Z2ZfdXBkYXRlX3JlY29tbWVuZGVkID09IDApCi0gICAgewotICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiA+IDcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIExvdyB1c2Ugb2YgZ2YKLSAgICAgICAgICAgIGlmICgoZ2ZfYWN0aXZlX3BjdCA8IDEwKSB8fCAoKGdmX2FjdGl2ZV9wY3QgKyBnZl9yZWZfdXNhZ2VfcGN0KSA8IDE1KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAuLi5idXQgbGFzdCBmcmFtZSB6ZXJvIHplcm8gdXNhZ2UgaXMgcmVhc29uYmFibGUgc28gYSBuZXcgZ2YgbWlnaHQgYmUgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgICAgICBpZiAobGFzdF9yZWZfenpfdXNlYWdlID49IDI1KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5nZl9iYWRfY291bnQgKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+Z2ZfYmFkX2NvdW50ID49IDgpICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29uZGl0aW9uIGlzIHN0YWJsZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmdmX3VwZGF0ZV9yZWNvbW1lbmRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmdmX2JhZF9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjcGktPmdmX2JhZF9jb3VudCA9IDA7ICAgICAgICAvLyBSZXN0YXJ0IGNvdW50IGFzIHRoZSBiYWNrZ3JvdW5kIGlzIG5vdCBzdGFibGUgZW5vdWdoCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3BpLT5nZl9iYWRfY291bnQgPSAwOyAgICAgICAgICAgIC8vIEdmIHVzZWFnZSBoYXMgcGlja2VkIHVwIHNvIHJlc2V0IGNvdW50Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgdGhlIHNpZ25hbCBpcyBzZXQgYnV0IGhhcyBub3QgYmVlbiByZWFkIHNob3VsZCB3ZSBjYW5jZWwgaXQuCi0gICAgZWxzZSBpZiAobGFzdF9yZWZfenpfdXNlYWdlIDwgMTUpCi0gICAgewotICAgICAgICBjcGktPmdmX3VwZGF0ZV9yZWNvbW1lbmRlZCA9IDA7Ci0gICAgICAgIGNwaS0+Z2ZfYmFkX2NvdW50ID0gMDsKLSAgICB9Ci0KLSNpZiAwCi0gICAgewotICAgICAgICBGSUxFICpmID0gZm9wZW4oImdmbmVlZGVkLnN0dCIsICJhIik7Ci0gICAgICAgIGZwcmludGYoZiwgIiUxMGQgJTEwZCAlMTBkICUxMGQgJTEwbGQgXG4iLAotICAgICAgICAgICAgICAgIGNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lLAotICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmZyYW1lc19zaW5jZV9nb2xkZW4sCi0gICAgICAgICAgICAgICAgZ2ZfYWN0aXZlX3BjdCwgZ2ZfcmVmX3VzYWdlX3BjdCwKLSAgICAgICAgICAgICAgICBjcGktPmdmX3VwZGF0ZV9yZWNvbW1lbmRlZCk7Ci0gICAgICAgIGZjbG9zZShmKTsKLSAgICB9Ci0KLSNlbmRpZgotfQotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLXN0YXRpYyB2b2lkIFBhc3MyRW5jb2RlKFZQOF9DT01QICpjcGksIHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCAqZnJhbWVfZmxhZ3MpCi17Ci0KLSAgICBpZiAoIWNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgdnA4X3NlY29uZF9wYXNzKGNwaSk7Ci0KLSAgICBlbmNvZGVfZnJhbWVfdG9fZGF0YV9yYXRlKGNwaSwgc2l6ZSwgZGVzdCwgZnJhbWVfZmxhZ3MpOwotICAgIGNwaS0+Yml0c19sZWZ0IC09IDggKiAqc2l6ZTsKLQotICAgIGlmICghY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQotICAgIHsKLSAgICAgICAgZG91YmxlIHR3b19wYXNzX21pbl9yYXRlID0gKGRvdWJsZSkoY3BpLT5veGNmLnRhcmdldF9iYW5kd2lkdGgKLSAgICAgICAgICAgICpjcGktPm94Y2YudHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gLyAxMDApOwotICAgICAgICBjcGktPmJpdHNfbGVmdCArPSAobG9uZyBsb25nKSh0d29fcGFzc19taW5fcmF0ZSAvIGNwaS0+b3hjZi5mcmFtZV9yYXRlKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLy9Gb3IgQVJNIE5FT04sIGQ4LWQxNSBhcmUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycywgYW5kIG5lZWQgdG8gYmUgc2F2ZWQgYnkgdXMuCi0jaWYgSEFWRV9BUk1WNwotZXh0ZXJuIHZvaWQgdnA4X3B1c2hfbmVvbihJTlQ2NCAqc3RvcmUpOwotZXh0ZXJuIHZvaWQgdnA4X3BvcF9uZW9uKElOVDY0ICpzdG9yZSk7Ci0jZW5kaWYKLWludCB2cDhfcmVjZWl2ZV9yYXdfZnJhbWUoVlA4X1BUUiBwdHIsIHVuc2lnbmVkIGludCBmcmFtZV9mbGFncywgWVYxMl9CVUZGRVJfQ09ORklHICpzZCwgSU5UNjQgdGltZV9zdGFtcCwgSU5UNjQgZW5kX3RpbWUpCi17Ci0jaWYgSEFWRV9BUk1WNwotICAgIElOVDY0IHN0b3JlX3JlZ1s4XTsKLSNlbmRpZgotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikgcHRyOwotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciAgdGltZXI7Ci0KLSAgICBpZiAoIWNwaSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgIHsKLSAgICAgICAgdnA4X3B1c2hfbmVvbihzdG9yZV9yZWcpOwotICAgIH0KLSNlbmRpZgotCi0gICAgdnB4X3VzZWNfdGltZXJfc3RhcnQoJnRpbWVyKTsKLQotICAgIC8vIG5vIG1vcmUgcm9vbSBmb3IgZnJhbWVzOwotICAgIGlmIChjcGktPnNvdXJjZV9idWZmZXJfY291bnQgIT0gMCAmJiBjcGktPnNvdXJjZV9idWZmZXJfY291bnQgPj0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMpCi0gICAgewotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgIGlmIChjbS0+cnRjZC5mbGFncyAmIEhBU19ORU9OKQotI2VuZGlmCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF9wb3BfbmVvbihzdG9yZV9yZWcpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vcHJpbnRmKCJpbi1jcGktPnNvdXJjZV9idWZmZXJfY291bnQ6ICVkXG4iLCBjcGktPnNvdXJjZV9idWZmZXJfY291bnQpOwotCi0gICAgY20tPmNscl90eXBlID0gc2QtPmNscnR5cGU7Ci0KLSAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgZnJhbWUgZm9yIHVzZSBsYXRlci4uLgotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0KLSAgICBpZiAoY3BpLT5veGNmLmFsbG93X2xhZykKLSAgICB7Ci0gICAgICAgIGludCB3aGljaF9idWZmZXIgPSAgY3BpLT5zb3VyY2VfZW5jb2RlX2luZGV4IC0gMTsKLSAgICAgICAgU09VUkNFX1NBTVBMRSAqczsKLQotICAgICAgICBpZiAod2hpY2hfYnVmZmVyID09IC0xKQotICAgICAgICAgICAgd2hpY2hfYnVmZmVyID0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgLSAxOwotCi0gICAgICAgIGlmIChjcGktPnNvdXJjZV9idWZmZXJfY291bnQgPCBjcGktPm94Y2YubGFnX2luX2ZyYW1lcyAtIDEpCi0gICAgICAgICAgICB3aGljaF9idWZmZXIgPSBjcGktPnNvdXJjZV9idWZmZXJfY291bnQ7Ci0KLSAgICAgICAgcyA9ICZjcGktPnNyY19idWZmZXJbd2hpY2hfYnVmZmVyXTsKLQotICAgICAgICBzLT5zb3VyY2VfdGltZV9zdGFtcCA9IHRpbWVfc3RhbXA7Ci0gICAgICAgIHMtPnNvdXJjZV9lbmRfdGltZV9zdGFtcCA9IGVuZF90aW1lOwotICAgICAgICBzLT5zb3VyY2VfZnJhbWVfZmxhZ3MgPSBmcmFtZV9mbGFnczsKLSAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoc2QsICZzLT5zb3VyY2VfYnVmZmVyKTsKLQotICAgICAgICBjcGktPnNvdXJjZV9idWZmZXJfY291bnQgKys7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgICAgU09VUkNFX1NBTVBMRSAqczsKLSAgICAgICAgcyA9ICZjcGktPnNyY19idWZmZXJbMF07Ci0gICAgICAgIHMtPnNvdXJjZV9lbmRfdGltZV9zdGFtcCA9IGVuZF90aW1lOwotICAgICAgICBzLT5zb3VyY2VfdGltZV9zdGFtcCA9IHRpbWVfc3RhbXA7Ci0gICAgICAgIHMtPnNvdXJjZV9mcmFtZV9mbGFncyA9IGZyYW1lX2ZsYWdzOwotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgIGlmIChjbS0+cnRjZC5mbGFncyAmIEhBU19ORU9OKQotI2VuZGlmCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwOF95djEyX2NvcHlfc3JjX2ZyYW1lX2Z1bmNfbmVvbihzZCwgJnMtPnNvdXJjZV9idWZmZXIpOwotICAgICAgICB9Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgICAgICBlbHNlCi0jZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX0FSTVY3IHx8IENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV9wdHIoc2QsICZzLT5zb3VyY2VfYnVmZmVyKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGNwaS0+c291cmNlX2J1ZmZlcl9jb3VudCA9IDE7Ci0gICAgfQotCi0gICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdGltZXIpOwotICAgIGNwaS0+dGltZV9yZWNlaXZlX2RhdGEgKz0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmdGltZXIpOwotCi0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgIHsKLSAgICAgICAgdnA4X3BvcF9uZW9uKHN0b3JlX3JlZyk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KLWludCB2cDhfZ2V0X2NvbXByZXNzZWRfZGF0YShWUDhfUFRSIHB0ciwgdW5zaWduZWQgaW50ICpmcmFtZV9mbGFncywgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgY2hhciAqZGVzdCwgSU5UNjQgKnRpbWVfc3RhbXAsIElOVDY0ICp0aW1lX2VuZCwgaW50IGZsdXNoKQotewotI2lmIEhBVkVfQVJNVjcKLSAgICBJTlQ2NCBzdG9yZV9yZWdbOF07Ci0jZW5kaWYKLSAgICBWUDhfQ09NUCAqY3BpID0gKFZQOF9DT01QICopIHB0cjsKLSAgICBWUDhfQ09NTU9OICpjbSA9ICZjcGktPmNvbW1vbjsKLSAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgIHRzY3RpbWVyOwotICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciAgdGlja3RpbWVyOwotICAgIHN0cnVjdCB2cHhfdXNlY190aW1lciAgY21wdGltZXI7Ci0KLSAgICBpZiAoIWNwaSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgIHsKLSAgICAgICAgdnA4X3B1c2hfbmVvbihzdG9yZV9yZWcpOwotICAgIH0KLSNlbmRpZgotCi0gICAgdnB4X3VzZWNfdGltZXJfc3RhcnQoJmNtcHRpbWVyKTsKLQotCi0gICAgLy8gZmx1c2ggdmFyaWFibGUgdGVsbHMgdXMgdGhhdCBldmVuIHRob3VnaCB3ZSBoYXZlIGxlc3MgdGhhbiAxMCBmcmFtZXMKLSAgICAvLyBpbiBvdXIgYnVmZmVyIHdlIG5lZWQgdG8gc3RhcnQgcHJvZHVjaW5nIGNvbXByZXNzZWQgZnJhbWVzLgotICAgIC8vIFByb2JhYmx5IGJlY2F1c2Ugd2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBmaWxlLi4uLgotICAgIGlmICgoY3BpLT5zb3VyY2VfYnVmZmVyX2NvdW50ID09IGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzICYmIGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzID4gMCkKLSAgICAgICAgfHwgKCFjcGktPm94Y2YuYWxsb3dfbGFnICYmIGNwaS0+c291cmNlX2J1ZmZlcl9jb3VudCA+IDApCi0gICAgICAgIHx8IChmbHVzaCAmJiBjcGktPnNvdXJjZV9idWZmZXJfY291bnQgPiAwKSkKLSAgICB7Ci0KLSAgICAgICAgU09VUkNFX1NBTVBMRSAqczsKLQotICAgICAgICBzID0gJmNwaS0+c3JjX2J1ZmZlcltjcGktPnNvdXJjZV9lbmNvZGVfaW5kZXhdOwotICAgICAgICBjcGktPnNvdXJjZV90aW1lX3N0YW1wID0gcy0+c291cmNlX3RpbWVfc3RhbXA7Ci0gICAgICAgIGNwaS0+c291cmNlX2VuZF90aW1lX3N0YW1wID0gcy0+c291cmNlX2VuZF90aW1lX3N0YW1wOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLQotICAgICAgICAvLyBTaG91bGQgd2UgY29kZSBhbiBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lCi0gICAgICAgIGlmIChjcGktPm94Y2YuZXJyb3JfcmVzaWxpZW50X21vZGUgPT0gMCAmJgotICAgICAgICAgICAgY3BpLT5veGNmLnBsYXlfYWx0ZXJuYXRlICYmCi0gICAgICAgICAgICBjcGktPnNvdXJjZV9hbHRfcmVmX3BlbmRpbmcgICYmCi0gICAgICAgICAgICAoY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlIDwgY3BpLT5zb3VyY2VfYnVmZmVyX2NvdW50KSAmJgotICAgICAgICAgICAgY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5sYXN0X2FsdF9yZWZfc2VpID0gKGNwaS0+c291cmNlX2VuY29kZV9pbmRleCArIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSkgJSBjcGktPm94Y2YubGFnX2luX2ZyYW1lczsKLQotI2lmIFZQOF9URU1QT1JBTF9BTFRfUkVGCi0KLSAgICAgICAgICAgIGlmIChjcGktPm94Y2YuYXJucl9tYXhfZnJhbWVzID4gMCkKLSAgICAgICAgICAgIHsKLSNpZiAwCi0gICAgICAgICAgICAgICAgLy8gbXkgYXR0ZW1wdCBhdCBhIGxvb3AgdGhhdCB0ZXN0cyB0aGUgcmVzdWx0cyBvZiBzdHJlbmd0aCBmaWx0ZXIuCi0gICAgICAgICAgICAgICAgaW50IHN0YXJ0X2ZyYW1lID0gY3BpLT5sYXN0X2FsdF9yZWZfc2VpIC0gMzsKLQotICAgICAgICAgICAgICAgIGludCBpLCBiZXN0aSA9IC0xLCBwYXN0aW4gPSBjcGktPm94Y2YuYXJucl9zdHJlbmd0aDsKLQotICAgICAgICAgICAgICAgIGludCBiZXN0ZXJyOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2ZyYW1lIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRfZnJhbWUgKz0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXM7Ci0KLSAgICAgICAgICAgICAgICBiZXN0ZXJyID0gY2FsY19sb3dfc3NfZXJyKCZjcGktPnNyY19idWZmZXJbY3BpLT5sYXN0X2FsdF9yZWZfc2VpXS5zb3VyY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcGktPnNyY19idWZmZXJbc3RhcnRfZnJhbWVdLnNvdXJjZV9idWZmZXIsIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0aGlzZXJyOwotICAgICAgICAgICAgICAgICAgICBjcGktPm94Y2YuYXJucl9zdHJlbmd0aCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIHZwOF90ZW1wb3JhbF9maWx0ZXJfcHJlcGFyZV9jKGNwaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpc2VyciA9IGNhbGNfbG93X3NzX2VycigmY3BpLT5hbHRfcmVmX2J1ZmZlci5zb3VyY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BpLT5zcmNfYnVmZmVyW3N0YXJ0X2ZyYW1lXS5zb3VyY2VfYnVmZmVyLCBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoMTAgKiB0aGlzZXJyIDwgYmVzdGVyciAqIDgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RlcnIgPSB0aGlzZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdGkgPSBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJlc3RpICE9IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5veGNmLmFybnJfc3RyZW5ndGggPSBiZXN0aTsKLSAgICAgICAgICAgICAgICAgICAgdnA4X3RlbXBvcmFsX2ZpbHRlcl9wcmVwYXJlX2MoY3BpKTsKLSAgICAgICAgICAgICAgICAgICAgcyA9ICZjcGktPmFsdF9yZWZfYnVmZmVyOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEZXRyBub3Qgc3VyZSBpZiBJIG5lZWQgdG8gY29weSB0aGlzIGRhdGEgZm9yIHRoZSBBbHQgUmVmIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgIHMtPnNvdXJjZV90aW1lX3N0YW1wID0gY3BpLT5zcmNfYnVmZmVyW2NwaS0+bGFzdF9hbHRfcmVmX3NlaV0uc291cmNlX3RpbWVfc3RhbXA7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnNvdXJjZV9lbmRfdGltZV9zdGFtcCA9IGNwaS0+c3JjX2J1ZmZlcltjcGktPmxhc3RfYWx0X3JlZl9zZWldLnNvdXJjZV9lbmRfdGltZV9zdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgcy0+c291cmNlX2ZyYW1lX2ZsYWdzID0gY3BpLT5zcmNfYnVmZmVyW2NwaS0+bGFzdF9hbHRfcmVmX3NlaV0uc291cmNlX2ZyYW1lX2ZsYWdzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHMgPSAmY3BpLT5zcmNfYnVmZmVyW2NwaS0+bGFzdF9hbHRfcmVmX3NlaV07Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgdnA4X3RlbXBvcmFsX2ZpbHRlcl9wcmVwYXJlX2MoY3BpKTsKLSAgICAgICAgICAgICAgICBzID0gJmNwaS0+YWx0X3JlZl9idWZmZXI7Ci0KLSAgICAgICAgICAgICAgICAvLyBGV0cgbm90IHN1cmUgaWYgSSBuZWVkIHRvIGNvcHkgdGhpcyBkYXRhIGZvciB0aGUgQWx0IFJlZiBmcmFtZQotICAgICAgICAgICAgICAgIHMtPnNvdXJjZV90aW1lX3N0YW1wID0gY3BpLT5zcmNfYnVmZmVyW2NwaS0+bGFzdF9hbHRfcmVmX3NlaV0uc291cmNlX3RpbWVfc3RhbXA7Ci0gICAgICAgICAgICAgICAgcy0+c291cmNlX2VuZF90aW1lX3N0YW1wID0gY3BpLT5zcmNfYnVmZmVyW2NwaS0+bGFzdF9hbHRfcmVmX3NlaV0uc291cmNlX2VuZF90aW1lX3N0YW1wOwotICAgICAgICAgICAgICAgIHMtPnNvdXJjZV9mcmFtZV9mbGFncyA9IGNwaS0+c3JjX2J1ZmZlcltjcGktPmxhc3RfYWx0X3JlZl9zZWldLnNvdXJjZV9mcmFtZV9mbGFnczsKLQotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICBzID0gJmNwaS0+c3JjX2J1ZmZlcltjcGktPmxhc3RfYWx0X3JlZl9zZWldOwotCi0gICAgICAgICAgICBjbS0+ZnJhbWVzX3RpbGxfYWx0X3JlZl9mcmFtZSA9IGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZTsKLSAgICAgICAgICAgIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSAxOwotICAgICAgICAgICAgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gMDsKLSAgICAgICAgICAgIGNtLT5yZWZyZXNoX2xhc3RfZnJhbWUgPSAwOwotICAgICAgICAgICAgY20tPnNob3dfZnJhbWUgPSAwOwotICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gRkFMU0U7ICAgLy8gQ2xlYXIgUGVuZGluZyBhbHRmIFJlZiBmbGFnLgotICAgICAgICAgICAgY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiA9IDA7Ci0gICAgICAgICAgICBjcGktPmlzX25leHRfc3JjX2FsdF9yZWYgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICBjbS0+c2hvd19mcmFtZSA9IDE7Ci0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLQotICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5hbGxvd19sYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNwaS0+c291cmNlX2VuY29kZV9pbmRleCA9PSAgY3BpLT5sYXN0X2FsdF9yZWZfc2VpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+bGFzdF9hbHRfcmVmX3NlaSAgICA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgPSAwOwotCi0gICAgICAgICAgICAgICAgY3BpLT5zb3VyY2VfZW5jb2RlX2luZGV4ID0gKGNwaS0+c291cmNlX2VuY29kZV9pbmRleCArIDEpICUgY3BpLT5veGNmLmxhZ19pbl9mcmFtZXM7Ci0KLSAgICAgICAgICAgICAgICBpZihjcGktPnNvdXJjZV9lbmNvZGVfaW5kZXggPT0gY3BpLT5sYXN0X2FsdF9yZWZfc2VpKQotICAgICAgICAgICAgICAgICAgICBjcGktPmlzX25leHRfc3JjX2FsdF9yZWYgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5pc19uZXh0X3NyY19hbHRfcmVmID0gMDsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0gICAgICAgICAgICBjcGktPnNvdXJjZV9idWZmZXJfY291bnQtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGNwaS0+dW5fc2NhbGVkX3NvdXJjZSA9ICZzLT5zb3VyY2VfYnVmZmVyOwotICAgICAgICBjcGktPlNvdXJjZSA9ICZzLT5zb3VyY2VfYnVmZmVyOwotICAgICAgICBjcGktPnNvdXJjZV9mcmFtZV9mbGFncyA9IHMtPnNvdXJjZV9mcmFtZV9mbGFnczsKLQotICAgICAgICAqdGltZV9zdGFtcCA9IGNwaS0+c291cmNlX3RpbWVfc3RhbXA7Ci0gICAgICAgICp0aW1lX2VuZCA9IGNwaS0+c291cmNlX2VuZF90aW1lX3N0YW1wOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqc2l6ZSA9IDA7Ci0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLQotICAgICAgICBpZiAoZmx1c2ggJiYgY3BpLT5wYXNzID09IDEgJiYgIWNwaS0+Zmlyc3RfcGFzc19kb25lKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfZW5kX2ZpcnN0X3Bhc3MoY3BpKTsgICAgLyogZ2V0IGxhc3Qgc3RhdHMgcGFja2V0ICovCi0gICAgICAgICAgICBjcGktPmZpcnN0X3Bhc3NfZG9uZSA9IDE7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSNpZiBIQVZFX0FSTVY3Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgICAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICB2cDhfcG9wX25lb24oc3RvcmVfcmVnKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAqZnJhbWVfZmxhZ3MgPSBjcGktPnNvdXJjZV9mcmFtZV9mbGFnczsKLQotICAgIGlmIChjcGktPnNvdXJjZV90aW1lX3N0YW1wIDwgY3BpLT5maXJzdF90aW1lX3N0YW1wX2V2ZXIpCi0gICAgewotICAgICAgICBjcGktPmZpcnN0X3RpbWVfc3RhbXBfZXZlciA9IGNwaS0+c291cmNlX3RpbWVfc3RhbXA7Ci0gICAgICAgIGNwaS0+bGFzdF9lbmRfdGltZV9zdGFtcF9zZWVuID0gY3BpLT5zb3VyY2VfdGltZV9zdGFtcDsKLSAgICB9Ci0KLSAgICAvLyBhZGp1c3QgZnJhbWUgcmF0ZXMgYmFzZWQgb24gdGltZXN0YW1wcyBnaXZlbgotICAgIGlmICghY20tPnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPnNvdXJjZV90aW1lX3N0YW1wID09IGNwaS0+Zmlyc3RfdGltZV9zdGFtcF9ldmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgdGhpc19mcHMgPSAxMDAwMDAwMC4wMDAgLyAoY3BpLT5zb3VyY2VfZW5kX3RpbWVfc3RhbXAgLSBjcGktPnNvdXJjZV90aW1lX3N0YW1wKTsKLQotICAgICAgICAgICAgdnA4X25ld19mcmFtZV9yYXRlKGNwaSwgdGhpc19mcHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBsb25nIG5hbm9zZWNzID0gY3BpLT5zb3VyY2VfZW5kX3RpbWVfc3RhbXAKLSAgICAgICAgICAgICAgICAtIGNwaS0+bGFzdF9lbmRfdGltZV9zdGFtcF9zZWVuOwotCi0gICAgICAgICAgICBpZiAobmFub3NlY3MgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb3VibGUgdGhpc19mcHMgPSAxMDAwMDAwMC4wMDAgLyBuYW5vc2VjczsKLSAgICAgICAgICAgICAgdnA4X25ld19mcmFtZV9yYXRlKGNwaSwgKDcgKiBjcGktPm94Y2YuZnJhbWVfcmF0ZSArIHRoaXNfZnBzKSAvIDgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBjcGktPmxhc3RfdGltZV9zdGFtcF9zZWVuID0gY3BpLT5zb3VyY2VfdGltZV9zdGFtcDsKLSAgICAgICAgY3BpLT5sYXN0X2VuZF90aW1lX3N0YW1wX3NlZW4gPSBjcGktPnNvdXJjZV9lbmRfdGltZV9zdGFtcDsKLSAgICB9Ci0KLSAgICBpZiAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDIpCi0gICAgewotICAgICAgICBjaGVja19nZl9xdWFsaXR5KGNwaSk7Ci0gICAgICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0c2N0aW1lcik7Ci0gICAgICAgIHZweF91c2VjX3RpbWVyX3N0YXJ0KCZ0aWNrdGltZXIpOwotICAgIH0KLQotICAgIC8vIHN0YXJ0IHdpdGggYSAwIHNpemUgZnJhbWUKLSAgICAqc2l6ZSA9IDA7Ci0KLSAgICAvLyBDbGVhciBkb3duIG1teCByZWdpc3RlcnMKLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7ICAvL19fYXNtIGVtbXM7Ci0KLSAgICBjbS0+ZnJhbWVfdHlwZSA9IElOVEVSX0ZSQU1FOwotICAgIGNtLT5mcmFtZV9mbGFncyA9ICpmcmFtZV9mbGFnczsKLQotI2lmIDAKLQotICAgIGlmIChjbS0+cmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQotICAgIHsKLSAgICAgICAgLy9jbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAxOwotICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOwotICAgICAgICBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gMDsKLSAgICAgICAgY20tPnJlZnJlc2hfbGFzdF9mcmFtZSA9IDE7Ci0gICAgfQotCi0jZW5kaWYKLQotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0KLSAgICBpZiAoY3BpLT5wYXNzID09IDEpCi0gICAgewotICAgICAgICBQYXNzMUVuY29kZShjcGksIHNpemUsIGRlc3QsIGZyYW1lX2ZsYWdzKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3BpLT5wYXNzID09IDIpCi0gICAgewotICAgICAgICBQYXNzMkVuY29kZShjcGksIHNpemUsIGRlc3QsIGZyYW1lX2ZsYWdzKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGVuY29kZV9mcmFtZV90b19kYXRhX3JhdGUoY3BpLCBzaXplLCBkZXN0LCBmcmFtZV9mbGFncyk7Ci0KLSAgICBpZiAoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDIpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgZHVyYXRpb24sIGR1cmF0aW9uMjsKLSAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdHNjdGltZXIpOwotICAgICAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZ0aWNrdGltZXIpOwotCi0gICAgICAgIGR1cmF0aW9uID0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmdGlja3RpbWVyKTsKLSAgICAgICAgZHVyYXRpb24yID0gKHVuc2lnbmVkIGludCkoKGRvdWJsZSlkdXJhdGlvbiAvIDIpOwotCi0gICAgICAgIGlmIChjbS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjcGktPmF2Z19lbmNvZGVfdGltZSA9PSAwKQotICAgICAgICAgICAgICAgIGNwaS0+YXZnX2VuY29kZV90aW1lID0gZHVyYXRpb247Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3BpLT5hdmdfZW5jb2RlX3RpbWUgPSAoNyAqIGNwaS0+YXZnX2VuY29kZV90aW1lICsgZHVyYXRpb24pID4+IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVyYXRpb24yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2lmKCpmcmFtZV9mbGFncyE9MSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPmF2Z19waWNrX21vZGVfdGltZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjcGktPmF2Z19waWNrX21vZGVfdGltZSA9IGR1cmF0aW9uMjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lID0gKDcgKiBjcGktPmF2Z19waWNrX21vZGVfdGltZSArIGR1cmF0aW9uMikgPj4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgaWYgKGNtLT5yZWZyZXNoX2VudHJvcHlfcHJvYnMgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZweF9tZW1jcHkoJmNtLT5mYywgJmNtLT5sZmMsIHNpemVvZihjbS0+ZmMpKTsKLSAgICB9Ci0KLSAgICAvLyBpZiBpdHMgYSBkcm9wcGVkIGZyYW1lIGhvbm9yIHRoZSByZXF1ZXN0cyBvbiBzdWJzZXF1ZW50IGZyYW1lcwotICAgIGlmICgqc2l6ZSA+IDApCi0gICAgewotCi0gICAgICAgIC8vIHJldHVybiB0byBub3JtYWwgc3RhdGUKLSAgICAgICAgY20tPnJlZnJlc2hfZW50cm9weV9wcm9icyA9IDE7Ci0gICAgICAgIGNtLT5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSAwOwotICAgICAgICBjbS0+cmVmcmVzaF9nb2xkZW5fZnJhbWUgPSAwOwotICAgICAgICBjbS0+cmVmcmVzaF9sYXN0X2ZyYW1lID0gMTsKLSAgICAgICAgY20tPmZyYW1lX3R5cGUgPSBJTlRFUl9GUkFNRTsKLQotICAgIH0KLQotICAgIGNwaS0+cmVhZHlfZm9yX25ld19mcmFtZSA9IDE7Ci0KLSAgICB2cHhfdXNlY190aW1lcl9tYXJrKCZjbXB0aW1lcik7Ci0gICAgY3BpLT50aW1lX2NvbXByZXNzX2RhdGEgKz0gdnB4X3VzZWNfdGltZXJfZWxhcHNlZCgmY21wdGltZXIpOwotCi0gICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfcHNuciAmJiBjcGktPnBhc3MgIT0gMSAmJiBjbS0+c2hvd19mcmFtZSkKLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlX3BzbnJfcGFja2V0KGNwaSk7Ci0gICAgfQotCi0jaWYgQ09ORklHX1BTTlIKLQotICAgIGlmIChjcGktPnBhc3MgIT0gMSkKLSAgICB7Ci0gICAgICAgIGNwaS0+Ynl0ZXMgKz0gKnNpemU7Ci0KLSAgICAgICAgaWYgKGNtLT5zaG93X2ZyYW1lKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGNwaS0+Y291bnQgKys7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmJfY2FsY3VsYXRlX3BzbnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHksIHUsIHY7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHllLHVlLHZlOwotICAgICAgICAgICAgICAgIGRvdWJsZSBmcmFtZV9wc25yOwotICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgICAgICpvcmlnID0gY3BpLT5Tb3VyY2U7Ci0gICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAgICAgKnJlY29uID0gY3BpLT5jb21tb24uZnJhbWVfdG9fc2hvdzsKLSAgICAgICAgICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgICAgICAqcHAgPSAmY20tPnBvc3RfcHJvY19idWZmZXI7Ci0gICAgICAgICAgICAgICAgaW50IHlfc2FtcGxlcyA9IG9yaWctPnlfaGVpZ2h0ICogb3JpZy0+eV93aWR0aCA7Ci0gICAgICAgICAgICAgICAgaW50IHV2X3NhbXBsZXMgPSBvcmlnLT51dl9oZWlnaHQgKiBvcmlnLT51dl93aWR0aCA7Ci0gICAgICAgICAgICAgICAgaW50IHRfc2FtcGxlcyA9IHlfc2FtcGxlcyArIDIgKiB1dl9zYW1wbGVzOwotICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBzcV9lcnJvcjsKLQotICAgICAgICAgICAgICAgIHllID0gY2FsY19wbGFuZV9lcnJvcihvcmlnLT55X2J1ZmZlciwgb3JpZy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICByZWNvbi0+eV9idWZmZXIsIHJlY29uLT55X3N0cmlkZSwgb3JpZy0+eV93aWR0aCwgb3JpZy0+eV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotICAgICAgICAgICAgICAgIHVlID0gY2FsY19wbGFuZV9lcnJvcihvcmlnLT51X2J1ZmZlciwgb3JpZy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgcmVjb24tPnVfYnVmZmVyLCByZWNvbi0+dXZfc3RyaWRlLCBvcmlnLT51dl93aWR0aCwgb3JpZy0+dXZfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgSUZfUlRDRCgmY3BpLT5ydGNkLnZhcmlhbmNlKSk7Ci0KLSAgICAgICAgICAgICAgICB2ZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+dl9idWZmZXIsIG9yaWctPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgIHJlY29uLT52X2J1ZmZlciwgcmVjb24tPnV2X3N0cmlkZSwgb3JpZy0+dXZfd2lkdGgsIG9yaWctPnV2X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotCi0gICAgICAgICAgICAgICAgc3FfZXJyb3IgPSB5ZSArIHVlICsgdmU7Ci0KLSAgICAgICAgICAgICAgICBmcmFtZV9wc25yID0gdnA4X21zZTJwc25yKHRfc2FtcGxlcywgMjU1LjAsIHNxX2Vycm9yKTsKLQotICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfeSArPSB2cDhfbXNlMnBzbnIoeV9zYW1wbGVzLCAyNTUuMCwgeWUpOwotICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfdSArPSB2cDhfbXNlMnBzbnIodXZfc2FtcGxlcywgMjU1LjAsIHVlKTsKLSAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3YgKz0gdnA4X21zZTJwc25yKHV2X3NhbXBsZXMsIDI1NS4wLCB2ZSk7Ci0gICAgICAgICAgICAgICAgY3BpLT50b3RhbF9zcV9lcnJvciArPSBzcV9lcnJvcjsKLSAgICAgICAgICAgICAgICBjcGktPnRvdGFsICArPSBmcmFtZV9wc25yOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkyLCB1MiwgdjIsIGZyYW1lX3BzbnIyLCBmcmFtZV9zc2ltMiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3ZWlnaHQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHZwOF9kZWJsb2NrKGNtLT5mcmFtZV90b19zaG93LCAmY20tPnBvc3RfcHJvY19idWZmZXIsIGNtLT5maWx0ZXJfbGV2ZWwgKiAxMCAvIDYsIDEsIDAsIElGX1JUQ0QoJmNtLT5ydGNkLnBvc3Rwcm9jKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICB5ZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+eV9idWZmZXIsIG9yaWctPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIHBwLT55X2J1ZmZlciwgcHAtPnlfc3RyaWRlLCBvcmlnLT55X3dpZHRoLCBvcmlnLT55X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICB1ZSA9IGNhbGNfcGxhbmVfZXJyb3Iob3JpZy0+dV9idWZmZXIsIG9yaWctPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBwcC0+dV9idWZmZXIsIHBwLT51dl9zdHJpZGUsIG9yaWctPnV2X3dpZHRoLCBvcmlnLT51dl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgSUZfUlRDRCgmY3BpLT5ydGNkLnZhcmlhbmNlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdmUgPSBjYWxjX3BsYW5lX2Vycm9yKG9yaWctPnZfYnVmZmVyLCBvcmlnLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgcHAtPnZfYnVmZmVyLCBwcC0+dXZfc3RyaWRlLCBvcmlnLT51dl93aWR0aCwgb3JpZy0+dXZfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIHNxX2Vycm9yID0geWUgKyB1ZSArIHZlOwotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lX3BzbnIyID0gdnA4X21zZTJwc25yKHRfc2FtcGxlcywgMjU1LjAsIHNxX2Vycm9yKTsKLQotICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFscF95ICs9IHZwOF9tc2UycHNucih5X3NhbXBsZXMsIDI1NS4wLCB5ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxwX3UgKz0gdnA4X21zZTJwc25yKHV2X3NhbXBsZXMsIDI1NS4wLCB1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxwX3YgKz0gdnA4X21zZTJwc25yKHV2X3NhbXBsZXMsIDI1NS4wLCB2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+dG90YWxfc3FfZXJyb3IyICs9IHNxX2Vycm9yOwotICAgICAgICAgICAgICAgICAgICBjcGktPnRvdGFscCAgKz0gZnJhbWVfcHNucjI7Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWVfc3NpbTIgPSB2cDhfY2FsY19zc2ltKGNwaS0+U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICZjbS0+cG9zdF9wcm9jX2J1ZmZlciwgMSwgJndlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICBjcGktPnN1bW1lZF9xdWFsaXR5ICs9IGZyYW1lX3NzaW0yICogd2VpZ2h0OwotICAgICAgICAgICAgICAgICAgICBjcGktPnN1bW1lZF93ZWlnaHRzICs9IHdlaWdodDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNwaS0+Yl9jYWxjdWxhdGVfc3NpbWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHksIHUsIHYsIGZyYW1lX2FsbDsKLSAgICAgICAgICAgICAgICBmcmFtZV9hbGwgPSAgdnA4X2NhbGNfc3NpbWcoY3BpLT5Tb3VyY2UsIGNtLT5mcmFtZV90b19zaG93LCAmeSwgJnUsICZ2KTsKLSAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3kgKz0geTsKLSAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3UgKz0gdTsKLSAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX3YgKz0gdjsKLSAgICAgICAgICAgICAgICBjcGktPnRvdGFsX3NzaW1nX2FsbCArPSBmcmFtZV9hbGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotI2lmIDAKLQotICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IDAgJiYgY3BpLT5jb21tb24uYmFzZV9xaW5kZXggPT0gY3BpLT5veGNmLndvcnN0X2FsbG93ZWRfcSkKLSAgICB7Ci0gICAgICAgIHNraXB0cnVlY291bnQgKz0gY3BpLT5za2lwX3RydWVfY291bnQ7Ci0gICAgICAgIHNraXBmYWxzZWNvdW50ICs9IGNwaS0+c2tpcF9mYWxzZV9jb3VudDsKLSAgICB9Ci0KLSNlbmRpZgotI2lmIDAKLQotICAgIGlmIChjcGktPnBhc3MgIT0gMSkKLSAgICB7Ci0gICAgICAgIEZJTEUgKmYgPSBmb3Blbigic2tpcC5zdHQiLCAiYSIpOwotICAgICAgICBmcHJpbnRmKGYsICJmcmFtZTolNGQgZmxhZ3M6JTR4IFE6JTRkIFA6JTRkIFNpemU6JTVkXG4iLCBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCAqZnJhbWVfZmxhZ3MsIGNwaS0+Y29tbW9uLmJhc2VfcWluZGV4LCBjcGktPnByb2Jfc2tpcF9mYWxzZSwgKnNpemUpOwotCi0gICAgICAgIGlmIChjcGktPmlzX3NyY19mcmFtZV9hbHRfcmVmID09IDEpCi0gICAgICAgICAgICBmcHJpbnRmKGYsICJza2lwY291bnQ6ICU0ZCBmcmFtZXNpemU6ICVkXG4iLCBjcGktPnNraXBfdHJ1ZV9jb3VudCAsICpzaXplKTsKLQotICAgICAgICBmY2xvc2UoZik7Ci0gICAgfQotCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgIHsKLSAgICAgICAgdnA4X3BvcF9uZW9uKHN0b3JlX3JlZyk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHZwOF9nZXRfcHJldmlld19yYXdfZnJhbWUoVlA4X1BUUiBjb21wLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsIHZwOF9wcGZsYWdzX3QgKmZsYWdzKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikgY29tcDsKLQotICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgcmV0OwotI2lmIENPTkZJR19QT1NUUFJPQwotICAgICAgICByZXQgPSB2cDhfcG9zdF9wcm9jX2ZyYW1lKCZjcGktPmNvbW1vbiwgZGVzdCwgZmxhZ3MpOwotI2Vsc2UKLQotICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdG9fc2hvdykKLSAgICAgICAgewotICAgICAgICAgICAgKmRlc3QgPSAqY3BpLT5jb21tb24uZnJhbWVfdG9fc2hvdzsKLSAgICAgICAgICAgIGRlc3QtPnlfd2lkdGggPSBjcGktPmNvbW1vbi5XaWR0aDsKLSAgICAgICAgICAgIGRlc3QtPnlfaGVpZ2h0ID0gY3BpLT5jb21tb24uSGVpZ2h0OwotICAgICAgICAgICAgZGVzdC0+dXZfaGVpZ2h0ID0gY3BpLT5jb21tb24uSGVpZ2h0IC8gMjsKLSAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgfQotCi0jZW5kaWYgLy8hQ09ORklHX1BPU1RQUk9DCi0gICAgICAgIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19Ci0KLWludCB2cDhfc2V0X3JvaW1hcChWUDhfUFRSIGNvbXAsIHVuc2lnbmVkIGNoYXIgKm1hcCwgdW5zaWduZWQgaW50IHJvd3MsIHVuc2lnbmVkIGludCBjb2xzLCBpbnQgZGVsdGFfcVs0XSwgaW50IGRlbHRhX2xmWzRdLCB1bnNpZ25lZCBpbnQgdGhyZXNob2xkWzRdKQotewotICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKikgY29tcDsKLSAgICBzaWduZWQgY2hhciBmZWF0dXJlX2RhdGFbTUJfTFZMX01BWF1bTUFYX01CX1NFR01FTlRTXTsKLQotICAgIGlmIChjcGktPmNvbW1vbi5tYl9yb3dzICE9IHJvd3MgfHwgY3BpLT5jb21tb24ubWJfY29scyAhPSBjb2xzKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoIW1hcCkKLSAgICB7Ci0gICAgICAgIGRpc2FibGVfc2VnbWVudGF0aW9uKChWUDhfUFRSKWNwaSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgc2VnbWVudGF0aW9uIE1hcAotICAgIHNldF9zZWdtZW50YXRpb25fbWFwKChWUDhfUFRSKWNwaSwgbWFwKTsKLQotICAgIC8vIEFjdGl2YXRlIHNlZ21lbnRhdGlvbi4KLSAgICBlbmFibGVfc2VnbWVudGF0aW9uKChWUDhfUFRSKWNwaSk7Ci0KLSAgICAvLyBTZXQgdXAgdGhlIHF1YW50IHNlZ21lbnQgZGF0YQotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzBdID0gZGVsdGFfcVswXTsKLSAgICBmZWF0dXJlX2RhdGFbTUJfTFZMX0FMVF9RXVsxXSA9IGRlbHRhX3FbMV07Ci0gICAgZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfUV1bMl0gPSBkZWx0YV9xWzJdOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX1FdWzNdID0gZGVsdGFfcVszXTsKLQotICAgIC8vIFNldCB1cCB0aGUgbG9vcCBzZWdtZW50IGRhdGEgcwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVswXSA9IGRlbHRhX2xmWzBdOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsxXSA9IGRlbHRhX2xmWzFdOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsyXSA9IGRlbHRhX2xmWzJdOwotICAgIGZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVszXSA9IGRlbHRhX2xmWzNdOwotCi0gICAgY3BpLT5zZWdtZW50X2VuY29kZV9icmVha291dFswXSA9IHRocmVzaG9sZFswXTsKLSAgICBjcGktPnNlZ21lbnRfZW5jb2RlX2JyZWFrb3V0WzFdID0gdGhyZXNob2xkWzFdOwotICAgIGNwaS0+c2VnbWVudF9lbmNvZGVfYnJlYWtvdXRbMl0gPSB0aHJlc2hvbGRbMl07Ci0gICAgY3BpLT5zZWdtZW50X2VuY29kZV9icmVha291dFszXSA9IHRocmVzaG9sZFszXTsKLQotICAgIC8vIEluaXRpYWxpc2UgdGhlIGZlYXR1cmUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAvLyBTRUdNRU5UX0RFTFRBREFUQSAgICAwLCBTRUdNRU5UX0FCU0RBVEEgICAgICAxCi0gICAgc2V0X3NlZ21lbnRfZGF0YSgoVlA4X1BUUiljcGksICZmZWF0dXJlX2RhdGFbMF1bMF0sIFNFR01FTlRfREVMVEFEQVRBKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgdnA4X3NldF9hY3RpdmVfbWFwKFZQOF9QVFIgY29tcCwgdW5zaWduZWQgY2hhciAqbWFwLCB1bnNpZ25lZCBpbnQgcm93cywgdW5zaWduZWQgaW50IGNvbHMpCi17Ci0gICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKSBjb21wOwotCi0gICAgaWYgKHJvd3MgPT0gY3BpLT5jb21tb24ubWJfcm93cyAmJiBjb2xzID09IGNwaS0+Y29tbW9uLm1iX2NvbHMpCi0gICAgewotICAgICAgICBpZiAobWFwKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KGNwaS0+YWN0aXZlX21hcCwgbWFwLCByb3dzICogY29scyk7Ci0gICAgICAgICAgICBjcGktPmFjdGl2ZV9tYXBfZW5hYmxlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3BpLT5hY3RpdmVfbWFwX2VuYWJsZWQgPSAwOwotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvL2NwaS0+YWN0aXZlX21hcF9lbmFibGVkID0gMDsKLSAgICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci19Ci0KLWludCB2cDhfc2V0X2ludGVybmFsX3NpemUoVlA4X1BUUiBjb21wLCBWUFhfU0NBTElORyBob3Jpel9tb2RlLCBWUFhfU0NBTElORyB2ZXJ0X21vZGUpCi17Ci0gICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKSBjb21wOwotCi0gICAgaWYgKGhvcml6X21vZGUgPD0gT05FVFdPKQotICAgICAgICBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSA9IGhvcml6X21vZGU7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAodmVydF9tb2RlIDw9IE9ORVRXTykKLSAgICAgICAgY3BpLT5jb21tb24udmVydF9zY2FsZSAgPSB2ZXJ0X21vZGU7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLWludCB2cDhfY2FsY19zc19lcnIoWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZGVzdCwgY29uc3QgdnA4X3ZhcmlhbmNlX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IFRvdGFsID0gMDsKLQotICAgIHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZS0+eV9idWZmZXI7Ci0gICAgdW5zaWduZWQgY2hhciAqZHN0ID0gZGVzdC0+eV9idWZmZXI7Ci0gICAgKHZvaWQpcnRjZDsKLQotICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgWSBwbGFuZSByYXcgYW5kIHJlY29uc3RydWN0aW9uIGRhdGEgc3VtbWluZyAoc3F1YXJlIGRpZmZlcmVuY2VzKQotICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2UtPnlfaGVpZ2h0OyBpICs9IDE2KQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHNvdXJjZS0+eV93aWR0aDsgaiArPSAxNikKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHNzZTsKLSAgICAgICAgICAgIFRvdGFsICs9IFZBUklBTkNFX0lOVk9LRShydGNkLCBtc2UxNngxNikoc3JjICsgaiwgc291cmNlLT55X3N0cmlkZSwgZHN0ICsgaiwgZGVzdC0+eV9zdHJpZGUsICZzc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IDE2ICogc291cmNlLT55X3N0cmlkZTsKLSAgICAgICAgZHN0ICs9IDE2ICogZGVzdC0+eV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRvdGFsOwotfQotCi0KLXN0YXRpYyBpbnQgY2FsY19sb3dfc3NfZXJyKFlWMTJfQlVGRkVSX0NPTkZJRyAqc291cmNlLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsIGNvbnN0IHZwOF92YXJpYW5jZV9ydGNkX3Z0YWJsZV90ICpydGNkKQotewotICAgIGludCBpLCBqOwotICAgIGludCBUb3RhbCA9IDA7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2UtPnlfYnVmZmVyOwotICAgIHVuc2lnbmVkIGNoYXIgKmRzdCA9IGRlc3QtPnlfYnVmZmVyOwotICAgICh2b2lkKXJ0Y2Q7Ci0KLSAgICAvLyBMb29wIHRocm91Z2ggdGhlIFkgcGxhbmUgcmF3IGFuZCByZWNvbnN0cnVjdGlvbiBkYXRhIHN1bW1pbmcgKHNxdWFyZSBkaWZmZXJlbmNlcykKLSAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlLT55X2hlaWdodDsgaSArPSAxNikKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBzb3VyY2UtPnlfd2lkdGg7IGogKz0gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBzc2U7Ci0gICAgICAgICAgICBWQVJJQU5DRV9JTlZPS0UocnRjZCwgbXNlMTZ4MTYpKHNyYyArIGosIHNvdXJjZS0+eV9zdHJpZGUsIGRzdCArIGosIGRlc3QtPnlfc3RyaWRlLCAmc3NlKTsKLQotICAgICAgICAgICAgaWYgKHNzZSA8IDgwOTYpCi0gICAgICAgICAgICAgICAgVG90YWwgKz0gc3NlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IDE2ICogc291cmNlLT55X3N0cmlkZTsKLSAgICAgICAgZHN0ICs9IDE2ICogZGVzdC0+eV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRvdGFsOwotfQotCi0KLWludCB2cDhfZ2V0X3F1YW50aXplcihWUDhfUFRSIGMpCi17Ci0gICAgVlA4X0NPTVAgICAqY3BpID0gKFZQOF9DT01QICopIGM7Ci0gICAgcmV0dXJuIGNwaS0+Y29tbW9uLmJhc2VfcWluZGV4OwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvb255eF9pbnQuaCBiL3ZwOC9lbmNvZGVyL29ueXhfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTNmNjguLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvb255eF9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxNyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19WUDhfSU5UX0gKLSNkZWZpbmUgX19JTkNfVlA4X0lOVF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXguaCIKLSNpbmNsdWRlICJ0cmVld3JpdGVyLmgiCi0jaW5jbHVkZSAidG9rZW5pemUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhjX2ludC5oIgotI2luY2x1ZGUgInZhcmlhbmNlLmgiCi0jaW5jbHVkZSAiZGN0LmgiCi0jaW5jbHVkZSAiZW5jb2RlbWIuaCIKLSNpbmNsdWRlICJxdWFudGl6ZS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vdGhyZWFkaW5nLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgotI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJtY29tcC5oIgotI2luY2x1ZGUgInRlbXBvcmFsX2ZpbHRlci5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZmluZG5lYXJtdi5oIgotCi0vLyNkZWZpbmUgU1BFRURTVEFUUyAxCi0jZGVmaW5lIE1JTl9HRl9JTlRFUlZBTCAgICAgICAgICAgICA0Ci0jZGVmaW5lIERFRkFVTFRfR0ZfSU5URVJWQUwgICAgICAgICA3Ci0KLSNkZWZpbmUgS0VZX0ZSQU1FX0NPTlRFWFQgNQotCi0jZGVmaW5lIE1BWF9MQUdfQlVGRkVSUyAoQ09ORklHX1JFQUxUSU1FX09OTFk/IDEgOiAyNSkKLQotI2RlZmluZSBBRl9USFJFU0ggICAyNQotI2RlZmluZSBBRl9USFJFU0gyICAxMDAKLSNkZWZpbmUgQVJGX0RFQ0FZX1RIUkVTSCAxMgotI2RlZmluZSBNQVhfTU9ERVMgMjAKLQotI2RlZmluZSBNSU5fVEhSRVNITVVMVCAgMzIKLSNkZWZpbmUgTUFYX1RIUkVTSE1VTFQgIDUxMgotCi0jZGVmaW5lIEdGX1pFUk9NVl9aQklOX0JPT1NUIDI0Ci0jZGVmaW5lIExGX1pFUk9NVl9aQklOX0JPT1NUIDEyCi0jZGVmaW5lIE1WX1pCSU5fQk9PU1QgICAgICAgIDQKLSNkZWZpbmUgWkJJTl9PUV9NQVggMTkyCi0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotI2RlZmluZSBWUDhfVEVNUE9SQUxfQUxUX1JFRiAxCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBpbnQga2ZfaW5kaWNhdGVkOwotICAgIHVuc2lnbmVkIGludCBmcmFtZXNfc2luY2Vfa2V5OwotICAgIHVuc2lnbmVkIGludCBmcmFtZXNfc2luY2VfZ29sZGVuOwotICAgIGludCBmaWx0ZXJfbGV2ZWw7Ci0gICAgaW50IGZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7Ci0gICAgaW50IHJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbTUFYX1JFRl9GUkFNRVNdOwotCi0gICAgTVZfQ09OVEVYVCBtdmNbMl07Ci0gICAgaW50IG12Y29zdHNbMl1bTVZ2YWxzKzFdOwotCi0jaWZkZWYgTU9ERV9TVEFUUwotICAgIC8vIFN0YXRzCi0gICAgaW50IHlfbW9kZXNbNV07Ci0gICAgaW50IHV2X21vZGVzWzRdOwotICAgIGludCBiX21vZGVzWzEwXTsKLSAgICBpbnQgaW50ZXJfeV9tb2Rlc1sxMF07Ci0gICAgaW50IGludGVyX3V2X21vZGVzWzRdOwotICAgIGludCBpbnRlcl9iX21vZGVzWzEwXTsKLSNlbmRpZgotCi0gICAgdnA4X3Byb2IgeW1vZGVfcHJvYls0XSwgdXZfbW9kZV9wcm9iWzNdOyAgIC8qIGludGVyZnJhbWUgaW50cmEgbW9kZSBwcm9icyAqLwotICAgIHZwOF9wcm9iIGtmX3ltb2RlX3Byb2JbNF0sIGtmX3V2X21vZGVfcHJvYlszXTsgICAvKiBrZXlmcmFtZSAiIiAqLwotCi0gICAgaW50IHltb2RlX2NvdW50WzVdLCB1dl9tb2RlX2NvdW50WzRdOyAgLyogaW50cmEgTUIgdHlwZSBjdHMgdGhpcyBmcmFtZSAqLwotCi0gICAgaW50IGNvdW50X21iX3JlZl9mcmFtZV91c2FnZVtNQVhfUkVGX0ZSQU1FU107Ci0KLSAgICBpbnQgdGhpc19mcmFtZV9wZXJjZW50X2ludHJhOwotICAgIGludCBsYXN0X2ZyYW1lX3BlcmNlbnRfaW50cmE7Ci0KLQotfSBDT0RJTkdfQ09OVEVYVDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBkb3VibGUgZnJhbWU7Ci0gICAgZG91YmxlIGludHJhX2Vycm9yOwotICAgIGRvdWJsZSBjb2RlZF9lcnJvcjsKLSAgICBkb3VibGUgc3NpbV93ZWlnaHRlZF9wcmVkX2VycjsKLSAgICBkb3VibGUgcGNudF9pbnRlcjsKLSAgICBkb3VibGUgcGNudF9tb3Rpb247Ci0gICAgZG91YmxlIHBjbnRfc2Vjb25kX3JlZjsKLSAgICBkb3VibGUgcGNudF9uZXV0cmFsOwotICAgIGRvdWJsZSBNVnI7Ci0gICAgZG91YmxlIG12cl9hYnM7Ci0gICAgZG91YmxlIE1WYzsKLSAgICBkb3VibGUgbXZjX2FiczsKLSAgICBkb3VibGUgTVZydjsKLSAgICBkb3VibGUgTVZjdjsKLSAgICBkb3VibGUgbXZfaW5fb3V0X2NvdW50OwotICAgIGRvdWJsZSBkdXJhdGlvbjsKLSAgICBkb3VibGUgY291bnQ7Ci19Ci1GSVJTVFBBU1NfU1RBVFM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IGZyYW1lc19zb19mYXI7Ci0gICAgZG91YmxlIGZyYW1lX2ludHJhX2Vycm9yOwotICAgIGRvdWJsZSBmcmFtZV9jb2RlZF9lcnJvcjsKLSAgICBkb3VibGUgZnJhbWVfcGNudF9pbnRlcjsKLSAgICBkb3VibGUgZnJhbWVfcGNudF9tb3Rpb247Ci0gICAgZG91YmxlIGZyYW1lX212cjsKLSAgICBkb3VibGUgZnJhbWVfbXZyX2FiczsKLSAgICBkb3VibGUgZnJhbWVfbXZjOwotICAgIGRvdWJsZSBmcmFtZV9tdmNfYWJzOwotCi19IE9ORVBBU1NfRlJBTUVTVEFUUzsKLQotCi10eXBlZGVmIGVudW0KLXsKLSAgICBUSFJfWkVST01WICAgICAgICAgPSAwLAotICAgIFRIUl9EQyAgICAgICAgICAgICA9IDEsCi0KLSAgICBUSFJfTkVBUkVTVE1WICAgICAgPSAyLAotICAgIFRIUl9ORUFSTVYgICAgICAgICA9IDMsCi0KLSAgICBUSFJfWkVST0cgICAgICAgICAgPSA0LAotICAgIFRIUl9ORUFSRVNURyAgICAgICA9IDUsCi0KLSAgICBUSFJfWkVST0EgICAgICAgICAgPSA2LAotICAgIFRIUl9ORUFSRVNUQSAgICAgICA9IDcsCi0KLSAgICBUSFJfTkVBUkcgICAgICAgICAgPSA4LAotICAgIFRIUl9ORUFSQSAgICAgICAgICA9IDksCi0KLSAgICBUSFJfVl9QUkVEICAgICAgICAgPSAxMCwKLSAgICBUSFJfSF9QUkVEICAgICAgICAgPSAxMSwKLSAgICBUSFJfVE0gICAgICAgICAgICAgPSAxMiwKLQotICAgIFRIUl9ORVdNViAgICAgICAgICA9IDEzLAotICAgIFRIUl9ORVdHICAgICAgICAgICA9IDE0LAotICAgIFRIUl9ORVdBICAgICAgICAgICA9IDE1LAotCi0gICAgVEhSX1NQTElUTVYgICAgICAgID0gMTYsCi0gICAgVEhSX1NQTElURyAgICAgICAgID0gMTcsCi0gICAgVEhSX1NQTElUQSAgICAgICAgID0gMTgsCi0KLSAgICBUSFJfQl9QUkVEICAgICAgICAgPSAxOSwKLX0KLVRIUl9NT0RFUzsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgRElBTU9ORCA9IDAsCi0gICAgTlNURVAgPSAxLAotICAgIEhFWCA9IDIKLX0gU0VBUkNIX01FVEhPRFM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IFJEOwotICAgIFNFQVJDSF9NRVRIT0RTIHNlYXJjaF9tZXRob2Q7Ci0gICAgaW50IGltcHJvdmVkX3F1YW50OwotICAgIGludCBpbXByb3ZlZF9kY3Q7Ci0gICAgaW50IGF1dG9fZmlsdGVyOwotICAgIGludCByZWNvZGVfbG9vcDsKLSAgICBpbnQgaXRlcmF0aXZlX3N1Yl9waXhlbDsKLSAgICBpbnQgaGFsZl9waXhlbF9zZWFyY2g7Ci0gICAgaW50IHF1YXJ0ZXJfcGl4ZWxfc2VhcmNoOwotICAgIGludCB0aHJlc2hfbXVsdFtNQVhfTU9ERVNdOwotICAgIGludCBmdWxsX2ZyZXFbMl07Ci0gICAgaW50IG1pbl9mc19yYWRpdXM7Ci0gICAgaW50IG1heF9mc19yYWRpdXM7Ci0gICAgaW50IG1heF9zdGVwX3NlYXJjaF9zdGVwczsKLSAgICBpbnQgZmlyc3Rfc3RlcDsKLSAgICBpbnQgb3B0aW1pemVfY29lZmZpY2llbnRzOwotCi0gICAgaW50IHVzZV9mYXN0cXVhbnRfZm9yX3BpY2s7Ci0gICAgaW50IG5vX3NraXBfYmxvY2s0eDRfc2VhcmNoOwotICAgIGludCBpbXByb3ZlZF9tdl9wcmVkOwotCi19IFNQRUVEX0ZFQVRVUkVTOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE1BQ1JPQkxPQ0sgIG1iOwotICAgIGludCBzZWdtZW50X2NvdW50c1tNQVhfTUJfU0VHTUVOVFNdOwotICAgIGludCB0b3RhbHJhdGU7Ci19IE1CX1JPV19DT01QOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIFRPS0VORVhUUkEgKnN0YXJ0OwotICAgIFRPS0VORVhUUkEgKnN0b3A7Ci19IFRPS0VOTElTVDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBpbnQgaXRocmVhZDsKLSAgICB2b2lkICpwdHIxOwotICAgIHZvaWQgKnB0cjI7Ci19IEVOQ09ERVRIUkVBRF9EQVRBOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBpbnQgaXRocmVhZDsKLSAgICB2b2lkICpwdHIxOwotfSBMUEZUSFJFQURfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBJTlQ2NCAgc291cmNlX3RpbWVfc3RhbXA7Ci0gICAgSU5UNjQgIHNvdXJjZV9lbmRfdGltZV9zdGFtcDsKLQotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgWVYxMl9CVUZGRVJfQ09ORklHLCBzb3VyY2VfYnVmZmVyKTsKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX2ZyYW1lX2ZsYWdzOwotfSBTT1VSQ0VfU0FNUExFOwotCi10eXBlZGVmIHN0cnVjdCBWUDhfRU5DT0RFUl9SVENECi17Ci0gICAgVlA4X0NPTU1PTl9SVENEICAgICAgICAgICAgKmNvbW1vbjsKLSAgICB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAgdmFyaWFuY2U7Ci0gICAgdnA4X2ZkY3RfcnRjZF92dGFibGVfdCAgICAgIGZkY3Q7Ci0gICAgdnA4X2VuY29kZW1iX3J0Y2RfdnRhYmxlX3QgIGVuY29kZW1iOwotICAgIHZwOF9xdWFudGl6ZV9ydGNkX3Z0YWJsZV90ICBxdWFudGl6ZTsKLSAgICB2cDhfc2VhcmNoX3J0Y2RfdnRhYmxlX3QgICAgc2VhcmNoOwotICAgIHZwOF90ZW1wb3JhbF9ydGNkX3Z0YWJsZV90ICB0ZW1wb3JhbDsKLX0gVlA4X0VOQ09ERVJfUlRDRDsKLQotZW51bQotewotICAgIEJMT0NLXzE2WDgsCi0gICAgQkxPQ0tfOFgxNiwKLSAgICBCTE9DS184WDgsCi0gICAgQkxPQ0tfNFg0LAotICAgIEJMT0NLXzE2WDE2LAotICAgIEJMT0NLX01BWF9TRUdNRU5UUwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkxcXVhbnRbUUlOREVYX1JBTkdFXVsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkxcXVhbnRfc2hpZnRbUUlOREVYX1JBTkdFXVsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkxemJpbltRSU5ERVhfUkFOR0VdWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgWTFyb3VuZFtRSU5ERVhfUkFOR0VdWzE2XSk7Ci0KLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMnF1YW50W1FJTkRFWF9SQU5HRV1bMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMnF1YW50X3NoaWZ0W1FJTkRFWF9SQU5HRV1bMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBZMnpiaW5bUUlOREVYX1JBTkdFXVsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkycm91bmRbUUlOREVYX1JBTkdFXVsxNl0pOwotCi0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgVVZxdWFudFtRSU5ERVhfUkFOR0VdWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgVVZxdWFudF9zaGlmdFtRSU5ERVhfUkFOR0VdWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgVVZ6YmluW1FJTkRFWF9SQU5HRV1bMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBVVnJvdW5kW1FJTkRFWF9SQU5HRV1bMTZdKTsKLQotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIHpydW5femJpbl9ib29zdF95MVtRSU5ERVhfUkFOR0VdWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgenJ1bl96YmluX2Jvb3N0X3kyW1FJTkRFWF9SQU5HRV1bMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCB6cnVuX3piaW5fYm9vc3RfdXZbUUlOREVYX1JBTkdFXVsxNl0pOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2hvcnQsIFkxcXVhbnRfZmFzdFtRSU5ERVhfUkFOR0VdWzE2XSk7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgWTJxdWFudF9mYXN0W1FJTkRFWF9SQU5HRV1bMTZdKTsKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBVVnF1YW50X2Zhc3RbUUlOREVYX1JBTkdFXVsxNl0pOwotCi0KLSAgICBNQUNST0JMT0NLIG1iOwotICAgIFZQOF9DT01NT04gY29tbW9uOwotICAgIHZwOF93cml0ZXIgYmMsIGJjMjsKLSAgICAvLyBib29sX3dyaXRlciAqYmMyOwotCi0gICAgVlA4X0NPTkZJRyBveGNmOwotCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpTb3VyY2U7Ci0gICAgWVYxMl9CVUZGRVJfQ09ORklHICp1bl9zY2FsZWRfc291cmNlOwotICAgIElOVDY0IHNvdXJjZV90aW1lX3N0YW1wOwotICAgIElOVDY0IHNvdXJjZV9lbmRfdGltZV9zdGFtcDsKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX2ZyYW1lX2ZsYWdzOwotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzY2FsZWRfc291cmNlOwotCi0gICAgaW50IHNvdXJjZV9idWZmZXJfY291bnQ7ICAgIC8vIG51bWJlciBvZiBzcmNfYnVmZmVycyBpbiB1c2UgZm9yIGxhZ2dlZCBlbmNvZGluZwotICAgIGludCBzb3VyY2VfZW5jb2RlX2luZGV4OyAgICAvLyBpbmRleCBvZiBidWZmZXIgaW4gc3JjX2J1ZmZlciB0byBlbmNvZGUKLSAgICBpbnQgc291cmNlX2FsdF9yZWZfcGVuZGluZzsgLy8gZnJhbWUgaW4gc3JjX2J1ZmZlcnMgaGFzIGJlZW4gaWRlbnRpZmllZCB0byBiZSBlbmNvZGVkIGFzIGFuIGFsdCByZWYKLSAgICBpbnQgc291cmNlX2FsdF9yZWZfYWN0aXZlOyAgLy8gYW4gYWx0IHJlZiBmcmFtZSBoYXMgYmVlbiBlbmNvZGVkIGFuZCBpcyB1c2FibGUKLQotICAgIGludCBsYXN0X2FsdF9yZWZfc2VpOyAgICAgICAvLyBpbmRleCBpbnRvIHNyY19idWZmZXJzIG9mIGZyYW1lIHVzZWQgYXMgYWx0IHJlZmVyZW5jZQotICAgIGludCBpc19zcmNfZnJhbWVfYWx0X3JlZjsgICAvLyBzb3VyY2Ugb2YgZnJhbWUgdG8gZW5jb2RlIGlzIGFuIGV4YWN0IGNvcHkgb2YgYW4gYWx0IHJlZiBmcmFtZQotICAgIGludCBpc19uZXh0X3NyY19hbHRfcmVmOyAgICAvLyBzb3VyY2Ugb2YgbmV4dCBmcmFtZSB0byBlbmNvZGUgaXMgYW4gZXhhY3QgY29weSBvZiBhbiBhbHQgcmVmIGZyYW1lCi0KLSAgICBpbnQgZ29sZF9pc19sYXN0OyAvLyBnb2xkZW4gZnJhbWUgc2FtZSBhcyBsYXN0IGZyYW1lICggc2hvcnQgY2lyY3VpdCBnb2xkIHNlYXJjaGVzKQotICAgIGludCBhbHRfaXNfbGFzdDsgIC8vIEFsdCByZWZlcmVuY2UgZnJhbWUgc2FtZSBhcyBsYXN0ICggc2hvcnQgY2lyY3VpdCBhbHRyZWYgc2VhcmNoKQotICAgIGludCBnb2xkX2lzX2FsdDsgIC8vIGRvbid0IGRvIGJvdGggYWx0IGFuZCBnb2xkIHNlYXJjaCAoIGp1c3QgZG8gZ29sZCkuCi0KLSAgICAvL2ludCByZWZyZXNoX2FsdF9yZWZfZnJhbWU7Ci0gICAgU09VUkNFX1NBTVBMRSBzcmNfYnVmZmVyW01BWF9MQUdfQlVGRkVSU107Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgbGFzdF9mcmFtZV91ZjsKLQotICAgIFRPS0VORVhUUkEgKnRvazsKLSAgICB1bnNpZ25lZCBpbnQgdG9rX2NvdW50OwotCi0KLSAgICB1bnNpZ25lZCBpbnQgZnJhbWVzX3NpbmNlX2tleTsKLSAgICB1bnNpZ25lZCBpbnQga2V5X2ZyYW1lX2ZyZXF1ZW5jeTsKLSAgICB1bnNpZ25lZCBpbnQgdGhpc19rZXlfZnJhbWVfZm9yY2VkOwotICAgIHVuc2lnbmVkIGludCBuZXh0X2tleV9mcmFtZV9mb3JjZWQ7Ci0KLSAgICAvLyBBbWJpZW50IHJlY29uc3RydWN0aW9uIGVyciB0YXJnZXQgZm9yIGZvcmNlIGtleSBmcmFtZXMKLSAgICBpbnQgYW1iaWVudF9lcnI7Ci0KLSAgICB1bnNpZ25lZCBpbnQgbW9kZV9jaGVja19mcmVxW01BWF9NT0RFU107Ci0gICAgdW5zaWduZWQgaW50IG1vZGVfdGVzdF9oaXRfY291bnRzW01BWF9NT0RFU107Ci0gICAgdW5zaWduZWQgaW50IG1vZGVfY2hvc2VuX2NvdW50c1tNQVhfTU9ERVNdOwotICAgIHVuc2lnbmVkIGludCBtYnNfdGVzdGVkX3NvX2ZhcjsKLQotICAgIHVuc2lnbmVkIGludCBjaGVja19mcmVxWzJdOwotICAgIHVuc2lnbmVkIGludCBkb19mdWxsWzJdOwotCi0gICAgaW50IHJkX3RocmVzaF9tdWx0W01BWF9NT0RFU107Ci0gICAgaW50IHJkX2Jhc2VsaW5lX3RocmVzaFtNQVhfTU9ERVNdOwotICAgIGludCByZF90aHJlc2hlc1tNQVhfTU9ERVNdOwotICAgIGludCBtdmNvc3RiYXNlOwotICAgIGludCBtdmNvc3RtdWx0aXBsaWVyOwotICAgIGludCBzdWJzZXFibG9ja3dlaWdodDsKLSAgICBpbnQgZXJydGhyZXNoOwotICAgIHVuc2lnbmVkIGludCBhY3Rpdml0eV9hdmc7Ci0KLSAgICBpbnQgUkRNVUxUOwotICAgIGludCBSRERJViA7Ci0KLSAgICBDT0RJTkdfQ09OVEVYVCBjb2RpbmdfY29udGV4dDsKLQotICAgIC8vIFJhdGUgdGFyZ2V0dGluZyB2YXJpYWJsZXMKLSAgICBsb25nIGxvbmcgcHJlZGljdGlvbl9lcnJvcjsKLSAgICBsb25nIGxvbmcgbGFzdF9wcmVkaWN0aW9uX2Vycm9yOwotICAgIGxvbmcgbG9uZyBpbnRyYV9lcnJvcjsKLSAgICBsb25nIGxvbmcgbGFzdF9pbnRyYV9lcnJvcjsKLQotI2lmIDAKLSAgICAvLyBFeHBlcmltZW50YWwgUkQgY29kZQotICAgIGxvbmcgbG9uZyBmcmFtZV9kaXN0b3J0aW9uOwotICAgIGxvbmcgbG9uZyBsYXN0X2ZyYW1lX2Rpc3RvcnRpb247Ci0jZW5kaWYKLQotICAgIGludCBsYXN0X21iX2Rpc3RvcnRpb247Ci0KLSAgICBpbnQgZnJhbWVzX3NpbmNlX2F1dG9fZmlsdGVyOwotCi0gICAgaW50IHRoaXNfZnJhbWVfdGFyZ2V0OwotICAgIGludCBwcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKLSAgICBpbnQgbGFzdF9xWzJdOyAgICAgICAgICAgICAgICAgICAvLyBTZXBhcmF0ZSB2YWx1ZXMgZm9yIEludHJhL0ludGVyCi0KLSAgICBkb3VibGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKLSAgICBkb3VibGUga2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgZG91YmxlIGdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgZG91YmxlIGVzdF9tYXhfcWNvcnJlY3Rpb25fZmFjdG9yOwotCi0gICAgaW50IGZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7ICAgICAgLy8gQ291bnQgZG93biB0aWxsIG5leHQgR0YKLSAgICBpbnQgY3VycmVudF9nZl9pbnRlcnZhbDsgICAgICAgICAgLy8gR0YgaW50ZXJ2YWwgY2hvc2VuIHdoZW4gd2UgY29kZWQgdGhlIGxhc3QgR0YKLQotICAgIGludCBnZl9vdmVyc3BlbmRfYml0czsgICAgICAgICAgICAvLyBUb3RhbCBiaXRzIG92ZXJzcGVudCBiZWNhc3VlIG9mIEdGIGJvb3N0IChjdW11bGF0aXZlKQotCi0gICAgaW50IGdmX2dyb3VwX2JpdHM7ICAgICAgICAgICAgICAgIC8vIFByb2plY3RlZCBCaXRzIGF2YWlsYWJsZSBmb3IgYSBncm91cCBvZiBmcmFtZXMgaW5jbHVkaW5nIDEgR0Ygb3IgQVJGCi0gICAgaW50IGdmX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyBmb3IgdGhlIGdvbGRlbiBmcmFtZSBvciBBUkYgLSAyIHBhc3Mgb25seQotICAgIGludCBtaWRfZ2ZfZXh0cmFfYml0czsgICAgICAgICAgICAgLy8gQSBmZXcgZXh0cmEgYml0cyBmb3IgdGhlIGZyYW1lIGhhbGYgd2F5IGJldHdlZW4gdHdvIGdmcy4KLQotICAgIC8vIFByb2plY3RlZCB0b3RhbCBiaXRzIGF2YWlsYWJsZSBmb3IgYSBrZXkgZnJhbWUgZ3JvdXAgb2YgZnJhbWVzCi0gICAgbG9uZyBsb25nIGtmX2dyb3VwX2JpdHM7Ci0KLSAgICAvLyBFcnJvciBzY29yZSBvZiBmcmFtZXMgc3RpbGwgdG8gYmUgY29kZWQgaW4ga2YgZ3JvdXAKLSAgICBsb25nIGxvbmcga2ZfZ3JvdXBfZXJyb3JfbGVmdDsKLQotICAgIC8vIEJpdHMgZm9yIHRoZSBrZXkgZnJhbWUgaW4gYSBrZXkgZnJhbWUgZ3JvdXAgLSAyIHBhc3Mgb25seQotICAgIGludCBrZl9iaXRzOwotCi0gICAgaW50IG5vbl9nZl9iaXRyYXRlX2FkanVzdG1lbnQ7ICAgICAvLyBVc2VkIGluIHRoZSBmZXcgZnJhbWVzIGZvbGxvd2luZyBhIEdGIHRvIHJlY292ZXIgdGhlIGV4dHJhIGJpdHMgc3BlbnQgaW4gdGhhdCBHRgotICAgIGludCBpbml0aWFsX2dmX3VzZTsgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlIHVzZSBvZiBnZiAyIGZyYW1lcyBhZnRlciBnZgotCi0gICAgaW50IGdmX2dyb3VwX2Vycm9yX2xlZnQ7ICAgICAgICAgICAvLyBSZW1haW5pbmcgZXJyb3IgZnJvbSB1bmNvZGVkIGZyYW1lcyBpbiBhIGdmIGdyb3VwLiBUd28gcGFzcyB1c2Ugb25seQotCi0gICAgaW50IGtmX292ZXJzcGVuZF9iaXRzOyAgICAgICAgICAgIC8vIEV4dHJhIGJpdHMgc3BlbnQgb24ga2V5IGZyYW1lcyB0aGF0IG5lZWQgdG8gYmUgcmVjb3ZlcmVkIG9uIGludGVyIGZyYW1lcwotICAgIGludCBrZl9iaXRyYXRlX2FkanVzdG1lbnQ7ICAgICAgICAvLyBDdXJyZW50IG51bWJlciBvZiBiaXQgcyB0byB0cnkgYW5kIHJlY292ZXIgb24gZWFjaCBpbnRlciBmcmFtZS4KLSAgICBpbnQgbWF4X2dmX2ludGVydmFsOwotICAgIGludCBzdGF0aWNfc2NlbmVfbWF4X2dmX2ludGVydmFsOwotICAgIGludCBiYXNlbGluZV9nZl9pbnRlcnZhbDsKLSAgICBpbnQgZ2ZfZGVjYXlfcmF0ZTsKLSAgICBpbnQgYWN0aXZlX2FybnJfZnJhbWVzOyAgICAgICAgICAgLy8gPD0gY3BpLT5veGNmLmFybnJfbWF4X2ZyYW1lcwotCi0gICAgSU5UNjQga2V5X2ZyYW1lX2NvdW50OwotICAgIElOVDY0IHRvdF9rZXlfZnJhbWVfYml0czsKLSAgICBpbnQgcHJpb3Jfa2V5X2ZyYW1lX3NpemVbS0VZX0ZSQU1FX0NPTlRFWFRdOwotICAgIGludCBwcmlvcl9rZXlfZnJhbWVfZGlzdGFuY2VbS0VZX0ZSQU1FX0NPTlRFWFRdOwotICAgIGludCBwZXJfZnJhbWVfYmFuZHdpZHRoOyAgICAgICAgICAvLyBDdXJyZW50IHNlY3Rpb24gcGVyIGZyYW1lIGJhbmR3aWR0aCB0YXJnZXQKLSAgICBpbnQgYXZfcGVyX2ZyYW1lX2JhbmR3aWR0aDsgICAgICAgIC8vIEF2ZXJhZ2UgZnJhbWUgc2l6ZSB0YXJnZXQgZm9yIGNsaXAKLSAgICBpbnQgbWluX2ZyYW1lX2JhbmR3aWR0aDsgICAgICAgICAgLy8gTWluaW11bSBhbGxvY2F0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFueSBmcmFtZQotICAgIGludCBsYXN0X2tleV9mcmFtZV9zaXplOwotICAgIGludCBpbnRyYV9mcmFtZV90YXJnZXQ7Ci0gICAgaW50IGludGVyX2ZyYW1lX3RhcmdldDsKLSAgICBkb3VibGUgb3V0cHV0X2ZyYW1lX3JhdGU7Ci0gICAgbG9uZyBsb25nIGxhc3RfdGltZV9zdGFtcF9zZWVuOwotICAgIGxvbmcgbG9uZyBsYXN0X2VuZF90aW1lX3N0YW1wX3NlZW47Ci0gICAgbG9uZyBsb25nIGZpcnN0X3RpbWVfc3RhbXBfZXZlcjsKLQotICAgIGludCBuaV9hdl9xaTsKLSAgICBpbnQgbmlfdG90X3FpOwotICAgIGludCBuaV9mcmFtZXM7Ci0gICAgaW50IGF2Z19mcmFtZV9xaW5kZXg7Ci0KLSAgICBpbnQgemJpbl9vdmVyX3F1YW50OwotICAgIGludCB6YmluX21vZGVfYm9vc3Q7Ci0gICAgaW50IHpiaW5fbW9kZV9ib29zdF9lbmFibGVkOwotCi0gICAgSU5UNjQgdG90YWxfYnl0ZV9jb3VudDsKLQotICAgIGludCBidWZmZXJlZF9tb2RlOwotCi0gICAgaW50IGJ1ZmZlcl9sZXZlbDsKLSAgICBpbnQgYml0c19vZmZfdGFyZ2V0OwotCi0gICAgaW50IHJvbGxpbmdfdGFyZ2V0X2JpdHM7Ci0gICAgaW50IHJvbGxpbmdfYWN0dWFsX2JpdHM7Ci0KLSAgICBpbnQgbG9uZ19yb2xsaW5nX3RhcmdldF9iaXRzOwotICAgIGludCBsb25nX3JvbGxpbmdfYWN0dWFsX2JpdHM7Ci0KLSAgICBsb25nIGxvbmcgdG90YWxfYWN0dWFsX2JpdHM7Ci0gICAgaW50IHRvdGFsX3RhcmdldF92c19hY3R1YWw7ICAgICAgICAvLyBkZWJ1ZyBzdGF0cwotCi0gICAgaW50IHdvcnN0X3F1YWxpdHk7Ci0gICAgaW50IGFjdGl2ZV93b3JzdF9xdWFsaXR5OwotICAgIGludCBiZXN0X3F1YWxpdHk7Ci0gICAgaW50IGFjdGl2ZV9iZXN0X3F1YWxpdHk7Ci0KLSAgICBpbnQgY3FfdGFyZ2V0X3F1YWxpdHk7Ci0gICAgaW50IG1heHFfbWF4X2xpbWl0OwotICAgIGludCBtYXhxX21pbl9saW1pdDsKLQotICAgIGludCBkcm9wX2ZyYW1lc19hbGxvd2VkOyAgICAgICAgICAvLyBBcmUgd2UgcGVybWl0dGVkIHRvIGRyb3AgZnJhbWVzPwotICAgIGludCBkcm9wX2ZyYW1lOyAgICAgICAgICAgICAgICAgIC8vIERyb3AgdGhpcyBmcmFtZT8KLSAgICBpbnQgZHJvcF9jb3VudDsgICAgICAgICAgICAgICAgICAvLyBIb3cgbWFueSBmcmFtZXMgaGF2ZSB3ZSBkcm9wcGVkPwotICAgIGludCBtYXhfZHJvcF9jb3VudDsgICAgICAgICAgICAgICAvLyBIb3cgbWFueSBmcmFtZXMgc2hvdWxkIHdlIGRyb3A/Ci0gICAgaW50IG1heF9jb25zZWNfZHJvcHBlZF9mcmFtZXM7ICAgICAvLyBMaW1pdCBudW1iZXIgb2YgY29uc2VjdXRpdmUgZnJhbWVzIHRoYXQgY2FuIGJlIGRyb3BwZWQuCi0KLQotICAgIGludCB5bW9kZV9jb3VudCBbVlA4X1lNT0RFU107ICAgICAgICAvKiBpbnRyYSBNQiB0eXBlIGN0cyB0aGlzIGZyYW1lICovCi0gICAgaW50IHV2X21vZGVfY291bnRbVlA4X1VWX01PREVTXTsgICAgICAgLyogaW50cmEgTUIgdHlwZSBjdHMgdGhpcyBmcmFtZSAqLwotCi0gICAgdW5zaWduZWQgaW50IE1WY291bnQgWzJdIFtNVnZhbHNdOyAgLyogKHJvdyxjb2wpIE1WIGN0cyB0aGlzIGZyYW1lICovCi0KLSAgICB1bnNpZ25lZCBpbnQgY29lZl9jb3VudHMgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vuc107ICAvKiBmb3IgdGhpcyBmcmFtZSAqLwotICAgIC8vREVDTEFSRV9BTElHTkVEKDE2LCBpbnQsIGNvZWZfY291bnRzX2JhY2t1cCBbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbdnA4X2NvZWZfdG9rZW5zXSk7ICAgLy9ub3QgdXNlZCBhbnkgbW9yZQotICAgIC8vc2F2ZSB2cDhfdHJlZV9wcm9ic19mcm9tX2Rpc3RyaWJ1dGlvbiByZXN1bHQgZm9yIGVhY2ggZnJhbWUgdG8gYXZvaWQgcmVwZWF0IGNhbGN1bGF0aW9uCi0gICAgdnA4X3Byb2IgZnJhbWVfY29lZl9wcm9icyBbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbdnA4X2NvZWZfdG9rZW5zLTFdOwotICAgIHVuc2lnbmVkIGludCBmcmFtZV9icmFuY2hfY3QgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vucy0xXVsyXTsKLQotICAgIC8qIFNlY29uZCBjb21wcmVzc2VkIGRhdGEgcGFydGl0aW9uIGNvbnRhaW5zIGNvZWZmaWNpZW50IGRhdGEuICovCi0KLSAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcGFydGl0aW9uMjsKLSAgICBzaXplX3Qgb3V0cHV0X3BhcnRpdGlvbjJzaXplOwotCi0gICAgaW50IGZyYW1lc190b19rZXk7Ci0gICAgaW50IGdmdV9ib29zdDsKLSAgICBpbnQga2ZfYm9vc3Q7Ci0gICAgaW50IGxhc3RfYm9vc3Q7Ci0gICAgZG91YmxlIHRvdGFsX2Vycm9yX2xlZnQ7Ci0gICAgZG91YmxlIHRvdGFsX2ludHJhX2Vycm9yX2xlZnQ7Ci0gICAgZG91YmxlIHRvdGFsX2NvZGVkX2Vycm9yX2xlZnQ7Ci0gICAgZG91YmxlIHN0YXJ0X3RvdF9lcnJfbGVmdDsKLSAgICBkb3VibGUgbWluX2Vycm9yOwotICAgIGRvdWJsZSBrZl9pbnRyYV9lcnJfbWluOwotICAgIGRvdWJsZSBnZl9pbnRyYV9lcnJfbWluOwotCi0gICAgZG91YmxlIG1vZGlmaWVkX2Vycm9yX3RvdGFsOwotICAgIGRvdWJsZSBtb2RpZmllZF9lcnJvcl91c2VkOwotICAgIGRvdWJsZSBtb2RpZmllZF9lcnJvcl9sZWZ0OwotICAgIGRvdWJsZSBjbGlwX2JwZTsKLSAgICBkb3VibGUgb2JzZXJ2ZWRfYnBlOwotCi0gICAgZG91YmxlIGF2Z19paXJhdGlvOwotCi0gICAgaW50IHRhcmdldF9iYW5kd2lkdGg7Ci0gICAgbG9uZyBsb25nIGJpdHNfbGVmdDsKLSAgICBsb25nIGxvbmcgY2xpcF9iaXRzX3RvdGFsOwotICAgIEZJUlNUUEFTU19TVEFUUyAqdG90YWxfc3RhdHM7Ci0gICAgRklSU1RQQVNTX1NUQVRTICp0aGlzX2ZyYW1lX3N0YXRzOwotICAgIEZJUlNUUEFTU19TVEFUUyAqc3RhdHNfaW4sICpzdGF0c19pbl9lbmQ7Ci0gICAgc3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCAgKm91dHB1dF9wa3RfbGlzdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfZG9uZTsKLQotI2lmIDAKLSAgICAvLyBFeHBlcmltZW50YWwgY29kZSBmb3IgbGFnZ2VkIGFuZCBvbmUgcGFzcwotICAgIE9ORVBBU1NfRlJBTUVTVEFUUyBvbmVfcGFzc19mcmFtZV9zdGF0c1tNQVhfTEFHX0JVRkZFUlNdOwotICAgIGludCBvbmVfcGFzc19mcmFtZV9pbmRleDsKLSNlbmRpZgotCi0gICAgaW50IGRlY2ltYXRpb25fZmFjdG9yOwotICAgIGludCBkZWNpbWF0aW9uX2NvdW50OwotCi0gICAgLy8gZm9yIHJlYWwgdGltZSBlbmNvZGluZwotICAgIGludCBhdmdfZW5jb2RlX3RpbWU7ICAgICAgICAgICAgICAvL21pY3Jvc2Vjb25kCi0gICAgaW50IGF2Z19waWNrX21vZGVfdGltZTsgICAgICAgICAgICAvL21pY3Jvc2Vjb25kCi0gICAgaW50IFNwZWVkOwotICAgIHVuc2lnbmVkIGludCBjcHVfZnJlcTsgICAgICAgICAgIC8vTWh6Ci0gICAgaW50IGNvbXByZXNzb3Jfc3BlZWQ7Ci0KLSAgICBpbnQgaW50ZXJxdWFudGl6ZXI7Ci0gICAgaW50IGF1dG9fZ29sZDsKLSAgICBpbnQgYXV0b19hZGp1c3RfZ29sZF9xdWFudGl6ZXI7Ci0gICAgaW50IGdvbGRxdWFudGl6ZXI7Ci0gICAgaW50IGdvbGRmcmVxOwotICAgIGludCBhdXRvX2FkanVzdF9rZXlfcXVhbnRpemVyOwotICAgIGludCBrZXlxdWFudGl6ZXI7Ci0gICAgaW50IGF1dG9fd29yc3RfcTsKLSAgICBpbnQgZmlsdGVyX3R5cGU7Ci0gICAgaW50IGNwdV91c2VkOwotICAgIGludCBjaHJvbWFfYm9vc3Q7Ci0gICAgaW50IGhvcml6X3NjYWxlOwotICAgIGludCB2ZXJ0X3NjYWxlOwotICAgIGludCBwYXNzOwotCi0KLSAgICBpbnQgcHJvYl9pbnRyYV9jb2RlZDsKLSAgICBpbnQgcHJvYl9sYXN0X2NvZGVkOwotICAgIGludCBwcm9iX2dmX2NvZGVkOwotICAgIGludCBwcm9iX3NraXBfZmFsc2U7Ci0gICAgaW50IGxhc3Rfc2tpcF9mYWxzZV9wcm9ic1szXTsKLSAgICBpbnQgbGFzdF9za2lwX3Byb2JzX3FbM107Ci0gICAgaW50IHJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbTUFYX1JFRl9GUkFNRVNdOwotCi0gICAgaW50IGNvdW50X21iX3JlZl9mcmFtZV91c2FnZVtNQVhfUkVGX0ZSQU1FU107Ci0gICAgaW50IHRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYTsKLSAgICBpbnQgbGFzdF9mcmFtZV9wZXJjZW50X2ludHJhOwotCi0gICAgaW50IGxhc3Rfa2V5X2ZyYW1lX3E7Ci0gICAgaW50IGxhc3Rfa2ZmaWx0X2x2bDsKLQotICAgIGludCByZWZfZnJhbWVfZmxhZ3M7Ci0KLSAgICBTUEVFRF9GRUFUVVJFUyBzZjsKLSAgICBpbnQgZXJyb3JfYmluc1sxMDI0XTsKLQotICAgIGludCBpbnRlcl9sdmw7Ci0gICAgaW50IGludHJhX2x2bDsKLSAgICBpbnQgbW90aW9uX2x2bDsKLSAgICBpbnQgbW90aW9uX3NwZWVkOwotICAgIGludCBtb3Rpb25fdmFyOwotICAgIHVuc2lnbmVkIGludCBuZXh0X2lpcmF0aW87Ci0gICAgdW5zaWduZWQgaW50IHRoaXNfaWlyYXRpbzsKLSAgICBpbnQgdGhpc19mcmFtZV9tb2RpZmllZF9lcnJvcjsKLQotICAgIGRvdWJsZSBub3JtX2ludHJhX2Vycl9wZXJfbWI7Ci0gICAgZG91YmxlIG5vcm1faW50ZXJfZXJyX3Blcl9tYjsKLSAgICBkb3VibGUgbm9ybV9paWRpZmZfcGVyX21iOwotCi0gICAgaW50IGxhc3RfYmVzdF9tb2RlX2luZGV4OyAgICAgICAgICAvLyBSZWNvcmQgb2YgbW9kZSBpbmRleCBjaG9zZW4gZm9yIHByZXZpb3VzIG1hY3JvIGJsb2NrLgotICAgIGludCBsYXN0X2F1dG9fZmlsdF92YWw7Ci0gICAgaW50IGxhc3RfYXV0b19maWx0X3E7Ci0KLSAgICAvLyBEYXRhIHVzZWQgZm9yIHJlYWwgdGltZSBjb25mZXJlbmNpbmcgbW9kZSB0byBoZWxwIGRldGVybWluZSBpZiBpdCB3b3VsZCBiZSBnb29kIHRvIHVwZGF0ZSB0aGUgZ2YKLSAgICBpbnQgaW50ZXJfenpfY291bnQ7Ci0gICAgaW50IGdmX2JhZF9jb3VudDsKLSAgICBpbnQgZ2ZfdXBkYXRlX3JlY29tbWVuZGVkOwotICAgIGludCBza2lwX3RydWVfY291bnQ7Ci0gICAgaW50IHNraXBfZmFsc2VfY291bnQ7Ci0KLSAgICBpbnQgYWx0X3Fjb3VudDsKLQotICAgIGludCByZWFkeV9mb3JfbmV3X2ZyYW1lOwotCi0gICAgdW5zaWduZWQgY2hhciAqc2VnbWVudGF0aW9uX21hcDsKLSAgICBzaWduZWQgY2hhciBzZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfTUFYXVtNQVhfTUJfU0VHTUVOVFNdOyAgICAgICAgICAgIC8vIFNlZ21lbnQgZGF0YSAoY2FuIGJlIGRlbHRhcyBvciBhYnNvbHV0ZSB2YWx1ZXMpCi0gICAgaW50ICBzZWdtZW50X2VuY29kZV9icmVha291dFtNQVhfTUJfU0VHTUVOVFNdOyAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudCB0aHJlYXNob2xkIGZvciBlbmNvZGUgYnJlYWtvdXQKLQotICAgIHVuc2lnbmVkIGNoYXIgKmFjdGl2ZV9tYXA7Ci0gICAgdW5zaWduZWQgaW50IGFjdGl2ZV9tYXBfZW5hYmxlZDsKLSAgICAvLyBWaWRlbyBjb25mZXJlbmNpbmcgY3ljbGljIHJlZnJlc2ggbW9kZSBmbGFncyBldGMKLSAgICAvLyBUaGlzIGlzIGEgbW9kZSBkZXNpZ25lZCB0byBjbGVhbiB1cCB0aGUgYmFja2dyb3VuZCBvdmVyIHRpbWUgaW4gbGl2ZSBlbmNvZGluZyBzY2VuYXJpb3VzLiBJdCB1c2VzIHNlZ21lbnRhdGlvbgotICAgIGludCBjeWNsaWNfcmVmcmVzaF9tb2RlX2VuYWJsZWQ7Ci0gICAgaW50IGN5Y2xpY19yZWZyZXNoX21vZGVfbWF4X21ic19wZXJmcmFtZTsKLSAgICBpbnQgY3ljbGljX3JlZnJlc2hfbW9kZV9pbmRleDsKLSAgICBpbnQgY3ljbGljX3JlZnJlc2hfcTsKLSAgICBzaWduZWQgY2hhciAqY3ljbGljX3JlZnJlc2hfbWFwOwotCi0jaWYgQ09ORklHX01VTFRJVEhSRUFECi0gICAgLy8gbXVsdGl0aHJlYWQgZGF0YQotICAgIGludCAqIG10X2N1cnJlbnRfbWJfY29sOwotICAgIGludCBtdF9zeW5jX3JhbmdlOwotICAgIGludCBwcm9jZXNzb3JfY29yZV9jb3VudDsKLSAgICBpbnQgYl9tdWx0aV90aHJlYWRlZDsKLSAgICBpbnQgZW5jb2RpbmdfdGhyZWFkX2NvdW50OwotCi0gICAgcHRocmVhZF90ICpoX2VuY29kaW5nX3RocmVhZDsKLSAgICBwdGhyZWFkX3QgaF9maWx0ZXJfdGhyZWFkOwotCi0gICAgTUJfUk9XX0NPTVAgKm1iX3Jvd19laTsKLSAgICBFTkNPREVUSFJFQURfREFUQSAqZW5fdGhyZWFkX2RhdGE7Ci0gICAgTFBGVEhSRUFEX0RBVEEgbHBmX3RocmVhZF9kYXRhOwotCi0gICAgLy9ldmVudHMKLSAgICBzZW1fdCAqaF9ldmVudF9zdGFydF9lbmNvZGluZzsKLSAgICBzZW1fdCBoX2V2ZW50X2VuZF9lbmNvZGluZzsKLSAgICBzZW1fdCBoX2V2ZW50X3N0YXJ0X2xwZjsKLSAgICBzZW1fdCBoX2V2ZW50X2VuZF9scGY7Ci0jZW5kaWYKLQotICAgIFRPS0VOTElTVCAqdHBsaXN0OwotICAgIC8vIGVuZCBvZiBtdWx0aXRocmVhZCBkYXRhCi0KLQotICAgIGZyYWN0aW9uYWxfbXZfc3RlcF9mcCAqZmluZF9mcmFjdGlvbmFsX212X3N0ZXA7Ci0gICAgdnA4X2Z1bGxfc2VhcmNoX2ZuX3QgZnVsbF9zZWFyY2hfc2FkOwotICAgIHZwOF9kaWFtb25kX3NlYXJjaF9mbl90IGRpYW1vbmRfc2VhcmNoX3NhZDsKLSAgICB2cDhfdmFyaWFuY2VfZm5fcHRyX3QgZm5fcHRyW0JMT0NLX01BWF9TRUdNRU5UU107Ci0gICAgdW5zaWduZWQgaW50IHRpbWVfcmVjZWl2ZV9kYXRhOwotICAgIHVuc2lnbmVkIGludCB0aW1lX2NvbXByZXNzX2RhdGE7Ci0gICAgdW5zaWduZWQgaW50IHRpbWVfcGlja19scGY7Ci0gICAgdW5zaWduZWQgaW50IHRpbWVfZW5jb2RlX21iX3JvdzsKLQotICAgIHVuc2lnbmVkIGludCB0ZW1wZGF0YTE7Ci0gICAgdW5zaWduZWQgaW50IHRlbXBkYXRhMjsKLQotICAgIGludCBiYXNlX3NraXBfZmFsc2VfcHJvYlsxMjhdOwotICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2ludHJhX3JhdGluZzsKLQotICAgIGRvdWJsZSBzZWN0aW9uX21heF9xZmFjdG9yOwotCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgVlA4X0VOQ09ERVJfUlRDRCAgICAgICAgICAgIHJ0Y2Q7Ci0jZW5kaWYKLSNpZiBWUDhfVEVNUE9SQUxfQUxUX1JFRgotICAgIFNPVVJDRV9TQU1QTEUgYWx0X3JlZl9idWZmZXI7Ci0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpmcmFtZXNbTUFYX0xBR19CVUZGRVJTXTsKLSAgICBpbnQgZml4ZWRfZGl2aWRlWzUxMl07Ci0jZW5kaWYKLQotI2lmIENPTkZJR19QU05SCi0gICAgaW50ICAgIGNvdW50OwotICAgIGRvdWJsZSB0b3RhbF95OwotICAgIGRvdWJsZSB0b3RhbF91OwotICAgIGRvdWJsZSB0b3RhbF92OwotICAgIGRvdWJsZSB0b3RhbCA7Ci0gICAgZG91YmxlIHRvdGFsX3NxX2Vycm9yOwotICAgIGRvdWJsZSB0b3RhbHBfeTsKLSAgICBkb3VibGUgdG90YWxwX3U7Ci0gICAgZG91YmxlIHRvdGFscF92OwotICAgIGRvdWJsZSB0b3RhbHA7Ci0gICAgZG91YmxlIHRvdGFsX3NxX2Vycm9yMjsKLSAgICBpbnQgICAgYnl0ZXM7Ci0gICAgZG91YmxlIHN1bW1lZF9xdWFsaXR5OwotICAgIGRvdWJsZSBzdW1tZWRfd2VpZ2h0czsKLSAgICB1bnNpZ25lZCBpbnQgdG90X3JlY29kZV9oaXRzOwotCi0KLSAgICBkb3VibGUgdG90YWxfc3NpbWdfeTsKLSAgICBkb3VibGUgdG90YWxfc3NpbWdfdTsKLSAgICBkb3VibGUgdG90YWxfc3NpbWdfdjsKLSAgICBkb3VibGUgdG90YWxfc3NpbWdfYWxsOwotCi0gICAgaW50IGJfY2FsY3VsYXRlX3NzaW1nOwotI2VuZGlmCi0gICAgaW50IGJfY2FsY3VsYXRlX3BzbnI7Ci0KLQotICAgIHVuc2lnbmVkIGNoYXIgKmdmX2FjdGl2ZV9mbGFnczsgICAvLyBSZWNvcmQgb2Ygd2hpY2ggTUJzIHN0aWxsIHJlZmVyIHRvIGxhc3QgZ29sZGVuIGZyYW1lIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIDAsMAotICAgIGludCBnZl9hY3RpdmVfY291bnQ7Ci0KLSAgICAvL1N0b3JlIGxhc3QgZnJhbWUncyBNViBpbmZvIGZvciBuZXh0IGZyYW1lIE1WIHByZWRpY3Rpb24KLSAgICBpbnRfbXYgKmxmbXY7Ci0gICAgaW50ICpsZl9yZWZfZnJhbWVfc2lnbl9iaWFzOwotICAgIGludCAqbGZfcmVmX2ZyYW1lOwotCi0jaWYgQ09ORklHX1JFQUxUSU1FX09OTFkKLSAgICBpbnQgZm9yY2VfbmV4dF9mcmFtZV9pbnRyYTsgLyogZm9yY2UgbmV4dCBmcmFtZSB0byBpbnRyYSB3aGVuIGtmX2F1dG8gc2F5cyBzbyAqLwotI2VuZGlmCi19IFZQOF9DT01QOwotCi12b2lkIGNvbnRyb2xfZGF0YV9yYXRlKFZQOF9DT01QICpjcGkpOwotCi12b2lkIHZwOF9lbmNvZGVfZnJhbWUoVlA4X0NPTVAgKmNwaSk7Ci0KLXZvaWQgdnA4X3BhY2tfYml0c3RyZWFtKFZQOF9DT01QICpjcGksIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGxvbmcgKnNpemUpOwotCi11bnNpZ25lZCBpbnQgdnA4X2FjdGl2aXR5X21hc2tpbmcoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCk7Ci0KLWludCByZF9jb3N0X2ludHJhX21iKE1BQ1JPQkxPQ0tEICp4KTsKLQotdm9pZCB2cDhfdG9rZW5pemVfbWIoVlA4X0NPTVAgKiwgTUFDUk9CTE9DS0QgKiwgVE9LRU5FWFRSQSAqKik7Ci0KLXZvaWQgdnA4X3NldF9zcGVlZF9mZWF0dXJlcyhWUDhfQ09NUCAqY3BpKTsKLQotI2lmIENPTkZJR19ERUJVRwotI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAotICAgICAgICBsdmFsID0gKGV4cHIpOyBcCi0gICAgICAgIGlmKCFsdmFsKSBcCi0gICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCIgYXQgJXM6JWQiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sX19MSU5FX18pO1wKLSAgICB9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBDSEVDS19NRU1fRVJST1IobHZhbCxleHByKSBkbyB7XAotICAgICAgICBsdmFsID0gKGV4cHIpOyBcCi0gICAgICAgIGlmKCFsdmFsKSBcCi0gICAgICAgICAgICB2cHhfaW50ZXJuYWxfZXJyb3IoJmNwaS0+Y29tbW9uLmVycm9yLCBWUFhfQ09ERUNfTUVNX0VSUk9SLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICIjbHZhbCk7XAotICAgIH0gd2hpbGUoMCkKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9wYXJtcy5jcHAgYi92cDgvZW5jb2Rlci9wYXJtcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzliMmMuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvcGFybXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWYgMAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotZXh0ZXJuICJDIgotewotICAgICNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXguaCIKLX0KLQotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi10eXBlZGVmIG1hcDxzdHJpbmcsaW50PiBQYXJtczsKLQotI2RlZmluZSBBTExQQVJNUyhPLERPVEhJUykgXAotICAgIERPVEhJUyhPLCAgaW50ZXJxdWFudGl6ZXIgICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIGF1dG9fZ29sZCAgICAgICAgICAgICAgICAgICApXAotICAgIERPVEhJUyhPLCAgYXV0b19hZGp1c3RfZ29sZF9xdWFudGl6ZXIgICAgKVwKLSAgICBET1RISVMoTywgIGdvbGRxdWFudGl6ZXIgICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBnb2xkZnJlcSAgICAgICAgICAgICAgICAgICApXAotICAgIERPVEhJUyhPLCAgYXV0b19rZXkgICAgICAgICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBhdXRvX2FkanVzdF9rZXlfcXVhbnRpemVyICAgICApXAotICAgIERPVEhJUyhPLCAga2V5cXVhbnRpemVyICAgICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIGtleWZyZXEgICAgICAgICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBwYXNzICAgICAgICAgICAgICAgICAgICAgICApXAotICAgIERPVEhJUyhPLCAgZml4ZWRfcSAgICAgICAgICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICB0YXJnZXRfYmFuZHdpZHRoICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIGF1dG9fd29yc3RfcSAgICAgICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIHdvcnN0X3F1YWxpdHkgICAgICAgICAgICAgICApXAotICAgIERPVEhJUyhPLCAgYmVzdF9hbGxvd2VkX3EgICAgICAgICAgICAgICApXAotICAgIERPVEhJUyhPLCAgZW5kX3VzYWdlICAgICAgICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBzdGFydGluZ19idWZmZXJfbGV2ZWwgICAgICAgIClcCi0gICAgRE9USElTKE8sICBvcHRpbWFsX2J1ZmZlcl9sZXZlbCAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBtYXhpbXVtX2J1ZmZlcl9zaXplICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICB1bmRlcl9zaG9vdF9wY3QgICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBhbGxvd19kZiAgICAgICAgICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIGRyb3BfZnJhbWVzX3dhdGVyX21hcmsgICAgICAgIClcCi0gICAgRE9USElTKE8sICBtYXhfYWxsb3dlZF9kYXRhcmF0ZSAgICAgICAgIClcCi0gICAgRE9USElTKE8sICB0d29fcGFzc192YnJiaWFzICAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICB0d29fcGFzc192YnJtaW5fc2VjdGlvbiAgICAgICApXAotICAgIERPVEhJUyhPLCAgdHdvX3Bhc3NfdmJybWF4X3NlY3Rpb24gICAgICAgKVwKLSAgICBET1RISVMoTywgIGZpbHRlcl90eXBlICAgICAgICAgICAgICAgICApXAotICAgIERPVEhJUyhPLCAgY29tcHJlc3Nvcl9zcGVlZCAgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBtYnBpdGNoX2ZlYXR1cmUgICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIGFsbG93X3NwYXRpYWxfcmVzYW1wbGluZyAgICAgKVwKLSAgICBET1RISVMoTywgIHJlc2FtcGxlX2Rvd25fd2F0ZXJfbWFyayAgICAgIClcCi0gICAgRE9USElTKE8sICByZXNhbXBsZV91cF93YXRlcl9tYXJrICAgICAgICApXAotICAgIERPVEhJUyhPLCAgbm9pc2Vfc2Vuc2l0aXZpdHkgICAgICAgICAgIClcCi0gICAgRE9USElTKE8sICBob3Jpel9zY2FsZSAgICAgICAgICAgICAgICAgKVwKLSAgICBET1RISVMoTywgIHZlcnRfc2NhbGUgICAgICAgICAgICAgICAgICApCi0KLQotI2RlZmluZSBHRVQoTyxWKSBPLT5WID0geFsjVl07Ci0jZGVmaW5lIFBVVChPLFYpIHhbI1ZdID0gTy0+VjsKLQotCi1leHRlcm4gIkMiIHZvaWQgZ2V0X3Bhcm1zKFZQOF9DT05GSUcgKm9jZixjaGFyICpmaWxlbmFtZSkKLXsKLQotICAgIFBhcm1zIHg7Ci0gICAgaW50IHZhbHVlOwotICAgIHN0cmluZyB2YXJpYWJsZTsKLSAgICBzdHJpbmcgZXF1YWw7Ci0KLSAgICBpZnN0cmVhbSBjb25maWdfZmlsZShmaWxlbmFtZSk7Ci0KLSAgICBBTExQQVJNUyhvY2YsIFBVVCk7Ci0KLSAgICAvLyBzdG9yZSBhbGwgdGhlIHBhcm1zIGluIGEgbWFwIChyZWFsbHkgc2ltcGxlIHBhcnNpbmcpCi0gICAgd2hpbGUoIWNvbmZpZ19maWxlLmVvZigpICYmIGNvbmZpZ19maWxlLmlzX29wZW4oKSkKLSAgICB7Ci0gICAgICAgIGNvbmZpZ19maWxlID4+IHZhcmlhYmxlOwotICAgICAgICBjb25maWdfZmlsZSA+PiBlcXVhbDsKLQotICAgICAgICBpZihlcXVhbCAhPSAiPSIpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBjb25maWdfZmlsZSA+PiB2YWx1ZTsKLQotICAgICAgICB4W3ZhcmlhYmxlXSA9IHZhbHVlOwotICAgIH0KLQotICAgIEFMTFBBUk1TKG9jZiwgR0VUKTsKLQotfQotCi0jZGVmaW5lIFBSSU5UKE8sVikgZGVidWdfZmlsZTw8I1YgPDwiID0gIiA8PCBPLT5WIDw8IlxuIjsKLWV4dGVybiAiQyIgdm9pZCBwcmludF9wYXJtcyhWUDhfQ09ORklHICpvY2YsY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgb2ZzdHJlYW0gZGVidWdfZmlsZShmaWxlbmFtZSxpb3NfYmFzZTo6YXBwKTsKLSAgICBBTExQQVJNUyhvY2YsIFBSSU5UKTsKLSAgICBkZWJ1Z19maWxlIDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ijw8IlxuIjsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9waWNraW50ZXIuYyBiL3ZwOC9lbmNvZGVyL3BpY2tpbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzkwZDM1Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3BpY2tpbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgIm9ueXhfaW50LmgiCi0jaW5jbHVkZSAibW9kZWNvc3RzLmgiCi0jaW5jbHVkZSAiZW5jb2RlaW50cmEuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2VudHJvcHltb2RlLmgiCi0jaW5jbHVkZSAicGlja2ludGVyLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9maW5kbmVhcm12LmgiCi0jaW5jbHVkZSAiZW5jb2RlbWIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmEuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2dfY29tbW9uLmgiCi0jaW5jbHVkZSAidmFyaWFuY2UuaCIKLSNpbmNsdWRlICJtY29tcC5oIgotI2luY2x1ZGUgInJkb3B0LmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIElGX1JUQ0QoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBJRl9SVENEKHgpICBOVUxMCi0jZW5kaWYKLQotZXh0ZXJuIGludCBWUDhfVVZTU0UoTUFDUk9CTE9DSyAqeCwgY29uc3QgdnA4X3ZhcmlhbmNlX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpOwotCi0jaWZkZWYgU1BFRURTVEFUUwotZXh0ZXJuIHVuc2lnbmVkIGludCBjbnRfcG07Ci0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IE1WX1JFRkVSRU5DRV9GUkFNRSB2cDhfcmVmX2ZyYW1lX29yZGVyW01BWF9NT0RFU107Ci1leHRlcm4gY29uc3QgTUJfUFJFRElDVElPTl9NT0RFIHZwOF9tb2RlX29yZGVyW01BWF9NT0RFU107Ci0KLQotZXh0ZXJuIHVuc2lnbmVkIGludCAoKnZwOF9nZXQxNngxNnByZWRfZXJyb3IpKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCBzcmNfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgcmVmX3N0cmlkZSk7Ci1leHRlcm4gdW5zaWduZWQgaW50ICgqdnA4X2dldDR4NHNzZV9jcykodW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlY29uX3N0cmlkZSk7Ci1leHRlcm4gaW50IHZwOF9yZF9waWNrX2Jlc3RfbWJzZWdtZW50YXRpb24oVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgTVYgKmJlc3RfcmVmX212LCBpbnQgYmVzdF9yZCwgaW50ICosIGludCAqLCBpbnQgKiwgaW50LCBpbnQgKm12Y29zdFsyXSwgaW50LCBpbnQgZnVsbHBpeGVsKTsKLWV4dGVybiBpbnQgdnA4X2Nvc3RfbXZfcmVmKE1CX1BSRURJQ1RJT05fTU9ERSBtLCBjb25zdCBpbnQgbmVhcl9tdl9yZWZfY3RbNF0pOwotZXh0ZXJuIHZvaWQgdnA4X3NldF9tYm1vZGVfYW5kX212cyhNQUNST0JMT0NLICp4LCBNQl9QUkVESUNUSU9OX01PREUgbWIsIE1WICptdik7Ci0KLQotaW50IHZwOF9za2lwX2ZyYWN0aW9uYWxfbXZfc3RlcChNQUNST0JMT0NLICptYiwgQkxPQ0sgKmIsIEJMT0NLRCAqZCwgTVYgKmJlc3RtdiwgTVYgKnJlZl9tdiwgaW50IGVycm9yX3Blcl9iaXQsIGNvbnN0IHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqdmZwLCBpbnQgKm12Y29zdFsyXSkKLXsKLSAgICAodm9pZCkgYjsKLSAgICAodm9pZCkgZDsKLSAgICAodm9pZCkgcmVmX212OwotICAgICh2b2lkKSBlcnJvcl9wZXJfYml0OwotICAgICh2b2lkKSB2ZnA7Ci0gICAgKHZvaWQpIG12Y29zdDsKLSAgICBiZXN0bXYtPnJvdyA8PD0gMzsKLSAgICBiZXN0bXYtPmNvbCA8PD0gMzsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGdldF9pbnRlcl9tYnByZWRfZXJyb3IoTUFDUk9CTE9DSyAqbWIsIGNvbnN0IHZwOF92YXJpYW5jZV9mbl9wdHJfdCAqdmZwLCB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLQotICAgIEJMT0NLICpiID0gJm1iLT5ibG9ja1swXTsKLSAgICBCTE9DS0QgKmQgPSAmbWItPmVfbWJkLmJsb2NrWzBdOwotICAgIHVuc2lnbmVkIGNoYXIgKndoYXQgPSAoKihiLT5iYXNlX3NyYykgKyBiLT5zcmMpOwotICAgIGludCB3aGF0X3N0cmlkZSA9IGItPnNyY19zdHJpZGU7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fd2hhdCA9ICooZC0+YmFzZV9wcmUpICsgZC0+cHJlIDsKLSAgICBpbnQgaW5fd2hhdF9zdHJpZGUgPSBkLT5wcmVfc3RyaWRlOwotICAgIGludCB4b2Zmc2V0ID0gZC0+Ym1pLm12LmFzX212LmNvbCAmIDc7Ci0gICAgaW50IHlvZmZzZXQgPSBkLT5ibWkubXYuYXNfbXYucm93ICYgNzsKLQotICAgIGluX3doYXQgKz0gKGQtPmJtaS5tdi5hc19tdi5yb3cgPj4gMykgKiBkLT5wcmVfc3RyaWRlICsgKGQtPmJtaS5tdi5hc19tdi5jb2wgPj4gMyk7Ci0KLSAgICBpZiAoeG9mZnNldCB8IHlvZmZzZXQpCi0gICAgewotICAgICAgICByZXR1cm4gdmZwLT5zdmYoaW5fd2hhdCwgaW5fd2hhdF9zdHJpZGUsIHhvZmZzZXQsIHlvZmZzZXQsIHdoYXQsIHdoYXRfc3RyaWRlLCBzc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gdmZwLT52Zih3aGF0LCB3aGF0X3N0cmlkZSwgaW5fd2hhdCwgaW5fd2hhdF9zdHJpZGUsIHNzZSk7Ci0gICAgfQotCi19Ci0KLXVuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX2MKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlZl9zdHJpZGUsCi0gICAgaW50IG1heF9zYWQKLSkKLXsKLSAgICB1bnNpZ25lZCBwcmVkX2Vycm9yID0gMDsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgc3VtID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IGRpZmY7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZmYgPSBzcmNfcHRyW2pdIC0gcmVmX3B0cltqXTsKLSAgICAgICAgICAgIHN1bSArPSBkaWZmOwotICAgICAgICAgICAgcHJlZF9lcnJvciArPSBkaWZmICogZGlmZjsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY19wdHIgKz0gc3JjX3N0cmlkZTsKLSAgICAgICAgcmVmX3B0ciArPSByZWZfc3RyaWRlOwotICAgIH0KLQotICAgIHByZWRfZXJyb3IgLT0gc3VtICogc3VtIC8gMjU2OwotICAgIHJldHVybiBwcmVkX2Vycm9yOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfZ2V0NHg0c3NlX2NzX2MKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIGludCBtYXhfc2FkCi0pCi17Ci0gICAgaW50IGRpc3RvcnRpb24gPSAwOwotICAgIGludCByLCBjOwotCi0gICAgZm9yIChyID0gMDsgciA8IDQ7IHIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBkaWZmID0gc3JjX3B0cltjXSAtIHJlZl9wdHJbY107Ci0gICAgICAgICAgICBkaXN0b3J0aW9uICs9IGRpZmYgKiBkaWZmOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjX3B0ciArPSBzb3VyY2Vfc3RyaWRlOwotICAgICAgICByZWZfcHRyICs9IHJlY29uX3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGlzdG9ydGlvbjsKLX0KLQotc3RhdGljIGludCBnZXRfcHJlZGljdGlvbl9lcnJvcihCTE9DSyAqYmUsIEJMT0NLRCAqYiwgY29uc3QgdnA4X3ZhcmlhbmNlX3J0Y2RfdnRhYmxlX3QgKnJ0Y2QpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqc3B0cjsKLSAgICB1bnNpZ25lZCBjaGFyICpkcHRyOwotICAgIHNwdHIgPSAoKihiZS0+YmFzZV9zcmMpICsgYmUtPnNyYyk7Ci0gICAgZHB0ciA9IGItPnByZWRpY3RvcjsKLQotICAgIHJldHVybiBWQVJJQU5DRV9JTlZPS0UocnRjZCwgZ2V0NHg0c3NlX2NzKShzcHRyLCBiZS0+c3JjX3N0cmlkZSwgZHB0ciwgMTYsIDB4N2ZmZmZmZmYpOwotCi19Ci0KLXN0YXRpYyBpbnQgcGlja19pbnRyYTR4NGJsb2NrKAotICAgIGNvbnN0IFZQOF9FTkNPREVSX1JUQ0QgKnJ0Y2QsCi0gICAgTUFDUk9CTE9DSyAqeCwKLSAgICBCTE9DSyAqYmUsCi0gICAgQkxPQ0tEICpiLAotICAgIEJfUFJFRElDVElPTl9NT0RFICpiZXN0X21vZGUsCi0gICAgQl9QUkVESUNUSU9OX01PREUgYWJvdmUsCi0gICAgQl9QUkVESUNUSU9OX01PREUgbGVmdCwKLQotICAgIGludCAqYmVzdHJhdGUsCi0gICAgaW50ICpiZXN0ZGlzdG9ydGlvbikKLXsKLSAgICBCX1BSRURJQ1RJT05fTU9ERSBtb2RlOwotICAgIGludCBiZXN0X3JkID0gSU5UX01BWDsgICAgICAgLy8gMTw8MzAKLSAgICBpbnQgcmF0ZTsKLSAgICBpbnQgZGlzdG9ydGlvbjsKLSAgICB1bnNpZ25lZCBpbnQgKm1vZGVfY29zdHM7Ci0KLSAgICBpZiAoeC0+ZV9tYmQuZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgewotICAgICAgICBtb2RlX2Nvc3RzID0geC0+Ym1vZGVfY29zdHNbYWJvdmVdW2xlZnRdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtb2RlX2Nvc3RzID0geC0+aW50ZXJfYm1vZGVfY29zdHM7Ci0gICAgfQotCi0gICAgZm9yIChtb2RlID0gQl9EQ19QUkVEOyBtb2RlIDw9IEJfSEVfUFJFRCAvKkJfSFVfUFJFRCovOyBtb2RlKyspCi0gICAgewotICAgICAgICBpbnQgdGhpc19yZDsKLQotICAgICAgICByYXRlID0gbW9kZV9jb3N0c1ttb2RlXTsKLSAgICAgICAgdnA4X3ByZWRpY3RfaW50cmE0eDQoYiwgbW9kZSwgYi0+cHJlZGljdG9yKTsKLSAgICAgICAgZGlzdG9ydGlvbiA9IGdldF9wcmVkaWN0aW9uX2Vycm9yKGJlLCBiLCAmcnRjZC0+dmFyaWFuY2UpOwotICAgICAgICB0aGlzX3JkID0gUkRfRVNUSU1BVEUoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZSwgZGlzdG9ydGlvbik7Ci0KLSAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X3JkKQotICAgICAgICB7Ci0gICAgICAgICAgICAqYmVzdHJhdGUgPSByYXRlOwotICAgICAgICAgICAgKmJlc3RkaXN0b3J0aW9uID0gZGlzdG9ydGlvbjsKLSAgICAgICAgICAgIGJlc3RfcmQgPSB0aGlzX3JkOwotICAgICAgICAgICAgKmJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBiLT5ibWkubW9kZSA9IChCX1BSRURJQ1RJT05fTU9ERSkoKmJlc3RfbW9kZSk7Ci0gICAgdnA4X2VuY29kZV9pbnRyYTR4NGJsb2NrKHJ0Y2QsIHgsIGJlLCBiLCBiLT5ibWkubW9kZSk7Ci0KLSAgICByZXR1cm4gYmVzdF9yZDsKLX0KLQotCi1pbnQgdnA4X3BpY2tfaW50cmE0eDRtYnlfbW9kZXMoY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqcnRjZCwgTUFDUk9CTE9DSyAqbWIsIGludCAqUmF0ZSwgaW50ICpiZXN0X2Rpc3QpCi17Ci0gICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJm1iLT5lX21iZDsKLSAgICBpbnQgaTsKLSAgICBpbnQgY29zdCA9IG1iLT5tYm1vZGVfY29zdCBbeGQtPmZyYW1lX3R5cGVdIFtCX1BSRURdOwotICAgIGludCBlcnJvcjsKLSAgICBpbnQgZGlzdG9ydGlvbiA9IDA7Ci0KLSAgICB2cDhfaW50cmFfcHJlZGljdGlvbl9kb3duX2NvcHkoeGQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBNT0RFX0lORk8gKmNvbnN0IG1pYyA9IHhkLT5tb2RlX2luZm9fY29udGV4dDsKLSAgICAgICAgY29uc3QgaW50IG1pcyA9IHhkLT5tb2RlX2luZm9fc3RyaWRlOwotICAgICAgICBjb25zdCBCX1BSRURJQ1RJT05fTU9ERSBBID0gdnA4X2Fib3ZlX2JtaShtaWMsIGksIG1pcyktPm1vZGU7Ci0gICAgICAgIGNvbnN0IEJfUFJFRElDVElPTl9NT0RFIEwgPSB2cDhfbGVmdF9ibWkobWljLCBpKS0+bW9kZTsKLSAgICAgICAgQl9QUkVESUNUSU9OX01PREUgVU5JTklUSUFMSVpFRF9JU19TQUZFKGJlc3RfbW9kZSk7Ci0gICAgICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUociksIFVOSU5JVElBTElaRURfSVNfU0FGRShkKTsKLQotICAgICAgICBwaWNrX2ludHJhNHg0YmxvY2socnRjZCwgbWIsIG1iLT5ibG9jayArIGksIHhkLT5ibG9jayArIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJlc3RfbW9kZSwgQSwgTCwgJnIsICZkKTsKLQotICAgICAgICBjb3N0ICs9IHI7Ci0gICAgICAgIGRpc3RvcnRpb24gKz0gZDsKLQotICAgICAgICBtaWMtPmJtaVtpXS5tb2RlID0geGQtPmJsb2NrW2ldLmJtaS5tb2RlID0gYmVzdF9tb2RlOwotCi0gICAgICAgIC8vIEJyZWFrIG91dCBjYXNlIHdoZXJlIHdlIGhhdmUgYWxyZWFkeSBleGNlZWRlZCBiZXN0IHNvIGZhciB2YWx1ZSB0aGF0IHdhcyBiYXNzZWQgaW4KLSAgICAgICAgaWYgKGRpc3RvcnRpb24gPiAqYmVzdF9kaXN0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHhkLT5ibG9ja1tpXS5ibWkubXYuYXNfaW50ID0gMDsKLQotICAgICpSYXRlID0gY29zdDsKLQotICAgIGlmIChpID09IDE2KQotICAgIHsKLSAgICAgICAgKmJlc3RfZGlzdCA9IGRpc3RvcnRpb247Ci0gICAgICAgIGVycm9yID0gUkRfRVNUSU1BVEUobWItPnJkbXVsdCwgbWItPnJkZGl2LCBjb3N0LCBkaXN0b3J0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKmJlc3RfZGlzdCA9IElOVF9NQVg7Ci0gICAgICAgIGVycm9yID0gSU5UX01BWDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLWludCB2cDhfcGlja19pbnRyYV9tYnV2X21vZGUoTUFDUk9CTE9DSyAqbWIpCi17Ci0KLSAgICBNQUNST0JMT0NLRCAqeCA9ICZtYi0+ZV9tYmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqdWFib3ZlX3JvdyA9IHgtPmRzdC51X2J1ZmZlciAtIHgtPmRzdC51dl9zdHJpZGU7Ci0gICAgdW5zaWduZWQgY2hhciAqdmFib3ZlX3JvdyA9IHgtPmRzdC52X2J1ZmZlciAtIHgtPmRzdC51dl9zdHJpZGU7Ci0gICAgdW5zaWduZWQgY2hhciAqdXNyY19wdHIgPSAobWItPmJsb2NrWzE2XS5zcmMgKyAqbWItPmJsb2NrWzE2XS5iYXNlX3NyYyk7Ci0gICAgdW5zaWduZWQgY2hhciAqdnNyY19wdHIgPSAobWItPmJsb2NrWzIwXS5zcmMgKyAqbWItPmJsb2NrWzIwXS5iYXNlX3NyYyk7Ci0gICAgaW50IHV2c3JjX3N0cmlkZSA9IG1iLT5ibG9ja1sxNl0uc3JjX3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyIHVsZWZ0X2NvbFs4XTsKLSAgICB1bnNpZ25lZCBjaGFyIHZsZWZ0X2NvbFs4XTsKLSAgICB1bnNpZ25lZCBjaGFyIHV0b3BfbGVmdCA9IHVhYm92ZV9yb3dbLTFdOwotICAgIHVuc2lnbmVkIGNoYXIgdnRvcF9sZWZ0ID0gdmFib3ZlX3Jvd1stMV07Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGV4cGVjdGVkX3VkYzsKLSAgICBpbnQgZXhwZWN0ZWRfdmRjOwotICAgIGludCBzaGlmdDsKLSAgICBpbnQgVWF2ZXJhZ2UgPSAwOwotICAgIGludCBWYXZlcmFnZSA9IDA7Ci0gICAgaW50IGRpZmY7Ci0gICAgaW50IHByZWRfZXJyb3JbNF0gPSB7MCwgMCwgMCwgMH0sIGJlc3RfZXJyb3IgPSBJTlRfTUFYOwotICAgIE1CX1BSRURJQ1RJT05fTU9ERSBVTklOSVRJQUxJWkVEX0lTX1NBRkUoYmVzdF9tb2RlKTsKLQotCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICB7Ci0gICAgICAgIHVsZWZ0X2NvbFtpXSA9IHgtPmRzdC51X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07Ci0gICAgICAgIHZsZWZ0X2NvbFtpXSA9IHgtPmRzdC52X2J1ZmZlciBbaSogeC0+ZHN0LnV2X3N0cmlkZSAtMV07Ci0gICAgfQotCi0gICAgaWYgKCF4LT51cF9hdmFpbGFibGUgJiYgIXgtPmxlZnRfYXZhaWxhYmxlKQotICAgIHsKLSAgICAgICAgZXhwZWN0ZWRfdWRjID0gMTI4OwotICAgICAgICBleHBlY3RlZF92ZGMgPSAxMjg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNoaWZ0ID0gMjsKLQotICAgICAgICBpZiAoeC0+dXBfYXZhaWxhYmxlKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVWF2ZXJhZ2UgKz0gdWFib3ZlX3Jvd1tpXTsKLSAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2YWJvdmVfcm93W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaGlmdCArKzsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHgtPmxlZnRfYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVhdmVyYWdlICs9IHVsZWZ0X2NvbFtpXTsKLSAgICAgICAgICAgICAgICBWYXZlcmFnZSArPSB2bGVmdF9jb2xbaV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNoaWZ0ICsrOwotCi0gICAgICAgIH0KLQotICAgICAgICBleHBlY3RlZF91ZGMgPSAoVWF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OwotICAgICAgICBleHBlY3RlZF92ZGMgPSAoVmF2ZXJhZ2UgKyAoMSA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0OwotICAgIH0KLQotCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaW50IHByZWR1ID0gdWxlZnRfY29sW2ldICsgdWFib3ZlX3Jvd1tqXSAtIHV0b3BfbGVmdDsKLSAgICAgICAgICAgIGludCBwcmVkdiA9IHZsZWZ0X2NvbFtpXSArIHZhYm92ZV9yb3dbal0gLSB2dG9wX2xlZnQ7Ci0gICAgICAgICAgICBpbnQgdV9wLCB2X3A7Ci0KLSAgICAgICAgICAgIHVfcCA9IHVzcmNfcHRyW2pdOwotICAgICAgICAgICAgdl9wID0gdnNyY19wdHJbal07Ci0KLSAgICAgICAgICAgIGlmIChwcmVkdSA8IDApCi0gICAgICAgICAgICAgICAgcHJlZHUgPSAwOwotCi0gICAgICAgICAgICBpZiAocHJlZHUgPiAyNTUpCi0gICAgICAgICAgICAgICAgcHJlZHUgPSAyNTU7Ci0KLSAgICAgICAgICAgIGlmIChwcmVkdiA8IDApCi0gICAgICAgICAgICAgICAgcHJlZHYgPSAwOwotCi0gICAgICAgICAgICBpZiAocHJlZHYgPiAyNTUpCi0gICAgICAgICAgICAgICAgcHJlZHYgPSAyNTU7Ci0KLQotICAgICAgICAgICAgZGlmZiA9IHVfcCAtIGV4cGVjdGVkX3VkYzsKLSAgICAgICAgICAgIHByZWRfZXJyb3JbRENfUFJFRF0gKz0gZGlmZiAqIGRpZmY7Ci0gICAgICAgICAgICBkaWZmID0gdl9wIC0gZXhwZWN0ZWRfdmRjOwotICAgICAgICAgICAgcHJlZF9lcnJvcltEQ19QUkVEXSArPSBkaWZmICogZGlmZjsKLQotCi0gICAgICAgICAgICBkaWZmID0gdV9wIC0gdWFib3ZlX3Jvd1tqXTsKLSAgICAgICAgICAgIHByZWRfZXJyb3JbVl9QUkVEXSArPSBkaWZmICogZGlmZjsKLSAgICAgICAgICAgIGRpZmYgPSB2X3AgLSB2YWJvdmVfcm93W2pdOwotICAgICAgICAgICAgcHJlZF9lcnJvcltWX1BSRURdICs9IGRpZmYgKiBkaWZmOwotCi0KLSAgICAgICAgICAgIGRpZmYgPSB1X3AgLSB1bGVmdF9jb2xbaV07Ci0gICAgICAgICAgICBwcmVkX2Vycm9yW0hfUFJFRF0gKz0gZGlmZiAqIGRpZmY7Ci0gICAgICAgICAgICBkaWZmID0gdl9wIC0gdmxlZnRfY29sW2ldOwotICAgICAgICAgICAgcHJlZF9lcnJvcltIX1BSRURdICs9IGRpZmYgKiBkaWZmOwotCi0KLSAgICAgICAgICAgIGRpZmYgPSB1X3AgLSBwcmVkdTsKLSAgICAgICAgICAgIHByZWRfZXJyb3JbVE1fUFJFRF0gKz0gZGlmZiAqIGRpZmY7Ci0gICAgICAgICAgICBkaWZmID0gdl9wIC0gcHJlZHY7Ci0gICAgICAgICAgICBwcmVkX2Vycm9yW1RNX1BSRURdICs9IGRpZmYgKiBkaWZmOwotCi0KLSAgICAgICAgfQotCi0gICAgICAgIHVzcmNfcHRyICs9IHV2c3JjX3N0cmlkZTsKLSAgICAgICAgdnNyY19wdHIgKz0gdXZzcmNfc3RyaWRlOwotCi0gICAgICAgIGlmIChpID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzcmNfcHRyID0gKG1iLT5ibG9ja1sxOF0uc3JjICsgKm1iLT5ibG9ja1sxOF0uYmFzZV9zcmMpOwotICAgICAgICAgICAgdnNyY19wdHIgPSAobWItPmJsb2NrWzIyXS5zcmMgKyAqbWItPmJsb2NrWzIyXS5iYXNlX3NyYyk7Ci0gICAgICAgIH0KLQotCi0KLSAgICB9Ci0KLQotICAgIGZvciAoaSA9IERDX1BSRUQ7IGkgPD0gVE1fUFJFRDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGJlc3RfZXJyb3IgPiBwcmVkX2Vycm9yW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICBiZXN0X2Vycm9yID0gcHJlZF9lcnJvcltpXTsKLSAgICAgICAgICAgIGJlc3RfbW9kZSA9IChNQl9QUkVESUNUSU9OX01PREUpaTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgbWItPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSBiZXN0X21vZGU7Ci0gICAgcmV0dXJuIGJlc3RfZXJyb3I7Ci0KLX0KLQotaW50IHZwOF9waWNrX2ludGVyX21vZGUoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50IHJlY29uX3lvZmZzZXQsIGludCByZWNvbl91dm9mZnNldCwgaW50ICpyZXR1cm5yYXRlLCBpbnQgKnJldHVybmRpc3RvcnRpb24sIGludCAqcmV0dXJuaW50cmEpCi17Ci0gICAgQkxPQ0sgKmIgPSAmeC0+YmxvY2tbMF07Ci0gICAgQkxPQ0tEICpkID0gJngtPmVfbWJkLmJsb2NrWzBdOwotICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKLSAgICBCX01PREVfSU5GTyBiZXN0X2Jtb2Rlc1sxNl07Ci0gICAgTUJfTU9ERV9JTkZPIGJlc3RfbWJtb2RlOwotICAgIFBBUlRJVElPTl9JTkZPIGJlc3RfcGFydGl0aW9uOwotICAgIE1WIGJlc3RfcmVmX212OwotICAgIE1WIG1vZGVfbXZbTUJfTU9ERV9DT1VOVF07Ci0gICAgTUJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZTsKLSAgICBpbnQgbnVtMDA7Ci0gICAgaW50IGk7Ci0gICAgaW50IG1kY291bnRzWzRdOwotICAgIGludCBiZXN0X3JkID0gSU5UX01BWDsgLy8gMSA8PCAzMDsKLSAgICBpbnQgYmVzdF9pbnRyYV9yZCA9IElOVF9NQVg7Ci0gICAgaW50IG1vZGVfaW5kZXg7Ci0gICAgaW50IHJlZl9mcmFtZV9jb3N0W01BWF9SRUZfRlJBTUVTXTsKLSAgICBpbnQgcmF0ZTsKLSAgICBpbnQgcmF0ZTI7Ci0gICAgaW50IGRpc3RvcnRpb24yOwotICAgIGludCBiZXN0c21lOwotICAgIC8vaW50IGFsbF9yZHNbTUFYX01PREVTXTsgICAgICAgICAvLyBFeHBlcmltZW50YWwgZGVidWcgY29kZS4KLSAgICBpbnQgYmVzdF9tb2RlX2luZGV4ID0gMDsKLSAgICBpbnQgc3NlID0gSU5UX01BWDsKLQotICAgIE1WIG12cDsKLSAgICBpbnQgbmVhcl9zYWRpZHhbOF0gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgN307Ci0gICAgaW50IHNhZGRvbmU9MDsKLSAgICBpbnQgc3I9MDsgICAgLy9zZWFyY2ggcmFuZ2UgZ290IGZyb20gbXZfcHJlZCgpLiBJdCB1c2VzIHN0ZXBfcGFyYW0gbGV2ZWxzLiAoMC03KQotCi0gICAgTVYgbmVhcmVzdF9tdls0XTsKLSAgICBNViBuZWFyX212WzRdOwotICAgIE1WIGZyYW1lX2Jlc3RfcmVmX212WzRdOwotICAgIGludCBNRENvdW50c1s0XVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyICp5X2J1ZmZlcls0XTsKLSAgICB1bnNpZ25lZCBjaGFyICp1X2J1ZmZlcls0XTsKLSAgICB1bnNpZ25lZCBjaGFyICp2X2J1ZmZlcls0XTsKLQotICAgIGludCBza2lwX21vZGVbNF0gPSB7MCwgMCwgMCwgMH07Ci0KLSAgICB2cHhfbWVtc2V0KG1vZGVfbXYsIDAsIHNpemVvZihtb2RlX212KSk7Ci0gICAgdnB4X21lbXNldChuZWFyZXN0X212LCAwLCBzaXplb2YobmVhcmVzdF9tdikpOwotICAgIHZweF9tZW1zZXQobmVhcl9tdiwgMCwgc2l6ZW9mKG5lYXJfbXYpKTsKLSAgICB2cHhfbWVtc2V0KCZiZXN0X21ibW9kZSwgMCwgc2l6ZW9mKGJlc3RfbWJtb2RlKSk7Ci0KLQotICAgIC8vIHNldCB1cCBhbGwgdGhlIHJlZmZyYW1lIGRlcGVuZGVudCBwb2ludGVycy4KLSAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfTEFTVF9GTEFHKQotICAgIHsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpsc3RfeXYxMiA9ICZjcGktPmNvbW1vbi55djEyX2ZiW2NwaS0+Y29tbW9uLmxzdF9mYl9pZHhdOwotCi0gICAgICAgIHZwOF9maW5kX25lYXJfbXZzKCZ4LT5lX21iZCwgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQsICZuZWFyZXN0X212W0xBU1RfRlJBTUVdLCAmbmVhcl9tdltMQVNUX0ZSQU1FXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lX2Jlc3RfcmVmX212W0xBU1RfRlJBTUVdLCBNRENvdW50c1tMQVNUX0ZSQU1FXSwgTEFTVF9GUkFNRSwgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0KLSAgICAgICAgeV9idWZmZXJbTEFTVF9GUkFNRV0gPSBsc3RfeXYxMi0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OwotICAgICAgICB1X2J1ZmZlcltMQVNUX0ZSQU1FXSA9IGxzdF95djEyLT51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICB2X2J1ZmZlcltMQVNUX0ZSQU1FXSA9IGxzdF95djEyLT52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHNraXBfbW9kZVtMQVNUX0ZSQU1FXSA9IDE7Ci0KLSAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfR09MRF9GTEFHKQotICAgIHsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICpnbGRfeXYxMiA9ICZjcGktPmNvbW1vbi55djEyX2ZiW2NwaS0+Y29tbW9uLmdsZF9mYl9pZHhdOwotCi0gICAgICAgIHZwOF9maW5kX25lYXJfbXZzKCZ4LT5lX21iZCwgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQsICZuZWFyZXN0X212W0dPTERFTl9GUkFNRV0sICZuZWFyX212W0dPTERFTl9GUkFNRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZV9iZXN0X3JlZl9tdltHT0xERU5fRlJBTUVdLCBNRENvdW50c1tHT0xERU5fRlJBTUVdLCBHT0xERU5fRlJBTUUsIGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXMpOwotCi0gICAgICAgIHlfYnVmZmVyW0dPTERFTl9GUkFNRV0gPSBnbGRfeXYxMi0+eV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OwotICAgICAgICB1X2J1ZmZlcltHT0xERU5fRlJBTUVdID0gZ2xkX3l2MTItPnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgIHZfYnVmZmVyW0dPTERFTl9GUkFNRV0gPSBnbGRfeXYxMi0+dl9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBza2lwX21vZGVbR09MREVOX0ZSQU1FXSA9IDE7Ci0KLSAgICBpZiAoY3BpLT5yZWZfZnJhbWVfZmxhZ3MgJiBWUDhfQUxUX0ZMQUcgJiYgY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUpCi0gICAgewotICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmFsdF95djEyID0gJmNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24uYWx0X2ZiX2lkeF07Ci0KLSAgICAgICAgdnA4X2ZpbmRfbmVhcl9tdnMoJngtPmVfbWJkLCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwgJm5lYXJlc3RfbXZbQUxUUkVGX0ZSQU1FXSwgJm5lYXJfbXZbQUxUUkVGX0ZSQU1FXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lX2Jlc3RfcmVmX212W0FMVFJFRl9GUkFNRV0sIE1EQ291bnRzW0FMVFJFRl9GUkFNRV0sIEFMVFJFRl9GUkFNRSwgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0KLSAgICAgICAgeV9idWZmZXJbQUxUUkVGX0ZSQU1FXSA9IGFsdF95djEyLT55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgIHVfYnVmZmVyW0FMVFJFRl9GUkFNRV0gPSBhbHRfeXYxMi0+dV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgdl9idWZmZXJbQUxUUkVGX0ZSQU1FXSA9IGFsdF95djEyLT52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHNraXBfbW9kZVtBTFRSRUZfRlJBTUVdID0gMTsKLQotICAgIGNwaS0+bWJzX3Rlc3RlZF9zb19mYXIrKzsgICAgICAgICAgLy8gQ291bnQgb2YgdGhlIG51bWJlciBvZiBNQnMgdGVzdGVkIHNvIGZhciB0aGlzIGZyYW1lCi0KLSAgICAqcmV0dXJuaW50cmEgPSBiZXN0X2ludHJhX3JkOwotICAgIHgtPnNraXAgPSAwOwotCi0gICAgcmVmX2ZyYW1lX2Nvc3RbSU5UUkFfRlJBTUVdICAgPSB2cDhfY29zdF96ZXJvKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCk7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2UgdHJlYXRtZW50IHdoZW4gR0YgYW5kIEFSRiBhcmUgbm90IHNlbnNpYmxlIG9wdGlvbnMgZm9yIHJlZmVyZW5jZQotICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyA9PSBWUDhfTEFTVF9GTEFHKQotICAgIHsKLSAgICAgICAgcmVmX2ZyYW1lX2Nvc3RbTEFTVF9GUkFNRV0gICAgPSB2cDhfY29zdF9vbmUoY3BpLT5wcm9iX2ludHJhX2NvZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3RfemVybygyNTUpOwotICAgICAgICByZWZfZnJhbWVfY29zdFtHT0xERU5fRlJBTUVdICA9IHZwOF9jb3N0X29uZShjcGktPnByb2JfaW50cmFfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUoMjU1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3RfemVybygxMjgpOwotICAgICAgICByZWZfZnJhbWVfY29zdFtBTFRSRUZfRlJBTUVdICA9IHZwOF9jb3N0X29uZShjcGktPnByb2JfaW50cmFfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUoMjU1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3Rfb25lKDEyOCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0xBU1RfRlJBTUVdICAgID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X3plcm8oY3BpLT5wcm9iX2xhc3RfY29kZWQpOwotICAgICAgICByZWZfZnJhbWVfY29zdFtHT0xERU5fRlJBTUVdICA9IHZwOF9jb3N0X29uZShjcGktPnByb2JfaW50cmFfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUoY3BpLT5wcm9iX2xhc3RfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF96ZXJvKGNwaS0+cHJvYl9nZl9jb2RlZCk7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0FMVFJFRl9GUkFNRV0gID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZShjcGktPnByb2JfbGFzdF9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZShjcGktPnByb2JfZ2ZfY29kZWQpOwotICAgIH0KLQotICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IElOVFJBX0ZSQU1FOwotCi0gICAgLy8gaWYgd2UgZW5jb2RlIGEgbmV3IG12IHRoaXMgaXMgaW1wb3J0YW50Ci0gICAgLy8gZmluZCB0aGUgYmVzdCBuZXcgbW90aW9uIHZlY3RvcgotICAgIGZvciAobW9kZV9pbmRleCA9IDA7IG1vZGVfaW5kZXggPCBNQVhfTU9ERVM7IG1vZGVfaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGludCBmcmFtZV9jb3N0OwotICAgICAgICBpbnQgdGhpc19yZCA9IElOVF9NQVg7Ci0KLSAgICAgICAgaWYgKGJlc3RfcmQgPD0gY3BpLT5yZF90aHJlc2hlc1ttb2RlX2luZGV4XSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IHZwOF9yZWZfZnJhbWVfb3JkZXJbbW9kZV9pbmRleF07Ci0KLSAgICAgICAgaWYgKHNraXBfbW9kZVt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXN0aW5nIGZyZXF1ZW5jeSBmb3IgdGhpcyBtb2RlIGlzIGF0IGl0cyBtYXgKLSAgICAgICAgLy8gSWYgc28gdGhlbiBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdGVzdGVkIGFuZCBpbmNyZWFzZSB0aGUgdGhyZXNob2xkIGZvciBpdHMgdGVzdGluZwotICAgICAgICBpZiAoY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSAmJiAoY3BpLT5tb2RlX2NoZWNrX2ZyZXFbbW9kZV9pbmRleF0gPiAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9pZiAoIChjcGktPm1ic190ZXN0ZWRfc29fZmFyIC8gY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSkgPD0gY3BpLT5tb2RlX2NoZWNrX2ZyZXFbbW9kZV9pbmRleF0gKQotICAgICAgICAgICAgaWYgKGNwaS0+bWJzX3Rlc3RlZF9zb19mYXIgPD0gKGNwaS0+bW9kZV9jaGVja19mcmVxW21vZGVfaW5kZXhdICogY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSW5jcmVhc2UgdGhlIHRocmVzaG9sZCBmb3IgY29kaW5nIHRoaXMgbW9kZSB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IHRvIGJlIGNob3NlbgotICAgICAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gKz0gNDsKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID4gTUFYX1RIUkVTSE1VTFQpCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPSBNQVhfVEhSRVNITVVMVDsKLQotICAgICAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdOwotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBoYXZlIG5vdyByZWFjaGVkIHRoZSBwb2ludCB3aGVyZSB3ZSBhcmUgZ29pbmcgdG8gdGVzdCB0aGUgY3VycmVudCBtb2RlIHNvIGluY3JlbWVudCB0aGUgY291bnRlciBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpdCBoYXMgYmVlbiB0ZXN0ZWQKLSAgICAgICAgY3BpLT5tb2RlX3Rlc3RfaGl0X2NvdW50c1ttb2RlX2luZGV4XSArKzsKLQotICAgICAgICByYXRlMiA9IDA7Ci0gICAgICAgIGRpc3RvcnRpb24yID0gMDsKLQotICAgICAgICB0aGlzX21vZGUgPSB2cDhfbW9kZV9vcmRlclttb2RlX2luZGV4XTsKLQotICAgICAgICAvLyBFeHBlcmltZW50YWwgZGVidWcgY29kZS4KLSAgICAgICAgLy9hbGxfcmRzW21vZGVfaW5kZXhdID0gLTE7Ci0KLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IHRoaXNfbW9kZTsKLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSA9IERDX1BSRUQ7Ci0KLSAgICAgICAgLy8gV29yayBvdXQgdGhlIGNvc3QgYXNzb3NjaWF0ZWQgd2l0aCBzZWxlY3RpbmcgdGhlIHJlZmVyZW5jZSBmcmFtZQotICAgICAgICBmcmFtZV9jb3N0ID0gcmVmX2ZyYW1lX2Nvc3RbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKLSAgICAgICAgcmF0ZTIgKz0gZnJhbWVfY29zdDsKLQotICAgICAgICAvLyBldmVyeXRoaW5nIGJ1dCBpbnRyYQotICAgICAgICBpZiAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5lX21iZC5wcmUueV9idWZmZXIgPSB5X2J1ZmZlclt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOwotICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnVfYnVmZmVyID0gdV9idWZmZXJbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKLSAgICAgICAgICAgIHgtPmVfbWJkLnByZS52X2J1ZmZlciA9IHZfYnVmZmVyW3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07Ci0gICAgICAgICAgICBtb2RlX212W05FQVJFU1RNVl0gPSBuZWFyZXN0X212W3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07Ci0gICAgICAgICAgICBtb2RlX212W05FQVJNVl0gPSBuZWFyX212W3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07Ci0gICAgICAgICAgICBiZXN0X3JlZl9tdiA9IGZyYW1lX2Jlc3RfcmVmX212W3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07Ci0gICAgICAgICAgICBtZW1jcHkobWRjb3VudHMsIE1EQ291bnRzW3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV0sIHNpemVvZihtZGNvdW50cykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT25seSBjb25zaWRlciBaRVJPTVYvQUxUUkVGX0ZSQU1FIGZvciBhbHQgcmVmIGZyYW1lLAotICAgICAgICAvLyB1bmxlc3MgQVJOUiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBpbiB3aGljaCBjYXNlIHdlIHdhbnQKLSAgICAgICAgLy8gYW4gdW5maWx0ZXJlZCBhbHRlcm5hdGl2ZQotICAgICAgICBpZiAoY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiAmJiAoY3BpLT5veGNmLmFybnJfbWF4X2ZyYW1lcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXNfbW9kZSAhPSBaRVJPTVYgfHwgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lICE9IEFMVFJFRl9GUkFNRSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGNwaS0+c2YuaW1wcm92ZWRfbXZfcHJlZCAmJiB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID09IE5FV01WKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighc2FkZG9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cDhfY2FsX3NhZChjcGkseGQseCwgcmVjb25feW9mZnNldCAsJm5lYXJfc2FkaWR4WzBdICk7Ci0gICAgICAgICAgICAgICAgc2FkZG9uZSA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZwOF9tdl9wcmVkKGNwaSwgJngtPmVfbWJkLCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwgJm12cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSwgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcywgJnNyLCAmbmVhcl9zYWRpZHhbMF0pOwotCi0gICAgICAgICAgICAvKiBhZGp1c3QgbXZwIHRvIG1ha2Ugc3VyZSBpdCBpcyB3aXRoaW4gTVYgcmFuZ2UgKi8KLSAgICAgICAgICAgIGlmKG12cC5yb3cgPiBiZXN0X3JlZl9tdi5yb3cgKyBNQVhfRlVMTF9QRUxfVkFMKQotICAgICAgICAgICAgICAgIG12cC5yb3cgPSBiZXN0X3JlZl9tdi5yb3cgKyBNQVhfRlVMTF9QRUxfVkFMOwotICAgICAgICAgICAgZWxzZSBpZihtdnAucm93IDwgYmVzdF9yZWZfbXYucm93IC0gTUFYX0ZVTExfUEVMX1ZBTCkKLSAgICAgICAgICAgICAgICBtdnAucm93ID0gYmVzdF9yZWZfbXYucm93IC0gTUFYX0ZVTExfUEVMX1ZBTDsKLSAgICAgICAgICAgIGlmKG12cC5jb2wgPiBiZXN0X3JlZl9tdi5jb2wgKyBNQVhfRlVMTF9QRUxfVkFMKQotICAgICAgICAgICAgICAgIG12cC5jb2wgPSBiZXN0X3JlZl9tdi5jb2wgKyBNQVhfRlVMTF9QRUxfVkFMOwotICAgICAgICAgICAgZWxzZSBpZihtdnAuY29sIDwgYmVzdF9yZWZfbXYuY29sIC0gTUFYX0ZVTExfUEVMX1ZBTCkKLSAgICAgICAgICAgICAgICBtdnAuY29sID0gYmVzdF9yZWZfbXYuY29sIC0gTUFYX0ZVTExfUEVMX1ZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAodGhpc19tb2RlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgQl9QUkVEOgotICAgICAgICAgICAgZGlzdG9ydGlvbjIgPSAqcmV0dXJuZGlzdG9ydGlvbjsgICAgICAgICAgICAgICAgICAgIC8vIEJlc3Qgc28gZmFyIHBhc3NlZCBpbiBhcyBicmVha291dCB2YWx1ZSB0byB2cDhfcGlja19pbnRyYTR4NG1ieV9tb2RlcwotICAgICAgICAgICAgdnA4X3BpY2tfaW50cmE0eDRtYnlfbW9kZXMoSUZfUlRDRCgmY3BpLT5ydGNkKSwgeCwgJnJhdGUsICZkaXN0b3J0aW9uMik7Ci0gICAgICAgICAgICByYXRlMiArPSByYXRlOwotICAgICAgICAgICAgZGlzdG9ydGlvbjIgPSBWQVJJQU5DRV9JTlZPS0UoJmNwaS0+cnRjZC52YXJpYW5jZSwgZ2V0MTZ4MTZwcmVkZXJyb3IpKHgtPnNyYy55X2J1ZmZlciwgeC0+c3JjLnlfc3RyaWRlLCB4LT5lX21iZC5wcmVkaWN0b3IsIDE2LCAweDdmZmZmZmZmKTsKLQotICAgICAgICAgICAgaWYgKGRpc3RvcnRpb24yID09IElOVF9NQVgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpc19yZCA9IElOVF9NQVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpc19yZCA9IFJEX0VTVElNQVRFKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUyLCBkaXN0b3J0aW9uMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfaW50cmFfcmQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZXN0X2ludHJhX3JkID0gdGhpc19yZDsKLSAgICAgICAgICAgICAgICAgICAgKnJldHVybmludHJhID0gYmVzdF9pbnRyYV9yZCA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNQTElUTVY6Ci0KLSAgICAgICAgICAgIC8vIFNwbGl0IE1WIG1vZGVzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHdoZW4gUkQgaXMgbm9wdCBlbmFibGVkLgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBEQ19QUkVEOgotICAgICAgICBjYXNlIFZfUFJFRDoKLSAgICAgICAgY2FzZSBIX1BSRUQ6Ci0gICAgICAgIGNhc2UgVE1fUFJFRDoKLSAgICAgICAgICAgIFJFQ09OX0lOVk9LRSgmY3BpLT5jb21tb24ucnRjZC5yZWNvbiwgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkpCi0gICAgICAgICAgICAgICAgKCZ4LT5lX21iZCk7Ci0gICAgICAgICAgICBkaXN0b3J0aW9uMiA9IFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBnZXQxNngxNnByZWRlcnJvcikoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHgtPmVfbWJkLnByZWRpY3RvciwgMTYsIDB4N2ZmZmZmZmYpOwotICAgICAgICAgICAgcmF0ZTIgKz0geC0+bWJtb2RlX2Nvc3RbeC0+ZV9tYmQuZnJhbWVfdHlwZV1beC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZV07Ci0gICAgICAgICAgICB0aGlzX3JkID0gUkRfRVNUSU1BVEUoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZTIsIGRpc3RvcnRpb24yKTsKLQotICAgICAgICAgICAgaWYgKHRoaXNfcmQgPCBiZXN0X2ludHJhX3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlc3RfaW50cmFfcmQgPSB0aGlzX3JkOwotICAgICAgICAgICAgICAgICpyZXR1cm5pbnRyYSA9IGJlc3RfaW50cmFfcmQgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE5FV01WOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc3NtZTsKLSAgICAgICAgICAgIGludCBzdGVwX3BhcmFtOwotICAgICAgICAgICAgaW50IGZ1cnRoZXJfc3RlcHM7Ci0gICAgICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgICAgICBpbnQgc2FkcGIgPSB4LT5zYWRwZXJiaXQxNjsKLQotICAgICAgICAgICAgaW50IGNvbF9taW47Ci0gICAgICAgICAgICBpbnQgY29sX21heDsKLSAgICAgICAgICAgIGludCByb3dfbWluOwotICAgICAgICAgICAgaW50IHJvd19tYXg7Ci0KLSAgICAgICAgICAgIGludCB0bXBfY29sX21pbiA9IHgtPm12X2NvbF9taW47Ci0gICAgICAgICAgICBpbnQgdG1wX2NvbF9tYXggPSB4LT5tdl9jb2xfbWF4OwotICAgICAgICAgICAgaW50IHRtcF9yb3dfbWluID0geC0+bXZfcm93X21pbjsKLSAgICAgICAgICAgIGludCB0bXBfcm93X21heCA9IHgtPm12X3Jvd19tYXg7Ci0KLSAgICAgICAgICAgIGludCBzcGVlZF9hZGp1c3QgPSAoY3BpLT5TcGVlZCA+IDUpID8gKChjcGktPlNwZWVkID49IDgpPyAzIDogMikgOiAxOwotCi0gICAgICAgICAgICAvLyBGdXJ0aGVyIHN0ZXAvZGlhbW9uZCBzZWFyY2hlcyBhcyBuZWNlc3NhcnkKLSAgICAgICAgICAgIHN0ZXBfcGFyYW0gPSBjcGktPnNmLmZpcnN0X3N0ZXAgKyBzcGVlZF9hZGp1c3Q7Ci0KLSAgICAgICAgICAgIGlmKGNwaS0+c2YuaW1wcm92ZWRfbXZfcHJlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzciArPSBzcGVlZF9hZGp1c3Q7Ci0gICAgICAgICAgICAgICAgLy9hZGp1c3Qgc2VhcmNoIHJhbmdlIGFjY29yZGluZyB0byBzciBmcm9tIG12IHByZWRpY3Rpb24KLSAgICAgICAgICAgICAgICBpZihzciA+IHN0ZXBfcGFyYW0pCi0gICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0gPSBzcjsKLQotICAgICAgICAgICAgICAgIGNvbF9taW4gPSAoYmVzdF9yZWZfbXYuY29sIC0gTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotICAgICAgICAgICAgICAgIGNvbF9tYXggPSAoYmVzdF9yZWZfbXYuY29sICsgTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotICAgICAgICAgICAgICAgIHJvd19taW4gPSAoYmVzdF9yZWZfbXYucm93IC0gTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotICAgICAgICAgICAgICAgIHJvd19tYXggPSAoYmVzdF9yZWZfbXYucm93ICsgTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IGludGVyc2VjdGlvbiBvZiBVTVYgd2luZG93IGFuZCB2YWxpZCBNViB3aW5kb3cgdG8gcmVkdWNlICMgb2YgY2hlY2tzIGluIGRpYW1vbmQgc2VhcmNoLgotICAgICAgICAgICAgICAgIGlmICh4LT5tdl9jb2xfbWluIDwgY29sX21pbiApCi0gICAgICAgICAgICAgICAgICAgIHgtPm12X2NvbF9taW4gPSBjb2xfbWluOwotICAgICAgICAgICAgICAgIGlmICh4LT5tdl9jb2xfbWF4ID4gY29sX21heCApCi0gICAgICAgICAgICAgICAgICAgIHgtPm12X2NvbF9tYXggPSBjb2xfbWF4OwotICAgICAgICAgICAgICAgIGlmICh4LT5tdl9yb3dfbWluIDwgcm93X21pbiApCi0gICAgICAgICAgICAgICAgICAgIHgtPm12X3Jvd19taW4gPSByb3dfbWluOwotICAgICAgICAgICAgICAgIGlmICh4LT5tdl9yb3dfbWF4ID4gcm93X21heCApCi0gICAgICAgICAgICAgICAgICAgIHgtPm12X3Jvd19tYXggPSByb3dfbWF4OwotICAgICAgICAgICAgfWVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtdnAucm93ID0gYmVzdF9yZWZfbXYucm93OwotICAgICAgICAgICAgICAgIG12cC5jb2wgPSBiZXN0X3JlZl9tdi5jb2w7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZ1cnRoZXJfc3RlcHMgPSAoY3BpLT5TcGVlZCA+PSA4KT8gMDogKGNwaS0+c2YubWF4X3N0ZXBfc2VhcmNoX3N0ZXBzIC0gMSAtIHN0ZXBfcGFyYW0pOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5zZi5zZWFyY2hfbWV0aG9kID09IEhFWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZXN0c21lID0gdnA4X2hleF9zZWFyY2goeCwgYiwgZCwgJm12cCwgJmQtPmJtaS5tdi5hc19tdiwgc3RlcF9wYXJhbSwgc2FkcGIvKngtPmVycm9ycGVyYml0Ki8sICZudW0wMCwgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwgeC0+bXZzYWRjb3N0LCB4LT5tdmNvc3QsICZiZXN0X3JlZl9tdik7Ci0gICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0ucm93ID0gZC0+Ym1pLm12LmFzX212LnJvdzsKLSAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5jb2wgPSBkLT5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlc3RzbWUgPSBjcGktPmRpYW1vbmRfc2VhcmNoX3NhZCh4LCBiLCBkLCAmbXZwLCAmZC0+Ym1pLm12LmFzX212LCBzdGVwX3BhcmFtLCBzYWRwYiAvIDIvKngtPmVycm9ycGVyYml0Ki8sICZudW0wMCwgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwgeC0+bXZzYWRjb3N0LCB4LT5tdmNvc3QsICZiZXN0X3JlZl9tdik7IC8vc2FkcGIgPCA5Ci0gICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0ucm93ID0gZC0+Ym1pLm12LmFzX212LnJvdzsKLSAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5jb2wgPSBkLT5ibWkubXYuYXNfbXYuY29sOwotCi0gICAgICAgICAgICAgICAgLy8gRnVydGhlciBzdGVwL2RpYW1vbmQgc2VhcmNoZXMgYXMgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgICAgICAgICAgLy9mdXJ0aGVyX3N0ZXBzID0gKGNwaS0+c2YubWF4X3N0ZXBfc2VhcmNoX3N0ZXBzIC0gMSkgLSBzdGVwX3BhcmFtOwotCi0gICAgICAgICAgICAgICAgbiA9IG51bTAwOwotICAgICAgICAgICAgICAgIG51bTAwID0gMDsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgZnVydGhlcl9zdGVwcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG4rKzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobnVtMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBudW0wMC0tOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNzbWUgPSBjcGktPmRpYW1vbmRfc2VhcmNoX3NhZCh4LCBiLCBkLCAmbXZwLCAmZC0+Ym1pLm12LmFzX212LCBzdGVwX3BhcmFtICsgbiwgc2FkcGIgLyA0Lyp4LT5lcnJvcnBlcmJpdCovLCAmbnVtMDAsICZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sIHgtPm12c2FkY29zdCwgeC0+bXZjb3N0LCAmYmVzdF9yZWZfbXYpOyAvL3NhZHBiID0gOQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc3NtZSA8IGJlc3RzbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IHRoaXNzbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0ucm93ID0gZC0+Ym1pLm12LmFzX212LnJvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5jb2wgPSBkLT5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmJtaS5tdi5hc19tdi5yb3cgPSBtb2RlX212W05FV01WXS5yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LmNvbCA9IG1vZGVfbXZbTkVXTVZdLmNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoY3BpLT5zZi5pbXByb3ZlZF9tdl9wcmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHgtPm12X2NvbF9taW4gPSB0bXBfY29sX21pbjsKLSAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWF4ID0gdG1wX2NvbF9tYXg7Ci0gICAgICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHRtcF9yb3dfbWluOwotICAgICAgICAgICAgICAgIHgtPm12X3Jvd19tYXggPSB0bXBfcm93X21heDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJlc3RzbWUgPCBJTlRfTUFYKQotICAgICAgICAgICAgICAgIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAoeCwgYiwgZCwgJmQtPmJtaS5tdi5hc19tdiwgJmJlc3RfcmVmX212LCB4LT5lcnJvcnBlcmJpdCwgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwgY3BpLT5tYi5tdmNvc3QpOwotCi0gICAgICAgICAgICBtb2RlX212W05FV01WXS5yb3cgPSBkLT5ibWkubXYuYXNfbXYucm93OwotICAgICAgICAgICAgbW9kZV9tdltORVdNVl0uY29sID0gZC0+Ym1pLm12LmFzX212LmNvbDsKLQotICAgICAgICAgICAgLy8gbXYgY29zdDsKLSAgICAgICAgICAgIHJhdGUyICs9IHZwOF9tdl9iaXRfY29zdCgmbW9kZV9tdltORVdNVl0sICZiZXN0X3JlZl9tdiwgY3BpLT5tYi5tdmNvc3QsIDEyOCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE5FQVJFU1RNVjoKLSAgICAgICAgY2FzZSBORUFSTVY6Ci0KLSAgICAgICAgICAgIGlmIChtb2RlX212W3RoaXNfbW9kZV0ucm93ID09IDAgJiYgbW9kZV9tdlt0aGlzX21vZGVdLmNvbCA9PSAwKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGNhc2UgWkVST01WOgotCi0gICAgICAgICAgICAvLyBUcmFwIHZlY3RvcnMgdGhhdCByZWFjaCBiZXlvbmQgdGhlIFVNViBib3JkZXJzCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgQUxMIE5ldyBNViwgTmVhcmVzdCBNViBOZWFyIE1WIGFuZCBaZXJvIE1WIGNvZGUgZHJvcHMgdGhyb3VnaCB0byB0aGlzIHBvaW50Ci0gICAgICAgICAgICAvLyBiZWNhdXNlIG9mIHRoZSBsYWNrIG9mIGJyZWFrIHN0YXRlbWVudHMgaW4gdGhlIHByZXZpb3VzIHR3byBjYXNlcy4KLSAgICAgICAgICAgIGlmICgoKG1vZGVfbXZbdGhpc19tb2RlXS5yb3cgPj4gMykgPCB4LT5tdl9yb3dfbWluKSB8fCAoKG1vZGVfbXZbdGhpc19tb2RlXS5yb3cgPj4gMykgPiB4LT5tdl9yb3dfbWF4KSB8fAotICAgICAgICAgICAgICAgICgobW9kZV9tdlt0aGlzX21vZGVdLmNvbCA+PiAzKSA8IHgtPm12X2NvbF9taW4pIHx8ICgobW9kZV9tdlt0aGlzX21vZGVdLmNvbCA+PiAzKSA+IHgtPm12X2NvbF9tYXgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICByYXRlMiArPSB2cDhfY29zdF9tdl9yZWYodGhpc19tb2RlLCBtZGNvdW50cyk7Ci0gICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gdGhpc19tb2RlOwotICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYgPSBtb2RlX212W3RoaXNfbW9kZV07Ci0gICAgICAgICAgICB4LT5lX21iZC5ibG9ja1swXS5ibWkubW9kZSA9IHRoaXNfbW9kZTsKLSAgICAgICAgICAgIHgtPmVfbWJkLmJsb2NrWzBdLmJtaS5tdi5hc19pbnQgPSB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19pbnQ7Ci0KLSAgICAgICAgICAgIGRpc3RvcnRpb24yID0gZ2V0X2ludGVyX21icHJlZF9lcnJvcih4LCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLCAodW5zaWduZWQgaW50ICopKCZzc2UpKTsKLQotICAgICAgICAgICAgdGhpc19yZCA9IFJEX0VTVElNQVRFKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUyLCBkaXN0b3J0aW9uMik7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmFjdGl2ZV9tYXBfZW5hYmxlZCAmJiB4LT5hY3RpdmVfcHRyWzBdID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeC0+c2tpcCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzc2UgPCB4LT5lbmNvZGVfYnJlYWtvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdSBhbmQgdiB0byBtYWtlIHN1cmUgc2tpcCBpcyBvawotICAgICAgICAgICAgICAgIGludCBzc2UyID0gMDsKLQotICAgICAgICAgICAgICAgIHNzZTIgPSBWUDhfVVZTU0UoeCwgSUZfUlRDRCgmY3BpLT5ydGNkLnZhcmlhbmNlKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3NlMiAqIDIgPCB4LT5lbmNvZGVfYnJlYWtvdXQpCi0gICAgICAgICAgICAgICAgICAgIHgtPnNraXAgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeC0+c2tpcCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHBlcmltZW50YWwgZGVidWcgY29kZS4KLSAgICAgICAgLy9hbGxfcmRzW21vZGVfaW5kZXhdID0gdGhpc19yZDsKLQotICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfcmQgfHwgeC0+c2tpcCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm90ZSBpbmRleCBvZiBiZXN0IG1vZGUKLSAgICAgICAgICAgIGJlc3RfbW9kZV9pbmRleCA9IG1vZGVfaW5kZXg7Ci0KLSAgICAgICAgICAgICpyZXR1cm5yYXRlID0gcmF0ZTI7Ci0gICAgICAgICAgICAqcmV0dXJuZGlzdG9ydGlvbiA9IGRpc3RvcnRpb24yOwotICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KCZiZXN0X21ibW9kZSwgJngtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLCBzaXplb2YoTUJfTU9ERV9JTkZPKSk7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KCZiZXN0X3BhcnRpdGlvbiwgeC0+cGFydGl0aW9uX2luZm8sIHNpemVvZihQQVJUSVRJT05fSU5GTykpOwotCi0gICAgICAgICAgICBpZiAodGhpc19tb2RlID09IEJfUFJFRCB8fCB0aGlzX21vZGUgPT0gU1BMSVRNVikKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZweF9tZW1jcHkoJmJlc3RfYm1vZGVzW2ldLCAmeC0+ZV9tYmQuYmxvY2tbaV0uYm1pLCBzaXplb2YoQl9NT0RFX0lORk8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVzdF9ibW9kZXNbMF0ubXYgPSB4LT5lX21iZC5ibG9ja1swXS5ibWkubXY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRlc3RpbmcgdGhpcyBtb2RlIGdhdmUgcmlzZSB0byBhbiBpbXByb3ZlbWVudCBpbiBiZXN0IGVycm9yIHNjb3JlLiBMb3dlciB0aHJlc2hvbGQgYSBiaXQgZm9yIG5leHQgdGltZQotICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA9IChjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID49IChNSU5fVEhSRVNITVVMVCArIDIpKSA/IGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gLSAyIDogTUlOX1RIUkVTSE1VTFQ7Ci0gICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW21vZGVfaW5kZXhdID0gKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW21vZGVfaW5kZXhdID4+IDcpICogY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBtb2RlIGRpZCBub3QgaGVscCBpbXByb3ZlIHRoZSBiZXN0IGVycm9yIGNhc2UgdGhlbiByYWlzZSB0aGUgdGhyZXNob2xkIGZvciB0ZXN0aW5nIHRoYXQgbW9kZSBuZXh0IHRpbWUgYXJvdW5kLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gKz0gNDsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPiBNQVhfVEhSRVNITVVMVCkKLSAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gTUFYX1RIUkVTSE1VTFQ7Ci0KLSAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHgtPnNraXApCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBSZWR1Y2UgdGhlIGFjdGl2YXRpb24gUkQgdGhyZXNob2xkcyBmb3IgdGhlIGJlc3QgY2hvaWNlIG1vZGUKLSAgICBpZiAoKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW2Jlc3RfbW9kZV9pbmRleF0gPiAwKSAmJiAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbYmVzdF9tb2RlX2luZGV4XSA8IChJTlRfTUFYID4+IDIpKSkKLSAgICB7Ci0gICAgICAgIGludCBiZXN0X2FkanVzdG1lbnQgPSAoY3BpLT5yZF90aHJlc2hfbXVsdFtiZXN0X21vZGVfaW5kZXhdID4+IDMpOwotCi0gICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XSA9IChjcGktPnJkX3RocmVzaF9tdWx0W2Jlc3RfbW9kZV9pbmRleF0gPj0gKE1JTl9USFJFU0hNVUxUICsgYmVzdF9hZGp1c3RtZW50KSkgPyBjcGktPnJkX3RocmVzaF9tdWx0W2Jlc3RfbW9kZV9pbmRleF0gLSBiZXN0X2FkanVzdG1lbnQgOiBNSU5fVEhSRVNITVVMVDsKLSAgICAgICAgY3BpLT5yZF90aHJlc2hlc1tiZXN0X21vZGVfaW5kZXhdID0gKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW2Jlc3RfbW9kZV9pbmRleF0gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W2Jlc3RfbW9kZV9pbmRleF07Ci0gICAgfQotCi0gICAgLy8gS2VlcCBhIHJlY29yZCBvZiBiZXN0IG1vZGUgaW5kZXggZm9yIHVzZSBpbiBuZXh0IGxvb3AKLSAgICBjcGktPmxhc3RfYmVzdF9tb2RlX2luZGV4ID0gYmVzdF9tb2RlX2luZGV4OwotCi0gICAgaWYgKGJlc3RfbWJtb2RlLm1vZGUgPD0gQl9QUkVEKQotICAgIHsKLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7Ci0gICAgICAgIHZwOF9waWNrX2ludHJhX21idXZfbW9kZSh4KTsKLSAgICAgICAgYmVzdF9tYm1vZGUudXZfbW9kZSA9IHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGU7Ci0gICAgfQotCi0KLSAgICB7Ci0gICAgICAgIGludCB0aGlzX3JkYmluID0gKCpyZXR1cm5kaXN0b3J0aW9uID4+IDcpOwotCi0gICAgICAgIGlmICh0aGlzX3JkYmluID49IDEwMjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXNfcmRiaW4gPSAxMDIzOwotICAgICAgICB9Ci0KLSAgICAgICAgY3BpLT5lcnJvcl9iaW5zW3RoaXNfcmRiaW5dICsrOwotICAgIH0KLQotCi0gICAgaWYgKGNwaS0+aXNfc3JjX2ZyYW1lX2FsdF9yZWYgJiYgKGJlc3RfbWJtb2RlLm1vZGUgIT0gWkVST01WIHx8IGJlc3RfbWJtb2RlLnJlZl9mcmFtZSAhPSBBTFRSRUZfRlJBTUUpKQotICAgIHsKLSAgICAgICAgYmVzdF9tYm1vZGUubW9kZSA9IFpFUk9NVjsKLSAgICAgICAgYmVzdF9tYm1vZGUucmVmX2ZyYW1lID0gQUxUUkVGX0ZSQU1FOwotICAgICAgICBiZXN0X21ibW9kZS5tdi5hc19pbnQgPSAwOwotICAgICAgICBiZXN0X21ibW9kZS51dl9tb2RlID0gMDsKLSAgICAgICAgYmVzdF9tYm1vZGUubWJfc2tpcF9jb2VmZiA9IChjcGktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKSA/IDEgOiAwOwotICAgICAgICBiZXN0X21ibW9kZS5wYXJ0aXRpb25pbmcgPSAwOwotICAgICAgICBiZXN0X21ibW9kZS5kY19kaWZmID0gMDsKLQotICAgICAgICB2cHhfbWVtY3B5KCZ4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaSwgJmJlc3RfbWJtb2RlLCBzaXplb2YoTUJfTU9ERV9JTkZPKSk7Ci0gICAgICAgIHZweF9tZW1jcHkoeC0+cGFydGl0aW9uX2luZm8sICZiZXN0X3BhcnRpdGlvbiwgc2l6ZW9mKFBBUlRJVElPTl9JTkZPKSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9tZW1zZXQoJngtPmVfbWJkLmJsb2NrW2ldLmJtaSwgMCwgc2l6ZW9mKEJfTU9ERV9JTkZPKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19pbnQgPSAwOwotCi0gICAgICAgIHJldHVybiBiZXN0X3JkOwotICAgIH0KLQotCi0gICAgLy8gbWFjcm9ibG9jayBtb2RlcwotICAgIHZweF9tZW1jcHkoJngtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLCAmYmVzdF9tYm1vZGUsIHNpemVvZihNQl9NT0RFX0lORk8pKTsKLSAgICB2cHhfbWVtY3B5KHgtPnBhcnRpdGlvbl9pbmZvLCAmYmVzdF9wYXJ0aXRpb24sIHNpemVvZihQQVJUSVRJT05fSU5GTykpOwotCi0gICAgaWYgKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gQl9QUkVEIHx8IHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9tZW1jcHkoJngtPmVfbWJkLmJsb2NrW2ldLmJtaSwgJmJlc3RfYm1vZGVzW2ldLCBzaXplb2YoQl9NT0RFX0lORk8pKTsKLQotICAgICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X3NldF9tYm1vZGVfYW5kX212cyh4LCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlLCAmYmVzdF9ibW9kZXNbMF0ubXYuYXNfbXYpOwotICAgIH0KLQotICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212ID0geC0+ZV9tYmQuYmxvY2tbMTVdLmJtaS5tdi5hc19tdjsKLQotICAgIHJldHVybiBiZXN0X3JkOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcGlja2ludGVyLmggYi92cDgvZW5jb2Rlci9waWNraW50ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwNjBkNy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9waWNraW50ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX1BJQ0tJTlRFUl9ICi0jZGVmaW5lIF9fSU5DX1BJQ0tJTlRFUl9ICi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCi0KLSNkZWZpbmUgUkRfRVNUSU1BVEUoUk0sRE0sUixEKSAoICgoMTI4KyhSKSooUk0pKSA+PiA4KSArIChETSkqKEQpICkKLWV4dGVybiBpbnQgdnA4X3BpY2tfaW50cmE0eDRtYnlfbW9kZXMoY29uc3QgVlA4X0VOQ09ERVJfUlRDRCAqLCBNQUNST0JMT0NLICptYiwgaW50ICpSYXRlLCBpbnQgKkRpc3RvcnRpb24pOwotZXh0ZXJuIGludCB2cDhfcGlja19pbnRyYV9tYnV2X21vZGUoTUFDUk9CTE9DSyAqbWIpOwotZXh0ZXJuIGludCB2cDhfcGlja19pbnRlcl9tb2RlKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCByZWNvbl95b2Zmc2V0LCBpbnQgcmVjb25fdXZvZmZzZXQsIGludCAqcmV0dXJucmF0ZSwgaW50ICpyZXR1cm5kaXN0b3J0aW9uLCBpbnQgKnJldHVybmludHJhKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcGlja2xwZi5jIGIvdnA4L2VuY29kZXIvcGlja2xwZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjk0YWY2Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3BpY2tscGYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9jb21tb24vb255eGNfaW50LmgiCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLSNpbmNsdWRlICJxdWFudGl6ZS5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgInZweF9zY2FsZS95djEyZXh0ZW5kLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9hbGxvY2NvbW1vbi5oIgotI2lmIEFSQ0hfQVJNCi0jaW5jbHVkZSAidnB4X3BvcnRzL2FybS5oIgotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHZwOF9sb29wX2ZpbHRlcl9mcmFtZShWUDhfQ09NTU9OICpjbSwgICAgTUFDUk9CTE9DS0QgKm1iZCwgIGludCBmaWx0X3ZhbCk7Ci1leHRlcm4gdm9pZCB2cDhfbG9vcF9maWx0ZXJfZnJhbWVfeW9ubHkoVlA4X0NPTU1PTiAqY20sICAgIE1BQ1JPQkxPQ0tEICptYmQsICBpbnQgZmlsdF92YWwsIGludCBzaGFycG5lc3NfbHZsKTsKLWV4dGVybiBpbnQgdnA4X2NhbGNfc3NfZXJyKFlWMTJfQlVGRkVSX0NPTkZJRyAqc291cmNlLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsIGNvbnN0IHZwOF92YXJpYW5jZV9ydGNkX3Z0YWJsZV90ICpydGNkKTsKLSNpZiBIQVZFX0FSTVY3Ci1leHRlcm4gdm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5X25vX2V4dGVuZF9mcmFtZV9ib3JkZXJzX25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotI2VuZGlmCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIElGX1JUQ0QoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBJRl9SVENEKHgpIE5VTEwKLSNlbmRpZgotCi1leHRlcm4gdm9pZAotKCp2cDhfeXYxMl9jb3B5X3BhcnRpYWxfZnJhbWVfcHRyKShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZyYWN0aW9uKTsKLXZvaWQKLXZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYywgaW50IEZyYWN0aW9uKQotewotICAgIHVuc2lnbmVkIGNoYXIgKnNyY195LCAqZHN0X3k7Ci0gICAgaW50IHloZWlnaHQ7Ci0gICAgaW50IHlzdHJpZGU7Ci0gICAgaW50IGJvcmRlcjsKLSAgICBpbnQgeW9mZnNldDsKLSAgICBpbnQgbGluZXN0b2NvcHk7Ci0KLSAgICBib3JkZXIgICA9IHNyY195YmMtPmJvcmRlcjsKLSAgICB5aGVpZ2h0ICA9IHNyY195YmMtPnlfaGVpZ2h0OwotICAgIHlzdHJpZGUgID0gc3JjX3liYy0+eV9zdHJpZGU7Ci0KLSAgICBsaW5lc3RvY29weSA9ICh5aGVpZ2h0ID4+IChGcmFjdGlvbiArIDQpKTsKLQotICAgIGlmIChsaW5lc3RvY29weSA8IDEpCi0gICAgICAgIGxpbmVzdG9jb3B5ID0gMTsKLQotICAgIGxpbmVzdG9jb3B5IDw8PSA0OwotCi0gICAgeW9mZnNldCAgPSB5c3RyaWRlICogKCh5aGVpZ2h0ID4+IDUpICogMTYgLSA4KTsKLSAgICBzcmNfeSA9IHNyY195YmMtPnlfYnVmZmVyICsgeW9mZnNldDsKLSAgICBkc3RfeSA9IGRzdF95YmMtPnlfYnVmZmVyICsgeW9mZnNldDsKLQotICAgIHZweF9tZW1jcHkoZHN0X3ksIHNyY195LCB5c3RyaWRlICoobGluZXN0b2NvcHkgKyAxNikpOwotfQotCi1zdGF0aWMgaW50IHZwOF9jYWxjX3BhcnRpYWxfc3NsX2VycihZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LCBpbnQgRnJhY3Rpb24sIGNvbnN0IHZwOF92YXJpYW5jZV9ydGNkX3Z0YWJsZV90ICpydGNkKQotewotICAgIGludCBpLCBqOwotICAgIGludCBUb3RhbCA9IDA7Ci0gICAgaW50IHNyY29mZnNldCwgZHN0b2Zmc2V0OwotICAgIHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZS0+eV9idWZmZXI7Ci0gICAgdW5zaWduZWQgY2hhciAqZHN0ID0gZGVzdC0+eV9idWZmZXI7Ci0KLSAgICBpbnQgbGluZXN0b2NvcHkgPSAoc291cmNlLT55X2hlaWdodCA+PiAoRnJhY3Rpb24gKyA0KSk7Ci0gICAgKHZvaWQpcnRjZDsKLQotICAgIGlmIChsaW5lc3RvY29weSA8IDEpCi0gICAgICAgIGxpbmVzdG9jb3B5ID0gMTsKLQotICAgIGxpbmVzdG9jb3B5IDw8PSA0OwotCi0KLSAgICBzcmNvZmZzZXQgPSBzb3VyY2UtPnlfc3RyaWRlICAgKiAoZGVzdC0+eV9oZWlnaHQgPj4gNSkgKiAxNjsKLSAgICBkc3RvZmZzZXQgPSBkZXN0LT55X3N0cmlkZSAgICAgKiAoZGVzdC0+eV9oZWlnaHQgPj4gNSkgKiAxNjsKLQotICAgIHNyYyArPSBzcmNvZmZzZXQ7Ci0gICAgZHN0ICs9IGRzdG9mZnNldDsKLQotICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgWSBwbGFuZSByYXcgYW5kIHJlY29uc3RydWN0aW9uIGRhdGEgc3VtbWluZyAoc3F1YXJlIGRpZmZlcmVuY2VzKQotICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc3RvY29weTsgaSArPSAxNikKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBzb3VyY2UtPnlfd2lkdGg7IGogKz0gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBzc2U7Ci0gICAgICAgICAgICBUb3RhbCArPSBWQVJJQU5DRV9JTlZPS0UocnRjZCwgbXNlMTZ4MTYpKHNyYyArIGosIHNvdXJjZS0+eV9zdHJpZGUsIGRzdCArIGosIGRlc3QtPnlfc3RyaWRlLCAmc3NlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYyArPSAxNiAqIHNvdXJjZS0+eV9zdHJpZGU7Ci0gICAgICAgIGRzdCArPSAxNiAqIGRlc3QtPnlfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBUb3RhbDsKLX0KLQotZXh0ZXJuIHZvaWQgdnA4X2xvb3BfZmlsdGVyX3BhcnRpYWxfZnJhbWUKLSgKLSAgICBWUDhfQ09NTU9OICpjbSwKLSAgICBNQUNST0JMT0NLRCAqbWJkLAotICAgIGludCBkZWZhdWx0X2ZpbHRfbHZsLAotICAgIGludCBzaGFycG5lc3NfbHZsLAotICAgIGludCBGcmFjdGlvbgotKTsKLQotLy8gRW5mb3JjZSBhIG1pbmltdW0gZmlsdGVyIGxldmVsIGJhc2VkIHVwb24gYmFzZWxpbmUgUQotc3RhdGljIGludCBnZXRfbWluX2ZpbHRlcl9sZXZlbChWUDhfQ09NUCAqY3BpLCBpbnQgYmFzZV9xaW5kZXgpCi17Ci0gICAgaW50IG1pbl9maWx0ZXJfbGV2ZWw7Ci0KLSAgICBpZiAoY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUgJiYgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgJiYgIWNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgbWluX2ZpbHRlcl9sZXZlbCA9IDA7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGJhc2VfcWluZGV4IDw9IDYpCi0gICAgICAgICAgICBtaW5fZmlsdGVyX2xldmVsID0gMDsKLSAgICAgICAgZWxzZSBpZiAoYmFzZV9xaW5kZXggPD0gMTYpCi0gICAgICAgICAgICBtaW5fZmlsdGVyX2xldmVsID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWluX2ZpbHRlcl9sZXZlbCA9IChiYXNlX3FpbmRleCAvIDgpOwotICAgIH0KLQotICAgIHJldHVybiBtaW5fZmlsdGVyX2xldmVsOwotfQotCi0vLyBFbmZvcmNlIGEgbWF4aW11bSBmaWx0ZXIgbGV2ZWwgYmFzZWQgdXBvbiBiYXNlbGluZSBRCi1zdGF0aWMgaW50IGdldF9tYXhfZmlsdGVyX2xldmVsKFZQOF9DT01QICpjcGksIGludCBiYXNlX3FpbmRleCkKLXsKLSAgICAvLyBQR1cgQXVndXN0IDIwMDY6IEhpZ2hlc3QgZmlsdGVyIHZhbHVlcyBhbG1vc3QgYWx3YXlzIGEgYmFkIGlkZWEKLQotICAgIC8vIGpiYiBjaGc6IDIwMTAwMTE4IC0gbm90IHNvIGFueSBtb3JlIHdpdGggdGhpcyBvdmVycXVhbnQgc3R1ZmYgYWxsb3cgaGlnaCB2YWx1ZXMKLSAgICAvLyB3aXRoIGxvdHMgb2YgaW50cmEgY29taW5nIGluLgotICAgIGludCBtYXhfZmlsdGVyX2xldmVsID0gTUFYX0xPT1BfRklMVEVSIDsvLyogMyAvIDQ7Ci0KLSAgICBpZiAoY3BpLT5zZWN0aW9uX2ludHJhX3JhdGluZyA+IDgpCi0gICAgICAgIG1heF9maWx0ZXJfbGV2ZWwgPSBNQVhfTE9PUF9GSUxURVIgKiAzIC8gNDsKLQotICAgICh2b2lkKSBjcGk7Ci0gICAgKHZvaWQpIGJhc2VfcWluZGV4OwotCi0gICAgcmV0dXJuIG1heF9maWx0ZXJfbGV2ZWw7Ci19Ci0KLXZvaWQgdnA4Y3hfcGlja19maWx0ZXJfbGV2ZWxfZmFzdChZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBWUDhfQ09NUCAqY3BpKQotewotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotCi0gICAgaW50IGJlc3RfZXJyID0gMDsKLSAgICBpbnQgZmlsdF9lcnIgPSAwOwotICAgIGludCBtaW5fZmlsdGVyX2xldmVsID0gMDsKLSAgICBpbnQgbWF4X2ZpbHRlcl9sZXZlbCA9IE1BWF9MT09QX0ZJTFRFUiAqIDMgLyA0OyAgIC8vIFBHVyBBdWd1c3QgMjAwNjogSGlnaGVzdCBmaWx0ZXIgdmFsdWVzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYQotICAgIGludCBmaWx0X3ZhbDsKLSAgICBpbnQgYmVzdF9maWx0X3ZhbCA9IGNtLT5maWx0ZXJfbGV2ZWw7Ci0KLSAgICAvLyAgTWFrZSBhIGNvcHkgb2YgdGhlIHVuZmlsdGVyZWQgLyBwcm9jZXNzZWQgcmVjb24gYnVmZmVyCi0gICAgLy92cDhfeXYxMl9jb3B5X2ZyYW1lX3B0ciggY20tPmZyYW1lX3RvX3Nob3csICZjcGktPmxhc3RfZnJhbWVfdWYgICk7Ci0gICAgdnA4X3l2MTJfY29weV9wYXJ0aWFsX2ZyYW1lX3B0cihjbS0+ZnJhbWVfdG9fc2hvdywgJmNwaS0+bGFzdF9mcmFtZV91ZiwgMyk7Ci0KLSAgICBpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICBjbS0+c2hhcnBuZXNzX2xldmVsID0gMDsKLSAgICBlbHNlCi0gICAgICAgIGNtLT5zaGFycG5lc3NfbGV2ZWwgPSBjcGktPm94Y2YuU2hhcnBuZXNzOwotCi0gICAgLy8gRW5mb3JjZSBhIG1pbmltdW0gZmlsdGVyIGxldmVsIGJhc2VkIHVwb24gUQotICAgIG1pbl9maWx0ZXJfbGV2ZWwgPSBnZXRfbWluX2ZpbHRlcl9sZXZlbChjcGksIGNtLT5iYXNlX3FpbmRleCk7Ci0gICAgbWF4X2ZpbHRlcl9sZXZlbCA9IGdldF9tYXhfZmlsdGVyX2xldmVsKGNwaSwgY20tPmJhc2VfcWluZGV4KTsKLQotICAgIC8vIFN0YXJ0IHRoZSBzZWFyY2ggYXQgdGhlIHByZXZpb3VzIGZyYW1lIGZpbHRlciBsZXZlbCB1bmxlc3MgaXQgaXMgbm93IG91dCBvZiByYW5nZS4KLSAgICBpZiAoY20tPmZpbHRlcl9sZXZlbCA8IG1pbl9maWx0ZXJfbGV2ZWwpCi0gICAgICAgIGNtLT5maWx0ZXJfbGV2ZWwgPSBtaW5fZmlsdGVyX2xldmVsOwotICAgIGVsc2UgaWYgKGNtLT5maWx0ZXJfbGV2ZWwgPiBtYXhfZmlsdGVyX2xldmVsKQotICAgICAgICBjbS0+ZmlsdGVyX2xldmVsID0gbWF4X2ZpbHRlcl9sZXZlbDsKLQotICAgIGZpbHRfdmFsID0gY20tPmZpbHRlcl9sZXZlbDsKLSAgICBiZXN0X2ZpbHRfdmFsID0gZmlsdF92YWw7Ci0KLSAgICAvLyBTZXQgdXAgYWx0ZXJuYXRlIGZpbHRlciB2YWx1ZXMKLQotICAgIC8vIEdldCB0aGUgZXJyIHVzaW5nIHRoZSBwcmV2aW91cyBmcmFtZSdzIGZpbHRlciB2YWx1ZS4KLSAgICB2cDhfbG9vcF9maWx0ZXJfcGFydGlhbF9mcmFtZShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfdmFsLCAwICAsIDMpOwotICAgIGNtLT5sYXN0X2ZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKLSAgICBjbS0+bGFzdF9maWx0ZXJfdHlwZSA9IGNtLT5maWx0ZXJfdHlwZTsKLSAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOwotCi0gICAgYmVzdF9lcnIgPSB2cDhfY2FsY19wYXJ0aWFsX3NzbF9lcnIoc2QsIGNtLT5mcmFtZV90b19zaG93LCAzLCBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotICAgIC8vICBSZS1pbnN0YXRlIHRoZSB1bmZpbHRlcmVkIGZyYW1lCi0gICAgdnA4X3l2MTJfY29weV9wYXJ0aWFsX2ZyYW1lX3B0cigmY3BpLT5sYXN0X2ZyYW1lX3VmLCBjbS0+ZnJhbWVfdG9fc2hvdywgMyk7Ci0KLSAgICBmaWx0X3ZhbCAtPSAoMSArICgoZmlsdF92YWwgPiAxMCkgPyAxIDogMCkpOwotCi0gICAgLy8gU2VhcmNoIGxvd2VyIGZpbHRlciBsZXZlbHMKLSAgICB3aGlsZSAoZmlsdF92YWwgPj0gbWluX2ZpbHRlcl9sZXZlbCkKLSAgICB7Ci0gICAgICAgIC8vIEFwcGx5IHRoZSBsb29wIGZpbHRlcgotICAgICAgICB2cDhfbG9vcF9maWx0ZXJfcGFydGlhbF9mcmFtZShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfdmFsLCAwLCAzKTsKLSAgICAgICAgY20tPmxhc3RfZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOwotICAgICAgICBjbS0+bGFzdF9maWx0ZXJfdHlwZSA9IGNtLT5maWx0ZXJfdHlwZTsKLSAgICAgICAgY20tPmxhc3Rfc2hhcnBuZXNzX2xldmVsID0gY20tPnNoYXJwbmVzc19sZXZlbDsKLQotICAgICAgICAvLyBHZXQgdGhlIGVyciBmb3IgZmlsdGVyZWQgZnJhbWUKLSAgICAgICAgZmlsdF9lcnIgPSB2cDhfY2FsY19wYXJ0aWFsX3NzbF9lcnIoc2QsIGNtLT5mcmFtZV90b19zaG93LCAzLCBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotCi0gICAgICAgIC8vICBSZS1pbnN0YXRlIHRoZSB1bmZpbHRlcmVkIGZyYW1lCi0gICAgICAgIHZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZV9wdHIoJmNwaS0+bGFzdF9mcmFtZV91ZiwgY20tPmZyYW1lX3RvX3Nob3csIDMpOwotCi0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBiZXN0IGNhc2UgcmVjb3JkIG9yIGV4aXQgbG9vcC4KLSAgICAgICAgaWYgKGZpbHRfZXJyIDwgYmVzdF9lcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJlc3RfZXJyID0gZmlsdF9lcnI7Ci0gICAgICAgICAgICBiZXN0X2ZpbHRfdmFsID0gZmlsdF92YWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gQWRqdXN0IGZpbHRlciBsZXZlbAotICAgICAgICBmaWx0X3ZhbCAtPSAoMSArICgoZmlsdF92YWwgPiAxMCkgPyAxIDogMCkpOwotICAgIH0KLQotICAgIC8vIFNlYXJjaCB1cCAobm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkb25lIGZpbHRfdmFsID0gY20tPmZpbHRlcl9sZXZlbCkKLSAgICBmaWx0X3ZhbCA9IGNtLT5maWx0ZXJfbGV2ZWwgKyAoMSArICgoZmlsdF92YWwgPiAxMCkgPyAxIDogMCkpOwotCi0gICAgaWYgKGJlc3RfZmlsdF92YWwgPT0gY20tPmZpbHRlcl9sZXZlbCkKLSAgICB7Ci0gICAgICAgIC8vIFJlc2lzdCByYWlzaW5nIGZpbHRlciBsZXZlbCBmb3IgdmVyeSBzbWFsbCBnYWlucwotICAgICAgICBiZXN0X2VyciAtPSAoYmVzdF9lcnIgPj4gMTApOwotCi0gICAgICAgIHdoaWxlIChmaWx0X3ZhbCA8IG1heF9maWx0ZXJfbGV2ZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBsb29wIGZpbHRlcgotICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX3BhcnRpYWxfZnJhbWUoY20sICZjcGktPm1iLmVfbWJkLCBmaWx0X3ZhbCwgMCwgMyk7Ci0gICAgICAgICAgICBjbS0+bGFzdF9mcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7Ci0gICAgICAgICAgICBjbS0+bGFzdF9maWx0ZXJfdHlwZSA9IGNtLT5maWx0ZXJfdHlwZTsKLSAgICAgICAgICAgIGNtLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGNtLT5zaGFycG5lc3NfbGV2ZWw7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZXJyIGZvciBmaWx0ZXJlZCBmcmFtZQotICAgICAgICAgICAgZmlsdF9lcnIgPSB2cDhfY2FsY19wYXJ0aWFsX3NzbF9lcnIoc2QsIGNtLT5mcmFtZV90b19zaG93LCAzLCBJRl9SVENEKCZjcGktPnJ0Y2QudmFyaWFuY2UpKTsKLQotICAgICAgICAgICAgLy8gIFJlLWluc3RhdGUgdGhlIHVuZmlsdGVyZWQgZnJhbWUKLSAgICAgICAgICAgIHZwOF95djEyX2NvcHlfcGFydGlhbF9mcmFtZV9wdHIoJmNwaS0+bGFzdF9mcmFtZV91ZiwgY20tPmZyYW1lX3RvX3Nob3csIDMpOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJlc3QgY2FzZSByZWNvcmQgb3IgZXhpdCBsb29wLgotICAgICAgICAgICAgaWYgKGZpbHRfZXJyIDwgYmVzdF9lcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90IHJhaXNlIGZpbHRlciBsZXZlbCBpZiBpbXByb3ZlbWVudCBpcyA8IDEgcGFydCBpbiA0MDk2Ci0gICAgICAgICAgICAgICAgYmVzdF9lcnIgPSBmaWx0X2VyciAtIChmaWx0X2VyciA+PiAxMCk7Ci0KLSAgICAgICAgICAgICAgICBiZXN0X2ZpbHRfdmFsID0gZmlsdF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIEFkanVzdCBmaWx0ZXIgbGV2ZWwKLSAgICAgICAgICAgIGZpbHRfdmFsICs9ICgxICsgKChmaWx0X3ZhbCA+IDEwKSA/IDEgOiAwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbS0+ZmlsdGVyX2xldmVsID0gYmVzdF9maWx0X3ZhbDsKLQotICAgIGlmIChjbS0+ZmlsdGVyX2xldmVsIDwgbWluX2ZpbHRlcl9sZXZlbCkKLSAgICAgICAgY20tPmZpbHRlcl9sZXZlbCA9IG1pbl9maWx0ZXJfbGV2ZWw7Ci0KLSAgICBpZiAoY20tPmZpbHRlcl9sZXZlbCA+IG1heF9maWx0ZXJfbGV2ZWwpCi0gICAgICAgIGNtLT5maWx0ZXJfbGV2ZWwgPSBtYXhfZmlsdGVyX2xldmVsOwotfQotCi0vLyBTdHViIGZ1bmN0aW9uIGZvciBub3cgQWx0IExGIG5vdCB1c2VkCi12b2lkIHZwOGN4X3NldF9hbHRfbGZfbGV2ZWwoVlA4X0NPTVAgKmNwaSwgaW50IGZpbHRfdmFsKQotewotICAgIE1BQ1JPQkxPQ0tEICptYmQgPSAmY3BpLT5tYi5lX21iZDsKLSAgICAodm9pZCkgZmlsdF92YWw7Ci0KLSAgICBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzBdID0gY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVswXTsKLSAgICBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzFdID0gY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsxXTsKLSAgICBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzJdID0gY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVsyXTsKLSAgICBtYmQtPnNlZ21lbnRfZmVhdHVyZV9kYXRhW01CX0xWTF9BTFRfTEZdWzNdID0gY3BpLT5zZWdtZW50X2ZlYXR1cmVfZGF0YVtNQl9MVkxfQUxUX0xGXVszXTsKLX0KLQotdm9pZCB2cDhjeF9waWNrX2ZpbHRlcl9sZXZlbChZVjEyX0JVRkZFUl9DT05GSUcgKnNkLCBWUDhfQ09NUCAqY3BpKQotewotICAgIFZQOF9DT01NT04gKmNtID0gJmNwaS0+Y29tbW9uOwotCi0gICAgaW50IGJlc3RfZXJyID0gMDsKLSAgICBpbnQgZmlsdF9lcnIgPSAwOwotICAgIGludCBtaW5fZmlsdGVyX2xldmVsOwotICAgIGludCBtYXhfZmlsdGVyX2xldmVsOwotCi0gICAgaW50IGZpbHRlcl9zdGVwOwotICAgIGludCBmaWx0X2hpZ2ggPSAwOwotICAgIGludCBmaWx0X21pZCA9IGNtLT5maWx0ZXJfbGV2ZWw7ICAgICAgLy8gU3RhcnQgc2VhcmNoIGF0IHByZXZpb3VzIGZyYW1lIGZpbHRlciBsZXZlbAotICAgIGludCBmaWx0X2xvdyA9IDA7Ci0gICAgaW50IGZpbHRfYmVzdDsKLSAgICBpbnQgZmlsdF9kaXJlY3Rpb24gPSAwOwotCi0gICAgaW50IEJpYXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gQmlhcyBhZ2FpbnN0IHJhaXNpbmcgbG9vcCBmaWx0ZXIgYW5kIGluIGZhdm91ciBvZiBsb3dlcmluZyBpdAotCi0gICAgLy8gIE1ha2UgYSBjb3B5IG9mIHRoZSB1bmZpbHRlcmVkIC8gcHJvY2Vzc2VkIHJlY29uIGJ1ZmZlcgotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgaWYgKGNtLT5ydGNkLmZsYWdzICYgSEFTX05FT04pCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbm9fZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbihjbS0+ZnJhbWVfdG9fc2hvdywgJmNwaS0+bGFzdF9mcmFtZV91Zik7Ci0gICAgfQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBlbHNlCi0jZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX0FSTVY3IHx8IENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICB7Ci0gICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyKGNtLT5mcmFtZV90b19zaG93LCAmY3BpLT5sYXN0X2ZyYW1lX3VmKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgIGNtLT5zaGFycG5lc3NfbGV2ZWwgPSAwOwotICAgIGVsc2UKLSAgICAgICAgY20tPnNoYXJwbmVzc19sZXZlbCA9IGNwaS0+b3hjZi5TaGFycG5lc3M7Ci0KLSAgICAvLyBFbmZvcmNlIGEgbWluaW11bSBmaWx0ZXIgbGV2ZWwgYmFzZWQgdXBvbiBRCi0gICAgbWluX2ZpbHRlcl9sZXZlbCA9IGdldF9taW5fZmlsdGVyX2xldmVsKGNwaSwgY20tPmJhc2VfcWluZGV4KTsKLSAgICBtYXhfZmlsdGVyX2xldmVsID0gZ2V0X21heF9maWx0ZXJfbGV2ZWwoY3BpLCBjbS0+YmFzZV9xaW5kZXgpOwotCi0gICAgLy8gU3RhcnQgdGhlIHNlYXJjaCBhdCB0aGUgcHJldmlvdXMgZnJhbWUgZmlsdGVyIGxldmVsIHVubGVzcyBpdCBpcyBub3cgb3V0IG9mIHJhbmdlLgotICAgIGZpbHRfbWlkID0gY20tPmZpbHRlcl9sZXZlbDsKLQotICAgIGlmIChmaWx0X21pZCA8IG1pbl9maWx0ZXJfbGV2ZWwpCi0gICAgICAgIGZpbHRfbWlkID0gbWluX2ZpbHRlcl9sZXZlbDsKLSAgICBlbHNlIGlmIChmaWx0X21pZCA+IG1heF9maWx0ZXJfbGV2ZWwpCi0gICAgICAgIGZpbHRfbWlkID0gbWF4X2ZpbHRlcl9sZXZlbDsKLQotICAgIC8vIERlZmluZSB0aGUgaW5pdGlhbCBzdGVwIHNpemUKLSAgICBmaWx0ZXJfc3RlcCA9IChmaWx0X21pZCA8IDE2KSA/IDQgOiBmaWx0X21pZCAvIDQ7Ci0KLSAgICAvLyBHZXQgYmFzZWxpbmUgZXJyb3Igc2NvcmUKLSAgICB2cDhjeF9zZXRfYWx0X2xmX2xldmVsKGNwaSwgZmlsdF9taWQpOwotICAgIHZwOF9sb29wX2ZpbHRlcl9mcmFtZV95b25seShjbSwgJmNwaS0+bWIuZV9tYmQsIGZpbHRfbWlkLCAwKTsKLSAgICBjbS0+bGFzdF9mcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7Ci0gICAgY20tPmxhc3RfZmlsdGVyX3R5cGUgPSBjbS0+ZmlsdGVyX3R5cGU7Ci0gICAgY20tPmxhc3Rfc2hhcnBuZXNzX2xldmVsID0gY20tPnNoYXJwbmVzc19sZXZlbDsKLQotICAgIGJlc3RfZXJyID0gdnA4X2NhbGNfc3NfZXJyKHNkLCBjbS0+ZnJhbWVfdG9fc2hvdywgSUZfUlRDRCgmY3BpLT5ydGNkLnZhcmlhbmNlKSk7Ci0gICAgZmlsdF9iZXN0ID0gZmlsdF9taWQ7Ci0KLSAgICAvLyAgUmUtaW5zdGF0ZSB0aGUgdW5maWx0ZXJlZCBmcmFtZQotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgaWYgKGNtLT5ydGNkLmZsYWdzICYgSEFTX05FT04pCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbm9fZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbigmY3BpLT5sYXN0X2ZyYW1lX3VmLCBjbS0+ZnJhbWVfdG9fc2hvdyk7Ci0gICAgfQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBlbHNlCi0jZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX0FSTVY3IHx8IENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICB7Ci0gICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfcHRyKCZjcGktPmxhc3RfZnJhbWVfdWYsIGNtLT5mcmFtZV90b19zaG93KTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHdoaWxlIChmaWx0ZXJfc3RlcCA+IDApCi0gICAgewotICAgICAgICBCaWFzID0gKGJlc3RfZXJyID4+ICgxNSAtIChmaWx0X21pZCAvIDgpKSkgKiBmaWx0ZXJfc3RlcDsgLy9QR1cgY2hhbmdlIDEyLzEyLzA2IGZvciBzbWFsbCBpbWFnZXMKLQotICAgICAgICAvLyBqYmIgY2hnOiAyMDEwMDExOCAtIGluIHNlY3Rpb25zIHdpdGggbG90cyBvZiBuZXcgbWF0ZXJpYWwgY29taW5nIGluIGRvbid0IGJpYXMgYXMgbXVjaCB0byBhIGxvdyBmaWx0ZXIgdmFsdWUKLSAgICAgICAgaWYgKGNwaS0+c2VjdGlvbl9pbnRyYV9yYXRpbmcgPCAyMCkKLSAgICAgICAgICAgIEJpYXMgPSBCaWFzICogY3BpLT5zZWN0aW9uX2ludHJhX3JhdGluZyAvIDIwOwotCi0gICAgICAgIGZpbHRfaGlnaCA9ICgoZmlsdF9taWQgKyBmaWx0ZXJfc3RlcCkgPiBtYXhfZmlsdGVyX2xldmVsKSA/IG1heF9maWx0ZXJfbGV2ZWwgOiAoZmlsdF9taWQgKyBmaWx0ZXJfc3RlcCk7Ci0gICAgICAgIGZpbHRfbG93ID0gKChmaWx0X21pZCAtIGZpbHRlcl9zdGVwKSA8IG1pbl9maWx0ZXJfbGV2ZWwpID8gbWluX2ZpbHRlcl9sZXZlbCA6IChmaWx0X21pZCAtIGZpbHRlcl9zdGVwKTsKLQotICAgICAgICBpZiAoKGZpbHRfZGlyZWN0aW9uIDw9IDApICYmIChmaWx0X2xvdyAhPSBmaWx0X21pZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldCBMb3cgZmlsdGVyIGVycm9yIHNjb3JlCi0gICAgICAgICAgICB2cDhjeF9zZXRfYWx0X2xmX2xldmVsKGNwaSwgZmlsdF9sb3cpOwotICAgICAgICAgICAgdnA4X2xvb3BfZmlsdGVyX2ZyYW1lX3lvbmx5KGNtLCAmY3BpLT5tYi5lX21iZCwgZmlsdF9sb3csIDApOwotICAgICAgICAgICAgY20tPmxhc3RfZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOwotICAgICAgICAgICAgY20tPmxhc3RfZmlsdGVyX3R5cGUgPSBjbS0+ZmlsdGVyX3R5cGU7Ci0gICAgICAgICAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOwotCi0gICAgICAgICAgICBmaWx0X2VyciA9IHZwOF9jYWxjX3NzX2VycihzZCwgY20tPmZyYW1lX3RvX3Nob3csIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotCi0gICAgICAgICAgICAvLyAgUmUtaW5zdGF0ZSB0aGUgdW5maWx0ZXJlZCBmcmFtZQotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgICAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbm9fZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbigmY3BpLT5sYXN0X2ZyYW1lX3VmLCBjbS0+ZnJhbWVfdG9fc2hvdyk7Ci0gICAgICAgICAgICB9Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9BUk1WNyB8fCBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV95b25seV9wdHIoJmNwaS0+bGFzdF9mcmFtZV91ZiwgY20tPmZyYW1lX3RvX3Nob3cpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIC8vIElmIHZhbHVlIGlzIGNsb3NlIHRvIHRoZSBiZXN0IHNvIGZhciB0aGVuIGJpYXMgdG93YXJkcyBhIGxvd2VyIGxvb3AgZmlsdGVyIHZhbHVlLgotICAgICAgICAgICAgaWYgKChmaWx0X2VyciAtIEJpYXMpIDwgYmVzdF9lcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2FzIGl0IGFjdHVhbGx5IGJldHRlciB0aGFuIHRoZSBwcmV2aW91cyBiZXN0PwotICAgICAgICAgICAgICAgIGlmIChmaWx0X2VyciA8IGJlc3RfZXJyKQotICAgICAgICAgICAgICAgICAgICBiZXN0X2VyciA9IGZpbHRfZXJyOwotCi0gICAgICAgICAgICAgICAgZmlsdF9iZXN0ID0gZmlsdF9sb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgbG9vayBhdCBmaWx0X2hpZ2gKLSAgICAgICAgaWYgKChmaWx0X2RpcmVjdGlvbiA+PSAwKSAmJiAoZmlsdF9oaWdoICE9IGZpbHRfbWlkKSkKLSAgICAgICAgewotICAgICAgICAgICAgdnA4Y3hfc2V0X2FsdF9sZl9sZXZlbChjcGksIGZpbHRfaGlnaCk7Ci0gICAgICAgICAgICB2cDhfbG9vcF9maWx0ZXJfZnJhbWVfeW9ubHkoY20sICZjcGktPm1iLmVfbWJkLCBmaWx0X2hpZ2gsIDApOwotICAgICAgICAgICAgY20tPmxhc3RfZnJhbWVfdHlwZSA9IGNtLT5mcmFtZV90eXBlOwotICAgICAgICAgICAgY20tPmxhc3RfZmlsdGVyX3R5cGUgPSBjbS0+ZmlsdGVyX3R5cGU7Ci0gICAgICAgICAgICBjbS0+bGFzdF9zaGFycG5lc3NfbGV2ZWwgPSBjbS0+c2hhcnBuZXNzX2xldmVsOwotCi0gICAgICAgICAgICBmaWx0X2VyciA9IHZwOF9jYWxjX3NzX2VycihzZCwgY20tPmZyYW1lX3RvX3Nob3csIElGX1JUQ0QoJmNwaS0+cnRjZC52YXJpYW5jZSkpOwotCi0gICAgICAgICAgICAvLyAgUmUtaW5zdGF0ZSB0aGUgdW5maWx0ZXJlZCBmcmFtZQotI2lmIEhBVkVfQVJNVjcKLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgICAgICBpZiAoY20tPnJ0Y2QuZmxhZ3MgJiBIQVNfTkVPTikKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbm9fZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbigmY3BpLT5sYXN0X2ZyYW1lX3VmLCBjbS0+ZnJhbWVfdG9fc2hvdyk7Ci0gICAgICAgICAgICB9Ci0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9BUk1WNyB8fCBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X3l2MTJfY29weV9mcmFtZV95b25seV9wdHIoJmNwaS0+bGFzdF9mcmFtZV91ZiwgY20tPmZyYW1lX3RvX3Nob3cpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIC8vIFdhcyBpdCBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgYmVzdD8KLSAgICAgICAgICAgIGlmIChmaWx0X2VyciA8IChiZXN0X2VyciAtIEJpYXMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlc3RfZXJyID0gZmlsdF9lcnI7Ci0gICAgICAgICAgICAgICAgZmlsdF9iZXN0ID0gZmlsdF9oaWdoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFsZiB0aGUgc3RlcCBkaXN0YW5jZSBpZiB0aGUgYmVzdCBmaWx0ZXIgdmFsdWUgd2FzIHRoZSBzYW1lIGFzIGxhc3QgdGltZQotICAgICAgICBpZiAoZmlsdF9iZXN0ID09IGZpbHRfbWlkKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWx0ZXJfc3RlcCA9IGZpbHRlcl9zdGVwIC8gMjsKLSAgICAgICAgICAgIGZpbHRfZGlyZWN0aW9uID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbHRfZGlyZWN0aW9uID0gKGZpbHRfYmVzdCA8IGZpbHRfbWlkKSA/IC0xIDogMTsKLSAgICAgICAgICAgIGZpbHRfbWlkID0gZmlsdF9iZXN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY20tPmZpbHRlcl9sZXZlbCA9IGZpbHRfYmVzdDsKLSAgICBjcGktPmxhc3RfYXV0b19maWx0X3ZhbCA9IGZpbHRfYmVzdDsKLSAgICBjcGktPmxhc3RfYXV0b19maWx0X3EgID0gY20tPmJhc2VfcWluZGV4OwotCi0gICAgY3BpLT5mcmFtZXNfc2luY2VfYXV0b19maWx0ZXIgPSAwOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcHBjL2NzeXN0ZW1kZXBlbmRlbnQuYyBiL3ZwOC9lbmNvZGVyL3BwYy9jc3lzdGVtZGVwZW5kZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmQyYTUuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvcHBjL2NzeXN0ZW1kZXBlbmRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9lbmNvZGVyL3ZhcmlhbmNlLmgiCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvb255eF9pbnQuaCIKLQotU0FERnVuY3Rpb24gKnZwOF9zYWQxNngxNjsKLVNBREZ1bmN0aW9uICp2cDhfc2FkMTZ4ODsKLVNBREZ1bmN0aW9uICp2cDhfc2FkOHgxNjsKLVNBREZ1bmN0aW9uICp2cDhfc2FkOHg4OwotU0FERnVuY3Rpb24gKnZwOF9zYWQ0eDQ7Ci0KLXZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfdmFyaWFuY2U0eDQ7Ci12YXJpYW5jZV9mdW5jdGlvbiAqdnA4X3ZhcmlhbmNlOHg4OwotdmFyaWFuY2VfZnVuY3Rpb24gKnZwOF92YXJpYW5jZTh4MTY7Ci12YXJpYW5jZV9mdW5jdGlvbiAqdnA4X3ZhcmlhbmNlMTZ4ODsKLXZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfdmFyaWFuY2UxNngxNjsKLQotdmFyaWFuY2VfZnVuY3Rpb24gKnZwOF9tc2UxNngxNjsKLQotc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0Owotc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4Owotc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uICp2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNjsKLXN1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiAqdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDg7Ci1zdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gKnZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNjsKLQotaW50ICgqdnA4X2Jsb2NrX2Vycm9yKShzaG9ydCAqY29lZmYsIHNob3J0ICpkcWNvZWZmKTsKLWludCAoKnZwOF9tYmJsb2NrX2Vycm9yKShNQUNST0JMT0NLICptYiwgaW50IGRjKTsKLQotaW50ICgqdnA4X21idXZlcnJvcikoTUFDUk9CTE9DSyAqbWIpOwotdW5zaWduZWQgaW50ICgqdnA4X2dldF9tYl9zcykoc2hvcnQgKik7Ci12b2lkICgqdnA4X3Nob3J0X2ZkY3Q0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLXZvaWQgKCp2cDhfc2hvcnRfZmRjdDh4NCkoc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotdm9pZCAoKnZwOF9mYXN0X2ZkY3Q0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLXZvaWQgKCp2cDhfZmFzdF9mZGN0OHg0KShzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci12b2lkICgqc2hvcnRfd2Fsc2g0eDQpKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLQotdm9pZCAoKnZwOF9zdWJ0cmFjdF9iKShCTE9DSyAqYmUsIEJMT0NLRCAqYmQsIGludCBwaXRjaCk7Ci12b2lkICgqdnA4X3N1YnRyYWN0X21ieSkoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHN0cmlkZSk7Ci12b2lkICgqdnA4X3N1YnRyYWN0X21idXYpKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICp1c3JjLCB1bnNpZ25lZCBjaGFyICp2c3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKTsKLXZvaWQgKCp2cDhfZmFzdF9xdWFudGl6ZV9iKShCTE9DSyAqYiwgQkxPQ0tEICpkKTsKLQotdW5zaWduZWQgaW50ICgqdnA4X2dldDE2eDE2cHJlZF9lcnJvcikodW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50IHNyY19zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCByZWZfc3RyaWRlKTsKLXVuc2lnbmVkIGludCAoKnZwOF9nZXQ4eDh2YXIpKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUsIHVuc2lnbmVkIGludCAqU1NFLCBpbnQgKlN1bSk7Ci11bnNpZ25lZCBpbnQgKCp2cDhfZ2V0MTZ4MTZ2YXIpKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUsIHVuc2lnbmVkIGludCAqU1NFLCBpbnQgKlN1bSk7Ci11bnNpZ25lZCBpbnQgKCp2cDhfZ2V0NHg0c3NlX2NzKSh1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgIHNvdXJjZV9zdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIGludCAgcmVjb25fc3RyaWRlKTsKLQotLy8gYyBpbXBvcnRzCi1leHRlcm4gaW50IGJsb2NrX2Vycm9yX2Moc2hvcnQgKmNvZWZmLCBzaG9ydCAqZHFjb2VmZik7Ci1leHRlcm4gaW50IHZwOF9tYmJsb2NrX2Vycm9yX2MoTUFDUk9CTE9DSyAqbWIsIGludCBkYyk7Ci0KLWV4dGVybiBpbnQgdnA4X21idXZlcnJvcl9jKE1BQ1JPQkxPQ0sgKm1iKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDh4OHZhcl9jKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUsIHVuc2lnbmVkIGludCAqU1NFLCBpbnQgKlN1bSk7Ci1leHRlcm4gdm9pZCBzaG9ydF9mZGN0NHg0X2Moc2hvcnQgKmlucHV0LCBzaG9ydCAqb3V0cHV0LCBpbnQgcGl0Y2gpOwotZXh0ZXJuIHZvaWQgc2hvcnRfZmRjdDh4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLWV4dGVybiB2b2lkIHZwOF9zaG9ydF93YWxzaDR4NF9jKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLQotZXh0ZXJuIHZvaWQgdnA4X3N1YnRyYWN0X2JfYyhCTE9DSyAqYmUsIEJMT0NLRCAqYmQsIGludCBwaXRjaCk7Ci1leHRlcm4gdm9pZCBzdWJ0cmFjdF9tYnlfYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKTsKLWV4dGVybiB2b2lkIHN1YnRyYWN0X21idXZfYyhzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqdXNyYywgdW5zaWduZWQgY2hhciAqdnNyYywgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHN0cmlkZSk7Ci1leHRlcm4gdm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX2MoQkxPQ0sgKmIsIEJMT0NLRCAqZCk7Ci0KLWV4dGVybiBTQURGdW5jdGlvbiBzYWQxNngxNl9jOwotZXh0ZXJuIFNBREZ1bmN0aW9uIHNhZDE2eDhfYzsKLWV4dGVybiBTQURGdW5jdGlvbiBzYWQ4eDE2X2M7Ci1leHRlcm4gU0FERnVuY3Rpb24gc2FkOHg4X2M7Ci1leHRlcm4gU0FERnVuY3Rpb24gc2FkNHg0X2M7Ci0KLWV4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2YXJpYW5jZTE2eDE2X2M7Ci1leHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdmFyaWFuY2U4eDE2X2M7Ci1leHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdmFyaWFuY2UxNng4X2M7Ci1leHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdmFyaWFuY2U4eDhfYzsKLWV4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2YXJpYW5jZTR4NF9jOwotZXh0ZXJuIHZhcmlhbmNlX2Z1bmN0aW9uIG1zZTE2eDE2X2M7Ci0KLWV4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X2M7Ci1leHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHN1Yl9waXhlbF92YXJpYW5jZTh4OF9jOwotZXh0ZXJuIHN1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiBzdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2M7Ci1leHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHN1Yl9waXhlbF92YXJpYW5jZTE2eDhfYzsKLWV4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0X21iX3NzX2Moc2hvcnQgKik7Ci1leHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXQxNngxNnByZWRfZXJyb3JfYyh1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBpbnQgc3JjX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50IHJlZl9zdHJpZGUpOwotZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0OHg4dmFyX2ModW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlY29uX3N0cmlkZSwgdW5zaWduZWQgaW50ICpTU0UsIGludCAqU3VtKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDE2eDE2dmFyX2ModW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlY29uX3N0cmlkZSwgdW5zaWduZWQgaW50ICpTU0UsIGludCAqU3VtKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDR4NHNzZV9jc19jKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUpOwotCi0vLyBwcGMKLWV4dGVybiBpbnQgdnA4X2Jsb2NrX2Vycm9yX3BwYyhzaG9ydCAqY29lZmYsIHNob3J0ICpkcWNvZWZmKTsKLQotZXh0ZXJuIHZvaWQgdnA4X3Nob3J0X2ZkY3Q0eDRfcHBjKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKTsKLWV4dGVybiB2b2lkIHZwOF9zaG9ydF9mZGN0OHg0X3BwYyhzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCk7Ci0KLWV4dGVybiB2b2lkIHZwOF9zdWJ0cmFjdF9tYnlfcHBjKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpOwotZXh0ZXJuIHZvaWQgdnA4X3N1YnRyYWN0X21idXZfcHBjKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICp1c3JjLCB1bnNpZ25lZCBjaGFyICp2c3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKTsKLQotZXh0ZXJuIFNBREZ1bmN0aW9uIHZwOF9zYWQxNngxNl9wcGM7Ci1leHRlcm4gU0FERnVuY3Rpb24gdnA4X3NhZDE2eDhfcHBjOwotZXh0ZXJuIFNBREZ1bmN0aW9uIHZwOF9zYWQ4eDE2X3BwYzsKLWV4dGVybiBTQURGdW5jdGlvbiB2cDhfc2FkOHg4X3BwYzsKLWV4dGVybiBTQURGdW5jdGlvbiB2cDhfc2FkNHg0X3BwYzsKLQotZXh0ZXJuIHZhcmlhbmNlX2Z1bmN0aW9uIHZwOF92YXJpYW5jZTE2eDE2X3BwYzsKLWV4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2cDhfdmFyaWFuY2U4eDE2X3BwYzsKLWV4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2cDhfdmFyaWFuY2UxNng4X3BwYzsKLWV4dGVybiB2YXJpYW5jZV9mdW5jdGlvbiB2cDhfdmFyaWFuY2U4eDhfcHBjOwotZXh0ZXJuIHZhcmlhbmNlX2Z1bmN0aW9uIHZwOF92YXJpYW5jZTR4NF9wcGM7Ci1leHRlcm4gdmFyaWFuY2VfZnVuY3Rpb24gdnA4X21zZTE2eDE2X3BwYzsKLQotZXh0ZXJuIHN1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X3BwYzsKLWV4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9wcGM7Ci1leHRlcm4gc3ViX3BpeGVsX3ZhcmlhbmNlX2Z1bmN0aW9uIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X3BwYzsKLWV4dGVybiBzdWJfcGl4ZWxfdmFyaWFuY2VfZnVuY3Rpb24gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfcHBjOwotZXh0ZXJuIHN1Yl9waXhlbF92YXJpYW5jZV9mdW5jdGlvbiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfcHBjOwotCi1leHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXQ4eDh2YXJfcHBjKHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIGludCAgc291cmNlX3N0cmlkZSwgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgaW50ICByZWNvbl9zdHJpZGUsIHVuc2lnbmVkIGludCAqU1NFLCBpbnQgKlN1bSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXQxNngxNnZhcl9wcGModW5zaWduZWQgY2hhciAqc3JjX3B0ciwgaW50ICBzb3VyY2Vfc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLCBpbnQgIHJlY29uX3N0cmlkZSwgdW5zaWduZWQgaW50ICpTU0UsIGludCAqU3VtKTsKLQotdm9pZCB2cDhfY21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKHZvaWQpCi17Ci0gICAgLy8gUHVyZSBDOgotICAgIHZwOF9tYnV2ZXJyb3IgICAgICAgICAgICAgICA9IHZwOF9tYnV2ZXJyb3JfYzsKLSAgICB2cDhfZmFzdF9xdWFudGl6ZV9iICAgICAgICAgICA9IHZwOF9mYXN0X3F1YW50aXplX2JfYzsKLSAgICB2cDhfc2hvcnRfZmRjdDR4NCAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfcHBjOwotICAgIHZwOF9zaG9ydF9mZGN0OHg0ICAgICAgICAgICAgPSB2cDhfc2hvcnRfZmRjdDh4NF9wcGM7Ci0gICAgdnA4X2Zhc3RfZmRjdDR4NCAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0NHg0X3BwYzsKLSAgICB2cDhfZmFzdF9mZGN0OHg0ICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q4eDRfcHBjOwotICAgIHNob3J0X3dhbHNoNHg0ICAgICAgICAgICAgICAgPSB2cDhfc2hvcnRfd2Fsc2g0eDRfYzsKLQotICAgIHZwOF92YXJpYW5jZTR4NCAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTR4NF9wcGM7Ci0gICAgdnA4X3ZhcmlhbmNlOHg4ICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHg4X3BwYzsKLSAgICB2cDhfdmFyaWFuY2U4eDE2ICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U4eDE2X3BwYzsKLSAgICB2cDhfdmFyaWFuY2UxNng4ICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNng4X3BwYzsKLSAgICB2cDhfdmFyaWFuY2UxNngxNiAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNngxNl9wcGM7Ci0gICAgdnA4X21zZTE2eDE2ICAgICAgICAgICAgICAgID0gdnA4X21zZTE2eDE2X3BwYzsKLQotICAgIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDQgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9wcGM7Ci0gICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OCAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X3BwYzsKLSAgICB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNiAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X3BwYzsKLSAgICB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OCAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3BwYzsKLSAgICB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTYgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9wcGM7Ci0KLSAgICB2cDhfZ2V0X21iX3NzICAgICAgICAgICAgICAgICA9IHZwOF9nZXRfbWJfc3NfYzsKLSAgICB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yICAgICAgID0gdnA4X2dldDE2eDE2cHJlZF9lcnJvcl9jOwotICAgIHZwOF9nZXQ4eDh2YXIgICAgICAgICAgICAgICA9IHZwOF9nZXQ4eDh2YXJfcHBjOwotICAgIHZwOF9nZXQxNngxNnZhciAgICAgICAgICAgICA9IHZwOF9nZXQxNngxNnZhcl9wcGM7Ci0gICAgdnA4X2dldDR4NHNzZV9jcyAgICAgICAgICAgID0gdnA4X2dldDR4NHNzZV9jc19jOwotCi0gICAgdnA4X3NhZDE2eDE2ICAgICAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2X3BwYzsKLSAgICB2cDhfc2FkMTZ4OCAgICAgICAgICAgICAgICAgPSB2cDhfc2FkMTZ4OF9wcGM7Ci0gICAgdnA4X3NhZDh4MTYgICAgICAgICAgICAgICAgID0gdnA4X3NhZDh4MTZfcHBjOwotICAgIHZwOF9zYWQ4eDggICAgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDhfcHBjOwotICAgIHZwOF9zYWQ0eDQgICAgICAgICAgICAgICAgICA9IHZwOF9zYWQ0eDRfcHBjOwotCi0gICAgdnA4X2Jsb2NrX2Vycm9yICAgICAgICAgICAgICA9IHZwOF9ibG9ja19lcnJvcl9wcGM7Ci0gICAgdnA4X21iYmxvY2tfZXJyb3IgICAgICAgICAgICA9IHZwOF9tYmJsb2NrX2Vycm9yX2M7Ci0KLSAgICB2cDhfc3VidHJhY3RfYiAgICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X2JfYzsKLSAgICB2cDhfc3VidHJhY3RfbWJ5ICAgICAgICAgICAgID0gdnA4X3N1YnRyYWN0X21ieV9wcGM7Ci0gICAgdnA4X3N1YnRyYWN0X21idXYgICAgICAgICAgICA9IHZwOF9zdWJ0cmFjdF9tYnV2X3BwYzsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3BwYy92YXJpYW5jZV9hbHRpdmVjLmFzbSBiL3ZwOC9lbmNvZGVyL3BwYy92YXJpYW5jZV9hbHRpdmVjLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlYmY2Ni4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9wcGMvdmFyaWFuY2VfYWx0aXZlYy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIC5nbG9ibCB2cDhfZ2V0OHg4dmFyX3BwYwotICAgIC5nbG9ibCB2cDhfZ2V0MTZ4MTZ2YXJfcHBjCi0gICAgLmdsb2JsIHZwOF9tc2UxNngxNl9wcGMKLSAgICAuZ2xvYmwgdnA4X3ZhcmlhbmNlMTZ4MTZfcHBjCi0gICAgLmdsb2JsIHZwOF92YXJpYW5jZTE2eDhfcHBjCi0gICAgLmdsb2JsIHZwOF92YXJpYW5jZTh4MTZfcHBjCi0gICAgLmdsb2JsIHZwOF92YXJpYW5jZTh4OF9wcGMKLSAgICAuZ2xvYmwgdnA4X3ZhcmlhbmNlNHg0X3BwYwotCi0ubWFjcm8gbG9hZF9hbGlnbmVkXzE2IFYgUiBPCi0gICAgbHZzbCAgICB2MywgIDAsIFxSICAgICAgICAgIDsjIHBlcm11dGF0ZSB2YWx1ZSBmb3IgYWxpZ25tZW50Ci0KLSAgICBsdnggICAgIHYxLCAgMCwgXFIKLSAgICBsdnggICAgIHYyLCBcTywgXFIKLQotICAgIHZwZXJtICAgXFYsIHYxLCB2MiwgdjMKLS5lbmRtCi0KLS5tYWNybyBwcm9sb2d1ZQotICAgIG1mc3ByICAgcjExLCAyNTYgICAgICAgICAgICA7IyBnZXQgb2xkIFZSU0FWRQotICAgIG9yaXMgICAgcjEyLCByMTEsIDB4ZmZjMAotICAgIG10c3ByICAgMjU2LCByMTIgICAgICAgICAgICA7IyBzZXQgVlJTQVZFCi0KLSAgICBzdHd1ICAgIHIxLCAtMzIocjEpICAgICAgICAgOyMgY3JlYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotCi0gICAgbGkgICAgICByMTAsIDE2ICAgICAgICAgICAgIDsjIGxvYWQgb2Zmc2V0IGFuZCBsb29wIGNvdW50ZXIKLQotICAgIHZzcGx0aXN3IHY3LCAwICAgICAgICAgICAgICA7IyB6ZXJvIGZvciBtZXJnaW5nCi0gICAgdnNwbHRpc3cgdjgsIDAgICAgICAgICAgICAgIDsjIHplcm8gb3V0IHRvdGFsIHRvIHN0YXJ0Ci0gICAgdnNwbHRpc3cgdjksIDAgICAgICAgICAgICAgIDsjIHplcm8gb3V0IHRvdGFsIGZvciBkaWZeMgotLmVuZG0KLQotLm1hY3JvIGVwaWxvZ3VlCi0gICAgYWRkaSAgICByMSwgcjEsIDMyICAgICAgICAgIDsjIHJlY292ZXIgc3RhY2sKLQotICAgIG10c3ByICAgMjU2LCByMTEgICAgICAgICAgICA7IyByZXNldCBvbGQgVlJTQVZFCi0uZW5kbQotCi0ubWFjcm8gY29tcHV0ZV9zdW1fc3NlCi0gICAgOyMgQ29tcHV0ZSBzdW0gZmlyc3QuICBVbnBhY2sgdG8gc28gc2lnbmVkIHN1YnJhY3QKLSAgICA7IyAgY2FuIGJlIHVzZWQuICBPbmx5IGhhdmUgYSBoYWxmIHdvcmQgc2lnbmVkCi0gICAgOyMgIHN1YnJhY3QuICBEbyBoaWdoLCB0aGVuIGxvdy4KLSAgICB2bXJnaGIgIHYyLCB2NywgdjQKLSAgICB2bXJnaGIgIHYzLCB2NywgdjUKLSAgICB2c3Vic2hzIHYyLCB2MiwgdjMKLSAgICB2c3VtNHNocyB2OCwgdjIsIHY4Ci0KLSAgICB2bXJnbGIgIHYyLCB2NywgdjQKLSAgICB2bXJnbGIgIHYzLCB2NywgdjUKLSAgICB2c3Vic2hzIHYyLCB2MiwgdjMKLSAgICB2c3VtNHNocyB2OCwgdjIsIHY4Ci0KLSAgICA7IyBOb3cgY29tcHV0ZSBzc2UuCi0gICAgdnN1YnVicyB2MiwgdjQsIHY1Ci0gICAgdnN1YnVicyB2MywgdjUsIHY0Ci0gICAgdm9yICAgICB2MiwgdjIsIHYzCi0KLSAgICB2bXN1bXVibSB2OSwgdjIsIHYyLCB2OQotLmVuZG0KLQotLm1hY3JvIHZhcmlhbmNlXzE2IERTIGxvb3BfbGFiZWwgc3RvcmVfc3VtCi1cbG9vcF9sYWJlbDoKLSAgICA7IyBvbmx5IG9uZSBvZiB0aGUgaW5wdXRzIHNob3VsZCBuZWVkIHRvIGJlIGFsaWduZWQuCi0gICAgbG9hZF9hbGlnbmVkXzE2IHY0LCByMywgcjEwCi0gICAgbG9hZF9hbGlnbmVkXzE2IHY1LCByNSwgcjEwCi0KLSAgICA7IyBtb3ZlIG9udG8gdGhlIG5leHQgbGluZQotICAgIGFkZCAgICAgcjMsIHIzLCByNAotICAgIGFkZCAgICAgcjUsIHI1LCByNgotCi0gICAgY29tcHV0ZV9zdW1fc3NlCi0KLSAgICBiZG56ICAgIFxsb29wX2xhYmVsCi0KLSAgICB2c3Vtc3dzIHY4LCB2OCwgdjcKLSAgICB2c3Vtc3dzIHY5LCB2OSwgdjcKLQotICAgIHN0dnggICAgdjgsIDAsIHIxCi0gICAgbHd6ICAgICByMywgMTIocjEpCi0KLSAgICBzdHZ4ICAgIHY5LCAwLCByMQotICAgIGx3eiAgICAgcjQsIDEyKHIxKQotCi0uaWYgXHN0b3JlX3N1bQotICAgIHN0dyAgICAgcjMsIDAocjgpICAgICAgICAgICA7IyBzdW0KLS5lbmRpZgotICAgIHN0dyAgICAgcjQsIDAocjcpICAgICAgICAgICA7IyBzc2UKLQotICAgIG11bGx3ICAgcjMsIHIzLCByMyAgICAgICAgICA7IyBzdW0qc3VtCi0gICAgc3Jhd2kgICByMywgcjMsIFxEUyAgICAgICAgIDsjIChzdW0qc3VtKSA+PiBEUwotICAgIHN1YmYgICAgcjMsIHIzLCByNCAgICAgICAgICA7IyBzc2UgLSAoKHN1bSpzdW0pID4+IERTKQotLmVuZG0KLQotLm1hY3JvIHZhcmlhbmNlXzggRFMgbG9vcF9sYWJlbCBzdG9yZV9zdW0KLVxsb29wX2xhYmVsOgotICAgIDsjIG9ubHkgb25lIG9mIHRoZSBpbnB1dHMgc2hvdWxkIG5lZWQgdG8gYmUgYWxpZ25lZC4KLSAgICBsb2FkX2FsaWduZWRfMTYgdjQsIHIzLCByMTAKLSAgICBsb2FkX2FsaWduZWRfMTYgdjUsIHI1LCByMTAKLQotICAgIDsjIG1vdmUgb250byB0aGUgbmV4dCBsaW5lCi0gICAgYWRkICAgICByMywgcjMsIHI0Ci0gICAgYWRkICAgICByNSwgcjUsIHI2Ci0KLSAgICA7IyBvbmx5IG9uZSBvZiB0aGUgaW5wdXRzIHNob3VsZCBuZWVkIHRvIGJlIGFsaWduZWQuCi0gICAgbG9hZF9hbGlnbmVkXzE2IHY2LCByMywgcjEwCi0gICAgbG9hZF9hbGlnbmVkXzE2IHYwLCByNSwgcjEwCi0KLSAgICA7IyBtb3ZlIG9udG8gdGhlIG5leHQgbGluZQotICAgIGFkZCAgICAgcjMsIHIzLCByNAotICAgIGFkZCAgICAgcjUsIHI1LCByNgotCi0gICAgdm1yZ2hiICB2NCwgdjQsIHY2Ci0gICAgdm1yZ2hiICB2NSwgdjUsIHYwCi0KLSAgICBjb21wdXRlX3N1bV9zc2UKLQotICAgIGJkbnogICAgXGxvb3BfbGFiZWwKLQotICAgIHZzdW1zd3MgdjgsIHY4LCB2NwotICAgIHZzdW1zd3MgdjksIHY5LCB2NwotCi0gICAgc3R2eCAgICB2OCwgMCwgcjEKLSAgICBsd3ogICAgIHIzLCAxMihyMSkKLQotICAgIHN0dnggICAgdjksIDAsIHIxCi0gICAgbHd6ICAgICByNCwgMTIocjEpCi0KLS5pZiBcc3RvcmVfc3VtCi0gICAgc3R3ICAgICByMywgMChyOCkgICAgICAgICAgIDsjIHN1bQotLmVuZGlmCi0gICAgc3R3ICAgICByNCwgMChyNykgICAgICAgICAgIDsjIHNzZQotCi0gICAgbXVsbHcgICByMywgcjMsIHIzICAgICAgICAgIDsjIHN1bSpzdW0KLSAgICBzcmF3aSAgIHIzLCByMywgXERTICAgICAgICAgOyMgKHN1bSpzdW0pID4+IDgKLSAgICBzdWJmICAgIHIzLCByMywgcjQgICAgICAgICAgOyMgc3NlIC0gKChzdW0qc3VtKSA+PiA4KQotLmVuZG0KLQotICAgIC5hbGlnbiAyCi07IyByMyB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IyByNCBpbnQgIHNvdXJjZV9zdHJpZGUKLTsjIHI1IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsjIHI2IGludCAgcmVjb25fc3RyaWRlCi07IyByNyB1bnNpZ25lZCBpbnQgKlNTRQotOyMgcjggaW50ICpTdW0KLTsjCi07IyByMyByZXR1cm4gdmFsdWUKLXZwOF9nZXQ4eDh2YXJfcHBjOgotCi0gICAgcHJvbG9ndWUKLQotICAgIGxpICAgICAgcjksIDQKLSAgICBtdGN0ciAgIHI5Ci0KLSAgICB2YXJpYW5jZV84IDYsIGdldDh4OHZhcl9sb29wLCAxCi0KLSAgICBlcGlsb2d1ZQotCi0gICAgYmxyCi0KLSAgICAuYWxpZ24gMgotOyMgcjMgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyMgcjQgaW50ICBzb3VyY2Vfc3RyaWRlCi07IyByNSB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCi07IyByNiBpbnQgIHJlY29uX3N0cmlkZQotOyMgcjcgdW5zaWduZWQgaW50ICpTU0UKLTsjIHI4IGludCAqU3VtCi07IwotOyMgcjMgcmV0dXJuIHZhbHVlCi12cDhfZ2V0MTZ4MTZ2YXJfcHBjOgotCi0gICAgcHJvbG9ndWUKLQotICAgIG10Y3RyICAgcjEwCi0KLSAgICB2YXJpYW5jZV8xNiA4LCBnZXQxNngxNnZhcl9sb29wLCAxCi0KLSAgICBlcGlsb2d1ZQotCi0gICAgYmxyCi0KLSAgICAuYWxpZ24gMgotOyMgcjMgdW5zaWduZWQgY2hhciAqc3JjX3B0cgotOyMgcjQgaW50ICBzb3VyY2Vfc3RyaWRlCi07IyByNSB1bnNpZ25lZCBjaGFyICpyZWZfcHRyCi07IyByNiBpbnQgIHJlY29uX3N0cmlkZQotOyMgcjcgdW5zaWduZWQgaW50ICpzc2UKLTsjCi07IyByIDMgcmV0dXJuIHZhbHVlCi12cDhfbXNlMTZ4MTZfcHBjOgotICAgIHByb2xvZ3VlCi0KLSAgICBtdGN0ciAgIHIxMAotCi1tc2UxNngxNl9sb29wOgotICAgIDsjIG9ubHkgb25lIG9mIHRoZSBpbnB1dHMgc2hvdWxkIG5lZWQgdG8gYmUgYWxpZ25lZC4KLSAgICBsb2FkX2FsaWduZWRfMTYgdjQsIHIzLCByMTAKLSAgICBsb2FkX2FsaWduZWRfMTYgdjUsIHI1LCByMTAKLQotICAgIDsjIG1vdmUgb250byB0aGUgbmV4dCBsaW5lCi0gICAgYWRkICAgICByMywgcjMsIHI0Ci0gICAgYWRkICAgICByNSwgcjUsIHI2Ci0KLSAgICA7IyBOb3cgY29tcHV0ZSBzc2UuCi0gICAgdnN1YnVicyB2MiwgdjQsIHY1Ci0gICAgdnN1YnVicyB2MywgdjUsIHY0Ci0gICAgdm9yICAgICB2MiwgdjIsIHYzCi0KLSAgICB2bXN1bXVibSB2OSwgdjIsIHYyLCB2OQotCi0gICAgYmRueiAgICBtc2UxNngxNl9sb29wCi0KLSAgICB2c3Vtc3dzIHY5LCB2OSwgdjcKLQotICAgIHN0dnggICAgdjksIDAsIHIxCi0gICAgbHd6ICAgICByMywgMTIocjEpCi0KLSAgICBzdHZ4ICAgIHY5LCAwLCByMQotICAgIGx3eiAgICAgcjMsIDEyKHIxKQotCi0gICAgc3R3ICAgICByMywgMChyNykgICAgICAgICAgIDsjIHNzZQotCi0gICAgZXBpbG9ndWUKLQotICAgIGJscgotCi0gICAgLmFsaWduIDIKLTsjIHIzIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKLTsjIHI0IGludCAgc291cmNlX3N0cmlkZQotOyMgcjUgdW5zaWduZWQgY2hhciAqcmVmX3B0cgotOyMgcjYgaW50ICByZWNvbl9zdHJpZGUKLTsjIHI3IHVuc2lnbmVkIGludCAqc3NlCi07IwotOyMgcjMgcmV0dXJuIHZhbHVlCi12cDhfdmFyaWFuY2UxNngxNl9wcGM6Ci0KLSAgICBwcm9sb2d1ZQotCi0gICAgbXRjdHIgICByMTAKLQotICAgIHZhcmlhbmNlXzE2IDgsIHZhcmlhbmNlMTZ4MTZfbG9vcCwgMAotCi0gICAgZXBpbG9ndWUKLQotICAgIGJscgotCi0gICAgLmFsaWduIDIKLTsjIHIzIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIKLTsjIHI0IGludCAgc291cmNlX3N0cmlkZQotOyMgcjUgdW5zaWduZWQgY2hhciAqcmVmX3B0cgotOyMgcjYgaW50ICByZWNvbl9zdHJpZGUKLTsjIHI3IHVuc2lnbmVkIGludCAqc3NlCi07IwotOyMgcjMgcmV0dXJuIHZhbHVlCi12cDhfdmFyaWFuY2UxNng4X3BwYzoKLQotICAgIHByb2xvZ3VlCi0KLSAgICBsaSAgICAgIHI5LCA4Ci0gICAgbXRjdHIgICByOQotCi0gICAgdmFyaWFuY2VfMTYgNywgdmFyaWFuY2UxNng4X2xvb3AsIDAKLQotICAgIGVwaWxvZ3VlCi0KLSAgICBibHIKLQotICAgIC5hbGlnbiAyCi07IyByMyB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IyByNCBpbnQgIHNvdXJjZV9zdHJpZGUKLTsjIHI1IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsjIHI2IGludCAgcmVjb25fc3RyaWRlCi07IyByNyB1bnNpZ25lZCBpbnQgKnNzZQotOyMKLTsjIHIzIHJldHVybiB2YWx1ZQotdnA4X3ZhcmlhbmNlOHgxNl9wcGM6Ci0KLSAgICBwcm9sb2d1ZQotCi0gICAgbGkgICAgICByOSwgOAotICAgIG10Y3RyICAgcjkKLQotICAgIHZhcmlhbmNlXzggNywgdmFyaWFuY2U4eDE2X2xvb3AsIDAKLQotICAgIGVwaWxvZ3VlCi0KLSAgICBibHIKLQotICAgIC5hbGlnbiAyCi07IyByMyB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IyByNCBpbnQgIHNvdXJjZV9zdHJpZGUKLTsjIHI1IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsjIHI2IGludCAgcmVjb25fc3RyaWRlCi07IyByNyB1bnNpZ25lZCBpbnQgKnNzZQotOyMKLTsjIHIzIHJldHVybiB2YWx1ZQotdnA4X3ZhcmlhbmNlOHg4X3BwYzoKLQotICAgIHByb2xvZ3VlCi0KLSAgICBsaSAgICAgIHI5LCA0Ci0gICAgbXRjdHIgICByOQotCi0gICAgdmFyaWFuY2VfOCA2LCB2YXJpYW5jZTh4OF9sb29wLCAwCi0KLSAgICBlcGlsb2d1ZQotCi0gICAgYmxyCi0KLS5tYWNybyB0cmFuc2Zlcl80eDQgSSBQCi0gICAgbHd6ICAgICByMCwgMChcSSkKLSAgICBhZGQgICAgIFxJLCBcSSwgXFAKLQotICAgIGx3eiAgICAgcjEwLDAoXEkpCi0gICAgYWRkICAgICBcSSwgXEksIFxQCi0KLSAgICBsd3ogICAgIHI4LCAwKFxJKQotICAgIGFkZCAgICAgXEksIFxJLCBcUAotCi0gICAgbHd6ICAgICByOSwgMChcSSkKLQotICAgIHN0dyAgICAgcjAsICAwKHIxKQotICAgIHN0dyAgICAgcjEwLCA0KHIxKQotICAgIHN0dyAgICAgcjgsICA4KHIxKQotICAgIHN0dyAgICAgcjksIDEyKHIxKQotLmVuZG0KLQotICAgIC5hbGlnbiAyCi07IyByMyB1bnNpZ25lZCBjaGFyICpzcmNfcHRyCi07IyByNCBpbnQgIHNvdXJjZV9zdHJpZGUKLTsjIHI1IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIKLTsjIHI2IGludCAgcmVjb25fc3RyaWRlCi07IyByNyB1bnNpZ25lZCBpbnQgKnNzZQotOyMKLTsjIHIzIHJldHVybiB2YWx1ZQotdnA4X3ZhcmlhbmNlNHg0X3BwYzoKLQotICAgIHByb2xvZ3VlCi0KLSAgICB0cmFuc2Zlcl80eDQgcjMsIHI0Ci0gICAgbHZ4ICAgICB2NCwgMCwgcjEKLQotICAgIHRyYW5zZmVyXzR4NCByNSwgcjYKLSAgICBsdnggICAgIHY1LCAwLCByMQotCi0gICAgY29tcHV0ZV9zdW1fc3NlCi0KLSAgICB2c3Vtc3dzIHY4LCB2OCwgdjcKLSAgICB2c3Vtc3dzIHY5LCB2OSwgdjcKLQotICAgIHN0dnggICAgdjgsIDAsIHIxCi0gICAgbHd6ICAgICByMywgMTIocjEpCi0KLSAgICBzdHZ4ICAgIHY5LCAwLCByMQotICAgIGx3eiAgICAgcjQsIDEyKHIxKQotCi0gICAgc3R3ICAgICByNCwgMChyNykgICAgICAgICAgIDsjIHNzZQotCi0gICAgbXVsbHcgICByMywgcjMsIHIzICAgICAgICAgIDsjIHN1bSpzdW0KLSAgICBzcmF3aSAgIHIzLCByMywgNCAgICAgICAgICAgOyMgKHN1bSpzdW0pID4+IDQKLSAgICBzdWJmICAgIHIzLCByMywgcjQgICAgICAgICAgOyMgc3NlIC0gKChzdW0qc3VtKSA+PiA0KQotCi0gICAgZXBpbG9ndWUKLQotICAgIGJscgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcHBjL3ZhcmlhbmNlX3N1YnBpeGVsX2FsdGl2ZWMuYXNtIGIvdnA4L2VuY29kZXIvcHBjL3ZhcmlhbmNlX3N1YnBpeGVsX2FsdGl2ZWMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDEzNjBiLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3BwYy92YXJpYW5jZV9zdWJwaXhlbF9hbHRpdmVjLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDg2NSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgLmdsb2JsIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfcHBjCi0gICAgLmdsb2JsIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfcHBjCi0gICAgLmdsb2JsIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X3BwYwotICAgIC5nbG9ibCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9wcGMKLSAgICAuZ2xvYmwgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3BwYwotCi0ubWFjcm8gbG9hZF9jIFYsIExBQkVMLCBPRkYsIFIwLCBSMQotICAgIGxpcyAgICAgXFIwLCBcTEFCRUxAaGEKLSAgICBsYSAgICAgIFxSMSwgXExBQkVMQGwoXFIwKQotICAgIGx2eCAgICAgXFYsIFxPRkYsIFxSMQotLmVuZG0KLQotLm1hY3JvIGxvYWRfdmZpbHRlciBWMCwgVjEKLSAgICBsb2FkX2MgXFYwLCB2ZmlsdGVyX2IsIHI2LCByMTIsIHIxMAotCi0gICAgYWRkaSAgICByNiwgIHI2LCAxNgotICAgIGx2eCAgICAgXFYxLCByNiwgcjEwCi0uZW5kbQotCi0ubWFjcm8gSFByb2xvZyBqdW1wX2xhYmVsCi0gICAgOyMgbG9hZCB1cCBob3Jpem9udGFsIGZpbHRlcgotICAgIHNsd2kuICAgcjUsIHI1LCA0ICAgICAgICAgICA7IyBpbmRleCBpbnRvIGhvcml6b250YWwgZmlsdGVyIGFycmF5Ci0KLSAgICA7IyBpbmRleCB0byB0aGUgbmV4dCBzZXQgb2YgdmVjdG9ycyBpbiB0aGUgcm93LgotICAgIGxpICAgICAgcjEwLCAxNgotCi0gICAgOyMgZG93bnNoaWZ0IGJ5IDcgKCBkaXZpZGUgYnkgMTI4ICkgYXQgdGhlIGVuZAotICAgIHZzcGx0aXNoIHYxOSwgNwotCi0gICAgOyMgSWYgdGhlcmUgaXNuJ3QgYW55IGZpbHRlcmluZyB0byBiZSBkb25lIGZvciB0aGUgaG9yaXpvbnRhbCwgdGhlbgotICAgIDsjICBqdXN0IHNraXAgdG8gdGhlIHNlY29uZCBwYXNzLgotICAgIGJlcSAgICAgXGp1bXBfbGFiZWwKLQotICAgIGxvYWRfYyB2MjAsIGhmaWx0ZXJfYiwgcjUsIHIxMiwgcjAKLQotICAgIDsjIHNldHVwIGNvbnN0YW50cwotICAgIDsjIHYxNCBwZXJtdXRhdGlvbiB2YWx1ZSBmb3IgYWxpZ25tZW50Ci0gICAgbG9hZF9jIHYyOCwgYl9ocGVybV9iLCAwLCByMTIsIHIwCi0KLSAgICA7IyBpbmRleCB0byB0aGUgbmV4dCBzZXQgb2YgdmVjdG9ycyBpbiB0aGUgcm93LgotICAgIGxpICAgICAgcjEyLCAzMgotCi0gICAgOyMgcm91bmRpbmcgYWRkZWQgaW4gb24gdGhlIG11bHRpcGx5Ci0gICAgdnNwbHRpc3cgdjIxLCA4Ci0gICAgdnNwbHRpc3cgdjE4LCAzCi0gICAgdnNsdyAgICB2MTgsIHYyMSwgdjE4ICAgICAgIDsjIDB4MDAwMDAwNDAwMDAwMDA0MDAwMDAwMDQwMDAwMDAwNDAKLQotICAgIHNsd2kuICAgcjYsIHI2LCA1ICAgICAgICAgICA7IyBpbmRleCBpbnRvIHZlcnRpY2FsIGZpbHRlciBhcnJheQotLmVuZG0KLQotOyMgRmlsdGVycyBhIGhvcml6b250YWwgbGluZQotOyMgZXhwZWN0czoKLTsjICByMyAgc3JjX3B0cgotOyMgIHI0ICBwaXRjaAotOyMgIHIxMCAxNgotOyMgIHIxMiAzMgotOyMgIHYxNyBwZXJtIGludHB1dAotOyMgIHYxOCByb3VuZGluZwotOyMgIHYxOSBzaGlmdAotOyMgIHYyMCBmaWx0ZXIgdGFwcwotOyMgIHYyMSB0bXAKLTsjICB2MjIgdG1wCi07IyAgdjIzIHRtcAotOyMgIHYyNCB0bXAKLTsjICB2MjUgdG1wCi07IyAgdjI2IHRtcAotOyMgIHYyNyB0bXAKLTsjICB2MjggcGVybSBvdXRwdXQKLTsjCi0KLS5tYWNybyBoZmlsdGVyXzggViwgaHAsIGxwLCBpbmNyZW1lbnRfY291bnRlcgotICAgIGx2c2wgICAgdjE3LCAgMCwgcjMgICAgICAgICA7IyBwZXJtdXRhdGUgdmFsdWUgZm9yIGFsaWdubWVudAotCi0gICAgOyMgaW5wdXQgdG8gZmlsdGVyIGlzIDkgYnl0ZXMgd2lkZSwgb3V0cHV0IGlzIDggYnl0ZXMuCi0gICAgbHZ4ICAgICB2MjEsICAgMCwgcjMKLSAgICBsdnggICAgIHYyMiwgcjEwLCByMwotCi0uaWYgXGluY3JlbWVudF9jb3VudGVyCi0gICAgYWRkICAgICByMywgcjMsIHI0Ci0uZW5kaWYKLSAgICB2cGVybSAgIHYyMSwgdjIxLCB2MjIsIHYxNwotCi0gICAgdnBlcm0gICB2MjQsIHYyMSwgdjIxLCBcaHAgIDsjIHYyMCA9IDAxMjMgMTIzNCAyMzQ1IDM0NTYKLSAgICB2cGVybSAgIHYyNSwgdjIxLCB2MjEsIFxscCAgOyMgdjIxID0gNDU2NyA1Njc4IDY3ODkgNzg5QQotCi0gICAgdm1zdW1tYm0gdjI0LCB2MjAsIHYyNCwgdjE4Ci0gICAgdm1zdW1tYm0gdjI1LCB2MjAsIHYyNSwgdjE4Ci0KLSAgICB2cGtzd3VzIHYyNCwgdjI0LCB2MjUgICAgICAgOyMgdjI0ID0gMCA0IDggQyAxIDUgOSBEICgxNi1iaXQpCi0KLSAgICB2c3JoICAgIHYyNCwgdjI0LCB2MTkgICAgICAgOyMgZGl2aWRlIHYwLCB2MSBieSAxMjgKLQotICAgIHZwa3VodXMgXFYsIHYyNCwgdjI0ICAgICAgICA7IyBcViA9IHNjcmFtYmxlZCA4LWJpdCByZXN1bHQKLS5lbmRtCi0KLS5tYWNybyB2ZmlsdGVyXzE2IFAwIFAxCi0gICAgdm11bGV1YiB2MjIsIFxQMCwgdjIwICAgICAgIDsjIDY0ICsgNCBwb3NpdGl2ZSB0YXBzCi0gICAgdmFkZHVobSB2MjIsIHYxOCwgdjIyCi0gICAgdm11bG91YiB2MjMsIFxQMCwgdjIwCi0gICAgdmFkZHVobSB2MjMsIHYxOCwgdjIzCi0KLSAgICB2bXVsZXViIHYyNCwgXFAxLCB2MjEKLSAgICB2YWRkdWhtIHYyMiwgdjIyLCB2MjQgICAgICAgOyMgUmUgPSBldmVucywgc2F0dXJhdGlvbiB1bm5lY2Vzc2FyeQotICAgIHZtdWxvdWIgdjI1LCBcUDEsIHYyMQotICAgIHZhZGR1aG0gdjIzLCB2MjMsIHYyNSAgICAgICA7IyBSbyA9IG9kZHMKLQotICAgIHZzcmggICAgdjIyLCB2MjIsIHYxOSAgICAgICA7IyBkaXZpZGUgYnkgMTI4Ci0gICAgdnNyaCAgICB2MjMsIHYyMywgdjE5ICAgICAgIDsjIHYxNiB2MTcgPSBldmVucywgb2RkcwotICAgIHZtcmdoaCAgXFAwLCB2MjIsIHYyMyAgICAgICA7IyB2MTggdjE5ID0gMTYtYml0IHJlc3VsdCBpbiBvcmRlcgotICAgIHZtcmdsaCAgdjIzLCB2MjIsIHYyMwotICAgIHZwa3VodXMgXFAwLCBcUDAsIHYyMyAgICAgICA7IyBQMCA9IDgtYml0IHJlc3VsdAotLmVuZG0KLQotLm1hY3JvIGNvbXB1dGVfc3VtX3NzZSBzcmMsIHJlZiwgc3VtLCBzc2UsIHQxLCB0MiwgejAKLSAgICA7IyBDb21wdXRlIHN1bSBmaXJzdC4gIFVucGFjayB0byBzbyBzaWduZWQgc3VicmFjdAotICAgIDsjICBjYW4gYmUgdXNlZC4gIE9ubHkgaGF2ZSBhIGhhbGYgd29yZCBzaWduZWQKLSAgICA7IyAgc3VicmFjdC4gIERvIGhpZ2gsIHRoZW4gbG93LgotICAgIHZtcmdoYiAgXHQxLCBcejAsIFxzcmMKLSAgICB2bXJnaGIgIFx0MiwgXHowLCBccmVmCi0gICAgdnN1YnNocyBcdDEsIFx0MSwgXHQyCi0gICAgdnN1bTRzaHMgXHN1bSwgXHQxLCBcc3VtCi0KLSAgICB2bXJnbGIgIFx0MSwgXHowLCBcc3JjCi0gICAgdm1yZ2xiICBcdDIsIFx6MCwgXHJlZgotICAgIHZzdWJzaHMgXHQxLCBcdDEsIFx0MgotICAgIHZzdW00c2hzIFxzdW0sIFx0MSwgXHN1bQotCi0gICAgOyMgTm93IGNvbXB1dGUgc3NlLgotICAgIHZzdWJ1YnMgXHQxLCBcc3JjLCBccmVmCi0gICAgdnN1YnVicyBcdDIsIFxyZWYsIFxzcmMKLSAgICB2b3IgICAgIFx0MSwgXHQxLCBcdDIKLQotICAgIHZtc3VtdWJtIFxzc2UsIFx0MSwgXHQxLCBcc3NlCi0uZW5kbQotCi0ubWFjcm8gdmFyaWFuY2VfZmluYWwgc3VtLCBzc2UsIHowLCBEUwotICAgIHZzdW1zd3MgXHN1bSwgXHN1bSwgXHowCi0gICAgdnN1bXN3cyBcc3NlLCBcc3NlLCBcejAKLQotICAgIHN0dnggICAgXHN1bSwgMCwgcjEKLSAgICBsd3ogICAgIHIzLCAxMihyMSkKLQotICAgIHN0dnggICAgXHNzZSwgMCwgcjEKLSAgICBsd3ogICAgIHI0LCAxMihyMSkKLQotICAgIHN0dyAgICAgcjQsIDAocjkpICAgICAgICAgICA7IyBzc2UKLQotICAgIG11bGx3ICAgcjMsIHIzLCByMyAgICAgICAgICA7IyBzdW0qc3VtCi0gICAgc3Jhd2kgICByMywgcjMsIFxEUyAgICAgICAgIDsjIChzdW0qc3VtKSA+PiA4Ci0gICAgc3ViZiAgICByMywgcjMsIHI0ICAgICAgICAgIDsjIHNzZSAtICgoc3VtKnN1bSkgPj4gOCkKLS5lbmRtCi0KLS5tYWNybyBjb21wdXRlX3N1bV9zc2VfMTYgViwgaW5jcmVtZW50X2NvdW50ZXIKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiAgdjE2LCByNywgcjgsIFxpbmNyZW1lbnRfY291bnRlcgotICAgIGNvbXB1dGVfc3VtX3NzZSBcViwgdjE2LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMwotLmVuZG0KLQotLm1hY3JvIGxvYWRfYW5kX2FsaWduXzE2IFYsIFIsIFAsIGluY3JlbWVudF9jb3VudGVyCi0gICAgbHZzbCAgICB2MTcsICAwLCBcUiAgICAgICAgIDsjIHBlcm11dGF0ZSB2YWx1ZSBmb3IgYWxpZ25tZW50Ci0KLSAgICA7IyBpbnB1dCB0byBmaWx0ZXIgaXMgMjEgYnl0ZXMgd2lkZSwgb3V0cHV0IGlzIDE2IGJ5dGVzLgotICAgIDsjICBpbnB1dCB3aWxsIGNhbiBzcGFuIHRocmVlIHZlY3RvcnMgaWYgbm90IGFsaWduZWQgY29ycmVjdGx5LgotICAgIGx2eCAgICAgdjIxLCAgIDAsIFxSCi0gICAgbHZ4ICAgICB2MjIsIHIxMCwgXFIKLQotLmlmIFxpbmNyZW1lbnRfY291bnRlcgotICAgIGFkZCAgICAgXFIsIFxSLCBcUAotLmVuZGlmCi0KLSAgICB2cGVybSAgIFxWLCB2MjEsIHYyMiwgdjE3Ci0uZW5kbQotCi0gICAgLmFsaWduIDIKLTsjIHIzIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyCi07IyByNCBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUKLTsjIHI1IGludCAgeG9mZnNldAotOyMgcjYgaW50ICB5b2Zmc2V0Ci07IyByNyB1bnNpZ25lZCBjaGFyICpkc3RfcHRyCi07IyByOCBpbnQgZHN0X3BpeGVsc19wZXJfbGluZQotOyMgcjkgdW5zaWduZWQgaW50ICpzc2UKLTsjCi07IyByMyByZXR1cm4gdmFsdWUKLXZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfcHBjOgotICAgIG1mc3ByICAgcjExLCAyNTYgICAgICAgICAgICA7IyBnZXQgb2xkIFZSU0FWRQotICAgIG9yaXMgICAgcjEyLCByMTEsIDB4ZjgzMAotICAgIG9yaSAgICAgcjEyLCByMTIsIDB4ZmZmOAotICAgIG10c3ByICAgMjU2LCByMTIgICAgICAgICAgICA7IyBzZXQgVlJTQVZFCi0KLSAgICBzdHd1ICAgIHIxLC0zMihyMSkgICAgICAgICAgOyMgY3JlYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotCi0gICAgSFByb2xvZyBzZWNvbmRfcGFzc180eDRfcHJlX2NvcHlfYgotCi0gICAgOyMgTG9hZCB1cCBwZXJtdXRhdGlvbiBjb25zdGFudHMKLSAgICBsb2FkX2MgdjEwLCBiXzAxMjNfYiwgMCwgcjEyLCByMAotICAgIGxvYWRfYyB2MTEsIGJfNDU2N19iLCAwLCByMTIsIHIwCi0KLSAgICBoZmlsdGVyXzggdjAsIHYxMCwgdjExLCAxCi0gICAgaGZpbHRlcl84IHYxLCB2MTAsIHYxMSwgMQotICAgIGhmaWx0ZXJfOCB2MiwgdjEwLCB2MTEsIDEKLSAgICBoZmlsdGVyXzggdjMsIHYxMCwgdjExLCAxCi0KLSAgICA7IyBGaW5pc2hlZCBmaWx0ZXJpbmcgbWFpbiBob3Jpem9udGFsIGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8KLSAgICA7IyAgdmVydGljYWwgZmlsdGVyaW5nLCBqdW1wIHRvIHN0b3JpbmcgdGhlIGRhdGEuICBPdGhlcndpc2UKLSAgICA7IyAgbG9hZCB1cCBhbmQgZmlsdGVyIHRoZSBhZGRpdGlvbmFsIGxpbmUgdGhhdCBpcyBuZWVkZWQKLSAgICA7IyAgZm9yIHRoZSB2ZXJ0aWNhbCBmaWx0ZXIuCi0gICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfNHg0X2IKLQotICAgIGhmaWx0ZXJfOCB2NCwgdjEwLCB2MTEsIDAKLQotICAgIGIgICBzZWNvbmRfcGFzc180eDRfYgotCi1zZWNvbmRfcGFzc180eDRfcHJlX2NvcHlfYjoKLSAgICBzbHdpICAgIHI2LCByNiwgNSAgICAgICAgICAgOyMgaW5kZXggaW50byB2ZXJ0aWNhbCBmaWx0ZXIgYXJyYXkKLQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYwLCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MSwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjIsIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYzLCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NCwgcjMsIHI0LCAwCi0KLXNlY29uZF9wYXNzXzR4NF9iOgotICAgIHZzcGx0aXNoIHYyMCwgOAotICAgIHZzcGx0aXNoIHYxOCwgMwotICAgIHZzbGggICAgdjE4LCB2MjAsIHYxOCAgICAgICA7IyAweDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MAotCi0gICAgbG9hZF92ZmlsdGVyIHYyMCwgdjIxCi0KLSAgICB2ZmlsdGVyXzE2IHYwLCAgdjEKLSAgICB2ZmlsdGVyXzE2IHYxLCAgdjIKLSAgICB2ZmlsdGVyXzE2IHYyLCAgdjMKLSAgICB2ZmlsdGVyXzE2IHYzLCAgdjQKLQotY29tcHV0ZV9zdW1fc3NlXzR4NF9iOgotICAgIHZzcGx0aXNoIHYxOCwgMCAgICAgICAgICAgICA7IyBzdW0KLSAgICB2c3BsdGlzaCB2MTksIDAgICAgICAgICAgICAgOyMgc3NlCi0gICAgdnNwbHRpc2ggdjIzLCAwICAgICAgICAgICAgIDsjIHVucGFjawotICAgIGxpICAgICAgcjEwLCAxNgotCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjQsIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY1LCByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NiwgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjcsIHI3LCByOCwgMQotCi0gICAgdm1yZ2hiICB2MCwgdjAsIHYxCi0gICAgdm1yZ2hiICB2MSwgdjIsIHYzCi0KLSAgICB2bXJnaGIgIHYyLCB2NCwgdjUKLSAgICB2bXJnaGIgIHYzLCB2NiwgdjcKLQotICAgIGxvYWRfYyB2MTAsIGJfaGlsb19iLCAwLCByMTIsIHIwCi0KLSAgICB2cGVybSAgIHYwLCB2MCwgdjEsIHYxMAotICAgIHZwZXJtICAgdjEsIHYyLCB2MywgdjEwCi0KLSAgICBjb21wdXRlX3N1bV9zc2UgdjAsIHYxLCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMwotCi0gICAgdmFyaWFuY2VfZmluYWwgdjE4LCB2MTksIHYyMywgNAotCi0gICAgYWRkaSAgICByMSwgcjEsIDMyICAgICAgICAgIDsjIHJlY292ZXIgc3RhY2sKLSAgICBtdHNwciAgIDI1NiwgcjExICAgICAgICAgICAgOyMgcmVzZXQgb2xkIFZSU0FWRQotCi0gICAgYmxyCi0KLSAgICAuYWxpZ24gMgotOyMgcjMgdW5zaWduZWQgY2hhciAgKnNyY19wdHIKLTsjIHI0IGludCAgc3JjX3BpeGVsc19wZXJfbGluZQotOyMgcjUgaW50ICB4b2Zmc2V0Ci07IyByNiBpbnQgIHlvZmZzZXQKLTsjIHI3IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIKLTsjIHI4IGludCBkc3RfcGl4ZWxzX3Blcl9saW5lCi07IyByOSB1bnNpZ25lZCBpbnQgKnNzZQotOyMKLTsjIHIzIHJldHVybiB2YWx1ZQotdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9wcGM6Ci0gICAgbWZzcHIgICByMTEsIDI1NiAgICAgICAgICAgIDsjIGdldCBvbGQgVlJTQVZFCi0gICAgb3JpcyAgICByMTIsIHIxMSwgMHhmZmYwCi0gICAgb3JpICAgICByMTIsIHIxMiwgMHhmZmZmCi0gICAgbXRzcHIgICAyNTYsIHIxMiAgICAgICAgICAgIDsjIHNldCBWUlNBVkUKLQotICAgIHN0d3UgICAgcjEsLTMyKHIxKSAgICAgICAgICA7IyBjcmVhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCi0KLSAgICBIUHJvbG9nIHNlY29uZF9wYXNzXzh4OF9wcmVfY29weV9iCi0KLSAgICA7IyBMb2FkIHVwIHBlcm11dGF0aW9uIGNvbnN0YW50cwotICAgIGxvYWRfYyB2MTAsIGJfMDEyM19iLCAwLCByMTIsIHIwCi0gICAgbG9hZF9jIHYxMSwgYl80NTY3X2IsIDAsIHIxMiwgcjAKLQotICAgIGhmaWx0ZXJfOCB2MCwgdjEwLCB2MTEsIDEKLSAgICBoZmlsdGVyXzggdjEsIHYxMCwgdjExLCAxCi0gICAgaGZpbHRlcl84IHYyLCB2MTAsIHYxMSwgMQotICAgIGhmaWx0ZXJfOCB2MywgdjEwLCB2MTEsIDEKLSAgICBoZmlsdGVyXzggdjQsIHYxMCwgdjExLCAxCi0gICAgaGZpbHRlcl84IHY1LCB2MTAsIHYxMSwgMQotICAgIGhmaWx0ZXJfOCB2NiwgdjEwLCB2MTEsIDEKLSAgICBoZmlsdGVyXzggdjcsIHYxMCwgdjExLCAxCi0KLSAgICA7IyBGaW5pc2hlZCBmaWx0ZXJpbmcgbWFpbiBob3Jpem9udGFsIGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8KLSAgICA7IyAgdmVydGljYWwgZmlsdGVyaW5nLCBqdW1wIHRvIHN0b3JpbmcgdGhlIGRhdGEuICBPdGhlcndpc2UKLSAgICA7IyAgbG9hZCB1cCBhbmQgZmlsdGVyIHRoZSBhZGRpdGlvbmFsIGxpbmUgdGhhdCBpcyBuZWVkZWQKLSAgICA7IyAgZm9yIHRoZSB2ZXJ0aWNhbCBmaWx0ZXIuCi0gICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfOHg4X2IKLQotICAgIGhmaWx0ZXJfOCB2OCwgdjEwLCB2MTEsIDAKLQotICAgIGIgICBzZWNvbmRfcGFzc184eDhfYgotCi1zZWNvbmRfcGFzc184eDhfcHJlX2NvcHlfYjoKLSAgICBzbHdpLiAgIHI2LCByNiwgNSAgICAgICAgICAgOyMgaW5kZXggaW50byB2ZXJ0aWNhbCBmaWx0ZXIgYXJyYXkKLQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYwLCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MSwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjIsIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYzLCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NCwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjUsIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY2LCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NywgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjgsIHIzLCByNCwgMAotCi0gICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfOHg4X2IKLQotc2Vjb25kX3Bhc3NfOHg4X2I6Ci0gICAgdnNwbHRpc2ggdjIwLCA4Ci0gICAgdnNwbHRpc2ggdjE4LCAzCi0gICAgdnNsaCAgICB2MTgsIHYyMCwgdjE4ICAgOyMgMHgwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAKLQotICAgIGxvYWRfdmZpbHRlciB2MjAsIHYyMQotCi0gICAgdmZpbHRlcl8xNiB2MCwgdjEKLSAgICB2ZmlsdGVyXzE2IHYxLCB2MgotICAgIHZmaWx0ZXJfMTYgdjIsIHYzCi0gICAgdmZpbHRlcl8xNiB2MywgdjQKLSAgICB2ZmlsdGVyXzE2IHY0LCB2NQotICAgIHZmaWx0ZXJfMTYgdjUsIHY2Ci0gICAgdmZpbHRlcl8xNiB2NiwgdjcKLSAgICB2ZmlsdGVyXzE2IHY3LCB2OAotCi1jb21wdXRlX3N1bV9zc2VfOHg4X2I6Ci0gICAgdnNwbHRpc2ggdjE4LCAwICAgICAgICAgICAgIDsjIHN1bQotICAgIHZzcGx0aXNoIHYxOSwgMCAgICAgICAgICAgICA7IyBzc2UKLSAgICB2c3BsdGlzaCB2MjMsIDAgICAgICAgICAgICAgOyMgdW5wYWNrCi0gICAgbGkgICAgICByMTAsIDE2Ci0KLSAgICB2bXJnaGIgIHYwLCB2MCwgdjEKLSAgICB2bXJnaGIgIHYxLCB2MiwgdjMKLSAgICB2bXJnaGIgIHYyLCB2NCwgdjUKLSAgICB2bXJnaGIgIHYzLCB2NiwgdjcKLQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY0LCAgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjUsICByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NiwgIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY3LCAgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjgsICByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2OSwgIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMCwgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjExLCByNywgcjgsIDAKLQotICAgIHZtcmdoYiAgdjQsIHY0LCAgdjUKLSAgICB2bXJnaGIgIHY1LCB2NiwgIHY3Ci0gICAgdm1yZ2hiICB2NiwgdjgsICB2OQotICAgIHZtcmdoYiAgdjcsIHYxMCwgdjExCi0KLSAgICBjb21wdXRlX3N1bV9zc2UgdjAsIHY0LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMwotICAgIGNvbXB1dGVfc3VtX3NzZSB2MSwgdjUsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHYyLCB2NiwgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjMKLSAgICBjb21wdXRlX3N1bV9zc2UgdjMsIHY3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMwotCi0gICAgdmFyaWFuY2VfZmluYWwgdjE4LCB2MTksIHYyMywgNgotCi0gICAgYWRkaSAgICByMSwgcjEsIDMyICAgICAgICAgIDsjIHJlY292ZXIgc3RhY2sKLSAgICBtdHNwciAgIDI1NiwgcjExICAgICAgICAgICAgOyMgcmVzZXQgb2xkIFZSU0FWRQotICAgIGJscgotCi0gICAgLmFsaWduIDIKLTsjIHIzIHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyCi07IyByNCBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUKLTsjIHI1IGludCAgeG9mZnNldAotOyMgcjYgaW50ICB5b2Zmc2V0Ci07IyByNyB1bnNpZ25lZCBjaGFyICpkc3RfcHRyCi07IyByOCBpbnQgZHN0X3BpeGVsc19wZXJfbGluZQotOyMgcjkgdW5zaWduZWQgaW50ICpzc2UKLTsjCi07IyByMyByZXR1cm4gdmFsdWUKLXZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X3BwYzoKLSAgICBtZnNwciAgIHIxMSwgMjU2ICAgICAgICAgICAgOyMgZ2V0IG9sZCBWUlNBVkUKLSAgICBvcmlzICAgIHIxMiwgcjExLCAweGZmZmYKLSAgICBvcmkgICAgIHIxMiwgcjEyLCAweGZmZmMKLSAgICBtdHNwciAgIDI1NiwgcjEyICAgICAgICAgICAgOyMgc2V0IFZSU0FWRQotCi0gICAgc3R3dSAgICByMSwtMzIocjEpICAgICAgICAgIDsjIGNyZWF0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKLQotICAgIEhQcm9sb2cgc2Vjb25kX3Bhc3NfOHgxNl9wcmVfY29weV9iCi0KLSAgICA7IyBMb2FkIHVwIHBlcm11dGF0aW9uIGNvbnN0YW50cwotICAgIGxvYWRfYyB2MjksIGJfMDEyM19iLCAwLCByMTIsIHIwCi0gICAgbG9hZF9jIHYzMCwgYl80NTY3X2IsIDAsIHIxMiwgcjAKLQotICAgIGhmaWx0ZXJfOCB2MCwgIHYyOSwgdjMwLCAxCi0gICAgaGZpbHRlcl84IHYxLCAgdjI5LCB2MzAsIDEKLSAgICBoZmlsdGVyXzggdjIsICB2MjksIHYzMCwgMQotICAgIGhmaWx0ZXJfOCB2MywgIHYyOSwgdjMwLCAxCi0gICAgaGZpbHRlcl84IHY0LCAgdjI5LCB2MzAsIDEKLSAgICBoZmlsdGVyXzggdjUsICB2MjksIHYzMCwgMQotICAgIGhmaWx0ZXJfOCB2NiwgIHYyOSwgdjMwLCAxCi0gICAgaGZpbHRlcl84IHY3LCAgdjI5LCB2MzAsIDEKLSAgICBoZmlsdGVyXzggdjgsICB2MjksIHYzMCwgMQotICAgIGhmaWx0ZXJfOCB2OSwgIHYyOSwgdjMwLCAxCi0gICAgaGZpbHRlcl84IHYxMCwgdjI5LCB2MzAsIDEKLSAgICBoZmlsdGVyXzggdjExLCB2MjksIHYzMCwgMQotICAgIGhmaWx0ZXJfOCB2MTIsIHYyOSwgdjMwLCAxCi0gICAgaGZpbHRlcl84IHYxMywgdjI5LCB2MzAsIDEKLSAgICBoZmlsdGVyXzggdjE0LCB2MjksIHYzMCwgMQotICAgIGhmaWx0ZXJfOCB2MTUsIHYyOSwgdjMwLCAxCi0KLSAgICA7IyBGaW5pc2hlZCBmaWx0ZXJpbmcgbWFpbiBob3Jpem9udGFsIGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8KLSAgICA7IyAgdmVydGljYWwgZmlsdGVyaW5nLCBqdW1wIHRvIHN0b3JpbmcgdGhlIGRhdGEuICBPdGhlcndpc2UKLSAgICA7IyAgbG9hZCB1cCBhbmQgZmlsdGVyIHRoZSBhZGRpdGlvbmFsIGxpbmUgdGhhdCBpcyBuZWVkZWQKLSAgICA7IyAgZm9yIHRoZSB2ZXJ0aWNhbCBmaWx0ZXIuCi0gICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfOHgxNl9iCi0KLSAgICBoZmlsdGVyXzggdjE2LCB2MjksIHYzMCwgMAotCi0gICAgYiAgIHNlY29uZF9wYXNzXzh4MTZfYgotCi1zZWNvbmRfcGFzc184eDE2X3ByZV9jb3B5X2I6Ci0gICAgc2x3aS4gICByNiwgcjYsIDUgICAgICAgICAgIDsjIGluZGV4IGludG8gdmVydGljYWwgZmlsdGVyIGFycmF5Ci0KLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MCwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxLCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjIsICByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MywgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY0LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjUsICByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2NiwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY3LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjgsICByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2OSwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMCwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjExLCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTIsIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMywgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjE0LCByMywgcjQsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTUsIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxNiwgcjMsIHI0LCAwCi0KLSAgICBiZXEgICAgIGNvbXB1dGVfc3VtX3NzZV84eDE2X2IKLQotc2Vjb25kX3Bhc3NfOHgxNl9iOgotICAgIHZzcGx0aXNoIHYyMCwgOAotICAgIHZzcGx0aXNoIHYxOCwgMwotICAgIHZzbGggICAgdjE4LCB2MjAsIHYxOCAgIDsjIDB4MDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwCi0KLSAgICBsb2FkX3ZmaWx0ZXIgdjIwLCB2MjEKLQotICAgIHZmaWx0ZXJfMTYgdjAsICB2MQotICAgIHZmaWx0ZXJfMTYgdjEsICB2MgotICAgIHZmaWx0ZXJfMTYgdjIsICB2MwotICAgIHZmaWx0ZXJfMTYgdjMsICB2NAotICAgIHZmaWx0ZXJfMTYgdjQsICB2NQotICAgIHZmaWx0ZXJfMTYgdjUsICB2NgotICAgIHZmaWx0ZXJfMTYgdjYsICB2NwotICAgIHZmaWx0ZXJfMTYgdjcsICB2OAotICAgIHZmaWx0ZXJfMTYgdjgsICB2OQotICAgIHZmaWx0ZXJfMTYgdjksICB2MTAKLSAgICB2ZmlsdGVyXzE2IHYxMCwgdjExCi0gICAgdmZpbHRlcl8xNiB2MTEsIHYxMgotICAgIHZmaWx0ZXJfMTYgdjEyLCB2MTMKLSAgICB2ZmlsdGVyXzE2IHYxMywgdjE0Ci0gICAgdmZpbHRlcl8xNiB2MTQsIHYxNQotICAgIHZmaWx0ZXJfMTYgdjE1LCB2MTYKLQotY29tcHV0ZV9zdW1fc3NlXzh4MTZfYjoKLSAgICB2c3BsdGlzaCB2MTgsIDAgICAgICAgICAgICAgOyMgc3VtCi0gICAgdnNwbHRpc2ggdjE5LCAwICAgICAgICAgICAgIDsjIHNzZQotICAgIHZzcGx0aXNoIHYyMywgMCAgICAgICAgICAgICA7IyB1bnBhY2sKLSAgICBsaSAgICAgIHIxMCwgMTYKLQotICAgIHZtcmdoYiAgdjAsIHYwLCAgdjEKLSAgICB2bXJnaGIgIHYxLCB2MiwgIHYzCi0gICAgdm1yZ2hiICB2MiwgdjQsICB2NQotICAgIHZtcmdoYiAgdjMsIHY2LCAgdjcKLSAgICB2bXJnaGIgIHY0LCB2OCwgIHY5Ci0gICAgdm1yZ2hiICB2NSwgdjEwLCB2MTEKLSAgICB2bXJnaGIgIHY2LCB2MTIsIHYxMwotICAgIHZtcmdoYiAgdjcsIHYxNCwgdjE1Ci0KLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2OCwgIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY5LCAgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEwLCByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTEsIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMiwgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEzLCByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTQsIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxNSwgcjcsIHI4LCAxCi0KLSAgICB2bXJnaGIgIHY4LCAgdjgsICB2OQotICAgIHZtcmdoYiAgdjksICB2MTAsIHYxMQotICAgIHZtcmdoYiAgdjEwLCB2MTIsIHYxMwotICAgIHZtcmdoYiAgdjExLCB2MTQsIHYxNQotCi0gICAgY29tcHV0ZV9zdW1fc3NlIHYwLCB2OCwgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHYxLCB2OSwgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHYyLCB2MTAsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHYzLCB2MTEsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0KLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2OCwgIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHY5LCAgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEwLCByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTEsIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxMiwgcjcsIHI4LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgdjEzLCByNywgcjgsIDEKLSAgICBsb2FkX2FuZF9hbGlnbl8xNiB2MTQsIHI3LCByOCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2IHYxNSwgcjcsIHI4LCAwCi0KLSAgICB2bXJnaGIgIHY4LCAgdjgsICB2OQotICAgIHZtcmdoYiAgdjksICB2MTAsIHYxMQotICAgIHZtcmdoYiAgdjEwLCB2MTIsIHYxMwotICAgIHZtcmdoYiAgdjExLCB2MTQsIHYxNQotCi0gICAgY29tcHV0ZV9zdW1fc3NlIHY0LCB2OCwgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHY1LCB2OSwgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHY2LCB2MTAsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0gICAgY29tcHV0ZV9zdW1fc3NlIHY3LCB2MTEsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIzCi0KLSAgICB2YXJpYW5jZV9maW5hbCB2MTgsIHYxOSwgdjIzLCA3Ci0KLSAgICBhZGRpICAgIHIxLCByMSwgMzIgICAgICAgICAgOyMgcmVjb3ZlciBzdGFjawotICAgIG10c3ByICAgMjU2LCByMTEgICAgICAgICAgICA7IyByZXNldCBvbGQgVlJTQVZFCi0gICAgYmxyCi0KLTsjIEZpbHRlcnMgYSBob3Jpem9udGFsIGxpbmUKLTsjIGV4cGVjdHM6Ci07IyAgcjMgIHNyY19wdHIKLTsjICByNCAgcGl0Y2gKLTsjICByMTAgMTYKLTsjICByMTIgMzIKLTsjICB2MTcgcGVybSBpbnRwdXQKLTsjICB2MTggcm91bmRpbmcKLTsjICB2MTkgc2hpZnQKLTsjICB2MjAgZmlsdGVyIHRhcHMKLTsjICB2MjEgdG1wCi07IyAgdjIyIHRtcAotOyMgIHYyMyB0bXAKLTsjICB2MjQgdG1wCi07IyAgdjI1IHRtcAotOyMgIHYyNiB0bXAKLTsjICB2MjcgdG1wCi07IyAgdjI4IHBlcm0gb3V0cHV0Ci07IwotLm1hY3JvIGhmaWx0ZXJfMTYgViwgaW5jcmVtZW50X2NvdW50ZXIKLQotICAgIGx2c2wgICAgdjE3LCAgMCwgcjMgICAgICAgICA7IyBwZXJtdXRhdGUgdmFsdWUgZm9yIGFsaWdubWVudAotCi0gICAgOyMgaW5wdXQgdG8gZmlsdGVyIGlzIDIxIGJ5dGVzIHdpZGUsIG91dHB1dCBpcyAxNiBieXRlcy4KLSAgICA7IyAgaW5wdXQgd2lsbCBjYW4gc3BhbiB0aHJlZSB2ZWN0b3JzIGlmIG5vdCBhbGlnbmVkIGNvcnJlY3RseS4KLSAgICBsdnggICAgIHYyMSwgICAwLCByMwotICAgIGx2eCAgICAgdjIyLCByMTAsIHIzCi0gICAgbHZ4ICAgICB2MjMsIHIxMiwgcjMKLQotLmlmIFxpbmNyZW1lbnRfY291bnRlcgotICAgIGFkZCAgICAgcjMsIHIzLCByNAotLmVuZGlmCi0gICAgdnBlcm0gICB2MjEsIHYyMSwgdjIyLCB2MTcKLSAgICB2cGVybSAgIHYyMiwgdjIyLCB2MjMsIHYxNyAgOyMgdjggdjkgPSAyMSBpbnB1dCBwaXhlbHMgbGVmdC1qdXN0aWZpZWQKLQotICAgIDsjIHNldCAwCi0gICAgdm1zdW1tYm0gdjI0LCB2MjAsIHYyMSwgdjE4IDsjIHRhcHMgdGltZXMgZWxlbWVudHMKLQotICAgIDsjIHNldCAxCi0gICAgdnNsZG9pICB2MjMsIHYyMSwgdjIyLCAxCi0gICAgdm1zdW1tYm0gdjI1LCB2MjAsIHYyMywgdjE4Ci0KLSAgICA7IyBzZXQgMgotICAgIHZzbGRvaSAgdjIzLCB2MjEsIHYyMiwgMgotICAgIHZtc3VtbWJtIHYyNiwgdjIwLCB2MjMsIHYxOAotCi0gICAgOyMgc2V0IDMKLSAgICB2c2xkb2kgIHYyMywgdjIxLCB2MjIsIDMKLSAgICB2bXN1bW1ibSB2MjcsIHYyMCwgdjIzLCB2MTgKLQotICAgIHZwa3N3dXMgdjI0LCB2MjQsIHYyNSAgICAgICA7IyB2MjQgPSAwIDQgOCBDIDEgNSA5IEQgKDE2LWJpdCkKLSAgICB2cGtzd3VzIHYyNSwgdjI2LCB2MjcgICAgICAgOyMgdjI1ID0gMiA2IEEgRSAzIDcgQiBGCi0KLSAgICB2c3JoICAgIHYyNCwgdjI0LCB2MTkgICAgICAgOyMgZGl2aWRlIHYwLCB2MSBieSAxMjgKLSAgICB2c3JoICAgIHYyNSwgdjI1LCB2MTkKLQotICAgIHZwa3VodXMgXFYsIHYyNCwgdjI1ICAgICAgICA7IyBcViA9IHNjcmFtYmxlZCA4LWJpdCByZXN1bHQKLSAgICB2cGVybSAgIFxWLCBcViwgdjAsIHYyOCAgICAgOyMgXFYgPSBjb3JyZWN0bHktb3JkZXJlZCByZXN1bHQKLS5lbmRtCi0KLSAgICAuYWxpZ24gMgotOyMgcjMgdW5zaWduZWQgY2hhciAgKnNyY19wdHIKLTsjIHI0IGludCAgc3JjX3BpeGVsc19wZXJfbGluZQotOyMgcjUgaW50ICB4b2Zmc2V0Ci07IyByNiBpbnQgIHlvZmZzZXQKLTsjIHI3IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIKLTsjIHI4IGludCBkc3RfcGl4ZWxzX3Blcl9saW5lCi07IyByOSB1bnNpZ25lZCBpbnQgKnNzZQotOyMKLTsjIHIzIHJldHVybiB2YWx1ZQotdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfcHBjOgotICAgIG1mc3ByICAgcjExLCAyNTYgICAgICAgICAgICA7IyBnZXQgb2xkIFZSU0FWRQotICAgIG9yaXMgICAgcjEyLCByMTEsIDB4ZmZmZgotICAgIG9yaSAgICAgcjEyLCByMTIsIDB4ZmZmOAotICAgIG10c3ByICAgMjU2LCByMTIgICAgICAgICAgICA7IyBzZXQgVlJTQVZFCi0KLSAgICBzdHd1ICAgIHIxLCAtMzIocjEpICAgICAgICAgOyMgY3JlYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotCi0gICAgSFByb2xvZyBzZWNvbmRfcGFzc18xNng4X3ByZV9jb3B5X2IKLQotICAgIGhmaWx0ZXJfMTYgdjAsIDEKLSAgICBoZmlsdGVyXzE2IHYxLCAxCi0gICAgaGZpbHRlcl8xNiB2MiwgMQotICAgIGhmaWx0ZXJfMTYgdjMsIDEKLSAgICBoZmlsdGVyXzE2IHY0LCAxCi0gICAgaGZpbHRlcl8xNiB2NSwgMQotICAgIGhmaWx0ZXJfMTYgdjYsIDEKLSAgICBoZmlsdGVyXzE2IHY3LCAxCi0KLSAgICA7IyBGaW5pc2hlZCBmaWx0ZXJpbmcgbWFpbiBob3Jpem9udGFsIGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8KLSAgICA7IyAgdmVydGljYWwgZmlsdGVyaW5nLCBqdW1wIHRvIHN0b3JpbmcgdGhlIGRhdGEuICBPdGhlcndpc2UKLSAgICA7IyAgbG9hZCB1cCBhbmQgZmlsdGVyIHRoZSBhZGRpdGlvbmFsIGxpbmUgdGhhdCBpcyBuZWVkZWQKLSAgICA7IyAgZm9yIHRoZSB2ZXJ0aWNhbCBmaWx0ZXIuCi0gICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfMTZ4OF9iCi0KLSAgICBoZmlsdGVyXzE2IHY4LCAwCi0KLSAgICBiICAgc2Vjb25kX3Bhc3NfMTZ4OF9iCi0KLXNlY29uZF9wYXNzXzE2eDhfcHJlX2NvcHlfYjoKLSAgICBzbHdpLiAgIHI2LCByNiwgNSAgICAgICAgICAgOyMgaW5kZXggaW50byB2ZXJ0aWNhbCBmaWx0ZXIgYXJyYXkKLQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MCwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MSwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MiwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2MywgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NCwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NSwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NiwgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2NywgIHIzLCByNCwgMQotICAgIGxvYWRfYW5kX2FsaWduXzE2ICB2OCwgIHIzLCByNCwgMQotCi0gICAgYmVxICAgICBjb21wdXRlX3N1bV9zc2VfMTZ4OF9iCi0KLXNlY29uZF9wYXNzXzE2eDhfYjoKLSAgICB2c3BsdGlzaCB2MjAsIDgKLSAgICB2c3BsdGlzaCB2MTgsIDMKLSAgICB2c2xoICAgIHYxOCwgdjIwLCB2MTggICA7IyAweDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MAotCi0gICAgbG9hZF92ZmlsdGVyIHYyMCwgdjIxCi0KLSAgICB2ZmlsdGVyXzE2IHYwLCAgdjEKLSAgICB2ZmlsdGVyXzE2IHYxLCAgdjIKLSAgICB2ZmlsdGVyXzE2IHYyLCAgdjMKLSAgICB2ZmlsdGVyXzE2IHYzLCAgdjQKLSAgICB2ZmlsdGVyXzE2IHY0LCAgdjUKLSAgICB2ZmlsdGVyXzE2IHY1LCAgdjYKLSAgICB2ZmlsdGVyXzE2IHY2LCAgdjcKLSAgICB2ZmlsdGVyXzE2IHY3LCAgdjgKLQotY29tcHV0ZV9zdW1fc3NlXzE2eDhfYjoKLSAgICB2c3BsdGlzaCB2MTgsIDAgICAgICAgICAgICAgOyMgc3VtCi0gICAgdnNwbHRpc2ggdjE5LCAwICAgICAgICAgICAgIDsjIHNzZQotICAgIHZzcGx0aXNoIHYyMywgMCAgICAgICAgICAgICA7IyB1bnBhY2sKLSAgICBsaSAgICAgIHIxMCwgMTYKLQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MCwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MSwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MiwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MywgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2NCwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2NSwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2NiwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2NywgMAotCi0gICAgdmFyaWFuY2VfZmluYWwgdjE4LCB2MTksIHYyMywgNwotCi0gICAgYWRkaSAgICByMSwgcjEsIDMyICAgICAgICAgIDsjIHJlY292ZXIgc3RhY2sKLQotICAgIG10c3ByICAgMjU2LCByMTEgICAgICAgICAgICA7IyByZXNldCBvbGQgVlJTQVZFCi0KLSAgICBibHIKLQotICAgIC5hbGlnbiAyCi07IyByMyB1bnNpZ25lZCBjaGFyICAqc3JjX3B0cgotOyMgcjQgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lCi07IyByNSBpbnQgIHhvZmZzZXQKLTsjIHI2IGludCAgeW9mZnNldAotOyMgcjcgdW5zaWduZWQgY2hhciAqZHN0X3B0cgotOyMgcjggaW50IGRzdF9waXhlbHNfcGVyX2xpbmUKLTsjIHI5IHVuc2lnbmVkIGludCAqc3NlCi07IwotOyMgcjMgcmV0dXJuIHZhbHVlCi12cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfcHBjOgotICAgIG1mc3ByICAgcjExLCAyNTYgICAgICAgICAgICA7IyBnZXQgb2xkIFZSU0FWRQotICAgIG9yaXMgICAgcjEyLCByMTEsIDB4ZmZmZgotICAgIG9yaSAgICAgcjEyLCByMTIsIDB4ZmZmOAotICAgIG10c3ByICAgMjU2LCByMTIgICAgICAgICAgICA7IyBzZXQgVlJTQVZFCi0KLSAgICBzdHd1ICAgIHIxLCAtMzIocjEpICAgICAgICAgOyMgY3JlYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotCi0gICAgSFByb2xvZyBzZWNvbmRfcGFzc18xNngxNl9wcmVfY29weV9iCi0KLSAgICBoZmlsdGVyXzE2IHYwLCAgMQotICAgIGhmaWx0ZXJfMTYgdjEsICAxCi0gICAgaGZpbHRlcl8xNiB2MiwgIDEKLSAgICBoZmlsdGVyXzE2IHYzLCAgMQotICAgIGhmaWx0ZXJfMTYgdjQsICAxCi0gICAgaGZpbHRlcl8xNiB2NSwgIDEKLSAgICBoZmlsdGVyXzE2IHY2LCAgMQotICAgIGhmaWx0ZXJfMTYgdjcsICAxCi0gICAgaGZpbHRlcl8xNiB2OCwgIDEKLSAgICBoZmlsdGVyXzE2IHY5LCAgMQotICAgIGhmaWx0ZXJfMTYgdjEwLCAxCi0gICAgaGZpbHRlcl8xNiB2MTEsIDEKLSAgICBoZmlsdGVyXzE2IHYxMiwgMQotICAgIGhmaWx0ZXJfMTYgdjEzLCAxCi0gICAgaGZpbHRlcl8xNiB2MTQsIDEKLSAgICBoZmlsdGVyXzE2IHYxNSwgMQotCi0gICAgOyMgRmluaXNoZWQgZmlsdGVyaW5nIG1haW4gaG9yaXpvbnRhbCBibG9jay4gIElmIHRoZXJlIGlzIG5vCi0gICAgOyMgIHZlcnRpY2FsIGZpbHRlcmluZywganVtcCB0byBzdG9yaW5nIHRoZSBkYXRhLiAgT3RoZXJ3aXNlCi0gICAgOyMgIGxvYWQgdXAgYW5kIGZpbHRlciB0aGUgYWRkaXRpb25hbCBsaW5lIHRoYXQgaXMgbmVlZGVkCi0gICAgOyMgIGZvciB0aGUgdmVydGljYWwgZmlsdGVyLgotICAgIGJlcSAgICAgY29tcHV0ZV9zdW1fc3NlXzE2eDE2X2IKLQotICAgIGhmaWx0ZXJfMTYgdjE2LCAwCi0KLSAgICBiICAgc2Vjb25kX3Bhc3NfMTZ4MTZfYgotCi1zZWNvbmRfcGFzc18xNngxNl9wcmVfY29weV9iOgotICAgIHNsd2kuICAgcjYsIHI2LCA1ICAgICAgICAgICA7IyBpbmRleCBpbnRvIHZlcnRpY2FsIGZpbHRlciBhcnJheQotCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYwLCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxLCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYyLCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYzLCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHY0LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHY1LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHY2LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHY3LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHY4LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHY5LCAgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxMCwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxMSwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxMiwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxMywgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxNCwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxNSwgcjMsIHI0LCAxCi0gICAgbG9hZF9hbmRfYWxpZ25fMTYgIHYxNiwgcjMsIHI0LCAwCi0KLSAgICBiZXEgICAgIGNvbXB1dGVfc3VtX3NzZV8xNngxNl9iCi0KLXNlY29uZF9wYXNzXzE2eDE2X2I6Ci0gICAgdnNwbHRpc2ggdjIwLCA4Ci0gICAgdnNwbHRpc2ggdjE4LCAzCi0gICAgdnNsaCAgICB2MTgsIHYyMCwgdjE4ICAgOyMgMHgwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAgMDA0MCAwMDQwIDAwNDAKLQotICAgIGxvYWRfdmZpbHRlciB2MjAsIHYyMQotCi0gICAgdmZpbHRlcl8xNiB2MCwgIHYxCi0gICAgdmZpbHRlcl8xNiB2MSwgIHYyCi0gICAgdmZpbHRlcl8xNiB2MiwgIHYzCi0gICAgdmZpbHRlcl8xNiB2MywgIHY0Ci0gICAgdmZpbHRlcl8xNiB2NCwgIHY1Ci0gICAgdmZpbHRlcl8xNiB2NSwgIHY2Ci0gICAgdmZpbHRlcl8xNiB2NiwgIHY3Ci0gICAgdmZpbHRlcl8xNiB2NywgIHY4Ci0gICAgdmZpbHRlcl8xNiB2OCwgIHY5Ci0gICAgdmZpbHRlcl8xNiB2OSwgIHYxMAotICAgIHZmaWx0ZXJfMTYgdjEwLCB2MTEKLSAgICB2ZmlsdGVyXzE2IHYxMSwgdjEyCi0gICAgdmZpbHRlcl8xNiB2MTIsIHYxMwotICAgIHZmaWx0ZXJfMTYgdjEzLCB2MTQKLSAgICB2ZmlsdGVyXzE2IHYxNCwgdjE1Ci0gICAgdmZpbHRlcl8xNiB2MTUsIHYxNgotCi1jb21wdXRlX3N1bV9zc2VfMTZ4MTZfYjoKLSAgICB2c3BsdGlzaCB2MTgsIDAgICAgICAgICAgICAgOyMgc3VtCi0gICAgdnNwbHRpc2ggdjE5LCAwICAgICAgICAgICAgIDsjIHNzZQotICAgIHZzcGx0aXNoIHYyMywgMCAgICAgICAgICAgICA7IyB1bnBhY2sKLSAgICBsaSAgICAgIHIxMCwgMTYKLQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MCwgIDEKLSAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjEsICAxCi0gICAgY29tcHV0ZV9zdW1fc3NlXzE2IHYyLCAgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MywgIDEKLSAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjQsICAxCi0gICAgY29tcHV0ZV9zdW1fc3NlXzE2IHY1LCAgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2NiwgIDEKLSAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjcsICAxCi0gICAgY29tcHV0ZV9zdW1fc3NlXzE2IHY4LCAgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2OSwgIDEKLSAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjEwLCAxCi0gICAgY29tcHV0ZV9zdW1fc3NlXzE2IHYxMSwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MTIsIDEKLSAgICBjb21wdXRlX3N1bV9zc2VfMTYgdjEzLCAxCi0gICAgY29tcHV0ZV9zdW1fc3NlXzE2IHYxNCwgMQotICAgIGNvbXB1dGVfc3VtX3NzZV8xNiB2MTUsIDAKLQotICAgIHZhcmlhbmNlX2ZpbmFsIHYxOCwgdjE5LCB2MjMsIDgKLQotICAgIGFkZGkgICAgcjEsIHIxLCAzMiAgICAgICAgICA7IyByZWNvdmVyIHN0YWNrCi0KLSAgICBtdHNwciAgIDI1NiwgcjExICAgICAgICAgICAgOyMgcmVzZXQgb2xkIFZSU0FWRQotCi0gICAgYmxyCi0KLSAgICAuZGF0YQotCi0gICAgLmFsaWduIDQKLWhmaWx0ZXJfYjoKLSAgICAuYnl0ZSAgIDEyOCwgIDAsICAwLCAgMCwxMjgsICAwLCAgMCwgIDAsMTI4LCAgMCwgIDAsICAwLDEyOCwgIDAsICAwLCAgMAotICAgIC5ieXRlICAgMTEyLCAxNiwgIDAsICAwLDExMiwgMTYsICAwLCAgMCwxMTIsIDE2LCAgMCwgIDAsMTEyLCAxNiwgIDAsICAwCi0gICAgLmJ5dGUgICAgOTYsIDMyLCAgMCwgIDAsIDk2LCAzMiwgIDAsICAwLCA5NiwgMzIsICAwLCAgMCwgOTYsIDMyLCAgMCwgIDAKLSAgICAuYnl0ZSAgICA4MCwgNDgsICAwLCAgMCwgODAsIDQ4LCAgMCwgIDAsIDgwLCA0OCwgIDAsICAwLCA4MCwgNDgsICAwLCAgMAotICAgIC5ieXRlICAgIDY0LCA2NCwgIDAsICAwLCA2NCwgNjQsICAwLCAgMCwgNjQsIDY0LCAgMCwgIDAsIDY0LCA2NCwgIDAsICAwCi0gICAgLmJ5dGUgICAgNDgsIDgwLCAgMCwgIDAsIDQ4LCA4MCwgIDAsICAwLCA0OCwgODAsICAwLCAgMCwgNDgsIDgwLCAgMCwgIDAKLSAgICAuYnl0ZSAgICAzMiwgOTYsICAwLCAgMCwgMzIsIDk2LCAgMCwgIDAsIDMyLCA5NiwgIDAsICAwLCAzMiwgOTYsICAwLCAgMAotICAgIC5ieXRlICAgIDE2LDExMiwgIDAsICAwLCAxNiwxMTIsICAwLCAgMCwgMTYsMTEyLCAgMCwgIDAsIDE2LDExMiwgIDAsICAwCi0KLSAgICAuYWxpZ24gNAotdmZpbHRlcl9iOgotICAgIC5ieXRlICAgMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4Ci0gICAgLmJ5dGUgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLSAgICAuYnl0ZSAgIDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMgotICAgIC5ieXRlICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgLmJ5dGUgICAgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYKLSAgICAuYnl0ZSAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMgotICAgIC5ieXRlICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwCi0gICAgLmJ5dGUgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgKLSAgICAuYnl0ZSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NAotICAgIC5ieXRlICAgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0Ci0gICAgLmJ5dGUgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgKLSAgICAuYnl0ZSAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MAotICAgIC5ieXRlICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyCi0gICAgLmJ5dGUgICAgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYKLSAgICAuYnl0ZSAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotICAgIC5ieXRlICAgMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyCi0KLSAgICAuYWxpZ24gNAotYl9ocGVybV9iOgotICAgIC5ieXRlICAgICAwLCAgNCwgIDgsIDEyLCAgMSwgIDUsICA5LCAxMywgIDIsICA2LCAxMCwgMTQsICAzLCAgNywgMTEsIDE1Ci0KLSAgICAuYWxpZ24gNAotYl8wMTIzX2I6Ci0gICAgLmJ5dGUgICAgIDAsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICA0LCAgMiwgIDMsICA0LCAgNSwgIDMsICA0LCAgNSwgIDYKLQotICAgIC5hbGlnbiA0Ci1iXzQ1NjdfYjoKLSAgICAuYnl0ZSAgICAgNCwgIDUsICA2LCAgNywgIDUsICA2LCAgNywgIDgsICA2LCAgNywgIDgsICA5LCAgNywgIDgsICA5LCAxMAotCi1iX2hpbG9fYjoKLSAgICAuYnl0ZSAgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMwpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcHNuci5jIGIvdnA4L2VuY29kZXIvcHNuci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTE5YmI4Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3BzbnIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKLSNpbmNsdWRlICJtYXRoLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCIgLyogZm9yIHZwOF9jbGVhcl9zeXN0ZW1fc3RhdGUoKSAqLwotCi0jZGVmaW5lIE1BWF9QU05SIDYwCi0KLWRvdWJsZSB2cDhfbXNlMnBzbnIoZG91YmxlIFNhbXBsZXMsIGRvdWJsZSBQZWFrLCBkb3VibGUgTXNlKQotewotICAgIGRvdWJsZSBwc25yOwotCi0gICAgaWYgKChkb3VibGUpTXNlID4gMC4wKQotICAgICAgICBwc25yID0gMTAuMCAqIGxvZzEwKFBlYWsgKiBQZWFrICogU2FtcGxlcyAvIE1zZSk7Ci0gICAgZWxzZQotICAgICAgICBwc25yID0gTUFYX1BTTlI7ICAgICAgLy8gTGltaXQgdG8gcHJldmVudCAvIDAKLQotICAgIGlmIChwc25yID4gTUFYX1BTTlIpCi0gICAgICAgIHBzbnIgPSBNQVhfUFNOUjsKLQotICAgIHJldHVybiBwc25yOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcXVhbnRpemUuYyBiL3ZwOC9lbmNvZGVyL3F1YW50aXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwM2UzYTUuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvcXVhbnRpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLQotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9lbnRyb3B5LmgiCi0KLSNkZWZpbmUgRVhBQ1RfUVVBTlQKLQotI2lmZGVmIEVYQUNUX0ZBU1RRVUFOVAotdm9pZCB2cDhfZmFzdF9xdWFudGl6ZV9iX2MoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKLXsKLSAgICBpbnQgaSwgcmMsIGVvYjsKLSAgICBpbnQgemJpbjsKLSAgICBpbnQgeCwgeSwgeiwgc3o7Ci0gICAgc2hvcnQgKmNvZWZmX3B0ciAgICAgICA9IGItPmNvZWZmOwotICAgIHNob3J0ICp6YmluX3B0ciAgICAgICAgPSBiLT56YmluOwotICAgIHNob3J0ICpyb3VuZF9wdHIgICAgICAgPSBiLT5yb3VuZDsKLSAgICBzaG9ydCAqcXVhbnRfcHRyICAgICAgID0gYi0+cXVhbnRfZmFzdDsKLSAgICBzaG9ydCAqcXVhbnRfc2hpZnRfcHRyID0gYi0+cXVhbnRfc2hpZnQ7Ci0gICAgc2hvcnQgKnFjb2VmZl9wdHIgICAgICA9IGQtPnFjb2VmZjsKLSAgICBzaG9ydCAqZHFjb2VmZl9wdHIgICAgID0gZC0+ZHFjb2VmZjsKLSAgICBzaG9ydCAqZGVxdWFudF9wdHIgICAgID0gZC0+ZGVxdWFudDsKLQotICAgIHZweF9tZW1zZXQocWNvZWZmX3B0ciwgMCwgMzIpOwotICAgIHZweF9tZW1zZXQoZHFjb2VmZl9wdHIsIDAsIDMyKTsKLQotICAgIGVvYiA9IC0xOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICByYyAgID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOwotICAgICAgICB6ICAgID0gY29lZmZfcHRyW3JjXTsKLSAgICAgICAgemJpbiA9IHpiaW5fcHRyW3JjXSA7Ci0KLSAgICAgICAgc3ogPSAoeiA+PiAzMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbiBvZiB6Ci0gICAgICAgIHggID0gKHogXiBzeikgLSBzejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggPSBhYnMoeikKLQotICAgICAgICBpZiAoeCA+PSB6YmluKQotICAgICAgICB7Ci0gICAgICAgICAgICB4ICs9IHJvdW5kX3B0cltyY107Ci0gICAgICAgICAgICB5ICA9ICgoKHggKiBxdWFudF9wdHJbcmNdKSA+PiAxNikgKyB4KQotICAgICAgICAgICAgICAgICA+PiBxdWFudF9zaGlmdF9wdHJbcmNdOyAgICAgICAgICAgICAgICAvLyBxdWFudGl6ZSAoeCkKLSAgICAgICAgICAgIHggID0gKHkgXiBzeikgLSBzejsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzaWduIGJhY2sKLSAgICAgICAgICAgIHFjb2VmZl9wdHJbcmNdID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBkcWNvZWZmX3B0cltyY10gPSB4ICogZGVxdWFudF9wdHJbcmNdOyAgICAgICAgLy8gZGVxdWFudGl6ZWQgdmFsdWUKLQotICAgICAgICAgICAgaWYgKHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW9iID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgbm9uemVybyBjb2VmZnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBkLT5lb2IgPSBlb2IgKyAxOwotfQotCi0jZWxzZQotCi12b2lkIHZwOF9mYXN0X3F1YW50aXplX2JfYyhCTE9DSyAqYiwgQkxPQ0tEICpkKQotewotICAgIGludCBpLCByYywgZW9iOwotICAgIGludCB4LCB5LCB6LCBzejsKLSAgICBzaG9ydCAqY29lZmZfcHRyICAgPSBiLT5jb2VmZjsKLSAgICBzaG9ydCAqcm91bmRfcHRyICAgPSBiLT5yb3VuZDsKLSAgICBzaG9ydCAqcXVhbnRfcHRyICAgPSBiLT5xdWFudF9mYXN0OwotICAgIHNob3J0ICpxY29lZmZfcHRyICA9IGQtPnFjb2VmZjsKLSAgICBzaG9ydCAqZHFjb2VmZl9wdHIgPSBkLT5kcWNvZWZmOwotICAgIHNob3J0ICpkZXF1YW50X3B0ciA9IGQtPmRlcXVhbnQ7Ci0KLSAgICBlb2IgPSAtMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHJjICAgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbaV07Ci0gICAgICAgIHogICAgPSBjb2VmZl9wdHJbcmNdOwotCi0gICAgICAgIHN6ID0gKHogPj4gMzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ24gb2YgegotICAgICAgICB4ICA9ICh6IF4gc3opIC0gc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4ID0gYWJzKHopCi0KLSAgICAgICAgeSAgPSAoKHggKyByb3VuZF9wdHJbcmNdKSAqIHF1YW50X3B0cltyY10pID4+IDE2OyAvLyBxdWFudGl6ZSAoeCkKLSAgICAgICAgeCAgPSAoeSBeIHN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHNpZ24gYmFjawotICAgICAgICBxY29lZmZfcHRyW3JjXSA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0byBkZXN0aW5hdGlvbgotICAgICAgICBkcWNvZWZmX3B0cltyY10gPSB4ICogZGVxdWFudF9wdHJbcmNdOyAgICAgICAgLy8gZGVxdWFudGl6ZWQgdmFsdWUKLQotICAgICAgICBpZiAoeSkKLSAgICAgICAgewotICAgICAgICAgICAgZW9iID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgbm9uemVybyBjb2VmZnMKLSAgICAgICAgfQotICAgIH0KLSAgICBkLT5lb2IgPSBlb2IgKyAxOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIEVYQUNUX1FVQU5UCi12b2lkIHZwOF9yZWd1bGFyX3F1YW50aXplX2IoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKLXsKLSAgICBpbnQgaSwgcmMsIGVvYjsKLSAgICBpbnQgemJpbjsKLSAgICBpbnQgeCwgeSwgeiwgc3o7Ci0gICAgc2hvcnQgKnpiaW5fYm9vc3RfcHRyICA9IGItPnpydW5femJpbl9ib29zdDsKLSAgICBzaG9ydCAqY29lZmZfcHRyICAgICAgID0gYi0+Y29lZmY7Ci0gICAgc2hvcnQgKnpiaW5fcHRyICAgICAgICA9IGItPnpiaW47Ci0gICAgc2hvcnQgKnJvdW5kX3B0ciAgICAgICA9IGItPnJvdW5kOwotICAgIHNob3J0ICpxdWFudF9wdHIgICAgICAgPSBiLT5xdWFudDsKLSAgICBzaG9ydCAqcXVhbnRfc2hpZnRfcHRyID0gYi0+cXVhbnRfc2hpZnQ7Ci0gICAgc2hvcnQgKnFjb2VmZl9wdHIgICAgICA9IGQtPnFjb2VmZjsKLSAgICBzaG9ydCAqZHFjb2VmZl9wdHIgICAgID0gZC0+ZHFjb2VmZjsKLSAgICBzaG9ydCAqZGVxdWFudF9wdHIgICAgID0gZC0+ZGVxdWFudDsKLSAgICBzaG9ydCB6YmluX29xX3ZhbHVlICAgID0gYi0+emJpbl9leHRyYTsKLQotICAgIHZweF9tZW1zZXQocWNvZWZmX3B0ciwgMCwgMzIpOwotICAgIHZweF9tZW1zZXQoZHFjb2VmZl9wdHIsIDAsIDMyKTsKLQotICAgIGVvYiA9IC0xOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICByYyAgID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOwotICAgICAgICB6ICAgID0gY29lZmZfcHRyW3JjXTsKLQotICAgICAgICB6YmluID0gemJpbl9wdHJbcmNdICsgKnpiaW5fYm9vc3RfcHRyICsgemJpbl9vcV92YWx1ZTsKLQotICAgICAgICB6YmluX2Jvb3N0X3B0ciArKzsKLSAgICAgICAgc3ogPSAoeiA+PiAzMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbiBvZiB6Ci0gICAgICAgIHggID0gKHogXiBzeikgLSBzejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggPSBhYnMoeikKLQotICAgICAgICBpZiAoeCA+PSB6YmluKQotICAgICAgICB7Ci0gICAgICAgICAgICB4ICs9IHJvdW5kX3B0cltyY107Ci0gICAgICAgICAgICB5ICA9ICgoKHggKiBxdWFudF9wdHJbcmNdKSA+PiAxNikgKyB4KQotICAgICAgICAgICAgICAgICA+PiBxdWFudF9zaGlmdF9wdHJbcmNdOyAgICAgICAgICAgICAgICAvLyBxdWFudGl6ZSAoeCkKLSAgICAgICAgICAgIHggID0gKHkgXiBzeikgLSBzejsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzaWduIGJhY2sKLSAgICAgICAgICAgIHFjb2VmZl9wdHJbcmNdICA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgIGRxY29lZmZfcHRyW3JjXSA9IHggKiBkZXF1YW50X3B0cltyY107ICAgICAgLy8gZGVxdWFudGl6ZWQgdmFsdWUKLQotICAgICAgICAgICAgaWYgKHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW9iID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgbm9uemVybyBjb2VmZnMKLSAgICAgICAgICAgICAgICB6YmluX2Jvb3N0X3B0ciA9IGItPnpydW5femJpbl9ib29zdDsgICAgLy8gcmVzZXQgemVybyBydW5sZW5ndGgKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGQtPmVvYiA9IGVvYiArIDE7Ci19Ci0KLS8qIFBlcmZvcm0gcmVndWxhciBxdWFudGl6YXRpb24sIHdpdGggdW5iaWFzZWQgcm91bmRpbmcgYW5kIG5vIHplcm8gYmluLiAqLwotdm9pZCB2cDhfc3RyaWN0X3F1YW50aXplX2IoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmM7Ci0gICAgaW50IGVvYjsKLSAgICBpbnQgeDsKLSAgICBpbnQgeTsKLSAgICBpbnQgejsKLSAgICBpbnQgc3o7Ci0gICAgc2hvcnQgKmNvZWZmX3B0cjsKLSAgICBzaG9ydCAqcXVhbnRfcHRyOwotICAgIHNob3J0ICpxdWFudF9zaGlmdF9wdHI7Ci0gICAgc2hvcnQgKnFjb2VmZl9wdHI7Ci0gICAgc2hvcnQgKmRxY29lZmZfcHRyOwotICAgIHNob3J0ICpkZXF1YW50X3B0cjsKLQotICAgIGNvZWZmX3B0ciAgICAgICA9IGItPmNvZWZmOwotICAgIHF1YW50X3B0ciAgICAgICA9IGItPnF1YW50OwotICAgIHF1YW50X3NoaWZ0X3B0ciA9IGItPnF1YW50X3NoaWZ0OwotICAgIHFjb2VmZl9wdHIgICAgICA9IGQtPnFjb2VmZjsKLSAgICBkcWNvZWZmX3B0ciAgICAgPSBkLT5kcWNvZWZmOwotICAgIGRlcXVhbnRfcHRyICAgICA9IGQtPmRlcXVhbnQ7Ci0gICAgZW9iID0gLSAxOwotICAgIHZweF9tZW1zZXQocWNvZWZmX3B0ciwgMCwgMzIpOwotICAgIHZweF9tZW1zZXQoZHFjb2VmZl9wdHIsIDAsIDMyKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBkcTsKLSAgICAgICAgaW50IHJvdW5kOwotCi0gICAgICAgIC8qVE9ETzogVGhlc2UgYXJyYXlzIHNob3VsZCBiZSBzdG9yZWQgaW4gemlnLXphZyBvcmRlci4qLwotICAgICAgICByYyA9IHZwOF9kZWZhdWx0X3ppZ196YWcxZFtpXTsKLSAgICAgICAgeiA9IGNvZWZmX3B0cltyY107Ci0gICAgICAgIGRxID0gZGVxdWFudF9wdHJbcmNdOwotICAgICAgICByb3VuZCA9IGRxID4+IDE7Ci0gICAgICAgIC8qIFNpZ24gb2Ygei4gKi8KLSAgICAgICAgc3ogPSAtKHogPCAwKTsKLSAgICAgICAgeCA9ICh6ICsgc3opIF4gc3o7Ci0gICAgICAgIHggKz0gcm91bmQ7Ci0gICAgICAgIGlmICh4ID49IGRxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBRdWFudGl6ZSB4LiAqLwotICAgICAgICAgICAgeSAgPSAoKCh4ICogcXVhbnRfcHRyW3JjXSkgPj4gMTYpICsgeCkgPj4gcXVhbnRfc2hpZnRfcHRyW3JjXTsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgc2lnbiBiYWNrLiAqLwotICAgICAgICAgICAgeCA9ICh5ICsgc3opIF4gc3o7Ci0gICAgICAgICAgICAvKiBTYXZlIHRoZSBjb2VmZmljaWVudCBhbmQgaXRzIGRlcXVhbnRpemVkIHZhbHVlLiAqLwotICAgICAgICAgICAgcWNvZWZmX3B0cltyY10gPSB4OwotICAgICAgICAgICAgZHFjb2VmZl9wdHJbcmNdID0geCAqIGRxOwotICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhlIGxhc3Qgbm9uLXplcm8gY29lZmZpY2llbnQuICovCi0gICAgICAgICAgICBpZiAoeSkKLSAgICAgICAgICAgICAgICBlb2IgPSBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZC0+ZW9iID0gZW9iICsgMTsKLX0KLQotI2Vsc2UKLQotdm9pZCB2cDhfcmVndWxhcl9xdWFudGl6ZV9iKEJMT0NLICpiLCBCTE9DS0QgKmQpCi17Ci0gICAgaW50IGksIHJjLCBlb2I7Ci0gICAgaW50IHpiaW47Ci0gICAgaW50IHgsIHksIHosIHN6OwotICAgIHNob3J0ICp6YmluX2Jvb3N0X3B0ciA9IGItPnpydW5femJpbl9ib29zdDsKLSAgICBzaG9ydCAqY29lZmZfcHRyICAgICAgPSBiLT5jb2VmZjsKLSAgICBzaG9ydCAqemJpbl9wdHIgICAgICAgPSBiLT56YmluOwotICAgIHNob3J0ICpyb3VuZF9wdHIgICAgICA9IGItPnJvdW5kOwotICAgIHNob3J0ICpxdWFudF9wdHIgICAgICA9IGItPnF1YW50OwotICAgIHNob3J0ICpxY29lZmZfcHRyICAgICA9IGQtPnFjb2VmZjsKLSAgICBzaG9ydCAqZHFjb2VmZl9wdHIgICAgPSBkLT5kcWNvZWZmOwotICAgIHNob3J0ICpkZXF1YW50X3B0ciAgICA9IGQtPmRlcXVhbnQ7Ci0gICAgc2hvcnQgemJpbl9vcV92YWx1ZSAgID0gYi0+emJpbl9leHRyYTsKLQotICAgIHZweF9tZW1zZXQocWNvZWZmX3B0ciwgMCwgMzIpOwotICAgIHZweF9tZW1zZXQoZHFjb2VmZl9wdHIsIDAsIDMyKTsKLQotICAgIGVvYiA9IC0xOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICByYyAgID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2ldOwotICAgICAgICB6ICAgID0gY29lZmZfcHRyW3JjXTsKLQotICAgICAgICAvL2lmICggaSA9PSAwICkKLSAgICAgICAgLy8gICAgemJpbiA9IHpiaW5fcHRyW3JjXSArICp6YmluX2Jvb3N0X3B0ciArIHpiaW5fb3FfdmFsdWUvMjsKLSAgICAgICAgLy9lbHNlCi0gICAgICAgIHpiaW4gPSB6YmluX3B0cltyY10gKyAqemJpbl9ib29zdF9wdHIgKyB6YmluX29xX3ZhbHVlOwotCi0gICAgICAgIHpiaW5fYm9vc3RfcHRyICsrOwotICAgICAgICBzeiA9ICh6ID4+IDMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduIG9mIHoKLSAgICAgICAgeCAgPSAoeiBeIHN6KSAtIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geCA9IGFicyh6KQotCi0gICAgICAgIGlmICh4ID49IHpiaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHkgID0gKCh4ICsgcm91bmRfcHRyW3JjXSkgKiBxdWFudF9wdHJbcmNdKSA+PiAxNjsgLy8gcXVhbnRpemUgKHgpCi0gICAgICAgICAgICB4ICA9ICh5IF4gc3opIC0gc3o7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2lnbiBiYWNrCi0gICAgICAgICAgICBxY29lZmZfcHRyW3JjXSAgPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0byBkZXN0aW5hdGlvbgotICAgICAgICAgICAgZHFjb2VmZl9wdHJbcmNdID0geCAqIGRlcXVhbnRfcHRyW3JjXTsgICAgICAgIC8vIGRlcXVhbnRpemVkIHZhbHVlCi0KLSAgICAgICAgICAgIGlmICh5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVvYiA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG5vbnplcm8gY29lZmZzCi0gICAgICAgICAgICAgICAgemJpbl9ib29zdF9wdHIgPSAmYi0+enJ1bl96YmluX2Jvb3N0WzBdOyAgICAvLyByZXNldCB6ZXJvIHJ1bmxlbmd0aAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZC0+ZW9iID0gZW9iICsgMTsKLX0KLQotI2VuZGlmCi0KLXZvaWQgdnA4X3F1YW50aXplX21ieShNQUNST0JMT0NLICp4KQotewotICAgIGludCBpOwotICAgIGludCBoYXNfMm5kX29yZGVyID0gKHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVECi0gICAgICAgICYmIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgeC0+cXVhbnRpemVfYigmeC0+YmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpXSk7Ci0KLSAgICBpZihoYXNfMm5kX29yZGVyKQotICAgICAgICB4LT5xdWFudGl6ZV9iKCZ4LT5ibG9ja1syNF0sICZ4LT5lX21iZC5ibG9ja1syNF0pOwotfQotCi12b2lkIHZwOF9xdWFudGl6ZV9tYihNQUNST0JMT0NLICp4KQotewotICAgIGludCBpOwotICAgIGludCBoYXNfMm5kX29yZGVyPSh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRAotICAgICAgICAmJiB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI0K2hhc18ybmRfb3JkZXI7IGkrKykKLSAgICAgICAgeC0+cXVhbnRpemVfYigmeC0+YmxvY2tbaV0sICZ4LT5lX21iZC5ibG9ja1tpXSk7Ci19Ci0KLQotdm9pZCB2cDhfcXVhbnRpemVfbWJ1dihNQUNST0JMT0NLICp4KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSsrKQotICAgICAgICB4LT5xdWFudGl6ZV9iKCZ4LT5ibG9ja1tpXSwgJngtPmVfbWJkLmJsb2NrW2ldKTsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3F1YW50aXplLmggYi92cDgvZW5jb2Rlci9xdWFudGl6ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzQ3MThiLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3F1YW50aXplLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19RVUFOVElaRV9ICi0jZGVmaW5lIF9fSU5DX1FVQU5USVpFX0gKLQotI2luY2x1ZGUgImJsb2NrLmgiCi0KLSNkZWZpbmUgcHJvdG90eXBlX3F1YW50aXplX2Jsb2NrKHN5bSkgXAotICAgIHZvaWQgKHN5bSkoQkxPQ0sgKmIsQkxPQ0tEICpkKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvcXVhbnRpemVfeDg2LmgiCi0jZW5kaWYKLQotI2lmIEFSQ0hfQVJNCi0jaW5jbHVkZSAiYXJtL3F1YW50aXplX2FybS5oIgotI2VuZGlmCi0KLSNpZm5kZWYgdnA4X3F1YW50aXplX3F1YW50YgotI2RlZmluZSB2cDhfcXVhbnRpemVfcXVhbnRiIHZwOF9yZWd1bGFyX3F1YW50aXplX2IKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9xdWFudGl6ZV9ibG9jayh2cDhfcXVhbnRpemVfcXVhbnRiKTsKLQotI2lmbmRlZiB2cDhfcXVhbnRpemVfZmFzdHF1YW50YgotI2RlZmluZSB2cDhfcXVhbnRpemVfZmFzdHF1YW50YiB2cDhfZmFzdF9xdWFudGl6ZV9iX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9xdWFudGl6ZV9ibG9jayh2cDhfcXVhbnRpemVfZmFzdHF1YW50Yik7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgcHJvdG90eXBlX3F1YW50aXplX2Jsb2NrKCpxdWFudGIpOwotICAgIHByb3RvdHlwZV9xdWFudGl6ZV9ibG9jaygqZmFzdHF1YW50Yik7Ci19IHZwOF9xdWFudGl6ZV9ydGNkX3Z0YWJsZV90OwotCi0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI2RlZmluZSBRVUFOVElaRV9JTlZPS0UoY3R4LGZuKSAoY3R4KS0+Zm4KLSNlbHNlCi0jZGVmaW5lIFFVQU5USVpFX0lOVk9LRShjdHgsZm4pIHZwOF9xdWFudGl6ZV8jI2ZuCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgdnA4X3N0cmljdF9xdWFudGl6ZV9iKEJMT0NLICpiLEJMT0NLRCAqZCk7Ci0KLWV4dGVybiB2b2lkIHZwOF9xdWFudGl6ZV9tYihNQUNST0JMT0NLICp4KTsKLWV4dGVybiB2b2lkIHZwOF9xdWFudGl6ZV9tYnV2KE1BQ1JPQkxPQ0sgKngpOwotZXh0ZXJuIHZvaWQgdnA4X3F1YW50aXplX21ieShNQUNST0JMT0NLICp4KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9yYXRlY3RybC5jIGIvdnA4L2VuY29kZXIvcmF0ZWN0cmwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjNjMyNy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9yYXRlY3RybC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwNyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJtYXRoLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9jb21tb24uaCIKLSNpbmNsdWRlICJyYXRlY3RybC5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW1vZGUuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3N5c3RlbWRlcGVuZGVudC5oIgotI2luY2x1ZGUgImVuY29kZW12LmgiCi0KLQotI2RlZmluZSBNSU5fQlBCX0ZBQ1RPUiAgICAgICAgICAwLjAxCi0jZGVmaW5lIE1BWF9CUEJfRkFDVE9SICAgICAgICAgIDUwCi0KLWV4dGVybiBjb25zdCBNQl9QUkVESUNUSU9OX01PREUgdnA4X21vZGVfb3JkZXJbTUFYX01PREVTXTsKLWV4dGVybiBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgdnA4X3JlZl9mcmFtZV9vcmRlcltNQVhfTU9ERVNdOwotCi0KLQotI2lmZGVmIE1PREVfU1RBVFMKLWV4dGVybiBpbnQgeV9tb2Rlc1s1XTsKLWV4dGVybiBpbnQgdXZfbW9kZXNbNF07Ci1leHRlcm4gaW50IGJfbW9kZXNbMTBdOwotCi1leHRlcm4gaW50IGludGVyX3lfbW9kZXNbMTBdOwotZXh0ZXJuIGludCBpbnRlcl91dl9tb2Rlc1s0XTsKLWV4dGVybiBpbnQgaW50ZXJfYl9tb2Rlc1sxMF07Ci0jZW5kaWYKLQotLy8gQml0cyBQZXIgTUIgYXQgZGlmZmVyZW50IFEgKE11bHRpcGxpZWQgYnkgNTEyKQotI2RlZmluZSBCUEVSX01CX05PUk1CSVRTICAgIDkKLQotLy8gV29yayBpbiBwcm9ncmVzcyByZWNhbGlicmF0aW9uIG9mIGJhc2VsaW5lIHJhdGUgdGFibGVzIGJhc2VkIG9uCi0vLyB0aGUgYXNzdW1wdGlvbiB0aGF0IGJpdHMgcGVyIG1iIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlCi0vLyBxdWFudGl6ZXIgdmFsdWUuCi1jb25zdCBpbnQgdnA4X2JpdHNfcGVyX21iWzJdW1FJTkRFWF9SQU5HRV0gPQotewotICAgIC8vIEludHJhIGNhc2UgNDUwMDAwL1FpbnRyYQotICAgIHsKLSAgICAgICAgMTEyNTAwMCw5MDAwMDAsIDc1MDAwMCwgNjQyODU3LCA1NjI1MDAsIDUwMDAwMCwgNDUwMDAwLCA0NTAwMDAsCi0gICAgICAgIDQwOTA5MCwgMzc1MDAwLCAzNDYxNTMsIDMyMTQyOCwgMzAwMDAwLCAyODEyNTAsIDI2NDcwNSwgMjY0NzA1LAotICAgICAgICAyNTAwMDAsIDIzNjg0MiwgMjI1MDAwLCAyMjUwMDAsIDIxNDI4NSwgMjE0Mjg1LCAyMDQ1NDUsIDIwNDU0NSwKLSAgICAgICAgMTk1NjUyLCAxOTU2NTIsIDE4NzUwMCwgMTgwMDAwLCAxODAwMDAsIDE3MzA3NiwgMTY2NjY2LCAxNjA3MTQsCi0gICAgICAgIDE1NTE3MiwgMTUwMDAwLCAxNDUxNjEsIDE0MDYyNSwgMTM2MzYzLCAxMzIzNTIsIDEyODU3MSwgMTI1MDAwLAotICAgICAgICAxMjE2MjEsIDEyMTYyMSwgMTE4NDIxLCAxMTUzODQsIDExMjUwMCwgMTA5NzU2LCAxMDcxNDIsIDEwNDY1MSwKLSAgICAgICAgMTAyMjcyLCAxMDAwMDAsIDk3ODI2LCAgOTc4MjYsICA5NTc0NCwgIDkzNzUwLCAgOTE4MzYsICA5MDAwMCwKLSAgICAgICAgODgyMzUsICA4NjUzOCwgIDg0OTA1LCAgODMzMzMsICA4MTgxOCwgIDgwMzU3LCAgNzg5NDcsICA3NzU4NiwKLSAgICAgICAgNzYyNzEsICA3NTAwMCwgIDczNzcwLCAgNzI1ODAsICA3MTQyOCwgIDcwMzEyLCAgNjkyMzAsICA2ODE4MSwKLSAgICAgICAgNjcxNjQsICA2NjE3NiwgIDY1MjE3LCAgNjQyODUsICA2MzM4MCwgIDYyNTAwLCAgNjE2NDMsICA2MDgxMCwKLSAgICAgICAgNjAwMDAsICA1OTIxMCwgIDU5MjEwLCAgNTg0NDEsICA1NzY5MiwgIDU2OTYyLCAgNTYyNTAsICA1NTU1NSwKLSAgICAgICAgNTQ4NzgsICA1NDIxNiwgIDUzNTcxLCAgNTI5NDEsICA1MjMyNSwgIDUxNzI0LCAgNTExMzYsICA1MDU2MSwKLSAgICAgICAgNDk0NTAsICA0ODM4NywgIDQ3MzY4LCAgNDY4NzUsICA0NTkxOCwgIDQ1MDAwLCAgNDQ1NTQsICA0NDExNywKLSAgICAgICAgNDMyNjksICA0MjQ1MiwgIDQxNjY2LCAgNDA5MDksICA0MDE3OCwgIDM5NDczLCAgMzg3OTMsICAzODEzNSwKLSAgICAgICAgMzY4ODUsICAzNjI5MCwgIDM1NzE0LCAgMzUxNTYsICAzNDYxNSwgIDM0MDkwLCAgMzM1ODIsICAzMzA4OCwKLSAgICAgICAgMzI2MDgsICAzMjE0MiwgIDMxNDY4LCAgMzEwMzQsICAzMDQwNSwgIDI5ODAxLCAgMjkyMjAsICAyODY2MiwKLSAgICB9LAotICAgIC8vIEludGVyIGNhc2UgMjg1MDAwL1FpbnRlcgotICAgIHsKLSAgICAgICAgNzEyNTAwLCA1NzAwMDAsIDQ3NTAwMCwgNDA3MTQyLCAzNTYyNTAsIDMxNjY2NiwgMjg1MDAwLCAyNTkwOTAsCi0gICAgICAgIDIzNzUwMCwgMjE5MjMwLCAyMDM1NzEsIDE5MDAwMCwgMTc4MTI1LCAxNjc2NDcsIDE1ODMzMywgMTUwMDAwLAotICAgICAgICAxNDI1MDAsIDEzNTcxNCwgMTI5NTQ1LCAxMjM5MTMsIDExODc1MCwgMTE0MDAwLCAxMDk2MTUsIDEwNTU1NSwKLSAgICAgICAgMTAxNzg1LCA5ODI3NSwgIDk1MDAwLCAgOTE5MzUsICA4OTA2MiwgIDg2MzYzLCAgODM4MjMsICA4MTQyOCwKLSAgICAgICAgNzkxNjYsICA3NzAyNywgIDc1MDAwLCAgNzMwNzYsICA3MTI1MCwgIDY5NTEyLCAgNjc4NTcsICA2NjI3OSwKLSAgICAgICAgNjQ3NzIsICA2MzMzMywgIDYxOTU2LCAgNjA2MzgsICA1OTM3NSwgIDU4MTYzLCAgNTcwMDAsICA1NTg4MiwKLSAgICAgICAgNTQ4MDcsICA1Mzc3MywgIDUyNzc3LCAgNTE4MTgsICA1MDg5MiwgIDUwMDAwLCAgNDkxMzcsICA0NzUwMCwKLSAgICAgICAgNDU5NjcsICA0NDUzMSwgIDQzMTgxLCAgNDE5MTEsICA0MDcxNCwgIDM5NTgzLCAgMzg1MTMsICAzNzUwMCwKLSAgICAgICAgMzY1MzgsICAzNTYyNSwgIDM0NzU2LCAgMzM5MjgsICAzMzEzOSwgIDMyMzg2LCAgMzE2NjYsICAzMDk3OCwKLSAgICAgICAgMzAzMTksICAyOTY4NywgIDI5MDgxLCAgMjg1MDAsICAyNzk0MSwgIDI3NDAzLCAgMjY4ODYsICAyNjM4OCwKLSAgICAgICAgMjU5MDksICAyNTQ0NiwgIDI1MDAwLCAgMjQ1NjgsICAyMzk0OSwgIDIzMzYwLCAgMjI4MDAsICAyMjI2NSwKLSAgICAgICAgMjE3NTUsICAyMTI2OCwgIDIwODAyLCAgMjAzNTcsICAxOTkzMCwgIDE5NTIwLCAgMTkxMjcsICAxODc1MCwKLSAgICAgICAgMTgzODcsICAxODAzNywgIDE3NzAxLCAgMTczNzgsICAxNzA2NSwgIDE2NzY0LCAgMTY0NzMsICAxNjEwMSwKLSAgICAgICAgMTU3NDUsICAxNTQwNSwgIDE1MDc5LCAgMTQ3NjYsICAxNDQ2NywgIDE0MTc5LCAgMTM5MDIsICAxMzYzNiwKLSAgICAgICAgMTMzODAsICAxMzEzMywgIDEyODk1LCAgMTI2NjYsICAxMjQ0NSwgIDEyMTc5LCAgMTE5MjQsICAxMTYzMiwKLSAgICAgICAgMTE0NDUsICAxMTIyMCwgIDExMDAzLCAgMTA3OTUsICAxMDU5NCwgIDEwNDAxLCAgMTAyMTUsICAxMDAzNSwKLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50IGtmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV0gPQotewotICAgIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LAotICAgIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAotICAgIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLAotICAgIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAotICAgIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAotICAgIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LAotICAgIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLAotICAgIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAotICAgIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LAotICAgIDIwMCwgMjAwLCAyMDEsIDIwMSwgMjAyLCAyMDMsIDIwMywgMjAzLAotICAgIDIwNCwgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDYsIDIwNywgMjA3LAotICAgIDIwOCwgMjA4LCAyMDksIDIwOSwgMjEwLCAyMTAsIDIxMSwgMjExLAotICAgIDIxMiwgMjEyLCAyMTMsIDIxMywgMjE0LCAyMTQsIDIxNSwgMjE1LAotICAgIDIxNiwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTgsIDIxOSwgMjE5LAotICAgIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLAotICAgIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLAotfTsKLQotLy8jZGVmaW5lIEdGUV9BREpVU1RNRU5UIChRKzEwMCkKLSNkZWZpbmUgR0ZRX0FESlVTVE1FTlQgdnA4X2dmX2Jvb3N0X3FhZGp1c3RtZW50W1FdCi1jb25zdCBpbnQgdnA4X2dmX2Jvb3N0X3FhZGp1c3RtZW50W1FJTkRFWF9SQU5HRV0gPQotewotICAgIDgwLCA4MiwgODQsIDg2LCA4OCwgOTAsIDkyLCA5NCwKLSAgICA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLAotICAgIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAotICAgIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LAotICAgIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAotICAgIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LAotICAgIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAotICAgIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLAotICAgIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAotICAgIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAotICAgIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LAotICAgIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLAotICAgIDE4NCwgMTg0LCAxODUsIDE4NSwgMTg2LCAxODYsIDE4NywgMTg3LAotICAgIDE4OCwgMTg4LCAxODksIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkxLAotICAgIDE5MiwgMTkyLCAxOTMsIDE5MywgMTk0LCAxOTQsIDE5NCwgMTk0LAotICAgIDE5NSwgMTk1LCAxOTYsIDE5NiwgMTk3LCAxOTcsIDE5OCwgMTk4Ci19OwotCi0vKgotY29uc3QgaW50IHZwOF9nZl9ib29zdF9xYWRqdXN0bWVudFtRSU5ERVhfUkFOR0VdID0KLXsKLSAgICAxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDUsMTA2LAotICAgIDEwNiwxMDcsMTA3LDEwOCwxMDksMTA5LDExMCwxMTEsCi0gICAgMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwKLSAgICAxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LAotICAgIDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsCi0gICAgMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywKLSAgICAxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLAotICAgIDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksCi0gICAgMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywKLSAgICAxNjgsMTY5LDE3MCwxNzAsMTcxLDE3MSwxNzIsMTcyLAotICAgIDE3MywxNzMsMTczLDE3NCwxNzQsMTc0LDE3NSwxNzUsCi0gICAgMTc1LDE3NiwxNzYsMTc2LDE3NywxNzcsMTc3LDE3NywKLSAgICAxNzgsMTc4LDE3OSwxNzksMTgwLDE4MCwxODEsMTgxLAotICAgIDE4MiwxODIsMTgzLDE4MywxODQsMTg0LDE4NSwxODUsCi0gICAgMTg2LDE4NiwxODcsMTg3LDE4OCwxODgsMTg5LDE4OSwKLSAgICAxOTAsMTkwLDE5MSwxOTEsMTkyLDE5MiwxOTMsMTkzLAotfTsKLSovCi0KLXN0YXRpYyBjb25zdCBpbnQga2ZfZ2ZfYm9vc3RfcWxpbWl0c1tRSU5ERVhfUkFOR0VdID0KLXsKLSAgICAxNTAsIDE1NSwgMTYwLCAxNjUsIDE3MCwgMTc1LCAxODAsIDE4NSwKLSAgICAxOTAsIDE5NSwgMjAwLCAyMDUsIDIxMCwgMjE1LCAyMjAsIDIyNSwKLSAgICAyMzAsIDIzNSwgMjQwLCAyNDUsIDI1MCwgMjU1LCAyNjAsIDI2NSwKLSAgICAyNzAsIDI3NSwgMjgwLCAyODUsIDI5MCwgMjk1LCAzMDAsIDMwNSwKLSAgICAzMTAsIDMyMCwgMzMwLCAzNDAsIDM1MCwgMzYwLCAzNzAsIDM4MCwKLSAgICAzOTAsIDQwMCwgNDEwLCA0MjAsIDQzMCwgNDQwLCA0NTAsIDQ2MCwKLSAgICA0NzAsIDQ4MCwgNDkwLCA1MDAsIDUxMCwgNTIwLCA1MzAsIDU0MCwKLSAgICA1NTAsIDU2MCwgNTcwLCA1ODAsIDU5MCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLSAgICA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMCwKLX07Ci0KLS8vICUgYWRqdXN0bWVudCB0byB0YXJnZXQga2Ygc2l6ZSBiYXNlZCBvbiBzZXBlcmF0aW9uIGZyb20gcHJldmlvdXMgZnJhbWUKLXN0YXRpYyBjb25zdCBpbnQga2ZfYm9vc3Rfc2VwZXJhdGlvbl9hZGp1c3RtZW50WzE2XSA9Ci17Ci0gICAgMzAsICAgNDAsICAgNTAsICAgNTUsICAgNjAsICAgNjUsICAgNzAsICAgNzUsCi0gICAgODAsICAgODUsICAgOTAsICAgOTUsICAxMDAsICAxMDAsICAxMDAsICAxMDAsCi19OwotCi0KLXN0YXRpYyBjb25zdCBpbnQgZ2ZfYWRqdXN0X3RhYmxlWzEwMV0gPQotewotICAgIDEwMCwKLSAgICAxMTUsIDEzMCwgMTQ1LCAxNjAsIDE3NSwgMTkwLCAyMDAsIDIxMCwgMjIwLCAyMzAsCi0gICAgMjQwLCAyNjAsIDI3MCwgMjgwLCAyOTAsIDMwMCwgMzEwLCAzMjAsIDMzMCwgMzQwLAotICAgIDM1MCwgMzYwLCAzNzAsIDM4MCwgMzkwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwKLSAgICA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsCi0gICAgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLAotICAgIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwKLSAgICA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsCi0gICAgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLAotICAgIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwKLSAgICA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwLCA0MDAsCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGdmX2ludHJhX3VzYWdlX2FkanVzdG1lbnRbMjBdID0KLXsKLSAgICAxMjUsIDEyMCwgMTE1LCAxMTAsIDEwNSwgMTAwLCAgOTUsICA4NSwgIDgwLCAgNzUsCi0gICAgNzAsICA2NSwgIDYwLCAgNTUsICA1MCwgIDUwLCAgNTAsICA1MCwgIDUwLCAgNTAsCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGdmX2ludGVydmFsX3RhYmxlWzEwMV0gPQotewotICAgIDcsCi0gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKLSAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAotICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCi0gICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLSAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAotICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKLSAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKLSAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKLSAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHJpb3Jfa2V5X2ZyYW1lX3dlaWdodFtLRVlfRlJBTUVfQ09OVEVYVF0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKLQotCi12b2lkIHZwOF9zYXZlX2NvZGluZ19jb250ZXh0KFZQOF9DT01QICpjcGkpCi17Ci0gICAgQ09ESU5HX0NPTlRFWFQgKmNvbnN0IGNjID0gJiBjcGktPmNvZGluZ19jb250ZXh0OwotCi0gICAgLy8gU3RvcmVzIGEgc25hcHNob3Qgb2Yga2V5IHN0YXRlIHZhcmlhYmxlcyB3aGljaCBjYW4gc3Vic2VxdWVudGx5IGJlCi0gICAgLy8gcmVzdG9yZWQgd2l0aCBhIGNhbGwgdG8gdnA4X3Jlc3RvcmVfY29kaW5nX2NvbnRleHQuIFRoZXNlIGZ1bmN0aW9ucyBhcmUKLSAgICAvLyBpbnRlbmRlZCBmb3IgdXNlIGluIGEgcmUtY29kZSBsb29wIGluIHZwOF9jb21wcmVzc19mcmFtZSB3aGVyZSB0aGUKLSAgICAvLyBxdWFudGl6ZXIgdmFsdWUgaXMgYWRqdXN0ZWQgYmV0d2VlbiBsb29wIGl0ZXJhdGlvbnMuCi0KLSAgICBjYy0+ZnJhbWVzX3NpbmNlX2tleSAgICAgICAgICA9IGNwaS0+ZnJhbWVzX3NpbmNlX2tleTsKLSAgICBjYy0+ZmlsdGVyX2xldmVsICAgICAgICAgICAgID0gY3BpLT5jb21tb24uZmlsdGVyX2xldmVsOwotICAgIGNjLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlICAgPSBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7Ci0gICAgY2MtPmZyYW1lc19zaW5jZV9nb2xkZW4gICAgICAgPSBjcGktPmNvbW1vbi5mcmFtZXNfc2luY2VfZ29sZGVuOwotCi0gICAgdnA4X2NvcHkoY2MtPm12YywgICAgICBjcGktPmNvbW1vbi5mYy5tdmMpOwotICAgIHZwOF9jb3B5KGNjLT5tdmNvc3RzLCAgY3BpLT5tYi5tdmNvc3RzKTsKLQotICAgIHZwOF9jb3B5KGNjLT5rZl95bW9kZV9wcm9iLCAgIGNwaS0+Y29tbW9uLmtmX3ltb2RlX3Byb2IpOwotICAgIHZwOF9jb3B5KGNjLT55bW9kZV9wcm9iLCAgIGNwaS0+Y29tbW9uLmZjLnltb2RlX3Byb2IpOwotICAgIHZwOF9jb3B5KGNjLT5rZl91dl9tb2RlX3Byb2IsICBjcGktPmNvbW1vbi5rZl91dl9tb2RlX3Byb2IpOwotICAgIHZwOF9jb3B5KGNjLT51dl9tb2RlX3Byb2IsICBjcGktPmNvbW1vbi5mYy51dl9tb2RlX3Byb2IpOwotCi0gICAgdnA4X2NvcHkoY2MtPnltb2RlX2NvdW50LCBjcGktPnltb2RlX2NvdW50KTsKLSAgICB2cDhfY29weShjYy0+dXZfbW9kZV9jb3VudCwgY3BpLT51dl9tb2RlX2NvdW50KTsKLQotCi0gICAgLy8gU3RhdHMKLSNpZmRlZiBNT0RFX1NUQVRTCi0gICAgdnA4X2NvcHkoY2MtPnlfbW9kZXMsICAgICAgIHlfbW9kZXMpOwotICAgIHZwOF9jb3B5KGNjLT51dl9tb2RlcywgICAgICB1dl9tb2Rlcyk7Ci0gICAgdnA4X2NvcHkoY2MtPmJfbW9kZXMsICAgICAgIGJfbW9kZXMpOwotICAgIHZwOF9jb3B5KGNjLT5pbnRlcl95X21vZGVzLCAgaW50ZXJfeV9tb2Rlcyk7Ci0gICAgdnA4X2NvcHkoY2MtPmludGVyX3V2X21vZGVzLCBpbnRlcl91dl9tb2Rlcyk7Ci0gICAgdnA4X2NvcHkoY2MtPmludGVyX2JfbW9kZXMsICBpbnRlcl9iX21vZGVzKTsKLSNlbmRpZgotCi0gICAgY2MtPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA9IGNwaS0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhOwotfQotCi0KLXZvaWQgdnA4X3Jlc3RvcmVfY29kaW5nX2NvbnRleHQoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBDT0RJTkdfQ09OVEVYVCAqY29uc3QgY2MgPSAmIGNwaS0+Y29kaW5nX2NvbnRleHQ7Ci0KLSAgICAvLyBSZXN0b3JlIGtleSBzdGF0ZSB2YXJpYWJsZXMgdG8gdGhlIHNuYXBzaG90IHN0YXRlIHN0b3JlZCBpbiB0aGUKLSAgICAvLyBwcmV2aW91cyBjYWxsIHRvIHZwOF9zYXZlX2NvZGluZ19jb250ZXh0LgotCi0gICAgY3BpLT5mcmFtZXNfc2luY2Vfa2V5ICAgICAgICAgPSAgIGNjLT5mcmFtZXNfc2luY2Vfa2V5OwotICAgIGNwaS0+Y29tbW9uLmZpbHRlcl9sZXZlbCAgICAgPSAgIGNjLT5maWx0ZXJfbGV2ZWw7Ci0gICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlICA9ICAgY2MtPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWU7Ci0gICAgY3BpLT5jb21tb24uZnJhbWVzX3NpbmNlX2dvbGRlbiAgICAgICA9ICAgY2MtPmZyYW1lc19zaW5jZV9nb2xkZW47Ci0KLSAgICB2cDhfY29weShjcGktPmNvbW1vbi5mYy5tdmMsIGNjLT5tdmMpOwotCi0gICAgdnA4X2NvcHkoY3BpLT5tYi5tdmNvc3RzLCBjYy0+bXZjb3N0cyk7Ci0KLSAgICB2cDhfY29weShjcGktPmNvbW1vbi5rZl95bW9kZV9wcm9iLCAgIGNjLT5rZl95bW9kZV9wcm9iKTsKLSAgICB2cDhfY29weShjcGktPmNvbW1vbi5mYy55bW9kZV9wcm9iLCAgIGNjLT55bW9kZV9wcm9iKTsKLSAgICB2cDhfY29weShjcGktPmNvbW1vbi5rZl91dl9tb2RlX3Byb2IsICBjYy0+a2ZfdXZfbW9kZV9wcm9iKTsKLSAgICB2cDhfY29weShjcGktPmNvbW1vbi5mYy51dl9tb2RlX3Byb2IsICBjYy0+dXZfbW9kZV9wcm9iKTsKLQotICAgIHZwOF9jb3B5KGNwaS0+eW1vZGVfY291bnQsIGNjLT55bW9kZV9jb3VudCk7Ci0gICAgdnA4X2NvcHkoY3BpLT51dl9tb2RlX2NvdW50LCBjYy0+dXZfbW9kZV9jb3VudCk7Ci0KLSAgICAvLyBTdGF0cwotI2lmZGVmIE1PREVfU1RBVFMKLSAgICB2cDhfY29weSh5X21vZGVzLCBjYy0+eV9tb2Rlcyk7Ci0gICAgdnA4X2NvcHkodXZfbW9kZXMsIGNjLT51dl9tb2Rlcyk7Ci0gICAgdnA4X2NvcHkoYl9tb2RlcywgY2MtPmJfbW9kZXMpOwotICAgIHZwOF9jb3B5KGludGVyX3lfbW9kZXMsIGNjLT5pbnRlcl95X21vZGVzKTsKLSAgICB2cDhfY29weShpbnRlcl91dl9tb2RlcywgY2MtPmludGVyX3V2X21vZGVzKTsKLSAgICB2cDhfY29weShpbnRlcl9iX21vZGVzLCBjYy0+aW50ZXJfYl9tb2Rlcyk7Ci0jZW5kaWYKLQotCi0gICAgY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPSBjYy0+dGhpc19mcmFtZV9wZXJjZW50X2ludHJhOwotfQotCi0KLXZvaWQgdnA4X3NldHVwX2tleV9mcmFtZShWUDhfQ09NUCAqY3BpKQotewotICAgIC8vIFNldHVwIGZvciBLZXkgZnJhbWU6Ci0KLSAgICB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKCYgY3BpLT5jb21tb24pOwotICAgIHZwOF9rZl9kZWZhdWx0X2Jtb2RlX3Byb2JzKGNwaS0+Y29tbW9uLmtmX2Jtb2RlX3Byb2IpOwotCi0gICAgdnB4X21lbWNweShjcGktPmNvbW1vbi5mYy5tdmMsIHZwOF9kZWZhdWx0X212X2NvbnRleHQsIHNpemVvZih2cDhfZGVmYXVsdF9tdl9jb250ZXh0KSk7Ci0gICAgewotICAgICAgICBpbnQgZmxhZ1syXSA9IHsxLCAxfTsKLSAgICAgICAgdnA4X2J1aWxkX2NvbXBvbmVudF9jb3N0X3RhYmxlKGNwaS0+bWIubXZjb3N0LCBjcGktPm1iLm12c2FkY29zdCwgKGNvbnN0IE1WX0NPTlRFWFQgKikgY3BpLT5jb21tb24uZmMubXZjLCBmbGFnKTsKLSAgICB9Ci0KLSAgICB2cHhfbWVtc2V0KGNwaS0+Y29tbW9uLmZjLnByZV9tdmMsIDAsIHNpemVvZihjcGktPmNvbW1vbi5mYy5wcmVfbXZjKSk7ICAvL2luaXRpYWxpemUgcHJlX212YyB0byBhbGwgemVyby4KLQotICAgIC8vY3BpLT5jb21tb24uZmlsdGVyX2xldmVsID0gMDsgICAgICAvLyBSZXNldCBldmVyeSBrZXkgZnJhbWUuCi0gICAgY3BpLT5jb21tb24uZmlsdGVyX2xldmVsID0gY3BpLT5jb21tb24uYmFzZV9xaW5kZXggKiAzIC8gOCA7Ci0KLSAgICAvLyBQcm92aXNpb25hbCBpbnRlcnZhbCBiZWZvcmUgbmV4dCBHRgotICAgIGlmIChjcGktPmF1dG9fZ29sZCkKLSAgICAgICAgLy9jcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBERUZBVUxUX0dGX0lOVEVSVkFMOwotICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOwotICAgIGVsc2UKLSAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5nb2xkZnJlcTsKLQotICAgIGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gVFJVRTsKLSAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgPSBUUlVFOwotfQotCi12b2lkIHZwOF9jYWxjX2F1dG9faWZyYW1lX3RhcmdldF9zaXplKFZQOF9DT01QICpjcGkpCi17Ci0gICAgLy8gYm9vc3QgZGVmYXVsdHMgdG8gaGFsZiBzZWNvbmQKLSAgICBpbnQga2ZfYm9vc3Q7Ci0KLSAgICAvLyBDbGVhciBkb3duIG1teCByZWdpc3RlcnMgdG8gYWxsb3cgZmxvYXRpbmcgcG9pbnQgaW4gd2hhdCBmb2xsb3dzCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAgLy9fX2FzbSBlbW1zOwotCi0gICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDApCi0gICAgewotICAgICAgICB2cDhfY2FsY19pZnJhbWVfdGFyZ2V0X3NpemUoY3BpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjcGktPnBhc3MgPT0gMikKLSAgICB7Ci0gICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7ICAgICAgLy8gTmV3IFR3byBwYXNzIFJDCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIEJvb3N0IGRlcGVuZHMgc29tZXdoYXQgb24gZnJhbWUgcmF0ZQotICAgICAgICBrZl9ib29zdCA9IChpbnQpKDIgKiBjcGktPm91dHB1dF9mcmFtZV9yYXRlIC0gMTYpOwotCi0gICAgICAgIC8vIGFkanVzdG1lbnQgdXAgYmFzZWQgb24gcQotICAgICAgICBrZl9ib29zdCA9IGtmX2Jvb3N0ICoga2ZfYm9vc3RfcWFkanVzdG1lbnRbY3BpLT5uaV9hdl9xaV0gLyAxMDA7Ci0KLSAgICAgICAgLy8gZnJhbWUgc2VwYXJhdGlvbiBhZGp1c3RtZW50ICggZG93bikKLSAgICAgICAgaWYgKGNwaS0+ZnJhbWVzX3NpbmNlX2tleSAgPCBjcGktPm91dHB1dF9mcmFtZV9yYXRlIC8gMikKLSAgICAgICAgICAgIGtmX2Jvb3N0ID0gKGludCkoa2ZfYm9vc3QgKiBjcGktPmZyYW1lc19zaW5jZV9rZXkgLyAoY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZSAvIDIpKTsKLQotICAgICAgICBpZiAoa2ZfYm9vc3QgPCAxNikKLSAgICAgICAgICAgIGtmX2Jvb3N0ID0gMTY7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGhlIGFjdGl2ZSB3b3JzdCBxdWFsaXR5IHRvIHRoZSBiYXNlbGluZSB2YWx1ZSBmb3Iga2V5IGZyYW1lcy4KLSAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+d29yc3RfcXVhbGl0eTsKLQotICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gKCgxNiArIGtmX2Jvb3N0KSAgKiBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGgpID4+IDQ7Ci0gICAgfQotCi0KLSAgICAvLyBTaG91bGQgdGhlIG5leHQgZnJhbWUgYmUgYW4gYWx0cmVmIGZyYW1lCi0gICAgaWYgKGNwaS0+cGFzcyAhPSAyKQotICAgIHsKLSAgICAgICAgLy8gRm9yIG5vdyBBbHQgcmVmIGlzIG5vdCBhbGxvd2VkIGV4Y2VwdCBpbiAyIHBhc3MgbW9kZXMuCi0gICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IEZBTFNFOwotCi0gICAgICAgIC8qaWYgKCBjcGktPm94Y2YuZml4ZWRfcSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjcGktPm94Y2YucGxheV9hbHRlcm5hdGUgJiYgKCAoY3BpLT5sYXN0X2Jvb3N0LzIpID4gKDEwMCsoQUZfVEhSRVNIKmNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSkpICkgKQotICAgICAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IFRSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gRkFMU0U7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIGlmICgwKQotICAgIHsKLSAgICAgICAgRklMRSAqZjsKLQotICAgICAgICBmID0gZm9wZW4oImtmX2Jvb3N0LnN0dCIsICJhIik7Ci0gICAgICAgIC8vZnByaW50ZihmLCAiICU4ZCAlMTBkICUxMGQgJTEwZCAlMTBkICUxMGQgJTEwZFxuIiwKLSAgICAgICAgLy8gIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsICBjcGktPnRhcmdldF9iYW5kd2lkdGgsIGNwaS0+ZnJhbWVzX3RvX2tleSwga2ZfYm9vc3RfcWFkanVzdG1lbnRbY3BpLT5uaV9hdl9xaV0sIGNwaS0+a2ZfYm9vc3QsIChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICoxMDAgLyBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGgpLCBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICk7Ci0KLSAgICAgICAgZnByaW50ZihmLCAiICU4dSAlMTBkICUxMGQgJTEwZFxuIiwKLSAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCAgY3BpLT5nZnVfYm9vc3QsIGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWwsIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyk7Ci0KLSAgICAgICAgZmNsb3NlKGYpOwotICAgIH0KLX0KLQotLy8gIERvIHRoZSBiZXN0IHdlIGNhbiB0byBkZWZpbmUgdGhlIHBhcmFtZXRlcmVzIGZvciB0aGUgbmV4dCBHRiBiYXNlZCBvbiB3aGF0IGluZm9ybWF0aW9uIHdlIGhhdmUgYXZhaWxhYmxlLgotc3RhdGljIHZvaWQgY2FsY19nZl9wYXJhbXMoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBpbnQgUSA9IChjcGktPm94Y2YuZml4ZWRfcSA8IDApID8gY3BpLT5sYXN0X3FbSU5URVJfRlJBTUVdIDogY3BpLT5veGNmLmZpeGVkX3E7Ci0gICAgaW50IEJvb3N0ID0gMDsKLQotICAgIGludCBnZl9mcmFtZV91c2VhZ2UgPSAwOyAgICAgIC8vIEdvbGRlbiBmcmFtZSB1c2VhZ2Ugc2luY2UgbGFzdCBHRgotICAgIGludCB0b3RfbWJzID0gY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0lOVFJBX0ZSQU1FXSAgKwotICAgICAgICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0xBU1RfRlJBTUVdICAgKwotICAgICAgICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKwotICAgICAgICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV07Ci0KLSAgICBpbnQgcGN0X2dmX2FjdGl2ZSA9ICgxMDAgKiBjcGktPmdmX2FjdGl2ZV9jb3VudCkgLyAoY3BpLT5jb21tb24ubWJfcm93cyAqIGNwaS0+Y29tbW9uLm1iX2NvbHMpOwotCi0gICAgLy8gUmVzZXQgdGhlIGxhc3QgYm9vc3QgaW5kaWNhdG9yCi0gICAgLy9jcGktPmxhc3RfYm9vc3QgPSAxMDA7Ci0KLSAgICBpZiAodG90X21icykKLSAgICAgICAgZ2ZfZnJhbWVfdXNlYWdlID0gKGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtHT0xERU5fRlJBTUVdICsgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV0pICogMTAwIC8gdG90X21iczsKLQotICAgIGlmIChwY3RfZ2ZfYWN0aXZlID4gZ2ZfZnJhbWVfdXNlYWdlKQotICAgICAgICBnZl9mcmFtZV91c2VhZ2UgPSBwY3RfZ2ZfYWN0aXZlOwotCi0gICAgLy8gTm90IHR3byBwYXNzCi0gICAgaWYgKGNwaS0+cGFzcyAhPSAyKQotICAgIHsKLSAgICAgICAgLy8gU2luZ2xlIFBhc3MgbGFnZ2VkIG1vZGU6IFRCRAotICAgICAgICBpZiAoRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNpbmdsZSBQYXNzIGNvbXByZXNzaW9uOiBIYXMgdG8gdXNlIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgZGF0YQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSNpZiAwCi0gICAgICAgICAgICAvLyBFeHBlcmltZW50YWwgY29kZQotICAgICAgICAgICAgaW50IGluZGV4ID0gY3BpLT5vbmVfcGFzc19mcmFtZV9pbmRleDsKLSAgICAgICAgICAgIGludCBmcmFtZXNfdG9fc2NhbiA9IChjcGktPm1heF9nZl9pbnRlcnZhbCA8PSBNQVhfTEFHX0JVRkZFUlMpID8gY3BpLT5tYXhfZ2ZfaW50ZXJ2YWwgOiBNQVhfTEFHX0JVRkZFUlM7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKiogRXhwZXJpbWVudGFsIGNvZGUgLSBpbmNvbXBsZXRlCi0gICAgICAgICAgICBkb3VibGUgZGVjYXlfdmFsID0gMS4wOwotICAgICAgICAgICAgZG91YmxlIElJQWNjdW11bGF0b3IgPSAwLjA7Ci0gICAgICAgICAgICBkb3VibGUgbGFzdF9paWFjY3VtdWxhdG9yID0gMC4wOwotICAgICAgICAgICAgZG91YmxlIElJUmF0aW87Ci0KLSAgICAgICAgICAgIGNwaS0+b25lX3Bhc3NfZnJhbWVfaW5kZXggPSBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lJU1BWF9MQUdfQlVGRkVSUzsKLQotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCAoZnJhbWVzX3RvX3NjYW4gLSAxKTsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gTUFYX0xBR19CVUZGRVJTOwotICAgICAgICAgICAgICAgIGluZGV4IC0tOwotCi0gICAgICAgICAgICAgICAgaWYgKCBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2luZGV4XS5mcmFtZV9jb2RlZF9lcnJvciA+IDAuMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJSVJhdGlvID0gY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpbmRleF0uZnJhbWVfaW50cmFfZXJyb3IgLyBjcGktPm9uZV9wYXNzX2ZyYW1lX3N0YXRzW2luZGV4XS5mcmFtZV9jb2RlZF9lcnJvcjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIElJUmF0aW8gPiAzMC4wICkKLSAgICAgICAgICAgICAgICAgICAgICAgIElJUmF0aW8gPSAzMC4wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIElJUmF0aW8gPSAzMC4wOwotCi0gICAgICAgICAgICAgICAgSUlBY2N1bXVsYXRvciArPSBJSVJhdGlvICogZGVjYXlfdmFsOwotCi0gICAgICAgICAgICAgICAgZGVjYXlfdmFsID0gZGVjYXlfdmFsICogY3BpLT5vbmVfcGFzc19mcmFtZV9zdGF0c1tpbmRleF0uZnJhbWVfcGNudF9pbnRlcjsKLQotICAgICAgICAgICAgICAgIGlmICggICAgKGkgPiBNSU5fR0ZfSU5URVJWQUwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKElJQWNjdW11bGF0b3IgLSBsYXN0X2lpYWNjdW11bGF0b3IpIDwgMi4wKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdF9paWFjY3VtdWxhdG9yID0gSUlBY2N1bXVsYXRvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQm9vc3QgPSBJSUFjY3VtdWxhdG9yKjEwMC4wLzE2LjA7Ci0gICAgICAgICAgICBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsID0gaTsKLQotICAgICAgICAgICAgKi8KLSNlbHNlCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8gT0xEIGNvZGUKLQotICAgICAgICAgICAgLy8gQWRqdXN0IGJvb3N0IGJhc2VkIHVwb24gYW1iaWVudCBRCi0gICAgICAgICAgICBCb29zdCA9IEdGUV9BREpVU1RNRU5UOwotCi0gICAgICAgICAgICAvLyBBZGp1c3QgYmFzZWQgdXBvbiBtb3N0IHJlY2VudGx5IG1lYXN1cmUgaW50cmEgdXNlYWdlCi0gICAgICAgICAgICBCb29zdCA9IEJvb3N0ICogZ2ZfaW50cmFfdXNhZ2VfYWRqdXN0bWVudFsoY3BpLT50aGlzX2ZyYW1lX3BlcmNlbnRfaW50cmEgPCAxNSkgPyBjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA6IDE0XSAvIDEwMDsKLQotICAgICAgICAgICAgLy8gQWRqdXN0IGdmIGJvb3N0IGJhc2VkIHVwb24gR0YgdXNhZ2Ugc2luY2UgbGFzdCBHRgotICAgICAgICAgICAgQm9vc3QgPSBCb29zdCAqIGdmX2FkanVzdF90YWJsZVtnZl9mcmFtZV91c2VhZ2VdIC8gMTAwOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICAvLyBnb2xkZW4gZnJhbWUgYm9vc3Qgd2l0aG91dCByZWNvZGUgbG9vcCBvZnRlbiBnb2VzIGF3cnkuICBiZSBzYWZlIGJ5IGtlZXBpbmcgbnVtYmVycyBkb3duLgotICAgICAgICBpZiAoIWNwaS0+c2YucmVjb2RlX2xvb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjcGktPmNvbXByZXNzb3Jfc3BlZWQgPT0gMikKLSAgICAgICAgICAgICAgICBCb29zdCA9IEJvb3N0IC8gMjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFwcGx5IGFuIHVwcGVyIGxpbWl0IGJhc2VkIG9uIFEgZm9yIDEgcGFzcyBlbmNvZGVzCi0gICAgICAgIGlmIChCb29zdCA+IGtmX2dmX2Jvb3N0X3FsaW1pdHNbUV0gJiYgKGNwaS0+cGFzcyA9PSAwKSkKLSAgICAgICAgICAgIEJvb3N0ID0ga2ZfZ2ZfYm9vc3RfcWxpbWl0c1tRXTsKLQotICAgICAgICAvLyBBcHBseSBsb3dlciBsaW1pdHMgdG8gYm9vc3QuCi0gICAgICAgIGVsc2UgaWYgKEJvb3N0IDwgMTEwKQotICAgICAgICAgICAgQm9vc3QgPSAxMTA7Ci0KLSAgICAgICAgLy8gTm90ZSB0aGUgYm9vc3QgdXNlZAotICAgICAgICBjcGktPmxhc3RfYm9vc3QgPSBCb29zdDsKLQotICAgIH0KLQotICAgIC8vIEVzdGltYXRlIG5leHQgaW50ZXJ2YWwKLSAgICAvLyBUaGlzIGlzIHVwZGF0ZWQgb25jZSB0aGUgcmVhbCBmcmFtZSBzaXplL2Jvb3N0IGlzIGtub3duLgotICAgIGlmIChjcGktPm94Y2YuZml4ZWRfcSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPnBhc3MgPT0gMikgICAgICAgICAvLyAyIFBhc3MKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlID0gY3BpLT5iYXNlbGluZV9nZl9pbnRlcnZhbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgUGFzcwotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPmJhc2VsaW5lX2dmX2ludGVydmFsOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5sYXN0X2Jvb3N0ID4gNzUwKQotICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSsrOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5sYXN0X2Jvb3N0ID4gMTAwMCkKLSAgICAgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUrKzsKLQotICAgICAgICAgICAgaWYgKGNwaS0+bGFzdF9ib29zdCA+IDEyNTApCi0gICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlKys7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmxhc3RfYm9vc3QgPj0gMTUwMCkKLSAgICAgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgKys7Ci0KLSAgICAgICAgICAgIGlmIChnZl9pbnRlcnZhbF90YWJsZVtnZl9mcmFtZV91c2VhZ2VdID4gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlKQotICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9IGdmX2ludGVydmFsX3RhYmxlW2dmX2ZyYW1lX3VzZWFnZV07Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPiBjcGktPm1heF9nZl9pbnRlcnZhbCkKLSAgICAgICAgICAgICAgICBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPSBjcGktPm1heF9nZl9pbnRlcnZhbDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSA9IGNwaS0+YmFzZWxpbmVfZ2ZfaW50ZXJ2YWw7Ci0KLSAgICAvLyBBUkYgb24gb3Igb2ZmCi0gICAgaWYgKGNwaS0+cGFzcyAhPSAyKQotICAgIHsKLSAgICAgICAgLy8gRm9yIG5vdyBBbHQgcmVmIGlzIG5vdCBhbGxvd2VkIGV4Y2VwdCBpbiAyIHBhc3MgbW9kZXMuCi0gICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IEZBTFNFOwotCi0gICAgICAgIC8qaWYgKCBjcGktPm94Y2YuZml4ZWRfcSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjcGktPm94Y2YucGxheV9hbHRlcm5hdGUgJiYgKGNwaS0+bGFzdF9ib29zdCA+ICgxMDAgKyAoQUZfVEhSRVNIKmNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSkpICkgKQotICAgICAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IFRSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gRkFMU0U7Ci0gICAgICAgIH0qLwotICAgIH0KLX0KLS8qIFRoaXMgaXMgZXF1dmlhbGVudCB0byBlc3RpbWF0ZV9iaXRzX2F0X3Egd2l0aG91dCB0aGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3Rvci4gKi8KLXN0YXRpYyBpbnQgYmFzZWxpbmVfYml0c19hdF9xKGludCBmcmFtZV9raW5kLCBpbnQgUSwgaW50IE1CcykKLXsKLSAgICBpbnQgQnBtID0gdnA4X2JpdHNfcGVyX21iW2ZyYW1lX2tpbmRdW1FdOwotCi0gICAgLyogQXR0ZW1wdCB0byByZXRhaW4gcmVhc29uYWJsZSBhY2N1cmFjeSB3aXRob3V0IG92ZXJmbG93LiBUaGUgY3V0b2ZmIGlzCi0gICAgICogY2hvc2VuIHN1Y2ggdGhhdCB0aGUgbWF4aW11bSBwcm9kdWN0IG9mIEJwbSBhbmQgTUJzIGZpdHMgMzEgYml0cy4gVGhlCi0gICAgICogbGFyZ2VzdCBCcG0gdGFrZXMgMjAgYml0cy4KLSAgICAgKi8KLSAgICBpZiAoTUJzID4gKDEgPDwgMTEpKQotICAgICAgICByZXR1cm4gKEJwbSA+PiBCUEVSX01CX05PUk1CSVRTKSAqIE1CczsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAoQnBtICogTUJzKSA+PiBCUEVSX01CX05PUk1CSVRTOwotfQotCi12b2lkIHZwOF9jYWxjX2lmcmFtZV90YXJnZXRfc2l6ZShWUDhfQ09NUCAqY3BpKQotewotICAgIGludCBROwotICAgIGludCBCb29zdCA9IDEwMDsKLQotICAgIFEgPSAoY3BpLT5veGNmLmZpeGVkX3EgPj0gMCkgPyBjcGktPm94Y2YuZml4ZWRfcSA6IGNwaS0+YXZnX2ZyYW1lX3FpbmRleDsKLQotICAgIGlmIChjcGktPmF1dG9fYWRqdXN0X2tleV9xdWFudGl6ZXIgPT0gMSkKLSAgICB7Ci0gICAgICAgIC8vIElmIChhdXRvX2FkanVzdF9rZXlfcXVhbnRpemVyPT0xKSB0aGVuIGEgbG93ZXIgUSBpcyBzZWxlY3RlZCBmb3Iga2V5LWZyYW1lcy4KLSAgICAgICAgLy8gVGhlIGVuaGFuY2VkIFEgaXMgY2FsY3VsYXRlZCBzbyBhcyB0byBib29zdCB0aGUga2V5IGZyYW1lIHNpemUgYnkgYSBmYWN0b3IKLSAgICAgICAgLy8gc3BlY2lmaWVkIGluIGtmX2Jvb3N0X3FhZGp1c3RtZW50LiBBbHNvLCBjYW4gYWRqdXN0IGJhc2VkIG9uIGRpc3RhbmNlCi0gICAgICAgIC8vIGJldHdlZW4ga2V5IGZyYW1lcy4KLQotICAgICAgICAvLyBBZGp1c3QgYm9vc3QgYmFzZWQgdXBvbiBhbWJpZW50IFEKLSAgICAgICAgQm9vc3QgPSBrZl9ib29zdF9xYWRqdXN0bWVudFtRXTsKLQotICAgICAgICAvLyBNYWtlIHRoZSBLZXkgZnJhbWUgYm9vc3QgbGVzcyBpZiB0aGUgc2VwZXJhdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBrZXkgZnJhbWUgaXMgc21hbGwKLSAgICAgICAgaWYgKGNwaS0+ZnJhbWVzX3NpbmNlX2tleSA8IDE2KQotICAgICAgICAgICAgQm9vc3QgPSBCb29zdCAqIGtmX2Jvb3N0X3NlcGVyYXRpb25fYWRqdXN0bWVudFtjcGktPmZyYW1lc19zaW5jZV9rZXldIC8gMTAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBCb29zdCA9IEJvb3N0ICoga2ZfYm9vc3Rfc2VwZXJhdGlvbl9hZGp1c3RtZW50WzE1XSAvIDEwMDsKLQotICAgICAgICAvLyBBcHBseSBsaW1pdHMgb24gYm9vc3QKLSAgICAgICAgaWYgKEJvb3N0ID4ga2ZfZ2ZfYm9vc3RfcWxpbWl0c1tRXSkKLSAgICAgICAgICAgIEJvb3N0ID0ga2ZfZ2ZfYm9vc3RfcWxpbWl0c1tRXTsKLSAgICAgICAgZWxzZSBpZiAoQm9vc3QgPCAxMjApCi0gICAgICAgICAgICBCb29zdCA9IDEyMDsKLSAgICB9Ci0KLSAgICAvLyBLZWVwIGEgcmVjb3JkIG9mIHRoZSBib29zdCB0aGF0IHdhcyB1c2VkCi0gICAgY3BpLT5sYXN0X2Jvb3N0ID0gQm9vc3Q7Ci0KLSAgICAvLyBTaG91bGQgdGhlIG5leHQgZnJhbWUgYmUgYW4gYWx0cmVmIGZyYW1lCi0gICAgaWYgKGNwaS0+cGFzcyAhPSAyKQotICAgIHsKLSAgICAgICAgLy8gRm9yIG5vdyBBbHQgcmVmIGlzIG5vdCBhbGxvd2VkIGV4Y2VwdCBpbiAyIHBhc3MgbW9kZXMuCi0gICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IEZBTFNFOwotCi0gICAgICAgIC8qaWYgKCBjcGktPm94Y2YuZml4ZWRfcSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjcGktPm94Y2YucGxheV9hbHRlcm5hdGUgJiYgKCAoY3BpLT5sYXN0X2Jvb3N0LzIpID4gKDEwMCsoQUZfVEhSRVNIKmNwaS0+ZnJhbWVzX3RpbGxfZ2ZfdXBkYXRlX2R1ZSkpICkgKQotICAgICAgICAgICAgICAgIGNwaS0+c291cmNlX2FsdF9yZWZfcGVuZGluZyA9IFRSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3BpLT5zb3VyY2VfYWx0X3JlZl9wZW5kaW5nID0gRkFMU0U7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIGlmIChjcGktPm94Y2YuZml4ZWRfcSA+PSAwKQotICAgIHsKLSAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IChiYXNlbGluZV9iaXRzX2F0X3EoMCwgUSwgY3BpLT5jb21tb24uTUJzKSAqIEJvb3N0KSAvIDEwMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgICBpbnQgYml0c19wZXJfbWJfYXRfdGhpc19xIDsKLQotICAgICAgICBpZiAoY3BpLT5veGNmLmVycm9yX3Jlc2lsaWVudF9tb2RlID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSAyICogY3BpLT5hdl9wZXJfZnJhbWVfYmFuZHdpZHRoOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmF0ZSB0YXJnZXR0ZWQgc2NlbmFyaW86Ci0gICAgICAgIC8vIEJlIGNhcmVmdWwgb2YgMzItYml0IE9WRVJGTE9XIGlmIHJlc3RydWN0dXJpbmcgdGhlIGNhbHVjbGF0aW9uIG9mIGNwaS0+dGhpc19mcmFtZV90YXJnZXQKLSAgICAgICAgYml0c19wZXJfbWJfYXRfdGhpc19xID0gKGludCkoLjUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmtleV9mcmFtZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yICogdnA4X2JpdHNfcGVyX21iWzBdW1FdKTsKLQotICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gKCgoYml0c19wZXJfbWJfYXRfdGhpc19xICogY3BpLT5jb21tb24uTUJzKSA+PiBCUEVSX01CX05PUk1CSVRTKSAqIEJvb3N0KSAvIDEwMDsKLQotICAgICAgICAvLyBSZXNldCB0aGUgYWN0aXZlIHdvcnN0IHF1YWxpdHkgdG8gdGhlIGJhc2VsaW5lIHZhbHVlIGZvciBrZXkgZnJhbWVzLgotICAgICAgICBpZiAoY3BpLT5wYXNzIDwgMikKLSAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPndvcnN0X3F1YWxpdHk7Ci0gICAgfQotfQotCi0KLQotdm9pZCB2cDhfY2FsY19wZnJhbWVfdGFyZ2V0X3NpemUoVlA4X0NPTVAgKmNwaSkKLXsKLSAgICBpbnQgbWluX2ZyYW1lX3RhcmdldDsKLSAgICBpbnQgQWRqdXN0bWVudDsKLQotICAgIC8vIFNldCB0aGUgbWluIGZyYW1lIGJhbmR3aWR0aC4KLSAgICAvL21pbl9mcmFtZV90YXJnZXQgPSBlc3RpbWF0ZV9taW5fZnJhbWVfc2l6ZSggY3BpICk7Ci0gICAgbWluX2ZyYW1lX3RhcmdldCA9IDA7Ci0KLSAgICBpZiAoY3BpLT5wYXNzID09IDIpCi0gICAgewotICAgICAgICBtaW5fZnJhbWVfdGFyZ2V0ID0gY3BpLT5taW5fZnJhbWVfYmFuZHdpZHRoOwotCi0gICAgICAgIGlmIChtaW5fZnJhbWVfdGFyZ2V0IDwgKGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCA+PiA1KSkKLSAgICAgICAgICAgIG1pbl9mcmFtZV90YXJnZXQgPSBjcGktPmF2X3Blcl9mcmFtZV9iYW5kd2lkdGggPj4gNTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluX2ZyYW1lX3RhcmdldCA8IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAvIDQpCi0gICAgICAgIG1pbl9mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggLyA0OwotCi0KLSAgICAvLyBTcGVjaWFsIGFsdCByZWZlcmVuY2UgZnJhbWUgY2FzZQotICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUpCi0gICAgewotICAgICAgICBpZiAoY3BpLT5wYXNzID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCA9IGNwaS0+Z2ZfYml0czsgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlciBmcmFtZSBiaXQgdGFyZ2V0IGZvciB0aGUgYWx0IHJlZiBmcmFtZQotICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE9uZSBQYXNzID8/PyBUQkQgKi8KLSAgICAgICAgLyplbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBmcmFtZXNfaW5fc2VjdGlvbjsKLSAgICAgICAgICAgIGludCBhbGxvY2F0aW9uX2NodW5rczsKLSAgICAgICAgICAgIGludCBRID0gKGNwaS0+b3hjZi5maXhlZF9xIDwgMCkgPyBjcGktPmxhc3RfcVtJTlRFUl9GUkFNRV0gOiBjcGktPm94Y2YuZml4ZWRfcTsKLSAgICAgICAgICAgIGludCBhbHRfYm9vc3Q7Ci0gICAgICAgICAgICBpbnQgbWF4X2FyZl9yYXRlOwotCi0gICAgICAgICAgICBhbHRfYm9vc3QgPSAoY3BpLT5nZnVfYm9vc3QgKiAzICogR0ZRX0FESlVTVE1FTlQpIC8gKDIgKiAxMDApOwotICAgICAgICAgICAgYWx0X2Jvb3N0ICs9IChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgKiA1MCk7Ci0KLSAgICAgICAgICAgIC8vIElmIGFsdCByZWYgaXMgbm90IGN1cnJlbnRseSBhY3RpdmUgdGhlbiB3ZSBoYXZlIGEgcG90dGVudGlhbCBkb3VibGUgaGl0IHdpdGggR0YgYW5kIEFSRiBzbyByZWR1Y2UgdGhlIGJvb3N0IGEgYml0LgotICAgICAgICAgICAgLy8gQSBzaW1pbGFyIHRoaW5nIGlzIGRvbmUgb24gR0ZzIHRoYXQgcHJlY2VlZCBhIGFyZiB1cGRhdGUuCi0gICAgICAgICAgICBpZiAoICFjcGktPnNvdXJjZV9hbHRfcmVmX2FjdGl2ZSApCi0gICAgICAgICAgICAgICAgYWx0X2Jvb3N0ID0gYWx0X2Jvb3N0ICogMyAvIDQ7Ci0KLSAgICAgICAgICAgIGZyYW1lc19pbl9zZWN0aW9uID0gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlKzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFuZGFyZCBmcmFtZXMgKyBHRgotICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgPSAoZnJhbWVzX2luX3NlY3Rpb24gKiAxMDApICsgYWx0X2Jvb3N0OwotCi0gICAgICAgICAgICAvLyBOb3JtYWxpemUgQWx0Ym9vc3QgYW5kIGFsbG9jYXRpb25zIGNodW5jayBkb3duIHRvIHByZXZlbnQgb3ZlcmZsb3cKLSAgICAgICAgICAgIHdoaWxlICggYWx0X2Jvb3N0ID4gMTAwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0X2Jvb3N0IC89IDI7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgLz0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBiaXRzX2luX3NlY3Rpb247Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGNwaS0+a2Zfb3ZlcnNwZW5kX2JpdHMgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAoY3BpLT5rZl9iaXRyYXRlX2FkanVzdG1lbnQgPD0gY3BpLT5rZl9vdmVyc3BlbmRfYml0cykgPyBjcGktPmtmX2JpdHJhdGVfYWRqdXN0bWVudCA6IGNwaS0+a2Zfb3ZlcnNwZW5kX2JpdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBBZGp1c3RtZW50ID4gKGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAtIG1pbl9mcmFtZV90YXJnZXQpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAoY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoIC0gbWluX2ZyYW1lX3RhcmdldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3BpLT5rZl9vdmVyc3BlbmRfYml0cyAtPSBBZGp1c3RtZW50OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBpbnRlciBmcmFtZSBiYW5kd2lkdGggdGFyZ2V0IGZvciB0aGUgbmV4dCBmZXcgZnJhbWVzIGRlc2lnbmVkIHRvIHJlY292ZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gYW55IGV4dHJhIGJpdHMgc3BlbnQgb24gdGhlIGtleSBmcmFtZS4KLSAgICAgICAgICAgICAgICAgICAgY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggLSBBZGp1c3RtZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIGNwaS0+aW50ZXJfZnJhbWVfdGFyZ2V0IDwgbWluX2ZyYW1lX3RhcmdldCApCi0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmludGVyX2ZyYW1lX3RhcmdldCA9IG1pbl9mcmFtZV90YXJnZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBiaXRzX2luX3NlY3Rpb24gPSBjcGktPmludGVyX2ZyYW1lX3RhcmdldCAqIGZyYW1lc19pbl9zZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgLy8gQXZvaWQgbG9zcyBvZiBwcmVjaXNpb24gYnV0IGF2b2lkIG92ZXJmbG93Ci0gICAgICAgICAgICAgICAgaWYgKCAoYml0c19pbl9zZWN0aW9uPj43KSA+IGFsbG9jYXRpb25fY2h1bmtzICkKLSAgICAgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IGFsdF9ib29zdCAqIChiaXRzX2luX3NlY3Rpb24gLyBhbGxvY2F0aW9uX2NodW5rcyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gKGFsdF9ib29zdCAqIGJpdHNfaW5fc2VjdGlvbikgLyBhbGxvY2F0aW9uX2NodW5rczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotICAgIH0KLQotICAgIC8vIE5vcm1hbCBmcmFtZXMgKGdmLGFuZCBpbnRlcikKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyAyIHBhc3MKLSAgICAgICAgaWYgKGNwaS0+cGFzcyA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIC8vIDEgcGFzcwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE1ha2UgcmF0ZSBhZGp1c3RtZW50IHRvIHJlY292ZXIgYml0cyBzcGVudCBpbiBrZXkgZnJhbWUKLSAgICAgICAgICAgIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBrZXkgZnJhbWUgaW50ZXIgZGF0YSByYXRlIGNvcnJlY3Rpb24gc2hvdWxkIHN0aWxsIGJlIGluIGZvcmNlCi0gICAgICAgICAgICBpZiAoY3BpLT5rZl9vdmVyc3BlbmRfYml0cyA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWRqdXN0bWVudCA9IChjcGktPmtmX2JpdHJhdGVfYWRqdXN0bWVudCA8PSBjcGktPmtmX292ZXJzcGVuZF9iaXRzKSA/IGNwaS0+a2ZfYml0cmF0ZV9hZGp1c3RtZW50IDogY3BpLT5rZl9vdmVyc3BlbmRfYml0czsKLQotICAgICAgICAgICAgICAgIGlmIChBZGp1c3RtZW50ID4gKGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAtIG1pbl9mcmFtZV90YXJnZXQpKQotICAgICAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gKGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAtIG1pbl9mcmFtZV90YXJnZXQpOwotCi0gICAgICAgICAgICAgICAgY3BpLT5rZl9vdmVyc3BlbmRfYml0cyAtPSBBZGp1c3RtZW50OwotCi0gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGFuIGludGVyIGZyYW1lIGJhbmR3aWR0aCB0YXJnZXQgZm9yIHRoZSBuZXh0IGZldyBmcmFtZXMgZGVzaWduZWQgdG8gcmVjb3ZlcgotICAgICAgICAgICAgICAgIC8vIGFueSBleHRyYSBiaXRzIHNwZW50IG9uIHRoZSBrZXkgZnJhbWUuCi0gICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCAtIEFkanVzdG1lbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA8IG1pbl9mcmFtZV90YXJnZXQpCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBtaW5fZnJhbWVfdGFyZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGg7Ci0KLSAgICAgICAgICAgIC8vIElmIGFwcHJvcHJpYXRlIG1ha2UgYW4gYWRqdXN0bWVudCB0byByZWNvdmVyIGJpdHMgc3BlbnQgb24gYSByZWNlbnQgR0YKLSAgICAgICAgICAgIGlmICgoY3BpLT5nZl9vdmVyc3BlbmRfYml0cyA+IDApICYmIChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID4gbWluX2ZyYW1lX3RhcmdldCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IEFkanVzdG1lbnQgPSAoY3BpLT5ub25fZ2ZfYml0cmF0ZV9hZGp1c3RtZW50IDw9IGNwaS0+Z2Zfb3ZlcnNwZW5kX2JpdHMpID8gY3BpLT5ub25fZ2ZfYml0cmF0ZV9hZGp1c3RtZW50IDogY3BpLT5nZl9vdmVyc3BlbmRfYml0czsKLQotICAgICAgICAgICAgICAgIGlmIChBZGp1c3RtZW50ID4gKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLSBtaW5fZnJhbWVfdGFyZ2V0KSkKLSAgICAgICAgICAgICAgICAgICAgQWRqdXN0bWVudCA9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IC0gbWluX2ZyYW1lX3RhcmdldCk7Ci0KLSAgICAgICAgICAgICAgICBjcGktPmdmX292ZXJzcGVuZF9iaXRzIC09IEFkanVzdG1lbnQ7Ci0gICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAtPSBBZGp1c3RtZW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBcHBseSBzbWFsbCArIGFuZCAtIGJvb3N0cyBmb3Igbm9uIGdmIGZyYW1lcwotICAgICAgICAgICAgaWYgKChjcGktPmxhc3RfYm9vc3QgPiAxNTApICYmIChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPiAwKSAmJgotICAgICAgICAgICAgICAgIChjcGktPmN1cnJlbnRfZ2ZfaW50ZXJ2YWwgPj0gKE1JTl9HRl9JTlRFUlZBTCA8PCAxKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gJSBBZGp1c3RtZW50IGxpbWl0ZWQgdG8gdGhlIHJhbmdlIDElIHRvIDEwJQotICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAoY3BpLT5sYXN0X2Jvb3N0IC0gMTAwKSA+PiA1OwotCi0gICAgICAgICAgICAgICAgaWYgKEFkanVzdG1lbnQgPCAxKQotICAgICAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChBZGp1c3RtZW50ID4gMTApCi0gICAgICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAxMDsKLQotICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYml0cwotICAgICAgICAgICAgICAgIEFkanVzdG1lbnQgPSAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIEFkanVzdG1lbnQpIC8gMTAwOwotCi0gICAgICAgICAgICAgICAgaWYgKEFkanVzdG1lbnQgPiAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAtIG1pbl9mcmFtZV90YXJnZXQpKQotICAgICAgICAgICAgICAgICAgICBBZGp1c3RtZW50ID0gKGNwaS0+dGhpc19mcmFtZV90YXJnZXQgLSBtaW5fZnJhbWVfdGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZXNfc2luY2VfZ29sZGVuID09IChjcGktPmN1cnJlbnRfZ2ZfaW50ZXJ2YWwgPj4gMSkpCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKz0gKChjcGktPmN1cnJlbnRfZ2ZfaW50ZXJ2YWwgLSAxKSAqIEFkanVzdG1lbnQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAtPSBBZGp1c3RtZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2V0IGEgcmVkdWNlZCBkYXRhIHJhdGUgdGFyZ2V0IGZvciBvdXIgaW5pdGlhbCBRIGNhbGN1bGF0aW9uLgotICAgIC8vIFRoaXMgc2hvdWxkIGhlbHAgdG8gc2F2ZSBiaXRzIGR1cmluZyBlYXJpZXIgc2VjdGlvbnMuCi0gICAgaWYgKChjcGktPm94Y2YudW5kZXJfc2hvb3RfcGN0ID4gMCkgJiYgKGNwaS0+b3hjZi51bmRlcl9zaG9vdF9wY3QgPD0gMTAwKSkKLSAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogY3BpLT5veGNmLnVuZGVyX3Nob290X3BjdCkgLyAxMDA7Ci0KLSAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgdG90YWwgc3VtIG9mIGFkanVzdG1lbnRzIGlzIG5vdCBhYm92ZSB0aGUgbWF4aW11bSBhbGxvd2VkCi0gICAgLy8gVGhhdCBpcyB0aGF0IGhhdmluZyBhbGxvd2VkIGZvciBLRiBhbmQgR0YgcGVuYWx0aWVzIHdlIGhhdmUgbm90IHB1c2hlZCB0aGUKLSAgICAvLyBjdXJyZW50IGludGVyZnJhbWUgdGFyZ2V0IHRvIGxvdy4gSWYgdGhlIGFkanVzdG1lbnQgd2UgYXBwbHkgaGVyZSBpcyBub3QgY2FwYWJsZSBvZiByZWNvdmVyaW5nCi0gICAgLy8gYWxsIHRoZSBleHRyYSBiaXRzIHdlIGhhdmUgc3BlbnQgaW4gdGhlIEtGIG9yIEdGIHRoZW4gdGhlIHJlbWFpbmRlciB3aWxsIGhhdmUgdG8gYmUgcmVjb3ZlcmVkIG92ZXIKLSAgICAvLyBhIGxvbmdlciB0aW1lIHNwYW4gdmlhIG90aGVyIGJ1ZmZlciAvIHJhdGUgY29udHJvbCBtZWNoYW5pc21zLgotICAgIGlmIChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0IDwgbWluX2ZyYW1lX3RhcmdldCkKLSAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IG1pbl9mcmFtZV90YXJnZXQ7Ci0KLSAgICBpZiAoIWNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSkKLSAgICAgICAgLy8gTm90ZSB0aGUgYmFzZWxpbmUgdGFyZ2V0IGRhdGEgcmF0ZSBmb3IgdGhpcyBpbnRlciBmcmFtZS4KLSAgICAgICAgY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0OwotCi0gICAgLy8gT25lIFBhc3Mgc3BlY2lmaWMgY29kZQotICAgIGlmIChjcGktPnBhc3MgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8vIEFkYXB0IHRhcmdldCBmcmFtZSBzaXplIHdpdGggcmVzcGVjdCB0byBhbnkgYnVmZmVyaW5nIGNvbnN0cmFpbnRzOgotICAgICAgICBpZiAoY3BpLT5idWZmZXJlZF9tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb25lX3BlcmNlbnRfYml0cyA9IDEgKyBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgLyAxMDA7Ci0KLSAgICAgICAgICAgIGlmICgoY3BpLT5idWZmZXJfbGV2ZWwgPCBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpIHx8Ci0gICAgICAgICAgICAgICAgKGNwaS0+Yml0c19vZmZfdGFyZ2V0IDwgY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcGVyY2VudF9sb3cgPSAwOwotCi0gICAgICAgICAgICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgb3Igbm90IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBmcmFtZSBkYXRhIHJhdGUgdGFyZ2V0LgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGFyZSBiZWxvdyB0aGUgb3B0aW1hbCBidWZmZXIgZnVsbG5lc3MgbGV2ZWwgYW5kIGFkaGVyZW5jZQotICAgICAgICAgICAgICAgIC8vIHRvIGJ1ZmZlcmluZyBjb250cmFpbnRzIGlzIGltcG9ydGFudCB0byB0aGUgZW5kIHVzZWFnZSB0aGVuIGFkanVzdAotICAgICAgICAgICAgICAgIC8vIHRoZSBwZXIgZnJhbWUgdGFyZ2V0LgotICAgICAgICAgICAgICAgIGlmICgoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpICYmCi0gICAgICAgICAgICAgICAgICAgIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwZXJjZW50X2xvdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC0gY3BpLT5idWZmZXJfbGV2ZWwpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgIG9uZV9wZXJjZW50X2JpdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRfbG93ID4gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9sb3cgPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBlcmNlbnRfbG93IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfbG93ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQXJlIHdlIG92ZXJzaG9vdGluZyB0aGUgbG9uZyB0ZXJtIGNsaXAgZGF0YSByYXRlLi4uCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5iaXRzX29mZl90YXJnZXQgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IHBlciBmcmFtZSBkYXRhIHRhcmdldCBkb3dud2FyZHMgdG8gY29tcGVuc2F0ZS4KLSAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9sb3cgPSAoaW50KSgxMDAgKiAtY3BpLT5iaXRzX29mZl90YXJnZXQgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+dG90YWxfYnl0ZV9jb3VudCAqIDgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudF9sb3cgPiAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50X2xvdyA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGVyY2VudF9sb3cgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9sb3cgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGxvd2VyIHRoZSB0YXJnZXQgYmFuZHdpZHRoIGZvciB0aGlzIGZyYW1lLgotICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPQotICAgICAgICAgICAgICAgICAgICAoY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqICgxMDAgLSAocGVyY2VudF9sb3cgLyAyKSkpIC8gMTAwOwotCi0gICAgICAgICAgICAgICAgLy8gQXJlIHdlIHVzaW5nIGFsbG93aW5nIGNvbnRyb2wgb2YgYWN0aXZlX3dvcnN0X2FsbG93ZWRfcQotICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBidWZmZXIgbGV2ZWwuCi0gICAgICAgICAgICAgICAgaWYgKGNwaS0+YXV0b193b3JzdF9xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNyaXRpY2FsX2J1ZmZlcl9sZXZlbDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIGFwcGxpY2F0aW9ucyB0aGUgbW9zdCBpbXBvcnRhbnQgZmFjdG9yIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIGNwaS0+YnVmZmVyX2xldmVsIGFzIHRoaXMgdGFrZXMgaW50byBhY2NvdW50IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgc2hvcnQgdGVybSBidWZmZXJpbmcgY29uc3RyYWludHMuIEhvd2V2ZXIsCi0gICAgICAgICAgICAgICAgICAgIC8vIGhpdHRpbmcgdGhlIGxvbmcgdGVybSBjbGlwIGRhdGEgcmF0ZSB0YXJnZXQgaXMgYWxzbwotICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnRhbnQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFrZSB0aGUgc21hbGxlciBvZiBjcGktPmJ1ZmZlcl9sZXZlbCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNwaS0+Yml0c19vZmZfdGFyZ2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcml0aWNhbF9idWZmZXJfbGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+Yml0c19vZmZfdGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3BpLT5idWZmZXJfbGV2ZWwgOiBjcGktPmJpdHNfb2ZmX3RhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgbG9jYWwgZmlsZSBwbGF5YmFjayBzaG9ydCB0ZXJtIGJ1ZmZlcmluZyBjb250cmFpbnRzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBsZXNzIG9mIGFuIGlzc3VlCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgb25seSBob3cgd2UgYXJlIGRvaW5nIGZvciB0aGUgY2xpcCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGljYWxfYnVmZmVyX2xldmVsID0gY3BpLT5iaXRzX29mZl90YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGFjdGl2ZSB3b3JzdCBxdWFsaXR5IGJhc2VkIHVwb24gdGhlIHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBmdWxsbmVzcyBudW1iZXIuCi0gICAgICAgICAgICAgICAgICAgIGlmIChjcml0aWNhbF9idWZmZXJfbGV2ZWwgPCBjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY3JpdGljYWxfYnVmZmVyX2xldmVsID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA+PiAyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UNjQgcWFkanVzdG1lbnRfcmFuZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPndvcnN0X3F1YWxpdHkgLSBjcGktPm5pX2F2X3FpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDY0IGFib3ZlX2Jhc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3JpdGljYWxfYnVmZmVyX2xldmVsIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwgPj4gMikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhY3RpdmUgd29yc3QgcXVhbGl0eSBkb3duIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcGktPm5pX2F2X3FpIHdoZW4gKGNyaXRpY2FsX2J1ZmZlcl9sZXZlbCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNwaS0+b3B0aW1hbF9idWZmZXJfbGV2ZWwpIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3BpLT53b3JzdF9xdWFsaXR5IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY3JpdGljYWxfYnVmZmVyX2xldmVsID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNwaS0+b3B0aW1hbF9idWZmZXJfbGV2ZWwgPj4gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT53b3JzdF9xdWFsaXR5IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChxYWRqdXN0bWVudF9yYW5nZSAqIGFib3ZlX2Jhc2UpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcGktPm94Y2Yub3B0aW1hbF9idWZmZXJfbGV2ZWwqMz4+MikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPndvcnN0X3F1YWxpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gY3BpLT5uaV9hdl9xaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gY3BpLT53b3JzdF9xdWFsaXR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcGVyY2VudF9oaWdoOwotCi0gICAgICAgICAgICAgICAgaWYgKGNwaS0+Yml0c19vZmZfdGFyZ2V0ID4gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9oaWdoID0gKGludCkoMTAwICogKGNwaS0+Yml0c19vZmZfdGFyZ2V0IC0gY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsKSAvIChjcGktPnRvdGFsX2J5dGVfY291bnQgKiA4KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRfaGlnaCA+IDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfaGlnaCA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGVyY2VudF9oaWdoIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfaGlnaCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IChjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogKDEwMCArIChwZXJjZW50X2hpZ2ggLyAyKSkpIC8gMTAwOwotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQXJlIHdlIGFsbG93aW5nIGNvbnRyb2wgb2YgYWN0aXZlX3dvcnN0X2FsbG93ZWRfcSBhY2NvcmRpbmcgdG8gYnVmZmVybCBsZXZlbC4KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5hdXRvX3dvcnN0X3EpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHRoZSByZWxheGVkIGJ1ZmZlciBtb2RlbCBzdGljayB0byB0aGUgdXNlciBzcGVjaWZpZWQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+bmlfYXZfcWk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPSBjcGktPndvcnN0X3F1YWxpdHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgYWN0aXZlX2Jlc3RfcXVhbGl0eSB0byBwcmV2ZW50IHF1YWxpdHkgcmlzaW5nIHRvbyBoaWdoCi0gICAgICAgICAgICBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkgPSBjcGktPmJlc3RfcXVhbGl0eTsKLQotICAgICAgICAgICAgLy8gV29yc3QgcXVhbGl0eSBvYnZpb3VzbHkgbXVzdCBub3QgYmUgYmV0dGVyIHRoYW4gYmVzdCBxdWFsaXR5Ci0gICAgICAgICAgICBpZiAoY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA8PSBjcGktPmFjdGl2ZV9iZXN0X3F1YWxpdHkpCi0gICAgICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSArIDE7Ci0KLSAgICAgICAgfQotICAgICAgICAvLyBVbmJ1ZmZlcmVkIG1vZGUgKGVnLiB2aWRlbyBjb25mZXJlbmNpbmcpCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBhY3RpdmUgd29yc3QgcXVhbGl0eQotICAgICAgICAgICAgY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSA9IGNwaS0+d29yc3RfcXVhbGl0eTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNwZWNpYWwgdHJhcCBmb3IgY29uc3RyYWluZWQgcXVhbGl0eSBtb2RlCi0gICAgICAgIC8vICJhY3RpdmVfd29yc3RfcXVhbGl0eSIgbWF5IG5ldmVyIGRyb3AgYmVsb3cgY3EgbGV2ZWwKLSAgICAgICAgLy8gZm9yIGFueSBmcmFtZSB0eXBlLgotICAgICAgICBpZiAoIGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfQ09OU1RSQUlORURfUVVBTElUWSAmJgotICAgICAgICAgICAgIGNwaS0+YWN0aXZlX3dvcnN0X3F1YWxpdHkgPCBjcGktPmNxX3RhcmdldF9xdWFsaXR5KQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5ID0gY3BpLT5jcV90YXJnZXRfcXVhbGl0eTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRlc3QgdG8gc2VlIGlmIHdlIGhhdmUgdG8gZHJvcCBhIGZyYW1lCi0gICAgLy8gVGhlIGF1dG8tZHJvcCBmcmFtZSBjb2RlIGlzIG9ubHkgdXNlZCBpbiBidWZmZXJlZCBtb2RlLgotICAgIC8vIEluIHVuYnVmZmVyZCBtb2RlIChlZyB2aWRlIGNvbmZlcmVuY2luZykgdGhlIGRlc2Npc2lvbiB0bwotICAgIC8vIGNvZGUgb3IgZHJvcCBhIGZyYW1lIGlzIG1hZGUgb3V0c2lkZSB0aGUgY29kZWMgaW4gcmVzcG9uc2UgdG8gcmVhbAotICAgIC8vIHdvcmxkIGNvbW1zIG9yIGJ1ZmZlciBjb25zaWRlcmF0aW9ucy4KLSAgICBpZiAoY3BpLT5kcm9wX2ZyYW1lc19hbGxvd2VkICYmIGNwaS0+YnVmZmVyZWRfbW9kZSAmJgotICAgICAgICAoY3BpLT5veGNmLmVuZF91c2FnZSA9PSBVU0FHRV9TVFJFQU1fRlJPTV9TRVJWRVIpICYmCi0gICAgICAgICgoY3BpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpKSkgLy98fCAhY3BpLT5veGNmLmFsbG93X3NwYXRpYWxfcmVzYW1wbGluZykgKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGEgYnVmZmVyIHVuZGVydW4tY3Jpc2lzIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBkcm9wIGEgZnJhbWUKLSAgICAgICAgaWYgKChjcGktPmJ1ZmZlcl9sZXZlbCA8IDApKQotICAgICAgICB7Ci0jaWYgMAotICAgICAgICAgICAgRklMRSAqZiA9IGZvcGVuKCJkZWMuc3R0IiwgImEiKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIiUxMGQgJTEwZCAlMTBkICUxMGQgKioqKiogQlVGRkVSIEVNUFRZXG4iLAotICAgICAgICAgICAgICAgICAgICAoaW50KSBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICBjcGktPmRlY2ltYXRpb25fZmFjdG9yLCBjcGktPmNvbW1vbi5ob3Jpel9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgKGNwaS0+YnVmZmVyX2xldmVsICogMTAwKSAvIGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCk7Ci0gICAgICAgICAgICBmY2xvc2UoZik7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8vdnB4X2xvZygiRGVjb2RlcjogRHJvcCBmcmFtZSBkdWUgdG8gYmFuZHdpZHRoOiAlZCBcbiIsY3BpLT5idWZmZXJfbGV2ZWwsIGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aCk7Ci0KLSAgICAgICAgICAgIGNwaS0+ZHJvcF9mcmFtZSA9IFRSVUU7Ci0gICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIG90aGVyIGRyb3AgZnJhbWUgY3J0aWVyaWEgKE5vdGUgMiBwYXNzIGNiciB1c2VzIGRlY2ltYXRpb24gb24gd2hvbGUgS0Ygc2VjdGlvbnMpCi0gICAgICAgIGVsc2UgaWYgKChjcGktPmJ1ZmZlcl9sZXZlbCA8IGNwaS0+b3hjZi5kcm9wX2ZyYW1lc193YXRlcl9tYXJrICogY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsIC8gMTAwKSAmJgotICAgICAgICAgICAgICAgICAoY3BpLT5kcm9wX2NvdW50IDwgY3BpLT5tYXhfZHJvcF9jb3VudCkgJiYgKGNwaS0+cGFzcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3BpLT5kcm9wX2ZyYW1lID0gVFJVRTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBpZiAoY3BpLT5kcm9wX2ZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJ1ZmZlciBsZXZlbCB2YXJpYWJsZS4KLSAgICAgICAgICAgIGNwaS0+Yml0c19vZmZfdGFyZ2V0ICs9IGNwaS0+YXZfcGVyX2ZyYW1lX2JhbmR3aWR0aDsKLSAgICAgICAgICAgIGNwaS0+YnVmZmVyX2xldmVsID0gY3BpLT5iaXRzX29mZl90YXJnZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3BpLT5kcm9wX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgICAvLyBBZGp1c3QgdGFyZ2V0IGZyYW1lIHNpemUgZm9yIEdvbGRlbiBGcmFtZXM6Ci0gICAgaWYgKGNwaS0+b3hjZi5lcnJvcl9yZXNpbGllbnRfbW9kZSA9PSAwICYmCi0gICAgICAgIChjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgPT0gMCkgJiYgIWNwaS0+ZHJvcF9mcmFtZSkKLSAgICB7Ci0gICAgICAgIC8vaW50IEJvb3N0ID0gMDsKLSAgICAgICAgaW50IFEgPSAoY3BpLT5veGNmLmZpeGVkX3EgPCAwKSA/IGNwaS0+bGFzdF9xW0lOVEVSX0ZSQU1FXSA6IGNwaS0+b3hjZi5maXhlZF9xOwotCi0gICAgICAgIGludCBnZl9mcmFtZV91c2VhZ2UgPSAwOyAgICAgIC8vIEdvbGRlbiBmcmFtZSB1c2VhZ2Ugc2luY2UgbGFzdCBHRgotICAgICAgICBpbnQgdG90X21icyA9IGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtJTlRSQV9GUkFNRV0gICsKLSAgICAgICAgICAgICAgICAgICAgICBjcGktPnJlY2VudF9yZWZfZnJhbWVfdXNhZ2VbTEFTVF9GUkFNRV0gICArCi0gICAgICAgICAgICAgICAgICAgICAgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0dPTERFTl9GUkFNRV0gKwotICAgICAgICAgICAgICAgICAgICAgIGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtBTFRSRUZfRlJBTUVdOwotCi0gICAgICAgIGludCBwY3RfZ2ZfYWN0aXZlID0gKDEwMCAqIGNwaS0+Z2ZfYWN0aXZlX2NvdW50KSAvIChjcGktPmNvbW1vbi5tYl9yb3dzICogY3BpLT5jb21tb24ubWJfY29scyk7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3QgYm9vc3QgaW5kaWNhdG9yCi0gICAgICAgIC8vY3BpLT5sYXN0X2Jvb3N0ID0gMTAwOwotCi0gICAgICAgIGlmICh0b3RfbWJzKQotICAgICAgICAgICAgZ2ZfZnJhbWVfdXNlYWdlID0gKGNwaS0+cmVjZW50X3JlZl9mcmFtZV91c2FnZVtHT0xERU5fRlJBTUVdICsgY3BpLT5yZWNlbnRfcmVmX2ZyYW1lX3VzYWdlW0FMVFJFRl9GUkFNRV0pICogMTAwIC8gdG90X21iczsKLQotICAgICAgICBpZiAocGN0X2dmX2FjdGl2ZSA+IGdmX2ZyYW1lX3VzZWFnZSkKLSAgICAgICAgICAgIGdmX2ZyYW1lX3VzZWFnZSA9IHBjdF9nZl9hY3RpdmU7Ci0KLSAgICAgICAgLy8gSXMgYSBmaXhlZCBtYW51YWwgR0YgZnJlcXVlbmN5IGJlaW5nIHVzZWQKLSAgICAgICAgaWYgKGNwaS0+YXV0b19nb2xkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGb3Igb25lIHBhc3MgdGhyb3cgYSBHRiBpZiByZWNlbnQgZnJhbWUgaW50cmEgdXNlYWdlIGlzIGxvdyBvciB0aGUgR0YgdXNlYWdlIGlzIGhpZ2gKLSAgICAgICAgICAgIGlmICgoY3BpLT5wYXNzID09IDApICYmIChjcGktPnRoaXNfZnJhbWVfcGVyY2VudF9pbnRyYSA8IDE1IHx8IGdmX2ZyYW1lX3VzZWFnZSA+PSA1KSkKLSAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9IFRSVUU7Ci0KLSAgICAgICAgICAgIC8vIFR3byBwYXNzIEdGIGRlc2Npc2lvbgotICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5wYXNzID09IDIpCi0gICAgICAgICAgICAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgPSBUUlVFOwotICAgICAgICB9Ci0KLSNpZiAwCi0KLSAgICAgICAgLy8gRGVidWcgc3RhdHMKLSAgICAgICAgaWYgKDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZJTEUgKmY7Ci0KLSAgICAgICAgICAgIGYgPSBmb3BlbigiZ2ZfdXNlYWdldC5zdHQiLCAiYSIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiICU4bGQgJTEwbGQgJTEwbGQgJTEwbGQgJTEwbGRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+Y29tbW9uLmN1cnJlbnRfdmlkZW9fZnJhbWUsICBjcGktPmdmdV9ib29zdCwgR0ZRX0FESlVTVE1FTlQsIGNwaS0+Z2Z1X2Jvb3N0LCBnZl9mcmFtZV91c2VhZ2UpOwotICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSA9PSBUUlVFKQotICAgICAgICB7Ci0jaWYgMAotCi0gICAgICAgICAgICBpZiAoMCkgICAvLyBwX2d3Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRklMRSAqZjsKLQotICAgICAgICAgICAgICAgIGYgPSBmb3BlbigiR0ZleGl0LnN0dCIsICJhIik7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJThsZCBHRiBjb2RlZFxuIiwgY3BpLT5jb21tb24uY3VycmVudF92aWRlb19mcmFtZSk7Ci0gICAgICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYKLSAgICAgICAgICAgIGNwaS0+aW5pdGlhbF9nZl91c2UgPSAwOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5hdXRvX2FkanVzdF9nb2xkX3F1YW50aXplcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYWxjX2dmX3BhcmFtcyhjcGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgYWx0ZXJuYXRlIHJlZiBpbnN0ZWFkIG9mIGdmIHRoZW4gZG8gbm90IGFwcGx5IHRoZSBib29zdAotICAgICAgICAgICAgLy8gSXQgd2lsbCBpbnN0ZWFkIGJlIGFwcGxpZWQgdG8gdGhlIGFsdHJlZiB1cGRhdGUKLSAgICAgICAgICAgIC8vIEppbXMgbW9kaWZpZWQgYm9vc3QKLSAgICAgICAgICAgIGlmICghY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPnBhc3MgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aDsgICAgICAgICAgLy8gVGhlIHNwZW5kIG9uIHRoZSBHRiBpcyBkZWZpbmVkIGluIHRoZSB0d28gcGFzcyBjb2RlIGZvciB0d28gcGFzcyBlbmNvZGVzCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgQm9vc3QgPSBjcGktPmxhc3RfYm9vc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX2luX3NlY3Rpb24gPSBjcGktPmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG9jYXRpb25fY2h1bmtzID0gKGZyYW1lc19pbl9zZWN0aW9uICogMTAwKSArIChCb29zdCAtIDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19pbl9zZWN0aW9uID0gY3BpLT5pbnRlcl9mcmFtZV90YXJnZXQgKiBmcmFtZXNfaW5fc2VjdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIEFsdGJvb3N0IGFuZCBhbGxvY2F0aW9ucyBjaHVuY2sgZG93biB0byBwcmV2ZW50IG92ZXJmbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQm9vc3QgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3N0IC89IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9jaHVua3MgLz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWQgbG9zcyBvZiBwcmVjaXNpb24gYnV0IGF2b2lkIG92ZXJmbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdHNfaW5fc2VjdGlvbiA+PiA3KSA+IGFsbG9jYXRpb25fY2h1bmtzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSBCb29zdCAqIChiaXRzX2luX3NlY3Rpb24gLyBhbGxvY2F0aW9uX2NodW5rcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA9IChCb29zdCAqIGJpdHNfaW5fc2VjdGlvbikgLyBhbGxvY2F0aW9uX2NodW5rczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+dGhpc19mcmFtZV90YXJnZXQgPSAoYmFzZWxpbmVfYml0c19hdF9xKDEsIFEsIGNwaS0+Y29tbW9uLk1CcykgKiBjcGktPmxhc3RfYm9vc3QpIC8gMTAwOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgQVJGIGF0IHRoaXMgbG9jYXRpb24gdXNlIHRoZSBtaW5pbXVtCi0gICAgICAgICAgICAvLyBiaXRzIG9uIHRoaXMgZnJhbWUgZXZlbiBpZiBpdCBpcyBhIGNvbnRydWN0ZWQgYXJmLgotICAgICAgICAgICAgLy8gVGhlIGFjdGl2ZSBtYXhpbXVtIHF1YW50aXplciBpbnN1cmVzIHRoYXQgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIHdpbGwgYmUgc3BlbnQgaWYgbmVlZGVkIGZvciBjb250c3RydWN0ZWQgQVJGcy4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3BpLT5jdXJyZW50X2dmX2ludGVydmFsID0gY3BpLT5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlOwotCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotdm9pZCB2cDhfdXBkYXRlX3JhdGVfY29ycmVjdGlvbl9mYWN0b3JzKFZQOF9DT01QICpjcGksIGludCBkYW1wX3ZhcikKLXsKLSAgICBpbnQgICAgUSA9IGNwaS0+Y29tbW9uLmJhc2VfcWluZGV4OwotICAgIGludCAgICBjb3JyZWN0aW9uX2ZhY3RvciA9IDEwMDsKLSAgICBkb3VibGUgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKLSAgICBkb3VibGUgYWRqdXN0bWVudF9saW1pdDsKLQotICAgIGludCAgICBwcm9qZWN0ZWRfc2l6ZV9iYXNlZF9vbl9xID0gMDsKLQotICAgIC8vIENsZWFyIGRvd24gbW14IHJlZ2lzdGVycyB0byBhbGxvdyBmbG9hdGluZyBwb2ludCBpbiB3aGF0IGZvbGxvd3MKLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7ICAvL19fYXNtIGVtbXM7Ci0KLSAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgewotICAgICAgICByYXRlX2NvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSB8fCBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKLSAgICAgICAgICAgIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPmdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPnJhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgfQotCi0gICAgLy8gV29yayBvdXQgaG93IGJpZyB3ZSB3b3VsZCBoYXZlIGV4cGVjdGVkIHRoZSBmcmFtZSB0byBiZSBhdCB0aGlzIFEgZ2l2ZW4gdGhlIGN1cnJlbnQgY29ycmVjdGlvbiBmYWN0b3IuCi0gICAgLy8gU3RheSBpbiBkb3VibGUgdG8gYXZvaWQgaW50IG92ZXJmbG93IHdoZW4gdmFsdWVzIGFyZSBsYXJnZQotICAgIC8vcHJvamVjdGVkX3NpemVfYmFzZWRfb25fcSA9ICgoaW50KSguNSArIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgKiB2cDhfYml0c19wZXJfbWJbY3BpLT5jb21tb24uZnJhbWVfdHlwZV1bUV0pICogY3BpLT5jb21tb24uTUJzKSA+PiBCUEVSX01CX05PUk1CSVRTOwotICAgIHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3EgPSAoaW50KSgoKC41ICsgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciAqIHZwOF9iaXRzX3Blcl9tYltjcGktPmNvbW1vbi5mcmFtZV90eXBlXVtRXSkgKiBjcGktPmNvbW1vbi5NQnMpIC8gKDEgPDwgQlBFUl9NQl9OT1JNQklUUykpOwotCi0gICAgLy8gTWFrZSBzb21lIGFsbG93YW5jZSBmb3IgY3BpLT56YmluX292ZXJfcXVhbnQKLSAgICBpZiAoY3BpLT56YmluX292ZXJfcXVhbnQgPiAwKQotICAgIHsKLSAgICAgICAgaW50IFogPSBjcGktPnpiaW5fb3Zlcl9xdWFudDsKLSAgICAgICAgZG91YmxlIEZhY3RvciA9IDAuOTk7Ci0gICAgICAgIGRvdWJsZSBmYWN0b3JfYWRqdXN0bWVudCA9IDAuMDEgLyAyNTYuMDsgLy8oZG91YmxlKVpCSU5fT1FfTUFYOwotCi0gICAgICAgIHdoaWxlIChaID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgWiAtLTsKLSAgICAgICAgICAgIHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3EgPQotICAgICAgICAgICAgICAgIChpbnQpKEZhY3RvciAqIHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3EpOwotICAgICAgICAgICAgRmFjdG9yICs9IGZhY3Rvcl9hZGp1c3RtZW50OwotCi0gICAgICAgICAgICBpZiAoRmFjdG9yICA+PSAwLjk5OSkKLSAgICAgICAgICAgICAgICBGYWN0b3IgPSAwLjk5OTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFdvcmsgb3V0IGEgc2l6ZSBjb3JyZWN0aW9uIGZhY3Rvci4KLSAgICAvL2lmICggY3BpLT50aGlzX2ZyYW1lX3RhcmdldCA+IDAgKQotICAgIC8vICBjb3JyZWN0aW9uX2ZhY3RvciA9ICgxMDAgKiBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplKSAvIGNwaS0+dGhpc19mcmFtZV90YXJnZXQ7Ci0gICAgaWYgKHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3EgPiAwKQotICAgICAgICBjb3JyZWN0aW9uX2ZhY3RvciA9ICgxMDAgKiBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplKSAvIHByb2plY3RlZF9zaXplX2Jhc2VkX29uX3E7Ci0KLSAgICAvLyBNb3JlIGhlYXZpbHkgZGFtcGVkIGFkanVzdG1lbnQgdXNlZCBpZiB3ZSBoYXZlIGJlZW4gb3NjaWxsYXRpbmcgZWl0aGVyIHNpZGUgb2YgdGFyZ2V0Ci0gICAgc3dpdGNoIChkYW1wX3ZhcikKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICBhZGp1c3RtZW50X2xpbWl0ID0gMC43NTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgICBhZGp1c3RtZW50X2xpbWl0ID0gMC4zNzU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICBkZWZhdWx0OgotICAgICAgICBhZGp1c3RtZW50X2xpbWl0ID0gMC4yNTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy9pZiAoIChjb3JyZWN0aW9uX2ZhY3RvciA+IDEwMikgJiYgKFEgPCBjcGktPmFjdGl2ZV93b3JzdF9xdWFsaXR5KSApCi0gICAgaWYgKGNvcnJlY3Rpb25fZmFjdG9yID4gMTAyKQotICAgIHsKLSAgICAgICAgLy8gV2UgYXJlIG5vdCBhbHJlYWR5IGF0IHRoZSB3b3JzdCBhbGxvd2FibGUgcXVhbGl0eQotICAgICAgICBjb3JyZWN0aW9uX2ZhY3RvciA9IChpbnQpKDEwMC41ICsgKChjb3JyZWN0aW9uX2ZhY3RvciAtIDEwMCkgKiBhZGp1c3RtZW50X2xpbWl0KSk7Ci0gICAgICAgIHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgPSAoKHJhdGVfY29ycmVjdGlvbl9mYWN0b3IgKiBjb3JyZWN0aW9uX2ZhY3RvcikgLyAxMDApOwotCi0gICAgICAgIC8vIEtlZXAgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciB3aXRoaW4gbGltaXRzCi0gICAgICAgIGlmIChyYXRlX2NvcnJlY3Rpb25fZmFjdG9yID4gTUFYX0JQQl9GQUNUT1IpCi0gICAgICAgICAgICByYXRlX2NvcnJlY3Rpb25fZmFjdG9yID0gTUFYX0JQQl9GQUNUT1I7Ci0gICAgfQotICAgIC8vZWxzZSBpZiAoIChjb3JyZWN0aW9uX2ZhY3RvciA8IDk5KSAmJiAoUSA+IGNwaS0+YWN0aXZlX2Jlc3RfcXVhbGl0eSkgKQotICAgIGVsc2UgaWYgKGNvcnJlY3Rpb25fZmFjdG9yIDwgOTkpCi0gICAgewotICAgICAgICAvLyBXZSBhcmUgbm90IGFscmVhZHkgYXQgdGhlIGJlc3QgYWxsb3dhYmxlIHF1YWxpdHkKLSAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSAoaW50KSgxMDAuNSAtICgoMTAwIC0gY29ycmVjdGlvbl9mYWN0b3IpICogYWRqdXN0bWVudF9saW1pdCkpOwotICAgICAgICByYXRlX2NvcnJlY3Rpb25fZmFjdG9yID0gKChyYXRlX2NvcnJlY3Rpb25fZmFjdG9yICogY29ycmVjdGlvbl9mYWN0b3IpIC8gMTAwKTsKLQotICAgICAgICAvLyBLZWVwIHJhdGVfY29ycmVjdGlvbl9mYWN0b3Igd2l0aGluIGxpbWl0cwotICAgICAgICBpZiAocmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA8IE1JTl9CUEJfRkFDVE9SKQotICAgICAgICAgICAgcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IE1JTl9CUEJfRkFDVE9SOwotICAgIH0KLQotICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgY3BpLT5rZXlfZnJhbWVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IHJhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSB8fCBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKLSAgICAgICAgICAgIGNwaS0+Z2ZfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IHJhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNwaS0+cmF0ZV9jb3JyZWN0aW9uX2ZhY3RvciA9IHJhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGVzdGltYXRlX2JpdHNfYXRfcShWUDhfQ09NUCAqY3BpLCBpbnQgUSkKLXsKLSAgICBpbnQgQnBtID0gKGludCkoLjUgKyBjcGktPnJhdGVfY29ycmVjdGlvbl9mYWN0b3IgKiB2cDhfYml0c19wZXJfbWJbSU5URVJfRlJBTUVdW1FdKTsKLQotICAgIC8qIEF0dGVtcHQgdG8gcmV0YWluIHJlYXNvbmFibGUgYWNjdXJhY3kgd2l0aG91dCBvdmVyZmxvdy4gVGhlIGN1dG9mZiBpcwotICAgICAqIGNob3NlbiBzdWNoIHRoYXQgdGhlIG1heGltdW0gcHJvZHVjdCBvZiBCcG0gYW5kIE1CcyBmaXRzIDMxIGJpdHMuIFRoZQotICAgICAqIGxhcmdlc3QgQnBtIHRha2VzIDIwIGJpdHMuCi0gICAgICovCi0gICAgaWYgKGNwaS0+Y29tbW9uLk1CcyA+ICgxIDw8IDExKSkKLSAgICAgICAgcmV0dXJuIChCcG0gPj4gQlBFUl9NQl9OT1JNQklUUykgKiBjcGktPmNvbW1vbi5NQnM7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gKEJwbSAqIGNwaS0+Y29tbW9uLk1CcykgPj4gQlBFUl9NQl9OT1JNQklUUzsKLQotfQotCi0KLWludCB2cDhfcmVndWxhdGVfcShWUDhfQ09NUCAqY3BpLCBpbnQgdGFyZ2V0X2JpdHNfcGVyX2ZyYW1lKQotewotICAgIGludCBRID0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eTsKLQotICAgIC8vIFJlc2V0IFpiaW4gT1EgdmFsdWUKLSAgICBjcGktPnpiaW5fb3Zlcl9xdWFudCA9IDA7Ci0KLSAgICBpZiAoY3BpLT5veGNmLmZpeGVkX3EgPj0gMCkKLSAgICB7Ci0gICAgICAgIFEgPSBjcGktPm94Y2YuZml4ZWRfcTsKLQotICAgICAgICBpZiAoY3BpLT5jb21tb24uZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFEgPSBjcGktPm94Y2Yua2V5X3E7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBRID0gY3BpLT5veGNmLmFsdF9xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfZ29sZGVuX2ZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBRID0gY3BpLT5veGNmLmdvbGRfcTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgbGFzdF9lcnJvciA9IElOVF9NQVg7Ci0gICAgICAgIGludCB0YXJnZXRfYml0c19wZXJfbWI7Ci0gICAgICAgIGludCBiaXRzX3Blcl9tYl9hdF90aGlzX3E7Ci0gICAgICAgIGRvdWJsZSBjb3JyZWN0aW9uX2ZhY3RvcjsKLQotICAgICAgICAvLyBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNvcnJlY3Rpb24gZmFjdG9yIGJhc2VkIHVwb24gdHlwZSBvZiBmcmFtZS4KLSAgICAgICAgaWYgKGNwaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKQotICAgICAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPmtleV9mcmFtZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgfHwgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUpCi0gICAgICAgICAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPmdmX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29ycmVjdGlvbl9mYWN0b3IgPSBjcGktPnJhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxjdWxhdGUgcmVxdWlyZWQgc2NhbGluZyBmYWN0b3IgYmFzZWQgb24gdGFyZ2V0IGZyYW1lIHNpemUgYW5kIHNpemUgb2YgZnJhbWUgcHJvZHVjZWQgdXNpbmcgcHJldmlvdXMgUQotICAgICAgICBpZiAodGFyZ2V0X2JpdHNfcGVyX2ZyYW1lID49IChJTlRfTUFYID4+IEJQRVJfTUJfTk9STUJJVFMpKQotICAgICAgICAgICAgdGFyZ2V0X2JpdHNfcGVyX21iID0gKHRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIGNwaS0+Y29tbW9uLk1CcykgPDwgQlBFUl9NQl9OT1JNQklUUzsgICAgICAgLy8gQ2FzZSB3aGVyZSB3ZSB3b3VsZCBvdmVyZmxvdyBpbnQKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGFyZ2V0X2JpdHNfcGVyX21iID0gKHRhcmdldF9iaXRzX3Blcl9mcmFtZSA8PCBCUEVSX01CX05PUk1CSVRTKSAvIGNwaS0+Y29tbW9uLk1CczsKLQotICAgICAgICBpID0gY3BpLT5hY3RpdmVfYmVzdF9xdWFsaXR5OwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJpdHNfcGVyX21iX2F0X3RoaXNfcSA9IChpbnQpKC41ICsgY29ycmVjdGlvbl9mYWN0b3IgKiB2cDhfYml0c19wZXJfbWJbY3BpLT5jb21tb24uZnJhbWVfdHlwZV1baV0pOwotCi0gICAgICAgICAgICBpZiAoYml0c19wZXJfbWJfYXRfdGhpc19xIDw9IHRhcmdldF9iaXRzX3Blcl9tYikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKHRhcmdldF9iaXRzX3Blcl9tYiAtIGJpdHNfcGVyX21iX2F0X3RoaXNfcSkgPD0gbGFzdF9lcnJvcikKLSAgICAgICAgICAgICAgICAgICAgUSA9IGk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBRID0gaSAtIDE7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsYXN0X2Vycm9yID0gYml0c19wZXJfbWJfYXRfdGhpc19xIC0gdGFyZ2V0X2JpdHNfcGVyX21iOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgrK2kgPD0gY3BpLT5hY3RpdmVfd29yc3RfcXVhbGl0eSk7Ci0KLQotICAgICAgICAvLyBJZiB3ZSBhcmUgYXQgTUFYUSB0aGVuIGVuYWJsZSBRIG92ZXItcnVuIHdoaWNoIHNlZWtzIHRvIGNsYXcgYmFjayBhZGRpdGlvbmFsIGJpdHMgdGhyb3VnaCB0aGluZ3MgbGlrZQotICAgICAgICAvLyB0aGUgUkQgbXVsdGlwbGllciBhbmQgemVybyBiaW4gc2l6ZS4KLSAgICAgICAgaWYgKFEgPj0gTUFYUSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHpiaW5fb3FtYXg7Ci0KLSAgICAgICAgICAgIGRvdWJsZSBGYWN0b3IgPSAwLjk5OwotICAgICAgICAgICAgZG91YmxlIGZhY3Rvcl9hZGp1c3RtZW50ID0gMC4wMSAvIDI1Ni4wOyAvLyhkb3VibGUpWkJJTl9PUV9NQVg7Ci0KLSAgICAgICAgICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgICAgICAgICB6YmluX29xbWF4ID0gMDsgLy9aQklOX09RX01BWC8xNgotICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lIHx8IChjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSAmJiAhY3BpLT5zb3VyY2VfYWx0X3JlZl9hY3RpdmUpKQotICAgICAgICAgICAgICAgIHpiaW5fb3FtYXggPSAxNjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB6YmluX29xbWF4ID0gWkJJTl9PUV9NQVg7Ci0KLSAgICAgICAgICAgIC8qewotICAgICAgICAgICAgICAgIGRvdWJsZSBGYWN0b3IgPSAoZG91YmxlKXRhcmdldF9iaXRzX3Blcl9tYi8oZG91YmxlKWJpdHNfcGVyX21iX2F0X3RoaXNfcTsKLSAgICAgICAgICAgICAgICBkb3VibGUgT3E7Ci0KLSAgICAgICAgICAgICAgICBGYWN0b3IgPSBGYWN0b3IvMS4yNjgzOwotCi0gICAgICAgICAgICAgICAgT3EgPSBwb3coIEZhY3RvciwgKDEuMC8tMC4xNjUpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIE9xID4gemJpbl9vcW1heCApCi0gICAgICAgICAgICAgICAgICAgIE9xID0gemJpbl9vcW1heDsKLQotICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gKGludClPcTsKLSAgICAgICAgICAgIH0qLwotCi0gICAgICAgICAgICAvLyBFYWNoIGluY3JtZW50IGluIHRoZSB6YmluIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIGZpeGVkIGVmZmVjdCBvbiBiaXRyYXRlLiBUaGlzIGlzIG5vdCBvZiBjb3Vyc2UgdHJ1ZS4KLSAgICAgICAgICAgIC8vIFRoZSBlZmZlY3Qgd2lsbCBiZSBoaWdobHkgY2xpcCBkZXBlbmRlbnQgYW5kIG1heSB3ZWxsIGhhdmUgc3VkZGVuIHN0ZXBzLgotICAgICAgICAgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0byBhY2hlaXZlIGhpZ2hlciBlZmZlY3RpdmUgcXVhbnRpemVycyB0aGFuIHRoZSBub3JtYWwgbWF4aW11bSBieSBleHBhbmRpbmcgdGhlIHplcm8KLSAgICAgICAgICAgIC8vIGJpbiBhbmQgaGVuY2UgZGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIGxvdyBtYWduaXR1ZGUgbm9uIHplcm8gY29lZmZpY2llbnRzLgotICAgICAgICAgICAgd2hpbGUgKGNwaS0+emJpbl9vdmVyX3F1YW50IDwgemJpbl9vcW1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPnpiaW5fb3Zlcl9xdWFudCArKzsKLQotICAgICAgICAgICAgICAgIGlmIChjcGktPnpiaW5fb3Zlcl9xdWFudCA+IHpiaW5fb3FtYXgpCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9vdmVyX3F1YW50ID0gemJpbl9vcW1heDsKLQotICAgICAgICAgICAgICAgIC8vIEFkanVzdCBiaXRzX3Blcl9tYl9hdF90aGlzX3EgZXN0aW1hdGUKLSAgICAgICAgICAgICAgICBiaXRzX3Blcl9tYl9hdF90aGlzX3EgPSAoaW50KShGYWN0b3IgKiBiaXRzX3Blcl9tYl9hdF90aGlzX3EpOwotICAgICAgICAgICAgICAgIEZhY3RvciArPSBmYWN0b3JfYWRqdXN0bWVudDsKLQotICAgICAgICAgICAgICAgIGlmIChGYWN0b3IgID49IDAuOTk5KQotICAgICAgICAgICAgICAgICAgICBGYWN0b3IgPSAwLjk5OTsKLQotICAgICAgICAgICAgICAgIGlmIChiaXRzX3Blcl9tYl9hdF90aGlzX3EgPD0gdGFyZ2V0X2JpdHNfcGVyX21iKSAgICAvLyBCcmVhayBvdXQgaWYgd2UgZ2V0IGRvd24gdG8gdGhlIHRhcmdldCByYXRlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gUTsKLX0KLQotc3RhdGljIGludCBlc3RpbWF0ZV9taW5fZnJhbWVfc2l6ZShWUDhfQ09NUCAqY3BpKQotewotICAgIGRvdWJsZSBjb3JyZWN0aW9uX2ZhY3RvcjsKLSAgICBpbnQgYml0c19wZXJfbWJfYXRfbWF4X3E7Ci0KLSAgICAvLyBUaGlzIGZ1bnRpb24gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmaXJzdCBmZXcgZnJhbWVzIHVudGlsbCB0aGUgY29ycmVjdGlvbiBmYWN0b3IgaGFzIGhhZCB0aW1lIHRvIGFkYXB0LgotICAgIGlmIChjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lIDwgMTApCi0gICAgewotICAgICAgICBpZiAoY3BpLT5wYXNzID09IDIpCi0gICAgICAgICAgICByZXR1cm4gKGNwaS0+bWluX2ZyYW1lX2JhbmR3aWR0aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBjcGktPnBlcl9mcmFtZV9iYW5kd2lkdGggLyAzOwotICAgIH0KLQotICAgIC8qICAvLyBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNvcnJlY3Rpb24gZmFjdG9yIGJhc2VkIHVwb24gdHlwZSBvZiBmcmFtZS4KLSAgICAgICAgaWYgKCBjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSApCi0gICAgICAgICAgICBjb3JyZWN0aW9uX2ZhY3RvciA9IGNwaS0+a2V5X2ZyYW1lX3JhdGVfY29ycmVjdGlvbl9mYWN0b3I7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjcGktPmNvbW1vbi5yZWZyZXNoX2FsdF9yZWZfZnJhbWUgfHwgY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgKQotICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5nZl9yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yOwotICAgICAgICB9Ki8KLQotICAgIC8vIFdlIGVzdGltYXRlIGF0IGhhbGYgdGhlIHZhbHVlIHdlIGdldCBmcm9tIHZwOF9iaXRzX3Blcl9tYgotICAgIGNvcnJlY3Rpb25fZmFjdG9yID0gY3BpLT5yYXRlX2NvcnJlY3Rpb25fZmFjdG9yIC8gMi4wOwotCi0gICAgYml0c19wZXJfbWJfYXRfbWF4X3EgPSAoaW50KSguNSArIGNvcnJlY3Rpb25fZmFjdG9yICogdnA4X2JpdHNfcGVyX21iW2NwaS0+Y29tbW9uLmZyYW1lX3R5cGVdW01BWFFdKTsKLQotICAgIHJldHVybiAoYml0c19wZXJfbWJfYXRfbWF4X3EgKiBjcGktPmNvbW1vbi5NQnMpID4+IEJQRVJfTUJfTk9STUJJVFM7Ci19Ci0KLXZvaWQgdnA4X2FkanVzdF9rZXlfZnJhbWVfY29udGV4dChWUDhfQ09NUCAqY3BpKQotewotICAgIGludCBpOwotICAgIGludCBhdl9rZXlfZnJhbWVzX3Blcl9zZWNvbmQ7Ci0KLSAgICAvLyBBdmVyYWdlIGtleSBmcmFtZSBmcmVxdWVuY3kgYW5kIHNpemUKLSAgICB1bnNpZ25lZCBpbnQgdG90YWxfd2VpZ2h0ID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeSA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGF2X2tleV9mcmFtZV9iaXRzID0gMDsKLQotICAgIHVuc2lnbmVkIGludCBvdXRwdXRfZnJhbWVfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpKDEwMCAqIGNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUpOwotICAgIHVuc2lnbmVkIGludCB0YXJnZXRfYmFuZHdpZHRoID0gKHVuc2lnbmVkIGludCkoMTAwICogY3BpLT50YXJnZXRfYmFuZHdpZHRoKTsKLQotICAgIC8vIENsZWFyIGRvd24gbW14IHJlZ2lzdGVycyB0byBhbGxvdyBmbG9hdGluZyBwb2ludCBpbiB3aGF0IGZvbGxvd3MKLSAgICB2cDhfY2xlYXJfc3lzdGVtX3N0YXRlKCk7ICAvL19fYXNtIGVtbXM7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGNvdW50IG9mIHRvdGFsIGtleSBmcmFtZSBiaXRzCi0gICAgY3BpLT50b3Rfa2V5X2ZyYW1lX2JpdHMgKz0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKLQotICAgIC8vIEZpcnN0IGtleSBmcmFtZSBhdCBzdGFydCBvZiBzZXF1ZW5jZSBpcyBhIHNwZWNpYWwgY2FzZS4gV2UgaGF2ZSBubyBmcmVxdWVuY3kgZGF0YS4KLSAgICBpZiAoY3BpLT5rZXlfZnJhbWVfY291bnQgPT0gMSkKLSAgICB7Ci0gICAgICAgIGF2X2tleV9mcmFtZV9mcmVxdWVuY3kgPSAoaW50KWNwaS0+b3V0cHV0X2ZyYW1lX3JhdGUgKiAyOyAgICAgICAgICAgIC8vIEFzc3VtZSBhIGRlZmF1bHQgb2YgMSBrZiBldmVyeSAyIHNlY29uZHMKLSAgICAgICAgYXZfa2V5X2ZyYW1lX2JpdHMgPSBjcGktPnByb2plY3RlZF9mcmFtZV9zaXplOwotICAgICAgICBhdl9rZXlfZnJhbWVzX3Blcl9zZWNvbmQgID0gb3V0cHV0X2ZyYW1lX3JhdGUgLyBhdl9rZXlfZnJhbWVfZnJlcXVlbmN5OyAgLy8gTm90ZSBvdXRwdXRfZnJhbWVfcmF0ZSBub3QgY3BpLT5vdXRwdXRfZnJhbWVfcmF0ZQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgbGFzdF9rZl9pbnRlcnZhbCA9Ci0gICAgICAgICAgICAgICAgKGNwaS0+ZnJhbWVzX3NpbmNlX2tleSA+IDApID8gY3BpLT5mcmFtZXNfc2luY2Vfa2V5IDogMTsKLQotICAgICAgICAvLyByZXNldCBrZXlmcmFtZSBjb250ZXh0IGFuZCBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBsYXN0IEtFWV9GUkFNRV9DT05URVhUIGtleWZyYW1lcwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgS0VZX0ZSQU1FX0NPTlRFWFQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPCBLRVlfRlJBTUVfQ09OVEVYVCAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5wcmlvcl9rZXlfZnJhbWVfc2l6ZVtpXSAgICAgPSBjcGktPnByaW9yX2tleV9mcmFtZV9zaXplW2krMV07Ci0gICAgICAgICAgICAgICAgY3BpLT5wcmlvcl9rZXlfZnJhbWVfZGlzdGFuY2VbaV0gPSBjcGktPnByaW9yX2tleV9mcmFtZV9kaXN0YW5jZVtpKzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+cHJpb3Jfa2V5X2ZyYW1lX3NpemVbaV0gICAgID0gY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZTsKLSAgICAgICAgICAgICAgICBjcGktPnByaW9yX2tleV9mcmFtZV9kaXN0YW5jZVtpXSA9IGxhc3Rfa2ZfaW50ZXJ2YWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF2X2tleV9mcmFtZV9iaXRzICAgICAgKz0gcHJpb3Jfa2V5X2ZyYW1lX3dlaWdodFtpXSAqIGNwaS0+cHJpb3Jfa2V5X2ZyYW1lX3NpemVbaV07Ci0gICAgICAgICAgICBhdl9rZXlfZnJhbWVfZnJlcXVlbmN5ICs9IHByaW9yX2tleV9mcmFtZV93ZWlnaHRbaV0gKiBjcGktPnByaW9yX2tleV9mcmFtZV9kaXN0YW5jZVtpXTsKLSAgICAgICAgICAgIHRvdGFsX3dlaWdodCAgICAgICAgICs9IHByaW9yX2tleV9mcmFtZV93ZWlnaHRbaV07Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9rZXlfZnJhbWVfYml0cyAgICAgICAvPSB0b3RhbF93ZWlnaHQ7Ci0gICAgICAgIGF2X2tleV9mcmFtZV9mcmVxdWVuY3kgIC89IHRvdGFsX3dlaWdodDsKLSAgICAgICAgYXZfa2V5X2ZyYW1lc19wZXJfc2Vjb25kICA9IG91dHB1dF9mcmFtZV9yYXRlIC8gYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeTsKLQotICAgIH0KLQotICAgIC8vIERvIHdlIGhhdmUgYW55IGtleSBmcmFtZSBvdmVyc3BlbmQgdG8gcmVjb3Zlcj8KLSAgICBpZiAoKGNwaS0+cGFzcyAhPSAyKSAmJiAoY3BpLT5wcm9qZWN0ZWRfZnJhbWVfc2l6ZSA+IGNwaS0+cGVyX2ZyYW1lX2JhbmR3aWR0aCkpCi0gICAgewotICAgICAgICAvLyBVcGRhdGUgdGhlIGNvdW50IG9mIGtleSBmcmFtZSBvdmVyc3BlbmQgdG8gYmUgcmVjb3ZlcmVkIGluIHN1YnNlcXVlbnQgZnJhbWVzCi0gICAgICAgIC8vIEEgcG9ydGlvbiBvZiB0aGUgS0Ygb3ZlcnNwZW5kIGlzIHRyZWF0ZWQgYXMgZ2Ygb3ZlcnNwZW5kIChhbmQgaGVuY2UgcmVjb3ZlcmVkIG1vcmUgcXVpY2tseSkKLSAgICAgICAgLy8gYXMgdGhlIGtmIGlzIGFsc28gYSBnZi4gT3RoZXJ3aXNlIHRoZSBmZXcgZnJhbWVzIGZvbGxvd2luZyBlYWNoIGtmIHRlbmQgdG8gZ2V0IG1vcmUgYml0cwotICAgICAgICAvLyBhbGxvY2F0ZWQgdGhhbiB0aG9zZSBmb2xsb3dpbmcgb3RoZXIgZ2ZzLgotICAgICAgICBjcGktPmtmX292ZXJzcGVuZF9iaXRzICs9IChjcGktPnByb2plY3RlZF9mcmFtZV9zaXplIC0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoKSAqIDcgLyA4OwotICAgICAgICBjcGktPmdmX292ZXJzcGVuZF9iaXRzICs9IChjcGktPnByb2plY3RlZF9mcmFtZV9zaXplIC0gY3BpLT5wZXJfZnJhbWVfYmFuZHdpZHRoKSAqIDEgLyA4OwotICAgICAgICBpZighYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeSkKLSAgICAgICAgICAgIGF2X2tleV9mcmFtZV9mcmVxdWVuY3kgPSA2MDsKLQotICAgICAgICAvLyBXb3JrIG91dCBob3cgbXVjaCB0byB0cnkgYW5kIHJlY292ZXIgcGVyIGZyYW1lLgotICAgICAgICAvLyBGb3Igb25lIHBhc3Mgd2UgZXN0aW1hdGUgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc3ByZWFkIGl0IG92ZXIgYmFzZWQgdXBvbiBwYXN0IGhpc3RvcnkuCi0gICAgICAgIC8vIEZvciB0d28gcGFzcyB3ZSBrbm93IGhvdyBtYW55IGZyYW1lcyB0aGVyZSB3aWxsIGJlIHRpbGwgdGhlIG5leHQga2YuCi0gICAgICAgIGlmIChjcGktPnBhc3MgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNwaS0+ZnJhbWVzX3RvX2tleSA+IDE2KQotICAgICAgICAgICAgICAgIGNwaS0+a2ZfYml0cmF0ZV9hZGp1c3RtZW50ID0gY3BpLT5rZl9vdmVyc3BlbmRfYml0cyAvIChpbnQpY3BpLT5mcmFtZXNfdG9fa2V5OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNwaS0+a2ZfYml0cmF0ZV9hZGp1c3RtZW50ID0gY3BpLT5rZl9vdmVyc3BlbmRfYml0cyAvIDE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNwaS0+a2ZfYml0cmF0ZV9hZGp1c3RtZW50ID0gY3BpLT5rZl9vdmVyc3BlbmRfYml0cyAvIChpbnQpYXZfa2V5X2ZyYW1lX2ZyZXF1ZW5jeTsKLSAgICB9Ci0KLSAgICBjcGktPmZyYW1lc19zaW5jZV9rZXkgPSAwOwotICAgIGNwaS0+bGFzdF9rZXlfZnJhbWVfc2l6ZSA9IGNwaS0+cHJvamVjdGVkX2ZyYW1lX3NpemU7Ci0gICAgY3BpLT5rZXlfZnJhbWVfY291bnQrKzsKLX0KLQotdm9pZCB2cDhfY29tcHV0ZV9mcmFtZV9zaXplX2JvdW5kcyhWUDhfQ09NUCAqY3BpLCBpbnQgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0LCBpbnQgKmZyYW1lX292ZXJfc2hvb3RfbGltaXQpCi17Ci0gICAgLy8gU2V0LXVwIGJvdW5kcyBvbiBhY2NlcHRhYmxlIGZyYW1lIHNpemU6Ci0gICAgaWYgKGNwaS0+b3hjZi5maXhlZF9xID49IDApCi0gICAgewotICAgICAgICAvLyBGaXhlZCBRIHNjZW5hcmlvOiBmcmFtZSBzaXplIG5ldmVyIG91dHJhbmdlcyB0YXJnZXQgKHRoZXJlIGlzIG5vIHRhcmdldCEpCi0gICAgICAgICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCA9IDA7Ci0gICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IElOVF9NQVg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgKmZyYW1lX292ZXJfc2hvb3RfbGltaXQgID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDkgLyA4OwotICAgICAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0ID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDcgLyA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNwaS0+Y29tbW9uLnJlZnJlc2hfYWx0X3JlZl9mcmFtZSB8fCBjcGktPmNvbW1vbi5yZWZyZXNoX2dvbGRlbl9mcmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCAgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogOSAvIDg7Ci0gICAgICAgICAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0ID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDcgLyA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZvciBDQlIgdGFrZSBidWZmZXIgZnVsbG5lc3MgaW50byBhY2NvdW50Ci0gICAgICAgICAgICAgICAgaWYgKGNwaS0+b3hjZi5lbmRfdXNhZ2UgPT0gVVNBR0VfU1RSRUFNX0ZST01fU0VSVkVSKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+YnVmZmVyX2xldmVsID49ICgoY3BpLT5veGNmLm9wdGltYWxfYnVmZmVyX2xldmVsICsgY3BpLT5veGNmLm1heGltdW1fYnVmZmVyX3NpemUpID4+IDEpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgaXMgdG9vIGZ1bGwgc28gcmVsYXggb3ZlcnNob290IGFuZCB0aWdodGVuIHVuZGVyc2hvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiAxMiAvIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogNiAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3BpLT5idWZmZXJfbGV2ZWwgPD0gKGNwaS0+b3hjZi5vcHRpbWFsX2J1ZmZlcl9sZXZlbCA+PiAxKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGlzIHRvbyBsb3cgc28gcmVsYXggdW5kZXJzaG9vdCBhbmQgdGlnaHRlbiBvdmVyc2hvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiAxMCAvIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogNCAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCAgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogMTEgLyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0ID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDUgLyA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFZCUiBhbmQgQ1EgbW9kZQotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aWdodGVyIHJlc3RyaWN0aW9ucyBoZXJlIGNhbiBoZWxwIHF1YWxpdHkgYnV0IGh1cnQgZW5jb2RlIHNwZWVkCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3Ryb24gb3ZlcnNob290IGxpbWl0IGZvciBjb25zdHJhaW5lZCBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPm94Y2YuZW5kX3VzYWdlID09IFVTQUdFX0NPTlNUUkFJTkVEX1FVQUxJVFkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZV9vdmVyX3Nob290X2xpbWl0ICA9IGNwaS0+dGhpc19mcmFtZV90YXJnZXQgKiAxMSAvIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfdW5kZXJfc2hvb3RfbGltaXQgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogMiAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVfb3Zlcl9zaG9vdF9saW1pdCAgPSBjcGktPnRoaXNfZnJhbWVfdGFyZ2V0ICogMTEgLyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lX3VuZGVyX3Nob290X2xpbWl0ID0gY3BpLT50aGlzX2ZyYW1lX3RhcmdldCAqIDUgLyA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvcmF0ZWN0cmwuaCBiL3ZwOC9lbmNvZGVyL3JhdGVjdHJsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NmRmZGYuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvcmF0ZWN0cmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWYgIWRlZmluZWQgX19JTkNfUkFURUNUUkxfSAotCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLQotZXh0ZXJuIHZvaWQgdnA4X3NhdmVfY29kaW5nX2NvbnRleHQoVlA4X0NPTVAgKmNwaSk7Ci1leHRlcm4gdm9pZCB2cDhfcmVzdG9yZV9jb2RpbmdfY29udGV4dChWUDhfQ09NUCAqY3BpKTsKLQotZXh0ZXJuIHZvaWQgdnA4X3NldHVwX2tleV9mcmFtZShWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOF9jYWxjX2lmcmFtZV90YXJnZXRfc2l6ZShWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOF9jYWxjX3BmcmFtZV90YXJnZXRfc2l6ZShWUDhfQ09NUCAqY3BpKTsKLWV4dGVybiB2b2lkIHZwOF91cGRhdGVfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcnMoVlA4X0NPTVAgKmNwaSwgaW50IGRhbXBfdmFyKTsKLWV4dGVybiBpbnQgdnA4X3JlZ3VsYXRlX3EoVlA4X0NPTVAgKmNwaSwgaW50IHRhcmdldF9iaXRzX3Blcl9mcmFtZSk7Ci1leHRlcm4gdm9pZCB2cDhfYWRqdXN0X2tleV9mcmFtZV9jb250ZXh0KFZQOF9DT01QICpjcGkpOwotZXh0ZXJuIHZvaWQgdnA4X2NvbXB1dGVfZnJhbWVfc2l6ZV9ib3VuZHMoVlA4X0NPTVAgKmNwaSwgaW50ICpmcmFtZV91bmRlcl9zaG9vdF9saW1pdCwgaW50ICpmcmFtZV9vdmVyX3Nob290X2xpbWl0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9yZG9wdC5jIGIvdnA4L2VuY29kZXIvcmRvcHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyNWNjNC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9yZG9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgInZwOC9jb21tb24vcHJhZ21hcy5oIgotCi0jaW5jbHVkZSAidG9rZW5pemUuaCIKLSNpbmNsdWRlICJ0cmVld3JpdGVyLmgiCi0jaW5jbHVkZSAib255eF9pbnQuaCIKLSNpbmNsdWRlICJtb2RlY29zdHMuaCIKLSNpbmNsdWRlICJlbmNvZGVpbnRyYS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vZW50cm9weW1vZGUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50ZXIuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmEuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3JlY29uaW50cmE0eDQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2ZpbmRuZWFybXYuaCIKLSNpbmNsdWRlICJlbmNvZGVtYi5oIgotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9pZGN0LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9nX2NvbW1vbi5oIgotI2luY2x1ZGUgInZhcmlhbmNlLmgiCi0jaW5jbHVkZSAibWNvbXAuaCIKLQotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgImRjdC5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vc3lzdGVtZGVwZW5kZW50LmgiCi0KLSNpZiBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jZGVmaW5lIElGX1JUQ0QoeCkgICh4KQotI2Vsc2UKLSNkZWZpbmUgSUZfUlRDRCh4KSAgTlVMTAotI2VuZGlmCi0KLQotZXh0ZXJuIHZvaWQgdnA4Y3hfbWJfaW5pdF9xdWFudGl6ZXIoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCk7Ci1leHRlcm4gdm9pZCB2cDhfdXBkYXRlX3piaW5fZXh0cmEoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCk7Ci0KLQotI2RlZmluZSBSRENPU1QoUk0sRE0sUixEKSAoICgoMTI4KyhSKSooUk0pKSA+PiA4KSArIChETSkqKEQpICkKLQotI2RlZmluZSBNQVhGKGEsYikgICAgICAgICAgICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0KLQotCi1zdGF0aWMgY29uc3QgaW50IGF1dG9fc3BlZWRfdGhyZXNoWzE3XSA9Ci17Ci0gICAgMTAwMCwKLSAgICAyMDAsCi0gICAgMTUwLAotICAgIDEzMCwKLSAgICAxNTAsCi0gICAgMTI1LAotICAgIDEyMCwKLSAgICAxMTUsCi0gICAgMTE1LAotICAgIDExNSwKLSAgICAxMTUsCi0gICAgMTE1LAotICAgIDExNSwKLSAgICAxMTUsCi0gICAgMTE1LAotICAgIDExNSwKLSAgICAxMDUKLX07Ci0KLWNvbnN0IE1CX1BSRURJQ1RJT05fTU9ERSB2cDhfbW9kZV9vcmRlcltNQVhfTU9ERVNdID0KLXsKLSAgICBaRVJPTVYsCi0gICAgRENfUFJFRCwKLQotICAgIE5FQVJFU1RNViwKLSAgICBORUFSTVYsCi0KLSAgICBaRVJPTVYsCi0gICAgTkVBUkVTVE1WLAotCi0gICAgWkVST01WLAotICAgIE5FQVJFU1RNViwKLQotICAgIE5FQVJNViwKLSAgICBORUFSTVYsCi0KLSAgICBWX1BSRUQsCi0gICAgSF9QUkVELAotICAgIFRNX1BSRUQsCi0KLSAgICBORVdNViwKLSAgICBORVdNViwKLSAgICBORVdNViwKLQotICAgIFNQTElUTVYsCi0gICAgU1BMSVRNViwKLSAgICBTUExJVE1WLAotCi0gICAgQl9QUkVELAotfTsKLQotY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHZwOF9yZWZfZnJhbWVfb3JkZXJbTUFYX01PREVTXSA9Ci17Ci0gICAgTEFTVF9GUkFNRSwKLSAgICBJTlRSQV9GUkFNRSwKLQotICAgIExBU1RfRlJBTUUsCi0gICAgTEFTVF9GUkFNRSwKLQotICAgIEdPTERFTl9GUkFNRSwKLSAgICBHT0xERU5fRlJBTUUsCi0KLSAgICBBTFRSRUZfRlJBTUUsCi0gICAgQUxUUkVGX0ZSQU1FLAotCi0gICAgR09MREVOX0ZSQU1FLAotICAgIEFMVFJFRl9GUkFNRSwKLQotICAgIElOVFJBX0ZSQU1FLAotICAgIElOVFJBX0ZSQU1FLAotICAgIElOVFJBX0ZSQU1FLAotCi0gICAgTEFTVF9GUkFNRSwKLSAgICBHT0xERU5fRlJBTUUsCi0gICAgQUxUUkVGX0ZSQU1FLAotCi0gICAgTEFTVF9GUkFNRSwKLSAgICBHT0xERU5fRlJBTUUsCi0gICAgQUxUUkVGX0ZSQU1FLAotCi0gICAgSU5UUkFfRlJBTUUsCi19OwotCi1zdGF0aWMgdm9pZCBmaWxsX3Rva2VuX2Nvc3RzKAotICAgIHVuc2lnbmVkIGludCBjICAgICAgW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vuc10sCi0gICAgY29uc3QgdnA4X3Byb2IgcCAgICBbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbdnA4X2NvZWZfdG9rZW5zLTFdCi0pCi17Ci0gICAgaW50IGksIGosIGs7Ci0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19UWVBFUzsgaSsrKQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgQ09FRl9CQU5EUzsgaisrKQotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IFBSRVZfQ09FRl9DT05URVhUUzsgaysrKQotCi0gICAgICAgICAgICAgICAgdnA4X2Nvc3RfdG9rZW5zKChpbnQgKikoYyBbaV1bal1ba10pLCBwIFtpXVtqXVtrXSwgdnA4X2NvZWZfdHJlZSk7Ci0KLX0KLQotc3RhdGljIGludCByZF9paWZhY3RvciBbIDMyIF0gPSAgeyAgICA0LCAgIDQsICAgMywgICAyLCAgIDEsICAgMCwgICAwLCAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0KLS8qIHZhbHVlcyBhcmUgbm93IGNvcnJlbGF0ZWQgdG8gcXVhbnRpemVyICovCi1zdGF0aWMgaW50IHNhZF9wZXJfYml0MTZsdXRbUUlOREVYX1JBTkdFXSA9Ci17Ci0gICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsCi0gICAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsCi0gICAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCi0gICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksCi0gICAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsCi0gICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywKLSAgICAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsCi0gICAgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywKLSAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsCi0gICAgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAotICAgIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMiwKLSAgICAyMiwgMjIsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsCi0gICAgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI4LAotICAgIDI4LCAyOCwgMjksIDI5LCAzMCwgMzAsIDMxLCAzMQotfTsKLXN0YXRpYyBpbnQgc2FkX3Blcl9iaXQ0bHV0W1FJTkRFWF9SQU5HRV0gPQotewotICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDcsICA3LAotICAgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAotICAgIDgsICA4LCAgOCwgIDgsICAxMCwgMTAsIDEwLCAxMCwKLSAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsCi0gICAgMTEsIDExLCAxMSwgMTEsIDEzLCAxMywgMTMsIDEzLAotICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsCi0gICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxOSwgMTksIDE5LAotICAgIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKLSAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsCi0gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyNSwgMjUsIDI1LAotICAgIDI1LCAyNSwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKLSAgICAyOCwgMjgsIDI4LCAyOSwgMjksIDI5LCAyOSwgMzEsCi0gICAgMzEsIDMxLCAzMiwgMzIsIDMyLCAzNCwgMzQsIDM0LAotICAgIDM1LCAzNSwgMzcsIDM3LCAzOCwgMzgsIDM4LCA0MCwKLSAgICA0MCwgNDAsIDQxLCA0MSwgNDMsIDQzLCA0NCwgNDQsCi19OwotCi12b2lkIHZwOGN4X2luaXRpYWxpemVfbWVfY29uc3RzKFZQOF9DT01QICpjcGksIGludCBRSW5kZXgpCi17Ci0gICAgY3BpLT5tYi5zYWRwZXJiaXQxNiA9ICBzYWRfcGVyX2JpdDE2bHV0W1FJbmRleF07Ci0gICAgY3BpLT5tYi5zYWRwZXJiaXQ0ICA9ICBzYWRfcGVyX2JpdDRsdXRbUUluZGV4XTsKLX0KLQotdm9pZCB2cDhfaW5pdGlhbGl6ZV9yZF9jb25zdHMoVlA4X0NPTVAgKmNwaSwgaW50IFF2YWx1ZSkKLXsKLSAgICBpbnQgcTsKLSAgICBpbnQgaTsKLSAgICBkb3VibGUgY2FwcGVkX3EgPSAoUXZhbHVlIDwgMTYwKSA/IChkb3VibGUpUXZhbHVlIDogMTYwLjA7Ci0gICAgZG91YmxlIHJkY29uc3QgPSAzLjAwOwotCi0gICAgdnA4X2NsZWFyX3N5c3RlbV9zdGF0ZSgpOyAgLy9fX2FzbSBlbW1zOwotCi0gICAgLy8gRnVydGhlciB0ZXN0cyByZXF1aXJlZCB0byBzZWUgaWYgb3B0aW11bSBpcyBkaWZmZXJlbnQKLSAgICAvLyBmb3Iga2V5IGZyYW1lcywgZ29sZGVuIGZyYW1lcyBhbmQgYXJmIGZyYW1lcy4KLSAgICAvLyBpZiAoY3BpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgfHwKLSAgICAvLyAgICAgY3BpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lKQotICAgIGNwaS0+UkRNVUxUID0gKGludCkocmRjb25zdCAqIChjYXBwZWRfcSAqIGNhcHBlZF9xKSk7Ci0KLSAgICAvLyBFeHRlbmQgcmF0ZSBtdWx0aXBsaWVyIGFsb25nIHNpZGUgcXVhbnRpemVyIHpiaW4gaW5jcmVhc2VzCi0gICAgaWYgKGNwaS0+emJpbl9vdmVyX3F1YW50ICA+IDApCi0gICAgewotICAgICAgICBkb3VibGUgb3FfZmFjdG9yOwotICAgICAgICBkb3VibGUgbW9kcTsKLQotICAgICAgICAvLyBFeHBlcmltZW50YWwgY29kZSB1c2luZyB0aGUgc2FtZSBiYXNpYyBlcXVhdGlvbiBhcyB1c2VkIGZvciBRIGFib3ZlCi0gICAgICAgIC8vIFRoZSB1bml0cyBvZiBjcGktPnpiaW5fb3Zlcl9xdWFudCBhcmUgMS8xMjggb2YgUSBiaW4gc2l6ZQotICAgICAgICBvcV9mYWN0b3IgPSAxLjAgKyAoKGRvdWJsZSkwLjAwMTU2MjUgKiBjcGktPnpiaW5fb3Zlcl9xdWFudCk7Ci0gICAgICAgIG1vZHEgPSAoaW50KSgoZG91YmxlKWNhcHBlZF9xICogb3FfZmFjdG9yKTsKLSAgICAgICAgY3BpLT5SRE1VTFQgPSAoaW50KShyZGNvbnN0ICogKG1vZHEgKiBtb2RxKSk7Ci0gICAgfQotCi0gICAgaWYgKGNwaS0+cGFzcyA9PSAyICYmIChjcGktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkpCi0gICAgewotICAgICAgICBpZiAoY3BpLT5uZXh0X2lpcmF0aW8gPiAzMSkKLSAgICAgICAgICAgIGNwaS0+UkRNVUxUICs9IChjcGktPlJETVVMVCAqIHJkX2lpZmFjdG9yWzMxXSkgPj4gNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3BpLT5SRE1VTFQgKz0gKGNwaS0+UkRNVUxUICogcmRfaWlmYWN0b3JbY3BpLT5uZXh0X2lpcmF0aW9dKSA+PiA0OwotICAgIH0KLQotICAgIGNwaS0+bWIuZXJyb3JwZXJiaXQgPSAoY3BpLT5SRE1VTFQgLyAxMDApOwotICAgIGNwaS0+bWIuZXJyb3JwZXJiaXQgKz0gKGNwaS0+bWIuZXJyb3JwZXJiaXQ9PTApOwotCi0gICAgdnA4X3NldF9zcGVlZF9mZWF0dXJlcyhjcGkpOwotCi0gICAgaWYgKGNwaS0+Y29tbW9uLnNpbXBsZXJfbHBmKQotICAgICAgICBjcGktPmNvbW1vbi5maWx0ZXJfdHlwZSA9IFNJTVBMRV9MT09QRklMVEVSOwotCi0gICAgcSA9IChpbnQpcG93KFF2YWx1ZSwgMS4yNSk7Ci0KLSAgICBpZiAocSA8IDgpCi0gICAgICAgIHEgPSA4OwotCi0gICAgaWYgKGNwaS0+UkRNVUxUID4gMTAwMCkKLSAgICB7Ci0gICAgICAgIGNwaS0+UkRESVYgPSAxOwotICAgICAgICBjcGktPlJETVVMVCAvPSAxMDA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NT0RFUzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3BpLT5zZi50aHJlc2hfbXVsdFtpXSA8IElOVF9NQVgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hlc1tpXSA9IGNwaS0+c2YudGhyZXNoX211bHRbaV0gKiBxIC8gMTAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbaV0gPSBJTlRfTUFYOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFtpXSA9IGNwaS0+cmRfdGhyZXNoZXNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3BpLT5SRERJViA9IDEwMDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01PREVTOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjcGktPnNmLnRocmVzaF9tdWx0W2ldIDwgKElOVF9NQVggLyBxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW2ldID0gY3BpLT5zZi50aHJlc2hfbXVsdFtpXSAqIHE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hlc1tpXSA9IElOVF9NQVg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW2ldID0gY3BpLT5yZF90aHJlc2hlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZpbGxfdG9rZW5fY29zdHMoCi0gICAgICAgIGNwaS0+bWIudG9rZW5fY29zdHMsCi0gICAgICAgIChjb25zdCB2cDhfcHJvYiggKilbOF1bM11bMTFdKSBjcGktPmNvbW1vbi5mYy5jb2VmX3Byb2JzCi0gICAgKTsKLQotICAgIHZwOF9pbml0X21vZGVfY29zdHMoY3BpKTsKLQotfQotCi12b2lkIHZwOF9hdXRvX3NlbGVjdF9zcGVlZChWUDhfQ09NUCAqY3BpKQotewotICAgIGludCB1c2VkID0gY3BpLT5veGNmLmNwdV91c2VkOwotCi0gICAgaW50IG1pbGxpc2Vjb25kc19mb3JfY29tcHJlc3MgPSAoaW50KSgxMDAwMDAwIC8gY3BpLT5veGNmLmZyYW1lX3JhdGUpOwotCi0gICAgbWlsbGlzZWNvbmRzX2Zvcl9jb21wcmVzcyA9IG1pbGxpc2Vjb25kc19mb3JfY29tcHJlc3MgKiAoMTYgLSBjcGktPm94Y2YuY3B1X3VzZWQpIC8gMTY7Ci0KLSNpZiAwCi0KLSAgICBpZiAoMCkKLSAgICB7Ci0gICAgICAgIEZJTEUgKmY7Ci0KLSAgICAgICAgZiA9IGZvcGVuKCJzcGVlZC5zdHQiLCAiYSIpOwotICAgICAgICBmcHJpbnRmKGYsICIgJThsZCAlMTBsZCAlMTBsZCAlMTBsZFxuIiwKLSAgICAgICAgICAgICAgICBjcGktPmNvbW1vbi5jdXJyZW50X3ZpZGVvX2ZyYW1lLCBjcGktPlNwZWVkLCBtaWxsaXNlY29uZHNfZm9yX2NvbXByZXNzLCBjcGktPmF2Z19waWNrX21vZGVfdGltZSk7Ci0gICAgICAgIGZjbG9zZShmKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyoKLSAgICAvLyB0aGlzIGlzIGRvbmUgZHVyaW5nIHBhcmFtZXRlciB2YWxpZCBjaGVjawotICAgIGlmKCB1c2VkID4gMTYpCi0gICAgICAgIHVzZWQgPSAxNjsKLSAgICBpZiggdXNlZCA8IC0xNikKLSAgICAgICAgdXNlZCA9IC0xNjsKLSAgICAqLwotCi0gICAgaWYgKGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lIDwgbWlsbGlzZWNvbmRzX2Zvcl9jb21wcmVzcyAmJiAoY3BpLT5hdmdfZW5jb2RlX3RpbWUgLSBjcGktPmF2Z19waWNrX21vZGVfdGltZSkgPCBtaWxsaXNlY29uZHNfZm9yX2NvbXByZXNzKQotICAgIHsKLSAgICAgICAgaWYgKGNwaS0+YXZnX3BpY2tfbW9kZV90aW1lID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+U3BlZWQgPSA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kc19mb3JfY29tcHJlc3MgKiAxMDAgPCBjcGktPmF2Z19lbmNvZGVfdGltZSAqIDk1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNwaS0+U3BlZWQgICAgICAgICAgKz0gMjsKLSAgICAgICAgICAgICAgICBjcGktPmF2Z19waWNrX21vZGVfdGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgY3BpLT5hdmdfZW5jb2RlX3RpbWUgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKGNwaS0+U3BlZWQgPiAxNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+U3BlZWQgPSAxNjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtaWxsaXNlY29uZHNfZm9yX2NvbXByZXNzICogMTAwID4gY3BpLT5hdmdfZW5jb2RlX3RpbWUgKiBhdXRvX3NwZWVkX3RocmVzaFtjcGktPlNwZWVkXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcGktPlNwZWVkICAgICAgICAgIC09IDE7Ci0gICAgICAgICAgICAgICAgY3BpLT5hdmdfcGlja19tb2RlX3RpbWUgPSAwOwotICAgICAgICAgICAgICAgIGNwaS0+YXZnX2VuY29kZV90aW1lID0gMDsKLQotICAgICAgICAgICAgICAgIC8vIEluIHJlYWwtdGltZSBtb2RlLCBjcGktPnNwZWVkIGlzIGluIFs0LCAxNl0uCi0gICAgICAgICAgICAgICAgaWYgKGNwaS0+U3BlZWQgPCA0KSAgICAgICAgLy9pZiAoIGNwaS0+U3BlZWQgPCAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNwaS0+U3BlZWQgPSA0OyAgICAgICAgLy9jcGktPlNwZWVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3BpLT5TcGVlZCArPSA0OwotCi0gICAgICAgIGlmIChjcGktPlNwZWVkID4gMTYpCi0gICAgICAgICAgICBjcGktPlNwZWVkID0gMTY7Ci0KLQotICAgICAgICBjcGktPmF2Z19waWNrX21vZGVfdGltZSA9IDA7Ci0gICAgICAgIGNwaS0+YXZnX2VuY29kZV90aW1lID0gMDsKLSAgICB9Ci19Ci0KLWludCB2cDhfYmxvY2tfZXJyb3JfYyhzaG9ydCAqY29lZmYsIHNob3J0ICpkcWNvZWZmKQotewotICAgIGludCBpOwotICAgIGludCBlcnJvciA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCB0aGlzX2RpZmYgPSBjb2VmZltpXSAtIGRxY29lZmZbaV07Ci0gICAgICAgIGVycm9yICs9IHRoaXNfZGlmZiAqIHRoaXNfZGlmZjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLWludCB2cDhfbWJibG9ja19lcnJvcl9jKE1BQ1JPQkxPQ0sgKm1iLCBpbnQgZGMpCi17Ci0gICAgQkxPQ0sgICpiZTsKLSAgICBCTE9DS0QgKmJkOwotICAgIGludCBpLCBqOwotICAgIGludCBiZXJyb3IsIGVycm9yID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgYmUgPSAmbWItPmJsb2NrW2ldOwotICAgICAgICBiZCA9ICZtYi0+ZV9tYmQuYmxvY2tbaV07Ci0KLSAgICAgICAgYmVycm9yID0gMDsKLQotICAgICAgICBmb3IgKGogPSBkYzsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB0aGlzX2RpZmYgPSBiZS0+Y29lZmZbal0gLSBiZC0+ZHFjb2VmZltqXTsKLSAgICAgICAgICAgIGJlcnJvciArPSB0aGlzX2RpZmYgKiB0aGlzX2RpZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJvciArPSBiZXJyb3I7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotfQotCi1pbnQgdnA4X21idXZlcnJvcl9jKE1BQ1JPQkxPQ0sgKm1iKQotewotCi0gICAgQkxPQ0sgICpiZTsKLSAgICBCTE9DS0QgKmJkOwotCi0KLSAgICBpbnQgaTsKLSAgICBpbnQgZXJyb3IgPSAwOwotCi0gICAgZm9yIChpID0gMTY7IGkgPCAyNDsgaSsrKQotICAgIHsKLSAgICAgICAgYmUgPSAmbWItPmJsb2NrW2ldOwotICAgICAgICBiZCA9ICZtYi0+ZV9tYmQuYmxvY2tbaV07Ci0KLSAgICAgICAgZXJyb3IgKz0gdnA4X2Jsb2NrX2Vycm9yX2MoYmUtPmNvZWZmLCBiZC0+ZHFjb2VmZik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotfQotCi1pbnQgVlA4X1VWU1NFKE1BQ1JPQkxPQ0sgKngsIGNvbnN0IHZwOF92YXJpYW5jZV9ydGNkX3Z0YWJsZV90ICpydGNkKQotewotICAgIHVuc2lnbmVkIGNoYXIgKnVwdHIsICp2cHRyOwotICAgIHVuc2lnbmVkIGNoYXIgKnVwcmVkX3B0ciA9ICgqKHgtPmJsb2NrWzE2XS5iYXNlX3NyYykgKyB4LT5ibG9ja1sxNl0uc3JjKTsKLSAgICB1bnNpZ25lZCBjaGFyICp2cHJlZF9wdHIgPSAoKih4LT5ibG9ja1syMF0uYmFzZV9zcmMpICsgeC0+YmxvY2tbMjBdLnNyYyk7Ci0gICAgaW50IHV2X3N0cmlkZSA9IHgtPmJsb2NrWzE2XS5zcmNfc3RyaWRlOwotCi0gICAgdW5zaWduZWQgaW50IHNzZTEgPSAwOwotICAgIHVuc2lnbmVkIGludCBzc2UyID0gMDsKLSAgICBpbnQgbXZfcm93OwotICAgIGludCBtdl9jb2w7Ci0gICAgaW50IG9mZnNldDsKLSAgICBpbnQgcHJlX3N0cmlkZSA9IHgtPmVfbWJkLmJsb2NrWzE2XS5wcmVfc3RyaWRlOwotCi0gICAgdnA4X2J1aWxkX3V2bXZzKCZ4LT5lX21iZCwgMCk7Ci0gICAgbXZfcm93ID0geC0+ZV9tYmQuYmxvY2tbMTZdLmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgbXZfY29sID0geC0+ZV9tYmQuYmxvY2tbMTZdLmJtaS5tdi5hc19tdi5jb2w7Ci0KLSAgICBvZmZzZXQgPSAobXZfcm93ID4+IDMpICogcHJlX3N0cmlkZSArIChtdl9jb2wgPj4gMyk7Ci0gICAgdXB0ciA9IHgtPmVfbWJkLnByZS51X2J1ZmZlciArIG9mZnNldDsKLSAgICB2cHRyID0geC0+ZV9tYmQucHJlLnZfYnVmZmVyICsgb2Zmc2V0OwotCi0gICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKLSAgICB7Ci0gICAgICAgIFZBUklBTkNFX0lOVk9LRShydGNkLCBzdWJwaXh2YXI4eDgpKHVwdHIsIHByZV9zdHJpZGUsIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsIHVwcmVkX3B0ciwgdXZfc3RyaWRlLCAmc3NlMik7Ci0gICAgICAgIFZBUklBTkNFX0lOVk9LRShydGNkLCBzdWJwaXh2YXI4eDgpKHZwdHIsIHByZV9zdHJpZGUsIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsIHZwcmVkX3B0ciwgdXZfc3RyaWRlLCAmc3NlMSk7Ci0gICAgICAgIHNzZTIgKz0gc3NlMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVkFSSUFOQ0VfSU5WT0tFKHJ0Y2QsIHN1YnBpeHZhcjh4OCkodXB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywgdXByZWRfcHRyLCB1dl9zdHJpZGUsICZzc2UyKTsKLSAgICAgICAgVkFSSUFOQ0VfSU5WT0tFKHJ0Y2QsIHN1YnBpeHZhcjh4OCkodnB0ciwgcHJlX3N0cmlkZSwgbXZfY29sICYgNywgbXZfcm93ICYgNywgdnByZWRfcHRyLCB1dl9zdHJpZGUsICZzc2UxKTsKLSAgICAgICAgc3NlMiArPSBzc2UxOwotICAgIH0KLQotICAgIHJldHVybiBzc2UyOwotCi19Ci0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotc3RhdGljIGludCBjb3N0X2NvZWZmcyhNQUNST0JMT0NLICptYiwgQkxPQ0tEICpiLCBpbnQgdHlwZSwgRU5UUk9QWV9DT05URVhUICphLCBFTlRST1BZX0NPTlRFWFQgKmwpCi17Ci0gICAgaW50IGMgPSAhdHlwZTsgICAgICAgICAgICAgIC8qIHN0YXJ0IGF0IGNvZWYgMCwgdW5sZXNzIFkgd2l0aCBZMiAqLwotICAgIGludCBlb2IgPSBiLT5lb2I7Ci0gICAgaW50IHB0IDsgICAgLyogc3Vycm91bmRpbmcgYmxvY2svcHJldiBjb2VmIHByZWRpY3RvciAqLwotICAgIGludCBjb3N0ID0gMDsKLSAgICBzaG9ydCAqcWNvZWZmX3B0ciA9IGItPnFjb2VmZjsKLQotICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOwotCi0jIGRlZmluZSBRQyggSSkgICggcWNvZWZmX3B0ciBbdnA4X2RlZmF1bHRfemlnX3phZzFkW0ldXSApCi0KLSAgICBmb3IgKDsgYyA8IGVvYjsgYysrKQotICAgIHsKLSAgICAgICAgaW50IHYgPSBRQyhjKTsKLSAgICAgICAgaW50IHQgPSB2cDhfZGN0X3ZhbHVlX3Rva2Vuc19wdHJbdl0uVG9rZW47Ci0gICAgICAgIGNvc3QgKz0gbWItPnRva2VuX2Nvc3RzIFt0eXBlXSBbdnA4X2NvZWZfYmFuZHNbY11dIFtwdF0gW3RdOwotICAgICAgICBjb3N0ICs9IHZwOF9kY3RfdmFsdWVfY29zdF9wdHJbdl07Ci0gICAgICAgIHB0ID0gdnA4X3ByZXZfdG9rZW5fY2xhc3NbdF07Ci0gICAgfQotCi0jIHVuZGVmIFFDCi0KLSAgICBpZiAoYyA8IDE2KQotICAgICAgICBjb3N0ICs9IG1iLT50b2tlbl9jb3N0cyBbdHlwZV0gW3ZwOF9jb2VmX2JhbmRzW2NdXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKLQotICAgIHB0ID0gKGMgIT0gIXR5cGUpOyAvLyBpcyBlb2IgZmlyc3QgY29lZmZpY2llbnQ7Ci0gICAgKmEgPSAqbCA9IHB0OwotCi0gICAgcmV0dXJuIGNvc3Q7Ci19Ci0KLXN0YXRpYyBpbnQgdnA4X3JkY29zdF9tYnkoTUFDUk9CTE9DSyAqbWIpCi17Ci0gICAgaW50IGNvc3QgPSAwOwotICAgIGludCBiOwotICAgIE1BQ1JPQkxPQ0tEICp4ID0gJm1iLT5lX21iZDsKLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmUsIHRfbGVmdDsKLSAgICBFTlRST1BZX0NPTlRFWFQgKnRhOwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGw7Ci0KLSAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlLCBtYi0+ZV9tYmQuYWJvdmVfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLSAgICB2cHhfbWVtY3B5KCZ0X2xlZnQsIG1iLT5lX21iZC5sZWZ0X2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0KLSAgICB0YSA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZTsKLSAgICB0bCA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9sZWZ0OwotCi0gICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCi0gICAgICAgIGNvc3QgKz0gY29zdF9jb2VmZnMobWIsIHgtPmJsb2NrICsgYiwgUExBTkVfVFlQRV9ZX05PX0RDLAotICAgICAgICAgICAgICAgICAgICB0YSArIHZwOF9ibG9jazJhYm92ZVtiXSwgdGwgKyB2cDhfYmxvY2sybGVmdFtiXSk7Ci0KLSAgICBjb3N0ICs9IGNvc3RfY29lZmZzKG1iLCB4LT5ibG9jayArIDI0LCBQTEFORV9UWVBFX1kyLAotICAgICAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlWzI0XSwgdGwgKyB2cDhfYmxvY2sybGVmdFsyNF0pOwotCi0gICAgcmV0dXJuIGNvc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hY3JvX2Jsb2NrX3lyZCggTUFDUk9CTE9DSyAqbWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpEaXN0b3J0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cDhfZW5jb2RlbWJfcnRjZF92dGFibGVfdCAqcnRjZCkKLXsKLSAgICBpbnQgYjsKLSAgICBNQUNST0JMT0NLRCAqY29uc3QgeCA9ICZtYi0+ZV9tYmQ7Ci0gICAgQkxPQ0sgICAqY29uc3QgbWJfeTIgPSBtYi0+YmxvY2sgKyAyNDsKLSAgICBCTE9DS0QgKmNvbnN0IHhfeTIgID0geC0+YmxvY2sgKyAyNDsKLSAgICBzaG9ydCAqWTJEQ1B0ciA9IG1iX3kyLT5zcmNfZGlmZjsKLSAgICBCTE9DSyAqYmVwdHI7Ci0gICAgaW50IGQ7Ci0KLSAgICBFTkNPREVNQl9JTlZPS0UocnRjZCwgc3VibWJ5KSggbWItPnNyY19kaWZmLCBtYi0+c3JjLnlfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+ZV9tYmQucHJlZGljdG9yLCBtYi0+c3JjLnlfc3RyaWRlICk7Ci0KLSAgICAvLyBGZGN0IGFuZCBidWlsZGluZyB0aGUgMm5kIG9yZGVyIGJsb2NrCi0gICAgZm9yIChiZXB0ciA9IG1iLT5ibG9jazsgYmVwdHIgPCBtYi0+YmxvY2sgKyAxNjsgYmVwdHIgKz0gMikKLSAgICB7Ci0gICAgICAgIG1iLT52cDhfc2hvcnRfZmRjdDh4NChiZXB0ci0+c3JjX2RpZmYsIGJlcHRyLT5jb2VmZiwgMzIpOwotICAgICAgICAqWTJEQ1B0cisrID0gYmVwdHItPmNvZWZmWzBdOwotICAgICAgICAqWTJEQ1B0cisrID0gYmVwdHItPmNvZWZmWzE2XTsKLSAgICB9Ci0KLSAgICAvLyAybmQgb3JkZXIgZmRjdAotICAgIG1iLT5zaG9ydF93YWxzaDR4NChtYl95Mi0+c3JjX2RpZmYsIG1iX3kyLT5jb2VmZiwgOCk7Ci0KLSAgICAvLyBRdWFudGl6YXRpb24KLSAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKLSAgICB7Ci0gICAgICAgIG1iLT5xdWFudGl6ZV9iKCZtYi0+YmxvY2tbYl0sICZtYi0+ZV9tYmQuYmxvY2tbYl0pOwotICAgIH0KLQotICAgIC8vIERDIHByZWRpY2F0aW9uIGFuZCBRdWFudGl6YXRpb24gb2YgMm5kIE9yZGVyIGJsb2NrCi0gICAgbWItPnF1YW50aXplX2IobWJfeTIsIHhfeTIpOwotCi0gICAgLy8gRGlzdG9ydGlvbgotICAgIGQgPSBFTkNPREVNQl9JTlZPS0UocnRjZCwgbWJlcnIpKG1iLCAxKSA8PCAyOwotICAgIGQgKz0gRU5DT0RFTUJfSU5WT0tFKHJ0Y2QsIGJlcnIpKG1iX3kyLT5jb2VmZiwgeF95Mi0+ZHFjb2VmZik7Ci0KLSAgICAqRGlzdG9ydGlvbiA9IChkID4+IDQpOwotCi0gICAgLy8gcmF0ZQotICAgICpSYXRlID0gdnA4X3JkY29zdF9tYnkobWIpOwotfQotCi1zdGF0aWMgdm9pZCBjb3B5X3ByZWRpY3Rvcih1bnNpZ25lZCBjaGFyICpkc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByZWRpY3RvcikKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgKnAgPSAoY29uc3QgdW5zaWduZWQgaW50ICopcHJlZGljdG9yOwotICAgIHVuc2lnbmVkIGludCAqZCA9ICh1bnNpZ25lZCBpbnQgKilkc3Q7Ci0gICAgZFswXSA9IHBbMF07Ci0gICAgZFs0XSA9IHBbNF07Ci0gICAgZFs4XSA9IHBbOF07Ci0gICAgZFsxMl0gPSBwWzEyXTsKLX0KLXN0YXRpYyBpbnQgcmRfcGlja19pbnRyYTR4NGJsb2NrKAotICAgIFZQOF9DT01QICpjcGksCi0gICAgTUFDUk9CTE9DSyAqeCwKLSAgICBCTE9DSyAqYmUsCi0gICAgQkxPQ0tEICpiLAotICAgIEJfUFJFRElDVElPTl9NT0RFICpiZXN0X21vZGUsCi0gICAgdW5zaWduZWQgaW50ICpibW9kZV9jb3N0cywKLSAgICBFTlRST1BZX0NPTlRFWFQgKmEsCi0gICAgRU5UUk9QWV9DT05URVhUICpsLAotCi0gICAgaW50ICpiZXN0cmF0ZSwKLSAgICBpbnQgKmJlc3RyYXRleSwKLSAgICBpbnQgKmJlc3RkaXN0b3J0aW9uKQotewotICAgIEJfUFJFRElDVElPTl9NT0RFIG1vZGU7Ci0gICAgaW50IGJlc3RfcmQgPSBJTlRfTUFYOwotICAgIGludCByYXRlID0gMDsKLSAgICBpbnQgZGlzdG9ydGlvbjsKLQotICAgIEVOVFJPUFlfQ09OVEVYVCB0YSA9ICphLCB0ZW1wYSA9ICphOwotICAgIEVOVFJPUFlfQ09OVEVYVCB0bCA9ICpsLCB0ZW1wbCA9ICpsOwotICAgIC8qCi0gICAgICogVGhlIHByZWRpY3RvciBidWZmZXIgaXMgYSAyZCBidWZmZXIgd2l0aCBhIHN0cmlkZSBvZiAxNi4gIENyZWF0ZQotICAgICAqIGEgdGVtcCBidWZmZXIgdGhhdCBtZWV0cyB0aGUgc3RyaWRlIHJlcXVpcmVtZW50cywgYnV0IHdlIGFyZSBvbmx5Ci0gICAgICogaW50ZXJlc3RlZCBpbiB0aGUgbGVmdCA0eDQgYmxvY2sKLSAgICAgKiAqLwotICAgIERFQ0xBUkVfQUxJR05FRF9BUlJBWSgxNiwgdW5zaWduZWQgY2hhciwgIGJlc3RfcHJlZGljdG9yLCAxNio0KTsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHNob3J0LCBiZXN0X2RxY29lZmYsIDE2KTsKLQotICAgIGZvciAobW9kZSA9IEJfRENfUFJFRDsgbW9kZSA8PSBCX0hVX1BSRUQ7IG1vZGUrKykKLSAgICB7Ci0gICAgICAgIGludCB0aGlzX3JkOwotICAgICAgICBpbnQgcmF0ZXk7Ci0KLSAgICAgICAgcmF0ZSA9IGJtb2RlX2Nvc3RzW21vZGVdOwotCi0gICAgICAgIHZwOF9wcmVkaWN0X2ludHJhNHg0KGIsIG1vZGUsIGItPnByZWRpY3Rvcik7Ci0gICAgICAgIEVOQ09ERU1CX0lOVk9LRShJRl9SVENEKCZjcGktPnJ0Y2QuZW5jb2RlbWIpLCBzdWJiKShiZSwgYiwgMTYpOwotICAgICAgICB4LT52cDhfc2hvcnRfZmRjdDR4NChiZS0+c3JjX2RpZmYsIGJlLT5jb2VmZiwgMzIpOwotICAgICAgICB4LT5xdWFudGl6ZV9iKGJlLCBiKTsKLQotICAgICAgICB0ZW1wYSA9IHRhOwotICAgICAgICB0ZW1wbCA9IHRsOwotCi0gICAgICAgIHJhdGV5ID0gY29zdF9jb2VmZnMoeCwgYiwgUExBTkVfVFlQRV9ZX1dJVEhfREMsICZ0ZW1wYSwgJnRlbXBsKTsKLSAgICAgICAgcmF0ZSArPSByYXRleTsKLSAgICAgICAgZGlzdG9ydGlvbiA9IEVOQ09ERU1CX0lOVk9LRShJRl9SVENEKCZjcGktPnJ0Y2QuZW5jb2RlbWIpLCBiZXJyKShiZS0+Y29lZmYsIGItPmRxY29lZmYpID4+IDI7Ci0KLSAgICAgICAgdGhpc19yZCA9IFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCByYXRlLCBkaXN0b3J0aW9uKTsKLQotICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfcmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpiZXN0cmF0ZSA9IHJhdGU7Ci0gICAgICAgICAgICAqYmVzdHJhdGV5ID0gcmF0ZXk7Ci0gICAgICAgICAgICAqYmVzdGRpc3RvcnRpb24gPSBkaXN0b3J0aW9uOwotICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7Ci0gICAgICAgICAgICAqYmVzdF9tb2RlID0gbW9kZTsKLSAgICAgICAgICAgICphID0gdGVtcGE7Ci0gICAgICAgICAgICAqbCA9IHRlbXBsOwotICAgICAgICAgICAgY29weV9wcmVkaWN0b3IoYmVzdF9wcmVkaWN0b3IsIGItPnByZWRpY3Rvcik7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KGJlc3RfZHFjb2VmZiwgYi0+ZHFjb2VmZiwgMzIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYi0+Ym1pLm1vZGUgPSAoQl9QUkVESUNUSU9OX01PREUpKCpiZXN0X21vZGUpOwotCi0gICAgSURDVF9JTlZPS0UoSUZfUlRDRCgmY3BpLT5ydGNkLmNvbW1vbi0+aWRjdCksIGlkY3QxNikoYmVzdF9kcWNvZWZmLCBiLT5kaWZmLCAzMik7Ci0gICAgUkVDT05fSU5WT0tFKElGX1JUQ0QoJmNwaS0+cnRjZC5jb21tb24tPnJlY29uKSwgcmVjb24pKGJlc3RfcHJlZGljdG9yLCBiLT5kaWZmLCAqKGItPmJhc2VfZHN0KSArIGItPmRzdCwgYi0+ZHN0X3N0cmlkZSk7Ci0KLSAgICByZXR1cm4gYmVzdF9yZDsKLX0KLQotaW50IHZwOF9yZF9waWNrX2ludHJhNHg0bWJ5X21vZGVzKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKm1iLCBpbnQgKlJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyYXRlX3ksIGludCAqRGlzdG9ydGlvbiwgaW50IGJlc3RfcmQpCi17Ci0gICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJm1iLT5lX21iZDsKLSAgICBpbnQgaTsKLSAgICBpbnQgY29zdCA9IG1iLT5tYm1vZGVfY29zdCBbeGQtPmZyYW1lX3R5cGVdIFtCX1BSRURdOwotICAgIGludCBkaXN0b3J0aW9uID0gMDsKLSAgICBpbnQgdG90X3JhdGVfeSA9IDA7Ci0gICAgbG9uZyBsb25nIHRvdGFsX3JkID0gMDsKLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmUsIHRfbGVmdDsKLSAgICBFTlRST1BZX0NPTlRFWFQgKnRhOwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGw7Ci0gICAgdW5zaWduZWQgaW50ICpibW9kZV9jb3N0czsKLQotICAgIHZweF9tZW1jcHkoJnRfYWJvdmUsIG1iLT5lX21iZC5hYm92ZV9jb250ZXh0LCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOwotICAgIHZweF9tZW1jcHkoJnRfbGVmdCwgbWItPmVfbWJkLmxlZnRfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLQotICAgIHRhID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2Fib3ZlOwotICAgIHRsID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnQ7Ci0KLSAgICB2cDhfaW50cmFfcHJlZGljdGlvbl9kb3duX2NvcHkoeGQpOwotCi0gICAgYm1vZGVfY29zdHMgPSBtYi0+aW50ZXJfYm1vZGVfY29zdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIE1PREVfSU5GTyAqY29uc3QgbWljID0geGQtPm1vZGVfaW5mb19jb250ZXh0OwotICAgICAgICBjb25zdCBpbnQgbWlzID0geGQtPm1vZGVfaW5mb19zdHJpZGU7Ci0gICAgICAgIEJfUFJFRElDVElPTl9NT0RFIFVOSU5JVElBTElaRURfSVNfU0FGRShiZXN0X21vZGUpOwotICAgICAgICBpbnQgVU5JTklUSUFMSVpFRF9JU19TQUZFKHIpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUocnkpLCBVTklOSVRJQUxJWkVEX0lTX1NBRkUoZCk7Ci0KLSAgICAgICAgaWYgKG1iLT5lX21iZC5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgQl9QUkVESUNUSU9OX01PREUgQSA9IHZwOF9hYm92ZV9ibWkobWljLCBpLCBtaXMpLT5tb2RlOwotICAgICAgICAgICAgY29uc3QgQl9QUkVESUNUSU9OX01PREUgTCA9IHZwOF9sZWZ0X2JtaShtaWMsIGkpLT5tb2RlOwotCi0gICAgICAgICAgICBibW9kZV9jb3N0cyAgPSBtYi0+Ym1vZGVfY29zdHNbQV1bTF07Ci0gICAgICAgIH0KLQotICAgICAgICB0b3RhbF9yZCArPSByZF9waWNrX2ludHJhNHg0YmxvY2soCi0gICAgICAgICAgICBjcGksIG1iLCBtYi0+YmxvY2sgKyBpLCB4ZC0+YmxvY2sgKyBpLCAmYmVzdF9tb2RlLCBibW9kZV9jb3N0cywKLSAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2ldLAotICAgICAgICAgICAgdGwgKyB2cDhfYmxvY2sybGVmdFtpXSwgJnIsICZyeSwgJmQpOwotCi0gICAgICAgIGNvc3QgKz0gcjsKLSAgICAgICAgZGlzdG9ydGlvbiArPSBkOwotICAgICAgICB0b3RfcmF0ZV95ICs9IHJ5OwotICAgICAgICBtaWMtPmJtaVtpXS5tb2RlID0geGQtPmJsb2NrW2ldLmJtaS5tb2RlID0gYmVzdF9tb2RlOwotCi0gICAgICAgIGlmKHRvdGFsX3JkID49IChsb25nIGxvbmcpYmVzdF9yZCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKHRvdGFsX3JkID49IChsb25nIGxvbmcpYmVzdF9yZCkKLSAgICAgICAgcmV0dXJuIElOVF9NQVg7Ci0KLSAgICAqUmF0ZSA9IGNvc3Q7Ci0gICAgKnJhdGVfeSArPSB0b3RfcmF0ZV95OwotICAgICpEaXN0b3J0aW9uID0gZGlzdG9ydGlvbjsKLQotICAgIHJldHVybiBSRENPU1QobWItPnJkbXVsdCwgbWItPnJkZGl2LCBjb3N0LCBkaXN0b3J0aW9uKTsKLX0KLWludCB2cDhfcmRfcGlja19pbnRyYTE2eDE2bWJ5X21vZGUoVlA4X0NPTVAgKmNwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDUk9CTE9DSyAqeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJhdGVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpEaXN0b3J0aW9uKQotewotICAgIE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlOwotICAgIE1CX1BSRURJQ1RJT05fTU9ERSBVTklOSVRJQUxJWkVEX0lTX1NBRkUobW9kZV9zZWxlY3RlZCk7Ci0gICAgaW50IHJhdGUsIHJhdGV5OwotICAgIGludCBkaXN0b3J0aW9uOwotICAgIGludCBiZXN0X3JkID0gSU5UX01BWDsKLSAgICBpbnQgdGhpc19yZDsKLQotICAgIC8vWSBTZWFyY2ggZm9yIDE2eDE2IGludHJhIHByZWRpY3Rpb24gbW9kZQotICAgIGZvciAobW9kZSA9IERDX1BSRUQ7IG1vZGUgPD0gVE1fUFJFRDsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IG1vZGU7Ci0KLSAgICAgICAgUkVDT05fSU5WT0tFKCZjcGktPmNvbW1vbi5ydGNkLnJlY29uLCBidWlsZF9pbnRyYV9wcmVkaWN0b3JzX21ieSkKLSAgICAgICAgICAgICgmeC0+ZV9tYmQpOwotCi0gICAgICAgIG1hY3JvX2Jsb2NrX3lyZCh4LCAmcmF0ZXksICZkaXN0b3J0aW9uLCBJRl9SVENEKCZjcGktPnJ0Y2QuZW5jb2RlbWIpKTsKLSAgICAgICAgcmF0ZSA9IHJhdGV5ICsgeC0+bWJtb2RlX2Nvc3RbeC0+ZV9tYmQuZnJhbWVfdHlwZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZV07Ci0KLSAgICAgICAgdGhpc19yZCA9IFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCByYXRlLCBkaXN0b3J0aW9uKTsKLQotICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfcmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVfc2VsZWN0ZWQgPSBtb2RlOwotICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7Ci0gICAgICAgICAgICAqUmF0ZSA9IHJhdGU7Ci0gICAgICAgICAgICAqcmF0ZV95ID0gcmF0ZXk7Ci0gICAgICAgICAgICAqRGlzdG9ydGlvbiA9IGRpc3RvcnRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gbW9kZV9zZWxlY3RlZDsKLSAgICByZXR1cm4gYmVzdF9yZDsKLX0KLQotc3RhdGljIGludCByZF9jb3N0X21idXYoTUFDUk9CTE9DSyAqbWIpCi17Ci0gICAgaW50IGI7Ci0gICAgaW50IGNvc3QgPSAwOwotICAgIE1BQ1JPQkxPQ0tEICp4ID0gJm1iLT5lX21iZDsKLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmUsIHRfbGVmdDsKLSAgICBFTlRST1BZX0NPTlRFWFQgKnRhOwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGw7Ci0KLSAgICB2cHhfbWVtY3B5KCZ0X2Fib3ZlLCBtYi0+ZV9tYmQuYWJvdmVfY29udGV4dCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLSAgICB2cHhfbWVtY3B5KCZ0X2xlZnQsIG1iLT5lX21iZC5sZWZ0X2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0KLSAgICB0YSA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZTsKLSAgICB0bCA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9sZWZ0OwotCi0gICAgZm9yIChiID0gMTY7IGIgPCAyNDsgYisrKQotICAgICAgICBjb3N0ICs9IGNvc3RfY29lZmZzKG1iLCB4LT5ibG9jayArIGIsIFBMQU5FX1RZUEVfVVYsCi0gICAgICAgICAgICAgICAgICAgIHRhICsgdnA4X2Jsb2NrMmFib3ZlW2JdLCB0bCArIHZwOF9ibG9jazJsZWZ0W2JdKTsKLQotICAgIHJldHVybiBjb3N0OwotfQotCi0KLXN0YXRpYyBpbnQgdnA4X3JkX2ludGVyX3V2KFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCAqcmF0ZSwgaW50ICpkaXN0b3J0aW9uLCBpbnQgZnVsbHBpeGVsKQotewotICAgIHZwOF9idWlsZF91dm12cygmeC0+ZV9tYmQsIGZ1bGxwaXhlbCk7Ci0gICAgdnA4X2VuY29kZV9pbnRlcjE2eDE2dXZyZChJRl9SVENEKCZjcGktPnJ0Y2QpLCB4KTsKLQotCi0gICAgKnJhdGUgICAgICAgPSByZF9jb3N0X21idXYoeCk7Ci0gICAgKmRpc3RvcnRpb24gPSBFTkNPREVNQl9JTlZPS0UoJmNwaS0+cnRjZC5lbmNvZGVtYiwgbWJ1dmVycikoeCkgLyA0OwotCi0gICAgcmV0dXJuIFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCAqcmF0ZSwgKmRpc3RvcnRpb24pOwotfQotCi1pbnQgdnA4X3JkX3BpY2tfaW50cmFfbWJ1dl9tb2RlKFZQOF9DT01QICpjcGksIE1BQ1JPQkxPQ0sgKngsIGludCAqcmF0ZSwgaW50ICpyYXRlX3Rva2Vub25seSwgaW50ICpkaXN0b3J0aW9uKQotewotICAgIE1CX1BSRURJQ1RJT05fTU9ERSBtb2RlOwotICAgIE1CX1BSRURJQ1RJT05fTU9ERSBVTklOSVRJQUxJWkVEX0lTX1NBRkUobW9kZV9zZWxlY3RlZCk7Ci0gICAgaW50IGJlc3RfcmQgPSBJTlRfTUFYOwotICAgIGludCBVTklOSVRJQUxJWkVEX0lTX1NBRkUoZCksIFVOSU5JVElBTElaRURfSVNfU0FGRShyKTsKLSAgICBpbnQgcmF0ZV90bzsKLQotICAgIGZvciAobW9kZSA9IERDX1BSRUQ7IG1vZGUgPD0gVE1fUFJFRDsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgaW50IHJhdGU7Ci0gICAgICAgIGludCBkaXN0b3J0aW9uOwotICAgICAgICBpbnQgdGhpc19yZDsKLQotICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlID0gbW9kZTsKLSAgICAgICAgdnA4X2J1aWxkX2ludHJhX3ByZWRpY3RvcnNfbWJ1digmeC0+ZV9tYmQpOwotICAgICAgICBFTkNPREVNQl9JTlZPS0UoSUZfUlRDRCgmY3BpLT5ydGNkLmVuY29kZW1iKSwgc3VibWJ1dikoeC0+c3JjX2RpZmYsCi0gICAgICAgICAgICAgICAgICAgICAgeC0+c3JjLnVfYnVmZmVyLCB4LT5zcmMudl9idWZmZXIsIHgtPmVfbWJkLnByZWRpY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICB4LT5zcmMudXZfc3RyaWRlKTsKLSAgICAgICAgdnA4X3RyYW5zZm9ybV9tYnV2KHgpOwotICAgICAgICB2cDhfcXVhbnRpemVfbWJ1dih4KTsKLQotICAgICAgICByYXRlX3RvID0gcmRfY29zdF9tYnV2KHgpOwotICAgICAgICByYXRlID0gcmF0ZV90byArIHgtPmludHJhX3V2X21vZGVfY29zdFt4LT5lX21iZC5mcmFtZV90eXBlXVt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlXTsKLQotICAgICAgICBkaXN0b3J0aW9uID0gRU5DT0RFTUJfSU5WT0tFKCZjcGktPnJ0Y2QuZW5jb2RlbWIsIG1idXZlcnIpKHgpIC8gNDsKLQotICAgICAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUsIGRpc3RvcnRpb24pOwotCi0gICAgICAgIGlmICh0aGlzX3JkIDwgYmVzdF9yZCkKLSAgICAgICAgewotICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7Ci0gICAgICAgICAgICBkID0gZGlzdG9ydGlvbjsKLSAgICAgICAgICAgIHIgPSByYXRlOwotICAgICAgICAgICAgKnJhdGVfdG9rZW5vbmx5ID0gcmF0ZV90bzsKLSAgICAgICAgICAgIG1vZGVfc2VsZWN0ZWQgPSBtb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnJhdGUgPSByOwotICAgICpkaXN0b3J0aW9uID0gZDsKLQotICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSBtb2RlX3NlbGVjdGVkOwotICAgIHJldHVybiBiZXN0X3JkOwotfQotI2VuZGlmCi0KLWludCB2cDhfY29zdF9tdl9yZWYoTUJfUFJFRElDVElPTl9NT0RFIG0sIGNvbnN0IGludCBuZWFyX212X3JlZl9jdFs0XSkKLXsKLSAgICB2cDhfcHJvYiBwIFtWUDhfTVZSRUZTLTFdOwotICAgIGFzc2VydChORUFSRVNUTVYgPD0gbSAgJiYgIG0gPD0gU1BMSVRNVik7Ci0gICAgdnA4X212X3JlZl9wcm9icyhwLCBuZWFyX212X3JlZl9jdCk7Ci0gICAgcmV0dXJuIHZwOF9jb3N0X3Rva2VuKHZwOF9tdl9yZWZfdHJlZSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X212X3JlZl9lbmNvZGluZ19hcnJheSAtIE5FQVJFU1RNViArIG0pOwotfQotCi12b2lkIHZwOF9zZXRfbWJtb2RlX2FuZF9tdnMoTUFDUk9CTE9DSyAqeCwgTUJfUFJFRElDVElPTl9NT0RFIG1iLCBNViAqbXYpCi17Ci0gICAgaW50IGk7Ci0KLSAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlID0gbWI7Ci0gICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubXYuYXNfbXYucm93ID0gbXYtPnJvdzsKLSAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tdi5hc19tdi5jb2wgPSBtdi0+Y29sOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBCX01PREVfSU5GTyAqYm1pID0gJngtPmVfbWJkLmJsb2NrW2ldLmJtaTsKLSAgICAgICAgYm1pLT5tb2RlID0gKEJfUFJFRElDVElPTl9NT0RFKSBtYjsKLSAgICAgICAgYm1pLT5tdi5hc19tdi5yb3cgPSBtdi0+cm93OwotICAgICAgICBibWktPm12LmFzX212LmNvbCA9IG12LT5jb2w7Ci0gICAgfQotfQotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLXN0YXRpYyBpbnQgbGFiZWxzMm1vZGUoCi0gICAgTUFDUk9CTE9DSyAqeCwKLSAgICBpbnQgY29uc3QgKmxhYmVsaW5ncywgaW50IHdoaWNoX2xhYmVsLAotICAgIEJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZSwKLSAgICBNViAqdGhpc19tdiwgTVYgKmJlc3RfcmVmX212LAotICAgIGludCAqbXZjb3N0WzJdCi0pCi17Ci0gICAgTUFDUk9CTE9DS0QgKmNvbnN0IHhkID0gJiB4LT5lX21iZDsKLSAgICBNT0RFX0lORk8gKmNvbnN0IG1pYyA9IHhkLT5tb2RlX2luZm9fY29udGV4dDsKLSAgICBjb25zdCBpbnQgbWlzID0geGQtPm1vZGVfaW5mb19zdHJpZGU7Ci0KLSAgICBpbnQgY29zdCA9IDA7Ci0gICAgaW50IHRoaXNtdmNvc3QgPSAwOwotCi0gICAgLyogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIHJldHJpZXZpbmcgcHJldmlvdXNseS1lbmNvZGVkIG1vdGlvbiB2ZWN0b3JzLgotICAgICAgIE9uZXMgZnJvbSB0aGlzIG1hY3JvYmxvY2sgaGF2ZSB0byBiZSBwdWxsZWQgZnJvbSB0aGUgQkxPQ0tEIGFycmF5Ci0gICAgICAgYXMgdGhleSBoYXZlIG5vdCB5ZXQgbWFkZSBpdCB0byB0aGUgYm1pIGFycmF5IGluIG91ciBNQl9NT0RFX0lORk8uICovCi0KLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgQkxPQ0tEICpjb25zdCBkID0geGQtPmJsb2NrICsgaTsKLSAgICAgICAgY29uc3QgaW50IHJvdyA9IGkgPj4gMiwgIGNvbCA9IGkgJiAzOwotCi0gICAgICAgIEJfUFJFRElDVElPTl9NT0RFIG07Ci0KLSAgICAgICAgaWYgKGxhYmVsaW5nc1tpXSAhPSB3aGljaF9sYWJlbCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChjb2wgICYmICBsYWJlbGluZ3NbaV0gPT0gbGFiZWxpbmdzW2ktMV0pCi0gICAgICAgICAgICBtID0gTEVGVDRYNDsKLSAgICAgICAgZWxzZSBpZiAocm93ICAmJiAgbGFiZWxpbmdzW2ldID09IGxhYmVsaW5nc1tpLTRdKQotICAgICAgICAgICAgbSA9IEFCT1ZFNFg0OwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IHRpbWUgd2Ugc2hvdWxkIGRvIGNvc3RpbmcgZm9yIG5ldyBtb3Rpb24gdmVjdG9yIG9yIG1vZGUKLSAgICAgICAgICAgIC8vIGlzIHdoZW4gd2UgYXJlIG9uIGEgbmV3IGxhYmVsICAoamJiIE1heSAwOCwgMjAwNykKLSAgICAgICAgICAgIHN3aXRjaCAobSA9IHRoaXNfbW9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTkVXNFg0IDoKLSAgICAgICAgICAgICAgICB0aGlzbXZjb3N0ICA9IHZwOF9tdl9iaXRfY29zdCh0aGlzX212LCBiZXN0X3JlZl9tdiwgbXZjb3N0LCAxMDIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMRUZUNFg0OgotICAgICAgICAgICAgICAgICp0aGlzX212ID0gY29sID8gZFstMV0uYm1pLm12LmFzX212IDogdnA4X2xlZnRfYm1pKG1pYywgaSktPm12LmFzX212OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBQk9WRTRYNDoKLSAgICAgICAgICAgICAgICAqdGhpc19tdiA9IHJvdyA/IGRbLTRdLmJtaS5tdi5hc19tdiA6IHZwOF9hYm92ZV9ibWkobWljLCBpLCBtaXMpLT5tdi5hc19tdjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWkVSTzRYNDoKLSAgICAgICAgICAgICAgICB0aGlzX212LT5yb3cgPSB0aGlzX212LT5jb2wgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG0gPT0gQUJPVkU0WDQpICAvLyByZXBsYWNlIGFib3ZlIHdpdGggbGVmdCBpZiBzYW1lCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTVYgbXYgPSBjb2wgPyBkWy0xXS5ibWkubXYuYXNfbXYgOiB2cDhfbGVmdF9ibWkobWljLCBpKS0+bXYuYXNfbXY7Ci0KLSAgICAgICAgICAgICAgICBpZiAobXYucm93ID09IHRoaXNfbXYtPnJvdyAgJiYgIG12LmNvbCA9PSB0aGlzX212LT5jb2wpCi0gICAgICAgICAgICAgICAgICAgIG0gPSBMRUZUNFg0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb3N0ID0geC0+aW50ZXJfYm1vZGVfY29zdHNbIG1dOwotICAgICAgICB9Ci0KLSAgICAgICAgZC0+Ym1pLm1vZGUgPSBtOwotICAgICAgICBkLT5ibWkubXYuYXNfbXYgPSAqdGhpc19tdjsKLQotICAgIH0KLSAgICB3aGlsZSAoKytpIDwgMTYpOwotCi0gICAgY29zdCArPSB0aGlzbXZjb3N0IDsKLSAgICByZXR1cm4gY29zdDsKLX0KLQotc3RhdGljIGludCByZGNvc3RfbWJzZWdtZW50X3koTUFDUk9CTE9DSyAqbWIsIGNvbnN0IGludCAqbGFiZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoX2xhYmVsLCBFTlRST1BZX0NPTlRFWFQgKnRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5UUk9QWV9DT05URVhUICp0bCkKLXsKLSAgICBpbnQgY29zdCA9IDA7Ci0gICAgaW50IGI7Ci0gICAgTUFDUk9CTE9DS0QgKnggPSAmbWItPmVfbWJkOwotCi0gICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCi0gICAgICAgIGlmIChsYWJlbHNbIGJdID09IHdoaWNoX2xhYmVsKQotICAgICAgICAgICAgY29zdCArPSBjb3N0X2NvZWZmcyhtYiwgeC0+YmxvY2sgKyBiLCBQTEFORV9UWVBFX1lfV0lUSF9EQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEgKyB2cDhfYmxvY2syYWJvdmVbYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsICsgdnA4X2Jsb2NrMmxlZnRbYl0pOwotCi0gICAgcmV0dXJuIGNvc3Q7Ci0KLX0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdnA4X2VuY29kZV9pbnRlcl9tYl9zZWdtZW50KE1BQ1JPQkxPQ0sgKngsIGludCBjb25zdCAqbGFiZWxzLCBpbnQgd2hpY2hfbGFiZWwsIGNvbnN0IHZwOF9lbmNvZGVtYl9ydGNkX3Z0YWJsZV90ICpydGNkKQotewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGludCBkaXN0b3J0aW9uID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGxhYmVsc1tpXSA9PSB3aGljaF9sYWJlbCkKLSAgICAgICAgewotICAgICAgICAgICAgQkxPQ0tEICpiZCA9ICZ4LT5lX21iZC5ibG9ja1tpXTsKLSAgICAgICAgICAgIEJMT0NLICpiZSA9ICZ4LT5ibG9ja1tpXTsKLQotCi0gICAgICAgICAgICB2cDhfYnVpbGRfaW50ZXJfcHJlZGljdG9yc19iKGJkLCAxNiwgeC0+ZV9tYmQuc3VicGl4ZWxfcHJlZGljdCk7Ci0gICAgICAgICAgICBFTkNPREVNQl9JTlZPS0UocnRjZCwgc3ViYikoYmUsIGJkLCAxNik7Ci0gICAgICAgICAgICB4LT52cDhfc2hvcnRfZmRjdDR4NChiZS0+c3JjX2RpZmYsIGJlLT5jb2VmZiwgMzIpOwotCi0gICAgICAgICAgICAvLyBzZXQgdG8gMCBubyB3YXkgdG8gYWNjb3VudCBmb3IgMm5kIG9yZGVyIERDIHNvIGRpc2NvdW50Ci0gICAgICAgICAgICAvL2JlLT5jb2VmZlswXSA9IDA7Ci0gICAgICAgICAgICB4LT5xdWFudGl6ZV9iKGJlLCBiZCk7Ci0KLSAgICAgICAgICAgIGRpc3RvcnRpb24gKz0gRU5DT0RFTUJfSU5WT0tFKHJ0Y2QsIGJlcnIpKGJlLT5jb2VmZiwgYmQtPmRxY29lZmYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGRpc3RvcnRpb247Ci19Ci0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50YXRpb25fdG9fc3Nlc2hpZnRbNF0gPSB7MywgMywgMiwgMH07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTVYgKnJlZl9tdjsKLSAgTVYgKm12cDsKLQotICBpbnQgc2VnbWVudF9yZDsKLSAgaW50IHNlZ21lbnRfbnVtOwotICBpbnQgcjsKLSAgaW50IGQ7Ci0gIGludCBzZWdtZW50X3lyYXRlOwotICBCX1BSRURJQ1RJT05fTU9ERSBtb2Rlc1sxNl07Ci0gIGludF9tdiBtdnNbMTZdOwotICB1bnNpZ25lZCBjaGFyIGVvYnNbMTZdOwotCi0gIGludCBtdnRocmVzaDsKLSAgaW50ICptZGNvdW50czsKLQotICBNViBzdl9tdnBbNF07ICAgICAvLyBzYXZlIDQgbXZwIGZyb20gOHg4Ci0gIGludCBzdl9pc3RlcFsyXTsgIC8vIHNhdmUgMiBpbml0aWFsIHN0ZXBfcGFyYW0gZm9yIDE2eDgvOHgxNgotCi19IEJFU1RfU0VHX0lORk87Ci0KLQotc3RhdGljIHZvaWQgcmRfY2hlY2tfc2VnbWVudChWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVNUX1NFR19JTkZPICpic2ksIHVuc2lnbmVkIGludCBzZWdtZW50YXRpb24pCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGNvbnN0ICpsYWJlbHM7Ci0gICAgaW50IGJyID0gMDsKLSAgICBpbnQgYmQgPSAwOwotICAgIEJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZTsKLQotCi0gICAgaW50IGxhYmVsX2NvdW50OwotICAgIGludCB0aGlzX3NlZ21lbnRfcmQgPSAwOwotICAgIGludCBsYWJlbF9tdl90aHJlc2g7Ci0gICAgaW50IHJhdGUgPSAwOwotICAgIGludCBzYnIgPSAwOwotICAgIGludCBzYmQgPSAwOwotICAgIGludCBzZWdtZW50eXJhdGUgPSAwOwotCi0gICAgdnA4X3ZhcmlhbmNlX2ZuX3B0cl90ICp2X2ZuX3B0cjsKLQotICAgIEVOVFJPUFlfQ09OVEVYVF9QTEFORVMgdF9hYm92ZSwgdF9sZWZ0OwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGE7Ci0gICAgRU5UUk9QWV9DT05URVhUICp0bDsKLSAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmVfYiwgdF9sZWZ0X2I7Ci0gICAgRU5UUk9QWV9DT05URVhUICp0YV9iOwotICAgIEVOVFJPUFlfQ09OVEVYVCAqdGxfYjsKLQotICAgIHZweF9tZW1jcHkoJnRfYWJvdmUsIHgtPmVfbWJkLmFib3ZlX2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0gICAgdnB4X21lbWNweSgmdF9sZWZ0LCB4LT5lX21iZC5sZWZ0X2NvbnRleHQsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0KLSAgICB0YSA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZTsKLSAgICB0bCA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9sZWZ0OwotICAgIHRhX2IgPSAoRU5UUk9QWV9DT05URVhUICopJnRfYWJvdmVfYjsKLSAgICB0bF9iID0gKEVOVFJPUFlfQ09OVEVYVCAqKSZ0X2xlZnRfYjsKLQotICAgIGJyID0gMDsKLSAgICBiZCA9IDA7Ci0KLSAgICB2X2ZuX3B0ciA9ICZjcGktPmZuX3B0cltzZWdtZW50YXRpb25dOwotICAgIGxhYmVscyA9IHZwOF9tYnNwbGl0c1tzZWdtZW50YXRpb25dOwotICAgIGxhYmVsX2NvdW50ID0gdnA4X21ic3BsaXRfY291bnRbc2VnbWVudGF0aW9uXTsKLQotICAgIC8vIDY0IG1ha2VzIHRoaXMgdGhyZXNob2xkIHJlYWxseSBiaWcgZWZmZWN0aXZlbHkKLSAgICAvLyBtYWtpbmcgaXQgc28gdGhhdCB3ZSB2ZXJ5IHJhcmVseSBjaGVjayBtdnMgb24KLSAgICAvLyBzZWdtZW50cy4gICBzZXR0aW5nIHRoaXMgdG8gMSB3b3VsZCBtYWtlIG12IHRocmVzaAotICAgIC8vIHJvdWdobHkgZXF1YWwgdG8gd2hhdCBpdCBpcyBmb3IgbWFjcm9ibG9ja3MKLSAgICBsYWJlbF9tdl90aHJlc2ggPSAxICogYnNpLT5tdnRocmVzaCAvIGxhYmVsX2NvdW50IDsKLQotICAgIC8vIFNlZ21lbnRhdGlvbiBtZXRob2Qgb3ZlcmhlYWRzCi0gICAgcmF0ZSA9IHZwOF9jb3N0X3Rva2VuKHZwOF9tYnNwbGl0X3RyZWUsIHZwOF9tYnNwbGl0X3Byb2JzLCB2cDhfbWJzcGxpdF9lbmNvZGluZ3MgKyBzZWdtZW50YXRpb24pOwotICAgIHJhdGUgKz0gdnA4X2Nvc3RfbXZfcmVmKFNQTElUTVYsIGJzaS0+bWRjb3VudHMpOwotICAgIHRoaXNfc2VnbWVudF9yZCArPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZSwgMCk7Ci0gICAgYnIgKz0gcmF0ZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsYWJlbF9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgTVYgbW9kZV9tdltCX01PREVfQ09VTlRdOwotICAgICAgICBpbnQgYmVzdF9sYWJlbF9yZCA9IElOVF9NQVg7Ci0gICAgICAgIEJfUFJFRElDVElPTl9NT0RFIG1vZGVfc2VsZWN0ZWQgPSBaRVJPNFg0OwotICAgICAgICBpbnQgYmVzdGxhYmVseXJhdGUgPSAwOwotCi0gICAgICAgIC8vIHNlYXJjaCBmb3IgdGhlIGJlc3QgbW90aW9uIHZlY3RvciBvbiB0aGlzIHNlZ21lbnQKLSAgICAgICAgZm9yICh0aGlzX21vZGUgPSBMRUZUNFg0OyB0aGlzX21vZGUgPD0gTkVXNFg0IDsgdGhpc19tb2RlICsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc19yZDsKLSAgICAgICAgICAgIGludCBkaXN0b3J0aW9uOwotICAgICAgICAgICAgaW50IGxhYmVseXJhdGU7Ci0gICAgICAgICAgICBFTlRST1BZX0NPTlRFWFRfUExBTkVTIHRfYWJvdmVfcywgdF9sZWZ0X3M7Ci0gICAgICAgICAgICBFTlRST1BZX0NPTlRFWFQgKnRhX3M7Ci0gICAgICAgICAgICBFTlRST1BZX0NPTlRFWFQgKnRsX3M7Ci0KLSAgICAgICAgICAgIHZweF9tZW1jcHkoJnRfYWJvdmVfcywgJnRfYWJvdmUsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KCZ0X2xlZnRfcywgJnRfbGVmdCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLQotICAgICAgICAgICAgdGFfcyA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9hYm92ZV9zOwotICAgICAgICAgICAgdGxfcyA9IChFTlRST1BZX0NPTlRFWFQgKikmdF9sZWZ0X3M7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzX21vZGUgPT0gTkVXNFg0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzc2VzaGlmdDsKLSAgICAgICAgICAgICAgICBpbnQgbnVtMDA7Ci0gICAgICAgICAgICAgICAgaW50IHN0ZXBfcGFyYW0gPSAwOwotICAgICAgICAgICAgICAgIGludCBmdXJ0aGVyX3N0ZXBzOwotICAgICAgICAgICAgICAgIGludCBuOwotICAgICAgICAgICAgICAgIGludCB0aGlzc21lOwotICAgICAgICAgICAgICAgIGludCBiZXN0c21lID0gSU5UX01BWDsKLSAgICAgICAgICAgICAgICBNViAgdGVtcF9tdjsKLSAgICAgICAgICAgICAgICBCTE9DSyAqYzsKLSAgICAgICAgICAgICAgICBCTE9DS0QgKmU7Ci0KLSAgICAgICAgICAgICAgICAvLyBJcyB0aGUgYmVzdCBzbyBmYXIgc3VmZmljaWVudGx5IGdvb2QgdGhhdCB3ZSBjYW50IGp1c3RpZnkgZG9pbmcgYW5kIG5ldyBtb3Rpb24gc2VhcmNoLgotICAgICAgICAgICAgICAgIGlmIChiZXN0X2xhYmVsX3JkIDwgbGFiZWxfbXZfdGhyZXNoKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb24gPT0gQkxPQ0tfOFgxNiB8fCBzZWdtZW50YXRpb24gPT0gQkxPQ0tfMTZYOCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnNpLT5tdnAgPSAmYnNpLT5zdl9tdnBbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09MSAmJiBzZWdtZW50YXRpb24gPT0gQkxPQ0tfMTZYOCkgYnNpLT5tdnAgPSAmYnNpLT5zdl9tdnBbMl07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBfcGFyYW0gPSBic2ktPnN2X2lzdGVwW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHByZXZpb3VzIGJsb2NrJ3MgcmVzdWx0IGFzIG5leHQgYmxvY2sncyBNViBwcmVkaWN0b3IuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb24gPT0gQkxPQ0tfNFg0ICYmIGk+MCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnNpLT5tdnAgPSAmKHgtPmVfbWJkLmJsb2NrW2ktMV0uYm1pLm12LmFzX212KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT00IHx8IGk9PTggfHwgaT09MTIpIGJzaS0+bXZwID0gJih4LT5lX21iZC5ibG9ja1tpLTRdLmJtaS5tdi5hc19tdik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGVwX3BhcmFtID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZ1cnRoZXJfc3RlcHMgPSAoTUFYX01WU0VBUkNIX1NURVBTIC0gMSkgLSBzdGVwX3BhcmFtOwotCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2FkcGIgPSB4LT5zYWRwZXJiaXQ0OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZmlyc3QgbGFiZWwKLSAgICAgICAgICAgICAgICAgICAgbiA9IHZwOF9tYnNwbGl0X29mZnNldFtzZWdtZW50YXRpb25dW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIGMgPSAmeC0+YmxvY2tbbl07Ci0gICAgICAgICAgICAgICAgICAgIGUgPSAmeC0+ZV9tYmQuYmxvY2tbbl07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNwaS0+c2Yuc2VhcmNoX21ldGhvZCA9PSBIRVgpCi0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdnA4X2hleF9zZWFyY2goeCwgYywgZSwgYnNpLT5yZWZfbXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVfbXZbTkVXNFg0XSwgc3RlcF9wYXJhbSwgc2FkcGIsICZudW0wMCwgdl9mbl9wdHIsIHgtPm12c2FkY29zdCwgeC0+bXZjb3N0LCBic2ktPnJlZl9tdik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYywgZSwgYnNpLT5tdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVfbXZbTkVXNFg0XSwgc3RlcF9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWRwYiAvIDIsICZudW0wMCwgdl9mbl9wdHIsIHgtPm12c2FkY29zdCwgeC0+bXZjb3N0LCBic2ktPnJlZl9tdik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBudW0wMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bTAwID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG4gPCBmdXJ0aGVyX3N0ZXBzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW0wMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMDAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzc21lID0gY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYywgZSwgYnNpLT5tdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcF9tdiwgc3RlcF9wYXJhbSArIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWRwYiAvIDIsICZudW0wMCwgdl9mbl9wdHIsIHgtPm12c2FkY29zdCwgeC0+bXZjb3N0LCBic2ktPnJlZl9tdik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNzbWUgPCBiZXN0c21lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdGhpc3NtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVXNFg0XS5yb3cgPSB0ZW1wX212LnJvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVXNFg0XS5jb2wgPSB0ZW1wX212LmNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNzZXNoaWZ0ID0gc2VnbWVudGF0aW9uX3RvX3NzZXNoaWZ0W3NlZ21lbnRhdGlvbl07Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIHdlIGRvIGEgZnVsbCBzZWFyY2ggKGJlc3QgcXVhbGl0eSBvbmx5KQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNwaS0+Y29tcHJlc3Nvcl9zcGVlZCA9PSAwKSAmJiAoYmVzdHNtZSA+PiBzc2VzaGlmdCkgPiA0MDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzc21lID0gY3BpLT5mdWxsX3NlYXJjaF9zYWQoeCwgYywgZSwgYnNpLT5tdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FkcGIgLyA0LCAxNiwgdl9mbl9wdHIsIHgtPm12Y29zdCwgeC0+bXZzYWRjb3N0LGJzaS0+cmVmX212KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNzbWUgPCBiZXN0c21lKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RzbWUgPSB0aGlzc21lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVXNFg0XSA9IGUtPmJtaS5tdi5hc19tdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZnVsbCBzZWFyY2ggcmVzdWx0IGlzIGFjdHVhbGx5IHdvcnNlIHNvIHJlLWluc3RhdGUgdGhlIHByZXZpb3VzIGJlc3QgdmVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+Ym1pLm12LmFzX212ID0gbW9kZV9tdltORVc0WDRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJlc3RzbWUgPCBJTlRfTUFYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjcGktPmNvbW1vbi5mdWxsX3BpeGVsKQotICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCh4LCBjLCBlLCAmbW9kZV9tdltORVc0WDRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic2ktPnJlZl9tdiwgeC0+ZXJyb3JwZXJiaXQgLyAyLCB2X2ZuX3B0ciwgeC0+bXZjb3N0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3NraXBfZnJhY3Rpb25hbF9tdl9zdGVwKHgsIGMsIGUsICZtb2RlX212W05FVzRYNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNpLT5yZWZfbXYsIHgtPmVycm9ycGVyYml0LCB2X2ZuX3B0ciwgeC0+bXZjb3N0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIE5FVzRYNCAqLwotCi0gICAgICAgICAgICByYXRlID0gbGFiZWxzMm1vZGUoeCwgbGFiZWxzLCBpLCB0aGlzX21vZGUsICZtb2RlX212W3RoaXNfbW9kZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNpLT5yZWZfbXYsIHgtPm12Y29zdCk7Ci0KLSAgICAgICAgICAgIC8vIFRyYXAgdmVjdG9ycyB0aGF0IHJlYWNoIGJleW9uZCB0aGUgVU1WIGJvcmRlcnMKLSAgICAgICAgICAgIGlmICgoKG1vZGVfbXZbdGhpc19tb2RlXS5yb3cgPj4gMykgPCB4LT5tdl9yb3dfbWluKSB8fCAoKG1vZGVfbXZbdGhpc19tb2RlXS5yb3cgPj4gMykgPiB4LT5tdl9yb3dfbWF4KSB8fAotICAgICAgICAgICAgICAgICgobW9kZV9tdlt0aGlzX21vZGVdLmNvbCA+PiAzKSA8IHgtPm12X2NvbF9taW4pIHx8ICgobW9kZV9tdlt0aGlzX21vZGVdLmNvbCA+PiAzKSA+IHgtPm12X2NvbF9tYXgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkaXN0b3J0aW9uID0gdnA4X2VuY29kZV9pbnRlcl9tYl9zZWdtZW50KHgsIGxhYmVscywgaSwgSUZfUlRDRCgmY3BpLT5ydGNkLmVuY29kZW1iKSkgLyA0OwotCi0gICAgICAgICAgICBsYWJlbHlyYXRlID0gcmRjb3N0X21ic2VnbWVudF95KHgsIGxhYmVscywgaSwgdGFfcywgdGxfcyk7Ci0gICAgICAgICAgICByYXRlICs9IGxhYmVseXJhdGU7Ci0KLSAgICAgICAgICAgIHRoaXNfcmQgPSBSRENPU1QoeC0+cmRtdWx0LCB4LT5yZGRpdiwgcmF0ZSwgZGlzdG9ydGlvbik7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzX3JkIDwgYmVzdF9sYWJlbF9yZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYnIgPSByYXRlOwotICAgICAgICAgICAgICAgIHNiZCA9IGRpc3RvcnRpb247Ci0gICAgICAgICAgICAgICAgYmVzdGxhYmVseXJhdGUgPSBsYWJlbHlyYXRlOwotICAgICAgICAgICAgICAgIG1vZGVfc2VsZWN0ZWQgPSB0aGlzX21vZGU7Ci0gICAgICAgICAgICAgICAgYmVzdF9sYWJlbF9yZCA9IHRoaXNfcmQ7Ci0KLSAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KHRhX2IsIHRhX3MsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0gICAgICAgICAgICAgICAgdnB4X21lbWNweSh0bF9iLCB0bF9zLCBzaXplb2YoRU5UUk9QWV9DT05URVhUX1BMQU5FUykpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLypmb3IgZWFjaCA0eDQgbW9kZSovCi0KLSAgICAgICAgdnB4X21lbWNweSh0YSwgdGFfYiwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLSAgICAgICAgdnB4X21lbWNweSh0bCwgdGxfYiwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLQotICAgICAgICBsYWJlbHMybW9kZSh4LCBsYWJlbHMsIGksIG1vZGVfc2VsZWN0ZWQsICZtb2RlX212W21vZGVfc2VsZWN0ZWRdLAotICAgICAgICAgICAgICAgICAgICBic2ktPnJlZl9tdiwgeC0+bXZjb3N0KTsKLQotICAgICAgICBiciArPSBzYnI7Ci0gICAgICAgIGJkICs9IHNiZDsKLSAgICAgICAgc2VnbWVudHlyYXRlICs9IGJlc3RsYWJlbHlyYXRlOwotICAgICAgICB0aGlzX3NlZ21lbnRfcmQgKz0gYmVzdF9sYWJlbF9yZDsKLQotICAgICAgICBpZiAodGhpc19zZWdtZW50X3JkID49IGJzaS0+c2VnbWVudF9yZCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfSAvKiBmb3IgZWFjaCBsYWJlbCAqLwotCi0gICAgaWYgKHRoaXNfc2VnbWVudF9yZCA8IGJzaS0+c2VnbWVudF9yZCkKLSAgICB7Ci0gICAgICAgIGJzaS0+ciA9IGJyOwotICAgICAgICBic2ktPmQgPSBiZDsKLSAgICAgICAgYnNpLT5zZWdtZW50X3lyYXRlID0gc2VnbWVudHlyYXRlOwotICAgICAgICBic2ktPnNlZ21lbnRfcmQgPSB0aGlzX3NlZ21lbnRfcmQ7Ci0gICAgICAgIGJzaS0+c2VnbWVudF9udW0gPSBzZWdtZW50YXRpb247Ci0KLSAgICAgICAgLy8gc3RvcmUgZXZlcnl0aGluZyBuZWVkZWQgdG8gY29tZSBiYWNrIHRvIHRoaXMhIQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQkxPQ0tEICpiZCA9ICZ4LT5lX21iZC5ibG9ja1tpXTsKLQotICAgICAgICAgICAgYnNpLT5tdnNbaV0uYXNfbXYgPSBiZC0+Ym1pLm12LmFzX212OwotICAgICAgICAgICAgYnNpLT5tb2Rlc1tpXSA9IGJkLT5ibWkubW9kZTsKLSAgICAgICAgICAgIGJzaS0+ZW9ic1tpXSA9IGJkLT5lb2I7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBfX2lubGluZQotdm9pZCB2cDhfY2FsX3N0ZXBfcGFyYW0oaW50IHNyLCBpbnQgKnNwKQotewotICAgIGludCBzdGVwID0gMDsKLQotICAgIGlmIChzciA+IE1BWF9GSVJTVF9TVEVQKSBzciA9IE1BWF9GSVJTVF9TVEVQOwotICAgIGVsc2UgaWYgKHNyIDwgMSkgc3IgPSAxOwotCi0gICAgd2hpbGUgKHNyPj49MSkKLSAgICAgICAgc3RlcCsrOwotCi0gICAgKnNwID0gTUFYX01WU0VBUkNIX1NURVBTIC0gMSAtIHN0ZXA7Ci19Ci0KLXN0YXRpYyBpbnQgdnA4X3JkX3BpY2tfYmVzdF9tYnNlZ21lbnRhdGlvbihWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WICpiZXN0X3JlZl9tdiwgaW50IGJlc3RfcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptZGNvdW50cywgaW50ICpyZXR1cm50b3RyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmV0dXJueXJhdGUsIGludCAqcmV0dXJuZGlzdG9ydGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXZ0aHJlc2gpCi17Ci0gICAgaW50IGk7Ci0gICAgQkVTVF9TRUdfSU5GTyBic2k7Ci0KLSAgICB2cHhfbWVtc2V0KCZic2ksIDAsIHNpemVvZihic2kpKTsKLQotICAgIGJzaS5zZWdtZW50X3JkID0gYmVzdF9yZDsKLSAgICBic2kucmVmX212ID0gYmVzdF9yZWZfbXY7Ci0gICAgYnNpLm12cCA9IGJlc3RfcmVmX212OwotICAgIGJzaS5tdnRocmVzaCA9IG12dGhyZXNoOwotICAgIGJzaS5tZGNvdW50cyA9IG1kY291bnRzOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGJzaS5tb2Rlc1tpXSA9IFpFUk80WDQ7Ci0gICAgfQotCi0gICAgaWYoY3BpLT5jb21wcmVzc29yX3NwZWVkID09IDApCi0gICAgewotICAgICAgICAvKiBmb3Igbm93LCB3ZSB3aWxsIGtlZXAgdGhlIG9yaWdpbmFsIHNlZ21lbnRhdGlvbiBvcmRlcgotICAgICAgICAgICB3aGVuIGluIGJlc3QgcXVhbGl0eSBtb2RlICovCi0gICAgICAgIHJkX2NoZWNrX3NlZ21lbnQoY3BpLCB4LCAmYnNpLCBCTE9DS18xNlg4KTsKLSAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzhYMTYpOwotICAgICAgICByZF9jaGVja19zZWdtZW50KGNwaSwgeCwgJmJzaSwgQkxPQ0tfOFg4KTsKLSAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzRYNCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGludCBzcjsKLQotICAgICAgICByZF9jaGVja19zZWdtZW50KGNwaSwgeCwgJmJzaSwgQkxPQ0tfOFg4KTsKLQotICAgICAgICBpZiAoYnNpLnNlZ21lbnRfcmQgPCBiZXN0X3JkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY29sX21pbiA9IChiZXN0X3JlZl9tdi0+Y29sIC0gTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotICAgICAgICAgICAgaW50IGNvbF9tYXggPSAoYmVzdF9yZWZfbXYtPmNvbCArIE1BWF9GVUxMX1BFTF9WQUwpID4+MzsKLSAgICAgICAgICAgIGludCByb3dfbWluID0gKGJlc3RfcmVmX212LT5yb3cgLSBNQVhfRlVMTF9QRUxfVkFMKSA+PjM7Ci0gICAgICAgICAgICBpbnQgcm93X21heCA9IChiZXN0X3JlZl9tdi0+cm93ICsgTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotCi0gICAgICAgICAgICBpbnQgdG1wX2NvbF9taW4gPSB4LT5tdl9jb2xfbWluOwotICAgICAgICAgICAgaW50IHRtcF9jb2xfbWF4ID0geC0+bXZfY29sX21heDsKLSAgICAgICAgICAgIGludCB0bXBfcm93X21pbiA9IHgtPm12X3Jvd19taW47Ci0gICAgICAgICAgICBpbnQgdG1wX3Jvd19tYXggPSB4LT5tdl9yb3dfbWF4OwotCi0gICAgICAgICAgICAvKiBHZXQgaW50ZXJzZWN0aW9uIG9mIFVNViB3aW5kb3cgYW5kIHZhbGlkIE1WIHdpbmRvdyB0byByZWR1Y2UgIyBvZiBjaGVja3MgaW4gZGlhbW9uZCBzZWFyY2guICovCi0gICAgICAgICAgICBpZiAoeC0+bXZfY29sX21pbiA8IGNvbF9taW4gKQotICAgICAgICAgICAgICAgIHgtPm12X2NvbF9taW4gPSBjb2xfbWluOwotICAgICAgICAgICAgaWYgKHgtPm12X2NvbF9tYXggPiBjb2xfbWF4ICkKLSAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWF4ID0gY29sX21heDsKLSAgICAgICAgICAgIGlmICh4LT5tdl9yb3dfbWluIDwgcm93X21pbiApCi0gICAgICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHJvd19taW47Ci0gICAgICAgICAgICBpZiAoeC0+bXZfcm93X21heCA+IHJvd19tYXggKQotICAgICAgICAgICAgICAgIHgtPm12X3Jvd19tYXggPSByb3dfbWF4OwotCi0gICAgICAgICAgICAvKiBHZXQgOHg4IHJlc3VsdCAqLwotICAgICAgICAgICAgYnNpLnN2X212cFswXSA9IGJzaS5tdnNbMF0uYXNfbXY7Ci0gICAgICAgICAgICBic2kuc3ZfbXZwWzFdID0gYnNpLm12c1syXS5hc19tdjsKLSAgICAgICAgICAgIGJzaS5zdl9tdnBbMl0gPSBic2kubXZzWzhdLmFzX212OwotICAgICAgICAgICAgYnNpLnN2X212cFszXSA9IGJzaS5tdnNbMTBdLmFzX212OwotCi0gICAgICAgICAgICAvKiBVc2UgOHg4IHJlc3VsdCBhcyAxNng4Lzh4MTYncyBwcmVkaWN0b3IgTVYuIEFkanVzdCBzZWFyY2ggcmFuZ2UgYWNjb3JkaW5nIHRvIHRoZSBjbG9zZW5lc3Mgb2YgMiBNVi4gKi8KLSAgICAgICAgICAgIC8qIGJsb2NrIDhYMTYgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzciA9IE1BWEYoKGFicyhic2kuc3ZfbXZwWzBdLnJvdyAtIGJzaS5zdl9tdnBbMl0ucm93KSk+PjMsIChhYnMoYnNpLnN2X212cFswXS5jb2wgLSBic2kuc3ZfbXZwWzJdLmNvbCkpPj4zKTsKLSAgICAgICAgICAgICAgICB2cDhfY2FsX3N0ZXBfcGFyYW0oc3IsICZic2kuc3ZfaXN0ZXBbMF0pOwotCi0gICAgICAgICAgICAgICAgc3IgPSBNQVhGKChhYnMoYnNpLnN2X212cFsxXS5yb3cgLSBic2kuc3ZfbXZwWzNdLnJvdykpPj4zLCAoYWJzKGJzaS5zdl9tdnBbMV0uY29sIC0gYnNpLnN2X212cFszXS5jb2wpKT4+Myk7Ci0gICAgICAgICAgICAgICAgdnA4X2NhbF9zdGVwX3BhcmFtKHNyLCAmYnNpLnN2X2lzdGVwWzFdKTsKLQotICAgICAgICAgICAgICAgIHJkX2NoZWNrX3NlZ21lbnQoY3BpLCB4LCAmYnNpLCBCTE9DS184WDE2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYmxvY2sgMTZYOCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNyID0gTUFYRigoYWJzKGJzaS5zdl9tdnBbMF0ucm93IC0gYnNpLnN2X212cFsxXS5yb3cpKT4+MywgKGFicyhic2kuc3ZfbXZwWzBdLmNvbCAtIGJzaS5zdl9tdnBbMV0uY29sKSk+PjMpOwotICAgICAgICAgICAgICAgIHZwOF9jYWxfc3RlcF9wYXJhbShzciwgJmJzaS5zdl9pc3RlcFswXSk7Ci0KLSAgICAgICAgICAgICAgICBzciA9IE1BWEYoKGFicyhic2kuc3ZfbXZwWzJdLnJvdyAtIGJzaS5zdl9tdnBbM10ucm93KSk+PjMsIChhYnMoYnNpLnN2X212cFsyXS5jb2wgLSBic2kuc3ZfbXZwWzNdLmNvbCkpPj4zKTsKLSAgICAgICAgICAgICAgICB2cDhfY2FsX3N0ZXBfcGFyYW0oc3IsICZic2kuc3ZfaXN0ZXBbMV0pOwotCi0gICAgICAgICAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzE2WDgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiA4eDggaXMgYmV0dGVyIHRoYW4gMTZ4OC84eDE2LCB0aGVuIGRvIDR4NCBzZWFyY2ggKi8KLSAgICAgICAgICAgIC8qIE5vdCBza2lwIDR4NCBpZiBzcGVlZD0wIChnb29kIHF1YWxpdHkpICovCi0gICAgICAgICAgICBpZiAoY3BpLT5zZi5ub19za2lwX2Jsb2NrNHg0X3NlYXJjaCB8fCBic2kuc2VnbWVudF9udW0gPT0gQkxPQ0tfOFg4KSAgLyogfHwgKHN2X3NlZ21lbnRfcmQ4eDgtYnNpLnNlZ21lbnRfcmQpIDwgc3Zfc2VnbWVudF9yZDh4OD4+NSkgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBic2kubXZwID0gJmJzaS5zdl9tdnBbMF07Ci0gICAgICAgICAgICAgICAgcmRfY2hlY2tfc2VnbWVudChjcGksIHgsICZic2ksIEJMT0NLXzRYNCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHJlc3RvcmUgVU1WIHdpbmRvdyAqLwotICAgICAgICAgICAgeC0+bXZfY29sX21pbiA9IHRtcF9jb2xfbWluOwotICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IHRtcF9jb2xfbWF4OwotICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHRtcF9yb3dfbWluOwotICAgICAgICAgICAgeC0+bXZfcm93X21heCA9IHRtcF9yb3dfbWF4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc2V0IGl0IHRvIHRoZSBiZXN0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBCTE9DS0QgKmJkID0gJngtPmVfbWJkLmJsb2NrW2ldOwotCi0gICAgICAgIGJkLT5ibWkubXYuYXNfbXYgPSBic2kubXZzW2ldLmFzX212OwotICAgICAgICBiZC0+Ym1pLm1vZGUgPSBic2kubW9kZXNbaV07Ci0gICAgICAgIGJkLT5lb2IgPSBic2kuZW9ic1tpXTsKLSAgICB9Ci0KLSAgICAqcmV0dXJudG90cmF0ZSA9IGJzaS5yOwotICAgICpyZXR1cm5kaXN0b3J0aW9uID0gYnNpLmQ7Ci0gICAgKnJldHVybnlyYXRlID0gYnNpLnNlZ21lbnRfeXJhdGU7Ci0KLSAgICAvKiBzYXZlIHBhcnRpdGlvbnMgKi8KLSAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5wYXJ0aXRpb25pbmcgPSBic2kuc2VnbWVudF9udW07Ci0gICAgeC0+cGFydGl0aW9uX2luZm8tPmNvdW50ID0gdnA4X21ic3BsaXRfY291bnRbYnNpLnNlZ21lbnRfbnVtXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCB4LT5wYXJ0aXRpb25faW5mby0+Y291bnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBqOwotCi0gICAgICAgIGogPSB2cDhfbWJzcGxpdF9vZmZzZXRbYnNpLnNlZ21lbnRfbnVtXVtpXTsKLQotICAgICAgICB4LT5wYXJ0aXRpb25faW5mby0+Ym1pW2ldLm1vZGUgPSB4LT5lX21iZC5ibG9ja1tqXS5ibWkubW9kZTsKLSAgICAgICAgeC0+cGFydGl0aW9uX2luZm8tPmJtaVtpXS5tdi5hc19tdiA9IHgtPmVfbWJkLmJsb2NrW2pdLmJtaS5tdi5hc19tdjsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnNpLnNlZ21lbnRfcmQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgc3dhcChpbnQgKngsaW50ICp5KQotewotICAgaW50IHRtcDsKLQotICAgdG1wID0gKng7Ci0gICAqeCA9ICp5OwotICAgKnkgPSB0bXA7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1aWNrc29ydG12KGludCBhcnJbXSxpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotICAgaW50IGxpZHgscmlkeCxwaXZvdDsKLQotICAgbGlkeCA9IGxlZnQ7Ci0gICByaWR4ID0gcmlnaHQ7Ci0KLSAgIGlmKCBsZWZ0IDwgcmlnaHQpCi0gICB7Ci0gICAgICBwaXZvdCA9IChsZWZ0ICsgcmlnaHQpLzI7Ci0KLSAgICAgIHdoaWxlKGxpZHggPD1waXZvdCAmJiByaWR4ID49cGl2b3QpCi0gICAgICB7Ci0gICAgICAgICAgd2hpbGUoYXJyW2xpZHhdIDwgYXJyW3Bpdm90XSAmJiBsaWR4IDw9IHBpdm90KQotICAgICAgICAgICAgICBsaWR4Kys7Ci0gICAgICAgICAgd2hpbGUoYXJyW3JpZHhdID4gYXJyW3Bpdm90XSAmJiByaWR4ID49IHBpdm90KQotICAgICAgICAgICAgICByaWR4LS07Ci0gICAgICAgICAgc3dhcCgmYXJyW2xpZHhdLCAmYXJyW3JpZHhdKTsKLSAgICAgICAgICBsaWR4Kys7Ci0gICAgICAgICAgcmlkeC0tOwotICAgICAgICAgIGlmKGxpZHgtMSA9PSBwaXZvdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJpZHgrKzsKLSAgICAgICAgICAgICAgcGl2b3QgPSByaWR4OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmKHJpZHgrMSA9PSBwaXZvdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpZHgtLTsKLSAgICAgICAgICAgICAgcGl2b3QgPSBsaWR4OwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHF1aWNrc29ydG12KGFyciwgbGVmdCwgcGl2b3QgLSAxKTsKLSAgICAgIHF1aWNrc29ydG12KGFyciwgcGl2b3QgKyAxLCByaWdodCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHF1aWNrc29ydHNhZChpbnQgYXJyW10saW50IGlkeFtdLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotICAgaW50IGxpZHgscmlkeCxwaXZvdDsKLQotICAgbGlkeCA9IGxlZnQ7Ci0gICByaWR4ID0gcmlnaHQ7Ci0KLSAgIGlmKCBsZWZ0IDwgcmlnaHQpCi0gICB7Ci0gICAgICBwaXZvdCA9IChsZWZ0ICsgcmlnaHQpLzI7Ci0KLSAgICAgIHdoaWxlKGxpZHggPD1waXZvdCAmJiByaWR4ID49cGl2b3QpCi0gICAgICB7Ci0gICAgICAgICAgd2hpbGUoYXJyW2xpZHhdIDwgYXJyW3Bpdm90XSAmJiBsaWR4IDw9IHBpdm90KQotICAgICAgICAgICAgICBsaWR4Kys7Ci0gICAgICAgICAgd2hpbGUoYXJyW3JpZHhdID4gYXJyW3Bpdm90XSAmJiByaWR4ID49IHBpdm90KQotICAgICAgICAgICAgICByaWR4LS07Ci0gICAgICAgICAgc3dhcCgmYXJyW2xpZHhdLCAmYXJyW3JpZHhdKTsKLSAgICAgICAgICBzd2FwKCZpZHhbbGlkeF0sICZpZHhbcmlkeF0pOwotICAgICAgICAgIGxpZHgrKzsKLSAgICAgICAgICByaWR4LS07Ci0gICAgICAgICAgaWYobGlkeC0xID09IHBpdm90KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmlkeCsrOwotICAgICAgICAgICAgICBwaXZvdCA9IHJpZHg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYocmlkeCsxID09IHBpdm90KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGlkeC0tOwotICAgICAgICAgICAgICBwaXZvdCA9IGxpZHg7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgcXVpY2tzb3J0c2FkKGFyciwgaWR4LCBsZWZ0LCBwaXZvdCAtIDEpOwotICAgICAgcXVpY2tzb3J0c2FkKGFyciwgaWR4LCBwaXZvdCArIDEsIHJpZ2h0KTsKLSAgIH0KLX0KLQotLy9UaGUgaW1wcm92ZWQgTVYgcHJlZGljdGlvbgotdm9pZCB2cDhfbXZfcHJlZAotKAotICAgIFZQOF9DT01QICpjcGksCi0gICAgTUFDUk9CTE9DS0QgKnhkLAotICAgIGNvbnN0IE1PREVfSU5GTyAqaGVyZSwKLSAgICBNViAqbXZwLAotICAgIGludCByZWZmcmFtZSwKLSAgICBpbnQgKnJlZl9mcmFtZV9zaWduX2JpYXMsCi0gICAgaW50ICpzciwKLSAgICBpbnQgbmVhcl9zYWRpZHhbXQotKQotewotICAgIGNvbnN0IE1PREVfSU5GTyAqYWJvdmUgPSBoZXJlIC0geGQtPm1vZGVfaW5mb19zdHJpZGU7Ci0gICAgY29uc3QgTU9ERV9JTkZPICpsZWZ0ID0gaGVyZSAtIDE7Ci0gICAgY29uc3QgTU9ERV9JTkZPICphYm92ZWxlZnQgPSBhYm92ZSAtIDE7Ci0gICAgaW50X212ICAgICAgICAgICBuZWFyX212c1s4XTsKLSAgICBpbnQgICAgICAgICAgICAgIG5lYXJfcmVmWzhdOwotICAgIGludF9tdiAgICAgICAgICAgbXY7Ci0gICAgaW50ICAgICAgICAgICAgICB2Y250PTA7Ci0gICAgaW50ICAgICAgICAgICAgICBmaW5kPTA7Ci0gICAgaW50ICAgICAgICAgICAgICBtYl9vZmZzZXQ7Ci0KLSAgICBpbnQgICAgICAgICAgICAgIG12eFs4XTsKLSAgICBpbnQgICAgICAgICAgICAgIG12eVs4XTsKLSAgICBpbnQgICAgICAgICAgICAgIGk7Ci0KLSAgICBtdi5hc19pbnQgPSAwOwotCi0gICAgaWYoaGVyZS0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCi0gICAgewotICAgICAgICBuZWFyX212c1swXS5hc19pbnQgPSBuZWFyX212c1sxXS5hc19pbnQgPSBuZWFyX212c1syXS5hc19pbnQgPSBuZWFyX212c1szXS5hc19pbnQgPSBuZWFyX212c1s0XS5hc19pbnQgPSBuZWFyX212c1s1XS5hc19pbnQgPSBuZWFyX212c1s2XS5hc19pbnQgPSBuZWFyX212c1s3XS5hc19pbnQgPSAwOwotICAgICAgICBuZWFyX3JlZlswXSA9IG5lYXJfcmVmWzFdID0gbmVhcl9yZWZbMl0gPSBuZWFyX3JlZlszXSA9IG5lYXJfcmVmWzRdID0gbmVhcl9yZWZbNV0gPSBuZWFyX3JlZls2XSA9IG5lYXJfcmVmWzddID0gMDsKLQotICAgICAgICAvLyByZWFkIGluIDMgbmVhcmJ5IGJsb2NrJ3MgTVZzIGZyb20gY3VycmVudCBmcmFtZSBhcyBwcmVkaWN0aW9uIGNhbmRpZGF0ZXMuCi0gICAgICAgIGlmIChhYm92ZS0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5lYXJfbXZzW3ZjbnRdLmFzX2ludCA9IGFib3ZlLT5tYm1pLm12LmFzX2ludDsKLSAgICAgICAgICAgIG12X2JpYXMocmVmX2ZyYW1lX3NpZ25fYmlhc1thYm92ZS0+bWJtaS5yZWZfZnJhbWVdLCByZWZmcmFtZSwgJm5lYXJfbXZzW3ZjbnRdLCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKLSAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGFib3ZlLT5tYm1pLnJlZl9mcmFtZTsKLSAgICAgICAgfQotICAgICAgICB2Y250Kys7Ci0gICAgICAgIGlmIChsZWZ0LT5tYm1pLnJlZl9mcmFtZSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgewotICAgICAgICAgICAgbmVhcl9tdnNbdmNudF0uYXNfaW50ID0gbGVmdC0+bWJtaS5tdi5hc19pbnQ7Ci0gICAgICAgICAgICBtdl9iaWFzKHJlZl9mcmFtZV9zaWduX2JpYXNbbGVmdC0+bWJtaS5yZWZfZnJhbWVdLCByZWZmcmFtZSwgJm5lYXJfbXZzW3ZjbnRdLCByZWZfZnJhbWVfc2lnbl9iaWFzKTsKLSAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGxlZnQtPm1ibWkucmVmX2ZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHZjbnQrKzsKLSAgICAgICAgaWYgKGFib3ZlbGVmdC0+bWJtaS5yZWZfZnJhbWUgIT0gSU5UUkFfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5lYXJfbXZzW3ZjbnRdLmFzX2ludCA9IGFib3ZlbGVmdC0+bWJtaS5tdi5hc19pbnQ7Ci0gICAgICAgICAgICBtdl9iaWFzKHJlZl9mcmFtZV9zaWduX2JpYXNbYWJvdmVsZWZ0LT5tYm1pLnJlZl9mcmFtZV0sIHJlZmZyYW1lLCAmbmVhcl9tdnNbdmNudF0sIHJlZl9mcmFtZV9zaWduX2JpYXMpOwotICAgICAgICAgICAgbmVhcl9yZWZbdmNudF0gPSAgYWJvdmVsZWZ0LT5tYm1pLnJlZl9mcmFtZTsKLSAgICAgICAgfQotICAgICAgICB2Y250Kys7Ci0KLSAgICAgICAgLy8gcmVhZCBpbiA1IG5lYXJieSBibG9jaydzIE1WcyBmcm9tIGxhc3QgZnJhbWUuCi0gICAgICAgIGlmKGNwaS0+Y29tbW9uLmxhc3RfZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1iX29mZnNldCA9ICgteGQtPm1iX3RvX3RvcF9lZGdlLzEyOCArIDEpICogKHhkLT5tb2RlX2luZm9fc3RyaWRlICsxKSArICgteGQtPm1iX3RvX2xlZnRfZWRnZS8xMjggKzEpIDsKLQotICAgICAgICAgICAgLy8gY3VycmVudCBpbiBsYXN0IGZyYW1lCi0gICAgICAgICAgICBpZiAoY3BpLT5sZl9yZWZfZnJhbWVbbWJfb2Zmc2V0XSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZWFyX212c1t2Y250XS5hc19pbnQgPSBjcGktPmxmbXZbbWJfb2Zmc2V0XS5hc19pbnQ7Ci0gICAgICAgICAgICAgICAgbXZfYmlhcyhjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXNbbWJfb2Zmc2V0XSwgcmVmZnJhbWUsICZuZWFyX212c1t2Y250XSwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0gICAgICAgICAgICAgICAgbmVhcl9yZWZbdmNudF0gPSAgY3BpLT5sZl9yZWZfZnJhbWVbbWJfb2Zmc2V0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZjbnQrKzsKLQotICAgICAgICAgICAgLy8gYWJvdmUgaW4gbGFzdCBmcmFtZQotICAgICAgICAgICAgaWYgKGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCAtIHhkLT5tb2RlX2luZm9fc3RyaWRlLTFdICE9IElOVFJBX0ZSQU1FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5lYXJfbXZzW3ZjbnRdLmFzX2ludCA9IGNwaS0+bGZtdlttYl9vZmZzZXQgLSB4ZC0+bW9kZV9pbmZvX3N0cmlkZS0xXS5hc19pbnQ7Ci0gICAgICAgICAgICAgICAgbXZfYmlhcyhjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXNbbWJfb2Zmc2V0IC0geGQtPm1vZGVfaW5mb19zdHJpZGUtMV0sIHJlZmZyYW1lLCAmbmVhcl9tdnNbdmNudF0sIHJlZl9mcmFtZV9zaWduX2JpYXMpOwotICAgICAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCAtIHhkLT5tb2RlX2luZm9fc3RyaWRlLTFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmNudCsrOwotCi0gICAgICAgICAgICAvLyBsZWZ0IGluIGxhc3QgZnJhbWUKLSAgICAgICAgICAgIGlmIChjcGktPmxmX3JlZl9mcmFtZVttYl9vZmZzZXQtMV0gIT0gSU5UUkFfRlJBTUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmVhcl9tdnNbdmNudF0uYXNfaW50ID0gY3BpLT5sZm12W21iX29mZnNldCAtMV0uYXNfaW50OwotICAgICAgICAgICAgICAgIG12X2JpYXMoY3BpLT5sZl9yZWZfZnJhbWVfc2lnbl9iaWFzW21iX29mZnNldCAtMV0sIHJlZmZyYW1lLCAmbmVhcl9tdnNbdmNudF0sIHJlZl9mcmFtZV9zaWduX2JpYXMpOwotICAgICAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCAtIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmNudCsrOwotCi0gICAgICAgICAgICAvLyByaWdodCBpbiBsYXN0IGZyYW1lCi0gICAgICAgICAgICBpZiAoY3BpLT5sZl9yZWZfZnJhbWVbbWJfb2Zmc2V0ICsxXSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZWFyX212c1t2Y250XS5hc19pbnQgPSBjcGktPmxmbXZbbWJfb2Zmc2V0ICsxXS5hc19pbnQ7Ci0gICAgICAgICAgICAgICAgbXZfYmlhcyhjcGktPmxmX3JlZl9mcmFtZV9zaWduX2JpYXNbbWJfb2Zmc2V0ICsxXSwgcmVmZnJhbWUsICZuZWFyX212c1t2Y250XSwgcmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0gICAgICAgICAgICAgICAgbmVhcl9yZWZbdmNudF0gPSAgY3BpLT5sZl9yZWZfZnJhbWVbbWJfb2Zmc2V0ICsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZjbnQrKzsKLQotICAgICAgICAgICAgLy8gYmVsb3cgaW4gbGFzdCBmcmFtZQotICAgICAgICAgICAgaWYgKGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCArIHhkLT5tb2RlX2luZm9fc3RyaWRlICsxXSAhPSBJTlRSQV9GUkFNRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZWFyX212c1t2Y250XS5hc19pbnQgPSBjcGktPmxmbXZbbWJfb2Zmc2V0ICsgeGQtPm1vZGVfaW5mb19zdHJpZGUgKzFdLmFzX2ludDsKLSAgICAgICAgICAgICAgICBtdl9iaWFzKGNwaS0+bGZfcmVmX2ZyYW1lX3NpZ25fYmlhc1ttYl9vZmZzZXQgKyB4ZC0+bW9kZV9pbmZvX3N0cmlkZSArMV0sIHJlZmZyYW1lLCAmbmVhcl9tdnNbdmNudF0sIHJlZl9mcmFtZV9zaWduX2JpYXMpOwotICAgICAgICAgICAgICAgIG5lYXJfcmVmW3ZjbnRdID0gIGNwaS0+bGZfcmVmX2ZyYW1lW21iX29mZnNldCArIHhkLT5tb2RlX2luZm9fc3RyaWRlICsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZjbnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihpPTA7IGk8IHZjbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYobmVhcl9yZWZbbmVhcl9zYWRpZHhbaV1dICE9IElOVFJBX0ZSQU1FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGhlcmUtPm1ibWkucmVmX2ZyYW1lID09IG5lYXJfcmVmW25lYXJfc2FkaWR4W2ldXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG12LmFzX2ludCA9IG5lYXJfbXZzW25lYXJfc2FkaWR4W2ldXS5hc19pbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmQgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAqc3IgPSAzOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAqc3IgPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZighZmluZCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTx2Y250OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXZ4W2ldID0gbmVhcl9tdnNbaV0uYXNfbXYucm93OwotICAgICAgICAgICAgICAgIG12eVtpXSA9IG5lYXJfbXZzW2ldLmFzX212LmNvbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcXVpY2tzb3J0bXYgKG12eCwgMCwgdmNudC0xKTsKLSAgICAgICAgICAgIHF1aWNrc29ydG12IChtdnksIDAsIHZjbnQtMSk7Ci0gICAgICAgICAgICBtdi5hc19tdi5yb3cgPSBtdnhbdmNudC8yXTsKLSAgICAgICAgICAgIG12LmFzX212LmNvbCA9IG12eVt2Y250LzJdOwotCi0gICAgICAgICAgICBmaW5kID0gMTsKLSAgICAgICAgICAgIC8vc3IgaXMgc2V0IHRvIDAgdG8gYWxsb3cgY2FsbGluZyBmdW5jdGlvbiB0byBkZWNpZGUgdGhlIHNlYXJjaCByYW5nZS4KLSAgICAgICAgICAgICpzciA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgdXAgcmV0dXJuIHZhbHVlcyAqLwotICAgICptdnAgPSBtdi5hc19tdjsKLSAgICB2cDhfY2xhbXBfbXYobXZwLCB4ZCk7Ci19Ci0KLXZvaWQgdnA4X2NhbF9zYWQoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DS0QgKnhkLCBNQUNST0JMT0NLICp4LCBpbnQgcmVjb25feW9mZnNldCwgaW50IG5lYXJfc2FkaWR4W10pCi17Ci0KLSAgICBpbnQgbmVhcl9zYWRbOF0gPSB7MH07IC8vIDAtY2YgYWJvdmUsIDEtY2YgbGVmdCwgMi1jZiBhYm92ZWxlZnQsIDMtbGYgY3VycmVudCwgNC1sZiBhYm92ZSwgNS1sZiBsZWZ0LCA2LWxmIHJpZ2h0LCA3LWxmIGJlbG93Ci0KLSAgICAvL2NhbGN1bGF0ZSBzYWQgZm9yIGN1cnJlbnQgZnJhbWUgMyBuZWFyYnkgTUJzLgotICAgIGlmKCB4ZC0+bWJfdG9fdG9wX2VkZ2U9PTAgJiYgeGQtPm1iX3RvX2xlZnRfZWRnZSA9PTApCi0gICAgewotICAgICAgICBuZWFyX3NhZFswXSA9IG5lYXJfc2FkWzFdID0gbmVhcl9zYWRbMl0gPSBJTlRfTUFYOwotICAgIH1lbHNlIGlmKHhkLT5tYl90b190b3BfZWRnZT09MCkKLSAgICB7ICAgLy9vbmx5IGhhcyBsZWZ0IE1CIGZvciBzYWQgY2FsY3VsYXRpb24uCi0gICAgICAgIG5lYXJfc2FkWzBdID0gbmVhcl9zYWRbMl0gPSBJTlRfTUFYOwotICAgICAgICBuZWFyX3NhZFsxXSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSAxNix4ZC0+ZHN0Lnlfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICB9ZWxzZSBpZih4ZC0+bWJfdG9fbGVmdF9lZGdlID09MCkKLSAgICB7ICAgLy9vbmx5IGhhcyBsZWZ0IE1CIGZvciBzYWQgY2FsY3VsYXRpb24uCi0gICAgICAgIG5lYXJfc2FkWzFdID0gbmVhcl9zYWRbMl0gPSBJTlRfTUFYOwotICAgICAgICBuZWFyX3NhZFswXSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICoxNix4ZC0+ZHN0Lnlfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICB9ZWxzZQotICAgIHsKLSAgICAgICAgbmVhcl9zYWRbMF0gPSBjcGktPmZuX3B0cltCTE9DS18xNlgxNl0uc2RmKHgtPnNyYy55X2J1ZmZlciwgeC0+c3JjLnlfc3RyaWRlLCB4ZC0+ZHN0LnlfYnVmZmVyIC0geGQtPmRzdC55X3N0cmlkZSAqMTYseGQtPmRzdC55X3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgICAgIG5lYXJfc2FkWzFdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZih4LT5zcmMueV9idWZmZXIsIHgtPnNyYy55X3N0cmlkZSwgeGQtPmRzdC55X2J1ZmZlciAtIDE2LHhkLT5kc3QueV9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgICAgICBuZWFyX3NhZFsyXSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHhkLT5kc3QueV9idWZmZXIgLSB4ZC0+ZHN0Lnlfc3RyaWRlICoxNiAtMTYseGQtPmRzdC55X3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgfQotCi0gICAgaWYoY3BpLT5jb21tb24ubGFzdF9mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIC8vY2FsY3VsYXRlIHNhZCBmb3IgbGFzdCBmcmFtZSA1IG5lYXJieSBNQnMuCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnByZV95X2J1ZmZlciA9IGNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24ubHN0X2ZiX2lkeF0ueV9idWZmZXIgKyByZWNvbl95b2Zmc2V0OwotICAgICAgICBpbnQgcHJlX3lfc3RyaWRlID0gY3BpLT5jb21tb24ueXYxMl9mYltjcGktPmNvbW1vbi5sc3RfZmJfaWR4XS55X3N0cmlkZTsKLQotICAgICAgICBpZih4ZC0+bWJfdG9fdG9wX2VkZ2U9PTApIG5lYXJfc2FkWzRdID0gSU5UX01BWDsKLSAgICAgICAgaWYoeGQtPm1iX3RvX2xlZnRfZWRnZSA9PTApIG5lYXJfc2FkWzVdID0gSU5UX01BWDsKLSAgICAgICAgaWYoeGQtPm1iX3RvX3JpZ2h0X2VkZ2UgPT0wKSBuZWFyX3NhZFs2XSA9IElOVF9NQVg7Ci0gICAgICAgIGlmKHhkLT5tYl90b19ib3R0b21fZWRnZT09MCkgbmVhcl9zYWRbN10gPSBJTlRfTUFYOwotCi0gICAgICAgIGlmKG5lYXJfc2FkWzRdICE9IElOVF9NQVgpCi0gICAgICAgICAgICBuZWFyX3NhZFs0XSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHByZV95X2J1ZmZlciAtIHByZV95X3N0cmlkZSAqMTYsIHByZV95X3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgICAgIGlmKG5lYXJfc2FkWzVdICE9IElOVF9NQVgpCi0gICAgICAgICAgICBuZWFyX3NhZFs1XSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHByZV95X2J1ZmZlciAtIDE2LCBwcmVfeV9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgICAgICBuZWFyX3NhZFszXSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHByZV95X2J1ZmZlciwgcHJlX3lfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICAgICAgaWYobmVhcl9zYWRbNl0gIT0gSU5UX01BWCkKLSAgICAgICAgICAgIG5lYXJfc2FkWzZdID0gY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLnNkZih4LT5zcmMueV9idWZmZXIsIHgtPnNyYy55X3N0cmlkZSwgcHJlX3lfYnVmZmVyICsgMTYsIHByZV95X3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgICAgIGlmKG5lYXJfc2FkWzddICE9IElOVF9NQVgpCi0gICAgICAgICAgICBuZWFyX3NhZFs3XSA9IGNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XS5zZGYoeC0+c3JjLnlfYnVmZmVyLCB4LT5zcmMueV9zdHJpZGUsIHByZV95X2J1ZmZlciArIHByZV95X3N0cmlkZSAqMTYsIHByZV95X3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgfQotCi0gICAgaWYoY3BpLT5jb21tb24ubGFzdF9mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKLSAgICB7Ci0gICAgICAgIHF1aWNrc29ydHNhZChuZWFyX3NhZCwgbmVhcl9zYWRpZHgsIDAsIDcpOwotICAgIH1lbHNlCi0gICAgewotICAgICAgICBxdWlja3NvcnRzYWQobmVhcl9zYWQsIG5lYXJfc2FkaWR4LCAwLCAyKTsKLSAgICB9Ci19Ci0KLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotaW50IHZwOF9yZF9waWNrX2ludGVyX21vZGUoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50IHJlY29uX3lvZmZzZXQsIGludCByZWNvbl91dm9mZnNldCwgaW50ICpyZXR1cm5yYXRlLCBpbnQgKnJldHVybmRpc3RvcnRpb24sIGludCAqcmV0dXJuaW50cmEpCi17Ci0gICAgQkxPQ0sgKmIgPSAmeC0+YmxvY2tbMF07Ci0gICAgQkxPQ0tEICpkID0gJngtPmVfbWJkLmJsb2NrWzBdOwotICAgIE1BQ1JPQkxPQ0tEICp4ZCA9ICZ4LT5lX21iZDsKLSAgICBCX01PREVfSU5GTyBiZXN0X2Jtb2Rlc1sxNl07Ci0gICAgTUJfTU9ERV9JTkZPIGJlc3RfbWJtb2RlOwotICAgIFBBUlRJVElPTl9JTkZPIGJlc3RfcGFydGl0aW9uOwotICAgIE1WIGJlc3RfcmVmX212OwotICAgIE1WIG1vZGVfbXZbTUJfTU9ERV9DT1VOVF07Ci0gICAgTUJfUFJFRElDVElPTl9NT0RFIHRoaXNfbW9kZTsKLSAgICBpbnQgbnVtMDA7Ci0gICAgaW50IGJlc3RfbW9kZV9pbmRleCA9IDA7Ci0KLSAgICBpbnQgaTsKLSAgICBpbnQgbW9kZV9pbmRleDsKLSAgICBpbnQgbWRjb3VudHNbNF07Ci0gICAgaW50IHJhdGU7Ci0gICAgaW50IGRpc3RvcnRpb247Ci0gICAgaW50IGJlc3RfcmQgPSBJTlRfTUFYOyAvLyAxIDw8IDMwOwotICAgIGludCByZWZfZnJhbWVfY29zdFtNQVhfUkVGX0ZSQU1FU107Ci0gICAgaW50IHJhdGUyLCBkaXN0b3J0aW9uMjsKLSAgICBpbnQgdXZfaW50cmFfcmF0ZSwgdXZfaW50cmFfZGlzdG9ydGlvbiwgdXZfaW50cmFfcmF0ZV90b2tlbm9ubHk7Ci0gICAgaW50IHJhdGVfeSwgVU5JTklUSUFMSVpFRF9JU19TQUZFKHJhdGVfdXYpOwotICAgIGludCBkaXN0b3J0aW9uX3V2OwotICAgIGludCBiZXN0X3lyZCA9IElOVF9NQVg7Ci0KLSAgICAvL2ludCBhbGxfcmRzW01BWF9NT0RFU107ICAgICAgICAvLyBFeHBlcmltZW50YWwgZGVidWcgY29kZS4KLSAgICAvL2ludCBhbGxfcmF0ZXNbTUFYX01PREVTXTsKLSAgICAvL2ludCBhbGxfZGlzdFtNQVhfTU9ERVNdOwotICAgIC8vaW50IGludGVybW9kZWNvc3RbTUFYX01PREVTXTsKLQotICAgIE1CX1BSRURJQ1RJT05fTU9ERSB1dl9pbnRyYV9tb2RlOwotCi0gICAgaW50IGZvcmNlX25vX3NraXAgPSAwOwotCi0gICAgTVYgbXZwOwotICAgIGludCBuZWFyX3NhZGlkeFs4XSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKLSAgICBpbnQgc2FkZG9uZT0wOwotICAgIGludCBzcj0wOyAgICAvL3NlYXJjaCByYW5nZSBnb3QgZnJvbSBtdl9wcmVkKCkuIEl0IHVzZXMgc3RlcF9wYXJhbSBsZXZlbHMuICgwLTcpCi0KLSAgICBNViBmcmFtZV9uZWFyZXN0X212WzRdOwotICAgIE1WIGZyYW1lX25lYXJfbXZbNF07Ci0gICAgTVYgZnJhbWVfYmVzdF9yZWZfbXZbNF07Ci0gICAgaW50IGZyYW1lX21kY291bnRzWzRdWzRdOwotICAgIGludCBmcmFtZV9sZl9vcl9nZls0XTsKLSAgICB1bnNpZ25lZCBjaGFyICp5X2J1ZmZlcls0XTsKLSAgICB1bnNpZ25lZCBjaGFyICp1X2J1ZmZlcls0XTsKLSAgICB1bnNpZ25lZCBjaGFyICp2X2J1ZmZlcls0XTsKLQotICAgIHZweF9tZW1zZXQoJmJlc3RfbWJtb2RlLCAwLCBzaXplb2YoYmVzdF9tYm1vZGUpKTsKLQotICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9MQVNUX0ZMQUcpCi0gICAgewotICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmxzdF95djEyID0gJmNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24ubHN0X2ZiX2lkeF07Ci0KLSAgICAgICAgdnA4X2ZpbmRfbmVhcl9tdnMoJngtPmVfbWJkLCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwgJmZyYW1lX25lYXJlc3RfbXZbTEFTVF9GUkFNRV0sICZmcmFtZV9uZWFyX212W0xBU1RfRlJBTUVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVfYmVzdF9yZWZfbXZbTEFTVF9GUkFNRV0sIGZyYW1lX21kY291bnRzW0xBU1RfRlJBTUVdLCBMQVNUX0ZSQU1FLCBjcGktPmNvbW1vbi5yZWZfZnJhbWVfc2lnbl9iaWFzKTsKLQotICAgICAgICB5X2J1ZmZlcltMQVNUX0ZSQU1FXSA9IGxzdF95djEyLT55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgIHVfYnVmZmVyW0xBU1RfRlJBTUVdID0gbHN0X3l2MTItPnVfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0gICAgICAgIHZfYnVmZmVyW0xBU1RfRlJBTUVdID0gbHN0X3l2MTItPnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0KLSAgICAgICAgZnJhbWVfbGZfb3JfZ2ZbTEFTVF9GUkFNRV0gPSAwOwotICAgIH0KLQotICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9HT0xEX0ZMQUcpCi0gICAgewotICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmdsZF95djEyID0gJmNwaS0+Y29tbW9uLnl2MTJfZmJbY3BpLT5jb21tb24uZ2xkX2ZiX2lkeF07Ci0KLSAgICAgICAgdnA4X2ZpbmRfbmVhcl9tdnMoJngtPmVfbWJkLCB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dCwgJmZyYW1lX25lYXJlc3RfbXZbR09MREVOX0ZSQU1FXSwgJmZyYW1lX25lYXJfbXZbR09MREVOX0ZSQU1FXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lX2Jlc3RfcmVmX212W0dPTERFTl9GUkFNRV0sIGZyYW1lX21kY291bnRzW0dPTERFTl9GUkFNRV0sIEdPTERFTl9GUkFNRSwgY3BpLT5jb21tb24ucmVmX2ZyYW1lX3NpZ25fYmlhcyk7Ci0KLSAgICAgICAgeV9idWZmZXJbR09MREVOX0ZSQU1FXSA9IGdsZF95djEyLT55X2J1ZmZlciArIHJlY29uX3lvZmZzZXQ7Ci0gICAgICAgIHVfYnVmZmVyW0dPTERFTl9GUkFNRV0gPSBnbGRfeXYxMi0+dV9idWZmZXIgKyByZWNvbl91dm9mZnNldDsKLSAgICAgICAgdl9idWZmZXJbR09MREVOX0ZSQU1FXSA9IGdsZF95djEyLT52X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotCi0gICAgICAgIGZyYW1lX2xmX29yX2dmW0dPTERFTl9GUkFNRV0gPSAxOwotICAgIH0KLQotICAgIGlmIChjcGktPnJlZl9mcmFtZV9mbGFncyAmIFZQOF9BTFRfRkxBRykKLSAgICB7Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqYWx0X3l2MTIgPSAmY3BpLT5jb21tb24ueXYxMl9mYltjcGktPmNvbW1vbi5hbHRfZmJfaWR4XTsKLQotICAgICAgICB2cDhfZmluZF9uZWFyX212cygmeC0+ZV9tYmQsIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LCAmZnJhbWVfbmVhcmVzdF9tdltBTFRSRUZfRlJBTUVdLCAmZnJhbWVfbmVhcl9tdltBTFRSRUZfRlJBTUVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVfYmVzdF9yZWZfbXZbQUxUUkVGX0ZSQU1FXSwgZnJhbWVfbWRjb3VudHNbQUxUUkVGX0ZSQU1FXSwgQUxUUkVGX0ZSQU1FLCBjcGktPmNvbW1vbi5yZWZfZnJhbWVfc2lnbl9iaWFzKTsKLQotICAgICAgICB5X2J1ZmZlcltBTFRSRUZfRlJBTUVdID0gYWx0X3l2MTItPnlfYnVmZmVyICsgcmVjb25feW9mZnNldDsKLSAgICAgICAgdV9idWZmZXJbQUxUUkVGX0ZSQU1FXSA9IGFsdF95djEyLT51X2J1ZmZlciArIHJlY29uX3V2b2Zmc2V0OwotICAgICAgICB2X2J1ZmZlcltBTFRSRUZfRlJBTUVdID0gYWx0X3l2MTItPnZfYnVmZmVyICsgcmVjb25fdXZvZmZzZXQ7Ci0KLSAgICAgICAgZnJhbWVfbGZfb3JfZ2ZbQUxUUkVGX0ZSQU1FXSA9IDE7Ci0gICAgfQotCi0gICAgKnJldHVybmludHJhID0gSU5UX01BWDsKLSAgICBjcGktPm1ic190ZXN0ZWRfc29fZmFyKys7ICAgICAgICAgIC8vIENvdW50IG9mIHRoZSBudW1iZXIgb2YgTUJzIHRlc3RlZCBzbyBmYXIgdGhpcyBmcmFtZQotCi0gICAgeC0+c2tpcCA9IDA7Ci0KLSAgICByZWZfZnJhbWVfY29zdFtJTlRSQV9GUkFNRV0gICA9IHZwOF9jb3N0X3plcm8oY3BpLT5wcm9iX2ludHJhX2NvZGVkKTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSB0cmVhdG1lbnQgd2hlbiBHRiBhbmQgQVJGIGFyZSBub3Qgc2Vuc2libGUgb3B0aW9ucyBmb3IgcmVmZXJlbmNlCi0gICAgaWYgKGNwaS0+cmVmX2ZyYW1lX2ZsYWdzID09IFZQOF9MQVNUX0ZMQUcpCi0gICAgewotICAgICAgICByZWZfZnJhbWVfY29zdFtMQVNUX0ZSQU1FXSAgICA9IHZwOF9jb3N0X29uZShjcGktPnByb2JfaW50cmFfY29kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF96ZXJvKDI1NSk7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0dPTERFTl9GUkFNRV0gID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZSgyNTUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF96ZXJvKDEyOCk7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0FMVFJFRl9GUkFNRV0gID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZSgyNTUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2cDhfY29zdF9vbmUoMTI4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVmX2ZyYW1lX2Nvc3RbTEFTVF9GUkFNRV0gICAgPSB2cDhfY29zdF9vbmUoY3BpLT5wcm9iX2ludHJhX2NvZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3RfemVybyhjcGktPnByb2JfbGFzdF9jb2RlZCk7Ci0gICAgICAgIHJlZl9mcmFtZV9jb3N0W0dPTERFTl9GUkFNRV0gID0gdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9pbnRyYV9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X29uZShjcGktPnByb2JfbGFzdF9jb2RlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZwOF9jb3N0X3plcm8oY3BpLT5wcm9iX2dmX2NvZGVkKTsKLSAgICAgICAgcmVmX2ZyYW1lX2Nvc3RbQUxUUkVGX0ZSQU1FXSAgPSB2cDhfY29zdF9vbmUoY3BpLT5wcm9iX2ludHJhX2NvZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9sYXN0X2NvZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdnA4X2Nvc3Rfb25lKGNwaS0+cHJvYl9nZl9jb2RlZCk7Ci0gICAgfQotCi0gICAgdnB4X21lbXNldChtb2RlX212LCAwLCBzaXplb2YobW9kZV9tdikpOwotCi0gICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID0gSU5UUkFfRlJBTUU7Ci0gICAgdnA4X3JkX3BpY2tfaW50cmFfbWJ1dl9tb2RlKGNwaSwgeCwgJnV2X2ludHJhX3JhdGUsICZ1dl9pbnRyYV9yYXRlX3Rva2Vub25seSwgJnV2X2ludHJhX2Rpc3RvcnRpb24pOwotICAgIHV2X2ludHJhX21vZGUgPSB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS51dl9tb2RlOwotCi0gICAgZm9yIChtb2RlX2luZGV4ID0gMDsgbW9kZV9pbmRleCA8IE1BWF9NT0RFUzsgbW9kZV9pbmRleCsrKQotICAgIHsKLSAgICAgICAgaW50IHRoaXNfcmQgPSBJTlRfTUFYOwotICAgICAgICBpbnQgbGZfb3JfZ2YgPSAwOyAgICAgICAgICAgLy8gTGF0IEZyYW1lICgwMSkgb3IgZ2YvYXJmICgxKQotICAgICAgICBpbnQgZGlzYWJsZV9za2lwID0gMDsKLSAgICAgICAgaW50IG90aGVyX2Nvc3QgPSAwOwotCi0gICAgICAgIGZvcmNlX25vX3NraXAgPSAwOwotCi0gICAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWJ1ZyBjb2RlLgotICAgICAgICAvLyBSZWNvcmQgb2YgcmQgdmFsdWVzIHJlY29yZGVkIGZvciB0aGlzIE1CLiAtMSBpbmRpY2F0ZXMgbm90IG1lYXN1cmVkCi0gICAgICAgIC8vYWxsX3Jkc1ttb2RlX2luZGV4XSA9IC0xOwotICAgICAgICAvL2FsbF9yYXRlc1ttb2RlX2luZGV4XSA9IC0xOwotICAgICAgICAvL2FsbF9kaXN0W21vZGVfaW5kZXhdID0gLTE7Ci0gICAgICAgIC8vaW50ZXJtb2RlY29zdFttb2RlX2luZGV4XSA9IC0xOwotCi0gICAgICAgIC8vIFRlc3QgYmVzdCByZCBzbyBmYXIgYWdhaW5zdCB0aHJlc2hvbGQgZm9yIHRyeWluZyB0aGlzIG1vZGUuCi0gICAgICAgIGlmIChiZXN0X3JkIDw9IGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgaG9sZCBhcmUgcm9sbGluZyB0b3RhbCBjb3N0IGFuZCBkaXN0b3J0aW9uIGZvciB0aGlzIG1vZGUKLSAgICAgICAgcmF0ZTIgPSAwOwotICAgICAgICBkaXN0b3J0aW9uMiA9IDA7Ci0KLSAgICAgICAgdGhpc19tb2RlID0gdnA4X21vZGVfb3JkZXJbbW9kZV9pbmRleF07Ci0KLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9IHRoaXNfbW9kZTsKLSAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkudXZfbW9kZSA9IERDX1BSRUQ7Ci0gICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZSA9IHZwOF9yZWZfZnJhbWVfb3JkZXJbbW9kZV9pbmRleF07Ci0KLSAgICAgICAgLy8gT25seSBjb25zaWRlciBaRVJPTVYvQUxUUkVGX0ZSQU1FIGZvciBhbHQgcmVmIGZyYW1lLAotICAgICAgICAvLyB1bmxlc3MgQVJOUiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBpbiB3aGljaCBjYXNlIHdlIHdhbnQKLSAgICAgICAgLy8gYW4gdW5maWx0ZXJlZCBhbHRlcm5hdGl2ZQotICAgICAgICBpZiAoY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiAmJiAoY3BpLT5veGNmLmFybnJfbWF4X2ZyYW1lcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXNfbW9kZSAhPSBaRVJPTVYgfHwgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lICE9IEFMVFJFRl9GUkFNRSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGV2ZXJ5dGhpbmcgYnV0IGludHJhICovCi0gICAgICAgIGlmICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHgtPmVfbWJkLnByZS55X2J1ZmZlciA9IHlfYnVmZmVyW3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07Ci0gICAgICAgICAgICB4LT5lX21iZC5wcmUudV9idWZmZXIgPSB1X2J1ZmZlclt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOwotICAgICAgICAgICAgeC0+ZV9tYmQucHJlLnZfYnVmZmVyID0gdl9idWZmZXJbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKLSAgICAgICAgICAgIG1vZGVfbXZbTkVBUkVTVE1WXSA9IGZyYW1lX25lYXJlc3RfbXZbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKLSAgICAgICAgICAgIG1vZGVfbXZbTkVBUk1WXSA9IGZyYW1lX25lYXJfbXZbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKLSAgICAgICAgICAgIGJlc3RfcmVmX212ID0gZnJhbWVfYmVzdF9yZWZfbXZbeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lXTsKLSAgICAgICAgICAgIHZweF9tZW1jcHkobWRjb3VudHMsIGZyYW1lX21kY291bnRzW3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV0sIHNpemVvZihtZGNvdW50cykpOwotICAgICAgICAgICAgbGZfb3JfZ2YgPSBmcmFtZV9sZl9vcl9nZlt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSA9PSBORVdNVikKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIXNhZGRvbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnA4X2NhbF9zYWQoY3BpLHhkLHgsIHJlY29uX3lvZmZzZXQgLCZuZWFyX3NhZGlkeFswXSApOwotICAgICAgICAgICAgICAgIHNhZGRvbmUgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2cDhfbXZfcHJlZChjcGksICZ4LT5lX21iZCwgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQsICZtdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUsIGNwaS0+Y29tbW9uLnJlZl9mcmFtZV9zaWduX2JpYXMsICZzciwgJm5lYXJfc2FkaWR4WzBdKTsKLQotICAgICAgICAgICAgLyogYWRqdXN0IG12cCB0byBtYWtlIHN1cmUgaXQgaXMgd2l0aGluIE1WIHJhbmdlICovCi0gICAgICAgICAgICBpZihtdnAucm93ID4gYmVzdF9yZWZfbXYucm93ICsgTUFYX0ZVTExfUEVMX1ZBTCkKLSAgICAgICAgICAgICAgICBtdnAucm93ID0gYmVzdF9yZWZfbXYucm93ICsgTUFYX0ZVTExfUEVMX1ZBTDsKLSAgICAgICAgICAgIGVsc2UgaWYobXZwLnJvdyA8IGJlc3RfcmVmX212LnJvdyAtIE1BWF9GVUxMX1BFTF9WQUwpCi0gICAgICAgICAgICAgICAgbXZwLnJvdyA9IGJlc3RfcmVmX212LnJvdyAtIE1BWF9GVUxMX1BFTF9WQUw7Ci0gICAgICAgICAgICBpZihtdnAuY29sID4gYmVzdF9yZWZfbXYuY29sICsgTUFYX0ZVTExfUEVMX1ZBTCkKLSAgICAgICAgICAgICAgICBtdnAuY29sID0gYmVzdF9yZWZfbXYuY29sICsgTUFYX0ZVTExfUEVMX1ZBTDsKLSAgICAgICAgICAgIGVsc2UgaWYobXZwLmNvbCA8IGJlc3RfcmVmX212LmNvbCAtIE1BWF9GVUxMX1BFTF9WQUwpCi0gICAgICAgICAgICAgICAgbXZwLmNvbCA9IGJlc3RfcmVmX212LmNvbCAtIE1BWF9GVUxMX1BFTF9WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRlc3RpbmcgZnJlcXVlbmN5IGZvciB0aGlzIG1vZGUgaXMgYXQgaXRzIG1heAotICAgICAgICAvLyBJZiBzbyB0aGVuIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0ZXN0ZWQgYW5kIGluY3JlYXNlIHRoZSB0aHJlc2hvbGQgZm9yIGl0cyB0ZXN0aW5nCi0gICAgICAgIGlmIChjcGktPm1vZGVfdGVzdF9oaXRfY291bnRzW21vZGVfaW5kZXhdICYmIChjcGktPm1vZGVfY2hlY2tfZnJlcVttb2RlX2luZGV4XSA+IDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3BpLT5tYnNfdGVzdGVkX3NvX2ZhciAgPD0gY3BpLT5tb2RlX2NoZWNrX2ZyZXFbbW9kZV9pbmRleF0gKiBjcGktPm1vZGVfdGVzdF9oaXRfY291bnRzW21vZGVfaW5kZXhdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHRoZSB0aHJlc2hvbGQgZm9yIGNvZGluZyB0aGlzIG1vZGUgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSB0byBiZSBjaG9zZW4KLSAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdICs9IDQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA+IE1BWF9USFJFU0hNVUxUKQotICAgICAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gTUFYX1RIUkVTSE1VTFQ7Ci0KLSAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW21vZGVfaW5kZXhdID0gKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW21vZGVfaW5kZXhdID4+IDcpICogY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XTsKLQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgaGF2ZSBub3cgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgd2UgYXJlIGdvaW5nIHRvIHRlc3QgdGhlIGN1cnJlbnQgbW9kZSBzbyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgaGFzIGJlZW4gdGVzdGVkCi0gICAgICAgIGNwaS0+bW9kZV90ZXN0X2hpdF9jb3VudHNbbW9kZV9pbmRleF0gKys7Ci0KLSAgICAgICAgLy8gRXhwZXJpbWVudGFsIGNvZGUuIFNwZWNpYWwgY2FzZSBmb3IgZ2YgYW5kIGFyZiB6ZXJvbXYgbW9kZXMuIEluY3JlYXNlIHpiaW4gc2l6ZSB0byBzdXByZXNzIG5vaXNlCi0gICAgICAgIGlmIChjcGktPnpiaW5fbW9kZV9ib29zdF9lbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHZwOF9yZWZfZnJhbWVfb3JkZXJbbW9kZV9pbmRleF0gPT0gSU5UUkFfRlJBTUUgKQotICAgICAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodnA4X21vZGVfb3JkZXJbbW9kZV9pbmRleF0gPT0gWkVST01WKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZwOF9yZWZfZnJhbWVfb3JkZXJbbW9kZV9pbmRleF0gIT0gTEFTVF9GUkFNRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gR0ZfWkVST01WX1pCSU5fQk9PU1Q7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gTEZfWkVST01WX1pCSU5fQk9PU1Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZwOF9tb2RlX29yZGVyW21vZGVfaW5kZXhdID09IFNQTElUTVYpCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNwaS0+emJpbl9tb2RlX2Jvb3N0ID0gTVZfWkJJTl9CT09TVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdnA4X3VwZGF0ZV96YmluX2V4dHJhKGNwaSwgeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHRoaXNfbW9kZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIEJfUFJFRDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRtcF9yZDsKLQotICAgICAgICAgICAgLy8gTm90ZSB0aGUgcmF0ZSB2YWx1ZSByZXR1cm5lZCBoZXJlIGluY2x1ZGVzIHRoZSBjb3N0IG9mIGNvZGluZyB0aGUgQlBSRUQgbW9kZSA6IHgtPm1ibW9kZV9jb3N0W3gtPmVfbWJkLmZyYW1lX3R5cGVdW0JQUkVEXTsKLSAgICAgICAgICAgIHRtcF9yZCA9IHZwOF9yZF9waWNrX2ludHJhNHg0bWJ5X21vZGVzKGNwaSwgeCwgJnJhdGUsICZyYXRlX3ksICZkaXN0b3J0aW9uLCBiZXN0X3lyZCk7Ci0gICAgICAgICAgICByYXRlMiArPSByYXRlOwotICAgICAgICAgICAgZGlzdG9ydGlvbjIgKz0gZGlzdG9ydGlvbjsKLQotICAgICAgICAgICAgaWYodG1wX3JkIDwgYmVzdF95cmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmF0ZTIgKz0gdXZfaW50cmFfcmF0ZTsKLSAgICAgICAgICAgICAgICByYXRlX3V2ID0gdXZfaW50cmFfcmF0ZV90b2tlbm9ubHk7Ci0gICAgICAgICAgICAgICAgZGlzdG9ydGlvbjIgKz0gdXZfaW50cmFfZGlzdG9ydGlvbjsKLSAgICAgICAgICAgICAgICBkaXN0b3J0aW9uX3V2ID0gdXZfaW50cmFfZGlzdG9ydGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzX3JkID0gSU5UX01BWDsKLSAgICAgICAgICAgICAgICBkaXNhYmxlX3NraXAgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1BMSVRNVjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRtcF9yZDsKLSAgICAgICAgICAgIGludCB0aGlzX3JkX3RocmVzaDsKLQotICAgICAgICAgICAgdGhpc19yZF90aHJlc2ggPSAoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IExBU1RfRlJBTUUpID8gY3BpLT5yZF90aHJlc2hlc1tUSFJfTkVXTVZdIDogY3BpLT5yZF90aHJlc2hlc1tUSFJfTkVXQV07Ci0gICAgICAgICAgICB0aGlzX3JkX3RocmVzaCA9ICh4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPT0gR09MREVOX0ZSQU1FKSA/IGNwaS0+cmRfdGhyZXNoZXNbVEhSX05FV0ddOiB0aGlzX3JkX3RocmVzaDsKLQotICAgICAgICAgICAgdG1wX3JkID0gdnA4X3JkX3BpY2tfYmVzdF9tYnNlZ21lbnRhdGlvbihjcGksIHgsICZiZXN0X3JlZl9tdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF95cmQsIG1kY291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZSwgJnJhdGVfeSwgJmRpc3RvcnRpb24sIHRoaXNfcmRfdGhyZXNoKSA7Ci0KLSAgICAgICAgICAgIHJhdGUyICs9IHJhdGU7Ci0gICAgICAgICAgICBkaXN0b3J0aW9uMiArPSBkaXN0b3J0aW9uOwotCi0gICAgICAgICAgICAvLyBJZiBldmVuIHRoZSAnWScgcmQgdmFsdWUgb2Ygc3BsaXQgaXMgaGlnaGVyIHRoYW4gYmVzdCBzbyBmYXIgdGhlbiBkb250IGJvdGhlciBsb29raW5nIGF0IFVWCi0gICAgICAgICAgICBpZiAodG1wX3JkIDwgYmVzdF95cmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTm93IHdvcmsgb3V0IFVWIGNvc3QgYW5kIGFkZCBpdCBpbgotICAgICAgICAgICAgICAgIHZwOF9yZF9pbnRlcl91dihjcGksIHgsICZyYXRlX3V2LCAmZGlzdG9ydGlvbl91diwgY3BpLT5jb21tb24uZnVsbF9waXhlbCk7Ci0gICAgICAgICAgICAgICAgcmF0ZTIgKz0gcmF0ZV91djsKLSAgICAgICAgICAgICAgICBkaXN0b3J0aW9uMiArPSBkaXN0b3J0aW9uX3V2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXNfcmQgPSBJTlRfTUFYOwotICAgICAgICAgICAgICAgIGRpc2FibGVfc2tpcCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRENfUFJFRDoKLSAgICAgICAgY2FzZSBWX1BSRUQ6Ci0gICAgICAgIGNhc2UgSF9QUkVEOgotICAgICAgICBjYXNlIFRNX1BSRUQ6Ci0gICAgICAgICAgICB4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWUgPSBJTlRSQV9GUkFNRTsKLSAgICAgICAgICAgIFJFQ09OX0lOVk9LRSgmY3BpLT5jb21tb24ucnRjZC5yZWNvbiwgYnVpbGRfaW50cmFfcHJlZGljdG9yc19tYnkpCi0gICAgICAgICAgICAgICAgKCZ4LT5lX21iZCk7Ci0gICAgICAgICAgICBtYWNyb19ibG9ja195cmQoeCwgJnJhdGVfeSwgJmRpc3RvcnRpb24sIElGX1JUQ0QoJmNwaS0+cnRjZC5lbmNvZGVtYikpIDsKLSAgICAgICAgICAgIHJhdGUyICs9IHJhdGVfeTsKLSAgICAgICAgICAgIGRpc3RvcnRpb24yICs9IGRpc3RvcnRpb247Ci0gICAgICAgICAgICByYXRlMiArPSB4LT5tYm1vZGVfY29zdFt4LT5lX21iZC5mcmFtZV90eXBlXVt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlXTsKLSAgICAgICAgICAgIHJhdGUyICs9IHV2X2ludHJhX3JhdGU7Ci0gICAgICAgICAgICByYXRlX3V2ID0gdXZfaW50cmFfcmF0ZV90b2tlbm9ubHk7Ci0gICAgICAgICAgICBkaXN0b3J0aW9uMiArPSB1dl9pbnRyYV9kaXN0b3J0aW9uOwotICAgICAgICAgICAgZGlzdG9ydGlvbl91diA9IHV2X2ludHJhX2Rpc3RvcnRpb247Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE5FV01WOgotCi0gICAgICAgICAgICAvLyBEZWNyZW1lbnQgZnVsbCBzZWFyY2ggY291bnRlcgotICAgICAgICAgICAgaWYgKGNwaS0+Y2hlY2tfZnJlcVtsZl9vcl9nZl0gPiAwKQotICAgICAgICAgICAgICAgIGNwaS0+Y2hlY2tfZnJlcVtsZl9vcl9nZl0gLS07Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgdGhpc3NtZTsKLSAgICAgICAgICAgICAgICBpbnQgYmVzdHNtZSA9IElOVF9NQVg7Ci0gICAgICAgICAgICAgICAgaW50IHN0ZXBfcGFyYW0gPSBjcGktPnNmLmZpcnN0X3N0ZXA7Ci0gICAgICAgICAgICAgICAgaW50IHNlYXJjaF9yYW5nZTsKLSAgICAgICAgICAgICAgICBpbnQgZnVydGhlcl9zdGVwczsKLSAgICAgICAgICAgICAgICBpbnQgbjsKLQotICAgICAgICAgICAgICAgIGludCBjb2xfbWluID0gKGJlc3RfcmVmX212LmNvbCAtIE1BWF9GVUxMX1BFTF9WQUwpID4+MzsKLSAgICAgICAgICAgICAgICBpbnQgY29sX21heCA9IChiZXN0X3JlZl9tdi5jb2wgKyBNQVhfRlVMTF9QRUxfVkFMKSA+PjM7Ci0gICAgICAgICAgICAgICAgaW50IHJvd19taW4gPSAoYmVzdF9yZWZfbXYucm93IC0gTUFYX0ZVTExfUEVMX1ZBTCkgPj4zOwotICAgICAgICAgICAgICAgIGludCByb3dfbWF4ID0gKGJlc3RfcmVmX212LnJvdyArIE1BWF9GVUxMX1BFTF9WQUwpID4+MzsKLQotICAgICAgICAgICAgICAgIGludCB0bXBfY29sX21pbiA9IHgtPm12X2NvbF9taW47Ci0gICAgICAgICAgICAgICAgaW50IHRtcF9jb2xfbWF4ID0geC0+bXZfY29sX21heDsKLSAgICAgICAgICAgICAgICBpbnQgdG1wX3Jvd19taW4gPSB4LT5tdl9yb3dfbWluOwotICAgICAgICAgICAgICAgIGludCB0bXBfcm93X21heCA9IHgtPm12X3Jvd19tYXg7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgaW50ZXJzZWN0aW9uIG9mIFVNViB3aW5kb3cgYW5kIHZhbGlkIE1WIHdpbmRvdyB0byByZWR1Y2UgIyBvZiBjaGVja3MgaW4gZGlhbW9uZCBzZWFyY2guCi0gICAgICAgICAgICAgICAgaWYgKHgtPm12X2NvbF9taW4gPCBjb2xfbWluICkKLSAgICAgICAgICAgICAgICAgICAgeC0+bXZfY29sX21pbiA9IGNvbF9taW47Ci0gICAgICAgICAgICAgICAgaWYgKHgtPm12X2NvbF9tYXggPiBjb2xfbWF4ICkKLSAgICAgICAgICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IGNvbF9tYXg7Ci0gICAgICAgICAgICAgICAgaWYgKHgtPm12X3Jvd19taW4gPCByb3dfbWluICkKLSAgICAgICAgICAgICAgICAgICAgeC0+bXZfcm93X21pbiA9IHJvd19taW47Ci0gICAgICAgICAgICAgICAgaWYgKHgtPm12X3Jvd19tYXggPiByb3dfbWF4ICkKLSAgICAgICAgICAgICAgICAgICAgeC0+bXZfcm93X21heCA9IHJvd19tYXg7Ci0KLSAgICAgICAgICAgICAgICAvL2FkanVzdCBzZWFyY2ggcmFuZ2UgYWNjb3JkaW5nIHRvIHNyIGZyb20gbXYgcHJlZGljdGlvbgotICAgICAgICAgICAgICAgIGlmKHNyID4gc3RlcF9wYXJhbSkKLSAgICAgICAgICAgICAgICAgICAgc3RlcF9wYXJhbSA9IHNyOwotCi0gICAgICAgICAgICAgICAgLy8gV29yayBvdXQgaG93IGxvbmcgYSBzZWFyY2ggd2Ugc2hvdWxkIGRvCi0gICAgICAgICAgICAgICAgc2VhcmNoX3JhbmdlID0gTUFYRihhYnMoYmVzdF9yZWZfbXYuY29sKSwgYWJzKGJlc3RfcmVmX212LnJvdykpID4+IDM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VhcmNoX3JhbmdlID49IHgtPnZlY3Rvcl9yYW5nZSkKLSAgICAgICAgICAgICAgICAgICAgeC0+dmVjdG9yX3JhbmdlID0gc2VhcmNoX3JhbmdlOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHgtPnZlY3Rvcl9yYW5nZSA+IGNwaS0+c2YubWluX2ZzX3JhZGl1cykKLSAgICAgICAgICAgICAgICAgICAgeC0+dmVjdG9yX3JhbmdlLS07Ci0KLSAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHN0ZXAvZGlhbW9uZCBzZWFyY2gKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYWRwYiA9IHgtPnNhZHBlcmJpdDE2OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPnNmLnNlYXJjaF9tZXRob2QgPT0gSEVYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdnA4X2hleF9zZWFyY2goeCwgYiwgZCwgJmJlc3RfcmVmX212LCAmZC0+Ym1pLm12LmFzX212LCBzdGVwX3BhcmFtLCBzYWRwYi8qeC0+ZXJyb3JwZXJiaXQqLywgJm51bTAwLCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLCB4LT5tdnNhZGNvc3QsIHgtPm12Y29zdCwgJmJlc3RfcmVmX212KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVXTVZdLnJvdyA9IGQtPmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5jb2wgPSBkLT5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IGNwaS0+ZGlhbW9uZF9zZWFyY2hfc2FkKHgsIGIsIGQsICZtdnAsICZkLT5ibWkubXYuYXNfbXYsIHN0ZXBfcGFyYW0sIHNhZHBiIC8gMi8qeC0+ZXJyb3JwZXJiaXQqLywgJm51bTAwLCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLCB4LT5tdnNhZGNvc3QsIHgtPm12Y29zdCwgJmJlc3RfcmVmX212KTsgLy9zYWRwYiA8IDkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVXTVZdLnJvdyA9IGQtPmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5jb2wgPSBkLT5ibWkubXYuYXNfbXYuY29sOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXJ0aGVyIHN0ZXAvZGlhbW9uZCBzZWFyY2hlcyBhcyBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZnVydGhlcl9zdGVwcyA9IChjcGktPnNmLm1heF9zdGVwX3NlYXJjaF9zdGVwcyAtIDEpIC0gc3RlcF9wYXJhbTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG51bTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtMDAgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobiA8IGZ1cnRoZXJfc3RlcHMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbisrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0wMC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNzbWUgPSBjcGktPmRpYW1vbmRfc2VhcmNoX3NhZCh4LCBiLCBkLCAmbXZwLCAmZC0+Ym1pLm12LmFzX212LCBzdGVwX3BhcmFtICsgbiwgc2FkcGIgLyA0Lyp4LT5lcnJvcnBlcmJpdCovLCAmbnVtMDAsICZjcGktPmZuX3B0cltCTE9DS18xNlgxNl0sIHgtPm12c2FkY29zdCwgeC0+bXZjb3N0LCAmYmVzdF9yZWZfbXYpOyAvL3NhZHBiID0gOQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzc21lIDwgYmVzdHNtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IHRoaXNzbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX212W05FV01WXS5yb3cgPSBkLT5ibWkubXYuYXNfbXYucm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0uY29sID0gZC0+Ym1pLm12LmFzX212LmNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmJtaS5tdi5hc19tdi5yb3cgPSBtb2RlX212W05FV01WXS5yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5ibWkubXYuYXNfbXYuY29sID0gbW9kZV9tdltORVdNVl0uY29sOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgd2UgZG8gYSBmdWxsIHNlYXJjaAotICAgICAgICAgICAgICAgIGlmICghY3BpLT5jaGVja19mcmVxW2xmX29yX2dmXSB8fCBjcGktPmRvX2Z1bGxbbGZfb3JfZ2ZdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHRoaXNzbWU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBmdWxsX2ZsYWdfdGhyZXNoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgTVYgZnVsbF9tdnA7Ci0KLSAgICAgICAgICAgICAgICAgICAgZnVsbF9tdnAucm93ID0gZC0+Ym1pLm12LmFzX212LnJvdyA8PDM7ICAgIC8vIHVzZSBkaWFtb25kIHNlYXJjaCByZXN1bHQgYXMgZnVsbCBzZWFyY2ggc3RhcmluZyBwb2ludAotICAgICAgICAgICAgICAgICAgICBmdWxsX212cC5jb2wgPSBkLT5ibWkubXYuYXNfbXYuY29sIDw8MzsKLQotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeC0+dmVjdG9yX3JhbmdlIGJhc2VkIG9uIGJlc3QgdmVjdG9yIGZvdW5kIGluIHN0ZXAgc2VhcmNoCi0gICAgICAgICAgICAgICAgICAgIHNlYXJjaF9yYW5nZSA9IE1BWEYoYWJzKChtdnAucm93Pj4zKSAtIGQtPmJtaS5tdi5hc19tdi5yb3cpLCBhYnMoKG12cC5jb2w+PjMpIC0gZC0+Ym1pLm12LmFzX212LmNvbCkpOwotICAgICAgICAgICAgICAgICAgICAvL3NlYXJjaF9yYW5nZSAqPSAxLjQ7ICAvL2RpZG4ndCBpbXByb3ZlIFBTTlIKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoX3JhbmdlID4geC0+dmVjdG9yX3JhbmdlKQotICAgICAgICAgICAgICAgICAgICAgICAgeC0+dmVjdG9yX3JhbmdlID0gc2VhcmNoX3JhbmdlOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfcmFuZ2UgPSB4LT52ZWN0b3JfcmFuZ2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgbGltaXRzCi0gICAgICAgICAgICAgICAgICAgIHNlYXJjaF9yYW5nZSA9IChzZWFyY2hfcmFuZ2UgPiBjcGktPnNmLm1heF9mc19yYWRpdXMpID8gY3BpLT5zZi5tYXhfZnNfcmFkaXVzIDogc2VhcmNoX3JhbmdlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoaXMgdG8gcmVkdWNlIGZ1bGwgc2VhcmNoIHJhbmdlLgotICAgICAgICAgICAgICAgICAgICBpZihzcjw9MyAmJiBzZWFyY2hfcmFuZ2UgPiA4KSBzZWFyY2hfcmFuZ2UgPSA4OwotCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYWRwYiA9IHgtPnNhZHBlcmJpdDE2ID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzc21lID0gY3BpLT5mdWxsX3NlYXJjaF9zYWQoeCwgYiwgZCwgJmZ1bGxfbXZwLCBzYWRwYiwgc2VhcmNoX3JhbmdlLCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLCB4LT5tdmNvc3QsIHgtPm12c2FkY29zdCwmYmVzdF9yZWZfbXYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQmFycmllciB0aHJlc2hvbGQgdG8gaW5pdGlhdGluZyBmdWxsIHNlYXJjaAotICAgICAgICAgICAgICAgICAgICAvLyBmdWxsX2ZsYWdfdGhyZXNoID0gMTAgKyAodGhpc3NtZSA+PiA3KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzc21lICsgZnVsbF9mbGFnX3RocmVzaCkgPCBiZXN0c21lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmRvX2Z1bGxbbGZfb3JfZ2ZdICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHNtZSA9IHRoaXNzbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpc3NtZSA8IGJlc3RzbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdGhpc3NtZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmRvX2Z1bGxbbGZfb3JfZ2ZdID0gY3BpLT5kb19mdWxsW2xmX29yX2dmXSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5jaGVja19mcmVxW2xmX29yX2dmXSA9IGNwaS0+c2YuZnVsbF9mcmVxW2xmX29yX2dmXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZ1bGwgc2VhcmNoIHJlc3VsdCBpcyBhY3R1YWxseSB3b3JzZSBzbyByZS1pbnN0YXRlIHRoZSBwcmV2aW91cyBiZXN0IHZlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LnJvdyA9IG1vZGVfbXZbTkVXTVZdLnJvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQtPmJtaS5tdi5hc19tdi5jb2wgPSBtb2RlX212W05FV01WXS5jb2w7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4LT5tdl9jb2xfbWluID0gdG1wX2NvbF9taW47Ci0gICAgICAgICAgICAgICAgeC0+bXZfY29sX21heCA9IHRtcF9jb2xfbWF4OwotICAgICAgICAgICAgICAgIHgtPm12X3Jvd19taW4gPSB0bXBfcm93X21pbjsKLSAgICAgICAgICAgICAgICB4LT5tdl9yb3dfbWF4ID0gdG1wX3Jvd19tYXg7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmVzdHNtZSA8IElOVF9NQVgpCi0gICAgICAgICAgICAgICAgICAgIC8vIGNwaS0+ZmluZF9mcmFjdGlvbmFsX212X3N0ZXAoeCxiLGQsJmQtPmJtaS5tdi5hc19tdiwmYmVzdF9yZWZfbXYseC0+ZXJyb3JwZXJiaXQvMixjcGktPmZuX3B0ci5zdmYsY3BpLT5mbl9wdHIudmYseC0+bXZjb3N0KTsgIC8vIG5vcm1hbCBtdmM9MTEKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5maW5kX2ZyYWN0aW9uYWxfbXZfc3RlcCh4LCBiLCBkLCAmZC0+Ym1pLm12LmFzX212LCAmYmVzdF9yZWZfbXYsIHgtPmVycm9ycGVyYml0IC8gNCwgJmNwaS0+Zm5fcHRyW0JMT0NLXzE2WDE2XSwgeC0+bXZjb3N0KTsKLQotICAgICAgICAgICAgICAgIG1vZGVfbXZbTkVXTVZdLnJvdyA9IGQtPmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgICAgICAgICAgbW9kZV9tdltORVdNVl0uY29sID0gZC0+Ym1pLm12LmFzX212LmNvbDsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IG1vdGlvbiB2ZWN0b3IgY29zdCB0byBvdXIgcm9sbGluZyBjb3N0IHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgcmF0ZTIgKz0gdnA4X212X2JpdF9jb3N0KCZtb2RlX212W05FV01WXSwgJmJlc3RfcmVmX212LCB4LT5tdmNvc3QsIDk2KTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTkVBUkVTVE1WOgotICAgICAgICBjYXNlIE5FQVJNVjoKLQotICAgICAgICAgICAgLy8gQ2xpcCAibmV4dF9uZWFyZXN0IiBzbyB0aGF0IGl0IGRvZXMgbm90IGV4dGVuZCB0byBmYXIgb3V0IG9mIGltYWdlCi0gICAgICAgICAgICBpZiAobW9kZV9tdlt0aGlzX21vZGVdLmNvbCA8ICh4ZC0+bWJfdG9fbGVmdF9lZGdlIC0gTEVGVF9UT1BfTUFSR0lOKSkKLSAgICAgICAgICAgICAgICBtb2RlX212W3RoaXNfbW9kZV0uY29sID0geGQtPm1iX3RvX2xlZnRfZWRnZSAtIExFRlRfVE9QX01BUkdJTjsKLSAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVfbXZbdGhpc19tb2RlXS5jb2wgPiB4ZC0+bWJfdG9fcmlnaHRfZWRnZSArIFJJR0hUX0JPVFRPTV9NQVJHSU4pCi0gICAgICAgICAgICAgICAgbW9kZV9tdlt0aGlzX21vZGVdLmNvbCA9IHhkLT5tYl90b19yaWdodF9lZGdlICsgUklHSFRfQk9UVE9NX01BUkdJTjsKLQotICAgICAgICAgICAgaWYgKG1vZGVfbXZbdGhpc19tb2RlXS5yb3cgPCAoeGQtPm1iX3RvX3RvcF9lZGdlIC0gTEVGVF9UT1BfTUFSR0lOKSkKLSAgICAgICAgICAgICAgICBtb2RlX212W3RoaXNfbW9kZV0ucm93ID0geGQtPm1iX3RvX3RvcF9lZGdlIC0gTEVGVF9UT1BfTUFSR0lOOwotICAgICAgICAgICAgZWxzZSBpZiAobW9kZV9tdlt0aGlzX21vZGVdLnJvdyA+IHhkLT5tYl90b19ib3R0b21fZWRnZSArIFJJR0hUX0JPVFRPTV9NQVJHSU4pCi0gICAgICAgICAgICAgICAgbW9kZV9tdlt0aGlzX21vZGVdLnJvdyA9IHhkLT5tYl90b19ib3R0b21fZWRnZSArIFJJR0hUX0JPVFRPTV9NQVJHSU47Ci0KLSAgICAgICAgICAgIC8vIERvIG5vdCBib3RoZXIgcHJvY2VlZGluZyBpZiB0aGUgdmVjdG9yIChmcm9tIG5ld212LG5lYXJlc3Qgb3IgbmVhcikgaXMgMCwwIGFzIHRoaXMgc2hvdWxkIHRoZW4gYmUgY29kZWQgdXNpbmcgdGhlIHplcm9tdiBtb2RlLgotICAgICAgICAgICAgaWYgKCgodGhpc19tb2RlID09IE5FQVJNVikgfHwgKHRoaXNfbW9kZSA9PSBORUFSRVNUTVYpKSAmJgotICAgICAgICAgICAgICAgICgobW9kZV9tdlt0aGlzX21vZGVdLnJvdyA9PSAwKSAmJiAobW9kZV9tdlt0aGlzX21vZGVdLmNvbCA9PSAwKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgY2FzZSBaRVJPTVY6Ci0KLSAgICAgICAgbXZfc2VsZWN0ZWQ6Ci0KLSAgICAgICAgICAgIC8vIFRyYXAgdmVjdG9ycyB0aGF0IHJlYWNoIGJleW9uZCB0aGUgVU1WIGJvcmRlcnMKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBBTEwgTmV3IE1WLCBOZWFyZXN0IE1WIE5lYXIgTVYgYW5kIFplcm8gTVYgY29kZSBkcm9wcyB0aHJvdWdoIHRvIHRoaXMgcG9pbnQKLSAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgYnJlYWsgc3RhdGVtZW50cyBpbiB0aGUgcHJldmlvdXMgdHdvIGNhc2VzLgotICAgICAgICAgICAgaWYgKCgobW9kZV9tdlt0aGlzX21vZGVdLnJvdyA+PiAzKSA8IHgtPm12X3Jvd19taW4pIHx8ICgobW9kZV9tdlt0aGlzX21vZGVdLnJvdyA+PiAzKSA+IHgtPm12X3Jvd19tYXgpIHx8Ci0gICAgICAgICAgICAgICAgKChtb2RlX212W3RoaXNfbW9kZV0uY29sID4+IDMpIDwgeC0+bXZfY29sX21pbikgfHwgKChtb2RlX212W3RoaXNfbW9kZV0uY29sID4+IDMpID4geC0+bXZfY29sX21heCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHZwOF9zZXRfbWJtb2RlX2FuZF9tdnMoeCwgdGhpc19tb2RlLCAmbW9kZV9tdlt0aGlzX21vZGVdKTsKLSAgICAgICAgICAgIHZwOF9idWlsZF9pbnRlcl9wcmVkaWN0b3JzX21ieSgmeC0+ZV9tYmQpOwotCi0gICAgICAgICAgICBpZiAoY3BpLT5hY3RpdmVfbWFwX2VuYWJsZWQgJiYgeC0+YWN0aXZlX3B0clswXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgeC0+c2tpcCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh4LT5lbmNvZGVfYnJlYWtvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHN1bSwgc3NlOwotICAgICAgICAgICAgICAgIGludCB0aHJlc2hvbGQgPSAoeGQtPmJsb2NrWzBdLmRlcXVhbnRbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHhkLT5ibG9ja1swXS5kZXF1YW50WzFdID4+NCk7Ci0KLSAgICAgICAgICAgICAgICBpZih0aHJlc2hvbGQgPCB4LT5lbmNvZGVfYnJlYWtvdXQpCi0gICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IHgtPmVuY29kZV9icmVha291dDsKLQotICAgICAgICAgICAgICAgIFZBUklBTkNFX0lOVk9LRSgmY3BpLT5ydGNkLnZhcmlhbmNlLCBnZXQxNngxNnZhcikKLSAgICAgICAgICAgICAgICAgICAgKHgtPnNyYy55X2J1ZmZlciwgeC0+c3JjLnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgeC0+ZV9tYmQucHJlZGljdG9yLCAxNiwgKHVuc2lnbmVkIGludCAqKSgmc3NlKSwgJnN1bSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3NlIDwgdGhyZXNob2xkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdSBhbmQgdiB0byBtYWtlIHN1cmUgc2tpcCBpcyBvawotICAgICAgICAgICAgICAgICAgICBpbnQgc3NlMiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlcyBpcyBubyBjb2RlYWJsZSAybmQgb3JkZXIgZGMKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgYSB2ZXJ5IHNtYWxsIHVuaWZvcm0gcGl4ZWwgY2hhbmdlIGNoYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYWJzKHN1bSkgPCAoeGQtPmJsb2NrWzI0XS5kZXF1YW50WzBdPDwyKXx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKHN1bSAqIHN1bT4+OCkgPiBzc2UgJiYgYWJzKHN1bSkgPDEyOCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzZTIgPSBWUDhfVVZTU0UoeCwgSUZfUlRDRCgmY3BpLT5ydGNkLnZhcmlhbmNlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2UyICogMiA8IHRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5za2lwID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uMiA9IHNzZSArIHNzZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTIgPSA1MDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYmVzdF95cmQgY2FsY3VsYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlX3V2ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uX3V2ID0gc3NlMjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfc2tpcCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19yZCA9IFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCByYXRlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb24yKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIC8vaW50ZXJtb2RlY29zdFttb2RlX2luZGV4XSA9IHZwOF9jb3N0X212X3JlZih0aGlzX21vZGUsIG1kY291bnRzKTsgICAvLyBFeHBlcmltZW50YWwgZGVidWcgY29kZQotCi0gICAgICAgICAgICAvLyBBZGQgaW4gdGhlIE12L21vZGUgY29zdAotICAgICAgICAgICAgcmF0ZTIgKz0gdnA4X2Nvc3RfbXZfcmVmKHRoaXNfbW9kZSwgbWRjb3VudHMpOwotCi0gICAgICAgICAgICAvLyBZIGNvc3QgYW5kIGRpc3RvcnRpb24KLSAgICAgICAgICAgIG1hY3JvX2Jsb2NrX3lyZCh4LCAmcmF0ZV95LCAmZGlzdG9ydGlvbiwgSUZfUlRDRCgmY3BpLT5ydGNkLmVuY29kZW1iKSk7Ci0gICAgICAgICAgICByYXRlMiArPSByYXRlX3k7Ci0gICAgICAgICAgICBkaXN0b3J0aW9uMiArPSBkaXN0b3J0aW9uOwotCi0gICAgICAgICAgICAvLyBVViBjb3N0IGFuZCBkaXN0b3J0aW9uCi0gICAgICAgICAgICB2cDhfcmRfaW50ZXJfdXYoY3BpLCB4LCAmcmF0ZV91diwgJmRpc3RvcnRpb25fdXYsIGNwaS0+Y29tbW9uLmZ1bGxfcGl4ZWwpOwotICAgICAgICAgICAgcmF0ZTIgKz0gcmF0ZV91djsKLSAgICAgICAgICAgIGRpc3RvcnRpb24yICs9IGRpc3RvcnRpb25fdXY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXaGVyZSBza2lwIGlzIGFsbG93YWJsZSBhZGQgaW4gdGhlIGRlZmF1bHQgcGVyIG1iIGNvc3QgZm9yIHRoZSBubyBza2lwIGNhc2UuCi0gICAgICAgIC8vIHdoZXJlIHdlIHRoZW4gZGVjaWRlIHRvIHNraXAgd2UgaGF2ZSB0byBkZWxldGUgdGhpcyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZQotICAgICAgICAvLyBjb3N0IG9mIHNpZ25hbGx5aW5nIGEgc2tpcAotICAgICAgICBpZiAoY3BpLT5jb21tb24ubWJfbm9fY29lZmZfc2tpcCkKLSAgICAgICAgewotICAgICAgICAgICAgb3RoZXJfY29zdCArPSB2cDhfY29zdF9iaXQoY3BpLT5wcm9iX3NraXBfZmFsc2UsIDApOwotICAgICAgICAgICAgcmF0ZTIgKz0gb3RoZXJfY29zdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVzdGltYXRlIHRoZSByZWZlcmVuY2UgZnJhbWUgc2lnbmFsaW5nIGNvc3QgYW5kIGFkZCBpdCB0byB0aGUgcm9sbGluZyBjb3N0IHZhcmlhYmxlLgotICAgICAgICByYXRlMiArPSByZWZfZnJhbWVfY29zdFt4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5yZWZfZnJhbWVdOwotCi0gICAgICAgIGlmICghZGlzYWJsZV9za2lwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUZXN0IGZvciB0aGUgY29uZGl0aW9uIHdoZXJlIHNraXAgYmxvY2sgd2lsbCBiZSBhY3RpdmF0ZWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gbm9uIHplcm8gY29lZmZpY2llbnRzIGFuZCBtYWtlIGFueSBuZWNlc3NhcnkgYWRqdXN0bWVudCBmb3IgcmF0ZQotICAgICAgICAgICAgaWYgKGNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHR0ZW9iOwotCi0gICAgICAgICAgICAgICAgdHRlb2IgPSAwOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSAyNDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHRlb2IgKz0geC0+ZV9tYmQuYmxvY2tbaV0uZW9iOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0dGVvYiA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZTIgLT0gKHJhdGVfeSArIHJhdGVfdXYpOwotICAgICAgICAgICAgICAgICAgICAvL2ZvciBiZXN0X3lyZCBjYWxjdWxhdGlvbgotICAgICAgICAgICAgICAgICAgICByYXRlX3V2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBCYWNrIG91dCBubyBza2lwIGZsYWcgY29zdGluZyBhbmQgYWRkIGluIHNraXAgZmxhZyBjb3N0aW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChjcGktPnByb2Jfc2tpcF9mYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb2Jfc2tpcF9jb3N0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9iX3NraXBfY29zdCA9IHZwOF9jb3N0X2JpdChjcGktPnByb2Jfc2tpcF9mYWxzZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9iX3NraXBfY29zdCAtPSB2cDhfY29zdF9iaXQoY3BpLT5wcm9iX3NraXBfZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTIgKz0gcHJvYl9za2lwX2Nvc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jb3N0ICs9IHByb2Jfc2tpcF9jb3N0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBSRCBlc3RpbWF0ZSBmb3IgdGhpcyBtb2RlCi0gICAgICAgICAgICB0aGlzX3JkID0gUkRDT1NUKHgtPnJkbXVsdCwgeC0+cmRkaXYsIHJhdGUyLCBkaXN0b3J0aW9uMik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHBlcmltZW50YWwgZGVidWcgY29kZS4KLSAgICAgICAgLy9hbGxfcmRzW21vZGVfaW5kZXhdID0gdGhpc19yZDsKLSAgICAgICAgLy9hbGxfcmF0ZXNbbW9kZV9pbmRleF0gPSByYXRlMjsKLSAgICAgICAgLy9hbGxfZGlzdFttb2RlX2luZGV4XSA9IGRpc3RvcnRpb24yOwotCi0gICAgICAgIGlmICgoeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkucmVmX2ZyYW1lID09IElOVFJBX0ZSQU1FKSAgJiYgKHRoaXNfcmQgPCAqcmV0dXJuaW50cmEpKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcmV0dXJuaW50cmEgPSB0aGlzX3JkIDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERpZCB0aGlzIG1vZGUgaGVscC4uIGkuaSBpcyBpdCB0aGUgbmV3IGJlc3QgbW9kZQotICAgICAgICBpZiAodGhpc19yZCA8IGJlc3RfcmQgfHwgeC0+c2tpcCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm90ZSBpbmRleCBvZiBiZXN0IG1vZGUgc28gZmFyCi0gICAgICAgICAgICBiZXN0X21vZGVfaW5kZXggPSBtb2RlX2luZGV4OwotICAgICAgICAgICAgeC0+ZV9tYmQubW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZm9yY2Vfbm9fc2tpcCA9IGZvcmNlX25vX3NraXA7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzX21vZGUgPD0gQl9QUkVEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnV2X21vZGUgPSB1dl9pbnRyYV9tb2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvdGhlcl9jb3N0ICs9IHJlZl9mcmFtZV9jb3N0W3gtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLnJlZl9mcmFtZV07Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgZmluYWwgeSBSRCBlc3RpbWF0ZSBmb3IgdGhpcyBtb2RlICovCi0gICAgICAgICAgICBiZXN0X3lyZCA9IFJEQ09TVCh4LT5yZG11bHQsIHgtPnJkZGl2LCAocmF0ZTItcmF0ZV91di1vdGhlcl9jb3N0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXN0b3J0aW9uMi1kaXN0b3J0aW9uX3V2KSk7Ci0KLSAgICAgICAgICAgICpyZXR1cm5yYXRlID0gcmF0ZTI7Ci0gICAgICAgICAgICAqcmV0dXJuZGlzdG9ydGlvbiA9IGRpc3RvcnRpb24yOwotICAgICAgICAgICAgYmVzdF9yZCA9IHRoaXNfcmQ7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KCZiZXN0X21ibW9kZSwgJngtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLCBzaXplb2YoTUJfTU9ERV9JTkZPKSk7Ci0gICAgICAgICAgICB2cHhfbWVtY3B5KCZiZXN0X3BhcnRpdGlvbiwgeC0+cGFydGl0aW9uX2luZm8sIHNpemVvZihQQVJUSVRJT05fSU5GTykpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cHhfbWVtY3B5KCZiZXN0X2Jtb2Rlc1tpXSwgJngtPmVfbWJkLmJsb2NrW2ldLmJtaSwgc2l6ZW9mKEJfTU9ERV9JTkZPKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRlc3RpbmcgdGhpcyBtb2RlIGdhdmUgcmlzZSB0byBhbiBpbXByb3ZlbWVudCBpbiBiZXN0IGVycm9yIHNjb3JlLiBMb3dlciB0aHJlc2hvbGQgYSBiaXQgZm9yIG5leHQgdGltZQotICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XSA9IChjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID49IChNSU5fVEhSRVNITVVMVCArIDIpKSA/IGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gLSAyIDogTUlOX1RIUkVTSE1VTFQ7Ci0gICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW21vZGVfaW5kZXhdID0gKGNwaS0+cmRfYmFzZWxpbmVfdGhyZXNoW21vZGVfaW5kZXhdID4+IDcpICogY3BpLT5yZF90aHJlc2hfbXVsdFttb2RlX2luZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBtb2RlIGRpZCBub3QgaGVscCBpbXByb3ZlIHRoZSBiZXN0IGVycm9yIGNhc2UgdGhlbiByYWlzZSB0aGUgdGhyZXNob2xkIGZvciB0ZXN0aW5nIHRoYXQgbW9kZSBuZXh0IHRpbWUgYXJvdW5kLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gKz0gNDsKLQotICAgICAgICAgICAgaWYgKGNwaS0+cmRfdGhyZXNoX211bHRbbW9kZV9pbmRleF0gPiBNQVhfVEhSRVNITVVMVCkKLSAgICAgICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdID0gTUFYX1RIUkVTSE1VTFQ7Ci0KLSAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbbW9kZV9pbmRleF0gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W21vZGVfaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHgtPnNraXApCi0gICAgICAgICAgICBicmVhazsKLQotICAgIH0KLQotICAgIC8vIFJlZHVjZSB0aGUgYWN0aXZhdGlvbiBSRCB0aHJlc2hvbGRzIGZvciB0aGUgYmVzdCBjaG9pY2UgbW9kZQotICAgIGlmICgoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbYmVzdF9tb2RlX2luZGV4XSA+IDApICYmIChjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFtiZXN0X21vZGVfaW5kZXhdIDwgKElOVF9NQVggPj4gMikpKQotICAgIHsKLSAgICAgICAgaW50IGJlc3RfYWRqdXN0bWVudCA9IChjcGktPnJkX3RocmVzaF9tdWx0W2Jlc3RfbW9kZV9pbmRleF0gPj4gMik7Ci0KLSAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtiZXN0X21vZGVfaW5kZXhdID0gKGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XSA+PSAoTUlOX1RIUkVTSE1VTFQgKyBiZXN0X2FkanVzdG1lbnQpKSA/IGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XSAtIGJlc3RfYWRqdXN0bWVudCA6IE1JTl9USFJFU0hNVUxUOwotICAgICAgICBjcGktPnJkX3RocmVzaGVzW2Jlc3RfbW9kZV9pbmRleF0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbYmVzdF9tb2RlX2luZGV4XSA+PiA3KSAqIGNwaS0+cmRfdGhyZXNoX211bHRbYmVzdF9tb2RlX2luZGV4XTsKLQotICAgICAgICAvLyBJZiB3ZSBjaG9zZSBhIHNwbGl0IG1vZGUgdGhlbiByZXNldCB0aGUgbmV3IE1WIHRocmVzaG9sZHMgYXMgd2VsbAotICAgICAgICAvKmlmICggdnA4X21vZGVfb3JkZXJbYmVzdF9tb2RlX2luZGV4XSA9PSBTUExJVE1WICkKLSAgICAgICAgewotICAgICAgICAgICAgYmVzdF9hZGp1c3RtZW50ID0gNDsgLy8oY3BpLT5yZF90aHJlc2hfbXVsdFtUSFJfTkVXTVZdID4+IDQpOwotICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hfbXVsdFtUSFJfTkVXTVZdID0gKGNwaS0+cmRfdGhyZXNoX211bHRbVEhSX05FV01WXSA+PSAoTUlOX1RIUkVTSE1VTFQrYmVzdF9hZGp1c3RtZW50KSkgPyBjcGktPnJkX3RocmVzaF9tdWx0W1RIUl9ORVdNVl0tYmVzdF9hZGp1c3RtZW50OiBNSU5fVEhSRVNITVVMVDsKLSAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoZXNbVEhSX05FV01WXSA9IChjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFtUSFJfTkVXTVZdID4+IDcpICogY3BpLT5yZF90aHJlc2hfbXVsdFtUSFJfTkVXTVZdOwotCi0gICAgICAgICAgICBiZXN0X2FkanVzdG1lbnQgPSA0OyAvLyhjcGktPnJkX3RocmVzaF9tdWx0W1RIUl9ORVdHXSA+PiA0KTsKLSAgICAgICAgICAgIGNwaS0+cmRfdGhyZXNoX211bHRbVEhSX05FV0ddID0gKGNwaS0+cmRfdGhyZXNoX211bHRbVEhSX05FV0ddID49IChNSU5fVEhSRVNITVVMVCtiZXN0X2FkanVzdG1lbnQpKSA/IGNwaS0+cmRfdGhyZXNoX211bHRbVEhSX05FV0ddLWJlc3RfYWRqdXN0bWVudDogTUlOX1RIUkVTSE1VTFQ7Ci0gICAgICAgICAgICBjcGktPnJkX3RocmVzaGVzW1RIUl9ORVdHXSA9IChjcGktPnJkX2Jhc2VsaW5lX3RocmVzaFtUSFJfTkVXR10gPj4gNykgKiBjcGktPnJkX3RocmVzaF9tdWx0W1RIUl9ORVdHXTsKLQotICAgICAgICAgICAgYmVzdF9hZGp1c3RtZW50ID0gNDsgLy8oY3BpLT5yZF90aHJlc2hfbXVsdFtUSFJfTkVXQV0gPj4gNCk7Ci0gICAgICAgICAgICBjcGktPnJkX3RocmVzaF9tdWx0W1RIUl9ORVdBXSA9IChjcGktPnJkX3RocmVzaF9tdWx0W1RIUl9ORVdBXSA+PSAoTUlOX1RIUkVTSE1VTFQrYmVzdF9hZGp1c3RtZW50KSkgPyBjcGktPnJkX3RocmVzaF9tdWx0W1RIUl9ORVdBXS1iZXN0X2FkanVzdG1lbnQ6IE1JTl9USFJFU0hNVUxUOwotICAgICAgICAgICAgY3BpLT5yZF90aHJlc2hlc1tUSFJfTkVXQV0gPSAoY3BpLT5yZF9iYXNlbGluZV90aHJlc2hbVEhSX05FV0FdID4+IDcpICogY3BpLT5yZF90aHJlc2hfbXVsdFtUSFJfTkVXQV07Ci0gICAgICAgIH0qLwotCi0gICAgfQotCi0gICAgLy8gSWYgd2UgaGF2ZSBjaG9zZW4gbmV3IG12IG9yIHNwbGl0IHRoZW4gZGVjYXkgdGhlIGZ1bGwgc2VhcmNoIGNoZWNrIGNvdW50IG1vcmUgcXVpY2tseS4KLSAgICBpZiAoKHZwOF9tb2RlX29yZGVyW2Jlc3RfbW9kZV9pbmRleF0gPT0gTkVXTVYpIHx8ICh2cDhfbW9kZV9vcmRlcltiZXN0X21vZGVfaW5kZXhdID09IFNQTElUTVYpKQotICAgIHsKLSAgICAgICAgaW50IGxmX29yX2dmID0gKHZwOF9yZWZfZnJhbWVfb3JkZXJbYmVzdF9tb2RlX2luZGV4XSA9PSBMQVNUX0ZSQU1FKSA/IDAgOiAxOwotCi0gICAgICAgIGlmIChjcGktPmNoZWNrX2ZyZXFbbGZfb3JfZ2ZdICYmICFjcGktPmRvX2Z1bGxbbGZfb3JfZ2ZdKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcGktPmNoZWNrX2ZyZXFbbGZfb3JfZ2ZdIC0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gS2VlcCBhIHJlY29yZCBvZiBiZXN0IG1vZGUgaW5kZXggdGhhdCB3ZSBjaG9zZQotICAgIGNwaS0+bGFzdF9iZXN0X21vZGVfaW5kZXggPSBiZXN0X21vZGVfaW5kZXg7Ci0KLSAgICAvLyBOb3RlIGhvdyBvZnRlbiBlYWNoIG1vZGUgY2hvc2VuIGFzIGJlc3QKLSAgICBjcGktPm1vZGVfY2hvc2VuX2NvdW50c1tiZXN0X21vZGVfaW5kZXhdICsrOwotCi0KLSAgICBpZiAoY3BpLT5pc19zcmNfZnJhbWVfYWx0X3JlZiAmJiAoYmVzdF9tYm1vZGUubW9kZSAhPSBaRVJPTVYgfHwgYmVzdF9tYm1vZGUucmVmX2ZyYW1lICE9IEFMVFJFRl9GUkFNRSkpCi0gICAgewotICAgICAgICBiZXN0X21ibW9kZS5tb2RlID0gWkVST01WOwotICAgICAgICBiZXN0X21ibW9kZS5yZWZfZnJhbWUgPSBBTFRSRUZfRlJBTUU7Ci0gICAgICAgIGJlc3RfbWJtb2RlLm12LmFzX2ludCA9IDA7Ci0gICAgICAgIGJlc3RfbWJtb2RlLnV2X21vZGUgPSAwOwotICAgICAgICBiZXN0X21ibW9kZS5tYl9za2lwX2NvZWZmID0gKGNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApID8gMSA6IDA7Ci0gICAgICAgIGJlc3RfbWJtb2RlLnBhcnRpdGlvbmluZyA9IDA7Ci0gICAgICAgIGJlc3RfbWJtb2RlLmRjX2RpZmYgPSAwOwotCi0gICAgICAgIHZweF9tZW1jcHkoJngtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLCAmYmVzdF9tYm1vZGUsIHNpemVvZihNQl9NT0RFX0lORk8pKTsKLSAgICAgICAgdnB4X21lbWNweSh4LT5wYXJ0aXRpb25faW5mbywgJmJlc3RfcGFydGl0aW9uLCBzaXplb2YoUEFSVElUSU9OX0lORk8pKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdnB4X21lbXNldCgmeC0+ZV9tYmQuYmxvY2tbaV0uYm1pLCAwLCBzaXplb2YoQl9NT0RFX0lORk8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX2ludCA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIGJlc3RfcmQ7Ci0gICAgfQotCi0KLSAgICBpZihiZXN0X21ibW9kZS5tb2RlIDw9IEJfUFJFRCkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYmVzdF9ibW9kZXNbaV0ubXYuYXNfaW50ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG1hY3JvYmxvY2sgbW9kZXMKLSAgICB2cHhfbWVtY3B5KCZ4LT5lX21iZC5tb2RlX2luZm9fY29udGV4dC0+bWJtaSwgJmJlc3RfbWJtb2RlLCBzaXplb2YoTUJfTU9ERV9JTkZPKSk7Ci0gICAgdnB4X21lbWNweSh4LT5wYXJ0aXRpb25faW5mbywgJmJlc3RfcGFydGl0aW9uLCBzaXplb2YoUEFSVElUSU9OX0lORk8pKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweSgmeC0+ZV9tYmQuYmxvY2tbaV0uYm1pLCAmYmVzdF9ibW9kZXNbaV0sIHNpemVvZihCX01PREVfSU5GTykpOwotICAgIH0KLQotICAgIHgtPmVfbWJkLm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm12LmFzX212ID0geC0+ZV9tYmQuYmxvY2tbMTVdLmJtaS5tdi5hc19tdjsKLQotICAgIHJldHVybiBiZXN0X3JkOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci9yZG9wdC5oIGIvdnA4L2VuY29kZXIvcmRvcHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiYTlhMC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9yZG9wdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfUkRPUFRfSAotI2RlZmluZSBfX0lOQ19SRE9QVF9ICi12b2lkIHZwOF9pbml0aWFsaXplX3JkX2NvbnN0cyhWUDhfQ09NUCAqY3BpLCBpbnQgUXZhbHVlKTsKLWludCB2cDhfcmRfcGlja19pbnRyYTR4NG1ieV9tb2RlcyhWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICptYiwgaW50ICpyYXRlLCBpbnQgKnJhdGVfdG8sIGludCAqZGlzdG9ydGlvbiwgaW50IGJlc3RfcmQpOwotaW50IHZwOF9yZF9waWNrX2ludHJhMTZ4MTZtYnlfbW9kZShWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLICp4LCBpbnQgKnJldHVybnJhdGUsIGludCAqcmF0ZV90bywgaW50ICpyZXR1cm5kaXN0b3J0aW9uKTsKLWludCB2cDhfcmRfcGlja19pbnRyYV9tYnV2X21vZGUoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50ICpyYXRlLCBpbnQgKnJhdGVfdG8sIGludCAqZGlzdG9ydGlvbik7Ci1leHRlcm4gaW50IHZwOF9yZF9waWNrX2ludGVyX21vZGUoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DSyAqeCwgaW50IHJlY29uX3lvZmZzZXQsIGludCByZWNvbl91dm9mZnNldCwgaW50ICpyZXR1cm5yYXRlLCBpbnQgKnJldHVybmRpc3RvcnRpb24sIGludCAqcmV0dXJuaW50cmEpOwotCi1leHRlcm4gdm9pZCB2cDhfbXZfcHJlZAotKAotICAgIFZQOF9DT01QICpjcGksCi0gICAgTUFDUk9CTE9DS0QgKnhkLAotICAgIGNvbnN0IE1PREVfSU5GTyAqaGVyZSwKLSAgICBNViAqbXZwLAotICAgIGludCByZWZmcmFtZSwKLSAgICBpbnQgKnJlZl9mcmFtZV9zaWduX2JpYXMsCi0gICAgaW50ICpzciwKLSAgICBpbnQgbmVhcl9zYWRpZHhbXQotKTsKLXZvaWQgdnA4X2NhbF9zYWQoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DS0QgKnhkLCBNQUNST0JMT0NLICp4LCBpbnQgcmVjb25feW9mZnNldCwgaW50IG5lYXJfc2FkaWR4W10pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3NhZF9jLmMgYi92cDgvZW5jb2Rlci9zYWRfYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFjYTU5Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3NhZF9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotdW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIGludCBtYXhfc2FkKQotewotCi0gICAgaW50IHIsIGM7Ci0gICAgdW5zaWduZWQgaW50IHNhZCA9IDA7Ci0KLSAgICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCAxNjsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYWQgKz0gYWJzKHNyY19wdHJbY10gLSByZWZfcHRyW2NdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY19wdHIgKz0gc3JjX3N0cmlkZTsKLSAgICAgICAgcmVmX3B0ciArPSByZWZfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBzYWQ7Ci19Ci0KLQotc3RhdGljIF9faW5saW5lCi11bnNpZ25lZCBpbnQgc2FkX214X25fYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICBpbnQgbSwKLSAgICBpbnQgbikKLXsKLQotICAgIGludCByLCBjOwotICAgIHVuc2lnbmVkIGludCBzYWQgPSAwOwotCi0gICAgZm9yIChyID0gMDsgciA8IG47IHIrKykKLSAgICB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCBtOyBjKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhZCArPSBhYnMoc3JjX3B0cltjXSAtIHJlZl9wdHJbY10pOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjX3B0ciArPSBzcmNfc3RyaWRlOwotICAgICAgICByZWZfcHRyICs9IHJlZl9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNhZDsKLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3NhZDh4OF9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIGludCBtYXhfc2FkKQotewotCi0gICAgcmV0dXJuIHNhZF9teF9uX2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciwgcmVmX3N0cmlkZSwgOCwgOCk7Ci19Ci0KLQotdW5zaWduZWQgaW50IHZwOF9zYWQxNng4X2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlZl9zdHJpZGUsCi0gICAgaW50IG1heF9zYWQpCi17Ci0KLSAgICByZXR1cm4gc2FkX214X25fYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyLCByZWZfc3RyaWRlLCAxNiwgOCk7Ci0KLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3NhZDh4MTZfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICBpbnQgbWF4X3NhZCkKLXsKLQotICAgIHJldHVybiBzYWRfbXhfbl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIsIHJlZl9zdHJpZGUsIDgsIDE2KTsKLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3NhZDR4NF9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIGludCBtYXhfc2FkKQotewotCi0gICAgcmV0dXJuIHNhZF9teF9uX2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciwgcmVmX3N0cmlkZSwgNCwgNCk7Ci19Ci0KLXZvaWQgdnA4X3NhZDE2eDE2eDNfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheQotKQotewotICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgICwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzFdID0gdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAyLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KLQotdm9pZCB2cDhfc2FkMTZ4MTZ4OF9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkKLSkKLXsKLSAgICBzYWRfYXJyYXlbMF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciAgLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbMV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMiwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzNdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAzICwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzRdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA0LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDUsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVs2XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNywgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci19Ci0KLXZvaWQgdnA4X3NhZDE2eDh4M19jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotfQotCi12b2lkIHZwOF9zYWQxNng4eDhfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciAgLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbMV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzJdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAzICwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzRdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDQsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVs1XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA1LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA3LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KLQotdm9pZCB2cDhfc2FkOHg4eDNfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheQotKQotewotICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzJdID0gdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAyLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KLQotdm9pZCB2cDhfc2FkOHg4eDhfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDMgLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA0LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA1LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA2ICwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzddID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNywgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci19Ci0KLXZvaWQgdnA4X3NhZDh4MTZ4M19jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotfQotCi12b2lkIHZwOF9zYWQ4eDE2eDhfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciAgLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbMV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzJdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAzICwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzRdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDQsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVs1XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA1LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNiAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVs3XSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA3LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KLQotdm9pZCB2cDhfc2FkNHg0eDNfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheQotKQotewotICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgMSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzJdID0gdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyAyLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KLQotdm9pZCB2cDhfc2FkNHg0eDhfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICAsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDEsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDIsIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9ICh1bnNpZ25lZCBzaG9ydCl2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0ciArIDMgLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNF0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA0LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNV0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA1LCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbNl0gPSAodW5zaWduZWQgc2hvcnQpdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHIgKyA2ICwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzddID0gKHVuc2lnbmVkIHNob3J0KXZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyICsgNywgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci19Ci0KLXZvaWQgdnA4X3NhZDE2eDE2eDRkX2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cltdLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheQotKQotewotICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMF0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsxXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMV0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMl0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQxNngxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbM10sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotfQotCi12b2lkIHZwOF9zYWQxNng4eDRkX2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cltdLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheQotKQotewotICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clswXSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzFdID0gdnA4X3NhZDE2eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzFdLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbMl0gPSB2cDhfc2FkMTZ4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMl0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQxNng4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clszXSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci19Ci0KLXZvaWQgdnA4X3NhZDh4OHg0ZF9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfc3RyaWRlLAotICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHJbXSwKLSAgICBpbnQgIHJlZl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzYWRfYXJyYXkKLSkKLXsKLSAgICBzYWRfYXJyYXlbMF0gPSB2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clswXSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzFdID0gdnA4X3NhZDh4OF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMV0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQ4eDhfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzJdLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbM10gPSB2cDhfc2FkOHg4X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clszXSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci19Ci0KLXZvaWQgdnA4X3NhZDh4MTZ4NGRfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyW10sCi0gICAgaW50ICByZWZfc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5Ci0pCi17Ci0gICAgc2FkX2FycmF5WzBdID0gdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzBdLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkOHgxNl9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMV0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVsyXSA9IHZwOF9zYWQ4eDE2X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsyXSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzNdID0gdnA4X3NhZDh4MTZfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzNdLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KLQotdm9pZCB2cDhfc2FkNHg0eDRkX2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cltdLAotICAgIGludCAgcmVmX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNhZF9hcnJheQotKQotewotICAgIHNhZF9hcnJheVswXSA9IHZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzBdLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLSAgICBzYWRfYXJyYXlbMV0gPSB2cDhfc2FkNHg0X2Moc3JjX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3B0clsxXSwgcmVmX3N0cmlkZSwgMHg3ZmZmZmZmZik7Ci0gICAgc2FkX2FycmF5WzJdID0gdnA4X3NhZDR4NF9jKHNyY19wdHIsIHNyY19zdHJpZGUsIHJlZl9wdHJbMl0sIHJlZl9zdHJpZGUsIDB4N2ZmZmZmZmYpOwotICAgIHNhZF9hcnJheVszXSA9IHZwOF9zYWQ0eDRfYyhzcmNfcHRyLCBzcmNfc3RyaWRlLCByZWZfcHRyWzNdLCByZWZfc3RyaWRlLCAweDdmZmZmZmZmKTsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3NlZ21lbnRhdGlvbi5jIGIvdnA4L2VuY29kZXIvc2VnbWVudGF0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDk2N2QuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvc2VnbWVudGF0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInNlZ21lbnRhdGlvbi5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotCi12b2lkIHZwOF91cGRhdGVfZ2ZfdXNlYWdlX21hcHMoVlA4X0NPTVAgKmNwaSwgVlA4X0NPTU1PTiAqY20sIE1BQ1JPQkxPQ0sgKngpCi17Ci0gICAgaW50IG1iX3JvdywgbWJfY29sOwotCi0gICAgTU9ERV9JTkZPICp0aGlzX21iX21vZGVfaW5mbyA9IGNtLT5taTsKLQotICAgIHgtPmdmX2FjdGl2ZV9wdHIgPSAoc2lnbmVkIGNoYXIgKiljcGktPmdmX2FjdGl2ZV9mbGFnczsKLQotICAgIGlmICgoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB8fCAoY20tPnJlZnJlc2hfZ29sZGVuX2ZyYW1lKSkKLSAgICB7Ci0gICAgICAgIC8vIFJlc2V0IEdmIHVzZWFnZSBtb25pdG9ycwotICAgICAgICB2cHhfbWVtc2V0KGNwaS0+Z2ZfYWN0aXZlX2ZsYWdzLCAxLCAoY20tPm1iX3Jvd3MgKiBjbS0+bWJfY29scykpOwotICAgICAgICBjcGktPmdmX2FjdGl2ZV9jb3VudCA9IGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIGZvciBlYWNoIG1hY3JvYmxvY2sgcm93IGluIGltYWdlCi0gICAgICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgY20tPm1iX3Jvd3M7IG1iX3JvdysrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmb3IgZWFjaCBtYWNyb2Jsb2NrIGNvbCBpbiBpbWFnZQotICAgICAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBjbS0+bWJfY29sczsgbWJfY29sKyspCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB1c2luZyBnb2xkZW4gdGhlbiBzZXQgR0YgYWN0aXZlIGZsYWcgaWYgbm90IGFscmVhZHkgc2V0LgotICAgICAgICAgICAgICAgIC8vIElmIHVzaW5nIGxhc3QgZnJhbWUgMCwwIG1vZGUgdGhlbiBsZWF2ZSBmbGFnIGFzIGl0IGlzCi0gICAgICAgICAgICAgICAgLy8gZWxzZSBpZiB1c2luZyBub24gMCwwIG1vdGlvbiBvciBpbnRyYSBtb2RlcyB0aGVuIGNsZWFyIGZsYWcgaWYgaXQgaXMgY3VycmVudGx5IHNldAotICAgICAgICAgICAgICAgIGlmICgodGhpc19tYl9tb2RlX2luZm8tPm1ibWkucmVmX2ZyYW1lID09IEdPTERFTl9GUkFNRSkgfHwgKHRoaXNfbWJfbW9kZV9pbmZvLT5tYm1pLnJlZl9mcmFtZSA9PSBBTFRSRUZfRlJBTUUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCooeC0+Z2ZfYWN0aXZlX3B0cikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKih4LT5nZl9hY3RpdmVfcHRyKSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGktPmdmX2FjdGl2ZV9jb3VudCArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpc19tYl9tb2RlX2luZm8tPm1ibWkubW9kZSAhPSBaRVJPTVYpICYmICooeC0+Z2ZfYWN0aXZlX3B0cikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHgtPmdmX2FjdGl2ZV9wdHIpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgY3BpLT5nZl9hY3RpdmVfY291bnQtLTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4LT5nZl9hY3RpdmVfcHRyKys7ICAgICAgICAgIC8vIFN0ZXAgb250byBuZXh0IGVudHJ5Ci0gICAgICAgICAgICAgICAgdGhpc19tYl9tb2RlX2luZm8rKzsgICAgICAgICAgIC8vIHNraXAgdG8gbmV4dCBtYgotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gYWNjb3VudCBmb3IgdGhlIGJvcmRlcgotICAgICAgICAgICAgdGhpc19tYl9tb2RlX2luZm8rKzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3NzaW0uYyBiL3ZwOC9lbmNvZGVyL3NzaW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkNjdjNi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci9zc2ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgIm1hdGguaCIKLSNpbmNsdWRlICJvbnl4X2ludC5oIgotCi0jaWYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotI2RlZmluZSBJRl9SVENEKHgpICAoeCkKLSNlbHNlCi0jZGVmaW5lIElGX1JUQ0QoeCkgIE5VTEwKLSNlbmRpZgotLy8gR29vZ2xlIHZlcnNpb24gb2YgU1NJTQotLy8gU1NJTQotI2RlZmluZSBLRVJORUwgMwotI2RlZmluZSBLRVJORUxfU0laRSAgKDIgKiBLRVJORUwgKyAxKQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7Ci0KLXN0YXRpYyBjb25zdCBpbnQgS1tLRVJORUxfU0laRV0gPQotewotICAgIDEsIDQsIDExLCAxNiwgMTEsIDQsIDEgICAgLy8gMTYgKiBleHAoLTAuMyAqIGkgKiBpKQotfTsKLXN0YXRpYyBjb25zdCBkb3VibGUga2lfdyA9IDEuIC8gMjMwNC47ICAvLyAxIC8gc3VtKGk6MC4uNiwgai4uNikgS1tpXSpLW2pdCi1kb3VibGUgZ2V0X3NzaW1nKGNvbnN0IHVpbnQ4ICpvcmcsIGNvbnN0IHVpbnQ4ICpyZWMsCi0gICAgICAgICAgICAgICAgIGludCB4bywgaW50IHlvLCBpbnQgVywgaW50IEgsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdHJpZGUxLCBjb25zdCBpbnQgc3RyaWRlMgotICAgICAgICAgICAgICAgICkKLXsKLSAgICAvLyBUT0RPKHNrYWwpOiB1c2Ugc3VtbWVkIHRhYmxlcwotICAgIGludCB5LCB4OwotCi0gICAgY29uc3QgaW50IHltaW4gPSAoeW8gLSBLRVJORUwgPCAwKSA/IDAgOiB5byAtIEtFUk5FTDsKLSAgICBjb25zdCBpbnQgeW1heCA9ICh5byArIEtFUk5FTCA+IEggLSAxKSA/IEggLSAxIDogeW8gKyBLRVJORUw7Ci0gICAgY29uc3QgaW50IHhtaW4gPSAoeG8gLSBLRVJORUwgPCAwKSA/IDAgOiB4byAtIEtFUk5FTDsKLSAgICBjb25zdCBpbnQgeG1heCA9ICh4byArIEtFUk5FTCA+IFcgLSAxKSA/IFcgLSAxIDogeG8gKyBLRVJORUw7Ci0gICAgLy8gd29yc3QgY2FzZSBvZiBhY2N1bXVsYXRpb24gaXMgYSB3ZWlnaHQgb2YgNDggPSAxNiArIDIgKiAoMTEgKyA0ICsgMSkKLSAgICAvLyB3aXRoIGEgZGlmZiBvZiAyNTUsIHNxdWFyZXMuIFRoYXQgd291bGQgYSBtYXggZXJyb3Igb2YgMHg4ZWUwOTAwLAotICAgIC8vIHdoaWNoIGZpdHMgaW50byAzMiBiaXRzIGludGVnZXJzLgotICAgIHVpbnQzMiB3ID0gMCwgeG0gPSAwLCB5bSA9IDAsIHh4bSA9IDAsIHh5bSA9IDAsIHl5bSA9IDA7Ci0gICAgb3JnICs9IHltaW4gKiBzdHJpZGUxOwotICAgIHJlYyArPSB5bWluICogc3RyaWRlMjsKLQotICAgIGZvciAoeSA9IHltaW47IHkgPD0geW1heDsgKyt5LCBvcmcgKz0gc3RyaWRlMSwgcmVjICs9IHN0cmlkZTIpCi0gICAgewotICAgICAgICBjb25zdCBpbnQgV3kgPSBLW0tFUk5FTCArIHkgLSB5b107Ci0KLSAgICAgICAgZm9yICh4ID0geG1pbjsgeCA8PSB4bWF4OyArK3gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0ICBpbnQgV3h5ID0gV3kgKiBLW0tFUk5FTCArIHggLSB4b107Ci0gICAgICAgICAgICAvLyBUT0RPKHNrYWwpOiBpbmxpbmVkIGFzc2VtYmx5Ci0gICAgICAgICAgICB3ICAgKz0gV3h5OwotICAgICAgICAgICAgeG0gICs9IFd4eSAqIG9yZ1t4XTsKLSAgICAgICAgICAgIHltICArPSBXeHkgKiByZWNbeF07Ci0gICAgICAgICAgICB4eG0gKz0gV3h5ICogb3JnW3hdICogb3JnW3hdOwotICAgICAgICAgICAgeHltICs9IFd4eSAqIG9yZ1t4XSAqIHJlY1t4XTsKLSAgICAgICAgICAgIHl5bSArPSBXeHkgKiByZWNbeF0gKiByZWNbeF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSBpdyA9IDEuIC8gdzsKLSAgICAgICAgY29uc3QgZG91YmxlIGl3eCA9IHhtICogaXc7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSBpd3kgPSB5bSAqIGl3OwotICAgICAgICBkb3VibGUgc3h4ID0geHhtICogaXcgLSBpd3ggKiBpd3g7Ci0gICAgICAgIGRvdWJsZSBzeXkgPSB5eW0gKiBpdyAtIGl3eSAqIGl3eTsKLQotICAgICAgICAvLyBzbWFsbCBlcnJvcnMgYXJlIHBvc3NpYmxlLCBkdWUgdG8gcm91bmRpbmcuIENsYW1wIHRvIHplcm8uCi0gICAgICAgIGlmIChzeHggPCAwLikgc3h4ID0gMC47Ci0KLSAgICAgICAgaWYgKHN5eSA8IDAuKSBzeXkgPSAwLjsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgc3hzeSA9IHNxcnQoc3h4ICogc3l5KTsKLSAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzeHkgPSB4eW0gKiBpdyAtIGl3eCAqIGl3eTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgQzExID0gKDAuMDEgKiAwLjAxKSAqICgyNTUgKiAyNTUpOwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBDMjIgPSAoMC4wMyAqIDAuMDMpICogKDI1NSAqIDI1NSk7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIEMzMyA9ICgwLjAxNSAqIDAuMDE1KSAqICgyNTUgKiAyNTUpOwotICAgICAgICAgICAgY29uc3QgZG91YmxlIGwgPSAoMi4gKiBpd3ggKiBpd3kgKyBDMTEpIC8gKGl3eCAqIGl3eCArIGl3eSAqIGl3eSArIEMxMSk7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgYyA9ICgyLiAqIHN4c3kgICAgICArIEMyMikgLyAoc3h4ICsgc3l5ICsgQzIyKTsKLQotICAgICAgICAgICAgY29uc3QgZG91YmxlIHMgPSAoc3h5ICsgQzMzKSAvIChzeHN5ICsgQzMzKTsKLSAgICAgICAgICAgIHJldHVybiBsICogYyAqIHM7Ci0KLSAgICAgICAgfQotICAgIH0KLQotfQotCi1kb3VibGUgZ2V0X3NzaW1mdWxsX2tlcm5lbGcoY29uc3QgdWludDggKm9yZywgY29uc3QgdWludDggKnJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG8sIGludCB5bywgaW50IFcsIGludCBILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdHJpZGUxLCBjb25zdCBpbnQgc3RyaWRlMikKLXsKLSAgICAvLyBUT0RPKHNrYWwpOiB1c2Ugc3VtbWVkIHRhYmxlcwotICAgIC8vIHdvcnN0IGNhc2Ugb2YgYWNjdW11bGF0aW9uIGlzIGEgd2VpZ2h0IG9mIDQ4ID0gMTYgKyAyICogKDExICsgNCArIDEpCi0gICAgLy8gd2l0aCBhIGRpZmYgb2YgMjU1LCBzcXVhcmVzLiBUaGF0IHdvdWxkIGEgbWF4IGVycm9yIG9mIDB4OGVlMDkwMCwKLSAgICAvLyB3aGljaCBmaXRzIGludG8gMzIgYml0cyBpbnRlZ2Vycy4KLSAgICBpbnQgeV8sIHhfOwotICAgIHVpbnQzMiB4bSA9IDAsIHltID0gMCwgeHhtID0gMCwgeHltID0gMCwgeXltID0gMDsKLSAgICBvcmcgKz0gKHlvIC0gS0VSTkVMKSAqIHN0cmlkZTE7Ci0gICAgb3JnICs9ICh4byAtIEtFUk5FTCk7Ci0gICAgcmVjICs9ICh5byAtIEtFUk5FTCkgKiBzdHJpZGUyOwotICAgIHJlYyArPSAoeG8gLSBLRVJORUwpOwotCi0gICAgZm9yICh5XyA9IDA7IHlfIDwgS0VSTkVMX1NJWkU7ICsreV8sIG9yZyArPSBzdHJpZGUxLCByZWMgKz0gc3RyaWRlMikKLSAgICB7Ci0gICAgICAgIGNvbnN0IGludCBXeSA9IEtbeV9dOwotCi0gICAgICAgIGZvciAoeF8gPSAwOyB4XyA8IEtFUk5FTF9TSVpFOyArK3hfKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgV3h5ID0gV3kgKiBLW3hfXTsKLSAgICAgICAgICAgIC8vIFRPRE8oc2thbCk6IGlubGluZWQgYXNzZW1ibHkKLSAgICAgICAgICAgIGNvbnN0IGludCBvcmdfeCA9IG9yZ1t4X107Ci0gICAgICAgICAgICBjb25zdCBpbnQgcmVjX3ggPSByZWNbeF9dOwotICAgICAgICAgICAgeG0gICs9IFd4eSAqIG9yZ194OwotICAgICAgICAgICAgeW0gICs9IFd4eSAqIHJlY194OwotICAgICAgICAgICAgeHhtICs9IFd4eSAqIG9yZ194ICogb3JnX3g7Ci0gICAgICAgICAgICB4eW0gKz0gV3h5ICogb3JnX3ggKiByZWNfeDsKLSAgICAgICAgICAgIHl5bSArPSBXeHkgKiByZWNfeCAqIHJlY194OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgICBjb25zdCBkb3VibGUgaXcgPSBraV93OwotICAgICAgICBjb25zdCBkb3VibGUgaXd4ID0geG0gKiBpdzsKLSAgICAgICAgY29uc3QgZG91YmxlIGl3eSA9IHltICogaXc7Ci0gICAgICAgIGRvdWJsZSBzeHggPSB4eG0gKiBpdyAtIGl3eCAqIGl3eDsKLSAgICAgICAgZG91YmxlIHN5eSA9IHl5bSAqIGl3IC0gaXd5ICogaXd5OwotCi0gICAgICAgIC8vIHNtYWxsIGVycm9ycyBhcmUgcG9zc2libGUsIGR1ZSB0byByb3VuZGluZy4gQ2xhbXAgdG8gemVyby4KLSAgICAgICAgaWYgKHN4eCA8IDAuKSBzeHggPSAwLjsKLQotICAgICAgICBpZiAoc3l5IDwgMC4pIHN5eSA9IDAuOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzeHN5ID0gc3FydChzeHggKiBzeXkpOwotICAgICAgICAgICAgY29uc3QgZG91YmxlIHN4eSA9IHh5bSAqIGl3IC0gaXd4ICogaXd5OwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBDMTEgPSAoMC4wMSAqIDAuMDEpICogKDI1NSAqIDI1NSk7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIEMyMiA9ICgwLjAzICogMC4wMykgKiAoMjU1ICogMjU1KTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgQzMzID0gKDAuMDE1ICogMC4wMTUpICogKDI1NSAqIDI1NSk7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgbCA9ICgyLiAqIGl3eCAqIGl3eSArIEMxMSkgLyAoaXd4ICogaXd4ICsgaXd5ICogaXd5ICsgQzExKTsKLSAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBjID0gKDIuICogc3hzeSAgICAgICsgQzIyKSAvIChzeHggKyBzeXkgKyBDMjIpOwotICAgICAgICAgICAgY29uc3QgZG91YmxlIHMgPSAoc3h5ICsgQzMzKSAvIChzeHN5ICsgQzMzKTsKLSAgICAgICAgICAgIHJldHVybiBsICogYyAqIHM7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWRvdWJsZSBjYWxjX3NzaW1nKGNvbnN0IHVpbnQ4ICpvcmcsIGNvbnN0IHVpbnQ4ICpyZWMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW1hZ2Vfd2lkdGgsIGNvbnN0IGludCBpbWFnZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RyaWRlMSwgY29uc3QgaW50IHN0cmlkZTIKLSAgICAgICAgICAgICAgICAgKQotewotICAgIGludCBqLCBpOwotICAgIGRvdWJsZSBTU0lNID0gMC47Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgS0VSTkVMOyArK2opCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2Vfd2lkdGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgU1NJTSArPSBnZXRfc3NpbWcob3JnLCByZWMsIGksIGosIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIHN0cmlkZTEsIHN0cmlkZTIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChqID0gS0VSTkVMOyBqIDwgaW1hZ2VfaGVpZ2h0IC0gS0VSTkVMOyArK2opCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgS0VSTkVMOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNTSU0gKz0gZ2V0X3NzaW1nKG9yZywgcmVjLCBpLCBqLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBzdHJpZGUxLCBzdHJpZGUyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IEtFUk5FTDsgaSA8IGltYWdlX3dpZHRoIC0gS0VSTkVMOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNTSU0gKz0gZ2V0X3NzaW1mdWxsX2tlcm5lbGcob3JnLCByZWMsIGksIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIHN0cmlkZTEsIHN0cmlkZTIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGggLSBLRVJORUw7IGkgPCBpbWFnZV93aWR0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTU0lNICs9IGdldF9zc2ltZyhvcmcsIHJlYywgaSwgaiwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgc3RyaWRlMSwgc3RyaWRlMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGogPSBpbWFnZV9oZWlnaHQgLSBLRVJORUw7IGogPCBpbWFnZV9oZWlnaHQ7ICsraikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZV93aWR0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTU0lNICs9IGdldF9zc2ltZyhvcmcsIHJlYywgaSwgaiwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgc3RyaWRlMSwgc3RyaWRlMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU1NJTTsKLX0KLQotCi1kb3VibGUgdnA4X2NhbGNfc3NpbWcKLSgKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnNvdXJjZSwKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRlc3QsCi0gICAgZG91YmxlICpzc2ltX3ksCi0gICAgZG91YmxlICpzc2ltX3UsCi0gICAgZG91YmxlICpzc2ltX3YKLSkKLXsKLSAgICBkb3VibGUgc3NpbV9hbGwgPSAwOwotICAgIGludCB5c2l6ZSAgPSBzb3VyY2UtPnlfd2lkdGggKiBzb3VyY2UtPnlfaGVpZ2h0OwotICAgIGludCB1dnNpemUgPSB5c2l6ZSAvIDQ7Ci0KLSAgICAqc3NpbV95ID0gY2FsY19zc2ltZyhzb3VyY2UtPnlfYnVmZmVyLCBkZXN0LT55X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnlfd2lkdGgsIHNvdXJjZS0+eV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLT55X3N0cmlkZSwgZGVzdC0+eV9zdHJpZGUpOwotCi0KLSAgICAqc3NpbV91ID0gY2FsY19zc2ltZyhzb3VyY2UtPnVfYnVmZmVyLCBkZXN0LT51X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnV2X3dpZHRoLCBzb3VyY2UtPnV2X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnV2X3N0cmlkZSwgZGVzdC0+dXZfc3RyaWRlKTsKLQotCi0gICAgKnNzaW1fdiA9IGNhbGNfc3NpbWcoc291cmNlLT52X2J1ZmZlciwgZGVzdC0+dl9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLT51dl93aWR0aCwgc291cmNlLT51dl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLT51dl9zdHJpZGUsIGRlc3QtPnV2X3N0cmlkZSk7Ci0KLSAgICBzc2ltX2FsbCA9ICgqc3NpbV95ICsgKnNzaW1fdSArICpzc2ltX3YpIC8gKHlzaXplICsgdXZzaXplICsgdXZzaXplKTsKLSAgICAqc3NpbV95IC89IHlzaXplOwotICAgICpzc2ltX3UgLz0gdXZzaXplOwotICAgICpzc2ltX3YgLz0gdXZzaXplOwotICAgIHJldHVybiBzc2ltX2FsbDsKLX0KLQotCi12b2lkIHNzaW1fcGFybXNfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgKnMsCi0gICAgaW50IHNwLAotICAgIHVuc2lnbmVkIGNoYXIgKnIsCi0gICAgaW50IHJwLAotICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zLAotICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9yLAotICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9zLAotICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9yLAotICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zeHIKLSkKLXsKLSAgICBpbnQgaSxqOwotICAgIGZvcihpPTA7aTwxNjtpKysscys9c3Ascis9cnApCi0gICAgIHsKLSAgICAgICAgIGZvcihqPTA7ajwxNjtqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgKnN1bV9zICs9IHNbal07Ci0gICAgICAgICAgICAgKnN1bV9yICs9IHJbal07Ci0gICAgICAgICAgICAgKnN1bV9zcV9zICs9IHNbal0gKiBzW2pdOwotICAgICAgICAgICAgICpzdW1fc3FfciArPSByW2pdICogcltqXTsKLSAgICAgICAgICAgICAqc3VtX3N4ciArPSBzW2pdICogcltqXTsKLSAgICAgICAgIH0KLSAgICAgfQotfQotdm9pZCBzc2ltX3Bhcm1zXzh4OF9jCi0oCi0gICAgdW5zaWduZWQgY2hhciAqcywKLSAgICBpbnQgc3AsCi0gICAgdW5zaWduZWQgY2hhciAqciwKLSAgICBpbnQgcnAsCi0gICAgdW5zaWduZWQgbG9uZyAqc3VtX3MsCi0gICAgdW5zaWduZWQgbG9uZyAqc3VtX3IsCi0gICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3MsCi0gICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3IsCi0gICAgdW5zaWduZWQgbG9uZyAqc3VtX3N4cgotKQotewotICAgIGludCBpLGo7Ci0gICAgZm9yKGk9MDtpPDg7aSsrLHMrPXNwLHIrPXJwKQotICAgICB7Ci0gICAgICAgICBmb3Ioaj0wO2o8ODtqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgKnN1bV9zICs9IHNbal07Ci0gICAgICAgICAgICAgKnN1bV9yICs9IHJbal07Ci0gICAgICAgICAgICAgKnN1bV9zcV9zICs9IHNbal0gKiBzW2pdOwotICAgICAgICAgICAgICpzdW1fc3FfciArPSByW2pdICogcltqXTsKLSAgICAgICAgICAgICAqc3VtX3N4ciArPSBzW2pdICogcltqXTsKLSAgICAgICAgIH0KLSAgICAgfQotfQotCi1jb25zdCBzdGF0aWMgbG9uZyBsb25nIGMxID0gIDQyNjE0ODsgLy8gKDI1Nl4yKiguMDEqMjU1KV4yCi1jb25zdCBzdGF0aWMgbG9uZyBsb25nIGMyID0gMzgzNTMzMTsgLy8oMjU2XjIqKC4wMyoyNTUpXjIKLQotc3RhdGljIGRvdWJsZSBzaW1pbGFyaXR5Ci0oCi0gICAgdW5zaWduZWQgbG9uZyBzdW1fcywKLSAgICB1bnNpZ25lZCBsb25nIHN1bV9yLAotICAgIHVuc2lnbmVkIGxvbmcgc3VtX3NxX3MsCi0gICAgdW5zaWduZWQgbG9uZyBzdW1fc3FfciwKLSAgICB1bnNpZ25lZCBsb25nIHN1bV9zeHIsCi0gICAgaW50IGNvdW50Ci0pCi17Ci0gICAgbG9uZyBsb25nIHNzaW1fbiA9ICgyKnN1bV9zKnN1bV9yKyBjMSkqKDIqY291bnQqc3VtX3N4ci0yKnN1bV9zKnN1bV9yK2MyKTsKLQotICAgIGxvbmcgbG9uZyBzc2ltX2QgPSAoc3VtX3Mqc3VtX3MgK3N1bV9yKnN1bV9yK2MxKSoKLSAgICAgICAgICAgIChjb3VudCpzdW1fc3Ffcy1zdW1fcypzdW1fcyArIGNvdW50KnN1bV9zcV9yLXN1bV9yKnN1bV9yICtjMikgOwotCi0gICAgcmV0dXJuIHNzaW1fbiAqIDEuMCAvIHNzaW1fZDsKLX0KLQotc3RhdGljIGRvdWJsZSBzc2ltXzE2eDE2KHVuc2lnbmVkIGNoYXIgKnMsaW50IHNwLCB1bnNpZ25lZCBjaGFyICpyLGludCBycCwKLSAgICAgICAgICAgIGNvbnN0IHZwOF92YXJpYW5jZV9ydGNkX3Z0YWJsZV90ICpydGNkKQotewotICAgIHVuc2lnbmVkIGxvbmcgc3VtX3M9MCxzdW1fcj0wLHN1bV9zcV9zPTAsc3VtX3NxX3I9MCxzdW1fc3hyPTA7Ci0gICAgcnRjZC0+c3NpbXBmKHMsIHNwLCByLCBycCwgJnN1bV9zLCAmc3VtX3IsICZzdW1fc3FfcywgJnN1bV9zcV9yLCAmc3VtX3N4cik7Ci0gICAgcmV0dXJuIHNpbWlsYXJpdHkoc3VtX3MsIHN1bV9yLCBzdW1fc3Ffcywgc3VtX3NxX3IsIHN1bV9zeHIsIDI1Nik7Ci19Ci1zdGF0aWMgZG91YmxlIHNzaW1fOHg4KHVuc2lnbmVkIGNoYXIgKnMsaW50IHNwLCB1bnNpZ25lZCBjaGFyICpyLGludCBycCwKLSAgICAgICAgICAgICAgICBjb25zdCB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAqcnRjZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHN1bV9zPTAsc3VtX3I9MCxzdW1fc3Ffcz0wLHN1bV9zcV9yPTAsc3VtX3N4cj0wOwotICAgIHJ0Y2QtPnNzaW1wZl84eDgocywgc3AsIHIsIHJwLCAmc3VtX3MsICZzdW1fciwgJnN1bV9zcV9zLCAmc3VtX3NxX3IsICZzdW1fc3hyKTsKLSAgICByZXR1cm4gc2ltaWxhcml0eShzdW1fcywgc3VtX3IsIHN1bV9zcV9zLCBzdW1fc3Ffciwgc3VtX3N4ciwgNjQpOwotfQotCi0vLyBUT0RPOiAoamJiKSB0cmllZCB0byBzY2FsZSB0aGlzIGZ1bmN0aW9uIHN1Y2ggdGhhdCB3ZSBtYXkgYmUgYWJsZSB0byB1c2UgaXQKLS8vIGZvciBkaXN0b3J0aW9uIG1ldHJpYyBpbiBtb2RlIHNlbGVjdGlvbiBjb2RlICggcHJvdmlkZWQgd2UgZG8gYSByZWNvbnN0cnVjdGlvbikKLWxvbmcgZHNzaW0odW5zaWduZWQgY2hhciAqcyxpbnQgc3AsIHVuc2lnbmVkIGNoYXIgKnIsaW50IHJwLAotICAgICAgICAgICBjb25zdCB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAqcnRjZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHN1bV9zPTAsc3VtX3I9MCxzdW1fc3Ffcz0wLHN1bV9zcV9yPTAsc3VtX3N4cj0wOwotICAgIGRvdWJsZSBzc2ltMzsKLSAgICBsb25nIGxvbmcgc3NpbV9uOwotICAgIGxvbmcgbG9uZyBzc2ltX2Q7Ci0KLSAgICBydGNkLT5zc2ltcGYocywgc3AsIHIsIHJwLCAmc3VtX3MsICZzdW1fciwgJnN1bV9zcV9zLCAmc3VtX3NxX3IsICZzdW1fc3hyKTsKLSAgICBzc2ltX24gPSAoMipzdW1fcypzdW1fcisgYzEpKigyKjI1NipzdW1fc3hyLTIqc3VtX3Mqc3VtX3IrYzIpOwotCi0gICAgc3NpbV9kID0gKHN1bV9zKnN1bV9zICtzdW1fcipzdW1fcitjMSkqCi0gICAgICAgICAgICAoMjU2KnN1bV9zcV9zLXN1bV9zKnN1bV9zICsgMjU2KnN1bV9zcV9yLXN1bV9yKnN1bV9yICtjMikgOwotCi0gICAgc3NpbTMgPSAyNTYgKiAoc3NpbV9kLXNzaW1fbikgLyBzc2ltX2Q7Ci0gICAgcmV0dXJuIChsb25nKSggMjU2KnNzaW0zICogc3NpbTMgKTsKLX0KLS8vIFRPRE86IChqYmIpIHRoaXMgOHg4IHdpbmRvdyBtaWdodCBiZSB0b28gYmlnICsgd2UgbWF5IHdhbnQgdG8gcGljayBwaXhlbHMKLS8vIHN1Y2ggdGhhdCB0aGUgd2luZG93IHJlZ2lvbnMgb3ZlcmxhcCBibG9jayBib3VuZGFyaWVzIHRvIHBlbmFsaXplIGJsb2NraW5nCi0vLyBhcnRpZmFjdHMuCi0KLWRvdWJsZSB2cDhfc3NpbTIKLSgKLSAgICB1bnNpZ25lZCBjaGFyICppbWcxLAotICAgIHVuc2lnbmVkIGNoYXIgKmltZzIsCi0gICAgaW50IHN0cmlkZV9pbWcxLAotICAgIGludCBzdHJpZGVfaW1nMiwKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBjb25zdCB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAqcnRjZAotKQotewotICAgIGludCBpLGo7Ci0KLSAgICBkb3VibGUgc3NpbV90b3RhbD0wOwotCi0gICAgLy8gd2UgY2FuIHNhbXBsZSBwb2ludHMgYXMgZnJlcXVlbnRseSBhcyB3ZSBsaWtlIHN0YXJ0IHdpdGggMSBwZXIgOHg4Ci0gICAgZm9yKGk9MDsgaSA8IGhlaWdodDsgaSs9OCwgaW1nMSArPSBzdHJpZGVfaW1nMSo4LCBpbWcyICs9IHN0cmlkZV9pbWcyKjgpCi0gICAgewotICAgICAgICBmb3Ioaj0wOyBqIDwgd2lkdGg7IGorPTggKQotICAgICAgICB7Ci0gICAgICAgICAgICBzc2ltX3RvdGFsICs9IHNzaW1fOHg4KGltZzEsIHN0cmlkZV9pbWcxLCBpbWcyLCBzdHJpZGVfaW1nMiwgcnRjZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3NpbV90b3RhbCAvPSAod2lkdGgvOCAqIGhlaWdodCAvOCk7Ci0gICAgcmV0dXJuIHNzaW1fdG90YWw7Ci0KLX0KLWRvdWJsZSB2cDhfY2FsY19zc2ltCi0oCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpzb3VyY2UsCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpkZXN0LAotICAgIGludCBsdW1hbWFzaywKLSAgICBkb3VibGUgKndlaWdodCwKLSAgICBjb25zdCB2cDhfdmFyaWFuY2VfcnRjZF92dGFibGVfdCAqcnRjZAotKQotewotICAgIGRvdWJsZSBhLCBiLCBjOwotICAgIGRvdWJsZSBzc2ltdjsKLQotICAgIGEgPSB2cDhfc3NpbTIoc291cmNlLT55X2J1ZmZlciwgZGVzdC0+eV9idWZmZXIsCi0gICAgICAgICAgICAgICAgIHNvdXJjZS0+eV9zdHJpZGUsIGRlc3QtPnlfc3RyaWRlLCBzb3VyY2UtPnlfd2lkdGgsCi0gICAgICAgICAgICAgICAgIHNvdXJjZS0+eV9oZWlnaHQsIHJ0Y2QpOwotCi0gICAgYiA9IHZwOF9zc2ltMihzb3VyY2UtPnVfYnVmZmVyLCBkZXN0LT51X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgc291cmNlLT51dl9zdHJpZGUsIGRlc3QtPnV2X3N0cmlkZSwgc291cmNlLT51dl93aWR0aCwKLSAgICAgICAgICAgICAgICAgc291cmNlLT51dl9oZWlnaHQsIHJ0Y2QpOwotCi0gICAgYyA9IHZwOF9zc2ltMihzb3VyY2UtPnZfYnVmZmVyLCBkZXN0LT52X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgc291cmNlLT51dl9zdHJpZGUsIGRlc3QtPnV2X3N0cmlkZSwgc291cmNlLT51dl93aWR0aCwKLSAgICAgICAgICAgICAgICAgc291cmNlLT51dl9oZWlnaHQsIHJ0Y2QpOwotCi0gICAgc3NpbXYgPSBhICogLjggKyAuMSAqIChiICsgYyk7Ci0KLSAgICAqd2VpZ2h0ID0gMTsKLQotICAgIHJldHVybiBzc2ltdjsKLX0KZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3RlbXBvcmFsX2ZpbHRlci5jIGIvdnA4L2VuY29kZXIvdGVtcG9yYWxfZmlsdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzZiMjIuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvdGVtcG9yYWxfZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cDgvY29tbW9uL29ueXhjX2ludC5oIgotI2luY2x1ZGUgIm9ueXhfaW50LmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zeXN0ZW1kZXBlbmRlbnQuaCIKLSNpbmNsdWRlICJxdWFudGl6ZS5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vYWxsb2Njb21tb24uaCIKLSNpbmNsdWRlICJtY29tcC5oIgotI2luY2x1ZGUgImZpcnN0cGFzcy5oIgotI2luY2x1ZGUgInBzbnIuaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2V4dGVuZC5oIgotI2luY2x1ZGUgInJhdGVjdHJsLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9xdWFudF9jb21tb24uaCIKLSNpbmNsdWRlICJzZWdtZW50YXRpb24uaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL2dfY29tbW9uLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJleHRlbmQuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3Bvc3Rwcm9jLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9zd2FweXYxMmJ1ZmZlci5oIgotI2luY2x1ZGUgInZwOC9jb21tb24vdGhyZWFkaW5nLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL3ZweF90aW1lci5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jZGVmaW5lIEFMVF9SRUZfTUNfRU5BQkxFRCAxICAgIC8vIGRpcy9lbmFibGUgTUMgaW4gQWx0UmVmIGZpbHRlcmluZwotI2RlZmluZSBBTFRfUkVGX1NVQlBFTF9FTkFCTEVEIDEgLy8gZGlzL2VuYWJsZSBzdWJwZWwgaW4gTUMgQWx0UmVmIGZpbHRlcmluZwotCi0jaWYgVlA4X1RFTVBPUkFMX0FMVF9SRUYKLQotc3RhdGljIHZvaWQgdnA4X3RlbXBvcmFsX2ZpbHRlcl9wcmVkaWN0b3JzX21iX2MKLSgKLSAgICBNQUNST0JMT0NLRCAqeCwKLSAgICB1bnNpZ25lZCBjaGFyICp5X21iX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICp1X21iX3B0ciwKLSAgICB1bnNpZ25lZCBjaGFyICp2X21iX3B0ciwKLSAgICBpbnQgc3RyaWRlLAotICAgIGludCBtdl9yb3csCi0gICAgaW50IG12X2NvbCwKLSAgICB1bnNpZ25lZCBjaGFyICpwcmVkCi0pCi17Ci0gICAgaW50IG9mZnNldDsKLSAgICB1bnNpZ25lZCBjaGFyICp5cHRyLCAqdXB0ciwgKnZwdHI7Ci0KLSAgICAvLyBZCi0gICAgeXB0ciA9IHlfbWJfcHRyICsgKG12X3JvdyA+PiAzKSAqIHN0cmlkZSArIChtdl9jb2wgPj4gMyk7Ci0KLSAgICBpZiAoKG12X3JvdyB8IG12X2NvbCkgJiA3KQotICAgIHsKLSAgICAgICAgeC0+c3VicGl4ZWxfcHJlZGljdDE2eDE2KHlwdHIsIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsICZwcmVkWzBdLCAxNik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFJFQ09OX0lOVk9LRSgmeC0+cnRjZC0+cmVjb24sIGNvcHkxNngxNikoeXB0ciwgc3RyaWRlLCAmcHJlZFswXSwgMTYpOwotICAgIH0KLQotICAgIC8vIFUgJiBWCi0gICAgbXZfcm93ID4+PSAxOwotICAgIG12X2NvbCA+Pj0gMTsKLSAgICBzdHJpZGUgPSAoc3RyaWRlICsgMSkgPj4gMTsKLSAgICBvZmZzZXQgPSAobXZfcm93ID4+IDMpICogc3RyaWRlICsgKG12X2NvbCA+PiAzKTsKLSAgICB1cHRyID0gdV9tYl9wdHIgKyBvZmZzZXQ7Ci0gICAgdnB0ciA9IHZfbWJfcHRyICsgb2Zmc2V0OwotCi0gICAgaWYgKChtdl9yb3cgfCBtdl9jb2wpICYgNykKLSAgICB7Ci0gICAgICAgIHgtPnN1YnBpeGVsX3ByZWRpY3Q4eDgodXB0ciwgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NvbCAmIDcsIG12X3JvdyAmIDcsICZwcmVkWzI1Nl0sIDgpOwotICAgICAgICB4LT5zdWJwaXhlbF9wcmVkaWN0OHg4KHZwdHIsIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jb2wgJiA3LCBtdl9yb3cgJiA3LCAmcHJlZFszMjBdLCA4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTh4OCkodXB0ciwgc3RyaWRlLCAmcHJlZFsyNTZdLCA4KTsKLSAgICAgICAgUkVDT05fSU5WT0tFKCZ4LT5ydGNkLT5yZWNvbiwgY29weTh4OCkodnB0ciwgc3RyaWRlLCAmcHJlZFszMjBdLCA4KTsKLSAgICB9Ci19Ci12b2lkIHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfYwotKAotICAgIHVuc2lnbmVkIGNoYXIgKmZyYW1lMSwKLSAgICB1bnNpZ25lZCBpbnQgc3RyaWRlLAotICAgIHVuc2lnbmVkIGNoYXIgKmZyYW1lMiwKLSAgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwKLSAgICBpbnQgc3RyZW5ndGgsCi0gICAgaW50IGZpbHRlcl93ZWlnaHQsCi0gICAgdW5zaWduZWQgaW50ICphY2N1bXVsYXRvciwKLSAgICB1bnNpZ25lZCBzaG9ydCAqY291bnQKLSkKLXsKLSAgICBpbnQgaSwgaiwgazsKLSAgICBpbnQgbW9kaWZpZXI7Ci0gICAgaW50IGJ5dGUgPSAwOwotCi0gICAgZm9yIChpID0gMCxrID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja19zaXplOyBqKyssIGsrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBpbnQgc3JjX2J5dGUgPSBmcmFtZTFbYnl0ZV07Ci0gICAgICAgICAgICBpbnQgcGl4ZWxfdmFsdWUgPSAqZnJhbWUyKys7Ci0KLSAgICAgICAgICAgIG1vZGlmaWVyICAgPSBzcmNfYnl0ZSAtIHBpeGVsX3ZhbHVlOwotICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnRlZ2VyIGFwcHJveGltYXRpb24gb2Y6Ci0gICAgICAgICAgICAvLyBmbG9hdCBjb2VmZiA9ICgzLjAgKiBtb2RpZmVyICogbW9kaWZpZXIpIC8gcG93KDIsIHN0cmVuZ3RoKTsKLSAgICAgICAgICAgIC8vIG1vZGlmaWVyID0gIChpbnQpcm91bmRmKGNvZWZmID4gMTYgPyAwIDogMTYtY29lZmYpOwotICAgICAgICAgICAgbW9kaWZpZXIgICo9IG1vZGlmaWVyOwotICAgICAgICAgICAgbW9kaWZpZXIgICo9IDM7Ci0gICAgICAgICAgICBtb2RpZmllciAgKz0gMSA8PCAoc3RyZW5ndGggLSAxKTsKLSAgICAgICAgICAgIG1vZGlmaWVyID4+PSBzdHJlbmd0aDsKLQotICAgICAgICAgICAgaWYgKG1vZGlmaWVyID4gMTYpCi0gICAgICAgICAgICAgICAgbW9kaWZpZXIgPSAxNjsKLQotICAgICAgICAgICAgbW9kaWZpZXIgPSAxNiAtIG1vZGlmaWVyOwotICAgICAgICAgICAgbW9kaWZpZXIgKj0gZmlsdGVyX3dlaWdodDsKLQotICAgICAgICAgICAgY291bnRba10gKz0gbW9kaWZpZXI7Ci0gICAgICAgICAgICBhY2N1bXVsYXRvcltrXSArPSBtb2RpZmllciAqIHBpeGVsX3ZhbHVlOwotCi0gICAgICAgICAgICBieXRlKys7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlICs9IHN0cmlkZSAtIGJsb2NrX3NpemU7Ci0gICAgfQotfQotCi0jaWYgQUxUX1JFRl9NQ19FTkFCTEVECi1zdGF0aWMgaW50IGR1bW15X2Nvc3RbMiptdl9tYXgrMV07Ci0KLXN0YXRpYyBpbnQgdnA4X3RlbXBvcmFsX2ZpbHRlcl9maW5kX21hdGNoaW5nX21iX2MKLSgKLSAgICBWUDhfQ09NUCAqY3BpLAotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqYXJmX2ZyYW1lLAotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZnJhbWVfcHRyLAotICAgIGludCBtYl9vZmZzZXQsCi0gICAgaW50IGVycm9yX3RocmVzaAotKQotewotICAgIE1BQ1JPQkxPQ0sgKnggPSAmY3BpLT5tYjsKLSAgICBpbnQgdGhpc3NtZTsKLSAgICBpbnQgc3RlcF9wYXJhbTsKLSAgICBpbnQgZnVydGhlcl9zdGVwczsKLSAgICBpbnQgbiA9IDA7Ci0gICAgaW50IHNhZHBiID0geC0+c2FkcGVyYml0MTY7Ci0gICAgaW50IGJlc3RzbWUgPSBJTlRfTUFYOwotICAgIGludCBudW0wMCA9IDA7Ci0KLSAgICBCTE9DSyAqYiA9ICZ4LT5ibG9ja1swXTsKLSAgICBCTE9DS0QgKmQgPSAmeC0+ZV9tYmQuYmxvY2tbMF07Ci0gICAgTVYgYmVzdF9yZWZfbXYxID0gezAsMH07Ci0KLSAgICBpbnQgKm12Y29zdFsyXSAgICA9IHsgJmR1bW15X2Nvc3RbbXZfbWF4KzFdLCAmZHVtbXlfY29zdFttdl9tYXgrMV0gfTsKLSAgICBpbnQgKm12c2FkY29zdFsyXSA9IHsgJmR1bW15X2Nvc3RbbXZfbWF4KzFdLCAmZHVtbXlfY29zdFttdl9tYXgrMV0gfTsKLQotICAgIC8vIFNhdmUgaW5wdXQgc3RhdGUKLSAgICB1bnNpZ25lZCBjaGFyICoqYmFzZV9zcmMgPSBiLT5iYXNlX3NyYzsKLSAgICBpbnQgc3JjID0gYi0+c3JjOwotICAgIGludCBzcmNfc3RyaWRlID0gYi0+c3JjX3N0cmlkZTsKLSAgICB1bnNpZ25lZCBjaGFyICoqYmFzZV9wcmUgPSBkLT5iYXNlX3ByZTsKLSAgICBpbnQgcHJlID0gZC0+cHJlOwotICAgIGludCBwcmVfc3RyaWRlID0gZC0+cHJlX3N0cmlkZTsKLQotICAgIC8vIFNldHVwIGZyYW1lIHBvaW50ZXJzCi0gICAgYi0+YmFzZV9zcmMgPSAmYXJmX2ZyYW1lLT55X2J1ZmZlcjsKLSAgICBiLT5zcmNfc3RyaWRlID0gYXJmX2ZyYW1lLT55X3N0cmlkZTsKLSAgICBiLT5zcmMgPSBtYl9vZmZzZXQ7Ci0KLSAgICBkLT5iYXNlX3ByZSA9ICZmcmFtZV9wdHItPnlfYnVmZmVyOwotICAgIGQtPnByZV9zdHJpZGUgPSBmcmFtZV9wdHItPnlfc3RyaWRlOwotICAgIGQtPnByZSA9IG1iX29mZnNldDsKLQotICAgIC8vIEZ1cnRoZXIgc3RlcC9kaWFtb25kIHNlYXJjaGVzIGFzIG5lY2Vzc2FyeQotICAgIGlmIChjcGktPlNwZWVkIDwgOCkKLSAgICB7Ci0gICAgICAgIHN0ZXBfcGFyYW0gPSBjcGktPnNmLmZpcnN0X3N0ZXAgKwotICAgICAgICAgICAgICAgICAgICAoKGNwaS0+U3BlZWQgPiA1KSA/IDEgOiAwKTsKLSAgICAgICAgZnVydGhlcl9zdGVwcyA9Ci0gICAgICAgICAgICAoY3BpLT5zZi5tYXhfc3RlcF9zZWFyY2hfc3RlcHMgLSAxKS1zdGVwX3BhcmFtOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdGVwX3BhcmFtID0gY3BpLT5zZi5maXJzdF9zdGVwICsgMjsKLSAgICAgICAgZnVydGhlcl9zdGVwcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKDEvKmNwaS0+c2Yuc2VhcmNoX21ldGhvZCA9PSBIRVgqLykKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gQ2hlY2sgdGhhdCB0aGUgMTZ4MTYgdmYgJiBzZGYgYXJlIHNlbGVjdGVkIGhlcmUKLSAgICAgICAgYmVzdHNtZSA9IHZwOF9oZXhfc2VhcmNoKHgsIGIsIGQsCi0gICAgICAgICAgICAmYmVzdF9yZWZfbXYxLCAmZC0+Ym1pLm12LmFzX212LAotICAgICAgICAgICAgc3RlcF9wYXJhbSwKLSAgICAgICAgICAgIHNhZHBiLyp4LT5lcnJvcnBlcmJpdCovLAotICAgICAgICAgICAgJm51bTAwLCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAotICAgICAgICAgICAgbXZzYWRjb3N0LCBtdmNvc3QsICZiZXN0X3JlZl9tdjEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgbXZfeCwgbXZfeTsKLQotICAgICAgICBiZXN0c21lID0gY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYiwgZCwKLSAgICAgICAgICAgICZiZXN0X3JlZl9tdjEsICZkLT5ibWkubXYuYXNfbXYsCi0gICAgICAgICAgICBzdGVwX3BhcmFtLAotICAgICAgICAgICAgc2FkcGIgLyAyLyp4LT5lcnJvcnBlcmJpdCovLAotICAgICAgICAgICAgJm51bTAwLCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAotICAgICAgICAgICAgbXZzYWRjb3N0LCBtdmNvc3QsICZiZXN0X3JlZl9tdjEpOyAvL3NhZHBiIDwgOQotCi0gICAgICAgIC8vIEZ1cnRoZXIgc3RlcC9kaWFtb25kIHNlYXJjaGVzIGFzIG5lY2Vzc2FyeQotICAgICAgICBuID0gMDsKLSAgICAgICAgLy9mdXJ0aGVyX3N0ZXBzID0gKGNwaS0+c2YubWF4X3N0ZXBfc2VhcmNoX3N0ZXBzIC0gMSkgLSBzdGVwX3BhcmFtOwotCi0gICAgICAgIG4gPSBudW0wMDsKLSAgICAgICAgbnVtMDAgPSAwOwotCi0gICAgICAgIHdoaWxlIChuIDwgZnVydGhlcl9zdGVwcykKLSAgICAgICAgewotICAgICAgICAgICAgbisrOwotCi0gICAgICAgICAgICBpZiAobnVtMDApCi0gICAgICAgICAgICAgICAgbnVtMDAtLTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzc21lID0gY3BpLT5kaWFtb25kX3NlYXJjaF9zYWQoeCwgYiwgZCwKLSAgICAgICAgICAgICAgICAgICAgJmJlc3RfcmVmX212MSwgJmQtPmJtaS5tdi5hc19tdiwKLSAgICAgICAgICAgICAgICAgICAgc3RlcF9wYXJhbSArIG4sCi0gICAgICAgICAgICAgICAgICAgIHNhZHBiIC8gNC8qeC0+ZXJyb3JwZXJiaXQqLywKLSAgICAgICAgICAgICAgICAgICAgJm51bTAwLCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAotICAgICAgICAgICAgICAgICAgICBtdnNhZGNvc3QsIG12Y29zdCwgJmJlc3RfcmVmX212MSk7IC8vc2FkcGIgPSA5Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhpc3NtZSA8IGJlc3RzbWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZXN0c21lID0gdGhpc3NtZTsKLSAgICAgICAgICAgICAgICAgICAgbXZfeSA9IGQtPmJtaS5tdi5hc19tdi5yb3c7Ci0gICAgICAgICAgICAgICAgICAgIG12X3ggPSBkLT5ibWkubXYuYXNfbXYuY29sOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkLT5ibWkubXYuYXNfbXYucm93ID0gbXZfeTsKLSAgICAgICAgICAgICAgICAgICAgZC0+Ym1pLm12LmFzX212LmNvbCA9IG12X3g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWYgQUxUX1JFRl9TVUJQRUxfRU5BQkxFRAotICAgIC8vIFRyeSBzdWItcGl4ZWwgTUM/Ci0gICAgLy9pZiAoYmVzdHNtZSA+IGVycm9yX3RocmVzaCAmJiBiZXN0c21lIDwgSU5UX01BWCkKLSAgICB7Ci0gICAgICAgIGJlc3RzbWUgPSBjcGktPmZpbmRfZnJhY3Rpb25hbF9tdl9zdGVwKHgsIGIsIGQsCi0gICAgICAgICAgICAgICAgICAgICZkLT5ibWkubXYuYXNfbXYsICZiZXN0X3JlZl9tdjEsCi0gICAgICAgICAgICAgICAgICAgIHgtPmVycm9ycGVyYml0LCAmY3BpLT5mbl9wdHJbQkxPQ0tfMTZYMTZdLAotICAgICAgICAgICAgICAgICAgICBtdmNvc3QpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gU2F2ZSBpbnB1dCBzdGF0ZQotICAgIGItPmJhc2Vfc3JjID0gYmFzZV9zcmM7Ci0gICAgYi0+c3JjID0gc3JjOwotICAgIGItPnNyY19zdHJpZGUgPSBzcmNfc3RyaWRlOwotICAgIGQtPmJhc2VfcHJlID0gYmFzZV9wcmU7Ci0gICAgZC0+cHJlID0gcHJlOwotICAgIGQtPnByZV9zdHJpZGUgPSBwcmVfc3RyaWRlOwotCi0gICAgcmV0dXJuIGJlc3RzbWU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgdnA4X3RlbXBvcmFsX2ZpbHRlcl9pdGVyYXRlX2MKLSgKLSAgICBWUDhfQ09NUCAqY3BpLAotICAgIGludCBmcmFtZV9jb3VudCwKLSAgICBpbnQgYWx0X3JlZl9pbmRleCwKLSAgICBpbnQgc3RyZW5ndGgKLSkKLXsKLSAgICBpbnQgYnl0ZTsKLSAgICBpbnQgZnJhbWU7Ci0gICAgaW50IG1iX2NvbCwgbWJfcm93OwotICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfd2VpZ2h0OwotICAgIGludCBtYl9jb2xzID0gY3BpLT5jb21tb24ubWJfY29sczsKLSAgICBpbnQgbWJfcm93cyA9IGNwaS0+Y29tbW9uLm1iX3Jvd3M7Ci0gICAgaW50IE1CcyAgPSBjcGktPmNvbW1vbi5NQnM7Ci0gICAgaW50IG1iX3lfb2Zmc2V0ID0gMDsKLSAgICBpbnQgbWJfdXZfb2Zmc2V0ID0gMDsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIGludCwgYWNjdW11bGF0b3IsIDE2KjE2ICsgOCo4ICsgOCo4KTsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIHNob3J0LCBjb3VudCwgMTYqMTYgKyA4KjggKyA4KjgpOwotICAgIE1BQ1JPQkxPQ0tEICptYmQgPSAmY3BpLT5tYi5lX21iZDsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmYgPSBjcGktPmZyYW1lc1thbHRfcmVmX2luZGV4XTsKLSAgICB1bnNpZ25lZCBjaGFyICpkc3QxLCAqZHN0MjsKLSAgICBERUNMQVJFX0FMSUdORURfQVJSQVkoMTYsIHVuc2lnbmVkIGNoYXIsICBwcmVkaWN0b3IsIDE2KjE2ICsgOCo4ICsgOCo4KTsKLQotICAgIC8vIFNhdmUgaW5wdXQgc3RhdGUKLSAgICB1bnNpZ25lZCBjaGFyICp5X2J1ZmZlciA9IG1iZC0+cHJlLnlfYnVmZmVyOwotICAgIHVuc2lnbmVkIGNoYXIgKnVfYnVmZmVyID0gbWJkLT5wcmUudV9idWZmZXI7Ci0gICAgdW5zaWduZWQgY2hhciAqdl9idWZmZXIgPSBtYmQtPnByZS52X2J1ZmZlcjsKLQotICAgIGZvciAobWJfcm93ID0gMDsgbWJfcm93IDwgbWJfcm93czsgbWJfcm93KyspCi0gICAgewotI2lmIEFMVF9SRUZfTUNfRU5BQkxFRAotICAgICAgICAvLyBSZWR1Y2VkIHNlYXJjaCBleHRlbnQgYnkgMyBmb3IgNi10YXAgZmlsdGVyICYgc21hbGxlciBVTVYgYm9yZGVyCi0gICAgICAgIGNwaS0+bWIubXZfcm93X21pbiA9IC0oKG1iX3JvdyAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE5KSk7Ci0gICAgICAgIGNwaS0+bWIubXZfcm93X21heCA9ICgoY3BpLT5jb21tb24ubWJfcm93cyAtIDEgLSBtYl9yb3cpICogMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFZQOEJPUkRFUklOUElYRUxTIC0gMTkpOwotI2VuZGlmCi0KLSAgICAgICAgZm9yIChtYl9jb2wgPSAwOyBtYl9jb2wgPCBtYl9jb2xzOyBtYl9jb2wrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGksIGosIGssIHc7Ci0gICAgICAgICAgICBpbnQgd2VpZ2h0X2NhcDsKLSAgICAgICAgICAgIGludCBzdHJpZGU7Ci0KLSAgICAgICAgICAgIHZweF9tZW1zZXQoYWNjdW11bGF0b3IsIDAsIDM4NCpzaXplb2YodW5zaWduZWQgaW50KSk7Ci0gICAgICAgICAgICB2cHhfbWVtc2V0KGNvdW50LCAwLCAzODQqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7Ci0KLSNpZiBBTFRfUkVGX01DX0VOQUJMRUQKLSAgICAgICAgICAgIC8vIFJlZHVjZWQgc2VhcmNoIGV4dGVudCBieSAzIGZvciA2LXRhcCBmaWx0ZXIgJiBzbWFsbGVyIFVNViBib3JkZXIKLSAgICAgICAgICAgIGNwaS0+bWIubXZfY29sX21pbiA9IC0oKG1iX2NvbCAqIDE2KSArIChWUDhCT1JERVJJTlBJWEVMUyAtIDE5KSk7Ci0gICAgICAgICAgICBjcGktPm1iLm12X2NvbF9tYXggPSAoKGNwaS0+Y29tbW9uLm1iX2NvbHMgLSAxIC0gbWJfY29sKSAqIDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoVlA4Qk9SREVSSU5QSVhFTFMgLSAxOSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgZnJhbWVfY291bnQ7IGZyYW1lKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3BpLT5mcmFtZXNbZnJhbWVdID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgbWJkLT5ibG9ja1swXS5ibWkubXYuYXNfbXYucm93ID0gMDsKLSAgICAgICAgICAgICAgICBtYmQtPmJsb2NrWzBdLmJtaS5tdi5hc19tdi5jb2wgPSAwOwotCi0jaWYgQUxUX1JFRl9NQ19FTkFCTEVECi0jZGVmaW5lIFRIUkVTSF9MT1cgICAxMDAwMAotI2RlZmluZSBUSFJFU0hfSElHSCAgMjAwMDAKLQotICAgICAgICAgICAgICAgIC8vIEZpbmQgYmVzdCBtYXRjaCBpbiB0aGlzIGZyYW1lIGJ5IE1DCi0gICAgICAgICAgICAgICAgZXJyID0gdnA4X3RlbXBvcmFsX2ZpbHRlcl9maW5kX21hdGNoaW5nX21iX2MKLSAgICAgICAgICAgICAgICAgICAgICAoY3BpLAotICAgICAgICAgICAgICAgICAgICAgICBjcGktPmZyYW1lc1thbHRfcmVmX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNbZnJhbWVdLAotICAgICAgICAgICAgICAgICAgICAgICBtYl95X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgVEhSRVNIX0xPVyk7Ci0KLSNlbmRpZgotICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBoaWdoZXIgd2VpZ2h0IHRvIG1hdGNoaW5nIE1CIGlmIGl0J3MgZXJyb3IKLSAgICAgICAgICAgICAgICAvLyBzY29yZSBpcyBsb3dlci4gSWYgbm90IGFwcGx5aW5nIE1DIGRlZmF1bHQgYmVoYXZpb3IKLSAgICAgICAgICAgICAgICAvLyBpcyB0byB3ZWlnaHQgYWxsIE1CcyBlcXVhbC4KLSAgICAgICAgICAgICAgICBmaWx0ZXJfd2VpZ2h0ID0gZXJyPFRIUkVTSF9MT1cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBlcnI8VEhSRVNIX0hJR0ggPyAxIDogMDsKLQotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfd2VpZ2h0ICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHByZWRpY3RvcnMKLSAgICAgICAgICAgICAgICAgICAgdnA4X3RlbXBvcmFsX2ZpbHRlcl9wcmVkaWN0b3JzX21iX2MKLSAgICAgICAgICAgICAgICAgICAgICAgIChtYmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNbZnJhbWVdLT55X2J1ZmZlciArIG1iX3lfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNwaS0+ZnJhbWVzW2ZyYW1lXS0+dV9idWZmZXIgKyBtYl91dl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3BpLT5mcmFtZXNbZnJhbWVdLT52X2J1ZmZlciArIG1iX3V2X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjcGktPmZyYW1lc1tmcmFtZV0tPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1iZC0+YmxvY2tbMF0uYm1pLm12LmFzX212LnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYmQtPmJsb2NrWzBdLmJtaS5tdi5hc19tdi5jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIChZVVYpCi0gICAgICAgICAgICAgICAgICAgIFRFTVBPUkFMX0lOVk9LRSgmY3BpLT5ydGNkLnRlbXBvcmFsLCBhcHBseSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChmLT55X2J1ZmZlciArIG1iX3lfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGYtPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQotICAgICAgICAgICAgICAgICAgICBURU1QT1JBTF9JTlZPS0UoJmNwaS0+cnRjZC50ZW1wb3JhbCwgYXBwbHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAoZi0+dV9idWZmZXIgKyBtYl91dl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZi0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciArIDI1NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl93ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKyAyNTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKyAyNTYpOwotCi0gICAgICAgICAgICAgICAgICAgIFRFTVBPUkFMX0lOVk9LRSgmY3BpLT5ydGNkLnRlbXBvcmFsLCBhcHBseSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChmLT52X2J1ZmZlciArIG1iX3V2X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yICsgMzIwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciArIDMyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArIDMyMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3JtYWxpemUgZmlsdGVyIG91dHB1dCB0byBwcm9kdWNlIEFsdFJlZiBmcmFtZQotICAgICAgICAgICAgZHN0MSA9IGNwaS0+YWx0X3JlZl9idWZmZXIuc291cmNlX2J1ZmZlci55X2J1ZmZlcjsKLSAgICAgICAgICAgIHN0cmlkZSA9IGNwaS0+YWx0X3JlZl9idWZmZXIuc291cmNlX2J1ZmZlci55X3N0cmlkZTsKLSAgICAgICAgICAgIGJ5dGUgPSBtYl95X29mZnNldDsKLSAgICAgICAgICAgIGZvciAoaSA9IDAsayA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrLCBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHZhbCA9IGFjY3VtdWxhdG9yW2tdICsgKGNvdW50W2tdID4+IDEpOwotICAgICAgICAgICAgICAgICAgICBwdmFsICo9IGNwaS0+Zml4ZWRfZGl2aWRlW2NvdW50W2tdXTsKLSAgICAgICAgICAgICAgICAgICAgcHZhbCA+Pj0gMTk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZHN0MVtieXRlXSA9ICh1bnNpZ25lZCBjaGFyKXB2YWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IHBpeGVsCi0gICAgICAgICAgICAgICAgICAgIGJ5dGUrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBieXRlICs9IHN0cmlkZSAtIDE2OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkc3QxID0gY3BpLT5hbHRfcmVmX2J1ZmZlci5zb3VyY2VfYnVmZmVyLnVfYnVmZmVyOwotICAgICAgICAgICAgZHN0MiA9IGNwaS0+YWx0X3JlZl9idWZmZXIuc291cmNlX2J1ZmZlci52X2J1ZmZlcjsKLSAgICAgICAgICAgIHN0cmlkZSA9IGNwaS0+YWx0X3JlZl9idWZmZXIuc291cmNlX2J1ZmZlci51dl9zdHJpZGU7Ci0gICAgICAgICAgICBieXRlID0gbWJfdXZfb2Zmc2V0OwotICAgICAgICAgICAgZm9yIChpID0gMCxrID0gMjU2OyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyssIGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtPWsrNjQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVQotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHZhbCA9IGFjY3VtdWxhdG9yW2tdICsgKGNvdW50W2tdID4+IDEpOwotICAgICAgICAgICAgICAgICAgICBwdmFsICo9IGNwaS0+Zml4ZWRfZGl2aWRlW2NvdW50W2tdXTsKLSAgICAgICAgICAgICAgICAgICAgcHZhbCA+Pj0gMTk7Ci0gICAgICAgICAgICAgICAgICAgIGRzdDFbYnl0ZV0gPSAodW5zaWduZWQgY2hhcilwdmFsOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFYKLSAgICAgICAgICAgICAgICAgICAgcHZhbCA9IGFjY3VtdWxhdG9yW21dICsgKGNvdW50W21dID4+IDEpOwotICAgICAgICAgICAgICAgICAgICBwdmFsICo9IGNwaS0+Zml4ZWRfZGl2aWRlW2NvdW50W21dXTsKLSAgICAgICAgICAgICAgICAgICAgcHZhbCA+Pj0gMTk7Ci0gICAgICAgICAgICAgICAgICAgIGRzdDJbYnl0ZV0gPSAodW5zaWduZWQgY2hhcilwdmFsOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBwaXhlbAotICAgICAgICAgICAgICAgICAgICBieXRlKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnl0ZSArPSBzdHJpZGUgLSA4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYl95X29mZnNldCArPSAxNjsKLSAgICAgICAgICAgIG1iX3V2X29mZnNldCArPSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgbWJfeV9vZmZzZXQgKz0gMTYqKGYtPnlfc3RyaWRlLW1iX2NvbHMpOwotICAgICAgICBtYl91dl9vZmZzZXQgKz0gOCooZi0+dXZfc3RyaWRlLW1iX2NvbHMpOwotICAgIH0KLQotICAgIC8vIFJlc3RvcmUgaW5wdXQgc3RhdGUKLSAgICBtYmQtPnByZS55X2J1ZmZlciA9IHlfYnVmZmVyOwotICAgIG1iZC0+cHJlLnVfYnVmZmVyID0gdV9idWZmZXI7Ci0gICAgbWJkLT5wcmUudl9idWZmZXIgPSB2X2J1ZmZlcjsKLX0KLQotdm9pZCB2cDhfdGVtcG9yYWxfZmlsdGVyX3ByZXBhcmVfYwotKAotICAgIFZQOF9DT01QICpjcGkKLSkKLXsKLSAgICBpbnQgZnJhbWUgPSAwOwotCi0gICAgaW50IG51bV9mcmFtZXNfYmFja3dhcmQgPSAwOwotICAgIGludCBudW1fZnJhbWVzX2ZvcndhcmQgPSAwOwotICAgIGludCBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA9IDA7Ci0gICAgaW50IGZyYW1lc190b19ibHVyX2ZvcndhcmQgPSAwOwotICAgIGludCBmcmFtZXNfdG9fYmx1ciA9IDA7Ci0gICAgaW50IHN0YXJ0X2ZyYW1lID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgZmlsdGVyZWQgPSAwOwotCi0gICAgaW50IHN0cmVuZ3RoID0gY3BpLT5veGNmLmFybnJfc3RyZW5ndGg7Ci0KLSAgICBpbnQgYmx1cl90eXBlID0gY3BpLT5veGNmLmFybnJfdHlwZTsKLQotICAgIGludCBtYXhfZnJhbWVzID0gY3BpLT5hY3RpdmVfYXJucl9mcmFtZXM7Ci0KLSAgICBudW1fZnJhbWVzX2JhY2t3YXJkID0gY3BpLT5sYXN0X2FsdF9yZWZfc2VpIC0gY3BpLT5zb3VyY2VfZW5jb2RlX2luZGV4OwotCi0gICAgaWYgKG51bV9mcmFtZXNfYmFja3dhcmQgPCAwKQotICAgICAgICBudW1fZnJhbWVzX2JhY2t3YXJkICs9IGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzOwotCi0gICAgbnVtX2ZyYW1lc19mb3J3YXJkID0gY3BpLT5veGNmLmxhZ19pbl9mcmFtZXMgLSAobnVtX2ZyYW1lc19iYWNrd2FyZCArIDEpOwotCi0gICAgc3dpdGNoIChibHVyX3R5cGUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy8gQmFja3dhcmQgQmx1cgotCi0gICAgICAgIGZyYW1lc190b19ibHVyX2JhY2t3YXJkID0gbnVtX2ZyYW1lc19iYWNrd2FyZDsKLQotICAgICAgICBpZiAoZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgPj0gbWF4X2ZyYW1lcykKLSAgICAgICAgICAgIGZyYW1lc190b19ibHVyX2JhY2t3YXJkID0gbWF4X2ZyYW1lcyAtIDE7Ci0KLSAgICAgICAgZnJhbWVzX3RvX2JsdXIgPSBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCArIDE7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAvLyBGb3J3YXJkIEJsdXIKLQotICAgICAgICBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID0gbnVtX2ZyYW1lc19mb3J3YXJkOwotCi0gICAgICAgIGlmIChmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID49IG1heF9mcmFtZXMpCi0gICAgICAgICAgICBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID0gbWF4X2ZyYW1lcyAtIDE7Ci0KLSAgICAgICAgZnJhbWVzX3RvX2JsdXIgPSBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkICsgMTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy8gQ2VudGVyIEJsdXIKLSAgICAgICAgZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCA9IG51bV9mcmFtZXNfZm9yd2FyZDsKLSAgICAgICAgZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQgPSBudW1fZnJhbWVzX2JhY2t3YXJkOwotCi0gICAgICAgIGlmIChmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID4gZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQpCi0gICAgICAgICAgICBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkID0gZnJhbWVzX3RvX2JsdXJfYmFja3dhcmQ7Ci0KLSAgICAgICAgaWYgKGZyYW1lc190b19ibHVyX2JhY2t3YXJkID4gZnJhbWVzX3RvX2JsdXJfZm9yd2FyZCkKLSAgICAgICAgICAgIGZyYW1lc190b19ibHVyX2JhY2t3YXJkID0gZnJhbWVzX3RvX2JsdXJfZm9yd2FyZDsKLQotICAgICAgICAvLyBXaGVuIG1heF9mcmFtZXMgaXMgZXZlbiB3ZSBoYXZlIDEgbW9yZSBmcmFtZSBiYWNrd2FyZCB0aGFuIGZvcndhcmQKLSAgICAgICAgaWYgKGZyYW1lc190b19ibHVyX2ZvcndhcmQgPiAobWF4X2ZyYW1lcyAtIDEpIC8gMikKLSAgICAgICAgICAgIGZyYW1lc190b19ibHVyX2ZvcndhcmQgPSAoKG1heF9mcmFtZXMgLSAxKSAvIDIpOwotCi0gICAgICAgIGlmIChmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA+IChtYXhfZnJhbWVzIC8gMikpCi0gICAgICAgICAgICBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCA9IChtYXhfZnJhbWVzIC8gMik7Ci0KLSAgICAgICAgZnJhbWVzX3RvX2JsdXIgPSBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCArIGZyYW1lc190b19ibHVyX2ZvcndhcmQgKyAxOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzdGFydF9mcmFtZSA9IChjcGktPmxhc3RfYWx0X3JlZl9zZWkKLSAgICAgICAgICAgICAgICAgICAgKyBmcmFtZXNfdG9fYmx1cl9mb3J3YXJkKSAlIGNwaS0+b3hjZi5sYWdfaW5fZnJhbWVzOwotCi0jaWZkZWYgREVCVUdGV0cKLSAgICAvLyBERUJVRyBGV0cKLSAgICBwcmludGYoIm1heDolZCBGQkNLOiVkIEZGV0Q6JWQgZnRiOiVkIGZ0YmJjazolZCBmdGJmd2Q6JWQgc2VpOiVkIGxhc2VpOiVkIHN0YXJ0OiVkIgotICAgICAgICAgICAsIG1heF9mcmFtZXMKLSAgICAgICAgICAgLCBudW1fZnJhbWVzX2JhY2t3YXJkCi0gICAgICAgICAgICwgbnVtX2ZyYW1lc19mb3J3YXJkCi0gICAgICAgICAgICwgZnJhbWVzX3RvX2JsdXIKLSAgICAgICAgICAgLCBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZAotICAgICAgICAgICAsIGZyYW1lc190b19ibHVyX2ZvcndhcmQKLSAgICAgICAgICAgLCBjcGktPnNvdXJjZV9lbmNvZGVfaW5kZXgKLSAgICAgICAgICAgLCBjcGktPmxhc3RfYWx0X3JlZl9zZWkKLSAgICAgICAgICAgLCBzdGFydF9mcmFtZSk7Ci0jZW5kaWYKLQotICAgIC8vIFNldHVwIGZyYW1lIHBvaW50ZXJzLCBOVUxMIGluZGljYXRlcyBmcmFtZSBub3QgaW5jbHVkZWQgaW4gZmlsdGVyCi0gICAgdnB4X21lbXNldChjcGktPmZyYW1lcywgMCwgbWF4X2ZyYW1lcypzaXplb2YoWVYxMl9CVUZGRVJfQ09ORklHICopKTsKLSAgICBmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBmcmFtZXNfdG9fYmx1cjsgZnJhbWUrKykKLSAgICB7Ci0gICAgICAgIGludCB3aGljaF9idWZmZXIgPSAgc3RhcnRfZnJhbWUgLSBmcmFtZTsKLQotICAgICAgICBpZiAod2hpY2hfYnVmZmVyIDwgMCkKLSAgICAgICAgICAgIHdoaWNoX2J1ZmZlciArPSBjcGktPm94Y2YubGFnX2luX2ZyYW1lczsKLQotICAgICAgICBjcGktPmZyYW1lc1tmcmFtZXNfdG9fYmx1ci0xLWZyYW1lXQotICAgICAgICAgICAgICAgID0gJmNwaS0+c3JjX2J1ZmZlclt3aGljaF9idWZmZXJdLnNvdXJjZV9idWZmZXI7Ci0gICAgfQotCi0gICAgdnA4X3RlbXBvcmFsX2ZpbHRlcl9pdGVyYXRlX2MgKAotICAgICAgICBjcGksCi0gICAgICAgIGZyYW1lc190b19ibHVyLAotICAgICAgICBmcmFtZXNfdG9fYmx1cl9iYWNrd2FyZCwKLSAgICAgICAgc3RyZW5ndGggKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvdGVtcG9yYWxfZmlsdGVyLmggYi92cDgvZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwMDM3YS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fSU5DX1ZQOF9URU1QT1JBTF9GSUxURVJfSAotI2RlZmluZSBfX0lOQ19WUDhfVEVNUE9SQUxfRklMVEVSX0gKLQotI2RlZmluZSBwcm90b3R5cGVfYXBwbHkoc3ltKVwKLSAgICB2b2lkIChzeW0pIFwKLSAgICAoIFwKLSAgICAgdW5zaWduZWQgY2hhciAqZnJhbWUxLCBcCi0gICAgIHVuc2lnbmVkIGludCBzdHJpZGUsIFwKLSAgICAgdW5zaWduZWQgY2hhciAqZnJhbWUyLCBcCi0gICAgIHVuc2lnbmVkIGludCBibG9ja19zaXplLCBcCi0gICAgIGludCBzdHJlbmd0aCwgXAotICAgICBpbnQgZmlsdGVyX3dlaWdodCwgXAotICAgICB1bnNpZ25lZCBpbnQgKmFjY3VtdWxhdG9yLCBcCi0gICAgIHVuc2lnbmVkIHNob3J0ICpjb3VudCBcCi0gICAgKQotCi0jaWYgQVJDSF9YODYgfHwgQVJDSF9YODZfNjQKLSNpbmNsdWRlICJ4ODYvdGVtcG9yYWxfZmlsdGVyX3g4Ni5oIgotI2VuZGlmCi0KLSNpZm5kZWYgdnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseQotI2RlZmluZSB2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5IHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2FwcGx5KHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHkpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHByb3RvdHlwZV9hcHBseSgqYXBwbHkpOwotfSB2cDhfdGVtcG9yYWxfcnRjZF92dGFibGVfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgVEVNUE9SQUxfSU5WT0tFKGN0eCxmbikgKGN0eCktPmZuCi0jZWxzZQotI2RlZmluZSBURU1QT1JBTF9JTlZPS0UoY3R4LGZuKSB2cDhfdGVtcG9yYWxfZmlsdGVyXyMjZm4KLSNlbmRpZgotCi0jZW5kaWYgLy8gX19JTkNfVlA4X1RFTVBPUkFMX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci90b2tlbml6ZS5jIGIvdnA4L2VuY29kZXIvdG9rZW5pemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmNDIzZi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci90b2tlbml6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSAib255eF9pbnQuaCIKLSNpbmNsdWRlICJ0b2tlbml6ZS5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotCi0vKiBHbG9iYWwgZXZlbnQgY291bnRlcnMgdXNlZCBmb3IgYWNjdW11bGF0aW5nIHN0YXRpc3RpY3MgYWNyb3NzIHNldmVyYWwKLSAgIGNvbXByZXNzaW9ucywgdGhlbiBnZW5lcmF0aW5nIGNvbnRleHQuYyA9IGluaXRpYWwgc3RhdHMuICovCi0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi1faW50NjQgY29udGV4dF9jb3VudGVyc1tCTE9DS19UWVBFU10gW0NPRUZfQkFORFNdIFtQUkVWX0NPRUZfQ09OVEVYVFNdIFt2cDhfY29lZl90b2tlbnNdOwotI2VuZGlmCi12b2lkIHZwOF9zdHVmZl9tYihWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLRCAqeCwgVE9LRU5FWFRSQSAqKnQpIDsKLXZvaWQgdnA4X2ZpeF9jb250ZXh0cyhNQUNST0JMT0NLRCAqeCk7Ci0KLXN0YXRpYyBUT0tFTlZBTFVFIGRjdF92YWx1ZV90b2tlbnNbRENUX01BWF9WQUxVRSoyXTsKLWNvbnN0IFRPS0VOVkFMVUUgKnZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0cjsKLXN0YXRpYyBpbnQgZGN0X3ZhbHVlX2Nvc3RbRENUX01BWF9WQUxVRSoyXTsKLWNvbnN0IGludCAqdnA4X2RjdF92YWx1ZV9jb3N0X3B0cjsKLSNpZiAwCi1pbnQgc2tpcF90cnVlX2NvdW50ID0gMDsKLWludCBza2lwX2ZhbHNlX2NvdW50ID0gMDsKLSNlbmRpZgotc3RhdGljIHZvaWQgZmlsbF92YWx1ZV90b2tlbnMoKQotewotCi0gICAgVE9LRU5WQUxVRSAqY29uc3QgdCA9IGRjdF92YWx1ZV90b2tlbnMgKyBEQ1RfTUFYX1ZBTFVFOwotICAgIHZwOF9leHRyYV9iaXRfc3RydWN0ICpjb25zdCBlID0gdnA4X2V4dHJhX2JpdHM7Ci0KLSAgICBpbnQgaSA9IC1EQ1RfTUFYX1ZBTFVFOwotICAgIGludCBzaWduID0gMTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoIWkpCi0gICAgICAgICAgICBzaWduID0gMDsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgYSA9IHNpZ24gPyAtaSA6IGk7Ci0gICAgICAgICAgICBpbnQgZWIgPSBzaWduOwotCi0gICAgICAgICAgICBpZiAoYSA+IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGogPSA0OwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCsraiA8IDExICAmJiAgZVtqXS5iYXNlX3ZhbCA8PSBhKSB7fQotCi0gICAgICAgICAgICAgICAgdFtpXS5Ub2tlbiA9IC0tajsKLSAgICAgICAgICAgICAgICBlYiB8PSAoYSAtIGVbal0uYmFzZV92YWwpIDw8IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdFtpXS5Ub2tlbiA9IGE7Ci0KLSAgICAgICAgICAgIHRbaV0uRXh0cmEgPSBlYjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNvc3QgZm9yIGV4dHJhIGJpdHMgZm9yIGFsbCBwb3NzaWJsZSBjb2VmZmljaWVudCB2YWx1ZS4KLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvc3QgPSAwOwotICAgICAgICAgICAgdnA4X2V4dHJhX2JpdF9zdHJ1Y3QgKnAgPSB2cDhfZXh0cmFfYml0cyArIHRbaV0uVG9rZW47Ci0KLSAgICAgICAgICAgIGlmIChwLT5iYXNlX3ZhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgZXh0cmEgPSB0W2ldLkV4dHJhOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBMZW5ndGggPSBwLT5MZW47Ci0KLSAgICAgICAgICAgICAgICBpZiAoTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBjb3N0ICs9IHZwOF90cmVlZF9jb3N0KHAtPnRyZWUsIHAtPnByb2IsIGV4dHJhID4+IDEsIExlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBjb3N0ICs9IHZwOF9jb3N0X2JpdCh2cDhfcHJvYl9oYWxmLCBleHRyYSAmIDEpOyAvKiBzaWduICovCi0gICAgICAgICAgICAgICAgZGN0X3ZhbHVlX2Nvc3RbaSArIERDVF9NQVhfVkFMVUVdID0gY29zdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgd2hpbGUgKCsraSA8IERDVF9NQVhfVkFMVUUpOwotCi0gICAgdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyID0gZGN0X3ZhbHVlX3Rva2VucyArIERDVF9NQVhfVkFMVUU7Ci0gICAgdnA4X2RjdF92YWx1ZV9jb3N0X3B0ciAgID0gZGN0X3ZhbHVlX2Nvc3QgKyBEQ1RfTUFYX1ZBTFVFOwotfQotCi1zdGF0aWMgdm9pZCB0b2tlbml6ZTJuZF9vcmRlcl9iCi0oCi0gICAgY29uc3QgQkxPQ0tEICpjb25zdCBiLAotICAgIFRPS0VORVhUUkEgKip0cCwKLSAgICBjb25zdCBpbnQgdHlwZSwgICAgIC8qIHdoaWNoIHBsYW5lOiAwPVkgbm8gREMsIDE9WTIsIDI9VVYsIDM9WSB3aXRoIERDICovCi0gICAgY29uc3QgRlJBTUVfVFlQRSBmcmFtZXR5cGUsCi0gICAgRU5UUk9QWV9DT05URVhUICphLAotICAgIEVOVFJPUFlfQ09OVEVYVCAqbCwKLSAgICBWUDhfQ09NUCAqY3BpCi0pCi17Ci0gICAgaW50IHB0OyAvKiBuZWFyIGJsb2NrL3ByZXYgdG9rZW4gY29udGV4dCBpbmRleCAqLwotICAgIGludCBjID0gMDsgICAgICAgICAgLyogc3RhcnQgYXQgREMgKi8KLSAgICBjb25zdCBpbnQgZW9iID0gYi0+ZW9iOyAgICAgLyogb25lIGJleW9uZCBsYXN0IG5vbnplcm8gY29lZmYgKi8KLSAgICBUT0tFTkVYVFJBICp0ID0gKnRwOyAgICAgICAgLyogc3RvcmUgdG9rZW5zIHN0YXJ0aW5nIGhlcmUgKi8KLSAgICBpbnQgeDsKLSAgICBjb25zdCBzaG9ydCAqcWNvZWZmX3B0ciA9IGItPnFjb2VmZjsKLSAgICBWUDhfQ09NQklORUVOVFJPUFlDT05URVhUUyhwdCwgKmEsICpsKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBjb25zdCBpbnQgYmFuZCA9IHZwOF9jb2VmX2JhbmRzW2NdOwotCi0gICAgICAgIGlmIChjIDwgZW9iKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmMgPSB2cDhfZGVmYXVsdF96aWdfemFnMWRbY107Ci0gICAgICAgICAgICBjb25zdCBpbnQgdiA9IHFjb2VmZl9wdHJbcmNdOwotCi0gICAgICAgICAgICBhc3NlcnQoLURDVF9NQVhfVkFMVUUgPD0gdiAgJiYgIHYgPCAoRENUX01BWF9WQUxVRSkpOwotCi0gICAgICAgICAgICB0LT5FeHRyYSA9IHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0clt2XS5FeHRyYTsKLSAgICAgICAgICAgIHggICAgICAgID0gdnA4X2RjdF92YWx1ZV90b2tlbnNfcHRyW3ZdLlRva2VuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHggPSBEQ1RfRU9CX1RPS0VOOwotCi0gICAgICAgIHQtPlRva2VuID0geDsKLSAgICAgICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbdHlwZV0gW2JhbmRdIFtwdF07Ci0KLSAgICAgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IHB0ID09IDAgJiYgKChiYW5kID4gMCAmJiB0eXBlID4gMCkgfHwgKGJhbmQgPiAxICYmIHR5cGUgPT0gMCkpOwotCi0gICAgICAgICsrY3BpLT5jb2VmX2NvdW50cyAgICAgICBbdHlwZV0gW2JhbmRdIFtwdF0gW3hdOwotICAgIH0KLSAgICB3aGlsZSAocHQgPSB2cDhfcHJldl90b2tlbl9jbGFzc1t4XSwgKyt0LCBjIDwgZW9iICAmJiAgKytjIDwgMTYpOwotCi0gICAgKnRwID0gdDsKLSAgICBwdCA9IChjICE9ICF0eXBlKTsgLyogMCA8LT4gYWxsIGNvZWZmIGRhdGEgaXMgemVybyAqLwotICAgICphID0gKmwgPSBwdDsKLQotfQotCi1zdGF0aWMgdm9pZCB0b2tlbml6ZTFzdF9vcmRlcl9iCi0oCi0gICAgY29uc3QgQkxPQ0tEICpjb25zdCBiLAotICAgIFRPS0VORVhUUkEgKip0cCwKLSAgICBjb25zdCBpbnQgdHlwZSwgICAgIC8qIHdoaWNoIHBsYW5lOiAwPVkgbm8gREMsIDE9WTIsIDI9VVYsIDM9WSB3aXRoIERDICovCi0gICAgY29uc3QgRlJBTUVfVFlQRSBmcmFtZXR5cGUsCi0gICAgRU5UUk9QWV9DT05URVhUICphLAotICAgIEVOVFJPUFlfQ09OVEVYVCAqbCwKLSAgICBWUDhfQ09NUCAqY3BpCi0pCi17Ci0gICAgaW50IHB0OyAvKiBuZWFyIGJsb2NrL3ByZXYgdG9rZW4gY29udGV4dCBpbmRleCAqLwotICAgIGludCBjID0gdHlwZSA/IDAgOiAxOyAgICAgICAvKiBzdGFydCBhdCBEQyB1bmxlc3MgdHlwZSAwICovCi0gICAgY29uc3QgaW50IGVvYiA9IGItPmVvYjsgICAgIC8qIG9uZSBiZXlvbmQgbGFzdCBub256ZXJvIGNvZWZmICovCi0gICAgVE9LRU5FWFRSQSAqdCA9ICp0cDsgICAgICAgIC8qIHN0b3JlIHRva2VucyBzdGFydGluZyBoZXJlICovCi0gICAgaW50IHg7Ci0gICAgY29uc3Qgc2hvcnQgKnFjb2VmZl9wdHIgPSBiLT5xY29lZmY7Ci0gICAgVlA4X0NPTUJJTkVFTlRST1BZQ09OVEVYVFMocHQsICphLCAqbCk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgY29uc3QgaW50IGJhbmQgPSB2cDhfY29lZl9iYW5kc1tjXTsKLQotICAgICAgICB4ID0gRENUX0VPQl9UT0tFTjsKLQotICAgICAgICBpZiAoYyA8IGVvYikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJjID0gdnA4X2RlZmF1bHRfemlnX3phZzFkW2NdOwotICAgICAgICAgICAgY29uc3QgaW50IHYgPSBxY29lZmZfcHRyW3JjXTsKLQotICAgICAgICAgICAgYXNzZXJ0KC1EQ1RfTUFYX1ZBTFVFIDw9IHYgICYmICB2IDwgKERDVF9NQVhfVkFMVUUpKTsKLQotICAgICAgICAgICAgdC0+RXh0cmEgPSB2cDhfZGN0X3ZhbHVlX3Rva2Vuc19wdHJbdl0uRXh0cmE7Ci0gICAgICAgICAgICB4ICAgICAgICA9IHZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0clt2XS5Ub2tlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHQtPlRva2VuID0geDsKLSAgICAgICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbdHlwZV0gW2JhbmRdIFtwdF07Ci0KLSAgICAgICAgdC0+c2tpcF9lb2Jfbm9kZSA9IHB0ID09IDAgJiYgKChiYW5kID4gMCAmJiB0eXBlID4gMCkgfHwgKGJhbmQgPiAxICYmIHR5cGUgPT0gMCkpOwotCi0gICAgICAgICsrY3BpLT5jb2VmX2NvdW50cyAgICAgICBbdHlwZV0gW2JhbmRdIFtwdF0gW3hdOwotICAgIH0KLSAgICB3aGlsZSAocHQgPSB2cDhfcHJldl90b2tlbl9jbGFzc1t4XSwgKyt0LCBjIDwgZW9iICAmJiAgKytjIDwgMTYpOwotCi0gICAgKnRwID0gdDsKLSAgICBwdCA9IChjICE9ICF0eXBlKTsgLyogMCA8LT4gYWxsIGNvZWZmIGRhdGEgaXMgemVybyAqLwotICAgICphID0gKmwgPSBwdDsKLQotfQotCi0KLXN0YXRpYyBpbnQgbWJfaXNfc2tpcHBhYmxlKE1BQ1JPQkxPQ0tEICp4KQotewotICAgIGludCBoYXNfeTJfYmxvY2s7Ci0gICAgaW50IHNraXAgPSAxOwotICAgIGludCBpID0gMDsKLQotICAgIGhhc195Ml9ibG9jayA9ICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRAotICAgICAgICAgICAgICAgICAgICAmJiB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpOwotICAgIGlmIChoYXNfeTJfYmxvY2spCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHNraXAgJj0gKHgtPmJsb2NrW2ldLmVvYiA8IDIpOwotICAgIH0KLQotICAgIGZvciAoOyBpIDwgMjQgKyBoYXNfeTJfYmxvY2s7IGkrKykKLSAgICAgICAgc2tpcCAmPSAoIXgtPmJsb2NrW2ldLmVvYik7Ci0KLSAgICByZXR1cm4gc2tpcDsKLX0KLQotCi12b2lkIHZwOF90b2tlbml6ZV9tYihWUDhfQ09NUCAqY3BpLCBNQUNST0JMT0NLRCAqeCwgVE9LRU5FWFRSQSAqKnQpCi17Ci0gICAgRU5UUk9QWV9DT05URVhUICogQSA9IChFTlRST1BZX0NPTlRFWFQgKil4LT5hYm92ZV9jb250ZXh0OwotICAgIEVOVFJPUFlfQ09OVEVYVCAqIEwgPSAoRU5UUk9QWV9DT05URVhUICopeC0+bGVmdF9jb250ZXh0OwotICAgIGludCBwbGFuZV90eXBlOwotICAgIGludCBiOwotCi0gICAgVE9LRU5FWFRSQSAqc3RhcnQgPSAqdDsKLSAgICBUT0tFTkVYVFJBICp0cCA9ICp0OwotCi0gICAgeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA9IDE7Ci0KLSNpZiAwCi0KLSAgICBpZiAoeC0+bWJtaS5mb3JjZV9ub19za2lwKQotICAgIHsKLSAgICAgICAgeC0+bWJtaS5tYl9za2lwX2NvZWZmID0gMTsKLSAgICAgICAgLy9yZXNldCBmb3IgbmV4dF9tYi4KLSAgICAgICAgeC0+bWJtaS5mb3JjZV9ub19za2lwID0gMDsKLSAgICB9Ci0KLSNlbmRpZgotCi0jaWYgMQotCi0gICAgeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZiA9IG1iX2lzX3NraXBwYWJsZSh4KTsKLSAgICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubWJfc2tpcF9jb2VmZikKLSAgICB7Ci0KLSAgICAgICAgY3BpLT5za2lwX3RydWVfY291bnQrKzsKLQotICAgICAgICBpZiAoIWNwaS0+Y29tbW9uLm1iX25vX2NvZWZmX3NraXApCi0gICAgICAgICAgICB2cDhfc3R1ZmZfbWIoY3BpLCB4LCB0KSA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2ZpeF9jb250ZXh0cyh4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IEJfUFJFRCAmJiB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5tb2RlICE9IFNQTElUTVYpCi0gICAgICAgICAgICB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkuZGNfZGlmZiA9IDE7Ci0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY3BpLT5za2lwX2ZhbHNlX2NvdW50Kys7Ci0jZW5kaWYKLSNpZiAwCi0gICAgdnB4X21lbWNweShjcGktPmNvZWZfY291bnRzX2JhY2t1cCwgY3BpLT5jb2VmX2NvdW50cywgc2l6ZW9mKGNwaS0+Y29lZl9jb3VudHMpKTsKLSNlbmRpZgotCi0gICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gQl9QUkVEIHx8IHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgPT0gU1BMSVRNVikKLSAgICB7Ci0gICAgICAgIHBsYW5lX3R5cGUgPSAzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0b2tlbml6ZTJuZF9vcmRlcl9iKHgtPmJsb2NrICsgMjQsIHQsIDEsIHgtPmZyYW1lX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgQSArIHZwOF9ibG9jazJhYm92ZVsyNF0sIEwgKyB2cDhfYmxvY2sybGVmdFsyNF0sIGNwaSk7Ci0gICAgICAgIHBsYW5lX3R5cGUgPSAwOwotCi0gICAgfQotCi0gICAgZm9yIChiID0gMDsgYiA8IDE2OyBiKyspCi0gICAgICAgIHRva2VuaXplMXN0X29yZGVyX2IoeC0+YmxvY2sgKyBiLCB0LCBwbGFuZV90eXBlLCB4LT5mcmFtZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgKyB2cDhfYmxvY2syYWJvdmVbYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTCArIHZwOF9ibG9jazJsZWZ0W2JdLCBjcGkpOwotCi0gICAgZm9yIChiID0gMTY7IGIgPCAyNDsgYisrKQotICAgICAgICB0b2tlbml6ZTFzdF9vcmRlcl9iKHgtPmJsb2NrICsgYiwgdCwgMiwgeC0+ZnJhbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBICsgdnA4X2Jsb2NrMmFib3ZlW2JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwgKyB2cDhfYmxvY2sybGVmdFtiXSwgY3BpKTsKLQotI2lmIDAKLQotICAgIGlmIChjcGktPmNvbW1vbi5tYl9ub19jb2VmZl9za2lwKQotICAgIHsKLSAgICAgICAgaW50IHNraXAgPSAxOwotCi0gICAgICAgIHdoaWxlICgodHAgIT0gKnQpICYmIHNraXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNraXAgPSAoc2tpcCAmJiAodHAtPlRva2VuID09IERDVF9FT0JfVE9LRU4pKTsKLSAgICAgICAgICAgIHRwICsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraXAgIT0geC0+bWJtaS5tYl9za2lwX2NvZWZmKQotICAgICAgICAgICAgc2tpcCArPSAwOwotCi0gICAgICAgIHgtPm1ibWkubWJfc2tpcF9jb2VmZiA9IHNraXA7Ci0KLSAgICAgICAgaWYgKHgtPm1ibWkubWJfc2tpcF9jb2VmZiA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICB4LT5tYm1pLmRjX2RpZmYgPSAwOwotICAgICAgICAgICAgLy9yZWRvIHRoZSBjb3V0bnRzCi0gICAgICAgICAgICB2cHhfbWVtY3B5KGNwaS0+Y29lZl9jb3VudHMsIGNwaS0+Y29lZl9jb3VudHNfYmFja3VwLCBzaXplb2YoY3BpLT5jb2VmX2NvdW50cykpOwotCi0gICAgICAgICAgICAqdCA9IHN0YXJ0OwotICAgICAgICAgICAgY3BpLT5za2lwX3RydWVfY291bnQrKzsKLSAgICAgICAgICAgIC8vc2tpcF90cnVlX2NvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGNwaS0+c2tpcF9mYWxzZV9jb3VudCsrOwotICAgICAgICAgICAgLy9za2lwX2ZhbHNlX2NvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZgotfQotCi0KLSNpZmRlZiBFTlRST1BZX1NUQVRTCi0KLXZvaWQgaW5pdF9jb250ZXh0X2NvdW50ZXJzKHZvaWQpCi17Ci0gICAgdnB4X21lbXNldChjb250ZXh0X2NvdW50ZXJzLCAwLCBzaXplb2YoY29udGV4dF9jb3VudGVycykpOwotfQotCi12b2lkIHByaW50X2NvbnRleHRfY291bnRlcnMoKQotewotCi0gICAgaW50IHR5cGUsIGJhbmQsIHB0LCB0OwotCi0gICAgRklMRSAqY29uc3QgZiA9IGZvcGVuKCJjb250ZXh0LmMiLCAidyIpOwotCi0gICAgZnByaW50ZihmLCAiI2luY2x1ZGUgXCJlbnRyb3B5LmhcIlxuIik7Ci0KLSAgICBmcHJpbnRmKGYsICJcbi8qICoqKiBHRU5FUkFURUQgRklMRTogRE8gTk9UIEVESVQgKioqICovXG5cbiIpOwotCi0gICAgZnByaW50ZihmLCAiaW50IENvbnRleHRzW0JMT0NLX1RZUEVTXSBbQ09FRl9CQU5EU10gW1BSRVZfQ09FRl9DT05URVhUU10gW3ZwOF9jb2VmX3Rva2Vuc107XG5cbiIpOwotCi0gICAgZnByaW50ZihmLCAiY29uc3QgaW50IGRlZmF1bHRfY29udGV4dHNbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbdnA4X2NvZWZfdG9rZW5zXSA9IHsiKTsKLQotIyBkZWZpbmUgQ29tbWEoIFgpIChYPyAiLCI6IiIpCi0KLSAgICB0eXBlID0gMDsKLQotICAgIGRvCi0gICAgewotICAgICAgICBmcHJpbnRmKGYsICIlc1xuICB7IC8qIGJsb2NrIFR5cGUgJWQgKi8iLCBDb21tYSh0eXBlKSwgdHlwZSk7Ci0KLSAgICAgICAgYmFuZCA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiAgICB7IC8qIENvZWZmIEJhbmQgJWQgKi8iLCBDb21tYShiYW5kKSwgYmFuZCk7Ci0KLSAgICAgICAgICAgIHB0ID0gMDsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuICAgICAgeyIsIENvbW1hKHB0KSk7Ci0KLSAgICAgICAgICAgICAgICB0ID0gMDsKLQotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBfaW50NjQgeCA9IGNvbnRleHRfY291bnRlcnMgW3R5cGVdIFtiYW5kXSBbcHRdIFt0XTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHkgPSAoaW50KSB4OwotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh4ID09IChfaW50NjQpIHkpOyAgLyogbm8gb3ZlcmZsb3cgaGFuZGxpbmcgeWV0ICovCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICVkIiwgQ29tbWEodCksIHkpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgrK3QgPCB2cDhfY29lZl90b2tlbnMpOwotCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAifSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCsrcHQgPCBQUkVWX0NPRUZfQ09OVEVYVFMpOwotCi0gICAgICAgICAgICBmcHJpbnRmKGYsICJcbiAgICB9Iik7Ci0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoKytiYW5kIDwgQ09FRl9CQU5EUyk7Ci0KLSAgICAgICAgZnByaW50ZihmLCAiXG4gIH0iKTsKLSAgICB9Ci0gICAgd2hpbGUgKCsrdHlwZSA8IEJMT0NLX1RZUEVTKTsKLQotICAgIGZwcmludGYoZiwgIlxufTtcbiIpOwotICAgIGZjbG9zZShmKTsKLX0KLSNlbmRpZgotCi0KLXZvaWQgdnA4X3Rva2VuaXplX2luaXRpYWxpemUoKQotewotICAgIGZpbGxfdmFsdWVfdG9rZW5zKCk7Ci19Ci0KLQotc3RhdGljIF9faW5saW5lIHZvaWQgc3R1ZmYybmRfb3JkZXJfYgotKAotICAgIGNvbnN0IEJMT0NLRCAqY29uc3QgYiwKLSAgICBUT0tFTkVYVFJBICoqdHAsCi0gICAgY29uc3QgaW50IHR5cGUsICAgICAvKiB3aGljaCBwbGFuZTogMD1ZIG5vIERDLCAxPVkyLCAyPVVWLCAzPVkgd2l0aCBEQyAqLwotICAgIGNvbnN0IEZSQU1FX1RZUEUgZnJhbWV0eXBlLAotICAgIEVOVFJPUFlfQ09OVEVYVCAqYSwKLSAgICBFTlRST1BZX0NPTlRFWFQgKmwsCi0gICAgVlA4X0NPTVAgKmNwaQotKQotewotICAgIGludCBwdDsgLyogbmVhciBibG9jay9wcmV2IHRva2VuIGNvbnRleHQgaW5kZXggKi8KLSAgICBUT0tFTkVYVFJBICp0ID0gKnRwOyAgICAgICAgLyogc3RvcmUgdG9rZW5zIHN0YXJ0aW5nIGhlcmUgKi8KLSAgICBWUDhfQ09NQklORUVOVFJPUFlDT05URVhUUyhwdCwgKmEsICpsKTsKLSAgICAodm9pZCkgZnJhbWV0eXBlOwotICAgICh2b2lkKSB0eXBlOwotICAgICh2b2lkKSBiOwotCi0gICAgdC0+VG9rZW4gPSBEQ1RfRU9CX1RPS0VOOwotICAgIHQtPmNvbnRleHRfdHJlZSA9IGNwaS0+Y29tbW9uLmZjLmNvZWZfcHJvYnMgWzFdIFswXSBbcHRdOwotICAgIHQtPnNraXBfZW9iX25vZGUgPSAwOwotICAgICsrY3BpLT5jb2VmX2NvdW50cyAgICAgICBbMV0gWzBdIFtwdF0gW0RDVF9FT0JfVE9LRU5dOwotICAgICsrdDsKLQotICAgICp0cCA9IHQ7Ci0gICAgcHQgPSAwOwotICAgICphID0gKmwgPSBwdDsKLQotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBzdHVmZjFzdF9vcmRlcl9iCi0oCi0gICAgY29uc3QgQkxPQ0tEICpjb25zdCBiLAotICAgIFRPS0VORVhUUkEgKip0cCwKLSAgICBjb25zdCBpbnQgdHlwZSwgICAgIC8qIHdoaWNoIHBsYW5lOiAwPVkgbm8gREMsIDE9WTIsIDI9VVYsIDM9WSB3aXRoIERDICovCi0gICAgY29uc3QgRlJBTUVfVFlQRSBmcmFtZXR5cGUsCi0gICAgRU5UUk9QWV9DT05URVhUICphLAotICAgIEVOVFJPUFlfQ09OVEVYVCAqbCwKLSAgICBWUDhfQ09NUCAqY3BpCi0pCi17Ci0gICAgaW50IHB0OyAvKiBuZWFyIGJsb2NrL3ByZXYgdG9rZW4gY29udGV4dCBpbmRleCAqLwotICAgIFRPS0VORVhUUkEgKnQgPSAqdHA7ICAgICAgICAvKiBzdG9yZSB0b2tlbnMgc3RhcnRpbmcgaGVyZSAqLwotICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOwotICAgICh2b2lkKSBmcmFtZXR5cGU7Ci0gICAgKHZvaWQpIHR5cGU7Ci0gICAgKHZvaWQpIGI7Ci0KLSAgICB0LT5Ub2tlbiA9IERDVF9FT0JfVE9LRU47Ci0gICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbMF0gWzFdIFtwdF07Ci0gICAgdC0+c2tpcF9lb2Jfbm9kZSA9IDA7Ci0gICAgKytjcGktPmNvZWZfY291bnRzICAgICAgIFswXSBbMV0gW3B0XSBbRENUX0VPQl9UT0tFTl07Ci0gICAgKyt0OwotICAgICp0cCA9IHQ7Ci0gICAgcHQgPSAwOyAvKiAwIDwtPiBhbGwgY29lZmYgZGF0YSBpcyB6ZXJvICovCi0gICAgKmEgPSAqbCA9IHB0OwotCi19Ci1zdGF0aWMgX19pbmxpbmUKLXZvaWQgc3R1ZmYxc3Rfb3JkZXJfYnV2Ci0oCi0gICAgY29uc3QgQkxPQ0tEICpjb25zdCBiLAotICAgIFRPS0VORVhUUkEgKip0cCwKLSAgICBjb25zdCBpbnQgdHlwZSwgICAgIC8qIHdoaWNoIHBsYW5lOiAwPVkgbm8gREMsIDE9WTIsIDI9VVYsIDM9WSB3aXRoIERDICovCi0gICAgY29uc3QgRlJBTUVfVFlQRSBmcmFtZXR5cGUsCi0gICAgRU5UUk9QWV9DT05URVhUICphLAotICAgIEVOVFJPUFlfQ09OVEVYVCAqbCwKLSAgICBWUDhfQ09NUCAqY3BpCi0pCi17Ci0gICAgaW50IHB0OyAvKiBuZWFyIGJsb2NrL3ByZXYgdG9rZW4gY29udGV4dCBpbmRleCAqLwotICAgIFRPS0VORVhUUkEgKnQgPSAqdHA7ICAgICAgICAvKiBzdG9yZSB0b2tlbnMgc3RhcnRpbmcgaGVyZSAqLwotICAgIFZQOF9DT01CSU5FRU5UUk9QWUNPTlRFWFRTKHB0LCAqYSwgKmwpOwotICAgICh2b2lkKSBmcmFtZXR5cGU7Ci0gICAgKHZvaWQpIHR5cGU7Ci0gICAgKHZvaWQpIGI7Ci0KLSAgICB0LT5Ub2tlbiA9IERDVF9FT0JfVE9LRU47Ci0gICAgdC0+Y29udGV4dF90cmVlID0gY3BpLT5jb21tb24uZmMuY29lZl9wcm9icyBbMl0gWzBdIFtwdF07Ci0gICAgdC0+c2tpcF9lb2Jfbm9kZSA9IDA7Ci0gICAgKytjcGktPmNvZWZfY291bnRzWzJdIFswXSBbcHRdIFtEQ1RfRU9CX1RPS0VOXTsKLSAgICArK3Q7Ci0gICAgKnRwID0gdDsKLSAgICBwdCA9IDA7IC8qIDAgPC0+IGFsbCBjb2VmZiBkYXRhIGlzIHplcm8gKi8KLSAgICAqYSA9ICpsID0gcHQ7Ci0KLX0KLQotdm9pZCB2cDhfc3R1ZmZfbWIoVlA4X0NPTVAgKmNwaSwgTUFDUk9CTE9DS0QgKngsIFRPS0VORVhUUkEgKip0KQotewotICAgIEVOVFJPUFlfQ09OVEVYVCAqIEEgPSAoRU5UUk9QWV9DT05URVhUICopeC0+YWJvdmVfY29udGV4dDsKLSAgICBFTlRST1BZX0NPTlRFWFQgKiBMID0gKEVOVFJPUFlfQ09OVEVYVCAqKXgtPmxlZnRfY29udGV4dDsKLSAgICBpbnQgcGxhbmVfdHlwZTsKLSAgICBpbnQgYjsKLQotICAgIHN0dWZmMm5kX29yZGVyX2IoeC0+YmxvY2sgKyAyNCwgdCwgMSwgeC0+ZnJhbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIEEgKyB2cDhfYmxvY2syYWJvdmVbMjRdLCBMICsgdnA4X2Jsb2NrMmxlZnRbMjRdLCBjcGkpOwotICAgIHBsYW5lX3R5cGUgPSAwOwotCi0KLSAgICBpZiAoeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBCX1BSRUQgJiYgeC0+bW9kZV9pbmZvX2NvbnRleHQtPm1ibWkubW9kZSAhPSBTUExJVE1WKQotICAgICAgICB4LT5tb2RlX2luZm9fY29udGV4dC0+bWJtaS5kY19kaWZmID0gMDsKLSAgICBlbHNlCi0gICAgICAgIHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLmRjX2RpZmYgPSAxOwotCi0KLSAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKLSAgICAgICAgc3R1ZmYxc3Rfb3JkZXJfYih4LT5ibG9jayArIGIsIHQsIHBsYW5lX3R5cGUsIHgtPmZyYW1lX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQSArIHZwOF9ibG9jazJhYm92ZVtiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMICsgdnA4X2Jsb2NrMmxlZnRbYl0sIGNwaSk7Ci0KLSAgICBmb3IgKGIgPSAxNjsgYiA8IDI0OyBiKyspCi0gICAgICAgIHN0dWZmMXN0X29yZGVyX2J1dih4LT5ibG9jayArIGIsIHQsIDIsIHgtPmZyYW1lX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBICsgdnA4X2Jsb2NrMmFib3ZlW2JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTCArIHZwOF9ibG9jazJsZWZ0W2JdLCBjcGkpOwotCi19Ci12b2lkIHZwOF9maXhfY29udGV4dHMoTUFDUk9CTE9DS0QgKngpCi17Ci0gICAgLyogQ2xlYXIgZW50cm9weSBjb250ZXh0cyBmb3IgWTIgYmxvY2tzICovCi0gICAgaWYgKHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gQl9QUkVEICYmIHgtPm1vZGVfaW5mb19jb250ZXh0LT5tYm1pLm1vZGUgIT0gU1BMSVRNVikKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoeC0+YWJvdmVfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpKTsKLSAgICAgICAgdnB4X21lbXNldCh4LT5sZWZ0X2NvbnRleHQsIDAsIHNpemVvZihFTlRST1BZX0NPTlRFWFRfUExBTkVTKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoeC0+YWJvdmVfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpLTEpOwotICAgICAgICB2cHhfbWVtc2V0KHgtPmxlZnRfY29udGV4dCwgMCwgc2l6ZW9mKEVOVFJPUFlfQ09OVEVYVF9QTEFORVMpLTEpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvdG9rZW5pemUuaCBiL3ZwOC9lbmNvZGVyL3Rva2VuaXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2MxYTMuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvdG9rZW5pemUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIHRva2VuaXplX2gKLSNkZWZpbmUgdG9rZW5pemVfaAotCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9lbnRyb3B5LmgiCi0jaW5jbHVkZSAiYmxvY2suaCIKLQotdm9pZCB2cDhfdG9rZW5pemVfaW5pdGlhbGl6ZSgpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHNob3J0IFRva2VuOwotICAgIHNob3J0IEV4dHJhOwotfSBUT0tFTlZBTFVFOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGNvbnN0IHZwOF9wcm9iICpjb250ZXh0X3RyZWU7Ci0gICAgc2hvcnQgICAgICAgICAgIEV4dHJhOwotICAgIHVuc2lnbmVkIGNoYXIgICBUb2tlbjsKLSAgICB1bnNpZ25lZCBjaGFyICAgc2tpcF9lb2Jfbm9kZTsKLX0gVE9LRU5FWFRSQTsKLQotaW50IHJkX2Nvc3RfbWJ5KE1BQ1JPQkxPQ0tEICopOwotCi0jaWZkZWYgRU5UUk9QWV9TVEFUUwotdm9pZCBpbml0X2NvbnRleHRfY291bnRlcnMoKTsKLXZvaWQgcHJpbnRfY29udGV4dF9jb3VudGVycygpOwotCi1leHRlcm4gX2ludDY0IGNvbnRleHRfY291bnRlcnNbQkxPQ0tfVFlQRVNdIFtDT0VGX0JBTkRTXSBbUFJFVl9DT0VGX0NPTlRFWFRTXSBbdnA4X2NvZWZfdG9rZW5zXTsKLSNlbmRpZgotCi1leHRlcm4gY29uc3QgaW50ICp2cDhfZGN0X3ZhbHVlX2Nvc3RfcHRyOwotLyogVE9ETzogVGhlIFRva2VuIGZpZWxkIHNob3VsZCBiZSBicm9rZW4gb3V0IGludG8gYSBzZXBhcmF0ZSBjaGFyIGFycmF5IHRvCi0gKiAgaW1wcm92ZSBjYWNoZSBsb2NhbGl0eSwgc2luY2UgaXQncyBuZWVkZWQgZm9yIGNvc3Rpbmcgd2hlbiB0aGUgcmVzdCBvZiB0aGUKLSAqICBmaWVsZHMgYXJlIG5vdC4KLSAqLwotZXh0ZXJuIGNvbnN0IFRPS0VOVkFMVUUgKnZwOF9kY3RfdmFsdWVfdG9rZW5zX3B0cjsKLQotI2VuZGlmICAvKiB0b2tlbml6ZV9oICovCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci90cmVld3JpdGVyLmMgYi92cDgvZW5jb2Rlci90cmVld3JpdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTY3YzguLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvdHJlZXdyaXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ0cmVld3JpdGVyLmgiCi0KLXN0YXRpYyB2b2lkIGNvc3QoCi0gICAgaW50ICpjb25zdCBDLAotICAgIHZwOF90cmVlIFQsCi0gICAgY29uc3QgdnA4X3Byb2IgKmNvbnN0IFAsCi0gICAgaW50IGksCi0gICAgaW50IGMKLSkKLXsKLSAgICBjb25zdCB2cDhfcHJvYiBwID0gUCBbaT4+MV07Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgY29uc3QgdnA4X3RyZWVfaW5kZXggaiA9IFRbaV07Ci0gICAgICAgIGNvbnN0IGludCBkID0gYyArIHZwOF9jb3N0X2JpdChwLCBpICYgMSk7Ci0KLSAgICAgICAgaWYgKGogPD0gMCkKLSAgICAgICAgICAgIENbLWpdID0gZDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29zdChDLCBULCBQLCBqLCBkKTsKLSAgICB9Ci0gICAgd2hpbGUgKCsraSAmIDEpOwotfQotdm9pZCB2cDhfY29zdF90b2tlbnMoaW50ICpjLCBjb25zdCB2cDhfcHJvYiAqcCwgdnA4X3RyZWUgdCkKLXsKLSAgICBjb3N0KGMsIHQsIHAsIDAsIDApOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvdHJlZXdyaXRlci5oIGIvdnA4L2VuY29kZXIvdHJlZXdyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhhMGZhLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3RyZWV3cml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX0lOQ19UUkVFV1JJVEVSX0gKLSNkZWZpbmUgX19JTkNfVFJFRVdSSVRFUl9ICi0KLS8qIFRyZWVzIG1hcCBhbHBoYWJldHMgaW50byBodWZmbWFuLWxpa2UgY29kZXMgc3VpdGFibGUgZm9yIGFuIGFyaXRobWV0aWMKLSAgIGJpdCBjb2Rlci4gIFRpbW90aHkgUyBNdXJwaHkgIDExIE9jdG9iZXIgMjAwNCAqLwotCi0jaW5jbHVkZSAidnA4L2NvbW1vbi90cmVlY29kZXIuaCIKLQotI2luY2x1ZGUgImJvb2xodWZmLmgiICAgICAgIC8qIGZvciBub3cgKi8KLQotdHlwZWRlZiBCT09MX0NPREVSIHZwOF93cml0ZXI7Ci0KLSNkZWZpbmUgdnA4X3dyaXRlIHZwOF9lbmNvZGVfYm9vbAotI2RlZmluZSB2cDhfd3JpdGVfbGl0ZXJhbCB2cDhfZW5jb2RlX3ZhbHVlCi0jZGVmaW5lIHZwOF93cml0ZV9iaXQoIFcsIFYpIHZwOF93cml0ZSggVywgViwgdnA4X3Byb2JfaGFsZikKLQotI2RlZmluZSB2cDhiY193cml0ZSB2cDhiY193cml0ZV9ib29sCi0jZGVmaW5lIHZwOGJjX3dyaXRlX2xpdGVyYWwgdnA4YmNfd3JpdGVfYml0cwotI2RlZmluZSB2cDhiY193cml0ZV9iaXQoIFcsIFYpIHZwOGJjX3dyaXRlX2JpdHMoIFcsIFYsIDEpCi0KLQotLyogQXBwcm94aW1hdGUgbGVuZ3RoIG9mIGFuIGVuY29kZWQgYm9vbCBpbiAyNTZ0aHMgb2YgYSBiaXQgYXQgZ2l2ZW4gcHJvYiAqLwotCi0jZGVmaW5lIHZwOF9jb3N0X3plcm8oIHgpICggdnA4X3Byb2JfY29zdFt4XSkKLSNkZWZpbmUgdnA4X2Nvc3Rfb25lKCB4KSAgdnA4X2Nvc3RfemVybyggdnA4X2NvbXBsZW1lbnQoeCkpCi0KLSNkZWZpbmUgdnA4X2Nvc3RfYml0KCB4LCBiKSB2cDhfY29zdF96ZXJvKCAoYik/ICB2cDhfY29tcGxlbWVudCh4KSA6ICh4KSApCi0KLS8qIFZQOEJDIHZlcnNpb24gaXMgc2NhbGVkIGJ5IDJeMjAgcmF0aGVyIHRoYW4gMl44OyBzZWUgYm9vbF9jb2Rlci5oICovCi0KLQotLyogQm90aCBvZiB0aGVzZSByZXR1cm4gYml0cywgbm90IHNjYWxlZCBiaXRzLiAqLwotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50IHZwOF9jb3N0X2JyYW5jaChjb25zdCB1bnNpZ25lZCBpbnQgY3RbMl0sIHZwOF9wcm9iIHApCi17Ci0gICAgLyogSW1pdGF0ZSBleGlzdGluZyBjYWxjdWxhdGlvbiAqLwotCi0gICAgcmV0dXJuICgoY3RbMF0gKiB2cDhfY29zdF96ZXJvKHApKQotICAgICAgICAgICAgKyAoY3RbMV0gKiB2cDhfY29zdF9vbmUocCkpKSA+PiA4OwotfQotCi0vKiBTbWFsbCBmdW5jdGlvbnMgdG8gd3JpdGUgZXhwbGljaXQgdmFsdWVzIGFuZCB0b2tlbnMsIGFzIHdlbGwgYXMKLSAgIGVzdGltYXRlIHRoZWlyIGxlbmd0aHMuICovCi0KLXN0YXRpYyBfX2lubGluZSB2b2lkIHZwOF90cmVlZF93cml0ZQotKAotICAgIHZwOF93cml0ZXIgKmNvbnN0IHcsCi0gICAgdnA4X3RyZWUgdCwKLSAgICBjb25zdCB2cDhfcHJvYiAqY29uc3QgcCwKLSAgICBpbnQgdiwKLSAgICBpbnQgbiAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHYsIGFzc3VtZWQgbm9uemVybyAqLwotKQotewotICAgIHZwOF90cmVlX2luZGV4IGkgPSAwOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGNvbnN0IGludCBiID0gKHYgPj4gLS1uKSAmIDE7Ci0gICAgICAgIHZwOF93cml0ZSh3LCBiLCBwW2k+PjFdKTsKLSAgICAgICAgaSA9IHRbaStiXTsKLSAgICB9Ci0gICAgd2hpbGUgKG4pOwotfQotc3RhdGljIF9faW5saW5lIHZvaWQgdnA4X3dyaXRlX3Rva2VuCi0oCi0gICAgdnA4X3dyaXRlciAqY29uc3QgdywKLSAgICB2cDhfdHJlZSB0LAotICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwLAotICAgIHZwOF90b2tlbiAqY29uc3QgeAotKQotewotICAgIHZwOF90cmVlZF93cml0ZSh3LCB0LCBwLCB4LT52YWx1ZSwgeC0+TGVuKTsKLX0KLQotc3RhdGljIF9faW5saW5lIGludCB2cDhfdHJlZWRfY29zdCgKLSAgICB2cDhfdHJlZSB0LAotICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwLAotICAgIGludCB2LAotICAgIGludCBuICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gdiwgYXNzdW1lZCBub256ZXJvICovCi0pCi17Ci0gICAgaW50IGMgPSAwOwotICAgIHZwOF90cmVlX2luZGV4IGkgPSAwOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGNvbnN0IGludCBiID0gKHYgPj4gLS1uKSAmIDE7Ci0gICAgICAgIGMgKz0gdnA4X2Nvc3RfYml0KHBbaT4+MV0sIGIpOwotICAgICAgICBpID0gdFtpK2JdOwotICAgIH0KLSAgICB3aGlsZSAobik7Ci0KLSAgICByZXR1cm4gYzsKLX0KLXN0YXRpYyBfX2lubGluZSBpbnQgdnA4X2Nvc3RfdG9rZW4KLSgKLSAgICB2cDhfdHJlZSB0LAotICAgIGNvbnN0IHZwOF9wcm9iICpjb25zdCBwLAotICAgIHZwOF90b2tlbiAqY29uc3QgeAotKQotewotICAgIHJldHVybiB2cDhfdHJlZWRfY29zdCh0LCBwLCB4LT52YWx1ZSwgeC0+TGVuKTsKLX0KLQotLyogRmlsbCBhcnJheSBvZiBjb3N0cyBmb3IgYWxsIHBvc3NpYmxlIHRva2VuIHZhbHVlcy4gKi8KLQotdm9pZCB2cDhfY29zdF90b2tlbnMoCi0gICAgaW50ICpDb3N0cywgY29uc3QgdnA4X3Byb2IgKiwgdnA4X3RyZWUKLSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvdmFyaWFuY2UuaCBiL3ZwOC9lbmNvZGVyL3ZhcmlhbmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTdlYTguLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIvdmFyaWFuY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBWQVJJQU5DRV9ICi0jZGVmaW5lIFZBUklBTkNFX0gKLQotI2RlZmluZSBwcm90b3R5cGVfc2FkKHN5bSlcCi0gICAgdW5zaWduZWQgaW50IChzeW0pXAotICAgIChcCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIFwKLSAgICAgaW50IHNvdXJjZV9zdHJpZGUsIFwKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgXAotICAgICBpbnQgIHJlZl9zdHJpZGUsIFwKLSAgICAgaW50IG1heF9zYWRcCi0gICAgKQotCi0jZGVmaW5lIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzKHN5bSlcCi0gICAgdm9pZCAoc3ltKVwKLSAgICAoXAotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBcCi0gICAgIGludCBzb3VyY2Vfc3RyaWRlLCBcCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIFwKLSAgICAgaW50ICByZWZfc3RyaWRlLCBcCi0gICAgIHVuc2lnbmVkIGludCAqc2FkX2FycmF5XAotICAgICkKLQotI2RlZmluZSBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzc18xKHN5bSlcCi0gICAgdm9pZCAoc3ltKVwKLSAgICAoXAotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBcCi0gICAgIGludCBzb3VyY2Vfc3RyaWRlLCBcCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIFwKLSAgICAgaW50ICByZWZfc3RyaWRlLCBcCi0gICAgIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXlcCi0gICAgKQotCi0jZGVmaW5lIHByb3RvdHlwZV9zYWRfbXVsdGlfZGlmX2FkZHJlc3Moc3ltKVwKLSAgICB2b2lkIChzeW0pXAotICAgIChcCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIFwKLSAgICAgaW50IHNvdXJjZV9zdHJpZGUsIFwKLSAgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cls0XSwgXAotICAgICBpbnQgIHJlZl9zdHJpZGUsIFwKLSAgICAgdW5zaWduZWQgaW50ICpzYWRfYXJyYXlcCi0gICAgKQotCi0jZGVmaW5lIHByb3RvdHlwZV92YXJpYW5jZShzeW0pIFwKLSAgICB1bnNpZ25lZCBpbnQgKHN5bSkgXAotICAgIChcCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIFwKLSAgICAgaW50IHNvdXJjZV9zdHJpZGUsIFwKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwgXAotICAgICBpbnQgIHJlZl9zdHJpZGUsIFwKLSAgICAgdW5zaWduZWQgaW50ICpzc2VcCi0gICAgKQotCi0jZGVmaW5lIHByb3RvdHlwZV92YXJpYW5jZTIoc3ltKSBcCi0gICAgdW5zaWduZWQgaW50IChzeW0pIFwKLSAgICAoXAotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCBcCi0gICAgIGludCBzb3VyY2Vfc3RyaWRlLCBcCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIFwKLSAgICAgaW50ICByZWZfc3RyaWRlLCBcCi0gICAgIHVuc2lnbmVkIGludCAqc3NlLFwKLSAgICAgaW50ICpzdW1cCi0gICAgKQotCi0jZGVmaW5lIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZShzeW0pIFwKLSAgICB1bnNpZ25lZCBpbnQgKHN5bSkgXAotICAgICggXAotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsIFwKLSAgICAgIGludCAgc291cmNlX3N0cmlkZSwgXAotICAgICAgaW50ICB4b2Zmc2V0LCBcCi0gICAgICBpbnQgIHlvZmZzZXQsIFwKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsIFwKLSAgICAgIGludCBSZWZzdHJpZGUsIFwKLSAgICAgIHVuc2lnbmVkIGludCAqc3NlIFwKLSAgICApOwotCi0jZGVmaW5lIHByb3RvdHlwZV9zc2ltcGYoc3ltKSBcCi0gICAgdm9pZCAoc3ltKSBcCi0gICAgICAoIFwKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcywgXAotICAgICAgICBpbnQgc3AsIFwKLSAgICAgICAgdW5zaWduZWQgY2hhciAqciwgXAotICAgICAgICBpbnQgcnAsIFwKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqc3VtX3MsIFwKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqc3VtX3IsIFwKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3MsIFwKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3IsIFwKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqc3VtX3N4ciBcCi0gICAgICApOwotCi0jZGVmaW5lIHByb3RvdHlwZV9nZXRtYnNzKHN5bSkgdW5zaWduZWQgaW50IChzeW0pKGNvbnN0IHNob3J0ICopCi0KLSNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAotI2luY2x1ZGUgIng4Ni92YXJpYW5jZV94ODYuaCIKLSNlbmRpZgotCi0jaWYgQVJDSF9BUk0KLSNpbmNsdWRlICJhcm0vdmFyaWFuY2VfYXJtLmgiCi0jZW5kaWYKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkNHg0Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ0eDQgdnA4X3NhZDR4NF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF92YXJpYW5jZV9zYWQ0eDQpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9zYWQ4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4OCB2cDhfc2FkOHg4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zYWQodnA4X3ZhcmlhbmNlX3NhZDh4OCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDh4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4MTYgdnA4X3NhZDh4MTZfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfdmFyaWFuY2Vfc2FkOHgxNik7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDE2eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDggdnA4X3NhZDE2eDhfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfdmFyaWFuY2Vfc2FkMTZ4OCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNngxNiB2cDhfc2FkMTZ4MTZfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfdmFyaWFuY2Vfc2FkMTZ4MTYpOwotCi0vLy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4MwotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4MyB2cDhfc2FkMTZ4MTZ4M19jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzcyh2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4Myk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4MwotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4OHgzIHZwOF9zYWQxNng4eDNfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3ModnA4X3ZhcmlhbmNlX3NhZDE2eDh4Myk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDh4OHgzCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDh4MyB2cDhfc2FkOHg4eDNfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3ModnA4X3ZhcmlhbmNlX3NhZDh4OHgzKTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkOHgxNngzCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDE2eDMgdnA4X3NhZDh4MTZ4M19jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzcyh2cDhfdmFyaWFuY2Vfc2FkOHgxNngzKTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkNHg0eDMKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDR4NHgzIHZwOF9zYWQ0eDR4M19jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzcyh2cDhfdmFyaWFuY2Vfc2FkNHg0eDMpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9zYWQxNngxNng4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNngxNng4IHZwOF9zYWQxNngxNng4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzXzEodnA4X3ZhcmlhbmNlX3NhZDE2eDE2eDgpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9zYWQxNng4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4OCB2cDhfc2FkMTZ4OHg4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzXzEodnA4X3ZhcmlhbmNlX3NhZDE2eDh4OCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDh4OHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDh4OCB2cDhfc2FkOHg4eDhfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3NfMSh2cDhfdmFyaWFuY2Vfc2FkOHg4eDgpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9zYWQ4eDE2eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4MTZ4OCB2cDhfc2FkOHgxNng4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzXzEodnA4X3ZhcmlhbmNlX3NhZDh4MTZ4OCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDR4NHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ0eDR4OCB2cDhfc2FkNHg0eDhfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3NfMSh2cDhfdmFyaWFuY2Vfc2FkNHg0eDgpOwotCi0vLy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4NGQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2eDRkIHZwOF9zYWQxNngxNng0ZF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX2RpZl9hZGRyZXNzKHZwOF92YXJpYW5jZV9zYWQxNngxNng0ZCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4NGQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4NGQgdnA4X3NhZDE2eDh4NGRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9kaWZfYWRkcmVzcyh2cDhfdmFyaWFuY2Vfc2FkMTZ4OHg0ZCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3NhZDh4OHg0ZAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkOHg4eDRkIHZwOF9zYWQ4eDh4NGRfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9kaWZfYWRkcmVzcyh2cDhfdmFyaWFuY2Vfc2FkOHg4eDRkKTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkOHgxNng0ZAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkOHgxNng0ZCB2cDhfc2FkOHgxNng0ZF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX2RpZl9hZGRyZXNzKHZwOF92YXJpYW5jZV9zYWQ4eDE2eDRkKTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc2FkNHg0eDRkCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ0eDR4NGQgdnA4X3NhZDR4NHg0ZF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX2RpZl9hZGRyZXNzKHZwOF92YXJpYW5jZV9zYWQ0eDR4NGQpOwotCi0vLy09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KLQotI2lmbmRlZiB2cDhfdmFyaWFuY2VfdmFyNHg0Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXI0eDQgdnA4X3ZhcmlhbmNlNHg0X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfdmFyNHg0KTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2VfdmFyOHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXI4eDggdnA4X3ZhcmlhbmNlOHg4X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfdmFyOHg4KTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2VfdmFyOHgxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyOHgxNiB2cDhfdmFyaWFuY2U4eDE2X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfdmFyOHgxNik7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3ZhcjE2eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3ZhcjE2eDggdnA4X3ZhcmlhbmNlMTZ4OF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlX3ZhcjE2eDgpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV92YXIxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyMTZ4MTYgdnA4X3ZhcmlhbmNlMTZ4MTZfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZV92YXIxNngxNik7Ci0KLS8vLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI0eDQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjR4NCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfdmFyaWFuY2Vfc3VicGl4dmFyNHg0KTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyOHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDggdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4OCk7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDE2KTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjE2eDgpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9zdWJwaXh2YXIxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4MTYpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaAotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2gpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdgotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3YgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3YpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2KTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2Vfc3VicGl4bXNlMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeG1zZTE2eDE2IHZwOF9zdWJfcGl4ZWxfbXNlMTZ4MTZfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF92YXJpYW5jZV9zdWJwaXhtc2UxNngxNik7Ci0KLS8vLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9nZXRtYnNzCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXRtYnNzIHZwOF9nZXRfbWJfc3NfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX2dldG1ic3ModnA4X3ZhcmlhbmNlX2dldG1ic3MpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9tc2UxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfbXNlMTZ4MTYgdnA4X21zZTE2eDE2X2MKLSNlbmRpZgotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfbXNlMTZ4MTYpOwotCi0jaWZuZGVmIHZwOF92YXJpYW5jZV9nZXQxNngxNnByZWRlcnJvcgotI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0MTZ4MTZwcmVkZXJyb3IgdnA4X2dldDE2eDE2cHJlZF9lcnJvcl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF92YXJpYW5jZV9nZXQxNngxNnByZWRlcnJvcik7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX2dldDh4OHZhcgotI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0OHg4dmFyIHZwOF9nZXQ4eDh2YXJfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlMih2cDhfdmFyaWFuY2VfZ2V0OHg4dmFyKTsKLQotI2lmbmRlZiB2cDhfdmFyaWFuY2VfZ2V0MTZ4MTZ2YXIKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2dldDE2eDE2dmFyIHZwOF9nZXQxNngxNnZhcl9jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UyKHZwOF92YXJpYW5jZV9nZXQxNngxNnZhcik7Ci0KLSNpZm5kZWYgdnA4X3ZhcmlhbmNlX2dldDR4NHNzZV9jcwotI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0NHg0c3NlX2NzIHZwOF9nZXQ0eDRzc2VfY3NfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfdmFyaWFuY2VfZ2V0NHg0c3NlX2NzKTsKLQotI2lmbmRlZiB2cDhfc3NpbXBmCi0jZGVmaW5lIHZwOF9zc2ltcGYgc3NpbV9wYXJtc19jCi0jZW5kaWYKLWV4dGVybiBwcm90b3R5cGVfc3NpbXBmKHZwOF9zc2ltcGYpCi0KLSNpZm5kZWYgdnA4X3NzaW1wZl84eDgKLSNkZWZpbmUgdnA4X3NzaW1wZl84eDggc3NpbV9wYXJtc184eDhfYwotI2VuZGlmCi1leHRlcm4gcHJvdG90eXBlX3NzaW1wZih2cDhfc3NpbXBmXzh4OCkKLQotdHlwZWRlZiBwcm90b3R5cGVfc2FkKCp2cDhfc2FkX2ZuX3QpOwotdHlwZWRlZiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzcygqdnA4X3NhZF9tdWx0aV9mbl90KTsKLXR5cGVkZWYgcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3NfMSgqdnA4X3NhZF9tdWx0aTFfZm5fdCk7Ci10eXBlZGVmIHByb3RvdHlwZV9zYWRfbXVsdGlfZGlmX2FkZHJlc3MoKnZwOF9zYWRfbXVsdGlfZF9mbl90KTsKLXR5cGVkZWYgcHJvdG90eXBlX3ZhcmlhbmNlKCp2cDhfdmFyaWFuY2VfZm5fdCk7Ci10eXBlZGVmIHByb3RvdHlwZV92YXJpYW5jZTIoKnZwOF92YXJpYW5jZTJfZm5fdCk7Ci10eXBlZGVmIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSgqdnA4X3N1YnBpeHZhcmlhbmNlX2ZuX3QpOwotdHlwZWRlZiBwcm90b3R5cGVfZ2V0bWJzcygqdnA4X2dldG1ic3NfZm5fdCk7Ci0KLXR5cGVkZWYgcHJvdG90eXBlX3NzaW1wZigqdnA4X3NzaW1wZl9mbl90KQotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdnA4X3NhZF9mbl90ICAgICAgICAgICAgIHNhZDR4NDsKLSAgICB2cDhfc2FkX2ZuX3QgICAgICAgICAgICAgc2FkOHg4OwotICAgIHZwOF9zYWRfZm5fdCAgICAgICAgICAgICBzYWQ4eDE2OwotICAgIHZwOF9zYWRfZm5fdCAgICAgICAgICAgICBzYWQxNng4OwotICAgIHZwOF9zYWRfZm5fdCAgICAgICAgICAgICBzYWQxNngxNjsKLQotICAgIHZwOF92YXJpYW5jZV9mbl90ICAgICAgICB2YXI0eDQ7Ci0gICAgdnA4X3ZhcmlhbmNlX2ZuX3QgICAgICAgIHZhcjh4ODsKLSAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICAgdmFyOHgxNjsKLSAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICAgdmFyMTZ4ODsKLSAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICAgdmFyMTZ4MTY7Ci0KLSAgICB2cDhfc3VicGl4dmFyaWFuY2VfZm5fdCAgc3VicGl4dmFyNHg0OwotICAgIHZwOF9zdWJwaXh2YXJpYW5jZV9mbl90ICBzdWJwaXh2YXI4eDg7Ci0gICAgdnA4X3N1YnBpeHZhcmlhbmNlX2ZuX3QgIHN1YnBpeHZhcjh4MTY7Ci0gICAgdnA4X3N1YnBpeHZhcmlhbmNlX2ZuX3QgIHN1YnBpeHZhcjE2eDg7Ci0gICAgdnA4X3N1YnBpeHZhcmlhbmNlX2ZuX3QgIHN1YnBpeHZhcjE2eDE2OwotICAgIHZwOF92YXJpYW5jZV9mbl90ICAgICAgICBoYWxmcGl4dmFyMTZ4MTZfaDsKLSAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICAgaGFsZnBpeHZhcjE2eDE2X3Y7Ci0gICAgdnA4X3ZhcmlhbmNlX2ZuX3QgICAgICAgIGhhbGZwaXh2YXIxNngxNl9odjsKLSAgICB2cDhfc3VicGl4dmFyaWFuY2VfZm5fdCAgc3VicGl4bXNlMTZ4MTY7Ci0KLSAgICB2cDhfZ2V0bWJzc19mbl90ICAgICAgICAgZ2V0bWJzczsKLSAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICAgbXNlMTZ4MTY7Ci0KLSAgICB2cDhfc2FkX2ZuX3QgICAgICAgICAgICAgZ2V0MTZ4MTZwcmVkZXJyb3I7Ci0gICAgdnA4X3ZhcmlhbmNlMl9mbl90ICAgICAgIGdldDh4OHZhcjsKLSAgICB2cDhfdmFyaWFuY2UyX2ZuX3QgICAgICAgZ2V0MTZ4MTZ2YXI7Ci0gICAgdnA4X3NhZF9mbl90ICAgICAgICAgICAgIGdldDR4NHNzZV9jczsKLQotICAgIHZwOF9zYWRfbXVsdGlfZm5fdCAgICAgICBzYWQxNngxNngzOwotICAgIHZwOF9zYWRfbXVsdGlfZm5fdCAgICAgICBzYWQxNng4eDM7Ci0gICAgdnA4X3NhZF9tdWx0aV9mbl90ICAgICAgIHNhZDh4MTZ4MzsKLSAgICB2cDhfc2FkX211bHRpX2ZuX3QgICAgICAgc2FkOHg4eDM7Ci0gICAgdnA4X3NhZF9tdWx0aV9mbl90ICAgICAgIHNhZDR4NHgzOwotCi0gICAgdnA4X3NhZF9tdWx0aTFfZm5fdCAgICAgIHNhZDE2eDE2eDg7Ci0gICAgdnA4X3NhZF9tdWx0aTFfZm5fdCAgICAgIHNhZDE2eDh4ODsKLSAgICB2cDhfc2FkX211bHRpMV9mbl90ICAgICAgc2FkOHgxNng4OwotICAgIHZwOF9zYWRfbXVsdGkxX2ZuX3QgICAgICBzYWQ4eDh4ODsKLSAgICB2cDhfc2FkX211bHRpMV9mbl90ICAgICAgc2FkNHg0eDg7Ci0KLSAgICB2cDhfc2FkX211bHRpX2RfZm5fdCAgICAgc2FkMTZ4MTZ4NGQ7Ci0gICAgdnA4X3NhZF9tdWx0aV9kX2ZuX3QgICAgIHNhZDE2eDh4NGQ7Ci0gICAgdnA4X3NhZF9tdWx0aV9kX2ZuX3QgICAgIHNhZDh4MTZ4NGQ7Ci0gICAgdnA4X3NhZF9tdWx0aV9kX2ZuX3QgICAgIHNhZDh4OHg0ZDsKLSAgICB2cDhfc2FkX211bHRpX2RfZm5fdCAgICAgc2FkNHg0eDRkOwotCi0jaWYgQ09ORklHX1BTTlIKLSAgICB2cDhfc3NpbXBmX2ZuX3QgICAgICAgICAgc3NpbXBmXzh4ODsKLSAgICB2cDhfc3NpbXBmX2ZuX3QgICAgICAgICAgc3NpbXBmOwotI2VuZGlmCi0KLX0gdnA4X3ZhcmlhbmNlX3J0Y2RfdnRhYmxlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdnA4X3NhZF9mbl90ICAgICAgICAgICAgc2RmOwotICAgIHZwOF92YXJpYW5jZV9mbl90ICAgICAgIHZmOwotICAgIHZwOF9zdWJwaXh2YXJpYW5jZV9mbl90IHN2ZjsKLSAgICB2cDhfdmFyaWFuY2VfZm5fdCAgICAgICBzdmZfaGFsZnBpeF9oOwotICAgIHZwOF92YXJpYW5jZV9mbl90ICAgICAgIHN2Zl9oYWxmcGl4X3Y7Ci0gICAgdnA4X3ZhcmlhbmNlX2ZuX3QgICAgICAgc3ZmX2hhbGZwaXhfaHY7Ci0gICAgdnA4X3NhZF9tdWx0aV9mbl90ICAgICAgc2R4M2Y7Ci0gICAgdnA4X3NhZF9tdWx0aTFfZm5fdCAgICAgc2R4OGY7Ci0gICAgdnA4X3NhZF9tdWx0aV9kX2ZuX3QgICAgc2R4NGRmOwotCi19IHZwOF92YXJpYW5jZV9mbl9wdHJfdDsKLQotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSNkZWZpbmUgVkFSSUFOQ0VfSU5WT0tFKGN0eCxmbikgKGN0eCktPmZuCi0jZWxzZQotI2RlZmluZSBWQVJJQU5DRV9JTlZPS0UoY3R4LGZuKSB2cDhfdmFyaWFuY2VfIyNmbgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIvdmFyaWFuY2VfYy5jIGIvdnA4L2VuY29kZXIvdmFyaWFuY2VfYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGUwN2M4Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3ZhcmlhbmNlX2MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZhcmlhbmNlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9maWx0ZXIuaCIKLQotCi11bnNpZ25lZCBpbnQgdnA4X2dldF9tYl9zc19jCi0oCi0gICAgY29uc3Qgc2hvcnQgKnNyY19wdHIKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSA9IDAsIHN1bSA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgc3VtICs9IChzcmNfcHRyW2ldICogc3JjX3B0cltpXSk7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgd2hpbGUgKGkgPCAyNTYpOwotCi0gICAgcmV0dXJuIHN1bTsKLX0KLQotCi1zdGF0aWMgdm9pZCB2YXJpYW5jZSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIGludCAgdywKLSAgICBpbnQgIGgsCi0gICAgdW5zaWduZWQgaW50ICpzc2UsCi0gICAgaW50ICpzdW0pCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGRpZmY7Ci0KLSAgICAqc3VtID0gMDsKLSAgICAqc3NlID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmID0gc3JjX3B0cltqXSAtIHJlZl9wdHJbal07Ci0gICAgICAgICAgICAqc3VtICs9IGRpZmY7Ci0gICAgICAgICAgICAqc3NlICs9IGRpZmYgKiBkaWZmOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjX3B0ciArPSBzb3VyY2Vfc3RyaWRlOwotICAgICAgICByZWZfcHRyICs9IHJlY29uX3N0cmlkZTsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIGludAotdnA4X2dldDh4OHZhcl9jCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKlNTRSwKLSAgICBpbnQgKlN1bQotKQotewotCi0gICAgdmFyaWFuY2Uoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCA4LCA4LCBTU0UsIFN1bSk7Ci0gICAgcmV0dXJuICgqU1NFIC0gKCgoKlN1bSkgKiAoKlN1bSkpID4+IDYpKTsKLX0KLQotdW5zaWduZWQgaW50Ci12cDhfZ2V0MTZ4MTZ2YXJfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpTU0UsCi0gICAgaW50ICpTdW0KLSkKLXsKLQotICAgIHZhcmlhbmNlKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgMTYsIDE2LCBTU0UsIFN1bSk7Ci0gICAgcmV0dXJuICgqU1NFIC0gKCgoKlN1bSkgKiAoKlN1bSkpID4+IDgpKTsKLQotfQotCi0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdmFyOwotICAgIGludCBhdmc7Ci0KLQotICAgIHZhcmlhbmNlKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgMTYsIDE2LCAmdmFyLCAmYXZnKTsKLSAgICAqc3NlID0gdmFyOwotICAgIHJldHVybiAodmFyIC0gKChhdmcgKiBhdmcpID4+IDgpKTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4MTZfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIHVuc2lnbmVkIGludCB2YXI7Ci0gICAgaW50IGF2ZzsKLQotCi0gICAgdmFyaWFuY2Uoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCA4LCAxNiwgJnZhciwgJmF2Zyk7Ci0gICAgKnNzZSA9IHZhcjsKLSAgICByZXR1cm4gKHZhciAtICgoYXZnICogYXZnKSA+PiA3KSk7Ci19Ci0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2UxNng4X2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdmFyOwotICAgIGludCBhdmc7Ci0KLQotICAgIHZhcmlhbmNlKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgMTYsIDgsICZ2YXIsICZhdmcpOwotICAgICpzc2UgPSB2YXI7Ci0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNykpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDhfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIHVuc2lnbmVkIGludCB2YXI7Ci0gICAgaW50IGF2ZzsKLQotCi0gICAgdmFyaWFuY2Uoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCA4LCA4LCAmdmFyLCAmYXZnKTsKLSAgICAqc3NlID0gdmFyOwotICAgIHJldHVybiAodmFyIC0gKChhdmcgKiBhdmcpID4+IDYpKTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTR4NF9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgdW5zaWduZWQgaW50IHZhcjsKLSAgICBpbnQgYXZnOwotCi0KLSAgICB2YXJpYW5jZShzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsIDQsIDQsICZ2YXIsICZhdmcpOwotICAgICpzc2UgPSB2YXI7Ci0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNCkpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfbXNlMTZ4MTZfYygKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIHVuc2lnbmVkIGludCB2YXI7Ci0gICAgaW50IGF2ZzsKLQotICAgIHZhcmlhbmNlKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgMTYsIDE2LCAmdmFyLCAmYXZnKTsKLSAgICAqc3NlID0gdmFyOwotICAgIHJldHVybiB2YXI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IGZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzCi0gKgotICogIElOUFVUUyAgICAgICAgOiBVSU5UOCAgKnNyY19wdHIgICAgICAgICAgOiBQb2ludGVyIHRvIHNvdXJjZSBibG9jay4KLSAqICAgICAgICAgICAgICAgICAgVUlOVDMyIHNyY19waXhlbHNfcGVyX2xpbmUgOiBTdHJpZGUgb2YgaW5wdXQgYmxvY2suCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiBwaXhlbF9zdGVwICAgICAgICA6IE9mZnNldCBiZXR3ZWVuIGZpbHRlciBpbnB1dCBzYW1wbGVzIChzZWUgbm90ZXMpLgotICogICAgICAgICAgICAgICAgICBVSU5UMzIgb3V0cHV0X2hlaWdodCAgICAgOiBJbnB1dCBibG9jayBoZWlnaHQuCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiBvdXRwdXRfd2lkdGggICAgICA6IElucHV0IGJsb2NrIHdpZHRoLgotICogICAgICAgICAgICAgICAgICBJTlQzMiAgKnZwOF9maWx0ZXIgICAgICAgICAgOiBBcnJheSBvZiAyIGJpLWxpbmVhciBmaWx0ZXIgdGFwcy4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IElOVDMyICpvdXRwdXRfcHRyICAgICAgICA6IFBvaW50ZXIgdG8gZmlsdGVyZWQgYmxvY2suCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBBcHBsaWVzIGEgMS1EIDItdGFwIGJpLWxpbmVhciBmaWx0ZXIgdG8gdGhlIHNvdXJjZSBibG9jayBpbgotICogICAgICAgICAgICAgICAgICBlaXRoZXIgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBkaXJlY3Rpb24gdG8gcHJvZHVjZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgZmlsdGVyZWQgb3V0cHV0IGJsb2NrLiBVc2VkIHRvIGltcGxlbWVudCBmaXJzdC1wYXNzCi0gKiAgICAgICAgICAgICAgICAgIG9mIDItRCBzZXBhcmFibGUgZmlsdGVyLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogUHJvZHVjZXMgSU5UMzIgb3V0cHV0IHRvIHJldGFpbiBwcmVjaXNpb24gZm9yIG5leHQgcGFzcy4KLSAqICAgICAgICAgICAgICAgICAgVHdvIGZpbHRlciB0YXBzIHNob3VsZCBzdW0gdG8gVlA4X0ZJTFRFUl9XRUlHSFQuCi0gKiAgICAgICAgICAgICAgICAgIHBpeGVsX3N0ZXAgZGVmaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgaXMgYXBwbGllZAotICogICAgICAgICAgICAgICAgICBob3Jpem9udGFsbHkgKHBpeGVsX3N0ZXA9MSkgb3IgdmVydGljYWxseSAocGl4ZWxfc3RlcD1zdHJpZGUpLgotICogICAgICAgICAgICAgICAgICBJdCBkZWZpbmVzIHRoZSBvZmZzZXQgcmVxdWlyZWQgdG8gbW92ZSBmcm9tIG9uZSBpbnB1dAotICogICAgICAgICAgICAgICAgICB0byB0aGUgbmV4dC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50IHBpeGVsX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKLSAgICBjb25zdCBzaG9ydCAqdnA4X2ZpbHRlcgotKQotewotICAgIHVuc2lnbmVkIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG91dHB1dF9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRfd2lkdGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXBwbHkgYmlsaW5lYXIgZmlsdGVyCi0gICAgICAgICAgICBvdXRwdXRfcHRyW2pdID0gKCgoaW50KXNyY19wdHJbMF0gICAgICAgICAgKiB2cDhfZmlsdGVyWzBdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KXNyY19wdHJbcGl4ZWxfc3RlcF0gKiB2cDhfZmlsdGVyWzFdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWUDhfRklMVEVSX1dFSUdIVCAvIDIpKSA+PiBWUDhfRklMVEVSX1NISUZUOwotICAgICAgICAgICAgc3JjX3B0cisrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTmV4dCByb3cuLi4KLSAgICAgICAgc3JjX3B0ciAgICArPSBzcmNfcGl4ZWxzX3Blcl9saW5lIC0gb3V0cHV0X3dpZHRoOwotICAgICAgICBvdXRwdXRfcHRyICs9IG91dHB1dF93aWR0aDsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBmaWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IElOVDMyICAqc3JjX3B0ciAgICAgICAgICA6IFBvaW50ZXIgdG8gc291cmNlIGJsb2NrLgotICogICAgICAgICAgICAgICAgICBVSU5UMzIgc3JjX3BpeGVsc19wZXJfbGluZSA6IFN0cmlkZSBvZiBpbnB1dCBibG9jay4KLSAqICAgICAgICAgICAgICAgICAgVUlOVDMyIHBpeGVsX3N0ZXAgICAgICAgIDogT2Zmc2V0IGJldHdlZW4gZmlsdGVyIGlucHV0IHNhbXBsZXMgKHNlZSBub3RlcykuCi0gKiAgICAgICAgICAgICAgICAgIFVJTlQzMiBvdXRwdXRfaGVpZ2h0ICAgICA6IElucHV0IGJsb2NrIGhlaWdodC4KLSAqICAgICAgICAgICAgICAgICAgVUlOVDMyIG91dHB1dF93aWR0aCAgICAgIDogSW5wdXQgYmxvY2sgd2lkdGguCi0gKiAgICAgICAgICAgICAgICAgIElOVDMyICAqdnA4X2ZpbHRlciAgICAgICAgICA6IEFycmF5IG9mIDIgYmktbGluZWFyIGZpbHRlciB0YXBzLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogVUlOVDE2ICpvdXRwdXRfcHRyICAgICAgIDogUG9pbnRlciB0byBmaWx0ZXJlZCBibG9jay4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IEFwcGxpZXMgYSAxLUQgMi10YXAgYmktbGluZWFyIGZpbHRlciB0byB0aGUgc291cmNlIGJsb2NrIGluCi0gKiAgICAgICAgICAgICAgICAgIGVpdGhlciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGRpcmVjdGlvbiB0byBwcm9kdWNlIHRoZQotICogICAgICAgICAgICAgICAgICBmaWx0ZXJlZCBvdXRwdXQgYmxvY2suIFVzZWQgdG8gaW1wbGVtZW50IHNlY29uZC1wYXNzCi0gKiAgICAgICAgICAgICAgICAgIG9mIDItRCBzZXBhcmFibGUgZmlsdGVyLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogUmVxdWlyZXMgMzItYml0IGlucHV0IGFzIHByb2R1Y2VkIGJ5IGZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzLgotICogICAgICAgICAgICAgICAgICBUd28gZmlsdGVyIHRhcHMgc2hvdWxkIHN1bSB0byBWUDhfRklMVEVSX1dFSUdIVC4KLSAqICAgICAgICAgICAgICAgICAgcGl4ZWxfc3RlcCBkZWZpbmVzIHdoZXRoZXIgdGhlIGZpbHRlciBpcyBhcHBsaWVkCi0gKiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxseSAocGl4ZWxfc3RlcD0xKSBvciB2ZXJ0aWNhbGx5IChwaXhlbF9zdGVwPXN0cmlkZSkuCi0gKiAgICAgICAgICAgICAgICAgIEl0IGRlZmluZXMgdGhlIG9mZnNldCByZXF1aXJlZCB0byBtb3ZlIGZyb20gb25lIGlucHV0Ci0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBuZXh0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcwotKAotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgICpvdXRwdXRfcHRyLAotICAgIHVuc2lnbmVkIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgIHBpeGVsX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50ICBvdXRwdXRfaGVpZ2h0LAotICAgIHVuc2lnbmVkIGludCAgb3V0cHV0X3dpZHRoLAotICAgIGNvbnN0IHNob3J0ICp2cDhfZmlsdGVyCi0pCi17Ci0gICAgdW5zaWduZWQgaW50ICBpLCBqOwotICAgIGludCAgVGVtcDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXRfaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0X3dpZHRoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFwcGx5IGZpbHRlcgotICAgICAgICAgICAgVGVtcCA9ICgoaW50KXNyY19wdHJbMF0gICAgICAgICAqIHZwOF9maWx0ZXJbMF0pICsKLSAgICAgICAgICAgICAgICAgICAoKGludClzcmNfcHRyW3BpeGVsX3N0ZXBdICogdnA4X2ZpbHRlclsxXSkgKwotICAgICAgICAgICAgICAgICAgIChWUDhfRklMVEVSX1dFSUdIVCAvIDIpOwotICAgICAgICAgICAgb3V0cHV0X3B0cltqXSA9ICh1bnNpZ25lZCBpbnQpKFRlbXAgPj4gVlA4X0ZJTFRFUl9TSElGVCk7Ci0gICAgICAgICAgICBzcmNfcHRyKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOZXh0IHJvdy4uLgotICAgICAgICBzcmNfcHRyICAgICs9IHNyY19waXhlbHNfcGVyX2xpbmUgLSBvdXRwdXRfd2lkdGg7Ci0gICAgICAgIG91dHB1dF9wdHIgKz0gb3V0cHV0X3dpZHRoOwotICAgIH0KLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF9jCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZQotKQotewotICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0gICAgdW5zaWduZWQgc2hvcnQgRkRhdGEzWzUqNF07IC8vIFRlbXAgZGF0YSBidWZmZmVyIHVzZWQgaW4gZmlsdGVyaW5nCi0KLSAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07Ci0gICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOwotCi0gICAgLy8gRmlyc3QgZmlsdGVyIDFkIEhvcml6b250YWwKLSAgICB2YXJfZmlsdGVyX2Jsb2NrMmRfYmlsX2ZpcnN0X3Bhc3Moc3JjX3B0ciwgRkRhdGEzLCBzcmNfcGl4ZWxzX3Blcl9saW5lLCAxLCA1LCA0LCBIRmlsdGVyKTsKLQotICAgIC8vIE5vdyBmaWx0ZXIgVmVydGljYWx5Ci0gICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcyhGRGF0YTMsIHRlbXAyLCA0LCAgNCwgIDQsICA0LCBWRmlsdGVyKTsKLQotICAgIHJldHVybiB2cDhfdmFyaWFuY2U0eDRfYyh0ZW1wMiwgNCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9jCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZQotKQotewotICAgIHVuc2lnbmVkIHNob3J0IEZEYXRhM1s5KjhdOyAvLyBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZwotICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0KLSAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07Ci0gICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOwotCi0gICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzKHNyY19wdHIsIEZEYXRhMywgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgOCwgSEZpbHRlcik7Ci0gICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcyhGRGF0YTMsIHRlbXAyLCA4LCA4LCA4LCA4LCBWRmlsdGVyKTsKLQotICAgIHJldHVybiB2cDhfdmFyaWFuY2U4eDhfYyh0ZW1wMiwgOCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9jCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZQotKQotewotICAgIHVuc2lnbmVkIHNob3J0IEZEYXRhM1sxNyoxNl07ICAgLy8gVGVtcCBkYXRhIGJ1ZmZmZXIgdXNlZCBpbiBmaWx0ZXJpbmcKLSAgICB1bnNpZ25lZCBjaGFyICB0ZW1wMlsyMCoxNl07Ci0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsICpWRmlsdGVyOwotCi0gICAgSEZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3hvZmZzZXRdOwotICAgIFZGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t5b2Zmc2V0XTsKLQotICAgIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcyhzcmNfcHRyLCBGRGF0YTMsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDE3LCAxNiwgSEZpbHRlcik7Ci0gICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9zZWNvbmRfcGFzcyhGRGF0YTMsIHRlbXAyLCAxNiwgMTYsIDE2LCAxNiwgVkZpbHRlcik7Ci0KLSAgICByZXR1cm4gdnA4X3ZhcmlhbmNlMTZ4MTZfYyh0ZW1wMiwgMTYsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Ci19Ci0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9jKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgcmV0dXJuIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9jKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIDQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgc3NlKTsKLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICByZXR1cm4gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2Moc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgMCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCBzc2UpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X2MoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICByZXR1cm4gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2Moc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgNCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCBzc2UpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX21zZTE2eDE2X2MKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X2Moc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgeG9mZnNldCwgeW9mZnNldCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLSAgICByZXR1cm4gKnNzZTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X2MKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgRkRhdGEzWzE2KjldOyAgICAvLyBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZwotICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0KLSAgICBIRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeG9mZnNldF07Ci0gICAgVkZpbHRlciA9IHZwOF9iaWxpbmVhcl9maWx0ZXJzW3lvZmZzZXRdOwotCi0gICAgdmFyX2ZpbHRlcl9ibG9jazJkX2JpbF9maXJzdF9wYXNzKHNyY19wdHIsIEZEYXRhMywgc3JjX3BpeGVsc19wZXJfbGluZSwgMSwgOSwgMTYsIEhGaWx0ZXIpOwotICAgIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfc2Vjb25kX3Bhc3MoRkRhdGEzLCB0ZW1wMiwgMTYsIDE2LCA4LCAxNiwgVkZpbHRlcik7Ci0KLSAgICByZXR1cm4gdnA4X3ZhcmlhbmNlMTZ4OF9jKHRlbXAyLCAxNiwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X2MKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgRkRhdGEzWzkqMTZdOyAgICAvLyBUZW1wIGRhdGEgYnVmZmZlciB1c2VkIGluIGZpbHRlcmluZwotICAgIHVuc2lnbmVkIGNoYXIgIHRlbXAyWzIwKjE2XTsKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwgKlZGaWx0ZXI7Ci0KLQotICAgIEhGaWx0ZXIgPSB2cDhfYmlsaW5lYXJfZmlsdGVyc1t4b2Zmc2V0XTsKLSAgICBWRmlsdGVyID0gdnA4X2JpbGluZWFyX2ZpbHRlcnNbeW9mZnNldF07Ci0KLQotICAgIHZhcl9maWx0ZXJfYmxvY2syZF9iaWxfZmlyc3RfcGFzcyhzcmNfcHRyLCBGRGF0YTMsIHNyY19waXhlbHNfcGVyX2xpbmUsIDEsIDE3LCA4LCBIRmlsdGVyKTsKLSAgICB2YXJfZmlsdGVyX2Jsb2NrMmRfYmlsX3NlY29uZF9wYXNzKEZEYXRhMywgdGVtcDIsIDgsIDgsIDE2LCA4LCBWRmlsdGVyKTsKLQotICAgIHJldHVybiB2cDhfdmFyaWFuY2U4eDE2X2ModGVtcDIsIDgsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Ci19CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvZGN0X21teC5hc20gYi92cDgvZW5jb2Rlci94ODYvZGN0X21teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2IwMzAuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIveDg2L2RjdF9tbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO3ZvaWQgdnA4X3Nob3J0X2ZkY3Q0eDRfbW14KHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQotZ2xvYmFsIHN5bSh2cDhfc2hvcnRfZmRjdDR4NF9tbXgpCi1zeW0odnA4X3Nob3J0X2ZkY3Q0eDRfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsICAgICAgICByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAzCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgOyBpbnB1dAotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMSkgICAgICA7IG91dHB1dAotCi0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO3BpdGNoCi0KLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgW3JzaSArIHJheCoyXQotICAgICAgICA7IHJlYWQgdGhlIGlucHV0IGRhdGEKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgW3JzaSArIHJheF0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBbcmN4XQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcmN4ICsgcmF4XQotCi0gICAgICAgIDsgdHJhbnNwb3NlIGZvciB0aGUgZmlyc3Qgc3RhZ2UKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgbW0wICAgICAgICAgOyAwMCAwMSAwMiAwMwotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICA7IDIwIDIxIDIyIDIzCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgOyAwMCAxMCAwMSAxMQotICAgICAgICBwdW5wY2tod2QgICBtbTMsICAgICAgICBtbTEgICAgICAgICA7IDAyIDEyIDAzIDEzCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0yLCAgICAgICAgbW00ICAgICAgICAgOyAyMCAzMCAyMSAzMQotICAgICAgICBwdW5wY2tod2QgICBtbTUsICAgICAgICBtbTQgICAgICAgICA7IDIyIDMyIDIzIDMzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgOyAwMCAxMCAwMSAxMQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICBtbTIgICAgICAgICA7IDAwIDEwIDIwIDMwCi0KLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgOyAwMSAxMSAyMSAzMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMyAgICAgICAgIDsgMDIgMTIgMDMgMTMKLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgbW01ICAgICAgICAgOyAwMiAxMiAyMiAzMgotCi0gICAgICAgIHB1bnBja2hkcSAgIG1tMywgICAgICAgIG1tNSAgICAgICAgIDsgMDMgMTMgMjMgMzMKLQotICAgICAgICA7IG1tMCAwCi0gICAgICAgIDsgbW0xIDEKLSAgICAgICAgOyBtbTIgMgotICAgICAgICA7IG1tMyAzCi0KLSAgICAgICAgOyBmaXJzdCBzdGFnZQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0xCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgbW0zICAgICAgICAgOyBhMSA9IDAgKyAzCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgICAgIG1tMiAgICAgICAgIDsgYjEgPSAxICsgMgotCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tNCwgICAgICAgIG1tMiAgICAgICAgIDsgYzEgPSAxIC0gMgotICAgICAgICBwc3VidyAgICAgICBtbTUsICAgICAgICBtbTMgICAgICAgICA7IGQxID0gMCAtIDMKLQotICAgICAgICBwc2xsdyAgICAgICBtbTUsICAgICAgICAzCi0gICAgICAgIHBzbGx3ICAgICAgIG1tNCwgICAgICAgIDMKLQotICAgICAgICBwc2xsdyAgICAgICBtbTAsICAgICAgICAzCi0gICAgICAgIHBzbGx3ICAgICAgIG1tMSwgICAgICAgIDMKLQotICAgICAgICA7IG91dHB1dCAwIGFuZCAyCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tMCAgICAgICAgIDsgYTEKLQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgICAgICBtbTEgICAgICAgICA7IG9wWzBdID0gYTEgKyBiMQotICAgICAgICBwc3VidyAgICAgICBtbTIsICAgICAgICBtbTEgICAgICAgICA7IG9wWzJdID0gYTEgLSBiMQotCi0gICAgICAgIDsgb3V0cHV0IDEgYW5kIDMKLSAgICAgICAgOyBpbnRlcmxlYXZlIGMxLCBkMQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICA7IGQxCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tNCAgICAgICAgIDsgYzEgZDEKLSAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW00ICAgICAgICAgOyBjMSBkMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTUKLQotICAgICAgICBwbWFkZHdkICAgICBtbTEsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTCAoXzUzNTJfMjIxNyldICAgIDsgYzEqMjIxNyArIGQxKjUzNTIKLSAgICAgICAgcG1hZGR3ZCAgICAgbW00LCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwgKF81MzUyXzIyMTcpXSAgICA7IGMxKjIyMTcgKyBkMSo1MzUyCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgbW0zLCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwoXzIyMTdfbmVnNTM1MildICA7IGQxKjIyMTcgLSBjMSo1MzUyCi0gICAgICAgIHBtYWRkd2QgICAgIG1tNSwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgotCi0gICAgICAgIHBhZGRkICAgICAgIG1tMSwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8xNDUwMCldCi0gICAgICAgIHBhZGRkICAgICAgIG1tNCwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8xNDUwMCldCi0gICAgICAgIHBhZGRkICAgICAgIG1tMywgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF83NTAwKV0KLSAgICAgICAgcGFkZGQgICAgICAgbW01LCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwoXzc1MDApXQotCi0gICAgICAgIHBzcmFkICAgICAgIG1tMSwgICAgICAgIDEyICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjEyCi0gICAgICAgIHBzcmFkICAgICAgIG1tNCwgICAgICAgIDEyICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjEyCi0gICAgICAgIHBzcmFkICAgICAgIG1tMywgICAgICAgIDEyICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjEyCi0gICAgICAgIHBzcmFkICAgICAgIG1tNSwgICAgICAgIDEyICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjEyCi0KLSAgICAgICAgcGFja3NzZHcgICAgbW0xLCAgICAgICAgbW00ICAgICAgICAgOyBvcFsxXQotICAgICAgICBwYWNrc3NkdyAgICBtbTMsICAgICAgICBtbTUgICAgICAgICA7IG9wWzNdCi0KLSAgICAgICAgOyBkb25lIHdpdGggdmVydGljYWwKLSAgICAgICAgOyB0cmFuc3Bvc2UgZm9yIHRoZSBzZWNvbmQgc3RhZ2UKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgbW0wICAgICAgICAgOyAwMCAxMCAyMCAzMAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBtbTIgICAgICAgICA7IDAyIDEyIDIyIDMyCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgOyAwMCAwMSAxMCAxMQotICAgICAgICBwdW5wY2tod2QgICBtbTQsICAgICAgICBtbTEgICAgICAgICA7IDIwIDIxIDMwIDMxCi0KLSAgICAgICAgcHVucGNrbHdkICAgbW0yLCAgICAgICAgbW0zICAgICAgICAgOyAwMiAwMyAxMiAxMwotICAgICAgICBwdW5wY2tod2QgICBtbTUsICAgICAgICBtbTMgICAgICAgICA7IDIyIDIzIDMyIDMzCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgOyAwMCAwMSAxMCAxMQotICAgICAgICBwdW5wY2tsZHEgICBtbTAsICAgICAgICBtbTIgICAgICAgICA7IDAwIDAxIDAyIDAzCi0KLSAgICAgICAgcHVucGNraGRxICAgbW0xLCAgICAgICAgbW0yICAgICAgICAgOyAwMSAyMiAxMiAxMwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgIG1tNCAgICAgICAgIDsgMjAgMzEgMzAgMzEKLSAgICAgICAgcHVucGNrbGRxICAgbW0yLCAgICAgICAgbW01ICAgICAgICAgOyAyMCAyMSAyMiAyMwotCi0gICAgICAgIHB1bnBja2hkcSAgIG1tNCwgICAgICAgIG1tNSAgICAgICAgIDsgMzAgMzEgMzIgMzMKLQotICAgICAgICA7IG1tMCAwCi0gICAgICAgIDsgbW0xIDEKLSAgICAgICAgOyBtbTIgMgotICAgICAgICA7IG1tMyA0Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgIG1tNCAgICAgICAgIDsgYTEgPSAwICsgMwotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgICAgICBtbTIgICAgICAgICA7IGIxID0gMSArIDIKLQotICAgICAgICBwc3VidyAgICAgICBtbTMsICAgICAgICBtbTIgICAgICAgICA7IGMxID0gMSAtIDIKLSAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW00ICAgICAgICAgOyBkMSA9IDAgLSAzCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCAgICAgICAgbW02ICAgICAgICAgOyB6ZXJvIG91dCBmb3IgY29tcGFyZQotCi0gICAgICAgIHBjbXBlcXcgICAgIG1tNiwgICAgICAgIG1tNSAgICAgICAgIDsgZDEgIT0gMAotCi0gICAgICAgIHBhbmRuICAgICAgIG1tNiwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF9jbXBfbWFzayldICAgOyBjbGVhciB1cHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFuZCBrZWVwIGJpdCAwIG9mIGxvd2VyCi0KLSAgICAgICAgOyBvdXRwdXQgMCBhbmQgMgotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICBtbTAgICAgICAgICA7IGExCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgbW0xICAgICAgICAgOyBhMSArIGIxCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMiwgICAgICAgIG1tMSAgICAgICAgIDsgYTEgLSBiMQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF83dyldCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF83dyldCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW0wLCAgICAgICAgNCAgICAgICAgICAgOyBvcFswXSA9IChhMSArIGIxICsgNyk+PjQKLSAgICAgICAgcHNyYXcgICAgICAgbW0yLCAgICAgICAgNCAgICAgICAgICAgOyBvcFs4XSA9IChhMSAtIGIxICsgNyk+PjQKLQotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSW3JkaSArIDAgXSwgIG1tMAotICAgICAgICBtb3ZxICAgICAgICBNTVdPUkQgUFRSW3JkaSArIDE2XSwgIG1tMgotCi0gICAgICAgIDsgb3V0cHV0IDEgYW5kIDMKLSAgICAgICAgOyBpbnRlcmxlYXZlIGMxLCBkMQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICBtbTUgICAgICAgICA7IGQxCi0gICAgICAgIHB1bnBja2x3ZCAgIG1tMSwgICAgICAgIG1tMyAgICAgICAgIDsgYzEgZDEKLSAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgbW0zICAgICAgICAgOyBjMSBkMQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBtbTUKLQotICAgICAgICBwbWFkZHdkICAgICBtbTEsICAgICAgICBNTVdPUkQgUFRSW0dMT0JBTCAoXzUzNTJfMjIxNyldICAgIDsgYzEqMjIxNyArIGQxKjUzNTIKLSAgICAgICAgcG1hZGR3ZCAgICAgbW00LCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwgKF81MzUyXzIyMTcpXSAgICA7IGMxKjIyMTcgKyBkMSo1MzUyCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgbW0zLCAgICAgICAgTU1XT1JEIFBUUltHTE9CQUwoXzIyMTdfbmVnNTM1MildICA7IGQxKjIyMTcgLSBjMSo1MzUyCi0gICAgICAgIHBtYWRkd2QgICAgIG1tNSwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgotCi0gICAgICAgIHBhZGRkICAgICAgIG1tMSwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8xMjAwMCldCi0gICAgICAgIHBhZGRkICAgICAgIG1tNCwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF8xMjAwMCldCi0gICAgICAgIHBhZGRkICAgICAgIG1tMywgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF81MTAwMCldCi0gICAgICAgIHBhZGRkICAgICAgIG1tNSwgICAgICAgIE1NV09SRCBQVFJbR0xPQkFMKF81MTAwMCldCi0KLSAgICAgICAgcHNyYWQgICAgICAgbW0xLCAgICAgICAgMTYgICAgICAgICAgOyAoYzEgKiAyMjE3ICsgZDEgKiA1MzUyICsgIDE0NTAwKT4+MTYKLSAgICAgICAgcHNyYWQgICAgICAgbW00LCAgICAgICAgMTYgICAgICAgICAgOyAoYzEgKiAyMjE3ICsgZDEgKiA1MzUyICsgIDE0NTAwKT4+MTYKLSAgICAgICAgcHNyYWQgICAgICAgbW0zLCAgICAgICAgMTYgICAgICAgICAgOyAoZDEgKiAyMjE3IC0gYzEgKiA1MzUyICsgICA3NTAwKT4+MTYKLSAgICAgICAgcHNyYWQgICAgICAgbW01LCAgICAgICAgMTYgICAgICAgICAgOyAoZDEgKiAyMjE3IC0gYzEgKiA1MzUyICsgICA3NTAwKT4+MTYKLQotICAgICAgICBwYWNrc3NkdyAgICBtbTEsICAgICAgICBtbTQgICAgICAgICA7IG9wWzRdCi0gICAgICAgIHBhY2tzc2R3ICAgIG1tMywgICAgICAgIG1tNSAgICAgICAgIDsgb3BbMTJdCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW02ICAgICAgICAgOyBvcFs0XSArPSAoZDEhPTApCi0KLSAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUltyZGkgKyA4IF0sICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgTU1XT1JEIFBUUltyZGkgKyAyNF0sICBtbTMKLQotICAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gOAotXzUzNTJfMjIxNzoKLSAgICBkdyA1MzUyCi0gICAgZHcgMjIxNwotICAgIGR3IDUzNTIKLSAgICBkdyAyMjE3Ci1hbGlnbiA4Ci1fMjIxN19uZWc1MzUyOgotICAgIGR3IDIyMTcKLSAgICBkdyAtNTM1MgotICAgIGR3IDIyMTcKLSAgICBkdyAtNTM1MgotYWxpZ24gOAotX2NtcF9tYXNrOgotICAgIHRpbWVzIDQgZHcgMQotYWxpZ24gOAotXzd3OgotICAgIHRpbWVzIDQgZHcgNwotYWxpZ24gOAotXzE0NTAwOgotICAgIHRpbWVzIDIgZGQgMTQ1MDAKLWFsaWduIDgKLV83NTAwOgotICAgIHRpbWVzIDIgZGQgNzUwMAotYWxpZ24gOAotXzEyMDAwOgotICAgIHRpbWVzIDIgZGQgMTIwMDAKLWFsaWduIDgKLV81MTAwMDoKLSAgICB0aW1lcyAyIGRkIDUxMDAwCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvZGN0X3NzZTIuYXNtIGIvdnA4L2VuY29kZXIveDg2L2RjdF9zc2UyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZGQ5OC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvZGN0X3NzZTIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotJW1hY3JvIFNUQUNLX0ZSQU1FX0NSRUFURSAwCi0laWYgQUJJX0lTXzMyQklUCi0gICVkZWZpbmUgICAgICAgaW5wdXQgICAgICAgcnNpCi0gICVkZWZpbmUgICAgICAgb3V0cHV0ICAgICAgcmRpCi0gICVkZWZpbmUgICAgICAgcGl0Y2ggICAgICAgcmF4Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDApCi0gICAgbW92ICAgICAgICAgcmRpLCBhcmcoMSkKLQotICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIGFyZygyKQotICAgIGxlYSAgICAgICAgIHJjeCwgW3JzaSArIHJheCoyXQotJWVsc2UKLSAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAotICAgICVkZWZpbmUgICAgIGlucHV0ICAgICAgIHJjeAotICAgICVkZWZpbmUgICAgIG91dHB1dCAgICAgIHJkeAotICAgICVkZWZpbmUgICAgIHBpdGNoICAgICAgIHI4Ci0gICVlbHNlCi0gICAgJWRlZmluZSAgICAgaW5wdXQgICAgICAgcmRpCi0gICAgJWRlZmluZSAgICAgb3V0cHV0ICAgICAgcnNpCi0gICAgJWRlZmluZSAgICAgcGl0Y2ggICAgICAgcmR4Ci0gICVlbmRpZgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIFNUQUNLX0ZSQU1FX0RFU1RST1kgMAotICAlZGVmaW5lICAgICBpbnB1dAotICAlZGVmaW5lICAgICBvdXRwdXQKLSAgJWRlZmluZSAgICAgcGl0Y2gKLQotJWlmIEFCSV9JU18zMkJJVAotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgcG9wICAgICAgICAgcmJwCi0lZWxzZQotICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0Ci0gICVlbmRpZgotJWVuZGlmCi0gICAgcmV0Ci0lZW5kbWFjcm8KLQotO3ZvaWQgdnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMihzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLWdsb2JhbCBzeW0odnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMikKLXN5bSh2cDhfc2hvcnRfZmRjdDR4NF9zc2UyKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURQotCi0gICAgbW92cSAgICAgICAgeG1tMCwgTU1XT1JEIFBUUltpbnB1dCAgICAgICAgXSA7MDMgMDIgMDEgMDAKLSAgICBtb3ZxICAgICAgICB4bW0yLCBNTVdPUkQgUFRSW2lucHV0KyAgcGl0Y2hdIDsxMyAxMiAxMSAxMAotICAgIGxlYSAgICAgICAgIGlucHV0LCAgICAgICAgICBbaW5wdXQrMipwaXRjaF0KLSAgICBtb3ZxICAgICAgICB4bW0xLCBNTVdPUkQgUFRSW2lucHV0ICAgICAgICBdIDsyMyAyMiAyMSAyMAotICAgIG1vdnEgICAgICAgIHhtbTMsIE1NV09SRCBQVFJbaW5wdXQrICBwaXRjaF0gOzMzIDMyIDMxIDMwCi0KLSAgICBwdW5wY2tscWRxICB4bW0wLCB4bW0yICAgICAgICAgICAgICAgICAgICAgIDsxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAotICAgIHB1bnBja2xxZHEgIHhtbTEsIHhtbTMgICAgICAgICAgICAgICAgICAgICAgOzMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwCi0KLSAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0wCi0gICAgcHVucGNrbGRxICAgeG1tMCwgeG1tMSAgICAgICAgICAgICAgICAgICAgICA7MjMgMjIgMDMgMDIgMjEgMjAgMDEgMDAKLSAgICBwdW5wY2toZHEgICB4bW0yLCB4bW0xICAgICAgICAgICAgICAgICAgICAgIDszMyAzMiAxMyAxMiAzMSAzMCAxMSAxMAotICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKLSAgICBwdW5wY2tsZHEgICB4bW0wLCB4bW0yICAgICAgICAgICAgICAgICAgICAgIDszMSAyMSAzMCAyMCAxMSAxMCAwMSAwMAotICAgIHBzaHVmaHcgICAgIHhtbTEsIHhtbTEsIDBiMWggICAgICAgICAgICAgICAgOzIyIDIzIDAyIDAzIHh4IHh4IHh4IHh4Ci0gICAgcHNodWZodyAgICAgeG1tMiwgeG1tMiwgMGIxaCAgICAgICAgICAgICAgICA7MzIgMzMgMTIgMTMgeHggeHggeHggeHgKLQotICAgIHB1bnBja2hkcSAgIHhtbTEsIHhtbTIgICAgICAgICAgICAgICAgICAgICAgOzMyIDMzIDIyIDIzIDEyIDEzIDAyIDAzCi0gICAgbW92ZHFhICAgICAgeG1tMywgeG1tMAotICAgIHBhZGR3ICAgICAgIHhtbTAsIHhtbTEgICAgICAgICAgICAgICAgICAgICAgO2IxIGExIGIxIGExIGIxIGExIGIxIGExCi0gICAgcHN1YncgICAgICAgeG1tMywgeG1tMSAgICAgICAgICAgICAgICAgICAgICA7YzEgZDEgYzEgZDEgYzEgZDEgYzEgZDEKLSAgICBwc2xsdyAgICAgICB4bW0wLCAzICAgICAgICAgICAgICAgICAgICAgICAgIDtiMSA8PD0gMyBhMSA8PD0gMwotICAgIHBzbGx3ICAgICAgIHhtbTMsIDMgICAgICAgICAgICAgICAgICAgICAgICAgO2MxIDw8PSAzIGQxIDw8PSAzCi0KLSAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCi0gICAgcG1hZGR3ZCAgICAgeG1tMCwgWE1NV09SRCBQVFJbR0xPQkFMKF9tdWx0X2FkZCldICAgIDthMSArIGIxCi0gICAgcG1hZGR3ZCAgICAgeG1tMSwgWE1NV09SRCBQVFJbR0xPQkFMKF9tdWx0X3N1YildICAgIDthMSAtIGIxCi0gICAgbW92ZHFhICAgICAgeG1tNCwgeG1tMwotICAgIHBtYWRkd2QgICAgIHhtbTMsIFhNTVdPUkQgUFRSW0dMT0JBTChfNTM1Ml8yMjE3KV0gICA7YzEqMjIxNyArIGQxKjUzNTIKLSAgICBwbWFkZHdkICAgICB4bW00LCBYTU1XT1JEIFBUUltHTE9CQUwoXzIyMTdfbmVnNTM1MildO2QxKjIyMTcgLSBjMSo1MzUyCi0KLSAgICBwYWRkZCAgICAgICB4bW0zLCBYTU1XT1JEIFBUUltHTE9CQUwoXzE0NTAwKV0KLSAgICBwYWRkZCAgICAgICB4bW00LCBYTU1XT1JEIFBUUltHTE9CQUwoXzc1MDApXQotICAgIHBzcmFkICAgICAgIHhtbTMsIDEyICAgICAgICAgICAgOyhjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTQ1MDApPj4xMgotICAgIHBzcmFkICAgICAgIHhtbTQsIDEyICAgICAgICAgICAgOyhkMSAqIDIyMTcgLSBjMSAqIDUzNTIgKyAgIDc1MDApPj4xMgotCi0gICAgcGFja3NzZHcgICAgeG1tMCwgeG1tMSAgICAgICAgICAgICAgICAgICAgICA7b3BbMl0gb3BbMF0KLSAgICBwYWNrc3NkdyAgICB4bW0zLCB4bW00ICAgICAgICAgICAgICAgICAgICAgIDtvcFszXSBvcFsxXQotICAgIDsgMjMgMjIgMjEgMjAgMDMgMDIgMDEgMDAKLSAgICA7Ci0gICAgOyAzMyAzMiAzMSAzMCAxMyAxMiAxMSAxMAotICAgIDsKLSAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0wCi0gICAgcHVucGNrbHFkcSAgeG1tMCwgeG1tMyAgICAgICAgICAgICAgICAgICAgICA7MTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLSAgICBwdW5wY2tocWRxICB4bW0yLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDsyMyAyMiAyMSAyMCAzMyAzMiAzMSAzMAotCi0gICAgbW92ZHFhICAgICAgeG1tMywgeG1tMAotICAgIHB1bnBja2x3ZCAgIHhtbTAsIHhtbTIgICAgICAgICAgICAgICAgICAgICAgOzMyIDMwIDIyIDIwIDEyIDEwIDAyIDAwCi0gICAgcHVucGNraHdkICAgeG1tMywgeG1tMiAgICAgICAgICAgICAgICAgICAgICA7MzMgMzEgMjMgMjEgMTMgMTEgMDMgMDEKLSAgICBtb3ZkcWEgICAgICB4bW0yLCB4bW0wCi0gICAgcHVucGNrbHdkICAgeG1tMCwgeG1tMyAgICAgICAgICAgICAgICAgICAgICA7MTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKLSAgICBwdW5wY2tod2QgICB4bW0yLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDszMyAzMiAzMSAzMCAyMyAyMiAyMSAyMAotCi0gICAgbW92ZHFhICAgICAgeG1tNSwgWE1NV09SRCBQVFJbR0xPQkFMKF83KV0KLSAgICBwc2h1ZmQgICAgICB4bW0yLCB4bW0yLCAwNGVoCi0gICAgbW92ZHFhICAgICAgeG1tMywgeG1tMAotICAgIHBhZGR3ICAgICAgIHhtbTAsIHhtbTIgICAgICAgICAgICAgICAgICAgICAgO2IxIGIxIGIxIGIxIGExIGExIGExIGExCi0gICAgcHN1YncgICAgICAgeG1tMywgeG1tMiAgICAgICAgICAgICAgICAgICAgICA7YzEgYzEgYzEgYzEgZDEgZDEgZDEgZDEKLQotICAgIHBzaHVmZCAgICAgIHhtbTAsIHhtbTAsIDBkOGggICAgICAgICAgICAgICAgO2IxIGIxIGExIGExIGIxIGIxIGExIGExCi0gICAgbW92ZHFhICAgICAgeG1tMiwgeG1tMyAgICAgICAgICAgICAgICAgICAgICA7c2F2ZSBkMSBmb3IgY29tcGFyZQotICAgIHBzaHVmZCAgICAgIHhtbTMsIHhtbTMsIDBkOGggICAgICAgICAgICAgICAgO2MxIGMxIGQxIGQxIGMxIGMxIGQxIGQxCi0gICAgcHNodWZsdyAgICAgeG1tMCwgeG1tMCwgMGQ4aCAgICAgICAgICAgICAgICA7YjEgYjEgYTEgYTEgYjEgYTEgYjEgYTEKLSAgICBwc2h1Zmx3ICAgICB4bW0zLCB4bW0zLCAwZDhoICAgICAgICAgICAgICAgIDtjMSBjMSBkMSBkMSBjMSBkMSBjMSBkMQotICAgIHBzaHVmaHcgICAgIHhtbTAsIHhtbTAsIDBkOGggICAgICAgICAgICAgICAgO2IxIGExIGIxIGExIGIxIGExIGIxIGExCi0gICAgcHNodWZodyAgICAgeG1tMywgeG1tMywgMGQ4aCAgICAgICAgICAgICAgICA7YzEgZDEgYzEgZDEgYzEgZDEgYzEgZDEKLSAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCi0gICAgcG1hZGR3ZCAgICAgeG1tMCwgWE1NV09SRCBQVFJbR0xPQkFMKF9tdWx0X2FkZCldIDthMSArIGIxCi0gICAgcG1hZGR3ZCAgICAgeG1tMSwgWE1NV09SRCBQVFJbR0xPQkFMKF9tdWx0X3N1YildIDthMSAtIGIxCi0KLSAgICBweG9yICAgICAgICB4bW00LCB4bW00ICAgICAgICAgICAgICAgICAgICAgIDt6ZXJvIG91dCBmb3IgY29tcGFyZQotICAgIHBhZGRkICAgICAgIHhtbTAsIHhtbTUKLSAgICBwYWRkZCAgICAgICB4bW0xLCB4bW01Ci0gICAgcGNtcGVxdyAgICAgeG1tMiwgeG1tNAotICAgIHBzcmFkICAgICAgIHhtbTAsIDQgICAgICAgICAgICAgICAgICAgICAgICAgOyhhMSArIGIxICsgNyk+PjQKLSAgICBwc3JhZCAgICAgICB4bW0xLCA0ICAgICAgICAgICAgICAgICAgICAgICAgIDsoYTEgLSBiMSArIDcpPj40Ci0gICAgcGFuZG4gICAgICAgeG1tMiwgWE1NV09SRCBQVFJbR0xPQkFMKF9jbXBfbWFzayldIDtjbGVhciB1cHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2FuZCBrZWVwIGJpdCAwIG9mIGxvd2VyCi0KLSAgICBtb3ZkcWEgICAgICB4bW00LCB4bW0zCi0gICAgcG1hZGR3ZCAgICAgeG1tMywgWE1NV09SRCBQVFJbR0xPQkFMKF81MzUyXzIyMTcpXSAgICA7YzEqMjIxNyArIGQxKjUzNTIKLSAgICBwbWFkZHdkICAgICB4bW00LCBYTU1XT1JEIFBUUltHTE9CQUwoXzIyMTdfbmVnNTM1MildIDtkMSoyMjE3IC0gYzEqNTM1MgotICAgIHBhZGRkICAgICAgIHhtbTMsIFhNTVdPUkQgUFRSW0dMT0JBTChfMTIwMDApXQotICAgIHBhZGRkICAgICAgIHhtbTQsIFhNTVdPUkQgUFRSW0dMT0JBTChfNTEwMDApXQotICAgIHBhY2tzc2R3ICAgIHhtbTAsIHhtbTEgICAgICAgICAgICAgICAgICAgICAgO29wWzhdIG9wWzBdCi0gICAgcHNyYWQgICAgICAgeG1tMywgMTYgICAgICAgICAgICAgICAgOyhjMSAqIDIyMTcgKyBkMSAqIDUzNTIgKyAgMTIwMDApPj4xNgotICAgIHBzcmFkICAgICAgIHhtbTQsIDE2ICAgICAgICAgICAgICAgIDsoZDEgKiAyMjE3IC0gYzEgKiA1MzUyICsgIDUxMDAwKT4+MTYKLQotICAgIHBhY2tzc2R3ICAgIHhtbTMsIHhtbTQgICAgICAgICAgICAgICAgICAgICAgO29wWzEyXSBvcFs0XQotICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKLSAgICBwYWRkdyAgICAgICB4bW0zLCB4bW0yICAgICAgICAgICAgICAgICAgICAgIDtvcFs0XSArPSAoZDEhPTApCi0gICAgcHVucGNrbHFkcSAgeG1tMCwgeG1tMyAgICAgICAgICAgICAgICAgICAgICA7b3BbNF0gb3BbMF0KLSAgICBwdW5wY2tocWRxICB4bW0xLCB4bW0zICAgICAgICAgICAgICAgICAgICAgIDtvcFsxMl0gb3BbOF0KLQotICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSW291dHB1dCArICAwXSwgeG1tMAotICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSW291dHB1dCArIDE2XSwgeG1tMQotCi0gICAgU1RBQ0tfRlJBTUVfREVTVFJPWQotCi07dm9pZCB2cDhfc2hvcnRfZmRjdDh4NF9zc2UyKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQotZ2xvYmFsIHN5bSh2cDhfc2hvcnRfZmRjdDh4NF9zc2UyKQotc3ltKHZwOF9zaG9ydF9mZGN0OHg0X3NzZTIpOgotCi0gICAgU1RBQ0tfRlJBTUVfQ1JFQVRFCi0KLSAgICAgICAgOyByZWFkIHRoZSBpbnB1dCBkYXRhCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIFtpbnB1dCAgICAgICAgXQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICBbaW5wdXQrICBwaXRjaF0KLSAgICAgICAgbGVhICAgICAgICAgaW5wdXQsICAgICAgW2lucHV0KzIqcGl0Y2hdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIFtpbnB1dCAgICAgICAgXQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICBbaW5wdXQrICBwaXRjaF0KLQotICAgICAgICA7IHRyYW5zcG9zZSBmb3IgdGhlIGZpcnN0IHN0YWdlCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIHhtbTAgICAgICAgIDsgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tNCAgICAgICAgOyAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNwotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgIHhtbTIgICAgICAgIDsgMDAgMTAgMDEgMTEgMDIgMTIgMDMgMTMKLSAgICAgICAgcHVucGNraHdkICAgeG1tMSwgICAgICAgeG1tMiAgICAgICAgOyAwNCAxNCAwNSAxNSAwNiAxNiAwNyAxNwotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTQsICAgICAgIHhtbTMgICAgICAgIDsgMjAgMzAgMjEgMzEgMjIgMzIgMjMgMzMKLSAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgeG1tMyAgICAgICAgOyAyNCAzNCAyNSAzNSAyNiAzNiAyNyAzNwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgIDsgMDAgMTAgMDEgMTEgMDIgMTIgMDMgMTMKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgeG1tNCAgICAgICAgOyAwMCAxMCAyMCAzMCAwMSAxMSAyMSAzMQotCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTIsICAgICAgIHhtbTQgICAgICAgIDsgMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW0xICAgICAgICA7IDA0IDE0IDA1IDE1IDA2IDE2IDA3IDE3Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTQsICAgICAgIHhtbTUgICAgICAgIDsgMDQgMTQgMjQgMzQgMDUgMTUgMjUgMzUKLQotICAgICAgICBwdW5wY2toZHEgICB4bW0xLCAgICAgICB4bW01ICAgICAgICA7IDA2IDE2IDI2IDM2IDA3IDE3IDI3IDM3Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTIgICAgICAgIDsgMDIgMTIgMjIgMzIgMDMgMTMgMjMgMzMKLQotICAgICAgICBwdW5wY2tocWRxICB4bW0zLCAgICAgICB4bW0xICAgICAgICA7IDAzIDEzIDIzIDMzIDA3IDE3IDI3IDM3Ci0gICAgICAgIHB1bnBja2xxZHEgIHhtbTIsICAgICAgIHhtbTEgICAgICAgIDsgMDIgMTIgMjIgMzIgMDYgMTYgMjYgMzYKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICB4bW0wICAgICAgICA7IDAwIDEwIDIwIDMwIDAxIDExIDIxIDMxCi0gICAgICAgIHB1bnBja2xxZHEgIHhtbTAsICAgICAgIHhtbTQgICAgICAgIDsgMDAgMTAgMjAgMzAgMDQgMTQgMjQgMzQKLQotICAgICAgICBwdW5wY2tocWRxICB4bW0xLCAgICAgICB4bW00ICAgICAgICA7IDAxIDExIDIxIDMyIDA1IDE1IDI1IDM1Ci0KLSAgICAgICAgOyB4bW0wIDAKLSAgICAgICAgOyB4bW0xIDEKLSAgICAgICAgOyB4bW0yIDIKLSAgICAgICAgOyB4bW0zIDMKLQotICAgICAgICA7IGZpcnN0IHN0YWdlCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgIHhtbTMgICAgICAgIDsgYTEgPSAwICsgMwotICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICB4bW0yICAgICAgICA7IGIxID0gMSArIDIKLQotICAgICAgICBwc3VidyAgICAgICB4bW00LCAgICAgICB4bW0yICAgICAgICA7IGMxID0gMSAtIDIKLSAgICAgICAgcHN1YncgICAgICAgeG1tNSwgICAgICAgeG1tMyAgICAgICAgOyBkMSA9IDAgLSAzCi0KLSAgICAgICAgcHNsbHcgICAgICAgeG1tNSwgICAgICAgIDMKLSAgICAgICAgcHNsbHcgICAgICAgeG1tNCwgICAgICAgIDMKLQotICAgICAgICBwc2xsdyAgICAgICB4bW0wLCAgICAgICAgMwotICAgICAgICBwc2xsdyAgICAgICB4bW0xLCAgICAgICAgMwotCi0gICAgICAgIDsgb3V0cHV0IDAgYW5kIDIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMCAgICAgICAgOyBhMQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgIHhtbTEgICAgICAgIDsgb3BbMF0gPSBhMSArIGIxCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTIsICAgICAgIHhtbTEgICAgICAgIDsgb3BbMl0gPSBhMSAtIGIxCi0KLSAgICAgICAgOyBvdXRwdXQgMSBhbmQgMwotICAgICAgICA7IGludGVybGVhdmUgYzEsIGQxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIHhtbTUgICAgICAgIDsgZDEKLSAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgOyBjMSBkMQotICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICB4bW00ICAgICAgICA7IGMxIGQxCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW01Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMIChfNTM1Ml8yMjE3KV0gICAgOyBjMSoyMjE3ICsgZDEqNTM1MgotICAgICAgICBwbWFkZHdkICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwgKF81MzUyXzIyMTcpXSAgICA7IGMxKjIyMTcgKyBkMSo1MzUyCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgotICAgICAgICBwbWFkZHdkICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzIyMTdfbmVnNTM1MildICA7IGQxKjIyMTcgLSBjMSo1MzUyCi0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF8xNDUwMCldCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfMTQ1MDApXQotICAgICAgICBwYWRkZCAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzc1MDApXQotICAgICAgICBwYWRkZCAgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzc1MDApXQotCi0gICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgICAgIDEyICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjEyCi0gICAgICAgIHBzcmFkICAgICAgIHhtbTQsICAgICAgIDEyICAgICAgICAgIDsgKGMxICogMjIxNyArIGQxICogNTM1MiArICAxNDUwMCk+PjEyCi0gICAgICAgIHBzcmFkICAgICAgIHhtbTMsICAgICAgIDEyICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjEyCi0gICAgICAgIHBzcmFkICAgICAgIHhtbTUsICAgICAgIDEyICAgICAgICAgIDsgKGQxICogMjIxNyAtIGMxICogNTM1MiArICAgNzUwMCk+PjEyCi0KLSAgICAgICAgcGFja3NzZHcgICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgOyBvcFsxXQotICAgICAgICBwYWNrc3NkdyAgICB4bW0zLCAgICAgICB4bW01ICAgICAgICA7IG9wWzNdCi0KLSAgICAgICAgOyBkb25lIHdpdGggdmVydGljYWwKLSAgICAgICAgOyB0cmFuc3Bvc2UgZm9yIHRoZSBzZWNvbmQgc3RhZ2UKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMCAgICAgICAgIDsgMDAgMTAgMjAgMzAgMDQgMTQgMjQgMzQKLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgeG1tMiAgICAgICAgIDsgMDIgMTIgMjIgMzIgMDYgMTYgMjYgMzYKLQotICAgICAgICBwdW5wY2tsd2QgICB4bW0wLCAgICAgICB4bW0xICAgICAgICAgOyAwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMQotICAgICAgICBwdW5wY2tod2QgICB4bW00LCAgICAgICB4bW0xICAgICAgICAgOyAwNCAwNSAxNCAxNSAyNCAyNSAzNCAzNQotCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTIsICAgICAgIHhtbTMgICAgICAgICA7IDAyIDAzIDEyIDEzIDIyIDIzIDMyIDMzCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTUsICAgICAgIHhtbTMgICAgICAgICA7IDA2IDA3IDE2IDE3IDI2IDI3IDM2IDM3Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMCAgICAgICAgIDsgMDAgMDEgMTAgMTEgMjAgMjEgMzAgMzEKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgeG1tMiAgICAgICAgIDsgMDAgMDEgMDIgMDMgMTAgMTEgMTIgMTMKLQotICAgICAgICBwdW5wY2toZHEgICB4bW0xLCAgICAgICB4bW0yICAgICAgICAgOyAyMCAyMSAyMiAyMyAzMCAzMSAzMiAzMwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTQgICAgICAgICA7IDA0IDA1IDE0IDE1IDI0IDI1IDM0IDM1Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTIsICAgICAgIHhtbTUgICAgICAgICA7IDA0IDA1IDA2IDA3IDE0IDE1IDE2IDE3Ci0KLSAgICAgICAgcHVucGNraGRxICAgeG1tNCwgICAgICAgeG1tNSAgICAgICAgIDsgMjQgMjUgMjYgMjcgMzQgMzUgMzYgMzcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tMSAgICAgICAgIDsgMjAgMjEgMjIgMjMgMzAgMzEgMzIgMzMKLQotICAgICAgICBwdW5wY2tocWRxICB4bW0zLCAgICAgICB4bW00ICAgICAgICAgOyAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNwotICAgICAgICBwdW5wY2tscWRxICB4bW0xLCAgICAgICB4bW00ICAgICAgICAgOyAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIHhtbTAgICAgICAgICA7IDAwIDAxIDAyIDAzIDEwIDExIDEyIDEzCi0gICAgICAgIHB1bnBja2xxZHEgIHhtbTAsICAgICAgIHhtbTIgICAgICAgICA7IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0KLSAgICAgICAgcHVucGNraHFkcSAgeG1tNCwgICAgICAgeG1tMiAgICAgICAgIDsgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcKLQotICAgICAgICA7IHhtbTAgMAotICAgICAgICA7IHhtbTEgNAotICAgICAgICA7IHhtbTIgMQotICAgICAgICA7IHhtbTMgMwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgIHhtbTAKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgeG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTAsICAgICAgIHhtbTMgICAgICAgIDsgYTEgPSAwICsgMwotICAgICAgICBwYWRkdyAgICAgICB4bW0xLCAgICAgICB4bW00ICAgICAgICA7IGIxID0gMSArIDIKLQotICAgICAgICBwc3VidyAgICAgICB4bW00LCAgICAgICB4bW0yICAgICAgICA7IGMxID0gMSAtIDIKLSAgICAgICAgcHN1YncgICAgICAgeG1tNSwgICAgICAgeG1tMyAgICAgICAgOyBkMSA9IDAgLSAzCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgeG1tNiAgICAgICAgOyB6ZXJvIG91dCBmb3IgY29tcGFyZQotCi0gICAgICAgIHBjbXBlcXcgICAgIHhtbTYsICAgICAgIHhtbTUgICAgICAgIDsgZDEgIT0gMAotCi0gICAgICAgIHBhbmRuICAgICAgIHhtbTYsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfY21wX21hc2s4eDQpXSAgIDsgY2xlYXIgdXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGtlZXAgYml0IDAgb2YgbG93ZXIKLQotICAgICAgICA7IG91dHB1dCAwIGFuZCAyCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgIHhtbTAgICAgICAgIDsgYTEKLQotICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICB4bW0xICAgICAgICA7IGExICsgYjEKLSAgICAgICAgcHN1YncgICAgICAgeG1tMiwgICAgICAgeG1tMSAgICAgICAgOyBhMSAtIGIxCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF83dyldCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfN3cpXQotCi0gICAgICAgIHBzcmF3ICAgICAgIHhtbTAsICAgICAgIDQgICAgICAgICAgIDsgb3BbMF0gPSAoYTEgKyBiMSArIDcpPj40Ci0gICAgICAgIHBzcmF3ICAgICAgIHhtbTIsICAgICAgIDQgICAgICAgICAgIDsgb3BbOF0gPSAoYTEgLSBiMSArIDcpPj40Ci0KLSAgICAgICAgOyBvdXRwdXQgMSBhbmQgMwotICAgICAgICA7IGludGVybGVhdmUgYzEsIGQxCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgIHhtbTUgICAgICAgIDsgZDEKLSAgICAgICAgcHVucGNrbHdkICAgeG1tMSwgICAgICAgeG1tNCAgICAgICAgOyBjMSBkMQotICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICB4bW00ICAgICAgICA7IGMxIGQxCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICB4bW01Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMIChfNTM1Ml8yMjE3KV0gICAgOyBjMSoyMjE3ICsgZDEqNTM1MgotICAgICAgICBwbWFkZHdkICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwgKF81MzUyXzIyMTcpXSAgICA7IGMxKjIyMTcgKyBkMSo1MzUyCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF8yMjE3X25lZzUzNTIpXSAgOyBkMSoyMjE3IC0gYzEqNTM1MgotICAgICAgICBwbWFkZHdkICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzIyMTdfbmVnNTM1MildICA7IGQxKjIyMTcgLSBjMSo1MzUyCi0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF8xMjAwMCldCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSW0dMT0JBTChfMTIwMDApXQotICAgICAgICBwYWRkZCAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUltHTE9CQUwoXzUxMDAwKV0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFJbR0xPQkFMKF81MTAwMCldCi0KLSAgICAgICAgcHNyYWQgICAgICAgeG1tMSwgICAgICAgMTYgICAgICAgICAgOyAoYzEgKiAyMjE3ICsgZDEgKiA1MzUyICsgIDE0NTAwKT4+MTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tNCwgICAgICAgMTYgICAgICAgICAgOyAoYzEgKiAyMjE3ICsgZDEgKiA1MzUyICsgIDE0NTAwKT4+MTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tMywgICAgICAgMTYgICAgICAgICAgOyAoZDEgKiAyMjE3IC0gYzEgKiA1MzUyICsgICA3NTAwKT4+MTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tNSwgICAgICAgMTYgICAgICAgICAgOyAoZDEgKiAyMjE3IC0gYzEgKiA1MzUyICsgICA3NTAwKT4+MTYKLQotICAgICAgICBwYWNrc3NkdyAgICB4bW0xLCAgICAgICB4bW00ICAgICAgICA7IG9wWzRdCi0gICAgICAgIHBhY2tzc2R3ICAgIHhtbTMsICAgICAgIHhtbTUgICAgICAgIDsgb3BbMTJdCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgeG1tNiAgICAgICAgOyBvcFs0XSArPSAoZDEhPTApCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNCwgICAgICAgeG1tMAotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICB4bW0yCi0KLSAgICAgICAgcHVucGNrbHFkcSAgeG1tMCwgICAgICAgeG1tMQotICAgICAgICBwdW5wY2tocWRxICB4bW00LCAgICAgICB4bW0xCi0KLSAgICAgICAgcHVucGNrbHFkcSAgeG1tMiwgICAgICAgeG1tMwotICAgICAgICBwdW5wY2tocWRxICB4bW01LCAgICAgICB4bW0zCi0KLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbb3V0cHV0ICsgMCBdLCAgeG1tMAotICAgICAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUltvdXRwdXQgKyAxNl0sICB4bW0yCi0gICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSW291dHB1dCArIDMyXSwgIHhtbTQKLSAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbb3V0cHV0ICsgNDhdLCAgeG1tNQotCi0gICAgU1RBQ0tfRlJBTUVfREVTVFJPWQotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLV81MzUyXzIyMTc6Ci0gICAgZHcgNTM1MgotICAgIGR3IDIyMTcKLSAgICBkdyA1MzUyCi0gICAgZHcgMjIxNwotICAgIGR3IDUzNTIKLSAgICBkdyAyMjE3Ci0gICAgZHcgNTM1MgotICAgIGR3IDIyMTcKLWFsaWduIDE2Ci1fMjIxN19uZWc1MzUyOgotICAgIGR3IDIyMTcKLSAgICBkdyAtNTM1MgotICAgIGR3IDIyMTcKLSAgICBkdyAtNTM1MgotICAgIGR3IDIyMTcKLSAgICBkdyAtNTM1MgotICAgIGR3IDIyMTcKLSAgICBkdyAtNTM1MgotYWxpZ24gMTYKLV9tdWx0X2FkZDoKLSAgICB0aW1lcyA4IGR3IDEKLWFsaWduIDE2Ci1fY21wX21hc2s6Ci0gICAgdGltZXMgNCBkdyAxCi0gICAgdGltZXMgNCBkdyAwCi1hbGlnbiAxNgotX2NtcF9tYXNrOHg0OgotICAgIHRpbWVzIDggZHcgMQotYWxpZ24gMTYKLV9tdWx0X3N1YjoKLSAgICBkdyAxCi0gICAgZHcgLTEKLSAgICBkdyAxCi0gICAgZHcgLTEKLSAgICBkdyAxCi0gICAgZHcgLTEKLSAgICBkdyAxCi0gICAgZHcgLTEKLWFsaWduIDE2Ci1fNzoKLSAgICB0aW1lcyA0IGRkIDcKLWFsaWduIDE2Ci1fN3c6Ci0gICAgdGltZXMgOCBkdyA3Ci1hbGlnbiAxNgotXzE0NTAwOgotICAgIHRpbWVzIDQgZGQgMTQ1MDAKLWFsaWduIDE2Ci1fNzUwMDoKLSAgICB0aW1lcyA0IGRkIDc1MDAKLWFsaWduIDE2Ci1fMTIwMDA6Ci0gICAgdGltZXMgNCBkZCAxMjAwMAotYWxpZ24gMTYKLV81MTAwMDoKLSAgICB0aW1lcyA0IGRkIDUxMDAwCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvZGN0X3g4Ni5oIGIvdnA4L2VuY29kZXIveDg2L2RjdF94ODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhNWNiMS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvZGN0X3g4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgRENUX1g4Nl9ICi0jZGVmaW5lIERDVF9YODZfSAotCi0KLS8qIE5vdGU6Ci0gKgotICogVGhpcyBwbGF0Zm9ybSBpcyBjb21tb25seSBidWlsdCBmb3IgcnVudGltZSBDUFUgZGV0ZWN0aW9uLiBJZiB5b3UgbW9kaWZ5Ci0gKiBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGFsc28gdXBkYXRlCi0gKiB0aGVtIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqLwotI2lmIEhBVkVfTU1YCi1leHRlcm4gcHJvdG90eXBlX2ZkY3QodnA4X3Nob3J0X2ZkY3Q0eDRfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfc2hvcnRfZmRjdDh4NF9tbXgpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLQotI3VuZGVmICB2cDhfZmRjdF9zaG9ydDR4NAotI2RlZmluZSB2cDhfZmRjdF9zaG9ydDR4NCB2cDhfc2hvcnRfZmRjdDR4NF9tbXgKLQotI3VuZGVmICB2cDhfZmRjdF9zaG9ydDh4NAotI2RlZmluZSB2cDhfZmRjdF9zaG9ydDh4NCB2cDhfc2hvcnRfZmRjdDh4NF9tbXgKLQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLSNpZiBIQVZFX1NTRTIKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfc2hvcnRfZmRjdDh4NF9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfc2hvcnRfd2Fsc2g0eDRfc3NlMik7Ci0KLWV4dGVybiBwcm90b3R5cGVfZmRjdCh2cDhfc2hvcnRfZmRjdDR4NF9zc2UyKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSN1bmRlZiAgdnA4X2ZkY3Rfc2hvcnQ0eDQKLSNkZWZpbmUgdnA4X2ZkY3Rfc2hvcnQ0eDQgdnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMgotCi0jdW5kZWYgIHZwOF9mZGN0X3Nob3J0OHg0Ci0jZGVmaW5lIHZwOF9mZGN0X3Nob3J0OHg0IHZwOF9zaG9ydF9mZGN0OHg0X3NzZTIKLQotI3VuZGVmICB2cDhfZmRjdF9mYXN0NHg0Ci0jZGVmaW5lIHZwOF9mZGN0X2Zhc3Q0eDQgdnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMgotCi0jdW5kZWYgIHZwOF9mZGN0X2Zhc3Q4eDQKLSNkZWZpbmUgdnA4X2ZkY3RfZmFzdDh4NCB2cDhfc2hvcnRfZmRjdDh4NF9zc2UyCi0KLSN1bmRlZiAgdnA4X2ZkY3Rfd2Fsc2hfc2hvcnQ0eDQKLSNkZWZpbmUgdnA4X2ZkY3Rfd2Fsc2hfc2hvcnQ0eDQgIHZwOF9zaG9ydF93YWxzaDR4NF9zc2UyCi0KLSNlbmRpZgotCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3g4Ni9lbmNvZGVtYl94ODYuaCBiL3ZwOC9lbmNvZGVyL3g4Ni9lbmNvZGVtYl94ODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliM2VkZC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvZW5jb2RlbWJfeDg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBFTkNPREVNQl9YODZfSAotI2RlZmluZSBFTkNPREVNQl9YODZfSAotCi0KLS8qIE5vdGU6Ci0gKgotICogVGhpcyBwbGF0Zm9ybSBpcyBjb21tb25seSBidWlsdCBmb3IgcnVudGltZSBDUFUgZGV0ZWN0aW9uLiBJZiB5b3UgbW9kaWZ5Ci0gKiBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGFsc28gdXBkYXRlCi0gKiB0aGVtIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqLwotI2lmIEhBVkVfTU1YCi1leHRlcm4gcHJvdG90eXBlX2JlcnIodnA4X2Jsb2NrX2Vycm9yX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX21iZXJyKHZwOF9tYmJsb2NrX2Vycm9yX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX21idXZlcnIodnA4X21idXZlcnJvcl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJiKHZwOF9zdWJ0cmFjdF9iX21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3N1Ym1ieSh2cDhfc3VidHJhY3RfbWJ5X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3N1Ym1idXYodnA4X3N1YnRyYWN0X21idXZfbW14KTsKLQotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X2VuY29kZW1iX2JlcnIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX2JlcnIgdnA4X2Jsb2NrX2Vycm9yX21teAotCi0jdW5kZWYgIHZwOF9lbmNvZGVtYl9tYmVycgotI2RlZmluZSB2cDhfZW5jb2RlbWJfbWJlcnIgdnA4X21iYmxvY2tfZXJyb3JfbW14Ci0KLSN1bmRlZiAgdnA4X2VuY29kZW1iX21idXZlcnIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX21idXZlcnIgdnA4X21idXZlcnJvcl9tbXgKLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfc3ViYgotI2RlZmluZSB2cDhfZW5jb2RlbWJfc3ViYiB2cDhfc3VidHJhY3RfYl9tbXgKLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfc3VibWJ5Ci0jZGVmaW5lIHZwOF9lbmNvZGVtYl9zdWJtYnkgdnA4X3N1YnRyYWN0X21ieV9tbXgKLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfc3VibWJ1dgotI2RlZmluZSB2cDhfZW5jb2RlbWJfc3VibWJ1diB2cDhfc3VidHJhY3RfbWJ1dl9tbXgKLQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgSEFWRV9TU0UyCi1leHRlcm4gcHJvdG90eXBlX2JlcnIodnA4X2Jsb2NrX2Vycm9yX3htbSk7Ci1leHRlcm4gcHJvdG90eXBlX21iZXJyKHZwOF9tYmJsb2NrX2Vycm9yX3htbSk7Ci1leHRlcm4gcHJvdG90eXBlX21idXZlcnIodnA4X21idXZlcnJvcl94bW0pOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJiKHZwOF9zdWJ0cmFjdF9iX3NzZTIpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJtYnkodnA4X3N1YnRyYWN0X21ieV9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfc3VibWJ1dih2cDhfc3VidHJhY3RfbWJ1dl9zc2UyKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF9lbmNvZGVtYl9iZXJyCi0jZGVmaW5lIHZwOF9lbmNvZGVtYl9iZXJyIHZwOF9ibG9ja19lcnJvcl94bW0KLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfbWJlcnIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX21iZXJyIHZwOF9tYmJsb2NrX2Vycm9yX3htbQotCi0jdW5kZWYgIHZwOF9lbmNvZGVtYl9tYnV2ZXJyCi0jZGVmaW5lIHZwOF9lbmNvZGVtYl9tYnV2ZXJyIHZwOF9tYnV2ZXJyb3JfeG1tCi0KLSN1bmRlZiAgdnA4X2VuY29kZW1iX3N1YmIKLSNkZWZpbmUgdnA4X2VuY29kZW1iX3N1YmIgdnA4X3N1YnRyYWN0X2Jfc3NlMgotCi0jdW5kZWYgIHZwOF9lbmNvZGVtYl9zdWJtYnkKLSNkZWZpbmUgdnA4X2VuY29kZW1iX3N1Ym1ieSB2cDhfc3VidHJhY3RfbWJ5X3NzZTIKLQotI3VuZGVmICB2cDhfZW5jb2RlbWJfc3VibWJ1dgotI2RlZmluZSB2cDhfZW5jb2RlbWJfc3VibWJ1diB2cDhfc3VidHJhY3RfbWJ1dl9zc2UyCi0KLSNlbmRpZgotI2VuZGlmCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvZW5jb2Rlb3B0LmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni9lbmNvZGVvcHQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGYwNmJiLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni9lbmNvZGVvcHQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO2ludCB2cDhfYmxvY2tfZXJyb3JfeG1tKHNob3J0ICpjb2VmZl9wdHIsICBzaG9ydCAqZGNvZWZfcHRyKQotZ2xvYmFsIHN5bSh2cDhfYmxvY2tfZXJyb3JfeG1tKQotc3ltKHZwOF9ibG9ja19lcnJvcl94bW0pOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMgotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICA7IGVuZCBwcm9sb2d1ZQotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7Y29lZmZfcHRyCi0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpIDtkY29lZl9wdHIKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMywgICAgICAgW3JzaV0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICBbcmRpXQotICAgICAgICBtb3ZkcWEgICAgICB4bW01LCAgICAgICBbcnNpKzE2XQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgIFtyZGkrMTZdCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTMsICAgICAgIHhtbTQKLQotICAgICAgICBwc3VidyAgICAgICB4bW01LCAgICAgICB4bW02Ci0gICAgICAgIHBtYWRkd2QgICAgIHhtbTMsICAgICAgIHhtbTMKLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tNSwgICAgICAgeG1tNQotCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTMsICAgICAgIHhtbTUKLQotICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICB4bW03Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsICAgICAgIHhtbTMKLQotICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIHB1bnBja2hkcSAgIHhtbTMsICAgICAgIHhtbTcKLQotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICB4bW0zCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIHhtbTAKLQotICAgICAgICBwc3JsZHEgICAgICB4bW0wLCAgICAgICA4Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTAsICAgICAgIHhtbTMKLQotICAgICAgICBtb3ZxICAgICAgICByYXgsICAgICAgICB4bW0wCi0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07aW50IHZwOF9ibG9ja19lcnJvcl9tbXgoc2hvcnQgKmNvZWZmX3B0ciwgIHNob3J0ICpkY29lZl9wdHIpCi1nbG9iYWwgc3ltKHZwOF9ibG9ja19lcnJvcl9tbXgpCi1zeW0odnA4X2Jsb2NrX2Vycm9yX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAyCi0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtjb2VmZl9wdHIKLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92ICAgICAgICAgcmRpLCAgICAgICAgYXJnKDEpIDtkY29lZl9wdHIKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgW3JzaV0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICBbcmRpXQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgICBbcnNpKzhdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgW3JkaSs4XQotICAgICAgICBweG9yICAgICAgICBtbTEsICAgICAgICBtbTEgOyBmcm9tIG1vdmQgbW0xLCBkYyA7IGRjID0wCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgbW03Ci0gICAgICAgIHBzdWJ3ICAgICAgIG1tNSwgICAgICAgIG1tNgotCi0gICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgICAgIG1tMgotICAgICAgICBwbWFkZHdkICAgICBtbTUsICAgICAgICBtbTUKLQotICAgICAgICBwY21wZXF3ICAgICBtbTEsICAgICAgICBtbTcKLSAgICAgICAgcHN1YncgICAgICAgbW0zLCAgICAgICAgbW00Ci0KLSAgICAgICAgcGFuZCAgICAgICAgbW0xLCAgICAgICAgbW0zCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMSwgICAgICAgIG1tMQotCi0gICAgICAgIHBhZGRkICAgICAgIG1tMSwgICAgICAgIG1tNQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICBbcnNpKzE2XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIFtyZGkrMTZdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIFtyc2krMjRdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgW3JkaSsyNF0KLSAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW02Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgbW01LCAgICAgICAgbW01Ci0gICAgICAgIHBzdWJ3ICAgICAgIG1tMywgICAgICAgIG1tNAotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMywgICAgICAgIG1tMwotICAgICAgICBwYWRkZCAgICAgICBtbTMsICAgICAgICBtbTUKLQotICAgICAgICBwYWRkZCAgICAgICBtbTEsICAgICAgICBtbTMKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICAgICAgbW0xCi0KLSAgICAgICAgcHNybHEgICAgICAgbW0xLCAgICAgICAgMzIKLSAgICAgICAgcGFkZGQgICAgICAgbW0wLCAgICAgICAgbW0xCi0KLSAgICAgICAgbW92cSAgICAgICAgcmF4LCAgICAgICAgbW0wCi0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTtpbnQgdnA4X21iYmxvY2tfZXJyb3JfbW14X2ltcGwoc2hvcnQgKmNvZWZmX3B0ciwgc2hvcnQgKmRjb2VmX3B0ciwgaW50IGRjKTsKLWdsb2JhbCBzeW0odnA4X21iYmxvY2tfZXJyb3JfbW14X2ltcGwpCi1zeW0odnA4X21iYmxvY2tfZXJyb3JfbW14X2ltcGwpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMwotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7Y29lZmZfcHRyCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgIG1tNwotCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZGNvZWZfcHRyCi0gICAgICAgIHB4b3IgICAgICAgIG1tMiwgICAgICAgIG1tMgotCi0gICAgICAgIG1vdmQgICAgICAgIG1tMSwgICAgICAgIGR3b3JkIHB0ciBhcmcoMikgO2RjCi0gICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgICAgIG1tMgotCi0gICAgICAgIHBjbXBlcXcgICAgIG1tMSwgICAgICAgIG1tNwotICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAxNgotCi1tYmVycm9yX2xvb3BfbW14OgotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgW3JkaV0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgICAgIFtyc2krOF0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICBbcmRpKzhdCi0KLQotICAgICAgICBwc3VidyAgICAgICBtbTUsICAgICAgICBtbTYKLSAgICAgICAgcG1hZGR3ZCAgICAgbW01LCAgICAgICAgbW01Ci0KLSAgICAgICAgcHN1YncgICAgICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgIHBhbmQgICAgICAgIG1tMywgICAgICAgIG1tMQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMywgICAgICAgIG1tMwotICAgICAgICBwYWRkZCAgICAgICBtbTIsICAgICAgICBtbTUKLQotICAgICAgICBwYWRkZCAgICAgICBtbTIsICAgICAgICBtbTMKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICBbcnNpKzE2XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgW3JkaSsxNl0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICBbcnNpKzI0XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgW3JkaSsyNF0KLSAgICAgICAgcHN1YncgICAgICAgbW01LCAgICAgICAgbW02Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgbW01LCAgICAgICAgbW01Ci0gICAgICAgIHBzdWJ3ICAgICAgIG1tMywgICAgICAgIG1tNAotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMywgICAgICAgIG1tMwotICAgICAgICBwYWRkZCAgICAgICBtbTIsICAgICAgICBtbTUKLQotICAgICAgICBwYWRkZCAgICAgICBtbTIsICAgICAgICBtbTMKLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgMzIKLQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAzMgotICAgICAgICBzdWIgICAgICAgICByY3gsICAgICAgICAxCi0KLSAgICAgICAgam56ICAgICAgICAgbWJlcnJvcl9sb29wX21teAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgICAgIG1tMgotICAgICAgICBwc3JscSAgICAgICBtbTIsICAgICAgICAzMgotCi0gICAgICAgIHBhZGRkICAgICAgIG1tMCwgICAgICAgIG1tMgotICAgICAgICBtb3ZxICAgICAgICByYXgsICAgICAgICBtbTAKLQotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO2ludCB2cDhfbWJibG9ja19lcnJvcl94bW1faW1wbChzaG9ydCAqY29lZmZfcHRyLCBzaG9ydCAqZGNvZWZfcHRyLCBpbnQgZGMpOwotZ2xvYmFsIHN5bSh2cDhfbWJibG9ja19lcnJvcl94bW1faW1wbCkKLXN5bSh2cDhfbWJibG9ja19lcnJvcl94bW1faW1wbCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAzCi0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtjb2VmZl9wdHIKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgeG1tNwotCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZGNvZWZfcHRyCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTIsICAgICAgIHhtbTIKLQotICAgICAgICBtb3ZkICAgICAgICB4bW0xLCAgICAgICBkd29yZCBwdHIgYXJnKDIpIDtkYwotICAgICAgICBwb3IgICAgICAgICB4bW0xLCAgICAgICB4bW0yCi0KLSAgICAgICAgcGNtcGVxdyAgICAgeG1tMSwgICAgICAgeG1tNwotICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAxNgotCi1tYmVycm9yX2xvb3A6Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgIFtyc2ldCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgIFtyZGldCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgW3JzaSsxNl0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgW3JkaSsxNl0KLQotCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTUsICAgICAgIHhtbTYKLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tNSwgICAgICAgeG1tNQotCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTMsICAgICAgIHhtbTQKLSAgICAgICAgcGFuZCAgICAgICAgeG1tMywgICAgICAgeG1tMQotCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTMsICAgICAgIHhtbTMKLSAgICAgICAgYWRkICAgICAgICAgcnNpLCAgICAgICAgMzIKLQotICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAzMgotCi0gICAgICAgIHN1YiAgICAgICAgIHJjeCwgICAgICAgIDEKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMiwgICAgICAgeG1tNQotCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTIsICAgICAgIHhtbTMKLSAgICAgICAgam56ICAgICAgICAgbWJlcnJvcl9sb29wCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgeG1tMgotICAgICAgICBwdW5wY2tsZHEgICB4bW0wLCAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgeG1tNwotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwc3JsZHEgICAgICB4bW0wLCAgICAgICA4Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgeG1tMQotICAgICAgICBtb3ZxICAgICAgICByYXgsICAgICAgICB4bW0wCi0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTtpbnQgdnA4X21idXZlcnJvcl9tbXhfaW1wbChzaG9ydCAqc19wdHIsIHNob3J0ICpkX3B0cik7Ci1nbG9iYWwgc3ltKHZwOF9tYnV2ZXJyb3JfbW14X2ltcGwpCi1zeW0odnA4X21idXZlcnJvcl9tbXhfaW1wbCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAyCi0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZF9wdHIKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgMTYKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNwotCi1tYnV2ZXJyb3JfbG9vcF9tbXg6Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBbcmRpXQotCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTEsICAgICAgICBtbTIKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgICAgICAgIG1tMQotCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFtyc2krOF0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIFtyZGkrOF0KLQotICAgICAgICBwc3VidyAgICAgICAgICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgIHBtYWRkd2QgICAgICAgICBtbTMsICAgICAgICBtbTMKLQotCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tNywgICAgICAgIG1tMwotCi0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgIDE2Ci0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAxNgotCi0gICAgICAgIGRlYyAgICAgICAgICAgICByY3gKLSAgICAgICAgam56ICAgICAgICAgICAgIG1idXZlcnJvcl9sb29wX21teAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBtbTcKLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tNywgICAgICAgIDMyCi0KLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMCwgICAgICAgIG1tNwotICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW0wCi0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTtpbnQgdnA4X21idXZlcnJvcl94bW1faW1wbChzaG9ydCAqc19wdHIsIHNob3J0ICpkX3B0cik7Ci1nbG9iYWwgc3ltKHZwOF9tYnV2ZXJyb3JfeG1tX2ltcGwpCi1zeW0odnA4X21idXZlcnJvcl94bW1faW1wbCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAyCi0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygxKSA7ZF9wdHIKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgMTYKLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTcKLQotbWJ1dmVycm9yX2xvb3A6Ci0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsICAgICAgIFtyc2ldCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICBbcmRpXQotCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW0yCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICB4bW0xCi0KLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTEKLQotICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCAgICAgICAgMTYKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgIDE2Ci0KLSAgICAgICAgZGVjICAgICAgICAgICAgIHJjeAotICAgICAgICBqbnogICAgICAgICAgICAgbWJ1dmVycm9yX2xvb3AKLQotICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMAotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTEsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHVucGNraGRxICAgeG1tMiwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgICAgICB4bW0xCi0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L2Z3YWxzaF9zc2UyLmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni9md2Fsc2hfc3NlMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDM5ZjAuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIveDg2L2Z3YWxzaF9zc2UyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLTt2b2lkIHZwOF9zaG9ydF93YWxzaDR4NF9zc2UyKHNob3J0ICppbnB1dCwgc2hvcnQgKm91dHB1dCwgaW50IHBpdGNoKQotZ2xvYmFsIHN5bSh2cDhfc2hvcnRfd2Fsc2g0eDRfc3NlMikKLXN5bSh2cDhfc2hvcnRfd2Fsc2g0eDRfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyAzCi0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIG1vdiAgICAgcnNpLCBhcmcoMCkgICAgICAgICAgIDsgaW5wdXQKLSAgICBtb3YgICAgIHJkaSwgYXJnKDEpICAgICAgICAgICA7IG91dHB1dAotICAgIG1vdnN4ZCAgcmR4LCBkd29yZCBwdHIgYXJnKDIpIDsgcGl0Y2gKLQotICAgIDsgZmlyc3QgZm9yIGxvb3AKLSAgICBtb3ZxICAgIHhtbTAsIE1NV09SRCBQVFIgW3JzaV0gICAgICAgICAgIDsgbG9hZCBpbnB1dAotICAgIG1vdnEgICAgeG1tMSwgTU1XT1JEIFBUUiBbcnNpICsgcmR4XQotICAgIGxlYSAgICAgcnNpLCAgW3JzaSArIHJkeCoyXQotICAgIG1vdnEgICAgeG1tMiwgTU1XT1JEIFBUUiBbcnNpXQotICAgIG1vdnEgICAgeG1tMywgTU1XT1JEIFBUUiBbcnNpICsgcmR4XQotCi0gICAgcHVucGNrbHdkIHhtbTAsICB4bW0xCi0gICAgcHVucGNrbHdkIHhtbTIsICB4bW0zCi0KLSAgICBtb3ZkcWEgICAgeG1tMSwgeG1tMAotICAgIHB1bnBja2xkcSB4bW0wLCB4bW0yICAgICAgICAgICA7IGlwWzFdIGlwWzBdCi0gICAgcHVucGNraGRxIHhtbTEsIHhtbTIgICAgICAgICAgIDsgaXBbM10gaXBbMl0KLQotICAgIG1vdmRxYSAgICB4bW0yLCB4bW0wCi0gICAgcGFkZHcgICAgIHhtbTAsIHhtbTEKLSAgICBwc3VidyAgICAgeG1tMiwgeG1tMQotCi0gICAgcHNsbHcgICAgIHhtbTAsIDIgICAgICAgICAgICAgIDsgZDEgIGExCi0gICAgcHNsbHcgICAgIHhtbTIsIDIgICAgICAgICAgICAgIDsgYzEgIGIxCi0KLSAgICBtb3ZkcWEgICAgeG1tMSwgeG1tMAotICAgIHB1bnBja2xxZHEgeG1tMCwgeG1tMiAgICAgICAgICA7IGIxICBhMQotICAgIHB1bnBja2hxZHEgeG1tMSwgeG1tMiAgICAgICAgICA7IGMxICBkMQotCi0gICAgcHhvciAgICAgIHhtbTYsIHhtbTYKLSAgICBtb3ZxICAgICAgeG1tNiwgeG1tMAotICAgIHB4b3IgICAgICB4bW03LCB4bW03Ci0gICAgcGNtcGVxdyAgIHhtbTcsIHhtbTYKLSAgICBwYWRkdyAgICAgeG1tNywgW0dMT0JBTChjMSldCi0KLSAgICBtb3ZkcWEgICAgeG1tMiwgeG1tMAotICAgIHBhZGR3ICAgICB4bW0wLCB4bW0xICAgICAgICAgICA7IGIxK2MxICBhMStkMQotICAgIHBzdWJ3ICAgICB4bW0yLCB4bW0xICAgICAgICAgICA7IGIxLWMxICBhMS1kMQotICAgIHBhZGR3ICAgICB4bW0wLCB4bW03ICAgICAgICAgICA7IGIxK2MxICBhMStkMSsoYTEhPTApCi0KLSAgICA7IHNlY29uZCBmb3IgbG9vcAotICAgIDsgaW5wdXQ6IDEzICA5ICA1ICAxIDEyICA4ICA0ICAwICh4bW0wKQotICAgIDsgICAgICAgIDE0IDEwICA2ICAyIDE1IDExICA3ICAzICh4bW0yKQotICAgIDsgYWZ0ZXIgc2h1ZmZsZToKLSAgICA7ICAgICAgICAxMyAgNSAgOSAgMSAxMiAgNCAgOCAgMCAoeG1tMCkKLSAgICA7ICAgICAgICAxNCAgNiAxMCAgMiAxNSAgNyAxMSAgMyAoeG1tMSkKLSAgICBwc2h1Zmx3ICAgeG1tMywgeG1tMCwgMHhkOAotICAgIHBzaHVmaHcgICB4bW0wLCB4bW0zLCAweGQ4Ci0gICAgcHNodWZsdyAgIHhtbTMsIHhtbTIsIDB4ZDgKLSAgICBwc2h1Zmh3ICAgeG1tMSwgeG1tMywgMHhkOAotCi0gICAgbW92ZHFhICAgIHhtbTIsIHhtbTAKLSAgICBwbWFkZHdkICAgeG1tMCwgW0dMT0JBTChjMSldICAgIDsgZDExIGExMSBkMTAgYTEwCi0gICAgcG1hZGR3ZCAgIHhtbTIsIFtHTE9CQUwoY24xKV0gICA7IGMxMSBiMTEgYzEwIGIxMAotICAgIG1vdmRxYSAgICB4bW0zLCB4bW0xCi0gICAgcG1hZGR3ZCAgIHhtbTEsIFtHTE9CQUwoYzEpXSAgICA7IGQxMiBhMTIgZDEzIGExMwotICAgIHBtYWRkd2QgICB4bW0zLCBbR0xPQkFMKGNuMSldICAgOyBjMTIgYjEyIGMxMyBiMTMKLQotICAgIHBzaHVmZCAgICB4bW00LCB4bW0wLCAweGQ4ICAgICAgOyBkMTEgZDEwIGExMSBhMTAKLSAgICBwc2h1ZmQgICAgeG1tNSwgeG1tMiwgMHhkOCAgICAgIDsgYzExIGMxMCBiMTEgYjEwCi0gICAgcHNodWZkICAgIHhtbTYsIHhtbTEsIDB4NzIgICAgICA7IGQxMyBkMTIgYTEzIGExMgotICAgIHBzaHVmZCAgICB4bW03LCB4bW0zLCAweDcyICAgICAgOyBjMTMgYzEyIGIxMyBiMTIKLQotICAgIG1vdmRxYSAgICB4bW0wLCB4bW00Ci0gICAgcHVucGNrbHFkcSB4bW0wLCB4bW01ICAgICAgICAgICA7IGIxMSBiMTAgYTExIGExMAotICAgIHB1bnBja2hxZHEgeG1tNCwgeG1tNSAgICAgICAgICAgOyBjMTEgYzEwIGQxMSBkMTAKLSAgICBtb3ZkcWEgICAgeG1tMSwgeG1tNgotICAgIHB1bnBja2xxZHEgeG1tMSwgeG1tNyAgICAgICAgICAgOyBiMTMgYjEyIGExMyBhMTIKLSAgICBwdW5wY2tocWRxIHhtbTYsIHhtbTcgICAgICAgICAgIDsgYzEzIGMxMiBkMTMgZDEyCi0KLSAgICBtb3ZkcWEgICAgeG1tMiwgeG1tMAotICAgIHBhZGRkICAgICB4bW0wLCB4bW00ICAgICAgICAgICAgOyBiMjEgYjIwIGEyMSBhMjAKLSAgICBwc3ViZCAgICAgeG1tMiwgeG1tNCAgICAgICAgICAgIDsgYzIxIGMyMCBkMjEgZDIwCi0gICAgbW92ZHFhICAgIHhtbTMsIHhtbTEKLSAgICBwYWRkZCAgICAgeG1tMSwgeG1tNiAgICAgICAgICAgIDsgYjIzIGIyMiBhMjMgYTIyCi0gICAgcHN1YmQgICAgIHhtbTMsIHhtbTYgICAgICAgICAgICA7IGMyMyBjMjIgZDIzIGQyMgotCi0gICAgcHhvciAgICAgIHhtbTQsIHhtbTQKLSAgICBtb3ZkcWEgICAgeG1tNSwgeG1tNAotICAgIHBjbXBndGQgICB4bW00LCB4bW0wCi0gICAgcGNtcGd0ZCAgIHhtbTUsIHhtbTIKLSAgICBwYW5kICAgICAgeG1tNCwgW0dMT0JBTChjZDEpXQotICAgIHBhbmQgICAgICB4bW01LCBbR0xPQkFMKGNkMSldCi0KLSAgICBweG9yICAgICAgeG1tNiwgeG1tNgotICAgIG1vdmRxYSAgICB4bW03LCB4bW02Ci0gICAgcGNtcGd0ZCAgIHhtbTYsIHhtbTEKLSAgICBwY21wZ3RkICAgeG1tNywgeG1tMwotICAgIHBhbmQgICAgICB4bW02LCBbR0xPQkFMKGNkMSldCi0gICAgcGFuZCAgICAgIHhtbTcsIFtHTE9CQUwoY2QxKV0KLQotICAgIHBhZGRkICAgICB4bW0wLCB4bW00Ci0gICAgcGFkZGQgICAgIHhtbTIsIHhtbTUKLSAgICBwYWRkZCAgICAgeG1tMCwgW0dMT0JBTChjZDMpXQotICAgIHBhZGRkICAgICB4bW0yLCBbR0xPQkFMKGNkMyldCi0gICAgcGFkZGQgICAgIHhtbTEsIHhtbTYKLSAgICBwYWRkZCAgICAgeG1tMywgeG1tNwotICAgIHBhZGRkICAgICB4bW0xLCBbR0xPQkFMKGNkMyldCi0gICAgcGFkZGQgICAgIHhtbTMsIFtHTE9CQUwoY2QzKV0KLQotICAgIHBzcmFkICAgICB4bW0wLCAzCi0gICAgcHNyYWQgICAgIHhtbTEsIDMKLSAgICBwc3JhZCAgICAgeG1tMiwgMwotICAgIHBzcmFkICAgICB4bW0zLCAzCi0gICAgbW92ZHFhICAgIHhtbTQsIHhtbTAKLSAgICBwdW5wY2tscWRxIHhtbTAsIHhtbTEgICAgICAgICAgIDsgYTIzIGEyMiBhMjEgYTIwCi0gICAgcHVucGNraHFkcSB4bW00LCB4bW0xICAgICAgICAgICA7IGIyMyBiMjIgYjIxIGIyMAotICAgIG1vdmRxYSAgICB4bW01LCB4bW0yCi0gICAgcHVucGNraHFkcSB4bW0yLCB4bW0zICAgICAgICAgICA7IGMyMyBjMjIgYzIxIGMyMAotICAgIHB1bnBja2xxZHEgeG1tNSwgeG1tMyAgICAgICAgICAgOyBkMjMgZDIyIGQyMSBkMjAKLQotICAgIHBhY2tzc2R3ICB4bW0wLCB4bW00ICAgICAgICAgICAgOyBiMjMgYjIyIGIyMSBiMjAgYTIzIGEyMiBhMjEgYTIwCi0gICAgcGFja3NzZHcgIHhtbTIsIHhtbTUgICAgICAgICAgICA7IGQyMyBkMjIgZDIxIGQyMCBjMjMgYzIyIGMyMSBjMjAKLQotICAgIG1vdmRxYSAgWE1NV09SRCBQVFIgW3JkaV0sIHhtbTAKLSAgICBtb3ZkcWEgIFhNTVdPUkQgUFRSIFtyZGkgKyAxNl0sIHhtbTIKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLWMxOgotICAgIGR3IDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxCi1hbGlnbiAxNgotY24xOgotICAgIGR3IDB4MDAwMSwgMHhmZmZmLCAweDAwMDEsIDB4ZmZmZiwgMHgwMDAxLCAweGZmZmYsIDB4MDAwMSwgMHhmZmZmCi1hbGlnbiAxNgotY2QxOgotICAgIGRkIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEKLWFsaWduIDE2Ci1jZDM6Ci0gICAgZGQgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMwpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L21jb21wX3g4Ni5oIGIvdnA4L2VuY29kZXIveDg2L21jb21wX3g4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdiMjljLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni9tY29tcF94ODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIE1DT01QX1g4Nl9ICi0jZGVmaW5lIE1DT01QX1g4Nl9ICi0KLSNpZiBIQVZFX1NTRTMKLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotCi0jdW5kZWYgIHZwOF9zZWFyY2hfZnVsbF9zZWFyY2gKLSNkZWZpbmUgdnA4X3NlYXJjaF9mdWxsX3NlYXJjaCB2cDhfZnVsbF9zZWFyY2hfc2FkeDMKLQotI3VuZGVmICB2cDhfc2VhcmNoX2RpYW1vbmRfc2VhcmNoCi0jZGVmaW5lIHZwOF9zZWFyY2hfZGlhbW9uZF9zZWFyY2ggdnA4X2RpYW1vbmRfc2VhcmNoX3NhZHg0Ci0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBIQVZFX1NTRTRfMQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSN1bmRlZiAgdnA4X3NlYXJjaF9mdWxsX3NlYXJjaAotI2RlZmluZSB2cDhfc2VhcmNoX2Z1bGxfc2VhcmNoIHZwOF9mdWxsX3NlYXJjaF9zYWR4OAotCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX21teC5hc20gYi92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfbW14LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5YTU0ZS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfbW14LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLTtpbnQgdnA4X2Zhc3RfcXVhbnRpemVfYl9pbXBsX21teChzaG9ydCAqY29lZmZfcHRyLCBzaG9ydCAqemJpbl9wdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnFjb2VmZl9wdHIsc2hvcnQgKmRlcXVhbnRfcHRyLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpzY2FuX21hc2ssIHNob3J0ICpyb3VuZF9wdHIsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnF1YW50X3B0ciwgc2hvcnQgKmRxY29lZmZfcHRyKTsKLWdsb2JhbCBzeW0odnA4X2Zhc3RfcXVhbnRpemVfYl9pbXBsX21teCkKLXN5bSh2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtjb2VmZl9wdHIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFtyc2ldCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygxKSA7emJpbl9wdHIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFtyYXhdCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICBwc3JhdyAgICAgICAgICAgbW0wLCAgICAgICAgMTUKLQotICAgICAgICBweG9yICAgICAgICAgICAgbW0zLCAgICAgICAgbW0wCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTMsICAgICAgICBtbTAgICAgICAgICA7IGFicwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTMKLSAgICAgICAgcGNtcGd0dyAgICAgICAgIG1tMSwgICAgICAgIG1tMgotCi0gICAgICAgIHBhbmRuICAgICAgICAgICBtbTEsICAgICAgICBtbTIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIG1tMQotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZHgsICAgICAgICBhcmcoNikgO3F1YW50X3B0cgotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgW3JkeF0KLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgYXJnKDUpIDtyb3VuZF9wdHIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFtyY3hdCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMywgICAgICAgIG1tMgotICAgICAgICBwbXVsaHV3ICAgICAgICAgbW0zLCAgICAgICAgbW0xCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICBwc3VidyAgICAgICAgICAgbW0zLCAgICAgICAgbW0wICAgICA7Z2FpbiB0aGUgc2lnbiBiYWNrCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cWNvZWZmX3B0cgotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgbW0zCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIFtyZGldLCAgICAgIG1tMwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMykgO2RlcXVhbnRfcHRyCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBbcmF4XQotCi0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTMsICAgICAgICBtbTIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7ZHFjb2VmZl9wdHIKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgW3JheF0sICAgICAgbW0zCi0KLSAgICAgICAgOyBuZXh0IDgKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIFtyc2krOF0KLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDEpIDt6YmluX3B0cgotICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgW3JheCs4XQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTQKLSAgICAgICAgcHNyYXcgICAgICAgICAgIG1tNCwgICAgICAgIDE1Ci0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNAotICAgICAgICBwc3VidyAgICAgICAgICAgbW03LCAgICAgICAgbW00ICAgICAgICAgOyBhYnMKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgbW03Ci0gICAgICAgIHBjbXBndHcgICAgICAgICBtbTUsICAgICAgICBtbTYKLQotICAgICAgICBwYW5kbiAgICAgICAgICAgbW01LCAgICAgICAgbW02Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTUKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgW3JkeCs4XQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgW3JjeCs4XQotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTYKLSAgICAgICAgcG11bGh1dyAgICAgICAgIG1tNywgICAgICAgIG1tNQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTQKLSAgICAgICAgcHN1YncgICAgICAgICAgIG1tNywgICAgICAgIG1tNDtnYWluIHRoZSBzaWduIGJhY2sKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtxY29lZmZfcHRyCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIG1tNwotICAgICAgICBtb3ZxICAgICAgICAgICAgW3JkaSs4XSwgICAgbW03Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygzKSA7ZGVxdWFudF9wdHIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIFtyYXgrOF0KLQotICAgICAgICBwbXVsbHcgICAgICAgICAgbW03LCAgICAgICAgbW02Ci0gICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoNykgO2RxY29lZmZfcHRyCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIFtyYXgrOF0sICAgIG1tNwotCi0KLSAgICAgICAgICAgICAgICA7IG5leHQgOAotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgW3JzaSsxNl0KLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDEpIDt6YmluX3B0cgotICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgW3JheCsxNl0KLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgbW00Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICBtbTQsICAgICAgICAxNQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTQKLSAgICAgICAgcHN1YncgICAgICAgICAgIG1tNywgICAgICAgIG1tNCAgICAgICAgIDsgYWJzCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIG1tNwotICAgICAgICBwY21wZ3R3ICAgICAgICAgbW01LCAgICAgICAgbW02Ci0KLSAgICAgICAgcGFuZG4gICAgICAgICAgIG1tNSwgICAgICAgIG1tNgotICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgbW01Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFtyZHgrMTZdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBbcmN4KzE2XQotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTYKLSAgICAgICAgcG11bGh1dyAgICAgICAgIG1tNywgICAgICAgIG1tNQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTQKLSAgICAgICAgcHN1YncgICAgICAgICAgIG1tNywgICAgICAgIG1tNDtnYWluIHRoZSBzaWduIGJhY2sKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtxY29lZmZfcHRyCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIG1tNwotICAgICAgICBtb3ZxICAgICAgICAgICAgW3JkaSsxNl0sICAgbW03Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygzKSA7ZGVxdWFudF9wdHIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgIFtyYXgrMTZdCi0KLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tNywgICAgICAgIG1tNgotICAgICAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDcpIDtkcWNvZWZmX3B0cgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBbcmF4KzE2XSwgICBtbTcKLQotCi0gICAgICAgICAgICAgICAgOyBuZXh0IDgKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIFtyc2krMjRdCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygxKSA7emJpbl9wdHIKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFtyYXgrMjRdCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tNAotICAgICAgICBwc3JhdyAgICAgICAgICAgbW00LCAgICAgICAgMTUKLQotICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW00Ci0gICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTcsICAgICAgICBtbTQgICAgICAgICA7IGFicwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBtbTcKLSAgICAgICAgcGNtcGd0dyAgICAgICAgIG1tNSwgICAgICAgIG1tNgotCi0gICAgICAgIHBhbmRuICAgICAgICAgICBtbTUsICAgICAgICBtbTYKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tNQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICBbcmR4KzI0XQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgW3JjeCsyNF0KLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW02Ci0gICAgICAgIHBtdWxodXcgICAgICAgICBtbTcsICAgICAgICBtbTUKLQotICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW00Ci0gICAgICAgIHBzdWJ3ICAgICAgICAgICBtbTcsICAgICAgICBtbTQ7Z2FpbiB0aGUgc2lnbiBiYWNrCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cWNvZWZmX3B0cgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBtbTcKLSAgICAgICAgbW92cSAgICAgICAgICAgIFtyZGkrMjRdLCAgIG1tNwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoMykgO2RlcXVhbnRfcHRyCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBbcmF4KzI0XQotCi0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTcsICAgICAgICBtbTYKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZyg3KSA7ZHFjb2VmZl9wdHIKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgW3JheCsyNF0sICAgbW03Ci0KLQotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO3NjYW5fbWFzawotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDIpIDtxY29lZmZfcHRyCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNSwgICAgICAgIG1tNQotICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBbcnNpKzhdCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFtyZGldCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBbcmRpKzhdOwotCi0gICAgICAgIHBjbXBlcXcgICAgICAgICBtbTAsICAgICAgICBtbTcKLSAgICAgICAgcGNtcGVxdyAgICAgICAgIG1tMSwgICAgICAgIG1tNwotCi0gICAgICAgIHBjbXBlcXcgICAgICAgICBtbTYsICAgICAgICBtbTYKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNgotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTEsICAgICAgICBtbTYKLSAgICAgICAgcHNybHcgICAgICAgICAgIG1tMCwgICAgICAgIDE1Ci0KLSAgICAgICAgcHNybHcgICAgICAgICAgIG1tMSwgICAgICAgIDE1Ci0gICAgICAgIHBtYWRkd2QgICAgICAgICBtbTAsICAgICAgICBtbTIKLQotICAgICAgICBwbWFkZHdkICAgICAgICAgbW0xLCAgICAgICAgbW0zCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICBtbTAKLQotICAgICAgICBwYWRkZCAgICAgICAgICAgbW01LCAgICAgICAgbW0xCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFtyc2krMTZdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBbcnNpKzI0XQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBbcmRpKzE2XQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgW3JkaSsyNF07Ci0KLSAgICAgICAgcGNtcGVxdyAgICAgICAgIG1tMCwgICAgICAgIG1tNwotICAgICAgICBwY21wZXF3ICAgICAgICAgbW0xLCAgICAgICAgbW03Ci0KLSAgICAgICAgcGNtcGVxdyAgICAgICAgIG1tNiwgICAgICAgIG1tNgotICAgICAgICBweG9yICAgICAgICAgICAgbW0wLCAgICAgICAgbW02Ci0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMSwgICAgICAgIG1tNgotICAgICAgICBwc3JsdyAgICAgICAgICAgbW0wLCAgICAgICAgMTUKLQotICAgICAgICBwc3JsdyAgICAgICAgICAgbW0xLCAgICAgICAgMTUKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIG1tMCwgICAgICAgIG1tMgotCi0gICAgICAgIHBtYWRkd2QgICAgICAgICBtbTEsICAgICAgICBtbTMKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tNSwgICAgICAgIG1tMAotCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTUsICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNQotCi0gICAgICAgIHBzcmxxICAgICAgICAgICBtbTUsICAgICAgICAzMgotICAgICAgICBwYWRkZCAgICAgICAgICAgbW0wLCAgICAgICAgbW01Ci0KLSAgICAgICAgOyBlb2IgYWRqdXN0bWVudCBiZWdpbnMgaGVyZQotICAgICAgICBtb3ZxICAgICAgICAgICAgcmN4LCAgICAgICAgbW0wCi0gICAgICAgIGFuZCAgICAgICAgICAgICByY3gsICAgICAgICAweGZmZmYKLQotICAgICAgICB4b3IgICAgICAgICAgICAgcmR4LCAgICAgICAgcmR4Ci0gICAgICAgIHN1YiAgICAgICAgICAgICByZHgsICAgICAgICByY3ggOyByZHg9LXJjeAotCi0gICAgICAgIGJzciAgICAgICAgICAgICByYXgsICAgICAgICByY3gKLSAgICAgICAgaW5jICAgICAgICAgICAgIHJheAotCi0gICAgICAgIHNhciAgICAgICAgICAgICByZHgsICAgICAgICAzMQotICAgICAgICBhbmQgICAgICAgICAgICAgcmF4LCAgICAgICAgcmR4Ci0gICAgICAgIDsgU3Vic3RpdHV0ZSB0aGUgc3NlIGFzc2VtYmx5IGZvciB0aGUgb2xkIG1teCBtaXhlZCBhc3NlbWJseS9DLiBUaGUKLSAgICAgICAgOyBmb2xsb3dpbmcgaXMga2VwdCBhcyByZWZlcmVuY2UKLSAgICAgICAgOyAgICBtb3ZxICAgICAgICAgICAgcmN4LCAgICAgICAgbW0wCi0gICAgICAgIDsgICAgYnNyICAgICAgICAgICAgIHJheCwgICAgICAgIHJjeAotICAgICAgICA7Ci0gICAgICAgIDsgICAgbW92ICAgICAgICAgICAgIGVvYiwgICAgICAgIHJheAotICAgICAgICA7ICAgIG1vdiAgICAgICAgICAgICBlZWUsICAgICAgICByY3gKLSAgICAgICAgOwotICAgICAgICA7aWYoZWVlPT0wKQotICAgICAgICA7ewotICAgICAgICA7ICAgIGVvYj0tMTsKLSAgICAgICAgO30KLSAgICAgICAgO2Vsc2UgaWYoZWVlPDApCi0gICAgICAgIDt7Ci0gICAgICAgIDsgICAgZW9iPTE1OwotICAgICAgICA7fQotICAgICAgICA7ZC0+ZW9iID0gZW9iKzE7Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3NzZTIuYXNtIGIvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3NzZTIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTE1ODQwLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni9xdWFudGl6ZV9zc2UyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Ci07ICBncmFudCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heSBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUwotOyAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotJWluY2x1ZGUgImFzbV9lbmNfb2Zmc2V0cy5hc20iCi0KLQotOyB2b2lkIHZwOF9yZWd1bGFyX3F1YW50aXplX2Jfc3NlMiB8IGFyZwotOyAgKEJMT0NLICAqYiwgICAgICAgICAgICAgICAgICAgICB8ICAwCi07ICAgQkxPQ0tEICpkKSAgICAgICAgICAgICAgICAgICAgIHwgIDEKLQotZ2xvYmFsIHN5bSh2cDhfcmVndWxhcl9xdWFudGl6ZV9iX3NzZTIpCi1zeW0odnA4X3JlZ3VsYXJfcXVhbnRpemVfYl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICBwdXNoICAgICAgICByZGkKLSVlbHNlCi0gICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKLSAgICBwdXNoICAgICAgICByZGkKLSAgJWVuZGlmCi0lZW5kaWYKLQotICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKLSAgICAlZGVmaW5lIEJMT0NLRF9kICAgICAgICAgIDAgIDsgIDgKLSAgICAlZGVmaW5lIHpydW5femJpbl9ib29zdCAgIDggIDsgIDgKLSAgICAlZGVmaW5lIGFic19taW51c196YmluICAgIDE2IDsgMzIKLSAgICAlZGVmaW5lIHRlbXBfcWNvZWZmICAgICAgIDQ4IDsgMzIKLSAgICAlZGVmaW5lIHFjb2VmZiAgICAgICAgICAgIDgwIDsgMzIKLSAgICAlZGVmaW5lIHN0YWNrX3NpemUgICAgICAgIDExMgotICAgIHN1YiAgICAgICAgIHJzcCwgc3RhY2tfc2l6ZQotICAgIDsgZW5kIHByb2xvZwotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgbW92ICAgICAgICAgcmRpLCBhcmcoMCkKLSVlbHNlCi0gICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKLSAgICBtb3YgICAgICAgICByZGksIHJjeCAgICAgICAgICAgICAgICAgICAgOyBCTE9DSyAqYgotICAgIG1vdiAgICAgICAgIFtyc3AgKyBCTE9DS0RfZF0sIHJkeAotICAlZWxzZQotICAgIDttb3YgICAgICAgICByZGksIHJkaSAgICAgICAgICAgICAgICAgICAgOyBCTE9DSyAqYgotICAgIG1vdiAgICAgICAgIFtyc3AgKyBCTE9DS0RfZF0sIHJzaQotICAlZW5kaWYKLSVlbmRpZgotCi0gICAgbW92ICAgICAgICAgcmR4LCBbcmRpICsgdnA4X2Jsb2NrX2NvZWZmXSA7IGNvZWZmX3B0cgotICAgIG1vdiAgICAgICAgIHJjeCwgW3JkaSArIHZwOF9ibG9ja196YmluXSA7IHpiaW5fcHRyCi0gICAgbW92ZCAgICAgICAgeG1tNywgW3JkaSArIHZwOF9ibG9ja196YmluX2V4dHJhXSA7IHpiaW5fb3FfdmFsdWUKLQotICAgIDsgegotICAgIG1vdmRxYSAgICAgIHhtbTAsIFtyZHhdCi0gICAgbW92ZHFhICAgICAgeG1tNCwgW3JkeCArIDE2XQotICAgIG1vdiAgICAgICAgIHJkeCwgW3JkaSArIHZwOF9ibG9ja19yb3VuZF0gOyByb3VuZF9wdHIKLQotICAgIHBzaHVmbHcgICAgIHhtbTcsIHhtbTcsIDAKLSAgICBwdW5wY2tsd2QgICB4bW03LCB4bW03ICAgICAgICAgICAgICAgICAgOyBkdXBsaWNhdGVkIHpiaW5fb3FfdmFsdWUKLQotICAgIG1vdmRxYSAgICAgIHhtbTEsIHhtbTAKLSAgICBtb3ZkcWEgICAgICB4bW01LCB4bW00Ci0KLSAgICA7IHN6Ci0gICAgcHNyYXcgICAgICAgeG1tMCwgMTUKLSAgICBwc3JhdyAgICAgICB4bW00LCAxNQotCi0gICAgOyAoeiBeIHN6KQotICAgIHB4b3IgICAgICAgIHhtbTEsIHhtbTAKLSAgICBweG9yICAgICAgICB4bW01LCB4bW00Ci0KLSAgICA7IHggPSBhYnMoeikKLSAgICBwc3VidyAgICAgICB4bW0xLCB4bW0wCi0gICAgcHN1YncgICAgICAgeG1tNSwgeG1tNAotCi0gICAgbW92ZHFhICAgICAgeG1tMiwgW3JjeF0KLSAgICBtb3ZkcWEgICAgICB4bW0zLCBbcmN4ICsgMTZdCi0gICAgbW92ICAgICAgICAgcmN4LCBbcmRpICsgdnA4X2Jsb2NrX3F1YW50XSA7IHF1YW50X3B0cgotCi0gICAgOyAqemJpbl9wdHIgKyB6YmluX29xX3ZhbHVlCi0gICAgcGFkZHcgICAgICAgeG1tMiwgeG1tNwotICAgIHBhZGR3ICAgICAgIHhtbTMsIHhtbTcKLQotICAgIDsgeCAtICgqemJpbl9wdHIgKyB6YmluX29xX3ZhbHVlKQotICAgIHBzdWJ3ICAgICAgIHhtbTEsIHhtbTIKLSAgICBwc3VidyAgICAgICB4bW01LCB4bW0zCi0gICAgbW92ZHFhICAgICAgW3JzcCArIGFic19taW51c196YmluXSwgeG1tMQotICAgIG1vdmRxYSAgICAgIFtyc3AgKyBhYnNfbWludXNfemJpbiArIDE2XSwgeG1tNQotCi0gICAgOyBhZGQgKHpiaW5fcHRyICsgemJpbl9vcV92YWx1ZSkgYmFjawotICAgIHBhZGR3ICAgICAgIHhtbTEsIHhtbTIKLSAgICBwYWRkdyAgICAgICB4bW01LCB4bW0zCi0KLSAgICBtb3ZkcWEgICAgICB4bW0yLCBbcmR4XQotICAgIG1vdmRxYSAgICAgIHhtbTYsIFtyZHggKyAxNl0KLQotICAgIG1vdmRxYSAgICAgIHhtbTMsIFtyY3hdCi0gICAgbW92ZHFhICAgICAgeG1tNywgW3JjeCArIDE2XQotCi0gICAgOyB4ICsgcm91bmQKLSAgICBwYWRkdyAgICAgICB4bW0xLCB4bW0yCi0gICAgcGFkZHcgICAgICAgeG1tNSwgeG1tNgotCi0gICAgOyB5ID0geCAqIHF1YW50X3B0ciA+PiAxNgotICAgIHBtdWxodyAgICAgIHhtbTMsIHhtbTEKLSAgICBwbXVsaHcgICAgICB4bW03LCB4bW01Ci0KLSAgICA7IHkgKz0geAotICAgIHBhZGR3ICAgICAgIHhtbTEsIHhtbTMKLSAgICBwYWRkdyAgICAgICB4bW01LCB4bW03Ci0KLSAgICBtb3ZkcWEgICAgICBbcnNwICsgdGVtcF9xY29lZmZdLCB4bW0xCi0gICAgbW92ZHFhICAgICAgW3JzcCArIHRlbXBfcWNvZWZmICsgMTZdLCB4bW01Ci0KLSAgICBweG9yICAgICAgICB4bW02LCB4bW02Ci0gICAgOyB6ZXJvIHFjb2VmZgotICAgIG1vdmRxYSAgICAgIFtyc3AgKyBxY29lZmZdLCB4bW02Ci0gICAgbW92ZHFhICAgICAgW3JzcCArIHFjb2VmZiArIDE2XSwgeG1tNgotCi0gICAgbW92ICAgICAgICAgcnNpLCBbcmRpICsgdnA4X2Jsb2NrX3pydW5femJpbl9ib29zdF0gOyB6YmluX2Jvb3N0X3B0cgotICAgIG1vdiAgICAgICAgIHJheCwgW3JkaSArIHZwOF9ibG9ja19xdWFudF9zaGlmdF0gOyBxdWFudF9zaGlmdF9wdHIKLSAgICBtb3YgICAgICAgICBbcnNwICsgenJ1bl96YmluX2Jvb3N0XSwgcnNpCi0KLSVtYWNybyBaSUdaQUdfTE9PUCAxCi0gICAgbW92c3ggICAgICAgZWR4LCBXT1JEIFBUUltHTE9CQUwoemlnX3phZyArICglMSAqIDIpKV0gOyByYwotCi0gICAgOyB4Ci0gICAgbW92c3ggICAgICAgZWN4LCBXT1JEIFBUUltyc3AgKyBhYnNfbWludXNfemJpbiArIHJkeCAqMl0KLQotICAgIDsgaWYgKHggPj0gemJpbikKLSAgICBzdWIgICAgICAgICBjeCwgV09SRCBQVFJbcnNpXSAgICAgICAgICAgOyB4IC0gemJpbgotICAgIGxlYSAgICAgICAgIHJzaSwgW3JzaSArIDJdICAgICAgICAgICAgICA7IHpiaW5fYm9vc3RfcHRyKysKLSAgICBqbCAgICAgICAgICBycV96aWd6YWdfbG9vcF8lMSAgICAgICAgICAgOyB4IDwgemJpbgotCi0gICAgbW92c3ggICAgICAgZWRpLCBXT1JEIFBUUltyc3AgKyB0ZW1wX3Fjb2VmZiArIHJkeCAqMl0KLQotICAgIDsgZG93bnNoaWZ0IGJ5IHF1YW50X3NoaWZ0W3JkeF0KLSAgICBtb3ZzeCAgICAgICBlY3gsIFdPUkQgUFRSW3JheCArIHJkeCoyXSAgOyBxdWFudF9zaGlmdF9wdHJbcmNdCi0gICAgc2FyICAgICAgICAgZWRpLCBjbCAgICAgICAgICAgICAgICAgICAgIDsgYWxzbyBzZXRzIFogYml0Ci0gICAgamUgICAgICAgICAgcnFfemlnemFnX2xvb3BfJTEgICAgICAgICAgIDsgIXkKLSAgICBtb3YgICAgICAgICBXT1JEIFBUUltyc3AgKyBxY29lZmYgKyByZHgqMl0sIGRpIDtxY29lZmZfcHRyW3JjXSA9IHRlbXBfcWNvZWZmW3JjXQotICAgIG1vdiAgICAgICAgIHJzaSwgW3JzcCArIHpydW5femJpbl9ib29zdF0gOyByZXNldCB0byBiLT56cnVuX3piaW5fYm9vc3QKLXJxX3ppZ3phZ19sb29wXyUxOgotJWVuZG1hY3JvCi1aSUdaQUdfTE9PUCAwCi1aSUdaQUdfTE9PUCAxCi1aSUdaQUdfTE9PUCAyCi1aSUdaQUdfTE9PUCAzCi1aSUdaQUdfTE9PUCA0Ci1aSUdaQUdfTE9PUCA1Ci1aSUdaQUdfTE9PUCA2Ci1aSUdaQUdfTE9PUCA3Ci1aSUdaQUdfTE9PUCA4Ci1aSUdaQUdfTE9PUCA5Ci1aSUdaQUdfTE9PUCAxMAotWklHWkFHX0xPT1AgMTEKLVpJR1pBR19MT09QIDEyCi1aSUdaQUdfTE9PUCAxMwotWklHWkFHX0xPT1AgMTQKLVpJR1pBR19MT09QIDE1Ci0KLSAgICBtb3ZkcWEgICAgICB4bW0yLCBbcnNwICsgcWNvZWZmXQotICAgIG1vdmRxYSAgICAgIHhtbTMsIFtyc3AgKyBxY29lZmYgKyAxNl0KLQotJWlmIEFCSV9JU18zMkJJVAotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDEpCi0lZWxzZQotICAgIG1vdiAgICAgICAgIHJkaSwgW3JzcCArIEJMT0NLRF9kXQotJWVuZGlmCi0KLSAgICBtb3YgICAgICAgICByY3gsIFtyZGkgKyB2cDhfYmxvY2tkX2RlcXVhbnRdIDsgZGVxdWFudF9wdHIKLSAgICBtb3YgICAgICAgICByc2ksIFtyZGkgKyB2cDhfYmxvY2tkX2RxY29lZmZdIDsgZHFjb2VmZl9wdHIKLQotICAgIDsgeSBeIHN6Ci0gICAgcHhvciAgICAgICAgeG1tMiwgeG1tMAotICAgIHB4b3IgICAgICAgIHhtbTMsIHhtbTQKLSAgICA7IHggPSAoeSBeIHN6KSAtIHN6Ci0gICAgcHN1YncgICAgICAgeG1tMiwgeG1tMAotICAgIHBzdWJ3ICAgICAgIHhtbTMsIHhtbTQKLQotICAgIDsgZGVxdWFudAotICAgIG1vdmRxYSAgICAgIHhtbTAsIFtyY3hdCi0gICAgbW92ZHFhICAgICAgeG1tMSwgW3JjeCArIDE2XQotCi0gICAgbW92ICAgICAgICAgcmN4LCBbcmRpICsgdnA4X2Jsb2NrZF9xY29lZmZdIDsgcWNvZWZmX3B0cgotCi0gICAgcG11bGx3ICAgICAgeG1tMCwgeG1tMgotICAgIHBtdWxsdyAgICAgIHhtbTEsIHhtbTMKLQotICAgIG1vdmRxYSAgICAgIFtyY3hdLCB4bW0yICAgICAgICA7IHN0b3JlIHFjb2VmZgotICAgIG1vdmRxYSAgICAgIFtyY3ggKyAxNl0sIHhtbTMKLSAgICBtb3ZkcWEgICAgICBbcnNpXSwgeG1tMCAgICAgICAgOyBzdG9yZSBkcWNvZWZmCi0gICAgbW92ZHFhICAgICAgW3JzaSArIDE2XSwgeG1tMQotCi0gICAgOyBzZWxlY3QgdGhlIGxhc3QgdmFsdWUgKGluIHppZ196YWcgb3JkZXIpIGZvciBFT0IKLSAgICBwY21wZXF3ICAgICB4bW0yLCB4bW02Ci0gICAgcGNtcGVxdyAgICAgeG1tMywgeG1tNgotICAgIDsgIQotICAgIHBjbXBlcXcgICAgIHhtbTYsIHhtbTYKLSAgICBweG9yICAgICAgICB4bW0yLCB4bW02Ci0gICAgcHhvciAgICAgICAgeG1tMywgeG1tNgotICAgIDsgbWFzayBpbnZfemlnX3phZwotICAgIHBhbmQgICAgICAgIHhtbTIsIFtHTE9CQUwoaW52X3ppZ196YWcpXQotICAgIHBhbmQgICAgICAgIHhtbTMsIFtHTE9CQUwoaW52X3ppZ196YWcgKyAxNildCi0gICAgOyBzZWxlY3QgdGhlIG1heCB2YWx1ZQotICAgIHBtYXhzdyAgICAgIHhtbTIsIHhtbTMKLSAgICBwc2h1ZmQgICAgICB4bW0zLCB4bW0yLCAwMDAwMTExMGIKLSAgICBwbWF4c3cgICAgICB4bW0yLCB4bW0zCi0gICAgcHNodWZsdyAgICAgeG1tMywgeG1tMiwgMDAwMDExMTBiCi0gICAgcG1heHN3ICAgICAgeG1tMiwgeG1tMwotICAgIHBzaHVmbHcgICAgIHhtbTMsIHhtbTIsIDAwMDAwMDAxYgotICAgIHBtYXhzdyAgICAgIHhtbTIsIHhtbTMKLSAgICBtb3ZkICAgICAgICBlYXgsIHhtbTIKLSAgICBhbmQgICAgICAgICBlYXgsIDB4ZmYKLSAgICBtb3YgICAgICAgICBbcmRpICsgdnA4X2Jsb2NrZF9lb2JdLCBlYXgKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgYWRkICAgICAgICAgcnNwLCBzdGFja19zaXplCi0gICAgcG9wICAgICAgICAgcnNwCi0laWYgQUJJX0lTXzMyQklUCi0gICAgcG9wICAgICAgICAgcmRpCi0lZWxzZQotICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0Ci0gICAgcG9wICAgICAgICAgcmRpCi0gICVlbmRpZgotJWVuZGlmCi0gICAgcG9wICAgICAgICAgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07IGludCB2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfc3NlMiB8IGFyZwotOyAgKHNob3J0ICpjb2VmZl9wdHIsICAgICAgICAgICAgICAgfCAgMAotOyAgIHNob3J0ICpxY29lZmZfcHRyLCAgICAgICAgICAgICAgfCAgMQotOyAgIHNob3J0ICpkZXF1YW50X3B0ciwgICAgICAgICAgICAgfCAgMgotOyAgIHNob3J0ICppbnZfc2Nhbl9vcmRlciwgICAgICAgICAgfCAgMwotOyAgIHNob3J0ICpyb3VuZF9wdHIsICAgICAgICAgICAgICAgfCAgNAotOyAgIHNob3J0ICpxdWFudF9wdHIsICAgICAgICAgICAgICAgfCAgNQotOyAgIHNob3J0ICpkcWNvZWZmX3B0cikgICAgICAgICAgICAgfCAgNgotCi1nbG9iYWwgc3ltKHZwOF9mYXN0X3F1YW50aXplX2JfaW1wbF9zc2UyKQotc3ltKHZwOF9mYXN0X3F1YW50aXplX2JfaW1wbF9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIG1vdiAgICAgICAgIHJkeCwgYXJnKDApICAgICAgICAgICAgICAgICA7Y29lZmZfcHRyCi0gICAgbW92ICAgICAgICAgcmN4LCBhcmcoMikgICAgICAgICAgICAgICAgIDtkZXF1YW50X3B0cgotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDQpICAgICAgICAgICAgICAgICA7cm91bmRfcHRyCi0gICAgbW92ICAgICAgICAgcnNpLCBhcmcoNSkgICAgICAgICAgICAgICAgIDtxdWFudF9wdHIKLQotICAgIG1vdmRxYSAgICAgIHhtbTAsIFhNTVdPUkQgUFRSW3JkeF0KLSAgICBtb3ZkcWEgICAgICB4bW00LCBYTU1XT1JEIFBUUltyZHggKyAxNl0KLQotICAgIG1vdmRxYSAgICAgIHhtbTIsIFhNTVdPUkQgUFRSW3JkaV0gICAgICA7cm91bmQgbG8KLSAgICBtb3ZkcWEgICAgICB4bW0zLCBYTU1XT1JEIFBUUltyZGkgKyAxNl0gO3JvdW5kIGhpCi0KLSAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCi0gICAgbW92ZHFhICAgICAgeG1tNSwgeG1tNAotCi0gICAgcHNyYXcgICAgICAgeG1tMCwgMTUgICAgICAgICAgICAgICAgICAgIDtzaWduIG9mIHogKGFrYSBzeikKLSAgICBwc3JhdyAgICAgICB4bW00LCAxNSAgICAgICAgICAgICAgICAgICAgO3NpZ24gb2YgeiAoYWthIHN6KQotCi0gICAgcHhvciAgICAgICAgeG1tMSwgeG1tMAotICAgIHB4b3IgICAgICAgIHhtbTUsIHhtbTQKLSAgICBwc3VidyAgICAgICB4bW0xLCB4bW0wICAgICAgICAgICAgICAgICAgO3ggPSBhYnMoeikKLSAgICBwc3VidyAgICAgICB4bW01LCB4bW00ICAgICAgICAgICAgICAgICAgO3ggPSBhYnMoeikKLQotICAgIHBhZGR3ICAgICAgIHhtbTEsIHhtbTIKLSAgICBwYWRkdyAgICAgICB4bW01LCB4bW0zCi0KLSAgICBwbXVsaHcgICAgICB4bW0xLCBYTU1XT1JEIFBUUltyc2ldCi0gICAgcG11bGh3ICAgICAgeG1tNSwgWE1NV09SRCBQVFJbcnNpICsgMTZdCi0KLSAgICBtb3YgICAgICAgICByZGksIGFyZygxKSAgICAgICAgICAgICAgICAgO3Fjb2VmZl9wdHIKLSAgICBtb3YgICAgICAgICByc2ksIGFyZyg2KSAgICAgICAgICAgICAgICAgO2RxY29lZmZfcHRyCi0KLSAgICBtb3ZkcWEgICAgICB4bW0yLCBYTU1XT1JEIFBUUltyY3hdCi0gICAgbW92ZHFhICAgICAgeG1tMywgWE1NV09SRCBQVFJbcmN4ICsgMTZdCi0KLSAgICBweG9yICAgICAgICB4bW0xLCB4bW0wCi0gICAgcHhvciAgICAgICAgeG1tNSwgeG1tNAotICAgIHBzdWJ3ICAgICAgIHhtbTEsIHhtbTAKLSAgICBwc3VidyAgICAgICB4bW01LCB4bW00Ci0KLSAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUltyZGldLCB4bW0xCi0gICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbcmRpICsgMTZdLCB4bW01Ci0KLSAgICBwbXVsbHcgICAgICB4bW0yLCB4bW0xCi0gICAgcG11bGx3ICAgICAgeG1tMywgeG1tNQotCi0gICAgbW92ICAgICAgICAgcmRpLCBhcmcoMykgICAgICAgICAgICAgICAgIDtpbnZfc2Nhbl9vcmRlcgotCi0gICAgOyBTdGFydCB3aXRoIDE2Ci0gICAgcHhvciAgICAgICAgeG1tNCwgeG1tNCAgICAgICAgICAgICAgICAgIDtjbGVhciBhbGwgYml0cwotICAgIHBjbXBlcXcgICAgIHhtbTEsIHhtbTQKLSAgICBwY21wZXF3ICAgICB4bW01LCB4bW00Ci0KLSAgICBwY21wZXF3ICAgICB4bW00LCB4bW00ICAgICAgICAgICAgICAgICAgO3NldCBhbGwgYml0cwotICAgIHB4b3IgICAgICAgIHhtbTEsIHhtbTQKLSAgICBweG9yICAgICAgICB4bW01LCB4bW00Ci0KLSAgICBwYW5kICAgICAgICB4bW0xLCBYTU1XT1JEIFBUUltyZGldCi0gICAgcGFuZCAgICAgICAgeG1tNSwgWE1NV09SRCBQVFJbcmRpKzE2XQotCi0gICAgcG1heHN3ICAgICAgeG1tMSwgeG1tNQotCi0gICAgOyBub3cgZG93biB0byA4Ci0gICAgcHNodWZkICAgICAgeG1tNSwgeG1tMSwgMDAwMDExMTBiCi0KLSAgICBwbWF4c3cgICAgICB4bW0xLCB4bW01Ci0KLSAgICA7IG9ubHkgNCBsZWZ0Ci0gICAgcHNodWZsdyAgICAgeG1tNSwgeG1tMSwgMDAwMDExMTBiCi0KLSAgICBwbWF4c3cgICAgICB4bW0xLCB4bW01Ci0KLSAgICA7IG9rYXksIGp1c3QgMiEKLSAgICBwc2h1Zmx3ICAgICB4bW01LCB4bW0xLCAwMDAwMDAwMWIKLQotICAgIHBtYXhzdyAgICAgIHhtbTEsIHhtbTUKLQotICAgIG1vdmQgICAgICAgIHJheCwgeG1tMQotICAgIGFuZCAgICAgICAgIHJheCwgMHhmZgotCi0gICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFJbcnNpXSwgeG1tMiAgICAgICAgO3N0b3JlIGRxY29lZmYKLSAgICBtb3ZkcWEgICAgICBYTU1XT1JEIFBUUltyc2kgKyAxNl0sIHhtbTMgICA7c3RvcmUgZHFjb2VmZgotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLVNFQ1RJT05fUk9EQVRBCi1hbGlnbiAxNgotemlnX3phZzoKLSAgZHcgMHgwMDAwLCAweDAwMDEsIDB4MDAwNCwgMHgwMDA4Ci0gIGR3IDB4MDAwNSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNgotICBkdyAweDAwMDksIDB4MDAwYywgMHgwMDBkLCAweDAwMGEKLSAgZHcgMHgwMDA3LCAweDAwMGIsIDB4MDAwZSwgMHgwMDBmCi1pbnZfemlnX3phZzoKLSAgZHcgMHgwMDAxLCAweDAwMDIsIDB4MDAwNiwgMHgwMDA3Ci0gIGR3IDB4MDAwMywgMHgwMDA1LCAweDAwMDgsIDB4MDAwZAotICBkdyAweDAwMDQsIDB4MDAwOSwgMHgwMDBjLCAweDAwMGUKLSAgZHcgMHgwMDBhLCAweDAwMGIsIDB4MDAwZiwgMHgwMDEwCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfc3NzZTMuYXNtIGIvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3Nzc2UzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzMzE5OS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvcXVhbnRpemVfc3NzZTMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIGFuZCBwYXRlbnQKLTsgIGdyYW50IHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5IGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTCi07ICBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLQotO2ludCB2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfc3NzZTMoc2hvcnQgKmNvZWZmX3B0cgotOyAgICAgICAgICAgICAgIHNob3J0ICpxY29lZmZfcHRyLHNob3J0ICpkZXF1YW50X3B0ciwKLTsgICAgICAgICAgICAgICBzaG9ydCAqcm91bmRfcHRyLAotOyAgICAgICAgICAgICAgIHNob3J0ICpxdWFudF9wdHIsIHNob3J0ICpkcWNvZWZmX3B0cik7Ci07Ci1nbG9iYWwgc3ltKHZwOF9mYXN0X3F1YW50aXplX2JfaW1wbF9zc3NlMykKLXN5bSh2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfc3NzZTMpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgbW92ICAgICAgICAgcmR4LCBhcmcoMCkgICAgICAgICAgICAgICAgIDtjb2VmZl9wdHIKLSAgICBtb3YgICAgICAgICByZGksIGFyZygzKSAgICAgICAgICAgICAgICAgO3JvdW5kX3B0cgotICAgIG1vdiAgICAgICAgIHJzaSwgYXJnKDQpICAgICAgICAgICAgICAgICA7cXVhbnRfcHRyCi0KLSAgICBtb3ZkcWEgICAgICB4bW0wLCBbcmR4XQotICAgIG1vdmRxYSAgICAgIHhtbTQsIFtyZHggKyAxNl0KLQotICAgIG1vdmRxYSAgICAgIHhtbTIsIFtyZGldICAgICAgICAgICAgICAgICA7cm91bmQgbG8KLSAgICBtb3ZkcWEgICAgICB4bW0zLCBbcmRpICsgMTZdICAgICAgICAgICAgO3JvdW5kIGhpCi0KLSAgICBtb3ZkcWEgICAgICB4bW0xLCB4bW0wCi0gICAgbW92ZHFhICAgICAgeG1tNSwgeG1tNAotCi0gICAgcHNyYXcgICAgICAgeG1tMCwgMTUgICAgICAgICAgICAgICAgICAgIDtzaWduIG9mIHogKGFrYSBzeikKLSAgICBwc3JhdyAgICAgICB4bW00LCAxNSAgICAgICAgICAgICAgICAgICAgO3NpZ24gb2YgeiAoYWthIHN6KQotCi0gICAgcGFic3cgICAgICAgeG1tMSwgeG1tMQotICAgIHBhYnN3ICAgICAgIHhtbTUsIHhtbTUKLQotICAgIHBhZGR3ICAgICAgIHhtbTEsIHhtbTIKLSAgICBwYWRkdyAgICAgICB4bW01LCB4bW0zCi0KLSAgICBwbXVsaHcgICAgICB4bW0xLCBbcnNpXQotICAgIHBtdWxodyAgICAgIHhtbTUsIFtyc2kgKyAxNl0KLQotICAgIG1vdiAgICAgICAgIHJkaSwgYXJnKDEpICAgICAgICAgICAgICAgICA7cWNvZWZmX3B0cgotICAgIG1vdiAgICAgICAgIHJjeCwgYXJnKDIpICAgICAgICAgICAgICAgICA7ZGVxdWFudF9wdHIKLSAgICBtb3YgICAgICAgICByc2ksIGFyZyg1KSAgICAgICAgICAgICAgICAgO2RxY29lZmZfcHRyCi0KLSAgICBweG9yICAgICAgICB4bW0xLCB4bW0wCi0gICAgcHhvciAgICAgICAgeG1tNSwgeG1tNAotICAgIHBzdWJ3ICAgICAgIHhtbTEsIHhtbTAKLSAgICBwc3VidyAgICAgICB4bW01LCB4bW00Ci0KLSAgICBtb3ZkcWEgICAgICBbcmRpXSwgeG1tMQotICAgIG1vdmRxYSAgICAgIFtyZGkgKyAxNl0sIHhtbTUKLQotICAgIG1vdmRxYSAgICAgIHhtbTIsIFtyY3hdCi0gICAgbW92ZHFhICAgICAgeG1tMywgW3JjeCArIDE2XQotCi0gICAgcHhvciAgICAgICAgeG1tNCwgeG1tNAotICAgIHBtdWxsdyAgICAgIHhtbTIsIHhtbTEKLSAgICBwbXVsbHcgICAgICB4bW0zLCB4bW01Ci0KLSAgICBwY21wZXF3ICAgICB4bW0xLCB4bW00ICAgICAgICAgICAgICAgICAgO25vbiB6ZXJvIG1hc2sKLSAgICBwY21wZXF3ICAgICB4bW01LCB4bW00ICAgICAgICAgICAgICAgICAgO25vbiB6ZXJvIG1hc2sKLSAgICBwYWNrc3N3YiAgICB4bW0xLCB4bW01Ci0gICAgcHNodWZiICAgICAgeG1tMSwgWyBHTE9CQUwoenpfc2h1ZildCi0KLSAgICBwbW92bXNrYiAgICBlZHgsIHhtbTEKLQotOyAgICB4b3IgICAgICAgICBlY3gsIGVjeAotOyAgICBtb3YgICAgICAgICBlYXgsIC0xCi07ZmluZF9lb2JfbG9vcDoKLTsgICAgc2hyICAgICAgICAgZWR4LCAxCi07ICAgIGpjICAgICAgICAgIGZxX3NraXAKLTsgICAgbW92ICAgICAgICAgZWF4LCBlY3gKLTtmcV9za2lwOgotOyAgICBpbmMgICAgICAgICBlY3gKLTsgICAgY21wICAgICAgICAgZWN4LCAxNgotOyAgICBqbmUgICAgICAgICBmaW5kX2VvYl9sb29wCi0gICAgeG9yICAgICAgICAgcmRpLCByZGkKLSAgICBtb3YgICAgICAgICBlYXgsIC0xCi0gICAgeG9yICAgICAgICAgZHgsIGF4ICAgICAgICAgICAgICAgICAgICAgIDtmbGlwIHRoZSBiaXRzIGZvciBic3IKLSAgICBic3IgICAgICAgICBlYXgsIGVkeAotCi0gICAgbW92ZHFhICAgICAgW3JzaV0sIHhtbTIgICAgICAgICAgICAgICAgIDtzdG9yZSBkcWNvZWZmCi0gICAgbW92ZHFhICAgICAgW3JzaSArIDE2XSwgeG1tMyAgICAgICAgICAgIDtzdG9yZSBkcWNvZWZmCi0KLSAgICBzdWIgICAgICAgICBlZGksIGVkeCAgICAgICAgICAgICAgICAgICAgO2NoZWNrIGZvciBhbGwgemVyb3MgaW4gYml0IG1hc2sKLSAgICBzYXIgICAgICAgICBlZGksIDMxICAgICAgICAgICAgICAgICAgICAgOzAgb3IgLTEKLSAgICBhZGQgICAgICAgICBlYXgsIDEKLSAgICBhbmQgICAgICAgICBlYXgsIGVkaSAgICAgICAgICAgICAgICAgICAgO2lmIHRoZSBiaXQgbWFzayB3YXMgYWxsIHplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDt0aGVuIGVvYiA9IDAKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXp6X3NodWY6Ci0gICAgZGIgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3g4Ni5oIGIvdnA4L2VuY29kZXIveDg2L3F1YW50aXplX3g4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjU0YmVjLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni9xdWFudGl6ZV94ODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgcGF0ZW50Ci0gKiAgZ3JhbnQgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5IGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTCi0gKiAgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotI2lmbmRlZiBRVUFOVElaRV9YODZfSAotI2RlZmluZSBRVUFOVElaRV9YODZfSAotCi0KLS8qIE5vdGU6Ci0gKgotICogVGhpcyBwbGF0Zm9ybSBpcyBjb21tb25seSBidWlsdCBmb3IgcnVudGltZSBDUFUgZGV0ZWN0aW9uLiBJZiB5b3UgbW9kaWZ5Ci0gKiBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGFsc28gdXBkYXRlCi0gKiB0aGVtIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqLwotI2lmIEhBVkVfTU1YCi0KLSNlbmRpZgotCi0KLSNpZiBIQVZFX1NTRTIKLWV4dGVybiBwcm90b3R5cGVfcXVhbnRpemVfYmxvY2sodnA4X3JlZ3VsYXJfcXVhbnRpemVfYl9zc2UyKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSN1bmRlZiB2cDhfcXVhbnRpemVfcXVhbnRiCi0jZGVmaW5lIHZwOF9xdWFudGl6ZV9xdWFudGIgdnA4X3JlZ3VsYXJfcXVhbnRpemVfYl9zc2UyCi0KLSNlbmRpZgotCi0jZW5kaWYKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3g4Ni9zYWRfbW14LmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni9zYWRfbW14LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjYjAyMy4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvc2FkX21teC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi1nbG9iYWwgc3ltKHZwOF9zYWQxNngxNl9tbXgpCi1nbG9iYWwgc3ltKHZwOF9zYWQ4eDE2X21teCkKLWdsb2JhbCBzeW0odnA4X3NhZDh4OF9tbXgpCi1nbG9iYWwgc3ltKHZwOF9zYWQ0eDRfbW14KQotZ2xvYmFsIHN5bSh2cDhfc2FkMTZ4OF9tbXgpCi0KLTt1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDE2X21teCgKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUpCi1zeW0odnA4X3NhZDE2eDE2X21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyc2krcmF4KjhdCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyY3grcmF4KjhdCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTcKLQotICAgICAgICBweG9yICAgICAgICAgICAgbW02LCAgICAgICAgbW02Ci0KLXgxNngxNnNhZF9tbXhfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgUVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBRV09SRCBQVFIgW3JzaSs4XQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBRV09SRCBQVFIgW3JkaV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIG1tMAotICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgbW0yCi0KLSAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBwc3VidXNiICAgICAgICAgbW0xLCAgICAgICAgbW00Ci0KLSAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMiwgICAgICAgIG1tMwotICAgICAgICBwc3VidXNiICAgICAgICAgbW0zLCAgICAgICAgbW01Ci0KLSAgICAgICAgcG9yICAgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBwb3IgICAgICAgICAgICAgbW0yLCAgICAgICAgbW0zCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIG1tMAotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgbW0yCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMCwgICAgICAgIG1tNgotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0yLCAgICAgICAgbW02Ci0KLSAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tMSwgICAgICAgIG1tNgotICAgICAgICBwdW5wY2toYncgICAgICAgbW0zLCAgICAgICAgbW02Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgbW0zCi0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXhdCi0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICByZHgKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTcsICAgICAgICBtbTEKLQotICAgICAgICBjbXAgICAgICAgICAgICAgcnNpLCAgICAgICAgcmN4Ci0gICAgICAgIGpuZSAgICAgICAgICAgICB4MTZ4MTZzYWRfbW14X2xvb3AKLQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBtbTcKLQotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0wLCAgICAgICAgbW02Ci0gICAgICAgIHB1bnBja2h3ZCAgICAgICBtbTcsICAgICAgICBtbTYKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW03Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTAKLQotCi0gICAgICAgIHBzcmxxICAgICAgICAgICBtbTAsICAgICAgICAzMgotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNwotCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBtb3YgcnNwLCByYnAKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dW5zaWduZWQgaW50IHZwOF9zYWQ4eDE2X21teCgKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUpCi1zeW0odnA4X3NhZDh4MTZfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtyZWZfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JzaStyYXgqOF0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyYXgqOF0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNwotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTYsICAgICAgICBtbTYKLQoteDh4MTZzYWRfbW14X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFFXT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFtyZGldCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIG1tMAotICAgICAgICBwc3VidXNiICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0KLSAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMSwgICAgICAgIG1tMgotICAgICAgICBwb3IgICAgICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIG1tMAotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW02Ci0KLSAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tMiwgICAgICAgIG1tNgotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXhdCi0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgIHJkeAotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMgotICAgICAgICBjbXAgICAgICAgICAgICAgcnNpLCAgICAgICAgcmN4Ci0KLSAgICAgICAgam5lICAgICAgICAgICAgIHg4eDE2c2FkX21teF9sb29wCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNwotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0wLCAgICAgICAgbW02Ci0KLSAgICAgICAgcHVucGNraHdkICAgICAgIG1tNywgICAgICAgIG1tNgotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tMAotICAgICAgICBwc3JscSAgICAgICAgICAgbW0wLCAgICAgICAgMzIKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTcKLQotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgbW92IHJzcCwgcmJwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3Vuc2lnbmVkIGludCB2cDhfc2FkOHg4X21teCgKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUpCi1zeW0odnA4X3NhZDh4OF9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JheCo4XQotICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03Ci0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNiwgICAgICAgIG1tNgotCi14OHg4c2FkX21teF9sb29wOgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbcmRpXQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMCwgICAgICAgIG1tMQotCi0gICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTEsICAgICAgICBtbTIKLSAgICAgICAgcG9yICAgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMCwgICAgICAgIG1tNgotCi0gICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICBtbTYKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMgotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgIFtyc2krcmF4XQotICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgcmR4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgbW0wCi0gICAgICAgIGNtcCAgICAgICAgICAgICByc2ksICAgICAgICByY3gKLQotICAgICAgICBqbmUgICAgICAgICAgICAgeDh4OHNhZF9tbXhfbG9vcAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBtbTcKLSAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMCwgICAgICAgIG1tNgotCi0gICAgICAgIHB1bnBja2h3ZCAgICAgICBtbTcsICAgICAgICBtbTYKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tNwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTcsICAgICAgICBtbTAKLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tMCwgICAgICAgIDMyCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAotICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW03Ci0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIG1vdiByc3AsIHJicAotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt1bnNpZ25lZCBpbnQgdnA4X3NhZDR4NF9tbXgoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlKQotc3ltKHZwOF9zYWQ0eDRfbW14KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtyZWZfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0wLCAgICAgICAgRFdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3JkaV0KLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyc2krcmF4XQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgRFdPUkQgUFRSIFtyZGkrcmR4XQotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMSwgICAgICAgIG1tMwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgcHN1YnVzYiAgICAgICAgIG1tMCwgICAgICAgIG1tMQotCi0gICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTEsICAgICAgICBtbTIKLSAgICAgICAgcG9yICAgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgIG1tMwotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTMKLSAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tMiwgICAgICAgIG1tMwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTAsICAgICAgICBtbTIKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmR4KjJdCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNCwgICAgICAgIERXT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW01LCAgICAgICAgRFdPUkQgUFRSIFtyZGldCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNiwgICAgICAgIERXT1JEIFBUUiBbcnNpK3JheF0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNywgICAgICAgIERXT1JEIFBUUiBbcmRpK3JkeF0KLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW00LCAgICAgICAgbW02Ci0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTUsICAgICAgICBtbTcKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgbW00Ci0gICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTQsICAgICAgICBtbTUKLQotICAgICAgICBwc3VidXNiICAgICAgICAgbW01LCAgICAgICAgbW02Ci0gICAgICAgIHBvciAgICAgICAgICAgICBtbTQsICAgICAgICBtbTUKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgbW00Ci0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTQsICAgICAgICBtbTMKLQotICAgICAgICBwdW5wY2toYncgICAgICAgbW01LCAgICAgICAgbW0zCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTQsICAgICAgICBtbTUKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW00Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBtbTAKLQotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0wLCAgICAgICAgbW0zCi0gICAgICAgIHB1bnBja2h3ZCAgICAgICBtbTEsICAgICAgICBtbTMKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBtbTAKLQotICAgICAgICBwc3JscSAgICAgICAgICAgbW0wLCAgICAgICAgMzIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTAKLQotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgbW92IHJzcCwgcmJwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3Vuc2lnbmVkIGludCB2cDhfc2FkMTZ4OF9tbXgoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlKQotc3ltKHZwOF9zYWQxNng4X21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA0Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJjeCwgICAgICAgIFtyc2krcmF4KjhdCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICBtbTcKLQotICAgICAgICBweG9yICAgICAgICAgICAgbW02LCAgICAgICAgbW02Ci0KLXgxNng4c2FkX21teF9sb29wOgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgIFtyZGldCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFtyc2krOF0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFtyZGkrOF0KLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICBtbTIKLQotICAgICAgICBwc3VidXNiICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTEsICAgICAgICBtbTQKLQotICAgICAgICBwc3VidXNiICAgICAgICAgbW0yLCAgICAgICAgbW0zCi0gICAgICAgIHBzdWJ1c2IgICAgICAgICBtbTMsICAgICAgICBtbTUKLQotICAgICAgICBwb3IgICAgICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIHBvciAgICAgICAgICAgICBtbTIsICAgICAgICBtbTMKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBtbTIKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW02Ci0gICAgICAgIHB1bnBja2hidyAgICAgICBtbTEsICAgICAgICBtbTYKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0yLCAgICAgICAgbW02Ci0gICAgICAgIHB1bnBja2hidyAgICAgICBtbTMsICAgICAgICBtbTYKLQotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTAsICAgICAgICBtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgIG1tMwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4XQotCi0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICByZHgKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAotCi0gICAgICAgIGNtcCAgICAgICAgICAgICByc2ksICAgICAgICByY3gKLSAgICAgICAgam5lICAgICAgICAgICAgIHgxNng4c2FkX21teF9sb29wCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIG1tNwotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0wLCAgICAgICAgbW02Ci0KLSAgICAgICAgcHVucGNraHdkICAgICAgIG1tNywgICAgICAgIG1tNgotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0wLCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgIG1tMAotICAgICAgICBwc3JscSAgICAgICAgICAgbW0wLCAgICAgICAgMzIKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTcKLQotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgbW92IHJzcCwgcmJwCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvc2FkX3NzZTIuYXNtIGIvdnA4L2VuY29kZXIveDg2L3NhZF9zc2UyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllZDc5Ni4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvc2FkX3NzZTIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO3Vuc2lnbmVkIGludCB2cDhfc2FkMTZ4MTZfd210KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSkKLWdsb2JhbCBzeW0odnA4X3NhZDE2eDE2X3dtdCkKLXN5bSh2cDhfc2FkMTZ4MTZfd210KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JheCo4XQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcmN4K3JheCo4XQotICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgeG1tNwotCi14MTZ4MTZzYWRfd210X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIFFXT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgUVdPUkQgUFRSIFtyc2krOF0KLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgUVdPUkQgUFRSIFtyZGldCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBRV09SRCBQVFIgW3JkaSs4XQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW00LCAgICAgICBRV09SRCBQVFIgW3JzaStyYXhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW01LCAgICAgICBRV09SRCBQVFIgW3JkaStyZHhdCi0KLQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMCwgICAgICAgeG1tMgotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgeG1tMwotCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0wLCAgICAgICB4bW0xCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW02LCAgICAgICBRV09SRCBQVFIgW3JzaStyYXgrOF0KLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgUVdPUkQgUFRSIFtyZGkrcmR4KzhdCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNCwgICAgICAgeG1tNgotCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICB4bW0zCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW00LCAgICAgICB4bW01Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTAKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTQKLQotICAgICAgICBjbXAgICAgICAgICAgICAgcnNpLCAgICAgICAgcmN4Ci0gICAgICAgIGpuZSAgICAgICAgICAgICB4MTZ4MTZzYWRfd210X2xvb3AKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNwotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICB4bW0wCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dW5zaWduZWQgaW50IHZwOF9zYWQ4eDE2X3dtdCgKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgbWF4X2VycikKLWdsb2JhbCBzeW0odnA4X3NhZDh4MTZfd210KQotc3ltKHZwOF9zYWQ4eDE2X3dtdCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1Ci0gICAgcHVzaCAgICAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSA7c3JjX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtyZWZfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJieCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JzaStyYngqOF0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgW3JjeCtyYngqOF0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgIG1tNwotCi14OHgxNnNhZF93bXRfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW03Ci0gICAgICAgIGNtcCAgICAgICAgICAgICByYXgsICAgICAgICBhcmcoNCkKLSAgICAgICAgamcgICAgICAgICAgICAgIHg4eDE2c2FkX3dtdF9lYXJseV9leGl0Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFFXT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFtyZGldCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFFXT1JEIFBUUiBbcnNpK3JieF0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFFXT1JEIFBUUiBbcmRpK3JkeF0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTMKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYngqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmR4KjJdCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0yCi0KLSAgICAgICAgY21wICAgICAgICAgICAgIHJzaSwgICAgICAgIHJjeAotICAgICAgICBqbmUgICAgICAgICAgICAgeDh4MTZzYWRfd210X2xvb3AKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW03Ci0KLXg4eDE2c2FkX3dtdF9lYXJseV9leGl0OgotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBwb3AgICAgICAgICByYngKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3Vuc2lnbmVkIGludCB2cDhfc2FkOHg4X3dtdCgKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUpCi1nbG9iYWwgc3ltKHZwOF9zYWQ4eDhfd210KQotc3ltKHZwOF9zYWQ4eDhfd210KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKLSAgICBwdXNoICAgICAgICByYngKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JieCo4XQotICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03Ci0KLXg4eDhzYWRfd210X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIG1tNwotICAgICAgICBjbXAgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDQpCi0gICAgICAgIGpnICAgICAgICAgICAgICB4OHg4c2FkX3dtdF9lYXJseV9leGl0Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgIFFXT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFtyZGldCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYnhdCi0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgIHJkeAotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0KLSAgICAgICAgY21wICAgICAgICAgICAgIHJzaSwgICAgICAgIHJjeAotICAgICAgICBqbmUgICAgICAgICAgICAgeDh4OHNhZF93bXRfbG9vcAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTcKLXg4eDhzYWRfd210X2Vhcmx5X2V4aXQ6Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIHBvcCAgICAgICAgIHJieAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotO3Vuc2lnbmVkIGludCB2cDhfc2FkNHg0X3dtdCgKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUpCi1nbG9iYWwgc3ltKHZwOF9zYWQ0eDRfd210KQotc3ltKHZwOF9zYWQ0eDRfd210KToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTAsICAgICAgICBEV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbcmRpXQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3JzaStyYXhdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3JkaStyZHhdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMCwgICAgICAgIG1tMgotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0xLCAgICAgICAgbW0zCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYXgqMl0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNCwgICAgICAgIERXT1JEIFBUUiBbcnNpXQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTUsICAgICAgICBEV09SRCBQVFIgW3JkaV0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNiwgICAgICAgIERXT1JEIFBUUiBbcnNpK3JheF0KLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW03LCAgICAgICAgRFdPUkQgUFRSIFtyZGkrcmR4XQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW00LCAgICAgICAgbW02Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNSwgICAgICAgIG1tNwotICAgICAgICBwc2FkYncgICAgICAgICAgbW00LCAgICAgICAgbW01Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tNAotICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW0wCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt1bnNpZ25lZCBpbnQgdnA4X3NhZDE2eDhfd210KAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSkKLWdsb2JhbCBzeW0odnA4X3NhZDE2eDhfd210KQotc3ltKHZwOF9zYWQxNng4X3dtdCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1Ci0gICAgcHVzaCAgICAgICAgcmJ4Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmJ4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICBbcnNpK3JieCo4XQotICAgICAgICBweG9yICAgICAgICAgICAgbW03LCAgICAgICAgbW03Ci0KLXgxNng4c2FkX3dtdF9sb29wOgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICByYXgsICAgICAgICBtbTcKLSAgICAgICAgY21wICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZyg0KQotICAgICAgICBqZyAgICAgICAgICAgICAgeDE2eDhzYWRfd210X2Vhcmx5X2V4aXQKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgUVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBRV09SRCBQVFIgW3JzaSs4XQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICBRV09SRCBQVFIgW3JkaV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgIFFXT1JEIFBUUiBbcnNpK3JieF0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFFXT1JEIFBUUiBbcmRpK3JkeF0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTMKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFtyc2krcmJ4KzhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBRV09SRCBQVFIgW3JkaStyZHgrOF0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW00LCAgICAgICAgbW01Ci0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgICBtbTMKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgW3JzaStyYngqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgIFtyZGkrcmR4KjJdCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMCwgICAgICAgIG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgbW00LCAgICAgICAgbW0xCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMAotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW00Ci0KLSAgICAgICAgY21wICAgICAgICAgICAgIHJzaSwgICAgICAgIHJjeAotICAgICAgICBqbmUgICAgICAgICAgICAgeDE2eDhzYWRfd210X2xvb3AKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgcmF4LCAgICAgICAgbW03Ci0KLXgxNng4c2FkX3dtdF9lYXJseV9leGl0OgotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBwb3AgICAgICAgICByYngKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvc2FkX3NzZTMuYXNtIGIvdnA4L2VuY29kZXIveDg2L3NhZF9zc2UzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzMzZhYi4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvc2FkX3NzZTMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsODkwICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLSVtYWNybyBTVEFDS19GUkFNRV9DUkVBVEVfWDMgMAotJWlmIEFCSV9JU18zMkJJVAotICAlZGVmaW5lICAgICBzcmNfcHRyICAgICAgIHJzaQotICAlZGVmaW5lICAgICBzcmNfc3RyaWRlICAgIHJheAotICAlZGVmaW5lICAgICByZWZfcHRyICAgICAgIHJkaQotICAlZGVmaW5lICAgICByZWZfc3RyaWRlICAgIHJkeAotICAlZGVmaW5lICAgICBlbmRfcHRyICAgICAgIHJjeAotICAlZGVmaW5lICAgICByZXRfdmFyICAgICAgIHJieAotICAlZGVmaW5lICAgICByZXN1bHRfcHRyICAgIGFyZyg0KQotICAlZGVmaW5lICAgICBtYXhfZXJyICAgICAgIGFyZyg0KQotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgICAgICAgIHJzcAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIHB1c2ggICAgICAgIHJieAotCi0gICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7IHNyY19wdHIKLSAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgICAgICAgICAgICAgIDsgcmVmX3B0cgotCi0gICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICA7IHNyY19zdHJpZGUKLSAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgIDsgcmVmX3N0cmlkZQotJWVsc2UKLSAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAotICAgICVkZWZpbmUgICAgIHNyY19wdHIgICAgIHJjeAotICAgICVkZWZpbmUgICAgIHNyY19zdHJpZGUgIHJkeAotICAgICVkZWZpbmUgICAgIHJlZl9wdHIgICAgIHI4Ci0gICAgJWRlZmluZSAgICAgcmVmX3N0cmlkZSAgcjkKLSAgICAlZGVmaW5lICAgICBlbmRfcHRyICAgICByMTAKLSAgICAlZGVmaW5lICAgICByZXRfdmFyICAgICByMTEKLSAgICAlZGVmaW5lICAgICByZXN1bHRfcHRyICBbcnNwKzgrNCo4XQotICAgICVkZWZpbmUgICAgIG1heF9lcnIgICAgIFtyc3ArOCs0KjhdCi0gICVlbHNlCi0gICAgJWRlZmluZSAgICAgc3JjX3B0ciAgICAgcmRpCi0gICAgJWRlZmluZSAgICAgc3JjX3N0cmlkZSAgcnNpCi0gICAgJWRlZmluZSAgICAgcmVmX3B0ciAgICAgcmR4Ci0gICAgJWRlZmluZSAgICAgcmVmX3N0cmlkZSAgcmN4Ci0gICAgJWRlZmluZSAgICAgZW5kX3B0ciAgICAgcjkKLSAgICAlZGVmaW5lICAgICByZXRfdmFyICAgICByMTAKLSAgICAlZGVmaW5lICAgICByZXN1bHRfcHRyICByOAotICAgICVkZWZpbmUgICAgIG1heF9lcnIgICAgIHI4Ci0gICVlbmRpZgotJWVuZGlmCi0KLSVlbmRtYWNybwotCi0lbWFjcm8gU1RBQ0tfRlJBTUVfREVTVFJPWV9YMyAwCi0gICVkZWZpbmUgICAgIHNyY19wdHIKLSAgJWRlZmluZSAgICAgc3JjX3N0cmlkZQotICAlZGVmaW5lICAgICByZWZfcHRyCi0gICVkZWZpbmUgICAgIHJlZl9zdHJpZGUKLSAgJWRlZmluZSAgICAgZW5kX3B0cgotICAlZGVmaW5lICAgICByZXRfdmFyCi0gICVkZWZpbmUgICAgIHJlc3VsdF9wdHIKLSAgJWRlZmluZSAgICAgbWF4X2VycgotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgcG9wICAgICAgICAgcmJ4Ci0gICAgcG9wICAgICAgICAgcmRpCi0gICAgcG9wICAgICAgICAgcnNpCi0gICAgcG9wICAgICAgICAgcmJwCi0lZWxzZQotICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0Ci0gICVlbmRpZgotJWVuZGlmCi0gICAgcmV0Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFNUQUNLX0ZSQU1FX0NSRUFURV9YNCAwCi0laWYgQUJJX0lTXzMyQklUCi0gICVkZWZpbmUgICAgIHNyY19wdHIgICAgICAgcnNpCi0gICVkZWZpbmUgICAgIHNyY19zdHJpZGUgICAgcmF4Ci0gICVkZWZpbmUgICAgIHIwX3B0ciAgICAgICAgcmN4Ci0gICVkZWZpbmUgICAgIHIxX3B0ciAgICAgICAgcmR4Ci0gICVkZWZpbmUgICAgIHIyX3B0ciAgICAgICAgcmJ4Ci0gICVkZWZpbmUgICAgIHIzX3B0ciAgICAgICAgcmRpCi0gICVkZWZpbmUgICAgIHJlZl9zdHJpZGUgICAgcmJwCi0gICVkZWZpbmUgICAgIHJlc3VsdF9wdHIgICAgYXJnKDQpCi0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCAgICAgICAgcnNwCi0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgcHVzaCAgICAgICAgcmJ4Ci0KLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByZGksICAgICAgICBhcmcoMikgICAgICAgICAgICAgIDsgcmVmX3B0cl9iYXNlCi0KLSAgICBMT0FEX1g0X0FERFJFU1NFUyByZGksIHJjeCwgcmR4LCByYXgsIHJkaQotCi0gICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7IHNyY19wdHIKLQotICAgIG1vdnN4ZCAgICAgIHJieCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgOyBzcmNfc3RyaWRlCi0gICAgbW92c3hkICAgICAgcmJwLCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7IHJlZl9zdHJpZGUKLQotICAgIHhjaGcgICAgICAgIHJieCwgICAgICAgIHJheAotJWVsc2UKLSAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAotICAgICVkZWZpbmUgICAgIHNyY19wdHIgICAgIHJjeAotICAgICVkZWZpbmUgICAgIHNyY19zdHJpZGUgIHJkeAotICAgICVkZWZpbmUgICAgIHIwX3B0ciAgICAgIHJzaQotICAgICVkZWZpbmUgICAgIHIxX3B0ciAgICAgIHIxMAotICAgICVkZWZpbmUgICAgIHIyX3B0ciAgICAgIHIxMQotICAgICVkZWZpbmUgICAgIHIzX3B0ciAgICAgIHI4Ci0gICAgJWRlZmluZSAgICAgcmVmX3N0cmlkZSAgcjkKLSAgICAlZGVmaW5lICAgICByZXN1bHRfcHRyICBbcnNwKzE2KzQqOF0KLSAgICBwdXNoICAgICAgICByc2kKLQotICAgIExPQURfWDRfQUREUkVTU0VTIHI4LCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIKLSAgJWVsc2UKLSAgICAlZGVmaW5lICAgICBzcmNfcHRyICAgICByZGkKLSAgICAlZGVmaW5lICAgICBzcmNfc3RyaWRlICByc2kKLSAgICAlZGVmaW5lICAgICByMF9wdHIgICAgICByOQotICAgICVkZWZpbmUgICAgIHIxX3B0ciAgICAgIHIxMAotICAgICVkZWZpbmUgICAgIHIyX3B0ciAgICAgIHIxMQotICAgICVkZWZpbmUgICAgIHIzX3B0ciAgICAgIHJkeAotICAgICVkZWZpbmUgICAgIHJlZl9zdHJpZGUgIHJjeAotICAgICVkZWZpbmUgICAgIHJlc3VsdF9wdHIgIHI4Ci0KLSAgICBMT0FEX1g0X0FERFJFU1NFUyByZHgsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0cgotCi0gICVlbmRpZgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDQgMAotICAlZGVmaW5lICAgICBzcmNfcHRyCi0gICVkZWZpbmUgICAgIHNyY19zdHJpZGUKLSAgJWRlZmluZSAgICAgcjBfcHRyCi0gICVkZWZpbmUgICAgIHIxX3B0cgotICAlZGVmaW5lICAgICByMl9wdHIKLSAgJWRlZmluZSAgICAgcjNfcHRyCi0gICVkZWZpbmUgICAgIHJlZl9zdHJpZGUKLSAgJWRlZmluZSAgICAgcmVzdWx0X3B0cgotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgcG9wICAgICAgICAgcmJ4Ci0gICAgcG9wICAgICAgICAgcmRpCi0gICAgcG9wICAgICAgICAgcnNpCi0gICAgcG9wICAgICAgICAgcmJwCi0lZWxzZQotICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18seDY0Ci0gICAgcG9wICAgICAgICAgcnNpCi0gICVlbmRpZgotJWVuZGlmCi0gICAgcmV0Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfMTZYMlgzIDUKLSVpZiAlMT09MAotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgWyUyXQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNSwgICAgICAgWE1NV09SRCBQVFIgWyUzXQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgWyUzKzFdCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbJTMrMl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNiwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNywgICAgICAgeG1tMAotJWVsc2UKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFslMl0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFslM10KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFslMysxXQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgWyUzKzJdCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTEsICAgICAgIHhtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTIsICAgICAgIHhtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTMsICAgICAgIHhtbTAKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgeG1tMwotJWVuZGlmCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbJTIrJTRdCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbJTMrJTVdCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbJTMrJTUrMV0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFslMyslNSsyXQotCi0laWYgJTE9PTAgfHwgJTE9PTEKLSAgICAgICAgbGVhICAgICAgICAgICAgICUyLCAgICAgICAgIFslMislNCoyXQotICAgICAgICBsZWEgICAgICAgICAgICAgJTMsICAgICAgICAgWyUzKyU1KjJdCi0lZW5kaWYKLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0zCi0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfOFgyWDMgNQotJWlmICUxPT0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgIFFXT1JEIFBUUiBbJTJdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgIFFXT1JEIFBUUiBbJTNdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgIFFXT1JEIFBUUiBbJTMrMV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNywgICAgICAgUVdPUkQgUFRSIFslMysyXQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTUsICAgICAgIG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgbW02LCAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNywgICAgICAgbW0wCi0lZWxzZQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICBRV09SRCBQVFIgWyUyXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICBRV09SRCBQVFIgWyUzXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICBRV09SRCBQVFIgWyUzKzFdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgIFFXT1JEIFBUUiBbJTMrMl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0xLCAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMiwgICAgICAgbW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTMsICAgICAgIG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTUsICAgICAgIG1tMQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICBtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgbW0zCi0lZW5kaWYKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMCwgICAgICAgUVdPUkQgUFRSIFslMislNF0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgUVdPUkQgUFRSIFslMyslNV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgUVdPUkQgUFRSIFslMyslNSsxXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICBRV09SRCBQVFIgWyUzKyU1KzJdCi0KLSVpZiAlMT09MCB8fCAlMT09MQotICAgICAgICBsZWEgICAgICAgICAgICAgJTIsICAgICAgICBbJTIrJTQqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgICUzLCAgICAgICAgWyUzKyU1KjJdCi0lZW5kaWYKLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0xLCAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMiwgICAgICAgbW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTMsICAgICAgIG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTUsICAgICAgIG1tMQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICBtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgbW0zCi0lZW5kbWFjcm8KLQotJW1hY3JvIExPQURfWDRfQUREUkVTU0VTIDUKLSAgICAgICAgbW92ICAgICAgICAgICAgICUyLCAgICAgICAgIFslMStSRUdfU1pfQllURVMqMF0KLSAgICAgICAgbW92ICAgICAgICAgICAgICUzLCAgICAgICAgIFslMStSRUdfU1pfQllURVMqMV0KLQotICAgICAgICBtb3YgICAgICAgICAgICAgJTQsICAgICAgICAgWyUxK1JFR19TWl9CWVRFUyoyXQotICAgICAgICBtb3YgICAgICAgICAgICAgJTUsICAgICAgICAgWyUxK1JFR19TWl9CWVRFUyozXQotJWVuZG1hY3JvCi0KLSVtYWNybyBQUk9DRVNTXzE2WDJYNCA4Ci0laWYgJTE9PTAKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFslMl0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFslM10KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFslNF0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTYsICAgICAgIFhNTVdPUkQgUFRSIFslNV0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTcsICAgICAgIFhNTVdPUkQgUFRSIFslNl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNCwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNSwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNiwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tNywgICAgICAgeG1tMAotJWVsc2UKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFslMl0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFslM10KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTIsICAgICAgIFhNTVdPUkQgUFRSIFslNF0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFslNV0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW00LCAgICAgICB4bW0xCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbJTZdCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0yCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0zCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTEsICAgICAgIHhtbTAKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTEKLSVlbmRpZgotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgWyUyKyU3XQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgWyUzKyU4XQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgWyU0KyU4XQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgWyU1KyU4XQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0xLCAgICAgICB4bW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0yLCAgICAgICB4bW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0zLCAgICAgICB4bW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTQsICAgICAgIHhtbTEKLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFslNislOF0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTMKLQotJWlmICUxPT0wIHx8ICUxPT0xCi0gICAgICAgIGxlYSAgICAgICAgICAgICAlMiwgICAgICAgICBbJTIrJTcqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgICUzLCAgICAgICAgIFslMyslOCoyXQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICAlNCwgICAgICAgICBbJTQrJTgqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgICU1LCAgICAgICAgIFslNSslOCoyXQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICAlNiwgICAgICAgICBbJTYrJTgqMl0KLSVlbmRpZgotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgeG1tMQotCi0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfOFgyWDQgOAotJWlmICUxPT0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgWyUyXQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgUVdPUkQgUFRSIFslM10KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgIFFXT1JEIFBUUiBbJTRdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICBRV09SRCBQVFIgWyU1XQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW03LCAgICAgICAgUVdPUkQgUFRSIFslNl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW00LCAgICAgICAgbW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTUsICAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNiwgICAgICAgIG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgbW03LCAgICAgICAgbW0wCi0lZWxzZQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0wLCAgICAgICAgUVdPUkQgUFRSIFslMl0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbJTNdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTIsICAgICAgICBRV09SRCBQVFIgWyU0XQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0zLCAgICAgICAgUVdPUkQgUFRSIFslNV0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0xLCAgICAgICAgbW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMywgICAgICAgIG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgIFFXT1JEIFBUUiBbJTZdCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTUsICAgICAgICBtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNiwgICAgICAgIG1tMwotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgICBtbTAKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tMQotJWVuZGlmCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgWyUyKyU3XQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFslMyslOF0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgIFFXT1JEIFBUUiBbJTQrJThdCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICBRV09SRCBQVFIgWyU1KyU4XQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMiwgICAgICAgIG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgbW0zLCAgICAgICAgbW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNCwgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0xLCAgICAgICAgUVdPUkQgUFRSIFslNislOF0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNSwgICAgICAgIG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgbW02LCAgICAgICAgbW0zCi0KLSVpZiAlMT09MCB8fCAlMT09MQotICAgICAgICBsZWEgICAgICAgICAgICAgJTIsICAgICAgICAgWyUyKyU3KjJdCi0gICAgICAgIGxlYSAgICAgICAgICAgICAlMywgICAgICAgICBbJTMrJTgqMl0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgJTQsICAgICAgICAgWyU0KyU4KjJdCi0gICAgICAgIGxlYSAgICAgICAgICAgICAlNSwgICAgICAgICBbJTUrJTgqMl0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgJTYsICAgICAgICAgWyU2KyU4KjJdCi0lZW5kaWYKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tMSwgICAgICAgIG1tMAotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW0xCi0KLSVlbmRtYWNybwotCi07dm9pZCBpbnQgdnA4X3NhZDE2eDE2eDNfc3NlMygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgKnJlc3VsdHMpCi1nbG9iYWwgc3ltKHZwOF9zYWQxNngxNngzX3NzZTMpCi1zeW0odnA4X3NhZDE2eDE2eDNfc3NlMyk6Ci0KLSAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDMKLQotICAgICAgICBQUk9DRVNTXzE2WDJYMyAwLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDIsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgcmVzdWx0X3B0cgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW01Ci0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW01LCAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3hdLCAgICAgIHhtbTAKLTstCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW02Ci0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW02LCAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grNF0sICAgIHhtbTAKLTstCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grOF0sICAgIHhtbTAKLQotICAgIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDMKLQotO3ZvaWQgaW50IHZwOF9zYWQxNng4eDNfc3NlMygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgKnJlc3VsdHMpCi1nbG9iYWwgc3ltKHZwOF9zYWQxNng4eDNfc3NlMykKLXN5bSh2cDhfc2FkMTZ4OHgzX3NzZTMpOgotCi0gICAgU1RBQ0tfRlJBTUVfQ1JFQVRFX1gzCi0KLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMCwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMiwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTUsICAgICAgIDgKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeF0sICAgICAgeG1tMAotOy0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTYsICAgICAgIDgKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeCs0XSwgICAgeG1tMAotOy0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgIDgKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNwotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeCs4XSwgICAgeG1tMAotCi0gICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YMwotCi07dm9pZCBpbnQgdnA4X3NhZDh4MTZ4M19zc2UzKAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSwKLTsgICAgaW50ICAqcmVzdWx0cykKLWdsb2JhbCBzeW0odnA4X3NhZDh4MTZ4M19zc2UzKQotc3ltKHZwOF9zYWQ4eDE2eDNfc3NlMyk6Ci0KLSAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDMKLQotICAgICAgICBQUk9DRVNTXzhYMlgzIDAsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU184WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzhYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU184WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDMgMSwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzhYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU184WDJYMyAyLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIHJlc3VsdF9wdHIKLQotICAgICAgICBwdW5wY2tsZHEgICAgICAgbW01LCAgICAgICAgbW02Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIFtyY3hdLCAgICAgIG1tNQotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JjeCs4XSwgICAgbW03Ci0KLSAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1gzCi0KLTt2b2lkIGludCB2cDhfc2FkOHg4eDNfc3NlMygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgKnJlc3VsdHMpCi1nbG9iYWwgc3ltKHZwOF9zYWQ4eDh4M19zc2UzKQotc3ltKHZwOF9zYWQ4eDh4M19zc2UzKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YMwotCi0gICAgICAgIFBST0NFU1NfOFgyWDMgMCwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzhYMlgzIDEsIHNyY19wdHIsIHJlZl9wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU184WDJYMyAxLCBzcmNfcHRyLCByZWZfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDMgMiwgc3JjX3B0ciwgcmVmX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCi0KLSAgICAgICAgcHVucGNrbGRxICAgICAgIG1tNSwgICAgICAgIG1tNgotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBbcmN4XSwgICAgICBtbTUKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grOF0sICAgIG1tNwotCi0gICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YMwotCi07dm9pZCBpbnQgdnA4X3NhZDR4NHgzX3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlLAotOyAgICBpbnQgICpyZXN1bHRzKQotZ2xvYmFsIHN5bSh2cDhfc2FkNHg0eDNfc3NlMykKLXN5bSh2cDhfc2FkNHg0eDNfc3NlMyk6Ci0KLSAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDMKLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0wLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyXQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0xLCAgICAgICAgRFdPUkQgUFRSIFtyZWZfcHRyXQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHIrc3JjX3N0cmlkZV0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlXQotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMSwgICAgICAgIG1tMwotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTQsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrMV0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNSwgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cisyXQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrcmVmX3N0cmlkZSsxXQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgRFdPUkQgUFRSIFtyZWZfcHRyK3JlZl9zdHJpZGUrMl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0xLCAgICAgICAgbW0wCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNCwgICAgICAgIG1tMgotICAgICAgICBwdW5wY2tsYncgICAgICAgbW01LCAgICAgICAgbW0zCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNCwgICAgICAgIG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgbW01LCAgICAgICAgbW0wCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHNyY19wdHIsICAgIFtzcmNfcHRyK3NyY19zdHJpZGUqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJlZl9wdHIsICAgIFtyZWZfcHRyK3JlZl9zdHJpZGUqMl0KLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0wLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyXQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyZWZfcHRyXQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHIrc3JjX3N0cmlkZV0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNiwgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlXQotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTMKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMiwgICAgICAgIG1tNgotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrMV0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNywgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cisyXQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTIsICAgICAgICBtbTAKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgbW0yCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlKzFdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTYsICAgICAgICBEV09SRCBQVFIgW3JlZl9wdHIrcmVmX3N0cmlkZSsyXQotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTMsICAgICAgICBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNywgICAgICAgIG1tNgotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNywgICAgICAgIG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTMsICAgICAgICBtbTQKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNywgICAgICAgIG1tNQotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCi0KLSAgICAgICAgcHVucGNrbGRxICAgICAgIG1tMSwgICAgICAgIG1tMwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBbcmN4XSwgICAgICBtbTEKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyY3grOF0sICAgIG1tNwotCi0gICAgU1RBQ0tfRlJBTUVfREVTVFJPWV9YMwotCi07dW5zaWduZWQgaW50IHZwOF9zYWQxNngxNl9zc2UzKAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSwKLTsgICAgaW50ICBtYXhfZXJyKQotOyVkZWZpbmUgbGRkcXUgbW92ZHF1Ci1nbG9iYWwgc3ltKHZwOF9zYWQxNngxNl9zc2UzKQotc3ltKHZwOF9zYWQxNngxNl9zc2UzKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YMwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICBlbmRfcHRyLCAgICA0Ci0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgeG1tNwotCi0udnA4X3NhZDE2eDE2X3NzZTNfbG9vcDoKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtzcmNfcHRyXQotICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMSwgICAgICAgWE1NV09SRCBQVFIgW3JlZl9wdHJdCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbc3JjX3B0citzcmNfc3RyaWRlXQotICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMywgICAgICAgWE1NV09SRCBQVFIgW3JlZl9wdHIrcmVmX3N0cmlkZV0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgc3JjX3B0ciwgICAgW3NyY19wdHIrc3JjX3N0cmlkZSoyXQotICAgICAgICBsZWEgICAgICAgICAgICAgcmVmX3B0ciwgICAgW3JlZl9wdHIrcmVmX3N0cmlkZSoyXQotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICBYTU1XT1JEIFBUUiBbc3JjX3B0cl0KLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsICAgICAgIFhNTVdPUkQgUFRSIFtyZWZfcHRyXQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgW3NyY19wdHIrc3JjX3N0cmlkZV0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMCwgICAgICAgeG1tMQotCi0gICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICBYTU1XT1JEIFBUUiBbcmVmX3B0cityZWZfc3RyaWRlXQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0yLCAgICAgICB4bW0zCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW00LCAgICAgICB4bW01Ci0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW02LCAgICAgICB4bW0xCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHNyY19wdHIsICAgIFtzcmNfcHRyK3NyY19zdHJpZGUqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJlZl9wdHIsICAgIFtyZWZfcHRyK3JlZl9zdHJpZGUqMl0KLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgIHhtbTAKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgICB4bW0yCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICAgeG1tNAotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgIHhtbTYKLQotICAgICAgICBzdWIgICAgICAgICAgICAgZW5kX3B0ciwgICAgIDEKLSAgICAgICAgam5lICAgICAgICAgICAgIC52cDhfc2FkMTZ4MTZfc3NlM19sb29wCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgIDgKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKLSAgICAgICAgbW92cSAgICAgICAgICAgIHJheCwgICAgICAgIHhtbTAKLQotICAgIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDMKLQotO3ZvaWQgdnA4X3NhZDE2eDE2eDRkX3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cl9iYXNlLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgKnJlc3VsdHMpCi1nbG9iYWwgc3ltKHZwOF9zYWQxNngxNng0ZF9zc2UzKQotc3ltKHZwOF9zYWQxNngxNng0ZF9zc2UzKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAotCi0gICAgICAgIFBST0NFU1NfMTZYMlg0IDAsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYNCAxLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU18xNlgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYNCAxLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU18xNlgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYNCAyLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBwb3AgICAgICAgICAgICAgcmJwCi0lZW5kaWYKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIHJlc3VsdF9wdHIKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNAotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNCwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW00Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4XSwgICAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNSwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW01Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzRdLCAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW02Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzhdLCAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNwotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzEyXSwgICB4bW0wCi0KLSAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1g0Ci0KLTt2b2lkIHZwOF9zYWQxNng4eDRkX3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0cl9iYXNlLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgKnJlc3VsdHMpCi1nbG9iYWwgc3ltKHZwOF9zYWQxNng4eDRkX3NzZTMpCi1zeW0odnA4X3NhZDE2eDh4NGRfc3NlMyk6Ci0KLSAgICBTVEFDS19GUkFNRV9DUkVBVEVfWDQKLQotICAgICAgICBQUk9DRVNTXzE2WDJYNCAwLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLSAgICAgICAgUFJPQ0VTU18xNlgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfMTZYMlg0IDEsIHNyY19wdHIsIHIwX3B0ciwgcjFfcHRyLCByMl9wdHIsIHIzX3B0ciwgc3JjX3N0cmlkZSwgcmVmX3N0cmlkZQotICAgICAgICBQUk9DRVNTXzE2WDJYNCAyLCBzcmNfcHRyLCByMF9wdHIsIHIxX3B0ciwgcjJfcHRyLCByM19wdHIsIHNyY19zdHJpZGUsIHJlZl9zdHJpZGUKLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBwb3AgICAgICAgICAgICAgcmJwCi0lZW5kaWYKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIHJlc3VsdF9wdHIKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNAotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNCwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW00Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4XSwgICAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNSwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW01Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzRdLCAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW02Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzhdLCAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNwotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmN4KzEyXSwgICB4bW0wCi0KLSAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1g0Ci0KLTt2b2lkIGludCB2cDhfc2FkOHgxNng0ZF9zc2UzKAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSwKLTsgICAgaW50ICAqcmVzdWx0cykKLWdsb2JhbCBzeW0odnA4X3NhZDh4MTZ4NGRfc3NlMykKLXN5bSh2cDhfc2FkOHgxNng0ZF9zc2UzKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAotCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMCwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMiwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgcG9wICAgICAgICAgICAgIHJicAotJWVuZGlmCi0gICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCi0KLSAgICAgICAgcHVucGNrbGRxICAgICAgIG1tNCwgICAgICAgIG1tNQotICAgICAgICBwdW5wY2tsZHEgICAgICAgbW02LCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIFtyY3hdLCAgICAgIG1tNAotICAgICAgICBtb3ZxICAgICAgICAgICAgW3JjeCs4XSwgICAgbW02Ci0KLSAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1g0Ci0KLTt2b2lkIGludCB2cDhfc2FkOHg4eDRkX3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlLAotOyAgICBpbnQgICpyZXN1bHRzKQotZ2xvYmFsIHN5bSh2cDhfc2FkOHg4eDRkX3NzZTMpCi1zeW0odnA4X3NhZDh4OHg0ZF9zc2UzKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAotCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMCwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMSwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0gICAgICAgIFBST0NFU1NfOFgyWDQgMiwgc3JjX3B0ciwgcjBfcHRyLCByMV9wdHIsIHIyX3B0ciwgcjNfcHRyLCBzcmNfc3RyaWRlLCByZWZfc3RyaWRlCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgcG9wICAgICAgICAgICAgIHJicAotJWVuZGlmCi0gICAgICAgIG1vdiAgICAgICAgICAgICByY3gsICAgICAgICByZXN1bHRfcHRyCi0KLSAgICAgICAgcHVucGNrbGRxICAgICAgIG1tNCwgICAgICAgIG1tNQotICAgICAgICBwdW5wY2tsZHEgICAgICAgbW02LCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIFtyY3hdLCAgICAgIG1tNAotICAgICAgICBtb3ZxICAgICAgICAgICAgW3JjeCs4XSwgICAgbW02Ci0KLSAgICBTVEFDS19GUkFNRV9ERVNUUk9ZX1g0Ci0KLTt2b2lkIGludCB2cDhfc2FkNHg0eDRkX3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlLAotOyAgICBpbnQgICpyZXN1bHRzKQotZ2xvYmFsIHN5bSh2cDhfc2FkNHg0eDRkX3NzZTMpCi1zeW0odnA4X3NhZDR4NHg0ZF9zc2UzKToKLQotICAgIFNUQUNLX0ZSQU1FX0NSRUFURV9YNAotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTAsICAgICAgICBEV09SRCBQVFIgW3NyY19wdHJdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3IwX3B0cl0KLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyK3NyY19zdHJpZGVdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICBEV09SRCBQVFIgW3IwX3B0cityZWZfc3RyaWRlXQotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTAsICAgICAgICBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMSwgICAgICAgIG1tMwotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTQsICAgICAgICBEV09SRCBQVFIgW3IxX3B0cl0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tNSwgICAgICAgIERXT1JEIFBUUiBbcjJfcHRyXQotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTYsICAgICAgICBEV09SRCBQVFIgW3IzX3B0cl0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcjFfcHRyK3JlZl9zdHJpZGVdCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbcjJfcHRyK3JlZl9zdHJpZGVdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTcsICAgICAgICBEV09SRCBQVFIgW3IzX3B0cityZWZfc3RyaWRlXQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTEsICAgICAgICBtbTAKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW00LCAgICAgICAgbW0yCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTUsICAgICAgICBtbTMKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW02LCAgICAgICAgbW03Ci0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTQsICAgICAgICBtbTAKLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW01LCAgICAgICAgbW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTYsICAgICAgICBtbTAKLQotCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHNyY19wdHIsICAgIFtzcmNfcHRyK3NyY19zdHJpZGUqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHIwX3B0ciwgICAgIFtyMF9wdHIrcmVmX3N0cmlkZSoyXQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByMV9wdHIsICAgICBbcjFfcHRyK3JlZl9zdHJpZGUqMl0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHIyX3B0ciwgICAgIFtyMl9wdHIrcmVmX3N0cmlkZSoyXQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByM19wdHIsICAgICBbcjNfcHRyK3JlZl9zdHJpZGUqMl0KLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0wLCAgICAgICAgRFdPUkQgUFRSIFtzcmNfcHRyXQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0yLCAgICAgICAgRFdPUkQgUFRSIFtyMF9wdHJdCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMywgICAgICAgIERXT1JEIFBUUiBbc3JjX3B0citzcmNfc3RyaWRlXQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW03LCAgICAgICAgRFdPUkQgUFRSIFtyMF9wdHIrcmVmX3N0cmlkZV0KLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0wLCAgICAgICAgbW0zCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTIsICAgICAgICBtbTcKLQotICAgICAgICBtb3ZkICAgICAgICAgICAgbW0zLCAgICAgICAgRFdPUkQgUFRSIFtyMV9wdHJdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTcsICAgICAgICBEV09SRCBQVFIgW3IyX3B0cl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgbW0yLCAgICAgICAgbW0wCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICAgICAgICByYnAKLQotICAgICAgICBwb3AgICAgICAgICAgICAgcmJwCi0lZGVmaW5lICAgICByZWZfc3RyaWRlICAgIHJheAotJWVuZGlmCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICByZXN1bHRfcHRyCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgIG1tMgotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JzaV0sICAgICAgbW0xCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMiwgICAgICAgIERXT1JEIFBUUiBbcjFfcHRyK3JlZl9zdHJpZGVdCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTEsICAgICAgICBEV09SRCBQVFIgW3IyX3B0cityZWZfc3RyaWRlXQotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTMsICAgICAgICBtbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tNywgICAgICAgIG1tMQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIG1tNywgICAgICAgIG1tMAotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTIsICAgICAgICBEV09SRCBQVFIgW3IzX3B0cl0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIG1tMSwgICAgICAgIERXT1JEIFBUUiBbcjNfcHRyK3JlZl9zdHJpZGVdCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMywgICAgICAgIG1tNAotICAgICAgICBwYWRkdyAgICAgICAgICAgbW03LCAgICAgICAgbW01Ci0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyc2krNF0sICAgIG1tMwotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0yLCAgICAgICAgbW0xCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyc2krOF0sICAgIG1tNwotICAgICAgICBwc2FkYncgICAgICAgICAgbW0yLCAgICAgICAgbW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMiwgICAgICAgIG1tNgotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JzaSsxMl0sICAgbW0yCi0KLQotICAgIFNUQUNLX0ZSQU1FX0RFU1RST1lfWDQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3g4Ni9zYWRfc3NlNC5hc20gYi92cDgvZW5jb2Rlci94ODYvc2FkX3NzZTQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VjZWM0Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni9zYWRfc3NlNC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi0lbWFjcm8gUFJPQ0VTU18xNlgyWDggMQotJWlmICUxCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrMTZdCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0xLCAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0zLCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIHhtbTEKLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTEsICAgICAgIHhtbTAsICAweDAKLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTIsICAgICAgIHhtbTAsICAweDUKLQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tMCwgICAgICAgOAotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICB4bW0zCi0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW0zLCAgICAgICB4bW0wLCAgMHgwCi0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW00LCAgICAgICB4bW0wLCAgMHg1Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTQKLSVlbHNlCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrMTZdCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW01LCAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0zLCAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIHhtbTUKLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTUsICAgICAgIHhtbTAsICAweDAKLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTIsICAgICAgIHhtbTAsICAweDUKLQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tMCwgICAgICAgOAotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICB4bW0zCi0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW0zLCAgICAgICB4bW0wLCAgMHgwCi0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW00LCAgICAgICB4bW0wLCAgMHg1Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTMKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTQKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgeG1tNQotJWVuZGlmCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmF4XQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrIHJkeCs4XQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHgrMTZdCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW01LCAgICAgICB4bW0zCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0zLCAgICAgICB4bW0yCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCi0gICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICB4bW01Ci0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW01LCAgICAgICB4bW0wLCAgMHgwCi0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW0yLCAgICAgICB4bW0wLCAgMHg1Ci0KLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTAsICAgICAgIDgKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTQsICAgICAgIHhtbTMKLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTMsICAgICAgIHhtbTAsICAweDAKLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTQsICAgICAgIHhtbTAsICAweDUKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMwotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tNAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW01Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfOFgyWDggMQotJWlmICUxCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICBNTVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICBNTVdPUkQgUFRSIFtyZGldCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrOF0KLSAgICAgICAgcHVucGNrbHFkcSAgICAgIHhtbTEsICAgICAgIHhtbTMKLQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwgICAgICAgeG1tMQotICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tMSwgICAgICAgeG1tMCwgIDB4MAotICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tMiwgICAgICAgeG1tMCwgIDB4NQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgeG1tMgotJWVsc2UKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTAsICAgICAgIE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgIE1NV09SRCBQVFIgW3JkaV0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgIE1NV09SRCBQVFIgW3JkaSs4XQotICAgICAgICBwdW5wY2tscWRxICAgICAgeG1tNSwgICAgICAgeG1tMwotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICB4bW01Ci0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW01LCAgICAgICB4bW0wLCAgMHgwCi0gICAgICAgIG1wc2FkYncgICAgICAgICB4bW0yLCAgICAgICB4bW0wLCAgMHg1Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgIHhtbTUKLSVlbmRpZgotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgTU1XT1JEIFBUUiBbcnNpICsgcmF4XQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrIHJkeCs4XQotICAgICAgICBwdW5wY2tscWRxICAgICAgeG1tNSwgICAgICAgeG1tMwotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KLQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwgICAgICAgeG1tNQotICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tNSwgICAgICAgeG1tMCwgIDB4MAotICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tMiwgICAgICAgeG1tMCwgIDB4NQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMgotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW01Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfNFgyWDggMQotJWlmICUxCi0gICAgICAgIG1vdmQgICAgICAgICAgICB4bW0wLCAgICAgICBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW0xLCAgICAgICB4bW0zCi0KLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTEsICAgICAgIHhtbTAsICAweDAKLSVlbHNlCi0gICAgICAgIG1vdmQgICAgICAgICAgICB4bW0wLCAgICAgICBbcnNpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpXQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgTU1XT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIHB1bnBja2xxZHEgICAgICB4bW01LCAgICAgICB4bW0zCi0KLSAgICAgICAgbXBzYWRidyAgICAgICAgIHhtbTUsICAgICAgIHhtbTAsICAweDAKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgeG1tNQotJWVuZGlmCi0gICAgICAgIG1vdmQgICAgICAgICAgICB4bW0wLCAgICAgICBbcnNpICsgcmF4XQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgTU1XT1JEIFBUUiBbcmRpKyByZHhdCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICBNTVdPUkQgUFRSIFtyZGkrIHJkeCs4XQotICAgICAgICBwdW5wY2tscWRxICAgICAgeG1tNSwgICAgICAgeG1tMwotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KLQotICAgICAgICBtcHNhZGJ3ICAgICAgICAgeG1tNSwgICAgICAgeG1tMCwgIDB4MAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICB4bW01Ci0lZW5kbWFjcm8KLQotCi07dm9pZCB2cDhfc2FkMTZ4MTZ4OF9zc2U0KAotOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheSk7Ci1nbG9iYWwgc3ltKHZwOF9zYWQxNngxNng4X3NzZTQpCi1zeW0odnA4X3NhZDE2eDE2eDhfc3NlNCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSAgICAgICAgICAgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIFBST0NFU1NfMTZYMlg4IDEKLSAgICAgICAgUFJPQ0VTU18xNlgyWDggMAotICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCi0gICAgICAgIFBST0NFU1NfMTZYMlg4IDAKLSAgICAgICAgUFJPQ0VTU18xNlgyWDggMAotICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCi0gICAgICAgIFBST0NFU1NfMTZYMlg4IDAKLSAgICAgICAgUFJPQ0VTU18xNlgyWDggMAotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgICAgICAgICAgIDtSZXN1bHRzCi0gICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgeG1tMQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X3NhZDE2eDh4OF9zc2U0KAotOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheQotOyk7Ci1nbG9iYWwgc3ltKHZwOF9zYWQxNng4eDhfc3NlNCkKLXN5bSh2cDhfc2FkMTZ4OHg4X3NzZTQpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgICAgICAgICAgIDtyZWZfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKLQotICAgICAgICBQUk9DRVNTXzE2WDJYOCAxCi0gICAgICAgIFBST0NFU1NfMTZYMlg4IDAKLSAgICAgICAgUFJPQ0VTU18xNlgyWDggMAotICAgICAgICBQUk9DRVNTXzE2WDJYOCAwCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgO1Jlc3VsdHMKLSAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGldLCAgICB4bW0xCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfc2FkOHg4eDhfc3NlNCgKLTsgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIHVuc2lnbmVkIHNob3J0ICpzYWRfYXJyYXkKLTspOwotZ2xvYmFsIHN5bSh2cDhfc2FkOHg4eDhfc3NlNCkKLXN5bSh2cDhfc2FkOHg4eDhfc3NlNCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgIGFyZygwKSAgICAgICAgICAgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSAgICAgICAgICAgO3JlZl9wdHIKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIFBST0NFU1NfOFgyWDggMQotICAgICAgICBQUk9DRVNTXzhYMlg4IDAKLSAgICAgICAgUFJPQ0VTU184WDJYOCAwCi0gICAgICAgIFBST0NFU1NfOFgyWDggMAotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgICAgICAgICAgIDtSZXN1bHRzCi0gICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgeG1tMQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X3NhZDh4MTZ4OF9zc2U0KAotOyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgIHNyY19zdHJpZGUsCi07ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCAgcmVmX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgc2hvcnQgKnNhZF9hcnJheQotOyk7Ci1nbG9iYWwgc3ltKHZwOF9zYWQ4eDE2eDhfc3NlNCkKLXN5bSh2cDhfc2FkOHgxNng4X3NzZTQpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgICAgICAgICAgIDtyZWZfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKLQotICAgICAgICBQUk9DRVNTXzhYMlg4IDEKLSAgICAgICAgUFJPQ0VTU184WDJYOCAwCi0gICAgICAgIFBST0NFU1NfOFgyWDggMAotICAgICAgICBQUk9DRVNTXzhYMlg4IDAKLSAgICAgICAgUFJPQ0VTU184WDJYOCAwCi0gICAgICAgIFBST0NFU1NfOFgyWDggMAotICAgICAgICBQUk9DRVNTXzhYMlg4IDAKLSAgICAgICAgUFJPQ0VTU184WDJYOCAwCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgICAgICAgICAgIDtSZXN1bHRzCi0gICAgICAgIG1vdmRxYSAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICAgeG1tMQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X3NhZDR4NHg4X2MoCi07ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBzaG9ydCAqc2FkX2FycmF5Ci07KTsKLWdsb2JhbCBzeW0odnA4X3NhZDR4NHg4X3NzZTQpCi1zeW0odnA4X3NhZDR4NHg4X3NzZTQpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgICAgICAgICAgIDtyZWZfcHRyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3NyY19zdHJpZGUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3JlZl9zdHJpZGUKLQotICAgICAgICBQUk9DRVNTXzRYMlg4IDEKLSAgICAgICAgUFJPQ0VTU180WDJYOCAwCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSAgICAgICAgICAgO1Jlc3VsdHMKLSAgICAgICAgbW92ZHFhICAgICAgICAgIFhNTVdPUkQgUFRSIFtyZGldLCAgICB4bW0xCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3NhZF9zc3NlMy5hc20gYi92cDgvZW5jb2Rlci94ODYvc2FkX3Nzc2UzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljNWVhZS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvc2FkX3Nzc2UzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20iCi0KLSVtYWNybyBQUk9DRVNTXzE2WDJYMyAxCi0laWYgJTEKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW01LCAgICAgICBYTU1XT1JEIFBUUiBbcmRpXQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNiwgICAgICAgWE1NV09SRCBQVFIgW3JkaSsxXQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tNywgICAgICAgWE1NV09SRCBQVFIgW3JkaSsyXQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW01LCAgICAgICB4bW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW02LCAgICAgICB4bW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW03LCAgICAgICB4bW0wCi0lZWxzZQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyZGldCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0yLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpKzFdCi0gICAgICAgIGxkZHF1ICAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpKzJdCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTEsICAgICAgIHhtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTIsICAgICAgIHhtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTMsICAgICAgIHhtbTAKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNSwgICAgICAgeG1tMQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNywgICAgICAgeG1tMwotJWVuZGlmCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpK3JheF0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTEsICAgICAgIFhNTVdPUkQgUFRSIFtyZGkrcmR4XQotICAgICAgICBsZGRxdSAgICAgICAgICAgeG1tMiwgICAgICAgWE1NV09SRCBQVFIgW3JkaStyZHgrMV0KLSAgICAgICAgbGRkcXUgICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZGkrcmR4KzJdCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgIFtyc2krcmF4KjJdCi0gICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICBbcmRpK3JkeCoyXQotCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0xLCAgICAgICB4bW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0yLCAgICAgICB4bW0wCi0gICAgICAgIHBzYWRidyAgICAgICAgICB4bW0zLCAgICAgICB4bW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTUsICAgICAgIHhtbTEKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgIHhtbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTcsICAgICAgIHhtbTMKLSVlbmRtYWNybwotCi0lbWFjcm8gUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDIKLSVpZiAlMQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTQsICAgICAgIFhNTVdPUkQgUFRSIFtyZGldCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW03LCAgICAgICBYTU1XT1JEIFBUUiBbcmRpKzE2XQotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICB4bW03Ci0gICAgICAgIHBhbGlnbnIgICAgICAgICB4bW01LCAgICAgICB4bW00LCAgICAgICAlMgotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW02LCAgICAgICB4bW03Ci0gICAgICAgIHBhbGlnbnIgICAgICAgICB4bW02LCAgICAgICB4bW00LCAgICAgICAoJTIrMSkKLQotICAgICAgICBwYWxpZ25yICAgICAgICAgeG1tNywgICAgICAgeG1tNCwgICAgICAgKCUyKzIpCi0KLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTUsICAgICAgIHhtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTYsICAgICAgIHhtbTAKLSAgICAgICAgcHNhZGJ3ICAgICAgICAgIHhtbTcsICAgICAgIHhtbTAKLSVlbHNlCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkaV0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTMsICAgICAgIFhNTVdPUkQgUFRSIFtyZGkrMTZdCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsICAgICAgIHhtbTMKLSAgICAgICAgcGFsaWduciAgICAgICAgIHhtbTEsICAgICAgIHhtbTQsICAgICAgICUyCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgIHhtbTMKLSAgICAgICAgcGFsaWduciAgICAgICAgIHhtbTIsICAgICAgIHhtbTQsICAgICAgICglMisxKQotCi0gICAgICAgIHBhbGlnbnIgICAgICAgICB4bW0zLCAgICAgICB4bW00LCAgICAgICAoJTIrMikKLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0zCi0lZW5kaWYKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTAsICAgICAgIFhNTVdPUkQgUFRSIFtyc2krcmF4XQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgWE1NV09SRCBQVFIgW3JkaStyZHhdCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCAgICAgICBYTU1XT1JEIFBUUiBbcmRpK3JkeCsxNl0KLQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMSwgICAgICAgeG1tMwotICAgICAgICBwYWxpZ25yICAgICAgICAgeG1tMSwgICAgICAgeG1tNCwgICAgICAgJTIKLQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMiwgICAgICAgeG1tMwotICAgICAgICBwYWxpZ25yICAgICAgICAgeG1tMiwgICAgICAgeG1tNCwgICAgICAgKCUyKzEpCi0KLSAgICAgICAgcGFsaWduciAgICAgICAgIHhtbTMsICAgICAgIHhtbTQsICAgICAgICglMisyKQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICBbcnNpK3JheCoyXQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgW3JkaStyZHgqMl0KLQotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMSwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMiwgICAgICAgeG1tMAotICAgICAgICBwc2FkYncgICAgICAgICAgeG1tMywgICAgICAgeG1tMAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW01LCAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICB4bW0yCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW03LCAgICAgICB4bW0zCi0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMgotJTJfYWxpZ25lZF9ieV8lMToKLQotICAgICAgICBzdWIgICAgICAgICAgICAgcmRpLCAgICAgICAgJTEKLQotICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMSwgJTEKLSAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCi0gICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAwLCAlMQotICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMCwgJTEKLSAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCi0gICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAwLCAlMQotICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMCwgJTEKLSAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCi0KLSAgICAgICAgam1wICAgICAgICAgICAgICUyX3N0b3JlX29mZgotCi0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0NFU1NfMTZYOFgzX09GRlNFVCAyCi0lMl9hbGlnbmVkX2J5XyUxOgotCi0gICAgICAgIHN1YiAgICAgICAgICAgICByZGksICAgICAgICAlMQotCi0gICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAxLCAlMQotICAgICAgICBQUk9DRVNTXzE2WDJYM19PRkZTRVQgMCwgJTEKLSAgICAgICAgUFJPQ0VTU18xNlgyWDNfT0ZGU0VUIDAsICUxCi0gICAgICAgIFBST0NFU1NfMTZYMlgzX09GRlNFVCAwLCAlMQotCi0gICAgICAgIGptcCAgICAgICAgICAgICAlMl9zdG9yZV9vZmYKLQotJWVuZG1hY3JvCi0KLTt2b2lkIGludCB2cDhfc2FkMTZ4MTZ4M19zc3NlMygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlZl9zdHJpZGUsCi07ICAgIGludCAgKnJlc3VsdHMpCi1nbG9iYWwgc3ltKHZwOF9zYWQxNngxNngzX3Nzc2UzKQotc3ltKHZwOF9zYWQxNngxNngzX3Nzc2UzKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICBwdXNoICAgICAgICByY3gKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3JlZl9wdHIKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmR4LCAgICAgICAgMHhmCi0gICAgICAgIGFuZCAgICAgICAgICAgICByZHgsICAgICAgICByZGkKLQotICAgICAgICBqbXAgdnA4X3NhZDE2eDE2eDNfc3NzZTNfc2tpcHRhYmxlCi12cDhfc2FkMTZ4MTZ4M19zc3NlM19qdW1wdGFibGU6Ci0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMCAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMSAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMiAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMyAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfNCAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfNSAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfNiAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfNyAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfOCAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfOSAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTAgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTEgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTIgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTMgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTQgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTUgLSB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi12cDhfc2FkMTZ4MTZ4M19zc3NlM19za2lwdGFibGU6Ci0KLSAgICAgICAgY2FsbCB2cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wCi12cDhfc2FkMTZ4MTZ4M19zc3NlM19kb19qdW1wOgotICAgICAgICBwb3AgICAgICAgICAgICAgcmN4ICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ2V0IHRoZSBhZGRyZXNzIG9mIGRvX2p1bXAKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgIHZwOF9zYWQxNngxNngzX3Nzc2UzX2p1bXB0YWJsZSAtIHZwOF9zYWQxNngxNngzX3Nzc2UzX2RvX2p1bXAKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJheCwgIHJjeCAgOyBnZXQgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdnA4X3NhZDE2eDE2eDNfc3NzZTNfanVtcHRhYmxlCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgIGR3b3JkIFtyYXggKyA0KnJkeF0gICA7IGdldCB0aGUgMzIgYml0IG9mZnNldCBmcm9tIHRoZSBqdW1wdGFibGUKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJjeCwgICAgICAgIHJheAotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtzcmNfc3RyaWRlCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtyZWZfc3RyaWRlCi0KLSAgICAgICAgam1wICAgICAgICAgICAgIHJjeAotCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMCwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMSwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMiwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMywgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgNCwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgNSwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgNiwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgNywgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgOCwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgOSwgIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMTAsIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMTEsIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMTIsIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMTMsIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYMTZYM19PRkZTRVQgMTQsIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0KLXZwOF9zYWQxNngxNngzX3Nzc2UzX2FsaWduZWRfYnlfMTU6Ci0gICAgICAgIFBST0NFU1NfMTZYMlgzIDEKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAotICAgICAgICBQUk9DRVNTXzE2WDJYMyAwCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDAKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAotICAgICAgICBQUk9DRVNTXzE2WDJYMyAwCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDAKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAotCi12cDhfc2FkMTZ4MTZ4M19zc3NlM19zdG9yZV9vZmY6Ci0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoNCkgO1Jlc3VsdHMKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNSwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW01Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpXSwgICAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNgotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW02Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpKzRdLCAgICB4bW0wCi07LQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMCwgICAgICAgeG1tNwotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgOAotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBbcmRpKzhdLCAgICB4bW0wCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCAgICAgICAgIHJjeAotICAgIHBvcCAgICAgICAgIHJkaQotICAgIHBvcCAgICAgICAgIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotO3ZvaWQgaW50IHZwOF9zYWQxNng4eDNfc3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCAgc3JjX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50ICByZWZfc3RyaWRlLAotOyAgICBpbnQgICpyZXN1bHRzKQotZ2xvYmFsIHN5bSh2cDhfc2FkMTZ4OHgzX3Nzc2UzKQotc3ltKHZwOF9zYWQxNng4eDNfc3NzZTMpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIHB1c2ggICAgICAgIHJjeAotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3NyY19wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZygyKSA7cmVmX3B0cgotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZHgsICAgICAgICAweGYKLSAgICAgICAgYW5kICAgICAgICAgICAgIHJkeCwgICAgICAgIHJkaQotCi0gICAgICAgIGptcCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX3NraXB0YWJsZQotdnA4X3NhZDE2eDh4M19zc3NlM19qdW1wdGFibGU6Ci0gICAgICAgIGRkIHZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV8wICAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotICAgICAgICBkZCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMSAgLSB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKLSAgICAgICAgZGQgdnA4X3NhZDE2eDh4M19zc3NlM19hbGlnbmVkX2J5XzIgIC0gdnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV8zICAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotICAgICAgICBkZCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfNCAgLSB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKLSAgICAgICAgZGQgdnA4X3NhZDE2eDh4M19zc3NlM19hbGlnbmVkX2J5XzUgIC0gdnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV82ICAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotICAgICAgICBkZCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfNyAgLSB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKLSAgICAgICAgZGQgdnA4X3NhZDE2eDh4M19zc3NlM19hbGlnbmVkX2J5XzggIC0gdnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV85ICAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotICAgICAgICBkZCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTAgLSB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKLSAgICAgICAgZGQgdnA4X3NhZDE2eDh4M19zc3NlM19hbGlnbmVkX2J5XzExIC0gdnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV8xMiAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotICAgICAgICBkZCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTMgLSB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKLSAgICAgICAgZGQgdnA4X3NhZDE2eDh4M19zc3NlM19hbGlnbmVkX2J5XzE0IC0gdnA4X3NhZDE2eDh4M19zc3NlM19kb19qdW1wCi0gICAgICAgIGRkIHZwOF9zYWQxNng4eDNfc3NzZTNfYWxpZ25lZF9ieV8xNSAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotdnA4X3NhZDE2eDh4M19zc3NlM19za2lwdGFibGU6Ci0KLSAgICAgICAgY2FsbCB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2RvX2p1bXAKLXZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcDoKLSAgICAgICAgcG9wICAgICAgICAgICAgIHJjeCAgICAgICAgICAgICAgICAgICAgICAgICA7IGdldCB0aGUgYWRkcmVzcyBvZiBkb19qdW1wCi0gICAgICAgIG1vdiAgICAgICAgICAgICByYXgsICB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2p1bXB0YWJsZSAtIHZwOF9zYWQxNng4eDNfc3NzZTNfZG9fanVtcAotICAgICAgICBhZGQgICAgICAgICAgICAgcmF4LCAgcmN4ICA7IGdldCB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB2cDhfc2FkMTZ4OHgzX3Nzc2UzX2p1bXB0YWJsZQotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICBkd29yZCBbcmF4ICsgNCpyZHhdICAgOyBnZXQgdGhlIDMyIGJpdCBvZmZzZXQgZnJvbSB0aGUganVtcHRhYmxlCi0gICAgICAgIGFkZCAgICAgICAgICAgICByY3gsICAgICAgICByYXgKLQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7c3JjX3N0cmlkZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7cmVmX3N0cmlkZQotCi0gICAgICAgIGptcCAgICAgICAgICAgICByY3gKLQotICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgMCwgIHZwOF9zYWQxNng4eDNfc3NzZTMKLSAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDEsICB2cDhfc2FkMTZ4OHgzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCAyLCAgdnA4X3NhZDE2eDh4M19zc3NlMwotICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgMywgIHZwOF9zYWQxNng4eDNfc3NzZTMKLSAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDQsICB2cDhfc2FkMTZ4OHgzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCA1LCAgdnA4X3NhZDE2eDh4M19zc3NlMwotICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgNiwgIHZwOF9zYWQxNng4eDNfc3NzZTMKLSAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDcsICB2cDhfc2FkMTZ4OHgzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCA4LCAgdnA4X3NhZDE2eDh4M19zc3NlMwotICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgOSwgIHZwOF9zYWQxNng4eDNfc3NzZTMKLSAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDEwLCB2cDhfc2FkMTZ4OHgzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCAxMSwgdnA4X3NhZDE2eDh4M19zc3NlMwotICAgICAgICBQUk9DRVNTXzE2WDhYM19PRkZTRVQgMTIsIHZwOF9zYWQxNng4eDNfc3NzZTMKLSAgICAgICAgUFJPQ0VTU18xNlg4WDNfT0ZGU0VUIDEzLCB2cDhfc2FkMTZ4OHgzX3Nzc2UzCi0gICAgICAgIFBST0NFU1NfMTZYOFgzX09GRlNFVCAxNCwgdnA4X3NhZDE2eDh4M19zc3NlMwotCi12cDhfc2FkMTZ4OHgzX3Nzc2UzX2FsaWduZWRfYnlfMTU6Ci0KLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMQotICAgICAgICBQUk9DRVNTXzE2WDJYMyAwCi0gICAgICAgIFBST0NFU1NfMTZYMlgzIDAKLSAgICAgICAgUFJPQ0VTU18xNlgyWDMgMAotCi12cDhfc2FkMTZ4OHgzX3Nzc2UzX3N0b3JlX29mZjoKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgIGFyZyg0KSA7UmVzdWx0cwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW01Ci0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW01LCAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTUKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgIHhtbTAKLTstCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW02Ci0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW02LCAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTYKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGkrNF0sICAgIHhtbTAKLTstCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0wLCAgICAgICB4bW03Ci0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW03LCAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgIHhtbTcKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGkrOF0sICAgIHhtbTAKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgcG9wICAgICAgICAgcmN4Ci0gICAgcG9wICAgICAgICAgcmRpCi0gICAgcG9wICAgICAgICAgcnNpCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldApkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3NzaW1fb3B0LmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni9zc2ltX29wdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjdjZGIuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIveDg2L3NzaW1fb3B0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi07IHRhYnVsYXRlX3NzaW0gLSBzdW1zIHN1bV9zLHN1bV9yLHN1bV9zcV9zLHN1bV9zcV9yLCBzdW1fc3hyCi0lbWFjcm8gVEFCVUxBVEVfU1NJTSAwCi0gICAgICAgIHBhZGR1c3cgICAgICAgICB4bW0xNSwgeG1tMyAgOyBzdW1fcwotICAgICAgICBwYWRkdXN3ICAgICAgICAgeG1tMTQsIHhtbTQgIDsgc3VtX3IKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsIHhtbTMKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsIHhtbTEKLSAgICAgICAgcGFkZHEgICAgICAgICAgIHhtbTEzLCB4bW0xIDsgc3VtX3NxX3MKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsIHhtbTQKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTIsIHhtbTIKLSAgICAgICAgcGFkZHEgICAgICAgICAgIHhtbTEyLCB4bW0yIDsgc3VtX3NxX3IKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTMsIHhtbTQKLSAgICAgICAgcGFkZHEgICAgICAgICAgIHhtbTExLCB4bW0zICA7IHN1bV9zeHIKLSVlbmRtYWNybwotCi07IFN1bSBhY3Jvc3MgdGhlIHJlZ2lzdGVyICUxIHN0YXJ0aW5nIHdpdGggcSB3b3JkcwotJW1hY3JvIFNVTV9BQ1JPU1NfUSAxCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCUxCi0gICAgICAgIHB1bnBja2xkcSAgICAgICAlMSx4bW0wCi0gICAgICAgIHB1bnBja2hkcSAgICAgICB4bW0yLHhtbTAKLSAgICAgICAgcGFkZHEgICAgICAgICAgICUxLHhtbTIKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsJTEKLSAgICAgICAgcHVucGNrbHFkcSAgICAgICUxLHhtbTAKLSAgICAgICAgcHVucGNraHFkcSAgICAgIHhtbTIseG1tMAotICAgICAgICBwYWRkcSAgICAgICAgICAgJTEseG1tMgotJWVuZG1hY3JvCi0KLTsgU3VtIGFjcm9zcyB0aGUgcmVnaXN0ZXIgJTEgc3RhcnRpbmcgd2l0aCBxIHdvcmRzCi0lbWFjcm8gU1VNX0FDUk9TU19XIDEKLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsICUxCi0gICAgICAgIHB1bnBja2x3ZCAgICAgICAlMSx4bW0wCi0gICAgICAgIHB1bnBja2h3ZCAgICAgICB4bW0xLHhtbTAKLSAgICAgICAgcGFkZGQgICAgICAgICAgICUxLCB4bW0xCi0gICAgICAgIFNVTV9BQ1JPU1NfUSAgICAlMQotJWVuZG1hY3JvCi07dm9pZCBzc2ltX3Bhcm1zX3NzZTMoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnMsCi07ICAgIGludCBzcCwKLTsgICAgdW5zaWduZWQgY2hhciAqciwKLTsgICAgaW50IHJwCi07ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zLAotOyAgICB1bnNpZ25lZCBsb25nICpzdW1fciwKLTsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3MsCi07ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zcV9yLAotOyAgICB1bnNpZ25lZCBsb25nICpzdW1fc3hyKTsKLTsKLTsgVE9ETzogVXNlIHBhcm0gcGFzc2luZyB0aHJvdWdoIHN0cnVjdHVyZSwgcHJvYmFibHkgZG9uJ3QgbmVlZCB0aGUgcHhvcnMKLTsgKCBjYWxsaW5nIGFwcCB3aWxsIGluaXRpYWxpemUgdG8gMCApIGNvdWxkIGVhc2lseSBmaXQgZXZlcnl0aGluZyBpbiBzc2UyCi07IHdpdGhvdXQgdG9vIG11Y2ggaGFzdGxlLCBhbmQgY2FuIHByb2JhYmx5IGRvIGJldHRlciBlc3RpbWF0ZXMgd2l0aCBwc2FkdwotOyBvciBwYXZnYiBBdCB0aGlzIHBvaW50IHRoaXMgaXMganVzdCBtZWFudCB0byBiZSBmaXJzdCBwYXNzIGZvciBjYWxjdWxhdGluZwotOyBhbGwgdGhlIHBhcm1zIG5lZWRlZCBmb3IgMTZ4MTYgc3NpbSBzbyB3ZSBjYW4gcGxheSB3aXRoIGRzc2ltIGFzIGRpc3RvcnRpb24KLTsgaW4gbW9kZSBzZWxlY3Rpb24gY29kZS4KLWdsb2JhbCBzeW0odnA4X3NzaW1fcGFybXNfMTZ4MTZfc3NlMykKLXN5bSh2cDhfc3NpbV9wYXJtc18xNngxNl9zc2UzKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDkKLSAgICBwdXNoICAgICAgICByc2kKLSAgICBwdXNoICAgICAgICByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICBhcmcoMCkgO3MKLSAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgYXJnKDEpIDtzcAotICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICBhcmcoMikgO3IKLSAgICBtb3YgICAgICAgICAgICAgcmF4LCAgICAgICAgYXJnKDMpIDtycAotCi0gICAgcHhvciAgICAgICAgICAgIHhtbTAsIHhtbTAKLSAgICBweG9yICAgICAgICAgICAgeG1tMTUseG1tMTUgIDtzdW1fcwotICAgIHB4b3IgICAgICAgICAgICB4bW0xNCx4bW0xNCAgO3N1bV9yCi0gICAgcHhvciAgICAgICAgICAgIHhtbTEzLHhtbTEzICA7c3VtX3NxX3MKLSAgICBweG9yICAgICAgICAgICAgeG1tMTIseG1tMTIgIDtzdW1fc3FfcgotICAgIHB4b3IgICAgICAgICAgICB4bW0xMSx4bW0xMSAgO3N1bV9zeHIKLQotICAgIG1vdiAgICAgICAgICAgICByZHgsIDE2ICAgICAgO3JvdyBjb3VudGVyCi1OZXh0Um93OgotCi0gICAgO2dyYWIgc291cmNlIGFuZCByZWZlcmVuY2UgcGl4ZWxzCi0gICAgbW92ZHF1ICAgICAgICAgIHhtbTUsIFtyc2ldCi0gICAgbW92ZHF1ICAgICAgICAgIHhtbTYsIFtyZGldCi0gICAgbW92ZHFhICAgICAgICAgIHhtbTMsIHhtbTUKLSAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgeG1tNgotICAgIHB1bnBja2hidyAgICAgICB4bW0zLCB4bW0wIDsgaGlnaF9zCi0gICAgcHVucGNraGJ3ICAgICAgIHhtbTQsIHhtbTAgOyBoaWdoX3IKLQotICAgIFRBQlVMQVRFX1NTSU0KLQotICAgIG1vdmRxYSAgICAgICAgICB4bW0zLCB4bW01Ci0gICAgbW92ZHFhICAgICAgICAgIHhtbTQsIHhtbTYKLSAgICBwdW5wY2tsYncgICAgICAgeG1tMywgeG1tMCA7IGxvd19zCi0gICAgcHVucGNrbGJ3ICAgICAgIHhtbTQsIHhtbTAgOyBsb3dfcgotCi0gICAgVEFCVUxBVEVfU1NJTQotCi0gICAgYWRkICAgICAgICAgICAgIHJzaSwgcmN4ICAgOyBuZXh0IHMgcm93Ci0gICAgYWRkICAgICAgICAgICAgIHJkaSwgcmF4ICAgOyBuZXh0IHIgcm93Ci0KLSAgICBkZWMgICAgICAgICAgICAgcmR4ICAgICAgICA7IGNvdW50ZXIKLSAgICBqbnogTmV4dFJvdwotCi0gICAgU1VNX0FDUk9TU19XICAgIHhtbTE1Ci0gICAgU1VNX0FDUk9TU19XICAgIHhtbTE0Ci0gICAgU1VNX0FDUk9TU19RICAgIHhtbTEzCi0gICAgU1VNX0FDUk9TU19RICAgIHhtbTEyCi0gICAgU1VNX0FDUk9TU19RICAgIHhtbTExCi0KLSAgICBtb3YgICAgICAgICAgICAgcmRpLGFyZyg0KQotICAgIG1vdnEgICAgICAgICAgICBbcmRpXSwgeG1tMTU7Ci0gICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoNSkKLSAgICBtb3ZxICAgICAgICAgICAgW3JkaV0sIHhtbTE0OwotICAgIG1vdiAgICAgICAgICAgICByZGksYXJnKDYpCi0gICAgbW92cSAgICAgICAgICAgIFtyZGldLCB4bW0xMzsKLSAgICBtb3YgICAgICAgICAgICAgcmRpLGFyZyg3KQotICAgIG1vdnEgICAgICAgICAgICBbcmRpXSwgeG1tMTI7Ci0gICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoOCkKLSAgICBtb3ZxICAgICAgICAgICAgW3JkaV0sIHhtbTExOwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLTt2b2lkIHNzaW1fcGFybXNfc3NlMygKLTsgICAgdW5zaWduZWQgY2hhciAqcywKLTsgICAgaW50IHNwLAotOyAgICB1bnNpZ25lZCBjaGFyICpyLAotOyAgICBpbnQgcnAKLTsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3MsCi07ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9yLAotOyAgICB1bnNpZ25lZCBsb25nICpzdW1fc3FfcywKLTsgICAgdW5zaWduZWQgbG9uZyAqc3VtX3NxX3IsCi07ICAgIHVuc2lnbmVkIGxvbmcgKnN1bV9zeHIpOwotOwotOyBUT0RPOiBVc2UgcGFybSBwYXNzaW5nIHRocm91Z2ggc3RydWN0dXJlLCBwcm9iYWJseSBkb24ndCBuZWVkIHRoZSBweG9ycwotOyAoIGNhbGxpbmcgYXBwIHdpbGwgaW5pdGlhbGl6ZSB0byAwICkgY291bGQgZWFzaWx5IGZpdCBldmVyeXRoaW5nIGluIHNzZTIKLTsgd2l0aG91dCB0b28gbXVjaCBoYXN0bGUsIGFuZCBjYW4gcHJvYmFibHkgZG8gYmV0dGVyIGVzdGltYXRlcyB3aXRoIHBzYWR3Ci07IG9yIHBhdmdiIEF0IHRoaXMgcG9pbnQgdGhpcyBpcyBqdXN0IG1lYW50IHRvIGJlIGZpcnN0IHBhc3MgZm9yIGNhbGN1bGF0aW5nCi07IGFsbCB0aGUgcGFybXMgbmVlZGVkIGZvciAxNngxNiBzc2ltIHNvIHdlIGNhbiBwbGF5IHdpdGggZHNzaW0gYXMgZGlzdG9ydGlvbgotOyBpbiBtb2RlIHNlbGVjdGlvbiBjb2RlLgotZ2xvYmFsIHN5bSh2cDhfc3NpbV9wYXJtc184eDhfc3NlMykKLXN5bSh2cDhfc3NpbV9wYXJtc184eDhfc3NlMyk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA5Ci0gICAgcHVzaCAgICAgICAgcnNpCi0gICAgcHVzaCAgICAgICAgcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgYXJnKDApIDtzCi0gICAgbW92ICAgICAgICAgICAgIHJjeCwgICAgICAgIGFyZygxKSA7c3AKLSAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgYXJnKDIpIDtyCi0gICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgIGFyZygzKSA7cnAKLQotICAgIHB4b3IgICAgICAgICAgICB4bW0wLCB4bW0wCi0gICAgcHhvciAgICAgICAgICAgIHhtbTE1LHhtbTE1ICA7c3VtX3MKLSAgICBweG9yICAgICAgICAgICAgeG1tMTQseG1tMTQgIDtzdW1fcgotICAgIHB4b3IgICAgICAgICAgICB4bW0xMyx4bW0xMyAgO3N1bV9zcV9zCi0gICAgcHhvciAgICAgICAgICAgIHhtbTEyLHhtbTEyICA7c3VtX3NxX3IKLSAgICBweG9yICAgICAgICAgICAgeG1tMTEseG1tMTEgIDtzdW1fc3hyCi0KLSAgICBtb3YgICAgICAgICAgICAgcmR4LCA4ICAgICAgO3JvdyBjb3VudGVyCi1OZXh0Um93MjoKLQotICAgIDtncmFiIHNvdXJjZSBhbmQgcmVmZXJlbmNlIHBpeGVscwotICAgIG1vdnEgICAgICAgICAgICB4bW01LCBbcnNpXQotICAgIG1vdnEgICAgICAgICAgICB4bW02LCBbcmRpXQotCi0gICAgbW92ZHFhICAgICAgICAgIHhtbTMsIHhtbTUKLSAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgeG1tNgotICAgIHB1bnBja2xidyAgICAgICB4bW0zLCB4bW0wIDsgbG93X3MKLSAgICBwdW5wY2tsYncgICAgICAgeG1tNCwgeG1tMCA7IGxvd19yCi0KLSAgICBUQUJVTEFURV9TU0lNCi0KLSAgICBhZGQgICAgICAgICAgICAgcnNpLCByY3ggICA7IG5leHQgcyByb3cKLSAgICBhZGQgICAgICAgICAgICAgcmRpLCByYXggICA7IG5leHQgciByb3cKLQotICAgIGRlYyAgICAgICAgICAgICByZHggICAgICAgIDsgY291bnRlcgotICAgIGpueiBOZXh0Um93MgotCi0gICAgU1VNX0FDUk9TU19XICAgIHhtbTE1Ci0gICAgU1VNX0FDUk9TU19XICAgIHhtbTE0Ci0gICAgU1VNX0FDUk9TU19RICAgIHhtbTEzCi0gICAgU1VNX0FDUk9TU19RICAgIHhtbTEyCi0gICAgU1VNX0FDUk9TU19RICAgIHhtbTExCi0KLSAgICBtb3YgICAgICAgICAgICAgcmRpLGFyZyg0KQotICAgIG1vdnEgICAgICAgICAgICBbcmRpXSwgeG1tMTU7Ci0gICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoNSkKLSAgICBtb3ZxICAgICAgICAgICAgW3JkaV0sIHhtbTE0OwotICAgIG1vdiAgICAgICAgICAgICByZGksYXJnKDYpCi0gICAgbW92cSAgICAgICAgICAgIFtyZGldLCB4bW0xMzsKLSAgICBtb3YgICAgICAgICAgICAgcmRpLGFyZyg3KQotICAgIG1vdnEgICAgICAgICAgICBbcmRpXSwgeG1tMTI7Ci0gICAgbW92ICAgICAgICAgICAgIHJkaSxhcmcoOCkKLSAgICBtb3ZxICAgICAgICAgICAgW3JkaV0sIHhtbTExOwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgICAgICAgICByZGkKLSAgICBwb3AgICAgICAgICByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvc3VidHJhY3RfbW14LmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni9zdWJ0cmFjdF9tbXguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDdlMWYwLi4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni9zdWJ0cmFjdF9tbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO3ZvaWQgdnA4X3N1YnRyYWN0X2JfbW14X2ltcGwodW5zaWduZWQgY2hhciAqeiwgIGludCBzcmNfc3RyaWRlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqUHJlZGljdG9yLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpOwotZ2xvYmFsIHN5bSh2cDhfc3VidHJhY3RfYl9tbXhfaW1wbCkKLXN5bSh2cDhfc3VidHJhY3RfYl9tbXhfaW1wbCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA1Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgbW92ICAgICByZGksICAgICAgICBhcmcoMikgO2RpZmYKLSAgICAgICAgbW92ICAgICByYXgsICAgICAgICBhcmcoMykgO1ByZWRpY3RvcgotICAgICAgICBtb3YgICAgIHJzaSwgICAgICAgIGFyZygwKSA7egotICAgICAgICBtb3ZzeGQgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSk7c3JjX3N0cmlkZTsKLSAgICAgICAgbW92c3hkICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpO3BpdGNoCi0gICAgICAgIHB4b3IgICAgbW03LCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpXQotICAgICAgICBtb3ZkICAgIG1tMSwgICAgICAgIFtyYXhdCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIG1vdnEgICAgW3JkaV0sICAgICAgbW0wCi0KLQotICAgICAgICBtb3ZkICAgIG1tMCwgICAgICAgIFtyc2krcmR4XQotICAgICAgICBtb3ZkICAgIG1tMSwgICAgICAgIFtyYXgrcmN4XQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgIFtyZGkrcmN4KjJdLG1tMAotCi0KLSAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpK3JkeCoyXQotICAgICAgICBtb3ZkICAgIG1tMSwgICAgICAgIFtyYXgrcmN4KjJdCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIG1vdnEgICAgW3JkaStyY3gqNF0sICAgICAgICBtbTAKLQotICAgICAgICBsZWEgICAgIHJzaSwgICAgICAgIFtyc2krcmR4KjJdCi0gICAgICAgIGxlYSAgICAgcmN4LCAgICAgICAgW3JjeCtyY3gqMl0KLQotCi0KLSAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpK3JkeF0KLSAgICAgICAgbW92ZCAgICBtbTEsICAgICAgICBbcmF4K3JjeF0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICBbcmRpK3JjeCoyXSwgICAgICAgIG1tMAotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotO3ZvaWQgdnA4X3N1YnRyYWN0X21ieV9tbXgoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqcHJlZCwgaW50IHN0cmlkZSkKLWdsb2JhbCBzeW0odnA4X3N1YnRyYWN0X21ieV9tbXgpCi1zeW0odnA4X3N1YnRyYWN0X21ieV9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotCi0gICAgICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDEpIDtzcmMKLSAgICAgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMCkgO2RpZmYKLQotICAgICAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygyKSA7cHJlZAotICAgICAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3N0cmlkZQotCi0gICAgICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAgICAgMTYKLSAgICAgICAgICAgIHB4b3IgICAgICAgIG1tMCwgICAgICAgICAgICBtbTAKLQotc3VibWJ5X2xvb3A6Ci0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpXQotICAgICAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIFtyYXhdCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgICAgICBtbTEKLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgICAgICBtbTMKLQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgICAgIG1tMAotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0zLCAgICAgICAgICAgIG1tMAotCi0gICAgICAgICAgICBwdW5wY2toYncgICBtbTIsICAgICAgICAgICAgbW0wCi0gICAgICAgICAgICBwdW5wY2toYncgICBtbTQsICAgICAgICAgICAgbW0wCi0KLSAgICAgICAgICAgIHBzdWJ3ICAgICAgIG1tMSwgICAgICAgICAgICBtbTMKLSAgICAgICAgICAgIHBzdWJ3ICAgICAgIG1tMiwgICAgICAgICAgICBtbTQKLQotICAgICAgICAgICAgbW92cSAgICAgICAgW3JkaV0sICAgICAgICAgIG1tMQotICAgICAgICAgICAgbW92cSAgICAgICAgW3JkaSs4XSwgICAgICAgIG1tMgotCi0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpKzhdCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgICAgICAgICAgW3JheCs4XQotCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICAgICAgbW0xCi0gICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgICAgICBtbTAKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgICAgICAgICBtbTAKLQotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0yLCAgICAgICAgICAgIG1tMAotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW00LCAgICAgICAgICAgIG1tMAotCi0gICAgICAgICAgICBwc3VidyAgICAgICBtbTEsICAgICAgICAgICAgbW0zCi0gICAgICAgICAgICBwc3VidyAgICAgICBtbTIsICAgICAgICAgICAgbW00Ci0KLSAgICAgICAgICAgIG1vdnEgICAgICAgIFtyZGkrMTZdLCAgICAgICBtbTEKLSAgICAgICAgICAgIG1vdnEgICAgICAgIFtyZGkrMjRdLCAgICAgICBtbTIKLQotCi0gICAgICAgICAgICBhZGQgICAgICAgICByZGksICAgICAgICAgICAgMzIKLSAgICAgICAgICAgIGFkZCAgICAgICAgIHJheCwgICAgICAgICAgICAxNgotCi0gICAgICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaStyZHhdCi0KLSAgICAgICAgICAgIHN1YiAgICAgICAgIHJjeCwgICAgICAgICAgICAxCi0gICAgICAgICAgICBqbnogICAgICAgICBzdWJtYnlfbG9vcAotCi0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfc3VidHJhY3RfbWJ1dl9tbXgoc2hvcnQgKmRpZmYsIHVuc2lnbmVkIGNoYXIgKnVzcmMsIHVuc2lnbmVkIGNoYXIgKnZzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpCi1nbG9iYWwgc3ltKHZwOF9zdWJ0cmFjdF9tYnV2X21teCkKLXN5bSh2cDhfc3VidHJhY3RfbWJ1dl9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgIDtzaG9ydCAqdWRpZmYgPSBkaWZmICsgMjU2OwotICAgIDtzaG9ydCAqdmRpZmYgPSBkaWZmICsgMzIwOwotICAgIDt1bnNpZ25lZCBjaGFyICp1cHJlZCA9IHByZWQgKyAyNTY7Ci0gICAgO3Vuc2lnbmVkIGNoYXIgKnZwcmVkID0gcHJlZCArIDMyMDsKLQotICAgICAgICA7dW5zaWduZWQgY2hhciAgKnogICAgPSB1c3JjOwotICAgICAgICA7dW5zaWduZWQgc2hvcnQgKmRpZmYgPSB1ZGlmZjsKLSAgICAgICAgO3Vuc2lnbmVkIGNoYXIgICpQcmVkaWN0b3I9IHVwcmVkOwotCi0gICAgICAgICAgICBtb3YgICAgIHJkaSwgICAgICAgIGFyZygwKSA7ZGlmZgotICAgICAgICAgICAgbW92ICAgICByYXgsICAgICAgICBhcmcoMykgO3ByZWQKLSAgICAgICAgICAgIG1vdiAgICAgcnNpLCAgICAgICAgYXJnKDEpIDt6ID0gdXNyYwotICAgICAgICAgICAgYWRkICAgICByZGksICAgICAgICAyNTYqMiAgO2RpZmYgPSBkaWZmICsgMjU2IChzaG9ydHMpCi0gICAgICAgICAgICBhZGQgICAgIHJheCwgICAgICAgIDI1NiAgICA7UHJlZGljdG9yID0gcHJlZCArIDI1NgotICAgICAgICAgICAgbW92c3hkICByZHgsICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtzdHJpZGU7Ci0gICAgICAgICAgICBweG9yICAgIG1tNywgICAgICAgIG1tNwotCi0gICAgICAgICAgICBtb3ZxICAgIG1tMCwgICAgICAgIFtyc2ldCi0gICAgICAgICAgICBtb3ZxICAgIG1tMSwgICAgICAgIFtyYXhdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaV0sICAgICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrOF0sICAgIG1tMwotCi0KLSAgICAgICAgICAgIG1vdnEgICAgbW0wLCAgICAgICAgW3JzaStyZHhdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMSwgICAgICAgIFtyYXgrOF0KLSAgICAgICAgICAgIG1vdnEgICAgbW0zLCAgICAgICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIG1tNCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW00LCAgICBtbTcKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgICAgICBwc3VidyAgIG1tMywgICAgICAgIG1tNAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzE2XSwgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSsyNF0sICAgbW0zCi0KLSAgICAgICAgICAgIG1vdnEgICAgbW0wLCAgICAgICAgW3JzaStyZHgqMl0KLSAgICAgICAgICAgIG1vdnEgICAgbW0xLCAgICAgICAgW3JheCsxNl0KLSAgICAgICAgICAgIG1vdnEgICAgbW0zLCAgICAgICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIG1tNCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW00LCAgICBtbTcKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgICAgICBwc3VidyAgIG1tMywgICAgICAgIG1tNAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzMyXSwgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSs0MF0sICAgbW0zCi0gICAgICAgICAgICBsZWEgICAgIHJzaSwgICAgICAgIFtyc2krcmR4KjJdCi0KLQotICAgICAgICAgICAgbW92cSAgICBtbTAsICAgICAgICBbcnNpK3JkeF0KLSAgICAgICAgICAgIG1vdnEgICAgbW0xLCAgICAgICAgW3JheCsyNF0KLSAgICAgICAgICAgIG1vdnEgICAgbW0zLCAgICAgICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIG1tNCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW00LCAgICBtbTcKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgICAgICBwc3VidyAgIG1tMywgICAgICAgIG1tNAotCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrNDhdLCAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzU2XSwgICBtbTMKLQotCi0gICAgICAgICAgICBhZGQgICAgIHJkaSwgICAgICAgIDY0Ci0gICAgICAgICAgICBhZGQgICAgIHJheCwgICAgICAgIDMyCi0gICAgICAgICAgICBsZWEgICAgIHJzaSwgICAgICAgIFtyc2krcmR4KjJdCi0KLQotICAgICAgICAgICAgbW92cSAgICBtbTAsICAgICAgICBbcnNpXQotICAgICAgICAgICAgbW92cSAgICBtbTEsICAgICAgICBbcmF4XQotICAgICAgICAgICAgbW92cSAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgbW00LCAgICAgICAgbW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tNwotICAgICAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgICAgICBtb3ZxICAgIFtyZGldLCAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzhdLCAgICBtbTMKLQotCi0gICAgICAgICAgICBtb3ZxICAgIG1tMCwgICAgICAgIFtyc2krcmR4XQotICAgICAgICAgICAgbW92cSAgICBtbTEsICAgICAgICBbcmF4KzhdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSsxNl0sICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrMjRdLCAgIG1tMwotCi0gICAgICAgICAgICBtb3ZxICAgIG1tMCwgICAgICAgIFtyc2krcmR4KjJdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMSwgICAgICAgIFtyYXgrMTZdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSszMl0sICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrNDBdLCAgIG1tMwotICAgICAgICAgICAgbGVhICAgICByc2ksICAgICAgICBbcnNpK3JkeCoyXQotCi0KLSAgICAgICAgICAgIG1vdnEgICAgbW0wLCAgICAgICAgW3JzaStyZHhdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMSwgICAgICAgIFtyYXgrMjRdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLQotICAgICAgICAgICAgbW92cSAgICBbcmRpKzQ4XSwgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSs1Nl0sICAgbW0zCi0KLSAgICAgICAgO3Vuc2lnbmVkIGNoYXIgICp6ICAgID0gdnNyYzsKLSAgICAgICAgO3Vuc2lnbmVkIHNob3J0ICpkaWZmID0gdmRpZmY7Ci0gICAgICAgIDt1bnNpZ25lZCBjaGFyICAqUHJlZGljdG9yPSB2cHJlZDsKLQotICAgICAgICAgICAgbW92ICAgICByZGksICAgICAgICBhcmcoMCkgO2RpZmYKLSAgICAgICAgICAgIG1vdiAgICAgcmF4LCAgICAgICAgYXJnKDMpIDtwcmVkCi0gICAgICAgICAgICBtb3YgICAgIHJzaSwgICAgICAgIGFyZygyKSA7eiA9IHVzcmMKLSAgICAgICAgICAgIGFkZCAgICAgcmRpLCAgICAgICAgMzIwKjIgIDtkaWZmID0gZGlmZiArIDMyMCAoc2hvcnRzKQotICAgICAgICAgICAgYWRkICAgICByYXgsICAgICAgICAzMjAgICAgO1ByZWRpY3RvciA9IHByZWQgKyAzMjAKLSAgICAgICAgICAgIG1vdnN4ZCAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7c3RyaWRlOwotICAgICAgICAgICAgcHhvciAgICBtbTcsICAgICAgICBtbTcKLQotICAgICAgICAgICAgbW92cSAgICBtbTAsICAgICAgICBbcnNpXQotICAgICAgICAgICAgbW92cSAgICBtbTEsICAgICAgICBbcmF4XQotICAgICAgICAgICAgbW92cSAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgbW00LCAgICAgICAgbW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tNwotICAgICAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgICAgICBtb3ZxICAgIFtyZGldLCAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzhdLCAgICBtbTMKLQotCi0gICAgICAgICAgICBtb3ZxICAgIG1tMCwgICAgICAgIFtyc2krcmR4XQotICAgICAgICAgICAgbW92cSAgICBtbTEsICAgICAgICBbcmF4KzhdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSsxNl0sICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrMjRdLCAgIG1tMwotCi0gICAgICAgICAgICBtb3ZxICAgIG1tMCwgICAgICAgIFtyc2krcmR4KjJdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMSwgICAgICAgIFtyYXgrMTZdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSszMl0sICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrNDBdLCAgIG1tMwotICAgICAgICAgICAgbGVhICAgICByc2ksICAgICAgICBbcnNpK3JkeCoyXQotCi0KLSAgICAgICAgICAgIG1vdnEgICAgbW0wLCAgICAgICAgW3JzaStyZHhdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMSwgICAgICAgIFtyYXgrMjRdCi0gICAgICAgICAgICBtb3ZxICAgIG1tMywgICAgICAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBtbTQsICAgICAgICBtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW03Ci0gICAgICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHN1YncgICBtbTMsICAgICAgICBtbTQKLQotICAgICAgICAgICAgbW92cSAgICBbcmRpKzQ4XSwgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSs1Nl0sICAgbW0zCi0KLQotICAgICAgICAgICAgYWRkICAgICByZGksICAgICAgICA2NAotICAgICAgICAgICAgYWRkICAgICByYXgsICAgICAgICAzMgotICAgICAgICAgICAgbGVhICAgICByc2ksICAgICAgICBbcnNpK3JkeCoyXQotCi0KLSAgICAgICAgICAgIG1vdnEgICAgbW0wLCAgICAgICAgW3JzaV0KLSAgICAgICAgICAgIG1vdnEgICAgbW0xLCAgICAgICAgW3JheF0KLSAgICAgICAgICAgIG1vdnEgICAgbW0zLCAgICAgICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIG1tNCwgICAgICAgIG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNwotICAgICAgICAgICAgcHVucGNraGJ3ICAgbW00LCAgICBtbTcKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgICAgICBwc3VidyAgIG1tMywgICAgICAgIG1tNAotICAgICAgICAgICAgbW92cSAgICBbcmRpXSwgICAgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSs4XSwgICAgbW0zCi0KLQotICAgICAgICAgICAgbW92cSAgICBtbTAsICAgICAgICBbcnNpK3JkeF0KLSAgICAgICAgICAgIG1vdnEgICAgbW0xLCAgICAgICAgW3JheCs4XQotICAgICAgICAgICAgbW92cSAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgbW00LCAgICAgICAgbW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tNwotICAgICAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrMTZdLCAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzI0XSwgICBtbTMKLQotICAgICAgICAgICAgbW92cSAgICBtbTAsICAgICAgICBbcnNpK3JkeCoyXQotICAgICAgICAgICAgbW92cSAgICBtbTEsICAgICAgICBbcmF4KzE2XQotICAgICAgICAgICAgbW92cSAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgbW00LCAgICAgICAgbW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tNwotICAgICAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0zLCAgICAgICAgbW00Ci0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrMzJdLCAgIG1tMAotICAgICAgICAgICAgbW92cSAgICBbcmRpKzQwXSwgICBtbTMKLSAgICAgICAgICAgIGxlYSAgICAgcnNpLCAgICAgICAgW3JzaStyZHgqMl0KLQotCi0gICAgICAgICAgICBtb3ZxICAgIG1tMCwgICAgICAgIFtyc2krcmR4XQotICAgICAgICAgICAgbW92cSAgICBtbTEsICAgICAgICBbcmF4KzI0XQotICAgICAgICAgICAgbW92cSAgICBtbTMsICAgICAgICBtbTAKLSAgICAgICAgICAgIG1vdnEgICAgbW00LCAgICAgICAgbW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03Ci0gICAgICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tNwotICAgICAgICAgICAgcHN1YncgICBtbTAsICAgICAgICBtbTEKLSAgICAgICAgICAgIHBzdWJ3ICAgbW0zLCAgICAgICAgbW00Ci0KLSAgICAgICAgICAgIG1vdnEgICAgW3JkaSs0OF0sICAgbW0wCi0gICAgICAgICAgICBtb3ZxICAgIFtyZGkrNTZdLCAgIG1tMwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3g4Ni9zdWJ0cmFjdF9zc2UyLmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni9zdWJ0cmFjdF9zc2UyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMjNkMC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvc3VidHJhY3Rfc3NlMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi07dm9pZCB2cDhfc3VidHJhY3RfYl9zc2UyX2ltcGwodW5zaWduZWQgY2hhciAqeiwgIGludCBzcmNfc3RyaWRlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZGlmZiwgdW5zaWduZWQgY2hhciAqUHJlZGljdG9yLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpOwotZ2xvYmFsIHN5bSh2cDhfc3VidHJhY3RfYl9zc2UyX2ltcGwpCi1zeW0odnA4X3N1YnRyYWN0X2Jfc3NlMl9pbXBsKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDUKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICByZGksICAgICAgICBhcmcoMikgO2RpZmYKLSAgICAgICAgbW92ICAgICByYXgsICAgICAgICBhcmcoMykgO1ByZWRpY3RvcgotICAgICAgICBtb3YgICAgIHJzaSwgICAgICAgIGFyZygwKSA7egotICAgICAgICBtb3ZzeGQgIHJkeCwgICAgICAgIGR3b3JkIHB0ciBhcmcoMSk7c3JjX3N0cmlkZTsKLSAgICAgICAgbW92c3hkICByY3gsICAgICAgICBkd29yZCBwdHIgYXJnKDQpO3BpdGNoCi0gICAgICAgIHB4b3IgICAgbW03LCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICBtbTAsICAgICAgICBbcnNpXQotICAgICAgICBtb3ZkICAgIG1tMSwgICAgICAgIFtyYXhdCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIG1vdnEgICAgTU1XT1JEIFBUUiBbcmRpXSwgICAgICBtbTAKLQotICAgICAgICBtb3ZkICAgIG1tMCwgICAgICAgIFtyc2krcmR4XQotICAgICAgICBtb3ZkICAgIG1tMSwgICAgICAgIFtyYXgrcmN4XQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgIE1NV09SRCBQVFIgW3JkaStyY3gqMl0sIG1tMAotCi0gICAgICAgIG1vdmQgICAgbW0wLCAgICAgICAgW3JzaStyZHgqMl0KLSAgICAgICAgbW92ZCAgICBtbTEsICAgICAgICBbcmF4K3JjeCoyXQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNwotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICBwc3VidyAgIG1tMCwgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgIE1NV09SRCBQVFIgW3JkaStyY3gqNF0sIG1tMAotCi0gICAgICAgIGxlYSAgICAgcnNpLCAgICAgICAgW3JzaStyZHgqMl0KLSAgICAgICAgbGVhICAgICByY3gsICAgICAgICBbcmN4K3JjeCoyXQotCi0gICAgICAgIG1vdmQgICAgbW0wLCAgICAgICAgW3JzaStyZHhdCi0gICAgICAgIG1vdmQgICAgbW0xLCAgICAgICAgW3JheCtyY3hdCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0gICAgICAgIHBzdWJ3ICAgbW0wLCAgICAgICAgbW0xCi0gICAgICAgIG1vdnEgICAgTU1XT1JEIFBUUiBbcmRpK3JjeCoyXSwgbW0wCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3ZvaWQgdnA4X3N1YnRyYWN0X21ieV9zc2UyKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKnByZWQsIGludCBzdHJpZGUpCi1nbG9iYWwgc3ltKHZwOF9zdWJ0cmFjdF9tYnlfc3NlMikKLXN5bSh2cDhfc3VidHJhY3RfbWJ5X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIFNBVkVfWE1NCi0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDEpIDtzcmMKLSAgICAgICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMCkgO2RpZmYKLQotICAgICAgICAgICAgbW92ICAgICAgICAgcmF4LCAgICAgICAgICAgIGFyZygyKSA7cHJlZAotICAgICAgICAgICAgbW92c3hkICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3N0cmlkZQotCi0gICAgICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAgICAgOCAgICAgIDsgZG8gdHdvIGxpbmVzIGF0IG9uZSB0aW1lCi0KLXN1Ym1ieV9sb29wOgotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldICAgOyBzcmMKLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmF4XSAgIDsgcHJlZAotCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICAgICAgcHN1YmIgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICAgICAgcHhvciAgICAgICAgeG1tMSwgICAgICAgICAgIFtHTE9CQUwodDgwKV0gICA7Y29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgICAgICBweG9yICAgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTCh0ODApXQotICAgICAgICAgICAgcGNtcGd0YiAgICAgeG1tMSwgICAgICAgICAgIHhtbTIgICAgICAgICAgICA7IG9idGFpbiBzaWduIGluZm9ybWF0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgIHhtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgIHhtbTAsICAgIHhtbTEgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KLSAgICAgICAgICAgIHB1bnBja2hidyAgIHhtbTIsICAgIHhtbTMgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JkaV0sICAgeG1tMAotICAgICAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JkaSArMTZdLCB4bW0yCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIHhtbTQsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpICsgcmR4XQotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyYXggKyAxNl0KLQotICAgICAgICAgICAgbW92ZHFhICAgICAgeG1tNiwgICAgICAgICAgIHhtbTQKLSAgICAgICAgICAgIHBzdWJiICAgICAgIHhtbTQsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKHQ4MCldICAgO2NvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgICAgIFtHTE9CQUwodDgwKV0KLSAgICAgICAgICAgIHBjbXBndGIgICAgIHhtbTUsICAgICAgICAgICB4bW02ICAgICAgICAgICAgOyBvYnRhaW4gc2lnbiBpbmZvcm1hdGlvbgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICB4bW00Ci0gICAgICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICB4bW01Ci0gICAgICAgICAgICBwdW5wY2tsYncgICB4bW00LCAgICB4bW01ICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0gICAgICAgICAgICBwdW5wY2toYncgICB4bW02LCAgICB4bW03ICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgIFhNTVdPUkQgUFRSIFtyZGkgKzMyXSwgeG1tNAotICAgICAgICAgICAgbW92ZHFhICAgICAgWE1NV09SRCBQVFIgW3JkaSArNDhdLCB4bW02Ci0KLSAgICAgICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgICAgICA2NAotICAgICAgICAgICAgYWRkICAgICAgICAgcmF4LCAgICAgICAgICAgIDMyCi0gICAgICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaStyZHgqMl0KLQotICAgICAgICAgICAgc3ViICAgICAgICAgcmN4LCAgICAgICAgICAgIDEKLSAgICAgICAgICAgIGpueiAgICAgICAgIHN1Ym1ieV9sb29wCi0KLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfc3VidHJhY3RfbWJ1dl9zc2UyKHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICp1c3JjLCB1bnNpZ25lZCBjaGFyICp2c3JjLCB1bnNpZ25lZCBjaGFyICpwcmVkLCBpbnQgc3RyaWRlKQotZ2xvYmFsIHN5bSh2cDhfc3VidHJhY3RfbWJ1dl9zc2UyKQotc3ltKHZwOF9zdWJ0cmFjdF9tYnV2X3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICAgICAgbW92ICAgICByZGksICAgICAgICBhcmcoMCkgO2RpZmYKLSAgICAgICAgICAgIG1vdiAgICAgcmF4LCAgICAgICAgYXJnKDMpIDtwcmVkCi0gICAgICAgICAgICBtb3YgICAgIHJzaSwgICAgICAgIGFyZygxKSA7eiA9IHVzcmMKLSAgICAgICAgICAgIGFkZCAgICAgcmRpLCAgICAgICAgMjU2KjIgIDtkaWZmID0gZGlmZiArIDI1NiAoc2hvcnRzKQotICAgICAgICAgICAgYWRkICAgICByYXgsICAgICAgICAyNTYgICAgO1ByZWRpY3RvciA9IHByZWQgKyAyNTYKLSAgICAgICAgICAgIG1vdnN4ZCAgcmR4LCAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7c3RyaWRlOwotICAgICAgICAgICAgbGVhICAgICByY3gsICAgICAgICBbcmR4ICsgcmR4KjJdCi0KLSAgICAgICAgICAgIDt1Ci0gICAgICAgICAgICA7bGluZSAwIDEKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMCwgICAgTU1XT1JEIFBUUiBbcnNpXSAgOyBzcmMKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMiwgICAgTU1XT1JEIFBUUiBbcnNpK3JkeF0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMSwgICAgWE1NV09SRCBQVFIgW3JheF0gIDsgcHJlZAotICAgICAgICAgICAgcHVucGNrbHFkcSB4bW0wLCAgICB4bW0yCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMiwgICAgeG1tMAotICAgICAgICAgICAgcHN1YmIgICAgICB4bW0wLCAgICB4bW0xICAgICAgICAgICAgOyBzdWJ0cmFjdGlvbiB3aXRoIHNpZ24gbWlzc2VkCi0KLSAgICAgICAgICAgIHB4b3IgICAgICAgeG1tMSwgICAgW0dMT0JBTCh0ODApXSAgIDtjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgICAgIHB4b3IgICAgICAgeG1tMiwgICAgW0dMT0JBTCh0ODApXQotICAgICAgICAgICAgcGNtcGd0YiAgICB4bW0xLCAgICB4bW0yICAgICAgICAgICAgOyBvYnRhaW4gc2lnbiBpbmZvcm1hdGlvbgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMywgICAgeG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICB4bW0wLCAgICB4bW0xICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0gICAgICAgICAgICBwdW5wY2toYncgIHhtbTIsICAgIHhtbTMgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKzE2XSwgICB4bW0yCi0KLSAgICAgICAgICAgIDtsaW5lIDIgMwotICAgICAgICAgICAgbW92cSAgICAgICB4bW0wLCAgICBNTVdPUkQgUFRSIFtyc2krcmR4KjJdICA7IHNyYwotICAgICAgICAgICAgbW92cSAgICAgICB4bW0yLCAgICBNTVdPUkQgUFRSIFtyc2krcmN4XQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0xLCAgICBYTU1XT1JEIFBUUiBbcmF4KzE2XSAgOyBwcmVkCi0gICAgICAgICAgICBwdW5wY2tscWRxIHhtbTAsICAgIHhtbTIKLQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0yLCAgICB4bW0wCi0gICAgICAgICAgICBwc3ViYiAgICAgIHhtbTAsICAgIHhtbTEgICAgICAgICAgICA7IHN1YnRyYWN0aW9uIHdpdGggc2lnbiBtaXNzZWQKLQotICAgICAgICAgICAgcHhvciAgICAgICB4bW0xLCAgICBbR0xPQkFMKHQ4MCldICAgO2NvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICAgICAgcHhvciAgICAgICB4bW0yLCAgICBbR0xPQkFMKHQ4MCldCi0gICAgICAgICAgICBwY21wZ3RiICAgIHhtbTEsICAgIHhtbTIgICAgICAgICAgICA7IG9idGFpbiBzaWduIGluZm9ybWF0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMiwgICAgeG1tMAotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0zLCAgICB4bW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgIHhtbTAsICAgIHhtbTEgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KLSAgICAgICAgICAgIHB1bnBja2hidyAgeG1tMiwgICAgeG1tMyAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyAzMl0sICAgeG1tMAotICAgICAgICAgICAgbW92ZHFhICAgICBYTU1XT1JEIFBUUiBbcmRpICsgNDhdLCAgIHhtbTIKLQotICAgICAgICAgICAgO2xpbmUgNCA1Ci0gICAgICAgICAgICBsZWEgICAgICAgIHJzaSwgICAgIFtyc2kgKyByZHgqNF0KLQotICAgICAgICAgICAgbW92cSAgICAgICB4bW0wLCAgICBNTVdPUkQgUFRSIFtyc2ldICA7IHNyYwotICAgICAgICAgICAgbW92cSAgICAgICB4bW0yLCAgICBNTVdPUkQgUFRSIFtyc2krcmR4XQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0xLCAgICBYTU1XT1JEIFBUUiBbcmF4ICsgMzJdICA7IHByZWQKLSAgICAgICAgICAgIHB1bnBja2xxZHEgeG1tMCwgICAgeG1tMgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIHBzdWJiICAgICAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgc3VidHJhY3Rpb24gd2l0aCBzaWduIG1pc3NlZAotCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTEsICAgIFtHTE9CQUwodDgwKV0gICA7Y29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTIsICAgIFtHTE9CQUwodDgwKV0KLSAgICAgICAgICAgIHBjbXBndGIgICAgeG1tMSwgICAgeG1tMiAgICAgICAgICAgIDsgb2J0YWluIHNpZ24gaW5mb3JtYXRpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0yLCAgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTMsICAgIHhtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgotICAgICAgICAgICAgcHVucGNraGJ3ICB4bW0yLCAgICB4bW0zICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgWE1NV09SRCBQVFIgW3JkaSArIDY0XSwgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyA4MF0sICAgeG1tMgotCi0gICAgICAgICAgICA7bGluZSA2IDcKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMCwgICAgTU1XT1JEIFBUUiBbcnNpK3JkeCoyXSAgOyBzcmMKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMiwgICAgTU1XT1JEIFBUUiBbcnNpK3JjeF0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMSwgICAgWE1NV09SRCBQVFIgW3JheCsgNDhdICA7IHByZWQKLSAgICAgICAgICAgIHB1bnBja2xxZHEgeG1tMCwgICAgeG1tMgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIHBzdWJiICAgICAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgc3VidHJhY3Rpb24gd2l0aCBzaWduIG1pc3NlZAotCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTEsICAgIFtHTE9CQUwodDgwKV0gICA7Y29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTIsICAgIFtHTE9CQUwodDgwKV0KLSAgICAgICAgICAgIHBjbXBndGIgICAgeG1tMSwgICAgeG1tMiAgICAgICAgICAgIDsgb2J0YWluIHNpZ24gaW5mb3JtYXRpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0yLCAgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTMsICAgIHhtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgotICAgICAgICAgICAgcHVucGNraGJ3ICB4bW0yLCAgICB4bW0zICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgWE1NV09SRCBQVFIgW3JkaSArIDk2XSwgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyAxMTJdLCAgeG1tMgotCi0gICAgICAgICAgICA7dgotICAgICAgICAgICAgbW92ICAgICByc2ksICAgICAgICBhcmcoMikgO3ogPSB2c3JjCi0gICAgICAgICAgICBhZGQgICAgIHJkaSwgICAgICAgIDY0KjIgIDtkaWZmID0gZGlmZiArIDMyMCAoc2hvcnRzKQotICAgICAgICAgICAgYWRkICAgICByYXgsICAgICAgICA2NCAgICA7UHJlZGljdG9yID0gcHJlZCArIDMyMAotCi0gICAgICAgICAgICA7bGluZSAwIDEKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMCwgICAgTU1XT1JEIFBUUiBbcnNpXSAgOyBzcmMKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMiwgICAgTU1XT1JEIFBUUiBbcnNpK3JkeF0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMSwgICAgWE1NV09SRCBQVFIgW3JheF0gIDsgcHJlZAotICAgICAgICAgICAgcHVucGNrbHFkcSB4bW0wLCAgICB4bW0yCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMiwgICAgeG1tMAotICAgICAgICAgICAgcHN1YmIgICAgICB4bW0wLCAgICB4bW0xICAgICAgICAgICAgOyBzdWJ0cmFjdGlvbiB3aXRoIHNpZ24gbWlzc2VkCi0KLSAgICAgICAgICAgIHB4b3IgICAgICAgeG1tMSwgICAgW0dMT0JBTCh0ODApXSAgIDtjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgICAgICAgICAgIHB4b3IgICAgICAgeG1tMiwgICAgW0dMT0JBTCh0ODApXQotICAgICAgICAgICAgcGNtcGd0YiAgICB4bW0xLCAgICB4bW0yICAgICAgICAgICAgOyBvYnRhaW4gc2lnbiBpbmZvcm1hdGlvbgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMywgICAgeG1tMQotICAgICAgICAgICAgcHVucGNrbGJ3ICB4bW0wLCAgICB4bW0xICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0gICAgICAgICAgICBwdW5wY2toYncgIHhtbTIsICAgIHhtbTMgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICBYTU1XT1JEIFBUUiBbcmRpXSwgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKzE2XSwgICB4bW0yCi0KLSAgICAgICAgICAgIDtsaW5lIDIgMwotICAgICAgICAgICAgbW92cSAgICAgICB4bW0wLCAgICBNTVdPUkQgUFRSIFtyc2krcmR4KjJdICA7IHNyYwotICAgICAgICAgICAgbW92cSAgICAgICB4bW0yLCAgICBNTVdPUkQgUFRSIFtyc2krcmN4XQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0xLCAgICBYTU1XT1JEIFBUUiBbcmF4KzE2XSAgOyBwcmVkCi0gICAgICAgICAgICBwdW5wY2tscWRxIHhtbTAsICAgIHhtbTIKLQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0yLCAgICB4bW0wCi0gICAgICAgICAgICBwc3ViYiAgICAgIHhtbTAsICAgIHhtbTEgICAgICAgICAgICA7IHN1YnRyYWN0aW9uIHdpdGggc2lnbiBtaXNzZWQKLQotICAgICAgICAgICAgcHhvciAgICAgICB4bW0xLCAgICBbR0xPQkFMKHQ4MCldICAgO2NvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICAgICAgICAgICAgcHhvciAgICAgICB4bW0yLCAgICBbR0xPQkFMKHQ4MCldCi0gICAgICAgICAgICBwY21wZ3RiICAgIHhtbTEsICAgIHhtbTIgICAgICAgICAgICA7IG9idGFpbiBzaWduIGluZm9ybWF0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMiwgICAgeG1tMAotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0zLCAgICB4bW0xCi0gICAgICAgICAgICBwdW5wY2tsYncgIHhtbTAsICAgIHhtbTEgICAgICAgICAgICA7IHB1dCBzaWduIGJhY2sgdG8gc3VidHJhY3Rpb24KLSAgICAgICAgICAgIHB1bnBja2hidyAgeG1tMiwgICAgeG1tMyAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyAzMl0sICAgeG1tMAotICAgICAgICAgICAgbW92ZHFhICAgICBYTU1XT1JEIFBUUiBbcmRpICsgNDhdLCAgIHhtbTIKLQotICAgICAgICAgICAgO2xpbmUgNCA1Ci0gICAgICAgICAgICBsZWEgICAgICAgIHJzaSwgICAgIFtyc2kgKyByZHgqNF0KLQotICAgICAgICAgICAgbW92cSAgICAgICB4bW0wLCAgICBNTVdPUkQgUFRSIFtyc2ldICA7IHNyYwotICAgICAgICAgICAgbW92cSAgICAgICB4bW0yLCAgICBNTVdPUkQgUFRSIFtyc2krcmR4XQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0xLCAgICBYTU1XT1JEIFBUUiBbcmF4ICsgMzJdICA7IHByZWQKLSAgICAgICAgICAgIHB1bnBja2xxZHEgeG1tMCwgICAgeG1tMgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIHBzdWJiICAgICAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgc3VidHJhY3Rpb24gd2l0aCBzaWduIG1pc3NlZAotCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTEsICAgIFtHTE9CQUwodDgwKV0gICA7Y29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTIsICAgIFtHTE9CQUwodDgwKV0KLSAgICAgICAgICAgIHBjbXBndGIgICAgeG1tMSwgICAgeG1tMiAgICAgICAgICAgIDsgb2J0YWluIHNpZ24gaW5mb3JtYXRpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0yLCAgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTMsICAgIHhtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgotICAgICAgICAgICAgcHVucGNraGJ3ICB4bW0yLCAgICB4bW0zICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgWE1NV09SRCBQVFIgW3JkaSArIDY0XSwgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyA4MF0sICAgeG1tMgotCi0gICAgICAgICAgICA7bGluZSA2IDcKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMCwgICAgTU1XT1JEIFBUUiBbcnNpK3JkeCoyXSAgOyBzcmMKLSAgICAgICAgICAgIG1vdnEgICAgICAgeG1tMiwgICAgTU1XT1JEIFBUUiBbcnNpK3JjeF0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgeG1tMSwgICAgWE1NV09SRCBQVFIgW3JheCsgNDhdICA7IHByZWQKLSAgICAgICAgICAgIHB1bnBja2xxZHEgeG1tMCwgICAgeG1tMgotCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTIsICAgIHhtbTAKLSAgICAgICAgICAgIHBzdWJiICAgICAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgc3VidHJhY3Rpb24gd2l0aCBzaWduIG1pc3NlZAotCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTEsICAgIFtHTE9CQUwodDgwKV0gICA7Y29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gICAgICAgICAgICBweG9yICAgICAgIHhtbTIsICAgIFtHTE9CQUwodDgwKV0KLSAgICAgICAgICAgIHBjbXBndGIgICAgeG1tMSwgICAgeG1tMiAgICAgICAgICAgIDsgb2J0YWluIHNpZ24gaW5mb3JtYXRpb24KLQotICAgICAgICAgICAgbW92ZHFhICAgICB4bW0yLCAgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIHhtbTMsICAgIHhtbTEKLSAgICAgICAgICAgIHB1bnBja2xidyAgeG1tMCwgICAgeG1tMSAgICAgICAgICAgIDsgcHV0IHNpZ24gYmFjayB0byBzdWJ0cmFjdGlvbgotICAgICAgICAgICAgcHVucGNraGJ3ICB4bW0yLCAgICB4bW0zICAgICAgICAgICAgOyBwdXQgc2lnbiBiYWNrIHRvIHN1YnRyYWN0aW9uCi0KLSAgICAgICAgICAgIG1vdmRxYSAgICAgWE1NV09SRCBQVFIgW3JkaSArIDk2XSwgICB4bW0wCi0gICAgICAgICAgICBtb3ZkcWEgICAgIFhNTVdPUkQgUFRSIFtyZGkgKyAxMTJdLCAgeG1tMgotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXQ4MDoKLSAgICB0aW1lcyAxNiBkYiAweDgwCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvdGVtcG9yYWxfZmlsdGVyX2FwcGx5X3NzZTIuYXNtIGIvdnA4L2VuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyN2IwMS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvdGVtcG9yYWxfZmlsdGVyX2FwcGx5X3NzZTIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotOyB2b2lkIHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfc3NlMiB8IGFyZwotOyAgKHVuc2lnbmVkIGNoYXIgICpmcmFtZTEsICAgICAgICAgICB8ICAwCi07ICAgdW5zaWduZWQgaW50ICAgIHN0cmlkZSwgICAgICAgICAgIHwgIDEKLTsgICB1bnNpZ25lZCBjaGFyICAqZnJhbWUyLCAgICAgICAgICAgfCAgMgotOyAgIHVuc2lnbmVkIGludCAgICBibG9ja19zaXplLCAgICAgICB8ICAzCi07ICAgaW50ICAgICAgICAgICAgIHN0cmVuZ3RoLCAgICAgICAgIHwgIDQKLTsgICBpbnQgICAgICAgICAgICAgZmlsdGVyX3dlaWdodCwgICAgfCAgNQotOyAgIHVuc2lnbmVkIGludCAgICphY2N1bXVsYXRvciwgICAgICB8ICA2Ci07ICAgdW5zaWduZWQgc2hvcnQgKmNvdW50KSAgICAgICAgICAgIHwgIDcKLWdsb2JhbCBzeW0odnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyKQotc3ltKHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfc3NlMik6Ci0KLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDgKLSAgICBTQVZFX1hNTQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggICAgICAgIHJzaQotICAgIHB1c2ggICAgICAgIHJkaQotICAgIEFMSUdOX1NUQUNLIDE2LCByYXgKLSAgICAlZGVmaW5lIGJsb2NrX3NpemUgICAgMAotICAgICVkZWZpbmUgc3RyZW5ndGggICAgICAxNgotICAgICVkZWZpbmUgZmlsdGVyX3dlaWdodCAzMgotICAgICVkZWZpbmUgcm91bmRpbmdfYml0ICA0OAotICAgICVkZWZpbmUgcmJwX2JhY2t1cCAgICA2NAotICAgICVkZWZpbmUgc3RhY2tfc2l6ZSAgICA4MAotICAgIHN1YiAgICAgICAgIHJzcCwgICAgICAgICAgIHN0YWNrX3NpemUKLSAgICBtb3YgICAgICAgICBbcnNwICsgcmJwX2JhY2t1cF0sIHJicAotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoMykKLSAgICAgICAgbW92ICAgICAgICAgW3JzcCArIGJsb2NrX3NpemVdLCByZHgKLSAgICAgICAgbW92ZCAgICAgICAgeG1tNiwgICAgICAgICAgICBhcmcoNCkKLSAgICAgICAgbW92ZHFhICAgICAgW3JzcCArIHN0cmVuZ3RoXSwgeG1tNiA7IHdoZXJlIHN0cmVuZ3RoIGlzIHVzZWQsIGFsbCAxNiBieXRlcyBhcmUgcmVhZAotCi0gICAgICAgIDsgY2FsY3VsYXRlIHRoZSByb3VuZGluZyBiaXQgb3V0c2lkZSB0aGUgbG9vcAotICAgICAgICA7IDB4ODAwMCA+PiAoMTYgLSBzdHJlbmd0aCkKLSAgICAgICAgbW92ICAgICAgICAgcmR4LCAgICAgICAgICAgIDE2Ci0gICAgICAgIHN1YiAgICAgICAgIHJkeCwgICAgICAgICAgICBhcmcoNCkgOyAxNiAtIHN0cmVuZ3RoCi0gICAgICAgIG1vdmQgICAgICAgIHhtbTQsICAgICAgICAgICByZHggICAgOyBjYW4ndCB1c2UgcmR4IHcvIHNoaWZ0Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTUsICAgICAgICAgICBbR0xPQkFMKF9jb25zdF90b3BfYml0KV0KLSAgICAgICAgcHNybHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTQKLSAgICAgICAgbW92ZHFhICAgICAgW3JzcCArIHJvdW5kaW5nX2JpdF0sIHhtbTUKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDsgc3JjL2ZyYW1lMQotICAgICAgICBtb3YgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDIpIDsgcHJlZGljdG9yIGZyYW1lCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNikgOyBhY2N1bXVsYXRvcgotICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDcpIDsgY291bnQKLQotICAgICAgICA7IGR1cCB0aGUgZmlsdGVyIHdlaWdodCBhbmQgc3RvcmUgZm9yIGxhdGVyCi0gICAgICAgIG1vdmQgICAgICAgIHhtbTAsICAgICAgICAgICBhcmcoNSkgOyBmaWx0ZXJfd2VpZ2h0Ci0gICAgICAgIHBzaHVmbHcgICAgIHhtbTAsICAgICAgICAgICB4bW0wLCAwCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdmRxYSAgICAgIFtyc3AgKyBmaWx0ZXJfd2VpZ2h0XSwgeG1tMAotCi0gICAgICAgIG1vdiAgICAgICAgIHJicCwgICAgICAgICAgICBhcmcoMSkgOyBzdHJpZGUKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICA7IHplcm8gZm9yIGV4dHJhY3Rpb24KLQotICAgICAgICBsZWEgICAgICAgICByY3gsICAgICAgICAgICAgW3JkeCArIDE2KjE2KjFdCi0gICAgICAgIGNtcCAgICAgICAgIGR3b3JkIHB0ciBbcnNwICsgYmxvY2tfc2l6ZV0sIDgKLSAgICAgICAgam5lICAgICAgICAgdGVtcG9yYWxfZmlsdGVyX2FwcGx5X2xvYWRfMTYKLSAgICAgICAgbGVhICAgICAgICAgcmN4LCAgICAgICAgICAgIFtyZHggKyA4KjgqMV0KLQotdGVtcG9yYWxfZmlsdGVyX2FwcGx5X2xvYWRfODoKLSAgICAgICAgbW92cSAgICAgICAgeG1tMCwgICAgICAgICAgIFtyc2ldICA7IGZpcnN0IHJvdwotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJicF0gOyArPSBzdHJpZGUKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMCwgICAgICAgICAgIHhtbTcgICA7IHNyY1sgMC0gN10KLSAgICAgICAgbW92cSAgICAgICAgeG1tMSwgICAgICAgICAgIFtyc2ldICA7IHNlY29uZCByb3cKLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYnBdIDsgKz0gc3RyaWRlCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgICAgICB4bW03ICAgOyBzcmNbIDgtMTVdCi0gICAgICAgIGptcCAgICAgICAgIHRlbXBvcmFsX2ZpbHRlcl9hcHBseV9sb2FkX2ZpbmlzaGVkCi0KLXRlbXBvcmFsX2ZpbHRlcl9hcHBseV9sb2FkXzE2OgotICAgICAgICBtb3ZkcWEgICAgICB4bW0wLCAgICAgICAgICAgW3JzaV0gIDsgc3JjIChmcmFtZTEpCi0gICAgICAgIGxlYSAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmJwXSA7ICs9IHN0cmlkZQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsYncgICB4bW0wLCAgICAgICAgICAgeG1tNyAgIDsgc3JjWyAwLSA3XQotICAgICAgICBwdW5wY2toYncgICB4bW0xLCAgICAgICAgICAgeG1tNyAgIDsgc3JjWyA4LTE1XQotCi10ZW1wb3JhbF9maWx0ZXJfYXBwbHlfbG9hZF9maW5pc2hlZDoKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIFtyZHhdICA7IHByZWRpY3RvciAoZnJhbWUyKQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgeG1tMgotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tNyAgIDsgcHJlZFsgMC0gN10KLSAgICAgICAgcHVucGNraGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTcgICA7IHByZWRbIDgtMTVdCi0KLSAgICAgICAgOyBtb2RpZmllciA9IHNyY19ieXRlIC0gcGl4ZWxfdmFsdWUKLSAgICAgICAgcHN1YncgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTIgICA7IHNyYyAtIHByZWRbIDAtIDddCi0gICAgICAgIHBzdWJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zICAgOyBzcmMgLSBwcmVkWyA4LTE1XQotCi0gICAgICAgIDsgbW9kaWZpZXIgKj0gbW9kaWZpZXIKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICA7IG1vZGlmZXJbIDAtIDddXjIKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEgICA7IG1vZGlmZXJbIDgtMTVdXjIKLQotICAgICAgICA7IG1vZGlmaWVyICo9IDMKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMCwgICAgICAgICAgIFtHTE9CQUwoX2NvbnN0XzN3KV0KLSAgICAgICAgcG11bGx3ICAgICAgeG1tMSwgICAgICAgICAgIFtHTE9CQUwoX2NvbnN0XzN3KV0KLQotICAgICAgICA7IG1vZGlmZXIgKz0gMHg4MDAwID4+ICgxNiAtIHN0cmVuZ3RoKQotICAgICAgICBwYWRkdyAgICAgICB4bW0wLCAgICAgICAgICAgW3JzcCArIHJvdW5kaW5nX2JpdF0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tMSwgICAgICAgICAgIFtyc3AgKyByb3VuZGluZ19iaXRdCi0KLSAgICAgICAgOyBtb2RpZmllciA+Pj0gc3RyZW5ndGgKLSAgICAgICAgcHNybHcgICAgICAgeG1tMCwgICAgICAgICAgIFtyc3AgKyBzdHJlbmd0aF0KLSAgICAgICAgcHNybHcgICAgICAgeG1tMSwgICAgICAgICAgIFtyc3AgKyBzdHJlbmd0aF0KLQotICAgICAgICA7IG1vZGlmaWVyID0gMTYgLSBtb2RpZmllcgotICAgICAgICA7IHNhdHVyYXRpb24gdGFrZXMgY2FyZSBvZiBtb2RpZmllciA+IDE2Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKF9jb25zdF8xNncpXQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTChfY29uc3RfMTZ3KV0KLSAgICAgICAgcHN1YnVzdyAgICAgeG1tMywgICAgICAgICAgIHhtbTEKLSAgICAgICAgcHN1YnVzdyAgICAgeG1tMiwgICAgICAgICAgIHhtbTAKLQotICAgICAgICA7IG1vZGlmaWVyICo9IGZpbHRlcl93ZWlnaHQKLSAgICAgICAgcG11bGx3ICAgICAgeG1tMiwgICAgICAgICAgIFtyc3AgKyBmaWx0ZXJfd2VpZ2h0XQotICAgICAgICBwbXVsbHcgICAgICB4bW0zLCAgICAgICAgICAgW3JzcCArIGZpbHRlcl93ZWlnaHRdCi0KLSAgICAgICAgOyBjb3VudAotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgW3JheF0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIFtyYXgrMTZdCi0gICAgICAgIDsgKz0gbW9kaWZpZXIKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMKLSAgICAgICAgOyB3cml0ZSBiYWNrCi0gICAgICAgIG1vdmRxYSAgICAgIFtyYXhdLCAgICAgICAgICB4bW00Ci0gICAgICAgIG1vdmRxYSAgICAgIFtyYXgrMTZdLCAgICAgICB4bW01Ci0gICAgICAgIGxlYSAgICAgICAgIHJheCwgICAgICAgICAgICBbcmF4ICsgMTYqMl0gOyBjb3VudCArPSAxNiooc2l6ZW9mKHNob3J0KSkKLQotICAgICAgICA7IGxvYWQgYW5kIGV4dHJhY3QgdGhlIHByZWRpY3RvciB1cCB0byBzaG9ydHMKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMCwgICAgICAgICAgIFtyZHhdCi0gICAgICAgIGxlYSAgICAgICAgIHJkeCwgICAgICAgICAgICBbcmR4ICsgMTYqMV0gOyBwcmVkICs9IDE2KihzaXplb2YoY2hhcikpCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTAsICAgICAgICAgICB4bW03ICAgOyBwcmVkWyAwLSA3XQotICAgICAgICBwdW5wY2toYncgICB4bW0xLCAgICAgICAgICAgeG1tNyAgIDsgcHJlZFsgOC0xNV0KLQotICAgICAgICA7IG1vZGlmaWVyICo9IHBpeGVsX3ZhbHVlCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTAsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBtdWxsdyAgICAgIHhtbTEsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgOyBleHBhbmQgdG8gZG91YmxlIHdvcmRzCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTAsICAgICAgICAgICB4bW03ICAgOyBbIDAtIDNdCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTIsICAgICAgICAgICB4bW03ICAgOyBbIDQtIDddCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsICAgICAgICAgICB4bW0xCi0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTEsICAgICAgICAgICB4bW03ICAgOyBbIDgtMTFdCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTMsICAgICAgICAgICB4bW03ICAgOyBbMTItMTVdCi0KLSAgICAgICAgOyBhY2N1bXVsYXRvcgotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgW3JkaV0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tNSwgICAgICAgICAgIFtyZGkrMTZdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICBbcmRpKzMyXQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgW3JkaSs0OF0KLSAgICAgICAgOyArPSBtb2RpZmllcgotICAgICAgICBwYWRkdyAgICAgICB4bW00LCAgICAgICAgICAgeG1tMAotICAgICAgICBwYWRkdyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICB4bW02LCAgICAgICAgICAgeG1tMQotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMwotICAgICAgICA7IHdyaXRlIGJhY2sKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaV0sICAgICAgICAgIHhtbTQKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaSsxNl0sICAgICAgIHhtbTUKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaSszMl0sICAgICAgIHhtbTYKLSAgICAgICAgbW92ZHFhICAgICAgW3JkaSs0OF0sICAgICAgIHhtbTcKLSAgICAgICAgbGVhICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyAxNio0XSA7IGFjY3VtdWxhdG9yICs9IDE2KihzaXplb2YoaW50KSkKLQotICAgICAgICBjbXAgICAgICAgICByZHgsICAgICAgICAgICAgcmN4Ci0gICAgICAgIGplICAgICAgICAgIHRlbXBvcmFsX2ZpbHRlcl9hcHBseV9lcGlsb2cKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICA7IHplcm8gZm9yIGV4dHJhY3Rpb24KLSAgICAgICAgY21wICAgICAgICAgZHdvcmQgcHRyIFtyc3AgKyBibG9ja19zaXplXSwgMTYKLSAgICAgICAgamUgICAgICAgICAgdGVtcG9yYWxfZmlsdGVyX2FwcGx5X2xvYWRfMTYKLSAgICAgICAgam1wICAgICAgICAgdGVtcG9yYWxfZmlsdGVyX2FwcGx5X2xvYWRfOAotCi10ZW1wb3JhbF9maWx0ZXJfYXBwbHlfZXBpbG9nOgotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgbW92ICAgICAgICAgcmJwLCAgICAgICAgICAgIFtyc3AgKyByYnBfYmFja3VwXQotICAgIGFkZCAgICAgICAgIHJzcCwgICAgICAgICAgICBzdGFja19zaXplCi0gICAgcG9wICAgICAgICAgcnNwCi0gICAgcG9wICAgICAgICAgcmRpCi0gICAgcG9wICAgICAgICAgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotU0VDVElPTl9ST0RBVEEKLWFsaWduIDE2Ci1fY29uc3RfM3c6Ci0gICAgdGltZXMgOCBkdyAzCi1hbGlnbiAxNgotX2NvbnN0X3RvcF9iaXQ6Ci0gICAgdGltZXMgOCBkdyAxPDwxNQotYWxpZ24gMTYKLV9jb25zdF8xNncKLSAgICB0aW1lcyA4IGR3IDE2CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvdGVtcG9yYWxfZmlsdGVyX3g4Ni5oIGIvdnA4L2VuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl94ODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhYTE0MC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvdGVtcG9yYWxfZmlsdGVyX3g4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19JTkNfVlA4X1RFTVBPUkFMX0ZJTFRFUl9YODZfSAotI2RlZmluZSBfX0lOQ19WUDhfVEVNUE9SQUxfRklMVEVSX1g4Nl9ICi0KLSNpZiBIQVZFX1NTRTIKLWV4dGVybiBwcm90b3R5cGVfYXBwbHkodnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0KLSN1bmRlZiAgdnA4X3RlbXBvcmFsX2ZpbHRlcl9hcHBseQotI2RlZmluZSB2cDhfdGVtcG9yYWxfZmlsdGVyX2FwcGx5IHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfc3NlMgotCi0jZW5kaWYKLQotI2VuZGlmCi0KLSNlbmRpZiAvLyBfX0lOQ19WUDhfVEVNUE9SQUxfRklMVEVSX1g4Nl9ICmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2VfaW1wbF9tbXguYXNtIGIvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX2ltcGxfbW14LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhOWI0ZC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2VfaW1wbF9tbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOTgxICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotO3Vuc2lnbmVkIGludCB2cDhfZ2V0X21iX3NzX21teCggc2hvcnQgKnNyY19wdHIgKQotZ2xvYmFsIHN5bSh2cDhfZ2V0X21iX3NzX21teCkKLXN5bSh2cDhfZ2V0X21iX3NzX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIHN1YiAgICAgICAgIHJzcCwgOAotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgYXJnKDApIDtzcmNfcHRyCi0gICAgICAgIG1vdiAgICAgICAgIHJjeCwgMTYKLSAgICAgICAgcHhvciAgICAgICAgbW00LCBtbTQKLQotTkVYVFJPVzoKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYXgrOF0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBbcmF4KzE2XQotICAgICAgICBtb3ZxICAgICAgICBtbTMsIFtyYXgrMjRdCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMSwgbW0xCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMiwgbW0yCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMywgbW0zCi0KLSAgICAgICAgcGFkZGQgICAgICAgbW00LCBtbTAKLSAgICAgICAgcGFkZGQgICAgICAgbW00LCBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgbW00LCBtbTIKLSAgICAgICAgcGFkZGQgICAgICAgbW00LCBtbTMKLQotICAgICAgICBhZGQgICAgICAgICByYXgsIDMyCi0gICAgICAgIGRlYyAgICAgICAgIHJjeAotICAgICAgICBqYSAgICAgICAgICBORVhUUk9XCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcnNwXSwgbW00Ci0KLSAgICAgICAgO3JldHVybiBzdW1bMF0rc3VtWzFdOwotICAgICAgICBtb3ZzeGQgICAgICByYXgsIGR3b3JkIHB0ciBbcnNwXQotICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBbcnNwKzRdCi0gICAgICAgIGFkZCAgICAgICAgIHJheCwgcmN4Ci0KLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgYWRkIHJzcCwgOAotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3Vuc2lnbmVkIGludCB2cDhfZ2V0OHg4dmFyX21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlY29uX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgaW50ICpTU0UsCi07ICAgIGludCAqU3VtCi07KQotZ2xvYmFsIHN5bSh2cDhfZ2V0OHg4dmFyX21teCkKLXN5bSh2cDhfZ2V0OHg4dmFyX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIHB1c2ggcmJ4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxNgotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgcHhvciAgICAgICAgbW01LCBtbTUgICAgICAgICAgICAgICAgICAgIDsgQmxhbmsgbW14NgotICAgICAgICBweG9yICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgICAgICAgICAgOyBCbGFuayBtbXg3Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICAgICAgICA7IEJsYW5rIG1teDcKLQotICAgICAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSA7W3NyY19wdHJdICA7IExvYWQgYmFzZSBhZGRyZXNzZXMKLSAgICAgICAgbW92ICAgICAgICAgcmJ4LCBhcmcoMikgO1tyZWZfcHRyXQotICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoMSkgO1tzb3VyY2Vfc3RyaWRlXQotICAgICAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgO1tyZWNvbl9zdHJpZGVdCi0KLSAgICAgICAgOyBSb3cgMQotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcHN1YnN3ICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQS1CIChoaWdoIG9yZGVyKSB0byBNTTIKLQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQotICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotCi0KLSAgICAgICAgOyBSb3cgMgotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcHN1YnN3ICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQS1CIChoaWdoIG9yZGVyKSB0byBNTTIKLQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQotICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotCi0gICAgICAgIDsgUm93IDMKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgotICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgotICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgotICAgICAgICBwdW5wY2toYncgICBtbTMsIG1tNgotICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCi0gICAgICAgIHBzdWJzdyAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICA7IEEtQiAoaGlnaCBvcmRlcikgdG8gTU0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKLQotICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgcG1hZGR3ZCAgICAgbW0yLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCi0gICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKLSAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLQotICAgICAgICA7IFJvdyA0Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0xICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KLSAgICAgICAgcHVucGNraGJ3ICAgbW0zLCBtbTYKLSAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAotICAgICAgICBwc3Vic3cgICAgICBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGhpZ2ggb3JkZXIpIHRvIE1NMgotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgbW0wLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMiwgbW0yICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCi0gICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCi0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0KLSAgICAgICAgOyBSb3cgNQotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcHN1YnN3ICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQS1CIChoaWdoIG9yZGVyKSB0byBNTTIKLQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQotICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICA7ICAgICAgICAgICAgICBtb3ZxICAgICAgICBtbTQsIFtyYnggKyByZHhdCi0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0KLSAgICAgICAgOyBSb3cgNgotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAotICAgICAgICBtb3ZxICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotICAgICAgICBtb3ZxICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBUYWtlIGNvcGllcwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcHN1YnN3ICAgICAgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQS1CIChoaWdoIG9yZGVyKSB0byBNTTIKLQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBwbWFkZHdkICAgICBtbTIsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQotICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMiAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotCi0gICAgICAgIDsgUm93IDcKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKLSAgICAgICAgbW92cSAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgVGFrZSBjb3BpZXMKLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgotICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgotICAgICAgICBwdW5wY2toYncgICBtbTIsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgotICAgICAgICBwdW5wY2toYncgICBtbTMsIG1tNgotICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCi0gICAgICAgIHBzdWJzdyAgICAgIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICA7IEEtQiAoaGlnaCBvcmRlcikgdG8gTU0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKLQotICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgcG1hZGR3ZCAgICAgbW0yLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCi0gICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKLSAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTIgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLQotICAgICAgICA7IFJvdyA4Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgbW0xICAgICAgICAgICAgICAgICAgICA7IFRha2UgY29waWVzCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KLSAgICAgICAgcHVucGNraGJ3ICAgbW0zLCBtbTYKLSAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAotICAgICAgICBwc3Vic3cgICAgICBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGhpZ2ggb3JkZXIpIHRvIE1NMgotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgbW0wLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMiwgbW0yICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCi0gICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCi0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0yICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0KLSAgICAgICAgOyBOb3cgYWNjdW11bGF0ZSB0aGUgZmluYWwgcmVzdWx0cy4KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtyc3ArOF0sIG1tNSAgICAgIDsgY29weSBiYWNrIGFjY3VtdWxhdGVkIHJlc3VsdHMgaW50byBub3JtYWwgbWVtb3J5Ci0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcnNwXSwgbW03ICAgICAgICA7IGNvcHkgYmFjayBhY2N1bXVsYXRlZCByZXN1bHRzIGludG8gbm9ybWFsIG1lbW9yeQotICAgICAgICBtb3ZzeCAgICAgICByZHgsIFdPUkQgUFRSIFtyc3ArOF0KLSAgICAgICAgbW92c3ggICAgICAgcmN4LCBXT1JEIFBUUiBbcnNwKzEwXQotICAgICAgICBtb3ZzeCAgICAgICByYngsIFdPUkQgUFRSIFtyc3ArMTJdCi0gICAgICAgIG1vdnN4ICAgICAgIHJheCwgV09SRCBQVFIgW3JzcCsxNF0KLSAgICAgICAgYWRkICAgICAgICAgcmR4LCByY3gKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LCByYXgKLSAgICAgICAgYWRkICAgICAgICAgcmR4LCByYnggICAgO1hTdW0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBEV09SRCBQVFIgW3JzcF0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgW3JzcCs0XQotICAgICAgICBhZGQgICAgICAgICByYXgsIHJjeCAgICA7WFhTdW0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoNCkgO1NTRQotICAgICAgICBtb3YgICAgICAgICByZGksIGFyZyg1KSA7U3VtCi0gICAgICAgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbcnNpXSwgZWF4Ci0gICAgICAgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbcmRpXSwgZWR4Ci0gICAgICAgIHhvciAgICAgICAgIHJheCwgcmF4ICAgIDsgcmV0dXJuIDAKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBhZGQgcnNwLCAxNgotICAgIHBvcCByYngKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLTt1bnNpZ25lZCBpbnQKLTt2cDhfZ2V0NHg0dmFyX21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlY29uX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgaW50ICpTU0UsCi07ICAgIGludCAqU3VtCi07KQotZ2xvYmFsIHN5bSh2cDhfZ2V0NHg0dmFyX21teCkKLXN5bSh2cDhfZ2V0NHg0dmFyX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA2Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIHB1c2ggcmJ4Ci0gICAgc3ViICAgICAgICAgcnNwLCAxNgotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgcHhvciAgICAgICAgbW01LCBtbTUgICAgICAgICAgICAgICAgICAgIDsgQmxhbmsgbW14NgotICAgICAgICBweG9yICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgICAgICAgICAgOyBCbGFuayBtbXg3Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgICAgICAgICA7IEJsYW5rIG1teDcKLQotICAgICAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSA7W3NyY19wdHJdICA7IExvYWQgYmFzZSBhZGRyZXNzZXMKLSAgICAgICAgbW92ICAgICAgICAgcmJ4LCBhcmcoMikgO1tyZWZfcHRyXQotICAgICAgICBtb3ZzeGQgICAgICByY3gsIGR3b3JkIHB0ciBhcmcoMSkgO1tzb3VyY2Vfc3RyaWRlXQotICAgICAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBhcmcoMykgO1tyZWNvbl9zdHJpZGVdCi0KLSAgICAgICAgOyBSb3cgMQotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBwdW5wY2tsYncgICBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgdG8gaGlnaGVyIHBycmNpc2lvbgotICAgICAgICBwdW5wY2tsYncgICBtbTEsIG1tNgotICAgICAgICBwc3Vic3cgICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgOyBBLUIgKGxvdyBvcmRlcikgdG8gTU0wCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgZGlmZmVyZW5jZXMgaW4gbW01Ci0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCi0gICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCi0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0KLQotICAgICAgICA7IFJvdyAyCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBkaWZmZXJlbmNlcyBpbiBtbTUKLQotICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQotICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQotICAgICAgICBtb3ZxICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotCi0gICAgICAgIDsgUm93IDMKLSAgICAgICAgbW92cSAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKLSAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBhZGQgICAgICAgICByYngscmR4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHJlZiBkYXRhCi0gICAgICAgIGFkZCAgICAgICAgIHJheCxyY3ggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gdGhlIG5ldyBkYXRhCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCi0gICAgICAgIHBhZGRkICAgICAgIG1tNywgbW0wICAgICAgICAgICAgICAgICAgICA7IGFjY3VtdWxhdGUgaW4gbW03Ci0KLSAgICAgICAgOyBSb3cgNAotICAgICAgICBtb3ZxICAgICAgICBtbTAsIFtyYXhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLQotICAgICAgICBwYWRkdyAgICAgICBtbTUsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGRpZmZlcmVuY2VzIGluIG1tNQotCi0gICAgICAgIHBtYWRkd2QgICAgIG1tMCwgbW0wICAgICAgICAgICAgICAgICAgICA7IHNxdWFyZSBhbmQgYWNjdW11bGF0ZQotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotCi0KLSAgICAgICAgOyBOb3cgYWNjdW11bGF0ZSB0aGUgZmluYWwgcmVzdWx0cy4KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgUFRSIFtyc3ArOF0sIG1tNSAgICAgIDsgY29weSBiYWNrIGFjY3VtdWxhdGVkIHJlc3VsdHMgaW50byBub3JtYWwgbWVtb3J5Ci0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIFBUUiBbcnNwXSwgbW03ICAgICAgICA7IGNvcHkgYmFjayBhY2N1bXVsYXRlZCByZXN1bHRzIGludG8gbm9ybWFsIG1lbW9yeQotICAgICAgICBtb3ZzeCAgICAgICByZHgsIFdPUkQgUFRSIFtyc3ArOF0KLSAgICAgICAgbW92c3ggICAgICAgcmN4LCBXT1JEIFBUUiBbcnNwKzEwXQotICAgICAgICBtb3ZzeCAgICAgICByYngsIFdPUkQgUFRSIFtyc3ArMTJdCi0gICAgICAgIG1vdnN4ICAgICAgIHJheCwgV09SRCBQVFIgW3JzcCsxNF0KLSAgICAgICAgYWRkICAgICAgICAgcmR4LCByY3gKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LCByYXgKLSAgICAgICAgYWRkICAgICAgICAgcmR4LCByYnggICAgO1hTdW0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBEV09SRCBQVFIgW3JzcF0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBEV09SRCBQVFIgW3JzcCs0XQotICAgICAgICBhZGQgICAgICAgICByYXgsIHJjeCAgICA7WFhTdW0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCBhcmcoNCkgO1NTRQotICAgICAgICBtb3YgICAgICAgICByZGksIGFyZyg1KSA7U3VtCi0gICAgICAgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbcnNpXSwgZWF4Ci0gICAgICAgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbcmRpXSwgZWR4Ci0gICAgICAgIHhvciAgICAgICAgIHJheCwgcmF4ICAgIDsgcmV0dXJuIDAKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBhZGQgcnNwLCAxNgotICAgIHBvcCByYngKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLTt1bnNpZ25lZCBpbnQKLTt2cDhfZ2V0NHg0c3NlX2NzX21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgIHJlY29uX3N0cmlkZQotOykKLWdsb2JhbCBzeW0odnA4X2dldDR4NHNzZV9jc19tbXgpCi1zeW0odnA4X2dldDR4NHNzZV9jc19tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICBwdXNoIHJieAotICAgIDsgZW5kIHByb2xvZwotCi0KLSAgICAgICAgcHhvciAgICAgICAgbW02LCBtbTYgICAgICAgICAgICAgICAgICAgIDsgQmxhbmsgbW14NwotICAgICAgICBweG9yICAgICAgICBtbTcsIG1tNyAgICAgICAgICAgICAgICAgICAgOyBCbGFuayBtbXg3Ci0KLSAgICAgICAgbW92ICAgICAgICAgcmF4LCBhcmcoMCkgO1tzcmNfcHRyXSAgOyBMb2FkIGJhc2UgYWRkcmVzc2VzCi0gICAgICAgIG1vdiAgICAgICAgIHJieCwgYXJnKDIpIDtbcmVmX3B0cl0KLSAgICAgICAgbW92c3hkICAgICAgcmN4LCBkd29yZCBwdHIgYXJnKDEpIDtbc291cmNlX3N0cmlkZV0KLSAgICAgICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgYXJnKDMpIDtbcmVjb25fc3RyaWRlXQotICAgICAgICA7IFJvdyAxCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCi0gICAgICAgIG1vdmQgICAgICAgIG1tMSwgW3JieF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0xCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcG1hZGR3ZCAgICAgbW0wLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCi0gICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKLSAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKLSAgICAgICAgbW92ZCAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLQotICAgICAgICA7IFJvdyAyCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLSAgICAgICAgcG1hZGR3ZCAgICAgbW0wLCBtbTAgICAgICAgICAgICAgICAgICAgIDsgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCi0gICAgICAgIGFkZCAgICAgICAgIHJieCxyZHggICAgICAgICAgICAgICAgICAgICA7IEluYyBwb2ludGVyIGludG8gcmVmIGRhdGEKLSAgICAgICAgYWRkICAgICAgICAgcmF4LHJjeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byB0aGUgbmV3IGRhdGEKLSAgICAgICAgbW92ZCAgICAgICAgbW0xLCBbcmJ4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLQotICAgICAgICA7IFJvdyAzCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgW3JheF0gICAgICAgICAgICAgICAgICA7IENvcHkgZWlnaHQgYnl0ZXMgdG8gbW0wCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgbW02Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB0byBoaWdoZXIgcHJyY2lzaW9uCi0gICAgICAgIHBzdWJzdyAgICAgIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IEEtQiAobG93IG9yZGVyKSB0byBNTTAKLQotICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgYWRkICAgICAgICAgcmJ4LHJkeCAgICAgICAgICAgICAgICAgICAgIDsgSW5jIHBvaW50ZXIgaW50byByZWYgZGF0YQotICAgICAgICBhZGQgICAgICAgICByYXgscmN4ICAgICAgICAgICAgICAgICAgICAgOyBJbmMgcG9pbnRlciBpbnRvIHRoZSBuZXcgZGF0YQotICAgICAgICBtb3ZkICAgICAgICBtbTEsIFtyYnhdICAgICAgICAgICAgICAgICAgOyBDb3B5IGVpZ2h0IGJ5dGVzIHRvIG1tMQotICAgICAgICBwYWRkZCAgICAgICBtbTcsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBhY2N1bXVsYXRlIGluIG1tNwotCi0gICAgICAgIDsgUm93IDQKLSAgICAgICAgbW92ZCAgICAgICAgbW0wLCBbcmF4XSAgICAgICAgICAgICAgICAgIDsgQ29weSBlaWdodCBieXRlcyB0byBtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHRvIGhpZ2hlciBwcnJjaXNpb24KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCBtbTYKLSAgICAgICAgcHN1YnN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgQS1CIChsb3cgb3JkZXIpIHRvIE1NMAotICAgICAgICBwbWFkZHdkICAgICBtbTAsIG1tMCAgICAgICAgICAgICAgICAgICAgOyBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKLSAgICAgICAgcGFkZGQgICAgICAgbW03LCBtbTAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW11bGF0ZSBpbiBtbTcKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwc3JscSAgICAgICBtbTcsICAgIDMyCi0KLSAgICAgICAgcGFkZGQgICAgICAgbW0wLCAgICBtbTcKLSAgICAgICAgbW92cSAgICAgICAgcmF4LCAgICBtbTAKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmJ4Ci0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLSVkZWZpbmUgbW14X2ZpbHRlcl9zaGlmdCAgICAgICAgICAgIDcKLQotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbDR4NF92YXJfbW14Ci07KAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIHNob3J0ICpIRmlsdGVyLAotOyAgICB1bnNpZ25lZCBzaG9ydCAqVkZpbHRlciwKLTsgICAgaW50ICpzdW0sCi07ICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotOykKLWdsb2JhbCBzeW0odnA4X2ZpbHRlcl9ibG9jazJkX2JpbDR4NF92YXJfbW14KQotc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teCk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA4Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIHN1YiAgICAgICAgIHJzcCwgMTYKLSAgICA7IGVuZCBwcm9sb2cKLQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTcsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoNCkgO0hGaWx0ZXIgICAgICAgICAgICAgOwotICAgICAgICBtb3YgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIGFyZyg1KSA7VkZpbHRlciAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO3JlZl9wdHIgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgO3NyY19wdHIgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBweG9yICAgICAgICAgICAgbW0wLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgbW0zLCAgICAgICAgICAgIFtyYXgrOF0gICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgW0dMT0JBTChtbXhfYmlfcmQpXSA7Ci0KLSAgICAgICAgcHNyYXcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbXhfZmlsdGVyX3NoaWZ0ICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNSwgICAgICAgICAgICBtbTEKLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCBkd29yZCBwdHIgIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7Ci0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsIGR3b3JkIHB0ciAgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lICAgIDsKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgcjgKLSVlbmRpZgotCi1maWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teF9sb29wOgotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JzaSsxXSAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMSwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgbW0zLCAgICAgICAgICAgIFtyYXgrOF0gICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgW0dMT0JBTChtbXhfYmlfcmQpXSA7Ci0KLSAgICAgICAgcHNyYXcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbXhfZmlsdGVyX3NoaWZ0ICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW01LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgbW0zLCAgICAgICAgICAgIFtyZHhdICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTEsICAgICAgICAgICAgW3JkeCs4XSAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0KLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtHTE9CQUwobW14X2JpX3JkKV0gOwotICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOwotCi0gICAgICAgIG1vdmQgICAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTMsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHN1YncgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbWFkZHdkICAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7Ci0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7Ci0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHI5LCAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAgICAgcjgKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICByOQotJWVuZGlmCi0gICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGpueiAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teF9sb29wICAgICAgIDsKLQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTMsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbHdkICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNraHdkICAgICAgIG1tMywgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgbW02LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmxxICAgICAgICAgICBtbTYsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHNyYWQgICAgICAgICAgIG1tMiwgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JscSAgICAgICAgICAgbW00LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDtzdW0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNykgO3N1bXNxdWFyZWQKLQotICAgICAgICBtb3ZkICAgICAgICAgICAgZHdvcmQgcHRyIFtyZGldLCAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZCAgICAgICAgICAgIGR3b3JkIHB0ciBbcnNpXSwgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7Ci0KLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBhZGQgcnNwLCAxNgotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotCi0KLTt2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teAotOygKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotOyAgICB1bnNpZ25lZCBzaG9ydCAqSEZpbHRlciwKLTsgICAgdW5zaWduZWQgc2hvcnQgKlZGaWx0ZXIsCi07ICAgIGludCAqc3VtLAotOyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKLTspCi1nbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teCkKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgOQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICBzdWIgICAgICAgICByc3AsIDE2Ci0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tNywgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoNSkgO0hGaWx0ZXIgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZHgsICAgICAgICAgICAgYXJnKDYpIDtWRmlsdGVyICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO3JlZl9wdHIgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSA7c3JjX3B0ciAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgO0hlaWdodCAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB4b3IgICAgICAgICAgICBtbTAsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaV0gICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTEgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0xLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTEsICAgICAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMiwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMywgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2toYncgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgbW0zLCAgICAgICAgICAgIFtyYXgrOF0gICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTQsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbR0xPQkFMKG1teF9iaV9yZCldIDsKLQotICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOwotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0yLCAgICAgICAgICAgIFtHTE9CQUwobW14X2JpX3JkKV0gOwotCi0gICAgICAgIHBzcmF3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW14X2ZpbHRlcl9zaGlmdCAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICAgICAgbW0xCi0KLSAgICAgICAgcGFja3Vzd2IgICAgICAgIG1tNSwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICByOAotJWVuZGlmCi0KLWZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcnNpXSAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgICAgICBbcnNpKzFdICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtbTEsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2hidyAgICAgICBtbTIsICAgICAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMSwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMiwgICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2toYncgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgICAgICBtbTQsICAgICAgICAgICAgW3JheCs4XSAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtHTE9CQUwobW14X2JpX3JkKV0gOwotICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgW0dMT0JBTChtbXhfYmlfcmQpXSA7Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW14X2ZpbHRlcl9zaGlmdCAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTUgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgbW0zLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2toYncgICAgICAgbW00LCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTUsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhY2t1c3diICAgICAgICBtbTUsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tMywgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgICAgIG1tNCwgICAgICAgICAgICBbcmR4XSAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbXVsbHcgICAgICAgICAgbW0xLCAgICAgICAgICAgIFtyZHgrOF0gICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgbW0yLCAgICAgICAgICAgIFtyZHgrOF0gICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTEsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW00ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMSwgICAgICAgICAgICBbR0xPQkFMKG1teF9iaV9yZCldIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tMiwgICAgICAgICAgICBbR0xPQkFMKG1teF9iaV9yZCldIDsKLQotICAgICAgICBwc3JhdyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOwotICAgICAgICBwc3JhdyAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1teF9maWx0ZXJfc2hpZnQgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTMsICAgICAgICAgICAgW3JkaV0gICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG1tMywgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNraGJ3ICAgICAgIG1tNCwgICAgICAgICAgICBtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3VidyAgICAgICAgICAgbW0xLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwc3VidyAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBtYWRkd2QgICAgICAgICBtbTEsICAgICAgICAgICAgbW0xICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgbW03LCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgICAgICByc2ksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7Ci0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZSAgICA7Ci0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUgICAgOwotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjksICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgOwotICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIHI4Ci0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAgICAgcjkKLSVlbmRpZgotICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBqbnogICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXhfbG9vcCAgICAgICA7Ci0KLQotICAgICAgICBweG9yICAgICAgICAgICAgbW0zLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBweG9yICAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2x3ZCAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2h3ZCAgICAgICBtbTMsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JscSAgICAgICAgICAgbW02LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmFkICAgICAgICAgICBtbTIsICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tNCwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg3KSA7c3VtCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDgpIDtzdW1zcXVhcmVkCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIGR3b3JkIHB0ciBbcmRpXSwgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdmQgICAgICAgICAgICBkd29yZCBwdHIgW3JzaV0sICAgICAgICAgIG1tNCAgICAgICAgICAgICAgICAgOwotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBhZGQgcnNwLCAxNgotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLTt1bnNpZ25lZCBpbnQgdnA4X2dldDE2eDE2cHJlZF9lcnJvcl9tbXgKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCBzcmNfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgcmVmX3N0cmlkZQotOykKLWdsb2JhbCBzeW0odnA4X2dldDE2eDE2cHJlZF9lcnJvcl9tbXgpCi1zeW0odnA4X2dldDE2eDE2cHJlZF9lcnJvcl9tbXgpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNAotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICBzdWIgICAgICAgICByc3AsIDE2Ci0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgbW92ICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7RFdPUkQgUFRSIFtzcmNfcHRyXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtEV09SRCBQVFIgW3JlZl9wdHJdCi0KLSAgICAgICAgbW92c3hkICAgICAgcmF4LCAgICAgICAgICAgIERXT1JEIFBUUiBhcmcoMSkgO1tzcmNfc3RyaWRlXQotICAgICAgICBtb3ZzeGQgICAgICByZHgsICAgICAgICAgICAgRFdPUkQgUFRSIGFyZygzKSA7W3JlZl9zdHJpZGVdCi0KLSAgICAgICAgcHhvciAgICAgICAgbW0wLCAgICAgICAgICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTcgZm9yIGFjY3VtdWxhdGluZyBkaWZmcwotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTYgZm9yIGFjY3VtdWxhdGluZyBzc2UKLSAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgICAgIDE2Ci0KLXZhcjE2bG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICAgICAgICAgIFtyZGldCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICAgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgICAgICAgICAgbW0yCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICAgICAgICAgIG1tMAotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgICAgICAgICAgbW0wCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICAgICAgICAgIG1tMAotICAgICAgICBwdW5wY2toYncgICBtbTQsICAgICAgICAgICAgbW0wCi0KLSAgICAgICAgcHN1YncgICAgICAgbW0xLCAgICAgICAgICAgIG1tMgotICAgICAgICBwc3VidyAgICAgICBtbTMsICAgICAgICAgICAgbW00Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW03LCAgICAgICAgICAgIG1tMQotICAgICAgICBwbWFkZHdkICAgICBtbTEsICAgICAgICAgICAgbW0xCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW03LCAgICAgICAgICAgIG1tMwotICAgICAgICBwbWFkZHdkICAgICBtbTMsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcGFkZGQgICAgICAgbW02LCAgICAgICAgICAgIG1tMQotICAgICAgICBwYWRkZCAgICAgICBtbTYsICAgICAgICAgICAgbW0zCi0KLQotICAgICAgICBtb3ZxICAgICAgICBtbTEsICAgICAgICAgICAgW3JzaSs4XQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgICAgICAgICAgW3JkaSs4XQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgICAgICAgICBtbTEKLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICAgICAgICAgIG1tMgotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgICAgICBtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICAgICAgICAgIG1tMAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMiwgICAgICAgICAgICBtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgbW00LCAgICAgICAgICAgIG1tMAotCi0gICAgICAgIHBzdWJ3ICAgICAgIG1tMSwgICAgICAgICAgICBtbTIKLSAgICAgICAgcHN1YncgICAgICAgbW0zLCAgICAgICAgICAgIG1tNAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNywgICAgICAgICAgICBtbTEKLSAgICAgICAgcG1hZGR3ZCAgICAgbW0xLCAgICAgICAgICAgIG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNywgICAgICAgICAgICBtbTMKLSAgICAgICAgcG1hZGR3ZCAgICAgbW0zLCAgICAgICAgICAgIG1tMwotCi0gICAgICAgIHBhZGRkICAgICAgIG1tNiwgICAgICAgICAgICBtbTEKLSAgICAgICAgcGFkZGQgICAgICAgbW02LCAgICAgICAgICAgIG1tMwotCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgICAgICByYXgKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgICAgIHJkeAotCi0gICAgICAgIHN1YiAgICAgICAgIHJjeCwgICAgICAgICAgICAxCi0gICAgICAgIGpueiAgICAgICAgIHZhcjE2bG9vcAotCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgICAgIG1tNgotICAgICAgICBweG9yICAgICAgICBtbTYsICAgICAgICAgICAgbW02Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW01LCAgICAgICAgICAgIG1tNQotICAgICAgICBwdW5wY2tsd2QgICBtbTYsICAgICAgICAgICAgbW03Ci0KLSAgICAgICAgcHVucGNraHdkICAgbW01LCAgICAgICAgICAgIG1tNwotICAgICAgICBwc3JhZCAgICAgICBtbTUsICAgICAgICAgICAgMTYKLQotICAgICAgICBwc3JhZCAgICAgICBtbTYsICAgICAgICAgICAgMTYKLSAgICAgICAgcGFkZGQgICAgICAgbW02LCAgICAgICAgICAgIG1tNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgICAgICAgICBtbTEKLSAgICAgICAgcHNybHEgICAgICAgbW0xLCAgICAgICAgICAgIDMyCi0KLSAgICAgICAgcGFkZGQgICAgICAgbW0yLCAgICAgICAgICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgICAgICAgICAgbW02Ci0KLSAgICAgICAgcHNybHEgICAgICAgbW02LCAgICAgICAgICAgIDMyCi0gICAgICAgIHBhZGRkICAgICAgIG1tNiwgICAgICAgICAgICBtbTcKLQotICAgICAgICBtb3ZkIERXT1JEIFBUUiBbcnNwXSwgICAgICAgbW02ICA7U3VtCi0gICAgICAgIG1vdmQgRFdPUkQgUFRSIFtyc3ArNF0sICAgICBtbTIgIDtTU0UKLQotICAgICAgICA7IHJldHVybiAoU1NFLSgoU3VtKlN1bSk+PjgpKTsKLSAgICAgICAgbW92c3hkICAgICAgcmR4LCBkd29yZCBwdHIgW3JzcF0KLSAgICAgICAgaW11bCAgICAgICAgcmR4LCByZHgKLSAgICAgICAgc2FyICAgICAgICAgcmR4LCA4Ci0gICAgICAgIG1vdnN4ZCAgICAgIHJheCwgZHdvcmQgcHRyIFtyc3AgKyA0XQotICAgICAgICBzdWIgICAgICAgICByYXgsIHJkeAotCi0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIGFkZCByc3AsIDE2Ci0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLVNFQ1RJT05fUk9EQVRBCi07c2hvcnQgbW14X2JpX3JkWzRdID0geyA2NCwgNjQsIDY0LCA2NH07Ci1hbGlnbiAxNgotbW14X2JpX3JkOgotICAgIHRpbWVzIDQgZHcgNjQKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3g4Ni92YXJpYW5jZV9pbXBsX3NzZTIuYXNtIGIvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX2ltcGxfc3NlMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzMwZGUuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX2ltcGxfc3NlMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNDYzICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotJWRlZmluZSB4bW1fZmlsdGVyX3NoaWZ0ICAgICAgICAgICAgNwotCi07dW5zaWduZWQgaW50IHZwOF9nZXRfbWJfc3Nfc3NlMgotOygKLTsgICAgc2hvcnQgKnNyY19wdHIKLTspCi1nbG9iYWwgc3ltKHZwOF9nZXRfbWJfc3Nfc3NlMikKLXN5bSh2cDhfZ2V0X21iX3NzX3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMQotICAgIEdFVF9HT1QgICAgIHJieAotICAgIHB1c2ggcnNpCi0gICAgcHVzaCByZGkKLSAgICBzdWIgICAgICAgICByc3AsIDE2Ci0gICAgOyBlbmQgcHJvbG9nCi0KLQotICAgICAgICBtb3YgICAgICAgICByYXgsIGFyZygwKSA7W3NyY19wdHJdCi0gICAgICAgIG1vdiAgICAgICAgIHJjeCwgOAotICAgICAgICBweG9yICAgICAgICB4bW00LCB4bW00Ci0KLU5FWFRST1c6Ci0gICAgICAgIG1vdmRxYSAgICAgIHhtbTAsIFtyYXhdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsIFtyYXgrMTZdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsIFtyYXgrMzJdCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTMsIFtyYXgrNDhdCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTAsIHhtbTAKLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMSwgeG1tMQotICAgICAgICBwbWFkZHdkICAgICB4bW0yLCB4bW0yCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTMsIHhtbTMKLQotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCB4bW0xCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTIsIHhtbTMKLSAgICAgICAgcGFkZGQgICAgICAgeG1tNCwgeG1tMAotICAgICAgICBwYWRkZCAgICAgICB4bW00LCB4bW0yCi0KLSAgICAgICAgYWRkICAgICAgICAgcmF4LCAweDQwCi0gICAgICAgIGRlYyAgICAgICAgIHJjeAotICAgICAgICBqYSAgICAgICAgICBORVhUUk9XCi0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMyx4bW00Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTQsOAotICAgICAgICBwYWRkZCAgICAgICB4bW00LHhtbTMKLSAgICAgICAgbW92ZHFhICAgICAgeG1tMyx4bW00Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTQsNAotICAgICAgICBwYWRkZCAgICAgICB4bW00LHhtbTMKLSAgICAgICAgbW92cSAgICAgICAgcmF4LHhtbTQKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBhZGQgcnNwLCAxNgotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3Vuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZ2YXJfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAgICogIHNyY19wdHIsCi07ICAgIGludCAgICAgICAgICAgICBzb3VyY2Vfc3RyaWRlLAotOyAgICB1bnNpZ25lZCBjaGFyICAgKiAgcmVmX3B0ciwKLTsgICAgaW50ICAgICAgICAgICAgIHJlY29uX3N0cmlkZSwKLTsgICAgdW5zaWduZWQgaW50ICAgICogIFNTRSwKLTsgICAgaW50ICAgICAgICAgICAgICogIFN1bQotOykKLWdsb2JhbCBzeW0odnA4X2dldDE2eDE2dmFyX3NzZTIpCi1zeW0odnA4X2dldDE2eDE2dmFyX3NzZTIpOgotICAgIHB1c2ggICAgICAgIHJicAotICAgIG1vdiAgICAgICAgIHJicCwgcnNwCi0gICAgU0hBRE9XX0FSR1NfVE9fU1RBQ0sgNgotICAgIHB1c2ggcmJ4Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO1tzcmNfcHRyXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtbcmVmX3B0cl0KLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgRFdPUkQgUFRSIGFyZygxKSA7W3NvdXJjZV9zdHJpZGVdCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtbcmVjb25fc3RyaWRlXQotCi0gICAgICAgIDsgUHJlZmV0Y2ggZGF0YQotICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICBbcmF4K3JheCoyXQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JzaV0KLSAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyc2krcmF4XQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JzaStyYXgqMl0KLSAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyc2krcmN4XQotICAgICAgICBsZWEgICAgICAgICAgICAgcmJ4LCAgICBbcnNpK3JheCo0XQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieF0KLSAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyYngrcmF4XQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieCtyYXgqMl0KLSAgICAgICAgcHJlZmV0Y2h0MCAgICAgIFtyYngrcmN4XQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgIFtyZHgrcmR4KjJdCi0gICAgICAgIHByZWZldGNodDAgICAgICBbcmRpXQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JkaStyZHhdCi0gICAgICAgIHByZWZldGNodDAgICAgICBbcmRpK3JkeCoyXQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JkaStyY3hdCi0gICAgICAgIGxlYSAgICAgICAgICAgICByYngsICAgIFtyZGkrcmR4KjRdCi0gICAgICAgIHByZWZldGNodDAgICAgICBbcmJ4XQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieCtyZHhdCi0gICAgICAgIHByZWZldGNodDAgICAgICBbcmJ4K3JkeCoyXQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JieCtyY3hdCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTAgZm9yIHVucGFjawotICAgICAgICBweG9yICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tNyBmb3IgYWNjdW11bGF0aW5nIGRpZmZzCi0KLSAgICAgICAgcHhvciAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTYgZm9yIGFjY3VtdWxhdGluZyBzc2UKLSAgICAgICAgbW92ICAgICAgICAgcmN4LCAgICAgICAgICAgIDE2Ci0KLXZhcjE2bG9vcDoKLSAgICAgICAgbW92ZHF1ICAgICAgeG1tMSwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdmRxdSAgICAgIHhtbTIsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcmRpXQotCi0gICAgICAgIHByZWZldGNodDAgICAgICBbcnNpK3JheCo4XQotICAgICAgICBwcmVmZXRjaHQwICAgICAgW3JkaStyZHgqOF0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMgotCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMSwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2toYncgICB4bW00LCAgICAgICAgICAgeG1tMAotCi0KLSAgICAgICAgcHN1YncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcHN1YncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKLQotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMQotICAgICAgICBwbWFkZHdkICAgICB4bW0xLCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTMsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTMKLQotICAgICAgICBhZGQgICAgICAgICByc2ksICAgICAgICAgICAgcmF4Ci0gICAgICAgIGFkZCAgICAgICAgIHJkaSwgICAgICAgICAgICByZHgKLQotICAgICAgICBzdWIgICAgICAgICByY3gsICAgICAgICAgICAgMQotICAgICAgICBqbnogICAgICAgICB2YXIxNmxvb3AKLQotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTEsICAgICAgICAgICB4bW02Ci0gICAgICAgIHB4b3IgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02Ci0KLSAgICAgICAgcHhvciAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcHVucGNrbHdkICAgeG1tNiwgICAgICAgICAgIHhtbTcKLQotICAgICAgICBwdW5wY2tod2QgICB4bW01LCAgICAgICAgICAgeG1tNwotICAgICAgICBwc3JhZCAgICAgICB4bW01LCAgICAgICAgICAgMTYKLQotICAgICAgICBwc3JhZCAgICAgICB4bW02LCAgICAgICAgICAgMTYKLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQotICAgICAgICBwdW5wY2tsZHEgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHB1bnBja2hkcSAgIHhtbTIsICAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW02Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcHVucGNrbGRxICAgeG1tNiwgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwdW5wY2toZHEgICB4bW03LCAgICAgICAgICAgeG1tMAotICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTcsICAgICAgICAgICB4bW02Ci0KLSAgICAgICAgcHNybGRxICAgICAgeG1tMSwgICAgICAgICAgIDgKLSAgICAgICAgcHNybGRxICAgICAgeG1tNiwgICAgICAgICAgIDgKLQotICAgICAgICBwYWRkZCAgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIG1vdiAgICAgICAgIHJheCwgICAgICAgICAgICBhcmcoNSkgO1tTdW1dCi0gICAgICAgIG1vdiAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNCkgO1tTU0VdCi0KLSAgICAgICAgbW92ZCBEV09SRCBQVFIgW3JheF0sICAgICAgIHhtbTcKLSAgICAgICAgbW92ZCBEV09SRCBQVFIgW3JkaV0sICAgICAgIHhtbTEKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIHBvcCByYngKLSAgICBVTlNIQURPV19BUkdTCi0gICAgcG9wICAgICAgICAgcmJwCi0gICAgcmV0Ci0KLQotO3Vuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX3NzZTIKLTsoCi07ICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50IHNyY19zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCByZWZfc3RyaWRlCi07KQotZ2xvYmFsIHN5bSh2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX3NzZTIpCi1zeW0odnA4X2dldDE2eDE2cHJlZF9lcnJvcl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDQKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgc3ViICAgICAgICAgcnNwLCAxNgotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO1tzcmNfcHRyXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtbcmVmX3B0cl0KLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgRFdPUkQgUFRSIGFyZygxKSA7W3NyY19zdHJpZGVdCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtbcmVmX3N0cmlkZV0KLQotICAgICAgICBweG9yICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tMCBmb3IgdW5wYWNrCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW03IGZvciBhY2N1bXVsYXRpbmcgZGlmZnMKLQotICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xlYXIgeG1tNiBmb3IgYWNjdW11bGF0aW5nIHNzZQotICAgICAgICBtb3YgICAgICAgICByY3gsICAgICAgICAgICAgMTYKLQotdmFyMTZwZWxvb3A6Ci0gICAgICAgIG1vdmRxdSAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZkcXUgICAgICB4bW0yLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaV0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0zLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW00LCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2hidyAgIHhtbTMsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgeG1tNCwgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwc3VidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgotICAgICAgICBwc3VidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tNAotCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTMKLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMywgICAgICAgICAgIHhtbTMKLQotICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tMQotICAgICAgICBwYWRkZCAgICAgICB4bW02LCAgICAgICAgICAgeG1tMwotCi0gICAgICAgIGFkZCAgICAgICAgIHJzaSwgICAgICAgICAgICByYXgKLSAgICAgICAgYWRkICAgICAgICAgcmRpLCAgICAgICAgICAgIHJkeAotCi0gICAgICAgIHN1YiAgICAgICAgIHJjeCwgICAgICAgICAgICAxCi0gICAgICAgIGpueiAgICAgICAgIHZhcjE2cGVsb29wCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tNgotICAgICAgICBweG9yICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNgotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01Ci0gICAgICAgIHB1bnBja2x3ZCAgIHhtbTYsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNraHdkICAgeG1tNSwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcHNyYWQgICAgICAgeG1tNSwgICAgICAgICAgIDE2Ci0KLSAgICAgICAgcHNyYWQgICAgICAgeG1tNiwgICAgICAgICAgIDE2Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgbW92ZHFhICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwdW5wY2toZHEgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTAKLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgICAgICA4Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBtb3ZkIERXT1JEIFBUUiBbcnNwXSwgICAgICAgeG1tNyAgO1N1bQotICAgICAgICBtb3ZkIERXT1JEIFBUUiBbcnNwKzRdLCAgICAgeG1tMSAgO1NTRQotCi0gICAgICAgIDsgcmV0dXJuIChTU0UtKChTdW0qU3VtKT4+OCkpOwotICAgICAgICBtb3ZzeGQgICAgICByZHgsIGR3b3JkIHB0ciBbcnNwXQotICAgICAgICBpbXVsICAgICAgICByZHgsIHJkeAotICAgICAgICBzYXIgICAgICAgICByZHgsIDgKLSAgICAgICAgbW92c3hkICAgICAgcmF4LCBkd29yZCBwdHIgW3JzcCArIDRdCi0gICAgICAgIHN1YiAgICAgICAgIHJheCwgcmR4Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIGFkZCByc3AsIDE2Ci0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi0KLTt1bnNpZ25lZCBpbnQgdnA4X2dldDh4OHZhcl9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICAgKiAgc3JjX3B0ciwKLTsgICAgaW50ICAgICAgICAgICAgIHNvdXJjZV9zdHJpZGUsCi07ICAgIHVuc2lnbmVkIGNoYXIgICAqICByZWZfcHRyLAotOyAgICBpbnQgICAgICAgICAgICAgcmVjb25fc3RyaWRlLAotOyAgICB1bnNpZ25lZCBpbnQgICAgKiAgU1NFLAotOyAgICBpbnQgICAgICAgICAgICAgKiAgU3VtCi07KQotZ2xvYmFsIHN5bSh2cDhfZ2V0OHg4dmFyX3NzZTIpCi1zeW0odnA4X2dldDh4OHZhcl9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDYKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgc3ViICAgICAgICAgcnNwLCAxNgotICAgIDsgZW5kIHByb2xvZwotCi0gICAgICAgIG1vdiAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgO1tzcmNfcHRyXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtbcmVmX3B0cl0KLQotICAgICAgICBtb3ZzeGQgICAgICByYXgsICAgICAgICAgICAgRFdPUkQgUFRSIGFyZygxKSA7W3NvdXJjZV9zdHJpZGVdCi0gICAgICAgIG1vdnN4ZCAgICAgIHJkeCwgICAgICAgICAgICBEV09SRCBQVFIgYXJnKDMpIDtbcmVjb25fc3RyaWRlXQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGVhciB4bW0wIGZvciB1bnBhY2sKLSAgICAgICAgcHhvciAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgICAgICAgICA7IGNsZWFyIHhtbTcgZm9yIGFjY3VtdWxhdGluZyBkaWZmcwotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTEsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTEsICAgICAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHN1YnN3ICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEKLQotICAgICAgICBwbWFkZHdkICAgICB4bW0xLCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFJbcnNpICsgcmF4XQotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSW3JkaSArIHJkeF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzdWJzdyAgICAgIHhtbTIsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFJbcnNpICsgcmF4ICogMl0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHggKiAyXQotCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTIsICAgICAgICAgICB4bW0wCi0gICAgICAgIHB1bnBja2xidyAgIHhtbTMsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHN1YnN3ICAgICAgeG1tMiwgICAgICAgICAgIHhtbTMKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTIKLQotICAgICAgICBwbWFkZHdkICAgICB4bW0yLCAgICAgICAgICAgeG1tMgotICAgICAgICBwYWRkZCAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgotCi0KLSAgICAgICAgbGVhICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXggKiAyXQotICAgICAgICBsZWEgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJkeCAqIDJdCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFJbcnNpICsgcmF4XQotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSW3JkaSArIHJkeF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzdWJzdyAgICAgIHhtbTIsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheCAqMl0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHggKjJdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwc3Vic3cgICAgICB4bW0yLCAgICAgICAgICAgeG1tMwotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheCAqIDJdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmR4ICogMl0KLQotCi0gICAgICAgIG1vdnEgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFJbcnNpICsgcmF4XQotICAgICAgICBtb3ZxICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSW3JkaSArIHJkeF0KLQotICAgICAgICBwdW5wY2tsYncgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBwdW5wY2tsYncgICB4bW0zLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzdWJzdyAgICAgIHhtbTIsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBhZGR3ICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCi0KLSAgICAgICAgcG1hZGR3ZCAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheCAqMl0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHggKjJdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwc3Vic3cgICAgICB4bW0yLCAgICAgICAgICAgeG1tMwotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0KLQotICAgICAgICBsZWEgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheCAqIDJdCi0gICAgICAgIGxlYSAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmR4ICogMl0KLQotICAgICAgICBtb3ZxICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSW3JzaSArIHJheF0KLSAgICAgICAgbW92cSAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUltyZGkgKyByZHhdCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMiwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgeG1tMywgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwc3Vic3cgICAgICB4bW0yLCAgICAgICAgICAgeG1tMwotICAgICAgICBwYWRkdyAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIHBtYWRkd2QgICAgIHhtbTIsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0KLQotICAgICAgICBtb3ZkcWEgICAgICB4bW02LCAgICAgICAgICAgeG1tNwotICAgICAgICBwdW5wY2tsd2QgICB4bW02LCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHB1bnBja2h3ZCAgIHhtbTcsICAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTIsICAgICAgICAgICB4bW0xCi0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcHVucGNrbGRxICAgeG1tMSwgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwdW5wY2toZHEgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotCi0gICAgICAgIHBhZGRkICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHVucGNraGRxICAgeG1tNywgICAgICAgICAgIHhtbTAKLSAgICAgICAgcGFkZHcgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTYsICAgICAgICAgICA4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgeG1tNywgICAgICAgICAgIHhtbTYKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBtb3YgICAgICAgICByYXgsICAgICAgICAgICAgYXJnKDUpIDtbU3VtXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDQpIDtbU1NFXQotCi0gICAgICAgIG1vdnEgICAgICAgIHJkeCwgICAgICAgICAgICB4bW03Ci0gICAgICAgIG1vdnN4ICAgICAgIHJjeCwgICAgICAgICAgICBkeAotCi0gICAgICAgIG1vdiAgZHdvcmQgcHRyIFtyYXhdLCAgICAgICBlY3gKLSAgICAgICAgbW92ZCBEV09SRCBQVFIgW3JkaV0sICAgICAgIHhtbTEKLQotICAgIDsgYmVnaW4gZXBpbG9nCi0gICAgYWRkIHJzcCwgMTYKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCi07ICAgIGludCAgeG9mZnNldCwKLTsgICAgaW50ICB5b2Zmc2V0LAotOyAgICBpbnQgKnN1bSwKLTsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkOzsKLTsKLTspCi1nbG9iYWwgc3ltKHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTIpCi1zeW0odnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA5Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgcHVzaCByYngKLSAgICA7IGVuZCBwcm9sb2cKLQotICAgICAgICBweG9yICAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldICA7IHJvdW5kaW5nCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KLQotICAgICAgICBsZWEgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIFtHTE9CQUwodnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NlMildCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSAgICAgOyB4b2Zmc2V0Ci0KLSAgICAgICAgY21wICAgICAgICAgICAgIHJheCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICA7IHNraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgICAgIGplICAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTJfc3Bfb25seQotCi0gICAgICAgIHNobCAgICAgICAgICAgICByYXgsICAgICAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgOyBwb2ludCB0byBmaWx0ZXIgY29lZmYgd2l0aCB4b2Zmc2V0Ci0gICAgICAgIGxlYSAgICAgICAgICAgICByYXgsICAgICAgICAgICAgW3JheCArIHJjeF0gICAgICAgICAgOyBIRmlsdGVyCi0KLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDYpICAgICA7IHlvZmZzZXQKLQotICAgICAgICBjbXAgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIDsgc2tpcCBzZWNvbmRfcGFzcyBmaWx0ZXIgaWYgeW9mZnNldD0wCi0gICAgICAgIGplICAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTJfZnBfb25seQotCi0gICAgICAgIHNobCAgICAgICAgICAgICByZHgsICAgICAgICAgICAgNQotICAgICAgICBsZWEgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIFtyZHggKyByY3hdICAgICAgICAgIDsgVkZpbHRlcgotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICAgO3JlZl9wdHIKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgICAgICAgICAgICAgICA7c3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgICAgIDtIZWlnaHQKLQotICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTEsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2krMV0gICAgOwotCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMSwgICAgICAgICAgIFtyYXhdICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wCi0gICAgICAgIHBtdWxsdyAgICAgICAgICB4bW0zLCAgICAgICAgICAgW3JheCsxNl0gICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0ICAgICA7Ci0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMQotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYngsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYnhdCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICAgICAgbW92c3hkICAgICAgICAgIHI5LCAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0lZW5kaWYKLQotZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX2xvb3A6Ci0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzFdICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcG11bGx3ICAgICAgICAgIHhtbTEsICAgICAgICAgICBbcmF4XSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgICAgICB4bW0zLCAgICAgICAgICAgW3JheCsxNl0gICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdCAgICA7Ci0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtdWxsdyAgICAgICAgICB4bW0zLCAgICAgICAgICAgW3JkeF0gICAgICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgICAgICB4bW0xLCAgICAgICAgICAgW3JkeCsxNl0gICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW00ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdCAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0gICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmJ4XSAgICAgICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0lZWxzZQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByOV0KLSVlbmRpZgotCi0gICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGpueiAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTJfbG9vcCAgICAgICA7Ci0KLSAgICAgICAgam1wICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZQotCi1maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTJfc3Bfb25seToKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDYpICAgICA7IHlvZmZzZXQKLQotICAgICAgICBjbXAgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIDsgc2tpcCBhbGwgaWYgYm90aCB4b2Zmc2V0PTAgYW5kIHlvZmZzZXQ9MAotICAgICAgICBqZSAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyX2Z1bGxfcGl4ZWwKLQotICAgICAgICBzaGwgICAgICAgICAgICAgcmR4LCAgICAgICAgICAgIDUKLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICBbcmR4ICsgcmN4XSAgICAgICAgICA7IFZGaWx0ZXIKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgIDtyZWZfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpICAgICAgICAgICAgICAgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpICAgICA7SGVpZ2h0Ci0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKLQotICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTEsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgICA7Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYngsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4XQotCi1maWx0ZXJfYmxvY2syZF9iaWxfc3Bfb25seV9sb29wOgotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMKLQotICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMSwgICAgICAgICAgIFtyZHhdICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMywgICAgICAgICAgIFtyZHgrMTZdICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICAgOwotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJieF0gICAgICAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLQotICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBqbnogICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3NwX29ubHlfbG9vcCAgICAgICA7Ci0KLSAgICAgICAgam1wICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZQotCi1maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTJfZnVsbF9waXhlbDoKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYngsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7Ci0KLWZpbHRlcl9ibG9jazJkX2JpbF9mdWxsX3BpeGVsX2xvb3A6Ci0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2ldICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXhdICAgICAgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHJieF0gICAgICAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLQotICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBqbnogICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX2Z1bGxfcGl4ZWxfbG9vcCAgICAgICA7Ci0KLSAgICAgICAgam1wICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZQotCi1maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTJfZnBfb25seToKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYngsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLQotZmlsdGVyX2Jsb2NrMmRfYmlsX2ZwX29ubHlfbG9vcDoKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTEsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzFdICAgICA7Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBtdWxsdyAgICAgICAgICB4bW0xLCAgICAgICAgICAgW3JheF0gICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICAgOwotICAgICAgICBwbXVsbHcgICAgICAgICAgeG1tMywgICAgICAgICAgIFtyYXgrMTZdICAgICAgICAgICAgIDsKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW00ICA7Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdCAgICA7Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0gICAgIDsKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMSAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmR4XQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByYnhdICAgICAgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgam56ICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF9mcF9vbmx5X2xvb3AgICAgICAgOwotCi0gICAgICAgIGptcCAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKLQotZmlsdGVyX2Jsb2NrMmRfYmlsX3ZhcmlhbmNlOgotICAgICAgICBtb3ZkcTJxICAgICAgICAgbW02LCAgICAgICAgICAgIHhtbTYgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZkcTJxICAgICAgICAgbW03LCAgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmxkcSAgICAgICAgICB4bW02LCAgICAgICAgICAgOAotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNywgICAgICAgICAgIDgKLQotICAgICAgICBtb3ZkcTJxICAgICAgICAgbW0yLCAgICAgICAgICAgIHhtbTYKLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tMywgICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tNywgICAgICAgICAgICBtbTMKLQotICAgICAgICBweG9yICAgICAgICAgICAgbW0zLCAgICAgICAgICAgIG1tMyAgICAgICAgICAgICAgICAgOwotICAgICAgICBweG9yICAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tMiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHB1bnBja2x3ZCAgICAgICBtbTIsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHB1bnBja2h3ZCAgICAgICBtbTMsICAgICAgICAgICAgbW02ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIG1tNiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JscSAgICAgICAgICAgbW02LCAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgOwotICAgICAgICBwYWRkZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmFkICAgICAgICAgICBtbTIsICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tNCwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tNCwgICAgICAgICAgICBtbTcgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZyg3KSA7IHN1bQotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZyg4KSA7IHN1bXNxdWFyZWQKLQotICAgICAgICBtb3ZkICAgICAgICAgICAgW3JzaV0sICAgICAgICAgIG1tMiAgICA7IHhzdW0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgICAgICBtbTQgICAgOyB4eHN1bQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmJ4Ci0gICAgcG9wIHJkaQotICAgIHBvcCByc2kKLSAgICBSRVNUT1JFX0dPVAotICAgIFJFU1RPUkVfWE1NCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi0KLTt2b2lkIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2U4eF9oX3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgaW50IEhlaWdodCwKLTsgICAgaW50ICpzdW0sCi07ICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotOykKLWdsb2JhbCBzeW0odnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTh4X2hfc3NlMikKLXN5bSh2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKToKLSAgICBwdXNoICAgICAgICByYnAKLSAgICBtb3YgICAgICAgICByYnAsIHJzcAotICAgIFNIQURPV19BUkdTX1RPX1NUQUNLIDcKLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSVpZiBBQklfSVNfMzJCSVQ9MAotICAgIG1vdnN4ZCAgICAgICAgICByOCwgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQotICAgIG1vdnN4ZCAgICAgICAgICByOSwgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZQotJWVuZGlmCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgIGVycm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7ICBzc2UgZWFjY3VtdWxhdG9yCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDtyZWZfcHRyICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgO3NyY19wdHIgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtIZWlnaHQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgOyAgeG1tNSA9IHMwLHMxLHMyLi5zOAotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzFdICAgOyAgeG1tMyA9IHMxLHMyLHMzLi5zOQotICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSA9IGF2Zyh4bW0xLHhtbTMpIGhvcml6b250YWwgbGluZSAxCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lICAgIDsgIG5leHQgc291cmNlCi0lZWxzZQotICAgICAgICBhZGQgICAgICAgICAgICAgcnNpLCByOAotJWVuZGlmCi0KLXZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2U4eF9oXzE6Ci0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTEsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0gICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFIgW3JzaSsxXSAgIDsKLSAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yICAgICAgICAgICAgICAgIDsgIHhtbTEgPSBhdmcoeG1tMSx4bW0zKSBob3Jpem9udGFsIGxpbmUgaSsxCi0KLSAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgIDsgIHhtbSA9IHZlcnRpY2FsIGF2ZXJhZ2Ugb2YgdGhlIGFib3ZlCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW01ID0gd29yZHMgb2YgYWJvdmUKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgOyAgeG1tMyA9IGQwLGQxLGQyLi5kOAotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tMyA9IHdvcmRzIG9mIGFib3ZlCi0KLSAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgLT0geG1tMwotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNiArPSBhY2N1bXVsYXRlZCBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01ICAgICAgICAgICAgICAgIDsgIHhtbTUgKj0geG1tNQotICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNyArPSBhY2N1bXVsYXRlZCBzcXVhcmUgY29sdW1uIGRpZmZlcmVuY2VzCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgIDsgIHNhdmUgeG1tMSBmb3IgdXNlIG9uIHRoZSBuZXh0IHJvdwotCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgICAgICBlc2ksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZSAgICA7ICBuZXh0IHNvdXJjZQotICAgICAgICBhZGQgICAgICAgICAgICAgZWRpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUgICAgOyAgbmV4dCBkZXN0aW5hdGlvbgotJWVsc2UKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgcjgKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJkaSwgcjkKLSVlbmRpZgotCi0gICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGpueiAgICAgICAgICAgICB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF8xICAgICA7Ci0KLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNiwgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNywgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgICAgIDgKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgICAgICA4Ci0KLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tMiwgICAgICAgICAgICB4bW02Ci0gICAgICAgIG1vdmRxMnEgICAgICAgICBtbTMsICAgICAgICAgICAgeG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tod2QgICAgICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tNiwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JhZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmxxICAgICAgICAgICBtbTQsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNSkgOyBzdW0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNikgOyBzdW1zcXVhcmVkCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyc2ldLCAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotOyAgICBpbnQgKnN1bSwKLTsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi07KQotZ2xvYmFsIHN5bSh2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMikKLXN5bSh2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgIGVycm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7ICBzc2UgZWFjY3VtdWxhdG9yCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDtyZWZfcHRyICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgO3NyY19wdHIgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtIZWlnaHQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7c3JjX3BpeGVsc19wZXJfbGluZQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMywgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2krMV0KLSAgICAgICAgcGF2Z2IgICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zICAgICAgICAgICAgICAgIDsgIHhtbTUgPSBhdmcoeG1tMSx4bW0zKSBob3Jpem9udGFsIGxpbmUgMQotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0KLQotdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTE2eF9oXzE6Ci0gICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0xLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0gICAgIDsKLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTIsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdICAgOwotICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIgICAgICAgICAgICAgICAgOyAgeG1tMSA9IGF2Zyh4bW0xLHhtbTMpIGhvcml6b250YWwgbGluZSBpKzEKLQotICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTEgICAgICAgICAgICAgICAgOyAgeG1tID0gdmVydGljYWwgYXZlcmFnZSBvZiB0aGUgYWJvdmUKLQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgIHhtbTUgPSB3b3JkcyBvZiBhYm92ZQotICAgICAgICBwdW5wY2toYncgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTAKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpXSAgICAgOyAgeG1tMyA9IGQwLGQxLGQyLi5kNwotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tMyA9IHdvcmRzIG9mIGFib3ZlCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICA7ICB4bW01IC09IHhtbTMKLQotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMAotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTMKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNiArPSBhY2N1bXVsYXRlZCBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW01ICo9IHhtbTUKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTQsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW03ICs9IGFjY3VtdWxhdGVkIHNxdWFyZSBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW00Ci0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0xICAgICAgICAgICAgICAgIDsgIHNhdmUgeG1tMSBmb3IgdXNlIG9uIHRoZSBuZXh0IHJvdwotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmR4XQotCi0gICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGpueiAgICAgICAgICAgICB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfMSAgICAgOwotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHVucGNraHdkICAgeG1tMSwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tMCwgICAgICAgICAgIDE2Ci0gICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgICAgICAgICAxNgotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgICAgICB4bW01Ci0gICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICB4bW01Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgICAgICA4Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDUpIDtbU3VtXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDtbU1NFXQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2ldLCAgICAgICB4bW0wCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgICB4bW02Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyCi07KAotOyAgICB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotOyAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLTsgICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCi07ICAgIGludCAqc3VtLAotOyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKLTspCi1nbG9iYWwgc3ltKHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2U4eF9oX3NzZTIpCi1zeW0odnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICBtb3ZzeGQgICAgICAgICAgcjgsIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICBtb3ZzeGQgICAgICAgICAgcjksIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUKLSVlbmRpZgotCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7ICBlcnJvciBhY2N1bXVsYXRvcgotICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAgc3NlIGVhY2N1bXVsYXRvcgotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7cmVmX3B0ciAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7SGVpZ2h0ICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSA7cmVmX3BpeGVsc19wZXJfbGluZQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7Ci12cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlOHhfaF8xOgotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgOyAgeG1tNSA9IHMwLHMxLHMyLi5zOAotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpK3JheF0gOyAgeG1tMyA9IHMxLHMyLHMzLi5zOQotCi0gICAgICAgIHBhdmdiICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICA7ICB4bW01ID0gYXZnKHhtbTEseG1tMykKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgIHhtbTUgPSB3b3JkcyBvZiBhYm92ZQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICA7ICB4bW0zID0gZDAsZDEsZDIuLmQ4Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW0zID0gd29yZHMgb2YgYWJvdmUKLQotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSAtPSB4bW0zCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW02ICs9IGFjY3VtdWxhdGVkIGNvbHVtbiBkaWZmZXJlbmNlcwotICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNSAqPSB4bW01Ci0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW03ICs9IGFjY3VtdWxhdGVkIHNxdWFyZSBjb2x1bW4gZGlmZmVyZW5jZXMKLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICAgICAgZXNpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUgICAgOyAgbmV4dCBzb3VyY2UKLSAgICAgICAgYWRkICAgICAgICAgICAgIGVkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgIDsgIG5leHQgZGVzdGluYXRpb24KLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgICAgICByc2ksIHI4Ci0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksIHI5Ci0lZW5kaWYKLQotICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgOwotICAgICAgICBqbnogICAgICAgICAgICAgdnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfMSAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNiwgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNywgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgICAgIDgKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgICAgICA4Ci0KLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tMiwgICAgICAgICAgICB4bW02Ci0gICAgICAgIG1vdmRxMnEgICAgICAgICBtbTMsICAgICAgICAgICAgeG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tod2QgICAgICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tNiwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JhZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmxxICAgICAgICAgICBtbTQsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNSkgOyBzdW0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNikgOyBzdW1zcXVhcmVkCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyc2ldLCAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotOyAgICBpbnQgKnN1bSwKLTsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi07KQotZ2xvYmFsIHN5bSh2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMikKLXN5bSh2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgIGVycm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7ICBzc2UgZWFjY3VtdWxhdG9yCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApICAgICAgICAgICAgICA7cmVmX3B0cgotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpICAgICAgICAgICAgICA7c3JjX3B0cgotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmN4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNCkgICAgO0hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByYXggICAgICAgICAgXQotICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAKLQotdnA4X2hhbGZfdmVydF92YXJpYW5jZTE2eF9oXzE6Ci0gICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0zLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KLQotICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSA9IGF2Zyh4bW0xLHhtbTMpCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW00LCAgICAgICAgICAgeG1tNQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTAKLSAgICAgICAgcHVucGNraGJ3ICAgICAgIHhtbTQsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMgotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMiwgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNCwgICAgICAgICAgIHhtbTIKLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNiArPSBhY2N1bXVsYXRlZCBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW01ICo9IHhtbTUKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTQsICAgICAgICAgICB4bW00Ci0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW03ICs9IGFjY3VtdWxhdGVkIHNxdWFyZSBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW00Ci0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTUsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4XQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByZHhdCi0KLSAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxCi0gICAgICAgIGpueiAgICAgICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfMQotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHVucGNraHdkICAgeG1tMSwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tMCwgICAgICAgICAgIDE2Ci0gICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgICAgICAgICAxNgotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgICAgICB4bW01Ci0gICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICB4bW01Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgICAgICA4Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDUpIDtbU3VtXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDtbU1NFXQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2ldLCAgICAgICB4bW0wCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgICB4bW02Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi07dm9pZCB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMgotOygKLTsgICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLTsgICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi07ICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi07ICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotOyAgICBpbnQgKnN1bSwKLTsgICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi07KQotZ2xvYmFsIHN5bSh2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMikKLXN5bSh2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgR0VUX0dPVCAgICAgcmJ4Ci0gICAgcHVzaCByc2kKLSAgICBwdXNoIHJkaQotICAgIDsgZW5kIHByb2xvZwotCi0laWYgQUJJX0lTXzMyQklUPTAKLSAgICBtb3ZzeGQgICAgICAgICAgcjgsIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICBtb3ZzeGQgICAgICAgICAgcjksIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUKLSVlbmRpZgotCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNiAgICAgICAgICAgICAgICA7ICBlcnJvciBhY2N1bXVsYXRvcgotICAgICAgICBweG9yICAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTcgICAgICAgICAgICAgICAgOyAgc3NlIGVhY2N1bXVsYXRvcgotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSA7cmVmX3B0ciAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpIDtzcmNfcHRyICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSA7SGVpZ2h0ICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsKLXZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlOHhfaF8xOgotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpXSAgICAgOyAgeG1tNSA9IHMwLHMxLHMyLi5zOAotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tMywgICAgICAgICAgIFFXT1JEIFBUUiBbcnNpKzFdICAgOyAgeG1tMyA9IHMxLHMyLHMzLi5zOQotCi0gICAgICAgIHBhdmdiICAgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tMyAgICAgICAgICAgICAgICA7ICB4bW01ID0gYXZnKHhtbTEseG1tMykKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTUsICAgICAgICAgICB4bW0wICAgICAgICAgICAgICAgIDsgIHhtbTUgPSB3b3JkcyBvZiBhYm92ZQotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICA7ICB4bW0zID0gZDAsZDEsZDIuLmQ4Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW0zID0gd29yZHMgb2YgYWJvdmUKLQotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSAtPSB4bW0zCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW02ICs9IGFjY3VtdWxhdGVkIGNvbHVtbiBkaWZmZXJlbmNlcwotICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNSAqPSB4bW01Ci0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW03ICs9IGFjY3VtdWxhdGVkIHNxdWFyZSBjb2x1bW4gZGlmZmVyZW5jZXMKLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICAgICAgZXNpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUgICAgOyAgbmV4dCBzb3VyY2UKLSAgICAgICAgYWRkICAgICAgICAgICAgIGVkaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lICAgIDsgIG5leHQgZGVzdGluYXRpb24KLSVlbHNlCi0gICAgICAgIGFkZCAgICAgICAgICAgICByc2ksIHI4Ci0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksIHI5Ci0lZW5kaWYKLSAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgam56ICAgICAgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlOHhfaF8xICAgICAgICA7Ci0KLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNiwgICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tNywgICAgICAgICAgICB4bW03ICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JsZHEgICAgICAgICAgeG1tNiwgICAgICAgICAgIDgKLSAgICAgICAgcHNybGRxICAgICAgICAgIHhtbTcsICAgICAgICAgICA4Ci0KLSAgICAgICAgbW92ZHEycSAgICAgICAgIG1tMiwgICAgICAgICAgICB4bW02Ci0gICAgICAgIG1vdmRxMnEgICAgICAgICBtbTMsICAgICAgICAgICAgeG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTcsICAgICAgICAgICAgbW0zCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMywgICAgICAgICAgICBtbTMgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcHhvciAgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwdW5wY2tsd2QgICAgICAgbW0yLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotICAgICAgICBwdW5wY2tod2QgICAgICAgbW0zLCAgICAgICAgICAgIG1tNiAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTIsICAgICAgICAgICAgbW0zICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgICAgICBtbTYsICAgICAgICAgICAgbW0yICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgcHNybHEgICAgICAgICAgIG1tNiwgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgcGFkZGQgICAgICAgICAgIG1tMiwgICAgICAgICAgICBtbTYgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICBwc3JhZCAgICAgICAgICAgbW0yLCAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgOwotICAgICAgICBtb3ZxICAgICAgICAgICAgbW00LCAgICAgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIHBzcmxxICAgICAgICAgICBtbTQsICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHBhZGRkICAgICAgICAgICBtbTQsICAgICAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoNSkgOyBzdW0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoNikgOyBzdW1zcXVhcmVkCi0KLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyc2ldLCAgICAgICAgICBtbTIgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92ZCAgICAgICAgICAgIFtyZGldLCAgICAgICAgICBtbTQgICAgICAgICAgICAgICAgIDsKLQotCi0gICAgOyBiZWdpbiBlcGlsb2cKLSAgICBwb3AgcmRpCi0gICAgcG9wIHJzaQotICAgIFJFU1RPUkVfR09UCi0gICAgVU5TSEFET1dfQVJHUwotICAgIHBvcCAgICAgICAgIHJicAotICAgIHJldAotCi07dm9pZCB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgaW50IEhlaWdodCwKLTsgICAgaW50ICpzdW0sCi07ICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotOykKLWdsb2JhbCBzeW0odnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyKQotc3ltKHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlMTZ4X2hfc3NlMik6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA3Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02ICAgICAgICAgICAgICAgIDsgIGVycm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNyAgICAgICAgICAgICAgICA7ICBzc2UgZWFjY3VtdWxhdG9yCi0gICAgICAgIG1vdiAgICAgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDApIDtyZWZfcHRyICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBhcmcoMikgO3NyY19wdHIgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpIDtIZWlnaHQgICAgICAgICAgICAgIDsKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJheCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICA7c3JjX3BpeGVsc19wZXJfbGluZQotCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7Ci0KLXZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlMTZ4X2hfMToKLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTUsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXSAgICAgOyAgeG1tNSA9IHMwLHMxLHMyLi5zMTUKLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTMsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdICAgOyAgeG1tMyA9IHMxLHMyLHMzLi5zMTYKLQotICAgICAgICBwYXZnYiAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSA9IGF2Zyh4bW0xLHhtbTMpCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tNQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTAgICAgICAgICAgICAgICAgOyAgeG1tNSA9IHdvcmRzIG9mIGFib3ZlCi0gICAgICAgIHB1bnBja2hidyAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldICAgICA7ICB4bW0zID0gZDAsZDEsZDIuLmQ3Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMCAgICAgICAgICAgICAgICA7ICB4bW0zID0gd29yZHMgb2YgYWJvdmUKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTIsICAgICAgICAgICBRV09SRCBQVFIgW3JkaSs4XQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTAKLQotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTMgICAgICAgICAgICAgICAgOyAgeG1tNSAtPSB4bW0zCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTUgICAgICAgICAgICAgICAgOyAgeG1tNiArPSBhY2N1bXVsYXRlZCBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW01LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW01ICo9IHhtbTUKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNSAgICAgICAgICAgICAgICA7ICB4bW03ICs9IGFjY3VtdWxhdGVkIHNxdWFyZSBjb2x1bW4gZGlmZmVyZW5jZXMKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4XQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByZHhdCi0KLSAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgam56ICAgICAgICAgICAgIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlMTZ4X2hfMSAgICAgICAgOwotCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHVucGNraHdkICAgeG1tMSwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tMCwgICAgICAgICAgIDE2Ci0gICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgICAgICAgICAxNgotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgICAgICB4bW01Ci0gICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICB4bW01Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgICAgICA4Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDUpIDtbU3VtXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDYpIDtbU1NFXQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2ldLCAgICAgICB4bW0wCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgICB4bW02Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotU0VDVElPTl9ST0RBVEEKLTsgICAgc2hvcnQgeG1tX2JpX3JkWzhdID0geyA2NCwgNjQsIDY0LCA2NCw2NCwgNjQsIDY0LCA2NH07Ci1hbGlnbiAxNgoteG1tX2JpX3JkOgotICAgIHRpbWVzIDggZHcgNjQKLWFsaWduIDE2Ci12cDhfYmlsaW5lYXJfZmlsdGVyc19zc2UyOgotICAgIGR3IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLSAgICBkdyAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgZHcgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIKLSAgICBkdyA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OAotICAgIGR3IDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0Ci0gICAgZHcgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAKLSAgICBkdyAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDk2LCA5NiwgOTYsIDk2LCA5NiwgOTYsIDk2LCA5NgotICAgIGR3IDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIKZGlmZiAtLWdpdCBhL3ZwOC9lbmNvZGVyL3g4Ni92YXJpYW5jZV9pbXBsX3Nzc2UzLmFzbSBiL3ZwOC9lbmNvZGVyL3g4Ni92YXJpYW5jZV9pbXBsX3Nzc2UzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwZmVmOS4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2VfaW1wbF9zc3NlMy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotJWluY2x1ZGUgInZweF9wb3J0cy94ODZfYWJpX3N1cHBvcnQuYXNtIgotCi0lZGVmaW5lIHhtbV9maWx0ZXJfc2hpZnQgICAgICAgICAgICA3Ci0KLQotO3ZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTMKLTsoCi07ICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi07ICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotOyAgICB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotOyAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLTsgICAgdW5zaWduZWQgaW50IEhlaWdodCwKLTsgICAgaW50ICB4b2Zmc2V0LAotOyAgICBpbnQgIHlvZmZzZXQsCi07ICAgIGludCAqc3VtLAotOyAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQ7OwotOwotOykKLTtOb3RlOiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50IGF0IG9mZnNldD0wIGlzIDEyOC4gU2luY2UgdGhlIHNlY29uZCByZWdpc3RlcgotO2ZvciBQbWFkZHVic3cgaXMgc2lnbmVkIGJ5dGVzLCB3ZSBtdXN0IGNhbGN1bGF0ZSB6ZXJvIG9mZnNldCBzZXBlcmF0ZWx5LgotZ2xvYmFsIHN5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlMykKLXN5bSh2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlMyk6Ci0gICAgcHVzaCAgICAgICAgcmJwCi0gICAgbW92ICAgICAgICAgcmJwLCByc3AKLSAgICBTSEFET1dfQVJHU19UT19TVEFDSyA5Ci0gICAgU0FWRV9YTU0KLSAgICBHRVRfR09UICAgICByYngKLSAgICBwdXNoIHJzaQotICAgIHB1c2ggcmRpCi0gICAgOyBlbmQgcHJvbG9nCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW02Ci0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tNwotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByY3gsICAgICAgICAgICAgW0dMT0JBTCh2cDhfYmlsaW5lYXJfZmlsdGVyc19zc3NlMyldCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg1KSAgICAgOyB4b2Zmc2V0Ci0KLSAgICAgICAgY21wICAgICAgICAgICAgIHJheCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICA7IHNraXAgZmlyc3RfcGFzcyBmaWx0ZXIgaWYgeG9mZnNldD0wCi0gICAgICAgIGplICAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyX3Nzc2UzX3NwX29ubHkKLQotICAgICAgICBzaGwgICAgICAgICAgICAgcmF4LCAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgIDsgcG9pbnQgdG8gZmlsdGVyIGNvZWZmIHdpdGggeG9mZnNldAotICAgICAgICBsZWEgICAgICAgICAgICAgcmF4LCAgICAgICAgICAgIFtyYXggKyByY3hdICAgICAgICAgIDsgSEZpbHRlcgotCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByZHgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg2KSAgICAgOyB5b2Zmc2V0Ci0KLSAgICAgICAgY21wICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICA7IHNraXAgc2Vjb25kX3Bhc3MgZmlsdGVyIGlmIHlvZmZzZXQ9MAotICAgICAgICBqZSAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19mcF9vbmx5Ci0KLSAgICAgICAgc2hsICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICA0Ci0gICAgICAgIGxlYSAgICAgICAgICAgICByZHgsICAgICAgICAgICAgW3JkeCArIHJjeF0gICAgICAgICAgOyBWRmlsdGVyCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAotCi0gICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0wLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaV0KLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpKzFdCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBwdW5wY2toYncgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTAsICAgICAgICAgICBbcmF4XQotICAgICAgICBwbWFkZHVic3cgICAgICAgeG1tMiwgICAgICAgICAgIFtyYXhdCi0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTAsICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQotICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQKLSAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0yCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0lZWxzZQotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjgsICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHI5LCAgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHI4XQotJWVuZGlmCi0KLWZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTNfbG9vcDoKLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMiwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2krMV0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW0xCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0yCi0gICAgICAgIHB1bnBja2hidyAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMgotICAgICAgICBwbWFkZHVic3cgICAgICAgeG1tMSwgICAgICAgICAgIFtyYXhdCi0gICAgICAgIHBtYWRkdWJzdyAgICAgICB4bW0zLCAgICAgICAgICAgW3JheF0KLQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIFtHTE9CQUwoeG1tX2JpX3JkKV0KLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTMsICAgICAgICAgICBbR0xPQkFMKHhtbV9iaV9yZCldCi0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdAotICAgICAgICBwc3JhdyAgICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbV9maWx0ZXJfc2hpZnQKLSAgICAgICAgcGFja3Vzd2IgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbTIKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcHVucGNraGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBtYWRkdWJzdyAgICAgICB4bW0yLCAgICAgICAgICAgW3JkeF0KLSAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTMsICAgICAgICAgICBbcmR4XQotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMywgICAgICAgICAgIFtHTE9CQUwoeG1tX2JpX3JkKV0KLSAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0xLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW00LCAgICAgICAgICAgeG1tNAotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTQKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgICAgICBRV09SRCBQVFIgW3JkaSs4XQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTQKLQotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW01Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMgotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTMKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tMwotICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0zCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgICAgICAgYWRkICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDEpICAgICA7cmVmX3BpeGVsc19wZXJfbGluZQotICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0lZWxzZQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByOF0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcjldCi0lZW5kaWYKLQotICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEKLSAgICAgICAgam56ICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTNfbG9vcAotCi0gICAgICAgIGptcCAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKLQotZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19zcF9vbmx5OgotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoNikgICAgIDsgeW9mZnNldAotCi0gICAgICAgIGNtcCAgICAgICAgICAgICByZHgsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgOyBCb3RoIHhvZmZzZXQgPTAgYW5kIHlvZmZzZXQ9MAotICAgICAgICBqZSAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19mdWxsX3BpeGVsCi0KLSAgICAgICAgc2hsICAgICAgICAgICAgIHJkeCwgICAgICAgICAgICA0Ci0gICAgICAgIGxlYSAgICAgICAgICAgICByZHgsICAgICAgICAgICAgW3JkeCArIHJjeF0gICAgICAgICAgOyBWRmlsdGVyCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmF4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgbW92ZHF1ICAgICAgICAgIHhtbTEsICAgICAgICAgICBYTU1XT1JEIFBUUiBbcnNpXQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotJWlmIEFCSV9JU18zMkJJVD0wCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByOSwgICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSA7c3JjX3BpeGVsc19wZXJfbGluZQotJWVuZGlmCi0KLSAgICAgICAgbGVhICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBbcnNpICsgcmF4XQotCi1maWx0ZXJfYmxvY2syZF9iaWxfc3Bfb25seV9sb29wOgotICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMywgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdmRxYSAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTMKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMKLSAgICAgICAgcHVucGNraGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBtYWRkdWJzdyAgICAgICB4bW0xLCAgICAgICAgICAgW3JkeF0KLSAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTIsICAgICAgICAgICBbcmR4XQotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMiwgICAgICAgICAgIFtHTE9CQUwoeG1tX2JpX3JkKV0KLSAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0zLCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGldCi0gICAgICAgIHB4b3IgICAgICAgICAgICB4bW00LCAgICAgICAgICAgeG1tNAotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMywgICAgICAgICAgIHhtbTQKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTUsICAgICAgICAgICBRV09SRCBQVFIgW3JkaSs4XQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tNSwgICAgICAgICAgIHhtbTQKLQotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTMKLSAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTIsICAgICAgICAgICB4bW01Ci0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tMgotICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTEKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0yCi0KLSAgICAgICAgbW92ZHFhICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0wCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKLQotJWlmIEFCSV9JU18zMkJJVAotICAgICAgICBhZGQgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgICAgIDtzcmNfcGl4ZWxzX3Blcl9saW5lCi0lZWxzZQotICAgICAgICBsZWEgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIFtyZGkgKyByOV0KLSVlbmRpZgotCi0gICAgICAgIHN1YiAgICAgICAgICAgICByY3gsICAgICAgICAgICAgMQotICAgICAgICBqbnogICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3NwX29ubHlfbG9vcAotCi0gICAgICAgIGptcCAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2UKLQotZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlM19mdWxsX3BpeGVsOgotICAgICAgICBtb3YgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIGFyZygwKSAgICAgICAgICAgICAgIDtyZWZfcHRyCi0gICAgICAgIG1vdiAgICAgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDIpICAgICAgICAgICAgICAgO3NyY19wdHIKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJjeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDQpICAgICA7SGVpZ2h0Ci0gICAgICAgIG1vdnN4ZCAgICAgICAgICByYXgsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygxKSAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbW92c3hkICAgICAgICAgIHJkeCwgICAgICAgICAgICBkd29yZCBwdHIgYXJnKDMpICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQotICAgICAgICBweG9yICAgICAgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTAKLQotZmlsdGVyX2Jsb2NrMmRfYmlsX2Z1bGxfcGl4ZWxfbG9vcDoKLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTEsICAgICAgICAgICBRV09SRCBQVFIgW3JzaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTEsICAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICAgICAgUVdPUkQgUFRSIFtyc2krOF0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTIsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgICAgIHhtbTMsICAgICAgICAgICBRV09SRCBQVFIgW3JkaV0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0wCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW00LCAgICAgICAgICAgUVdPUkQgUFRSIFtyZGkrOF0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIHhtbTQsICAgICAgICAgICB4bW0wCi0KLSAgICAgICAgcHN1YncgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0yLCAgICAgICAgICAgeG1tNAotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBtYWRkd2QgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMQotICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMiwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcGFkZGQgICAgICAgICAgIHhtbTcsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMgotCi0gICAgICAgIGxlYSAgICAgICAgICAgICByc2ksICAgICAgICAgICAgW3JzaSArIHJheF0gICAgICAgICAgO3JlZl9waXhlbHNfcGVyX2xpbmUKLSAgICAgICAgbGVhICAgICAgICAgICAgIHJkaSwgICAgICAgICAgICBbcmRpICsgcmR4XSAgICAgICAgICA7c3JjX3BpeGVsc19wZXJfbGluZQotICAgICAgICBzdWIgICAgICAgICAgICAgcmN4LCAgICAgICAgICAgIDEKLSAgICAgICAgam56ICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF9mdWxsX3BpeGVsX2xvb3AKLQotICAgICAgICBqbXAgICAgICAgICAgICAgZmlsdGVyX2Jsb2NrMmRfYmlsX3ZhcmlhbmNlCi0KLWZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTNfZnBfb25seToKLSAgICAgICAgbW92ICAgICAgICAgICAgIHJzaSwgICAgICAgICAgICBhcmcoMCkgICAgICAgICAgICAgICA7cmVmX3B0cgotICAgICAgICBtb3YgICAgICAgICAgICAgcmRpLCAgICAgICAgICAgIGFyZygyKSAgICAgICAgICAgICAgIDtzcmNfcHRyCi0gICAgICAgIG1vdnN4ZCAgICAgICAgICByY3gsICAgICAgICAgICAgZHdvcmQgcHRyIGFyZyg0KSAgICAgO0hlaWdodAotICAgICAgICBtb3ZzeGQgICAgICAgICAgcmR4LCAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMSkgICAgIDtyZWZfcGl4ZWxzX3Blcl9saW5lCi0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wCi0KLSVpZiBBQklfSVNfMzJCSVQ9MAotICAgICAgICBtb3ZzeGQgICAgICAgICAgcjksICAgICAgICAgICAgIGR3b3JkIHB0ciBhcmcoMykgO3NyY19waXhlbHNfcGVyX2xpbmUKLSVlbmRpZgotCi1maWx0ZXJfYmxvY2syZF9iaWxfZnBfb25seV9sb29wOgotICAgICAgICBtb3ZkcXUgICAgICAgICAgeG1tMSwgICAgICAgICAgIFhNTVdPUkQgUFRSIFtyc2ldCi0gICAgICAgIG1vdmRxdSAgICAgICAgICB4bW0yLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JzaSsxXQotICAgICAgICBtb3ZkcWEgICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbTEKLQotICAgICAgICBwdW5wY2tsYncgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTIKLSAgICAgICAgcHVucGNraGJ3ICAgICAgIHhtbTMsICAgICAgICAgICB4bW0yCi0gICAgICAgIHBtYWRkdWJzdyAgICAgICB4bW0xLCAgICAgICAgICAgW3JheF0KLSAgICAgICAgcG1hZGR1YnN3ICAgICAgIHhtbTMsICAgICAgICAgICBbcmF4XQotCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgW0dMT0JBTCh4bW1fYmlfcmQpXQotICAgICAgICBwYWRkdyAgICAgICAgICAgeG1tMywgICAgICAgICAgIFtHTE9CQUwoeG1tX2JpX3JkKV0KLSAgICAgICAgcHNyYXcgICAgICAgICAgIHhtbTEsICAgICAgICAgICB4bW1fZmlsdGVyX3NoaWZ0Ci0gICAgICAgIHBzcmF3ICAgICAgICAgICB4bW0zLCAgICAgICAgICAgeG1tX2ZpbHRlcl9zaGlmdAotCi0gICAgICAgIG1vdnEgICAgICAgICAgICB4bW0yLCAgICAgICAgICAgWE1NV09SRCBQVFIgW3JkaV0KLSAgICAgICAgcHhvciAgICAgICAgICAgIHhtbTQsICAgICAgICAgICB4bW00Ci0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW0yLCAgICAgICAgICAgeG1tNAotICAgICAgICBtb3ZxICAgICAgICAgICAgeG1tNSwgICAgICAgICAgIFFXT1JEIFBUUiBbcmRpKzhdCi0gICAgICAgIHB1bnBja2xidyAgICAgICB4bW01LCAgICAgICAgICAgeG1tNAotCi0gICAgICAgIHBzdWJ3ICAgICAgICAgICB4bW0xLCAgICAgICAgICAgeG1tMgotICAgICAgICBwc3VidyAgICAgICAgICAgeG1tMywgICAgICAgICAgIHhtbTUKLSAgICAgICAgcGFkZHcgICAgICAgICAgIHhtbTYsICAgICAgICAgICB4bW0xCi0gICAgICAgIHBhZGR3ICAgICAgICAgICB4bW02LCAgICAgICAgICAgeG1tMwotICAgICAgICBwbWFkZHdkICAgICAgICAgeG1tMSwgICAgICAgICAgIHhtbTEKLSAgICAgICAgcG1hZGR3ZCAgICAgICAgIHhtbTMsICAgICAgICAgICB4bW0zCi0gICAgICAgIHBhZGRkICAgICAgICAgICB4bW03LCAgICAgICAgICAgeG1tMQotICAgICAgICBwYWRkZCAgICAgICAgICAgeG1tNywgICAgICAgICAgIHhtbTMKLQotICAgICAgICBsZWEgICAgICAgICAgICAgcnNpLCAgICAgICAgICAgIFtyc2kgKyByZHhdCi0laWYgQUJJX0lTXzMyQklUCi0gICAgICAgIGFkZCAgICAgICAgICAgICByZGksICAgICAgICAgICAgZHdvcmQgcHRyIGFyZygzKSAgICAgO3NyY19waXhlbHNfcGVyX2xpbmUKLSVlbHNlCi0gICAgICAgIGxlYSAgICAgICAgICAgICByZGksICAgICAgICAgICAgW3JkaSArIHI5XQotJWVuZGlmCi0KLSAgICAgICAgc3ViICAgICAgICAgICAgIHJjeCwgICAgICAgICAgICAxCi0gICAgICAgIGpueiAgICAgICAgICAgICBmaWx0ZXJfYmxvY2syZF9iaWxfZnBfb25seV9sb29wCi0KLSAgICAgICAgam1wICAgICAgICAgICAgIGZpbHRlcl9ibG9jazJkX2JpbF92YXJpYW5jZQotCi1maWx0ZXJfYmxvY2syZF9iaWxfdmFyaWFuY2U6Ci0gICAgICAgIHB4b3IgICAgICAgIHhtbTAsICAgICAgICAgICB4bW0wCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTEsICAgICAgICAgICB4bW0xCi0gICAgICAgIHB4b3IgICAgICAgIHhtbTUsICAgICAgICAgICB4bW01Ci0KLSAgICAgICAgcHVucGNrbHdkICAgeG1tMCwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHVucGNraHdkICAgeG1tMSwgICAgICAgICAgIHhtbTYKLSAgICAgICAgcHNyYWQgICAgICAgeG1tMCwgICAgICAgICAgIDE2Ci0gICAgICAgIHBzcmFkICAgICAgIHhtbTEsICAgICAgICAgICAxNgotICAgICAgICBwYWRkZCAgICAgICB4bW0wLCAgICAgICAgICAgeG1tMQotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIG1vdmRxYSAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0gICAgICAgIHB1bnBja2xkcSAgIHhtbTYsICAgICAgICAgICB4bW01Ci0gICAgICAgIHB1bnBja2hkcSAgIHhtbTcsICAgICAgICAgICB4bW01Ci0gICAgICAgIHBhZGRkICAgICAgIHhtbTYsICAgICAgICAgICB4bW03Ci0KLSAgICAgICAgcHVucGNrbGRxICAgeG1tMCwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcHVucGNraGRxICAgeG1tMSwgICAgICAgICAgIHhtbTUKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3ZkcWEgICAgICB4bW03LCAgICAgICAgICAgeG1tNgotICAgICAgICBtb3ZkcWEgICAgICB4bW0xLCAgICAgICAgICAgeG1tMAotCi0gICAgICAgIHBzcmxkcSAgICAgIHhtbTcsICAgICAgICAgICA4Ci0gICAgICAgIHBzcmxkcSAgICAgIHhtbTEsICAgICAgICAgICA4Ci0KLSAgICAgICAgcGFkZGQgICAgICAgeG1tNiwgICAgICAgICAgIHhtbTcKLSAgICAgICAgcGFkZGQgICAgICAgeG1tMCwgICAgICAgICAgIHhtbTEKLQotICAgICAgICBtb3YgICAgICAgICByc2ksICAgICAgICAgICAgYXJnKDcpIDtbU3VtXQotICAgICAgICBtb3YgICAgICAgICByZGksICAgICAgICAgICAgYXJnKDgpIDtbU1NFXQotCi0gICAgICAgIG1vdmQgICAgICAgIFtyc2ldLCAgICAgICB4bW0wCi0gICAgICAgIG1vdmQgICAgICAgIFtyZGldLCAgICAgICB4bW02Ci0KLSAgICA7IGJlZ2luIGVwaWxvZwotICAgIHBvcCByZGkKLSAgICBwb3AgcnNpCi0gICAgUkVTVE9SRV9HT1QKLSAgICBSRVNUT1JFX1hNTQotICAgIFVOU0hBRE9XX0FSR1MKLSAgICBwb3AgICAgICAgICByYnAKLSAgICByZXQKLQotCi1TRUNUSU9OX1JPREFUQQotYWxpZ24gMTYKLXhtbV9iaV9yZDoKLSAgICB0aW1lcyA4IGR3IDY0Ci1hbGlnbiAxNgotdnA4X2JpbGluZWFyX2ZpbHRlcnNfc3NzZTM6Ci0gICAgdGltZXMgOCBkYiAxMjgsIDAKLSAgICB0aW1lcyA4IGRiIDExMiwgMTYKLSAgICB0aW1lcyA4IGRiIDk2LCAgMzIKLSAgICB0aW1lcyA4IGRiIDgwLCAgNDgKLSAgICB0aW1lcyA4IGRiIDY0LCAgNjQKLSAgICB0aW1lcyA4IGRiIDQ4LCAgODAKLSAgICB0aW1lcyA4IGRiIDMyLCAgOTYKLSAgICB0aW1lcyA4IGRiIDE2LCAgMTEyCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2VfbW14LmMgYi92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2VfbW14LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGMxZDAuLjAwMDAwMDAKLS0tIGEvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX21teC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvdmFyaWFuY2UuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3ByYWdtYXMuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCi0KLWV4dGVybiB2b2lkIGZpbHRlcl9ibG9jazFkX2g2X21teAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgdW5zaWduZWQgc2hvcnQgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwKLSAgICBzaG9ydCAqdnA3X2ZpbHRlcgotKTsKLWV4dGVybiB2b2lkIGZpbHRlcl9ibG9jazFkX3Y2X21teAotKAotICAgIGNvbnN0IHNob3J0ICpzcmNfcHRyLAotICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHIsCi0gICAgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLAotICAgIHNob3J0ICp2cDdfZmlsdGVyCi0pOwotCi1leHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXRfbWJfc3NfbW14KHNob3J0ICpzcmNfcHRyKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDh4OHZhcl9tbXgKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqU1NFLAotICAgIGludCAqU3VtCi0pOwotZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0NHg0dmFyX21teAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpTU0UsCi0gICAgaW50ICpTdW0KLSk7Ci1leHRlcm4gdm9pZCB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsNHg0X3Zhcl9tbXgKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsCi0gICAgY29uc3Qgc2hvcnQgKlZGaWx0ZXIsCi0gICAgaW50ICpzdW0sCi0gICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi0pOwotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCi0gICAgY29uc3Qgc2hvcnQgKkhGaWx0ZXIsCi0gICAgY29uc3Qgc2hvcnQgKlZGaWx0ZXIsCi0gICAgaW50ICpzdW0sCi0gICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi0pOwotZXh0ZXJuIHVuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19zdHJpZGUsCi0gICAgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgcmVmX3N0cmlkZQotKTsKLQotCi11bnNpZ25lZCBpbnQgdnA4X2dldDE2eDE2dmFyX21teCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkICpTU0UsCi0gICAgdW5zaWduZWQgKlNVTQotKQotewotICAgIHVuc2lnbmVkIGludCBzc2UwLCBzc2UxLCBzc2UyLCBzc2UzLCB2YXI7Ci0gICAgaW50IHN1bTAsIHN1bTEsIHN1bTIsIHN1bTMsIGF2ZzsKLQotCi0gICAgdnA4X2dldDh4OHZhcl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmc3NlMCwgJnN1bTApIDsKLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDgsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKTsKLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCAqIHNvdXJjZV9zdHJpZGUsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIgKyA4ICogcmVjb25fc3RyaWRlLCByZWNvbl9zdHJpZGUsICZzc2UyLCAmc3VtMikgOwotICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSArIDgsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIgKyA4ICogcmVjb25fc3RyaWRlICsgOCwgcmVjb25fc3RyaWRlLCAmc3NlMywgJnN1bTMpOwotCi0gICAgdmFyID0gc3NlMCArIHNzZTEgKyBzc2UyICsgc3NlMzsKLSAgICBhdmcgPSBzdW0wICsgc3VtMSArIHN1bTIgKyBzdW0zOwotCi0gICAgKlNTRSA9IHZhcjsKLSAgICAqU1VNID0gYXZnOwotICAgIHJldHVybiAodmFyIC0gKChhdmcgKiBhdmcpID4+IDgpKTsKLQotfQotCi0KLQotCi0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U0eDRfbW14KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgdW5zaWduZWQgaW50IHZhcjsKLSAgICBpbnQgYXZnOwotCi0gICAgdnA4X2dldDR4NHZhcl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmdmFyLCAmYXZnKSA7Ci0gICAgKnNzZSA9IHZhcjsKLSAgICByZXR1cm4gKHZhciAtICgoYXZnICogYXZnKSA+PiA0KSk7Ci0KLX0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTh4OF9tbXgoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdmFyOwotICAgIGludCBhdmc7Ci0KLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZ2YXIsICZhdmcpIDsKLSAgICAqc3NlID0gdmFyOwotCi0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNikpOwotCi19Ci0KLXVuc2lnbmVkIGludCB2cDhfbXNlMTZ4MTZfbW14KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgdW5zaWduZWQgaW50IHNzZTAsIHNzZTEsIHNzZTIsIHNzZTMsIHZhcjsKLSAgICBpbnQgc3VtMCwgc3VtMSwgc3VtMiwgc3VtMzsKLQotCi0gICAgdnA4X2dldDh4OHZhcl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmc3NlMCwgJnN1bTApIDsKLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDgsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKTsKLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCAqIHNvdXJjZV9zdHJpZGUsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIgKyA4ICogcmVjb25fc3RyaWRlLCByZWNvbl9zdHJpZGUsICZzc2UyLCAmc3VtMikgOwotICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSArIDgsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIgKyA4ICogcmVjb25fc3RyaWRlICsgOCwgcmVjb25fc3RyaWRlLCAmc3NlMywgJnN1bTMpOwotCi0gICAgdmFyID0gc3NlMCArIHNzZTEgKyBzc2UyICsgc3NlMzsKLSAgICAqc3NlID0gdmFyOwotICAgIHJldHVybiB2YXI7Ci19Ci0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X21teCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIGludCAqc3NlKQotewotICAgIHVuc2lnbmVkIGludCBzc2UwLCBzc2UxLCBzc2UyLCBzc2UzLCB2YXI7Ci0gICAgaW50IHN1bTAsIHN1bTEsIHN1bTIsIHN1bTMsIGF2ZzsKLQotCi0gICAgdnA4X2dldDh4OHZhcl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmc3NlMCwgJnN1bTApIDsKLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDgsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKTsKLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyICsgOCAqIHNvdXJjZV9zdHJpZGUsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIgKyA4ICogcmVjb25fc3RyaWRlLCByZWNvbl9zdHJpZGUsICZzc2UyLCAmc3VtMikgOwotICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSArIDgsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIgKyA4ICogcmVjb25fc3RyaWRlICsgOCwgcmVjb25fc3RyaWRlLCAmc3NlMywgJnN1bTMpOwotCi0gICAgdmFyID0gc3NlMCArIHNzZTEgKyBzc2UyICsgc3NlMzsKLSAgICBhdmcgPSBzdW0wICsgc3VtMSArIHN1bTIgKyBzdW0zOwotICAgICpzc2UgPSB2YXI7Ci0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gOCkpOwotfQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OF9tbXgoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgc3NlMCwgc3NlMSwgdmFyOwotICAgIGludCBzdW0wLCBzdW0xLCBhdmc7Ci0KLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOwotICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4LCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyICsgOCwgcmVjb25fc3RyaWRlLCAmc3NlMSwgJnN1bTEpOwotCi0gICAgdmFyID0gc3NlMCArIHNzZTE7Ci0gICAgYXZnID0gc3VtMCArIHN1bTE7Ci0gICAgKnNzZSA9IHZhcjsKLSAgICByZXR1cm4gKHZhciAtICgoYXZnICogYXZnKSA+PiA3KSk7Ci0KLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHgxNl9tbXgoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgc3NlMCwgc3NlMSwgdmFyOwotICAgIGludCBzdW0wLCBzdW0xLCBhdmc7Ci0KLSAgICB2cDhfZ2V0OHg4dmFyX21teChzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOwotICAgIHZwOF9nZXQ4eDh2YXJfbW14KHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKSA7Ci0KLSAgICB2YXIgPSBzc2UwICsgc3NlMTsKLSAgICBhdmcgPSBzdW0wICsgc3VtMTsKLSAgICAqc3NlID0gdmFyOwotCi0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNykpOwotCi19Ci0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gdGhlIG1teCBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGJpbGluZWFyIGZpbHRlcmluZyBhbmQgdmFyIGNhbGN1bGF0aW9uIC8vCi0vLyBpbnQgb25lIHBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBzaG9ydCwgdnA4X3ZwN19iaWxpbmVhcl9maWx0ZXJzX21teFs4XVs4XSkgPQotewotICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAgMCwgIDAsICAwLCAgMCB9LAotICAgIHsgMTEyLCAxMTIsIDExMiwgMTEyLCAxNiwgMTYsIDE2LCAxNiB9LAotICAgIHsgIDk2LCA5NiwgOTYsIDk2LCAzMiwgMzIsIDMyLCAzMiB9LAotICAgIHsgIDgwLCA4MCwgODAsIDgwLCA0OCwgNDgsIDQ4LCA0OCB9LAotICAgIHsgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCB9LAotICAgIHsgIDQ4LCA0OCwgNDgsIDQ4LCA4MCwgODAsIDgwLCA4MCB9LAotICAgIHsgIDMyLCAzMiwgMzIsIDMyLCA5NiwgOTYsIDk2LCA5NiB9LAotICAgIHsgIDE2LCAxNiwgMTYsIDE2LCAxMTIsIDExMiwgMTEyLCAxMTIgfQotfTsKLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLQotewotICAgIGludCB4c3VtOwotICAgIHVuc2lnbmVkIGludCB4eHN1bTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsNHg0X3Zhcl9tbXgoCi0gICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF0sIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeW9mZnNldF0sCi0gICAgICAgICZ4c3VtLCAmeHhzdW0KLSAgICApOwotICAgICpzc2UgPSB4eHN1bTsKLSAgICByZXR1cm4gKHh4c3VtIC0gKCh4c3VtICogeHN1bSkgPj4gNCkpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X21teAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLSkKLXsKLQotICAgIGludCB4c3VtOwotICAgIHVuc2lnbmVkIGludCB4eHN1bTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCi0gICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCi0gICAgICAgIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF0sIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeW9mZnNldF0sCi0gICAgICAgICZ4c3VtLCAmeHhzdW0KLSAgICApOwotICAgICpzc2UgPSB4eHN1bTsKLSAgICByZXR1cm4gKHh4c3VtIC0gKCh4c3VtICogeHN1bSkgPj4gNikpOwotfQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X21teAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLSkKLXsKLQotICAgIGludCB4c3VtMCwgeHN1bTE7Ci0gICAgdW5zaWduZWQgaW50IHh4c3VtMCwgeHhzdW0xOwotCi0KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCi0gICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICB2cDhfdnA3X2JpbGluZWFyX2ZpbHRlcnNfbW14W3hvZmZzZXRdLCB2cDhfdnA3X2JpbGluZWFyX2ZpbHRlcnNfbW14W3lvZmZzZXRdLAotICAgICAgICAmeHN1bTAsICZ4eHN1bTAKLSAgICApOwotCi0KLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCi0gICAgICAgIHNyY19wdHIgKyA4LCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICBkc3RfcHRyICsgOCwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCi0gICAgICAgIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF0sIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeW9mZnNldF0sCi0gICAgICAgICZ4c3VtMSwgJnh4c3VtMQotICAgICk7Ci0KLSAgICB4c3VtMCArPSB4c3VtMTsKLSAgICB4eHN1bTAgKz0geHhzdW0xOwotCi0gICAgKnNzZSA9IHh4c3VtMDsKLSAgICByZXR1cm4gKHh4c3VtMCAtICgoeHN1bTAgKiB4c3VtMCkgPj4gOCkpOwotCi0KLX0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfbXNlMTZ4MTZfbW14KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLSkKLXsKLSAgICB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbW14KHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsIHhvZmZzZXQsIHlvZmZzZXQsIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIHNzZSk7Ci0gICAgcmV0dXJuICpzc2U7Ci19Ci0KLXVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9tbXgKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgaW50IHhzdW0wLCB4c3VtMTsKLSAgICB1bnNpZ25lZCBpbnQgeHhzdW0wLCB4eHN1bTE7Ci0KLQotICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX21teCgKLSAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKLSAgICAgICAgdnA4X3ZwN19iaWxpbmVhcl9maWx0ZXJzX21teFt4b2Zmc2V0XSwgdnA4X3ZwN19iaWxpbmVhcl9maWx0ZXJzX21teFt5b2Zmc2V0XSwKLSAgICAgICAgJnhzdW0wLCAmeHhzdW0wCi0gICAgKTsKLQotCi0gICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfbW14KAotICAgICAgICBzcmNfcHRyICsgOCwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgZHN0X3B0ciArIDgsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCi0gICAgICAgIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeG9mZnNldF0sIHZwOF92cDdfYmlsaW5lYXJfZmlsdGVyc19tbXhbeW9mZnNldF0sCi0gICAgICAgICZ4c3VtMSwgJnh4c3VtMQotICAgICk7Ci0KLSAgICB4c3VtMCArPSB4c3VtMTsKLSAgICB4eHN1bTAgKz0geHhzdW0xOwotCi0gICAgKnNzZSA9IHh4c3VtMDsKLSAgICByZXR1cm4gKHh4c3VtMCAtICgoeHN1bTAgKiB4c3VtMCkgPj4gNykpOwotfQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgKnNzZQotKQotewotICAgIGludCB4c3VtOwotICAgIHVuc2lnbmVkIGludCB4eHN1bTsKLSAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9tbXgoCi0gICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICB2cDhfdnA3X2JpbGluZWFyX2ZpbHRlcnNfbW14W3hvZmZzZXRdLCB2cDhfdnA3X2JpbGluZWFyX2ZpbHRlcnNfbW14W3lvZmZzZXRdLAotICAgICAgICAmeHN1bSwgJnh4c3VtCi0gICAgKTsKLSAgICAqc3NlID0geHhzdW07Ci0gICAgcmV0dXJuICh4eHN1bSAtICgoeHN1bSAqIHhzdW0pID4+IDcpKTsKLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX21teCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIHJldHVybiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbW14KHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIDQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCBzc2UpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbW14KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgcmV0dXJuIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgMCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcHRyLCByZWNvbl9zdHJpZGUsIHNzZSk7Ci19Ci0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfbW14KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgcmV0dXJuIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgNCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcHRyLCByZWNvbl9zdHJpZGUsIHNzZSk7Ci19CmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2Vfc3NlMi5jIGIvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX3NzZTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVkZGEzMC4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2Vfc3NlMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvdmFyaWFuY2UuaCIKLSNpbmNsdWRlICJ2cDgvY29tbW9uL3ByYWdtYXMuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvbWVtLmgiCi0KLWV4dGVybiB2b2lkIGZpbHRlcl9ibG9jazFkX2g2X21teChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLCB1bnNpZ25lZCBzaG9ydCAqb3V0cHV0X3B0ciwgdW5zaWduZWQgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsIHVuc2lnbmVkIGludCBwaXhlbF9zdGVwLCB1bnNpZ25lZCBpbnQgb3V0cHV0X2hlaWdodCwgdW5zaWduZWQgaW50IG91dHB1dF93aWR0aCwgc2hvcnQgKnZwN19maWx0ZXIpOwotZXh0ZXJuIHZvaWQgZmlsdGVyX2Jsb2NrMWRfdjZfbW14KGNvbnN0IHNob3J0ICpzcmNfcHRyLCB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyLCB1bnNpZ25lZCBpbnQgcGl4ZWxzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgcGl4ZWxfc3RlcCwgdW5zaWduZWQgaW50IG91dHB1dF9oZWlnaHQsIHVuc2lnbmVkIGludCBvdXRwdXRfd2lkdGgsIHNob3J0ICp2cDdfZmlsdGVyKTsKLWV4dGVybiB2b2lkIGZpbHRlcl9ibG9jazFkOF9oNl9zc2UyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsIHVuc2lnbmVkIHNob3J0ICpvdXRwdXRfcHRyLCB1bnNpZ25lZCBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LCB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLCBzaG9ydCAqdnA3X2ZpbHRlcik7Ci1leHRlcm4gdm9pZCBmaWx0ZXJfYmxvY2sxZDhfdjZfc3NlMihjb25zdCBzaG9ydCAqc3JjX3B0ciwgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0ciwgdW5zaWduZWQgaW50IHBpeGVsc19wZXJfbGluZSwgdW5zaWduZWQgaW50IHBpeGVsX3N0ZXAsIHVuc2lnbmVkIGludCBvdXRwdXRfaGVpZ2h0LCB1bnNpZ25lZCBpbnQgb3V0cHV0X3dpZHRoLCBzaG9ydCAqdnA3X2ZpbHRlcik7Ci0KLWV4dGVybiB2b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBjb25zdCBzaG9ydCAqSEZpbHRlciwKLSAgICBjb25zdCBzaG9ydCAqVkZpbHRlciwKLSAgICBpbnQgKnN1bSwKLSAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKLSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgdnA4X2dldDR4NHZhcl9tbXgKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqU1NFLAotICAgIGludCAqU3VtCi0pOwotCi11bnNpZ25lZCBpbnQgdnA4X2dldF9tYl9zc19zc2UyCi0oCi0gICAgY29uc3Qgc2hvcnQgKnNyY19wdHIKLSk7Ci11bnNpZ25lZCBpbnQgdnA4X2dldDE2eDE2dmFyX3NzZTIKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKlNTRSwKLSAgICBpbnQgKlN1bQotKTsKLXVuc2lnbmVkIGludCB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX3NzZTIKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzcmNfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlZl9zdHJpZGUKLSk7Ci11bnNpZ25lZCBpbnQgdnA4X2dldDh4OHZhcl9zc2UyCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpTU0UsCi0gICAgaW50ICpTdW0KLSk7Ci12b2lkIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTIKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IEhlaWdodCwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGludCAqc3VtLAotICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotKTsKLXZvaWQgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTh4X2hfc3NlMgotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotICAgIGludCAqc3VtLAotICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotKTsKLXZvaWQgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTE2eF9oX3NzZTIKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IEhlaWdodCwKLSAgICBpbnQgKnN1bSwKLSAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKLSk7Ci12b2lkIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlOHhfaF9zc2UyCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCi0gICAgaW50ICpzdW0sCi0gICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi0pOwotdm9pZCB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IEhlaWdodCwKLSAgICBpbnQgKnN1bSwKLSAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKLSk7Ci12b2lkIHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2U4eF9oX3NzZTIKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IEhlaWdodCwKLSAgICBpbnQgKnN1bSwKLSAgICB1bnNpZ25lZCBpbnQgKnN1bXNxdWFyZWQKLSk7Ci12b2lkIHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCi0gICAgaW50ICpzdW0sCi0gICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi0pOwotCi1ERUNMQVJFX0FMSUdORUQoMTYsIGV4dGVybiBzaG9ydCwgdnA4X3ZwN19iaWxpbmVhcl9maWx0ZXJzX21teFs4XVs4XSk7Ci0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U0eDRfd210KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUpCi17Ci0gICAgdW5zaWduZWQgaW50IHZhcjsKLSAgICBpbnQgYXZnOwotCi0gICAgdnA4X2dldDR4NHZhcl9tbXgoc3JjX3B0ciwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciwgcmVjb25fc3RyaWRlLCAmdmFyLCAmYXZnKSA7Ci0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNCkpOwotCi19Ci0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlOHg4X3dtdAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUpCi17Ci0gICAgdW5zaWduZWQgaW50IHZhcjsKLSAgICBpbnQgYXZnOwotCi0gICAgdnA4X2dldDh4OHZhcl9zc2UyKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgJnZhciwgJmF2ZykgOwotCi0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNikpOwotCi19Ci0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZTE2eDE2X3dtdAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgdW5zaWduZWQgaW50IHNzZTA7Ci0gICAgaW50IHN1bTA7Ci0KLQotICAgIHZwOF9nZXQxNngxNnZhcl9zc2UyKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgJnNzZTAsICZzdW0wKSA7Ci0gICAgKnNzZSA9IHNzZTA7Ci0gICAgcmV0dXJuIChzc2UwIC0gKChzdW0wICogc3VtMCkgPj4gOCkpOwotfQotdW5zaWduZWQgaW50IHZwOF9tc2UxNngxNl93bXQoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgIHNvdXJjZV9zdHJpZGUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgIHJlY29uX3N0cmlkZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLQotICAgIHVuc2lnbmVkIGludCBzc2UwOwotICAgIGludCBzdW0wOwotICAgIHZwOF9nZXQxNngxNnZhcl9zc2UyKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgJnNzZTAsICZzdW0wKSA7Ci0gICAgKnNzZSA9IHNzZTA7Ci0gICAgcmV0dXJuIHNzZTA7Ci0KLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlMTZ4OF93bXQKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCAgcmVjb25fc3RyaWRlLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIHVuc2lnbmVkIGludCBzc2UwLCBzc2UxLCB2YXI7Ci0gICAgaW50IHN1bTAsIHN1bTEsIGF2ZzsKLQotICAgIHZwOF9nZXQ4eDh2YXJfc3NlMihzcmNfcHRyLCBzb3VyY2Vfc3RyaWRlLCByZWZfcHRyLCByZWNvbl9zdHJpZGUsICZzc2UwLCAmc3VtMCkgOwotICAgIHZwOF9nZXQ4eDh2YXJfc3NlMihzcmNfcHRyICsgOCwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDgsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKTsKLQotICAgIHZhciA9IHNzZTAgKyBzc2UxOwotICAgIGF2ZyA9IHN1bTAgKyBzdW0xOwotICAgICpzc2UgPSB2YXI7Ci0gICAgcmV0dXJuICh2YXIgLSAoKGF2ZyAqIGF2ZykgPj4gNykpOwotCi19Ci0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2U4eDE2X3dtdAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzb3VyY2Vfc3RyaWRlLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50ICByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UpCi17Ci0gICAgdW5zaWduZWQgaW50IHNzZTAsIHNzZTEsIHZhcjsKLSAgICBpbnQgc3VtMCwgc3VtMSwgYXZnOwotCi0gICAgdnA4X2dldDh4OHZhcl9zc2UyKHNyY19wdHIsIHNvdXJjZV9zdHJpZGUsIHJlZl9wdHIsIHJlY29uX3N0cmlkZSwgJnNzZTAsICZzdW0wKSA7Ci0gICAgdnA4X2dldDh4OHZhcl9zc2UyKHNyY19wdHIgKyA4ICogc291cmNlX3N0cmlkZSwgc291cmNlX3N0cmlkZSwgcmVmX3B0ciArIDggKiByZWNvbl9zdHJpZGUsIHJlY29uX3N0cmlkZSwgJnNzZTEsICZzdW0xKSA7Ci0KLSAgICB2YXIgPSBzc2UwICsgc3NlMTsKLSAgICBhdmcgPSBzdW0wICsgc3VtMTsKLSAgICAqc3NlID0gdmFyOwotICAgIHJldHVybiAodmFyIC0gKChhdmcgKiBhdmcpID4+IDcpKTsKLQotfQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF93bXQKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgaW50IHhzdW07Ci0gICAgdW5zaWduZWQgaW50IHh4c3VtOwotICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWw0eDRfdmFyX21teCgKLSAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgdnA4X3ZwN19iaWxpbmVhcl9maWx0ZXJzX21teFt4b2Zmc2V0XSwgdnA4X3ZwN19iaWxpbmVhcl9maWx0ZXJzX21teFt5b2Zmc2V0XSwKLSAgICAgICAgJnhzdW0sICZ4eHN1bQotICAgICk7Ci0gICAgKnNzZSA9IHh4c3VtOwotICAgIHJldHVybiAoeHhzdW0gLSAoKHhzdW0gKiB4c3VtKSA+PiA0KSk7Ci19Ci0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfd210Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZQotKQotewotICAgIGludCB4c3VtOwotICAgIHVuc2lnbmVkIGludCB4eHN1bTsKLQotICAgIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSAwKQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmFyaWFuY2U4eF9oX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKLSAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOwotICAgIH0KLSAgICBlbHNlIGlmICh4b2Zmc2V0ID09IDAgJiYgeW9mZnNldCA9PSA0KQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAotICAgICAgICAgICAgJnhzdW0sICZ4eHN1bSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDQpCi0gICAgewotICAgICAgICB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlOHhfaF9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCi0gICAgICAgICAgICAmeHN1bSwgJnh4c3VtKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAotICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwKLSAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOwotICAgIH0KLQotICAgICpzc2UgPSB4eHN1bTsKLSAgICByZXR1cm4gKHh4c3VtIC0gKCh4c3VtICogeHN1bSkgPj4gNikpOwotfQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3dtdAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLSkKLXsKLSAgICBpbnQgeHN1bTAsIHhzdW0xOwotICAgIHVuc2lnbmVkIGludCB4eHN1bTAsIHh4c3VtMTsKLQotCi0gICAgLy8gbm90ZSB3ZSBjb3VsZCBhdm9pZCB0aGVzZSBpZiBzdGF0ZW1lbnRzIGlmIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCi0gICAgLy8ganVzdCBjYWxsZWQgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucyBpbnNpZGUuCi0gICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCi0gICAgewotICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCi0gICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOwotICAgIH0KLSAgICBlbHNlIGlmICh4b2Zmc2V0ID09IDAgJiYgeW9mZnNldCA9PSA0KQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfdmVydF92YXJpYW5jZTE2eF9oX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCi0gICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOwotICAgIH0KLSAgICBlbHNlIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSA0KQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTE2eF9oX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCi0gICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwKLSAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMAotICAgICAgICApOwotCi0gICAgICAgIHZwOF9maWx0ZXJfYmxvY2syZF9iaWxfdmFyX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyICsgOCwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIgKyA4LCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKLSAgICAgICAgICAgIHhvZmZzZXQsIHlvZmZzZXQsCi0gICAgICAgICAgICAmeHN1bTEsICZ4eHN1bTEKLSAgICAgICAgKTsKLSAgICAgICAgeHN1bTAgKz0geHN1bTE7Ci0gICAgICAgIHh4c3VtMCArPSB4eHN1bTE7Ci0gICAgfQotCi0gICAgKnNzZSA9IHh4c3VtMDsKLSAgICByZXR1cm4gKHh4c3VtMCAtICgoeHN1bTAgKiB4c3VtMCkgPj4gOCkpOwotfQotCi11bnNpZ25lZCBpbnQgdnA4X3N1Yl9waXhlbF9tc2UxNngxNl93bXQoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGludCAgeG9mZnNldCwKLSAgICBpbnQgIHlvZmZzZXQsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X3B0ciwKLSAgICBpbnQgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZQotKQotewotICAgIHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl93bXQoc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwgeG9mZnNldCwgeW9mZnNldCwgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgc3NlKTsKLSAgICByZXR1cm4gKnNzZTsKLX0KLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3dtdAotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLQotKQotewotICAgIGludCB4c3VtMCwgeHN1bTE7Ci0gICAgdW5zaWduZWQgaW50IHh4c3VtMCwgeHhzdW0xOwotCi0gICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCi0gICAgewotICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKLSAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCi0gICAgewotICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKLSAgICB7Ci0gICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCi0gICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCi0gICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLQotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciArIDgsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyICsgOCwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKLSAgICAgICAgICAgIHhvZmZzZXQsIHlvZmZzZXQsCi0gICAgICAgICAgICAmeHN1bTEsICZ4eHN1bTEpOwotICAgICAgICB4c3VtMCArPSB4c3VtMTsKLSAgICAgICAgeHhzdW0wICs9IHh4c3VtMTsKLSAgICB9Ci0KLSAgICAqc3NlID0geHhzdW0wOwotICAgIHJldHVybiAoeHhzdW0wIC0gKCh4c3VtMCAqIHhzdW0wKSA+PiA3KSk7Ci19Ci0KLXVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl93bXQKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqc3JjX3B0ciwKLSAgICBpbnQgIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgaW50ICB4b2Zmc2V0LAotICAgIGludCAgeW9mZnNldCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlCi0pCi17Ci0gICAgaW50IHhzdW07Ci0gICAgdW5zaWduZWQgaW50IHh4c3VtOwotCi0gICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCi0gICAgewotICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTh4X2hfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKLSAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOwotICAgIH0KLSAgICBlbHNlIGlmICh4b2Zmc2V0ID09IDAgJiYgeW9mZnNldCA9PSA0KQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfdmVydF92YXJpYW5jZTh4X2hfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKLSAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOwotICAgIH0KLSAgICBlbHNlIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSA0KQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTh4X2hfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKLSAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwKLSAgICAgICAgICAgICZ4c3VtLCAmeHhzdW0pOwotICAgIH0KLQotICAgICpzc2UgPSB4eHN1bTsKLSAgICByZXR1cm4gKHh4c3VtIC0gKCh4c3VtICogeHN1bSkgPj4gNykpOwotfQotCi0KLXVuc2lnbmVkIGludCB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfd210KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50ICBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIGludCB4c3VtMDsKLSAgICB1bnNpZ25lZCBpbnQgeHhzdW0wOwotCi0gICAgdnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyKAotICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCAxNiwKLSAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLQotICAgICpzc2UgPSB4eHN1bTA7Ci0gICAgcmV0dXJuICh4eHN1bTAgLSAoKHhzdW0wICogeHN1bTApID4+IDgpKTsKLX0KLQotCi11bnNpZ25lZCBpbnQgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X3dtdCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfcHRyLAotICAgIGludCAgZHN0X3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgKnNzZSkKLXsKLSAgICBpbnQgeHN1bTA7Ci0gICAgdW5zaWduZWQgaW50IHh4c3VtMDsKLSAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKLSAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCi0gICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7Ci0KLSAgICAqc3NlID0geHhzdW0wOwotICAgIHJldHVybiAoeHhzdW0wIC0gKCh4c3VtMCAqIHhzdW0wKSA+PiA4KSk7Ci19Ci0KLQotdW5zaWduZWQgaW50IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfd210KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50ICBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50ICBkc3RfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCAqc3NlKQotewotICAgIGludCB4c3VtMDsKLSAgICB1bnNpZ25lZCBpbnQgeHhzdW0wOwotCi0gICAgdnA4X2hhbGZfaG9yaXpfdmVydF92YXJpYW5jZTE2eF9oX3NzZTIoCi0gICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAmeHN1bTAsICZ4eHN1bTApOwotCi0gICAgKnNzZSA9IHh4c3VtMDsKLSAgICByZXR1cm4gKHh4c3VtMCAtICgoeHN1bTAgKiB4c3VtMCkgPj4gOCkpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX3Nzc2UzLmMgYi92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2Vfc3NzZTMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1ZDQ4Ni4uMDAwMDAwMAotLS0gYS92cDgvZW5jb2Rlci94ODYvdmFyaWFuY2Vfc3NzZTMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC9lbmNvZGVyL3ZhcmlhbmNlLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9wcmFnbWFzLmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL21lbS5oIgotCi1leHRlcm4gdW5zaWduZWQgaW50IHZwOF9nZXQxNngxNnZhcl9zc2UyCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgc291cmNlX3N0cmlkZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWNvbl9zdHJpZGUsCi0gICAgdW5zaWduZWQgaW50ICpTU0UsCi0gICAgaW50ICpTdW0KLSk7Ci1leHRlcm4gdm9pZCB2cDhfaGFsZl9ob3Jpel92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMgotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotICAgIGludCAqc3VtLAotICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotKTsKLWV4dGVybiB2b2lkIHZwOF9oYWxmX2hvcml6X3ZhcmlhbmNlMTZ4X2hfc3NlMgotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9wdHIsCi0gICAgaW50IHJlZl9waXhlbHNfcGVyX2xpbmUsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3B0ciwKLSAgICBpbnQgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICB1bnNpZ25lZCBpbnQgSGVpZ2h0LAotICAgIGludCAqc3VtLAotICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotKTsKLWV4dGVybiB2b2lkIHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3B0ciwKLSAgICBpbnQgcmVmX3BpeGVsc19wZXJfbGluZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfcHRyLAotICAgIGludCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgIHVuc2lnbmVkIGludCBIZWlnaHQsCi0gICAgaW50ICpzdW0sCi0gICAgdW5zaWduZWQgaW50ICpzdW1zcXVhcmVkCi0pOwotZXh0ZXJuIHZvaWQgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTMKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfcHRyLAotICAgIGludCByZWZfcGl4ZWxzX3Blcl9saW5lLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wdHIsCi0gICAgaW50IHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50IEhlaWdodCwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGludCAqc3VtLAotICAgIHVuc2lnbmVkIGludCAqc3Vtc3F1YXJlZAotKTsKLQotdW5zaWduZWQgaW50IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl9zc3NlMwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLSkKLXsKLSAgICBpbnQgeHN1bTA7Ci0gICAgdW5zaWduZWQgaW50IHh4c3VtMDsKLQotICAgIC8vIG5vdGUgd2UgY291bGQgYXZvaWQgdGhlc2UgaWYgc3RhdGVtZW50cyBpZiB0aGUgY2FsbGluZyBmdW5jdGlvbgotICAgIC8vIGp1c3QgY2FsbGVkIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbnMgaW5zaWRlLgotICAgIGlmICh4b2Zmc2V0ID09IDQgJiYgeW9mZnNldCA9PSAwKQotICAgIHsKLSAgICAgICAgdnA4X2hhbGZfaG9yaXpfdmFyaWFuY2UxNnhfaF9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeG9mZnNldCA9PSAwICYmIHlvZmZzZXQgPT0gNCkKLSAgICB7Ci0gICAgICAgIHZwOF9oYWxmX3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKLSAgICB7Ci0gICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDE2LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdnA4X2ZpbHRlcl9ibG9jazJkX2JpbF92YXJfc3NzZTMoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgMTYsCi0gICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLSAgICB9Ci0KLSAgICAqc3NlID0geHhzdW0wOwotICAgIHJldHVybiAoeHhzdW0wIC0gKCh4c3VtMCAqIHhzdW0wKSA+PiA4KSk7Ci19Ci0KLXVuc2lnbmVkIGludCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9zc3NlMwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzcmNfcHRyLAotICAgIGludCAgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICBpbnQgIHhvZmZzZXQsCi0gICAgaW50ICB5b2Zmc2V0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRzdF9wdHIsCi0gICAgaW50IGRzdF9waXhlbHNfcGVyX2xpbmUsCi0gICAgdW5zaWduZWQgaW50ICpzc2UKLQotKQotewotICAgIGludCB4c3VtMDsKLSAgICB1bnNpZ25lZCBpbnQgeHhzdW0wOwotCi0gICAgaWYgKHhvZmZzZXQgPT0gNCAmJiB5b2Zmc2V0ID09IDApCi0gICAgewotICAgICAgICB2cDhfaGFsZl9ob3Jpel92YXJpYW5jZTE2eF9oX3NzZTIoCi0gICAgICAgICAgICBzcmNfcHRyLCBzcmNfcGl4ZWxzX3Blcl9saW5lLAotICAgICAgICAgICAgZHN0X3B0ciwgZHN0X3BpeGVsc19wZXJfbGluZSwgOCwKLSAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhvZmZzZXQgPT0gMCAmJiB5b2Zmc2V0ID09IDQpCi0gICAgewotICAgICAgICB2cDhfaGFsZl92ZXJ0X3ZhcmlhbmNlMTZ4X2hfc3NlMigKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAotICAgICAgICAgICAgJnhzdW0wLCAmeHhzdW0wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeG9mZnNldCA9PSA0ICYmIHlvZmZzZXQgPT0gNCkKLSAgICB7Ci0gICAgICAgIHZwOF9oYWxmX2hvcml6X3ZlcnRfdmFyaWFuY2UxNnhfaF9zc2UyKAotICAgICAgICAgICAgc3JjX3B0ciwgc3JjX3BpeGVsc19wZXJfbGluZSwKLSAgICAgICAgICAgIGRzdF9wdHIsIGRzdF9waXhlbHNfcGVyX2xpbmUsIDgsCi0gICAgICAgICAgICAmeHN1bTAsICZ4eHN1bTApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfZmlsdGVyX2Jsb2NrMmRfYmlsX3Zhcl9zc3NlMygKLSAgICAgICAgICAgIHNyY19wdHIsIHNyY19waXhlbHNfcGVyX2xpbmUsCi0gICAgICAgICAgICBkc3RfcHRyLCBkc3RfcGl4ZWxzX3Blcl9saW5lLCA4LAotICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwKLSAgICAgICAgICAgICZ4c3VtMCwgJnh4c3VtMCk7Ci0gICAgfQotCi0gICAgKnNzZSA9IHh4c3VtMDsKLSAgICByZXR1cm4gKHh4c3VtMCAtICgoeHN1bTAgKiB4c3VtMCkgPj4gNykpOwotfQpkaWZmIC0tZ2l0IGEvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX3g4Ni5oIGIvdnA4L2VuY29kZXIveDg2L3ZhcmlhbmNlX3g4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTYwZjc0Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni92YXJpYW5jZV94ODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBWQVJJQU5DRV9YODZfSAotI2RlZmluZSBWQVJJQU5DRV9YODZfSAotCi0KLS8qIE5vdGU6Ci0gKgotICogVGhpcyBwbGF0Zm9ybSBpcyBjb21tb25seSBidWlsdCBmb3IgcnVudGltZSBDUFUgZGV0ZWN0aW9uLiBJZiB5b3UgbW9kaWZ5Ci0gKiBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGFsc28gdXBkYXRlCi0gKiB0aGVtIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqLwotI2lmIEhBVkVfTU1YCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkNHg0X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkOHg4X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkOHgxNl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWQodnA4X3NhZDE2eDhfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9zYWQxNngxNl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2U0eDRfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlOHg4X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZTh4MTZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlMTZ4OF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2UxNngxNl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3ZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX21zZTE2eDE2X21teCk7Ci1leHRlcm4gcHJvdG90eXBlX2dldG1ic3ModnA4X2dldF9tYl9zc19tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfbXNlMTZ4MTZfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9nZXQxNngxNnByZWRfZXJyb3JfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UyKHZwOF9nZXQ4eDh2YXJfbW14KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UyKHZwOF9nZXQxNngxNnZhcl9tbXgpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWQodnA4X2dldDR4NHNzZV9jc19tbXgpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDR4NAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkNHg0IHZwOF9zYWQ0eDRfbW14Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDh4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkOHg4IHZwOF9zYWQ4eDhfbW14Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDh4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4MTYgdnA4X3NhZDh4MTZfbW14Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDggdnA4X3NhZDE2eDhfbW14Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNngxNiB2cDhfc2FkMTZ4MTZfbW14Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3ZhcjR4NAotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyNHg0IHZwOF92YXJpYW5jZTR4NF9tbXgKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyOHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXI4eDggdnA4X3ZhcmlhbmNlOHg4X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV92YXI4eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXI4eDE2IHZwOF92YXJpYW5jZTh4MTZfbW14Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3ZhcjE2eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3ZhcjE2eDggdnA4X3ZhcmlhbmNlMTZ4OF9tbXgKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3ZhcjE2eDE2IHZwOF92YXJpYW5jZTE2eDE2X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI0eDQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjR4NCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjh4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDE2IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXIxNng4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zdWJwaXh2YXIxNng4IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXIxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaAotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2ggdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdgotI2RlZmluZSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3YgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odiB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXhtc2UxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4bXNlMTZ4MTYgdnA4X3N1Yl9waXhlbF9tc2UxNngxNl9tbXgKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfZ2V0bWJzcwotI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0bWJzcyB2cDhfZ2V0X21iX3NzX21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9tc2UxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfbXNlMTZ4MTYgdnA4X21zZTE2eDE2X21teAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9nZXQxNngxNnByZWRlcnJvcgotI2RlZmluZSB2cDhfdmFyaWFuY2VfZ2V0MTZ4MTZwcmVkZXJyb3IgdnA4X2dldDE2eDE2cHJlZF9lcnJvcl9tbXgKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfZ2V0OHg4dmFyCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXQ4eDh2YXIgdnA4X2dldDh4OHZhcl9tbXgKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfZ2V0MTZ4MTZ2YXIKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2dldDE2eDE2dmFyIHZwOF9nZXQxNngxNnZhcl9tbXgKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfZ2V0NHg0c3NlX2NzCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXQ0eDRzc2VfY3MgdnA4X2dldDR4NHNzZV9jc19tbXgKLQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgSEFWRV9TU0UyCi1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkNHg0X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkOHg4X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfc2FkOHgxNl93bXQpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWQodnA4X3NhZDE2eDhfd210KTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9zYWQxNngxNl93bXQpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2U0eDRfd210KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlOHg4X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZTh4MTZfd210KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlMTZ4OF93bXQpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2UxNngxNl93bXQpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlNHg0X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDhfd210KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4MTZfd210KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfd210KTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX3ZhcmlhbmNlKHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF93bXQpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZSh2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3Zfd210KTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl93bXQpOwotZXh0ZXJuIHByb3RvdHlwZV9zdWJwaXh2YXJpYW5jZSh2cDhfc3ViX3BpeGVsX21zZTE2eDE2X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX2dldG1ic3ModnA4X2dldF9tYl9zc19zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UodnA4X21zZTE2eDE2X3dtdCk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZCh2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX3NzZTIpOwotZXh0ZXJuIHByb3RvdHlwZV92YXJpYW5jZTIodnA4X2dldDh4OHZhcl9zc2UyKTsKLWV4dGVybiBwcm90b3R5cGVfdmFyaWFuY2UyKHZwOF9nZXQxNngxNnZhcl9zc2UyKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ0eDQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDR4NCB2cDhfc2FkNHg0X3dtdAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4OCB2cDhfc2FkOHg4X3dtdAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ4eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDE2IHZwOF9zYWQ4eDE2X3dtdAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQxNng4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNng4IHZwOF9zYWQxNng4X3dtdAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTYgdnA4X3NhZDE2eDE2X3dtdAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV92YXI0eDQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3ZhcjR4NCB2cDhfdmFyaWFuY2U0eDRfd210Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3Zhcjh4OAotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyOHg4IHZwOF92YXJpYW5jZTh4OF93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfdmFyOHgxNgotI2RlZmluZSB2cDhfdmFyaWFuY2VfdmFyOHgxNiB2cDhfdmFyaWFuY2U4eDE2X3dtdAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV92YXIxNng4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXIxNng4IHZwOF92YXJpYW5jZTE2eDhfd210Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3ZhcjE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV92YXIxNngxNiB2cDhfdmFyaWFuY2UxNngxNl93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyNHg0Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI0eDQgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyOHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zdWJwaXh2YXI4eDggdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyOHgxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyOHgxNiB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeHZhcjE2eDE2IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2gKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaF93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X3YKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHYgdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl93bXQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4bXNlMTZ4MTYKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3N1YnBpeG1zZTE2eDE2IHZwOF9zdWJfcGl4ZWxfbXNlMTZ4MTZfd210Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldG1ic3MKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX2dldG1ic3MgdnA4X2dldF9tYl9zc19zc2UyCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX21zZTE2eDE2Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9tc2UxNngxNiB2cDhfbXNlMTZ4MTZfd210Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldDE2eDE2cHJlZGVycm9yCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXQxNngxNnByZWRlcnJvciB2cDhfZ2V0MTZ4MTZwcmVkX2Vycm9yX3NzZTIKLQotI3VuZGVmICB2cDhfdmFyaWFuY2VfZ2V0OHg4dmFyCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXQ4eDh2YXIgdnA4X2dldDh4OHZhcl9zc2UyCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX2dldDE2eDE2dmFyCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9nZXQxNngxNnZhciB2cDhfZ2V0MTZ4MTZ2YXJfc3NlMgotCi0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZiBIQVZFX1NTRTMKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9zYWQxNngxNl9zc2UzKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkKHZwOF9zYWQxNng4X3NzZTMpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzKHZwOF9zYWQxNngxNngzX3NzZTMpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzKHZwOF9zYWQxNng4eDNfc3NlMyk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3ModnA4X3NhZDh4MTZ4M19zc2UzKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzcyh2cDhfc2FkOHg4eDNfc3NlMyk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3ModnA4X3NhZDR4NHgzX3NzZTMpOwotCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9kaWZfYWRkcmVzcyh2cDhfc2FkMTZ4MTZ4NGRfc3NlMyk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9kaWZfYWRkcmVzcyh2cDhfc2FkMTZ4OHg0ZF9zc2UzKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX2RpZl9hZGRyZXNzKHZwOF9zYWQ4eDE2eDRkX3NzZTMpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfZGlmX2FkZHJlc3ModnA4X3NhZDh4OHg0ZF9zc2UzKTsKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX2RpZl9hZGRyZXNzKHZwOF9zYWQ0eDR4NGRfc3NlMyk7Ci0KLSNpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTYgdnA4X3NhZDE2eDE2X3NzZTMKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4MwotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4MyB2cDhfc2FkMTZ4MTZ4M19zc2UzCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4MwotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4OHgzIHZwOF9zYWQxNng4eDNfc3NlMwotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ4eDE2eDMKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4MTZ4MyB2cDhfc2FkOHgxNngzX3NzZTMKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkOHg4eDMKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4OHgzIHZwOF9zYWQ4eDh4M19zc2UzCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDR4NHgzCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ0eDR4MyB2cDhfc2FkNHg0eDNfc3NlMwotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQxNngxNng0ZAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4MTZ4NGQgdnA4X3NhZDE2eDE2eDRkX3NzZTMKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkMTZ4OHg0ZAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4OHg0ZCB2cDhfc2FkMTZ4OHg0ZF9zc2UzCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDh4MTZ4NGQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4MTZ4NGQgdnA4X3NhZDh4MTZ4NGRfc3NlMwotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ4eDh4NGQKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDh4OHg0ZCB2cDhfc2FkOHg4eDRkX3NzZTMKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkNHg0eDRkCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ0eDR4NGQgdnA4X3NhZDR4NHg0ZF9zc2UzCi0KLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmIEhBVkVfU1NTRTMKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzcyh2cDhfc2FkMTZ4MTZ4M19zc3NlMyk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3ModnA4X3NhZDE2eDh4M19zc3NlMyk7Ci1leHRlcm4gcHJvdG90eXBlX3N1YnBpeHZhcmlhbmNlKHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3Nzc2UzKTsKLWV4dGVybiBwcm90b3R5cGVfc3VicGl4dmFyaWFuY2UodnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3Nzc2UzKTsKLQotI2lmICFDT05GSUdfUlVOVElNRV9DUFVfREVURUNUCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQxNngxNngzCi0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQxNngxNngzIHZwOF9zYWQxNngxNngzX3Nzc2UzCi0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4MwotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkMTZ4OHgzIHZwOF9zYWQxNng4eDNfc3NzZTMKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4OCB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9zc3NlMwotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zdWJwaXh2YXIxNngxNgotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc3VicGl4dmFyMTZ4MTYgdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDE2X3Nzc2UzCi0KLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmIEhBVkVfU1NFNF8xCi1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3NfMSh2cDhfc2FkMTZ4MTZ4OF9zc2U0KTsKLWV4dGVybiBwcm90b3R5cGVfc2FkX211bHRpX3NhbWVfYWRkcmVzc18xKHZwOF9zYWQxNng4eDhfc3NlNCk7Ci1leHRlcm4gcHJvdG90eXBlX3NhZF9tdWx0aV9zYW1lX2FkZHJlc3NfMSh2cDhfc2FkOHgxNng4X3NzZTQpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzXzEodnA4X3NhZDh4OHg4X3NzZTQpOwotZXh0ZXJuIHByb3RvdHlwZV9zYWRfbXVsdGlfc2FtZV9hZGRyZXNzXzEodnA4X3NhZDR4NHg4X3NzZTQpOwotCi0jaWYgIUNPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDE2eDggdnA4X3NhZDE2eDE2eDhfc3NlNAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQxNng4eDgKLSNkZWZpbmUgdnA4X3ZhcmlhbmNlX3NhZDE2eDh4OCB2cDhfc2FkMTZ4OHg4X3NzZTQKLQotI3VuZGVmICB2cDhfdmFyaWFuY2Vfc2FkOHgxNng4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDE2eDggdnA4X3NhZDh4MTZ4OF9zc2U0Ci0KLSN1bmRlZiAgdnA4X3ZhcmlhbmNlX3NhZDh4OHg4Ci0jZGVmaW5lIHZwOF92YXJpYW5jZV9zYWQ4eDh4OCB2cDhfc2FkOHg4eDhfc3NlNAotCi0jdW5kZWYgIHZwOF92YXJpYW5jZV9zYWQ0eDR4OAotI2RlZmluZSB2cDhfdmFyaWFuY2Vfc2FkNHg0eDggdnA4X3NhZDR4NHg4X3NzZTQKLQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cDgvZW5jb2Rlci94ODYveDg2X2NzeXN0ZW1kZXBlbmRlbnQuYyBiL3ZwOC9lbmNvZGVyL3g4Ni94ODZfY3N5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZiZDk4Li4wMDAwMDAwCi0tLSBhL3ZwOC9lbmNvZGVyL3g4Ni94ODZfY3N5c3RlbWRlcGVuZGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotI2luY2x1ZGUgInZweF9wb3J0cy94ODYuaCIKLSNpbmNsdWRlICJ2cDgvZW5jb2Rlci92YXJpYW5jZS5oIgotI2luY2x1ZGUgInZwOC9lbmNvZGVyL29ueXhfaW50LmgiCi0KLQotI2lmIEhBVkVfTU1YCi1zdGF0aWMgdm9pZCBzaG9ydF9mZGN0OHg0X21teChzaG9ydCAqaW5wdXQsIHNob3J0ICpvdXRwdXQsIGludCBwaXRjaCkKLXsKLSAgICB2cDhfc2hvcnRfZmRjdDR4NF9tbXgoaW5wdXQsICAgb3V0cHV0LCAgICBwaXRjaCk7Ci0gICAgdnA4X3Nob3J0X2ZkY3Q0eDRfbW14KGlucHV0ICsgNCwgb3V0cHV0ICsgMTYsIHBpdGNoKTsKLX0KLQotaW50IHZwOF9mYXN0X3F1YW50aXplX2JfaW1wbF9tbXgoc2hvcnQgKmNvZWZmX3B0ciwgc2hvcnQgKnpiaW5fcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnFjb2VmZl9wdHIsIHNob3J0ICpkZXF1YW50X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpzY2FuX21hc2ssIHNob3J0ICpyb3VuZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcXVhbnRfcHRyLCBzaG9ydCAqZHFjb2VmZl9wdHIpOwotc3RhdGljIHZvaWQgZmFzdF9xdWFudGl6ZV9iX21teChCTE9DSyAqYiwgQkxPQ0tEICpkKQotewotICAgIHNob3J0ICpzY2FuX21hc2sgICA9IHZwOF9kZWZhdWx0X3ppZ196YWdfbWFzazsvL2QtPnNjYW5fb3JkZXJfbWFza19wdHI7Ci0gICAgc2hvcnQgKmNvZWZmX3B0ciAgID0gYi0+Y29lZmY7Ci0gICAgc2hvcnQgKnpiaW5fcHRyICAgID0gYi0+emJpbjsKLSAgICBzaG9ydCAqcm91bmRfcHRyICAgPSBiLT5yb3VuZDsKLSAgICBzaG9ydCAqcXVhbnRfcHRyICAgPSBiLT5xdWFudF9mYXN0OwotICAgIHNob3J0ICpxY29lZmZfcHRyICA9IGQtPnFjb2VmZjsKLSAgICBzaG9ydCAqZHFjb2VmZl9wdHIgPSBkLT5kcWNvZWZmOwotICAgIHNob3J0ICpkZXF1YW50X3B0ciA9IGQtPmRlcXVhbnQ7Ci0KLSAgICBkLT5lb2IgPSB2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfbW14KAotICAgICAgICAgICAgICAgICBjb2VmZl9wdHIsCi0gICAgICAgICAgICAgICAgIHpiaW5fcHRyLAotICAgICAgICAgICAgICAgICBxY29lZmZfcHRyLAotICAgICAgICAgICAgICAgICBkZXF1YW50X3B0ciwKLSAgICAgICAgICAgICAgICAgc2Nhbl9tYXNrLAotCi0gICAgICAgICAgICAgICAgIHJvdW5kX3B0ciwKLSAgICAgICAgICAgICAgICAgcXVhbnRfcHRyLAotICAgICAgICAgICAgICAgICBkcWNvZWZmX3B0cgotICAgICAgICAgICAgICk7Ci19Ci0KLWludCB2cDhfbWJibG9ja19lcnJvcl9tbXhfaW1wbChzaG9ydCAqY29lZmZfcHRyLCBzaG9ydCAqZGNvZWZfcHRyLCBpbnQgZGMpOwotc3RhdGljIGludCBtYmJsb2NrX2Vycm9yX21teChNQUNST0JMT0NLICptYiwgaW50IGRjKQotewotICAgIHNob3J0ICpjb2VmZl9wdHIgPSAgbWItPmJsb2NrWzBdLmNvZWZmOwotICAgIHNob3J0ICpkY29lZl9wdHIgPSAgbWItPmVfbWJkLmJsb2NrWzBdLmRxY29lZmY7Ci0gICAgcmV0dXJuIHZwOF9tYmJsb2NrX2Vycm9yX21teF9pbXBsKGNvZWZmX3B0ciwgZGNvZWZfcHRyLCBkYyk7Ci19Ci0KLWludCB2cDhfbWJ1dmVycm9yX21teF9pbXBsKHNob3J0ICpzX3B0ciwgc2hvcnQgKmRfcHRyKTsKLXN0YXRpYyBpbnQgbWJ1dmVycm9yX21teChNQUNST0JMT0NLICptYikKLXsKLSAgICBzaG9ydCAqc19wdHIgPSAmbWItPmNvZWZmWzI1Nl07Ci0gICAgc2hvcnQgKmRfcHRyID0gJm1iLT5lX21iZC5kcWNvZWZmWzI1Nl07Ci0gICAgcmV0dXJuIHZwOF9tYnV2ZXJyb3JfbW14X2ltcGwoc19wdHIsIGRfcHRyKTsKLX0KLQotdm9pZCB2cDhfc3VidHJhY3RfYl9tbXhfaW1wbCh1bnNpZ25lZCBjaGFyICp6LCAgaW50IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpwcmVkaWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCk7Ci1zdGF0aWMgdm9pZCBzdWJ0cmFjdF9iX21teChCTE9DSyAqYmUsIEJMT0NLRCAqYmQsIGludCBwaXRjaCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp6ID0gKihiZS0+YmFzZV9zcmMpICsgYmUtPnNyYzsKLSAgICB1bnNpZ25lZCBpbnQgIHNyY19zdHJpZGUgPSBiZS0+c3JjX3N0cmlkZTsKLSAgICBzaG9ydCAqZGlmZiA9ICZiZS0+c3JjX2RpZmZbMF07Ci0gICAgdW5zaWduZWQgY2hhciAqcHJlZGljdG9yID0gJmJkLT5wcmVkaWN0b3JbMF07Ci0gICAgdnA4X3N1YnRyYWN0X2JfbW14X2ltcGwoeiwgc3JjX3N0cmlkZSwgZGlmZiwgcHJlZGljdG9yLCBwaXRjaCk7Ci19Ci0KLSNlbmRpZgotCi0jaWYgSEFWRV9TU0UyCi1pbnQgdnA4X2Zhc3RfcXVhbnRpemVfYl9pbXBsX3NzZTIoc2hvcnQgKmNvZWZmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpxY29lZmZfcHRyLCBzaG9ydCAqZGVxdWFudF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqaW52X3NjYW5fb3JkZXIsIHNob3J0ICpyb3VuZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcXVhbnRfcHRyLCBzaG9ydCAqZHFjb2VmZl9wdHIpOwotc3RhdGljIHZvaWQgZmFzdF9xdWFudGl6ZV9iX3NzZTIoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKLXsKLSAgICBzaG9ydCAqc2Nhbl9tYXNrICAgPSB2cDhfZGVmYXVsdF96aWdfemFnX21hc2s7Ly9kLT5zY2FuX29yZGVyX21hc2tfcHRyOwotICAgIHNob3J0ICpjb2VmZl9wdHIgICA9IGItPmNvZWZmOwotICAgIHNob3J0ICpyb3VuZF9wdHIgICA9IGItPnJvdW5kOwotICAgIHNob3J0ICpxdWFudF9wdHIgICA9IGItPnF1YW50X2Zhc3Q7Ci0gICAgc2hvcnQgKnFjb2VmZl9wdHIgID0gZC0+cWNvZWZmOwotICAgIHNob3J0ICpkcWNvZWZmX3B0ciA9IGQtPmRxY29lZmY7Ci0gICAgc2hvcnQgKmRlcXVhbnRfcHRyID0gZC0+ZGVxdWFudDsKLQotICAgIGQtPmVvYiA9IHZwOF9mYXN0X3F1YW50aXplX2JfaW1wbF9zc2UyKAotICAgICAgICAgICAgICAgICBjb2VmZl9wdHIsCi0gICAgICAgICAgICAgICAgIHFjb2VmZl9wdHIsCi0gICAgICAgICAgICAgICAgIGRlcXVhbnRfcHRyLAotICAgICAgICAgICAgICAgICB2cDhfZGVmYXVsdF9pbnZfemlnX3phZywKLSAgICAgICAgICAgICAgICAgcm91bmRfcHRyLAotICAgICAgICAgICAgICAgICBxdWFudF9wdHIsCi0gICAgICAgICAgICAgICAgIGRxY29lZmZfcHRyCi0gICAgICAgICAgICAgKTsKLX0KLQotaW50IHZwOF9tYmJsb2NrX2Vycm9yX3htbV9pbXBsKHNob3J0ICpjb2VmZl9wdHIsIHNob3J0ICpkY29lZl9wdHIsIGludCBkYyk7Ci1zdGF0aWMgaW50IG1iYmxvY2tfZXJyb3JfeG1tKE1BQ1JPQkxPQ0sgKm1iLCBpbnQgZGMpCi17Ci0gICAgc2hvcnQgKmNvZWZmX3B0ciA9ICBtYi0+YmxvY2tbMF0uY29lZmY7Ci0gICAgc2hvcnQgKmRjb2VmX3B0ciA9ICBtYi0+ZV9tYmQuYmxvY2tbMF0uZHFjb2VmZjsKLSAgICByZXR1cm4gdnA4X21iYmxvY2tfZXJyb3JfeG1tX2ltcGwoY29lZmZfcHRyLCBkY29lZl9wdHIsIGRjKTsKLX0KLQotaW50IHZwOF9tYnV2ZXJyb3JfeG1tX2ltcGwoc2hvcnQgKnNfcHRyLCBzaG9ydCAqZF9wdHIpOwotc3RhdGljIGludCBtYnV2ZXJyb3JfeG1tKE1BQ1JPQkxPQ0sgKm1iKQotewotICAgIHNob3J0ICpzX3B0ciA9ICZtYi0+Y29lZmZbMjU2XTsKLSAgICBzaG9ydCAqZF9wdHIgPSAmbWItPmVfbWJkLmRxY29lZmZbMjU2XTsKLSAgICByZXR1cm4gdnA4X21idXZlcnJvcl94bW1faW1wbChzX3B0ciwgZF9wdHIpOwotfQotCi12b2lkIHZwOF9zdWJ0cmFjdF9iX3NzZTJfaW1wbCh1bnNpZ25lZCBjaGFyICp6LCAgaW50IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkaWZmLCB1bnNpZ25lZCBjaGFyICpwcmVkaWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCk7Ci1zdGF0aWMgdm9pZCBzdWJ0cmFjdF9iX3NzZTIoQkxPQ0sgKmJlLCBCTE9DS0QgKmJkLCBpbnQgcGl0Y2gpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqeiA9ICooYmUtPmJhc2Vfc3JjKSArIGJlLT5zcmM7Ci0gICAgdW5zaWduZWQgaW50ICBzcmNfc3RyaWRlID0gYmUtPnNyY19zdHJpZGU7Ci0gICAgc2hvcnQgKmRpZmYgPSAmYmUtPnNyY19kaWZmWzBdOwotICAgIHVuc2lnbmVkIGNoYXIgKnByZWRpY3RvciA9ICZiZC0+cHJlZGljdG9yWzBdOwotICAgIHZwOF9zdWJ0cmFjdF9iX3NzZTJfaW1wbCh6LCBzcmNfc3RyaWRlLCBkaWZmLCBwcmVkaWN0b3IsIHBpdGNoKTsKLX0KLQotI2VuZGlmCi0KLSNpZiBIQVZFX1NTU0UzCi1pbnQgdnA4X2Zhc3RfcXVhbnRpemVfYl9pbXBsX3Nzc2UzKHNob3J0ICpjb2VmZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcWNvZWZmX3B0ciwgc2hvcnQgKmRlcXVhbnRfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnJvdW5kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpxdWFudF9wdHIsIHNob3J0ICpkcWNvZWZmX3B0cik7Ci1zdGF0aWMgdm9pZCBmYXN0X3F1YW50aXplX2Jfc3NzZTMoQkxPQ0sgKmIsIEJMT0NLRCAqZCkKLXsKLSAgICBkLT5lb2IgPSB2cDhfZmFzdF9xdWFudGl6ZV9iX2ltcGxfc3NzZTMoCi0gICAgICAgICAgICAgICAgICAgIGItPmNvZWZmLAotICAgICAgICAgICAgICAgICAgICBkLT5xY29lZmYsCi0gICAgICAgICAgICAgICAgICAgIGQtPmRlcXVhbnQsCi0gICAgICAgICAgICAgICAgICAgIGItPnJvdW5kLAotICAgICAgICAgICAgICAgICAgICBiLT5xdWFudF9mYXN0LAotICAgICAgICAgICAgICAgICAgICBkLT5kcWNvZWZmCi0gICAgICAgICAgICAgICApOwotfQotI2lmIENPTkZJR19QU05SCi0jaWYgQVJDSF9YODZfNjQKLXR5cGVkZWYgdm9pZCBzc2ltcGYKLSgKLSAgICB1bnNpZ25lZCBjaGFyICpzLAotICAgIGludCBzcCwKLSAgICB1bnNpZ25lZCBjaGFyICpyLAotICAgIGludCBycCwKLSAgICB1bnNpZ25lZCBsb25nICpzdW1fcywKLSAgICB1bnNpZ25lZCBsb25nICpzdW1fciwKLSAgICB1bnNpZ25lZCBsb25nICpzdW1fc3FfcywKLSAgICB1bnNpZ25lZCBsb25nICpzdW1fc3FfciwKLSAgICB1bnNpZ25lZCBsb25nICpzdW1fc3hyCi0pOwotCi1leHRlcm4gc3NpbXBmIHZwOF9zc2ltX3Bhcm1zXzE2eDE2X3NzZTM7Ci1leHRlcm4gc3NpbXBmIHZwOF9zc2ltX3Bhcm1zXzh4OF9zc2UzOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0KLXZvaWQgdnA4X2FyY2hfeDg2X2VuY29kZXJfaW5pdChWUDhfQ09NUCAqY3BpKQotewotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBpbnQgZmxhZ3MgPSB4ODZfc2ltZF9jYXBzKCk7Ci0gICAgaW50IG1teF9lbmFibGVkID0gZmxhZ3MgJiBIQVNfTU1YOwotICAgIGludCB4bW1fZW5hYmxlZCA9IGZsYWdzICYgSEFTX1NTRTsKLSAgICBpbnQgd210X2VuYWJsZWQgPSBmbGFncyAmIEhBU19TU0UyOwotICAgIGludCBTU0UzRW5hYmxlZCA9IGZsYWdzICYgSEFTX1NTRTM7Ci0gICAgaW50IFNTU0UzRW5hYmxlZCA9IGZsYWdzICYgSEFTX1NTU0UzOwotICAgIGludCBTU0U0XzFFbmFibGVkID0gZmxhZ3MgJiBIQVNfU1NFNF8xOwotCi0gICAgLyogTm90ZToKLSAgICAgKgotICAgICAqIFRoaXMgcGxhdGZvcm0gY2FuIGJlIGJ1aWx0IHdpdGhvdXQgcnVudGltZSBDUFUgZGV0ZWN0aW9uIGFzIHdlbGwuIElmCi0gICAgICogeW91IG1vZGlmeSBhbnkgb2YgdGhlIGZ1bmN0aW9uIG1hcHBpbmdzIHByZXNlbnQgaW4gdGhpcyBmaWxlLCBiZSBzdXJlCi0gICAgICogdG8gYWxzbyB1cGRhdGUgdGhlbSBpbiBzdGF0aWMgbWFwaW5ncyAoPGFyY2g+L2ZpbGVuYW1lXzxhcmNoPi5oKQotICAgICAqLwotCi0gICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBmdW5jdGlvbnMgd2l0aCBmYXN0ZXN0IG9uZXMgZm9yIHRoaXMgQ1BVLiAqLwotI2lmIEhBVkVfTU1YCi0gICAgaWYgKG1teF9lbmFibGVkKQotICAgIHsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDE2ICAgICAgICAgICAgICA9IHZwOF9zYWQxNngxNl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQxNng4ICAgICAgICAgICAgICAgPSB2cDhfc2FkMTZ4OF9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDE2ICAgICAgICAgICAgICAgPSB2cDhfc2FkOHgxNl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDggICAgICAgICAgICAgICAgPSB2cDhfc2FkOHg4X21teDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDR4NCAgICAgICAgICAgICAgICA9IHZwOF9zYWQ0eDRfbW14OwotCi0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXI0eDQgICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U0eDRfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyOHg4ICAgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHg4X21teDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnZhcjh4MTYgICAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTh4MTZfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyMTZ4OCAgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlMTZ4OF9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXIxNngxNiAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNngxNl9tbXg7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjR4NCAgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U0eDRfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyOHg4ICAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTh4OF9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXI4eDE2ICAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHgxNl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXIxNng4ICAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4OF9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXIxNngxNiAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuaGFsZnBpeHZhcjE2eDE2X2ggICAgID0gdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9oX21teDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl92ICAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5oYWxmcGl4dmFyMTZ4MTZfaHYgICAgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2h2X21teDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeG1zZTE2eDE2ICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfbXNlMTZ4MTZfbW14OwotCi0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5tc2UxNngxNiAgICAgICAgICAgICAgPSB2cDhfbXNlMTZ4MTZfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0bWJzcyAgICAgICAgICAgICAgID0gdnA4X2dldF9tYl9zc19tbXg7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDE2eDE2cHJlZGVycm9yICAgICA9IHZwOF9nZXQxNngxNnByZWRfZXJyb3JfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0OHg4dmFyICAgICAgICAgICAgID0gdnA4X2dldDh4OHZhcl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5nZXQxNngxNnZhciAgICAgICAgICAgPSB2cDhfZ2V0MTZ4MTZ2YXJfbW14OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuZ2V0NHg0c3NlX2NzICAgICAgICAgID0gdnA4X2dldDR4NHNzZV9jc19tbXg7Ci0KLSAgICAgICAgY3BpLT5ydGNkLmZkY3Quc2hvcnQ0eDQgICAgICAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0NHg0X21teDsKLSAgICAgICAgY3BpLT5ydGNkLmZkY3Quc2hvcnQ4eDQgICAgICAgICAgICAgICAgICA9IHNob3J0X2ZkY3Q4eDRfbW14OwotICAgICAgICBjcGktPnJ0Y2QuZmRjdC5mYXN0NHg0ICAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfbW14OwotICAgICAgICBjcGktPnJ0Y2QuZmRjdC5mYXN0OHg0ICAgICAgICAgICAgICAgICAgID0gc2hvcnRfZmRjdDh4NF9tbXg7Ci0KLSAgICAgICAgY3BpLT5ydGNkLmZkY3Qud2Fsc2hfc2hvcnQ0eDQgICAgICAgICAgICA9IHZwOF9zaG9ydF93YWxzaDR4NF9jOwotCi0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5iZXJyICAgICAgICAgICAgICAgICAgPSB2cDhfYmxvY2tfZXJyb3JfbW14OwotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIubWJlcnIgICAgICAgICAgICAgICAgID0gbWJibG9ja19lcnJvcl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5tYnV2ZXJyICAgICAgICAgICAgICAgPSBtYnV2ZXJyb3JfbW14OwotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuc3ViYiAgICAgICAgICAgICAgICAgID0gc3VidHJhY3RfYl9tbXg7Ci0gICAgICAgIGNwaS0+cnRjZC5lbmNvZGVtYi5zdWJtYnkgICAgICAgICAgICAgICAgPSB2cDhfc3VidHJhY3RfbWJ5X21teDsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLnN1Ym1idXYgICAgICAgICAgICAgICA9IHZwOF9zdWJ0cmFjdF9tYnV2X21teDsKLQotICAgICAgICAvKmNwaS0+cnRjZC5xdWFudGl6ZS5mYXN0cXVhbnRiICAgICAgICAgICAgPSBmYXN0X3F1YW50aXplX2JfbW14OyovCi0gICAgfQotI2VuZGlmCi0KLSNpZiBIQVZFX1NTRTIKLSAgICBpZiAod210X2VuYWJsZWQpCi0gICAgewotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4MTYgICAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDggICAgICAgICAgICAgICA9IHZwOF9zYWQxNng4X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4MTYgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDE2X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4OCAgICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDhfd210OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkNHg0ICAgICAgICAgICAgICAgID0gdnA4X3NhZDR4NF93bXQ7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnZhcjR4NCAgICAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTR4NF93bXQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXI4eDggICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2U4eDhfd210OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UudmFyOHgxNiAgICAgICAgICAgICAgID0gdnA4X3ZhcmlhbmNlOHgxNl93bXQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS52YXIxNng4ICAgICAgICAgICAgICAgPSB2cDhfdmFyaWFuY2UxNng4X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnZhcjE2eDE2ICAgICAgICAgICAgICA9IHZwOF92YXJpYW5jZTE2eDE2X3dtdDsKLQotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyNHg0ICAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTR4NF93bXQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXI4eDggICAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlOHg4X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjh4MTYgICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2U4eDE2X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjE2eDggICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNng4X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnN1YnBpeHZhcjE2eDE2ICAgICAgICA9IHZwOF9zdWJfcGl4ZWxfdmFyaWFuY2UxNngxNl93bXQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5oYWxmcGl4dmFyMTZ4MTZfaCAgICAgPSB2cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfd210OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2UuaGFsZnBpeHZhcjE2eDE2X3YgICAgID0gdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl92X3dtdDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmhhbGZwaXh2YXIxNngxNl9odiAgICA9IHZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfaHZfd210OwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4bXNlMTZ4MTYgICAgICAgID0gdnA4X3N1Yl9waXhlbF9tc2UxNngxNl93bXQ7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLm1zZTE2eDE2ICAgICAgICAgICAgICA9IHZwOF9tc2UxNngxNl93bXQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5nZXRtYnNzICAgICAgICAgICAgICAgPSB2cDhfZ2V0X21iX3NzX3NzZTI7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDE2eDE2cHJlZGVycm9yICAgICA9IHZwOF9nZXQxNngxNnByZWRfZXJyb3Jfc3NlMjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDh4OHZhciAgICAgICAgICAgICA9IHZwOF9nZXQ4eDh2YXJfc3NlMjsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLmdldDE2eDE2dmFyICAgICAgICAgICA9IHZwOF9nZXQxNngxNnZhcl9zc2UyOwotCi0KLSAgICAgICAgLyogY3BpLT5ydGNkLnZhcmlhbmNlLmdldDR4NHNzZV9jcyAgbm90IGltcGxlbWVudGVkIGZvciB3bXQgKi87Ci0KLSAgICAgICAgY3BpLT5ydGNkLmZkY3Quc2hvcnQ0eDQgICAgICAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0NHg0X3NzZTI7Ci0gICAgICAgIGNwaS0+cnRjZC5mZGN0LnNob3J0OHg0ICAgICAgICAgICAgICAgICAgPSB2cDhfc2hvcnRfZmRjdDh4NF9zc2UyOwotICAgICAgICBjcGktPnJ0Y2QuZmRjdC5mYXN0NHg0ICAgICAgICAgICAgICAgICAgID0gdnA4X3Nob3J0X2ZkY3Q0eDRfc3NlMjsKLSAgICAgICAgY3BpLT5ydGNkLmZkY3QuZmFzdDh4NCAgICAgICAgICAgICAgICAgICA9IHZwOF9zaG9ydF9mZGN0OHg0X3NzZTI7Ci0KLSAgICAgICAgY3BpLT5ydGNkLmZkY3Qud2Fsc2hfc2hvcnQ0eDQgICAgICAgICAgICA9IHZwOF9zaG9ydF93YWxzaDR4NF9zc2UyIDsKLQotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIuYmVyciAgICAgICAgICAgICAgICAgID0gdnA4X2Jsb2NrX2Vycm9yX3htbTsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLm1iZXJyICAgICAgICAgICAgICAgICA9IG1iYmxvY2tfZXJyb3JfeG1tOwotICAgICAgICBjcGktPnJ0Y2QuZW5jb2RlbWIubWJ1dmVyciAgICAgICAgICAgICAgID0gbWJ1dmVycm9yX3htbTsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLnN1YmIgICAgICAgICAgICAgICAgICA9IHN1YnRyYWN0X2Jfc3NlMjsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLnN1Ym1ieSAgICAgICAgICAgICAgICA9IHZwOF9zdWJ0cmFjdF9tYnlfc3NlMjsKLSAgICAgICAgY3BpLT5ydGNkLmVuY29kZW1iLnN1Ym1idXYgICAgICAgICAgICAgICA9IHZwOF9zdWJ0cmFjdF9tYnV2X3NzZTI7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnF1YW50aXplLnF1YW50YiAgICAgICAgICAgICAgICA9IHZwOF9yZWd1bGFyX3F1YW50aXplX2Jfc3NlMjsKLSAgICAgICAgY3BpLT5ydGNkLnF1YW50aXplLmZhc3RxdWFudGIgICAgICAgICAgICA9IGZhc3RfcXVhbnRpemVfYl9zc2UyOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICAgICAgY3BpLT5ydGNkLnRlbXBvcmFsLmFwcGx5ICAgICAgICAgICAgICAgICA9IHZwOF90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfc3NlMjsKLSNlbmRpZgotICAgIH0KLSNlbmRpZgotCi0jaWYgSEFWRV9TU0UzCi0gICAgaWYgKFNTRTNFbmFibGVkKQotICAgIHsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDE2ICAgICAgICAgICAgICA9IHZwOF9zYWQxNngxNl9zc2UzOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4MTZ4MyAgICAgICAgICAgID0gdnA4X3NhZDE2eDE2eDNfc3NlMzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDh4MyAgICAgICAgICAgICA9IHZwOF9zYWQxNng4eDNfc3NlMzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4MTZ4MyAgICAgICAgICAgICA9IHZwOF9zYWQ4eDE2eDNfc3NlMzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4OHgzICAgICAgICAgICAgICA9IHZwOF9zYWQ4eDh4M19zc2UzOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkNHg0eDMgICAgICAgICAgICAgID0gdnA4X3NhZDR4NHgzX3NzZTM7Ci0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICAgICAgY3BpLT5ydGNkLnNlYXJjaC5mdWxsX3NlYXJjaCAgICAgICAgICAgICA9IHZwOF9mdWxsX3NlYXJjaF9zYWR4MzsKLSNlbmRpZgotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4MTZ4NGQgICAgICAgICAgID0gdnA4X3NhZDE2eDE2eDRkX3NzZTM7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQxNng4eDRkICAgICAgICAgICAgPSB2cDhfc2FkMTZ4OHg0ZF9zc2UzOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkOHgxNng0ZCAgICAgICAgICAgID0gdnA4X3NhZDh4MTZ4NGRfc3NlMzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDh4OHg0ZCAgICAgICAgICAgICA9IHZwOF9zYWQ4eDh4NGRfc3NlMzsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDR4NHg0ZCAgICAgICAgICAgICA9IHZwOF9zYWQ0eDR4NGRfc3NlMzsKLSAgICAgICAgY3BpLT5ydGNkLnNlYXJjaC5kaWFtb25kX3NlYXJjaCAgICAgICAgICA9IHZwOF9kaWFtb25kX3NlYXJjaF9zYWR4NDsKLSAgICB9Ci0jZW5kaWYKLQotI2lmIEhBVkVfU1NTRTMKLSAgICBpZiAoU1NTRTNFbmFibGVkKQotICAgIHsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDE2eDMgICAgICAgICAgICA9IHZwOF9zYWQxNngxNngzX3Nzc2UzOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc2FkMTZ4OHgzICAgICAgICAgICAgID0gdnA4X3NhZDE2eDh4M19zc3NlMzsKLQotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3VicGl4dmFyMTZ4OCAgICAgICAgID0gdnA4X3N1Yl9waXhlbF92YXJpYW5jZTE2eDhfc3NzZTM7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zdWJwaXh2YXIxNngxNiAgICAgICAgPSB2cDhfc3ViX3BpeGVsX3ZhcmlhbmNlMTZ4MTZfc3NzZTM7Ci0KLSAgICAgICAgY3BpLT5ydGNkLnF1YW50aXplLmZhc3RxdWFudGIgICAgICAgICAgICA9IGZhc3RfcXVhbnRpemVfYl9zc3NlMzsKLQotI2lmIENPTkZJR19QU05SCi0jaWYgQVJDSF9YODZfNjQKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNzaW1wZl84eDggICAgICAgICAgICA9IHZwOF9zc2ltX3Bhcm1zXzh4OF9zc2UzOwotICAgICAgICBjcGktPnJ0Y2QudmFyaWFuY2Uuc3NpbXBmICAgICAgICAgICAgICAgID0gdnA4X3NzaW1fcGFybXNfMTZ4MTZfc3NlMzsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICB9Ci0jZW5kaWYKLQotCi0KLSNpZiBIQVZFX1NTRTRfMQotICAgIGlmIChTU0U0XzFFbmFibGVkKQotICAgIHsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDE2eDE2eDggICAgICAgICAgICA9IHZwOF9zYWQxNngxNng4X3NzZTQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQxNng4eDggICAgICAgICAgICAgPSB2cDhfc2FkMTZ4OHg4X3NzZTQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDE2eDggICAgICAgICAgICAgPSB2cDhfc2FkOHgxNng4X3NzZTQ7Ci0gICAgICAgIGNwaS0+cnRjZC52YXJpYW5jZS5zYWQ4eDh4OCAgICAgICAgICAgICAgPSB2cDhfc2FkOHg4eDhfc3NlNDsKLSAgICAgICAgY3BpLT5ydGNkLnZhcmlhbmNlLnNhZDR4NHg4ICAgICAgICAgICAgICA9IHZwOF9zYWQ0eDR4OF9zc2U0OwotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0gICAgICAgIGNwaS0+cnRjZC5zZWFyY2guZnVsbF9zZWFyY2ggICAgICAgICAgICAgPSB2cDhfZnVsbF9zZWFyY2hfc2FkeDg7Ci0jZW5kaWYKLSAgICB9Ci0jZW5kaWYKLQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS92cDgvdnA4X2NvbW1vbi5tayBiL3ZwOC92cDhfY29tbW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJmMGNmLi4wMDAwMDAwCi0tLSBhL3ZwOC92cDhfY29tbW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMjCi0jIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMjCi0jIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0jIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0jIwotCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IHZwOF9jb21tb24ubWsKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3R5cGVfYWxpYXNlcy5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9wcmFnbWFzLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3BwZmxhZ3MuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vb255eC5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9vbnl4ZC5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9hbGxvY2NvbW1vbi5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9ibG9ja2QuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vY29lZnVwZGF0ZXByb2JzLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2RlYnVnbW9kZXMuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZGVmYXVsdGNvZWZjb3VudHMuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZW50cm9weS5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9lbnRyb3B5bW9kZS5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9lbnRyb3B5bXYuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZXh0ZW5kLmMKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2ZpbHRlci5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9maWx0ZXIuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZmluZG5lYXJtdi5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9nZW5lcmljL3N5c3RlbWRlcGVuZGVudC5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9pZGN0bGxtLmMKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2FsbG9jY29tbW9uLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2Jsb2NrZC5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9jb21tb24uaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vY29tbW9uX3R5cGVzLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2VudHJvcHkuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZW50cm9weW1vZGUuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vZW50cm9weW12LmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2V4dGVuZC5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9maW5kbmVhcm12LmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2dfY29tbW9uLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2hlYWRlci5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9pZGN0LmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2ludnRyYW5zLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL2xvb3BmaWx0ZXIuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbW9kZWNvbnQuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbXYuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vb255eGNfaW50LmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3F1YW50X2NvbW1vbi5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9yZWNvbi5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9yZWNvbmludGVyLmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3JlY29uaW50cmEuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcmVjb25pbnRyYTR4NC5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9zZXR1cGludHJhcmVjb24uaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vc3VicGl4ZWwuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vc3dhcHl2MTJidWZmZXIuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vc3lzdGVtZGVwZW5kZW50LmgKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3RocmVhZGluZy5oCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi90cmVlY29kZXIuaAotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vaW52dHJhbnMuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbG9vcGZpbHRlci5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9sb29wZmlsdGVyX2ZpbHRlcnMuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vbWJwaXRjaC5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9tb2RlY29udC5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9tb2RlY29udGV4dC5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9xdWFudF9jb21tb24uYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcmVjb24uYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vcmVjb25pbnRlci5jCi1WUDhfQ09NTU9OX1NSQ1MteWVzICs9IGNvbW1vbi9yZWNvbmludHJhLmMKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3JlY29uaW50cmE0eDQuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vc2V0dXBpbnRyYXJlY29uLmMKLVZQOF9DT01NT05fU1JDUy15ZXMgKz0gY29tbW9uL3N3YXB5djEyYnVmZmVyLmMKLVZQOF9DT01NT05fU1JDUy0kKENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSKSArPSBjb21tb24vdGV4dGJsaXQuYwotVlA4X0NPTU1PTl9TUkNTLXllcyArPSBjb21tb24vdHJlZWNvZGVyLmMKLQotVlA4X0NPTU1PTl9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gY29tbW9uL3g4Ni9pZGN0X3g4Ni5oCi1WUDhfQ09NTU9OX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBjb21tb24veDg2L3N1YnBpeGVsX3g4Ni5oCi1WUDhfQ09NTU9OX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBjb21tb24veDg2L3JlY29uX3g4Ni5oCi1WUDhfQ09NTU9OX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBjb21tb24veDg2L2xvb3BmaWx0ZXJfeDg2LmgKLVZQOF9DT01NT05fU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGNvbW1vbi94ODYvcG9zdHByb2NfeDg2LmgKLVZQOF9DT01NT05fU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGNvbW1vbi94ODYveDg2X3N5c3RlbWRlcGVuZGVudC5jCi1WUDhfQ09NTU9OX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBjb21tb24veDg2L3ZwOF9hc21fc3R1YnMuYwotVlA4X0NPTU1PTl9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gY29tbW9uL3g4Ni9sb29wZmlsdGVyX3g4Ni5jCi1WUDhfQ09NTU9OX1NSQ1MtJChDT05GSUdfUE9TVFBST0MpICs9IGNvbW1vbi9wb3N0cHJvYy5oCi1WUDhfQ09NTU9OX1NSQ1MtJChDT05GSUdfUE9TVFBST0MpICs9IGNvbW1vbi9wb3N0cHJvYy5jCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9pZGN0bGxtX21teC5hc20KLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfTU1YKSArPSBjb21tb24veDg2L2l3YWxzaF9tbXguYXNtCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9yZWNvbl9tbXguYXNtCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9zdWJwaXhlbF9tbXguYXNtCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX01NWCkgKz0gY29tbW9uL3g4Ni9sb29wZmlsdGVyX21teC5hc20KLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9pZGN0bGxtX3NzZTIuYXNtCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX1NTRTIpICs9IGNvbW1vbi94ODYvcmVjb25fc3NlMi5hc20KLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9zdWJwaXhlbF9zc2UyLmFzbQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU0UyKSArPSBjb21tb24veDg2L2xvb3BmaWx0ZXJfc3NlMi5hc20KLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NFMikgKz0gY29tbW9uL3g4Ni9pd2Fsc2hfc3NlMi5hc20KLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfU1NTRTMpICs9IGNvbW1vbi94ODYvc3VicGl4ZWxfc3NzZTMuYXNtCi1pZmVxICgkKENPTkZJR19QT1NUUFJPQykseWVzKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9NTVgpICs9IGNvbW1vbi94ODYvcG9zdHByb2NfbW14LmFzbQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9TU0UyKSArPSBjb21tb24veDg2L3Bvc3Rwcm9jX3NzZTIuYXNtCi1lbmRpZgotCi1WUDhfQ09NTU9OX1NSQ1MtJChBUkNIX0FSTSkgICs9IGNvbW1vbi9hc21fY29tX29mZnNldHMuYwotVlA4X0NPTU1PTl9TUkNTLSQoQVJDSF9BUk0pICArPSBjb21tb24vYXJtL2FybV9zeXN0ZW1kZXBlbmRlbnQuYwotCi0jIGNvbW1vbiAoYykKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjYpICArPSBjb21tb24vYXJtL2JpbGluZWFyZmlsdGVyX2FybS5jCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9iaWxpbmVhcmZpbHRlcl9hcm0uaAotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGNvbW1vbi9hcm0vZmlsdGVyX2FybS5jCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9sb29wZmlsdGVyX2FybS5jCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9yZWNvbmludHJhX2FybS5jCi0KLSMgY29tbW9uIChhcm12NikKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjYpICArPSBjb21tb24vYXJtL2FybXY2L2JpbGluZWFyZmlsdGVyX3Y2JChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg0X3Y2JChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtOHg4X3Y2JChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9hcm12Ni9jb3B5bWVtMTZ4MTZfdjYkKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjYpICArPSBjb21tb24vYXJtL2FybXY2L2RjX29ubHlfaWRjdF9hZGRfdjYkKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjYpICArPSBjb21tb24vYXJtL2FybXY2L2l3YWxzaF92NiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGNvbW1vbi9hcm0vYXJtdjYvZmlsdGVyX3Y2JChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9hcm12Ni9pZGN0X3Y2JChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9hcm12Ni9sb29wZmlsdGVyX3Y2JChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gY29tbW9uL2FybS9hcm12Ni9yZWNvbl92NiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGNvbW1vbi9hcm0vYXJtdjYvc2ltcGxlbG9vcGZpbHRlcl92NiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGNvbW1vbi9hcm0vYXJtdjYvc2l4dGFwcHJlZGljdDh4NF92NiQoQVNNKQotCi0jIGNvbW1vbiAobmVvbikKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0NHg0X25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0OHg0X25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0OHg4X25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vYmlsaW5lYXJwcmVkaWN0MTZ4MTZfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9jb3B5bWVtOHg0X25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vY29weW1lbTh4OF9uZW9uJChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gY29tbW9uL2FybS9uZW9uL2NvcHltZW0xNngxNl9uZW9uJChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gY29tbW9uL2FybS9uZW9uL2RjX29ubHlfaWRjdF9hZGRfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9pd2Fsc2hfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9sb29wZmlsdGVyX25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vbG9vcGZpbHRlcnNpbXBsZWhvcml6b250YWxlZGdlX25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vbG9vcGZpbHRlcnNpbXBsZXZlcnRpY2FsZWRnZV9uZW9uJChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gY29tbW9uL2FybS9uZW9uL21ibG9vcGZpbHRlcl9uZW9uJChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gY29tbW9uL2FybS9uZW9uL3JlY29uMmJfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9yZWNvbjRiX25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vcmVjb25iX25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtXzFfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0NHg0X25lb24kKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vc2l4dGFwcHJlZGljdDh4NF9uZW9uJChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gY29tbW9uL2FybS9uZW9uL3NpeHRhcHByZWRpY3Q4eDhfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9zaXh0YXBwcmVkaWN0MTZ4MTZfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9yZWNvbjE2eDE2bWJfbmVvbiQoQVNNKQotVlA4X0NPTU1PTl9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGNvbW1vbi9hcm0vbmVvbi9idWlsZGludHJhcHJlZGljdG9yc21ieV9uZW9uJChBU00pCi1WUDhfQ09NTU9OX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gY29tbW9uL2FybS9uZW9uL3NhdmVfbmVvbl9yZWckKEFTTSkKLVZQOF9DT01NT05fU1JDUy0kKEhBVkVfQVJNVjcpICArPSBjb21tb24vYXJtL25lb24vcmVjb25fbmVvbi5jCmRpZmYgLS1naXQgYS92cDgvdnA4X2N4X2lmYWNlLmMgYi92cDgvdnA4X2N4X2lmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjI3MzguLjAwMDAwMDAKLS0tIGEvdnA4L3ZwOF9jeF9pZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKLSNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCi0jaW5jbHVkZSAidnB4X3ZlcnNpb24uaCIKLSNpbmNsdWRlICJ2cDgvZW5jb2Rlci9vbnl4X2ludC5oIgotI2luY2x1ZGUgInZweC92cDhlLmgiCi0jaW5jbHVkZSAidnA4L2VuY29kZXIvZmlyc3RwYXNzLmgiCi0jaW5jbHVkZSAidnA4L2NvbW1vbi9vbnl4LmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIFRoaXMgdmFsdWUgaXMgYSBzZW50aW5lbCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgdXNlciBoYXMgc2V0IGEgbW9kZQotICogZGlyZWN0bHkgdGhyb3VnaCB0aGUgZGVwcmVjYXRlZCBWUDhFX1NFVF9FTkNPRElOR19NT0RFIGNvbnRyb2wuCi0gKi8KLSNkZWZpbmUgTk9fTU9ERV9TRVQgMjU1Ci0KLXN0cnVjdCB2cDhfZXh0cmFjZmcKLXsKLSAgICBzdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0ICpwa3RfbGlzdDsKLSAgICB2cDhlX2VuY29kaW5nX21vZGUgICAgICBlbmNvZGluZ19tb2RlOyAgICAgICAgICAgICAgIC8qKiBiZXN0LCBnb29kLCByZWFsdGltZSAgICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV91c2VkOyAgICAgICAgICAgICAgICAgICAgLyoqIGF2YWlsYWJsZSBjcHUgcGVyY2VudGFnZSBpbiAxLzE2Ki8KLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgZW5hYmxlX2F1dG9fYWx0X3JlZjsgICAgICAgICAgIC8qKiBpZiBlbmNvZGVyIGRlY2lkZXMgdG8gdXNlcyBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lICovCi0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIG5vaXNlX3NlbnNpdGl2aXR5OwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBTaGFycG5lc3M7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHN0YXRpY190aHJlc2g7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHRva2VuX3BhcnRpdGlvbnM7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGFybnJfbWF4X2ZyYW1lczsgICAgLyogYWx0X3JlZiBOb2lzZSBSZWR1Y3Rpb24gTWF4IEZyYW1lIENvdW50ICovCi0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGFybnJfc3RyZW5ndGg7ICAgIC8qIGFsdF9yZWYgTm9pc2UgUmVkdWN0aW9uIFN0cmVuZ3RoICovCi0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGFybnJfdHlwZTsgICAgICAgIC8qIGFsdF9yZWYgZmlsdGVyIHR5cGUgKi8KLSAgICB2cDhlX3R1bmluZyAgICAgICAgICAgICAgICAgdHVuaW5nOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjcV9sZXZlbDsgICAgICAgICAvKiBjb25zdHJhaW5lZCBxdWFsaXR5IGxldmVsICovCi0KLX07Ci0KLXN0cnVjdCBleHRyYWNvbmZpZ19tYXAKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHVzYWdlOwotICAgIHN0cnVjdCB2cDhfZXh0cmFjZmcgY2ZnOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBleHRyYWNvbmZpZ19tYXAgZXh0cmFjZmdfbWFwW10gPQotewotICAgIHsKLSAgICAgICAgMCwKLSAgICAgICAgewotICAgICAgICAgICAgTlVMTCwKLSNpZiAhKENPTkZJR19SRUFMVElNRV9PTkxZKQotICAgICAgICAgICAgVlA4X0JFU1RfUVVBTElUWV9FTkNPRElORywgIC8qIEVuY29kaW5nIE1vZGUgKi8KLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcHVfdXNlZCAgICAgICovCi0jZWxzZQotICAgICAgICAgICAgVlA4X1JFQUxfVElNRV9FTkNPRElORywgICAgIC8qIEVuY29kaW5nIE1vZGUgKi8KLSAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcHVfdXNlZCAgICAgICovCi0jZW5kaWYKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGVfYXV0b19hbHRfcmVmICovCi0gICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9pc2Vfc2Vuc2l0aXZpdHkgKi8KLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGFycG5lc3MgKi8KLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0aWNfdGhyZXNoICovCi0gICAgICAgICAgICBWUDhfT05FX1RPS0VOUEFSVElUSU9OLCAgICAgLyogdG9rZW5fcGFydGl0aW9ucyAqLwotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFybnJfbWF4X2ZyYW1lcyAqLwotICAgICAgICAgICAgMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFybnJfc3RyZW5ndGggKi8KLSAgICAgICAgICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcm5yX3R5cGUqLwotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR1bmluZyovCi0gICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3FfbGV2ZWwgKi8KLSAgICAgICAgfQotICAgIH0KLX07Ci0KLXN0cnVjdCB2cHhfY29kZWNfYWxnX3ByaXYKLXsKLSAgICB2cHhfY29kZWNfcHJpdl90ICAgICAgICBiYXNlOwotICAgIHZweF9jb2RlY19lbmNfY2ZnX3QgICAgIGNmZzsKLSAgICBzdHJ1Y3QgdnA4X2V4dHJhY2ZnICAgICB2cDhfY2ZnOwotICAgIFZQOF9DT05GSUcgICAgICAgICAgICAgIG94Y2Y7Ci0gICAgVlA4X1BUUiAgICAgICAgICAgICBjcGk7Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICAgICAqY3hfZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjeF9kYXRhX3N6OwotICAgIHZweF9pbWFnZV90ICAgICAgICAgICAgIHByZXZpZXdfaW1nOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIG5leHRfZnJhbWVfZmxhZzsKLSAgICB2cDhfcG9zdHByb2NfY2ZnX3QgICAgICBwcmV2aWV3X3BwY2ZnOwotICAgIHZweF9jb2RlY19wa3RfbGlzdF9kZWNsKDY0KSBwa3RfbGlzdDsgICAgICAgICAgICAgIC8vIGNoYW5nZWQgdG8gYWNjb21lbmRhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxhZ2dlZCBmcmFtZXMgYWxsb3dlZAotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkX21vZGU7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGZpeGVkX2tmX2NudHI7Ci19OwotCi0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QKLXVwZGF0ZV9lcnJvcl9zdGF0ZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgICAgICAgICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2ludGVybmFsX2Vycm9yX2luZm8gKmVycm9yKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXM7Ci0KLSAgICBpZiAoKHJlcyA9IGVycm9yLT5lcnJvcl9jb2RlKSkKLSAgICAgICAgY3R4LT5iYXNlLmVycl9kZXRhaWwgPSBlcnJvci0+aGFzX2RldGFpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyb3ItPmRldGFpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotI3VuZGVmIEVSUk9SCi0jZGVmaW5lIEVSUk9SKHN0cikgZG8ge1wKLSAgICAgICAgY3R4LT5iYXNlLmVycl9kZXRhaWwgPSBzdHI7XAotICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07XAotICAgIH0gd2hpbGUoMCkKLQotI2RlZmluZSBSQU5HRV9DSEVDSyhwLG1lbWIsbG8saGkpIGRvIHtcCi0gICAgICAgIGlmKCEoKChwKS0+bWVtYiA9PSBsbyB8fCAocCktPm1lbWIgPiAobG8pKSAmJiAocCktPm1lbWIgPD0gaGkpKSBcCi0gICAgICAgICAgICBFUlJPUigjbWVtYiAiIG91dCBvZiByYW5nZSBbIiNsbyIuLiIjaGkiXSIpO1wKLSAgICB9IHdoaWxlKDApCi0KLSNkZWZpbmUgUkFOR0VfQ0hFQ0tfSEkocCxtZW1iLGhpKSBkbyB7XAotICAgICAgICBpZighKChwKS0+bWVtYiA8PSAoaGkpKSkgXAotICAgICAgICAgICAgRVJST1IoI21lbWIgIiBvdXQgb2YgcmFuZ2UgWy4uIiNoaSJdIik7XAotICAgIH0gd2hpbGUoMCkKLQotI2RlZmluZSBSQU5HRV9DSEVDS19MTyhwLG1lbWIsbG8pIGRvIHtcCi0gICAgICAgIGlmKCEoKHApLT5tZW1iID49IChsbykpKSBcCi0gICAgICAgICAgICBFUlJPUigjbWVtYiAiIG91dCBvZiByYW5nZSBbIiNsbyIuLl0iKTtcCi0gICAgfSB3aGlsZSgwKQotCi0jZGVmaW5lIFJBTkdFX0NIRUNLX0JPT0wocCxtZW1iKSBkbyB7XAotICAgICAgICBpZighISgocCktPm1lbWIpICE9IChwKS0+bWVtYikgRVJST1IoI21lbWIgIiBleHBlY3RlZCBib29sZWFuIik7XAotICAgIH0gd2hpbGUoMCkKLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2YWxpZGF0ZV9jb25maWcodnB4X2NvZGVjX2FsZ19wcml2X3QgICAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2VuY19jZmdfdCAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZwOF9leHRyYWNmZyAqdnA4X2NmZykKLXsKLSAgICBSQU5HRV9DSEVDSyhjZmcsIGdfdywgICAgICAgICAgICAgICAgICAgMSwgMTYzODQpOwotICAgIFJBTkdFX0NIRUNLKGNmZywgZ19oLCAgICAgICAgICAgICAgICAgICAxLCAxNjM4NCk7Ci0gICAgUkFOR0VfQ0hFQ0soY2ZnLCBnX3RpbWViYXNlLmRlbiwgICAgICAgIDEsIDEwMDAwMDAwMDApOwotICAgIFJBTkdFX0NIRUNLKGNmZywgZ190aW1lYmFzZS5udW0sICAgICAgICAxLCBjZmctPmdfdGltZWJhc2UuZGVuKTsKLSAgICBSQU5HRV9DSEVDS19ISShjZmcsIGdfcHJvZmlsZSwgICAgICAgICAgMyk7Ci0gICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCByY19tYXhfcXVhbnRpemVyLCAgIDYzKTsKLSAgICBSQU5HRV9DSEVDS19ISShjZmcsIHJjX21pbl9xdWFudGl6ZXIsICAgY2ZnLT5yY19tYXhfcXVhbnRpemVyKTsKLSAgICBSQU5HRV9DSEVDS19ISShjZmcsIGdfdGhyZWFkcywgICAgICAgICAgNjQpOwotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0gICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCBnX2xhZ19pbl9mcmFtZXMsICAgIDI1KTsKLSNlbHNlCi0gICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCBnX2xhZ19pbl9mcmFtZXMsICAgIDApOwotI2VuZGlmCi0gICAgUkFOR0VfQ0hFQ0soY2ZnLCByY19lbmRfdXNhZ2UsICAgICAgICAgIFZQWF9WQlIsIFZQWF9DUSk7Ci0gICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCByY191bmRlcnNob290X3BjdCwgIDEwMCk7Ci0gICAgUkFOR0VfQ0hFQ0tfSEkoY2ZnLCByY18ycGFzc192YnJfYmlhc19wY3QsIDEwMCk7Ci0gICAgUkFOR0VfQ0hFQ0soY2ZnLCBrZl9tb2RlLCAgICAgICAgICAgICAgIFZQWF9LRl9ESVNBQkxFRCwgVlBYX0tGX0FVVE8pOwotICAgIC8vUkFOR0VfQ0hFQ0tfQk9PTChjZmcsICAgICAgICAgICAgICAgICBnX2RlbGV0ZV9maXJzdHBhc3NmaWxlKTsKLSAgICBSQU5HRV9DSEVDS19CT09MKGNmZywgICAgICAgICAgICAgICAgICAgcmNfcmVzaXplX2FsbG93ZWQpOwotICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfZHJvcGZyYW1lX3RocmVzaCwgICAxMDApOwotICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfcmVzaXplX3VwX3RocmVzaCwgICAxMDApOwotICAgIFJBTkdFX0NIRUNLX0hJKGNmZywgcmNfcmVzaXplX2Rvd25fdGhyZXNoLCAxMDApOwotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0gICAgUkFOR0VfQ0hFQ0soY2ZnLCAgICAgICAgZ19wYXNzLCAgICAgICAgIFZQWF9SQ19PTkVfUEFTUywgVlBYX1JDX0xBU1RfUEFTUyk7Ci0jZWxzZQotICAgIFJBTkdFX0NIRUNLKGNmZywgICAgICAgIGdfcGFzcywgICAgICAgICBWUFhfUkNfT05FX1BBU1MsIFZQWF9SQ19PTkVfUEFTUyk7Ci0jZW5kaWYKLQotICAgIC8qIFZQOCBkb2VzIG5vdCBzdXBwb3J0IGEgbG93ZXIgYm91bmQgb24gdGhlIGtleWZyYW1lIGludGVydmFsIGluCi0gICAgICogYXV0b21hdGljIGtleWZyYW1lIHBsYWNlbWVudCBtb2RlLgotICAgICAqLwotICAgIGlmIChjZmctPmtmX21vZGUgIT0gVlBYX0tGX0RJU0FCTEVEICYmIGNmZy0+a2ZfbWluX2Rpc3QgIT0gY2ZnLT5rZl9tYXhfZGlzdAotICAgICAgICAmJiBjZmctPmtmX21pbl9kaXN0ID4gMCkKLSAgICAgICAgRVJST1IoImtmX21pbl9kaXN0IG5vdCBzdXBwb3J0ZWQgaW4gYXV0byBtb2RlLCB1c2UgMCAiCi0gICAgICAgICAgICAgICJvciBrZl9tYXhfZGlzdCBpbnN0ZWFkLiIpOwotCi0gICAgUkFOR0VfQ0hFQ0tfQk9PTCh2cDhfY2ZnLCAgICAgICAgICAgICAgIGVuYWJsZV9hdXRvX2FsdF9yZWYpOwotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0gICAgUkFOR0VfQ0hFQ0sodnA4X2NmZywgZW5jb2RpbmdfbW9kZSwgICAgICBWUDhfQkVTVF9RVUFMSVRZX0VOQ09ESU5HLCBWUDhfUkVBTF9USU1FX0VOQ09ESU5HKTsKLSAgICBSQU5HRV9DSEVDSyh2cDhfY2ZnLCBjcHVfdXNlZCwgICAgICAgICAgIC0xNiwgMTYpOwotICAgIFJBTkdFX0NIRUNLX0hJKHZwOF9jZmcsIG5vaXNlX3NlbnNpdGl2aXR5LCAgNik7Ci0jZWxzZQotICAgIFJBTkdFX0NIRUNLKHZwOF9jZmcsIGVuY29kaW5nX21vZGUsICAgICAgVlA4X1JFQUxfVElNRV9FTkNPRElORywgVlA4X1JFQUxfVElNRV9FTkNPRElORyk7Ci0KLSAgICBpZiAoISgodnA4X2NmZy0+Y3B1X3VzZWQgPj0gLTE2ICYmIHZwOF9jZmctPmNwdV91c2VkIDw9IC00KSB8fCAodnA4X2NmZy0+Y3B1X3VzZWQgPj0gNCAmJiB2cDhfY2ZnLT5jcHVfdXNlZCA8PSAxNikpKQotICAgICAgICBFUlJPUigiY3B1X3VzZWQgb3V0IG9mIHJhbmdlIFstMTYuLi00XSBvciBbNC4uMTZdIik7Ci0KLSAgICBSQU5HRV9DSEVDSyh2cDhfY2ZnLCBub2lzZV9zZW5zaXRpdml0eSwgIDAsIDApOwotI2VuZGlmCi0KLSAgICBSQU5HRV9DSEVDSyh2cDhfY2ZnLCB0b2tlbl9wYXJ0aXRpb25zLCAgIFZQOF9PTkVfVE9LRU5QQVJUSVRJT04sIFZQOF9FSUdIVF9UT0tFTlBBUlRJVElPTik7Ci0gICAgUkFOR0VfQ0hFQ0tfSEkodnA4X2NmZywgU2hhcnBuZXNzLCAgICAgICA3KTsKLSAgICBSQU5HRV9DSEVDSyh2cDhfY2ZnLCBhcm5yX21heF9mcmFtZXMsIDAsIDE1KTsKLSAgICBSQU5HRV9DSEVDS19ISSh2cDhfY2ZnLCBhcm5yX3N0cmVuZ3RoLCAgIDYpOwotICAgIFJBTkdFX0NIRUNLKHZwOF9jZmcsIGFybnJfdHlwZSwgICAgICAgMSwgMyk7Ci0gICAgUkFOR0VfQ0hFQ0sodnA4X2NmZywgY3FfbGV2ZWwsIDAsIDYzKTsKLQotI2lmICEoQ09ORklHX1JFQUxUSU1FX09OTFkpCi0gICAgaWYgKGNmZy0+Z19wYXNzID09IFZQWF9SQ19MQVNUX1BBU1MpCi0gICAgewotICAgICAgICBpbnQgICAgICAgICAgICAgIG1iX3IgPSAoY2ZnLT5nX2ggKyAxNSkgLyAxNjsKLSAgICAgICAgaW50ICAgICAgICAgICAgICBtYl9jID0gKGNmZy0+Z193ICsgMTUpIC8gMTY7Ci0gICAgICAgIHNpemVfdCAgICAgICAgICAgcGFja2V0X3N6ID0gc2l6ZW9mKEZJUlNUUEFTU19TVEFUUyk7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgbl9wYWNrZXRzID0gY2ZnLT5yY190d29wYXNzX3N0YXRzX2luLnN6IC8gcGFja2V0X3N6OwotICAgICAgICBGSVJTVFBBU1NfU1RBVFMgKnN0YXRzOwotCi0gICAgICAgIGlmICghY2ZnLT5yY190d29wYXNzX3N0YXRzX2luLmJ1ZikKLSAgICAgICAgICAgIEVSUk9SKCJyY190d29wYXNzX3N0YXRzX2luLmJ1ZiBub3Qgc2V0LiIpOwotCi0gICAgICAgIGlmIChjZmctPnJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3ogJSBwYWNrZXRfc3opCi0gICAgICAgICAgICBFUlJPUigicmNfdHdvcGFzc19zdGF0c19pbi5zeiBpbmRpY2F0ZXMgdHJ1bmNhdGVkIHBhY2tldC4iKTsKLQotICAgICAgICBpZiAoY2ZnLT5yY190d29wYXNzX3N0YXRzX2luLnN6IDwgMiAqIHBhY2tldF9zeikKLSAgICAgICAgICAgIEVSUk9SKCJyY190d29wYXNzX3N0YXRzX2luIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBwYWNrZXRzLiIpOwotCi0gICAgICAgIHN0YXRzID0gKHZvaWQqKSgoY2hhciAqKWNmZy0+cmNfdHdvcGFzc19zdGF0c19pbi5idWYKLSAgICAgICAgICAgICAgICArIChuX3BhY2tldHMgLSAxKSAqIHBhY2tldF9zeik7Ci0KLSAgICAgICAgaWYgKChpbnQpKHN0YXRzLT5jb3VudCArIDAuNSkgIT0gbl9wYWNrZXRzIC0gMSkKLSAgICAgICAgICAgIEVSUk9SKCJyY190d29wYXNzX3N0YXRzX2luIG1pc3NpbmcgRU9TIHN0YXRzIHBhY2tldCIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLX0KLQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZhbGlkYXRlX2ltZyh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgICAgKmltZykKLXsKLSAgICBzd2l0Y2ggKGltZy0+Zm10KQotICAgIHsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1lWMTI6Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIwOgotICAgIGNhc2UgVlBYX0lNR19GTVRfVlBYSTQyMDoKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1ZQWFlWMTI6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEVSUk9SKCJJbnZhbGlkIGltYWdlIGZvcm1hdC4gT25seSBZVjEyIGFuZCBJNDIwIGltYWdlcyBhcmUgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgaWYgKChpbWctPmRfdyAhPSBjdHgtPmNmZy5nX3cpIHx8IChpbWctPmRfaCAhPSBjdHgtPmNmZy5nX2gpKQotICAgICAgICBFUlJPUigiSW1hZ2Ugc2l6ZSBtdXN0IG1hdGNoIGVuY29kZXIgaW5pdCBjb25maWd1cmF0aW9uIHNpemUiKTsKLQotICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci19Ci0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCBzZXRfdnA4ZV9jb25maWcoVlA4X0NPTkZJRyAqb3hjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19lbmNfY2ZnX3QgY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZwOF9leHRyYWNmZyB2cDhfY2ZnKQotewotICAgIG94Y2YtPm11bHRpX3RocmVhZGVkICAgICAgICAgPSBjZmcuZ190aHJlYWRzOwotICAgIG94Y2YtPlZlcnNpb24gICAgICAgICAgICAgICA9IGNmZy5nX3Byb2ZpbGU7Ci0KLSAgICBveGNmLT5XaWR0aCAgICAgICAgICAgICAgICAgPSBjZmcuZ193OwotICAgIG94Y2YtPkhlaWdodCAgICAgICAgICAgICAgICA9IGNmZy5nX2g7Ci0gICAgLyogZ3Vlc3MgYSBmcmFtZSByYXRlIGlmIG91dCBvZiB3aGFjaywgdXNlIDMwICovCi0gICAgb3hjZi0+ZnJhbWVfcmF0ZSAgICAgICAgICAgICA9IChkb3VibGUpKGNmZy5nX3RpbWViYXNlLmRlbikgLyAoZG91YmxlKShjZmcuZ190aW1lYmFzZS5udW0pOwotCi0gICAgaWYgKG94Y2YtPmZyYW1lX3JhdGUgPiAxODApCi0gICAgewotICAgICAgICBveGNmLT5mcmFtZV9yYXRlID0gMzA7Ci0gICAgfQotCi0gICAgb3hjZi0+ZXJyb3JfcmVzaWxpZW50X21vZGUgICAgPSBjZmcuZ19lcnJvcl9yZXNpbGllbnQ7Ci0KLSAgICBzd2l0Y2ggKGNmZy5nX3Bhc3MpCi0gICAgewotICAgIGNhc2UgVlBYX1JDX09ORV9QQVNTOgotICAgICAgICBveGNmLT5Nb2RlID0gTU9ERV9CRVNUUVVBTElUWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWUFhfUkNfRklSU1RfUEFTUzoKLSAgICAgICAgb3hjZi0+TW9kZSA9IE1PREVfRklSU1RQQVNTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFZQWF9SQ19MQVNUX1BBU1M6Ci0gICAgICAgIG94Y2YtPk1vZGUgPSBNT0RFX1NFQ09ORFBBU1NfQkVTVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGNmZy5nX3Bhc3MgPT0gVlBYX1JDX0ZJUlNUX1BBU1MpCi0gICAgewotICAgICAgICBveGNmLT5hbGxvd19sYWcgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgb3hjZi0+bGFnX2luX2ZyYW1lcyAgICAgICAgICAgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBveGNmLT5hbGxvd19sYWcgICAgICAgICAgICAgID0gKGNmZy5nX2xhZ19pbl9mcmFtZXMpID4gMDsKLSAgICAgICAgb3hjZi0+bGFnX2luX2ZyYW1lcyAgICAgICAgICAgPSBjZmcuZ19sYWdfaW5fZnJhbWVzOwotICAgIH0KLQotICAgIG94Y2YtPmFsbG93X2RmICAgICAgICAgICAgICAgPSAoY2ZnLnJjX2Ryb3BmcmFtZV90aHJlc2ggPiAwKTsKLSAgICBveGNmLT5kcm9wX2ZyYW1lc193YXRlcl9tYXJrICAgPSBjZmcucmNfZHJvcGZyYW1lX3RocmVzaDsKLQotICAgIG94Y2YtPmFsbG93X3NwYXRpYWxfcmVzYW1wbGluZyA9IGNmZy5yY19yZXNpemVfYWxsb3dlZDsKLSAgICBveGNmLT5yZXNhbXBsZV91cF93YXRlcl9tYXJrICAgPSBjZmcucmNfcmVzaXplX3VwX3RocmVzaDsKLSAgICBveGNmLT5yZXNhbXBsZV9kb3duX3dhdGVyX21hcmsgPSBjZmcucmNfcmVzaXplX2Rvd25fdGhyZXNoOwotCi0gICAgaWYgKGNmZy5yY19lbmRfdXNhZ2UgPT0gVlBYX1ZCUikKLSAgICB7Ci0gICAgICAgIG94Y2YtPmVuZF91c2FnZSAgICAgICAgICA9IFVTQUdFX0xPQ0FMX0ZJTEVfUExBWUJBQ0s7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNmZy5yY19lbmRfdXNhZ2UgPT0gVlBYX0NCUikKLSAgICB7Ci0gICAgICAgIG94Y2YtPmVuZF91c2FnZSAgICAgICAgICA9IFVTQUdFX1NUUkVBTV9GUk9NX1NFUlZFUjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2ZnLnJjX2VuZF91c2FnZSA9PSBWUFhfQ1EpCi0gICAgewotICAgICAgICBveGNmLT5lbmRfdXNhZ2UgICAgICAgICAgPSBVU0FHRV9DT05TVFJBSU5FRF9RVUFMSVRZOwotICAgIH0KLQotICAgIG94Y2YtPnRhcmdldF9iYW5kd2lkdGggICAgICAgPSBjZmcucmNfdGFyZ2V0X2JpdHJhdGU7Ci0KLSAgICBveGNmLT5iZXN0X2FsbG93ZWRfcSAgICAgICAgICA9IGNmZy5yY19taW5fcXVhbnRpemVyOwotICAgIG94Y2YtPndvcnN0X2FsbG93ZWRfcSAgICAgICAgID0gY2ZnLnJjX21heF9xdWFudGl6ZXI7Ci0gICAgb3hjZi0+Y3FfbGV2ZWwgICAgICAgICAgICAgICAgPSB2cDhfY2ZnLmNxX2xldmVsOwotICAgIG94Y2YtPmZpeGVkX3EgPSAtMTsKLQotICAgIG94Y2YtPnVuZGVyX3Nob290X3BjdCAgICAgICAgID0gY2ZnLnJjX3VuZGVyc2hvb3RfcGN0OwotICAgIC8vb3hjZi0+b3Zlcl9zaG9vdF9wY3QgICAgICAgID0gY2ZnLnJjX292ZXJzaG9vdF9wY3Q7Ci0KLSAgICBveGNmLT5tYXhpbXVtX2J1ZmZlcl9zaXplICAgICA9IGNmZy5yY19idWZfc3o7Ci0gICAgb3hjZi0+c3RhcnRpbmdfYnVmZmVyX2xldmVsICAgPSBjZmcucmNfYnVmX2luaXRpYWxfc3o7Ci0gICAgb3hjZi0+b3B0aW1hbF9idWZmZXJfbGV2ZWwgICAgPSBjZmcucmNfYnVmX29wdGltYWxfc3o7Ci0KLSAgICBveGNmLT50d29fcGFzc192YnJiaWFzICAgICAgICA9IGNmZy5yY18ycGFzc192YnJfYmlhc19wY3Q7Ci0gICAgb3hjZi0+dHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gID0gY2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdDsKLSAgICBveGNmLT50d29fcGFzc192YnJtYXhfc2VjdGlvbiAgPSBjZmcucmNfMnBhc3NfdmJyX21heHNlY3Rpb25fcGN0OwotCi0gICAgb3hjZi0+YXV0b19rZXkgICAgICAgICAgICAgICA9IGNmZy5rZl9tb2RlID09IFZQWF9LRl9BVVRPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNmZy5rZl9taW5fZGlzdCAhPSBjZmcua2ZfbWF4X2Rpc3Q7Ci0gICAgLy9veGNmLT5rZl9taW5fZGlzdCAgICAgICAgID0gY2ZnLmtmX21pbl9kaXM7Ci0gICAgb3hjZi0+a2V5X2ZyZXEgICAgICAgICAgICAgICA9IGNmZy5rZl9tYXhfZGlzdDsKLQotICAgIC8vb3hjZi0+ZGVsZXRlX2ZpcnN0X3Bhc3NfZmlsZSA9IGNmZy5nX2RlbGV0ZV9maXJzdHBhc3NmaWxlOwotICAgIC8vc3RyY3B5KG94Y2YtPmZpcnN0X3Bhc3NfZmlsZSwgY2ZnLmdfZmlyc3RwYXNzX2ZpbGUpOwotCi0gICAgb3hjZi0+Y3B1X3VzZWQgICAgICAgICAgICAgICA9ICB2cDhfY2ZnLmNwdV91c2VkOwotICAgIG94Y2YtPmVuY29kZV9icmVha291dCAgICAgICAgPSAgdnA4X2NmZy5zdGF0aWNfdGhyZXNoOwotICAgIG94Y2YtPnBsYXlfYWx0ZXJuYXRlICAgICAgICAgPSAgdnA4X2NmZy5lbmFibGVfYXV0b19hbHRfcmVmOwotICAgIG94Y2YtPm5vaXNlX3NlbnNpdGl2aXR5ICAgICAgPSAgdnA4X2NmZy5ub2lzZV9zZW5zaXRpdml0eTsKLSAgICBveGNmLT5TaGFycG5lc3MgICAgICAgICAgICAgPSAgdnA4X2NmZy5TaGFycG5lc3M7Ci0gICAgb3hjZi0+dG9rZW5fcGFydGl0aW9ucyAgICAgICA9ICB2cDhfY2ZnLnRva2VuX3BhcnRpdGlvbnM7Ci0KLSAgICBveGNmLT50d29fcGFzc19zdGF0c19pbiAgICAgICAgPSAgY2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW47Ci0gICAgb3hjZi0+b3V0cHV0X3BrdF9saXN0ICAgICAgICAgPSAgdnA4X2NmZy5wa3RfbGlzdDsKLQotICAgIG94Y2YtPmFybnJfbWF4X2ZyYW1lcyA9IHZwOF9jZmcuYXJucl9tYXhfZnJhbWVzOwotICAgIG94Y2YtPmFybnJfc3RyZW5ndGggPSAgdnA4X2NmZy5hcm5yX3N0cmVuZ3RoOwotICAgIG94Y2YtPmFybnJfdHlwZSA9ICAgICAgdnA4X2NmZy5hcm5yX3R5cGU7Ci0KLSAgICBveGNmLT50dW5pbmcgPSB2cDhfY2ZnLnR1bmluZzsKLQotICAgIC8qCi0gICAgICAgIHByaW50ZigiQ3VycmVudCBWUDggU2V0dGluZ3M6IFxuIik7Ci0gICAgICAgIHByaW50ZigidGFyZ2V0X2JhbmR3aWR0aDogJWRcbiIsIG94Y2YtPnRhcmdldF9iYW5kd2lkdGgpOwotICAgICAgICBwcmludGYoIm5vaXNlX3NlbnNpdGl2aXR5OiAlZFxuIiwgb3hjZi0+bm9pc2Vfc2Vuc2l0aXZpdHkpOwotICAgICAgICBwcmludGYoIlNoYXJwbmVzczogJWRcbiIsICAgIG94Y2YtPlNoYXJwbmVzcyk7Ci0gICAgICAgIHByaW50ZigiY3B1X3VzZWQ6ICVkXG4iLCAgb3hjZi0+Y3B1X3VzZWQpOwotICAgICAgICBwcmludGYoIk1vZGU6ICVkXG4iLCAgICAgb3hjZi0+TW9kZSk7Ci0gICAgICAgIHByaW50ZigiZGVsZXRlX2ZpcnN0X3Bhc3NfZmlsZTogJWRcbiIsICBveGNmLT5kZWxldGVfZmlyc3RfcGFzc19maWxlKTsKLSAgICAgICAgcHJpbnRmKCJhdXRvX2tleTogJWRcbiIsICBveGNmLT5hdXRvX2tleSk7Ci0gICAgICAgIHByaW50Zigia2V5X2ZyZXE6ICVkXG4iLCBveGNmLT5rZXlfZnJlcSk7Ci0gICAgICAgIHByaW50ZigiZW5kX3VzYWdlOiAlZFxuIiwgb3hjZi0+ZW5kX3VzYWdlKTsKLSAgICAgICAgcHJpbnRmKCJ1bmRlcl9zaG9vdF9wY3Q6ICVkXG4iLCBveGNmLT51bmRlcl9zaG9vdF9wY3QpOwotICAgICAgICBwcmludGYoInN0YXJ0aW5nX2J1ZmZlcl9sZXZlbDogJWRcbiIsIG94Y2YtPnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbCk7Ci0gICAgICAgIHByaW50Zigib3B0aW1hbF9idWZmZXJfbGV2ZWw6ICVkXG4iLCAgb3hjZi0+b3B0aW1hbF9idWZmZXJfbGV2ZWwpOwotICAgICAgICBwcmludGYoIm1heGltdW1fYnVmZmVyX3NpemU6ICVkXG4iLCBveGNmLT5tYXhpbXVtX2J1ZmZlcl9zaXplKTsKLSAgICAgICAgcHJpbnRmKCJmaXhlZF9xOiAlZFxuIiwgIG94Y2YtPmZpeGVkX3EpOwotICAgICAgICBwcmludGYoIndvcnN0X2FsbG93ZWRfcTogJWRcbiIsIG94Y2YtPndvcnN0X2FsbG93ZWRfcSk7Ci0gICAgICAgIHByaW50ZigiYmVzdF9hbGxvd2VkX3E6ICVkXG4iLCBveGNmLT5iZXN0X2FsbG93ZWRfcSk7Ci0gICAgICAgIHByaW50ZigiYWxsb3dfc3BhdGlhbF9yZXNhbXBsaW5nOiAlZFxuIiwgIG94Y2YtPmFsbG93X3NwYXRpYWxfcmVzYW1wbGluZyk7Ci0gICAgICAgIHByaW50ZigicmVzYW1wbGVfZG93bl93YXRlcl9tYXJrOiAlZFxuIiwgb3hjZi0+cmVzYW1wbGVfZG93bl93YXRlcl9tYXJrKTsKLSAgICAgICAgcHJpbnRmKCJyZXNhbXBsZV91cF93YXRlcl9tYXJrOiAlZFxuIiwgb3hjZi0+cmVzYW1wbGVfdXBfd2F0ZXJfbWFyayk7Ci0gICAgICAgIHByaW50ZigiYWxsb3dfZGY6ICVkXG4iLCBveGNmLT5hbGxvd19kZik7Ci0gICAgICAgIHByaW50ZigiZHJvcF9mcmFtZXNfd2F0ZXJfbWFyazogJWRcbiIsIG94Y2YtPmRyb3BfZnJhbWVzX3dhdGVyX21hcmspOwotICAgICAgICBwcmludGYoInR3b19wYXNzX3ZicmJpYXM6ICVkXG4iLCAgb3hjZi0+dHdvX3Bhc3NfdmJyYmlhcyk7Ci0gICAgICAgIHByaW50ZigidHdvX3Bhc3NfdmJybWluX3NlY3Rpb246ICVkXG4iLCBveGNmLT50d29fcGFzc192YnJtaW5fc2VjdGlvbik7Ci0gICAgICAgIHByaW50ZigidHdvX3Bhc3NfdmJybWF4X3NlY3Rpb246ICVkXG4iLCBveGNmLT50d29fcGFzc192YnJtYXhfc2VjdGlvbik7Ci0gICAgICAgIHByaW50ZigiYWxsb3dfbGFnOiAlZFxuIiwgb3hjZi0+YWxsb3dfbGFnKTsKLSAgICAgICAgcHJpbnRmKCJsYWdfaW5fZnJhbWVzOiAlZFxuIiwgb3hjZi0+bGFnX2luX2ZyYW1lcyk7Ci0gICAgICAgIHByaW50ZigicGxheV9hbHRlcm5hdGU6ICVkXG4iLCBveGNmLT5wbGF5X2FsdGVybmF0ZSk7Ci0gICAgICAgIHByaW50ZigiVmVyc2lvbjogJWRcbiIsIG94Y2YtPlZlcnNpb24pOwotICAgICAgICBwcmludGYoIm11bHRpX3RocmVhZGVkOiAlZFxuIiwgICBveGNmLT5tdWx0aV90aHJlYWRlZCk7Ci0gICAgICAgIHByaW50ZigiZW5jb2RlX2JyZWFrb3V0OiAlZFxuIiwgb3hjZi0+ZW5jb2RlX2JyZWFrb3V0KTsKLSAgICAqLwotICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci19Ci0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfY29uZmlnKHZweF9jb2RlY19hbGdfcHJpdl90ICAgICAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXM7Ci0KLSAgICBpZiAoKGNmZy0+Z193ICE9IGN0eC0+Y2ZnLmdfdykgfHwgKGNmZy0+Z19oICE9IGN0eC0+Y2ZnLmdfaCkpCi0gICAgICAgIEVSUk9SKCJDYW5ub3QgY2hhbmdlIHdpZHRoIG9yIGhlaWdodCBhZnRlciBpbml0aWFsaXphdGlvbiIpOwotCi0gICAgLyogUHJldmVudCBpbmNyZWFzaW5nIGxhZ19pbl9mcmFtZXMuIFRoaXMgY2hlY2sgaXMgc3RyaWN0ZXIgdGhhbiBpdCBuZWVkcwotICAgICAqIHRvIGJlIC0tIHRoZSBsaW1pdCBpcyBub3QgaW5jcmVhc2luZyBwYXN0IHRoZSBmaXJzdCBsYWdfaW5fZnJhbWVzCi0gICAgICogdmFsdWUsIGJ1dCB3ZSBkb24ndCB0cmFjayB0aGUgaW5pdGlhbCBjb25maWcsIG9ubHkgdGhlIGxhc3Qgc3VjY2Vzc2Z1bAotICAgICAqIGNvbmZpZy4KLSAgICAgKi8KLSAgICBpZiAoKGNmZy0+Z19sYWdfaW5fZnJhbWVzID4gY3R4LT5jZmcuZ19sYWdfaW5fZnJhbWVzKSkKLSAgICAgICAgRVJST1IoIkNhbm5vdCBpbmNyZWFzZSBsYWdfaW5fZnJhbWVzIik7Ci0KLSAgICByZXMgPSB2YWxpZGF0ZV9jb25maWcoY3R4LCBjZmcsICZjdHgtPnZwOF9jZmcpOwotCi0gICAgaWYgKCFyZXMpCi0gICAgewotICAgICAgICBjdHgtPmNmZyA9ICpjZmc7Ci0gICAgICAgIHNldF92cDhlX2NvbmZpZygmY3R4LT5veGNmLCBjdHgtPmNmZywgY3R4LT52cDhfY2ZnKTsKLSAgICAgICAgdnA4X2NoYW5nZV9jb25maWcoY3R4LT5jcGksICZjdHgtPm94Y2YpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotaW50IHZwOF9yZXZlcnNlX3RyYW5zKGludCk7Ci0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCBnZXRfcGFyYW0odnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBjdHJsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgICAgICAgICAgIGFyZ3MpCi17Ci0gICAgdm9pZCAqYXJnID0gdmFfYXJnKGFyZ3MsIHZvaWQgKik7Ci0KLSNkZWZpbmUgTUFQKGlkLCB2YXIpIGNhc2UgaWQ6ICooUkVDQVNUKGlkLCBhcmcpKSA9IHZhcjsgYnJlYWsKLQotICAgIGlmICghYXJnKQotICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0KLSAgICBzd2l0Y2ggKGN0cmxfaWQpCi0gICAgewotICAgICAgICBNQVAoVlA4RV9HRVRfTEFTVF9RVUFOVElaRVIsIHZwOF9nZXRfcXVhbnRpemVyKGN0eC0+Y3BpKSk7Ci0gICAgICAgIE1BUChWUDhFX0dFVF9MQVNUX1FVQU5USVpFUl82NCwgdnA4X3JldmVyc2VfdHJhbnModnA4X2dldF9xdWFudGl6ZXIoY3R4LT5jcGkpKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLSN1bmRlZiBNQVAKLX0KLQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHNldF9wYXJhbSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGN0cmxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgICAgYXJncykKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgICAgIHJlcyAgPSBWUFhfQ09ERUNfT0s7Ci0gICAgc3RydWN0IHZwOF9leHRyYWNmZyB4Y2ZnID0gY3R4LT52cDhfY2ZnOwotCi0jZGVmaW5lIE1BUChpZCwgdmFyKSBjYXNlIGlkOiB2YXIgPSBDQVNUKGlkLCBhcmdzKTsgYnJlYWs7Ci0KLSAgICBzd2l0Y2ggKGN0cmxfaWQpCi0gICAgewotICAgICAgICBNQVAoVlA4RV9TRVRfRU5DT0RJTkdfTU9ERSwgICAgICAgICBjdHgtPmRlcHJlY2F0ZWRfbW9kZSk7Ci0gICAgICAgIE1BUChWUDhFX1NFVF9DUFVVU0VELCAgICAgICAgICAgICAgIHhjZmcuY3B1X3VzZWQpOwotICAgICAgICBNQVAoVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwgICAgICB4Y2ZnLmVuYWJsZV9hdXRvX2FsdF9yZWYpOwotICAgICAgICBNQVAoVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksICAgICB4Y2ZnLm5vaXNlX3NlbnNpdGl2aXR5KTsKLSAgICAgICAgTUFQKFZQOEVfU0VUX1NIQVJQTkVTUywgICAgICAgICAgICAgeGNmZy5TaGFycG5lc3MpOwotICAgICAgICBNQVAoVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwgICAgICB4Y2ZnLnN0YXRpY190aHJlc2gpOwotICAgICAgICBNQVAoVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywgICAgICB4Y2ZnLnRva2VuX3BhcnRpdGlvbnMpOwotCi0gICAgICAgIE1BUChWUDhFX1NFVF9BUk5SX01BWEZSQU1FUywgICAgICAgIHhjZmcuYXJucl9tYXhfZnJhbWVzKTsKLSAgICAgICAgTUFQKFZQOEVfU0VUX0FSTlJfU1RSRU5HVEggLCAgICAgICAgeGNmZy5hcm5yX3N0cmVuZ3RoKTsKLSAgICAgICAgTUFQKFZQOEVfU0VUX0FSTlJfVFlQRSAgICAgLCAgICAgICAgeGNmZy5hcm5yX3R5cGUpOwotICAgICAgICBNQVAoVlA4RV9TRVRfVFVOSU5HLCAgICAgICAgICAgICAgICB4Y2ZnLnR1bmluZyk7Ci0gICAgICAgIE1BUChWUDhFX1NFVF9DUV9MRVZFTCwgICAgICAgICAgICAgIHhjZmcuY3FfbGV2ZWwpOwotCi0gICAgfQotCi0gICAgcmVzID0gdmFsaWRhdGVfY29uZmlnKGN0eCwgJmN0eC0+Y2ZnLCAmeGNmZyk7Ci0KLSAgICBpZiAoIXJlcykKLSAgICB7Ci0gICAgICAgIGN0eC0+dnA4X2NmZyA9IHhjZmc7Ci0gICAgICAgIHNldF92cDhlX2NvbmZpZygmY3R4LT5veGNmLCBjdHgtPmNmZywgY3R4LT52cDhfY2ZnKTsKLSAgICAgICAgdnA4X2NoYW5nZV9jb25maWcoY3R4LT5jcGksICZjdHgtPm94Y2YpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci0jdW5kZWYgTUFQCi19Ci1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfaW5pdCh2cHhfY29kZWNfY3R4X3QgKmN0eCkKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgICAgICAgIHJlcyA9IFZQWF9ERUNfT0s7Ci0gICAgc3RydWN0IHZweF9jb2RlY19hbGdfcHJpdiAqcHJpdjsKLSAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAgICAgICpjZmc7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaTsKLQotICAgIFZQOF9QVFIgb3B0cjsKLQotICAgIGlmICghY3R4LT5wcml2KQotICAgIHsKLSAgICAgICAgcHJpdiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHZweF9jb2RlY19hbGdfcHJpdikpOwotCi0gICAgICAgIGlmICghcHJpdikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19NRU1fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjdHgtPnByaXYgPSAmcHJpdi0+YmFzZTsKLSAgICAgICAgY3R4LT5wcml2LT5zeiA9IHNpemVvZigqY3R4LT5wcml2KTsKLSAgICAgICAgY3R4LT5wcml2LT5pZmFjZSA9IGN0eC0+aWZhY2U7Ci0gICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYgPSBwcml2OwotICAgICAgICBjdHgtPnByaXYtPmluaXRfZmxhZ3MgPSBjdHgtPmluaXRfZmxhZ3M7Ci0KLSAgICAgICAgaWYgKGN0eC0+Y29uZmlnLmVuYykKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXBkYXRlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgdG8gYW4KLSAgICAgICAgICAgICAqIGludGVybmFsIGNvcHkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPmNmZyA9ICpjdHgtPmNvbmZpZy5lbmM7Ci0gICAgICAgICAgICBjdHgtPmNvbmZpZy5lbmMgPSAmY3R4LT5wcml2LT5hbGdfcHJpdi0+Y2ZnOwotICAgICAgICB9Ci0KLSAgICAgICAgY2ZnID0gICZjdHgtPnByaXYtPmFsZ19wcml2LT5jZmc7Ci0KLSAgICAgICAgLyogU2VsZWN0IHRoZSBleHRyYSB2cDYgY29uZmlndXJhdGlvbiB0YWJsZSBiYXNlZCBvbiB0aGUgY3VycmVudAotICAgICAgICAgKiB1c2FnZSB2YWx1ZS4gSWYgdGhlIGN1cnJlbnQgdXNhZ2UgdmFsdWUgaXNuJ3QgZm91bmQsIHVzZSB0aGUKLSAgICAgICAgICogdmFsdWVzIGZvciB1c2FnZSBjYXNlIDAuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGkgPSAwOwotICAgICAgICAgICAgIGV4dHJhY2ZnX21hcFtpXS51c2FnZSAmJiBleHRyYWNmZ19tYXBbaV0udXNhZ2UgIT0gY2ZnLT5nX3VzYWdlOwotICAgICAgICAgICAgIGkrKyk7Ci0KLSAgICAgICAgcHJpdi0+dnA4X2NmZyA9IGV4dHJhY2ZnX21hcFtpXS5jZmc7Ci0gICAgICAgIHByaXYtPnZwOF9jZmcucGt0X2xpc3QgPSAmcHJpdi0+cGt0X2xpc3QuaGVhZDsKLQotICAgICAgICBwcml2LT5jeF9kYXRhX3N6ID0gcHJpdi0+Y2ZnLmdfdyAqIHByaXYtPmNmZy5nX2ggKiAzIC8gMiAqIDI7Ci0KLSAgICAgICAgaWYgKHByaXYtPmN4X2RhdGFfc3ogPCA0MDk2KSBwcml2LT5jeF9kYXRhX3N6ID0gNDA5NjsKLQotICAgICAgICBwcml2LT5jeF9kYXRhID0gbWFsbG9jKHByaXYtPmN4X2RhdGFfc3opOwotCi0gICAgICAgIGlmICghcHJpdi0+Y3hfZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19NRU1fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2LT5kZXByZWNhdGVkX21vZGUgPSBOT19NT0RFX1NFVDsKLQotICAgICAgICB2cDhfaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbmZpZyhwcml2LCAmcHJpdi0+Y2ZnLCAmcHJpdi0+dnA4X2NmZyk7Ci0KLSAgICAgICAgaWYgKCFyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldF92cDhlX2NvbmZpZygmY3R4LT5wcml2LT5hbGdfcHJpdi0+b3hjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcml2LT5hbGdfcHJpdi0+Y2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnByaXYtPmFsZ19wcml2LT52cDhfY2ZnKTsKLSAgICAgICAgICAgIG9wdHIgPSB2cDhfY3JlYXRlX2NvbXByZXNzb3IoJmN0eC0+cHJpdi0+YWxnX3ByaXYtPm94Y2YpOwotCi0gICAgICAgICAgICBpZiAoIW9wdHIpCi0gICAgICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX01FTV9FUlJPUjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjdHgtPnByaXYtPmFsZ19wcml2LT5jcGkgPSBvcHRyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX2Rlc3Ryb3kodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCkKLXsKLQotICAgIGZyZWUoY3R4LT5jeF9kYXRhKTsKLSAgICB2cDhfcmVtb3ZlX2NvbXByZXNzb3IoJmN0eC0+Y3BpKTsKLSAgICBmcmVlKGN0eCk7Ci0gICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCBpbWFnZTJ5dXZjb25maWcoY29uc3QgdnB4X2ltYWdlX3QgICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHICAqeXYxMikKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKLSAgICB5djEyLT55X2J1ZmZlciA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKLSAgICB5djEyLT51X2J1ZmZlciA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKLSAgICB5djEyLT52X2J1ZmZlciA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKLQotICAgIHl2MTItPnlfd2lkdGggID0gaW1nLT5kX3c7Ci0gICAgeXYxMi0+eV9oZWlnaHQgPSBpbWctPmRfaDsKLSAgICB5djEyLT51dl93aWR0aCA9ICgxICsgeXYxMi0+eV93aWR0aCkgLyAyOwotICAgIHl2MTItPnV2X2hlaWdodCA9ICgxICsgeXYxMi0+eV9oZWlnaHQpIC8gMjsKLQotICAgIHl2MTItPnlfc3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotICAgIHl2MTItPnV2X3N0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKLQotICAgIHl2MTItPmJvcmRlciAgPSAoaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldIC0gaW1nLT53KSAvIDI7Ci0gICAgeXYxMi0+Y2xydHlwZSA9IChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9WUFhJNDIwIHx8IGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX1ZQWFlWMTIpOyAvL1JFR19ZVVYgPSAwCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgcGlja19xdWlja2NvbXByZXNzX21vZGUodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICBkZWFkbGluZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgbmV3X3FjOwotCi0jaWYgIShDT05GSUdfUkVBTFRJTUVfT05MWSkKLSAgICAvKiBVc2UgYmVzdCBxdWFsaXR5IG1vZGUgaWYgbm8gZGVhZGxpbmUgaXMgZ2l2ZW4uICovCi0gICAgbmV3X3FjID0gTU9ERV9CRVNUUVVBTElUWTsKLQotICAgIGlmIChkZWFkbGluZSkKLSAgICB7Ci0gICAgICAgIHVpbnQ2NF90ICAgICBkdXJhdGlvbl91czsKLQotICAgICAgICAvKiBDb252ZXJ0IGR1cmF0aW9uIHBhcmFtZXRlciBmcm9tIHN0cmVhbSB0aW1lYmFzZSB0byBtaWNyb3NlY29uZHMgKi8KLSAgICAgICAgZHVyYXRpb25fdXMgPSAodWludDY0X3QpZHVyYXRpb24gKiAxMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgKiAodWludDY0X3QpY3R4LT5jZmcuZ190aW1lYmFzZS5udW0KLSAgICAgICAgICAgICAgICAgICAgICAvICh1aW50NjRfdCljdHgtPmNmZy5nX3RpbWViYXNlLmRlbjsKLQotICAgICAgICAvKiBJZiB0aGUgZGVhZGxpbmUgaXMgbW9yZSB0aGF0IHRoZSBkdXJhdGlvbiB0aGlzIGZyYW1lIGlzIHRvIGJlIHNob3duLAotICAgICAgICAgKiB1c2UgZ29vZCBxdWFsaXR5IG1vZGUuIE90aGVyd2lzZSB1c2UgcmVhbHRpbWUgbW9kZS4KLSAgICAgICAgICovCi0gICAgICAgIG5ld19xYyA9IChkZWFkbGluZSA+IGR1cmF0aW9uX3VzKSA/IE1PREVfR09PRFFVQUxJVFkgOiBNT0RFX1JFQUxUSU1FOwotICAgIH0KLQotI2Vsc2UKLSAgICBuZXdfcWMgPSBNT0RFX1JFQUxUSU1FOwotI2VuZGlmCi0KLSAgICBzd2l0Y2ggKGN0eC0+ZGVwcmVjYXRlZF9tb2RlKQotICAgIHsKLSAgICBjYXNlIFZQOF9CRVNUX1FVQUxJVFlfRU5DT0RJTkc6Ci0gICAgICAgIG5ld19xYyA9IE1PREVfQkVTVFFVQUxJVFk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVlA4X0dPT0RfUVVBTElUWV9FTkNPRElORzoKLSAgICAgICAgbmV3X3FjID0gTU9ERV9HT09EUVVBTElUWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWUDhfUkVBTF9USU1FX0VOQ09ESU5HOgotICAgICAgICBuZXdfcWMgPSBNT0RFX1JFQUxUSU1FOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5jZmcuZ19wYXNzID09IFZQWF9SQ19GSVJTVF9QQVNTKQotICAgICAgICBuZXdfcWMgPSBNT0RFX0ZJUlNUUEFTUzsKLSAgICBlbHNlIGlmIChjdHgtPmNmZy5nX3Bhc3MgPT0gVlBYX1JDX0xBU1RfUEFTUykKLSAgICAgICAgbmV3X3FjID0gKG5ld19xYyA9PSBNT0RFX0JFU1RRVUFMSVRZKQotICAgICAgICAgICAgICAgICA/IE1PREVfU0VDT05EUEFTU19CRVNUCi0gICAgICAgICAgICAgICAgIDogTU9ERV9TRUNPTkRQQVNTOwotCi0gICAgaWYgKGN0eC0+b3hjZi5Nb2RlICE9IG5ld19xYykKLSAgICB7Ci0gICAgICAgIGN0eC0+b3hjZi5Nb2RlID0gbmV3X3FjOwotICAgICAgICB2cDhfY2hhbmdlX2NvbmZpZyhjdHgtPmNwaSwgJmN0eC0+b3hjZik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9lbmNvZGUodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV90ICAgICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfcHRzX3QgICAgICAgIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2VuY19mcmFtZV9mbGFnc190ICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICBkZWFkbGluZSkKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gVlBYX0NPREVDX09LOwotCi0gICAgaWYgKGltZykKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1nKGN0eCwgaW1nKTsKLQotICAgIHBpY2tfcXVpY2tjb21wcmVzc19tb2RlKGN0eCwgZHVyYXRpb24sIGRlYWRsaW5lKTsKLSAgICB2cHhfY29kZWNfcGt0X2xpc3RfaW5pdCgmY3R4LT5wa3RfbGlzdCk7Ci0KLSAgICAvKiBIYW5kbGUgRmxhZ3MgKi8KLSAgICBpZiAoKChmbGFncyAmIFZQOF9FRkxBR19OT19VUERfR0YpICYmIChmbGFncyAmIFZQOF9FRkxBR19GT1JDRV9HRikpCi0gICAgICAgIHx8ICgoZmxhZ3MgJiBWUDhfRUZMQUdfTk9fVVBEX0FSRikgJiYgKGZsYWdzICYgVlA4X0VGTEFHX0ZPUkNFX0FSRikpKQotICAgIHsKLSAgICAgICAgY3R4LT5iYXNlLmVycl9kZXRhaWwgPSAiQ29uZmxpY3RpbmcgZmxhZ3MuIjsKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIChWUDhfRUZMQUdfTk9fUkVGX0xBU1QgfCBWUDhfRUZMQUdfTk9fUkVGX0dGCi0gICAgICAgICAgICAgICAgIHwgVlA4X0VGTEFHX05PX1JFRl9BUkYpKQotICAgIHsKLSAgICAgICAgaW50IHJlZiA9IDc7Ci0KLSAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1JFRl9MQVNUKQotICAgICAgICAgICAgcmVmIF49IFZQOF9MQVNUX0ZMQUc7Ci0KLSAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1JFRl9HRikKLSAgICAgICAgICAgIHJlZiBePSBWUDhfR09MRF9GTEFHOwotCi0gICAgICAgIGlmIChmbGFncyAmIFZQOF9FRkxBR19OT19SRUZfQVJGKQotICAgICAgICAgICAgcmVmIF49IFZQOF9BTFRfRkxBRzsKLQotICAgICAgICB2cDhfdXNlX2FzX3JlZmVyZW5jZShjdHgtPmNwaSwgcmVmKTsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiAoVlA4X0VGTEFHX05PX1VQRF9MQVNUIHwgVlA4X0VGTEFHX05PX1VQRF9HRgotICAgICAgICAgICAgICAgICB8IFZQOF9FRkxBR19OT19VUERfQVJGIHwgVlA4X0VGTEFHX0ZPUkNFX0dGCi0gICAgICAgICAgICAgICAgIHwgVlA4X0VGTEFHX0ZPUkNFX0FSRikpCi0gICAgewotICAgICAgICBpbnQgdXBkID0gNzsKLQotICAgICAgICBpZiAoZmxhZ3MgJiBWUDhfRUZMQUdfTk9fVVBEX0xBU1QpCi0gICAgICAgICAgICB1cGQgXj0gVlA4X0xBU1RfRkxBRzsKLQotICAgICAgICBpZiAoZmxhZ3MgJiBWUDhfRUZMQUdfTk9fVVBEX0dGKQotICAgICAgICAgICAgdXBkIF49IFZQOF9HT0xEX0ZMQUc7Ci0KLSAgICAgICAgaWYgKGZsYWdzICYgVlA4X0VGTEFHX05PX1VQRF9BUkYpCi0gICAgICAgICAgICB1cGQgXj0gVlA4X0FMVF9GTEFHOwotCi0gICAgICAgIHZwOF91cGRhdGVfcmVmZXJlbmNlKGN0eC0+Y3BpLCB1cGQpOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFZQOF9FRkxBR19OT19VUERfRU5UUk9QWSkKLSAgICB7Ci0gICAgICAgIHZwOF91cGRhdGVfZW50cm9weShjdHgtPmNwaSwgMCk7Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIGZpeGVkIGtleWZyYW1lIGludGVydmFscyAqLwotICAgIGlmIChjdHgtPmNmZy5rZl9tb2RlID09IFZQWF9LRl9BVVRPCi0gICAgICAgICYmIGN0eC0+Y2ZnLmtmX21pbl9kaXN0ID09IGN0eC0+Y2ZnLmtmX21heF9kaXN0KQotICAgIHsKLSAgICAgICAgaWYgKCsrY3R4LT5maXhlZF9rZl9jbnRyID4gY3R4LT5jZmcua2ZfbWluX2Rpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKLSAgICAgICAgICAgIGN0eC0+Zml4ZWRfa2ZfY250ciA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBlbmNvZGVyIGluc3RhbmNlIG9uIHRoZSBmaXJzdCBmcmFtZSovCi0gICAgaWYgKCFyZXMgJiYgY3R4LT5jcGkpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgbGliX2ZsYWdzOwotICAgICAgICBZVjEyX0JVRkZFUl9DT05GSUcgc2Q7Ci0gICAgICAgIElOVDY0IGRzdF90aW1lX3N0YW1wLCBkc3RfZW5kX3RpbWVfc3RhbXA7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY3hfZGF0YV9zejsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqY3hfZGF0YTsKLQotICAgICAgICAvKiBTZXQgdXAgaW50ZXJuYWwgZmxhZ3MgKi8KLSAgICAgICAgaWYgKGN0eC0+YmFzZS5pbml0X2ZsYWdzICYgVlBYX0NPREVDX1VTRV9QU05SKQotICAgICAgICAgICAgKChWUDhfQ09NUCAqKWN0eC0+Y3BpKS0+Yl9jYWxjdWxhdGVfcHNuciA9IDE7Ci0KLSAgICAgICAgLyogQ29udmVydCBBUEkgZmxhZ3MgdG8gaW50ZXJuYWwgY29kZWMgbGliIGZsYWdzICovCi0gICAgICAgIGxpYl9mbGFncyA9IChmbGFncyAmIFZQWF9FRkxBR19GT1JDRV9LRikgPyBGUkFNRUZMQUdTX0tFWSA6IDA7Ci0KLSAgICAgICAgLyogdnA4IHVzZSAxMCwwMDAsMDAwIHRpY2tzL3NlY29uZCBhcyB0aW1lIHN0YW1wICovCi0gICAgICAgIGRzdF90aW1lX3N0YW1wICAgID0gcHRzICogMTAwMDAwMDAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UuZGVuOwotICAgICAgICBkc3RfZW5kX3RpbWVfc3RhbXAgPSAocHRzICsgZHVyYXRpb24pICogMTAwMDAwMDAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLm51bSAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UuZGVuOwotCi0gICAgICAgIGlmIChpbWcgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzID0gaW1hZ2UyeXV2Y29uZmlnKGltZywgJnNkKTsKLQotICAgICAgICAgICAgaWYgKHZwOF9yZWNlaXZlX3Jhd19mcmFtZShjdHgtPmNwaSwgY3R4LT5uZXh0X2ZyYW1lX2ZsYWcgfCBsaWJfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZCwgZHN0X3RpbWVfc3RhbXAsIGRzdF9lbmRfdGltZV9zdGFtcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVlA4X0NPTVAgKmNwaSA9IChWUDhfQ09NUCAqKWN0eC0+Y3BpOwotICAgICAgICAgICAgICAgIHJlcyA9IHVwZGF0ZV9lcnJvcl9zdGF0ZShjdHgsICZjcGktPmNvbW1vbi5lcnJvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHJlc2V0IGZvciBuZXh0IGZyYW1lICovCi0gICAgICAgICAgICBjdHgtPm5leHRfZnJhbWVfZmxhZyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBjeF9kYXRhID0gY3R4LT5jeF9kYXRhOwotICAgICAgICBjeF9kYXRhX3N6ID0gY3R4LT5jeF9kYXRhX3N6OwotICAgICAgICBsaWJfZmxhZ3MgPSAwOwotCi0gICAgICAgIHdoaWxlIChjeF9kYXRhX3N6ID49IGN0eC0+Y3hfZGF0YV9zeiAvIDIKLSAgICAgICAgICAgICAgICYmIC0xICE9IHZwOF9nZXRfY29tcHJlc3NlZF9kYXRhKGN0eC0+Y3BpLCAmbGliX2ZsYWdzLCAmc2l6ZSwgY3hfZGF0YSwgJmRzdF90aW1lX3N0YW1wLCAmZHN0X2VuZF90aW1lX3N0YW1wLCAhaW1nKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnB4X2NvZGVjX3B0c190ICAgIHJvdW5kLCBkZWx0YTsKLSAgICAgICAgICAgICAgICB2cHhfY29kZWNfY3hfcGt0X3QgcGt0OwotICAgICAgICAgICAgICAgIFZQOF9DT01QICpjcGkgPSAoVlA4X0NPTVAgKiljdHgtPmNwaTsKLQotICAgICAgICAgICAgICAgIC8qIEFkZCB0aGUgZnJhbWUgcGFja2V0IHRvIHRoZSBsaXN0IG9mIHJldHVybmVkIHBhY2tldHMuICovCi0gICAgICAgICAgICAgICAgcm91bmQgPSAxMDAwMDAwICogY3R4LT5jZmcuZ190aW1lYmFzZS5udW0gLyAyIC0gMTsKLSAgICAgICAgICAgICAgICBkZWx0YSA9IChkc3RfZW5kX3RpbWVfc3RhbXAgLSBkc3RfdGltZV9zdGFtcCk7Ci0gICAgICAgICAgICAgICAgcGt0LmtpbmQgPSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUOwotICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLmJ1ZiA9IGN4X2RhdGE7Ci0gICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuc3ogID0gc2l6ZTsKLSAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5wdHMgPQotICAgICAgICAgICAgICAgICAgICAoZHN0X3RpbWVfc3RhbXAgKiBjdHgtPmNmZy5nX3RpbWViYXNlLmRlbiArIHJvdW5kKQotICAgICAgICAgICAgICAgICAgICAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UubnVtIC8gMTAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuZHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAoZGVsdGEgKiBjdHgtPmNmZy5nX3RpbWViYXNlLmRlbiArIHJvdW5kKQotICAgICAgICAgICAgICAgICAgICAvIGN0eC0+Y2ZnLmdfdGltZWJhc2UubnVtIC8gMTAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgcGt0LmRhdGEuZnJhbWUuZmxhZ3MgPSBsaWJfZmxhZ3MgPDwgMTY7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGliX2ZsYWdzICYgRlJBTUVGTEFHU19LRVkpCi0gICAgICAgICAgICAgICAgICAgIHBrdC5kYXRhLmZyYW1lLmZsYWdzIHw9IFZQWF9GUkFNRV9JU19LRVk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNwaS0+Y29tbW9uLnNob3dfZnJhbWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5mbGFncyB8PSBWUFhfRlJBTUVfSVNfSU5WSVNJQkxFOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGltZXN0YW1wIHNob3VsZCBiZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJpb3IgUFRTIHNvIHRoYXQgaWYgYSBkZWNvZGVyIHVzZXMgcHRzIHRvIHNjaGVkdWxlIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gZG8gdGhpcywgd2Ugc3RhcnQgcmlnaHQgYWZ0ZXIgbGFzdCBmcmFtZSB3YXMgZGVjb2RlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSW52aXNpYmxlIGZyYW1lcyBoYXZlIG5vIGR1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5wdHMgPSAoKGNwaS0+bGFzdF90aW1lX3N0YW1wX3NlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICogY3R4LT5jZmcuZ190aW1lYmFzZS5kZW4gKyByb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gY3R4LT5jZmcuZ190aW1lYmFzZS5udW0gLyAxMDAwMDAwMCkgKyAxOwotICAgICAgICAgICAgICAgICAgICBwa3QuZGF0YS5mcmFtZS5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdnB4X2NvZGVjX3BrdF9saXN0X2FkZCgmY3R4LT5wa3RfbGlzdC5oZWFkLCAmcGt0KTsKLQotICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJ0aW1lc3RhbXA6ICVsbGQsIGR1cmF0aW9uOiAlZFxuIiwgcGt0LT5kYXRhLmZyYW1lLnB0cywgcGt0LT5kYXRhLmZyYW1lLmR1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICBjeF9kYXRhICs9IHNpemU7Ci0gICAgICAgICAgICAgICAgY3hfZGF0YV9zeiAtPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi1zdGF0aWMgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICp2cDhlX2dldF9jeGRhdGEodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCi0gICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICAqaXRlcikKLXsKLSAgICByZXR1cm4gdnB4X2NvZGVjX3BrdF9saXN0X2dldCgmY3R4LT5wa3RfbGlzdC5oZWFkLCBpdGVyKTsKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3NldF9yZWZlcmVuY2UodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKLSAgICAgICAgaW50IGN0cl9pZCwKLSAgICAgICAgdmFfbGlzdCBhcmdzKQotewotICAgIHZweF9yZWZfZnJhbWVfdCAqZGF0YSA9IHZhX2FyZyhhcmdzLCB2cHhfcmVmX2ZyYW1lX3QgKik7Ci0KLSAgICBpZiAoZGF0YSkKLSAgICB7Ci0gICAgICAgIHZweF9yZWZfZnJhbWVfdCAqZnJhbWUgPSAodnB4X3JlZl9mcmFtZV90ICopZGF0YTsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHIHNkOwotCi0gICAgICAgIGltYWdlMnl1dmNvbmZpZygmZnJhbWUtPmltZywgJnNkKTsKLSAgICAgICAgdnA4X3NldF9yZWZlcmVuY2UoY3R4LT5jcGksIGZyYW1lLT5mcmFtZV90eXBlLCAmc2QpOwotICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLQotfQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfZ2V0X3JlZmVyZW5jZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICBpbnQgY3RyX2lkLAotICAgICAgICB2YV9saXN0IGFyZ3MpCi17Ci0KLSAgICB2cHhfcmVmX2ZyYW1lX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnB4X3JlZl9mcmFtZV90ICopOwotCi0gICAgaWYgKGRhdGEpCi0gICAgewotICAgICAgICB2cHhfcmVmX2ZyYW1lX3QgKmZyYW1lID0gKHZweF9yZWZfZnJhbWVfdCAqKWRhdGE7Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKLQotICAgICAgICBpbWFnZTJ5dXZjb25maWcoJmZyYW1lLT5pbWcsICZzZCk7Ci0gICAgICAgIHZwOF9nZXRfcmVmZXJlbmNlKGN0eC0+Y3BpLCBmcmFtZS0+ZnJhbWVfdHlwZSwgJnNkKTsKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci19Ci0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfcHJldmlld3BwKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgIGludCBjdHJfaWQsCi0gICAgICAgIHZhX2xpc3QgYXJncykKLXsKLSNpZiBDT05GSUdfUE9TVFBST0MKLSAgICB2cDhfcG9zdHByb2NfY2ZnX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnA4X3Bvc3Rwcm9jX2NmZ190ICopOwotICAgICh2b2lkKWN0cl9pZDsKLQotICAgIGlmIChkYXRhKQotICAgIHsKLSAgICAgICAgY3R4LT5wcmV2aWV3X3BwY2ZnID0gKigodnA4X3Bvc3Rwcm9jX2NmZ190ICopZGF0YSk7Ci0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotI2Vsc2UKLSAgICAodm9pZCljdHg7Ci0gICAgKHZvaWQpY3RyX2lkOwotICAgICh2b2lkKWFyZ3M7Ci0gICAgcmV0dXJuIFZQWF9DT0RFQ19JTkNBUEFCTEU7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgdnB4X2ltYWdlX3QgKnZwOGVfZ2V0X3ByZXZpZXcodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCkKLXsKLQotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKLSAgICB2cDhfcHBmbGFnc190IGZsYWdzID0gezB9OwotCi0gICAgaWYgKGN0eC0+cHJldmlld19wcGNmZy5wb3N0X3Byb2NfZmxhZykKLSAgICB7Ci0gICAgICAgIGZsYWdzLnBvc3RfcHJvY19mbGFnICAgICAgICA9IGN0eC0+cHJldmlld19wcGNmZy5wb3N0X3Byb2NfZmxhZzsKLSAgICAgICAgZmxhZ3MuZGVibG9ja2luZ19sZXZlbCAgICAgID0gY3R4LT5wcmV2aWV3X3BwY2ZnLmRlYmxvY2tpbmdfbGV2ZWw7Ci0gICAgICAgIGZsYWdzLm5vaXNlX2xldmVsICAgICAgICAgICA9IGN0eC0+cHJldmlld19wcGNmZy5ub2lzZV9sZXZlbDsKLSAgICB9Ci0KLSAgICBpZiAoMCA9PSB2cDhfZ2V0X3ByZXZpZXdfcmF3X2ZyYW1lKGN0eC0+Y3BpLCAmc2QsICZmbGFncykpCi0gICAgewotCi0gICAgICAgIC8qCi0gICAgICAgIHZweF9pbWdfd3JhcCgmY3R4LT5wcmV2aWV3X2ltZywgVlBYX0lNR19GTVRfWVYxMiwKLSAgICAgICAgICAgIHNkLnlfd2lkdGggKyAyKlZQOEJPUkRFUklOUElYRUxTLAotICAgICAgICAgICAgc2QueV9oZWlnaHQgKyAyKlZQOEJPUkRFUklOUElYRUxTLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHNkLmJ1ZmZlcl9hbGxvYyk7Ci0gICAgICAgIHZweF9pbWdfc2V0X3JlY3QoJmN0eC0+cHJldmlld19pbWcsCi0gICAgICAgICAgICBWUDhCT1JERVJJTlBJWEVMUywgVlA4Qk9SREVSSU5QSVhFTFMsCi0gICAgICAgICAgICBzZC55X3dpZHRoLCBzZC55X2hlaWdodCk7Ci0gICAgICAgICAgICAqLwotCi0gICAgICAgIGN0eC0+cHJldmlld19pbWcuYnBzID0gMTI7Ci0gICAgICAgIGN0eC0+cHJldmlld19pbWcucGxhbmVzW1ZQWF9QTEFORV9ZXSA9IHNkLnlfYnVmZmVyOwotICAgICAgICBjdHgtPnByZXZpZXdfaW1nLnBsYW5lc1tWUFhfUExBTkVfVV0gPSBzZC51X2J1ZmZlcjsKLSAgICAgICAgY3R4LT5wcmV2aWV3X2ltZy5wbGFuZXNbVlBYX1BMQU5FX1ZdID0gc2Qudl9idWZmZXI7Ci0KLSAgICAgICAgaWYgKHNkLmNscnR5cGUgPT0gUkVHX1lVVikKLSAgICAgICAgICAgIGN0eC0+cHJldmlld19pbWcuZm10ID0gVlBYX0lNR19GTVRfSTQyMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3R4LT5wcmV2aWV3X2ltZy5mbXQgPSBWUFhfSU1HX0ZNVF9WUFhJNDIwOwotCi0gICAgICAgIGN0eC0+cHJldmlld19pbWcueF9jaHJvbWFfc2hpZnQgPSAxOwotICAgICAgICBjdHgtPnByZXZpZXdfaW1nLnlfY2hyb21hX3NoaWZ0ID0gMTsKLQotICAgICAgICBjdHgtPnByZXZpZXdfaW1nLmRfdyA9IHNkLnlfd2lkdGg7Ci0gICAgICAgIGN0eC0+cHJldmlld19pbWcuZF9oID0gc2QueV9oZWlnaHQ7Ci0gICAgICAgIGN0eC0+cHJldmlld19pbWcuc3RyaWRlW1ZQWF9QTEFORV9ZXSA9IHNkLnlfc3RyaWRlOwotICAgICAgICBjdHgtPnByZXZpZXdfaW1nLnN0cmlkZVtWUFhfUExBTkVfVV0gPSBzZC51dl9zdHJpZGU7Ci0gICAgICAgIGN0eC0+cHJldmlld19pbWcuc3RyaWRlW1ZQWF9QTEFORV9WXSA9IHNkLnV2X3N0cmlkZTsKLSAgICAgICAgY3R4LT5wcmV2aWV3X2ltZy53ICAgPSBzZC55X3dpZHRoOwotICAgICAgICBjdHgtPnByZXZpZXdfaW1nLmggICA9IHNkLnlfaGVpZ2h0OwotCi0gICAgICAgIHJldHVybiAmY3R4LT5wcmV2aWV3X2ltZzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3VwZGF0ZV9lbnRyb3B5KHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgIGludCBjdHJfaWQsCi0gICAgICAgIHZhX2xpc3QgYXJncykKLXsKLSAgICBpbnQgdXBkYXRlID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgdnA4X3VwZGF0ZV9lbnRyb3B5KGN0eC0+Y3BpLCB1cGRhdGUpOwotICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0KLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhlX3VwZGF0ZV9yZWZlcmVuY2UodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKLSAgICAgICAgaW50IGN0cl9pZCwKLSAgICAgICAgdmFfbGlzdCBhcmdzKQotewotICAgIGludCB1cGRhdGUgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICB2cDhfdXBkYXRlX3JlZmVyZW5jZShjdHgtPmNwaSwgdXBkYXRlKTsKLSAgICByZXR1cm4gVlBYX0NPREVDX09LOwotfQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfdXNlX3JlZmVyZW5jZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICBpbnQgY3RyX2lkLAotICAgICAgICB2YV9saXN0IGFyZ3MpCi17Ci0gICAgaW50IHJlZmVyZW5jZV9mbGFnID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgdnA4X3VzZV9hc19yZWZlcmVuY2UoY3R4LT5jcGksIHJlZmVyZW5jZV9mbGFnKTsKLSAgICByZXR1cm4gVlBYX0NPREVDX09LOwotfQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOGVfc2V0X3JvaV9tYXAodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKLXsKLSAgICB2cHhfcm9pX21hcF90ICpkYXRhID0gdmFfYXJnKGFyZ3MsIHZweF9yb2lfbWFwX3QgKik7Ci0KLSAgICBpZiAoZGF0YSkKLSAgICB7Ci0gICAgICAgIHZweF9yb2lfbWFwX3QgKnJvaSA9ICh2cHhfcm9pX21hcF90ICopZGF0YTsKLQotICAgICAgICBpZiAoIXZwOF9zZXRfcm9pbWFwKGN0eC0+Y3BpLCByb2ktPnJvaV9tYXAsIHJvaS0+cm93cywgcm9pLT5jb2xzLCByb2ktPmRlbHRhX3EsIHJvaS0+ZGVsdGFfbGYsIHJvaS0+c3RhdGljX3RocmVzaG9sZCkpCi0gICAgICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotfQotCi0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfYWN0aXZlbWFwKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgIGludCBjdHJfaWQsCi0gICAgICAgIHZhX2xpc3QgYXJncykKLXsKLSAgICB2cHhfYWN0aXZlX21hcF90ICpkYXRhID0gdmFfYXJnKGFyZ3MsIHZweF9hY3RpdmVfbWFwX3QgKik7Ci0KLSAgICBpZiAoZGF0YSkKLSAgICB7Ci0KLSAgICAgICAgdnB4X2FjdGl2ZV9tYXBfdCAqbWFwID0gKHZweF9hY3RpdmVfbWFwX3QgKilkYXRhOwotCi0gICAgICAgIGlmICghdnA4X3NldF9hY3RpdmVfbWFwKGN0eC0+Y3BpLCBtYXAtPmFjdGl2ZV9tYXAsIG1hcC0+cm93cywgbWFwLT5jb2xzKSkKLSAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci19Ci0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4ZV9zZXRfc2NhbGVtb2RlKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgIGludCBjdHJfaWQsCi0gICAgICAgIHZhX2xpc3QgYXJncykKLXsKLQotICAgIHZweF9zY2FsaW5nX21vZGVfdCAqZGF0YSA9ICB2YV9hcmcoYXJncywgdnB4X3NjYWxpbmdfbW9kZV90ICopOwotCi0gICAgaWYgKGRhdGEpCi0gICAgewotICAgICAgICBpbnQgcmVzOwotICAgICAgICB2cHhfc2NhbGluZ19tb2RlX3Qgc2NhbGVtb2RlID0gKih2cHhfc2NhbGluZ19tb2RlX3QgKilkYXRhIDsKLSAgICAgICAgcmVzID0gdnA4X3NldF9pbnRlcm5hbF9zaXplKGN0eC0+Y3BpLCBzY2FsZW1vZGUuaF9zY2FsaW5nX21vZGUsIHNjYWxlbW9kZS52X3NjYWxpbmdfbW9kZSk7Ci0KLSAgICAgICAgaWYgKCFyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qZm9yY2UgbmV4dCBmcmFtZSBhIGtleSBmcmFtZSB0byBlZmZlY3Qgc2NhbGluZyBtb2RlICovCi0gICAgICAgICAgICBjdHgtPm5leHRfZnJhbWVfZmxhZyB8PSBGUkFNRUZMQUdTX0tFWTsKLSAgICAgICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLX0KLQotCi1zdGF0aWMgdnB4X2NvZGVjX2N0cmxfZm5fbWFwX3QgdnA4ZV9jdGZfbWFwc1tdID0KLXsKLSAgICB7VlA4X1NFVF9SRUZFUkVOQ0UsICAgICAgICAgICAgICAgICB2cDhlX3NldF9yZWZlcmVuY2V9LAotICAgIHtWUDhfQ09QWV9SRUZFUkVOQ0UsICAgICAgICAgICAgICAgIHZwOGVfZ2V0X3JlZmVyZW5jZX0sCi0gICAge1ZQOF9TRVRfUE9TVFBST0MsICAgICAgICAgICAgICAgICAgdnA4ZV9zZXRfcHJldmlld3BwfSwKLSAgICB7VlA4RV9VUERfRU5UUk9QWSwgICAgICAgICAgICAgICAgICB2cDhlX3VwZGF0ZV9lbnRyb3B5fSwKLSAgICB7VlA4RV9VUERfUkVGRVJFTkNFLCAgICAgICAgICAgICAgICB2cDhlX3VwZGF0ZV9yZWZlcmVuY2V9LAotICAgIHtWUDhFX1VTRV9SRUZFUkVOQ0UsICAgICAgICAgICAgICAgIHZwOGVfdXNlX3JlZmVyZW5jZX0sCi0gICAge1ZQOEVfU0VUX1JPSV9NQVAsICAgICAgICAgICAgICAgICAgdnA4ZV9zZXRfcm9pX21hcH0sCi0gICAge1ZQOEVfU0VUX0FDVElWRU1BUCwgICAgICAgICAgICAgICAgdnA4ZV9zZXRfYWN0aXZlbWFwfSwKLSAgICB7VlA4RV9TRVRfU0NBTEVNT0RFLCAgICAgICAgICAgICAgICB2cDhlX3NldF9zY2FsZW1vZGV9LAotICAgIHtWUDhFX1NFVF9FTkNPRElOR19NT0RFLCAgICAgICAgICAgIHNldF9wYXJhbX0sCi0gICAge1ZQOEVfU0VUX0NQVVVTRUQsICAgICAgICAgICAgICAgICAgc2V0X3BhcmFtfSwKLSAgICB7VlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksICAgICAgICBzZXRfcGFyYW19LAotICAgIHtWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLCAgICAgICAgIHNldF9wYXJhbX0sCi0gICAge1ZQOEVfU0VUX1NIQVJQTkVTUywgICAgICAgICAgICAgICAgc2V0X3BhcmFtfSwKLSAgICB7VlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwgICAgICAgICBzZXRfcGFyYW19LAotICAgIHtWUDhFX1NFVF9UT0tFTl9QQVJUSVRJT05TLCAgICAgICAgIHNldF9wYXJhbX0sCi0gICAge1ZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSLCAgICAgICAgICAgZ2V0X3BhcmFtfSwKLSAgICB7VlA4RV9HRVRfTEFTVF9RVUFOVElaRVJfNjQsICAgICAgICBnZXRfcGFyYW19LAotICAgIHtWUDhFX1NFVF9BUk5SX01BWEZSQU1FUywgICAgICAgICAgIHNldF9wYXJhbX0sCi0gICAge1ZQOEVfU0VUX0FSTlJfU1RSRU5HVEggLCAgICAgICAgICAgc2V0X3BhcmFtfSwKLSAgICB7VlA4RV9TRVRfQVJOUl9UWVBFICAgICAsICAgICAgICAgICBzZXRfcGFyYW19LAotICAgIHtWUDhFX1NFVF9UVU5JTkcsICAgICAgICAgICAgICAgICAgIHNldF9wYXJhbX0sCi0gICAge1ZQOEVfU0VUX0NRX0xFVkVMLCAgICAgICAgICAgICAgICAgc2V0X3BhcmFtfSwKLSAgICB7IC0xLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCB2cDhlX3VzYWdlX2NmZ19tYXBbXSA9Ci17Ci0gICAgewotICAgIDAsCi0gICAgewotICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIGdfdXNhZ2UgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiBnX3RocmVhZHMgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiBnX3Byb2ZpbGUgKi8KLQotICAgICAgICAzMjAsICAgICAgICAgICAgICAgIC8qIGdfd2lkdGggKi8KLSAgICAgICAgMjQwLCAgICAgICAgICAgICAgICAvKiBnX2hlaWdodCAqLwotICAgICAgICB7MSwgMzB9LCAgICAgICAgICAgIC8qIGdfdGltZWJhc2UgKi8KLQotICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIGdfZXJyb3JfcmVzaWxpZW50ICovCi0KLSAgICAgICAgVlBYX1JDX09ORV9QQVNTLCAgICAvKiBnX3Bhc3MgKi8KLQotICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIGdfbGFnX2luX2ZyYW1lcyAqLwotCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogcmNfZHJvcGZyYW1lX3RocmVzaCAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHJjX3Jlc2l6ZV9hbGxvd2VkICovCi0gICAgICAgIDYwLCAgICAgICAgICAgICAgICAgLyogcmNfcmVzaXplX2Rvd25fdGhyZXNvbGQgKi8KLSAgICAgICAgMzAsICAgICAgICAgICAgICAgICAvKiByY19yZXNpemVfdXBfdGhyZXNvbGQgKi8KLQotICAgICAgICBWUFhfVkJSLCAgICAgICAgICAgIC8qIHJjX2VuZF91c2FnZSAqLwotI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID4gKDEgKyBWUFhfQ09ERUNfQUJJX1ZFUlNJT04pCi0gICAgICAgIHswfSwgICAgICAgICAgICAgICAgLyogcmNfdHdvcGFzc19zdGF0c19pbiAqLwotI2VuZGlmCi0gICAgICAgIDI1NiwgICAgICAgICAgICAgICAgLyogcmNfdGFyZ2V0X2JhbmR3aWR0aCAqLwotCi0gICAgICAgIDQsICAgICAgICAgICAgICAgICAgLyogcmNfbWluX3F1YW50aXplciAqLwotICAgICAgICA2MywgICAgICAgICAgICAgICAgIC8qIHJjX21heF9xdWFudGl6ZXIgKi8KLSAgICAgICAgOTUsICAgICAgICAgICAgICAgICAvKiByY191bmRlcnNob290X3BjdCAqLwotICAgICAgICAyMDAsICAgICAgICAgICAgICAgIC8qIHJjX292ZXJzaG9vdF9wY3QgKi8KLQotICAgICAgICA2MDAwLCAgICAgICAgICAgICAgIC8qIHJjX21heF9idWZmZXJfc2l6ZSAqLwotICAgICAgICA0MDAwLCAgICAgICAgICAgICAgIC8qIHJjX2J1ZmZlcl9pbml0aWFsX3NpemU7ICovCi0gICAgICAgIDUwMDAsICAgICAgICAgICAgICAgLyogcmNfYnVmZmVyX29wdGltYWxfc2l6ZTsgKi8KLQotICAgICAgICA1MCwgICAgICAgICAgICAgICAgIC8qIHJjX3R3b19wYXNzX3ZicmJpYXMgICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogcmNfdHdvX3Bhc3NfdmJybWluX3NlY3Rpb24gKi8KLSAgICAgICAgNDAwLCAgICAgICAgICAgICAgICAvKiByY190d29fcGFzc192YnJtYXhfc2VjdGlvbiAqLwotCi0gICAgICAgIC8qIGtleWZyYW1pbmcgc2V0dGluZ3MgKGtmKSAqLwotICAgICAgICBWUFhfS0ZfQVVUTywgICAgICAgIC8qIGdfa2Ztb2RlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiBrZl9taW5fZGlzdCAqLwotICAgICAgICA5OTk5LCAgICAgICAgICAgICAgIC8qIGtmX21heF9kaXN0ICovCi0KLSNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA9PSAoMSArIFZQWF9DT0RFQ19BQklfVkVSU0lPTikKLSAgICAgICAgMSwgICAgICAgICAgICAgICAgICAvKiBnX2RlbGV0ZV9maXJzdF9wYXNzX2ZpbGUgKi8KLSAgICAgICAgInZwOC5mcGYiICAgICAgICAgICAvKiBmaXJzdCBwYXNzIGZpbGVuYW1lICovCi0jZW5kaWYKLSAgICB9fSwKLSAgICB7IC0xLCB7Tk9UX0lNUExFTUVOVEVEfX0KLX07Ci0KLQotI2lmbmRlZiBWRVJTSU9OX1NUUklORwotI2RlZmluZSBWRVJTSU9OX1NUUklORwotI2VuZGlmCi1DT0RFQ19JTlRFUkZBQ0UodnB4X2NvZGVjX3ZwOF9jeCkgPQotewotICAgICJXZWJNIFByb2plY3QgVlA4IEVuY29kZXIiIFZFUlNJT05fU1RSSU5HLAotICAgIFZQWF9DT0RFQ19JTlRFUk5BTF9BQklfVkVSU0lPTiwKLSAgICBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIgfCBWUFhfQ09ERUNfQ0FQX1BTTlIsCi0gICAgLyogdnB4X2NvZGVjX2NhcHNfdCAgICAgICAgICBjYXBzOyAqLwotICAgIHZwOGVfaW5pdCwgICAgICAgICAgLyogdnB4X2NvZGVjX2luaXRfZm5fdCAgICAgICBpbml0OyAqLwotICAgIHZwOGVfZGVzdHJveSwgICAgICAgLyogdnB4X2NvZGVjX2Rlc3Ryb3lfZm5fdCAgICBkZXN0cm95OyAqLwotICAgIHZwOGVfY3RmX21hcHMsICAgICAgLyogdnB4X2NvZGVjX2N0cmxfZm5fbWFwX3QgICpjdHJsX21hcHM7ICovCi0gICAgTk9UX0lNUExFTUVOVEVELCAgICAvKiB2cHhfY29kZWNfZ2V0X21tYXBfZm5fdCAgIGdldF9tbWFwOyAqLwotICAgIE5PVF9JTVBMRU1FTlRFRCwgICAgLyogdnB4X2NvZGVjX3NldF9tbWFwX2ZuX3QgICBzZXRfbW1hcDsgKi8KLSAgICB7Ci0gICAgICAgIE5PVF9JTVBMRU1FTlRFRCwgICAgLyogdnB4X2NvZGVjX3BlZWtfc2lfZm5fdCAgICBwZWVrX3NpOyAqLwotICAgICAgICBOT1RfSU1QTEVNRU5URUQsICAgIC8qIHZweF9jb2RlY19nZXRfc2lfZm5fdCAgICAgZ2V0X3NpOyAqLwotICAgICAgICBOT1RfSU1QTEVNRU5URUQsICAgIC8qIHZweF9jb2RlY19kZWNvZGVfZm5fdCAgICAgZGVjb2RlOyAqLwotICAgICAgICBOT1RfSU1QTEVNRU5URUQsICAgIC8qIHZweF9jb2RlY19mcmFtZV9nZXRfZm5fdCAgZnJhbWVfZ2V0OyAqLwotICAgIH0sCi0gICAgewotICAgICAgICB2cDhlX3VzYWdlX2NmZ19tYXAsIC8qIHZweF9jb2RlY19lbmNfY2ZnX21hcF90ICAgIHBlZWtfc2k7ICovCi0gICAgICAgIHZwOGVfZW5jb2RlLCAgICAgICAgLyogdnB4X2NvZGVjX2VuY29kZV9mbl90ICAgICAgZW5jb2RlOyAqLwotICAgICAgICB2cDhlX2dldF9jeGRhdGEsICAgIC8qIHZweF9jb2RlY19nZXRfY3hfZGF0YV9mbl90ICAgZnJhbWVfZ2V0OyAqLwotICAgICAgICB2cDhlX3NldF9jb25maWcsCi0gICAgICAgIE5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgdnA4ZV9nZXRfcHJldmlldywKLSAgICB9IC8qIGVuY29kZXIgZnVuY3Rpb25zICovCi19OwotCi0KLS8qCi0gKiBCRUdJTiBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWSBTSElNLgotICovCi0jZGVmaW5lIEZPUkNFX0tFWSAgIDIKLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgYXBpMV9jb250cm9sKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgY3RybF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgICAgICBhcmdzKQotewotICAgIHZweF9jb2RlY19jdHJsX2ZuX21hcF90ICplbnRyeTsKLQotICAgIHN3aXRjaCAoY3RybF9pZCkKLSAgICB7Ci0gICAgY2FzZSBWUDhFX1NFVF9GTFVTSEZMQUc6Ci0gICAgICAgIC8qIFZQOCBzYW1wbGUgY29kZSBkaWQgVlA4RV9TRVRfRkxVU0hGTEFHIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAqIHZweF9jb2RlY19nZXRfY3hfZGF0YSgpIHJhdGhlciB0aGFuIHZweF9jb2RlY19lbmNvZGUoKS4KLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiB2cDhlX2VuY29kZShjdHgsIE5VTEwsIDAsIDAsIDAsIDApOwotICAgIGNhc2UgVlA4RV9TRVRfRlJBTUVUWVBFOgotICAgICAgICBjdHgtPmJhc2UuZW5jLnRiZCB8PSBGT1JDRV9LRVk7Ci0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0gICAgfQotCi0gICAgZm9yIChlbnRyeSA9IHZwOGVfY3RmX21hcHM7IGVudHJ5ICYmIGVudHJ5LT5mbjsgZW50cnkrKykKLSAgICB7Ci0gICAgICAgIGlmICghZW50cnktPmN0cmxfaWQgfHwgZW50cnktPmN0cmxfaWQgPT0gY3RybF9pZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5mbihjdHgsIGN0cmxfaWQsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFZQWF9DT0RFQ19FUlJPUjsKLX0KLQotCi1zdGF0aWMgdnB4X2NvZGVjX2N0cmxfZm5fbWFwX3QgYXBpMV9jdHJsX21hcHNbXSA9Ci17Ci0gICAgezAsIGFwaTFfY29udHJvbH0sCi0gICAgeyAtMSwgTlVMTH0KLX07Ci0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCBhcGkxX2VuY29kZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgICAgICppbWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19wdHNfdCAgICAgICAgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGRlYWRsaW5lKQotewotICAgIGludCBmb3JjZSA9IGN0eC0+YmFzZS5lbmMudGJkOwotCi0gICAgY3R4LT5iYXNlLmVuYy50YmQgPSAwOwotICAgIHJldHVybiB2cDhlX2VuY29kZQotICAgICAgICAgICAoY3R4LAotICAgICAgICAgICAgaW1nLAotICAgICAgICAgICAgcHRzLAotICAgICAgICAgICAgZHVyYXRpb24sCi0gICAgICAgICAgICBmbGFncyB8ICgoZm9yY2UgJiBGT1JDRV9LRVkpID8gVlBYX0VGTEFHX0ZPUkNFX0tGIDogMCksCi0gICAgICAgICAgICBkZWFkbGluZSk7Ci19Ci0KLQotdnB4X2NvZGVjX2lmYWNlX3QgdnB4X2VuY192cDhfYWxnbyA9Ci17Ci0gICAgIldlYk0gUHJvamVjdCBWUDggRW5jb2RlciAoRGVwcmVjYXRlZCBBUEkpIiBWRVJTSU9OX1NUUklORywKLSAgICBWUFhfQ09ERUNfSU5URVJOQUxfQUJJX1ZFUlNJT04sCi0gICAgVlBYX0NPREVDX0NBUF9FTkNPREVSLAotICAgIC8qIHZweF9jb2RlY19jYXBzX3QgICAgICAgICAgY2FwczsgKi8KLSAgICB2cDhlX2luaXQsICAgICAgICAgIC8qIHZweF9jb2RlY19pbml0X2ZuX3QgICAgICAgaW5pdDsgKi8KLSAgICB2cDhlX2Rlc3Ryb3ksICAgICAgIC8qIHZweF9jb2RlY19kZXN0cm95X2ZuX3QgICAgZGVzdHJveTsgKi8KLSAgICBhcGkxX2N0cmxfbWFwcywgICAgIC8qIHZweF9jb2RlY19jdHJsX2ZuX21hcF90ICAqY3RybF9tYXBzOyAqLwotICAgIE5PVF9JTVBMRU1FTlRFRCwgICAgLyogdnB4X2NvZGVjX2dldF9tbWFwX2ZuX3QgICBnZXRfbW1hcDsgKi8KLSAgICBOT1RfSU1QTEVNRU5URUQsICAgIC8qIHZweF9jb2RlY19zZXRfbW1hcF9mbl90ICAgc2V0X21tYXA7ICovCi0gICAge05PVF9JTVBMRU1FTlRFRH0sICAvKiBkZWNvZGVyIGZ1bmN0aW9ucyAqLwotICAgIHsKLSAgICAgICAgdnA4ZV91c2FnZV9jZmdfbWFwLCAvKiB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCAgICBwZWVrX3NpOyAqLwotICAgICAgICBhcGkxX2VuY29kZSwgICAgICAgIC8qIHZweF9jb2RlY19lbmNvZGVfZm5fdCAgICAgIGVuY29kZTsgKi8KLSAgICAgICAgdnA4ZV9nZXRfY3hkYXRhLCAgICAvKiB2cHhfY29kZWNfZ2V0X2N4X2RhdGFfZm5fdCAgIGZyYW1lX2dldDsgKi8KLSAgICAgICAgdnA4ZV9zZXRfY29uZmlnLAotICAgICAgICBOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHZwOGVfZ2V0X3ByZXZpZXcsCi0gICAgfSAvKiBlbmNvZGVyIGZ1bmN0aW9ucyAqLwotfTsKZGlmZiAtLWdpdCBhL3ZwOC92cDhfZHhfaWZhY2UuYyBiL3ZwOC92cDhfZHhfaWZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NTdlMC4uMDAwMDAwMAotLS0gYS92cDgvdnA4X2R4X2lmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKLSNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCi0jaW5jbHVkZSAidnB4X3ZlcnNpb24uaCIKLSNpbmNsdWRlICJjb21tb24vb255eGQuaCIKLSNpbmNsdWRlICJkZWNvZGVyL29ueXhkX2ludC5oIgotCi0jZGVmaW5lIFZQOF9DQVBfUE9TVFBST0MgKENPTkZJR19QT1NUUFJPQyA/IFZQWF9DT0RFQ19DQVBfUE9TVFBST0MgOiAwKQotCi10eXBlZGVmIHZweF9jb2RlY19zdHJlYW1faW5mb190ICB2cDhfc3RyZWFtX2luZm9fdDsKLQotLyogU3RydWN0dXJlcyBmb3IgaGFuZGxpbmcgbWVtb3J5IGFsbG9jYXRpb25zICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBWUDhfU0VHX0FMR19QUklWICAgICA9IDI1NiwKLSAgICBWUDhfU0VHX01BWAotfSBtZW1fc2VnX2lkX3Q7Ci0jZGVmaW5lIE5FTEVNRU5UUyh4KSAoKGludCkoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZwOF9wcml2X3N6KGNvbnN0IHZweF9jb2RlY19kZWNfY2ZnX3QgKnNpLCB2cHhfY29kZWNfZmxhZ3NfdCk7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdW5zaWduZWQgaW50ICAgaWQ7Ci0gICAgdW5zaWduZWQgbG9uZyAgc3o7Ci0gICAgdW5zaWduZWQgaW50ICAgYWxpZ247Ci0gICAgdW5zaWduZWQgaW50ICAgZmxhZ3M7Ci0gICAgdW5zaWduZWQgbG9uZygqY2FsY19zeikoY29uc3QgdnB4X2NvZGVjX2RlY19jZmdfdCAqLCB2cHhfY29kZWNfZmxhZ3NfdCk7Ci19IG1lbV9yZXFfdDsKLQotc3RhdGljIGNvbnN0IG1lbV9yZXFfdCB2cDhfbWVtX3JlcV9zZWdzW10gPQotewotICAgIHtWUDhfU0VHX0FMR19QUklWLCAgICAwLCA4LCBWUFhfQ09ERUNfTUVNX1pFUk8sIHZwOF9wcml2X3N6fSwKLSAgICB7VlA4X1NFR19NQVgsIDAsIDAsIDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgdnB4X2NvZGVjX2FsZ19wcml2Ci17Ci0gICAgdnB4X2NvZGVjX3ByaXZfdCAgICAgICAgYmFzZTsKLSAgICB2cHhfY29kZWNfbW1hcF90ICAgICAgICBtbWFwc1tORUxFTUVOVFModnA4X21lbV9yZXFfc2VncyktMV07Ci0gICAgdnB4X2NvZGVjX2RlY19jZmdfdCAgICAgY2ZnOwotICAgIHZwOF9zdHJlYW1faW5mb190ICAgICAgIHNpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGRlZmVyX2FsbG9jOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfaW5pdDsKLSAgICBWUDhEX1BUUiAgICAgICAgICAgICAgICBwYmk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2NfY2ZnX3NldDsKLSAgICB2cDhfcG9zdHByb2NfY2ZnX3QgICAgICBwb3N0cHJvY19jZmc7Ci0jaWYgQ09ORklHX1BPU1RQUk9DX1ZJU1VBTElaRVIKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBkYmdfcG9zdHByb2NfZmxhZzsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkYmdfY29sb3JfcmVmX2ZyYW1lX2ZsYWc7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZGJnX2NvbG9yX21iX21vZGVzX2ZsYWc7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZGJnX2NvbG9yX2JfbW9kZXNfZmxhZzsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkYmdfZGlzcGxheV9tdl9mbGFnOwotI2VuZGlmCi0gICAgdnB4X2ltYWdlX3QgICAgICAgICAgICAgaW1nOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGltZ19zZXR1cDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpbWdfYXZhaWw7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2cDhfcHJpdl9zeihjb25zdCB2cHhfY29kZWNfZGVjX2NmZ190ICpzaSwgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3MpCi17Ci0gICAgLyogQWx0aG91Z2ggdGhpcyBkZWNsYXJhdGlvbiBpcyBjb25zdGFudCwgd2UgY2FuJ3QgdXNlIGl0IGluIHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBzZWdtZW50cyBsaXN0IGJlY2F1c2Ugd2Ugd2FudCB0byBkZWZpbmUgdGhlIHJlcXVlc3RlZCBzZWdtZW50cyBsaXN0Ci0gICAgICogYmVmb3JlIGRlZmluaW5nIHRoZSBwcml2YXRlIHR5cGUgKHNvIHRoYXQgdGhlIG51bWJlciBvZiBtZW1vcnkgbWFwcyBpcwotICAgICAqIGtub3duKQotICAgICAqLwotICAgICh2b2lkKXNpOwotICAgIHJldHVybiBzaXplb2YodnB4X2NvZGVjX2FsZ19wcml2X3QpOwotfQotCi0KLXN0YXRpYyB2b2lkIHZwOF9tbWFwX2R0b3IodnB4X2NvZGVjX21tYXBfdCAqbW1hcCkKLXsKLSAgICBmcmVlKG1tYXAtPnByaXYpOwotfQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9tbWFwX2FsbG9jKHZweF9jb2RlY19tbWFwX3QgKm1tYXApCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90ICByZXM7Ci0gICAgdW5zaWduZWQgaW50ICAgYWxpZ247Ci0KLSAgICBhbGlnbiA9IG1tYXAtPmFsaWduID8gbW1hcC0+YWxpZ24gLSAxIDogMDsKLQotICAgIGlmIChtbWFwLT5mbGFncyAmIFZQWF9DT0RFQ19NRU1fWkVSTykKLSAgICAgICAgbW1hcC0+cHJpdiA9IGNhbGxvYygxLCBtbWFwLT5zeiArIGFsaWduKTsKLSAgICBlbHNlCi0gICAgICAgIG1tYXAtPnByaXYgPSBtYWxsb2MobW1hcC0+c3ogKyBhbGlnbik7Ci0KLSAgICByZXMgPSAobW1hcC0+cHJpdikgPyBWUFhfQ09ERUNfT0sgOiBWUFhfQ09ERUNfTUVNX0VSUk9SOwotICAgIG1tYXAtPmJhc2UgPSAodm9pZCAqKSgoKCh1aW50cHRyX3QpbW1hcC0+cHJpdikgKyBhbGlnbikgJiB+KHVpbnRwdHJfdClhbGlnbik7Ci0gICAgbW1hcC0+ZHRvciA9IHZwOF9tbWFwX2R0b3I7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfdmFsaWRhdGVfbW1hcHMoY29uc3QgdnA4X3N0cmVhbV9pbmZvX3QgKnNpLAotICAgICAgICBjb25zdCB2cHhfY29kZWNfbW1hcF90ICAgICAgICAqbW1hcHMsCi0gICAgICAgIHZweF9jb2RlY19mbGFnc190ICAgICAgICAgICAgICBpbml0X2ZsYWdzKQotewotICAgIGludCBpOwotICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfT0s7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTkVMRU1FTlRTKHZwOF9tZW1fcmVxX3NlZ3MpIC0gMTsgaSsrKQotICAgIHsKLSAgICAgICAgLyogRW5zdXJlIHRoZSBzZWdtZW50IGhhcyBiZWVuIGFsbG9jYXRlZCAqLwotICAgICAgICBpZiAoIW1tYXBzW2ldLmJhc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19NRU1fRVJST1I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFZlcmlmeSB2YXJpYWJsZSBzaXplIHNlZ21lbnQgaXMgYmlnIGVub3VnaCBmb3IgdGhlIGN1cnJlbnQgc2kuICovCi0gICAgICAgIGlmICh2cDhfbWVtX3JlcV9zZWdzW2ldLmNhbGNfc3opCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOwotCi0gICAgICAgICAgICBjZmcudyA9IHNpLT53OwotICAgICAgICAgICAgY2ZnLmggPSBzaS0+aDsKLQotICAgICAgICAgICAgaWYgKG1tYXBzW2ldLnN6IDwgdnA4X21lbV9yZXFfc2Vnc1tpXS5jYWxjX3N6KCZjZmcsIGluaXRfZmxhZ3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19NRU1fRVJST1I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCB2cDhfaW5pdF9jdHgodnB4X2NvZGVjX2N0eF90ICpjdHgsIGNvbnN0IHZweF9jb2RlY19tbWFwX3QgKm1tYXApCi17Ci0gICAgaW50IGk7Ci0KLSAgICBjdHgtPnByaXYgPSBtbWFwLT5iYXNlOwotICAgIGN0eC0+cHJpdi0+c3ogPSBzaXplb2YoKmN0eC0+cHJpdik7Ci0gICAgY3R4LT5wcml2LT5pZmFjZSA9IGN0eC0+aWZhY2U7Ci0gICAgY3R4LT5wcml2LT5hbGdfcHJpdiA9IG1tYXAtPmJhc2U7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTkVMRU1FTlRTKGN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzKTsgaSsrKQotICAgICAgICBjdHgtPnByaXYtPmFsZ19wcml2LT5tbWFwc1tpXS5pZCA9IHZwOF9tZW1fcmVxX3NlZ3NbaV0uaWQ7Ci0KLSAgICBjdHgtPnByaXYtPmFsZ19wcml2LT5tbWFwc1swXSA9ICptbWFwOwotICAgIGN0eC0+cHJpdi0+YWxnX3ByaXYtPnNpLnN6ID0gc2l6ZW9mKGN0eC0+cHJpdi0+YWxnX3ByaXYtPnNpKTsKLSAgICBjdHgtPnByaXYtPmluaXRfZmxhZ3MgPSBjdHgtPmluaXRfZmxhZ3M7Ci0KLSAgICBpZiAoY3R4LT5jb25maWcuZGVjKQotICAgIHsKLSAgICAgICAgLyogVXBkYXRlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgdG8gYW4gaW50ZXJuYWwgY29weS4gKi8KLSAgICAgICAgY3R4LT5wcml2LT5hbGdfcHJpdi0+Y2ZnID0gKmN0eC0+Y29uZmlnLmRlYzsKLSAgICAgICAgY3R4LT5jb25maWcuZGVjID0gJmN0eC0+cHJpdi0+YWxnX3ByaXYtPmNmZzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkICptbWFwX2xrdXAodnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwgdW5zaWduZWQgaW50IGlkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE5FTEVNRU5UUyhjdHgtPm1tYXBzKTsgaSsrKQotICAgICAgICBpZiAoY3R4LT5tbWFwc1tpXS5pZCA9PSBpZCkKLSAgICAgICAgICAgIHJldHVybiBjdHgtPm1tYXBzW2ldLmJhc2U7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyB2b2lkIHZwOF9maW5hbGl6ZV9tbWFwcyh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4KQotewotICAgIC8qIG5vdGhpbmcgdG8gY2xlYW4gdXAgKi8KLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfaW5pdCh2cHhfY29kZWNfY3R4X3QgKmN0eCkKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKLQotICAgIC8qIFRoaXMgZnVuY3Rpb24gb25seSBhbGxvY2F0ZXMgc3BhY2UgZm9yIHRoZSB2cHhfY29kZWNfYWxnX3ByaXZfdAotICAgICAqIHN0cnVjdHVyZS4gTW9yZSBtZW1vcnkgbWF5IGJlIHJlcXVpcmVkIGF0IHRoZSB0aW1lIHRoZSBzdHJlYW0KLSAgICAgKiBpbmZvcm1hdGlvbiBiZWNvbWVzIGtub3duLgotICAgICAqLwotICAgIGlmICghY3R4LT5wcml2KQotICAgIHsKLSAgICAgICAgdnB4X2NvZGVjX21tYXBfdCBtbWFwOwotCi0gICAgICAgIG1tYXAuaWQgPSB2cDhfbWVtX3JlcV9zZWdzWzBdLmlkOwotICAgICAgICBtbWFwLnN6ID0gc2l6ZW9mKHZweF9jb2RlY19hbGdfcHJpdl90KTsKLSAgICAgICAgbW1hcC5hbGlnbiA9IHZwOF9tZW1fcmVxX3NlZ3NbMF0uYWxpZ247Ci0gICAgICAgIG1tYXAuZmxhZ3MgPSB2cDhfbWVtX3JlcV9zZWdzWzBdLmZsYWdzOwotCi0gICAgICAgIHJlcyA9IHZwOF9tbWFwX2FsbG9jKCZtbWFwKTsKLQotICAgICAgICBpZiAoIXJlcykKLSAgICAgICAgewotICAgICAgICAgICAgdnA4X2luaXRfY3R4KGN0eCwgJm1tYXApOwotCi0gICAgICAgICAgICBjdHgtPnByaXYtPmFsZ19wcml2LT5kZWZlcl9hbGxvYyA9IDE7Ci0gICAgICAgICAgICAvKnBvc3QgcHJvY2Vzc2luZyBsZXZlbCBpbml0aWFsaXplZCB0byBkbyBub3RoaW5nICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9kZXN0cm95KHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICB2cDhkeF9yZW1vdmVfZGVjb21wcmVzc29yKGN0eC0+cGJpKTsKLQotICAgIGZvciAoaSA9IE5FTEVNRU5UUyhjdHgtPm1tYXBzKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgICAgaWYgKGN0eC0+bW1hcHNbaV0uZHRvcikKLSAgICAgICAgICAgIGN0eC0+bW1hcHNbaV0uZHRvcigmY3R4LT5tbWFwc1tpXSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfcGVla19zaShjb25zdCB1aW50OF90ICAgICAgICAgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgZGF0YV9zeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKnNpKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfT0s7Ci0KLSAgICBpZihkYXRhICsgZGF0YV9zeiA8PSBkYXRhKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBQYXJzZSB1bmNvbXByZXNzc2VkIHBhcnQgb2Yga2V5IGZyYW1lIGhlYWRlci4KLSAgICAgICAgICogMyBieXRlczotIGluY2x1ZGluZyB2ZXJzaW9uLCBmcmFtZSB0eXBlIGFuZCBhbiBvZmZzZXQKLSAgICAgICAgICogMyBieXRlczotIHN5bmMgY29kZSAoMHg5ZCwgMHgwMSwgMHgyYSkKLSAgICAgICAgICogNCBieXRlczotIGluY2x1ZGluZyBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHRoZSBsb3dlc3QgMTQgYml0cwotICAgICAgICAgKiAgICAgICAgICAgb2YgZWFjaCAyLWJ5dGUgdmFsdWUuCi0gICAgICAgICAqLwotICAgICAgICBzaS0+aXNfa2YgPSAwOwotCi0gICAgICAgIGlmIChkYXRhX3N6ID49IDEwICYmICEoZGF0YVswXSAmIDB4MDEpKSAgLyogSS1GcmFtZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpjID0gZGF0YSArIDM7Ci0gICAgICAgICAgICBzaS0+aXNfa2YgPSAxOwotCi0gICAgICAgICAgICAvKiB2ZXQgdmlhIHN5bmMgY29kZSAqLwotICAgICAgICAgICAgaWYgKGNbMF0gIT0gMHg5ZCB8fCBjWzFdICE9IDB4MDEgfHwgY1syXSAhPSAweDJhKQotICAgICAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19VTlNVUF9CSVRTVFJFQU07Ci0KLSAgICAgICAgICAgIHNpLT53ID0gKGNbM10gfCAoY1s0XSA8PCA4KSkgJiAweDNmZmY7Ci0gICAgICAgICAgICBzaS0+aCA9IChjWzVdIHwgKGNbNl0gPDwgOCkpICYgMHgzZmZmOwotCi0gICAgICAgICAgICAvKnByaW50Zigidz0lZCwgaD0lZFxuIiwgc2ktPncsIHNpLT5oKTsqLwotICAgICAgICAgICAgaWYgKCEoc2ktPmggfCBzaS0+dykpCi0gICAgICAgICAgICAgICAgcmVzID0gVlBYX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfVU5TVVBfQklUU1RSRUFNOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci0KLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfZ2V0X3NpKHZweF9jb2RlY19hbGdfcHJpdl90ICAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKnNpKQotewotCi0gICAgdW5zaWduZWQgaW50IHN6OwotCi0gICAgaWYgKHNpLT5zeiA+PSBzaXplb2YodnA4X3N0cmVhbV9pbmZvX3QpKQotICAgICAgICBzeiA9IHNpemVvZih2cDhfc3RyZWFtX2luZm9fdCk7Ci0gICAgZWxzZQotICAgICAgICBzeiA9IHNpemVvZih2cHhfY29kZWNfc3RyZWFtX2luZm9fdCk7Ci0KLSAgICBtZW1jcHkoc2ksICZjdHgtPnNpLCBzeik7Ci0gICAgc2ktPnN6ID0gc3o7Ci0KLSAgICByZXR1cm4gVlBYX0NPREVDX09LOwotfQotCi0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QKLXVwZGF0ZV9lcnJvcl9zdGF0ZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgICAgICAgICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2ludGVybmFsX2Vycm9yX2luZm8gKmVycm9yKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXM7Ci0KLSAgICBpZiAoKHJlcyA9IGVycm9yLT5lcnJvcl9jb2RlKSkKLSAgICAgICAgY3R4LT5iYXNlLmVycl9kZXRhaWwgPSBlcnJvci0+aGFzX2RldGFpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyb3ItPmRldGFpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfZGVjb2RlKHZweF9jb2RlY19hbGdfcHJpdl90ICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBkYXRhX3N6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp1c2VyX3ByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgZGVhZGxpbmUpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IFZQWF9DT0RFQ19PSzsKLQotICAgIGN0eC0+aW1nX2F2YWlsID0gMDsKLQotICAgIC8qIERldGVybWluZSB0aGUgc3RyZWFtIHBhcmFtZXRlcnMuIE5vdGUgdGhhdCB3ZSByZWx5IG9uIHBlZWtfc2kgdG8KLSAgICAgKiB2YWxpZGF0ZSB0aGF0IHdlIGhhdmUgYSBidWZmZXIgdGhhdCBkb2VzIG5vdCB3cmFwIGFyb3VuZCB0aGUgdG9wCi0gICAgICogb2YgdGhlIGhlYXAuCi0gICAgICovCi0gICAgaWYgKCFjdHgtPnNpLmgpCi0gICAgICAgIHJlcyA9IGN0eC0+YmFzZS5pZmFjZS0+ZGVjLnBlZWtfc2koZGF0YSwgZGF0YV9zeiwgJmN0eC0+c2kpOwotCi0KLSAgICAvKiBQZXJmb3JtIGRlZmVycmVkIGFsbG9jYXRpb25zLCBpZiByZXF1aXJlZCAqLwotICAgIGlmICghcmVzICYmIGN0eC0+ZGVmZXJfYWxsb2MpCi0gICAgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAxOyAhcmVzICYmIGkgPCBORUxFTUVOVFMoY3R4LT5tbWFwcyk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdnB4X2NvZGVjX2RlY19jZmdfdCBjZmc7Ci0KLSAgICAgICAgICAgIGNmZy53ID0gY3R4LT5zaS53OwotICAgICAgICAgICAgY2ZnLmggPSBjdHgtPnNpLmg7Ci0gICAgICAgICAgICBjdHgtPm1tYXBzW2ldLmlkID0gdnA4X21lbV9yZXFfc2Vnc1tpXS5pZDsKLSAgICAgICAgICAgIGN0eC0+bW1hcHNbaV0uc3ogPSB2cDhfbWVtX3JlcV9zZWdzW2ldLnN6OwotICAgICAgICAgICAgY3R4LT5tbWFwc1tpXS5hbGlnbiA9IHZwOF9tZW1fcmVxX3NlZ3NbaV0uYWxpZ247Ci0gICAgICAgICAgICBjdHgtPm1tYXBzW2ldLmZsYWdzID0gdnA4X21lbV9yZXFfc2Vnc1tpXS5mbGFnczsKLQotICAgICAgICAgICAgaWYgKCFjdHgtPm1tYXBzW2ldLnN6KQotICAgICAgICAgICAgICAgIGN0eC0+bW1hcHNbaV0uc3ogPSB2cDhfbWVtX3JlcV9zZWdzW2ldLmNhbGNfc3ooJmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5iYXNlLmluaXRfZmxhZ3MpOwotCi0gICAgICAgICAgICByZXMgPSB2cDhfbW1hcF9hbGxvYygmY3R4LT5tbWFwc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlcykKLSAgICAgICAgICAgIHZwOF9maW5hbGl6ZV9tbWFwcyhjdHgpOwotCi0gICAgICAgIGN0eC0+ZGVmZXJfYWxsb2MgPSAwOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZXIgaW5zdGFuY2Ugb24gdGhlIGZpcnN0IGZyYW1lKi8KLSAgICBpZiAoIXJlcyAmJiAhY3R4LT5kZWNvZGVyX2luaXQpCi0gICAgewotICAgICAgICByZXMgPSB2cDhfdmFsaWRhdGVfbW1hcHMoJmN0eC0+c2ksIGN0eC0+bW1hcHMsIGN0eC0+YmFzZS5pbml0X2ZsYWdzKTsKLQotICAgICAgICBpZiAoIXJlcykKLSAgICAgICAgewotICAgICAgICAgICAgVlA4RF9DT05GSUcgb3hjZjsKLSAgICAgICAgICAgIFZQOERfUFRSIG9wdHI7Ci0KLSAgICAgICAgICAgIHZwOGR4X2luaXRpYWxpemUoKTsKLQotICAgICAgICAgICAgb3hjZi5XaWR0aCA9IGN0eC0+c2kudzsKLSAgICAgICAgICAgIG94Y2YuSGVpZ2h0ID0gY3R4LT5zaS5oOwotICAgICAgICAgICAgb3hjZi5WZXJzaW9uID0gOTsKLSAgICAgICAgICAgIG94Y2YucG9zdHByb2Nlc3MgPSAwOwotICAgICAgICAgICAgb3hjZi5tYXhfdGhyZWFkcyA9IGN0eC0+Y2ZnLnRocmVhZHM7Ci0KLSAgICAgICAgICAgIG9wdHIgPSB2cDhkeF9jcmVhdGVfZGVjb21wcmVzc29yKCZveGNmKTsKLQotICAgICAgICAgICAgLyogSWYgcG9zdHByb2Nlc3Npbmcgd2FzIGVuYWJsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCBhCi0gICAgICAgICAgICAgKiBjb25maWd1cmF0aW9uIGhhcyBub3QgYmVlbiBwcm92aWRlZCwgZGVmYXVsdCBpdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFjdHgtPnBvc3Rwcm9jX2NmZ19zZXQKLSAgICAgICAgICAgICAgICAmJiAoY3R4LT5iYXNlLmluaXRfZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1BPU1RQUk9DKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdHgtPnBvc3Rwcm9jX2NmZy5wb3N0X3Byb2NfZmxhZyA9Ci0gICAgICAgICAgICAgICAgICAgIFZQOF9ERUJMT0NLIHwgVlA4X0RFTUFDUk9CTE9DSzsKLSAgICAgICAgICAgICAgICBjdHgtPnBvc3Rwcm9jX2NmZy5kZWJsb2NraW5nX2xldmVsID0gNDsKLSAgICAgICAgICAgICAgICBjdHgtPnBvc3Rwcm9jX2NmZy5ub2lzZV9sZXZlbCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghb3B0cikKLSAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3R4LT5wYmkgPSBvcHRyOwotICAgICAgICB9Ci0KLSAgICAgICAgY3R4LT5kZWNvZGVyX2luaXQgPSAxOwotICAgIH0KLQotICAgIGlmICghcmVzICYmIGN0eC0+cGJpKQotICAgIHsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHIHNkOwotICAgICAgICBJTlQ2NCB0aW1lX3N0YW1wID0gMCwgdGltZV9lbmRfc3RhbXAgPSAwOwotICAgICAgICB2cDhfcHBmbGFnc190IGZsYWdzID0gezB9OwotCi0gICAgICAgIGlmIChjdHgtPmJhc2UuaW5pdF9mbGFncyAmIFZQWF9DT0RFQ19VU0VfUE9TVFBST0MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZsYWdzLnBvc3RfcHJvY19mbGFnPSBjdHgtPnBvc3Rwcm9jX2NmZy5wb3N0X3Byb2NfZmxhZwotI2lmIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGN0eC0+ZGJnX2NvbG9yX3JlZl9mcmFtZV9mbGFnICE9IDApID8gVlA4RF9ERUJVR19DTFJfRlJNX1JFRl9CTEtTIDogMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGN0eC0+ZGJnX2NvbG9yX21iX21vZGVzX2ZsYWcgIT0gMCkgPyBWUDhEX0RFQlVHX0NMUl9CTEtfTU9ERVMgOiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoY3R4LT5kYmdfY29sb3JfYl9tb2Rlc19mbGFnICE9IDApID8gVlA4RF9ERUJVR19DTFJfQkxLX01PREVTIDogMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGN0eC0+ZGJnX2Rpc3BsYXlfbXZfZmxhZyAhPSAwKSA/IFZQOERfREVCVUdfRFJBV19NViA6IDApCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgZmxhZ3MuZGVibG9ja2luZ19sZXZlbCAgICAgID0gY3R4LT5wb3N0cHJvY19jZmcuZGVibG9ja2luZ19sZXZlbDsKLSAgICAgICAgICAgIGZsYWdzLm5vaXNlX2xldmVsICAgICAgICAgICA9IGN0eC0+cG9zdHByb2NfY2ZnLm5vaXNlX2xldmVsOwotI2lmIENPTkZJR19QT1NUUFJPQ19WSVNVQUxJWkVSCi0gICAgICAgICAgICBmbGFncy5kaXNwbGF5X3JlZl9mcmFtZV9mbGFnPSBjdHgtPmRiZ19jb2xvcl9yZWZfZnJhbWVfZmxhZzsKLSAgICAgICAgICAgIGZsYWdzLmRpc3BsYXlfbWJfbW9kZXNfZmxhZyA9IGN0eC0+ZGJnX2NvbG9yX21iX21vZGVzX2ZsYWc7Ci0gICAgICAgICAgICBmbGFncy5kaXNwbGF5X2JfbW9kZXNfZmxhZyAgPSBjdHgtPmRiZ19jb2xvcl9iX21vZGVzX2ZsYWc7Ci0gICAgICAgICAgICBmbGFncy5kaXNwbGF5X212X2ZsYWcgICAgICAgPSBjdHgtPmRiZ19kaXNwbGF5X212X2ZsYWc7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2cDhkeF9yZWNlaXZlX2NvbXByZXNzZWRfZGF0YShjdHgtPnBiaSwgZGF0YV9zeiwgZGF0YSwgZGVhZGxpbmUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBWUDhEX0NPTVAgKnBiaSA9IChWUDhEX0NPTVAgKiljdHgtPnBiaTsKLSAgICAgICAgICAgIHJlcyA9IHVwZGF0ZV9lcnJvcl9zdGF0ZShjdHgsICZwYmktPmNvbW1vbi5lcnJvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlcyAmJiAwID09IHZwOGR4X2dldF9yYXdfZnJhbWUoY3R4LT5wYmksICZzZCwgJnRpbWVfc3RhbXAsICZ0aW1lX2VuZF9zdGFtcCwgJmZsYWdzKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWxpZ24gd2lkdGgvaGVpZ2h0ICovCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgYV93ID0gKHNkLnlfd2lkdGggKyAxNSkgJiB+MTU7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgYV9oID0gKHNkLnlfaGVpZ2h0ICsgMTUpICYgfjE1OwotCi0gICAgICAgICAgICB2cHhfaW1nX3dyYXAoJmN0eC0+aW1nLCBWUFhfSU1HX0ZNVF9JNDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFfdyArIDIgKiBWUDhCT1JERVJJTlBJWEVMUywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhX2ggKyAyICogVlA4Qk9SREVSSU5QSVhFTFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZC5idWZmZXJfYWxsb2MpOwotICAgICAgICAgICAgdnB4X2ltZ19zZXRfcmVjdCgmY3R4LT5pbWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJPUkRFUklOUElYRUxTLCBWUDhCT1JERVJJTlBJWEVMUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QueV93aWR0aCwgc2QueV9oZWlnaHQpOwotICAgICAgICAgICAgY3R4LT5pbWcudXNlcl9wcml2ID0gdXNlcl9wcml2OwotICAgICAgICAgICAgY3R4LT5pbWdfYXZhaWwgPSAxOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdnB4X2ltYWdlX3QgKnZwOF9nZXRfZnJhbWUodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgICAgICppdGVyKQotewotICAgIHZweF9pbWFnZV90ICppbWcgPSBOVUxMOwotCi0gICAgaWYgKGN0eC0+aW1nX2F2YWlsKQotICAgIHsKLSAgICAgICAgLyogaXRlciBhY3RzIGFzIGEgZmxpcCBmbG9wLCBzbyBhbiBpbWFnZSBpcyBvbmx5IHJldHVybmVkIG9uIHRoZSBmaXJzdAotICAgICAgICAgKiBjYWxsIHRvIGdldF9mcmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghKCppdGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW1nID0gJmN0eC0+aW1nOwotICAgICAgICAgICAgKml0ZXIgPSBpbWc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaW1nOwotfQotCi0KLXN0YXRpYwotdnB4X2NvZGVjX2Vycl90IHZwOF94bWFfZ2V0X21tYXAoY29uc3QgdnB4X2NvZGVjX2N0eF90ICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19tbWFwX3QgICAgICAgICAgICptbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgICAgICAgICAgKml0ZXIpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90ICAgICByZXM7Ci0gICAgY29uc3QgbWVtX3JlcV90ICAqc2VnX2l0ZXIgPSAqaXRlcjsKLQotICAgIC8qIEdldCBhZGRyZXNzIG9mIG5leHQgc2VnbWVudCByZXF1ZXN0ICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGlmICghc2VnX2l0ZXIpCi0gICAgICAgICAgICBzZWdfaXRlciA9IHZwOF9tZW1fcmVxX3NlZ3M7Ci0gICAgICAgIGVsc2UgaWYgKHNlZ19pdGVyLT5pZCAhPSBWUDhfU0VHX01BWCkKLSAgICAgICAgICAgIHNlZ19pdGVyKys7Ci0KLSAgICAgICAgKml0ZXIgPSAodnB4X2NvZGVjX2l0ZXJfdClzZWdfaXRlcjsKLQotICAgICAgICBpZiAoc2VnX2l0ZXItPmlkICE9IFZQOF9TRUdfTUFYKQotICAgICAgICB7Ci0gICAgICAgICAgICBtbWFwLT5pZCA9IHNlZ19pdGVyLT5pZDsKLSAgICAgICAgICAgIG1tYXAtPnN6ID0gc2VnX2l0ZXItPnN6OwotICAgICAgICAgICAgbW1hcC0+YWxpZ24gPSBzZWdfaXRlci0+YWxpZ247Ci0gICAgICAgICAgICBtbWFwLT5mbGFncyA9IHNlZ19pdGVyLT5mbGFnczsKLQotICAgICAgICAgICAgaWYgKCFzZWdfaXRlci0+c3opCi0gICAgICAgICAgICAgICAgbW1hcC0+c3ogPSBzZWdfaXRlci0+Y2FsY19zeihjdHgtPmNvbmZpZy5kZWMsIGN0eC0+aW5pdF9mbGFncyk7Ci0KLSAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfTElTVF9FTkQ7Ci0gICAgfQotICAgIHdoaWxlICghbW1hcC0+c3ogJiYgcmVzICE9IFZQWF9DT0RFQ19MSVNUX0VORCk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF94bWFfc2V0X21tYXAodnB4X2NvZGVjX2N0eF90ICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfbW1hcF90ICAqbW1hcCkKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gVlBYX0NPREVDX01FTV9FUlJPUjsKLSAgICBpbnQgaSwgZG9uZTsKLQotICAgIGlmICghY3R4LT5wcml2KQotICAgIHsKLSAgICAgICAgaWYgKG1tYXAtPmlkID09IFZQOF9TRUdfQUxHX1BSSVYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY3R4LT5wcml2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZwOF9pbml0X2N0eChjdHgsIG1tYXApOwotICAgICAgICAgICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGRvbmUgPSAxOwotCi0gICAgaWYgKCFyZXMgJiYgY3R4LT5wcml2LT5hbGdfcHJpdikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBORUxFTUVOVFMoY3R4LT5wcml2LT5hbGdfcHJpdi0+bW1hcHMpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdHgtPnByaXYtPmFsZ19wcml2LT5tbWFwc1tpXS5pZCA9PSBtbWFwLT5pZCkKLSAgICAgICAgICAgICAgICBpZiAoIWN0eC0+cHJpdi0+YWxnX3ByaXYtPm1tYXBzW2ldLmJhc2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdHgtPnByaXYtPmFsZ19wcml2LT5tbWFwc1tpXSA9ICptbWFwOwotICAgICAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb25lICY9IChjdHgtPnByaXYtPmFsZ19wcml2LT5tbWFwc1tpXS5iYXNlICE9IE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRvbmUgJiYgIXJlcykKLSAgICB7Ci0gICAgICAgIHZwOF9maW5hbGl6ZV9tbWFwcyhjdHgtPnByaXYtPmFsZ19wcml2KTsKLSAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+aW5pdChjdHgpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgaW1hZ2UyeXV2Y29uZmlnKGNvbnN0IHZweF9pbWFnZV90ICAgKmltZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAgKnl2MTIpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90ICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7Ci0gICAgeXYxMi0+eV9idWZmZXIgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07Ci0gICAgeXYxMi0+dV9idWZmZXIgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07Ci0gICAgeXYxMi0+dl9idWZmZXIgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07Ci0KLSAgICB5djEyLT55X3dpZHRoICA9IGltZy0+ZF93OwotICAgIHl2MTItPnlfaGVpZ2h0ID0gaW1nLT5kX2g7Ci0gICAgeXYxMi0+dXZfd2lkdGggPSB5djEyLT55X3dpZHRoIC8gMjsKLSAgICB5djEyLT51dl9oZWlnaHQgPSB5djEyLT55X2hlaWdodCAvIDI7Ci0KLSAgICB5djEyLT55X3N0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKLSAgICB5djEyLT51dl9zdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07Ci0KLSAgICB5djEyLT5ib3JkZXIgID0gKGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXSAtIGltZy0+ZF93KSAvIDI7Ci0gICAgeXYxMi0+Y2xydHlwZSA9IChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9WUFhJNDIwIHx8IGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX1ZQWFlWMTIpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9zZXRfcmVmZXJlbmNlKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgIGludCBjdHJfaWQsCi0gICAgICAgIHZhX2xpc3QgYXJncykKLXsKLQotICAgIHZweF9yZWZfZnJhbWVfdCAqZGF0YSA9IHZhX2FyZyhhcmdzLCB2cHhfcmVmX2ZyYW1lX3QgKik7Ci0KLSAgICBpZiAoZGF0YSkKLSAgICB7Ci0gICAgICAgIHZweF9yZWZfZnJhbWVfdCAqZnJhbWUgPSAodnB4X3JlZl9mcmFtZV90ICopZGF0YTsKLSAgICAgICAgWVYxMl9CVUZGRVJfQ09ORklHIHNkOwotCi0gICAgICAgIGltYWdlMnl1dmNvbmZpZygmZnJhbWUtPmltZywgJnNkKTsKLQotICAgICAgICB2cDhkeF9zZXRfcmVmZXJlbmNlKGN0eC0+cGJpLCBmcmFtZS0+ZnJhbWVfdHlwZSwgJnNkKTsKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0KLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfZ2V0X3JlZmVyZW5jZSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICBpbnQgY3RyX2lkLAotICAgICAgICB2YV9saXN0IGFyZ3MpCi17Ci0KLSAgICB2cHhfcmVmX2ZyYW1lX3QgKmRhdGEgPSB2YV9hcmcoYXJncywgdnB4X3JlZl9mcmFtZV90ICopOwotCi0gICAgaWYgKGRhdGEpCi0gICAgewotICAgICAgICB2cHhfcmVmX2ZyYW1lX3QgKmZyYW1lID0gKHZweF9yZWZfZnJhbWVfdCAqKWRhdGE7Ci0gICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyBzZDsKLQotICAgICAgICBpbWFnZTJ5dXZjb25maWcoJmZyYW1lLT5pbWcsICZzZCk7Ci0KLSAgICAgICAgdnA4ZHhfZ2V0X3JlZmVyZW5jZShjdHgtPnBiaSwgZnJhbWUtPmZyYW1lX3R5cGUsICZzZCk7Ci0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotCi19Ci0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X3NldF9wb3N0cHJvYyh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKQotewotICAgIHZwOF9wb3N0cHJvY19jZmdfdCAqZGF0YSA9IHZhX2FyZyhhcmdzLCB2cDhfcG9zdHByb2NfY2ZnX3QgKik7Ci0jaWYgQ09ORklHX1BPU1RQUk9DCi0KLSAgICBpZiAoZGF0YSkKLSAgICB7Ci0gICAgICAgIGN0eC0+cG9zdHByb2NfY2ZnX3NldCA9IDE7Ci0gICAgICAgIGN0eC0+cG9zdHByb2NfY2ZnID0gKigodnA4X3Bvc3Rwcm9jX2NmZ190ICopZGF0YSk7Ci0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfT0s7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotCi0jZWxzZQotICAgIHJldHVybiBWUFhfQ09ERUNfSU5DQVBBQkxFOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2cHhfY29kZWNfZXJyX3QgdnA4X3NldF9kYmdfb3B0aW9ucyh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHJsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKLXsKLSNpZiBDT05GSUdfUE9TVFBST0NfVklTVUFMSVpFUiAmJiBDT05GSUdfUE9TVFBST0MKLSAgICBpbnQgZGF0YSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCi0jZGVmaW5lIE1BUChpZCwgdmFyKSBjYXNlIGlkOiB2YXIgPSBkYXRhOyBicmVhazsKLQotICAgIHN3aXRjaCAoY3RybF9pZCkKLSAgICB7Ci0gICAgICAgIE1BUCAoVlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FLCAgIGN0eC0+ZGJnX2NvbG9yX3JlZl9mcmFtZV9mbGFnKTsKLSAgICAgICAgTUFQIChWUDhfU0VUX0RCR19DT0xPUl9NQl9NT0RFUywgICAgY3R4LT5kYmdfY29sb3JfbWJfbW9kZXNfZmxhZyk7Ci0gICAgICAgIE1BUCAoVlA4X1NFVF9EQkdfQ09MT1JfQl9NT0RFUywgICAgIGN0eC0+ZGJnX2NvbG9yX2JfbW9kZXNfZmxhZyk7Ci0gICAgICAgIE1BUCAoVlA4X1NFVF9EQkdfRElTUExBWV9NViwgICAgICAgIGN0eC0+ZGJnX2Rpc3BsYXlfbXZfZmxhZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLSNlbHNlCi0gICAgcmV0dXJuIFZQWF9DT0RFQ19JTkNBUEFCTEU7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZweF9jb2RlY19lcnJfdCB2cDhfZ2V0X2xhc3RfcmVmX3VwZGF0ZXModnB4X2NvZGVjX2FsZ19wcml2X3QgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHJsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKQotewotICAgIGludCAqdXBkYXRlX2luZm8gPSB2YV9hcmcoYXJncywgaW50ICopOwotICAgIFZQOERfQ09NUCAqcGJpID0gKFZQOERfQ09NUCAqKWN0eC0+cGJpOwotCi0gICAgaWYgKHVwZGF0ZV9pbmZvKQotICAgIHsKLSAgICAgICAgKnVwZGF0ZV9pbmZvID0gcGJpLT5jb21tb24ucmVmcmVzaF9hbHRfcmVmX2ZyYW1lICogKGludCkgVlA4X0FMVFJfRlJBTUUKLSAgICAgICAgICAgICsgcGJpLT5jb21tb24ucmVmcmVzaF9nb2xkZW5fZnJhbWUgKiAoaW50KSBWUDhfR09MRF9GUkFNRQotICAgICAgICAgICAgKyBwYmktPmNvbW1vbi5yZWZyZXNoX2xhc3RfZnJhbWUgKiAoaW50KSBWUDhfTEFTVF9GUkFNRTsKLQotICAgICAgICByZXR1cm4gVlBYX0NPREVDX09LOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLX0KLQotCi1zdGF0aWMgdnB4X2NvZGVjX2Vycl90IHZwOF9nZXRfZnJhbWVfY29ycnVwdGVkKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHJsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpCi17Ci0KLSAgICBpbnQgKmNvcnJ1cHRlZCA9IHZhX2FyZyhhcmdzLCBpbnQgKik7Ci0KLSAgICBpZiAoY29ycnVwdGVkKQotICAgIHsKLSAgICAgICAgVlA4RF9DT01QICpwYmkgPSAoVlA4RF9DT01QICopY3R4LT5wYmk7Ci0gICAgICAgICpjb3JydXB0ZWQgPSBwYmktPmNvbW1vbi5mcmFtZV90b19zaG93LT5jb3JydXB0ZWQ7Ci0KLSAgICAgICAgcmV0dXJuIFZQWF9DT0RFQ19PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0KLX0KLQotdnB4X2NvZGVjX2N0cmxfZm5fbWFwX3QgdnA4X2N0Zl9tYXBzW10gPQotewotICAgIHtWUDhfU0VUX1JFRkVSRU5DRSwgICAgICAgICAgICAgdnA4X3NldF9yZWZlcmVuY2V9LAotICAgIHtWUDhfQ09QWV9SRUZFUkVOQ0UsICAgICAgICAgICAgdnA4X2dldF9yZWZlcmVuY2V9LAotICAgIHtWUDhfU0VUX1BPU1RQUk9DLCAgICAgICAgICAgICAgdnA4X3NldF9wb3N0cHJvY30sCi0gICAge1ZQOF9TRVRfREJHX0NPTE9SX1JFRl9GUkFNRSwgICB2cDhfc2V0X2RiZ19vcHRpb25zfSwKLSAgICB7VlA4X1NFVF9EQkdfQ09MT1JfTUJfTU9ERVMsICAgIHZwOF9zZXRfZGJnX29wdGlvbnN9LAotICAgIHtWUDhfU0VUX0RCR19DT0xPUl9CX01PREVTLCAgICAgdnA4X3NldF9kYmdfb3B0aW9uc30sCi0gICAge1ZQOF9TRVRfREJHX0RJU1BMQVlfTVYsICAgICAgICB2cDhfc2V0X2RiZ19vcHRpb25zfSwKLSAgICB7VlA4RF9HRVRfTEFTVF9SRUZfVVBEQVRFUywgICAgIHZwOF9nZXRfbGFzdF9yZWZfdXBkYXRlc30sCi0gICAge1ZQOERfR0VUX0ZSQU1FX0NPUlJVUFRFRCwgICAgICB2cDhfZ2V0X2ZyYW1lX2NvcnJ1cHRlZH0sCi0gICAgeyAtMSwgTlVMTH0sCi19OwotCi0KLSNpZm5kZWYgVkVSU0lPTl9TVFJJTkcKLSNkZWZpbmUgVkVSU0lPTl9TVFJJTkcKLSNlbmRpZgotQ09ERUNfSU5URVJGQUNFKHZweF9jb2RlY192cDhfZHgpID0KLXsKLSAgICAiV2ViTSBQcm9qZWN0IFZQOCBEZWNvZGVyIiBWRVJTSU9OX1NUUklORywKLSAgICBWUFhfQ09ERUNfSU5URVJOQUxfQUJJX1ZFUlNJT04sCi0gICAgVlBYX0NPREVDX0NBUF9ERUNPREVSIHwgVlA4X0NBUF9QT1NUUFJPQywKLSAgICAvKiB2cHhfY29kZWNfY2Fwc190ICAgICAgICAgIGNhcHM7ICovCi0gICAgdnA4X2luaXQsICAgICAgICAgLyogdnB4X2NvZGVjX2luaXRfZm5fdCAgICAgICBpbml0OyAqLwotICAgIHZwOF9kZXN0cm95LCAgICAgIC8qIHZweF9jb2RlY19kZXN0cm95X2ZuX3QgICAgZGVzdHJveTsgKi8KLSAgICB2cDhfY3RmX21hcHMsICAgICAvKiB2cHhfY29kZWNfY3RybF9mbl9tYXBfdCAgKmN0cmxfbWFwczsgKi8KLSAgICB2cDhfeG1hX2dldF9tbWFwLCAvKiB2cHhfY29kZWNfZ2V0X21tYXBfZm5fdCAgIGdldF9tbWFwOyAqLwotICAgIHZwOF94bWFfc2V0X21tYXAsIC8qIHZweF9jb2RlY19zZXRfbW1hcF9mbl90ICAgc2V0X21tYXA7ICovCi0gICAgewotICAgICAgICB2cDhfcGVla19zaSwgICAgICAvKiB2cHhfY29kZWNfcGVla19zaV9mbl90ICAgIHBlZWtfc2k7ICovCi0gICAgICAgIHZwOF9nZXRfc2ksICAgICAgIC8qIHZweF9jb2RlY19nZXRfc2lfZm5fdCAgICAgZ2V0X3NpOyAqLwotICAgICAgICB2cDhfZGVjb2RlLCAgICAgICAvKiB2cHhfY29kZWNfZGVjb2RlX2ZuX3QgICAgIGRlY29kZTsgKi8KLSAgICAgICAgdnA4X2dldF9mcmFtZSwgICAgLyogdnB4X2NvZGVjX2ZyYW1lX2dldF9mbl90ICBmcmFtZV9nZXQ7ICovCi0gICAgfSwKLSAgICB7IC8qIGVuY29kZXIgZnVuY3Rpb25zICovCi0gICAgICAgIE5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgTk9UX0lNUExFTUVOVEVELAotICAgICAgICBOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIE5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgTk9UX0lNUExFTUVOVEVELAotICAgICAgICBOT1RfSU1QTEVNRU5URUQKLSAgICB9Ci19OwotCi0vKgotICogQkVHSU4gQkFDS1dBUkRTIENPTVBBVElCSUxJVFkgU0hJTS4KLSAqLwotdnB4X2NvZGVjX2lmYWNlX3QgdnB4X2NvZGVjX3ZwOF9hbGdvID0KLXsKLSAgICAiV2ViTSBQcm9qZWN0IFZQOCBEZWNvZGVyIChEZXByZWNhdGVkIEFQSSkiIFZFUlNJT05fU1RSSU5HLAotICAgIFZQWF9DT0RFQ19JTlRFUk5BTF9BQklfVkVSU0lPTiwKLSAgICBWUFhfQ09ERUNfQ0FQX0RFQ09ERVIgfCBWUDhfQ0FQX1BPU1RQUk9DLAotICAgIC8qIHZweF9jb2RlY19jYXBzX3QgICAgICAgICAgY2FwczsgKi8KLSAgICB2cDhfaW5pdCwgICAgICAgICAvKiB2cHhfY29kZWNfaW5pdF9mbl90ICAgICAgIGluaXQ7ICovCi0gICAgdnA4X2Rlc3Ryb3ksICAgICAgLyogdnB4X2NvZGVjX2Rlc3Ryb3lfZm5fdCAgICBkZXN0cm95OyAqLwotICAgIHZwOF9jdGZfbWFwcywgICAgIC8qIHZweF9jb2RlY19jdHJsX2ZuX21hcF90ICAqY3RybF9tYXBzOyAqLwotICAgIHZwOF94bWFfZ2V0X21tYXAsIC8qIHZweF9jb2RlY19nZXRfbW1hcF9mbl90ICAgZ2V0X21tYXA7ICovCi0gICAgdnA4X3htYV9zZXRfbW1hcCwgLyogdnB4X2NvZGVjX3NldF9tbWFwX2ZuX3QgICBzZXRfbW1hcDsgKi8KLSAgICB7Ci0gICAgICAgIHZwOF9wZWVrX3NpLCAgICAgIC8qIHZweF9jb2RlY19wZWVrX3NpX2ZuX3QgICAgcGVla19zaTsgKi8KLSAgICAgICAgdnA4X2dldF9zaSwgICAgICAgLyogdnB4X2NvZGVjX2dldF9zaV9mbl90ICAgICBnZXRfc2k7ICovCi0gICAgICAgIHZwOF9kZWNvZGUsICAgICAgIC8qIHZweF9jb2RlY19kZWNvZGVfZm5fdCAgICAgZGVjb2RlOyAqLwotICAgICAgICB2cDhfZ2V0X2ZyYW1lLCAgICAvKiB2cHhfY29kZWNfZnJhbWVfZ2V0X2ZuX3QgIGZyYW1lX2dldDsgKi8KLSAgICB9LAotICAgIHsgLyogZW5jb2RlciBmdW5jdGlvbnMgKi8KLSAgICAgICAgTk9UX0lNUExFTUVOVEVELAotICAgICAgICBOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIE5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgTk9UX0lNUExFTUVOVEVELAotICAgICAgICBOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIE5PVF9JTVBMRU1FTlRFRAotICAgIH0KLX07CmRpZmYgLS1naXQgYS92cDgvdnA4Y3gubWsgYi92cDgvdnA4Y3gubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzdmOWEuLjAwMDAwMDAKLS0tIGEvdnA4L3ZwOGN4Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMjCi0jIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMjCi0jIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0jIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0jIwotCi0KLWluY2x1ZGUgJChTUkNfUEFUSF9CQVJFKS8kKFZQOF9QUkVGSVgpdnA4X2NvbW1vbi5tawotCi1WUDhfQ1hfRVhQT1JUUyArPSBleHBvcnRzX2VuYwotCi1WUDhfQ1hfU1JDUy15ZXMgKz0gJChWUDhfQ09NTU9OX1NSQ1MteWVzKQotVlA4X0NYX1NSQ1Mtbm8gICs9ICQoVlA4X0NPTU1PTl9TUkNTLW5vKQotVlA4X0NYX1NSQ1NfUkVNT1ZFLXllcyArPSAkKFZQOF9DT01NT05fU1JDU19SRU1PVkUteWVzKQotVlA4X0NYX1NSQ1NfUkVNT1ZFLW5vICArPSAkKFZQOF9DT01NT05fU1JDU19SRU1PVkUtbm8pCi0KLWlmZXEgKCQoQVJDSF9BUk0pLHllcykKLSAgaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCl2cDhjeF9hcm0ubWsKLWVuZGlmCi0KLVZQOF9DWF9TUkNTLXllcyArPSB2cDhfY3hfaWZhY2UuYwotCi0jIGVuY29kZXIKLSNJTkNMVURFUyArPSBhbGdvL3ZweF9jb21tb24vdnB4X21lbS9pbmNsdWRlCi0jSU5DTFVERVMgKz0gY29tbW9uCi0jSU5DTFVERVMgKz0gY29tbW9uCi0jSU5DTFVERVMgKz0gY29tbW9uCi0jSU5DTFVERVMgKz0gYWxnby92cHhfcmVmL2NwdV9pZC9pbmNsdWRlCi0jSU5DTFVERVMgKz0gY29tbW9uCi0jSU5DTFVERVMgKz0gZW5jb2RlcgotCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9hc21fZW5jX29mZnNldHMuYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYml0c3RyZWFtLmMKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2Jvb2xodWZmLmMKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2RjdC5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVmcmFtZS5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVpbnRyYS5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVtYi5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVtdi5jCi1WUDhfQ1hfU1JDUy0kKENPTkZJR19NVUxUSVRIUkVBRCkgKz0gZW5jb2Rlci9ldGhyZWFkaW5nLmMKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2ZpcnN0cGFzcy5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9nZW5lcmljL2NzeXN0ZW1kZXBlbmRlbnQuYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYmxvY2suaAotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYm9vbGh1ZmYuaAotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvYml0c3RyZWFtLmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL2RjdC5oCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVpbnRyYS5oCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVtYi5oCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9lbmNvZGVtdi5oCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9maXJzdHBhc3MuaAotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvbWNvbXAuaAotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvbW9kZWNvc3RzLmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL29ueXhfaW50LmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3BpY2tpbnRlci5oCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9wc25yLmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3F1YW50aXplLmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3JhdGVjdHJsLmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3Jkb3B0LmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3Rva2VuaXplLmgKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3RyZWV3cml0ZXIuaAotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvdmFyaWFuY2UuaAotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvbWNvbXAuYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvbW9kZWNvc3RzLmMKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL29ueXhfaWYuYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcGlja2ludGVyLmMKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3BpY2tscGYuYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvcHNuci5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9xdWFudGl6ZS5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9yYXRlY3RybC5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9yZG9wdC5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9zYWRfYy5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci9zZWdtZW50YXRpb24uYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvc2VnbWVudGF0aW9uLmgKLVZQOF9DWF9TUkNTLSQoQ09ORklHX1BTTlIpICs9IGVuY29kZXIvc3NpbS5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci90b2tlbml6ZS5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci90cmVld3JpdGVyLmMKLVZQOF9DWF9TUkNTLXllcyArPSBlbmNvZGVyL3ZhcmlhbmNlX2MuYwotVlA4X0NYX1NSQ1MtJChDT05GSUdfUFNOUikgKz0gY29tbW9uL3Bvc3Rwcm9jLmgKLVZQOF9DWF9TUkNTLSQoQ09ORklHX1BTTlIpICs9IGNvbW1vbi9wb3N0cHJvYy5jCi1WUDhfQ1hfU1JDUy15ZXMgKz0gZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuYwotVlA4X0NYX1NSQ1MteWVzICs9IGVuY29kZXIvdGVtcG9yYWxfZmlsdGVyLmgKLQotaWZlcSAoJChDT05GSUdfUkVBTFRJTUVfT05MWSkseWVzKQotVlA4X0NYX1NSQ1NfUkVNT1ZFLXllcyArPSBlbmNvZGVyL2ZpcnN0cGFzcy5jCi1WUDhfQ1hfU1JDU19SRU1PVkUteWVzICs9IGVuY29kZXIvdGVtcG9yYWxfZmlsdGVyLmMKLWVuZGlmCi0KLVZQOF9DWF9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gZW5jb2Rlci94ODYvZW5jb2RlbWJfeDg2LmgKLVZQOF9DWF9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gZW5jb2Rlci94ODYvZGN0X3g4Ni5oCi1WUDhfQ1hfU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGVuY29kZXIveDg2L21jb21wX3g4Ni5oCi1WUDhfQ1hfU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGVuY29kZXIveDg2L3ZhcmlhbmNlX3g4Ni5oCi1WUDhfQ1hfU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGVuY29kZXIveDg2L3F1YW50aXplX3g4Ni5oCi1WUDhfQ1hfU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGVuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl94ODYuaAotVlA4X0NYX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBlbmNvZGVyL3g4Ni94ODZfY3N5c3RlbWRlcGVuZGVudC5jCi1WUDhfQ1hfU1JDUy0kKEhBVkVfTU1YKSArPSBlbmNvZGVyL3g4Ni92YXJpYW5jZV9tbXguYwotVlA4X0NYX1NSQ1MtJChIQVZFX01NWCkgKz0gZW5jb2Rlci94ODYvdmFyaWFuY2VfaW1wbF9tbXguYXNtCi1WUDhfQ1hfU1JDUy0kKEhBVkVfTU1YKSArPSBlbmNvZGVyL3g4Ni9zYWRfbW14LmFzbQotVlA4X0NYX1NSQ1MtJChIQVZFX01NWCkgKz0gZW5jb2Rlci94ODYvZGN0X21teC5hc20KLVZQOF9DWF9TUkNTLSQoSEFWRV9NTVgpICs9IGVuY29kZXIveDg2L3N1YnRyYWN0X21teC5hc20KLVZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9kY3Rfc3NlMi5hc20KLVZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni92YXJpYW5jZV9zc2UyLmMKLVZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni92YXJpYW5jZV9pbXBsX3NzZTIuYXNtCi1WUDhfQ1hfU1JDUy0kKEhBVkVfU1NFMikgKz0gZW5jb2Rlci94ODYvc2FkX3NzZTIuYXNtCi1WUDhfQ1hfU1JDUy0kKEhBVkVfU1NFMikgKz0gZW5jb2Rlci94ODYvZndhbHNoX3NzZTIuYXNtCi1WUDhfQ1hfU1JDUy0kKEhBVkVfU1NFMikgKz0gZW5jb2Rlci94ODYvcXVhbnRpemVfc3NlMi5hc20KLVZQOF9DWF9TUkNTLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni9zdWJ0cmFjdF9zc2UyLmFzbQotVlA4X0NYX1NSQ1MtJChIQVZFX1NTRTIpICs9IGVuY29kZXIveDg2L3RlbXBvcmFsX2ZpbHRlcl9hcHBseV9zc2UyLmFzbQotVlA4X0NYX1NSQ1MtJChIQVZFX1NTRTMpICs9IGVuY29kZXIveDg2L3NhZF9zc2UzLmFzbQotVlA4X0NYX1NSQ1MtJChIQVZFX1NTU0UzKSArPSBlbmNvZGVyL3g4Ni9zYWRfc3NzZTMuYXNtCi1WUDhfQ1hfU1JDUy0kKEhBVkVfU1NTRTMpICs9IGVuY29kZXIveDg2L3ZhcmlhbmNlX3Nzc2UzLmMKLVZQOF9DWF9TUkNTLSQoSEFWRV9TU1NFMykgKz0gZW5jb2Rlci94ODYvdmFyaWFuY2VfaW1wbF9zc3NlMy5hc20KLVZQOF9DWF9TUkNTLSQoSEFWRV9TU1NFMykgKz0gZW5jb2Rlci94ODYvcXVhbnRpemVfc3NzZTMuYXNtCi1WUDhfQ1hfU1JDUy0kKEhBVkVfU1NFNF8xKSArPSBlbmNvZGVyL3g4Ni9zYWRfc3NlNC5hc20KLVZQOF9DWF9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gZW5jb2Rlci94ODYvcXVhbnRpemVfbW14LmFzbQotVlA4X0NYX1NSQ1MtJChBUkNIX1g4NikkKEFSQ0hfWDg2XzY0KSArPSBlbmNvZGVyL3g4Ni9lbmNvZGVvcHQuYXNtCi1WUDhfQ1hfU1JDUy0kKEFSQ0hfWDg2XzY0KSArPSBlbmNvZGVyL3g4Ni9zc2ltX29wdC5hc20KLQotaWZlcSAoJChDT05GSUdfUkVBTFRJTUVfT05MWSkseWVzKQotVlA4X0NYX1NSQ1NfUkVNT1ZFLSQoSEFWRV9TU0UyKSArPSBlbmNvZGVyL3g4Ni90ZW1wb3JhbF9maWx0ZXJfYXBwbHlfc3NlMi5hc20KLWVuZGlmCi0KLQotVlA4X0NYX1NSQ1MteWVzIDo9ICQoZmlsdGVyLW91dCAkKFZQOF9DWF9TUkNTX1JFTU9WRS15ZXMpLCQoVlA4X0NYX1NSQ1MteWVzKSkKZGlmZiAtLWdpdCBhL3ZwOC92cDhjeF9hcm0ubWsgYi92cDgvdnA4Y3hfYXJtLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjVkYWRhLi4wMDAwMDAwCi0tLSBhL3ZwOC92cDhjeF9hcm0ubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIwotIyMgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIwotIyMgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSMjICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSMjICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0jIyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotIyMgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotIyMKLQotCi0jVlA4X0NYX1NSQ1MgbGlzdCBpcyBtb2RpZmllZCBhY2NvcmRpbmcgdG8gZGlmZmVyZW50IHBsYXRmb3Jtcy4KLQotI0ZpbGUgbGlzdCBmb3IgYXJtCi0jIGVuY29kZXIKLVZQOF9DWF9TUkNTLSQoQVJDSF9BUk0pICArPSBlbmNvZGVyL2FybS9hcm1fY3N5c3RlbWRlcGVuZGVudC5jCi0KLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGVuY29kZXIvYXJtL3F1YW50aXplX2FybS5jCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9waWNrbHBmX2FybS5jCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS9kY3RfYXJtLmMKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGVuY29kZXIvYXJtL3ZhcmlhbmNlX2FybS5jCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS92YXJpYW5jZV9hcm0uaAotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY1VEUpICs9IGVuY29kZXIvYXJtL2Jvb2xodWZmX2FybS5jCi0KLVZQOF9DWF9TUkNTX1JFTU9WRS0kKEhBVkVfQVJNVjVURSkgICs9IGVuY29kZXIvYm9vbGh1ZmYuYwotCi0jRmlsZSBsaXN0IGZvciBhcm12NXRlCi0jIGVuY29kZXIKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNVRFKSAgKz0gZW5jb2Rlci9hcm0vYXJtdjV0ZS9ib29saHVmZl9hcm12NXRlJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjVURSkgICs9IGVuY29kZXIvYXJtL2FybXY1dGUvdnA4X3BhY2t0b2tlbnNfYXJtdjUkKEFTTSkKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNVRFKSAgKz0gZW5jb2Rlci9hcm0vYXJtdjV0ZS92cDhfcGFja3Rva2Vuc19tYnJvd19hcm12NSQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY1VEUpICArPSBlbmNvZGVyL2FybS9hcm12NXRlL3ZwOF9wYWNrdG9rZW5zX3BhcnRpdGlvbnNfYXJtdjUkKEFTTSkKLQotI0ZpbGUgbGlzdCBmb3IgYXJtdjYKLSMgZW5jb2RlcgotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3N1YnRyYWN0X2FybXY2JChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS9hcm12Ni92cDhfZmFzdF9mZGN0NHg0X2FybXY2JChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS9hcm12Ni92cDhfZmFzdF9xdWFudGl6ZV9iX2FybXY2JChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS9hcm12Ni92cDhfc2FkMTZ4MTZfYXJtdjYkKEFTTSkKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGVuY29kZXIvYXJtL2FybXY2L3ZwOF92YXJpYW5jZTE2eDE2X2FybXY2JChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2VfaGFsZnBpeHZhcjE2eDE2X2hfYXJtdjYkKEFTTSkKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGVuY29kZXIvYXJtL2FybXY2L3ZwOF92YXJpYW5jZV9oYWxmcGl4dmFyMTZ4MTZfdl9hcm12NiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gZW5jb2Rlci9hcm0vYXJtdjYvdnA4X3ZhcmlhbmNlX2hhbGZwaXh2YXIxNngxNl9odl9hcm12NiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gZW5jb2Rlci9hcm0vYXJtdjYvdnA4X21zZTE2eDE2X2FybXY2JChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBlbmNvZGVyL2FybS9hcm12Ni92cDhfdmFyaWFuY2U4eDhfYXJtdjYkKEFTTSkKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGVuY29kZXIvYXJtL2FybXY2L3dhbHNoX3Y2JChBU00pCi0KLSNGaWxlIGxpc3QgZm9yIG5lb24KLSMgZW5jb2RlcgotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZW5jb2Rlci9hcm0vbmVvbi9mYXN0ZmRjdDR4NF9uZW9uJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9uZW9uL2Zhc3RmZGN0OHg0X25lb24kKEFTTSkKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGVuY29kZXIvYXJtL25lb24vZmFzdHF1YW50aXplYl9uZW9uJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9uZW9uL3NhZDhfbmVvbiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZW5jb2Rlci9hcm0vbmVvbi9zYWQxNl9uZW9uJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9uZW9uL3N1YnRyYWN0X25lb24kKEFTTSkKLVZQOF9DWF9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGVuY29kZXIvYXJtL25lb24vdmFyaWFuY2VfbmVvbiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZW5jb2Rlci9hcm0vbmVvbi92cDhfbXNlMTZ4MTZfbmVvbiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZW5jb2Rlci9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTh4OF9uZW9uJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9uZW9uL3ZwOF9zdWJwaXhlbHZhcmlhbmNlMTZ4MTZfbmVvbiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZW5jb2Rlci9hcm0vbmVvbi92cDhfc3VicGl4ZWx2YXJpYW5jZTE2eDE2c19uZW9uJChBU00pCi1WUDhfQ1hfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBlbmNvZGVyL2FybS9uZW9uL3ZwOF9tZW1jcHlfbmVvbiQoQVNNKQotVlA4X0NYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZW5jb2Rlci9hcm0vbmVvbi92cDhfc2hvcnR3YWxzaDR4NF9uZW9uJChBU00pCmRpZmYgLS1naXQgYS92cDgvdnA4ZHgubWsgYi92cDgvdnA4ZHgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDk2NzEuLjAwMDAwMDAKLS0tIGEvdnA4L3ZwOGR4Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMKLSMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0jIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSMjCi0KLQotaW5jbHVkZSAkKFNSQ19QQVRIX0JBUkUpLyQoVlA4X1BSRUZJWCl2cDhfY29tbW9uLm1rCi0KLVZQOF9EWF9FWFBPUlRTICs9IGV4cG9ydHNfZGVjCi0KLVZQOF9EWF9TUkNTLXllcyArPSAkKFZQOF9DT01NT05fU1JDUy15ZXMpCi1WUDhfRFhfU1JDUy1ubyAgKz0gJChWUDhfQ09NTU9OX1NSQ1Mtbm8pCi1WUDhfRFhfU1JDU19SRU1PVkUteWVzICs9ICQoVlA4X0NPTU1PTl9TUkNTX1JFTU9WRS15ZXMpCi1WUDhfRFhfU1JDU19SRU1PVkUtbm8gICs9ICQoVlA4X0NPTU1PTl9TUkNTX1JFTU9WRS1ubykKLQotaWZlcSAoJChBUkNIX0FSTSkseWVzKQotICBpbmNsdWRlICQoU1JDX1BBVEhfQkFSRSkvJChWUDhfUFJFRklYKXZwOGR4X2FybS5tawotZW5kaWYKLQotVlA4X0RYX1NSQ1MteWVzICs9IHZwOF9keF9pZmFjZS5jCi0KLSMgY29tbW9uCi0jZGVmaW5lIEFSTQotI2RlZmluZSBESVNBQkxFX1RIUkVBRAotCi0jSU5DTFVERVMgKz0gYWxnby92cHhfY29tbW9uL3ZweF9tZW0vaW5jbHVkZQotI0lOQ0xVREVTICs9IGNvbW1vbgotI0lOQ0xVREVTICs9IGNvbW1vbgotI0lOQ0xVREVTICs9IGNvbW1vbgotI0lOQ0xVREVTICs9IGNvbW1vbgotI0lOQ0xVREVTICs9IGRlY29kZXIKLQotCi0KLSMgZGVjb2RlcgotI2RlZmluZSBBUk0KLSNkZWZpbmUgRElTQUJMRV9USFJFQUQKLQotI0lOQ0xVREVTICs9IGFsZ28vdnB4X2NvbW1vbi92cHhfbWVtL2luY2x1ZGUKLSNJTkNMVURFUyArPSBjb21tb24KLSNJTkNMVURFUyArPSBjb21tb24KLSNJTkNMVURFUyArPSBjb21tb24KLSNJTkNMVURFUyArPSBjb21tb24KLSNJTkNMVURFUyArPSBkZWNvZGVyCi0KLVZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL2Rib29saHVmZi5jCi1WUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9kZWNvZGVtdi5jCi1WUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9kZWNvZGZyYW1lLmMKLVZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL2RlcXVhbnRpemUuYwotVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGV0b2tlbml6ZS5jCi1WUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9nZW5lcmljL2RzeXN0ZW1kZXBlbmRlbnQuYwotVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGJvb2xodWZmLmgKLVZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL2RlY29kZW12LmgKLVZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL2RlY29kZXJ0aHJlYWRpbmcuaAotVlA4X0RYX1NSQ1MteWVzICs9IGRlY29kZXIvZGVxdWFudGl6ZS5oCi1WUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9kZXRva2VuaXplLmgKLVZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL29ueXhkX2ludC5oCi1WUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci90cmVlcmVhZGVyLmgKLVZQOF9EWF9TUkNTLXllcyArPSBkZWNvZGVyL29ueXhkX2lmLmMKLVZQOF9EWF9TUkNTLSQoQ09ORklHX01VTFRJVEhSRUFEKSArPSBkZWNvZGVyL3RocmVhZGluZy5jCi1WUDhfRFhfU1JDUy15ZXMgKz0gZGVjb2Rlci9pZGN0X2Jsay5jCi1WUDhfRFhfU1JDUy0kKENPTkZJR19NVUxUSVRIUkVBRCkgKz0gZGVjb2Rlci9yZWNvbmludHJhX210LmgKLVZQOF9EWF9TUkNTLSQoQ09ORklHX01VTFRJVEhSRUFEKSArPSBkZWNvZGVyL3JlY29uaW50cmFfbXQuYwotCi1WUDhfRFhfU1JDUy15ZXMgOj0gJChmaWx0ZXItb3V0ICQoVlA4X0RYX1NSQ1NfUkVNT1ZFLXllcyksJChWUDhfRFhfU1JDUy15ZXMpKQotCi1WUDhfRFhfU1JDUy0kKEFSQ0hfWDg2KSQoQVJDSF9YODZfNjQpICs9IGRlY29kZXIveDg2L2RlcXVhbnRpemVfeDg2LmgKLVZQOF9EWF9TUkNTLSQoQVJDSF9YODYpJChBUkNIX1g4Nl82NCkgKz0gZGVjb2Rlci94ODYveDg2X2RzeXN0ZW1kZXBlbmRlbnQuYwotVlA4X0RYX1NSQ1MtJChIQVZFX01NWCkgKz0gZGVjb2Rlci94ODYvZGVxdWFudGl6ZV9tbXguYXNtCi1WUDhfRFhfU1JDUy0kKEhBVkVfTU1YKSArPSBkZWNvZGVyL3g4Ni9pZGN0X2Jsa19tbXguYwotVlA4X0RYX1NSQ1MtJChIQVZFX1NTRTIpICs9IGRlY29kZXIveDg2L2lkY3RfYmxrX3NzZTIuYwpkaWZmIC0tZ2l0IGEvdnA4L3ZwOGR4X2FybS5tayBiL3ZwOC92cDhkeF9hcm0ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDg0YzUuLjAwMDAwMDAKLS0tIGEvdnA4L3ZwOGR4X2FybS5taworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjCi0jIyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMjCi0jIyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotIyMgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotIyMgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSMjICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0jIyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0jIwotCi0KLSNWUDhfRFhfU1JDUyBsaXN0IGlzIG1vZGlmaWVkIGFjY29yZGluZyB0byBkaWZmZXJlbnQgcGxhdGZvcm1zLgotCi1WUDhfRFhfU1JDUy0kKEFSQ0hfQVJNKSAgKz0gZGVjb2Rlci9hcm0vYXJtX2RzeXN0ZW1kZXBlbmRlbnQuYwotVlA4X0NYX1NSQ1MtJChBUkNIX0FSTSkgICs9IGRlY29kZXIvYXNtX2RlY19vZmZzZXRzLmMKLQotVlA4X0RYX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gZGVjb2Rlci9hcm0vZGVxdWFudGl6ZV9hcm0uYwotCi0jRmlsZSBsaXN0IGZvciBhcm12NgotVlA4X0RYX1NSQ1MtJChIQVZFX0FSTVY2KSAgKz0gZGVjb2Rlci9hcm0vYXJtdjYvZGVxdWFudF9kY19pZGN0X3Y2JChBU00pCi1WUDhfRFhfU1JDUy0kKEhBVkVfQVJNVjYpICArPSBkZWNvZGVyL2FybS9hcm12Ni9kZXF1YW50X2lkY3RfdjYkKEFTTSkKLVZQOF9EWF9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGRlY29kZXIvYXJtL2FybXY2L2RlcXVhbnRpemVfdjYkKEFTTSkKLVZQOF9EWF9TUkNTLSQoSEFWRV9BUk1WNikgICs9IGRlY29kZXIvYXJtL2FybXY2L2lkY3RfYmxrX3Y2LmMKLQotI0ZpbGUgbGlzdCBmb3IgbmVvbgotVlA4X0RYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfZGNfZnVsbF8yeF9uZW9uJChBU00pCi1WUDhfRFhfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBkZWNvZGVyL2FybS9uZW9uL2lkY3RfZGVxdWFudF9kY18wXzJ4X25lb24kKEFTTSkKLVZQOF9EWF9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGRlY29kZXIvYXJtL25lb24vZGVxdWFudF9pZGN0X25lb24kKEFTTSkKLVZQOF9EWF9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGRlY29kZXIvYXJtL25lb24vaWRjdF9kZXF1YW50X2Z1bGxfMnhfbmVvbiQoQVNNKQotVlA4X0RYX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gZGVjb2Rlci9hcm0vbmVvbi9pZGN0X2RlcXVhbnRfMF8yeF9uZW9uJChBU00pCi1WUDhfRFhfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBkZWNvZGVyL2FybS9uZW9uL2RlcXVhbnRpemViX25lb24kKEFTTSkKLVZQOF9EWF9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGRlY29kZXIvYXJtL25lb24vaWRjdF9ibGtfbmVvbi5jCmRpZmYgLS1naXQgYS92cDhfYXBpMV9taWdyYXRpb24udHh0IGIvdnA4X2FwaTFfbWlncmF0aW9uLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNzk4MS4uMDAwMDAwMAotLS0gYS92cDhfYXBpMV9taWdyYXRpb24udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLVZlcnNpb24gMi54IG9mIHRoaXMgbGlicmFyeSBoYXMgZGVwcmVjYXRlZCBvciByZW1vdmVkIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdG8KLXRoZSBWUDggY29kZWMuIFdoZXJlIHBvc3NpYmxlLCB0aGUgb2xkIGludGVyZmFjZXMgaGF2ZSBiZWVuIGxlZnQgaW4gcGxhY2UgaW4gYQotZGVwcmVjYXRlZCBzdGF0ZSwgYW5kIHdpbGwgZ2VuZXJhdGUgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiB0aGV5IGFyZSByZWZlcmVuY2VkLgotQWxsIHVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVwZGF0ZSB0aGVpciBjb2RlIHRvIHRoZSBuZXcgaW50ZXJmYWNlcyBhcyBzb29uIGFzCi1wb3NzaWJsZS4gVG8gYXNzaXN0IGluIHRoaXMgZWZmb3J0LCB0aGUgYFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVGAgc3ltYm9sIGNhbgotYmUgI2RlZmluZWQgdG8gMSBwcmlvciB0byBpbmNsdWRpbmcgdnB4IGhlYWRlcnMuIFRoaXMgd2lsbCBkaXNhYmxlIHRoZQotYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd29ya2Fyb3VuZHMgYW5kIGVuc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgb25seSB0aGUKLWxhdGVzdCBBUEkuCi0KLVRoZSAqVFdPLVBBU1MgU1RBVElTVElDUyogc2VjdGlvbnMgZGV0YWlsIHRoZSBvbmUgc2VjdGlvbiBvZiBjb2RlIHdoaWNoIGlzIG5vdAotYmFja3dhcmRzIGNvbXBhdGFibGUgYW5kIHdpbGwgcmVxdWlyZSBjb2RlIGNoYW5nZXMuCi0KLQotSEVBREVSIEZJTEVTCi09PT09PT09PT09PT0KLVRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpbGVzIHdlcmUgcmVuYW1lZDoKLQotICAgIHZwOC5oICAtPiB2cDhkeC5oCi0gICAgdnA4ZS5oIC0+IHZwOGN4LmgKLQotCi1JTlRFUkZBQ0UgU1lNQk9MUwotPT09PT09PT09PT09PT09PT0KLVRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIHN5bWJvbHMgd2VyZSByZW5hbWVkOgotCi0gICAgdnB4X2NvZGVjX3ZwOF9hbGdvIC0+IHZweF9jb2RlY192cDhfZHhfYWxnbwotICAgIHZweF9lbmNfdnA4X2FsZ28gICAtPiB2cHhfY29kZWNfdnA4X2N4X2FsZ28KLQotCi1UV08tUEFTUyBTVEFUSVNUSUNTCi09PT09PT09PT09PT09PT09PT09Ci1Ud28tcGFzcyBzdGF0aXN0aWNzIGFyZSBoYW5kbGVkIHNpZ25pZmljYW50bHkgZGlmZmVyZW50bHkuIFRoZSB2ZXJzaW9uIDEgQVBJCi1zdG9yZWQgc3RhdGlzdGljcyBpbiBhIGZpbGUsIGFuZCB0aGUgYXBwbGljYXRpb24gcGFzc2VkIHRoZSBuYW1lIG9mIHRoYXQgZmlsZQotaW4gdGhlIGB2cHhfY29kZWNfZW5jX2NmZ2Agc3RydWN0dXJlLiBJbiB0aGlzIHZlcnNpb24sIHN0YXRpc3RpY3MgYXJlIHJldHVybmVkCi10aG91Z2ggdGhlIGFwcGxpY2F0aW9uIHRob3VnaCB0aGUgYHZweF9jb2RlY19nZXRfY3hfZGF0YSgpYCBpbnRlcmZhY2UuIFRoZQotYXBwbGljYXRpb24gbXVzdCBjb25jYXRlbmF0ZSB0aGVzZSBwYWNrZXRzIGludG8gYSBjb250aWd1b3VzIGJ1ZmZlciBhbmQgdGhlbgotcGFzcyB0aGF0IGJ1ZmZlciB0byB0aGUgZW5jb2RlciB0aHJvdWdoIHRoZSBgdnB4X2NvZGVjX2VuY19jZmdgIHN0cnVjdHVyZSBvbgotdGhlIHNlY29uZCBwYXNzIGluaXRpYWxpemF0aW9uLiBUaGUgYXBwbGljYXRpb24gbWF5IGNob29zZSB0byBrZWVwIHRoZXNlIHBhY2tldHMKLWluIG1lbW9yeSBvciB3cml0ZSB0aGVtIHRvIGRpc2suIFN0YXRpc3RpY3MgcGFja2V0cyBhcmUgYXBwcm94aW1hdGVseSAxMTIgYnl0ZXMKLXBlciBmcmFtZS4gU2VlIHRoZSBleGFtcGxlIGNvZGUgZm9yIG1vcmUgZGV0YWlsZWQgZXhhbXBsZXMuCi0KLQotRU5DT0RFUiBDT05UUk9MUwotPT09PT09PT09PT09PT09PQotCi1SZW5hbWVzCi0tLS0tLS0tCi1UaGUgZm9sbG93aW5nIGNvbnRyb2xzIGFyZSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIGVuY29kZXIgYW5kIHRoZSBkZWNvZGVyLCBidXQKLXRoZSBlbmNvZGVyIHVubmVjZXNzYXJpbHkgaW50cm9kdWNlZCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHRoZW0uIFRoZXNlCi1pZGVudGlmaWVycyB3ZXJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgdGhlIG9uZXMgdXNlZCBieSB0aGUgZGVjb2RlcjoKLQotICAgIFZQOEVfU0VUX1JFRkVSRU5DRSAgLT4gVlA4X1NFVF9SRUZFUkVOQ0UKLSAgICBWUDhFX0NPUFlfUkVGRVJFTkNFIC0+IFZQOF9DT1BZX1JFRkVSRU5DRQotICAgIFZQOEVfU0VUX1BSRVZJRVdQUCAgLT4gVlA4X1NFVF9QT1NUUFJPQwotCi0KLVZQOEVfU0VUX0ZSQU1FVFlQRQotLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGNvbnRyb2wgd2FzIHJlbW92ZWQgaW4gZmF2b3Igb2YgdGhlIGBmbGFnc2AgcGFyYW1ldGVyIHRvCi1gdnB4X2NvZGVjX2VuY29kZSgpYC4gRXhpc3RpbmcgY29kZSBzdWNoIGFzOgotCi1+fn4KLSAgICB2cHhfY29kZWNfY29udHJvbCgmZW5jb2RlciwgVlA4RV9TRVRfRlJBTUVUWVBFLCBLRVlfRlJBTUUpOwotICAgIC4uLgotICAgIHZweF9jb2RlY19lbmNvZGUoJmVuY29kZXIsIGltZywgcHRzLCAxLCAwLCAwKTsKLX5+fgotCi1iZWNvbWVzOgotCi1+fn4KLSAgICB2cHhfY29kZWNfZW5jb2RlKCZlbmNvZGVyLCBpbWcsIHB0cywgMSwgVlBYX0VGTEFHX0ZPUkNFX0tGLAotICAgIFZQWF9ETF9SRUFMVElNRSk7Ci1+fn4KLQotCi0KLVZQOEVfU0VUX0ZMVVNIRkxBRwotLS0tLS0tLS0tLS0tLS0tLS0tCi1GbHVzaCBpcyBoYW5kbGVkIGJ5IHBhc3NpbmcgYE5VTExgIHRvIHRoZSBgaW1nYCBwYXJhbWV0ZXIgb2YKLWB2cHhfY29kZWNfZW5jb2RlKClgLiBZb3UgbXVzdCBkbyB0aGlzIGF0IGxlYXN0IG9uY2UsIHJlZ2FyZGxlc3Mgb2YgeW91ciBlbmNvZGVyCi1jb25maWd1cmF0aW9uLiBpLmUuIGl0J3Mgbm90IHNwZWNpZmljIHRvIGdfbGFnX2luX2ZyYW1lcy4gVGhpcyBjb250cm9sIHdhcwotcmVtb3ZlZC4KLQotfn5+Ci0gICAgd2hpbGUoLi4uKSB7Ci0gICAgICAgLi4uCi0gICAgICAgdnB4X2NvZGVjX2VuY29kZSgmZW5jb2RlciwgaW1nLCBwdHMsIDEsIDAsIDApOwotICAgICAgIHdoaWxlKCAocGt0ID0gdnB4X2NvZGVjX2dldF9jeF9kYXRhKCZlbmNvZGVyLCAmaXRlcikpICkgewotICAgICAgICAgIC4uLgotICAgICAgIH0KLSAgICB9Ci0gICAgdnB4X2NvZGVjX2NvbnRyb2woJmVuY29kZXIsIFZQOEVfU0VUX0ZMVVNIRkxBRywgMSk7Ci0gICAgd2hpbGUoIChwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJmVuY29kZXIsICZpdGVyKSkgKSB7Ci0gICAgICAgLi4uCi0gICAgfQotICAgIHZweF9jb2RlY19lbmNvZGUoJmVuY29kZXIsIGltZywgcHRzLCAxLCAwLCAwKTsKLX5+fgotCi1iZWNvbWVzCi0KLX5+fgotICAgIHdoaWxlKG5ld19pbWFnZSAmJiAuLi4pIHsKLSAgICAgICAuLi4KLSAgICAgICB2cHhfY29kZWNfZW5jb2RlKCZlbmNvZGVyLCBuZXdfaW1hZ2U/aW1nOk5VTEwsIHB0cywgMSwgMCwgMCk7Ci0gICAgICAgd2hpbGUoIChwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJmVuY29kZXIsICZpdGVyKSkgKSB7Ci0gICAgICAgICAgLi4uCi0gICAgICAgfQotICAgIH0KLX5+fgotCi0KLQotVlA4RV9TRVRfRU5DT0RJTkdfTU9ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhpcyBjb250cm9sIHdhcyByZW1vdmVkIGluIGZhdm9yIG9mIHRoZSBgZGVhZGxpbmVgIHBhcmFtZXRlciB0bwotYHZweF9jb2RlY19lbmNvZGUoKWAuIFRoZXJlIGFyZSB0aHJlZSBtYWNyb3MgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlCi1lcXVpdmFsZW50IGJlaGF2aW9yOiBWUFhfRExfUkVBTFRJTUUsIFZQWF9ETF9HT09EX1FVQUxJVFksCi1WUFhfRExfQkVTVF9RVUFMSVRZLiBFeGlzdGluZyBjb2RlIHN1Y2ggYXM6Ci0KLX5+fgotICAgIHZweF9jb2RlY19jb250cm9sKCZlbmNvZGVyLCBWUDhFX1NFVF9FTkNPRElOR19NT0RFLCBWUDhfUkVBTF9USU1FX0VOQ09ESU5HKTsKLSAgICAuLi4KLSAgICB2cHhfY29kZWNfZW5jb2RlKCZlbmNvZGVyLCBpbWcsIHB0cywgMSwgMCwgMCk7Ci1+fn4KLQotYmVjb21lczoKLQotfn5+Ci0gICAgdnB4X2NvZGVjX2VuY29kZSgmZW5jb2RlciwgaW1nLCBwdHMsIDEsIDAsIFZQWF9ETF9SRUFMVElNRSk7Ci1+fn4KLQotCi1WUDhFX1VQRF9FTlRST1BZCi0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoaXMgY29udHJvbCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYGZsYWdzYCBwYXJhbWV0ZXIgdG8KLWB2cHhfY29kZWNfZW5jb2RlKClgLiBFeGlzdGluZyBjb2RlIHN1Y2ggYXM6Ci0KLX5+fgotICAgIHZweF9jb2RlY19jb250cm9sKCZlbmNvZGVyLCBWUDhFX1VQRF9FTlRST1BZLCAwKTsKLX5+fgotCi1iZWNvbWVzOgotCi1+fn4KLSAgICB2cHhfY29kZWNfZW5jb2RlKCZlbmNvZGVyLCBpbWcsIHB0cywgMSwgVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZLAotICAgICAgICAgICAgICAgICAgICAgVlBYX0RMX1JFQUxUSU1FKTsKLX5+fgotCi0KLVZQOEVfVVBEX1JFRkVSRU5DRQotLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGNvbnRyb2wgd2FzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIGBmbGFnc2AgcGFyYW1ldGVyIHRvCi1gdnB4X2NvZGVjX2VuY29kZSgpYC4gQSBzZXQgYml0IG9uIHRoZSBWUDhFX1VQRF9SRUZFUkVOQ0UgYml0ZmllbGQgaXMKLWFuYWxvZ291cyB0byBzZXR0aW5nIHRoZSBWUDhfRUZMQUdfRk9SQ0VfKiBmbGFnLiBBIGNsZWFyZWQgYml0IGlzIGFuYWxvZ291cwotdG8gc2V0dGluZyB0aGUgVlA4X0VGTEFHX05PX1VQRF8qIGZsYWcuIElmIG5laXRoZXIgdGhlIEZPUkNFIG9yIE5PX1VQRCBiaXQKLWlzIHNldCwgdGhlIGVuY29kZXIgd2lsbCBtYWtlIGl0cyBkZWNpc2lvbiBhdXRvbWF0aWNhbGx5LCBhcyB1c3VhbC4gU2V0dGluZwotYm90aCBiaXRzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIGJlaW5nIHJldHVybmVkLiBFeGlzdGluZyBjb2RlIHN1Y2ggYXM6Ci0KLX5+fgotICAgIHZweF9jb2RlY19jb250cm9sKCZlbmNvZGVyLCBWUDhFX1VQRF9SRUZFUkVOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgVlA4X0xBU1RfRlJBTUUgfCBWUDhfR09MRF9GUkFNRSk7Ci0gICAgdnB4X2NvZGVjX2NvbnRyb2woJmVuY29kZXIsIFZQOEVfVVBEX1JFRkVSRU5DRSwgMCk7Ci0gICAgLi4uCi0gICAgdnB4X2NvZGVjX2VuY29kZSgmZW5jb2RlciwgaW1nLCBwdHMsIDEsIDAsIFZQWF9ETF9SRUFMVElNRSk7Ci1+fn4KLQotYmVjb21lczoKLQotfn5+Ci0gICAgdnB4X2NvZGVjX2VuY29kZSgmZW5jb2RlciwgaW1nLCBwdHMsIDEsIFZQOF9FRkxBR19GT1JDRV9HRiwKLSAgICAgICAgICAgICAgICAgICAgIFZQWF9ETF9SRUFMVElNRSk7Ci0gICAgdnB4X2NvZGVjX2VuY29kZSgmZW5jb2RlciwgaW1nLCBwdHMsIDEsIFZQOF9FRkxBR19OT19VUERfTEFTVAotICAgICAgICAgICAgICAgICAgICAgfCBWUDhfRUZMQUdfTk9fVVBEX0dGIHwgVlA4X0VGTEFHX05PX1VQRF9BUkYsCi0gICAgICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOwotfn5+Ci0KLQotVlA4RV9VU0VfUkVGRVJFTkNFCi0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoaXMgY29udHJvbCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYGZsYWdzYCBwYXJhbWV0ZXIgdG8KLWB2cHhfY29kZWNfZW5jb2RlKClgLiBBIGNsZWFyZWQgYml0IG9uIHRoZSBWUDhFX1VTRV9SRUZFUkVOQ0UgYml0ZmllbGQgaXMKLWFuYWxvZ291cyB0byBzZXR0aW5nIHRoZSBWUDhfRUZMQUdfTk9fUkVGKiBmbGFnLiBBIHNldCBiaXQgaW5kaWNhdGVzIHRoYXQKLXRoZSBlbmNvZGVyIHdpbGwgbWFrZSBpdHMgZGVjaXNpb24gYXV0b21hdGljYWxseSwgYXMgdXN1YWwuCi1FeGlzdGluZyBjb2RlIHN1Y2ggYXM6Ci0KLX5+fgotICAgIHZweF9jb2RlY19jb250cm9sKCZlbmNvZGVyLCBWUDhFX1VTRV9SRUZFUkVOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgVlA4X0FMVFJfRlJBTUUgfCBWUDhfR09MRF9GUkFNRSk7Ci0gICAgLi4uCi0gICAgdnB4X2NvZGVjX2VuY29kZSgmZW5jb2RlciwgaW1nLCBwdHMsIDEsIDAsIFZQWF9ETF9SRUFMVElNRSk7Ci1+fn4KLQotYmVjb21lcwotCi1+fn4KLSAgICB2cHhfY29kZWNfZW5jb2RlKCZlbmNvZGVyLCBpbWcsIHB0cywgMSwgVlA4X0VGTEFHX05PX1JFRl9MQVNULAotICAgICAgICAgICAgICAgICAgICAgVlBYX0RMX1JFQUxUSU1FKTsKLX5+fgpkaWZmIC0tZ2l0IGEvdnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oIGIvdnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmMTkyLi4wMDAwMDAwCi0tLSBhL3ZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyohXGZpbGUKLSAqIFxicmllZiBEZXNjcmliZXMgdGhlIGRlY29kZXIgYWxnb3JpdGhtIGludGVyZmFjZSBmb3IgYWxnb3JpdGhtCi0gKiAgICAgICAgaW1wbGVtZW50YXRpb25zLgotICoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwcml2YXRlIHN0cnVjdHVyZXMgYW5kIGRhdGEgdHlwZXMgdGhhdCBhcmUgb25seQotICogcmVsZXZhbnQgdG8gaW1wbGVtZW50aW5nIGFuIGFsZ29yaXRobSwgYXMgb3Bwb3NlZCB0byB1c2luZyBpdC4KLSAqCi0gKiBUbyBjcmVhdGUgYSBkZWNvZGVyIGFsZ29yaXRobSBjbGFzcywgYW4gaW50ZXJmYWNlIHN0cnVjdHVyZSBpcyBwdXQKLSAqIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2U6Ci0gKiAgICAgPHByZT4KLSAqICAgICBteV9jb2RlYy5jOgotICogICAgICAgdnB4X2NvZGVjX2lmYWNlX3QgbXlfY29kZWMgPSB7Ci0gKiAgICAgICAgICAgIk15IENvZGVjIHYxLjAiLAotICogICAgICAgICAgIFZQWF9DT0RFQ19BTEdfQUJJX1ZFUlNJT04sCi0gKiAgICAgICAgICAgLi4uCi0gKiAgICAgICB9OwotICogICAgIDwvcHJlPgotICoKLSAqIEFuIGFwcGxpY2F0aW9uIGluc3RhbnRpYXRlcyBhIHNwZWNpZmljIGRlY29kZXIgaW5zdGFuY2UgYnkgdXNpbmcKLSAqIHZweF9jb2RlY19pbml0KCkgYW5kIGEgcG9pbnRlciB0byB0aGUgYWxnb3JpdGhtJ3MgaW50ZXJmYWNlIHN0cnVjdHVyZToKLSAqICAgICA8cHJlPgotICogICAgIG15X2FwcC5jOgotICogICAgICAgZXh0ZXJuIHZweF9jb2RlY19pZmFjZV90IG15X2NvZGVjOwotICogICAgICAgewotICogICAgICAgICAgIHZweF9jb2RlY19jdHhfdCBhbGdvOwotICogICAgICAgICAgIHJlcyA9IHZweF9jb2RlY19pbml0KCZhbGdvLCAmbXlfY29kZWMpOwotICogICAgICAgfQotICogICAgIDwvcHJlPgotICoKLSAqIE9uY2UgaW5pdGlhbGl6ZWQsIHRoZSBpbnN0YW5jZSBpcyBtYW5nZWQgdXNpbmcgb3RoZXIgZnVuY3Rpb25zIGZyb20KLSAqIHRoZSB2cHhfY29kZWNfKiBmYW1pbHkuCi0gKi8KLSNpZm5kZWYgVlBYX0NPREVDX0lOVEVSTkFMX0gKLSNkZWZpbmUgVlBYX0NPREVDX0lOVEVSTkFMX0gKLSNpbmNsdWRlICIuLi92cHhfZGVjb2Rlci5oIgotI2luY2x1ZGUgIi4uL3ZweF9lbmNvZGVyLmgiCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLQotLyohXGJyaWVmIEN1cnJlbnQgQUJJIHZlcnNpb24gbnVtYmVyCi0gKgotICogXGludGVybmFsCi0gKiBJZiB0aGlzIGZpbGUgaXMgYWx0ZXJlZCBpbiBhbnkgd2F5IHRoYXQgY2hhbmdlcyB0aGUgQUJJLCB0aGlzIHZhbHVlCi0gKiBtdXN0IGJlIGJ1bXBlZC4gIEV4YW1wbGVzIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIGNoYW5naW5nCi0gKiB0eXBlcywgcmVtb3Zpbmcgb3IgcmVhc3NpZ25pbmcgZW51bXMsIGFkZGluZy9yZW1vdmluZy9yZWFycmFuZ2luZwotICogZmllbGRzIHRvIHN0cnVjdHVyZXMKLSAqLwotI2RlZmluZSBWUFhfQ09ERUNfSU5URVJOQUxfQUJJX1ZFUlNJT04gKDMpIC8qKjxcaGlkZWluaXRpYWxpemVyKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX2FsZ19wcml2ICB2cHhfY29kZWNfYWxnX3ByaXZfdDsKLQotLyohXGJyaWVmIGluaXQgZnVuY3Rpb24gcG9pbnRlciBwcm90b3R5cGUKLSAqCi0gKiBQZXJmb3JtcyBhbGdvcml0aG0tc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRlY29kZXIgY29udGV4dC4gVGhpcwotICogZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIHZweF9jb2RlY19pbml0KCkgd3JhcHBlciBmdW5jdGlvbiwgc28KLSAqIHBsdWdpbnMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIG1heSB0cnVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycyB0byBiZQotICogcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gKgotICogXHBhcmFtW2luXSBjdHggICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAqICAgICBUaGUgaW5wdXQgc3RyZWFtIHdhcyByZWNvZ25pemVkIGFuZCBkZWNvZGVyIGluaXRpYWxpemVkLgotICogXHJldHZhbCAjVlBYX0NPREVDX01FTV9FUlJPUgotICogICAgIE1lbW9yeSBvcGVyYXRpb24gZmFpbGVkLgotICovCi10eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19pbml0X2ZuX3QpKHZweF9jb2RlY19jdHhfdCAqY3R4KTsKLQotLyohXGJyaWVmIGRlc3Ryb3kgZnVuY3Rpb24gcG9pbnRlciBwcm90b3R5cGUKLSAqCi0gKiBQZXJmb3JtcyBhbGdvcml0aG0tc3BlY2lmaWMgZGVzdHJ1Y3Rpb24gb2YgdGhlIGRlY29kZXIgY29udGV4dC4gVGhpcwotICogZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIHZweF9jb2RlY19kZXN0cm95KCkgd3JhcHBlciBmdW5jdGlvbiwKLSAqIHNvIHBsdWdpbnMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIG1heSB0cnVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycwotICogdG8gYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gKgotICogXHBhcmFtW2luXSBjdHggICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAqICAgICBUaGUgaW5wdXQgc3RyZWFtIHdhcyByZWNvZ25pemVkIGFuZCBkZWNvZGVyIGluaXRpYWxpemVkLgotICogXHJldHZhbCAjVlBYX0NPREVDX01FTV9FUlJPUgotICogICAgIE1lbW9yeSBvcGVyYXRpb24gZmFpbGVkLgotICovCi10eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19kZXN0cm95X2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgpOwotCi0vKiFcYnJpZWYgcGFyc2Ugc3RyZWFtIGluZm8gZnVuY3Rpb24gcG9pbnRlciBwcm90b3R5cGUKLSAqCi0gKiBQZXJmb3JtcyBoaWdoIGxldmVsIHBhcnNpbmcgb2YgdGhlIGJpdHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkKLSAqIHRoZSBnZW5lcmljIHZweF9jb2RlY19wYXJzZV9zdHJlYW0oKSB3cmFwcGVyIGZ1bmN0aW9uLCBzbyBwbHVnaW5zIGltcGxlbWVudGluZwotICogdGhpcyBpbnRlcmZhY2UgbWF5IHRydXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHRvIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLgotICoKLSAqIFxwYXJhbVtpbl0gICAgICBkYXRhICAgIFBvaW50ZXIgdG8gYSBibG9jayBvZiBkYXRhIHRvIHBhcnNlCi0gKiBccGFyYW1baW5dICAgICAgZGF0YV9zeiBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlcgotICogXHBhcmFtW2luLG91dF0gIHNpICAgICAgUG9pbnRlciB0byBzdHJlYW0gaW5mbyB0byB1cGRhdGUuIFRoZSBzaXplIG1lbWJlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgXHJlZiBNVVNUIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLCBidXQgXHJlZiBNQVkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZCBieSB0aGUgYWxnb3JpdGhtLiBUaGlzIHBhcmFtZXRlciBccmVmIE1BWQotICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgTlVMTC4KLSAqCi0gKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAqICAgICBCaXRzdHJlYW0gaXMgcGFyc2FibGUgYW5kIHN0cmVhbSBpbmZvcm1hdGlvbiB1cGRhdGVkCi0gKi8KLXR5cGVkZWYgdnB4X2NvZGVjX2Vycl90ICgqdnB4X2NvZGVjX3BlZWtfc2lfZm5fdCkoY29uc3QgdWludDhfdCAgICAgICAgICpkYXRhLAotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGRhdGFfc3osCi0gICAgICAgIHZweF9jb2RlY19zdHJlYW1faW5mb190ICpzaSk7Ci0KLS8qIVxicmllZiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RyZWFtLgotICoKLSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmVhbSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBkdXJpbmcgZGVjb2RpbmcuCi0gKgotICogXHBhcmFtW2luXSAgICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICogXHBhcmFtW2luLG91dF0gIHNpICAgICAgUG9pbnRlciB0byBzdHJlYW0gaW5mbyB0byB1cGRhdGUuIFRoZSBzaXplIG1lbWJlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgXHJlZiBNVVNUIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLCBidXQgXHJlZiBNQVkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZCBieSB0aGUgYWxnb3JpdGhtLiBUaGlzIHBhcmFtZXRlciBccmVmIE1BWQotICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgTlVMTC4KLSAqCi0gKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAqICAgICBCaXRzdHJlYW0gaXMgcGFyc2FibGUgYW5kIHN0cmVhbSBpbmZvcm1hdGlvbiB1cGRhdGVkCi0gKi8KLXR5cGVkZWYgdnB4X2NvZGVjX2Vycl90ICgqdnB4X2NvZGVjX2dldF9zaV9mbl90KSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgICAqY3R4LAotICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpOwotCi0vKiFcYnJpZWYgY29udHJvbCBmdW5jdGlvbiBwb2ludGVyIHByb3RvdHlwZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBleGNoYW5nZSBhbGdvcml0aG0gc3BlY2lmaWMgZGF0YSB3aXRoIHRoZSBkZWNvZGVyCi0gKiBpbnN0YW5jZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgZmVhdHVyZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyCi0gKiBhbGdvcml0aG0uCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgdnB4X2NvZGVjX2NvbnRyb2woKSB3cmFwcGVyCi0gKiBmdW5jdGlvbiwgc28gcGx1Z2lucyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgbWF5IHRydXN0IHRoZSBpbnB1dAotICogcGFyYW1ldGVycyB0byBiZSBwcm9wZXJseSBpbml0aWFsaXplZC4gSG93ZXZlciwgIHRoaXMgaW50ZXJmYWNlIGRvZXMgbm90Ci0gKiBwcm92aWRlIHR5cGUgc2FmZXR5IGZvciB0aGUgZXhjaGFuZ2VkIGRhdGEgb3IgYXNzaWduIG1lYW5pbmdzIHRvIHRoZQotICogY29udHJvbCBjb2Rlcy4gVGhvc2UgZGV0YWlscyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBhbGdvcml0aG0ncwotICogaGVhZGVyIGZpbGUuIEluIHBhcnRpY3VsYXIsIHRoZSBjdHJsX2lkIHBhcmFtZXRlciBpcyBndWFyYW50ZWVkIHRvIGV4aXN0Ci0gKiBpbiB0aGUgYWxnb3JpdGhtJ3MgY29udHJvbCBtYXBwaW5nIHRhYmxlLCBhbmQgdGhlIGRhdGEgcGFyYW1ldGVyIG1heSBiZSBOVUxMLgotICoKLSAqCi0gKiBccGFyYW1baW5dICAgICBjdHggICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKLSAqIFxwYXJhbVtpbl0gICAgIGN0cmxfaWQgICAgICAgICAgQWxnb3JpdGhtIHNwZWNpZmljIGNvbnRyb2wgaWRlbnRpZmllcgotICogXHBhcmFtW2luLG91dF0gZGF0YSAgICAgICAgICAgICBEYXRhIHRvIGV4Y2hhbmdlIHdpdGggYWxnb3JpdGhtIGluc3RhbmNlLgotICoKLSAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19PSwotICogICAgIFRoZSBpbnRlcm5hbCBzdGF0ZSBkYXRhIHdhcyBkZXNlcmlhbGl6ZWQuCi0gKi8KLXR5cGVkZWYgdnB4X2NvZGVjX2Vycl90ICgqdnB4X2NvZGVjX2NvbnRyb2xfZm5fdCkodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIGN0cmxfaWQsCi0gICAgICAgIHZhX2xpc3QgICAgICAgICAgICAgIGFwKTsKLQotLyohXGJyaWVmIGNvbnRyb2wgZnVuY3Rpb24gcG9pbnRlciBtYXBwaW5nCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gY29udHJvbCBpZGVudGlmaWVycyBhbmQKLSAqIGltcGxlbWVudGluZyBmdW5jdGlvbnMuIEVhY2ggYWxnb3JpdGhtIHByb3ZpZGVzIGEgbGlzdCBvZiB0aGVzZQotICogbWFwcGluZ3MuIFRoaXMgbGlzdCBpcyBzZWFyY2hlZCBieSB0aGUgdnB4X2NvZGVjX2NvbnRyb2woKSB3cmFwcGVyCi0gKiBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZnVuY3Rpb24gdG8gaW52b2tlLiBUaGUgc3BlY2lhbAotICogdmFsdWUgezAsIE5VTEx9IGlzIHVzZWQgdG8gaW5kaWNhdGUgZW5kLW9mLWxpc3QsIGFuZCBtdXN0IGJlCi0gKiBwcmVzZW50LiBUaGUgc3BlY2lhbCB2YWx1ZSB7MCwgPG5vbi1udWxsPn0gY2FuIGJlIHVzZWQgYXMgYSBjYXRjaC1hbGwKLSAqIG1hcHBpbmcuIFRoaXMgaW1wbGllcyB0aGF0IGN0cmxfaWQgdmFsdWVzIGNob3NlbiBieSB0aGUgYWxnb3JpdGhtCi0gKiBccmVmIE1VU1QgYmUgbm9uLXplcm8uCi0gKi8KLXR5cGVkZWYgY29uc3Qgc3RydWN0Ci17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBjdHJsX2lkOwotICAgIHZweF9jb2RlY19jb250cm9sX2ZuX3QgICBmbjsKLX0gdnB4X2NvZGVjX2N0cmxfZm5fbWFwX3Q7Ci0KLS8qIVxicmllZiBkZWNvZGUgZGF0YSBmdW5jdGlvbiBwb2ludGVyIHByb3RvdHlwZQotICoKLSAqIFByb2Nlc3NlcyBhIGJ1ZmZlciBvZiBjb2RlZCBkYXRhLiBJZiB0aGUgcHJvY2Vzc2luZyByZXN1bHRzIGluIGEgbmV3Ci0gKiBkZWNvZGVkIGZyYW1lIGJlY29taW5nIGF2YWlsYWJsZSwgI1ZQWF9DT0RFQ19DQl9QVVRfU0xJQ0UgYW5kCi0gKiAjVlBYX0NPREVDX0NCX1BVVF9GUkFNRSBldmVudHMgYXJlIGdlbmVyYXRlZCBhcyBhcHByb3ByaWF0ZS4gVGhpcwotICogZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIHZweF9jb2RlY19kZWNvZGUoKSB3cmFwcGVyIGZ1bmN0aW9uLAotICogc28gcGx1Z2lucyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgbWF5IHRydXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gKiB0byBiZSBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAqCi0gKiBccGFyYW1baW5dIGN0eCAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gKiBccGFyYW1baW5dIGRhdGEgICAgICAgICBQb2ludGVyIHRvIHRoaXMgYmxvY2sgb2YgbmV3IGNvZGVkIGRhdGEuIElmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBhICNWUFhfQ09ERUNfQ0JfUFVUX0ZSQU1FIGV2ZW50IGlzIHBvc3RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUuCi0gKiBccGFyYW1baW5dIGRhdGFfc3ogICAgICBTaXplIG9mIHRoZSBjb2RlZCBkYXRhLCBpbiBieXRlcy4KLSAqCi0gKiBccmV0dXJuIFJldHVybnMgI1ZQWF9DT0RFQ19PSyBpZiB0aGUgY29kZWQgZGF0YSB3YXMgcHJvY2Vzc2VkIGNvbXBsZXRlbHkKLSAqICAgICAgICAgYW5kIGZ1dHVyZSBwaWN0dXJlcyBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IGVycm9yLiBPdGhlcndpc2UsCi0gKiAgICAgICAgIHNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSBvdGhlciBlcnJvciBjb2RlcyBpbiA6OnZweF9jb2RlY19lcnJfdAotICogICAgICAgICBmb3IgcmVjb3ZlcmFiaWxpdHkgY2FwYWJpbGl0aWVzLgotICovCi10eXBlZGVmIHZweF9jb2RlY19lcnJfdCAoKnZweF9jb2RlY19kZWNvZGVfZm5fdCkodnB4X2NvZGVjX2FsZ19wcml2X3QgICpjdHgsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBkYXRhX3N6LAotICAgICAgICB2b2lkICAgICAgICAqdXNlcl9wcml2LAotICAgICAgICBsb25nICAgICAgICAgZGVhZGxpbmUpOwotCi0vKiFcYnJpZWYgRGVjb2RlZCBmcmFtZXMgaXRlcmF0b3IKLSAqCi0gKiBJdGVyYXRlcyBvdmVyIGEgbGlzdCBvZiB0aGUgZnJhbWVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheS4gVGhlIGl0ZXJhdG9yCi0gKiBzdG9yYWdlIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byBOVUxMIHRvIHN0YXJ0IHRoZSBpdGVyYXRpb24uIEl0ZXJhdGlvbiBpcwotICogY29tcGxldGUgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4KLSAqCi0gKiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZnJhbWVzIGJlY29tZXMgdmFsaWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoZQotICogdnB4X2NvZGVjX2RlY29kZSBjYWxsLCBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHZweF9jb2RlY19kZWNvZGUuCi0gKgotICogXHBhcmFtW2luXSAgICAgY3R4ICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICogXHBhcmFtW2luIG91dF0gaXRlciAgICAgSXRlcmF0b3Igc3RvcmFnZSwgaW5pdGlhbGl6ZWQgdG8gTlVMTAotICoKLSAqIFxyZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gaW1hZ2UsIGlmIG9uZSBpcyByZWFkeSBmb3IgZGlzcGxheS4gRnJhbWVzCi0gKiAgICAgICAgIHByb2R1Y2VkIHdpbGwgYWx3YXlzIGJlIGluIFBUUyAocHJlc2VudGF0aW9uIHRpbWUgc3RhbXApIG9yZGVyLgotICovCi10eXBlZGVmIHZweF9pbWFnZV90KigqdnB4X2NvZGVjX2dldF9mcmFtZV9mbl90KSh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY3R4LAotICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAgICAqaXRlcik7Ci0KLQotLypcYnJpZWYgZVh0ZXJuYWwgTWVtb3J5IEFsbG9jYXRpb24gbWVtb3J5IG1hcCBnZXQgaXRlcmF0b3IKLSAqCi0gKiBJdGVyYXRlcyBvdmVyIGEgbGlzdCBvZiB0aGUgbWVtb3J5IG1hcHMgcmVxdWVzdGVkIGJ5IHRoZSBkZWNvZGVyLiBUaGUKLSAqIGl0ZXJhdG9yIHN0b3JhZ2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4KLSAqIEl0ZXJhdGlvbiBpcyBjb21wbGV0ZSB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgotICoKLSAqIFxwYXJhbVtpbiBvdXRdIGl0ZXIgICAgIEl0ZXJhdG9yIHN0b3JhZ2UsIGluaXRpYWxpemVkIHRvIE5VTEwKLSAqCi0gKiBccmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGFuIG1lbW9yeSBzZWdtZW50IGRlc2NyaXB0b3IsIG9yIE5VTEwgdG8KLSAqICAgICAgICAgaW5kaWNhdGUgZW5kLW9mLWxpc3QuCi0gKi8KLXR5cGVkZWYgdnB4X2NvZGVjX2Vycl90ICgqdnB4X2NvZGVjX2dldF9tbWFwX2ZuX3QpKGNvbnN0IHZweF9jb2RlY19jdHhfdCAgICAgICpjdHgsCi0gICAgICAgIHZweF9jb2RlY19tbWFwX3QgICAgICAgICAgICptbWFwLAotICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAgICAgICAgICAqaXRlcik7Ci0KLQotLypcYnJpZWYgZVh0ZXJuYWwgTWVtb3J5IEFsbG9jYXRpb24gbWVtb3J5IG1hcCBzZXQgaXRlcmF0b3IKLSAqCi0gKiBTZXRzIGEgbWVtb3J5IGRlc2NyaXB0b3IgaW5zaWRlIHRoZSBkZWNvZGVyIGluc3RhbmNlLgotICoKLSAqIFxwYXJhbVtpbl0gY3R4ICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICogXHBhcmFtW2luXSBtbWFwICAgICBNZW1vcnkgbWFwIHRvIHN0b3JlLgotICoKLSAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19PSwotICogICAgIFRoZSBtZW1vcnkgbWFwIHdhcyBhY2NlcHRlZCBhbmQgc3RvcmVkLgotICogXHJldHZhbCAjVlBYX0NPREVDX01FTV9FUlJPUgotICogICAgIFRoZSBtZW1vcnkgbWFwIHdhcyByZWplY3RlZC4KLSAqLwotdHlwZWRlZiB2cHhfY29kZWNfZXJyX3QgKCp2cHhfY29kZWNfc2V0X21tYXBfZm5fdCkodnB4X2NvZGVjX2N0eF90ICAgICAgICAgKmN0eCwKLSAgICAgICAgY29uc3QgdnB4X2NvZGVjX21tYXBfdCAgKm1tYXApOwotCi0KLXR5cGVkZWYgdnB4X2NvZGVjX2Vycl90ICgqdnB4X2NvZGVjX2VuY29kZV9mbl90KSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgKmN0eCwKLSAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgICAgICppbWcsCi0gICAgICAgIHZweF9jb2RlY19wdHNfdCAgICAgICAgcHRzLAotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGR1cmF0aW9uLAotICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgIGZsYWdzLAotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIGRlYWRsaW5lKTsKLXR5cGVkZWYgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KigqdnB4X2NvZGVjX2dldF9jeF9kYXRhX2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICpjdHgsCi0gICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICppdGVyKTsKLQotdHlwZWRlZiB2cHhfY29kZWNfZXJyX3QKLSgqdnB4X2NvZGVjX2VuY19jb25maWdfc2V0X2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICAgICAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnKTsKLXR5cGVkZWYgdnB4X2ZpeGVkX2J1Zl90ICoKLSgqdnB4X2NvZGVjX2dldF9nbG9iYWxfaGVhZGVyc19mbl90KSh2cHhfY29kZWNfYWxnX3ByaXZfdCAgICpjdHgpOwotCi10eXBlZGVmIHZweF9pbWFnZV90ICoKLSgqdnB4X2NvZGVjX2dldF9wcmV2aWV3X2ZyYW1lX2ZuX3QpKHZweF9jb2RlY19hbGdfcHJpdl90ICAgKmN0eCk7Ci0KLS8qIVxicmllZiB1c2FnZSBjb25maWd1cmF0aW9uIG1hcHBpbmcKLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB1c2FnZSBpZGVudGlmaWVycyBhbmQKLSAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlcy4gRWFjaCBhbGdvcml0aG0gcHJvdmlkZXMgYSBsaXN0IG9mIHRoZXNlCi0gKiBtYXBwaW5ncy4gVGhpcyBsaXN0IGlzIHNlYXJjaGVkIGJ5IHRoZSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KCkKLSAqIHdyYXBwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbmZpZyB0byByZXR1cm4uIFRoZSBzcGVjaWFsIHZhbHVlCi0gKiB7LTEsIHswfX0gaXMgdXNlZCB0byBpbmRpY2F0ZSBlbmQtb2YtbGlzdCwgYW5kIG11c3QgYmUgcHJlc2VudC4gQXQgbGVhc3QKLSAqIG9uZSBtYXBwaW5nIG11c3QgYmUgcHJlc2VudCwgaW4gYWRkaXRpb24gdG8gdGhlIGVuZC1vZi1saXN0LgotICoKLSAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHVzYWdlOwotICAgIHZweF9jb2RlY19lbmNfY2ZnX3QgY2ZnOwotfSB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdDsKLQotI2RlZmluZSBOT1RfSU1QTEVNRU5URUQgMAotCi0vKiFcYnJpZWYgRGVjb2RlciBhbGdvcml0aG0gaW50ZXJmYWNlIGludGVyZmFjZQotICoKLSAqIEFsbCBkZWNvZGVycyBccmVmIE1VU1QgZXhwb3NlIGEgdmFyaWFibGUgb2YgdGhpcyB0eXBlLgotICovCi1zdHJ1Y3QgdnB4X2NvZGVjX2lmYWNlCi17Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICpuYW1lOyAgICAgICAgLyoqPCBJZGVudGlmaWNhdGlvbiBTdHJpbmcgICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBhYmlfdmVyc2lvbjsgLyoqPCBJbXBsZW1lbnRlZCBBQkkgdmVyc2lvbiAqLwotICAgIHZweF9jb2RlY19jYXBzX3QgICAgICAgICAgY2FwczsgICAgLyoqPCBEZWNvZGVyIGNhcGFiaWxpdGllcyAqLwotICAgIHZweF9jb2RlY19pbml0X2ZuX3QgICAgICAgaW5pdDsgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19pbml0X2ZuX3QgKi8KLSAgICB2cHhfY29kZWNfZGVzdHJveV9mbl90ICAgIGRlc3Ryb3k7ICAgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2Rlc3Ryb3lfZm5fdCAqLwotICAgIHZweF9jb2RlY19jdHJsX2ZuX21hcF90ICAqY3RybF9tYXBzOyAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfY3RybF9mbl9tYXBfdCAqLwotICAgIHZweF9jb2RlY19nZXRfbW1hcF9mbl90ICAgZ2V0X21tYXA7ICAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfZ2V0X21tYXBfZm5fdCAqLwotICAgIHZweF9jb2RlY19zZXRfbW1hcF9mbl90ICAgc2V0X21tYXA7ICAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfc2V0X21tYXBfZm5fdCAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgICAgdnB4X2NvZGVjX3BlZWtfc2lfZm5fdCAgICBwZWVrX3NpOyAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19wZWVrX3NpX2ZuX3QgKi8KLSAgICAgICAgdnB4X2NvZGVjX2dldF9zaV9mbl90ICAgICBnZXRfc2k7ICAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19wZWVrX3NpX2ZuX3QgKi8KLSAgICAgICAgdnB4X2NvZGVjX2RlY29kZV9mbl90ICAgICBkZWNvZGU7ICAgICAgLyoqPCBcY29weWRvYyA6OnZweF9jb2RlY19kZWNvZGVfZm5fdCAqLwotICAgICAgICB2cHhfY29kZWNfZ2V0X2ZyYW1lX2ZuX3QgIGdldF9mcmFtZTsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2dldF9mcmFtZV9mbl90ICovCi0gICAgfSBkZWM7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCAgICAgICAgICAgKmNmZ19tYXBzOyAgICAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCAqLwotICAgICAgICB2cHhfY29kZWNfZW5jb2RlX2ZuX3QgICAgICAgICAgICAgIGVuY29kZTsgICAgICAgIC8qKjwgXGNvcHlkb2MgOjp2cHhfY29kZWNfZW5jb2RlX2ZuX3QgKi8KLSAgICAgICAgdnB4X2NvZGVjX2dldF9jeF9kYXRhX2ZuX3QgICAgICAgICBnZXRfY3hfZGF0YTsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2dldF9jeF9kYXRhX2ZuX3QgKi8KLSAgICAgICAgdnB4X2NvZGVjX2VuY19jb25maWdfc2V0X2ZuX3QgICAgICBjZmdfc2V0OyAgICAgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2VuY19jb25maWdfc2V0X2ZuX3QgKi8KLSAgICAgICAgdnB4X2NvZGVjX2dldF9nbG9iYWxfaGVhZGVyc19mbl90ICBnZXRfZ2xvYl9oZHJzOyAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2VuY19jb25maWdfc2V0X2ZuX3QgKi8KLSAgICAgICAgdnB4X2NvZGVjX2dldF9wcmV2aWV3X2ZyYW1lX2ZuX3QgICBnZXRfcHJldmlldzsgICAvKio8IFxjb3B5ZG9jIDo6dnB4X2NvZGVjX2dldF9wcmV2aWV3X2ZyYW1lX2ZuX3QgKi8KLSAgICB9IGVuYzsKLX07Ci0KLS8qIVxicmllZiBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIC8gdXNlciBkYXRhIHBhaXIgc3RvcmFnZSAqLwotdHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX3ByaXZfY2JfcGFpcgotewotICAgIHVuaW9uCi0gICAgewotICAgICAgICB2cHhfY29kZWNfcHV0X2ZyYW1lX2NiX2ZuX3QgICAgcHV0X2ZyYW1lOwotICAgICAgICB2cHhfY29kZWNfcHV0X3NsaWNlX2NiX2ZuX3QgICAgcHV0X3NsaWNlOwotICAgIH0gdTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX3ByaXY7Ci19IHZweF9jb2RlY19wcml2X2NiX3BhaXJfdDsKLQotCi0vKiFcYnJpZWYgSW5zdGFuY2UgcHJpdmF0ZSBzdG9yYWdlCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSBhbGdvcml0aG0ncyBpbml0IGZ1bmN0aW9uLiBJdCBjYW4gYmUKLSAqIGV4dGVuZGVkIGluIG9uZSBvZiB0d28gd2F5cy4gRmlyc3QsIGEgc2Vjb25kLCBhbGdvcml0aG0gc3BlY2lmaWMgc3RydWN0dXJlCi0gKiBjYW4gYmUgYWxsb2NhdGVkIGFuZCB0aGUgcHJpdiBtZW1iZXIgcG9pbnRlZCB0byBpdC4gQWx0ZXJuYXRpdmVseSwgdGhpcwotICogc3RydWN0dXJlIGNhbiBiZSBtYWRlIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGFsZ29yaXRobSBzcGVjaWZpYyBzdHJ1Y3R1cmUsCi0gKiBhbmQgdGhlIHBvaW50ZXIgY2FzdCB0byB0aGUgcHJvcGVyIHR5cGUuCi0gKi8KLXN0cnVjdCB2cHhfY29kZWNfcHJpdgotewotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgc3o7Ci0gICAgdnB4X2NvZGVjX2lmYWNlX3QgICAgICAgICAgICAgICppZmFjZTsKLSAgICBzdHJ1Y3QgdnB4X2NvZGVjX2FsZ19wcml2ICAgICAgKmFsZ19wcml2OwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAqZXJyX2RldGFpbDsKLSAgICB2cHhfY29kZWNfZmxhZ3NfdCAgICAgICAgICAgICAgIGluaXRfZmxhZ3M7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgICB2cHhfY29kZWNfcHJpdl9jYl9wYWlyX3QgICAgcHV0X2ZyYW1lX2NiOwotICAgICAgICB2cHhfY29kZWNfcHJpdl9jYl9wYWlyX3QgICAgcHV0X3NsaWNlX2NiOwotICAgIH0gZGVjOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRiZDsKLSAgICAgICAgc3RydWN0IHZweF9maXhlZF9idWYgICAgICAgIGN4X2RhdGFfZHN0X2J1ZjsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGN4X2RhdGFfcGFkX2JlZm9yZTsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGN4X2RhdGFfcGFkX2FmdGVyOwotICAgICAgICB2cHhfY29kZWNfY3hfcGt0X3QgICAgICAgICAgY3hfZGF0YV9wa3Q7Ci0gICAgfSBlbmM7Ci19OwotCi0jdW5kZWYgVlBYX0NUUkxfVVNFX1RZUEUKLSNkZWZpbmUgVlBYX0NUUkxfVVNFX1RZUEUoaWQsIHR5cCkgXAotICAgIHN0YXRpYyB0eXAgaWQjI19fdmFsdWUodmFfbGlzdCBhcmdzKSB7cmV0dXJuIHZhX2FyZyhhcmdzLCB0eXApO30gXAotICAgIHN0YXRpYyB0eXAgaWQjI19fY29udmVydCh2b2lkICp4KVwKLSAgICB7XAotICAgICAgICB1bmlvblwKLSAgICAgICAge1wKLSAgICAgICAgICAgIHZvaWQgKng7XAotICAgICAgICAgICAgdHlwICAgZDtcCi0gICAgICAgIH0gdTtcCi0gICAgICAgIHUueCA9IHg7XAotICAgICAgICByZXR1cm4gdS5kO1wKLSAgICB9Ci0KLQotI3VuZGVmIFZQWF9DVFJMX1VTRV9UWVBFX0RFUFJFQ0FURUQKLSNkZWZpbmUgVlBYX0NUUkxfVVNFX1RZUEVfREVQUkVDQVRFRChpZCwgdHlwKSBcCi0gICAgc3RhdGljIHR5cCBpZCMjX192YWx1ZSh2YV9saXN0IGFyZ3MpIHtyZXR1cm4gdmFfYXJnKGFyZ3MsIHR5cCk7fSBcCi0gICAgc3RhdGljIHR5cCBpZCMjX19jb252ZXJ0KHZvaWQgKngpXAotICAgIHtcCi0gICAgICAgIHVuaW9uXAotICAgICAgICB7XAotICAgICAgICAgICAgdm9pZCAqeDtcCi0gICAgICAgICAgICB0eXAgICBkO1wKLSAgICAgICAgfSB1O1wKLSAgICAgICAgdS54ID0geDtcCi0gICAgICAgIHJldHVybiB1LmQ7XAotICAgIH0KLQotI2RlZmluZSBDQVNUKGlkLCBhcmcpIGlkIyNfX3ZhbHVlKGFyZykKLSNkZWZpbmUgUkVDQVNUKGlkLCB4KSBpZCMjX19jb252ZXJ0KHgpCi0KLQotLyogQ09ERUNfSU5URVJGQUNFIGNvbnZlbmllbmNlIG1hY3JvCi0gKgotICogQnkgY29udmVudGlvbiwgZWFjaCBjb2RlYyBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3Qgd2l0aCBleHRlcm4gbGlua2FnZSwgd2hlcmUKLSAqIHRoZSBzeW1ib2wgaXMgc3VmZml4ZWQgd2l0aCBfYWxnby4gQSBnZXR0ZXIgZnVuY3Rpb24gaXMgYWxzbyBkZWZpbmVkIHRvCi0gKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QsIHNpbmNlIGluIHNvbWUgY2FzZXMgaXQncyBlYXNpZXIgdG8gd29yawotICogd2l0aCB0ZXh0IHN5bWJvbHMgdGhhbiBkYXRhIHN5bWJvbHMgKHNlZSBpc3N1ZSAjMTY5KS4gVGhpcyBmdW5jdGlvbiBoYXMKLSAqIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN0cnVjdCwgbGVzcyB0aGUgX2FsZ28gc3VmZml4LiBUaGUgQ09ERUNfSU5URVJGQUNFCi0gKiBtYWNybyBpcyBwcm92aWRlZCB0byBkZWZpbmUgdGhpcyBnZXR0ZXIgZnVuY3Rpb24gYXV0b21hdGljYWxseS4KLSAqLwotI2RlZmluZSBDT0RFQ19JTlRFUkZBQ0UoaWQpXAotdnB4X2NvZGVjX2lmYWNlX3QqIGlkKHZvaWQpIHsgcmV0dXJuICZpZCMjX2FsZ287IH1cCi12cHhfY29kZWNfaWZhY2VfdCAgaWQjI19hbGdvCi0KLQotLyogSW50ZXJuYWwgVXRpbGl0eSBGdW5jdGlvbnMKLSAqCi0gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnNpZGUgYWxnb3JpdGhtcyBhcwotICogdXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgdnB4X2NvZGVjXyogZGF0YSBzdHJ1Y3R1cmVzLgotICovCi1zdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0Ci17Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgY250OwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIG1heDsKLSAgICBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCBwa3RzWzFdOwotfTsKLQotI2RlZmluZSB2cHhfY29kZWNfcGt0X2xpc3RfZGVjbChuKVwKLSAgICB1bmlvbiB7c3RydWN0IHZweF9jb2RlY19wa3RfbGlzdCBoZWFkO1wKLSAgICAgICAgc3RydWN0IHtzdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0IGhlYWQ7XAotICAgICAgICAgICAgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgICAgcGt0c1tuXTt9IGFsbG9jO30KLQotI2RlZmluZSB2cHhfY29kZWNfcGt0X2xpc3RfaW5pdChtKVwKLSAgICAobSktPmFsbG9jLmhlYWQuY250ID0gMCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChtKS0+YWxsb2MuaGVhZC5tYXggPSBzaXplb2YoKG0pLT5hbGxvYy5wa3RzKSAvIHNpemVvZigobSktPmFsbG9jLnBrdHNbMF0pCi0KLWludAotdnB4X2NvZGVjX3BrdF9saXN0X2FkZChzdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0ICosCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2cHhfY29kZWNfY3hfcGt0ICopOwotCi1jb25zdCB2cHhfY29kZWNfY3hfcGt0X3QqCi12cHhfY29kZWNfcGt0X2xpc3RfZ2V0KHN0cnVjdCB2cHhfY29kZWNfcGt0X2xpc3QgKmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgICAgICAgICAgICppdGVyKTsKLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLXN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbwotewotICAgIHZweF9jb2RlY19lcnJfdCAgZXJyb3JfY29kZTsKLSAgICBpbnQgICAgICAgICAgICAgIGhhc19kZXRhaWw7Ci0gICAgY2hhciAgICAgICAgICAgICBkZXRhaWxbODBdOwotICAgIGludCAgICAgICAgICAgICAgc2V0am1wOwotICAgIGptcF9idWYgICAgICAgICAgam1wOwotfTsKLQotc3RhdGljIHZvaWQgdnB4X2ludGVybmFsX2Vycm9yKHN0cnVjdCB2cHhfaW50ZXJuYWxfZXJyb3JfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgICAgICAgICAgICAgICAgIGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAqZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikKLXsKLSAgICB2YV9saXN0IGFwOwotCi0gICAgaW5mby0+ZXJyb3JfY29kZSA9IGVycm9yOwotICAgIGluZm8tPmhhc19kZXRhaWwgPSAwOwotCi0gICAgaWYgKGZtdCkKLSAgICB7Ci0gICAgICAgIHNpemVfdCAgc3ogPSBzaXplb2YoaW5mby0+ZGV0YWlsKTsKLQotICAgICAgICBpbmZvLT5oYXNfZGV0YWlsID0gMTsKLSAgICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgICAgIHZzbnByaW50ZihpbmZvLT5kZXRhaWwsIHN6IC0gMSwgZm10LCBhcCk7Ci0gICAgICAgIHZhX2VuZChhcCk7Ci0gICAgICAgIGluZm8tPmRldGFpbFtzei0xXSA9ICdcMCc7Ci0gICAgfQotCi0gICAgaWYgKGluZm8tPnNldGptcCkKLSAgICAgICAgbG9uZ2ptcChpbmZvLT5qbXAsIGluZm8tPmVycm9yX2NvZGUpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS92cHgvc3JjL3ZweF9kZWNvZGVyLmMgYi92cHgvc3JjL3ZweF9kZWNvZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmU1NWEuLjAwMDAwMDAKLS0tIGEvdnB4L3NyYy92cHhfZGVjb2Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiFcZmlsZQotICogXGJyaWVmIFByb3ZpZGVzIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSB0byB3cmFwIGRlY29kZXIgYWxnb3JpdGhtcy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ2cHgvaW50ZXJuYWwvdnB4X2NvZGVjX2ludGVybmFsLmgiCi0KLSNkZWZpbmUgU0FWRV9TVEFUVVMoY3R4LHZhcikgKGN0eD8oY3R4LT5lcnIgPSB2YXIpOnZhcikKLQotdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19kZWNfaW5pdF92ZXIodnB4X2NvZGVjX2N0eF90ICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pZmFjZV90ICAgICppZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgICpjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZmxhZ3NfdCAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdmVyKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXM7Ci0KLSNpZmRlZiBNSVBTX0RTUF9SRVYKLSNpZiAoTUlQU19EU1BfUkVWPj0yKQotICAgIGRzcHV0aWxfc3RhdGljX2luaXQoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICBpZiAodmVyICE9IFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfQUJJX01JU01BVENIOwotICAgIGVsc2UgaWYgKCFjdHggfHwgIWlmYWNlKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICBlbHNlIGlmIChpZmFjZS0+YWJpX3ZlcnNpb24gIT0gVlBYX0NPREVDX0lOVEVSTkFMX0FCSV9WRVJTSU9OKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfQUJJX01JU01BVENIOwotICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfWE1BKSAmJiAhKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9YTUEpKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOwotICAgIGVsc2UgaWYgKChmbGFncyAmIFZQWF9DT0RFQ19VU0VfUE9TVFBST0MpICYmICEoaWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX1BPU1RQUk9DKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICBlbHNlIGlmICghKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9ERUNPREVSKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwotICAgICAgICBjdHgtPmlmYWNlID0gaWZhY2U7Ci0gICAgICAgIGN0eC0+bmFtZSA9IGlmYWNlLT5uYW1lOwotICAgICAgICBjdHgtPnByaXYgPSBOVUxMOwotICAgICAgICBjdHgtPmluaXRfZmxhZ3MgPSBmbGFnczsKLSAgICAgICAgY3R4LT5jb25maWcuZGVjID0gY2ZnOwotICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7Ci0KLSAgICAgICAgaWYgKCEoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1hNQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmluaXQoY3R4KTsKLQotICAgICAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVycl9kZXRhaWwgPSBjdHgtPnByaXYgPyBjdHgtPnByaXYtPmVycl9kZXRhaWwgOiBOVUxMOwotICAgICAgICAgICAgICAgIHZweF9jb2RlY19kZXN0cm95KGN0eCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjdHgtPnByaXYpCi0gICAgICAgICAgICAgICAgY3R4LT5wcml2LT5pZmFjZSA9IGN0eC0+aWZhY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOwotfQotCi0KLXZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyh2cHhfY29kZWNfaWZhY2VfdCAgICAgICAqaWZhY2UsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBkYXRhX3N6LAotICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90IHJlczsKLQotICAgIGlmICghaWZhY2UgfHwgIWRhdGEgfHwgIWRhdGFfc3ogfHwgIXNpCi0gICAgICAgIHx8IHNpLT5zeiA8IHNpemVvZih2cHhfY29kZWNfc3RyZWFtX2luZm9fdCkpCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNldCBkZWZhdWx0L3Vua25vd24gdmFsdWVzICovCi0gICAgICAgIHNpLT53ID0gMDsKLSAgICAgICAgc2ktPmggPSAwOwotCi0gICAgICAgIHJlcyA9IGlmYWNlLT5kZWMucGVla19zaShkYXRhLCBkYXRhX3N6LCBzaSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi12cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2dldF9zdHJlYW1faW5mbyh2cHhfY29kZWNfY3R4X3QgICAgICAgICAqY3R4LAotICAgICAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqc2kpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90IHJlczsKLQotICAgIGlmICghY3R4IHx8ICFzaSB8fCBzaS0+c3ogPCBzaXplb2YodnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QpKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2KQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2V0IGRlZmF1bHQvdW5rbm93biB2YWx1ZXMgKi8KLSAgICAgICAgc2ktPncgPSAwOwotICAgICAgICBzaS0+aCA9IDA7Ci0KLSAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+ZGVjLmdldF9zaShjdHgtPnByaXYtPmFsZ19wcml2LCBzaSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKLX0KLQotCi12cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2RlY29kZSh2cHhfY29kZWNfY3R4X3QgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGRhdGFfc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICp1c2VyX3ByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICBkZWFkbGluZSkKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgcmVzOwotCi0gICAgLyogU2FuaXR5IGNoZWNrcyAqLwotICAgIC8qIE5VTEwgZGF0YSBwdHIgYWxsb3dlZCBpZiBkYXRhX3N6IGlzIDAgdG9vICovCi0gICAgaWYgKCFjdHggfHwgKCFkYXRhICYmIGRhdGFfc3opKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2KQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+ZGVjLmRlY29kZShjdHgtPnByaXYtPmFsZ19wcml2LCBkYXRhLCBkYXRhX3N6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcHJpdiwgZGVhZGxpbmUpOwotICAgIH0KLQotICAgIHJldHVybiBTQVZFX1NUQVRVUyhjdHgsIHJlcyk7Ci19Ci0KLXZweF9pbWFnZV90ICp2cHhfY29kZWNfZ2V0X2ZyYW1lKHZweF9jb2RlY19jdHhfdCAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgKml0ZXIpCi17Ci0gICAgdnB4X2ltYWdlX3QgKmltZzsKLQotICAgIGlmICghY3R4IHx8ICFpdGVyIHx8ICFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYpCi0gICAgICAgIGltZyA9IE5VTEw7Ci0gICAgZWxzZQotICAgICAgICBpbWcgPSBjdHgtPmlmYWNlLT5kZWMuZ2V0X2ZyYW1lKGN0eC0+cHJpdi0+YWxnX3ByaXYsIGl0ZXIpOwotCi0gICAgcmV0dXJuIGltZzsKLX0KLQotCi12cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3JlZ2lzdGVyX3B1dF9mcmFtZV9jYih2cHhfY29kZWNfY3R4X3QgICAgICAgICAgICAgKmN0eCwKLSAgICAgICAgdnB4X2NvZGVjX3B1dF9mcmFtZV9jYl9mbl90ICBjYiwKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9wcml2KQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXM7Ci0KLSAgICBpZiAoIWN0eCB8fCAhY2IpCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotICAgIGVsc2UgaWYgKCFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYKLSAgICAgICAgICAgICB8fCAhKGN0eC0+aWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX1BVVF9GUkFNRSkpCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19FUlJPUjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBjdHgtPnByaXYtPmRlYy5wdXRfZnJhbWVfY2IudS5wdXRfZnJhbWUgPSBjYjsKLSAgICAgICAgY3R4LT5wcml2LT5kZWMucHV0X2ZyYW1lX2NiLnVzZXJfcHJpdiA9IHVzZXJfcHJpdjsKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX09LOwotICAgIH0KLQotICAgIHJldHVybiBTQVZFX1NUQVRVUyhjdHgsIHJlcyk7Ci19Ci0KLQotdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19yZWdpc3Rlcl9wdXRfc2xpY2VfY2IodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgICpjdHgsCi0gICAgICAgIHZweF9jb2RlY19wdXRfc2xpY2VfY2JfZm5fdCAgY2IsCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdikKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgcmVzOwotCi0gICAgaWYgKCFjdHggfHwgIWNiKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2Ci0gICAgICAgICAgICAgfHwgIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9QVVRfRlJBTUUpKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3R4LT5wcml2LT5kZWMucHV0X3NsaWNlX2NiLnUucHV0X3NsaWNlID0gY2I7Ci0gICAgICAgIGN0eC0+cHJpdi0+ZGVjLnB1dF9zbGljZV9jYi51c2VyX3ByaXYgPSB1c2VyX3ByaXY7Ci0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19PSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOwotfQotCi0KLXZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZ2V0X21lbV9tYXAodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgICAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19tbWFwX3QgICAgICAgICAgICAgICAqbW1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCAgICAgICAgICAgICAgICppdGVyKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfT0s7Ci0KLSAgICBpZiAoIWN0eCB8fCAhbW1hcCB8fCAhaXRlciB8fCAhY3R4LT5pZmFjZSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0gICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9YTUEpKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgZWxzZQotICAgICAgICByZXMgPSBjdHgtPmlmYWNlLT5nZXRfbW1hcChjdHgsIG1tYXAsIGl0ZXIpOwotCi0gICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKLX0KLQotCi12cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3NldF9tZW1fbWFwKHZweF9jb2RlY19jdHhfdCAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19tbWFwX3QgICptbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIG51bV9tYXBzKQotewotICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSBWUFhfQ09ERUNfTUVNX0VSUk9SOwotCi0gICAgaWYgKCFjdHggfHwgIW1tYXAgfHwgIWN0eC0+aWZhY2UpCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTlZBTElEX1BBUkFNOwotICAgIGVsc2UgaWYgKCEoY3R4LT5pZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfWE1BKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0VSUk9SOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWFwczsgaSsrLCBtbWFwKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbW1hcC0+YmFzZSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogRXZlcnl0aGluZyBsb29rIG9rLCBzZXQgdGhlIG1tYXAgaW4gdGhlIGRlY29kZXIgKi8KLSAgICAgICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPnNldF9tbWFwKGN0eCwgbW1hcCk7Ci0KLSAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOwotfQpkaWZmIC0tZ2l0IGEvdnB4L3NyYy92cHhfZGVjb2Rlcl9jb21wYXQuYyBiL3ZweC9zcmMvdnB4X2RlY29kZXJfY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZTAwY2UuLjAwMDAwMDAKLS0tIGEvdnB4L3NyYy92cHhfZGVjb2Rlcl9jb21wYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyohXGZpbGUKLSAqIFxicmllZiBQcm92aWRlcyB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UgdG8gd3JhcCBkZWNvZGVyIGFsZ29yaXRobXMuCi0gKgotICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCi0jaW5jbHVkZSAidnB4L2ludGVybmFsL3ZweF9jb2RlY19pbnRlcm5hbC5oIgotCi0jZGVmaW5lIFNBVkVfU1RBVFVTKGN0eCx2YXIpIChjdHg/KGN0eC0+ZXJyID0gdmFyKTp2YXIpCi0KLWNvbnN0IGNoYXIgKnZweF9kZWNfaWZhY2VfbmFtZSh2cHhfZGVjX2lmYWNlX3QgKmlmYWNlKQotewotICAgIHJldHVybiB2cHhfY29kZWNfaWZhY2VfbmFtZSgodnB4X2NvZGVjX2lmYWNlX3QgKilpZmFjZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKnZweF9kZWNfZXJyX3RvX3N0cmluZyh2cHhfZGVjX2Vycl90ICBlcnIpCi17Ci0gICAgcmV0dXJuIHZweF9jb2RlY19lcnJfdG9fc3RyaW5nKGVycik7Ci19Ci0KLWNvbnN0IGNoYXIgKnZweF9kZWNfZXJyb3IodnB4X2RlY19jdHhfdCAgKmN0eCkKLXsKLSAgICByZXR1cm4gdnB4X2NvZGVjX2Vycm9yKCh2cHhfY29kZWNfY3R4X3QgKiljdHgpOwotfQotCi1jb25zdCBjaGFyICp2cHhfZGVjX2Vycm9yX2RldGFpbCh2cHhfZGVjX2N0eF90ICAqY3R4KQotewotICAgIHJldHVybiB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKCh2cHhfY29kZWNfY3R4X3QgKiljdHgpOwotfQotCi0KLXZweF9kZWNfZXJyX3QgdnB4X2RlY19pbml0X3Zlcih2cHhfZGVjX2N0eF90ICAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19pZmFjZV90ICAqaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmVyKQotewotICAgIHJldHVybiB2cHhfY29kZWNfZGVjX2luaXRfdmVyKCh2cHhfY29kZWNfY3R4X3QgKiljdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19pZmFjZV90ICopaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcik7Ci19Ci0KLQotdnB4X2RlY19lcnJfdCB2cHhfZGVjX2Rlc3Ryb3kodnB4X2RlY19jdHhfdCAqY3R4KQotewotICAgIHJldHVybiB2cHhfY29kZWNfZGVzdHJveSgodnB4X2NvZGVjX2N0eF90ICopY3R4KTsKLX0KLQotCi12cHhfZGVjX2NhcHNfdCB2cHhfZGVjX2dldF9jYXBzKHZweF9kZWNfaWZhY2VfdCAqaWZhY2UpCi17Ci0gICAgcmV0dXJuIHZweF9jb2RlY19nZXRfY2FwcygodnB4X2NvZGVjX2lmYWNlX3QgKilpZmFjZSk7Ci19Ci0KLQotdnB4X2RlY19lcnJfdCB2cHhfZGVjX3BlZWtfc3RyZWFtX2luZm8odnB4X2RlY19pZmFjZV90ICAgICAgICppZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgZGF0YV9zeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9kZWNfc3RyZWFtX2luZm9fdCAqc2kpCi17Ci0gICAgcmV0dXJuIHZweF9jb2RlY19wZWVrX3N0cmVhbV9pbmZvKCh2cHhfY29kZWNfaWZhY2VfdCAqKWlmYWNlLCBkYXRhLCBkYXRhX3N6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKilzaSk7Ci19Ci0KLQotdnB4X2RlY19lcnJfdCB2cHhfZGVjX2dldF9zdHJlYW1faW5mbyh2cHhfZGVjX2N0eF90ICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19zdHJlYW1faW5mb190ICpzaSkKLXsKLSAgICByZXR1cm4gdnB4X2NvZGVjX2dldF9zdHJlYW1faW5mbygodnB4X2NvZGVjX2N0eF90ICopY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqKXNpKTsKLX0KLQotCi12cHhfZGVjX2Vycl90IHZweF9kZWNfY29udHJvbCh2cHhfZGVjX2N0eF90ICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN0cmxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKLXsKLSAgICByZXR1cm4gdnB4X2NvZGVjX2NvbnRyb2xfKCh2cHhfY29kZWNfY3R4X3QgKiljdHgsIGN0cmxfaWQsIGRhdGEpOwotfQotCi0KLXZweF9kZWNfZXJyX3QgdnB4X2RlY19kZWNvZGUodnB4X2RlY19jdHhfdCAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBkYXRhX3N6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICp1c2VyX3ByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHJlbF9wdHMpCi17Ci0gICAgKHZvaWQpcmVsX3B0czsKLSAgICByZXR1cm4gdnB4X2NvZGVjX2RlY29kZSgodnB4X2NvZGVjX2N0eF90ICopY3R4LCBkYXRhLCBkYXRhX3N6LCB1c2VyX3ByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci19Ci0KLXZweF9pbWFnZV90ICp2cHhfZGVjX2dldF9mcmFtZSh2cHhfZGVjX2N0eF90ICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9kZWNfaXRlcl90ICppdGVyKQotewotICAgIHJldHVybiB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiljdHgsIGl0ZXIpOwotfQotCi0KLXZweF9kZWNfZXJyX3QgdnB4X2RlY19yZWdpc3Rlcl9wdXRfZnJhbWVfY2IodnB4X2RlY19jdHhfdCAgICAgICAgICAgICAqY3R4LAotICAgICAgICB2cHhfZGVjX3B1dF9mcmFtZV9jYl9mbl90ICBjYiwKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9wcml2KQotewotICAgIHJldHVybiB2cHhfY29kZWNfcmVnaXN0ZXJfcHV0X2ZyYW1lX2NiKCh2cHhfY29kZWNfY3R4X3QgKiljdHgsIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcHJpdik7Ci19Ci0KLQotdnB4X2RlY19lcnJfdCB2cHhfZGVjX3JlZ2lzdGVyX3B1dF9zbGljZV9jYih2cHhfZGVjX2N0eF90ICAgICAgICAgICAgICpjdHgsCi0gICAgICAgIHZweF9kZWNfcHV0X3NsaWNlX2NiX2ZuX3QgIGNiLAotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX3ByaXYpCi17Ci0gICAgcmV0dXJuIHZweF9jb2RlY19yZWdpc3Rlcl9wdXRfc2xpY2VfY2IoKHZweF9jb2RlY19jdHhfdCAqKWN0eCwgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9wcml2KTsKLX0KLQotCi12cHhfZGVjX2Vycl90IHZweF9kZWNfeG1hX2luaXRfdmVyKHZweF9kZWNfY3R4X3QgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19pZmFjZV90ICAqaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHZlcikKLXsKLSAgICByZXR1cm4gdnB4X2NvZGVjX2RlY19pbml0X3ZlcigodnB4X2NvZGVjX2N0eF90ICopY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2cHhfY29kZWNfaWZhY2VfdCAqKWlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0NPREVDX1VTRV9YTUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyKTsKLX0KLQotdnB4X2RlY19lcnJfdCB2cHhfZGVjX2dldF9tZW1fbWFwKHZweF9kZWNfY3R4X3QgICAgICAgICAgICAgICAgKmN0eF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19tbWFwX3QgICAgICAgICAgICAgICAqbW1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfZGVjX3N0cmVhbV9pbmZvX3QgICpzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZGVjX2l0ZXJfdCAgICAgICAgICAgICAgICppdGVyKQotewotICAgIHZweF9jb2RlY19jdHhfdCAgICpjdHggPSAodnB4X2NvZGVjX2N0eF90ICopY3R4XzsKLSAgICB2cHhfZGVjX2Vycl90ICAgICAgcmVzID0gVlBYX0RFQ19PSzsKLQotICAgIGlmICghY3R4IHx8ICFtbWFwIHx8ICFzaSB8fCAhaXRlciB8fCAhY3R4LT5pZmFjZSkKLSAgICAgICAgcmVzID0gVlBYX0RFQ19JTlZBTElEX1BBUkFNOwotICAgIGVsc2UgaWYgKCEoY3R4LT5pZmFjZS0+Y2FwcyAmIFZQWF9ERUNfQ0FQX1hNQSkpCi0gICAgICAgIHJlcyA9IFZQWF9ERUNfRVJST1I7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKCFjdHgtPmNvbmZpZy5kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN0eC0+Y29uZmlnLmRlYyA9IG1hbGxvYyhzaXplb2YodnB4X2NvZGVjX2RlY19jZmdfdCkpOwotICAgICAgICAgICAgY3R4LT5jb25maWcuZGVjLT53ID0gc2ktPnc7Ci0gICAgICAgICAgICBjdHgtPmNvbmZpZy5kZWMtPmggPSBzaS0+aDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmdldF9tbWFwKGN0eCwgbW1hcCwgaXRlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKLX0KLQotCi12cHhfZGVjX2Vycl90IHZweF9kZWNfc2V0X21lbV9tYXAodnB4X2RlY19jdHhfdCAgICpjdHhfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9kZWNfbW1hcF90ICAqbW1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIG51bV9tYXBzKQotewotICAgIHZweF9jb2RlY19jdHhfdCAgICpjdHggPSAodnB4X2NvZGVjX2N0eF90ICopY3R4XzsKLSAgICB2cHhfZGVjX2Vycl90ICAgICAgcmVzID0gVlBYX0RFQ19NRU1fRVJST1I7Ci0KLSAgICBpZiAoIWN0eCB8fCAhbW1hcCB8fCAhY3R4LT5pZmFjZSkKLSAgICAgICAgcmVzID0gVlBYX0RFQ19JTlZBTElEX1BBUkFNOwotICAgIGVsc2UgaWYgKCEoY3R4LT5pZmFjZS0+Y2FwcyAmIFZQWF9ERUNfQ0FQX1hNQSkpCi0gICAgICAgIHJlcyA9IFZQWF9ERUNfRVJST1I7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdm9pZCAgICAgICAgICpzYXZlID0gKGN0eC0+cHJpdikgPyBOVUxMIDogY3R4LT5jb25maWcuZGVjOwotICAgICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hcHM7IGkrKywgbW1hcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW1tYXAtPmJhc2UpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9vayBvaywgc2V0IHRoZSBtbWFwIGluIHRoZSBkZWNvZGVyICovCi0gICAgICAgICAgICByZXMgPSBjdHgtPmlmYWNlLT5zZXRfbW1hcChjdHgsIG1tYXApOwotCi0gICAgICAgICAgICBpZiAocmVzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNhdmUpIGZyZWUoc2F2ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKLX0KZGlmZiAtLWdpdCBhL3ZweC9zcmMvdnB4X2VuY29kZXIuYyBiL3ZweC9zcmMvdnB4X2VuY29kZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3NzhmZi4uMDAwMDAwMAotLS0gYS92cHgvc3JjL3ZweF9lbmNvZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qIVxmaWxlCi0gKiBcYnJpZWYgUHJvdmlkZXMgdGhlIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlIHRvIHdyYXAgZW5jb2RlciBhbGdvcml0aG1zLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInZweC9pbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaCIKLQotI2RlZmluZSBTQVZFX1NUQVRVUyhjdHgsdmFyKSAoY3R4PyhjdHgtPmVyciA9IHZhcik6dmFyKQotCi12cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2VuY19pbml0X3Zlcih2cHhfY29kZWNfY3R4X3QgICAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2lmYWNlX3QgICAgKmlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCAgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19mbGFnc190ICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB2ZXIpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90IHJlczsKLQotICAgIGlmICh2ZXIgIT0gVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04pCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19BQklfTUlTTUFUQ0g7Ci0gICAgZWxzZSBpZiAoIWN0eCB8fCAhaWZhY2UgfHwgIWNmZykKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0gICAgZWxzZSBpZiAoaWZhY2UtPmFiaV92ZXJzaW9uICE9IFZQWF9DT0RFQ19JTlRFUk5BTF9BQklfVkVSU0lPTikKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0FCSV9NSVNNQVRDSDsKLSAgICBlbHNlIGlmICghKGlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICBlbHNlIGlmICgoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1hNQSkgJiYgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfWE1BKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICBlbHNlIGlmICgoZmxhZ3MgJiBWUFhfQ09ERUNfVVNFX1BTTlIpCi0gICAgICAgICAgICAgJiYgIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfUFNOUikpCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTkNBUEFCTEU7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3R4LT5pZmFjZSA9IGlmYWNlOwotICAgICAgICBjdHgtPm5hbWUgPSBpZmFjZS0+bmFtZTsKLSAgICAgICAgY3R4LT5wcml2ID0gTlVMTDsKLSAgICAgICAgY3R4LT5pbml0X2ZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIGN0eC0+Y29uZmlnLmVuYyA9IGNmZzsKLSAgICAgICAgcmVzID0gY3R4LT5pZmFjZS0+aW5pdChjdHgpOwotCi0gICAgICAgIGlmIChyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN0eC0+ZXJyX2RldGFpbCA9IGN0eC0+cHJpdiA/IGN0eC0+cHJpdi0+ZXJyX2RldGFpbCA6IE5VTEw7Ci0gICAgICAgICAgICB2cHhfY29kZWNfZGVzdHJveShjdHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN0eC0+cHJpdikKLSAgICAgICAgICAgIGN0eC0+cHJpdi0+aWZhY2UgPSBjdHgtPmlmYWNlOwotICAgIH0KLQotICAgIHJldHVybiBTQVZFX1NUQVRVUyhjdHgsIHJlcyk7Ci19Ci0KLQotCi12cHhfY29kZWNfZXJyX3QgIHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQodnB4X2NvZGVjX2lmYWNlX3QgICAgKmlmYWNlLAotICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgdXNhZ2UpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90IHJlczsKLSAgICB2cHhfY29kZWNfZW5jX2NmZ19tYXBfdCAqbWFwOwotCi0gICAgaWYgKCFpZmFjZSB8fCAhY2ZnIHx8IHVzYWdlID4gSU5UX01BWCkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0gICAgZWxzZSBpZiAoIShpZmFjZS0+Y2FwcyAmIFZQWF9DT0RFQ19DQVBfRU5DT0RFUikpCi0gICAgICAgIHJlcyA9IFZQWF9DT0RFQ19JTkNBUEFCTEU7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0KLSAgICAgICAgZm9yIChtYXAgPSBpZmFjZS0+ZW5jLmNmZ19tYXBzOyBtYXAtPnVzYWdlID49IDA7IG1hcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobWFwLT51c2FnZSA9PSAoaW50KXVzYWdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpjZmcgPSBtYXAtPmNmZzsKLSAgICAgICAgICAgICAgICBjZmctPmdfdXNhZ2UgPSB1c2FnZTsKLSAgICAgICAgICAgICAgICByZXMgPSBWUFhfQ09ERUNfT0s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLSNpZiBBUkNIX1g4NiB8fCBBUkNIX1g4Nl82NAotLyogT24gWDg2LCBkaXNhYmxlIHRoZSB4ODcgdW5pdCdzIGludGVybmFsIDgwIGJpdCBwcmVjaXNpb24gZm9yIGJldHRlcgotICogY29uc2lzdGVuY3kgd2l0aCB0aGUgU1NFIHVuaXQncyA2NCBiaXQgcHJlY2lzaW9uLgotICovCi0jaW5jbHVkZSAidnB4X3BvcnRzL3g4Ni5oIgotI2RlZmluZSBGTE9BVElOR19QT0lOVF9JTklUKCkgZG8ge1wKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeDg3X29yaWdfbW9kZSA9IHg4N19zZXRfZG91YmxlX3ByZWNpc2lvbigpOwotI2RlZmluZSBGTE9BVElOR19QT0lOVF9SRVNUT1JFKCkgXAotICAgIHg4N19zZXRfY29udHJvbF93b3JkKHg4N19vcmlnX21vZGUpOyB9d2hpbGUoMCkKLQotCi0jZWxzZQotc3RhdGljIHZvaWQgRkxPQVRJTkdfUE9JTlRfSU5JVCgpIHt9Ci1zdGF0aWMgdm9pZCBGTE9BVElOR19QT0lOVF9SRVNUT1JFKCkge30KLSNlbmRpZgotCi0KLXZweF9jb2RlY19lcnJfdCAgdnB4X2NvZGVjX2VuY29kZSh2cHhfY29kZWNfY3R4X3QgICAgICAgICAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV90ICAgICAgICAgICppbWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3B0c190ICAgICAgICAgICAgIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2VuY19mcmFtZV9mbGFnc190ICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBkZWFkbGluZSkKLXsKLSAgICB2cHhfY29kZWNfZXJyX3QgcmVzOwotCi0gICAgaWYgKCFjdHggfHwgKGltZyAmJiAhZHVyYXRpb24pKQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICBlbHNlIGlmICghY3R4LT5pZmFjZSB8fCAhY3R4LT5wcml2KQotICAgICAgICByZXMgPSBWUFhfQ09ERUNfRVJST1I7Ci0gICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBFeGVjdXRlIGluIGEgbm9ybWFsaXplZCBmbG9hdGluZyBwb2ludCBlbnZpcm9ubWVudCwgaWYgdGhlIHBsYXRmb3JtCi0gICAgICAgICAqIHJlcXVpcmVzIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgRkxPQVRJTkdfUE9JTlRfSU5JVCgpOwotICAgICAgICByZXMgPSBjdHgtPmlmYWNlLT5lbmMuZW5jb2RlKGN0eC0+cHJpdi0+YWxnX3ByaXYsIGltZywgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBmbGFncywgZGVhZGxpbmUpOwotICAgICAgICBGTE9BVElOR19QT0lOVF9SRVNUT1JFKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNBVkVfU1RBVFVTKGN0eCwgcmVzKTsKLX0KLQotCi1jb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnZweF9jb2RlY19nZXRfY3hfZGF0YSh2cHhfY29kZWNfY3R4X3QgICAqY3R4LAotICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAqaXRlcikKLXsKLSAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdCA9IE5VTEw7Ci0KLSAgICBpZiAoY3R4KQotICAgIHsKLSAgICAgICAgaWYgKCFpdGVyKQotICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLSAgICAgICAgZWxzZSBpZiAoIWN0eC0+aWZhY2UgfHwgIWN0eC0+cHJpdikKLSAgICAgICAgICAgIGN0eC0+ZXJyID0gVlBYX0NPREVDX0VSUk9SOwotICAgICAgICBlbHNlIGlmICghKGN0eC0+aWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIpKQotICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwa3QgPSBjdHgtPmlmYWNlLT5lbmMuZ2V0X2N4X2RhdGEoY3R4LT5wcml2LT5hbGdfcHJpdiwgaXRlcik7Ci0gICAgfQotCi0gICAgaWYgKHBrdCAmJiBwa3QtPmtpbmQgPT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkKLSAgICB7Ci0gICAgICAgIC8qIElmIHRoZSBhcHBsaWNhdGlvbiBoYXMgc3BlY2lmaWVkIGEgZGVzdGluYXRpb24gYXJlYSBmb3IgdGhlCi0gICAgICAgICAqIGNvbXByZXNzZWQgZGF0YSwgYW5kIHRoZSBjb2RlYyBoYXMgbm90IHBsYWNlZCB0aGUgZGF0YSB0aGVyZSwKLSAgICAgICAgICogYW5kIGl0IGZpdHMsIGNvcHkgaXQuCi0gICAgICAgICAqLwotICAgICAgICBjaGFyICpkc3RfYnVmID0gY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9kc3RfYnVmLmJ1ZjsKLQotICAgICAgICBpZiAoZHN0X2J1ZgotICAgICAgICAgICAgJiYgcGt0LT5kYXRhLnJhdy5idWYgIT0gZHN0X2J1ZgotICAgICAgICAgICAgJiYgcGt0LT5kYXRhLnJhdy5zegotICAgICAgICAgICAgKyBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9iZWZvcmUKLSAgICAgICAgICAgICsgY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9wYWRfYWZ0ZXIKLSAgICAgICAgICAgIDw9IGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfZHN0X2J1Zi5zeikKLSAgICAgICAgewotICAgICAgICAgICAgdnB4X2NvZGVjX2N4X3BrdF90ICptb2RpZmllZF9wa3QgPSAmY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9wa3Q7Ci0KLSAgICAgICAgICAgIG1lbWNweShkc3RfYnVmICsgY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9wYWRfYmVmb3JlLAotICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS5yYXcuYnVmLCBwa3QtPmRhdGEucmF3LnN6KTsKLSAgICAgICAgICAgICptb2RpZmllZF9wa3QgPSAqcGt0OwotICAgICAgICAgICAgbW9kaWZpZWRfcGt0LT5kYXRhLnJhdy5idWYgPSBkc3RfYnVmOwotICAgICAgICAgICAgbW9kaWZpZWRfcGt0LT5kYXRhLnJhdy5zeiArPSBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9iZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9hZnRlcjsKLSAgICAgICAgICAgIHBrdCA9IG1vZGlmaWVkX3BrdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkc3RfYnVmID09IHBrdC0+ZGF0YS5yYXcuYnVmKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX2RzdF9idWYuYnVmID0gZHN0X2J1ZiArIHBrdC0+ZGF0YS5yYXcuc3o7Ci0gICAgICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX2RzdF9idWYuc3ogLT0gcGt0LT5kYXRhLnJhdy5zejsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBwa3Q7Ci19Ci0KLQotdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19zZXRfY3hfZGF0YV9idWYodnB4X2NvZGVjX2N0eF90ICAgICAgICpjdHgsCi0gICAgICAgIGNvbnN0IHZweF9maXhlZF9idWZfdCAqYnVmLAotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHBhZF9iZWZvcmUsCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcGFkX2FmdGVyKQotewotICAgIGlmICghY3R4IHx8ICFjdHgtPnByaXYpCi0gICAgICAgIHJldHVybiBWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTTsKLQotICAgIGlmIChidWYpCi0gICAgewotICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX2RzdF9idWYgPSAqYnVmOwotICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9iZWZvcmUgPSBwYWRfYmVmb3JlOwotICAgICAgICBjdHgtPnByaXYtPmVuYy5jeF9kYXRhX3BhZF9hZnRlciA9IHBhZF9hZnRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3R4LT5wcml2LT5lbmMuY3hfZGF0YV9kc3RfYnVmLmJ1ZiA9IE5VTEw7Ci0gICAgICAgIGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfZHN0X2J1Zi5zeiA9IDA7Ci0gICAgICAgIGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfcGFkX2JlZm9yZSA9IDA7Ci0gICAgICAgIGN0eC0+cHJpdi0+ZW5jLmN4X2RhdGFfcGFkX2FmdGVyID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVlBYX0NPREVDX09LOwotfQotCi0KLWNvbnN0IHZweF9pbWFnZV90ICp2cHhfY29kZWNfZ2V0X3ByZXZpZXdfZnJhbWUodnB4X2NvZGVjX2N0eF90ICAgKmN0eCkKLXsKLSAgICB2cHhfaW1hZ2VfdCAqaW1nID0gTlVMTDsKLQotICAgIGlmIChjdHgpCi0gICAgewotICAgICAgICBpZiAoIWN0eC0+aWZhY2UgfHwgIWN0eC0+cHJpdikKLSAgICAgICAgICAgIGN0eC0+ZXJyID0gVlBYX0NPREVDX0VSUk9SOwotICAgICAgICBlbHNlIGlmICghKGN0eC0+aWZhY2UtPmNhcHMgJiBWUFhfQ09ERUNfQ0FQX0VOQ09ERVIpKQotICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOwotICAgICAgICBlbHNlIGlmICghY3R4LT5pZmFjZS0+ZW5jLmdldF9wcmV2aWV3KQotICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbWcgPSBjdHgtPmlmYWNlLT5lbmMuZ2V0X3ByZXZpZXcoY3R4LT5wcml2LT5hbGdfcHJpdik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGltZzsKLX0KLQotCi12cHhfZml4ZWRfYnVmX3QgKnZweF9jb2RlY19nZXRfZ2xvYmFsX2hlYWRlcnModnB4X2NvZGVjX2N0eF90ICAgKmN0eCkKLXsKLSAgICB2cHhfZml4ZWRfYnVmX3QgKmJ1ZiA9IE5VTEw7Ci0KLSAgICBpZiAoY3R4KQotICAgIHsKLSAgICAgICAgaWYgKCFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYpCi0gICAgICAgICAgICBjdHgtPmVyciA9IFZQWF9DT0RFQ19FUlJPUjsKLSAgICAgICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKLSAgICAgICAgICAgIGN0eC0+ZXJyID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICAgICAgZWxzZSBpZiAoIWN0eC0+aWZhY2UtPmVuYy5nZXRfZ2xvYl9oZHJzKQotICAgICAgICAgICAgY3R4LT5lcnIgPSBWUFhfQ09ERUNfSU5DQVBBQkxFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBidWYgPSBjdHgtPmlmYWNlLT5lbmMuZ2V0X2dsb2JfaGRycyhjdHgtPnByaXYtPmFsZ19wcml2KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmOwotfQotCi0KLXZweF9jb2RlY19lcnJfdCAgdnB4X2NvZGVjX2VuY19jb25maWdfc2V0KHZweF9jb2RlY19jdHhfdCAgICAgICAgICAgICpjdHgsCi0gICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgICpjZmcpCi17Ci0gICAgdnB4X2NvZGVjX2Vycl90IHJlczsKLQotICAgIGlmICghY3R4IHx8ICFjdHgtPmlmYWNlIHx8ICFjdHgtPnByaXYgfHwgIWNmZykKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU07Ci0gICAgZWxzZSBpZiAoIShjdHgtPmlmYWNlLT5jYXBzICYgVlBYX0NPREVDX0NBUF9FTkNPREVSKSkKLSAgICAgICAgcmVzID0gVlBYX0NPREVDX0lOQ0FQQUJMRTsKLSAgICBlbHNlCi0gICAgICAgIHJlcyA9IGN0eC0+aWZhY2UtPmVuYy5jZmdfc2V0KGN0eC0+cHJpdi0+YWxnX3ByaXYsIGNmZyk7Ci0KLSAgICByZXR1cm4gU0FWRV9TVEFUVVMoY3R4LCByZXMpOwotfQotCi0KLWludCB2cHhfY29kZWNfcGt0X2xpc3RfYWRkKHN0cnVjdCB2cHhfY29kZWNfcGt0X2xpc3QgKmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqcGt0KQotewotICAgIGlmIChsaXN0LT5jbnQgPCBsaXN0LT5tYXgpCi0gICAgewotICAgICAgICBsaXN0LT5wa3RzW2xpc3QtPmNudCsrXSA9ICpwa3Q7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi0KLWNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqdnB4X2NvZGVjX3BrdF9saXN0X2dldChzdHJ1Y3QgdnB4X2NvZGVjX3BrdF9saXN0ICpsaXN0LAotICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAgICAgICAgICAqaXRlcikKLXsKLSAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdDsKLQotICAgIGlmICghKCppdGVyKSkKLSAgICB7Ci0gICAgICAgICppdGVyID0gbGlzdC0+cGt0czsKLSAgICB9Ci0KLSAgICBwa3QgPSAoY29uc3Qgdm9pZCAqKSAqIGl0ZXI7Ci0KLSAgICBpZiAoKHNpemVfdCkocGt0IC0gbGlzdC0+cGt0cykgPCBsaXN0LT5jbnQpCi0gICAgICAgICppdGVyID0gcGt0ICsgMTsKLSAgICBlbHNlCi0gICAgICAgIHBrdCA9IE5VTEw7Ci0KLSAgICByZXR1cm4gcGt0OwotfQpkaWZmIC0tZ2l0IGEvdnB4L3NyYy92cHhfaW1hZ2UuYyBiL3ZweC9zcmMvdnB4X2ltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGUyNzAuLjAwMDAwMDAKLS0tIGEvdnB4L3NyYy92cHhfaW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKLQotc3RhdGljIHZweF9pbWFnZV90ICppbWdfYWxsb2NfaGVscGVyKHZweF9pbWFnZV90ICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfZm10X3QgZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZF93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZF9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgc3RyaWRlX2FsaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAqaW1nX2RhdGEpCi17Ci0KLSAgICB1bnNpZ25lZCBpbnQgIGgsIHcsIHMsIHhjcywgeWNzLCBicHM7Ci0gICAgaW50ICAgICAgICAgICBhbGlnbjsKLQotICAgIC8qIFRyZWF0IGFsaWduPT0wIGxpa2UgYWxpZ249PTEgKi8KLSAgICBpZiAoIXN0cmlkZV9hbGlnbikKLSAgICAgICAgc3RyaWRlX2FsaWduID0gMTsKLQotICAgIC8qIFZhbGlkYXRlIGFsaWdubWVudCAobXVzdCBiZSBwb3dlciBvZiAyKSAqLwotICAgIGlmIChzdHJpZGVfYWxpZ24gJiAoc3RyaWRlX2FsaWduIC0gMSkpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIC8qIEdldCBzYW1wbGUgc2l6ZSBmb3IgdGhpcyBmb3JtYXQgKi8KLSAgICBzd2l0Y2ggKGZtdCkKLSAgICB7Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9SR0IzMjoKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjMyX0xFOgotICAgIGNhc2UgVlBYX0lNR19GTVRfQVJHQjoKLSAgICBjYXNlIFZQWF9JTUdfRk1UX0FSR0JfTEU6Ci0gICAgICAgIGJwcyA9IDMyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjI0OgotICAgIGNhc2UgVlBYX0lNR19GTVRfQkdSMjQ6Ci0gICAgICAgIGJwcyA9IDI0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjU2NToKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjU2NV9MRToKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjU1NToKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjU1NV9MRToKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1VZVlk6Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9ZVVkyOgotICAgIGNhc2UgVlBYX0lNR19GTVRfWVZZVToKLSAgICAgICAgYnBzID0gMTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDoKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1lWMTI6Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9WUFhJNDIwOgotICAgIGNhc2UgVlBYX0lNR19GTVRfVlBYWVYxMjoKLSAgICAgICAgYnBzID0gMTI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJwcyA9IDE2OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBHZXQgY2hyb21hIHNoaWZ0IHZhbHVlcyBmb3IgdGhpcyBmb3JtYXQgKi8KLSAgICBzd2l0Y2ggKGZtdCkKLSAgICB7Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIwOgotICAgIGNhc2UgVlBYX0lNR19GTVRfWVYxMjoKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1ZQWEk0MjA6Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9WUFhZVjEyOgotICAgICAgICB4Y3MgPSAxOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICB4Y3MgPSAwOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGZtdCkKLSAgICB7Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIwOgotICAgIGNhc2UgVlBYX0lNR19GTVRfWVYxMjoKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1ZQWEk0MjA6Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9WUFhZVjEyOgotICAgICAgICB5Y3MgPSAxOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICB5Y3MgPSAwOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgc3RvcmFnZSBzaXplcyBnaXZlbiB0aGUgY2hyb21hIHN1YnNhbXBsaW5nICovCi0gICAgYWxpZ24gPSAoMSA8PCB4Y3MpIC0gMTsKLSAgICB3ID0gKGRfdyArIGFsaWduKSAmIH5hbGlnbjsKLSAgICBhbGlnbiA9ICgxIDw8IHljcykgLSAxOwotICAgIGggPSAoZF9oICsgYWxpZ24pICYgfmFsaWduOwotICAgIHMgPSAoZm10ICYgVlBYX0lNR19GTVRfUExBTkFSKSA/IHcgOiBicHMgKiB3IC8gODsKLSAgICBzID0gKHMgKyBzdHJpZGVfYWxpZ24gLSAxKSAmIH4oc3RyaWRlX2FsaWduIC0gMSk7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgbmV3IGltYWdlICovCi0gICAgaWYgKCFpbWcpCi0gICAgewotICAgICAgICBpbWcgPSAodnB4X2ltYWdlX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHZweF9pbWFnZV90KSk7Ci0KLSAgICAgICAgaWYgKCFpbWcpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICAgICAgaW1nLT5zZWxmX2FsbG9jZCA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbXNldChpbWcsIDAsIHNpemVvZih2cHhfaW1hZ2VfdCkpOwotICAgIH0KLQotICAgIGltZy0+aW1nX2RhdGEgPSBpbWdfZGF0YTsKLQotICAgIGlmICghaW1nX2RhdGEpCi0gICAgewotICAgICAgICBpbWctPmltZ19kYXRhID0gbWFsbG9jKChmbXQgJiBWUFhfSU1HX0ZNVF9QTEFOQVIpID8gaCAqIHcgKiBicHMgLyA4IDogaCAqIHMpOwotICAgICAgICBpbWctPmltZ19kYXRhX293bmVyID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWltZy0+aW1nX2RhdGEpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGltZy0+Zm10ID0gZm10OwotICAgIGltZy0+dyA9IHc7Ci0gICAgaW1nLT5oID0gaDsKLSAgICBpbWctPnhfY2hyb21hX3NoaWZ0ID0geGNzOwotICAgIGltZy0+eV9jaHJvbWFfc2hpZnQgPSB5Y3M7Ci0gICAgaW1nLT5icHMgPSBicHM7Ci0KLSAgICAvKiBDYWxjdWxhdGUgc3RyaWRlcyAqLwotICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9BTFBIQV0gPSBzOwotICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXSA9IHMgPj4geGNzOwotCi0gICAgLyogRGVmYXVsdCB2aWV3cG9ydCB0byBlbnRpcmUgaW1hZ2UgKi8KLSAgICBpZiAoIXZweF9pbWdfc2V0X3JlY3QoaW1nLCAwLCAwLCBkX3csIGRfaCkpCi0gICAgICAgIHJldHVybiBpbWc7Ci0KLWZhaWw6Ci0gICAgdnB4X2ltZ19mcmVlKGltZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZweF9pbWFnZV90ICp2cHhfaW1nX2FsbG9jKHZweF9pbWFnZV90ICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19mbXRfdCBmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGRfdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZF9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBzdHJpZGVfYWxpZ24pCi17Ci0gICAgcmV0dXJuIGltZ19hbGxvY19oZWxwZXIoaW1nLCBmbXQsIGRfdywgZF9oLCBzdHJpZGVfYWxpZ24sIE5VTEwpOwotfQotCi12cHhfaW1hZ2VfdCAqdnB4X2ltZ193cmFwKHZweF9pbWFnZV90ICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX2ZtdF90IGZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBkX3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZF9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHN0cmlkZV9hbGlnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAqaW1nX2RhdGEpCi17Ci0gICAgcmV0dXJuIGltZ19hbGxvY19oZWxwZXIoaW1nLCBmbXQsIGRfdywgZF9oLCBzdHJpZGVfYWxpZ24sIGltZ19kYXRhKTsKLX0KLQotaW50IHZweF9pbWdfc2V0X3JlY3QodnB4X2ltYWdlX3QgICppbWcsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHgsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHksCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHcsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGgpCi17Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICpkYXRhOwotCi0gICAgaWYgKHggKyB3IDw9IGltZy0+dyAmJiB5ICsgaCA8PSBpbWctPmgpCi0gICAgewotICAgICAgICBpbWctPmRfdyA9IHc7Ci0gICAgICAgIGltZy0+ZF9oID0gaDsKLQotICAgICAgICAvKiBDYWxjdWxhdGUgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICAgICAgaWYgKCEoaW1nLT5mbXQgJiBWUFhfSU1HX0ZNVF9QTEFOQVIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfUEFDS0VEXSA9Ci0gICAgICAgICAgICAgICAgaW1nLT5pbWdfZGF0YSArIHggKiBpbWctPmJwcyAvIDggKyB5ICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1BBQ0tFRF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhID0gaW1nLT5pbWdfZGF0YTsKLQotICAgICAgICAgICAgaWYgKGltZy0+Zm10ICYgVlBYX0lNR19GTVRfSEFTX0FMUEhBKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9BTFBIQV0gPQotICAgICAgICAgICAgICAgICAgICBkYXRhICsgeCArIHkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfQUxQSEFdOwotICAgICAgICAgICAgICAgIGRhdGEgKz0gaW1nLT5oICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX0FMUEhBXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldID0gZGF0YSArIHggKyB5ICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotICAgICAgICAgICAgZGF0YSArPSBpbWctPmggKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07Ci0KLSAgICAgICAgICAgIGlmICghKGltZy0+Zm10ICYgVlBYX0lNR19GTVRfVVZfRkxJUCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdID0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoeCA+PiBpbWctPnhfY2hyb21hX3NoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoeSA+PiBpbWctPnlfY2hyb21hX3NoaWZ0KSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKLSAgICAgICAgICAgICAgICBkYXRhICs9IChpbWctPmggPj4gaW1nLT55X2Nocm9tYV9zaGlmdCkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07Ci0gICAgICAgICAgICAgICAgaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdID0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoeCA+PiBpbWctPnhfY2hyb21hX3NoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoeSA+PiBpbWctPnlfY2hyb21hX3NoaWZ0KSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVl0gPSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh4ID4+IGltZy0+eF9jaHJvbWFfc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh5ID4+IGltZy0+eV9jaHJvbWFfc2hpZnQpICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIGRhdGEgKz0gKGltZy0+aCA+PiBpbWctPnlfY2hyb21hX3NoaWZ0KSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKLSAgICAgICAgICAgICAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfVV0gPSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh4ID4+IGltZy0+eF9jaHJvbWFfc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh5ID4+IGltZy0+eV9jaHJvbWFfc2hpZnQpICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotfQotCi12b2lkIHZweF9pbWdfZmxpcCh2cHhfaW1hZ2VfdCAqaW1nKQotewotICAgIC8qIE5vdGU6IEluIHRoZSBjYWxjdWxhdGlvbiBwb2ludGVyIGFkanVzdG1lbnQgY2FsY3VsYXRpb24sIHdlIHdhbnQgdGhlCi0gICAgICogcmhzIHRvIGJlIHByb21vdGVkIHRvIGEgc2lnbmVkIHR5cGUuIFNlY3Rpb24gNi4zLjEuOCBvZiB0aGUgSVNPIEM5OQotICAgICAqIHN0YW5kYXJkIGluZGljYXRlcyB0aGF0IGlmIHRoZSBhZGp1c3RtZW50IHBhcmFtZXRlciBpcyB1bnNpZ25lZCwgdGhlCi0gICAgICogc3RyaWRlIHBhcmFtZXRlciB3aWxsIGJlIHByb21vdGVkIHRvIHVuc2lnbmVkLCBjYXVzaW5nIGVycm9ycyB3aGVuCi0gICAgICogdGhlIGxocyBpcyBhIGxhcmdlciB0eXBlIHRoYW4gdGhlIHJocy4KLSAgICAgKi8KLSAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV0gKz0gKHNpZ25lZCkoaW1nLT5kX2ggLSAxKSAqIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKLSAgICBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV0gPSAtaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotCi0gICAgaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdICs9IChzaWduZWQpKChpbWctPmRfaCA+PiBpbWctPnlfY2hyb21hX3NoaWZ0KSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07Ci0gICAgaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdID0gLWltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKLQotICAgIGltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXSArPSAoc2lnbmVkKSgoaW1nLT5kX2ggPj4gaW1nLT55X2Nocm9tYV9zaGlmdCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOwotICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXSA9IC1pbWctPnN0cmlkZVtWUFhfUExBTkVfVl07Ci0KLSAgICBpbWctPnBsYW5lc1tWUFhfUExBTkVfQUxQSEFdICs9IChzaWduZWQpKGltZy0+ZF9oIC0gMSkgKiBpbWctPnN0cmlkZVtWUFhfUExBTkVfQUxQSEFdOwotICAgIGltZy0+c3RyaWRlW1ZQWF9QTEFORV9BTFBIQV0gPSAtaW1nLT5zdHJpZGVbVlBYX1BMQU5FX0FMUEhBXTsKLX0KLQotdm9pZCB2cHhfaW1nX2ZyZWUodnB4X2ltYWdlX3QgKmltZykKLXsKLSAgICBpZiAoaW1nKQotICAgIHsKLSAgICAgICAgaWYgKGltZy0+aW1nX2RhdGEgJiYgaW1nLT5pbWdfZGF0YV9vd25lcikKLSAgICAgICAgICAgIGZyZWUoaW1nLT5pbWdfZGF0YSk7Ci0KLSAgICAgICAgaWYgKGltZy0+c2VsZl9hbGxvY2QpCi0gICAgICAgICAgICBmcmVlKGltZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdnB4L3ZwOC5oIGIvdnB4L3ZwOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E1YzZlLi4wMDAwMDAwCi0tLSBhL3ZweC92cDguaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyohXGRlZmdyb3VwIHZwOCBWUDgKLSAqIFxpbmdyb3VwIGNvZGVjcwotICogVlA4IGlzIHZweCdzIG5ld2VzdCB2aWRlbyBjb21wcmVzc2lvbiBhbGdvcml0aG0gdGhhdCB1c2VzIG1vdGlvbgotICogY29tcGVuc2F0ZWQgcHJlZGljdGlvbiwgRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSAoRENUKSBjb2Rpbmcgb2YgdGhlCi0gKiBwcmVkaWN0aW9uIGVycm9yIHNpZ25hbCBhbmQgY29udGV4dCBkZXBlbmRlbnQgZW50cm9weSBjb2RpbmcgdGVjaG5pcXVlcwotICogYmFzZWQgb24gYXJpdGhtZXRpYyBwcmluY2lwbGVzLiBJdCBmZWF0dXJlczoKLSAqICAtIFlVViA0OjI6MCBpbWFnZSBmb3JtYXQKLSAqICAtIE1hY3JvLWJsb2NrIGJhc2VkIGNvZGluZyAoMTZ4MTYgbHVtYSBwbHVzIHR3byA4eDggY2hyb21hKQotICogIC0gMS80ICgxLzgpIHBpeGVsIGFjY3VyYWN5IG1vdGlvbiBjb21wZW5zYXRlZCBwcmVkaWN0aW9uCi0gKiAgLSA0eDQgRENUIHRyYW5zZm9ybQotICogIC0gMTI4IGxldmVsIGxpbmVhciBxdWFudGl6ZXIKLSAqICAtIEluIGxvb3AgZGVibG9ja2luZyBmaWx0ZXIKLSAqICAtIENvbnRleHQtYmFzZWQgZW50cm9weSBjb2RpbmcKLSAqCi0gKiBAewotICovCi0vKiFcZmlsZQotICogXGJyaWVmIFByb3ZpZGVzIGNvbnRyb2xzIGNvbW1vbiB0byBib3RoIHRoZSBWUDggZW5jb2RlciBhbmQgZGVjb2Rlci4KLSAqLwotI2lmbmRlZiBWUDhfSAotI2RlZmluZSBWUDhfSAotI2luY2x1ZGUgInZweC92cHhfY29kZWNfaW1wbF90b3AuaCIKLQotLyohXGJyaWVmIENvbnRyb2wgZnVuY3Rpb25zCi0gKgotICogVGhlIHNldCBvZiBtYWNyb3MgZGVmaW5lIHRoZSBjb250cm9sIGZ1bmN0aW9ucyBvZiBWUDggaW50ZXJmYWNlCi0gKi8KLWVudW0gdnA4X2NvbV9jb250cm9sX2lkCi17Ci0gICAgVlA4X1NFVF9SRUZFUkVOQ0UgICAgICAgICAgID0gMSwgICAgLyoqPCBwYXNzIGluIGFuIGV4dGVybmFsIGZyYW1lIGludG8gZGVjb2RlciB0byBiZSB1c2VkIGFzIHJlZmVyZW5jZSBmcmFtZSAqLwotICAgIFZQOF9DT1BZX1JFRkVSRU5DRSAgICAgICAgICA9IDIsICAgIC8qKjwgZ2V0IGEgY29weSBvZiByZWZlcmVuY2UgZnJhbWUgZnJvbSB0aGUgZGVjb2RlciAqLwotICAgIFZQOF9TRVRfUE9TVFBST0MgICAgICAgICAgICA9IDMsICAgIC8qKjwgc2V0IHRoZSBkZWNvZGVyJ3MgcG9zdCBwcm9jZXNzaW5nIHNldHRpbmdzICAqLwotICAgIFZQOF9TRVRfREJHX0NPTE9SX1JFRl9GUkFNRSA9IDQsICAgIC8qKjwgc2V0IHRoZSByZWZlcmVuY2UgZnJhbWVzIHRvIGNvbG9yIGZvciBlYWNoIG1hY3JvYmxvY2sgKi8KLSAgICBWUDhfU0VUX0RCR19DT0xPUl9NQl9NT0RFUyAgPSA1LCAgICAvKio8IHNldCB3aGljaCBtYWNybyBibG9jayBtb2RlcyB0byBjb2xvciAqLwotICAgIFZQOF9TRVRfREJHX0NPTE9SX0JfTU9ERVMgICA9IDYsICAgIC8qKjwgc2V0IHdoaWNoIGJsb2NrcyBtb2RlcyB0byBjb2xvciAqLwotICAgIFZQOF9TRVRfREJHX0RJU1BMQVlfTVYgICAgICA9IDcsICAgIC8qKjwgc2V0IHdoaWNoIG1vdGlvbiB2ZWN0b3IgbW9kZXMgdG8gZHJhdyAqLwotICAgIFZQOF9DT01NT05fQ1RSTF9JRF9NQVgsCi0gICAgVlA4X0RFQ09ERVJfQ1RSTF9JRF9TVEFSVCAgID0gMjU2LAotfTsKLQotLyohXGJyaWVmIHBvc3QgcHJvY2VzcyBmbGFncwotICoKLSAqIFRoZSBzZXQgb2YgbWFjcm9zIGRlZmluZSBWUDggZGVjb2RlciBwb3N0IHByb2Nlc3NpbmcgZmxhZ3MKLSAqLwotZW51bSB2cDhfcG9zdHByb2NfbGV2ZWwKLXsKLSAgICBWUDhfTk9GSUxURVJJTkcgICAgICAgICAgICAgPSAwLAotICAgIFZQOF9ERUJMT0NLICAgICAgICAgICAgICAgICA9IDE8PDAsCi0gICAgVlA4X0RFTUFDUk9CTE9DSyAgICAgICAgICAgID0gMTw8MSwKLSAgICBWUDhfQURETk9JU0UgICAgICAgICAgICAgICAgPSAxPDwyLAotICAgIFZQOF9ERUJVR19UWFRfRlJBTUVfSU5GTyAgICA9IDE8PDMsIC8qKjwgcHJpbnQgZnJhbWUgaW5mb3JtYXRpb24gKi8KLSAgICBWUDhfREVCVUdfVFhUX01CTEtfTU9ERVMgICAgPSAxPDw0LCAvKio8IHByaW50IG1hY3JvIGJsb2NrIG1vZGVzIG92ZXIgZWFjaCBtYWNybyBibG9jayAqLwotICAgIFZQOF9ERUJVR19UWFRfRENfRElGRiAgICAgICA9IDE8PDUsIC8qKjwgcHJpbnQgZGMgZGlmZiBmb3IgZWFjaCBtYWNybyBibG9jayAqLwotICAgIFZQOF9ERUJVR19UWFRfUkFURV9JTkZPICAgICA9IDE8PDYsIC8qKjwgcHJpbnQgdmlkZW8gcmF0ZSBpbmZvIChlbmNvZGVyIG9ubHkpICovCi19OwotCi0vKiFcYnJpZWYgcG9zdCBwcm9jZXNzIGZsYWdzCi0gKgotICogVGhpcyBkZWZpbmUgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZSB0aGUgcG9zdCBwcm9jZXNzaW5nIHNldHRpbmdzLiBGb3IKLSAqIHRoZSBiZXN0IG9iamVjdGl2ZSBtZWFzdXJlICh1c2luZyB0aGUgUFNOUiBtZXRyaWMpIHNldCBwb3N0X3Byb2NfZmxhZwotICogdG8gVlA4X0RFQkxPQ0sgYW5kIGRlYmxvY2tpbmdfbGV2ZWwgdG8gMS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB2cDhfcG9zdHByb2NfY2ZnCi17Ci0gICAgaW50IHBvc3RfcHJvY19mbGFnOyAgICAgICAgIC8qKjwgdGhlIHR5cGVzIG9mIHBvc3QgcHJvY2Vzc2luZyB0byBiZSBkb25lLCBzaG91bGQgYmUgY29tYmluYXRpb24gb2YgInZwOF9wb3N0cHJvY19sZXZlbCIgKi8KLSAgICBpbnQgZGVibG9ja2luZ19sZXZlbDsgICAgICAgLyoqPCB0aGUgc3RyZW5ndGggb2YgZGVibG9ja2luZywgdmFsaWQgcmFuZ2UgWzAsIDE2XSAqLwotICAgIGludCBub2lzZV9sZXZlbDsgICAgICAgICAgICAvKio8IHRoZSBzdHJlbmd0aCBvZiBhZGRpdGl2ZSBub2lzZSwgdmFsaWQgcmFuZ2UgWzAsIDE2XSAqLwotfSB2cDhfcG9zdHByb2NfY2ZnX3Q7Ci0KLS8qIVxicmllZiByZWZlcmVuY2UgZnJhbWUgdHlwZQotICoKLSAqIFRoZSBzZXQgb2YgbWFjcm9zIGRlZmluZSB0aGUgdHlwZSBvZiBWUDggcmVmZXJlbmNlIGZyYW1lcwotICovCi10eXBlZGVmIGVudW0gdnB4X3JlZl9mcmFtZV90eXBlCi17Ci0gICAgVlA4X0xBU1RfRlJBTUUgPSAxLAotICAgIFZQOF9HT0xEX0ZSQU1FID0gMiwKLSAgICBWUDhfQUxUUl9GUkFNRSA9IDQKLX0gdnB4X3JlZl9mcmFtZV90eXBlX3Q7Ci0KLS8qIVxicmllZiByZWZlcmVuY2UgZnJhbWUgZGF0YSBzdHJ1Y3QKLSAqCi0gKiBkZWZpbmUgdGhlIGRhdGEgc3RydWN0IHRvIGFjY2VzcyB2cDggcmVmZXJlbmNlIGZyYW1lcwotICovCi0KLXR5cGVkZWYgc3RydWN0IHZweF9yZWZfZnJhbWUKLXsKLSAgICB2cHhfcmVmX2ZyYW1lX3R5cGVfdCAgZnJhbWVfdHlwZTsgICAvKio8IHdoaWNoIHJlZmVyZW5jZSBmcmFtZSAqLwotICAgIHZweF9pbWFnZV90ICAgICAgICAgICBpbWc7ICAgICAgICAgIC8qKjwgcmVmZXJlbmNlIGZyYW1lIGRhdGEgaW4gaW1hZ2UgZm9ybWF0ICovCi19IHZweF9yZWZfZnJhbWVfdDsKLQotCi0vKiFcYnJpZWYgdnA4IGRlY29kZXIgY29udHJvbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZQotICoKLSAqIGRlZmluZXMgdGhlIGRhdGEgdHlwZSBmb3IgZWFjaCBvZiBWUDggZGVjb2RlciBjb250cm9sIGZ1bmN0aW9uIHJlcXVpcmVzCi0gKi8KLQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4X1NFVF9SRUZFUkVOQ0UsICAgICAgICAgICB2cHhfcmVmX2ZyYW1lX3QgKikKLVZQWF9DVFJMX1VTRV9UWVBFKFZQOF9DT1BZX1JFRkVSRU5DRSwgICAgICAgICAgdnB4X3JlZl9mcmFtZV90ICopCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhfU0VUX1BPU1RQUk9DLCAgICAgICAgICAgIHZwOF9wb3N0cHJvY19jZmdfdCAqKQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FLCBpbnQpCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhfU0VUX0RCR19DT0xPUl9NQl9NT0RFUywgIGludCkKLVZQWF9DVFJMX1VTRV9UWVBFKFZQOF9TRVRfREJHX0NPTE9SX0JfTU9ERVMsICAgaW50KQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4X1NFVF9EQkdfRElTUExBWV9NViwgICAgICBpbnQpCi0KLQotLyohIEB9IC0gZW5kIGRlZmdyb3VwIHZwOCAqLwotCi0jaWYgIWRlZmluZWQoVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUKSB8fCAhVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0gKiB0aGUgVlA4IDEuMC54IFNESy4gVVNFIElOIFBST0RVQ1RJT04gQ09ERSBJUyBOT1QgUkVDT01NRU5ERUQuCi0gKi8KLQotREVDTFNQRUNfREVQUkVDQVRFRCBleHRlcm4gdnB4X2NvZGVjX2lmYWNlX3QgdnB4X2NvZGVjX3ZwOF9hbGdvIERFUFJFQ0FURUQ7Ci0jZW5kaWYKLQotI2luY2x1ZGUgInZweC92cHhfY29kZWNfaW1wbF9ib3R0b20uaCIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnB4L3ZwOGN4LmggYi92cHgvdnA4Y3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmNmJkYy4uMDAwMDAwMAotLS0gYS92cHgvdnA4Y3guaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyohXGRlZmdyb3VwIHZwOF9lbmNvZGVyIFdlYk0gVlA4IEVuY29kZXIKLSAqIFxpbmdyb3VwIHZwOAotICoKLSAqIEB7Ci0gKi8KLSNpbmNsdWRlICJ2cDguaCIKLQotLyohXGZpbGUKLSAqIFxicmllZiBQcm92aWRlcyBkZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlIFZQOCBlbmNvZGVyIGFsZ29yaXRobSB3aXRoaW4gdGhlCi0gKiAgICAgICAgdnB4IENvZGVjIEludGVyZmFjZS4KLSAqLwotI2lmbmRlZiBWUDhDWF9ICi0jZGVmaW5lIFZQOENYX0gKLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjX2ltcGxfdG9wLmgiCi0KLS8qIVxuYW1lIEFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIFZQOAotICoKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBjYXBhYmlsaXR5IHRvIGVuY29kZSByYXcgVlA4IHN0cmVhbXMsIGFzIHdvdWxkCi0gKiBiZSBmb3VuZCBpbiBBVkkgZmlsZXMuCi0gKiBAewotICovCi1leHRlcm4gdnB4X2NvZGVjX2lmYWNlX3QgIHZweF9jb2RlY192cDhfY3hfYWxnbzsKLWV4dGVybiB2cHhfY29kZWNfaWZhY2VfdCogdnB4X2NvZGVjX3ZwOF9jeCh2b2lkKTsKLS8qIUB9IC0gZW5kIGFsZ29yaXRobSBpbnRlcmZhY2UgbWVtYmVyIGdyb3VwKi8KLQotCi0vKgotICogQWxnb3JpdGhtIEZsYWdzCi0gKi8KLQotLyohXGJyaWVmIERvbid0IHJlZmVyZW5jZSB0aGUgbGFzdCBmcmFtZQotICoKLSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGVuY29kZXIgd2lsbCBub3QgdXNlIHRoZSBsYXN0IGZyYW1lIGFzIGEKLSAqIHByZWRpY3Rvci4gV2hlbiBub3Qgc2V0LCB0aGUgZW5jb2RlciB3aWxsIGNob29zZSB3aGV0aGVyIHRvIHVzZSB0aGUKLSAqIGxhc3QgZnJhbWUgb3Igbm90IGF1dG9tYXRpY2FsbHkuCi0gKi8KLSNkZWZpbmUgVlA4X0VGTEFHX05PX1JFRl9MQVNUICAgICAgKDE8PDE2KQotCi0KLS8qIVxicmllZiBEb24ndCByZWZlcmVuY2UgdGhlIGdvbGRlbiBmcmFtZQotICoKLSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGVuY29kZXIgd2lsbCBub3QgdXNlIHRoZSBnb2xkZW4gZnJhbWUgYXMgYQotICogcHJlZGljdG9yLiBXaGVuIG5vdCBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIHdoZXRoZXIgdG8gdXNlIHRoZQotICogZ29sZGVuIGZyYW1lIG9yIG5vdCBhdXRvbWF0aWNhbGx5LgotICovCi0jZGVmaW5lIFZQOF9FRkxBR19OT19SRUZfR0YgICAgICAgICgxPDwxNykKLQotCi0vKiFcYnJpZWYgRG9uJ3QgcmVmZXJlbmNlIHRoZSBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lCi0gKgotICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciB3aWxsIG5vdCB1c2UgdGhlIGFsdCByZWYgZnJhbWUgYXMgYQotICogcHJlZGljdG9yLiBXaGVuIG5vdCBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIHdoZXRoZXIgdG8gdXNlIHRoZQotICogYWx0IHJlZiBmcmFtZSBvciBub3QgYXV0b21hdGljYWxseS4KLSAqLwotI2RlZmluZSBWUDhfRUZMQUdfTk9fUkVGX0FSRiAgICAgICAoMTw8MjEpCi0KLQotLyohXGJyaWVmIERvbid0IHVwZGF0ZSB0aGUgbGFzdCBmcmFtZQotICoKLSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGVuY29kZXIgd2lsbCBub3QgdXBkYXRlIHRoZSBsYXN0IGZyYW1lIHdpdGgKLSAqIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBmcmFtZS4KLSAqLwotI2RlZmluZSBWUDhfRUZMQUdfTk9fVVBEX0xBU1QgICAgICAoMTw8MTgpCi0KLQotLyohXGJyaWVmIERvbid0IHVwZGF0ZSB0aGUgZ29sZGVuIGZyYW1lCi0gKgotICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciB3aWxsIG5vdCB1cGRhdGUgdGhlIGdvbGRlbiBmcmFtZSB3aXRoCi0gKiB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCi0gKi8KLSNkZWZpbmUgVlA4X0VGTEFHX05PX1VQRF9HRiAgICAgICAgKDE8PDIyKQotCi0KLS8qIVxicmllZiBEb24ndCB1cGRhdGUgdGhlIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWUKLSAqCi0gKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgbm90IHVwZGF0ZSB0aGUgYWx0IHJlZiBmcmFtZSB3aXRoCi0gKiB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCi0gKi8KLSNkZWZpbmUgVlA4X0VGTEFHX05PX1VQRF9BUkYgICAgICAgKDE8PDIzKQotCi0KLS8qIVxicmllZiBGb3JjZSBnb2xkZW4gZnJhbWUgdXBkYXRlCi0gKgotICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZW5jb2RlciBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBmcmFtZQotICogdG8gdGhlIGdvbGRlbiBmcmFtZSBidWZmZXIuCi0gKi8KLSNkZWZpbmUgVlA4X0VGTEFHX0ZPUkNFX0dGICAgICAgICAgKDE8PDE5KQotCi0KLS8qIVxicmllZiBGb3JjZSBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIHVwZGF0ZQotICoKLSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGVuY29kZXIgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUKLSAqIHRvIHRoZSBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBWUDhfRUZMQUdfRk9SQ0VfQVJGICAgICAgICAoMTw8MjQpCi0KLQotLyohXGJyaWVmIERpc2FibGUgZW50cm9weSB1cGRhdGUKLSAqCi0gKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBlbmNvZGVyIHdpbGwgbm90IHVwZGF0ZSBpdHMgaW50ZXJuYWwgZW50cm9weQotICogbW9kZWwgYmFzZWQgb24gdGhlIGVudHJvcHkgb2YgdGhpcyBmcmFtZS4KLSAqLwotI2RlZmluZSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFkgICAoMTw8MjApCi0KLQotLyohXGJyaWVmIFZQOCBlbmNvZGVyIGNvbnRyb2wgZnVuY3Rpb25zCi0gKgotICogVGhpcyBzZXQgb2YgbWFjcm9zIGRlZmluZSB0aGUgY29udHJvbCBmdW5jdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgVlA4Ci0gKiBlbmNvZGVyIGludGVyZmFjZS4KLSAqCi0gKiBcc2EgI3ZweF9jb2RlY19jb250cm9sCi0gKi8KLWVudW0gdnA4ZV9lbmNfY29udHJvbF9pZAotewotICAgIFZQOEVfVVBEX0VOVFJPUFkgICAgICAgICAgID0gNSwgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgbW9kZSBvZiBlbnRyb3B5IHVwZGF0ZSBpbiBlbmNvZGVyICovCi0gICAgVlA4RV9VUERfUkVGRVJFTkNFLCAgICAgICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCByZWZlcmVuY2UgdXBkYXRlIG1vZGUgaW4gZW5jb2RlciAqLwotICAgIFZQOEVfVVNFX1JFRkVSRU5DRSwgICAgICAgICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgd2hpY2ggcmVmZXJlbmNlIGZyYW1lIGVuY29kZXIgY2FuIHVzZSAqLwotICAgIFZQOEVfU0VUX1JPSV9NQVAsICAgICAgICAgICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBwYXNzIGFuIFJPSSBtYXAgdG8gZW5jb2RlciAqLwotICAgIFZQOEVfU0VUX0FDVElWRU1BUCwgICAgICAgICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBwYXNzIGFuIEFjdGl2ZSBtYXAgdG8gZW5jb2RlciAqLwotICAgIFZQOEVfU0VUX1NDQUxFTU9ERSAgICAgICAgID0gMTEsIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgZW5jb2RlciBzY2FsaW5nIG1vZGUgKi8KLSAgICAvKiFcYnJpZWYgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgdnA4IGVuY29kZXIgY3B1dXNlZAotICAgICAqCi0gICAgICogQ2hhbmdlcyBpbiB0aGlzIHZhbHVlIGluZmx1ZW5jZXMsIGFtb25nIG90aGVycywgdGhlIGVuY29kZXIncyBzZWxlY3Rpb24KLSAgICAgKiBvZiBtb3Rpb24gZXN0aW1hdGlvbiBtZXRob2RzLiBWYWx1ZXMgZ3JlYXRlciB0aGFuIDAgd2lsbCBpbmNyZWFzZSBlbmNvZGVyCi0gICAgICogc3BlZWQgYXQgdGhlIGV4cGVuc2Ugb2YgcXVhbGl0eS4KLSAgICAgKiBUaGUgZnVsbCBzZXQgb2YgYWRqdXN0bWVudHMgY2FuIGJlIGZvdW5kIGluCi0gICAgICogb255eF9pZi5jOnZwOF9zZXRfc3BlZWRfZmVhdHVyZXMoKS4KLSAgICAgKiBcdG9kbyBMaXN0IGhpZ2hsaWdodHMgb2YgdGhlIGNoYW5nZXMgYXQgdmFyaW91cyBsZXZlbHMuCi0gICAgICoKLSAgICAgKiBcbm90ZSBWYWxpZCByYW5nZTogLTE2Li4xNiBvciB7LTE2Li4tNCwgNC4uMTZ9IHcvQ09ORklHX1JFQUxUSU1FX09OTFkKLSAgICAgKi8KLSAgICBWUDhFX1NFVF9DUFVVU0VEICAgICAgICAgICA9IDEzLAotICAgIFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUYsICAgICAgIC8qKjwgY29udHJvbCBmdW5jdGlvbiB0byBlbmFibGUgdnA4IHRvIGF1dG9tYXRpYyBzZXQgYW5kIHVzZSBhbHRyZWYgZnJhbWUgKi8KLSAgICBWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWSwgICAgICAvKio8IGNvbnRyb2wgZnVuY3Rpb24gdG8gc2V0IG5vaXNlIHNlbnNpdGl2aXR5ICovCi0gICAgVlA4RV9TRVRfU0hBUlBORVNTLCAgICAgICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCBzaGFycG5lc3MgKi8KLSAgICBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELCAgICAgICAvKio8IGNvbnRyb2wgZnVuY3Rpb24gdG8gc2V0IHRoZSB0aHJlc2hvbGQgZm9yIG1hY3JvYmxvY2tzIHRyZWF0ZWQgc3RhdGljICovCi0gICAgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB0aGUgbnVtYmVyIG9mIHRva2VuIHBhcnRpdGlvbnMgICovCi0gICAgVlA4RV9HRVRfTEFTVF9RVUFOVElaRVIsICAgICAgICAgLyoqPCByZXR1cm4gdGhlIHF1YW50aXplciBjaG9zZW4gYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGZvciB0aGUgbGFzdCBmcmFtZSB1c2luZyB0aGUgaW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICovCi0gICAgVlA4RV9HRVRfTEFTVF9RVUFOVElaRVJfNjQsICAgICAgLyoqPCByZXR1cm4gdGhlIHF1YW50aXplciBjaG9zZW4gYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGZvciB0aGUgbGFzdCBmcmFtZSwgdXNpbmcgdGhlIDAuLjYzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSBhcyB1c2VkIGJ5IHRoZSByY18qX3F1YW50aXplciBjb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgKi8KLSAgICBWUDhFX1NFVF9BUk5SX01BWEZSQU1FUywgICAgICAgICAvKio8IGNvbnRyb2wgZnVuY3Rpb24gdG8gc2V0IHRoZSBtYXggbnVtYmVyIG9mIGZyYW1lcyBibHVycmVkIGNyZWF0aW5nIGFyZiovCi0gICAgVlA4RV9TRVRfQVJOUl9TVFJFTkdUSCAsICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsdGVyIHN0cmVuZ3RoIGZvciB0aGUgYXJmICovCi0gICAgVlA4RV9TRVRfQVJOUl9UWVBFICAgICAsICAgICAgICAgLyoqPCBjb250cm9sIGZ1bmN0aW9uIHRvIHNldCB0aGUgdHlwZSBvZiBmaWx0ZXIgdG8gdXNlIGZvciB0aGUgYXJmKi8KLSAgICBWUDhFX1NFVF9UVU5JTkcsICAgICAgICAgICAgICAgICAvKio8IGNvbnRyb2wgZnVuY3Rpb24gdG8gc2V0IHZpc3VhbCB0dW5pbmcgKi8KLSAgICAvKiFcYnJpZWYgY29udHJvbCBmdW5jdGlvbiB0byBzZXQgY29uc3RyYWluZWQgcXVhbGl0eSBsZXZlbAotICAgICAqCi0gICAgICogXGF0dGVudGlvbiBGb3IgdGhpcyB2YWx1ZSB0byBiZSB1c2VkIHZweF9jb2RlY19lbmNfY2ZnX3Q6OmdfdXNhZ2UgbXVzdCBiZQotICAgICAqICAgICAgICAgICAgc2V0IHRvICNWUFhfQ1EuCi0gICAgICogXG5vdGUgVmFsaWQgcmFuZ2U6IDAuLjYzCi0gICAgICovCi0gICAgVlA4RV9TRVRfQ1FfTEVWRUwsCi19OwotCi0vKiFcYnJpZWYgdnB4IDEtRCBzY2FsaW5nIG1vZGUKLSAqCi0gKiBUaGlzIHNldCBvZiBjb25zdGFudHMgZGVmaW5lIDEtRCB2cHggc2NhbGluZyBtb2RlcwotICovCi10eXBlZGVmIGVudW0gdnB4X3NjYWxpbmdfbW9kZV8xZAotewotICAgIFZQOEVfTk9STUFMICAgICAgPSAwLAotICAgIFZQOEVfRk9VUkZJVkUgICAgPSAxLAotICAgIFZQOEVfVEhSRUVGSVZFICAgPSAyLAotICAgIFZQOEVfT05FVFdPICAgICAgPSAzCi19IFZQWF9TQ0FMSU5HX01PREU7Ci0KLQotLyohXGJyaWVmICB2cHggcmVnaW9uIG9mIGludGVyZXN0IG1hcAotICoKLSAqIFRoZXNlIGRlZmluZXMgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIHJlZ2lvbiBvZiBpbnRlcmVzdCBtYXAKLSAqCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdnB4X3JvaV9tYXAKLXsKLSAgICB1bnNpZ25lZCBjaGFyICpyb2lfbWFwOyAgICAgIC8qKjwgc3BlY2lmeSBhbiBpZCBiZXR3ZWVuIDAgYW5kIDMgZm9yIGVhY2ggMTZ4MTYgcmVnaW9uIHdpdGhpbiBhIGZyYW1lICovCi0gICAgdW5zaWduZWQgaW50ICAgcm93czsgICAgICAgICAvKio8IG51bWJlciBvZiByb3dzICovCi0gICAgdW5zaWduZWQgaW50ICAgY29sczsgICAgICAgICAvKio8IG51bWJlciBvZiBjb2xzICovCi0gICAgaW50ICAgICBkZWx0YV9xWzRdOyAgICAgICAgICAvKio8IHF1YW50aXplciBkZWx0YSBbLTY0LCA2NF0gb2ZmIGJhc2VsaW5lIGZvciByZWdpb25zIHdpdGggaWQgYmV0d2VlbiAwIGFuZCAzKi8KLSAgICBpbnQgICAgIGRlbHRhX2xmWzRdOyAgICAgICAgIC8qKjwgbG9vcCBmaWx0ZXIgc3RyZW5ndGggZGVsdGEgWy0zMiwgMzJdIGZvciByZWdpb25zIHdpdGggaWQgYmV0d2VlbiAwIGFuZCAzICovCi0gICAgdW5zaWduZWQgaW50ICAgc3RhdGljX3RocmVzaG9sZFs0XTsvKio8IHRocmVzaG9sZCBmb3IgcmVnaW9uIHRvIGJlIHRyZWF0ZWQgYXMgc3RhdGljICovCi19IHZweF9yb2lfbWFwX3Q7Ci0KLS8qIVxicmllZiAgdnB4IGFjdGl2ZSByZWdpb24gbWFwCi0gKgotICogVGhlc2UgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhY3RpdmUgcmVnaW9uIG1hcAotICoKLSAqLwotCi0KLXR5cGVkZWYgc3RydWN0IHZweF9hY3RpdmVfbWFwCi17Ci0gICAgdW5zaWduZWQgY2hhciAgKmFjdGl2ZV9tYXA7IC8qKjwgc3BlY2lmeSBhbiBvbiAoMSkgb3Igb2ZmICgwKSBlYWNoIDE2eDE2IHJlZ2lvbiB3aXRoaW4gYSBmcmFtZSAqLwotICAgIHVuc2lnbmVkIGludCAgICByb3dzOyAgICAgICAvKio8IG51bWJlciBvZiByb3dzICovCi0gICAgdW5zaWduZWQgaW50ICAgIGNvbHM7ICAgICAgIC8qKjwgbnVtYmVyIG9mIGNvbHMgKi8KLX0gdnB4X2FjdGl2ZV9tYXBfdDsKLQotLyohXGJyaWVmICB2cHggaW1hZ2Ugc2NhbGluZyBtb2RlCi0gKgotICogVGhpcyBkZWZpbmVzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgaW1hZ2Ugc2NhbGluZyBtb2RlCi0gKgotICovCi10eXBlZGVmIHN0cnVjdCB2cHhfc2NhbGluZ19tb2RlCi17Ci0gICAgVlBYX1NDQUxJTkdfTU9ERSAgICBoX3NjYWxpbmdfbW9kZTsgIC8qKjwgaG9yaXpvbnRhbCBzY2FsaW5nIG1vZGUgKi8KLSAgICBWUFhfU0NBTElOR19NT0RFICAgIHZfc2NhbGluZ19tb2RlOyAgLyoqPCB2ZXJ0aWNhbCBzY2FsaW5nIG1vZGUgICAqLwotfSB2cHhfc2NhbGluZ19tb2RlX3Q7Ci0KLS8qIVxicmllZiBWUDggZW5jb2RpbmcgbW9kZQotICoKLSAqIFRoaXMgZGVmaW5lcyBWUDggZW5jb2RpbmcgbW9kZQotICoKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgVlA4X0JFU1RfUVVBTElUWV9FTkNPRElORywKLSAgICBWUDhfR09PRF9RVUFMSVRZX0VOQ09ESU5HLAotICAgIFZQOF9SRUFMX1RJTUVfRU5DT0RJTkcKLX0gdnA4ZV9lbmNvZGluZ19tb2RlOwotCi0vKiFcYnJpZWYgVlA4IHRva2VuIHBhcnRpdGlvbiBtb2RlCi0gKgotICogVGhpcyBkZWZpbmVzIFZQOCBwYXJ0aXRpb25pbmcgbW9kZSBmb3IgY29tcHJlc3NlZCBkYXRhLCBpLmUuLCB0aGUgbnVtYmVyIG9mCi0gKiBzdWItc3RyZWFtcyBpbiB0aGUgYml0c3RyZWFtLsKgVXNlZCBmb3IgcGFyYWxsZWxpemVkIGRlY29kaW5nLgotICoKLSAqLwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBWUDhfT05FX1RPS0VOUEFSVElUSU9OICAgPSAwLAotICAgIFZQOF9UV09fVE9LRU5QQVJUSVRJT04gICA9IDEsCi0gICAgVlA4X0ZPVVJfVE9LRU5QQVJUSVRJT04gID0gMiwKLSAgICBWUDhfRUlHSFRfVE9LRU5QQVJUSVRJT04gPSAzLAotfSB2cDhlX3Rva2VuX3BhcnRpdGlvbnM7Ci0KLQotLyohXGJyaWVmIFZQOCBtb2RlbCB0dW5pbmcgcGFyYW1ldGVycwotICoKLSAqIENoYW5nZXMgdGhlIGVuY29kZXIgdG8gdHVuZSBmb3IgY2VydGFpbiB0eXBlcyBvZiBpbnB1dCBtYXRlcmlhbC4KLSAqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIFZQOF9UVU5FX1BTTlIsCi0gICAgVlA4X1RVTkVfU1NJTQotfSB2cDhlX3R1bmluZzsKLQotCi0vKiFcYnJpZWYgVlA4IGVuY29kZXIgY29udHJvbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZQotICoKLSAqIERlZmluZXMgdGhlIGRhdGEgdHlwZXMgdGhhdCBWUDhFIGNvbnRyb2wgZnVuY3Rpb25zIHRha2UuIE5vdGUgdGhhdAotICogYWRkaXRpb25hbCBjb21tb24gY29udHJvbHMgYXJlIGRlZmluZWQgaW4gdnA4LmgKLSAqCi0gKi8KLQotCi0vKiBUaGVzZSBjb250cm9scyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgZmxhZ3MgcGFyYW1ldGVyIHRvCi0gKiB2cHhfY29kZWNfZW5jb2RlKCkuIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBWUDhfRUZMQUdfKiBhYm92ZS4KLSAqLwotVlBYX0NUUkxfVVNFX1RZUEVfREVQUkVDQVRFRChWUDhFX1VQRF9FTlRST1BZLCAgICAgICAgICAgIGludCkKLVZQWF9DVFJMX1VTRV9UWVBFX0RFUFJFQ0FURUQoVlA4RV9VUERfUkVGRVJFTkNFLCAgICAgICAgICBpbnQpCi1WUFhfQ1RSTF9VU0VfVFlQRV9ERVBSRUNBVEVEKFZQOEVfVVNFX1JFRkVSRU5DRSwgICAgICAgICAgaW50KQotCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9ST0lfTUFQLCAgICAgICAgICAgIHZweF9yb2lfbWFwX3QgKikKLVZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX0FDVElWRU1BUCwgICAgICAgICAgdnB4X2FjdGl2ZV9tYXBfdCAqKQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfU0NBTEVNT0RFLCAgICAgICAgICB2cHhfc2NhbGluZ19tb2RlX3QgKikKLQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfQ1BVVVNFRCwgICAgICAgICAgICBpbnQpCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLCAgIHVuc2lnbmVkIGludCkKLVZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZLCAgdW5zaWduZWQgaW50KQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfU0hBUlBORVNTLCAgICAgICAgICB1bnNpZ25lZCBpbnQpCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELCAgIHVuc2lnbmVkIGludCkKLVZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsICAgdnA4ZV90b2tlbl9wYXJ0aXRpb25zKQotCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9BUk5SX01BWEZSQU1FUywgICAgIHVuc2lnbmVkIGludCkKLVZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfU0VUX0FSTlJfU1RSRU5HVEggLCAgICAgdW5zaWduZWQgaW50KQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfQVJOUl9UWVBFICAgICAsICAgICB1bnNpZ25lZCBpbnQpCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhFX1NFVF9UVU5JTkcsICAgICAgICAgICAgIHZwOGVfdHVuaW5nKQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4RV9TRVRfQ1FfTEVWRUwgICAgICwgICAgICB1bnNpZ25lZCBpbnQpCi0KLVZQWF9DVFJMX1VTRV9UWVBFKFZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSLCAgICAgaW50ICopCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhFX0dFVF9MQVNUX1FVQU5USVpFUl82NCwgIGludCAqKQotCi0vKiEgQH0gLSBlbmQgZGVmZ3JvdXAgdnA4X2VuY29kZXIgKi8KLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweC92cDhkeC5oIGIvdnB4L3ZwOGR4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2FlZjcuLjAwMDAwMDAKLS0tIGEvdnB4L3ZwOGR4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZwOC5oIgotCi0vKiFcZGVmZ3JvdXAgdnA4X2RlY29kZXIgV2ViTSBWUDggRGVjb2RlcgotICogXGluZ3JvdXAgdnA4Ci0gKgotICogQHsKLSAqLwotLyohXGZpbGUKLSAqIFxicmllZiBQcm92aWRlcyBkZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlIFZQOCBhbGdvcml0aG0gd2l0aGluIHRoZSB2cHggRGVjb2RlcgotICogICAgICAgIGludGVyZmFjZS4KLSAqLwotI2lmbmRlZiBWUDhEWF9ICi0jZGVmaW5lIFZQOERYX0gKLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjX2ltcGxfdG9wLmgiCi0KLS8qIVxuYW1lIEFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIFZQOAotICoKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBjYXBhYmlsaXR5IHRvIGRlY29kZSByYXcgVlA4IHN0cmVhbXMsIGFzIHdvdWxkCi0gKiBiZSBmb3VuZCBpbiBBVkkgZmlsZXMgYW5kIG90aGVyIG5vbi1GbGFzaCB1c2VzLgotICogQHsKLSAqLwotZXh0ZXJuIHZweF9jb2RlY19pZmFjZV90ICB2cHhfY29kZWNfdnA4X2R4X2FsZ287Ci1leHRlcm4gdnB4X2NvZGVjX2lmYWNlX3QqIHZweF9jb2RlY192cDhfZHgodm9pZCk7Ci0vKiFAfSAtIGVuZCBhbGdvcml0aG0gaW50ZXJmYWNlIG1lbWJlciBncm91cCovCi0KLS8qIEluY2x1ZGUgY29udHJvbHMgY29tbW9uIHRvIGJvdGggdGhlIGVuY29kZXIgYW5kIGRlY29kZXIgKi8KLSNpbmNsdWRlICJ2cDguaCIKLQotCi0vKiFcYnJpZWYgVlA4IGRlY29kZXIgY29udHJvbCBmdW5jdGlvbnMKLSAqCi0gKiBUaGlzIHNldCBvZiBtYWNyb3MgZGVmaW5lIHRoZSBjb250cm9sIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBWUDgKLSAqIGRlY29kZXIgaW50ZXJmYWNlLgotICoKLSAqIFxzYSAjdnB4X2NvZGVjX2NvbnRyb2wKLSAqLwotZW51bSB2cDhfZGVjX2NvbnRyb2xfaWQKLXsKLSAgICAvKiogY29udHJvbCBmdW5jdGlvbiB0byBnZXQgaW5mbyBvbiB3aGljaCByZWZlcmVuY2UgZnJhbWVzIHdlcmUgdXBkYXRlZAotICAgICAqICBieSB0aGUgbGFzdCBkZWNvZGUKLSAgICAgKi8KLSAgICBWUDhEX0dFVF9MQVNUX1JFRl9VUERBVEVTID0gVlA4X0RFQ09ERVJfQ1RSTF9JRF9TVEFSVCwKLQotICAgIC8qKiBjaGVjayBpZiB0aGUgaW5kaWNhdGVkIGZyYW1lIGlzIGNvcnJ1cHRlZCAqLwotICAgIFZQOERfR0VUX0ZSQU1FX0NPUlJVUFRFRCwKLQotICAgIFZQOF9ERUNPREVSX0NUUkxfSURfTUFYCi19IDsKLQotCi0vKiFcYnJpZWYgVlA4IGRlY29kZXIgY29udHJvbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZQotICoKLSAqIERlZmluZXMgdGhlIGRhdGEgdHlwZXMgdGhhdCBWUDhEIGNvbnRyb2wgZnVuY3Rpb25zIHRha2UuIE5vdGUgdGhhdAotICogYWRkaXRpb25hbCBjb21tb24gY29udHJvbHMgYXJlIGRlZmluZWQgaW4gdnA4LmgKLSAqCi0gKi8KLQotCi1WUFhfQ1RSTF9VU0VfVFlQRShWUDhEX0dFVF9MQVNUX1JFRl9VUERBVEVTLCAgIGludCAqKQotVlBYX0NUUkxfVVNFX1RZUEUoVlA4RF9HRVRfRlJBTUVfQ09SUlVQVEVELCAgICBpbnQgKikKLQotCi0vKiEgQH0gLSBlbmQgZGVmZ3JvdXAgdnA4X2RlY29kZXIgKi8KLQotCi0jaW5jbHVkZSAidnB4L3ZweF9jb2RlY19pbXBsX2JvdHRvbS5oIgotI2VuZGlmCmRpZmYgLS1naXQgYS92cHgvdnA4ZS5oIGIvdnB4L3ZwOGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmY2UzMy4uMDAwMDAwMAotLS0gYS92cHgvdnA4ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdHVicyBmb3IgYXBwbGljYXRpb25zIHVzaW5nCi0gKiB0aGUgVlA4IHZlcnNpb24gMS4wIEFQSS4KLSAqLwotI2lmbmRlZiBWUDhFX0gKLSNkZWZpbmUgVlA4RV9ICi0jaW5jbHVkZSAidnB4L3ZweF9jb2RlY19pbXBsX3RvcC5oIgotCi0jaWYgZGVmaW5lZChWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQpICYmIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVAotI2Vycm9yICJCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBkaXNhYmxlZDogZG9uJ3QgaW5jbHVkZSB2cDhlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgInZwOGN4LmgiCi1ERUNMU1BFQ19ERVBSRUNBVEVEIGV4dGVybiB2cHhfY29kZWNfaWZhY2VfdCB2cHhfZW5jX3ZwOF9hbGdvIERFUFJFQ0FURUQ7Ci0KLQotZW51bQotewotICAgIFZQOEVfU0VUX1JFRkVSRU5DRSAgICAgPSBWUDhfU0VUX1JFRkVSRU5DRSwKLSAgICBWUDhFX0NPUFlfUkVGRVJFTkNFICAgID0gVlA4X0NPUFlfUkVGRVJFTkNFLAotICAgIFZQOEVfU0VUX1BSRVZJRVdQUCAgICAgPSBWUDhfU0VUX1BPU1RQUk9DLAotICAgIFZQOEVfU0VUX0ZMVVNIRkxBRyAgICAgPSA0LAotICAgIFZQOEVfU0VUX0ZSQU1FVFlQRSAgICAgPSAxMCwKLSAgICBWUDhFX1NFVF9FTkNPRElOR19NT0RFID0gMTIKLX07Ci0KLSNkZWZpbmUgTk9STUFMX0ZSQU1FICAgKDApCi0jZGVmaW5lIEtFWV9GUkFNRSAgICAgICgxKQotCi0vKiBDaGFuZ2UgVlA4RSB0byBWUDggdG8gZ2V0IHRoZSB1bmRlcHJlY2F0ZWQgdmVyc2lvbiBvZiB0aGVzZSAoZGVmaW5lZCBpbgotICogdnA4LmgpCi0gKi8KLVZQWF9DVFJMX1VTRV9UWVBFX0RFUFJFQ0FURUQoVlA4RV9TRVRfUkVGRVJFTkNFLCAgIHZweF9yZWZfZnJhbWVfdCAqKQotVlBYX0NUUkxfVVNFX1RZUEVfREVQUkVDQVRFRChWUDhFX0NPUFlfUkVGRVJFTkNFLCAgdnB4X3JlZl9mcmFtZV90ICopCi1WUFhfQ1RSTF9VU0VfVFlQRV9ERVBSRUNBVEVEKFZQOEVfU0VUX1BSRVZJRVdQUCwgICB2cDhfcG9zdHByb2NfY2ZnX3QgKikKLQotCi0vKiBGbHVzaCBpcyBkb25lIGJ5IGNhbGxpbmcgdnB4X2NvZGVjX2VuY29kZSB3aXRoIGEgTlVMTCBpbnB1dCBpbWFnZS4gKi8KLVZQWF9DVFJMX1VTRV9UWVBFX0RFUFJFQ0FURUQoVlA4RV9TRVRfRkxVU0hGTEFHLCAgICAgICAgICBpbnQpCi0KLQotLyogRnJhbWUgdHlwZSBpcyBzZXQgd2l0aCBhIGZsYWcgdG8gdnB4X2NvZGVjX2NvbnRyb2wuIFNlZSBWUFhfRUZMQUdfRk9SQ0VfS0YKLSAqLwotVlBYX0NUUkxfVVNFX1RZUEVfREVQUkVDQVRFRChWUDhFX1NFVF9GUkFNRVRZUEUsICAgICAgICAgIGludCkKLQotCi0vKiBUaGlzIGNvbnRyb2wgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgZHVyYXRpb24gcGFyYW1ldGVyIHRvCi0gKiB2cHhfY29kZWNfZW5jb2RlKCkuIFVzZSB0aGUgI1ZQWF9ETF9SRUFMVElNRSwgI1ZQWF9ETF9HT09EX1FVQUxJVFksCi0gKiAjVlBYX0RMX0JFU1RfUVVBTElUWSBjb25zdGFudHMgdG8gdGhhdCBwYXJhbWV0ZXIgaW5zdGVhZC4KLSAqLwotVlBYX0NUUkxfVVNFX1RZUEVfREVQUkVDQVRFRChWUDhFX1NFVF9FTkNPRElOR19NT0RFLCB2cDhlX2VuY29kaW5nX21vZGUpCi0jaW5jbHVkZSAidnB4L3ZweF9jb2RlY19pbXBsX2JvdHRvbS5oIgotI2VuZGlmCmRpZmYgLS1naXQgYS92cHgvdnB4X2NvZGVjLm1rIGIvdnB4L3ZweF9jb2RlYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxZDc0Yi4uMDAwMDAwMAotLS0gYS92cHgvdnB4X2NvZGVjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMKLSMjICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0jIyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotIyMgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSMjICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSMjCi0KLQotQVBJX0VYUE9SVFMgKz0gZXhwb3J0cwotCi1BUElfU1JDUy0kKENPTkZJR19ERUNPREVSUykgKz0gc3JjL3ZweF9kZWNvZGVyLmMKLUFQSV9TUkNTLSQoQ09ORklHX0RFQ09ERVJTKSArPSBzcmMvdnB4X2RlY29kZXJfY29tcGF0LmMKLUFQSV9TUkNTLSQoQ09ORklHX0RFQ09ERVJTKSArPSB2cHhfZGVjb2Rlci5oCi1BUElfU1JDUy0kKENPTkZJR19ERUNPREVSUykgKz0gdnB4X2RlY29kZXJfY29tcGF0LmgKLUFQSV9TUkNTLSQoQ09ORklHX0VOQ09ERVJTKSArPSBzcmMvdnB4X2VuY29kZXIuYwotQVBJX1NSQ1MtJChDT05GSUdfRU5DT0RFUlMpICs9IHZweF9lbmNvZGVyLmgKLUFQSV9TUkNTLXllcyAgICAgICAgICAgICAgICArPSBpbnRlcm5hbC92cHhfY29kZWNfaW50ZXJuYWwuaAotQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHNyYy92cHhfY29kZWMuYwotQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHNyYy92cHhfaW1hZ2UuYwotQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHZweF9jb2RlYy5oCi1BUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gdnB4X2NvZGVjLm1rCi1BUElfU1JDUy15ZXMgICAgICAgICAgICAgICAgKz0gdnB4X2NvZGVjX2ltcGxfYm90dG9tLmgKLUFQSV9TUkNTLXllcyAgICAgICAgICAgICAgICArPSB2cHhfY29kZWNfaW1wbF90b3AuaAotQVBJX1NSQ1MteWVzICAgICAgICAgICAgICAgICs9IHZweF9pbWFnZS5oCmRpZmYgLS1naXQgYS92cHgvdnB4X2RlY29kZXIuaCBiL3ZweC92cHhfZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM2NzVhLi4wMDAwMDAwCi0tLSBhL3ZweC92cHhfZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiFcZGVmZ3JvdXAgZGVjb2RlciBEZWNvZGVyIEFsZ29yaXRobSBJbnRlcmZhY2UKLSAqIFxpbmdyb3VwIGNvZGVjCi0gKiBUaGlzIGFic3RyYWN0aW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBkZWNvZGVyIHRvIGVhc2lseSBzdXBwb3J0Ci0gKiBtdWx0aXBsZSB2aWRlbyBmb3JtYXRzIHdpdGggbWluaW1hbCBjb2RlIGR1cGxpY2F0aW9uLiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzCi0gKiB0aGUgaW50ZXJmYWNlIGNvbW1vbiB0byBhbGwgZGVjb2RlcnMuCi0gKiBAewotICovCi0KLS8qIVxmaWxlCi0gKiBcYnJpZWYgRGVzY3JpYmVzIHRoZSBkZWNvZGVyIGFsZ29yaXRobSBpbnRlcmZhY2UgdG8gYXBwbGljYXRpb25zLgotICoKLSAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGFuIGFwcGxpY2F0aW9uIGFuZCBhCi0gKiB2aWRlbyBkZWNvZGVyIGFsZ29yaXRobS4KLSAqCi0gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBWUFhfREVDT0RFUl9ICi0jZGVmaW5lIFZQWF9ERUNPREVSX0gKLSNpbmNsdWRlICJ2cHhfY29kZWMuaCIKLQotICAgIC8qIVxicmllZiBDdXJyZW50IEFCSSB2ZXJzaW9uIG51bWJlcgotICAgICAqCi0gICAgICogXGludGVybmFsCi0gICAgICogSWYgdGhpcyBmaWxlIGlzIGFsdGVyZWQgaW4gYW55IHdheSB0aGF0IGNoYW5nZXMgdGhlIEFCSSwgdGhpcyB2YWx1ZQotICAgICAqIG11c3QgYmUgYnVtcGVkLiAgRXhhbXBsZXMgaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgY2hhbmdpbmcKLSAgICAgKiB0eXBlcywgcmVtb3Zpbmcgb3IgcmVhc3NpZ25pbmcgZW51bXMsIGFkZGluZy9yZW1vdmluZy9yZWFycmFuZ2luZwotICAgICAqIGZpZWxkcyB0byBzdHJ1Y3R1cmVzCi0gICAgICovCi0jZGVmaW5lIFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OICgyICsgVlBYX0NPREVDX0FCSV9WRVJTSU9OKSAvKio8XGhpZGVpbml0aWFsaXplciovCi0KLSAgICAvKiEgXGJyaWVmIERlY29kZXIgY2FwYWJpbGl0aWVzIGJpdGZpZWxkCi0gICAgICoKLSAgICAgKiAgRWFjaCBkZWNvZGVyIGFkdmVydGlzZXMgdGhlIGNhcGFiaWxpdGllcyBpdCBzdXBwb3J0cyBhcyBwYXJ0IG9mIGl0cwotICAgICAqICA6OnZweF9jb2RlY19pZmFjZV90IGludGVyZmFjZSBzdHJ1Y3R1cmUuIENhcGFiaWxpdGllcyBhcmUgZXh0cmEgaW50ZXJmYWNlcwotICAgICAqICBvciBmdW5jdGlvbmFsaXR5LCBhbmQgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYSBkZWNvZGVyLgotICAgICAqCi0gICAgICogIFRoZSBhdmFpbGFibGUgZmxhZ3MgYXJlIHNwZWNpZmllZCBieSBWUFhfQ09ERUNfQ0FQXyogZGVmaW5lcy4KLSAgICAgKi8KLSNkZWZpbmUgVlBYX0NPREVDX0NBUF9QVVRfU0xJQ0UgIDB4MTAwMDAgLyoqPCBXaWxsIGlzc3VlIHB1dF9zbGljZSBjYWxsYmFja3MgKi8KLSNkZWZpbmUgVlBYX0NPREVDX0NBUF9QVVRfRlJBTUUgIDB4MjAwMDAgLyoqPCBXaWxsIGlzc3VlIHB1dF9mcmFtZSBjYWxsYmFja3MgKi8KLSNkZWZpbmUgVlBYX0NPREVDX0NBUF9QT1NUUFJPQyAgIDB4NDAwMDAgLyoqPCBDYW4gcG9zdHByb2Nlc3MgZGVjb2RlZCBmcmFtZSAqLwotCi0gICAgLyohIFxicmllZiBJbml0aWFsaXphdGlvbi10aW1lIEZlYXR1cmUgRW5hYmxpbmcKLSAgICAgKgotICAgICAqICBDZXJ0YWluIGNvZGVjIGZlYXR1cmVzIG11c3QgYmUga25vd24gYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgdG8gYWxsb3cgZm9yCi0gICAgICogIHByb3BlciBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICAgKgotICAgICAqICBUaGUgYXZhaWxhYmxlIGZsYWdzIGFyZSBzcGVjaWZpZWQgYnkgVlBYX0NPREVDX1VTRV8qIGRlZmluZXMuCi0gICAgICovCi0jZGVmaW5lIFZQWF9DT0RFQ19VU0VfUE9TVFBST0MgICAweDEwMDAwIC8qKjwgUG9zdHByb2Nlc3MgZGVjb2RlZCBmcmFtZSAqLwotCi0gICAgLyohXGJyaWVmIFN0cmVhbSBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHF1ZXJ5IG9yIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBkZWNvZGVkCi0gICAgICogc3RyZWFtLiBBbGdvcml0aG1zIG1heSBleHRlbmQgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBkYXRhIHNwZWNpZmljCi0gICAgICogdG8gdGhlaXIgYml0c3RyZWFtIGJ5IHNldHRpbmcgdGhlIHN6IG1lbWJlciBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHR5cGVkZWYgc3RydWN0IHZweF9jb2RlY19zdHJlYW1faW5mbwotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHN6OyAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlICovCi0gICAgICAgIHVuc2lnbmVkIGludCB3OyAgICAgIC8qKjwgV2lkdGggKG9yIDAgZm9yIHVua25vd24vZGVmYXVsdCkgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGg7ICAgICAgLyoqPCBIZWlnaHQgKG9yIDAgZm9yIHVua25vd24vZGVmYXVsdCkgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGlzX2tmOyAgLyoqPCBDdXJyZW50IGZyYW1lIGlzIGEga2V5ZnJhbWUgKi8KLSAgICB9IHZweF9jb2RlY19zdHJlYW1faW5mb190OwotCi0gICAgLyogUkVRVUlSRUQgRlVOQ1RJT05TCi0gICAgICoKLSAgICAgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGFsbCBkZWNvZGVycy4KLSAgICAgKiBUaGV5IHJlcHJlc2VudCB0aGUgYmFzZSBjYXNlIGZ1bmN0aW9uYWxpdHkgZXhwZWN0ZWQgb2YgYWxsIGRlY29kZXJzLgotICAgICAqLwotCi0KLSAgICAvKiFcYnJpZWYgSW5pdGlhbGl6YXRpb24gQ29uZmlndXJhdGlvbnMKLSAgICAgKgotICAgICAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbml0IHRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZQotICAgICAqIGRlY29kZXIuCi0gICAgICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X2NvZGVjX2RlY19jZmcKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0aHJlYWRzOyAvKio8IE1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLCBkZWZhdWx0IDEgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHc7ICAgICAgLyoqPCBXaWR0aCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaDsgICAgICAvKio8IEhlaWdodCAqLwotICAgIH0gdnB4X2NvZGVjX2RlY19jZmdfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9jb2RlY19kZWNfY2ZnICovCi0KLQotICAgIC8qIVxicmllZiBJbml0aWFsaXplIGEgZGVjb2RlciBpbnN0YW5jZQotICAgICAqCi0gICAgICogSW5pdGlhbGl6ZXMgYSBkZWNvZGVyIGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGludGVyZmFjZS4gQXBwbGljYXRpb25zCi0gICAgICogc2hvdWxkIGNhbGwgdGhlIHZweF9jb2RlY19kZWNfaW5pdCBjb252ZW5pZW5jZSBtYWNybyBpbnN0ZWFkIG9mIHRoaXMKLSAgICAgKiBmdW5jdGlvbiBkaXJlY3RseSwgdG8gZW5zdXJlIHRoYXQgdGhlIEFCSSB2ZXJzaW9uIG51bWJlciBwYXJhbWV0ZXIKLSAgICAgKiBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAgICAgKgotICAgICAqIEluIFhNQSBtb2RlIChhY3RpdmF0ZWQgYnkgc2V0dGluZyBWUFhfQ09ERUNfVVNFX1hNQSBpbiB0aGUgZmxhZ3MKLSAgICAgKiBwYXJhbWV0ZXIpLCB0aGUgc3RvcmFnZSBwb2ludGVkIHRvIGJ5IHRoZSBjZmcgcGFyYW1ldGVyIG11c3QgYmUKLSAgICAgKiBrZXB0IHJlYWRhYmxlIGFuZCBzdGFibGUgdW50aWwgYWxsIG1lbW9yeSBtYXBzIGhhdmUgYmVlbiBzZXQuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dC4KLSAgICAgKiBccGFyYW1baW5dICAgIGlmYWNlICAgUG9pbnRlciB0byB0aGUgYWxnb3JpdGhtIGludGVyZmFjZSB0byB1c2UuCi0gICAgICogXHBhcmFtW2luXSAgICBjZmcgICAgIENvbmZpZ3VyYXRpb24gdG8gdXNlLCBpZiBrbm93bi4gTWF5IGJlIE5VTEwuCi0gICAgICogXHBhcmFtW2luXSAgICBmbGFncyAgIEJpdGZpZWxkIG9mIFZQWF9DT0RFQ19VU0VfKiBmbGFncwotICAgICAqIFxwYXJhbVtpbl0gICAgdmVyICAgICBBQkkgdmVyc2lvbiBudW1iZXIuIE11c3QgYmUgc2V0IHRvCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCi0gICAgICogICAgIFRoZSBkZWNvZGVyIGFsZ29yaXRobSBpbml0aWFsaXplZC4KLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfTUVNX0VSUk9SCi0gICAgICogICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4KLSAgICAgKi8KLSAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2RlY19pbml0X3Zlcih2cHhfY29kZWNfY3R4X3QgICAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19pZmFjZV90ICAgICppZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZGVjX2NmZ190ICAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19mbGFnc190ICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdmVyKTsKLQotICAgIC8qIVxicmllZiBDb252ZW5pZW5jZSBtYWNybyBmb3IgdnB4X2NvZGVjX2RlY19pbml0X3ZlcigpCi0gICAgICoKLSAgICAgKiBFbnN1cmVzIHRoZSBBQkkgdmVyc2lvbiBwYXJhbWV0ZXIgaXMgcHJvcGVybHkgc2V0LgotICAgICAqLwotI2RlZmluZSB2cHhfY29kZWNfZGVjX2luaXQoY3R4LCBpZmFjZSwgY2ZnLCBmbGFncykgXAotICAgIHZweF9jb2RlY19kZWNfaW5pdF92ZXIoY3R4LCBpZmFjZSwgY2ZnLCBmbGFncywgVlBYX0RFQ09ERVJfQUJJX1ZFUlNJT04pCi0KLQotICAgIC8qIVxicmllZiBQYXJzZSBzdHJlYW0gaW5mbyBmcm9tIGEgYnVmZmVyCi0gICAgICoKLSAgICAgKiBQZXJmb3JtcyBoaWdoIGxldmVsIHBhcnNpbmcgb2YgdGhlIGJpdHN0cmVhbS4gQ29uc3RydWN0aW9uIG9mIGEgZGVjb2RlcgotICAgICAqIGNvbnRleHQgaXMgbm90IG5lY2Vzc2FyeS4gQ2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBiaXRzdHJlYW0gaXMKLSAgICAgKiBvZiB0aGUgcHJvcGVyIGZvcm1hdCwgYW5kIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICAgIGlmYWNlICAgUG9pbnRlciB0byB0aGUgYWxnb3JpdGhtIGludGVyZmFjZQotICAgICAqIFxwYXJhbVtpbl0gICAgICBkYXRhICAgIFBvaW50ZXIgdG8gYSBibG9jayBvZiBkYXRhIHRvIHBhcnNlCi0gICAgICogXHBhcmFtW2luXSAgICAgIGRhdGFfc3ogU2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIKLSAgICAgKiBccGFyYW1baW4sb3V0XSAgc2kgICAgICBQb2ludGVyIHRvIHN0cmVhbSBpbmZvIHRvIHVwZGF0ZS4gVGhlIHNpemUgbWVtYmVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgXHJlZiBNVVNUIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLCBidXQgXHJlZiBNQVkgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9iYmVyZWQgYnkgdGhlIGFsZ29yaXRobS4gVGhpcyBwYXJhbWV0ZXIgXHJlZiBNQVkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBOVUxMLgotICAgICAqCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCi0gICAgICogICAgIEJpdHN0cmVhbSBpcyBwYXJzYWJsZSBhbmQgc3RyZWFtIGluZm9ybWF0aW9uIHVwZGF0ZWQKLSAgICAgKi8KLSAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX3BlZWtfc3RyZWFtX2luZm8odnB4X2NvZGVjX2lmYWNlX3QgICAgICAgKmlmYWNlLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAgICAgICAgKmRhdGEsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgZGF0YV9zeiwKLSAgICAgICAgICAgIHZweF9jb2RlY19zdHJlYW1faW5mb190ICpzaSk7Ci0KLQotICAgIC8qIVxicmllZiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RyZWFtLgotICAgICAqCi0gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyZWFtIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGR1cmluZyBkZWNvZGluZy4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKLSAgICAgKiBccGFyYW1baW4sb3V0XSAgc2kgICAgICBQb2ludGVyIHRvIHN0cmVhbSBpbmZvIHRvIHVwZGF0ZS4gVGhlIHNpemUgbWVtYmVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgXHJlZiBNVVNUIGJlIHByb3Blcmx5IGluaXRpYWxpemVkLCBidXQgXHJlZiBNQVkgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9iYmVyZWQgYnkgdGhlIGFsZ29yaXRobS4gVGhpcyBwYXJhbWV0ZXIgXHJlZiBNQVkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBOVUxMLgotICAgICAqCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCi0gICAgICogICAgIEJpdHN0cmVhbSBpcyBwYXJzYWJsZSBhbmQgc3RyZWFtIGluZm9ybWF0aW9uIHVwZGF0ZWQKLSAgICAgKi8KLSAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2NvZGVjX2dldF9zdHJlYW1faW5mbyh2cHhfY29kZWNfY3R4X3QgICAgICAgICAqY3R4LAotICAgICAgICAgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKnNpKTsKLQotCi0gICAgLyohXGJyaWVmIERlY29kZSBkYXRhCi0gICAgICoKLSAgICAgKiBQcm9jZXNzZXMgYSBidWZmZXIgb2YgY29kZWQgZGF0YS4gSWYgdGhlIHByb2Nlc3NpbmcgcmVzdWx0cyBpbiBhIG5ldwotICAgICAqIGRlY29kZWQgZnJhbWUgYmVjb21pbmcgYXZhaWxhYmxlLCBQVVRfU0xJQ0UgYW5kIFBVVF9GUkFNRSBldmVudHMgbWF5IGJlCi0gICAgICogZ2VuZXJhdGVkLCBhcyBhcHByb3ByaWF0ZS4gRW5jb2RlZCBkYXRhIFxyZWYgTVVTVCBiZSBwYXNzZWQgaW4gRFRTIChkZWNvZGUKLSAgICAgKiB0aW1lIHN0YW1wKSBvcmRlci4gRnJhbWVzIHByb2R1Y2VkIHdpbGwgYWx3YXlzIGJlIGluIFBUUyAocHJlc2VudGF0aW9uCi0gICAgICogdGltZSBzdGFtcCkgb3JkZXIuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dIGN0eCAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luXSBkYXRhICAgICAgICAgUG9pbnRlciB0byB0aGlzIGJsb2NrIG9mIG5ldyBjb2RlZCBkYXRhLiBJZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGEgVlBYX0NPREVDX0NCX1BVVF9GUkFNRSBldmVudCBpcyBwb3N0ZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHByZXZpb3VzbHkgZGVjb2RlZCBmcmFtZS4KLSAgICAgKiBccGFyYW1baW5dIGRhdGFfc3ogICAgICBTaXplIG9mIHRoZSBjb2RlZCBkYXRhLCBpbiBieXRlcy4KLSAgICAgKiBccGFyYW1baW5dIHVzZXJfcHJpdiAgICBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIHRvIGFzc29jaWF0ZSB3aXRoCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmcmFtZS4KLSAgICAgKiBccGFyYW1baW5dIGRlYWRsaW5lICAgICBTb2Z0IGRlYWRsaW5lIHRoZSBkZWNvZGVyIHNob3VsZCBhdHRlbXB0IHRvIG1lZXQsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaW4gdXMuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIFJldHVybnMgI1ZQWF9DT0RFQ19PSyBpZiB0aGUgY29kZWQgZGF0YSB3YXMgcHJvY2Vzc2VkIGNvbXBsZXRlbHkKLSAgICAgKiAgICAgICAgIGFuZCBmdXR1cmUgcGljdHVyZXMgY2FuIGJlIGRlY29kZWQgd2l0aG91dCBlcnJvci4gT3RoZXJ3aXNlLAotICAgICAqICAgICAgICAgc2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIG90aGVyIGVycm9yIGNvZGVzIGluIDo6dnB4X2NvZGVjX2Vycl90Ci0gICAgICogICAgICAgICBmb3IgcmVjb3ZlcmFiaWxpdHkgY2FwYWJpbGl0aWVzLgotICAgICAqLwotICAgIHZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfZGVjb2RlKHZweF9jb2RlY19jdHhfdCAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGRhdGFfc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX3ByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICBkZWFkbGluZSk7Ci0KLQotICAgIC8qIVxicmllZiBEZWNvZGVkIGZyYW1lcyBpdGVyYXRvcgotICAgICAqCi0gICAgICogSXRlcmF0ZXMgb3ZlciBhIGxpc3Qgb2YgdGhlIGZyYW1lcyBhdmFpbGFibGUgZm9yIGRpc3BsYXkuIFRoZSBpdGVyYXRvcgotICAgICAqIHN0b3JhZ2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4gSXRlcmF0aW9uIGlzCi0gICAgICogY29tcGxldGUgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4KLSAgICAgKgotICAgICAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmcmFtZXMgYmVjb21lcyB2YWxpZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhlCi0gICAgICogdnB4X2NvZGVjX2RlY29kZSBjYWxsLCBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHZweF9jb2RlY19kZWNvZGUuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgICBjdHggICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luLG91dF0gaXRlciAgICAgSXRlcmF0b3Igc3RvcmFnZSwgaW5pdGlhbGl6ZWQgdG8gTlVMTAotICAgICAqCi0gICAgICogXHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpbWFnZSwgaWYgb25lIGlzIHJlYWR5IGZvciBkaXNwbGF5LiBGcmFtZXMKLSAgICAgKiAgICAgICAgIHByb2R1Y2VkIHdpbGwgYWx3YXlzIGJlIGluIFBUUyAocHJlc2VudGF0aW9uIHRpbWUgc3RhbXApIG9yZGVyLgotICAgICAqLwotICAgIHZweF9pbWFnZV90ICp2cHhfY29kZWNfZ2V0X2ZyYW1lKHZweF9jb2RlY19jdHhfdCAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90ICppdGVyKTsKLQotCi0gICAgLyohXGRlZmdyb3VwIGNhcF9wdXRfZnJhbWUgRnJhbWUtQmFzZWQgRGVjb2RpbmcgRnVuY3Rpb25zCi0gICAgICoKLSAgICAgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGFsbCBkZWNvZGVycwotICAgICAqIHRoYXQgYWR2ZXJ0aXNlIHRoZSBWUFhfQ09ERUNfQ0FQX1BVVF9GUkFNRSBjYXBhYmlsaXR5LiBDYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucwotICAgICAqIGZvciBjb2RlY3MgdGhhdCBkb24ndCBhZHZlcnRpc2UgdGhpcyBjYXBhYmlsaXR5IHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCi0gICAgICogY29kZSBiZWluZyByZXR1cm5lZCwgdXN1YWxseSBWUFhfQ09ERUNfRVJST1IKLSAgICAgKiBAewotICAgICAqLwotCi0gICAgLyohXGJyaWVmIHB1dCBmcmFtZSBjYWxsYmFjayBwcm90b3R5cGUKLSAgICAgKgotICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSB0aGUgZGVjb2RlciB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIG9mCi0gICAgICogdGhlIGF2YWlsYWJpbGl0eSBvZiBkZWNvZGVkIGltYWdlIGRhdGEuCi0gICAgICovCi0gICAgdHlwZWRlZiB2b2lkICgqdnB4X2NvZGVjX3B1dF9mcmFtZV9jYl9mbl90KSh2b2lkICAgICAgICAqdXNlcl9wcml2LAotICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgKmltZyk7Ci0KLQotICAgIC8qIVxicmllZiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIG9mIGZyYW1lIGNvbXBsZXRpb24uCi0gICAgICoKLSAgICAgKiBSZWdpc3RlcnMgYSBnaXZlbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhIGRlY29kZWQgZnJhbWUgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dIGN0eCAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luXSBjYiAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgKiBccGFyYW1baW5dIHVzZXJfcHJpdiAgICBVc2VyJ3MgcHJpdmF0ZSBkYXRhCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAgICAgKiAgICAgQ2FsbGJhY2sgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQuCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX0VSUk9SCi0gICAgICogICAgIERlY29kZXIgY29udGV4dCBub3QgaW5pdGlhbGl6ZWQsIG9yIGFsZ29yaXRobSBub3QgY2FwYWJsZSBvZgotICAgICAqICAgICBwb3N0aW5nIHNsaWNlIGNvbXBsZXRpb24uCi0gICAgICovCi0gICAgdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19yZWdpc3Rlcl9wdXRfZnJhbWVfY2IodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgICpjdHgsCi0gICAgICAgICAgICB2cHhfY29kZWNfcHV0X2ZyYW1lX2NiX2ZuX3QgIGNiLAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX3ByaXYpOwotCi0KLSAgICAvKiFAfSAtIGVuZCBkZWZncm91cCBjYXBfcHV0X2ZyYW1lICovCi0KLSAgICAvKiFcZGVmZ3JvdXAgY2FwX3B1dF9zbGljZSBTbGljZS1CYXNlZCBEZWNvZGluZyBGdW5jdGlvbnMKLSAgICAgKgotICAgICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIGRlY29kZXJzCi0gICAgICogdGhhdCBhZHZlcnRpc2UgdGhlIFZQWF9DT0RFQ19DQVBfUFVUX1NMSUNFIGNhcGFiaWxpdHkuIENhbGxpbmcgdGhlc2UgZnVuY3Rpb25zCi0gICAgICogZm9yIGNvZGVjcyB0aGF0IGRvbid0IGFkdmVydGlzZSB0aGlzIGNhcGFiaWxpdHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IKLSAgICAgKiBjb2RlIGJlaW5nIHJldHVybmVkLCB1c3VhbGx5IFZQWF9DT0RFQ19FUlJPUgotICAgICAqIEB7Ci0gICAgICovCi0KLSAgICAvKiFcYnJpZWYgcHV0IHNsaWNlIGNhbGxiYWNrIHByb3RvdHlwZQotICAgICAqCi0gICAgICogVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IHRoZSBkZWNvZGVyIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gb2YKLSAgICAgKiB0aGUgYXZhaWxhYmlsaXR5IG9mIHBhcnRpYWxseSBkZWNvZGVkIGltYWdlIGRhdGEuIFRoZQotICAgICAqLwotICAgIHR5cGVkZWYgdm9pZCAoKnZweF9jb2RlY19wdXRfc2xpY2VfY2JfZm5fdCkodm9pZCAgICAgICAgICp1c2VyX3ByaXYsCi0gICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCAgICAgICppbWcsCi0gICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfcmVjdF90ICp2YWxpZCwKLSAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV9yZWN0X3QgKnVwZGF0ZSk7Ci0KLQotICAgIC8qIVxicmllZiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIG9mIHNsaWNlIGNvbXBsZXRpb24uCi0gICAgICoKLSAgICAgKiBSZWdpc3RlcnMgYSBnaXZlbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhIGRlY29kZWQgc2xpY2UgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dIGN0eCAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luXSBjYiAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgKiBccGFyYW1baW5dIHVzZXJfcHJpdiAgICBVc2VyJ3MgcHJpdmF0ZSBkYXRhCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAgICAgKiAgICAgQ2FsbGJhY2sgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQuCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX0VSUk9SCi0gICAgICogICAgIERlY29kZXIgY29udGV4dCBub3QgaW5pdGlhbGl6ZWQsIG9yIGFsZ29yaXRobSBub3QgY2FwYWJsZSBvZgotICAgICAqICAgICBwb3N0aW5nIHNsaWNlIGNvbXBsZXRpb24uCi0gICAgICovCi0gICAgdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19yZWdpc3Rlcl9wdXRfc2xpY2VfY2IodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgICpjdHgsCi0gICAgICAgICAgICB2cHhfY29kZWNfcHV0X3NsaWNlX2NiX2ZuX3QgIGNiLAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX3ByaXYpOwotCi0KLSNpZmRlZiBNSVBTX0RTUF9SRVYKLSNpZiAoTUlQU19EU1BfUkVWPj0yKQotICAgIHZvaWQgZHNwdXRpbF9zdGF0aWNfaW5pdCgpOwotI2VuZGlmCi0jZW5kaWYKLQotICAgIC8qIUB9IC0gZW5kIGRlZmdyb3VwIGNhcF9wdXRfc2xpY2UqLwotCi0gICAgLyohQH0gLSBlbmQgZGVmZ3JvdXAgZGVjb2RlciovCi0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUKSB8fCAhVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUCi0jaW5jbHVkZSAidnB4X2RlY29kZXJfY29tcGF0LmgiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweC92cHhfZGVjb2Rlcl9jb21wYXQuaCBiL3ZweC92cHhfZGVjb2Rlcl9jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkYzFiOS4uMDAwMDAwMAotLS0gYS92cHgvdnB4X2RlY29kZXJfY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qIVxkZWZncm91cCBkZWNvZGVyIENvbW1vbiBEZWNvZGVyIEFsZ29yaXRobSBJbnRlcmZhY2UKLSAqIFRoaXMgYWJzdHJhY3Rpb24gYWxsb3dzIGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGRlY29kZXIgdG8gZWFzaWx5IHN1cHBvcnQKLSAqIG11bHRpcGxlIHZpZGVvIGZvcm1hdHMgd2l0aCBtaW5pbWFsIGNvZGUgZHVwbGljYXRpb24uIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMKLSAqIHRoZSBpbnRlcmZhY2UgY29tbW9uIHRvIGFsbCBjb2RlY3MuCi0gKiBAewotICovCi0KLS8qIVxmaWxlCi0gKiBcYnJpZWYgUHJvdmlkZXMgYSBjb21wYXRpYmlsaXR5IGxheWVyIGJldHdlZW4gdmVyc2lvbiAxIGFuZCAyIG9mIHRoaXMgQVBJLgotICoKLSAqIFRoaXMgaW50ZXJmYWNlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE9ubHkgZXhpc3RpbmcgY29kZSBzaG91bGQgbWFrZSB1c2UKLSAqIG9mIHRoaXMgaW50ZXJmYWNlLCBhbmQgdGhlcmVmb3JlLCBpdCBpcyBvbmx5IHRoaW5seSBkb2N1bWVudGVkLiBFeGlzdGluZwotICogY29kZSBzaG91bGQgYmUgcG9ydGVkIHRvIHRoZSB2cHhfY29kZWNfKiBBUEkuCi0gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBWUFhfREVDT0RFUl9DT01QQVRfSAotI2RlZmluZSBWUFhfREVDT0RFUl9DT01QQVRfSAotCi0gICAgLyohXGJyaWVmIERlY29kZXIgYWxnb3JpdGhtIHJldHVybiBjb2RlcyAqLwotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIC8qIVxicmllZiBPcGVyYXRpb24gY29tcGxldGVkIHdpdGhvdXQgZXJyb3IgKi8KLSAgICAgICAgVlBYX0RFQ19PSyA9IFZQWF9DT0RFQ19PSywKLQotICAgICAgICAvKiFcYnJpZWYgVW5zcGVjaWZpZWQgZXJyb3IgKi8KLSAgICAgICAgVlBYX0RFQ19FUlJPUiA9IFZQWF9DT0RFQ19FUlJPUiwKLQotICAgICAgICAvKiFcYnJpZWYgTWVtb3J5IG9wZXJhdGlvbiBmYWlsZWQgKi8KLSAgICAgICAgVlBYX0RFQ19NRU1fRVJST1IgPSBWUFhfQ09ERUNfTUVNX0VSUk9SLAotCi0gICAgICAgIC8qIVxicmllZiBBQkkgdmVyc2lvbiBtaXNtYXRjaCAqLwotICAgICAgICBWUFhfREVDX0FCSV9NSVNNQVRDSCA9IFZQWF9DT0RFQ19BQklfTUlTTUFUQ0gsCi0KLSAgICAgICAgLyohXGJyaWVmIFRoZSBnaXZlbiBiaXRzdHJlYW0gaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGJpdHN0cmVhbSB3YXMgdW5hYmxlIHRvIGJlIHBhcnNlZCBhdCB0aGUgaGlnaGVzdCBsZXZlbC4gVGhlIGRlY29kZXIKLSAgICAgICAgICogaXMgdW5hYmxlIHRvIHByb2NlZWQuIFRoaXMgZXJyb3IgXHJlZiBTSE9VTEQgYmUgdHJlYXRlZCBhcyBmYXRhbCB0byB0aGUKLSAgICAgICAgICogc3RyZWFtLiAqLwotICAgICAgICBWUFhfREVDX1VOU1VQX0JJVFNUUkVBTSA9IFZQWF9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCi0KLSAgICAgICAgLyohXGJyaWVmIEVuY29kZWQgYml0c3RyZWFtIHVzZXMgYW4gdW5zdXBwb3J0ZWQgZmVhdHVyZQotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgZGVjb2RlciBkb2VzIG5vdCBpbXBsZW1lbnQgYSBmZWF0dXJlIHJlcXVpcmVkIGJ5IHRoZSBlbmNvZGVyLiBUaGlzCi0gICAgICAgICAqIHJldHVybiBjb2RlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGZlYXR1cmVzIHRoYXQgcHJldmVudCBmdXR1cmUKLSAgICAgICAgICogcGljdHVyZXMgZnJvbSBiZWluZyBwcm9wZXJseSBkZWNvZGVkLiBUaGlzIGVycm9yIFxyZWYgTUFZIGJlIHRyZWF0ZWQgYXMKLSAgICAgICAgICogZmF0YWwgdG8gdGhlIHN0cmVhbSBvciBccmVmIE1BWSBiZSB0cmVhdGVkIGFzIGZhdGFsIHRvIHRoZSBjdXJyZW50IEdPUC4KLSAgICAgICAgICovCi0gICAgICAgIFZQWF9ERUNfVU5TVVBfRkVBVFVSRSA9IFZQWF9DT0RFQ19VTlNVUF9GRUFUVVJFLAotCi0gICAgICAgIC8qIVxicmllZiBUaGUgY29kZWQgZGF0YSBmb3IgdGhpcyBzdHJlYW0gaXMgY29ycnVwdCBvciBpbmNvbXBsZXRlCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZXJlIHdhcyBhIHByb2JsZW0gZGVjb2RpbmcgdGhlIGN1cnJlbnQgZnJhbWUuICBUaGlzIHJldHVybiBjb2RlCi0gICAgICAgICAqIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGZhaWx1cmVzIHRoYXQgcHJldmVudCBmdXR1cmUgcGljdHVyZXMgZnJvbQotICAgICAgICAgKiBiZWluZyBwcm9wZXJseSBkZWNvZGVkLiBUaGlzIGVycm9yIFxyZWYgTUFZIGJlIHRyZWF0ZWQgYXMgZmF0YWwgdG8gdGhlCi0gICAgICAgICAqIHN0cmVhbSBvciBccmVmIE1BWSBiZSB0cmVhdGVkIGFzIGZhdGFsIHRvIHRoZSBjdXJyZW50IEdPUC4gSWYgZGVjb2RpbmcKLSAgICAgICAgICogaXMgY29udGludWVkIGZvciB0aGUgY3VycmVudCBHT1AsIGFydGlmYWN0cyBtYXkgYmUgcHJlc2VudC4KLSAgICAgICAgICovCi0gICAgICAgIFZQWF9ERUNfQ09SUlVQVF9GUkFNRSA9IFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAotCi0gICAgICAgIC8qIVxicmllZiBBbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLgotICAgICAgICAgKgotICAgICAgICAgKi8KLSAgICAgICAgVlBYX0RFQ19JTlZBTElEX1BBUkFNID0gVlBYX0NPREVDX0lOVkFMSURfUEFSQU0sCi0KLSAgICAgICAgLyohXGJyaWVmIEFuIGl0ZXJhdG9yIHJlYWNoZWQgdGhlIGVuZCBvZiBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKi8KLSAgICAgICAgVlBYX0RFQ19MSVNUX0VORCA9IFZQWF9DT0RFQ19MSVNUX0VORAotCi0gICAgfQotICAgIHZweF9kZWNfZXJyX3Q7Ci0KLSAgICAvKiEgXGJyaWVmIERlY29kZXIgY2FwYWJpbGl0aWVzIGJpdGZpZWxkCi0gICAgICoKLSAgICAgKiAgRWFjaCBkZWNvZGVyIGFkdmVydGlzZXMgdGhlIGNhcGFiaWxpdGllcyBpdCBzdXBwb3J0cyBhcyBwYXJ0IG9mIGl0cwotICAgICAqICA6OnZweF9kZWNfaWZhY2VfdCBpbnRlcmZhY2Ugc3RydWN0dXJlLiBDYXBhYmlsaXRpZXMgYXJlIGV4dHJhIGludGVyZmFjZXMKLSAgICAgKiAgb3IgZnVuY3Rpb25hbGl0eSwgYW5kIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGEgZGVjb2Rlci4KLSAgICAgKgotICAgICAqICBUaGUgYXZhaWxhYmxlIGZsYWdzIGFyZSBzcGVjaWZpZWQgYnkgVlBYX0RFQ19DQVBfKiBkZWZpbmVzLgotICAgICAqLwotICAgIHR5cGVkZWYgaW50IHZweF9kZWNfY2Fwc190OwotI2RlZmluZSBWUFhfREVDX0NBUF9QVVRfU0xJQ0UgIDB4MDAwMSAvKio8IFdpbGwgaXNzdWUgcHV0X3NsaWNlIGNhbGxiYWNrcyAqLwotI2RlZmluZSBWUFhfREVDX0NBUF9QVVRfRlJBTUUgIDB4MDAwMiAvKio8IFdpbGwgaXNzdWUgcHV0X2ZyYW1lIGNhbGxiYWNrcyAqLwotI2RlZmluZSBWUFhfREVDX0NBUF9YTUEgICAgICAgIDB4MDAwNCAvKio8IFN1cHBvcnRzIGVYdGVybmFsIE1lbW9yeSBBbGxvY2F0aW9uICovCi0KLSAgICAvKiFcYnJpZWYgU3RyZWFtIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcXVlcnkgb3Igc2V0IHByb3BlcnRpZXMgb2YgdGhlIGRlY29kZWQKLSAgICAgKiBzdHJlYW0uIEFsZ29yaXRobXMgbWF5IGV4dGVuZCB0aGlzIHN0cnVjdHVyZSB3aXRoIGRhdGEgc3BlY2lmaWMKLSAgICAgKiB0byB0aGVpciBiaXRzdHJlYW0gYnkgc2V0dGluZyB0aGUgc3ogbWVtYmVyIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0jaWYgMQotICAgIHR5cGVkZWYgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgdnB4X2RlY19zdHJlYW1faW5mb190OwotI2Vsc2UKLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHN6OyAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlICovCi0gICAgICAgIHVuc2lnbmVkIGludCB3OyAgICAgIC8qKjwgV2lkdGggKG9yIDAgZm9yIHVua25vd24vZGVmYXVsdCkgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGg7ICAgICAgLyoqPCBIZWlnaHQgKG9yIDAgZm9yIHVua25vd24vZGVmYXVsdCkgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGlzX2tmOyAgLyoqPCBDdXJyZW50IGZyYW1lIGlzIGEga2V5ZnJhbWUgKi8KLSAgICB9IHZweF9kZWNfc3RyZWFtX2luZm9fdDsKLSNlbmRpZgotCi0KLSAgICAvKiFcYnJpZWYgRGVjb2RlciBpbnRlcmZhY2Ugc3RydWN0dXJlLgotICAgICAqCi0gICAgICogQ29udGFpbnMgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIG90aGVyIGRhdGEgcHJpdmF0ZSB0byB0aGUgZGVjb2RlcgotICAgICAqIGltcGxlbWVudGF0aW9uLiBUaGlzIHN0cnVjdHVyZSBpcyBvcGFxdWUgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqLwotICAgIHR5cGVkZWYgY29uc3Qgc3RydWN0IHZweF9jb2RlY19pZmFjZSB2cHhfZGVjX2lmYWNlX3Q7Ci0gICAgdHlwZWRlZiAgICAgICBzdHJ1Y3QgdnB4X2NvZGVjX3ByaXYgIHZweF9kZWNfcHJpdl90OwotCi0gICAgLyohXGJyaWVmIEl0ZXJhdG9yCi0gICAgICoKLSAgICAgKiBPcGFxdWUgc3RvcmFnZSB1c2VkIGZvciBpdGVyYXRpbmcgb3ZlciBsaXN0cy4KLSAgICAgKi8KLSAgICB0eXBlZGVmIHZweF9jb2RlY19pdGVyX3QgdnB4X2RlY19pdGVyX3Q7Ci0KLSAgICAvKiFcYnJpZWYgRGVjb2RlciBjb250ZXh0IHN0cnVjdHVyZQotICAgICAqCi0gICAgICogQWxsIGRlY29kZXJzIFxyZWYgTVVTVCBzdXBwb3J0IHRoaXMgY29udGV4dCBzdHJ1Y3R1cmUgZnVsbHkuIEluIGdlbmVyYWwsCi0gICAgICogdGhpcyBkYXRhIHNob3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUgdG8gdGhlIGRlY29kZXIgYWxnb3JpdGhtLCBhbmQKLSAgICAgKiBub3QgYmUgbWFuaXB1bGF0ZWQgb3IgZXhhbWluZWQgYnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEFwcGxpY2F0aW9ucwotICAgICAqIG1heSByZWZlcmVuY2UgdGhlICduYW1lJyBtZW1iZXIgdG8gZ2V0IGEgcHJpbnRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIGFsZ29yaXRobS4KLSAgICAgKi8KLSNpZiAxCi0gICAgdHlwZWRlZiB2cHhfY29kZWNfY3R4X3QgdnB4X2RlY19jdHhfdDsKLSNlbHNlCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqbmFtZTsgICAgICAgIC8qKjwgUHJpbnRhYmxlIGludGVyZmFjZSBuYW1lICovCi0gICAgICAgIHZweF9kZWNfaWZhY2VfdCAgICAgICAqaWZhY2U7ICAgICAgIC8qKjwgSW50ZXJmYWNlIHBvaW50ZXJzICovCi0gICAgICAgIHZweF9kZWNfZXJyX3QgICAgICAgICAgZXJyOyAgICAgICAgIC8qKjwgTGFzdCByZXR1cm5lZCBlcnJvciAqLwotICAgICAgICB2cHhfZGVjX3ByaXZfdCAgICAgICAgKnByaXY7ICAgICAgICAvKio8IEFsZ29yaXRobSBwcml2YXRlIHN0b3JhZ2UgKi8KLSAgICB9IHZweF9kZWNfY3R4X3Q7Ci0jZW5kaWYKLQotCi0gICAgLyohXGJyaWVmIFJldHVybiB0aGUgYnVpbGQgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogUmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgY29udGFpbmluZyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIGJ1aWxkCi0gICAgICogY29uZmlndXJhdGlvbi4gVGhpcyBtYXkgYmUgdXNlZnVsIHRvIHZweCBzdXBwb3J0LgotICAgICAqCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqdnB4X2RlY19idWlsZF9jb25maWcodm9pZCkgREVQUkVDQVRFRDsKLQotICAgIC8qIVxicmllZiBSZXR1cm4gdGhlIG5hbWUgZm9yIGEgZ2l2ZW4gaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGZvciBuYW1lIG9mIHRoZSBnaXZlbiBkZWNvZGVyIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgaWZhY2UgICAgIEludGVyZmFjZSBwb2ludGVyCi0gICAgICoKLSAgICAgKi8KLSAgICBjb25zdCBjaGFyICp2cHhfZGVjX2lmYWNlX25hbWUodnB4X2RlY19pZmFjZV90ICppZmFjZSkgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIENvbnZlcnQgZXJyb3IgbnVtYmVyIHRvIHByaW50YWJsZSBzdHJpbmcKLSAgICAgKgotICAgICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIHRoZSBsYXN0IGVycm9yIHJldHVybmVkIGJ5IHRoZQotICAgICAqIGFsZ29yaXRobS4gVGhlIHJldHVybmVkIGVycm9yIHdpbGwgYmUgb25lIGxpbmUgYW5kIHdpbGwgbm90IGNvbnRhaW4KLSAgICAgKiBhbnkgbmV3bGluZSBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgIGVyciAgICAgRXJyb3IgbnVtYmVyLgotICAgICAqCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqdnB4X2RlY19lcnJfdG9fc3RyaW5nKHZweF9kZWNfZXJyX3QgIGVycikgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIFJldHJpZXZlIGVycm9yIHN5bm9wc2lzIGZvciBkZWNvZGVyIGNvbnRleHQKLSAgICAgKgotICAgICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIHRoZSBsYXN0IGVycm9yIHJldHVybmVkIGJ5IHRoZQotICAgICAqIGFsZ29yaXRobS4gVGhlIHJldHVybmVkIGVycm9yIHdpbGwgYmUgb25lIGxpbmUgYW5kIHdpbGwgbm90IGNvbnRhaW4KLSAgICAgKiBhbnkgbmV3bGluZSBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dC4KLSAgICAgKgotICAgICAqLwotICAgIGNvbnN0IGNoYXIgKnZweF9kZWNfZXJyb3IodnB4X2RlY19jdHhfdCAgKmN0eCkgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIFJldHJpZXZlIGRldGFpbGVkIGVycm9yIGluZm9ybWF0aW9uIGZvciBkZWNvZGVyIGNvbnRleHQKLSAgICAgKgotICAgICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgcHJvdmlkaW5nIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICogdGhlIGxhc3QgZXJyb3IuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dC4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgTlVMTAotICAgICAqICAgICBObyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqdnB4X2RlY19lcnJvcl9kZXRhaWwodnB4X2RlY19jdHhfdCAgKmN0eCkgREVQUkVDQVRFRDsKLQotCi0gICAgLyogUkVRVUlSRUQgRlVOQ1RJT05TCi0gICAgICoKLSAgICAgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGFsbCBkZWNvZGVycy4KLSAgICAgKiBUaGV5IHJlcHJlc2VudCB0aGUgYmFzZSBjYXNlIGZ1bmN0aW9uYWxpdHkgZXhwZWN0ZWQgb2YgYWxsIGRlY29kZXJzLgotICAgICAqLwotCi0KLSAgICAvKiFcYnJpZWYgSW5pdGlhbGl6ZSBhIGRlY29kZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEluaXRpYWxpemVzIGEgZGVjb2RlciBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBpbnRlcmZhY2UuIEFwcGxpY2F0aW9ucwotICAgICAqIHNob3VsZCBjYWxsIHRoZSB2cHhfZGVjX2luaXQgY29udmVuaWVuY2UgbWFjcm8gaW5zdGVhZCBvZiB0aGlzCi0gICAgICogZnVuY3Rpb24gZGlyZWN0bHksIHRvIGVuc3VyZSB0aGF0IHRoZSBBQkkgdmVyc2lvbiBudW1iZXIgcGFyYW1ldGVyCi0gICAgICogaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dC4KLSAgICAgKiBccGFyYW1baW5dICAgIGlmYWNlICAgUG9pbnRlciB0byB0aGUgYWxnb3JpdGhtIGludGVyZmFjZSB0byB1c2UuCi0gICAgICogXHBhcmFtW2luXSAgICB2ZXIgICAgIEFCSSB2ZXJzaW9uIG51bWJlci4gTXVzdCBiZSBzZXQgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVlBYX0RFQ09ERVJfQUJJX1ZFUlNJT04KLSAgICAgKiBccmV0dmFsICNWUFhfREVDX09LCi0gICAgICogICAgIFRoZSBkZWNvZGVyIGFsZ29yaXRobSBpbml0aWFsaXplZC4KLSAgICAgKiBccmV0dmFsICNWUFhfREVDX01FTV9FUlJPUgotICAgICAqICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgdnB4X2RlY19lcnJfdCB2cHhfZGVjX2luaXRfdmVyKHZweF9kZWNfY3R4X3QgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19pZmFjZV90ICAqaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHZlcikgREVQUkVDQVRFRDsKLSNkZWZpbmUgdnB4X2RlY19pbml0KGN0eCwgaWZhY2UpIFwKLSAgICB2cHhfZGVjX2luaXRfdmVyKGN0eCwgaWZhY2UsIFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OKQotCi0KLSAgICAvKiFcYnJpZWYgRGVzdHJveSBhIGRlY29kZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIERlc3Ryb3lzIGEgZGVjb2RlciBjb250ZXh0LCBmcmVlaW5nIGFueSBhc3NvY2lhdGVkIG1lbW9yeSBidWZmZXJzLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSBjdHggICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfREVDX09LCi0gICAgICogICAgIFRoZSBkZWNvZGVyIGFsZ29yaXRobSBpbml0aWFsaXplZC4KLSAgICAgKiBccmV0dmFsICNWUFhfREVDX01FTV9FUlJPUgotICAgICAqICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgdnB4X2RlY19lcnJfdCB2cHhfZGVjX2Rlc3Ryb3kodnB4X2RlY19jdHhfdCAqY3R4KSBERVBSRUNBVEVEOwotCi0KLSAgICAvKiFcYnJpZWYgR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgYW4gYWxnb3JpdGhtLgotICAgICAqCi0gICAgICogUmV0cmlldmVzIHRoZSBjYXBhYmlsaXRpZXMgYml0ZmllbGQgZnJvbSB0aGUgYWxnb3JpdGhtJ3MgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSBpZmFjZSAgIFBvaW50ZXIgdG8gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqLwotICAgIHZweF9kZWNfY2Fwc190IHZweF9kZWNfZ2V0X2NhcHModnB4X2RlY19pZmFjZV90ICppZmFjZSkgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIFBhcnNlIHN0cmVhbSBpbmZvIGZyb20gYSBidWZmZXIKLSAgICAgKgotICAgICAqIFBlcmZvcm1zIGhpZ2ggbGV2ZWwgcGFyc2luZyBvZiB0aGUgYml0c3RyZWFtLiBDb25zdHJ1Y3Rpb24gb2YgYSBkZWNvZGVyCi0gICAgICogY29udGV4dCBpcyBub3QgbmVjZXNzYXJ5LiBDYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGJpdHN0cmVhbSBpcwotICAgICAqIG9mIHRoZSBwcm9wZXIgZm9ybWF0LCBhbmQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgICAgaWZhY2UgICBQb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlCi0gICAgICogXHBhcmFtW2luXSAgICAgIGRhdGEgICAgUG9pbnRlciB0byBhIGJsb2NrIG9mIGRhdGEgdG8gcGFyc2UKLSAgICAgKiBccGFyYW1baW5dICAgICAgZGF0YV9zeiBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlcgotICAgICAqIFxwYXJhbVtpbixvdXRdICBzaSAgICAgIFBvaW50ZXIgdG8gc3RyZWFtIGluZm8gdG8gdXBkYXRlLiBUaGUgc2l6ZSBtZW1iZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBccmVmIE1VU1QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIGJ1dCBccmVmIE1BWSBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZCBieSB0aGUgYWxnb3JpdGhtLiBUaGlzIHBhcmFtZXRlciBccmVmIE1BWQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIE5VTEwuCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfREVDX09LCi0gICAgICogICAgIEJpdHN0cmVhbSBpcyBwYXJzYWJsZSBhbmQgc3RyZWFtIGluZm9ybWF0aW9uIHVwZGF0ZWQKLSAgICAgKi8KLSAgICB2cHhfZGVjX2Vycl90IHZweF9kZWNfcGVla19zdHJlYW1faW5mbyh2cHhfZGVjX2lmYWNlX3QgICAgICAgKmlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgICAgICAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGRhdGFfc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19zdHJlYW1faW5mb190ICpzaSkgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICAgIGN0eCAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICAgICAqIFxwYXJhbVtpbixvdXRdICBzaSAgICAgIFBvaW50ZXIgdG8gc3RyZWFtIGluZm8gdG8gdXBkYXRlLiBUaGUgc2l6ZSBtZW1iZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBccmVmIE1VU1QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIGJ1dCBccmVmIE1BWSBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZCBieSB0aGUgYWxnb3JpdGhtLiBUaGlzIHBhcmFtZXRlciBccmVmIE1BWQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIE5VTEwuCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfREVDX09LCi0gICAgICogICAgIEJpdHN0cmVhbSBpcyBwYXJzYWJsZSBhbmQgc3RyZWFtIGluZm9ybWF0aW9uIHVwZGF0ZWQKLSAgICAgKi8KLSAgICB2cHhfZGVjX2Vycl90IHZweF9kZWNfZ2V0X3N0cmVhbV9pbmZvKHZweF9kZWNfY3R4X3QgICAgICAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19zdHJlYW1faW5mb190ICpzaSkgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIENvbnRyb2wgYWxnb3JpdGhtCi0gICAgICoKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZXhjaGFuZ2UgYWxnb3JpdGhtIHNwZWNpZmljIGRhdGEgd2l0aCB0aGUgZGVjb2RlcgotICAgICAqIGluc3RhbmNlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBmZWF0dXJlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIKLSAgICAgKiBhbGdvcml0aG0uCi0gICAgICoKLSAgICAgKiBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZGlzcGF0Y2hlcyB0aGUgcmVxdWVzdCB0byB0aGUgaGVscGVyIGZ1bmN0aW9uCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjdHJsX2lkLiBJdCB0cmllcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24KLSAgICAgKiB0cmFuc3BhcmVudGx5LCBidXQgd2lsbCByZXR1cm4gI1ZQWF9ERUNfRVJST1IgaWYgdGhlIHJlcXVlc3QgY291bGQgbm90Ci0gICAgICogYmUgZGlzcGF0Y2hlZC4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgIGN0eCAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICAgICAqIFxwYXJhbVtpbl0gICAgIGN0cmxfaWQgICAgICAgICAgQWxnb3JpdGhtIHNwZWNpZmljIGNvbnRyb2wgaWRlbnRpZmllcgotICAgICAqIFxwYXJhbVtpbixvdXRdIGRhdGEgICAgICAgICAgICAgRGF0YSB0byBleGNoYW5nZSB3aXRoIGFsZ29yaXRobSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfT0sKLSAgICAgKiAgICAgVGhlIGNvbnRyb2wgcmVxdWVzdCB3YXMgcHJvY2Vzc2VkLgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfRVJST1IKLSAgICAgKiAgICAgVGhlIGNvbnRyb2wgcmVxdWVzdCB3YXMgbm90IHByb2Nlc3NlZC4KLSAgICAgKiBccmV0dmFsICNWUFhfREVDX0lOVkFMSURfUEFSQU0KLSAgICAgKiAgICAgVGhlIGRhdGEgd2FzIG5vdCB2YWxpZC4KLSAgICAgKi8KLSAgICB2cHhfZGVjX2Vycl90IHZweF9kZWNfY29udHJvbCh2cHhfZGVjX2N0eF90ICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdHJsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKSBERVBSRUNBVEVEOwotCi0gICAgLyohXGJyaWVmIERlY29kZSBkYXRhCi0gICAgICoKLSAgICAgKiBQcm9jZXNzZXMgYSBidWZmZXIgb2YgY29kZWQgZGF0YS4gSWYgdGhlIHByb2Nlc3NpbmcgcmVzdWx0cyBpbiBhIG5ldwotICAgICAqIGRlY29kZWQgZnJhbWUgYmVjb21pbmcgYXZhaWxhYmxlLCAjVlBYX0RFQ19DQl9QVVRfU0xJQ0UgYW5kCi0gICAgICogI1ZQWF9ERUNfQ0JfUFVUX0ZSQU1FIGV2ZW50cyBtYXkgYmUgZ2VuZXJhdGVkLCBhcyBhcHByb3ByaWF0ZS4gRW5jb2RlZCBkYXRhCi0gICAgICogXHJlZiBNVVNUIGJlIHBhc3NlZCBpbiBEVFMgKGRlY29kZSB0aW1lIHN0YW1wKSBvcmRlci4gRnJhbWVzIHByb2R1Y2VkIHdpbGwKLSAgICAgKiBhbHdheXMgYmUgaW4gUFRTIChwcmVzZW50YXRpb24gdGltZSBzdGFtcCkgb3JkZXIuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dIGN0eCAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luXSBkYXRhICAgICAgICAgUG9pbnRlciB0byB0aGlzIGJsb2NrIG9mIG5ldyBjb2RlZCBkYXRhLiBJZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGEgVlBYX0RFQ19DQl9QVVRfRlJBTUUgZXZlbnQgaXMgcG9zdGVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUuCi0gICAgICogXHBhcmFtW2luXSBkYXRhX3N6ICAgICAgU2l6ZSBvZiB0aGUgY29kZWQgZGF0YSwgaW4gYnl0ZXMuCi0gICAgICogXHBhcmFtW2luXSB1c2VyX3ByaXYgICAgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSB0byBhc3NvY2lhdGUgd2l0aAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnJhbWUuCi0gICAgICogXHBhcmFtW2luXSByZWxfcHRzICAgICAgUFRTIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBmcmFtZSwgaW4gdXMuIElmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBvciB1bmF2YWlsYWJsZSwgc2V0IHRvIHplcm8uCi0gICAgICoKLSAgICAgKiBccmV0dXJuIFJldHVybnMgI1ZQWF9ERUNfT0sgaWYgdGhlIGNvZGVkIGRhdGEgd2FzIHByb2Nlc3NlZCBjb21wbGV0ZWx5Ci0gICAgICogICAgICAgICBhbmQgZnV0dXJlIHBpY3R1cmVzIGNhbiBiZSBkZWNvZGVkIHdpdGhvdXQgZXJyb3IuIE90aGVyd2lzZSwKLSAgICAgKiAgICAgICAgIHNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSBvdGhlciBlcnJvciBjb2RlcyBpbiA6OnZweF9kZWNfZXJyX3QKLSAgICAgKiAgICAgICAgIGZvciByZWNvdmVyYWJpbGl0eSBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgdnB4X2RlY19lcnJfdCB2cHhfZGVjX2RlY29kZSh2cHhfZGVjX2N0eF90ICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZGF0YV9zeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnVzZXJfcHJpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHJlbF9wdHMpIERFUFJFQ0FURUQ7Ci0KLQotICAgIC8qIVxicmllZiBEZWNvZGVkIGZyYW1lcyBpdGVyYXRvcgotICAgICAqCi0gICAgICogSXRlcmF0ZXMgb3ZlciBhIGxpc3Qgb2YgdGhlIGZyYW1lcyBhdmFpbGFibGUgZm9yIGRpc3BsYXkuIFRoZSBpdGVyYXRvcgotICAgICAqIHN0b3JhZ2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4gSXRlcmF0aW9uIGlzCi0gICAgICogY29tcGxldGUgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4KLSAgICAgKgotICAgICAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmcmFtZXMgYmVjb21lcyB2YWxpZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhlCi0gICAgICogdnB4X2RlY19kZWNvZGUgY2FsbCwgYW5kIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byB2cHhfZGVjX2RlY29kZS4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgIGN0eCAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKLSAgICAgKiBccGFyYW1baW4gb3V0XSBpdGVyICAgICBJdGVyYXRvciBzdG9yYWdlLCBpbml0aWFsaXplZCB0byBOVUxMCi0gICAgICoKLSAgICAgKiBccmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIGFuIGltYWdlLCBpZiBvbmUgaXMgcmVhZHkgZm9yIGRpc3BsYXkuIEZyYW1lcwotICAgICAqICAgICAgICAgcHJvZHVjZWQgd2lsbCBhbHdheXMgYmUgaW4gUFRTIChwcmVzZW50YXRpb24gdGltZSBzdGFtcCkgb3JkZXIuCi0gICAgICovCi0gICAgdnB4X2ltYWdlX3QgKnZweF9kZWNfZ2V0X2ZyYW1lKHZweF9kZWNfY3R4X3QgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9kZWNfaXRlcl90ICppdGVyKSBERVBSRUNBVEVEOwotCi0KLSAgICAvKiFcZGVmZ3JvdXAgY2FwX3B1dF9mcmFtZSBGcmFtZS1CYXNlZCBEZWNvZGluZyBGdW5jdGlvbnMKLSAgICAgKgotICAgICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIGRlY29kZXJzCi0gICAgICogdGhhdCBhZHZlcnRpc2UgdGhlIFZQWF9ERUNfQ0FQX1BVVF9GUkFNRSBjYXBhYmlsaXR5LiBDYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucwotICAgICAqIGZvciBjb2RlY3MgdGhhdCBkb24ndCBhZHZlcnRpc2UgdGhpcyBjYXBhYmlsaXR5IHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCi0gICAgICogY29kZSBiZWluZyByZXR1cm5lZCwgdXN1YWxseSBWUFhfREVDX0VSUk9SCi0gICAgICogQHsKLSAgICAgKi8KLQotICAgIC8qIVxicmllZiBwdXQgZnJhbWUgY2FsbGJhY2sgcHJvdG90eXBlCi0gICAgICoKLSAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIGRlY29kZXIgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBvZgotICAgICAqIHRoZSBhdmFpbGFiaWxpdHkgb2YgZGVjb2RlZCBpbWFnZSBkYXRhLgotICAgICAqLwotICAgIHR5cGVkZWYgdm9pZCAoKnZweF9kZWNfcHV0X2ZyYW1lX2NiX2ZuX3QpKHZvaWQgICAgICAgICAgKnVzZXJfcHJpdiwKLSAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV90ICppbWcpOwotCi0KLSAgICAvKiFcYnJpZWYgUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBmcmFtZSBjb21wbGV0aW9uLgotICAgICAqCi0gICAgICogUmVnaXN0ZXJzIGEgZ2l2ZW4gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBkZWNvZGVkIGZyYW1lIGlzCi0gICAgICogYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSBjdHggICAgICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICAgICAqIFxwYXJhbVtpbl0gY2IgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgICogXHBhcmFtW2luXSB1c2VyX3ByaXYgICAgVXNlcidzIHByaXZhdGUgZGF0YQotICAgICAqCi0gICAgICogXHJldHZhbCAjVlBYX0RFQ19PSwotICAgICAqICAgICBDYWxsYmFjayBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4KLSAgICAgKiBccmV0dmFsICNWUFhfREVDX0VSUk9SCi0gICAgICogICAgIERlY29kZXIgY29udGV4dCBub3QgaW5pdGlhbGl6ZWQsIG9yIGFsZ29yaXRobSBub3QgY2FwYWJsZSBvZgotICAgICAqICAgICBwb3N0aW5nIHNsaWNlIGNvbXBsZXRpb24uCi0gICAgICovCi0gICAgdnB4X2RlY19lcnJfdCB2cHhfZGVjX3JlZ2lzdGVyX3B1dF9mcmFtZV9jYih2cHhfZGVjX2N0eF90ICAgICAgICAgICAgICpjdHgsCi0gICAgICAgICAgICB2cHhfZGVjX3B1dF9mcmFtZV9jYl9mbl90ICBjYiwKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfcHJpdikgREVQUkVDQVRFRDsKLQotCi0gICAgLyohQH0gLSBlbmQgZGVmZ3JvdXAgY2FwX3B1dF9mcmFtZSAqLwotCi0gICAgLyohXGRlZmdyb3VwIGNhcF9wdXRfc2xpY2UgU2xpY2UtQmFzZWQgRGVjb2RpbmcgRnVuY3Rpb25zCi0gICAgICoKLSAgICAgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGFsbCBkZWNvZGVycwotICAgICAqIHRoYXQgYWR2ZXJ0aXNlIHRoZSBWUFhfREVDX0NBUF9QVVRfU0xJQ0UgY2FwYWJpbGl0eS4gQ2FsbGluZyB0aGVzZSBmdW5jdGlvbnMKLSAgICAgKiBmb3IgY29kZWNzIHRoYXQgZG9uJ3QgYWR2ZXJ0aXNlIHRoaXMgY2FwYWJpbGl0eSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvcgotICAgICAqIGNvZGUgYmVpbmcgcmV0dXJuZWQsIHVzdWFsbHkgVlBYX0RFQ19FUlJPUgotICAgICAqIEB7Ci0gICAgICovCi0KLSAgICAvKiFcYnJpZWYgcHV0IHNsaWNlIGNhbGxiYWNrIHByb3RvdHlwZQotICAgICAqCi0gICAgICogVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IHRoZSBkZWNvZGVyIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gb2YKLSAgICAgKiB0aGUgYXZhaWxhYmlsaXR5IG9mIHBhcnRpYWxseSBkZWNvZGVkIGltYWdlIGRhdGEuIFRoZQotICAgICAqLwotICAgIHR5cGVkZWYgdm9pZCAoKnZweF9kZWNfcHV0X3NsaWNlX2NiX2ZuX3QpKHZvaWQgICAgICAgICAgICp1c2VyX3ByaXYsCi0gICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCAgICAgICppbWcsCi0gICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfcmVjdF90ICp2YWxpZCwKLSAgICAgICAgICAgIGNvbnN0IHZweF9pbWFnZV9yZWN0X3QgKnVwZGF0ZSk7Ci0KLQotICAgIC8qIVxicmllZiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIG9mIHNsaWNlIGNvbXBsZXRpb24uCi0gICAgICoKLSAgICAgKiBSZWdpc3RlcnMgYSBnaXZlbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhIGRlY29kZWQgc2xpY2UgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dIGN0eCAgICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luXSBjYiAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgKiBccGFyYW1baW5dIHVzZXJfcHJpdiAgICBVc2VyJ3MgcHJpdmF0ZSBkYXRhCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfREVDX09LCi0gICAgICogICAgIENhbGxiYWNrIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfRVJST1IKLSAgICAgKiAgICAgRGVjb2RlciBjb250ZXh0IG5vdCBpbml0aWFsaXplZCwgb3IgYWxnb3JpdGhtIG5vdCBjYXBhYmxlIG9mCi0gICAgICogICAgIHBvc3Rpbmcgc2xpY2UgY29tcGxldGlvbi4KLSAgICAgKi8KLSAgICB2cHhfZGVjX2Vycl90IHZweF9kZWNfcmVnaXN0ZXJfcHV0X3NsaWNlX2NiKHZweF9kZWNfY3R4X3QgICAgICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgIHZweF9kZWNfcHV0X3NsaWNlX2NiX2ZuX3QgIGNiLAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9wcml2KSBERVBSRUNBVEVEOwotCi0KLSAgICAvKiFAfSAtIGVuZCBkZWZncm91cCBjYXBfcHV0X3NsaWNlKi8KLQotICAgIC8qIVxkZWZncm91cCBjYXBfeG1hIEV4dGVybmFsIE1lbW9yeSBBbGxvY2F0aW9uIEZ1bmN0aW9ucwotICAgICAqCi0gICAgICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGJlIGltcGxlbWVudGVkIGZvciBhbGwgZGVjb2RlcnMKLSAgICAgKiB0aGF0IGFkdmVydGlzZSB0aGUgVlBYX0RFQ19DQVBfWE1BIGNhcGFiaWxpdHkuIENhbGxpbmcgdGhlc2UgZnVuY3Rpb25zCi0gICAgICogZm9yIGNvZGVjcyB0aGF0IGRvbid0IGFkdmVydGlzZSB0aGlzIGNhcGFiaWxpdHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IKLSAgICAgKiBjb2RlIGJlaW5nIHJldHVybmVkLCB1c3VhbGx5IFZQWF9ERUNfRVJST1IKLSAgICAgKiBAewotICAgICAqLwotCi0gICAgLyohXGJyaWVmIE1lbW9yeSBNYXAgRW50cnkKLSAgICAgKgotICAgICAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gY29udGFpbiB0aGUgcHJvcGVydGllcyBvZiBhIG1lbW9yeSBzZWdtZW50LiBJdAotICAgICAqIGlzIHBvcHVsYXRlZCBieSB0aGUgZGVjb2RlciBpbiB0aGUgcmVxdWVzdCBwaGFzZSwgYW5kIGJ5IHRoZSBjYWxsaW5nCi0gICAgICogYXBwbGljYXRpb24gb25jZSB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkLgotICAgICAqLwotI2lmIDEKLSNkZWZpbmUgVlBYX0RFQ19NRU1fWkVSTyAgICAgMHgxICAvKio8IFNlZ21lbnQgbXVzdCBiZSB6ZXJvZWQgYnkgYWxsb2NhdGlvbiAqLwotI2RlZmluZSBWUFhfREVDX01FTV9XUk9OTFkgICAweDIgIC8qKjwgU2VnbWVudCBuZWVkIG5vdCBiZSByZWFkYWJsZSAqLwotI2RlZmluZSBWUFhfREVDX01FTV9GQVNUICAgICAweDQgIC8qKjwgUGxhY2UgaW4gZmFzdCBtZW1vcnksIGlmIGF2YWlsYWJsZSAqLwotICAgIHR5cGVkZWYgc3RydWN0IHZweF9jb2RlY19tbWFwIHZweF9kZWNfbW1hcF90OwotI2Vsc2UKLSAgICB0eXBlZGVmIHN0cnVjdCB2cHhfZGVjX21tYXAKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgc2V0IGJ5IHRoZSBjb2RlYyB3aGVuIHJlcXVlc3RpbmcgYSBzZWdtZW50Ci0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICBpZDsgICAgIC8qKjwgaWRlbnRpZmllciBmb3IgdGhlIHNlZ21lbnQncyBjb250ZW50cyAqLwotICAgICAgICB1bnNpZ25lZCBsb25nICBzejsgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc2VnbWVudCwgaW4gYnl0ZXMgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgYWxpZ247ICAvKio8IHJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGUgc2VnbWVudCwgaW4gYnl0ZXMgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3M7ICAvKio8IGJpdGZpZWxkIGNvbnRhaW5pbmcgc2VnbWVudCBwcm9wZXJ0aWVzICovCi0jZGVmaW5lIFZQWF9ERUNfTUVNX1pFUk8gICAgIDB4MSAgLyoqPCBTZWdtZW50IG11c3QgYmUgemVyb2VkIGJ5IGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgVlBYX0RFQ19NRU1fV1JPTkxZICAgMHgyICAvKio8IFNlZ21lbnQgbmVlZCBub3QgYmUgcmVhZGFibGUgKi8KLSNkZWZpbmUgVlBYX0RFQ19NRU1fRkFTVCAgICAgMHg0ICAvKio8IFBsYWNlIGluIGZhc3QgbWVtb3J5LCBpZiBhdmFpbGFibGUgKi8KLQotICAgICAgICAvKiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIHRvIGJlIGZpbGxlZCBpbiBieSB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICB2b2lkICAgICAgICAgICpiYXNlOyAgIC8qKjwgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHNlZ21lbnQgKi8KLSAgICAgICAgdm9pZCAoKmR0b3IpKHN0cnVjdCB2cHhfZGVjX21tYXAgKm1hcCk7ICAgICAgICAgLyoqPCBkZXN0cnVjdG9yIHRvIGNhbGwgKi8KLSAgICAgICAgdm9pZCAgICAgICAgICAqcHJpdjsgICAvKio8IGFsbG9jYXRvciBwcml2YXRlIHN0b3JhZ2UgKi8KLSAgICB9IHZweF9kZWNfbW1hcF90OwotI2VuZGlmCi0KLSAgICAvKiFcYnJpZWYgSW5pdGlhbGl6ZSBhIGRlY29kZXIgaW5zdGFuY2UgaW4gZXh0ZXJuYWwgYWxsb2NhdGlvbiBtb2RlCi0gICAgICoKLSAgICAgKiBJbml0aWFsaXplcyBhIGRlY29kZXIgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gaW50ZXJmYWNlLiBBcHBsaWNhdGlvbnMKLSAgICAgKiBzaG91bGQgY2FsbCB0aGUgdnB4X2RlY194bWFfaW5pdCBjb252ZW5pZW5jZSBtYWNybyBpbnN0ZWFkIG9mIHRoaXMKLSAgICAgKiBmdW5jdGlvbiBkaXJlY3RseSwgdG8gZW5zdXJlIHRoYXQgdGhlIEFCSSB2ZXJzaW9uIG51bWJlciBwYXJhbWV0ZXIKLSAgICAgKiBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgY3R4ICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0LgotICAgICAqIFxwYXJhbVtpbl0gICAgaWZhY2UgICBQb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlIHRvIHVzZS4KLSAgICAgKiBccGFyYW1baW5dICAgIHZlciAgICAgQUJJIHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIHNldCB0bwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBWUFhfREVDT0RFUl9BQklfVkVSU0lPTgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfT0sKLSAgICAgKiAgICAgVGhlIGRlY29kZXIgYWxnb3JpdGhtIGluaXRpYWxpemVkLgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfRVJST1IKLSAgICAgKiAgICAgRGVjb2RlciBkb2VzIG5vdCBzdXBwb3J0IFhNQSBtb2RlLgotICAgICAqLwotICAgIHZweF9kZWNfZXJyX3QgdnB4X2RlY194bWFfaW5pdF92ZXIodnB4X2RlY19jdHhfdCAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19pZmFjZV90ICAqaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2ZXIpIERFUFJFQ0FURUQ7Ci0jZGVmaW5lIHZweF9kZWNfeG1hX2luaXQoY3R4LCBpZmFjZSkgXAotICAgIHZweF9kZWNfeG1hX2luaXRfdmVyKGN0eCwgaWZhY2UsIFZQWF9ERUNPREVSX0FCSV9WRVJTSU9OKQotCi0KLSAgICAvKiFcYnJpZWYgSXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIHNlZ21lbnRzIHRvIGFsbG9jYXRlLgotICAgICAqCi0gICAgICogSXRlcmF0ZXMgb3ZlciBhIGxpc3Qgb2YgdGhlIHNlZ21lbnRzIHRvIGFsbG9jYXRlLiBUaGUgaXRlcmF0b3Igc3RvcmFnZQotICAgICAqIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byBOVUxMIHRvIHN0YXJ0IHRoZSBpdGVyYXRpb24uIEl0ZXJhdGlvbiBpcyBjb21wbGV0ZQotICAgICAqIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFZQWF9ERUNfTElTVF9FTkQuIFRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0bwotICAgICAqIGFsbG9jYXRlIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBzaXplIG9mIHRoZSBlbmNvZGVkIHN0cmVhbS4gVGhpcyBtZWFucyB0aGF0Ci0gICAgICogdGhlIHN0cmVhbSBpbmZvIHN0cnVjdHVyZSBtdXN0IGJlIGtub3duIGF0IGFsbG9jYXRpb24gdGltZS4gSXQgY2FuIGJlCi0gICAgICogcG9wdWxhdGVkIHdpdGggdGhlIHZweF9kZWNfcGVla19zdHJlYW1faW5mbygpIGZ1bmN0aW9uLiBJbiBjYXNlcyB3aGVyZSB0aGUKLSAgICAgKiBzdHJlYW0gdG8gYmUgZGVjb2RlZCBpcyBub3QgYXZhaWxhYmxlIGF0IGFsbG9jYXRpb24gdGltZSwgYSBmaXhlZCBzaXplIG11c3QKLSAgICAgKiBiZSByZXF1ZXN0ZWQuIFRoZSBkZWNvZGVyIHdpbGwgbm90IGJlIGFibGUgdG8gZGVjb2RlIHN0cmVhbXMgbGFyZ2VyIHRoYW4KLSAgICAgKiB0aGUgc2l6ZSB1c2VkIGF0IGFsbG9jYXRpb24gdGltZS4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQuCi0gICAgICogXHBhcmFtW291dF0gICAgIG1tYXAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IG1hcCBlbnRyeSB0byBwb3B1bGF0ZS4KLSAgICAgKiBccGFyYW1baW5dICAgICAgc2kgICAgICBQb2ludGVyIHRvIHRoZSBzdHJlYW0gaW5mby4KLSAgICAgKiBccGFyYW1baW4gb3V0XSAgaXRlciAgICBJdGVyYXRvciBzdG9yYWdlLCBpbml0aWFsaXplZCB0byBOVUxMCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfREVDX09LCi0gICAgICogICAgIFRoZSBtZW1vcnkgbWFwIGVudHJ5IHdhcyBwb3B1bGF0ZWQuCi0gICAgICogXHJldHZhbCAjVlBYX0RFQ19FUlJPUgotICAgICAqICAgICBEZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgWE1BIG1vZGUuCi0gICAgICogXHJldHZhbCAjVlBYX0RFQ19NRU1fRVJST1IKLSAgICAgKiAgICAgVW5hYmxlIHRvIGRldGVybWluZSBzZWdtZW50IHNpemUgZnJvbSBzdHJlYW0gaW5mby4KLSAgICAgKi8KLSAgICB2cHhfZGVjX2Vycl90IHZweF9kZWNfZ2V0X21lbV9tYXAodnB4X2RlY19jdHhfdCAgICAgICAgICAgICAgICAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZGVjX21tYXBfdCAgICAgICAgICAgICAgICptbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfZGVjX3N0cmVhbV9pbmZvX3QgICpzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2RlY19pdGVyX3QgICAgICAgICAgICAgICAqaXRlcikgREVQUkVDQVRFRDsKLQotCi0gICAgLyohXGJyaWVmIElkZW50aWZ5IGFsbG9jYXRlZCBzZWdtZW50cyB0byBkZWNvZGVyIGluc3RhbmNlCi0gICAgICoKLSAgICAgKiBTdG9yZXMgYSBsaXN0IG9mIGFsbG9jYXRlZCBzZWdtZW50cyBpbiB0aGUgZGVjb2Rlci4gU2VnbWVudHMgXHJlZiBNVVNUIGJlCi0gICAgICogcGFzc2VkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWFkIGZyb20gdnB4X2RlY19nZXRfbWVtX21hcCgpLCBidXQgbWF5IGJlCi0gICAgICogcGFzc2VkIGluIGdyb3VwcyBvZiBhbnkgc2l6ZS4gU2VnbWVudHMgXHJlZiBNVVNUIGJlIHNldCBvbmx5IG9uY2UuIFRoZQotICAgICAqIGFsbG9jYXRpb24gZnVuY3Rpb24gXHJlZiBNVVNUIGVuc3VyZSB0aGF0IHRoZSB2cHhfZGVjX21tYXBfdDo6YmFzZSBtZW1iZXIKLSAgICAgKiBpcyBub24tTlVMTC4gSWYgdGhlIHNlZ21lbnQgcmVxdWlyZXMgY2xlYW51cCBoYW5kbGluZyAoZS5nLiwgY2FsbGluZyBmcmVlKCkKLSAgICAgKiBvciBjbG9zZSgpKSB0aGVuIHRoZSB2cHhfZGVjX21tYXBfdDo6ZHRvciBtZW1iZXIgXHJlZiBNVVNUIGJlIHBvcHVsYXRlZC4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQuCi0gICAgICogXHBhcmFtW2luXSAgICAgIG1tYXBzICAgUG9pbnRlciB0byB0aGUgZmlyc3QgbWVtb3J5IG1hcCBlbnRyeSBpbiB0aGUgbGlzdC4KLSAgICAgKiBccGFyYW1baW5dICAgICAgbnVtX21hcHMgIE51bWJlciBvZiBlbnRyaWVzIGJlaW5nIHNldCBhdCB0aGlzIHRpbWUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfT0sKLSAgICAgKiAgICAgVGhlIHNlZ21lbnQgd2FzIHN0b3JlZCBpbiB0aGUgZGVjb2RlciBjb250ZXh0LgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfRVJST1IKLSAgICAgKiAgICAgRGVjb2RlciBkb2VzIG5vdCBzdXBwb3J0IFhNQSBtb2RlLgotICAgICAqIFxyZXR2YWwgI1ZQWF9ERUNfTUVNX0VSUk9SCi0gICAgICogICAgIFNlZ21lbnQgYmFzZSBhZGRyZXNzIHdhcyBub3Qgc2V0LCBvciBzZWdtZW50IHdhcyBhbHJlYWR5IHN0b3JlZC4KLQotICAgICAqLwotICAgIHZweF9kZWNfZXJyX3QgIHZweF9kZWNfc2V0X21lbV9tYXAodnB4X2RlY19jdHhfdCAgICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZGVjX21tYXBfdCAgKm1tYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBudW1fbWFwcykgREVQUkVDQVRFRDsKLQotICAgIC8qIUB9IC0gZW5kIGRlZmdyb3VwIGNhcF94bWEqLwotICAgIC8qIUB9IC0gZW5kIGRlZmdyb3VwIGRlY29kZXIqLwotCi0KLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweC92cHhfZW5jb2Rlci5oIGIvdnB4L3ZweF9lbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDQ0MTQuLjAwMDAwMDAKLS0tIGEvdnB4L3ZweF9lbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qIVxkZWZncm91cCBlbmNvZGVyIEVuY29kZXIgQWxnb3JpdGhtIEludGVyZmFjZQotICogXGluZ3JvdXAgY29kZWMKLSAqIFRoaXMgYWJzdHJhY3Rpb24gYWxsb3dzIGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGVuY29kZXIgdG8gZWFzaWx5IHN1cHBvcnQKLSAqIG11bHRpcGxlIHZpZGVvIGZvcm1hdHMgd2l0aCBtaW5pbWFsIGNvZGUgZHVwbGljYXRpb24uIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMKLSAqIHRoZSBpbnRlcmZhY2UgY29tbW9uIHRvIGFsbCBlbmNvZGVycy4KLSAqIEB7Ci0gKi8KLQotLyohXGZpbGUKLSAqIFxicmllZiBEZXNjcmliZXMgdGhlIGVuY29kZXIgYWxnb3JpdGhtIGludGVyZmFjZSB0byBhcHBsaWNhdGlvbnMuCi0gKgotICogVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYW4gYXBwbGljYXRpb24gYW5kIGEKLSAqIHZpZGVvIGVuY29kZXIgYWxnb3JpdGhtLgotICoKLSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIFZQWF9FTkNPREVSX0gKLSNkZWZpbmUgVlBYX0VOQ09ERVJfSAotI2luY2x1ZGUgInZweF9jb2RlYy5oIgotCi0KLSAgICAvKiFcYnJpZWYgQ3VycmVudCBBQkkgdmVyc2lvbiBudW1iZXIKLSAgICAgKgotICAgICAqIFxpbnRlcm5hbAotICAgICAqIElmIHRoaXMgZmlsZSBpcyBhbHRlcmVkIGluIGFueSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBBQkksIHRoaXMgdmFsdWUKLSAgICAgKiBtdXN0IGJlIGJ1bXBlZC4gIEV4YW1wbGVzIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIGNoYW5naW5nCi0gICAgICogdHlwZXMsIHJlbW92aW5nIG9yIHJlYXNzaWduaW5nIGVudW1zLCBhZGRpbmcvcmVtb3ZpbmcvcmVhcnJhbmdpbmcKLSAgICAgKiBmaWVsZHMgdG8gc3RydWN0dXJlcwotICAgICAqLwotI2RlZmluZSBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiAoMiArIFZQWF9DT0RFQ19BQklfVkVSU0lPTikgLyoqPFxoaWRlaW5pdGlhbGl6ZXIqLwotCi0KLSAgICAvKiEgXGJyaWVmIEVuY29kZXIgY2FwYWJpbGl0aWVzIGJpdGZpZWxkCi0gICAgICoKLSAgICAgKiAgRWFjaCBlbmNvZGVyIGFkdmVydGlzZXMgdGhlIGNhcGFiaWxpdGllcyBpdCBzdXBwb3J0cyBhcyBwYXJ0IG9mIGl0cwotICAgICAqICA6OnZweF9jb2RlY19pZmFjZV90IGludGVyZmFjZSBzdHJ1Y3R1cmUuIENhcGFiaWxpdGllcyBhcmUgZXh0cmEKLSAgICAgKiAgaW50ZXJmYWNlcyBvciBmdW5jdGlvbmFsaXR5LCBhbmQgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQKLSAgICAgKiAgYnkgYW4gZW5jb2Rlci4KLSAgICAgKgotICAgICAqICBUaGUgYXZhaWxhYmxlIGZsYWdzIGFyZSBzcGVjaWZpZWQgYnkgVlBYX0NPREVDX0NBUF8qIGRlZmluZXMuCi0gICAgICovCi0jZGVmaW5lIFZQWF9DT0RFQ19DQVBfUFNOUiAgMHgxMDAwMCAvKio8IENhbiBpc3N1ZSBQU05SIHBhY2tldHMgKi8KLQotCi0gICAgLyohIFxicmllZiBJbml0aWFsaXphdGlvbi10aW1lIEZlYXR1cmUgRW5hYmxpbmcKLSAgICAgKgotICAgICAqICBDZXJ0YWluIGNvZGVjIGZlYXR1cmVzIG11c3QgYmUga25vd24gYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgdG8gYWxsb3cKLSAgICAgKiAgZm9yIHByb3BlciBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICAgKgotICAgICAqICBUaGUgYXZhaWxhYmxlIGZsYWdzIGFyZSBzcGVjaWZpZWQgYnkgVlBYX0NPREVDX1VTRV8qIGRlZmluZXMuCi0gICAgICovCi0jZGVmaW5lIFZQWF9DT0RFQ19VU0VfUFNOUiAgMHgxMDAwMCAvKio8IENhbGN1bGF0ZSBQU05SIG9uIGVhY2ggZnJhbWUgKi8KLQotCi0gICAgLyohXGJyaWVmIEdlbmVyaWMgZml4ZWQgc2l6ZSBidWZmZXIgc3RydWN0dXJlCi0gICAgICoKLSAgICAgKiBUaGlzIHN0cnVjdHVyZSBpcyBhYmxlIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8gYW55IGZpeGVkIHNpemUgYnVmZmVyLgotICAgICAqLwotICAgIHR5cGVkZWYgc3RydWN0IHZweF9maXhlZF9idWYKLSAgICB7Ci0gICAgICAgIHZvaWQgICAgICAgICAgKmJ1ZjsgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhICovCi0gICAgICAgIHNpemVfdCAgICAgICAgIHN6OyAgLyoqPCBMZW5ndGggb2YgdGhlIGJ1ZmZlciwgaW4gY2hhcnMgKi8KLSAgICB9IHZweF9maXhlZF9idWZfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9maXhlZF9idWYgKi8KLQotCi0gICAgLyohXGJyaWVmIFRpbWUgU3RhbXAgVHlwZQotICAgICAqCi0gICAgICogQW4gaW50ZWdlciwgd2hpY2ggd2hlbiBtdWx0aXBsaWVkIGJ5IHRoZSBzdHJlYW0ncyB0aW1lIGJhc2UsIHByb3ZpZGVzCi0gICAgICogdGhlIGFic29sdXRlIHRpbWUgb2YgYSBzYW1wbGUuCi0gICAgICovCi0gICAgdHlwZWRlZiBpbnQ2NF90IHZweF9jb2RlY19wdHNfdDsKLQotCi0gICAgLyohXGJyaWVmIENvbXByZXNzZWQgRnJhbWUgRmxhZ3MKLSAgICAgKgotICAgICAqIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgYml0ZmllbGQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbXByZXNzZWQKLSAgICAgKiBmcmFtZSB0aGF0IG1heSBiZSB1c2VmdWwgdG8gYW4gYXBwbGljYXRpb24uIFRoZSBtb3N0IHNpZ25pZmljYW50IDE2IGJpdHMKLSAgICAgKiBjYW4gYmUgdXNlZCBieSBhbiBhbGdvcml0aG0gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGRldGFpbCwgZm9yIGV4YW1wbGUgdG8KLSAgICAgKiBzdXBwb3J0IGZyYW1lIHR5cGVzIHRoYXQgYXJlIGNvZGVjIHNwZWNpZmljIChNUEVHLTEgRC1mcmFtZXMgZm9yIGV4YW1wbGUpCi0gICAgICovCi0gICAgdHlwZWRlZiB1aW50MzJfdCB2cHhfY29kZWNfZnJhbWVfZmxhZ3NfdDsKLSNkZWZpbmUgVlBYX0ZSQU1FX0lTX0tFWSAgICAgICAweDEgLyoqPCBmcmFtZSBpcyB0aGUgc3RhcnQgb2YgYSBHT1AgKi8KLSNkZWZpbmUgVlBYX0ZSQU1FX0lTX0RST1BQQUJMRSAweDIgLyoqPCBmcmFtZSBjYW4gYmUgZHJvcHBlZCB3aXRob3V0IGFmZmVjdGluZwotICAgIHRoZSBzdHJlYW0gKG5vIGZ1dHVyZSBmcmFtZSBkZXBlbmRzIG9uCi0gICAgICAgICAgICAgICAgdGhpcyBvbmUpICovCi0jZGVmaW5lIFZQWF9GUkFNRV9JU19JTlZJU0lCTEUgMHg0IC8qKjwgZnJhbWUgc2hvdWxkIGJlIGRlY29kZWQgYnV0IHdpbGwgbm90Ci0gICAgYmUgc2hvd24gKi8KLQotCi0gICAgLyohXGJyaWVmIEVuY29kZXIgb3V0cHV0IHBhY2tldCB2YXJpYW50cwotICAgICAqCi0gICAgICogVGhpcyBlbnVtZXJhdGlvbiBsaXN0cyB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIGRhdGEgcGFja2V0cyB0aGF0IGNhbiBiZQotICAgICAqIHJldHVybmVkIGJ5IGNhbGxzIHRvIHZweF9jb2RlY19nZXRfY3hfZGF0YSgpLiBBbGdvcml0aG1zIFxyZWYgTUFZCi0gICAgICogZXh0ZW5kIHRoaXMgbGlzdCB0byBwcm92aWRlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KLSAgICAgKi8KLSAgICBlbnVtIHZweF9jb2RlY19jeF9wa3Rfa2luZAotICAgIHsKLSAgICAgICAgVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCwgICAgLyoqPCBDb21wcmVzc2VkIHZpZGVvIGZyYW1lICovCi0gICAgICAgIFZQWF9DT0RFQ19TVEFUU19QS1QsICAgICAgIC8qKjwgVHdvLXBhc3Mgc3RhdGlzdGljcyBmb3IgdGhpcyBmcmFtZSAqLwotICAgICAgICBWUFhfQ09ERUNfUFNOUl9QS1QsICAgICAgICAvKio8IFBTTlIgc3RhdGlzdGljcyBmb3IgdGhpcyBmcmFtZSAqLwotICAgICAgICBWUFhfQ09ERUNfQ1VTVE9NX1BLVCA9IDI1NiAvKio8IEFsZ29yaXRobSBleHRlbnNpb25zICAqLwotICAgIH07Ci0KLQotICAgIC8qIVxicmllZiBFbmNvZGVyIG91dHB1dCBwYWNrZXQKLSAgICAgKgotICAgICAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBkaWZmZXJlbnQga2luZHMgb2Ygb3V0cHV0IGRhdGEgdGhlIGVuY29kZXIKLSAgICAgKiBtYXkgcHJvZHVjZSB3aGlsZSBjb21wcmVzc2luZyBhIGZyYW1lLgotICAgICAqLwotICAgIHR5cGVkZWYgc3RydWN0IHZweF9jb2RlY19jeF9wa3QKLSAgICB7Ci0gICAgICAgIGVudW0gdnB4X2NvZGVjX2N4X3BrdF9raW5kICBraW5kOyAvKio8IHBhY2tldCB2YXJpYW50ICovCi0gICAgICAgIHVuaW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cnVjdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpidWY7ICAgICAgLyoqPCBjb21wcmVzc2VkIGRhdGEgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgIHN6OyAgICAgICAvKio8IGxlbmd0aCBvZiBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICAgICAgICAgICAgICB2cHhfY29kZWNfcHRzX3QgICAgICAgICAgcHRzOyAgICAgIC8qKjwgdGltZSBzdGFtcCB0byBzaG93IGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIHRpbWViYXNlIHVuaXRzKSAqLwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBkdXJhdGlvbjsgLyoqPCBkdXJhdGlvbiB0byBzaG93IGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIHRpbWViYXNlIHVuaXRzKSAqLwotICAgICAgICAgICAgICAgIHZweF9jb2RlY19mcmFtZV9mbGFnc190ICBmbGFnczsgICAgLyoqPCBmbGFncyBmb3IgdGhpcyBmcmFtZSAqLwotICAgICAgICAgICAgfSBmcmFtZTsgIC8qKjwgZGF0YSBmb3IgY29tcHJlc3NlZCBmcmFtZSBwYWNrZXQgKi8KLSAgICAgICAgICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmIHR3b3Bhc3Nfc3RhdHM7ICAvKio8IGRhdGEgZm9yIHR3by1wYXNzIHBhY2tldCAqLwotICAgICAgICAgICAgc3RydWN0IHZweF9wc25yX3BrdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzYW1wbGVzWzRdOyAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlcywgdG90YWwveS91L3YgKi8KLSAgICAgICAgICAgICAgICB1aW50NjRfdCAgICAgc3NlWzRdOyAgICAgIC8qKjwgc3VtIHNxdWFyZWQgZXJyb3IsIHRvdGFsL3kvdS92ICovCi0gICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHBzbnJbNF07ICAgICAvKio8IFBTTlIsIHRvdGFsL3kvdS92ICovCi0gICAgICAgICAgICB9IHBzbnI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IGRhdGEgZm9yIFBTTlIgcGFja2V0ICovCi0gICAgICAgICAgICBzdHJ1Y3QgdnB4X2ZpeGVkX2J1ZiByYXc7ICAgICAvKio8IGRhdGEgZm9yIGFyYml0cmFyeSBwYWNrZXRzICovCi0KLSAgICAgICAgICAgIC8qIFRoaXMgcGFja2V0IHNpemUgaXMgZml4ZWQgdG8gYWxsb3cgY29kZWNzIHRvIGV4dGVuZCB0aGlzCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2Ugd2l0aG91dCBoYXZpbmcgdG8gbWFuYWdlIHN0b3JhZ2UgZm9yIHJhdyBwYWNrZXRzLAotICAgICAgICAgICAgICogaS5lLiwgaWYgaXQncyBzbWFsbGVyIHRoYW4gMTI4IGJ5dGVzLCB5b3UgY2FuIHN0b3JlIGluIHRoZQotICAgICAgICAgICAgICogcGFja2V0IGxpc3QgZGlyZWN0bHkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNoYXIgcGFkWzEyOCAtIHNpemVvZihlbnVtIHZweF9jb2RlY19jeF9wa3Rfa2luZCldOyAvKio8IGZpeGVkIHN6ICovCi0gICAgICAgIH0gZGF0YTsgLyoqPCBwYWNrZXQgZGF0YSAqLwotICAgIH0gdnB4X2NvZGVjX2N4X3BrdF90OyAvKio8IGFsaWFzIGZvciBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqLwotCi0KLSAgICAvKiFcYnJpZWYgUmF0aW9uYWwgTnVtYmVyCi0gICAgICoKLSAgICAgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhIGZyYWN0aW9uYWwgdmFsdWUuCi0gICAgICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X3JhdGlvbmFsCi0gICAgewotICAgICAgICBpbnQgbnVtOyAvKio8IGZyYWN0aW9uIG51bWVyYXRvciAqLwotICAgICAgICBpbnQgZGVuOyAvKio8IGZyYWN0aW9uIGRlbm9taW5hdG9yICovCi0gICAgfSB2cHhfcmF0aW9uYWxfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9yYXRpb25hbCAqLwotCi0KLSAgICAvKiFcYnJpZWYgTXVsdGktcGFzcyBFbmNvZGluZyBQYXNzICovCi0gICAgZW51bSB2cHhfZW5jX3Bhc3MKLSAgICB7Ci0gICAgICAgIFZQWF9SQ19PTkVfUEFTUywgICAvKio8IFNpbmdsZSBwYXNzIG1vZGUgKi8KLSAgICAgICAgVlBYX1JDX0ZJUlNUX1BBU1MsIC8qKjwgRmlyc3QgcGFzcyBvZiBtdWx0aS1wYXNzIG1vZGUgKi8KLSAgICAgICAgVlBYX1JDX0xBU1RfUEFTUyAgIC8qKjwgRmluYWwgcGFzcyBvZiBtdWx0aS1wYXNzIG1vZGUgKi8KLSAgICB9OwotCi0KLSAgICAvKiFcYnJpZWYgUmF0ZSBjb250cm9sIG1vZGUgKi8KLSAgICBlbnVtIHZweF9yY19tb2RlCi0gICAgewotICAgICAgICBWUFhfVkJSLCAvKio8IFZhcmlhYmxlIEJpdCBSYXRlIChWQlIpIG1vZGUgKi8KLSAgICAgICAgVlBYX0NCUiwgIC8qKjwgQ29uc3RhbnQgQml0IFJhdGUgKENCUikgbW9kZSAqLwotICAgICAgICBWUFhfQ1EgICAvKio8IENvbnN0YW50IFF1YWxpdHkgIChDUSkgIG1vZGUgKi8KLSAgICB9OwotCi0KLSAgICAvKiFcYnJpZWYgS2V5ZnJhbWUgcGxhY2VtZW50IG1vZGUuCi0gICAgICoKLSAgICAgKiBUaGlzIGVudW1lcmF0aW9uIGRldGVybWluZXMgd2hldGhlciBrZXlmcmFtZXMgYXJlIHBsYWNlZCBhdXRvbWF0aWNhbGx5IGJ5Ci0gICAgICogdGhlIGVuY29kZXIgb3Igd2hldGhlciB0aGlzIGJlaGF2aW9yIGlzIGRpc2FibGVkLiBPbGRlciByZWxlYXNlcyBvZiB0aGlzCi0gICAgICogU0RLIHdlcmUgaW1wbGVtZW50ZWQgc3VjaCB0aGF0IFZQWF9LRl9GSVhFRCBtZWFudCBrZXlmcmFtZXMgd2VyZSBkaXNhYmxlZC4KLSAgICAgKiBUaGlzIG5hbWUgaXMgY29uZnVzaW5nIGZvciB0aGlzIGJlaGF2aW9yLCBzbyB0aGUgbmV3IHN5bWJvbHMgdG8gYmUgdXNlZAotICAgICAqIGFyZSBWUFhfS0ZfQVVUTyBhbmQgVlBYX0tGX0RJU0FCTEVELgotICAgICAqLwotICAgIGVudW0gdnB4X2tmX21vZGUKLSAgICB7Ci0gICAgICAgIFZQWF9LRl9GSVhFRCwgLyoqPCBkZXByZWNhdGVkLCBpbXBsaWVzIFZQWF9LRl9ESVNBQkxFRCAqLwotICAgICAgICBWUFhfS0ZfQVVUTywgIC8qKjwgRW5jb2RlciBkZXRlcm1pbmVzIG9wdGltYWwgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkgKi8KLSAgICAgICAgVlBYX0tGX0RJU0FCTEVEID0gMCAvKio8IEVuY29kZXIgZG9lcyBub3QgcGxhY2Uga2V5ZnJhbWVzLiAqLwotICAgIH07Ci0KLQotICAgIC8qIVxicmllZiBFbmNvZGVkIEZyYW1lIEZsYWdzCi0gICAgICoKLSAgICAgKiBUaGlzIHR5cGUgaW5kaWNhdGVzIGEgYml0ZmllbGQgdG8gYmUgcGFzc2VkIHRvIHZweF9jb2RlY19lbmNvZGUoKSwgZGVmaW5pbmcKLSAgICAgKiBwZXItZnJhbWUgYm9vbGVhbiB2YWx1ZXMuIEJ5IGNvbnZlbnRpb24sIGJpdHMgY29tbW9uIHRvIGFsbCBjb2RlY3Mgd2lsbCBiZQotICAgICAqIG5hbWVkIFZQWF9FRkxBR18qLCBhbmQgYml0cyBzcGVjaWZpYyB0byBhbiBhbGdvcml0aG0gd2lsbCBiZSBuYW1lZAotICAgICAqIC9hbGdvL19lZmxhZ18qLiBUaGUgbG93ZXIgb3JkZXIgMTYgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGNvbW1vbiB1c2UuCi0gICAgICovCi0gICAgdHlwZWRlZiBsb25nIHZweF9lbmNfZnJhbWVfZmxhZ3NfdDsKLSNkZWZpbmUgVlBYX0VGTEFHX0ZPUkNFX0tGICgxPDwwKSAgLyoqPCBGb3JjZSB0aGlzIGZyYW1lIHRvIGJlIGEga2V5ZnJhbWUgKi8KLQotCi0gICAgLyohXGJyaWVmIEVuY29kZXIgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKLSAgICAgKgotICAgICAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBlbmNvZGVyIHNldHRpbmdzIHRoYXQgaGF2ZSBjb21tb24gcmVwcmVzZW50YXRpb25zCi0gICAgICogYWNyb3NzIGFsbCBjb2RlY3MuIFRoaXMgZG9lc24ndCBpbXBseSB0aGF0IGFsbCBjb2RlY3Mgc3VwcG9ydCBhbGwgZmVhdHVyZXMsCi0gICAgICogaG93ZXZlci4KLSAgICAgKi8KLSAgICB0eXBlZGVmIHN0cnVjdCB2cHhfY29kZWNfZW5jX2NmZwotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogZ2VuZXJpYyBzZXR0aW5ncyAoZykKLSAgICAgICAgICovCi0KLSAgICAgICAgLyohXGJyaWVmIEFsZ29yaXRobSBzcGVjaWZpYyAidXNhZ2UiIHZhbHVlCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsZ29yaXRobXMgbWF5IGRlZmluZSBtdWx0aXBsZSB2YWx1ZXMgZm9yIHVzYWdlLCB3aGljaCBtYXkgY29udmV5IHRoZQotICAgICAgICAgKiBpbnRlbnQgb2YgaG93IHRoZSBhcHBsaWNhdGlvbiBpbnRlbmRzIHRvIHVzZSB0aGUgc3RyZWFtLiBJZiB0aGlzIHZhbHVlCi0gICAgICAgICAqIGlzIG5vbi16ZXJvLCBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY29kZWMgdG8gZGV0ZXJtaW5lIGl0cwotICAgICAgICAgKiBtZWFuaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBnX3VzYWdlOwotCi0KLSAgICAgICAgLyohXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlCi0gICAgICAgICAqCi0gICAgICAgICAqIEZvciBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbnMsIHVzZSBubyBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2YKLSAgICAgICAgICogdGhyZWFkcy4gVGhlIGNvZGVjIG1heSB1c2UgZmV3ZXIgdGhyZWFkcyB0aGFuIGFsbG93ZWQuIFRoZSB2YWx1ZQotICAgICAgICAgKiAwIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHZhbHVlIDEuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGdfdGhyZWFkczsKLQotCi0gICAgICAgIC8qIVxicmllZiBCaXRzdHJlYW0gcHJvZmlsZSB0byB1c2UKLSAgICAgICAgICoKLSAgICAgICAgICogU29tZSBjb2RlY3Mgc3VwcG9ydCBhIG5vdGlvbiBvZiBtdWx0aXBsZSBiaXRzdHJlYW0gcHJvZmlsZXMuIFR5cGljYWxseQotICAgICAgICAgKiB0aGlzIG1hcHMgdG8gYSBzZXQgb2YgZmVhdHVyZXMgdGhhdCBhcmUgdHVybmVkIG9uIG9yIG9mZi4gT2Z0ZW4gdGhlCi0gICAgICAgICAqIHByb2ZpbGUgdG8gdXNlIGlzIGRldGVybWluZWQgYnkgdGhlIGZlYXR1cmVzIG9mIHRoZSBpbnRlbmRlZCBkZWNvZGVyLgotICAgICAgICAgKiBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY29kZWMgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCB2YWx1ZXMKLSAgICAgICAgICogZm9yIHRoaXMgcGFyYW1ldGVyLCBvciBzZXQgdG8gemVybyBmb3IgYSBzYW5lIGRlZmF1bHQuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGdfcHJvZmlsZTsgIC8qKjwgcHJvZmlsZSBvZiBiaXRzdHJlYW0gdG8gdXNlICovCi0KLQotCi0gICAgICAgIC8qIVxicmllZiBXaWR0aCBvZiB0aGUgZnJhbWUKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSBpZGVudGlmaWVzIHRoZSBwcmVzZW50YXRpb24gcmVzb2x1dGlvbiBvZiB0aGUgZnJhbWUsCi0gICAgICAgICAqIGluIHBpeGVscy4gTm90ZSB0aGF0IHRoZSBmcmFtZXMgcGFzc2VkIGFzIGlucHV0IHRvIHRoZSBlbmNvZGVyIG11c3QKLSAgICAgICAgICogaGF2ZSB0aGlzIHJlc29sdXRpb24uIEZyYW1lcyB3aWxsIGJlIHByZXNlbnRlZCBieSB0aGUgZGVjb2RlciBpbiB0aGlzCi0gICAgICAgICAqIHJlc29sdXRpb24sIGluZGVwZW5kZW50IG9mIGFueSBzcGF0aWFsIHJlc2FtcGxpbmcgdGhlIGVuY29kZXIgbWF5IGRvLgotICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBnX3c7Ci0KLQotICAgICAgICAvKiFcYnJpZWYgSGVpZ2h0IG9mIHRoZSBmcmFtZQotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIHZhbHVlIGlkZW50aWZpZXMgdGhlIHByZXNlbnRhdGlvbiByZXNvbHV0aW9uIG9mIHRoZSBmcmFtZSwKLSAgICAgICAgICogaW4gcGl4ZWxzLiBOb3RlIHRoYXQgdGhlIGZyYW1lcyBwYXNzZWQgYXMgaW5wdXQgdG8gdGhlIGVuY29kZXIgbXVzdAotICAgICAgICAgKiBoYXZlIHRoaXMgcmVzb2x1dGlvbi4gRnJhbWVzIHdpbGwgYmUgcHJlc2VudGVkIGJ5IHRoZSBkZWNvZGVyIGluIHRoaXMKLSAgICAgICAgICogcmVzb2x1dGlvbiwgaW5kZXBlbmRlbnQgb2YgYW55IHNwYXRpYWwgcmVzYW1wbGluZyB0aGUgZW5jb2RlciBtYXkgZG8uCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGdfaDsKLQotCi0gICAgICAgIC8qIVxicmllZiBTdHJlYW0gdGltZWJhc2UgdW5pdHMKLSAgICAgICAgICoKLSAgICAgICAgICogSW5kaWNhdGVzIHRoZSBzbWFsbGVzdCBpbnRlcnZhbCBvZiB0aW1lLCBpbiBzZWNvbmRzLCB1c2VkIGJ5IHRoZSBzdHJlYW0uCi0gICAgICAgICAqIEZvciBmaXhlZCBmcmFtZSByYXRlIG1hdGVyaWFsLCBvciB2YXJpYWJsZSBmcmFtZSByYXRlIG1hdGVyaWFsIHdoZXJlCi0gICAgICAgICAqIGZyYW1lcyBhcmUgdGltZWQgYXQgYSBtdWx0aXBsZSBvZiBhIGdpdmVuIGNsb2NrIChleDogdmlkZW8gY2FwdHVyZSksCi0gICAgICAgICAqIHRoZSBccmVmIFJFQ09NTUVOREVEIG1ldGhvZCBpcyB0byBzZXQgdGhlIHRpbWViYXNlIHRvIHRoZSByZWNpcHJvY2FsCi0gICAgICAgICAqIG9mIHRoZSBmcmFtZSByYXRlIChleDogMTAwMS8zMDAwMCBmb3IgMjkuOTcwIEh6IE5UU0MpLiBUaGlzIGFsbG93cyB0aGUKLSAgICAgICAgICogcHRzIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGZyYW1lIG51bWJlciwgd2hpY2ggY2FuIGJlIGhhbmR5LiBGb3IKLSAgICAgICAgICogcmUtZW5jb2RpbmcgdmlkZW8gZnJvbSBjb250YWluZXJzIHdpdGggYWJzb2x1dGUgdGltZSB0aW1lc3RhbXBzLCB0aGUKLSAgICAgICAgICogXHJlZiBSRUNPTU1FTkRFRCBtZXRob2QgaXMgdG8gc2V0IHRoZSB0aW1lYmFzZSB0byB0aGF0IG9mIHRoZSBwYXJlbnQKLSAgICAgICAgICogY29udGFpbmVyIG9yIG11bHRpbWVkaWEgZnJhbWV3b3JrIChleDogMS8xMDAwIGZvciBtcywgYXMgaW4gRkxWKS4KLSAgICAgICAgICovCi0gICAgICAgIHN0cnVjdCB2cHhfcmF0aW9uYWwgICAgZ190aW1lYmFzZTsKLQotCi0gICAgICAgIC8qIVxicmllZiBFbmFibGUgZXJyb3IgcmVzaWxpZW50IG1vZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEVycm9yIHJlc2lsaWVudCBtb2RlIGluZGljYXRlcyB0byB0aGUgZW5jb2RlciB0aGF0IGl0IHNob3VsZCB0YWtlCi0gICAgICAgICAqIG1lYXN1cmVzIGFwcHJvcHJpYXRlIGZvciBzdHJlYW1pbmcgb3ZlciBsb3NzeSBvciBub2lzeSBsaW5rcywgaWYKLSAgICAgICAgICogcG9zc2libGUuIFNldCB0byAxIHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIDAgdG8gZGlzYWJsZSBpdC4KLSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgZ19lcnJvcl9yZXNpbGllbnQ7Ci0KLQotICAgICAgICAvKiFcYnJpZWYgTXVsdGktcGFzcyBFbmNvZGluZyBNb2RlCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgY3VycmVudCBwaGFzZSBmb3IgbXVsdGktcGFzcyBlbmNvZGluZy4KLSAgICAgICAgICogRm9yIHNpbmdsZSBwYXNzLCBzZXQgdG8gI1ZQWF9SQ19PTkVfUEFTUy4KLSAgICAgICAgICovCi0gICAgICAgIGVudW0gdnB4X2VuY19wYXNzICAgICAgZ19wYXNzOwotCi0KLSAgICAgICAgLyohXGJyaWVmIEFsbG93IGxhZ2dlZCBlbmNvZGluZwotICAgICAgICAgKgotICAgICAgICAgKiBJZiBzZXQsIHRoaXMgdmFsdWUgYWxsb3dzIHRoZSBlbmNvZGVyIHRvIGNvbnN1bWUgYSBudW1iZXIgb2YgaW5wdXQKLSAgICAgICAgICogZnJhbWVzIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0IGZyYW1lcy4gVGhpcyBhbGxvd3MgdGhlIGVuY29kZXIgdG8KLSAgICAgICAgICogYmFzZSBkZWNpc2lvbnMgZm9yIHRoZSBjdXJyZW50IGZyYW1lIG9uIGZ1dHVyZSBmcmFtZXMuIFRoaXMgZG9lcwotICAgICAgICAgKiBpbmNyZWFzZSB0aGUgbGF0ZW5jeSBvZiB0aGUgZW5jb2RpbmcgcGlwZWxpbmUsIHNvIGl0IGlzIG5vdCBhcHByb3ByaWF0ZQotICAgICAgICAgKiBpbiBhbGwgc2l0dWF0aW9ucyAoZXg6IHJlYWx0aW1lIGVuY29kaW5nKS4KLSAgICAgICAgICoKLSAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgYSBtYXhpbXVtIHZhbHVlIC0tIHRoZSBlbmNvZGVyIG1heSBwcm9kdWNlIGZyYW1lcwotICAgICAgICAgKiBzb29uZXIgdGhhbiB0aGUgZ2l2ZW4gbGltaXQuIFNldCB0aGlzIHZhbHVlIHRvIDAgdG8gZGlzYWJsZSB0aGlzCi0gICAgICAgICAqIGZlYXR1cmUuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGdfbGFnX2luX2ZyYW1lczsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHJhdGUgY29udHJvbCBzZXR0aW5ncyAocmMpCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qIVxicmllZiBUZW1wb3JhbCByZXNhbXBsaW5nIGNvbmZpZ3VyYXRpb24sIGlmIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRlbXBvcmFsIHJlc2FtcGxpbmcgYWxsb3dzIHRoZSBjb2RlYyB0byAiZHJvcCIgZnJhbWVzIGFzIGEgc3RyYXRlZ3kgdG8KLSAgICAgICAgICogbWVldCBpdHMgdGFyZ2V0IGRhdGEgcmF0ZS4gVGhpcyBjYW4gY2F1c2UgdGVtcG9yYWwgZGlzY29udGludWl0aWVzIGluCi0gICAgICAgICAqIHRoZSBlbmNvZGVkIHZpZGVvLCB3aGljaCBtYXkgYXBwZWFyIGFzIHN0dXR0ZXJpbmcgZHVyaW5nIHBsYXliYWNrLiBUaGlzCi0gICAgICAgICAqIHRyYWRlLW9mZiBpcyBvZnRlbiBhY2NlcHRhYmxlLCBidXQgZm9yIG1hbnkgYXBwbGljYXRpb25zIGlzIG5vdC4gSXQgY2FuCi0gICAgICAgICAqIGJlIGRpc2FibGVkIGluIHRoZXNlIGNhc2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBOb3RlIHRoYXQgbm90IGFsbCBjb2RlY3Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIEFsbCB2cHggVlB4IGNvZGVjcyBkby4KLSAgICAgICAgICogRm9yIG90aGVyIGNvZGVjcywgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBhbGdvcml0aG0uCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgdGhyZXNob2xkIGlzIGRlc2NyaWJlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBkYXRhIGJ1ZmZlci4KLSAgICAgICAgICogV2hlbiB0aGUgZGF0YSBidWZmZXIgZmFsbHMgYmVsb3cgdGhpcyBwZXJjZW50YWdlIG9mIGZ1bGxuZXNzLCBhCi0gICAgICAgICAqIGRyb3BwZWQgZnJhbWUgaXMgaW5kaWNhdGVkLiBTZXQgdGhlIHRocmVzaG9sZCB0byB6ZXJvICgwKSB0byBkaXNhYmxlCi0gICAgICAgICAqIHRoaXMgZmVhdHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfZHJvcGZyYW1lX3RocmVzaDsKLQotCi0gICAgICAgIC8qIVxicmllZiBFbmFibGUvZGlzYWJsZSBzcGF0aWFsIHJlc2FtcGxpbmcsIGlmIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFNwYXRpYWwgcmVzYW1wbGluZyBhbGxvd3MgdGhlIGNvZGVjIHRvIGNvbXByZXNzIGEgbG93ZXIgcmVzb2x1dGlvbgotICAgICAgICAgKiB2ZXJzaW9uIG9mIHRoZSBmcmFtZSwgd2hpY2ggaXMgdGhlbiB1cHNjYWxlZCBieSB0aGUgZW5jb2RlciB0byB0aGUKLSAgICAgICAgICogY29ycmVjdCBwcmVzZW50YXRpb24gcmVzb2x1dGlvbi4gVGhpcyBpbmNyZWFzZXMgdmlzdWFsIHF1YWxpdHkgYXQKLSAgICAgICAgICogbG93IGRhdGEgcmF0ZXMsIGF0IHRoZSBleHBlbnNlIG9mIENQVSB0aW1lIG9uIHRoZSBlbmNvZGVyL2RlY29kZXIuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX3Jlc2l6ZV9hbGxvd2VkOwotCi0KLSAgICAgICAgLyohXGJyaWVmIFNwYXRpYWwgcmVzYW1wbGluZyB1cCB3YXRlcm1hcmsuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgdGhyZXNob2xkIGlzIGRlc2NyaWJlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBkYXRhIGJ1ZmZlci4KLSAgICAgICAgICogV2hlbiB0aGUgZGF0YSBidWZmZXIgcmlzZXMgYWJvdmUgdGhpcyBwZXJjZW50YWdlIG9mIGZ1bGxuZXNzLCB0aGUKLSAgICAgICAgICogZW5jb2RlciB3aWxsIHN0ZXAgdXAgdG8gYSBoaWdoZXIgcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBmcmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfcmVzaXplX3VwX3RocmVzaDsKLQotCi0gICAgICAgIC8qIVxicmllZiBTcGF0aWFsIHJlc2FtcGxpbmcgZG93biB3YXRlcm1hcmsuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgdGhyZXNob2xkIGlzIGRlc2NyaWJlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBkYXRhIGJ1ZmZlci4KLSAgICAgICAgICogV2hlbiB0aGUgZGF0YSBidWZmZXIgZmFsbHMgYmVsb3cgdGhpcyBwZXJjZW50YWdlIG9mIGZ1bGxuZXNzLCB0aGUKLSAgICAgICAgICogZW5jb2RlciB3aWxsIHN0ZXAgZG93biB0byBhIGxvd2VyIHJlc29sdXRpb24gdmVyc2lvbiBvZiB0aGUgZnJhbWUuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX3Jlc2l6ZV9kb3duX3RocmVzaDsKLQotCi0gICAgICAgIC8qIVxicmllZiBSYXRlIGNvbnRyb2wgYWxnb3JpdGhtIHRvIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuZCB1c2FnZSBvZiB0aGlzIHN0cmVhbSBpcyB0byBiZSBzdHJlYW1lZCBvdmVyCi0gICAgICAgICAqIGEgYmFuZHdpZHRoIGNvbnN0cmFpbmVkIGxpbmssIGluZGljYXRpbmcgdGhhdCBDb25zdGFudCBCaXQgUmF0ZSAoQ0JSKQotICAgICAgICAgKiBtb2RlIHNob3VsZCBiZSB1c2VkLCBvciB3aGV0aGVyIGl0IHdpbGwgYmUgcGxheWVkIGJhY2sgb24gYSBoaWdoCi0gICAgICAgICAqIGJhbmR3aWR0aCBsaW5rLCBhcyBmcm9tIGEgbG9jYWwgZGlzaywgd2hlcmUgaGlnaGVyIHZhcmlhdGlvbnMgaW4KLSAgICAgICAgICogYml0cmF0ZSBhcmUgYWNjZXB0YWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIGVudW0gdnB4X3JjX21vZGUgICAgICAgcmNfZW5kX3VzYWdlOwotCi0KLSAgICAgICAgLyohXGJyaWVmIFR3by1wYXNzIHN0YXRzIGJ1ZmZlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBidWZmZXIgY29udGFpbmluZyBhbGwgb2YgdGhlIHN0YXRzIHBhY2tldHMgcHJvZHVjZWQgaW4gdGhlIGZpcnN0Ci0gICAgICAgICAqIHBhc3MsIGNvbmNhdGVuYXRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmICAgcmNfdHdvcGFzc19zdGF0c19pbjsKLQotCi0gICAgICAgIC8qIVxicmllZiBUYXJnZXQgZGF0YSByYXRlCi0gICAgICAgICAqCi0gICAgICAgICAqIFRhcmdldCBiYW5kd2lkdGggdG8gdXNlIGZvciB0aGlzIHN0cmVhbSwgaW4ga2lsb2JpdHMgcGVyIHNlY29uZC4KLSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfdGFyZ2V0X2JpdHJhdGU7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBxdWFudGl6ZXIgc2V0dGluZ3MKLSAgICAgICAgICovCi0KLQotICAgICAgICAvKiFcYnJpZWYgTWluaW11bSAoQmVzdCBRdWFsaXR5KSBRdWFudGl6ZXIKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIHF1YW50aXplciBpcyB0aGUgbW9zdCBkaXJlY3QgY29udHJvbCBvdmVyIHRoZSBxdWFsaXR5IG9mIHRoZQotICAgICAgICAgKiBlbmNvZGVkIGltYWdlLiBUaGUgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgcXVhbnRpemVyIGlzIGNvZGVjCi0gICAgICAgICAqIHNwZWNpZmljLiBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY29kZWMgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAgICAgKiB2YWx1ZXMgdG8gdXNlLiBUbyBkZXRlcm1pbmUgdGhlIHJhbmdlIHByb2dyYW1tYXRpY2FsbHksIGNhbGwKLSAgICAgICAgICogdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdCgpIHdpdGggYSB1c2FnZSB2YWx1ZSBvZiAwLgotICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICByY19taW5fcXVhbnRpemVyOwotCi0KLSAgICAgICAgLyohXGJyaWVmIE1heGltdW0gKFdvcnN0IFF1YWxpdHkpIFF1YW50aXplcgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgcXVhbnRpemVyIGlzIHRoZSBtb3N0IGRpcmVjdCBjb250cm9sIG92ZXIgdGhlIHF1YWxpdHkgb2YgdGhlCi0gICAgICAgICAqIGVuY29kZWQgaW1hZ2UuIFRoZSByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBxdWFudGl6ZXIgaXMgY29kZWMKLSAgICAgICAgICogc3BlY2lmaWMuIENvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjb2RlYyB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgICAqIHZhbHVlcyB0byB1c2UuIFRvIGRldGVybWluZSB0aGUgcmFuZ2UgcHJvZ3JhbW1hdGljYWxseSwgY2FsbAotICAgICAgICAgKiB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KCkgd2l0aCBhIHVzYWdlIHZhbHVlIG9mIDAuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX21heF9xdWFudGl6ZXI7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBiaXRyYXRlIHRvbGVyYW5jZQotICAgICAgICAgKi8KLQotCi0gICAgICAgIC8qIVxicmllZiBSYXRlIGNvbnRyb2wgdW5kZXJzaG9vdCB0b2xlcmFuY2UKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUsIGRlc2NyaWJlcwotICAgICAgICAgKiB0aGUgdGFyZ2V0IGJpdHJhdGUgZm9yIGVhc2llciBmcmFtZXMsIGFsbG93aW5nIGJpdHMgdG8gYmUgc2F2ZWQgZm9yCi0gICAgICAgICAqIGhhcmRlciBmcmFtZXMuIFNldCB0byB6ZXJvIHRvIHVzZSB0aGUgY29kZWMgZGVmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfdW5kZXJzaG9vdF9wY3Q7Ci0KLQotICAgICAgICAvKiFcYnJpZWYgUmF0ZSBjb250cm9sIG92ZXJzaG9vdCB0b2xlcmFuY2UKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUsIGRlc2NyaWJlcwotICAgICAgICAgKiB0aGUgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZm9yIGEgZ2l2ZW4gZnJhbWUuICBTZXQgdG8gemVybyB0byB1c2UgdGhlCi0gICAgICAgICAqIGNvZGVjIGRlZmF1bHQuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX292ZXJzaG9vdF9wY3Q7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWNvZGVyIGJ1ZmZlciBtb2RlbCBwYXJhbWV0ZXJzCi0gICAgICAgICAqLwotCi0KLSAgICAgICAgLyohXGJyaWVmIERlY29kZXIgQnVmZmVyIFNpemUKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIGJ1ZmZlcmVkIGJ5IHRoZQotICAgICAgICAgKiBkZWNvZGluZyBhcHBsaWNhdGlvbi4gTm90ZSB0aGF0IHRoaXMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIHVuaXRzIG9mCi0gICAgICAgICAqIHRpbWUgKG1pbGxpc2Vjb25kcykuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDUwMDAgaW5kaWNhdGVzIHRoYXQgdGhlCi0gICAgICAgICAqIGNsaWVudCB3aWxsIGJ1ZmZlciAoYXQgbGVhc3QpIDUwMDBtcyB3b3J0aCBvZiBlbmNvZGVkIGRhdGEuIFVzZSB0aGUKLSAgICAgICAgICogdGFyZ2V0IGJpdHJhdGUgKCNyY190YXJnZXRfYml0cmF0ZSkgdG8gY29udmVydCB0byBiaXRzL2J5dGVzLCBpZgotICAgICAgICAgKiBuZWNlc3NhcnkuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjX2J1Zl9zejsKLQotCi0gICAgICAgIC8qIVxicmllZiBEZWNvZGVyIEJ1ZmZlciBJbml0aWFsIFNpemUKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2lsbCBiZSBidWZmZXJlZCBieSB0aGUKLSAgICAgICAgICogZGVjb2RpbmcgYXBwbGljYXRpb24gcHJpb3IgdG8gYmVnaW5uaW5nIHBsYXliYWNrLiBUaGlzIHZhbHVlIGlzCi0gICAgICAgICAqIGV4cHJlc3NlZCBpbiB1bml0cyBvZiB0aW1lIChtaWxsaXNlY29uZHMpLiBVc2UgdGhlIHRhcmdldCBiaXRyYXRlCi0gICAgICAgICAqICgjcmNfdGFyZ2V0X2JpdHJhdGUpIHRvIGNvbnZlcnQgdG8gYml0cy9ieXRlcywgaWYgbmVjZXNzYXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICByY19idWZfaW5pdGlhbF9zejsKLQotCi0gICAgICAgIC8qIVxicmllZiBEZWNvZGVyIEJ1ZmZlciBPcHRpbWFsIFNpemUKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgdGhlIGVuY29kZXIgc2hvdWxkIHRyeQotICAgICAgICAgKiB0byBtYWludGFpbiBpbiB0aGUgZGVjb2RlcidzIGJ1ZmZlci4gVGhpcyB2YWx1ZSBpcyBleHByZXNzZWQgaW4gdW5pdHMKLSAgICAgICAgICogb2YgdGltZSAobWlsbGlzZWNvbmRzKS4gVXNlIHRoZSB0YXJnZXQgYml0cmF0ZSAoI3JjX3RhcmdldF9iaXRyYXRlKQotICAgICAgICAgKiB0byBjb252ZXJ0IHRvIGJpdHMvYnl0ZXMsIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgcmNfYnVmX29wdGltYWxfc3o7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiAyIHBhc3MgcmF0ZSBjb250cm9sIHBhcmFtZXRlcnMKLSAgICAgICAgICovCi0KLQotICAgICAgICAvKiFcYnJpZWYgVHdvLXBhc3MgbW9kZSBDQlIvVkJSIGJpYXMKLSAgICAgICAgICoKLSAgICAgICAgICogQmlhcywgZXhwcmVzc2VkIG9uIGEgc2NhbGUgb2YgMCB0byAxMDAsIGZvciBkZXRlcm1pbmluZyB0YXJnZXQgc2l6ZQotICAgICAgICAgKiBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuIFRoZSB2YWx1ZSAwIGluZGljYXRlcyB0aGUgb3B0aW1hbCBDQlIgbW9kZQotICAgICAgICAgKiB2YWx1ZSBzaG91bGQgYmUgdXNlZC4gVGhlIHZhbHVlIDEwMCBpbmRpY2F0ZXMgdGhlIG9wdGltYWwgVkJSIG1vZGUKLSAgICAgICAgICogdmFsdWUgc2hvdWxkIGJlIHVzZWQuIFZhbHVlcyBpbiBiZXR3ZWVuIGluZGljYXRlIHdoaWNoIHdheSB0aGUKLSAgICAgICAgICogZW5jb2RlciBzaG91bGQgImxlYW4uIgotICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICByY18ycGFzc192YnJfYmlhc19wY3Q7ICAgICAgIC8qKjwgUkMgbW9kZSBiaWFzIGJldHdlZW4gQ0JSIGFuZCBWQlIoMC0xMDA6IDAtPkNCUiwgMTAwLT5WQlIpICAgKi8KLQotCi0gICAgICAgIC8qIVxicmllZiBUd28tcGFzcyBtb2RlIHBlci1HT1AgbWluaW11bSBiaXRyYXRlCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgdmFsdWUsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLCBpbmRpY2F0ZXMKLSAgICAgICAgICogdGhlIG1pbmltdW0gYml0cmF0ZSB0byBiZSB1c2VkIGZvciBhIHNpbmdsZSBHT1AgKGFrYSAic2VjdGlvbiIpCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdDsKLQotCi0gICAgICAgIC8qIVxicmllZiBUd28tcGFzcyBtb2RlIHBlci1HT1AgbWF4aW11bSBiaXRyYXRlCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgdmFsdWUsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLCBpbmRpY2F0ZXMKLSAgICAgICAgICogdGhlIG1heGltdW0gYml0cmF0ZSB0byBiZSB1c2VkIGZvciBhIHNpbmdsZSBHT1AgKGFrYSAic2VjdGlvbiIpCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdDsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGtleWZyYW1pbmcgc2V0dGluZ3MgKGtmKQotICAgICAgICAgKi8KLQotICAgICAgICAvKiFcYnJpZWYgS2V5ZnJhbWUgcGxhY2VtZW50IG1vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RlciBzaG91bGQgcGxhY2Uga2V5ZnJhbWVzIGF0IGEKLSAgICAgICAgICogZml4ZWQgaW50ZXJ2YWwsIG9yIGRldGVybWluZSB0aGUgb3B0aW1hbCBwbGFjZW1lbnQgYXV0b21hdGljYWxseQotICAgICAgICAgKiAoYXMgZ292ZXJuZWQgYnkgdGhlICNrZl9taW5fZGlzdCBhbmQgI2tmX21heF9kaXN0IHBhcmFtZXRlcnMpCi0gICAgICAgICAqLwotICAgICAgICBlbnVtIHZweF9rZl9tb2RlICAgICAgIGtmX21vZGU7Ci0KLQotICAgICAgICAvKiFcYnJpZWYgS2V5ZnJhbWUgbWluaW11bSBpbnRlcnZhbAotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIHZhbHVlLCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgZnJhbWVzLCBwcmV2ZW50cyB0aGUgZW5jb2RlciBmcm9tCi0gICAgICAgICAqIHBsYWNpbmcgYSBrZXlmcmFtZSBuZWFyZXIgdGhhbiBrZl9taW5fZGlzdCB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUuIEF0Ci0gICAgICAgICAqIGxlYXN0IGtmX21pbl9kaXN0IGZyYW1lcyBub24ta2V5ZnJhbWVzIHdpbGwgYmUgY29kZWQgYmVmb3JlIHRoZSBuZXh0Ci0gICAgICAgICAqIGtleWZyYW1lLiBTZXQga2ZfbWluX2Rpc3QgZXF1YWwgdG8ga2ZfbWF4X2Rpc3QgZm9yIGEgZml4ZWQgaW50ZXJ2YWwuCi0gICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGtmX21pbl9kaXN0OwotCi0KLSAgICAgICAgLyohXGJyaWVmIEtleWZyYW1lIG1heGltdW0gaW50ZXJ2YWwKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyB2YWx1ZSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGZyYW1lcywgZm9yY2VzIHRoZSBlbmNvZGVyIHRvIGNvZGUKLSAgICAgICAgICogYSBrZXlmcmFtZSBpZiBvbmUgaGFzIG5vdCBiZWVuIGNvZGVkIGluIHRoZSBsYXN0IGtmX21heF9kaXN0IGZyYW1lcy4KLSAgICAgICAgICogQSB2YWx1ZSBvZiAwIGltcGxpZXMgYWxsIGZyYW1lcyB3aWxsIGJlIGtleWZyYW1lcy4gU2V0IGtmX21pbl9kaXN0Ci0gICAgICAgICAqIGVxdWFsIHRvIGtmX21heF9kaXN0IGZvciBhIGZpeGVkIGludGVydmFsLgotICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBrZl9tYXhfZGlzdDsKLQotICAgIH0gdnB4X2NvZGVjX2VuY19jZmdfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9jb2RlY19lbmNfY2ZnICovCi0KLQotICAgIC8qIVxicmllZiBJbml0aWFsaXplIGFuIGVuY29kZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEluaXRpYWxpemVzIGEgZW5jb2RlciBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBpbnRlcmZhY2UuIEFwcGxpY2F0aW9ucwotICAgICAqIHNob3VsZCBjYWxsIHRoZSB2cHhfY29kZWNfZW5jX2luaXQgY29udmVuaWVuY2UgbWFjcm8gaW5zdGVhZCBvZiB0aGlzCi0gICAgICogZnVuY3Rpb24gZGlyZWN0bHksIHRvIGVuc3VyZSB0aGF0IHRoZSBBQkkgdmVyc2lvbiBudW1iZXIgcGFyYW1ldGVyCi0gICAgICogaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gICAgICoKLSAgICAgKiBJbiBYTUEgbW9kZSAoYWN0aXZhdGVkIGJ5IHNldHRpbmcgVlBYX0NPREVDX1VTRV9YTUEgaW4gdGhlIGZsYWdzCi0gICAgICogcGFyYW1ldGVyKSwgdGhlIHN0b3JhZ2UgcG9pbnRlZCB0byBieSB0aGUgY2ZnIHBhcmFtZXRlciBtdXN0IGJlCi0gICAgICoga2VwdCByZWFkYWJsZSBhbmQgc3RhYmxlIHVudGlsIGFsbCBtZW1vcnkgbWFwcyBoYXZlIGJlZW4gc2V0LgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQuCi0gICAgICogXHBhcmFtW2luXSAgICBpZmFjZSAgIFBvaW50ZXIgdG8gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgdG8gdXNlLgotICAgICAqIFxwYXJhbVtpbl0gICAgY2ZnICAgICBDb25maWd1cmF0aW9uIHRvIHVzZSwgaWYga25vd24uIE1heSBiZSBOVUxMLgotICAgICAqIFxwYXJhbVtpbl0gICAgZmxhZ3MgICBCaXRmaWVsZCBvZiBWUFhfQ09ERUNfVVNFXyogZmxhZ3MKLSAgICAgKiBccGFyYW1baW5dICAgIHZlciAgICAgQUJJIHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIHNldCB0bwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTgotICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19PSwotICAgICAqICAgICBUaGUgZGVjb2RlciBhbGdvcml0aG0gaW5pdGlhbGl6ZWQuCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX01FTV9FUlJPUgotICAgICAqICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgdnB4X2NvZGVjX2Vycl90IHZweF9jb2RlY19lbmNfaW5pdF92ZXIodnB4X2NvZGVjX2N0eF90ICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfdCAgICAqaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCAgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZmxhZ3NfdCAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHZlcik7Ci0KLQotICAgIC8qIVxicmllZiBDb252ZW5pZW5jZSBtYWNybyBmb3IgdnB4X2NvZGVjX2VuY19pbml0X3ZlcigpCi0gICAgICoKLSAgICAgKiBFbnN1cmVzIHRoZSBBQkkgdmVyc2lvbiBwYXJhbWV0ZXIgaXMgcHJvcGVybHkgc2V0LgotICAgICAqLwotI2RlZmluZSB2cHhfY29kZWNfZW5jX2luaXQoY3R4LCBpZmFjZSwgY2ZnLCBmbGFncykgXAotICAgIHZweF9jb2RlY19lbmNfaW5pdF92ZXIoY3R4LCBpZmFjZSwgY2ZnLCBmbGFncywgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04pCi0KLQotICAgIC8qIVxicmllZiBHZXQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEluaXRpYWxpemVzIGEgZW5jb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzLiBTdXBwb3J0cwotICAgICAqIHRoZSBub3Rpb24gb2YgInVzYWdlcyIgc28gdGhhdCBhbiBhbGdvcml0aG0gbWF5IG9mZmVyIGRpZmZlcmVudCBkZWZhdWx0Ci0gICAgICogc2V0dGluZ3MgZGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3MgaW50ZW5kZWQgZ29hbC4gVGhpcyBmdW5jdGlvbiBccmVmIFNIT1VMRAotICAgICAqIGJlIGNhbGxlZCBieSBhbGwgYXBwbGljYXRpb25zIHRvIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCi0gICAgICogYmVmb3JlIHNwZWNpYWxpemluZyB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGFwcGxpY2F0aW9uIHNwZWNpZmljIHZhbHVlcy4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgaWZhY2UgICBQb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlIHRvIHVzZS4KLSAgICAgKiBccGFyYW1bb3V0XSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbiBidWZmZXIgdG8gcG9wdWxhdGUKLSAgICAgKiBccGFyYW1baW5dICAgIHVzYWdlICAgRW5kIHVzYWdlLiBTZXQgdG8gMCBvciB1c2UgY29kZWMgc3BlY2lmaWMgdmFsdWVzLgotICAgICAqCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX09LCi0gICAgICogICAgIFRoZSBjb25maWd1cmF0aW9uIHdhcyBwb3B1bGF0ZWQuCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOQ0FQQUJMRQotICAgICAqICAgICBJbnRlcmZhY2UgaXMgbm90IGFuIGVuY29kZXIgaW50ZXJmYWNlLgotICAgICAqIFxyZXR2YWwgI1ZQWF9DT0RFQ19JTlZBTElEX1BBUkFNCi0gICAgICogICAgIEEgcGFyYW1ldGVyIHdhcyBOVUxMLCBvciB0aGUgdXNhZ2UgdmFsdWUgd2FzIG5vdCByZWNvZ25pemVkLgotICAgICAqLwotICAgIHZweF9jb2RlY19lcnJfdCAgdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdCh2cHhfY29kZWNfaWZhY2VfdCAgICAqaWZhY2UsCi0gICAgICAgICAgICB2cHhfY29kZWNfZW5jX2NmZ190ICAqY2ZnLAotICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIHVzYWdlKTsKLQotCi0gICAgLyohXGJyaWVmIFNldCBvciBjaGFuZ2UgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogUmVjb25maWd1cmVzIGFuIGVuY29kZXIgaW5zdGFuY2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKLSAgICAgKiBccGFyYW1baW5dICAgIGNmZyAgICAgQ29uZmlndXJhdGlvbiBidWZmZXIgdG8gdXNlCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAgICAgKiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gd2FzIHBvcHVsYXRlZC4KLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfSU5DQVBBQkxFCi0gICAgICogICAgIEludGVyZmFjZSBpcyBub3QgYW4gZW5jb2RlciBpbnRlcmZhY2UuCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOVkFMSURfUEFSQU0KLSAgICAgKiAgICAgQSBwYXJhbWV0ZXIgd2FzIE5VTEwsIG9yIHRoZSB1c2FnZSB2YWx1ZSB3YXMgbm90IHJlY29nbml6ZWQuCi0gICAgICovCi0gICAgdnB4X2NvZGVjX2Vycl90ICB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXQodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgICpjZmcpOwotCi0KLSAgICAvKiFcYnJpZWYgR2V0IGdsb2JhbCBzdHJlYW0gaGVhZGVycwotICAgICAqCi0gICAgICogUmV0cmlldmVzIGEgc3RyZWFtIGxldmVsIGdsb2JhbCBoZWFkZXIgcGFja2V0LCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBjdHggICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKLSAgICAgKgotICAgICAqIFxyZXR2YWwgTlVMTAotICAgICAqICAgICBFbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2xvYmFsIGhlYWRlcgotICAgICAqIFxyZXR2YWwgTm9uLU5VTEwKLSAgICAgKiAgICAgUG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBnbG9iYWwgaGVhZGVyIHBhY2tldAotICAgICAqLwotICAgIHZweF9maXhlZF9idWZfdCAqdnB4X2NvZGVjX2dldF9nbG9iYWxfaGVhZGVycyh2cHhfY29kZWNfY3R4X3QgICAqY3R4KTsKLQotCi0jZGVmaW5lIFZQWF9ETF9SRUFMVElNRSAgICAgKDEpICAgICAgICAvKio8IGRlYWRsaW5lIHBhcmFtZXRlciBhbmFsb2dvdXMgdG8KLSAgICAqICAgVlB4IFJFQUxUSU1FIG1vZGUuICovCi0jZGVmaW5lIFZQWF9ETF9HT09EX1FVQUxJVFkgKDEwMDAwMDApICAvKio8IGRlYWRsaW5lIHBhcmFtZXRlciBhbmFsb2dvdXMgdG8KLSAgICAqICAgVlB4IEdPT0QgUVVBTElUWSBtb2RlLiAqLwotI2RlZmluZSBWUFhfRExfQkVTVF9RVUFMSVRZICgwKSAgICAgICAgLyoqPCBkZWFkbGluZSBwYXJhbWV0ZXIgYW5hbG9nb3VzIHRvCi0gICAgKiAgIFZQeCBCRVNUIFFVQUxJVFkgbW9kZS4gKi8KLSAgICAvKiFcYnJpZWYgRW5jb2RlIGEgZnJhbWUKLSAgICAgKgotICAgICAqIEVuY29kZXMgYSB2aWRlbyBmcmFtZSBhdCB0aGUgZ2l2ZW4gInByZXNlbnRhdGlvbiB0aW1lLiIgVGhlIHByZXNlbnRhdGlvbgotICAgICAqIHRpbWUgc3RhbXAgKFBUUykgXHJlZiBNVVNUIGJlIHN0cmljdGx5IGluY3JlYXNpbmcuCi0gICAgICoKLSAgICAgKiBUaGUgZW5jb2RlciBzdXBwb3J0cyB0aGUgbm90aW9uIG9mIGEgc29mdCByZWFsLXRpbWUgZGVhZGxpbmUuIEdpdmVuIGEKLSAgICAgKiBub24temVybyB2YWx1ZSB0byB0aGUgZGVhZGxpbmUgcGFyYW1ldGVyLCB0aGUgZW5jb2RlciB3aWxsIG1ha2UgYSAiYmVzdAotICAgICAqIGVmZm9ydCIgZ3VhcmFudGVlIHRvICByZXR1cm4gYmVmb3JlIHRoZSBnaXZlbiB0aW1lIHNsaWNlIGV4cGlyZXMuIEl0IGlzCi0gICAgICogaW1wbGljaXQgdGhhdCBsaW1pdGluZyB0aGUgYXZhaWxhYmxlIHRpbWUgdG8gZW5jb2RlIHdpbGwgZGVncmFkZSB0aGUKLSAgICAgKiBvdXRwdXQgcXVhbGl0eS4gVGhlIGVuY29kZXIgY2FuIGJlIGdpdmVuIGFuIHVubGltaXRlZCB0aW1lIHRvIHByb2R1Y2UgdGhlCi0gICAgICogYmVzdCBwb3NzaWJsZSBmcmFtZSBieSBzcGVjaWZ5aW5nIGEgZGVhZGxpbmUgb2YgJzAnLiBUaGlzIGRlYWRsaW5lCi0gICAgICogc3VwZXJjZWRlcyB0aGUgVlB4IG5vdGlvbiBvZiAiYmVzdCBxdWFsaXR5LCBnb29kIHF1YWxpdHksIHJlYWx0aW1lIi4KLSAgICAgKiBBcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIG1hcCB0aGVzZSBmb3JtZXIgc2V0dGluZ3MgdG8gdGhlIG5ldyBkZWFkbGluZQotICAgICAqIGJhc2VkIHN5c3RlbSBjYW4gdXNlIHRoZSBzeW1ib2xzICNWUFhfRExfUkVBTFRJTUUsICNWUFhfRExfR09PRF9RVUFMSVRZLAotICAgICAqIGFuZCAjVlBYX0RMX0JFU1RfUVVBTElUWS4KLSAgICAgKgotICAgICAqIFdoZW4gdGhlIGxhc3QgZnJhbWUgaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBlbmNvZGVyLCB0aGlzIGZ1bmN0aW9uIHNob3VsZAotICAgICAqIGNvbnRpbnVlIHRvIGJlIGNhbGxlZCwgd2l0aCB0aGUgaW1nIHBhcmFtZXRlciBzZXQgdG8gTlVMTC4gVGhpcyB3aWxsCi0gICAgICogc2lnbmFsIHRoZSBlbmQtb2Ytc3RyZWFtIGNvbmRpdGlvbiB0byB0aGUgZW5jb2RlciBhbmQgYWxsb3cgaXQgdG8gZW5jb2RlCi0gICAgICogYW55IGhlbGQgYnVmZmVycy4gRW5jb2RpbmcgaXMgY29tcGxldGUgd2hlbiB2cHhfY29kZWNfZW5jb2RlKCkgaXMgY2FsbGVkCi0gICAgICogYW5kIHZweF9jb2RlY19nZXRfY3hfZGF0YSgpIHJldHVybnMgbm8gZGF0YS4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgY3R4ICAgICAgIFBvaW50ZXIgdG8gdGhpcyBpbnN0YW5jZSdzIGNvbnRleHQKLSAgICAgKiBccGFyYW1baW5dICAgIGltZyAgICAgICBJbWFnZSBkYXRhIHRvIGVuY29kZSwgTlVMTCB0byBmbHVzaC4KLSAgICAgKiBccGFyYW1baW5dICAgIHB0cyAgICAgICBQcmVzZW50YXRpb24gdGltZSBzdGFtcCwgaW4gdGltZWJhc2UgdW5pdHMuCi0gICAgICogXHBhcmFtW2luXSAgICBkdXJhdGlvbiAgRHVyYXRpb24gdG8gc2hvdyBmcmFtZSwgaW4gdGltZWJhc2UgdW5pdHMuCi0gICAgICogXHBhcmFtW2luXSAgICBmbGFncyAgICAgRmxhZ3MgdG8gdXNlIGZvciBlbmNvZGluZyB0aGlzIGZyYW1lLgotICAgICAqIFxwYXJhbVtpbl0gICAgZGVhZGxpbmUgIFRpbWUgdG8gc3BlbmQgZW5jb2RpbmcsIGluIG1pY3Jvc2Vjb25kcy4gKDA9aW5maW5pdGUpCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAgICAgKiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gd2FzIHBvcHVsYXRlZC4KLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfSU5DQVBBQkxFCi0gICAgICogICAgIEludGVyZmFjZSBpcyBub3QgYW4gZW5jb2RlciBpbnRlcmZhY2UuCi0gICAgICogXHJldHZhbCAjVlBYX0NPREVDX0lOVkFMSURfUEFSQU0KLSAgICAgKiAgICAgQSBwYXJhbWV0ZXIgd2FzIE5VTEwsIHRoZSBpbWFnZSBmb3JtYXQgaXMgdW5zdXBwb3J0ZWQsIGV0Yy4KLSAgICAgKi8KLSAgICB2cHhfY29kZWNfZXJyX3QgIHZweF9jb2RlY19lbmNvZGUodnB4X2NvZGVjX2N0eF90ICAgICAgICAgICAgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QgICAgICAgICAgKmltZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX3B0c190ICAgICAgICAgICAgIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBkZWFkbGluZSk7Ci0KLQotICAgIC8qIVxicmllZiBTZXQgY29tcHJlc3NlZCBkYXRhIG91dHB1dCBidWZmZXIKLSAgICAgKgotICAgICAqIFNldHMgdGhlIGJ1ZmZlciB0aGF0IHRoZSBjb2RlYyBzaG91bGQgb3V0cHV0IHRoZSBjb21wcmVzc2VkIGRhdGEKLSAgICAgKiBpbnRvLiBUaGlzIGNhbGwgZWZmZWN0aXZlbHkgc2V0cyB0aGUgYnVmZmVyIHBvaW50ZXIgcmV0dXJuZWQgaW4gdGhlCi0gICAgICogbmV4dCBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUIHBhY2tldC4gU3Vic2VxdWVudCBwYWNrZXRzIHdpbGwgYmUKLSAgICAgKiBhcHBlbmRlZCBpbnRvIHRoaXMgYnVmZmVyLiBUaGUgYnVmZmVyIGlzIHByZXNlcnZlZCBhY3Jvc3MgZnJhbWVzLAotICAgICAqIHNvIGFwcGxpY2F0aW9ucyBtdXN0IHBlcmlvZGljYWxseSBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgZmx1c2hpbmcKLSAgICAgKiB0aGUgYWNjdW11bGF0ZWQgY29tcHJlc3NlZCBkYXRhIHRvIGRpc2sgb3IgdG8gdGhlIG5ldHdvcmsgdG8gcmVzZXQKLSAgICAgKiB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyJ3MgaGVhZC4KLSAgICAgKgotICAgICAqIGBwYWRfYmVmb3JlYCBieXRlcyB3aWxsIGJlIHNraXBwZWQgYmVmb3JlIHdyaXRpbmcgdGhlIGNvbXByZXNzZWQKLSAgICAgKiBkYXRhLCBhbmQgYHBhZF9hZnRlcmAgYnl0ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcGFja2V0LiBUaGUgc2l6ZQotICAgICAqIG9mIHRoZSBwYWNrZXQgd2lsbCBiZSB0aGUgc3VtIG9mIHRoZSBzaXplIG9mIHRoZSBhY3R1YWwgY29tcHJlc3NlZAotICAgICAqIGRhdGEsIHBhZF9iZWZvcmUsIGFuZCBwYWRfYWZ0ZXIuIFRoZSBwYWRkaW5nIGJ5dGVzIHdpbGwgYmUgcHJlc2VydmVkCi0gICAgICogKG5vdCBvdmVyd3JpdHRlbikuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSByZXR1cm5lZAotICAgICAqIGNvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiBJbiB0aGUKLSAgICAgKiBldmVudCB0aGF0IHRoZSBlbmNvZGVkIGRhdGEgd2lsbCBub3QgZml0IGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZCwKLSAgICAgKiB0aGUgcmV0dXJuZWQgcGFja2V0IFxyZWYgTUFZIHBvaW50IHRvIGFuIGludGVybmFsIGJ1ZmZlciwgYXMgaXQgd291bGQKLSAgICAgKiBpZiB0aGlzIGNhbGwgd2VyZSBuZXZlciB1c2VkLiBJbiB0aGlzIGV2ZW50LCB0aGUgb3V0cHV0IHBhY2tldCB3aWxsCi0gICAgICogTk9UIGhhdmUgYW55IHBhZGRpbmcsIGFuZCB0aGUgYXBwbGljYXRpb24gbXVzdCBmcmVlIHNwYWNlIGFuZCBjb3B5IGl0Ci0gICAgICogdG8gdGhlIHByb3BlciBwbGFjZS4gVGhpcyBpcyBvZiBwYXJ0aWN1bGFyIG5vdGUgaW4gY29uZmlndXJhdGlvbnMKLSAgICAgKiB0aGF0IG1heSBvdXRwdXQgbXVsdGlwbGUgcGFja2V0cyBmb3IgYSBzaW5nbGUgZW5jb2RlZCBmcmFtZSAoZS5nLiwgbGFnZ2VkCi0gICAgICogZW5jb2RpbmcpIG9yIGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXNldCB0aGUgYnVmZmVyIHBlcmlvZGljYWxseS4KLSAgICAgKgotICAgICAqIEFwcGxpY2F0aW9ucyBtYXkgcmVzdG9yZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgY29kZWMgcHJvdmlkaW5nCi0gICAgICogdGhlIGNvbXByZXNzZWQgZGF0YSBidWZmZXIgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBOVUxMCi0gICAgICogYnVmZmVyLgotICAgICAqCi0gICAgICogQXBwbGljYXRpb25zIFxyZWYgTVVTVE5PVCBjYWxsIHRoaXMgZnVuY3Rpb24gZHVyaW5nIGl0ZXJhdGlvbiBvZgotICAgICAqIHZweF9jb2RlY19nZXRfY3hfZGF0YSgpLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBjdHggICAgICAgICBQb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UncyBjb250ZXh0Ci0gICAgICogXHBhcmFtW2luXSAgICBidWYgICAgICAgICBCdWZmZXIgdG8gc3RvcmUgY29tcHJlc3NlZCBkYXRhIGludG8KLSAgICAgKiBccGFyYW1baW5dICAgIHBhZF9iZWZvcmUgIEJ5dGVzIHRvIHNraXAgYmVmb3JlIHdyaXRpbmcgY29tcHJlc3NlZCBkYXRhCi0gICAgICogXHBhcmFtW2luXSAgICBwYWRfYWZ0ZXIgICBCeXRlcyB0byBza2lwIGFmdGVyIHdyaXRpbmcgY29tcHJlc3NlZCBkYXRhCi0gICAgICoKLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfT0sKLSAgICAgKiAgICAgVGhlIGJ1ZmZlciB3YXMgc2V0IHN1Y2Nlc3NmdWxseS4KLSAgICAgKiBccmV0dmFsICNWUFhfQ09ERUNfSU5WQUxJRF9QQVJBTQotICAgICAqICAgICBBIHBhcmFtZXRlciB3YXMgTlVMTCwgdGhlIGltYWdlIGZvcm1hdCBpcyB1bnN1cHBvcnRlZCwgZXRjLgotICAgICAqLwotICAgIHZweF9jb2RlY19lcnJfdCB2cHhfY29kZWNfc2V0X2N4X2RhdGFfYnVmKHZweF9jb2RlY19jdHhfdCAgICAgICAqY3R4LAotICAgICAgICAgICAgY29uc3QgdnB4X2ZpeGVkX2J1Zl90ICpidWYsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHBhZF9iZWZvcmUsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHBhZF9hZnRlcik7Ci0KLQotICAgIC8qIVxicmllZiBFbmNvZGVkIGRhdGEgaXRlcmF0b3IKLSAgICAgKgotICAgICAqIEl0ZXJhdGVzIG92ZXIgYSBsaXN0IG9mIGRhdGEgcGFja2V0cyB0byBiZSBwYXNzZWQgZnJvbSB0aGUgZW5jb2RlciB0byB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbi4gVGhlIGRpZmZlcmVudCBraW5kcyBvZiBwYWNrZXRzIGF2YWlsYWJsZSBhcmUgZW51bWVyYXRlZCBpbgotICAgICAqICN2cHhfY29kZWNfY3hfcGt0X2tpbmQuCi0gICAgICoKLSAgICAgKiAjVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCBwYWNrZXRzIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uJ3MKLSAgICAgKiBtdXhlci4gTXVsdGlwbGUgY29tcHJlc3NlZCBmcmFtZXMgbWF5IGJlIGluIHRoZSBsaXN0LgotICAgICAqICNWUFhfQ09ERUNfU1RBVFNfUEtUIHBhY2tldHMgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIGEgZ2xvYmFsIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBccmVmIE1VU1Qgc2lsZW50bHkgaWdub3JlIGFueSBwYWNrZXQga2luZHMgdGhhdCBpdCBkb2VzCi0gICAgICogbm90IHJlY29nbml6ZSBvciBzdXBwb3J0LgotICAgICAqCi0gICAgICogVGhlIGRhdGEgYnVmZmVycyByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQotICAgICAqIHZhbGlkIHVudGlsIHRoZSBhcHBsaWNhdGlvbiBtYWtlcyBhbm90aGVyIGNhbGwgdG8gYW55IHZweF9jb2RlY18qIGZ1bmN0aW9uLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICAgY3R4ICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICAgICAqIFxwYXJhbVtpbixvdXRdIGl0ZXIgICAgIEl0ZXJhdG9yIHN0b3JhZ2UsIGluaXRpYWxpemVkIHRvIE5VTEwKLSAgICAgKgotICAgICAqIFxyZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gb3V0cHV0IGRhdGEgcGFja2V0IChjb21wcmVzc2VkIGZyYW1lIGRhdGEsCi0gICAgICogICAgICAgICB0d28tcGFzcyBzdGF0aXN0aWNzLCBldGMuKSBvciBOVUxMIHRvIHNpZ25hbCBlbmQtb2YtbGlzdC4KLSAgICAgKgotICAgICAqLwotICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqdnB4X2NvZGVjX2dldF9jeF9kYXRhKHZweF9jb2RlY19jdHhfdCAgICpjdHgsCi0gICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90ICAqaXRlcik7Ci0KLQotICAgIC8qIVxicmllZiBHZXQgUHJldmlldyBGcmFtZQotICAgICAqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcHJldmlldy4gU2hvd3MgdGhlIGltYWdlIGFzIGl0IHdvdWxkCi0gICAgICogZXhpc3QgYXQgdGhlIGRlY29tcHJlc3Nvci4gVGhlIGFwcGxpY2F0aW9uIFxyZWYgTVVTVCBOT1Qgd3JpdGUgaW50byB0aGlzCi0gICAgICogaW1hZ2UgYnVmZmVyLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICAgY3R4ICAgICAgUG9pbnRlciB0byB0aGlzIGluc3RhbmNlJ3MgY29udGV4dAotICAgICAqCi0gICAgICogXHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHByZXZpZXcgaW1hZ2UsIG9yIE5VTEwgaWYgbm8gaW1hZ2UgaXMKLSAgICAgKiAgICAgICAgIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqLwotICAgIGNvbnN0IHZweF9pbWFnZV90ICp2cHhfY29kZWNfZ2V0X3ByZXZpZXdfZnJhbWUodnB4X2NvZGVjX2N0eF90ICAgKmN0eCk7Ci0KLQotICAgIC8qIUB9IC0gZW5kIGRlZmdyb3VwIGVuY29kZXIqLwotCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS92cHgvdnB4X2ltYWdlLmggYi92cHgvdnB4X2ltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDhiMzYuLjAwMDAwMDAKLS0tIGEvdnB4L3ZweF9pbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiFcZmlsZQotICogXGJyaWVmIERlc2NyaWJlcyB0aGUgdnB4IGltYWdlIGRlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgb3BlcmF0aW9ucwotICoKLSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIFZQWF9JTUFHRV9ICi0jZGVmaW5lIFZQWF9JTUFHRV9ICi0KLSAgICAvKiFcYnJpZWYgQ3VycmVudCBBQkkgdmVyc2lvbiBudW1iZXIKLSAgICAgKgotICAgICAqIFxpbnRlcm5hbAotICAgICAqIElmIHRoaXMgZmlsZSBpcyBhbHRlcmVkIGluIGFueSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBBQkksIHRoaXMgdmFsdWUKLSAgICAgKiBtdXN0IGJlIGJ1bXBlZC4gIEV4YW1wbGVzIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIGNoYW5naW5nCi0gICAgICogdHlwZXMsIHJlbW92aW5nIG9yIHJlYXNzaWduaW5nIGVudW1zLCBhZGRpbmcvcmVtb3ZpbmcvcmVhcnJhbmdpbmcKLSAgICAgKiBmaWVsZHMgdG8gc3RydWN0dXJlcwotICAgICAqLwotI2RlZmluZSBWUFhfSU1BR0VfQUJJX1ZFUlNJT04gKDEpIC8qKjxcaGlkZWluaXRpYWxpemVyKi8KLQotCi0jZGVmaW5lIFZQWF9JTUdfRk1UX1BMQU5BUiAgICAgMHgxMDAgIC8qKjwgSW1hZ2UgaXMgYSBwbGFuYXIgZm9ybWF0ICovCi0jZGVmaW5lIFZQWF9JTUdfRk1UX1VWX0ZMSVAgICAgMHgyMDAgIC8qKjwgViBwbGFuZSBwcmVjZWRlcyBVIHBsYW5lIGluIG1lbW9yeSAqLwotI2RlZmluZSBWUFhfSU1HX0ZNVF9IQVNfQUxQSEEgIDB4NDAwICAvKio8IEltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIGNvbXBvbmVudCAqLwotCi0KLSAgICAvKiFcYnJpZWYgTGlzdCBvZiBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0cyAqLwotICAgIHR5cGVkZWYgZW51bSB2cHhfaW1nX2ZtdCB7Ci0gICAgICAgIFZQWF9JTUdfRk1UX05PTkUsCi0gICAgICAgIFZQWF9JTUdfRk1UX1JHQjI0LCAgIC8qKjwgMjQgYml0IHBlciBwaXhlbCBwYWNrZWQgUkdCICovCi0gICAgICAgIFZQWF9JTUdfRk1UX1JHQjMyLCAgIC8qKjwgMzIgYml0IHBlciBwaXhlbCBwYWNrZWQgMFJHQiAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9SR0I1NjUsICAvKio8IDE2IGJpdCBwZXIgcGl4ZWwsIDU2NSAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9SR0I1NTUsICAvKio8IDE2IGJpdCBwZXIgcGl4ZWwsIDU1NSAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9VWVZZLCAgICAvKio8IFVZVlkgcGFja2VkIFlVViAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9ZVVkyLCAgICAvKio8IFlVWVYgcGFja2VkIFlVViAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9ZVllVLCAgICAvKio8IFlWWVUgcGFja2VkIFlVViAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9CR1IyNCwgICAvKio8IDI0IGJpdCBwZXIgcGl4ZWwgcGFja2VkIEJHUiAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9SR0IzMl9MRSwgLyoqPCAzMiBiaXQgcGFja2VkIEJHUjAgKi8KLSAgICAgICAgVlBYX0lNR19GTVRfQVJHQiwgICAgIC8qKjwgMzIgYml0IHBhY2tlZCBBUkdCLCBhbHBoYT0yNTUgKi8KLSAgICAgICAgVlBYX0lNR19GTVRfQVJHQl9MRSwgIC8qKjwgMzIgYml0IHBhY2tlZCBCR1JBLCBhbHBoYT0yNTUgKi8KLSAgICAgICAgVlBYX0lNR19GTVRfUkdCNTY1X0xFLCAgLyoqPCAxNiBiaXQgcGVyIHBpeGVsLCBnZ2diYmJiYiBycnJycmdnZyAqLwotICAgICAgICBWUFhfSU1HX0ZNVF9SR0I1NTVfTEUsICAvKio8IDE2IGJpdCBwZXIgcGl4ZWwsIGdnZ2JiYmJiIDBycnJycmdnICovCi0gICAgICAgIFZQWF9JTUdfRk1UX1lWMTIgICAgPSBWUFhfSU1HX0ZNVF9QTEFOQVIgfCBWUFhfSU1HX0ZNVF9VVl9GTElQIHwgMSwgLyoqPCBwbGFuYXIgWVZVICovCi0gICAgICAgIFZQWF9JTUdfRk1UX0k0MjAgICAgPSBWUFhfSU1HX0ZNVF9QTEFOQVIgfCAyLAotICAgICAgICBWUFhfSU1HX0ZNVF9WUFhZVjEyID0gVlBYX0lNR19GTVRfUExBTkFSIHwgVlBYX0lNR19GTVRfVVZfRkxJUCB8IDMsIC8qKiA8IHBsYW5hciA0OjI6MCBmb3JtYXQgd2l0aCB2cHggY29sb3Igc3BhY2UgKi8KLSAgICAgICAgVlBYX0lNR19GTVRfVlBYSTQyMCA9IFZQWF9JTUdfRk1UX1BMQU5BUiB8IDQgICAvKiogPCBwbGFuYXIgNDoyOjAgZm9ybWF0IHdpdGggdnB4IGNvbG9yIHNwYWNlICovCi0gICAgfQotICAgIHZweF9pbWdfZm10X3Q7IC8qKjwgYWxpYXMgZm9yIGVudW0gdnB4X2ltZ19mbXQgKi8KLQotI2lmICFkZWZpbmVkKFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCkgfHwgIVZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVAotI2RlZmluZSBJTUdfRk1UX1BMQU5BUiAgICAgICAgIFZQWF9JTUdfRk1UX1BMQU5BUiAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1BMQU5BUiAqLwotI2RlZmluZSBJTUdfRk1UX1VWX0ZMSVAgICAgICAgIFZQWF9JTUdfRk1UX1VWX0ZMSVAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1VWX0ZMSVAgKi8KLSNkZWZpbmUgSU1HX0ZNVF9IQVNfQUxQSEEgICAgICBWUFhfSU1HX0ZNVF9IQVNfQUxQSEEgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9IQVNfQUxQSEEgKi8KLQotICAgIC8qIVxicmllZiBEZXByZWNhdGVkIGxpc3Qgb2Ygc3VwcG9ydGVkIGltYWdlIGZvcm1hdHMKLSAgICAgKiBcZGVwcmVjYXRlZCBOZXcgY29kZSBzaG91bGQgdXNlICN2cHhfaW1nX2ZtdAotICAgICAqLwotI2RlZmluZSBpbWdfZm10ICAgdnB4X2ltZ19mbXQKLSAgICAvKiFcYnJpZWYgYWxpYXMgZm9yIGVudW0gaW1nX2ZtdC4KLSAgICAgKiBcZGVwcmVjYXRlZCBOZXcgY29kZSBzaG91bGQgdXNlICN2cHhfaW1nX2ZtdF90Ci0gICAgICovCi0jZGVmaW5lIGltZ19mbXRfdCB2cHhfaW1nX2ZtdF90Ci0KLSNkZWZpbmUgSU1HX0ZNVF9OT05FICAgICAgIFZQWF9JTUdfRk1UX05PTkUgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX05PTkUgKi8KLSNkZWZpbmUgSU1HX0ZNVF9SR0IyNCAgICAgIFZQWF9JTUdfRk1UX1JHQjI0ICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1JHQjI0ICovCi0jZGVmaW5lIElNR19GTVRfUkdCMzIgICAgICBWUFhfSU1HX0ZNVF9SR0IzMiAgICAgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0IzMiAqLwotI2RlZmluZSBJTUdfRk1UX1JHQjU2NSAgICAgVlBYX0lNR19GTVRfUkdCNTY1ICAgICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfUkdCNTY1ICovCi0jZGVmaW5lIElNR19GTVRfUkdCNTU1ICAgICBWUFhfSU1HX0ZNVF9SR0I1NTUgICAgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0I1NTUgKi8KLSNkZWZpbmUgSU1HX0ZNVF9VWVZZICAgICAgIFZQWF9JTUdfRk1UX1VZVlkgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1VZVlkgKi8KLSNkZWZpbmUgSU1HX0ZNVF9ZVVkyICAgICAgIFZQWF9JTUdfRk1UX1lVWTIgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1lVWTIgKi8KLSNkZWZpbmUgSU1HX0ZNVF9ZVllVICAgICAgIFZQWF9JTUdfRk1UX1lWWVUgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1lWWVUgKi8KLSNkZWZpbmUgSU1HX0ZNVF9CR1IyNCAgICAgIFZQWF9JTUdfRk1UX0JHUjI0ICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX0JHUjI0ICovCi0jZGVmaW5lIElNR19GTVRfUkdCMzJfTEUgICBWUFhfSU1HX0ZNVF9SR0IzMl9MRSAgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0IzMl9MRSAqLwotI2RlZmluZSBJTUdfRk1UX0FSR0IgICAgICAgVlBYX0lNR19GTVRfQVJHQiAgICAgICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfQVJHQiAqLwotI2RlZmluZSBJTUdfRk1UX0FSR0JfTEUgICAgVlBYX0lNR19GTVRfQVJHQl9MRSAgICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfQVJHQl9MRSAqLwotI2RlZmluZSBJTUdfRk1UX1JHQjU2NV9MRSAgVlBYX0lNR19GTVRfUkdCNTY1X0xFICAvKio8IFxkZXByZWNhdGVkIFVzZSAjVlBYX0lNR19GTVRfUkdCNTY1X0xFICovCi0jZGVmaW5lIElNR19GTVRfUkdCNTU1X0xFICBWUFhfSU1HX0ZNVF9SR0I1NTVfTEUgIC8qKjwgXGRlcHJlY2F0ZWQgVXNlICNWUFhfSU1HX0ZNVF9SR0I1NTVfTEUgKi8KLSNkZWZpbmUgSU1HX0ZNVF9ZVjEyICAgICAgIFZQWF9JTUdfRk1UX1lWMTIgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1lWMTIgKi8KLSNkZWZpbmUgSU1HX0ZNVF9JNDIwICAgICAgIFZQWF9JTUdfRk1UX0k0MjAgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX0k0MjAgKi8KLSNkZWZpbmUgSU1HX0ZNVF9WUFhZVjEyICAgIFZQWF9JTUdfRk1UX1ZQWFlWMTIgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1ZQWFlWMTIgKi8KLSNkZWZpbmUgSU1HX0ZNVF9WUFhJNDIwICAgIFZQWF9JTUdfRk1UX1ZQWEk0MjAgICAgLyoqPCBcZGVwcmVjYXRlZCBVc2UgI1ZQWF9JTUdfRk1UX1ZQWEk0MjAgKi8KLSNlbmRpZiAvKiBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgKi8KLQotICAgIC8qKlxicmllZiBJbWFnZSBEZXNjcmlwdG9yICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QgdnB4X2ltYWdlCi0gICAgewotICAgICAgICB2cHhfaW1nX2ZtdF90IGZtdDsgLyoqPCBJbWFnZSBGb3JtYXQgKi8KLQotICAgICAgICAvKiBJbWFnZSBzdG9yYWdlIGRpbWVuc2lvbnMgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICB3OyAgIC8qKjwgU3RvcmVkIGltYWdlIHdpZHRoICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgaDsgICAvKio8IFN0b3JlZCBpbWFnZSBoZWlnaHQgKi8KLQotICAgICAgICAvKiBJbWFnZSBkaXNwbGF5IGRpbWVuc2lvbnMgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICBkX3c7ICAgLyoqPCBEaXNwbGF5ZWQgaW1hZ2Ugd2lkdGggKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICBkX2g7ICAgLyoqPCBEaXNwbGF5ZWQgaW1hZ2UgaGVpZ2h0ICovCi0KLSAgICAgICAgLyogQ2hyb21hIHN1YnNhbXBsaW5nIGluZm8gKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICB4X2Nocm9tYV9zaGlmdDsgICAvKio8IHN1YnNhbXBsaW5nIG9yZGVyLCBYICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgeV9jaHJvbWFfc2hpZnQ7ICAgLyoqPCBzdWJzYW1wbGluZyBvcmRlciwgWSAqLwotCi0gICAgICAgIC8qIEltYWdlIGRhdGEgcG9pbnRlcnMuICovCi0jZGVmaW5lIFZQWF9QTEFORV9QQUNLRUQgMCAgIC8qKjwgVG8gYmUgdXNlZCBmb3IgYWxsIHBhY2tlZCBmb3JtYXRzICovCi0jZGVmaW5lIFZQWF9QTEFORV9ZICAgICAgMCAgIC8qKjwgWSAoTHVtaW5hbmNlKSBwbGFuZSAqLwotI2RlZmluZSBWUFhfUExBTkVfVSAgICAgIDEgICAvKio8IFUgKENocm9tYSkgcGxhbmUgKi8KLSNkZWZpbmUgVlBYX1BMQU5FX1YgICAgICAyICAgLyoqPCBWIChDaHJvbWEpIHBsYW5lICovCi0jZGVmaW5lIFZQWF9QTEFORV9BTFBIQSAgMyAgIC8qKjwgQSAoVHJhbnNwYXJlbmN5KSBwbGFuZSAqLwotI2lmICFkZWZpbmVkKFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCkgfHwgIVZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVAotI2RlZmluZSBQTEFORV9QQUNLRUQgICAgIFZQWF9QTEFORV9QQUNLRUQKLSNkZWZpbmUgUExBTkVfWSAgICAgICAgICBWUFhfUExBTkVfWQotI2RlZmluZSBQTEFORV9VICAgICAgICAgIFZQWF9QTEFORV9VCi0jZGVmaW5lIFBMQU5FX1YgICAgICAgICAgVlBYX1BMQU5FX1YKLSNkZWZpbmUgUExBTkVfQUxQSEEgICAgICBWUFhfUExBTkVfQUxQSEEKLSNlbmRpZgotICAgICAgICB1bnNpZ25lZCBjaGFyICpwbGFuZXNbNF07ICAvKio8IHBvaW50ZXIgdG8gdGhlIHRvcCBsZWZ0IHBpeGVsIGZvciBlYWNoIHBsYW5lICovCi0gICAgICAgIGludCAgICAgIHN0cmlkZVs0XTsgIC8qKjwgc3RyaWRlIGJldHdlZW4gcm93cyBmb3IgZWFjaCBwbGFuZSAqLwotCi0gICAgICAgIGludCAgICAgYnBzOyAvKio8IGJpdHMgcGVyIHNhbXBsZSAoZm9yIHBhY2tlZCBmb3JtYXRzKSAqLwotCi0gICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgbWVtYmVyIG1heSBiZSBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGFzc29jaWF0ZSBkYXRhCi0gICAgICAgICAqIHdpdGggdGhpcyBpbWFnZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgICAgKnVzZXJfcHJpdjsgLyoqPCBtYXkgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBhc3NvY2lhdGUgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICogICB3aXRoIHRoaXMgaW1hZ2UuICovCi0KLSAgICAgICAgLyogVGhlIGZvbGxvd2luZyBtZW1iZXJzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUuICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmltZ19kYXRhOyAgICAgICAvKio8IHByaXZhdGUgKi8KLSAgICAgICAgaW50ICAgICAgaW1nX2RhdGFfb3duZXI7IC8qKjwgcHJpdmF0ZSAqLwotICAgICAgICBpbnQgICAgICBzZWxmX2FsbG9jZDsgICAgLyoqPCBwcml2YXRlICovCi0gICAgfSB2cHhfaW1hZ2VfdDsgLyoqPCBhbGlhcyBmb3Igc3RydWN0IHZweF9pbWFnZSAqLwotCi0gICAgLyoqXGJyaWVmIFJlcHJlc2VudGF0aW9uIG9mIGEgcmVjdGFuZ2xlIG9uIGEgc3VyZmFjZSAqLwotICAgIHR5cGVkZWYgc3RydWN0IHZweF9pbWFnZV9yZWN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgeDsgLyoqPCBsZWZ0bW9zdCBjb2x1bW4gKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHk7IC8qKjwgdG9wbW9zdCByb3cgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHc7IC8qKjwgd2lkdGggKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGg7IC8qKjwgaGVpZ2h0ICovCi0gICAgfSB2cHhfaW1hZ2VfcmVjdF90OyAvKio8IGFsaWFzIGZvciBzdHJ1Y3QgdnB4X2ltYWdlX3JlY3QgKi8KLQotICAgIC8qIVxicmllZiBPcGVuIGEgZGVzY3JpcHRvciwgYWxsb2NhdGluZyBzdG9yYWdlIGZvciB0aGUgdW5kZXJseWluZyBpbWFnZQotICAgICAqCi0gICAgICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHN0b3JpbmcgYW4gaW1hZ2Ugb2YgdGhlIGdpdmVuIGZvcm1hdC4gVGhlCi0gICAgICogc3RvcmFnZSBmb3IgdGhlIGRlc2NyaXB0b3IgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBpbWcgICAgICAgUG9pbnRlciB0byBzdG9yYWdlIGZvciBkZXNjcmlwdG9yLiBJZiB0aGlzIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwsIHRoZSBzdG9yYWdlIGZvciB0aGUgZGVzY3JpcHRvciB3aWxsIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgotICAgICAqIFxwYXJhbVtpbl0gICAgZm10ICAgICAgIEZvcm1hdCBmb3IgdGhlIGltYWdlCi0gICAgICogXHBhcmFtW2luXSAgICBkX3cgICAgICAgV2lkdGggb2YgdGhlIGltYWdlCi0gICAgICogXHBhcmFtW2luXSAgICBkX2ggICAgICAgSGVpZ2h0IG9mIHRoZSBpbWFnZQotICAgICAqIFxwYXJhbVtpbl0gICAgYWxpZ24gICAgIEFsaWdubWVudCwgaW4gYnl0ZXMsIG9mIGVhY2ggcm93IGluIHRoZSBpbWFnZS4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIGltYWdlIGRlc2NyaXB0b3IuIElmIHRoZSBpbWcKLSAgICAgKiAgICAgICAgIHBhcmFtZXRlciBpcyBub24tbnVsbCwgdGhlIHZhbHVlIG9mIHRoZSBpbWcgcGFyYW1ldGVyIHdpbGwgYmUKLSAgICAgKiAgICAgICAgIHJldHVybmVkLgotICAgICAqLwotICAgIHZweF9pbWFnZV90ICp2cHhfaW1nX2FsbG9jKHZweF9pbWFnZV90ICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfZm10X3QgZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkX3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRfaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxpZ24pOwotCi0gICAgLyohXGJyaWVmIE9wZW4gYSBkZXNjcmlwdG9yLCB1c2luZyBleGlzdGluZyBzdG9yYWdlIGZvciB0aGUgdW5kZXJseWluZyBpbWFnZQotICAgICAqCi0gICAgICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHN0b3JpbmcgYW4gaW1hZ2Ugb2YgdGhlIGdpdmVuIGZvcm1hdC4gVGhlCi0gICAgICogc3RvcmFnZSBmb3IgZGVzY3JpcHRvciBoYXMgYmVlbiBhbGxvY2F0ZWQgZWxzZXdoZXJlLCBhbmQgYSBkZXNjcmlwdG9yIGlzCi0gICAgICogZGVzaXJlZCB0byAid3JhcCIgdGhhdCBzdG9yYWdlLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBpbWcgICAgICAgUG9pbnRlciB0byBzdG9yYWdlIGZvciBkZXNjcmlwdG9yLiBJZiB0aGlzIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwsIHRoZSBzdG9yYWdlIGZvciB0aGUgZGVzY3JpcHRvciB3aWxsIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgotICAgICAqIFxwYXJhbVtpbl0gICAgZm10ICAgICAgIEZvcm1hdCBmb3IgdGhlIGltYWdlCi0gICAgICogXHBhcmFtW2luXSAgICBkX3cgICAgICAgV2lkdGggb2YgdGhlIGltYWdlCi0gICAgICogXHBhcmFtW2luXSAgICBkX2ggICAgICAgSGVpZ2h0IG9mIHRoZSBpbWFnZQotICAgICAqIFxwYXJhbVtpbl0gICAgYWxpZ24gICAgIEFsaWdubWVudCwgaW4gYnl0ZXMsIG9mIGVhY2ggcm93IGluIHRoZSBpbWFnZS4KLSAgICAgKiBccGFyYW1baW5dICAgIGltZ19kYXRhICBTdG9yYWdlIHRvIHVzZSBmb3IgdGhlIGltYWdlCi0gICAgICoKLSAgICAgKiBccmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBpbWFnZSBkZXNjcmlwdG9yLiBJZiB0aGUgaW1nCi0gICAgICogICAgICAgICBwYXJhbWV0ZXIgaXMgbm9uLW51bGwsIHRoZSB2YWx1ZSBvZiB0aGUgaW1nIHBhcmFtZXRlciB3aWxsIGJlCi0gICAgICogICAgICAgICByZXR1cm5lZC4KLSAgICAgKi8KLSAgICB2cHhfaW1hZ2VfdCAqdnB4X2ltZ193cmFwKHZweF9pbWFnZV90ICAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19mbXRfdCBmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZF93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRfaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhbGlnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAqaW1nX2RhdGEpOwotCi0KLSAgICAvKiFcYnJpZWYgU2V0IHRoZSByZWN0YW5nbGUgaWRlbnRpZnlpbmcgdGhlIGRpc3BsYXllZCBwb3J0aW9uIG9mIHRoZSBpbWFnZQotICAgICAqCi0gICAgICogVXBkYXRlcyB0aGUgZGlzcGxheWVkIHJlY3RhbmdsZSAoYWthIHZpZXdwb3J0KSBvbiB0aGUgaW1hZ2Ugc3VyZmFjZSB0bwotICAgICAqIG1hdGNoIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgYW5kIHNpemUuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dICAgIGltZyAgICAgICBJbWFnZSBkZXNjcmlwdG9yCi0gICAgICogXHBhcmFtW2luXSAgICB4ICAgICAgICAgbGVmdG1vc3QgY29sdW1uCi0gICAgICogXHBhcmFtW2luXSAgICB5ICAgICAgICAgdG9wbW9zdCByb3cKLSAgICAgKiBccGFyYW1baW5dICAgIHcgICAgICAgICB3aWR0aAotICAgICAqIFxwYXJhbVtpbl0gICAgaCAgICAgICAgIGhlaWdodAotICAgICAqCi0gICAgICogXHJldHVybiAwIGlmIHRoZSByZXF1ZXN0ZWQgcmVjdGFuZ2xlIGlzIHZhbGlkLCBub256ZXJvIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBpbnQgdnB4X2ltZ19zZXRfcmVjdCh2cHhfaW1hZ2VfdCAgKmltZywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGgpOwotCi0KLSAgICAvKiFcYnJpZWYgRmxpcCB0aGUgaW1hZ2UgdmVydGljYWxseSAodG9wIGZvciBib3R0b20pCi0gICAgICoKLSAgICAgKiBBZGp1c3RzIHRoZSBpbWFnZSBkZXNjcmlwdG9yJ3MgcG9pbnRlcnMgYW5kIHN0cmlkZXMgdG8gbWFrZSB0aGUgaW1hZ2UKLSAgICAgKiBiZSByZWZlcmVuY2VkIHVwc2lkZS1kb3duLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSAgICBpbWcgICAgICAgSW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHZvaWQgdnB4X2ltZ19mbGlwKHZweF9pbWFnZV90ICppbWcpOwotCi0gICAgLyohXGJyaWVmIENsb3NlIGFuIGltYWdlIGRlc2NyaXB0b3IKLSAgICAgKgotICAgICAqIEZyZWVzIGFsbCBhbGxvY2F0ZWQgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggYW4gaW1hZ2UgZGVzY3JpcHRvci4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gICAgaW1nICAgICAgIEltYWdlIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICB2b2lkIHZweF9pbWdfZnJlZSh2cHhfaW1hZ2VfdCAqaW1nKTsKLQotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnB4L3ZweF9pbnRlZ2VyLmggYi92cHgvdnB4X2ludGVnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNmMxYS4uMDAwMDAwMAotLS0gYS92cHgvdnB4X2ludGVnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIFZQWF9JTlRFR0VSX0gKLSNkZWZpbmUgVlBYX0lOVEVHRVJfSAotCi0vKiBnZXQgcHRyZGlmZl90LCBzaXplX3QsIHdjaGFyX3QsIE5VTEwgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoVlBYX0VNVUxBVEVfSU5UVFlQRVMpCi10eXBlZGVmIHNpZ25lZCBjaGFyICBpbnQ4X3Q7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OwotdHlwZWRlZiBzaWduZWQgaW50ICAgaW50MzJfdDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdWludDMyX3Q7Ci0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotdHlwZWRlZiBzaWduZWQgX19pbnQ2NCAgIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7Ci0jZGVmaW5lIFBSSWQ2NCAiSTY0ZCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9BUk1WNgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgaW50X2Zhc3QxNl90OwotI2Vsc2UKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludF9mYXN0MTZfdDsKLSNlbmRpZgotdHlwZWRlZiBzaWduZWQgY2hhciBpbnRfZmFzdDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50X2Zhc3Q4X3Q7Ci0KLSNpZm5kZWYgX1VJTlRQVFJfVF9ERUZJTkVECi10eXBlZGVmIHVuc2lnbmVkIGludCAgIHVpbnRwdHJfdDsKLSNlbmRpZgotCi0jZWxzZQotCi0vKiBNb3N0IHBsYXRmb3JtcyBoYXZlIHRoZSBDOTkgc3RhbmRhcmQgaW50ZWdlciB0eXBlcy4gKi8KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKF9fU1REQ19GT1JNQVRfTUFDUk9TKQotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdnB4X2NvbmZpZy5jIGIvdnB4X2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDI3NzViLi4wMDAwMDAwCi0tLSBhL3ZweF9jb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGNmZyA9ICItLXRhcmdldD1nZW5lcmljLWdudSI7Ci1jb25zdCBjaGFyICp2cHhfY29kZWNfYnVpbGRfY29uZmlnKHZvaWQpIHtyZXR1cm4gY2ZnO30KZGlmZiAtLWdpdCBhL3ZweF9jb25maWcuaCBiL3ZweF9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkOWEwOS4uMDAwMDAwMAotLS0gYS92cHhfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBub3QgZWRpdCEgKi8KLSNkZWZpbmUgSU5MSU5FICAgICAgCi0jZGVmaW5lIEZPUkNFSU5MSU5FIAotI2RlZmluZSBSRVNUUklDVCAgICAKLQotI2lmIGRlZmluZWQoX19hcm1fXykKLQotI2RlZmluZSBBUkNIX0FSTSAxCi0jZGVmaW5lIEhBVkVfQVJNVjVURSAwCi0jZWxzZQotI2RlZmluZSBBUkNIX0FSTSAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19BUk1fSEFWRV9ORU9OKQotI2RlZmluZSBIQVZFX0FSTVY3IDEKLSNlbHNlCi0jZGVmaW5lIEhBVkVfQVJNVjcgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQVJNX0hBVkVfQVJNVjYpCi0jZGVmaW5lIEhBVkVfQVJNVjYgMQotI2Vsc2UKLSNkZWZpbmUgSEFWRV9BUk1WNiAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19taXBzX18pCi0jZGVmaW5lIEFSQ0hfTUlQUyAxCi0jZWxzZQotI2RlZmluZSBBUkNIX01JUFMgMAotI2VuZGlmCi0KLSNkZWZpbmUgQVJDSF9YODYgMAotI2RlZmluZSBBUkNIX1g4Nl82NCAwCi0jZGVmaW5lIEFSQ0hfUFBDMzIgMAotI2RlZmluZSBBUkNIX1BQQzY0IDAKLQotI2RlZmluZSBIQVZFX0lXTU1YVCAwCi0jZGVmaW5lIEhBVkVfSVdNTVhUMiAwCi0jZGVmaW5lIEhBVkVfTU1YIDAKLSNkZWZpbmUgSEFWRV9TU0UgMAotI2RlZmluZSBIQVZFX1NTRTIgMAotI2RlZmluZSBIQVZFX1NTRTMgMAotI2RlZmluZSBIQVZFX1NTU0UzIDAKLSNkZWZpbmUgSEFWRV9BTFRJVkVDIDAKLSNkZWZpbmUgSEFWRV9WUFhfUE9SVFMgMQotI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLSNkZWZpbmUgSEFWRV9BTFRfVFJFRV9MQVlPVVQgMAotI2RlZmluZSBIQVZFX1BUSFJFQURfSCAxCi0jZGVmaW5lIEhBVkVfU1lTX01NQU5fSCAxCi0jZGVmaW5lIENPTkZJR19FWFRFUk5BTF9CVUlMRCAwCi0jZGVmaW5lIENPTkZJR19JTlNUQUxMX0RPQ1MgMAotI2RlZmluZSBDT05GSUdfSU5TVEFMTF9CSU5TIDEKLSNkZWZpbmUgQ09ORklHX0lOU1RBTExfTElCUyAxCi0jZGVmaW5lIENPTkZJR19JTlNUQUxMX1NSQ1MgMQotI2RlZmluZSBDT05GSUdfREVCVUcgMAotI2RlZmluZSBDT05GSUdfR1BST0YgMAotI2RlZmluZSBDT05GSUdfR0NPViAwCi0jZGVmaW5lIENPTkZJR19SVkNUIDAKLSNkZWZpbmUgQ09ORklHX0dDQyAwCi0jZGVmaW5lIENPTkZJR19NU1ZTIDAKLSNkZWZpbmUgQ09ORklHX1BJQyAwCi0jZGVmaW5lIENPTkZJR19CSUdfRU5ESUFOIDAKLSNkZWZpbmUgQ09ORklHX0NPREVDX1NSQ1MgMAotI2RlZmluZSBDT05GSUdfREVCVUdfTElCUyAwCi0jZGVmaW5lIENPTkZJR19GQVNUX1VOQUxJR05FRCAxCi0jZGVmaW5lIENPTkZJR19NRU1fTUFOQUdFUiAwCi0jZGVmaW5lIENPTkZJR19NRU1fVFJBQ0tFUiAwCi0jZGVmaW5lIENPTkZJR19NRU1fQ0hFQ0tTIDAKLSNkZWZpbmUgQ09ORklHX01ENSAxCi0jZGVmaW5lIENPTkZJR19ERVFVQU5UX1RPS0VOUyAwCi0jZGVmaW5lIENPTkZJR19EQ19SRUNPTiAwCi0jZGVmaW5lIENPTkZJR19ORVdfVE9LRU5TIDAKLSNkZWZpbmUgQ09ORklHX0VWQUxfTElNSVQgMAotI2RlZmluZSBDT05GSUdfUlVOVElNRV9DUFVfREVURUNUIDAKLSNkZWZpbmUgQ09ORklHX1BPU1RQUk9DIDAKLSNkZWZpbmUgQ09ORklHX1BPU1RQUk9DX0dFTkVSSUMgMAotI2RlZmluZSBDT05GSUdfT1NfU1VQUE9SVCAxCi0jZGVmaW5lIENPTkZJR19NVUxUSVRIUkVBRCAxCi0jZGVmaW5lIENPTkZJR19QU05SIDAKLSNkZWZpbmUgQ09ORklHX1ZQOF9FTkNPREVSIDEKLSNkZWZpbmUgQ09ORklHX1ZQOF9ERUNPREVSIDEKLSNkZWZpbmUgQ09ORklHX1ZQOCAxCi0jZGVmaW5lIENPTkZJR19FTkNPREVSUyAxCi0jZGVmaW5lIENPTkZJR19ERUNPREVSUyAxCi0jZGVmaW5lIENPTkZJR19TVEFUSUNfTVNWQ1JUIDAKLSNkZWZpbmUgQ09ORklHX1NQQVRJQUxfUkVTQU1QTElORyAxCi0jZGVmaW5lIENPTkZJR19SRUFMVElNRV9PTkxZIDAKZGlmZiAtLWdpdCBhL3ZweF9tZW0vaW5jbHVkZS9uZHMvdnB4X21lbV9uZHMuaCBiL3ZweF9tZW0vaW5jbHVkZS9uZHMvdnB4X21lbV9uZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZjU0ZC4uMDAwMDAwMAotLS0gYS92cHhfbWVtL2luY2x1ZGUvbmRzL3ZweF9tZW1fbmRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX1ZQWF9NRU1fTkRTX0hfXwotI2RlZmluZSBfX1ZQWF9NRU1fTkRTX0hfXwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlIDxuaXRyby5oPgotI2luY2x1ZGUgPG5pdHJvL29zLmg+Ci0KLSAgICB2b2lkICp2cHhfbWVtX25kc19hbGxvYyhvc2FyZW5hX2lkIGlkLCBvc2hlYXBfaGFuZGxlIGhhbmRsZSwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7Ci0gICAgdm9pZCB2cHhfbWVtX25kc19mcmVlKG9zYXJlbmFfaWQgaWQsIG9zaGVhcF9oYW5kbGUgaGFuZGxlLCB2b2lkICptZW0pOwotICAgIGludCB2cHhfbmRzX2FsbG9jX2hlYXAob3NhcmVuYV9pZCBpZCwgdTMyIHNpemUpOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypfX1ZQWF9NRU1fTkRTX0hfXyovCmRpZmYgLS1naXQgYS92cHhfbWVtL2luY2x1ZGUvdnB4X21lbV9pbnRybmwuaCBiL3ZweF9tZW0vaW5jbHVkZS92cHhfbWVtX2ludHJubC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTI2MWJhLi4wMDAwMDAwCi0tLSBhL3ZweF9tZW0vaW5jbHVkZS92cHhfbWVtX2ludHJubC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgX19WUFhfTUVNX0lOVFJOTF9IX18KLSNkZWZpbmUgX19WUFhfTUVNX0lOVFJOTF9IX18KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0KLSNpZm5kZWYgQ09ORklHX01FTV9NQU5BR0VSCi0jIGlmIGRlZmluZWQoVlhXT1JLUykKLSMgIGRlZmluZSBDT05GSUdfTUVNX01BTkFHRVIgIDEgLyppbmNsdWRlIGhlYXAgbWFuYWdlciBmdW5jdGlvbmFsaXR5LCovCi0vKmRlZmF1bHQ6IGVuYWJsZWQgb24gdnh3b3JrcyovCi0jIGVsc2UKLSMgIGRlZmluZSBDT05GSUdfTUVNX01BTkFHRVIgIDAgLyppbmNsdWRlIGhlYXAgbWFuYWdlciBmdW5jdGlvbmFsaXR5Ki8KLSMgZW5kaWYKLSNlbmRpZiAvKkNPTkZJR19NRU1fTUFOQUdFUiovCi0KLSNpZm5kZWYgQ09ORklHX01FTV9UUkFDS0VSCi0jIGRlZmluZSBDT05GSUdfTUVNX1RSQUNLRVIgICAgIDEgLyppbmNsdWRlIHh2cHhfKiBjYWxscyBpbiB0aGUgbGliKi8KLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19NRU1fQ0hFQ0tTCi0jIGRlZmluZSBDT05GSUdfTUVNX0NIRUNLUyAgICAgIDAgLyppbmNsdWRlIHNvbWUgYmFzaWMgc2FmZXR5IGNoZWNrcyBpbgotdnB4X21lbWNweSwgX21lbXNldCwgYW5kIF9tZW1tb3ZlKi8KLSNlbmRpZgotCi0jaWZuZGVmIFVTRV9HTE9CQUxfRlVOQ1RJT05fUE9JTlRFUlMKLSMgZGVmaW5lIFVTRV9HTE9CQUxfRlVOQ1RJT05fUE9JTlRFUlMgICAwICAvKnVzZSBmdW5jdGlvbiBwb2ludGVycyBpbnN0ZWFkIG9mIGNvbXBpbGVkIGZ1bmN0aW9ucy4qLwotI2VuZGlmCi0KLSNpZiBDT05GSUdfTUVNX1RSQUNLRVIKLSMgaW5jbHVkZSAidnB4X21lbV90cmFja2VyLmgiCi0jIGlmIFZQWF9NRU1fVFJBQ0tFUl9WRVJTSU9OX0NISUVGICE9IDIgfHwgVlBYX01FTV9UUkFDS0VSX1ZFUlNJT05fTUFKT1IgIT0gNQotIyAgZXJyb3IgInZweF9tZW0gcmVxdWlyZXMgbWVtb3J5IHRyYWNrZXIgdmVyc2lvbiAyLjUgdG8gdHJhY2sgbWVtb3J5IHVzYWdlIgotIyBlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQUREUkVTU19TVE9SQUdFX1NJWkUgICAgICBzaXplb2Yoc2l6ZV90KQotCi0jaWZuZGVmIERFRkFVTFRfQUxJR05NRU5UCi0jIGlmIGRlZmluZWQoVlhXT1JLUykKLSMgIGRlZmluZSBERUZBVUxUX0FMSUdOTUVOVCAgICAgICAgMzIgICAgICAgIC8qZGVmYXVsdCBhZGRyIGFsaWdubWVudCB0byB1c2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHMgdG8gdnB4XyogZnVuY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdnB4X21lbWFsaWduKi8KLSMgZWxzZQotIyAgZGVmaW5lIERFRkFVTFRfQUxJR05NRU5UICAgICAgICAxCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIERFRkFVTFRfQUxJR05NRU5UIDwgMQotIyBlcnJvciAiREVGQVVMVF9BTElHTk1FTlQgbXVzdCBiZSA+PSAxISIKLSNlbmRpZgotCi0jaWYgQ09ORklHX01FTV9UUkFDS0VSCi0jIGRlZmluZSBUUllfQk9VTkRTX0NIRUNLICAgICAgICAgMSAgICAgICAgLyp3aGVuIHNldCB0byAxIHBhZHMgZWFjaCBhbGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyaXR5IGNhbiBiZSBjaGVja2VkIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHhfbWVtb3J5X3RyYWNrZXJfY2hlY2tfaW50ZWdyaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBvbiBmcmVlIGJ5IGRlZmluaW5nKi8KLS8qVFJZX0JPVU5EU19DSEVDS19PTl9GUkVFKi8KLSNlbHNlCi0jIGRlZmluZSBUUllfQk9VTkRTX0NIRUNLICAgICAgICAgMAotI2VuZGlmIC8qQ09ORklHX01FTV9UUkFDS0VSKi8KLQotI2lmIFRSWV9CT1VORFNfQ0hFQ0sKLSMgZGVmaW5lIFRSWV9CT1VORFNfQ0hFQ0tfT05fRlJFRSAwICAgICAgICAgIC8qY2hlY2tzIG1lbSBpbnRlZ3JpdHkgb24gZXZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSwgdmVyeSBleHBlbnNpdmUqLwotIyBkZWZpbmUgQk9VTkRTX0NIRUNLX1ZBTFVFICAgICAgIDB4ZGVhZGJlZWYgLyp2YWx1ZSBzdG9yZWQgYmVmb3JlL2FmdGVyIGVhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0gYWRkciBmb3IgYm91bmRzIGNoZWNraW5nKi8KLSMgZGVmaW5lIEJPVU5EU19DSEVDS19QQURfU0laRSAgICAzMiAgICAgICAgIC8qc2l6ZSBvZiB0aGUgcGFkZGluZyBiZWZvcmUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGVhIGFsbG9jYXRpb24gdG8gYmUgZmlsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQk9VTkRTX0NIRUNLX1ZBTFVFLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQqLwotI2Vsc2UKLSMgZGVmaW5lIEJPVU5EU19DSEVDS19WQUxVRSAgICAgICAwCi0jIGRlZmluZSBCT1VORFNfQ0hFQ0tfUEFEX1NJWkUgICAgMAotI2VuZGlmIC8qVFJZX0JPVU5EU19DSEVDSyovCi0KLSNpZm5kZWYgUkVNT1ZFX1BSSU5URlMKLSMgZGVmaW5lIFJFTU9WRV9QUklOVEZTIDAKLSNlbmRpZgotCi0vKiBTaG91bGQgcHJvYmFibHkgdXNlIGEgdnB4X21lbSBsb2dnZXIgZnVuY3Rpb24uICovCi0jaWYgUkVNT1ZFX1BSSU5URlMKLSMgZGVmaW5lIF9QKHgpCi0jZWxzZQotIyBkZWZpbmUgX1AoeCkgeAotI2VuZGlmCi0KLS8qcmV0dXJucyBhbiBhZGRyIGFsaWduZWQgdG8gdGhlIGJ5dGUgYm91bmRhcnkgc3BlY2lmaWVkIGJ5IGFsaWduKi8KLSNkZWZpbmUgYWxpZ25fYWRkcihhZGRyLGFsaWduKSAodm9pZCopKCgoc2l6ZV90KShhZGRyKSArICgoYWxpZ24pIC0gMSkpICYgKHNpemVfdCktKGFsaWduKSkKLQotI2VuZGlmIC8qX19WUFhfTUVNX0lOVFJOTF9IX18qLwpkaWZmIC0tZ2l0IGEvdnB4X21lbS92cHhfbWVtX3RyYWNrZXIuYyBiL3ZweF9tZW0vdnB4X21lbV90cmFja2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGFkMDcuLjAwMDAwMDAKLS0tIGEvdnB4X21lbS92cHhfbWVtX3RyYWNrZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDgyMyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyoKLSAgdnB4X21lbV90cmFja2VyLmMKLQotICBqd3ogMjAwMy0wOS0zMDoKLSAgIFN0b3JlcyBhIGxpc3Qgb2YgYWRkcmVzZXMsIHRoZWlyIHNpemUsIGFuZCBmaWxlIGFuZCBsaW5lIHRoZXkgY2FtZSBmcm9tLgotICAgQWxsIGV4cG9zZWQgbGliIGZ1bmN0aW9ucyBhcmUgcHJlZmFjZWQgYnkgdnB4XyBhbmQgYWxsb3cgdGhlIGdsb2JhbCBsaXN0Ci0gICB0byBiZSB0aHJlYWQgc2FmZS4KLSAgIEN1cnJlbnQgc3VwcG9ydGVkIHBsYXRmb3JtcyBhcmU6Ci0gICAgTGludXgsIFdpbjMyLCB3aW5fY2UgYW5kIHZ4X3dvcmtzCi0gICBGdXJ0aGVyIHN1cHBvcnQgY2FuIGJlIGFkZGVkIGJ5IGRlZmluaW5nIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBtdXRleAotICAgaW4gdGhlIG1lbW9yeV90cmFja2VyIHN0cnVjdCBhcyB3ZWxsIGFzIGNhbGxzIHRvIGNyZWF0ZS9kZXN0cm95L2xvY2svdW5sb2NrCi0gICB0aGUgbXV0ZXggaW4gdnB4X21lbW9yeV90cmFja2VyX2luaXQvRGVzdHJveSBhbmQgbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleC91bmxvY2tfbXV0ZXgKLSovCi0jaW5jbHVkZSAidnB4X3BvcnRzL2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX3VDbGludXhfXykKLSMgaW5jbHVkZSA8bGRkay5oPgotI2VuZGlmCi0KLSNpZiBIQVZFX1BUSFJFQURfSAotIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgaW5jbHVkZSA8d2luYmFzZS5oPgotI2VsaWYgZGVmaW5lZChWWFdPUktTKQotIyBpbmNsdWRlIDxzZW1fbGliLmg+Ci0jZWxpZiBkZWZpbmVkKE5EU19OSVRSTykKLSMgaW5jbHVkZSA8bml0cm8uaD4KLSMgaW5jbHVkZSA8bml0cm8vb3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gLy9WWFdPUktTIGRvZXNuJ3QgaGF2ZSBhIG1hbGxvYy9tZW1vcnkuaCBmaWxlLAotLy90aGlzIHNob3VsZCBwdWxsIGluIG1hbGxvYyxmcmVlLGV0Yy4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvdnB4X21lbV90cmFja2VyLmgiCi0KLSN1bmRlZiB2cHhfbWFsbG9jICAgLy91bmRlZmluZSBhbnkgdnB4X21lbSBtYWNyb3MgdGhhdCBtYXkgYWZmZWN0IGNhbGxzIHRvCi0jdW5kZWYgdnB4X2ZyZWUgICAgIC8vbWVtb3J5IGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUKLSN1bmRlZiB2cHhfbWVtY3B5Ci0jdW5kZWYgdnB4X21lbXNldAotCi0KLSNpZm5kZWYgVVNFX0dMT0JBTF9GVU5DVElPTl9QT0lOVEVSUwotIyBkZWZpbmUgVVNFX0dMT0JBTF9GVU5DVElPTl9QT0lOVEVSUyAgIDAgIC8vdXNlIGZ1bmN0aW9uIHBvaW50ZXJzIGluc3RlYWQgb2YgY29tcGlsZWQgZnVuY3Rpb25zLgotI2VuZGlmCi0KLSNpZiBVU0VfR0xPQkFMX0ZVTkNUSU9OX1BPSU5URVJTCi1zdGF0aWMgbWVtX3RyYWNrX21hbGxvY19mdW5jIGdfbWFsbG9jICAgPSBtYWxsb2M7Ci1zdGF0aWMgbWVtX3RyYWNrX2NhbGxvY19mdW5jIGdfY2FsbG9jICAgPSBjYWxsb2M7Ci1zdGF0aWMgbWVtX3RyYWNrX3JlYWxsb2NfZnVuYyBnX3JlYWxsb2MgPSByZWFsbG9jOwotc3RhdGljIG1lbV90cmFja19mcmVlX2Z1bmMgZ19mcmVlICAgICAgID0gZnJlZTsKLXN0YXRpYyBtZW1fdHJhY2tfbWVtY3B5X2Z1bmMgZ19tZW1jcHkgICA9IG1lbWNweTsKLXN0YXRpYyBtZW1fdHJhY2tfbWVtc2V0X2Z1bmMgZ19tZW1zZXQgICA9IG1lbXNldDsKLXN0YXRpYyBtZW1fdHJhY2tfbWVtbW92ZV9mdW5jIGdfbWVtbW92ZSA9IG1lbW1vdmU7Ci0jIGRlZmluZSBNRU1fVFJBQ0tfTUFMTE9DIGdfbWFsbG9jCi0jIGRlZmluZSBNRU1fVFJBQ0tfRlJFRSAgIGdfZnJlZQotIyBkZWZpbmUgTUVNX1RSQUNLX01FTUNQWSBnX21lbWNweQotIyBkZWZpbmUgTUVNX1RSQUNLX01FTVNFVCBnX21lbXNldAotI2Vsc2UKLSMgZGVmaW5lIE1FTV9UUkFDS19NQUxMT0MgdnB4X21hbGxvYwotIyBkZWZpbmUgTUVNX1RSQUNLX0ZSRUUgICB2cHhfZnJlZQotIyBkZWZpbmUgTUVNX1RSQUNLX01FTUNQWSB2cHhfbWVtY3B5Ci0jIGRlZmluZSBNRU1fVFJBQ0tfTUVNU0VUIHZweF9tZW1zZXQKLSNlbmRpZiAvLyBVU0VfR0xPQkFMX0ZVTkNUSU9OX1BPSU5URVJTCi0KLS8qIHByb3RvdHlwZXMgZm9yIGludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBtZW10cmFja19sb2coY29uc3QgY2hhciAqZm10LCAuLi4pOwotc3RhdGljIHZvaWQgbWVtb3J5X3RyYWNrZXJfZHVtcCgpOwotc3RhdGljIHZvaWQgbWVtb3J5X3RyYWNrZXJfY2hlY2tfaW50ZWdyaXR5KGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKTsKLXN0YXRpYyB2b2lkIG1lbW9yeV90cmFja2VyX2FkZChzaXplX3QgYWRkciwgdW5zaWduZWQgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRlZCk7Ci1zdGF0aWMgaW50IG1lbW9yeV90cmFja2VyX3JlbW92ZShzaXplX3QgYWRkcik7Ci1zdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqbWVtb3J5X3RyYWNrZXJfZmluZChzaXplX3QgYWRkcik7Ci0KLSNpZiBkZWZpbmVkKE5PX01VVEVYKQotIyBkZWZpbmUgbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleCgpICghZ19iX21lbV90cmFja2VyX2luaXRlZCkKLSMgZGVmaW5lIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpCi0jZWxzZQotc3RhdGljIGludCBtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCk7Ci1zdGF0aWMgaW50IG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotI2VuZGlmCi0KLSNpZm5kZWYgVlBYX05PX0dMT0JBTFMKLXN0cnVjdCBtZW1vcnlfdHJhY2tlcgotewotICAgIHN0cnVjdCBtZW1fYmxvY2sgKmhlYWQsCi0gICAgICAgICAgICAqIHRhaWw7Ci0gICAgaW50IGxlbiwKLSAgICAgICAgdG90YWxzaXplOwotICAgIHVuc2lnbmVkIGludCBjdXJyZW50X2FsbG9jYXRlZCwKLSAgICAgICAgICAgICBtYXhfYWxsb2NhdGVkOwotCi0jaWYgSEFWRV9QVEhSRUFEX0gKLSAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0jZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgSEFORExFIG11dGV4OwotI2VsaWYgZGVmaW5lZChWWFdPUktTKQotICAgIFNFTV9JRCBtdXRleDsKLSNlbGlmIGRlZmluZWQoTkRTX05JVFJPKQotICAgIE9TTXV0ZXggbXV0ZXg7Ci0jZWxpZiBkZWZpbmVkKE5PX01VVEVYKQotI2Vsc2UKLSNlcnJvciAiTm8gbXV0ZXggdHlwZSBkZWZpbmVkIGZvciB0aGlzIHBsYXRmb3JtISIKLSNlbmRpZgotCi0gICAgaW50IHBhZGRpbmdfc2l6ZSwKLSAgICAgICAgcGFkX3ZhbHVlOwotfTsKLQotc3RhdGljIHN0cnVjdCBtZW1vcnlfdHJhY2tlciBtZW10cmFjazsgICAvL291ciBnbG9iYWwgbWVtb3J5IGFsbG9jYXRpb24gbGlzdAotc3RhdGljIGludCBnX2JfbWVtX3RyYWNrZXJfaW5pdGVkID0gMDsgICAgIC8vaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdsb2JhbCBsaXN0IGhhcwotLy9iZWVuIGluaXRpYWxpemVkICgxOnllcy8wOm5vKQotc3RhdGljIHN0cnVjdAotewotICAgIEZJTEUgKmZpbGU7Ci0gICAgaW50IHR5cGU7Ci0gICAgdm9pZCAoKmZ1bmMpKHZvaWQgKnVzZXJkYXRhLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7Ci0gICAgdm9pZCAqdXNlcmRhdGE7Ci19IGdfbG9nZ2luZyA9IHtOVUxMLCAwLCBOVUxMLCBOVUxMfTsKLSNlbHNlCi0jIGluY2x1ZGUgInZweF9nbG9iYWxfaGFuZGxpbmcuaCIKLSNkZWZpbmUgZ19iX21lbV90cmFja2VyX2luaXRlZCB2cHhnbG9iYWxtKHZweG1lbSxnX2JfbWVtX3RyYWNrZXJfaW5pdGVkKQotI2RlZmluZSBnX2xvZ2dpbmcgdnB4Z2xvYmFsbSh2cHhtZW0sZ19sb2dnaW5nKQotI2RlZmluZSBtZW10cmFjayB2cHhnbG9iYWxtKHZweG1lbSxtZW10cmFjaykKLSNlbmRpZiAvLyAjaWZuZGVmIFZQWF9OT19HTE9CQUxTCi0KLWV4dGVybiB2b2lkICp2cHhfbWFsbG9jKHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkIHZweF9mcmVlKHZvaWQgKm1lbWJsayk7Ci1leHRlcm4gdm9pZCAqdnB4X21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW5ndGgpOwotZXh0ZXJuIHZvaWQgKnZweF9tZW1zZXQodm9pZCAqZGVzdCwgaW50IHZhbCwgc2l6ZV90IGxlbmd0aCk7Ci0KLS8qCi0gKgotICogRXhwb3NlZCBsaWJyYXJ5IGZ1bmN0aW9ucwotICoKLSovCi0KLS8qCi0gICAgdnB4X21lbW9yeV90cmFja2VyX2luaXQoaW50IHBhZGRpbmdfc2l6ZSwgaW50IHBhZF92YWx1ZSkKLSAgICAgIHBhZGRpbmdfc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBwYWRkaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBtZW0gYWRkci4KLSAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyA+IDAgaW5kaWNhdGUgdGhhdCBpbnRlZ3JpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQKLSAgICAgICAgICAgICAgICAgICAgIGJ5IGluc3BlY3RpbmcgdGhlc2UgYXJlYXMuCi0gICAgICBwYWRfdmFsdWUgLSB0aGUgaW5pdGlhbCB2YWx1ZSB3aXRoaW4gdGhlIHBhZGRpbmcgYXJlYSBiZWZvcmUgYW5kIGFmdGVyCi0gICAgICAgICAgICAgICAgICBlYWNoIG1lbSBhZGRyLgotCi0gICAgSW5pdGlhbGl6ZXMgZ2xvYmFsIG1lbW9yeSB0cmFja2VyIHN0cnVjdHVyZQotICAgIEFsbG9jYXRlcyB0aGUgaGVhZCBvZiB0aGUgbGlzdAotKi8KLWludCB2cHhfbWVtb3J5X3RyYWNrZXJfaW5pdChpbnQgcGFkZGluZ19zaXplLCBpbnQgcGFkX3ZhbHVlKQotewotICAgIGlmICghZ19iX21lbV90cmFja2VyX2luaXRlZCkKLSAgICB7Ci0gICAgICAgIGlmICgobWVtdHJhY2suaGVhZCA9IChzdHJ1Y3QgbWVtX2Jsb2NrICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTV9UUkFDS19NQUxMT0Moc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXQ7Ci0KLSAgICAgICAgICAgIE1FTV9UUkFDS19NRU1TRVQobWVtdHJhY2suaGVhZCwgMCwgc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKLQotICAgICAgICAgICAgbWVtdHJhY2sudGFpbCA9IG1lbXRyYWNrLmhlYWQ7Ci0KLSAgICAgICAgICAgIG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkID0gMDsKLSAgICAgICAgICAgIG1lbXRyYWNrLm1heF9hbGxvY2F0ZWQgICAgID0gMDsKLQotICAgICAgICAgICAgbWVtdHJhY2sucGFkZGluZ19zaXplID0gcGFkZGluZ19zaXplOwotICAgICAgICAgICAgbWVtdHJhY2sucGFkX3ZhbHVlICAgID0gcGFkX3ZhbHVlOwotCi0jaWYgSEFWRV9QVEhSRUFEX0gKLSAgICAgICAgICAgIHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbWVtdHJhY2subXV0ZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgICAgICAgICAgLyptdXRleCBhdHRyaWJ1dGVzIChOVUxMPWRlZmF1bHQpKi8KLSNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAgICAgICAgIG1lbXRyYWNrLm11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgICAvKnNlY3VyaXR5IGF0dHJpYnV0ZXMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvKndlIGRvbid0IHdhbnQgaW5pdGlhbCBvd25lcnNoaXAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvKm11dGV4IG5hbWUqLwotICAgICAgICAgICAgcmV0ID0gIW1lbXRyYWNrLm11dGV4OwotI2VsaWYgZGVmaW5lZChWWFdPUktTKQotICAgICAgICAgICAgbWVtdHJhY2subXV0ZXggPSBzZW1fYmNyZWF0ZShTRU1fUV9GSUZPLCAvKlNFTV9RX0ZJRk8gbm9uLXByaW9yaXR5IGJhc2VkIG11dGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VNX0ZVTEwpOyAgLypTRU1fRlVMTCBpbml0aWFsIHN0YXRlIGlzIHVubG9ja2VkKi8KLSAgICAgICAgICAgIHJldCA9ICFtZW10cmFjay5tdXRleDsKLSNlbGlmIGRlZmluZWQoTkRTX05JVFJPKQotICAgICAgICAgICAgb3NfaW5pdF9tdXRleCgmbWVtdHJhY2subXV0ZXgpOwotICAgICAgICAgICAgcmV0ID0gMDsKLSNlbGlmIGRlZmluZWQoTk9fTVVURVgpCi0gICAgICAgICAgICByZXQgPSAwOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJ2cHhfbWVtb3J5X3RyYWNrZXJfaW5pdDogRXJyb3IgY3JlYXRpbmcgbXV0ZXghXG4iKTsKLQotICAgICAgICAgICAgICAgIE1FTV9UUkFDS19GUkVFKG1lbXRyYWNrLmhlYWQpOwotICAgICAgICAgICAgICAgIG1lbXRyYWNrLmhlYWQgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbXRyYWNrX2xvZygiTWVtb3J5IFRyYWNrZXIgaW5pdCdkLCB2LiJ2cHhfbWVtX3RyYWNrZXJfdmVyc2lvbiIgcGFkX3NpemU6JWQgcGFkX3ZhbDoweCV4ICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGFkZGluZ19zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGFkX3ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGFkX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBnX2JfbWVtX3RyYWNrZXJfaW5pdGVkID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBnX2JfbWVtX3RyYWNrZXJfaW5pdGVkOwotfQotCi0vKgotICAgIHZweF9tZW1vcnlfdHJhY2tlcl9kZXN0cm95KCkKLSAgICBJZiBvdXIgZ2xvYmFsIHN0cnVjdCB3YXMgaW5pdGlhbGl6ZWQgemVyb3Mgb3V0IGFsbCBpdHMgbWVtYmVycywKLSAgICBmcmVlcyBtZW1vcnkgYW5kIGRlc3Ryb3lzIGl0J3MgbXV0ZXgKLSovCi12b2lkIHZweF9tZW1vcnlfdHJhY2tlcl9kZXN0cm95KCkKLXsKLSAgICBpZiAoIW1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKSkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBtZW1fYmxvY2sgKnAgID0gbWVtdHJhY2suaGVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHAyID0gbWVtdHJhY2suaGVhZDsKLQotICAgICAgICBtZW1vcnlfdHJhY2tlcl9kdW1wKCk7Ci0KLSAgICAgICAgd2hpbGUgKHApCi0gICAgewotICAgICAgICAgICAgcDIgPSBwOwotICAgICAgICAgICAgcCAgPSBwLT5uZXh0OwotCi0gICAgICAgICAgICBNRU1fVFJBQ0tfRlJFRShwMik7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW10cmFjay5oZWFkICAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIG1lbXRyYWNrLnRhaWwgICAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgbWVtdHJhY2subGVuICAgICAgICAgICAgICAgPSAwOwotICAgICAgICBtZW10cmFjay5jdXJyZW50X2FsbG9jYXRlZCA9IDA7Ci0gICAgICAgIG1lbXRyYWNrLm1heF9hbGxvY2F0ZWQgICAgID0gMDsKLQotICAgICAgICBpZiAoIWdfbG9nZ2luZy50eXBlICYmIGdfbG9nZ2luZy5maWxlICYmIGdfbG9nZ2luZy5maWxlICE9IHN0ZGVycikKLSAgICAgICAgewotI2lmICFkZWZpbmVkKE5EU19OSVRSTykKLSAgICAgICAgICAgIGZjbG9zZShnX2xvZ2dpbmcuZmlsZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGdfbG9nZ2luZy5maWxlID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotCi0gICAgICAgIGdfYl9tZW1fdHJhY2tlcl9pbml0ZWQgPSAwOwotICAgIH0KLX0KLQotLyoKLSAgICB2cHhfbWVtb3J5X3RyYWNrZXJfYWRkKHNpemVfdCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpCi0gICAgICBhZGRyIC0gbWVtb3J5IGFkZHJlc3MgdG8gYmUgYWRkZWQgdG8gbGlzdAotICAgICAgc2l6ZSAtIHNpemUgb2YgYWRkcgotICAgICAgZmlsZSAtIHRoZSBmaWxlIGFkZHIgd2FzIHJlZmVyZW5jZWQgZnJvbQotICAgICAgbGluZSAtIHRoZSBsaW5lIGluIGZpbGUgYWRkciB3YXMgcmVmZXJlbmNlZCBmcm9tCi0gICAgQWRkcyBtZW1vcnkgYWRkcmVzcyBhZGRyLCBpdCdzIHNpemUsIGZpbGUgYW5kIGxpbmUgaXQgY2FtZSBmcm9tCi0gICAgdG8gdGhlIGdsb2JhbCBsaXN0IHZpYSB0aGUgdGhyZWFkIHNhZmUgaW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbgotKi8KLXZvaWQgdnB4X21lbW9yeV90cmFja2VyX2FkZChzaXplX3QgYWRkciwgdW5zaWduZWQgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRlZCkKLXsKLSAgICBtZW1vcnlfdHJhY2tlcl9hZGQoYWRkciwgc2l6ZSwgZmlsZSwgbGluZSwgcGFkZGVkKTsKLX0KLQotLyoKLSAgICB2cHhfbWVtb3J5X3RyYWNrZXJfcmVtb3ZlKHNpemVfdCBhZGRyKQotICAgICAgYWRkciAtIG1lbW9yeSBhZGRyZXNzIHRvIGJlIHJlbW92ZWQgZnJvbSBsaXN0Ci0gICAgUmVtb3ZlcyBhZGRyIGZyb20gdGhlIGdsb2JhbCBsaXN0IHZpYSB0aGUgdGhyZWFkIHNhZmUKLSAgICBpbnRlcm5hbCByZW1vdmUgZnVuY3Rpb24KLSAgICBSZXR1cm46Ci0gICAgICBTYW1lIGFzIGRlc2NyaWJlZCBmb3IgbWVtb3J5X3RyYWNrZXJfcmVtb3ZlCi0qLwotaW50IHZweF9tZW1vcnlfdHJhY2tlcl9yZW1vdmUoc2l6ZV90IGFkZHIpCi17Ci0gICAgcmV0dXJuIG1lbW9yeV90cmFja2VyX3JlbW92ZShhZGRyKTsKLX0KLQotLyoKLSAgICB2cHhfbWVtb3J5X3RyYWNrZXJfZmluZChzaXplX3QgYWRkcikKLSAgICAgIGFkZHIgLSBhZGRyZXNzIHRvIGJlIGZvdW5kIGluIGxpc3QKLSAgICBSZXR1cm46Ci0gICAgICAgIElmIGZvdW5kLCBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgdGhhdCBtYXRjaGVzIGFkZHIKLSAgICAgICAgTlVMTCBvdGhlcndpc2UKLSovCi1zdHJ1Y3QgbWVtX2Jsb2NrICp2cHhfbWVtb3J5X3RyYWNrZXJfZmluZChzaXplX3QgYWRkcikKLXsKLSAgICBzdHJ1Y3QgbWVtX2Jsb2NrICpwID0gTlVMTDsKLQotICAgIGlmICghbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleCgpKQotICAgIHsKLSAgICAgICAgcCA9IG1lbW9yeV90cmFja2VyX2ZpbmQoYWRkcik7Ci0gICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotICAgIH0KLQotICAgIHJldHVybiBwOwotfQotCi0vKgotICAgIHZweF9tZW1vcnlfdHJhY2tlcl9kdW1wKCkKLSAgICBMb2NrcyB0aGUgbWVtb3J5IHRyYWNrZXIncyBtdXRleCBhbmQgY2FsbHMgdGhlIGludGVybmFsCi0gICAgbGlicmFyeSBmdW5jdGlvbiB0byBkdW1wIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZQotICAgIGdsb2JhbCBtZW1vcnkgYWxsb2NhdGlvbiBsaXN0Ci0qLwotdm9pZCB2cHhfbWVtb3J5X3RyYWNrZXJfZHVtcCgpCi17Ci0gICAgaWYgKCFtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCkpCi0gICAgewotICAgICAgICBtZW1vcnlfdHJhY2tlcl9kdW1wKCk7Ci0gICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotICAgIH0KLX0KLQotLyoKLSAgICB2cHhfbWVtb3J5X3RyYWNrZXJfY2hlY2tfaW50ZWdyaXR5KGNoYXIqIGZpbGUsIHVuc2lnbmVkIGludCBsaW5lKQotICAgICAgZmlsZSAtIFRoZSBmaWxlIG5hbWUgd2hlcmUgdGhlIGNoZWNrIHdhcyBwbGFjZWQKLSAgICAgIGxpbmUgLSBUaGUgbGluZSBpbiBmaWxlIHdoZXJlIHRoZSBjaGVjayB3YXMgcGxhY2VkCi0gICAgTG9ja3MgdGhlIG1lbW9yeSB0cmFja2VyJ3MgbXV0ZXggYW5kIGNhbGxzIHRoZSBpbnRlcm5hbAotICAgIGludGVncml0eSBjaGVjayBmdW5jdGlvbiB0byBpbnNwZWN0IGV2ZXJ5IGFkZHJlc3MgaW4gdGhlIGdsb2JhbAotICAgIG1lbW9yeSBhbGxvY2F0aW9uIGxpc3QKLSovCi12b2lkIHZweF9tZW1vcnlfdHJhY2tlcl9jaGVja19pbnRlZ3JpdHkoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpCi17Ci0gICAgaWYgKCFtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4KCkpCi0gICAgewotICAgICAgICBtZW1vcnlfdHJhY2tlcl9jaGVja19pbnRlZ3JpdHkoZmlsZSwgbGluZSk7Ci0gICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotICAgIH0KLX0KLQotLyoKLSAgICB2cHhfbWVtb3J5X3RyYWNrZXJfc2V0X2xvZ190eXBlCi0gICAgU2V0cyB0aGUgbG9nZ2luZyB0eXBlIGZvciB0aGUgbWVtb3J5IHRyYWNrZXIuIEJhc2VkIG9uIHRoZSB2YWx1ZSBpdCB3aWxsCi0gICAgZGlyZWN0IGl0cyBvdXRwdXQgdG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlLgotICAgIFJldHVybjoKLSAgICAgIDA6IG9uIHN1Y2Nlc3MKLSAgICAgIC0xOiBpZiB0aGUgbG9nZ2luZyB0eXBlIGNvdWxkIG5vdCBiZSBzZXQsIGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBpbnZhbGlkCi0gICAgICAgICAgb3IgYmVjYXVzZSBhIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZAotKi8KLWludCB2cHhfbWVtb3J5X3RyYWNrZXJfc2V0X2xvZ190eXBlKGludCB0eXBlLCBjaGFyICpvcHRpb24pCi17Ci0gICAgaW50IHJldCA9IC0xOwotCi0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIGdfbG9nZ2luZy50eXBlID0gMDsKLQotICAgICAgICBpZiAoIW9wdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgZ19sb2dnaW5nLmZpbGUgPSBzdGRlcnI7Ci0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICB9Ci0KLSNpZiAhZGVmaW5lZChORFNfTklUUk8pCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChnX2xvZ2dpbmcuZmlsZSA9IGZvcGVuKChjaGFyICopb3B0aW9uLCAidyIpKSkKLSAgICAgICAgICAgICAgICByZXQgPSAwOwotICAgICAgICB9Ci0KLSNlbmRpZgotICAgICAgICBicmVhazsKLSNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgIGNhc2UgMToKLSAgICAgICAgZ19sb2dnaW5nLnR5cGUgPSB0eXBlOwotICAgICAgICByZXQgPSAwOwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vb3V0cHV0IHRoZSB2ZXJzaW9uIHRvIHRoZSBuZXcgbG9nZ2luZyBkZXN0aW5hdGlvbgotICAgIGlmICghcmV0KQotICAgICAgICBtZW10cmFja19sb2coIk1lbW9yeSBUcmFja2VyIGxvZ2dpbmcgaW5pdGlhbGl6ZWQsICIKLSAgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgVHJhY2tlciB2LiJ2cHhfbWVtX3RyYWNrZXJfdmVyc2lvbiJcbiIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAgICB2cHhfbWVtb3J5X3RyYWNrZXJfc2V0X2xvZ19mdW5jCi0gICAgU2V0cyBhIGxvZ2dpbmcgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSB0aGUgbWVtb3J5IHRyYWNrZXIuCi0gICAgUmV0dXJuOgotICAgICAgMDogb24gc3VjY2VzcwotICAgICAgLTE6IGlmIHRoZSBsb2dnaW5nIHR5cGUgY291bGQgbm90IGJlIHNldCBiZWNhdXNlIGxvZ2Z1bmMgd2FzIE5VTEwKLSovCi1pbnQgdnB4X21lbW9yeV90cmFja2VyX3NldF9sb2dfZnVuYyh2b2lkICp1c2VyZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoKmxvZ2Z1bmMpKHZvaWQgKnVzZXJkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykpCi17Ci0gICAgaW50IHJldCA9IC0xOwotCi0gICAgaWYgKGxvZ2Z1bmMpCi0gICAgewotICAgICAgICBnX2xvZ2dpbmcudHlwZSAgICAgPSAtMTsKLSAgICAgICAgZ19sb2dnaW5nLnVzZXJkYXRhID0gdXNlcmRhdGE7Ci0gICAgICAgIGdfbG9nZ2luZy5mdW5jICAgICA9IGxvZ2Z1bmM7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgfQotCi0gICAgLy9vdXRwdXQgdGhlIHZlcnNpb24gdG8gdGhlIG5ldyBsb2dnaW5nIGRlc3RpbmF0aW9uCi0gICAgaWYgKCFyZXQpCi0gICAgICAgIG1lbXRyYWNrX2xvZygiTWVtb3J5IFRyYWNrZXIgbG9nZ2luZyBpbml0aWFsaXplZCwgIgotICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBUcmFja2VyIHYuInZweF9tZW1fdHJhY2tlcl92ZXJzaW9uIlxuIik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKgotICoKLSAqIEVORCAtIEV4cG9zZWQgbGlicmFyeSBmdW5jdGlvbnMKLSAqCi0qLwotCi0KLS8qCi0gKgotICogSW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnMKLSAqCi0qLwotCi1zdGF0aWMgdm9pZCBtZW10cmFja19sb2coY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBsaXN0OwotCi0gICAgdmFfc3RhcnQobGlzdCwgZm10KTsKLQotICAgIHN3aXRjaCAoZ19sb2dnaW5nLnR5cGUpCi0gICAgewotICAgIGNhc2UgLTE6Ci0KLSAgICAgICAgaWYgKGdfbG9nZ2luZy5mdW5jKQotICAgICAgICAgICAgZ19sb2dnaW5nLmZ1bmMoZ19sb2dnaW5nLnVzZXJkYXRhLCBmbXQsIGxpc3QpOwotCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMDoKLQotICAgICAgICBpZiAoZ19sb2dnaW5nLmZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZmcHJpbnRmKGdfbG9nZ2luZy5maWxlLCBmbXQsIGxpc3QpOwotICAgICAgICAgICAgZmZsdXNoKGdfbG9nZ2luZy5maWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgY2FzZSAxOgotICAgIHsKLSAgICAgICAgY2hhciB0ZW1wWzEwMjRdOwotICAgICAgICBfdnNucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSAvIHNpemVvZihjaGFyKSAtIDEsIGZtdCwgbGlzdCk7Ci0gICAgICAgIE91dHB1dERlYnVnU3RyaW5nKHRlbXApOwotICAgIH0KLSAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHZhX2VuZChsaXN0KTsKLX0KLQotLyoKLSAgICBtZW1vcnlfdHJhY2tlcl9kdW1wKCkKLSAgICBEdW1wcyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZ2xvYmFsIG1lbW9yeSBhbGxvY2F0aW9uIGxpc3QKLSovCi1zdGF0aWMgdm9pZCBtZW1vcnlfdHJhY2tlcl9kdW1wKCkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgc3RydWN0IG1lbV9ibG9jayAqcCA9IChtZW10cmFjay5oZWFkID8gbWVtdHJhY2suaGVhZC0+bmV4dCA6IE5VTEwpOwotCi0gICAgbWVtdHJhY2tfbG9nKCJcbl9jdXJyZW50bHkgQWxsb2NhdGVkPSAlZDsgTWF4IGFsbG9jYXRlZD0gJWRcbiIsCi0gICAgICAgICAgICAgICAgIG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkLCBtZW10cmFjay5tYXhfYWxsb2NhdGVkKTsKLQotICAgIHdoaWxlIChwKQotICAgIHsKLSNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotCi0gICAgICAgIC8qd2hlbiB1c2luZyBvdXRwdXRkZWJ1Z3N0cmluZywgb3V0cHV0IGZpbGVuYW1lcyBzbyB0aGV5Ci0gICAgICAgICAgY2FuIGJlIGNsaWNrZWQgdG8gYmUgb3BlbmVkIGluIHZpc3VhbCBzdHVkaW8qLwotICAgICAgICBpZiAoZ19sb2dnaW5nLnR5cGUgPT0gMSkKLSAgICAgICAgICAgIG1lbXRyYWNrX2xvZygibWVtYmxvY2tzWyVkXS5hZGRyPSAweCUuOHgsIG1lbWJsb2Nrc1slZF0uc2l6ZT0gJWQsIGZpbGU6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiAgJXMoJWQpOlxuIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLT5hZGRyLCBpLCBwLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZpbGUsIHAtPmxpbmUpOwotICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIG1lbXRyYWNrX2xvZygibWVtYmxvY2tzWyVkXS5hZGRyPSAweCUuOHgsIG1lbWJsb2Nrc1slZF0uc2l6ZT0gJWQsIGZpbGU6ICVzLCBsaW5lOiAlZFxuIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLT5hZGRyLCBpLCBwLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZpbGUsIHAtPmxpbmUpOwotCi0jaWZkZWYgTkRTX05JVFJPCi0KLSAgICAgICAgaWYgKCEoaSAlIDIwKSkgb3Nfc2xlZXAoNTAwKTsKLQotI2VuZGlmCi0KLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBtZW10cmFja19sb2coIlxuIik7Ci19Ci0KLS8qCi0gICAgbWVtb3J5X3RyYWNrZXJfY2hlY2tfaW50ZWdyaXR5KGNoYXIqIGZpbGUsIHVuc2lnbmVkIGludCBmaWxlKQotICAgICAgZmlsZSAtIHRoZSBmaWxlIG5hbWUgd2hlcmUgdGhlIGNoZWNrIHdhcyBwbGFjZWQKLSAgICAgIGxpbmUgLSB0aGUgbGluZSBpbiBmaWxlIHdoZXJlIHRoZSBjaGVjayB3YXMgcGxhY2VkCi0gICAgSWYgYSBwYWRkaW5nX3NpemUgd2FzIHN1cHBsaWVkIHRvIHZweF9tZW1vcnlfdHJhY2tlcl9pbml0KCkKLSAgICB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgZWEuIGFkZHIgaW4gdGhlIGxpc3QgdmVyaWZ5aW5nIHRoYXQKLSAgICBhZGRyLXBhZGRpbmdfc2l6ZSBhbmQgYWRkcitwYWRkaW5nX3NpemUgaXMgZmlsbGVkIHdpdGggcGFkX3ZhbHVlCi0qLwotc3RhdGljIHZvaWQgbWVtb3J5X3RyYWNrZXJfY2hlY2tfaW50ZWdyaXR5KGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKQotewotICAgIGlmIChtZW10cmFjay5wYWRkaW5nX3NpemUpCi0gICAgewotICAgICAgICBpbnQgaSwKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcF9zaG93X21lLAotICAgICAgICAgICAgICAgICAqIHBfc2hvd19tZTI7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0ZW1wbWUgPSBtZW10cmFjay5wYWRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICBkZWFkMSwKLSAgICAgICAgICAgICAgICAgICAgIGRlYWQyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp4X2JvdW5kczsKLSAgICAgICAgc3RydWN0IG1lbV9ibG9jayAqcCA9IG1lbXRyYWNrLmhlYWQtPm5leHQ7Ci0KLSAgICAgICAgd2hpbGUgKHApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8veF9ib3VuZHMgPSAodW5zaWduZWQgY2hhciopcC0+YWRkcjsKLSAgICAgICAgICAgIC8vYmFjayB1cCBWUFhfQllURV9BTElHTk1FTlQKLSAgICAgICAgICAgIC8veF9ib3VuZHMgLT0gbWVtdHJhY2sucGFkZGluZ19zaXplOwotCi0gICAgICAgICAgICBpZiAocC0+cGFkZGVkKSAgIC8vIGNhbiB0aGUgYm91bmRzIGJlIGNoZWNrZWQ/Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp5ZXMsIG1vdmUgdG8gdGhlIGFkZHJlc3MgdGhhdCB3YXMgYWN0dWFsbHkgYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgYnkgdGhlIHZweF8qIGNhbGxzKi8KLSAgICAgICAgICAgICAgICB4X2JvdW5kcyA9ICh1bnNpZ25lZCBjaGFyICopKCgoc2l6ZV90ICopcC0+YWRkcilbLTFdKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtZW10cmFjay5wYWRkaW5nX3NpemU7IGkgKz0gc2l6ZW9mKHVuc2lnbmVkIGludCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwX3Nob3dfbWUgPSAoeF9ib3VuZHMgKyBpKTsKLSAgICAgICAgICAgICAgICAgICAgcF9zaG93X21lMiA9ICh1bnNpZ25lZCBjaGFyICopKHAtPmFkZHIgKyBwLT5zaXplICsgaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTUVNX1RSQUNLX01FTUNQWSgmZGVhZDEsIHBfc2hvd19tZSwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotICAgICAgICAgICAgICAgICAgICBNRU1fVFJBQ0tfTUVNQ1BZKCZkZWFkMiwgcF9zaG93X21lMiwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoZGVhZDEgIT0gdGVtcG1lKSB8fCAoZGVhZDIgIT0gdGVtcG1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJcblt2cHhfbWVtIGludGVncml0eSBjaGVjayBmYWlsZWRdOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaW5kZXhbJWQsJWRdIHslczolZH0gYWRkcj0weCV4LCBzaXplPSVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpbGU6ICVzLCBsaW5lOiAlZCBjMDoweCV4IGMxOjB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGksIGZpbGUsIGxpbmUsIHAtPmFkZHIsIHAtPnNpemUsIHAtPmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+bGluZSwgZGVhZDEsIGRlYWQyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICAgIG1lbW9yeV90cmFja2VyX2FkZChzaXplX3QgYWRkciwgdW5zaWduZWQgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyICogZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpCi0gICAgQWRkcyBhbiBhZGRyZXNzIChhZGRyKSwgaXQncyBzaXplLCBmaWxlIGFuZCBsaW5lIG51bWJlciB0byBvdXIgbGlzdC4KLSAgICBBZGp1c3RzIHRoZSB0b3RhbCBieXRlcyBhbGxvY2F0ZWQgYW5kIG1heCBieXRlcyBhbGxvY2F0ZWQgaWYgbmVjZXNzYXJ5LgotICAgIElmIG1lbW9yeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHRoZSBsaXN0IHdpbGwgYmUgZGVzdHJveWVkLgotKi8KLXZvaWQgbWVtb3J5X3RyYWNrZXJfYWRkKHNpemVfdCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRlZCkKLXsKLSAgICBpZiAoIW1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKSkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBtZW1fYmxvY2sgKnA7Ci0KLSAgICAgICAgcCA9IE1FTV9UUkFDS19NQUxMT0Moc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKLQotICAgICAgICBpZiAocCkKLSAgICAgICAgewotICAgICAgICAgICAgcC0+cHJldiAgICAgICA9IG1lbXRyYWNrLnRhaWw7Ci0gICAgICAgICAgICBwLT5wcmV2LT5uZXh0ID0gcDsKLSAgICAgICAgICAgIHAtPmFkZHIgICAgICAgPSBhZGRyOwotICAgICAgICAgICAgcC0+c2l6ZSAgICAgICA9IHNpemU7Ci0gICAgICAgICAgICBwLT5saW5lICAgICAgID0gbGluZTsKLSAgICAgICAgICAgIHAtPmZpbGUgICAgICAgPSBmaWxlOwotICAgICAgICAgICAgcC0+cGFkZGVkICAgICA9IHBhZGRlZDsKLSAgICAgICAgICAgIHAtPm5leHQgICAgICAgPSBOVUxMOwotCi0gICAgICAgICAgICBtZW10cmFjay50YWlsID0gcDsKLQotICAgICAgICAgICAgbWVtdHJhY2suY3VycmVudF9hbGxvY2F0ZWQgKz0gc2l6ZTsKLQotICAgICAgICAgICAgaWYgKG1lbXRyYWNrLmN1cnJlbnRfYWxsb2NhdGVkID4gbWVtdHJhY2subWF4X2FsbG9jYXRlZCkKLSAgICAgICAgICAgICAgICBtZW10cmFjay5tYXhfYWxsb2NhdGVkID0gbWVtdHJhY2suY3VycmVudF9hbGxvY2F0ZWQ7Ci0KLSAgICAgICAgICAgIC8vbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl9hZGQ6IGFkZGVkIGFkZHI9MHglLjh4XG4iLCBhZGRyKTsKLQotICAgICAgICAgICAgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW10cmFja19sb2coIm1lbW9yeV90cmFja2VyX2FkZDogZXJyb3IgYWxsb2NhdGluZyBtZW1vcnkhXG4iKTsKLSAgICAgICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotICAgICAgICAgICAgdnB4X21lbW9yeV90cmFja2VyX2Rlc3Ryb3koKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAgICBtZW1vcnlfdHJhY2tlcl9yZW1vdmUoc2l6ZV90IGFkZHIpCi0gICAgUmVtb3ZlcyBhbiBhZGRyZXNzIGFuZCBpdHMgY29ycmVzcG9uZGluZyBzaXplIChpZiB0aGV5IGV4aXN0KQotICAgIGZyb20gdGhlIG1lbW9yeSB0cmFja2VyIGxpc3QgYW5kIGFkanVzdHMgdGhlIGN1cnJlbnQgbnVtYmVyCi0gICAgb2YgYnl0ZXMgYWxsb2NhdGVkLgotICAgIFJldHVybjoKLSAgICAgIDA6IG9uIHN1Y2Nlc3MKLSAgICAgIC0xOiBpZiB0aGUgbXV0ZXggY291bGQgbm90IGJlIGxvY2tlZAotICAgICAgLTI6IGlmIHRoZSBhZGRyIHdhcyBub3QgZm91bmQgaW4gdGhlIGxpc3QKLSovCi1pbnQgbWVtb3J5X3RyYWNrZXJfcmVtb3ZlKHNpemVfdCBhZGRyKQotewotICAgIGludCByZXQgPSAtMTsKLQotICAgIGlmICghbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleCgpKQotICAgIHsKLSAgICAgICAgc3RydWN0IG1lbV9ibG9jayAqcDsKLQotICAgICAgICBpZiAoKHAgPSBtZW1vcnlfdHJhY2tlcl9maW5kKGFkZHIpKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtdHJhY2suY3VycmVudF9hbGxvY2F0ZWQgLT0gcC0+c2l6ZTsKLQotICAgICAgICAgICAgcC0+cHJldi0+bmV4dCA9IHAtPm5leHQ7Ci0KLSAgICAgICAgICAgIGlmIChwLT5uZXh0KQotICAgICAgICAgICAgICAgIHAtPm5leHQtPnByZXYgPSBwLT5wcmV2OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1lbXRyYWNrLnRhaWwgPSBwLT5wcmV2OwotCi0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgICAgTUVNX1RSQUNLX0ZSRUUocCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYWRkcikKLSAgICAgICAgICAgICAgICBtZW10cmFja19sb2coIm1lbW9yeV90cmFja2VyX3JlbW92ZSgpOiBhZGRyIG5vdCBmb3VuZCBpbiBsaXN0LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAweCUuOHhcbiIsIGFkZHIpOwotCi0gICAgICAgICAgICByZXQgPSAtMjsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gICAgbWVtb3J5X3RyYWNrZXJfZmluZChzaXplX3QgYWRkcikKLSAgICBGaW5kcyBhbiBhZGRyZXNzIGluIG91ciBhZGRycyBsaXN0Ci0gICAgTk9URTogdGhlIG11dGV4IE1VU1QgYmUgbG9ja2VkIGluIHRoZSBvdGhlciBpbnRlcm5hbAotICAgICAgICAgIGZ1bmN0aW9ucyBiZWZvcmUgY2FsbGluZyB0aGlzIG9uZS4gVGhpcyBhdm9pZHMKLSAgICAgICAgICB0aGUgbmVlZCBmb3IgcmVwZWF0ZWQgbG9ja2luZyBhbmQgdW5sb2NraW5nIGFzIGluIFJlbW92ZQotICAgIFJldHVybnM6IHBvaW50ZXIgdG8gdGhlIG1lbSBibG9jayBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UKLSovCi1zdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqbWVtb3J5X3RyYWNrZXJfZmluZChzaXplX3QgYWRkcikKLXsKLSAgICBzdHJ1Y3QgbWVtX2Jsb2NrICpwID0gTlVMTDsKLQotICAgIGlmIChtZW10cmFjay5oZWFkKQotICAgIHsKLSAgICAgICAgcCA9IG1lbXRyYWNrLmhlYWQtPm5leHQ7Ci0KLSAgICAgICAgd2hpbGUgKHAgJiYgKHAtPmFkZHIgIT0gYWRkcikpCi0gICAgICAgICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcDsKLX0KLQotCi0jaWYgIWRlZmluZWQoTk9fTVVURVgpCi0vKgotICAgIG1lbW9yeV90cmFja2VyX2xvY2tfbXV0ZXgoKQotICAgIExvY2tzIHRoZSBtZW1vcnkgdHJhY2tlciBtdXRleCB3aXRoIGEgcGxhdGZvcm0gc3BlY2lmaWMgY2FsbAotICAgIFJldHVybnM6Ci0gICAgICAgIDA6IFN1Y2Nlc3MKLSAgICAgICA8MDogRmFpbHVyZSwgZWl0aGVyIHRoZSBtdXRleCB3YXMgbm90IGluaXRpYWxpemVkCi0gICAgICAgICAgIG9yIHRoZSBjYWxsIHRvIGxvY2sgdGhlIG11dGV4IGZhaWxlZAotKi8KLXN0YXRpYyBpbnQgbWVtb3J5X3RyYWNrZXJfbG9ja19tdXRleCgpCi17Ci0gICAgaW50IHJldCA9IC0xOwotCi0gICAgaWYgKGdfYl9tZW1fdHJhY2tlcl9pbml0ZWQpCi0gICAgewotCi0jaWYgSEFWRV9QVEhSRUFEX0gKLSAgICAgICAgcmV0ID0gcHRocmVhZF9tdXRleF9sb2NrKCZtZW10cmFjay5tdXRleCk7Ci0jZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgICAgIHJldCA9IFdhaXRGb3JTaW5nbGVPYmplY3QobWVtdHJhY2subXV0ZXgsIElORklOSVRFKTsKLSNlbGlmIGRlZmluZWQoVlhXT1JLUykKLSAgICAgICAgcmV0ID0gc2VtX3Rha2UobWVtdHJhY2subXV0ZXgsIFdBSVRfRk9SRVZFUik7Ci0jZWxpZiBkZWZpbmVkKE5EU19OSVRSTykKLSAgICAgICAgb3NfbG9ja19tdXRleCgmbWVtdHJhY2subXV0ZXgpOwotICAgICAgICByZXQgPSAwOwotI2VuZGlmCi0KLSAgICAgICAgaWYgKHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl9sb2NrX211dGV4OiBtdXRleCBsb2NrIGZhaWxlZFxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKgotICAgIG1lbW9yeV90cmFja2VyX3VubG9ja19tdXRleCgpCi0gICAgVW5sb2NrcyB0aGUgbWVtb3J5IHRyYWNrZXIgbXV0ZXggd2l0aCBhIHBsYXRmb3JtIHNwZWNpZmljIGNhbGwKLSAgICBSZXR1cm5zOgotICAgICAgICAwOiBTdWNjZXNzCi0gICAgICAgPDA6IEZhaWx1cmUsIGVpdGhlciB0aGUgbXV0ZXggd2FzIG5vdCBpbml0aWFsaXplZAotICAgICAgICAgICBvciB0aGUgY2FsbCB0byB1bmxvY2sgdGhlIG11dGV4IGZhaWxlZAotKi8KLXN0YXRpYyBpbnQgbWVtb3J5X3RyYWNrZXJfdW5sb2NrX211dGV4KCkKLXsKLSAgICBpbnQgcmV0ID0gLTE7Ci0KLSAgICBpZiAoZ19iX21lbV90cmFja2VyX2luaXRlZCkKLSAgICB7Ci0KLSNpZiBIQVZFX1BUSFJFQURfSAotICAgICAgICByZXQgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbWVtdHJhY2subXV0ZXgpOwotI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQotICAgICAgICByZXQgPSAhUmVsZWFzZU11dGV4KG1lbXRyYWNrLm11dGV4KTsKLSNlbGlmIGRlZmluZWQoVlhXT1JLUykKLSAgICAgICAgcmV0ID0gc2VtX2dpdmUobWVtdHJhY2subXV0ZXgpOwotI2VsaWYgZGVmaW5lZChORFNfTklUUk8pCi0gICAgICAgIG9zX3VubG9ja19tdXRleCgmbWVtdHJhY2subXV0ZXgpOwotICAgICAgICByZXQgPSAwOwotI2VuZGlmCi0KLSAgICAgICAgaWYgKHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtdHJhY2tfbG9nKCJtZW1vcnlfdHJhY2tlcl91bmxvY2tfbXV0ZXg6IG11dGV4IHVubG9jayBmYWlsZWRcbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0vKgotICAgIHZweF9tZW1vcnlfdHJhY2tlcl9zZXRfZnVuY3Rpb25zCi0KLSAgICBTZXRzIHRoZSBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zLgotCi0gICAgUmV0dXJuOgotICAgICAgMDogb24gc3VjY2VzcwotICAgICAgLTE6IGlmIHRoZSB1c2UgZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIGlzIG5vdCBzZXQuCi0qLwotaW50IHZweF9tZW1vcnlfdHJhY2tlcl9zZXRfZnVuY3Rpb25zKG1lbV90cmFja19tYWxsb2NfZnVuYyBnX21hbGxvY19sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtZW1fdHJhY2tfY2FsbG9jX2Z1bmMgZ19jYWxsb2NfbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWVtX3RyYWNrX3JlYWxsb2NfZnVuYyBnX3JlYWxsb2NfbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWVtX3RyYWNrX2ZyZWVfZnVuYyBnX2ZyZWVfbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWVtX3RyYWNrX21lbWNweV9mdW5jIGdfbWVtY3B5X2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1lbV90cmFja19tZW1zZXRfZnVuYyBnX21lbXNldF9sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtZW1fdHJhY2tfbWVtbW92ZV9mdW5jIGdfbWVtbW92ZV9sKQotewotI2lmIFVTRV9HTE9CQUxfRlVOQ1RJT05fUE9JTlRFUlMKLQotICAgIGlmIChnX21hbGxvY19sKQotICAgICAgICBnX21hbGxvYyA9IGdfbWFsbG9jX2w7Ci0KLSAgICBpZiAoZ19jYWxsb2NfbCkKLSAgICAgICAgZ19jYWxsb2MgPSBnX2NhbGxvY19sOwotCi0gICAgaWYgKGdfcmVhbGxvY19sKQotICAgICAgICBnX3JlYWxsb2MgPSBnX3JlYWxsb2NfbDsKLQotICAgIGlmIChnX2ZyZWVfbCkKLSAgICAgICAgZ19mcmVlID0gZ19mcmVlX2w7Ci0KLSAgICBpZiAoZ19tZW1jcHlfbCkKLSAgICAgICAgZ19tZW1jcHkgPSBnX21lbWNweV9sOwotCi0gICAgaWYgKGdfbWVtc2V0X2wpCi0gICAgICAgIGdfbWVtc2V0ID0gZ19tZW1zZXRfbDsKLQotICAgIGlmIChnX21lbW1vdmVfbCkKLSAgICAgICAgZ19tZW1tb3ZlID0gZ19tZW1tb3ZlX2w7Ci0KLSAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgKHZvaWQpZ19tYWxsb2NfbDsKLSAgICAodm9pZClnX2NhbGxvY19sOwotICAgICh2b2lkKWdfcmVhbGxvY19sOwotICAgICh2b2lkKWdfZnJlZV9sOwotICAgICh2b2lkKWdfbWVtY3B5X2w7Ci0gICAgKHZvaWQpZ19tZW1zZXRfbDsKLSAgICAodm9pZClnX21lbW1vdmVfbDsKLSAgICByZXR1cm4gLTE7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZweF9wb3J0cy9hcm0uaCBiL3ZweF9wb3J0cy9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhZjFmMS4uMDAwMDAwMAotLS0gYS92cHhfcG9ydHMvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBWUFhfUE9SVFNfQVJNX0gKLSNkZWZpbmUgVlBYX1BPUlRTX0FSTV9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qQVJNdjVURSAiRW5oYW5jZWQgRFNQIiBpbnN0cnVjdGlvbnMuKi8KLSNkZWZpbmUgSEFTX0VEU1AgIDB4MDEKLS8qQVJNdjYgIlBhcmFsbGVsIiBvciAiTWVkaWEiIGluc3RydWN0aW9ucy4qLwotI2RlZmluZSBIQVNfTUVESUEgMHgwMgotLypBUk12NyBvcHRpb25hbCBORU9OIGluc3RydWN0aW9ucy4qLwotI2RlZmluZSBIQVNfTkVPTiAgMHgwNAotCi1pbnQgYXJtX2NwdV9jYXBzKHZvaWQpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvdnB4X3BvcnRzL2FybV9jcHVkZXRlY3QuYyBiL3ZweF9wb3J0cy9hcm1fY3B1ZGV0ZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDk5MjQuLjAwMDAwMDAKLS0tIGEvdnB4X3BvcnRzL2FybV9jcHVkZXRlY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJhcm0uaCIKLQotc3RhdGljIGludCBhcm1fY3B1X2Vudl9mbGFncyhpbnQgKmZsYWdzKQotewotICAgIGNoYXIgKmVudjsKLSAgICBlbnYgPSBnZXRlbnYoIlZQWF9TSU1EX0NBUFMiKTsKLSAgICBpZiAoZW52ICYmICplbnYpCi0gICAgewotICAgICAgICAqZmxhZ3MgPSAoaW50KXN0cnRvbChlbnYsIE5VTEwsIDApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgKmZsYWdzID0gMDsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgYXJtX2NwdV9lbnZfbWFzayh2b2lkKQotewotICAgIGNoYXIgKmVudjsKLSAgICBlbnYgPSBnZXRlbnYoIlZQWF9TSU1EX0NBUFNfTUFTSyIpOwotICAgIHJldHVybiBlbnYgJiYgKmVudiA/IChpbnQpc3RydG9sKGVudiwgTlVMTCwgMCkgOiB+MDsKLX0KLQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLS8qRm9yIEdldEV4Y2VwdGlvbkNvZGUoKSBhbmQgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04uKi8KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBXSU4zMl9FWFRSQV9MRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1pbnQgYXJtX2NwdV9jYXBzKHZvaWQpCi17Ci0gICAgaW50IGZsYWdzOwotICAgIGludCBtYXNrOwotICAgIGlmICghYXJtX2NwdV9lbnZfZmxhZ3MoJmZsYWdzKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmbGFnczsKLSAgICB9Ci0gICAgbWFzayA9IGFybV9jcHVfZW52X21hc2soKTsKLSAgICAvKiBNU1ZDIGhhcyBubyBpbmxpbmUgX19hc20gc3VwcG9ydCBmb3IgQVJNLCBidXQgaXQgZG9lcyBsZXQgeW91IF9fZW1pdAotICAgICAqICBpbnN0cnVjdGlvbnMgdmlhIHRoZWlyIGFzc2VtYmxlZCBoZXggY29kZS4KLSAgICAgKiBBbGwgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBlc3NlbnRpYWxseSBub3BzLgotICAgICAqLwotI2lmIGRlZmluZWQoSEFWRV9BUk1WNVRFKQotICAgIGlmIChtYXNrICYgSEFTX0VEU1ApCi0gICAgewotICAgICAgICBfX3RyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlBMRCBbcjEzXSovCi0gICAgICAgICAgICBfX2VtaXQoMHhGNURERjAwMCk7Ci0gICAgICAgICAgICBmbGFncyB8PSBIQVNfRURTUDsKLSAgICAgICAgfQotICAgICAgICBfX2V4Y2VwdChHZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qSWdub3JlIGV4Y2VwdGlvbi4qLwotICAgICAgICB9Ci0gICAgfQotI2lmIGRlZmluZWQoSEFWRV9BUk1WNikKLSAgICBpZiAobWFzayAmIEhBU19NRURJQSkKLSAgICAgICAgX190cnkKLSAgICAgICAgewotICAgICAgICAgICAgLypTSEFERDggcjMscjMscjMqLwotICAgICAgICAgICAgX19lbWl0KDB4RTYzMzNGOTMpOwotICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX01FRElBOwotICAgICAgICB9Ci0gICAgICAgIF9fZXhjZXB0KEdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTikKLSAgICAgICAgewotICAgICAgICAgICAgLypJZ25vcmUgZXhjZXB0aW9uLiovCi0gICAgICAgIH0KLSAgICB9Ci0jaWYgZGVmaW5lZChIQVZFX0FSTVY3KQotICAgIGlmIChtYXNrICYgSEFTX05FT04pCi0gICAgewotICAgICAgICBfX3RyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlZPUlIgcTAscTAscTAqLwotICAgICAgICAgICAgX19lbWl0KDB4RjIyMDAxNTApOwotICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX05FT047Ci0gICAgICAgIH0KLSAgICAgICAgX19leGNlcHQoR2V0RXhjZXB0aW9uQ29kZSgpID09IEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKklnbm9yZSBleGNlcHRpb24uKi8KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSAgICByZXR1cm4gZmxhZ3MgJiBtYXNrOwotfQotCi0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgYXJtX2NwdV9jYXBzKHZvaWQpCi17Ci0gICAgRklMRSAqZmluOwotICAgIGludCBmbGFnczsKLSAgICBpbnQgbWFzazsKLSAgICBpZiAoIWFybV9jcHVfZW52X2ZsYWdzKCZmbGFncykpCi0gICAgewotICAgICAgICByZXR1cm4gZmxhZ3M7Ci0gICAgfQotICAgIG1hc2sgPSBhcm1fY3B1X2Vudl9tYXNrKCk7Ci0gICAgLyogUmVhZGluZyAvcHJvYy9zZWxmL2F1eHYgd291bGQgYmUgZWFzaWVyLCBidXQgdGhhdCBkb2Vzbid0IHdvcmsgcmVsaWFibHkKLSAgICAgKiAgb24gQW5kcm9pZC4KLSAgICAgKiBUaGlzIGFsc28gbWVhbnMgdGhhdCBkZXRlY3Rpb24gd2lsbCBmYWlsIGluIFNjcmF0Y2hib3guCi0gICAgICovCi0gICAgZmluID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCJyIik7Ci0gICAgaWYoZmluICE9IE5VTEwpCi0gICAgewotICAgICAgICAvKiA1MTIgc2hvdWxkIGJlIGVub3VnaCBmb3IgYW55Ym9keSAoaXQncyBldmVuIGVub3VnaCBmb3IgYWxsIHRoZSBmbGFncwotICAgICAgICAgKiB0aGF0IHg4NiBoYXMgYWNjdW11bGF0ZWQuLi4gc28gZmFyKS4KLSAgICAgICAgICovCi0gICAgICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgICAgIHdoaWxlIChmZ2V0cyhidWYsIDUxMSwgZmluKSAhPSBOVUxMKQotICAgICAgICB7Ci0jaWYgZGVmaW5lZChIQVZFX0FSTVY1VEUpIHx8IGRlZmluZWQoSEFWRV9BUk1WNykKLSAgICAgICAgICAgIGlmIChtZW1jbXAoYnVmLCAiRmVhdHVyZXMiLCA4KSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgKnA7Ci0jaWYgZGVmaW5lZChIQVZFX0FSTVY1VEUpCi0gICAgICAgICAgICAgICAgcD1zdHJzdHIoYnVmLCAiIGVkc3AiKTsKLSAgICAgICAgICAgICAgICBpZiAocCAhPSBOVUxMICYmIChwWzVdID09ICcgJyB8fCBwWzVdID09ICdcbicpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX0VEU1A7Ci0gICAgICAgICAgICAgICAgfQotI2lmIGRlZmluZWQoSEFWRV9BUk1WNykKLSAgICAgICAgICAgICAgICBwID0gc3Ryc3RyKGJ1ZiwgIiBuZW9uIik7Ci0gICAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCAmJiAocFs1XSA9PSAnICcgfHwgcFs1XSA9PSAnXG4nKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEhBU19ORU9OOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotI2VuZGlmCi0gICAgICAgICAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEhBVkVfQVJNVjYpCi0gICAgICAgICAgICBpZiAobWVtY21wKGJ1ZiwgIkNQVSBhcmNoaXRlY3R1cmU6IiwxNykgPT0gMCl7Ci0gICAgICAgICAgICAgICAgaW50IHZlcnNpb247Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IGF0b2koYnVmKzE3KTsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA+PSA2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSEFTX01FRElBOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShmaW4pOwotICAgIH0KLSAgICByZXR1cm4gZmxhZ3MgJiBtYXNrOwotfQotCi0jZWxpZiAhQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotCi1pbnQgYXJtX2NwdV9jYXBzKHZvaWQpCi17Ci0gICAgaW50IGZsYWdzOwotICAgIGludCBtYXNrOwotICAgIGlmICghYXJtX2NwdV9lbnZfZmxhZ3MoJmZsYWdzKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmbGFnczsKLSAgICB9Ci0gICAgbWFzayA9IGFybV9jcHVfZW52X21hc2soKTsKLSNpZiBkZWZpbmVkKEhBVkVfQVJNVjVURSkKLSAgICBmbGFncyB8PSBIQVNfRURTUDsKLSNlbmRpZgotI2lmIGRlZmluZWQoSEFWRV9BUk1WNikKLSAgICBmbGFncyB8PSBIQVNfTUVESUE7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEhBVkVfQVJNVjcpCi0gICAgZmxhZ3MgfD0gSEFTX05FT047Ci0jZW5kaWYKLSAgICByZXR1cm4gZmxhZ3MgJiBtYXNrOwotfQotCi0jZWxzZQotI2Vycm9yICItLWVuYWJsZS1ydW50aW1lLWNwdS1kZXRlY3Qgc2VsZWN0ZWQsIGJ1dCBubyBDUFUgZGV0ZWN0aW9uIG1ldGhvZCAiIFwKLSAiYXZhaWxhYmxlIGZvciB5b3VyIHBsYXRmb3JtLiBSZWNvbmZpZ3VyZSB3aXRob3V0IC0tZW5hYmxlLXJ1bnRpbWUtY3B1LWRldGVjdC4iCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweF9wb3J0cy9jb25maWcuaCBiL3ZweF9wb3J0cy9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiZTcwZC4uMDAwMDAwMAotLS0gYS92cHhfcG9ydHMvY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvdnB4X3BvcnRzL2VtbXMuYXNtIGIvdnB4X3BvcnRzL2VtbXMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDZlMjM1Li4wMDAwMDAwCi0tLSBhL3ZweF9wb3J0cy9lbW1zLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSVpbmNsdWRlICJ2cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbSIKLQotc2VjdGlvbiAudGV4dAotICAgIGdsb2JhbCBzeW0odnB4X3Jlc2V0X21teF9zdGF0ZSkKLXN5bSh2cHhfcmVzZXRfbW14X3N0YXRlKToKLSAgICBlbW1zCi0gICAgcmV0Ci0KLQotJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAotZ2xvYmFsIHN5bSh2cHhfd2lueDY0X2ZsZGN3KQotc3ltKHZweF93aW54NjRfZmxkY3cpOgotICAgIHN1YiAgIHJzcCwgOAotICAgIG1vdiAgIFtyc3BdLCByY3ggOyB3aW4geDY0IHNwZWNpZmljCi0gICAgZmxkY3cgW3JzcF0KLSAgICBhZGQgICByc3AsIDgKLSAgICByZXQKLQotCi1nbG9iYWwgc3ltKHZweF93aW54NjRfZnN0Y3cpCi1zeW0odnB4X3dpbng2NF9mc3Rjdyk6Ci0gICAgc3ViICAgcnNwLCA4Ci0gICAgZnN0Y3cgW3JzcF0KLSAgICBtb3YgICByYXgsIFtyc3BdCi0gICAgYWRkICAgcnNwLCA4Ci0gICAgcmV0Ci0lZW5kaWYKZGlmZiAtLWdpdCBhL3ZweF9wb3J0cy9tZW0uaCBiL3ZweF9wb3J0cy9tZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjMzRmZS4uMDAwMDAwMAotLS0gYS92cHhfcG9ydHMvbWVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBWUFhfUE9SVFNfTUVNX0gKLSNkZWZpbmUgVlBYX1BPUlRTX01FTV9ICi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgotI2luY2x1ZGUgInZweC92cHhfaW50ZWdlci5oIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18KLSNkZWZpbmUgREVDTEFSRV9BTElHTkVEKG4sdHlwLHZhbCkgIHR5cCB2YWwgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKG4pKSkKLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0jZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHR5cCx2YWwpICBfX2RlY2xzcGVjKGFsaWduKG4pKSB0eXAgdmFsCi0jZWxzZQotI3dhcm5pbmcgTm8gYWxpZ25tZW50IGRpcmVjdGl2ZXMga25vd24gZm9yIHRoaXMgY29tcGlsZXIuCi0jZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHR5cCx2YWwpICB0eXAgdmFsCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIERlY2xhcmUgYW4gYWxpZ25lZCBhcnJheSBvbiB0aGUgc3RhY2ssIGZvciBzaXR1YXRpb25zIHdoZXJlIHRoZSBzdGFjawotICogcG9pbnRlciBtYXkgbm90IGhhdmUgdGhlIGFsaWdubWVudCB3ZSBleHBlY3QuIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhCi0gKiBtb2RpZmllZCBuYW1lLCB0aGVuIGRlZmluZXMgdmFsIHRvIGJlIGEgcG9pbnRlciwgYW5kIGFsaWducyB0aGF0IHBvaW50ZXIKLSAqIHdpdGhpbiB0aGUgYXJyYXkuCi0gKi8KLSNkZWZpbmUgREVDTEFSRV9BTElHTkVEX0FSUkFZKGEsdHlwLHZhbCxuKVwKLXR5cCB2YWwjI19bKG4pKyhhKS9zaXplb2YodHlwKSsxXTtcCi10eXAgKnZhbCA9ICh0eXAqKSgoKChpbnRwdHJfdCl2YWwjI18pKyhhKS0xKSYoKGludHB0cl90KS0oYSkpKQotCi0KLS8qIEluZGljYXRlcyB0aGF0IHRoZSB1c2FnZSBvZiB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlIGhhcyBiZWVuIGF1ZGl0ZWQgdG8gYXNzdXJlCi0gKiB0aGF0IGl0J3Mgc2FmZSB0byB1c2UgdW5pbml0aWFsaXplZC4gU2lsZW5jZXMgJ21heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQnCi0gKiB3YXJuaW5ncyBvbiBnY2MuCi0gKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXwotI2RlZmluZSBVTklOSVRJQUxJWkVEX0lTX1NBRkUoeCkgeD14Ci0jZWxzZQotI2RlZmluZSBVTklOSVRJQUxJWkVEX0lTX1NBRkUoeCkgeAotI2VuZGlmCmRpZmYgLS1naXQgYS92cHhfcG9ydHMvbWVtX29wcy5oIGIvdnB4X3BvcnRzL21lbV9vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MjM2OC4uMDAwMDAwMAotLS0gYS92cHhfcG9ydHMvbWVtX29wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiBcZmlsZQotICogXGJyaWVmIFByb3ZpZGVzIHBvcnRhYmxlIG1lbW9yeSBhY2Nlc3MgcHJpbWl0aXZlcwotICoKLSAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgcG9ydGFibGUgcHJpbWl0aXZlcyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyBvZgotICogc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBpbiAxNiwgMjQsIGFuZCAzMiBiaXQgc2l6ZXMuIFRoZSBvcGVyYXRpb25zCi0gKiBjYW4gYmUgcGVyZm9ybWVkIG9uIHVuYWxpZ25lZCBkYXRhIHJlZ2FyZGxlc3Mgb2YgaGFyZHdhcmUgc3VwcG9ydCBmb3IKLSAqIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KLSAqCi0gKiBUaGUgdHlwZSB1c2VkIHRvIHBhc3MgdGhlIGludGVncmFsIHZhbHVlcyBtYXkgYmUgY2hhbmdlZCBieSBkZWZpbmluZwotICogTUVNX1ZBTFVFX1Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gVGhlIHR5cGUgZ2l2ZW4gbXVzdCBiZSBhbiBpbnRlZ3JhbAotICogbnVtZXJpYyB0eXBlLgotICoKLSAqIFRoZSBhY3R1YWwgZnVuY3Rpb25zIGluc3RhbnRpYXRlZCBoYXZlIHRoZSBNRU1fVkFMVUVfVCB0eXBlIG5hbWUgcGFzdGVkCi0gKiBvbiB0byB0aGUgc3ltYm9sIG5hbWUuIFRoaXMgYWxsb3dzIHRoZSBkZXZlbG9wZXIgdG8gaW5zdGFudGlhdGUgdGhlc2UKLSAqIG9wZXJhdGlvbnMgZm9yIG11bHRpcGxlIHR5cGVzIHdpdGhpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LiBUaGlzIGlzCi0gKiBvZiBzb21ld2hhdCBxdWVzdGlvbmFibGUgdXRpbGl0eSwgYnV0IHRoZSBjYXBhYmlsaXR5IGV4aXN0cyBub25ldGhlbGVzcy4KLSAqIFVzZXJzIG5vdCBtYWtpbmcgdXNlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgY2FsbCB0aGUgZnVuY3Rpb25zCi0gKiB3aXRob3V0IHRoZSB0eXBlIG5hbWUgYXBwZW5kZWQsIGFuZCB0aGUgcHJlcHJvY2Vzc29yIHdpbGwgdGFrZSBjYXJlIG9mCi0gKiBpdC4KLSAqCi0gKiBOT1RFOiBUaGlzIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBvbiBwbGF0Zm9ybXMgd2hlcmUgY2hhciA+IDEgb2N0ZXQgQVRNLgotICovCi0KLSNpZm5kZWYgTUFVX1QKLS8qIE1pbmltdW0gQWNjZXNzIFVuaXQgZm9yIHRoaXMgdGFyZ2V0ICovCi0jZGVmaW5lIE1BVV9UIHVuc2lnbmVkIGNoYXIKLSNlbmRpZgotCi0jaWZuZGVmIE1FTV9WQUxVRV9UCi0jZGVmaW5lIE1FTV9WQUxVRV9UIGludAotI2VuZGlmCi0KLSN1bmRlZiBNRU1fVkFMVUVfVF9TWl9CSVRTCi0jZGVmaW5lIE1FTV9WQUxVRV9UX1NaX0JJVFMgKHNpemVvZihNRU1fVkFMVUVfVCkgPDwgMykKLQotI3VuZGVmICBtZW1fb3BzX3dyYXBfc3ltYm9sCi0jZGVmaW5lIG1lbV9vcHNfd3JhcF9zeW1ib2woZm4pIG1lbV9vcHNfd3JhcF9zeW1ib2wyKGZuLCBNRU1fVkFMVUVfVCkKLSN1bmRlZiAgbWVtX29wc193cmFwX3N5bWJvbDIKLSNkZWZpbmUgbWVtX29wc193cmFwX3N5bWJvbDIoZm4sdHlwKSBtZW1fb3BzX3dyYXBfc3ltYm9sMyhmbix0eXApCi0jdW5kZWYgIG1lbV9vcHNfd3JhcF9zeW1ib2wzCi0jZGVmaW5lIG1lbV9vcHNfd3JhcF9zeW1ib2wzKGZuLHR5cCkgZm4jI19hc18jI3R5cAotCi0vKgotICogSW5jbHVkZSBhbGlnbmVkIGFjY2VzcyByb3V0aW5lcwotICovCi0jZGVmaW5lIElOQ0xVREVEX0JZX01FTV9PUFNfSAotI2luY2x1ZGUgIm1lbV9vcHNfYWxpZ25lZC5oIgotI3VuZGVmICBJTkNMVURFRF9CWV9NRU1fT1BTX0gKLQotI3VuZGVmICBtZW1fZ2V0X2JlMTYKLSNkZWZpbmUgbWVtX2dldF9iZTE2IG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9iZTE2KQotc3RhdGljIHVuc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfYmUxNihjb25zdCB2b2lkICp2bWVtKQotewotICAgIHVuc2lnbmVkIE1FTV9WQUxVRV9UICB2YWw7Ci0gICAgY29uc3QgTUFVX1QgICAgICAgICAgKm1lbSA9IChjb25zdCBNQVVfVCAqKXZtZW07Ci0KLSAgICB2YWwgPSBtZW1bMF0gPDwgODsKLSAgICB2YWwgfD0gbWVtWzFdOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLSN1bmRlZiAgbWVtX2dldF9iZTI0Ci0jZGVmaW5lIG1lbV9nZXRfYmUyNCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfYmUyNCkKLXN0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2JlMjQoY29uc3Qgdm9pZCAqdm1lbSkKLXsKLSAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOwotICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOwotCi0gICAgdmFsID0gbWVtWzBdIDw8IDE2OwotICAgIHZhbCB8PSBtZW1bMV0gPDwgODsKLSAgICB2YWwgfD0gbWVtWzJdOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLSN1bmRlZiAgbWVtX2dldF9iZTMyCi0jZGVmaW5lIG1lbV9nZXRfYmUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfYmUzMikKLXN0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2JlMzIoY29uc3Qgdm9pZCAqdm1lbSkKLXsKLSAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOwotICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOwotCi0gICAgdmFsID0gbWVtWzBdIDw8IDI0OwotICAgIHZhbCB8PSBtZW1bMV0gPDwgMTY7Ci0gICAgdmFsIHw9IG1lbVsyXSA8PCA4OwotICAgIHZhbCB8PSBtZW1bM107Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotI3VuZGVmICBtZW1fZ2V0X2xlMTYKLSNkZWZpbmUgbWVtX2dldF9sZTE2IG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9sZTE2KQotc3RhdGljIHVuc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfbGUxNihjb25zdCB2b2lkICp2bWVtKQotewotICAgIHVuc2lnbmVkIE1FTV9WQUxVRV9UICB2YWw7Ci0gICAgY29uc3QgTUFVX1QgICAgICAgICAgKm1lbSA9IChjb25zdCBNQVVfVCAqKXZtZW07Ci0KLSAgICB2YWwgPSBtZW1bMV0gPDwgODsKLSAgICB2YWwgfD0gbWVtWzBdOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLSN1bmRlZiAgbWVtX2dldF9sZTI0Ci0jZGVmaW5lIG1lbV9nZXRfbGUyNCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfbGUyNCkKLXN0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2xlMjQoY29uc3Qgdm9pZCAqdm1lbSkKLXsKLSAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOwotICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOwotCi0gICAgdmFsID0gbWVtWzJdIDw8IDE2OwotICAgIHZhbCB8PSBtZW1bMV0gPDwgODsKLSAgICB2YWwgfD0gbWVtWzBdOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLSN1bmRlZiAgbWVtX2dldF9sZTMyCi0jZGVmaW5lIG1lbV9nZXRfbGUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfbGUzMikKLXN0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X2xlMzIoY29uc3Qgdm9pZCAqdm1lbSkKLXsKLSAgICB1bnNpZ25lZCBNRU1fVkFMVUVfVCAgdmFsOwotICAgIGNvbnN0IE1BVV9UICAgICAgICAgICptZW0gPSAoY29uc3QgTUFVX1QgKil2bWVtOwotCi0gICAgdmFsID0gbWVtWzNdIDw8IDI0OwotICAgIHZhbCB8PSBtZW1bMl0gPDwgMTY7Ci0gICAgdmFsIHw9IG1lbVsxXSA8PCA4OwotICAgIHZhbCB8PSBtZW1bMF07Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotI2RlZmluZSBtZW1fZ2V0X3NfZ2VuZXJpYyhlbmQsc3opIFwKLSAgICBzdGF0aWMgc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfcyMjZW5kIyNzeihjb25zdCB2b2lkICp2bWVtKSB7XAotICAgICAgICBjb25zdCBNQVVfVCAqbWVtID0gKGNvbnN0IE1BVV9UKil2bWVtO1wKLSAgICAgICAgc2lnbmVkIE1FTV9WQUxVRV9UIHZhbCA9IG1lbV9nZXRfIyNlbmQjI3N6KG1lbSk7XAotICAgICAgICByZXR1cm4gKHZhbCA8PCAoTUVNX1ZBTFVFX1RfU1pfQklUUyAtIHN6KSkgPj4gKE1FTV9WQUxVRV9UX1NaX0JJVFMgLSBzeik7XAotICAgIH0KLQotI3VuZGVmICBtZW1fZ2V0X3NiZTE2Ci0jZGVmaW5lIG1lbV9nZXRfc2JlMTYgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NiZTE2KQotbWVtX2dldF9zX2dlbmVyaWMoYmUsIDE2KTsKLQotI3VuZGVmICBtZW1fZ2V0X3NiZTI0Ci0jZGVmaW5lIG1lbV9nZXRfc2JlMjQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NiZTI0KQotbWVtX2dldF9zX2dlbmVyaWMoYmUsIDI0KTsKLQotI3VuZGVmICBtZW1fZ2V0X3NiZTMyCi0jZGVmaW5lIG1lbV9nZXRfc2JlMzIgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NiZTMyKQotbWVtX2dldF9zX2dlbmVyaWMoYmUsIDMyKTsKLQotI3VuZGVmICBtZW1fZ2V0X3NsZTE2Ci0jZGVmaW5lIG1lbV9nZXRfc2xlMTYgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTE2KQotbWVtX2dldF9zX2dlbmVyaWMobGUsIDE2KTsKLQotI3VuZGVmICBtZW1fZ2V0X3NsZTI0Ci0jZGVmaW5lIG1lbV9nZXRfc2xlMjQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTI0KQotbWVtX2dldF9zX2dlbmVyaWMobGUsIDI0KTsKLQotI3VuZGVmICBtZW1fZ2V0X3NsZTMyCi0jZGVmaW5lIG1lbV9nZXRfc2xlMzIgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTMyKQotbWVtX2dldF9zX2dlbmVyaWMobGUsIDMyKTsKLQotI3VuZGVmICBtZW1fcHV0X2JlMTYKLSNkZWZpbmUgbWVtX3B1dF9iZTE2IG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX3B1dF9iZTE2KQotc3RhdGljIHZvaWQgbWVtX3B1dF9iZTE2KHZvaWQgKnZtZW0sIE1FTV9WQUxVRV9UIHZhbCkKLXsKLSAgICBNQVVfVCAqbWVtID0gKE1BVV9UICopdm1lbTsKLQotICAgIG1lbVswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotICAgIG1lbVsxXSA9ICh2YWwgPj4gMCkgJiAweGZmOwotfQotCi0jdW5kZWYgIG1lbV9wdXRfYmUyNAotI2RlZmluZSBtZW1fcHV0X2JlMjQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fcHV0X2JlMjQpCi1zdGF0aWMgdm9pZCBtZW1fcHV0X2JlMjQodm9pZCAqdm1lbSwgTUVNX1ZBTFVFX1QgdmFsKQotewotICAgIE1BVV9UICptZW0gPSAoTUFVX1QgKil2bWVtOwotCi0gICAgbWVtWzBdID0gKHZhbCA+PiAxNikgJiAweGZmOwotICAgIG1lbVsxXSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLSAgICBtZW1bMl0gPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci19Ci0KLSN1bmRlZiAgbWVtX3B1dF9iZTMyCi0jZGVmaW5lIG1lbV9wdXRfYmUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfYmUzMikKLXN0YXRpYyB2b2lkIG1lbV9wdXRfYmUzMih2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpCi17Ci0gICAgTUFVX1QgKm1lbSA9IChNQVVfVCAqKXZtZW07Ci0KLSAgICBtZW1bMF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7Ci0gICAgbWVtWzFdID0gKHZhbCA+PiAxNikgJiAweGZmOwotICAgIG1lbVsyXSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLSAgICBtZW1bM10gPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci19Ci0KLSN1bmRlZiAgbWVtX3B1dF9sZTE2Ci0jZGVmaW5lIG1lbV9wdXRfbGUxNiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfbGUxNikKLXN0YXRpYyB2b2lkIG1lbV9wdXRfbGUxNih2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpCi17Ci0gICAgTUFVX1QgKm1lbSA9IChNQVVfVCAqKXZtZW07Ci0KLSAgICBtZW1bMF0gPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci0gICAgbWVtWzFdID0gKHZhbCA+PiAgOCkgJiAweGZmOwotfQotCi0jdW5kZWYgIG1lbV9wdXRfbGUyNAotI2RlZmluZSBtZW1fcHV0X2xlMjQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fcHV0X2xlMjQpCi1zdGF0aWMgdm9pZCBtZW1fcHV0X2xlMjQodm9pZCAqdm1lbSwgTUVNX1ZBTFVFX1QgdmFsKQotewotICAgIE1BVV9UICptZW0gPSAoTUFVX1QgKil2bWVtOwotCi0gICAgbWVtWzBdID0gKHZhbCA+PiAgMCkgJiAweGZmOwotICAgIG1lbVsxXSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLSAgICBtZW1bMl0gPSAodmFsID4+IDE2KSAmIDB4ZmY7Ci19Ci0KLSN1bmRlZiAgbWVtX3B1dF9sZTMyCi0jZGVmaW5lIG1lbV9wdXRfbGUzMiBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfbGUzMikKLXN0YXRpYyB2b2lkIG1lbV9wdXRfbGUzMih2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpCi17Ci0gICAgTUFVX1QgKm1lbSA9IChNQVVfVCAqKXZtZW07Ci0KLSAgICBtZW1bMF0gPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci0gICAgbWVtWzFdID0gKHZhbCA+PiAgOCkgJiAweGZmOwotICAgIG1lbVsyXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKLSAgICBtZW1bM10gPSAodmFsID4+IDI0KSAmIDB4ZmY7Ci19CmRpZmYgLS1naXQgYS92cHhfcG9ydHMvbWVtX29wc19hbGlnbmVkLmggYi92cHhfcG9ydHMvbWVtX29wc19hbGlnbmVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTE4YjIuLjAwMDAwMDAKLS0tIGEvdnB4X3BvcnRzL21lbV9vcHNfYWxpZ25lZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiBcZmlsZQotICogXGJyaWVmIFByb3ZpZGVzIHBvcnRhYmxlIG1lbW9yeSBhY2Nlc3MgcHJpbWl0aXZlcyBmb3Igb3BlcmF0aW5nIG9uIGFsaWduZWQKLSAqICAgICAgICBkYXRhCi0gKgotICogVGhpcyBmaWxlIGlzIHNwbGl0IGZyb20gbWVtX29wcy5oIGZvciBlYXNpZXIgbWFpbnRlbmFuY2UuIFNlZSBtZW1fb3BzLmgKLSAqIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlc2UgcHJpbWl0aXZlcy4KLSAqLwotI2lmbmRlZiBJTkNMVURFRF9CWV9NRU1fT1BTX0gKLSNlcnJvciBJbmNsdWRlIG1lbV9vcHMuaCwgbm90IG1lbV9vcHNfYWxpZ25lZC5oIGRpcmVjdGx5LgotI2VuZGlmCi0KLS8qIEFyY2hpdGVjdHVyZXMgdGhhdCBwcm92aWRlIGluc3RydWN0aW9ucyBmb3IgZG9pbmcgdGhpcyBieXRlIHN3YXBwaW5nCi0gKiBjb3VsZCByZWRlZmluZSB0aGVzZSBtYWNyb3MuCi0gKi8KLSNkZWZpbmUgc3dhcF9lbmRpYW5fMTYodmFsLHJhdykgZG8ge1wKLSAgICAgICAgdmFsID0gKChyYXc+PjgpICYgMHgwMGZmKSBcCi0gICAgICAgICAgICAgIHwgKChyYXc8PDgpICYgMHhmZjAwKTtcCi0gICAgfSB3aGlsZSgwKQotI2RlZmluZSBzd2FwX2VuZGlhbl8zMih2YWwscmF3KSBkbyB7XAotICAgICAgICB2YWwgPSAoKHJhdz4+MjQpICYgMHgwMDAwMDBmZikgXAotICAgICAgICAgICAgICB8ICgocmF3Pj44KSAgJiAweDAwMDBmZjAwKSBcCi0gICAgICAgICAgICAgIHwgKChyYXc8PDgpICAmIDB4MDBmZjAwMDApIFwKLSAgICAgICAgICAgICAgfCAoKHJhdzw8MjQpICYgMHhmZjAwMDAwMCk7IFwKLSAgICB9IHdoaWxlKDApCi0jZGVmaW5lIHN3YXBfZW5kaWFuXzE2X3NlKHZhbCxyYXcpIGRvIHtcCi0gICAgICAgIHN3YXBfZW5kaWFuXzE2KHZhbCxyYXcpO1wKLSAgICAgICAgdmFsID0gKCh2YWwgPDwgMTYpID4+IDE2KTtcCi0gICAgfSB3aGlsZSgwKQotI2RlZmluZSBzd2FwX2VuZGlhbl8zMl9zZSh2YWwscmF3KSBzd2FwX2VuZGlhbl8zMih2YWwscmF3KQotCi0jZGVmaW5lIG1lbV9nZXRfbmVfYWxpZ25lZF9nZW5lcmljKGVuZCxzeikgXAotICAgIHN0YXRpYyB1bnNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0XyMjZW5kIyNzeiMjX2FsaWduZWQoY29uc3Qgdm9pZCAqdm1lbSkge1wKLSAgICAgICAgY29uc3QgdWludCMjc3ojI190ICptZW0gPSAoY29uc3QgdWludCMjc3ojI190ICopdm1lbTtcCi0gICAgICAgIHJldHVybiAqbWVtO1wKLSAgICB9Ci0KLSNkZWZpbmUgbWVtX2dldF9zbmVfYWxpZ25lZF9nZW5lcmljKGVuZCxzeikgXAotICAgIHN0YXRpYyBzaWduZWQgTUVNX1ZBTFVFX1QgbWVtX2dldF9zIyNlbmQjI3N6IyNfYWxpZ25lZChjb25zdCB2b2lkICp2bWVtKSB7XAotICAgICAgICBjb25zdCBpbnQjI3N6IyNfdCAqbWVtID0gKGNvbnN0IGludCMjc3ojI190ICopdm1lbTtcCi0gICAgICAgIHJldHVybiAqbWVtO1wKLSAgICB9Ci0KLSNkZWZpbmUgbWVtX2dldF9zZV9hbGlnbmVkX2dlbmVyaWMoZW5kLHN6KSBcCi0gICAgc3RhdGljIHVuc2lnbmVkIE1FTV9WQUxVRV9UIG1lbV9nZXRfIyNlbmQjI3N6IyNfYWxpZ25lZChjb25zdCB2b2lkICp2bWVtKSB7XAotICAgICAgICBjb25zdCB1aW50IyNzeiMjX3QgKm1lbSA9IChjb25zdCB1aW50IyNzeiMjX3QgKil2bWVtO1wKLSAgICAgICAgdW5zaWduZWQgTUVNX1ZBTFVFX1QgdmFsLCByYXcgPSAqbWVtO1wKLSAgICAgICAgc3dhcF9lbmRpYW5fIyNzeih2YWwscmF3KTtcCi0gICAgICAgIHJldHVybiB2YWw7XAotICAgIH0KLQotI2RlZmluZSBtZW1fZ2V0X3NzZV9hbGlnbmVkX2dlbmVyaWMoZW5kLHN6KSBcCi0gICAgc3RhdGljIHNpZ25lZCBNRU1fVkFMVUVfVCBtZW1fZ2V0X3MjI2VuZCMjc3ojI19hbGlnbmVkKGNvbnN0IHZvaWQgKnZtZW0pIHtcCi0gICAgICAgIGNvbnN0IGludCMjc3ojI190ICptZW0gPSAoY29uc3QgaW50IyNzeiMjX3QgKil2bWVtO1wKLSAgICAgICAgdW5zaWduZWQgTUVNX1ZBTFVFX1QgdmFsLCByYXcgPSAqbWVtO1wKLSAgICAgICAgc3dhcF9lbmRpYW5fIyNzeiMjX3NlKHZhbCxyYXcpO1wKLSAgICAgICAgcmV0dXJuIHZhbDtcCi0gICAgfQotCi0jZGVmaW5lIG1lbV9wdXRfbmVfYWxpZ25lZF9nZW5lcmljKGVuZCxzeikgXAotICAgIHN0YXRpYyB2b2lkIG1lbV9wdXRfIyNlbmQjI3N6IyNfYWxpZ25lZCh2b2lkICp2bWVtLCBNRU1fVkFMVUVfVCB2YWwpIHtcCi0gICAgICAgIHVpbnQjI3N6IyNfdCAqbWVtID0gKHVpbnQjI3N6IyNfdCAqKXZtZW07XAotICAgICAgICAqbWVtID0gKHVpbnQjI3N6IyNfdCl2YWw7XAotICAgIH0KLQotI2RlZmluZSBtZW1fcHV0X3NlX2FsaWduZWRfZ2VuZXJpYyhlbmQsc3opIFwKLSAgICBzdGF0aWMgdm9pZCBtZW1fcHV0XyMjZW5kIyNzeiMjX2FsaWduZWQodm9pZCAqdm1lbSwgTUVNX1ZBTFVFX1QgdmFsKSB7XAotICAgICAgICB1aW50IyNzeiMjX3QgKm1lbSA9ICh1aW50IyNzeiMjX3QgKil2bWVtLCByYXc7XAotICAgICAgICBzd2FwX2VuZGlhbl8jI3N6KHJhdyx2YWwpO1wKLSAgICAgICAgKm1lbSA9ICh1aW50IyNzeiMjX3QpcmF3O1wKLSAgICB9Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZiBDT05GSUdfQklHX0VORElBTgotI2RlZmluZSBtZW1fZ2V0X2JlX2FsaWduZWRfZ2VuZXJpYyhzeikgIG1lbV9nZXRfbmVfYWxpZ25lZF9nZW5lcmljKGJlLHN6KQotI2RlZmluZSBtZW1fZ2V0X3NiZV9hbGlnbmVkX2dlbmVyaWMoc3opIG1lbV9nZXRfc25lX2FsaWduZWRfZ2VuZXJpYyhiZSxzeikKLSNkZWZpbmUgbWVtX2dldF9sZV9hbGlnbmVkX2dlbmVyaWMoc3opICBtZW1fZ2V0X3NlX2FsaWduZWRfZ2VuZXJpYyhsZSxzeikKLSNkZWZpbmUgbWVtX2dldF9zbGVfYWxpZ25lZF9nZW5lcmljKHN6KSBtZW1fZ2V0X3NzZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCi0jZGVmaW5lIG1lbV9wdXRfYmVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMoYmUsc3opCi0jZGVmaW5lIG1lbV9wdXRfbGVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9zZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCi0jZWxzZQotI2RlZmluZSBtZW1fZ2V0X2JlX2FsaWduZWRfZ2VuZXJpYyhzeikgIG1lbV9nZXRfc2VfYWxpZ25lZF9nZW5lcmljKGJlLHN6KQotI2RlZmluZSBtZW1fZ2V0X3NiZV9hbGlnbmVkX2dlbmVyaWMoc3opIG1lbV9nZXRfc3NlX2FsaWduZWRfZ2VuZXJpYyhiZSxzeikKLSNkZWZpbmUgbWVtX2dldF9sZV9hbGlnbmVkX2dlbmVyaWMoc3opICBtZW1fZ2V0X25lX2FsaWduZWRfZ2VuZXJpYyhsZSxzeikKLSNkZWZpbmUgbWVtX2dldF9zbGVfYWxpZ25lZF9nZW5lcmljKHN6KSBtZW1fZ2V0X3NuZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCi0jZGVmaW5lIG1lbV9wdXRfYmVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9zZV9hbGlnbmVkX2dlbmVyaWMoYmUsc3opCi0jZGVmaW5lIG1lbV9wdXRfbGVfYWxpZ25lZF9nZW5lcmljKHN6KSAgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMobGUsc3opCi0jZW5kaWYKLQotI3VuZGVmICBtZW1fZ2V0X2JlMTZfYWxpZ25lZAotI2RlZmluZSBtZW1fZ2V0X2JlMTZfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfYmUxNl9hbGlnbmVkKQotbWVtX2dldF9iZV9hbGlnbmVkX2dlbmVyaWMoMTYpOwotCi0jdW5kZWYgIG1lbV9nZXRfYmUzMl9hbGlnbmVkCi0jZGVmaW5lIG1lbV9nZXRfYmUzMl9hbGlnbmVkIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX2dldF9iZTMyX2FsaWduZWQpCi1tZW1fZ2V0X2JlX2FsaWduZWRfZ2VuZXJpYygzMik7Ci0KLSN1bmRlZiAgbWVtX2dldF9sZTE2X2FsaWduZWQKLSNkZWZpbmUgbWVtX2dldF9sZTE2X2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X2xlMTZfYWxpZ25lZCkKLW1lbV9nZXRfbGVfYWxpZ25lZF9nZW5lcmljKDE2KTsKLQotI3VuZGVmICBtZW1fZ2V0X2xlMzJfYWxpZ25lZAotI2RlZmluZSBtZW1fZ2V0X2xlMzJfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9nZXRfbGUzMl9hbGlnbmVkKQotbWVtX2dldF9sZV9hbGlnbmVkX2dlbmVyaWMoMzIpOwotCi0jdW5kZWYgIG1lbV9nZXRfc2JlMTZfYWxpZ25lZAotI2RlZmluZSBtZW1fZ2V0X3NiZTE2X2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NiZTE2X2FsaWduZWQpCi1tZW1fZ2V0X3NiZV9hbGlnbmVkX2dlbmVyaWMoMTYpOwotCi0jdW5kZWYgIG1lbV9nZXRfc2JlMzJfYWxpZ25lZAotI2RlZmluZSBtZW1fZ2V0X3NiZTMyX2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NiZTMyX2FsaWduZWQpCi1tZW1fZ2V0X3NiZV9hbGlnbmVkX2dlbmVyaWMoMzIpOwotCi0jdW5kZWYgIG1lbV9nZXRfc2xlMTZfYWxpZ25lZAotI2RlZmluZSBtZW1fZ2V0X3NsZTE2X2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTE2X2FsaWduZWQpCi1tZW1fZ2V0X3NsZV9hbGlnbmVkX2dlbmVyaWMoMTYpOwotCi0jdW5kZWYgIG1lbV9nZXRfc2xlMzJfYWxpZ25lZAotI2RlZmluZSBtZW1fZ2V0X3NsZTMyX2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fZ2V0X3NsZTMyX2FsaWduZWQpCi1tZW1fZ2V0X3NsZV9hbGlnbmVkX2dlbmVyaWMoMzIpOwotCi0jdW5kZWYgIG1lbV9wdXRfYmUxNl9hbGlnbmVkCi0jZGVmaW5lIG1lbV9wdXRfYmUxNl9hbGlnbmVkIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX3B1dF9iZTE2X2FsaWduZWQpCi1tZW1fcHV0X2JlX2FsaWduZWRfZ2VuZXJpYygxNik7Ci0KLSN1bmRlZiAgbWVtX3B1dF9iZTMyX2FsaWduZWQKLSNkZWZpbmUgbWVtX3B1dF9iZTMyX2FsaWduZWQgbWVtX29wc193cmFwX3N5bWJvbChtZW1fcHV0X2JlMzJfYWxpZ25lZCkKLW1lbV9wdXRfYmVfYWxpZ25lZF9nZW5lcmljKDMyKTsKLQotI3VuZGVmICBtZW1fcHV0X2xlMTZfYWxpZ25lZAotI2RlZmluZSBtZW1fcHV0X2xlMTZfYWxpZ25lZCBtZW1fb3BzX3dyYXBfc3ltYm9sKG1lbV9wdXRfbGUxNl9hbGlnbmVkKQotbWVtX3B1dF9sZV9hbGlnbmVkX2dlbmVyaWMoMTYpOwotCi0jdW5kZWYgIG1lbV9wdXRfbGUzMl9hbGlnbmVkCi0jZGVmaW5lIG1lbV9wdXRfbGUzMl9hbGlnbmVkIG1lbV9vcHNfd3JhcF9zeW1ib2wobWVtX3B1dF9sZTMyX2FsaWduZWQpCi1tZW1fcHV0X2xlX2FsaWduZWRfZ2VuZXJpYygzMik7Ci0KLSN1bmRlZiBtZW1fZ2V0X25lX2FsaWduZWRfZ2VuZXJpYwotI3VuZGVmIG1lbV9nZXRfc2VfYWxpZ25lZF9nZW5lcmljCi0jdW5kZWYgbWVtX2dldF9zbmVfYWxpZ25lZF9nZW5lcmljCi0jdW5kZWYgbWVtX2dldF9zc2VfYWxpZ25lZF9nZW5lcmljCi0jdW5kZWYgbWVtX3B1dF9uZV9hbGlnbmVkX2dlbmVyaWMKLSN1bmRlZiBtZW1fcHV0X3NlX2FsaWduZWRfZ2VuZXJpYwotI3VuZGVmIHN3YXBfZW5kaWFuXzE2Ci0jdW5kZWYgc3dhcF9lbmRpYW5fMzIKLSN1bmRlZiBzd2FwX2VuZGlhbl8xNl9zZQotI3VuZGVmIHN3YXBfZW5kaWFuXzMyX3NlCmRpZmYgLS1naXQgYS92cHhfcG9ydHMvdnB4X3RpbWVyLmggYi92cHhfcG9ydHMvdnB4X3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzM1YTAuLjAwMDAwMDAKLS0tIGEvdnB4X3BvcnRzL3ZweF90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIFZQWF9USU1FUl9ICi0jZGVmaW5lIFZQWF9USU1FUl9ICi0KLSNpZiBDT05GSUdfT1NfU1VQUE9SVAotCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0vKgotICogV2luMzIgc3BlY2lmaWMgaW5jbHVkZXMKLSAqLwotI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNlbmRpZgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbHNlCi0vKgotICogUE9TSVggc3BlY2lmaWMgaW5jbHVkZXMKLSAqLwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLS8qIHRpbWVyc3ViIGlzIG5vdCBwcm92aWRlZCBieSBtc3lzIGF0IHRoaXMgdGltZS4gKi8KLSNpZm5kZWYgdGltZXJzdWIKLSNkZWZpbmUgdGltZXJzdWIoYSwgYiwgcmVzdWx0KSBcCi0gICAgZG8geyBcCi0gICAgICAgIChyZXN1bHQpLT50dl9zZWMgPSAoYSktPnR2X3NlYyAtIChiKS0+dHZfc2VjOyBcCi0gICAgICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjIC0gKGIpLT50dl91c2VjOyBcCi0gICAgICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA8IDApIHsgXAotICAgICAgICAgICAgLS0ocmVzdWx0KS0+dHZfc2VjOyBcCi0gICAgICAgICAgICAocmVzdWx0KS0+dHZfdXNlYyArPSAxMDAwMDAwOyBcCi0gICAgICAgIH0gXAotICAgIH0gd2hpbGUgKDApCi0jZW5kaWYKLSNlbmRpZgotCi0KLXN0cnVjdCB2cHhfdXNlY190aW1lcgotewotI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIExBUkdFX0lOVEVHRVIgIGJlZ2luLCBlbmQ7Ci0jZWxzZQotICAgIHN0cnVjdCB0aW1ldmFsIGJlZ2luLCBlbmQ7Ci0jZW5kaWYKLX07Ci0KLQotc3RhdGljIHZvaWQKLXZweF91c2VjX3RpbWVyX3N0YXJ0KHN0cnVjdCB2cHhfdXNlY190aW1lciAqdCkKLXsKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmdC0+YmVnaW4pOwotI2Vsc2UKLSAgICBnZXR0aW1lb2ZkYXkoJnQtPmJlZ2luLCBOVUxMKTsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyB2b2lkCi12cHhfdXNlY190aW1lcl9tYXJrKHN0cnVjdCB2cHhfdXNlY190aW1lciAqdCkKLXsKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmdC0+ZW5kKTsKLSNlbHNlCi0gICAgZ2V0dGltZW9mZGF5KCZ0LT5lbmQsIE5VTEwpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIGxvbmcKLXZweF91c2VjX3RpbWVyX2VsYXBzZWQoc3RydWN0IHZweF91c2VjX3RpbWVyICp0KQotewotI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIExBUkdFX0lOVEVHRVIgZnJlcSwgZGlmZjsKLQotICAgIGRpZmYuUXVhZFBhcnQgPSB0LT5lbmQuUXVhZFBhcnQgLSB0LT5iZWdpbi5RdWFkUGFydDsKLQotICAgIGlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxKSAmJiBkaWZmLlF1YWRQYXJ0IDwgZnJlcS5RdWFkUGFydCkKLSAgICAgICAgcmV0dXJuIChsb25nKShkaWZmLlF1YWRQYXJ0ICogMTAwMDAwMCAvIGZyZXEuUXVhZFBhcnQpOwotCi0gICAgcmV0dXJuIDEwMDAwMDA7Ci0jZWxzZQotICAgIHN0cnVjdCB0aW1ldmFsIGRpZmY7Ci0KLSAgICB0aW1lcnN1YigmdC0+ZW5kLCAmdC0+YmVnaW4sICZkaWZmKTsKLSAgICByZXR1cm4gZGlmZi50dl9zZWMgPyAxMDAwMDAwIDogZGlmZi50dl91c2VjOwotI2VuZGlmCi19Ci0KLSNlbHNlIC8qIENPTkZJR19PU19TVVBQT1JUID0gMCovCi0KLS8qIEVtcHR5IHRpbWVyIGZ1bmN0aW9ucyBpZiBDT05GSUdfT1NfU1VQUE9SVCA9IDAgKi8KLSNpZm5kZWYgdGltZXJzdWIKLSNkZWZpbmUgdGltZXJzdWIoYSwgYiwgcmVzdWx0KQotI2VuZGlmCi0KLXN0cnVjdCB2cHhfdXNlY190aW1lcgotewotICAgIHZvaWQgKmR1bW15OwotfTsKLQotc3RhdGljIHZvaWQKLXZweF91c2VjX3RpbWVyX3N0YXJ0KHN0cnVjdCB2cHhfdXNlY190aW1lciAqdCkgeyB9Ci0KLXN0YXRpYyB2b2lkCi12cHhfdXNlY190aW1lcl9tYXJrKHN0cnVjdCB2cHhfdXNlY190aW1lciAqdCkgeyB9Ci0KLXN0YXRpYyBsb25nCi12cHhfdXNlY190aW1lcl9lbGFwc2VkKHN0cnVjdCB2cHhfdXNlY190aW1lciAqdCkgeyByZXR1cm4gMDsgfQotCi0jZW5kaWYgLyogQ09ORklHX09TX1NVUFBPUlQgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cHhfcG9ydHMvdnB4dHlwZXMuaCBiL3ZweF9wb3J0cy92cHh0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWI2NmIxLi4wMDAwMDAwCi0tLSBhL3ZweF9wb3J0cy92cHh0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWZuZGVmIF9fVlBYVFlQRVNfSF9fCi0jZGVmaW5lIF9fVlBYVFlQRVNfSF9fCi0KLSNpbmNsdWRlICJ2cHhfcG9ydHMvY29uZmlnLmgiCi0KLS8vI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIF9NU0NfVkVSCi0jIGluY2x1ZGUgPGJhc2V0c2QuaD4KLXR5cGVkZWYgU1NJWkVfVCBzc2l6ZV90OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfU1RESU5UX0gpICYmIEhBVkVfU1RESU5UX0gKLS8qIEM5OSB0eXBlcyBhcmUgcHJlZmVycmVkIHRvIHZweCBpbnRlZ2VyIHR5cGVzICovCi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0KLS8qIVxkZWZncm91cCBiYXNldHlwZXMgQmFzZSBUeXBlcwotICBAeyovCi0jaWYgIWRlZmluZWQoSEFWRV9TVERJTlRfSCkgJiYgIWRlZmluZWQoSU5UX1RfREVGSU5FRCkKLSMgaWZkZWYgU1RSSUNUVFlQRVMKLXR5cGVkZWYgc2lnbmVkIGNoYXIgIGludDhfdDsKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICBpbnQzMl90OwotIyBlbHNlCi10eXBlZGVmIGNoYXIgICAgICAgICBpbnQ4X3Q7Ci10eXBlZGVmIHNob3J0ICAgICAgICBpbnQxNl90OwotdHlwZWRlZiBpbnQgICAgICAgICAgaW50MzJfdDsKLSMgZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgIHVpbnQzMl90OwotI2VuZGlmCi0KLXR5cGVkZWYgaW50OF90ICAgICB2cHhzODsKLXR5cGVkZWYgdWludDhfdCAgICB2cHh1ODsKLXR5cGVkZWYgaW50MTZfdCAgICB2cHhzMTY7Ci10eXBlZGVmIHVpbnQxNl90ICAgdnB4dTE2OwotdHlwZWRlZiBpbnQzMl90ICAgIHZweHMzMjsKLXR5cGVkZWYgdWludDMyX3QgICB2cHh1MzI7Ci10eXBlZGVmIGludDMyX3QgICAgdnB4Ym9vbDsKLQotZW51bSB7dnB4ZmFsc2UsIHZweHRydWV9OwotCi0vKiFcZGVmIE9UQwotICAgXGJyaWVmIGEgbWFjcm8gc3VpdGFibGUgZm9yIGRlY2xhcmluZyBhIGNvbnN0YW50ICN2cHh0YyovCi0vKiFcZGVmIFZQWFRDCi0gICBcYnJpZWYgcHJpbnRmIGZvcm1hdCBzdHJpbmcgc3VpdGFibGUgZm9yIHByaW50aW5nIGFuICN2cHh0YyovCi0jaWZkZWYgVU5JQ09ERQotIyBpZmRlZiBOT19XQ0hBUgotIyAgZXJyb3IgIm5vIG5vbi13Y2hhciBzdXBwb3J0IGFkZGVkIHlldCIKLSMgZWxzZQotIyAgaW5jbHVkZSA8d2NoYXIuaD4KLXR5cGVkZWYgd2NoYXJfdCB2cHh0YzsKLSMgIGRlZmluZSBPVEMoc3RyKSBMICMjIHN0cgotIyAgZGVmaW5lIFZQWFRDICJscyIKLSMgZW5kaWYgLypOT19XQ0hBUiovCi0jZWxzZQotdHlwZWRlZiBjaGFyIHZweHRjOwotIyBkZWZpbmUgT1RDKHN0cikgKHZweHRjKilzdHIKLSMgZGVmaW5lIFZQWFRDICJzIgotI2VuZGlmIC8qVU5JQ09ERSovCi0vKkB9IGVuZCAtIGJhc2UgdHlwZXMqLwotCi0vKiFcYWRkdG9ncm91cCBiYXNldHlwZXMKLSAgQHsqLwotLyohXGRlZiBWUFg2NAotICAgXGJyaWVmIHByaW50ZiBmb3JtYXQgc3RyaW5nIHN1aXRhYmxlIGZvciBwcmludGluZyBhbiAjdnB4czY0Ki8KLSNpZiBkZWZpbmVkKEhBVkVfU1RESU5UX0gpCi0jIGRlZmluZSBWUFg2NCBQUklkNjQKLXR5cGVkZWYgaW50NjRfdCB2cHhzNjQ7Ci0jZWxpZiBkZWZpbmVkKEhBU0xPTkdMT05HKQotIyB1bmRlZiAgUFJJZDY0Ci0jIGRlZmluZSBQUklkNjQgImxsZCIKLSMgZGVmaW5lIFZQWDY0IFBSSWQ2NAotdHlwZWRlZiBsb25nIGxvbmcgdnB4czY0OwotI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQotIyB1bmRlZiAgUFJJZDY0Ci0jIGRlZmluZSBQUklkNjQgIkk2NGQiCi0jIGRlZmluZSBWUFg2NCBQUklkNjQKLXR5cGVkZWYgX19pbnQ2NCB2cHhzNjQ7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdnB4dTY0OwotI2VsaWYgZGVmaW5lZChfX3VDbGludXhfXykgJiYgZGVmaW5lZChDSElQX0RNNjQyKQotIyBpbmNsdWRlIDxsZGRrLmg+Ci0jIHVuZGVmICBQUklkNjQKLSMgZGVmaW5lIFBSSWQ2NCAibGxkIgotIyBkZWZpbmUgVlBYNjQgUFJJZDY0Ci10eXBlZGVmIGxvbmcgdnB4czY0OwotI2VsaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotIyB1bmRlZiAgUFJJZDY0Ci0jIGRlZmluZSBQUklkNjQgInUiCi0jIGRlZmluZSBWUFg2NCBQUklkNjQKLXR5cGVkZWYgdW5zaWduZWQgaW50IHZweHM2NDsKLSNlbHNlCi0jIGVycm9yICI2NCBiaXQgaW50ZWdlciB0eXBlIHVuZGVmaW5lZCBmb3IgdGhpcyBwbGF0Zm9ybSEiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChIQVZFX1NURElOVF9IKSAmJiAhZGVmaW5lZChJTlRfVF9ERUZJTkVEKQotdHlwZWRlZiB2cHhzNjQgaW50NjRfdDsKLXR5cGVkZWYgdnB4dTY0IHVpbnQ2NF90OwotI2VuZGlmCi0vKiFAfSBlbmQgLSBiYXNlIHR5cGVzKi8KLQotLyohXGluZ3JvdXAgYmFzZXR5cGVzCi0gICBcYnJpZWYgQ29tbW9uIHJldHVybiB0eXBlKi8KLXR5cGVkZWYgZW51bQotewotICAgIFZQWF9OT1RfRk9VTkQgICAgICAgID0gLTQwNCwKLSAgICBWUFhfQlVGRkVSX0VNUFRZICAgICA9IC0yMDIsCi0gICAgVlBYX0JVRkZFUl9GVUxMICAgICAgPSAtMjAxLAotCi0gICAgVlBYX0NPTk5SRUZVU0VEICAgICAgPSAtMTAyLAotICAgIFZQWF9USU1FRE9VVCAgICAgICAgID0gLTEwMSwKLSAgICBWUFhfV09VTERCTE9DSyAgICAgICA9IC0xMDAsCi0KLSAgICBWUFhfTkVUX0VSUk9SICAgICAgICA9IC05LAotICAgIFZQWF9JTlZBTElEX1ZFUlNJT04gID0gLTgsCi0gICAgVlBYX0lOUFJPR1JFU1MgICAgICAgPSAtNywKLSAgICBWUFhfTk9UX1NVUFAgICAgICAgICA9IC02LAotICAgIFZQWF9OT19NRU0gICAgICAgICAgID0gLTMsCi0gICAgVlBYX0lOVkFMSURfUEFSQU1TICAgPSAtMiwKLSAgICBWUFhfRVJST1IgICAgICAgICAgICA9IC0xLAotICAgIFZQWF9PSyAgICAgICAgICAgICAgID0gMCwKLSAgICBWUFhfRE9ORSAgICAgICAgICAgICA9IDEKLX0gdnB4c2M7Ci0KLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0jIGRlZmluZSBETExJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jIGRlZmluZSBETExFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jIGRlZmluZSBETExMT0NBTAotI2VsaWYgZGVmaW5lZChMSU5VWCkKLSMgZGVmaW5lIERMTElNUE9SVAotLyp2aXNpYmlsaXR5IGF0dHJpYnV0ZSBzdXBwb3J0IGlzIGF2YWlsYWJsZSBpbiAzLjQgYW5kIGxhdGVyLgotICBzZWU6IGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIG1vcmUgaW5mbyovCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX188PDE2fChfX0dOVUNfTUlOT1JfXyYweGZmKSkgPj0gKDM8PDE2fDQpKQotIyAgZGVmaW5lIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKLSMgZW5kaWYgLypkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfUFJFUkVRKDMsNCkqLwotIyBpZmRlZiBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCi0jICBkZWZpbmUgRExMRVhQT1JUICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCi0jICBkZWZpbmUgRExMTE9DQUwgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKLSMgZWxzZQotIyAgZGVmaW5lIERMTEVYUE9SVAotIyAgZGVmaW5lIERMTExPQ0FMCi0jIGVuZGlmIC8qR0NDX0hBU0NMQVNTVklTSUJJTElUWSovCi0jZW5kaWYgLypwbGF0Zm9ybSBpZmRlZnMqLwotCi0jZW5kaWYgLypfX1ZQWFRZUEVTX0hfXyovCi0KLSN1bmRlZiBWUFhBUEkKLS8qIVxkZWYgVlBYQVBJCi0gICBcYnJpZWYgbGlicmFyeSBjYWxsaW5nIGNvbnZlbnRpb24vc3RvcmFnZSBjbGFzcyBhdHRyaWJ1dGVzLgotCi0gICBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgaW1wb3J0ZWQgdGhyb3VnaCBhIGRsbAotICAgb3IgaXMgZnJvbSBhIHN0YXRpYyBsaWJyYXJ5LiovCi0jaWZkZWYgVlBYRExMCi0jIGlmZGVmIFZQWERMTEVYUE9SVAotIyAgZGVmaW5lIFZQWEFQSSBETExFWFBPUlQKLSMgZWxzZQotIyAgZGVmaW5lIFZQWEFQSSBETExJTVBPUlQKLSMgZW5kaWYgLypWUFhETExFWFBPUlQqLwotI2Vsc2UKLSMgZGVmaW5lIFZQWEFQSQotI2VuZGlmIC8qVlBYRExMKi8KZGlmZiAtLWdpdCBhL3ZweF9wb3J0cy94ODYuaCBiL3ZweF9wb3J0cy94ODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwYzg2NC4uMDAwMDAwMAotLS0gYS92cHhfcG9ydHMveDg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgVlBYX1BPUlRTX1g4Nl9ICi0jZGVmaW5lIFZQWF9QT1JUU19YODZfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImNvbmZpZy5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgICBWUFhfQ1BVX1VOS05PV04gPSAtMSwKLSAgICBWUFhfQ1BVX0FNRCwKLSAgICBWUFhfQ1BVX0FNRF9PTEQsCi0gICAgVlBYX0NQVV9DRU5UQVVSLAotICAgIFZQWF9DUFVfQ1lSSVgsCi0gICAgVlBYX0NQVV9JTlRFTCwKLSAgICBWUFhfQ1BVX05FWEdFTiwKLSAgICBWUFhfQ1BVX05TQywKLSAgICBWUFhfQ1BVX1JJU0UsCi0gICAgVlBYX0NQVV9TSVMsCi0gICAgVlBYX0NQVV9UUkFOU01FVEEsCi0gICAgVlBYX0NQVV9UUkFOU01FVEFfT0xELAotICAgIFZQWF9DUFVfVU1DLAotICAgIFZQWF9DUFVfVklBLAotCi0gICAgVlBYX0NQVV9MQVNUCi19ICB2cHhfY3B1X3Q7Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXwotI2lmIEFSQ0hfWDg2XzY0Ci0jZGVmaW5lIGNwdWlkKGZ1bmMsYXgsYngsY3gsZHgpXAotICAgIF9fYXNtX18gX192b2xhdGlsZV9fIChcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJjcHVpZCAgICAgICAgICAgXG5cdCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKGF4KSwgIj1iIiAoYngpLCAiPWMiIChjeCksICI9ZCIgKGR4KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogImEiICAoZnVuYykpOwotI2Vsc2UKLSNkZWZpbmUgY3B1aWQoZnVuYyxheCxieCxjeCxkeClcCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdiAlJWVieCwgJSVlZGkgICBcblx0IiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJjcHVpZCAgICAgICAgICAgICAgXG5cdCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAieGNoZyAlJWVkaSwgJSVlYnggIFxuXHQiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChheCksICI9RCIgKGJ4KSwgIj1jIiAoY3gpLCAiPWQiIChkeCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJhIiAoZnVuYykpOwotI2VuZGlmCi0jZWxzZQotI2lmIEFSQ0hfWDg2XzY0Ci12b2lkIF9fY3B1aWQoaW50IENQVUluZm9bNF0sIGludCBpbmZvX3R5cGUpOwotI3ByYWdtYSBpbnRyaW5zaWMoX19jcHVpZCkKLSNkZWZpbmUgY3B1aWQoZnVuYyxhLGIsYyxkKSBkb3tcCi0gICAgICAgIGludCByZWdzWzRdO1wKLSAgICAgICAgX19jcHVpZChyZWdzLGZ1bmMpOyBhPXJlZ3NbMF07ICBiPXJlZ3NbMV07ICBjPXJlZ3NbMl07ICBkPXJlZ3NbM107XAotICAgIH0gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIGNwdWlkKGZ1bmMsYSxiLGMsZClcCi0gICAgX19hc20gbW92IGVheCwgZnVuY1wKLSAgICBfX2FzbSBjcHVpZFwKLSAgICBfX2FzbSBtb3YgYSwgZWF4XAotICAgIF9fYXNtIG1vdiBiLCBlYnhcCi0gICAgX19hc20gbW92IGMsIGVjeFwKLSAgICBfX2FzbSBtb3YgZCwgZWR4Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEhBU19NTVggICAweDAxCi0jZGVmaW5lIEhBU19TU0UgICAweDAyCi0jZGVmaW5lIEhBU19TU0UyICAweDA0Ci0jZGVmaW5lIEhBU19TU0UzICAweDA4Ci0jZGVmaW5lIEhBU19TU1NFMyAweDEwCi0jZGVmaW5lIEhBU19TU0U0XzEgMHgyMAotI2lmbmRlZiBCSVQKLSNkZWZpbmUgQklUKG4pICgxPDxuKQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXg4Nl9zaW1kX2NhcHModm9pZCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotICAgIHVuc2lnbmVkIGludCBtYXNrID0gfjA7Ci0gICAgdW5zaWduZWQgaW50IHJlZ19lYXgsIHJlZ19lYngsIHJlZ19lY3gsIHJlZ19lZHg7Ci0gICAgY2hhciAqZW52OwotICAgICh2b2lkKXJlZ19lYng7Ci0KLSAgICAvKiBTZWUgaWYgdGhlIENQVSBjYXBhYmlsaXRpZXMgYXJlIGJlaW5nIG92ZXJyaWRkZW4gYnkgdGhlIGVudmlyb25tZW50ICovCi0gICAgZW52ID0gZ2V0ZW52KCJWUFhfU0lNRF9DQVBTIik7Ci0KLSAgICBpZiAoZW52ICYmICplbnYpCi0gICAgICAgIHJldHVybiAoaW50KXN0cnRvbChlbnYsIE5VTEwsIDApOwotCi0gICAgZW52ID0gZ2V0ZW52KCJWUFhfU0lNRF9DQVBTX01BU0siKTsKLQotICAgIGlmIChlbnYgJiYgKmVudikKLSAgICAgICAgbWFzayA9IHN0cnRvbChlbnYsIE5VTEwsIDApOwotCi0gICAgLyogRW5zdXJlIHRoYXQgdGhlIENQVUlEIGluc3RydWN0aW9uIHN1cHBvcnRzIGV4dGVuZGVkIGZlYXR1cmVzICovCi0gICAgY3B1aWQoMCwgcmVnX2VheCwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeCk7Ci0KLSAgICBpZiAocmVnX2VheCA8IDEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogR2V0IHRoZSBzdGFuZGFyZCBmZWF0dXJlIGZsYWdzICovCi0gICAgY3B1aWQoMSwgcmVnX2VheCwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeCk7Ci0KLSAgICBpZiAocmVnX2VkeCAmIEJJVCgyMykpIGZsYWdzIHw9IEhBU19NTVg7Ci0KLSAgICBpZiAocmVnX2VkeCAmIEJJVCgyNSkpIGZsYWdzIHw9IEhBU19TU0U7IC8qIGFrYSB4bW0gKi8KLQotICAgIGlmIChyZWdfZWR4ICYgQklUKDI2KSkgZmxhZ3MgfD0gSEFTX1NTRTI7IC8qIGFrYSB3bXQgKi8KLQotICAgIGlmIChyZWdfZWN4ICYgQklUKDApKSAgZmxhZ3MgfD0gSEFTX1NTRTM7Ci0KLSAgICBpZiAocmVnX2VjeCAmIEJJVCg5KSkgIGZsYWdzIHw9IEhBU19TU1NFMzsKLQotICAgIGlmIChyZWdfZWN4ICYgQklUKDE5KSkgZmxhZ3MgfD0gSEFTX1NTRTRfMTsKLQotICAgIHJldHVybiBmbGFncyAmIG1hc2s7Ci19Ci0KLXZweF9jcHVfdCB2cHhfeDg2X3ZlbmRvcih2b2lkKTsKLQotI2lmIEFSQ0hfWDg2XzY0ICYmIGRlZmluZWQoX01TQ19WRVIpCi11bnNpZ25lZCBfX2ludDY0IF9fcmR0c2Modm9pZCk7Ci0jcHJhZ21hIGludHJpbnNpYyhfX3JkdHNjKQotI2VuZGlmCi1zdGF0aWMgdW5zaWduZWQgaW50Ci14ODZfcmVhZHRzYyh2b2lkKQotewotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCi0gICAgdW5zaWduZWQgaW50IHRzYzsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicmR0c2Ncblx0IjoiPWEiKHRzYyk6KTsKLSAgICByZXR1cm4gdHNjOwotI2Vsc2UKLSNpZiBBUkNIX1g4Nl82NAotICAgIHJldHVybiBfX3JkdHNjKCk7Ci0jZWxzZQotICAgIF9fYXNtICByZHRzYzsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCi0jZGVmaW5lIHg4Nl9wYXVzZV9oaW50KClcCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwYXVzZSBcblx0IikKLSNlbHNlCi0jaWYgQVJDSF9YODZfNjQKLS8qIE5vIHBhdXNlIGludHJpbnNpYyBmb3Igd2luZG93cyB4NjQgKi8KLSNkZWZpbmUgeDg2X3BhdXNlX2hpbnQoKQotI2Vsc2UKLSNkZWZpbmUgeDg2X3BhdXNlX2hpbnQoKVwKLSAgICBfX2FzbSBwYXVzZQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCi1zdGF0aWMgdm9pZAoteDg3X3NldF9jb250cm9sX3dvcmQodW5zaWduZWQgc2hvcnQgbW9kZSkKLXsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiZmxkY3cgJTAiIDogOiAibSIoKiZtb2RlKSk7Ci19Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQKLXg4N19nZXRfY29udHJvbF93b3JkKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgbW9kZTsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiZnN0Y3cgJTBcblx0IjoiPW0iKCombW9kZSk6KTsKLSAgICByZXR1cm4gbW9kZTsKLX0KLSNlbGlmIEFSQ0hfWDg2XzY0Ci0vKiBObyBmbGRjdyBpbnRyaW5zaWNzIG9uIFdpbmRvd3MgeDY0LCBwdW50IHRvIGV4dGVybmFsIGFzbSAqLwotZXh0ZXJuIHZvaWQgICAgICAgICAgIHZweF93aW54NjRfZmxkY3codW5zaWduZWQgc2hvcnQgbW9kZSk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgdnB4X3dpbng2NF9mc3Rjdyh2b2lkKTsKLSNkZWZpbmUgeDg3X3NldF9jb250cm9sX3dvcmQgdnB4X3dpbng2NF9mbGRjdwotI2RlZmluZSB4ODdfZ2V0X2NvbnRyb2xfd29yZCB2cHhfd2lueDY0X2ZzdGN3Ci0jZWxzZQotc3RhdGljIHZvaWQKLXg4N19zZXRfY29udHJvbF93b3JkKHVuc2lnbmVkIHNob3J0IG1vZGUpCi17Ci0gICAgX19hc20geyBmbGRjdyBtb2RlIH0KLX0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAoteDg3X2dldF9jb250cm9sX3dvcmQodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBtb2RlOwotICAgIF9fYXNtIHsgZnN0Y3cgbW9kZSB9Ci0gICAgcmV0dXJuIG1vZGU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0Ci14ODdfc2V0X2RvdWJsZV9wcmVjaXNpb24odm9pZCkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBtb2RlID0geDg3X2dldF9jb250cm9sX3dvcmQoKTsKLSAgICB4ODdfc2V0X2NvbnRyb2xfd29yZCgobW9kZSZ+MHgzMDApIHwgMHgyMDApOwotICAgIHJldHVybiBtb2RlOwotfQotCi0KLWV4dGVybiB2b2lkIHZweF9yZXNldF9tbXhfc3RhdGUodm9pZCk7Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvdnB4X3BvcnRzL3g4Nl9hYmlfc3VwcG9ydC5hc20gYi92cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2NGNkNy4uMDAwMDAwMAotLS0gYS92cHhfcG9ydHMveDg2X2FiaV9zdXBwb3J0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0laW5jbHVkZSAidnB4X2NvbmZpZy5hc20iCi0KLTsgMzIvNjQgYml0IGNvbXBhdGliaWxpdHkgbWFjcm9zCi07Ci07IEluIGdlbmVyYWwsIHdlIG1ha2UgdGhlIHNvdXJjZSB1c2UgNjQgYml0IHN5bnRheCwgdGhlbiB0d2lkZGxlIHdpdGggaXQgdXNpbmcKLTsgdGhlIHByZXByb2Nlc3NvciB0byBnZXQgdGhlIDMyIGJpdCBzeW50YXggb24gMzIgYml0IHBsYXRmb3Jtcy4KLTsKLSVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYzMgotJWRlZmluZSBBQklfSVNfMzJCSVQgMQotJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sbWFjaG8zMgotJWRlZmluZSBBQklfSVNfMzJCSVQgMQotJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKLSVkZWZpbmUgQUJJX0lTXzMyQklUIDEKLSVlbHNlCi0lZGVmaW5lIEFCSV9JU18zMkJJVCAwCi0lZW5kaWYKLQotJWlmIEFCSV9JU18zMkJJVAotJWRlZmluZSByYXggZWF4Ci0lZGVmaW5lIHJieCBlYngKLSVkZWZpbmUgcmN4IGVjeAotJWRlZmluZSByZHggZWR4Ci0lZGVmaW5lIHJzaSBlc2kKLSVkZWZpbmUgcmRpIGVkaQotJWRlZmluZSByc3AgZXNwCi0lZGVmaW5lIHJicCBlYnAKLSVkZWZpbmUgbW92c3hkIG1vdgotJW1hY3JvIG1vdnEgMgotICAlaWZpZG4gJTEsZWF4Ci0gICAgbW92ZCAlMSwlMgotICAlZWxpZmlkbiAlMixlYXgKLSAgICBtb3ZkICUxLCUyCi0gICVlbGlmaWRuICUxLGVieAotICAgIG1vdmQgJTEsJTIKLSAgJWVsaWZpZG4gJTIsZWJ4Ci0gICAgbW92ZCAlMSwlMgotICAlZWxpZmlkbiAlMSxlY3gKLSAgICBtb3ZkICUxLCUyCi0gICVlbGlmaWRuICUyLGVjeAotICAgIG1vdmQgJTEsJTIKLSAgJWVsaWZpZG4gJTEsZWR4Ci0gICAgbW92ZCAlMSwlMgotICAlZWxpZmlkbiAlMixlZHgKLSAgICBtb3ZkICUxLCUyCi0gICVlbGlmaWRuICUxLGVzaQotICAgIG1vdmQgJTEsJTIKLSAgJWVsaWZpZG4gJTIsZXNpCi0gICAgbW92ZCAlMSwlMgotICAlZWxpZmlkbiAlMSxlZGkKLSAgICBtb3ZkICUxLCUyCi0gICVlbGlmaWRuICUyLGVkaQotICAgIG1vdmQgJTEsJTIKLSAgJWVsaWZpZG4gJTEsZXNwCi0gICAgbW92ZCAlMSwlMgotICAlZWxpZmlkbiAlMixlc3AKLSAgICBtb3ZkICUxLCUyCi0gICVlbGlmaWRuICUxLGVicAotICAgIG1vdmQgJTEsJTIKLSAgJWVsaWZpZG4gJTIsZWJwCi0gICAgbW92ZCAlMSwlMgotICAlZWxzZQotICAgIG1vdnEgJTEsJTIKLSAgJWVuZGlmCi0lZW5kbWFjcm8KLSVlbmRpZgotCi0KLTsgc3ltKCkKLTsgUmV0dXJuIHRoZSBwcm9wZXIgc3ltYm9sIG5hbWUgZm9yIHRoZSB0YXJnZXQgQUJJLgotOwotOyBDZXJ0YWluIEFCSXMsIG5vdGFibHkgTVMgQ09GRiBhbmQgRGFyd2luIE1BQ0gtTywgcmVxdWlyZSB0aGF0IHN5bWJvbHMKLTsgd2l0aCBDIGxpbmthZ2UgYmUgcHJlZml4ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLgotOwotJWlmaWRuICAgX19PVVRQVVRfRk9STUFUX18sZWxmMzIKLSVkZWZpbmUgc3ltKHgpIHgKLSVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjY0Ci0lZGVmaW5lIHN5bSh4KSB4Ci0lZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKLSVkZWZpbmUgc3ltKHgpIHgKLSVlbHNlCi0lZGVmaW5lIHN5bSh4KSBfICUrIHgKLSVlbmRpZgotCi07IGFyZygpCi07IFJldHVybiB0aGUgYWRkcmVzcyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBnaXZlbiBhcmd1bWVudAotOwotJWlmIEFCSV9JU18zMkJJVAotICAlZGVmaW5lIGFyZyh4KSBbZWJwKzgrNCp4XQotJWVsc2UKLSAgOyA2NCBiaXQgQUJJIHBhc3NlcyBhcmd1bWVudHMgaW4gcmVnaXN0ZXJzLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBnZXQgdXAKLSAgOyBhbmQgcnVubmluZyBxdWlja2x5LiBSZWxpZXMgb24gU0hBRE9XX0FSR1NfVE9fU1RBQ0sKLSAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAotICAgICVkZWZpbmUgYXJnKHgpIFtyYnArMTYrOCp4XQotICAlZWxzZQotICAgICVkZWZpbmUgYXJnKHgpIFtyYnAtOC04KnhdCi0gICVlbmRpZgotJWVuZGlmCi0KLTsgUkVHX1NaX0JZVEVTLCBSRUdfU1pfQklUUwotOyBTaXplIG9mIGEgcmVnaXN0ZXIKLSVpZiBBQklfSVNfMzJCSVQKLSVkZWZpbmUgUkVHX1NaX0JZVEVTIDQKLSVkZWZpbmUgUkVHX1NaX0JJVFMgIDMyCi0lZWxzZQotJWRlZmluZSBSRUdfU1pfQllURVMgOAotJWRlZmluZSBSRUdfU1pfQklUUyAgNjQKLSVlbmRpZgotCi0KLTsgQUxJR05fU1RBQ0sgPGFsaWdubWVudD4gPHJlZ2lzdGVyPgotOyBUaGlzIG1hY3JvIGFsaWducyB0aGUgc3RhY2sgdG8gdGhlIGdpdmVuIGFsaWdubWVudCAoaW4gYnl0ZXMpLiBUaGUgc3RhY2sKLTsgaXMgbGVmdCBzdWNoIHRoYXQgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyIGlzIHRoZSBmaXJzdAotOyBhcmd1bWVudCBvbiB0aGUgc3RhY2sgKGllLCB0aGUgaW52ZXJzZSBvZiB0aGlzIG1hY3JvIGlzICdwb3AgcnNwLicpCi07IFRoaXMgbWFjcm8gdXNlcyBvbmUgdGVtcG9yYXJ5IHJlZ2lzdGVyLCB3aGljaCBpcyBub3QgcHJlc2VydmVkLCBhbmQgdGh1cwotOyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBhcmd1bWVudC4KLSVtYWNybyBBTElHTl9TVEFDSyAyCi0gICAgbW92ICAgICAgICAgJTIsIHJzcAotICAgIGFuZCAgICAgICAgIHJzcCwgLSUxCi0gICAgbGVhICAgICAgICAgcnNwLCBbcnNwIC0gKCUxIC0gUkVHX1NaX0JZVEVTKV0KLSAgICBwdXNoICAgICAgICAlMgotJWVuZG1hY3JvCi0KLQotOwotOyBUaGUgTWljcm9zb2Z0IGFzc2VtYmxlciB0cmllcyB0byBpbXBvc2UgYSBjZXJ0YWluIGFtb3VudCBvZiB0eXBlIHNhZmV0eSBpbgotOyBpdHMgcmVnaXN0ZXIgdXNhZ2UuIFlBU00gZG9lc24ndCByZWNvZ25pemUgdGhlc2UgZGlyZWN0aXZlcywgc28gd2UganVzdAotOyAlZGVmaW5lIHRoZW0gYXdheSB0byBtYWludGFpbiBhcyBtdWNoIGNvbXBhdGliaWxpdHkgYXMgcG9zc2libGUgd2l0aCB0aGUKLTsgb3JpZ2luYWwgaW5saW5lIGFzc2VtYmxlciB3ZSdyZSBwb3J0aW5nIGZyb20uCi07Ci0laWRlZmluZSBQVFIKLSVpZGVmaW5lIFhNTVdPUkQKLSVpZGVmaW5lIE1NV09SRAotCi07IFBJQyBtYWNyb3MKLTsKLSVpZiBBQklfSVNfMzJCSVQKLSAgJWlmIENPTkZJR19QSUM9MQotICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmMzIKLSAgICAlZGVmaW5lIFdSVF9QTFQgd3J0IC4ucGx0Ci0gICAgJW1hY3JvIEdFVF9HT1QgMQotICAgICAgZXh0ZXJuIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotICAgICAgcHVzaCAlMQotICAgICAgY2FsbCAlJWdldF9nb3QKLSAgICAgICUlc3ViX29mZnNldDoKLSAgICAgIGptcCAlJWV4aXRHRwotICAgICAgJSVnZXRfZ290OgotICAgICAgbW92ICUxLCBbZXNwXQotICAgICAgYWRkICUxLCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gKyAkJCAtICUlc3ViX29mZnNldCB3cnQgLi5nb3RwYwotICAgICAgcmV0Ci0gICAgICAlJWV4aXRHRzoKLSAgICAgICV1bmRlZiBHTE9CQUwKLSAgICAgICVkZWZpbmUgR0xPQkFMKHgpIHggKyAlMSB3cnQgLi5nb3RvZmYKLSAgICAgICV1bmRlZiBSRVNUT1JFX0dPVAotICAgICAgJWRlZmluZSBSRVNUT1JFX0dPVCBwb3AgJTEKLSAgICAlZW5kbWFjcm8KLSAgJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sbWFjaG8zMgotICAgICVtYWNybyBHRVRfR09UIDEKLSAgICAgIHB1c2ggJTEKLSAgICAgIGNhbGwgJSVnZXRfZ290Ci0gICAgICAlJWdldF9nb3Q6Ci0gICAgICBwb3AgICUxCi0gICAgICAldW5kZWYgR0xPQkFMCi0gICAgICAlZGVmaW5lIEdMT0JBTCh4KSB4ICsgJTEgLSAlJWdldF9nb3QKLSAgICAgICV1bmRlZiBSRVNUT1JFX0dPVAotICAgICAgJWRlZmluZSBSRVNUT1JFX0dPVCBwb3AgJTEKLSAgICAlZW5kbWFjcm8KLSAgJWVuZGlmCi0gICVlbmRpZgotICAlZGVmaW5lIEhJRERFTl9EQVRBKHgpIHgKLSVlbHNlCi0gICVtYWNybyBHRVRfR09UIDEKLSAgJWVuZG1hY3JvCi0gICVkZWZpbmUgR0xPQkFMKHgpIHJlbCB4Ci0gICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGY2NAotICAgICVkZWZpbmUgV1JUX1BMVCB3cnQgLi5wbHQKLSAgICAlZGVmaW5lIEhJRERFTl9EQVRBKHgpIHg6ZGF0YSBoaWRkZW4KLSAgJWVsc2UKLSAgICAlZGVmaW5lIEhJRERFTl9EQVRBKHgpIHgKLSAgJWVuZGlmCi0lZW5kaWYKLSVpZm5tYWNybyBHRVRfR09UCi0gICAgJW1hY3JvIEdFVF9HT1QgMQotICAgICVlbmRtYWNybwotICAgICVkZWZpbmUgR0xPQkFMKHgpIHgKLSVlbmRpZgotJWlmbmRlZiBSRVNUT1JFX0dPVAotJWRlZmluZSBSRVNUT1JFX0dPVAotJWVuZGlmCi0laWZuZGVmIFdSVF9QTFQKLSVkZWZpbmUgV1JUX1BMVAotJWVuZGlmCi0KLSVpZiBBQklfSVNfMzJCSVQKLSAgJW1hY3JvIFNIQURPV19BUkdTX1RPX1NUQUNLIDEKLSAgJWVuZG0KLSAgJWRlZmluZSBVTlNIQURPV19BUkdTCi0lZWxzZQotJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHg2NAotICAlbWFjcm8gU0hBRE9XX0FSR1NfVE9fU1RBQ0sgMSA7IGFyZ2MKLSAgICAlaWYgJTEgPiAwCi0gICAgICAgIG1vdiBhcmcoMCkscmN4Ci0gICAgJWVuZGlmCi0gICAgJWlmICUxID4gMQotICAgICAgICBtb3YgYXJnKDEpLHJkeAotICAgICVlbmRpZgotICAgICVpZiAlMSA+IDIKLSAgICAgICAgbW92IGFyZygyKSxyOAotICAgICVlbmRpZgotICAgICVpZiAlMSA+IDMKLSAgICAgICAgbW92IGFyZygzKSxyOQotICAgICVlbmRpZgotICAlZW5kbQotJWVsc2UKLSAgJW1hY3JvIFNIQURPV19BUkdTX1RPX1NUQUNLIDEgOyBhcmdjCi0gICAgJWlmICUxID4gMAotICAgICAgICBwdXNoIHJkaQotICAgICVlbmRpZgotICAgICVpZiAlMSA+IDEKLSAgICAgICAgcHVzaCByc2kKLSAgICAlZW5kaWYKLSAgICAlaWYgJTEgPiAyCi0gICAgICAgIHB1c2ggcmR4Ci0gICAgJWVuZGlmCi0gICAgJWlmICUxID4gMwotICAgICAgICBwdXNoIHJjeAotICAgICVlbmRpZgotICAgICVpZiAlMSA+IDQKLSAgICAgICAgcHVzaCByOAotICAgICVlbmRpZgotICAgICVpZiAlMSA+IDUKLSAgICAgICAgcHVzaCByOQotICAgICVlbmRpZgotICAgICVpZiAlMSA+IDYKLSAgICAgICVhc3NpZ24gaSAlMS02Ci0gICAgICAlYXNzaWduIG9mZiAxNgotICAgICAgJXJlcCBpCi0gICAgICAgIG1vdiByYXgsW3JicCtvZmZdCi0gICAgICAgIHB1c2ggcmF4Ci0gICAgICAgICVhc3NpZ24gb2ZmIG9mZis4Ci0gICAgICAlZW5kcmVwCi0gICAgJWVuZGlmCi0gICVlbmRtCi0lZW5kaWYKLSAgJWRlZmluZSBVTlNIQURPV19BUkdTIG1vdiByc3AsIHJicAotJWVuZGlmCi0KLTsgbXVzdCBrZWVwIFhNTTY6WE1NMTUgKGxpYnZweCB1c2VzIFhNTTYgYW5kIFhNTTcpIG9uIFdpbjY0IEFCSQotOyByc3AgcmVnaXN0ZXIgaGFzIHRvIGJlIGFsaWduZWQKLSVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKLSVtYWNybyBTQVZFX1hNTSAwCi0gIHN1YiByc3AsIDMyCi0gIG1vdmRxYSBYTU1XT1JEIFBUUiBbcnNwXSwgeG1tNgotICBtb3ZkcWEgWE1NV09SRCBQVFIgW3JzcCsxNl0sIHhtbTcKLSVlbmRtYWNybwotJW1hY3JvIFJFU1RPUkVfWE1NIDAKLSAgbW92ZHFhIHhtbTYsIFhNTVdPUkQgUFRSIFtyc3BdCi0gIG1vdmRxYSB4bW03LCBYTU1XT1JEIFBUUiBbcnNwKzE2XQotICBhZGQgcnNwLCAzMgotJWVuZG1hY3JvCi0lZWxzZQotJW1hY3JvIFNBVkVfWE1NIDAKLSVlbmRtYWNybwotJW1hY3JvIFJFU1RPUkVfWE1NIDAKLSVlbmRtYWNybwotJWVuZGlmCi0KLTsgTmFtZSBvZiB0aGUgcm9kYXRhIHNlY3Rpb24KLTsKLTsgLnJvZGF0YSBzZWVtcyB0byBiZSBhbiBlbGYtaXNtLCBhcyBpdCBkb2Vzbid0IHdvcmsgb24gT1NYLgotOwotJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLG1hY2hvNjQKLSVkZWZpbmUgU0VDVElPTl9ST0RBVEEgc2VjdGlvbiAudGV4dAotJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sbWFjaG8zMgotJW1hY3JvIFNFQ1RJT05fUk9EQVRBIDAKLXNlY3Rpb24gLnRleHQKLSVlbmRtYWNybwotJWVsc2UKLSVkZWZpbmUgU0VDVElPTl9ST0RBVEEgc2VjdGlvbiAucm9kYXRhCi0lZW5kaWYKLQotCi07IFRlbGwgR05VIGxkIHRoYXQgd2UgZG9uJ3QgcmVxdWlyZSBhbiBleGVjdXRhYmxlIHN0YWNrLgotJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjMyCi1zZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCi1zZWN0aW9uIC50ZXh0Ci0lZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGY2NAotc2VjdGlvbiAubm90ZS5HTlUtc3RhY2sgbm9hbGxvYyBub2V4ZWMgbm93cml0ZSBwcm9nYml0cwotc2VjdGlvbiAudGV4dAotJWVuZGlmCi0KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9hcm0vYXJtdjQvZ2VuX3NjYWxlcnNfYXJtdjQuYXNtIGIvdnB4X3NjYWxlL2FybS9hcm12NC9nZW5fc2NhbGVyc19hcm12NC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTUxODQuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL2FybS9hcm12NC9nZW5fc2NhbGVyc19hcm12NC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw3NzQgKzAsMCBAQAotOwotOyAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsKLTsgIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLTsgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotOyAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotOyAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotOyAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi07Ci0KLQotICAgIEVYUE9SVCAgfGhvcml6b250YWxfbGluZV80XzVfc2NhbGVfYXJtdjR8Ci0gICAgRVhQT1JUICB8dmVydGljYWxfYmFuZF80XzVfc2NhbGVfYXJtdjR8Ci0gICAgRVhQT1JUICB8aG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9hcm12NHwKLSAgICBFWFBPUlQgIHx2ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9hcm12NHwKLSAgICBFWFBPUlQgIHxob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2FybXY0fAotICAgIEVYUE9SVCAgfHZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2FybXY0fAotICAgIEVYUE9SVCAgfGhvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYXJtdjR8Ci0gICAgRVhQT1JUICB8dmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYXJtdjR8Ci0gICAgRVhQT1JUICB8aG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9hcm12NHwKLSAgICBFWFBPUlQgIHx2ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9hcm12NHwKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkgIDsgbmFtZSB0aGlzIGJsb2NrIG9mIGNvZGUKLQotc3JjICAgICAgICAgUk4gIHIwCi1zcmN3ICAgICAgICBSTiAgcjEKLWRlc3QgICAgICAgIFJOICByMgotbWFzayAgICAgICAgUk4gIHIxMgotYzUxXzIwNSAgICAgUk4gIHIxMAotYzEwMl8xNTQgICAgUk4gIHIxMQotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07ICoKLTsgKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV80XzVfc2NhbGVfYXJtdjQKLTsgKgotOyAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgZGF0YS4KLTsgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiAoTk9UIFVTRUQpLgotOyAqCi07ICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotOyAqCi07ICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi07ICoKLTsgKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzIGZyb20gc291cmNlIHRvCi07ICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDQgdG8gNS4KLTsgKgotOyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLTsgKgotOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotO3ZvaWQgaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9hcm12NAotOygKLTsgICByMCA9IFVJTlQ4ICpzb3VyY2UKLTsgICByMSA9IFVJTlQzMiBzb3VyY2Vfd2lkdGgKLTsgICByMiA9IFVJTlQ4ICpkZXN0Ci07ICAgcjMgPSBVSU5UMzIgZGVzdF93aWR0aAotOykKLXxob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2FybXY0fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBtb3YgICAgIG1hc2ssICMyNTUgICAgICAgICAgICAgIDsgbWFzayBmb3Igc2VsZWN0aW9uCi0gICAgbGRyICAgICBjNTFfMjA1LCA9MHgzMzAwY2QKLSAgICBsZHIgICAgIGMxMDJfMTU0LCA9MHg2NjAwOWEKLQotICAgIGxkciAgICAgcjMsIFtzcmNdLCAjNAotCi1obDQ1X2xvb3AKLQotICAgIGFuZCAgICAgcjQsIHIzLCBtYXNrICAgICAgICAgICAgOyBhID0gc3JjWzBdCi0gICAgYW5kICAgICByNSwgbWFzaywgcjMsIGxzciAjOCAgICA7IGIgPSBzcmNbMV0KLSAgICBzdHJiICAgIHI0LCBbZGVzdF0sICMxCi0KLSAgICBvcnIgICAgIHI2LCByNCwgcjUsIGxzbCAjMTYgICAgIDsgYiB8IGEKLSAgICBhbmQgICAgIHI3LCBtYXNrLCByMywgbHNyICMxNiAgIDsgYyA9IHNyY1syXQotICAgIG11bCAgICAgcjYsIGM1MV8yMDUsIHI2ICAgICAgICAgOyBhICogNTEgKyAyMDUgKiBiCi0KLSAgICBvcnIgICAgIHI1LCByNSwgcjcsIGxzbCAjMTYgICAgIDsgYyB8IGIKLSAgICBtdWwgICAgIHI1LCBjMTAyXzE1NCwgcjUgICAgICAgIDsgYiAqIDEwMiArIDE1NCAqIGMKLSAgICBhZGQgICAgIHI2LCByNiwgIzB4ODAwMAotICAgIGFuZCAgICAgcjgsIG1hc2ssIHIzLCBsc3IgIzI0ICAgOyBkID0gc3JjWzNdCi0gICAgbW92ICAgICByNiwgcjYsIGxzciAjMjQKLSAgICBzdHJiICAgIHI2LCBbZGVzdF0sICMxCi0KLSAgICBvcnIgICAgIHI3LCByOCwgcjcsIGxzbCAjMTYgICAgIDsgYyB8IGQKLSAgICBtdWwgICAgIHI3LCBjMTAyXzE1NCwgcjcgICAgICAgIDsgYyAqIDE1NCArIDEwMiAqIGQKLSAgICBhZGQgICAgIHI1LCByNSwgIzB4ODAwMAotICAgIGxkciAgICAgcjMsIFtzcmNdLCAjNAotICAgIG1vdiAgICAgcjUsIHI1LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNSwgW2Rlc3RdLCAjMQotCi0gICAgYWRkICAgICByNywgcjcsICMweDgwMDAKLSAgICBhbmQgICAgIHI5LCBtYXNrLCByMyAgICAgICAgICAgIDsgZSA9IHNyY1s0XQotICAgIG9yciAgICAgcjksIHI5LCByOCwgbHNsICMxNiAgICAgOyBkIHwgZQotICAgIG11bCAgICAgcjksIGM1MV8yMDUsIHI5ICAgICAgICAgOyBkICogMjA1ICsgNTEgKiBlCi0gICAgbW92ICAgICByNywgcjcsIGxzciAjMjQKLSAgICBzdHJiICAgIHI3LCBbZGVzdF0sICMxCi0KLSAgICBhZGQgICAgIHI5LCByOSwgIzB4ODAwMAotICAgIHN1YnMgICAgc3Jjdywgc3JjdywgIzQKLSAgICBtb3YgICAgIHI5LCByOSwgbHNyICMyNAotICAgIHN0cmIgICAgcjksIFtkZXN0XSwgIzEKLQotICAgIGJuZSAgICAgaGw0NV9sb29wCi0KLSAgICBhbmQgICAgIHI0LCByMywgbWFzawotICAgIGFuZCAgICAgcjUsIG1hc2ssIHIzLCBsc2wgIzgKLSAgICBzdHJiICAgIHI0LCBbZGVzdF0sICMxCi0KLSAgICBvcnIgICAgIHI2LCByNCwgcjUsIGxzbCAjMTYgICAgIDsgYiB8IGEKLSAgICBtdWwgICAgIHI2LCBjNTFfMjA1LCByNgotCi0gICAgYW5kICAgICByNywgbWFzaywgcjMsIGxzbCAjMTYKLSAgICBvcnIgICAgIHI1LCByNSwgcjcsIGxzbCAjMTYgICAgIDsgYyB8IGIKLSAgICBtdWwgICAgIHI1LCBjMTAyXzE1NCwgcjUKLSAgICBhZGQgICAgIHI2LCByNiwgIzB4ODAwMAotICAgIGFuZCAgICAgcjgsIG1hc2ssIHIzLCBsc2wgIzI0Ci0gICAgbW92ICAgICByNiwgcjYsIGxzciAjMjQKLSAgICBzdHJiICAgIHI2LCBbZGVzdF0sICMxCi0KLSAgICBvcnIgICAgIHI3LCByOCwgcjcsIGxzbCAjMTYgICAgIDsgYyB8IGQKLSAgICBtdWwgICAgIHI3LCBjMTAyXzE1NCwgcjcKLSAgICBhZGQgICAgIHI1LCByNSwgIzB4ODAwMAotICAgIG1vdiAgICAgcjUsIHI1LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNSwgW2Rlc3RdLCAjMQotCi0gICAgYWRkICAgICByNywgcjcsICMweDgwMDAKLSAgICBtb3YgICAgIHI3LCByNywgbHNyICMyNAotICAgIHN0cmIgICAgcjcsIFtkZXN0XSwgIzEKLQotICAgIGxkcmIgICAgcjMsIFtzcmNdCi0gICAgc3RyYiAgICByMywgW2Rlc3RdLCAjMQotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgICA7fHZwOGN4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfY3wKLQotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07ICoKLTsgKiAgUk9VVElORSAgICAgICA6IHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2FybXY0Ci07ICoKLTsgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgotOyAqCi07ICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotOyAqCi07ICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi07ICoKLTsgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSA0IHRvIDUuIFRoZQotOyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyA0LXBpeGVscy4KLTsgKgotOyAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotOyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4KLTsgKgotOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotO3ZvaWQgdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYXJtdjQKLTsoCi07ICAgcjAgPSBVSU5UOCAqZGVzdAotOyAgIHIxID0gVUlOVDMyIGRlc3RfcGl0Y2gKLTsgICByMiA9IFVJTlQzMiBkZXN0X3dpZHRoCi07KQotfHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2FybXY0fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIGM1MV8yMDUsID0weDMzMDBjZAotICAgIGxkciAgICAgYzEwMl8xNTQsID0weDY2MDA5YQotCi12bDQ1X2xvb3AKLSAgICBtb3YgICAgIHIzLCBzcmMKLSAgICBsZHJiICAgIHI0LCBbcjNdLCByMSAgICAgICAgICAgIDsgYSA9IGRlcyBbMF0KLSAgICBsZHJiICAgIHI1LCBbcjNdLCByMSAgICAgICAgICAgIDsgYiA9IGRlcyBbZGVzdF9waXRjaF0KLSAgICBsZHJiICAgIHI3LCBbcjNdLCByMSAgICAgICAgICAgIDsgYyA9IGRlc1tkZXN0X3BpdGNoKjJdCi0gICAgYWRkICAgICBsciwgc3JjLCByMQotCi0gICAgb3JyICAgICByNiwgcjQsIHI1LCBsc2wgIzE2ICAgICA7IGIgfCBhCi0gICAgbXVsICAgICByNiwgYzUxXzIwNSwgcjYgICAgICAgICA7IGEgKiA1MSArIDIwNSAqIGIKLQotICAgIGxkcmIgICAgcjgsIFtyM10sIHIxICAgICAgICAgICAgOyBkID0gZGVzW2Rlc3RfcGl0Y2gqM10KLSAgICBvcnIgICAgIHI1LCByNSwgcjcsIGxzbCAjMTYgICAgIDsgYyB8IGIKLSAgICBtdWwgICAgIHI1LCBjMTAyXzE1NCwgcjUgICAgICAgIDsgYiAqIDEwMiArIDE1NCAqIGMKLSAgICBhZGQgICAgIHI2LCByNiwgIzB4ODAwMAotICAgIG9yciAgICAgcjcsIHI4LCByNywgbHNsICMxNiAgICAgOyBjIHwgZAotICAgIG1vdiAgICAgcjYsIHI2LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNiwgW2xyXSwgcjEKLQotICAgIGxkcmIgICAgcjksIFtyMywgcjFdICAgICAgICAgICAgOyBlID0gZGVzIFtkZXN0X3BpdGNoICogNV0KLSAgICBtdWwgICAgIHI3LCBjMTAyXzE1NCwgcjcgICAgICAgIDsgYyAqIDE1NCArIDEwMiAqIGQKLSAgICBhZGQgICAgIHI1LCByNSwgIzB4ODAwMAotICAgIG9yciAgICAgcjksIHI5LCByOCwgbHNsICMxNiAgICAgOyBkIHwgZQotICAgIG1vdiAgICAgcjUsIHI1LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNSwgW2xyXSwgcjEKLQotICAgIG11bCAgICAgcjksIGM1MV8yMDUsIHI5ICAgICAgICAgOyBkICogMjA1ICsgNTEgKiBlCi0gICAgYWRkICAgICByNywgcjcsICMweDgwMDAKLSAgICBhZGQgICAgIHNyYywgc3JjLCAjMQotICAgIG1vdiAgICAgcjcsIHI3LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNywgW2xyXSwgcjEKLQotICAgIGFkZCAgICAgcjksIHI5LCAjMHg4MDAwCi0gICAgc3VicyAgICByMiwgcjIsICMxCi0gICAgbW92ICAgICByOSwgcjksIGxzciAjMjQKLSAgICBzdHJiICAgIHI5LCBbbHJdLCByMQotCi0gICAgYm5lICAgICB2bDQ1X2xvb3AKLQotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgO3x2ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9hcm12NHwKLQotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07ICoKLTsgKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYXJtdjQKLTsgKgotOyAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgZGF0YS4KLTsgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiAoTk9UIFVTRUQpLgotOyAqCi07ICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotOyAqCi07ICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi07ICoKLTsgKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzIGZyb20gc291cmNlIHRvCi07ICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDIgdG8gMy4KLTsgKgotOyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLTsgKgotOyAqCi07ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi07dm9pZCBob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2FybXY0Ci07KAotOyAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLTsgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotOyAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi07ICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLTspCi18aG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9hcm12NHwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQotICAgIGxkciAgICAgbHIsICA9ODUKLSAgICBsZHIgICAgIHIxMiwgPTE3MQotCi1obDIzX2xvb3AKLQotICAgIGxkcmIgICAgcjMsIFtzcmNdLCAjMSAgICAgICAgICAgOyBhCi0gICAgbGRyYiAgICByNCwgW3NyY10sICMxICAgICAgICAgICA7IGIKLSAgICBsZHJiICAgIHI1LCBbc3JjXSAgICAgICAgICAgICAgIDsgYwotCi0gICAgc3RyYiAgICByMywgW2Rlc3RdLCAjMQotICAgIG11bCAgICAgcjQsIHIxMiwgcjQgICAgICAgICAgICAgOyBiICogMTcxCi0gICAgbWxhICAgICByNiwgbHIsIHIzLCByNCAgICAgICAgICA7IGEgKiA4NQotICAgIG1sYSAgICAgcjcsIGxyLCByNSwgcjQgICAgICAgICAgOyBjICogODUKLQotICAgIGFkZCAgICAgcjYsIHI2LCAjMTI4Ci0gICAgbW92ICAgICByNiwgcjYsIGxzciAjOAotICAgIHN0cmIgICAgcjYsIFtkZXN0XSwgIzEKLQotICAgIGFkZCAgICAgcjcsIHI3LCAjMTI4Ci0gICAgbW92ICAgICByNywgcjcsIGxzciAjOAotICAgIHN0cmIgICAgcjcsIFtkZXN0XSwgIzEKLQotICAgIHN1YnMgICAgc3Jjdywgc3JjdywgIzIKLSAgICBibmUgICAgIGhsMjNfbG9vcAotCi0gICAgbGRyYiAgICByNCwgW3NyYywgIzFdICAgICAgICAgICA7IGIKLSAgICBzdHJiICAgIHI1LCBbZGVzdF0sICMxCi0gICAgc3RyYiAgICByNCwgW2Rlc3QsICMxXQotCi0gICAgbXVsICAgICByNCwgcjEyLCByNCAgICAgICAgICAgICA7IGIgKiAxNzEKLSAgICBtbGEgICAgIHI2LCBsciwgcjUsIHI0ICAgICAgICAgIDsgYSAqIDg1ICsgYiAqMTcxCi0KLSAgICBhZGQgICAgIHI2LCByNiwgIzEyOAotICAgIG1vdiAgICAgcjYsIHI2LCBsc3IgIzgKLSAgICBzdHJiICAgIHI2LCBbZGVzdF0KLQotICAgIGxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotICAgIEVORFAgICAgO3xob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2FybXY0fAotCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsgKgotOyAqICBST1VUSU5FICAgICAgIDogdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYXJtdjQKLTsgKgotOyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KLTsgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi07ICoKLTsgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi07ICoKLTsgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLTsgKgotOyAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDIgdG8gMy4gVGhlCi07ICogICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGJhbmQgc2NhbGVkIGlzIDItcGl4ZWxzLgotOyAqCi07ICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci07ICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLgotOyAqCi07ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi07dm9pZCB2ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9hcm12NAotOygKLTsgICByMCA9IFVJTlQ4ICpkZXN0Ci07ICAgcjEgPSBVSU5UMzIgZGVzdF9waXRjaAotOyAgIHIyID0gVUlOVDMyIGRlc3Rfd2lkdGgKLTspCi18dmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYXJtdjR8IFBST0MKLSAgICBzdG1kYiAgIHNwISwge3I0IC0gcjgsIGxyfQotICAgIGxkciAgICAgbHIsICA9ODUKLSAgICBsZHIgICAgIHIxMiwgPTE3MQotICAgIGFkZCAgICAgcjMsIHIxLCByMSwgbHNsICMxICAgICAgOyAzICogZGVzdF9waXRjaAotCi12bDIzX2xvb3AKLSAgICBsZHJiICAgIHI0LCBbc3JjXSAgICAgICAgICAgICAgIDsgYSA9IGRlcyBbMF0KLSAgICBsZHJiICAgIHI1LCBbc3JjLCByMV0gICAgICAgICAgIDsgYiA9IGRlcyBbZGVzdF9waXRjaF0KLSAgICBsZHJiICAgIHI3LCBbc3JjLCByM10gICAgICAgICAgIDsgYyA9IGRlcyBbZGVzdF9waXRjaCozXQotICAgIHN1YnMgICAgcjIsIHIyLCAjMQotCi0gICAgbXVsICAgICByNSwgcjEyLCByNSAgICAgICAgICAgICA7IGIgKiAxNzEKLSAgICBtbGEgICAgIHI2LCBsciwgcjQsIHI1ICAgICAgICAgIDsgYSAqIDg1Ci0gICAgbWxhICAgICByOCwgbHIsIHI3LCByNSAgICAgICAgICA7IGMgKiA4NQotCi0gICAgYWRkICAgICByNiwgcjYsICMxMjgKLSAgICBtb3YgICAgIHI2LCByNiwgbHNyICM4Ci0gICAgc3RyYiAgICByNiwgW3NyYywgcjFdCi0KLSAgICBhZGQgICAgIHI4LCByOCwgIzEyOAotICAgIG1vdiAgICAgcjgsIHI4LCBsc3IgIzgKLSAgICBzdHJiICAgIHI4LCBbc3JjLCByMSwgbHNsICMxXQotCi0gICAgYWRkICAgICBzcmMsIHNyYywgIzEKLQotICAgIGJuZSAgICAgdmwyM19sb29wCi0KLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjgsIHBjfQotICAgIEVORFAgICAgO3x2ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9hcm12NHwKLQotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07ICoKLTsgKiAgUk9VVElORSAgICAgICA6IHZwOGN4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYwotOyAqCi07ICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6IFN0cmlkZSBvZiBzb3VyY2UuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCi07ICoKLTsgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi07ICoKLTsgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLTsgKgotOyAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KLTsgKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNjYWxpbmcgdXAgYnkgMyB0byA1LgotOyAqCi07ICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotOyAqCi07ICoKLTsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLTt2b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYwotOygKLTsgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCi07ICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKLTsgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotOyAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCi07KQotfGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYXJtdjR8IFBST0MKLSAgICBzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICAgIGxkciAgICAgYzUxXzIwNSwgPTB4MzMwMGNkCi0gICAgbGRyICAgICBjMTAyXzE1NCwgPTB4NjYwMDlhCi0KLSAgICBsZHJiICAgIHI0LCBbc3JjXSwgIzEgICAgICAgICAgIDsgYSA9IHNyY1swXQotCi1obDM1X2xvb3AKLQotICAgIGxkcmIgICAgcjgsIFtzcmNdLCAjMSAgICAgICAgICAgOyBiID0gc3JjWzFdCi0gICAgc3RyYiAgICByNCwgW2Rlc3RdLCAjMQotCi0gICAgb3JyICAgICByNiwgcjQsIHI4LCBsc2wgIzE2ICAgICA7IGIgfCBhCi0gICAgbGRyYiAgICByOSwgW3NyY10sICMxICAgICAgICAgICA7IGMgPSBzcmNbMl0KLSAgICBtdWwgICAgIHI2LCBjMTAyXzE1NCwgcjYgICAgICAgIDsgYSAqIDEwMiArIDE1NCAqIGIKLQotICAgIG9yciAgICAgcjUsIHI5LCByOCwgbHNsICMxNiAgICAgOyBiIHwgYwotICAgIG11bCAgICAgcjUsIGM1MV8yMDUsIHI1ICAgICAgICAgOyBiICogMjA1ICsgNTEgKiBjCi0gICAgYWRkICAgICByNiwgcjYsICMweDgwMDAKLSAgICBsZHJiICAgIHI0LCBbc3JjXSwgIzEgICAgICAgICAgIDsgZCA9IHNyY1szXQotICAgIG1vdiAgICAgcjYsIHI2LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNiwgW2Rlc3RdLCAjMQotCi0gICAgb3JyICAgICByNywgcjgsIHI5LCBsc2wgIzE2ICAgICA7IGMgfCBiCi0gICAgbXVsICAgICByNywgYzUxXzIwNSwgcjcgICAgICAgICA7IGMgKiAyMDUgKyAxNTQgKiBiCi0gICAgYWRkICAgICByNSwgcjUsICMweDgwMDAKLSAgICBtb3YgICAgIHI1LCByNSwgbHNyICMyNAotICAgIHN0cmIgICAgcjUsIFtkZXN0XSwgIzEKLQotICAgIG9yciAgICAgcjksIHI0LCByOSwgbHNsICMxNiAgICAgOyBjIHwgZAotICAgIG11bCAgICAgcjksIGMxMDJfMTU0LCByOSAgICAgICAgOyBjICogMTU0ICsgMTAyICogZAotICAgIGFkZCAgICAgcjcsIHI3LCAjMHg4MDAwCi0gICAgbW92ICAgICByNywgcjcsIGxzciAjMjQKLSAgICBzdHJiICAgIHI3LCBbZGVzdF0sICMxCi0KLSAgICBhZGQgICAgIHI5LCByOSwgIzB4ODAwMAotICAgIHN1YnMgICAgc3Jjdywgc3JjdywgIzMKLSAgICBtb3YgICAgIHI5LCByOSwgbHNyICMyNAotICAgIHN0cmIgICAgcjksIFtkZXN0XSwgIzEKLQotICAgIGJwbCAgICAgaGwzNV9sb29wCi0KLSAgICBsZHJiICAgIHI1LCBbc3JjXSwgIzEgICAgICAgICAgIDsgYiA9IHNyY1sxXQotICAgIHN0cmIgICAgcjQsIFtkZXN0XSwgIzEKLQotICAgIG9yciAgICAgcjYsIHI0LCByOCwgbHNsICMxNiAgICAgOyBiIHwgYQotICAgIGxkcmIgICAgcjksIFtzcmNdLCAjMSAgICAgICAgICAgOyBjID0gc3JjWzJdCi0gICAgbXVsICAgICByNiwgYzEwMl8xNTQsIHI2ICAgICAgICA7IGEgKiAxMDIgKyAxNTQgKiBiCi0KLSAgICBvcnIgICAgIHI1LCByOSwgcjgsIGxzbCAjMTYgICAgIDsgYiB8IGMKLSAgICBtdWwgICAgIHI1LCBjNTFfMjA1LCByNSAgICAgICAgIDsgYiAqIDIwNSArIDUxICogYwotICAgIGFkZCAgICAgcjYsIHI2LCAjMHg4MDAwCi0gICAgbW92ICAgICByNiwgcjYsIGxzciAjMjQKLSAgICBzdHJiICAgIHI2LCBbZGVzdF0sICMxCi0KLSAgICBvcnIgICAgIHI3LCByOCwgcjksIGxzbCAjMTYgICAgIDsgYyB8IGIKLSAgICBtdWwgICAgIHI3LCBjNTFfMjA1LCByNyAgICAgICAgIDsgYyAqIDIwNSArIDE1NCAqIGIKLSAgICBhZGQgICAgIHI1LCByNSwgIzB4ODAwMAotICAgIG1vdiAgICAgcjUsIHI1LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNSwgW2Rlc3RdLCAjMQotCi0gICAgYWRkICAgICByNywgcjcsICMweDgwMDAKLSAgICBtb3YgICAgIHI3LCByNywgbHNyICMyNAotICAgIHN0cmIgICAgcjcsIFtkZXN0XSwgIzEKLSAgICBzdHJiICAgIHI5LCBbZGVzdF0sICMxCi0KLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KLSAgICBFTkRQICAgIDt8dnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jfAotCi0KLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyAqCi07ICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCi07ICoKLTsgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgotOyAqCi07ICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotOyAqCi07ICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi07ICoKLTsgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSAzIHRvIDUuIFRoZQotOyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAzLXBpeGVscy4KLTsgKgotOyAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotOyAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4KLTsgKgotOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotO3ZvaWQgdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYXJtdjQKLTsoCi07ICAgcjAgPSBVSU5UOCAqZGVzdAotOyAgIHIxID0gVUlOVDMyIGRlc3RfcGl0Y2gKLTsgICByMiA9IFVJTlQzMiBkZXN0X3dpZHRoCi07KQotfHZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2FybXY0fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIGM1MV8yMDUsID0weDMzMDBjZAotICAgIGxkciAgICAgYzEwMl8xNTQsID0weDY2MDA5YQotCi12bDM1X2xvb3AKLSAgICBtb3YgICAgIHIzLCBzcmMKLSAgICBsZHJiICAgIHI0LCBbcjNdLCByMSAgICAgICAgICAgIDsgYSA9IGRlcyBbMF0KLSAgICBsZHJiICAgIHI1LCBbcjNdLCByMSAgICAgICAgICAgIDsgYiA9IGRlcyBbZGVzdF9waXRjaF0KLSAgICBsZHJiICAgIHI3LCBbcjNdLCByMSAgICAgICAgICAgIDsgYyA9IGRlc1tkZXN0X3BpdGNoKjJdCi0gICAgYWRkICAgICBsciwgc3JjLCByMQotCi0gICAgb3JyICAgICByOCwgcjQsIHI1LCBsc2wgIzE2ICAgICA7IGIgfCBhCi0gICAgbXVsICAgICByNiwgYzEwMl8xNTQsIHI4ICAgICAgICA7IGEgKiAxMDIgKyAxNTQgKiBiCi0KLSAgICBsZHJiICAgIHI4LCBbcjMsIHIxLCBsc2wgIzFdICAgIDsgZCA9IGRlc1tkZXN0X3BpdGNoKjVdCi0gICAgb3JyICAgICByMywgcjcsIHI1LCBsc2wgIzE2ICAgICA7IGIgfCBjCi0gICAgbXVsICAgICByOSwgYzUxXzIwNSwgcjMgICAgICAgICA7IGIgKiAyMDUgKyA1MSAqIGMKLSAgICBhZGQgICAgIHI2LCByNiwgIzB4ODAwMAotICAgIG9yciAgICAgcjMsIHI1LCByNywgbHNsICMxNiAgICAgOyBjIHwgYgotICAgIG1vdiAgICAgcjYsIHI2LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNiwgW2xyXSwgcjEKLQotICAgIG11bCAgICAgcjUsIGM1MV8yMDUsIHIzICAgICAgICAgOyBjICogMjA1ICsgMTU0ICogYgotICAgIGFkZCAgICAgcjksIHI5LCAjMHg4MDAwCi0gICAgb3JyICAgICByMywgcjgsIHI3LCBsc2wgIzE2ICAgICA7IGMgfCBkCi0gICAgbW92ICAgICByOSwgcjksIGxzciAjMjQKLSAgICBzdHJiICAgIHI5LCBbbHJdLCByMQotCi0gICAgbXVsICAgICByNywgYzEwMl8xNTQsIHIzICAgICAgICA7IGMgKiAxNTQgKyAxMDIgKiBkCi0gICAgYWRkICAgICByNSwgcjUsICMweDgwMDAKLSAgICBhZGQgICAgIHNyYywgc3JjLCAjMQotICAgIG1vdiAgICAgcjUsIHI1LCBsc3IgIzI0Ci0gICAgc3RyYiAgICByNSwgW2xyXSwgcjEKLQotICAgIGFkZCAgICAgcjcsIHI3LCAjMHg4MDAwCi0gICAgc3VicyAgICByMiwgcjIsICMxCi0gICAgbW92ICAgICByNywgcjcsIGxzciAjMjQKLSAgICBzdHJiICAgIHI3LCBbbHJdLCByMQotCi0KLSAgICBibmUgICAgIHZsMzVfbG9vcAotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgICA7fHZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2FybXY0fAotCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsgKgotOyAqICBST1VUSU5FICAgICAgIDogaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9hcm12NAotOyAqCi07ICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6IFN0cmlkZSBvZiBzb3VyY2UuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCi07ICoKLTsgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi07ICoKLTsgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLTsgKgotOyAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KLTsgKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNjYWxpbmcgdXAgYnkgMyB0byA0LgotOyAqCi07ICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotOyAqCi07ICoKLTsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLTt2b2lkIGhvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYXJtdjQKLTsoCi07ICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotOyAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi07ICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLTsgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotOykKLXxob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2FybXY0fCBQUk9DCi0gICAgc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgICBsZHIgICAgIHIxMCwgPTY0Ci0gICAgbGRyICAgICByMTEsID0xOTIKLSAgICBtb3YgICAgIHI5LCAjMTI4Ci0KLSAgICBsZHJiICAgIHI0LCBbc3JjXSwgIzEgICAgICAgICAgIDsgYSA9IHNyY1swXQotCi1obDM0X2xvb3AKLQotICAgIGxkcmIgICAgcjgsIFtzcmNdLCAjMSAgICAgICAgICAgOyBiID0gc3JjWzFdCi0gICAgbGRyYiAgICByNywgW3NyY10sICMxICAgICAgICAgICA7IGMgPSBzcmNbMl0KLSAgICBzdHJiICAgIHI0LCBbZGVzdF0sICMxCi0KLSAgICBtbGEgICAgIHI0LCByMTAsIHI0LCByOSAgICAgICAgIDsgYSo2NCArIDEyOAotICAgIG1sYSAgICAgcjQsIHIxMSwgcjgsIHI0ICAgICAgICAgOyBhKjY0ICsgYioxOTIgKyAxCi0KLSAgICBhZGQgICAgIHI4LCByOCwgIzEgICAgICAgICAgICAgIDsgYiArIDEKLSAgICBhZGQgICAgIHI4LCByOCwgcjcgICAgICAgICAgICAgIDsgYiArIGMgKyAxCi0gICAgbW92ICAgICByOCwgcjgsIGFzciAjMSAgICAgICAgICA7IChiICsgYyArIDEpID4+IDEKLQotICAgIG1vdiAgICAgcjQsIHI0LCBhc3IgIzggICAgICAgICAgOyAoYSo2NCArIGIqMTkyICsgMSkgPj4gOAotICAgIHN0cmIgICAgcjQsIFtkZXN0XSwgIzEKLQotICAgIHN0cmIgICAgcjgsIFtkZXN0XSwgIzEKLQotICAgIGxkcmIgICAgcjQsIFtzcmNdLCAjMSAgICAgICAgICAgOyBbYSsxXQotCi0gICAgbWxhICAgICByNywgcjExLCByNywgcjkgICAgICAgICA7IGMqMTkyICsgMTI4Ci0gICAgbWxhICAgICByNywgcjQsIHIxMCwgcjcgICAgICAgICA7IGEqNjQgKyBiKjE5MiArIDEyOAotCi0gICAgc3VicyAgICBzcmN3LCBzcmN3LCAjMwotCi0gICAgbW92ICAgICByNywgcjcsIGFzciAjOCAgICAgICAgICA7IChhKjY0ICsgYioxOTIgKyAxMjgpID4+IDgKLSAgICBzdHJiICAgIHI3LCBbZGVzdF0sICMxCi0KLSAgICBicGwgICAgIGhsMzRfbG9vcAotCi0gICAgbGRyYiAgICByOCwgW3NyY10sICMxICAgICAgICAgICA7IGIgPSBzcmNbMV0KLSAgICBsZHJiICAgIHI3LCBbc3JjXSwgIzEgICAgICAgICAgIDsgYyA9IHNyY1syXQotICAgIHN0cmIgICAgcjQsIFtkZXN0XSwgIzEKLQotICAgIG1sYSAgICAgcjQsIHIxMCwgcjQsIHI5ICAgICAgICAgOyBhKjY0ICsgMTI4Ci0gICAgbWxhICAgICByNCwgcjExLCByOCwgcjQgICAgICAgICA7IGEqNjQgKyBiKjE5MiArIDEKLSAgICBtb3YgICAgIHI0LCByNCwgYXNyICM4ICAgICAgICAgIDsgKGEqNjQgKyBiKjE5MiArIDEpID4+IDgKLSAgICBzdHJiICAgIHI0LCBbZGVzdF0sICMxCi0KLSAgICBhZGQgICAgIHI4LCByOCwgIzEgICAgICAgICAgICAgIDsgYiArIDEKLSAgICBhZGQgICAgIHI4LCByOCwgcjcgICAgICAgICAgICAgIDsgYiArIGMgKyAxCi0gICAgbW92ICAgICByOCwgcjgsIGFzciAjMSAgICAgICAgICA7IChiICsgYyArIDEpID4+IDEKLSAgICBzdHJiICAgIHI4LCBbZGVzdF0sICMxCi0gICAgc3RyYiAgICByNywgW2Rlc3RdLCAjMQotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0gICAgRU5EUCAgICA7fHZwOGN4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfY3wKLQotCi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsgKgotOyAqICBST1VUSU5FICAgICAgIDogdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYXJtdjQKLTsgKgotOyAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KLTsgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi07ICoKLTsgKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi07ICoKLTsgKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLTsgKgotOyAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDMgdG8gNC4gVGhlCi07ICogICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGJhbmQgc2NhbGVkIGlzIDMtcGl4ZWxzLgotOyAqCi07ICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci07ICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLgotOyAqCi07ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi07dm9pZCB2ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9hcm12NAotOygKLTsgICByMCA9IFVJTlQ4ICpkZXN0Ci07ICAgcjEgPSBVSU5UMzIgZGVzdF9waXRjaAotOyAgIHIyID0gVUlOVDMyIGRlc3Rfd2lkdGgKLTspCi18dmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYXJtdjR8IFBST0MKLSAgICBzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICAgIGxkciAgICAgcjEwLCA9NjQKLSAgICBsZHIgICAgIHIxMSwgPTE5MgotICAgIG1vdiAgICAgcjksICMxMjgKLQotOyAgIGxkciAgICAgcjEsW3IxXQotdmwzNF9sb29wCi0gICAgbW92ICAgICByMywgc3JjCi0gICAgbGRyYiAgICByNCwgW3IzXSwgcjEgICAgICAgICAgICA7IGEgPSBkZXMgWzBdCi0gICAgbGRyYiAgICByNSwgW3IzXSwgcjEgICAgICAgICAgICA7IGIgPSBkZXMgW2Rlc3RfcGl0Y2hdCi0gICAgbGRyYiAgICByNywgW3IzXSwgcjEgICAgICAgICAgICA7IGMgPSBkZXMgW2Rlc3RfcGl0Y2gqMl0KLSAgICBhZGQgICAgIGxyLCBzcmMsIHIxCi0KLSAgICBtbGEgICAgIHI0LCByMTAsIHI0LCByOSAgICAgICAgIDsgYSo2NCArIDEyOAotICAgIG1sYSAgICAgcjQsIHIxMSwgcjUsIHI0ICAgICAgICAgOyBhKjY0ICsgYioxOTIgKyAxCi0KLSAgICBhZGQgICAgIHI1LCByNSwgIzEgICAgICAgICAgICAgIDsgYiArIDEKLSAgICBhZGQgICAgIHI1LCByNSwgcjcgICAgICAgICAgICAgIDsgYiArIGMgKyAxCi0gICAgbW92ICAgICByNSwgcjUsIGFzciAjMSAgICAgICAgICA7IChiICsgYyArIDEpID4+IDEKLQotICAgIG1vdiAgICAgcjQsIHI0LCBhc3IgIzggICAgICAgICAgOyAoYSo2NCArIGIqMTkyICsgMSkgPj4gOAotICAgIHN0cmIgICAgcjQsIFtscl0sIHIxCi0KLSAgICBsZHJiICAgIHI0LCBbcjMsIHIxXSAgICAgICAgICAgIDsgYSA9IGRlcyBbZGVzdF9waXRjaCo0XQotCi0gICAgc3RyYiAgICByNSwgW2xyXSwgcjEKLQotICAgIG1sYSAgICAgcjcsIHIxMSwgcjcsIHI5ICAgICAgICAgOyBjKjE5MiArIDEyOAotICAgIG1sYSAgICAgcjcsIHI0LCByMTAsIHI3ICAgICAgICAgOyBhKjY0ICsgYioxOTIgKyAxMjgKLSAgICBtb3YgICAgIHI3LCByNywgYXNyICM4ICAgICAgICAgIDsgKGEqNjQgKyBiKjE5MiArIDEyOCkgPj4gOAotCi0gICAgYWRkICAgICBzcmMsIHNyYywgIzEKLSAgICBzdWJzICAgIHIyLCByMiwgIzEKLQotICAgIHN0cmIgICAgcjcsIFtscl0KLQotICAgIGJuZSAgICAgdmwzNF9sb29wCi0KLSAgICBsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KLSAgICBFTkRQICAgIDt8dmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYXJtdjR8Ci0KLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyAqCi07ICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKLTsgKgotOyAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgZGF0YS4KLTsgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiAoTk9UIFVTRUQpLgotOyAqCi07ICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotOyAqCi07ICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi07ICoKLTsgKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzIGZyb20gc291cmNlIHRvCi07ICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDEgdG8gMi4KLTsgKgotOyAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLTsgKgotOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotO3ZvaWQgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jCi07KAotOyAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLTsgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotOyAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi07ICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLTspCi18aG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9hcm12NHwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQgLSByNSwgbHJ9Ci0KLSAgICBzdWIgICAgIHNyY3csIHNyY3csICMxCi0KLSAgICBsZHJiICAgIHIzLCBbc3JjXSwgIzEKLSAgICBsZHJiICAgIHI0LCBbc3JjXSwgIzEKLWhsMTJfbG9vcAotICAgIHN1YnMgICAgc3Jjdywgc3JjdywgIzEKLQotICAgIGFkZCAgICAgcjUsIHIzLCByNAotICAgIGFkZCAgICAgcjUsIHI1LCAjMQotICAgIG1vdiAgICAgcjUsIHI1LCBsc3IgIzEKLQotICAgIG9yciAgICAgcjUsIHIzLCByNSwgbHNsICM4Ci0gICAgc3RyaCAgICByNSwgW2Rlc3RdLCAjMgotCi0gICAgbW92ICAgICByMywgcjQKLQotICAgIGxkcm5lYiAgcjQsIFtzcmNdLCAjMQotICAgIGJuZSAgICAgaGwxMl9sb29wCi0KLSAgICBvcnIgICAgIHI1LCByNCwgcjQsIGxzbCAjOAotICAgIHN0cmggICAgcjUsIFtkZXN0XQotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHI1LCBwY30KLSAgICBFTkRQICAgIDt8dmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYXJtdjR8Ci0KLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyAqCi07ICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCi07ICoKLTsgKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi07ICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotOyAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgotOyAqCi07ICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotOyAqCi07ICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi07ICoKLTsgKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSAxIHRvIDIuIFRoZQotOyAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAxLXBpeGVsLgotOyAqCi07ICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci07ICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLgotOyAqCi07ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi07dm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCi07KAotOyAgIHIwID0gVUlOVDggKmRlc3QKLTsgICByMSA9IFVJTlQzMiBkZXN0X3BpdGNoCi07ICAgcjIgPSBVSU5UMzIgZGVzdF93aWR0aAotOykKLXx2ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9hcm12NHwgUFJPQwotICAgIHN0bWRiICAgc3AhLCB7cjQgLSByNywgbHJ9Ci0KLSAgICBsZHIgICAgIG1hc2ssID0weGZmMDBmZiAgICAgICAgICAgICA7IG1hc2sgZm9yIHNlbGVjdGlvbgotICAgIGxkciAgICAgbHIsID0gMHgwMTAwMDEKLQotdmwxMl9sb29wCi0gICAgbW92ICAgICByMywgc3JjCi0gICAgbGRyICAgICByNCwgW3IzXSwgcjEKLSAgICBsZHIgICAgIHI1LCBbcjMsIHIxXQotCi0gICAgYWRkICAgICBzcmMsIHNyYywgIzQKLSAgICBzdWJzICAgIHIyLCByMiwgIzQKLQotICAgIGFuZCAgICAgcjYsIHI0LCBtYXNrCi0gICAgYW5kICAgICByNywgcjUsIG1hc2sKLQotICAgIGFkZCAgICAgcjYsIHI3LCByNgotICAgIGFkZCAgICAgcjYsIHI2LCBscgotCi0gICAgYW5kICAgICByNCwgbWFzaywgcjQsIGxzciAjOAotICAgIGFuZCAgICAgcjUsIG1hc2ssIHI1LCBsc3IgIzgKLQotICAgIG1vdiAgICAgcjYsIHI2LCBsc3IgIzEKLSAgICBhbmQgICAgIHI2LCByNiwgbWFzawotCi0gICAgYWRkICAgICByNCwgcjUsIHI0Ci0gICAgYWRkICAgICByNCwgcjQsIGxyCi0KLSAgICBtb3YgICAgIHI0LCByNCwgbHNyICMxCi0gICAgYW5kICAgICByNCwgcjQsIG1hc2sKLQotICAgIG9yciAgICAgcjUsIHI2LCByNCwgbHNsICM4Ci0KLSAgICBzdHIgICAgIHI1LCBbcjNdCi0KLSAgICBicGwgICAgIHZsMTJfbG9vcAotCi0gICAgbGRtaWEgICBzcCEsIHtyNCAtIHI3LCBwY30KLSAgICBFTkRQICAgIDt8dmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYXJtdjR8Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9hcm0vbmRzL3l2MTJleHRlbmQuYyBiL3ZweF9zY2FsZS9hcm0vbmRzL3l2MTJleHRlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjMGRmYi4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvYXJtL25kcy95djEyZXh0ZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgTW9kdWxlIFRpdGxlIDogICAgIHl2MTJleHRlbmQuYwotKgotKiAgIERlc2NyaXB0aW9uICA6Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBIZWFkZXIgRmlsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAidnB4X3NjYWxlL3l2MTJjb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlIDxuaXRyby5oPgotI2luY2x1ZGUgPG5pdHJvL21pLmg+Ci0jaW5jbHVkZSA8bml0cm8vaXRjbV9iZWdpbi5oPgotCi0vLy0tLS0gRE1BIE51bWJlcgotI2RlZmluZSBETUFfTk8gIDMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEV4cG9ydHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpCi17Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqc3JjX3B0cjEsICpzcmNfcHRyMjsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0X3B0cjEsICpkZXN0X3B0cjI7Ci0KLSAgICB1bnNpZ25lZCBpbnQgQm9yZGVyOwotICAgIGludCBwbGFuZV9zdHJpZGU7Ci0gICAgaW50IHBsYW5lX2hlaWdodDsKLSAgICBpbnQgcGxhbmVfd2lkdGg7Ci0KLSAgICAvKioqKioqKioqKiovCi0gICAgLyogWSBQbGFuZSAqLwotICAgIC8qKioqKioqKioqKi8KLSAgICBCb3JkZXIgPSB5YmYtPmJvcmRlcjsKLSAgICBwbGFuZV9zdHJpZGUgPSB5YmYtPnlfc3RyaWRlOwotICAgIHBsYW5lX2hlaWdodCA9IHliZi0+eV9oZWlnaHQ7Ci0gICAgcGxhbmVfd2lkdGggPSB5YmYtPnlfd2lkdGg7Ci0KLSAgICAvLyBjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0Ci0gICAgc3JjX3B0cjEgPSB5YmYtPnlfYnVmZmVyOwotICAgIHNyY19wdHIyID0gc3JjX3B0cjEgKyBwbGFuZV93aWR0aCAtIDE7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXI7Ci0gICAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgbWlfY3B1X2ZpbGw4KGRlc3RfcHRyMSwgc3JjX3B0cjFbMF0sIEJvcmRlcik7Ci0gICAgICAgIG1pX2NwdV9maWxsOChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOwotICAgICAgICBzcmNfcHRyMSAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOwotICAgIH0KLQotICAgIC8vIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycwotICAgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlciAtIEJvcmRlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKLSAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KUJvcmRlcjsgaSsrKQotICAgIHsKLSAgICAgICAgbWlfY3B1X2NvcHlfZmFzdChzcmNfcHRyMSwgZGVzdF9wdHIxLCBwbGFuZV9zdHJpZGUpOwotICAgICAgICBtaV9jcHVfY29weV9mYXN0KHNyY19wdHIyLCBkZXN0X3B0cjIsIHBsYW5lX3N0cmlkZSk7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcGxhbmVfc3RyaWRlIC89IDI7Ci0gICAgcGxhbmVfaGVpZ2h0IC89IDI7Ci0gICAgcGxhbmVfd2lkdGggLz0gMjsKLSAgICBCb3JkZXIgLz0gMjsKLQotICAgIC8qKioqKioqKioqKi8KLSAgICAvKiBVIFBsYW5lICovCi0gICAgLyoqKioqKioqKioqLwotCi0gICAgLy8gY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dAotICAgIHNyY19wdHIxID0geWJmLT51X2J1ZmZlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOwotICAgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gQm9yZGVyOwotICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG1pX2NwdV9maWxsOChkZXN0X3B0cjEsIHNyY19wdHIxWzBdLCBCb3JkZXIpOwotICAgICAgICBtaV9jcHVfZmlsbDgoZGVzdF9wdHIyLCBzcmNfcHRyMlswXSwgQm9yZGVyKTsKLSAgICAgICAgc3JjX3B0cjEgICs9IHBsYW5lX3N0cmlkZTsKLSAgICAgICAgc3JjX3B0cjIgICs9IHBsYW5lX3N0cmlkZTsKLSAgICAgICAgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZTsKLSAgICAgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKLSAgICB9Ci0KLSAgICAvLyBOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMKLSAgICBzcmNfcHRyMSA9IHliZi0+dV9idWZmZXIgLSBCb3JkZXI7Ci0gICAgc3JjX3B0cjIgPSBzcmNfcHRyMSArIChwbGFuZV9oZWlnaHQgKiBwbGFuZV9zdHJpZGUpIC0gcGxhbmVfc3RyaWRlOwotICAgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gKEJvcmRlciAqIHBsYW5lX3N0cmlkZSk7Ci0gICAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyBwbGFuZV9zdHJpZGU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoQm9yZGVyKTsgaSsrKQotICAgIHsKLSAgICAgICAgbWlfY3B1X2NvcHlfZmFzdChzcmNfcHRyMSwgZGVzdF9wdHIxLCBwbGFuZV9zdHJpZGUpOwotICAgICAgICBtaV9jcHVfY29weV9mYXN0KHNyY19wdHIyLCBkZXN0X3B0cjIsIHBsYW5lX3N0cmlkZSk7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqLwotICAgIC8qIFYgUGxhbmUgKi8KLSAgICAvKioqKioqKioqKiovCi0KLSAgICAvLyBjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0Ci0gICAgc3JjX3B0cjEgPSB5YmYtPnZfYnVmZmVyOwotICAgIHNyY19wdHIyID0gc3JjX3B0cjEgKyBwbGFuZV93aWR0aCAtIDE7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXI7Ci0gICAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgbWlfY3B1X2ZpbGw4KGRlc3RfcHRyMSwgc3JjX3B0cjFbMF0sIEJvcmRlcik7Ci0gICAgICAgIG1pX2NwdV9maWxsOChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOwotICAgICAgICBzcmNfcHRyMSAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOwotICAgIH0KLQotICAgIC8vIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycwotICAgIHNyY19wdHIxID0geWJmLT52X2J1ZmZlciAtIEJvcmRlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKLSAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShCb3JkZXIpOyBpKyspCi0gICAgewotICAgICAgICBtaV9jcHVfY29weV9mYXN0KHNyY19wdHIxLCBkZXN0X3B0cjEsIHBsYW5lX3N0cmlkZSk7Ci0gICAgICAgIG1pX2NwdV9jb3B5X2Zhc3Qoc3JjX3B0cjIsIGRlc3RfcHRyMiwgcGxhbmVfc3RyaWRlKTsKLSAgICAgICAgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZTsKLSAgICAgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKLSAgICB9Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgUk9VVElORSAgICAgICA6IHZwOF95djEyX2NvcHlfZnJhbWUKLSoKLSogIElOUFVUUyAgICAgICAgOgotKgotKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0qCi0qICBSRVRVUk5TICAgICAgIDogdm9pZAotKgotKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyB0aGUgc291cmNlIGltYWdlIGludG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIGFuZAotKiAgICAgICAgICAgICAgICAgIHVwZGF0ZXMgdGhlIGRlc3RpbmF0aW9uJ3MgVU1WIGJvcmRlcnMuCi0qCi0qICBTUEVDSUFMIE5PVEVTIDogVGhlIGZyYW1lcyBhcmUgYXNzdW1lZCB0byBiZSBpZGVudGljYWwgaW4gc2l6ZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi12cDhfeXYxMl9jb3B5X2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKQotewotICAgIGludCB5cGxhbmVfc2l6ZSA9IChzcmNfeWJjLT55X2hlaWdodCArIDIgKiBzcmNfeWJjLT5ib3JkZXIpICogKHNyY195YmMtPnlfc3RyaWRlKTsKLSAgICBpbnQgbWVtX3NpemUgPSAoeXBsYW5lX3NpemUgKiAzIC8gMikgKyAoc3JjX3liYy0+eV9zdHJpZGUgKiAyKTsKLQotICAgIG1pX2NwdV9jb3B5X2Zhc3Qoc3JjX3liYy0+YnVmZmVyX2FsbG9jLCBkc3RfeWJjLT5idWZmZXJfYWxsb2MsIG1lbV9zaXplKTsKLQotICAgIC8qICB1bnNpZ25lZCBjaGFyICpzcmNfeSwgKmRzdF95OwotICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmNfdSwgKmRzdF91OwotICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmNfdiwgKmRzdF92OwotCi0gICAgICAgIGludCB5aGVpZ2h0LCB1dl9oZWlnaHQ7Ci0gICAgICAgIGludCB5c3RyaWRlLCB1dl9zdHJpZGU7Ci0gICAgICAgIGludCBib3JkZXI7Ci0gICAgICAgIGludCB5b2Zmc2V0LCB1dm9mZnNldDsKLQotICAgICAgICBib3JkZXIgICA9IHNyY195YmMtPmJvcmRlcjsKLSAgICAgICAgeWhlaWdodCAgPSBzcmNfeWJjLT55X2hlaWdodDsKLSAgICAgICAgdXZfaGVpZ2h0ID0gc3JjX3liYy0+dXZfaGVpZ2h0OwotCi0gICAgICAgIHlzdHJpZGUgID0gc3JjX3liYy0+eV9zdHJpZGU7Ci0gICAgICAgIHV2X3N0cmlkZSA9IHNyY195YmMtPnV2X3N0cmlkZTsKLQotICAgICAgICB5b2Zmc2V0ICA9IGJvcmRlciAqICh5c3RyaWRlICsgMSk7Ci0gICAgICAgIHV2b2Zmc2V0ID0gYm9yZGVyLzIgKiAodXZfc3RyaWRlICsgMSk7Ci0KLSAgICAgICAgc3JjX3kgPSBzcmNfeWJjLT55X2J1ZmZlciAtIHlvZmZzZXQ7Ci0gICAgICAgIGRzdF95ID0gZHN0X3liYy0+eV9idWZmZXIgLSB5b2Zmc2V0OwotICAgICAgICBzcmNfdSA9IHNyY195YmMtPnVfYnVmZmVyIC0gdXZvZmZzZXQ7Ci0gICAgICAgIGRzdF91ID0gZHN0X3liYy0+dV9idWZmZXIgLSB1dm9mZnNldDsKLSAgICAgICAgc3JjX3YgPSBzcmNfeWJjLT52X2J1ZmZlciAtIHV2b2Zmc2V0OwotICAgICAgICBkc3RfdiA9IGRzdF95YmMtPnZfYnVmZmVyIC0gdXZvZmZzZXQ7Ci0KLSAgICAgICAgbWlfY3B1X2NvcHlfZmFzdCAoc3JjX3ksIGRzdF95LCB5c3RyaWRlICogICh5aGVpZ2h0ICsgMiAqIGJvcmRlcikpOwotICAgICAgICBtaV9jcHVfY29weV9mYXN0IChzcmNfdSwgZHN0X3UsIHV2X3N0cmlkZSAqICh1dl9oZWlnaHQgKyBib3JkZXIpKTsKLSAgICAgICAgbWlfY3B1X2NvcHlfZmFzdCAoc3JjX3YsIGRzdF92LCB1dl9zdHJpZGUgKiAodXZfaGVpZ2h0ICsgYm9yZGVyKSk7Ci0gICAgKi8KLX0KLQotI2luY2x1ZGUgPG5pdHJvL2l0Y21fZW5kLmg+CmRpZmYgLS1naXQgYS92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weWZyYW1lX2Z1bmNfbmVvbi5hc20gYi92cHhfc2NhbGUvYXJtL25lb24vdnA4X3ZweHl2MTJfY29weWZyYW1lX2Z1bmNfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YmI0ODYuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlmcmFtZV9mdW5jX25lb24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLTsKLTsgIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07Ci07ICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi07ICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLTsgIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLTsgIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLTsgIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotOwotCi0KLSAgICBFWFBPUlQgIHx2cDhfeXYxMl9jb3B5X2ZyYW1lX2Z1bmNfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgSU5DTFVERSBhc21fY29tX29mZnNldHMuYXNtCi0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotO3ZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV9mdW5jX25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotCi18dnA4X3l2MTJfY29weV9mcmFtZV9mdW5jX25lb258IFBST0MKLSAgICBwdXNoICAgICAgICAgICAge3I0IC0gcjExLCBscn0KLSAgICB2cHVzaCAgICAgICAgICAge2Q4IC0gZDE1fQotCi0gICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzE2Ci0KLSAgICA7Q29weSBZIHBsYW5lCi0gICAgbGRyICAgICAgICAgICAgIHI4LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfdV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHI5LCBbcjEsICN5djEyX2J1ZmZlcl9jb25maWdfdV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3ZfYnVmZmVyXSAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHIxMSwgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3ZfYnVmZmVyXSAgICAgIDtzcmNwdHIxCi0KLSAgICBsZHIgICAgICAgICAgICAgcjQsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2hlaWdodF0KLSAgICBsZHIgICAgICAgICAgICAgcjUsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3dpZHRoXQotICAgIGxkciAgICAgICAgICAgICByNiwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfc3RyaWRlXQotICAgIGxkciAgICAgICAgICAgICByNywgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfc3RyaWRlXQotICAgIGxkciAgICAgICAgICAgICByMiwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7c3JjcHRyMQotICAgIGxkciAgICAgICAgICAgICByMywgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7ZHN0cHRyMQotCi0gICAgc3RyICAgICAgICAgICAgIHI4LCBbc3BdCi0gICAgc3RyICAgICAgICAgICAgIHI5LCBbc3AsICM0XQotICAgIHN0ciAgICAgICAgICAgICByMTAsIFtzcCwgIzhdCi0gICAgc3RyICAgICAgICAgICAgIHIxMSwgW3NwLCAjMTJdCi0KLSAgICA7IGNvcHkgdHdvIHJvd3MgYXQgb25lIHRpbWUKLSAgICBtb3YgICAgICAgICAgICAgbHIsIHI0LCBsc3IgIzEKLQotY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcAotICAgIG1vdiAgICAgICAgICAgICByOCwgcjIKLSAgICBtb3YgICAgICAgICAgICAgcjksIHIzCi0gICAgYWRkICAgICAgICAgICAgIHIxMCwgcjIsIHI2Ci0gICAgYWRkICAgICAgICAgICAgIHIxMSwgcjMsIHI3Ci0gICAgbW92ICAgICAgICAgICAgIHIxMiwgcjUsIGxzciAjNwotCi1jcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AKLSAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjEwXSEKLSAgICB2bGQxLjggICAgICAgICAge3EyLCBxM30sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTBdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I4XSEKLSAgICB2bGQxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IxMF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjEwXSEKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I5XSEKLSAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyMTFdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3I5XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExMCwgcTExfSwgW3IxMV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjldIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjExXSEKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyMTFdIQotCi0gICAgYm5lICAgICAgICAgICAgIGNwX3NyY190b19kc3Rfd2lkdGhfbG9vcAotCi0gICAgc3VicyAgICAgICAgICAgIGxyLCBsciwgIzEKLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByNiwgbHNsICMxCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjcsIGxzbCAjMQotCi0gICAgYm5lICAgICAgICAgICAgIGNwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AKLQotICAgIGFuZHMgICAgICAgICAgICByMTAsIHI1LCAjMHg3ZiAgICAgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKLSAgICBzdWIgICAgICAgICAgICAgcjExLCByNSwgcjEwCi0gICAgbGRyICAgICAgICAgICAgIHIyLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHIzLCBbcjEsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtkc3RwdHIxCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGgKLWVuZF9vZl9jcF9zcmNfdG9fZHN0Ci0KLTtDb3B5IFUgJiBWIHBsYW5lcwotICAgIGxkciAgICAgICAgICAgICByMiwgW3NwXSAgICAgICAgO3NyY3B0cjEKLSAgICBsZHIgICAgICAgICAgICAgcjMsIFtzcCwgIzRdICAgICAgICA7ZHN0cHRyMQotICAgIG1vdiAgICAgICAgICAgICByNCwgcjQsIGxzciAjMSAgICAgICAgICAgICAgICAgIDtzcmMgdXZfaGVpZ2h0Ci0gICAgbW92ICAgICAgICAgICAgIHI1LCByNSwgbHNyICMxICAgICAgICAgICAgICAgICAgO3NyYyB1dl93aWR0aAotICAgIG1vdiAgICAgICAgICAgICByNiwgcjYsIGxzciAjMSAgICAgICAgICAgICAgICAgIDtzcmMgdXZfc3RyaWRlCi0gICAgbW92ICAgICAgICAgICAgIHI3LCByNywgbHNyICMxICAgICAgICAgICAgICAgICAgO2RzdCB1dl9zdHJpZGUKLQotICAgIG1vdiAgICAgICAgICAgICByMSwgIzIKLQotY3BfdXZfbG9vcAotCi0gICAgO2NvcHkgdHdvIHJvd3MgYXQgb25lIHRpbWUKLSAgICBtb3YgICAgICAgICAgICAgbHIsIHI0LCBsc3IgIzEKLQotY3Bfc3JjX3RvX2RzdF9oZWlnaHRfdXZfbG9vcAotICAgIG1vdiAgICAgICAgICAgICByOCwgcjIKLSAgICBtb3YgICAgICAgICAgICAgcjksIHIzCi0gICAgYWRkICAgICAgICAgICAgIHIxMCwgcjIsIHI2Ci0gICAgYWRkICAgICAgICAgICAgIHIxMSwgcjMsIHI3Ci0gICAgbW92ICAgICAgICAgICAgIHIxMiwgcjUsIGxzciAjNgotCi1jcF9zcmNfdG9fZHN0X3dpZHRoX3V2X2xvb3AKLSAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjEwXSEKLSAgICB2bGQxLjggICAgICAgICAge3EyLCBxM30sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTBdIQotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjldIQotICAgIHZzdDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IxMV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjldIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjExXSEKLQotICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X3dpZHRoX3V2X2xvb3AKLQotICAgIHN1YnMgICAgICAgICAgICBsciwgbHIsICMxCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjYsIGxzbCAjMQotICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHI3LCBsc2wgIzEKLQotICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X2hlaWdodF91dl9sb29wCi0KLSAgICBhbmRzICAgICAgICAgICAgcjEwLCByNSwgIzB4M2YgICAgICAgICAgICAgICAgICA7Y2hlY2sgdG8gc2VlIGlmIGV4dHJhIGNvcHkgaXMgbmVlZGVkCi0gICAgc3ViICAgICAgICAgICAgIHIxMSwgcjUsIHIxMAotICAgIGxkciAgICAgICAgICAgICByMiwgW3NwXSAgICAgICAgO3NyY3B0cjEKLSAgICBsZHIgICAgICAgICAgICAgcjMsIFtzcCwgIzRdICAgICAgICA7ZHN0cHRyMQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV9jcF9zcmNfdG9fZHN0X3V2X3dpZHRoCi1lbmRfb2ZfY3Bfc3JjX3RvX2RzdF91dgotCi0gICAgc3VicyAgICAgICAgICAgIHIxLCByMSwgIzEKLQotICAgIGFkZG5lICAgICAgICAgICAgICAgc3AsIHNwLCAjOAotCi0gICAgbGRybmUgICAgICAgICAgICAgICByMiwgW3NwXSAgICAgICAgO3NyY3B0cjEKLSAgICBsZHJuZSAgICAgICAgICAgICAgIHIzLCBbc3AsICM0XSAgICAgICAgO2RzdHB0cjEKLQotICAgIGJuZSAgICAgICAgICAgICBjcF91dl9sb29wCi0KLSAgICBhZGQgICAgICAgICAgICAgc3AsIHNwLCAjOAotCi0gICAgdnBvcCAgICAgICAgICAgIHtkOCAtIGQxNX0KLSAgICBwb3AgICAgICAgICAgICAge3I0IC0gcjExLCBwY30KLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1leHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjExCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjExCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByOCwgcjYKLSAgICBhZGQgICAgICAgICAgICAgcjExLCByOSwgcjcKLQotICAgIG1vdiAgICAgICAgICAgICBsciwgcjQsIGxzciAjMQotZXh0cmFfY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcAotICAgIG1vdiAgICAgICAgICAgICByOCwgcjIKLSAgICBtb3YgICAgICAgICAgICAgcjksIHIzCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByOCwgcjYKLSAgICBhZGQgICAgICAgICAgICAgcjExLCByOSwgcjcKLQotICAgIG1vdiAgICAgICAgICAgICByMTIsIHIxMAotCi1leHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AKLSAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3I4XSEKLSAgICB2bGQxLjggICAgICAgICAge3ExfSwgW3IwXSEKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzE2Ci0KLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I5XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExfSwgW3IxMV0hCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGhfbG9vcAotCi0gICAgc3VicyAgICAgICAgICAgIGxyLCBsciwgIzEKLQotICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHI2LCBsc2wgIzEKLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByNywgbHNsICMxCi0KLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcAotCi0gICAgYiAgICAgICAgICAgICAgIGVuZF9vZl9jcF9zcmNfdG9fZHN0Ci0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWV4dHJhX2NwX3NyY190b19kc3RfdXZfd2lkdGgKLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByMTEKLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByMTEKLSAgICBhZGQgICAgICAgICAgICAgcjAsIHI4LCByNgotICAgIGFkZCAgICAgICAgICAgICByMTEsIHI5LCByNwotCi0gICAgbW92ICAgICAgICAgICAgIGxyLCByNCwgbHNyICMxCi1leHRyYV9jcF9zcmNfdG9fZHN0X2hlaWdodF91dl9sb29wCi0gICAgbW92ICAgICAgICAgICAgIHI4LCByMgotICAgIG1vdiAgICAgICAgICAgICByOSwgcjMKLSAgICBhZGQgICAgICAgICAgICAgcjAsIHI4LCByNgotICAgIGFkZCAgICAgICAgICAgICByMTEsIHI5LCByNwotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgcjEwCi0KLWV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGhfdXZfbG9vcAotICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCBbcjBdIQotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjOAotCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtkMX0sIFtyMTFdIQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoX3V2X2xvb3AKLQotICAgIHN1YnMgICAgICAgICAgICBsciwgbHIsICMxCi0KLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByNiwgbHNsICMxCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjcsIGxzbCAjMQotCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3RfaGVpZ2h0X3V2X2xvb3AKLQotICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfY3Bfc3JjX3RvX2RzdF91dgotCi0gICAgRU5EUAotICAgIEVORApkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlmcmFtZXlvbmx5X25lb24uYXNtIGIvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlmcmFtZXlvbmx5X25lb24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJjY2MyLi4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9hcm0vbmVvbi92cDhfdnB4eXYxMl9jb3B5ZnJhbWV5b25seV9uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3l2MTJfY29weV9mcmFtZV95b25seV9uZW9ufAotICAgIEVYUE9SVCAgfHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbm9fZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbnwKLQotICAgIEFSTQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBJTkNMVURFIGFzbV9jb21fb2Zmc2V0cy5hc20KLQotICAgIEFSRUEgfHwudGV4dHx8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotO3ZvaWQgdnB4eXYxMl9jb3B5X2ZyYW1lX3lvbmx5KFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKLTsgTm90ZTogdGhpcyBpcyBWUDggZnVuY3Rpb24sIHdoaWNoIGhhcyBib3JkZXI9MzIgYW5kIDE2LiBJbnRlcm5hbCB5X3dpZHRoIGFuZCB5X2hlaWdodAotOyBhcmUgYWx3YXlzIG11bHRpcGxlcyBvZiAxNi4KLQotfHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7cjQgLSByMTEsIGxyfQotICAgIHZwdXNoICAgICAgICAgICB7ZDggLSBkMTV9Ci0KLSAgICBsZHIgICAgICAgICAgICAgcjQsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2hlaWdodF0KLSAgICBsZHIgICAgICAgICAgICAgcjUsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3dpZHRoXQotICAgIGxkciAgICAgICAgICAgICByNiwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfc3RyaWRlXQotICAgIGxkciAgICAgICAgICAgICByNywgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfc3RyaWRlXQotICAgIGxkciAgICAgICAgICAgICByMiwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7c3JjcHRyMQotICAgIGxkciAgICAgICAgICAgICByMywgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7ZHN0cHRyMQotCi0gICAgOyBjb3B5IHR3byByb3dzIGF0IG9uZSB0aW1lCi0gICAgbW92ICAgICAgICAgICAgIGxyLCByNCwgbHNyICMxCi0KLWNwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AKLSAgICBtb3YgICAgICAgICAgICAgcjgsIHIyCi0gICAgbW92ICAgICAgICAgICAgIHI5LCByMwotICAgIGFkZCAgICAgICAgICAgICByMTAsIHIyLCByNgotICAgIGFkZCAgICAgICAgICAgICByMTEsIHIzLCByNwotICAgIG1vdiAgICAgICAgICAgICByMTIsIHI1LCBsc3IgIzcKLQotY3Bfc3JjX3RvX2RzdF93aWR0aF9sb29wCi0gICAgdmxkMS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IxMF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjEwXSEKLSAgICB2bGQxLjggICAgICAgICAge3E0LCBxNX0sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMTBdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3I4XSEKLSAgICB2bGQxLjggICAgICAgICAge3ExNCwgcTE1fSwgW3IxMF0hCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjExXSEKLSAgICB2c3QxLjggICAgICAgICAge3EyLCBxM30sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTFdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I5XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IxMV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjldIQotICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjExXSEKLQotICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AKLQotICAgIHN1YnMgICAgICAgICAgICBsciwgbHIsICMxCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjYsIGxzbCAjMQotICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHI3LCBsc2wgIzEKLQotICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X2hlaWdodF9sb29wCi0KLSAgICBhbmRzICAgICAgICAgICAgcjEwLCByNSwgIzB4N2YgICAgICAgICAgICAgICAgICA7Y2hlY2sgdG8gc2VlIGlmIGV4dHJhIGNvcHkgaXMgbmVlZGVkCi0gICAgc3ViICAgICAgICAgICAgIHIxMSwgcjUsIHIxMAotICAgIGxkciAgICAgICAgICAgICByMiwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7c3JjcHRyMQotICAgIGxkciAgICAgICAgICAgICByMywgW3IxLCAjeXYxMl9idWZmZXJfY29uZmlnX3lfYnVmZmVyXSAgICAgICA7ZHN0cHRyMQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoCi1lbmRfb2ZfY3Bfc3JjX3RvX2RzdAotCi0KLSAgICA7dnB4eXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc195b25seQotICAgIG1vdiAgICAgICAgICAgICByMCwgcjEKLSAgICA7Tm90IG5lZWQgdG8gbG9hZCB5X3dpZHRoLCBzaW5jZTogeV93aWR0aCA9IHlfc3RyaWRlIC0gMipib3JkZXIKLSAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ19ib3JkZXJdCi0gICAgbGRyICAgICAgICAgICAgIHIxLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHI0LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9oZWlnaHRdCi0gICAgbGRyICAgICAgICAgICAgIGxyLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9zdHJpZGVdCi0KLSAgICBjbXAgICAgICAgICAgICAgcjMsICMxNgotICAgIGJlcSAgICAgICAgICAgICBiMTZfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMKLQotOz09PT09PT09PT09PT09PT09PT09PT09Ci1iMzJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMKLTtib3JkZXIgPSAzMgotOz09PT09PT09PT09PT09PT09PT09PT09Ci07Qm9yZGVyIGNvcHkgZm9yIFkgcGxhbmUKLTtjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0Ci0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjMgICAgICAgICAgICAgIDtkZXN0cHRyMQotICAgIGFkZCAgICAgICAgICAgICByNiwgcjEsIGxyCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByNiwgcjMsIGxzbCAjMSAgICAgIDtkZXN0cHRyMgotICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsICMxICAgICAgICAgICAgICA7c3JjcHRyMgotCi0gICAgO0RvIGZvdXIgcm93cyBhdCBvbmUgdGltZQotICAgIG1vdiAgICAgICAgICAgICByMTIsIHI0LCBsc3IgIzIKLQotY29weV9sZWZ0X3JpZ2h0X3kKLSAgICB2bGQxLjggICAgICAgICAge2QwW10sIGQxW119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDRbXSwgZDVbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkOFtdLCBkOVtdfSwgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QxMltdLCBkMTNbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTZbXSwgZDE3W119LCAgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QyMFtdLCBkMjFbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjRbXSwgZDI1W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI4W10sIGQyOVtdfSwgW3IyXSwgbHIKLQotICAgIHZtb3YgICAgICAgICAgICBxMSwgcTAKLSAgICB2bW92ICAgICAgICAgICAgcTMsIHEyCi0gICAgdm1vdiAgICAgICAgICAgIHE1LCBxNAotICAgIHZtb3YgICAgICAgICAgICBxNywgcTYKLSAgICB2bW92ICAgICAgICAgICAgcTksIHE4Ci0gICAgdm1vdiAgICAgICAgICAgIHExMSwgcTEwCi0gICAgdm1vdiAgICAgICAgICAgIHExMywgcTEyCi0gICAgdm1vdiAgICAgICAgICAgIHExNSwgcTE0Ci0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjZdLCBscgotCi0gICAgYm5lICAgICAgICAgICAgIGNvcHlfbGVmdF9yaWdodF95Ci0KLTtOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMKLSAgICBsZHIgICAgICAgICAgICAgcjcsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKLSAgICBtdWwgICAgICAgICAgICAgcjgsIHIzLCBscgotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgbHIsIGxzciAjNwotCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByMSwgcjMgICAgICAgICAgICAgIDtkZXN0cHRyMgotICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsIGxyICAgICAgICAgICAgICA7c3JjcHRyMgotICAgIHN1YiAgICAgICAgICAgICByMSwgcjcsIHIzICAgICAgICAgICAgICA7c3JjcHRyMQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4ICAgICAgICAgICAgICA7ZGVzdHB0cjEKLQotY29weV90b3BfYm90dG9tX3kKLSAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjJdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3ExMCwgcTExfSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3E0LCBxNX0sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMl0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjJdIQotCi0gICAgbW92ICAgICAgICAgICAgIHI3LCByMwotCi10b3BfYm90dG9tXzMyCi0gICAgc3VicyAgICAgICAgICAgIHI3LCByNywgIzEKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyNl0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3I2XSEKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyNV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyNl0hCi0KLSAgICBhZGQgICAgICAgICAgICAgcjUsIHI1LCBscgotICAgIHN1YiAgICAgICAgICAgICByNSwgcjUsICMxMjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHI2LCBscgotICAgIHN1YiAgICAgICAgICAgICByNiwgcjYsICMxMjgKLQotICAgIGJuZSAgICAgICAgICAgICB0b3BfYm90dG9tXzMyCi0KLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByOAotICAgIGFkZCAgICAgICAgICAgICByNiwgcjIsIGxyCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0gICAgYm5lICAgICAgICAgICAgIGNvcHlfdG9wX2JvdHRvbV95Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIGxyLCBsc3IgIzQgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKLSAgICBhbmRzICAgICAgICAgICAgcjcsIHI3LCAjMHg3Ci0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21feQotZW5kX29mX2JvcmRlcl9jb3B5X3kKLQotICAgIHZwb3AgICAgICAgICAgICB7ZDggLSBkMTV9Ci0gICAgcG9wICAgICAgICAgICAgIHtyNCAtIHIxMSwgcGN9Ci0KLTs9PT09PT09PT09PT09PT09PT09PT0KLTtleHRyYSBjb3B5IHBhcnQgZm9yIFkKLWV4dHJhX3RvcF9ib3R0b21feQotICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCBbcjJdIQotCi0gICAgbW92ICAgICAgICAgICAgIHI5LCByMywgbHNyICMzCi0KLWV4dHJhX3RvcF9ib3R0b21fMzIKLSAgICBzdWJzICAgICAgICAgICAgcjksIHI5LCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fMzIKLQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4Ci0gICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIKLSAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tX3kKLQotICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfYm9yZGVyX2NvcHlfeQotCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PQotYjE2X2V4dGVuZF9mcmFtZV9ib3JkZXJzCi07Ym9yZGVyID0gMTYKLTs9PT09PT09PT09PT09PT09PT09PT09PQotO0JvcmRlciBjb3B5IGZvciBZIHBsYW5lCi07Y29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dAotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHIzICAgICAgICAgICAgICA7ZGVzdHB0cjEKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHIxLCBscgotICAgIHN1YiAgICAgICAgICAgICByNiwgcjYsIHIzLCBsc2wgIzEgICAgICA7ZGVzdHB0cjIKLSAgICBzdWIgICAgICAgICAgICAgcjIsIHI2LCAjMSAgICAgICAgICAgICAgO3NyY3B0cjIKLQotICAgIDtEbyBmb3VyIHJvd3MgYXQgb25lIHRpbWUKLSAgICBtb3YgICAgICAgICAgICAgcjEyLCByNCwgbHNyICMyCi0KLWNvcHlfbGVmdF9yaWdodF95X2IxNgotICAgIHZsZDEuOCAgICAgICAgICB7ZDBbXSwgZDFbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkNFtdLCBkNVtdfSwgW3IyXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2Q4W10sIGQ5W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDEyW10sIGQxM1tdfSwgW3IyXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QxNltdLCBkMTdbXX0sICBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDIwW10sIGQyMVtdfSwgW3IyXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QyNFtdLCBkMjVbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjhbXSwgZDI5W119LCBbcjJdLCBscgotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxNH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxNn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxOH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTB9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEyfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3ExNH0sIFtyNl0sIGxyCi0KLSAgICBibmUgICAgICAgICAgICAgY29weV9sZWZ0X3JpZ2h0X3lfYjE2Ci0KLTtOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMKLSAgICBsZHIgICAgICAgICAgICAgcjcsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKLSAgICBtdWwgICAgICAgICAgICAgcjgsIHIzLCBscgotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgbHIsIGxzciAjNwotCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByMSwgcjMgICAgICAgICAgICAgIDtkZXN0cHRyMgotICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsIGxyICAgICAgICAgICAgICA7c3JjcHRyMgotICAgIHN1YiAgICAgICAgICAgICByMSwgcjcsIHIzICAgICAgICAgICAgICA7c3JjcHRyMQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4ICAgICAgICAgICAgICA7ZGVzdHB0cjEKLQotY29weV90b3BfYm90dG9tX3lfYjE2Ci0gICAgdmxkMS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3EyLCBxM30sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMl0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjJdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3ExNCwgcTE1fSwgW3IyXSEKLQotICAgIG1vdiAgICAgICAgICAgICByNywgcjMKLQotdG9wX2JvdHRvbV8xNl9iMTYKLSAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3I2XSEKLSAgICB2c3QxLjggICAgICAgICAge3EyLCBxM30sIFtyNV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyNl0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxNCwgcTV9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjZdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExNCwgcTE1fSwgW3I2XSEKLQotICAgIGFkZCAgICAgICAgICAgICByNSwgcjUsIGxyCi0gICAgc3ViICAgICAgICAgICAgIHI1LCByNSwgIzEyOAotICAgIGFkZCAgICAgICAgICAgICByNiwgcjYsIGxyCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByNiwgIzEyOAotCi0gICAgYm5lICAgICAgICAgICAgIHRvcF9ib3R0b21fMTZfYjE2Ci0KLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByOAotICAgIGFkZCAgICAgICAgICAgICByNiwgcjIsIGxyCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0gICAgYm5lICAgICAgICAgICAgIGNvcHlfdG9wX2JvdHRvbV95X2IxNgotCi0gICAgbW92ICAgICAgICAgICAgIHI3LCBsciwgbHNyICM0ICAgICAgICAgICAgICA7Y2hlY2sgdG8gc2VlIGlmIGV4dHJhIGNvcHkgaXMgbmVlZGVkCi0gICAgYW5kcyAgICAgICAgICAgIHI3LCByNywgIzB4NwotICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tX3lfYjE2Ci1lbmRfb2ZfYm9yZGVyX2NvcHlfeV9iMTYKLQotICAgIHZwb3AgICAgICAgICAgICB7ZDggLSBkMTV9Ci0gICAgcG9wICAgICAgICAgICAgIHtyNCAtIHIxMSwgcGN9Ci0KLTs9PT09PT09PT09PT09PT09PT09PT0KLTtleHRyYSBjb3B5IHBhcnQgZm9yIFkKLWV4dHJhX3RvcF9ib3R0b21feV9iMTYKLSAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3EyfSwgW3IyXSEKLQotICAgIG1vdiAgICAgICAgICAgICByOSwgcjMsIGxzciAjMwotCi1leHRyYV90b3BfYm90dG9tXzE2X2IxNgotICAgIHN1YnMgICAgICAgICAgICByOSwgcjksICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfdG9wX2JvdHRvbV8xNl9iMTYKLQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4Ci0gICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIKLSAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tX3lfYjE2Ci0KLSAgICBiICAgICAgICAgICAgICAgZW5kX29mX2JvcmRlcl9jb3B5X3lfYjE2Ci0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aAotICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHIxMQotICAgIGFkZCAgICAgICAgICAgICByMywgcjMsIHIxMQotICAgIGFkZCAgICAgICAgICAgICByMCwgcjgsIHI2Ci0gICAgYWRkICAgICAgICAgICAgIHIxMSwgcjksIHI3Ci0KLSAgICBtb3YgICAgICAgICAgICAgbHIsIHI0LCBsc3IgIzEKLWV4dHJhX2NwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AKLSAgICBtb3YgICAgICAgICAgICAgcjgsIHIyCi0gICAgbW92ICAgICAgICAgICAgIHI5LCByMwotICAgIGFkZCAgICAgICAgICAgICByMCwgcjgsIHI2Ci0gICAgYWRkICAgICAgICAgICAgIHIxMSwgcjksIHI3Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCByMTAKLQotZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aF9sb29wCi0gICAgdmxkMS44ICAgICAgICAgIHtxMH0sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMX0sIFtyMF0hCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxNgotCi0gICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMX0sIFtyMTFdIQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV9jcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AKLQotICAgIHN1YnMgICAgICAgICAgICBsciwgbHIsICMxCi0KLSAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByNiwgbHNsICMxCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjcsIGxzbCAjMQotCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3RfaGVpZ2h0X2xvb3AKLQotICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfY3Bfc3JjX3RvX2RzdAotCi0gICAgRU5EUAotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTtJbiB2cDhjeF9waWNrX2ZpbHRlcl9sZXZlbCgpLCBjYWxsIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHkKLTt3aXRob3V0IGV4dGVuZF9mcmFtZV9ib3JkZXJzLgotfHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfbm9fZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7cjQgLSByMTEsIGxyfQotICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQotCi0gICAgbGRyICAgICAgICAgICAgIHI0LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9oZWlnaHRdCi0gICAgbGRyICAgICAgICAgICAgIHI1LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV93aWR0aF0KLSAgICBsZHIgICAgICAgICAgICAgcjYsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3N0cmlkZV0KLSAgICBsZHIgICAgICAgICAgICAgcjcsIFtyMSwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X3N0cmlkZV0KLSAgICBsZHIgICAgICAgICAgICAgcjIsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKLSAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMSwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO2RzdHB0cjEKLQotICAgIDsgY29weSB0d28gcm93cyBhdCBvbmUgdGltZQotICAgIG1vdiAgICAgICAgICAgICBsciwgcjQsIGxzciAjMQotCi1jcF9zcmNfdG9fZHN0X2hlaWdodF9sb29wMQotICAgIG1vdiAgICAgICAgICAgICByOCwgcjIKLSAgICBtb3YgICAgICAgICAgICAgcjksIHIzCi0gICAgYWRkICAgICAgICAgICAgIHIxMCwgcjIsIHI2Ci0gICAgYWRkICAgICAgICAgICAgIHIxMSwgcjMsIHI3Ci0gICAgbW92ICAgICAgICAgICAgIHIxMiwgcjUsIGxzciAjNwotCi1jcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AxCi0gICAgdmxkMS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IxMF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjEwXSEKLSAgICB2bGQxLjggICAgICAgICAge3E0LCBxNX0sIFtyOF0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMTBdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTYsIHE3fSwgW3I4XSEKLSAgICB2bGQxLjggICAgICAgICAge3ExNCwgcTE1fSwgW3IxMF0hCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjExXSEKLSAgICB2c3QxLjggICAgICAgICAge3EyLCBxM30sIFtyOV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMTFdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I5XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IxMV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjldIQotICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjExXSEKLQotICAgIGJuZSAgICAgICAgICAgICBjcF9zcmNfdG9fZHN0X3dpZHRoX2xvb3AxCi0KLSAgICBzdWJzICAgICAgICAgICAgbHIsIGxyLCAjMQotICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHI2LCBsc2wgIzEKLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByNywgbHNsICMxCi0KLSAgICBibmUgICAgICAgICAgICAgY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcDEKLQotICAgIGFuZHMgICAgICAgICAgICByMTAsIHI1LCAjMHg3ZiAgICAgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKLSAgICBzdWIgICAgICAgICAgICAgcjExLCByNSwgcjEwCi0gICAgbGRyICAgICAgICAgICAgIHIyLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHIzLCBbcjEsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtkc3RwdHIxCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGgxCi1lbmRfb2ZfY3Bfc3JjX3RvX2RzdDEKLQotICAgIHZwb3AgICAgICAgICAgICB7ZDggLSBkMTV9Ci0gICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEsIHBjfQotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWV4dHJhX2NwX3NyY190b19kc3Rfd2lkdGgxCi0gICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjExCi0gICAgYWRkICAgICAgICAgICAgIHIzLCByMywgcjExCi0gICAgYWRkICAgICAgICAgICAgIHIwLCByOCwgcjYKLSAgICBhZGQgICAgICAgICAgICAgcjExLCByOSwgcjcKLQotICAgIG1vdiAgICAgICAgICAgICBsciwgcjQsIGxzciAjMQotZXh0cmFfY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcDEKLSAgICBtb3YgICAgICAgICAgICAgcjgsIHIyCi0gICAgbW92ICAgICAgICAgICAgIHI5LCByMwotICAgIGFkZCAgICAgICAgICAgICByMCwgcjgsIHI2Ci0gICAgYWRkICAgICAgICAgICAgIHIxMSwgcjksIHI3Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjEyLCByMTAKLQotZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aF9sb29wMQotICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCBbcjhdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjBdIQotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMTYKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjldIQotICAgIHZzdDEuOCAgICAgICAgICB7cTF9LCBbcjExXSEKLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfY3Bfc3JjX3RvX2RzdF93aWR0aF9sb29wMQotCi0gICAgc3VicyAgICAgICAgICAgIGxyLCBsciwgIzEKLQotICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsIHI2LCBsc2wgIzEKLSAgICBhZGQgICAgICAgICAgICAgcjMsIHIzLCByNywgbHNsICMxCi0KLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfY3Bfc3JjX3RvX2RzdF9oZWlnaHRfbG9vcDEKLQotICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfY3Bfc3JjX3RvX2RzdDEKLQotICAgIEVORFAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2V4dGVuZGZyYW1lYm9yZGVyc19uZW9uLmFzbSBiL3ZweF9zY2FsZS9hcm0vbmVvbi92cDhfdnB4eXYxMl9leHRlbmRmcmFtZWJvcmRlcnNfbmVvbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTNiOTMuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL2FybS9uZW9uL3ZwOF92cHh5djEyX2V4dGVuZGZyYW1lYm9yZGVyc19uZW9uLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi07Ci07ICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotOwotOyAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotOyAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi07ICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi07ICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci07ICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLTsKLQotCi0gICAgRVhQT1JUICB8dnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbnwKLSAgICBBUk0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgSU5DTFVERSBhc21fY29tX29mZnNldHMuYXNtCi0KLSAgICBBUkVBIHx8LnRleHR8fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLTt2b2lkIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX25lb24gKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKTsKLTtOb3RlOiB0aGlzIGlzIFZQOCBmdW5jdGlvbiwgd2hpY2ggaGFzIGJvcmRlcj0zMiBhbmQgMTYuIEludGVybmFsIHlfd2lkdGggYW5kIHlfaGVpZ2h0Ci07IGFyZSBhbHdheXMgbXVsdGlwbGVzIG9mIDE2LgotCi18dnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbnwgUFJPQwotICAgIHB1c2ggICAgICAgICAgICB7cjQgLSByMTAsIGxyfQotICAgIHZwdXNoICAgICAgICAgICB7ZDggLSBkMTV9Ci0KLSAgICA7Tm90IG5lZWQgdG8gbG9hZCB5X3dpZHRoLCBzaW5jZTogeV93aWR0aCA9IHlfc3RyaWRlIC0gMipib3JkZXIKLSAgICBsZHIgICAgICAgICAgICAgcjMsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ19ib3JkZXJdCi0gICAgbGRyICAgICAgICAgICAgIHIxLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbGRyICAgICAgICAgICAgIHI0LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9oZWlnaHRdCi0gICAgbGRyICAgICAgICAgICAgIGxyLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9zdHJpZGVdCi0KLSAgICBjbXAgICAgICAgICAgICAgcjMsICMxNgotICAgIGJlcSAgICAgICAgICAgICBiMTZfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMKLQotOz09PT09PT09PT09PT09PT09PT09PT09Ci1iMzJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMKLTtib3JkZXIgPSAzMgotOz09PT09PT09PT09PT09PT09PT09PT09Ci07Qm9yZGVyIGNvcHkgZm9yIFkgcGxhbmUKLTtjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0Ci0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjMgICAgICAgICAgICAgIDtkZXN0cHRyMQotICAgIGFkZCAgICAgICAgICAgICByNiwgcjEsIGxyCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByNiwgcjMsIGxzbCAjMSAgICAgIDtkZXN0cHRyMgotICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsICMxICAgICAgICAgICAgICA7c3JjcHRyMgotCi0gICAgO0RvIGZvdXIgcm93cyBhdCBvbmUgdGltZQotICAgIG1vdiAgICAgICAgICAgICByMTIsIHI0LCBsc3IgIzIKLQotY29weV9sZWZ0X3JpZ2h0X3kKLSAgICB2bGQxLjggICAgICAgICAge2QwW10sIGQxW119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDRbXSwgZDVbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkOFtdLCBkOVtdfSwgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QxMltdLCBkMTNbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTZbXSwgZDE3W119LCAgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QyMFtdLCBkMjFbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjRbXSwgZDI1W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI4W10sIGQyOVtdfSwgW3IyXSwgbHIKLQotICAgIHZtb3YgICAgICAgICAgICBxMSwgcTAKLSAgICB2bW92ICAgICAgICAgICAgcTMsIHEyCi0gICAgdm1vdiAgICAgICAgICAgIHE1LCBxNAotICAgIHZtb3YgICAgICAgICAgICBxNywgcTYKLSAgICB2bW92ICAgICAgICAgICAgcTksIHE4Ci0gICAgdm1vdiAgICAgICAgICAgIHExMSwgcTEwCi0gICAgdm1vdiAgICAgICAgICAgIHExMywgcTEyCi0gICAgdm1vdiAgICAgICAgICAgIHExNSwgcTE0Ci0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwLCBxMX0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjZdLCBscgotCi0gICAgYm5lICAgICAgICAgICAgIGNvcHlfbGVmdF9yaWdodF95Ci0KLTtOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMKLSAgICBsZHIgICAgICAgICAgICAgcjcsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ195X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKLSAgICBtdWwgICAgICAgICAgICAgcjgsIHIzLCBscgotCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgbHIsIGxzciAjNwotCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByMSwgcjMgICAgICAgICAgICAgIDtkZXN0cHRyMgotICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsIGxyICAgICAgICAgICAgICA7c3JjcHRyMgotICAgIHN1YiAgICAgICAgICAgICByMSwgcjcsIHIzICAgICAgICAgICAgICA7c3JjcHRyMQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4ICAgICAgICAgICAgICA7ZGVzdHB0cjEKLQotY29weV90b3BfYm90dG9tX3kKLSAgICB2bGQxLjggICAgICAgICAge3EwLCBxMX0sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxOCwgcTl9LCBbcjJdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTIsIHEzfSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3ExMCwgcTExfSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3E0LCBxNX0sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTIsIHExM30sIFtyMl0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxNiwgcTd9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjJdIQotCi0gICAgbW92ICAgICAgICAgICAgIHI3LCByMwotCi10b3BfYm90dG9tXzMyCi0gICAgc3VicyAgICAgICAgICAgIHI3LCByNywgIzEKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyNl0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3I2XSEKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyNV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyNl0hCi0KLSAgICBhZGQgICAgICAgICAgICAgcjUsIHI1LCBscgotICAgIHN1YiAgICAgICAgICAgICByNSwgcjUsICMxMjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHI2LCBscgotICAgIHN1YiAgICAgICAgICAgICByNiwgcjYsICMxMjgKLQotICAgIGJuZSAgICAgICAgICAgICB0b3BfYm90dG9tXzMyCi0KLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByOAotICAgIGFkZCAgICAgICAgICAgICByNiwgcjIsIGxyCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0gICAgYm5lICAgICAgICAgICAgIGNvcHlfdG9wX2JvdHRvbV95Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIGxyLCBsc3IgIzQgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKLSAgICBhbmRzICAgICAgICAgICAgcjcsIHI3LCAjMHg3Ci0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21feQotZW5kX29mX2JvcmRlcl9jb3B5X3kKLQotO0JvcmRlciBjb3B5IGZvciBVLCBWIHBsYW5lcwotICAgIGxkciAgICAgICAgICAgICByMSwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3VfYnVmZmVyXSAgICAgICA7c3JjcHRyMQotICAgIG1vdiAgICAgICAgICAgICBsciwgbHIsIGxzciAjMSAgICAgICAgICAgICAgO3V2X3N0cmlkZQotICAgIG1vdiAgICAgICAgICAgICByMywgcjMsIGxzciAjMSAgICAgICAgICAgICAgO2JvcmRlcgotICAgIG1vdiAgICAgICAgICAgICByNCwgcjQsIGxzciAjMSAgICAgICAgICAgICAgO3V2X2hlaWdodAotICAgIG1vdiAgICAgICAgICAgICByOCwgcjgsIGxzciAjMgotCi0gICAgbW92ICAgICAgICAgICAgIHIxMCwgIzIKLQotO2NvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vc3QgY29sdW1ucyBvdXQKLWJvcmRlcl9jb3B5X3V2Ci0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjMgICAgICAgICAgICAgIDtkZXN0cHRyMQotICAgIGFkZCAgICAgICAgICAgICByNiwgcjEsIGxyCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByNiwgcjMsIGxzbCAjMSAgICAgIDtkZXN0cHRyMgotICAgIHN1YiAgICAgICAgICAgICByMiwgcjYsICMxICAgICAgICAgICAgICA7c3JjcHRyMgotCi0gICAgbW92ICAgICAgICAgICAgIHI3LCByMQotCi0gICAgO0RvIGVpZ2h0IHJvd3MgYXQgb25lIHRpbWUKLSAgICBtb3YgICAgICAgICAgICAgcjEyLCByNCwgbHNyICMzCi0KLWNvcHlfbGVmdF9yaWdodF91dgotICAgIHZsZDEuOCAgICAgICAgICB7ZDBbXSwgZDFbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMltdLCBkM1tdfSwgW3IyXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2Q0W10sIGQ1W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDZbXSwgZDdbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkOFtdLCBkOVtdfSwgIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTBbXSwgZDExW119LCBbcjJdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDEyW10sIGQxM1tdfSwgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QxNFtdLCBkMTVbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTZbXSwgZDE3W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDE4W10sIGQxOVtdfSwgW3IyXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QyMFtdLCBkMjFbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjJbXSwgZDIzW119LCBbcjJdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI0W10sIGQyNVtdfSwgIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjZbXSwgZDI3W119LCBbcjJdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI4W10sIGQyOVtdfSwgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QzMFtdLCBkMzFbXX0sIFtyMl0sIGxyCi0KLSAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3ExfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EzfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E0fSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E1fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E2fSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E3fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E4fSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3E5fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3ExMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTF9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEyfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3ExM30sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTR9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTE1fSwgW3I2XSwgbHIKLQotICAgIGJuZSAgICAgICAgICAgICBjb3B5X2xlZnRfcmlnaHRfdXYKLQotO05vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycwotICAgIG1vdiAgICAgICAgICAgICByMTIsIGxyLCBsc3IgIzYKLQotICAgIHN1YiAgICAgICAgICAgICByNiwgcjEsIHIzICAgICAgICAgICAgICA7ZGVzdHB0cjIKLSAgICBzdWIgICAgICAgICAgICAgcjIsIHI2LCBsciAgICAgICAgICAgICAgO3NyY3B0cjIKLSAgICBzdWIgICAgICAgICAgICAgcjEsIHI3LCByMyAgICAgICAgICAgICAgO3NyY3B0cjEKLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByOCAgICAgICAgICAgICAgO2Rlc3RwdHIxCi0KLWNvcHlfdG9wX2JvdHRvbV91dgotICAgIHZsZDEuOCAgICAgICAgICB7cTAsIHExfSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3E4LCBxOX0sIFtyMl0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjJdIQotCi0gICAgbW92ICAgICAgICAgICAgIHI3LCByMwotCi10b3BfYm90dG9tXzE2Ci0gICAgc3VicyAgICAgICAgICAgIHI3LCByNywgIzEKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyNl0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdIQotCi0gICAgYWRkICAgICAgICAgICAgIHI1LCByNSwgbHIKLSAgICBzdWIgICAgICAgICAgICAgcjUsIHI1LCAjNjQKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHI2LCBscgotICAgIHN1YiAgICAgICAgICAgICByNiwgcjYsICM2NAotCi0gICAgYm5lICAgICAgICAgICAgIHRvcF9ib3R0b21fMTYKLQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4Ci0gICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLSAgICBibmUgICAgICAgICAgICAgY29weV90b3BfYm90dG9tX3V2Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIGxyLCBsc3IgIzMgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKLSAgICBhbmRzICAgICAgICAgICAgcjcsIHI3LCAjMHg3Ci0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fdXYKLQotZW5kX29mX2JvcmRlcl9jb3B5X3V2Ci0gICAgc3VicyAgICAgICAgICAgIHIxMCwgcjEwLCAjMQotICAgIGxkcm5lICAgICAgICAgICByMSwgW3IwLCAjeXYxMl9idWZmZXJfY29uZmlnX3ZfYnVmZmVyXSAgICAgICA7c3JjcHRyMQotICAgIGJuZSAgICAgICAgICAgICBib3JkZXJfY29weV91dgotCi0gICAgdnBvcCAgICAgICAgICAgIHtkOCAtIGQxNX0KLSAgICBwb3AgICAgICAgICAgICAge3I0IC0gcjEwLCBwY30KLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotO2V4dHJhIGNvcHkgcGFydCBmb3IgWQotZXh0cmFfdG9wX2JvdHRvbV95Ci0gICAgdmxkMS44ICAgICAgICAgIHtxMH0sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMn0sIFtyMl0hCi0KLSAgICBtb3YgICAgICAgICAgICAgcjksIHIzLCBsc3IgIzMKLQotZXh0cmFfdG9wX2JvdHRvbV8zMgotICAgIHN1YnMgICAgICAgICAgICByOSwgcjksICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfdG9wX2JvdHRvbV8zMgotCi0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHIyLCBscgotICAgIHN1YnMgICAgICAgICAgICByNywgcjcsICMxCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21feQotCi0gICAgYiAgICAgICAgICAgICAgIGVuZF9vZl9ib3JkZXJfY29weV95Ci0KLTtleHRyYSBjb3B5IHBhcnQgZm9yIFVWCi1leHRyYV90b3BfYm90dG9tX3V2Ci0gICAgdmxkMS44ICAgICAgICAgIHtkMH0sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtkOH0sIFtyMl0hCi0KLSAgICBtb3YgICAgICAgICAgICAgcjksIHIzLCBsc3IgIzMKLQotZXh0cmFfdG9wX2JvdHRvbV8xNgotICAgIHN1YnMgICAgICAgICAgICByOSwgcjksICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2Q4fSwgW3I2XSwgbHIKLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfdG9wX2JvdHRvbV8xNgotCi0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHIyLCBscgotICAgIHN1YnMgICAgICAgICAgICByNywgcjcsICMxCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fdXYKLQotICAgIGIgICAgICAgICAgICAgICBlbmRfb2ZfYm9yZGVyX2NvcHlfdXYKLQotCi07PT09PT09PT09PT09PT09PT09PT09PT0KLWIxNl9leHRlbmRfZnJhbWVfYm9yZGVycwotO2JvcmRlciA9IDE2Ci07PT09PT09PT09PT09PT09PT09PT09PT0KLTtCb3JkZXIgY29weSBmb3IgWSBwbGFuZQotO2NvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vc3QgY29sdW1ucyBvdXQKLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByMyAgICAgICAgICAgICAgO2Rlc3RwdHIxCi0gICAgYWRkICAgICAgICAgICAgIHI2LCByMSwgbHIKLSAgICBzdWIgICAgICAgICAgICAgcjYsIHI2LCByMywgbHNsICMxICAgICAgO2Rlc3RwdHIyCi0gICAgc3ViICAgICAgICAgICAgIHIyLCByNiwgIzEgICAgICAgICAgICAgIDtzcmNwdHIyCi0KLSAgICA7RG8gZm91ciByb3dzIGF0IG9uZSB0aW1lCi0gICAgbW92ICAgICAgICAgICAgIHIxMiwgcjQsIGxzciAjMgotCi1jb3B5X2xlZnRfcmlnaHRfeV9iMTYKLSAgICB2bGQxLjggICAgICAgICAge2QwW10sIGQxW119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDRbXSwgZDVbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkOFtdLCBkOVtdfSwgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QxMltdLCBkMTNbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTZbXSwgZDE3W119LCAgW3IxXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2QyMFtdLCBkMjFbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjRbXSwgZDI1W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI4W10sIGQyOVtdfSwgW3IyXSwgbHIKLQotICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTR9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTZ9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTh9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7cTEwfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3ExMn0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTR9LCBbcjZdLCBscgotCi0gICAgYm5lICAgICAgICAgICAgIGNvcHlfbGVmdF9yaWdodF95X2IxNgotCi07Tm93IGNvcHkgdGhlIHRvcCBhbmQgYm90dG9tIHNvdXJjZSBsaW5lcyBpbnRvIGVhY2ggbGluZSBvZiB0aGUgcmVzcGVjdGl2ZSBib3JkZXJzCi0gICAgbGRyICAgICAgICAgICAgIHI3LCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfeV9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgbXVsICAgICAgICAgICAgIHI4LCByMywgbHIKLQotICAgIG1vdiAgICAgICAgICAgICByMTIsIGxyLCBsc3IgIzcKLQotICAgIHN1YiAgICAgICAgICAgICByNiwgcjEsIHIzICAgICAgICAgICAgICA7ZGVzdHB0cjIKLSAgICBzdWIgICAgICAgICAgICAgcjIsIHI2LCBsciAgICAgICAgICAgICAgO3NyY3B0cjIKLSAgICBzdWIgICAgICAgICAgICAgcjEsIHI3LCByMyAgICAgICAgICAgICAgO3NyY3B0cjEKLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByOCAgICAgICAgICAgICAgO2Rlc3RwdHIxCi0KLWNvcHlfdG9wX2JvdHRvbV95X2IxNgotICAgIHZsZDEuOCAgICAgICAgICB7cTAsIHExfSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3E4LCBxOX0sIFtyMl0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjJdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3E2LCBxN30sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyMl0hCi0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIHIzCi0KLXRvcF9ib3R0b21fMTZfYjE2Ci0gICAgc3VicyAgICAgICAgICAgIHI3LCByNywgIzEKLQotICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3E4LCBxOX0sIFtyNl0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjZdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTQsIHE1fSwgW3I1XSEKLSAgICB2c3QxLjggICAgICAgICAge3ExMiwgcTEzfSwgW3I2XSEKLSAgICB2c3QxLjggICAgICAgICAge3E2LCBxN30sIFtyNV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTQsIHExNX0sIFtyNl0hCi0KLSAgICBhZGQgICAgICAgICAgICAgcjUsIHI1LCBscgotICAgIHN1YiAgICAgICAgICAgICByNSwgcjUsICMxMjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHI2LCBscgotICAgIHN1YiAgICAgICAgICAgICByNiwgcjYsICMxMjgKLQotICAgIGJuZSAgICAgICAgICAgICB0b3BfYm90dG9tXzE2X2IxNgotCi0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHIyLCBscgotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotICAgIGJuZSAgICAgICAgICAgICBjb3B5X3RvcF9ib3R0b21feV9iMTYKLQotICAgIG1vdiAgICAgICAgICAgICByNywgbHIsIGxzciAjNCAgICAgICAgICAgICAgO2NoZWNrIHRvIHNlZSBpZiBleHRyYSBjb3B5IGlzIG5lZWRlZAotICAgIGFuZHMgICAgICAgICAgICByNywgcjcsICMweDcKLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfdG9wX2JvdHRvbV95X2IxNgotZW5kX29mX2JvcmRlcl9jb3B5X3lfYjE2Ci0KLTtCb3JkZXIgY29weSBmb3IgVSwgViBwbGFuZXMKLSAgICBsZHIgICAgICAgICAgICAgcjEsIFtyMCwgI3l2MTJfYnVmZmVyX2NvbmZpZ191X2J1ZmZlcl0gICAgICAgO3NyY3B0cjEKLSAgICBtb3YgICAgICAgICAgICAgbHIsIGxyLCBsc3IgIzEgICAgICAgICAgICAgIDt1dl9zdHJpZGUKLSAgICBtb3YgICAgICAgICAgICAgcjMsIHIzLCBsc3IgIzEgICAgICAgICAgICAgIDtib3JkZXIKLSAgICBtb3YgICAgICAgICAgICAgcjQsIHI0LCBsc3IgIzEgICAgICAgICAgICAgIDt1dl9oZWlnaHQKLSAgICBtb3YgICAgICAgICAgICAgcjgsIHI4LCBsc3IgIzIKLQotICAgIG1vdiAgICAgICAgICAgICByMTAsICMyCi0KLTtjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0Ci1ib3JkZXJfY29weV91dl9iMTYKLSAgICBzdWIgICAgICAgICAgICAgcjUsIHIxLCByMyAgICAgICAgICAgICAgO2Rlc3RwdHIxCi0gICAgYWRkICAgICAgICAgICAgIHI2LCByMSwgbHIKLSAgICBzdWIgICAgICAgICAgICAgcjYsIHI2LCByMywgbHNsICMxICAgICAgO2Rlc3RwdHIyCi0gICAgc3ViICAgICAgICAgICAgIHIyLCByNiwgIzEgICAgICAgICAgICAgIDtzcmNwdHIyCi0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIHIxCi0KLSAgICA7RG8gZWlnaHQgcm93cyBhdCBvbmUgdGltZQotICAgIG1vdiAgICAgICAgICAgICByMTIsIHI0LCBsc3IgIzMKLQotY29weV9sZWZ0X3JpZ2h0X3V2X2IxNgotICAgIHZsZDEuOCAgICAgICAgICB7ZDBbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMltdfSwgW3IyXSwgbHIKLSAgICB2bGQxLjggICAgICAgICAge2Q0W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDZbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkOFtdfSwgIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTBbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTJbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTRbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMTZbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMThbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjBbXX0sIFtyMV0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjJbXX0sIFtyMl0sIGxyCi0gICAgdmxkMS44ICAgICAgICAgIHtkMjRbXX0sICBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI2W119LCBbcjJdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDI4W119LCBbcjFdLCBscgotICAgIHZsZDEuOCAgICAgICAgICB7ZDMwW119LCBbcjJdLCBscgotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkNH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkNn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMTB9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7ZDEyfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QxNH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMTZ9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7ZDE4fSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QyMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMjJ9LCBbcjZdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge2QyNn0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMjh9LCBbcjVdLCBscgotICAgIHZzdDEuOCAgICAgICAgICB7ZDMwfSwgW3I2XSwgbHIKLQotICAgIGJuZSAgICAgICAgICAgICBjb3B5X2xlZnRfcmlnaHRfdXZfYjE2Ci0KLTtOb3cgY29weSB0aGUgdG9wIGFuZCBib3R0b20gc291cmNlIGxpbmVzIGludG8gZWFjaCBsaW5lIG9mIHRoZSByZXNwZWN0aXZlIGJvcmRlcnMKLSAgICBtb3YgICAgICAgICAgICAgcjEyLCBsciwgbHNyICM2Ci0KLSAgICBzdWIgICAgICAgICAgICAgcjYsIHIxLCByMyAgICAgICAgICAgICAgO2Rlc3RwdHIyCi0gICAgc3ViICAgICAgICAgICAgIHIyLCByNiwgbHIgICAgICAgICAgICAgIDtzcmNwdHIyCi0gICAgc3ViICAgICAgICAgICAgIHIxLCByNywgcjMgICAgICAgICAgICAgIDtzcmNwdHIxCi0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjggICAgICAgICAgICAgIDtkZXN0cHRyMQotCi1jb3B5X3RvcF9ib3R0b21fdXZfYjE2Ci0gICAgdmxkMS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3IyXSEKLSAgICB2bGQxLjggICAgICAgICAge3EyLCBxM30sIFtyMV0hCi0gICAgdmxkMS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyMl0hCi0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIHIzCi0KLXRvcF9ib3R0b21fOF9iMTYKLSAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtxMCwgcTF9LCBbcjVdIQotICAgIHZzdDEuOCAgICAgICAgICB7cTgsIHE5fSwgW3I2XSEKLSAgICB2c3QxLjggICAgICAgICAge3EyLCBxM30sIFtyNV0hCi0gICAgdnN0MS44ICAgICAgICAgIHtxMTAsIHExMX0sIFtyNl0hCi0KLSAgICBhZGQgICAgICAgICAgICAgcjUsIHI1LCBscgotICAgIHN1YiAgICAgICAgICAgICByNSwgcjUsICM2NAotICAgIGFkZCAgICAgICAgICAgICByNiwgcjYsIGxyCi0gICAgc3ViICAgICAgICAgICAgIHI2LCByNiwgIzY0Ci0KLSAgICBibmUgICAgICAgICAgICAgdG9wX2JvdHRvbV84X2IxNgotCi0gICAgc3ViICAgICAgICAgICAgIHI1LCByMSwgcjgKLSAgICBhZGQgICAgICAgICAgICAgcjYsIHIyLCBscgotCi0gICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQotICAgIGJuZSAgICAgICAgICAgICBjb3B5X3RvcF9ib3R0b21fdXZfYjE2Ci0KLSAgICBtb3YgICAgICAgICAgICAgcjcsIGxyLCBsc3IgIzMgICAgICAgICAgICAgIDtjaGVjayB0byBzZWUgaWYgZXh0cmEgY29weSBpcyBuZWVkZWQKLSAgICBhbmRzICAgICAgICAgICAgcjcsIHI3LCAjMHg3Ci0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fdXZfYjE2Ci0KLWVuZF9vZl9ib3JkZXJfY29weV91dl9iMTYKLSAgICBzdWJzICAgICAgICAgICAgcjEwLCByMTAsICMxCi0gICAgbGRybmUgICAgICAgICAgIHIxLCBbcjAsICN5djEyX2J1ZmZlcl9jb25maWdfdl9idWZmZXJdICAgICAgIDtzcmNwdHIxCi0gICAgYm5lICAgICAgICAgICAgIGJvcmRlcl9jb3B5X3V2X2IxNgotCi0gICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9Ci0gICAgcG9wICAgICAgICAgICAgIHtyNCAtIHIxMCwgcGN9Ci0KLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTtleHRyYSBjb3B5IHBhcnQgZm9yIFkKLWV4dHJhX3RvcF9ib3R0b21feV9iMTYKLSAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IxXSEKLSAgICB2bGQxLjggICAgICAgICAge3EyfSwgW3IyXSEKLQotICAgIG1vdiAgICAgICAgICAgICByOSwgcjMsIGxzciAjMwotCi1leHRyYV90b3BfYm90dG9tXzE2X2IxNgotICAgIHN1YnMgICAgICAgICAgICByOSwgcjksICMxCi0KLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EwfSwgW3I1XSwgbHIKLSAgICB2c3QxLjggICAgICAgICAge3EyfSwgW3I2XSwgbHIKLSAgICBibmUgICAgICAgICAgICAgZXh0cmFfdG9wX2JvdHRvbV8xNl9iMTYKLQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4Ci0gICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIKLSAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tX3lfYjE2Ci0KLSAgICBiICAgICAgICAgICAgICAgZW5kX29mX2JvcmRlcl9jb3B5X3lfYjE2Ci0KLTtleHRyYSBjb3B5IHBhcnQgZm9yIFVWCi1leHRyYV90b3BfYm90dG9tX3V2X2IxNgotICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCBbcjFdIQotICAgIHZsZDEuOCAgICAgICAgICB7ZDh9LCBbcjJdIQotCi0gICAgbW92ICAgICAgICAgICAgIHI5LCByMywgbHNyICMzCi0KLWV4dHJhX3RvcF9ib3R0b21fOF9iMTYKLSAgICBzdWJzICAgICAgICAgICAgcjksIHI5LCAjMQotCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkMH0sIFtyNV0sIGxyCi0gICAgdnN0MS44ICAgICAgICAgIHtkOH0sIFtyNl0sIGxyCi0gICAgYm5lICAgICAgICAgICAgIGV4dHJhX3RvcF9ib3R0b21fOF9iMTYKLQotICAgIHN1YiAgICAgICAgICAgICByNSwgcjEsIHI4Ci0gICAgYWRkICAgICAgICAgICAgIHI2LCByMiwgbHIKLSAgICBzdWJzICAgICAgICAgICAgcjcsIHI3LCAjMQotICAgIGJuZSAgICAgICAgICAgICBleHRyYV90b3BfYm90dG9tX3V2X2IxNgotCi0gICAgYiAgICAgICAgICAgICAgIGVuZF9vZl9ib3JkZXJfY29weV91dl9iMTYKLQotICAgIEVORFAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9hcm0vc2NhbGVzeXN0ZW1kZXBlbmRlbnQuYyBiL3ZweF9zY2FsZS9hcm0vc2NhbGVzeXN0ZW1kZXBlbmRlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNzZmZi4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvYXJtL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvYXJtLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCi0KLQotdm9pZCAoKnZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX3B0cikoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbihZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7Ci0KLXZvaWQgKCp2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5X3B0cikoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV95b25seShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7Ci1leHRlcm4gdm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5X25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotCi12b2lkICgqdnA4X3l2MTJfY29weV9mcmFtZV9wdHIpKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKLWV4dGVybiB2b2lkIHZwOF95djEyX2NvcHlfZnJhbWUoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV9uZW9uKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEltcG9ydHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogdnA4X3NjYWxlX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnCi0gKgotICogIElOUFVUUyAgICAgICAgOiBVSU5UMzIgVmVyc2lvbiA6IENvZGVjIHZlcnNpb24gbnVtYmVyLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IENoZWNrcyBmb3IgbWFjaGluZSBzcGVjaWZjIGZlYXR1cmVzIHN1Y2ggYXMgTU1YIHN1cHBvcnQKLSAqICAgICAgICAgICAgICAgICAgc2V0cyBhcHByb3ByaWF0ZSBmbGFncyBhbmQgZnVuY3Rpb24gcG9pbnRlcnMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhfc2NhbGVfbWFjaGluZV9zcGVjaWZpY19jb25maWcoKQotewotI2lmIEhBVkVfQVJNVjcgJiYgQ09ORklHX1JVTlRJTUVfQ1BVX0RFVEVDVAotICAgIGludCBmbGFnczsKLSNlbmRpZgotICAgIC8qCi0gICAgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGUgICAgICAgID0gaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9hcm12NDsKLSAgICB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgICAgICAgICAgPSB2ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9hcm12NDsKLSAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jOwotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlICAgICAgICA9IGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYXJtdjQ7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICAgICAgID0gdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYXJtdjQ7Ci0gICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYzsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZSAgICAgICAgPSBob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2FybXY0OwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSAgICAgICAgICA9IHZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2FybXY0OwotICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlICAgICAgPSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2M7Ci0gICAgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGUgICAgICAgID0gaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9hcm12NDsKLSAgICB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgICAgICAgICAgPSB2ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9hcm12NDsKLSAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jOwotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlICAgICAgICA9IGhvcml6b250YWxfbGluZV80XzVfc2NhbGVfYXJtdjQ7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlICAgICAgICAgID0gdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYXJtdjQ7Ci0gICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYzsKLQotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZSAgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jOwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZSAgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jOwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZSAgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jOwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2M7Ci0gICAgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGUgICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYzsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZSAgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jOwotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlICAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX2M7Ci0gICAgKi8KLQotI2lmICFIQVZFX0FSTVY3IHx8IENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19wdHIgICAgICA9IHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzOwotICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfcHRyICAgICAgICAgID0gdnA4X3l2MTJfY29weV9mcmFtZV95b25seTsKLSAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0ciAgICAgICAgICAgPSB2cDhfeXYxMl9jb3B5X2ZyYW1lOwotI2VuZGlmCi0jaWYgSEFWRV9BUk1WNwotI2lmIENPTkZJR19SVU5USU1FX0NQVV9ERVRFQ1QKLSAgICBmbGFncyA9IGFybV9jcHVfY2FwcygpOwotICAgIGlmIChmbGFncyAmIEhBU19ORU9OKQotI2VuZGlmCi0gICAgewotICAgICAgICB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19wdHIgPSB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19uZW9uOwotICAgICAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5X3B0ciAgICAgPSB2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5X25lb247Ci0gICAgICAgIHZwOF95djEyX2NvcHlfZnJhbWVfcHRyICAgICAgICAgICA9IHZwOF95djEyX2NvcHlfZnJhbWVfbmVvbjsKLSAgICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9hcm0veXYxMmV4dGVuZF9hcm0uYyBiL3ZweF9zY2FsZS9hcm0veXYxMmV4dGVuZF9hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhODI4OS4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvYXJtL3l2MTJleHRlbmRfYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0jaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCi0KLXZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV9mdW5jX25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotCi12b2lkCi12cDhfeXYxMl9jb3B5X2ZyYW1lX25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpCi17Ci0gICAgdnA4X3l2MTJfY29weV9mcmFtZV9mdW5jX25lb24oc3JjX3liYywgZHN0X3liYyk7Ci0gICAgLy9wcmludGYoIkJvcmRlcjolZDsgcGxhbmVfc3RyaWRlOiVkOyBwbGFuZV9oZWlnaHQ6JWQ7IHBsYW5lX3dpZHRoOiVkXG4iLGRzdF95YmMtPmJvcmRlcixkc3RfeWJjLT55X3N0cmlkZSxkc3RfeWJjLT55X2hlaWdodCxkc3RfeWJjLT55X3dpZHRoKTsKLQotICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX3B0cihkc3RfeWJjKTsKLX0KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9nZW5lcmljL2JpY3ViaWNfc2NhbGVyLmMgYi92cHhfc2NhbGUvZ2VuZXJpYy9iaWN1YmljX3NjYWxlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDY4ZTlkLi4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9nZW5lcmljL2JpY3ViaWNfc2NhbGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgInZweHNjYWxlX2FyYml0cmFyeS5oIgotCi0jZGVmaW5lIEZJWEVEX1BPSU5UCi0KLSNkZWZpbmUgTUFYX0lOX1dJRFRIICAgICAgICA4MDAKLSNkZWZpbmUgTUFYX0lOX0hFSUdIVCAgICAgICA2MDAKLSNkZWZpbmUgTUFYX09VVF9XSURUSCAgICAgICA4MDAKLSNkZWZpbmUgTUFYX09VVF9IRUlHSFQgICAgICA2MDAKLSNkZWZpbmUgTUFYX09VVF9ESU1FTlNJT04gICAoKE1BWF9PVVRfV0lEVEggPiBNQVhfT1VUX0hFSUdIVCkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9PVVRfV0lEVEggOiBNQVhfT1VUX0hFSUdIVCkKLQotQklDVUJJQ19TQ0FMRVJfU1RSVUNUIGdfYl9zY2FsZXI7Ci1zdGF0aWMgaW50IGdfZmlyc3RfdGltZSA9IDE7Ci0KLSNwcmFnbWEgREFUQV9TRUNUSU9OKGdfaGJ1ZiwgIlZQNl9IRUFQIikKLSNwcmFnbWEgREFUQV9BTElHTiAoZ19oYnVmLCAzMik7Ci11bnNpZ25lZCBjaGFyIGdfaGJ1ZltNQVhfT1VUX0RJTUVOU0lPTl07Ci0KLSNwcmFnbWEgREFUQV9TRUNUSU9OKGdfaGJ1Zl91diwgIlZQNl9IRUFQIikKLSNwcmFnbWEgREFUQV9BTElHTiAoZ19oYnVmX3V2LCAzMik7Ci11bnNpZ25lZCBjaGFyIGdfaGJ1Zl91dltNQVhfT1VUX0RJTUVOU0lPTl07Ci0KLQotI2lmZGVmIEZJWEVEX1BPSU5UCi1zdGF0aWMgaW50IGFfaSA9IDAuNiAqIDY1NTM2OwotI2Vsc2UKLXN0YXRpYyBmbG9hdCBhID0gLTAuNjsKLSNlbmRpZgotCi0jaWZkZWYgRklYRURfUE9JTlQKLS8vICAgICAgICAgMyAgICAgMgotLy8gQzAgPSBhKnQgLSBhKnQKLS8vCi1zdGF0aWMgc2hvcnQgYzBfZml4ZWQodW5zaWduZWQgaW50IHQpCi17Ci0gICAgLy8gcHV0IHQgaW4gUTE2IG5vdGF0aW9uCi0gICAgdW5zaWduZWQgc2hvcnQgdjEsIHYyOwotCi0gICAgLy8gUTE2Ci0gICAgdjEgPSAoYV9pICogdCkgPj4gMTY7Ci0gICAgdjEgPSAodjEgKiB0KSA+PiAxNjsKLQotICAgIC8vIFExNgotICAgIHYyID0gKGFfaSAqIHQpID4+IDE2OwotICAgIHYyID0gKHYyICogdCkgPj4gMTY7Ci0gICAgdjIgPSAodjIgKiB0KSA+PiAxNjsKLQotICAgIC8vIFExMgotICAgIHJldHVybiAtKCh2MSAtIHYyKSA+PiA0KTsKLX0KLQotLy8gICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIDMKLS8vIEMxID0gYSp0ICsgKDMtMiphKSp0ICAtICgyLWEpKnQKLS8vCi1zdGF0aWMgc2hvcnQgYzFfZml4ZWQodW5zaWduZWQgaW50IHQpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdjEsIHYyLCB2MzsKLSAgICB1bnNpZ25lZCBzaG9ydCB0d28sIHRocmVlOwotCi0gICAgLy8gUTE2Ci0gICAgdjEgPSAoYV9pICogdCkgPj4gMTY7Ci0KLSAgICAvLyBRMTMKLSAgICB0d28gPSAyIDw8IDEzOwotICAgIHYyID0gdHdvIC0gKGFfaSA+PiAzKTsKLSAgICB2MiA9ICh2MiAqIHQpID4+IDE2OwotICAgIHYyID0gKHYyICogdCkgPj4gMTY7Ci0gICAgdjIgPSAodjIgKiB0KSA+PiAxNjsKLQotICAgIC8vIFExMwotICAgIHRocmVlID0gMyA8PCAxMzsKLSAgICB2MyA9IHRocmVlIC0gKDIgKiAoYV9pID4+IDMpKTsKLSAgICB2MyA9ICh2MyAqIHQpID4+IDE2OwotICAgIHYzID0gKHYzICogdCkgPj4gMTY7Ci0KLSAgICAvLyBRMTIKLSAgICByZXR1cm4gKCgodjEgPj4gMykgLSB2MiArIHYzKSA+PiAxKTsKLQotfQotCi0vLyAgICAgICAgICAgICAgICAgMiAgICAgICAgICAzCi0vLyBDMiA9IDEgLSAoMy1hKSp0ICArICgyLWEpKnQKLS8vCi1zdGF0aWMgc2hvcnQgYzJfZml4ZWQodW5zaWduZWQgaW50IHQpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdjEsIHYyLCB2MzsKLSAgICB1bnNpZ25lZCBzaG9ydCB0d28sIHRocmVlOwotCi0gICAgLy8gUTEzCi0gICAgdjEgPSAxIDw8IDEzOwotCi0gICAgLy8gUTEzCi0gICAgdGhyZWUgPSAzIDw8IDEzOwotICAgIHYyID0gdGhyZWUgLSAoYV9pID4+IDMpOwotICAgIHYyID0gKHYyICogdCkgPj4gMTY7Ci0gICAgdjIgPSAodjIgKiB0KSA+PiAxNjsKLQotICAgIC8vIFExMwotICAgIHR3byA9IDIgPDwgMTM7Ci0gICAgdjMgPSB0d28gLSAoYV9pID4+IDMpOwotICAgIHYzID0gKHYzICogdCkgPj4gMTY7Ci0gICAgdjMgPSAodjMgKiB0KSA+PiAxNjsKLSAgICB2MyA9ICh2MyAqIHQpID4+IDE2OwotCi0gICAgLy8gUTEyCi0gICAgcmV0dXJuICh2MSAtIHYyICsgdjMpID4+IDE7Ci19Ci0KLS8vICAgICAgICAgICAgICAgICAyICAgICAgMwotLy8gQzMgPSBhKnQgLSAyKmEqdCAgKyBhKnQKLS8vCi1zdGF0aWMgc2hvcnQgYzNfZml4ZWQodW5zaWduZWQgaW50IHQpCi17Ci0gICAgaW50IHYxLCB2MiwgdjM7Ci0KLSAgICAvLyBRMTYKLSAgICB2MSA9IChhX2kgKiB0KSA+PiAxNjsKLQotICAgIC8vIFExNQotICAgIHYyID0gMiAqIChhX2kgPj4gMSk7Ci0gICAgdjIgPSAodjIgKiB0KSA+PiAxNjsKLSAgICB2MiA9ICh2MiAqIHQpID4+IDE2OwotCi0gICAgLy8gUTE2Ci0gICAgdjMgPSAoYV9pICogdCkgPj4gMTY7Ci0gICAgdjMgPSAodjMgKiB0KSA+PiAxNjsKLSAgICB2MyA9ICh2MyAqIHQpID4+IDE2OwotCi0gICAgLy8gUTEyCi0gICAgcmV0dXJuICgodjIgLSAodjEgPj4gMSkgLSAodjMgPj4gMSkpID4+IDMpOwotfQotI2Vsc2UKLS8vICAgICAgICAgIDMgICAgIDIKLS8vIEMwID0gLWEqdCArIGEqdAotLy8KLWZsb2F0IEMwKGZsb2F0IHQpCi17Ci0gICAgcmV0dXJuIC1hICogdCAqIHQgKiB0ICsgYSAqIHQgKiB0OwotfQotCi0vLyAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIDMKLS8vIEMxID0gLWEqdCArICgyKmErMykqdCAgLSAoYSsyKSp0Ci0vLwotZmxvYXQgQzEoZmxvYXQgdCkKLXsKLSAgICByZXR1cm4gLShhICsgMi4wZikgKiB0ICogdCAqIHQgKyAoMi4wZiAqIGEgKyAzLjBmKSAqIHQgKiB0IC0gYSAqIHQ7Ci19Ci0KLS8vICAgICAgICAgICAgICAgICAyICAgICAgICAgIDMKLS8vIEMyID0gMSAtIChhKzMpKnQgICsgKGErMikqdAotLy8KLWZsb2F0IEMyKGZsb2F0IHQpCi17Ci0gICAgcmV0dXJuIChhICsgMi4wZikgKiB0ICogdCAqIHQgLSAoYSArIDMuMGYpICogdCAqIHQgKyAxLjBmOwotfQotCi0vLyAgICAgICAgICAgICAgICAgMiAgICAgIDMKLS8vIEMzID0gYSp0IC0gMiphKnQgICsgYSp0Ci0vLwotZmxvYXQgQzMoZmxvYXQgdCkKLXsKLSAgICByZXR1cm4gYSAqIHQgKiB0ICogdCAtIDIuMGYgKiBhICogdCAqIHQgKyBhICogdDsKLX0KLSNlbmRpZgotCi0jaWYgMAotaW50IGNvbXBhcmVfcmVhbF9maXhlZCgpCi17Ci0gICAgaW50IGksIGVycm9ycyA9IDA7Ci0gICAgZmxvYXQgbXVsdCA9IDEuMCAvIDEwMDAwLjA7Ci0gICAgdW5zaWduZWQgaW50IGZpeGVkX211bHQgPSBtdWx0ICogNDI5NDk2NzI5NjsvLzY1NTM2OwotICAgIHVuc2lnbmVkIGludCBwaGFzZV9vZmZzZXRfaW50OwotICAgIGZsb2F0IHBoYXNlX29mZnNldF9yZWFsOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspCi0gICAgewotICAgICAgICBpbnQgZml4ZWQwLCBmaXhlZDEsIGZpeGVkMiwgZml4ZWQzLCBmaXhlZF90b3RhbDsKLSAgICAgICAgaW50IHJlYWwwLCByZWFsMSwgcmVhbDIsIHJlYWwzLCByZWFsX3RvdGFsOwotCi0gICAgICAgIHBoYXNlX29mZnNldF9yZWFsID0gKGZsb2F0KWkgKiBtdWx0OwotICAgICAgICBwaGFzZV9vZmZzZXRfaW50ID0gKGZpeGVkX211bHQgKiBpKSA+PiAxNjsKLS8vICAgICAgcGhhc2Vfb2Zmc2V0X2ludCA9IHBoYXNlX29mZnNldF9yZWFsICogNjU1MzY7Ci0KLSAgICAgICAgZml4ZWQwID0gYzBfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0gICAgICAgIHJlYWwwID0gQzAocGhhc2Vfb2Zmc2V0X3JlYWwpICogNDA5Ni4wOwotCi0gICAgICAgIGlmICgoYWJzKGZpeGVkMCkgPiAoYWJzKHJlYWwwKSArIDEpKSB8fCAoYWJzKGZpeGVkMCkgPCAoYWJzKHJlYWwwKSAtIDEpKSkKLSAgICAgICAgICAgIGVycm9ycysrOwotCi0gICAgICAgIGZpeGVkMSA9IGMxX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOwotICAgICAgICByZWFsMSA9IEMxKHBoYXNlX29mZnNldF9yZWFsKSAqIDQwOTYuMDsKLQotICAgICAgICBpZiAoKGFicyhmaXhlZDEpID4gKGFicyhyZWFsMSkgKyAxKSkgfHwgKGFicyhmaXhlZDEpIDwgKGFicyhyZWFsMSkgLSAxKSkpCi0gICAgICAgICAgICBlcnJvcnMrKzsKLQotICAgICAgICBmaXhlZDIgPSBjMl9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKLSAgICAgICAgcmVhbDIgPSBDMihwaGFzZV9vZmZzZXRfcmVhbCkgKiA0MDk2LjA7Ci0KLSAgICAgICAgaWYgKChhYnMoZml4ZWQyKSA+IChhYnMocmVhbDIpICsgMSkpIHx8IChhYnMoZml4ZWQyKSA8IChhYnMocmVhbDIpIC0gMSkpKQotICAgICAgICAgICAgZXJyb3JzKys7Ci0KLSAgICAgICAgZml4ZWQzID0gYzNfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0gICAgICAgIHJlYWwzID0gQzMocGhhc2Vfb2Zmc2V0X3JlYWwpICogNDA5Ni4wOwotCi0gICAgICAgIGlmICgoYWJzKGZpeGVkMykgPiAoYWJzKHJlYWwzKSArIDEpKSB8fCAoYWJzKGZpeGVkMykgPCAoYWJzKHJlYWwzKSAtIDEpKSkKLSAgICAgICAgICAgIGVycm9ycysrOwotCi0gICAgICAgIGZpeGVkX3RvdGFsID0gZml4ZWQwICsgZml4ZWQxICsgZml4ZWQyICsgZml4ZWQzOwotICAgICAgICByZWFsX3RvdGFsID0gcmVhbDAgKyByZWFsMSArIHJlYWwyICsgcmVhbDM7Ci0KLSAgICAgICAgaWYgKChmaXhlZF90b3RhbCA+IDQwOTcpIHx8IChmaXhlZF90b3RhbCA8IDQwOTQpKQotICAgICAgICAgICAgZXJyb3JzICsrOwotCi0gICAgICAgIGlmICgocmVhbF90b3RhbCA+IDQwOTcpIHx8IChyZWFsX3RvdGFsIDwgNDA5NSkpCi0gICAgICAgICAgICBlcnJvcnMgKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yczsKLX0KLSNlbmRpZgotCi0vLyBGaW5kIGdyZWF0ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBiZXR3ZWVuIHR3byBpbnRlZ2Vycy4gIE1ldGhvZCB1c2VkIGhlcmUgaXMKLS8vICBzbG93IGNvbXBhcmVkIHRvIEV1Y2xpZCdzIGFsZ29yaXRobSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW55IGRpdmlzaW9uLgotaW50IGdjZChpbnQgYSwgaW50IGIpCi17Ci0gICAgLy8gUHJvYmxlbSB3aXRoIHRoaXMgYWxnb3JpdGhtIGlzIHRoYXQgaWYgYSBvciBiID0gMCB0aGlzIGZ1bmN0aW9uCi0gICAgLy8gIHdpbGwgbmV2ZXIgZXhpdC4gIERvbid0IHdhbnQgdG8gcmV0dXJuIDAgYmVjYXVzZSBhbnkgY29tcHV0YXRpb24KLSAgICAvLyAgdGhhdCB3YXMgYmFzZWQgb24gYSBjb21tb24gZGVub25pbmF0b3IgYW5kIHRyaWVkIHRvIHJlZHVjZSBieQotICAgIC8vICBkaXZpZGluZyBieSAwIHdvdWxkIGZhaWwuICBCZXN0IHNvbHV0aW9uIHRoYXQgY291bGQgYmUgdGhvdWdodCBvZgotICAgIC8vICB3b3VsZCB0byBiZSBmYWlsIGJ5IHJldHVyaW5nIGEgMTsKLSAgICBpZiAoYSA8PSAwIHx8IGIgPD0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICB3aGlsZSAoYSAhPSBiKQotICAgIHsKLSAgICAgICAgaWYgKGIgPiBhKQotICAgICAgICAgICAgYiA9IGIgLSBhOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB0bXAgPSBhOy8vc3dhcCBsYXJnZSBhbmQKLSAgICAgICAgICAgIGEgPSBiOyAvL3NtYWxsCi0gICAgICAgICAgICBiID0gdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGI7Ci19Ci0KLXZvaWQgYmljdWJpY19jb2VmZmljaWVudF9pbml0KCkKLXsKLSAgICB2cHhfbWVtc2V0KCZnX2Jfc2NhbGVyLCAwLCBzaXplb2YoQklDVUJJQ19TQ0FMRVJfU1RSVUNUKSk7Ci0gICAgZ19maXJzdF90aW1lID0gMDsKLX0KLQotdm9pZCBiaWN1YmljX2NvZWZmaWNpZW50X2Rlc3Ryb3koKQotewotICAgIGlmICghZ19maXJzdF90aW1lKQotICAgIHsKLSAgICAgICAgdnB4X2ZyZWUoZ19iX3NjYWxlci5sX3cpOwotCi0gICAgICAgIHZweF9mcmVlKGdfYl9zY2FsZXIubF9oKTsKLQotICAgICAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmxfaF91dik7Ci0KLSAgICAgICAgdnB4X2ZyZWUoZ19iX3NjYWxlci5jX3cpOwotCi0gICAgICAgIHZweF9mcmVlKGdfYl9zY2FsZXIuY19oKTsKLQotICAgICAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfaF91dik7Ci0KLSAgICAgICAgdnB4X21lbXNldCgmZ19iX3NjYWxlciwgMCwgc2l6ZW9mKEJJQ1VCSUNfU0NBTEVSX1NUUlVDVCkpOwotICAgIH0KLX0KLQotLy8gQ3JlYXRlIHRoZSBjb2VmZmllbnRzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY3ViaWMgaW50ZXJwb2xhdGlvbi4KLS8vICBCZWNhdXNlIHNjYWxpbmcgZG9lcyBub3QgaGF2ZSB0byBiZSBlcXVhbCBpbiB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwKLS8vICByZWdpbWVzIHRoZSBwaGFzZSBvZmZzZXRzIHdpbGwgYmUgZGlmZmVyZW50LiAgVGhlcmUgYXJlIDQgY29lZmZpY2VudHMKLS8vICBmb3IgZWFjaCBwb2ludCwgdHdvIG9uIGVhY2ggc2lkZS4gIFRoZSBsYXlvdXQgaXMgdGhhdCB0aGVyZSBhcmUgdGhlCi0vLyAgNCBjb2VmZmljZW50cyBmb3IgZWFjaCBwaGFzZSBpbiB0aGUgYXJyYXkgYW5kIHRoZW4gdGhlIG5leHQgcGhhc2UuCi1pbnQgYmljdWJpY19jb2VmZmljaWVudF9zZXR1cChpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsIGludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0KQotewotICAgIGludCBpOwotI2lmZGVmIEZJWEVEX1BPSU5UCi0gICAgaW50IHBoYXNlX29mZnNldF9pbnQ7Ci0gICAgdW5zaWduZWQgaW50IGZpeGVkX211bHQ7Ci0gICAgaW50IHByb2R1Y3RfdmFsID0gMDsKLSNlbHNlCi0gICAgZmxvYXQgcGhhc2Vfb2Zmc2V0OwotI2VuZGlmCi0gICAgaW50IGdjZF93LCBnY2RfaCwgZ2NkX2hfdXYsIGRfdywgZF9oLCBkX2hfdXY7Ci0KLSAgICBpZiAoZ19maXJzdF90aW1lKQotICAgICAgICBiaWN1YmljX2NvZWZmaWNpZW50X2luaXQoKTsKLQotCi0gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBjb2VmZmljZW50cyBoYXZlIGFscmVhZHkgYmVlbiBzZXQgdXAgY29ycmVjdGx5Ci0gICAgaWYgKChpbl93aWR0aCA9PSBnX2Jfc2NhbGVyLmluX3dpZHRoKSAmJiAoaW5faGVpZ2h0ID09IGdfYl9zY2FsZXIuaW5faGVpZ2h0KQotICAgICAgICAmJiAob3V0X3dpZHRoID09IGdfYl9zY2FsZXIub3V0X3dpZHRoKSAmJiAob3V0X2hlaWdodCA9PSBnX2Jfc2NhbGVyLm91dF9oZWlnaHQpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGdfYl9zY2FsZXIuaW5fd2lkdGggPSBpbl93aWR0aDsKLSAgICBnX2Jfc2NhbGVyLmluX2hlaWdodCA9IGluX2hlaWdodDsKLSAgICBnX2Jfc2NhbGVyLm91dF93aWR0aCA9IG91dF93aWR0aDsKLSAgICBnX2Jfc2NhbGVyLm91dF9oZWlnaHQgPSBvdXRfaGVpZ2h0OwotCi0gICAgLy8gRG9uJ3Qgd2FudCB0byBhbGxvdyBjcmF6eSBzY2FsaW5nLCBqdXN0IHRyeSBhbmQgcHJldmVudCBhIGNhdGFzdHJvcGhpYwotICAgIC8vICBmYWlsdXJlIGhlcmUuICBXYW50IHRvIGZhaWwgYWZ0ZXIgc2V0dGluZyB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBzbyBpZgotICAgIC8vICBpZiB0aGUgc2NhbGVyIGlzIGNhbGxlZCB0aGUgbWVtYmVyIGZ1bmN0aW9ucyB3aWxsIG5vdCBzY2FsZS4KLSAgICBpZiAob3V0X3dpZHRoIDw9IDAgfHwgb3V0X2hlaWdodCA8PSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvLyByZWR1Y2UgaW4vb3V0IHdpZHRoIGFuZCBoZWlnaHQgcmF0aW9zIHVzaW5nIHRoZSBnY2QKLSAgICBnY2RfdyA9IGdjZChvdXRfd2lkdGgsIGluX3dpZHRoKTsKLSAgICBnY2RfaCA9IGdjZChvdXRfaGVpZ2h0LCBpbl9oZWlnaHQpOwotICAgIGdjZF9oX3V2ID0gZ2NkKG91dF9oZWlnaHQsIGluX2hlaWdodCAvIDIpOwotCi0gICAgLy8gdGhlIG51bWVyYXRvciB3aWR0aCBhbmQgaGVpZ2h0IGFyZSB0byBiZSBzYXZlZCBpbgotICAgIC8vICBnbG9iYWxzIHNvIHRoZXkgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBzY2FsaW5nIHByb2Nlc3MKLSAgICAvLyAgd2l0aG91dCBoYXZpbmcgdG8gYmUgcmVjYWxjdWxhdGVkLgotICAgIGdfYl9zY2FsZXIubncgPSBvdXRfd2lkdGggLyBnY2RfdzsKLSAgICBkX3cgPSBpbl93aWR0aCAvIGdjZF93OwotCi0gICAgZ19iX3NjYWxlci5uaCA9IG91dF9oZWlnaHQgLyBnY2RfaDsKLSAgICBkX2ggPSBpbl9oZWlnaHQgLyBnY2RfaDsKLQotICAgIGdfYl9zY2FsZXIubmhfdXYgPSBvdXRfaGVpZ2h0IC8gZ2NkX2hfdXY7Ci0gICAgZF9oX3V2ID0gKGluX2hlaWdodCAvIDIpIC8gZ2NkX2hfdXY7Ci0KLSAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjb2VmZmljZW50cwotICAgIHZweF9mcmVlKGdfYl9zY2FsZXIubF93KTsKLQotICAgIHZweF9mcmVlKGdfYl9zY2FsZXIubF9oKTsKLQotICAgIHZweF9mcmVlKGdfYl9zY2FsZXIubF9oX3V2KTsKLQotICAgIGdfYl9zY2FsZXIubF93ID0gKHNob3J0ICopdnB4X21lbWFsaWduKDMyLCBvdXRfd2lkdGggKiAyKTsKLSAgICBnX2Jfc2NhbGVyLmxfaCA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgb3V0X2hlaWdodCAqIDIpOwotICAgIGdfYl9zY2FsZXIubF9oX3V2ID0gKHNob3J0ICopdnB4X21lbWFsaWduKDMyLCBvdXRfaGVpZ2h0ICogMik7Ci0KLSAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfdyk7Ci0KLSAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfaCk7Ci0KLSAgICB2cHhfZnJlZShnX2Jfc2NhbGVyLmNfaF91dik7Ci0KLSAgICBnX2Jfc2NhbGVyLmNfdyA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgZ19iX3NjYWxlci5udyAqIDQgKiAyKTsKLSAgICBnX2Jfc2NhbGVyLmNfaCA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgZ19iX3NjYWxlci5uaCAqIDQgKiAyKTsKLSAgICBnX2Jfc2NhbGVyLmNfaF91diA9IChzaG9ydCAqKXZweF9tZW1hbGlnbigzMiwgZ19iX3NjYWxlci5uaF91diAqIDQgKiAyKTsKLQotICAgIGdfYl9zY2FsZXIuaGJ1ZiA9IGdfaGJ1ZjsKLSAgICBnX2Jfc2NhbGVyLmhidWZfdXYgPSBnX2hidWZfdXY7Ci0KLSAgICAvLyBTZXQgdXAgcG9seXBoYXNlIGZpbHRlciB0YXBzLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZQotICAgIC8vICB0aGUgc2NhbGluZyBiZWNhdXNlIG9mIHRoZSBmbG9hdGluZyBwb2ludCBtYXRoIHJlcXVpcmVkLiAgVGhlCi0gICAgLy8gIGNvZWZmaWNpZW50cyBhcmUgbXVsdGlwbGllZCBieSAyXjEyIHNvIHRoYXQgZml4ZWQgcG9pbnQgbWF0aAotICAgIC8vICBjYW4gYmUgdXNlZCBpbiB0aGUgbWFpbiBzY2FsaW5nIGxvb3AuCi0jaWZkZWYgRklYRURfUE9JTlQKLSAgICBmaXhlZF9tdWx0ID0gKDEuMCAvIChmbG9hdClnX2Jfc2NhbGVyLm53KSAqIDQyOTQ5NjcyOTY7Ci0KLSAgICBwcm9kdWN0X3ZhbCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZ19iX3NjYWxlci5udzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHByb2R1Y3RfdmFsID4gZ19iX3NjYWxlci5udykKLSAgICAgICAgICAgIHByb2R1Y3RfdmFsIC09IGdfYl9zY2FsZXIubnc7Ci0KLSAgICAgICAgcGhhc2Vfb2Zmc2V0X2ludCA9IChmaXhlZF9tdWx0ICogcHJvZHVjdF92YWwpID4+IDE2OwotCi0gICAgICAgIGdfYl9zY2FsZXIuY193W2kqNF0gICA9IGMzX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOwotICAgICAgICBnX2Jfc2NhbGVyLmNfd1tpKjQrMV0gPSBjMl9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKLSAgICAgICAgZ19iX3NjYWxlci5jX3dbaSo0KzJdID0gYzFfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0gICAgICAgIGdfYl9zY2FsZXIuY193W2kqNCszXSA9IGMwX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOwotCi0gICAgICAgIHByb2R1Y3RfdmFsICs9IGRfdzsKLSAgICB9Ci0KLQotICAgIGZpeGVkX211bHQgPSAoMS4wIC8gKGZsb2F0KWdfYl9zY2FsZXIubmgpICogNDI5NDk2NzI5NjsKLQotICAgIHByb2R1Y3RfdmFsID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBnX2Jfc2NhbGVyLm5oOyBpKyspCi0gICAgewotICAgICAgICBpZiAocHJvZHVjdF92YWwgPiBnX2Jfc2NhbGVyLm5oKQotICAgICAgICAgICAgcHJvZHVjdF92YWwgLT0gZ19iX3NjYWxlci5uaDsKLQotICAgICAgICBwaGFzZV9vZmZzZXRfaW50ID0gKGZpeGVkX211bHQgKiBwcm9kdWN0X3ZhbCkgPj4gMTY7Ci0KLSAgICAgICAgZ19iX3NjYWxlci5jX2hbaSo0XSAgID0gYzBfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0gICAgICAgIGdfYl9zY2FsZXIuY19oW2kqNCsxXSA9IGMxX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOwotICAgICAgICBnX2Jfc2NhbGVyLmNfaFtpKjQrMl0gPSBjMl9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKLSAgICAgICAgZ19iX3NjYWxlci5jX2hbaSo0KzNdID0gYzNfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0KLSAgICAgICAgcHJvZHVjdF92YWwgKz0gZF9oOwotICAgIH0KLQotICAgIGZpeGVkX211bHQgPSAoMS4wIC8gKGZsb2F0KWdfYl9zY2FsZXIubmhfdXYpICogNDI5NDk2NzI5NjsKLQotICAgIHByb2R1Y3RfdmFsID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBnX2Jfc2NhbGVyLm5oX3V2OyBpKyspCi0gICAgewotICAgICAgICBpZiAocHJvZHVjdF92YWwgPiBnX2Jfc2NhbGVyLm5oX3V2KQotICAgICAgICAgICAgcHJvZHVjdF92YWwgLT0gZ19iX3NjYWxlci5uaF91djsKLQotICAgICAgICBwaGFzZV9vZmZzZXRfaW50ID0gKGZpeGVkX211bHQgKiBwcm9kdWN0X3ZhbCkgPj4gMTY7Ci0KLSAgICAgICAgZ19iX3NjYWxlci5jX2hfdXZbaSo0XSAgID0gYzBfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0gICAgICAgIGdfYl9zY2FsZXIuY19oX3V2W2kqNCsxXSA9IGMxX2ZpeGVkKHBoYXNlX29mZnNldF9pbnQpOwotICAgICAgICBnX2Jfc2NhbGVyLmNfaF91dltpKjQrMl0gPSBjMl9maXhlZChwaGFzZV9vZmZzZXRfaW50KTsKLSAgICAgICAgZ19iX3NjYWxlci5jX2hfdXZbaSo0KzNdID0gYzNfZml4ZWQocGhhc2Vfb2Zmc2V0X2ludCk7Ci0KLSAgICAgICAgcHJvZHVjdF92YWwgKz0gZF9oX3V2OwotICAgIH0KLQotI2Vsc2UKLQotICAgIGZvciAoaSA9IDA7IGkgPCBnX253OyBpKyspCi0gICAgewotICAgICAgICBwaGFzZV9vZmZzZXQgPSAoZmxvYXQpKChpICogZF93KSAlIGdfbncpIC8gKGZsb2F0KWdfbnc7Ci0gICAgICAgIGdfY193W2kqNF0gICA9IChDMyhwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKLSAgICAgICAgZ19jX3dbaSo0KzFdID0gKEMyKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOwotICAgICAgICBnX2Nfd1tpKjQrMl0gPSAoQzEocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7Ci0gICAgICAgIGdfY193W2kqNCszXSA9IChDMChwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZ19uaDsgaSsrKQotICAgIHsKLSAgICAgICAgcGhhc2Vfb2Zmc2V0ID0gKGZsb2F0KSgoaSAqIGRfaCkgJSBnX25oKSAvIChmbG9hdClnX25oOwotICAgICAgICBnX2NfaFtpKjRdICAgPSAoQzAocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7Ci0gICAgICAgIGdfY19oW2kqNCsxXSA9IChDMShwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKLSAgICAgICAgZ19jX2hbaSo0KzJdID0gKEMyKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOwotICAgICAgICBnX2NfaFtpKjQrM10gPSAoQzMocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGdfbmhfdXY7IGkrKykKLSAgICB7Ci0gICAgICAgIHBoYXNlX29mZnNldCA9IChmbG9hdCkoKGkgKiBkX2hfdXYpICUgZ19uaF91dikgLyAoZmxvYXQpZ19uaF91djsKLSAgICAgICAgZ19jX2hfdXZbaSo0XSAgID0gKEMwKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOwotICAgICAgICBnX2NfaF91dltpKjQrMV0gPSAoQzEocGhhc2Vfb2Zmc2V0KSAqIDQwOTYuMCk7Ci0gICAgICAgIGdfY19oX3V2W2kqNCsyXSA9IChDMihwaGFzZV9vZmZzZXQpICogNDA5Ni4wKTsKLSAgICAgICAgZ19jX2hfdXZbaSo0KzNdID0gKEMzKHBoYXNlX29mZnNldCkgKiA0MDk2LjApOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdGhhdCBjb3JyZXNwb25kcyBpbnB1dCBsaW5lcyB0byBvdXRwdXQgbGluZXMuCi0gICAgLy8gIFRoaXMgZG9lc24ndCByZXF1aXJlIGZsb2F0aW5nIHBvaW50IG1hdGgsIGJ1dCBpdCBkb2VzIHJlcXVpcmUKLSAgICAvLyAgYSBkaXZpc2lvbiBhbmQgYmVjYXVzZSBoYXJkd2FyZSBkaXZpc2lvbiBpcyBub3QgcHJlc2VudCB0aGF0Ci0gICAgLy8gIGlzIGEgY2FsbC4KLSAgICBmb3IgKGkgPSAwOyBpIDwgb3V0X3dpZHRoOyBpKyspCi0gICAgewotICAgICAgICBnX2Jfc2NhbGVyLmxfd1tpXSA9IChpICogZF93KSAvIGdfYl9zY2FsZXIubnc7Ci0KLSAgICAgICAgaWYgKChnX2Jfc2NhbGVyLmxfd1tpXSArIDIpIDw9IGluX3dpZHRoKQotICAgICAgICAgICAgZ19iX3NjYWxlci5tYXhfdXNhYmxlX291dF93aWR0aCA9IGk7Ci0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgb3V0X2hlaWdodCArIDE7IGkrKykKLSAgICB7Ci0gICAgICAgIGdfYl9zY2FsZXIubF9oW2ldID0gKGkgKiBkX2gpIC8gZ19iX3NjYWxlci5uaDsKLSAgICAgICAgZ19iX3NjYWxlci5sX2hfdXZbaV0gPSAoaSAqIGRfaF91dikgLyBnX2Jfc2NhbGVyLm5oX3V2OwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgYmljdWJpY19zY2FsZShpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsIGludCBpbl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCwgaW50IG91dF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dF9pbWFnZSwgdW5zaWduZWQgY2hhciAqb3V0cHV0X2ltYWdlKQotewotICAgIHNob3J0ICpSRVNUUklDVCBsX3csICogUkVTVFJJQ1QgbF9oOwotICAgIHNob3J0ICpSRVNUUklDVCBjX3csICogUkVTVFJJQ1QgY19oOwotICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIGlwLCAqIFJFU1RSSUNUIG9wOwotICAgIHVuc2lnbmVkIGNoYXIgKlJFU1RSSUNUIGhidWY7Ci0gICAgaW50IGgsIHcsIGx3LCBsaDsKLSAgICBpbnQgdGVtcF9zdW07Ci0gICAgaW50IHBoYXNlX29mZnNldF93LCBwaGFzZV9vZmZzZXRfaDsKLQotICAgIGNfdyA9IGdfYl9zY2FsZXIuY193OwotICAgIGNfaCA9IGdfYl9zY2FsZXIuY19oOwotCi0gICAgb3AgPSBvdXRwdXRfaW1hZ2U7Ci0KLSAgICBsX3cgPSBnX2Jfc2NhbGVyLmxfdzsKLSAgICBsX2ggPSBnX2Jfc2NhbGVyLmxfaDsKLQotICAgIHBoYXNlX29mZnNldF9oID0gMDsKLQotICAgIGZvciAoaCA9IDA7IGggPCBvdXRfaGVpZ2h0OyBoKyspCi0gICAgewotICAgICAgICAvLyBzZWxlY3QgdGhlIHJvdyB0byB3b3JrIG9uCi0gICAgICAgIGxoID0gbF9oW2hdOwotICAgICAgICBpcCA9IGlucHV0X2ltYWdlICsgKGluX3N0cmlkZSAqIGxoKTsKLQotICAgICAgICAvLyB2cDhfZmlsdGVyIHRoZSByb3cgdmVydGljYWxseSBpbnRvIGFuIHRlbXBvcmFyeSBidWZmZXIuCi0gICAgICAgIC8vICBJZiB0aGUgcGhhc2Ugb2Zmc2V0ID09IDAgdGhlbiBhbGwgdGhlIG11bHRpcGxpY2F0aW9uCi0gICAgICAgIC8vICBpcyBnb2luZyB0byByZXN1bHQgaW4gdGhlIG91dHB1dCBlcXVhbGxpbmcgdGhlIGlucHV0LgotICAgICAgICAvLyAgU28gaW5zdGVhZCBwb2ludCB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byB0aGUgaW5wdXQuCi0gICAgICAgIC8vICBBbHNvIGhhbmRsZSB0aGUgYm91bmRyeSBjb25kaXRpb24gb2Ygbm90IGJlaW5nIGFibGUgdG8KLSAgICAgICAgLy8gIGZpbHRlciB0aGF0IGxhc3QgbGluZXMuCi0gICAgICAgIGlmIChwaGFzZV9vZmZzZXRfaCAmJiAobGggPCBpbl9oZWlnaHQgLSAyKSkKLSAgICAgICAgewotICAgICAgICAgICAgaGJ1ZiA9IGdfYl9zY2FsZXIuaGJ1ZjsKLQotICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IGluX3dpZHRoOyB3KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcF9zdW0gPSAgY19oW3BoYXNlX29mZnNldF9oKjQrM10gKiBpcFt3IC0gaW5fc3RyaWRlXTsKLSAgICAgICAgICAgICAgICB0ZW1wX3N1bSArPSBjX2hbcGhhc2Vfb2Zmc2V0X2gqNCsyXSAqIGlwW3ddOwotICAgICAgICAgICAgICAgIHRlbXBfc3VtICs9IGNfaFtwaGFzZV9vZmZzZXRfaCo0KzFdICogaXBbdyArIGluX3N0cmlkZV07Ci0gICAgICAgICAgICAgICAgdGVtcF9zdW0gKz0gY19oW3BoYXNlX29mZnNldF9oKjRdICAgKiBpcFt3ICsgMippbl9zdHJpZGVdOwotCi0gICAgICAgICAgICAgICAgaGJ1Zlt3XSA9IHRlbXBfc3VtID4+IDEyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhidWYgPSBpcDsKLQotICAgICAgICAvLyBpbmNyZWFzZSB0aGUgcGhhc2Ugb2Zmc2V0IGZvciB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KLSAgICAgICAgaWYgKCsrcGhhc2Vfb2Zmc2V0X2ggPj0gZ19iX3NjYWxlci5uaCkKLSAgICAgICAgICAgIHBoYXNlX29mZnNldF9oID0gMDsKLQotICAgICAgICAvLyBub3cgZmlsdGVyIGFuZCBleHBhbmQgaXQgaG9yaXpvbnRhbGx5IGludG8gdGhlIGZpbmFsCi0gICAgICAgIC8vICBvdXRwdXQgYnVmZmVyCi0gICAgICAgIHBoYXNlX29mZnNldF93ID0gMDsKLQotICAgICAgICBmb3IgKHcgPSAwOyB3IDwgb3V0X3dpZHRoOyB3KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW5kZXggdG8gdXNlIHRvIGV4cGFuZCB0aGUgaW1hZ2UKLSAgICAgICAgICAgIGx3ID0gbF93W3ddOwotCi0gICAgICAgICAgICB0ZW1wX3N1bSA9ICBjX3dbcGhhc2Vfb2Zmc2V0X3cqNF0gICAqIGhidWZbbHcgLSAxXTsKLSAgICAgICAgICAgIHRlbXBfc3VtICs9IGNfd1twaGFzZV9vZmZzZXRfdyo0KzFdICogaGJ1Zltsd107Ci0gICAgICAgICAgICB0ZW1wX3N1bSArPSBjX3dbcGhhc2Vfb2Zmc2V0X3cqNCsyXSAqIGhidWZbbHcgKyAxXTsKLSAgICAgICAgICAgIHRlbXBfc3VtICs9IGNfd1twaGFzZV9vZmZzZXRfdyo0KzNdICogaGJ1ZltsdyArIDJdOwotICAgICAgICAgICAgdGVtcF9zdW0gPSB0ZW1wX3N1bSA+PiAxMjsKLQotICAgICAgICAgICAgaWYgKCsrcGhhc2Vfb2Zmc2V0X3cgPj0gZ19iX3NjYWxlci5udykKLSAgICAgICAgICAgICAgICBwaGFzZV9vZmZzZXRfdyA9IDA7Ci0KLSAgICAgICAgICAgIC8vIGJvdW5kcnkgY29uZGl0aW9ucwotICAgICAgICAgICAgaWYgKChsdyArIDIpID49IGluX3dpZHRoKQotICAgICAgICAgICAgICAgIHRlbXBfc3VtID0gaGJ1Zltsd107Ci0KLSAgICAgICAgICAgIGlmIChsdyA9PSAwKQotICAgICAgICAgICAgICAgIHRlbXBfc3VtID0gaGJ1ZlswXTsKLQotICAgICAgICAgICAgb3Bbd10gPSB0ZW1wX3N1bTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wICs9IG91dF9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYmljdWJpY19zY2FsZV9mcmFtZV9yZXNldCgpCi17Ci0gICAgZ19iX3NjYWxlci5vdXRfd2lkdGggPSAwOwotICAgIGdfYl9zY2FsZXIub3V0X2hlaWdodCA9IDA7Ci19Ci0KLXZvaWQgYmljdWJpY19zY2FsZV9mcmFtZShZVjEyX0JVRkZFUl9DT05GSUcgKnNyYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld193aWR0aCwgaW50IG5ld19oZWlnaHQpCi17Ci0KLSAgICBkc3QtPnlfd2lkdGggPSBuZXdfd2lkdGg7Ci0gICAgZHN0LT55X2hlaWdodCA9IG5ld19oZWlnaHQ7Ci0gICAgZHN0LT51dl93aWR0aCA9IG5ld193aWR0aCAvIDI7Ci0gICAgZHN0LT51dl9oZWlnaHQgPSBuZXdfaGVpZ2h0IC8gMjsKLQotICAgIGRzdC0+eV9zdHJpZGUgPSBkc3QtPnlfd2lkdGg7Ci0gICAgZHN0LT51dl9zdHJpZGUgPSBkc3QtPnV2X3dpZHRoOwotCi0gICAgYmljdWJpY19zY2FsZShzcmMtPnlfd2lkdGgsIHNyYy0+eV9oZWlnaHQsIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICBuZXdfd2lkdGgsIG5ld19oZWlnaHQsIGRzdC0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICBzcmMtPnlfYnVmZmVyLCBkc3QtPnlfYnVmZmVyKTsKLQotICAgIGJpY3ViaWNfc2NhbGUoc3JjLT51dl93aWR0aCwgc3JjLT51dl9oZWlnaHQsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgbmV3X3dpZHRoIC8gMiwgbmV3X2hlaWdodCAvIDIsIGRzdC0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgc3JjLT51X2J1ZmZlciwgZHN0LT51X2J1ZmZlcik7Ci0KLSAgICBiaWN1YmljX3NjYWxlKHNyYy0+dXZfd2lkdGgsIHNyYy0+dXZfaGVpZ2h0LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgIG5ld193aWR0aCAvIDIsIG5ld19oZWlnaHQgLyAyLCBkc3QtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgIHNyYy0+dl9idWZmZXIsIGRzdC0+dl9idWZmZXIpOwotfQpkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL2dlbmVyaWMvZ2VuX3NjYWxlcnMuYyBiL3ZweF9zY2FsZS9nZW5lcmljL2dlbl9zY2FsZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGUzMzQuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL2dlbmVyaWMvZ2VuX3NjYWxlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDk1NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEltcG9ydHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bwotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDQgdG8gNS4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOwotCi0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlX3dpZHRoIC0gNDsgaSArPSA0KQotICAgIHsKLSAgICAgICAgYSA9IHNyY1swXTsKLSAgICAgICAgYiA9IHNyY1sxXTsKLSAgICAgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKSBhOwotICAgICAgICBkZXMgWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhICogNTEgKyAyMDUgKiBiICsgMTI4KSA+PiA4KTsKLSAgICAgICAgYyA9IHNyY1syXSAqIDE1NDsKLSAgICAgICAgYSA9IHNyY1szXTsKLSAgICAgICAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDEwMiArIGMgKyAxMjgpID4+IDgpOwotICAgICAgICBkZXMgWzNdID0gKHVuc2lnbmVkIGNoYXIpKChjICsgMTAyICogYSArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGIgPSBzcmNbNF07Ci0gICAgICAgIGRlcyBbNF0gPSAodW5zaWduZWQgY2hhcikoKGEgKiAyMDUgKyA1MSAqIGIgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIHNyYyArPSA0OwotICAgICAgICBkZXMgKz0gNTsKLSAgICB9Ci0KLSAgICBhID0gc3JjWzBdOwotICAgIGIgPSBzcmNbMV07Ci0gICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKLSAgICBkZXMgWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhICogNTEgKyAyMDUgKiBiICsgMTI4KSA+PiA4KTsKLSAgICBjID0gc3JjWzJdICogMTU0OwotICAgIGEgPSBzcmNbM107Ci0gICAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDEwMiArIGMgKyAxMjgpID4+IDgpOwotICAgIGRlcyBbM10gPSAodW5zaWduZWQgY2hhcikoKGMgKyAxMDIgKiBhICsgMTI4KSA+PiA4KTsKLSAgICBkZXMgWzRdID0gKHVuc2lnbmVkIGNoYXIpKGEpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDQgdG8gNS4gVGhlCi0gKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgNC1waXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKQotICAgIHsKLSAgICAgICAgYSA9IGRlcyBbMF07Ci0gICAgICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2hdOwotCi0gICAgICAgIGRlc1tkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDUxICsgMjA1ICogYiArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgYyA9IGRlc1tkZXN0X3BpdGNoKjJdICogMTU0OwotICAgICAgICBkID0gZGVzW2Rlc3RfcGl0Y2gqM107Ci0KLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoKjJdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMTAyICsgYyArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCozXSA9ICh1bnNpZ25lZCBjaGFyKSgoYyArIDEwMiAqIGQgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIC8qIEZpcnN0IGxpbmUgaW4gbmV4dCBiYW5kICovCi0gICAgICAgIGEgPSBkZXMgW2Rlc3RfcGl0Y2ggKiA1XTsKLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoICogNF0gPSAodW5zaWduZWQgY2hhcikoKGQgKiAyMDUgKyA1MSAqIGEgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIGRlcyArKzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDogV2lkdGggb2YgZGVzdGluYXRpb24gZGF0YS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBTY2FsZXMgbGFzdCB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSA0IHRvIDUuIFRoZQotICogICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGJhbmQgc2NhbGVkIGlzIDQtcGl4ZWxzLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSBhdmFpbGFibGUgdGhlIGZpcnN0IGxpbmUgb2YKLSAqICAgICAgICAgICAgICAgICAgdGhlIGJhbmQgYmVsb3cgdGhlIGN1cnJlbnQgYmFuZCwgc2luY2UgdGhpcyBpcyB0aGUKLSAqICAgICAgICAgICAgICAgICAgbGFzdCBiYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgKytpKQotICAgIHsKLSAgICAgICAgYSA9IGRlc1swXTsKLSAgICAgICAgYiA9IGRlc1tkZXN0X3BpdGNoXTsKLQotICAgICAgICBkZXNbZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikoKGEgKiA1MSArIDIwNSAqIGIgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIGMgPSBkZXNbZGVzdF9waXRjaCoyXSAqIDE1NDsKLSAgICAgICAgZCA9IGRlc1tkZXN0X3BpdGNoKjNdOwotCi0gICAgICAgIGRlcyBbZGVzdF9waXRjaCoyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDEwMiArIGMgKyAxMjgpID4+IDgpOwotICAgICAgICBkZXMgW2Rlc3RfcGl0Y2gqM10gPSAodW5zaWduZWQgY2hhcikoKGMgKyAxMDIgKiBkICsgMTI4KSA+PiA4KTsKLQotICAgICAgICAvKiBObyBvdGhlciBsaW5lIGZvciBpbnRlcnBsYXRpb24gb2YgdGhpcyBsaW5lLCBzbyAuLiAqLwotICAgICAgICBkZXNbZGVzdF9waXRjaCo0XSA9ICh1bnNpZ25lZCBjaGFyKSBkOwotCi0gICAgICAgIGRlcysrOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZwOGN4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYwotICoKLSAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6IFN0cmlkZSBvZiBzb3VyY2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiAoTk9UIFVTRUQpLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzIGZyb20gc291cmNlIHRvCi0gKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNjYWxpbmcgdXAgYnkgMiB0byAzLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKLQotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aCAtIDI7IGkgKz0gMikKLSAgICB7Ci0gICAgICAgIGEgPSBzcmNbMF07Ci0gICAgICAgIGIgPSBzcmNbMV07Ci0gICAgICAgIGMgPSBzcmNbMl07Ci0KLSAgICAgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKLSAgICAgICAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDg1ICsgMTcxICogYiArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGRlcyBbMl0gPSAodW5zaWduZWQgY2hhcikoKGIgKiAxNzEgKyA4NSAqIGMgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIHNyYyArPSAyOwotICAgICAgICBkZXMgKz0gMzsKLSAgICB9Ci0KLSAgICBhID0gc3JjWzBdOwotICAgIGIgPSBzcmNbMV07Ci0gICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKLSAgICBkZXMgWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhICogODUgKyAxNzEgKiBiICsgMTI4KSA+PiA4KTsKLSAgICBkZXMgWzJdID0gKHVuc2lnbmVkIGNoYXIpKGIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDIgdG8gMy4gVGhlCi0gKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgMi1waXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKQotICAgIHsKLSAgICAgICAgYSA9IGRlcyBbMF07Ci0gICAgICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2hdOwotICAgICAgICBjID0gZGVzW2Rlc3RfcGl0Y2gqM107Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCAgXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDg1ICsgMTcxICogYiArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCoyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDE3MSArIDg1ICogYyArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgZGVzKys7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIGxhc3QgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMiB0byAzLiBUaGUKLSAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAyLXBpeGVscy4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIGRvZXMgbm90IGhhdmUgYXZhaWxhYmxlIHRoZSBmaXJzdCBsaW5lIG9mCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBiYW5kIGJlbG93IHRoZSBjdXJyZW50IGJhbmQsIHNpbmNlIHRoaXMgaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGxhc3QgYmFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYjsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkKLSAgICB7Ci0gICAgICAgIGEgPSBkZXMgWzBdOwotICAgICAgICBiID0gZGVzIFtkZXN0X3BpdGNoXTsKLQotICAgICAgICBkZXMgW2Rlc3RfcGl0Y2ggIF0gPSAodW5zaWduZWQgY2hhcikoKGEgKiA4NSArIDE3MSAqIGIgKyAxMjgpID4+IDgpOwotICAgICAgICBkZXMgW2Rlc3RfcGl0Y2gqMl0gPSAodW5zaWduZWQgY2hhcikoYik7Ci0gICAgICAgIGRlcysrOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZwOGN4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYwotICoKLSAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6IFN0cmlkZSBvZiBzb3VyY2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggICAgICA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiAoTk9UIFVTRUQpLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IENvcGllcyBob3Jpem9udGFsIGxpbmUgb2YgcGl4ZWxzIGZyb20gc291cmNlIHRvCi0gKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNjYWxpbmcgdXAgYnkgMyB0byA1LgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKLQotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aCAtIDM7IGkgKz0gMykKLSAgICB7Ci0gICAgICAgIGEgPSBzcmNbMF07Ci0gICAgICAgIGIgPSBzcmNbMV07Ci0gICAgICAgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7Ci0gICAgICAgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoKGEgKiAxMDIgKyAxNTQgKiBiICsgMTI4KSA+PiA4KTsKLQotICAgICAgICBjID0gc3JjWzJdIDsKLSAgICAgICAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDIwNSArIGMgKiA1MSArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGRlcyBbM10gPSAodW5zaWduZWQgY2hhcikoKGIgKiA1MSArIGMgKiAyMDUgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIGEgPSBzcmNbM107Ci0gICAgICAgIGRlcyBbNF0gPSAodW5zaWduZWQgY2hhcikoKGMgKiAxNTQgKyBhICogMTAyICsgMTI4KSA+PiA4KTsKLQotICAgICAgICBzcmMgKz0gMzsKLSAgICAgICAgZGVzICs9IDU7Ci0gICAgfQotCi0gICAgYSA9IHNyY1swXTsKLSAgICBiID0gc3JjWzFdOwotICAgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7Ci0KLSAgICBkZXMgWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhICogMTAyICsgMTU0ICogYiArIDEyOCkgPj4gOCk7Ci0gICAgYyA9IHNyY1syXSA7Ci0gICAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDIwNSArIGMgKiA1MSArIDEyOCkgPj4gOCk7Ci0gICAgZGVzIFszXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDUxICsgYyAqIDIwNSArIDEyOCkgPj4gOCk7Ci0KLSAgICBkZXMgWzRdID0gKHVuc2lnbmVkIGNoYXIpKGMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogdnA4Y3hfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYwotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2ggOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyB2ZXJ0aWNhbCBiYW5kIG9mIHBpeGVscyBieSBzY2FsZSAzIHRvIDUuIFRoZQotICogICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGJhbmQgc2NhbGVkIGlzIDMtcGl4ZWxzLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7IGkrKykKLSAgICB7Ci0gICAgICAgIGEgPSBkZXMgWzBdOwotICAgICAgICBiID0gZGVzIFtkZXN0X3BpdGNoXTsKLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDEwMiArIDE1NCAqIGIgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIGMgPSBkZXNbZGVzdF9waXRjaCoyXTsKLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoKjJdID0gKHVuc2lnbmVkIGNoYXIpKChiICogMjA1ICsgYyAqIDUxICsgMTI4KSA+PiA4KTsKLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoKjNdID0gKHVuc2lnbmVkIGNoYXIpKChiICogNTEgKyBjICogMjA1ICsgMTI4KSA+PiA4KTsKLQotICAgICAgICAvKiBGaXJzdCBsaW5lIGluIG5leHQgYmFuZC4uLiAqLwotICAgICAgICBhID0gZGVzIFtkZXN0X3BpdGNoICogNV07Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCAqIDRdID0gKHVuc2lnbmVkIGNoYXIpKChjICogMTU0ICsgYSAqIDEwMiArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgZGVzKys7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIGxhc3QgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMyB0byA1LiBUaGUKLSAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAzLXBpeGVscy4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIGRvZXMgbm90IGhhdmUgYXZhaWxhYmxlIHRoZSBmaXJzdCBsaW5lIG9mCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBiYW5kIGJlbG93IHRoZSBjdXJyZW50IGJhbmQsIHNpbmNlIHRoaXMgaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGxhc3QgYmFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkKLSAgICB7Ci0gICAgICAgIGEgPSBkZXMgWzBdOwotICAgICAgICBiID0gZGVzIFtkZXN0X3BpdGNoXTsKLQotICAgICAgICBkZXMgWyBkZXN0X3BpdGNoIF0gPSAodW5zaWduZWQgY2hhcikoKGEgKiAxMDIgKyAxNTQgKiBiICsgMTI4KSA+PiA4KTsKLQotICAgICAgICBjID0gZGVzW2Rlc3RfcGl0Y2gqMl07Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCoyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDIwNSArIGMgKiA1MSArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCozXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDUxICsgYyAqIDIwNSArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgLyogTm8gb3RoZXIgbGluZSBmb3IgaW50ZXJwbGF0aW9uIG9mIHRoaXMgbGluZSwgc28gLi4gKi8KLSAgICAgICAgZGVzIFsgZGVzdF9waXRjaCAqIDQgXSA9ICh1bnNpZ25lZCBjaGFyKShjKSA7Ci0KLSAgICAgICAgZGVzKys7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDogU3RyaWRlIG9mIHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KLSAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gc2NhbGluZyB1cCBieSAzIHRvIDQuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOwotCi0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlX3dpZHRoIC0gMzsgaSArPSAzKQotICAgIHsKLSAgICAgICAgYSA9IHNyY1swXTsKLSAgICAgICAgYiA9IHNyY1sxXTsKLSAgICAgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKLSAgICAgICAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDY0ICsgYiAqIDE5MiArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgYyA9IHNyY1syXTsKLSAgICAgICAgZGVzIFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiArIGMgKyAxKSA+PiAxKTsKLQotICAgICAgICBhID0gc3JjWzNdOwotICAgICAgICBkZXMgWzNdID0gKHVuc2lnbmVkIGNoYXIpKChjICogMTkyICsgYSAqIDY0ICsgMTI4KSA+PiA4KTsKLQotICAgICAgICBzcmMgKz0gMzsKLSAgICAgICAgZGVzICs9IDQ7Ci0gICAgfQotCi0gICAgYSA9IHNyY1swXTsKLSAgICBiID0gc3JjWzFdOwotICAgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7Ci0gICAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoYSAqIDY0ICsgYiAqIDE5MiArIDEyOCkgPj4gOCk7Ci0KLSAgICBjID0gc3JjWzJdIDsKLSAgICBkZXMgWzJdID0gKHVuc2lnbmVkIGNoYXIpKChiICsgYyArIDEpID4+IDEpOwotICAgIGRlcyBbM10gPSAodW5zaWduZWQgY2hhcikoYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDMgdG8gNC4gVGhlCi0gKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgMy1waXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKQotICAgIHsKLSAgICAgICAgYSA9IGRlcyBbMF07Ci0gICAgICAgIGIgPSBkZXMgW2Rlc3RfcGl0Y2hdOwotICAgICAgICBkZXMgW2Rlc3RfcGl0Y2hdICAgPSAodW5zaWduZWQgY2hhcikoKGEgKiA2NCArIGIgKiAxOTIgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIGMgPSBkZXNbZGVzdF9waXRjaCoyXTsKLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoKjJdID0gKHVuc2lnbmVkIGNoYXIpKChiICsgYyArIDEpID4+IDEpOwotCi0gICAgICAgIC8qIEZpcnN0IGxpbmUgaW4gbmV4dCBiYW5kLi4uICovCi0gICAgICAgIGEgPSBkZXMgW2Rlc3RfcGl0Y2gqNF07Ci0gICAgICAgIGRlcyBbZGVzdF9waXRjaCozXSA9ICh1bnNpZ25lZCBjaGFyKSgoYyAqIDE5MiArIGEgKiA2NCArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgZGVzKys7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCi0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6IFN0cmlkZSBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6IFdpZHRoIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGVzIGxhc3QgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMyB0byA0LiBUaGUKLSAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAzLXBpeGVscy4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIGRvZXMgbm90IGhhdmUgYXZhaWxhYmxlIHRoZSBmaXJzdCBsaW5lIG9mCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBiYW5kIGJlbG93IHRoZSBjdXJyZW50IGJhbmQsIHNpbmNlIHRoaXMgaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGxhc3QgYmFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYzsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkKLSAgICB7Ci0gICAgICAgIGEgPSBkZXMgWzBdOwotICAgICAgICBiID0gZGVzIFtkZXN0X3BpdGNoXTsKLQotICAgICAgICBkZXMgW2Rlc3RfcGl0Y2hdICAgPSAodW5zaWduZWQgY2hhcikoKGEgKiA2NCArIGIgKiAxOTIgKyAxMjgpID4+IDgpOwotCi0gICAgICAgIGMgPSBkZXNbZGVzdF9waXRjaCoyXTsKLSAgICAgICAgZGVzIFtkZXN0X3BpdGNoKjJdID0gKHVuc2lnbmVkIGNoYXIpKChiICsgYyArIDEpID4+IDEpOwotCi0gICAgICAgIC8qIE5vIG90aGVyIGxpbmUgZm9yIGludGVycGxhdGlvbiBvZiB0aGlzIGxpbmUsIHNvIC4uICovCi0gICAgICAgIGRlcyBbZGVzdF9waXRjaCozXSA9ICh1bnNpZ25lZCBjaGFyKShjKTsKLQotICAgICAgICBkZXMrKzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bwotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDEgdG8gMi4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYjsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKLQotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aCAtIDE7IGkgKz0gMSkKLSAgICB7Ci0gICAgICAgIGEgPSBzcmNbMF07Ci0gICAgICAgIGIgPSBzcmNbMV07Ci0gICAgICAgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7Ci0gICAgICAgIGRlcyBbMV0gPSAodW5zaWduZWQgY2hhcikoKGEgKyBiICsgMSkgPj4gMSk7Ci0gICAgICAgIHNyYyArPSAxOwotICAgICAgICBkZXMgKz0gMjsKLSAgICB9Ci0KLSAgICBhID0gc3JjWzBdOwotICAgIGRlcyBbMF0gPSAodW5zaWduZWQgY2hhcikoYSk7Ci0gICAgZGVzIFsxXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDogV2lkdGggb2YgZGVzdGluYXRpb24gZGF0YS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBTY2FsZXMgdmVydGljYWwgYmFuZCBvZiBwaXhlbHMgYnkgc2NhbGUgMSB0byAyLiBUaGUKLSAqICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBiYW5kIHNjYWxlZCBpcyAxLXBpeGVsLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYjsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7IGkrKykKLSAgICB7Ci0gICAgICAgIGEgPSBkZXMgWzBdOwotICAgICAgICBiID0gZGVzIFtkZXN0X3BpdGNoICogMl07Ci0KLSAgICAgICAgZGVzW2Rlc3RfcGl0Y2hdID0gKHVuc2lnbmVkIGNoYXIpKChhICsgYiArIDEpID4+IDEpOwotCi0gICAgICAgIGRlcysrOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYwotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6IFBvaW50ZXIgdG8gZGVzdGluYXRpb24gZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2ggOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOiBXaWR0aCBvZiBkZXN0aW5hdGlvbiBkYXRhLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlcyBsYXN0IHZlcnRpY2FsIGJhbmQgb2YgcGl4ZWxzIGJ5IHNjYWxlIDEgdG8gMi4gVGhlCi0gKiAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgYmFuZCBzY2FsZWQgaXMgMS1waXhlbC4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIGRvZXMgbm90IGhhdmUgYXZhaWxhYmxlIHRoZSBmaXJzdCBsaW5lIG9mCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBiYW5kIGJlbG93IHRoZSBjdXJyZW50IGJhbmQsIHNpbmNlIHRoaXMgaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGxhc3QgYmFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3Rfd2lkdGg7ICsraSkKLSAgICB7Ci0gICAgICAgIGRlc1tkZXN0X3BpdGNoXSA9IGRlc1swXTsKLSAgICAgICAgZGVzKys7Ci0gICAgfQotfQotCi0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bwotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDQgdG8gNS4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpOwotICAgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkLCBlOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOwotCi0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlX3dpZHRoOyBpICs9IDUpCi0gICAgewotICAgICAgICBhID0gc3JjWzBdOwotICAgICAgICBiID0gc3JjWzFdOwotICAgICAgICBjID0gc3JjWzJdOwotICAgICAgICBkID0gc3JjWzNdOwotICAgICAgICBlID0gc3JjWzRdOwotCi0gICAgICAgIGRlc1swXSA9ICh1bnNpZ25lZCBjaGFyKSBhOwotICAgICAgICBkZXNbMV0gPSAodW5zaWduZWQgY2hhcikoKGIgKiAxOTIgKyBjICogNjQgKyAxMjgpID4+IDgpOwotICAgICAgICBkZXNbMl0gPSAodW5zaWduZWQgY2hhcikoKGMgKiAxMjggKyBkICogMTI4ICsgMTI4KSA+PiA4KTsKLSAgICAgICAgZGVzWzNdID0gKHVuc2lnbmVkIGNoYXIpKChkICogNjQgKyBlICogMTkyICsgMTI4KSA+PiA4KTsKLQotICAgICAgICBzcmMgKz0gNTsKLSAgICAgICAgZGVzICs9IDQ7Ci0gICAgfQotfQotCi0KLQotCi12b2lkIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdW5zaWduZWQgaW50IGEsIGIsIGMsIGQsIGU7Ci0gICAgdW5zaWduZWQgY2hhciAqZGVzID0gZGVzdDsKLSAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSBzb3VyY2U7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKQotICAgIHsKLQotICAgICAgICBhID0gc3JjWzAgKiBzcmNfcGl0Y2hdOwotICAgICAgICBiID0gc3JjWzEgKiBzcmNfcGl0Y2hdOwotICAgICAgICBjID0gc3JjWzIgKiBzcmNfcGl0Y2hdOwotICAgICAgICBkID0gc3JjWzMgKiBzcmNfcGl0Y2hdOwotICAgICAgICBlID0gc3JjWzQgKiBzcmNfcGl0Y2hdOwotCi0gICAgICAgIGRlc1swICogZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikgYTsKLSAgICAgICAgZGVzWzEgKiBkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoYiAqIDE5MiArIGMgKiA2NCArIDEyOCkgPj4gOCk7Ci0gICAgICAgIGRlc1syICogZGVzdF9waXRjaF0gPSAodW5zaWduZWQgY2hhcikoKGMgKiAxMjggKyBkICogMTI4ICsgMTI4KSA+PiA4KTsKLSAgICAgICAgZGVzWzMgKiBkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoZCAqIDY0ICsgZSAqIDE5MiArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgc3JjICsrOwotICAgICAgICBkZXMgKys7Ci0KLSAgICB9Ci19Ci0KLQotLyo3KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bwotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDMgdG8gNS4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2MKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCi0gICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCi0pCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdW5zaWduZWQgaW50IGEsIGIsIGMsIGQgLCBlOwotICAgIHVuc2lnbmVkIGNoYXIgKmRlcyA9IGRlc3Q7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gc291cmNlOwotCi0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlX3dpZHRoOyBpICs9IDUpCi0gICAgewotICAgICAgICBhID0gc3JjWzBdOwotICAgICAgICBiID0gc3JjWzFdOwotICAgICAgICBjID0gc3JjWzJdOwotICAgICAgICBkID0gc3JjWzNdOwotICAgICAgICBlID0gc3JjWzRdOwotCi0gICAgICAgIGRlc1swXSA9ICh1bnNpZ25lZCBjaGFyKSBhOwotICAgICAgICBkZXNbMV0gPSAodW5zaWduZWQgY2hhcikoKGIgKiA4NSAgKyBjICogMTcxICsgMTI4KSA+PiA4KTsKLSAgICAgICAgZGVzWzJdID0gKHVuc2lnbmVkIGNoYXIpKChkICogMTcxICsgZSAqIDg1ICsgMTI4KSA+PiA4KTsKLQotICAgICAgICBzcmMgKz0gNTsKLSAgICAgICAgZGVzICs9IDM7Ci0gICAgfQotCi19Ci0KLXZvaWQgdnA4Y3hfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYywgZCwgZTsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotICAgIHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpKyspCi0gICAgewotCi0gICAgICAgIGEgPSBzcmNbMCAqIHNyY19waXRjaF07Ci0gICAgICAgIGIgPSBzcmNbMSAqIHNyY19waXRjaF07Ci0gICAgICAgIGMgPSBzcmNbMiAqIHNyY19waXRjaF07Ci0gICAgICAgIGQgPSBzcmNbMyAqIHNyY19waXRjaF07Ci0gICAgICAgIGUgPSBzcmNbNCAqIHNyY19waXRjaF07Ci0KLSAgICAgICAgZGVzWzAgKiBkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSBhOwotICAgICAgICBkZXNbMSAqIGRlc3RfcGl0Y2hdID0gKHVuc2lnbmVkIGNoYXIpKChiICogODUgKyBjICogMTcxICsgMTI4KSA+PiA4KTsKLSAgICAgICAgZGVzWzIgKiBkZXN0X3BpdGNoXSA9ICh1bnNpZ25lZCBjaGFyKSgoZCAqIDE3MSArIGUgKiA4NSArIDEyOCkgPj4gOCk7Ci0KLSAgICAgICAgc3JjICsrOwotICAgICAgICBkZXMgKys7Ci0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gc291cmNlIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOiBTdHJpZGUgb2Ygc291cmNlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gKE5PVCBVU0VEKS4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBDb3BpZXMgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscyBmcm9tIHNvdXJjZSB0bwotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzY2FsaW5nIHVwIGJ5IDEgdG8gMi4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYwotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYTsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKLQotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV93aWR0aDsgaSArPSAyKQotICAgIHsKLSAgICAgICAgYSA9IHNyY1swXTsKLSAgICAgICAgZGVzIFswXSA9ICh1bnNpZ25lZCBjaGFyKShhKTsKLSAgICAgICAgc3JjICs9IDI7Ci0gICAgICAgIGRlcyArPSAxOwotICAgIH0KLQotCi0KLX0KLXZvaWQgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICAodm9pZCkgZGVzdF9waXRjaDsKLSAgICAodm9pZCkgc3JjX3BpdGNoOwotICAgIHZweF9tZW1jcHkoZGVzdCwgc291cmNlLCBkZXN0X3dpZHRoKTsKLX0KLQotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IHRlbXA7Ci0gICAgaW50IHdpZHRoID0gZGVzdF93aWR0aDsKLQotICAgICh2b2lkKSBkZXN0X3BpdGNoOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCi0gICAgewotICAgICAgICB0ZW1wID0gODsKLSAgICAgICAgdGVtcCArPSBzb3VyY2VbaS0oaW50KXNyY19waXRjaF0gKiAzOwotICAgICAgICB0ZW1wICs9IHNvdXJjZVtpXSAqIDEwOwotICAgICAgICB0ZW1wICs9IHNvdXJjZVtpK3NyY19waXRjaF0gKiAzOwotICAgICAgICB0ZW1wID4+PSA0IDsKLSAgICAgICAgZGVzdFtpXSA9ICh1bnNpZ25lZCBjaGFyKSh0ZW1wKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9nZW5lcmljL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMgYi92cHhfc2NhbGUvZ2VuZXJpYy9zY2FsZXN5c3RlbWRlcGVuZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjZmZWI3Li4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9nZW5lcmljL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2luY2x1ZGUgInZweF9wb3J0cy9jb25maWcuaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKLQotCi12b2lkICgqdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfcHRyKShZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7Ci1leHRlcm4gdm9pZCB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVycyhZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7Ci0KLXZvaWQgKCp2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5X3B0cikoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV95b25seShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7Ci0KLXZvaWQgKCp2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cikoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBJbXBvcnRzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZwOF9zY2FsZV9tYWNoaW5lX3NwZWNpZmljX2NvbmZpZwotICoKLSAqICBJTlBVVFMgICAgICAgIDogVUlOVDMyIFZlcnNpb24gOiBDb2RlYyB2ZXJzaW9uIG51bWJlci4KLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiBDaGVja3MgZm9yIG1hY2hpbmUgc3BlY2lmYyBmZWF0dXJlcyBzdWNoIGFzIE1NWCBzdXBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIHNldHMgYXBwcm9wcmlhdGUgZmxhZ3MgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4X3NjYWxlX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKCkKLXsKLSNpZiBDT05GSUdfU1BBVElBTF9SRVNBTVBMSU5HCi0gICAgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jOwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2M7Ci0gICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYzsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZSAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2M7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYzsKLSAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jOwotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYzsKLSAgICB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jOwotICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlICAgICAgPSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2M7Ci0gICAgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jOwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2M7Ci0gICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYzsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZSAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2M7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYzsKLSAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jOwotCi0KLSAgICB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF81XzRfc2NhbGVfYzsKLSAgICB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGUgICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYzsKLSAgICB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGUgICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYzsKLSAgICB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9jOwotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlICAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX2M7Ci0gICAgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUgICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYzsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSAgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jOwotI2VuZGlmCi0KLSAgICB2cDhfeXYxMl9leHRlbmRfZnJhbWVfYm9yZGVyc19wdHIgICAgICA9IHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzOwotICAgIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHlfcHRyICAgICAgICAgID0gdnA4X3l2MTJfY29weV9mcmFtZV95b25seTsKLSAgICB2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0ciAgICAgICAgICAgPSB2cDhfeXYxMl9jb3B5X2ZyYW1lOwotCi19CmRpZmYgLS1naXQgYS92cHhfc2NhbGUvZ2VuZXJpYy92cHhzY2FsZS5jIGIvdnB4X3NjYWxlL2dlbmVyaWMvdnB4c2NhbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjOTEyMi4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvZ2VuZXJpYy92cHhzY2FsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIE1vZHVsZSBUaXRsZSA6ICAgICBzY2FsZS5jCi0gKgotICogICBEZXNjcmlwdGlvbiAgOiAgICAgSW1hZ2Ugc2NhbGluZyBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEhlYWRlciBGaWxlcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJ2cHhfbWVtL3ZweF9tZW0uaCIKLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgInZweF9zY2FsZS9zY2FsZV9tb2RlLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBFeHBvcnRzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBWUFhfTk9fR0xPQkFMUwotdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpID0gMDsKLXZvaWQgKCp2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZSkoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpID0gMDsKLXZvaWQgKCp2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlKSh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpID0gMDsKLQotdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZSkodW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpID0gMDsKLXZvaWQgKCp2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlKSh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pKSh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotdm9pZCAoKnZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKSA9IDA7Ci12b2lkICgqdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpID0gMDsKLXZvaWQgKCp2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSkoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkgPSAwOwotI2Vsc2UKLSMgaW5jbHVkZSAidnB4c2NhbGVfbm9mcC5oIgotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50ICAgICBleHBhbmRlZF9mcmFtZV93aWR0aDsKLSAgICBpbnQgICAgIGV4cGFuZGVkX2ZyYW1lX2hlaWdodDsKLQotICAgIGludCBIU2NhbGU7Ci0gICAgaW50IEhSYXRpbzsKLSAgICBpbnQgVlNjYWxlOwotICAgIGludCBWUmF0aW87Ci0KLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195dXZfY29uZmlnOwotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3l1dl9jb25maWc7Ci0KLX0gU0NBTEVfVkFSUzsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6ICAgICBob3Jpem9udGFsX2xpbmVfY29weQotICoKLSAqICBJTlBVVFMgICAgICAgIDogICAgIE5vbmUKLSAqCi0gKgotICogIE9VVFBVVFMgICAgICAgOiAgICAgTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6ICAgICBOb25lCi0gKgotICogIEZVTkNUSU9OICAgICAgOiAgICAgMSB0byAxIHNjYWxpbmcgdXAgZm9yIGEgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGxlcwotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogICAgIE5vbmUuCi0gKgotICogIEVSUk9SUyAgICAgICAgOiAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotdm9pZCBob3Jpem9udGFsX2xpbmVfY29weSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCi0gICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCi0pCi17Ci0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICBkdWNrX21lbWNweShkZXN0LCBzb3VyY2UsIHNvdXJjZV93aWR0aCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogICAgIG51bGxfc2NhbGUKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6ICAgICBOb25lCi0gKgotICoKLSAqICBPVVRQVVRTICAgICAgIDogICAgIE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiAgICAgTm9uZQotICoKLSAqICBGVU5DVElPTiAgICAgIDogICAgIDEgdG8gMSBzY2FsaW5nIHVwIGZvciBhIHZlcnRpY2FsIGJhbmQKLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6ICAgICBOb25lLgotICoKLSAqICBFUlJPUlMgICAgICAgIDogICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgbnVsbF9zY2FsZSgKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAotICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCi0pCi17Ci0gICAgKHZvaWQpIGRlc3Q7Ci0gICAgKHZvaWQpIGRlc3RfcGl0Y2g7Ci0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBzY2FsZTFkXzJ0MV9pCi0gKgotICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIGRhdGEgdG8gYmUgc2NhbGVkLgotICogICAgICAgICAgICAgICAgICBpbnQgc291cmNlX3N0ZXAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHBpeGVscyB0byBzdGVwIG9uIGluIHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9zY2FsZSAgICA6IFNjYWxlIGZvciBzb3VyY2UgKFVOVVNFRCkuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoICAgOiBMZW5ndGggb2Ygc291cmNlIChVTlVTRUQpLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIG91dHB1dCBkYXRhIGFycmF5LgotICogICAgICAgICAgICAgICAgICBpbnQgZGVzdF9zdGVwICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHBpeGVscyB0byBzdGVwIG9uIGluIGRlc3RpbmF0aW9uLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSAgICAgIDogU2NhbGUgZm9yIGRlc3RpbmF0aW9uIChVTlVTRUQpLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9sZW5ndGggICAgIDogTGVuZ3RoIG9mIGRlc3RpbmF0aW9uLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IFBlcmZvcm1zIDItdG8tMSBpbnRlcnBvbGF0ZWQgc2NhbGluZy4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgc2NhbGUxZF8ydDFfaQotKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICBpbnQgc291cmNlX3N0ZXAsCi0gICAgdW5zaWduZWQgaW50IHNvdXJjZV9zY2FsZSwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX2xlbmd0aCwKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIGludCBkZXN0X3N0ZXAsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfc2NhbGUsCi0gICAgdW5zaWduZWQgaW50IGRlc3RfbGVuZ3RoCi0pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7Ci0gICAgdW5zaWduZWQgaW50IHRlbXA7Ci0gICAgaW50IHNvdXJjZV9waXRjaCA9IHNvdXJjZV9zdGVwOwotICAgICh2b2lkKSBzb3VyY2VfbGVuZ3RoOwotICAgICh2b2lkKSBzb3VyY2Vfc2NhbGU7Ci0gICAgKHZvaWQpIGRlc3Rfc2NhbGU7Ci0KLSAgICBzb3VyY2Vfc3RlcCAqPSAyOwotICAgIGRlc3RbMF0gPSBzb3VyY2VbMF07Ci0KLSAgICBmb3IgKGkgPSBkZXN0X3N0ZXAsIGogPSBzb3VyY2Vfc3RlcDsgaSA8IGRlc3RfbGVuZ3RoICogZGVzdF9zdGVwOyBpICs9IGRlc3Rfc3RlcCwgaiArPSBzb3VyY2Vfc3RlcCkKLSAgICB7Ci0gICAgICAgIHRlbXAgPSA4OwotICAgICAgICB0ZW1wICs9IDMgKiBzb3VyY2Vbai1zb3VyY2VfcGl0Y2hdOwotICAgICAgICB0ZW1wICs9IDEwICogc291cmNlW2pdOwotICAgICAgICB0ZW1wICs9IDMgKiBzb3VyY2Vbaitzb3VyY2VfcGl0Y2hdOwotICAgICAgICB0ZW1wID4+PSA0OwotICAgICAgICBkZXN0W2ldID0gKGNoYXIpKHRlbXApOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHNjYWxlMWRfMnQxX3BzCi0gKgotICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIGRhdGEgdG8gYmUgc2NhbGVkLgotICogICAgICAgICAgICAgICAgICBpbnQgc291cmNlX3N0ZXAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHBpeGVscyB0byBzdGVwIG9uIGluIHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9zY2FsZSAgICA6IFNjYWxlIGZvciBzb3VyY2UgKFVOVVNFRCkuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoICAgOiBMZW5ndGggb2Ygc291cmNlIChVTlVTRUQpLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIG91dHB1dCBkYXRhIGFycmF5LgotICogICAgICAgICAgICAgICAgICBpbnQgZGVzdF9zdGVwICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHBpeGVscyB0byBzdGVwIG9uIGluIGRlc3RpbmF0aW9uLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSAgICAgIDogU2NhbGUgZm9yIGRlc3RpbmF0aW9uIChVTlVTRUQpLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9sZW5ndGggICAgIDogTGVuZ3RoIG9mIGRlc3RpbmF0aW9uLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IFBlcmZvcm1zIDItdG8tMSBwb2ludCBzdWJzYW1wbGVkIHNjYWxpbmcuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIHNjYWxlMWRfMnQxX3BzCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIGludCBzb3VyY2Vfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3NjYWxlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgaW50IGRlc3Rfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9sZW5ndGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKLQotICAgICh2b2lkKSBzb3VyY2VfbGVuZ3RoOwotICAgICh2b2lkKSBzb3VyY2Vfc2NhbGU7Ci0gICAgKHZvaWQpIGRlc3Rfc2NhbGU7Ci0KLSAgICBzb3VyY2Vfc3RlcCAqPSAyOwotICAgIGogPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlc3RfbGVuZ3RoICogZGVzdF9zdGVwOyBpICs9IGRlc3Rfc3RlcCwgaiArPSBzb3VyY2Vfc3RlcCkKLSAgICAgICAgZGVzdFtpXSA9IHNvdXJjZVtqXTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBzY2FsZTFkX2MKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6IFBvaW50ZXIgdG8gZGF0YSB0byBiZSBzY2FsZWQuCi0gKiAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfc3RlcCAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHN0ZXAgb24gaW4gc291cmNlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3NjYWxlICAgIDogU2NhbGUgZm9yIHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV9sZW5ndGggICA6IExlbmd0aCBvZiBzb3VyY2UgKFVOVVNFRCkuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEgYXJyYXkuCi0gKiAgICAgICAgICAgICAgICAgIGludCBkZXN0X3N0ZXAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHN0ZXAgb24gaW4gZGVzdGluYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3NjYWxlICAgICAgOiBTY2FsZSBmb3IgZGVzdGluYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2xlbmd0aCAgICAgOiBMZW5ndGggb2YgZGVzdGluYXRpb24uCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogUGVyZm9ybXMgbGluZWFyIGludGVycG9sYXRpb24gaW4gb25lIGRpbWVuc2lvbi4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgc2NhbGUxZF9jCi0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIGludCBzb3VyY2Vfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX3NjYWxlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoLAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgaW50IGRlc3Rfc3RlcCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9sZW5ndGgKLSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgcm91bmRfdmFsdWUgPSBkZXN0X3NjYWxlIC8gMjsKLSAgICB1bnNpZ25lZCBpbnQgbGVmdF9tb2RpZmllciA9IGRlc3Rfc2NhbGU7Ci0gICAgdW5zaWduZWQgaW50IHJpZ2h0X21vZGlmaWVyID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyIGxlZnRfcGl4ZWwgPSAqc291cmNlOwotICAgIHVuc2lnbmVkIGNoYXIgcmlnaHRfcGl4ZWwgPSAqKHNvdXJjZSArIHNvdXJjZV9zdGVwKTsKLQotICAgICh2b2lkKSBzb3VyY2VfbGVuZ3RoOwotCi0gICAgLyogVGhlc2UgYXNzZXJ0cyBhcmUgbmVlZGVkIGlmIHRoZXJlIGFyZSBib3VuZGFyeSBpc3N1ZXMuLi4gKi8KLSAgICAvKmFzc2VydCAoIGRlc3Rfc2NhbGUgPiBzb3VyY2Vfc2NhbGUgKTsqLwotICAgIC8qYXNzZXJ0ICggKHNvdXJjZV9sZW5ndGgtMSkgKiBkZXN0X3NjYWxlID49IChkZXN0X2xlbmd0aC0xKSAqIHNvdXJjZV9zY2FsZSApOyovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzdF9sZW5ndGggKiBkZXN0X3N0ZXA7IGkgKz0gZGVzdF9zdGVwKQotICAgIHsKLSAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgobGVmdF9tb2RpZmllciAqIGxlZnRfcGl4ZWwgKyByaWdodF9tb2RpZmllciAqIHJpZ2h0X3BpeGVsICsgcm91bmRfdmFsdWUpIC8gZGVzdF9zY2FsZSk7Ci0KLSAgICAgICAgcmlnaHRfbW9kaWZpZXIgKz0gc291cmNlX3NjYWxlOwotCi0gICAgICAgIHdoaWxlIChyaWdodF9tb2RpZmllciA+IGRlc3Rfc2NhbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJpZ2h0X21vZGlmaWVyIC09IGRlc3Rfc2NhbGU7Ci0gICAgICAgICAgICBzb3VyY2UgKz0gc291cmNlX3N0ZXA7Ci0gICAgICAgICAgICBsZWZ0X3BpeGVsID0gKnNvdXJjZTsKLSAgICAgICAgICAgIHJpZ2h0X3BpeGVsID0gKihzb3VyY2UgKyBzb3VyY2Vfc3RlcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsZWZ0X21vZGlmaWVyID0gZGVzdF9zY2FsZSAtIHJpZ2h0X21vZGlmaWVyOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IFNjYWxlMkQKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSAgOiBQb2ludGVyIHRvIGRhdGEgdG8gYmUgc2NhbGVkLgotICogICAgICAgICAgICAgICAgICBpbnQgc291cmNlX3BpdGNoICAgICAgICAgICAgICA6IFN0cmlkZSBvZiBzb3VyY2UgaW1hZ2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgIDogV2lkdGggb2YgaW5wdXQgaW1hZ2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2VfaGVpZ2h0ICAgIDogSGVpZ2h0IG9mIGlucHV0IGltYWdlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgIDogUG9pbnRlciB0byBvdXRwdXQgZGF0YSBhcnJheS4KLSAqICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2ggICAgICAgICAgICAgICAgOiBTdHJpZGUgb2YgZGVzdGluYXRpb24gaW1hZ2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgIDogV2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2hlaWdodCAgICAgIDogSGVpZ2h0IG9mIGRlc3RpbmF0aW9uIGltYWdlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0ZW1wX2FyZWEgICAgICA6IFBvaW50ZXIgdG8gdGVtcCB3b3JrIGFyZWEuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcF9hcmVhX2hlaWdodCA6IEhlaWdodCBvZiB0ZW1wIHdvcmsgYXJlYS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhzY2FsZSAgICAgICAgICA6IEhvcml6b250YWwgc2NhbGUgZmFjdG9yIG51bWVyYXRvci4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhyYXRpbyAgICAgICAgICA6IEhvcml6b250YWwgc2NhbGUgZmFjdG9yIGRlbm9taW5hdG9yLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdnNjYWxlICAgICAgICAgIDogVmVydGljYWwgc2NhbGUgZmFjdG9yIG51bWVyYXRvci4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZyYXRpbyAgICAgICAgICA6IFZlcnRpY2FsIHNjYWxlIGZhY3RvciBkZW5vbWluYXRvci4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGludGVybGFjZWQgICAgICA6IEludGVybGFjZSBmbGFnLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IFBlcmZvcm1zIDItdGFwIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHR3byBkaW1lbnNpb25zLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogRXhwYW5zaW9uIGlzIHBlcmZvcm1lZCBvbmUgYmFuZCBhdCBhIHRpbWUgdG8gaGVscCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGNhY2hpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgU2NhbGUyRAotKAotICAgIC8qY29uc3QqLwotICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwKLSAgICBpbnQgc291cmNlX3BpdGNoLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgaW50IHNvdXJjZV9oZWlnaHQsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICBpbnQgZGVzdF9waXRjaCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9oZWlnaHQsCi0gICAgdW5zaWduZWQgY2hhciAqdGVtcF9hcmVhLAotICAgIHVuc2lnbmVkIGNoYXIgdGVtcF9hcmVhX2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgaHNjYWxlLAotICAgIHVuc2lnbmVkIGludCBocmF0aW8sCi0gICAgdW5zaWduZWQgaW50IHZzY2FsZSwKLSAgICB1bnNpZ25lZCBpbnQgdnJhdGlvLAotICAgIHVuc2lnbmVkIGludCBpbnRlcmxhY2VkCi0pCi17Ci0gICAgLyp1bnNpZ25lZCovCi0gICAgaW50IGksIGosIGs7Ci0gICAgaW50IGJhbmRzOwotICAgIGludCBkZXN0X2JhbmRfaGVpZ2h0OwotICAgIGludCBzb3VyY2VfYmFuZF9oZWlnaHQ7Ci0KLSAgICB0eXBlZGVmIHZvaWQgKCpTY2FsZTFEKShjb25zdCB1bnNpZ25lZCBjaGFyICogc291cmNlLCBpbnQgc291cmNlX3N0ZXAsIHVuc2lnbmVkIGludCBzb3VyY2Vfc2NhbGUsIHVuc2lnbmVkIGludCBzb3VyY2VfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBkZXN0LCBpbnQgZGVzdF9zdGVwLCB1bnNpZ25lZCBpbnQgZGVzdF9zY2FsZSwgdW5zaWduZWQgaW50IGRlc3RfbGVuZ3RoKTsKLQotICAgIFNjYWxlMUQgU2NhbGUxRHYgPSBzY2FsZTFkX2M7Ci0gICAgU2NhbGUxRCBTY2FsZTFEaCA9IHNjYWxlMWRfYzsKLQotICAgIHZvaWQgKCpob3Jpel9saW5lX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpID0gTlVMTDsKLSAgICB2b2lkICgqdmVydF9iYW5kX3NjYWxlKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkgPSBOVUxMOwotCi0gICAgaW50IHJhdGlvX3NjYWxhYmxlID0gMTsKLSAgICBpbnQgaW50ZXJwb2xhdGlvbiA9IDA7Ci0KLSAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2VfYmFzZTsgLyogPSAodW5zaWduZWQgY2hhciAqKSAoKHNvdXJjZV9waXRjaCA+PSAwKSA/IHNvdXJjZSA6IChzb3VyY2UgKyAoKHNvdXJjZV9oZWlnaHQtMSkgKiBzb3VyY2VfcGl0Y2gpKSk7ICovCi0gICAgdW5zaWduZWQgY2hhciAqbGluZV9zcmM7Ci0KLQotICAgIHNvdXJjZV9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilzb3VyY2U7Ci0KLSAgICBpZiAoc291cmNlX3BpdGNoIDwgMCkKLSAgICB7Ci0gICAgICAgIGludCBvZmZzZXQ7Ci0KLSAgICAgICAgb2Zmc2V0ID0gKHNvdXJjZV9oZWlnaHQgLSAxKTsKLSAgICAgICAgb2Zmc2V0ICo9IHNvdXJjZV9waXRjaDsKLQotICAgICAgICBzb3VyY2VfYmFzZSArPSBvZmZzZXQ7Ci0gICAgfQotCi0gICAgLyogZmluZCBvdXQgdGhlIHJhdGlvIGZvciBlYWNoIGRpcmVjdGlvbiAqLwotICAgIHN3aXRjaCAoaHJhdGlvICogMTAgLyBoc2NhbGUpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgICAgLyogNC01IFNjYWxlIGluIFdpZHRoIGRpcmVjdGlvbiAqLwotICAgICAgICBob3Jpel9saW5lX3NjYWxlID0gdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgLyogMy01IFNjYWxlIGluIFdpZHRoIGRpcmVjdGlvbiAqLwotICAgICAgICBob3Jpel9saW5lX3NjYWxlID0gdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgICAgLyogMS0yIFNjYWxlIGluIFdpZHRoIGRpcmVjdGlvbiAqLwotICAgICAgICBob3Jpel9saW5lX3NjYWxlID0gdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIFRoZSByYXRpbyBpcyBub3QgYWNjZXB0YWJsZSBub3cgKi8KLSAgICAgICAgLyogdGhyb3coIlRoZSByYXRpbyBpcyBub3QgYWNjZXB0YWJsZSBmb3Igbm93ISIpOyAqLwotICAgICAgICByYXRpb19zY2FsYWJsZSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCAodnJhdGlvICogMTAgLyB2c2NhbGUpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgICAgLyogNC01IFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLwotICAgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlOwotICAgICAgICBzb3VyY2VfYmFuZF9oZWlnaHQgID0gNTsKLSAgICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgLyogMy01IFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLwotICAgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlOwotICAgICAgICBzb3VyY2VfYmFuZF9oZWlnaHQgID0gNTsKLSAgICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgICAgLyogMS0yIFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLwotCi0gICAgICAgIGlmIChpbnRlcmxhY2VkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiB0aGUgY29udGVudCBpcyBpbnRlcmxhY2VkLCBwb2ludCBzYW1wbGluZyBpcyB1c2VkICovCi0gICAgICAgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gMTsKLSAgICAgICAgICAgIC8qIGlmIHRoZSBjb250ZW50IGlzIHByb2dyZXNzaXZlLCBpbnRlcnBsbyAqLwotICAgICAgICAgICAgdmVydF9iYW5kX3NjYWxlICAgICA9IHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pOwotCi0gICAgICAgIH0KLQotICAgICAgICBzb3VyY2VfYmFuZF9oZWlnaHQgID0gMjsKLSAgICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIFRoZSByYXRpbyBpcyBub3QgYWNjZXB0YWJsZSBub3cgKi8KLSAgICAgICAgLyogdGhyb3coIlRoZSByYXRpbyBpcyBub3QgYWNjZXB0YWJsZSBmb3Igbm93ISIpOyAqLwotICAgICAgICByYXRpb19zY2FsYWJsZSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChyYXRpb19zY2FsYWJsZSkKLSAgICB7Ci0gICAgICAgIGlmIChzb3VyY2VfaGVpZ2h0ID09IGRlc3RfaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmb3IgZWFjaCBiYW5kIG9mIHRoZSBpbWFnZSAqLwotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IChpbnQpZGVzdF9oZWlnaHQ7IGsrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob3Jpel9saW5lX3NjYWxlKHNvdXJjZSwgc291cmNlX3dpZHRoLCBkZXN0LCBkZXN0X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBzb3VyY2UgKz0gc291cmNlX3BpdGNoOwotICAgICAgICAgICAgICAgIGRlc3QgICArPSBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvdXJjZSA8IHNvdXJjZV9iYXNlKQotICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZV9iYXNlOwotCi0gICAgICAgICAgICBob3Jpel9saW5lX3NjYWxlKHNvdXJjZSwgc291cmNlX3dpZHRoLCB0ZW1wX2FyZWEsIGRlc3Rfd2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChrID0gMDsgayA8IChpbnQpKGRlc3RfaGVpZ2h0ICsgZGVzdF9iYW5kX2hlaWdodCAtIDEpIC8gZGVzdF9iYW5kX2hlaWdodDsgaysrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzY2FsZSBvbmUgYmFuZCBob3Jpem9udGFsbHkgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VfYmFuZF9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUcmFwIGNhc2Ugd2hlcmUgd2UgY291bGQgcmVhZCBvZmYgdGhlIGJhc2Ugb2YgdGhlIHNvdXJjZSBidWZmZXIgKi8KLQotICAgICAgICAgICAgICAgIGxpbmVfc3JjID0gKHVuc2lnbmVkIGNoYXIgKilzb3VyY2UgKyBpICogc291cmNlX3BpdGNoOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVfc3JjIDwgc291cmNlX2Jhc2UpCi0gICAgICAgICAgICAgICAgICAgIGxpbmVfc3JjID0gc291cmNlX2Jhc2U7Ci0KLSAgICAgICAgICAgICAgICBob3Jpel9saW5lX3NjYWxlKGxpbmVfc3JjLCBzb3VyY2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2FyZWEgKyAoaSArIDEpKmRlc3RfcGl0Y2gsIGRlc3Rfd2lkdGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBWZXJ0aWNhbCBzY2FsaW5nIGlzIGluIHBsYWNlICovCi0gICAgICAgICAgICB2ZXJ0X2JhbmRfc2NhbGUodGVtcF9hcmVhICsgZGVzdF9waXRjaCwgZGVzdF9waXRjaCwgZGVzdCwgZGVzdF9waXRjaCwgZGVzdF93aWR0aCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uKQotICAgICAgICAgICAgICAgIHZweF9tZW1jcHkodGVtcF9hcmVhLCB0ZW1wX2FyZWEgKyBzb3VyY2VfYmFuZF9oZWlnaHQgKiBkZXN0X3BpdGNoLCBkZXN0X3dpZHRoKTsKLQotICAgICAgICAgICAgLyogTmV4dCBiYW5kLi4uICovCi0gICAgICAgICAgICBzb3VyY2UgKz0gKHVuc2lnbmVkIGxvbmcpIHNvdXJjZV9iYW5kX2hlaWdodCAgKiBzb3VyY2VfcGl0Y2g7Ci0gICAgICAgICAgICBkZXN0ICAgKz0gKHVuc2lnbmVkIGxvbmcpIGRlc3RfYmFuZF9oZWlnaHQgKiBkZXN0X3BpdGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChoc2NhbGUgPT0gMiAmJiBocmF0aW8gPT0gMSkKLSAgICAgICAgU2NhbGUxRGggPSBzY2FsZTFkXzJ0MV9wczsKLQotICAgIGlmICh2c2NhbGUgPT0gMiAmJiB2cmF0aW8gPT0gMSkKLSAgICB7Ci0gICAgICAgIGlmIChpbnRlcmxhY2VkKQotICAgICAgICAgICAgU2NhbGUxRHYgPSBzY2FsZTFkXzJ0MV9wczsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU2NhbGUxRHYgPSBzY2FsZTFkXzJ0MV9pOwotICAgIH0KLQotICAgIGlmIChzb3VyY2VfaGVpZ2h0ID09IGRlc3RfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgLyogZm9yIGVhY2ggYmFuZCBvZiB0aGUgaW1hZ2UgKi8KLSAgICAgICAgZm9yIChrID0gMDsgayA8IChpbnQpZGVzdF9oZWlnaHQ7IGsrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NhbGUxRGgoc291cmNlLCAxLCBoc2NhbGUsIHNvdXJjZV93aWR0aCArIDEsIGRlc3QsIDEsIGhyYXRpbywgZGVzdF93aWR0aCk7Ci0gICAgICAgICAgICBzb3VyY2UgKz0gc291cmNlX3BpdGNoOwotICAgICAgICAgICAgZGVzdCAgICs9IGRlc3RfcGl0Y2g7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGRlc3RfaGVpZ2h0ID4gc291cmNlX2hlaWdodCkKLSAgICB7Ci0gICAgICAgIGRlc3RfYmFuZF9oZWlnaHQgICA9IHRlbXBfYXJlYV9oZWlnaHQgLSAxOwotICAgICAgICBzb3VyY2VfYmFuZF9oZWlnaHQgPSBkZXN0X2JhbmRfaGVpZ2h0ICogc291cmNlX2hlaWdodCAvIGRlc3RfaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzb3VyY2VfYmFuZF9oZWlnaHQgPSB0ZW1wX2FyZWFfaGVpZ2h0IC0gMTsKLSAgICAgICAgZGVzdF9iYW5kX2hlaWdodCAgID0gc291cmNlX2JhbmRfaGVpZ2h0ICogdnJhdGlvIC8gdnNjYWxlOwotICAgIH0KLQotICAgIC8qIGZpcnN0IHJvdyBuZWVkcyB0byBiZSBkb25lIHNvIHRoYXQgd2UgY2FuIHN0YXkgb25lIHJvdyBhaGVhZCBmb3IgdmVydGljYWwgem9vbSAqLwotICAgIFNjYWxlMURoKHNvdXJjZSwgMSwgaHNjYWxlLCBzb3VyY2Vfd2lkdGggKyAxLCB0ZW1wX2FyZWEsIDEsIGhyYXRpbywgZGVzdF93aWR0aCk7Ci0KLSAgICAvKiBmb3IgZWFjaCBiYW5kIG9mIHRoZSBpbWFnZSAqLwotICAgIGJhbmRzID0gKGRlc3RfaGVpZ2h0ICsgZGVzdF9iYW5kX2hlaWdodCAtIDEpIC8gZGVzdF9iYW5kX2hlaWdodDsKLQotICAgIGZvciAoayA9IDA7IGsgPCBiYW5kczsgaysrKQotICAgIHsKLSAgICAgICAgLyogc2NhbGUgb25lIGJhbmQgaG9yaXpvbnRhbGx5ICovCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBzb3VyY2VfYmFuZF9oZWlnaHQgKyAxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChrICogc291cmNlX2JhbmRfaGVpZ2h0ICsgaSA8IChpbnQpIHNvdXJjZV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NhbGUxRGgoc291cmNlICsgaSAqIHNvdXJjZV9waXRjaCwgMSwgaHNjYWxlLCBzb3VyY2Vfd2lkdGggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfYXJlYSArIGkgKiBkZXN0X3BpdGNoLCAxLCBocmF0aW8sIGRlc3Rfd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgLyogIER1cGxpY2F0ZSB0aGUgbGFzdCByb3cgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb3B5IHRlbXBfYXJlYSByb3cgMCBvdmVyIGZyb20gbGFzdCByb3cgaW4gdGhlIHBhc3QgKi8KLSAgICAgICAgICAgICAgICBkdWNrX21lbWNweSh0ZW1wX2FyZWEgKyBpICogZGVzdF9waXRjaCwgdGVtcF9hcmVhICsgKGkgLSAxKSpkZXN0X3BpdGNoLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNjYWxlIG9uZSBiYW5kIHZlcnRpY2FsbHkgKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IChpbnQpZGVzdF93aWR0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2FsZTFEdigmdGVtcF9hcmVhW2pdLCBkZXN0X3BpdGNoLCB2c2NhbGUsIHNvdXJjZV9iYW5kX2hlaWdodCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAmZGVzdFtqXSwgZGVzdF9waXRjaCwgdnJhdGlvLCBkZXN0X2JhbmRfaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvcHkgdGVtcF9hcmVhIHJvdyAwIG92ZXIgZnJvbSBsYXN0IHJvdyBpbiB0aGUgcGFzdCAqLwotICAgICAgICBkdWNrX21lbWNweSh0ZW1wX2FyZWEsIHRlbXBfYXJlYSArIHNvdXJjZV9iYW5kX2hlaWdodCAqIGRlc3RfcGl0Y2gsIGRlc3RfcGl0Y2gpOwotCi0gICAgICAgIC8qIG1vdmUgdG8gdGhlIG5leHQgYmFuZCAqLwotICAgICAgICBzb3VyY2UgKz0gc291cmNlX2JhbmRfaGVpZ2h0ICogc291cmNlX3BpdGNoOwotICAgICAgICBkZXN0ICAgKz0gZGVzdF9iYW5kX2hlaWdodCAqIGRlc3RfcGl0Y2g7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDoKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjICAgICAgIDogUG9pbnRlciB0byBmcmFtZSB0byBiZSBzY2FsZWQuCi0gKiAgICAgICAgICAgICAgICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0ICAgICAgIDogUG9pbnRlciB0byBidWZmZXIgdG8gaG9sZCBzY2FsZWQgZnJhbWUuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRlbXBfYXJlYSAgICAgIDogUG9pbnRlciB0byB0ZW1wIHdvcmsgYXJlYS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wX2FyZWFfaGVpZ2h0IDogSGVpZ2h0IG9mIHRlbXAgd29yayBhcmVhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaHNjYWxlICAgICAgICAgIDogSG9yaXpvbnRhbCBzY2FsZSBmYWN0b3IgbnVtZXJhdG9yLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaHJhdGlvICAgICAgICAgIDogSG9yaXpvbnRhbCBzY2FsZSBmYWN0b3IgZGVub21pbmF0b3IuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2c2NhbGUgICAgICAgICAgOiBWZXJ0aWNhbCBzY2FsZSBmYWN0b3IgbnVtZXJhdG9yLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdnJhdGlvICAgICAgICAgIDogVmVydGljYWwgc2NhbGUgZmFjdG9yIGRlbm9taW5hdG9yLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW50ZXJsYWNlZCAgICAgIDogSW50ZXJsYWNlIGZsYWcuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogUGVyZm9ybXMgMi10YXAgbGluZWFyIGludGVycG9sYXRpb24gaW4gdHdvIGRpbWVuc2lvbnMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBFeHBhbnNpb24gaXMgcGVyZm9ybWVkIG9uZSBiYW5kIGF0IGEgdGltZSB0byBoZWxwIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgY2FjaGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdnA4X3NjYWxlX2ZyYW1lCi0oCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpzcmMsCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3QsCi0gICAgdW5zaWduZWQgY2hhciAqdGVtcF9hcmVhLAotICAgIHVuc2lnbmVkIGNoYXIgdGVtcF9oZWlnaHQsCi0gICAgdW5zaWduZWQgaW50IGhzY2FsZSwKLSAgICB1bnNpZ25lZCBpbnQgaHJhdGlvLAotICAgIHVuc2lnbmVkIGludCB2c2NhbGUsCi0gICAgdW5zaWduZWQgaW50IHZyYXRpbywKLSAgICB1bnNpZ25lZCBpbnQgaW50ZXJsYWNlZAotKQotewotICAgIGludCBpOwotICAgIGludCBkdyA9IChoc2NhbGUgLSAxICsgc3JjLT55X3dpZHRoICogaHJhdGlvKSAvIGhzY2FsZTsKLSAgICBpbnQgZGggPSAodnNjYWxlIC0gMSArIHNyYy0+eV9oZWlnaHQgKiB2cmF0aW8pIC8gdnNjYWxlOwotCi0gICAgLyogY2FsbCBvdXIgaW50ZXJuYWwgc2NhbGluZyByb3V0aW5lcyEhICovCi0gICAgU2NhbGUyRCgodW5zaWduZWQgY2hhciAqKSBzcmMtPnlfYnVmZmVyLCBzcmMtPnlfc3RyaWRlLCBzcmMtPnlfd2lkdGgsIHNyYy0+eV9oZWlnaHQsCi0gICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSBkc3QtPnlfYnVmZmVyLCBkc3QtPnlfc3RyaWRlLCBkdywgZGgsCi0gICAgICAgICAgICB0ZW1wX2FyZWEsIHRlbXBfaGVpZ2h0LCBoc2NhbGUsIGhyYXRpbywgdnNjYWxlLCB2cmF0aW8sIGludGVybGFjZWQpOwotCi0gICAgaWYgKGR3IDwgKGludClkc3QtPnlfd2lkdGgpCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaDsgaSsrKQotICAgICAgICAgICAgZHVja19tZW1zZXQoZHN0LT55X2J1ZmZlciArIGkgKiBkc3QtPnlfc3RyaWRlICsgZHcgLSAxLCBkc3QtPnlfYnVmZmVyW2kqZHN0LT55X3N0cmlkZStkdy0yXSwgZHN0LT55X3dpZHRoIC0gZHcgKyAxKTsKLQotICAgIGlmIChkaCA8IChpbnQpZHN0LT55X2hlaWdodCkKLSAgICAgICAgZm9yIChpID0gZGggLSAxOyBpIDwgKGludClkc3QtPnlfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICBkdWNrX21lbWNweShkc3QtPnlfYnVmZmVyICsgaSAqIGRzdC0+eV9zdHJpZGUsIGRzdC0+eV9idWZmZXIgKyAoZGggLSAyKSAqIGRzdC0+eV9zdHJpZGUsIGRzdC0+eV93aWR0aCArIDEpOwotCi0gICAgU2NhbGUyRCgodW5zaWduZWQgY2hhciAqKSBzcmMtPnVfYnVmZmVyLCBzcmMtPnV2X3N0cmlkZSwgc3JjLT51dl93aWR0aCwgc3JjLT51dl9oZWlnaHQsCi0gICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSBkc3QtPnVfYnVmZmVyLCBkc3QtPnV2X3N0cmlkZSwgZHcgLyAyLCBkaCAvIDIsCi0gICAgICAgICAgICB0ZW1wX2FyZWEsIHRlbXBfaGVpZ2h0LCBoc2NhbGUsIGhyYXRpbywgdnNjYWxlLCB2cmF0aW8sIGludGVybGFjZWQpOwotCi0gICAgaWYgKGR3IC8gMiA8IChpbnQpZHN0LT51dl93aWR0aCkKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdC0+dXZfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICBkdWNrX21lbXNldChkc3QtPnVfYnVmZmVyICsgaSAqIGRzdC0+dXZfc3RyaWRlICsgZHcgLyAyIC0gMSwgZHN0LT51X2J1ZmZlcltpKmRzdC0+dXZfc3RyaWRlK2R3LzItMl0sIGRzdC0+dXZfd2lkdGggLSBkdyAvIDIgKyAxKTsKLQotICAgIGlmIChkaCAvIDIgPCAoaW50KWRzdC0+dXZfaGVpZ2h0KQotICAgICAgICBmb3IgKGkgPSBkaCAvIDIgLSAxOyBpIDwgKGludClkc3QtPnlfaGVpZ2h0IC8gMjsgaSsrKQotICAgICAgICAgICAgZHVja19tZW1jcHkoZHN0LT51X2J1ZmZlciArIGkgKiBkc3QtPnV2X3N0cmlkZSwgZHN0LT51X2J1ZmZlciArIChkaCAvIDIgLSAyKSpkc3QtPnV2X3N0cmlkZSwgZHN0LT51dl93aWR0aCk7Ci0KLSAgICBTY2FsZTJEKCh1bnNpZ25lZCBjaGFyICopIHNyYy0+dl9idWZmZXIsIHNyYy0+dXZfc3RyaWRlLCBzcmMtPnV2X3dpZHRoLCBzcmMtPnV2X2hlaWdodCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopIGRzdC0+dl9idWZmZXIsIGRzdC0+dXZfc3RyaWRlLCBkdyAvIDIsIGRoIC8gMiwKLSAgICAgICAgICAgIHRlbXBfYXJlYSwgdGVtcF9oZWlnaHQsIGhzY2FsZSwgaHJhdGlvLCB2c2NhbGUsIHZyYXRpbywgaW50ZXJsYWNlZCk7Ci0KLSAgICBpZiAoZHcgLyAyIDwgKGludClkc3QtPnV2X3dpZHRoKQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0LT51dl9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIGR1Y2tfbWVtc2V0KGRzdC0+dl9idWZmZXIgKyBpICogZHN0LT51dl9zdHJpZGUgKyBkdyAvIDIgLSAxLCBkc3QtPnZfYnVmZmVyW2kqZHN0LT51dl9zdHJpZGUrZHcvMi0yXSwgZHN0LT51dl93aWR0aCAtIGR3IC8gMiArIDEpOwotCi0gICAgaWYgKGRoIC8gMiA8IChpbnQpIGRzdC0+dXZfaGVpZ2h0KQotICAgICAgICBmb3IgKGkgPSBkaCAvIDIgLSAxOyBpIDwgKGludClkc3QtPnlfaGVpZ2h0IC8gMjsgaSsrKQotICAgICAgICAgICAgZHVja19tZW1jcHkoZHN0LT52X2J1ZmZlciArIGkgKiBkc3QtPnV2X3N0cmlkZSwgZHN0LT52X2J1ZmZlciArIChkaCAvIDIgLSAyKSpkc3QtPnV2X3N0cmlkZSwgZHN0LT51dl93aWR0aCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogYW55X3JhdGlvXzJkX3NjYWxlCi0gKgotICogIElOUFVUUyAgICAgICAgOiBTQ0FMRV9JTlNUQU5DRSAqc2kgICAgICA6IFBvaW50ZXIgdG8gcG9zdC1wcm9jZXNzb3IgaW5zdGFuY2UgKE5PVCBVU0VEKS4KLSAqICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDogUG9pbnRlciB0byBzb3VyY2UgaW1hZ2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2VfcGl0Y2ggICAgOiBTdHJpZGUgb2Ygc291cmNlIGltYWdlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDogV2lkdGggb2Ygc291cmNlIGltYWdlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX2hlaWdodCAgIDogSGVpZ2h0IG9mIHNvdXJjZSBpbWFnZSAoTk9UIFVTRUQpLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGltYWdlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIGltYWdlLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogV2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2hlaWdodCAgICAgOiBIZWlnaHQgb2YgZGVzdGluYXRpb24gaW1hZ2UuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogaW50OiAxIGlmIGltYWdlIHNjYWxlZCwgMCBpZiBpbWFnZSBjb3VsZCBub3QgYmUgc2NhbGVkLgotICoKLSAqICBGVU5DVElPTiAgICAgIDogU2NhbGUgdGhlIGltYWdlIHdpdGggY2hhbmdpbmcgYXBlY3QgcmF0aW8uCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGlzIHNjYWxpbmcgaXMgYSBiaS1saW5lYXIgc2NhbGluZy4gTmVlZCB0byByZS13b3JrIHRoZQotICogICAgICAgICAgICAgICAgICB3aG9sZSBmdW5jdGlvbiBmb3IgbmV3IHNjYWxpbmcgYWxnb3JpdGhtLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi1pbnQgYW55X3JhdGlvXzJkX3NjYWxlCi0oCi0gICAgU0NBTEVfVkFSUyAqc2ksCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIGludCBzb3VyY2VfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKLSAgICB1bnNpZ25lZCBpbnQgc291cmNlX2hlaWdodCwKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLAotICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoLAotICAgIHVuc2lnbmVkIGludCBkZXN0X2hlaWdodAotKQotewotICAgIHVuc2lnbmVkIGludCBpLCBrOwotICAgIHVuc2lnbmVkIGludCBzcmNfYmFuZF9oZWlnaHQgID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9iYW5kX2hlaWdodCA9IDA7Ci0KLSAgICAvKiBzdWdnZXN0ZWQgc2NhbGUgZmFjdG9ycyAqLwotICAgIGludCBocyA9IHNpLT5IU2NhbGU7Ci0gICAgaW50IGhyID0gc2ktPkhSYXRpbzsKLSAgICBpbnQgdnMgPSBzaS0+VlNjYWxlOwotICAgIGludCB2ciA9IHNpLT5WUmF0aW87Ci0KLSAgICAvKiBhc3N1bWUgdGhlIHJhdGlvcyBhcmUgc2NhbGFibGUgaW5zdGVhZCBvZiBzaG91bGQgYmUgY2VudGVyZWQgKi8KLSAgICBpbnQgcmF0aW9fc2NhbGFibGUgPSAxOwotCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlX2Jhc2UgPSAoKHNvdXJjZV9waXRjaCA+PSAwKSA/IHNvdXJjZSA6IChzb3VyY2UgKyAoKHNvdXJjZV9oZWlnaHQgLSAxKSAqIHNvdXJjZV9waXRjaCkpKTsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW5lX3NyYzsKLQotICAgIHZvaWQgKCpob3Jpel9saW5lX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpID0gTlVMTDsKLSAgICB2b2lkICgqdmVydF9iYW5kX3NjYWxlKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSA9IE5VTEw7Ci0gICAgdm9pZCAoKmxhc3RfdmVydF9iYW5kX3NjYWxlKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSA9IE5VTEw7Ci0KLSAgICAodm9pZCkgc2k7Ci0KLSAgICAvKiBmaW5kIG91dCB0aGUgcmF0aW8gZm9yIGVhY2ggZGlyZWN0aW9uICovCi0gICAgc3dpdGNoIChociAqIDMwIC8gaHMpCi0gICAgewotICAgIGNhc2UgMjQ6Ci0gICAgICAgIC8qIDQtNSBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KLSAgICAgICAgaG9yaXpfbGluZV9zY2FsZSA9IHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDIyOgotICAgICAgICAvKiAzLTQgU2NhbGUgaW4gV2lkdGggZGlyZWN0aW9uICovCi0gICAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDIwOgotICAgICAgICAvKiA0LTUgU2NhbGUgaW4gV2lkdGggZGlyZWN0aW9uICovCi0gICAgICAgIGhvcml6X2xpbmVfc2NhbGUgPSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgICAgLyogMy01IFNjYWxlIGluIFdpZHRoIGRpcmVjdGlvbiAqLwotICAgICAgICBob3Jpel9saW5lX3NjYWxlID0gdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgICAgIC8qIDEtMiBTY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KLSAgICAgICAgaG9yaXpfbGluZV9zY2FsZSA9IHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDMwOgotICAgICAgICAvKiBubyBzY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KLSAgICAgICAgaG9yaXpfbGluZV9zY2FsZSA9IGhvcml6b250YWxfbGluZV9jb3B5OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvKiBUaGUgcmF0aW8gaXMgbm90IGFjY2VwdGFibGUgbm93ICovCi0gICAgICAgIC8qIHRocm93KCJUaGUgcmF0aW8gaXMgbm90IGFjY2VwdGFibGUgZm9yIG5vdyEiKTsgKi8KLSAgICAgICAgcmF0aW9fc2NhbGFibGUgPSAwOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHZyICogMzAgLyB2cykKLSAgICB7Ci0gICAgY2FzZSAyNDoKLSAgICAgICAgLyogNC01IFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLwotICAgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlOwotICAgICAgICBsYXN0X3ZlcnRfYmFuZF9zY2FsZSA9IHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlOwotICAgICAgICBzcmNfYmFuZF9oZWlnaHQgICAgID0gNDsKLSAgICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjI6Ci0gICAgICAgIC8qIDMtNCBTY2FsZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gKi8KLSAgICAgICAgdmVydF9iYW5kX3NjYWxlICAgICA9IHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZTsKLSAgICAgICAgbGFzdF92ZXJ0X2JhbmRfc2NhbGUgPSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZTsKLSAgICAgICAgc3JjX2JhbmRfaGVpZ2h0ICAgICA9IDM7Ci0gICAgICAgIGRlc3RfYmFuZF9oZWlnaHQgICAgPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDIwOgotICAgICAgICAvKiAyLTMgU2NhbGUgaW4gdmVydGljYWwgZGlyZWN0aW9uICovCi0gICAgICAgIHZlcnRfYmFuZF9zY2FsZSAgICAgPSB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGU7Ci0gICAgICAgIGxhc3RfdmVydF9iYW5kX3NjYWxlID0gdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGU7Ci0gICAgICAgIHNyY19iYW5kX2hlaWdodCAgICAgPSAyOwotICAgICAgICBkZXN0X2JhbmRfaGVpZ2h0ICAgID0gMzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgICAgLyogMy01IFNjYWxlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiAqLwotICAgICAgICB2ZXJ0X2JhbmRfc2NhbGUgICAgID0gdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlOwotICAgICAgICBsYXN0X3ZlcnRfYmFuZF9zY2FsZSA9IHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlOwotICAgICAgICBzcmNfYmFuZF9oZWlnaHQgICAgID0gMzsKLSAgICAgICAgZGVzdF9iYW5kX2hlaWdodCAgICA9IDU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgICAgIC8qIDEtMiBTY2FsZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gKi8KLSAgICAgICAgdmVydF9iYW5kX3NjYWxlICAgICA9IHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZTsKLSAgICAgICAgbGFzdF92ZXJ0X2JhbmRfc2NhbGUgPSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZTsKLSAgICAgICAgc3JjX2JhbmRfaGVpZ2h0ICAgICA9IDE7Ci0gICAgICAgIGRlc3RfYmFuZF9oZWlnaHQgICAgPSAyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDMwOgotICAgICAgICAvKiBubyBzY2FsZSBpbiBXaWR0aCBkaXJlY3Rpb24gKi8KLSAgICAgICAgdmVydF9iYW5kX3NjYWxlICAgICA9IG51bGxfc2NhbGU7Ci0gICAgICAgIGxhc3RfdmVydF9iYW5kX3NjYWxlID0gbnVsbF9zY2FsZTsKLSAgICAgICAgc3JjX2JhbmRfaGVpZ2h0ICAgICA9IDQ7Ci0gICAgICAgIGRlc3RfYmFuZF9oZWlnaHQgICAgPSA0OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvKiBUaGUgcmF0aW8gaXMgbm90IGFjY2VwdGFibGUgbm93ICovCi0gICAgICAgIC8qIHRocm93KCJUaGUgcmF0aW8gaXMgbm90IGFjY2VwdGFibGUgZm9yIG5vdyEiKTsgKi8KLSAgICAgICAgcmF0aW9fc2NhbGFibGUgPSAwOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAocmF0aW9fc2NhbGFibGUgPT0gMCkKLSAgICAgICAgcmV0dXJuIHJhdGlvX3NjYWxhYmxlOwotCi0gICAgaG9yaXpfbGluZV9zY2FsZShzb3VyY2UsIHNvdXJjZV93aWR0aCwgZGVzdCwgZGVzdF93aWR0aCk7Ci0KLSAgICAvKiBleGNlcHQgbGFzdCBiYW5kICovCi0gICAgZm9yIChrID0gMDsgayA8IChkZXN0X2hlaWdodCArIGRlc3RfYmFuZF9oZWlnaHQgLSAxKSAvIGRlc3RfYmFuZF9oZWlnaHQgLSAxOyBrKyspCi0gICAgewotICAgICAgICAvKiBzY2FsZSBvbmUgYmFuZCBob3Jpem9udGFsbHkgKi8KLSAgICAgICAgZm9yIChpID0gMTsgaSA8IHNyY19iYW5kX2hlaWdodDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUcmFwIGNhc2Ugd2hlcmUgd2UgY291bGQgcmVhZCBvZmYgdGhlIGJhc2Ugb2YgdGhlIHNvdXJjZSBidWZmZXIgKi8KLSAgICAgICAgICAgIGxpbmVfc3JjID0gc291cmNlICsgaSAqIHNvdXJjZV9waXRjaDsKLQotICAgICAgICAgICAgaWYgKGxpbmVfc3JjIDwgc291cmNlX2Jhc2UpCi0gICAgICAgICAgICAgICAgbGluZV9zcmMgPSBzb3VyY2VfYmFzZTsKLQotICAgICAgICAgICAgaG9yaXpfbGluZV9zY2FsZShsaW5lX3NyYywgc291cmNlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICsgaSAqIGRlc3RfcGl0Y2gsIGRlc3Rfd2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZmlyc3QgbGluZSBvZiBuZXh0IGJhbmQgKi8KLSAgICAgICAgLyogVHJhcCBjYXNlIHdoZXJlIHdlIGNvdWxkIHJlYWQgb2ZmIHRoZSBiYXNlIG9mIHRoZSBzb3VyY2UgYnVmZmVyICovCi0gICAgICAgIGxpbmVfc3JjID0gc291cmNlICsgc3JjX2JhbmRfaGVpZ2h0ICogc291cmNlX3BpdGNoOwotCi0gICAgICAgIGlmIChsaW5lX3NyYyA8IHNvdXJjZV9iYXNlKQotICAgICAgICAgICAgbGluZV9zcmMgPSBzb3VyY2VfYmFzZTsKLQotICAgICAgICBob3Jpel9saW5lX3NjYWxlKGxpbmVfc3JjLCBzb3VyY2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCArIGRlc3RfYmFuZF9oZWlnaHQgKiBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgpOwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHNjYWxpbmcgaXMgaW4gcGxhY2UgKi8KLSAgICAgICAgdmVydF9iYW5kX3NjYWxlKGRlc3QsIGRlc3RfcGl0Y2gsIGRlc3Rfd2lkdGgpOwotCi0gICAgICAgIC8qIE5leHQgYmFuZC4uLiAqLwotICAgICAgICBzb3VyY2UgKz0gc3JjX2JhbmRfaGVpZ2h0ICAqIHNvdXJjZV9waXRjaDsKLSAgICAgICAgZGVzdCAgICs9IGRlc3RfYmFuZF9oZWlnaHQgKiBkZXN0X3BpdGNoOwotICAgIH0KLQotICAgIC8qIHNjYWxlIG9uZSBiYW5kIGhvcml6b250YWxseSAqLwotICAgIGZvciAoaSA9IDE7IGkgPCBzcmNfYmFuZF9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIFRyYXAgY2FzZSB3aGVyZSB3ZSBjb3VsZCByZWFkIG9mZiB0aGUgYmFzZSBvZiB0aGUgc291cmNlIGJ1ZmZlciAqLwotICAgICAgICBsaW5lX3NyYyA9IHNvdXJjZSArIGkgKiBzb3VyY2VfcGl0Y2g7Ci0KLSAgICAgICAgaWYgKGxpbmVfc3JjIDwgc291cmNlX2Jhc2UpCi0gICAgICAgICAgICBsaW5lX3NyYyA9IHNvdXJjZV9iYXNlOwotCi0gICAgICAgIGhvcml6X2xpbmVfc2NhbGUobGluZV9zcmMsIHNvdXJjZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICsgaSAqIGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCk7Ci0gICAgfQotCi0gICAgLyogVmVydGljYWwgc2NhbGluZyBpcyBpbiBwbGFjZSAqLwotICAgIGxhc3RfdmVydF9iYW5kX3NjYWxlKGRlc3QsIGRlc3RfcGl0Y2gsIGRlc3Rfd2lkdGgpOwotCi0gICAgcmV0dXJuIHJhdGlvX3NjYWxhYmxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogYW55X3JhdGlvX2ZyYW1lX3NjYWxlCi0gKgotICogIElOUFVUUyAgICAgICAgOiBTQ0FMRV9JTlNUQU5DRSAqc2kgICAgICAgOiBQb2ludGVyIHRvIHBvc3QtcHJvY2Vzc29yIGluc3RhbmNlIChOT1QgVVNFRCkuCi0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmZyYW1lX2J1ZmZlciAgICAgICAgICAgOiBQb2ludGVyIHRvIHNvdXJjZSBpbWFnZS4KLSAqICAgICAgICAgICAgICAgICAgaW50IFlPZmZzZXQgICAgICAgICAgICAgICAgOiBPZmZzZXQgZnJvbSBzdGFydCBvZiBidWZmZXIgdG8gWSBzYW1wbGVzLgotICogICAgICAgICAgICAgICAgICBpbnQgVVZPZmZzZXQgICAgICAgICAgICAgICA6IE9mZnNldCBmcm9tIHN0YXJ0IG9mIGJ1ZmZlciB0byBVViBzYW1wbGVzLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IGludDogMSBpZiBpbWFnZSBzY2FsZWQsIDAgaWYgaW1hZ2UgY291bGQgbm90IGJlIHNjYWxlZC4KLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IFNjYWxlIHRoZSBpbWFnZSB3aXRoIGNoYW5naW5nIGFwZWN0IHJhdGlvLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotaW50IGFueV9yYXRpb19mcmFtZV9zY2FsZShTQ0FMRV9WQVJTICpzY2FsZV92YXJzLCBpbnQgWU9mZnNldCwgaW50IFVWT2Zmc2V0KQotewotICAgIGludCBpOwotICAgIGludCBldzsKLSAgICBpbnQgZWg7Ci0KLSAgICAvKiBzdWdnZXN0ZWQgc2NhbGUgZmFjdG9ycyAqLwotICAgIGludCBocyA9IHNjYWxlX3ZhcnMtPkhTY2FsZTsKLSAgICBpbnQgaHIgPSBzY2FsZV92YXJzLT5IUmF0aW87Ci0gICAgaW50IHZzID0gc2NhbGVfdmFycy0+VlNjYWxlOwotICAgIGludCB2ciA9IHNjYWxlX3ZhcnMtPlZSYXRpbzsKLQotICAgIGludCByYXRpb19zY2FsYWJsZSA9IDE7Ci0KLSAgICBpbnQgc3cgPSAoc2NhbGVfdmFycy0+ZXhwYW5kZWRfZnJhbWVfd2lkdGggKiBociArIGhzIC0gMSkgLyBoczsKLSAgICBpbnQgc2ggPSAoc2NhbGVfdmFycy0+ZXhwYW5kZWRfZnJhbWVfaGVpZ2h0ICogdnIgKyB2cyAtIDEpIC8gdnM7Ci0gICAgaW50IGR3ID0gc2NhbGVfdmFycy0+ZXhwYW5kZWRfZnJhbWVfd2lkdGg7Ci0gICAgaW50IGRoID0gc2NhbGVfdmFycy0+ZXhwYW5kZWRfZnJhbWVfaGVpZ2h0OwotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3l1dl9jb25maWcgPSBzY2FsZV92YXJzLT5zcmNfeXV2X2NvbmZpZzsKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95dXZfY29uZmlnID0gc2NhbGVfdmFycy0+ZHN0X3l1dl9jb25maWc7Ci0KLSAgICBpZiAoaHIgPT0gMykKLSAgICAgICAgZXcgPSAoc3cgKyAyKSAvIDMgKiAzICogaHMgLyBocjsKLSAgICBlbHNlCi0gICAgICAgIGV3ID0gKHN3ICsgNykgLyA4ICogOCAqIGhzIC8gaHI7Ci0KLSAgICBpZiAodnIgPT0gMykKLSAgICAgICAgZWggPSAoc2ggKyAyKSAvIDMgKiAzICogdnMgLyB2cjsKLSAgICBlbHNlCi0gICAgICAgIGVoID0gKHNoICsgNykgLyA4ICogOCAqIHZzIC8gdnI7Ci0KLSAgICByYXRpb19zY2FsYWJsZSA9IGFueV9yYXRpb18yZF9zY2FsZShzY2FsZV92YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjX3l1dl9jb25maWctPnlfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY195dXZfY29uZmlnLT55X3N0cmlkZSwgc3csIHNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopIGRzdF95dXZfY29uZmlnLT55X2J1ZmZlciArIFlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3l1dl9jb25maWctPnlfc3RyaWRlLCBkdywgZGgpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGVoOyBpKyspCi0gICAgICAgIGR1Y2tfbWVtc2V0KGRzdF95dXZfY29uZmlnLT55X2J1ZmZlciArIFlPZmZzZXQgKyBpICogZHN0X3l1dl9jb25maWctPnlfc3RyaWRlICsgZHcsIDAsIGV3IC0gZHcpOwotCi0gICAgZm9yIChpID0gZGg7IGkgPCBlaDsgaSsrKQotICAgICAgICBkdWNrX21lbXNldChkc3RfeXV2X2NvbmZpZy0+eV9idWZmZXIgKyBZT2Zmc2V0ICsgaSAqIGRzdF95dXZfY29uZmlnLT55X3N0cmlkZSwgMCwgZXcpOwotCi0gICAgaWYgKHJhdGlvX3NjYWxhYmxlID09IDApCi0gICAgICAgIHJldHVybiByYXRpb19zY2FsYWJsZTsKLQotICAgIHN3ID0gKHN3ICsgMSkgPj4gMTsKLSAgICBzaCA9IChzaCArIDEpID4+IDE7Ci0gICAgZHcgPSAoZHcgKyAxKSA+PiAxOwotICAgIGRoID0gKGRoICsgMSkgPj4gMTsKLQotICAgIGFueV9yYXRpb18yZF9zY2FsZShzY2FsZV92YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyY195dXZfY29uZmlnLT51X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjX3l1dl9jb25maWctPnlfc3RyaWRlIC8gMiwgc3csIHNoLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWRzdF95dXZfY29uZmlnLT51X2J1ZmZlciArIFVWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBkc3RfeXV2X2NvbmZpZy0+dXZfc3RyaWRlLCBkdywgZGgpOwotCi0gICAgYW55X3JhdGlvXzJkX3NjYWxlKHNjYWxlX3ZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjX3l1dl9jb25maWctPnZfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBzcmNfeXV2X2NvbmZpZy0+eV9zdHJpZGUgLyAyLCBzdywgc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopZHN0X3l1dl9jb25maWctPnZfYnVmZmVyICsgVVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdF95dXZfY29uZmlnLT51dl9zdHJpZGUsIGR3LCBkaCk7Ci0KLSAgICByZXR1cm4gcmF0aW9fc2NhbGFibGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBjZW50ZXJfaW1hZ2UKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IFNDQUxFX0lOU1RBTkNFICpzaSAgICAgICA6IFBvaW50ZXIgdG8gcG9zdC1wcm9jZXNzb3IgaW5zdGFuY2UuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogQ2VudGVycyB0aGUgaW1hZ2Ugd2l0aG91dCBzY2FsaW5nIGluIHRoZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jZW50ZXJfaW1hZ2UoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeXV2X2NvbmZpZywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeXV2X2NvbmZpZykKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgcm93X29mZnNldCwgY29sX29mZnNldDsKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNfZGF0YV9wb2ludGVyOwotICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9kYXRhX3BvaW50ZXI7Ci0KLSAgICAvKiBjZW50ZXIgdmFsdWVzICovCi0gICAgcm93X29mZnNldCA9IChkc3RfeXV2X2NvbmZpZy0+eV9oZWlnaHQgLSBzcmNfeXV2X2NvbmZpZy0+eV9oZWlnaHQpIC8gMjsKLSAgICBjb2xfb2Zmc2V0ID0gKGRzdF95dXZfY29uZmlnLT55X3dpZHRoIC0gc3JjX3l1dl9jb25maWctPnlfd2lkdGgpIC8gMjsKLQotICAgIC8qIFkncyAqLwotICAgIHNyY19kYXRhX3BvaW50ZXIgPSBzcmNfeXV2X2NvbmZpZy0+eV9idWZmZXI7Ci0gICAgZHN0X2RhdGFfcG9pbnRlciA9ICh1bnNpZ25lZCBjaGFyICopZHN0X3l1dl9jb25maWctPnlfYnVmZmVyICsgKHJvd19vZmZzZXQgKiBkc3RfeXV2X2NvbmZpZy0+eV9zdHJpZGUpICsgY29sX29mZnNldDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfeXV2X2NvbmZpZy0+eV9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGR1Y2tfbWVtY3B5KGRzdF9kYXRhX3BvaW50ZXIsIHNyY19kYXRhX3BvaW50ZXIsIHNyY195dXZfY29uZmlnLT55X3dpZHRoKTsKLSAgICAgICAgZHN0X2RhdGFfcG9pbnRlciArPSBkc3RfeXV2X2NvbmZpZy0+eV9zdHJpZGU7Ci0gICAgICAgIHNyY19kYXRhX3BvaW50ZXIgKz0gc3JjX3l1dl9jb25maWctPnlfc3RyaWRlOwotICAgIH0KLQotICAgIHJvd19vZmZzZXQgLz0gMjsKLSAgICBjb2xfb2Zmc2V0IC89IDI7Ci0KLSAgICAvKiBVJ3MgKi8KLSAgICBzcmNfZGF0YV9wb2ludGVyID0gc3JjX3l1dl9jb25maWctPnVfYnVmZmVyOwotICAgIGRzdF9kYXRhX3BvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKWRzdF95dXZfY29uZmlnLT51X2J1ZmZlciArIChyb3dfb2Zmc2V0ICogZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZSkgKyBjb2xfb2Zmc2V0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNyY195dXZfY29uZmlnLT51dl9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGR1Y2tfbWVtY3B5KGRzdF9kYXRhX3BvaW50ZXIsIHNyY19kYXRhX3BvaW50ZXIsIHNyY195dXZfY29uZmlnLT51dl93aWR0aCk7Ci0gICAgICAgIGRzdF9kYXRhX3BvaW50ZXIgKz0gZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZTsKLSAgICAgICAgc3JjX2RhdGFfcG9pbnRlciArPSBzcmNfeXV2X2NvbmZpZy0+dXZfc3RyaWRlOwotICAgIH0KLQotICAgIC8qIFYncyAqLwotICAgIHNyY19kYXRhX3BvaW50ZXIgPSBzcmNfeXV2X2NvbmZpZy0+dl9idWZmZXI7Ci0gICAgZHN0X2RhdGFfcG9pbnRlciA9ICh1bnNpZ25lZCBjaGFyICopZHN0X3l1dl9jb25maWctPnZfYnVmZmVyICsgKHJvd19vZmZzZXQgKiBkc3RfeXV2X2NvbmZpZy0+dXZfc3RyaWRlKSArIGNvbF9vZmZzZXQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX3l1dl9jb25maWctPnV2X2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgZHVja19tZW1jcHkoZHN0X2RhdGFfcG9pbnRlciwgc3JjX2RhdGFfcG9pbnRlciwgc3JjX3l1dl9jb25maWctPnV2X3dpZHRoKTsKLSAgICAgICAgZHN0X2RhdGFfcG9pbnRlciArPSBkc3RfeXV2X2NvbmZpZy0+dXZfc3RyaWRlOwotICAgICAgICBzcmNfZGF0YV9wb2ludGVyICs9IHNyY195dXZfY29uZmlnLT51dl9zdHJpZGU7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogc2NhbGVfb3JfY2VudGVyCi0gKgotICogIElOUFVUUyAgICAgICAgOiBTQ0FMRV9JTlNUQU5DRSAqc2kgICAgICAgOiBQb2ludGVyIHRvIHBvc3QtcHJvY2Vzc29yIGluc3RhbmNlLgotICoKLSAqCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogRGVjaWRlcyB0byBzY2FsZSBvciBjZW50ZXIgaW1hZ2UgaW4gc2NhbGUgYnVmZmVyIGZvciBibGl0Ci0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotdnA4X3l2MTJfc2NhbGVfb3JfY2VudGVyCi0oCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeXV2X2NvbmZpZywKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95dXZfY29uZmlnLAotICAgIGludCBleHBhbmRlZF9mcmFtZV93aWR0aCwKLSAgICBpbnQgZXhwYW5kZWRfZnJhbWVfaGVpZ2h0LAotICAgIGludCBzY2FsaW5nX21vZGUsCi0gICAgaW50IEhTY2FsZSwKLSAgICBpbnQgSFJhdGlvLAotICAgIGludCBWU2NhbGUsCi0gICAgaW50IFZSYXRpbwotKQotewotICAgIC8qaWYgKCBwcGktPnBvc3RfcHJvY2Vzc2luZ19sZXZlbCApCi0gICAgICAgICAgdXBkYXRlX3VtdmJvcmRlciAoIHBwaSwgZnJhbWVfYnVmZmVyICk7Ki8KLQotCi0gICAgc3dpdGNoIChzY2FsaW5nX21vZGUpCi0gICAgewotICAgIGNhc2UgU0NBTEVfVE9fRklUOgotICAgIGNhc2UgTUFJTlRBSU5fQVNQRUNUX1JBVElPOgotICAgIHsKLSAgICAgICAgU0NBTEVfVkFSUyBzY2FsZV92YXJzOwotICAgICAgICAvKiBjZW50ZXIgdmFsdWVzICovCi0jaWYgMQotICAgICAgICBpbnQgcm93ID0gKGRzdF95dXZfY29uZmlnLT55X2hlaWdodCAtIGV4cGFuZGVkX2ZyYW1lX2hlaWdodCkgLyAyOwotICAgICAgICBpbnQgY29sID0gKGRzdF95dXZfY29uZmlnLT55X3dpZHRoICAtIGV4cGFuZGVkX2ZyYW1lX3dpZHRoKSAvIDI7Ci0gICAgICAgIC8qaW50IFlPZmZzZXQgID0gcm93ICogZHN0X3l1dl9jb25maWctPnlfd2lkdGggKyBjb2w7Ci0gICAgICAgIGludCBVVk9mZnNldCA9IChyb3c+PjEpICogZHN0X3l1dl9jb25maWctPnV2X3dpZHRoICsgKGNvbD4+MSk7Ki8KLSAgICAgICAgaW50IFlPZmZzZXQgID0gcm93ICogZHN0X3l1dl9jb25maWctPnlfc3RyaWRlICsgY29sOwotICAgICAgICBpbnQgVVZPZmZzZXQgPSAocm93ID4+IDEpICogZHN0X3l1dl9jb25maWctPnV2X3N0cmlkZSArIChjb2wgPj4gMSk7Ci0jZWxzZQotICAgICAgICBpbnQgcm93ID0gKHNyY195dXZfY29uZmlnLT55X2hlaWdodCAtIGV4cGFuZGVkX2ZyYW1lX2hlaWdodCkgLyAyOwotICAgICAgICBpbnQgY29sID0gKHNyY195dXZfY29uZmlnLT55X3dpZHRoICAtIGV4cGFuZGVkX2ZyYW1lX3dpZHRoKSAvIDI7Ci0gICAgICAgIGludCBZT2Zmc2V0ICA9IHJvdyAqIHNyY195dXZfY29uZmlnLT55X3dpZHRoICsgY29sOwotICAgICAgICBpbnQgVVZPZmZzZXQgPSAocm93ID4+IDEpICogc3JjX3l1dl9jb25maWctPnV2X3dpZHRoICsgKGNvbCA+PiAxKTsKLSNlbmRpZgotCi0gICAgICAgIHNjYWxlX3ZhcnMuZHN0X3l1dl9jb25maWcgPSBkc3RfeXV2X2NvbmZpZzsKLSAgICAgICAgc2NhbGVfdmFycy5zcmNfeXV2X2NvbmZpZyA9IHNyY195dXZfY29uZmlnOwotICAgICAgICBzY2FsZV92YXJzLkhTY2FsZSA9IEhTY2FsZTsKLSAgICAgICAgc2NhbGVfdmFycy5IUmF0aW8gPSBIUmF0aW87Ci0gICAgICAgIHNjYWxlX3ZhcnMuVlNjYWxlID0gVlNjYWxlOwotICAgICAgICBzY2FsZV92YXJzLlZSYXRpbyA9IFZSYXRpbzsKLSAgICAgICAgc2NhbGVfdmFycy5leHBhbmRlZF9mcmFtZV93aWR0aCA9IGV4cGFuZGVkX2ZyYW1lX3dpZHRoOwotICAgICAgICBzY2FsZV92YXJzLmV4cGFuZGVkX2ZyYW1lX2hlaWdodCA9IGV4cGFuZGVkX2ZyYW1lX2hlaWdodDsKLQotICAgICAgICAvKiBwZXJmb3JtIGNlbnRlciBhbmQgc2NhbGUgKi8KLSAgICAgICAgYW55X3JhdGlvX2ZyYW1lX3NjYWxlKCZzY2FsZV92YXJzLCBZT2Zmc2V0LCBVVk9mZnNldCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ0VOVEVSOgotICAgICAgICBjZW50ZXJfaW1hZ2Uoc3JjX3l1dl9jb25maWcsIGRzdF95dXZfY29uZmlnKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cHhfc2NhbGUvZ2VuZXJpYy95djEyY29uZmlnLmMgYi92cHhfc2NhbGUvZ2VuZXJpYy95djEyY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGFiOTQuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL2dlbmVyaWMveXYxMmNvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgRXhwb3J0cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKQotewotICAgIGlmICh5YmYpCi0gICAgewotICAgICAgICAgICAgZHVja19mcmVlKHliZi0+YnVmZmVyX2FsbG9jKTsKLQotICAgICAgICB5YmYtPmJ1ZmZlcl9hbGxvYyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotdnA4X3l2MTJfYWxsb2NfZnJhbWVfYnVmZmVyKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBib3JkZXIpCi17Ci0vKk5PVEU6Ki8KLQotICAgIGludCB5cGxhbmVfc2l6ZSA9IChoZWlnaHQgKyAyICogYm9yZGVyKSAqICh3aWR0aCArIDIgKiBib3JkZXIpOwotICAgIGludCB1dnBsYW5lX3NpemUgPSAoKDEgKyBoZWlnaHQpIC8gMiArIGJvcmRlcikgKiAoKDEgKyB3aWR0aCkgLyAyICsgYm9yZGVyKTsKLQotICAgIGlmICh5YmYpCi0gICAgewotICAgICAgICB2cDhfeXYxMl9kZV9hbGxvY19mcmFtZV9idWZmZXIoeWJmKTsKLQotICAgICAgICB5YmYtPnlfd2lkdGggID0gd2lkdGg7Ci0gICAgICAgIHliZi0+eV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHliZi0+eV9zdHJpZGUgPSB3aWR0aCArIDIgKiBib3JkZXI7Ci0KLSAgICAgICAgeWJmLT51dl93aWR0aCA9ICgxICsgd2lkdGgpIC8gMjsKLSAgICAgICAgeWJmLT51dl9oZWlnaHQgPSAoMSArIGhlaWdodCkgLyAyOwotICAgICAgICB5YmYtPnV2X3N0cmlkZSA9IHliZi0+dXZfd2lkdGggKyBib3JkZXI7Ci0KLSAgICAgICAgeWJmLT5ib3JkZXIgPSBib3JkZXI7Ci0gICAgICAgIHliZi0+ZnJhbWVfc2l6ZSA9IHlwbGFuZV9zaXplICsgMiAqIHV2cGxhbmVfc2l6ZTsKLQotICAgICAgICAvKiBBZGRlZCAyIGV4dHJhIGxpbmVzIHRvIGZyYW1lYnVmZmVyIHNvIHRoYXQgY29weTEyeDEyIGRvZXNuJ3QgZmFpbAotICAgICAgICAgKiB3aGVuIHdlIGhhdmUgYSBsYXJnZSBtb3Rpb24gdmVjdG9yIGluIFYgb24gdGhlIGxhc3QgdiBibG9jay4KLSAgICAgICAgICogTm90ZSA6IFdlIG5ldmVyIHVzZSB0aGVzZSBwaXhlbHMgYW55d2F5IHNvIHRoaXMgZG9lc24ndCBodXJ0LgotICAgICAgICAgKi8KLSAgICAgICAgeWJmLT5idWZmZXJfYWxsb2MgPSAodW5zaWduZWQgY2hhciAqKSBkdWNrX21lbWFsaWduKDMyLCAgeWJmLT5mcmFtZV9zaXplICsgKHliZi0+eV9zdHJpZGUgKiAyKSArIDMyLCAwKTsKLQotICAgICAgICBpZiAoeWJmLT5idWZmZXJfYWxsb2MgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICB5YmYtPnlfYnVmZmVyID0geWJmLT5idWZmZXJfYWxsb2MgKyAoYm9yZGVyICogeWJmLT55X3N0cmlkZSkgKyBib3JkZXI7Ci0KLSAgICAgICAgaWYgKHlwbGFuZV9zaXplICYgMHhmKQotICAgICAgICAgICAgeXBsYW5lX3NpemUgKz0gMTYgLSAoeXBsYW5lX3NpemUgJiAweGYpOwotCi0gICAgICAgIHliZi0+dV9idWZmZXIgPSB5YmYtPmJ1ZmZlcl9hbGxvYyArIHlwbGFuZV9zaXplICsgKGJvcmRlciAvIDIgICogeWJmLT51dl9zdHJpZGUpICsgYm9yZGVyIC8gMjsKLSAgICAgICAgeWJmLT52X2J1ZmZlciA9IHliZi0+YnVmZmVyX2FsbG9jICsgeXBsYW5lX3NpemUgKyB1dnBsYW5lX3NpemUgKyAoYm9yZGVyIC8gMiAgKiB5YmYtPnV2X3N0cmlkZSkgKyBib3JkZXIgLyAyOwotCi0gICAgICAgIHliZi0+Y29ycnVwdGVkID0gMDsgLyogYXNzdW1lIG5vdCBjdXJydXB0ZWQgYnkgZXJyb3JzICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmQuYyBiL3ZweF9zY2FsZS9nZW5lcmljL3l2MTJleHRlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4N2JkZC4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvZ2VuZXJpYy95djEyZXh0ZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotI2luY2x1ZGUgInZweF9tZW0vdnB4X21lbS5oIgotI2luY2x1ZGUgInZweF9zY2FsZS92cHhzY2FsZS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgRXhwb3J0cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKQotewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIxLCAqc3JjX3B0cjI7Ci0gICAgdW5zaWduZWQgY2hhciAqZGVzdF9wdHIxLCAqZGVzdF9wdHIyOwotCi0gICAgdW5zaWduZWQgaW50IEJvcmRlcjsKLSAgICBpbnQgcGxhbmVfc3RyaWRlOwotICAgIGludCBwbGFuZV9oZWlnaHQ7Ci0gICAgaW50IHBsYW5lX3dpZHRoOwotCi0gICAgLyoqKioqKioqKioqLwotICAgIC8qIFkgUGxhbmUgKi8KLSAgICAvKioqKioqKioqKiovCi0gICAgQm9yZGVyID0geWJmLT5ib3JkZXI7Ci0gICAgcGxhbmVfc3RyaWRlID0geWJmLT55X3N0cmlkZTsKLSAgICBwbGFuZV9oZWlnaHQgPSB5YmYtPnlfaGVpZ2h0OwotICAgIHBsYW5lX3dpZHRoID0geWJmLT55X3dpZHRoOwotCi0gICAgLyogY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dCAqLwotICAgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOwotICAgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gQm9yZGVyOwotICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgQm9yZGVyKTsKLSAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOwotICAgICAgICBzcmNfcHRyMSAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOwotICAgIH0KLQotICAgIC8qIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycyAqLwotICAgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlciAtIEJvcmRlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKLSAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KUJvcmRlcjsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjEsIHNyY19wdHIxLCBwbGFuZV9zdHJpZGUpOwotICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMiwgc3JjX3B0cjIsIHBsYW5lX3N0cmlkZSk7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7Ci0gICAgfQotCi0KLSAgICAvKioqKioqKioqKiovCi0gICAgLyogVSBQbGFuZSAqLwotICAgIC8qKioqKioqKioqKi8KLSAgICBwbGFuZV9zdHJpZGUgPSB5YmYtPnV2X3N0cmlkZTsKLSAgICBwbGFuZV9oZWlnaHQgPSB5YmYtPnV2X2hlaWdodDsKLSAgICBwbGFuZV93aWR0aCA9IHliZi0+dXZfd2lkdGg7Ci0gICAgQm9yZGVyIC89IDI7Ci0KLSAgICAvKiBjb3B5IHRoZSBsZWZ0IGFuZCByaWdodCBtb3N0IGNvbHVtbnMgb3V0ICovCi0gICAgc3JjX3B0cjEgPSB5YmYtPnVfYnVmZmVyOwotICAgIHNyY19wdHIyID0gc3JjX3B0cjEgKyBwbGFuZV93aWR0aCAtIDE7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSBCb3JkZXI7Ci0gICAgZGVzdF9wdHIyID0gc3JjX3B0cjIgKyAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjEsIHNyY19wdHIxWzBdLCBCb3JkZXIpOwotICAgICAgICB2cHhfbWVtc2V0KGRlc3RfcHRyMiwgc3JjX3B0cjJbMF0sIEJvcmRlcik7Ci0gICAgICAgIHNyY19wdHIxICArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIHNyY19wdHIyICArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7Ci0gICAgfQotCi0gICAgLyogTm93IGNvcHkgdGhlIHRvcCBhbmQgYm90dG9tIHNvdXJjZSBsaW5lcyBpbnRvIGVhY2ggbGluZSBvZiB0aGUgcmVzcGVjdGl2ZSBib3JkZXJzICovCi0gICAgc3JjX3B0cjEgPSB5YmYtPnVfYnVmZmVyIC0gQm9yZGVyOwotICAgIHNyY19wdHIyID0gc3JjX3B0cjEgKyAocGxhbmVfaGVpZ2h0ICogcGxhbmVfc3RyaWRlKSAtIHBsYW5lX3N0cmlkZTsKLSAgICBkZXN0X3B0cjEgPSBzcmNfcHRyMSAtIChCb3JkZXIgKiBwbGFuZV9zdHJpZGUpOwotICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgcGxhbmVfc3RyaWRlOwotCi0gICAgZm9yIChpID0gMDsgaSA8IChpbnQpKEJvcmRlcik7IGkrKykKLSAgICB7Ci0gICAgICAgIHZweF9tZW1jcHkoZGVzdF9wdHIxLCBzcmNfcHRyMSwgcGxhbmVfc3RyaWRlKTsKLSAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjIsIHNyY19wdHIyLCBwbGFuZV9zdHJpZGUpOwotICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKi8KLSAgICAvKiBWIFBsYW5lICovCi0gICAgLyoqKioqKioqKioqLwotCi0gICAgLyogY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dCAqLwotICAgIHNyY19wdHIxID0geWJmLT52X2J1ZmZlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOwotICAgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gQm9yZGVyOwotICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgQm9yZGVyKTsKLSAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOwotICAgICAgICBzcmNfcHRyMSAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOwotICAgIH0KLQotICAgIC8qIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycyAqLwotICAgIHNyY19wdHIxID0geWJmLT52X2J1ZmZlciAtIEJvcmRlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKLSAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShCb3JkZXIpOyBpKyspCi0gICAgewotICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMSwgc3JjX3B0cjEsIHBsYW5lX3N0cmlkZSk7Ci0gICAgICAgIHZweF9tZW1jcHkoZGVzdF9wdHIyLCBzcmNfcHRyMiwgcGxhbmVfc3RyaWRlKTsKLSAgICAgICAgZGVzdF9wdHIxICs9IHBsYW5lX3N0cmlkZTsKLSAgICAgICAgZGVzdF9wdHIyICs9IHBsYW5lX3N0cmlkZTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWV4dGVuZF9mcmFtZV9ib3JkZXJzX3lvbmx5KFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKQotewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnNyY19wdHIxLCAqc3JjX3B0cjI7Ci0gICAgdW5zaWduZWQgY2hhciAqZGVzdF9wdHIxLCAqZGVzdF9wdHIyOwotCi0gICAgdW5zaWduZWQgaW50IEJvcmRlcjsKLSAgICBpbnQgcGxhbmVfc3RyaWRlOwotICAgIGludCBwbGFuZV9oZWlnaHQ7Ci0gICAgaW50IHBsYW5lX3dpZHRoOwotCi0gICAgLyoqKioqKioqKioqLwotICAgIC8qIFkgUGxhbmUgKi8KLSAgICAvKioqKioqKioqKiovCi0gICAgQm9yZGVyID0geWJmLT5ib3JkZXI7Ci0gICAgcGxhbmVfc3RyaWRlID0geWJmLT55X3N0cmlkZTsKLSAgICBwbGFuZV9oZWlnaHQgPSB5YmYtPnlfaGVpZ2h0OwotICAgIHBsYW5lX3dpZHRoID0geWJmLT55X3dpZHRoOwotCi0gICAgLyogY29weSB0aGUgbGVmdCBhbmQgcmlnaHQgbW9zdCBjb2x1bW5zIG91dCAqLwotICAgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgcGxhbmVfd2lkdGggLSAxOwotICAgIGRlc3RfcHRyMSA9IHNyY19wdHIxIC0gQm9yZGVyOwotICAgIGRlc3RfcHRyMiA9IHNyY19wdHIyICsgMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZV9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHZweF9tZW1zZXQoZGVzdF9wdHIxLCBzcmNfcHRyMVswXSwgQm9yZGVyKTsKLSAgICAgICAgdnB4X21lbXNldChkZXN0X3B0cjIsIHNyY19wdHIyWzBdLCBCb3JkZXIpOwotICAgICAgICBzcmNfcHRyMSAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBzcmNfcHRyMiAgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjEgKz0gcGxhbmVfc3RyaWRlOwotICAgICAgICBkZXN0X3B0cjIgKz0gcGxhbmVfc3RyaWRlOwotICAgIH0KLQotICAgIC8qIE5vdyBjb3B5IHRoZSB0b3AgYW5kIGJvdHRvbSBzb3VyY2UgbGluZXMgaW50byBlYWNoIGxpbmUgb2YgdGhlIHJlc3BlY3RpdmUgYm9yZGVycyAqLwotICAgIHNyY19wdHIxID0geWJmLT55X2J1ZmZlciAtIEJvcmRlcjsKLSAgICBzcmNfcHRyMiA9IHNyY19wdHIxICsgKHBsYW5lX2hlaWdodCAqIHBsYW5lX3N0cmlkZSkgLSBwbGFuZV9zdHJpZGU7Ci0gICAgZGVzdF9wdHIxID0gc3JjX3B0cjEgLSAoQm9yZGVyICogcGxhbmVfc3RyaWRlKTsKLSAgICBkZXN0X3B0cjIgPSBzcmNfcHRyMiArIHBsYW5lX3N0cmlkZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KUJvcmRlcjsgaSsrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweShkZXN0X3B0cjEsIHNyY19wdHIxLCBwbGFuZV9zdHJpZGUpOwotICAgICAgICB2cHhfbWVtY3B5KGRlc3RfcHRyMiwgc3JjX3B0cjIsIHBsYW5lX3N0cmlkZSk7Ci0gICAgICAgIGRlc3RfcHRyMSArPSBwbGFuZV9zdHJpZGU7Ci0gICAgICAgIGRlc3RfcHRyMiArPSBwbGFuZV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcGxhbmVfc3RyaWRlIC89IDI7Ci0gICAgcGxhbmVfaGVpZ2h0IC89IDI7Ci0gICAgcGxhbmVfd2lkdGggLz0gMjsKLSAgICBCb3JkZXIgLz0gMjsKLQotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZwOF95djEyX2NvcHlfZnJhbWUKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6Ci0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIHRoZSBzb3VyY2UgaW1hZ2UgaW50byB0aGUgZGVzdGluYXRpb24gaW1hZ2UgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHVwZGF0ZXMgdGhlIGRlc3RpbmF0aW9uJ3MgVU1WIGJvcmRlcnMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgZnJhbWVzIGFyZSBhc3N1bWVkIHRvIGJlIGlkZW50aWNhbCBpbiBzaXplLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotdnA4X3l2MTJfY29weV9mcmFtZShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYykKLXsKLSAgICBpbnQgcm93OwotICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgKmRlc3Q7Ci0KLSAgICBzb3VyY2UgPSBzcmNfeWJjLT55X2J1ZmZlcjsKLSAgICBkZXN0ID0gZHN0X3liYy0+eV9idWZmZXI7Ci0KLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNyY195YmMtPnlfaGVpZ2h0OyByb3crKykKLSAgICB7Ci0gICAgICAgIHZweF9tZW1jcHkoZGVzdCwgc291cmNlLCBzcmNfeWJjLT55X3dpZHRoKTsKLSAgICAgICAgc291cmNlICs9IHNyY195YmMtPnlfc3RyaWRlOwotICAgICAgICBkZXN0ICAgKz0gZHN0X3liYy0+eV9zdHJpZGU7Ci0gICAgfQotCi0gICAgc291cmNlID0gc3JjX3liYy0+dV9idWZmZXI7Ci0gICAgZGVzdCA9IGRzdF95YmMtPnVfYnVmZmVyOwotCi0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBzcmNfeWJjLT51dl9oZWlnaHQ7IHJvdysrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweShkZXN0LCBzb3VyY2UsIHNyY195YmMtPnV2X3dpZHRoKTsKLSAgICAgICAgc291cmNlICs9IHNyY195YmMtPnV2X3N0cmlkZTsKLSAgICAgICAgZGVzdCAgICs9IGRzdF95YmMtPnV2X3N0cmlkZTsKLSAgICB9Ci0KLSAgICBzb3VyY2UgPSBzcmNfeWJjLT52X2J1ZmZlcjsKLSAgICBkZXN0ID0gZHN0X3liYy0+dl9idWZmZXI7Ci0KLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNyY195YmMtPnV2X2hlaWdodDsgcm93KyspCi0gICAgewotICAgICAgICB2cHhfbWVtY3B5KGRlc3QsIHNvdXJjZSwgc3JjX3liYy0+dXZfd2lkdGgpOwotICAgICAgICBzb3VyY2UgKz0gc3JjX3liYy0+dXZfc3RyaWRlOwotICAgICAgICBkZXN0ICAgKz0gZHN0X3liYy0+dXZfc3RyaWRlOwotICAgIH0KLQotICAgIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX3B0cihkc3RfeWJjKTsKLX0KLQotdm9pZAotdnA4X3l2MTJfY29weV9mcmFtZV95b25seShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYykKLXsKLSAgICBpbnQgcm93OwotICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgKmRlc3Q7Ci0KLQotICAgIHNvdXJjZSA9IHNyY195YmMtPnlfYnVmZmVyOwotICAgIGRlc3QgPSBkc3RfeWJjLT55X2J1ZmZlcjsKLQotICAgIGZvciAocm93ID0gMDsgcm93IDwgc3JjX3liYy0+eV9oZWlnaHQ7IHJvdysrKQotICAgIHsKLSAgICAgICAgdnB4X21lbWNweShkZXN0LCBzb3VyY2UsIHNyY195YmMtPnlfd2lkdGgpOwotICAgICAgICBzb3VyY2UgKz0gc3JjX3liYy0+eV9zdHJpZGU7Ci0gICAgICAgIGRlc3QgICArPSBkc3RfeWJjLT55X3N0cmlkZTsKLSAgICB9Ci0KLSAgICBleHRlbmRfZnJhbWVfYm9yZGVyc195b25seShkc3RfeWJjKTsKLX0KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9pbmNsdWRlL2FybS92cHhzY2FsZV9ub2ZwLmggYi92cHhfc2NhbGUvaW5jbHVkZS9hcm0vdnB4c2NhbGVfbm9mcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFhOWZhLi4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9pbmNsdWRlL2FybS92cHhzY2FsZV9ub2ZwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLQotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF81XzRfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLQotdm9pZCBob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2FybXY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCBob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2FybXY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCBob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2FybXY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCBob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2FybXY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCBob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2FybXY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9hcm12NCh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9hcm12NCh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9hcm12NCh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9hcm12NCh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9hcm12NCh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSAgICAgdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSAgICAgdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSAgICAgdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSAgICAgdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jCi0jZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlICAgaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZSAgIGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGUgICBob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2FybXY0Ci0jZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlICAgaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZSAgIGhvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlICAgICB2ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlICAgICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZSAgICAgdnA4Y3hfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYwotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGUgICAgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2kgICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX2MKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9pbmNsdWRlL2dlbmVyaWMvdnB4c2NhbGVfYXJiaXRyYXJ5LmggYi92cHhfc2NhbGUvaW5jbHVkZS9nZW5lcmljL3ZweHNjYWxlX2FyYml0cmFyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRlMTgxLi4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9pbmNsdWRlL2dlbmVyaWMvdnB4c2NhbGVfYXJiaXRyYXJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBfX1ZQWF9TQ0FMRV9BUkJJVFJBUllfSF9fCi0jZGVmaW5lIF9fVlBYX1NDQUxFX0FSQklUUkFSWV9IX18KLQotI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IGluX3dpZHRoOwotICAgIGludCBpbl9oZWlnaHQ7Ci0KLSAgICBpbnQgb3V0X3dpZHRoOwotICAgIGludCBvdXRfaGVpZ2h0OwotICAgIGludCBtYXhfdXNhYmxlX291dF93aWR0aDsKLQotICAgIC8vIG51bWVyYXRvciBmb3IgdGhlIHdpZHRoIGFuZCBoZWlnaHQKLSAgICBpbnQgbnc7Ci0gICAgaW50IG5oOwotICAgIGludCBuaF91djsKLQotICAgIC8vIG91dHB1dCB0byBpbnB1dCBjb3JyZXNwb25kYW5jZSBhcnJheQotICAgIHNob3J0ICpsX3c7Ci0gICAgc2hvcnQgKmxfaDsKLSAgICBzaG9ydCAqbF9oX3V2OwotCi0gICAgLy8gcG9seXBoYXNlIGNvZWZmaWNpZW50cwotICAgIHNob3J0ICpjX3c7Ci0gICAgc2hvcnQgKmNfaDsKLSAgICBzaG9ydCAqY19oX3V2OwotCi0gICAgLy8gYnVmZmVyIGZvciBob3Jpem9udGFsIGZpbHRlcmluZy4KLSAgICB1bnNpZ25lZCBjaGFyICpoYnVmOwotICAgIHVuc2lnbmVkIGNoYXIgKmhidWZfdXY7Ci19IEJJQ1VCSUNfU0NBTEVSX1NUUlVDVDsKLQotaW50IGJpY3ViaWNfY29lZmZpY2llbnRfc2V0dXAoaW50IGluX3dpZHRoLCBpbnQgaW5faGVpZ2h0LCBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCk7Ci1pbnQgYmljdWJpY19zY2FsZShpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsIGludCBpbl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCwgaW50IG91dF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dF9pbWFnZSwgdW5zaWduZWQgY2hhciAqb3V0cHV0X2ltYWdlKTsKLXZvaWQgYmljdWJpY19zY2FsZV9mcmFtZV9yZXNldCgpOwotdm9pZCBiaWN1YmljX3NjYWxlX2ZyYW1lKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X3dpZHRoLCBpbnQgbmV3X2hlaWdodCk7Ci12b2lkIGJpY3ViaWNfY29lZmZpY2llbnRfaW5pdCgpOwotdm9pZCBiaWN1YmljX2NvZWZmaWNpZW50X2Rlc3Ryb3koKTsKLQotI2VuZGlmIC8qIF9fVlBYX1NDQUxFX0FSQklUUkFSWV9IX18gKi8KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9pbmNsdWRlL2dlbmVyaWMvdnB4c2NhbGVfbm9mcC5oIGIvdnB4X3NjYWxlL2luY2x1ZGUvZ2VuZXJpYy92cHhzY2FsZV9ub2ZwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODIwNWEuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL2luY2x1ZGUvZ2VuZXJpYy92cHhzY2FsZV9ub2ZwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci0KLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci0KLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlICAgICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jCi0jZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYwotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgICAgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKLSNkZWZpbmUgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSAgICAgdnA4Y3hfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYwotI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGUgICB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlICAgICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9jCi0jZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYwotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgICAgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlICAgICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZSAgICAgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYwotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSAgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYwotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSAgIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYwotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZSAgIHZwOGN4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYwotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSAgIHZwOGN4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYwpkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL2luY2x1ZGUvc3ltYmlhbi92cHhzY2FsZV9ub2ZwLmggYi92cHhfc2NhbGUvaW5jbHVkZS9zeW1iaWFuL3ZweHNjYWxlX25vZnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxYTlmYS4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvaW5jbHVkZS9zeW1iaWFuL3ZweHNjYWxlX25vZnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotCi12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2ModW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCAgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotCi12b2lkIGhvcml6b250YWxfbGluZV80XzVfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci0KLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlICAgICB2ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlICAgICB2ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICB2ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlICAgICB2ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2MKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGUgICBob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2FybXY0Ci0jZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlICAgaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZSAgIGhvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYXJtdjQKLSNkZWZpbmUgdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUgICBob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2FybXY0Ci0jZGVmaW5lIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlICAgaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZV9hcm12NAotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUgICAgIHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2FybXY0Ci0jZGVmaW5lIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYwotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUgICAgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNV80X3NjYWxlX2MKLSNkZWZpbmUgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlICAgICB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jCi0jZGVmaW5lIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZSAgICAgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfYwotI2RlZmluZSB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSAgIHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2lfYwotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSAgIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzFfc2NhbGVfYwotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZSAgIHZwOGN4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGVfYwotI2RlZmluZSB2cDhfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZSAgIHZwOGN4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGVfYwpkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL2luY2x1ZGUvdnB4c2NhbGVfbm9mcC5oIGIvdnB4X3NjYWxlL2luY2x1ZGUvdnB4c2NhbGVfbm9mcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA0YmQ5Li4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9pbmNsdWRlL3ZweHNjYWxlX25vZnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0jaWYgZGVmaW5lZChfX1M2MF9WMjBfXykgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSAmJiAhZGVmaW5lZChfX1dJTlNfXykKLSNpbmNsdWRlICJzeW1iaWFuXHZweHNjYWxlX25vZnAuaCIKLSNlbHNlCi0jaW5jbHVkZSAiZ2VuZXJpY1x2cHhzY2FsZV9ub2ZwLmgiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS9zY2FsZV9tb2RlLmggYi92cHhfc2NhbGUvc2NhbGVfbW9kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc2ZTY0Li4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS9zY2FsZV9tb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIFNDQUxFX01PREVfSAotI2RlZmluZSBTQ0FMRV9NT0RFX0gKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTUFJTlRBSU5fQVNQRUNUX1JBVElPICAgPSAweDAsCi0gICAgU0NBTEVfVE9fRklUICAgICAgICAgICAgPSAweDEsCi0gICAgQ0VOVEVSICAgICAgICAgICAgICAgICAgPSAweDIsCi0gICAgT1RIRVIgICAgICAgICAgICAgICAgICAgPSAweDMKLX0gU0NBTEVfTU9ERTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS92cHhfc2NhbGUubWsgYi92cHhfc2NhbGUvdnB4X3NjYWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI1NDE5Li4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS92cHhfc2NhbGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1TQ0FMRV9TUkNTLXllcyArPSB2cHhfc2NhbGUubWsKLVNDQUxFX1NSQ1MteWVzICs9IHNjYWxlX21vZGUuaAotU0NBTEVfU1JDUy15ZXMgKz0geXYxMmV4dGVuZC5oCi1TQ0FMRV9TUkNTLXllcyArPSB5djEyY29uZmlnLmgKLVNDQUxFX1NSQ1MteWVzICs9IHZweHNjYWxlLmgKLVNDQUxFX1NSQ1MteWVzICs9IGdlbmVyaWMvdnB4c2NhbGUuYwotU0NBTEVfU1JDUy15ZXMgKz0gZ2VuZXJpYy95djEyY29uZmlnLmMKLVNDQUxFX1NSQ1MteWVzICs9IGdlbmVyaWMveXYxMmV4dGVuZC5jCi1TQ0FMRV9TUkNTLXllcyArPSBnZW5lcmljL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMKLVNDQUxFX1NSQ1MtJChDT05GSUdfU1BBVElBTF9SRVNBTVBMSU5HKSArPSBnZW5lcmljL2dlbl9zY2FsZXJzLmMKLQotI2FybQotU0NBTEVfU1JDUy0kKEhBVkVfQVJNVjcpICAgICAgICAgKz0gYXJtL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMKLVNDQUxFX1NSQ1MtJChIQVZFX0FSTVY3KSAgICAgICAgICs9IGFybS95djEyZXh0ZW5kX2FybS5jCi1TQ0FMRV9TUkNTX1JFTU9WRS0kKEhBVkVfQVJNVjcpICArPSBnZW5lcmljL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMKLQotI25lb24KLVNDQUxFX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gYXJtL25lb24vdnA4X3ZweHl2MTJfY29weWZyYW1lX2Z1bmNfbmVvbiQoQVNNKQotU0NBTEVfU1JDUy0kKEhBVkVfQVJNVjcpICArPSBhcm0vbmVvbi92cDhfdnB4eXYxMl9jb3B5ZnJhbWV5b25seV9uZW9uJChBU00pCi1TQ0FMRV9TUkNTLSQoSEFWRV9BUk1WNykgICs9IGFybS9uZW9uL3ZwOF92cHh5djEyX2NvcHlzcmNmcmFtZV9mdW5jX25lb24kKEFTTSkKLVNDQUxFX1NSQ1MtJChIQVZFX0FSTVY3KSAgKz0gYXJtL25lb24vdnA4X3ZweHl2MTJfZXh0ZW5kZnJhbWVib3JkZXJzX25lb24kKEFTTSkKLQotU0NBTEVfU1JDUy1ubyArPSAkKFNDQUxFX1NSQ1NfUkVNT1ZFLXllcykKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS92cHhzY2FsZS5oIGIvdnB4X3NjYWxlL3ZweHNjYWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmMxMjguLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL3ZweHNjYWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgVlBYU0NBTEVfSAotI2RlZmluZSBWUFhTQ0FMRV9ICi0KLSNpbmNsdWRlICJ2cHhfc2NhbGUveXYxMmNvbmZpZy5oIgotdm9pZCB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZwOGN4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF9ob3Jpem9udGFsX2xpbmVfM180X3NjYWxlX2MoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZwOGN4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZwOGN4X2hvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfYyh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2ModW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzVfNF9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzVfM19zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfM19zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotdm9pZCB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLXZvaWQgdnA4Y3hfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaV9jKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLQotCi1leHRlcm4gdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF8yXzNfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSkodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotZXh0ZXJuIHZvaWQgKCp2cDhfaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZSkoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotZXh0ZXJuIHZvaWQgKCp2cDhfdmVydGljYWxfYmFuZF8xXzJfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlKSh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotZXh0ZXJuIHZvaWQgKCp2cDhfdmVydGljYWxfYmFuZF81XzRfc2NhbGUpKHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlKSh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZSkodW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotZXh0ZXJuIHZvaWQgKCp2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfaSkodW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotZXh0ZXJuIHZvaWQgKCp2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSkoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci1leHRlcm4gdm9pZCAoKnZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlKShjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKTsKLWV4dGVybiB2b2lkICgqdnA4X2hvcml6b250YWxfbGluZV81XzRfc2NhbGUpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpOwotCi12b2lkIGhvcml6b250YWxfbGluZV80XzVfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8yXzNfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8zXzRfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIGhvcml6b250YWxfbGluZV8xXzJfc2NhbGVfYXJtdjQoY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfM181X3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci12b2lkIHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2FybXY0KHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCk7Ci0KLQotZXh0ZXJuIHZvaWQgIGRtYWNoaW5lX3NwZWNpZmljX2NvbmZpZyhpbnQgbW14X2VuYWJsZWQsIGludCB4bW1fZW5hYmxlZCwgaW50IHdtdF9lbmFibGVkKTsKLWV4dGVybiB2b2lkIHZwOF95djEyX3NjYWxlX29yX2NlbnRlcgotKAotICAgIFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3l1dl9jb25maWcsCi0gICAgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeXV2X2NvbmZpZywKLSAgICBpbnQgZXhwYW5kZWRfZnJhbWVfd2lkdGgsCi0gICAgaW50IGV4cGFuZGVkX2ZyYW1lX2hlaWdodCwKLSAgICBpbnQgc2NhbGluZ19tb2RlLAotICAgIGludCBIU2NhbGUsCi0gICAgaW50IEhSYXRpbywKLSAgICBpbnQgVlNjYWxlLAotICAgIGludCBWUmF0aW8KLSk7Ci1leHRlcm4gdm9pZCB2cDhfc2NhbGVfZnJhbWUKLSgKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKnNyYywKLSAgICBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdCwKLSAgICB1bnNpZ25lZCBjaGFyICp0ZW1wX2FyZWEsCi0gICAgdW5zaWduZWQgY2hhciB0ZW1wX2hlaWdodCwKLSAgICB1bnNpZ25lZCBpbnQgaHNjYWxlLAotICAgIHVuc2lnbmVkIGludCBocmF0aW8sCi0gICAgdW5zaWduZWQgaW50IHZzY2FsZSwKLSAgICB1bnNpZ25lZCBpbnQgdnJhdGlvLAotICAgIHVuc2lnbmVkIGludCBpbnRlcmxhY2VkCi0pOwotZXh0ZXJuIHZvaWQgdnA4X3NjYWxlX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKHZvaWQpOwotCi1leHRlcm4gdm9pZCAoKnZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzX3B0cikoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnMoWVYxMl9CVUZGRVJfQ09ORklHICp5YmYpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfZXh0ZW5kX2ZyYW1lX2JvcmRlcnNfbmVvbihZVjEyX0JVRkZFUl9DT05GSUcgKnliZik7Ci0KLWV4dGVybiB2b2lkICgqdnA4X3l2MTJfY29weV9mcmFtZV95b25seV9wdHIpKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKLWV4dGVybiB2b2lkIHZwOF95djEyX2NvcHlfZnJhbWVfeW9ubHkoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZV95b25seV9uZW9uKFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKLQotZXh0ZXJuIHZvaWQgKCp2cDhfeXYxMl9jb3B5X2ZyYW1lX3B0cikoWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotZXh0ZXJuIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7Ci1leHRlcm4gdm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX25lb24oWVYxMl9CVUZGRVJfQ09ORklHICpzcmNfeWJjLCBZVjEyX0JVRkZFUl9DT05GSUcgKmRzdF95YmMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS93aW4zMi9zY2FsZW9wdC5jIGIvdnB4X3NjYWxlL3dpbjMyL3NjYWxlb3B0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTFmZTUuLjAwMDAwMDAKLS0tIGEvdnB4X3NjYWxlL3dpbjMyL3NjYWxlb3B0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgIE1vZHVsZSBUaXRsZSA6ICAgICBzY2FsZW9wdC5jcHAKLSoKLSogICBEZXNjcmlwdGlvbiAgOiAgICAgT3B0aW1pemVkIHNjYWxpbmcgZnVuY3Rpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgInByYWdtYXMuaCIKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBNb2R1bGUgU3RhdGljcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgb25lX2ZpZnRoW10gID0geyA1MSwgNTEsIDUxLCA1MSB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0d29fZmlmdGhzW10gPSB7IDEwMiwgMTAyLCAxMDIsIDEwMiB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0aHJlZV9maWZ0aHNbXSA9IHsgMTU0LCAxNTQsIDE1NCwgMTU0IH07Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvdXJfZmlmdGhzW10gPSB7IDIwNSwgMjA1LCAyMDUsIDIwNSB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCByb3VuZF92YWx1ZXNbXSA9IHsgMTI4LCAxMjgsIDEyOCwgMTI4IH07Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvdXJfb25lc1tdID0geyAxLCAxLCAxLCAxfTsKLV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3Q0NV8yW10gPSB7MjA1LCAxNTQsIDEwMiwgIDUxIH07Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnN0NDVfMVtdID0geyA1MSwgMTAyLCAxNTQsIDIwNSB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBjaGFyICBtYXNrNDVbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMjU1LCAwfTsKLV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3QzNV8yW10gPSB7IDE1NCwgIDUxLCAyMDUsIDEwMiB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDM1XzFbXSA9IHsgMTAyLCAyMDUsICA1MSwgMTU0IH07Ci0KLQotCi0jaW5jbHVkZSAidnB4X3NjYWxlL3ZweHNjYWxlLmgiCi0jaW5jbHVkZSAidnB4X21lbS92cHhfbWVtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBob3Jpem9udGFsX2xpbmVfM181X3NjYWxlX21teAotICoKLSAqICBJTlBVVFMgICAgICAgIDogY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlIDoKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCAgICA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgICAgICA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoICAgICAgOgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IDMgdG8gNSB1cC1zY2FsaW5nIG9mIGEgaG9yaXpvbnRhbCBsaW5lIG9mIHBpeGVscy4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9tbXgKLSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsCi0gICAgdW5zaWduZWQgaW50IHNvdXJjZV93aWR0aCwKLSAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAotICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoCi0pCi17Ci0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0KLSAgICBfX2FzbQotICAgIHsKLQotICAgICAgICBwdXNoIGVieAotCi0gICAgICAgIG1vdiAgICAgICAgIGVzaSwgICAgc291cmNlCi0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgZGVzdAotCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgc291cmNlX3dpZHRoCi0gICAgICAgIGxlYSAgICAgICAgIGVkeCwgICAgW2VzaStlY3gtM107Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBjb25zdDM1XzEgICAgICAgLy8gbW01ID0gNjYgeHggY2QgeHggMzMgeHggOWEgeHgKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBjb25zdDM1XzIgICAgICAgLy8gbW02ID0gOWEgeHggMzMgeHggY2QgeHggNjYgeHgKLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIHJvdW5kX3ZhbHVlcyAgICAgLy8gbW00ID0gODAgeHggODAgeHggODAgeHggODAgeHgKLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcgICAgICAgICAgICAgLy8gY2xlYXIgbW03Ci0KLSAgICAgICAgaG9yaXpfbGluZV8zXzVfbG9vcDoKLQotICAgICAgICBtb3YgICAgICAgIGVheCwgICAgRFdPUkQgUFRSIFtlc2ldIC8vIGVheCA9IDAwIDAxIDAyIDAzCi0gICAgICAgIG1vdiAgICAgICAgZWJ4LCAgICBlYXgKLQotICAgICAgICBhbmQgICAgICAgICBlYngsICAgIDB4ZmZmZjAwICAgICAgICAvLyBlYnggPSB4eCAwMSAwMiB4eAotICAgICAgICBtb3YgICAgICAgICBlY3gsICAgIGVheCAgICAgICAgICAgICAvLyBlY3ggPSAwMCAwMSAwMiAwMwotCi0gICAgICAgIGFuZCAgICAgICAgIGVheCwgICAgMHhmZmZmMDAwMCAgICAgIC8vIGVheCA9IHh4IHh4IDAyIDAzCi0gICAgICAgIHhvciAgICAgICAgIGVjeCwgICAgZWF4ICAgICAgICAgICAgIC8vIGVjeCA9IDAwIDAxIHh4IHh4Ci0KLSAgICAgICAgc2hyICAgICAgICAgZWJ4LCAgICA4ICAgICAgICAgICAgICAgLy8gZWJ4ID0gMDEgMDIgeHggeHgKLSAgICAgICAgb3IgICAgICAgICAgZWF4LCAgICBlYnggICAgICAgICAgICAgLy8gZWF4ID0gMDEgMDIgMDIgMDMKLQotICAgICAgICBzaGwgICAgICAgICBlYngsICAgIDE2ICAgICAgICAgICAgICAvLyBlYnggPSB4eCB4eCAwMSAwMgotICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgIGVheCAgICAgICAgICAgICAvLyBtbTEgPSAwMSAwMiAwMiAwMyB4eCB4eCB4eCB4eAotCi0gICAgICAgIG9yICAgICAgICAgIGVieCwgICAgZWN4ICAgICAgICAgICAgIC8vIGVieCA9IDAwIDAxIDAxIDAyCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgIC8vIG1tMSA9IDAxIHh4IDAyIHh4IDAyIHh4IDAzIHh4Ci0KLSAgICAgICAgbW92ZCAgICAgICAgbW0wLCAgICBlYnggICAgICAgICAgICAgLy8gbW0wID0gMDAgMDEgMDEgMDIKLSAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTYgICAgICAgICAgICAgLy8KLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTAgPSAwMCB4eCAwMSB4eCAwMSB4eCAwMiB4eAotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAvLwotCi0gICAgICAgIG1vdiAgICAgICAgIFtlZGldLCAgZWJ4ICAgICAgICAgICAgIC8vIHdyaXRlb3V0cHV0IDAwIHh4IHh4IHh4Ci0gICAgICAgIGFkZCAgICAgICAgIGVzaSwgICAgMwotCi0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgNQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAotCi0gICAgICAgIGNtcCAgICAgICAgIGVzaSwgICAgZWR4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUHRyIFtlZGktNF0sIG1tMAotICAgICAgICBqbCAgICAgICAgICBob3Jpel9saW5lXzNfNV9sb29wCi0KLS8vRXhpdDoKLSAgICAgICAgbW92ICAgICAgICAgZWF4LCAgICBEV09SRCBQVFIgW2VzaV0gLy8gZWF4ID0gMDAgMDEgMDIgMDMKLSAgICAgICAgbW92ICAgICAgICAgZWJ4LCAgICBlYXgKLQotICAgICAgICBhbmQgICAgICAgICBlYngsICAgIDB4ZmZmZjAwICAgICAgICAvLyBlYnggPSB4eCAwMSAwMiB4eAotICAgICAgICBtb3YgICAgICAgICBlY3gsICAgIGVheCAgICAgICAgICAgICAvLyBlY3ggPSAwMCAwMSAwMiAwMwotCi0gICAgICAgIGFuZCAgICAgICAgIGVheCwgICAgMHhmZmZmMDAwMCAgICAgIC8vIGVheCA9IHh4IHh4IDAyIDAzCi0gICAgICAgIHhvciAgICAgICAgIGVjeCwgICAgZWF4ICAgICAgICAgICAgIC8vIGVjeCA9IDAwIDAxIHh4IHh4Ci0KLSAgICAgICAgc2hyICAgICAgICAgZWJ4LCAgICA4ICAgICAgICAgICAgICAgLy8gZWJ4ID0gMDEgMDIgeHggeHgKLSAgICAgICAgb3IgICAgICAgICAgZWF4LCAgICBlYnggICAgICAgICAgICAgLy8gZWF4ID0gMDEgMDIgMDIgMDMKLQotICAgICAgICBzaGwgICAgICAgICBlYXgsICAgIDggICAgICAgICAgICAgICAvLyBlYXggPSB4eCAwMSAwMiAwMgotICAgICAgICBhbmQgICAgICAgICBlYXgsICAgIDB4ZmZmZjAwMDAgICAgICAvLyBlYXggPSB4eCB4eCAwMiAwMgotCi0gICAgICAgIG9yICAgICAgICAgIGVheCwgICAgZWJ4ICAgICAgICAgICAgIC8vIGVheCA9IDAxIDAyIDAyIDAyCi0KLSAgICAgICAgc2hsICAgICAgICAgZWJ4LCAgICAxNiAgICAgICAgICAgICAgLy8gZWJ4ID0geHggeHggMDEgMDIKLSAgICAgICAgbW92ZCAgICAgICAgbW0xLCAgICBlYXggICAgICAgICAgICAgLy8gbW0xID0gMDEgMDIgMDIgMDIgeHggeHggeHggeHgKLQotICAgICAgICBvciAgICAgICAgICBlYngsICAgIGVjeCAgICAgICAgICAgICAvLyBlYnggPSAwMCAwMSAwMSAwMgotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTEgPSAwMSB4eCAwMiB4eCAwMiB4eCAwMiB4eAotCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgICAgZWJ4ICAgICAgICAgICAgIC8vIG1tMCA9IDAwIDAxIDAxIDAyCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgbW02ICAgICAgICAgICAgIC8vCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0wID0gMDAgeHggMDEgeHggMDEgeHggMDIgeHgKLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICBtbTUgICAgICAgICAgICAgLy8KLQotICAgICAgICBtb3YgICAgICAgICBbZWRpXSwgIGVieCAgICAgICAgICAgICAvLyB3cml0ZW91dHB1dCAwMCB4eCB4eCB4eAotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03Ci0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFB0ciBbZWRpKzFdLCBtbTAKLQotICAgICAgICBwb3AgZWJ4Ci0KLSAgICB9Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZV9tbXgKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDoKLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiA0IHRvIDUgdXAtc2NhbGluZyBvZiBhIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIGhvcml6b250YWxfbGluZV80XzVfc2NhbGVfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgICh2b2lkKWRlc3Rfd2lkdGg7Ci0KLSAgICBfX2FzbQotICAgIHsKLQotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgIHNvdXJjZQotICAgICAgICBtb3YgICAgICAgICBlZGksICAgIGRlc3QKLQotICAgICAgICBtb3YgICAgICAgICBlY3gsICAgIHNvdXJjZV93aWR0aAotICAgICAgICBsZWEgICAgICAgICBlZHgsICAgIFtlc2krZWN4LThdOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgY29uc3Q0NV8xICAgICAgIC8vIG1tNSA9IDMzIHh4IDY2IHh4IDlhIHh4IGNkIHh4Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgY29uc3Q0NV8yICAgICAgIC8vIG1tNiA9IGNkIHh4IDlhIHh4IDY2IHh4IDMzIHh4Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICByb3VuZF92YWx1ZXMgICAgIC8vIG1tNCA9IDgwIHh4IDgwIHh4IDgwIHh4IDgwIHh4Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03ICAgICAgICAgICAgIC8vIGNsZWFyIG1tNwotCi0gICAgICAgIGhvcml6X2xpbmVfNF81X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBRV09SRCBQVFIgW2VzaV0gICAgICAgICAgIC8vIG1tMCA9IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgUVdPUkQgUFRSIFtlc2krMV07ICAgICAgICAvLyBtbTEgPSAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgIC8vIG1tMiA9IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgIC8vIG1tMyA9IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGldLCAgbW0wICAgICAgICAgICAgIC8vIHdyaXRlIG91dHB1dCAwMCB4eCB4eCB4eAotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTAgPSAwMCB4eCAwMSB4eCAwMiB4eCAwMyB4eAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgIC8vIG1tMSA9IDAxIHh4IDAyIHh4IDAzIHh4IDA0IHh4Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tMCwgICAgbW01ICAgICAgICAgICAgIC8vIDAwKiA1MSAwMSoxMDIgMDIqMTU0IDAzKjIwNQotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgbW02ICAgICAgICAgICAgIC8vIDAxKjIwNSAwMioxNTQgMDMqMTAyIDA0KiA1MQotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTIgPSAwNCB4eCAwNSB4eCAwNiB4eCAwNyB4eAotCi0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpKzVdLCBtbTIgICAgICAgICAgICAvLyB3cml0ZSBvdXB1dCAwNSB4eCB4eCB4eAotICAgICAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNSAgICAgICAgICAgICAvLyAwNCogNTEgMDUqMTAyIDA2KjE1NCAwNyoyMDUKLQotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTMgPSAwNSB4eCAwNiB4eCAwNyB4eCAwOCB4eAotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNiAgICAgICAgICAgICAvLyAwNSoyMDUgMDYqMTU0IDA3KjEwMiAwOCogNTEKLQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAvLyBhZGRlZCByb3VuZCB2YWx1ZXMKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQKLQotICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgIDggICAgICAgICAgICAgICAvLyBvdXRwdXQ6IDAxIHh4IDAyIHh4IDAzIHh4IDA0IHh4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGkrMV0sIG1tMCAgLy8gd3JpdGUgb3V0cHV0IDAxIDAyIDAzIDA0Ci0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgMTAKLQotICAgICAgICBhZGQgICAgICAgICBlc2ksICAgIDgKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMgICAgICAgICAgICAgLy8KLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNCAgICAgICAgICAgICAvLyBhZGRlZCByb3VuZCB2YWx1ZXMKLSAgICAgICAgY21wICAgICAgICAgZXNpLCAgICBlZHgKLQotICAgICAgICBwc3JsdyAgICAgICBtbTIsICAgIDgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0yLCAgICBtbTcKLQotICAgICAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaS00XSwgbW0yIC8vIHdyaXRlb3V0cHV0IDA2IDA3IDA4IDA5Ci0gICAgICAgIGpsICAgICAgICAgaG9yaXpfbGluZV80XzVfbG9vcAotCi0vL0V4aXQ6Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaV0gICAgICAgICAgIC8vIG1tMCA9IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgbW0wICAgICAgICAgICAgIC8vIG1tMSA9IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgLy8gbW0yID0gMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgcHNybHEgICAgICAgbW0xLCAgICA4ICAgICAgICAgICAgICAgLy8gbW0xID0gMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDAKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1hc2s0NSAgICAgICAgICAvLyBtbTMgPSAwMCAwMCAwMCAwMCAwMCAwMCBmZiAwMAotICAgICAgICBwYW5kICAgICAgICBtbTMsICAgIG1tMSAgICAgICAgICAgICAvLyBtbTMgPSAwMCAwMCAwMCAwMCAwMCAwMCAwNyAwMAotCi0gICAgICAgIHBzbGxxICAgICAgIG1tMywgICAgOCAgICAgICAgICAgICAgIC8vIG1tMyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDA3Ci0gICAgICAgIHBvciAgICAgICAgIG1tMSwgICAgbW0zICAgICAgICAgICAgIC8vIG1tMSA9IDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA3Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEKLQotICAgICAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaV0sICBtbTAgICAvLyB3cml0ZSBvdXRwdXQgMDAgeHggeHggeHgKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0wID0gMDAgeHggMDEgeHggMDIgeHggMDMgeHgKLQotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTEgPSAwMSB4eCAwMiB4eCAwMyB4eCAwNCB4eAotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAvLyAwMCogNTEgMDEqMTAyIDAyKjE1NCAwMyoyMDUKLQotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAvLyAwMSoyMDUgMDIqMTU0IDAzKjEwMiAwNCogNTEKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgLy8gbW0yID0gMDQgeHggMDUgeHggMDYgeHggMDcgeHgKLQotICAgICAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaSs1XSwgbW0yICAvLyB3cml0ZSBvdXB1dCAwNSB4eCB4eCB4eAotICAgICAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNSAgICAgICAgICAgICAvLyAwNCogNTEgMDUqMTAyIDA2KjE1NCAwNyoyMDUKLQotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAvLyBtbTMgPSAwNSB4eCAwNiB4eCAwNyB4eCAwOCB4eAotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNiAgICAgICAgICAgICAvLyAwNSoyMDUgMDYqMTU0IDA3KjEwMiAwNyogNTEKLQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAvLyBhZGRlZCByb3VuZCB2YWx1ZXMKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQKLQotICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgIDggICAgICAgICAgICAgICAvLyBvdXRwdXQ6IDAxIHh4IDAyIHh4IDAzIHh4IDA0IHh4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03ICAgICAgICAgICAgIC8vIDAxIDAyIDAzIDA0IHh4IHh4IHh4IHh4Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGkrMV0sIG1tMCAgLy8gd3JpdGUgb3V0cHV0IDAxIDAyIDAzIDA0Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW0zICAgICAgICAgICAgIC8vCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTQgICAgICAgICAgICAgLy8gYWRkZWQgcm91bmQgdmFsdWVzCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMiwgICAgOAotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMiwgICAgbW03Ci0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpKzZdLCBtbTIgIC8vIHdyaXRlb3V0cHV0IDA2IDA3IDA4IDA5Ci0KLQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX21teAotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IDQgdG8gNSB1cC1zY2FsaW5nIG9mIGEgNCBwaXhlbCBoaWdoIGJhbmQgb2YgcGl4ZWxzLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLiBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgYSAiQyIgb25seQotICogICAgICAgICAgICAgICAgICB2ZXJzaW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIHZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICBfX2FzbQotICAgIHsKLQotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgIGRlc3QgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQotCi0gICAgICAgIGxlYSAgICAgICAgIGVkaSwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gdG93IGxpbmVzIGJlbG93Ci0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWUgbGluZXMgYmVsb3cKLQotICAgICAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtbTcKLSAgICAgICAgbW92ICAgICAgICAgZWR4LCAgICBkZXN0X3dpZHRoICAgICAgICAgICAgICAgLy8gTG9vcCBjb3VudGVyCi0KLSAgICAgICAgdnNfNF81X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBRV09SRCBwdHIgW2VzaV0gICAgICAgICAvLyBzcmNbMF07Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgUVdPUkQgcHRyIFtlc2krZWN4XSAgICAgLy8gc3JjWzFdOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG9uZV9maWZ0aAotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKLQotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAxLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdyB0byB3b3JkCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgICAvLyBjb25zdGFuCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIGxvdyBiCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNQotCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2ggdG8gd29yZAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgaGlnaCBiCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW01LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogNC81Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDEvNSArIGIgKiA0LzUKLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAxLzUgKyBiICogNC81Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLSAgICAgICAgcHNybHcgICAgICAgbW0wLCAgICA4Ci0KLSAgICAgICAgcHNybHcgICAgICAgbW0yLCAgICA4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gZGVzIFsxXQotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZXNpK2VjeF0sIG1tMCAgICAgICAgLy8gd3JpdGUgZGVzWzFdCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wID0gc3JjWzJdCi0KLSAgICAgICAgLy8gbW0xLCBtbTMgLS0tIFNyY1sxXQotICAgICAgICAvLyBtbTAgLS0tIFNyY1syXQotICAgICAgICAvLyBtbTcgZm9yIHVucGFja2luZwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgdHdvX2ZpZnRocwotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5Ci0KLSAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBiICogMi81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgdGhyZWVfZmlmdGhzCi0KLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjCi0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2ggdG8gd29yZAotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tMgotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIG1tNCAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUgKyBjICogMy81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBiICogMi81ICsgYyAqIDMvNQotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgOAotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMywgICAgOAotICAgICAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1syXQotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZXNpK2VjeCoyXSwgbW0xICAgICAgLy8gd3JpdGUgZGVzWzJdCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgW2VkaV0gICAgICAgICAgICAgICAgICAgLy8gbW0xPVNyY1szXTsKLQotICAgICAgICAvLyBtbTAsIG1tMiAtLS0gU3JjWzJdCi0gICAgICAgIC8vIG1tMSAtLS0gU3JjWzNdCi0gICAgICAgIC8vIG1tNiAtLS0gMy81Ci0gICAgICAgIC8vIG1tNyBmb3IgdW5wYWNraW5nCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgdHdvX2ZpZnRocyAgICAgICAgICAgICAgIC8vIG1tNSA9IDIvNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLQotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDIvNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBkICogMi81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81ICsgZCAqIDIvNQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUgKyBkICogMi81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLQotICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKLSAgICAgICAgcHNybHcgICAgICAgbW0yLCAgICA4Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbM10KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGldLCBtbTAgICAgICAgICAgICAvLyB3cml0ZSBkZXNbM10KLQotICAgICAgICAvLyAgbW0xLCBtbTMgLS0tIFNyY1szXQotICAgICAgICAvLyAgbW03IC0tIGNsZWFyZWQgZm9yIHVucGFja2luZwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VkaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wLCBTcmNbMF0gb2YgdGhlIG5leHQgZ3JvdXAKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBtbTUgPSA0LzUKLSAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBkICogNC81Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBvbmVfZmlmdGggICAgICAgICAgICAgICAgLy8gbW02ID0gMS81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLQotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGQgKiA0LzUKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93Ci0KLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBhbiAqIDEvNQotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBkICogNC81ICsgYW4gKiAxLzUKLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBhbiAqIDEvNQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDQvNSArIGFuICogMS81Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLSAgICAgICAgcHNybHcgICAgICAgbW0xLCAgICA4Ci0KLSAgICAgICAgcHNybHcgICAgICAgbW0zLCAgICA4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gZGVzWzRdCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGkrZWN4XSwgbW0xICAgICAgICAvLyB3cml0ZSBkZXNbNF0KLQotICAgICAgICBhZGQgICAgICAgICBlZGksICAgIDgKLSAgICAgICAgYWRkICAgICAgICAgZXNpLCAgICA4Ci0KLSAgICAgICAgc3ViICAgICAgICAgZWR4LCAgICA4Ci0gICAgICAgIGpnICAgICAgICAgdnNfNF81X2xvb3AKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBsYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX21teAotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IE5vbmUKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IDQgdG8gNSB1cC1zY2FsaW5nIG9mIHRoZSBsYXN0IDQtcGl4ZWwgaGlnaCBiYW5kIGluIGFuIGltYWdlLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLiBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgYW4gIkMiIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotdm9pZCBsYXN0X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlX21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICBfX2FzbQotICAgIHsKLSAgICAgICAgbW92ICAgICAgICAgZXNpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcgotICAgICAgICBtb3YgICAgICAgICBlY3gsICAgIGRlc3RfcGl0Y2ggICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBpdGNoIHNpemUKLQotICAgICAgICBsZWEgICAgICAgICBlZGksICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vIHRvdyBsaW5lcyBiZWxvdwotICAgICAgICBhZGQgICAgICAgICBlZGksICAgIGVjeCAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVlIGxpbmVzIGJlbG93Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgbW03Ci0gICAgICAgIG1vdiAgICAgICAgIGVkeCwgICAgZGVzdF93aWR0aCAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgotCi0gICAgICAgIGxhc3RfdnNfNF81X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBRV09SRCBwdHIgW2VzaV0gICAgICAgICAvLyBzcmNbMF07Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgUVdPUkQgcHRyIFtlc2krZWN4XSAgICAgLy8gc3JjWzFdOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG9uZV9maWZ0aAotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKLQotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAxLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdyB0byB3b3JkCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMS81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgICAvLyBjb25zdGFuCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIGxvdyBiCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNQotCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2ggdG8gd29yZAotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgaGlnaCBiCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW01LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogNC81Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW00ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDEvNSArIGIgKiA0LzUKLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAxLzUgKyBiICogNC81Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLSAgICAgICAgcHNybHcgICAgICAgbW0wLCAgICA4Ci0KLSAgICAgICAgcHNybHcgICAgICAgbW0yLCAgICA4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gZGVzIFsxXQotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZXNpK2VjeF0sIG1tMCAgICAgICAgLy8gd3JpdGUgZGVzWzFdCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0wID0gc3JjWzJdCi0KLSAgICAgICAgLy8gbW0xLCBtbTMgLS0tIFNyY1sxXQotICAgICAgICAvLyBtbTAgLS0tIFNyY1syXQotICAgICAgICAvLyBtbTcgZm9yIHVucGFja2luZwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgdHdvX2ZpZnRocwotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5Ci0KLSAgICAgICAgcG11bGx3ICAgICAgbW0xLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBiICogMi81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgdGhyZWVfZmlmdGhzCi0KLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjCi0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2ggdG8gd29yZAotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG1tMgotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYyAqIDMvNQotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIG1tNCAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAyLzUgKyBjICogMy81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBiICogMi81ICsgYyAqIDMvNQotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgOAotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMywgICAgOAotICAgICAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1syXQotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZXNpK2VjeCoyXSwgbW0xICAgICAgLy8gd3JpdGUgZGVzWzJdCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgW2VkaV0gICAgICAgICAgICAgICAgICAgLy8gbW0xPVNyY1szXTsKLQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VkaStlY3hdLCBtbTEgICAgICAgIC8vIHdyaXRlIGRlc1s0XTsKLQotICAgICAgICAvLyBtbTAsIG1tMiAtLS0gU3JjWzJdCi0gICAgICAgIC8vIG1tMSAtLS0gU3JjWzNdCi0gICAgICAgIC8vIG1tNiAtLS0gMy81Ci0gICAgICAgIC8vIG1tNyBmb3IgdW5wYWNraW5nCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgdHdvX2ZpZnRocyAgICAgICAgICAgICAgIC8vIG1tNSA9IDIvNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLQotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDIvNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkKLSAgICAgICAgcG11bGx3ICAgICAgbW02LCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBkICogMi81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBjICogMy81ICsgZCAqIDIvNQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGMgKiAzLzUgKyBkICogMi81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLQotICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKLSAgICAgICAgcHNybHcgICAgICAgbW0yLCAgICA4Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbM10KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGldLCBtbTAgICAgICAgICAgICAvLyB3cml0ZSBkZXNbM10KLQotICAgICAgICAvLyAgbW0xLCBtbTMgLS0tIFNyY1szXQotICAgICAgICAvLyAgbW03IC0tIGNsZWFyZWQgZm9yIHVucGFja2luZwotICAgICAgICBhZGQgICAgICAgICBlZGksICAgIDgKLSAgICAgICAgYWRkICAgICAgICAgZXNpLCAgICA4Ci0KLSAgICAgICAgc3ViICAgICAgICAgZWR4LCAgICA4Ci0gICAgICAgIGpnICAgICAgICAgIGxhc3RfdnNfNF81X2xvb3AKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiB2ZXJ0aWNhbF9iYW5kXzNfNV9zY2FsZV9tbXgKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IHVuc2lnbmVkIGNoYXIgKmRlc3QgICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoIDoKLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiAzIHRvIDUgdXAtc2NhbGluZyBvZiBhIDMtcGl4ZWwgaGlnaCBiYW5kIG9mIHBpeGVscy4KLSAqCi0gKiAgU1BFQ0lBTCBOT1RFUyA6IFRoZSByb3V0aW5lIHVzZXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJhbmQgYmVsb3cKLSAqICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmFuZC4gVGhlIGZ1bmN0aW9uIGFsc28gaGFzIGFuICJDIiBvbmx5Ci0gKiAgICAgICAgICAgICAgICAgIHZlcnNpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfbW14Ci0oCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgIF9fYXNtCi0gICAgewotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgIGRlc3QgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQotCi0gICAgICAgIGxlYSAgICAgICAgIGVkaSwgICAgW2VzaStlY3gqMl0gICAgICAgICAgICAgLy8gdG93IGxpbmVzIGJlbG93Ci0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWUgbGluZXMgYmVsb3cKLQotICAgICAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtbTcKLSAgICAgICAgbW92ICAgICAgICAgZWR4LCAgICBkZXN0X3dpZHRoICAgICAgICAgICAgICAgLy8gTG9vcCBjb3VudGVyCi0KLSAgICAgICAgdnNfM181X2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBRV09SRCBwdHIgW2VzaV0gICAgICAgICAvLyBzcmNbMF07Ci0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgUVdPUkQgcHRyIFtlc2krZWN4XSAgICAgLy8gc3JjWzFdOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG93IHRvIHdvcmQKLQotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIHR3b19maWZ0aHMgICAgICAgICAgICAgICAvLyBtbTUgPSAyLzUKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMiwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDIvNQotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIHRocmVlX2ZpZnRocyAgICAgICAgICAgICAvLyBtbTYgPSAzLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgbG93IGIKLSAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogMy81Ci0KLSAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgaGlnaCB0byB3b3JkCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiBoaWdoIGIKLQotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAzLzUKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTQgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81ICsgYiAqIDMvNQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gYSAqIDIvNSArIGIgKiAzLzUKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKLQotICAgICAgICBwc3JsdyAgICAgICBtbTIsICAgIDgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXMgWzFdCi0KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlc2krZWN4XSwgbW0wICAgICAgICAvLyB3cml0ZSBkZXNbMV0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBbZXNpK2VjeCoyXSAgICAgICAgICAgICAvLyBtbTAgPSBzcmNbMl0KLQotICAgICAgICAvLyBtbTEsIG1tMyAtLS0gU3JjWzFdCi0gICAgICAgIC8vIG1tMCAtLS0gU3JjWzJdCi0gICAgICAgIC8vIG1tNyBmb3IgdW5wYWNraW5nCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBiIGxvdwotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBiICogNC81IGxvdwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gYiBoaWdoCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMywgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgIC8vIGIgKiA0LzUgaGlnaAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wICAgICAgICAgICAgICAgICAgICAgLy8gYwotICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBiICogMS81Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjIGxvdwotICAgICAgICBwbXVsbHcgICAgICBtbTUsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBiICogMS81Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGNvcHkgb2YgYyBsb3cKLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjIGhpZ2gKLQotICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBjICogMS81IGxvdwotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgIG1tMiAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGhpZ2gKLQotICAgICAgICBwbXVsbHcgICAgICBtbTcsICAgIG9uZV9maWZ0aCAgICAgICAgICAgICAgICAvLyBjICogMS81IGhpZ2gKLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBiICogNC81ICsgYyAqIDEvNSBsb3cKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiA0LzUgKyBjICogMS81IGhpZ2gKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGNvcHkgb2YgYyBsb3cKLQotICAgICAgICBwbXVsbHcgICAgICBtbTYsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBjICogNC81IGxvdwotICAgICAgICBtb3ZxICAgICAgICBtbTcsICAgIG1tMiAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGhpZ2gKLQotICAgICAgICBwbXVsbHcgICAgICBtbTcsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBjICogNC81IGhpZ2gKLQotICAgICAgICBwYWRkdyAgICAgICBtbTQsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUgKyBjICogNC81IGxvdwotICAgICAgICBwYWRkdyAgICAgICBtbTUsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUgKyBjICogNC81IGhpZ2gKLQotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgOAotICAgICAgICBwc3JsdyAgICAgICBtbTMsICAgIDgKLQotICAgICAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIGRlc1syXQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VzaStlY3gqMl0sIG1tMSAgICAgIC8vIHdyaXRlIGRlc1syXQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0KLSAgICAgICAgcHNybHcgICAgICAgbW00LCAgICA4Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tNSwgICAgOAotCi0gICAgICAgIHBhY2t1c3diICAgIG1tNCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZGVzWzNdCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZWRpXSwgbW00ICAgICAgICAgICAgLy8gd3JpdGUgZGVzWzNdCi0KLSAgICAgICAgLy8gIG1tMCwgbW0yIC0tLSBTcmNbM10KLQotICAgICAgICBweG9yICAgICAgICBtbTcsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG1tNyBmb3IgdW5wYWNraW5nCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgW2VkaStlY3gqMl0gICAgICAgICAgICAgLy8gbW0xID0gU3JjWzBdIG9mIHRoZSBuZXh0IGdyb3VwCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICB0aHJlZV9maWZ0aHMgICAgICAgICAgICAgLy8gbW01ID0gMy81Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tMCwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDMvNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgdHdvX2ZpZnRocyAgICAgICAgICAgICAgICAvLyBtbTYgPSAyLzUKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weQotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMiwgICAgbW01ICAgICAgICAgICAgICAgICAgICAgLy8gZCAqIDMvNQotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cKLQotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGFuICogMi81Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGhpZ2gKLQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIGQgKiAzLzUgKyBhbiAqIDIvNQotICAgICAgICBwbXVsbHcgICAgICBtbTMsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGFuICogMi81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBkICogMy81ICsgYW4gKiAyLzUKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotICAgICAgICBwc3JsdyAgICAgICBtbTAsICAgIDgKLQotICAgICAgICBwc3JsdyAgICAgICBtbTIsICAgIDgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbNF0KLQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VkaStlY3hdLCBtbTAgICAgICAgIC8vIHdyaXRlIGRlc1s0XQotCi0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgOAotICAgICAgICBhZGQgICAgICAgICBlc2ksICAgIDgKLQotICAgICAgICBzdWIgICAgICAgICBlZHgsICAgIDgKLSAgICAgICAgamcgICAgICAgICAgdnNfM181X2xvb3AKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJPVVRJTkUgICAgICAgOiBsYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX21teAotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IDMgdG8gNSB1cC1zY2FsaW5nIG9mIGEgMy1waXhlbCBoaWdoIGJhbmQgb2YgcGl4ZWxzLgotICoKLSAqICBTUEVDSUFMIE5PVEVTIDogVGhlIHJvdXRpbmUgdXNlcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmFuZCBiZWxvdwotICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBiYW5kLiBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgYW4gIkMiIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotdm9pZCBsYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICBfX2FzbQotICAgIHsKLSAgICAgICAgbW92ICAgICAgICAgZXNpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcgotICAgICAgICBtb3YgICAgICAgICBlY3gsICAgIGRlc3RfcGl0Y2ggICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBpdGNoIHNpemUKLQotICAgICAgICBsZWEgICAgICAgICBlZGksICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vIHRvdyBsaW5lcyBiZWxvdwotICAgICAgICBhZGQgICAgICAgICBlZGksICAgIGVjeCAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVlIGxpbmVzIGJlbG93Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgbW03Ci0gICAgICAgIG1vdiAgICAgICAgIGVkeCwgICAgZGVzdF93aWR0aCAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgotCi0KLSAgICAgICAgbGFzdF92c18zXzVfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFFXT1JEIHB0ciBbZXNpXSAgICAgICAgIC8vIHNyY1swXTsKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICBRV09SRCBwdHIgW2VzaStlY3hdICAgICAvLyBzcmNbMV07Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb3cgdG8gd29yZAotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgdHdvX2ZpZnRocyAgICAgICAgICAgICAgIC8vIG1tNSA9IDIvNQotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKLQotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgIG1tNSAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAyLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvdyB0byB3b3JkCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgdGhyZWVfZmlmdGhzICAgICAgICAgICAgIC8vIG1tNiA9IDMvNQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgbW0xICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiBsb3cgYgotICAgICAgICBwbXVsbHcgICAgICBtbTQsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiAzLzUKLQotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBoaWdoIHRvIHdvcmQKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIGhpZ2ggYgotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDMvNQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tNCAgICAgICAgICAgICAgICAgICAgIC8vIGEgKiAyLzUgKyBiICogMy81Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBhICogMi81ICsgYiAqIDMvNQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgICAgICAvLyArIDEyOAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgOAotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMiwgICAgOAotICAgICAgICBwYWNrdXN3YiAgICBtbTAsICAgIG1tMiAgICAgICAgICAgICAgICAgICAgIC8vIGRlcyBbMV0KLQotICAgICAgICBtb3ZxICAgICAgICBRV09SRCBwdHIgW2VzaStlY3hdLCBtbTAgICAgICAgIC8vIHdyaXRlIGRlc1sxXQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vIG1tMCA9IHNyY1syXQotCi0KLQotICAgICAgICAvLyBtbTEsIG1tMyAtLS0gU3JjWzFdCi0gICAgICAgIC8vIG1tMCAtLS0gU3JjWzJdCi0gICAgICAgIC8vIG1tNyBmb3IgdW5wYWNraW5nCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTEgICAgICAgICAgICAgICAgICAgICAvLyBiIGxvdwotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgIGZvdXJfZmlmdGhzICAgICAgICAgICAgICAvLyBiICogNC81IGxvdwotCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZWRpK2VjeF0sIG1tMCAgICAgICAgLy8gd3JpdGUgZGVzWzRdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICBtbTMgICAgICAgICAgICAgICAgICAgICAvLyBiIGhpZ2gKLSAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICBmb3VyX2ZpZnRocyAgICAgICAgICAgICAgLy8gYiAqIDQvNSBoaWdoCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBjCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgb25lX2ZpZnRoICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUKLQotICAgICAgICBwdW5wY2tsYncgICBtbTAsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGMgbG93Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNSwgICAgb25lX2ZpZnRoICAgICAgICAgICAgICAgIC8vIGIgKiAxLzUKLQotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGxvdwotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNyAgICAgICAgICAgICAgICAgICAgIC8vIGMgaGlnaAotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgICAgb25lX2ZpZnRoICAgICAgICAgICAgICAgIC8vIGMgKiAxLzUgbG93Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMgaGlnaAotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNywgICAgb25lX2ZpZnRoICAgICAgICAgICAgICAgIC8vIGMgKiAxLzUgaGlnaAotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGIgKiA0LzUgKyBjICogMS81IGxvdwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDQvNSArIGMgKiAxLzUgaGlnaAotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIG1tMCAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBvZiBjIGxvdwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgIC8vIGMgKiA0LzUgbG93Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNywgICAgbW0yICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5IG9mIGMgaGlnaAotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNywgICAgZm91cl9maWZ0aHMgICAgICAgICAgICAgIC8vIGMgKiA0LzUgaGlnaAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNCwgICAgbW02ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDEvNSArIGMgKiA0LzUgbG93Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gYiAqIDEvNSArIGMgKiA0LzUgaGlnaAotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMywgICAgcm91bmRfdmFsdWVzICAgICAgICAgICAgIC8vICsgMTI4Ci0KLSAgICAgICAgcHNybHcgICAgICAgbW0xLCAgICA4Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMywgICAgOAotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMSwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gZGVzWzJdCi0gICAgICAgIG1vdnEgICAgICAgIFFXT1JEIHB0ciBbZXNpK2VjeCoyXSwgbW0xICAgICAgLy8gd3JpdGUgZGVzWzJdCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW00LCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLSAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICByb3VuZF92YWx1ZXMgICAgICAgICAgICAgLy8gKyAxMjgKLQotICAgICAgICBwc3JsdyAgICAgICBtbTQsICAgIDgKLSAgICAgICAgcHNybHcgICAgICAgbW01LCAgICA4Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgbW00LCAgICBtbTUgICAgICAgICAgICAgICAgICAgICAvLyBkZXNbM10KLSAgICAgICAgbW92cSAgICAgICAgUVdPUkQgcHRyIFtlZGldLCBtbTQgICAgICAgICAgICAvLyB3cml0ZSBkZXNbM10KLQotICAgICAgICAvLyAgbW0wLCBtbTIgLS0tIFNyY1szXQotCi0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgOAotICAgICAgICBhZGQgICAgICAgICBlc2ksICAgIDgKLQotICAgICAgICBzdWIgICAgICAgICBlZHgsICAgIDgKLSAgICAgICAgamcgICAgICAgICAgbGFzdF92c18zXzVfbG9vcAotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teAotICoKLSAqICBJTlBVVFMgICAgICAgIDogdW5zaWduZWQgY2hhciAqZGVzdCAgICA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoIDoKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGggOgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IDEgdG8gMiB1cC1zY2FsaW5nIG9mIGEgYmFuZCBvZiBwaXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuIFRoZSBmdW5jdGlvbiBhbHNvIGhhcyBhbiAiQyIgb25seQotICogICAgICAgICAgICAgICAgICB2ZXJzaW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teAotKAotICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCi0gICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgKLSkKLXsKLSAgICBfX2FzbQotICAgIHsKLQotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgIGRlc3QgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IG1tNwotICAgICAgICBtb3YgICAgICAgICBlZHgsICAgIGRlc3Rfd2lkdGggICAgICAgICAgICAgICAvLyBMb29wIGNvdW50ZXIKLQotICAgICAgICB2c18xXzJfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2ldICAgICAgICAgICAgICAgICAgIC8vIGdldCBTcmNbMF0KLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICBbZXNpICsgZWN4ICogMl0gICAgICAgICAvLyBnZXQgU3JjWzFdCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGNvcHkgYmVmb3JlIHVucGFjawotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weSBiZWZvcmUgdW5wYWNrCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBsb3cgU3JjWzBdCi0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgZm91cl9vbmVzICAgICAgICAgICAgICAgIC8vIG1tNj0gMSwgMSwgMSwgMQotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gbG93IFNyY1sxXQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMSAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyAoYSArIGIpCi0KLSAgICAgICAgcHVucGNraGJ3ICAgbW0yLCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIFNyY1swXQotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tNiAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyAoYSArIGIgKyAxKQotCi0gICAgICAgIHB1bnBja2hidyAgIG1tMywgICAgbW03Ci0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gaGlnaCAoYSArIGIgKQotCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMCwgICAgMSAgICAgICAgICAgICAgICAgICAgICAgLy8gbG93IChhICsgYiArMSApLzIKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTYgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIChhICsgYiArIDEpCi0KLSAgICAgICAgcHNyYXcgICAgICAgbW0yLCAgICAxICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIChhICsgYiArIDEpLzIKLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIgICAgICAgICAgICAgICAgICAgICAvLyBwYWNrIHJlc3VsdHMKLQotICAgICAgICBtb3ZxICAgICAgICBbZXNpK2VjeF0sIG1tMCAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG91dCBlaWdodCBieXRlcwotICAgICAgICBhZGQgICAgICAgICBlc2ksICAgIDgKLQotICAgICAgICBzdWIgICAgICAgICBlZHgsICAgIDgKLSAgICAgICAgamcgICAgICAgICAgdnNfMV8yX2xvb3AKLSAgICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IGxhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfbW14Ci0gKgotICogIElOUFVUUyAgICAgICAgOiB1bnNpZ25lZCBjaGFyICpkZXN0ICAgIDoKLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2ggOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCA6Ci0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogMSB0byAyIHVwLXNjYWxpbmcgb2YgYmFuZCBvZiBwaXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBUaGUgcm91dGluZSB1c2VzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBiYW5kIGJlbG93Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJhbmQuIFRoZSBmdW5jdGlvbiBhbHNvIGhhcyBhbiAiQyIgb25seQotICogICAgICAgICAgICAgICAgICB2ZXJzaW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIGxhc3RfdmVydGljYWxfYmFuZF8xXzJfc2NhbGVfbW14Ci0oCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgIF9fYXNtCi0gICAgewotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgIGRlc3QgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQotCi0gICAgICAgIG1vdiAgICAgICAgIGVkeCwgICAgZGVzdF93aWR0aCAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgotCi0gICAgICAgIGxhc3RfdnNfMV8yX2xvb3A6Ci0KLSAgICAgICAgbW92cSAgICAgICAgbW0wLCAgICBbZXNpXSAgICAgICAgICAgICAgICAgICAvLyBnZXQgU3JjWzBdCi0gICAgICAgIG1vdnEgICAgICAgIFtlc2krZWN4XSwgbW0wICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgb3V0IGVpZ2h0IGJ5dGVzCi0KLSAgICAgICAgYWRkICAgICAgICAgZXNpLCAgICA4Ci0gICAgICAgIHN1YiAgICAgICAgIGVkeCwgICAgOAotCi0gICAgICAgIGpnICAgICAgICAgbGFzdF92c18xXzJfbG9vcAotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV8xXzJfc2NhbGUKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDoKLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiAxIHRvIDIgdXAtc2NhbGluZyBvZiBhIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIGhvcml6b250YWxfbGluZV8xXzJfc2NhbGVfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgX19hc20KLSAgICB7Ci0gICAgICAgIG1vdiAgICAgICAgIGVzaSwgICAgc291cmNlCi0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgZGVzdAotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgZm91cl9vbmVzCi0KLSAgICAgICAgbW92ICAgICAgICAgZWN4LCAgICBzb3VyY2Vfd2lkdGgKLQotICAgICAgICBoc18xXzJfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2ldCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgW2VzaSsxXQotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW0wCi0gICAgICAgIG1vdnEgICAgICAgIG1tMywgICAgbW0xCi0KLSAgICAgICAgbW92cSAgICAgICAgbW00LCAgICBtbTAKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICBtbTcKLQotICAgICAgICBwdW5wY2tsYncgICBtbTEsICAgIG1tNwotICAgICAgICBwYWRkdyAgICAgICBtbTAsICAgIG1tMQotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgbW02Ci0gICAgICAgIHB1bnBja2hidyAgIG1tMiwgICAgbW03Ci0KLSAgICAgICAgcHVucGNraGJ3ICAgbW0zLCAgICBtbTcKLSAgICAgICAgcGFkZHcgICAgICAgbW0yLCAgICBtbTMKLQotICAgICAgICBwYWRkdyAgICAgICBtbTIsICAgIG1tNgotICAgICAgICBwc3JhdyAgICAgICBtbTAsICAgIDEKLQotICAgICAgICBwc3JhdyAgICAgICBtbTIsICAgIDEKLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICBtbTIKLQotICAgICAgICBtb3ZxICAgICAgICBtbTIsICAgIG1tNAotICAgICAgICBwdW5wY2tsYncgICBtbTIsICAgIG1tMAotCi0gICAgICAgIG1vdnEgICAgICAgIFtlZGldLCAgbW0yCi0gICAgICAgIHB1bnBja2hidyAgIG1tNCwgICAgbW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgW2VkaSs4XSwgbW00Ci0gICAgICAgIGFkZCAgICAgICAgIGVzaSwgICAgOAotCi0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgMTYKLSAgICAgICAgc3ViICAgICAgICAgZWN4LCAgICA4Ci0KLSAgICAgICAgY21wICAgICAgICAgZWN4LCAgICA4Ci0gICAgICAgIGpnICAgICAgICAgIGhzXzFfMl9sb29wCi0KLS8vIGxhc3QgZWlnaHQgcGl4ZWwKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgIFtlc2ldCi0gICAgICAgIG1vdnEgICAgICAgIG1tMSwgICAgbW0wCi0KLSAgICAgICAgbW92cSAgICAgICAgbW0yLCAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgbW0zLCAgICBtbTEKLQotICAgICAgICBwc3JscSAgICAgICBtbTEsICAgIDgKLSAgICAgICAgcHNybHEgICAgICAgbW0zLCAgICA1NgotCi0gICAgICAgIHBzbGxxICAgICAgIG1tMywgICAgNTYKLSAgICAgICAgcG9yICAgICAgICAgbW0xLCAgICBtbTMKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMQotICAgICAgICBtb3ZxICAgICAgICBtbTQsICAgIG1tMAotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgbW03Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgbW03Ci0KLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTEKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICBtbTYKLQotICAgICAgICBwdW5wY2toYncgICBtbTIsICAgIG1tNwotICAgICAgICBwdW5wY2toYncgICBtbTMsICAgIG1tNwotCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW0zCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMiwgICAgbW02Ci0KLSAgICAgICAgcHNyYXcgICAgICAgbW0wLCAgICAxCi0gICAgICAgIHBzcmF3ICAgICAgIG1tMiwgICAgMQotCi0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW0yCi0gICAgICAgIG1vdnEgICAgICAgIG1tMiwgICAgbW00Ci0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICBtbTAKLSAgICAgICAgbW92cSAgICAgICAgW2VkaV0sICBtbTIKLQotICAgICAgICBwdW5wY2toYncgICBtbTQsICAgIG1tMAotICAgICAgICBtb3ZxICAgICAgICBbZWRpKzhdLCBtbTQKLSAgICB9Ci19Ci0KLQotCi0KLQotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDU0XzJbXSA9IHsgIDAsICA2NCwgMTI4LCAxOTIgfTsKLV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3Q1NF8xW10gPSB7MjU2LCAxOTIsIDEyOCwgIDY0IH07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV81XzRfc2NhbGVfbW14Ci0gKgotICogIElOUFVUUyAgICAgICAgOiBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgOiBQb2ludGVyIHRvIHNvdXJjZSBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3dpZHRoICAgIDogU3RyaWRlIG9mIHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCAgICAgICAgIDogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBkYXRhLgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDogU3RyaWRlIG9mIGRlc3RpbmF0aW9uIChOT1QgVVNFRCkuCi0gKgotICogIE9VVFBVVFMgICAgICAgOiBOb25lLgotICoKLSAqICBSRVRVUk5TICAgICAgIDogdm9pZAotICoKLSAqICBGVU5DVElPTiAgICAgIDogQ29waWVzIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgdG8KLSAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gc2NhbGluZyB1cCBieSA0IHRvIDUuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIGhvcml6b250YWxfbGluZV81XzRfc2NhbGVfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgIC8qCi0gICAgdW5zaWduZWQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYSwgYiwgYywgZCwgZTsKLSAgICB1bnNpZ25lZCBjaGFyICpkZXMgPSBkZXN0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IHNvdXJjZTsKLQotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgZm9yICggaT0wOyBpPHNvdXJjZV93aWR0aDsgaSs9NSApCi0gICAgewotICAgICAgICBhID0gc3JjWzBdOwotICAgICAgICBiID0gc3JjWzFdOwotICAgICAgICBjID0gc3JjWzJdOwotICAgICAgICBkID0gc3JjWzNdOwotICAgICAgICBlID0gc3JjWzRdOwotCi0gICAgICAgIGRlc1swXSA9IGE7Ci0gICAgICAgIGRlc1sxXSA9ICgoYioxOTIgKyBjKiA2NCArIDEyOCk+PjgpOwotICAgICAgICBkZXNbMl0gPSAoKGMqMTI4ICsgZCoxMjggKyAxMjgpPj44KTsKLSAgICAgICAgZGVzWzNdID0gKChkKiA2NCArIGUqMTkyICsgMTI4KT4+OCk7Ci0KLSAgICAgICAgc3JjICs9IDU7Ci0gICAgICAgIGRlcyArPSA0OwotICAgIH0KLSAgICAqLwotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotCi0gICAgX19hc20KLSAgICB7Ci0KLSAgICAgICAgbW92ICAgICAgICAgZXNpLCAgICAgICAgc291cmNlICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgICAgIHNvdXJjZV93aWR0aCAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgY29uc3Q1NF8xICAgICAgICAgICA7Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIGNvbnN0NTRfMiAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgIDsKLSAgICAgICAgbGVhICAgICAgICAgZWR4LCAgICAgICAgW2VzaStlY3hdICAgICAgICAgICA7Ci0gICAgICAgIGhvcml6b250YWxfbGluZV81XzRfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgIFtlc2ldICAgIDsKLSAgICAgICAgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0KLSAgICAgICAgcHNybHEgICAgICAgbW0wLCAgICAgICAgOCAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIDAxIDAyIDAzIDA0IDA1IDA2IDA3IHh4Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotICAgICAgICB4eCAwMCB4eCAwMSB4eCAwMiB4eCAwMwotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMCwgICAgICAgIG1tNyAgICAgICAgICAgICAgICAgOwotICAgICAgICB4eCAwMSB4eCAwMiB4eCAwMyB4eCAwNAotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTUKLQotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgICAgICBtbTYKLSAgICAgICAgYWRkICAgICAgICAgZXNpLCAgICAgICAgNQotCi0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgICAgIDQKLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW00Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDgKLQotICAgICAgICBjbXAgICAgICAgICBlc2ksICAgICAgICBlZHgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGktNF0sIG1tMQotCi0gICAgICAgIGpsICAgICAgICAgIGhvcml6b250YWxfbGluZV81XzRfbG9vcAotCi0gICAgfQotCi19Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IG9uZV9mb3VydGhzW10gICA9IHsgIDY0LCAgNjQsICA2NCwgNjQgIH07Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHR3b19mb3VydGhzW10gICA9IHsgMTI4LCAxMjgsIDEyOCwgMTI4IH07Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRocmVlX2ZvdXJ0aHNbXSA9IHsgMTkyLCAxOTIsIDE5MiwgMTkyIH07Ci0KLXN0YXRpYwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9tbXgodW5zaWduZWQgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgc3JjX3BpdGNoLCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgZGVzdF9waXRjaCwgdW5zaWduZWQgaW50IGRlc3Rfd2lkdGgpCi17Ci0KLSAgICBfX2FzbQotICAgIHsKLSAgICAgICAgcHVzaCAgICAgICAgZWJ4Ci0KLSAgICAgICAgbW92ICAgICAgICAgZXNpLCAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgc3JjX3BpdGNoICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwaXRjaCBzaXplCi0KLSAgICAgICAgbW92ICAgICAgICAgZWRpLCAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAvLyB0b3cgbGluZXMgYmVsb3cKLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICBtbTcgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgbW03Ci0KLSAgICAgICAgbW92ICAgICAgICAgZWR4LCAgICBkZXN0X3BpdGNoICAgICAgICAgICAgICAgLy8gTG9vcCBjb3VudGVyCi0gICAgICAgIG1vdiAgICAgICAgIGVieCwgICAgZGVzdF93aWR0aAotCi0gICAgICAgIHZzXzVfNF9sb29wOgotCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgICAgRFdPUkQgcHRyIFtlc2ldICAgICAgICAgLy8gc3JjWzBdOwotICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgIERXT1JEIHB0ciBbZXNpK2VjeF0gICAgIC8vIHNyY1sxXTsKLQotICAgICAgICBtb3ZkICAgICAgICBtbTIsICAgIERXT1JEIHB0ciBbZXNpK2VjeCoyXQotICAgICAgICBsZWEgICAgICAgICBlYXgsICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICBtbTcKLQotICAgICAgICBtb3ZxICAgICAgICBtbTMsICAgIG1tMgotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgIHRocmVlX2ZvdXJ0aHMKLQotICAgICAgICBwbXVsbHcgICAgICBtbTIsICAgIG9uZV9mb3VydGhzCi0gICAgICAgIG1vdmQgICAgICAgIG1tNCwgICAgW2VheCtlY3hdCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICB0d29fZm91cnRocwotICAgICAgICBwdW5wY2tsYncgICBtbTQsICAgIG1tNwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgbW00Ci0gICAgICAgIHBtdWxsdyAgICAgIG1tNCwgICAgdHdvX2ZvdXJ0aHMKLQotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIG1tMgotICAgICAgICBtb3ZkICAgICAgICBtbTYsICAgIFtlYXgrZWN4KjJdCi0KLSAgICAgICAgcG11bGx3ICAgICAgbW01LCAgICBvbmVfZm91cnRocwotICAgICAgICBwYWRkdyAgICAgICBtbTEsICAgIHJvdW5kX3ZhbHVlczsKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgIG1tNAotICAgICAgICBwc3JsdyAgICAgICBtbTEsICAgIDgKLQotICAgICAgICBwdW5wY2tsYncgICBtbTYsICAgIG1tNwotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgIHJvdW5kX3ZhbHVlcwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tNiwgICAgdGhyZWVfZm91cnRocwotICAgICAgICBwc3JsdyAgICAgICBtbTMsICAgIDgKLQotICAgICAgICBwYWNrdXN3YiAgICBtbTEsICAgIG1tNwotICAgICAgICBwYWNrdXN3YiAgICBtbTMsICAgIG1tNwotCi0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpXSwgbW0wCi0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpK2VkeF0sIG1tMQotCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW01LCAgICBtbTYKLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGkrZWR4KjJdLCBtbTMKLQotICAgICAgICBsZWEgICAgICAgICBlYXgsICAgIFtlZGkrZWR4KjJdCi0gICAgICAgIHBhZGR3ICAgICAgIG1tNSwgICAgcm91bmRfdmFsdWVzCi0KLSAgICAgICAgcHNybHcgICAgICAgbW01LCAgICA4Ci0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgNAotCi0gICAgICAgIHBhY2t1c3diICAgIG1tNSwgICAgbW03Ci0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWF4K2VkeF0sIG1tNQotCi0gICAgICAgIGFkZCAgICAgICAgIGVzaSwgICAgNAotICAgICAgICBzdWIgICAgICAgICBlYngsICAgIDQKLQotICAgICAgICBqZyAgICAgICAgIHZzXzVfNF9sb29wCi0KLSAgICAgICAgcG9wICAgICAgICAgZWJ4Ci0gICAgfQotfQotCi0KLV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3Q1M18xW10gPSB7ICAwLCAgODUsIDE3MSwgMCB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdDUzXzJbXSA9IHsyNTYsIDE3MSwgIDg1LCAwIH07Ci0KLQotc3RhdGljCi12b2lkIGhvcml6b250YWxfbGluZV81XzNfc2NhbGVfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotCi0gICAgKHZvaWQpIGRlc3Rfd2lkdGg7Ci0gICAgX19hc20KLSAgICB7Ci0KLSAgICAgICAgbW92ICAgICAgICAgZXNpLCAgICAgICAgc291cmNlICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgOwotCi0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgICAgIHNvdXJjZV93aWR0aCAgICAgICAgIDsKLSAgICAgICAgbW92cSAgICAgICAgbW01LCAgICAgICAgY29uc3Q1M18xICAgICAgICAgICA7Ci0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03ICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNiwgICAgICAgIGNvbnN0NTNfMiAgICAgICAgICAgOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIHJvdW5kX3ZhbHVlcyAgICAgICAgIDsKLSAgICAgICAgbGVhICAgICAgICAgZWR4LCAgICAgICAgW2VzaStlY3gtNV0gICAgICAgICA7Ci0gICAgICAgIGhvcml6b250YWxfbGluZV81XzNfbG9vcDoKLQotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgIFtlc2ldICAgIDsKLSAgICAgICAgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0KLSAgICAgICAgcHNsbHcgICAgICAgbW0wLCAgICAgICAgOCAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHh4IDAwIHh4IDAyIHh4IDA0IHh4IDA2Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDggICAgICAgICAgICAgICAgICAgOwotICAgICAgICAwMSB4eCAwMyB4eCAwNSB4eCAwNyB4eAotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgICAgIDggICAgICAgICAgICAgICAgICAgOwotICAgICAgICAwMCB4eCAwMiB4eCAwNCB4eCAwNiB4eAotICAgICAgICBwc2xscSAgICAgICBtbTEsICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgeHggeHggMDEgeHggMDMgeHggMDUgeHgKLQotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgICAgICBtbTYKLQotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTUKLSAgICAgICAgYWRkICAgICAgICAgZXNpLCAgICAgICAgNQotCi0gICAgICAgIGFkZCAgICAgICAgIGVkaSwgICAgICAgIDMKLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW00Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDgKLQotICAgICAgICBjbXAgICAgICAgICBlc2ksICAgICAgICBlZHgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0xLCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGktM10sIG1tMQotICAgICAgICBqbCAgICAgICAgICBob3Jpem9udGFsX2xpbmVfNV8zX2xvb3AKLQotLy9leGl0IGNvbmRpdGlvbgotICAgICAgICBtb3ZxICAgICAgICBtbTAsICAgICAgICBRV09SRCBQVFIgIFtlc2ldICAgIDsKLSAgICAgICAgMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcKLSAgICAgICAgbW92cSAgICAgICAgbW0xLCAgICAgICAgbW0wICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3Ci0KLSAgICAgICAgcHNsbHcgICAgICAgbW0wLCAgICAgICAgOCAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgIHh4IDAwIHh4IDAyIHh4IDA0IHh4IDA2Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDggICAgICAgICAgICAgICAgICAgOwotICAgICAgICAwMSB4eCAwMyB4eCAwNSB4eCAwNyB4eAotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgICAgIDggICAgICAgICAgICAgICAgICAgOwotICAgICAgICAwMCB4eCAwMiB4eCAwNCB4eCAwNiB4eAotICAgICAgICBwc2xscSAgICAgICBtbTEsICAgICAgICAxNiAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgeHggeHggMDEgeHggMDMgeHggMDUgeHgKLQotICAgICAgICBwbXVsbHcgICAgICBtbTAsICAgICAgICBtbTYKLQotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgICAgICBtbTUKLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW0wCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW00Ci0gICAgICAgIHBzcmx3ICAgICAgIG1tMSwgICAgICAgIDgKLQotICAgICAgICBwYWNrdXN3YiAgICBtbTEsICAgICAgICBtbTcKLSAgICAgICAgbW92ZCAgICAgICAgZWF4LCAgICAgICAgbW0xCi0KLSAgICAgICAgbW92ICAgICAgICAgZWR4LCAgICAgICAgZWF4Ci0gICAgICAgIHNociAgICAgICAgIGVkeCwgICAgICAgIDE2Ci0KLSAgICAgICAgbW92ICAgICAgICAgV09SRCBQVFJbZWRpXSwgICBheAotICAgICAgICBtb3YgICAgICAgICBCWVRFIFBUUltlZGkrMl0sIGRsCi0KLSAgICB9Ci0KLX0KLQotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvbmVfdGhpcmRzW10gPSB7ICA4NSwgIDg1LCAgODUsICA4NSB9OwotX19kZWNsc3BlYyhhbGlnbigxNikpIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0d29fdGhpcmRzW10gPSB7IDE3MSwgMTcxLCAxNzEsIDE3MSB9OwotCi1zdGF0aWMKLXZvaWQgdmVydGljYWxfYmFuZF81XzNfc2NhbGVfbW14KHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNyY19waXRjaCwgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGRlc3RfcGl0Y2gsIHVuc2lnbmVkIGludCBkZXN0X3dpZHRoKQotewotCi0gICAgX19hc20KLSAgICB7Ci0gICAgICAgIHB1c2ggICAgICAgIGVieAotCi0gICAgICAgIG1vdiAgICAgICAgIGVzaSwgICAgc291cmNlICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcgotICAgICAgICBtb3YgICAgICAgICBlY3gsICAgIHNyY19waXRjaCAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGl0Y2ggc2l6ZQotCi0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgLy8gdG93IGxpbmVzIGJlbG93Ci0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03ICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IG1tNwotCi0gICAgICAgIG1vdiAgICAgICAgIGVkeCwgICAgZGVzdF9waXRjaCAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgotICAgICAgICBtb3ZxICAgICAgICBtbTUsICAgIG9uZV90aGlyZHMKLQotICAgICAgICBtb3ZxICAgICAgICBtbTYsICAgIHR3b190aGlyZHMKLSAgICAgICAgbW92ICAgICAgICAgZWJ4LCAgICBkZXN0X3dpZHRoOwotCi0gICAgICAgIHZzXzVfM19sb29wOgotCi0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgICAgRFdPUkQgcHRyIFtlc2ldICAgICAgICAgLy8gc3JjWzBdOwotICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgIERXT1JEIHB0ciBbZXNpK2VjeF0gICAgIC8vIHNyY1sxXTsKLQotICAgICAgICBtb3ZkICAgICAgICBtbTIsICAgIERXT1JEIHB0ciBbZXNpK2VjeCoyXQotICAgICAgICBsZWEgICAgICAgICBlYXgsICAgIFtlc2krZWN4KjJdICAgICAgICAgICAgIC8vCi0KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0xLCAgICBtbTcKLSAgICAgICAgcHVucGNrbGJ3ICAgbW0yLCAgICBtbTcKLQotICAgICAgICBwbXVsbHcgICAgICBtbTEsICAgIG1tNQotICAgICAgICBwbXVsbHcgICAgICBtbTIsICAgIG1tNgotCi0gICAgICAgIG1vdmQgICAgICAgIG1tMywgICAgRFdPUkQgcHRyIFtlYXgrZWN4XQotICAgICAgICBtb3ZkICAgICAgICBtbTQsICAgIERXT1JEIHB0ciBbZWF4K2VjeCoyXQotCi0gICAgICAgIHB1bnBja2xidyAgIG1tMywgICAgbW03Ci0gICAgICAgIHB1bnBja2xidyAgIG1tNCwgICAgbW03Ci0KLSAgICAgICAgcG11bGx3ICAgICAgbW0zLCAgICBtbTYKLSAgICAgICAgcG11bGx3ICAgICAgbW00LCAgICBtbTUKLQotCi0gICAgICAgIG1vdmQgICAgICAgIERXT1JEIFBUUiBbZWRpXSwgbW0wCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMSwgICAgbW0yCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICByb3VuZF92YWx1ZXMKLSAgICAgICAgcHNybHcgICAgICAgbW0xLCAgICA4Ci0KLSAgICAgICAgcGFja3Vzd2IgICAgbW0xLCAgICBtbTcKLSAgICAgICAgcGFkZHcgICAgICAgbW0zLCAgICBtbTQKLQotICAgICAgICBwYWRkdyAgICAgICBtbTMsICAgIHJvdW5kX3ZhbHVlcwotICAgICAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaStlZHhdLCBtbTEKLQotICAgICAgICBwc3JsdyAgICAgICBtbTMsICAgIDgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0zLCAgICBtbTcKLQotICAgICAgICBtb3ZkICAgICAgICBEV09SRCBQVFIgW2VkaStlZHgqMl0sIG1tMwotCi0KLSAgICAgICAgYWRkICAgICAgICAgZWRpLCAgICA0Ci0gICAgICAgIGFkZCAgICAgICAgIGVzaSwgICAgNAotCi0gICAgICAgIHN1YiAgICAgICAgIGVieCwgICAgNAotICAgICAgICBqZyAgICAgICAgICB2c181XzNfbG9vcAotCi0gICAgICAgIHBvcCAgICAgICAgIGVieAotICAgIH0KLX0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUk9VVElORSAgICAgICA6IGhvcml6b250YWxfbGluZV8yXzFfc2NhbGUKLSAqCi0gKiAgSU5QVVRTICAgICAgICA6IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA6Ci0gKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGggICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0ICAgICAgICAgOgotICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCAgICAgIDoKLSAqCi0gKiAgT1VUUFVUUyAgICAgICA6IE5vbmUuCi0gKgotICogIFJFVFVSTlMgICAgICAgOiB2b2lkCi0gKgotICogIEZVTkNUSU9OICAgICAgOiAxIHRvIDIgdXAtc2NhbGluZyBvZiBhIGhvcml6b250YWwgbGluZSBvZiBwaXhlbHMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIGhvcml6b250YWxfbGluZV8yXzFfc2NhbGVfbW14Ci0oCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAotICAgIHVuc2lnbmVkIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aAotKQotewotICAgICh2b2lkKSBkZXN0X3dpZHRoOwotICAgICh2b2lkKSBzb3VyY2Vfd2lkdGg7Ci0gICAgX19hc20KLSAgICB7Ci0gICAgICAgIG1vdiAgICAgICAgIGVzaSwgICAgc291cmNlCi0gICAgICAgIG1vdiAgICAgICAgIGVkaSwgICAgZGVzdAotCi0gICAgICAgIHB4b3IgICAgICAgIG1tNywgICAgbW03Ci0gICAgICAgIG1vdiAgICAgICAgIGVjeCwgICAgZGVzdF93aWR0aAotCi0gICAgICAgIHhvciAgICAgICAgIGVkeCwgICAgZWR4Ci0gICAgICAgIGhzXzJfMV9sb29wOgotCi0gICAgICAgIG1vdnEgICAgICAgIG1tMCwgICAgW2VzaStlZHgqMl0KLSAgICAgICAgcHNsbHcgICAgICAgbW0wLCAgICA4Ci0KLSAgICAgICAgcHNybHcgICAgICAgbW0wLCAgICA4Ci0gICAgICAgIHBhY2t1c3diICAgIG1tMCwgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUHRyIFtlZGkrZWR4XSwgbW0wOwotICAgICAgICBhZGQgICAgICAgICBlZHgsICAgIDQKLQotICAgICAgICBjbXAgICAgICAgICBlZHgsICAgIGVjeAotICAgICAgICBqbCAgICAgICAgICBoc18yXzFfbG9vcAotCi0gICAgfQotfQotCi0KLQotc3RhdGljCi12b2lkIHZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX21teCh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLSAgICAodm9pZCkgZGVzdF9waXRjaDsKLSAgICAodm9pZCkgc3JjX3BpdGNoOwotICAgIHZweF9tZW1jcHkoZGVzdCwgc291cmNlLCBkZXN0X3dpZHRoKTsKLX0KLQotCi1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRocmVlX3NpeHRlZW50aHNbXSA9IHsgIDQ4LCAgNDgsICA0OCwgIDQ4IH07Ci1fX2RlY2xzcGVjKGFsaWduKDE2KSkgY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHRlbl9zaXh0ZWVudGhzW10gICA9IHsgMTYwLCAxNjAsIDE2MCwgMTYwIH07Ci0KLXN0YXRpYwotdm9pZCB2ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX21teCh1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBzcmNfcGl0Y2gsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBkZXN0X3BpdGNoLCB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCkKLXsKLQotICAgICh2b2lkKSBkZXN0X3BpdGNoOwotICAgIF9fYXNtCi0gICAgewotICAgICAgICBtb3YgICAgICAgICBlc2ksICAgICAgICBzb3VyY2UKLSAgICAgICAgbW92ICAgICAgICAgZWRpLCAgICAgICAgZGVzdAotCi0gICAgICAgIG1vdiAgICAgICAgIGVheCwgICAgICAgIHNyY19waXRjaAotICAgICAgICBtb3YgICAgICAgICBlZHgsICAgICAgICBkZXN0X3dpZHRoCi0KLSAgICAgICAgcHhvciAgICAgICAgbW03LCAgICAgICAgbW03Ci0gICAgICAgIHN1YiAgICAgICAgIGVzaSwgICAgICAgIGVheCAgICAgICAgICAgICAvL2JhY2sgb25lIGxpbmUKLQotCi0gICAgICAgIGxlYSAgICAgICAgIGVjeCwgICAgICAgIFtlc2krZWR4XTsKLSAgICAgICAgbW92cSAgICAgICAgbW02LCAgICAgICAgcm91bmRfdmFsdWVzOwotCi0gICAgICAgIG1vdnEgICAgICAgIG1tNSwgICAgICAgIHRocmVlX3NpeHRlZW50aHM7Ci0gICAgICAgIG1vdnEgICAgICAgIG1tNCwgICAgICAgIHRlbl9zaXh0ZWVudGhzOwotCi0gICAgICAgIHZzXzJfMV9pX2xvb3A6Ci0gICAgICAgIG1vdmQgICAgICAgIG1tMCwgICAgICAgIFtlc2ldICAgICAgICAgICAvLwotICAgICAgICBtb3ZkICAgICAgICBtbTEsICAgICAgICBbZXNpK2VheF0gICAgICAgLy8KLQotICAgICAgICBtb3ZkICAgICAgICBtbTIsICAgICAgICBbZXNpK2VheCoyXSAgICAgLy8KLSAgICAgICAgcHVucGNrbGJ3ICAgbW0wLCAgICAgICAgbW03Ci0KLSAgICAgICAgcG11bGx3ICAgICAgbW0wLCAgICAgICAgbW01Ci0gICAgICAgIHB1bnBja2xidyAgIG1tMSwgICAgICAgIG1tNwotCi0gICAgICAgIHBtdWxsdyAgICAgIG1tMSwgICAgICAgIG1tNAotICAgICAgICBwdW5wY2tsYncgICBtbTIsICAgICAgICBtbTcKLQotICAgICAgICBwbXVsbHcgICAgICBtbTIsICAgICAgICBtbTUKLSAgICAgICAgcGFkZHcgICAgICAgbW0wLCAgICAgICAgcm91bmRfdmFsdWVzCi0KLSAgICAgICAgcGFkZHcgICAgICAgbW0xLCAgICAgICAgbW0yCi0gICAgICAgIHBhZGR3ICAgICAgIG1tMCwgICAgICAgIG1tMQotCi0gICAgICAgIHBzcmx3ICAgICAgIG1tMCwgICAgICAgIDgKLSAgICAgICAgcGFja3Vzd2IgICAgbW0wLCAgICAgICAgbW03Ci0KLSAgICAgICAgbW92ZCAgICAgICAgRFdPUkQgUFRSIFtlZGldLCAgICAgICAgbW0wCi0gICAgICAgIGFkZCAgICAgICAgIGVzaSwgICAgICAgIDQKLQotICAgICAgICBhZGQgICAgICAgICBlZGksICAgICAgICA0OwotICAgICAgICBjbXAgICAgICAgICBlc2ksICAgICAgICBlY3gKLSAgICAgICAgamwgICAgICAgICAgdnNfMl8xX2lfbG9vcAotCi0gICAgfQotfQotCi0KLQotdm9pZAotcmVnaXN0ZXJfbW14c2NhbGVycyh2b2lkKQotewotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlICAgICAgICA9IGhvcml6b250YWxfbGluZV8xXzJfc2NhbGVfbW14OwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSAgICAgICAgICA9IHZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX21teDsKLSAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSAgICAgID0gbGFzdF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZV9tbXg7Ci0gICAgdnA4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGUgICAgICAgID0gaG9yaXpvbnRhbF9saW5lXzNfNV9zY2FsZV9tbXg7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICAgICAgID0gdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfbW14OwotICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICAgPSBsYXN0X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlX21teDsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzRfNV9zY2FsZSAgICAgICAgPSBob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlX21teDsKLSAgICB2cDhfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgICAgICAgICAgPSB2ZXJ0aWNhbF9iYW5kXzRfNV9zY2FsZV9tbXg7Ci0gICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgICAgICA9IGxhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfbW14OwotCi0gICAgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jOwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfM180X3NjYWxlX2M7Ci0gICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzRfc2NhbGVfYzsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZSAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2M7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8yXzNfc2NhbGVfYzsKLSAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZV9jOwotCi0KLQotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZSAgICAgICAgICAgPSB2ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9tbXg7Ci0gICAgdnA4X3ZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlICAgICAgICAgICA9IHZlcnRpY2FsX2JhbmRfNV8zX3NjYWxlX21teDsKLSAgICB2cDhfdmVydGljYWxfYmFuZF8yXzFfc2NhbGUgICAgICAgICAgID0gdmVydGljYWxfYmFuZF8yXzFfc2NhbGVfbW14OwotICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pICAgICAgICAgPSB2ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX21teDsKLSAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZSAgICAgICAgID0gaG9yaXpvbnRhbF9saW5lXzJfMV9zY2FsZV9tbXg7Ci0gICAgdnA4X2hvcml6b250YWxfbGluZV81XzNfc2NhbGUgICAgICAgICA9IGhvcml6b250YWxfbGluZV81XzNfc2NhbGVfbW14OwotICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlICAgICAgICAgPSBob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX21teDsKLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdnB4X3NjYWxlL3dpbjMyL3NjYWxlc3lzdGVtZGVwZW5kZW50LmMgYi92cHhfc2NhbGUvd2luMzIvc2NhbGVzeXN0ZW1kZXBlbmRlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllNjFjMy4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUvd2luMzIvc2NhbGVzeXN0ZW1kZXBlbmRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgIE1vZHVsZSBUaXRsZSA6ICAgICBzeXN0ZW1fZGVwZW5kZW50LmMKLSoKLSogICBEZXNjcmlwdGlvbiAgOiAgICAgTWlzY2VsbGFuZW91cyBzeXN0ZW0gZGVwZW5kZW50IGZ1bmN0aW9ucwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEhlYWRlciBGaWxlcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJ2cHhfc2NhbGUvdnB4c2NhbGUuaCIKLSNpbmNsdWRlICJjcHVpZGxpYi5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgSW1wb3J0cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCByZWdpc3Rlcl9nZW5lcmljX3NjYWxlcnModm9pZCk7Ci1leHRlcm4gdm9pZCByZWdpc3Rlcl9tbXhzY2FsZXJzKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBST1VUSU5FICAgICAgIDogcG9zdF9wcm9jX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnCi0gKgotICogIElOUFVUUyAgICAgICAgOiBVSU5UMzIgVmVyc2lvbiA6IENvZGVjIHZlcnNpb24gbnVtYmVyLgotICoKLSAqICBPVVRQVVRTICAgICAgIDogTm9uZS4KLSAqCi0gKiAgUkVUVVJOUyAgICAgICA6IHZvaWQKLSAqCi0gKiAgRlVOQ1RJT04gICAgICA6IENoZWNrcyBmb3IgbWFjaGluZSBzcGVjaWZjIGZlYXR1cmVzIHN1Y2ggYXMgTU1YIHN1cHBvcnQKLSAqICAgICAgICAgICAgICAgICAgc2V0cyBhcHByb3ByaWF0ZSBmbGFncyBhbmQgZnVuY3Rpb24gcG9pbnRlcnMuCi0gKgotICogIFNQRUNJQUwgTk9URVMgOiBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotdnA4X3NjYWxlX21hY2hpbmVfc3BlY2lmaWNfY29uZmlnKHZvaWQpCi17Ci0gICAgLy8gSWYgTU1YIHN1cHBvcnRlZCB0aGVuIHNldCB0byB1c2UgTU1YIHZlcnNpb25zIG9mIGZ1bmN0aW9ucyBlbHNlCi0gICAgLy8gdXNlIG9yaWdpbmFsICdDJyB2ZXJzaW9ucy4KLSAgICBpbnQgbW14X2VuYWJsZWQ7Ci0gICAgaW50IHhtbV9lbmFibGVkOwotICAgIGludCB3bXRfZW5hYmxlZDsKLQotICAgIHZweF9nZXRfcHJvY2Vzc29yX2ZsYWdzKCZtbXhfZW5hYmxlZCwgJnhtbV9lbmFibGVkLCAmd210X2VuYWJsZWQpOwotCi0gICAgaWYgKG1teF9lbmFibGVkIHx8IHhtbV9lbmFibGVkIHx8IHdtdF9lbmFibGVkKQotICAgIHsKLSAgICAgICAgcmVnaXN0ZXJfbW14c2NhbGVycygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzFfMl9zY2FsZSAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMV8yX3NjYWxlX2M7Ci0gICAgICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzFfMl9zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2M7Ci0gICAgICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlICAgICAgPSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMV8yX3NjYWxlX2M7Ci0gICAgICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfM181X3NjYWxlICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV8zXzVfc2NhbGVfYzsKLSAgICAgICAgdnA4X3ZlcnRpY2FsX2JhbmRfM181X3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYzsKLSAgICAgICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF8zXzVfc2NhbGVfYzsKLSAgICAgICAgdnA4X2hvcml6b250YWxfbGluZV8zXzRfc2NhbGUgICAgICAgID0gdnA4Y3hfaG9yaXpvbnRhbF9saW5lXzNfNF9zY2FsZV9jOwotICAgICAgICB2cDhfdmVydGljYWxfYmFuZF8zXzRfc2NhbGUgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jOwotICAgICAgICB2cDhfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZSAgICAgID0gdnA4Y3hfbGFzdF92ZXJ0aWNhbF9iYW5kXzNfNF9zY2FsZV9jOwotICAgICAgICB2cDhfaG9yaXpvbnRhbF9saW5lXzJfM19zY2FsZSAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8zX3NjYWxlX2M7Ci0gICAgICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzJfM19zY2FsZSAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2M7Ci0gICAgICAgIHZwOF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlICAgICAgPSB2cDhjeF9sYXN0X3ZlcnRpY2FsX2JhbmRfMl8zX3NjYWxlX2M7Ci0gICAgICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNF81X3NjYWxlICAgICAgICA9IHZwOGN4X2hvcml6b250YWxfbGluZV80XzVfc2NhbGVfYzsKLSAgICAgICAgdnA4X3ZlcnRpY2FsX2JhbmRfNF81X3NjYWxlICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYzsKLSAgICAgICAgdnA4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGUgICAgICA9IHZwOGN4X2xhc3RfdmVydGljYWxfYmFuZF80XzVfc2NhbGVfYzsKLQotCi0gICAgICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZSAgICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzVfNF9zY2FsZV9jOwotICAgICAgICB2cDhfdmVydGljYWxfYmFuZF81XzNfc2NhbGUgICAgICAgICAgID0gdnA4Y3hfdmVydGljYWxfYmFuZF81XzNfc2NhbGVfYzsKLSAgICAgICAgdnA4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlICAgICAgICAgICA9IHZwOGN4X3ZlcnRpY2FsX2JhbmRfMl8xX3NjYWxlX2M7Ci0gICAgICAgIHZwOF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pICAgICAgICAgPSB2cDhjeF92ZXJ0aWNhbF9iYW5kXzJfMV9zY2FsZV9pX2M7Ci0gICAgICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlICAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfMl8xX3NjYWxlX2M7Ci0gICAgICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlICAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV8zX3NjYWxlX2M7Ci0gICAgICAgIHZwOF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlICAgICAgICAgPSB2cDhjeF9ob3Jpem9udGFsX2xpbmVfNV80X3NjYWxlX2M7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92cHhfc2NhbGUveXYxMmNvbmZpZy5oIGIvdnB4X3NjYWxlL3l2MTJjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwZGIzNC4uMDAwMDAwMAotLS0gYS92cHhfc2NhbGUveXYxMmNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqLwotCi0KLSNpZm5kZWYgWVYxMl9DT05GSUdfSAotI2RlZmluZSBZVjEyX0NPTkZJR19ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0jZGVmaW5lIFZQN0JPUkRFUklOUElYRUxTICAgICAgIDQ4Ci0jZGVmaW5lIFZQOEJPUkRFUklOUElYRUxTICAgICAgIDMyCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICBGb3IgSU5UX1lVVjoKLQotICAgICBZID0gKFIrRyoyK0IpLzQ7Ci0gICAgIFUgPSAoUi1CKS8yOwotICAgICBWID0gIChHKjIgLSBSIC0gQikvNDsKLSAgICBBbmQKLSAgICAgUiA9IFkrVS1WOwotICAgICBHID0gWStWOwotICAgICBCID0gWS1VLVY7Ci0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgUkVHX1lVViA9IDAsICAgIC8qIFJlZ3VsYXIgeXV2ICovCi0gICAgICAgIElOVF9ZVVYgPSAxICAgICAvKiBUaGUgdHlwZSBvZiB5dXYgdGhhdCBjYW4gYmUgdHJhbmZlciB0byBhbmQgZnJvbSBSR0IgdGhyb3VnaCBpbnRlZ2VyIHRyYW5zZm9ybSAqLwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFlVVl9UWVBFOwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIGludCAgIHlfd2lkdGg7Ci0gICAgICAgIGludCAgIHlfaGVpZ2h0OwotICAgICAgICBpbnQgICB5X3N0cmlkZTsKLS8qICAgIGludCAgIHlpbnRlcm5hbF93aWR0aDsgKi8KLQotICAgICAgICBpbnQgICB1dl93aWR0aDsKLSAgICAgICAgaW50ICAgdXZfaGVpZ2h0OwotICAgICAgICBpbnQgICB1dl9zdHJpZGU7Ci0vKiAgICBpbnQgICB1dmludGVybmFsX3dpZHRoOyAqLwotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnlfYnVmZmVyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICp1X2J1ZmZlcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdl9idWZmZXI7Ci0KLSAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyX2FsbG9jOwotICAgICAgICBpbnQgYm9yZGVyOwotICAgICAgICBpbnQgZnJhbWVfc2l6ZTsKLSAgICAgICAgWVVWX1RZUEUgY2xydHlwZTsKLQotICAgICAgICBpbnQgY29ycnVwdGVkOwotICAgIH0gWVYxMl9CVUZGRVJfQ09ORklHOwotCi0gICAgaW50IHZwOF95djEyX2FsbG9jX2ZyYW1lX2J1ZmZlcihZVjEyX0JVRkZFUl9DT05GSUcgKnliZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyKTsKLSAgICBpbnQgdnA4X3l2MTJfZGVfYWxsb2NfZnJhbWVfYnVmZmVyKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypZVjEyX0NPTkZJR19IKi8KZGlmZiAtLWdpdCBhL3ZweF9zY2FsZS95djEyZXh0ZW5kLmggYi92cHhfc2NhbGUveXYxMmV4dGVuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzIzOWI5Li4wMDAwMDAwCi0tLSBhL3ZweF9zY2FsZS95djEyZXh0ZW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotI2lmbmRlZiBZVjEyX0VYVEVORF9ICi0jZGVmaW5lIFlWMTJfRVhURU5EX0gKLQotI2luY2x1ZGUgInZweF9zY2FsZS95djEyY29uZmlnLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLSAgICB2b2lkIHZwOF95djEyX2V4dGVuZF9mcmFtZV9ib3JkZXJzKFlWMTJfQlVGRkVSX0NPTkZJRyAqeWJmKTsKLQotICAgIC8qIENvcHkgWSxVLFYgYnVmZmVyIGRhdGEgZnJvbSBzcmMgdG8gZHN0LCBmaWxsaW5nIGJvcmRlciBvZiBkc3QgYXMgd2VsbC4gKi8KLQotICAgIHZvaWQgdnA4X3l2MTJfY29weV9mcmFtZShZVjEyX0JVRkZFUl9DT05GSUcgKnNyY195YmMsIFlWMTJfQlVGRkVSX0NPTkZJRyAqZHN0X3liYyk7Ci0gICAgdm9pZCB2cDhfeXYxMl9jb3B5X2ZyYW1lX3lvbmx5KFlWMTJfQlVGRkVSX0NPTkZJRyAqc3JjX3liYywgWVYxMl9CVUZGRVJfQ09ORklHICpkc3RfeWJjKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92cHhfdmVyc2lvbi5oIGIvdnB4X3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4YmE5Ni4uMDAwMDAwMAotLS0gYS92cHhfdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jZGVmaW5lIFZFUlNJT05fTUFKT1IgIDAKLSNkZWZpbmUgVkVSU0lPTl9NSU5PUiAgOQotI2RlZmluZSBWRVJTSU9OX1BBVENIICA2Ci0jZGVmaW5lIFZFUlNJT05fRVhUUkEgICIiCi0jZGVmaW5lIFZFUlNJT05fUEFDS0VEICgoVkVSU0lPTl9NQUpPUjw8MTYpfChWRVJTSU9OX01JTk9SPDw4KXwoVkVSU0lPTl9QQVRDSCkpCi0jZGVmaW5lIFZFUlNJT05fU1RSSU5HX05PU1AgInYwLjkuNiIKLSNkZWZpbmUgVkVSU0lPTl9TVFJJTkcgICAgICAiIHYwLjkuNiIKZGlmZiAtLWdpdCBhL3ZweGRlYy5jIGIvdnB4ZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWFmMWUuLjAwMDAwMDAKLS0tIGEvdnB4ZGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiBUaGlzIGlzIGEgc2ltcGxlIHByb2dyYW0gdGhhdCByZWFkcyBpdmYgZmlsZXMgYW5kIGRlY29kZXMgdGhlbQotICogdXNpbmcgdGhlIG5ldyBpbnRlcmZhY2UuIERlY29kZWQgZnJhbWVzIGFyZSBvdXRwdXQgYXMgWVYxMiByYXcuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jZGVmaW5lIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCAxCi0jaW5jbHVkZSAidnB4X2NvbmZpZy5oIgotI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgotI2luY2x1ZGUgInZweF9wb3J0cy92cHhfdGltZXIuaCIKLSNpZiBDT05GSUdfVlA4X0RFQ09ERVIKLSNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKLSNlbmRpZgotI2lmIENPTkZJR19NRDUKLSNpbmNsdWRlICJtZDVfdXRpbHMuaCIKLSNlbmRpZgotI2luY2x1ZGUgInRvb2xzX2NvbW1vbi5oIgotI2luY2x1ZGUgIm5lc3RlZ2cvaW5jbHVkZS9uZXN0ZWdnL25lc3RlZ2cuaCIKLQotI2lmIENPTkZJR19PU19TVVBQT1JUCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0jaW5jbHVkZSA8aW8uaD4KLSNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCi0jZGVmaW5lIGlzYXR0eSAgIF9pc2F0dHkKLSNkZWZpbmUgZmlsZW5vICAgX2ZpbGVubwotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUEFUSF9NQVgKLSNkZWZpbmUgUEFUSF9NQVggMjU2Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWNfbmFtZTsKLQotI2RlZmluZSBWUDhfRk9VUkNDICgweDAwMzg1MDU2KQotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICAgIGNoYXIgY29uc3QgKm5hbWU7Ci0gICAgY29uc3QgdnB4X2NvZGVjX2lmYWNlX3QgKmlmYWNlOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBmb3VyY2M7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGZvdXJjY19tYXNrOwotfSBpZmFjZXNbXSA9Ci17Ci0jaWYgQ09ORklHX1ZQOF9ERUNPREVSCi0gICAgeyJ2cDgiLCAgJnZweF9jb2RlY192cDhfZHhfYWxnbywgICBWUDhfRk9VUkNDLCAweDAwRkZGRkZGfSwKLSNlbmRpZgotfTsKLQotI2luY2x1ZGUgImFyZ3MuaCIKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgY29kZWNhcmcgPSBBUkdfREVGKE5VTEwsICJjb2RlYyIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZGVjIHRvIHVzZSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB1c2VfeXYxMiA9IEFSR19ERUYoTlVMTCwgInl2MTIiLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcmF3IFlWMTIgZnJhbWVzIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHVzZV9pNDIwID0gQVJHX0RFRihOVUxMLCAiaTQyMCIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCByYXcgSTQyMCBmcmFtZXMiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgZmxpcHV2YXJnID0gQVJHX0RFRihOVUxMLCAiZmxpcHV2IiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsaXAgdGhlIGNocm9tYSBwbGFuZXMgaW4gdGhlIG91dHB1dCIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBub2JsaXRhcmcgPSBBUkdfREVGKE5VTEwsICJub2JsaXQiLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3QgcHJvY2VzcyB0aGUgZGVjb2RlZCBmcmFtZXMiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHJvZ3Jlc3NhcmcgPSBBUkdfREVGKE5VTEwsICJwcm9ncmVzcyIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNob3cgcHJvZ3Jlc3MgYWZ0ZXIgZWFjaCBmcmFtZSBkZWNvZGVzIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGxpbWl0YXJnID0gQVJHX0RFRihOVUxMLCAibGltaXQiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9wIGRlY29kaW5nIGFmdGVyIG4gZnJhbWVzIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHBvc3Rwcm9jYXJnID0gQVJHX0RFRihOVUxMLCAicG9zdHByb2MiLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0cHJvY2VzcyBkZWNvZGVkIGZyYW1lcyIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBzdW1tYXJ5YXJnID0gQVJHX0RFRihOVUxMLCAic3VtbWFyeSIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hvdyB0aW1pbmcgc3VtbWFyeSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBvdXRwdXRmaWxlID0gQVJHX0RFRigibyIsICJvdXRwdXQiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBmaWxlIG5hbWUgcGF0dGVybiAoc2VlIGJlbG93KSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB0aHJlYWRzYXJnID0gQVJHX0RFRigidCIsICJ0aHJlYWRzIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggdGhyZWFkcyB0byB1c2UiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgdmVyYm9zZWFyZyA9IEFSR19ERUYoInYiLCAidmVyYm9zZSIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNob3cgdmVyc2lvbiBzdHJpbmciKTsKLQotI2lmIENPTkZJR19NRDUKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgbWQ1YXJnID0gQVJHX0RFRihOVUxMLCAibWQ1IiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcHV0ZSB0aGUgTUQ1IHN1bSBvZiB0aGUgZGVjb2RlZCBmcmFtZSIpOwotI2VuZGlmCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90ICphbGxfYXJnc1tdID0KLXsKLSAgICAmY29kZWNhcmcsICZ1c2VfeXYxMiwgJnVzZV9pNDIwLCAmZmxpcHV2YXJnLCAmbm9ibGl0YXJnLAotICAgICZwcm9ncmVzc2FyZywgJmxpbWl0YXJnLCAmcG9zdHByb2NhcmcsICZzdW1tYXJ5YXJnLCAmb3V0cHV0ZmlsZSwKLSAgICAmdGhyZWFkc2FyZywgJnZlcmJvc2VhcmcsCi0jaWYgQ09ORklHX01ENQotICAgICZtZDVhcmcsCi0jZW5kaWYKLSAgICBOVUxMCi19OwotCi0jaWYgQ09ORklHX1ZQOF9ERUNPREVSCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGFkZG5vaXNlX2xldmVsID0gQVJHX0RFRihOVUxMLCAibm9pc2UtbGV2ZWwiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgVlA4IHBvc3Rwcm9jIGFkZCBub2lzZSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBkZWJsb2NrID0gQVJHX0RFRihOVUxMLCAiZGVibG9jayIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFZQOCBkZWJsb2NraW5nIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGRlbWFjcm9ibG9ja19sZXZlbCA9IEFSR19ERUYoTlVMTCwgImRlbWFjcm9ibG9jay1sZXZlbCIsIDEsCi0gICAgICAgICJFbmFibGUgVlA4IGRlbWFjcm9ibG9ja2luZywgdy8gbGV2ZWwiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHBfZGVidWdfaW5mbyA9IEFSR19ERUYoTlVMTCwgInBwLWRlYnVnLWluZm8iLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBWUDggdmlzaWJsZSBkZWJ1ZyBpbmZvIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHBwX2Rpc3BfcmVmX2ZyYW1lID0gQVJHX0RFRihOVUxMLCAicHAtZGJnLXJlZi1mcmFtZSIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzcGxheSBvbmx5IHNlbGVjdGVkIHJlZmVyZW5jZSBmcmFtZSBwZXIgbWFjcm8gYmxvY2siKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHBfZGlzcF9tYl9tb2RlcyA9IEFSR19ERUYoTlVMTCwgInBwLWRiZy1tYi1tb2RlcyIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzcGxheSBvbmx5IHNlbGVjdGVkIG1hY3JvIGJsb2NrIG1vZGVzIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHBwX2Rpc3BfYl9tb2RlcyA9IEFSR19ERUYoTlVMTCwgInBwLWRiZy1iLW1vZGVzIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNwbGF5IG9ubHkgc2VsZWN0ZWQgYmxvY2sgbW9kZXMiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHBfZGlzcF9tdnMgPSBBUkdfREVGKE5VTEwsICJwcC1kYmctbXZzIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmF3IG9ubHkgc2VsZWN0ZWQgbW90aW9uIHZlY3RvcnMiKTsKLQotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqdnA4X3BwX2FyZ3NbXSA9Ci17Ci0gICAgJmFkZG5vaXNlX2xldmVsLCAmZGVibG9jaywgJmRlbWFjcm9ibG9ja19sZXZlbCwgJnBwX2RlYnVnX2luZm8sCi0gICAgJnBwX2Rpc3BfcmVmX2ZyYW1lLCAmcHBfZGlzcF9tYl9tb2RlcywgJnBwX2Rpc3BfYl9tb2RlcywgJnBwX2Rpc3BfbXZzLAotICAgIE5VTEwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgdXNhZ2VfZXhpdCgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyA8b3B0aW9ucz4gZmlsZW5hbWVcblxuIgotICAgICAgICAgICAgIk9wdGlvbnM6XG4iLCBleGVjX25hbWUpOwotICAgIGFyZ19zaG93X3VzYWdlKHN0ZGVyciwgYWxsX2FyZ3MpOwotI2lmIENPTkZJR19WUDhfREVDT0RFUgotICAgIGZwcmludGYoc3RkZXJyLCAiXG5WUDggUG9zdHByb2Nlc3NpbmcgT3B0aW9uczpcbiIpOwotICAgIGFyZ19zaG93X3VzYWdlKHN0ZGVyciwgdnA4X3BwX2FyZ3MpOwotI2VuZGlmCi0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiXG5PdXRwdXQgRmlsZSBQYXR0ZXJuczpcblxuIgotICAgICAgICAgICAgIiAgVGhlIC1vIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZmlsZShzKSB0byAiCi0gICAgICAgICAgICAid3JpdGUgdG8uIElmIHRoZVxuICBhcmd1bWVudCBkb2VzIG5vdCBpbmNsdWRlIGFueSBlc2NhcGUgIgotICAgICAgICAgICAgImNoYXJhY3RlcnMsIHRoZSBvdXRwdXQgd2lsbCBiZVxuICB3cml0dGVuIHRvIGEgc2luZ2xlIGZpbGUuICIKLSAgICAgICAgICAgICJPdGhlcndpc2UsIHRoZSBmaWxlbmFtZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnlcbiAgZXhwYW5kaW5nICIKLSAgICAgICAgICAgICJ0aGUgZm9sbG93aW5nIGVzY2FwZSBjaGFyYWN0ZXJzOlxuIgotICAgICAgICAgICAgIlxuXHQlJXcgICAtIEZyYW1lIHdpZHRoIgotICAgICAgICAgICAgIlxuXHQlJWggICAtIEZyYW1lIGhlaWdodCIKLSAgICAgICAgICAgICJcblx0JSU8bj4gLSBGcmFtZSBudW1iZXIsIHplcm8gcGFkZGVkIHRvIDxuPiBwbGFjZXMgKDEuLjkpIgotICAgICAgICAgICAgIlxuXG4gIFBhdHRlcm4gYXJndW1lbnRzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBjb25qdW5jdGlvbiAiCi0gICAgICAgICAgICAid2l0aCB0aGUgLS15djEyIGFuZFxuICAtLWk0MjAgb3B0aW9ucy4gSWYgdGhlIC1vIG9wdGlvbiBpcyAiCi0gICAgICAgICAgICAibm90IHNwZWNpZmllZCwgdGhlIG91dHB1dCB3aWxsIGJlXG4gIGRpcmVjdGVkIHRvIHN0ZG91dC5cbiIKLSAgICAgICAgICAgICk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJcbkluY2x1ZGVkIGRlY29kZXJzOlxuXG4iKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoaWZhY2VzKSAvIHNpemVvZihpZmFjZXNbMF0pOyBpKyspCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICUtNnMgLSAlc1xuIiwKLSAgICAgICAgICAgICAgICBpZmFjZXNbaV0ubmFtZSwKLSAgICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfbmFtZShpZmFjZXNbaV0uaWZhY2UpKTsKLQotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICB1c2FnZV9leGl0KCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtX2dldF9sZTE2KGNvbnN0IHZvaWQgKnZtZW0pCi17Ci0gICAgdW5zaWduZWQgaW50ICB2YWw7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVtID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKil2bWVtOwotCi0gICAgdmFsID0gbWVtWzFdIDw8IDg7Ci0gICAgdmFsIHw9IG1lbVswXTsKLSAgICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1lbV9nZXRfbGUzMihjb25zdCB2b2lkICp2bWVtKQotewotICAgIHVuc2lnbmVkIGludCAgdmFsOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1lbSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopdm1lbTsKLQotICAgIHZhbCA9IG1lbVszXSA8PCAyNDsKLSAgICB2YWwgfD0gbWVtWzJdIDw8IDE2OwotICAgIHZhbCB8PSBtZW1bMV0gPDwgODsKLSAgICB2YWwgfD0gbWVtWzBdOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLWVudW0gZmlsZV9raW5kCi17Ci0gICAgUkFXX0ZJTEUsCi0gICAgSVZGX0ZJTEUsCi0gICAgV0VCTV9GSUxFCi19OwotCi1zdHJ1Y3QgaW5wdXRfY3R4Ci17Ci0gICAgZW51bSBmaWxlX2tpbmQgIGtpbmQ7Ci0gICAgRklMRSAgICAgICAgICAgKmluZmlsZTsKLSAgICBuZXN0ZWdnICAgICAgICAqbmVzdGVnZ19jdHg7Ci0gICAgbmVzdGVnZ19wYWNrZXQgKnBrdDsKLSAgICB1bnNpZ25lZCBpbnQgICAgY2h1bms7Ci0gICAgdW5zaWduZWQgaW50ICAgIGNodW5rczsKLSAgICB1bnNpZ25lZCBpbnQgICAgdmlkZW9fdHJhY2s7Ci19OwotCi0jZGVmaW5lIElWRl9GUkFNRV9IRFJfU1ogKHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDY0X3QpKQotI2RlZmluZSBSQVdfRlJBTUVfSERSX1NaIChzaXplb2YodWludDMyX3QpKQotc3RhdGljIGludCByZWFkX2ZyYW1lKHN0cnVjdCBpbnB1dF9jdHggICAgICAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgICoqYnVmLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAqYnVmX3N6LAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAqYnVmX2FsbG9jX3N6KQotewotICAgIGNoYXIgICAgICAgICAgICByYXdfaGRyW0lWRl9GUkFNRV9IRFJfU1pdOwotICAgIHNpemVfdCAgICAgICAgICBuZXdfYnVmX3N6OwotICAgIEZJTEUgICAgICAgICAgICppbmZpbGUgPSBpbnB1dC0+aW5maWxlOwotICAgIGVudW0gZmlsZV9raW5kICBraW5kID0gaW5wdXQtPmtpbmQ7Ci0gICAgaWYoa2luZCA9PSBXRUJNX0ZJTEUpCi0gICAgewotICAgICAgICBpZihpbnB1dC0+Y2h1bmsgPj0gaW5wdXQtPmNodW5rcykKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHRyYWNrOwotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEVuZCBvZiB0aGlzIHBhY2tldCwgZ2V0IGFub3RoZXIuICovCi0gICAgICAgICAgICAgICAgaWYoaW5wdXQtPnBrdCkKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVnZ19mcmVlX3BhY2tldChpbnB1dC0+cGt0KTsKLQotICAgICAgICAgICAgICAgIGlmKG5lc3RlZ2dfcmVhZF9wYWNrZXQoaW5wdXQtPm5lc3RlZ2dfY3R4LCAmaW5wdXQtPnBrdCkgPD0gMAotICAgICAgICAgICAgICAgICAgIHx8IG5lc3RlZ2dfcGFja2V0X3RyYWNrKGlucHV0LT5wa3QsICZ0cmFjaykpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICB9IHdoaWxlKHRyYWNrICE9IGlucHV0LT52aWRlb190cmFjayk7Ci0KLSAgICAgICAgICAgIGlmKG5lc3RlZ2dfcGFja2V0X2NvdW50KGlucHV0LT5wa3QsICZpbnB1dC0+Y2h1bmtzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGlucHV0LT5jaHVuayA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihuZXN0ZWdnX3BhY2tldF9kYXRhKGlucHV0LT5wa3QsIGlucHV0LT5jaHVuaywgYnVmLCBidWZfc3opKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGlucHV0LT5jaHVuaysrOwotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBGb3IgYm90aCB0aGUgcmF3IGFuZCBpdmYgZm9ybWF0cywgdGhlIGZyYW1lIHNpemUgaXMgdGhlIGZpcnN0IDQgYnl0ZXMKLSAgICAgKiBvZiB0aGUgZnJhbWUgaGVhZGVyLiBXZSBqdXN0IG5lZWQgdG8gc3BlY2lhbCBjYXNlIG9uIHRoZSBoZWFkZXIKLSAgICAgKiBzaXplLgotICAgICAqLwotICAgIGVsc2UgaWYgKGZyZWFkKHJhd19oZHIsIGtpbmQ9PUlWRl9GSUxFCi0gICAgICAgICAgICAgICAgICAgPyBJVkZfRlJBTUVfSERSX1NaIDogUkFXX0ZSQU1FX0hEUl9TWiwgMSwgaW5maWxlKSAhPSAxKQotICAgIHsKLSAgICAgICAgaWYgKCFmZW9mKGluZmlsZSkpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkIGZyYW1lIHNpemVcbiIpOwotCi0gICAgICAgIG5ld19idWZfc3ogPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuZXdfYnVmX3N6ID0gbWVtX2dldF9sZTMyKHJhd19oZHIpOwotCi0gICAgICAgIGlmIChuZXdfYnVmX3N6ID4gMjU2ICogMTAyNCAqIDEwMjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFJlYWQgaW52YWxpZCBmcmFtZSBzaXplICgldSlcbiIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbmV3X2J1Zl9zeik7Ci0gICAgICAgICAgICBuZXdfYnVmX3N6ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChraW5kID09IFJBV19GSUxFICYmIG5ld19idWZfc3ogPiAyNTYgKiAxMDI0KQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBSZWFkIGludmFsaWQgZnJhbWUgc2l6ZSAoJXUpIgotICAgICAgICAgICAgICAgICAgICAiIC0gbm90IGEgcmF3IGZpbGU/XG4iLCAodW5zaWduZWQgaW50KW5ld19idWZfc3opOwotCi0gICAgICAgIGlmIChuZXdfYnVmX3N6ID4gKmJ1Zl9hbGxvY19zeikKLSAgICAgICAgewotICAgICAgICAgICAgdWludDhfdCAqbmV3X2J1ZiA9IHJlYWxsb2MoKmJ1ZiwgMiAqIG5ld19idWZfc3opOwotCi0gICAgICAgICAgICBpZiAobmV3X2J1ZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqYnVmID0gbmV3X2J1ZjsKLSAgICAgICAgICAgICAgICAqYnVmX2FsbG9jX3N6ID0gMiAqIG5ld19idWZfc3o7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgY29tcHJlc3NlZCBkYXRhIGJ1ZmZlclxuIik7Ci0gICAgICAgICAgICAgICAgbmV3X2J1Zl9zeiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqYnVmX3N6ID0gbmV3X2J1Zl9zejsKLQotICAgIGlmICgqYnVmX3N6KQotICAgIHsKLSAgICAgICAgaWYgKGZyZWFkKCpidWYsIDEsICpidWZfc3osIGluZmlsZSkgIT0gKmJ1Zl9zeikKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBmdWxsIGZyYW1lXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgKm91dF9vcGVuKGNvbnN0IGNoYXIgKm91dF9mbiwgaW50IGRvX21kNSkKLXsKLSAgICB2b2lkICpvdXQgPSBOVUxMOwotCi0gICAgaWYgKGRvX21kNSkKLSAgICB7Ci0jaWYgQ09ORklHX01ENQotICAgICAgICBNRDVDb250ZXh0ICptZDVfY3R4ID0gb3V0ID0gbWFsbG9jKHNpemVvZihNRDVDb250ZXh0KSk7Ci0gICAgICAgICh2b2lkKW91dF9mbjsKLSAgICAgICAgTUQ1SW5pdChtZDVfY3R4KTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBGSUxFICpvdXRmaWxlID0gb3V0ID0gc3RyY21wKCItIiwgb3V0X2ZuKSA/IGZvcGVuKG91dF9mbiwgIndiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXRfYmluYXJ5X21vZGUoc3Rkb3V0KTsKLQotICAgICAgICBpZiAoIW91dGZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG91dHB1dCBmaWxlIik7Ci0gICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0OwotfQotCi12b2lkIG91dF9wdXQodm9pZCAqb3V0LCBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBsZW4sIGludCBkb19tZDUpCi17Ci0gICAgaWYgKGRvX21kNSkKLSAgICB7Ci0jaWYgQ09ORklHX01ENQotICAgICAgICBNRDVVcGRhdGUob3V0LCBidWYsIGxlbik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoZndyaXRlKGJ1ZiwgMSwgbGVuLCBvdXQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgb3V0X2Nsb3NlKHZvaWQgKm91dCwgY29uc3QgY2hhciAqb3V0X2ZuLCBpbnQgZG9fbWQ1KQotewotICAgIGlmIChkb19tZDUpCi0gICAgewotI2lmIENPTkZJR19NRDUKLSAgICAgICAgdWludDhfdCBtZDVbMTZdOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBNRDVGaW5hbChtZDUsIG91dCk7Ci0gICAgICAgIGZyZWUob3V0KTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHByaW50ZigiJTAyeCIsIG1kNVtpXSk7Ci0KLSAgICAgICAgcHJpbnRmKCIgICVzXG4iLCBvdXRfZm4pOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZjbG9zZShvdXQpOwotICAgIH0KLX0KLQotdW5zaWduZWQgaW50IGZpbGVfaXNfaXZmKEZJTEUgKmluZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmZvdXJjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZnBzX2RlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmZwc19udW0pCi17Ci0gICAgY2hhciByYXdfaGRyWzMyXTsKLSAgICBpbnQgaXNfaXZmID0gMDsKLQotICAgIGlmIChmcmVhZChyYXdfaGRyLCAxLCAzMiwgaW5maWxlKSA9PSAzMikKLSAgICB7Ci0gICAgICAgIGlmIChyYXdfaGRyWzBdID09ICdEJyAmJiByYXdfaGRyWzFdID09ICdLJwotICAgICAgICAgICAgJiYgcmF3X2hkclsyXSA9PSAnSScgJiYgcmF3X2hkclszXSA9PSAnRicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzX2l2ZiA9IDE7Ci0KLSAgICAgICAgICAgIGlmIChtZW1fZ2V0X2xlMTYocmF3X2hkciArIDQpICE9IDApCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5yZWNvZ25pemVkIElWRiB2ZXJzaW9uISBUaGlzIGZpbGUgbWF5IG5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZGVjb2RlIHByb3Blcmx5LiIpOwotCi0gICAgICAgICAgICAqZm91cmNjID0gbWVtX2dldF9sZTMyKHJhd19oZHIgKyA4KTsKLSAgICAgICAgICAgICp3aWR0aCA9IG1lbV9nZXRfbGUxNihyYXdfaGRyICsgMTIpOwotICAgICAgICAgICAgKmhlaWdodCA9IG1lbV9nZXRfbGUxNihyYXdfaGRyICsgMTQpOwotICAgICAgICAgICAgKmZwc19udW0gPSBtZW1fZ2V0X2xlMzIocmF3X2hkciArIDE2KTsKLSAgICAgICAgICAgICpmcHNfZGVuID0gbWVtX2dldF9sZTMyKHJhd19oZHIgKyAyMCk7Ci0KLSAgICAgICAgICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgdnB4ZW5jIHVzZWQgMS8oMipmcHMpIGZvciB0aGUgdGltZWJhc2UsIHNvCi0gICAgICAgICAgICAgKiB3ZSBjYW4gZ3Vlc3MgdGhlIGZyYW1lcmF0ZSB1c2luZyBvbmx5IHRoZSB0aW1lYmFzZSBpbiB0aGlzCi0gICAgICAgICAgICAgKiBjYXNlLiBPdGhlciBmaWxlcyB3b3VsZCByZXF1aXJlIHJlYWRpbmcgYWhlYWQgdG8gZ3Vlc3MgdGhlCi0gICAgICAgICAgICAgKiB0aW1lYmFzZSwgbGlrZSB3ZSBkbyBmb3Igd2VibS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoKmZwc19udW0gPCAxMDAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENvcnJlY3QgZm9yIHRoZSBmYWN0b3Igb2YgMiBhcHBsaWVkIHRvIHRoZSB0aW1lYmFzZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgKiBlbmNvZGVyLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmKCpmcHNfbnVtJjEpKmZwc19kZW48PD0xOwotICAgICAgICAgICAgICAgIGVsc2UgKmZwc19udW0+Pj0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERvbid0IGtub3cgRlBTIGZvciBzdXJlLCBhbmQgZG9uJ3QgaGF2ZSByZWFkYWhlYWQgY29kZQotICAgICAgICAgICAgICAgICAqICh5ZXQ/KSwgc28ganVzdCBkZWZhdWx0IHRvIDMwZnBzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICpmcHNfbnVtID0gMzA7Ci0gICAgICAgICAgICAgICAgKmZwc19kZW4gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFpc19pdmYpCi0gICAgICAgIHJld2luZChpbmZpbGUpOwotCi0gICAgcmV0dXJuIGlzX2l2ZjsKLX0KLQotCi11bnNpZ25lZCBpbnQgZmlsZV9pc19yYXcoRklMRSAqaW5maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZm91cmNjLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpmcHNfZGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZnBzX251bSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZlszMl07Ci0gICAgaW50IGlzX3JhdyA9IDA7Ci0gICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3Qgc2k7Ci0KLSAgICBzaS5zeiA9IHNpemVvZihzaSk7Ci0KLSAgICBpZiAoZnJlYWQoYnVmLCAxLCAzMiwgaW5maWxlKSA9PSAzMikKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGlmKG1lbV9nZXRfbGUzMihidWYpIDwgMjU2ICogMTAyNCAqIDEwMjQpCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGlmYWNlcykgLyBzaXplb2YoaWZhY2VzWzBdKTsgaSsrKQotICAgICAgICAgICAgICAgIGlmKCF2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyhpZmFjZXNbaV0uaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIDQsIDMyIC0gNCwgJnNpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzX3JhdyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICpmb3VyY2MgPSBpZmFjZXNbaV0uZm91cmNjOwotICAgICAgICAgICAgICAgICAgICAqd2lkdGggPSBzaS53OwotICAgICAgICAgICAgICAgICAgICAqaGVpZ2h0ID0gc2kuaDsKLSAgICAgICAgICAgICAgICAgICAgKmZwc19udW0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgKmZwc19kZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV3aW5kKGluZmlsZSk7Ci0gICAgcmV0dXJuIGlzX3JhdzsKLX0KLQotCi1zdGF0aWMgaW50Ci1uZXN0ZWdnX3JlYWRfY2Iodm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCB2b2lkICp1c2VyZGF0YSkKLXsKLSAgICBGSUxFICpmID0gdXNlcmRhdGE7Ci0KLSAgICBpZihmcmVhZChidWZmZXIsIDEsIGxlbmd0aCwgZikgPCBsZW5ndGgpCi0gICAgewotICAgICAgICBpZiAoZmVycm9yKGYpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoZmVvZihmKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1uZXN0ZWdnX3NlZWtfY2IoaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UsIHZvaWQgKiB1c2VyZGF0YSkKLXsKLSAgICBzd2l0Y2god2hlbmNlKSB7Ci0gICAgICAgIGNhc2UgTkVTVEVHR19TRUVLX1NFVDogd2hlbmNlID0gU0VFS19TRVQ7IGJyZWFrOwotICAgICAgICBjYXNlIE5FU1RFR0dfU0VFS19DVVI6IHdoZW5jZSA9IFNFRUtfQ1VSOyBicmVhazsKLSAgICAgICAgY2FzZSBORVNURUdHX1NFRUtfRU5EOiB3aGVuY2UgPSBTRUVLX0VORDsgYnJlYWs7Ci0gICAgfTsKLSAgICByZXR1cm4gZnNlZWsodXNlcmRhdGEsIG9mZnNldCwgd2hlbmNlKT8gLTEgOiAwOwotfQotCi0KLXN0YXRpYyBpbnQ2NF90Ci1uZXN0ZWdnX3RlbGxfY2Iodm9pZCAqIHVzZXJkYXRhKQotewotICAgIHJldHVybiBmdGVsbCh1c2VyZGF0YSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5lc3RlZ2dfbG9nX2NiKG5lc3RlZ2cgKiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgc2V2ZXJpdHksIGNoYXIgY29uc3QgKiBmb3JtYXQsCi0gICAgICAgICAgICAgICAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLQotICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwotICAgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLQotc3RhdGljIGludAotd2VibV9ndWVzc19mcmFtZXJhdGUoc3RydWN0IGlucHV0X2N0eCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICpmcHNfZGVuLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAqZnBzX251bSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1aW50NjRfdCAgICAgdHN0YW1wPTA7Ci0KLSAgICAvKiBHdWVzcyB0aGUgZnJhbWVyYXRlLiBSZWFkIHVwIHRvIDEgc2Vjb25kLCBvciA1MCB2aWRlbyBwYWNrZXRzLAotICAgICAqIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KLSAgICAgKi8KLSAgICBmb3IoaT0wOyB0c3RhbXAgPCAxMDAwMDAwMDAwICYmIGkgPCA1MDspCi0gICAgewotICAgICAgICBuZXN0ZWdnX3BhY2tldCAqIHBrdDsKLSAgICAgICAgdW5zaWduZWQgaW50IHRyYWNrOwotCi0gICAgICAgIGlmKG5lc3RlZ2dfcmVhZF9wYWNrZXQoaW5wdXQtPm5lc3RlZ2dfY3R4LCAmcGt0KSA8PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgbmVzdGVnZ19wYWNrZXRfdHJhY2socGt0LCAmdHJhY2spOwotICAgICAgICBpZih0cmFjayA9PSBpbnB1dC0+dmlkZW9fdHJhY2spCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5lc3RlZ2dfcGFja2V0X3RzdGFtcChwa3QsICZ0c3RhbXApOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgbmVzdGVnZ19mcmVlX3BhY2tldChwa3QpOwotICAgIH0KLQotICAgIGlmKG5lc3RlZ2dfdHJhY2tfc2VlayhpbnB1dC0+bmVzdGVnZ19jdHgsIGlucHV0LT52aWRlb190cmFjaywgMCkpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgICpmcHNfbnVtID0gKGkgLSAxKSAqIDEwMDAwMDA7Ci0gICAgKmZwc19kZW4gPSB0c3RhbXAgLyAxMDAwOwotICAgIHJldHVybiAwOwotZmFpbDoKLSAgICBuZXN0ZWdnX2Rlc3Ryb3koaW5wdXQtPm5lc3RlZ2dfY3R4KTsKLSAgICBpbnB1dC0+bmVzdGVnZ19jdHggPSBOVUxMOwotICAgIHJld2luZChpbnB1dC0+aW5maWxlKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1maWxlX2lzX3dlYm0oc3RydWN0IGlucHV0X2N0eCAqaW5wdXQsCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAqZm91cmNjLAotICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKndpZHRoLAotICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmhlaWdodCwKLSAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICpmcHNfZGVuLAotICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmZwc19udW0pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIG47Ci0gICAgaW50ICAgICAgICAgIHRyYWNrX3R5cGUgPSAtMTsKLSAgICB1aW50NjRfdCAgICAgdHN0YW1wPTA7Ci0KLSAgICBuZXN0ZWdnX2lvIGlvID0ge25lc3RlZ2dfcmVhZF9jYiwgbmVzdGVnZ19zZWVrX2NiLCBuZXN0ZWdnX3RlbGxfY2IsCi0gICAgICAgICAgICAgICAgICAgICBpbnB1dC0+aW5maWxlfTsKLSAgICBuZXN0ZWdnX3ZpZGVvX3BhcmFtcyBwYXJhbXM7Ci0gICAgbmVzdGVnZ19wYWNrZXQgKiBwa3Q7Ci0KLSAgICBpZihuZXN0ZWdnX2luaXQoJmlucHV0LT5uZXN0ZWdnX2N0eCwgaW8sIE5VTEwpKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBpZihuZXN0ZWdnX3RyYWNrX2NvdW50KGlucHV0LT5uZXN0ZWdnX2N0eCwgJm4pKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBmb3IoaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICAgIHRyYWNrX3R5cGUgPSBuZXN0ZWdnX3RyYWNrX3R5cGUoaW5wdXQtPm5lc3RlZ2dfY3R4LCBpKTsKLQotICAgICAgICBpZih0cmFja190eXBlID09IE5FU1RFR0dfVFJBQ0tfVklERU8pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZWxzZSBpZih0cmFja190eXBlIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZihuZXN0ZWdnX3RyYWNrX2NvZGVjX2lkKGlucHV0LT5uZXN0ZWdnX2N0eCwgaSkgIT0gTkVTVEVHR19DT0RFQ19WUDgpCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBWUDggdmlkZW8sIHF1aXR0aW5nLlxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaW5wdXQtPnZpZGVvX3RyYWNrID0gaTsKLQotICAgIGlmKG5lc3RlZ2dfdHJhY2tfdmlkZW9fcGFyYW1zKGlucHV0LT5uZXN0ZWdnX2N0eCwgaSwgJnBhcmFtcykpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgICpmcHNfZGVuID0gMDsKLSAgICAqZnBzX251bSA9IDA7Ci0gICAgKmZvdXJjYyA9IFZQOF9GT1VSQ0M7Ci0gICAgKndpZHRoID0gcGFyYW1zLndpZHRoOwotICAgICpoZWlnaHQgPSBwYXJhbXMuaGVpZ2h0OwotICAgIHJldHVybiAxOwotZmFpbDoKLSAgICBpbnB1dC0+bmVzdGVnZ19jdHggPSBOVUxMOwotICAgIHJld2luZChpbnB1dC0+aW5maWxlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi12b2lkIHNob3dfcHJvZ3Jlc3MoaW50IGZyYW1lX2luLCBpbnQgZnJhbWVfb3V0LCB1bnNpZ25lZCBsb25nIGR4X3RpbWUpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIlZCBkZWNvZGVkIGZyYW1lcy8lZCBzaG93ZWQgZnJhbWVzIGluICVsdSB1cyAoJS4yZiBmcHMpXHIiLAotICAgICAgICAgICAgZnJhbWVfaW4sIGZyYW1lX291dCwgZHhfdGltZSwKLSAgICAgICAgICAgIChmbG9hdClmcmFtZV9vdXQgKiAxMDAwMDAwLjAgLyAoZmxvYXQpZHhfdGltZSk7Ci19Ci0KLQotdm9pZCBnZW5lcmF0ZV9maWxlbmFtZShjb25zdCBjaGFyICpwYXR0ZXJuLCBjaGFyICpvdXQsIHNpemVfdCBxX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRfdywgdW5zaWduZWQgaW50IGRfaCwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZyYW1lX2luKQotewotICAgIGNvbnN0IGNoYXIgKnAgPSBwYXR0ZXJuOwotICAgIGNoYXIgKnEgPSBvdXQ7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgY2hhciAqbmV4dF9wYXQgPSBzdHJjaHIocCwgJyUnKTsKLQotICAgICAgICBpZihwID09IG5leHRfcGF0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgcGF0X2xlbjsKLQotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHBhdHRlcm4KLSAgICAgICAgICAgIHFbcV9sZW4gLSAxXSA9ICdcMCc7Ci0gICAgICAgICAgICBzd2l0Y2gocFsxXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJ3cnOiBzbnByaW50ZihxLCBxX2xlbiAtIDEsICIlZCIsIGRfdyk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnaCc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiVkIiwgZF9oKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICcxJzogc25wcmludGYocSwgcV9sZW4gLSAxLCAiJWQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnMic6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwMmQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnMyc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwM2QiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnNCc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwNGQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnNSc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwNWQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnNic6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwNmQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnNyc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwN2QiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnOCc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwOGQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnOSc6IHNucHJpbnRmKHEsIHFfbGVuIC0gMSwgIiUwOWQiLCBmcmFtZV9pbik7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBkaWUoIlVucmVjb2duaXplZCBwYXR0ZXJuICUlJWNcbiIsIHBbMV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXRfbGVuID0gc3RybGVuKHEpOwotICAgICAgICAgICAgaWYocGF0X2xlbiA+PSBxX2xlbiAtIDEpCi0gICAgICAgICAgICAgICAgZGllKCJPdXRwdXQgZmlsZW5hbWUgdG9vIGxvbmcuXG4iKTsKLSAgICAgICAgICAgIHEgKz0gcGF0X2xlbjsKLSAgICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgICAgIHFfbGVuIC09IHBhdF9sZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgY29weV9sZW47Ci0KLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIG5leHQgc2VnbWVudAotICAgICAgICAgICAgaWYoIW5leHRfcGF0KQotICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gc3RybGVuKHApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbmV4dF9wYXQgLSBwOwotCi0gICAgICAgICAgICBpZihjb3B5X2xlbiA+PSBxX2xlbiAtIDEpCi0gICAgICAgICAgICAgICAgZGllKCJPdXRwdXQgZmlsZW5hbWUgdG9vIGxvbmcuXG4iKTsKLQotICAgICAgICAgICAgbWVtY3B5KHEsIHAsIGNvcHlfbGVuKTsKLSAgICAgICAgICAgIHFbY29weV9sZW5dID0gJ1wwJzsKLSAgICAgICAgICAgIHEgKz0gY29weV9sZW47Ci0gICAgICAgICAgICBwICs9IGNvcHlfbGVuOwotICAgICAgICAgICAgcV9sZW4gLT0gY29weV9sZW47Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlKCpwKTsKLX0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3ZfKQotewotICAgIHZweF9jb2RlY19jdHhfdCAgICAgICAgICBkZWNvZGVyOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAqZm4gPSBOVUxMOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgKmJ1ZiA9IE5VTEw7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICBidWZfc3ogPSAwLCBidWZfYWxsb2Nfc3ogPSAwOwotICAgIEZJTEUgICAgICAgICAgICAgICAgICAqaW5maWxlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgZnJhbWVfaW4gPSAwLCBmcmFtZV9vdXQgPSAwLCBmbGlwdXYgPSAwLCBub2JsaXQgPSAwLCBkb19tZDUgPSAwLCBwcm9ncmVzcyA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBzdG9wX2FmdGVyID0gMCwgcG9zdHByb2MgPSAwLCBzdW1tYXJ5ID0gMCwgcXVpZXQgPSAxOwotICAgIHZweF9jb2RlY19pZmFjZV90ICAgICAgICppZmFjZSA9IE5VTEw7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICBmb3VyY2M7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgICBkeF90aW1lID0gMDsKLSAgICBzdHJ1Y3QgYXJnICAgICAgICAgICAgICAgYXJnOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgKiphcmd2LCAqKmFyZ2ksICoqYXJnajsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAgICpvdXRmaWxlX3BhdHRlcm4gPSAwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIG91dGZpbGVbUEFUSF9NQVhdOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV9maWxlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHVzZV95NG0gPSAxOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIHdpZHRoOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGhlaWdodDsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBmcHNfZGVuOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGZwc19udW07Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAqb3V0ID0gTlVMTDsKLSAgICB2cHhfY29kZWNfZGVjX2NmZ190ICAgICBjZmcgPSB7MH07Ci0jaWYgQ09ORklHX1ZQOF9ERUNPREVSCi0gICAgdnA4X3Bvc3Rwcm9jX2NmZ190ICAgICAgdnA4X3BwX2NmZyA9IHswfTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX3JlZl9mcmFtZSA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgdnA4X2RiZ19jb2xvcl9tYl9tb2RlcyA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgdnA4X2RiZ19jb2xvcl9iX21vZGVzID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2cDhfZGJnX2Rpc3BsYXlfbXYgPSAwOwotI2VuZGlmCi0gICAgc3RydWN0IGlucHV0X2N0eCAgICAgICAgaW5wdXQgPSB7MH07Ci0KLSAgICAvKiBQYXJzZSBjb21tYW5kIGxpbmUgKi8KLSAgICBleGVjX25hbWUgPSBhcmd2X1swXTsKLSAgICBhcmd2ID0gYXJndl9kdXAoYXJnYyAtIDEsIGFyZ3ZfICsgMSk7Ci0KLSAgICBmb3IgKGFyZ2kgPSBhcmdqID0gYXJndjsgKCphcmdqID0gKmFyZ2kpOyBhcmdpICs9IGFyZy5hcmd2X3N0ZXApCi0gICAgewotICAgICAgICBtZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOwotICAgICAgICBhcmcuYXJndl9zdGVwID0gMTsKLQotICAgICAgICBpZiAoYXJnX21hdGNoKCZhcmcsICZjb2RlY2FyZywgYXJnaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBqLCBrID0gLTE7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YoaWZhY2VzKSAvIHNpemVvZihpZmFjZXNbMF0pOyBqKyspCi0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoaWZhY2VzW2pdLm5hbWUsIGFyZy52YWwpKQotICAgICAgICAgICAgICAgICAgICBrID0gajsKLQotICAgICAgICAgICAgaWYgKGsgPj0gMCkKLSAgICAgICAgICAgICAgICBpZmFjZSA9IGlmYWNlc1trXS5pZmFjZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkaWUoIkVycm9yOiBVbnJlY29nbml6ZWQgYXJndW1lbnQgKCVzKSB0byAtLWNvZGVjXG4iLAotICAgICAgICAgICAgICAgICAgICBhcmcudmFsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm91dHB1dGZpbGUsIGFyZ2kpKQotICAgICAgICAgICAgb3V0ZmlsZV9wYXR0ZXJuID0gYXJnLnZhbDsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZ1c2VfeXYxMiwgYXJnaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzZV95NG0gPSAwOwotICAgICAgICAgICAgZmxpcHV2ID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnVzZV9pNDIwLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNlX3k0bSA9IDA7Ci0gICAgICAgICAgICBmbGlwdXYgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZmxpcHV2YXJnLCBhcmdpKSkKLSAgICAgICAgICAgIGZsaXB1diA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmbm9ibGl0YXJnLCBhcmdpKSkKLSAgICAgICAgICAgIG5vYmxpdCA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcHJvZ3Jlc3NhcmcsIGFyZ2kpKQotICAgICAgICAgICAgcHJvZ3Jlc3MgPSAxOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmxpbWl0YXJnLCBhcmdpKSkKLSAgICAgICAgICAgIHN0b3BfYWZ0ZXIgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwb3N0cHJvY2FyZywgYXJnaSkpCi0gICAgICAgICAgICBwb3N0cHJvYyA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmbWQ1YXJnLCBhcmdpKSkKLSAgICAgICAgICAgIGRvX21kNSA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmc3VtbWFyeWFyZywgYXJnaSkpCi0gICAgICAgICAgICBzdW1tYXJ5ID0gMTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZ0aHJlYWRzYXJnLCBhcmdpKSkKLSAgICAgICAgICAgIGNmZy50aHJlYWRzID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdmVyYm9zZWFyZywgYXJnaSkpCi0gICAgICAgICAgICBxdWlldCA9IDA7Ci0KLSNpZiBDT05GSUdfVlA4X0RFQ09ERVIKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZhZGRub2lzZV9sZXZlbCwgYXJnaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKLSAgICAgICAgICAgIHZwOF9wcF9jZmcucG9zdF9wcm9jX2ZsYWcgfD0gVlA4X0FERE5PSVNFOwotICAgICAgICAgICAgdnA4X3BwX2NmZy5ub2lzZV9sZXZlbCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZGVtYWNyb2Jsb2NrX2xldmVsLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcG9zdHByb2MgPSAxOwotICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyB8PSBWUDhfREVNQUNST0JMT0NLOwotICAgICAgICAgICAgdnA4X3BwX2NmZy5kZWJsb2NraW5nX2xldmVsID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZkZWJsb2NrLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcG9zdHByb2MgPSAxOwotICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyB8PSBWUDhfREVCTE9DSzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2RlYnVnX2luZm8sIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGV2ZWwgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLQotICAgICAgICAgICAgcG9zdHByb2MgPSAxOwotICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyAmPSB+MHg3OwotCi0gICAgICAgICAgICBpZiAobGV2ZWwpCi0gICAgICAgICAgICAgICAgdnA4X3BwX2NmZy5wb3N0X3Byb2NfZmxhZyB8PSBsZXZlbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2Rpc3BfcmVmX2ZyYW1lLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gYXJnX3BhcnNlX2ludCgmYXJnKTsKLSAgICAgICAgICAgIGlmIChmbGFncykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3N0cHJvYyA9IDE7Ci0gICAgICAgICAgICAgICAgdnA4X2RiZ19jb2xvcl9yZWZfZnJhbWUgPSBmbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2Rpc3BfbWJfbW9kZXMsIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhcmdfcGFyc2VfaW50KCZhcmcpOwotICAgICAgICAgICAgaWYgKGZsYWdzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKLSAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX21iX21vZGVzID0gZmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwcF9kaXNwX2JfbW9kZXMsIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhcmdfcGFyc2VfaW50KCZhcmcpOwotICAgICAgICAgICAgaWYgKGZsYWdzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc3Rwcm9jID0gMTsKLSAgICAgICAgICAgICAgICB2cDhfZGJnX2NvbG9yX2JfbW9kZXMgPSBmbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnBwX2Rpc3BfbXZzLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gYXJnX3BhcnNlX2ludCgmYXJnKTsKLSAgICAgICAgICAgIGlmIChmbGFncykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3N0cHJvYyA9IDE7Ci0gICAgICAgICAgICAgICAgdnA4X2RiZ19kaXNwbGF5X212ID0gZmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2VuZGlmCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFyZ2orKzsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMgKi8KLSAgICBmb3IgKGFyZ2kgPSBhcmd2OyAqYXJnaTsgYXJnaSsrKQotICAgICAgICBpZiAoYXJnaVswXVswXSA9PSAnLScgJiYgc3RybGVuKGFyZ2lbMF0pID4gMSkKLSAgICAgICAgICAgIGRpZSgiRXJyb3I6IFVucmVjb2duaXplZCBvcHRpb24gJXNcbiIsICphcmdpKTsKLQotICAgIC8qIEhhbmRsZSBub24tb3B0aW9uIGFyZ3VtZW50cyAqLwotICAgIGZuID0gYXJndlswXTsKLQotICAgIGlmICghZm4pCi0gICAgICAgIHVzYWdlX2V4aXQoKTsKLQotICAgIC8qIE9wZW4gZmlsZSAqLwotICAgIGluZmlsZSA9IHN0cmNtcChmbiwgIi0iKSA/IGZvcGVuKGZuLCAicmIiKSA6IHNldF9iaW5hcnlfbW9kZShzdGRpbik7Ci0KLSAgICBpZiAoIWluZmlsZSkKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnIiwKLSAgICAgICAgICAgICAgICBzdHJjbXAoZm4sICItIikgPyBmbiA6ICJzdGRpbiIpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLSNpZiBDT05GSUdfT1NfU1VQUE9SVAotICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBkdW1wIHRvIHRoZSB0ZXJtaW5hbCwgdW5sZXNzIGZvcmNlZCB0byB3aXRoIC1vIC0gKi8KLSAgICBpZighb3V0ZmlsZV9wYXR0ZXJuICYmIGlzYXR0eShmaWxlbm8oc3Rkb3V0KSkgJiYgIWRvX21kNSAmJiAhbm9ibGl0KQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgIk5vdCBkdW1waW5nIHJhdyB2aWRlbyB0byB5b3VyIHRlcm1pbmFsLiBVc2UgJy1vIC0nIHRvICIKLSAgICAgICAgICAgICAgICAib3ZlcnJpZGUuXG4iKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpbnB1dC5pbmZpbGUgPSBpbmZpbGU7Ci0gICAgaWYoZmlsZV9pc19pdmYoaW5maWxlLCAmZm91cmNjLCAmd2lkdGgsICZoZWlnaHQsICZmcHNfZGVuLAotICAgICAgICAgICAgICAgICAgICZmcHNfbnVtKSkKLSAgICAgICAgaW5wdXQua2luZCA9IElWRl9GSUxFOwotICAgIGVsc2UgaWYoZmlsZV9pc193ZWJtKCZpbnB1dCwgJmZvdXJjYywgJndpZHRoLCAmaGVpZ2h0LCAmZnBzX2RlbiwgJmZwc19udW0pKQotICAgICAgICBpbnB1dC5raW5kID0gV0VCTV9GSUxFOwotICAgIGVsc2UgaWYoZmlsZV9pc19yYXcoaW5maWxlLCAmZm91cmNjLCAmd2lkdGgsICZoZWlnaHQsICZmcHNfZGVuLCAmZnBzX251bSkpCi0gICAgICAgIGlucHV0LmtpbmQgPSBSQVdfRklMRTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBpbnB1dCBmaWxlIHR5cGUuXG4iKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IHNldCBvciBkb2Vzbid0IGhhdmUgYSBzZXF1ZW5jZSBudW1iZXIgaW4KLSAgICAgKiBpdCwgdGhlbiB3ZSBvbmx5IG9wZW4gaXQgb25jZS4KLSAgICAgKi8KLSAgICBvdXRmaWxlX3BhdHRlcm4gPSBvdXRmaWxlX3BhdHRlcm4gPyBvdXRmaWxlX3BhdHRlcm4gOiAiLSI7Ci0gICAgc2luZ2xlX2ZpbGUgPSAxOwotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqcCA9IG91dGZpbGVfcGF0dGVybjsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgcCA9IHN0cmNocihwLCAnJScpOwotICAgICAgICAgICAgaWYocCAmJiBwWzFdID49ICcxJyAmJiBwWzFdIDw9ICc5JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIGNvbnRhaW5zIHNlcXVlbmNlIG51bWJlciwgc28gaXQncyBub3QgdW5pcXVlLgotICAgICAgICAgICAgICAgIHNpbmdsZV9maWxlID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHApCi0gICAgICAgICAgICAgICAgcCsrOwotICAgICAgICB9IHdoaWxlKHApOwotICAgIH0KLQotICAgIGlmKHNpbmdsZV9maWxlICYmICFub2JsaXQpCi0gICAgewotICAgICAgICBnZW5lcmF0ZV9maWxlbmFtZShvdXRmaWxlX3BhdHRlcm4sIG91dGZpbGUsIHNpemVvZihvdXRmaWxlKS0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAwKTsKLSAgICAgICAgb3V0ID0gb3V0X29wZW4ob3V0ZmlsZSwgZG9fbWQ1KTsKLSAgICB9Ci0KLSAgICBpZiAodXNlX3k0bSAmJiAhbm9ibGl0KQotICAgIHsKLSAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKLSAgICAgICAgaWYgKCFzaW5nbGVfZmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJZVVY0TVBFRzIgbm90IHN1cHBvcnRlZCB3aXRoIG91dHB1dCBwYXR0ZXJucywiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0cnkgLS1pNDIwIG9yIC0teXYxMi5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGlucHV0LmtpbmQgPT0gV0VCTV9GSUxFKQotICAgICAgICAgICAgaWYod2VibV9ndWVzc19mcmFtZXJhdGUoJmlucHV0LCAmZnBzX2RlbiwgJmZwc19udW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGd1ZXNzIGZyYW1lcmF0ZSAtLSBlcnJvciBwYXJzaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYm0gZmlsZT9cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAvKk5vdGU6IFdlIGNhbid0IG91dHB1dCBhbiBhc3BlY3QgcmF0aW8gaGVyZSBiZWNhdXNlIElWRiBkb2Vzbid0Ci0gICAgICAgICAgIHN0b3JlIG9uZSwgYW5kIG5laXRoZXIgZG9lcyBWUDguCi0gICAgICAgICAgVGhhdCB3aWxsIGhhdmUgdG8gd2FpdCB1bnRpbCB0aGVzZSB0b29scyBzdXBwb3J0IFdlYk0gbmF0aXZlbHkuKi8KLSAgICAgICAgc3ByaW50ZihidWZmZXIsICJZVVY0TVBFRzIgQyVzIFcldSBIJXUgRiV1OiV1IEklY1xuIiwKLSAgICAgICAgICAgICAgICAiNDIwanBlZyIsIHdpZHRoLCBoZWlnaHQsIGZwc19udW0sIGZwc19kZW4sICdwJyk7Ci0gICAgICAgIG91dF9wdXQob3V0LCAodW5zaWduZWQgY2hhciAqKWJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIGRvX21kNSk7Ci0gICAgfQotCi0gICAgLyogVHJ5IHRvIGRldGVybWluZSB0aGUgY29kZWMgZnJvbSB0aGUgZm91cmNjLiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoaWZhY2VzKSAvIHNpemVvZihpZmFjZXNbMF0pOyBpKyspCi0gICAgICAgIGlmICgoZm91cmNjICYgaWZhY2VzW2ldLmZvdXJjY19tYXNrKSA9PSBpZmFjZXNbaV0uZm91cmNjKQotICAgICAgICB7Ci0gICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfdCAgKml2Zl9pZmFjZSA9IGlmYWNlc1tpXS5pZmFjZTsKLQotICAgICAgICAgICAgaWYgKGlmYWNlICYmIGlmYWNlICE9IGl2Zl9pZmFjZSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdGljZSAtLSBJVkYgaGVhZGVyIGluZGljYXRlcyBjb2RlYzogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZmFjZXNbaV0ubmFtZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWZhY2UgPSBpdmZfaWZhY2U7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBpZiAodnB4X2NvZGVjX2RlY19pbml0KCZkZWNvZGVyLCBpZmFjZSA/IGlmYWNlIDogIGlmYWNlc1swXS5pZmFjZSwgJmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jID8gVlBYX0NPREVDX1VTRV9QT1NUUFJPQyA6IDApKQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyOiAlc1xuIiwgdnB4X2NvZGVjX2Vycm9yKCZkZWNvZGVyKSk7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgaWYgKCFxdWlldCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZGVjb2Rlci5uYW1lKTsKLQotI2lmIENPTkZJR19WUDhfREVDT0RFUgotCi0gICAgaWYgKHZwOF9wcF9jZmcucG9zdF9wcm9jX2ZsYWcKLSAgICAgICAgJiYgdnB4X2NvZGVjX2NvbnRyb2woJmRlY29kZXIsIFZQOF9TRVRfUE9TVFBST0MsICZ2cDhfcHBfY2ZnKSkKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwb3N0cHJvYzogJXNcbiIsIHZweF9jb2RlY19lcnJvcigmZGVjb2RlcikpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIGlmICh2cDhfZGJnX2NvbG9yX3JlZl9mcmFtZQotICAgICAgICAmJiB2cHhfY29kZWNfY29udHJvbCgmZGVjb2RlciwgVlA4X1NFVF9EQkdfQ09MT1JfUkVGX0ZSQU1FLCB2cDhfZGJnX2NvbG9yX3JlZl9mcmFtZSkpCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25maWd1cmUgcmVmZXJlbmNlIGJsb2NrIHZpc3VhbGl6ZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAodnA4X2RiZ19jb2xvcl9tYl9tb2RlcwotICAgICAgICAmJiB2cHhfY29kZWNfY29udHJvbCgmZGVjb2RlciwgVlA4X1NFVF9EQkdfQ09MT1JfTUJfTU9ERVMsIHZwOF9kYmdfY29sb3JfbWJfbW9kZXMpKQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29uZmlndXJlIG1hY3JvIGJsb2NrIHZpc3VhbGl6ZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAodnA4X2RiZ19jb2xvcl9iX21vZGVzCi0gICAgICAgICYmIHZweF9jb2RlY19jb250cm9sKCZkZWNvZGVyLCBWUDhfU0VUX0RCR19DT0xPUl9CX01PREVTLCB2cDhfZGJnX2NvbG9yX2JfbW9kZXMpKQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29uZmlndXJlIGJsb2NrIHZpc3VhbGl6ZXI6ICVzXG4iLCB2cHhfY29kZWNfZXJyb3IoJmRlY29kZXIpKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAodnA4X2RiZ19kaXNwbGF5X212Ci0gICAgICAgICYmIHZweF9jb2RlY19jb250cm9sKCZkZWNvZGVyLCBWUDhfU0VUX0RCR19ESVNQTEFZX01WLCB2cDhfZGJnX2Rpc3BsYXlfbXYpKQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29uZmlndXJlIG1vdGlvbiB2ZWN0b3IgdmlzdWFsaXplcjogJXNcbiIsIHZweF9jb2RlY19lcnJvcigmZGVjb2RlcikpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogRGVjb2RlIGZpbGUgKi8KLSAgICB3aGlsZSAoIXJlYWRfZnJhbWUoJmlucHV0LCAmYnVmLCAmYnVmX3N6LCAmYnVmX2FsbG9jX3N6KSkKLSAgICB7Ci0gICAgICAgIHZweF9jb2RlY19pdGVyX3QgIGl0ZXIgPSBOVUxMOwotICAgICAgICB2cHhfaW1hZ2VfdCAgICAqaW1nOwotICAgICAgICBzdHJ1Y3QgdnB4X3VzZWNfdGltZXIgdGltZXI7Ci0KLSAgICAgICAgdnB4X3VzZWNfdGltZXJfc3RhcnQoJnRpbWVyKTsKLQotICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgmZGVjb2RlciwgYnVmLCBidWZfc3osIE5VTEwsIDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwgPSB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKCZkZWNvZGVyKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGRlY29kZSBmcmFtZTogJXNcbiIsIHZweF9jb2RlY19lcnJvcigmZGVjb2RlcikpOwotCi0gICAgICAgICAgICBpZiAoZGV0YWlsKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uOiAlc1xuIiwgZGV0YWlsKTsKLQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdGltZXIpOwotICAgICAgICBkeF90aW1lICs9IHZweF91c2VjX3RpbWVyX2VsYXBzZWQoJnRpbWVyKTsKLQotICAgICAgICArK2ZyYW1lX2luOwotCi0gICAgICAgIGlmICgoaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgmZGVjb2RlciwgJml0ZXIpKSkKLSAgICAgICAgICAgICsrZnJhbWVfb3V0OwotCi0gICAgICAgIGlmIChwcm9ncmVzcykKLSAgICAgICAgICAgIHNob3dfcHJvZ3Jlc3MoZnJhbWVfaW4sIGZyYW1lX291dCwgZHhfdGltZSk7Ci0KLSAgICAgICAgaWYgKCFub2JsaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHk7Ci0gICAgICAgICAgICAgICAgY2hhciBvdXRfZm5bUEFUSF9NQVhdOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKLQotICAgICAgICAgICAgICAgIGlmICghc2luZ2xlX2ZpbGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gc2l6ZW9mKG91dF9mbiktMTsKLQotICAgICAgICAgICAgICAgICAgICBvdXRfZm5bbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2ZpbGVuYW1lKG91dGZpbGVfcGF0dGVybiwgb3V0X2ZuLCBsZW4tMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5kX3csIGltZy0+ZF9oLCBmcmFtZV9pbik7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG91dF9vcGVuKG91dF9mbiwgZG9fbWQ1KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZih1c2VfeTRtKQotICAgICAgICAgICAgICAgICAgICBvdXRfcHV0KG91dCwgKHVuc2lnbmVkIGNoYXIgKikiRlJBTUVcbiIsIDYsIGRvX21kNSk7Ci0KLSAgICAgICAgICAgICAgICBidWYgPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaW1nLT5kX2g7IHkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dF9wdXQob3V0LCBidWYsIGltZy0+ZF93LCBkb19tZDUpOwotICAgICAgICAgICAgICAgICAgICBidWYgKz0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJ1ZiA9IGltZy0+cGxhbmVzW2ZsaXB1dj9WUFhfUExBTkVfVjpWUFhfUExBTkVfVV07Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgKDEgKyBpbWctPmRfaCkgLyAyOyB5KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXRfcHV0KG91dCwgYnVmLCAoMSArIGltZy0+ZF93KSAvIDIsIGRvX21kNSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnVmID0gaW1nLT5wbGFuZXNbZmxpcHV2P1ZQWF9QTEFORV9VOlZQWF9QTEFORV9WXTsKLQotICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAoMSArIGltZy0+ZF9oKSAvIDI7IHkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dF9wdXQob3V0LCBidWYsICgxICsgaW1nLT5kX3cpIC8gMiwgZG9fbWQ1KTsKLSAgICAgICAgICAgICAgICAgICAgYnVmICs9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZV9maWxlKQotICAgICAgICAgICAgICAgICAgICBvdXRfY2xvc2Uob3V0LCBvdXRfZm4sIGRvX21kNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RvcF9hZnRlciAmJiBmcmFtZV9pbiA+PSBzdG9wX2FmdGVyKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHN1bW1hcnkgfHwgcHJvZ3Jlc3MpCi0gICAgewotICAgICAgICBzaG93X3Byb2dyZXNzKGZyYW1lX2luLCBmcmFtZV9vdXQsIGR4X3RpbWUpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotCi1mYWlsOgotCi0gICAgaWYgKHZweF9jb2RlY19kZXN0cm95KCZkZWNvZGVyKSkKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGRlc3Ryb3kgZGVjb2RlcjogJXNcbiIsIHZweF9jb2RlY19lcnJvcigmZGVjb2RlcikpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIGlmIChzaW5nbGVfZmlsZSAmJiAhbm9ibGl0KQotICAgICAgICBvdXRfY2xvc2Uob3V0LCBvdXRmaWxlLCBkb19tZDUpOwotCi0gICAgaWYoaW5wdXQubmVzdGVnZ19jdHgpCi0gICAgICAgIG5lc3RlZ2dfZGVzdHJveShpbnB1dC5uZXN0ZWdnX2N0eCk7Ci0gICAgaWYoaW5wdXQua2luZCAhPSBXRUJNX0ZJTEUpCi0gICAgICAgIGZyZWUoYnVmKTsKLSAgICBmY2xvc2UoaW5maWxlKTsKLSAgICBmcmVlKGFyZ3YpOwotCi0gICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3ZweGVuYy5jIGIvdnB4ZW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5MjU2YjYuLjAwMDAwMDAKLS0tIGEvdnB4ZW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotCi0vKiBUaGlzIGlzIGEgc2ltcGxlIHByb2dyYW0gdGhhdCBlbmNvZGVzIFlWMTIgZmlsZXMgYW5kIGdlbmVyYXRlcyBpdmYKLSAqIGZpbGVzIHVzaW5nIHRoZSBuZXcgaW50ZXJmYWNlLgotICovCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8ICFDT05GSUdfT1NfU1VQUE9SVAotI2RlZmluZSBVU0VfUE9TSVhfTU1BUCAwCi0jZWxzZQotI2RlZmluZSBVU0VfUE9TSVhfTU1BUCAxCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCi0jaWYgVVNFX1BPU0lYX01NQVAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgInZweF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAidnB4L3ZwOGN4LmgiCi0jaW5jbHVkZSAidnB4X3BvcnRzL21lbV9vcHMuaCIKLSNpbmNsdWRlICJ2cHhfcG9ydHMvdnB4X3RpbWVyLmgiCi0jaW5jbHVkZSAidG9vbHNfY29tbW9uLmgiCi0jaW5jbHVkZSAieTRtaW5wdXQuaCIKLSNpbmNsdWRlICJsaWJta3YvRWJtbFdyaXRlci5oIgotI2luY2x1ZGUgImxpYm1rdi9FYm1sSURzLmgiCi0KLS8qIE5lZWQgc3BlY2lhbCBoYW5kbGluZyBvZiB0aGVzZSBmdW5jdGlvbnMgb24gV2luZG93cyAqLwotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0vKiBNU1ZTIGRvZXNuJ3QgZGVmaW5lIG9mZl90LCBhbmQgdXNlcyBfZntzZWVrLHRlbGx9aTY0ICovCi10eXBlZGVmIF9faW50NjQgb2ZmX3Q7Ci0jZGVmaW5lIGZzZWVrbyBfZnNlZWtpNjQKLSNkZWZpbmUgZnRlbGxvIF9mdGVsbGk2NAotI2VsaWYgZGVmaW5lZChfV0lOMzIpCi0vKiBNaW5HVyBkZWZpbmVzIG9mZl90LCBhbmQgdXNlcyBme3NlZWssdGVsbH1vNjQgKi8KLSNkZWZpbmUgZnNlZWtvIGZzZWVrbzY0Ci0jZGVmaW5lIGZ0ZWxsbyBmdGVsbG82NAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2RlZmluZSBMSVRFUkFMVTY0KG4pIG4KLSNlbHNlCi0jZGVmaW5lIExJVEVSQUxVNjQobikgbiMjTExVCi0jZW5kaWYKLQotLyogV2Ugc2hvdWxkIHVzZSAzMi1iaXQgZmlsZSBvcGVyYXRpb25zIGluIFdlYk0gZmlsZSBmb3JtYXQKLSAqIHdoZW4gYnVpbGRpbmcgQVJNIGV4ZWN1dGFibGUgZmlsZSAoLmF4Zikgd2l0aCBSVkNUICovCi0jaWYgIUNPTkZJR19PU19TVVBQT1JUCi10eXBlZGVmIGxvbmcgb2ZmX3Q7Ci0jZGVmaW5lIGZzZWVrbyBmc2VlawotI2RlZmluZSBmdGVsbG8gZnRlbGwKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciAqZXhlY19uYW1lOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvZGVjX2l0ZW0KLXsKLSAgICBjaGFyIGNvbnN0ICAgICAgICAgICAgICAqbmFtZTsKLSAgICBjb25zdCB2cHhfY29kZWNfaWZhY2VfdCAqaWZhY2U7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGZvdXJjYzsKLX0gY29kZWNzW10gPQotewotI2lmIENPTkZJR19WUDhfRU5DT0RFUgotICAgIHsidnA4IiwgICZ2cHhfY29kZWNfdnA4X2N4X2FsZ28sIDB4MzAzODUwNTZ9LAotI2VuZGlmCi19OwotCi1zdGF0aWMgdm9pZCB1c2FnZV9leGl0KCk7Ci0KLXZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgdXNhZ2VfZXhpdCgpOwotfQotCi1zdGF0aWMgdm9pZCBjdHhfZXhpdF9vbl9lcnJvcih2cHhfY29kZWNfY3R4X3QgKmN0eCwgY29uc3QgY2hhciAqcykKLXsKLSAgICBpZiAoY3R4LT5lcnIpCi0gICAgewotICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwgPSB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKGN0eCk7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHMsIHZweF9jb2RlY19lcnJvcihjdHgpKTsKLQotICAgICAgICBpZiAoZGV0YWlsKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgJXNcbiIsIGRldGFpbCk7Ci0KLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBhYnN0cmFjdCB0aGUgZGlmZmVyZW50IHdheXMgb2YgaGFuZGxpbmcKLSAqIGZpcnN0IHBhc3Mgc3RhdGlzdGljcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB2cHhfZml4ZWRfYnVmX3QgYnVmOwotICAgIGludCAgICAgICAgICAgICBwYXNzOwotICAgIEZJTEUgICAgICAgICAgICpmaWxlOwotICAgIGNoYXIgICAgICAgICAgICpidWZfcHRyOwotICAgIHNpemVfdCAgICAgICAgICBidWZfYWxsb2Nfc3o7Ci19IHN0YXRzX2lvX3Q7Ci0KLWludCBzdGF0c19vcGVuX2ZpbGUoc3RhdHNfaW9fdCAqc3RhdHMsIGNvbnN0IGNoYXIgKmZwZiwgaW50IHBhc3MpCi17Ci0gICAgaW50IHJlczsKLQotICAgIHN0YXRzLT5wYXNzID0gcGFzczsKLQotICAgIGlmIChwYXNzID09IDApCi0gICAgewotICAgICAgICBzdGF0cy0+ZmlsZSA9IGZvcGVuKGZwZiwgIndiIik7Ci0gICAgICAgIHN0YXRzLT5idWYuc3ogPSAwOwotICAgICAgICBzdGF0cy0+YnVmLmJ1ZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgcmVzID0gKHN0YXRzLT5maWxlICE9IE5VTEwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmIDAKLSNlbGlmIFVTRV9QT1NJWF9NTUFQCi0gICAgICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotICAgICAgICBpbnQgZmQ7Ci0KLSAgICAgICAgZmQgPSBvcGVuKGZwZiwgT19SRE9OTFkpOwotICAgICAgICBzdGF0cy0+ZmlsZSA9IGZkb3BlbihmZCwgInJiIik7Ci0gICAgICAgIGZzdGF0KGZkLCAmc3RhdF9idWYpOwotICAgICAgICBzdGF0cy0+YnVmLnN6ID0gc3RhdF9idWYuc3Rfc2l6ZTsKLSAgICAgICAgc3RhdHMtPmJ1Zi5idWYgPSBtbWFwKE5VTEwsIHN0YXRzLT5idWYuc3osIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgMCk7Ci0gICAgICAgIHJlcyA9IChzdGF0cy0+YnVmLmJ1ZiAhPSBOVUxMKTsKLSNlbHNlCi0gICAgICAgIHNpemVfdCBuYnl0ZXM7Ci0KLSAgICAgICAgc3RhdHMtPmZpbGUgPSBmb3BlbihmcGYsICJyYiIpOwotCi0gICAgICAgIGlmIChmc2VlayhzdGF0cy0+ZmlsZSwgMCwgU0VFS19FTkQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpcnN0LXBhc3Mgc3RhdHMgZmlsZSBtdXN0IGJlIHNlZWthYmxlIVxuIik7Ci0gICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0cy0+YnVmLnN6ID0gc3RhdHMtPmJ1Zl9hbGxvY19zeiA9IGZ0ZWxsKHN0YXRzLT5maWxlKTsKLSAgICAgICAgcmV3aW5kKHN0YXRzLT5maWxlKTsKLQotICAgICAgICBzdGF0cy0+YnVmLmJ1ZiA9IG1hbGxvYyhzdGF0cy0+YnVmX2FsbG9jX3N6KTsKLQotICAgICAgICBpZiAoIXN0YXRzLT5idWYuYnVmKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaXJzdC1wYXNzIHN0YXRzIGJ1ZmZlciAoJWx1IGJ5dGVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc3RhdHMtPmJ1Zl9hbGxvY19zeik7Ci0gICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuYnl0ZXMgPSBmcmVhZChzdGF0cy0+YnVmLmJ1ZiwgMSwgc3RhdHMtPmJ1Zi5zeiwgc3RhdHMtPmZpbGUpOwotICAgICAgICByZXMgPSAobmJ5dGVzID09IHN0YXRzLT5idWYuc3opOwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotaW50IHN0YXRzX29wZW5fbWVtKHN0YXRzX2lvX3QgKnN0YXRzLCBpbnQgcGFzcykKLXsKLSAgICBpbnQgcmVzOwotICAgIHN0YXRzLT5wYXNzID0gcGFzczsKLQotICAgIGlmICghcGFzcykKLSAgICB7Ci0gICAgICAgIHN0YXRzLT5idWYuc3ogPSAwOwotICAgICAgICBzdGF0cy0+YnVmX2FsbG9jX3N6ID0gNjQgKiAxMDI0OwotICAgICAgICBzdGF0cy0+YnVmLmJ1ZiA9IG1hbGxvYyhzdGF0cy0+YnVmX2FsbG9jX3N6KTsKLSAgICB9Ci0KLSAgICBzdGF0cy0+YnVmX3B0ciA9IHN0YXRzLT5idWYuYnVmOwotICAgIHJlcyA9IChzdGF0cy0+YnVmLmJ1ZiAhPSBOVUxMKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi0KLXZvaWQgc3RhdHNfY2xvc2Uoc3RhdHNfaW9fdCAqc3RhdHMsIGludCBsYXN0X3Bhc3MpCi17Ci0gICAgaWYgKHN0YXRzLT5maWxlKQotICAgIHsKLSAgICAgICAgaWYgKHN0YXRzLT5wYXNzID09IGxhc3RfcGFzcykKLSAgICAgICAgewotI2lmIDAKLSNlbGlmIFVTRV9QT1NJWF9NTUFQCi0gICAgICAgICAgICBtdW5tYXAoc3RhdHMtPmJ1Zi5idWYsIHN0YXRzLT5idWYuc3opOwotI2Vsc2UKLSAgICAgICAgICAgIGZyZWUoc3RhdHMtPmJ1Zi5idWYpOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICBmY2xvc2Uoc3RhdHMtPmZpbGUpOwotICAgICAgICBzdGF0cy0+ZmlsZSA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChzdGF0cy0+cGFzcyA9PSBsYXN0X3Bhc3MpCi0gICAgICAgICAgICBmcmVlKHN0YXRzLT5idWYuYnVmKTsKLSAgICB9Ci19Ci0KLXZvaWQgc3RhdHNfd3JpdGUoc3RhdHNfaW9fdCAqc3RhdHMsIGNvbnN0IHZvaWQgKnBrdCwgc2l6ZV90IGxlbikKLXsKLSAgICBpZiAoc3RhdHMtPmZpbGUpCi0gICAgewotICAgICAgICBpZihmd3JpdGUocGt0LCAxLCBsZW4sIHN0YXRzLT5maWxlKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChzdGF0cy0+YnVmLnN6ICsgbGVuID4gc3RhdHMtPmJ1Zl9hbGxvY19zeikKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZV90ICBuZXdfc3ogPSBzdGF0cy0+YnVmX2FsbG9jX3N6ICsgNjQgKiAxMDI0OwotICAgICAgICAgICAgY2hhciAgICpuZXdfcHRyID0gcmVhbGxvYyhzdGF0cy0+YnVmLmJ1ZiwgbmV3X3N6KTsKLQotICAgICAgICAgICAgaWYgKG5ld19wdHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPmJ1Zl9wdHIgPSBuZXdfcHRyICsgKHN0YXRzLT5idWZfcHRyIC0gKGNoYXIgKilzdGF0cy0+YnVmLmJ1Zik7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPmJ1Zi5idWYgPSBuZXdfcHRyOwotICAgICAgICAgICAgICAgIHN0YXRzLT5idWZfYWxsb2Nfc3ogPSBuZXdfc3o7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXG5GYWlsZWQgdG8gcmVhbGxvYyBmaXJzdHBhc3Mgc3RhdHMgYnVmZmVyLlxuIik7Ci0gICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KHN0YXRzLT5idWZfcHRyLCBwa3QsIGxlbik7Ci0gICAgICAgIHN0YXRzLT5idWYuc3ogKz0gbGVuOwotICAgICAgICBzdGF0cy0+YnVmX3B0ciArPSBsZW47Ci0gICAgfQotfQotCi12cHhfZml4ZWRfYnVmX3Qgc3RhdHNfZ2V0KHN0YXRzX2lvX3QgKnN0YXRzKQotewotICAgIHJldHVybiBzdGF0cy0+YnVmOwotfQotCi1lbnVtIHZpZGVvX2ZpbGVfdHlwZQotewotICAgIEZJTEVfVFlQRV9SQVcsCi0gICAgRklMRV9UWVBFX0lWRiwKLSAgICBGSUxFX1RZUEVfWTRNCi19OwotCi1zdHJ1Y3QgZGV0ZWN0X2J1ZmZlciB7Ci0gICAgY2hhciBidWZbNF07Ci0gICAgc2l6ZV90IGJ1Zl9yZWFkOwotICAgIHNpemVfdCBwb3NpdGlvbjsKLX07Ci0KLQotI2RlZmluZSBJVkZfRlJBTUVfSERSX1NaICg0KzgpIC8qIDQgYnl0ZSBzaXplICsgOCBieXRlIHRpbWVzdGFtcCAqLwotc3RhdGljIGludCByZWFkX2ZyYW1lKEZJTEUgKmYsIHZweF9pbWFnZV90ICppbWcsIHVuc2lnbmVkIGludCBmaWxlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgeTRtX2lucHV0ICp5NG0sIHN0cnVjdCBkZXRlY3RfYnVmZmVyICpkZXRlY3QpCi17Ci0gICAgaW50IHBsYW5lID0gMDsKLSAgICBpbnQgc2hvcnRyZWFkID0gMDsKLQotICAgIGlmIChmaWxlX3R5cGUgPT0gRklMRV9UWVBFX1k0TSkKLSAgICB7Ci0gICAgICAgIGlmICh5NG1faW5wdXRfZmV0Y2hfZnJhbWUoeTRtLCBmLCBpbWcpIDwgMSkKLSAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaWxlX3R5cGUgPT0gRklMRV9UWVBFX0lWRikKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBqdW5rW0lWRl9GUkFNRV9IRFJfU1pdOwotCi0gICAgICAgICAgICAvKiBTa2lwIHRoZSBmcmFtZSBoZWFkZXIuIFdlIGtub3cgaG93IGJpZyB0aGUgZnJhbWUgc2hvdWxkIGJlLiBTZWUKLSAgICAgICAgICAgICAqIHdyaXRlX2l2Zl9mcmFtZV9oZWFkZXIoKSBmb3IgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZnJhbWUgaGVhZGVyCi0gICAgICAgICAgICAgKiBsYXlvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKGZyZWFkKGp1bmssIDEsIElWRl9GUkFNRV9IRFJfU1osIGYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgICAgICAgIGludCB3ID0gKHBsYW5lID8gKDEgKyBpbWctPmRfdykgLyAyIDogaW1nLT5kX3cpOwotICAgICAgICAgICAgaW50IGggPSAocGxhbmUgPyAoMSArIGltZy0+ZF9oKSAvIDIgOiBpbWctPmRfaCk7Ci0gICAgICAgICAgICBpbnQgcjsKLQotICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHBsYW5lIGJhc2VkIG9uIHRoZSBpbWFnZSBmb3JtYXQuIFRoZSBmb3ItbG9vcAotICAgICAgICAgICAgICogYWx3YXlzIGNvdW50cyBpbiBZLFUsViBvcmRlciwgYnV0IHRoaXMgbWF5IG5vdCBtYXRjaCB0aGUgb3JkZXIgb2YKLSAgICAgICAgICAgICAqIHRoZSBkYXRhIG9uIGRpc2suCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN3aXRjaCAocGxhbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcHRyID0gaW1nLT5wbGFuZXNbaW1nLT5mbXQ9PVZQWF9JTUdfRk1UX1lWMTI/IFZQWF9QTEFORV9WIDogVlBYX1BMQU5FX1VdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHB0ciA9IGltZy0+cGxhbmVzW2ltZy0+Zm10PT1WUFhfSU1HX0ZNVF9ZVjEyP1ZQWF9QTEFORV9VIDogVlBYX1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwdHIgPSBpbWctPnBsYW5lc1twbGFuZV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBoOyByKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5lZWRlZCA9IHc7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zl9wb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxlZnQgPSBkZXRlY3QtPmJ1Zl9yZWFkIC0gZGV0ZWN0LT5wb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbW9yZSA9IChsZWZ0IDwgbmVlZGVkKSA/IGxlZnQgOiBuZWVkZWQ7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShwdHIsIGRldGVjdC0+YnVmICsgZGV0ZWN0LT5wb3NpdGlvbiwgbW9yZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zl9wb3NpdGlvbiA9IG1vcmU7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRlZCAtPSBtb3JlOwotICAgICAgICAgICAgICAgICAgICBkZXRlY3QtPnBvc2l0aW9uICs9IG1vcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZWVkZWQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnRyZWFkIHw9IChmcmVhZChwdHIgKyBidWZfcG9zaXRpb24sIDEsIG5lZWRlZCwgZikgPCBuZWVkZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB0ciArPSBpbWctPnN0cmlkZVtwbGFuZV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gIXNob3J0cmVhZDsKLX0KLQotCi11bnNpZ25lZCBpbnQgZmlsZV9pc195NG0oRklMRSAgICAgICppbmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeTRtX2lucHV0ICp5NG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICBkZXRlY3RbNF0pCi17Ci0gICAgaWYobWVtY21wKGRldGVjdCwgIllVVjQiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZGVmaW5lIElWRl9GSUxFX0hEUl9TWiAoMzIpCi11bnNpZ25lZCBpbnQgZmlsZV9pc19pdmYoRklMRSAqaW5maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZm91cmNjLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldGVjdF9idWZmZXIgKmRldGVjdCkKLXsKLSAgICBjaGFyIHJhd19oZHJbSVZGX0ZJTEVfSERSX1NaXTsKLSAgICBpbnQgaXNfaXZmID0gMDsKLQotICAgIGlmKG1lbWNtcChkZXRlY3QtPmJ1ZiwgIkRLSUYiLCA0KSAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIFNlZSB3cml0ZV9pdmZfZmlsZV9oZWFkZXIoKSBmb3IgbW9yZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBmaWxlIGhlYWRlcgotICAgICAqIGxheW91dC4KLSAgICAgKi8KLSAgICBpZiAoZnJlYWQocmF3X2hkciArIDQsIDEsIElWRl9GSUxFX0hEUl9TWiAtIDQsIGluZmlsZSkKLSAgICAgICAgPT0gSVZGX0ZJTEVfSERSX1NaIC0gNCkKLSAgICB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlzX2l2ZiA9IDE7Ci0KLSAgICAgICAgICAgIGlmIChtZW1fZ2V0X2xlMTYocmF3X2hkciArIDQpICE9IDApCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5yZWNvZ25pemVkIElWRiB2ZXJzaW9uISBUaGlzIGZpbGUgbWF5IG5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZGVjb2RlIHByb3Blcmx5LiIpOwotCi0gICAgICAgICAgICAqZm91cmNjID0gbWVtX2dldF9sZTMyKHJhd19oZHIgKyA4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc19pdmYpCi0gICAgewotICAgICAgICAqd2lkdGggPSBtZW1fZ2V0X2xlMTYocmF3X2hkciArIDEyKTsKLSAgICAgICAgKmhlaWdodCA9IG1lbV9nZXRfbGUxNihyYXdfaGRyICsgMTQpOwotICAgICAgICBkZXRlY3QtPnBvc2l0aW9uID0gNDsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXNfaXZmOwotfQotCi0KLXN0YXRpYyB2b2lkIHdyaXRlX2l2Zl9maWxlX2hlYWRlcihGSUxFICpvdXRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZm91cmNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9jbnQpCi17Ci0gICAgY2hhciBoZWFkZXJbMzJdOwotCi0gICAgaWYgKGNmZy0+Z19wYXNzICE9IFZQWF9SQ19PTkVfUEFTUyAmJiBjZmctPmdfcGFzcyAhPSBWUFhfUkNfTEFTVF9QQVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBoZWFkZXJbMF0gPSAnRCc7Ci0gICAgaGVhZGVyWzFdID0gJ0snOwotICAgIGhlYWRlclsyXSA9ICdJJzsKLSAgICBoZWFkZXJbM10gPSAnRic7Ci0gICAgbWVtX3B1dF9sZTE2KGhlYWRlciArIDQsICAwKTsgICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KLSAgICBtZW1fcHV0X2xlMTYoaGVhZGVyICsgNiwgIDMyKTsgICAgICAgICAgICAgICAgLyogaGVhZGVyc2l6ZSAqLwotICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyA4LCAgZm91cmNjKTsgICAgICAgICAgICAvKiBoZWFkZXJzaXplICovCi0gICAgbWVtX3B1dF9sZTE2KGhlYWRlciArIDEyLCBjZmctPmdfdyk7ICAgICAgICAgIC8qIHdpZHRoICovCi0gICAgbWVtX3B1dF9sZTE2KGhlYWRlciArIDE0LCBjZmctPmdfaCk7ICAgICAgICAgIC8qIGhlaWdodCAqLwotICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyAxNiwgY2ZnLT5nX3RpbWViYXNlLmRlbik7IC8qIHJhdGUgKi8KLSAgICBtZW1fcHV0X2xlMzIoaGVhZGVyICsgMjAsIGNmZy0+Z190aW1lYmFzZS5udW0pOyAvKiBzY2FsZSAqLwotICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyAyNCwgZnJhbWVfY250KTsgICAgICAgICAvKiBsZW5ndGggKi8KLSAgICBtZW1fcHV0X2xlMzIoaGVhZGVyICsgMjgsIDApOyAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCi0KLSAgICBpZihmd3JpdGUoaGVhZGVyLCAxLCAzMiwgb3V0ZmlsZSkpOwotfQotCi0KLXN0YXRpYyB2b2lkIHdyaXRlX2l2Zl9mcmFtZV9oZWFkZXIoRklMRSAqb3V0ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90ICpwa3QpCi17Ci0gICAgY2hhciAgICAgICAgICAgICBoZWFkZXJbMTJdOwotICAgIHZweF9jb2RlY19wdHNfdCAgcHRzOwotCi0gICAgaWYgKHBrdC0+a2luZCAhPSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUKQotICAgICAgICByZXR1cm47Ci0KLSAgICBwdHMgPSBwa3QtPmRhdGEuZnJhbWUucHRzOwotICAgIG1lbV9wdXRfbGUzMihoZWFkZXIsIHBrdC0+ZGF0YS5mcmFtZS5zeik7Ci0gICAgbWVtX3B1dF9sZTMyKGhlYWRlciArIDQsIHB0cyAmIDB4RkZGRkZGRkYpOwotICAgIG1lbV9wdXRfbGUzMihoZWFkZXIgKyA4LCBwdHMgPj4gMzIpOwotCi0gICAgaWYoZndyaXRlKGhlYWRlciwgMSwgMTIsIG91dGZpbGUpKTsKLX0KLQotCi10eXBlZGVmIG9mZl90IEVibWxMb2M7Ci0KLQotc3RydWN0IGN1ZV9lbnRyeQotewotICAgIHVuc2lnbmVkIGludCB0aW1lOwotICAgIHVpbnQ2NF90ICAgICBsb2M7Ci19OwotCi0KLXN0cnVjdCBFYm1sR2xvYmFsCi17Ci0gICAgaW50IGRlYnVnOwotCi0gICAgRklMRSAgICAqc3RyZWFtOwotICAgIGludDY0X3QgbGFzdF9wdHNfbXM7Ci0gICAgdnB4X3JhdGlvbmFsX3QgIGZyYW1lcmF0ZTsKLQotICAgIC8qIFRoZXNlIHBvaW50ZXJzIGFyZSB0byB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCAqLwotICAgIG9mZl90ICAgIHBvc2l0aW9uX3JlZmVyZW5jZTsKLSAgICBvZmZfdCAgICBzZWVrX2luZm9fcG9zOwotICAgIG9mZl90ICAgIHNlZ21lbnRfaW5mb19wb3M7Ci0gICAgb2ZmX3QgICAgdHJhY2tfcG9zOwotICAgIG9mZl90ICAgIGN1ZV9wb3M7Ci0gICAgb2ZmX3QgICAgY2x1c3Rlcl9wb3M7Ci0KLSAgICAvKiBUaGlzIHBvaW50ZXIgaXMgdG8gYSBzcGVjaWZpYyBlbGVtZW50IHRvIGJlIHNlcmlhbGl6ZWQgKi8KLSAgICBvZmZfdCAgICB0cmFja19pZF9wb3M7Ci0KLSAgICAvKiBUaGVzZSBwb2ludGVycyBhcmUgdG8gdGhlIHNpemUgZmllbGQgb2YgdGhlIGVsZW1lbnQgKi8KLSAgICBFYm1sTG9jICBzdGFydFNlZ21lbnQ7Ci0gICAgRWJtbExvYyAgc3RhcnRDbHVzdGVyOwotCi0gICAgdWludDMyX3QgY2x1c3Rlcl90aW1lY29kZTsKLSAgICBpbnQgICAgICBjbHVzdGVyX29wZW47Ci0KLSAgICBzdHJ1Y3QgY3VlX2VudHJ5ICpjdWVfbGlzdDsKLSAgICB1bnNpZ25lZCBpbnQgICAgICBjdWVzOwotCi19OwotCi0KLXZvaWQgRWJtbF9Xcml0ZShFYm1sR2xvYmFsICpnbG9iLCBjb25zdCB2b2lkICpidWZmZXJfaW4sIHVuc2lnbmVkIGxvbmcgbGVuKQotewotICAgIGlmKGZ3cml0ZShidWZmZXJfaW4sIDEsIGxlbiwgZ2xvYi0+c3RyZWFtKSk7Ci19Ci0KLQotdm9pZCBFYm1sX1NlcmlhbGl6ZShFYm1sR2xvYmFsICpnbG9iLCBjb25zdCB2b2lkICpidWZmZXJfaW4sIHVuc2lnbmVkIGxvbmcgbGVuKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWJ1ZmZlcl9pbiArIGxlbiAtIDE7Ci0KLSAgICBmb3IoOyBsZW47IGxlbi0tKQotICAgICAgICBFYm1sX1dyaXRlKGdsb2IsIHEtLSwgMSk7Ci19Ci0KLQotLyogTmVlZCBhIGZpeGVkIHNpemUgc2VyaWFsaXplciBmb3IgdGhlIHRyYWNrIElELiBsaWJta3YgcHJvdmRlcyBhIDY0IGJpdAotICogb25lLCBidXQgbm90IGEgMzIgYml0IG9uZS4KLSAqLwotc3RhdGljIHZvaWQgRWJtbF9TZXJpYWxpemVVbnNpZ25lZDMyKEVibWxHbG9iYWwgKmdsb2IsIHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQsIHVpbnQ2NF90IHVpKQotewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZVNlcmlhbGl6ZWQgPSA0IHwgMHg4MDsKLSAgICBFYm1sX1dyaXRlSUQoZ2xvYiwgY2xhc3NfaWQpOwotICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZzaXplU2VyaWFsaXplZCwgMSk7Ci0gICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJnVpLCA0KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotRWJtbF9TdGFydFN1YkVsZW1lbnQoRWJtbEdsb2JhbCAqZ2xvYiwgRWJtbExvYyAqZWJtbExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjbGFzc19pZCkKLXsKLSAgICAvL3RvZG8gdGhpcyBpcyBhbHdheXMgdGFraW5nIDggYnl0ZXMsIHRoaXMgbWF5IG5lZWQgbGF0ZXIgb3B0aW1pemF0aW9uCi0gICAgLy90aGlzIGlzIGEga2V5IHRoYXQgc2F5cyBsZW5naHQgdW5rbm93bgotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1bmtub3duTGVuID0gIExJVEVSQUxVNjQoMHgwMUZGRkZGRkZGRkZGRkZGKTsKLQotICAgIEVibWxfV3JpdGVJRChnbG9iLCBjbGFzc19pZCk7Ci0gICAgKmVibWxMb2MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKLSAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmdW5rbm93bkxlbiwgOCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1FYm1sX0VuZFN1YkVsZW1lbnQoRWJtbEdsb2JhbCAqZ2xvYiwgRWJtbExvYyAqZWJtbExvYykKLXsKLSAgICBvZmZfdCBwb3M7Ci0gICAgdWludDY0X3Qgc2l6ZTsKLQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3RyZWFtIHBvaW50ZXIgKi8KLSAgICBwb3MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICBzaXplID0gcG9zIC0gKmVibWxMb2MgLSA4OwotICAgIHNpemUgfD0gIExJVEVSQUxVNjQoMHgwMTAwMDAwMDAwMDAwMDAwKTsKLQotICAgIC8qIFNlZWsgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlbGVtZW50IGFuZCB3cml0ZSB0aGUgbmV3IHNpemUgKi8KLSAgICBmc2Vla28oZ2xvYi0+c3RyZWFtLCAqZWJtbExvYywgU0VFS19TRVQpOwotICAgIEVibWxfU2VyaWFsaXplKGdsb2IsICZzaXplLCA4KTsKLQotICAgIC8qIFJlc2V0IHRoZSBzdHJlYW0gcG9pbnRlciAqLwotICAgIGZzZWVrbyhnbG9iLT5zdHJlYW0sIHBvcywgU0VFS19TRVQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV93ZWJtX3NlZWtfZWxlbWVudChFYm1sR2xvYmFsICplYm1sLCB1bnNpZ25lZCBsb25nIGlkLCBvZmZfdCBwb3MpCi17Ci0gICAgdWludDY0X3Qgb2Zmc2V0ID0gcG9zIC0gZWJtbC0+cG9zaXRpb25fcmVmZXJlbmNlOwotICAgIEVibWxMb2Mgc3RhcnQ7Ci0gICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0LCBTZWVrKTsKLSAgICBFYm1sX1NlcmlhbGl6ZUJpbmFyeShlYm1sLCBTZWVrSUQsIGlkKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkNjQoZWJtbCwgU2Vla1Bvc2l0aW9uLCBvZmZzZXQpOwotICAgIEVibWxfRW5kU3ViRWxlbWVudChlYm1sLCAmc3RhcnQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV93ZWJtX3NlZWtfaW5mbyhFYm1sR2xvYmFsICplYm1sKQotewotCi0gICAgb2ZmX3QgcG9zOwotCi0gICAgLyogU2F2ZSB0aGUgY3VycmVudCBzdHJlYW0gcG9pbnRlciAqLwotICAgIHBvcyA9IGZ0ZWxsbyhlYm1sLT5zdHJlYW0pOwotCi0gICAgaWYoZWJtbC0+c2Vla19pbmZvX3BvcykKLSAgICAgICAgZnNlZWtvKGVibWwtPnN0cmVhbSwgZWJtbC0+c2Vla19pbmZvX3BvcywgU0VFS19TRVQpOwotICAgIGVsc2UKLSAgICAgICAgZWJtbC0+c2Vla19pbmZvX3BvcyA9IHBvczsKLQotICAgIHsKLSAgICAgICAgRWJtbExvYyBzdGFydDsKLQotICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChlYm1sLCAmc3RhcnQsIFNlZWtIZWFkKTsKLSAgICAgICAgd3JpdGVfd2VibV9zZWVrX2VsZW1lbnQoZWJtbCwgVHJhY2tzLCBlYm1sLT50cmFja19wb3MpOwotICAgICAgICB3cml0ZV93ZWJtX3NlZWtfZWxlbWVudChlYm1sLCBDdWVzLCAgIGVibWwtPmN1ZV9wb3MpOwotICAgICAgICB3cml0ZV93ZWJtX3NlZWtfZWxlbWVudChlYm1sLCBJbmZvLCAgIGVibWwtPnNlZ21lbnRfaW5mb19wb3MpOwotICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0KTsKLSAgICB9Ci0gICAgewotICAgICAgICAvL3NlZ21lbnQgaW5mbwotICAgICAgICBFYm1sTG9jIHN0YXJ0SW5mbzsKLSAgICAgICAgdWludDY0X3QgZnJhbWVfdGltZTsKLQotICAgICAgICBmcmFtZV90aW1lID0gKHVpbnQ2NF90KTEwMDAgKiBlYm1sLT5mcmFtZXJhdGUuZGVuCi0gICAgICAgICAgICAgICAgICAgICAvIGVibWwtPmZyYW1lcmF0ZS5udW07Ci0gICAgICAgIGVibWwtPnNlZ21lbnRfaW5mb19wb3MgPSBmdGVsbG8oZWJtbC0+c3RyZWFtKTsKLSAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0SW5mbywgSW5mbyk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZWJtbCwgVGltZWNvZGVTY2FsZSwgMTAwMDAwMCk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplRmxvYXQoZWJtbCwgU2VnbWVudF9EdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYm1sLT5sYXN0X3B0c19tcyArIGZyYW1lX3RpbWUpOwotICAgICAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhlYm1sLCAweDREODAsCi0gICAgICAgICAgICBlYm1sLT5kZWJ1ZyA/ICJ2cHhlbmMiIDogInZweGVuYyIgVkVSU0lPTl9TVFJJTkcpOwotICAgICAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZyhlYm1sLCAweDU3NDEsCi0gICAgICAgICAgICBlYm1sLT5kZWJ1ZyA/ICJ2cHhlbmMiIDogInZweGVuYyIgVkVSU0lPTl9TVFJJTkcpOwotICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZWJtbCwgJnN0YXJ0SW5mbyk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV93ZWJtX2ZpbGVfaGVhZGVyKEVibWxHbG9iYWwgICAgICAgICAgICAgICAgKmdsb2IsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19lbmNfY2ZnX3QgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZweF9yYXRpb25hbCAqZnBzKQotewotICAgIHsKLSAgICAgICAgRWJtbExvYyBzdGFydDsKLSAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBFQk1MKTsKLSAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBFQk1MVmVyc2lvbiwgMSk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRUJNTFJlYWRWZXJzaW9uLCAxKTsgLy9FQk1MIFJlYWQgVmVyc2lvbgotICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIEVCTUxNYXhJRExlbmd0aCwgNCk7IC8vRUJNTCBNYXggSUQgTGVuZ3RoCi0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgRUJNTE1heFNpemVMZW5ndGgsIDgpOyAvL0VCTUwgTWF4IFNpemUgTGVuZ3RoCi0gICAgICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKGdsb2IsIERvY1R5cGUsICJ3ZWJtIik7IC8vRG9jIFR5cGUKLSAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBEb2NUeXBlVmVyc2lvbiwgMik7IC8vRG9jIFR5cGUgVmVyc2lvbgotICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIERvY1R5cGVSZWFkVmVyc2lvbiwgMik7IC8vRG9jIFR5cGUgUmVhZCBWZXJzaW9uCi0gICAgICAgIEVibWxfRW5kU3ViRWxlbWVudChnbG9iLCAmc3RhcnQpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZnbG9iLT5zdGFydFNlZ21lbnQsIFNlZ21lbnQpOyAvL3NlZ21lbnQKLSAgICAgICAgZ2xvYi0+cG9zaXRpb25fcmVmZXJlbmNlID0gZnRlbGxvKGdsb2ItPnN0cmVhbSk7Ci0gICAgICAgIGdsb2ItPmZyYW1lcmF0ZSA9ICpmcHM7Ci0gICAgICAgIHdyaXRlX3dlYm1fc2Vla19pbmZvKGdsb2IpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVibWxMb2MgdHJhY2tTdGFydDsKLSAgICAgICAgICAgIGdsb2ItPnRyYWNrX3BvcyA9IGZ0ZWxsbyhnbG9iLT5zdHJlYW0pOwotICAgICAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnRyYWNrU3RhcnQsIFRyYWNrcyk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRyYWNrTnVtYmVyID0gMTsKLSAgICAgICAgICAgICAgICB1aW50NjRfdCAgICAgdHJhY2tJRCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBFYm1sTG9jIHN0YXJ0OwotICAgICAgICAgICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZzdGFydCwgVHJhY2tFbnRyeSk7Ci0gICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUcmFja051bWJlciwgdHJhY2tOdW1iZXIpOwotICAgICAgICAgICAgICAgIGdsb2ItPnRyYWNrX2lkX3BvcyA9IGZ0ZWxsbyhnbG9iLT5zdHJlYW0pOwotICAgICAgICAgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQzMihnbG9iLCBUcmFja1VJRCwgdHJhY2tJRCk7Ci0gICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBUcmFja1R5cGUsIDEpOyAvL3ZpZGVvIGlzIGFsd2F5cyAxCi0gICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVTdHJpbmcoZ2xvYiwgQ29kZWNJRCwgIlZfVlA4Iik7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGl4ZWxXaWR0aCA9IGNmZy0+Z193OwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGl4ZWxIZWlnaHQgPSBjZmctPmdfaDsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgIGZyYW1lUmF0ZSAgID0gKGZsb2F0KWZwcy0+bnVtLyhmbG9hdClmcHMtPmRlbjsKLQotICAgICAgICAgICAgICAgICAgICBFYm1sTG9jIHZpZGVvU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZ2aWRlb1N0YXJ0LCBWaWRlbyk7Ci0gICAgICAgICAgICAgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgUGl4ZWxXaWR0aCwgcGl4ZWxXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoZ2xvYiwgUGl4ZWxIZWlnaHQsIHBpeGVsSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVGbG9hdChnbG9iLCBGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIEVibWxfRW5kU3ViRWxlbWVudChnbG9iLCAmdmlkZW9TdGFydCk7IC8vVmlkZW8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7IC8vVHJhY2sgRW50cnkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVibWxfRW5kU3ViRWxlbWVudChnbG9iLCAmdHJhY2tTdGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2VnbWVudCBlbGVtZW50IGlzIG9wZW4KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3dlYm1fYmxvY2soRWJtbEdsb2JhbCAgICAgICAgICAgICAgICAqZ2xvYiwKLSAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2NvZGVjX2VuY19jZmdfdCAqY2ZnLAotICAgICAgICAgICAgICAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgICpwa3QpCi17Ci0gICAgdW5zaWduZWQgbG9uZyAgYmxvY2tfbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgIHRyYWNrX251bWJlcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBibG9ja190aW1lY29kZSA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAgZmxhZ3M7Ci0gICAgaW50NjRfdCAgICAgICAgcHRzX21zOwotICAgIGludCAgICAgICAgICAgIHN0YXJ0X2NsdXN0ZXIgPSAwLCBpc19rZXlmcmFtZTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgUFRTIG9mIHRoaXMgZnJhbWUgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgcHRzX21zID0gcGt0LT5kYXRhLmZyYW1lLnB0cyAqIDEwMDAKLSAgICAgICAgICAgICAqICh1aW50NjRfdCljZmctPmdfdGltZWJhc2UubnVtIC8gKHVpbnQ2NF90KWNmZy0+Z190aW1lYmFzZS5kZW47Ci0gICAgaWYocHRzX21zIDw9IGdsb2ItPmxhc3RfcHRzX21zKQotICAgICAgICBwdHNfbXMgPSBnbG9iLT5sYXN0X3B0c19tcyArIDE7Ci0gICAgZ2xvYi0+bGFzdF9wdHNfbXMgPSBwdHNfbXM7Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIHJlbGF0aXZlIHRpbWUgb2YgdGhpcyBibG9jayAqLwotICAgIGlmKHB0c19tcyAtIGdsb2ItPmNsdXN0ZXJfdGltZWNvZGUgPiBTSFJUX01BWCkKLSAgICAgICAgc3RhcnRfY2x1c3RlciA9IDE7Ci0gICAgZWxzZQotICAgICAgICBibG9ja190aW1lY29kZSA9IHB0c19tcyAtIGdsb2ItPmNsdXN0ZXJfdGltZWNvZGU7Ci0KLSAgICBpc19rZXlmcmFtZSA9IChwa3QtPmRhdGEuZnJhbWUuZmxhZ3MgJiBWUFhfRlJBTUVfSVNfS0VZKTsKLSAgICBpZihzdGFydF9jbHVzdGVyIHx8IGlzX2tleWZyYW1lKQotICAgIHsKLSAgICAgICAgaWYoZ2xvYi0+Y2x1c3Rlcl9vcGVuKQotICAgICAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZnbG9iLT5zdGFydENsdXN0ZXIpOwotCi0gICAgICAgIC8qIE9wZW4gdGhlIG5ldyBjbHVzdGVyICovCi0gICAgICAgIGJsb2NrX3RpbWVjb2RlID0gMDsKLSAgICAgICAgZ2xvYi0+Y2x1c3Rlcl9vcGVuID0gMTsKLSAgICAgICAgZ2xvYi0+Y2x1c3Rlcl90aW1lY29kZSA9IHB0c19tczsKLSAgICAgICAgZ2xvYi0+Y2x1c3Rlcl9wb3MgPSBmdGVsbG8oZ2xvYi0+c3RyZWFtKTsKLSAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0Q2x1c3RlciwgQ2x1c3Rlcik7IC8vY2x1c3RlcgotICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKGdsb2IsIFRpbWVjb2RlLCBnbG9iLT5jbHVzdGVyX3RpbWVjb2RlKTsKLQotICAgICAgICAvKiBTYXZlIGEgY3VlIHBvaW50IGlmIHRoaXMgaXMgYSBrZXlmcmFtZS4gKi8KLSAgICAgICAgaWYoaXNfa2V5ZnJhbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cnVjdCBjdWVfZW50cnkgKmN1ZSwgKm5ld19jdWVfbGlzdDsKLQotICAgICAgICAgICAgbmV3X2N1ZV9saXN0ID0gcmVhbGxvYyhnbG9iLT5jdWVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdsb2ItPmN1ZXMrMSkgKiBzaXplb2Yoc3RydWN0IGN1ZV9lbnRyeSkpOwotICAgICAgICAgICAgaWYobmV3X2N1ZV9saXN0KQotICAgICAgICAgICAgICAgIGdsb2ItPmN1ZV9saXN0ID0gbmV3X2N1ZV9saXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5GYWlsZWQgdG8gcmVhbGxvYyBjdWUgbGlzdC5cbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VlID0gJmdsb2ItPmN1ZV9saXN0W2dsb2ItPmN1ZXNdOwotICAgICAgICAgICAgY3VlLT50aW1lID0gZ2xvYi0+Y2x1c3Rlcl90aW1lY29kZTsKLSAgICAgICAgICAgIGN1ZS0+bG9jID0gZ2xvYi0+Y2x1c3Rlcl9wb3M7Ci0gICAgICAgICAgICBnbG9iLT5jdWVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBXcml0ZSB0aGUgU2ltcGxlIEJsb2NrICovCi0gICAgRWJtbF9Xcml0ZUlEKGdsb2IsIFNpbXBsZUJsb2NrKTsKLQotICAgIGJsb2NrX2xlbmd0aCA9IHBrdC0+ZGF0YS5mcmFtZS5zeiArIDQ7Ci0gICAgYmxvY2tfbGVuZ3RoIHw9IDB4MTAwMDAwMDA7Ci0gICAgRWJtbF9TZXJpYWxpemUoZ2xvYiwgJmJsb2NrX2xlbmd0aCwgNCk7Ci0KLSAgICB0cmFja19udW1iZXIgPSAxOwotICAgIHRyYWNrX251bWJlciB8PSAweDgwOwotICAgIEVibWxfV3JpdGUoZ2xvYiwgJnRyYWNrX251bWJlciwgMSk7Ci0KLSAgICBFYm1sX1NlcmlhbGl6ZShnbG9iLCAmYmxvY2tfdGltZWNvZGUsIDIpOwotCi0gICAgZmxhZ3MgPSAwOwotICAgIGlmKGlzX2tleWZyYW1lKQotICAgICAgICBmbGFncyB8PSAweDgwOwotICAgIGlmKHBrdC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19JTlZJU0lCTEUpCi0gICAgICAgIGZsYWdzIHw9IDB4MDg7Ci0gICAgRWJtbF9Xcml0ZShnbG9iLCAmZmxhZ3MsIDEpOwotCi0gICAgRWJtbF9Xcml0ZShnbG9iLCBwa3QtPmRhdGEuZnJhbWUuYnVmLCBwa3QtPmRhdGEuZnJhbWUuc3opOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV93ZWJtX2ZpbGVfZm9vdGVyKEVibWxHbG9iYWwgKmdsb2IsIGxvbmcgaGFzaCkKLXsKLQotICAgIGlmKGdsb2ItPmNsdXN0ZXJfb3BlbikKLSAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZnbG9iLT5zdGFydENsdXN0ZXIpOwotCi0gICAgewotICAgICAgICBFYm1sTG9jIHN0YXJ0OwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBnbG9iLT5jdWVfcG9zID0gZnRlbGxvKGdsb2ItPnN0cmVhbSk7Ci0gICAgICAgIEVibWxfU3RhcnRTdWJFbGVtZW50KGdsb2IsICZzdGFydCwgQ3Vlcyk7Ci0gICAgICAgIGZvcihpPTA7IGk8Z2xvYi0+Y3VlczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJ1Y3QgY3VlX2VudHJ5ICpjdWUgPSAmZ2xvYi0+Y3VlX2xpc3RbaV07Ci0gICAgICAgICAgICBFYm1sTG9jIHN0YXJ0OwotCi0gICAgICAgICAgICBFYm1sX1N0YXJ0U3ViRWxlbWVudChnbG9iLCAmc3RhcnQsIEN1ZVBvaW50KTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFYm1sTG9jIHN0YXJ0OwotCi0gICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBDdWVUaW1lLCBjdWUtPnRpbWUpOwotCi0gICAgICAgICAgICAgICAgRWJtbF9TdGFydFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0LCBDdWVUcmFja1Bvc2l0aW9ucyk7Ci0gICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBDdWVUcmFjaywgMSk7Ci0gICAgICAgICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZDY0KGdsb2IsIEN1ZUNsdXN0ZXJQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VlLT5sb2MgLSBnbG9iLT5wb3NpdGlvbl9yZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgIC8vRWJtbF9TZXJpYWxpemVVbnNpZ25lZChnbG9iLCBDdWVCbG9ja051bWJlciwgY3VlLT5ibG9ja051bWJlcik7Ci0gICAgICAgICAgICAgICAgRWJtbF9FbmRTdWJFbGVtZW50KGdsb2IsICZzdGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0KTsKLSAgICAgICAgfQotICAgICAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJnN0YXJ0KTsKLSAgICB9Ci0KLSAgICBFYm1sX0VuZFN1YkVsZW1lbnQoZ2xvYiwgJmdsb2ItPnN0YXJ0U2VnbWVudCk7Ci0KLSAgICAvKiBQYXRjaCB1cCB0aGUgc2VlayBpbmZvIGJsb2NrICovCi0gICAgd3JpdGVfd2VibV9zZWVrX2luZm8oZ2xvYik7Ci0KLSAgICAvKiBQYXRjaCB1cCB0aGUgdHJhY2sgaWQgKi8KLSAgICBmc2Vla28oZ2xvYi0+c3RyZWFtLCBnbG9iLT50cmFja19pZF9wb3MsIFNFRUtfU0VUKTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkMzIoZ2xvYiwgVHJhY2tVSUQsIGdsb2ItPmRlYnVnID8gMHhERUFEQkVFRiA6IGhhc2gpOwotCi0gICAgZnNlZWtvKGdsb2ItPnN0cmVhbSwgMCwgU0VFS19FTkQpOwotfQotCi0KLS8qIE11cm11ciBoYXNoIGRlcml2ZWQgZnJvbSBwdWJsaWMgZG9tYWluIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhdAotICogICBodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL211cm11cmhhc2gvCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVybXVyICggY29uc3Qgdm9pZCAqIGtleSwgaW50IGxlbiwgdW5zaWduZWQgaW50IHNlZWQgKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGludCBtID0gMHg1YmQxZTk5NTsKLSAgICBjb25zdCBpbnQgciA9IDI0OwotCi0gICAgdW5zaWduZWQgaW50IGggPSBzZWVkIF4gbGVuOwotCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWtleTsKLQotICAgIHdoaWxlKGxlbiA+PSA0KQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGs7Ci0KLSAgICAgICAgayAgPSBkYXRhWzBdOwotICAgICAgICBrIHw9IGRhdGFbMV0gPDwgODsKLSAgICAgICAgayB8PSBkYXRhWzJdIDw8IDE2OwotICAgICAgICBrIHw9IGRhdGFbM10gPDwgMjQ7Ci0KLSAgICAgICAgayAqPSBtOwotICAgICAgICBrIF49IGsgPj4gcjsKLSAgICAgICAgayAqPSBtOwotCi0gICAgICAgIGggKj0gbTsKLSAgICAgICAgaCBePSBrOwotCi0gICAgICAgIGRhdGEgKz0gNDsKLSAgICAgICAgbGVuIC09IDQ7Ci0gICAgfQotCi0gICAgc3dpdGNoKGxlbikKLSAgICB7Ci0gICAgY2FzZSAzOiBoIF49IGRhdGFbMl0gPDwgMTY7Ci0gICAgY2FzZSAyOiBoIF49IGRhdGFbMV0gPDwgODsKLSAgICBjYXNlIDE6IGggXj0gZGF0YVswXTsKLSAgICAgICAgICAgIGggKj0gbTsKLSAgICB9OwotCi0gICAgaCBePSBoID4+IDEzOwotICAgIGggKj0gbTsKLSAgICBoIF49IGggPj4gMTU7Ci0KLSAgICByZXR1cm4gaDsKLX0KLQotI2luY2x1ZGUgIm1hdGguaCIKLQotc3RhdGljIGRvdWJsZSB2cDhfbXNlMnBzbnIoZG91YmxlIFNhbXBsZXMsIGRvdWJsZSBQZWFrLCBkb3VibGUgTXNlKQotewotICAgIGRvdWJsZSBwc25yOwotCi0gICAgaWYgKChkb3VibGUpTXNlID4gMC4wKQotICAgICAgICBwc25yID0gMTAuMCAqIGxvZzEwKFBlYWsgKiBQZWFrICogU2FtcGxlcyAvIE1zZSk7Ci0gICAgZWxzZQotICAgICAgICBwc25yID0gNjA7ICAgICAgLy8gTGltaXQgdG8gcHJldmVudCAvIDAKLQotICAgIGlmIChwc25yID4gNjApCi0gICAgICAgIHBzbnIgPSA2MDsKLQotICAgIHJldHVybiBwc25yOwotfQotCi0KLSNpbmNsdWRlICJhcmdzLmgiCi0KLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgZGVidWdtb2RlID0gQVJHX0RFRigiRCIsICJkZWJ1ZyIsIDAsCi0gICAgICAgICJEZWJ1ZyBtb2RlIChtYWtlcyBvdXRwdXQgZGV0ZXJtaW5pc3RpYykiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3Qgb3V0cHV0ZmlsZSA9IEFSR19ERUYoIm8iLCAib3V0cHV0IiwgMSwKLSAgICAgICAgIk91dHB1dCBmaWxlbmFtZSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB1c2VfeXYxMiA9IEFSR19ERUYoTlVMTCwgInl2MTIiLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnB1dCBmaWxlIGlzIFlWMTIgIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHVzZV9pNDIwID0gQVJHX0RFRihOVUxMLCAiaTQyMCIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklucHV0IGZpbGUgaXMgSTQyMCAoZGVmYXVsdCkiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgY29kZWNhcmcgPSBBUkdfREVGKE5VTEwsICJjb2RlYyIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZGVjIHRvIHVzZSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBwYXNzZXMgICAgICAgICAgID0gQVJHX0RFRigicCIsICJwYXNzZXMiLCAxLAotICAgICAgICAiTnVtYmVyIG9mIHBhc3NlcyAoMS8yKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBwYXNzX2FyZyAgICAgICAgID0gQVJHX0RFRihOVUxMLCAicGFzcyIsIDEsCi0gICAgICAgICJQYXNzIHRvIGV4ZWN1dGUgKDEvMikiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgZnBmX25hbWUgICAgICAgICA9IEFSR19ERUYoTlVMTCwgImZwZiIsIDEsCi0gICAgICAgICJGaXJzdCBwYXNzIHN0YXRpc3RpY3MgZmlsZSBuYW1lIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGxpbWl0ID0gQVJHX0RFRihOVUxMLCAibGltaXQiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3AgZW5jb2RpbmcgYWZ0ZXIgbiBpbnB1dCBmcmFtZXMiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgZGVhZGxpbmUgICAgICAgICA9IEFSR19ERUYoImQiLCAiZGVhZGxpbmUiLCAxLAotICAgICAgICAiRGVhZGxpbmUgcGVyIGZyYW1lICh1c2VjKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBiZXN0X2RsICAgICAgICAgID0gQVJHX0RFRihOVUxMLCAiYmVzdCIsIDAsCi0gICAgICAgICJVc2UgQmVzdCBRdWFsaXR5IERlYWRsaW5lIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGdvb2RfZGwgICAgICAgICAgPSBBUkdfREVGKE5VTEwsICJnb29kIiwgMCwKLSAgICAgICAgIlVzZSBHb29kIFF1YWxpdHkgRGVhZGxpbmUiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcnRfZGwgICAgICAgICAgICA9IEFSR19ERUYoTlVMTCwgInJ0IiwgMCwKLSAgICAgICAgIlVzZSBSZWFsdGltZSBRdWFsaXR5IERlYWRsaW5lIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHZlcmJvc2VhcmcgICAgICAgPSBBUkdfREVGKCJ2IiwgInZlcmJvc2UiLCAwLAotICAgICAgICAiU2hvdyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcHNucmFyZyAgICAgICAgICA9IEFSR19ERUYoTlVMTCwgInBzbnIiLCAwLAotICAgICAgICAiU2hvdyBQU05SIGluIHN0YXR1cyBsaW5lIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGZyYW1lcmF0ZSAgICAgICAgPSBBUkdfREVGKE5VTEwsICJmcHMiLCAxLAotICAgICAgICAiU3RyZWFtIGZyYW1lIHJhdGUgKHJhdGUvc2NhbGUpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHVzZV9pdmYgICAgICAgICAgPSBBUkdfREVGKE5VTEwsICJpdmYiLCAwLAotICAgICAgICAiT3V0cHV0IElWRiAoZGVmYXVsdCBpcyBXZWJNKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqbWFpbl9hcmdzW10gPQotewotICAgICZkZWJ1Z21vZGUsCi0gICAgJm91dHB1dGZpbGUsICZjb2RlY2FyZywgJnBhc3NlcywgJnBhc3NfYXJnLCAmZnBmX25hbWUsICZsaW1pdCwgJmRlYWRsaW5lLAotICAgICZiZXN0X2RsLCAmZ29vZF9kbCwgJnJ0X2RsLAotICAgICZ2ZXJib3NlYXJnLCAmcHNucmFyZywgJnVzZV9pdmYsICZmcmFtZXJhdGUsCi0gICAgTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB1c2FnZSAgICAgICAgICAgID0gQVJHX0RFRigidSIsICJ1c2FnZSIsIDEsCi0gICAgICAgICJVc2FnZSBwcm9maWxlIG51bWJlciB0byB1c2UiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgdGhyZWFkcyAgICAgICAgICA9IEFSR19ERUYoInQiLCAidGhyZWFkcyIsIDEsCi0gICAgICAgICJNYXggbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHByb2ZpbGUgICAgICAgICAgPSBBUkdfREVGKE5VTEwsICJwcm9maWxlIiwgMSwKLSAgICAgICAgIkJpdHN0cmVhbSBwcm9maWxlIG51bWJlciB0byB1c2UiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3Qgd2lkdGggICAgICAgICAgICA9IEFSR19ERUYoInciLCAid2lkdGgiLCAxLAotICAgICAgICAiRnJhbWUgd2lkdGgiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgaGVpZ2h0ICAgICAgICAgICA9IEFSR19ERUYoImgiLCAiaGVpZ2h0IiwgMSwKLSAgICAgICAgIkZyYW1lIGhlaWdodCIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB0aW1lYmFzZSAgICAgICAgID0gQVJHX0RFRihOVUxMLCAidGltZWJhc2UiLCAxLAotICAgICAgICAiU3RyZWFtIHRpbWViYXNlIChmcmFtZSBkdXJhdGlvbikiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgZXJyb3JfcmVzaWxpZW50ICA9IEFSR19ERUYoTlVMTCwgImVycm9yLXJlc2lsaWVudCIsIDEsCi0gICAgICAgICJFbmFibGUgZXJyb3IgcmVzaWxpZW5jeSBmZWF0dXJlcyIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBsYWdfaW5fZnJhbWVzICAgID0gQVJHX0RFRihOVUxMLCAibGFnLWluLWZyYW1lcyIsIDEsCi0gICAgICAgICJNYXggbnVtYmVyIG9mIGZyYW1lcyB0byBsYWciKTsKLQotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCAqZ2xvYmFsX2FyZ3NbXSA9Ci17Ci0gICAgJnVzZV95djEyLCAmdXNlX2k0MjAsICZ1c2FnZSwgJnRocmVhZHMsICZwcm9maWxlLAotICAgICZ3aWR0aCwgJmhlaWdodCwgJnRpbWViYXNlLCAmZnJhbWVyYXRlLCAmZXJyb3JfcmVzaWxpZW50LAotICAgICZsYWdfaW5fZnJhbWVzLCBOVUxMCi19OwotCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGRyb3BmcmFtZV90aHJlc2ggICA9IEFSR19ERUYoTlVMTCwgImRyb3AtZnJhbWUiLCAxLAotICAgICAgICAiVGVtcG9yYWwgcmVzYW1wbGluZyB0aHJlc2hvbGQgKGJ1ZiAlKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCByZXNpemVfYWxsb3dlZCAgICAgPSBBUkdfREVGKE5VTEwsICJyZXNpemUtYWxsb3dlZCIsIDEsCi0gICAgICAgICJTcGF0aWFsIHJlc2FtcGxpbmcgZW5hYmxlZCAoYm9vbCkiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcmVzaXplX3VwX3RocmVzaCAgID0gQVJHX0RFRihOVUxMLCAicmVzaXplLXVwIiwgMSwKLSAgICAgICAgIlVwc2NhbGUgdGhyZXNob2xkIChidWYgJSkiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgcmVzaXplX2Rvd25fdGhyZXNoID0gQVJHX0RFRihOVUxMLCAicmVzaXplLWRvd24iLCAxLAotICAgICAgICAiRG93bnNjYWxlIHRocmVzaG9sZCAoYnVmICUpIik7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ19lbnVtX2xpc3QgZW5kX3VzYWdlX2VudW1bXSA9IHsKLSAgICB7InZiciIsIFZQWF9WQlJ9LAotICAgIHsiY2JyIiwgVlBYX0NCUn0sCi0gICAgeyJjcSIsICBWUFhfQ1F9LAotICAgIHtOVUxMLCAwfQotfTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgZW5kX3VzYWdlICAgICAgICAgID0gQVJHX0RFRl9FTlVNKE5VTEwsICJlbmQtdXNhZ2UiLCAxLAotICAgICAgICAiUmF0ZSBjb250cm9sIG1vZGUiLCBlbmRfdXNhZ2VfZW51bSk7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHRhcmdldF9iaXRyYXRlICAgICA9IEFSR19ERUYoTlVMTCwgInRhcmdldC1iaXRyYXRlIiwgMSwKLSAgICAgICAgIkJpdHJhdGUgKGticHMpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IG1pbl9xdWFudGl6ZXIgICAgICA9IEFSR19ERUYoTlVMTCwgIm1pbi1xIiwgMSwKLSAgICAgICAgIk1pbmltdW0gKGJlc3QpIHF1YW50aXplciIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBtYXhfcXVhbnRpemVyICAgICAgPSBBUkdfREVGKE5VTEwsICJtYXgtcSIsIDEsCi0gICAgICAgICJNYXhpbXVtICh3b3JzdCkgcXVhbnRpemVyIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHVuZGVyc2hvb3RfcGN0ICAgICA9IEFSR19ERUYoTlVMTCwgInVuZGVyc2hvb3QtcGN0IiwgMSwKLSAgICAgICAgIkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBvdmVyc2hvb3RfcGN0ICAgICAgPSBBUkdfREVGKE5VTEwsICJvdmVyc2hvb3QtcGN0IiwgMSwKLSAgICAgICAgIkRhdGFyYXRlIG92ZXJzaG9vdCAobWF4KSB0YXJnZXQgKCUpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGJ1Zl9zeiAgICAgICAgICAgICA9IEFSR19ERUYoTlVMTCwgImJ1Zi1zeiIsIDEsCi0gICAgICAgICJDbGllbnQgYnVmZmVyIHNpemUgKG1zKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBidWZfaW5pdGlhbF9zeiAgICAgPSBBUkdfREVGKE5VTEwsICJidWYtaW5pdGlhbC1zeiIsIDEsCi0gICAgICAgICJDbGllbnQgaW5pdGlhbCBidWZmZXIgc2l6ZSAobXMpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGJ1Zl9vcHRpbWFsX3N6ICAgICA9IEFSR19ERUYoTlVMTCwgImJ1Zi1vcHRpbWFsLXN6IiwgMSwKLSAgICAgICAgIkNsaWVudCBvcHRpbWFsIGJ1ZmZlciBzaXplIChtcykiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgKnJjX2FyZ3NbXSA9Ci17Ci0gICAgJmRyb3BmcmFtZV90aHJlc2gsICZyZXNpemVfYWxsb3dlZCwgJnJlc2l6ZV91cF90aHJlc2gsICZyZXNpemVfZG93bl90aHJlc2gsCi0gICAgJmVuZF91c2FnZSwgJnRhcmdldF9iaXRyYXRlLCAmbWluX3F1YW50aXplciwgJm1heF9xdWFudGl6ZXIsCi0gICAgJnVuZGVyc2hvb3RfcGN0LCAmb3ZlcnNob290X3BjdCwgJmJ1Zl9zeiwgJmJ1Zl9pbml0aWFsX3N6LCAmYnVmX29wdGltYWxfc3osCi0gICAgTlVMTAotfTsKLQotCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGJpYXNfcGN0ID0gQVJHX0RFRihOVUxMLCAiYmlhcy1wY3QiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQlIvVkJSIGJpYXMgKDA9Q0JSLCAxMDA9VkJSKSIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBtaW5zZWN0aW9uX3BjdCA9IEFSR19ERUYoTlVMTCwgIm1pbnNlY3Rpb24tcGN0IiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR09QIG1pbiBiaXRyYXRlICglIG9mIHRhcmdldCkiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgbWF4c2VjdGlvbl9wY3QgPSBBUkdfREVGKE5VTEwsICJtYXhzZWN0aW9uLXBjdCIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdPUCBtYXggYml0cmF0ZSAoJSBvZiB0YXJnZXQpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90ICpyY190d29wYXNzX2FyZ3NbXSA9Ci17Ci0gICAgJmJpYXNfcGN0LCAmbWluc2VjdGlvbl9wY3QsICZtYXhzZWN0aW9uX3BjdCwgTlVMTAotfTsKLQotCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGtmX21pbl9kaXN0ID0gQVJHX0RFRihOVUxMLCAia2YtbWluLWRpc3QiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5pbXVtIGtleWZyYW1lIGludGVydmFsIChmcmFtZXMpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGtmX21heF9kaXN0ID0gQVJHX0RFRihOVUxMLCAia2YtbWF4LWRpc3QiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIGtleWZyYW1lIGludGVydmFsIChmcmFtZXMpIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGtmX2Rpc2FibGVkID0gQVJHX0RFRihOVUxMLCAiZGlzYWJsZS1rZiIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2FibGUga2V5ZnJhbWUgcGxhY2VtZW50Iik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90ICprZl9hcmdzW10gPQotewotICAgICZrZl9taW5fZGlzdCwgJmtmX21heF9kaXN0LCAma2ZfZGlzYWJsZWQsIE5VTEwKLX07Ci0KLQotI2lmIENPTkZJR19WUDhfRU5DT0RFUgotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBub2lzZV9zZW5zID0gQVJHX0RFRihOVUxMLCAibm9pc2Utc2Vuc2l0aXZpdHkiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vaXNlIHNlbnNpdGl2aXR5IChmcmFtZXMgdG8gYmx1cikiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3Qgc2hhcnBuZXNzID0gQVJHX0RFRihOVUxMLCAic2hhcnBuZXNzIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbHRlciBzaGFycG5lc3MgKDAtNykiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3Qgc3RhdGljX3RocmVzaCA9IEFSR19ERUYoTlVMTCwgInN0YXRpYy10aHJlc2giLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vdGlvbiBkZXRlY3Rpb24gdGhyZXNob2xkIik7Ci0jZW5kaWYKLQotI2lmIENPTkZJR19WUDhfRU5DT0RFUgotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBjcHVfdXNlZCA9IEFSR19ERUYoTlVMTCwgImNwdS11c2VkIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1BVIFVzZWQgKC0xNi4uMTYpIik7Ci0jZW5kaWYKLQotCi0jaWYgQ09ORklHX1ZQOF9FTkNPREVSCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90IHRva2VuX3BhcnRzID0gQVJHX0RFRihOVUxMLCAidG9rZW4tcGFydHMiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucyB0byB1c2UsIGxvZzIiKTsKLXN0YXRpYyBjb25zdCBhcmdfZGVmX3QgYXV0b19hbHRyZWYgPSBBUkdfREVGKE5VTEwsICJhdXRvLWFsdC1yZWYiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgYXV0b21hdGljIGFsdCByZWZlcmVuY2UgZnJhbWVzIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGFybnJfbWF4ZnJhbWVzID0gQVJHX0RFRihOVUxMLCAiYXJuci1tYXhmcmFtZXMiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHRSZWYgTWF4IEZyYW1lcyIpOwotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCBhcm5yX3N0cmVuZ3RoID0gQVJHX0RFRihOVUxMLCAiYXJuci1zdHJlbmd0aCIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0UmVmIFN0cmVuZ3RoIik7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGFybnJfdHlwZSA9IEFSR19ERUYoTlVMTCwgImFybnItdHlwZSIsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHRSZWYgVHlwZSIpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdfZW51bV9saXN0IHR1bmluZ19lbnVtW10gPSB7Ci0gICAgeyJwc25yIiwgVlA4X1RVTkVfUFNOUn0sCi0gICAgeyJzc2ltIiwgVlA4X1RVTkVfU1NJTX0sCi0gICAge05VTEwsIDB9Ci19Owotc3RhdGljIGNvbnN0IGFyZ19kZWZfdCB0dW5lX3NzaW0gPSBBUkdfREVGX0VOVU0oTlVMTCwgInR1bmUiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF0ZXJpYWwgdG8gZmF2b3IiLCB0dW5pbmdfZW51bSk7Ci1zdGF0aWMgY29uc3QgYXJnX2RlZl90IGNxX2xldmVsID0gQVJHX0RFRihOVUxMLCAiY3EtbGV2ZWwiLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3RyYWluZWQgUXVhbGl0eSBMZXZlbCIpOwotCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90ICp2cDhfYXJnc1tdID0KLXsKLSAgICAmY3B1X3VzZWQsICZhdXRvX2FsdHJlZiwgJm5vaXNlX3NlbnMsICZzaGFycG5lc3MsICZzdGF0aWNfdGhyZXNoLAotICAgICZ0b2tlbl9wYXJ0cywgJmFybnJfbWF4ZnJhbWVzLCAmYXJucl9zdHJlbmd0aCwgJmFybnJfdHlwZSwKLSAgICAmdHVuZV9zc2ltLCAmY3FfbGV2ZWwsIE5VTEwKLX07Ci1zdGF0aWMgY29uc3QgaW50IHZwOF9hcmdfY3RybF9tYXBbXSA9Ci17Ci0gICAgVlA4RV9TRVRfQ1BVVVNFRCwgVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwKLSAgICBWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWSwgVlA4RV9TRVRfU0hBUlBORVNTLCBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELAotICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCi0gICAgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsIFZQOEVfU0VUX0FSTlJfU1RSRU5HVEggLCBWUDhFX1NFVF9BUk5SX1RZUEUsCi0gICAgVlA4RV9TRVRfVFVOSU5HLCBWUDhFX1NFVF9DUV9MRVZFTCwgMAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgYXJnX2RlZl90ICpub19hcmdzW10gPSB7IE5VTEwgfTsKLQotc3RhdGljIHZvaWQgdXNhZ2VfZXhpdCgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyA8b3B0aW9ucz4gLW8gZHN0X2ZpbGVuYW1lIHNyY19maWxlbmFtZSBcbiIsCi0gICAgICAgICAgICBleGVjX25hbWUpOwotCi0gICAgZnByaW50ZihzdGRlcnIsICJcbk9wdGlvbnM6XG4iKTsKLSAgICBhcmdfc2hvd191c2FnZShzdGRvdXQsIG1haW5fYXJncyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJcbkVuY29kZXIgR2xvYmFsIE9wdGlvbnM6XG4iKTsKLSAgICBhcmdfc2hvd191c2FnZShzdGRvdXQsIGdsb2JhbF9hcmdzKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuUmF0ZSBDb250cm9sIE9wdGlvbnM6XG4iKTsKLSAgICBhcmdfc2hvd191c2FnZShzdGRvdXQsIHJjX2FyZ3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXG5Ud29wYXNzIFJhdGUgQ29udHJvbCBPcHRpb25zOlxuIik7Ci0gICAgYXJnX3Nob3dfdXNhZ2Uoc3Rkb3V0LCByY190d29wYXNzX2FyZ3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXG5LZXlmcmFtZSBQbGFjZW1lbnQgT3B0aW9uczpcbiIpOwotICAgIGFyZ19zaG93X3VzYWdlKHN0ZG91dCwga2ZfYXJncyk7Ci0jaWYgQ09ORklHX1ZQOF9FTkNPREVSCi0gICAgZnByaW50ZihzdGRlcnIsICJcblZQOCBTcGVjaWZpYyBPcHRpb25zOlxuIik7Ci0gICAgYXJnX3Nob3dfdXNhZ2Uoc3Rkb3V0LCB2cDhfYXJncyk7Ci0jZW5kaWYKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICAiSW5jbHVkZWQgZW5jb2RlcnM6XG4iCi0gICAgICAgICAgICJcbiIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihjb2RlY3MpIC8gc2l6ZW9mKGNvZGVjc1swXSk7IGkrKykKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgJS02cyAtICVzXG4iLAotICAgICAgICAgICAgICAgY29kZWNzW2ldLm5hbWUsCi0gICAgICAgICAgICAgICB2cHhfY29kZWNfaWZhY2VfbmFtZShjb2RlY3NbaV0uaWZhY2UpKTsKLQotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotI2RlZmluZSBBUkdfQ1RSTF9DTlRfTUFYIDEwCi0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2XykKLXsKLSAgICB2cHhfY29kZWNfY3R4X3QgICAgICAgIGVuY29kZXI7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICppbl9mbiA9IE5VTEwsICpvdXRfZm4gPSBOVUxMLCAqc3RhdHNfZm4gPSBOVUxMOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICAgKmluZmlsZSwgKm91dGZpbGU7Ci0gICAgdnB4X2NvZGVjX2VuY19jZmdfdCAgICBjZmc7Ci0gICAgdnB4X2NvZGVjX2Vycl90ICAgICAgICByZXM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBwYXNzLCBvbmVfcGFzc19vbmx5ID0gMDsKLSAgICBzdGF0c19pb190ICAgICAgICAgICAgIHN0YXRzOwotICAgIHZweF9pbWFnZV90ICAgICAgICAgICAgcmF3OwotICAgIGNvbnN0IHN0cnVjdCBjb2RlY19pdGVtICAqY29kZWMgPSBjb2RlY3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBmcmFtZV9hdmFpbCwgZ290X2RhdGE7Ci0KLSAgICBzdHJ1Y3QgYXJnICAgICAgICAgICAgICAgYXJnOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgKiphcmd2LCAqKmFyZ2ksICoqYXJnajsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgYXJnX3VzYWdlID0gMCwgYXJnX3Bhc3NlcyA9IDEsIGFyZ19kZWFkbGluZSA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGFyZ19jdHJsc1tBUkdfQ1RSTF9DTlRfTUFYXVsyXSwgYXJnX2N0cmxfY250ID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpbWl0ID0gMDsKLSAgICBzdGF0aWMgY29uc3QgYXJnX2RlZl90ICoqY3RybF9hcmdzID0gbm9fYXJnczsKLSAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgICAqY3RybF9hcmdzX21hcCA9IE5VTEw7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSAwLCBzaG93X3BzbnIgPSAwOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICBhcmdfdXNlX2k0MjAgPSAxOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBjeF90aW1lID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgZmlsZV90eXBlLCBmb3VyY2M7Ci0gICAgeTRtX2lucHV0ICAgICAgICAgICAgICAgIHk0bTsKLSAgICBzdHJ1Y3QgdnB4X3JhdGlvbmFsICAgICAgYXJnX2ZyYW1lcmF0ZSA9IHszMCwgMX07Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGFyZ19oYXZlX2ZyYW1lcmF0ZSA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3dlYm0gPSAxOwotICAgIEVibWxHbG9iYWwgICAgICAgICAgICAgICBlYm1sID0gezB9OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBoYXNoID0gMDsKLSAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgcHNucl9zc2VfdG90YWwgPSAwOwotICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICBwc25yX3NhbXBsZXNfdG90YWwgPSAwOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBwc25yX3RvdGFsc1s0XSA9IHswLCAwLCAwLCAwfTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcHNucl9jb3VudCA9IDA7Ci0KLSAgICBleGVjX25hbWUgPSBhcmd2X1swXTsKLSAgICBlYm1sLmxhc3RfcHRzX21zID0gLTE7Ci0KLSAgICBpZiAoYXJnYyA8IDMpCi0gICAgICAgIHVzYWdlX2V4aXQoKTsKLQotCi0gICAgLyogRmlyc3QgcGFyc2UgdGhlIGNvZGVjIGFuZCB1c2FnZSB2YWx1ZXMsIGJlY2F1c2Ugd2Ugd2FudCB0byBhcHBseSBvdGhlcgotICAgICAqIHBhcmFtZXRlcnMgb24gdG9wIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdGhlIGNvZGVjLgotICAgICAqLwotICAgIGFyZ3YgPSBhcmd2X2R1cChhcmdjIC0gMSwgYXJndl8gKyAxKTsKLQotICAgIGZvciAoYXJnaSA9IGFyZ2ogPSBhcmd2OyAoKmFyZ2ogPSAqYXJnaSk7IGFyZ2kgKz0gYXJnLmFyZ3Zfc3RlcCkKLSAgICB7Ci0gICAgICAgIGFyZy5hcmd2X3N0ZXAgPSAxOwotCi0gICAgICAgIGlmIChhcmdfbWF0Y2goJmFyZywgJmNvZGVjYXJnLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGosIGsgPSAtMTsKLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemVvZihjb2RlY3MpIC8gc2l6ZW9mKGNvZGVjc1swXSk7IGorKykKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChjb2RlY3Nbal0ubmFtZSwgYXJnLnZhbCkpCi0gICAgICAgICAgICAgICAgICAgIGsgPSBqOwotCi0gICAgICAgICAgICBpZiAoayA+PSAwKQotICAgICAgICAgICAgICAgIGNvZGVjID0gY29kZWNzICsgazsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkaWUoIkVycm9yOiBVbnJlY29nbml6ZWQgYXJndW1lbnQgKCVzKSB0byAtLWNvZGVjXG4iLAotICAgICAgICAgICAgICAgICAgICBhcmcudmFsKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcGFzc2VzLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJnX3Bhc3NlcyA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotCi0gICAgICAgICAgICBpZiAoYXJnX3Bhc3NlcyA8IDEgfHwgYXJnX3Bhc3NlcyA+IDIpCi0gICAgICAgICAgICAgICAgZGllKCJFcnJvcjogSW52YWxpZCBudW1iZXIgb2YgcGFzc2VzICglZClcbiIsIGFyZ19wYXNzZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcGFzc19hcmcsIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvbmVfcGFzc19vbmx5ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0KLSAgICAgICAgICAgIGlmIChvbmVfcGFzc19vbmx5IDwgMSB8fCBvbmVfcGFzc19vbmx5ID4gMikKLSAgICAgICAgICAgICAgICBkaWUoIkVycm9yOiBJbnZhbGlkIHBhc3Mgc2VsZWN0ZWQgKCVkKVxuIiwgb25lX3Bhc3Nfb25seSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZmcGZfbmFtZSwgYXJnaSkpCi0gICAgICAgICAgICBzdGF0c19mbiA9IGFyZy52YWw7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdXNhZ2UsIGFyZ2kpKQotICAgICAgICAgICAgYXJnX3VzYWdlID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZGVhZGxpbmUsIGFyZ2kpKQotICAgICAgICAgICAgYXJnX2RlYWRsaW5lID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYmVzdF9kbCwgYXJnaSkpCi0gICAgICAgICAgICBhcmdfZGVhZGxpbmUgPSBWUFhfRExfQkVTVF9RVUFMSVRZOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmdvb2RfZGwsIGFyZ2kpKQotICAgICAgICAgICAgYXJnX2RlYWRsaW5lID0gVlBYX0RMX0dPT0RfUVVBTElUWTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZydF9kbCwgYXJnaSkpCi0gICAgICAgICAgICBhcmdfZGVhZGxpbmUgPSBWUFhfRExfUkVBTFRJTUU7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdXNlX3l2MTIsIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmdfdXNlX2k0MjAgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdXNlX2k0MjAsIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmdfdXNlX2k0MjAgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdmVyYm9zZWFyZywgYXJnaSkpCi0gICAgICAgICAgICB2ZXJib3NlID0gMTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZsaW1pdCwgYXJnaSkpCi0gICAgICAgICAgICBhcmdfbGltaXQgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZwc25yYXJnLCBhcmdpKSkKLSAgICAgICAgICAgIHNob3dfcHNuciA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZnJhbWVyYXRlLCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJnX2ZyYW1lcmF0ZSA9IGFyZ19wYXJzZV9yYXRpb25hbCgmYXJnKTsKLSAgICAgICAgICAgIGFyZ19oYXZlX2ZyYW1lcmF0ZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZ1c2VfaXZmLCBhcmdpKSkKLSAgICAgICAgICAgIHdyaXRlX3dlYm0gPSAwOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm91dHB1dGZpbGUsIGFyZ2kpKQotICAgICAgICAgICAgb3V0X2ZuID0gYXJnLnZhbDsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZkZWJ1Z21vZGUsIGFyZ2kpKQotICAgICAgICAgICAgZWJtbC5kZWJ1ZyA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFyZ2orKzsKLSAgICB9Ci0KLSAgICAvKiBFbnN1cmUgdGhhdCAtLXBhc3NlcyBhbmQgLS1wYXNzIGFyZSBjb25zaXN0ZW50LiBJZiAtLXBhc3MgaXMgc2V0IGFuZCAtLXBhc3Nlcz0yLAotICAgICAqIGVuc3VyZSAtLWZwZiB3YXMgc2V0LgotICAgICAqLwotICAgIGlmIChvbmVfcGFzc19vbmx5KQotICAgIHsKLSAgICAgICAgLyogRFdJTTogQXNzdW1lIHRoZSB1c2VyIG1lYW50IHBhc3Nlcz0yIGlmIHBhc3M9MiBpcyBzcGVjaWZpZWQgKi8KLSAgICAgICAgaWYgKG9uZV9wYXNzX29ubHkgPiBhcmdfcGFzc2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IEFzc3VtaW5nIC0tcGFzcz0lZCBpbXBsaWVzIC0tcGFzc2VzPSVkXG4iLAotICAgICAgICAgICAgICAgICAgIG9uZV9wYXNzX29ubHksIG9uZV9wYXNzX29ubHkpOwotICAgICAgICAgICAgYXJnX3Bhc3NlcyA9IG9uZV9wYXNzX29ubHk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXJnX3Bhc3NlcyA9PSAyICYmICFzdGF0c19mbikKLSAgICAgICAgICAgIGRpZSgiTXVzdCBzcGVjaWZ5IC0tZnBmIHdoZW4gLS1wYXNzPSVkIGFuZCAtLXBhc3Nlcz0yXG4iLCBvbmVfcGFzc19vbmx5KTsKLSAgICB9Ci0KLSAgICAvKiBQb3B1bGF0ZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KLSAgICByZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KGNvZGVjLT5pZmFjZSwgJmNmZywgYXJnX3VzYWdlKTsKLQotICAgIGlmIChyZXMpCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgY29uZmlnOiAlc1xuIiwKLSAgICAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXMpKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2UgdGhlIGRlZmF1bHQgdGltZWJhc2UgdG8gYSBoaWdoIGVub3VnaCB2YWx1ZSBzbyB0aGF0IHRoZSBlbmNvZGVyCi0gICAgICogd2lsbCBhbHdheXMgY3JlYXRlIHN0cmljdGx5IGluY3JlYXNpbmcgdGltZXN0YW1wcy4KLSAgICAgKi8KLSAgICBjZmcuZ190aW1lYmFzZS5kZW4gPSAxMDAwOwotCi0gICAgLyogTmV2ZXIgdXNlIHRoZSBsaWJyYXJ5J3MgZGVmYXVsdCByZXNvbHV0aW9uLCByZXF1aXJlIGl0IGJlIHBhcnNlZAotICAgICAqIGZyb20gdGhlIGZpbGUgb3Igc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgY2ZnLmdfdyA9IDA7Ci0gICAgY2ZnLmdfaCA9IDA7Ci0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgcGFyYW1ldGVycy4gKi8KLSAgICBmb3IgKGFyZ2kgPSBhcmdqID0gYXJndjsgKCphcmdqID0gKmFyZ2kpOyBhcmdpICs9IGFyZy5hcmd2X3N0ZXApCi0gICAgewotICAgICAgICBhcmcuYXJndl9zdGVwID0gMTsKLQotICAgICAgICBpZiAoMCk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdGhyZWFkcywgYXJnaSkpCi0gICAgICAgICAgICBjZmcuZ190aHJlYWRzID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcHJvZmlsZSwgYXJnaSkpCi0gICAgICAgICAgICBjZmcuZ19wcm9maWxlID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmd2lkdGgsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLmdfdyA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmhlaWdodCwgYXJnaSkpCi0gICAgICAgICAgICBjZmcuZ19oID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdGltZWJhc2UsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLmdfdGltZWJhc2UgPSBhcmdfcGFyc2VfcmF0aW9uYWwoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmZXJyb3JfcmVzaWxpZW50LCBhcmdpKSkKLSAgICAgICAgICAgIGNmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmxhZ19pbl9mcmFtZXMsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLmdfbGFnX2luX2ZyYW1lcyA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmRyb3BmcmFtZV90aHJlc2gsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLnJjX2Ryb3BmcmFtZV90aHJlc2ggPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZyZXNpemVfYWxsb3dlZCwgYXJnaSkpCi0gICAgICAgICAgICBjZmcucmNfcmVzaXplX2FsbG93ZWQgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZyZXNpemVfdXBfdGhyZXNoLCBhcmdpKSkKLSAgICAgICAgICAgIGNmZy5yY19yZXNpemVfdXBfdGhyZXNoID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmcmVzaXplX2Rvd25fdGhyZXNoLCBhcmdpKSkKLSAgICAgICAgICAgIGNmZy5yY19yZXNpemVfZG93bl90aHJlc2ggPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZyZXNpemVfZG93bl90aHJlc2gsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLnJjX3Jlc2l6ZV9kb3duX3RocmVzaCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmVuZF91c2FnZSwgYXJnaSkpCi0gICAgICAgICAgICBjZmcucmNfZW5kX3VzYWdlID0gYXJnX3BhcnNlX2VudW1fb3JfaW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJnRhcmdldF9iaXRyYXRlLCBhcmdpKSkKLSAgICAgICAgICAgIGNmZy5yY190YXJnZXRfYml0cmF0ZSA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm1pbl9xdWFudGl6ZXIsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLnJjX21pbl9xdWFudGl6ZXIgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZtYXhfcXVhbnRpemVyLCBhcmdpKSkKLSAgICAgICAgICAgIGNmZy5yY19tYXhfcXVhbnRpemVyID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmdW5kZXJzaG9vdF9wY3QsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLnJjX3VuZGVyc2hvb3RfcGN0ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmb3ZlcnNob290X3BjdCwgYXJnaSkpCi0gICAgICAgICAgICBjZmcucmNfb3ZlcnNob290X3BjdCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJmJ1Zl9zeiwgYXJnaSkpCi0gICAgICAgICAgICBjZmcucmNfYnVmX3N6ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYnVmX2luaXRpYWxfc3osIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLnJjX2J1Zl9pbml0aWFsX3N6ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYnVmX29wdGltYWxfc3osIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLnJjX2J1Zl9vcHRpbWFsX3N6ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAmYmlhc19wY3QsIGFyZ2kpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjZmcucmNfMnBhc3NfdmJyX2JpYXNfcGN0ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0KLSAgICAgICAgICAgIGlmIChhcmdfcGFzc2VzIDwgMikKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBvcHRpb24gJXMgaWdub3JlZCBpbiBvbmUtcGFzcyBtb2RlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmdfbWF0Y2goJmFyZywgJm1pbnNlY3Rpb25fcGN0LCBhcmdpKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdCA9IGFyZ19wYXJzZV91aW50KCZhcmcpOwotCi0gICAgICAgICAgICBpZiAoYXJnX3Bhc3NlcyA8IDIpCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogb3B0aW9uICVzIGlnbm9yZWQgaW4gb25lLXBhc3MgbW9kZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmcubmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJnX21hdGNoKCZhcmcsICZtYXhzZWN0aW9uX3BjdCwgYXJnaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNmZy5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QgPSBhcmdfcGFyc2VfdWludCgmYXJnKTsKLQotICAgICAgICAgICAgaWYgKGFyZ19wYXNzZXMgPCAyKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IG9wdGlvbiAlcyBpZ25vcmVkIGluIG9uZS1wYXNzIG1vZGUuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJnLm5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAma2ZfbWluX2Rpc3QsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLmtmX21pbl9kaXN0ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAma2ZfbWF4X2Rpc3QsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLmtmX21heF9kaXN0ID0gYXJnX3BhcnNlX3VpbnQoJmFyZyk7Ci0gICAgICAgIGVsc2UgaWYgKGFyZ19tYXRjaCgmYXJnLCAma2ZfZGlzYWJsZWQsIGFyZ2kpKQotICAgICAgICAgICAgY2ZnLmtmX21vZGUgPSBWUFhfS0ZfRElTQUJMRUQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFyZ2orKzsKLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgY29kZWMgc3BlY2lmaWMgb3B0aW9ucyAqLwotI2lmIENPTkZJR19WUDhfRU5DT0RFUgotCi0gICAgaWYgKGNvZGVjLT5pZmFjZSA9PSAmdnB4X2NvZGVjX3ZwOF9jeF9hbGdvKQotICAgIHsKLSAgICAgICAgY3RybF9hcmdzID0gdnA4X2FyZ3M7Ci0gICAgICAgIGN0cmxfYXJnc19tYXAgPSB2cDhfYXJnX2N0cmxfbWFwOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBmb3IgKGFyZ2kgPSBhcmdqID0gYXJndjsgKCphcmdqID0gKmFyZ2kpOyBhcmdpICs9IGFyZy5hcmd2X3N0ZXApCi0gICAgewotICAgICAgICBpbnQgbWF0Y2ggPSAwOwotCi0gICAgICAgIGFyZy5hcmd2X3N0ZXAgPSAxOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGN0cmxfYXJnc1tpXTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJnX21hdGNoKCZhcmcsIGN0cmxfYXJnc1tpXSwgYXJnaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggPSAxOwotCi0gICAgICAgICAgICAgICAgaWYgKGFyZ19jdHJsX2NudCA8IEFSR19DVFJMX0NOVF9NQVgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcmdfY3RybHNbYXJnX2N0cmxfY250XVswXSA9IGN0cmxfYXJnc19tYXBbaV07Ci0gICAgICAgICAgICAgICAgICAgIGFyZ19jdHJsc1thcmdfY3RybF9jbnRdWzFdID0gYXJnX3BhcnNlX2VudW1fb3JfaW50KCZhcmcpOwotICAgICAgICAgICAgICAgICAgICBhcmdfY3RybF9jbnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1hdGNoKQotICAgICAgICAgICAgYXJnaisrOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciB1bnJlY29nbml6ZWQgb3B0aW9ucyAqLwotICAgIGZvciAoYXJnaSA9IGFyZ3Y7ICphcmdpOyBhcmdpKyspCi0gICAgICAgIGlmIChhcmdpWzBdWzBdID09ICctJyAmJiBhcmdpWzBdWzFdKQotICAgICAgICAgICAgZGllKCJFcnJvcjogVW5yZWNvZ25pemVkIG9wdGlvbiAlc1xuIiwgKmFyZ2kpOwotCi0gICAgLyogSGFuZGxlIG5vbi1vcHRpb24gYXJndW1lbnRzICovCi0gICAgaW5fZm4gPSBhcmd2WzBdOwotCi0gICAgaWYgKCFpbl9mbikKLSAgICAgICAgdXNhZ2VfZXhpdCgpOwotCi0gICAgaWYoIW91dF9mbikKLSAgICAgICAgZGllKCJFcnJvcjogT3V0cHV0IGZpbGUgaXMgcmVxdWlyZWQgKHNwZWNpZnkgd2l0aCAtbylcbiIpOwotCi0gICAgbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0KLSAgICBmb3IgKHBhc3MgPSBvbmVfcGFzc19vbmx5ID8gb25lX3Bhc3Nfb25seSAtIDEgOiAwOyBwYXNzIDwgYXJnX3Bhc3NlczsgcGFzcysrKQotICAgIHsKLSAgICAgICAgaW50IGZyYW1lc19pbiA9IDAsIGZyYW1lc19vdXQgPSAwOwotICAgICAgICB1bnNpZ25lZCBsb25nIG5ieXRlcyA9IDA7Ci0gICAgICAgIHN0cnVjdCBkZXRlY3RfYnVmZmVyIGRldGVjdDsKLQotICAgICAgICAvKiBQYXJzZSBjZXJ0YWluIG9wdGlvbnMgZnJvbSB0aGUgaW5wdXQgZmlsZSwgaWYgcG9zc2libGUgKi8KLSAgICAgICAgaW5maWxlID0gc3RyY21wKGluX2ZuLCAiLSIpID8gZm9wZW4oaW5fZm4sICJyYiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNldF9iaW5hcnlfbW9kZShzdGRpbik7Ci0KLSAgICAgICAgaWYgKCFpbmZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRm9yIFJBVyBpbnB1dCBzb3VyY2VzLCB0aGVzZSBieXRlcyB3aWxsIGFwcGxpZWQgb24gdGhlIGZpcnN0IGZyYW1lCi0gICAgICAgICAqICBpbiByZWFkX2ZyYW1lKCkuCi0gICAgICAgICAqLwotICAgICAgICBkZXRlY3QuYnVmX3JlYWQgPSBmcmVhZChkZXRlY3QuYnVmLCAxLCA0LCBpbmZpbGUpOwotICAgICAgICBkZXRlY3QucG9zaXRpb24gPSAwOwotCi0gICAgICAgIGlmIChkZXRlY3QuYnVmX3JlYWQgPT0gNCAmJiBmaWxlX2lzX3k0bShpbmZpbGUsICZ5NG0sIGRldGVjdC5idWYpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeTRtX2lucHV0X29wZW4oJnk0bSwgaW5maWxlLCBkZXRlY3QuYnVmLCA0KSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IEZJTEVfVFlQRV9ZNE07Ci0gICAgICAgICAgICAgICAgY2ZnLmdfdyA9IHk0bS5waWNfdzsKLSAgICAgICAgICAgICAgICBjZmcuZ19oID0geTRtLnBpY19oOwotCi0gICAgICAgICAgICAgICAgLyogVXNlIHRoZSBmcmFtZSByYXRlIGZyb20gdGhlIGZpbGUgb25seSBpZiBub25lIHdhcyBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgKiBvbiB0aGUgY29tbWFuZC1saW5lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICghYXJnX2hhdmVfZnJhbWVyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnX2ZyYW1lcmF0ZS5udW0gPSB5NG0uZnBzX247Ci0gICAgICAgICAgICAgICAgICAgIGFyZ19mcmFtZXJhdGUuZGVuID0geTRtLmZwc19kOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFyZ191c2VfaTQyMCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBZNE0gc3RyZWFtLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkZXRlY3QuYnVmX3JlYWQgPT0gNCAmJgotICAgICAgICAgICAgICAgICBmaWxlX2lzX2l2ZihpbmZpbGUsICZmb3VyY2MsICZjZmcuZ193LCAmY2ZnLmdfaCwgJmRldGVjdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVfdHlwZSA9IEZJTEVfVFlQRV9JVkY7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZvdXJjYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMHgzMjMxNTY1OToKLSAgICAgICAgICAgICAgICBhcmdfdXNlX2k0MjAgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDMwMzIzNDQ5OgotICAgICAgICAgICAgICAgIGFyZ191c2VfaTQyMCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgZm91cmNjICglMDh4KSBpbiBJVkZcbiIsIGZvdXJjYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVfdHlwZSA9IEZJTEVfVFlQRV9SQVc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZighY2ZnLmdfdyB8fCAhY2ZnLmdfaCkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTcGVjaWZ5IHN0cmVhbSBkaW1lbnNpb25zIHdpdGggLS13aWR0aCAoLXcpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCAtLWhlaWdodCAoLWgpLlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICB9Ci0KLSNkZWZpbmUgU0hPVyhmaWVsZCkgZnByaW50ZihzdGRlcnIsICIgICAgJS0yOHMgPSAlZFxuIiwgI2ZpZWxkLCBjZmcuZmllbGQpCi0KLSAgICAgICAgaWYgKHZlcmJvc2UgJiYgcGFzcyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvZGVjOiAlc1xuIiwgdnB4X2NvZGVjX2lmYWNlX25hbWUoY29kZWMtPmlmYWNlKSk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNvdXJjZSBmaWxlOiAlcyBGb3JtYXQ6ICVzXG4iLCBpbl9mbiwKLSAgICAgICAgICAgICAgICAgICAgYXJnX3VzZV9pNDIwID8gIkk0MjAiIDogIllWMTIiKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVzdGluYXRpb24gZmlsZTogJXNcbiIsIG91dF9mbik7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVuY29kZXIgcGFyYW1ldGVyczpcbiIpOwotCi0gICAgICAgICAgICBTSE9XKGdfdXNhZ2UpOwotICAgICAgICAgICAgU0hPVyhnX3RocmVhZHMpOwotICAgICAgICAgICAgU0hPVyhnX3Byb2ZpbGUpOwotICAgICAgICAgICAgU0hPVyhnX3cpOwotICAgICAgICAgICAgU0hPVyhnX2gpOwotICAgICAgICAgICAgU0hPVyhnX3RpbWViYXNlLm51bSk7Ci0gICAgICAgICAgICBTSE9XKGdfdGltZWJhc2UuZGVuKTsKLSAgICAgICAgICAgIFNIT1coZ19lcnJvcl9yZXNpbGllbnQpOwotICAgICAgICAgICAgU0hPVyhnX3Bhc3MpOwotICAgICAgICAgICAgU0hPVyhnX2xhZ19pbl9mcmFtZXMpOwotICAgICAgICAgICAgU0hPVyhyY19kcm9wZnJhbWVfdGhyZXNoKTsKLSAgICAgICAgICAgIFNIT1cocmNfcmVzaXplX2FsbG93ZWQpOwotICAgICAgICAgICAgU0hPVyhyY19yZXNpemVfdXBfdGhyZXNoKTsKLSAgICAgICAgICAgIFNIT1cocmNfcmVzaXplX2Rvd25fdGhyZXNoKTsKLSAgICAgICAgICAgIFNIT1cocmNfZW5kX3VzYWdlKTsKLSAgICAgICAgICAgIFNIT1cocmNfdGFyZ2V0X2JpdHJhdGUpOwotICAgICAgICAgICAgU0hPVyhyY19taW5fcXVhbnRpemVyKTsKLSAgICAgICAgICAgIFNIT1cocmNfbWF4X3F1YW50aXplcik7Ci0gICAgICAgICAgICBTSE9XKHJjX3VuZGVyc2hvb3RfcGN0KTsKLSAgICAgICAgICAgIFNIT1cocmNfb3ZlcnNob290X3BjdCk7Ci0gICAgICAgICAgICBTSE9XKHJjX2J1Zl9zeik7Ci0gICAgICAgICAgICBTSE9XKHJjX2J1Zl9pbml0aWFsX3N6KTsKLSAgICAgICAgICAgIFNIT1cocmNfYnVmX29wdGltYWxfc3opOwotICAgICAgICAgICAgU0hPVyhyY18ycGFzc192YnJfYmlhc19wY3QpOwotICAgICAgICAgICAgU0hPVyhyY18ycGFzc192YnJfbWluc2VjdGlvbl9wY3QpOwotICAgICAgICAgICAgU0hPVyhyY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QpOwotICAgICAgICAgICAgU0hPVyhrZl9tb2RlKTsKLSAgICAgICAgICAgIFNIT1coa2ZfbWluX2Rpc3QpOwotICAgICAgICAgICAgU0hPVyhrZl9tYXhfZGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwYXNzID09IChvbmVfcGFzc19vbmx5ID8gb25lX3Bhc3Nfb25seSAtIDEgOiAwKSkgewotICAgICAgICAgICAgaWYgKGZpbGVfdHlwZSA9PSBGSUxFX1RZUEVfWTRNKQotICAgICAgICAgICAgICAgIC8qVGhlIFk0TSByZWFkZXIgZG9lcyBpdHMgb3duIGFsbG9jYXRpb24uCi0gICAgICAgICAgICAgICAgICBKdXN0IGluaXRpYWxpemUgdGhpcyBoZXJlIHRvIGF2b2lkIHByb2JsZW1zIGlmIHdlIG5ldmVyIHJlYWQgYW55Ci0gICAgICAgICAgICAgICAgICAgZnJhbWVzLiovCi0gICAgICAgICAgICAgICAgbWVtc2V0KCZyYXcsIDAsIHNpemVvZihyYXcpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2cHhfaW1nX2FsbG9jKCZyYXcsIGFyZ191c2VfaTQyMCA/IFZQWF9JTUdfRk1UX0k0MjAgOiBWUFhfSU1HX0ZNVF9ZVjEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLmdfdywgY2ZnLmdfaCwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRmaWxlID0gc3RyY21wKG91dF9mbiwgIi0iKSA/IGZvcGVuKG91dF9mbiwgIndiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXRfYmluYXJ5X21vZGUoc3Rkb3V0KTsKLQotICAgICAgICBpZiAoIW91dGZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHdyaXRlX3dlYm0gJiYgZnNlZWsob3V0ZmlsZSwgMCwgU0VFS19DVVIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldlYk0gb3V0cHV0IHRvIHBpcGVzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHNfZm4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RhdHNfb3Blbl9maWxlKCZzdGF0cywgc3RhdHNfZm4sIHBhc3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gc3RhdGlzdGljcyBzdG9yZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RhdHNfb3Blbl9tZW0oJnN0YXRzLCBwYXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIHN0YXRpc3RpY3Mgc3RvcmVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjZmcuZ19wYXNzID0gYXJnX3Bhc3NlcyA9PSAyCi0gICAgICAgICAgICAgICAgICAgICA/IHBhc3MgPyBWUFhfUkNfTEFTVF9QQVNTIDogVlBYX1JDX0ZJUlNUX1BBU1MKLSAgICAgICAgICAgICAgICAgOiBWUFhfUkNfT05FX1BBU1M7Ci0jaWYgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04gPiAoMSArIFZQWF9DT0RFQ19BQklfVkVSU0lPTikKLQotICAgICAgICBpZiAocGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgY2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4gPSBzdGF0c19nZXQoJnN0YXRzKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBpZih3cml0ZV93ZWJtKQotICAgICAgICB7Ci0gICAgICAgICAgICBlYm1sLnN0cmVhbSA9IG91dGZpbGU7Ci0gICAgICAgICAgICB3cml0ZV93ZWJtX2ZpbGVfaGVhZGVyKCZlYm1sLCAmY2ZnLCAmYXJnX2ZyYW1lcmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd3JpdGVfaXZmX2ZpbGVfaGVhZGVyKG91dGZpbGUsICZjZmcsIGNvZGVjLT5mb3VyY2MsIDApOwotCi0KLSAgICAgICAgLyogQ29uc3RydWN0IEVuY29kZXIgQ29udGV4dCAqLwotICAgICAgICB2cHhfY29kZWNfZW5jX2luaXQoJmVuY29kZXIsIGNvZGVjLT5pZmFjZSwgJmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcHNuciA/IFZQWF9DT0RFQ19VU0VfUFNOUiA6IDApOwotICAgICAgICBjdHhfZXhpdF9vbl9lcnJvcigmZW5jb2RlciwgIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKLQotICAgICAgICAvKiBOb3RlIHRoYXQgd2UgYnlwYXNzIHRoZSB2cHhfY29kZWNfY29udHJvbCB3cmFwcGVyIG1hY3JvIGJlY2F1c2UKLSAgICAgICAgICogd2UncmUgYmVpbmcgY2xldmVyIHRvIHN0b3JlIHRoZSBjb250cm9sIElEcyBpbiBhbiBhcnJheS4gUmVhbAotICAgICAgICAgKiBhcHBsaWNhdGlvbnMgd2lsbCB3YW50IHRvIG1ha2UgdXNlIG9mIHRoZSBlbnVtZXJhdGlvbnMgZGlyZWN0bHkKLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdfY3RybF9jbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZweF9jb2RlY19jb250cm9sXygmZW5jb2RlciwgYXJnX2N0cmxzW2ldWzBdLCBhcmdfY3RybHNbaV1bMV0pKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFRyaWVkIHRvIHNldCBjb250cm9sICVkID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdfY3RybHNbaV1bMF0sIGFyZ19jdHJsc1tpXVsxXSk7Ci0KLSAgICAgICAgICAgIGN0eF9leGl0X29uX2Vycm9yKCZlbmNvZGVyLCAiRmFpbGVkIHRvIGNvbnRyb2wgY29kZWMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYW1lX2F2YWlsID0gMTsKLSAgICAgICAgZ290X2RhdGEgPSAwOwotCi0gICAgICAgIHdoaWxlIChmcmFtZV9hdmFpbCB8fCBnb3RfZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKLSAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCAqcGt0OwotICAgICAgICAgICAgc3RydWN0IHZweF91c2VjX3RpbWVyIHRpbWVyOwotICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9zdGFydCwgbmV4dF9mcmFtZV9zdGFydDsKLQotICAgICAgICAgICAgaWYgKCFhcmdfbGltaXQgfHwgZnJhbWVzX2luIDwgYXJnX2xpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1lX2F2YWlsID0gcmVhZF9mcmFtZShpbmZpbGUsICZyYXcsIGZpbGVfdHlwZSwgJnk0bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldGVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVfYXZhaWwpCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lc19pbisrOwotCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHJQYXNzICVkLyVkIGZyYW1lICU0ZC8lLTRkICU3bGRCIFwwMzNbSyIsIHBhc3MgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3Bhc3NlcywgZnJhbWVzX2luLCBmcmFtZXNfb3V0LCBuYnl0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZyYW1lX2F2YWlsID0gMDsKLQotICAgICAgICAgICAgdnB4X3VzZWNfdGltZXJfc3RhcnQoJnRpbWVyKTsKLQotICAgICAgICAgICAgZnJhbWVfc3RhcnQgPSAoY2ZnLmdfdGltZWJhc2UuZGVuICogKGludDY0X3QpKGZyYW1lc19pbiAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogYXJnX2ZyYW1lcmF0ZS5kZW4pIC8gY2ZnLmdfdGltZWJhc2UubnVtIC8gYXJnX2ZyYW1lcmF0ZS5udW07Ci0gICAgICAgICAgICBuZXh0X2ZyYW1lX3N0YXJ0ID0gKGNmZy5nX3RpbWViYXNlLmRlbiAqIChpbnQ2NF90KShmcmFtZXNfaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJnX2ZyYW1lcmF0ZS5kZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gY2ZnLmdfdGltZWJhc2UubnVtIC8gYXJnX2ZyYW1lcmF0ZS5udW07Ci0gICAgICAgICAgICB2cHhfY29kZWNfZW5jb2RlKCZlbmNvZGVyLCBmcmFtZV9hdmFpbCA/ICZyYXcgOiBOVUxMLCBmcmFtZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9mcmFtZV9zdGFydCAtIGZyYW1lX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhcmdfZGVhZGxpbmUpOwotICAgICAgICAgICAgdnB4X3VzZWNfdGltZXJfbWFyaygmdGltZXIpOwotICAgICAgICAgICAgY3hfdGltZSArPSB2cHhfdXNlY190aW1lcl9lbGFwc2VkKCZ0aW1lcik7Ci0gICAgICAgICAgICBjdHhfZXhpdF9vbl9lcnJvcigmZW5jb2RlciwgIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUiKTsKLSAgICAgICAgICAgIGdvdF9kYXRhID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKChwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJmVuY29kZXIsICZpdGVyKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ290X2RhdGEgPSAxOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChwa3QtPmtpbmQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgVlBYX0NPREVDX0NYX0ZSQU1FX1BLVDoKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzX291dCsrOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlNmx1RiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcGt0LT5kYXRhLmZyYW1lLnN6KTsKLQotICAgICAgICAgICAgICAgICAgICBpZih3cml0ZV93ZWJtKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGhhc2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlYm1sLmRlYnVnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2ggPSBtdXJtdXIocGt0LT5kYXRhLmZyYW1lLmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS5mcmFtZS5zeiwgaGFzaCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3dlYm1fYmxvY2soJmVibWwsICZjZmcsIHBrdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9pdmZfZnJhbWVfaGVhZGVyKG91dGZpbGUsIHBrdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmd3JpdGUocGt0LT5kYXRhLmZyYW1lLmJ1ZiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEuZnJhbWUuc3osIG91dGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYnl0ZXMgKz0gcGt0LT5kYXRhLnJhdy5zejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWUFhfQ09ERUNfU1RBVFNfUEtUOgotICAgICAgICAgICAgICAgICAgICBmcmFtZXNfb3V0Kys7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICU2bHVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLnN6KTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHNfd3JpdGUoJnN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLnN6KTsKLSAgICAgICAgICAgICAgICAgICAgbmJ5dGVzICs9IHBrdC0+ZGF0YS5yYXcuc3o7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVlBYX0NPREVDX1BTTlJfUEtUOgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG93X3BzbnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwc25yX3NzZV90b3RhbCArPSBwa3QtPmRhdGEucHNuci5zc2VbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc25yX3NhbXBsZXNfdG90YWwgKz0gcGt0LT5kYXRhLnBzbnIuc2FtcGxlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlLjNsZiAiLCBwa3QtPmRhdGEucHNuci5wc25yW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25yX3RvdGFsc1tpXSArPSBwa3QtPmRhdGEucHNuci5wc25yW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHNucl9jb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgIlxyUGFzcyAlZC8lZCBmcmFtZSAlNGQvJS00ZCAlN2xkQiAlN2xkYi9mICU3IlBSSWQ2NCJiL3MiCi0gICAgICAgICAgICAgICAiICU3bHUgJXMgKCUuMmYgZnBzKVwwMzNbSyIsIHBhc3MgKyAxLAotICAgICAgICAgICAgICAgYXJnX3Bhc3NlcywgZnJhbWVzX2luLCBmcmFtZXNfb3V0LCBuYnl0ZXMsIG5ieXRlcyAqIDggLyBmcmFtZXNfaW4sCi0gICAgICAgICAgICAgICBuYnl0ZXMgKiA4ICooaW50NjRfdClhcmdfZnJhbWVyYXRlLm51bSAvIGFyZ19mcmFtZXJhdGUuZGVuIC8gZnJhbWVzX2luLAotICAgICAgICAgICAgICAgY3hfdGltZSA+IDk5OTk5OTkgPyBjeF90aW1lIC8gMTAwMCA6IGN4X3RpbWUsCi0gICAgICAgICAgICAgICBjeF90aW1lID4gOTk5OTk5OSA/ICJtcyIgOiAidXMiLAotICAgICAgICAgICAgICAgKGZsb2F0KWZyYW1lc19pbiAqIDEwMDAwMDAuMCAvIChmbG9hdCljeF90aW1lKTsKLQotICAgICAgICBpZiAoIChzaG93X3BzbnIpICYmIChwc25yX2NvdW50PjApICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBkb3VibGUgb3Zwc25yID0gdnA4X21zZTJwc25yKHBzbnJfc2FtcGxlc190b3RhbCwgMjU1LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbnJfc3NlX3RvdGFsKTsKLQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblBTTlIgKE92ZXJhbGwvQXZnL1kvVS9WKSIpOwotCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlLjNsZiIsIG92cHNucik7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICUuM2xmIiwgcHNucl90b3RhbHNbaV0vcHNucl9jb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2cHhfY29kZWNfZGVzdHJveSgmZW5jb2Rlcik7Ci0KLSAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0KLSAgICAgICAgaWYod3JpdGVfd2VibSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVfd2VibV9maWxlX2Zvb3RlcigmZWJtbCwgaGFzaCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWZzZWVrKG91dGZpbGUsIDAsIFNFRUtfU0VUKSkKLSAgICAgICAgICAgICAgICB3cml0ZV9pdmZfZmlsZV9oZWFkZXIob3V0ZmlsZSwgJmNmZywgY29kZWMtPmZvdXJjYywgZnJhbWVzX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7Ci0gICAgICAgIHN0YXRzX2Nsb3NlKCZzdGF0cywgYXJnX3Bhc3Nlcy0xKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotCi0gICAgICAgIGlmIChvbmVfcGFzc19vbmx5KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgdnB4X2ltZ19mcmVlKCZyYXcpOwotICAgIGZyZWUoYXJndik7Ci0gICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3k0bWlucHV0LmMgYi95NG1pbnB1dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDlhZmU4Li4wMDAwMDAwCi0tLSBhL3k0bWlucHV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIFdlYk0gcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0gKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotICogIGluIHRoZSBmaWxlIFBBVEVOVFMuICBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLSAqICBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAqCi0gKiAgQmFzZWQgb24gY29kZSBmcm9tIHRoZSBPZ2dUaGVvcmEgc29mdHdhcmUgY29kZWMgc291cmNlIGNvZGUsCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgVGhlIFhpcGguT3JnIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9ycy4KLSAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInk0bWlucHV0LmgiCi0KLXN0YXRpYyBpbnQgeTRtX3BhcnNlX3RhZ3MoeTRtX2lucHV0ICpfeTRtLGNoYXIgKl90YWdzKXsKLSAgaW50ICAgZ290X3c7Ci0gIGludCAgIGdvdF9oOwotICBpbnQgICBnb3RfZnBzOwotICBpbnQgICBnb3RfaW50ZXJsYWNlOwotICBpbnQgICBnb3RfcGFyOwotICBpbnQgICBnb3RfY2hyb21hOwotICBjaGFyICpwOwotICBjaGFyICpxOwotICBnb3Rfdz1nb3RfaD1nb3RfZnBzPWdvdF9pbnRlcmxhY2U9Z290X3Bhcj1nb3RfY2hyb21hPTA7Ci0gIGZvcihwPV90YWdzOztwPXEpewotICAgIC8qU2tpcCBhbnkgbGVhZGluZyBzcGFjZXMuKi8KLSAgICB3aGlsZSgqcD09JyAnKXArKzsKLSAgICAvKklmIHRoYXQncyBhbGwgd2UgaGF2ZSwgc3RvcC4qLwotICAgIGlmKHBbMF09PSdcMCcpYnJlYWs7Ci0gICAgLypGaW5kIHRoZSBlbmQgb2YgdGhpcyB0YWcuKi8KLSAgICBmb3IocT1wKzE7KnEhPSdcMCcmJipxIT0nICc7cSsrKTsKLSAgICAvKlByb2Nlc3MgdGhlIHRhZy4qLwotICAgIHN3aXRjaChwWzBdKXsKLSAgICAgIGNhc2UgJ1cnOnsKLSAgICAgICAgaWYoc3NjYW5mKHArMSwiJWQiLCZfeTRtLT5waWNfdykhPTEpcmV0dXJuIC0xOwotICAgICAgICBnb3Rfdz0xOwotICAgICAgfWJyZWFrOwotICAgICAgY2FzZSAnSCc6ewotICAgICAgICBpZihzc2NhbmYocCsxLCIlZCIsJl95NG0tPnBpY19oKSE9MSlyZXR1cm4gLTE7Ci0gICAgICAgIGdvdF9oPTE7Ci0gICAgICB9YnJlYWs7Ci0gICAgICBjYXNlICdGJzp7Ci0gICAgICAgIGlmKHNzY2FuZihwKzEsIiVkOiVkIiwmX3k0bS0+ZnBzX24sJl95NG0tPmZwc19kKSE9Mil7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGdvdF9mcHM9MTsKLSAgICAgIH1icmVhazsKLSAgICAgIGNhc2UgJ0knOnsKLSAgICAgICAgX3k0bS0+aW50ZXJsYWNlPXBbMV07Ci0gICAgICAgIGdvdF9pbnRlcmxhY2U9MTsKLSAgICAgIH1icmVhazsKLSAgICAgIGNhc2UgJ0EnOnsKLSAgICAgICAgaWYoc3NjYW5mKHArMSwiJWQ6JWQiLCZfeTRtLT5wYXJfbiwmX3k0bS0+cGFyX2QpIT0yKXsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZ290X3Bhcj0xOwotICAgICAgfWJyZWFrOwotICAgICAgY2FzZSAnQyc6ewotICAgICAgICBpZihxLXA+MTYpcmV0dXJuIC0xOwotICAgICAgICBtZW1jcHkoX3k0bS0+Y2hyb21hX3R5cGUscCsxLHEtcC0xKTsKLSAgICAgICAgX3k0bS0+Y2hyb21hX3R5cGVbcS1wLTFdPSdcMCc7Ci0gICAgICAgIGdvdF9jaHJvbWE9MTsKLSAgICAgIH1icmVhazsKLSAgICAgIC8qSWdub3JlIHVua25vd24gdGFncy4qLwotICAgIH0KLSAgfQotICBpZighZ290X3d8fCFnb3RfaHx8IWdvdF9mcHMpcmV0dXJuIC0xOwotICBpZighZ290X2ludGVybGFjZSlfeTRtLT5pbnRlcmxhY2U9Jz8nOwotICBpZighZ290X3BhcilfeTRtLT5wYXJfbj1feTRtLT5wYXJfZD0wOwotICAvKkNocm9tYS10eXBlIGlzIG5vdCBzcGVjaWZpZWQgaW4gb2xkZXIgZmlsZXMsIGUuZy4sIHRob3NlIGdlbmVyYXRlZCBieQotICAgICBtcGxheWVyLiovCi0gIGlmKCFnb3RfY2hyb21hKXN0cmNweShfeTRtLT5jaHJvbWFfdHlwZSwiNDIwIik7Ci0gIHJldHVybiAwOwotfQotCi0KLQotLypBbGwgYW50aS1hbGlhc2luZyBmaWx0ZXJzIGluIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIGJhc2VkIG9uCi0gICBvbmUgb2YgdHdvIHdpbmRvdyBmdW5jdGlvbnM6Ci0gIFRoZSA2LXRhcCBMYW5jem9zIHdpbmRvdyAoZm9yIGRvd24tc2FtcGxpbmcgYW5kIHNoaWZ0cyk6Ci0gICBzaW5jKFxwaSp0KSpzaW5jKFxwaSp0LzMpLCB8dHw8MyAgKHNpbmModCk9PXNpbih0KS90KQotICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgfHR8Pj0zCi0gIFRoZSA0LXRhcCBNaXRjaGVsbCB3aW5kb3cgKGZvciB1cC1zYW1wbGluZyk6Ci0gICA3fHR8XjMtMTJ8dHxeMisxNi8zLCAgICAgICAgICAgICB8dHw8MQotICAgLSg3LzMpfHh8XjMrMTJ8eHxeMi0yMHx4fCszMi8zLCAgfHR8PDIKLSAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx0fD49MgotICBUaGUgbnVtYmVyIG9mIHRhcHMgaXMgaW50ZW50aW9uYWxseSBrZXB0IHNtYWxsIHRvIHJlZHVjZSBjb21wdXRhdGlvbmFsCi0gICBvdmVyaGVhZCBhbmQgbGltaXQgcmluZ2luZy4KLQotICBUaGUgdGFwcyBmcm9tIHRoZXNlIGZpbHRlcnMgYXJlIHNjYWxlZCBzbyB0aGF0IHRoZWlyIHN1bSBpcyAxLCBhbmQgdGhlIHJlc3VsdAotICAgaXMgc2NhbGVkIGJ5IDEyOCBhbmQgcm91bmRlZCB0byBpbnRlZ2VycyB0byBjcmVhdGUgYSBmaWx0ZXIgd2hvc2UKLSAgIGludGVybWVkaWF0ZSB2YWx1ZXMgZml0IGluc2lkZSAxNiBiaXRzLgotICBDb2VmZmljaWVudHMgYXJlIHJvdW5kZWQgaW4gc3VjaCBhIHdheSBhcyB0byBlbnN1cmUgdGhlaXIgc3VtIGlzIHN0aWxsIDEyOCwKLSAgIHdoaWNoIGlzIHVzdWFsbHkgZXF1aXZhbGVudCB0byBub3JtYWwgcm91bmRpbmcuCi0KLSAgQ29udmVyc2lvbnMgd2hpY2ggcmVxdWlyZSBib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGZpbHRlcmluZyBjb3VsZAotICAgaGF2ZSB0aGVzZSBzdGVwcyBwaXBlbGluZWQsIGZvciBsZXNzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgYmV0dGVyIGNhY2hlCi0gICBwZXJmb3JtYW5jZSwgYnV0IHdlIGRvIHRoZW0gc2VwYXJhdGVseSBmb3Igc2ltcGxpY2l0eS4qLwotCi0jZGVmaW5lIE9DX01JTkkoX2EsX2IpICAgICAgKChfYSk+KF9iKT8oX2IpOihfYSkpCi0jZGVmaW5lIE9DX01BWEkoX2EsX2IpICAgICAgKChfYSk8KF9iKT8oX2IpOihfYSkpCi0jZGVmaW5lIE9DX0NMQU1QSShfYSxfYixfYykgKE9DX01BWEkoX2EsT0NfTUlOSShfYixfYykpKQotCi0vKjQyMGpwZWcgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0KLSAgNDIwbXBlZzIgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgQlIgICAgICB8ICAgICAgIEJSICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgQlIgICAgICB8ICAgICAgIEJSICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0KLSAgV2UgdXNlIGEgcmVzYW1wbGluZyBmaWx0ZXIgdG8gc2hpZnQgdGhlIHNpdGUgbG9jYXRpb25zIG9uZSBxdWFydGVyIHBpeGVsIChhdAotICAgdGhlIGNocm9tYSBwbGFuZSdzIHJlc29sdXRpb24pIHRvIHRoZSByaWdodC4KLSAgVGhlIDQ6MjoyIG1vZGVzIGxvb2sgZXhhY3RseSB0aGUgc2FtZSwgZXhjZXB0IHRoZXJlIGFyZSB0d2ljZSBhcyBtYW55IGNocm9tYQotICAgbGluZXMsIGFuZCB0aGV5IGFyZSB2ZXJ0aWNhbGx5IGNvLXNpdGVkIHdpdGggdGhlIGx1bWEgc2FtcGxlcyBpbiBib3RoIHRoZQotICAgbXBlZzIgYW5kIGpwZWcgY2FzZXMgKHRodXMgcmVxdWlyaW5nIG5vIHZlcnRpY2FsIHJlc2FtcGxpbmcpLiovCi1zdGF0aWMgdm9pZCB5NG1fNDJ4bXBlZzJfNDJ4anBlZ19oZWxwZXIodW5zaWduZWQgY2hhciAqX2RzdCwKLSBjb25zdCB1bnNpZ25lZCBjaGFyICpfc3JjLGludCBfY193LGludCBfY19oKXsKLSAgaW50IHBsaTsKLSAgaW50IHk7Ci0gIGludCB4OwotICBmb3IoeT0wO3k8X2NfaDt5KyspewotICAgIC8qRmlsdGVyOiBbNCAtMTcgMTE0IDM1IC05IDFdLzEyOCwgZGVyaXZlZCBmcm9tIGEgNi10YXAgTGFuY3pvcwotICAgICAgIHdpbmRvdy4qLwotICAgIGZvcih4PTA7eDxPQ19NSU5JKF9jX3csMik7eCsrKXsKLSAgICAgIF9kc3RbeF09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKDQqX3NyY1swXS0xNypfc3JjW09DX01BWEkoeC0xLDApXSsKLSAgICAgICAxMTQqX3NyY1t4XSszNSpfc3JjW09DX01JTkkoeCsxLF9jX3ctMSldLTkqX3NyY1tPQ19NSU5JKHgrMixfY193LTEpXSsKLSAgICAgICBfc3JjW09DX01JTkkoeCszLF9jX3ctMSldKzY0KT4+NywyNTUpOwotICAgIH0KLSAgICBmb3IoO3g8X2Nfdy0zO3grKyl7Ci0gICAgICBfZHN0W3hdPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCg0Kl9zcmNbeC0yXS0xNypfc3JjW3gtMV0rCi0gICAgICAgMTE0Kl9zcmNbeF0rMzUqX3NyY1t4KzFdLTkqX3NyY1t4KzJdK19zcmNbeCszXSs2NCk+PjcsMjU1KTsKLSAgICB9Ci0gICAgZm9yKDt4PF9jX3c7eCsrKXsKLSAgICAgIF9kc3RbeF09KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKDQqX3NyY1t4LTJdLTE3Kl9zcmNbeC0xXSsKLSAgICAgICAxMTQqX3NyY1t4XSszNSpfc3JjW09DX01JTkkoeCsxLF9jX3ctMSldLTkqX3NyY1tPQ19NSU5JKHgrMixfY193LTEpXSsKLSAgICAgICBfc3JjW19jX3ctMV0rNjQpPj43LDI1NSk7Ci0gICAgfQotICAgIF9kc3QrPV9jX3c7Ci0gICAgX3NyYys9X2NfdzsKLSAgfQotfQotCi0vKkhhbmRsZXMgYm90aCA0MjIgYW5kIDQyMG1wZWcyIHRvIDQyMmpwZWcgYW5kIDQyMGpwZWcsIHJlc3BlY3RpdmVseS4qLwotc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfNDJ4bXBlZzJfNDJ4anBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKLSB1bnNpZ25lZCBjaGFyICpfYXV4KXsKLSAgaW50IGNfdzsKLSAgaW50IGNfaDsKLSAgaW50IGNfc3o7Ci0gIGludCBwbGk7Ci0gIGludCB5OwotICBpbnQgeDsKLSAgLypTa2lwIHBhc3QgdGhlIGx1bWEgZGF0YS4qLwotICBfZHN0Kz1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKLSAgLypDb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggY2hyb21hIHBsYW5lLiovCi0gIGNfdz0oX3k0bS0+cGljX3crX3k0bS0+ZHN0X2NfZGVjX2gtMSkvX3k0bS0+ZHN0X2NfZGVjX2g7Ci0gIGNfaD0oX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3Y7Ci0gIGNfc3o9Y193KmNfaDsKLSAgZm9yKHBsaT0xO3BsaTwzO3BsaSsrKXsKLSAgICB5NG1fNDJ4bXBlZzJfNDJ4anBlZ19oZWxwZXIoX2RzdCxfYXV4LGNfdyxjX2gpOwotICAgIF9kc3QrPWNfc3o7Ci0gICAgX2F1eCs9Y19zejsKLSAgfQotfQotCi0vKlRoaXMgZm9ybWF0IGlzIG9ubHkgdXNlZCBmb3IgaW50ZXJsYWNlZCBjb250ZW50LCBidXQgaXMgaW5jbHVkZWQgZm9yCi0gICBjb21wbGV0ZW5lc3MuCi0KLSAgNDIwanBlZyBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgQlIgIHwgICAgICAgfCAgIEJSICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgQlIgIHwgICAgICAgfCAgIEJSICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLQotICA0MjBwYWxkdiBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKLSAgWVItLS0tLS1ZLS0tLS0tLVlSLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWUItLS0tLS1ZLS0tLS0tLVlCLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWVItLS0tLS1ZLS0tLS0tLVlSLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWUItLS0tLS1ZLS0tLS0tLVlCLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLQotICBXZSB1c2UgYSByZXNhbXBsaW5nIGZpbHRlciB0byBzaGlmdCB0aGUgc2l0ZSBsb2NhdGlvbnMgb25lIHF1YXJ0ZXIgcGl4ZWwgKGF0Ci0gICB0aGUgY2hyb21hIHBsYW5lJ3MgcmVzb2x1dGlvbikgdG8gdGhlIHJpZ2h0LgotICBUaGVuIHdlIHVzZSBhbm90aGVyIGZpbHRlciB0byBtb3ZlIHRoZSBDX3IgbG9jYXRpb24gZG93biBvbmUgcXVhcnRlciBwaXhlbCwKLSAgIGFuZCB0aGUgQ19iIGxvY2F0aW9uIHVwIG9uZSBxdWFydGVyIHBpeGVsLiovCi1zdGF0aWMgdm9pZCB5NG1fY29udmVydF80MnhwYWxkdl80MnhqcGVnKHk0bV9pbnB1dCAqX3k0bSx1bnNpZ25lZCBjaGFyICpfZHN0LAotIHVuc2lnbmVkIGNoYXIgKl9hdXgpewotICB1bnNpZ25lZCBjaGFyICp0bXA7Ci0gIGludCAgICAgICAgICAgIGNfdzsKLSAgaW50ICAgICAgICAgICAgY19oOwotICBpbnQgICAgICAgICAgICBjX3N6OwotICBpbnQgICAgICAgICAgICBwbGk7Ci0gIGludCAgICAgICAgICAgIHk7Ci0gIGludCAgICAgICAgICAgIHg7Ci0gIC8qU2tpcCBwYXN0IHRoZSBsdW1hIGRhdGEuKi8KLSAgX2RzdCs9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gIC8qQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGNocm9tYSBwbGFuZS4qLwotICBjX3c9KF95NG0tPnBpY193KzEpLzI7Ci0gIGNfaD0oX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX2gtMSkvX3k0bS0+ZHN0X2NfZGVjX2g7Ci0gIGNfc3o9Y193KmNfaDsKLSAgdG1wPV9hdXgrMipjX3N6OwotICBmb3IocGxpPTE7cGxpPDM7cGxpKyspewotICAgIC8qRmlyc3QgZG8gdGhlIGhvcml6b250YWwgcmUtc2FtcGxpbmcuCi0gICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBtcGVnMiBjYXNlLCBleGNlcHQgdGhhdCBhZnRlciB0aGUgaG9yaXpvbnRhbAotICAgICAgIGNhc2UsIHdlIG5lZWQgdG8gYXBwbHkgYSBzZWNvbmQgdmVydGljYWwgZmlsdGVyLiovCi0gICAgeTRtXzQyeG1wZWcyXzQyeGpwZWdfaGVscGVyKHRtcCxfYXV4LGNfdyxjX2gpOwotICAgIF9hdXgrPWNfc3o7Ci0gICAgc3dpdGNoKHBsaSl7Ci0gICAgICBjYXNlIDE6ewotICAgICAgICAvKlNsaWRlIENfYiB1cCBhIHF1YXJ0ZXItcGVsLgotICAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgZmlsdGVyIHVzZWQgYWJvdmUsIGJ1dCBpbiB0aGUgb3RoZXIgb3JkZXIuKi8KLSAgICAgICAgZm9yKHg9MDt4PGNfdzt4KyspewotICAgICAgICAgIGZvcih5PTA7eTxPQ19NSU5JKGNfaCwzKTt5KyspewotICAgICAgICAgICAgX2RzdFt5KmNfd109KHVuc2lnbmVkIGNoYXIpT0NfQ0xBTVBJKDAsKHRtcFswXQotICAgICAgICAgICAgIC05KnRtcFtPQ19NQVhJKHktMiwwKSpjX3ddKzM1KnRtcFtPQ19NQVhJKHktMSwwKSpjX3ddCi0gICAgICAgICAgICAgKzExNCp0bXBbeSpjX3ddLTE3KnRtcFtPQ19NSU5JKHkrMSxjX2gtMSkqY193XQotICAgICAgICAgICAgICs0KnRtcFtPQ19NSU5JKHkrMixjX2gtMSkqY193XSs2NCk+PjcsMjU1KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yKDt5PGNfaC0yO3krKyl7Ci0gICAgICAgICAgICBfZHN0W3kqY193XT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwodG1wWyh5LTMpKmNfd10KLSAgICAgICAgICAgICAtOSp0bXBbKHktMikqY193XSszNSp0bXBbKHktMSkqY193XSsxMTQqdG1wW3kqY193XQotICAgICAgICAgICAgIC0xNyp0bXBbKHkrMSkqY193XSs0KnRtcFsoeSsyKSpjX3ddKzY0KT4+NywyNTUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IoO3k8Y19oO3krKyl7Ci0gICAgICAgICAgICBfZHN0W3kqY193XT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwodG1wWyh5LTMpKmNfd10KLSAgICAgICAgICAgICAtOSp0bXBbKHktMikqY193XSszNSp0bXBbKHktMSkqY193XSsxMTQqdG1wW3kqY193XQotICAgICAgICAgICAgIC0xNyp0bXBbT0NfTUlOSSh5KzEsY19oLTEpKmNfd10rNCp0bXBbKGNfaC0xKSpjX3ddKzY0KT4+NywyNTUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBfZHN0Kys7Ci0gICAgICAgICAgdG1wKys7Ci0gICAgICAgIH0KLSAgICAgICAgX2RzdCs9Y19zei1jX3c7Ci0gICAgICAgIHRtcC09Y193OwotICAgICAgfWJyZWFrOwotICAgICAgY2FzZSAyOnsKLSAgICAgICAgLypTbGlkZSBDX3IgZG93biBhIHF1YXJ0ZXItcGVsLgotICAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGhvcml6b250YWwgZmlsdGVyLiovCi0gICAgICAgIGZvcih4PTA7eDxjX3c7eCsrKXsKLSAgICAgICAgICBmb3IoeT0wO3k8T0NfTUlOSShjX2gsMik7eSsrKXsKLSAgICAgICAgICAgIF9kc3RbeSpjX3ddPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCg0KnRtcFswXQotICAgICAgICAgICAgIC0xNyp0bXBbT0NfTUFYSSh5LTEsMCkqY193XSsxMTQqdG1wW3kqY193XQotICAgICAgICAgICAgICszNSp0bXBbT0NfTUlOSSh5KzEsY19oLTEpKmNfd10tOSp0bXBbT0NfTUlOSSh5KzIsY19oLTEpKmNfd10KLSAgICAgICAgICAgICArdG1wW09DX01JTkkoeSszLGNfaC0xKSpjX3ddKzY0KT4+NywyNTUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IoO3k8Y19oLTM7eSsrKXsKLSAgICAgICAgICAgIF9kc3RbeSpjX3ddPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCg0KnRtcFsoeS0yKSpjX3ddCi0gICAgICAgICAgICAgLTE3KnRtcFsoeS0xKSpjX3ddKzExNCp0bXBbeSpjX3ddKzM1KnRtcFsoeSsxKSpjX3ddCi0gICAgICAgICAgICAgLTkqdG1wWyh5KzIpKmNfd10rdG1wWyh5KzMpKmNfd10rNjQpPj43LDI1NSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvcig7eTxjX2g7eSsrKXsKLSAgICAgICAgICAgIF9kc3RbeSpjX3ddPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCg0KnRtcFsoeS0yKSpjX3ddCi0gICAgICAgICAgICAgLTE3KnRtcFsoeS0xKSpjX3ddKzExNCp0bXBbeSpjX3ddKzM1KnRtcFtPQ19NSU5JKHkrMSxjX2gtMSkqY193XQotICAgICAgICAgICAgIC05KnRtcFtPQ19NSU5JKHkrMixjX2gtMSkqY193XSt0bXBbKGNfaC0xKSpjX3ddKzY0KT4+NywyNTUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBfZHN0Kys7Ci0gICAgICAgICAgdG1wKys7Ci0gICAgICAgIH0KLSAgICAgIH1icmVhazsKLSAgICB9Ci0gICAgLypGb3IgYWN0dWFsIGludGVybGFjZWQgbWF0ZXJpYWwsIHRoaXMgd291bGQgaGF2ZSB0byBiZSBkb25lIHNlcGFyYXRlbHkgb24KLSAgICAgICBlYWNoIGZpZWxkLCBhbmQgdGhlIHNoaWZ0IGFtb3VudHMgd291bGQgYmUgZGlmZmVyZW50LgotICAgICAgQ19yIG1vdmVzIGRvd24gMS84LCBDX2IgdXAgMy84IGluIHRoZSB0b3AgZmllbGQsIGFuZCBDX3IgbW92ZXMgZG93biAzLzgsCi0gICAgICAgQ19iIHVwIDEvOCBpbiB0aGUgYm90dG9tIGZpZWxkLgotICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgZmlsdGVycyB3b3VsZCBiZToKLSAgICAgICBEb3duIDEvOCAocmV2ZXJzZSBvcmRlciBmb3IgdXApOiBbMyAtMTEgMTI1IDE1IC00IDBdLzEyOAotICAgICAgIERvd24gMy84IChyZXZlcnNlIG9yZGVyIGZvciB1cCk6IFs0IC0xOSA5OCA1NiAtMTMgMl0vMTI4Ki8KLSAgfQotfQotCi0vKlBlcmZvcm0gdmVydGljYWwgZmlsdGVyaW5nIHRvIHJlZHVjZSBhIHNpbmdsZSBwbGFuZSBmcm9tIDQ6MjoyIHRvIDQ6MjowLgotICBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgYnkgc2V2ZXJhbCBjb252ZXJhdGlvbiByb3V0aW5lcy4qLwotc3RhdGljIHZvaWQgeTRtXzQyMmpwZWdfNDIwanBlZ19oZWxwZXIodW5zaWduZWQgY2hhciAqX2RzdCwKLSBjb25zdCB1bnNpZ25lZCBjaGFyICpfc3JjLGludCBfY193LGludCBfY19oKXsKLSAgaW50IHk7Ci0gIGludCB4OwotICAvKkZpbHRlcjogWzMgLTE3IDc4IDc4IC0xNyAzXS8xMjgsIGRlcml2ZWQgZnJvbSBhIDYtdGFwIExhbmN6b3Mgd2luZG93LiovCi0gIGZvcih4PTA7eDxfY193O3grKyl7Ci0gICAgZm9yKHk9MDt5PE9DX01JTkkoX2NfaCwyKTt5Kz0yKXsKLSAgICAgIF9kc3RbKHk+PjEpKl9jX3ddPU9DX0NMQU1QSSgwLCg2NCpfc3JjWzBdCi0gICAgICAgKzc4Kl9zcmNbT0NfTUlOSSgxLF9jX2gtMSkqX2Nfd10KLSAgICAgICAtMTcqX3NyY1tPQ19NSU5JKDIsX2NfaC0xKSpfY193XQotICAgICAgICszKl9zcmNbT0NfTUlOSSgzLF9jX2gtMSkqX2Nfd10rNjQpPj43LDI1NSk7Ci0gICAgfQotICAgIGZvcig7eTxfY19oLTM7eSs9Mil7Ci0gICAgICBfZHN0Wyh5Pj4xKSpfY193XT1PQ19DTEFNUEkoMCwoMyooX3NyY1soeS0yKSpfY193XStfc3JjWyh5KzMpKl9jX3ddKQotICAgICAgIC0xNyooX3NyY1soeS0xKSpfY193XStfc3JjWyh5KzIpKl9jX3ddKQotICAgICAgICs3OCooX3NyY1t5Kl9jX3ddK19zcmNbKHkrMSkqX2Nfd10pKzY0KT4+NywyNTUpOwotICAgIH0KLSAgICBmb3IoO3k8X2NfaDt5Kz0yKXsKLSAgICAgIF9kc3RbKHk+PjEpKl9jX3ddPU9DX0NMQU1QSSgwLCgzKihfc3JjWyh5LTIpKl9jX3ddCi0gICAgICAgK19zcmNbKF9jX2gtMSkqX2Nfd10pLTE3Kihfc3JjWyh5LTEpKl9jX3ddCi0gICAgICAgK19zcmNbT0NfTUlOSSh5KzIsX2NfaC0xKSpfY193XSkKLSAgICAgICArNzgqKF9zcmNbeSpfY193XStfc3JjW09DX01JTkkoeSsxLF9jX2gtMSkqX2Nfd10pKzY0KT4+NywyNTUpOwotICAgIH0KLSAgICBfc3JjKys7Ci0gICAgX2RzdCsrOwotICB9Ci19Ci0KLS8qNDIwanBlZyBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgQlIgIHwgICAgICAgfCAgIEJSICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgQlIgIHwgICAgICAgfCAgIEJSICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLQotICA0MjJqcGVnIGNocm9tYSBzYW1wbGVzIGFyZSBzaXRlZCBsaWtlOgotICBZLS0tQlItLVktLS0tLS0tWS0tLUJSLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZLS0tQlItLVktLS0tLS0tWS0tLUJSLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZLS0tQlItLVktLS0tLS0tWS0tLUJSLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZLS0tQlItLVktLS0tLS0tWS0tLUJSLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCi0gIFdlIHVzZSBhIHJlc2FtcGxpbmcgZmlsdGVyIHRvIGRlY2ltYXRlIHRoZSBjaHJvbWEgcGxhbmVzIGJ5IHR3byBpbiB0aGUKLSAgIHZlcnRpY2FsIGRpcmVjdGlvbi4qLwotc3RhdGljIHZvaWQgeTRtX2NvbnZlcnRfNDIyanBlZ180MjBqcGVnKHk0bV9pbnB1dCAqX3k0bSx1bnNpZ25lZCBjaGFyICpfZHN0LAotIHVuc2lnbmVkIGNoYXIgKl9hdXgpewotICBpbnQgY193OwotICBpbnQgY19oOwotICBpbnQgY19zejsKLSAgaW50IGRzdF9jX3c7Ci0gIGludCBkc3RfY19oOwotICBpbnQgZHN0X2Nfc3o7Ci0gIGludCB0bXBfc3o7Ci0gIGludCBwaWNfc3o7Ci0gIGludCBwbGk7Ci0gIC8qU2tpcCBwYXN0IHRoZSBsdW1hIGRhdGEuKi8KLSAgX2RzdCs9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gIC8qQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGNocm9tYSBwbGFuZS4qLwotICBjX3c9KF95NG0tPnBpY193K195NG0tPnNyY19jX2RlY19oLTEpL195NG0tPnNyY19jX2RlY19oOwotICBjX2g9X3k0bS0+cGljX2g7Ci0gIGRzdF9jX3c9KF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oOwotICBkc3RfY19oPShfeTRtLT5waWNfaCtfeTRtLT5kc3RfY19kZWNfdi0xKS9feTRtLT5kc3RfY19kZWNfdjsKLSAgY19zej1jX3cqY19oOwotICBkc3RfY19zej1kc3RfY193KmRzdF9jX2g7Ci0gIGZvcihwbGk9MTtwbGk8MztwbGkrKyl7Ci0gICAgeTRtXzQyMmpwZWdfNDIwanBlZ19oZWxwZXIoX2RzdCxfYXV4LGNfdyxjX2gpOwotICAgIF9hdXgrPWNfc3o7Ci0gICAgX2RzdCs9ZHN0X2Nfc3o7Ci0gIH0KLX0KLQotLyo0MjBqcGVnIGNocm9tYSBzYW1wbGVzIGFyZSBzaXRlZCBsaWtlOgotICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICBCUiAgfCAgICAgICB8ICAgQlIgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICBCUiAgfCAgICAgICB8ICAgQlIgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZLS0tLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCi0gIDQyMiBjaHJvbWEgc2FtcGxlcyBhcmUgc2l0ZWQgbGlrZToKLSAgWUJSLS0tLS1ZLS0tLS0tLVlCUi0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWUJSLS0tLS1ZLS0tLS0tLVlCUi0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWUJSLS0tLS1ZLS0tLS0tLVlCUi0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgWUJSLS0tLS1ZLS0tLS0tLVlCUi0tLS0tWS0tLS0tLS0KLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLQotICBXZSB1c2UgYSByZXNhbXBsaW5nIGZpbHRlciB0byBzaGlmdCB0aGUgb3JpZ2luYWwgc2l0ZSBsb2NhdGlvbnMgb25lIHF1YXJ0ZXIKLSAgIHBpeGVsIChhdCB0aGUgb3JpZ2luYWwgY2hyb21hIHJlc29sdXRpb24pIHRvIHRoZSByaWdodC4KLSAgVGhlbiB3ZSB1c2UgYSBzZWNvbmQgcmVzYW1wbGluZyBmaWx0ZXIgdG8gZGVjaW1hdGUgdGhlIGNocm9tYSBwbGFuZXMgYnkgdHdvCi0gICBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uLiovCi1zdGF0aWMgdm9pZCB5NG1fY29udmVydF80MjJfNDIwanBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKLSB1bnNpZ25lZCBjaGFyICpfYXV4KXsKLSAgdW5zaWduZWQgY2hhciAqdG1wOwotICBpbnQgICAgICAgICAgICBjX3c7Ci0gIGludCAgICAgICAgICAgIGNfaDsKLSAgaW50ICAgICAgICAgICAgY19zejsKLSAgaW50ICAgICAgICAgICAgZHN0X2NfdzsKLSAgaW50ICAgICAgICAgICAgZHN0X2NfaDsKLSAgaW50ICAgICAgICAgICAgZHN0X2Nfc3o7Ci0gIGludCAgICAgICAgICAgIHBsaTsKLSAgaW50ICAgICAgICAgICAgeTsKLSAgaW50ICAgICAgICAgICAgeDsKLSAgLypTa2lwIHBhc3QgdGhlIGx1bWEgZGF0YS4qLwotICBfZHN0Kz1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKLSAgLypDb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggY2hyb21hIHBsYW5lLiovCi0gIGNfdz0oX3k0bS0+cGljX3crX3k0bS0+c3JjX2NfZGVjX2gtMSkvX3k0bS0+c3JjX2NfZGVjX2g7Ci0gIGNfaD1feTRtLT5waWNfaDsKLSAgZHN0X2NfaD0oX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3Y7Ci0gIGNfc3o9Y193KmNfaDsKLSAgZHN0X2Nfc3o9Y193KmRzdF9jX2g7Ci0gIHRtcD1fYXV4KzIqY19zejsKLSAgZm9yKHBsaT0xO3BsaTwzO3BsaSsrKXsKLSAgICAvKkluIHJlYWxpdHksIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzdGVwcyBjb3VsZCBiZSBwaXBlbGluZWQsIGZvcgotICAgICAgIGxlc3MgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBiZXR0ZXIgY2FjaGUgcGVyZm9ybWFuY2UsIGJ1dCB3ZSBkbyB0aGVtCi0gICAgICAgc2VwYXJhdGVseSBmb3Igc2ltcGxpY2l0eS4qLwotICAgIC8qRmlyc3QgZG8gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgKGNvbnZlcnQgdG8gNDIyanBlZykqLwotICAgIHk0bV80MnhtcGVnMl80MnhqcGVnX2hlbHBlcih0bXAsX2F1eCxjX3csY19oKTsKLSAgICAvKk5vdyBkbyB0aGUgdmVydGljYWwgZmlsdGVyaW5nLiovCi0gICAgeTRtXzQyMmpwZWdfNDIwanBlZ19oZWxwZXIoX2RzdCx0bXAsY193LGNfaCk7Ci0gICAgX2F1eCs9Y19zejsKLSAgICBfZHN0Kz1kc3RfY19zejsKLSAgfQotfQotCi0vKjQyMGpwZWcgY2hyb21hIHNhbXBsZXMgYXJlIHNpdGVkIGxpa2U6Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgIEJSICB8ICAgICAgIHwgICBCUiAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIFktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLVktLS0tLS0tCi0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0KLSAgNDExIGNocm9tYSBzYW1wbGVzIGFyZSBzaXRlZCBsaWtlOgotICBZQlItLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZQlItLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZQlItLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotICBZQlItLS0tLVktLS0tLS0tWS0tLS0tLS1ZLS0tLS0tLQotICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8Ci0gIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwKLSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCi0gIFdlIHVzZSBhIGZpbHRlciB0byByZXNhbXBsZSBhdCBzaXRlIGxvY2F0aW9ucyBvbmUgZWlnaHRoIHBpeGVsIChhdCB0aGUgc291cmNlCi0gICBjaHJvbWEgcGxhbmUncyBob3Jpem9udGFsIHJlc29sdXRpb24pIGFuZCBmaXZlIGVpZ2h0aHMgb2YgYSBwaXhlbCB0byB0aGUKLSAgIHJpZ2h0LgotICBUaGVuIHdlIHVzZSBhbm90aGVyIGZpbHRlciB0byBkZWNpbWF0ZSB0aGUgcGxhbmVzIGJ5IDIgaW4gdGhlIHZlcnRpY2FsCi0gICBkaXJlY3Rpb24uKi8KLXN0YXRpYyB2b2lkIHk0bV9jb252ZXJ0XzQxMV80MjBqcGVnKHk0bV9pbnB1dCAqX3k0bSx1bnNpZ25lZCBjaGFyICpfZHN0LAotIHVuc2lnbmVkIGNoYXIgKl9hdXgpewotICB1bnNpZ25lZCBjaGFyICp0bXA7Ci0gIGludCAgICAgICAgICAgIGNfdzsKLSAgaW50ICAgICAgICAgICAgY19oOwotICBpbnQgICAgICAgICAgICBjX3N6OwotICBpbnQgICAgICAgICAgICBkc3RfY193OwotICBpbnQgICAgICAgICAgICBkc3RfY19oOwotICBpbnQgICAgICAgICAgICBkc3RfY19zejsKLSAgaW50ICAgICAgICAgICAgdG1wX3N6OwotICBpbnQgICAgICAgICAgICBwbGk7Ci0gIGludCAgICAgICAgICAgIHk7Ci0gIGludCAgICAgICAgICAgIHg7Ci0gIC8qU2tpcCBwYXN0IHRoZSBsdW1hIGRhdGEuKi8KLSAgX2RzdCs9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gIC8qQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGNocm9tYSBwbGFuZS4qLwotICBjX3c9KF95NG0tPnBpY193K195NG0tPnNyY19jX2RlY19oLTEpL195NG0tPnNyY19jX2RlY19oOwotICBjX2g9X3k0bS0+cGljX2g7Ci0gIGRzdF9jX3c9KF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oOwotICBkc3RfY19oPShfeTRtLT5waWNfaCtfeTRtLT5kc3RfY19kZWNfdi0xKS9feTRtLT5kc3RfY19kZWNfdjsKLSAgY19zej1jX3cqY19oOwotICBkc3RfY19zej1kc3RfY193KmRzdF9jX2g7Ci0gIHRtcF9zej1kc3RfY193KmNfaDsKLSAgdG1wPV9hdXgrMipjX3N6OwotICBmb3IocGxpPTE7cGxpPDM7cGxpKyspewotICAgIC8qSW4gcmVhbGl0eSwgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHN0ZXBzIGNvdWxkIGJlIHBpcGVsaW5lZCwgZm9yCi0gICAgICAgbGVzcyBtZW1vcnkgY29uc3VtcHRpb24gYW5kIGJldHRlciBjYWNoZSBwZXJmb3JtYW5jZSwgYnV0IHdlIGRvIHRoZW0KLSAgICAgICBzZXBhcmF0ZWx5IGZvciBzaW1wbGljaXR5LiovCi0gICAgLypGaXJzdCBkbyBob3Jpem9udGFsIGZpbHRlcmluZyAoY29udmVydCB0byA0MjJqcGVnKSovCi0gICAgZm9yKHk9MDt5PGNfaDt5KyspewotICAgICAgLypGaWx0ZXJzOiBbMSAxMTAgMTggLTFdLzEyOCBhbmQgWy0zIDUwIDg2IC01XS8xMjgsIGJvdGggZGVyaXZlZCBmcm9tIGEKLSAgICAgICAgIDQtdGFwIE1pdGNoZWxsIHdpbmRvdy4qLwotICAgICAgZm9yKHg9MDt4PE9DX01JTkkoY193LDEpO3grKyl7Ci0gICAgICAgIHRtcFt4PDwxXT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoMTExKl9hdXhbMF0KLSAgICAgICAgICsxOCpfYXV4W09DX01JTkkoMSxjX3ctMSldLV9hdXhbT0NfTUlOSSgyLGNfdy0xKV0rNjQpPj43LDI1NSk7Ci0gICAgICAgIHRtcFt4PDwxfDFdPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLCg0NypfYXV4WzBdCi0gICAgICAgICArODYqX2F1eFtPQ19NSU5JKDEsY193LTEpXS01Kl9hdXhbT0NfTUlOSSgyLGNfdy0xKV0rNjQpPj43LDI1NSk7Ci0gICAgICB9Ci0gICAgICBmb3IoO3g8Y193LTI7eCsrKXsKLSAgICAgICAgdG1wW3g8PDFdPSh1bnNpZ25lZCBjaGFyKU9DX0NMQU1QSSgwLChfYXV4W3gtMV0rMTEwKl9hdXhbeF0KLSAgICAgICAgICsxOCpfYXV4W3grMV0tX2F1eFt4KzJdKzY0KT4+NywyNTUpOwotICAgICAgICB0bXBbeDw8MXwxXT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoLTMqX2F1eFt4LTFdKzUwKl9hdXhbeF0KLSAgICAgICAgICs4NipfYXV4W3grMV0tNSpfYXV4W3grMl0rNjQpPj43LDI1NSk7Ci0gICAgICB9Ci0gICAgICBmb3IoO3g8Y193O3grKyl7Ci0gICAgICAgIHRtcFt4PDwxXT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoX2F1eFt4LTFdKzExMCpfYXV4W3hdCi0gICAgICAgICArMTgqX2F1eFtPQ19NSU5JKHgrMSxjX3ctMSldLV9hdXhbY193LTFdKzY0KT4+NywyNTUpOwotICAgICAgICBpZigoeDw8MXwxKTxkc3RfY193KXsKLSAgICAgICAgICB0bXBbeDw8MXwxXT0odW5zaWduZWQgY2hhcilPQ19DTEFNUEkoMCwoLTMqX2F1eFt4LTFdKzUwKl9hdXhbeF0KLSAgICAgICAgICAgKzg2Kl9hdXhbT0NfTUlOSSh4KzEsY193LTEpXS01Kl9hdXhbY193LTFdKzY0KT4+NywyNTUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0bXArPWRzdF9jX3c7Ci0gICAgICBfYXV4Kz1jX3c7Ci0gICAgfQotICAgIHRtcC09dG1wX3N6OwotICAgIC8qTm93IGRvIHRoZSB2ZXJ0aWNhbCBmaWx0ZXJpbmcuKi8KLSAgICB5NG1fNDIyanBlZ180MjBqcGVnX2hlbHBlcihfZHN0LHRtcCxkc3RfY193LGNfaCk7Ci0gICAgX2RzdCs9ZHN0X2Nfc3o7Ci0gIH0KLX0KLQotLypDb252ZXJ0IDQ0NCB0byA0MjBqcGVnLiovCi1zdGF0aWMgdm9pZCB5NG1fY29udmVydF80NDRfNDIwanBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKLSB1bnNpZ25lZCBjaGFyICpfYXV4KXsKLSAgdW5zaWduZWQgY2hhciAqdG1wOwotICBpbnQgICAgICAgICAgICBjX3c7Ci0gIGludCAgICAgICAgICAgIGNfaDsKLSAgaW50ICAgICAgICAgICAgY19zejsKLSAgaW50ICAgICAgICAgICAgZHN0X2NfdzsKLSAgaW50ICAgICAgICAgICAgZHN0X2NfaDsKLSAgaW50ICAgICAgICAgICAgZHN0X2Nfc3o7Ci0gIGludCAgICAgICAgICAgIHRtcF9zejsKLSAgaW50ICAgICAgICAgICAgcGxpOwotICBpbnQgICAgICAgICAgICB5OwotICBpbnQgICAgICAgICAgICB4OwotICAvKlNraXAgcGFzdCB0aGUgbHVtYSBkYXRhLiovCi0gIF9kc3QrPV95NG0tPnBpY193Kl95NG0tPnBpY19oOwotICAvKkNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBjaHJvbWEgcGxhbmUuKi8KLSAgY193PShfeTRtLT5waWNfdytfeTRtLT5zcmNfY19kZWNfaC0xKS9feTRtLT5zcmNfY19kZWNfaDsKLSAgY19oPV95NG0tPnBpY19oOwotICBkc3RfY193PShfeTRtLT5waWNfdytfeTRtLT5kc3RfY19kZWNfaC0xKS9feTRtLT5kc3RfY19kZWNfaDsKLSAgZHN0X2NfaD0oX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3Y7Ci0gIGNfc3o9Y193KmNfaDsKLSAgZHN0X2Nfc3o9ZHN0X2Nfdypkc3RfY19oOwotICB0bXBfc3o9ZHN0X2NfdypjX2g7Ci0gIHRtcD1fYXV4KzIqY19zejsKLSAgZm9yKHBsaT0xO3BsaTwzO3BsaSsrKXsKLSAgICAvKkZpbHRlcjogWzMgLTE3IDc4IDc4IC0xNyAzXS8xMjgsIGRlcml2ZWQgZnJvbSBhIDYtdGFwIExhbmN6b3Mgd2luZG93LiovCi0gICAgZm9yKHk9MDt5PGNfaDt5KyspewotICAgICAgZm9yKHg9MDt4PE9DX01JTkkoY193LDIpO3grPTIpewotICAgICAgICB0bXBbeD4+MV09T0NfQ0xBTVBJKDAsKDY0Kl9hdXhbMF0rNzgqX2F1eFtPQ19NSU5JKDEsY193LTEpXQotICAgICAgICAgLTE3Kl9hdXhbT0NfTUlOSSgyLGNfdy0xKV0KLSAgICAgICAgICszKl9hdXhbT0NfTUlOSSgzLGNfdy0xKV0rNjQpPj43LDI1NSk7Ci0gICAgICB9Ci0gICAgICBmb3IoO3g8Y193LTM7eCs9Mil7Ci0gICAgICAgIHRtcFt4Pj4xXT1PQ19DTEFNUEkoMCwoMyooX2F1eFt4LTJdK19hdXhbeCszXSkKLSAgICAgICAgIC0xNyooX2F1eFt4LTFdK19hdXhbeCsyXSkrNzgqKF9hdXhbeF0rX2F1eFt4KzFdKSs2NCk+PjcsMjU1KTsKLSAgICAgIH0KLSAgICAgIGZvcig7eDxjX3c7eCs9Mil7Ci0gICAgICAgIHRtcFt4Pj4xXT1PQ19DTEFNUEkoMCwoMyooX2F1eFt4LTJdK19hdXhbY193LTFdKS0KLSAgICAgICAgIDE3KihfYXV4W3gtMV0rX2F1eFtPQ19NSU5JKHgrMixjX3ctMSldKSsKLSAgICAgICAgIDc4KihfYXV4W3hdK19hdXhbT0NfTUlOSSh4KzEsY193LTEpXSkrNjQpPj43LDI1NSk7Ci0gICAgICB9Ci0gICAgICB0bXArPWRzdF9jX3c7Ci0gICAgICBfYXV4Kz1jX3c7Ci0gICAgfQotICAgIHRtcC09dG1wX3N6OwotICAgIC8qTm93IGRvIHRoZSB2ZXJ0aWNhbCBmaWx0ZXJpbmcuKi8KLSAgICB5NG1fNDIyanBlZ180MjBqcGVnX2hlbHBlcihfZHN0LHRtcCxkc3RfY193LGNfaCk7Ci0gICAgX2RzdCs9ZHN0X2Nfc3o7Ci0gIH0KLX0KLQotLypUaGUgaW1hZ2UgaXMgcGFkZGVkIHdpdGggZW1wdHkgY2hyb21hIGNvbXBvbmVudHMgYXQgNDoyOjAuKi8KLXN0YXRpYyB2b2lkIHk0bV9jb252ZXJ0X21vbm9fNDIwanBlZyh5NG1faW5wdXQgKl95NG0sdW5zaWduZWQgY2hhciAqX2RzdCwKLSB1bnNpZ25lZCBjaGFyICpfYXV4KXsKLSAgaW50IGNfc3o7Ci0gIF9kc3QrPV95NG0tPnBpY193Kl95NG0tPnBpY19oOwotICBjX3N6PSgoX3k0bS0+cGljX3crX3k0bS0+ZHN0X2NfZGVjX2gtMSkvX3k0bS0+ZHN0X2NfZGVjX2gpKgotICAgKChfeTRtLT5waWNfaCtfeTRtLT5kc3RfY19kZWNfdi0xKS9feTRtLT5kc3RfY19kZWNfdik7Ci0gIG1lbXNldChfZHN0LDEyOCxjX3N6KjIpOwotfQotCi0vKk5vIGNvbnZlcnNpb24gZnVuY3Rpb24gbmVlZGVkLiovCi1zdGF0aWMgdm9pZCB5NG1fY29udmVydF9udWxsKHk0bV9pbnB1dCAqX3k0bSx1bnNpZ25lZCBjaGFyICpfZHN0LAotIHVuc2lnbmVkIGNoYXIgKl9hdXgpewotfQotCi1pbnQgeTRtX2lucHV0X29wZW4oeTRtX2lucHV0ICpfeTRtLEZJTEUgKl9maW4sY2hhciAqX3NraXAsaW50IF9uc2tpcCl7Ci0gIGNoYXIgYnVmZmVyWzgwXTsKLSAgaW50ICByZXQ7Ci0gIGludCAgaTsKLSAgLypSZWFkIHVudGlsIG5ld2xpbmUsIG9yIDgwIGNvbHMsIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiovCi0gIGZvcihpPTA7aTw3OTtpKyspewotICAgIGlmKF9uc2tpcD4wKXsKLSAgICAgIGJ1ZmZlcltpXT0qX3NraXArKzsKLSAgICAgIF9uc2tpcC0tOwotICAgIH0KLSAgICBlbHNlewotICAgICAgcmV0PWZyZWFkKGJ1ZmZlcitpLDEsMSxfZmluKTsKLSAgICAgIGlmKHJldDwxKXJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYoYnVmZmVyW2ldPT0nXG4nKWJyZWFrOwotICB9Ci0gIC8qV2Ugc2tpcHBlZCB0b28gbXVjaCBoZWFkZXIgZGF0YS4qLwotICBpZihfbnNraXA+MClyZXR1cm4gLTE7Ci0gIGlmKGk9PTc5KXsKLSAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgcGFyc2luZyBoZWFkZXI7IG5vdCBhIFlVVjJNUEVHMiBmaWxlP1xuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGJ1ZmZlcltpXT0nXDAnOwotICBpZihtZW1jbXAoYnVmZmVyLCJZVVY0TVBFRyIsOCkpewotICAgIGZwcmludGYoc3RkZXJyLCJJbmNvbXBsZXRlIG1hZ2ljIGZvciBZVVY0TVBFRyBmaWxlLlxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmKGJ1ZmZlcls4XSE9JzInKXsKLSAgICBmcHJpbnRmKHN0ZGVyciwiSW5jb3JyZWN0IFlVViBpbnB1dCBmaWxlIHZlcnNpb247IFlVVjRNUEVHMiByZXF1aXJlZC5cbiIpOwotICB9Ci0gIHJldD15NG1fcGFyc2VfdGFncyhfeTRtLGJ1ZmZlcis1KTsKLSAgaWYocmV0PDApewotICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBwYXJzaW5nIFlVVjRNUEVHMiBoZWFkZXIuXG4iKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0gIGlmKF95NG0tPmludGVybGFjZT09Jz8nKXsKLSAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogSW5wdXQgdmlkZW8gaW50ZXJsYWNpbmcgZm9ybWF0IHVua25vd247ICIKLSAgICAgImFzc3VtaW5nIHByb2dyZXNzaXZlIHNjYW4uXG4iKTsKLSAgfQotICBlbHNlIGlmKF95NG0tPmludGVybGFjZSE9J3AnKXsKLSAgICBmcHJpbnRmKHN0ZGVyciwiSW5wdXQgdmlkZW8gaXMgaW50ZXJsYWNlZDsgIgotICAgICAiT25seSBwcm9ncmVzc2l2ZSBzY2FuIGhhbmRsZWQuXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0MjAiKT09MHx8Ci0gICBzdHJjbXAoX3k0bS0+Y2hyb21hX3R5cGUsIjQyMGpwZWciKT09MCl7Ci0gICAgX3k0bS0+c3JjX2NfZGVjX2g9X3k0bS0+ZHN0X2NfZGVjX2g9X3k0bS0+c3JjX2NfZGVjX3Y9X3k0bS0+ZHN0X2NfZGVjX3Y9MjsKLSAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2gKLSAgICAgKzIqKChfeTRtLT5waWNfdysxKS8yKSooKF95NG0tPnBpY19oKzEpLzIpOwotICAgIC8qTmF0aXZlbHkgc3VwcG9ydGVkOiBubyBjb252ZXJzaW9uIHJlcXVpcmVkLiovCi0gICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3o9MDsKLSAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0X251bGw7Ci0gIH0KLSAgZWxzZSBpZihzdHJjbXAoX3k0bS0+Y2hyb21hX3R5cGUsIjQyMG1wZWcyIik9PTApewotICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPmRzdF9jX2RlY19oPV95NG0tPnNyY19jX2RlY192PV95NG0tPmRzdF9jX2RlY192PTI7Ci0gICAgX3k0bS0+ZHN0X2J1Zl9yZWFkX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oOwotICAgIC8qQ2hyb21hIGZpbHRlciByZXF1aXJlZDogcmVhZCBpbnRvIHRoZSBhdXggYnVmIGZpcnN0LiovCi0gICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3o9Ci0gICAgIDIqKChfeTRtLT5waWNfdysxKS8yKSooKF95NG0tPnBpY19oKzEpLzIpOwotICAgIF95NG0tPmNvbnZlcnQ9eTRtX2NvbnZlcnRfNDJ4bXBlZzJfNDJ4anBlZzsKLSAgfQotICBlbHNlIGlmKHN0cmNtcChfeTRtLT5jaHJvbWFfdHlwZSwiNDIwcGFsZHYiKT09MCl7Ci0gICAgX3k0bS0+c3JjX2NfZGVjX2g9X3k0bS0+ZHN0X2NfZGVjX2g9X3k0bS0+c3JjX2NfZGVjX3Y9X3k0bS0+ZHN0X2NfZGVjX3Y9MjsKLSAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gICAgLypDaHJvbWEgZmlsdGVyIHJlcXVpcmVkOiByZWFkIGludG8gdGhlIGF1eCBidWYgZmlyc3QuCi0gICAgICBXZSBuZWVkIHRvIG1ha2UgdHdvIGZpbHRlciBwYXNzZXMsIHNvIHdlIG5lZWQgc29tZSBleHRyYSBzcGFjZSBpbiB0aGUKLSAgICAgICBhdXggYnVmZmVyLiovCi0gICAgX3k0bS0+YXV4X2J1Zl9zej0zKigoX3k0bS0+cGljX3crMSkvMikqKChfeTRtLT5waWNfaCsxKS8yKTsKLSAgICBfeTRtLT5hdXhfYnVmX3JlYWRfc3o9MiooKF95NG0tPnBpY193KzEpLzIpKigoX3k0bS0+cGljX2grMSkvMik7Ci0gICAgX3k0bS0+Y29udmVydD15NG1fY29udmVydF80MnhwYWxkdl80MnhqcGVnOwotICB9Ci0gIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0MjJqcGVnIik9PTApewotICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPmRzdF9jX2RlY19oPTI7Ci0gICAgX3k0bS0+c3JjX2NfZGVjX3Y9MTsKLSAgICBfeTRtLT5kc3RfY19kZWNfdj0yOwotICAgIF95NG0tPmRzdF9idWZfcmVhZF9zej1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKLSAgICAvKkNocm9tYSBmaWx0ZXIgcmVxdWlyZWQ6IHJlYWQgaW50byB0aGUgYXV4IGJ1ZiBmaXJzdC4qLwotICAgIF95NG0tPmF1eF9idWZfc3o9X3k0bS0+YXV4X2J1Zl9yZWFkX3N6PTIqKChfeTRtLT5waWNfdysxKS8yKSpfeTRtLT5waWNfaDsKLSAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQyMmpwZWdfNDIwanBlZzsKLSAgfQotICBlbHNlIGlmKHN0cmNtcChfeTRtLT5jaHJvbWFfdHlwZSwiNDIyIik9PTApewotICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPmRzdF9jX2RlY19oPTI7Ci0gICAgX3k0bS0+c3JjX2NfZGVjX3Y9MTsKLSAgICBfeTRtLT5kc3RfY19kZWNfdj0yOwotICAgIF95NG0tPmRzdF9idWZfcmVhZF9zej1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKLSAgICAvKkNocm9tYSBmaWx0ZXIgcmVxdWlyZWQ6IHJlYWQgaW50byB0aGUgYXV4IGJ1ZiBmaXJzdC4KLSAgICAgIFdlIG5lZWQgdG8gbWFrZSB0d28gZmlsdGVyIHBhc3Nlcywgc28gd2UgbmVlZCBzb21lIGV4dHJhIHNwYWNlIGluIHRoZQotICAgICAgIGF1eCBidWZmZXIuKi8KLSAgICBfeTRtLT5hdXhfYnVmX3JlYWRfc3o9MiooKF95NG0tPnBpY193KzEpLzIpKl95NG0tPnBpY19oOwotICAgIF95NG0tPmF1eF9idWZfc3o9X3k0bS0+YXV4X2J1Zl9yZWFkX3N6KygoX3k0bS0+cGljX3crMSkvMikqX3k0bS0+cGljX2g7Ci0gICAgX3k0bS0+Y29udmVydD15NG1fY29udmVydF80MjJfNDIwanBlZzsKLSAgfQotICBlbHNlIGlmKHN0cmNtcChfeTRtLT5jaHJvbWFfdHlwZSwiNDExIik9PTApewotICAgIF95NG0tPnNyY19jX2RlY19oPTQ7Ci0gICAgX3k0bS0+ZHN0X2NfZGVjX2g9MjsKLSAgICBfeTRtLT5zcmNfY19kZWNfdj0xOwotICAgIF95NG0tPmRzdF9jX2RlY192PTI7Ci0gICAgX3k0bS0+ZHN0X2J1Zl9yZWFkX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oOwotICAgIC8qQ2hyb21hIGZpbHRlciByZXF1aXJlZDogcmVhZCBpbnRvIHRoZSBhdXggYnVmIGZpcnN0LgotICAgICAgV2UgbmVlZCB0byBtYWtlIHR3byBmaWx0ZXIgcGFzc2VzLCBzbyB3ZSBuZWVkIHNvbWUgZXh0cmEgc3BhY2UgaW4gdGhlCi0gICAgICAgYXV4IGJ1ZmZlci4qLwotICAgIF95NG0tPmF1eF9idWZfcmVhZF9zej0yKigoX3k0bS0+cGljX3crMykvNCkqX3k0bS0+cGljX2g7Ci0gICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3orKChfeTRtLT5waWNfdysxKS8yKSpfeTRtLT5waWNfaDsKLSAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQxMV80MjBqcGVnOwotICB9Ci0gIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0NDQiKT09MCl7Ci0gICAgX3k0bS0+c3JjX2NfZGVjX2g9MTsKLSAgICBfeTRtLT5kc3RfY19kZWNfaD0yOwotICAgIF95NG0tPnNyY19jX2RlY192PTE7Ci0gICAgX3k0bS0+ZHN0X2NfZGVjX3Y9MjsKLSAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gICAgLypDaHJvbWEgZmlsdGVyIHJlcXVpcmVkOiByZWFkIGludG8gdGhlIGF1eCBidWYgZmlyc3QuCi0gICAgICBXZSBuZWVkIHRvIG1ha2UgdHdvIGZpbHRlciBwYXNzZXMsIHNvIHdlIG5lZWQgc29tZSBleHRyYSBzcGFjZSBpbiB0aGUKLSAgICAgICBhdXggYnVmZmVyLiovCi0gICAgX3k0bS0+YXV4X2J1Zl9yZWFkX3N6PTIqX3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3orKChfeTRtLT5waWNfdysxKS8yKSpfeTRtLT5waWNfaDsKLSAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQ0NF80MjBqcGVnOwotICB9Ci0gIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCI0NDRhbHBoYSIpPT0wKXsKLSAgICBfeTRtLT5zcmNfY19kZWNfaD0xOwotICAgIF95NG0tPmRzdF9jX2RlY19oPTI7Ci0gICAgX3k0bS0+c3JjX2NfZGVjX3Y9MTsKLSAgICBfeTRtLT5kc3RfY19kZWNfdj0yOwotICAgIF95NG0tPmRzdF9idWZfcmVhZF9zej1feTRtLT5waWNfdypfeTRtLT5waWNfaDsKLSAgICAvKkNocm9tYSBmaWx0ZXIgcmVxdWlyZWQ6IHJlYWQgaW50byB0aGUgYXV4IGJ1ZiBmaXJzdC4KLSAgICAgIFdlIG5lZWQgdG8gbWFrZSB0d28gZmlsdGVyIHBhc3Nlcywgc28gd2UgbmVlZCBzb21lIGV4dHJhIHNwYWNlIGluIHRoZQotICAgICAgIGF1eCBidWZmZXIuCi0gICAgICBUaGUgZXh0cmEgcGxhbmUgYWxzbyBnZXRzIHJlYWQgaW50byB0aGUgYXV4IGJ1Zi4KLSAgICAgIEl0IHdpbGwgYmUgZGlzY2FyZGVkLiovCi0gICAgX3k0bS0+YXV4X2J1Zl9zej1feTRtLT5hdXhfYnVmX3JlYWRfc3o9MypfeTRtLT5waWNfdypfeTRtLT5waWNfaDsKLSAgICBfeTRtLT5jb252ZXJ0PXk0bV9jb252ZXJ0XzQ0NF80MjBqcGVnOwotICB9Ci0gIGVsc2UgaWYoc3RyY21wKF95NG0tPmNocm9tYV90eXBlLCJtb25vIik9PTApewotICAgIF95NG0tPnNyY19jX2RlY19oPV95NG0tPnNyY19jX2RlY192PTA7Ci0gICAgX3k0bS0+ZHN0X2NfZGVjX2g9X3k0bS0+ZHN0X2NfZGVjX3Y9MjsKLSAgICBfeTRtLT5kc3RfYnVmX3JlYWRfc3o9X3k0bS0+cGljX3cqX3k0bS0+cGljX2g7Ci0gICAgLypObyBleHRyYSBzcGFjZSByZXF1aXJlZCwgYnV0IHdlIG5lZWQgdG8gY2xlYXIgdGhlIGNocm9tYSBwbGFuZXMuKi8KLSAgICBfeTRtLT5hdXhfYnVmX3N6PV95NG0tPmF1eF9idWZfcmVhZF9zej0wOwotICAgIF95NG0tPmNvbnZlcnQ9eTRtX2NvbnZlcnRfbW9ub180MjBqcGVnOwotICB9Ci0gIGVsc2V7Ci0gICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gY2hyb21hIHNhbXBsaW5nIHR5cGU6ICVzXG4iLF95NG0tPmNocm9tYV90eXBlKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgLypUaGUgc2l6ZSBvZiB0aGUgZmluYWwgZnJhbWUgYnVmZmVycyBpcyBhbHdheXMgY29tcHV0ZWQgZnJvbSB0aGUKLSAgICAgZGVzdGluYXRpb24gY2hyb21hIGRlY2ltYXRpb24gdHlwZS4qLwotICBfeTRtLT5kc3RfYnVmX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oCi0gICArMiooKF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oKSoKLSAgICgoX3k0bS0+cGljX2grX3k0bS0+ZHN0X2NfZGVjX3YtMSkvX3k0bS0+ZHN0X2NfZGVjX3YpOwotICBfeTRtLT5kc3RfYnVmPSh1bnNpZ25lZCBjaGFyICopbWFsbG9jKF95NG0tPmRzdF9idWZfc3opOwotICBfeTRtLT5hdXhfYnVmPSh1bnNpZ25lZCBjaGFyICopbWFsbG9jKF95NG0tPmF1eF9idWZfc3opOwotICByZXR1cm4gMDsKLX0KLQotdm9pZCB5NG1faW5wdXRfY2xvc2UoeTRtX2lucHV0ICpfeTRtKXsKLSAgZnJlZShfeTRtLT5kc3RfYnVmKTsKLSAgZnJlZShfeTRtLT5hdXhfYnVmKTsKLX0KLQotaW50IHk0bV9pbnB1dF9mZXRjaF9mcmFtZSh5NG1faW5wdXQgKl95NG0sRklMRSAqX2Zpbix2cHhfaW1hZ2VfdCAqX2ltZyl7Ci0gIGNoYXIgZnJhbWVbNl07Ci0gIGludCAgcGljX3N6OwotICBpbnQgIGZyYW1lX2NfdzsKLSAgaW50ICBmcmFtZV9jX2g7Ci0gIGludCAgY193OwotICBpbnQgIGNfaDsKLSAgaW50ICBjX3N6OwotICBpbnQgIHJldDsKLSAgLypSZWFkIGFuZCBza2lwIHRoZSBmcmFtZSBoZWFkZXIuKi8KLSAgcmV0PWZyZWFkKGZyYW1lLDEsNixfZmluKTsKLSAgaWYocmV0PDYpcmV0dXJuIDA7Ci0gIGlmKG1lbWNtcChmcmFtZSwiRlJBTUUiLDUpKXsKLSAgICBmcHJpbnRmKHN0ZGVyciwiTG9zcyBvZiBmcmFtaW5nIGluIFk0TSBpbnB1dCBkYXRhXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYoZnJhbWVbNV0hPSdcbicpewotICAgIGNoYXIgYzsKLSAgICBpbnQgIGo7Ci0gICAgZm9yKGo9MDtqPDc5JiZmcmVhZCgmYywxLDEsX2ZpbikmJmMhPSdcbic7aisrKTsKLSAgICBpZihqPT03OSl7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgcGFyc2luZyBZNE0gZnJhbWUgaGVhZGVyXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0KLSAgLypSZWFkIHRoZSBmcmFtZSBkYXRhIHRoYXQgbmVlZHMgbm8gY29udmVyc2lvbi4qLwotICBpZihmcmVhZChfeTRtLT5kc3RfYnVmLDEsX3k0bS0+ZHN0X2J1Zl9yZWFkX3N6LF9maW4pIT1feTRtLT5kc3RfYnVmX3JlYWRfc3opewotICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciByZWFkaW5nIFk0TSBmcmFtZSBkYXRhLlxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIC8qUmVhZCB0aGUgZnJhbWUgZGF0YSB0aGF0IGRvZXMgbmVlZCBjb252ZXJzaW9uLiovCi0gIGlmKGZyZWFkKF95NG0tPmF1eF9idWYsMSxfeTRtLT5hdXhfYnVmX3JlYWRfc3osX2ZpbikhPV95NG0tPmF1eF9idWZfcmVhZF9zeil7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVycm9yIHJlYWRpbmcgWTRNIGZyYW1lIGRhdGEuXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgLypOb3cgY29udmVydCB0aGUganVzdCByZWFkIGZyYW1lLiovCi0gICgqX3k0bS0+Y29udmVydCkoX3k0bSxfeTRtLT5kc3RfYnVmLF95NG0tPmF1eF9idWYpOwotICAvKkZpbGwgaW4gdGhlIGZyYW1lIGJ1ZmZlciBwb2ludGVycy4KLSAgICBXZSBkb24ndCB1c2UgdnB4X2ltZ193cmFwKCkgYmVjYXVzZSBpdCBmb3JjZXMgcGFkZGluZyBmb3Igb2RkIHBpY3R1cmUKLSAgICAgc2l6ZXMsIHdoaWNoIHdvdWxkIHJlcXVpcmUgYSBzZXBhcmF0ZSBmcmVhZCBjYWxsIGZvciBldmVyeSByb3cuKi8KLSAgbWVtc2V0KF9pbWcsMCxzaXplb2YoKl9pbWcpKTsKLSAgLypZNE0gaGFzIHRoZSBwbGFuZXMgaW4gWSdDYkNyIG9yZGVyLCB3aGljaCBsaWJ2cHggY2FsbHMgWSwgVSwgYW5kIFYuKi8KLSAgX2ltZy0+Zm10PUlNR19GTVRfSTQyMDsKLSAgX2ltZy0+dz1faW1nLT5kX3c9X3k0bS0+cGljX3c7Ci0gIF9pbWctPmg9X2ltZy0+ZF9oPV95NG0tPnBpY19oOwotICAvKlRoaXMgaXMgaGFyZC1jb2RlZCB0byA0OjI6MCBmb3Igbm93LCBhcyB0aGF0J3MgYWxsIFZQOCBzdXBwb3J0cy4qLwotICBfaW1nLT54X2Nocm9tYV9zaGlmdD0xOwotICBfaW1nLT55X2Nocm9tYV9zaGlmdD0xOwotICBfaW1nLT5icHM9MTI7Ci0gIC8qU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlcnMuKi8KLSAgcGljX3N6PV95NG0tPnBpY193Kl95NG0tPnBpY19oOwotICBjX3c9KF95NG0tPnBpY193K195NG0tPmRzdF9jX2RlY19oLTEpL195NG0tPmRzdF9jX2RlY19oOwotICBjX2g9KF95NG0tPnBpY19oK195NG0tPmRzdF9jX2RlY192LTEpL195NG0tPmRzdF9jX2RlY192OwotICBjX3N6PWNfdypjX2g7Ci0gIF9pbWctPnN0cmlkZVtQTEFORV9ZXT1feTRtLT5waWNfdzsKLSAgX2ltZy0+c3RyaWRlW1BMQU5FX1VdPV9pbWctPnN0cmlkZVtQTEFORV9WXT1jX3c7Ci0gIF9pbWctPnBsYW5lc1tQTEFORV9ZXT1feTRtLT5kc3RfYnVmOwotICBfaW1nLT5wbGFuZXNbUExBTkVfVV09X3k0bS0+ZHN0X2J1ZitwaWNfc3o7Ci0gIF9pbWctPnBsYW5lc1tQTEFORV9WXT1feTRtLT5kc3RfYnVmK3BpY19zeitjX3N6OwotICByZXR1cm4gMTsKLX0K